summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2010-02-28 09:36:33 +0000
committerNorbert Preining <preining@logic.at>2010-02-28 09:36:33 +0000
commit5589232e99f0fa13868111280c5b64ce9dc25730 (patch)
tree28f2e6ff422108ac87934aff9c3fc5911963625c
parenta6f5de6eed80d66fbd23ceabda7edf22b8162236 (diff)
add a tlperl.straw directory for public inspection
git-svn-id: svn://tug.org/texlive/trunk@17235 c570f23f-e606-0410-a88d-b1316a301751
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/.packlist1743
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/App/Cpan.pm1067
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/App/Prove.pm806
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/App/Prove/State.pm517
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/App/Prove/State/Result.pm233
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/App/Prove/State/Result/Test.pm153
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/AutoLoader.pm429
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/B.pm1189
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/B/Concise.pm1835
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/B/Debug.pm420
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/B/Deparse.pm4858
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/B/Lint.pm792
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/B/Lint/Debug.pm65
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/B/Showlex.pm205
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/B/Terse.pm102
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/B/Xref.pm431
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Benchmark.pm1044
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/BerkeleyDB/Btree.pm8
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/BerkeleyDB/Hash.pm8
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CGI.pm8059
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPAN.pm3771
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Backend.pm1330
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Backend/RV.pm144
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Config.pm849
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Configure.pm630
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Configure/Setup.pm1653
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Dist.pm688
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Autobundle.pm117
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Base.pm261
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Build.pm836
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Build/Constants.pm69
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/MM.pm1007
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Sample.pm16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Error.pm201
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/FAQ.pod30
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Hacking.pod135
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals.pm516
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Constants.pm375
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Constants/Report.pm407
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Extract.pm243
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Fetch.pm473
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Report.pm645
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Search.pm363
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source.pm1417
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source/Memory.pm374
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source/SQLite.pm326
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source/SQLite/Tie.pm145
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Utils.pm657
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Utils/Autoflush.pm5
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Module.pm1816
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Author.pm232
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Author/Fake.pm80
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Checksums.pm251
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Fake.pm86
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Signature.pm65
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Selfupdate.pm547
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Shell.pm341
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Classic.pm1236
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default.pm1938
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/CustomSource.pm201
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/HOWTO.pod136
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/Remote.pm186
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/Source.pm107
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Carp/Heavy.pm308
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Compress/Bzip2.pm1579
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Compress/Raw/Bzip2.pm355
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Compress/Raw/Zlib.pm1419
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Compress/Zlib.pm1494
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Compress/unLZMA.pm158
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Config/Extensions.pm63
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Config_git.pl12
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/Blowfish.pm207
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/CAST5_PP.pm261
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/CBC.pm1050
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/DES.pm172
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/DH.pm250
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/DSA.pm297
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/DSA/Key.pm230
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/DSA/Key/PEM.pm178
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/DSA/Key/SSH2.pm120
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/DSA/KeyChain.pm257
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/DSA/Signature.pm139
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/DSA/Util.pm201
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/IDEA.pm85
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/IDEA.pod87
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP.pm1678
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Armour.pm209
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Buffer.pm75
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/CFB.pm110
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Certificate.pm562
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Cipher.pm232
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Ciphertext.pm221
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Compressed.pm178
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Config.pm109
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Constants.pm113
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Digest.pm147
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/ErrorHandler.pm92
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key.pm236
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public.pm12
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public/DSA.pm53
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public/ElGamal.pm80
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public/RSA.pm82
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret.pm21
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret/DSA.pm39
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret/ElGamal.pm56
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret/RSA.pm49
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/KeyBlock.pm145
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/KeyRing.pm267
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/KeyServer.pm153
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/MDC.pm97
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Marker.pm40
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Message.pm157
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/OnePassSig.pm52
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/PacketFactory.pm255
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Plaintext.pm137
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/S2k.pm245
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/SKSessionKey.pm195
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/SessionKey.pm221
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Signature.pm423
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Signature/SubPacket.pm140
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Trust.pm36
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/UserID.pm90
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Util.pm137
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Words.pm222
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/Primes.pm901
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RIPEMD160.pm280
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RIPEMD160/MAC.pm162
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA.pm617
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/DataFormat.pm194
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/Debug.pm84
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/OAEP.pm289
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/PKCS1v15.pm215
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/Errorhandler.pm135
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/Key.pm231
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Private.pm339
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Private/SSH.pm180
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Public.pm184
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Public/SSH.pm52
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/Primitives.pm149
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/SS/PKCS1v15.pm247
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/SS/PSS.pm274
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/Random.pm267
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/Random/Generator.pm101
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/File.pm62
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/devrandom.pm21
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/devurandom.pm21
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/egd.pm90
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/rand.pm60
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/Rijndael.pm135
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/SSLeay.pm423
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/SSLeay/CTX.pm4
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/SSLeay/Conn.pm4
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/SSLeay/Err.pm4
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/SSLeay/MainContext.pm42
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/SSLeay/X509.pm26
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/Twofish.pm159
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/DBM.pm975
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/ExampleP.pm430
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/File.pm989
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/Gofer.pm1284
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/Base.pm162
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/classic.pm79
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/pedantic.pm53
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/rush.pm90
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/Base.pm410
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/null.pm111
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/pipeone.pm253
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/stream.pm291
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/NullP.pm151
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/ODBC.pm1690
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/ODBC/Changes.pm1682
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/ODBC/FAQ.pm681
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/Pg.pm4208
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/Proxy.pm997
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/SQLite.pm1575
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/SQLite/Cookbook.pod168
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/Sponge.pm305
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/mysql.pm1939
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/mysql/GetInfo.pm306
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBD/mysql/INSTALL.pod801
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBI.pm7824
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBIx/Simple.pm926
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBIx/Simple/Comparison.pod131
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBIx/Simple/Examples.pod390
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM/Deep.pm630
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM/Deep.pod1096
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM/Deep/Array.pm414
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM/Deep/Cookbook.pod199
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM/Deep/Engine.pm2325
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM/Deep/File.pm277
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM/Deep/Hash.pm136
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM/Deep/Internals.pod281
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM_Filter/compress.pm53
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM_Filter/encode.pm86
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM_Filter/int32.pm50
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM_Filter/null.pm52
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DBM_Filter/utf8.pm51
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DB_File.pm2299
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Devel/DProf.pm238
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Devel/InnerPackage.pm128
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Devel/PPPort.pm8269
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Devel/Peek.pm570
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Devel/SelfStubber.pm152
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Dumpvalue.pm648
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/DynaLoader.pm771
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode.pm963
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/Alias.pm377
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/Byte.pm120
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/CJKConstants.pm66
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/CN.pm74
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/CN/HZ.pm198
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/Changes.e2x7
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/Config.pm170
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/ConfigLocal_PM.e2x13
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/EBCDIC.pm45
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/Encoder.pm253
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/Encoding.pm360
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/GSM0338.pm292
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/Guess.pm355
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/JP.pm95
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/JP/H2Z.pm176
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/JP/JIS7.pm165
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/KR.pm69
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/KR/2022_KR.pm81
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/MIME/Header.pm241
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/MIME/Header/ISO_2022_JP.pm131
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/MIME/Name.pm94
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/Makefile_PL.e2x180
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/PerlIO.pod167
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/README.e2x31
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/Supported.pod901
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/Symbol.pm44
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/TW.pm75
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/Unicode.pm270
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/Unicode/UTF7.pm128
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/_PM.e2x23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/_T.e2x7
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Encode/encode.h113
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Env.pm235
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Exporter.pm587
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder.pm331
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Base.pm307
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Unix.pm40
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/VMS.pm294
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows.pm288
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows/BCC.pm130
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows/GCC.pm151
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows/MSVC.pm131
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/aix.pm31
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/cygwin.pm33
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/darwin.pm22
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/dec_osf.pm18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/os2.pm80
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Changes_EU-Install327
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Command.pm369
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Command/MM.pm275
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Constant.pm565
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Constant/Base.pm1006
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Constant/ProxySubs.pm549
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Constant/Utils.pm131
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Constant/XS.pm259
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Embed.pm511
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Install.pm1356
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Installed.pm462
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Liblist.pm286
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Liblist/Kid.pm546
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MANIFEST.SKIP55
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM.pm90
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_AIX.pm79
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_Any.pm2334
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_BeOS.pm61
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_Cygwin.pm123
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_DOS.pm65
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_Darwin.pm47
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_MacOS.pm40
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_NW5.pm269
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_OS2.pm152
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_QNX.pm57
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_UWIN.pm64
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_Unix.pm3634
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_VMS.pm1994
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_VOS.pm50
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_Win32.pm585
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MM_Win95.pm124
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MY.pm40
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker.pm2807
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker/Config.pm39
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker/FAQ.pod431
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker/Tutorial.pod180
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Manifest.pm881
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Miniperl.pm273
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Mkbootstrap.pm109
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Mksymlists.pm312
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/Packlist.pm348
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/ParseXS.pm2170
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/testlib.pm41
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/typemap336
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/ExtUtils/xsubpp156
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/FCGI.pm312
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Fcntl.pm244
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Basename.pm402
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/CheckTree.pm238
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Compare.pm182
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Copy.pm533
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/DosGlob.pm571
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Fetch.pm1466
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Find.pm1349
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Find/Rule.pm797
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Find/Rule/Extending.pod91
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Find/Rule/Procedural.pod72
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Glob.pm496
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/GlobMapper.pm679
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir.pm633
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin.pm152
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Carbon.pm210
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Cocoa.pm165
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/Driver.pm19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/MacOS9.pm97
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/Unix.pm167
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/Windows.pm176
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Listing.pm406
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Path.pm982
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Remove.pm329
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Spec.pm336
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Spec/Cygwin.pm155
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Spec/Epoc.pm79
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Spec/Functions.pm110
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Spec/Mac.pm781
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Spec/OS2.pm274
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Spec/Unix.pm521
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Spec/VMS.pm1165
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Spec/Win32.pm444
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Temp.pm2452
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/Which.pm254
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/chmod.pm647
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/pushd.pm229
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/pushd.pod145
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/stat.pm139
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/FileCache.pm188
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/FileHandle.pm262
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/FindBin.pm209
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/GD.pm1784
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/GD/Group.pm33
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/GD/Image.pm200
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/GD/Polygon.pm183
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/GD/Polyline.pm792
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/GD/Simple.pm1236
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/AtomicFile.pm196
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Adapter/Bzip2.pm162
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Adapter/Deflate.pm165
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Adapter/Identity.pm101
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Base.pm981
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Base/Common.pm956
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Bzip2.pm758
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Deflate.pm930
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Gzip.pm1242
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Gzip/Constants.pm148
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/RawDeflate.pm1017
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Zip.pm1612
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Zip/Constants.pm105
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Zlib/Constants.pm77
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Compress/Zlib/Extra.pm198
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Dir.pm248
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/File.pm204
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Handle.pm635
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/InnerFile.pm282
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Lines.pm184
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Pipe.pm257
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Poll.pm209
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Scalar.pm778
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/ScalarArray.pm791
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Seekable.pm128
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Select.pm381
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Socket.pm529
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Socket/INET.pm464
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Socket/SSL.pm2303
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Socket/UNIX.pm143
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/String.pm551
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Stringy.pm446
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Uncompress/Adapter/Bunzip2.pm112
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Uncompress/Adapter/Identity.pm105
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Uncompress/Adapter/Inflate.pm158
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Uncompress/AnyInflate.pm987
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Uncompress/AnyUncompress.pm1018
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Uncompress/Base.pm1474
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Uncompress/Bunzip2.pm858
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Uncompress/Gunzip.pm1111
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Uncompress/Inflate.pm982
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Uncompress/RawInflate.pm1110
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Uncompress/Unzip.pm1549
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Wrap.pm222
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/WrapTie.pm491
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/IO/Zlib.pm652
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager.pm4558
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/API.pod258
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/APIRef.pod1451
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Color.pm605
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Color/Float.pm128
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Color/Table.pm852
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Cookbook.pod429
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/CountColor.pm57
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Draw.pod1165
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Engines.pod558
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Expr.pm695
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Expr/Assem.pm280
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/ExtUtils.pm135
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/File/CUR.pm7
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/File/ICO.pm176
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/File/SGI.pm89
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Files.pod1608
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Fill.pm447
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Filter/DynTest.pm32
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Filter/Flines.pm57
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Filter/Mandelbrot.pm91
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Filters.pod703
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Font.pm1001
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Font/BBox.pm282
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Font/FreeType2.pm233
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Font/Image.pm167
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Font/Truetype.pm127
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Font/Type1.pm191
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Font/Win32.pm61
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Font/Wrap.pm387
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Fountain.pm429
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Handy.pod57
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/ImageTypes.pod1164
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Inline.pod74
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/LargeSamples.pod110
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Matrix2d.pm409
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Preprocess.pm297
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Regops.pm528
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Test.pm694
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Transform.pm534
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Transformations.pod930
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/Tutorial.pod180
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/draw.h21
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/dynaload.h58
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/ext.h23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/feat.h34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/imager.h612
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/imageri.h111
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/imconfig.h62
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/imdatatypes.h715
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/imerror.h27
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/imexif.h10
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/imext.h206
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/imextdef.h11
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/imexttypes.h163
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/imio.h34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/immacros.h33
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/imperl.h35
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/imrender.h23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/iolayer.h34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/iolayert.h99
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/log.h38
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/plug.h42
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/ppport.h4954
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/regmach.h89
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/rendert.h17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/include/stackmach.h25
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/interface.pod343
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/regmach.pod103
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Imager/typemap118
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Authen/Basic.pm65
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Authen/Digest.pm68
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Authen/Ntlm.pm180
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/ConnCache.pm310
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Debug.pm110
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/DebugFile.pm5
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/MediaTypes.pm297
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/MemberMixin.pm44
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Online.pm372
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol.pm291
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/GHTTP.pm73
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/cpan.pm72
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/data.pm52
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/file.pm146
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/ftp.pm543
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/gopher.pm213
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/http.pm475
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/http10.pm289
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/https.pm51
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/https10.pm75
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/loopback.pm26
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/mailto.pm183
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/nntp.pm145
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Protocol/nogo.pm24
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/RobotUA.pm308
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/Simple.pm253
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/UserAgent.pm1700
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/LWP/media.types1064
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/List/Util.pm233
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/List/Util/PP.pm83
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/List/Util/XS.pm45
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Constants.pm31
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Constants.pod76
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Country.pm550
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Country.pod306
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Currency.pm356
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Currency.pod191
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Language.pm315
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Language.pod158
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Maketext.pm456
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Maketext.pod1326
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Maketext/Guts.pm328
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Maketext/GutsLoader.pm49
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Maketext/Simple.pm341
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Maketext/TPJ13.pod775
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Script.pm294
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Locale/Script.pod253
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Memoize.pm1047
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build.pm1146
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/API.pod2007
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Authoring.pod323
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Base.pm5287
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Bundling.pod147
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Compat.pm628
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Config.pm59
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/ConfigData.pm220
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Cookbook.pm529
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Dumper.pm19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/ModuleInfo.pm491
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Notes.pm332
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/PPMMaker.pm189
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/Amiga.pm34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/Default.pm33
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/EBCDIC.pm34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/MPEiX.pm34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/MacOS.pm152
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/RiscOS.pm34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/Unix.pm73
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/VMS.pm539
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/VOS.pm34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/Windows.pm320
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/aix.pm40
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/cygwin.pm55
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/darwin.pm40
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Platform/os2.pm49
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/PodParser.pm106
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/Version.pm684
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Build/YAML.pm600
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/CoreList.pm13799
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Load.pm181
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Load/Conditional.pm643
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Loaded.pm142
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/P5Z.pm34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Plan/Archive.pm115
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Plan/Base.pm399
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Plan/Lite.pm137
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Pluggable.pm355
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Pluggable/Object.pm373
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Module/Signature.pm874
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/NEXT.pm563
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/Cmd.pm783
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/Config.eg49
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/Config.pm312
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/Domain.pm347
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/FTP.pm1829
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/FTP/A.pm111
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/FTP/E.pm8
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/FTP/I.pm80
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/FTP/L.pm8
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/FTP/dataconn.pm124
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/HTTP.pm279
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/HTTP/Methods.pm593
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/HTTP/NB.pm105
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/HTTPS.pm59
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/Hostname.pm.eg14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/NNTP.pm1140
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/Netrc.pm325
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/POP3.pm742
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/Ping.pm1777
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/SMTP.pm867
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/SMTP/TLS.pm401
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/SSL.pm607
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/SSLeay.pm2610
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/SSLeay/Handle.pm394
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/Time.pm151
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/hostent.pm151
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/libnetFAQ.pod303
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/netent.pm169
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/protoent.pm96
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Net/servent.pm113
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Number/Compare.pm100
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/O.pm143
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Object/Accessor.pm819
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/Dist.pm1425
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/Dist/FromPPD.pm555
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/Dist/InstallPPD.pm215
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/Environment.pod256
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/FAQ.pod358
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/Heavy.pm204
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/Repository/Client.pm1025
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/Repository/Client/DBM.pm501
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/Repository/Client/HTTP.pm332
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/Repository/Client/Local.pm285
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/Repository/Client/Util.pm136
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/Repository/Query.pm410
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/SetupProgname.pm92
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/SetupTemp.pm162
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PAR/Tutorial.pod1116
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/PPM.pm2138
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Roadmap.pod394
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Scalar/Util.pm283
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Scalar/Util/PP.pm109
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Search/Dict.pm108
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/SelectSaver.pm54
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Socket.pm414
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/String/CRC32.pm19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/String/CRC32.pod61
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Sub/Uplevel.pm360
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Sub/Uplevel.pod197
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Switch.pm875
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Symbol.pm170
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Test.pm954
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Text/Abbrev.pm84
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Text/Balanced.pm2281
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Text/Diff.pm713
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Text/Diff/Table.pm408
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Text/Glob.pm195
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Text/ParseWords.pm294
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Text/Soundex.pm260
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Text/Tabs.pm136
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Text/Wrap.pm265
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Thread.pm273
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Tk.pm856
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Tk.pod862
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Tree/DAG_Node.pm2942
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/UNIVERSAL.pm205
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/Escape.pm218
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/Heuristic.pm222
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/IRI.pm44
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/QueryParam.pm200
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/Split.pm96
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/URL.pm305
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/WithBase.pm171
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/_foreign.pm6
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/_generic.pm249
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/_idna.pm78
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/_ldap.pm140
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/_login.pm10
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/_punycode.pm203
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/_query.pm92
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/_segment.pm20
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/_server.pm162
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/_userpass.pm51
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/data.pm140
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/file.pm329
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/file/Base.pm80
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/file/FAT.pm23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/file/Mac.pm120
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/file/OS2.pm28
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/file/QNX.pm18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/file/Unix.pm55
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/file/Win32.pm84
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/ftp.pm45
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/gopher.pm94
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/http.pm25
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/https.pm7
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/ldap.pm122
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/ldapi.pm30
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/ldaps.pm7
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/mailto.pm72
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/mms.pm8
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/news.pm68
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/nntp.pm6
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/pop.pm68
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/rlogin.pm7
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/rsync.pm12
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/rtsp.pm8
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/rtspu.pm8
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/sip.pm86
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/sips.pm7
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/snews.pm8
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/ssh.pm9
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/telnet.pm7
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/tn3270.pm7
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/urn.pm97
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/urn/isbn.pm102
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/URI/urn/oid.pm18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Unicode/Collate.pm1877
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Unicode/Collate/allkeys.txt18191
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Unicode/Collate/keys.txt864
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Unicode/Normalize.pm520
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Unicode/UCD.pm1230
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/WWW/RobotRules.pm445
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/WWW/RobotRules/AnyDBM_File.pm170
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/XSLoader.pm358
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/abbrev.pl43
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/attrs.pm58
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/autodie.pm424
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/autodie/exception.pm741
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/autodie/exception/system.pm81
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/autodie/hints.pm598
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/base.pm265
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/bigint.pl320
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/bignum.pm681
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/bigrat.pl155
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/bigrat.pm566
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/bytes_heavy.pl40
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/cacheout.pl55
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/dbixs_rev.pl51
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/dotsh.pl74
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/dumpvar.pl552
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/encoding/warnings.pm239
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/exceptions.pl61
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/fastcwd.pl43
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/feature.pm218
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/find.pl47
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/flush.pl32
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/getcwd.pl71
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/getopts.pl66
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/hostname.pl31
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/importenv.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/integer.pm93
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/less.pm155
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/lib.pm242
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/locale.pm40
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/look.pl50
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/lwpcook.pod309
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/open2.pl12
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/overload.pm1499
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/overloading.pm101
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/perllocal.pod3454
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/perlpod.pod732
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/perlpodspec.pod1912
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pip.pm375
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/a2p.pod179
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl.pod468
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl5004delta.pod1612
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl5005delta.pod993
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl5100delta.pod1591
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl5101delta.pod1772
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl561delta.pod3661
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl56delta.pod3022
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl570delta.pod899
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl571delta.pod1075
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl572delta.pod831
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl573delta.pod246
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl581delta.pod1102
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl582delta.pod162
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl583delta.pod210
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl584delta.pod263
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl585delta.pod257
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl586delta.pod170
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl587delta.pod379
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl588delta.pod1632
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl589delta.pod2336
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl58delta.pod3746
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl590delta.pod1015
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl591delta.pod323
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl592delta.pod342
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl593delta.pod549
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl594delta.pod382
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perl595delta.pod587
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlaix.pod475
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlamiga.pod278
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlapi.pod7388
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlapio.pod526
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlapollo.pod23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlartistic.pod217
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlbeos.pod109
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlbook.pod17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlboot.pod884
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlbot.pod535
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlbs2000.pod241
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlcall.pod1935
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlce.pod306
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlcheat.pod93
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlclib.pod212
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlcn.pod150
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlcommunity.pod158
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlcompile.pod293
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlcygwin.pod784
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perldata.pod872
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perldbmfilter.pod168
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perldebguts.pod878
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perldebtut.pod723
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perldebug.pod1174
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perldelta.pod1772
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perldgux.pod117
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perldiag.pod5065
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perldoc.pod239
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perldos.pod331
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perldsc.pod847
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlebcdic.pod1427
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlembed.pod1160
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlepoc.pod159
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfaq.pod1443
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfaq1.pod418
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfaq2.pod552
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfaq3.pod1104
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfaq4.pod2534
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfaq5.pod1454
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfaq6.pod1151
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfaq7.pod1112
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfaq8.pod1390
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfaq9.pod690
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfilter.pod588
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfork.pod323
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlform.pod459
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfreebsd.pod47
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlfunc.pod7444
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlglossary.pod3408
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlgpl.pod378
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlguts.pod2671
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlhack.pod3375
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlhaiku.pod64
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlhist.pod860
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlhpux.pod679
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlhurd.pod54
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlintern.pod1106
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlintro.pod679
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perliol.pod1039
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlipc.pod1818
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlirix.pod137
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perljp.pod206
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlko.pod219
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perllexwarn.pod525
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perllinux.pod39
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perllocale.pod1043
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perllol.pod303
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlmachten.pod116
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlmacos.pod64
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlmacosx.pod270
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlmint.pod229
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlmod.pod598
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlmodinstall.pod465
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlmodlib.pod3430
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlmodstyle.pod780
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlmpeix.pod730
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlmroapi.pod94
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlnetware.pod214
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlnewmod.pod280
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlnumber.pod209
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlobj.pod586
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlop.pod2513
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlopenbsd.pod30
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlopentut.pod981
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlos2.pod2743
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlos390.pod458
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlos400.pod120
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlothrtut.pod1067
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlpacktut.pod1266
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlperf.pod1182
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlplan9.pod146
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlpod.pod732
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlpodspec.pod1899
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlport.pod2335
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlpragma.pod147
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlqnx.pod143
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlre.pod2199
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlreapi.pod699
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlrebackslash.pod539
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlrecharclass.pod525
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlref.pod686
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlreftut.pod527
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlreguts.pod887
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlrepository.pod689
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlrequick.pod516
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlreref.pod364
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlretut.pod2870
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlriscos.pod67
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlrun.pod1378
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlsec.pod527
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlsolaris.pod690
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlstyle.pod303
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlsub.pod1463
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlsymbian.pod433
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlsyn.pod900
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlthrtut.pod1177
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perltie.pod1191
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perltoc.pod38976
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perltodo.pod1229
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perltooc.pod1342
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perltoot.pod1836
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perltrap.pod1590
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perltru64.pod172
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perltw.pod176
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlunicode.pod1659
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlunifaq.pod307
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perluniintro.pod887
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlunitut.pod209
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlutil.pod309
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perluts.pod107
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlvar.pod1737
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlvmesa.pod131
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlvms.pod1227
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlvos.pod163
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlwin32.pod1000
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlxs.pod2126
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlxstut.pod1378
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/qd.pl898
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/shellwords.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/sort.pm196
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/strict.pm147
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/subs.pm40
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/syslog.pl199
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/tainted.pl9
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/threads.pm1066
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/threads/shared.pm616
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/timelocal.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/ArabicShaping.txt362
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/BidiMirroring.txt588
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/Blocks.txt202
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/Canonical.pl1178
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/CaseFolding.txt1196
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/CombiningClass.pl235
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/CompositionExclusions.txt197
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/Decomposition.pl5382
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/EastAsianWidth.txt19357
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/Exact.pl88
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/HangulSyllableType.txt855
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/Index.txt5245
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/Jamo.txt92
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/LineBreak.txt20158
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/Name.pl19342
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/NameAliases.txt40
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/NamedSequences.txt126
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/NamedSqProv.txt373
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/NamesList.txt31236
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/NormalizationCorrections.txt48
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/PVA.pl3604
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/PropList.txt1207
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/PropValueAliases.txt1012
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/Properties407
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/PropertyAliases.txt165
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/ReadMe.txt15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/Scripts.txt1747
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/SpecialCasing.txt274
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/StandardizedVariants.txt139
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/To/Digit.pl380
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/To/Fold.pl1127
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/To/Lower.pl1039
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/To/Title.pl1099
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/To/Upper.pl1122
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/UnicodeData.txt19336
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/AL.pl35
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/AN.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/B.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/BN.pl26
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/CS.pl26
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/EN.pl23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/ES.pl22
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/ET.pl32
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/L.pl457
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/LRE.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/LRO.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/NSM.pl169
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/ON.pl166
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/PDF.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/R.pl46
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/RLE.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/RLO.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/S.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/bc/WS.pl21
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/A.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/AL.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/AR.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/ATAR.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/ATB.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/ATBL.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/B.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/BL.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/BR.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/DA.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/DB.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/IS.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/KV.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/L.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/NK.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/NR.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/OV.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/R.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ccc/VR.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Can.pl236
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Com.pl826
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Enc.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Fin.pl126
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Font.pl47
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Fra.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Init.pl88
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Iso.pl111
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Med.pl67
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Nar.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Nb.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sml.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sqr.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sub.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sup.pl33
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Vert.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/dt/Wide.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ea/A.pl172
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ea/F.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ea/H.pl20
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ea/N.pl571
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ea/Na.pl20
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/ea/W.pl44
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/AHex.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/ASCII.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Alnum.pl483
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Alpha.pl464
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Alphabet.pl459
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Any.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Arab.pl33
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Armn.pl21
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/AsciiHex.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Assigned.pl461
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Bali.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Beng.pl30
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/BidiC.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/BidiCont.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Blank.pl25
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Bopo.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Brai.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Bugi.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Buhd.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/C.pl464
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Canadian.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cari.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cc.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cf.pl31
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cham.pl20
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cher.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cn.pl462
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cntrl.pl35
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Co.pl20
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Copt.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cprt.pl22
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cs.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cyrl.pl23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dash.pl31
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dash2.pl34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/DefaultI.pl56
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dep.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Deprecat.pl22
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Deva.pl24
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dia.pl115
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Diacriti.pl118
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Digit.pl49
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dsrt.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ethi.pl43
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ext.pl29
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Extender.pl32
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Geor.pl20
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Glag.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Goth.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Graph.pl465
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Grek.pl49
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Gujr.pl30
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Guru.pl32
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hang.pl28
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hani.pl30
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hano.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hebr.pl25
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hex.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/HexDigit.pl22
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hira.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/HorizSpa.pl25
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hyphen.pl23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hyphen2.pl26
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IDSB.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IDST.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdContin.pl494
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdStart.pl409
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ideo.pl23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ideograp.pl26
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdsBinar.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdsTrina.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAegean.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAlphab.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAncie2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAncie3.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAncien.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabi2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabi3.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabi4.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabic.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArmeni.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArrows.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBaline.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBasicL.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBengal.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBlockE.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBopom2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBopomo.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBoxDra.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBraill.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBugine.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBuhid.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InByzant.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCarian.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCham.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCherok.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCo2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCo3.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCo4.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCom.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkRad.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkStr.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkSym.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkUn2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkUn3.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkUni.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombi2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombi3.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombi4.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombin.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InContro.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCoptic.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCounti.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCunei2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCuneif.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCurren.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyprio.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyril2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyril3.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyril4.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyrill.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDesere.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDevana.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDingba.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDomino.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEnclo2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEnclos.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEthio2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEthio3.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEthiop.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGenera.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGeomet.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGeorg2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGeorgi.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGlagol.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGothic.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGreekA.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGreekE.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGujara.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGurmuk.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHalfwi.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHangu2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHangu3.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHangul.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHanuno.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHebrew.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHighPr.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHighSu.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHiraga.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InIdeogr.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InIpaExt.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKanbun.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKangxi.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKannad.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKatak2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKataka.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKayahL.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKharos.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKhmer.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKhmerS.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLao.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin1.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin3.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin4.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin5.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatinE.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLepcha.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLetter.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLimbu.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLinea2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLinear.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLowSur.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLycian.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLydian.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMahjon.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMalaya.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMathe2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMathem.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce3.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce4.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce5.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMiscel.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InModifi.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMongol.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMusica.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMyanma.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InNewTai.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InNko.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InNumber.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOgham.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOlChik.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOldIta.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOldPer.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOptica.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOriya.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOsmany.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhagsP.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhaist.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhoeni.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhone2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhonet.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPrivat.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InRejang.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InRunic.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSauras.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InShavia.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSinhal.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSmallF.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSpacin.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSpecia.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSundan.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSupers.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl3.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl4.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl5.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl6.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSupple.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSyloti.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSyriac.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTagalo.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTagban.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTags.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTaiLe.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTaiXua.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTamil.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTelugu.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InThaana.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InThai.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTibeta.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTifina.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InUgarit.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InUnifie.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVai.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVaria2.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVariat.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVertic.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InYiRadi.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InYiSyll.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InYijing.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/JoinC.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/JoinCont.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Kana.pl23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/KayahLi.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Khar.pl24
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Khmr.pl20
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Knda.pl29
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/L.pl407
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LC.pl127
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LOE.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Laoo.pl34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Latn.pl45
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lepc.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Limb.pl21
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LinearB.pl23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ll.pl615
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lm.pl56
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lo.pl299
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LogicalO.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lower.pl614
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lowercas.pl617
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lt.pl27
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lu.pl608
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lyci.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lydi.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/M.pl178
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Math.pl121
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mc.pl102
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Me.pl22
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mlym.pl28
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mn.pl177
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mong.pl22
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mymr.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/N.pl86
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/NChar.pl31
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nd.pl50
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/NewTaiLu.pl20
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nkoo.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nl.pl28
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/No.pl47
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nonchara.pl34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OAlpha.pl135
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/ODI.pl23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OGrExt.pl29
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OIDC.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OIDS.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OLower.pl26
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OMath.pl112
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OUpper.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ogam.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OlChiki.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OldItali.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OldPersi.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Orya.pl30
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Osma.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherAlp.pl138
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherDef.pl26
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherGra.pl32
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherIdC.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherIdS.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherLow.pl29
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherMat.pl115
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherUpp.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/P.pl129
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatSyn.pl41
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatWS.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatternS.pl44
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatternW.pl21
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pc.pl23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pd.pl31
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pe.pl87
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PerlSpac.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PerlWord.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pf.pl27
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PhagsPa.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Phnx.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pi.pl28
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Po.pl125
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixAln.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixAlp.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixBla.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixCnt.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixDig.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixGra.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixLow.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixPri.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixPun.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixSpa.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixUpp.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Print.pl464
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ps.pl89
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Punct.pl128
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/QMark.pl25
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Qaai.pl34
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Quotatio.pl28
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Radical.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Radical2.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Rjng.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Runr.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/S.pl196
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SD.pl44
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/STerm.pl50
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Saur.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sc.pl31
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Shaw.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sinh.pl27
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sk.pl43
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sm.pl82
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/So.pl151
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SoftDott.pl47
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Space.pl27
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SpacePer.pl28
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sterm2.pl53
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sund.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SylotiNa.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Syrc.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tagb.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/TaiLe.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Taml.pl32
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Telu.pl30
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Term.pl68
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Terminal.pl71
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tfng.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tglg.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Thaa.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Thai.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tibt.pl23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Title.pl26
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/UIdeo.pl23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ugar.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/UnifiedI.pl26
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Upper.pl607
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Uppercas.pl609
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/VS.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Vaii.pl17
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Variatio.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/VertSpac.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/WSpace.pl24
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/WhiteSpa.pl27
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Word.pl512
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/XDigit.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Xsux.pl19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Yiii.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Z.pl26
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zl.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zp.pl18
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zs.pl25
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zyyy.pl153
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/_CanonDC.pl20
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/_CaseIgn.pl178
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/_CombAbo.pl84
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/hst/L.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/hst/LV.pl412
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/hst/LVT.pl412
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/hst/T.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/hst/V.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/jt/C.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/jt/D.pl41
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/jt/R.pl41
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/jt/U.pl20
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/AI.pl104
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/AL.pl501
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/B2.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/BA.pl64
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/BB.pl25
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/BK.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/CB.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/CL.pl89
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/CM.pl167
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/CR.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/EX.pl35
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/GL.pl23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/H2.pl412
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/H3.pl412
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/HY.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/ID.pl84
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/IN.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/IS.pl23
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/JL.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/JT.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/JV.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/LF.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/NL.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/NS.pl50
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/NU.pl46
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/OP.pl88
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/PO.pl27
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/PR.pl31
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/QU.pl25
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/SA.pl43
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/SG.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/SP.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/SY.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/WJ.pl15
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/XX.pl16
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/lb/ZW.pl14
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/nt/De.pl46
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/nt/Di.pl29
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/lib/nt/Nu.pl63
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/mktables2326
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/mktables.lst563
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/unicore/version1
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/validate.pl102
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/vars.pm82
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/warnings.pm503
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/warnings/register.pm51
1446 files changed, 732023 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl.straw/lib/.packlist b/Master/tlpkg/tlperl.straw/lib/.packlist
new file mode 100755
index 00000000000..67c254120c0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/.packlist
@@ -0,0 +1,1743 @@
+C:\strawberry\perl\bin/a2p.exe type=file
+C:\strawberry\perl\bin/c2ph.bat type=file
+C:\strawberry\perl\bin/config_data.bat type=file
+C:\strawberry\perl\bin/corelist.bat type=file
+C:\strawberry\perl\bin/cpan.bat type=file
+C:\strawberry\perl\bin/cpan2dist.bat type=file
+C:\strawberry\perl\bin/cpanp-run-perl.bat type=file
+C:\strawberry\perl\bin/cpanp.bat type=file
+C:\strawberry\perl\bin/dprofpp.bat type=file
+C:\strawberry\perl\bin/enc2xs.bat type=file
+C:\strawberry\perl\bin/find2perl.bat type=file
+C:\strawberry\perl\bin/h2ph.bat type=file
+C:\strawberry\perl\bin/h2xs.bat type=file
+C:\strawberry\perl\bin/instmodsh.bat type=file
+C:\strawberry\perl\bin/libnetcfg.bat type=file
+C:\strawberry\perl\bin/perl.exe from=C:\strawberry\perl\bin/perl5.10.1.exe type=link
+C:\strawberry\perl\bin/perl5.10.1.exe type=file
+C:\strawberry\perl\bin/perl510.dll type=file
+C:\strawberry\perl\bin/perlbug.bat type=file
+C:\strawberry\perl\bin/perldoc.bat type=file
+C:\strawberry\perl\bin/perlivp.bat type=file
+C:\strawberry\perl\bin/perlthanks.bat from=C:\strawberry\perl\bin/perlbug.bat type=link
+C:\strawberry\perl\bin/piconv.bat type=file
+C:\strawberry\perl\bin/pl2pm.bat type=file
+C:\strawberry\perl\bin/pod2html.bat type=file
+C:\strawberry\perl\bin/pod2latex.bat type=file
+C:\strawberry\perl\bin/pod2man.bat type=file
+C:\strawberry\perl\bin/pod2text.bat type=file
+C:\strawberry\perl\bin/pod2usage.bat type=file
+C:\strawberry\perl\bin/podchecker.bat type=file
+C:\strawberry\perl\bin/podselect.bat type=file
+C:\strawberry\perl\bin/prove.bat type=file
+C:\strawberry\perl\bin/psed.bat from=C:\strawberry\perl\bin/s2p.bat type=link
+C:\strawberry\perl\bin/pstruct.bat from=C:\strawberry\perl\bin/c2ph.bat type=link
+C:\strawberry\perl\bin/ptar.bat type=file
+C:\strawberry\perl\bin/ptardiff.bat type=file
+C:\strawberry\perl\bin/s2p.bat type=file
+C:\strawberry\perl\bin/shasum.bat type=file
+C:\strawberry\perl\bin/splain.bat type=file
+C:\strawberry\perl\bin/xsubpp.bat type=file
+C:\strawberry\perl\lib/AnyDBM_File.pm type=file
+C:\strawberry\perl\lib/App/Prove.pm type=file
+C:\strawberry\perl\lib/App/Prove/State.pm type=file
+C:\strawberry\perl\lib/App/Prove/State/Result.pm type=file
+C:\strawberry\perl\lib/App/Prove/State/Result/Test.pm type=file
+C:\strawberry\perl\lib/Archive/Extract.pm type=file
+C:\strawberry\perl\lib/Archive/Tar.pm type=file
+C:\strawberry\perl\lib/Archive/Tar/Constant.pm type=file
+C:\strawberry\perl\lib/Archive/Tar/File.pm type=file
+C:\strawberry\perl\lib/Attribute/Handlers.pm type=file
+C:\strawberry\perl\lib/AutoLoader.pm type=file
+C:\strawberry\perl\lib/AutoSplit.pm type=file
+C:\strawberry\perl\lib/B.pm type=file
+C:\strawberry\perl\lib/B/Concise.pm type=file
+C:\strawberry\perl\lib/B/Debug.pm type=file
+C:\strawberry\perl\lib/B/Deparse.pm type=file
+C:\strawberry\perl\lib/B/Lint.pm type=file
+C:\strawberry\perl\lib/B/Lint/Debug.pm type=file
+C:\strawberry\perl\lib/B/Showlex.pm type=file
+C:\strawberry\perl\lib/B/Terse.pm type=file
+C:\strawberry\perl\lib/B/Xref.pm type=file
+C:\strawberry\perl\lib/Benchmark.pm type=file
+C:\strawberry\perl\lib/CGI.pm type=file
+C:\strawberry\perl\lib/CGI/Apache.pm type=file
+C:\strawberry\perl\lib/CGI/Carp.pm type=file
+C:\strawberry\perl\lib/CGI/Cookie.pm type=file
+C:\strawberry\perl\lib/CGI/Fast.pm type=file
+C:\strawberry\perl\lib/CGI/Pretty.pm type=file
+C:\strawberry\perl\lib/CGI/Push.pm type=file
+C:\strawberry\perl\lib/CGI/Switch.pm type=file
+C:\strawberry\perl\lib/CGI/Util.pm type=file
+C:\strawberry\perl\lib/CORE.pod type=file
+C:\strawberry\perl\lib/CORE/EXTERN.h type=file
+C:\strawberry\perl\lib/CORE/INTERN.h type=file
+C:\strawberry\perl\lib/CORE/XSUB.h type=file
+C:\strawberry\perl\lib/CORE/arpa/inet.h type=file
+C:\strawberry\perl\lib/CORE/av.h type=file
+C:\strawberry\perl\lib/CORE/cc_runtime.h type=file
+C:\strawberry\perl\lib/CORE/config.h type=file
+C:\strawberry\perl\lib/CORE/cop.h type=file
+C:\strawberry\perl\lib/CORE/cv.h type=file
+C:\strawberry\perl\lib/CORE/dirent.h type=file
+C:\strawberry\perl\lib/CORE/dosish.h type=file
+C:\strawberry\perl\lib/CORE/embed.h type=file
+C:\strawberry\perl\lib/CORE/embedvar.h type=file
+C:\strawberry\perl\lib/CORE/fakesdio.h type=file
+C:\strawberry\perl\lib/CORE/fakethr.h type=file
+C:\strawberry\perl\lib/CORE/form.h type=file
+C:\strawberry\perl\lib/CORE/git_version.h type=file
+C:\strawberry\perl\lib/CORE/gv.h type=file
+C:\strawberry\perl\lib/CORE/handy.h type=file
+C:\strawberry\perl\lib/CORE/hv.h type=file
+C:\strawberry\perl\lib/CORE/intrpvar.h type=file
+C:\strawberry\perl\lib/CORE/iperlsys.h type=file
+C:\strawberry\perl\lib/CORE/keywords.h type=file
+C:\strawberry\perl\lib/CORE/libperl510.a type=file
+C:\strawberry\perl\lib/CORE/malloc_ctl.h type=file
+C:\strawberry\perl\lib/CORE/mg.h type=file
+C:\strawberry\perl\lib/CORE/mydtrace.h type=file
+C:\strawberry\perl\lib/CORE/netdb.h type=file
+C:\strawberry\perl\lib/CORE/nostdio.h type=file
+C:\strawberry\perl\lib/CORE/op.h type=file
+C:\strawberry\perl\lib/CORE/opcode.h type=file
+C:\strawberry\perl\lib/CORE/opnames.h type=file
+C:\strawberry\perl\lib/CORE/overload.h type=file
+C:\strawberry\perl\lib/CORE/pad.h type=file
+C:\strawberry\perl\lib/CORE/parser.h type=file
+C:\strawberry\perl\lib/CORE/patchlevel.h type=file
+C:\strawberry\perl\lib/CORE/perl.h type=file
+C:\strawberry\perl\lib/CORE/perlapi.h type=file
+C:\strawberry\perl\lib/CORE/perlhost.h type=file
+C:\strawberry\perl\lib/CORE/perlio.h type=file
+C:\strawberry\perl\lib/CORE/perliol.h type=file
+C:\strawberry\perl\lib/CORE/perlsdio.h type=file
+C:\strawberry\perl\lib/CORE/perlsfio.h type=file
+C:\strawberry\perl\lib/CORE/perlvars.h type=file
+C:\strawberry\perl\lib/CORE/perly.h type=file
+C:\strawberry\perl\lib/CORE/pp.h type=file
+C:\strawberry\perl\lib/CORE/pp_proto.h type=file
+C:\strawberry\perl\lib/CORE/proto.h type=file
+C:\strawberry\perl\lib/CORE/reentr.h type=file
+C:\strawberry\perl\lib/CORE/regcharclass.h type=file
+C:\strawberry\perl\lib/CORE/regcomp.h type=file
+C:\strawberry\perl\lib/CORE/regexp.h type=file
+C:\strawberry\perl\lib/CORE/regnodes.h type=file
+C:\strawberry\perl\lib/CORE/scope.h type=file
+C:\strawberry\perl\lib/CORE/sv.h type=file
+C:\strawberry\perl\lib/CORE/sys/socket.h type=file
+C:\strawberry\perl\lib/CORE/thread.h type=file
+C:\strawberry\perl\lib/CORE/uconfig.h type=file
+C:\strawberry\perl\lib/CORE/unixish.h type=file
+C:\strawberry\perl\lib/CORE/utf8.h type=file
+C:\strawberry\perl\lib/CORE/utfebcdic.h type=file
+C:\strawberry\perl\lib/CORE/util.h type=file
+C:\strawberry\perl\lib/CORE/uudmap.h type=file
+C:\strawberry\perl\lib/CORE/vdir.h type=file
+C:\strawberry\perl\lib/CORE/vmem.h type=file
+C:\strawberry\perl\lib/CORE/warnings.h type=file
+C:\strawberry\perl\lib/CORE/win32.h type=file
+C:\strawberry\perl\lib/CORE/win32iop-o.h type=file
+C:\strawberry\perl\lib/CORE/win32iop.h type=file
+C:\strawberry\perl\lib/CORE/win32thread.h type=file
+C:\strawberry\perl\lib/CORE/wince.h type=file
+C:\strawberry\perl\lib/CPAN.pm type=file
+C:\strawberry\perl\lib/CPAN/API/HOWTO.pod type=file
+C:\strawberry\perl\lib/CPAN/Author.pm type=file
+C:\strawberry\perl\lib/CPAN/Bundle.pm type=file
+C:\strawberry\perl\lib/CPAN/CacheMgr.pm type=file
+C:\strawberry\perl\lib/CPAN/Complete.pm type=file
+C:\strawberry\perl\lib/CPAN/Config.pm type=file
+C:\strawberry\perl\lib/CPAN/Debug.pm type=file
+C:\strawberry\perl\lib/CPAN/DeferredCode.pm type=file
+C:\strawberry\perl\lib/CPAN/Distribution.pm type=file
+C:\strawberry\perl\lib/CPAN/Distroprefs.pm type=file
+C:\strawberry\perl\lib/CPAN/Distrostatus.pm type=file
+C:\strawberry\perl\lib/CPAN/Exception/RecursiveDependency.pm type=file
+C:\strawberry\perl\lib/CPAN/Exception/blocked_urllist.pm type=file
+C:\strawberry\perl\lib/CPAN/Exception/yaml_not_installed.pm type=file
+C:\strawberry\perl\lib/CPAN/FTP.pm type=file
+C:\strawberry\perl\lib/CPAN/FTP/netrc.pm type=file
+C:\strawberry\perl\lib/CPAN/FirstTime.pm type=file
+C:\strawberry\perl\lib/CPAN/HandleConfig.pm type=file
+C:\strawberry\perl\lib/CPAN/Index.pm type=file
+C:\strawberry\perl\lib/CPAN/InfoObj.pm type=file
+C:\strawberry\perl\lib/CPAN/Kwalify.pm type=file
+C:\strawberry\perl\lib/CPAN/Kwalify/distroprefs.dd type=file
+C:\strawberry\perl\lib/CPAN/Kwalify/distroprefs.yml type=file
+C:\strawberry\perl\lib/CPAN/LWP/UserAgent.pm type=file
+C:\strawberry\perl\lib/CPAN/Module.pm type=file
+C:\strawberry\perl\lib/CPAN/Nox.pm type=file
+C:\strawberry\perl\lib/CPAN/Prompt.pm type=file
+C:\strawberry\perl\lib/CPAN/Queue.pm type=file
+C:\strawberry\perl\lib/CPAN/Shell.pm type=file
+C:\strawberry\perl\lib/CPAN/Tarzip.pm type=file
+C:\strawberry\perl\lib/CPAN/URL.pm type=file
+C:\strawberry\perl\lib/CPAN/Version.pm type=file
+C:\strawberry\perl\lib/CPANPLUS.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Backend.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Backend/RV.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Config.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Configure.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Configure/Setup.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Dist.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Dist/Autobundle.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Dist/Base.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Dist/Build.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Dist/Build/Constants.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Dist/MM.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Dist/Sample.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Error.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/FAQ.pod type=file
+C:\strawberry\perl\lib/CPANPLUS/Hacking.pod type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals/Constants.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals/Constants/Report.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals/Extract.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals/Fetch.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals/Report.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals/Search.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals/Source.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals/Source/Memory.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals/Source/SQLite.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals/Source/SQLite/Tie.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals/Utils.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Internals/Utils/Autoflush.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Module.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Module/Author.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Module/Author/Fake.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Module/Checksums.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Module/Fake.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Module/Signature.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Selfupdate.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Shell.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Shell/Classic.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Shell/Default.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Shell/Default/Plugins/CustomSource.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Shell/Default/Plugins/HOWTO.pod type=file
+C:\strawberry\perl\lib/CPANPLUS/Shell/Default/Plugins/Remote.pm type=file
+C:\strawberry\perl\lib/CPANPLUS/Shell/Default/Plugins/Source.pm type=file
+C:\strawberry\perl\lib/Carp.pm type=file
+C:\strawberry\perl\lib/Carp/Heavy.pm type=file
+C:\strawberry\perl\lib/Class/ISA.pm type=file
+C:\strawberry\perl\lib/Class/Struct.pm type=file
+C:\strawberry\perl\lib/Compress/Raw/Bzip2.pm type=file
+C:\strawberry\perl\lib/Compress/Raw/Zlib.pm type=file
+C:\strawberry\perl\lib/Compress/Zlib.pm type=file
+C:\strawberry\perl\lib/Config.pm type=file
+C:\strawberry\perl\lib/Config.pod type=file
+C:\strawberry\perl\lib/Config/Extensions.pm type=file
+C:\strawberry\perl\lib/Config_git.pl type=file
+C:\strawberry\perl\lib/Config_heavy.pl type=file
+C:\strawberry\perl\lib/Cwd.pm type=file
+C:\strawberry\perl\lib/DB.pm type=file
+C:\strawberry\perl\lib/DBM_Filter.pm type=file
+C:\strawberry\perl\lib/DBM_Filter/compress.pm type=file
+C:\strawberry\perl\lib/DBM_Filter/encode.pm type=file
+C:\strawberry\perl\lib/DBM_Filter/int32.pm type=file
+C:\strawberry\perl\lib/DBM_Filter/null.pm type=file
+C:\strawberry\perl\lib/DBM_Filter/utf8.pm type=file
+C:\strawberry\perl\lib/Data/Dumper.pm type=file
+C:\strawberry\perl\lib/Devel/DProf.pm type=file
+C:\strawberry\perl\lib/Devel/InnerPackage.pm type=file
+C:\strawberry\perl\lib/Devel/PPPort.pm type=file
+C:\strawberry\perl\lib/Devel/Peek.pm type=file
+C:\strawberry\perl\lib/Devel/SelfStubber.pm type=file
+C:\strawberry\perl\lib/Digest.pm type=file
+C:\strawberry\perl\lib/Digest/MD5.pm type=file
+C:\strawberry\perl\lib/Digest/SHA.pm type=file
+C:\strawberry\perl\lib/Digest/base.pm type=file
+C:\strawberry\perl\lib/Digest/file.pm type=file
+C:\strawberry\perl\lib/DirHandle.pm type=file
+C:\strawberry\perl\lib/Dumpvalue.pm type=file
+C:\strawberry\perl\lib/DynaLoader.pm type=file
+C:\strawberry\perl\lib/Encode.pm type=file
+C:\strawberry\perl\lib/Encode/Alias.pm type=file
+C:\strawberry\perl\lib/Encode/Byte.pm type=file
+C:\strawberry\perl\lib/Encode/CJKConstants.pm type=file
+C:\strawberry\perl\lib/Encode/CN.pm type=file
+C:\strawberry\perl\lib/Encode/CN/HZ.pm type=file
+C:\strawberry\perl\lib/Encode/Changes.e2x type=file
+C:\strawberry\perl\lib/Encode/Config.pm type=file
+C:\strawberry\perl\lib/Encode/ConfigLocal_PM.e2x type=file
+C:\strawberry\perl\lib/Encode/EBCDIC.pm type=file
+C:\strawberry\perl\lib/Encode/Encoder.pm type=file
+C:\strawberry\perl\lib/Encode/Encoding.pm type=file
+C:\strawberry\perl\lib/Encode/GSM0338.pm type=file
+C:\strawberry\perl\lib/Encode/Guess.pm type=file
+C:\strawberry\perl\lib/Encode/JP.pm type=file
+C:\strawberry\perl\lib/Encode/JP/H2Z.pm type=file
+C:\strawberry\perl\lib/Encode/JP/JIS7.pm type=file
+C:\strawberry\perl\lib/Encode/KR.pm type=file
+C:\strawberry\perl\lib/Encode/KR/2022_KR.pm type=file
+C:\strawberry\perl\lib/Encode/MIME/Header.pm type=file
+C:\strawberry\perl\lib/Encode/MIME/Header/ISO_2022_JP.pm type=file
+C:\strawberry\perl\lib/Encode/MIME/Name.pm type=file
+C:\strawberry\perl\lib/Encode/Makefile_PL.e2x type=file
+C:\strawberry\perl\lib/Encode/PerlIO.pod type=file
+C:\strawberry\perl\lib/Encode/README.e2x type=file
+C:\strawberry\perl\lib/Encode/Supported.pod type=file
+C:\strawberry\perl\lib/Encode/Symbol.pm type=file
+C:\strawberry\perl\lib/Encode/TW.pm type=file
+C:\strawberry\perl\lib/Encode/Unicode.pm type=file
+C:\strawberry\perl\lib/Encode/Unicode/UTF7.pm type=file
+C:\strawberry\perl\lib/Encode/_PM.e2x type=file
+C:\strawberry\perl\lib/Encode/_T.e2x type=file
+C:\strawberry\perl\lib/Encode/encode.h type=file
+C:\strawberry\perl\lib/English.pm type=file
+C:\strawberry\perl\lib/Env.pm type=file
+C:\strawberry\perl\lib/Errno.pm type=file
+C:\strawberry\perl\lib/Exporter.pm type=file
+C:\strawberry\perl\lib/Exporter/Heavy.pm type=file
+C:\strawberry\perl\lib/ExtUtils/CBuilder.pm type=file
+C:\strawberry\perl\lib/ExtUtils/CBuilder/Base.pm type=file
+C:\strawberry\perl\lib/ExtUtils/CBuilder/Platform/Unix.pm type=file
+C:\strawberry\perl\lib/ExtUtils/CBuilder/Platform/VMS.pm type=file
+C:\strawberry\perl\lib/ExtUtils/CBuilder/Platform/Windows.pm type=file
+C:\strawberry\perl\lib/ExtUtils/CBuilder/Platform/aix.pm type=file
+C:\strawberry\perl\lib/ExtUtils/CBuilder/Platform/cygwin.pm type=file
+C:\strawberry\perl\lib/ExtUtils/CBuilder/Platform/darwin.pm type=file
+C:\strawberry\perl\lib/ExtUtils/CBuilder/Platform/dec_osf.pm type=file
+C:\strawberry\perl\lib/ExtUtils/CBuilder/Platform/os2.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Changes_EU-Install type=file
+C:\strawberry\perl\lib/ExtUtils/Command.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Command/MM.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Constant.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Constant/Base.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Constant/ProxySubs.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Constant/Utils.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Constant/XS.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Embed.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Install.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Installed.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Liblist.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Liblist/Kid.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MANIFEST.SKIP type=file
+C:\strawberry\perl\lib/ExtUtils/MM.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_AIX.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_Any.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_BeOS.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_Cygwin.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_DOS.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_Darwin.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_MacOS.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_NW5.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_OS2.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_QNX.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_UWIN.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_Unix.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_VMS.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_VOS.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_Win32.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MM_Win95.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MY.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MakeMaker.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MakeMaker/Config.pm type=file
+C:\strawberry\perl\lib/ExtUtils/MakeMaker/FAQ.pod type=file
+C:\strawberry\perl\lib/ExtUtils/MakeMaker/Tutorial.pod type=file
+C:\strawberry\perl\lib/ExtUtils/Manifest.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Miniperl.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Mkbootstrap.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Mksymlists.pm type=file
+C:\strawberry\perl\lib/ExtUtils/Packlist.pm type=file
+C:\strawberry\perl\lib/ExtUtils/ParseXS.pm type=file
+C:\strawberry\perl\lib/ExtUtils/testlib.pm type=file
+C:\strawberry\perl\lib/ExtUtils/typemap type=file
+C:\strawberry\perl\lib/ExtUtils/xsubpp type=file
+C:\strawberry\perl\lib/Fatal.pm type=file
+C:\strawberry\perl\lib/Fcntl.pm type=file
+C:\strawberry\perl\lib/File/Basename.pm type=file
+C:\strawberry\perl\lib/File/CheckTree.pm type=file
+C:\strawberry\perl\lib/File/Compare.pm type=file
+C:\strawberry\perl\lib/File/Copy.pm type=file
+C:\strawberry\perl\lib/File/DosGlob.pm type=file
+C:\strawberry\perl\lib/File/Fetch.pm type=file
+C:\strawberry\perl\lib/File/Find.pm type=file
+C:\strawberry\perl\lib/File/Glob.pm type=file
+C:\strawberry\perl\lib/File/GlobMapper.pm type=file
+C:\strawberry\perl\lib/File/Path.pm type=file
+C:\strawberry\perl\lib/File/Spec.pm type=file
+C:\strawberry\perl\lib/File/Spec/Cygwin.pm type=file
+C:\strawberry\perl\lib/File/Spec/Epoc.pm type=file
+C:\strawberry\perl\lib/File/Spec/Functions.pm type=file
+C:\strawberry\perl\lib/File/Spec/Mac.pm type=file
+C:\strawberry\perl\lib/File/Spec/OS2.pm type=file
+C:\strawberry\perl\lib/File/Spec/Unix.pm type=file
+C:\strawberry\perl\lib/File/Spec/VMS.pm type=file
+C:\strawberry\perl\lib/File/Spec/Win32.pm type=file
+C:\strawberry\perl\lib/File/Temp.pm type=file
+C:\strawberry\perl\lib/File/stat.pm type=file
+C:\strawberry\perl\lib/FileCache.pm type=file
+C:\strawberry\perl\lib/FileHandle.pm type=file
+C:\strawberry\perl\lib/Filter/Simple.pm type=file
+C:\strawberry\perl\lib/Filter/Util/Call.pm type=file
+C:\strawberry\perl\lib/FindBin.pm type=file
+C:\strawberry\perl\lib/GDBM_File.pm type=file
+C:\strawberry\perl\lib/Getopt/Long.pm type=file
+C:\strawberry\perl\lib/Getopt/Std.pm type=file
+C:\strawberry\perl\lib/Hash/Util.pm type=file
+C:\strawberry\perl\lib/Hash/Util/FieldHash.pm type=file
+C:\strawberry\perl\lib/I18N/Collate.pm type=file
+C:\strawberry\perl\lib/I18N/LangTags.pm type=file
+C:\strawberry\perl\lib/I18N/LangTags/Detect.pm type=file
+C:\strawberry\perl\lib/I18N/LangTags/List.pm type=file
+C:\strawberry\perl\lib/IO.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Adapter/Bzip2.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Adapter/Deflate.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Adapter/Identity.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Base.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Base/Common.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Bzip2.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Deflate.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Gzip.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Gzip/Constants.pm type=file
+C:\strawberry\perl\lib/IO/Compress/RawDeflate.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Zip.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Zip/Constants.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Zlib/Constants.pm type=file
+C:\strawberry\perl\lib/IO/Compress/Zlib/Extra.pm type=file
+C:\strawberry\perl\lib/IO/Dir.pm type=file
+C:\strawberry\perl\lib/IO/File.pm type=file
+C:\strawberry\perl\lib/IO/Handle.pm type=file
+C:\strawberry\perl\lib/IO/Pipe.pm type=file
+C:\strawberry\perl\lib/IO/Poll.pm type=file
+C:\strawberry\perl\lib/IO/Seekable.pm type=file
+C:\strawberry\perl\lib/IO/Select.pm type=file
+C:\strawberry\perl\lib/IO/Socket.pm type=file
+C:\strawberry\perl\lib/IO/Socket/INET.pm type=file
+C:\strawberry\perl\lib/IO/Socket/UNIX.pm type=file
+C:\strawberry\perl\lib/IO/Uncompress/Adapter/Bunzip2.pm type=file
+C:\strawberry\perl\lib/IO/Uncompress/Adapter/Identity.pm type=file
+C:\strawberry\perl\lib/IO/Uncompress/Adapter/Inflate.pm type=file
+C:\strawberry\perl\lib/IO/Uncompress/AnyInflate.pm type=file
+C:\strawberry\perl\lib/IO/Uncompress/AnyUncompress.pm type=file
+C:\strawberry\perl\lib/IO/Uncompress/Base.pm type=file
+C:\strawberry\perl\lib/IO/Uncompress/Bunzip2.pm type=file
+C:\strawberry\perl\lib/IO/Uncompress/Gunzip.pm type=file
+C:\strawberry\perl\lib/IO/Uncompress/Inflate.pm type=file
+C:\strawberry\perl\lib/IO/Uncompress/RawInflate.pm type=file
+C:\strawberry\perl\lib/IO/Uncompress/Unzip.pm type=file
+C:\strawberry\perl\lib/IO/Zlib.pm type=file
+C:\strawberry\perl\lib/IPC/Cmd.pm type=file
+C:\strawberry\perl\lib/IPC/Open2.pm type=file
+C:\strawberry\perl\lib/IPC/Open3.pm type=file
+C:\strawberry\perl\lib/List/Util.pm type=file
+C:\strawberry\perl\lib/List/Util/PP.pm type=file
+C:\strawberry\perl\lib/List/Util/XS.pm type=file
+C:\strawberry\perl\lib/Locale/Constants.pm type=file
+C:\strawberry\perl\lib/Locale/Constants.pod type=file
+C:\strawberry\perl\lib/Locale/Country.pm type=file
+C:\strawberry\perl\lib/Locale/Country.pod type=file
+C:\strawberry\perl\lib/Locale/Currency.pm type=file
+C:\strawberry\perl\lib/Locale/Currency.pod type=file
+C:\strawberry\perl\lib/Locale/Language.pm type=file
+C:\strawberry\perl\lib/Locale/Language.pod type=file
+C:\strawberry\perl\lib/Locale/Maketext.pm type=file
+C:\strawberry\perl\lib/Locale/Maketext.pod type=file
+C:\strawberry\perl\lib/Locale/Maketext/Guts.pm type=file
+C:\strawberry\perl\lib/Locale/Maketext/GutsLoader.pm type=file
+C:\strawberry\perl\lib/Locale/Maketext/Simple.pm type=file
+C:\strawberry\perl\lib/Locale/Maketext/TPJ13.pod type=file
+C:\strawberry\perl\lib/Locale/Script.pm type=file
+C:\strawberry\perl\lib/Locale/Script.pod type=file
+C:\strawberry\perl\lib/Log/Message.pm type=file
+C:\strawberry\perl\lib/Log/Message/Config.pm type=file
+C:\strawberry\perl\lib/Log/Message/Handlers.pm type=file
+C:\strawberry\perl\lib/Log/Message/Item.pm type=file
+C:\strawberry\perl\lib/Log/Message/Simple.pm type=file
+C:\strawberry\perl\lib/MIME/Base64.pm type=file
+C:\strawberry\perl\lib/MIME/QuotedPrint.pm type=file
+C:\strawberry\perl\lib/Math/BigFloat.pm type=file
+C:\strawberry\perl\lib/Math/BigFloat/Trace.pm type=file
+C:\strawberry\perl\lib/Math/BigInt.pm type=file
+C:\strawberry\perl\lib/Math/BigInt/Calc.pm type=file
+C:\strawberry\perl\lib/Math/BigInt/CalcEmu.pm type=file
+C:\strawberry\perl\lib/Math/BigInt/FastCalc.pm type=file
+C:\strawberry\perl\lib/Math/BigInt/Trace.pm type=file
+C:\strawberry\perl\lib/Math/BigRat.pm type=file
+C:\strawberry\perl\lib/Math/Complex.pm type=file
+C:\strawberry\perl\lib/Math/Trig.pm type=file
+C:\strawberry\perl\lib/Memoize.pm type=file
+C:\strawberry\perl\lib/Memoize/AnyDBM_File.pm type=file
+C:\strawberry\perl\lib/Memoize/Expire.pm type=file
+C:\strawberry\perl\lib/Memoize/ExpireFile.pm type=file
+C:\strawberry\perl\lib/Memoize/ExpireTest.pm type=file
+C:\strawberry\perl\lib/Memoize/NDBM_File.pm type=file
+C:\strawberry\perl\lib/Memoize/SDBM_File.pm type=file
+C:\strawberry\perl\lib/Memoize/Storable.pm type=file
+C:\strawberry\perl\lib/Module/Build.pm type=file
+C:\strawberry\perl\lib/Module/Build/API.pod type=file
+C:\strawberry\perl\lib/Module/Build/Authoring.pod type=file
+C:\strawberry\perl\lib/Module/Build/Base.pm type=file
+C:\strawberry\perl\lib/Module/Build/Compat.pm type=file
+C:\strawberry\perl\lib/Module/Build/Config.pm type=file
+C:\strawberry\perl\lib/Module/Build/ConfigData.pm type=file
+C:\strawberry\perl\lib/Module/Build/Cookbook.pm type=file
+C:\strawberry\perl\lib/Module/Build/Dumper.pm type=file
+C:\strawberry\perl\lib/Module/Build/ModuleInfo.pm type=file
+C:\strawberry\perl\lib/Module/Build/Notes.pm type=file
+C:\strawberry\perl\lib/Module/Build/PPMMaker.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/Amiga.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/Default.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/EBCDIC.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/MPEiX.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/MacOS.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/RiscOS.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/Unix.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/VMS.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/VOS.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/Windows.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/aix.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/cygwin.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/darwin.pm type=file
+C:\strawberry\perl\lib/Module/Build/Platform/os2.pm type=file
+C:\strawberry\perl\lib/Module/Build/PodParser.pm type=file
+C:\strawberry\perl\lib/Module/Build/Version.pm type=file
+C:\strawberry\perl\lib/Module/Build/YAML.pm type=file
+C:\strawberry\perl\lib/Module/CoreList.pm type=file
+C:\strawberry\perl\lib/Module/Load.pm type=file
+C:\strawberry\perl\lib/Module/Load/Conditional.pm type=file
+C:\strawberry\perl\lib/Module/Loaded.pm type=file
+C:\strawberry\perl\lib/Module/Pluggable.pm type=file
+C:\strawberry\perl\lib/Module/Pluggable/Object.pm type=file
+C:\strawberry\perl\lib/NEXT.pm type=file
+C:\strawberry\perl\lib/Net/Cmd.pm type=file
+C:\strawberry\perl\lib/Net/Config.eg type=file
+C:\strawberry\perl\lib/Net/Config.pm type=file
+C:\strawberry\perl\lib/Net/Domain.pm type=file
+C:\strawberry\perl\lib/Net/FTP.pm type=file
+C:\strawberry\perl\lib/Net/FTP/A.pm type=file
+C:\strawberry\perl\lib/Net/FTP/E.pm type=file
+C:\strawberry\perl\lib/Net/FTP/I.pm type=file
+C:\strawberry\perl\lib/Net/FTP/L.pm type=file
+C:\strawberry\perl\lib/Net/FTP/dataconn.pm type=file
+C:\strawberry\perl\lib/Net/Hostname.pm.eg type=file
+C:\strawberry\perl\lib/Net/NNTP.pm type=file
+C:\strawberry\perl\lib/Net/Netrc.pm type=file
+C:\strawberry\perl\lib/Net/POP3.pm type=file
+C:\strawberry\perl\lib/Net/Ping.pm type=file
+C:\strawberry\perl\lib/Net/SMTP.pm type=file
+C:\strawberry\perl\lib/Net/Time.pm type=file
+C:\strawberry\perl\lib/Net/hostent.pm type=file
+C:\strawberry\perl\lib/Net/libnetFAQ.pod type=file
+C:\strawberry\perl\lib/Net/netent.pm type=file
+C:\strawberry\perl\lib/Net/protoent.pm type=file
+C:\strawberry\perl\lib/Net/servent.pm type=file
+C:\strawberry\perl\lib/O.pm type=file
+C:\strawberry\perl\lib/Object/Accessor.pm type=file
+C:\strawberry\perl\lib/Opcode.pm type=file
+C:\strawberry\perl\lib/POSIX.pm type=file
+C:\strawberry\perl\lib/POSIX.pod type=file
+C:\strawberry\perl\lib/Package/Constants.pm type=file
+C:\strawberry\perl\lib/Params/Check.pm type=file
+C:\strawberry\perl\lib/Parse/CPAN/Meta.pm type=file
+C:\strawberry\perl\lib/PerlIO.pm type=file
+C:\strawberry\perl\lib/PerlIO/encoding.pm type=file
+C:\strawberry\perl\lib/PerlIO/scalar.pm type=file
+C:\strawberry\perl\lib/PerlIO/via.pm type=file
+C:\strawberry\perl\lib/PerlIO/via/QuotedPrint.pm type=file
+C:\strawberry\perl\lib/Pod/Checker.pm type=file
+C:\strawberry\perl\lib/Pod/Escapes.pm type=file
+C:\strawberry\perl\lib/Pod/Find.pm type=file
+C:\strawberry\perl\lib/Pod/Functions.pm type=file
+C:\strawberry\perl\lib/Pod/Html.pm type=file
+C:\strawberry\perl\lib/Pod/InputObjects.pm type=file
+C:\strawberry\perl\lib/Pod/LaTeX.pm type=file
+C:\strawberry\perl\lib/Pod/Man.pm type=file
+C:\strawberry\perl\lib/Pod/ParseLink.pm type=file
+C:\strawberry\perl\lib/Pod/ParseUtils.pm type=file
+C:\strawberry\perl\lib/Pod/Parser.pm type=file
+C:\strawberry\perl\lib/Pod/Perldoc.pm type=file
+C:\strawberry\perl\lib/Pod/Perldoc/BaseTo.pm type=file
+C:\strawberry\perl\lib/Pod/Perldoc/GetOptsOO.pm type=file
+C:\strawberry\perl\lib/Pod/Perldoc/ToChecker.pm type=file
+C:\strawberry\perl\lib/Pod/Perldoc/ToMan.pm type=file
+C:\strawberry\perl\lib/Pod/Perldoc/ToNroff.pm type=file
+C:\strawberry\perl\lib/Pod/Perldoc/ToPod.pm type=file
+C:\strawberry\perl\lib/Pod/Perldoc/ToRtf.pm type=file
+C:\strawberry\perl\lib/Pod/Perldoc/ToText.pm type=file
+C:\strawberry\perl\lib/Pod/Perldoc/ToTk.pm type=file
+C:\strawberry\perl\lib/Pod/Perldoc/ToXml.pm type=file
+C:\strawberry\perl\lib/Pod/PlainText.pm type=file
+C:\strawberry\perl\lib/Pod/Plainer.pm type=file
+C:\strawberry\perl\lib/Pod/Select.pm type=file
+C:\strawberry\perl\lib/Pod/Simple.pm type=file
+C:\strawberry\perl\lib/Pod/Simple.pod type=file
+C:\strawberry\perl\lib/Pod/Simple/BlackBox.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/Checker.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/Debug.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/DumpAsText.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/DumpAsXML.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/HTML.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/HTMLBatch.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/HTMLLegacy.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/LinkSection.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/Methody.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/Progress.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/PullParser.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/PullParserEndToken.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/PullParserStartToken.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/PullParserTextToken.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/PullParserToken.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/RTF.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/Search.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/SimpleTree.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/Subclassing.pod type=file
+C:\strawberry\perl\lib/Pod/Simple/Text.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/TextContent.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/TiedOutFH.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/Transcode.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/TranscodeDumb.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/TranscodeSmart.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/XHTML.pm type=file
+C:\strawberry\perl\lib/Pod/Simple/XMLOutStream.pm type=file
+C:\strawberry\perl\lib/Pod/Text.pm type=file
+C:\strawberry\perl\lib/Pod/Text/Color.pm type=file
+C:\strawberry\perl\lib/Pod/Text/Overstrike.pm type=file
+C:\strawberry\perl\lib/Pod/Text/Termcap.pm type=file
+C:\strawberry\perl\lib/Pod/Usage.pm type=file
+C:\strawberry\perl\lib/SDBM_File.pm type=file
+C:\strawberry\perl\lib/Safe.pm type=file
+C:\strawberry\perl\lib/Scalar/Util.pm type=file
+C:\strawberry\perl\lib/Scalar/Util/PP.pm type=file
+C:\strawberry\perl\lib/Search/Dict.pm type=file
+C:\strawberry\perl\lib/SelectSaver.pm type=file
+C:\strawberry\perl\lib/SelfLoader.pm type=file
+C:\strawberry\perl\lib/Shell.pm type=file
+C:\strawberry\perl\lib/Socket.pm type=file
+C:\strawberry\perl\lib/Storable.pm type=file
+C:\strawberry\perl\lib/Switch.pm type=file
+C:\strawberry\perl\lib/Symbol.pm type=file
+C:\strawberry\perl\lib/Sys/Hostname.pm type=file
+C:\strawberry\perl\lib/TAP/Base.pm type=file
+C:\strawberry\perl\lib/TAP/Formatter/Base.pm type=file
+C:\strawberry\perl\lib/TAP/Formatter/Color.pm type=file
+C:\strawberry\perl\lib/TAP/Formatter/Console.pm type=file
+C:\strawberry\perl\lib/TAP/Formatter/Console/ParallelSession.pm type=file
+C:\strawberry\perl\lib/TAP/Formatter/Console/Session.pm type=file
+C:\strawberry\perl\lib/TAP/Formatter/File.pm type=file
+C:\strawberry\perl\lib/TAP/Formatter/File/Session.pm type=file
+C:\strawberry\perl\lib/TAP/Formatter/Session.pm type=file
+C:\strawberry\perl\lib/TAP/Harness.pm type=file
+C:\strawberry\perl\lib/TAP/Object.pm type=file
+C:\strawberry\perl\lib/TAP/Parser.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Aggregator.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Grammar.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Iterator.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Iterator/Array.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Iterator/Process.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Iterator/Stream.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/IteratorFactory.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Multiplexer.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Result.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Result/Bailout.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Result/Comment.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Result/Plan.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Result/Pragma.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Result/Test.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Result/Unknown.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Result/Version.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Result/YAML.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/ResultFactory.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Scheduler.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Scheduler/Job.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Scheduler/Spinner.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Source.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Source/Perl.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/Utils.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/YAMLish/Reader.pm type=file
+C:\strawberry\perl\lib/TAP/Parser/YAMLish/Writer.pm type=file
+C:\strawberry\perl\lib/Term/ANSIColor.pm type=file
+C:\strawberry\perl\lib/Term/Cap.pm type=file
+C:\strawberry\perl\lib/Term/Complete.pm type=file
+C:\strawberry\perl\lib/Term/ReadLine.pm type=file
+C:\strawberry\perl\lib/Term/UI.pm type=file
+C:\strawberry\perl\lib/Term/UI/History.pm type=file
+C:\strawberry\perl\lib/Test.pm type=file
+C:\strawberry\perl\lib/Test/Builder.pm type=file
+C:\strawberry\perl\lib/Test/Builder/Module.pm type=file
+C:\strawberry\perl\lib/Test/Builder/Tester.pm type=file
+C:\strawberry\perl\lib/Test/Builder/Tester/Color.pm type=file
+C:\strawberry\perl\lib/Test/Harness.pm type=file
+C:\strawberry\perl\lib/Test/More.pm type=file
+C:\strawberry\perl\lib/Test/Simple.pm type=file
+C:\strawberry\perl\lib/Test/Tutorial.pod type=file
+C:\strawberry\perl\lib/Text/Abbrev.pm type=file
+C:\strawberry\perl\lib/Text/Balanced.pm type=file
+C:\strawberry\perl\lib/Text/ParseWords.pm type=file
+C:\strawberry\perl\lib/Text/Soundex.pm type=file
+C:\strawberry\perl\lib/Text/Tabs.pm type=file
+C:\strawberry\perl\lib/Text/Wrap.pm type=file
+C:\strawberry\perl\lib/Thread.pm type=file
+C:\strawberry\perl\lib/Thread/Queue.pm type=file
+C:\strawberry\perl\lib/Thread/Semaphore.pm type=file
+C:\strawberry\perl\lib/Tie/Array.pm type=file
+C:\strawberry\perl\lib/Tie/File.pm type=file
+C:\strawberry\perl\lib/Tie/Handle.pm type=file
+C:\strawberry\perl\lib/Tie/Hash.pm type=file
+C:\strawberry\perl\lib/Tie/Hash/NamedCapture.pm type=file
+C:\strawberry\perl\lib/Tie/Memoize.pm type=file
+C:\strawberry\perl\lib/Tie/RefHash.pm type=file
+C:\strawberry\perl\lib/Tie/Scalar.pm type=file
+C:\strawberry\perl\lib/Tie/StdHandle.pm type=file
+C:\strawberry\perl\lib/Tie/SubstrHash.pm type=file
+C:\strawberry\perl\lib/Time/HiRes.pm type=file
+C:\strawberry\perl\lib/Time/Local.pm type=file
+C:\strawberry\perl\lib/Time/Piece.pm type=file
+C:\strawberry\perl\lib/Time/Seconds.pm type=file
+C:\strawberry\perl\lib/Time/gmtime.pm type=file
+C:\strawberry\perl\lib/Time/localtime.pm type=file
+C:\strawberry\perl\lib/Time/tm.pm type=file
+C:\strawberry\perl\lib/UNIVERSAL.pm type=file
+C:\strawberry\perl\lib/Unicode/Collate.pm type=file
+C:\strawberry\perl\lib/Unicode/Collate/allkeys.txt type=file
+C:\strawberry\perl\lib/Unicode/Collate/keys.txt type=file
+C:\strawberry\perl\lib/Unicode/Normalize.pm type=file
+C:\strawberry\perl\lib/Unicode/UCD.pm type=file
+C:\strawberry\perl\lib/User/grent.pm type=file
+C:\strawberry\perl\lib/User/pwent.pm type=file
+C:\strawberry\perl\lib/Win32.pm type=file
+C:\strawberry\perl\lib/Win32API/File.pm type=file
+C:\strawberry\perl\lib/Win32API/File/cFile.pc type=file
+C:\strawberry\perl\lib/Win32CORE.pm type=file
+C:\strawberry\perl\lib/XSLoader.pm type=file
+C:\strawberry\perl\lib/abbrev.pl type=file
+C:\strawberry\perl\lib/assert.pl type=file
+C:\strawberry\perl\lib/attributes.pm type=file
+C:\strawberry\perl\lib/attrs.pm type=file
+C:\strawberry\perl\lib/auto/B/B.dll type=file
+C:\strawberry\perl\lib/auto/Compress/Raw/Bzip2/Bzip2.dll type=file
+C:\strawberry\perl\lib/auto/Compress/Raw/Bzip2/autosplit.ix type=file
+C:\strawberry\perl\lib/auto/Compress/Raw/Zlib/Zlib.dll type=file
+C:\strawberry\perl\lib/auto/Compress/Raw/Zlib/autosplit.ix type=file
+C:\strawberry\perl\lib/auto/Compress/Zlib/autosplit.ix type=file
+C:\strawberry\perl\lib/auto/Cwd/Cwd.dll type=file
+C:\strawberry\perl\lib/auto/Data/Dumper/Dumper.dll type=file
+C:\strawberry\perl\lib/auto/Devel/DProf/DProf.dll type=file
+C:\strawberry\perl\lib/auto/Devel/PPPort/PPPort.dll type=file
+C:\strawberry\perl\lib/auto/Devel/Peek/Peek.dll type=file
+C:\strawberry\perl\lib/auto/Digest/MD5/MD5.dll type=file
+C:\strawberry\perl\lib/auto/Digest/SHA/SHA.dll type=file
+C:\strawberry\perl\lib/auto/DynaLoader/autosplit.ix type=file
+C:\strawberry\perl\lib/auto/DynaLoader/dl_expandspec.al type=file
+C:\strawberry\perl\lib/auto/DynaLoader/dl_find_symbol_anywhere.al type=file
+C:\strawberry\perl\lib/auto/DynaLoader/dl_findfile.al type=file
+C:\strawberry\perl\lib/auto/Encode/Byte/Byte.dll type=file
+C:\strawberry\perl\lib/auto/Encode/CN/CN.dll type=file
+C:\strawberry\perl\lib/auto/Encode/EBCDIC/EBCDIC.dll type=file
+C:\strawberry\perl\lib/auto/Encode/Encode.dll type=file
+C:\strawberry\perl\lib/auto/Encode/JP/JP.dll type=file
+C:\strawberry\perl\lib/auto/Encode/KR/KR.dll type=file
+C:\strawberry\perl\lib/auto/Encode/Symbol/Symbol.dll type=file
+C:\strawberry\perl\lib/auto/Encode/TW/TW.dll type=file
+C:\strawberry\perl\lib/auto/Encode/Unicode/Unicode.dll type=file
+C:\strawberry\perl\lib/auto/Fcntl/Fcntl.dll type=file
+C:\strawberry\perl\lib/auto/File/Glob/Glob.dll type=file
+C:\strawberry\perl\lib/auto/Filter/Util/Call/Call.dll type=file
+C:\strawberry\perl\lib/auto/GDBM_File/GDBM_File.dll type=file
+C:\strawberry\perl\lib/auto/Hash/Util/FieldHash/FieldHash.dll type=file
+C:\strawberry\perl\lib/auto/Hash/Util/Util.dll type=file
+C:\strawberry\perl\lib/auto/IO/IO.dll type=file
+C:\strawberry\perl\lib/auto/List/Util/Util.dll type=file
+C:\strawberry\perl\lib/auto/MIME/Base64/Base64.dll type=file
+C:\strawberry\perl\lib/auto/Math/BigInt/FastCalc/FastCalc.dll type=file
+C:\strawberry\perl\lib/auto/Opcode/Opcode.dll type=file
+C:\strawberry\perl\lib/auto/POSIX/POSIX.dll type=file
+C:\strawberry\perl\lib/auto/POSIX/SigAction/flags.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigAction/handler.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigAction/mask.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigAction/new.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigAction/safe.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigRt/CLEAR.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigRt/DELETE.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigRt/EXISTS.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigRt/FETCH.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigRt/SCALAR.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigRt/STORE.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigRt/_check.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigRt/_croak.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigRt/_exist.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigRt/_getsig.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigRt/_init.al type=file
+C:\strawberry\perl\lib/auto/POSIX/SigRt/new.al type=file
+C:\strawberry\perl\lib/auto/POSIX/abs.al type=file
+C:\strawberry\perl\lib/auto/POSIX/alarm.al type=file
+C:\strawberry\perl\lib/auto/POSIX/assert.al type=file
+C:\strawberry\perl\lib/auto/POSIX/atan2.al type=file
+C:\strawberry\perl\lib/auto/POSIX/atexit.al type=file
+C:\strawberry\perl\lib/auto/POSIX/atof.al type=file
+C:\strawberry\perl\lib/auto/POSIX/atoi.al type=file
+C:\strawberry\perl\lib/auto/POSIX/atol.al type=file
+C:\strawberry\perl\lib/auto/POSIX/autosplit.ix type=file
+C:\strawberry\perl\lib/auto/POSIX/bsearch.al type=file
+C:\strawberry\perl\lib/auto/POSIX/calloc.al type=file
+C:\strawberry\perl\lib/auto/POSIX/chdir.al type=file
+C:\strawberry\perl\lib/auto/POSIX/chmod.al type=file
+C:\strawberry\perl\lib/auto/POSIX/chown.al type=file
+C:\strawberry\perl\lib/auto/POSIX/clearerr.al type=file
+C:\strawberry\perl\lib/auto/POSIX/closedir.al type=file
+C:\strawberry\perl\lib/auto/POSIX/cos.al type=file
+C:\strawberry\perl\lib/auto/POSIX/creat.al type=file
+C:\strawberry\perl\lib/auto/POSIX/div.al type=file
+C:\strawberry\perl\lib/auto/POSIX/errno.al type=file
+C:\strawberry\perl\lib/auto/POSIX/execl.al type=file
+C:\strawberry\perl\lib/auto/POSIX/execle.al type=file
+C:\strawberry\perl\lib/auto/POSIX/execlp.al type=file
+C:\strawberry\perl\lib/auto/POSIX/execv.al type=file
+C:\strawberry\perl\lib/auto/POSIX/execve.al type=file
+C:\strawberry\perl\lib/auto/POSIX/execvp.al type=file
+C:\strawberry\perl\lib/auto/POSIX/exit.al type=file
+C:\strawberry\perl\lib/auto/POSIX/exp.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fabs.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fclose.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fcntl.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fdopen.al type=file
+C:\strawberry\perl\lib/auto/POSIX/feof.al type=file
+C:\strawberry\perl\lib/auto/POSIX/ferror.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fflush.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fgetc.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fgetpos.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fgets.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fileno.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fopen.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fork.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fprintf.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fputc.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fputs.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fread.al type=file
+C:\strawberry\perl\lib/auto/POSIX/free.al type=file
+C:\strawberry\perl\lib/auto/POSIX/freopen.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fscanf.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fseek.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fsetpos.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fstat.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fsync.al type=file
+C:\strawberry\perl\lib/auto/POSIX/ftell.al type=file
+C:\strawberry\perl\lib/auto/POSIX/fwrite.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getc.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getchar.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getegid.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getenv.al type=file
+C:\strawberry\perl\lib/auto/POSIX/geteuid.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getgid.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getgrgid.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getgrnam.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getgroups.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getlogin.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getpgrp.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getpid.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getppid.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getpwnam.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getpwuid.al type=file
+C:\strawberry\perl\lib/auto/POSIX/gets.al type=file
+C:\strawberry\perl\lib/auto/POSIX/getuid.al type=file
+C:\strawberry\perl\lib/auto/POSIX/gmtime.al type=file
+C:\strawberry\perl\lib/auto/POSIX/isatty.al type=file
+C:\strawberry\perl\lib/auto/POSIX/kill.al type=file
+C:\strawberry\perl\lib/auto/POSIX/labs.al type=file
+C:\strawberry\perl\lib/auto/POSIX/ldiv.al type=file
+C:\strawberry\perl\lib/auto/POSIX/link.al type=file
+C:\strawberry\perl\lib/auto/POSIX/load_imports.al type=file
+C:\strawberry\perl\lib/auto/POSIX/localtime.al type=file
+C:\strawberry\perl\lib/auto/POSIX/log.al type=file
+C:\strawberry\perl\lib/auto/POSIX/longjmp.al type=file
+C:\strawberry\perl\lib/auto/POSIX/malloc.al type=file
+C:\strawberry\perl\lib/auto/POSIX/memchr.al type=file
+C:\strawberry\perl\lib/auto/POSIX/memcmp.al type=file
+C:\strawberry\perl\lib/auto/POSIX/memcpy.al type=file
+C:\strawberry\perl\lib/auto/POSIX/memmove.al type=file
+C:\strawberry\perl\lib/auto/POSIX/memset.al type=file
+C:\strawberry\perl\lib/auto/POSIX/mkdir.al type=file
+C:\strawberry\perl\lib/auto/POSIX/offsetof.al type=file
+C:\strawberry\perl\lib/auto/POSIX/opendir.al type=file
+C:\strawberry\perl\lib/auto/POSIX/perror.al type=file
+C:\strawberry\perl\lib/auto/POSIX/pow.al type=file
+C:\strawberry\perl\lib/auto/POSIX/printf.al type=file
+C:\strawberry\perl\lib/auto/POSIX/putc.al type=file
+C:\strawberry\perl\lib/auto/POSIX/putchar.al type=file
+C:\strawberry\perl\lib/auto/POSIX/puts.al type=file
+C:\strawberry\perl\lib/auto/POSIX/qsort.al type=file
+C:\strawberry\perl\lib/auto/POSIX/raise.al type=file
+C:\strawberry\perl\lib/auto/POSIX/rand.al type=file
+C:\strawberry\perl\lib/auto/POSIX/readdir.al type=file
+C:\strawberry\perl\lib/auto/POSIX/realloc.al type=file
+C:\strawberry\perl\lib/auto/POSIX/redef.al type=file
+C:\strawberry\perl\lib/auto/POSIX/remove.al type=file
+C:\strawberry\perl\lib/auto/POSIX/rename.al type=file
+C:\strawberry\perl\lib/auto/POSIX/rewind.al type=file
+C:\strawberry\perl\lib/auto/POSIX/rewinddir.al type=file
+C:\strawberry\perl\lib/auto/POSIX/rmdir.al type=file
+C:\strawberry\perl\lib/auto/POSIX/scanf.al type=file
+C:\strawberry\perl\lib/auto/POSIX/setbuf.al type=file
+C:\strawberry\perl\lib/auto/POSIX/setjmp.al type=file
+C:\strawberry\perl\lib/auto/POSIX/setvbuf.al type=file
+C:\strawberry\perl\lib/auto/POSIX/siglongjmp.al type=file
+C:\strawberry\perl\lib/auto/POSIX/sigsetjmp.al type=file
+C:\strawberry\perl\lib/auto/POSIX/sin.al type=file
+C:\strawberry\perl\lib/auto/POSIX/sleep.al type=file
+C:\strawberry\perl\lib/auto/POSIX/sprintf.al type=file
+C:\strawberry\perl\lib/auto/POSIX/sqrt.al type=file
+C:\strawberry\perl\lib/auto/POSIX/srand.al type=file
+C:\strawberry\perl\lib/auto/POSIX/sscanf.al type=file
+C:\strawberry\perl\lib/auto/POSIX/stat.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strcat.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strchr.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strcmp.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strcpy.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strcspn.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strerror.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strlen.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strncat.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strncmp.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strncpy.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strpbrk.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strrchr.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strspn.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strstr.al type=file
+C:\strawberry\perl\lib/auto/POSIX/strtok.al type=file
+C:\strawberry\perl\lib/auto/POSIX/system.al type=file
+C:\strawberry\perl\lib/auto/POSIX/time.al type=file
+C:\strawberry\perl\lib/auto/POSIX/tmpfile.al type=file
+C:\strawberry\perl\lib/auto/POSIX/tolower.al type=file
+C:\strawberry\perl\lib/auto/POSIX/toupper.al type=file
+C:\strawberry\perl\lib/auto/POSIX/umask.al type=file
+C:\strawberry\perl\lib/auto/POSIX/ungetc.al type=file
+C:\strawberry\perl\lib/auto/POSIX/unimpl.al type=file
+C:\strawberry\perl\lib/auto/POSIX/unlink.al type=file
+C:\strawberry\perl\lib/auto/POSIX/usage.al type=file
+C:\strawberry\perl\lib/auto/POSIX/utime.al type=file
+C:\strawberry\perl\lib/auto/POSIX/vfprintf.al type=file
+C:\strawberry\perl\lib/auto/POSIX/vprintf.al type=file
+C:\strawberry\perl\lib/auto/POSIX/vsprintf.al type=file
+C:\strawberry\perl\lib/auto/POSIX/wait.al type=file
+C:\strawberry\perl\lib/auto/POSIX/waitpid.al type=file
+C:\strawberry\perl\lib/auto/PerlIO/encoding/encoding.dll type=file
+C:\strawberry\perl\lib/auto/PerlIO/scalar/scalar.dll type=file
+C:\strawberry\perl\lib/auto/PerlIO/via/via.dll type=file
+C:\strawberry\perl\lib/auto/SDBM_File/SDBM_File.dll type=file
+C:\strawberry\perl\lib/auto/Socket/Socket.dll type=file
+C:\strawberry\perl\lib/auto/Storable/BIN_VERSION_NV.al type=file
+C:\strawberry\perl\lib/auto/Storable/BIN_WRITE_VERSION_NV.al type=file
+C:\strawberry\perl\lib/auto/Storable/CAN_FLOCK.al type=file
+C:\strawberry\perl\lib/auto/Storable/Storable.dll type=file
+C:\strawberry\perl\lib/auto/Storable/_freeze.al type=file
+C:\strawberry\perl\lib/auto/Storable/_retrieve.al type=file
+C:\strawberry\perl\lib/auto/Storable/_store.al type=file
+C:\strawberry\perl\lib/auto/Storable/_store_fd.al type=file
+C:\strawberry\perl\lib/auto/Storable/autosplit.ix type=file
+C:\strawberry\perl\lib/auto/Storable/fd_retrieve.al type=file
+C:\strawberry\perl\lib/auto/Storable/file_magic.al type=file
+C:\strawberry\perl\lib/auto/Storable/freeze.al type=file
+C:\strawberry\perl\lib/auto/Storable/lock_nstore.al type=file
+C:\strawberry\perl\lib/auto/Storable/lock_retrieve.al type=file
+C:\strawberry\perl\lib/auto/Storable/lock_store.al type=file
+C:\strawberry\perl\lib/auto/Storable/logcarp.al type=file
+C:\strawberry\perl\lib/auto/Storable/logcroak.al type=file
+C:\strawberry\perl\lib/auto/Storable/nfreeze.al type=file
+C:\strawberry\perl\lib/auto/Storable/nstore.al type=file
+C:\strawberry\perl\lib/auto/Storable/nstore_fd.al type=file
+C:\strawberry\perl\lib/auto/Storable/read_magic.al type=file
+C:\strawberry\perl\lib/auto/Storable/retrieve.al type=file
+C:\strawberry\perl\lib/auto/Storable/show_file_magic.al type=file
+C:\strawberry\perl\lib/auto/Storable/store.al type=file
+C:\strawberry\perl\lib/auto/Storable/store_fd.al type=file
+C:\strawberry\perl\lib/auto/Storable/thaw.al type=file
+C:\strawberry\perl\lib/auto/Sys/Hostname/Hostname.dll type=file
+C:\strawberry\perl\lib/auto/Sys/Hostname/autosplit.ix type=file
+C:\strawberry\perl\lib/auto/Text/Soundex/Soundex.dll type=file
+C:\strawberry\perl\lib/auto/Time/HiRes/HiRes.dll type=file
+C:\strawberry\perl\lib/auto/Time/Piece/Piece.dll type=file
+C:\strawberry\perl\lib/auto/Unicode/Normalize/Normalize.dll type=file
+C:\strawberry\perl\lib/auto/Win32/Win32.dll type=file
+C:\strawberry\perl\lib/auto/Win32API/File/File.dll type=file
+C:\strawberry\perl\lib/auto/Win32CORE/extralibs.ld type=file
+C:\strawberry\perl\lib/auto/attrs/attrs.dll type=file
+C:\strawberry\perl\lib/auto/mro/mro.dll type=file
+C:\strawberry\perl\lib/auto/re/re.dll type=file
+C:\strawberry\perl\lib/auto/sdbm/extralibs.ld type=file
+C:\strawberry\perl\lib/auto/threads/shared/shared.dll type=file
+C:\strawberry\perl\lib/auto/threads/threads.dll type=file
+C:\strawberry\perl\lib/autodie.pm type=file
+C:\strawberry\perl\lib/autodie/exception.pm type=file
+C:\strawberry\perl\lib/autodie/exception/system.pm type=file
+C:\strawberry\perl\lib/autodie/hints.pm type=file
+C:\strawberry\perl\lib/autouse.pm type=file
+C:\strawberry\perl\lib/base.pm type=file
+C:\strawberry\perl\lib/bigfloat.pl type=file
+C:\strawberry\perl\lib/bigint.pl type=file
+C:\strawberry\perl\lib/bigint.pm type=file
+C:\strawberry\perl\lib/bignum.pm type=file
+C:\strawberry\perl\lib/bigrat.pl type=file
+C:\strawberry\perl\lib/bigrat.pm type=file
+C:\strawberry\perl\lib/blib.pm type=file
+C:\strawberry\perl\lib/bytes.pm type=file
+C:\strawberry\perl\lib/bytes_heavy.pl type=file
+C:\strawberry\perl\lib/cacheout.pl type=file
+C:\strawberry\perl\lib/charnames.pm type=file
+C:\strawberry\perl\lib/complete.pl type=file
+C:\strawberry\perl\lib/constant.pm type=file
+C:\strawberry\perl\lib/ctime.pl type=file
+C:\strawberry\perl\lib/diagnostics.pm type=file
+C:\strawberry\perl\lib/dotsh.pl type=file
+C:\strawberry\perl\lib/dumpvar.pl type=file
+C:\strawberry\perl\lib/encoding.pm type=file
+C:\strawberry\perl\lib/encoding/warnings.pm type=file
+C:\strawberry\perl\lib/exceptions.pl type=file
+C:\strawberry\perl\lib/fastcwd.pl type=file
+C:\strawberry\perl\lib/feature.pm type=file
+C:\strawberry\perl\lib/fields.pm type=file
+C:\strawberry\perl\lib/filetest.pm type=file
+C:\strawberry\perl\lib/find.pl type=file
+C:\strawberry\perl\lib/finddepth.pl type=file
+C:\strawberry\perl\lib/flush.pl type=file
+C:\strawberry\perl\lib/getcwd.pl type=file
+C:\strawberry\perl\lib/getopt.pl type=file
+C:\strawberry\perl\lib/getopts.pl type=file
+C:\strawberry\perl\lib/hostname.pl type=file
+C:\strawberry\perl\lib/if.pm type=file
+C:\strawberry\perl\lib/importenv.pl type=file
+C:\strawberry\perl\lib/integer.pm type=file
+C:\strawberry\perl\lib/less.pm type=file
+C:\strawberry\perl\lib/lib.pm type=file
+C:\strawberry\perl\lib/locale.pm type=file
+C:\strawberry\perl\lib/look.pl type=file
+C:\strawberry\perl\lib/mro.pm type=file
+C:\strawberry\perl\lib/newgetopt.pl type=file
+C:\strawberry\perl\lib/open.pm type=file
+C:\strawberry\perl\lib/open2.pl type=file
+C:\strawberry\perl\lib/open3.pl type=file
+C:\strawberry\perl\lib/ops.pm type=file
+C:\strawberry\perl\lib/overload.pm type=file
+C:\strawberry\perl\lib/overload/numbers.pm type=file
+C:\strawberry\perl\lib/overloading.pm type=file
+C:\strawberry\perl\lib/parent.pm type=file
+C:\strawberry\perl\lib/perl5db.pl type=file
+C:\strawberry\perl\lib/pods/a2p.pod type=file
+C:\strawberry\perl\lib/pods/perl.pod type=file
+C:\strawberry\perl\lib/pods/perl5004delta.pod type=file
+C:\strawberry\perl\lib/pods/perl5005delta.pod type=file
+C:\strawberry\perl\lib/pods/perl5100delta.pod type=file
+C:\strawberry\perl\lib/pods/perl5101delta.pod type=file
+C:\strawberry\perl\lib/pods/perl561delta.pod type=file
+C:\strawberry\perl\lib/pods/perl56delta.pod type=file
+C:\strawberry\perl\lib/pods/perl570delta.pod type=file
+C:\strawberry\perl\lib/pods/perl571delta.pod type=file
+C:\strawberry\perl\lib/pods/perl572delta.pod type=file
+C:\strawberry\perl\lib/pods/perl573delta.pod type=file
+C:\strawberry\perl\lib/pods/perl581delta.pod type=file
+C:\strawberry\perl\lib/pods/perl582delta.pod type=file
+C:\strawberry\perl\lib/pods/perl583delta.pod type=file
+C:\strawberry\perl\lib/pods/perl584delta.pod type=file
+C:\strawberry\perl\lib/pods/perl585delta.pod type=file
+C:\strawberry\perl\lib/pods/perl586delta.pod type=file
+C:\strawberry\perl\lib/pods/perl587delta.pod type=file
+C:\strawberry\perl\lib/pods/perl588delta.pod type=file
+C:\strawberry\perl\lib/pods/perl589delta.pod type=file
+C:\strawberry\perl\lib/pods/perl58delta.pod type=file
+C:\strawberry\perl\lib/pods/perl590delta.pod type=file
+C:\strawberry\perl\lib/pods/perl591delta.pod type=file
+C:\strawberry\perl\lib/pods/perl592delta.pod type=file
+C:\strawberry\perl\lib/pods/perl593delta.pod type=file
+C:\strawberry\perl\lib/pods/perl594delta.pod type=file
+C:\strawberry\perl\lib/pods/perl595delta.pod type=file
+C:\strawberry\perl\lib/pods/perlaix.pod type=file
+C:\strawberry\perl\lib/pods/perlamiga.pod type=file
+C:\strawberry\perl\lib/pods/perlapi.pod type=file
+C:\strawberry\perl\lib/pods/perlapio.pod type=file
+C:\strawberry\perl\lib/pods/perlapollo.pod type=file
+C:\strawberry\perl\lib/pods/perlartistic.pod type=file
+C:\strawberry\perl\lib/pods/perlbeos.pod type=file
+C:\strawberry\perl\lib/pods/perlbook.pod type=file
+C:\strawberry\perl\lib/pods/perlboot.pod type=file
+C:\strawberry\perl\lib/pods/perlbot.pod type=file
+C:\strawberry\perl\lib/pods/perlbs2000.pod type=file
+C:\strawberry\perl\lib/pods/perlcall.pod type=file
+C:\strawberry\perl\lib/pods/perlce.pod type=file
+C:\strawberry\perl\lib/pods/perlcheat.pod type=file
+C:\strawberry\perl\lib/pods/perlclib.pod type=file
+C:\strawberry\perl\lib/pods/perlcn.pod type=file
+C:\strawberry\perl\lib/pods/perlcommunity.pod type=file
+C:\strawberry\perl\lib/pods/perlcompile.pod type=file
+C:\strawberry\perl\lib/pods/perlcygwin.pod type=file
+C:\strawberry\perl\lib/pods/perldata.pod type=file
+C:\strawberry\perl\lib/pods/perldbmfilter.pod type=file
+C:\strawberry\perl\lib/pods/perldebguts.pod type=file
+C:\strawberry\perl\lib/pods/perldebtut.pod type=file
+C:\strawberry\perl\lib/pods/perldebug.pod type=file
+C:\strawberry\perl\lib/pods/perldelta.pod type=file
+C:\strawberry\perl\lib/pods/perldgux.pod type=file
+C:\strawberry\perl\lib/pods/perldiag.pod type=file
+C:\strawberry\perl\lib/pods/perldoc.pod type=file
+C:\strawberry\perl\lib/pods/perldos.pod type=file
+C:\strawberry\perl\lib/pods/perldsc.pod type=file
+C:\strawberry\perl\lib/pods/perlebcdic.pod type=file
+C:\strawberry\perl\lib/pods/perlembed.pod type=file
+C:\strawberry\perl\lib/pods/perlepoc.pod type=file
+C:\strawberry\perl\lib/pods/perlfaq.pod type=file
+C:\strawberry\perl\lib/pods/perlfaq1.pod type=file
+C:\strawberry\perl\lib/pods/perlfaq2.pod type=file
+C:\strawberry\perl\lib/pods/perlfaq3.pod type=file
+C:\strawberry\perl\lib/pods/perlfaq4.pod type=file
+C:\strawberry\perl\lib/pods/perlfaq5.pod type=file
+C:\strawberry\perl\lib/pods/perlfaq6.pod type=file
+C:\strawberry\perl\lib/pods/perlfaq7.pod type=file
+C:\strawberry\perl\lib/pods/perlfaq8.pod type=file
+C:\strawberry\perl\lib/pods/perlfaq9.pod type=file
+C:\strawberry\perl\lib/pods/perlfilter.pod type=file
+C:\strawberry\perl\lib/pods/perlfork.pod type=file
+C:\strawberry\perl\lib/pods/perlform.pod type=file
+C:\strawberry\perl\lib/pods/perlfreebsd.pod type=file
+C:\strawberry\perl\lib/pods/perlfunc.pod type=file
+C:\strawberry\perl\lib/pods/perlglossary.pod type=file
+C:\strawberry\perl\lib/pods/perlgpl.pod type=file
+C:\strawberry\perl\lib/pods/perlguts.pod type=file
+C:\strawberry\perl\lib/pods/perlhack.pod type=file
+C:\strawberry\perl\lib/pods/perlhaiku.pod type=file
+C:\strawberry\perl\lib/pods/perlhist.pod type=file
+C:\strawberry\perl\lib/pods/perlhpux.pod type=file
+C:\strawberry\perl\lib/pods/perlhurd.pod type=file
+C:\strawberry\perl\lib/pods/perlintern.pod type=file
+C:\strawberry\perl\lib/pods/perlintro.pod type=file
+C:\strawberry\perl\lib/pods/perliol.pod type=file
+C:\strawberry\perl\lib/pods/perlipc.pod type=file
+C:\strawberry\perl\lib/pods/perlirix.pod type=file
+C:\strawberry\perl\lib/pods/perljp.pod type=file
+C:\strawberry\perl\lib/pods/perlko.pod type=file
+C:\strawberry\perl\lib/pods/perllexwarn.pod type=file
+C:\strawberry\perl\lib/pods/perllinux.pod type=file
+C:\strawberry\perl\lib/pods/perllocale.pod type=file
+C:\strawberry\perl\lib/pods/perllol.pod type=file
+C:\strawberry\perl\lib/pods/perlmachten.pod type=file
+C:\strawberry\perl\lib/pods/perlmacos.pod type=file
+C:\strawberry\perl\lib/pods/perlmacosx.pod type=file
+C:\strawberry\perl\lib/pods/perlmint.pod type=file
+C:\strawberry\perl\lib/pods/perlmod.pod type=file
+C:\strawberry\perl\lib/pods/perlmodinstall.pod type=file
+C:\strawberry\perl\lib/pods/perlmodlib.pod type=file
+C:\strawberry\perl\lib/pods/perlmodstyle.pod type=file
+C:\strawberry\perl\lib/pods/perlmpeix.pod type=file
+C:\strawberry\perl\lib/pods/perlmroapi.pod type=file
+C:\strawberry\perl\lib/pods/perlnetware.pod type=file
+C:\strawberry\perl\lib/pods/perlnewmod.pod type=file
+C:\strawberry\perl\lib/pods/perlnumber.pod type=file
+C:\strawberry\perl\lib/pods/perlobj.pod type=file
+C:\strawberry\perl\lib/pods/perlop.pod type=file
+C:\strawberry\perl\lib/pods/perlopenbsd.pod type=file
+C:\strawberry\perl\lib/pods/perlopentut.pod type=file
+C:\strawberry\perl\lib/pods/perlos2.pod type=file
+C:\strawberry\perl\lib/pods/perlos390.pod type=file
+C:\strawberry\perl\lib/pods/perlos400.pod type=file
+C:\strawberry\perl\lib/pods/perlothrtut.pod type=file
+C:\strawberry\perl\lib/pods/perlpacktut.pod type=file
+C:\strawberry\perl\lib/pods/perlperf.pod type=file
+C:\strawberry\perl\lib/pods/perlplan9.pod type=file
+C:\strawberry\perl\lib/pods/perlpod.pod type=file
+C:\strawberry\perl\lib/pods/perlpodspec.pod type=file
+C:\strawberry\perl\lib/pods/perlport.pod type=file
+C:\strawberry\perl\lib/pods/perlpragma.pod type=file
+C:\strawberry\perl\lib/pods/perlqnx.pod type=file
+C:\strawberry\perl\lib/pods/perlre.pod type=file
+C:\strawberry\perl\lib/pods/perlreapi.pod type=file
+C:\strawberry\perl\lib/pods/perlrebackslash.pod type=file
+C:\strawberry\perl\lib/pods/perlrecharclass.pod type=file
+C:\strawberry\perl\lib/pods/perlref.pod type=file
+C:\strawberry\perl\lib/pods/perlreftut.pod type=file
+C:\strawberry\perl\lib/pods/perlreguts.pod type=file
+C:\strawberry\perl\lib/pods/perlrepository.pod type=file
+C:\strawberry\perl\lib/pods/perlrequick.pod type=file
+C:\strawberry\perl\lib/pods/perlreref.pod type=file
+C:\strawberry\perl\lib/pods/perlretut.pod type=file
+C:\strawberry\perl\lib/pods/perlriscos.pod type=file
+C:\strawberry\perl\lib/pods/perlrun.pod type=file
+C:\strawberry\perl\lib/pods/perlsec.pod type=file
+C:\strawberry\perl\lib/pods/perlsolaris.pod type=file
+C:\strawberry\perl\lib/pods/perlstyle.pod type=file
+C:\strawberry\perl\lib/pods/perlsub.pod type=file
+C:\strawberry\perl\lib/pods/perlsymbian.pod type=file
+C:\strawberry\perl\lib/pods/perlsyn.pod type=file
+C:\strawberry\perl\lib/pods/perlthrtut.pod type=file
+C:\strawberry\perl\lib/pods/perltie.pod type=file
+C:\strawberry\perl\lib/pods/perltoc.pod type=file
+C:\strawberry\perl\lib/pods/perltodo.pod type=file
+C:\strawberry\perl\lib/pods/perltooc.pod type=file
+C:\strawberry\perl\lib/pods/perltoot.pod type=file
+C:\strawberry\perl\lib/pods/perltrap.pod type=file
+C:\strawberry\perl\lib/pods/perltru64.pod type=file
+C:\strawberry\perl\lib/pods/perltw.pod type=file
+C:\strawberry\perl\lib/pods/perlunicode.pod type=file
+C:\strawberry\perl\lib/pods/perlunifaq.pod type=file
+C:\strawberry\perl\lib/pods/perluniintro.pod type=file
+C:\strawberry\perl\lib/pods/perlunitut.pod type=file
+C:\strawberry\perl\lib/pods/perlutil.pod type=file
+C:\strawberry\perl\lib/pods/perluts.pod type=file
+C:\strawberry\perl\lib/pods/perlvar.pod type=file
+C:\strawberry\perl\lib/pods/perlvmesa.pod type=file
+C:\strawberry\perl\lib/pods/perlvms.pod type=file
+C:\strawberry\perl\lib/pods/perlvos.pod type=file
+C:\strawberry\perl\lib/pods/perlwin32.pod type=file
+C:\strawberry\perl\lib/pods/perlxs.pod type=file
+C:\strawberry\perl\lib/pods/perlxstut.pod type=file
+C:\strawberry\perl\lib/pwd.pl type=file
+C:\strawberry\perl\lib/re.pm type=file
+C:\strawberry\perl\lib/shellwords.pl type=file
+C:\strawberry\perl\lib/sigtrap.pm type=file
+C:\strawberry\perl\lib/sort.pm type=file
+C:\strawberry\perl\lib/stat.pl type=file
+C:\strawberry\perl\lib/strict.pm type=file
+C:\strawberry\perl\lib/subs.pm type=file
+C:\strawberry\perl\lib/syslog.pl type=file
+C:\strawberry\perl\lib/tainted.pl type=file
+C:\strawberry\perl\lib/termcap.pl type=file
+C:\strawberry\perl\lib/threads.pm type=file
+C:\strawberry\perl\lib/threads/shared.pm type=file
+C:\strawberry\perl\lib/timelocal.pl type=file
+C:\strawberry\perl\lib/unicore/ArabicShaping.txt type=file
+C:\strawberry\perl\lib/unicore/BidiMirroring.txt type=file
+C:\strawberry\perl\lib/unicore/Blocks.txt type=file
+C:\strawberry\perl\lib/unicore/Canonical.pl type=file
+C:\strawberry\perl\lib/unicore/CaseFolding.txt type=file
+C:\strawberry\perl\lib/unicore/CombiningClass.pl type=file
+C:\strawberry\perl\lib/unicore/CompositionExclusions.txt type=file
+C:\strawberry\perl\lib/unicore/Decomposition.pl type=file
+C:\strawberry\perl\lib/unicore/EastAsianWidth.txt type=file
+C:\strawberry\perl\lib/unicore/Exact.pl type=file
+C:\strawberry\perl\lib/unicore/HangulSyllableType.txt type=file
+C:\strawberry\perl\lib/unicore/Index.txt type=file
+C:\strawberry\perl\lib/unicore/Jamo.txt type=file
+C:\strawberry\perl\lib/unicore/LineBreak.txt type=file
+C:\strawberry\perl\lib/unicore/Name.pl type=file
+C:\strawberry\perl\lib/unicore/NameAliases.txt type=file
+C:\strawberry\perl\lib/unicore/NamedSequences.txt type=file
+C:\strawberry\perl\lib/unicore/NamedSqProv.txt type=file
+C:\strawberry\perl\lib/unicore/NamesList.txt type=file
+C:\strawberry\perl\lib/unicore/NormalizationCorrections.txt type=file
+C:\strawberry\perl\lib/unicore/PVA.pl type=file
+C:\strawberry\perl\lib/unicore/PropList.txt type=file
+C:\strawberry\perl\lib/unicore/PropValueAliases.txt type=file
+C:\strawberry\perl\lib/unicore/Properties type=file
+C:\strawberry\perl\lib/unicore/PropertyAliases.txt type=file
+C:\strawberry\perl\lib/unicore/ReadMe.txt type=file
+C:\strawberry\perl\lib/unicore/Scripts.txt type=file
+C:\strawberry\perl\lib/unicore/SpecialCasing.txt type=file
+C:\strawberry\perl\lib/unicore/StandardizedVariants.txt type=file
+C:\strawberry\perl\lib/unicore/To/Digit.pl type=file
+C:\strawberry\perl\lib/unicore/To/Fold.pl type=file
+C:\strawberry\perl\lib/unicore/To/Lower.pl type=file
+C:\strawberry\perl\lib/unicore/To/Title.pl type=file
+C:\strawberry\perl\lib/unicore/To/Upper.pl type=file
+C:\strawberry\perl\lib/unicore/UnicodeData.txt type=file
+C:\strawberry\perl\lib/unicore/lib/bc/AL.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/AN.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/B.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/BN.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/CS.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/EN.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/ES.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/ET.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/L.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/LRE.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/LRO.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/NSM.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/ON.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/PDF.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/R.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/RLE.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/RLO.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/S.pl type=file
+C:\strawberry\perl\lib/unicore/lib/bc/WS.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/A.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/AL.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/AR.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/ATAR.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/ATB.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/ATBL.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/B.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/BL.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/BR.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/DA.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/DB.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/IS.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/KV.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/L.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/NK.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/NR.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/OV.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/R.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ccc/VR.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Can.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Com.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Enc.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Fin.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Font.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Fra.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Init.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Iso.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Med.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Nar.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Nb.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Sml.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Sqr.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Sub.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Sup.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Vert.pl type=file
+C:\strawberry\perl\lib/unicore/lib/dt/Wide.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ea/A.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ea/F.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ea/H.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ea/N.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ea/Na.pl type=file
+C:\strawberry\perl\lib/unicore/lib/ea/W.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/AHex.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/ASCII.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Alnum.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Alpha.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Alphabet.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Any.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Arab.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Armn.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/AsciiHex.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Assigned.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Bali.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Beng.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/BidiC.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/BidiCont.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Blank.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Bopo.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Brai.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Bugi.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Buhd.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/C.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Canadian.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Cari.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Cc.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Cf.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Cham.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Cher.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Cn.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Cntrl.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Co.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Copt.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Cprt.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Cs.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Cyrl.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Dash.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Dash2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/DefaultI.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Dep.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Deprecat.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Deva.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Dia.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Diacriti.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Digit.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Dsrt.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Ethi.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Ext.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Extender.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Geor.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Glag.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Goth.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Graph.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Grek.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Gujr.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Guru.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Hang.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Hani.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Hano.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Hebr.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Hex.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/HexDigit.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Hira.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/HorizSpa.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Hyphen.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Hyphen2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/IDSB.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/IDST.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/IdContin.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/IdStart.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Ideo.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Ideograp.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/IdsBinar.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/IdsTrina.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InAegean.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InAlphab.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InAncie2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InAncie3.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InAncien.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InArabi2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InArabi3.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InArabi4.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InArabic.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InArmeni.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InArrows.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InBaline.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InBasicL.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InBengal.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InBlockE.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InBopom2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InBopomo.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InBoxDra.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InBraill.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InBugine.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InBuhid.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InByzant.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCarian.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCham.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCherok.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCjkCo2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCjkCo3.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCjkCo4.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCjkCom.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCjkRad.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCjkStr.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCjkSym.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCjkUn2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCjkUn3.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCjkUni.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCombi2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCombi3.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCombi4.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCombin.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InContro.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCoptic.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCounti.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCunei2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCuneif.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCurren.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCyprio.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCyril2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCyril3.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCyril4.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InCyrill.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InDesere.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InDevana.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InDingba.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InDomino.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InEnclo2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InEnclos.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InEthio2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InEthio3.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InEthiop.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InGenera.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InGeomet.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InGeorg2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InGeorgi.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InGlagol.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InGothic.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InGreekA.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InGreekE.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InGujara.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InGurmuk.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InHalfwi.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InHangu2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InHangu3.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InHangul.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InHanuno.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InHebrew.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InHighPr.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InHighSu.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InHiraga.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InIdeogr.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InIpaExt.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InKanbun.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InKangxi.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InKannad.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InKatak2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InKataka.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InKayahL.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InKharos.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InKhmer.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InKhmerS.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLao.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLatin1.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLatin2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLatin3.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLatin4.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLatin5.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLatinE.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLepcha.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLetter.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLimbu.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLinea2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLinear.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLowSur.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLycian.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InLydian.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InMahjon.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InMalaya.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InMathe2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InMathem.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InMisce2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InMisce3.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InMisce4.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InMisce5.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InMiscel.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InModifi.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InMongol.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InMusica.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InMyanma.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InNewTai.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InNko.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InNumber.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InOgham.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InOlChik.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InOldIta.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InOldPer.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InOptica.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InOriya.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InOsmany.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InPhagsP.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InPhaist.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InPhoeni.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InPhone2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InPhonet.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InPrivat.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InRejang.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InRunic.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSauras.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InShavia.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSinhal.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSmallF.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSpacin.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSpecia.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSundan.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSupers.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSuppl2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSuppl3.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSuppl4.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSuppl5.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSuppl6.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSupple.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSyloti.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InSyriac.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InTagalo.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InTagban.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InTags.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InTaiLe.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InTaiXua.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InTamil.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InTelugu.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InThaana.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InThai.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InTibeta.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InTifina.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InUgarit.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InUnifie.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InVai.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InVaria2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InVariat.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InVertic.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InYiRadi.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InYiSyll.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/InYijing.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/JoinC.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/JoinCont.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Kana.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/KayahLi.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Khar.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Khmr.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Knda.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/L.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/LC.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/LOE.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Laoo.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Latn.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Lepc.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Limb.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/LinearB.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Ll.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Lm.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Lo.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/LogicalO.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Lower.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Lowercas.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Lt.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Lu.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Lyci.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Lydi.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/M.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Math.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Mc.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Me.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Mlym.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Mn.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Mong.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Mymr.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/N.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/NChar.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Nd.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/NewTaiLu.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Nkoo.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Nl.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/No.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Nonchara.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OAlpha.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/ODI.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OGrExt.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OIDC.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OIDS.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OLower.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OMath.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OUpper.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Ogam.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OlChiki.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OldItali.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OldPersi.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Orya.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Osma.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OtherAlp.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OtherDef.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OtherGra.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OtherIdC.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OtherIdS.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OtherLow.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OtherMat.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/OtherUpp.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/P.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PatSyn.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PatWS.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PatternS.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PatternW.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Pc.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Pd.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Pe.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PerlSpac.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PerlWord.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Pf.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PhagsPa.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Phnx.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Pi.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Po.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PosixAln.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PosixAlp.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PosixBla.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PosixCnt.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PosixDig.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PosixGra.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PosixLow.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PosixPri.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PosixPun.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PosixSpa.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/PosixUpp.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Print.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Ps.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Punct.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/QMark.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Qaai.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Quotatio.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Radical.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Radical2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Rjng.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Runr.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/S.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/SD.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/STerm.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Saur.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Sc.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Shaw.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Sinh.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Sk.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Sm.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/So.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/SoftDott.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Space.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/SpacePer.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Sterm2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Sund.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/SylotiNa.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Syrc.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Tagb.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/TaiLe.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Taml.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Telu.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Term.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Terminal.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Tfng.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Tglg.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Thaa.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Thai.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Tibt.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Title.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/UIdeo.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Ugar.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/UnifiedI.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Upper.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Uppercas.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/VS.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Vaii.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Variatio.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/VertSpac.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/WSpace.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/WhiteSpa.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Word.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/XDigit.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Xsux.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Yiii.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Z.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Zl.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Zp.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Zs.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/Zyyy.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/_CanonDC.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/_CaseIgn.pl type=file
+C:\strawberry\perl\lib/unicore/lib/gc_sc/_CombAbo.pl type=file
+C:\strawberry\perl\lib/unicore/lib/hst/L.pl type=file
+C:\strawberry\perl\lib/unicore/lib/hst/LV.pl type=file
+C:\strawberry\perl\lib/unicore/lib/hst/LVT.pl type=file
+C:\strawberry\perl\lib/unicore/lib/hst/T.pl type=file
+C:\strawberry\perl\lib/unicore/lib/hst/V.pl type=file
+C:\strawberry\perl\lib/unicore/lib/jt/C.pl type=file
+C:\strawberry\perl\lib/unicore/lib/jt/D.pl type=file
+C:\strawberry\perl\lib/unicore/lib/jt/R.pl type=file
+C:\strawberry\perl\lib/unicore/lib/jt/U.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/AI.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/AL.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/B2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/BA.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/BB.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/BK.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/CB.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/CL.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/CM.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/CR.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/EX.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/GL.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/H2.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/H3.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/HY.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/ID.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/IN.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/IS.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/JL.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/JT.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/JV.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/LF.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/NL.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/NS.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/NU.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/OP.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/PO.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/PR.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/QU.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/SA.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/SG.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/SP.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/SY.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/WJ.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/XX.pl type=file
+C:\strawberry\perl\lib/unicore/lib/lb/ZW.pl type=file
+C:\strawberry\perl\lib/unicore/lib/nt/De.pl type=file
+C:\strawberry\perl\lib/unicore/lib/nt/Di.pl type=file
+C:\strawberry\perl\lib/unicore/lib/nt/Nu.pl type=file
+C:\strawberry\perl\lib/unicore/mktables type=file
+C:\strawberry\perl\lib/unicore/mktables.lst type=file
+C:\strawberry\perl\lib/unicore/version type=file
+C:\strawberry\perl\lib/utf8.pm type=file
+C:\strawberry\perl\lib/utf8_heavy.pl type=file
+C:\strawberry\perl\lib/validate.pl type=file
+C:\strawberry\perl\lib/vars.pm type=file
+C:\strawberry\perl\lib/version.pm type=file
+C:\strawberry\perl\lib/version.pod type=file
+C:\strawberry\perl\lib/version/Internals.pod type=file
+C:\strawberry\perl\lib/vmsish.pm type=file
+C:\strawberry\perl\lib/warnings.pm type=file
+C:\strawberry\perl\lib/warnings/register.pm type=file
diff --git a/Master/tlpkg/tlperl.straw/lib/App/Cpan.pm b/Master/tlpkg/tlperl.straw/lib/App/Cpan.pm
new file mode 100755
index 00000000000..cfc12908e52
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/App/Cpan.pm
@@ -0,0 +1,1067 @@
+package App::Cpan;
+use strict;
+use warnings;
+use vars qw($VERSION);
+
+$VERSION = '1.5701';
+
+=head1 NAME
+
+App::Cpan - easily interact with CPAN from the command line
+
+=head1 SYNOPSIS
+
+ # with arguments and no switches, installs specified modules
+ cpan module_name [ module_name ... ]
+
+ # with switches, installs modules with extra behavior
+ cpan [-cfFimt] module_name [ module_name ... ]
+
+ # use local::lib
+ cpan -l module_name [ module_name ... ]
+
+ # with just the dot, install from the distribution in the
+ # current directory
+ cpan .
+
+ # without arguments, starts CPAN.pm shell
+ cpan
+
+ # without arguments, but some switches
+ cpan [-ahruvACDLO]
+
+=head1 DESCRIPTION
+
+This script provides a command interface (not a shell) to CPAN. At the
+moment it uses CPAN.pm to do the work, but it is not a one-shot command
+runner for CPAN.pm.
+
+=head2 Options
+
+=over 4
+
+=item -a
+
+Creates a CPAN.pm autobundle with CPAN::Shell->autobundle.
+
+=item -A module [ module ... ]
+
+Shows the primary maintainers for the specified modules.
+
+=item -c module
+
+Runs a `make clean` in the specified module's directories.
+
+=item -C module [ module ... ]
+
+Show the F<Changes> files for the specified modules
+
+=item -D module [ module ... ]
+
+Show the module details. This prints one line for each out-of-date module
+(meaning, modules locally installed but have newer versions on CPAN).
+Each line has three columns: module name, local version, and CPAN
+version.
+
+=item -f
+
+Force the specified action, when it normally would have failed. Use this
+to install a module even if its tests fail. When you use this option,
+-i is not optional for installing a module when you need to force it:
+
+ % cpan -f -i Module::Foo
+
+=item -F
+
+Turn off CPAN.pm's attempts to lock anything. You should be careful with
+this since you might end up with multiple scripts trying to muck in the
+same directory. This isn't so much of a concern if you're loading a special
+config with C<-j>, and that config sets up its own work directories.
+
+=item -g module [ module ... ]
+
+Downloads to the current directory the latest distribution of the module.
+
+=item -G module [ module ... ]
+
+UNIMPLEMENTED
+
+Download to the current directory the latest distribution of the
+modules, unpack each distribution, and create a git repository for each
+distribution.
+
+If you want this feature, check out Yanick Champoux's C<Git::CPAN::Patch>
+distribution.
+
+=item -h
+
+Print a help message and exit. When you specify C<-h>, it ignores all
+of the other options and arguments.
+
+=item -i
+
+Install the specified modules.
+
+=item -j Config.pm
+
+Load the file that has the CPAN configuration data. This should have the
+same format as the standard F<CPAN/Config.pm> file, which defines
+C<$CPAN::Config> as an anonymous hash.
+
+=item -J
+
+Dump the configuration in the same format that CPAN.pm uses. This is useful
+for checking the configuration as well as using the dump as a starting point
+for a new, custom configuration.
+
+=item -l
+
+Use C<local::lib>.
+
+=item -L author [ author ... ]
+
+List the modules by the specified authors.
+
+=item -m
+
+Make the specified modules.
+
+=item -O
+
+Show the out-of-date modules.
+
+=item -t
+
+Run a `make test` on the specified modules.
+
+=item -r
+
+Recompiles dynamically loaded modules with CPAN::Shell->recompile.
+
+=item -u
+
+Upgrade all installed modules. Blindly doing this can really break things,
+so keep a backup.
+
+=item -v
+
+Print the script version and CPAN.pm version then exit.
+
+=back
+
+=head2 Examples
+
+ # print a help message
+ cpan -h
+
+ # print the version numbers
+ cpan -v
+
+ # create an autobundle
+ cpan -a
+
+ # recompile modules
+ cpan -r
+
+ # upgrade all installed modules
+ cpan -u
+
+ # install modules ( sole -i is optional )
+ cpan -i Netscape::Booksmarks Business::ISBN
+
+ # force install modules ( must use -i )
+ cpan -fi CGI::Minimal URI
+
+
+=head2 Methods
+
+=over 4
+
+=cut
+
+use autouse Carp => qw(carp croak cluck);
+use CPAN ();
+use autouse Cwd => qw(cwd);
+use autouse 'Data::Dumper' => qw(Dumper);
+use File::Spec::Functions;
+use File::Basename;
+
+use Getopt::Std;
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# Internal constants
+use constant TRUE => 1;
+use constant FALSE => 0;
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# The return values
+use constant HEY_IT_WORKED => 0;
+use constant I_DONT_KNOW_WHAT_HAPPENED => 1; # 0b0000_0001
+use constant ITS_NOT_MY_FAULT => 2;
+use constant THE_PROGRAMMERS_AN_IDIOT => 4;
+use constant A_MODULE_FAILED_TO_INSTALL => 8;
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# set up the order of options that we layer over CPAN::Shell
+BEGIN { # most of this should be in methods
+use vars qw( @META_OPTIONS $Default %CPAN_METHODS @CPAN_OPTIONS @option_order
+ %Method_table %Method_table_index );
+
+@META_OPTIONS = qw( h v g G C A D O l L a r j: J );
+
+$Default = 'default';
+
+%CPAN_METHODS = ( # map switches to method names in CPAN::Shell
+ $Default => 'install',
+ 'c' => 'clean',
+ 'f' => 'force',
+ 'i' => 'install',
+ 'm' => 'make',
+ 't' => 'test',
+ 'u' => 'upgrade',
+ );
+@CPAN_OPTIONS = grep { $_ ne $Default } sort keys %CPAN_METHODS;
+
+@option_order = ( @META_OPTIONS, @CPAN_OPTIONS );
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# map switches to the subroutines in this script, along with other information.
+# use this stuff instead of hard-coded indices and values
+sub NO_ARGS () { 0 }
+sub ARGS () { 1 }
+sub GOOD_EXIT () { 0 }
+
+%Method_table = (
+# key => [ sub ref, takes args?, exit value, description ]
+
+ # options that do their thing first, then exit
+ h => [ \&_print_help, NO_ARGS, GOOD_EXIT, 'Printing help' ],
+ v => [ \&_print_version, NO_ARGS, GOOD_EXIT, 'Printing version' ],
+
+ # options that affect other options
+ j => [ \&_load_config, ARGS, GOOD_EXIT, 'Use specified config file' ],
+ J => [ \&_dump_config, NO_ARGS, GOOD_EXIT, 'Dump configuration to stdout' ],
+ F => [ \&_lock_lobotomy, NO_ARGS, GOOD_EXIT, 'Turn off CPAN.pm lock files' ],
+
+ # options that do their one thing
+ g => [ \&_download, NO_ARGS, GOOD_EXIT, 'Download the latest distro' ],
+ G => [ \&_gitify, NO_ARGS, GOOD_EXIT, 'Down and gitify the latest distro' ],
+
+ C => [ \&_show_Changes, ARGS, GOOD_EXIT, 'Showing Changes file' ],
+ A => [ \&_show_Author, ARGS, GOOD_EXIT, 'Showing Author' ],
+ D => [ \&_show_Details, ARGS, GOOD_EXIT, 'Showing Details' ],
+ O => [ \&_show_out_of_date, NO_ARGS, GOOD_EXIT, 'Showing Out of date' ],
+
+ l => [ \&_list_all_mods, NO_ARGS, GOOD_EXIT, 'Listing all modules' ],
+
+ L => [ \&_show_author_mods, ARGS, GOOD_EXIT, 'Showing author mods' ],
+ a => [ \&_create_autobundle, NO_ARGS, GOOD_EXIT, 'Creating autobundle' ],
+ r => [ \&_recompile, NO_ARGS, GOOD_EXIT, 'Recompiling' ],
+ u => [ \&_upgrade, NO_ARGS, GOOD_EXIT, 'Running `make test`' ],
+
+ c => [ \&_default, ARGS, GOOD_EXIT, 'Running `make clean`' ],
+ f => [ \&_default, ARGS, GOOD_EXIT, 'Installing with force' ],
+ i => [ \&_default, ARGS, GOOD_EXIT, 'Running `make install`' ],
+ 'm' => [ \&_default, ARGS, GOOD_EXIT, 'Running `make`' ],
+ t => [ \&_default, ARGS, GOOD_EXIT, 'Running `make test`' ],
+
+ );
+
+%Method_table_index = (
+ code => 0,
+ takes_args => 1,
+ exit_value => 2,
+ description => 3,
+ );
+}
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# finally, do some argument processing
+
+sub _stupid_interface_hack_for_non_rtfmers
+ {
+ no warnings 'uninitialized';
+ shift @ARGV if( $ARGV[0] eq 'install' and @ARGV > 1 )
+ }
+
+sub _process_options
+ {
+ my %options;
+
+ # if no arguments, just drop into the shell
+ if( 0 == @ARGV ) { CPAN::shell(); exit 0 }
+ else
+ {
+ Getopt::Std::getopts(
+ join( '', @option_order ), \%options );
+ \%options;
+ }
+ }
+
+sub _process_setup_options
+ {
+ my( $class, $options ) = @_;
+
+ if( $options->{j} )
+ {
+ $Method_table{j}[ $Method_table_index{code} ]->( $options->{j} );
+ delete $options->{j};
+ }
+ else
+ {
+ # this is what CPAN.pm would do otherwise
+ CPAN::HandleConfig->load(
+ # be_silent => 1, # candidate to be ripped out forever
+ write_file => 0,
+ );
+ }
+
+ if( $options->{F} )
+ {
+ $Method_table{F}[ $Method_table_index{code} ]->( $options->{F} );
+ delete $options->{F};
+ }
+
+ my $option_count = grep { $options->{$_} } @option_order;
+ no warnings 'uninitialized';
+ $option_count -= $options->{'f'}; # don't count force
+
+ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+ # if there are no options, set -i (this line fixes RT ticket 16915)
+ $options->{i}++ unless $option_count;
+ }
+
+
+=item run()
+
+Just do it.
+
+The C<run> method returns 0 on success and a postive number on
+failure. See the section on EXIT CODES for details on the values.
+
+=cut
+
+my $logger;
+
+sub run
+ {
+ my $class = shift;
+
+ my $return_value = HEY_IT_WORKED; # assume that things will work
+
+ $logger = $class->_init_logger;
+ $logger->debug( "Using logger from @{[ref $logger]}" );
+
+ $class->_hook_into_CPANpm_report;
+ $logger->debug( "Hooked into output" );
+
+ $class->_stupid_interface_hack_for_non_rtfmers;
+ $logger->debug( "Patched cargo culting" );
+
+ my $options = $class->_process_options;
+ $logger->debug( "Options are @{[Dumper($options)]}" );
+
+ $class->_process_setup_options( $options );
+
+ OPTION: foreach my $option ( @option_order )
+ {
+ next unless $options->{$option};
+
+ my( $sub, $takes_args, $description ) =
+ map { $Method_table{$option}[ $Method_table_index{$_} ] }
+ qw( code takes_args );
+
+ unless( ref $sub eq ref sub {} )
+ {
+ $return_value = THE_PROGRAMMERS_AN_IDIOT;
+ last OPTION;
+ }
+
+ $logger->info( "$description -- ignoring other arguments" )
+ if( @ARGV && ! $takes_args );
+
+ $return_value = $sub->( \ @ARGV, $options );
+
+ last;
+ }
+
+ return $return_value;
+ }
+
+{
+package Local::Null::Logger;
+
+sub new { bless \ my $x, $_[0] }
+sub AUTOLOAD { shift; print "NullLogger: ", @_, $/ if $ENV{CPAN_NULL_LOGGER} }
+sub DESTROY { 1 }
+}
+
+sub _init_logger
+ {
+ my $log4perl_loaded = eval "require Log::Log4perl; 1";
+
+ unless( $log4perl_loaded )
+ {
+ $logger = Local::Null::Logger->new;
+ return $logger;
+ }
+
+ my $LEVEL = $ENV{CPANSCRIPT_LOGLEVEL} || 'INFO';
+
+ Log::Log4perl::init( \ <<"HERE" );
+log4perl.rootLogger=$LEVEL, A1
+log4perl.appender.A1=Log::Log4perl::Appender::Screen
+log4perl.appender.A1.layout=PatternLayout
+log4perl.appender.A1.layout.ConversionPattern=%m%n
+HERE
+
+ $logger = Log::Log4perl->get_logger( 'App::Cpan' );
+ }
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+sub _default
+ {
+ my( $args, $options ) = @_;
+
+ my $switch = '';
+
+ # choose the option that we're going to use
+ # we'll deal with 'f' (force) later, so skip it
+ foreach my $option ( @CPAN_OPTIONS )
+ {
+ next if $option eq 'f';
+ next unless $options->{$option};
+ $switch = $option;
+ last;
+ }
+
+ # 1. with no switches, but arguments, use the default switch (install)
+ # 2. with no switches and no args, start the shell
+ # 3. With a switch but no args, die! These switches need arguments.
+ if( not $switch and @$args ) { $switch = $Default; }
+ elsif( not $switch and not @$args ) { return CPAN::shell() }
+ elsif( $switch and not @$args )
+ { die "Nothing to $CPAN_METHODS{$switch}!\n"; }
+
+ # Get and check the method from CPAN::Shell
+ my $method = $CPAN_METHODS{$switch};
+ die "CPAN.pm cannot $method!\n" unless CPAN::Shell->can( $method );
+
+ # call the CPAN::Shell method, with force if specified
+ my $action = do {
+ if( $options->{f} ) { sub { CPAN::Shell->force( $method, @_ ) } }
+ else { sub { CPAN::Shell->$method( @_ ) } }
+ };
+
+ # How do I handle exit codes for multiple arguments?
+ my $errors = 0;
+
+ foreach my $arg ( @$args )
+ {
+ _clear_cpanpm_output();
+ $action->( $arg );
+
+ $errors += defined _cpanpm_output_indicates_failure();
+ }
+
+ $errors ? I_DONT_KNOW_WHAT_HAPPENED : HEY_IT_WORKED;
+ }
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+=for comment
+
+CPAN.pm sends all the good stuff either to STDOUT. I have to intercept
+that output so I can find out what happened.
+
+=cut
+
+{
+my $scalar = '';
+
+sub _hook_into_CPANpm_report
+ {
+ no warnings 'redefine';
+
+ *CPAN::Shell::myprint = sub {
+ my($self,$what) = @_;
+ $scalar .= $what if defined $what;
+ $self->print_ornamented($what,
+ $CPAN::Config->{colorize_print}||'bold blue on_white',
+ );
+ };
+
+ *CPAN::Shell::mywarn = sub {
+ my($self,$what) = @_;
+ $scalar .= $what if defined $what;
+ $self->print_ornamented($what,
+ $CPAN::Config->{colorize_warn}||'bold red on_white'
+ );
+ };
+
+ }
+
+sub _clear_cpanpm_output { $scalar = '' }
+
+sub _get_cpanpm_output { $scalar }
+
+BEGIN {
+my @skip_lines = (
+ qr/^\QWarning \(usually harmless\)/,
+ qr/\bwill not store persistent state\b/,
+ qr(//hint//),
+ qr/^\s+reports\s+/,
+ );
+
+sub _get_cpanpm_last_line
+ {
+ open my($fh), "<", \ $scalar;
+
+ my @lines = <$fh>;
+
+ # This is a bit ugly. Once we examine a line, we have to
+ # examine the line before it and go through all of the same
+ # regexes. I could do something fancy, but this works.
+ REGEXES: {
+ foreach my $regex ( @skip_lines )
+ {
+ if( $lines[-1] =~ m/$regex/ )
+ {
+ pop @lines;
+ redo REGEXES; # we have to go through all of them for every line!
+ }
+ }
+ }
+
+ $logger->debug( "Last interesting line of CPAN.pm output is:\n\t$lines[-1]" );
+
+ $lines[-1];
+ }
+}
+
+BEGIN {
+my $epic_fail_words = join '|',
+ qw( Error stop(?:ping)? problems force not unsupported fail(?:ed)? );
+
+sub _cpanpm_output_indicates_failure
+ {
+ my $last_line = _get_cpanpm_last_line();
+
+ my $result = $last_line =~ /\b(?:$epic_fail_words)\b/i;
+ $result || ();
+ }
+}
+
+sub _cpanpm_output_indicates_success
+ {
+ my $last_line = _get_cpanpm_last_line();
+
+ my $result = $last_line =~ /\b(?:\s+-- OK|PASS)\b/;
+ $result || ();
+ }
+
+sub _cpanpm_output_is_vague
+ {
+ return FALSE if
+ _cpanpm_output_indicates_failure() ||
+ _cpanpm_output_indicates_success();
+
+ return TRUE;
+ }
+
+}
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+sub _print_help
+ {
+ $logger->info( "Use perldoc to read the documentation" );
+ exec "perldoc $0";
+ }
+
+sub _print_version
+ {
+ $logger->info(
+ "$0 script version $VERSION, CPAN.pm version " . CPAN->VERSION );
+
+ return HEY_IT_WORKED;
+ }
+
+sub _create_autobundle
+ {
+ $logger->info(
+ "Creating autobundle in $CPAN::Config->{cpan_home}/Bundle" );
+
+ CPAN::Shell->autobundle;
+
+ return HEY_IT_WORKED;
+ }
+
+sub _recompile
+ {
+ $logger->info( "Recompiling dynamically-loaded extensions" );
+
+ CPAN::Shell->recompile;
+
+ return HEY_IT_WORKED;
+ }
+
+sub _upgrade
+ {
+ $logger->info( "Upgrading all modules" );
+
+ CPAN::Shell->upgrade();
+
+ return HEY_IT_WORKED;
+ }
+
+sub _load_config # -j
+ {
+ my $file = shift || '';
+
+ # should I clear out any existing config here?
+ $CPAN::Config = {};
+ delete $INC{'CPAN/Config.pm'};
+ croak( "Config file [$file] does not exist!\n" ) unless -e $file;
+
+ my $rc = eval "require '$file'";
+
+ # CPAN::HandleConfig::require_myconfig_or_config looks for this
+ $INC{'CPAN/MyConfig.pm'} = 'fake out!';
+
+ # CPAN::HandleConfig::load looks for this
+ $CPAN::Config_loaded = 'fake out';
+
+ croak( "Could not load [$file]: $@\n") unless $rc;
+
+ return HEY_IT_WORKED;
+ }
+
+sub _dump_config
+ {
+ my $args = shift;
+ require Data::Dumper;
+
+ my $fh = $args->[0] || \*STDOUT;
+
+ my $dd = Data::Dumper->new(
+ [$CPAN::Config],
+ ['$CPAN::Config']
+ );
+
+ print $fh $dd->Dump, "\n1;\n__END__\n";
+
+ return HEY_IT_WORKED;
+ }
+
+sub _lock_lobotomy
+ {
+ no warnings 'redefine';
+
+ *CPAN::_flock = sub { 1 };
+ *CPAN::checklock = sub { 1 };
+
+ return HEY_IT_WORKED;
+ }
+
+sub _download
+ {
+ my $args = shift;
+
+ local $CPAN::DEBUG = 1;
+
+ my %paths;
+
+ foreach my $module ( @$args )
+ {
+ $logger->info( "Checking $module" );
+ my $path = CPAN::Shell->expand( "Module", $module )->cpan_file;
+
+ $logger->debug( "Inst file would be $path\n" );
+
+ $paths{$module} = _get_file( _make_path( $path ) );
+ }
+
+ return \%paths;
+ }
+
+sub _make_path { join "/", qw(authors id), $_[0] }
+
+sub _get_file
+ {
+ my $path = shift;
+
+ my $loaded = eval "require LWP::Simple; 1;";
+ croak "You need LWP::Simple to use features that fetch files from CPAN\n"
+ unless $loaded;
+
+ my $file = substr $path, rindex( $path, '/' ) + 1;
+ my $store_path = catfile( cwd(), $file );
+ $logger->debug( "Store path is $store_path" );
+
+ foreach my $site ( @{ $CPAN::Config->{urllist} } )
+ {
+ my $fetch_path = join "/", $site, $path;
+ $logger->debug( "Trying $fetch_path" );
+ last if LWP::Simple::getstore( $fetch_path, $store_path );
+ }
+
+ return $store_path;
+ }
+
+sub _gitify
+ {
+ my $args = shift;
+
+ my $loaded = eval "require Archive::Extract; 1;";
+ croak "You need Archive::Extract to use features that gitify distributions\n"
+ unless $loaded;
+
+ my $starting_dir = cwd();
+
+ foreach my $module ( @$args )
+ {
+ $logger->info( "Checking $module" );
+ my $path = CPAN::Shell->expand( "Module", $module )->cpan_file;
+
+ my $store_paths = _download( [ $module ] );
+ $logger->debug( "gitify Store path is $store_paths->{$module}" );
+ my $dirname = dirname( $store_paths->{$module} );
+
+ my $ae = Archive::Extract->new( archive => $store_paths->{$module} );
+ $ae->extract( to => $dirname );
+
+ chdir $ae->extract_path;
+
+ my $git = $ENV{GIT_COMMAND} || '/usr/local/bin/git';
+ croak "Could not find $git" unless -e $git;
+ croak "$git is not executable" unless -x $git;
+
+ # can we do this in Pure Perl?
+ system( $git, 'init' );
+ system( $git, qw( add . ) );
+ system( $git, qw( commit -a -m ), 'initial import' );
+ }
+
+ chdir $starting_dir;
+
+ return HEY_IT_WORKED;
+ }
+
+sub _show_Changes
+ {
+ my $args = shift;
+
+ foreach my $arg ( @$args )
+ {
+ $logger->info( "Checking $arg\n" );
+
+ my $module = eval { CPAN::Shell->expand( "Module", $arg ) };
+ my $out = _get_cpanpm_output();
+
+ next unless eval { $module->inst_file };
+ #next if $module->uptodate;
+
+ ( my $id = $module->id() ) =~ s/::/\-/;
+
+ my $url = "http://search.cpan.org/~" . lc( $module->userid ) . "/" .
+ $id . "-" . $module->cpan_version() . "/";
+
+ #print "URL: $url\n";
+ _get_changes_file($url);
+ }
+
+ return HEY_IT_WORKED;
+ }
+
+sub _get_changes_file
+ {
+ croak "Reading Changes files requires LWP::Simple and URI\n"
+ unless eval "require LWP::Simple; require URI; 1";
+
+ my $url = shift;
+
+ my $content = LWP::Simple::get( $url );
+ $logger->info( "Got $url ..." ) if defined $content;
+ #print $content;
+
+ my( $change_link ) = $content =~ m|<a href="(.*?)">Changes</a>|gi;
+
+ my $changes_url = URI->new_abs( $change_link, $url );
+ $logger->debug( "Change link is: $changes_url" );
+
+ my $changes = LWP::Simple::get( $changes_url );
+
+ print $changes;
+
+ return HEY_IT_WORKED;
+ }
+
+sub _show_Author
+ {
+ my $args = shift;
+
+ foreach my $arg ( @$args )
+ {
+ my $module = CPAN::Shell->expand( "Module", $arg );
+ unless( $module )
+ {
+ $logger->info( "Didn't find a $arg module, so no author!" );
+ next;
+ }
+
+ my $author = CPAN::Shell->expand( "Author", $module->userid );
+
+ next unless $module->userid;
+
+ printf "%-25s %-8s %-25s %s\n",
+ $arg, $module->userid, $author->email, $author->fullname;
+ }
+
+ return HEY_IT_WORKED;
+ }
+
+sub _show_Details
+ {
+ my $args = shift;
+
+ foreach my $arg ( @$args )
+ {
+ my $module = CPAN::Shell->expand( "Module", $arg );
+ my $author = CPAN::Shell->expand( "Author", $module->userid );
+
+ next unless $module->userid;
+
+ print "$arg\n", "-" x 73, "\n\t";
+ print join "\n\t",
+ $module->description ? $module->description : "(no description)",
+ $module->cpan_file,
+ $module->inst_file,
+ 'Installed: ' . $module->inst_version,
+ 'CPAN: ' . $module->cpan_version . ' ' .
+ ($module->uptodate ? "" : "Not ") . "up to date",
+ $author->fullname . " (" . $module->userid . ")",
+ $author->email;
+ print "\n\n";
+
+ }
+
+ return HEY_IT_WORKED;
+ }
+
+sub _show_out_of_date
+ {
+ my @modules = CPAN::Shell->expand( "Module", "/./" );
+
+ printf "%-40s %6s %6s\n", "Module Name", "Local", "CPAN";
+ print "-" x 73, "\n";
+
+ foreach my $module ( @modules )
+ {
+ next unless $module->inst_file;
+ next if $module->uptodate;
+ printf "%-40s %.4f %.4f\n",
+ $module->id,
+ $module->inst_version ? $module->inst_version : '',
+ $module->cpan_version;
+ }
+
+ return HEY_IT_WORKED;
+ }
+
+sub _show_author_mods
+ {
+ my $args = shift;
+
+ my %hash = map { lc $_, 1 } @$args;
+
+ my @modules = CPAN::Shell->expand( "Module", "/./" );
+
+ foreach my $module ( @modules )
+ {
+ next unless exists $hash{ lc $module->userid };
+ print $module->id, "\n";
+ }
+
+ return HEY_IT_WORKED;
+ }
+
+sub _list_all_mods
+ {
+ require File::Find;
+
+ my $args = shift;
+
+
+ my $fh = \*STDOUT;
+
+ INC: foreach my $inc ( @INC )
+ {
+ my( $wanted, $reporter ) = _generator();
+ File::Find::find( { wanted => $wanted }, $inc );
+
+ my $count = 0;
+ FILE: foreach my $file ( @{ $reporter->() } )
+ {
+ my $version = _parse_version_safely( $file );
+
+ my $module_name = _path_to_module( $inc, $file );
+ next FILE unless defined $module_name;
+
+ print $fh "$module_name\t$version\n";
+
+ #last if $count++ > 5;
+ }
+ }
+
+ return HEY_IT_WORKED;
+ }
+
+sub _generator
+ {
+ my @files = ();
+
+ sub { push @files,
+ File::Spec->canonpath( $File::Find::name )
+ if m/\A\w+\.pm\z/ },
+ sub { \@files },
+ }
+
+sub _parse_version_safely # stolen from PAUSE's mldistwatch, but refactored
+ {
+ my( $file ) = @_;
+
+ local $/ = "\n";
+ local $_; # don't mess with the $_ in the map calling this
+
+ return unless open FILE, "<$file";
+
+ my $in_pod = 0;
+ my $version;
+ while( <FILE> )
+ {
+ chomp;
+ $in_pod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $in_pod;
+ next if $in_pod || /^\s*#/;
+
+ next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
+ my( $sigil, $var ) = ( $1, $2 );
+
+ $version = _eval_version( $_, $sigil, $var );
+ last;
+ }
+ close FILE;
+
+ return 'undef' unless defined $version;
+
+ return $version;
+ }
+
+sub _eval_version
+ {
+ my( $line, $sigil, $var ) = @_;
+
+ my $eval = qq{
+ package ExtUtils::MakeMaker::_version;
+
+ local $sigil$var;
+ \$$var=undef; do {
+ $line
+ }; \$$var
+ };
+
+ my $version = do {
+ local $^W = 0;
+ no strict;
+ eval( $eval );
+ };
+
+ return $version;
+ }
+
+sub _path_to_module
+ {
+ my( $inc, $path ) = @_;
+ return if length $path< length $inc;
+
+ my $module_path = substr( $path, length $inc );
+ $module_path =~ s/\.pm\z//;
+
+ # XXX: this is cheating and doesn't handle everything right
+ my @dirs = grep { ! /\W/ } File::Spec->splitdir( $module_path );
+ shift @dirs;
+
+ my $module_name = join "::", @dirs;
+
+ return $module_name;
+ }
+
+1;
+
+=back
+
+=head1 EXIT VALUES
+
+The script exits with zero if it thinks that everything worked, or a
+positive number if it thinks that something failed. Note, however, that
+in some cases it has to divine a failure by the output of things it does
+not control. For now, the exit codes are vague:
+
+ 1 An unknown error
+
+ 2 The was an external problem
+
+ 4 There was an internal problem with the script
+
+ 8 A module failed to install
+
+=head1 TO DO
+
+* There is initial support for Log4perl if it is available, but I
+haven't gone through everything to make the NullLogger work out
+correctly if Log4perl is not installed.
+
+* When I capture CPAN.pm output, I need to check for errors and
+report them to the user.
+
+=head1 BUGS
+
+* none noted
+
+=head1 SEE ALSO
+
+Most behaviour, including environment variables and configuration,
+comes directly from CPAN.pm.
+
+=head1 SOURCE AVAILABILITY
+
+This code is in Github:
+
+ git://github.com/briandfoy/cpan_script.git
+
+=head1 CREDITS
+
+Japheth Cleaver added the bits to allow a forced install (-f).
+
+Jim Brandt suggest and provided the initial implementation for the
+up-to-date and Changes features.
+
+Adam Kennedy pointed out that exit() causes problems on Windows
+where this script ends up with a .bat extension
+
+=head1 AUTHOR
+
+brian d foy, C<< <bdfoy@cpan.org> >>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2009, brian d foy, All Rights Reserved.
+
+You may redistribute this under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/App/Prove.pm b/Master/tlpkg/tlperl.straw/lib/App/Prove.pm
new file mode 100755
index 00000000000..dd9b797e089
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/App/Prove.pm
@@ -0,0 +1,806 @@
+package App::Prove;
+
+use strict;
+use vars qw($VERSION @ISA);
+
+use TAP::Object ();
+use TAP::Harness;
+use TAP::Parser::Utils qw( split_shell );
+use File::Spec;
+use Getopt::Long;
+use App::Prove::State;
+use Carp;
+
+=head1 NAME
+
+App::Prove - Implements the C<prove> command.
+
+=head1 VERSION
+
+Version 3.20
+
+=cut
+
+$VERSION = '3.20';
+
+=head1 DESCRIPTION
+
+L<Test::Harness> provides a command, C<prove>, which runs a TAP based
+test suite and prints a report. The C<prove> command is a minimal
+wrapper around an instance of this module.
+
+=head1 SYNOPSIS
+
+ use App::Prove;
+
+ my $app = App::Prove->new;
+ $app->process_args(@ARGV);
+ $app->run;
+
+=cut
+
+use constant IS_WIN32 => ( $^O =~ /^(MS)?Win32$/ );
+use constant IS_VMS => $^O eq 'VMS';
+use constant IS_UNIXY => !( IS_VMS || IS_WIN32 );
+
+use constant STATE_FILE => IS_UNIXY ? '.prove' : '_prove';
+use constant RC_FILE => IS_UNIXY ? '.proverc' : '_proverc';
+
+use constant PLUGINS => 'App::Prove::Plugin';
+
+my @ATTR;
+
+BEGIN {
+ @ISA = qw(TAP::Object);
+
+ @ATTR = qw(
+ archive argv blib show_count color directives exec failures comments
+ formatter harness includes modules plugins jobs lib merge parse quiet
+ really_quiet recurse backwards shuffle taint_fail taint_warn timer
+ verbose warnings_fail warnings_warn show_help show_man show_version
+ state_class test_args state dry extension ignore_exit rules state_manager
+ normalize sources
+ );
+ __PACKAGE__->mk_methods(@ATTR);
+}
+
+=head1 METHODS
+
+=head2 Class Methods
+
+=head3 C<new>
+
+Create a new C<App::Prove>. Optionally a hash ref of attribute
+initializers may be passed.
+
+=cut
+
+# new() implementation supplied by TAP::Object
+
+sub _initialize {
+ my $self = shift;
+ my $args = shift || {};
+
+ # setup defaults:
+ for my $key (
+ qw( argv rc_opts includes modules state plugins rules sources ))
+ {
+ $self->{$key} = [];
+ }
+ $self->{harness_class} = 'TAP::Harness';
+
+ for my $attr (@ATTR) {
+ if ( exists $args->{$attr} ) {
+
+ # TODO: Some validation here
+ $self->{$attr} = $args->{$attr};
+ }
+ }
+
+ my %env_provides_default = (
+ HARNESS_TIMER => 'timer',
+ );
+
+ while ( my ( $env, $attr ) = each %env_provides_default ) {
+ $self->{$attr} = 1 if $ENV{$env};
+ }
+ $self->state_class('App::Prove::State');
+ return $self;
+}
+
+=head3 C<state_class>
+
+Getter/setter for the name of the class used for maintaining state. This
+class should either subclass from C<App::Prove::State> or provide an identical
+interface.
+
+=head3 C<state_manager>
+
+Getter/setter for the instance of the C<state_class>.
+
+=cut
+
+=head3 C<add_rc_file>
+
+ $prove->add_rc_file('myproj/.proverc');
+
+Called before C<process_args> to prepend the contents of an rc file to
+the options.
+
+=cut
+
+sub add_rc_file {
+ my ( $self, $rc_file ) = @_;
+
+ local *RC;
+ open RC, "<$rc_file" or croak "Can't read $rc_file ($!)";
+ while ( defined( my $line = <RC> ) ) {
+ push @{ $self->{rc_opts} },
+ grep { defined and not /^#/ }
+ $line =~ m{ ' ([^']*) ' | " ([^"]*) " | (\#.*) | (\S+) }xg;
+ }
+ close RC;
+}
+
+=head3 C<process_args>
+
+ $prove->process_args(@args);
+
+Processes the command-line arguments. Attributes will be set
+appropriately. Any filenames may be found in the C<argv> attribute.
+
+Dies on invalid arguments.
+
+=cut
+
+sub process_args {
+ my $self = shift;
+
+ my @rc = RC_FILE;
+ unshift @rc, glob '~/' . RC_FILE if IS_UNIXY;
+
+ # Preprocess meta-args.
+ my @args;
+ while ( defined( my $arg = shift ) ) {
+ if ( $arg eq '--norc' ) {
+ @rc = ();
+ }
+ elsif ( $arg eq '--rc' ) {
+ defined( my $rc = shift )
+ or croak "Missing argument to --rc";
+ push @rc, $rc;
+ }
+ elsif ( $arg =~ m{^--rc=(.+)$} ) {
+ push @rc, $1;
+ }
+ else {
+ push @args, $arg;
+ }
+ }
+
+ # Everything after the arisdottle '::' gets passed as args to
+ # test programs.
+ if ( defined( my $stop_at = _first_pos( '::', @args ) ) ) {
+ my @test_args = splice @args, $stop_at;
+ shift @test_args;
+ $self->{test_args} = \@test_args;
+ }
+
+ # Grab options from RC files
+ $self->add_rc_file($_) for grep -f, @rc;
+ unshift @args, @{ $self->{rc_opts} };
+
+ if ( my @bad = map {"-$_"} grep {/^-(man|help)$/} @args ) {
+ die "Long options should be written with two dashes: ",
+ join( ', ', @bad ), "\n";
+ }
+
+ # And finally...
+
+ {
+ local @ARGV = @args;
+ Getopt::Long::Configure(qw(no_ignore_case bundling pass_through));
+
+ # Don't add coderefs to GetOptions
+ GetOptions(
+ 'v|verbose' => \$self->{verbose},
+ 'f|failures' => \$self->{failures},
+ 'o|comments' => \$self->{comments},
+ 'l|lib' => \$self->{lib},
+ 'b|blib' => \$self->{blib},
+ 's|shuffle' => \$self->{shuffle},
+ 'color!' => \$self->{color},
+ 'colour!' => \$self->{color},
+ 'count!' => \$self->{show_count},
+ 'c' => \$self->{color},
+ 'D|dry' => \$self->{dry},
+ 'ext=s' => \$self->{extension},
+ 'harness=s' => \$self->{harness},
+ 'ignore-exit' => \$self->{ignore_exit},
+ 'source=s@' => $self->{sources},
+ 'formatter=s' => \$self->{formatter},
+ 'r|recurse' => \$self->{recurse},
+ 'reverse' => \$self->{backwards},
+ 'p|parse' => \$self->{parse},
+ 'q|quiet' => \$self->{quiet},
+ 'Q|QUIET' => \$self->{really_quiet},
+ 'e|exec=s' => \$self->{exec},
+ 'm|merge' => \$self->{merge},
+ 'I=s@' => $self->{includes},
+ 'M=s@' => $self->{modules},
+ 'P=s@' => $self->{plugins},
+ 'state=s@' => $self->{state},
+ 'directives' => \$self->{directives},
+ 'h|help|?' => \$self->{show_help},
+ 'H|man' => \$self->{show_man},
+ 'V|version' => \$self->{show_version},
+ 'a|archive=s' => \$self->{archive},
+ 'j|jobs=i' => \$self->{jobs},
+ 'timer' => \$self->{timer},
+ 'T' => \$self->{taint_fail},
+ 't' => \$self->{taint_warn},
+ 'W' => \$self->{warnings_fail},
+ 'w' => \$self->{warnings_warn},
+ 'normalize' => \$self->{normalize},
+ 'rules=s@' => $self->{rules},
+ ) or croak('Unable to continue');
+
+ # Stash the remainder of argv for later
+ $self->{argv} = [@ARGV];
+ }
+
+ return;
+}
+
+sub _first_pos {
+ my $want = shift;
+ for ( 0 .. $#_ ) {
+ return $_ if $_[$_] eq $want;
+ }
+ return;
+}
+
+sub _help {
+ my ( $self, $verbosity ) = @_;
+
+ eval('use Pod::Usage 1.12 ()');
+ if ( my $err = $@ ) {
+ die 'Please install Pod::Usage for the --help option '
+ . '(or try `perldoc prove`.)'
+ . "\n ($@)";
+ }
+
+ Pod::Usage::pod2usage( { -verbose => $verbosity } );
+
+ return;
+}
+
+sub _color_default {
+ my $self = shift;
+
+ return -t STDOUT && !$ENV{HARNESS_NOTTY} && !IS_WIN32;
+}
+
+sub _get_args {
+ my $self = shift;
+
+ my %args;
+
+ if ( defined $self->color ? $self->color : $self->_color_default ) {
+ $args{color} = 1;
+ }
+ if ( !defined $self->show_count ) {
+ $args{show_count} = 1;
+ }
+ else {
+ $args{show_count} = $self->show_count;
+ }
+
+ if ( $self->archive ) {
+ $self->require_harness( archive => 'TAP::Harness::Archive' );
+ $args{archive} = $self->archive;
+ }
+
+ if ( my $jobs = $self->jobs ) {
+ $args{jobs} = $jobs;
+ }
+
+ if ( my $harness_opt = $self->harness ) {
+ $self->require_harness( harness => $harness_opt );
+ }
+
+ if ( my $formatter = $self->formatter ) {
+ $args{formatter_class} = $formatter;
+ }
+
+ for my $handler ( @{ $self->sources } ) {
+ my ( $name, $config ) = $self->_parse_source($handler);
+ $args{sources}->{$name} = $config;
+ }
+
+ if ( $self->ignore_exit ) {
+ $args{ignore_exit} = 1;
+ }
+
+ if ( $self->taint_fail && $self->taint_warn ) {
+ die '-t and -T are mutually exclusive';
+ }
+
+ if ( $self->warnings_fail && $self->warnings_warn ) {
+ die '-w and -W are mutually exclusive';
+ }
+
+ for my $a (qw( lib switches )) {
+ my $method = "_get_$a";
+ my $val = $self->$method();
+ $args{$a} = $val if defined $val;
+ }
+
+ # Handle verbose, quiet, really_quiet flags
+ my %verb_map = ( verbose => 1, quiet => -1, really_quiet => -2, );
+
+ my @verb_adj = grep {$_} map { $self->$_() ? $verb_map{$_} : 0 }
+ keys %verb_map;
+
+ die "Only one of verbose, quiet or really_quiet should be specified\n"
+ if @verb_adj > 1;
+
+ $args{verbosity} = shift @verb_adj || 0;
+
+ for my $a (qw( merge failures comments timer directives normalize )) {
+ $args{$a} = 1 if $self->$a();
+ }
+
+ $args{errors} = 1 if $self->parse;
+
+ # defined but zero-length exec runs test files as binaries
+ $args{exec} = [ split( /\s+/, $self->exec ) ]
+ if ( defined( $self->exec ) );
+
+ if ( defined( my $test_args = $self->test_args ) ) {
+ $args{test_args} = $test_args;
+ }
+
+ if ( @{ $self->rules } ) {
+ my @rules;
+ for ( @{ $self->rules } ) {
+ if (/^par=(.*)/) {
+ push @rules, $1;
+ }
+ elsif (/^seq=(.*)/) {
+ push @rules, { seq => $1 };
+ }
+ }
+ $args{rules} = { par => [@rules] };
+ }
+
+ return ( \%args, $self->{harness_class} );
+}
+
+sub _find_module {
+ my ( $self, $class, @search ) = @_;
+
+ croak "Bad module name $class"
+ unless $class =~ /^ \w+ (?: :: \w+ ) *$/x;
+
+ for my $pfx (@search) {
+ my $name = join( '::', $pfx, $class );
+ eval "require $name";
+ return $name unless $@;
+ }
+
+ eval "require $class";
+ return $class unless $@;
+ return;
+}
+
+sub _load_extension {
+ my ( $self, $name, @search ) = @_;
+
+ my @args = ();
+ if ( $name =~ /^(.*?)=(.*)/ ) {
+ $name = $1;
+ @args = split( /,/, $2 );
+ }
+
+ if ( my $class = $self->_find_module( $name, @search ) ) {
+ $class->import(@args);
+ if ( $class->can('load') ) {
+ $class->load( { app_prove => $self, args => [@args] } );
+ }
+ }
+ else {
+ croak "Can't load module $name";
+ }
+}
+
+sub _load_extensions {
+ my ( $self, $ext, @search ) = @_;
+ $self->_load_extension( $_, @search ) for @$ext;
+}
+
+sub _parse_source {
+ my ( $self, $handler ) = @_;
+
+ # Load any options.
+ ( my $opt_name = lc $handler ) =~ s/::/-/g;
+ local @ARGV = @{ $self->{argv} };
+ my %config;
+ Getopt::Long::GetOptions(
+ "$opt_name-option=s%" => sub {
+ my ( undef, $k, $v ) = @_;
+ if ( exists $config{$k} ) {
+ $config{$k} = [ $config{$k} ]
+ unless ref $config{$k} eq 'ARRAY';
+ push @{ $config{$k} } => $v;
+ }
+ else {
+ $config{$k} = $v;
+ }
+ }
+ );
+ $self->{argv} = \@ARGV;
+ return ( $handler, \%config );
+}
+
+=head3 C<run>
+
+Perform whatever actions the command line args specified. The C<prove>
+command line tool consists of the following code:
+
+ use App::Prove;
+
+ my $app = App::Prove->new;
+ $app->process_args(@ARGV);
+ exit( $app->run ? 0 : 1 ); # if you need the exit code
+
+=cut
+
+sub run {
+ my $self = shift;
+
+ unless ( $self->state_manager ) {
+ $self->state_manager(
+ $self->state_class->new( { store => STATE_FILE } ) );
+ }
+
+ if ( $self->show_help ) {
+ $self->_help(1);
+ }
+ elsif ( $self->show_man ) {
+ $self->_help(2);
+ }
+ elsif ( $self->show_version ) {
+ $self->print_version;
+ }
+ elsif ( $self->dry ) {
+ print "$_\n" for $self->_get_tests;
+ }
+ else {
+
+ $self->_load_extensions( $self->modules );
+ $self->_load_extensions( $self->plugins, PLUGINS );
+
+ local $ENV{TEST_VERBOSE} = 1 if $self->verbose;
+
+ return $self->_runtests( $self->_get_args, $self->_get_tests );
+ }
+
+ return 1;
+}
+
+sub _get_tests {
+ my $self = shift;
+
+ my $state = $self->state_manager;
+ my $ext = $self->extension;
+ $state->extension($ext) if defined $ext;
+ if ( defined( my $state_switch = $self->state ) ) {
+ $state->apply_switch(@$state_switch);
+ }
+
+ my @tests = $state->get_tests( $self->recurse, @{ $self->argv } );
+
+ $self->_shuffle(@tests) if $self->shuffle;
+ @tests = reverse @tests if $self->backwards;
+
+ return @tests;
+}
+
+sub _runtests {
+ my ( $self, $args, $harness_class, @tests ) = @_;
+ my $harness = $harness_class->new($args);
+
+ my $state = $self->state_manager;
+
+ $harness->callback(
+ after_test => sub {
+ $state->observe_test(@_);
+ }
+ );
+
+ $harness->callback(
+ after_runtests => sub {
+ $state->commit(@_);
+ }
+ );
+
+ my $aggregator = $harness->runtests(@tests);
+
+ return !$aggregator->has_errors;
+}
+
+sub _get_switches {
+ my $self = shift;
+ my @switches;
+
+ # notes that -T or -t must be at the front of the switches!
+ if ( $self->taint_fail ) {
+ push @switches, '-T';
+ }
+ elsif ( $self->taint_warn ) {
+ push @switches, '-t';
+ }
+ if ( $self->warnings_fail ) {
+ push @switches, '-W';
+ }
+ elsif ( $self->warnings_warn ) {
+ push @switches, '-w';
+ }
+
+ push @switches, split_shell( $ENV{HARNESS_PERL_SWITCHES} );
+
+ return @switches ? \@switches : ();
+}
+
+sub _get_lib {
+ my $self = shift;
+ my @libs;
+ if ( $self->lib ) {
+ push @libs, 'lib';
+ }
+ if ( $self->blib ) {
+ push @libs, 'blib/lib', 'blib/arch';
+ }
+ if ( @{ $self->includes } ) {
+ push @libs, @{ $self->includes };
+ }
+
+ #24926
+ @libs = map { File::Spec->rel2abs($_) } @libs;
+
+ # Huh?
+ return @libs ? \@libs : ();
+}
+
+sub _shuffle {
+ my $self = shift;
+
+ # Fisher-Yates shuffle
+ my $i = @_;
+ while ($i) {
+ my $j = rand $i--;
+ @_[ $i, $j ] = @_[ $j, $i ];
+ }
+ return;
+}
+
+=head3 C<require_harness>
+
+Load a harness replacement class.
+
+ $prove->require_harness($for => $class_name);
+
+=cut
+
+sub require_harness {
+ my ( $self, $for, $class ) = @_;
+
+ my ($class_name) = $class =~ /^(\w+(?:::\w+)*)/;
+
+ # Emulate Perl's -MModule=arg1,arg2 behaviour
+ $class =~ s!^(\w+(?:::\w+)*)=(.*)$!$1 split(/,/,q{$2})!;
+
+ eval("use $class;");
+ die "$class_name is required to use the --$for feature: $@" if $@;
+
+ $self->{harness_class} = $class_name;
+
+ return;
+}
+
+=head3 C<print_version>
+
+Display the version numbers of the loaded L<TAP::Harness> and the
+current Perl.
+
+=cut
+
+sub print_version {
+ my $self = shift;
+ printf(
+ "TAP::Harness v%s and Perl v%vd\n",
+ $TAP::Harness::VERSION, $^V
+ );
+
+ return;
+}
+
+1;
+
+# vim:ts=4:sw=4:et:sta
+
+__END__
+
+=head2 Attributes
+
+After command line parsing the following attributes reflect the values
+of the corresponding command line switches. They may be altered before
+calling C<run>.
+
+=over
+
+=item C<archive>
+
+=item C<argv>
+
+=item C<backwards>
+
+=item C<blib>
+
+=item C<color>
+
+=item C<directives>
+
+=item C<dry>
+
+=item C<exec>
+
+=item C<extension>
+
+=item C<failures>
+
+=item C<comments>
+
+=item C<formatter>
+
+=item C<harness>
+
+=item C<ignore_exit>
+
+=item C<includes>
+
+=item C<jobs>
+
+=item C<lib>
+
+=item C<merge>
+
+=item C<modules>
+
+=item C<parse>
+
+=item C<plugins>
+
+=item C<quiet>
+
+=item C<really_quiet>
+
+=item C<recurse>
+
+=item C<rules>
+
+=item C<show_count>
+
+=item C<show_help>
+
+=item C<show_man>
+
+=item C<show_version>
+
+=item C<shuffle>
+
+=item C<state>
+
+=item C<state_class>
+
+=item C<taint_fail>
+
+=item C<taint_warn>
+
+=item C<test_args>
+
+=item C<timer>
+
+=item C<verbose>
+
+=item C<warnings_fail>
+
+=item C<warnings_warn>
+
+=back
+
+=head1 PLUGINS
+
+C<App::Prove> provides support for 3rd-party plugins. These are currently
+loaded at run-time, I<after> arguments have been parsed (so you can not
+change the way arguments are processed, sorry), typically with the
+C<< -PI<plugin> >> switch, eg:
+
+ prove -PMyPlugin
+
+This will search for a module named C<App::Prove::Plugin::MyPlugin>, or failing
+that, C<MyPlugin>. If the plugin can't be found, C<prove> will complain & exit.
+
+You can pass an argument to your plugin by appending an C<=> after the plugin
+name, eg C<-PMyPlugin=foo>. You can pass multiple arguments using commas:
+
+ prove -PMyPlugin=foo,bar,baz
+
+These are passed in to your plugin's C<load()> class method (if it has one),
+along with a reference to the C<App::Prove> object that is invoking your plugin:
+
+ sub load {
+ my ($class, $p) = @_;
+
+ my @args = @{ $p->{args} };
+ # @args will contain ( 'foo', 'bar', 'baz' )
+ $p->{app_prove}->do_something;
+ ...
+ }
+
+Note that the user's arguments are also passed to your plugin's C<import()>
+function as a list, eg:
+
+ sub import {
+ my ($class, @args) = @_;
+ # @args will contain ( 'foo', 'bar', 'baz' )
+ ...
+ }
+
+This is for backwards compatibility, and may be deprecated in the future.
+
+=head2 Sample Plugin
+
+Here's a sample plugin, for your reference:
+
+ package App::Prove::Plugin::Foo;
+
+ # Sample plugin, try running with:
+ # prove -PFoo=bar -r -j3
+ # prove -PFoo -Q
+ # prove -PFoo=bar,My::Formatter
+
+ use strict;
+ use warnings;
+
+ sub load {
+ my ($class, $p) = @_;
+ my @args = @{ $p->{args} };
+ my $app = $p->{app_prove};
+
+ print "loading plugin: $class, args: ", join(', ', @args ), "\n";
+
+ # turn on verbosity
+ $app->verbose( 1 );
+
+ # set the formatter?
+ $app->formatter( $args[1] ) if @args > 1;
+
+ # print some of App::Prove's state:
+ for my $attr (qw( jobs quiet really_quiet recurse verbose )) {
+ my $val = $app->$attr;
+ $val = 'undef' unless defined( $val );
+ print "$attr: $val\n";
+ }
+
+ return 1;
+ }
+
+ 1;
+
+=head1 SEE ALSO
+
+L<prove>, L<TAP::Harness>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/App/Prove/State.pm b/Master/tlpkg/tlperl.straw/lib/App/Prove/State.pm
new file mode 100755
index 00000000000..ffe1a229cb3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/App/Prove/State.pm
@@ -0,0 +1,517 @@
+package App::Prove::State;
+
+use strict;
+use vars qw($VERSION @ISA);
+
+use File::Find;
+use File::Spec;
+use Carp;
+
+use App::Prove::State::Result;
+use TAP::Parser::YAMLish::Reader ();
+use TAP::Parser::YAMLish::Writer ();
+use TAP::Base;
+
+BEGIN {
+ @ISA = qw( TAP::Base );
+ __PACKAGE__->mk_methods('result_class');
+}
+
+use constant IS_WIN32 => ( $^O =~ /^(MS)?Win32$/ );
+use constant NEED_GLOB => IS_WIN32;
+
+=head1 NAME
+
+App::Prove::State - State storage for the C<prove> command.
+
+=head1 VERSION
+
+Version 3.20
+
+=cut
+
+$VERSION = '3.20';
+
+=head1 DESCRIPTION
+
+The C<prove> command supports a C<--state> option that instructs it to
+store persistent state across runs. This module implements that state
+and the operations that may be performed on it.
+
+=head1 SYNOPSIS
+
+ # Re-run failed tests
+ $ prove --state=fail,save -rbv
+
+=cut
+
+=head1 METHODS
+
+=head2 Class Methods
+
+=head3 C<new>
+
+Accepts a hashref with the following key/value pairs:
+
+=over 4
+
+=item * C<store>
+
+The filename of the data store holding the data that App::Prove::State reads.
+
+=item * C<extension> (optional)
+
+The test name extension. Defaults to C<.t>.
+
+=item * C<result_class> (optional)
+
+The name of the C<result_class>. Defaults to C<App::Prove::State::Result>.
+
+=back
+
+=cut
+
+# override TAP::Base::new:
+sub new {
+ my $class = shift;
+ my %args = %{ shift || {} };
+
+ my $self = bless {
+ select => [],
+ seq => 1,
+ store => delete $args{store},
+ extension => ( delete $args{extension} || '.t' ),
+ result_class =>
+ ( delete $args{result_class} || 'App::Prove::State::Result' ),
+ }, $class;
+
+ $self->{_} = $self->result_class->new(
+ { tests => {},
+ generation => 1,
+ }
+ );
+ my $store = $self->{store};
+ $self->load($store)
+ if defined $store && -f $store;
+
+ return $self;
+}
+
+=head2 C<result_class>
+
+Getter/setter for the name of the class used for tracking test results. This
+class should either subclass from C<App::Prove::State::Result> or provide an
+identical interface.
+
+=cut
+
+=head2 C<extension>
+
+Get or set the extension files must have in order to be considered
+tests. Defaults to '.t'.
+
+=cut
+
+sub extension {
+ my $self = shift;
+ $self->{extension} = shift if @_;
+ return $self->{extension};
+}
+
+=head2 C<results>
+
+Get the results of the last test run. Returns a C<result_class()> instance.
+
+=cut
+
+sub results {
+ my $self = shift;
+ $self->{_} || $self->result_class->new;
+}
+
+=head2 C<commit>
+
+Save the test results. Should be called after all tests have run.
+
+=cut
+
+sub commit {
+ my $self = shift;
+ if ( $self->{should_save} ) {
+ $self->save;
+ }
+}
+
+=head2 Instance Methods
+
+=head3 C<apply_switch>
+
+ $self->apply_switch('failed,save');
+
+Apply a list of switch options to the state, updating the internal
+object state as a result. Nothing is returned.
+
+Diagnostics:
+ - "Illegal state option: %s"
+
+=over
+
+=item C<last>
+
+Run in the same order as last time
+
+=item C<failed>
+
+Run only the failed tests from last time
+
+=item C<passed>
+
+Run only the passed tests from last time
+
+=item C<all>
+
+Run all tests in normal order
+
+=item C<hot>
+
+Run the tests that most recently failed first
+
+=item C<todo>
+
+Run the tests ordered by number of todos.
+
+=item C<slow>
+
+Run the tests in slowest to fastest order.
+
+=item C<fast>
+
+Run test tests in fastest to slowest order.
+
+=item C<new>
+
+Run the tests in newest to oldest order.
+
+=item C<old>
+
+Run the tests in oldest to newest order.
+
+=item C<save>
+
+Save the state on exit.
+
+=back
+
+=cut
+
+sub apply_switch {
+ my $self = shift;
+ my @opts = @_;
+
+ my $last_gen = $self->results->generation - 1;
+ my $last_run_time = $self->results->last_run_time;
+ my $now = $self->get_time;
+
+ my @switches = map { split /,/ } @opts;
+
+ my %handler = (
+ last => sub {
+ $self->_select(
+ where => sub { $_->generation >= $last_gen },
+ order => sub { $_->sequence }
+ );
+ },
+ failed => sub {
+ $self->_select(
+ where => sub { $_->result != 0 },
+ order => sub { -$_->result }
+ );
+ },
+ passed => sub {
+ $self->_select( where => sub { $_->result == 0 } );
+ },
+ all => sub {
+ $self->_select();
+ },
+ todo => sub {
+ $self->_select(
+ where => sub { $_->num_todo != 0 },
+ order => sub { -$_->num_todo; }
+ );
+ },
+ hot => sub {
+ $self->_select(
+ where => sub { defined $_->last_fail_time },
+ order => sub { $now - $_->last_fail_time }
+ );
+ },
+ slow => sub {
+ $self->_select( order => sub { -$_->elapsed } );
+ },
+ fast => sub {
+ $self->_select( order => sub { $_->elapsed } );
+ },
+ new => sub {
+ $self->_select( order => sub { -$_->mtime } );
+ },
+ old => sub {
+ $self->_select( order => sub { $_->mtime } );
+ },
+ fresh => sub {
+ $self->_select( where => sub { $_->mtime >= $last_run_time } );
+ },
+ save => sub {
+ $self->{should_save}++;
+ },
+ adrian => sub {
+ unshift @switches, qw( hot all save );
+ },
+ );
+
+ while ( defined( my $ele = shift @switches ) ) {
+ my ( $opt, $arg )
+ = ( $ele =~ /^([^:]+):(.*)/ )
+ ? ( $1, $2 )
+ : ( $ele, undef );
+ my $code = $handler{$opt}
+ || croak "Illegal state option: $opt";
+ $code->($arg);
+ }
+ return;
+}
+
+sub _select {
+ my ( $self, %spec ) = @_;
+ push @{ $self->{select} }, \%spec;
+}
+
+=head3 C<get_tests>
+
+Given a list of args get the names of tests that should run
+
+=cut
+
+sub get_tests {
+ my $self = shift;
+ my $recurse = shift;
+ my @argv = @_;
+ my %seen;
+
+ my @selected = $self->_query;
+
+ unless ( @argv || @{ $self->{select} } ) {
+ @argv = $recurse ? '.' : 't';
+ croak qq{No tests named and '@argv' directory not found}
+ unless -d $argv[0];
+ }
+
+ push @selected, $self->_get_raw_tests( $recurse, @argv ) if @argv;
+ return grep { !$seen{$_}++ } @selected;
+}
+
+sub _query {
+ my $self = shift;
+ if ( my @sel = @{ $self->{select} } ) {
+ warn "No saved state, selection will be empty\n"
+ unless $self->results->num_tests;
+ return map { $self->_query_clause($_) } @sel;
+ }
+ return;
+}
+
+sub _query_clause {
+ my ( $self, $clause ) = @_;
+ my @got;
+ my $results = $self->results;
+ my $where = $clause->{where} || sub {1};
+
+ # Select
+ for my $name ( $results->test_names ) {
+ next unless -f $name;
+ local $_ = $results->test($name);
+ push @got, $name if $where->();
+ }
+
+ # Sort
+ if ( my $order = $clause->{order} ) {
+ @got = map { $_->[0] }
+ sort {
+ ( defined $b->[1] <=> defined $a->[1] )
+ || ( ( $a->[1] || 0 ) <=> ( $b->[1] || 0 ) )
+ } map {
+ [ $_,
+ do { local $_ = $results->test($_); $order->() }
+ ]
+ } @got;
+ }
+
+ return @got;
+}
+
+sub _get_raw_tests {
+ my $self = shift;
+ my $recurse = shift;
+ my @argv = @_;
+ my @tests;
+
+ # Do globbing on Win32.
+ @argv = map { glob "$_" } @argv if NEED_GLOB;
+ my $extension = $self->{extension};
+
+ for my $arg (@argv) {
+ if ( '-' eq $arg ) {
+ push @argv => <STDIN>;
+ chomp(@argv);
+ next;
+ }
+
+ push @tests,
+ sort -d $arg
+ ? $recurse
+ ? $self->_expand_dir_recursive( $arg, $extension )
+ : glob( File::Spec->catfile( $arg, "*$extension" ) )
+ : $arg;
+ }
+ return @tests;
+}
+
+sub _expand_dir_recursive {
+ my ( $self, $dir, $extension ) = @_;
+
+ my @tests;
+ find(
+ { follow => 1, #21938
+ follow_skip => 2,
+ wanted => sub {
+ -f
+ && /\Q$extension\E$/
+ && push @tests => $File::Find::name;
+ }
+ },
+ $dir
+ );
+ return @tests;
+}
+
+=head3 C<observe_test>
+
+Store the results of a test.
+
+=cut
+
+# Store:
+# last fail time
+# last pass time
+# last run time
+# most recent result
+# most recent todos
+# total failures
+# total passes
+# state generation
+# parser
+
+sub observe_test {
+
+ my ( $self, $test_info, $parser ) = @_;
+ my $name = $test_info->[0];
+ my $fail = scalar( $parser->failed ) + ( $parser->has_problems ? 1 : 0 );
+ my $todo = scalar( $parser->todo );
+ my $start_time = $parser->start_time;
+ my $end_time = $parser->end_time,
+
+ my $test = $self->results->test($name);
+
+ $test->sequence( $self->{seq}++ );
+ $test->generation( $self->results->generation );
+
+ $test->run_time($end_time);
+ $test->result($fail);
+ $test->num_todo($todo);
+ $test->elapsed( $end_time - $start_time );
+
+ $test->parser($parser);
+
+ if ($fail) {
+ $test->total_failures( $test->total_failures + 1 );
+ $test->last_fail_time($end_time);
+ }
+ else {
+ $test->total_passes( $test->total_passes + 1 );
+ $test->last_pass_time($end_time);
+ }
+}
+
+=head3 C<save>
+
+Write the state to a file.
+
+=cut
+
+sub save {
+ my ($self) = @_;
+
+ my $store = $self->{store} or return;
+ $self->results->last_run_time( $self->get_time );
+
+ my $writer = TAP::Parser::YAMLish::Writer->new;
+ local *FH;
+ open FH, ">$store" or croak "Can't write $store ($!)";
+ $writer->write( $self->results->raw, \*FH );
+ close FH;
+}
+
+=head3 C<load>
+
+Load the state from a file
+
+=cut
+
+sub load {
+ my ( $self, $name ) = @_;
+ my $reader = TAP::Parser::YAMLish::Reader->new;
+ local *FH;
+ open FH, "<$name" or croak "Can't read $name ($!)";
+
+ # XXX this is temporary
+ $self->{_} = $self->result_class->new(
+ $reader->read(
+ sub {
+ my $line = <FH>;
+ defined $line && chomp $line;
+ return $line;
+ }
+ )
+ );
+
+ # $writer->write( $self->{tests} || {}, \*FH );
+ close FH;
+ $self->_regen_seq;
+ $self->_prune_and_stamp;
+ $self->results->generation( $self->results->generation + 1 );
+}
+
+sub _prune_and_stamp {
+ my $self = shift;
+
+ my $results = $self->results;
+ my @tests = $self->results->tests;
+ for my $test (@tests) {
+ my $name = $test->name;
+ if ( my @stat = stat $name ) {
+ $test->mtime( $stat[9] );
+ }
+ else {
+ $results->remove($name);
+ }
+ }
+}
+
+sub _regen_seq {
+ my $self = shift;
+ for my $test ( $self->results->tests ) {
+ $self->{seq} = $test->sequence + 1
+ if defined $test->sequence && $test->sequence >= $self->{seq};
+ }
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/App/Prove/State/Result.pm b/Master/tlpkg/tlperl.straw/lib/App/Prove/State/Result.pm
new file mode 100755
index 00000000000..3b9d82f4b98
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/App/Prove/State/Result.pm
@@ -0,0 +1,233 @@
+package App::Prove::State::Result;
+
+use strict;
+use Carp 'croak';
+
+use App::Prove::State::Result::Test;
+use vars qw($VERSION);
+
+use constant STATE_VERSION => 1;
+
+=head1 NAME
+
+App::Prove::State::Result - Individual test suite results.
+
+=head1 VERSION
+
+Version 3.20
+
+=cut
+
+$VERSION = '3.20';
+
+=head1 DESCRIPTION
+
+The C<prove> command supports a C<--state> option that instructs it to
+store persistent state across runs. This module encapsulates the results for a
+single test suite run.
+
+=head1 SYNOPSIS
+
+ # Re-run failed tests
+ $ prove --state=fail,save -rbv
+
+=cut
+
+=head1 METHODS
+
+=head2 Class Methods
+
+=head3 C<new>
+
+ my $result = App::Prove::State::Result->new({
+ generation => $generation,
+ tests => \%tests,
+ });
+
+Returns a new C<App::Prove::State::Result> instance.
+
+=cut
+
+sub new {
+ my ( $class, $arg_for ) = @_;
+ $arg_for ||= {};
+ my %instance_data = %$arg_for; # shallow copy
+ $instance_data{version} = $class->state_version;
+ my $tests = delete $instance_data{tests} || {};
+ my $self = bless \%instance_data => $class;
+ $self->_initialize($tests);
+ return $self;
+}
+
+sub _initialize {
+ my ( $self, $tests ) = @_;
+ my %tests;
+ while ( my ( $name, $test ) = each %$tests ) {
+ $tests{$name} = $self->test_class->new(
+ { %$test,
+ name => $name
+ }
+ );
+ }
+ $self->tests( \%tests );
+ return $self;
+}
+
+=head2 C<state_version>
+
+Returns the current version of state storage.
+
+=cut
+
+sub state_version {STATE_VERSION}
+
+=head2 C<test_class>
+
+Returns the name of the class used for tracking individual tests. This class
+should either subclass from C<App::Prove::State::Result::Test> or provide an
+identical interface.
+
+=cut
+
+sub test_class {
+ return 'App::Prove::State::Result::Test';
+}
+
+my %methods = (
+ generation => { method => 'generation', default => 0 },
+ last_run_time => { method => 'last_run_time', default => undef },
+);
+
+while ( my ( $key, $description ) = each %methods ) {
+ my $default = $description->{default};
+ no strict 'refs';
+ *{ $description->{method} } = sub {
+ my $self = shift;
+ if (@_) {
+ $self->{$key} = shift;
+ return $self;
+ }
+ return $self->{$key} || $default;
+ };
+}
+
+=head3 C<generation>
+
+Getter/setter for the "generation" of the test suite run. The first
+generation is 1 (one) and subsequent generations are 2, 3, etc.
+
+=head3 C<last_run_time>
+
+Getter/setter for the time of the test suite run.
+
+=head3 C<tests>
+
+Returns the tests for a given generation. This is a hashref or a hash,
+depending on context called. The keys to the hash are the individual
+test names and the value is a hashref with various interesting values.
+Each k/v pair might resemble something like this:
+
+ 't/foo.t' => {
+ elapsed => '0.0428488254547119',
+ gen => '7',
+ last_pass_time => '1219328376.07815',
+ last_result => '0',
+ last_run_time => '1219328376.07815',
+ last_todo => '0',
+ mtime => '1191708862',
+ seq => '192',
+ total_passes => '6',
+ }
+
+=cut
+
+sub tests {
+ my $self = shift;
+ if (@_) {
+ $self->{tests} = shift;
+ return $self;
+ }
+ my %tests = %{ $self->{tests} };
+ my @tests = sort { $a->sequence <=> $b->sequence } values %tests;
+ return wantarray ? @tests : \@tests;
+}
+
+=head3 C<test>
+
+ my $test = $result->test('t/customer/create.t');
+
+Returns an individual C<App::Prove::State::Result::Test> instance for the
+given test name (usually the filename). Will return a new
+C<App::Prove::State::Result::Test> instance if the name is not found.
+
+=cut
+
+sub test {
+ my ( $self, $name ) = @_;
+ croak("test() requires a test name") unless defined $name;
+
+ my $tests = $self->{tests} ||= {};
+ if ( my $test = $tests->{$name} ) {
+ return $test;
+ }
+ else {
+ my $test = $self->test_class->new( { name => $name } );
+ $self->{tests}->{$name} = $test;
+ return $test;
+ }
+}
+
+=head3 C<test_names>
+
+Returns an list of test names, sorted by run order.
+
+=cut
+
+sub test_names {
+ my $self = shift;
+ return map { $_->name } $self->tests;
+}
+
+=head3 C<remove>
+
+ $result->remove($test_name); # remove the test
+ my $test = $result->test($test_name); # fatal error
+
+Removes a given test from results. This is a no-op if the test name is not
+found.
+
+=cut
+
+sub remove {
+ my ( $self, $name ) = @_;
+ delete $self->{tests}->{$name};
+ return $self;
+}
+
+=head3 C<num_tests>
+
+Returns the number of tests for a given test suite result.
+
+=cut
+
+sub num_tests { keys %{ shift->{tests} } }
+
+=head3 C<raw>
+
+Returns a hashref of raw results, suitable for serialization by YAML.
+
+=cut
+
+sub raw {
+ my $self = shift;
+ my %raw = %$self;
+
+ my %tests;
+ for my $test ( $self->tests ) {
+ $tests{ $test->name } = $test->raw;
+ }
+ $raw{tests} = \%tests;
+ return \%raw;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/App/Prove/State/Result/Test.pm b/Master/tlpkg/tlperl.straw/lib/App/Prove/State/Result/Test.pm
new file mode 100755
index 00000000000..a7bebb39be4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/App/Prove/State/Result/Test.pm
@@ -0,0 +1,153 @@
+package App::Prove::State::Result::Test;
+
+use strict;
+
+use vars qw($VERSION);
+
+=head1 NAME
+
+App::Prove::State::Result::Test - Individual test results.
+
+=head1 VERSION
+
+Version 3.20
+
+=cut
+
+$VERSION = '3.20';
+
+=head1 DESCRIPTION
+
+The C<prove> command supports a C<--state> option that instructs it to
+store persistent state across runs. This module encapsulates the results for a
+single test.
+
+=head1 SYNOPSIS
+
+ # Re-run failed tests
+ $ prove --state=fail,save -rbv
+
+=cut
+
+my %methods = (
+ name => { method => 'name' },
+ elapsed => { method => 'elapsed', default => 0 },
+ gen => { method => 'generation', default => 1 },
+ last_pass_time => { method => 'last_pass_time', default => undef },
+ last_fail_time => { method => 'last_fail_time', default => undef },
+ last_result => { method => 'result', default => 0 },
+ last_run_time => { method => 'run_time', default => undef },
+ last_todo => { method => 'num_todo', default => 0 },
+ mtime => { method => 'mtime', default => undef },
+ seq => { method => 'sequence', default => 1 },
+ total_passes => { method => 'total_passes', default => 0 },
+ total_failures => { method => 'total_failures', default => 0 },
+ parser => { method => 'parser' },
+);
+
+while ( my ( $key, $description ) = each %methods ) {
+ my $default = $description->{default};
+ no strict 'refs';
+ *{ $description->{method} } = sub {
+ my $self = shift;
+ if (@_) {
+ $self->{$key} = shift;
+ return $self;
+ }
+ return $self->{$key} || $default;
+ };
+}
+
+=head1 METHODS
+
+=head2 Class Methods
+
+=head3 C<new>
+
+=cut
+
+sub new {
+ my ( $class, $arg_for ) = @_;
+ $arg_for ||= {};
+ bless $arg_for => $class;
+}
+
+=head2 Instance Methods
+
+=head3 C<name>
+
+The name of the test. Usually a filename.
+
+=head3 C<elapsed>
+
+The total elapsed times the test took to run, in seconds from the epoch..
+
+=head3 C<generation>
+
+The number for the "generation" of the test run. The first generation is 1
+(one) and subsequent generations are 2, 3, etc.
+
+=head3 C<last_pass_time>
+
+The last time the test program passed, in seconds from the epoch.
+
+Returns C<undef> if the program has never passed.
+
+=head3 C<last_fail_time>
+
+The last time the test suite failed, in seconds from the epoch.
+
+Returns C<undef> if the program has never failed.
+
+=head3 C<mtime>
+
+Returns the mtime of the test, in seconds from the epoch.
+
+=head3 C<raw>
+
+Returns a hashref of raw test data, suitable for serialization by YAML.
+
+=head3 C<result>
+
+Currently, whether or not the test suite passed with no 'problems' (such as
+TODO passed).
+
+=head3 C<run_time>
+
+The total time it took for the test to run, in seconds. If C<Time::HiRes> is
+available, it will have finer granularity.
+
+=head3 C<num_todo>
+
+The number of tests with TODO directives.
+
+=head3 C<sequence>
+
+The order in which this test was run for the given test suite result.
+
+=head3 C<total_passes>
+
+The number of times the test has passed.
+
+=head3 C<total_failures>
+
+The number of times the test has failed.
+
+=head3 C<parser>
+
+The underlying parser object. This is useful if you need the full
+information for the test program.
+
+=cut
+
+sub raw {
+ my $self = shift;
+ my %raw = %$self;
+
+ # this is backwards-compatibility hack and is not guaranteed.
+ delete $raw{name};
+ delete $raw{parser};
+ return \%raw;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/AutoLoader.pm b/Master/tlpkg/tlperl.straw/lib/AutoLoader.pm
new file mode 100755
index 00000000000..06f986b50d6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/AutoLoader.pm
@@ -0,0 +1,429 @@
+package AutoLoader;
+
+use strict;
+use 5.006_001;
+
+our($VERSION, $AUTOLOAD);
+
+my $is_dosish;
+my $is_epoc;
+my $is_vms;
+my $is_macos;
+
+BEGIN {
+ $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'NetWare';
+ $is_epoc = $^O eq 'epoc';
+ $is_vms = $^O eq 'VMS';
+ $is_macos = $^O eq 'MacOS';
+ $VERSION = '5.70';
+}
+
+AUTOLOAD {
+ my $sub = $AUTOLOAD;
+ my $filename = AutoLoader::find_filename( $sub );
+
+ my $save = $@;
+ local $!; # Do not munge the value.
+ eval { local $SIG{__DIE__}; require $filename };
+ if ($@) {
+ if (substr($sub,-9) eq '::DESTROY') {
+ no strict 'refs';
+ *$sub = sub {};
+ $@ = undef;
+ } elsif ($@ =~ /^Can't locate/) {
+ # The load might just have failed because the filename was too
+ # long for some old SVR3 systems which treat long names as errors.
+ # If we can successfully truncate a long name then it's worth a go.
+ # There is a slight risk that we could pick up the wrong file here
+ # but autosplit should have warned about that when splitting.
+ if ($filename =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){
+ eval { local $SIG{__DIE__}; require $filename };
+ }
+ }
+ if ($@){
+ $@ =~ s/ at .*\n//;
+ my $error = $@;
+ require Carp;
+ Carp::croak($error);
+ }
+ }
+ $@ = $save;
+ goto &$sub;
+}
+
+sub find_filename {
+ my $sub = shift;
+ my $filename;
+ # Braces used to preserve $1 et al.
+ {
+ # Try to find the autoloaded file from the package-qualified
+ # name of the sub. e.g., if the sub needed is
+ # Getopt::Long::GetOptions(), then $INC{Getopt/Long.pm} is
+ # something like '/usr/lib/perl5/Getopt/Long.pm', and the
+ # autoload file is '/usr/lib/perl5/auto/Getopt/Long/GetOptions.al'.
+ #
+ # However, if @INC is a relative path, this might not work. If,
+ # for example, @INC = ('lib'), then $INC{Getopt/Long.pm} is
+ # 'lib/Getopt/Long.pm', and we want to require
+ # 'auto/Getopt/Long/GetOptions.al' (without the leading 'lib').
+ # In this case, we simple prepend the 'auto/' and let the
+ # C<require> take care of the searching for us.
+
+ my ($pkg,$func) = ($sub =~ /(.*)::([^:]+)$/);
+ $pkg =~ s#::#/#g;
+ if (defined($filename = $INC{"$pkg.pm"})) {
+ if ($is_macos) {
+ $pkg =~ tr#/#:#;
+ $filename = undef
+ unless $filename =~ s#^(.*)$pkg\.pm\z#$1auto:$pkg:$func.al#s;
+ } else {
+ $filename = undef
+ unless $filename =~ s#^(.*)$pkg\.pm\z#$1auto/$pkg/$func.al#s;
+ }
+
+ # if the file exists, then make sure that it is a
+ # a fully anchored path (i.e either '/usr/lib/auto/foo/bar.al',
+ # or './lib/auto/foo/bar.al'. This avoids C<require> searching
+ # (and failing) to find the 'lib/auto/foo/bar.al' because it
+ # looked for 'lib/lib/auto/foo/bar.al', given @INC = ('lib').
+
+ if (defined $filename and -r $filename) {
+ unless ($filename =~ m|^/|s) {
+ if ($is_dosish) {
+ unless ($filename =~ m{^([a-z]:)?[\\/]}is) {
+ if ($^O ne 'NetWare') {
+ $filename = "./$filename";
+ } else {
+ $filename = "$filename";
+ }
+ }
+ }
+ elsif ($is_epoc) {
+ unless ($filename =~ m{^([a-z?]:)?[\\/]}is) {
+ $filename = "./$filename";
+ }
+ }
+ elsif ($is_vms) {
+ # XXX todo by VMSmiths
+ $filename = "./$filename";
+ }
+ elsif (!$is_macos) {
+ $filename = "./$filename";
+ }
+ }
+ }
+ else {
+ $filename = undef;
+ }
+ }
+ unless (defined $filename) {
+ # let C<require> do the searching
+ $filename = "auto/$sub.al";
+ $filename =~ s#::#/#g;
+ }
+ }
+ return $filename;
+}
+
+sub import {
+ my $pkg = shift;
+ my $callpkg = caller;
+
+ #
+ # Export symbols, but not by accident of inheritance.
+ #
+
+ if ($pkg eq 'AutoLoader') {
+ if ( @_ and $_[0] =~ /^&?AUTOLOAD$/ ) {
+ no strict 'refs';
+ *{ $callpkg . '::AUTOLOAD' } = \&AUTOLOAD;
+ }
+ }
+
+ #
+ # Try to find the autosplit index file. Eg., if the call package
+ # is POSIX, then $INC{POSIX.pm} is something like
+ # '/usr/local/lib/perl5/POSIX.pm', and the autosplit index file is in
+ # '/usr/local/lib/perl5/auto/POSIX/autosplit.ix', so we require that.
+ #
+ # However, if @INC is a relative path, this might not work. If,
+ # for example, @INC = ('lib'), then
+ # $INC{POSIX.pm} is 'lib/POSIX.pm', and we want to require
+ # 'auto/POSIX/autosplit.ix' (without the leading 'lib').
+ #
+
+ (my $calldir = $callpkg) =~ s#::#/#g;
+ my $path = $INC{$calldir . '.pm'};
+ if (defined($path)) {
+ # Try absolute path name, but only eval it if the
+ # transformation from module path to autosplit.ix path
+ # succeeded!
+ my $replaced_okay;
+ if ($is_macos) {
+ (my $malldir = $calldir) =~ tr#/#:#;
+ $replaced_okay = ($path =~ s#^(.*)$malldir\.pm\z#$1auto:$malldir:autosplit.ix#s);
+ } else {
+ $replaced_okay = ($path =~ s#^(.*)$calldir\.pm\z#$1auto/$calldir/autosplit.ix#);
+ }
+
+ eval { require $path; } if $replaced_okay;
+ # If that failed, try relative path with normal @INC searching.
+ if (!$replaced_okay or $@) {
+ $path ="auto/$calldir/autosplit.ix";
+ eval { require $path; };
+ }
+ if ($@) {
+ my $error = $@;
+ require Carp;
+ Carp::carp($error);
+ }
+ }
+}
+
+sub unimport {
+ my $callpkg = caller;
+
+ no strict 'refs';
+
+ for my $exported (qw( AUTOLOAD )) {
+ my $symname = $callpkg . '::' . $exported;
+ undef *{ $symname } if \&{ $symname } == \&{ $exported };
+ *{ $symname } = \&{ $symname };
+ }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+AutoLoader - load subroutines only on demand
+
+=head1 SYNOPSIS
+
+ package Foo;
+ use AutoLoader 'AUTOLOAD'; # import the default AUTOLOAD subroutine
+
+ package Bar;
+ use AutoLoader; # don't import AUTOLOAD, define our own
+ sub AUTOLOAD {
+ ...
+ $AutoLoader::AUTOLOAD = "...";
+ goto &AutoLoader::AUTOLOAD;
+ }
+
+=head1 DESCRIPTION
+
+The B<AutoLoader> module works with the B<AutoSplit> module and the
+C<__END__> token to defer the loading of some subroutines until they are
+used rather than loading them all at once.
+
+To use B<AutoLoader>, the author of a module has to place the
+definitions of subroutines to be autoloaded after an C<__END__> token.
+(See L<perldata>.) The B<AutoSplit> module can then be run manually to
+extract the definitions into individual files F<auto/funcname.al>.
+
+B<AutoLoader> implements an AUTOLOAD subroutine. When an undefined
+subroutine in is called in a client module of B<AutoLoader>,
+B<AutoLoader>'s AUTOLOAD subroutine attempts to locate the subroutine in a
+file with a name related to the location of the file from which the
+client module was read. As an example, if F<POSIX.pm> is located in
+F</usr/local/lib/perl5/POSIX.pm>, B<AutoLoader> will look for perl
+subroutines B<POSIX> in F</usr/local/lib/perl5/auto/POSIX/*.al>, where
+the C<.al> file has the same name as the subroutine, sans package. If
+such a file exists, AUTOLOAD will read and evaluate it,
+thus (presumably) defining the needed subroutine. AUTOLOAD will then
+C<goto> the newly defined subroutine.
+
+Once this process completes for a given function, it is defined, so
+future calls to the subroutine will bypass the AUTOLOAD mechanism.
+
+=head2 Subroutine Stubs
+
+In order for object method lookup and/or prototype checking to operate
+correctly even when methods have not yet been defined it is necessary to
+"forward declare" each subroutine (as in C<sub NAME;>). See
+L<perlsub/"SYNOPSIS">. Such forward declaration creates "subroutine
+stubs", which are place holders with no code.
+
+The AutoSplit and B<AutoLoader> modules automate the creation of forward
+declarations. The AutoSplit module creates an 'index' file containing
+forward declarations of all the AutoSplit subroutines. When the
+AutoLoader module is 'use'd it loads these declarations into its callers
+package.
+
+Because of this mechanism it is important that B<AutoLoader> is always
+C<use>d and not C<require>d.
+
+=head2 Using B<AutoLoader>'s AUTOLOAD Subroutine
+
+In order to use B<AutoLoader>'s AUTOLOAD subroutine you I<must>
+explicitly import it:
+
+ use AutoLoader 'AUTOLOAD';
+
+=head2 Overriding B<AutoLoader>'s AUTOLOAD Subroutine
+
+Some modules, mainly extensions, provide their own AUTOLOAD subroutines.
+They typically need to check for some special cases (such as constants)
+and then fallback to B<AutoLoader>'s AUTOLOAD for the rest.
+
+Such modules should I<not> import B<AutoLoader>'s AUTOLOAD subroutine.
+Instead, they should define their own AUTOLOAD subroutines along these
+lines:
+
+ use AutoLoader;
+ use Carp;
+
+ sub AUTOLOAD {
+ my $sub = $AUTOLOAD;
+ (my $constname = $sub) =~ s/.*:://;
+ my $val = constant($constname, @_ ? $_[0] : 0);
+ if ($! != 0) {
+ if ($! =~ /Invalid/ || $!{EINVAL}) {
+ $AutoLoader::AUTOLOAD = $sub;
+ goto &AutoLoader::AUTOLOAD;
+ }
+ else {
+ croak "Your vendor has not defined constant $constname";
+ }
+ }
+ *$sub = sub { $val }; # same as: eval "sub $sub { $val }";
+ goto &$sub;
+ }
+
+If any module's own AUTOLOAD subroutine has no need to fallback to the
+AutoLoader's AUTOLOAD subroutine (because it doesn't have any AutoSplit
+subroutines), then that module should not use B<AutoLoader> at all.
+
+=head2 Package Lexicals
+
+Package lexicals declared with C<my> in the main block of a package
+using B<AutoLoader> will not be visible to auto-loaded subroutines, due to
+the fact that the given scope ends at the C<__END__> marker. A module
+using such variables as package globals will not work properly under the
+B<AutoLoader>.
+
+The C<vars> pragma (see L<perlmod/"vars">) may be used in such
+situations as an alternative to explicitly qualifying all globals with
+the package namespace. Variables pre-declared with this pragma will be
+visible to any autoloaded routines (but will not be invisible outside
+the package, unfortunately).
+
+=head2 Not Using AutoLoader
+
+You can stop using AutoLoader by simply
+
+ no AutoLoader;
+
+=head2 B<AutoLoader> vs. B<SelfLoader>
+
+The B<AutoLoader> is similar in purpose to B<SelfLoader>: both delay the
+loading of subroutines.
+
+B<SelfLoader> uses the C<__DATA__> marker rather than C<__END__>.
+While this avoids the use of a hierarchy of disk files and the
+associated open/close for each routine loaded, B<SelfLoader> suffers a
+startup speed disadvantage in the one-time parsing of the lines after
+C<__DATA__>, after which routines are cached. B<SelfLoader> can also
+handle multiple packages in a file.
+
+B<AutoLoader> only reads code as it is requested, and in many cases
+should be faster, but requires a mechanism like B<AutoSplit> be used to
+create the individual files. L<ExtUtils::MakeMaker> will invoke
+B<AutoSplit> automatically if B<AutoLoader> is used in a module source
+file.
+
+=head1 CAVEATS
+
+AutoLoaders prior to Perl 5.002 had a slightly different interface. Any
+old modules which use B<AutoLoader> should be changed to the new calling
+style. Typically this just means changing a require to a use, adding
+the explicit C<'AUTOLOAD'> import if needed, and removing B<AutoLoader>
+from C<@ISA>.
+
+On systems with restrictions on file name length, the file corresponding
+to a subroutine may have a shorter name that the routine itself. This
+can lead to conflicting file names. The I<AutoSplit> package warns of
+these potential conflicts when used to split a module.
+
+AutoLoader may fail to find the autosplit files (or even find the wrong
+ones) in cases where C<@INC> contains relative paths, B<and> the program
+does C<chdir>.
+
+=head1 SEE ALSO
+
+L<SelfLoader> - an autoloader that doesn't use external files.
+
+=head1 AUTHOR
+
+C<AutoLoader> is maintained by the perl5-porters. Please direct
+any questions to the canonical mailing list. Anything that
+is applicable to the CPAN release can be sent to its maintainer,
+though.
+
+Author and Maintainer: The Perl5-Porters <perl5-porters@perl.org>
+
+Maintainer of the CPAN release: Steffen Mueller <smueller@cpan.org>
+
+=head1 COPYRIGHT AND LICENSE
+
+This package has been part of the perl core since the first release
+of perl5. It has been released separately to CPAN so older installations
+can benefit from bug fixes.
+
+This package has the same copyright and license as the perl core:
+
+ Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ by Larry Wall and others
+
+ All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ a) the GNU General Public License as published by the Free
+ Software Foundation; either version 1, or (at your option) any
+ later version, or
+
+ b) the "Artistic License" which comes with this Kit.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either
+ the GNU General Public License or the Artistic License for more details.
+
+ You should have received a copy of the Artistic License with this
+ Kit, in the file named "Artistic". If not, I'll be glad to provide one.
+
+ You should also have received a copy of the GNU General Public License
+ along with this program in the file named "Copying". If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307, USA or visit their web page on the internet at
+ http://www.gnu.org/copyleft/gpl.html.
+
+ For those of you that choose to use the GNU General Public License,
+ my interpretation of the GNU General Public License is that no Perl
+ script falls under the terms of the GPL unless you explicitly put
+ said script under the terms of the GPL yourself. Furthermore, any
+ object code linked with perl does not automatically fall under the
+ terms of the GPL, provided such object code only adds definitions
+ of subroutines and variables, and does not otherwise impair the
+ resulting interpreter from executing any standard Perl script. I
+ consider linking in C subroutines in this manner to be the moral
+ equivalent of defining subroutines in the Perl language itself. You
+ may sell such an object file as proprietary provided that you provide
+ or offer to provide the Perl source, as specified by the GNU General
+ Public License. (This is merely an alternate way of specifying input
+ to the program.) You may also sell a binary produced by the dumping of
+ a running Perl script that belongs to you, provided that you provide or
+ offer to provide the Perl source as specified by the GPL. (The
+ fact that a Perl interpreter and your code are in the same binary file
+ is, in this case, a form of mere aggregation.) This is my interpretation
+ of the GPL. If you still have concerns or difficulties understanding
+ my intent, feel free to contact me. Of course, the Artistic License
+ spells all this out for your protection, so you may prefer to use that.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/B.pm b/Master/tlpkg/tlperl.straw/lib/B.pm
new file mode 100755
index 00000000000..52ae05e3269
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/B.pm
@@ -0,0 +1,1189 @@
+# B.pm
+#
+# Copyright (c) 1996, 1997, 1998 Malcolm Beattie
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the README file.
+#
+package B;
+
+our $VERSION = '1.22';
+
+use XSLoader ();
+require Exporter;
+@ISA = qw(Exporter);
+
+# walkoptree_slow comes from B.pm (you are there),
+# walkoptree comes from B.xs
+@EXPORT_OK = qw(minus_c ppname save_BEGINs
+ class peekop cast_I32 cstring cchar hash threadsv_names
+ main_root main_start main_cv svref_2object opnumber
+ sub_generation amagic_generation perlstring
+ walkoptree_slow walkoptree walkoptree_exec walksymtable
+ parents comppadlist sv_undef compile_stats timing_info
+ begin_av init_av check_av end_av regex_padav dowarn defstash
+ curstash warnhook diehook inc_gv @optype @specialsv_name
+ );
+push @EXPORT_OK, qw(unitcheck_av) if $] > 5.009;
+
+sub OPf_KIDS ();
+use strict;
+@B::SV::ISA = 'B::OBJECT';
+@B::NULL::ISA = 'B::SV';
+@B::PV::ISA = 'B::SV';
+@B::IV::ISA = 'B::SV';
+@B::NV::ISA = 'B::SV';
+# RV is eliminated with 5.11.0, but effectively is a specialisation of IV now.
+@B::RV::ISA = $] >= 5.011 ? 'B::IV' : 'B::SV';
+@B::PVIV::ISA = qw(B::PV B::IV);
+@B::PVNV::ISA = qw(B::PVIV B::NV);
+@B::PVMG::ISA = 'B::PVNV';
+@B::REGEXP::ISA = 'B::PVMG' if $] >= 5.011;
+# Change in the inheritance hierarchy post 5.9.0
+@B::PVLV::ISA = $] > 5.009 ? 'B::GV' : 'B::PVMG';
+# BM is eliminated post 5.9.5, but effectively is a specialisation of GV now.
+@B::BM::ISA = $] > 5.009005 ? 'B::GV' : 'B::PVMG';
+@B::AV::ISA = 'B::PVMG';
+@B::GV::ISA = 'B::PVMG';
+@B::HV::ISA = 'B::PVMG';
+@B::CV::ISA = 'B::PVMG';
+@B::IO::ISA = 'B::PVMG';
+@B::FM::ISA = 'B::CV';
+
+@B::OP::ISA = 'B::OBJECT';
+@B::UNOP::ISA = 'B::OP';
+@B::BINOP::ISA = 'B::UNOP';
+@B::LOGOP::ISA = 'B::UNOP';
+@B::LISTOP::ISA = 'B::BINOP';
+@B::SVOP::ISA = 'B::OP';
+@B::PADOP::ISA = 'B::OP';
+@B::PVOP::ISA = 'B::OP';
+@B::LOOP::ISA = 'B::LISTOP';
+@B::PMOP::ISA = 'B::LISTOP';
+@B::COP::ISA = 'B::OP';
+
+@B::SPECIAL::ISA = 'B::OBJECT';
+
+@B::optype = qw(OP UNOP BINOP LOGOP LISTOP PMOP SVOP PADOP PVOP LOOP COP);
+# bytecode.pl contained the following comment:
+# Nullsv *must* come first in the following so that the condition
+# ($$sv == 0) can continue to be used to test (sv == Nullsv).
+@B::specialsv_name = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no
+ (SV*)pWARN_ALL (SV*)pWARN_NONE (SV*)pWARN_STD);
+
+{
+ # Stop "-w" from complaining about the lack of a real B::OBJECT class
+ package B::OBJECT;
+}
+
+sub B::GV::SAFENAME {
+ my $name = (shift())->NAME;
+
+ # The regex below corresponds to the isCONTROLVAR macro
+ # from toke.c
+
+ $name =~ s/^([\cA-\cZ\c\\c[\c]\c?\c_\c^])/"^".
+ chr( utf8::unicode_to_native( 64 ^ ord($1) ))/e;
+
+ # When we say unicode_to_native we really mean ascii_to_native,
+ # which matters iff this is a non-ASCII platform (EBCDIC).
+
+ return $name;
+}
+
+sub B::IV::int_value {
+ my ($self) = @_;
+ return (($self->FLAGS() & SVf_IVisUV()) ? $self->UVX : $self->IV);
+}
+
+sub B::NULL::as_string() {""}
+sub B::IV::as_string() {goto &B::IV::int_value}
+sub B::PV::as_string() {goto &B::PV::PV}
+
+my $debug;
+my $op_count = 0;
+my @parents = ();
+
+sub debug {
+ my ($class, $value) = @_;
+ $debug = $value;
+ walkoptree_debug($value);
+}
+
+sub class {
+ my $obj = shift;
+ my $name = ref $obj;
+ $name =~ s/^.*:://;
+ return $name;
+}
+
+sub parents { \@parents }
+
+# For debugging
+sub peekop {
+ my $op = shift;
+ return sprintf("%s (0x%x) %s", class($op), $$op, $op->name);
+}
+
+sub walkoptree_slow {
+ my($op, $method, $level) = @_;
+ $op_count++; # just for statistics
+ $level ||= 0;
+ warn(sprintf("walkoptree: %d. %s\n", $level, peekop($op))) if $debug;
+ $op->$method($level) if $op->can($method);
+ if ($$op && ($op->flags & OPf_KIDS)) {
+ my $kid;
+ unshift(@parents, $op);
+ for ($kid = $op->first; $$kid; $kid = $kid->sibling) {
+ walkoptree_slow($kid, $method, $level + 1);
+ }
+ shift @parents;
+ }
+ if (class($op) eq 'PMOP'
+ && ref($op->pmreplroot)
+ && ${$op->pmreplroot}
+ && $op->pmreplroot->isa( 'B::OP' ))
+ {
+ unshift(@parents, $op);
+ walkoptree_slow($op->pmreplroot, $method, $level + 1);
+ shift @parents;
+ }
+}
+
+sub compile_stats {
+ return "Total number of OPs processed: $op_count\n";
+}
+
+sub timing_info {
+ my ($sec, $min, $hr) = localtime;
+ my ($user, $sys) = times;
+ sprintf("%02d:%02d:%02d user=$user sys=$sys",
+ $hr, $min, $sec, $user, $sys);
+}
+
+my %symtable;
+
+sub clearsym {
+ %symtable = ();
+}
+
+sub savesym {
+ my ($obj, $value) = @_;
+# warn(sprintf("savesym: sym_%x => %s\n", $$obj, $value)); # debug
+ $symtable{sprintf("sym_%x", $$obj)} = $value;
+}
+
+sub objsym {
+ my $obj = shift;
+ return $symtable{sprintf("sym_%x", $$obj)};
+}
+
+sub walkoptree_exec {
+ my ($op, $method, $level) = @_;
+ $level ||= 0;
+ my ($sym, $ppname);
+ my $prefix = " " x $level;
+ for (; $$op; $op = $op->next) {
+ $sym = objsym($op);
+ if (defined($sym)) {
+ print $prefix, "goto $sym\n";
+ return;
+ }
+ savesym($op, sprintf("%s (0x%lx)", class($op), $$op));
+ $op->$method($level);
+ $ppname = $op->name;
+ if ($ppname =~
+ /^(d?or(assign)?|and(assign)?|mapwhile|grepwhile|entertry|range|cond_expr)$/)
+ {
+ print $prefix, uc($1), " => {\n";
+ walkoptree_exec($op->other, $method, $level + 1);
+ print $prefix, "}\n";
+ } elsif ($ppname eq "match" || $ppname eq "subst") {
+ my $pmreplstart = $op->pmreplstart;
+ if ($$pmreplstart) {
+ print $prefix, "PMREPLSTART => {\n";
+ walkoptree_exec($pmreplstart, $method, $level + 1);
+ print $prefix, "}\n";
+ }
+ } elsif ($ppname eq "substcont") {
+ print $prefix, "SUBSTCONT => {\n";
+ walkoptree_exec($op->other->pmreplstart, $method, $level + 1);
+ print $prefix, "}\n";
+ $op = $op->other;
+ } elsif ($ppname eq "enterloop") {
+ print $prefix, "REDO => {\n";
+ walkoptree_exec($op->redoop, $method, $level + 1);
+ print $prefix, "}\n", $prefix, "NEXT => {\n";
+ walkoptree_exec($op->nextop, $method, $level + 1);
+ print $prefix, "}\n", $prefix, "LAST => {\n";
+ walkoptree_exec($op->lastop, $method, $level + 1);
+ print $prefix, "}\n";
+ } elsif ($ppname eq "subst") {
+ my $replstart = $op->pmreplstart;
+ if ($$replstart) {
+ print $prefix, "SUBST => {\n";
+ walkoptree_exec($replstart, $method, $level + 1);
+ print $prefix, "}\n";
+ }
+ }
+ }
+}
+
+sub walksymtable {
+ my ($symref, $method, $recurse, $prefix) = @_;
+ my $sym;
+ my $ref;
+ my $fullname;
+ no strict 'refs';
+ $prefix = '' unless defined $prefix;
+ while (($sym, $ref) = each %$symref) {
+ $fullname = "*main::".$prefix.$sym;
+ if ($sym =~ /::$/) {
+ $sym = $prefix . $sym;
+ if (svref_2object(\*$sym)->NAME ne "main::" && $sym ne "<none>::" && &$recurse($sym)) {
+ walksymtable(\%$fullname, $method, $recurse, $sym);
+ }
+ } else {
+ svref_2object(\*$fullname)->$method();
+ }
+ }
+}
+
+{
+ package B::Section;
+ my $output_fh;
+ my %sections;
+
+ sub new {
+ my ($class, $section, $symtable, $default) = @_;
+ $output_fh ||= FileHandle->new_tmpfile;
+ my $obj = bless [-1, $section, $symtable, $default], $class;
+ $sections{$section} = $obj;
+ return $obj;
+ }
+
+ sub get {
+ my ($class, $section) = @_;
+ return $sections{$section};
+ }
+
+ sub add {
+ my $section = shift;
+ while (defined($_ = shift)) {
+ print $output_fh "$section->[1]\t$_\n";
+ $section->[0]++;
+ }
+ }
+
+ sub index {
+ my $section = shift;
+ return $section->[0];
+ }
+
+ sub name {
+ my $section = shift;
+ return $section->[1];
+ }
+
+ sub symtable {
+ my $section = shift;
+ return $section->[2];
+ }
+
+ sub default {
+ my $section = shift;
+ return $section->[3];
+ }
+
+ sub output {
+ my ($section, $fh, $format) = @_;
+ my $name = $section->name;
+ my $sym = $section->symtable || {};
+ my $default = $section->default;
+
+ seek($output_fh, 0, 0);
+ while (<$output_fh>) {
+ chomp;
+ s/^(.*?)\t//;
+ if ($1 eq $name) {
+ s{(s\\_[0-9a-f]+)} {
+ exists($sym->{$1}) ? $sym->{$1} : $default;
+ }ge;
+ printf $fh $format, $_;
+ }
+ }
+ }
+}
+
+XSLoader::load 'B';
+
+1;
+
+__END__
+
+=head1 NAME
+
+B - The Perl Compiler
+
+=head1 SYNOPSIS
+
+ use B;
+
+=head1 DESCRIPTION
+
+The C<B> module supplies classes which allow a Perl program to delve
+into its own innards. It is the module used to implement the
+"backends" of the Perl compiler. Usage of the compiler does not
+require knowledge of this module: see the F<O> module for the
+user-visible part. The C<B> module is of use to those who want to
+write new compiler backends. This documentation assumes that the
+reader knows a fair amount about perl's internals including such
+things as SVs, OPs and the internal symbol table and syntax tree
+of a program.
+
+=head1 OVERVIEW
+
+The C<B> module contains a set of utility functions for querying the
+current state of the Perl interpreter; typically these functions
+return objects from the B::SV and B::OP classes, or their derived
+classes. These classes in turn define methods for querying the
+resulting objects about their own internal state.
+
+=head1 Utility Functions
+
+The C<B> module exports a variety of functions: some are simple
+utility functions, others provide a Perl program with a way to
+get an initial "handle" on an internal object.
+
+=head2 Functions Returning C<B::SV>, C<B::AV>, C<B::HV>, and C<B::CV> objects
+
+For descriptions of the class hierarchy of these objects and the
+methods that can be called on them, see below, L<"OVERVIEW OF
+CLASSES"> and L<"SV-RELATED CLASSES">.
+
+=over 4
+
+=item sv_undef
+
+Returns the SV object corresponding to the C variable C<sv_undef>.
+
+=item sv_yes
+
+Returns the SV object corresponding to the C variable C<sv_yes>.
+
+=item sv_no
+
+Returns the SV object corresponding to the C variable C<sv_no>.
+
+=item svref_2object(SVREF)
+
+Takes a reference to any Perl value, and turns the referred-to value
+into an object in the appropriate B::OP-derived or B::SV-derived
+class. Apart from functions such as C<main_root>, this is the primary
+way to get an initial "handle" on an internal perl data structure
+which can then be followed with the other access methods.
+
+The returned object will only be valid as long as the underlying OPs
+and SVs continue to exist. Do not attempt to use the object after the
+underlying structures are freed.
+
+=item amagic_generation
+
+Returns the SV object corresponding to the C variable C<amagic_generation>.
+
+=item init_av
+
+Returns the AV object (i.e. in class B::AV) representing INIT blocks.
+
+=item check_av
+
+Returns the AV object (i.e. in class B::AV) representing CHECK blocks.
+
+=item unitcheck_av
+
+Returns the AV object (i.e. in class B::AV) representing UNITCHECK blocks.
+
+=item begin_av
+
+Returns the AV object (i.e. in class B::AV) representing BEGIN blocks.
+
+=item end_av
+
+Returns the AV object (i.e. in class B::AV) representing END blocks.
+
+=item comppadlist
+
+Returns the AV object (i.e. in class B::AV) of the global comppadlist.
+
+=item regex_padav
+
+Only when perl was compiled with ithreads.
+
+=item main_cv
+
+Return the (faked) CV corresponding to the main part of the Perl
+program.
+
+=back
+
+=head2 Functions for Examining the Symbol Table
+
+=over 4
+
+=item walksymtable(SYMREF, METHOD, RECURSE, PREFIX)
+
+Walk the symbol table starting at SYMREF and call METHOD on each
+symbol (a B::GV object) visited. When the walk reaches package
+symbols (such as "Foo::") it invokes RECURSE, passing in the symbol
+name, and only recurses into the package if that sub returns true.
+
+PREFIX is the name of the SYMREF you're walking.
+
+For example:
+
+ # Walk CGI's symbol table calling print_subs on each symbol.
+ # Recurse only into CGI::Util::
+ walksymtable(\%CGI::, 'print_subs', sub { $_[0] eq 'CGI::Util::' },
+ 'CGI::');
+
+print_subs() is a B::GV method you have declared. Also see L<"B::GV
+Methods">, below.
+
+=back
+
+=head2 Functions Returning C<B::OP> objects or for walking op trees
+
+For descriptions of the class hierarchy of these objects and the
+methods that can be called on them, see below, L<"OVERVIEW OF
+CLASSES"> and L<"OP-RELATED CLASSES">.
+
+=over 4
+
+=item main_root
+
+Returns the root op (i.e. an object in the appropriate B::OP-derived
+class) of the main part of the Perl program.
+
+=item main_start
+
+Returns the starting op of the main part of the Perl program.
+
+=item walkoptree(OP, METHOD)
+
+Does a tree-walk of the syntax tree based at OP and calls METHOD on
+each op it visits. Each node is visited before its children. If
+C<walkoptree_debug> (see below) has been called to turn debugging on then
+the method C<walkoptree_debug> is called on each op before METHOD is
+called.
+
+=item walkoptree_debug(DEBUG)
+
+Returns the current debugging flag for C<walkoptree>. If the optional
+DEBUG argument is non-zero, it sets the debugging flag to that. See
+the description of C<walkoptree> above for what the debugging flag
+does.
+
+=back
+
+=head2 Miscellaneous Utility Functions
+
+=over 4
+
+=item ppname(OPNUM)
+
+Return the PP function name (e.g. "pp_add") of op number OPNUM.
+
+=item hash(STR)
+
+Returns a string in the form "0x..." representing the value of the
+internal hash function used by perl on string STR.
+
+=item cast_I32(I)
+
+Casts I to the internal I32 type used by that perl.
+
+=item minus_c
+
+Does the equivalent of the C<-c> command-line option. Obviously, this
+is only useful in a BEGIN block or else the flag is set too late.
+
+=item cstring(STR)
+
+Returns a double-quote-surrounded escaped version of STR which can
+be used as a string in C source code.
+
+=item perlstring(STR)
+
+Returns a double-quote-surrounded escaped version of STR which can
+be used as a string in Perl source code.
+
+=item class(OBJ)
+
+Returns the class of an object without the part of the classname
+preceding the first C<"::">. This is used to turn C<"B::UNOP"> into
+C<"UNOP"> for example.
+
+=item threadsv_names
+
+In a perl compiled for threads, this returns a list of the special
+per-thread threadsv variables.
+
+=back
+
+=head2 Exported utility variabiles
+
+=over 4
+
+=item @optype
+
+ my $op_type = $optype[$op_type_num];
+
+A simple mapping of the op type number to its type (like 'COP' or 'BINOP').
+
+=item @specialsv_name
+
+ my $sv_name = $specialsv_name[$sv_index];
+
+Certain SV types are considered 'special'. They're represented by
+B::SPECIAL and are referred to by a number from the specialsv_list.
+This array maps that number back to the name of the SV (like 'Nullsv'
+or '&PL_sv_undef').
+
+=back
+
+
+=head1 OVERVIEW OF CLASSES
+
+The C structures used by Perl's internals to hold SV and OP
+information (PVIV, AV, HV, ..., OP, SVOP, UNOP, ...) are modelled on a
+class hierarchy and the C<B> module gives access to them via a true
+object hierarchy. Structure fields which point to other objects
+(whether types of SV or types of OP) are represented by the C<B>
+module as Perl objects of the appropriate class.
+
+The bulk of the C<B> module is the methods for accessing fields of
+these structures.
+
+Note that all access is read-only. You cannot modify the internals by
+using this module. Also, note that the B::OP and B::SV objects created
+by this module are only valid for as long as the underlying objects
+exist; their creation doesn't increase the reference counts of the
+underlying objects. Trying to access the fields of a freed object will
+give incomprehensible results, or worse.
+
+=head2 SV-RELATED CLASSES
+
+B::IV, B::NV, B::RV, B::PV, B::PVIV, B::PVNV, B::PVMG, B::BM (5.9.5 and
+earlier), B::PVLV, B::AV, B::HV, B::CV, B::GV, B::FM, B::IO. These classes
+correspond in the obvious way to the underlying C structures of similar names.
+The inheritance hierarchy mimics the underlying C "inheritance". For the
+5.10.x branch, (I<ie> 5.10.0, 5.10.1 I<etc>) this is:
+
+ B::SV
+ |
+ +------------+------------+------------+
+ | | | |
+ B::PV B::IV B::NV B::RV
+ \ / /
+ \ / /
+ B::PVIV /
+ \ /
+ \ /
+ \ /
+ B::PVNV
+ |
+ |
+ B::PVMG
+ |
+ +-----+-----+-----+-----+
+ | | | | |
+ B::AV B::GV B::HV B::CV B::IO
+ | |
+ | |
+ B::PVLV B::FM
+
+For 5.9.0 and earlier, PVLV is a direct subclass of PVMG, and BM is still
+present as a distinct type, so the base of this diagram is
+
+
+ |
+ |
+ B::PVMG
+ |
+ +------+-----+-----+-----+-----+-----+
+ | | | | | | |
+ B::PVLV B::BM B::AV B::GV B::HV B::CV B::IO
+ |
+ |
+ B::FM
+
+For 5.11.0 and later, B::RV is abolished, and IVs can be used to store
+references, and a new type B::REGEXP is introduced, giving this structure:
+
+ B::SV
+ |
+ +------------+------------+
+ | | |
+ B::PV B::IV B::NV
+ \ / /
+ \ / /
+ B::PVIV /
+ \ /
+ \ /
+ \ /
+ B::PVNV
+ |
+ |
+ B::PVMG
+ |
+ +-------+-------+---+---+-------+-------+
+ | | | | | |
+ B::AV B::GV B::HV B::CV B::IO B::REGEXP
+ | |
+ | |
+ B::PVLV B::FM
+
+
+Access methods correspond to the underlying C macros for field access,
+usually with the leading "class indication" prefix removed (Sv, Av,
+Hv, ...). The leading prefix is only left in cases where its removal
+would cause a clash in method name. For example, C<GvREFCNT> stays
+as-is since its abbreviation would clash with the "superclass" method
+C<REFCNT> (corresponding to the C function C<SvREFCNT>).
+
+=head2 B::SV Methods
+
+=over 4
+
+=item REFCNT
+
+=item FLAGS
+
+=item object_2svref
+
+Returns a reference to the regular scalar corresponding to this
+B::SV object. In other words, this method is the inverse operation
+to the svref_2object() subroutine. This scalar and other data it points
+at should be considered read-only: modifying them is neither safe nor
+guaranteed to have a sensible effect.
+
+=back
+
+=head2 B::IV Methods
+
+=over 4
+
+=item IV
+
+Returns the value of the IV, I<interpreted as
+a signed integer>. This will be misleading
+if C<FLAGS & SVf_IVisUV>. Perhaps you want the
+C<int_value> method instead?
+
+=item IVX
+
+=item UVX
+
+=item int_value
+
+This method returns the value of the IV as an integer.
+It differs from C<IV> in that it returns the correct
+value regardless of whether it's stored signed or
+unsigned.
+
+=item needs64bits
+
+=item packiv
+
+=back
+
+=head2 B::NV Methods
+
+=over 4
+
+=item NV
+
+=item NVX
+
+=back
+
+=head2 B::RV Methods
+
+=over 4
+
+=item RV
+
+=back
+
+=head2 B::PV Methods
+
+=over 4
+
+=item PV
+
+This method is the one you usually want. It constructs a
+string using the length and offset information in the struct:
+for ordinary scalars it will return the string that you'd see
+from Perl, even if it contains null characters.
+
+=item RV
+
+Same as B::RV::RV, except that it will die() if the PV isn't
+a reference.
+
+=item PVX
+
+This method is less often useful. It assumes that the string
+stored in the struct is null-terminated, and disregards the
+length information.
+
+It is the appropriate method to use if you need to get the name
+of a lexical variable from a padname array. Lexical variable names
+are always stored with a null terminator, and the length field
+(SvCUR) is overloaded for other purposes and can't be relied on here.
+
+=back
+
+=head2 B::PVMG Methods
+
+=over 4
+
+=item MAGIC
+
+=item SvSTASH
+
+=back
+
+=head2 B::MAGIC Methods
+
+=over 4
+
+=item MOREMAGIC
+
+=item precomp
+
+Only valid on r-magic, returns the string that generated the regexp.
+
+=item PRIVATE
+
+=item TYPE
+
+=item FLAGS
+
+=item OBJ
+
+Will die() if called on r-magic.
+
+=item PTR
+
+=item REGEX
+
+Only valid on r-magic, returns the integer value of the REGEX stored
+in the MAGIC.
+
+=back
+
+=head2 B::PVLV Methods
+
+=over 4
+
+=item TARGOFF
+
+=item TARGLEN
+
+=item TYPE
+
+=item TARG
+
+=back
+
+=head2 B::BM Methods
+
+=over 4
+
+=item USEFUL
+
+=item PREVIOUS
+
+=item RARE
+
+=item TABLE
+
+=back
+
+=head2 B::GV Methods
+
+=over 4
+
+=item is_empty
+
+This method returns TRUE if the GP field of the GV is NULL.
+
+=item NAME
+
+=item SAFENAME
+
+This method returns the name of the glob, but if the first
+character of the name is a control character, then it converts
+it to ^X first, so that *^G would return "^G" rather than "\cG".
+
+It's useful if you want to print out the name of a variable.
+If you restrict yourself to globs which exist at compile-time
+then the result ought to be unambiguous, because code like
+C<${"^G"} = 1> is compiled as two ops - a constant string and
+a dereference (rv2gv) - so that the glob is created at runtime.
+
+If you're working with globs at runtime, and need to disambiguate
+*^G from *{"^G"}, then you should use the raw NAME method.
+
+=item STASH
+
+=item SV
+
+=item IO
+
+=item FORM
+
+=item AV
+
+=item HV
+
+=item EGV
+
+=item CV
+
+=item CVGEN
+
+=item LINE
+
+=item FILE
+
+=item FILEGV
+
+=item GvREFCNT
+
+=item FLAGS
+
+=back
+
+=head2 B::IO Methods
+
+=over 4
+
+=item LINES
+
+=item PAGE
+
+=item PAGE_LEN
+
+=item LINES_LEFT
+
+=item TOP_NAME
+
+=item TOP_GV
+
+=item FMT_NAME
+
+=item FMT_GV
+
+=item BOTTOM_NAME
+
+=item BOTTOM_GV
+
+=item SUBPROCESS
+
+=item IoTYPE
+
+=item IoFLAGS
+
+=item IsSTD
+
+Takes one arguments ( 'stdin' | 'stdout' | 'stderr' ) and returns true
+if the IoIFP of the object is equal to the handle whose name was
+passed as argument ( i.e. $io->IsSTD('stderr') is true if
+IoIFP($io) == PerlIO_stdin() ).
+
+=back
+
+=head2 B::AV Methods
+
+=over 4
+
+=item FILL
+
+=item MAX
+
+=item ARRAY
+
+=item ARRAYelt
+
+Like C<ARRAY>, but takes an index as an argument to get only one element,
+rather than a list of all of them.
+
+=item OFF
+
+This method is deprecated if running under Perl 5.8, and is no longer present
+if running under Perl 5.9
+
+=item AvFLAGS
+
+This method returns the AV specific flags. In Perl 5.9 these are now stored
+in with the main SV flags, so this method is no longer present.
+
+=back
+
+=head2 B::CV Methods
+
+=over 4
+
+=item STASH
+
+=item START
+
+=item ROOT
+
+=item GV
+
+=item FILE
+
+=item DEPTH
+
+=item PADLIST
+
+=item OUTSIDE
+
+=item OUTSIDE_SEQ
+
+=item XSUB
+
+=item XSUBANY
+
+For constant subroutines, returns the constant SV returned by the subroutine.
+
+=item CvFLAGS
+
+=item const_sv
+
+=back
+
+=head2 B::HV Methods
+
+=over 4
+
+=item FILL
+
+=item MAX
+
+=item KEYS
+
+=item RITER
+
+=item NAME
+
+=item ARRAY
+
+=item PMROOT
+
+This method is not present if running under Perl 5.9, as the PMROOT
+information is no longer stored directly in the hash.
+
+=back
+
+=head2 OP-RELATED CLASSES
+
+C<B::OP>, C<B::UNOP>, C<B::BINOP>, C<B::LOGOP>, C<B::LISTOP>, C<B::PMOP>,
+C<B::SVOP>, C<B::PADOP>, C<B::PVOP>, C<B::LOOP>, C<B::COP>.
+
+These classes correspond in the obvious way to the underlying C
+structures of similar names. The inheritance hierarchy mimics the
+underlying C "inheritance":
+
+ B::OP
+ |
+ +---------------+--------+--------+-------+
+ | | | | |
+ B::UNOP B::SVOP B::PADOP B::COP B::PVOP
+ ,' `-.
+ / `--.
+ B::BINOP B::LOGOP
+ |
+ |
+ B::LISTOP
+ ,' `.
+ / \
+ B::LOOP B::PMOP
+
+Access methods correspond to the underlying C structre field names,
+with the leading "class indication" prefix (C<"op_">) removed.
+
+=head2 B::OP Methods
+
+These methods get the values of similarly named fields within the OP
+data structure. See top of C<op.h> for more info.
+
+=over 4
+
+=item next
+
+=item sibling
+
+=item name
+
+This returns the op name as a string (e.g. "add", "rv2av").
+
+=item ppaddr
+
+This returns the function name as a string (e.g. "PL_ppaddr[OP_ADD]",
+"PL_ppaddr[OP_RV2AV]").
+
+=item desc
+
+This returns the op description from the global C PL_op_desc array
+(e.g. "addition" "array deref").
+
+=item targ
+
+=item type
+
+=item opt
+
+=item flags
+
+=item private
+
+=item spare
+
+=back
+
+=head2 B::UNOP METHOD
+
+=over 4
+
+=item first
+
+=back
+
+=head2 B::BINOP METHOD
+
+=over 4
+
+=item last
+
+=back
+
+=head2 B::LOGOP METHOD
+
+=over 4
+
+=item other
+
+=back
+
+=head2 B::LISTOP METHOD
+
+=over 4
+
+=item children
+
+=back
+
+=head2 B::PMOP Methods
+
+=over 4
+
+=item pmreplroot
+
+=item pmreplstart
+
+=item pmnext
+
+Only up to Perl 5.9.4
+
+=item pmregexp
+
+=item pmflags
+
+=item extflags
+
+Since Perl 5.9.5
+
+=item precomp
+
+=item pmoffset
+
+Only when perl was compiled with ithreads.
+
+=back
+
+=head2 B::SVOP METHOD
+
+=over 4
+
+=item sv
+
+=item gv
+
+=back
+
+=head2 B::PADOP METHOD
+
+=over 4
+
+=item padix
+
+=back
+
+=head2 B::PVOP METHOD
+
+=over 4
+
+=item pv
+
+=back
+
+=head2 B::LOOP Methods
+
+=over 4
+
+=item redoop
+
+=item nextop
+
+=item lastop
+
+=back
+
+=head2 B::COP Methods
+
+=over 4
+
+=item label
+
+=item stash
+
+=item stashpv
+
+=item file
+
+=item cop_seq
+
+=item arybase
+
+=item line
+
+=item warnings
+
+=item io
+
+=item hints
+
+=item hints_hash
+
+=back
+
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/B/Concise.pm b/Master/tlpkg/tlperl.straw/lib/B/Concise.pm
new file mode 100755
index 00000000000..284f797612c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/B/Concise.pm
@@ -0,0 +1,1835 @@
+package B::Concise;
+# Copyright (C) 2000-2003 Stephen McCamant. All rights reserved.
+# This program is free software; you can redistribute and/or modify it
+# under the same terms as Perl itself.
+
+# Note: we need to keep track of how many use declarations/BEGIN
+# blocks this module uses, so we can avoid printing them when user
+# asks for the BEGIN blocks in her program. Update the comments and
+# the count in concise_specials if you add or delete one. The
+# -MO=Concise counts as use #1.
+
+use strict; # use #2
+use warnings; # uses #3 and #4, since warnings uses Carp
+
+use Exporter (); # use #5
+
+our $VERSION = "0.76";
+our @ISA = qw(Exporter);
+our @EXPORT_OK = qw( set_style set_style_standard add_callback
+ concise_subref concise_cv concise_main
+ add_style walk_output compile reset_sequence );
+our %EXPORT_TAGS =
+ ( io => [qw( walk_output compile reset_sequence )],
+ style => [qw( add_style set_style_standard )],
+ cb => [qw( add_callback )],
+ mech => [qw( concise_subref concise_cv concise_main )], );
+
+# use #6
+use B qw(class ppname main_start main_root main_cv cstring svref_2object
+ SVf_IOK SVf_NOK SVf_POK SVf_IVisUV SVf_FAKE OPf_KIDS OPf_SPECIAL
+ CVf_ANON PAD_FAKELEX_ANON PAD_FAKELEX_MULTI SVf_ROK);
+
+my %style =
+ ("terse" =>
+ ["(?(#label =>\n)?)(*( )*)#class (#addr) #name (?([#targ])?) "
+ . "#svclass~(?((#svaddr))?)~#svval~(?(label \"#coplabel\")?)\n",
+ "(*( )*)goto #class (#addr)\n",
+ "#class pp_#name"],
+ "concise" =>
+ ["#hyphseq2 (*( (x( ;)x))*)<#classsym> #exname#arg(?([#targarglife])?)"
+ . "~#flags(?(/#private)?)(?(:#hints)?)(x(;~->#next)x)\n"
+ , " (*( )*) goto #seq\n",
+ "(?(<#seq>)?)#exname#arg(?([#targarglife])?)"],
+ "linenoise" =>
+ ["(x(;(*( )*))x)#noise#arg(?([#targarg])?)(x( ;\n)x)",
+ "gt_#seq ",
+ "(?(#seq)?)#noise#arg(?([#targarg])?)"],
+ "debug" =>
+ ["#class (#addr)\n\top_next\t\t#nextaddr\n\top_sibling\t#sibaddr\n\t"
+ . "op_ppaddr\tPL_ppaddr[OP_#NAME]\n\top_type\t\t#typenum\n" .
+ ($] > 5.009 ? '' : "\top_seq\t\t#seqnum\n")
+ . "\top_flags\t#flagval\n\top_private\t#privval\t#hintsval\n"
+ . "(?(\top_first\t#firstaddr\n)?)(?(\top_last\t\t#lastaddr\n)?)"
+ . "(?(\top_sv\t\t#svaddr\n)?)",
+ " GOTO #addr\n",
+ "#addr"],
+ "env" => [$ENV{B_CONCISE_FORMAT}, $ENV{B_CONCISE_GOTO_FORMAT},
+ $ENV{B_CONCISE_TREE_FORMAT}],
+ );
+
+# Renderings, ie how Concise prints, is controlled by these vars
+# primary:
+our $stylename; # selects current style from %style
+my $order = "basic"; # how optree is walked & printed: basic, exec, tree
+
+# rendering mechanics:
+# these 'formats' are the line-rendering templates
+# they're updated from %style when $stylename changes
+my ($format, $gotofmt, $treefmt);
+
+# lesser players:
+my $base = 36; # how <sequence#> is displayed
+my $big_endian = 1; # more <sequence#> display
+my $tree_style = 0; # tree-order details
+my $banner = 1; # print banner before optree is traversed
+my $do_main = 0; # force printing of main routine
+my $show_src; # show source code
+
+# another factor: can affect all styles!
+our @callbacks; # allow external management
+
+set_style_standard("concise");
+
+my $curcv;
+my $cop_seq_base;
+
+sub set_style {
+ ($format, $gotofmt, $treefmt) = @_;
+ #warn "set_style: deprecated, use set_style_standard instead\n"; # someday
+ die "expecting 3 style-format args\n" unless @_ == 3;
+}
+
+sub add_style {
+ my ($newstyle,@args) = @_;
+ die "style '$newstyle' already exists, choose a new name\n"
+ if exists $style{$newstyle};
+ die "expecting 3 style-format args\n" unless @args == 3;
+ $style{$newstyle} = [@args];
+ $stylename = $newstyle; # update rendering state
+}
+
+sub set_style_standard {
+ ($stylename) = @_; # update rendering state
+ die "err: style '$stylename' unknown\n" unless exists $style{$stylename};
+ set_style(@{$style{$stylename}});
+}
+
+sub add_callback {
+ push @callbacks, @_;
+}
+
+# output handle, used with all Concise-output printing
+our $walkHandle; # public for your convenience
+BEGIN { $walkHandle = \*STDOUT }
+
+sub walk_output { # updates $walkHandle
+ my $handle = shift;
+ return $walkHandle unless $handle; # allow use as accessor
+
+ if (ref $handle eq 'SCALAR') {
+ require Config;
+ die "no perlio in this build, can't call walk_output (\\\$scalar)\n"
+ unless $Config::Config{useperlio};
+ # in 5.8+, open(FILEHANDLE,MODE,REFERENCE) writes to string
+ open my $tmp, '>', $handle; # but cant re-set existing STDOUT
+ $walkHandle = $tmp; # so use my $tmp as intermediate var
+ return $walkHandle;
+ }
+ my $iotype = ref $handle;
+ die "expecting argument/object that can print\n"
+ unless $iotype eq 'GLOB' or $iotype and $handle->can('print');
+ $walkHandle = $handle;
+}
+
+sub concise_subref {
+ my($order, $coderef, $name) = @_;
+ my $codeobj = svref_2object($coderef);
+
+ return concise_stashref(@_)
+ unless ref $codeobj eq 'B::CV';
+ concise_cv_obj($order, $codeobj, $name);
+}
+
+sub concise_stashref {
+ my($order, $h) = @_;
+ local *s;
+ foreach my $k (sort keys %$h) {
+ next unless defined $h->{$k};
+ *s = $h->{$k};
+ my $coderef = *s{CODE} or next;
+ reset_sequence();
+ print "FUNC: ", *s, "\n";
+ my $codeobj = svref_2object($coderef);
+ next unless ref $codeobj eq 'B::CV';
+ eval { concise_cv_obj($order, $codeobj, $k) };
+ warn "err $@ on $codeobj" if $@;
+ }
+}
+
+# This should have been called concise_subref, but it was exported
+# under this name in versions before 0.56
+*concise_cv = \&concise_subref;
+
+sub concise_cv_obj {
+ my ($order, $cv, $name) = @_;
+ # name is either a string, or a CODE ref (copy of $cv arg??)
+
+ $curcv = $cv;
+
+ if (ref($cv->XSUBANY) =~ /B::(\w+)/) {
+ print $walkHandle "$name is a constant sub, optimized to a $1\n";
+ return;
+ }
+ if ($cv->XSUB) {
+ print $walkHandle "$name is XS code\n";
+ return;
+ }
+ if (class($cv->START) eq "NULL") {
+ no strict 'refs';
+ if (ref $name eq 'CODE') {
+ print $walkHandle "coderef $name has no START\n";
+ }
+ elsif (exists &$name) {
+ print $walkHandle "$name exists in stash, but has no START\n";
+ }
+ else {
+ print $walkHandle "$name not in symbol table\n";
+ }
+ return;
+ }
+ sequence($cv->START);
+ if ($order eq "exec") {
+ walk_exec($cv->START);
+ }
+ elsif ($order eq "basic") {
+ # walk_topdown($cv->ROOT, sub { $_[0]->concise($_[1]) }, 0);
+ my $root = $cv->ROOT;
+ unless (ref $root eq 'B::NULL') {
+ walk_topdown($root, sub { $_[0]->concise($_[1]) }, 0);
+ } else {
+ print $walkHandle "B::NULL encountered doing ROOT on $cv. avoiding disaster\n";
+ }
+ } else {
+ print $walkHandle tree($cv->ROOT, 0);
+ }
+}
+
+sub concise_main {
+ my($order) = @_;
+ sequence(main_start);
+ $curcv = main_cv;
+ if ($order eq "exec") {
+ return if class(main_start) eq "NULL";
+ walk_exec(main_start);
+ } elsif ($order eq "tree") {
+ return if class(main_root) eq "NULL";
+ print $walkHandle tree(main_root, 0);
+ } elsif ($order eq "basic") {
+ return if class(main_root) eq "NULL";
+ walk_topdown(main_root,
+ sub { $_[0]->concise($_[1]) }, 0);
+ }
+}
+
+sub concise_specials {
+ my($name, $order, @cv_s) = @_;
+ my $i = 1;
+ if ($name eq "BEGIN") {
+ splice(@cv_s, 0, 8); # skip 7 BEGIN blocks in this file. NOW 8 ??
+ } elsif ($name eq "CHECK") {
+ pop @cv_s; # skip the CHECK block that calls us
+ }
+ for my $cv (@cv_s) {
+ print $walkHandle "$name $i:\n";
+ $i++;
+ concise_cv_obj($order, $cv, $name);
+ }
+}
+
+my $start_sym = "\e(0"; # "\cN" sometimes also works
+my $end_sym = "\e(B"; # "\cO" respectively
+
+my @tree_decorations =
+ ([" ", "--", "+-", "|-", "| ", "`-", "-", 1],
+ [" ", "-", "+", "+", "|", "`", "", 0],
+ [" ", map("$start_sym$_$end_sym", "qq", "wq", "tq", "x ", "mq", "q"), 1],
+ [" ", map("$start_sym$_$end_sym", "q", "w", "t", "x", "m"), "", 0],
+ );
+
+my @render_packs; # collect -stash=<packages>
+
+sub compileOpts {
+ # set rendering state from options and args
+ my (@options,@args);
+ if (@_) {
+ @options = grep(/^-/, @_);
+ @args = grep(!/^-/, @_);
+ }
+ for my $o (@options) {
+ # mode/order
+ if ($o eq "-basic") {
+ $order = "basic";
+ } elsif ($o eq "-exec") {
+ $order = "exec";
+ } elsif ($o eq "-tree") {
+ $order = "tree";
+ }
+ # tree-specific
+ elsif ($o eq "-compact") {
+ $tree_style |= 1;
+ } elsif ($o eq "-loose") {
+ $tree_style &= ~1;
+ } elsif ($o eq "-vt") {
+ $tree_style |= 2;
+ } elsif ($o eq "-ascii") {
+ $tree_style &= ~2;
+ }
+ # sequence numbering
+ elsif ($o =~ /^-base(\d+)$/) {
+ $base = $1;
+ } elsif ($o eq "-bigendian") {
+ $big_endian = 1;
+ } elsif ($o eq "-littleendian") {
+ $big_endian = 0;
+ }
+ # miscellaneous, presentation
+ elsif ($o eq "-nobanner") {
+ $banner = 0;
+ } elsif ($o eq "-banner") {
+ $banner = 1;
+ }
+ elsif ($o eq "-main") {
+ $do_main = 1;
+ } elsif ($o eq "-nomain") {
+ $do_main = 0;
+ } elsif ($o eq "-src") {
+ $show_src = 1;
+ }
+ elsif ($o =~ /^-stash=(.*)/) {
+ my $pkg = $1;
+ no strict 'refs';
+ if (!defined %{$pkg.'::'}) {
+ eval "require $pkg";
+ } else {
+ require Config;
+ if (!$Config::Config{usedl}
+ && keys %{$pkg.'::'} == 1
+ && $pkg->can('bootstrap')) {
+ # It is something that we're staticly linked to, but hasn't
+ # yet been used.
+ eval "require $pkg";
+ }
+ }
+ push @render_packs, $pkg;
+ }
+ # line-style options
+ elsif (exists $style{substr($o, 1)}) {
+ $stylename = substr($o, 1);
+ set_style_standard($stylename);
+ } else {
+ warn "Option $o unrecognized";
+ }
+ }
+ return (@args);
+}
+
+sub compile {
+ my (@args) = compileOpts(@_);
+ return sub {
+ my @newargs = compileOpts(@_); # accept new rendering options
+ warn "disregarding non-options: @newargs\n" if @newargs;
+
+ for my $objname (@args) {
+ next unless $objname; # skip null args to avoid noisy responses
+
+ if ($objname eq "BEGIN") {
+ concise_specials("BEGIN", $order,
+ B::begin_av->isa("B::AV") ?
+ B::begin_av->ARRAY : ());
+ } elsif ($objname eq "INIT") {
+ concise_specials("INIT", $order,
+ B::init_av->isa("B::AV") ?
+ B::init_av->ARRAY : ());
+ } elsif ($objname eq "CHECK") {
+ concise_specials("CHECK", $order,
+ B::check_av->isa("B::AV") ?
+ B::check_av->ARRAY : ());
+ } elsif ($objname eq "UNITCHECK") {
+ concise_specials("UNITCHECK", $order,
+ B::unitcheck_av->isa("B::AV") ?
+ B::unitcheck_av->ARRAY : ());
+ } elsif ($objname eq "END") {
+ concise_specials("END", $order,
+ B::end_av->isa("B::AV") ?
+ B::end_av->ARRAY : ());
+ }
+ else {
+ # convert function names to subrefs
+ my $objref;
+ if (ref $objname) {
+ print $walkHandle "B::Concise::compile($objname)\n"
+ if $banner;
+ $objref = $objname;
+ } else {
+ $objname = "main::" . $objname unless $objname =~ /::/;
+ print $walkHandle "$objname:\n";
+ no strict 'refs';
+ unless (exists &$objname) {
+ print $walkHandle "err: unknown function ($objname)\n";
+ return;
+ }
+ $objref = \&$objname;
+ }
+ concise_subref($order, $objref, $objname);
+ }
+ }
+ for my $pkg (@render_packs) {
+ no strict 'refs';
+ concise_stashref($order, \%{$pkg.'::'});
+ }
+
+ if (!@args or $do_main or @render_packs) {
+ print $walkHandle "main program:\n" if $do_main;
+ concise_main($order);
+ }
+ return @args; # something
+ }
+}
+
+my %labels;
+my $lastnext; # remembers op-chain, used to insert gotos
+
+my %opclass = ('OP' => "0", 'UNOP' => "1", 'BINOP' => "2", 'LOGOP' => "|",
+ 'LISTOP' => "@", 'PMOP' => "/", 'SVOP' => "\$", 'GVOP' => "*",
+ 'PVOP' => '"', 'LOOP' => "{", 'COP' => ";", 'PADOP' => "#");
+
+no warnings 'qw'; # "Possible attempt to put comments..."; use #7
+my @linenoise =
+ qw'# () sc ( @? 1 $* gv *{ m$ m@ m% m? p/ *$ $ $# & a& pt \\ s\\ rf bl
+ ` *? <> ?? ?/ r/ c/ // qr s/ /c y/ = @= C sC Cp sp df un BM po +1 +I
+ -1 -I 1+ I+ 1- I- ** * i* / i/ %$ i% x + i+ - i- . " << >> < i<
+ > i> <= i, >= i. == i= != i! <? i? s< s> s, s. s= s! s? b& b^ b| -0 -i
+ ! ~ a2 si cs rd sr e^ lg sq in %x %o ab le ss ve ix ri sf FL od ch cy
+ uf lf uc lc qm @ [f [ @[ eh vl ky dl ex % ${ @{ uk pk st jn ) )[ a@
+ a% sl +] -] [- [+ so rv GS GW MS MW .. f. .f && || ^^ ?: &= |= -> s{ s}
+ v} ca wa di rs ;; ; ;d }{ { } {} f{ it {l l} rt }l }n }r dm }g }e ^o
+ ^c ^| ^# um bm t~ u~ ~d DB db ^s se ^g ^r {w }w pf pr ^O ^K ^R ^W ^d ^v
+ ^e ^t ^k t. fc ic fl .s .p .b .c .l .a .h g1 s1 g2 s2 ?. l? -R -W -X -r
+ -w -x -e -o -O -z -s -M -A -C -S -c -b -f -d -p -l -u -g -k -t -T -B cd
+ co cr u. cm ut r. l@ s@ r@ mD uD oD rD tD sD wD cD f$ w$ p$ sh e$ k$ g3
+ g4 s4 g5 s5 T@ C@ L@ G@ A@ S@ Hg Hc Hr Hw Mg Mc Ms Mr Sg Sc So rq do {e
+ e} {t t} g6 G6 6e g7 G7 7e g8 G8 8e g9 G9 9e 6s 7s 8s 9s 6E 7E 8E 9E Pn
+ Pu GP SP EP Gn Gg GG SG EG g0 c$ lk t$ ;s n> // /= CO';
+
+my $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+sub op_flags { # common flags (see BASOP.op_flags in op.h)
+ my($x) = @_;
+ my(@v);
+ push @v, "v" if ($x & 3) == 1;
+ push @v, "s" if ($x & 3) == 2;
+ push @v, "l" if ($x & 3) == 3;
+ push @v, "K" if $x & 4;
+ push @v, "P" if $x & 8;
+ push @v, "R" if $x & 16;
+ push @v, "M" if $x & 32;
+ push @v, "S" if $x & 64;
+ push @v, "*" if $x & 128;
+ return join("", @v);
+}
+
+sub base_n {
+ my $x = shift;
+ return "-" . base_n(-$x) if $x < 0;
+ my $str = "";
+ do { $str .= substr($chars, $x % $base, 1) } while $x = int($x / $base);
+ $str = reverse $str if $big_endian;
+ return $str;
+}
+
+my %sequence_num;
+my $seq_max = 1;
+
+sub reset_sequence {
+ # reset the sequence
+ %sequence_num = ();
+ $seq_max = 1;
+ $lastnext = 0;
+}
+
+sub seq {
+ my($op) = @_;
+ return "-" if not exists $sequence_num{$$op};
+ return base_n($sequence_num{$$op});
+}
+
+sub walk_topdown {
+ my($op, $sub, $level) = @_;
+ $sub->($op, $level);
+ if ($op->flags & OPf_KIDS) {
+ for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
+ walk_topdown($kid, $sub, $level + 1);
+ }
+ }
+ elsif (class($op) eq "PMOP") {
+ my $maybe_root = $op->pmreplroot;
+ if (ref($maybe_root) and $maybe_root->isa("B::OP")) {
+ # It really is the root of the replacement, not something
+ # else stored here for lack of space elsewhere
+ walk_topdown($maybe_root, $sub, $level + 1);
+ }
+ }
+}
+
+sub walklines {
+ my($ar, $level) = @_;
+ for my $l (@$ar) {
+ if (ref($l) eq "ARRAY") {
+ walklines($l, $level + 1);
+ } else {
+ $l->concise($level);
+ }
+ }
+}
+
+sub walk_exec {
+ my($top, $level) = @_;
+ my %opsseen;
+ my @lines;
+ my @todo = ([$top, \@lines]);
+ while (@todo and my($op, $targ) = @{shift @todo}) {
+ for (; $$op; $op = $op->next) {
+ last if $opsseen{$$op}++;
+ push @$targ, $op;
+ my $name = $op->name;
+ if (class($op) eq "LOGOP") {
+ my $ar = [];
+ push @$targ, $ar;
+ push @todo, [$op->other, $ar];
+ } elsif ($name eq "subst" and $ {$op->pmreplstart}) {
+ my $ar = [];
+ push @$targ, $ar;
+ push @todo, [$op->pmreplstart, $ar];
+ } elsif ($name =~ /^enter(loop|iter)$/) {
+ if ($] > 5.009) {
+ $labels{${$op->nextop}} = "NEXT";
+ $labels{${$op->lastop}} = "LAST";
+ $labels{${$op->redoop}} = "REDO";
+ } else {
+ $labels{$op->nextop->seq} = "NEXT";
+ $labels{$op->lastop->seq} = "LAST";
+ $labels{$op->redoop->seq} = "REDO";
+ }
+ }
+ }
+ }
+ walklines(\@lines, 0);
+}
+
+# The structure of this routine is purposely modeled after op.c's peep()
+sub sequence {
+ my($op) = @_;
+ my $oldop = 0;
+ return if class($op) eq "NULL" or exists $sequence_num{$$op};
+ for (; $$op; $op = $op->next) {
+ last if exists $sequence_num{$$op};
+ my $name = $op->name;
+ if ($name =~ /^(null|scalar|lineseq|scope)$/) {
+ next if $oldop and $ {$op->next};
+ } else {
+ $sequence_num{$$op} = $seq_max++;
+ if (class($op) eq "LOGOP") {
+ my $other = $op->other;
+ $other = $other->next while $other->name eq "null";
+ sequence($other);
+ } elsif (class($op) eq "LOOP") {
+ my $redoop = $op->redoop;
+ $redoop = $redoop->next while $redoop->name eq "null";
+ sequence($redoop);
+ my $nextop = $op->nextop;
+ $nextop = $nextop->next while $nextop->name eq "null";
+ sequence($nextop);
+ my $lastop = $op->lastop;
+ $lastop = $lastop->next while $lastop->name eq "null";
+ sequence($lastop);
+ } elsif ($name eq "subst" and $ {$op->pmreplstart}) {
+ my $replstart = $op->pmreplstart;
+ $replstart = $replstart->next while $replstart->name eq "null";
+ sequence($replstart);
+ }
+ }
+ $oldop = $op;
+ }
+}
+
+sub fmt_line { # generate text-line for op.
+ my($hr, $op, $text, $level) = @_;
+
+ $_->($hr, $op, \$text, \$level, $stylename) for @callbacks;
+
+ return '' if $hr->{SKIP}; # suppress line if a callback said so
+ return '' if $hr->{goto} and $hr->{goto} eq '-'; # no goto nowhere
+
+ # spec: (?(text1#varText2)?)
+ $text =~ s/\(\?\(([^\#]*?)\#(\w+)([^\#]*?)\)\?\)/
+ $hr->{$2} ? $1.$hr->{$2}.$3 : ""/eg;
+
+ # spec: (x(exec_text;basic_text)x)
+ $text =~ s/\(x\((.*?);(.*?)\)x\)/$order eq "exec" ? $1 : $2/egs;
+
+ # spec: (*(text)*)
+ $text =~ s/\(\*\(([^;]*?)\)\*\)/$1 x $level/egs;
+
+ # spec: (*(text1;text2)*)
+ $text =~ s/\(\*\((.*?);(.*?)\)\*\)/$1 x ($level - 1) . $2 x ($level>0)/egs;
+
+ # convert #Var to tag=>val form: Var\t#var
+ $text =~ s/\#([A-Z][a-z]+)(\d+)?/\t\u$1\t\L#$1$2/gs;
+
+ # spec: #varN
+ $text =~ s/\#([a-zA-Z]+)(\d+)/sprintf("%-$2s", $hr->{$1})/eg;
+
+ $text =~ s/\#([a-zA-Z]+)/$hr->{$1}/eg; # populate #var's
+ $text =~ s/[ \t]*~+[ \t]*/ /g; # squeeze tildes
+
+ $text = "# $hr->{src}\n$text" if $show_src and $hr->{src};
+
+ chomp $text;
+ return "$text\n" if $text ne "";
+ return $text; # suppress empty lines
+}
+
+our %priv; # used to display each opcode's BASEOP.op_private values
+
+$priv{$_}{128} = "LVINTRO"
+ for ("pos", "substr", "vec", "threadsv", "gvsv", "rv2sv", "rv2hv", "rv2gv",
+ "rv2av", "rv2arylen", "aelem", "helem", "aslice", "hslice", "padsv",
+ "padav", "padhv", "enteriter");
+$priv{$_}{64} = "REFC" for ("leave", "leavesub", "leavesublv", "leavewrite");
+$priv{"aassign"}{64} = "COMMON";
+$priv{"aassign"}{32} = $] < 5.009 ? "PHASH" : "STATE";
+$priv{"sassign"}{32} = "STATE";
+$priv{"sassign"}{64} = "BKWARD";
+$priv{$_}{64} = "RTIME" for ("match", "subst", "substcont", "qr");
+@{$priv{"trans"}}{1,2,4,8,16,64} = ("<UTF", ">UTF", "IDENT", "SQUASH", "DEL",
+ "COMPL", "GROWS");
+$priv{"repeat"}{64} = "DOLIST";
+$priv{"leaveloop"}{64} = "CONT";
+@{$priv{$_}}{32,64,96} = ("DREFAV", "DREFHV", "DREFSV")
+ for (qw(rv2gv rv2sv padsv aelem helem));
+$priv{$_}{16} = "STATE" for ("padav", "padhv", "padsv");
+@{$priv{"entersub"}}{16,32,64} = ("DBG","TARG","NOMOD");
+@{$priv{$_}}{4,8,128} = ("INARGS","AMPER","NO()") for ("entersub", "rv2cv");
+$priv{"gv"}{32} = "EARLYCV";
+$priv{"aelem"}{16} = $priv{"helem"}{16} = "LVDEFER";
+$priv{$_}{16} = "OURINTR" for ("gvsv", "rv2sv", "rv2av", "rv2hv", "r2gv",
+ "enteriter");
+$priv{$_}{16} = "TARGMY"
+ for (map(($_,"s$_"),"chop", "chomp"),
+ map(($_,"i_$_"), "postinc", "postdec", "multiply", "divide", "modulo",
+ "add", "subtract", "negate"), "pow", "concat", "stringify",
+ "left_shift", "right_shift", "bit_and", "bit_xor", "bit_or",
+ "complement", "atan2", "sin", "cos", "rand", "exp", "log", "sqrt",
+ "int", "hex", "oct", "abs", "length", "index", "rindex", "sprintf",
+ "ord", "chr", "crypt", "quotemeta", "join", "push", "unshift", "flock",
+ "chdir", "chown", "chroot", "unlink", "chmod", "utime", "rename",
+ "link", "symlink", "mkdir", "rmdir", "wait", "waitpid", "system",
+ "exec", "kill", "getppid", "getpgrp", "setpgrp", "getpriority",
+ "setpriority", "time", "sleep");
+$priv{$_}{4} = "REVERSED" for ("enteriter", "iter");
+@{$priv{"const"}}{4,8,16,32,64,128} = ("SHORT","STRICT","ENTERED",'$[',"BARE","WARN");
+$priv{"flip"}{64} = $priv{"flop"}{64} = "LINENUM";
+$priv{"list"}{64} = "GUESSED";
+$priv{"delete"}{64} = "SLICE";
+$priv{"exists"}{64} = "SUB";
+@{$priv{"sort"}}{1,2,4,8,16,32,64} = ("NUM", "INT", "REV", "INPLACE","DESC","QSORT","STABLE");
+$priv{"threadsv"}{64} = "SVREFd";
+@{$priv{$_}}{16,32,64,128} = ("INBIN","INCR","OUTBIN","OUTCR")
+ for ("open", "backtick");
+$priv{"exit"}{128} = "VMS";
+$priv{$_}{2} = "FTACCESS"
+ for ("ftrread", "ftrwrite", "ftrexec", "fteread", "ftewrite", "fteexec");
+$priv{"entereval"}{2} = "HAS_HH";
+if ($] >= 5.009) {
+ # Stacked filetests are post 5.8.x
+ $priv{$_}{4} = "FTSTACKED"
+ for ("ftrread", "ftrwrite", "ftrexec", "fteread", "ftewrite", "fteexec",
+ "ftis", "fteowned", "ftrowned", "ftzero", "ftsize", "ftmtime",
+ "ftatime", "ftctime", "ftsock", "ftchr", "ftblk", "ftfile", "ftdir",
+ "ftpipe", "ftlink", "ftsuid", "ftsgid", "ftsvtx", "fttty", "fttext",
+ "ftbinary");
+ # Lexical $_ is post 5.8.x
+ $priv{$_}{2} = "GREPLEX"
+ for ("mapwhile", "mapstart", "grepwhile", "grepstart");
+}
+
+our %hints; # used to display each COP's op_hints values
+
+# strict refs, subs, vars
+@hints{2,512,1024} = ('$', '&', '*');
+# integers, locale, bytes, arybase
+@hints{1,4,8,16,32} = ('i', 'l', 'b', '[');
+# block scope, localise %^H, $^OPEN (in), $^OPEN (out)
+@hints{256,131072,262144,524288} = ('{','%','<','>');
+# overload new integer, float, binary, string, re
+@hints{4096,8192,16384,32768,65536} = ('I', 'F', 'B', 'S', 'R');
+# taint and eval
+@hints{1048576,2097152} = ('T', 'E');
+# filetest access, UTF-8
+@hints{4194304,8388608} = ('X', 'U');
+
+sub _flags {
+ my($hash, $x) = @_;
+ my @s;
+ for my $flag (sort {$b <=> $a} keys %$hash) {
+ if ($hash->{$flag} and $x & $flag and $x >= $flag) {
+ $x -= $flag;
+ push @s, $hash->{$flag};
+ }
+ }
+ push @s, $x if $x;
+ return join(",", @s);
+}
+
+sub private_flags {
+ my($name, $x) = @_;
+ _flags($priv{$name}, $x);
+}
+
+sub hints_flags {
+ my($x) = @_;
+ _flags(\%hints, $x);
+}
+
+sub concise_sv {
+ my($sv, $hr, $preferpv) = @_;
+ $hr->{svclass} = class($sv);
+ $hr->{svclass} = "UV"
+ if $hr->{svclass} eq "IV" and $sv->FLAGS & SVf_IVisUV;
+ Carp::cluck("bad concise_sv: $sv") unless $sv and $$sv;
+ $hr->{svaddr} = sprintf("%#x", $$sv);
+ if ($hr->{svclass} eq "GV" && $sv->isGV_with_GP()) {
+ my $gv = $sv;
+ my $stash = $gv->STASH->NAME; if ($stash eq "main") {
+ $stash = "";
+ } else {
+ $stash = $stash . "::";
+ }
+ $hr->{svval} = "*$stash" . $gv->SAFENAME;
+ return "*$stash" . $gv->SAFENAME;
+ } else {
+ if ($] >= 5.011) {
+ while (class($sv) eq "IV" && $sv->FLAGS & SVf_ROK) {
+ $hr->{svval} .= "\\";
+ $sv = $sv->RV;
+ }
+ } else {
+ while (class($sv) eq "RV") {
+ $hr->{svval} .= "\\";
+ $sv = $sv->RV;
+ }
+ }
+ if (class($sv) eq "SPECIAL") {
+ $hr->{svval} .= ["Null", "sv_undef", "sv_yes", "sv_no"]->[$$sv];
+ } elsif ($preferpv && $sv->FLAGS & SVf_POK) {
+ $hr->{svval} .= cstring($sv->PV);
+ } elsif ($sv->FLAGS & SVf_NOK) {
+ $hr->{svval} .= $sv->NV;
+ } elsif ($sv->FLAGS & SVf_IOK) {
+ $hr->{svval} .= $sv->int_value;
+ } elsif ($sv->FLAGS & SVf_POK) {
+ $hr->{svval} .= cstring($sv->PV);
+ } elsif (class($sv) eq "HV") {
+ $hr->{svval} .= 'HASH';
+ }
+
+ $hr->{svval} = 'undef' unless defined $hr->{svval};
+ my $out = $hr->{svclass};
+ return $out .= " $hr->{svval}" ;
+ }
+}
+
+my %srclines;
+
+sub fill_srclines {
+ my $fullnm = shift;
+ if ($fullnm eq '-e') {
+ $srclines{$fullnm} = [ $fullnm, "-src not supported for -e" ];
+ return;
+ }
+ open (my $fh, '<', $fullnm)
+ or warn "# $fullnm: $!, (chdirs not supported by this feature yet)\n"
+ and return;
+ my @l = <$fh>;
+ chomp @l;
+ unshift @l, $fullnm; # like @{_<$fullnm} in debug, array starts at 1
+ $srclines{$fullnm} = \@l;
+}
+
+sub concise_op {
+ my ($op, $level, $format) = @_;
+ my %h;
+ $h{exname} = $h{name} = $op->name;
+ $h{NAME} = uc $h{name};
+ $h{class} = class($op);
+ $h{extarg} = $h{targ} = $op->targ;
+ $h{extarg} = "" unless $h{extarg};
+ if ($h{name} eq "null" and $h{targ}) {
+ # targ holds the old type
+ $h{exname} = "ex-" . substr(ppname($h{targ}), 3);
+ $h{extarg} = "";
+ } elsif ($op->name =~ /^leave(sub(lv)?|write)?$/) {
+ # targ potentially holds a reference count
+ if ($op->private & 64) {
+ my $refs = "ref" . ($h{targ} != 1 ? "s" : "");
+ $h{targarglife} = $h{targarg} = "$h{targ} $refs";
+ }
+ } elsif ($h{targ}) {
+ my $padname = (($curcv->PADLIST->ARRAY)[0]->ARRAY)[$h{targ}];
+ if (defined $padname and class($padname) ne "SPECIAL") {
+ $h{targarg} = $padname->PVX;
+ if ($padname->FLAGS & SVf_FAKE) {
+ if ($] < 5.009) {
+ $h{targarglife} = "$h{targarg}:FAKE";
+ } else {
+ # These changes relate to the jumbo closure fix.
+ # See changes 19939 and 20005
+ my $fake = '';
+ $fake .= 'a'
+ if $padname->PARENT_FAKELEX_FLAGS & PAD_FAKELEX_ANON;
+ $fake .= 'm'
+ if $padname->PARENT_FAKELEX_FLAGS & PAD_FAKELEX_MULTI;
+ $fake .= ':' . $padname->PARENT_PAD_INDEX
+ if $curcv->CvFLAGS & CVf_ANON;
+ $h{targarglife} = "$h{targarg}:FAKE:$fake";
+ }
+ }
+ else {
+ my $intro = $padname->COP_SEQ_RANGE_LOW - $cop_seq_base;
+ my $finish = int($padname->COP_SEQ_RANGE_HIGH) - $cop_seq_base;
+ $finish = "end" if $finish == 999999999 - $cop_seq_base;
+ $h{targarglife} = "$h{targarg}:$intro,$finish";
+ }
+ } else {
+ $h{targarglife} = $h{targarg} = "t" . $h{targ};
+ }
+ }
+ $h{arg} = "";
+ $h{svclass} = $h{svaddr} = $h{svval} = "";
+ if ($h{class} eq "PMOP") {
+ my $precomp = $op->precomp;
+ if (defined $precomp) {
+ $precomp = cstring($precomp); # Escape literal control sequences
+ $precomp = "/$precomp/";
+ } else {
+ $precomp = "";
+ }
+ my $pmreplroot = $op->pmreplroot;
+ my $pmreplstart;
+ if (ref($pmreplroot) eq "B::GV") {
+ # with C<@stash_array = split(/pat/, str);>,
+ # *stash_array is stored in /pat/'s pmreplroot.
+ $h{arg} = "($precomp => \@" . $pmreplroot->NAME . ")";
+ } elsif (!ref($pmreplroot) and $pmreplroot) {
+ # same as the last case, except the value is actually a
+ # pad offset for where the GV is kept (this happens under
+ # ithreads)
+ my $gv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$pmreplroot];
+ $h{arg} = "($precomp => \@" . $gv->NAME . ")";
+ } elsif ($ {$op->pmreplstart}) {
+ undef $lastnext;
+ $pmreplstart = "replstart->" . seq($op->pmreplstart);
+ $h{arg} = "(" . join(" ", $precomp, $pmreplstart) . ")";
+ } else {
+ $h{arg} = "($precomp)";
+ }
+ } elsif ($h{class} eq "PVOP" and $h{name} ne "trans") {
+ $h{arg} = '("' . $op->pv . '")';
+ $h{svval} = '"' . $op->pv . '"';
+ } elsif ($h{class} eq "COP") {
+ my $label = $op->label;
+ $h{coplabel} = $label;
+ $label = $label ? "$label: " : "";
+ my $loc = $op->file;
+ my $pathnm = $loc;
+ $loc =~ s[.*/][];
+ my $ln = $op->line;
+ $loc .= ":$ln";
+ my($stash, $cseq) = ($op->stash->NAME, $op->cop_seq - $cop_seq_base);
+ my $arybase = $op->arybase;
+ $arybase = $arybase ? ' $[=' . $arybase : "";
+ $h{arg} = "($label$stash $cseq $loc$arybase)";
+ if ($show_src) {
+ fill_srclines($pathnm) unless exists $srclines{$pathnm};
+ # Would love to retain Jim's use of // but this code needs to be
+ # portable to 5.8.x
+ my $line = $srclines{$pathnm}[$ln];
+ $line = "-src unavailable under -e" unless defined $line;
+ $h{src} = "$ln: $line";
+ }
+ } elsif ($h{class} eq "LOOP") {
+ $h{arg} = "(next->" . seq($op->nextop) . " last->" . seq($op->lastop)
+ . " redo->" . seq($op->redoop) . ")";
+ } elsif ($h{class} eq "LOGOP") {
+ undef $lastnext;
+ $h{arg} = "(other->" . seq($op->other) . ")";
+ }
+ elsif ($h{class} eq "SVOP" or $h{class} eq "PADOP") {
+ unless ($h{name} eq 'aelemfast' and $op->flags & OPf_SPECIAL) {
+ my $idx = ($h{class} eq "SVOP") ? $op->targ : $op->padix;
+ my $preferpv = $h{name} eq "method_named";
+ if ($h{class} eq "PADOP" or !${$op->sv}) {
+ my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$idx];
+ $h{arg} = "[" . concise_sv($sv, \%h, $preferpv) . "]";
+ $h{targarglife} = $h{targarg} = "";
+ } else {
+ $h{arg} = "(" . concise_sv($op->sv, \%h, $preferpv) . ")";
+ }
+ }
+ }
+ $h{seq} = $h{hyphseq} = seq($op);
+ $h{seq} = "" if $h{seq} eq "-";
+ if ($] > 5.009) {
+ $h{opt} = $op->opt;
+ $h{label} = $labels{$$op};
+ } else {
+ $h{seqnum} = $op->seq;
+ $h{label} = $labels{$op->seq};
+ }
+ $h{next} = $op->next;
+ $h{next} = (class($h{next}) eq "NULL") ? "(end)" : seq($h{next});
+ $h{nextaddr} = sprintf("%#x", $ {$op->next});
+ $h{sibaddr} = sprintf("%#x", $ {$op->sibling});
+ $h{firstaddr} = sprintf("%#x", $ {$op->first}) if $op->can("first");
+ $h{lastaddr} = sprintf("%#x", $ {$op->last}) if $op->can("last");
+
+ $h{classsym} = $opclass{$h{class}};
+ $h{flagval} = $op->flags;
+ $h{flags} = op_flags($op->flags);
+ $h{privval} = $op->private;
+ $h{private} = private_flags($h{name}, $op->private);
+ if ($op->can("hints")) {
+ $h{hintsval} = $op->hints;
+ $h{hints} = hints_flags($h{hintsval});
+ } else {
+ $h{hintsval} = $h{hints} = '';
+ }
+ $h{addr} = sprintf("%#x", $$op);
+ $h{typenum} = $op->type;
+ $h{noise} = $linenoise[$op->type];
+
+ return fmt_line(\%h, $op, $format, $level);
+}
+
+sub B::OP::concise {
+ my($op, $level) = @_;
+ if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
+ # insert a 'goto' line
+ my $synth = {"seq" => seq($lastnext), "class" => class($lastnext),
+ "addr" => sprintf("%#x", $$lastnext),
+ "goto" => seq($lastnext), # simplify goto '-' removal
+ };
+ print $walkHandle fmt_line($synth, $op, $gotofmt, $level+1);
+ }
+ $lastnext = $op->next;
+ print $walkHandle concise_op($op, $level, $format);
+}
+
+# B::OP::terse (see Terse.pm) now just calls this
+sub b_terse {
+ my($op, $level) = @_;
+
+ # This isn't necessarily right, but there's no easy way to get
+ # from an OP to the right CV. This is a limitation of the
+ # ->terse() interface style, and there isn't much to do about
+ # it. In particular, we can die in concise_op if the main pad
+ # isn't long enough, or has the wrong kind of entries, compared to
+ # the pad a sub was compiled with. The fix for that would be to
+ # make a backwards compatible "terse" format that never even
+ # looked at the pad, just like the old B::Terse. I don't think
+ # that's worth the effort, though.
+ $curcv = main_cv unless $curcv;
+
+ if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
+ # insert a 'goto'
+ my $h = {"seq" => seq($lastnext), "class" => class($lastnext),
+ "addr" => sprintf("%#x", $$lastnext)};
+ print # $walkHandle
+ fmt_line($h, $op, $style{"terse"}[1], $level+1);
+ }
+ $lastnext = $op->next;
+ print # $walkHandle
+ concise_op($op, $level, $style{"terse"}[0]);
+}
+
+sub tree {
+ my $op = shift;
+ my $level = shift;
+ my $style = $tree_decorations[$tree_style];
+ my($space, $single, $kids, $kid, $nokid, $last, $lead, $size) = @$style;
+ my $name = concise_op($op, $level, $treefmt);
+ if (not $op->flags & OPf_KIDS) {
+ return $name . "\n";
+ }
+ my @lines;
+ for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
+ push @lines, tree($kid, $level+1);
+ }
+ my $i;
+ for ($i = $#lines; substr($lines[$i], 0, 1) eq " "; $i--) {
+ $lines[$i] = $space . $lines[$i];
+ }
+ if ($i > 0) {
+ $lines[$i] = $last . $lines[$i];
+ while ($i-- > 1) {
+ if (substr($lines[$i], 0, 1) eq " ") {
+ $lines[$i] = $nokid . $lines[$i];
+ } else {
+ $lines[$i] = $kid . $lines[$i];
+ }
+ }
+ $lines[$i] = $kids . $lines[$i];
+ } else {
+ $lines[0] = $single . $lines[0];
+ }
+ return("$name$lead" . shift @lines,
+ map(" " x (length($name)+$size) . $_, @lines));
+}
+
+# *** Warning: fragile kludge ahead ***
+# Because the B::* modules run in the same interpreter as the code
+# they're compiling, their presence tends to distort the view we have of
+# the code we're looking at. In particular, perl gives sequence numbers
+# to COPs. If the program we're looking at were run on its own, this
+# would start at 1. Because all of B::Concise and all the modules it
+# uses are compiled first, though, by the time we get to the user's
+# program the sequence number is already pretty high, which could be
+# distracting if you're trying to tell OPs apart. Therefore we'd like to
+# subtract an offset from all the sequence numbers we display, to
+# restore the simpler view of the world. The trick is to know what that
+# offset will be, when we're still compiling B::Concise! If we
+# hardcoded a value, it would have to change every time B::Concise or
+# other modules we use do. To help a little, what we do here is compile
+# a little code at the end of the module, and compute the base sequence
+# number for the user's program as being a small offset later, so all we
+# have to worry about are changes in the offset.
+
+# [For 5.8.x and earlier perl is generating sequence numbers for all ops,
+# and using them to reference labels]
+
+
+# When you say "perl -MO=Concise -e '$a'", the output should look like:
+
+# 4 <@> leave[t1] vKP/REFC ->(end)
+# 1 <0> enter ->2
+ #^ smallest OP sequence number should be 1
+# 2 <;> nextstate(main 1 -e:1) v ->3
+ # ^ smallest COP sequence number should be 1
+# - <1> ex-rv2sv vK/1 ->4
+# 3 <$> gvsv(*a) s ->4
+
+# If the second of the marked numbers there isn't 1, it means you need
+# to update the corresponding magic number in the next line.
+# Remember, this needs to stay the last things in the module.
+
+# Why is this different for MacOS? Does it matter?
+my $cop_seq_mnum = $^O eq 'MacOS' ? 12 : 11;
+$cop_seq_base = svref_2object(eval 'sub{0;}')->START->cop_seq + $cop_seq_mnum;
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Concise - Walk Perl syntax tree, printing concise info about ops
+
+=head1 SYNOPSIS
+
+ perl -MO=Concise[,OPTIONS] foo.pl
+
+ use B::Concise qw(set_style add_callback);
+
+=head1 DESCRIPTION
+
+This compiler backend prints the internal OPs of a Perl program's syntax
+tree in one of several space-efficient text formats suitable for debugging
+the inner workings of perl or other compiler backends. It can print OPs in
+the order they appear in the OP tree, in the order they will execute, or
+in a text approximation to their tree structure, and the format of the
+information displayed is customizable. Its function is similar to that of
+perl's B<-Dx> debugging flag or the B<B::Terse> module, but it is more
+sophisticated and flexible.
+
+=head1 EXAMPLE
+
+Here's two outputs (or 'renderings'), using the -exec and -basic
+(i.e. default) formatting conventions on the same code snippet.
+
+ % perl -MO=Concise,-exec -e '$a = $b + 42'
+ 1 <0> enter
+ 2 <;> nextstate(main 1 -e:1) v
+ 3 <#> gvsv[*b] s
+ 4 <$> const[IV 42] s
+ * 5 <2> add[t3] sK/2
+ 6 <#> gvsv[*a] s
+ 7 <2> sassign vKS/2
+ 8 <@> leave[1 ref] vKP/REFC
+
+In this -exec rendering, each opcode is executed in the order shown.
+The add opcode, marked with '*', is discussed in more detail.
+
+The 1st column is the op's sequence number, starting at 1, and is
+displayed in base 36 by default. Here they're purely linear; the
+sequences are very helpful when looking at code with loops and
+branches.
+
+The symbol between angle brackets indicates the op's type, for
+example; <2> is a BINOP, <@> a LISTOP, and <#> is a PADOP, which is
+used in threaded perls. (see L</"OP class abbreviations">).
+
+The opname, as in B<'add[t1]'>, may be followed by op-specific
+information in parentheses or brackets (ex B<'[t1]'>).
+
+The op-flags (ex B<'sK/2'>) are described in (L</"OP flags
+abbreviations">).
+
+ % perl -MO=Concise -e '$a = $b + 42'
+ 8 <@> leave[1 ref] vKP/REFC ->(end)
+ 1 <0> enter ->2
+ 2 <;> nextstate(main 1 -e:1) v ->3
+ 7 <2> sassign vKS/2 ->8
+ * 5 <2> add[t1] sK/2 ->6
+ - <1> ex-rv2sv sK/1 ->4
+ 3 <$> gvsv(*b) s ->4
+ 4 <$> const(IV 42) s ->5
+ - <1> ex-rv2sv sKRM*/1 ->7
+ 6 <$> gvsv(*a) s ->7
+
+The default rendering is top-down, so they're not in execution order.
+This form reflects the way the stack is used to parse and evaluate
+expressions; the add operates on the two terms below it in the tree.
+
+Nullops appear as C<ex-opname>, where I<opname> is an op that has been
+optimized away by perl. They're displayed with a sequence-number of
+'-', because they are not executed (they don't appear in previous
+example), they're printed here because they reflect the parse.
+
+The arrow points to the sequence number of the next op; they're not
+displayed in -exec mode, for obvious reasons.
+
+Note that because this rendering was done on a non-threaded perl, the
+PADOPs in the previous examples are now SVOPs, and some (but not all)
+of the square brackets have been replaced by round ones. This is a
+subtle feature to provide some visual distinction between renderings
+on threaded and un-threaded perls.
+
+
+=head1 OPTIONS
+
+Arguments that don't start with a hyphen are taken to be the names of
+subroutines to render; if no such functions are specified, the main
+body of the program (outside any subroutines, and not including use'd
+or require'd files) is rendered. Passing C<BEGIN>, C<UNITCHECK>,
+C<CHECK>, C<INIT>, or C<END> will cause all of the corresponding
+special blocks to be printed. Arguments must follow options.
+
+Options affect how things are rendered (ie printed). They're presented
+here by their visual effect, 1st being strongest. They're grouped
+according to how they interrelate; within each group the options are
+mutually exclusive (unless otherwise stated).
+
+=head2 Options for Opcode Ordering
+
+These options control the 'vertical display' of opcodes. The display
+'order' is also called 'mode' elsewhere in this document.
+
+=over 4
+
+=item B<-basic>
+
+Print OPs in the order they appear in the OP tree (a preorder
+traversal, starting at the root). The indentation of each OP shows its
+level in the tree, and the '->' at the end of the line indicates the
+next opcode in execution order. This mode is the default, so the flag
+is included simply for completeness.
+
+=item B<-exec>
+
+Print OPs in the order they would normally execute (for the majority
+of constructs this is a postorder traversal of the tree, ending at the
+root). In most cases the OP that usually follows a given OP will
+appear directly below it; alternate paths are shown by indentation. In
+cases like loops when control jumps out of a linear path, a 'goto'
+line is generated.
+
+=item B<-tree>
+
+Print OPs in a text approximation of a tree, with the root of the tree
+at the left and 'left-to-right' order of children transformed into
+'top-to-bottom'. Because this mode grows both to the right and down,
+it isn't suitable for large programs (unless you have a very wide
+terminal).
+
+=back
+
+=head2 Options for Line-Style
+
+These options select the line-style (or just style) used to render
+each opcode, and dictates what info is actually printed into each line.
+
+=over 4
+
+=item B<-concise>
+
+Use the author's favorite set of formatting conventions. This is the
+default, of course.
+
+=item B<-terse>
+
+Use formatting conventions that emulate the output of B<B::Terse>. The
+basic mode is almost indistinguishable from the real B<B::Terse>, and the
+exec mode looks very similar, but is in a more logical order and lacks
+curly brackets. B<B::Terse> doesn't have a tree mode, so the tree mode
+is only vaguely reminiscent of B<B::Terse>.
+
+=item B<-linenoise>
+
+Use formatting conventions in which the name of each OP, rather than being
+written out in full, is represented by a one- or two-character abbreviation.
+This is mainly a joke.
+
+=item B<-debug>
+
+Use formatting conventions reminiscent of B<B::Debug>; these aren't
+very concise at all.
+
+=item B<-env>
+
+Use formatting conventions read from the environment variables
+C<B_CONCISE_FORMAT>, C<B_CONCISE_GOTO_FORMAT>, and C<B_CONCISE_TREE_FORMAT>.
+
+=back
+
+=head2 Options for tree-specific formatting
+
+=over 4
+
+=item B<-compact>
+
+Use a tree format in which the minimum amount of space is used for the
+lines connecting nodes (one character in most cases). This squeezes out
+a few precious columns of screen real estate.
+
+=item B<-loose>
+
+Use a tree format that uses longer edges to separate OP nodes. This format
+tends to look better than the compact one, especially in ASCII, and is
+the default.
+
+=item B<-vt>
+
+Use tree connecting characters drawn from the VT100 line-drawing set.
+This looks better if your terminal supports it.
+
+=item B<-ascii>
+
+Draw the tree with standard ASCII characters like C<+> and C<|>. These don't
+look as clean as the VT100 characters, but they'll work with almost any
+terminal (or the horizontal scrolling mode of less(1)) and are suitable
+for text documentation or email. This is the default.
+
+=back
+
+These are pairwise exclusive, i.e. compact or loose, vt or ascii.
+
+=head2 Options controlling sequence numbering
+
+=over 4
+
+=item B<-base>I<n>
+
+Print OP sequence numbers in base I<n>. If I<n> is greater than 10, the
+digit for 11 will be 'a', and so on. If I<n> is greater than 36, the digit
+for 37 will be 'A', and so on until 62. Values greater than 62 are not
+currently supported. The default is 36.
+
+=item B<-bigendian>
+
+Print sequence numbers with the most significant digit first. This is the
+usual convention for Arabic numerals, and the default.
+
+=item B<-littleendian>
+
+Print seqence numbers with the least significant digit first. This is
+obviously mutually exclusive with bigendian.
+
+=back
+
+=head2 Other options
+
+=over 4
+
+=item B<-src>
+
+With this option, the rendering of each statement (starting with the
+nextstate OP) will be preceded by the 1st line of source code that
+generates it. For example:
+
+ 1 <0> enter
+ # 1: my $i;
+ 2 <;> nextstate(main 1 junk.pl:1) v:{
+ 3 <0> padsv[$i:1,10] vM/LVINTRO
+ # 3: for $i (0..9) {
+ 4 <;> nextstate(main 3 junk.pl:3) v:{
+ 5 <0> pushmark s
+ 6 <$> const[IV 0] s
+ 7 <$> const[IV 9] s
+ 8 <{> enteriter(next->j last->m redo->9)[$i:1,10] lKS
+ k <0> iter s
+ l <|> and(other->9) vK/1
+ # 4: print "line ";
+ 9 <;> nextstate(main 2 junk.pl:4) v
+ a <0> pushmark s
+ b <$> const[PV "line "] s
+ c <@> print vK
+ # 5: print "$i\n";
+ ...
+
+=item B<-stash="somepackage">
+
+With this, "somepackage" will be required, then the stash is
+inspected, and each function is rendered.
+
+=back
+
+The following options are pairwise exclusive.
+
+=over 4
+
+=item B<-main>
+
+Include the main program in the output, even if subroutines were also
+specified. This rendering is normally suppressed when a subroutine
+name or reference is given.
+
+=item B<-nomain>
+
+This restores the default behavior after you've changed it with '-main'
+(it's not normally needed). If no subroutine name/ref is given, main is
+rendered, regardless of this flag.
+
+=item B<-nobanner>
+
+Renderings usually include a banner line identifying the function name
+or stringified subref. This suppresses the printing of the banner.
+
+TBC: Remove the stringified coderef; while it provides a 'cookie' for
+each function rendered, the cookies used should be 1,2,3.. not a
+random hex-address. It also complicates string comparison of two
+different trees.
+
+=item B<-banner>
+
+restores default banner behavior.
+
+=item B<-banneris> => subref
+
+TBC: a hookpoint (and an option to set it) for a user-supplied
+function to produce a banner appropriate for users needs. It's not
+ideal, because the rendering-state variables, which are a natural
+candidate for use in concise.t, are unavailable to the user.
+
+=back
+
+=head2 Option Stickiness
+
+If you invoke Concise more than once in a program, you should know that
+the options are 'sticky'. This means that the options you provide in
+the first call will be remembered for the 2nd call, unless you
+re-specify or change them.
+
+=head1 ABBREVIATIONS
+
+The concise style uses symbols to convey maximum info with minimal
+clutter (like hex addresses). With just a little practice, you can
+start to see the flowers, not just the branches, in the trees.
+
+=head2 OP class abbreviations
+
+These symbols appear before the op-name, and indicate the
+B:: namespace that represents the ops in your Perl code.
+
+ 0 OP (aka BASEOP) An OP with no children
+ 1 UNOP An OP with one child
+ 2 BINOP An OP with two children
+ | LOGOP A control branch OP
+ @ LISTOP An OP that could have lots of children
+ / PMOP An OP with a regular expression
+ $ SVOP An OP with an SV
+ " PVOP An OP with a string
+ { LOOP An OP that holds pointers for a loop
+ ; COP An OP that marks the start of a statement
+ # PADOP An OP with a GV on the pad
+
+=head2 OP flags abbreviations
+
+OP flags are either public or private. The public flags alter the
+behavior of each opcode in consistent ways, and are represented by 0
+or more single characters.
+
+ v OPf_WANT_VOID Want nothing (void context)
+ s OPf_WANT_SCALAR Want single value (scalar context)
+ l OPf_WANT_LIST Want list of any length (list context)
+ Want is unknown
+ K OPf_KIDS There is a firstborn child.
+ P OPf_PARENS This operator was parenthesized.
+ (Or block needs explicit scope entry.)
+ R OPf_REF Certified reference.
+ (Return container, not containee).
+ M OPf_MOD Will modify (lvalue).
+ S OPf_STACKED Some arg is arriving on the stack.
+ * OPf_SPECIAL Do something weird for this op (see op.h)
+
+Private flags, if any are set for an opcode, are displayed after a '/'
+
+ 8 <@> leave[1 ref] vKP/REFC ->(end)
+ 7 <2> sassign vKS/2 ->8
+
+They're opcode specific, and occur less often than the public ones, so
+they're represented by short mnemonics instead of single-chars; see
+F<op.h> for gory details, or try this quick 2-liner:
+
+ $> perl -MB::Concise -de 1
+ DB<1> |x \%B::Concise::priv
+
+=head1 FORMATTING SPECIFICATIONS
+
+For each line-style ('concise', 'terse', 'linenoise', etc.) there are
+3 format-specs which control how OPs are rendered.
+
+The first is the 'default' format, which is used in both basic and exec
+modes to print all opcodes. The 2nd, goto-format, is used in exec
+mode when branches are encountered. They're not real opcodes, and are
+inserted to look like a closing curly brace. The tree-format is tree
+specific.
+
+When a line is rendered, the correct format-spec is copied and scanned
+for the following items; data is substituted in, and other
+manipulations like basic indenting are done, for each opcode rendered.
+
+There are 3 kinds of items that may be populated; special patterns,
+#vars, and literal text, which is copied verbatim. (Yes, it's a set
+of s///g steps.)
+
+=head2 Special Patterns
+
+These items are the primitives used to perform indenting, and to
+select text from amongst alternatives.
+
+=over 4
+
+=item B<(x(>I<exec_text>B<;>I<basic_text>B<)x)>
+
+Generates I<exec_text> in exec mode, or I<basic_text> in basic mode.
+
+=item B<(*(>I<text>B<)*)>
+
+Generates one copy of I<text> for each indentation level.
+
+=item B<(*(>I<text1>B<;>I<text2>B<)*)>
+
+Generates one fewer copies of I<text1> than the indentation level, followed
+by one copy of I<text2> if the indentation level is more than 0.
+
+=item B<(?(>I<text1>B<#>I<var>I<Text2>B<)?)>
+
+If the value of I<var> is true (not empty or zero), generates the
+value of I<var> surrounded by I<text1> and I<Text2>, otherwise
+nothing.
+
+=item B<~>
+
+Any number of tildes and surrounding whitespace will be collapsed to
+a single space.
+
+=back
+
+=head2 # Variables
+
+These #vars represent opcode properties that you may want as part of
+your rendering. The '#' is intended as a private sigil; a #var's
+value is interpolated into the style-line, much like "read $this".
+
+These vars take 3 forms:
+
+=over 4
+
+=item B<#>I<var>
+
+A property named 'var' is assumed to exist for the opcodes, and is
+interpolated into the rendering.
+
+=item B<#>I<var>I<N>
+
+Generates the value of I<var>, left justified to fill I<N> spaces.
+Note that this means while you can have properties 'foo' and 'foo2',
+you cannot render 'foo2', but you could with 'foo2a'. You would be
+wise not to rely on this behavior going forward ;-)
+
+=item B<#>I<Var>
+
+This ucfirst form of #var generates a tag-value form of itself for
+display; it converts '#Var' into a 'Var => #var' style, which is then
+handled as described above. (Imp-note: #Vars cannot be used for
+conditional-fills, because the => #var transform is done after the check
+for #Var's value).
+
+=back
+
+The following variables are 'defined' by B::Concise; when they are
+used in a style, their respective values are plugged into the
+rendering of each opcode.
+
+Only some of these are used by the standard styles, the others are
+provided for you to delve into optree mechanics, should you wish to
+add a new style (see L</add_style> below) that uses them. You can
+also add new ones using L</add_callback>.
+
+=over 4
+
+=item B<#addr>
+
+The address of the OP, in hexadecimal.
+
+=item B<#arg>
+
+The OP-specific information of the OP (such as the SV for an SVOP, the
+non-local exit pointers for a LOOP, etc.) enclosed in parentheses.
+
+=item B<#class>
+
+The B-determined class of the OP, in all caps.
+
+=item B<#classsym>
+
+A single symbol abbreviating the class of the OP.
+
+=item B<#coplabel>
+
+The label of the statement or block the OP is the start of, if any.
+
+=item B<#exname>
+
+The name of the OP, or 'ex-foo' if the OP is a null that used to be a foo.
+
+=item B<#extarg>
+
+The target of the OP, or nothing for a nulled OP.
+
+=item B<#firstaddr>
+
+The address of the OP's first child, in hexadecimal.
+
+=item B<#flags>
+
+The OP's flags, abbreviated as a series of symbols.
+
+=item B<#flagval>
+
+The numeric value of the OP's flags.
+
+=item B<#hints>
+
+The COP's hint flags, rendered with abbreviated names if possible. An empty
+string if this is not a COP. Here are the symbols used:
+
+ $ strict refs
+ & strict subs
+ * strict vars
+ i integers
+ l locale
+ b bytes
+ [ arybase
+ { block scope
+ % localise %^H
+ < open in
+ > open out
+ I overload int
+ F overload float
+ B overload binary
+ S overload string
+ R overload re
+ T taint
+ E eval
+ X filetest access
+ U utf-8
+
+=item B<#hintsval>
+
+The numeric value of the COP's hint flags, or an empty string if this is not
+a COP.
+
+=item B<#hyphseq>
+
+The sequence number of the OP, or a hyphen if it doesn't have one.
+
+=item B<#label>
+
+'NEXT', 'LAST', or 'REDO' if the OP is a target of one of those in exec
+mode, or empty otherwise.
+
+=item B<#lastaddr>
+
+The address of the OP's last child, in hexadecimal.
+
+=item B<#name>
+
+The OP's name.
+
+=item B<#NAME>
+
+The OP's name, in all caps.
+
+=item B<#next>
+
+The sequence number of the OP's next OP.
+
+=item B<#nextaddr>
+
+The address of the OP's next OP, in hexadecimal.
+
+=item B<#noise>
+
+A one- or two-character abbreviation for the OP's name.
+
+=item B<#private>
+
+The OP's private flags, rendered with abbreviated names if possible.
+
+=item B<#privval>
+
+The numeric value of the OP's private flags.
+
+=item B<#seq>
+
+The sequence number of the OP. Note that this is a sequence number
+generated by B::Concise.
+
+=item B<#seqnum>
+
+5.8.x and earlier only. 5.9 and later do not provide this.
+
+The real sequence number of the OP, as a regular number and not adjusted
+to be relative to the start of the real program. (This will generally be
+a fairly large number because all of B<B::Concise> is compiled before
+your program is).
+
+=item B<#opt>
+
+Whether or not the op has been optimised by the peephole optimiser.
+
+Only available in 5.9 and later.
+
+=item B<#sibaddr>
+
+The address of the OP's next youngest sibling, in hexadecimal.
+
+=item B<#svaddr>
+
+The address of the OP's SV, if it has an SV, in hexadecimal.
+
+=item B<#svclass>
+
+The class of the OP's SV, if it has one, in all caps (e.g., 'IV').
+
+=item B<#svval>
+
+The value of the OP's SV, if it has one, in a short human-readable format.
+
+=item B<#targ>
+
+The numeric value of the OP's targ.
+
+=item B<#targarg>
+
+The name of the variable the OP's targ refers to, if any, otherwise the
+letter t followed by the OP's targ in decimal.
+
+=item B<#targarglife>
+
+Same as B<#targarg>, but followed by the COP sequence numbers that delimit
+the variable's lifetime (or 'end' for a variable in an open scope) for a
+variable.
+
+=item B<#typenum>
+
+The numeric value of the OP's type, in decimal.
+
+=back
+
+=head1 One-Liner Command tips
+
+=over 4
+
+=item perl -MO=Concise,bar foo.pl
+
+Renders only bar() from foo.pl. To see main, drop the ',bar'. To see
+both, add ',-main'
+
+=item perl -MDigest::MD5=md5 -MO=Concise,md5 -e1
+
+Identifies md5 as an XS function. The export is needed so that BC can
+find it in main.
+
+=item perl -MPOSIX -MO=Concise,_POSIX_ARG_MAX -e1
+
+Identifies _POSIX_ARG_MAX as a constant sub, optimized to an IV.
+Although POSIX isn't entirely consistent across platforms, this is
+likely to be present in virtually all of them.
+
+=item perl -MPOSIX -MO=Concise,a -e 'print _POSIX_SAVED_IDS'
+
+This renders a print statement, which includes a call to the function.
+It's identical to rendering a file with a use call and that single
+statement, except for the filename which appears in the nextstate ops.
+
+=item perl -MPOSIX -MO=Concise,a -e 'sub a{_POSIX_SAVED_IDS}'
+
+This is B<very> similar to previous, only the first two ops differ. This
+subroutine rendering is more representative, insofar as a single main
+program will have many subs.
+
+=item perl -MB::Concise -e 'B::Concise::compile("-exec","-src", \%B::Concise::)->()'
+
+This renders all functions in the B::Concise package with the source
+lines. It eschews the O framework so that the stashref can be passed
+directly to B::Concise::compile(). See -stash option for a more
+convenient way to render a package.
+
+=back
+
+=head1 Using B::Concise outside of the O framework
+
+The common (and original) usage of B::Concise was for command-line
+renderings of simple code, as given in EXAMPLE. But you can also use
+B<B::Concise> from your code, and call compile() directly, and
+repeatedly. By doing so, you can avoid the compile-time only
+operation of O.pm, and even use the debugger to step through
+B::Concise::compile() itself.
+
+Once you're doing this, you may alter Concise output by adding new
+rendering styles, and by optionally adding callback routines which
+populate new variables, if such were referenced from those (just
+added) styles.
+
+=head2 Example: Altering Concise Renderings
+
+ use B::Concise qw(set_style add_callback);
+ add_style($yourStyleName => $defaultfmt, $gotofmt, $treefmt);
+ add_callback
+ ( sub {
+ my ($h, $op, $format, $level, $stylename) = @_;
+ $h->{variable} = some_func($op);
+ });
+ $walker = B::Concise::compile(@options,@subnames,@subrefs);
+ $walker->();
+
+=head2 set_style()
+
+B<set_style> accepts 3 arguments, and updates the three format-specs
+comprising a line-style (basic-exec, goto, tree). It has one minor
+drawback though; it doesn't register the style under a new name. This
+can become an issue if you render more than once and switch styles.
+Thus you may prefer to use add_style() and/or set_style_standard()
+instead.
+
+=head2 set_style_standard($name)
+
+This restores one of the standard line-styles: C<terse>, C<concise>,
+C<linenoise>, C<debug>, C<env>, into effect. It also accepts style
+names previously defined with add_style().
+
+=head2 add_style()
+
+This subroutine accepts a new style name and three style arguments as
+above, and creates, registers, and selects the newly named style. It is
+an error to re-add a style; call set_style_standard() to switch between
+several styles.
+
+=head2 add_callback()
+
+If your newly minted styles refer to any new #variables, you'll need
+to define a callback subroutine that will populate (or modify) those
+variables. They are then available for use in the style you've
+chosen.
+
+The callbacks are called for each opcode visited by Concise, in the
+same order as they are added. Each subroutine is passed five
+parameters.
+
+ 1. A hashref, containing the variable names and values which are
+ populated into the report-line for the op
+ 2. the op, as a B<B::OP> object
+ 3. a reference to the format string
+ 4. the formatting (indent) level
+ 5. the selected stylename
+
+To define your own variables, simply add them to the hash, or change
+existing values if you need to. The level and format are passed in as
+references to scalars, but it is unlikely that they will need to be
+changed or even used.
+
+=head2 Running B::Concise::compile()
+
+B<compile> accepts options as described above in L</OPTIONS>, and
+arguments, which are either coderefs, or subroutine names.
+
+It constructs and returns a $treewalker coderef, which when invoked,
+traverses, or walks, and renders the optrees of the given arguments to
+STDOUT. You can reuse this, and can change the rendering style used
+each time; thereafter the coderef renders in the new style.
+
+B<walk_output> lets you change the print destination from STDOUT to
+another open filehandle, or into a string passed as a ref (unless
+you've built perl with -Uuseperlio).
+
+ my $walker = B::Concise::compile('-terse','aFuncName', \&aSubRef); # 1
+ walk_output(\my $buf);
+ $walker->(); # 1 renders -terse
+ set_style_standard('concise'); # 2
+ $walker->(); # 2 renders -concise
+ $walker->(@new); # 3 renders whatever
+ print "3 different renderings: terse, concise, and @new: $buf\n";
+
+When $walker is called, it traverses the subroutines supplied when it
+was created, and renders them using the current style. You can change
+the style afterwards in several different ways:
+
+ 1. call C<compile>, altering style or mode/order
+ 2. call C<set_style_standard>
+ 3. call $walker, passing @new options
+
+Passing new options to the $walker is the easiest way to change
+amongst any pre-defined styles (the ones you add are automatically
+recognized as options), and is the only way to alter rendering order
+without calling compile again. Note however that rendering state is
+still shared amongst multiple $walker objects, so they must still be
+used in a coordinated manner.
+
+=head2 B::Concise::reset_sequence()
+
+This function (not exported) lets you reset the sequence numbers (note
+that they're numbered arbitrarily, their goal being to be human
+readable). Its purpose is mostly to support testing, i.e. to compare
+the concise output from two identical anonymous subroutines (but
+different instances). Without the reset, B::Concise, seeing that
+they're separate optrees, generates different sequence numbers in
+the output.
+
+=head2 Errors
+
+Errors in rendering (non-existent function-name, non-existent coderef)
+are written to the STDOUT, or wherever you've set it via
+walk_output().
+
+Errors using the various *style* calls, and bad args to walk_output(),
+result in die(). Use an eval if you wish to catch these errors and
+continue processing.
+
+=head1 AUTHOR
+
+Stephen McCamant, E<lt>smcc@CSUA.Berkeley.EDUE<gt>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/B/Debug.pm b/Master/tlpkg/tlperl.straw/lib/B/Debug.pm
new file mode 100755
index 00000000000..2bcfb436d81
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/B/Debug.pm
@@ -0,0 +1,420 @@
+package B::Debug;
+
+our $VERSION = '1.11';
+
+use strict;
+require 5.006;
+use B qw(peekop class walkoptree walkoptree_exec
+ main_start main_root cstring sv_undef);
+use Config;
+my (@optype, @specialsv_name);
+require B;
+if ($] < 5.009) {
+ require B::Asmdata;
+ B::Asmdata->import qw(@optype @specialsv_name);
+} else {
+ B->import qw(@optype @specialsv_name);
+}
+my $have_B_Flags;
+if (!$ENV{PERL_CORE}){ # avoid CORE test crashes
+ eval { require B::Flags and $have_B_Flags++ };
+}
+my %done_gv;
+
+sub _printop {
+ my $op = shift;
+ my $addr = ${$op} ? $op->ppaddr : '';
+ $addr =~ s/^PL_ppaddr// if $addr;
+ return sprintf "0x%x %s %s", ${$op}, ${$op} ? class($op) : '', $addr;
+}
+
+sub B::OP::debug {
+ my ($op) = @_;
+ printf <<'EOT', class($op), $$op, $op->ppaddr, _printop($op->next), _printop($op->sibling), $op->targ, $op->type;
+%s (0x%lx)
+ op_ppaddr %s
+ op_next %s
+ op_sibling %s
+ op_targ %d
+ op_type %d
+EOT
+ if ($] > 5.009) {
+ printf <<'EOT', $op->opt;
+ op_opt %d
+EOT
+ } else {
+ printf <<'EOT', $op->seq;
+ op_seq %d
+EOT
+ }
+ if ($have_B_Flags) {
+ printf <<'EOT', $op->flags, $op->flagspv, $op->private, $op->privatepv;
+ op_flags %d %s
+ op_private %d %s
+EOT
+ } else {
+ printf <<'EOT', $op->flags, $op->private;
+ op_flags %d
+ op_private %d
+EOT
+ }
+}
+
+sub B::UNOP::debug {
+ my ($op) = @_;
+ $op->B::OP::debug();
+ printf "\top_first\t%s\n", _printop($op->first);
+}
+
+sub B::BINOP::debug {
+ my ($op) = @_;
+ $op->B::UNOP::debug();
+ printf "\top_last \t%s\n", _printop($op->last);
+}
+
+sub B::LOOP::debug {
+ my ($op) = @_;
+ $op->B::BINOP::debug();
+ printf <<'EOT', _printop($op->redoop), _printop($op->nextop), _printop($op->lastop);
+ op_redoop %s
+ op_nextop %s
+ op_lastop %s
+EOT
+}
+
+sub B::LOGOP::debug {
+ my ($op) = @_;
+ $op->B::UNOP::debug();
+ printf "\top_other\t%s\n", _printop($op->other);
+}
+
+sub B::LISTOP::debug {
+ my ($op) = @_;
+ $op->B::BINOP::debug();
+ printf "\top_children\t%d\n", $op->children;
+}
+
+sub B::PMOP::debug {
+ my ($op) = @_;
+ $op->B::LISTOP::debug();
+ printf "\top_pmreplroot\t0x%x\n", $] < 5.008 ? ${$op->pmreplroot} : $op->pmreplroot;
+ printf "\top_pmreplstart\t0x%x\n", ${$op->pmreplstart};
+ printf "\top_pmnext\t0x%x\n", ${$op->pmnext} if $] < 5.009005;
+ if ($Config{'useithreads'}) {
+ printf "\top_pmstashpv\t%s\n", cstring($op->pmstashpv);
+ printf "\top_pmoffset\t%d\n", $op->pmoffset;
+ } else {
+ printf "\top_pmstash\t%s\n", cstring($op->pmstash);
+ }
+ printf "\top_precomp\t%s\n", cstring($op->precomp);
+ printf "\top_pmflags\t0x%x\n", $op->pmflags;
+ printf "\top_reflags\t0x%x\n", $op->reflags if $] >= 5.009;
+ printf "\top_pmpermflags\t0x%x\n", $op->pmpermflags if $] < 5.009;
+ printf "\top_pmdynflags\t0x%x\n", $op->pmdynflags if $] < 5.009;
+ $op->pmreplroot->debug if $] < 5.008;
+}
+
+sub B::COP::debug {
+ my ($op) = @_;
+ $op->B::OP::debug();
+ my $cop_io = class($op->io) eq 'SPECIAL' ? '' : $op->io->as_string;
+ printf <<'EOT', $op->label, $op->stashpv, $op->file, $op->cop_seq, $op->arybase, $op->line, ${$op->warnings}, cstring($cop_io);
+ cop_label "%s"
+ cop_stashpv "%s"
+ cop_file "%s"
+ cop_seq %d
+ cop_arybase %d
+ cop_line %d
+ cop_warnings 0x%x
+ cop_io %s
+EOT
+}
+
+sub B::SVOP::debug {
+ my ($op) = @_;
+ $op->B::OP::debug();
+ printf "\top_sv\t\t0x%x\n", ${$op->sv};
+ $op->sv->debug;
+}
+
+sub B::PVOP::debug {
+ my ($op) = @_;
+ $op->B::OP::debug();
+ printf "\top_pv\t\t%s\n", cstring($op->pv);
+}
+
+sub B::PADOP::debug {
+ my ($op) = @_;
+ $op->B::OP::debug();
+ printf "\top_padix\t%ld\n", $op->padix;
+}
+
+sub B::NULL::debug {
+ my ($sv) = @_;
+ if ($$sv == ${sv_undef()}) {
+ print "&sv_undef\n";
+ } else {
+ printf "NULL (0x%x)\n", $$sv;
+ }
+}
+
+sub B::SV::debug {
+ my ($sv) = @_;
+ if (!$$sv) {
+ print class($sv), " = NULL\n";
+ return;
+ }
+ printf <<'EOT', class($sv), $$sv, $sv->REFCNT, $sv->FLAGS;
+%s (0x%x)
+ REFCNT %d
+ FLAGS 0x%x
+EOT
+}
+
+sub B::RV::debug {
+ my ($rv) = @_;
+ B::SV::debug($rv);
+ printf <<'EOT', ${$rv->RV};
+ RV 0x%x
+EOT
+ $rv->RV->debug;
+}
+
+sub B::PV::debug {
+ my ($sv) = @_;
+ $sv->B::SV::debug();
+ my $pv = $sv->PV();
+ printf <<'EOT', cstring($pv), length($pv);
+ xpv_pv %s
+ xpv_cur %d
+EOT
+}
+
+sub B::IV::debug {
+ my ($sv) = @_;
+ $sv->B::SV::debug();
+ printf "\txiv_iv\t\t%d\n", $sv->IV;
+}
+
+sub B::NV::debug {
+ my ($sv) = @_;
+ $sv->B::IV::debug();
+ printf "\txnv_nv\t\t%s\n", $sv->NV;
+}
+
+sub B::PVIV::debug {
+ my ($sv) = @_;
+ $sv->B::PV::debug();
+ printf "\txiv_iv\t\t%d\n", $sv->IV;
+}
+
+sub B::PVNV::debug {
+ my ($sv) = @_;
+ $sv->B::PVIV::debug();
+ printf "\txnv_nv\t\t%s\n", $sv->NV;
+}
+
+sub B::PVLV::debug {
+ my ($sv) = @_;
+ $sv->B::PVNV::debug();
+ printf "\txlv_targoff\t%d\n", $sv->TARGOFF;
+ printf "\txlv_targlen\t%u\n", $sv->TARGLEN;
+ printf "\txlv_type\t%s\n", cstring(chr($sv->TYPE));
+}
+
+sub B::BM::debug {
+ my ($sv) = @_;
+ $sv->B::PVNV::debug();
+ printf "\txbm_useful\t%d\n", $sv->USEFUL;
+ printf "\txbm_previous\t%u\n", $sv->PREVIOUS;
+ printf "\txbm_rare\t%s\n", cstring(chr($sv->RARE));
+}
+
+sub B::CV::debug {
+ my ($sv) = @_;
+ $sv->B::PVNV::debug();
+ my ($stash) = $sv->STASH;
+ my ($start) = $sv->START;
+ my ($root) = $sv->ROOT;
+ my ($padlist) = $sv->PADLIST;
+ my ($file) = $sv->FILE;
+ my ($gv) = $sv->GV;
+ printf <<'EOT', $$stash, $$start, $$root, $$gv, $file, $sv->DEPTH, $padlist, ${$sv->OUTSIDE}, $sv->OUTSIDE_SEQ;
+ STASH 0x%x
+ START 0x%x
+ ROOT 0x%x
+ GV 0x%x
+ FILE %s
+ DEPTH %d
+ PADLIST 0x%x
+ OUTSIDE 0x%x
+ OUTSIDE_SEQ %d
+EOT
+ $start->debug if $start;
+ $root->debug if $root;
+ $gv->debug if $gv;
+ $padlist->debug if $padlist;
+}
+
+sub B::AV::debug {
+ my ($av) = @_;
+ $av->B::SV::debug;
+ # tied arrays may leave out FETCHSIZE
+ my (@array) = eval { $av->ARRAY; };
+ print "\tARRAY\t\t(", join(", ", map("0x" . $$_, @array)), ")\n";
+ my $fill = eval { scalar(@array) };
+ if ($Config{'useithreads'}) {
+ printf <<'EOT', $fill, $av->MAX, $av->OFF;
+ FILL %d
+ MAX %d
+ OFF %d
+EOT
+ } else {
+ printf <<'EOT', $fill, $av->MAX;
+ FILL %d
+ MAX %d
+EOT
+ }
+ printf <<'EOT', $av->AvFLAGS if $] < 5.009;
+ AvFLAGS %d
+EOT
+}
+
+sub B::GV::debug {
+ my ($gv) = @_;
+ if ($done_gv{$$gv}++) {
+ printf "GV %s::%s\n", $gv->STASH->NAME, $gv->SAFENAME;
+ return;
+ }
+ my ($sv) = $gv->SV;
+ my ($av) = $gv->AV;
+ my ($cv) = $gv->CV;
+ $gv->B::SV::debug;
+ printf <<'EOT', $gv->SAFENAME, $gv->STASH->NAME, $gv->STASH, $$sv, $gv->GvREFCNT, $gv->FORM, $$av, ${$gv->HV}, ${$gv->EGV}, $$cv, $gv->CVGEN, $gv->LINE, $gv->FILE, $gv->GvFLAGS;
+ NAME %s
+ STASH %s (0x%x)
+ SV 0x%x
+ GvREFCNT %d
+ FORM 0x%x
+ AV 0x%x
+ HV 0x%x
+ EGV 0x%x
+ CV 0x%x
+ CVGEN %d
+ LINE %d
+ FILE %s
+ GvFLAGS 0x%x
+EOT
+ $sv->debug if $sv;
+ $av->debug if $av;
+ $cv->debug if $cv;
+}
+
+sub B::SPECIAL::debug {
+ my $sv = shift;
+ print $specialsv_name[$$sv], "\n";
+}
+
+sub compile {
+ my $order = shift;
+ B::clearsym();
+ if ($order && $order eq "exec") {
+ return sub { walkoptree_exec(main_start, "debug") }
+ } else {
+ return sub { walkoptree(main_root, "debug") }
+ }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Debug - Walk Perl syntax tree, printing debug info about ops
+
+=head1 SYNOPSIS
+
+ perl -MO=Debug[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+See F<ext/B/README> and the newer L<B::Concise>, L<B::Terse>.
+
+=head1 OPTIONS
+
+With option -exec, walks tree in execute order,
+otherwise in basic order.
+
+=head1 Changes
+
+ 1.11 2008-07-14 rurban
+ avoid B::Flags in CORE tests not to crash on old XS in @INC
+
+ 1.10 2008-06-28 rurban
+ require 5.006; Test::More not possible in 5.00505
+ our => my
+
+ 1.09 2008-06-18 rurban
+ minor META.yml syntax fix
+ 5.8.0 ending nextstate test failure: be more tolerant
+ PREREQ_PM Test::More
+
+ 1.08 2008-06-17 rurban
+ support 5.00558 - 5.6.2
+
+ 1.07 2008-06-16 rurban
+ debug.t: fix strawberry perl quoting issue
+
+ 1.06 2008-06-11 rurban
+ added B::Flags output
+ dual-life CPAN as B-Debug-1.06 and CORE
+ protect scalar(@array) if tied arrays leave out FETCHSIZE
+
+ 1.05_03 2008-04-16 rurban
+ ithread fixes in B::AV
+ B-C-1.04_??
+
+ B-C-1.04_09 2008-02-24 rurban
+ support 5.8 (import Asmdata)
+
+ 1.05_02 2008-02-21 rurban
+ added _printop
+ B-C-1.04_08 and CORE
+
+ 1.05_01 2008-02-05 rurban
+ 5.10 fix for op->seq
+ B-C-1.04_04
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+Reini Urban C<rurban@cpan.org>
+
+=head1 LICENSE
+
+Copyright (c) 1996, 1997 Malcolm Beattie
+Copyright (c) 2008 Reini Urban
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ a) the GNU General Public License as published by the Free
+ Software Foundation; either version 1, or (at your option) any
+ later version, or
+
+ b) the "Artistic License" which comes with this kit.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either
+ the GNU General Public License or the Artistic License for more details.
+
+ You should have received a copy of the Artistic License with this kit,
+ in the file named "Artistic". If not, you can get one from the Perl
+ distribution. You should also have received a copy of the GNU General
+ Public License, in the file named "Copying". If not, you can get one
+ from the Perl distribution or else write to the Free Software Foundation,
+ Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/B/Deparse.pm b/Master/tlpkg/tlperl.straw/lib/B/Deparse.pm
new file mode 100755
index 00000000000..85c4ef039e1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/B/Deparse.pm
@@ -0,0 +1,4858 @@
+# B::Deparse.pm
+# Copyright (c) 1998-2000, 2002, 2003, 2004, 2005, 2006 Stephen McCamant.
+# All rights reserved.
+# This module is free software; you can redistribute and/or modify
+# it under the same terms as Perl itself.
+
+# This is based on the module of the same name by Malcolm Beattie,
+# but essentially none of his code remains.
+
+package B::Deparse;
+use Carp;
+use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
+ OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST
+ OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD OPpPAD_STATE
+ OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE
+ OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY
+ OPpCONST_ARYBASE OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER
+ OPpSORT_REVERSE OPpSORT_INPLACE OPpSORT_DESCEND OPpITER_REVERSED
+ SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG
+ CVf_METHOD CVf_LVALUE
+ PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE
+ PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED),
+ ($] < 5.009 ? 'PMf_SKIPWHITE' : 'RXf_SKIPWHITE'),
+ ($] < 5.011 ? 'CVf_LOCKED' : ());
+$VERSION = 0.89;
+use strict;
+use vars qw/$AUTOLOAD/;
+use warnings ();
+
+BEGIN {
+ # Easiest way to keep this code portable between 5.12.x and 5.10.x looks to
+ # be to fake up a dummy CVf_LOCKED that will never actually be true.
+ *CVf_LOCKED = sub () {0} unless defined &CVf_LOCKED;
+}
+
+# Changes between 0.50 and 0.51:
+# - fixed nulled leave with live enter in sort { }
+# - fixed reference constants (\"str")
+# - handle empty programs gracefully
+# - handle infinte loops (for (;;) {}, while (1) {})
+# - differentiate between `for my $x ...' and `my $x; for $x ...'
+# - various minor cleanups
+# - moved globals into an object
+# - added `-u', like B::C
+# - package declarations using cop_stash
+# - subs, formats and code sorted by cop_seq
+# Changes between 0.51 and 0.52:
+# - added pp_threadsv (special variables under USE_5005THREADS)
+# - added documentation
+# Changes between 0.52 and 0.53:
+# - many changes adding precedence contexts and associativity
+# - added `-p' and `-s' output style options
+# - various other minor fixes
+# Changes between 0.53 and 0.54:
+# - added support for new `for (1..100)' optimization,
+# thanks to Gisle Aas
+# Changes between 0.54 and 0.55:
+# - added support for new qr// construct
+# - added support for new pp_regcreset OP
+# Changes between 0.55 and 0.56:
+# - tested on base/*.t, cmd/*.t, comp/*.t, io/*.t
+# - fixed $# on non-lexicals broken in last big rewrite
+# - added temporary fix for change in opcode of OP_STRINGIFY
+# - fixed problem in 0.54's for() patch in `for (@ary)'
+# - fixed precedence in conditional of ?:
+# - tweaked list paren elimination in `my($x) = @_'
+# - made continue-block detection trickier wrt. null ops
+# - fixed various prototype problems in pp_entersub
+# - added support for sub prototypes that never get GVs
+# - added unquoting for special filehandle first arg in truncate
+# - print doubled rv2gv (a bug) as `*{*GV}' instead of illegal `**GV'
+# - added semicolons at the ends of blocks
+# - added -l `#line' declaration option -- fixes cmd/subval.t 27,28
+# Changes between 0.56 and 0.561:
+# - fixed multiply-declared my var in pp_truncate (thanks to Sarathy)
+# - used new B.pm symbolic constants (done by Nick Ing-Simmons)
+# Changes between 0.561 and 0.57:
+# - stylistic changes to symbolic constant stuff
+# - handled scope in s///e replacement code
+# - added unquote option for expanding "" into concats, etc.
+# - split method and proto parts of pp_entersub into separate functions
+# - various minor cleanups
+# Changes after 0.57:
+# - added parens in \&foo (patch by Albert Dvornik)
+# Changes between 0.57 and 0.58:
+# - fixed `0' statements that weren't being printed
+# - added methods for use from other programs
+# (based on patches from James Duncan and Hugo van der Sanden)
+# - added -si and -sT to control indenting (also based on a patch from Hugo)
+# - added -sv to print something else instead of '???'
+# - preliminary version of utf8 tr/// handling
+# Changes after 0.58:
+# - uses of $op->ppaddr changed to new $op->name (done by Sarathy)
+# - added support for Hugo's new OP_SETSTATE (like nextstate)
+# Changes between 0.58 and 0.59
+# - added support for Chip's OP_METHOD_NAMED
+# - added support for Ilya's OPpTARGET_MY optimization
+# - elided arrows before `()' subscripts when possible
+# Changes between 0.59 and 0.60
+# - support for method attribues was added
+# - some warnings fixed
+# - separate recognition of constant subs
+# - rewrote continue block handling, now recoginizing for loops
+# - added more control of expanding control structures
+# Changes between 0.60 and 0.61 (mostly by Robin Houston)
+# - many bug-fixes
+# - support for pragmas and 'use'
+# - support for the little-used $[ variable
+# - support for __DATA__ sections
+# - UTF8 support
+# - BEGIN, CHECK, INIT and END blocks
+# - scoping of subroutine declarations fixed
+# - compile-time output from the input program can be suppressed, so that the
+# output is just the deparsed code. (a change to O.pm in fact)
+# - our() declarations
+# - *all* the known bugs are now listed in the BUGS section
+# - comprehensive test mechanism (TEST -deparse)
+# Changes between 0.62 and 0.63 (mostly by Rafael Garcia-Suarez)
+# - bug-fixes
+# - new switch -P
+# - support for command-line switches (-l, -0, etc.)
+# Changes between 0.63 and 0.64
+# - support for //, CHECK blocks, and assertions
+# - improved handling of foreach loops and lexicals
+# - option to use Data::Dumper for constants
+# - more bug fixes
+# - discovered lots more bugs not yet fixed
+#
+# ...
+#
+# Changes between 0.72 and 0.73
+# - support new switch constructs
+
+# Todo:
+# (See also BUGS section at the end of this file)
+#
+# - finish tr/// changes
+# - add option for even more parens (generalize \&foo change)
+# - left/right context
+# - copy comments (look at real text with $^P?)
+# - avoid semis in one-statement blocks
+# - associativity of &&=, ||=, ?:
+# - ',' => '=>' (auto-unquote?)
+# - break long lines ("\r" as discretionary break?)
+# - configurable syntax highlighting: ANSI color, HTML, TeX, etc.
+# - more style options: brace style, hex vs. octal, quotes, ...
+# - print big ints as hex/octal instead of decimal (heuristic?)
+# - handle `my $x if 0'?
+# - version using op_next instead of op_first/sibling?
+# - avoid string copies (pass arrays, one big join?)
+# - here-docs?
+
+# Current test.deparse failures
+# comp/hints 6 - location of BEGIN blocks wrt. block openings
+# run/switchI 1 - missing -I switches entirely
+# perl -Ifoo -e 'print @INC'
+# op/caller 2 - warning mask propagates backwards before warnings::register
+# 'use warnings; BEGIN {${^WARNING_BITS} eq "U"x12;} use warnings::register'
+# op/getpid 2 - can't assign to shared my() declaration (threads only)
+# 'my $x : shared = 5'
+# op/override 7 - parens on overriden require change v-string interpretation
+# 'BEGIN{*CORE::GLOBAL::require=sub {}} require v5.6'
+# c.f. 'BEGIN { *f = sub {0} }; f 2'
+# op/pat 774 - losing Unicode-ness of Latin1-only strings
+# 'use charnames ":short"; $x="\N{latin:a with acute}"'
+# op/recurse 12 - missing parens on recursive call makes it look like method
+# 'sub f { f($x) }'
+# op/subst 90 - inconsistent handling of utf8 under "use utf8"
+# op/taint 29 - "use re 'taint'" deparsed in the wrong place wrt. block open
+# op/tiehandle compile - "use strict" deparsed in the wrong place
+# uni/tr_ several
+# ext/B/t/xref 11 - line numbers when we add newlines to one-line subs
+# ext/Data/Dumper/t/dumper compile
+# ext/DB_file/several
+# ext/Encode/several
+# ext/Ernno/Errno warnings
+# ext/IO/lib/IO/t/io_sel 23
+# ext/PerlIO/t/encoding compile
+# ext/POSIX/t/posix 6
+# ext/Socket/Socket 8
+# ext/Storable/t/croak compile
+# lib/Attribute/Handlers/t/multi compile
+# lib/bignum/ several
+# lib/charnames 35
+# lib/constant 32
+# lib/English 40
+# lib/ExtUtils/t/bytes 4
+# lib/File/DosGlob compile
+# lib/Filter/Simple/t/data 1
+# lib/Math/BigInt/t/constant 1
+# lib/Net/t/config Deparse-warning
+# lib/overload compile
+# lib/Switch/ several
+# lib/Symbol 4
+# lib/Test/Simple several
+# lib/Term/Complete
+# lib/Tie/File/t/29_downcopy 5
+# lib/vars 22
+
+# Object fields (were globals):
+#
+# avoid_local:
+# (local($a), local($b)) and local($a, $b) have the same internal
+# representation but the short form looks better. We notice we can
+# use a large-scale local when checking the list, but need to prevent
+# individual locals too. This hash holds the addresses of OPs that
+# have already had their local-ness accounted for. The same thing
+# is done with my().
+#
+# curcv:
+# CV for current sub (or main program) being deparsed
+#
+# curcvlex:
+# Cached hash of lexical variables for curcv: keys are names,
+# each value is an array of pairs, indicating the cop_seq of scopes
+# in which a var of that name is valid.
+#
+# curcop:
+# COP for statement being deparsed
+#
+# curstash:
+# name of the current package for deparsed code
+#
+# subs_todo:
+# array of [cop_seq, CV, is_format?] for subs and formats we still
+# want to deparse
+#
+# protos_todo:
+# as above, but [name, prototype] for subs that never got a GV
+#
+# subs_done, forms_done:
+# keys are addresses of GVs for subs and formats we've already
+# deparsed (or at least put into subs_todo)
+#
+# subs_declared
+# keys are names of subs for which we've printed declarations.
+# That means we can omit parentheses from the arguments.
+#
+# subs_deparsed
+# Keeps track of fully qualified names of all deparsed subs.
+#
+# parens: -p
+# linenums: -l
+# unquote: -q
+# cuddle: ` ' or `\n', depending on -sC
+# indent_size: -si
+# use_tabs: -sT
+# ex_const: -sv
+
+# A little explanation of how precedence contexts and associativity
+# work:
+#
+# deparse() calls each per-op subroutine with an argument $cx (short
+# for context, but not the same as the cx* in the perl core), which is
+# a number describing the op's parents in terms of precedence, whether
+# they're inside an expression or at statement level, etc. (see
+# chart below). When ops with children call deparse on them, they pass
+# along their precedence. Fractional values are used to implement
+# associativity (`($x + $y) + $z' => `$x + $y + $y') and related
+# parentheses hacks. The major disadvantage of this scheme is that
+# it doesn't know about right sides and left sides, so say if you
+# assign a listop to a variable, it can't tell it's allowed to leave
+# the parens off the listop.
+
+# Precedences:
+# 26 [TODO] inside interpolation context ("")
+# 25 left terms and list operators (leftward)
+# 24 left ->
+# 23 nonassoc ++ --
+# 22 right **
+# 21 right ! ~ \ and unary + and -
+# 20 left =~ !~
+# 19 left * / % x
+# 18 left + - .
+# 17 left << >>
+# 16 nonassoc named unary operators
+# 15 nonassoc < > <= >= lt gt le ge
+# 14 nonassoc == != <=> eq ne cmp
+# 13 left &
+# 12 left | ^
+# 11 left &&
+# 10 left ||
+# 9 nonassoc .. ...
+# 8 right ?:
+# 7 right = += -= *= etc.
+# 6 left , =>
+# 5 nonassoc list operators (rightward)
+# 4 right not
+# 3 left and
+# 2 left or xor
+# 1 statement modifiers
+# 0.5 statements, but still print scopes as do { ... }
+# 0 statement level
+
+# Nonprinting characters with special meaning:
+# \cS - steal parens (see maybe_parens_unop)
+# \n - newline and indent
+# \t - increase indent
+# \b - decrease indent (`outdent')
+# \f - flush left (no indent)
+# \cK - kill following semicolon, if any
+
+sub null {
+ my $op = shift;
+ return class($op) eq "NULL";
+}
+
+sub todo {
+ my $self = shift;
+ my($cv, $is_form) = @_;
+ return unless ($cv->FILE eq $0 || exists $self->{files}{$cv->FILE});
+ my $seq;
+ if ($cv->OUTSIDE_SEQ) {
+ $seq = $cv->OUTSIDE_SEQ;
+ } elsif (!null($cv->START) and is_state($cv->START)) {
+ $seq = $cv->START->cop_seq;
+ } else {
+ $seq = 0;
+ }
+ push @{$self->{'subs_todo'}}, [$seq, $cv, $is_form];
+ unless ($is_form || class($cv->STASH) eq 'SPECIAL') {
+ $self->{'subs_deparsed'}{$cv->STASH->NAME."::".$cv->GV->NAME} = 1;
+ }
+}
+
+sub next_todo {
+ my $self = shift;
+ my $ent = shift @{$self->{'subs_todo'}};
+ my $cv = $ent->[1];
+ my $gv = $cv->GV;
+ my $name = $self->gv_name($gv);
+ if ($ent->[2]) {
+ return "format $name =\n"
+ . $self->deparse_format($ent->[1]). "\n";
+ } else {
+ $self->{'subs_declared'}{$name} = 1;
+ if ($name eq "BEGIN") {
+ my $use_dec = $self->begin_is_use($cv);
+ if (defined ($use_dec) and $self->{'expand'} < 5) {
+ return () if 0 == length($use_dec);
+ return $use_dec;
+ }
+ }
+ my $l = '';
+ if ($self->{'linenums'}) {
+ my $line = $gv->LINE;
+ my $file = $gv->FILE;
+ $l = "\n\f#line $line \"$file\"\n";
+ }
+ my $p = '';
+ if (class($cv->STASH) ne "SPECIAL") {
+ my $stash = $cv->STASH->NAME;
+ if ($stash ne $self->{'curstash'}) {
+ $p = "package $stash;\n";
+ $name = "$self->{'curstash'}::$name" unless $name =~ /::/;
+ $self->{'curstash'} = $stash;
+ }
+ $name =~ s/^\Q$stash\E::(?!\z|.*::)//;
+ }
+ return "${p}${l}sub $name " . $self->deparse_sub($cv);
+ }
+}
+
+# Return a "use" declaration for this BEGIN block, if appropriate
+sub begin_is_use {
+ my ($self, $cv) = @_;
+ my $root = $cv->ROOT;
+ local @$self{qw'curcv curcvlex'} = ($cv);
+#require B::Debug;
+#B::walkoptree($cv->ROOT, "debug");
+ my $lineseq = $root->first;
+ return if $lineseq->name ne "lineseq";
+
+ my $req_op = $lineseq->first->sibling;
+ return if $req_op->name ne "require";
+
+ my $module;
+ if ($req_op->first->private & OPpCONST_BARE) {
+ # Actually it should always be a bareword
+ $module = $self->const_sv($req_op->first)->PV;
+ $module =~ s[/][::]g;
+ $module =~ s/.pm$//;
+ }
+ else {
+ $module = $self->const($self->const_sv($req_op->first), 6);
+ }
+
+ my $version;
+ my $version_op = $req_op->sibling;
+ return if class($version_op) eq "NULL";
+ if ($version_op->name eq "lineseq") {
+ # We have a version parameter; skip nextstate & pushmark
+ my $constop = $version_op->first->next->next;
+
+ return unless $self->const_sv($constop)->PV eq $module;
+ $constop = $constop->sibling;
+ $version = $self->const_sv($constop);
+ if (class($version) eq "IV") {
+ $version = $version->int_value;
+ } elsif (class($version) eq "NV") {
+ $version = $version->NV;
+ } elsif (class($version) ne "PVMG") {
+ # Includes PVIV and PVNV
+ $version = $version->PV;
+ } else {
+ # version specified as a v-string
+ $version = 'v'.join '.', map ord, split //, $version->PV;
+ }
+ $constop = $constop->sibling;
+ return if $constop->name ne "method_named";
+ return if $self->const_sv($constop)->PV ne "VERSION";
+ }
+
+ $lineseq = $version_op->sibling;
+ return if $lineseq->name ne "lineseq";
+ my $entersub = $lineseq->first->sibling;
+ if ($entersub->name eq "stub") {
+ return "use $module $version ();\n" if defined $version;
+ return "use $module ();\n";
+ }
+ return if $entersub->name ne "entersub";
+
+ # See if there are import arguments
+ my $args = '';
+
+ my $svop = $entersub->first->sibling; # Skip over pushmark
+ return unless $self->const_sv($svop)->PV eq $module;
+
+ # Pull out the arguments
+ for ($svop=$svop->sibling; $svop->name ne "method_named";
+ $svop = $svop->sibling) {
+ $args .= ", " if length($args);
+ $args .= $self->deparse($svop, 6);
+ }
+
+ my $use = 'use';
+ my $method_named = $svop;
+ return if $method_named->name ne "method_named";
+ my $method_name = $self->const_sv($method_named)->PV;
+
+ if ($method_name eq "unimport") {
+ $use = 'no';
+ }
+
+ # Certain pragmas are dealt with using hint bits,
+ # so we ignore them here
+ if ($module eq 'strict' || $module eq 'integer'
+ || $module eq 'bytes' || $module eq 'warnings'
+ || $module eq 'feature') {
+ return "";
+ }
+
+ if (defined $version && length $args) {
+ return "$use $module $version ($args);\n";
+ } elsif (defined $version) {
+ return "$use $module $version;\n";
+ } elsif (length $args) {
+ return "$use $module ($args);\n";
+ } else {
+ return "$use $module;\n";
+ }
+}
+
+sub stash_subs {
+ my ($self, $pack) = @_;
+ my (@ret, $stash);
+ if (!defined $pack) {
+ $pack = '';
+ $stash = \%::;
+ }
+ else {
+ $pack =~ s/(::)?$/::/;
+ no strict 'refs';
+ $stash = \%$pack;
+ }
+ my %stash = svref_2object($stash)->ARRAY;
+ while (my ($key, $val) = each %stash) {
+ my $class = class($val);
+ if ($class eq "PV") {
+ # Just a prototype. As an ugly but fairly effective way
+ # to find out if it belongs here is to see if the AUTOLOAD
+ # (if any) for the stash was defined in one of our files.
+ my $A = $stash{"AUTOLOAD"};
+ if (defined ($A) && class($A) eq "GV" && defined($A->CV)
+ && class($A->CV) eq "CV") {
+ my $AF = $A->FILE;
+ next unless $AF eq $0 || exists $self->{'files'}{$AF};
+ }
+ push @{$self->{'protos_todo'}}, [$pack . $key, $val->PV];
+ } elsif ($class eq "IV") {
+ # Just a name. As above.
+ my $A = $stash{"AUTOLOAD"};
+ if (defined ($A) && class($A) eq "GV" && defined($A->CV)
+ && class($A->CV) eq "CV") {
+ my $AF = $A->FILE;
+ next unless $AF eq $0 || exists $self->{'files'}{$AF};
+ }
+ push @{$self->{'protos_todo'}}, [$pack . $key, undef];
+ } elsif ($class eq "GV") {
+ if (class(my $cv = $val->CV) ne "SPECIAL") {
+ next if $self->{'subs_done'}{$$val}++;
+ next if $$val != ${$cv->GV}; # Ignore imposters
+ $self->todo($cv, 0);
+ }
+ if (class(my $cv = $val->FORM) ne "SPECIAL") {
+ next if $self->{'forms_done'}{$$val}++;
+ next if $$val != ${$cv->GV}; # Ignore imposters
+ $self->todo($cv, 1);
+ }
+ if (class($val->HV) ne "SPECIAL" && $key =~ /::$/) {
+ $self->stash_subs($pack . $key)
+ unless $pack eq '' && $key eq 'main::';
+ # avoid infinite recursion
+ }
+ }
+ }
+}
+
+sub print_protos {
+ my $self = shift;
+ my $ar;
+ my @ret;
+ foreach $ar (@{$self->{'protos_todo'}}) {
+ my $proto = (defined $ar->[1] ? " (". $ar->[1] . ")" : "");
+ push @ret, "sub " . $ar->[0] . "$proto;\n";
+ }
+ delete $self->{'protos_todo'};
+ return @ret;
+}
+
+sub style_opts {
+ my $self = shift;
+ my $opts = shift;
+ my $opt;
+ while (length($opt = substr($opts, 0, 1))) {
+ if ($opt eq "C") {
+ $self->{'cuddle'} = " ";
+ $opts = substr($opts, 1);
+ } elsif ($opt eq "i") {
+ $opts =~ s/^i(\d+)//;
+ $self->{'indent_size'} = $1;
+ } elsif ($opt eq "T") {
+ $self->{'use_tabs'} = 1;
+ $opts = substr($opts, 1);
+ } elsif ($opt eq "v") {
+ $opts =~ s/^v([^.]*)(.|$)//;
+ $self->{'ex_const'} = $1;
+ }
+ }
+}
+
+sub new {
+ my $class = shift;
+ my $self = bless {}, $class;
+ $self->{'cuddle'} = "\n";
+ $self->{'curcop'} = undef;
+ $self->{'curstash'} = "main";
+ $self->{'ex_const'} = "'???'";
+ $self->{'expand'} = 0;
+ $self->{'files'} = {};
+ $self->{'indent_size'} = 4;
+ $self->{'linenums'} = 0;
+ $self->{'parens'} = 0;
+ $self->{'subs_todo'} = [];
+ $self->{'unquote'} = 0;
+ $self->{'use_dumper'} = 0;
+ $self->{'use_tabs'} = 0;
+
+ $self->{'ambient_arybase'} = 0;
+ $self->{'ambient_warnings'} = undef; # Assume no lexical warnings
+ $self->{'ambient_hints'} = 0;
+ $self->{'ambient_hinthash'} = undef;
+ $self->init();
+
+ while (my $arg = shift @_) {
+ if ($arg eq "-d") {
+ $self->{'use_dumper'} = 1;
+ require Data::Dumper;
+ } elsif ($arg =~ /^-f(.*)/) {
+ $self->{'files'}{$1} = 1;
+ } elsif ($arg eq "-l") {
+ $self->{'linenums'} = 1;
+ } elsif ($arg eq "-p") {
+ $self->{'parens'} = 1;
+ } elsif ($arg eq "-P") {
+ $self->{'noproto'} = 1;
+ } elsif ($arg eq "-q") {
+ $self->{'unquote'} = 1;
+ } elsif (substr($arg, 0, 2) eq "-s") {
+ $self->style_opts(substr $arg, 2);
+ } elsif ($arg =~ /^-x(\d)$/) {
+ $self->{'expand'} = $1;
+ }
+ }
+ return $self;
+}
+
+{
+ # Mask out the bits that L<warnings::register> uses
+ my $WARN_MASK;
+ BEGIN {
+ $WARN_MASK = $warnings::Bits{all} | $warnings::DeadBits{all};
+ }
+ sub WARN_MASK () {
+ return $WARN_MASK;
+ }
+}
+
+# Initialise the contextual information, either from
+# defaults provided with the ambient_pragmas method,
+# or from perl's own defaults otherwise.
+sub init {
+ my $self = shift;
+
+ $self->{'arybase'} = $self->{'ambient_arybase'};
+ $self->{'warnings'} = defined ($self->{'ambient_warnings'})
+ ? $self->{'ambient_warnings'} & WARN_MASK
+ : undef;
+ $self->{'hints'} = $self->{'ambient_hints'};
+ $self->{'hints'} &= 0xFF if $] < 5.009;
+ $self->{'hinthash'} = $self->{'ambient_hinthash'};
+
+ # also a convenient place to clear out subs_declared
+ delete $self->{'subs_declared'};
+}
+
+sub compile {
+ my(@args) = @_;
+ return sub {
+ my $self = B::Deparse->new(@args);
+ # First deparse command-line args
+ if (defined $^I) { # deparse -i
+ print q(BEGIN { $^I = ).perlstring($^I).qq(; }\n);
+ }
+ if ($^W) { # deparse -w
+ print qq(BEGIN { \$^W = $^W; }\n);
+ }
+ if ($/ ne "\n" or defined $O::savebackslash) { # deparse -l and -0
+ my $fs = perlstring($/) || 'undef';
+ my $bs = perlstring($O::savebackslash) || 'undef';
+ print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n);
+ }
+ my @BEGINs = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : ();
+ my @UNITCHECKs = B::unitcheck_av->isa("B::AV")
+ ? B::unitcheck_av->ARRAY
+ : ();
+ my @CHECKs = B::check_av->isa("B::AV") ? B::check_av->ARRAY : ();
+ my @INITs = B::init_av->isa("B::AV") ? B::init_av->ARRAY : ();
+ my @ENDs = B::end_av->isa("B::AV") ? B::end_av->ARRAY : ();
+ for my $block (@BEGINs, @UNITCHECKs, @CHECKs, @INITs, @ENDs) {
+ $self->todo($block, 0);
+ }
+ $self->stash_subs();
+ local($SIG{"__DIE__"}) =
+ sub {
+ if ($self->{'curcop'}) {
+ my $cop = $self->{'curcop'};
+ my($line, $file) = ($cop->line, $cop->file);
+ print STDERR "While deparsing $file near line $line,\n";
+ }
+ };
+ $self->{'curcv'} = main_cv;
+ $self->{'curcvlex'} = undef;
+ print $self->print_protos;
+ @{$self->{'subs_todo'}} =
+ sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}};
+ print $self->indent($self->deparse_root(main_root)), "\n"
+ unless null main_root;
+ my @text;
+ while (scalar(@{$self->{'subs_todo'}})) {
+ push @text, $self->next_todo;
+ }
+ print $self->indent(join("", @text)), "\n" if @text;
+
+ # Print __DATA__ section, if necessary
+ no strict 'refs';
+ my $laststash = defined $self->{'curcop'}
+ ? $self->{'curcop'}->stash->NAME : $self->{'curstash'};
+ if (defined *{$laststash."::DATA"}{IO}) {
+ print "package $laststash;\n"
+ unless $laststash eq $self->{'curstash'};
+ print "__DATA__\n";
+ print readline(*{$laststash."::DATA"});
+ }
+ }
+}
+
+sub coderef2text {
+ my $self = shift;
+ my $sub = shift;
+ croak "Usage: ->coderef2text(CODEREF)" unless UNIVERSAL::isa($sub, "CODE");
+
+ $self->init();
+ return $self->indent($self->deparse_sub(svref_2object($sub)));
+}
+
+sub ambient_pragmas {
+ my $self = shift;
+ my ($arybase, $hint_bits, $warning_bits, $hinthash) = (0, 0);
+
+ while (@_ > 1) {
+ my $name = shift();
+ my $val = shift();
+
+ if ($name eq 'strict') {
+ require strict;
+
+ if ($val eq 'none') {
+ $hint_bits &= ~strict::bits(qw/refs subs vars/);
+ next();
+ }
+
+ my @names;
+ if ($val eq "all") {
+ @names = qw/refs subs vars/;
+ }
+ elsif (ref $val) {
+ @names = @$val;
+ }
+ else {
+ @names = split' ', $val;
+ }
+ $hint_bits |= strict::bits(@names);
+ }
+
+ elsif ($name eq '$[') {
+ $arybase = $val;
+ }
+
+ elsif ($name eq 'integer'
+ || $name eq 'bytes'
+ || $name eq 'utf8') {
+ require "$name.pm";
+ if ($val) {
+ $hint_bits |= ${$::{"${name}::"}{"hint_bits"}};
+ }
+ else {
+ $hint_bits &= ~${$::{"${name}::"}{"hint_bits"}};
+ }
+ }
+
+ elsif ($name eq 're') {
+ require re;
+ if ($val eq 'none') {
+ $hint_bits &= ~re::bits(qw/taint eval/);
+ next();
+ }
+
+ my @names;
+ if ($val eq 'all') {
+ @names = qw/taint eval/;
+ }
+ elsif (ref $val) {
+ @names = @$val;
+ }
+ else {
+ @names = split' ',$val;
+ }
+ $hint_bits |= re::bits(@names);
+ }
+
+ elsif ($name eq 'warnings') {
+ if ($val eq 'none') {
+ $warning_bits = $warnings::NONE;
+ next();
+ }
+
+ my @names;
+ if (ref $val) {
+ @names = @$val;
+ }
+ else {
+ @names = split/\s+/, $val;
+ }
+
+ $warning_bits = $warnings::NONE if !defined ($warning_bits);
+ $warning_bits |= warnings::bits(@names);
+ }
+
+ elsif ($name eq 'warning_bits') {
+ $warning_bits = $val;
+ }
+
+ elsif ($name eq 'hint_bits') {
+ $hint_bits = $val;
+ }
+
+ elsif ($name eq '%^H') {
+ $hinthash = $val;
+ }
+
+ else {
+ croak "Unknown pragma type: $name";
+ }
+ }
+ if (@_) {
+ croak "The ambient_pragmas method expects an even number of args";
+ }
+
+ $self->{'ambient_arybase'} = $arybase;
+ $self->{'ambient_warnings'} = $warning_bits;
+ $self->{'ambient_hints'} = $hint_bits;
+ $self->{'ambient_hinthash'} = $hinthash;
+}
+
+# This method is the inner loop, so try to keep it simple
+sub deparse {
+ my $self = shift;
+ my($op, $cx) = @_;
+
+ Carp::confess("Null op in deparse") if !defined($op)
+ || class($op) eq "NULL";
+ my $meth = "pp_" . $op->name;
+ return $self->$meth($op, $cx);
+}
+
+sub indent {
+ my $self = shift;
+ my $txt = shift;
+ my @lines = split(/\n/, $txt);
+ my $leader = "";
+ my $level = 0;
+ my $line;
+ for $line (@lines) {
+ my $cmd = substr($line, 0, 1);
+ if ($cmd eq "\t" or $cmd eq "\b") {
+ $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'};
+ if ($self->{'use_tabs'}) {
+ $leader = "\t" x ($level / 8) . " " x ($level % 8);
+ } else {
+ $leader = " " x $level;
+ }
+ $line = substr($line, 1);
+ }
+ if (substr($line, 0, 1) eq "\f") {
+ $line = substr($line, 1); # no indent
+ } else {
+ $line = $leader . $line;
+ }
+ $line =~ s/\cK;?//g;
+ }
+ return join("\n", @lines);
+}
+
+sub deparse_sub {
+ my $self = shift;
+ my $cv = shift;
+ my $proto = "";
+Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL");
+Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
+ local $self->{'curcop'} = $self->{'curcop'};
+ if ($cv->FLAGS & SVf_POK) {
+ $proto = "(". $cv->PV . ") ";
+ }
+ if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE)) {
+ $proto .= ": ";
+ $proto .= "lvalue " if $cv->CvFLAGS & CVf_LVALUE;
+ $proto .= "locked " if $cv->CvFLAGS & CVf_LOCKED;
+ $proto .= "method " if $cv->CvFLAGS & CVf_METHOD;
+ }
+
+ local($self->{'curcv'}) = $cv;
+ local($self->{'curcvlex'});
+ local(@$self{qw'curstash warnings hints hinthash'})
+ = @$self{qw'curstash warnings hints hinthash'};
+ my $body;
+ if (not null $cv->ROOT) {
+ my $lineseq = $cv->ROOT->first;
+ if ($lineseq->name eq "lineseq") {
+ my @ops;
+ for(my$o=$lineseq->first; $$o; $o=$o->sibling) {
+ push @ops, $o;
+ }
+ $body = $self->lineseq(undef, @ops).";";
+ my $scope_en = $self->find_scope_en($lineseq);
+ if (defined $scope_en) {
+ my $subs = join"", $self->seq_subs($scope_en);
+ $body .= ";\n$subs" if length($subs);
+ }
+ }
+ else {
+ $body = $self->deparse($cv->ROOT->first, 0);
+ }
+ }
+ else {
+ my $sv = $cv->const_sv;
+ if ($$sv) {
+ # uh-oh. inlinable sub... format it differently
+ return $proto . "{ " . $self->const($sv, 0) . " }\n";
+ } else { # XSUB? (or just a declaration)
+ return "$proto;\n";
+ }
+ }
+ return $proto ."{\n\t$body\n\b}" ."\n";
+}
+
+sub deparse_format {
+ my $self = shift;
+ my $form = shift;
+ my @text;
+ local($self->{'curcv'}) = $form;
+ local($self->{'curcvlex'});
+ local($self->{'in_format'}) = 1;
+ local(@$self{qw'curstash warnings hints hinthash'})
+ = @$self{qw'curstash warnings hints hinthash'};
+ my $op = $form->ROOT;
+ my $kid;
+ return "\f." if $op->first->name eq 'stub'
+ || $op->first->name eq 'nextstate';
+ $op = $op->first->first; # skip leavewrite, lineseq
+ while (not null $op) {
+ $op = $op->sibling; # skip nextstate
+ my @exprs;
+ $kid = $op->first->sibling; # skip pushmark
+ push @text, "\f".$self->const_sv($kid)->PV;
+ $kid = $kid->sibling;
+ for (; not null $kid; $kid = $kid->sibling) {
+ push @exprs, $self->deparse($kid, 0);
+ }
+ push @text, "\f".join(", ", @exprs)."\n" if @exprs;
+ $op = $op->sibling;
+ }
+ return join("", @text) . "\f.";
+}
+
+sub is_scope {
+ my $op = shift;
+ return $op->name eq "leave" || $op->name eq "scope"
+ || $op->name eq "lineseq"
+ || ($op->name eq "null" && class($op) eq "UNOP"
+ && (is_scope($op->first) || $op->first->name eq "enter"));
+}
+
+sub is_state {
+ my $name = $_[0]->name;
+ return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate";
+}
+
+sub is_miniwhile { # check for one-line loop (`foo() while $y--')
+ my $op = shift;
+ return (!null($op) and null($op->sibling)
+ and $op->name eq "null" and class($op) eq "UNOP"
+ and (($op->first->name =~ /^(and|or)$/
+ and $op->first->first->sibling->name eq "lineseq")
+ or ($op->first->name eq "lineseq"
+ and not null $op->first->first->sibling
+ and $op->first->first->sibling->name eq "unstack")
+ ));
+}
+
+# Check if the op and its sibling are the initialization and the rest of a
+# for (..;..;..) { ... } loop
+sub is_for_loop {
+ my $op = shift;
+ # This OP might be almost anything, though it won't be a
+ # nextstate. (It's the initialization, so in the canonical case it
+ # will be an sassign.) The sibling is a lineseq whose first child
+ # is a nextstate and whose second is a leaveloop.
+ my $lseq = $op->sibling;
+ if (!is_state $op and !null($lseq) and $lseq->name eq "lineseq") {
+ if ($lseq->first && !null($lseq->first) && is_state($lseq->first)
+ && (my $sib = $lseq->first->sibling)) {
+ return (!null($sib) && $sib->name eq "leaveloop");
+ }
+ }
+ return 0;
+}
+
+sub is_scalar {
+ my $op = shift;
+ return ($op->name eq "rv2sv" or
+ $op->name eq "padsv" or
+ $op->name eq "gv" or # only in array/hash constructs
+ $op->flags & OPf_KIDS && !null($op->first)
+ && $op->first->name eq "gvsv");
+}
+
+sub maybe_parens {
+ my $self = shift;
+ my($text, $cx, $prec) = @_;
+ if ($prec < $cx # unary ops nest just fine
+ or $prec == $cx and $cx != 4 and $cx != 16 and $cx != 21
+ or $self->{'parens'})
+ {
+ $text = "($text)";
+ # In a unop, let parent reuse our parens; see maybe_parens_unop
+ $text = "\cS" . $text if $cx == 16;
+ return $text;
+ } else {
+ return $text;
+ }
+}
+
+# same as above, but get around the `if it looks like a function' rule
+sub maybe_parens_unop {
+ my $self = shift;
+ my($name, $kid, $cx) = @_;
+ if ($cx > 16 or $self->{'parens'}) {
+ $kid = $self->deparse($kid, 1);
+ if ($name eq "umask" && $kid =~ /^\d+$/) {
+ $kid = sprintf("%#o", $kid);
+ }
+ return "$name($kid)";
+ } else {
+ $kid = $self->deparse($kid, 16);
+ if ($name eq "umask" && $kid =~ /^\d+$/) {
+ $kid = sprintf("%#o", $kid);
+ }
+ if (substr($kid, 0, 1) eq "\cS") {
+ # use kid's parens
+ return $name . substr($kid, 1);
+ } elsif (substr($kid, 0, 1) eq "(") {
+ # avoid looks-like-a-function trap with extra parens
+ # (`+' can lead to ambiguities)
+ return "$name(" . $kid . ")";
+ } else {
+ return "$name $kid";
+ }
+ }
+}
+
+sub maybe_parens_func {
+ my $self = shift;
+ my($func, $text, $cx, $prec) = @_;
+ if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) {
+ return "$func($text)";
+ } else {
+ return "$func $text";
+ }
+}
+
+sub maybe_local {
+ my $self = shift;
+ my($op, $cx, $text) = @_;
+ my $our_intro = ($op->name =~ /^(gv|rv2)[ash]v$/) ? OPpOUR_INTRO : 0;
+ if ($op->private & (OPpLVAL_INTRO|$our_intro)
+ and not $self->{'avoid_local'}{$$op}) {
+ my $our_local = ($op->private & OPpLVAL_INTRO) ? "local" : "our";
+ if( $our_local eq 'our' ) {
+ # XXX This assertion fails code with non-ASCII identifiers,
+ # like ./ext/Encode/t/jperl.t
+ die "Unexpected our($text)\n" unless $text =~ /^\W(\w+::)*\w+\z/;
+ $text =~ s/(\w+::)+//;
+ }
+ if (want_scalar($op)) {
+ return "$our_local $text";
+ } else {
+ return $self->maybe_parens_func("$our_local", $text, $cx, 16);
+ }
+ } else {
+ return $text;
+ }
+}
+
+sub maybe_targmy {
+ my $self = shift;
+ my($op, $cx, $func, @args) = @_;
+ if ($op->private & OPpTARGET_MY) {
+ my $var = $self->padname($op->targ);
+ my $val = $func->($self, $op, 7, @args);
+ return $self->maybe_parens("$var = $val", $cx, 7);
+ } else {
+ return $func->($self, $op, $cx, @args);
+ }
+}
+
+sub padname_sv {
+ my $self = shift;
+ my $targ = shift;
+ return $self->{'curcv'}->PADLIST->ARRAYelt(0)->ARRAYelt($targ);
+}
+
+sub maybe_my {
+ my $self = shift;
+ my($op, $cx, $text) = @_;
+ if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
+ my $my = $op->private & OPpPAD_STATE ? "state" : "my";
+ if (want_scalar($op)) {
+ return "$my $text";
+ } else {
+ return $self->maybe_parens_func($my, $text, $cx, 16);
+ }
+ } else {
+ return $text;
+ }
+}
+
+# The following OPs don't have functions:
+
+# pp_padany -- does not exist after parsing
+
+sub AUTOLOAD {
+ if ($AUTOLOAD =~ s/^.*::pp_//) {
+ warn "unexpected OP_".uc $AUTOLOAD;
+ return "XXX";
+ } else {
+ die "Undefined subroutine $AUTOLOAD called";
+ }
+}
+
+sub DESTROY {} # Do not AUTOLOAD
+
+# $root should be the op which represents the root of whatever
+# we're sequencing here. If it's undefined, then we don't append
+# any subroutine declarations to the deparsed ops, otherwise we
+# append appropriate declarations.
+sub lineseq {
+ my($self, $root, @ops) = @_;
+ my($expr, @exprs);
+
+ my $out_cop = $self->{'curcop'};
+ my $out_seq = defined($out_cop) ? $out_cop->cop_seq : undef;
+ my $limit_seq;
+ if (defined $root) {
+ $limit_seq = $out_seq;
+ my $nseq;
+ $nseq = $self->find_scope_st($root->sibling) if ${$root->sibling};
+ $limit_seq = $nseq if !defined($limit_seq)
+ or defined($nseq) && $nseq < $limit_seq;
+ }
+ $limit_seq = $self->{'limit_seq'}
+ if defined($self->{'limit_seq'})
+ && (!defined($limit_seq) || $self->{'limit_seq'} < $limit_seq);
+ local $self->{'limit_seq'} = $limit_seq;
+
+ $self->walk_lineseq($root, \@ops,
+ sub { push @exprs, $_[0]} );
+
+ my $body = join(";\n", grep {length} @exprs);
+ my $subs = "";
+ if (defined $root && defined $limit_seq && !$self->{'in_format'}) {
+ $subs = join "\n", $self->seq_subs($limit_seq);
+ }
+ return join(";\n", grep {length} $body, $subs);
+}
+
+sub scopeop {
+ my($real_block, $self, $op, $cx) = @_;
+ my $kid;
+ my @kids;
+
+ local(@$self{qw'curstash warnings hints hinthash'})
+ = @$self{qw'curstash warnings hints hinthash'} if $real_block;
+ if ($real_block) {
+ $kid = $op->first->sibling; # skip enter
+ if (is_miniwhile($kid)) {
+ my $top = $kid->first;
+ my $name = $top->name;
+ if ($name eq "and") {
+ $name = "while";
+ } elsif ($name eq "or") {
+ $name = "until";
+ } else { # no conditional -> while 1 or until 0
+ return $self->deparse($top->first, 1) . " while 1";
+ }
+ my $cond = $top->first;
+ my $body = $cond->sibling->first; # skip lineseq
+ $cond = $self->deparse($cond, 1);
+ $body = $self->deparse($body, 1);
+ return "$body $name $cond";
+ }
+ } else {
+ $kid = $op->first;
+ }
+ for (; !null($kid); $kid = $kid->sibling) {
+ push @kids, $kid;
+ }
+ if ($cx > 0) { # inside an expression, (a do {} while for lineseq)
+ return "do {\n\t" . $self->lineseq($op, @kids) . "\n\b}";
+ } else {
+ my $lineseq = $self->lineseq($op, @kids);
+ return (length ($lineseq) ? "$lineseq;" : "");
+ }
+}
+
+sub pp_scope { scopeop(0, @_); }
+sub pp_lineseq { scopeop(0, @_); }
+sub pp_leave { scopeop(1, @_); }
+
+# This is a special case of scopeop and lineseq, for the case of the
+# main_root. The difference is that we print the output statements as
+# soon as we get them, for the sake of impatient users.
+sub deparse_root {
+ my $self = shift;
+ my($op) = @_;
+ local(@$self{qw'curstash warnings hints hinthash'})
+ = @$self{qw'curstash warnings hints hinthash'};
+ my @kids;
+ return if null $op->first; # Can happen, e.g., for Bytecode without -k
+ for (my $kid = $op->first->sibling; !null($kid); $kid = $kid->sibling) {
+ push @kids, $kid;
+ }
+ $self->walk_lineseq($op, \@kids,
+ sub { print $self->indent($_[0].';');
+ print "\n" unless $_[1] == $#kids;
+ });
+}
+
+sub walk_lineseq {
+ my ($self, $op, $kids, $callback) = @_;
+ my @kids = @$kids;
+ for (my $i = 0; $i < @kids; $i++) {
+ my $expr = "";
+ if (is_state $kids[$i]) {
+ $expr = $self->deparse($kids[$i++], 0);
+ if ($i > $#kids) {
+ $callback->($expr, $i);
+ last;
+ }
+ }
+ if (is_for_loop($kids[$i])) {
+ $callback->($expr . $self->for_loop($kids[$i], 0), $i++);
+ next;
+ }
+ $expr .= $self->deparse($kids[$i], (@kids != 1)/2);
+ $expr =~ s/;\n?\z//;
+ $callback->($expr, $i);
+ }
+}
+
+# The BEGIN {} is used here because otherwise this code isn't executed
+# when you run B::Deparse on itself.
+my %globalnames;
+BEGIN { map($globalnames{$_}++, "SIG", "STDIN", "STDOUT", "STDERR", "INC",
+ "ENV", "ARGV", "ARGVOUT", "_"); }
+
+sub gv_name {
+ my $self = shift;
+ my $gv = shift;
+Carp::confess() unless ref($gv) eq "B::GV";
+ my $stash = $gv->STASH->NAME;
+ my $name = $gv->SAFENAME;
+ if ($stash eq 'main' && $name =~ /^::/) {
+ $stash = '::';
+ }
+ elsif (($stash eq 'main' && $globalnames{$name})
+ or ($stash eq $self->{'curstash'} && !$globalnames{$name}
+ && ($stash eq 'main' || $name !~ /::/))
+ or $name =~ /^[^A-Za-z_:]/)
+ {
+ $stash = "";
+ } else {
+ $stash = $stash . "::";
+ }
+ if ($name =~ /^(\^..|{)/) {
+ $name = "{$name}"; # ${^WARNING_BITS}, etc and ${
+ }
+ return $stash . $name;
+}
+
+# Return the name to use for a stash variable.
+# If a lexical with the same name is in scope, it may need to be
+# fully-qualified.
+sub stash_variable {
+ my ($self, $prefix, $name) = @_;
+
+ return "$prefix$name" if $name =~ /::/;
+
+ unless ($prefix eq '$' || $prefix eq '@' || #'
+ $prefix eq '%' || $prefix eq '$#') {
+ return "$prefix$name";
+ }
+
+ my $v = ($prefix eq '$#' ? '@' : $prefix) . $name;
+ return $prefix .$self->{'curstash'}.'::'. $name if $self->lex_in_scope($v);
+ return "$prefix$name";
+}
+
+sub lex_in_scope {
+ my ($self, $name) = @_;
+ $self->populate_curcvlex() if !defined $self->{'curcvlex'};
+
+ return 0 if !defined($self->{'curcop'});
+ my $seq = $self->{'curcop'}->cop_seq;
+ return 0 if !exists $self->{'curcvlex'}{$name};
+ for my $a (@{$self->{'curcvlex'}{$name}}) {
+ my ($st, $en) = @$a;
+ return 1 if $seq > $st && $seq <= $en;
+ }
+ return 0;
+}
+
+sub populate_curcvlex {
+ my $self = shift;
+ for (my $cv = $self->{'curcv'}; class($cv) eq "CV"; $cv = $cv->OUTSIDE) {
+ my $padlist = $cv->PADLIST;
+ # an undef CV still in lexical chain
+ next if class($padlist) eq "SPECIAL";
+ my @padlist = $padlist->ARRAY;
+ my @ns = $padlist[0]->ARRAY;
+
+ for (my $i=0; $i<@ns; ++$i) {
+ next if class($ns[$i]) eq "SPECIAL";
+ next if $ns[$i]->FLAGS & SVpad_OUR; # Skip "our" vars
+ if (class($ns[$i]) eq "PV") {
+ # Probably that pesky lexical @_
+ next;
+ }
+ my $name = $ns[$i]->PVX;
+ my ($seq_st, $seq_en) =
+ ($ns[$i]->FLAGS & SVf_FAKE)
+ ? (0, 999999)
+ : ($ns[$i]->COP_SEQ_RANGE_LOW, $ns[$i]->COP_SEQ_RANGE_HIGH);
+
+ push @{$self->{'curcvlex'}{$name}}, [$seq_st, $seq_en];
+ }
+ }
+}
+
+sub find_scope_st { ((find_scope(@_))[0]); }
+sub find_scope_en { ((find_scope(@_))[1]); }
+
+# Recurses down the tree, looking for pad variable introductions and COPs
+sub find_scope {
+ my ($self, $op, $scope_st, $scope_en) = @_;
+ carp("Undefined op in find_scope") if !defined $op;
+ return ($scope_st, $scope_en) unless $op->flags & OPf_KIDS;
+
+ my @queue = ($op);
+ while(my $op = shift @queue ) {
+ for (my $o=$op->first; $$o; $o=$o->sibling) {
+ if ($o->name =~ /^pad.v$/ && $o->private & OPpLVAL_INTRO) {
+ my $s = int($self->padname_sv($o->targ)->COP_SEQ_RANGE_LOW);
+ my $e = $self->padname_sv($o->targ)->COP_SEQ_RANGE_HIGH;
+ $scope_st = $s if !defined($scope_st) || $s < $scope_st;
+ $scope_en = $e if !defined($scope_en) || $e > $scope_en;
+ return ($scope_st, $scope_en);
+ }
+ elsif (is_state($o)) {
+ my $c = $o->cop_seq;
+ $scope_st = $c if !defined($scope_st) || $c < $scope_st;
+ $scope_en = $c if !defined($scope_en) || $c > $scope_en;
+ return ($scope_st, $scope_en);
+ }
+ elsif ($o->flags & OPf_KIDS) {
+ unshift (@queue, $o);
+ }
+ }
+ }
+
+ return ($scope_st, $scope_en);
+}
+
+# Returns a list of subs which should be inserted before the COP
+sub cop_subs {
+ my ($self, $op, $out_seq) = @_;
+ my $seq = $op->cop_seq;
+ # If we have nephews, then our sequence number indicates
+ # the cop_seq of the end of some sort of scope.
+ if (class($op->sibling) ne "NULL" && $op->sibling->flags & OPf_KIDS
+ and my $nseq = $self->find_scope_st($op->sibling) ) {
+ $seq = $nseq;
+ }
+ $seq = $out_seq if defined($out_seq) && $out_seq < $seq;
+ return $self->seq_subs($seq);
+}
+
+sub seq_subs {
+ my ($self, $seq) = @_;
+ my @text;
+#push @text, "# ($seq)\n";
+
+ return "" if !defined $seq;
+ while (scalar(@{$self->{'subs_todo'}})
+ and $seq > $self->{'subs_todo'}[0][0]) {
+ push @text, $self->next_todo;
+ }
+ return @text;
+}
+
+# Notice how subs and formats are inserted between statements here;
+# also $[ assignments and pragmas.
+sub pp_nextstate {
+ my $self = shift;
+ my($op, $cx) = @_;
+ $self->{'curcop'} = $op;
+ my @text;
+ push @text, $self->cop_subs($op);
+ push @text, $op->label . ": " if $op->label;
+ my $stash = $op->stashpv;
+ if ($stash ne $self->{'curstash'}) {
+ push @text, "package $stash;\n";
+ $self->{'curstash'} = $stash;
+ }
+
+ if ($self->{'arybase'} != $op->arybase) {
+ push @text, '$[ = '. $op->arybase .";\n";
+ $self->{'arybase'} = $op->arybase;
+ }
+
+ my $warnings = $op->warnings;
+ my $warning_bits;
+ if ($warnings->isa("B::SPECIAL") && $$warnings == 4) {
+ $warning_bits = $warnings::Bits{"all"} & WARN_MASK;
+ }
+ elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) {
+ $warning_bits = $warnings::NONE;
+ }
+ elsif ($warnings->isa("B::SPECIAL")) {
+ $warning_bits = undef;
+ }
+ else {
+ $warning_bits = $warnings->PV & WARN_MASK;
+ }
+
+ if (defined ($warning_bits) and
+ !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) {
+ push @text, declare_warnings($self->{'warnings'}, $warning_bits);
+ $self->{'warnings'} = $warning_bits;
+ }
+
+ if ($self->{'hints'} != $op->hints) {
+ push @text, declare_hints($self->{'hints'}, $op->hints);
+ $self->{'hints'} = $op->hints;
+ }
+
+ # hack to check that the hint hash hasn't changed
+ if ($] > 5.009 &&
+ "@{[sort %{$self->{'hinthash'} || {}}]}"
+ ne "@{[sort %{$op->hints_hash->HASH || {}}]}") {
+ push @text, declare_hinthash($self->{'hinthash'}, $op->hints_hash->HASH, $self->{indent_size});
+ $self->{'hinthash'} = $op->hints_hash->HASH;
+ }
+
+ # This should go after of any branches that add statements, to
+ # increase the chances that it refers to the same line it did in
+ # the original program.
+ if ($self->{'linenums'}) {
+ push @text, "\f#line " . $op->line .
+ ' "' . $op->file, qq'"\n';
+ }
+
+ return join("", @text);
+}
+
+sub declare_warnings {
+ my ($from, $to) = @_;
+ if (($to & WARN_MASK) eq (warnings::bits("all") & WARN_MASK)) {
+ return "use warnings;\n";
+ }
+ elsif (($to & WARN_MASK) eq ("\0"x length($to) & WARN_MASK)) {
+ return "no warnings;\n";
+ }
+ return "BEGIN {\${^WARNING_BITS} = ".perlstring($to)."}\n";
+}
+
+sub declare_hints {
+ my ($from, $to) = @_;
+ my $use = $to & ~$from;
+ my $no = $from & ~$to;
+ my $decls = "";
+ for my $pragma (hint_pragmas($use)) {
+ $decls .= "use $pragma;\n";
+ }
+ for my $pragma (hint_pragmas($no)) {
+ $decls .= "no $pragma;\n";
+ }
+ return $decls;
+}
+
+# Internal implementation hints that the core sets automatically, so don't need
+# (or want) to be passed back to the user
+my %ignored_hints = (
+ 'open<' => 1,
+ 'open>' => 1,
+ ':' => 1,
+);
+
+sub declare_hinthash {
+ my ($from, $to, $indent) = @_;
+ my @decls;
+ for my $key (keys %$to) {
+ next if $ignored_hints{$key};
+ if (!defined $from->{$key} or $from->{$key} ne $to->{$key}) {
+ push @decls, qq(\$^H{'$key'} = q($to->{$key}););
+ }
+ }
+ for my $key (keys %$from) {
+ next if $ignored_hints{$key};
+ if (!exists $to->{$key}) {
+ push @decls, qq(delete \$^H{'$key'};);
+ }
+ }
+ @decls or return '';
+ return join("\n" . (" " x $indent), "BEGIN {", @decls) . "\n}\n";
+}
+
+sub hint_pragmas {
+ my ($bits) = @_;
+ my @pragmas;
+ push @pragmas, "integer" if $bits & 0x1;
+ push @pragmas, "strict 'refs'" if $bits & 0x2;
+ push @pragmas, "bytes" if $bits & 0x8;
+ return @pragmas;
+}
+
+sub pp_dbstate { pp_nextstate(@_) }
+sub pp_setstate { pp_nextstate(@_) }
+
+sub pp_unstack { return "" } # see also leaveloop
+
+sub baseop {
+ my $self = shift;
+ my($op, $cx, $name) = @_;
+ return $name;
+}
+
+sub pp_stub {
+ my $self = shift;
+ my($op, $cx, $name) = @_;
+ if ($cx >= 1) {
+ return "()";
+ }
+ else {
+ return "();";
+ }
+}
+sub pp_wantarray { baseop(@_, "wantarray") }
+sub pp_fork { baseop(@_, "fork") }
+sub pp_wait { maybe_targmy(@_, \&baseop, "wait") }
+sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") }
+sub pp_time { maybe_targmy(@_, \&baseop, "time") }
+sub pp_tms { baseop(@_, "times") }
+sub pp_ghostent { baseop(@_, "gethostent") }
+sub pp_gnetent { baseop(@_, "getnetent") }
+sub pp_gprotoent { baseop(@_, "getprotoent") }
+sub pp_gservent { baseop(@_, "getservent") }
+sub pp_ehostent { baseop(@_, "endhostent") }
+sub pp_enetent { baseop(@_, "endnetent") }
+sub pp_eprotoent { baseop(@_, "endprotoent") }
+sub pp_eservent { baseop(@_, "endservent") }
+sub pp_gpwent { baseop(@_, "getpwent") }
+sub pp_spwent { baseop(@_, "setpwent") }
+sub pp_epwent { baseop(@_, "endpwent") }
+sub pp_ggrent { baseop(@_, "getgrent") }
+sub pp_sgrent { baseop(@_, "setgrent") }
+sub pp_egrent { baseop(@_, "endgrent") }
+sub pp_getlogin { baseop(@_, "getlogin") }
+
+sub POSTFIX () { 1 }
+
+# I couldn't think of a good short name, but this is the category of
+# symbolic unary operators with interesting precedence
+
+sub pfixop {
+ my $self = shift;
+ my($op, $cx, $name, $prec, $flags) = (@_, 0);
+ my $kid = $op->first;
+ $kid = $self->deparse($kid, $prec);
+ return $self->maybe_parens(($flags & POSTFIX) ? "$kid$name" : "$name$kid",
+ $cx, $prec);
+}
+
+sub pp_preinc { pfixop(@_, "++", 23) }
+sub pp_predec { pfixop(@_, "--", 23) }
+sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
+sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
+sub pp_i_preinc { pfixop(@_, "++", 23) }
+sub pp_i_predec { pfixop(@_, "--", 23) }
+sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
+sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
+sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) }
+
+sub pp_negate { maybe_targmy(@_, \&real_negate) }
+sub real_negate {
+ my $self = shift;
+ my($op, $cx) = @_;
+ if ($op->first->name =~ /^(i_)?negate$/) {
+ # avoid --$x
+ $self->pfixop($op, $cx, "-", 21.5);
+ } else {
+ $self->pfixop($op, $cx, "-", 21);
+ }
+}
+sub pp_i_negate { pp_negate(@_) }
+
+sub pp_not {
+ my $self = shift;
+ my($op, $cx) = @_;
+ if ($cx <= 4) {
+ $self->pfixop($op, $cx, "not ", 4);
+ } else {
+ $self->pfixop($op, $cx, "!", 21);
+ }
+}
+
+sub unop {
+ my $self = shift;
+ my($op, $cx, $name) = @_;
+ my $kid;
+ if ($op->flags & OPf_KIDS) {
+ $kid = $op->first;
+ my $builtinname = $name;
+ $builtinname =~ /^CORE::/ or $builtinname = "CORE::$name";
+ if (defined prototype($builtinname)
+ && prototype($builtinname) =~ /^;?\*/
+ && $kid->name eq "rv2gv") {
+ $kid = $kid->first;
+ }
+
+ return $self->maybe_parens_unop($name, $kid, $cx);
+ } else {
+ return $name . ($op->flags & OPf_SPECIAL ? "()" : "");
+ }
+}
+
+sub pp_chop { maybe_targmy(@_, \&unop, "chop") }
+sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") }
+sub pp_schop { maybe_targmy(@_, \&unop, "chop") }
+sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") }
+sub pp_defined { unop(@_, "defined") }
+sub pp_undef { unop(@_, "undef") }
+sub pp_study { unop(@_, "study") }
+sub pp_ref { unop(@_, "ref") }
+sub pp_pos { maybe_local(@_, unop(@_, "pos")) }
+
+sub pp_sin { maybe_targmy(@_, \&unop, "sin") }
+sub pp_cos { maybe_targmy(@_, \&unop, "cos") }
+sub pp_rand { maybe_targmy(@_, \&unop, "rand") }
+sub pp_srand { unop(@_, "srand") }
+sub pp_exp { maybe_targmy(@_, \&unop, "exp") }
+sub pp_log { maybe_targmy(@_, \&unop, "log") }
+sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") }
+sub pp_int { maybe_targmy(@_, \&unop, "int") }
+sub pp_hex { maybe_targmy(@_, \&unop, "hex") }
+sub pp_oct { maybe_targmy(@_, \&unop, "oct") }
+sub pp_abs { maybe_targmy(@_, \&unop, "abs") }
+
+sub pp_length { maybe_targmy(@_, \&unop, "length") }
+sub pp_ord { maybe_targmy(@_, \&unop, "ord") }
+sub pp_chr { maybe_targmy(@_, \&unop, "chr") }
+
+sub pp_each { unop(@_, "each") }
+sub pp_values { unop(@_, "values") }
+sub pp_keys { unop(@_, "keys") }
+sub pp_aeach { unop(@_, "each") }
+sub pp_avalues { unop(@_, "values") }
+sub pp_akeys { unop(@_, "keys") }
+sub pp_pop { unop(@_, "pop") }
+sub pp_shift { unop(@_, "shift") }
+
+sub pp_caller { unop(@_, "caller") }
+sub pp_reset { unop(@_, "reset") }
+sub pp_exit { unop(@_, "exit") }
+sub pp_prototype { unop(@_, "prototype") }
+
+sub pp_close { unop(@_, "close") }
+sub pp_fileno { unop(@_, "fileno") }
+sub pp_umask { unop(@_, "umask") }
+sub pp_untie { unop(@_, "untie") }
+sub pp_tied { unop(@_, "tied") }
+sub pp_dbmclose { unop(@_, "dbmclose") }
+sub pp_getc { unop(@_, "getc") }
+sub pp_eof { unop(@_, "eof") }
+sub pp_tell { unop(@_, "tell") }
+sub pp_getsockname { unop(@_, "getsockname") }
+sub pp_getpeername { unop(@_, "getpeername") }
+
+sub pp_chdir { maybe_targmy(@_, \&unop, "chdir") }
+sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") }
+sub pp_readlink { unop(@_, "readlink") }
+sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") }
+sub pp_readdir { unop(@_, "readdir") }
+sub pp_telldir { unop(@_, "telldir") }
+sub pp_rewinddir { unop(@_, "rewinddir") }
+sub pp_closedir { unop(@_, "closedir") }
+sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") }
+sub pp_localtime { unop(@_, "localtime") }
+sub pp_gmtime { unop(@_, "gmtime") }
+sub pp_alarm { unop(@_, "alarm") }
+sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") }
+
+sub pp_dofile { unop(@_, "do") }
+sub pp_entereval { unop(@_, "eval") }
+
+sub pp_ghbyname { unop(@_, "gethostbyname") }
+sub pp_gnbyname { unop(@_, "getnetbyname") }
+sub pp_gpbyname { unop(@_, "getprotobyname") }
+sub pp_shostent { unop(@_, "sethostent") }
+sub pp_snetent { unop(@_, "setnetent") }
+sub pp_sprotoent { unop(@_, "setprotoent") }
+sub pp_sservent { unop(@_, "setservent") }
+sub pp_gpwnam { unop(@_, "getpwnam") }
+sub pp_gpwuid { unop(@_, "getpwuid") }
+sub pp_ggrnam { unop(@_, "getgrnam") }
+sub pp_ggrgid { unop(@_, "getgrgid") }
+
+sub pp_lock { unop(@_, "lock") }
+
+sub pp_continue { unop(@_, "continue"); }
+sub pp_break {
+ my ($self, $op) = @_;
+ return "" if $op->flags & OPf_SPECIAL;
+ unop(@_, "break");
+}
+
+sub givwhen {
+ my $self = shift;
+ my($op, $cx, $givwhen) = @_;
+
+ my $enterop = $op->first;
+ my ($head, $block);
+ if ($enterop->flags & OPf_SPECIAL) {
+ $head = "default";
+ $block = $self->deparse($enterop->first, 0);
+ }
+ else {
+ my $cond = $enterop->first;
+ my $cond_str = $self->deparse($cond, 1);
+ $head = "$givwhen ($cond_str)";
+ $block = $self->deparse($cond->sibling, 0);
+ }
+
+ return "$head {\n".
+ "\t$block\n".
+ "\b}\cK";
+}
+
+sub pp_leavegiven { givwhen(@_, "given"); }
+sub pp_leavewhen { givwhen(@_, "when"); }
+
+sub pp_exists {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $arg;
+ if ($op->private & OPpEXISTS_SUB) {
+ # Checking for the existence of a subroutine
+ return $self->maybe_parens_func("exists",
+ $self->pp_rv2cv($op->first, 16), $cx, 16);
+ }
+ if ($op->flags & OPf_SPECIAL) {
+ # Array element, not hash element
+ return $self->maybe_parens_func("exists",
+ $self->pp_aelem($op->first, 16), $cx, 16);
+ }
+ return $self->maybe_parens_func("exists", $self->pp_helem($op->first, 16),
+ $cx, 16);
+}
+
+sub pp_delete {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $arg;
+ if ($op->private & OPpSLICE) {
+ if ($op->flags & OPf_SPECIAL) {
+ # Deleting from an array, not a hash
+ return $self->maybe_parens_func("delete",
+ $self->pp_aslice($op->first, 16),
+ $cx, 16);
+ }
+ return $self->maybe_parens_func("delete",
+ $self->pp_hslice($op->first, 16),
+ $cx, 16);
+ } else {
+ if ($op->flags & OPf_SPECIAL) {
+ # Deleting from an array, not a hash
+ return $self->maybe_parens_func("delete",
+ $self->pp_aelem($op->first, 16),
+ $cx, 16);
+ }
+ return $self->maybe_parens_func("delete",
+ $self->pp_helem($op->first, 16),
+ $cx, 16);
+ }
+}
+
+sub pp_require {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $opname = $op->flags & OPf_SPECIAL ? 'CORE::require' : 'require';
+ if (class($op) eq "UNOP" and $op->first->name eq "const"
+ and $op->first->private & OPpCONST_BARE)
+ {
+ my $name = $self->const_sv($op->first)->PV;
+ $name =~ s[/][::]g;
+ $name =~ s/\.pm//g;
+ return "$opname $name";
+ } else {
+ $self->unop($op, $cx, $opname);
+ }
+}
+
+sub pp_scalar {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $kid = $op->first;
+ if (not null $kid->sibling) {
+ # XXX Was a here-doc
+ return $self->dquote($op);
+ }
+ $self->unop(@_, "scalar");
+}
+
+
+sub padval {
+ my $self = shift;
+ my $targ = shift;
+ return $self->{'curcv'}->PADLIST->ARRAYelt(1)->ARRAYelt($targ);
+}
+
+sub anon_hash_or_list {
+ my $self = shift;
+ my($op, $cx) = @_;
+
+ my($pre, $post) = @{{"anonlist" => ["[","]"],
+ "anonhash" => ["{","}"]}->{$op->name}};
+ my($expr, @exprs);
+ $op = $op->first->sibling; # skip pushmark
+ for (; !null($op); $op = $op->sibling) {
+ $expr = $self->deparse($op, 6);
+ push @exprs, $expr;
+ }
+ if ($pre eq "{" and $cx < 1) {
+ # Disambiguate that it's not a block
+ $pre = "+{";
+ }
+ return $pre . join(", ", @exprs) . $post;
+}
+
+sub pp_anonlist {
+ my $self = shift;
+ my ($op, $cx) = @_;
+ if ($op->flags & OPf_SPECIAL) {
+ return $self->anon_hash_or_list($op, $cx);
+ }
+ warn "Unexpected op pp_" . $op->name() . " without OPf_SPECIAL";
+ return 'XXX';
+}
+
+*pp_anonhash = \&pp_anonlist;
+
+sub pp_refgen {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $kid = $op->first;
+ if ($kid->name eq "null") {
+ $kid = $kid->first;
+ if (!null($kid->sibling) and
+ $kid->sibling->name eq "anoncode") {
+ return $self->e_anoncode({ code => $self->padval($kid->sibling->targ) });
+ } elsif ($kid->name eq "pushmark") {
+ my $sib_name = $kid->sibling->name;
+ if ($sib_name =~ /^(pad|rv2)[ah]v$/
+ and not $kid->sibling->flags & OPf_REF)
+ {
+ # The @a in \(@a) isn't in ref context, but only when the
+ # parens are there.
+ return "\\(" . $self->pp_list($op->first) . ")";
+ } elsif ($sib_name eq 'entersub') {
+ my $text = $self->deparse($kid->sibling, 1);
+ # Always show parens for \(&func()), but only with -p otherwise
+ $text = "($text)" if $self->{'parens'}
+ or $kid->sibling->private & OPpENTERSUB_AMPER;
+ return "\\$text";
+ }
+ }
+ }
+ $self->pfixop($op, $cx, "\\", 20);
+}
+
+sub e_anoncode {
+ my ($self, $info) = @_;
+ my $text = $self->deparse_sub($info->{code});
+ return "sub " . $text;
+}
+
+sub pp_srefgen { pp_refgen(@_) }
+
+sub pp_readline {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $kid = $op->first;
+ $kid = $kid->first if $kid->name eq "rv2gv"; # <$fh>
+ return "<" . $self->deparse($kid, 1) . ">" if is_scalar($kid);
+ return $self->unop($op, $cx, "readline");
+}
+
+sub pp_rcatline {
+ my $self = shift;
+ my($op) = @_;
+ return "<" . $self->gv_name($self->gv_or_padgv($op)) . ">";
+}
+
+# Unary operators that can occur as pseudo-listops inside double quotes
+sub dq_unop {
+ my $self = shift;
+ my($op, $cx, $name, $prec, $flags) = (@_, 0, 0);
+ my $kid;
+ if ($op->flags & OPf_KIDS) {
+ $kid = $op->first;
+ # If there's more than one kid, the first is an ex-pushmark.
+ $kid = $kid->sibling if not null $kid->sibling;
+ return $self->maybe_parens_unop($name, $kid, $cx);
+ } else {
+ return $name . ($op->flags & OPf_SPECIAL ? "()" : "");
+ }
+}
+
+sub pp_ucfirst { dq_unop(@_, "ucfirst") }
+sub pp_lcfirst { dq_unop(@_, "lcfirst") }
+sub pp_uc { dq_unop(@_, "uc") }
+sub pp_lc { dq_unop(@_, "lc") }
+sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") }
+
+sub loopex {
+ my $self = shift;
+ my ($op, $cx, $name) = @_;
+ if (class($op) eq "PVOP") {
+ return "$name " . $op->pv;
+ } elsif (class($op) eq "OP") {
+ return $name;
+ } elsif (class($op) eq "UNOP") {
+ # Note -- loop exits are actually exempt from the
+ # looks-like-a-func rule, but a few extra parens won't hurt
+ return $self->maybe_parens_unop($name, $op->first, $cx);
+ }
+}
+
+sub pp_last { loopex(@_, "last") }
+sub pp_next { loopex(@_, "next") }
+sub pp_redo { loopex(@_, "redo") }
+sub pp_goto { loopex(@_, "goto") }
+sub pp_dump { loopex(@_, "dump") }
+
+sub ftst {
+ my $self = shift;
+ my($op, $cx, $name) = @_;
+ if (class($op) eq "UNOP") {
+ # Genuine `-X' filetests are exempt from the LLAFR, but not
+ # l?stat(); for the sake of clarity, give'em all parens
+ return $self->maybe_parens_unop($name, $op->first, $cx);
+ } elsif (class($op) =~ /^(SV|PAD)OP$/) {
+ return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16);
+ } else { # I don't think baseop filetests ever survive ck_ftst, but...
+ return $name;
+ }
+}
+
+sub pp_lstat { ftst(@_, "lstat") }
+sub pp_stat { ftst(@_, "stat") }
+sub pp_ftrread { ftst(@_, "-R") }
+sub pp_ftrwrite { ftst(@_, "-W") }
+sub pp_ftrexec { ftst(@_, "-X") }
+sub pp_fteread { ftst(@_, "-r") }
+sub pp_ftewrite { ftst(@_, "-w") }
+sub pp_fteexec { ftst(@_, "-x") }
+sub pp_ftis { ftst(@_, "-e") }
+sub pp_fteowned { ftst(@_, "-O") }
+sub pp_ftrowned { ftst(@_, "-o") }
+sub pp_ftzero { ftst(@_, "-z") }
+sub pp_ftsize { ftst(@_, "-s") }
+sub pp_ftmtime { ftst(@_, "-M") }
+sub pp_ftatime { ftst(@_, "-A") }
+sub pp_ftctime { ftst(@_, "-C") }
+sub pp_ftsock { ftst(@_, "-S") }
+sub pp_ftchr { ftst(@_, "-c") }
+sub pp_ftblk { ftst(@_, "-b") }
+sub pp_ftfile { ftst(@_, "-f") }
+sub pp_ftdir { ftst(@_, "-d") }
+sub pp_ftpipe { ftst(@_, "-p") }
+sub pp_ftlink { ftst(@_, "-l") }
+sub pp_ftsuid { ftst(@_, "-u") }
+sub pp_ftsgid { ftst(@_, "-g") }
+sub pp_ftsvtx { ftst(@_, "-k") }
+sub pp_fttty { ftst(@_, "-t") }
+sub pp_fttext { ftst(@_, "-T") }
+sub pp_ftbinary { ftst(@_, "-B") }
+
+sub SWAP_CHILDREN () { 1 }
+sub ASSIGN () { 2 } # has OP= variant
+sub LIST_CONTEXT () { 4 } # Assignment is in list context
+
+my(%left, %right);
+
+sub assoc_class {
+ my $op = shift;
+ my $name = $op->name;
+ if ($name eq "concat" and $op->first->name eq "concat") {
+ # avoid spurious `=' -- see comment in pp_concat
+ return "concat";
+ }
+ if ($name eq "null" and class($op) eq "UNOP"
+ and $op->first->name =~ /^(and|x?or)$/
+ and null $op->first->sibling)
+ {
+ # Like all conditional constructs, OP_ANDs and OP_ORs are topped
+ # with a null that's used as the common end point of the two
+ # flows of control. For precedence purposes, ignore it.
+ # (COND_EXPRs have these too, but we don't bother with
+ # their associativity).
+ return assoc_class($op->first);
+ }
+ return $name . ($op->flags & OPf_STACKED ? "=" : "");
+}
+
+# Left associative operators, like `+', for which
+# $a + $b + $c is equivalent to ($a + $b) + $c
+
+BEGIN {
+ %left = ('multiply' => 19, 'i_multiply' => 19,
+ 'divide' => 19, 'i_divide' => 19,
+ 'modulo' => 19, 'i_modulo' => 19,
+ 'repeat' => 19,
+ 'add' => 18, 'i_add' => 18,
+ 'subtract' => 18, 'i_subtract' => 18,
+ 'concat' => 18,
+ 'left_shift' => 17, 'right_shift' => 17,
+ 'bit_and' => 13,
+ 'bit_or' => 12, 'bit_xor' => 12,
+ 'and' => 3,
+ 'or' => 2, 'xor' => 2,
+ );
+}
+
+sub deparse_binop_left {
+ my $self = shift;
+ my($op, $left, $prec) = @_;
+ if ($left{assoc_class($op)} && $left{assoc_class($left)}
+ and $left{assoc_class($op)} == $left{assoc_class($left)})
+ {
+ return $self->deparse($left, $prec - .00001);
+ } else {
+ return $self->deparse($left, $prec);
+ }
+}
+
+# Right associative operators, like `=', for which
+# $a = $b = $c is equivalent to $a = ($b = $c)
+
+BEGIN {
+ %right = ('pow' => 22,
+ 'sassign=' => 7, 'aassign=' => 7,
+ 'multiply=' => 7, 'i_multiply=' => 7,
+ 'divide=' => 7, 'i_divide=' => 7,
+ 'modulo=' => 7, 'i_modulo=' => 7,
+ 'repeat=' => 7,
+ 'add=' => 7, 'i_add=' => 7,
+ 'subtract=' => 7, 'i_subtract=' => 7,
+ 'concat=' => 7,
+ 'left_shift=' => 7, 'right_shift=' => 7,
+ 'bit_and=' => 7,
+ 'bit_or=' => 7, 'bit_xor=' => 7,
+ 'andassign' => 7,
+ 'orassign' => 7,
+ );
+}
+
+sub deparse_binop_right {
+ my $self = shift;
+ my($op, $right, $prec) = @_;
+ if ($right{assoc_class($op)} && $right{assoc_class($right)}
+ and $right{assoc_class($op)} == $right{assoc_class($right)})
+ {
+ return $self->deparse($right, $prec - .00001);
+ } else {
+ return $self->deparse($right, $prec);
+ }
+}
+
+sub binop {
+ my $self = shift;
+ my ($op, $cx, $opname, $prec, $flags) = (@_, 0);
+ my $left = $op->first;
+ my $right = $op->last;
+ my $eq = "";
+ if ($op->flags & OPf_STACKED && $flags & ASSIGN) {
+ $eq = "=";
+ $prec = 7;
+ }
+ if ($flags & SWAP_CHILDREN) {
+ ($left, $right) = ($right, $left);
+ }
+ $left = $self->deparse_binop_left($op, $left, $prec);
+ $left = "($left)" if $flags & LIST_CONTEXT
+ && $left !~ /^(my|our|local|)[\@\(]/;
+ $right = $self->deparse_binop_right($op, $right, $prec);
+ return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
+}
+
+sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
+sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
+sub pp_subtract { maybe_targmy(@_, \&binop, "-",18, ASSIGN) }
+sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
+sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
+sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
+sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
+sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) }
+sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
+sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
+sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) }
+
+sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) }
+sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) }
+sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) }
+sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) }
+sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) }
+
+sub pp_eq { binop(@_, "==", 14) }
+sub pp_ne { binop(@_, "!=", 14) }
+sub pp_lt { binop(@_, "<", 15) }
+sub pp_gt { binop(@_, ">", 15) }
+sub pp_ge { binop(@_, ">=", 15) }
+sub pp_le { binop(@_, "<=", 15) }
+sub pp_ncmp { binop(@_, "<=>", 14) }
+sub pp_i_eq { binop(@_, "==", 14) }
+sub pp_i_ne { binop(@_, "!=", 14) }
+sub pp_i_lt { binop(@_, "<", 15) }
+sub pp_i_gt { binop(@_, ">", 15) }
+sub pp_i_ge { binop(@_, ">=", 15) }
+sub pp_i_le { binop(@_, "<=", 15) }
+sub pp_i_ncmp { binop(@_, "<=>", 14) }
+
+sub pp_seq { binop(@_, "eq", 14) }
+sub pp_sne { binop(@_, "ne", 14) }
+sub pp_slt { binop(@_, "lt", 15) }
+sub pp_sgt { binop(@_, "gt", 15) }
+sub pp_sge { binop(@_, "ge", 15) }
+sub pp_sle { binop(@_, "le", 15) }
+sub pp_scmp { binop(@_, "cmp", 14) }
+
+sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
+sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
+
+sub pp_smartmatch {
+ my ($self, $op, $cx) = @_;
+ if ($op->flags & OPf_SPECIAL) {
+ return $self->deparse($op->last, $cx);
+ }
+ else {
+ binop(@_, "~~", 14);
+ }
+}
+
+# `.' is special because concats-of-concats are optimized to save copying
+# by making all but the first concat stacked. The effect is as if the
+# programmer had written `($a . $b) .= $c', except legal.
+sub pp_concat { maybe_targmy(@_, \&real_concat) }
+sub real_concat {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $left = $op->first;
+ my $right = $op->last;
+ my $eq = "";
+ my $prec = 18;
+ if ($op->flags & OPf_STACKED and $op->first->name ne "concat") {
+ $eq = "=";
+ $prec = 7;
+ }
+ $left = $self->deparse_binop_left($op, $left, $prec);
+ $right = $self->deparse_binop_right($op, $right, $prec);
+ return $self->maybe_parens("$left .$eq $right", $cx, $prec);
+}
+
+# `x' is weird when the left arg is a list
+sub pp_repeat {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $left = $op->first;
+ my $right = $op->last;
+ my $eq = "";
+ my $prec = 19;
+ if ($op->flags & OPf_STACKED) {
+ $eq = "=";
+ $prec = 7;
+ }
+ if (null($right)) { # list repeat; count is inside left-side ex-list
+ my $kid = $left->first->sibling; # skip pushmark
+ my @exprs;
+ for (; !null($kid->sibling); $kid = $kid->sibling) {
+ push @exprs, $self->deparse($kid, 6);
+ }
+ $right = $kid;
+ $left = "(" . join(", ", @exprs). ")";
+ } else {
+ $left = $self->deparse_binop_left($op, $left, $prec);
+ }
+ $right = $self->deparse_binop_right($op, $right, $prec);
+ return $self->maybe_parens("$left x$eq $right", $cx, $prec);
+}
+
+sub range {
+ my $self = shift;
+ my ($op, $cx, $type) = @_;
+ my $left = $op->first;
+ my $right = $left->sibling;
+ $left = $self->deparse($left, 9);
+ $right = $self->deparse($right, 9);
+ return $self->maybe_parens("$left $type $right", $cx, 9);
+}
+
+sub pp_flop {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $flip = $op->first;
+ my $type = ($flip->flags & OPf_SPECIAL) ? "..." : "..";
+ return $self->range($flip->first, $cx, $type);
+}
+
+# one-line while/until is handled in pp_leave
+
+sub logop {
+ my $self = shift;
+ my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_;
+ my $left = $op->first;
+ my $right = $op->first->sibling;
+ if ($cx < 1 and is_scope($right) and $blockname
+ and $self->{'expand'} < 7)
+ { # if ($a) {$b}
+ $left = $self->deparse($left, 1);
+ $right = $self->deparse($right, 0);
+ return "$blockname ($left) {\n\t$right\n\b}\cK";
+ } elsif ($cx < 1 and $blockname and not $self->{'parens'}
+ and $self->{'expand'} < 7) { # $b if $a
+ $right = $self->deparse($right, 1);
+ $left = $self->deparse($left, 1);
+ return "$right $blockname $left";
+ } elsif ($cx > $lowprec and $highop) { # $a && $b
+ $left = $self->deparse_binop_left($op, $left, $highprec);
+ $right = $self->deparse_binop_right($op, $right, $highprec);
+ return $self->maybe_parens("$left $highop $right", $cx, $highprec);
+ } else { # $a and $b
+ $left = $self->deparse_binop_left($op, $left, $lowprec);
+ $right = $self->deparse_binop_right($op, $right, $lowprec);
+ return $self->maybe_parens("$left $lowop $right", $cx, $lowprec);
+ }
+}
+
+sub pp_and { logop(@_, "and", 3, "&&", 11, "if") }
+sub pp_or { logop(@_, "or", 2, "||", 10, "unless") }
+sub pp_dor { logop(@_, "err", 2, "//", 10, "") }
+
+# xor is syntactically a logop, but it's really a binop (contrary to
+# old versions of opcode.pl). Syntax is what matters here.
+sub pp_xor { logop(@_, "xor", 2, "", 0, "") }
+
+sub logassignop {
+ my $self = shift;
+ my ($op, $cx, $opname) = @_;
+ my $left = $op->first;
+ my $right = $op->first->sibling->first; # skip sassign
+ $left = $self->deparse($left, 7);
+ $right = $self->deparse($right, 7);
+ return $self->maybe_parens("$left $opname $right", $cx, 7);
+}
+
+sub pp_andassign { logassignop(@_, "&&=") }
+sub pp_orassign { logassignop(@_, "||=") }
+sub pp_dorassign { logassignop(@_, "//=") }
+
+sub listop {
+ my $self = shift;
+ my($op, $cx, $name) = @_;
+ my(@exprs);
+ my $parens = ($cx >= 5) || $self->{'parens'};
+ my $kid = $op->first->sibling;
+ return $name if null $kid;
+ my $first;
+ $name = "socketpair" if $name eq "sockpair";
+ my $proto = prototype("CORE::$name");
+ if (defined $proto
+ && $proto =~ /^;?\*/
+ && $kid->name eq "rv2gv") {
+ $first = $self->deparse($kid->first, 6);
+ }
+ else {
+ $first = $self->deparse($kid, 6);
+ }
+ if ($name eq "chmod" && $first =~ /^\d+$/) {
+ $first = sprintf("%#o", $first);
+ }
+ $first = "+$first" if not $parens and substr($first, 0, 1) eq "(";
+ push @exprs, $first;
+ $kid = $kid->sibling;
+ if (defined $proto && $proto =~ /^\*\*/ && $kid->name eq "rv2gv") {
+ push @exprs, $self->deparse($kid->first, 6);
+ $kid = $kid->sibling;
+ }
+ for (; !null($kid); $kid = $kid->sibling) {
+ push @exprs, $self->deparse($kid, 6);
+ }
+ if ($parens) {
+ return "$name(" . join(", ", @exprs) . ")";
+ } else {
+ return "$name " . join(", ", @exprs);
+ }
+}
+
+sub pp_bless { listop(@_, "bless") }
+sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") }
+sub pp_substr { maybe_local(@_, listop(@_, "substr")) }
+sub pp_vec { maybe_local(@_, listop(@_, "vec")) }
+sub pp_index { maybe_targmy(@_, \&listop, "index") }
+sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") }
+sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") }
+sub pp_formline { listop(@_, "formline") } # see also deparse_format
+sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") }
+sub pp_unpack { listop(@_, "unpack") }
+sub pp_pack { listop(@_, "pack") }
+sub pp_join { maybe_targmy(@_, \&listop, "join") }
+sub pp_splice { listop(@_, "splice") }
+sub pp_push { maybe_targmy(@_, \&listop, "push") }
+sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") }
+sub pp_reverse { listop(@_, "reverse") }
+sub pp_warn { listop(@_, "warn") }
+sub pp_die { listop(@_, "die") }
+# Actually, return is exempt from the LLAFR (see examples in this very
+# module!), but for consistency's sake, ignore that fact
+sub pp_return { listop(@_, "return") }
+sub pp_open { listop(@_, "open") }
+sub pp_pipe_op { listop(@_, "pipe") }
+sub pp_tie { listop(@_, "tie") }
+sub pp_binmode { listop(@_, "binmode") }
+sub pp_dbmopen { listop(@_, "dbmopen") }
+sub pp_sselect { listop(@_, "select") }
+sub pp_select { listop(@_, "select") }
+sub pp_read { listop(@_, "read") }
+sub pp_sysopen { listop(@_, "sysopen") }
+sub pp_sysseek { listop(@_, "sysseek") }
+sub pp_sysread { listop(@_, "sysread") }
+sub pp_syswrite { listop(@_, "syswrite") }
+sub pp_send { listop(@_, "send") }
+sub pp_recv { listop(@_, "recv") }
+sub pp_seek { listop(@_, "seek") }
+sub pp_fcntl { listop(@_, "fcntl") }
+sub pp_ioctl { listop(@_, "ioctl") }
+sub pp_flock { maybe_targmy(@_, \&listop, "flock") }
+sub pp_socket { listop(@_, "socket") }
+sub pp_sockpair { listop(@_, "sockpair") }
+sub pp_bind { listop(@_, "bind") }
+sub pp_connect { listop(@_, "connect") }
+sub pp_listen { listop(@_, "listen") }
+sub pp_accept { listop(@_, "accept") }
+sub pp_shutdown { listop(@_, "shutdown") }
+sub pp_gsockopt { listop(@_, "getsockopt") }
+sub pp_ssockopt { listop(@_, "setsockopt") }
+sub pp_chown { maybe_targmy(@_, \&listop, "chown") }
+sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") }
+sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") }
+sub pp_utime { maybe_targmy(@_, \&listop, "utime") }
+sub pp_rename { maybe_targmy(@_, \&listop, "rename") }
+sub pp_link { maybe_targmy(@_, \&listop, "link") }
+sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") }
+sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") }
+sub pp_open_dir { listop(@_, "opendir") }
+sub pp_seekdir { listop(@_, "seekdir") }
+sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") }
+sub pp_system { maybe_targmy(@_, \&listop, "system") }
+sub pp_exec { maybe_targmy(@_, \&listop, "exec") }
+sub pp_kill { maybe_targmy(@_, \&listop, "kill") }
+sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") }
+sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") }
+sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") }
+sub pp_shmget { listop(@_, "shmget") }
+sub pp_shmctl { listop(@_, "shmctl") }
+sub pp_shmread { listop(@_, "shmread") }
+sub pp_shmwrite { listop(@_, "shmwrite") }
+sub pp_msgget { listop(@_, "msgget") }
+sub pp_msgctl { listop(@_, "msgctl") }
+sub pp_msgsnd { listop(@_, "msgsnd") }
+sub pp_msgrcv { listop(@_, "msgrcv") }
+sub pp_semget { listop(@_, "semget") }
+sub pp_semctl { listop(@_, "semctl") }
+sub pp_semop { listop(@_, "semop") }
+sub pp_ghbyaddr { listop(@_, "gethostbyaddr") }
+sub pp_gnbyaddr { listop(@_, "getnetbyaddr") }
+sub pp_gpbynumber { listop(@_, "getprotobynumber") }
+sub pp_gsbyname { listop(@_, "getservbyname") }
+sub pp_gsbyport { listop(@_, "getservbyport") }
+sub pp_syscall { listop(@_, "syscall") }
+
+sub pp_glob {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $text = $self->dq($op->first->sibling); # skip pushmark
+ if ($text =~ /^\$?(\w|::|\`)+$/ # could look like a readline
+ or $text =~ /[<>]/) {
+ return 'glob(' . single_delim('qq', '"', $text) . ')';
+ } else {
+ return '<' . $text . '>';
+ }
+}
+
+# Truncate is special because OPf_SPECIAL makes a bareword first arg
+# be a filehandle. This could probably be better fixed in the core
+# by moving the GV lookup into ck_truc.
+
+sub pp_truncate {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my(@exprs);
+ my $parens = ($cx >= 5) || $self->{'parens'};
+ my $kid = $op->first->sibling;
+ my $fh;
+ if ($op->flags & OPf_SPECIAL) {
+ # $kid is an OP_CONST
+ $fh = $self->const_sv($kid)->PV;
+ } else {
+ $fh = $self->deparse($kid, 6);
+ $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "(";
+ }
+ my $len = $self->deparse($kid->sibling, 6);
+ if ($parens) {
+ return "truncate($fh, $len)";
+ } else {
+ return "truncate $fh, $len";
+ }
+}
+
+sub indirop {
+ my $self = shift;
+ my($op, $cx, $name) = @_;
+ my($expr, @exprs);
+ my $kid = $op->first->sibling;
+ my $indir = "";
+ if ($op->flags & OPf_STACKED) {
+ $indir = $kid;
+ $indir = $indir->first; # skip rv2gv
+ if (is_scope($indir)) {
+ $indir = "{" . $self->deparse($indir, 0) . "}";
+ $indir = "{;}" if $indir eq "{}";
+ } elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) {
+ $indir = $self->const_sv($indir)->PV;
+ } else {
+ $indir = $self->deparse($indir, 24);
+ }
+ $indir = $indir . " ";
+ $kid = $kid->sibling;
+ }
+ if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) {
+ $indir = ($op->private & OPpSORT_DESCEND) ? '{$b <=> $a} '
+ : '{$a <=> $b} ';
+ }
+ elsif ($name eq "sort" && $op->private & OPpSORT_DESCEND) {
+ $indir = '{$b cmp $a} ';
+ }
+ for (; !null($kid); $kid = $kid->sibling) {
+ $expr = $self->deparse($kid, 6);
+ push @exprs, $expr;
+ }
+ my $name2 = $name;
+ if ($name eq "sort" && $op->private & OPpSORT_REVERSE) {
+ $name2 = 'reverse sort';
+ }
+ if ($name eq "sort" && ($op->private & OPpSORT_INPLACE)) {
+ return "$exprs[0] = $name2 $indir $exprs[0]";
+ }
+
+ my $args = $indir . join(", ", @exprs);
+ if ($indir ne "" and $name eq "sort") {
+ # We don't want to say "sort(f 1, 2, 3)", since perl -w will
+ # give bareword warnings in that case. Therefore if context
+ # requires, we'll put parens around the outside "(sort f 1, 2,
+ # 3)". Unfortunately, we'll currently think the parens are
+ # necessary more often that they really are, because we don't
+ # distinguish which side of an assignment we're on.
+ if ($cx >= 5) {
+ return "($name2 $args)";
+ } else {
+ return "$name2 $args";
+ }
+ } else {
+ return $self->maybe_parens_func($name2, $args, $cx, 5);
+ }
+
+}
+
+sub pp_prtf { indirop(@_, "printf") }
+sub pp_print { indirop(@_, "print") }
+sub pp_say { indirop(@_, "say") }
+sub pp_sort { indirop(@_, "sort") }
+
+sub mapop {
+ my $self = shift;
+ my($op, $cx, $name) = @_;
+ my($expr, @exprs);
+ my $kid = $op->first; # this is the (map|grep)start
+ $kid = $kid->first->sibling; # skip a pushmark
+ my $code = $kid->first; # skip a null
+ if (is_scope $code) {
+ $code = "{" . $self->deparse($code, 0) . "} ";
+ } else {
+ $code = $self->deparse($code, 24) . ", ";
+ }
+ $kid = $kid->sibling;
+ for (; !null($kid); $kid = $kid->sibling) {
+ $expr = $self->deparse($kid, 6);
+ push @exprs, $expr if defined $expr;
+ }
+ return $self->maybe_parens_func($name, $code . join(", ", @exprs), $cx, 5);
+}
+
+sub pp_mapwhile { mapop(@_, "map") }
+sub pp_grepwhile { mapop(@_, "grep") }
+sub pp_mapstart { baseop(@_, "map") }
+sub pp_grepstart { baseop(@_, "grep") }
+
+sub pp_list {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my($expr, @exprs);
+ my $kid = $op->first->sibling; # skip pushmark
+ my $lop;
+ my $local = "either"; # could be local(...), my(...), state(...) or our(...)
+ for ($lop = $kid; !null($lop); $lop = $lop->sibling) {
+ # This assumes that no other private flags equal 128, and that
+ # OPs that store things other than flags in their op_private,
+ # like OP_AELEMFAST, won't be immediate children of a list.
+ #
+ # OP_ENTERSUB can break this logic, so check for it.
+ # I suspect that open and exit can too.
+
+ if (!($lop->private & (OPpLVAL_INTRO|OPpOUR_INTRO)
+ or $lop->name eq "undef")
+ or $lop->name eq "entersub"
+ or $lop->name eq "exit"
+ or $lop->name eq "open")
+ {
+ $local = ""; # or not
+ last;
+ }
+ if ($lop->name =~ /^pad[ash]v$/) {
+ if ($lop->private & OPpPAD_STATE) { # state()
+ ($local = "", last) if $local =~ /^(?:local|our|my)$/;
+ $local = "state";
+ } else { # my()
+ ($local = "", last) if $local =~ /^(?:local|our|state)$/;
+ $local = "my";
+ }
+ } elsif ($lop->name =~ /^(gv|rv2)[ash]v$/
+ && $lop->private & OPpOUR_INTRO
+ or $lop->name eq "null" && $lop->first->name eq "gvsv"
+ && $lop->first->private & OPpOUR_INTRO) { # our()
+ ($local = "", last) if $local =~ /^(?:my|local|state)$/;
+ $local = "our";
+ } elsif ($lop->name ne "undef"
+ # specifically avoid the "reverse sort" optimisation,
+ # where "reverse" is nullified
+ && !($lop->name eq 'sort' && ($lop->flags & OPpSORT_REVERSE)))
+ {
+ # local()
+ ($local = "", last) if $local =~ /^(?:my|our|state)$/;
+ $local = "local";
+ }
+ }
+ $local = "" if $local eq "either"; # no point if it's all undefs
+ return $self->deparse($kid, $cx) if null $kid->sibling and not $local;
+ for (; !null($kid); $kid = $kid->sibling) {
+ if ($local) {
+ if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") {
+ $lop = $kid->first;
+ } else {
+ $lop = $kid;
+ }
+ $self->{'avoid_local'}{$$lop}++;
+ $expr = $self->deparse($kid, 6);
+ delete $self->{'avoid_local'}{$$lop};
+ } else {
+ $expr = $self->deparse($kid, 6);
+ }
+ push @exprs, $expr;
+ }
+ if ($local) {
+ return "$local(" . join(", ", @exprs) . ")";
+ } else {
+ return $self->maybe_parens( join(", ", @exprs), $cx, 6);
+ }
+}
+
+sub is_ifelse_cont {
+ my $op = shift;
+ return ($op->name eq "null" and class($op) eq "UNOP"
+ and $op->first->name =~ /^(and|cond_expr)$/
+ and is_scope($op->first->first->sibling));
+}
+
+sub pp_cond_expr {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $cond = $op->first;
+ my $true = $cond->sibling;
+ my $false = $true->sibling;
+ my $cuddle = $self->{'cuddle'};
+ unless ($cx < 1 and (is_scope($true) and $true->name ne "null") and
+ (is_scope($false) || is_ifelse_cont($false))
+ and $self->{'expand'} < 7) {
+ $cond = $self->deparse($cond, 8);
+ $true = $self->deparse($true, 6);
+ $false = $self->deparse($false, 8);
+ return $self->maybe_parens("$cond ? $true : $false", $cx, 8);
+ }
+
+ $cond = $self->deparse($cond, 1);
+ $true = $self->deparse($true, 0);
+ my $head = "if ($cond) {\n\t$true\n\b}";
+ my @elsifs;
+ while (!null($false) and is_ifelse_cont($false)) {
+ my $newop = $false->first;
+ my $newcond = $newop->first;
+ my $newtrue = $newcond->sibling;
+ $false = $newtrue->sibling; # last in chain is OP_AND => no else
+ if ($newcond->name eq "lineseq")
+ {
+ # lineseq to ensure correct line numbers in elsif()
+ # Bug #37302 fixed by change #33710.
+ $newcond = $newcond->first->sibling;
+ }
+ $newcond = $self->deparse($newcond, 1);
+ $newtrue = $self->deparse($newtrue, 0);
+ push @elsifs, "elsif ($newcond) {\n\t$newtrue\n\b}";
+ }
+ if (!null($false)) {
+ $false = $cuddle . "else {\n\t" .
+ $self->deparse($false, 0) . "\n\b}\cK";
+ } else {
+ $false = "\cK";
+ }
+ return $head . join($cuddle, "", @elsifs) . $false;
+}
+
+sub pp_once {
+ my ($self, $op, $cx) = @_;
+ my $cond = $op->first;
+ my $true = $cond->sibling;
+
+ return $self->deparse($true, $cx);
+}
+
+sub loop_common {
+ my $self = shift;
+ my($op, $cx, $init) = @_;
+ my $enter = $op->first;
+ my $kid = $enter->sibling;
+ local(@$self{qw'curstash warnings hints hinthash'})
+ = @$self{qw'curstash warnings hints hinthash'};
+ my $head = "";
+ my $bare = 0;
+ my $body;
+ my $cond = undef;
+ if ($kid->name eq "lineseq") { # bare or infinite loop
+ if ($kid->last->name eq "unstack") { # infinite
+ $head = "while (1) "; # Can't use for(;;) if there's a continue
+ $cond = "";
+ } else {
+ $bare = 1;
+ }
+ $body = $kid;
+ } elsif ($enter->name eq "enteriter") { # foreach
+ my $ary = $enter->first->sibling; # first was pushmark
+ my $var = $ary->sibling;
+ if ($ary->name eq 'null' and $enter->private & OPpITER_REVERSED) {
+ # "reverse" was optimised away
+ $ary = listop($self, $ary->first->sibling, 1, 'reverse');
+ } elsif ($enter->flags & OPf_STACKED
+ and not null $ary->first->sibling->sibling)
+ {
+ $ary = $self->deparse($ary->first->sibling, 9) . " .. " .
+ $self->deparse($ary->first->sibling->sibling, 9);
+ } else {
+ $ary = $self->deparse($ary, 1);
+ }
+ if (null $var) {
+ if ($enter->flags & OPf_SPECIAL) { # thread special var
+ $var = $self->pp_threadsv($enter, 1);
+ } else { # regular my() variable
+ $var = $self->pp_padsv($enter, 1);
+ }
+ } elsif ($var->name eq "rv2gv") {
+ $var = $self->pp_rv2sv($var, 1);
+ if ($enter->private & OPpOUR_INTRO) {
+ # our declarations don't have package names
+ $var =~ s/^(.).*::/$1/;
+ $var = "our $var";
+ }
+ } elsif ($var->name eq "gv") {
+ $var = "\$" . $self->deparse($var, 1);
+ }
+ $body = $kid->first->first->sibling; # skip OP_AND and OP_ITER
+ if (!is_state $body->first and $body->first->name ne "stub") {
+ confess unless $var eq '$_';
+ $body = $body->first;
+ return $self->deparse($body, 2) . " foreach ($ary)";
+ }
+ $head = "foreach $var ($ary) ";
+ } elsif ($kid->name eq "null") { # while/until
+ $kid = $kid->first;
+ my $name = {"and" => "while", "or" => "until"}->{$kid->name};
+ $cond = $self->deparse($kid->first, 1);
+ $head = "$name ($cond) ";
+ $body = $kid->first->sibling;
+ } elsif ($kid->name eq "stub") { # bare and empty
+ return "{;}"; # {} could be a hashref
+ }
+ # If there isn't a continue block, then the next pointer for the loop
+ # will point to the unstack, which is kid's last child, except
+ # in a bare loop, when it will point to the leaveloop. When neither of
+ # these conditions hold, then the second-to-last child is the continue
+ # block (or the last in a bare loop).
+ my $cont_start = $enter->nextop;
+ my $cont;
+ if ($$cont_start != $$op && ${$cont_start} != ${$body->last}) {
+ if ($bare) {
+ $cont = $body->last;
+ } else {
+ $cont = $body->first;
+ while (!null($cont->sibling->sibling)) {
+ $cont = $cont->sibling;
+ }
+ }
+ my $state = $body->first;
+ my $cuddle = $self->{'cuddle'};
+ my @states;
+ for (; $$state != $$cont; $state = $state->sibling) {
+ push @states, $state;
+ }
+ $body = $self->lineseq(undef, @states);
+ if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) {
+ $head = "for ($init; $cond; " . $self->deparse($cont, 1) .") ";
+ $cont = "\cK";
+ } else {
+ $cont = $cuddle . "continue {\n\t" .
+ $self->deparse($cont, 0) . "\n\b}\cK";
+ }
+ } else {
+ return "" if !defined $body;
+ if (length $init) {
+ $head = "for ($init; $cond;) ";
+ }
+ $cont = "\cK";
+ $body = $self->deparse($body, 0);
+ }
+ $body =~ s/;?$/;\n/;
+
+ return $head . "{\n\t" . $body . "\b}" . $cont;
+}
+
+sub pp_leaveloop { shift->loop_common(@_, "") }
+
+sub for_loop {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $init = $self->deparse($op, 1);
+ return $self->loop_common($op->sibling->first->sibling, $cx, $init);
+}
+
+sub pp_leavetry {
+ my $self = shift;
+ return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}";
+}
+
+BEGIN { eval "sub OP_CONST () {" . opnumber("const") . "}" }
+BEGIN { eval "sub OP_STRINGIFY () {" . opnumber("stringify") . "}" }
+BEGIN { eval "sub OP_RV2SV () {" . opnumber("rv2sv") . "}" }
+BEGIN { eval "sub OP_LIST () {" . opnumber("list") . "}" }
+
+sub pp_null {
+ my $self = shift;
+ my($op, $cx) = @_;
+ if (class($op) eq "OP") {
+ # old value is lost
+ return $self->{'ex_const'} if $op->targ == OP_CONST;
+ } elsif ($op->first->name eq "pushmark") {
+ return $self->pp_list($op, $cx);
+ } elsif ($op->first->name eq "enter") {
+ return $self->pp_leave($op, $cx);
+ } elsif ($op->first->name eq "leave") {
+ return $self->pp_leave($op->first, $cx);
+ } elsif ($op->first->name eq "scope") {
+ return $self->pp_scope($op->first, $cx);
+ } elsif ($op->targ == OP_STRINGIFY) {
+ return $self->dquote($op, $cx);
+ } elsif (!null($op->first->sibling) and
+ $op->first->sibling->name eq "readline" and
+ $op->first->sibling->flags & OPf_STACKED) {
+ return $self->maybe_parens($self->deparse($op->first, 7) . " = "
+ . $self->deparse($op->first->sibling, 7),
+ $cx, 7);
+ } elsif (!null($op->first->sibling) and
+ $op->first->sibling->name eq "trans" and
+ $op->first->sibling->flags & OPf_STACKED) {
+ return $self->maybe_parens($self->deparse($op->first, 20) . " =~ "
+ . $self->deparse($op->first->sibling, 20),
+ $cx, 20);
+ } elsif ($op->flags & OPf_SPECIAL && $cx < 1 && !$op->targ) {
+ return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};";
+ } elsif (!null($op->first->sibling) and
+ $op->first->sibling->name eq "null" and
+ class($op->first->sibling) eq "UNOP" and
+ $op->first->sibling->first->flags & OPf_STACKED and
+ $op->first->sibling->first->name eq "rcatline") {
+ return $self->maybe_parens($self->deparse($op->first, 18) . " .= "
+ . $self->deparse($op->first->sibling, 18),
+ $cx, 18);
+ } else {
+ return $self->deparse($op->first, $cx);
+ }
+}
+
+sub padname {
+ my $self = shift;
+ my $targ = shift;
+ return $self->padname_sv($targ)->PVX;
+}
+
+sub padany {
+ my $self = shift;
+ my $op = shift;
+ return substr($self->padname($op->targ), 1); # skip $/@/%
+}
+
+sub pp_padsv {
+ my $self = shift;
+ my($op, $cx) = @_;
+ return $self->maybe_my($op, $cx, $self->padname($op->targ));
+}
+
+sub pp_padav { pp_padsv(@_) }
+sub pp_padhv { pp_padsv(@_) }
+
+my @threadsv_names;
+
+BEGIN {
+ @threadsv_names = ("_", "1", "2", "3", "4", "5", "6", "7", "8", "9",
+ "&", "`", "'", "+", "/", ".", ",", "\\", '"', ";",
+ "^", "-", "%", "=", "|", "~", ":", "^A", "^E",
+ "!", "@");
+}
+
+sub pp_threadsv {
+ my $self = shift;
+ my($op, $cx) = @_;
+ return $self->maybe_local($op, $cx, "\$" . $threadsv_names[$op->targ]);
+}
+
+sub gv_or_padgv {
+ my $self = shift;
+ my $op = shift;
+ if (class($op) eq "PADOP") {
+ return $self->padval($op->padix);
+ } else { # class($op) eq "SVOP"
+ return $op->gv;
+ }
+}
+
+sub pp_gvsv {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $gv = $self->gv_or_padgv($op);
+ return $self->maybe_local($op, $cx, $self->stash_variable("\$",
+ $self->gv_name($gv)));
+}
+
+sub pp_gv {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $gv = $self->gv_or_padgv($op);
+ return $self->gv_name($gv);
+}
+
+sub pp_aelemfast {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $name;
+ if ($op->flags & OPf_SPECIAL) { # optimised PADAV
+ $name = $self->padname($op->targ);
+ $name =~ s/^@/\$/;
+ }
+ else {
+ my $gv = $self->gv_or_padgv($op);
+ $name = $self->gv_name($gv);
+ $name = $self->{'curstash'}."::$name"
+ if $name !~ /::/ && $self->lex_in_scope('@'.$name);
+ $name = '$' . $name;
+ }
+
+ return $name . "[" . ($op->private + $self->{'arybase'}) . "]";
+}
+
+sub rv2x {
+ my $self = shift;
+ my($op, $cx, $type) = @_;
+
+ if (class($op) eq 'NULL' || !$op->can("first")) {
+ carp("Unexpected op in pp_rv2x");
+ return 'XXX';
+ }
+ my $kid = $op->first;
+ if ($kid->name eq "gv") {
+ return $self->stash_variable($type, $self->deparse($kid, 0));
+ } elsif (is_scalar $kid) {
+ my $str = $self->deparse($kid, 0);
+ if ($str =~ /^\$([^\w\d])\z/) {
+ # "$$+" isn't a legal way to write the scalar dereference
+ # of $+, since the lexer can't tell you aren't trying to
+ # do something like "$$ + 1" to get one more than your
+ # PID. Either "${$+}" or "$${+}" are workable
+ # disambiguations, but if the programmer did the former,
+ # they'd be in the "else" clause below rather than here.
+ # It's not clear if this should somehow be unified with
+ # the code in dq and re_dq that also adds lexer
+ # disambiguation braces.
+ $str = '$' . "{$1}"; #'
+ }
+ return $type . $str;
+ } else {
+ return $type . "{" . $self->deparse($kid, 0) . "}";
+ }
+}
+
+sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) }
+sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) }
+sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) }
+
+# skip rv2av
+sub pp_av2arylen {
+ my $self = shift;
+ my($op, $cx) = @_;
+ if ($op->first->name eq "padav") {
+ return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first));
+ } else {
+ return $self->maybe_local($op, $cx,
+ $self->rv2x($op->first, $cx, '$#'));
+ }
+}
+
+# skip down to the old, ex-rv2cv
+sub pp_rv2cv {
+ my ($self, $op, $cx) = @_;
+ if (!null($op->first) && $op->first->name eq 'null' &&
+ $op->first->targ eq OP_LIST)
+ {
+ return $self->rv2x($op->first->first->sibling, $cx, "&")
+ }
+ else {
+ return $self->rv2x($op, $cx, "")
+ }
+}
+
+sub list_const {
+ my $self = shift;
+ my($cx, @list) = @_;
+ my @a = map $self->const($_, 6), @list;
+ if (@a == 0) {
+ return "()";
+ } elsif (@a == 1) {
+ return $a[0];
+ } elsif ( @a > 2 and !grep(!/^-?\d+$/, @a)) {
+ # collapse (-1,0,1,2) into (-1..2)
+ my ($s, $e) = @a[0,-1];
+ my $i = $s;
+ return $self->maybe_parens("$s..$e", $cx, 9)
+ unless grep $i++ != $_, @a;
+ }
+ return $self->maybe_parens(join(", ", @a), $cx, 6);
+}
+
+sub pp_rv2av {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $kid = $op->first;
+ if ($kid->name eq "const") { # constant list
+ my $av = $self->const_sv($kid);
+ return $self->list_const($cx, $av->ARRAY);
+ } else {
+ return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@"));
+ }
+ }
+
+sub is_subscriptable {
+ my $op = shift;
+ if ($op->name =~ /^[ahg]elem/) {
+ return 1;
+ } elsif ($op->name eq "entersub") {
+ my $kid = $op->first;
+ return 0 unless null $kid->sibling;
+ $kid = $kid->first;
+ $kid = $kid->sibling until null $kid->sibling;
+ return 0 if is_scope($kid);
+ $kid = $kid->first;
+ return 0 if $kid->name eq "gv";
+ return 0 if is_scalar($kid);
+ return is_subscriptable($kid);
+ } else {
+ return 0;
+ }
+}
+
+sub elem_or_slice_array_name
+{
+ my $self = shift;
+ my ($array, $left, $padname, $allow_arrow) = @_;
+
+ if ($array->name eq $padname) {
+ return $self->padany($array);
+ } elsif (is_scope($array)) { # ${expr}[0]
+ return "{" . $self->deparse($array, 0) . "}";
+ } elsif ($array->name eq "gv") {
+ $array = $self->gv_name($self->gv_or_padgv($array));
+ if ($array !~ /::/) {
+ my $prefix = ($left eq '[' ? '@' : '%');
+ $array = $self->{curstash}.'::'.$array
+ if $self->lex_in_scope($prefix . $array);
+ }
+ return $array;
+ } elsif (!$allow_arrow || is_scalar $array) { # $x[0], $$x[0], ...
+ return $self->deparse($array, 24);
+ } else {
+ return undef;
+ }
+}
+
+sub elem_or_slice_single_index
+{
+ my $self = shift;
+ my ($idx) = @_;
+
+ $idx = $self->deparse($idx, 1);
+
+ # Outer parens in an array index will confuse perl
+ # if we're interpolating in a regular expression, i.e.
+ # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/
+ #
+ # If $self->{parens}, then an initial '(' will
+ # definitely be paired with a final ')'. If
+ # !$self->{parens}, the misleading parens won't
+ # have been added in the first place.
+ #
+ # [You might think that we could get "(...)...(...)"
+ # where the initial and final parens do not match
+ # each other. But we can't, because the above would
+ # only happen if there's an infix binop between the
+ # two pairs of parens, and *that* means that the whole
+ # expression would be parenthesized as well.]
+ #
+ $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'};
+
+ # Hash-element braces will autoquote a bareword inside themselves.
+ # We need to make sure that C<$hash{warn()}> doesn't come out as
+ # C<$hash{warn}>, which has a quite different meaning. Currently
+ # B::Deparse will always quote strings, even if the string was a
+ # bareword in the original (i.e. the OPpCONST_BARE flag is ignored
+ # for constant strings.) So we can cheat slightly here - if we see
+ # a bareword, we know that it is supposed to be a function call.
+ #
+ $idx =~ s/^([A-Za-z_]\w*)$/$1()/;
+
+ return $idx;
+}
+
+sub elem {
+ my $self = shift;
+ my ($op, $cx, $left, $right, $padname) = @_;
+ my($array, $idx) = ($op->first, $op->first->sibling);
+
+ $idx = $self->elem_or_slice_single_index($idx);
+
+ unless ($array->name eq $padname) { # Maybe this has been fixed
+ $array = $array->first; # skip rv2av (or ex-rv2av in _53+)
+ }
+ if (my $array_name=$self->elem_or_slice_array_name
+ ($array, $left, $padname, 1)) {
+ return "\$" . $array_name . $left . $idx . $right;
+ } else {
+ # $x[20][3]{hi} or expr->[20]
+ my $arrow = is_subscriptable($array) ? "" : "->";
+ return $self->deparse($array, 24) . $arrow . $left . $idx . $right;
+ }
+
+}
+
+sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) }
+sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) }
+
+sub pp_gelem {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my($glob, $part) = ($op->first, $op->last);
+ $glob = $glob->first; # skip rv2gv
+ $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug
+ my $scope = is_scope($glob);
+ $glob = $self->deparse($glob, 0);
+ $part = $self->deparse($part, 1);
+ return "*" . ($scope ? "{$glob}" : $glob) . "{$part}";
+}
+
+sub slice {
+ my $self = shift;
+ my ($op, $cx, $left, $right, $regname, $padname) = @_;
+ my $last;
+ my(@elems, $kid, $array, $list);
+ if (class($op) eq "LISTOP") {
+ $last = $op->last;
+ } else { # ex-hslice inside delete()
+ for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {}
+ $last = $kid;
+ }
+ $array = $last;
+ $array = $array->first
+ if $array->name eq $regname or $array->name eq "null";
+ $array = $self->elem_or_slice_array_name($array,$left,$padname,0);
+ $kid = $op->first->sibling; # skip pushmark
+ if ($kid->name eq "list") {
+ $kid = $kid->first->sibling; # skip list, pushmark
+ for (; !null $kid; $kid = $kid->sibling) {
+ push @elems, $self->deparse($kid, 6);
+ }
+ $list = join(", ", @elems);
+ } else {
+ $list = $self->elem_or_slice_single_index($kid);
+ }
+ return "\@" . $array . $left . $list . $right;
+}
+
+sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) }
+sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) }
+
+sub pp_lslice {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $idx = $op->first;
+ my $list = $op->last;
+ my(@elems, $kid);
+ $list = $self->deparse($list, 1);
+ $idx = $self->deparse($idx, 1);
+ return "($list)" . "[$idx]";
+}
+
+sub want_scalar {
+ my $op = shift;
+ return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR;
+}
+
+sub want_list {
+ my $op = shift;
+ return ($op->flags & OPf_WANT) == OPf_WANT_LIST;
+}
+
+sub _method {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $kid = $op->first->sibling; # skip pushmark
+ my($meth, $obj, @exprs);
+ if ($kid->name eq "list" and want_list $kid) {
+ # When an indirect object isn't a bareword but the args are in
+ # parens, the parens aren't part of the method syntax (the LLAFR
+ # doesn't apply), but they make a list with OPf_PARENS set that
+ # doesn't get flattened by the append_elem that adds the method,
+ # making a (object, arg1, arg2, ...) list where the object
+ # usually is. This can be distinguished from
+ # `($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an
+ # object) because in the later the list is in scalar context
+ # as the left side of -> always is, while in the former
+ # the list is in list context as method arguments always are.
+ # (Good thing there aren't method prototypes!)
+ $meth = $kid->sibling;
+ $kid = $kid->first->sibling; # skip pushmark
+ $obj = $kid;
+ $kid = $kid->sibling;
+ for (; not null $kid; $kid = $kid->sibling) {
+ push @exprs, $kid;
+ }
+ } else {
+ $obj = $kid;
+ $kid = $kid->sibling;
+ for (; !null ($kid->sibling) && $kid->name ne "method_named";
+ $kid = $kid->sibling) {
+ push @exprs, $kid
+ }
+ $meth = $kid;
+ }
+
+ if ($meth->name eq "method_named") {
+ $meth = $self->const_sv($meth)->PV;
+ } else {
+ $meth = $meth->first;
+ if ($meth->name eq "const") {
+ # As of 5.005_58, this case is probably obsoleted by the
+ # method_named case above
+ $meth = $self->const_sv($meth)->PV; # needs to be bare
+ }
+ }
+
+ return { method => $meth, variable_method => ref($meth),
+ object => $obj, args => \@exprs };
+}
+
+# compat function only
+sub method {
+ my $self = shift;
+ my $info = $self->_method(@_);
+ return $self->e_method( $self->_method(@_) );
+}
+
+sub e_method {
+ my ($self, $info) = @_;
+ my $obj = $self->deparse($info->{object}, 24);
+
+ my $meth = $info->{method};
+ $meth = $self->deparse($meth, 1) if $info->{variable_method};
+ my $args = join(", ", map { $self->deparse($_, 6) } @{$info->{args}} );
+ my $kid = $obj . "->" . $meth;
+ if (length $args) {
+ return $kid . "(" . $args . ")"; # parens mandatory
+ } else {
+ return $kid;
+ }
+}
+
+# returns "&" if the prototype doesn't match the args,
+# or ("", $args_after_prototype_demunging) if it does.
+sub check_proto {
+ my $self = shift;
+ return "&" if $self->{'noproto'};
+ my($proto, @args) = @_;
+ my($arg, $real);
+ my $doneok = 0;
+ my @reals;
+ # An unbackslashed @ or % gobbles up the rest of the args
+ 1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/;
+ while ($proto) {
+ $proto =~ s/^(\\?[\$\@&%*_]|\\\[[\$\@&%*]+\]|;)//;
+ my $chr = $1;
+ if ($chr eq "") {
+ return "&" if @args;
+ } elsif ($chr eq ";") {
+ $doneok = 1;
+ } elsif ($chr eq "@" or $chr eq "%") {
+ push @reals, map($self->deparse($_, 6), @args);
+ @args = ();
+ } else {
+ $arg = shift @args;
+ last unless $arg;
+ if ($chr eq "\$" || $chr eq "_") {
+ if (want_scalar $arg) {
+ push @reals, $self->deparse($arg, 6);
+ } else {
+ return "&";
+ }
+ } elsif ($chr eq "&") {
+ if ($arg->name =~ /^(s?refgen|undef)$/) {
+ push @reals, $self->deparse($arg, 6);
+ } else {
+ return "&";
+ }
+ } elsif ($chr eq "*") {
+ if ($arg->name =~ /^s?refgen$/
+ and $arg->first->first->name eq "rv2gv")
+ {
+ $real = $arg->first->first; # skip refgen, null
+ if ($real->first->name eq "gv") {
+ push @reals, $self->deparse($real, 6);
+ } else {
+ push @reals, $self->deparse($real->first, 6);
+ }
+ } else {
+ return "&";
+ }
+ } elsif (substr($chr, 0, 1) eq "\\") {
+ $chr =~ tr/\\[]//d;
+ if ($arg->name =~ /^s?refgen$/ and
+ !null($real = $arg->first) and
+ ($chr =~ /\$/ && is_scalar($real->first)
+ or ($chr =~ /@/
+ && class($real->first->sibling) ne 'NULL'
+ && $real->first->sibling->name
+ =~ /^(rv2|pad)av$/)
+ or ($chr =~ /%/
+ && class($real->first->sibling) ne 'NULL'
+ && $real->first->sibling->name
+ =~ /^(rv2|pad)hv$/)
+ #or ($chr =~ /&/ # This doesn't work
+ # && $real->first->name eq "rv2cv")
+ or ($chr =~ /\*/
+ && $real->first->name eq "rv2gv")))
+ {
+ push @reals, $self->deparse($real, 6);
+ } else {
+ return "&";
+ }
+ }
+ }
+ }
+ return "&" if $proto and !$doneok; # too few args and no `;'
+ return "&" if @args; # too many args
+ return ("", join ", ", @reals);
+}
+
+sub pp_entersub {
+ my $self = shift;
+ my($op, $cx) = @_;
+ return $self->e_method($self->_method($op, $cx))
+ unless null $op->first->sibling;
+ my $prefix = "";
+ my $amper = "";
+ my($kid, @exprs);
+ if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
+ $prefix = "do ";
+ } elsif ($op->private & OPpENTERSUB_AMPER) {
+ $amper = "&";
+ }
+ $kid = $op->first;
+ $kid = $kid->first->sibling; # skip ex-list, pushmark
+ for (; not null $kid->sibling; $kid = $kid->sibling) {
+ push @exprs, $kid;
+ }
+ my $simple = 0;
+ my $proto = undef;
+ if (is_scope($kid)) {
+ $amper = "&";
+ $kid = "{" . $self->deparse($kid, 0) . "}";
+ } elsif ($kid->first->name eq "gv") {
+ my $gv = $self->gv_or_padgv($kid->first);
+ if (class($gv->CV) ne "SPECIAL") {
+ $proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK;
+ }
+ $simple = 1; # only calls of named functions can be prototyped
+ $kid = $self->deparse($kid, 24);
+ if (!$amper) {
+ if ($kid eq 'main::') {
+ $kid = '::';
+ } elsif ($kid !~ /^(?:\w|::)(?:[\w\d]|::(?!\z))*\z/) {
+ $kid = single_delim("q", "'", $kid) . '->';
+ }
+ }
+ } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') {
+ $amper = "&";
+ $kid = $self->deparse($kid, 24);
+ } else {
+ $prefix = "";
+ my $arrow = is_subscriptable($kid->first) ? "" : "->";
+ $kid = $self->deparse($kid, 24) . $arrow;
+ }
+
+ # Doesn't matter how many prototypes there are, if
+ # they haven't happened yet!
+ my $declared;
+ {
+ no strict 'refs';
+ no warnings 'uninitialized';
+ $declared = exists $self->{'subs_declared'}{$kid}
+ || (
+ defined &{ ${$self->{'curstash'}."::"}{$kid} }
+ && !exists
+ $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid}
+ && defined prototype $self->{'curstash'}."::".$kid
+ );
+ if (!$declared && defined($proto)) {
+ # Avoid "too early to check prototype" warning
+ ($amper, $proto) = ('&');
+ }
+ }
+
+ my $args;
+ if ($declared and defined $proto and not $amper) {
+ ($amper, $args) = $self->check_proto($proto, @exprs);
+ if ($amper eq "&") {
+ $args = join(", ", map($self->deparse($_, 6), @exprs));
+ }
+ } else {
+ $args = join(", ", map($self->deparse($_, 6), @exprs));
+ }
+ if ($prefix or $amper) {
+ if ($op->flags & OPf_STACKED) {
+ return $prefix . $amper . $kid . "(" . $args . ")";
+ } else {
+ return $prefix . $amper. $kid;
+ }
+ } else {
+ # glob() invocations can be translated into calls of
+ # CORE::GLOBAL::glob with a second parameter, a number.
+ # Reverse this.
+ if ($kid eq "CORE::GLOBAL::glob") {
+ $kid = "glob";
+ $args =~ s/\s*,[^,]+$//;
+ }
+
+ # It's a syntax error to call CORE::GLOBAL::foo without a prefix,
+ # so it must have been translated from a keyword call. Translate
+ # it back.
+ $kid =~ s/^CORE::GLOBAL:://;
+
+ my $dproto = defined($proto) ? $proto : "undefined";
+ if (!$declared) {
+ return "$kid(" . $args . ")";
+ } elsif ($dproto eq "") {
+ return $kid;
+ } elsif ($dproto eq "\$" and is_scalar($exprs[0])) {
+ # is_scalar is an excessively conservative test here:
+ # really, we should be comparing to the precedence of the
+ # top operator of $exprs[0] (ala unop()), but that would
+ # take some major code restructuring to do right.
+ return $self->maybe_parens_func($kid, $args, $cx, 16);
+ } elsif ($dproto ne '$' and defined($proto) || $simple) { #'
+ return $self->maybe_parens_func($kid, $args, $cx, 5);
+ } else {
+ return "$kid(" . $args . ")";
+ }
+ }
+}
+
+sub pp_enterwrite { unop(@_, "write") }
+
+# escape things that cause interpolation in double quotes,
+# but not character escapes
+sub uninterp {
+ my($str) = @_;
+ $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g;
+ return $str;
+}
+
+{
+my $bal;
+BEGIN {
+ use re "eval";
+ # Matches any string which is balanced with respect to {braces}
+ $bal = qr(
+ (?:
+ [^\\{}]
+ | \\\\
+ | \\[{}]
+ | \{(??{$bal})\}
+ )*
+ )x;
+}
+
+# the same, but treat $|, $), $( and $ at the end of the string differently
+sub re_uninterp {
+ my($str) = @_;
+
+ $str =~ s/
+ ( ^|\G # $1
+ | [^\\]
+ )
+
+ ( # $2
+ (?:\\\\)*
+ )
+
+ ( # $3
+ (\(\?\??\{$bal\}\)) # $4
+ | [\$\@]
+ (?!\||\)|\(|$)
+ | \\[uUlLQE]
+ )
+
+ /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
+
+ return $str;
+}
+
+# This is for regular expressions with the /x modifier
+# We have to leave comments unmangled.
+sub re_uninterp_extended {
+ my($str) = @_;
+
+ $str =~ s/
+ ( ^|\G # $1
+ | [^\\]
+ )
+
+ ( # $2
+ (?:\\\\)*
+ )
+
+ ( # $3
+ ( \(\?\??\{$bal\}\) # $4 (skip over (?{}) and (??{}) blocks)
+ | \#[^\n]* # (skip over comments)
+ )
+ | [\$\@]
+ (?!\||\)|\(|$|\s)
+ | \\[uUlLQE]
+ )
+
+ /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
+
+ return $str;
+}
+}
+
+my %unctrl = # portable to to EBCDIC
+ (
+ "\c@" => '\c@', # unused
+ "\cA" => '\cA',
+ "\cB" => '\cB',
+ "\cC" => '\cC',
+ "\cD" => '\cD',
+ "\cE" => '\cE',
+ "\cF" => '\cF',
+ "\cG" => '\cG',
+ "\cH" => '\cH',
+ "\cI" => '\cI',
+ "\cJ" => '\cJ',
+ "\cK" => '\cK',
+ "\cL" => '\cL',
+ "\cM" => '\cM',
+ "\cN" => '\cN',
+ "\cO" => '\cO',
+ "\cP" => '\cP',
+ "\cQ" => '\cQ',
+ "\cR" => '\cR',
+ "\cS" => '\cS',
+ "\cT" => '\cT',
+ "\cU" => '\cU',
+ "\cV" => '\cV',
+ "\cW" => '\cW',
+ "\cX" => '\cX',
+ "\cY" => '\cY',
+ "\cZ" => '\cZ',
+ "\c[" => '\c[', # unused
+ "\c\\" => '\c\\', # unused
+ "\c]" => '\c]', # unused
+ "\c_" => '\c_', # unused
+ );
+
+# character escapes, but not delimiters that might need to be escaped
+sub escape_str { # ASCII, UTF8
+ my($str) = @_;
+ $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
+ $str =~ s/\a/\\a/g;
+# $str =~ s/\cH/\\b/g; # \b means something different in a regex
+ $str =~ s/\t/\\t/g;
+ $str =~ s/\n/\\n/g;
+ $str =~ s/\e/\\e/g;
+ $str =~ s/\f/\\f/g;
+ $str =~ s/\r/\\r/g;
+ $str =~ s/([\cA-\cZ])/$unctrl{$1}/ge;
+ $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/ge;
+ return $str;
+}
+
+# For regexes with the /x modifier.
+# Leave whitespace unmangled.
+sub escape_extended_re {
+ my($str) = @_;
+ $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
+ $str =~ s/([[:^print:]])/
+ ($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/ge;
+ $str =~ s/\n/\n\f/g;
+ return $str;
+}
+
+# Don't do this for regexen
+sub unback {
+ my($str) = @_;
+ $str =~ s/\\/\\\\/g;
+ return $str;
+}
+
+# Remove backslashes which precede literal control characters,
+# to avoid creating ambiguity when we escape the latter.
+sub re_unback {
+ my($str) = @_;
+
+ # the insane complexity here is due to the behaviour of "\c\"
+ $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[[:^print:]])/$1$2/g;
+ return $str;
+}
+
+sub balanced_delim {
+ my($str) = @_;
+ my @str = split //, $str;
+ my($ar, $open, $close, $fail, $c, $cnt, $last_bs);
+ for $ar (['[',']'], ['(',')'], ['<','>'], ['{','}']) {
+ ($open, $close) = @$ar;
+ $fail = 0; $cnt = 0; $last_bs = 0;
+ for $c (@str) {
+ if ($c eq $open) {
+ $fail = 1 if $last_bs;
+ $cnt++;
+ } elsif ($c eq $close) {
+ $fail = 1 if $last_bs;
+ $cnt--;
+ if ($cnt < 0) {
+ # qq()() isn't ")("
+ $fail = 1;
+ last;
+ }
+ }
+ $last_bs = $c eq '\\';
+ }
+ $fail = 1 if $cnt != 0;
+ return ($open, "$open$str$close") if not $fail;
+ }
+ return ("", $str);
+}
+
+sub single_delim {
+ my($q, $default, $str) = @_;
+ return "$default$str$default" if $default and index($str, $default) == -1;
+ if ($q ne 'qr') {
+ (my $succeed, $str) = balanced_delim($str);
+ return "$q$str" if $succeed;
+ }
+ for my $delim ('/', '"', '#') {
+ return "$q$delim" . $str . $delim if index($str, $delim) == -1;
+ }
+ if ($default) {
+ $str =~ s/$default/\\$default/g;
+ return "$default$str$default";
+ } else {
+ $str =~ s[/][\\/]g;
+ return "$q/$str/";
+ }
+}
+
+my $max_prec;
+BEGIN { $max_prec = int(0.999 + 8*length(pack("F", 42))*log(2)/log(10)); }
+
+# Split a floating point number into an integer mantissa and a binary
+# exponent. Assumes you've already made sure the number isn't zero or
+# some weird infinity or NaN.
+sub split_float {
+ my($f) = @_;
+ my $exponent = 0;
+ if ($f == int($f)) {
+ while ($f % 2 == 0) {
+ $f /= 2;
+ $exponent++;
+ }
+ } else {
+ while ($f != int($f)) {
+ $f *= 2;
+ $exponent--;
+ }
+ }
+ my $mantissa = sprintf("%.0f", $f);
+ return ($mantissa, $exponent);
+}
+
+sub const {
+ my $self = shift;
+ my($sv, $cx) = @_;
+ if ($self->{'use_dumper'}) {
+ return $self->const_dumper($sv, $cx);
+ }
+ if (class($sv) eq "SPECIAL") {
+ # sv_undef, sv_yes, sv_no
+ return ('undef', '1', $self->maybe_parens("!1", $cx, 21))[$$sv-1];
+ }
+ if (class($sv) eq "NULL") {
+ return 'undef';
+ }
+ # convert a version object into the "v1.2.3" string in its V magic
+ if ($sv->FLAGS & SVs_RMG) {
+ for (my $mg = $sv->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
+ return $mg->PTR if $mg->TYPE eq 'V';
+ }
+ }
+
+ if ($sv->FLAGS & SVf_IOK) {
+ my $str = $sv->int_value;
+ $str = $self->maybe_parens($str, $cx, 21) if $str < 0;
+ return $str;
+ } elsif ($sv->FLAGS & SVf_NOK) {
+ my $nv = $sv->NV;
+ if ($nv == 0) {
+ if (pack("F", $nv) eq pack("F", 0)) {
+ # positive zero
+ return "0";
+ } else {
+ # negative zero
+ return $self->maybe_parens("-.0", $cx, 21);
+ }
+ } elsif (1/$nv == 0) {
+ if ($nv > 0) {
+ # positive infinity
+ return $self->maybe_parens("9**9**9", $cx, 22);
+ } else {
+ # negative infinity
+ return $self->maybe_parens("-9**9**9", $cx, 21);
+ }
+ } elsif ($nv != $nv) {
+ # NaN
+ if (pack("F", $nv) eq pack("F", sin(9**9**9))) {
+ # the normal kind
+ return "sin(9**9**9)";
+ } elsif (pack("F", $nv) eq pack("F", -sin(9**9**9))) {
+ # the inverted kind
+ return $self->maybe_parens("-sin(9**9**9)", $cx, 21);
+ } else {
+ # some other kind
+ my $hex = unpack("h*", pack("F", $nv));
+ return qq'unpack("F", pack("h*", "$hex"))';
+ }
+ }
+ # first, try the default stringification
+ my $str = "$nv";
+ if ($str != $nv) {
+ # failing that, try using more precision
+ $str = sprintf("%.${max_prec}g", $nv);
+# if (pack("F", $str) ne pack("F", $nv)) {
+ if ($str != $nv) {
+ # not representable in decimal with whatever sprintf()
+ # and atof() Perl is using here.
+ my($mant, $exp) = split_float($nv);
+ return $self->maybe_parens("$mant * 2**$exp", $cx, 19);
+ }
+ }
+ $str = $self->maybe_parens($str, $cx, 21) if $nv < 0;
+ return $str;
+ } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) {
+ my $ref = $sv->RV;
+ if (class($ref) eq "AV") {
+ return "[" . $self->list_const(2, $ref->ARRAY) . "]";
+ } elsif (class($ref) eq "HV") {
+ my %hash = $ref->ARRAY;
+ my @elts;
+ for my $k (sort keys %hash) {
+ push @elts, "$k => " . $self->const($hash{$k}, 6);
+ }
+ return "{" . join(", ", @elts) . "}";
+ } elsif (class($ref) eq "CV") {
+ return "sub " . $self->deparse_sub($ref);
+ }
+ if ($ref->FLAGS & SVs_SMG) {
+ for (my $mg = $ref->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
+ if ($mg->TYPE eq 'r') {
+ my $re = re_uninterp(escape_str(re_unback($mg->precomp)));
+ return single_delim("qr", "", $re);
+ }
+ }
+ }
+
+ return $self->maybe_parens("\\" . $self->const($ref, 20), $cx, 20);
+ } elsif ($sv->FLAGS & SVf_POK) {
+ my $str = $sv->PV;
+ if ($str =~ /[[:^print:]]/) {
+ return single_delim("qq", '"', uninterp escape_str unback $str);
+ } else {
+ return single_delim("q", "'", unback $str);
+ }
+ } else {
+ return "undef";
+ }
+}
+
+sub const_dumper {
+ my $self = shift;
+ my($sv, $cx) = @_;
+ my $ref = $sv->object_2svref();
+ my $dumper = Data::Dumper->new([$$ref], ['$v']);
+ $dumper->Purity(1)->Terse(1)->Deparse(1)->Indent(0)->Useqq(1)->Sortkeys(1);
+ my $str = $dumper->Dump();
+ if ($str =~ /^\$v/) {
+ return '${my ' . $str . ' \$v}';
+ } else {
+ return $str;
+ }
+}
+
+sub const_sv {
+ my $self = shift;
+ my $op = shift;
+ my $sv = $op->sv;
+ # the constant could be in the pad (under useithreads)
+ $sv = $self->padval($op->targ) unless $$sv;
+ return $sv;
+}
+
+sub pp_const {
+ my $self = shift;
+ my($op, $cx) = @_;
+ if ($op->private & OPpCONST_ARYBASE) {
+ return '$[';
+ }
+# if ($op->private & OPpCONST_BARE) { # trouble with `=>' autoquoting
+# return $self->const_sv($op)->PV;
+# }
+ my $sv = $self->const_sv($op);
+ return $self->const($sv, $cx);
+}
+
+sub dq {
+ my $self = shift;
+ my $op = shift;
+ my $type = $op->name;
+ if ($type eq "const") {
+ return '$[' if $op->private & OPpCONST_ARYBASE;
+ return uninterp(escape_str(unback($self->const_sv($op)->as_string)));
+ } elsif ($type eq "concat") {
+ my $first = $self->dq($op->first);
+ my $last = $self->dq($op->last);
+
+ # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]", "$foo\::bar"
+ ($last =~ /^[A-Z\\\^\[\]_?]/ &&
+ $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
+ || ($last =~ /^[:'{\[\w_]/ && #'
+ $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
+
+ return $first . $last;
+ } elsif ($type eq "uc") {
+ return '\U' . $self->dq($op->first->sibling) . '\E';
+ } elsif ($type eq "lc") {
+ return '\L' . $self->dq($op->first->sibling) . '\E';
+ } elsif ($type eq "ucfirst") {
+ return '\u' . $self->dq($op->first->sibling);
+ } elsif ($type eq "lcfirst") {
+ return '\l' . $self->dq($op->first->sibling);
+ } elsif ($type eq "quotemeta") {
+ return '\Q' . $self->dq($op->first->sibling) . '\E';
+ } elsif ($type eq "join") {
+ return $self->deparse($op->last, 26); # was join($", @ary)
+ } else {
+ return $self->deparse($op, 26);
+ }
+}
+
+sub pp_backtick {
+ my $self = shift;
+ my($op, $cx) = @_;
+ # skip pushmark if it exists (readpipe() vs ``)
+ my $child = $op->first->sibling->isa('B::NULL')
+ ? $op->first : $op->first->sibling;
+ return single_delim("qx", '`', $self->dq($child));
+}
+
+sub dquote {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $kid = $op->first->sibling; # skip ex-stringify, pushmark
+ return $self->deparse($kid, $cx) if $self->{'unquote'};
+ $self->maybe_targmy($kid, $cx,
+ sub {single_delim("qq", '"', $self->dq($_[1]))});
+}
+
+# OP_STRINGIFY is a listop, but it only ever has one arg
+sub pp_stringify { maybe_targmy(@_, \&dquote) }
+
+# tr/// and s/// (and tr[][], tr[]//, tr###, etc)
+# note that tr(from)/to/ is OK, but not tr/from/(to)
+sub double_delim {
+ my($from, $to) = @_;
+ my($succeed, $delim);
+ if ($from !~ m[/] and $to !~ m[/]) {
+ return "/$from/$to/";
+ } elsif (($succeed, $from) = balanced_delim($from) and $succeed) {
+ if (($succeed, $to) = balanced_delim($to) and $succeed) {
+ return "$from$to";
+ } else {
+ for $delim ('/', '"', '#') { # note no `'' -- s''' is special
+ return "$from$delim$to$delim" if index($to, $delim) == -1;
+ }
+ $to =~ s[/][\\/]g;
+ return "$from/$to/";
+ }
+ } else {
+ for $delim ('/', '"', '#') { # note no '
+ return "$delim$from$delim$to$delim"
+ if index($to . $from, $delim) == -1;
+ }
+ $from =~ s[/][\\/]g;
+ $to =~ s[/][\\/]g;
+ return "/$from/$to/";
+ }
+}
+
+# Only used by tr///, so backslashes hyphens
+sub pchr { # ASCII
+ my($n) = @_;
+ if ($n == ord '\\') {
+ return '\\\\';
+ } elsif ($n == ord "-") {
+ return "\\-";
+ } elsif ($n >= ord(' ') and $n <= ord('~')) {
+ return chr($n);
+ } elsif ($n == ord "\a") {
+ return '\\a';
+ } elsif ($n == ord "\b") {
+ return '\\b';
+ } elsif ($n == ord "\t") {
+ return '\\t';
+ } elsif ($n == ord "\n") {
+ return '\\n';
+ } elsif ($n == ord "\e") {
+ return '\\e';
+ } elsif ($n == ord "\f") {
+ return '\\f';
+ } elsif ($n == ord "\r") {
+ return '\\r';
+ } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) {
+ return '\\c' . chr(ord("@") + $n);
+ } else {
+# return '\x' . sprintf("%02x", $n);
+ return '\\' . sprintf("%03o", $n);
+ }
+}
+
+sub collapse {
+ my(@chars) = @_;
+ my($str, $c, $tr) = ("");
+ for ($c = 0; $c < @chars; $c++) {
+ $tr = $chars[$c];
+ $str .= pchr($tr);
+ if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and
+ $chars[$c + 2] == $tr + 2)
+ {
+ for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++)
+ {}
+ $str .= "-";
+ $str .= pchr($chars[$c]);
+ }
+ }
+ return $str;
+}
+
+sub tr_decode_byte {
+ my($table, $flags) = @_;
+ my(@table) = unpack("s*", $table);
+ splice @table, 0x100, 1; # Number of subsequent elements
+ my($c, $tr, @from, @to, @delfrom, $delhyphen);
+ if ($table[ord "-"] != -1 and
+ $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1)
+ {
+ $tr = $table[ord "-"];
+ $table[ord "-"] = -1;
+ if ($tr >= 0) {
+ @from = ord("-");
+ @to = $tr;
+ } else { # -2 ==> delete
+ $delhyphen = 1;
+ }
+ }
+ for ($c = 0; $c < @table; $c++) {
+ $tr = $table[$c];
+ if ($tr >= 0) {
+ push @from, $c; push @to, $tr;
+ } elsif ($tr == -2) {
+ push @delfrom, $c;
+ }
+ }
+ @from = (@from, @delfrom);
+ if ($flags & OPpTRANS_COMPLEMENT) {
+ my @newfrom = ();
+ my %from;
+ @from{@from} = (1) x @from;
+ for ($c = 0; $c < 256; $c++) {
+ push @newfrom, $c unless $from{$c};
+ }
+ @from = @newfrom;
+ }
+ unless ($flags & OPpTRANS_DELETE || !@to) {
+ pop @to while $#to and $to[$#to] == $to[$#to -1];
+ }
+ my($from, $to);
+ $from = collapse(@from);
+ $to = collapse(@to);
+ $from .= "-" if $delhyphen;
+ return ($from, $to);
+}
+
+sub tr_chr {
+ my $x = shift;
+ if ($x == ord "-") {
+ return "\\-";
+ } elsif ($x == ord "\\") {
+ return "\\\\";
+ } else {
+ return chr $x;
+ }
+}
+
+# XXX This doesn't yet handle all cases correctly either
+
+sub tr_decode_utf8 {
+ my($swash_hv, $flags) = @_;
+ my %swash = $swash_hv->ARRAY;
+ my $final = undef;
+ $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'};
+ my $none = $swash{"NONE"}->IV;
+ my $extra = $none + 1;
+ my(@from, @delfrom, @to);
+ my $line;
+ foreach $line (split /\n/, $swash{'LIST'}->PV) {
+ my($min, $max, $result) = split(/\t/, $line);
+ $min = hex $min;
+ if (length $max) {
+ $max = hex $max;
+ } else {
+ $max = $min;
+ }
+ $result = hex $result;
+ if ($result == $extra) {
+ push @delfrom, [$min, $max];
+ } else {
+ push @from, [$min, $max];
+ push @to, [$result, $result + $max - $min];
+ }
+ }
+ for my $i (0 .. $#from) {
+ if ($from[$i][0] == ord '-') {
+ unshift @from, splice(@from, $i, 1);
+ unshift @to, splice(@to, $i, 1);
+ last;
+ } elsif ($from[$i][1] == ord '-') {
+ $from[$i][1]--;
+ $to[$i][1]--;
+ unshift @from, ord '-';
+ unshift @to, ord '-';
+ last;
+ }
+ }
+ for my $i (0 .. $#delfrom) {
+ if ($delfrom[$i][0] == ord '-') {
+ push @delfrom, splice(@delfrom, $i, 1);
+ last;
+ } elsif ($delfrom[$i][1] == ord '-') {
+ $delfrom[$i][1]--;
+ push @delfrom, ord '-';
+ last;
+ }
+ }
+ if (defined $final and $to[$#to][1] != $final) {
+ push @to, [$final, $final];
+ }
+ push @from, @delfrom;
+ if ($flags & OPpTRANS_COMPLEMENT) {
+ my @newfrom;
+ my $next = 0;
+ for my $i (0 .. $#from) {
+ push @newfrom, [$next, $from[$i][0] - 1];
+ $next = $from[$i][1] + 1;
+ }
+ @from = ();
+ for my $range (@newfrom) {
+ if ($range->[0] <= $range->[1]) {
+ push @from, $range;
+ }
+ }
+ }
+ my($from, $to, $diff);
+ for my $chunk (@from) {
+ $diff = $chunk->[1] - $chunk->[0];
+ if ($diff > 1) {
+ $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
+ } elsif ($diff == 1) {
+ $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
+ } else {
+ $from .= tr_chr($chunk->[0]);
+ }
+ }
+ for my $chunk (@to) {
+ $diff = $chunk->[1] - $chunk->[0];
+ if ($diff > 1) {
+ $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
+ } elsif ($diff == 1) {
+ $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
+ } else {
+ $to .= tr_chr($chunk->[0]);
+ }
+ }
+ #$final = sprintf("%04x", $final) if defined $final;
+ #$none = sprintf("%04x", $none) if defined $none;
+ #$extra = sprintf("%04x", $extra) if defined $extra;
+ #print STDERR "final: $final\n none: $none\nextra: $extra\n";
+ #print STDERR $swash{'LIST'}->PV;
+ return (escape_str($from), escape_str($to));
+}
+
+sub pp_trans {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my($from, $to);
+ if (class($op) eq "PVOP") {
+ ($from, $to) = tr_decode_byte($op->pv, $op->private);
+ } else { # class($op) eq "SVOP"
+ ($from, $to) = tr_decode_utf8($op->sv->RV, $op->private);
+ }
+ my $flags = "";
+ $flags .= "c" if $op->private & OPpTRANS_COMPLEMENT;
+ $flags .= "d" if $op->private & OPpTRANS_DELETE;
+ $to = "" if $from eq $to and $flags eq "";
+ $flags .= "s" if $op->private & OPpTRANS_SQUASH;
+ return "tr" . double_delim($from, $to) . $flags;
+}
+
+sub re_dq_disambiguate {
+ my ($first, $last) = @_;
+ # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
+ ($last =~ /^[A-Z\\\^\[\]_?]/ &&
+ $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
+ || ($last =~ /^[{\[\w_]/ &&
+ $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
+ return $first . $last;
+}
+
+# Like dq(), but different
+sub re_dq {
+ my $self = shift;
+ my ($op, $extended) = @_;
+
+ my $type = $op->name;
+ if ($type eq "const") {
+ return '$[' if $op->private & OPpCONST_ARYBASE;
+ my $unbacked = re_unback($self->const_sv($op)->as_string);
+ return re_uninterp_extended(escape_extended_re($unbacked))
+ if $extended;
+ return re_uninterp(escape_str($unbacked));
+ } elsif ($type eq "concat") {
+ my $first = $self->re_dq($op->first, $extended);
+ my $last = $self->re_dq($op->last, $extended);
+ return re_dq_disambiguate($first, $last);
+ } elsif ($type eq "uc") {
+ return '\U' . $self->re_dq($op->first->sibling, $extended) . '\E';
+ } elsif ($type eq "lc") {
+ return '\L' . $self->re_dq($op->first->sibling, $extended) . '\E';
+ } elsif ($type eq "ucfirst") {
+ return '\u' . $self->re_dq($op->first->sibling, $extended);
+ } elsif ($type eq "lcfirst") {
+ return '\l' . $self->re_dq($op->first->sibling, $extended);
+ } elsif ($type eq "quotemeta") {
+ return '\Q' . $self->re_dq($op->first->sibling, $extended) . '\E';
+ } elsif ($type eq "join") {
+ return $self->deparse($op->last, 26); # was join($", @ary)
+ } else {
+ return $self->deparse($op, 26);
+ }
+}
+
+sub pure_string {
+ my ($self, $op) = @_;
+ return 0 if null $op;
+ my $type = $op->name;
+
+ if ($type eq 'const') {
+ return 1;
+ }
+ elsif ($type =~ /^[ul]c(first)?$/ || $type eq 'quotemeta') {
+ return $self->pure_string($op->first->sibling);
+ }
+ elsif ($type eq 'join') {
+ my $join_op = $op->first->sibling; # Skip pushmark
+ return 0 unless $join_op->name eq 'null' && $join_op->targ eq OP_RV2SV;
+
+ my $gvop = $join_op->first;
+ return 0 unless $gvop->name eq 'gvsv';
+ return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop));
+
+ return 0 unless ${$join_op->sibling} eq ${$op->last};
+ return 0 unless $op->last->name =~ /^(?:[ah]slice|(?:rv2|pad)av)$/;
+ }
+ elsif ($type eq 'concat') {
+ return $self->pure_string($op->first)
+ && $self->pure_string($op->last);
+ }
+ elsif (is_scalar($op) || $type =~ /^[ah]elem$/) {
+ return 1;
+ }
+ elsif ($type eq "null" and $op->can('first') and not null $op->first and
+ $op->first->name eq "null" and $op->first->can('first')
+ and not null $op->first->first and
+ $op->first->first->name eq "aelemfast") {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+
+ return 1;
+}
+
+sub regcomp {
+ my $self = shift;
+ my($op, $cx, $extended) = @_;
+ my $kid = $op->first;
+ $kid = $kid->first if $kid->name eq "regcmaybe";
+ $kid = $kid->first if $kid->name eq "regcreset";
+ if ($kid->name eq "null" and !null($kid->first)
+ and $kid->first->name eq 'pushmark')
+ {
+ my $str = '';
+ $kid = $kid->first->sibling;
+ while (!null($kid)) {
+ my $first = $str;
+ my $last = $self->re_dq($kid, $extended);
+ $str = re_dq_disambiguate($first, $last);
+ $kid = $kid->sibling;
+ }
+ return $str, 1;
+ }
+
+ return ($self->re_dq($kid, $extended), 1) if $self->pure_string($kid);
+ return ($self->deparse($kid, $cx), 0);
+}
+
+sub pp_regcomp {
+ my ($self, $op, $cx) = @_;
+ return (($self->regcomp($op, $cx, 0))[0]);
+}
+
+# osmic acid -- see osmium tetroxide
+
+my %matchwords;
+map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs',
+ 'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic',
+ 'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi');
+
+sub matchop {
+ my $self = shift;
+ my($op, $cx, $name, $delim) = @_;
+ my $kid = $op->first;
+ my ($binop, $var, $re) = ("", "", "");
+ if ($op->flags & OPf_STACKED) {
+ $binop = 1;
+ $var = $self->deparse($kid, 20);
+ $kid = $kid->sibling;
+ }
+ my $quote = 1;
+ my $extended = ($op->pmflags & PMf_EXTENDED);
+ if (null $kid) {
+ my $unbacked = re_unback($op->precomp);
+ if ($extended) {
+ $re = re_uninterp_extended(escape_extended_re($unbacked));
+ } else {
+ $re = re_uninterp(escape_str(re_unback($op->precomp)));
+ }
+ } elsif ($kid->name ne 'regcomp') {
+ carp("found ".$kid->name." where regcomp expected");
+ } else {
+ ($re, $quote) = $self->regcomp($kid, 21, $extended);
+ }
+ my $flags = "";
+ $flags .= "c" if $op->pmflags & PMf_CONTINUE;
+ $flags .= "g" if $op->pmflags & PMf_GLOBAL;
+ $flags .= "i" if $op->pmflags & PMf_FOLD;
+ $flags .= "m" if $op->pmflags & PMf_MULTILINE;
+ $flags .= "o" if $op->pmflags & PMf_KEEP;
+ $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
+ $flags .= "x" if $op->pmflags & PMf_EXTENDED;
+ $flags = $matchwords{$flags} if $matchwords{$flags};
+ if ($op->pmflags & PMf_ONCE) { # only one kind of delimiter works here
+ $re =~ s/\?/\\?/g;
+ $re = "?$re?";
+ } elsif ($quote) {
+ $re = single_delim($name, $delim, $re);
+ }
+ $re = $re . $flags if $quote;
+ if ($binop) {
+ return $self->maybe_parens("$var =~ $re", $cx, 20);
+ } else {
+ return $re;
+ }
+}
+
+sub pp_match { matchop(@_, "m", "/") }
+sub pp_pushre { matchop(@_, "m", "/") }
+sub pp_qr { matchop(@_, "qr", "") }
+
+sub pp_split {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my($kid, @exprs, $ary, $expr);
+ $kid = $op->first;
+
+ # For our kid (an OP_PUSHRE), pmreplroot is never actually the
+ # root of a replacement; it's either empty, or abused to point to
+ # the GV for an array we split into (an optimization to save
+ # assignment overhead). Depending on whether we're using ithreads,
+ # this OP* holds either a GV* or a PADOFFSET. Luckily, B.xs
+ # figures out for us which it is.
+ my $replroot = $kid->pmreplroot;
+ my $gv = 0;
+ if (ref($replroot) eq "B::GV") {
+ $gv = $replroot;
+ } elsif (!ref($replroot) and $replroot > 0) {
+ $gv = $self->padval($replroot);
+ }
+ $ary = $self->stash_variable('@', $self->gv_name($gv)) if $gv;
+
+ for (; !null($kid); $kid = $kid->sibling) {
+ push @exprs, $self->deparse($kid, 6);
+ }
+
+ # handle special case of split(), and split(' ') that compiles to /\s+/
+ $kid = $op->first;
+ if ( $kid->flags & OPf_SPECIAL
+ and ( $] < 5.009 ? $kid->pmflags & PMf_SKIPWHITE()
+ : $kid->reflags & RXf_SKIPWHITE() ) ) {
+ $exprs[0] = "' '";
+ }
+
+ $expr = "split(" . join(", ", @exprs) . ")";
+ if ($ary) {
+ return $self->maybe_parens("$ary = $expr", $cx, 7);
+ } else {
+ return $expr;
+ }
+}
+
+# oxime -- any of various compounds obtained chiefly by the action of
+# hydroxylamine on aldehydes and ketones and characterized by the
+# bivalent grouping C=NOH [Webster's Tenth]
+
+my %substwords;
+map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em',
+ 'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me',
+ 'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem',
+ 'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi');
+
+sub pp_subst {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $kid = $op->first;
+ my($binop, $var, $re, $repl) = ("", "", "", "");
+ if ($op->flags & OPf_STACKED) {
+ $binop = 1;
+ $var = $self->deparse($kid, 20);
+ $kid = $kid->sibling;
+ }
+ my $flags = "";
+ if (null($op->pmreplroot)) {
+ $repl = $self->dq($kid);
+ $kid = $kid->sibling;
+ } else {
+ $repl = $op->pmreplroot->first; # skip substcont
+ while ($repl->name eq "entereval") {
+ $repl = $repl->first;
+ $flags .= "e";
+ }
+ if ($op->pmflags & PMf_EVAL) {
+ $repl = $self->deparse($repl->first, 0);
+ } else {
+ $repl = $self->dq($repl);
+ }
+ }
+ my $extended = ($op->pmflags & PMf_EXTENDED);
+ if (null $kid) {
+ my $unbacked = re_unback($op->precomp);
+ if ($extended) {
+ $re = re_uninterp_extended(escape_extended_re($unbacked));
+ }
+ else {
+ $re = re_uninterp(escape_str($unbacked));
+ }
+ } else {
+ ($re) = $self->regcomp($kid, 1, $extended);
+ }
+ $flags .= "e" if $op->pmflags & PMf_EVAL;
+ $flags .= "g" if $op->pmflags & PMf_GLOBAL;
+ $flags .= "i" if $op->pmflags & PMf_FOLD;
+ $flags .= "m" if $op->pmflags & PMf_MULTILINE;
+ $flags .= "o" if $op->pmflags & PMf_KEEP;
+ $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
+ $flags .= "x" if $extended;
+ $flags = $substwords{$flags} if $substwords{$flags};
+ if ($binop) {
+ return $self->maybe_parens("$var =~ s"
+ . double_delim($re, $repl) . $flags,
+ $cx, 20);
+ } else {
+ return "s". double_delim($re, $repl) . $flags;
+ }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+B::Deparse - Perl compiler backend to produce perl code
+
+=head1 SYNOPSIS
+
+B<perl> B<-MO=Deparse>[B<,-d>][B<,-f>I<FILE>][B<,-p>][B<,-q>][B<,-l>]
+ [B<,-s>I<LETTERS>][B<,-x>I<LEVEL>] I<prog.pl>
+
+=head1 DESCRIPTION
+
+B::Deparse is a backend module for the Perl compiler that generates
+perl source code, based on the internal compiled structure that perl
+itself creates after parsing a program. The output of B::Deparse won't
+be exactly the same as the original source, since perl doesn't keep
+track of comments or whitespace, and there isn't a one-to-one
+correspondence between perl's syntactical constructions and their
+compiled form, but it will often be close. When you use the B<-p>
+option, the output also includes parentheses even when they are not
+required by precedence, which can make it easy to see if perl is
+parsing your expressions the way you intended.
+
+While B::Deparse goes to some lengths to try to figure out what your
+original program was doing, some parts of the language can still trip
+it up; it still fails even on some parts of Perl's own test suite. If
+you encounter a failure other than the most common ones described in
+the BUGS section below, you can help contribute to B::Deparse's
+ongoing development by submitting a bug report with a small
+example.
+
+=head1 OPTIONS
+
+As with all compiler backend options, these must follow directly after
+the '-MO=Deparse', separated by a comma but not any white space.
+
+=over 4
+
+=item B<-d>
+
+Output data values (when they appear as constants) using Data::Dumper.
+Without this option, B::Deparse will use some simple routines of its
+own for the same purpose. Currently, Data::Dumper is better for some
+kinds of data (such as complex structures with sharing and
+self-reference) while the built-in routines are better for others
+(such as odd floating-point values).
+
+=item B<-f>I<FILE>
+
+Normally, B::Deparse deparses the main code of a program, and all the subs
+defined in the same file. To include subs defined in other files, pass the
+B<-f> option with the filename. You can pass the B<-f> option several times, to
+include more than one secondary file. (Most of the time you don't want to
+use it at all.) You can also use this option to include subs which are
+defined in the scope of a B<#line> directive with two parameters.
+
+=item B<-l>
+
+Add '#line' declarations to the output based on the line and file
+locations of the original code.
+
+=item B<-p>
+
+Print extra parentheses. Without this option, B::Deparse includes
+parentheses in its output only when they are needed, based on the
+structure of your program. With B<-p>, it uses parentheses (almost)
+whenever they would be legal. This can be useful if you are used to
+LISP, or if you want to see how perl parses your input. If you say
+
+ if ($var & 0x7f == 65) {print "Gimme an A!"}
+ print ($which ? $a : $b), "\n";
+ $name = $ENV{USER} or "Bob";
+
+C<B::Deparse,-p> will print
+
+ if (($var & 0)) {
+ print('Gimme an A!')
+ };
+ (print(($which ? $a : $b)), '???');
+ (($name = $ENV{'USER'}) or '???')
+
+which probably isn't what you intended (the C<'???'> is a sign that
+perl optimized away a constant value).
+
+=item B<-P>
+
+Disable prototype checking. With this option, all function calls are
+deparsed as if no prototype was defined for them. In other words,
+
+ perl -MO=Deparse,-P -e 'sub foo (\@) { 1 } foo @x'
+
+will print
+
+ sub foo (\@) {
+ 1;
+ }
+ &foo(\@x);
+
+making clear how the parameters are actually passed to C<foo>.
+
+=item B<-q>
+
+Expand double-quoted strings into the corresponding combinations of
+concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For
+instance, print
+
+ print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!";
+
+as
+
+ print 'Hello, ' . $world . ', ' . join($", @ladies) . ', '
+ . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!');
+
+Note that the expanded form represents the way perl handles such
+constructions internally -- this option actually turns off the reverse
+translation that B::Deparse usually does. On the other hand, note that
+C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value
+of $y into a string before doing the assignment.
+
+=item B<-s>I<LETTERS>
+
+Tweak the style of B::Deparse's output. The letters should follow
+directly after the 's', with no space or punctuation. The following
+options are available:
+
+=over 4
+
+=item B<C>
+
+Cuddle C<elsif>, C<else>, and C<continue> blocks. For example, print
+
+ if (...) {
+ ...
+ } else {
+ ...
+ }
+
+instead of
+
+ if (...) {
+ ...
+ }
+ else {
+ ...
+ }
+
+The default is not to cuddle.
+
+=item B<i>I<NUMBER>
+
+Indent lines by multiples of I<NUMBER> columns. The default is 4 columns.
+
+=item B<T>
+
+Use tabs for each 8 columns of indent. The default is to use only spaces.
+For instance, if the style options are B<-si4T>, a line that's indented
+3 times will be preceded by one tab and four spaces; if the options were
+B<-si8T>, the same line would be preceded by three tabs.
+
+=item B<v>I<STRING>B<.>
+
+Print I<STRING> for the value of a constant that can't be determined
+because it was optimized away (mnemonic: this happens when a constant
+is used in B<v>oid context). The end of the string is marked by a period.
+The string should be a valid perl expression, generally a constant.
+Note that unless it's a number, it probably needs to be quoted, and on
+a command line quotes need to be protected from the shell. Some
+conventional values include 0, 1, 42, '', 'foo', and
+'Useless use of constant omitted' (which may need to be
+B<-sv"'Useless use of constant omitted'.">
+or something similar depending on your shell). The default is '???'.
+If you're using B::Deparse on a module or other file that's require'd,
+you shouldn't use a value that evaluates to false, since the customary
+true constant at the end of a module will be in void context when the
+file is compiled as a main program.
+
+=back
+
+=item B<-x>I<LEVEL>
+
+Expand conventional syntax constructions into equivalent ones that expose
+their internal operation. I<LEVEL> should be a digit, with higher values
+meaning more expansion. As with B<-q>, this actually involves turning off
+special cases in B::Deparse's normal operations.
+
+If I<LEVEL> is at least 3, C<for> loops will be translated into equivalent
+while loops with continue blocks; for instance
+
+ for ($i = 0; $i < 10; ++$i) {
+ print $i;
+ }
+
+turns into
+
+ $i = 0;
+ while ($i < 10) {
+ print $i;
+ } continue {
+ ++$i
+ }
+
+Note that in a few cases this translation can't be perfectly carried back
+into the source code -- if the loop's initializer declares a my variable,
+for instance, it won't have the correct scope outside of the loop.
+
+If I<LEVEL> is at least 5, C<use> declarations will be translated into
+C<BEGIN> blocks containing calls to C<require> and C<import>; for
+instance,
+
+ use strict 'refs';
+
+turns into
+
+ sub BEGIN {
+ require strict;
+ do {
+ 'strict'->import('refs')
+ };
+ }
+
+If I<LEVEL> is at least 7, C<if> statements will be translated into
+equivalent expressions using C<&&>, C<?:> and C<do {}>; for instance
+
+ print 'hi' if $nice;
+ if ($nice) {
+ print 'hi';
+ }
+ if ($nice) {
+ print 'hi';
+ } else {
+ print 'bye';
+ }
+
+turns into
+
+ $nice and print 'hi';
+ $nice and do { print 'hi' };
+ $nice ? do { print 'hi' } : do { print 'bye' };
+
+Long sequences of elsifs will turn into nested ternary operators, which
+B::Deparse doesn't know how to indent nicely.
+
+=back
+
+=head1 USING B::Deparse AS A MODULE
+
+=head2 Synopsis
+
+ use B::Deparse;
+ $deparse = B::Deparse->new("-p", "-sC");
+ $body = $deparse->coderef2text(\&func);
+ eval "sub func $body"; # the inverse operation
+
+=head2 Description
+
+B::Deparse can also be used on a sub-by-sub basis from other perl
+programs.
+
+=head2 new
+
+ $deparse = B::Deparse->new(OPTIONS)
+
+Create an object to store the state of a deparsing operation and any
+options. The options are the same as those that can be given on the
+command line (see L</OPTIONS>); options that are separated by commas
+after B<-MO=Deparse> should be given as separate strings.
+
+=head2 ambient_pragmas
+
+ $deparse->ambient_pragmas(strict => 'all', '$[' => $[);
+
+The compilation of a subroutine can be affected by a few compiler
+directives, B<pragmas>. These are:
+
+=over 4
+
+=item *
+
+use strict;
+
+=item *
+
+use warnings;
+
+=item *
+
+Assigning to the special variable $[
+
+=item *
+
+use integer;
+
+=item *
+
+use bytes;
+
+=item *
+
+use utf8;
+
+=item *
+
+use re;
+
+=back
+
+Ordinarily, if you use B::Deparse on a subroutine which has
+been compiled in the presence of one or more of these pragmas,
+the output will include statements to turn on the appropriate
+directives. So if you then compile the code returned by coderef2text,
+it will behave the same way as the subroutine which you deparsed.
+
+However, you may know that you intend to use the results in a
+particular context, where some pragmas are already in scope. In
+this case, you use the B<ambient_pragmas> method to describe the
+assumptions you wish to make.
+
+Not all of the options currently have any useful effect. See
+L</BUGS> for more details.
+
+The parameters it accepts are:
+
+=over 4
+
+=item strict
+
+Takes a string, possibly containing several values separated
+by whitespace. The special values "all" and "none" mean what you'd
+expect.
+
+ $deparse->ambient_pragmas(strict => 'subs refs');
+
+=item $[
+
+Takes a number, the value of the array base $[.
+
+=item bytes
+
+=item utf8
+
+=item integer
+
+If the value is true, then the appropriate pragma is assumed to
+be in the ambient scope, otherwise not.
+
+=item re
+
+Takes a string, possibly containing a whitespace-separated list of
+values. The values "all" and "none" are special. It's also permissible
+to pass an array reference here.
+
+ $deparser->ambient_pragmas(re => 'eval');
+
+
+=item warnings
+
+Takes a string, possibly containing a whitespace-separated list of
+values. The values "all" and "none" are special, again. It's also
+permissible to pass an array reference here.
+
+ $deparser->ambient_pragmas(warnings => [qw[void io]]);
+
+If one of the values is the string "FATAL", then all the warnings
+in that list will be considered fatal, just as with the B<warnings>
+pragma itself. Should you need to specify that some warnings are
+fatal, and others are merely enabled, you can pass the B<warnings>
+parameter twice:
+
+ $deparser->ambient_pragmas(
+ warnings => 'all',
+ warnings => [FATAL => qw/void io/],
+ );
+
+See L<perllexwarn> for more information about lexical warnings.
+
+=item hint_bits
+
+=item warning_bits
+
+These two parameters are used to specify the ambient pragmas in
+the format used by the special variables $^H and ${^WARNING_BITS}.
+
+They exist principally so that you can write code like:
+
+ { my ($hint_bits, $warning_bits);
+ BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})}
+ $deparser->ambient_pragmas (
+ hint_bits => $hint_bits,
+ warning_bits => $warning_bits,
+ '$[' => 0 + $[
+ ); }
+
+which specifies that the ambient pragmas are exactly those which
+are in scope at the point of calling.
+
+=item %^H
+
+This parameter is used to specify the ambient pragmas which are
+stored in the special hash %^H.
+
+=back
+
+=head2 coderef2text
+
+ $body = $deparse->coderef2text(\&func)
+ $body = $deparse->coderef2text(sub ($$) { ... })
+
+Return source code for the body of a subroutine (a block, optionally
+preceded by a prototype in parens), given a reference to the
+sub. Because a subroutine can have no names, or more than one name,
+this method doesn't return a complete subroutine definition -- if you
+want to eval the result, you should prepend "sub subname ", or "sub "
+for an anonymous function constructor. Unless the sub was defined in
+the main:: package, the code will include a package declaration.
+
+=head1 BUGS
+
+=over 4
+
+=item *
+
+The only pragmas to be completely supported are: C<use warnings>,
+C<use strict 'refs'>, C<use bytes>, and C<use integer>. (C<$[>, which
+behaves like a pragma, is also supported.)
+
+Excepting those listed above, we're currently unable to guarantee that
+B::Deparse will produce a pragma at the correct point in the program.
+(Specifically, pragmas at the beginning of a block often appear right
+before the start of the block instead.)
+Since the effects of pragmas are often lexically scoped, this can mean
+that the pragma holds sway over a different portion of the program
+than in the input file.
+
+=item *
+
+In fact, the above is a specific instance of a more general problem:
+we can't guarantee to produce BEGIN blocks or C<use> declarations in
+exactly the right place. So if you use a module which affects compilation
+(such as by over-riding keywords, overloading constants or whatever)
+then the output code might not work as intended.
+
+This is the most serious outstanding problem, and will require some help
+from the Perl core to fix.
+
+=item *
+
+If a keyword is over-ridden, and your program explicitly calls
+the built-in version by using CORE::keyword, the output of B::Deparse
+will not reflect this. If you run the resulting code, it will call
+the over-ridden version rather than the built-in one. (Maybe there
+should be an option to B<always> print keyword calls as C<CORE::name>.)
+
+=item *
+
+Some constants don't print correctly either with or without B<-d>.
+For instance, neither B::Deparse nor Data::Dumper know how to print
+dual-valued scalars correctly, as in:
+
+ use constant E2BIG => ($!=7); $y = E2BIG; print $y, 0+$y;
+
+ use constant H => { "#" => 1 }; H->{"#"};
+
+=item *
+
+An input file that uses source filtering probably won't be deparsed into
+runnable code, because it will still include the B<use> declaration
+for the source filtering module, even though the code that is
+produced is already ordinary Perl which shouldn't be filtered again.
+
+=item *
+
+Optimised away statements are rendered as '???'. This includes statements that
+have a compile-time side-effect, such as the obscure
+
+ my $x if 0;
+
+which is not, consequently, deparsed correctly.
+
+ foreach my $i (@_) { 0 }
+ =>
+ foreach my $i (@_) { '???' }
+
+=item *
+
+Lexical (my) variables declared in scopes external to a subroutine
+appear in code2ref output text as package variables. This is a tricky
+problem, as perl has no native facility for refering to a lexical variable
+defined within a different scope, although L<PadWalker> is a good start.
+
+=item *
+
+There are probably many more bugs on non-ASCII platforms (EBCDIC).
+
+=back
+
+=head1 AUTHOR
+
+Stephen McCamant <smcc@CSUA.Berkeley.EDU>, based on an earlier version
+by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with contributions from
+Gisle Aas, James Duncan, Albert Dvornik, Robin Houston, Dave Mitchell,
+Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons, and Rafael
+Garcia-Suarez.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/B/Lint.pm b/Master/tlpkg/tlperl.straw/lib/B/Lint.pm
new file mode 100755
index 00000000000..76bc9fd0236
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/B/Lint.pm
@@ -0,0 +1,792 @@
+package B::Lint;
+
+our $VERSION = '1.11'; ## no critic
+
+=head1 NAME
+
+B::Lint - Perl lint
+
+=head1 SYNOPSIS
+
+perl -MO=Lint[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+The B::Lint module is equivalent to an extended version of the B<-w>
+option of B<perl>. It is named after the program F<lint> which carries
+out a similar process for C programs.
+
+=head1 OPTIONS AND LINT CHECKS
+
+Option words are separated by commas (not whitespace) and follow the
+usual conventions of compiler backend options. Following any options
+(indicated by a leading B<->) come lint check arguments. Each such
+argument (apart from the special B<all> and B<none> options) is a
+word representing one possible lint check (turning on that check) or
+is B<no-foo> (turning off that check). Before processing the check
+arguments, a standard list of checks is turned on. Later options
+override earlier ones. Available options are:
+
+=over 8
+
+=item B<magic-diamond>
+
+Produces a warning whenever the magic C<E<lt>E<gt>> readline is
+used. Internally it uses perl's two-argument open which itself treats
+filenames with special characters specially. This could allow
+interestingly named files to have unexpected effects when reading.
+
+ % touch 'rm *|'
+ % perl -pe 1
+
+The above creates a file named C<rm *|>. When perl opens it with
+C<E<lt>E<gt>> it actually executes the shell program C<rm *>. This
+makes C<E<lt>E<gt>> dangerous to use carelessly.
+
+=item B<context>
+
+Produces a warning whenever an array is used in an implicit scalar
+context. For example, both of the lines
+
+ $foo = length(@bar);
+ $foo = @bar;
+
+will elicit a warning. Using an explicit B<scalar()> silences the
+warning. For example,
+
+ $foo = scalar(@bar);
+
+=item B<implicit-read> and B<implicit-write>
+
+These options produce a warning whenever an operation implicitly
+reads or (respectively) writes to one of Perl's special variables.
+For example, B<implicit-read> will warn about these:
+
+ /foo/;
+
+and B<implicit-write> will warn about these:
+
+ s/foo/bar/;
+
+Both B<implicit-read> and B<implicit-write> warn about this:
+
+ for (@a) { ... }
+
+=item B<bare-subs>
+
+This option warns whenever a bareword is implicitly quoted, but is also
+the name of a subroutine in the current package. Typical mistakes that it will
+trap are:
+
+ use constant foo => 'bar';
+ @a = ( foo => 1 );
+ $b{foo} = 2;
+
+Neither of these will do what a naive user would expect.
+
+=item B<dollar-underscore>
+
+This option warns whenever C<$_> is used either explicitly anywhere or
+as the implicit argument of a B<print> statement.
+
+=item B<private-names>
+
+This option warns on each use of any variable, subroutine or
+method name that lives in a non-current package but begins with
+an underscore ("_"). Warnings aren't issued for the special case
+of the single character name "_" by itself (e.g. C<$_> and C<@_>).
+
+=item B<undefined-subs>
+
+This option warns whenever an undefined subroutine is invoked.
+This option will only catch explicitly invoked subroutines such
+as C<foo()> and not indirect invocations such as C<&$subref()>
+or C<$obj-E<gt>meth()>. Note that some programs or modules delay
+definition of subs until runtime by means of the AUTOLOAD
+mechanism.
+
+=item B<regexp-variables>
+
+This option warns whenever one of the regexp variables C<$`>, C<$&> or C<$'>
+is used. Any occurrence of any of these variables in your
+program can slow your whole program down. See L<perlre> for
+details.
+
+=item B<all>
+
+Turn all warnings on.
+
+=item B<none>
+
+Turn all warnings off.
+
+=back
+
+=head1 NON LINT-CHECK OPTIONS
+
+=over 8
+
+=item B<-u Package>
+
+Normally, Lint only checks the main code of the program together
+with all subs defined in package main. The B<-u> option lets you
+include other package names whose subs are then checked by Lint.
+
+=back
+
+=head1 EXTENDING LINT
+
+Lint can be extended by with plugins. Lint uses L<Module::Pluggable>
+to find available plugins. Plugins are expected but not required to
+inform Lint of which checks they are adding.
+
+The C<< B::Lint->register_plugin( MyPlugin => \@new_checks ) >> method
+adds the list of C<@new_checks> to the list of valid checks. If your
+module wasn't loaded by L<Module::Pluggable> then your class name is
+added to the list of plugins.
+
+You must create a C<match( \%checks )> method in your plugin class or one
+of its parents. It will be called on every op as a regular method call
+with a hash ref of checks as its parameter.
+
+The class methods C<< B::Lint->file >> and C<< B::Lint->line >> contain
+the current filename and line number.
+
+ package Sample;
+ use B::Lint;
+ B::Lint->register_plugin( Sample => [ 'good_taste' ] );
+
+ sub match {
+ my ( $op, $checks_href ) = shift @_;
+ if ( $checks_href->{good_taste} ) {
+ ...
+ }
+ }
+
+=head1 TODO
+
+=over
+
+=item while(<FH>) stomps $_
+
+=item strict oo
+
+=item unchecked system calls
+
+=item more tests, validate against older perls
+
+=back
+
+=head1 BUGS
+
+This is only a very preliminary version.
+
+=head1 AUTHOR
+
+Malcolm Beattie, mbeattie@sable.ox.ac.uk.
+
+=head1 ACKNOWLEDGEMENTS
+
+Sebastien Aperghis-Tramoni - bug fixes
+
+=cut
+
+use strict;
+use B qw( walkoptree_slow
+ main_root main_cv walksymtable parents
+ OPpOUR_INTRO
+ OPf_WANT_VOID OPf_WANT_LIST OPf_WANT OPf_STACKED SVf_POK );
+use Carp 'carp';
+
+# The current M::P doesn't know about .pmc files.
+use Module::Pluggable ( require => 1 );
+
+use List::Util 'first';
+## no critic Prototypes
+sub any (&@) { my $test = shift @_; $test->() and return 1 for @_; return 0 }
+
+BEGIN {
+
+ # Import or create some constants from B. B doesn't provide
+ # everything I need so some things like OPpCONST_BARE are defined
+ # here.
+ for my $sym ( qw( begin_av check_av init_av end_av ),
+ [ 'OPpCONST_BARE' => 64 ] )
+ {
+ my $val;
+ ( $sym, $val ) = @$sym if ref $sym;
+
+ if ( any { $sym eq $_ } @B::EXPORT_OK, @B::EXPORT ) {
+ B->import($sym);
+ }
+ else {
+ require constant;
+ constant->import( $sym => $val );
+ }
+ }
+}
+
+my $file = "unknown"; # shadows current filename
+my $line = 0; # shadows current line number
+my $curstash = "main"; # shadows current stash
+my $curcv; # shadows current B::CV for pad lookups
+
+sub file {$file}
+sub line {$line}
+sub curstash {$curstash}
+sub curcv {$curcv}
+
+# Lint checks
+my %check;
+my %implies_ok_context;
+
+map( $implies_ok_context{$_}++,
+ qw(scalar av2arylen aelem aslice helem hslice
+ keys values hslice defined undef delete) );
+
+# Lint checks turned on by default
+my @default_checks
+ = qw(context magic_diamond undefined_subs regexp_variables);
+
+my %valid_check;
+
+# All valid checks
+for my $check (
+ qw(context implicit_read implicit_write dollar_underscore
+ private_names bare_subs undefined_subs regexp_variables
+ magic_diamond )
+ )
+{
+ $valid_check{$check} = __PACKAGE__;
+}
+
+# Debugging options
+my ($debug_op);
+
+my %done_cv; # used to mark which subs have already been linted
+my @extra_packages; # Lint checks mainline code and all subs which are
+ # in main:: or in one of these packages.
+
+sub warning {
+ my $format = ( @_ < 2 ) ? "%s" : shift @_;
+ warn sprintf( "$format at %s line %d\n", @_, $file, $line );
+ return undef; ## no critic undef
+}
+
+# This gimme can't cope with context that's only determined
+# at runtime via dowantarray().
+sub gimme {
+ my $op = shift @_;
+ my $flags = $op->flags;
+ if ( $flags & OPf_WANT ) {
+ return ( ( $flags & OPf_WANT ) == OPf_WANT_LIST ? 1 : 0 );
+ }
+ return undef; ## no critic undef
+}
+
+my @plugins = __PACKAGE__->plugins;
+
+sub inside_grepmap {
+
+ # A boolean function to be used while inside a B::walkoptree_slow
+ # call. If we are in the EXPR part of C<grep EXPR, ...> or C<grep
+ # { EXPR } ...>, this returns true.
+ return any { $_->name =~ m/\A(?:grep|map)/xms } @{ parents() };
+}
+
+sub inside_foreach_modifier {
+
+ # TODO: use any()
+
+ # A boolean function to be used while inside a B::walkoptree_slow
+ # call. If we are in the EXPR part of C<EXPR foreach ...> this
+ # returns true.
+ for my $ancestor ( @{ parents() } ) {
+ next unless $ancestor->name eq 'leaveloop';
+
+ my $first = $ancestor->first;
+ next unless $first->name eq 'enteriter';
+
+ next if $first->redoop->name =~ m/\A(?:next|db|set)state\z/xms;
+
+ return 1;
+ }
+ return 0;
+}
+
+for (
+ [qw[ B::PADOP::gv_harder gv padix]],
+ [qw[ B::SVOP::sv_harder sv targ]],
+ [qw[ B::SVOP::gv_harder gv padix]]
+ )
+{
+
+ # I'm generating some functions here because they're mostly
+ # similar. It's all for compatibility with threaded
+ # perl. Perhaps... this code should inspect $Config{usethreads}
+ # and generate a *specific* function. I'm leaving it generic for
+ # the moment.
+ #
+ # In threaded perl SVs and GVs aren't used directly in the optrees
+ # like they are in non-threaded perls. The ops that would use a SV
+ # or GV keep an index into the subroutine's scratchpad. I'm
+ # currently ignoring $cv->DEPTH and that might be at my peril.
+
+ my ( $subname, $attr, $pad_attr ) = @$_;
+ my $target = do { ## no critic strict
+ no strict 'refs';
+ \*$subname;
+ };
+ *$target = sub {
+ my ($op) = @_;
+
+ my $elt;
+ if ( not $op->isa('B::PADOP') ) {
+ $elt = $op->$attr;
+ }
+ return $elt if eval { $elt->isa('B::SV') };
+
+ my $ix = $op->$pad_attr;
+ my @entire_pad = $curcv->PADLIST->ARRAY;
+ my @elts = map +( $_->ARRAY )[$ix], @entire_pad;
+ ($elt) = first {
+ eval { $_->isa('B::SV') } ? $_ : ();
+ }
+ @elts[ 0, reverse 1 .. $#elts ];
+ return $elt;
+ };
+}
+
+sub B::OP::lint {
+ my ($op) = @_;
+
+ # This is a fallback ->lint for all the ops where I haven't
+ # defined something more specific. Nothing happens here.
+
+ # Call all registered plugins
+ my $m;
+ $m = $_->can('match'), $op->$m( \%check ) for @plugins;
+ return;
+}
+
+sub B::COP::lint {
+ my ($op) = @_;
+
+ # nextstate ops sit between statements. Whenever I see one I
+ # update the current info on file, line, and stash. This code also
+ # updates it when it sees a dbstate or setstate op. I have no idea
+ # what those are but having seen them mentioned together in other
+ # parts of the perl I think they're kind of equivalent.
+ if ( $op->name =~ m/\A(?:next|db|set)state\z/ ) {
+ $file = $op->file;
+ $line = $op->line;
+ $curstash = $op->stash->NAME;
+ }
+
+ # Call all registered plugins
+ my $m;
+ $m = $_->can('match'), $op->$m( \%check ) for @plugins;
+ return;
+}
+
+sub B::UNOP::lint {
+ my ($op) = @_;
+
+ my $opname = $op->name;
+
+CONTEXT: {
+
+ # Check arrays and hashes in scalar or void context where
+ # scalar() hasn't been used.
+
+ next
+ unless $check{context}
+ and $opname =~ m/\Arv2[ah]v\z/xms
+ and not gimme($op);
+
+ my ( $parent, $gparent ) = @{ parents() }[ 0, 1 ];
+ my $pname = $parent->name;
+
+ next if $implies_ok_context{$pname};
+
+ # Three special cases to deal with: "foreach (@foo)", "delete
+ # $a{$b}", and "exists $a{$b}" null out the parent so we have to
+ # check for a parent of pp_null and a grandparent of
+ # pp_enteriter, pp_delete, pp_exists
+
+ next
+ if $pname eq "null"
+ and $gparent->name =~ m/\A(?:delete|enteriter|exists)\z/xms;
+
+ # our( @bar ); would also trigger this error so I exclude
+ # that.
+ next
+ if $op->private & OPpOUR_INTRO
+ and ( $op->flags & OPf_WANT ) == OPf_WANT_VOID;
+
+ warning 'Implicit scalar context for %s in %s',
+ $opname eq "rv2av" ? "array" : "hash", $parent->desc;
+ }
+
+PRIVATE_NAMES: {
+
+ # Looks for calls to methods with names that begin with _ and
+ # that aren't visible within the current package. Maybe this
+ # should look at @ISA.
+ next
+ unless $check{private_names}
+ and $opname =~ m/\Amethod/xms;
+
+ my $methop = $op->first;
+ next unless $methop->name eq "const";
+
+ my $method = $methop->sv_harder->PV;
+ next
+ unless $method =~ m/\A_/xms
+ and not defined &{"$curstash\::$method"};
+
+ warning q[Illegal reference to private method name '%s'], $method;
+ }
+
+ # Call all registered plugins
+ my $m;
+ $m = $_->can('match'), $op->$m( \%check ) for @plugins;
+ return;
+}
+
+sub B::PMOP::lint {
+ my ($op) = @_;
+
+IMPLICIT_READ: {
+
+ # Look for /.../ that doesn't use =~ to bind to something.
+ next
+ unless $check{implicit_read}
+ and $op->name eq "match"
+ and not( $op->flags & OPf_STACKED
+ or inside_grepmap() );
+ warning 'Implicit match on $_';
+ }
+
+IMPLICIT_WRITE: {
+
+ # Look for s/.../.../ that doesn't use =~ to bind to
+ # something.
+ next
+ unless $check{implicit_write}
+ and $op->name eq "subst"
+ and not $op->flags & OPf_STACKED;
+ warning 'Implicit substitution on $_';
+ }
+
+ # Call all registered plugins
+ my $m;
+ $m = $_->can('match'), $op->$m( \%check ) for @plugins;
+ return;
+}
+
+sub B::LOOP::lint {
+ my ($op) = @_;
+
+IMPLICIT_FOO: {
+
+ # Look for C<for ( ... )>.
+ next
+ unless ( $check{implicit_read} or $check{implicit_write} )
+ and $op->name eq "enteriter";
+
+ my $last = $op->last;
+ next
+ unless $last->name eq "gv"
+ and $last->gv_harder->NAME eq "_"
+ and $op->redoop->name =~ m/\A(?:next|db|set)state\z/xms;
+
+ warning 'Implicit use of $_ in foreach';
+ }
+
+ # Call all registered plugins
+ my $m;
+ $m = $_->can('match'), $op->$m( \%check ) for @plugins;
+ return;
+}
+
+# In threaded vs non-threaded perls you'll find that threaded perls
+# use PADOP in place of SVOPs so they can do lookups into the
+# scratchpad to find things. I suppose this is so a optree can be
+# shared between threads and all symbol table muckery will just get
+# written to a scratchpad.
+*B::PADOP::lint = *B::PADOP::lint = \&B::SVOP::lint;
+
+sub B::SVOP::lint {
+ my ($op) = @_;
+
+MAGIC_DIAMOND: {
+ next
+ unless $check{magic_diamond}
+ and parents()->[0]->name eq 'readline'
+ and $op->gv_harder->NAME eq 'ARGV';
+
+ warning 'Use of <>';
+ }
+
+BARE_SUBS: {
+ next
+ unless $check{bare_subs}
+ and $op->name eq 'const'
+ and $op->private & OPpCONST_BARE;
+
+ my $sv = $op->sv_harder;
+ next unless $sv->FLAGS & SVf_POK;
+
+ my $sub = $sv->PV;
+ my $subname = "$curstash\::$sub";
+
+ # I want to skip over things that were declared with the
+ # constant pragma. Well... sometimes. Hmm. I want to ignore
+ # C<<use constant FOO => ...>> but warn on C<<FOO => ...>>
+ # later. The former is typical declaration syntax and the
+ # latter would be an error.
+ #
+ # Skipping over both could be handled by looking if
+ # $constant::declared{$subname} is true.
+
+ # Check that it's a function.
+ next
+ unless exists &{"$curstash\::$sub"};
+
+ warning q[Bare sub name '%s' interpreted as string], $sub;
+ }
+
+PRIVATE_NAMES: {
+ next unless $check{private_names};
+
+ my $opname = $op->name;
+ if ( $opname =~ m/\Agv(?:sv)?\z/xms ) {
+
+ # Looks for uses of variables and stuff that are named
+ # private and we're not in the same package.
+ my $gv = $op->gv_harder;
+ my $name = $gv->NAME;
+ next
+ unless $name =~ m/\A_./xms
+ and $gv->STASH->NAME ne $curstash;
+
+ warning q[Illegal reference to private name '%s'], $name;
+ }
+ elsif ( $opname eq "method_named" ) {
+ my $method = $op->sv_harder->PV;
+ next unless $method =~ m/\A_./xms;
+
+ warning q[Illegal reference to private method name '%s'], $method;
+ }
+ }
+
+DOLLAR_UNDERSCORE: {
+
+ # Warn on uses of $_ with a few exceptions. I'm not warning on
+ # $_ inside grep, map, or statement modifer foreach because
+ # they localize $_ and it'd be impossible to use these
+ # features without getting warnings.
+
+ next
+ unless $check{dollar_underscore}
+ and $op->name eq "gvsv"
+ and $op->gv_harder->NAME eq "_"
+ and not( inside_grepmap
+ or inside_foreach_modifier );
+
+ warning 'Use of $_';
+ }
+
+REGEXP_VARIABLES: {
+
+ # Look for any uses of $`, $&, or $'.
+ next
+ unless $check{regexp_variables}
+ and $op->name eq "gvsv";
+
+ my $name = $op->gv_harder->NAME;
+ next unless $name =~ m/\A[\&\'\`]\z/xms;
+
+ warning 'Use of regexp variable $%s', $name;
+ }
+
+UNDEFINED_SUBS: {
+
+ # Look for calls to functions that either don't exist or don't
+ # have a definition.
+ next
+ unless $check{undefined_subs}
+ and $op->name eq "gv"
+ and $op->next->name eq "entersub";
+
+ my $gv = $op->gv_harder;
+ my $subname = $gv->STASH->NAME . "::" . $gv->NAME;
+
+ no strict 'refs'; ## no critic strict
+ if ( not exists &$subname ) {
+ $subname =~ s/\Amain:://;
+ warning q[Nonexistant subroutine '%s' called], $subname;
+ }
+ elsif ( not defined &$subname ) {
+ $subname =~ s/\A\&?main:://;
+ warning q[Undefined subroutine '%s' called], $subname;
+ }
+ }
+
+ # Call all registered plugins
+ my $m;
+ $m = $_->can('match'), $op->$m( \%check ) for @plugins;
+ return;
+}
+
+sub B::GV::lintcv {
+
+ # Example: B::svref_2object( \ *A::Glob )->lintcv
+
+ my $gv = shift @_;
+ my $cv = $gv->CV;
+ return unless $cv->can('lintcv');
+ $cv->lintcv;
+ return;
+}
+
+sub B::CV::lintcv {
+
+ # Example: B::svref_2object( \ &foo )->lintcv
+
+ # Write to the *global* $
+ $curcv = shift @_;
+
+ #warn sprintf("lintcv: %s::%s (done=%d)\n",
+ # $gv->STASH->NAME, $gv->NAME, $done_cv{$$curcv});#debug
+ return unless ref($curcv) and $$curcv and not $done_cv{$$curcv}++;
+ my $root = $curcv->ROOT;
+
+ #warn " root = $root (0x$$root)\n";#debug
+ walkoptree_slow( $root, "lint" ) if $$root;
+ return;
+}
+
+sub do_lint {
+ my %search_pack;
+
+ # Copy to the global $curcv for use in pad lookups.
+ $curcv = main_cv;
+ walkoptree_slow( main_root, "lint" ) if ${ main_root() };
+
+ # Do all the miscellaneous non-sub blocks.
+ for my $av ( begin_av, init_av, check_av, end_av ) {
+ next unless eval { $av->isa('B::AV') };
+ for my $cv ( $av->ARRAY ) {
+ next unless ref($cv) and $cv->FILE eq $0;
+ $cv->lintcv;
+ }
+ }
+
+ walksymtable(
+ \%main::,
+ sub {
+ if ( $_[0]->FILE eq $0 ) { $_[0]->lintcv }
+ },
+ sub {1}
+ );
+ return;
+}
+
+sub compile {
+ my @options = @_;
+
+ # Turn on default lint checks
+ for my $opt (@default_checks) {
+ $check{$opt} = 1;
+ }
+
+OPTION:
+ while ( my $option = shift @options ) {
+ my ( $opt, $arg );
+ unless ( ( $opt, $arg ) = $option =~ m/\A-(.)(.*)/xms ) {
+ unshift @options, $option;
+ last OPTION;
+ }
+
+ if ( $opt eq "-" && $arg eq "-" ) {
+ shift @options;
+ last OPTION;
+ }
+ elsif ( $opt eq "D" ) {
+ $arg ||= shift @options;
+ foreach my $arg ( split //, $arg ) {
+ if ( $arg eq "o" ) {
+ B->debug(1);
+ }
+ elsif ( $arg eq "O" ) {
+ $debug_op = 1;
+ }
+ }
+ }
+ elsif ( $opt eq "u" ) {
+ $arg ||= shift @options;
+ push @extra_packages, $arg;
+ }
+ }
+
+ foreach my $opt ( @default_checks, @options ) {
+ $opt =~ tr/-/_/;
+ if ( $opt eq "all" ) {
+ %check = %valid_check;
+ }
+ elsif ( $opt eq "none" ) {
+ %check = ();
+ }
+ else {
+ if ( $opt =~ s/\Ano_//xms ) {
+ $check{$opt} = 0;
+ }
+ else {
+ $check{$opt} = 1;
+ }
+ carp "No such check: $opt"
+ unless defined $valid_check{$opt};
+ }
+ }
+
+ # Remaining arguments are things to check. So why aren't I
+ # capturing them or something? I don't know.
+
+ return \&do_lint;
+}
+
+sub register_plugin {
+ my ( undef, $plugin, $new_checks ) = @_;
+
+ # Allow the user to be lazy and not give us a name.
+ $plugin = caller unless defined $plugin;
+
+ # Register the plugin's named checks, if any.
+ for my $check ( eval {@$new_checks} ) {
+ if ( not defined $check ) {
+ carp 'Undefined value in checks.';
+ next;
+ }
+ if ( exists $valid_check{$check} ) {
+ carp
+ "$check is already registered as a $valid_check{$check} feature.";
+ next;
+ }
+
+ $valid_check{$check} = $plugin;
+ }
+
+ # Register a non-Module::Pluggable loaded module. @plugins already
+ # contains whatever M::P found on disk. The user might load a
+ # plugin manually from some arbitrary namespace and ask for it to
+ # be registered.
+ if ( not any { $_ eq $plugin } @plugins ) {
+ push @plugins, $plugin;
+ }
+
+ return;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/B/Lint/Debug.pm b/Master/tlpkg/tlperl.straw/lib/B/Lint/Debug.pm
new file mode 100755
index 00000000000..0a9b1bebb96
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/B/Lint/Debug.pm
@@ -0,0 +1,65 @@
+package B::Lint::Debug;
+
+=head1 NAME
+
+B::Lint::Debug - Adds debugging stringification to B::
+
+=head1 DESCRIPTION
+
+This module injects stringification to a B::OP*/B::SPECIAL. This
+should not be loaded unless you're debugging.
+
+=cut
+
+package B::SPECIAL;
+use overload '""' => sub {
+ my $self = shift @_;
+ "SPECIAL($$self)";
+};
+
+package B::OP;
+use overload '""' => sub {
+ my $self = shift @_;
+ my $class = ref $self;
+ $class =~ s/\AB:://xms;
+ my $name = $self->name;
+ "$class($name)";
+};
+
+package B::SVOP;
+use overload '""' => sub {
+ my $self = shift @_;
+ my $class = ref $self;
+ $class =~ s/\AB:://xms;
+ my $name = $self->name;
+ "$class($name," . $self->sv . "," . $self->gv . ")";
+};
+
+package B::SPECIAL;
+sub DESTROY { }
+our $AUTOLOAD;
+
+sub AUTOLOAD {
+ my $cx = 0;
+ print "AUTOLOAD $AUTOLOAD\n";
+
+ package DB;
+ while ( my @stuff = caller $cx ) {
+
+ print "$cx: [@DB::args] [@stuff]\n";
+ if ( ref $DB::args[0] ) {
+ if ( $DB::args[0]->can('padix') ) {
+ print " PADIX: " . $DB::args[0]->padix . "\n";
+ }
+ if ( $DB::args[0]->can('targ') ) {
+ print " TARG: " . $DB::args[0]->targ . "\n";
+ for ( B::Lint::cv()->PADLIST->ARRAY ) {
+ print +( $_->ARRAY )[ $DB::args[0]->targ ] . "\n";
+ }
+ }
+ }
+ ++$cx;
+ }
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/B/Showlex.pm b/Master/tlpkg/tlperl.straw/lib/B/Showlex.pm
new file mode 100755
index 00000000000..3b261a337df
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/B/Showlex.pm
@@ -0,0 +1,205 @@
+package B::Showlex;
+
+our $VERSION = '1.02';
+
+use strict;
+use B qw(svref_2object comppadlist class);
+use B::Terse ();
+use B::Concise ();
+
+#
+# Invoke as
+# perl -MO=Showlex,foo bar.pl
+# to see the names of lexical variables used by &foo
+# or as
+# perl -MO=Showlex bar.pl
+# to see the names of file scope lexicals used by bar.pl
+#
+
+
+# borrowed from B::Concise
+our $walkHandle = \*STDOUT;
+
+sub walk_output { # updates $walkHandle
+ $walkHandle = B::Concise::walk_output(@_);
+ #print "got $walkHandle";
+ #print $walkHandle "using it";
+ $walkHandle;
+}
+
+sub shownamearray {
+ my ($name, $av) = @_;
+ my @els = $av->ARRAY;
+ my $count = @els;
+ my $i;
+ print $walkHandle "$name has $count entries\n";
+ for ($i = 0; $i < $count; $i++) {
+ my $sv = $els[$i];
+ if (class($sv) ne "SPECIAL") {
+ printf $walkHandle "$i: %s (0x%lx) %s\n", class($sv), $$sv, $sv->PVX;
+ } else {
+ printf $walkHandle "$i: %s\n", $sv->terse;
+ #printf $walkHandle "$i: %s\n", B::Concise::concise_sv($sv);
+ }
+ }
+}
+
+sub showvaluearray {
+ my ($name, $av) = @_;
+ my @els = $av->ARRAY;
+ my $count = @els;
+ my $i;
+ print $walkHandle "$name has $count entries\n";
+ for ($i = 0; $i < $count; $i++) {
+ printf $walkHandle "$i: %s\n", $els[$i]->terse;
+ #print $walkHandle "$i: %s\n", B::Concise::concise_sv($els[$i]);
+ }
+}
+
+sub showlex {
+ my ($objname, $namesav, $valsav) = @_;
+ shownamearray("Pad of lexical names for $objname", $namesav);
+ showvaluearray("Pad of lexical values for $objname", $valsav);
+}
+
+my ($newlex, $nosp1); # rendering state vars
+
+sub newlex { # drop-in for showlex
+ my ($objname, $names, $vals) = @_;
+ my @names = $names->ARRAY;
+ my @vals = $vals->ARRAY;
+ my $count = @names;
+ print $walkHandle "$objname Pad has $count entries\n";
+ printf $walkHandle "0: %s\n", $names[0]->terse unless $nosp1;
+ for (my $i = 1; $i < $count; $i++) {
+ printf $walkHandle "$i: %s = %s\n", $names[$i]->terse, $vals[$i]->terse
+ unless $nosp1 and $names[$i]->terse =~ /SPECIAL/;
+ }
+}
+
+sub showlex_obj {
+ my ($objname, $obj) = @_;
+ $objname =~ s/^&main::/&/;
+ showlex($objname, svref_2object($obj)->PADLIST->ARRAY) if !$newlex;
+ newlex ($objname, svref_2object($obj)->PADLIST->ARRAY) if $newlex;
+}
+
+sub showlex_main {
+ showlex("comppadlist", comppadlist->ARRAY) if !$newlex;
+ newlex ("main", comppadlist->ARRAY) if $newlex;
+}
+
+sub compile {
+ my @options = grep(/^-/, @_);
+ my @args = grep(!/^-/, @_);
+ for my $o (@options) {
+ $newlex = 1 if $o eq "-newlex";
+ $nosp1 = 1 if $o eq "-nosp";
+ }
+
+ return \&showlex_main unless @args;
+ return sub {
+ my $objref;
+ foreach my $objname (@args) {
+ next unless $objname; # skip nulls w/o carping
+
+ if (ref $objname) {
+ print $walkHandle "B::Showlex::compile($objname)\n";
+ $objref = $objname;
+ } else {
+ $objname = "main::$objname" unless $objname =~ /::/;
+ print $walkHandle "$objname:\n";
+ no strict 'refs';
+ die "err: unknown function ($objname)\n"
+ unless *{$objname}{CODE};
+ $objref = \&$objname;
+ }
+ showlex_obj($objname, $objref);
+ }
+ }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Showlex - Show lexical variables used in functions or files
+
+=head1 SYNOPSIS
+
+ perl -MO=Showlex[,-OPTIONS][,SUBROUTINE] foo.pl
+
+=head1 DESCRIPTION
+
+When a comma-separated list of subroutine names is given as options, Showlex
+prints the lexical variables used in those subroutines. Otherwise, it prints
+the file-scope lexicals in the file.
+
+=head1 EXAMPLES
+
+Traditional form:
+
+ $ perl -MO=Showlex -e 'my ($i,$j,$k)=(1,"foo")'
+ Pad of lexical names for comppadlist has 4 entries
+ 0: SPECIAL #1 &PL_sv_undef
+ 1: PVNV (0x9db0fb0) $i
+ 2: PVNV (0x9db0f38) $j
+ 3: PVNV (0x9db0f50) $k
+ Pad of lexical values for comppadlist has 5 entries
+ 0: SPECIAL #1 &PL_sv_undef
+ 1: NULL (0x9da4234)
+ 2: NULL (0x9db0f2c)
+ 3: NULL (0x9db0f44)
+ 4: NULL (0x9da4264)
+ -e syntax OK
+
+New-style form:
+
+ $ perl -MO=Showlex,-newlex -e 'my ($i,$j,$k)=(1,"foo")'
+ main Pad has 4 entries
+ 0: SPECIAL #1 &PL_sv_undef
+ 1: PVNV (0xa0c4fb8) "$i" = NULL (0xa0b8234)
+ 2: PVNV (0xa0c4f40) "$j" = NULL (0xa0c4f34)
+ 3: PVNV (0xa0c4f58) "$k" = NULL (0xa0c4f4c)
+ -e syntax OK
+
+New form, no specials, outside O framework:
+
+ $ perl -MB::Showlex -e \
+ 'my ($i,$j,$k)=(1,"foo"); B::Showlex::compile(-newlex,-nosp)->()'
+ main Pad has 4 entries
+ 1: PVNV (0x998ffb0) "$i" = IV (0x9983234) 1
+ 2: PVNV (0x998ff68) "$j" = PV (0x998ff5c) "foo"
+ 3: PVNV (0x998ff80) "$k" = NULL (0x998ff74)
+
+Note that this example shows the values of the lexicals, whereas the other
+examples did not (as they're compile-time only).
+
+=head2 OPTIONS
+
+The C<-newlex> option produces a more readable C<< name => value >> format,
+and is shown in the second example above.
+
+The C<-nosp> option eliminates reporting of SPECIALs, such as C<0: SPECIAL
+#1 &PL_sv_undef> above. Reporting of SPECIALs can sometimes overwhelm
+your declared lexicals.
+
+=head1 SEE ALSO
+
+C<B::Showlex> can also be used outside of the O framework, as in the third
+example. See C<B::Concise> for a fuller explanation of reasons.
+
+=head1 TODO
+
+Some of the reported info, such as hex addresses, is not particularly
+valuable. Other information would be more useful for the typical
+programmer, such as line-numbers, pad-slot reuses, etc.. Given this,
+-newlex isnt a particularly good flag-name.
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/B/Terse.pm b/Master/tlpkg/tlperl.straw/lib/B/Terse.pm
new file mode 100755
index 00000000000..562c58abd83
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/B/Terse.pm
@@ -0,0 +1,102 @@
+package B::Terse;
+
+our $VERSION = '1.05';
+
+use strict;
+use B qw(class @specialsv_name);
+use B::Concise qw(concise_subref set_style_standard);
+use Carp;
+
+sub terse {
+ my ($order, $subref) = @_;
+ set_style_standard("terse");
+ if ($order eq "exec") {
+ concise_subref('exec', $subref);
+ } else {
+ concise_subref('basic', $subref);
+ }
+}
+
+sub compile {
+ my @args = @_;
+ my $order = @args ? shift(@args) : "";
+ $order = "-exec" if $order eq "exec";
+ unshift @args, $order if $order ne "";
+ B::Concise::compile("-terse", @args);
+}
+
+sub indent {
+ my ($level) = @_ ? shift : 0;
+ return " " x $level;
+}
+
+# Don't use this, at least on OPs in subroutines: it has no way of
+# getting to the pad, and will give wrong answers or crash.
+sub B::OP::terse {
+ carp "B::OP::terse is deprecated; use B::Concise instead";
+ B::Concise::b_terse(@_);
+}
+
+sub B::SV::terse {
+ my($sv, $level) = (@_, 0);
+ my %info;
+ B::Concise::concise_sv($sv, \%info);
+ my $s = indent($level)
+ . B::Concise::fmt_line(\%info, $sv,
+ "#svclass~(?((#svaddr))?)~#svval", 0);
+ chomp $s;
+ print "$s\n" unless defined wantarray;
+ $s;
+}
+
+sub B::NULL::terse {
+ my ($sv, $level) = (@_, 0);
+ my $s = indent($level) . sprintf "%s (0x%lx)", class($sv), $$sv;
+ print "$s\n" unless defined wantarray;
+ $s;
+}
+
+sub B::SPECIAL::terse {
+ my ($sv, $level) = (@_, 0);
+ my $s = indent($level)
+ . sprintf( "%s #%d %s", class($sv), $$sv, $specialsv_name[$$sv]);
+ print "$s\n" unless defined wantarray;
+ $s;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Terse - Walk Perl syntax tree, printing terse info about ops
+
+=head1 SYNOPSIS
+
+ perl -MO=Terse[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+This version of B::Terse is really just a wrapper that calls B::Concise
+with the B<-terse> option. It is provided for compatibility with old scripts
+(and habits) but using B::Concise directly is now recommended instead.
+
+For compatibility with the old B::Terse, this module also adds a
+method named C<terse> to B::OP and B::SV objects. The B::SV method is
+largely compatible with the old one, though authors of new software
+might be advised to choose a more user-friendly output format. The
+B::OP C<terse> method, however, doesn't work well. Since B::Terse was
+first written, much more information in OPs has migrated to the
+scratchpad datastructure, but the C<terse> interface doesn't have any
+way of getting to the correct pad. As a kludge, the new version will
+always use the pad for the main program, but for OPs in subroutines
+this will give the wrong answer or crash.
+
+=head1 AUTHOR
+
+The original version of B::Terse was written by Malcolm Beattie,
+E<lt>mbeattie@sable.ox.ac.ukE<gt>. This wrapper was written by Stephen
+McCamant, E<lt>smcc@MIT.EDUE<gt>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/B/Xref.pm b/Master/tlpkg/tlperl.straw/lib/B/Xref.pm
new file mode 100755
index 00000000000..64e677ccb82
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/B/Xref.pm
@@ -0,0 +1,431 @@
+package B::Xref;
+
+our $VERSION = '1.02';
+
+=head1 NAME
+
+B::Xref - Generates cross reference reports for Perl programs
+
+=head1 SYNOPSIS
+
+perl -MO=Xref[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+The B::Xref module is used to generate a cross reference listing of all
+definitions and uses of variables, subroutines and formats in a Perl program.
+It is implemented as a backend for the Perl compiler.
+
+The report generated is in the following format:
+
+ File filename1
+ Subroutine subname1
+ Package package1
+ object1 line numbers
+ object2 line numbers
+ ...
+ Package package2
+ ...
+
+Each B<File> section reports on a single file. Each B<Subroutine> section
+reports on a single subroutine apart from the special cases
+"(definitions)" and "(main)". These report, respectively, on subroutine
+definitions found by the initial symbol table walk and on the main part of
+the program or module external to all subroutines.
+
+The report is then grouped by the B<Package> of each variable,
+subroutine or format with the special case "(lexicals)" meaning
+lexical variables. Each B<object> name (implicitly qualified by its
+containing B<Package>) includes its type character(s) at the beginning
+where possible. Lexical variables are easier to track and even
+included dereferencing information where possible.
+
+The C<line numbers> are a comma separated list of line numbers (some
+preceded by code letters) where that object is used in some way.
+Simple uses aren't preceded by a code letter. Introductions (such as
+where a lexical is first defined with C<my>) are indicated with the
+letter "i". Subroutine and method calls are indicated by the character
+"&". Subroutine definitions are indicated by "s" and format
+definitions by "f".
+
+=head1 OPTIONS
+
+Option words are separated by commas (not whitespace) and follow the
+usual conventions of compiler backend options.
+
+=over 8
+
+=item C<-oFILENAME>
+
+Directs output to C<FILENAME> instead of standard output.
+
+=item C<-r>
+
+Raw output. Instead of producing a human-readable report, outputs a line
+in machine-readable form for each definition/use of a variable/sub/format.
+
+=item C<-d>
+
+Don't output the "(definitions)" sections.
+
+=item C<-D[tO]>
+
+(Internal) debug options, probably only useful if C<-r> included.
+The C<t> option prints the object on the top of the stack as it's
+being tracked. The C<O> option prints each operator as it's being
+processed in the execution order of the program.
+
+=back
+
+=head1 BUGS
+
+Non-lexical variables are quite difficult to track through a program.
+Sometimes the type of a non-lexical variable's use is impossible to
+determine. Introductions of non-lexical non-scalars don't seem to be
+reported properly.
+
+=head1 AUTHOR
+
+Malcolm Beattie, mbeattie@sable.ox.ac.uk.
+
+=cut
+
+use strict;
+use Config;
+use B qw(peekop class comppadlist main_start svref_2object walksymtable
+ OPpLVAL_INTRO SVf_POK OPpOUR_INTRO cstring
+ );
+
+sub UNKNOWN { ["?", "?", "?"] }
+
+my @pad; # lexicals in current pad
+ # as ["(lexical)", type, name]
+my %done; # keyed by $$op: set when each $op is done
+my $top = UNKNOWN; # shadows top element of stack as
+ # [pack, type, name] (pack can be "(lexical)")
+my $file; # shadows current filename
+my $line; # shadows current line number
+my $subname; # shadows current sub name
+my %table; # Multi-level hash to record all uses etc.
+my @todo = (); # List of CVs that need processing
+
+my %code = (intro => "i", used => "",
+ subdef => "s", subused => "&",
+ formdef => "f", meth => "->");
+
+
+# Options
+my ($debug_op, $debug_top, $nodefs, $raw);
+
+sub process {
+ my ($var, $event) = @_;
+ my ($pack, $type, $name) = @$var;
+ if ($type eq "*") {
+ if ($event eq "used") {
+ return;
+ } elsif ($event eq "subused") {
+ $type = "&";
+ }
+ }
+ $type =~ s/(.)\*$/$1/g;
+ if ($raw) {
+ printf "%-16s %-12s %5d %-12s %4s %-16s %s\n",
+ $file, $subname, $line, $pack, $type, $name, $event;
+ } else {
+ # Wheee
+ push(@{$table{$file}->{$subname}->{$pack}->{$type.$name}->{$event}},
+ $line);
+ }
+}
+
+sub load_pad {
+ my $padlist = shift;
+ my ($namelistav, $vallistav, @namelist, $ix);
+ @pad = ();
+ return if class($padlist) eq "SPECIAL";
+ ($namelistav,$vallistav) = $padlist->ARRAY;
+ @namelist = $namelistav->ARRAY;
+ for ($ix = 1; $ix < @namelist; $ix++) {
+ my $namesv = $namelist[$ix];
+ next if class($namesv) eq "SPECIAL";
+ my ($type, $name) = $namesv->PV =~ /^(.)([^\0]*)(\0.*)?$/;
+ $pad[$ix] = ["(lexical)", $type || '?', $name || '?'];
+ }
+ if ($Config{useithreads}) {
+ my (@vallist);
+ @vallist = $vallistav->ARRAY;
+ for ($ix = 1; $ix < @vallist; $ix++) {
+ my $valsv = $vallist[$ix];
+ next unless class($valsv) eq "GV";
+ next if class($valsv->STASH) eq 'SPECIAL';
+ # these pad GVs don't have corresponding names, so same @pad
+ # array can be used without collisions
+ $pad[$ix] = [$valsv->STASH->NAME, "*", $valsv->NAME];
+ }
+ }
+}
+
+sub xref {
+ my $start = shift;
+ my $op;
+ for ($op = $start; $$op; $op = $op->next) {
+ last if $done{$$op}++;
+ warn sprintf("top = [%s, %s, %s]\n", @$top) if $debug_top;
+ warn peekop($op), "\n" if $debug_op;
+ my $opname = $op->name;
+ if ($opname =~ /^(or|and|mapwhile|grepwhile|range|cond_expr)$/) {
+ xref($op->other);
+ } elsif ($opname eq "match" || $opname eq "subst") {
+ xref($op->pmreplstart);
+ } elsif ($opname eq "substcont") {
+ xref($op->other->pmreplstart);
+ $op = $op->other;
+ redo;
+ } elsif ($opname eq "enterloop") {
+ xref($op->redoop);
+ xref($op->nextop);
+ xref($op->lastop);
+ } elsif ($opname eq "subst") {
+ xref($op->pmreplstart);
+ } else {
+ no strict 'refs';
+ my $ppname = "pp_$opname";
+ &$ppname($op) if defined(&$ppname);
+ }
+ }
+}
+
+sub xref_cv {
+ my $cv = shift;
+ my $pack = $cv->GV->STASH->NAME;
+ $subname = ($pack eq "main" ? "" : "$pack\::") . $cv->GV->NAME;
+ load_pad($cv->PADLIST);
+ xref($cv->START);
+ $subname = "(main)";
+}
+
+sub xref_object {
+ my $cvref = shift;
+ xref_cv(svref_2object($cvref));
+}
+
+sub xref_main {
+ $subname = "(main)";
+ load_pad(comppadlist);
+ xref(main_start);
+ while (@todo) {
+ xref_cv(shift @todo);
+ }
+}
+
+sub pp_nextstate {
+ my $op = shift;
+ $file = $op->file;
+ $line = $op->line;
+ $top = UNKNOWN;
+}
+
+sub pp_padsv {
+ my $op = shift;
+ $top = $pad[$op->targ];
+ process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
+}
+
+sub pp_padav { pp_padsv(@_) }
+sub pp_padhv { pp_padsv(@_) }
+
+sub deref {
+ my ($op, $var, $as) = @_;
+ $var->[1] = $as . $var->[1];
+ process($var, $op->private & OPpOUR_INTRO ? "intro" : "used");
+}
+
+sub pp_rv2cv { deref(shift, $top, "&"); }
+sub pp_rv2hv { deref(shift, $top, "%"); }
+sub pp_rv2sv { deref(shift, $top, "\$"); }
+sub pp_rv2av { deref(shift, $top, "\@"); }
+sub pp_rv2gv { deref(shift, $top, "*"); }
+
+sub pp_gvsv {
+ my $op = shift;
+ my $gv;
+ if ($Config{useithreads}) {
+ $top = $pad[$op->padix];
+ $top = UNKNOWN unless $top;
+ $top->[1] = '$';
+ }
+ else {
+ $gv = $op->gv;
+ $top = [$gv->STASH->NAME, '$', $gv->SAFENAME];
+ }
+ process($top, $op->private & OPpLVAL_INTRO ||
+ $op->private & OPpOUR_INTRO ? "intro" : "used");
+}
+
+sub pp_gv {
+ my $op = shift;
+ my $gv;
+ if ($Config{useithreads}) {
+ $top = $pad[$op->padix];
+ $top = UNKNOWN unless $top;
+ $top->[1] = '*';
+ }
+ else {
+ $gv = $op->gv;
+ $top = [$gv->STASH->NAME, "*", $gv->SAFENAME];
+ }
+ process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
+}
+
+sub pp_const {
+ my $op = shift;
+ my $sv = $op->sv;
+ # constant could be in the pad (under useithreads)
+ if ($$sv) {
+ $top = ["?", "",
+ (class($sv) ne "SPECIAL" && $sv->FLAGS & SVf_POK)
+ ? cstring($sv->PV) : "?"];
+ }
+ else {
+ $top = $pad[$op->targ];
+ $top = UNKNOWN unless $top;
+ }
+}
+
+sub pp_method {
+ my $op = shift;
+ $top = ["(method)", "->".$top->[1], $top->[2]];
+}
+
+sub pp_entersub {
+ my $op = shift;
+ if ($top->[1] eq "m") {
+ process($top, "meth");
+ } else {
+ process($top, "subused");
+ }
+ $top = UNKNOWN;
+}
+
+#
+# Stuff for cross referencing definitions of variables and subs
+#
+
+sub B::GV::xref {
+ my $gv = shift;
+ my $cv = $gv->CV;
+ if ($$cv) {
+ #return if $done{$$cv}++;
+ $file = $gv->FILE;
+ $line = $gv->LINE;
+ process([$gv->STASH->NAME, "&", $gv->NAME], "subdef");
+ push(@todo, $cv);
+ }
+ my $form = $gv->FORM;
+ if ($$form) {
+ return if $done{$$form}++;
+ $file = $gv->FILE;
+ $line = $gv->LINE;
+ process([$gv->STASH->NAME, "", $gv->NAME], "formdef");
+ }
+}
+
+sub xref_definitions {
+ my ($pack, %exclude);
+ return if $nodefs;
+ $subname = "(definitions)";
+ foreach $pack (qw(B O AutoLoader DynaLoader XSLoader Config DB VMS
+ strict vars FileHandle Exporter Carp PerlIO::Layer
+ attributes utf8 warnings)) {
+ $exclude{$pack."::"} = 1;
+ }
+ no strict qw(vars refs);
+ walksymtable(\%{"main::"}, "xref", sub { !defined($exclude{$_[0]}) });
+}
+
+sub output {
+ return if $raw;
+ my ($file, $subname, $pack, $name, $ev, $perfile, $persubname,
+ $perpack, $pername, $perev);
+ foreach $file (sort(keys(%table))) {
+ $perfile = $table{$file};
+ print "File $file\n";
+ foreach $subname (sort(keys(%$perfile))) {
+ $persubname = $perfile->{$subname};
+ print " Subroutine $subname\n";
+ foreach $pack (sort(keys(%$persubname))) {
+ $perpack = $persubname->{$pack};
+ print " Package $pack\n";
+ foreach $name (sort(keys(%$perpack))) {
+ $pername = $perpack->{$name};
+ my @lines;
+ foreach $ev (qw(intro formdef subdef meth subused used)) {
+ $perev = $pername->{$ev};
+ if (defined($perev) && @$perev) {
+ my $code = $code{$ev};
+ push(@lines, map("$code$_", @$perev));
+ }
+ }
+ printf " %-16s %s\n", $name, join(", ", @lines);
+ }
+ }
+ }
+ }
+}
+
+sub compile {
+ my @options = @_;
+ my ($option, $opt, $arg);
+ OPTION:
+ while ($option = shift @options) {
+ if ($option =~ /^-(.)(.*)/) {
+ $opt = $1;
+ $arg = $2;
+ } else {
+ unshift @options, $option;
+ last OPTION;
+ }
+ if ($opt eq "-" && $arg eq "-") {
+ shift @options;
+ last OPTION;
+ } elsif ($opt eq "o") {
+ $arg ||= shift @options;
+ open(STDOUT, ">$arg") or return "$arg: $!\n";
+ } elsif ($opt eq "d") {
+ $nodefs = 1;
+ } elsif ($opt eq "r") {
+ $raw = 1;
+ } elsif ($opt eq "D") {
+ $arg ||= shift @options;
+ foreach $arg (split(//, $arg)) {
+ if ($arg eq "o") {
+ B->debug(1);
+ } elsif ($arg eq "O") {
+ $debug_op = 1;
+ } elsif ($arg eq "t") {
+ $debug_top = 1;
+ }
+ }
+ }
+ }
+ if (@options) {
+ return sub {
+ my $objname;
+ xref_definitions();
+ foreach $objname (@options) {
+ $objname = "main::$objname" unless $objname =~ /::/;
+ eval "xref_object(\\&$objname)";
+ die "xref_object(\\&$objname) failed: $@" if $@;
+ }
+ output();
+ }
+ } else {
+ return sub {
+ xref_definitions();
+ xref_main();
+ output();
+ }
+ }
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Benchmark.pm b/Master/tlpkg/tlperl.straw/lib/Benchmark.pm
new file mode 100755
index 00000000000..269674cfda5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Benchmark.pm
@@ -0,0 +1,1044 @@
+package Benchmark;
+
+use strict;
+
+
+=head1 NAME
+
+Benchmark - benchmark running times of Perl code
+
+=head1 SYNOPSIS
+
+ use Benchmark qw(:all) ;
+
+ timethis ($count, "code");
+
+ # Use Perl code in strings...
+ timethese($count, {
+ 'Name1' => '...code1...',
+ 'Name2' => '...code2...',
+ });
+
+ # ... or use subroutine references.
+ timethese($count, {
+ 'Name1' => sub { ...code1... },
+ 'Name2' => sub { ...code2... },
+ });
+
+ # cmpthese can be used both ways as well
+ cmpthese($count, {
+ 'Name1' => '...code1...',
+ 'Name2' => '...code2...',
+ });
+
+ cmpthese($count, {
+ 'Name1' => sub { ...code1... },
+ 'Name2' => sub { ...code2... },
+ });
+
+ # ...or in two stages
+ $results = timethese($count,
+ {
+ 'Name1' => sub { ...code1... },
+ 'Name2' => sub { ...code2... },
+ },
+ 'none'
+ );
+ cmpthese( $results ) ;
+
+ $t = timeit($count, '...other code...')
+ print "$count loops of other code took:",timestr($t),"\n";
+
+ $t = countit($time, '...other code...')
+ $count = $t->iters ;
+ print "$count loops of other code took:",timestr($t),"\n";
+
+ # enable hires wallclock timing if possible
+ use Benchmark ':hireswallclock';
+
+=head1 DESCRIPTION
+
+The Benchmark module encapsulates a number of routines to help you
+figure out how long it takes to execute some code.
+
+timethis - run a chunk of code several times
+
+timethese - run several chunks of code several times
+
+cmpthese - print results of timethese as a comparison chart
+
+timeit - run a chunk of code and see how long it goes
+
+countit - see how many times a chunk of code runs in a given time
+
+
+=head2 Methods
+
+=over 10
+
+=item new
+
+Returns the current time. Example:
+
+ use Benchmark;
+ $t0 = Benchmark->new;
+ # ... your code here ...
+ $t1 = Benchmark->new;
+ $td = timediff($t1, $t0);
+ print "the code took:",timestr($td),"\n";
+
+=item debug
+
+Enables or disable debugging by setting the C<$Benchmark::Debug> flag:
+
+ Benchmark->debug(1);
+ $t = timeit(10, ' 5 ** $Global ');
+ Benchmark->debug(0);
+
+=item iters
+
+Returns the number of iterations.
+
+=back
+
+=head2 Standard Exports
+
+The following routines will be exported into your namespace
+if you use the Benchmark module:
+
+=over 10
+
+=item timeit(COUNT, CODE)
+
+Arguments: COUNT is the number of times to run the loop, and CODE is
+the code to run. CODE may be either a code reference or a string to
+be eval'd; either way it will be run in the caller's package.
+
+Returns: a Benchmark object.
+
+=item timethis ( COUNT, CODE, [ TITLE, [ STYLE ]] )
+
+Time COUNT iterations of CODE. CODE may be a string to eval or a
+code reference; either way the CODE will run in the caller's package.
+Results will be printed to STDOUT as TITLE followed by the times.
+TITLE defaults to "timethis COUNT" if none is provided. STYLE
+determines the format of the output, as described for timestr() below.
+
+The COUNT can be zero or negative: this means the I<minimum number of
+CPU seconds> to run. A zero signifies the default of 3 seconds. For
+example to run at least for 10 seconds:
+
+ timethis(-10, $code)
+
+or to run two pieces of code tests for at least 3 seconds:
+
+ timethese(0, { test1 => '...', test2 => '...'})
+
+CPU seconds is, in UNIX terms, the user time plus the system time of
+the process itself, as opposed to the real (wallclock) time and the
+time spent by the child processes. Less than 0.1 seconds is not
+accepted (-0.01 as the count, for example, will cause a fatal runtime
+exception).
+
+Note that the CPU seconds is the B<minimum> time: CPU scheduling and
+other operating system factors may complicate the attempt so that a
+little bit more time is spent. The benchmark output will, however,
+also tell the number of C<$code> runs/second, which should be a more
+interesting number than the actually spent seconds.
+
+Returns a Benchmark object.
+
+=item timethese ( COUNT, CODEHASHREF, [ STYLE ] )
+
+The CODEHASHREF is a reference to a hash containing names as keys
+and either a string to eval or a code reference for each value.
+For each (KEY, VALUE) pair in the CODEHASHREF, this routine will
+call
+
+ timethis(COUNT, VALUE, KEY, STYLE)
+
+The routines are called in string comparison order of KEY.
+
+The COUNT can be zero or negative, see timethis().
+
+Returns a hash reference of Benchmark objects, keyed by name.
+
+=item timediff ( T1, T2 )
+
+Returns the difference between two Benchmark times as a Benchmark
+object suitable for passing to timestr().
+
+=item timestr ( TIMEDIFF, [ STYLE, [ FORMAT ] ] )
+
+Returns a string that formats the times in the TIMEDIFF object in
+the requested STYLE. TIMEDIFF is expected to be a Benchmark object
+similar to that returned by timediff().
+
+STYLE can be any of 'all', 'none', 'noc', 'nop' or 'auto'. 'all' shows
+each of the 5 times available ('wallclock' time, user time, system time,
+user time of children, and system time of children). 'noc' shows all
+except the two children times. 'nop' shows only wallclock and the
+two children times. 'auto' (the default) will act as 'all' unless
+the children times are both zero, in which case it acts as 'noc'.
+'none' prevents output.
+
+FORMAT is the L<printf(3)>-style format specifier (without the
+leading '%') to use to print the times. It defaults to '5.2f'.
+
+=back
+
+=head2 Optional Exports
+
+The following routines will be exported into your namespace
+if you specifically ask that they be imported:
+
+=over 10
+
+=item clearcache ( COUNT )
+
+Clear the cached time for COUNT rounds of the null loop.
+
+=item clearallcache ( )
+
+Clear all cached times.
+
+=item cmpthese ( COUNT, CODEHASHREF, [ STYLE ] )
+
+=item cmpthese ( RESULTSHASHREF, [ STYLE ] )
+
+Optionally calls timethese(), then outputs comparison chart. This:
+
+ cmpthese( -1, { a => "++\$i", b => "\$i *= 2" } ) ;
+
+outputs a chart like:
+
+ Rate b a
+ b 2831802/s -- -61%
+ a 7208959/s 155% --
+
+This chart is sorted from slowest to fastest, and shows the percent speed
+difference between each pair of tests.
+
+C<cmpthese> can also be passed the data structure that timethese() returns:
+
+ $results = timethese( -1, { a => "++\$i", b => "\$i *= 2" } ) ;
+ cmpthese( $results );
+
+in case you want to see both sets of results.
+If the first argument is an unblessed hash reference,
+that is RESULTSHASHREF; otherwise that is COUNT.
+
+Returns a reference to an ARRAY of rows, each row is an ARRAY of cells from the
+above chart, including labels. This:
+
+ my $rows = cmpthese( -1, { a => '++$i', b => '$i *= 2' }, "none" );
+
+returns a data structure like:
+
+ [
+ [ '', 'Rate', 'b', 'a' ],
+ [ 'b', '2885232/s', '--', '-59%' ],
+ [ 'a', '7099126/s', '146%', '--' ],
+ ]
+
+B<NOTE>: This result value differs from previous versions, which returned
+the C<timethese()> result structure. If you want that, just use the two
+statement C<timethese>...C<cmpthese> idiom shown above.
+
+Incidently, note the variance in the result values between the two examples;
+this is typical of benchmarking. If this were a real benchmark, you would
+probably want to run a lot more iterations.
+
+=item countit(TIME, CODE)
+
+Arguments: TIME is the minimum length of time to run CODE for, and CODE is
+the code to run. CODE may be either a code reference or a string to
+be eval'd; either way it will be run in the caller's package.
+
+TIME is I<not> negative. countit() will run the loop many times to
+calculate the speed of CODE before running it for TIME. The actual
+time run for will usually be greater than TIME due to system clock
+resolution, so it's best to look at the number of iterations divided
+by the times that you are concerned with, not just the iterations.
+
+Returns: a Benchmark object.
+
+=item disablecache ( )
+
+Disable caching of timings for the null loop. This will force Benchmark
+to recalculate these timings for each new piece of code timed.
+
+=item enablecache ( )
+
+Enable caching of timings for the null loop. The time taken for COUNT
+rounds of the null loop will be calculated only once for each
+different COUNT used.
+
+=item timesum ( T1, T2 )
+
+Returns the sum of two Benchmark times as a Benchmark object suitable
+for passing to timestr().
+
+=back
+
+=head2 :hireswallclock
+
+If the Time::HiRes module has been installed, you can specify the
+special tag C<:hireswallclock> for Benchmark (if Time::HiRes is not
+available, the tag will be silently ignored). This tag will cause the
+wallclock time to be measured in microseconds, instead of integer
+seconds. Note though that the speed computations are still conducted
+in CPU time, not wallclock time.
+
+=head1 NOTES
+
+The data is stored as a list of values from the time and times
+functions:
+
+ ($real, $user, $system, $children_user, $children_system, $iters)
+
+in seconds for the whole loop (not divided by the number of rounds).
+
+The timing is done using time(3) and times(3).
+
+Code is executed in the caller's package.
+
+The time of the null loop (a loop with the same
+number of rounds but empty loop body) is subtracted
+from the time of the real loop.
+
+The null loop times can be cached, the key being the
+number of rounds. The caching can be controlled using
+calls like these:
+
+ clearcache($key);
+ clearallcache();
+
+ disablecache();
+ enablecache();
+
+Caching is off by default, as it can (usually slightly) decrease
+accuracy and does not usually noticably affect runtimes.
+
+=head1 EXAMPLES
+
+For example,
+
+ use Benchmark qw( cmpthese ) ;
+ $x = 3;
+ cmpthese( -5, {
+ a => sub{$x*$x},
+ b => sub{$x**2},
+ } );
+
+outputs something like this:
+
+ Benchmark: running a, b, each for at least 5 CPU seconds...
+ Rate b a
+ b 1559428/s -- -62%
+ a 4152037/s 166% --
+
+
+while
+
+ use Benchmark qw( timethese cmpthese ) ;
+ $x = 3;
+ $r = timethese( -5, {
+ a => sub{$x*$x},
+ b => sub{$x**2},
+ } );
+ cmpthese $r;
+
+outputs something like this:
+
+ Benchmark: running a, b, each for at least 5 CPU seconds...
+ a: 10 wallclock secs ( 5.14 usr + 0.13 sys = 5.27 CPU) @ 3835055.60/s (n=20210743)
+ b: 5 wallclock secs ( 5.41 usr + 0.00 sys = 5.41 CPU) @ 1574944.92/s (n=8520452)
+ Rate b a
+ b 1574945/s -- -59%
+ a 3835056/s 144% --
+
+
+=head1 INHERITANCE
+
+Benchmark inherits from no other class, except of course
+for Exporter.
+
+=head1 CAVEATS
+
+Comparing eval'd strings with code references will give you
+inaccurate results: a code reference will show a slightly slower
+execution time than the equivalent eval'd string.
+
+The real time timing is done using time(2) and
+the granularity is therefore only one second.
+
+Short tests may produce negative figures because perl
+can appear to take longer to execute the empty loop
+than a short test; try:
+
+ timethis(100,'1');
+
+The system time of the null loop might be slightly
+more than the system time of the loop with the actual
+code and therefore the difference might end up being E<lt> 0.
+
+=head1 SEE ALSO
+
+L<Devel::DProf> - a Perl code profiler
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi <F<jhi@iki.fi>>, Tim Bunce <F<Tim.Bunce@ig.co.uk>>
+
+=head1 MODIFICATION HISTORY
+
+September 8th, 1994; by Tim Bunce.
+
+March 28th, 1997; by Hugo van der Sanden: added support for code
+references and the already documented 'debug' method; revamped
+documentation.
+
+April 04-07th, 1997: by Jarkko Hietaniemi, added the run-for-some-time
+functionality.
+
+September, 1999; by Barrie Slaymaker: math fixes and accuracy and
+efficiency tweaks. Added cmpthese(). A result is now returned from
+timethese(). Exposed countit() (was runfor()).
+
+December, 2001; by Nicholas Clark: make timestr() recognise the style 'none'
+and return an empty string. If cmpthese is calling timethese, make it pass the
+style in. (so that 'none' will suppress output). Make sub new dump its
+debugging output to STDERR, to be consistent with everything else.
+All bugs found while writing a regression test.
+
+September, 2002; by Jarkko Hietaniemi: add ':hireswallclock' special tag.
+
+February, 2004; by Chia-liang Kao: make cmpthese and timestr use time
+statistics for children instead of parent when the style is 'nop'.
+
+November, 2007; by Christophe Grosjean: make cmpthese and timestr compute
+time consistently with style argument, default is 'all' not 'noc' any more.
+
+=cut
+
+# evaluate something in a clean lexical environment
+sub _doeval { no strict; eval shift }
+
+#
+# put any lexicals at file scope AFTER here
+#
+
+use Carp;
+use Exporter;
+
+our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION);
+
+@ISA=qw(Exporter);
+@EXPORT=qw(timeit timethis timethese timediff timestr);
+@EXPORT_OK=qw(timesum cmpthese countit
+ clearcache clearallcache disablecache enablecache);
+%EXPORT_TAGS=( all => [ @EXPORT, @EXPORT_OK ] ) ;
+
+$VERSION = 1.11;
+
+# --- ':hireswallclock' special handling
+
+my $hirestime;
+
+sub mytime () { time }
+
+init();
+
+sub BEGIN {
+ if (eval 'require Time::HiRes') {
+ import Time::HiRes qw(time);
+ $hirestime = \&Time::HiRes::time;
+ }
+}
+
+sub import {
+ my $class = shift;
+ if (grep { $_ eq ":hireswallclock" } @_) {
+ @_ = grep { $_ ne ":hireswallclock" } @_;
+ local $^W=0;
+ *mytime = $hirestime if defined $hirestime;
+ }
+ Benchmark->export_to_level(1, $class, @_);
+}
+
+our($Debug, $Min_Count, $Min_CPU, $Default_Format, $Default_Style,
+ %_Usage, %Cache, $Do_Cache);
+
+sub init {
+ $Debug = 0;
+ $Min_Count = 4;
+ $Min_CPU = 0.4;
+ $Default_Format = '5.2f';
+ $Default_Style = 'auto';
+ # The cache can cause a slight loss of sys time accuracy. If a
+ # user does many tests (>10) with *very* large counts (>10000)
+ # or works on a very slow machine the cache may be useful.
+ disablecache();
+ clearallcache();
+}
+
+sub debug { $Debug = ($_[1] != 0); }
+
+sub usage {
+ my $calling_sub = (caller(1))[3];
+ $calling_sub =~ s/^Benchmark:://;
+ return $_Usage{$calling_sub} || '';
+}
+
+# The cache needs two branches: 's' for strings and 'c' for code. The
+# empty loop is different in these two cases.
+
+$_Usage{clearcache} = <<'USAGE';
+usage: clearcache($count);
+USAGE
+
+sub clearcache {
+ die usage unless @_ == 1;
+ delete $Cache{"$_[0]c"}; delete $Cache{"$_[0]s"};
+}
+
+$_Usage{clearallcache} = <<'USAGE';
+usage: clearallcache();
+USAGE
+
+sub clearallcache {
+ die usage if @_;
+ %Cache = ();
+}
+
+$_Usage{enablecache} = <<'USAGE';
+usage: enablecache();
+USAGE
+
+sub enablecache {
+ die usage if @_;
+ $Do_Cache = 1;
+}
+
+$_Usage{disablecache} = <<'USAGE';
+usage: disablecache();
+USAGE
+
+sub disablecache {
+ die usage if @_;
+ $Do_Cache = 0;
+}
+
+
+# --- Functions to process the 'time' data type
+
+sub new { my @t = (mytime, times, @_ == 2 ? $_[1] : 0);
+ print STDERR "new=@t\n" if $Debug;
+ bless \@t; }
+
+sub cpu_p { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $pu+$ps ; }
+sub cpu_c { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $cu+$cs ; }
+sub cpu_a { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $pu+$ps+$cu+$cs ; }
+sub real { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $r ; }
+sub iters { $_[0]->[5] ; }
+
+
+$_Usage{timediff} = <<'USAGE';
+usage: $result_diff = timediff($result1, $result2);
+USAGE
+
+sub timediff {
+ my($a, $b) = @_;
+
+ die usage unless ref $a and ref $b;
+
+ my @r;
+ for (my $i=0; $i < @$a; ++$i) {
+ push(@r, $a->[$i] - $b->[$i]);
+ }
+ #die "Bad timediff(): ($r[1] + $r[2]) <= 0 (@$a[1,2]|@$b[1,2])\n"
+ # if ($r[1] + $r[2]) < 0;
+ bless \@r;
+}
+
+$_Usage{timesum} = <<'USAGE';
+usage: $sum = timesum($result1, $result2);
+USAGE
+
+sub timesum {
+ my($a, $b) = @_;
+
+ die usage unless ref $a and ref $b;
+
+ my @r;
+ for (my $i=0; $i < @$a; ++$i) {
+ push(@r, $a->[$i] + $b->[$i]);
+ }
+ bless \@r;
+}
+
+
+$_Usage{timestr} = <<'USAGE';
+usage: $formatted_result = timestr($result1);
+USAGE
+
+sub timestr {
+ my($tr, $style, $f) = @_;
+
+ die usage unless ref $tr;
+
+ my @t = @$tr;
+ warn "bad time value (@t)" unless @t==6;
+ my($r, $pu, $ps, $cu, $cs, $n) = @t;
+ my($pt, $ct, $tt) = ($tr->cpu_p, $tr->cpu_c, $tr->cpu_a);
+ $f = $Default_Format unless defined $f;
+ # format a time in the required style, other formats may be added here
+ $style ||= $Default_Style;
+ return '' if $style eq 'none';
+ $style = ($ct>0) ? 'all' : 'noc' if $style eq 'auto';
+ my $s = "@t $style"; # default for unknown style
+ my $w = $hirestime ? "%2g" : "%2d";
+ $s = sprintf("$w wallclock secs (%$f usr %$f sys + %$f cusr %$f csys = %$f CPU)",
+ $r,$pu,$ps,$cu,$cs,$tt) if $style eq 'all';
+ $s = sprintf("$w wallclock secs (%$f usr + %$f sys = %$f CPU)",
+ $r,$pu,$ps,$pt) if $style eq 'noc';
+ $s = sprintf("$w wallclock secs (%$f cusr + %$f csys = %$f CPU)",
+ $r,$cu,$cs,$ct) if $style eq 'nop';
+ my $elapsed = do {
+ if ($style eq 'nop') {$cu+$cs}
+ elsif ($style eq 'noc') {$pu+$ps}
+ else {$cu+$cs+$pu+$ps}
+ };
+ $s .= sprintf(" @ %$f/s (n=$n)",$n/($elapsed)) if $n && $elapsed;
+ $s;
+}
+
+sub timedebug {
+ my($msg, $t) = @_;
+ print STDERR "$msg",timestr($t),"\n" if $Debug;
+}
+
+# --- Functions implementing low-level support for timing loops
+
+$_Usage{runloop} = <<'USAGE';
+usage: runloop($number, [$string | $coderef])
+USAGE
+
+sub runloop {
+ my($n, $c) = @_;
+
+ $n+=0; # force numeric now, so garbage won't creep into the eval
+ croak "negative loopcount $n" if $n<0;
+ confess usage unless defined $c;
+ my($t0, $t1, $td); # before, after, difference
+
+ # find package of caller so we can execute code there
+ my($curpack) = caller(0);
+ my($i, $pack)= 0;
+ while (($pack) = caller(++$i)) {
+ last if $pack ne $curpack;
+ }
+
+ my ($subcode, $subref);
+ if (ref $c eq 'CODE') {
+ $subcode = "sub { for (1 .. $n) { local \$_; package $pack; &\$c; } }";
+ $subref = eval $subcode;
+ }
+ else {
+ $subcode = "sub { for (1 .. $n) { local \$_; package $pack; $c;} }";
+ $subref = _doeval($subcode);
+ }
+ croak "runloop unable to compile '$c': $@\ncode: $subcode\n" if $@;
+ print STDERR "runloop $n '$subcode'\n" if $Debug;
+
+ # Wait for the user timer to tick. This makes the error range more like
+ # -0.01, +0. If we don't wait, then it's more like -0.01, +0.01. This
+ # may not seem important, but it significantly reduces the chances of
+ # getting a too low initial $n in the initial, 'find the minimum' loop
+ # in &countit. This, in turn, can reduce the number of calls to
+ # &runloop a lot, and thus reduce additive errors.
+ my $tbase = Benchmark->new(0)->[1];
+ while ( ( $t0 = Benchmark->new(0) )->[1] == $tbase ) {} ;
+ $subref->();
+ $t1 = Benchmark->new($n);
+ $td = &timediff($t1, $t0);
+ timedebug("runloop:",$td);
+ $td;
+}
+
+$_Usage{timeit} = <<'USAGE';
+usage: $result = timeit($count, 'code' ); or
+ $result = timeit($count, sub { code } );
+USAGE
+
+sub timeit {
+ my($n, $code) = @_;
+ my($wn, $wc, $wd);
+
+ die usage unless defined $code and
+ (!ref $code or ref $code eq 'CODE');
+
+ printf STDERR "timeit $n $code\n" if $Debug;
+ my $cache_key = $n . ( ref( $code ) ? 'c' : 's' );
+ if ($Do_Cache && exists $Cache{$cache_key} ) {
+ $wn = $Cache{$cache_key};
+ } else {
+ $wn = &runloop($n, ref( $code ) ? sub { } : '' );
+ # Can't let our baseline have any iterations, or they get subtracted
+ # out of the result.
+ $wn->[5] = 0;
+ $Cache{$cache_key} = $wn;
+ }
+
+ $wc = &runloop($n, $code);
+
+ $wd = timediff($wc, $wn);
+ timedebug("timeit: ",$wc);
+ timedebug(" - ",$wn);
+ timedebug(" = ",$wd);
+
+ $wd;
+}
+
+
+my $default_for = 3;
+my $min_for = 0.1;
+
+
+$_Usage{countit} = <<'USAGE';
+usage: $result = countit($time, 'code' ); or
+ $result = countit($time, sub { code } );
+USAGE
+
+sub countit {
+ my ( $tmax, $code ) = @_;
+
+ die usage unless @_;
+
+ if ( not defined $tmax or $tmax == 0 ) {
+ $tmax = $default_for;
+ } elsif ( $tmax < 0 ) {
+ $tmax = -$tmax;
+ }
+
+ die "countit($tmax, ...): timelimit cannot be less than $min_for.\n"
+ if $tmax < $min_for;
+
+ my ($n, $tc);
+
+ # First find the minimum $n that gives a significant timing.
+ my $zeros=0;
+ for ($n = 1; ; $n *= 2 ) {
+ my $td = timeit($n, $code);
+ $tc = $td->[1] + $td->[2];
+ if ( $tc <= 0 and $n > 1024 ) {
+ ++$zeros > 16
+ and die "Timing is consistently zero in estimation loop, cannot benchmark. N=$n\n";
+ } else {
+ $zeros = 0;
+ }
+ last if $tc > 0.1;
+ }
+
+ my $nmin = $n;
+
+ # Get $n high enough that we can guess the final $n with some accuracy.
+ my $tpra = 0.1 * $tmax; # Target/time practice.
+ while ( $tc < $tpra ) {
+ # The 5% fudge is to keep us from iterating again all
+ # that often (this speeds overall responsiveness when $tmax is big
+ # and we guess a little low). This does not noticably affect
+ # accuracy since we're not couting these times.
+ $n = int( $tpra * 1.05 * $n / $tc ); # Linear approximation.
+ my $td = timeit($n, $code);
+ my $new_tc = $td->[1] + $td->[2];
+ # Make sure we are making progress.
+ $tc = $new_tc > 1.2 * $tc ? $new_tc : 1.2 * $tc;
+ }
+
+ # Now, do the 'for real' timing(s), repeating until we exceed
+ # the max.
+ my $ntot = 0;
+ my $rtot = 0;
+ my $utot = 0.0;
+ my $stot = 0.0;
+ my $cutot = 0.0;
+ my $cstot = 0.0;
+ my $ttot = 0.0;
+
+ # The 5% fudge is because $n is often a few % low even for routines
+ # with stable times and avoiding extra timeit()s is nice for
+ # accuracy's sake.
+ $n = int( $n * ( 1.05 * $tmax / $tc ) );
+ $zeros=0;
+ while () {
+ my $td = timeit($n, $code);
+ $ntot += $n;
+ $rtot += $td->[0];
+ $utot += $td->[1];
+ $stot += $td->[2];
+ $cutot += $td->[3];
+ $cstot += $td->[4];
+ $ttot = $utot + $stot;
+ last if $ttot >= $tmax;
+ if ( $ttot <= 0 ) {
+ ++$zeros > 16
+ and die "Timing is consistently zero, cannot benchmark. N=$n\n";
+ } else {
+ $zeros = 0;
+ }
+ $ttot = 0.01 if $ttot < 0.01;
+ my $r = $tmax / $ttot - 1; # Linear approximation.
+ $n = int( $r * $ntot );
+ $n = $nmin if $n < $nmin;
+ }
+
+ return bless [ $rtot, $utot, $stot, $cutot, $cstot, $ntot ];
+}
+
+# --- Functions implementing high-level time-then-print utilities
+
+sub n_to_for {
+ my $n = shift;
+ return $n == 0 ? $default_for : $n < 0 ? -$n : undef;
+}
+
+$_Usage{timethis} = <<'USAGE';
+usage: $result = timethis($time, 'code' ); or
+ $result = timethis($time, sub { code } );
+USAGE
+
+sub timethis{
+ my($n, $code, $title, $style) = @_;
+ my($t, $forn);
+
+ die usage unless defined $code and
+ (!ref $code or ref $code eq 'CODE');
+
+ if ( $n > 0 ) {
+ croak "non-integer loopcount $n, stopped" if int($n)<$n;
+ $t = timeit($n, $code);
+ $title = "timethis $n" unless defined $title;
+ } else {
+ my $fort = n_to_for( $n );
+ $t = countit( $fort, $code );
+ $title = "timethis for $fort" unless defined $title;
+ $forn = $t->[-1];
+ }
+ local $| = 1;
+ $style = "" unless defined $style;
+ printf("%10s: ", $title) unless $style eq 'none';
+ print timestr($t, $style, $Default_Format),"\n" unless $style eq 'none';
+
+ $n = $forn if defined $forn;
+
+ # A conservative warning to spot very silly tests.
+ # Don't assume that your benchmark is ok simply because
+ # you don't get this warning!
+ print " (warning: too few iterations for a reliable count)\n"
+ if $n < $Min_Count
+ || ($t->real < 1 && $n < 1000)
+ || $t->cpu_a < $Min_CPU;
+ $t;
+}
+
+
+$_Usage{timethese} = <<'USAGE';
+usage: timethese($count, { Name1 => 'code1', ... }); or
+ timethese($count, { Name1 => sub { code1 }, ... });
+USAGE
+
+sub timethese{
+ my($n, $alt, $style) = @_;
+ die usage unless ref $alt eq 'HASH';
+
+ my @names = sort keys %$alt;
+ $style = "" unless defined $style;
+ print "Benchmark: " unless $style eq 'none';
+ if ( $n > 0 ) {
+ croak "non-integer loopcount $n, stopped" if int($n)<$n;
+ print "timing $n iterations of" unless $style eq 'none';
+ } else {
+ print "running" unless $style eq 'none';
+ }
+ print " ", join(', ',@names) unless $style eq 'none';
+ unless ( $n > 0 ) {
+ my $for = n_to_for( $n );
+ print ", each" if $n > 1 && $style ne 'none';
+ print " for at least $for CPU seconds" unless $style eq 'none';
+ }
+ print "...\n" unless $style eq 'none';
+
+ # we could save the results in an array and produce a summary here
+ # sum, min, max, avg etc etc
+ my %results;
+ foreach my $name (@names) {
+ $results{$name} = timethis ($n, $alt -> {$name}, $name, $style);
+ }
+
+ return \%results;
+}
+
+
+$_Usage{cmpthese} = <<'USAGE';
+usage: cmpthese($count, { Name1 => 'code1', ... }); or
+ cmpthese($count, { Name1 => sub { code1 }, ... }); or
+ cmpthese($result, $style);
+USAGE
+
+sub cmpthese{
+ my ($results, $style);
+
+ # $count can be a blessed object.
+ if ( ref $_[0] eq 'HASH' ) {
+ ($results, $style) = @_;
+ }
+ else {
+ my($count, $code) = @_[0,1];
+ $style = $_[2] if defined $_[2];
+
+ die usage unless ref $code eq 'HASH';
+
+ $results = timethese($count, $code, ($style || "none"));
+ }
+
+ $style = "" unless defined $style;
+
+ # Flatten in to an array of arrays with the name as the first field
+ my @vals = map{ [ $_, @{$results->{$_}} ] } keys %$results;
+
+ for (@vals) {
+ # The epsilon fudge here is to prevent div by 0. Since clock
+ # resolutions are much larger, it's below the noise floor.
+ my $elapsed = do {
+ if ($style eq 'nop') {$_->[4]+$_->[5]}
+ elsif ($style eq 'noc') {$_->[2]+$_->[3]}
+ else {$_->[2]+$_->[3]+$_->[4]+$_->[5]}
+ };
+ my $rate = $_->[6]/(($elapsed)+0.000000000000001);
+ $_->[7] = $rate;
+ }
+
+ # Sort by rate
+ @vals = sort { $a->[7] <=> $b->[7] } @vals;
+
+ # If more than half of the rates are greater than one...
+ my $display_as_rate = @vals ? ($vals[$#vals>>1]->[7] > 1) : 0;
+
+ my @rows;
+ my @col_widths;
+
+ my @top_row = (
+ '',
+ $display_as_rate ? 'Rate' : 's/iter',
+ map { $_->[0] } @vals
+ );
+
+ push @rows, \@top_row;
+ @col_widths = map { length( $_ ) } @top_row;
+
+ # Build the data rows
+ # We leave the last column in even though it never has any data. Perhaps
+ # it should go away. Also, perhaps a style for a single column of
+ # percentages might be nice.
+ for my $row_val ( @vals ) {
+ my @row;
+
+ # Column 0 = test name
+ push @row, $row_val->[0];
+ $col_widths[0] = length( $row_val->[0] )
+ if length( $row_val->[0] ) > $col_widths[0];
+
+ # Column 1 = performance
+ my $row_rate = $row_val->[7];
+
+ # We assume that we'll never get a 0 rate.
+ my $rate = $display_as_rate ? $row_rate : 1 / $row_rate;
+
+ # Only give a few decimal places before switching to sci. notation,
+ # since the results aren't usually that accurate anyway.
+ my $format =
+ $rate >= 100 ?
+ "%0.0f" :
+ $rate >= 10 ?
+ "%0.1f" :
+ $rate >= 1 ?
+ "%0.2f" :
+ $rate >= 0.1 ?
+ "%0.3f" :
+ "%0.2e";
+
+ $format .= "/s"
+ if $display_as_rate;
+
+ my $formatted_rate = sprintf( $format, $rate );
+ push @row, $formatted_rate;
+ $col_widths[1] = length( $formatted_rate )
+ if length( $formatted_rate ) > $col_widths[1];
+
+ # Columns 2..N = performance ratios
+ my $skip_rest = 0;
+ for ( my $col_num = 0 ; $col_num < @vals ; ++$col_num ) {
+ my $col_val = $vals[$col_num];
+ my $out;
+ if ( $skip_rest ) {
+ $out = '';
+ }
+ elsif ( $col_val->[0] eq $row_val->[0] ) {
+ $out = "--";
+ # $skip_rest = 1;
+ }
+ else {
+ my $col_rate = $col_val->[7];
+ $out = sprintf( "%.0f%%", 100*$row_rate/$col_rate - 100 );
+ }
+ push @row, $out;
+ $col_widths[$col_num+2] = length( $out )
+ if length( $out ) > $col_widths[$col_num+2];
+
+ # A little wierdness to set the first column width properly
+ $col_widths[$col_num+2] = length( $col_val->[0] )
+ if length( $col_val->[0] ) > $col_widths[$col_num+2];
+ }
+ push @rows, \@row;
+ }
+
+ return \@rows if $style eq "none";
+
+ # Equalize column widths in the chart as much as possible without
+ # exceeding 80 characters. This does not use or affect cols 0 or 1.
+ my @sorted_width_refs =
+ sort { $$a <=> $$b } map { \$_ } @col_widths[2..$#col_widths];
+ my $max_width = ${$sorted_width_refs[-1]};
+
+ my $total = @col_widths - 1 ;
+ for ( @col_widths ) { $total += $_ }
+
+ STRETCHER:
+ while ( $total < 80 ) {
+ my $min_width = ${$sorted_width_refs[0]};
+ last
+ if $min_width == $max_width;
+ for ( @sorted_width_refs ) {
+ last
+ if $$_ > $min_width;
+ ++$$_;
+ ++$total;
+ last STRETCHER
+ if $total >= 80;
+ }
+ }
+
+ # Dump the output
+ my $format = join( ' ', map { "%${_}s" } @col_widths ) . "\n";
+ substr( $format, 1, 0 ) = '-';
+ for ( @rows ) {
+ printf $format, @$_;
+ }
+
+ return \@rows ;
+}
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/BerkeleyDB/Btree.pm b/Master/tlpkg/tlperl.straw/lib/BerkeleyDB/Btree.pm
new file mode 100755
index 00000000000..ba9a9c0085d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/BerkeleyDB/Btree.pm
@@ -0,0 +1,8 @@
+
+package BerkeleyDB::Btree ;
+
+# This file is only used for MLDBM
+
+use BerkeleyDB ;
+
+1 ;
diff --git a/Master/tlpkg/tlperl.straw/lib/BerkeleyDB/Hash.pm b/Master/tlpkg/tlperl.straw/lib/BerkeleyDB/Hash.pm
new file mode 100755
index 00000000000..8e7bc7e78c7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/BerkeleyDB/Hash.pm
@@ -0,0 +1,8 @@
+
+package BerkeleyDB::Hash ;
+
+# This file is only used for MLDBM
+
+use BerkeleyDB ;
+
+1 ;
diff --git a/Master/tlpkg/tlperl.straw/lib/CGI.pm b/Master/tlpkg/tlperl.straw/lib/CGI.pm
new file mode 100755
index 00000000000..0cba88172ca
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CGI.pm
@@ -0,0 +1,8059 @@
+package CGI;
+require 5.004;
+use Carp 'croak';
+
+# See the bottom of this file for the POD documentation. Search for the
+# string '=head'.
+
+# You can run this file through either pod2man or pod2html to produce pretty
+# documentation in manual or html file format (these utilities are part of the
+# Perl 5 distribution).
+
+# Copyright 1995-1998 Lincoln D. Stein. All rights reserved.
+# It may be used and modified freely, but I do request that this copyright
+# notice remain attached to the file. You may modify this module as you
+# wish, but if you redistribute a modified version, please attach a note
+# listing the modifications you have made.
+
+# The most recent version and complete docs are available at:
+# http://stein.cshl.org/WWW/software/CGI/
+
+$CGI::revision = '$Id: CGI.pm,v 1.266 2009/07/30 16:32:34 lstein Exp $';
+$CGI::VERSION='3.48';
+
+# HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES.
+# UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING.
+# $CGITempFile::TMPDIRECTORY = '/usr/tmp';
+use CGI::Util qw(rearrange rearrange_header make_attributes unescape escape expires ebcdic2ascii ascii2ebcdic);
+
+#use constant XHTML_DTD => ['-//W3C//DTD XHTML Basic 1.0//EN',
+# 'http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd'];
+
+use constant XHTML_DTD => ['-//W3C//DTD XHTML 1.0 Transitional//EN',
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'];
+
+{
+ local $^W = 0;
+ $TAINTED = substr("$0$^X",0,0);
+}
+
+$MOD_PERL = 0; # no mod_perl by default
+
+#global settings
+$POST_MAX = -1; # no limit to uploaded files
+$DISABLE_UPLOADS = 0;
+
+@SAVED_SYMBOLS = ();
+
+
+# >>>>> Here are some globals that you might want to adjust <<<<<<
+sub initialize_globals {
+ # Set this to 1 to enable copious autoloader debugging messages
+ $AUTOLOAD_DEBUG = 0;
+
+ # Set this to 1 to generate XTML-compatible output
+ $XHTML = 1;
+
+ # Change this to the preferred DTD to print in start_html()
+ # or use default_dtd('text of DTD to use');
+ $DEFAULT_DTD = [ '-//W3C//DTD HTML 4.01 Transitional//EN',
+ 'http://www.w3.org/TR/html4/loose.dtd' ] ;
+
+ # Set this to 1 to enable NOSTICKY scripts
+ # or:
+ # 1) use CGI '-nosticky';
+ # 2) $CGI::NOSTICKY = 1;
+ $NOSTICKY = 0;
+
+ # Set this to 1 to enable NPH scripts
+ # or:
+ # 1) use CGI qw(-nph)
+ # 2) CGI::nph(1)
+ # 3) print header(-nph=>1)
+ $NPH = 0;
+
+ # Set this to 1 to enable debugging from @ARGV
+ # Set to 2 to enable debugging from STDIN
+ $DEBUG = 1;
+
+ # Set this to 1 to make the temporary files created
+ # during file uploads safe from prying eyes
+ # or do...
+ # 1) use CGI qw(:private_tempfiles)
+ # 2) CGI::private_tempfiles(1);
+ $PRIVATE_TEMPFILES = 0;
+
+ # Set this to 1 to generate automatic tab indexes
+ $TABINDEX = 0;
+
+ # Set this to 1 to cause files uploaded in multipart documents
+ # to be closed, instead of caching the file handle
+ # or:
+ # 1) use CGI qw(:close_upload_files)
+ # 2) $CGI::close_upload_files(1);
+ # Uploads with many files run out of file handles.
+ # Also, for performance, since the file is already on disk,
+ # it can just be renamed, instead of read and written.
+ $CLOSE_UPLOAD_FILES = 0;
+
+ # Automatically determined -- don't change
+ $EBCDIC = 0;
+
+ # Change this to 1 to suppress redundant HTTP headers
+ $HEADERS_ONCE = 0;
+
+ # separate the name=value pairs by semicolons rather than ampersands
+ $USE_PARAM_SEMICOLONS = 1;
+
+ # Do not include undefined params parsed from query string
+ # use CGI qw(-no_undef_params);
+ $NO_UNDEF_PARAMS = 0;
+
+ # return everything as utf-8
+ $PARAM_UTF8 = 0;
+
+ # Other globals that you shouldn't worry about.
+ undef $Q;
+ $BEEN_THERE = 0;
+ $DTD_PUBLIC_IDENTIFIER = "";
+ undef @QUERY_PARAM;
+ undef %EXPORT;
+ undef $QUERY_CHARSET;
+ undef %QUERY_FIELDNAMES;
+ undef %QUERY_TMPFILES;
+
+ # prevent complaints by mod_perl
+ 1;
+}
+
+# ------------------ START OF THE LIBRARY ------------
+
+#### Method: endform
+# This method is DEPRECATED
+*endform = \&end_form;
+
+# make mod_perlhappy
+initialize_globals();
+
+# FIGURE OUT THE OS WE'RE RUNNING UNDER
+# Some systems support the $^O variable. If not
+# available then require() the Config library
+unless ($OS) {
+ unless ($OS = $^O) {
+ require Config;
+ $OS = $Config::Config{'osname'};
+ }
+}
+if ($OS =~ /^MSWin/i) {
+ $OS = 'WINDOWS';
+} elsif ($OS =~ /^VMS/i) {
+ $OS = 'VMS';
+} elsif ($OS =~ /^dos/i) {
+ $OS = 'DOS';
+} elsif ($OS =~ /^MacOS/i) {
+ $OS = 'MACINTOSH';
+} elsif ($OS =~ /^os2/i) {
+ $OS = 'OS2';
+} elsif ($OS =~ /^epoc/i) {
+ $OS = 'EPOC';
+} elsif ($OS =~ /^cygwin/i) {
+ $OS = 'CYGWIN';
+} elsif ($OS =~ /^NetWare/i) {
+ $OS = 'NETWARE';
+} else {
+ $OS = 'UNIX';
+}
+
+# Some OS logic. Binary mode enabled on DOS, NT and VMS
+$needs_binmode = $OS=~/^(WINDOWS|DOS|OS2|MSWin|CYGWIN|NETWARE)/;
+
+# This is the default class for the CGI object to use when all else fails.
+$DefaultClass = 'CGI' unless defined $CGI::DefaultClass;
+
+# This is where to look for autoloaded routines.
+$AutoloadClass = $DefaultClass unless defined $CGI::AutoloadClass;
+
+# The path separator is a slash, backslash or semicolon, depending
+# on the paltform.
+$SL = {
+ UNIX => '/', OS2 => '\\', EPOC => '/', CYGWIN => '/', NETWARE => '/',
+ WINDOWS => '\\', DOS => '\\', MACINTOSH => ':', VMS => '/'
+ }->{$OS};
+
+# This no longer seems to be necessary
+# Turn on NPH scripts by default when running under IIS server!
+# $NPH++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/;
+$IIS++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/;
+
+# Turn on special checking for ActiveState's PerlEx
+$PERLEX++ if defined($ENV{'GATEWAY_INTERFACE'}) && $ENV{'GATEWAY_INTERFACE'} =~ /^CGI-PerlEx/;
+
+# Turn on special checking for Doug MacEachern's modperl
+# PerlEx::DBI tries to fool DBI by setting MOD_PERL
+if (exists $ENV{MOD_PERL} && ! $PERLEX) {
+ # mod_perl handlers may run system() on scripts using CGI.pm;
+ # Make sure so we don't get fooled by inherited $ENV{MOD_PERL}
+ if (exists $ENV{MOD_PERL_API_VERSION} && $ENV{MOD_PERL_API_VERSION} == 2) {
+ $MOD_PERL = 2;
+ require Apache2::Response;
+ require Apache2::RequestRec;
+ require Apache2::RequestUtil;
+ require Apache2::RequestIO;
+ require APR::Pool;
+ } else {
+ $MOD_PERL = 1;
+ require Apache;
+ }
+}
+
+# Define the CRLF sequence. I can't use a simple "\r\n" because the meaning
+# of "\n" is different on different OS's (sometimes it generates CRLF, sometimes LF
+# and sometimes CR). The most popular VMS web server
+# doesn't accept CRLF -- instead it wants a LR. EBCDIC machines don't
+# use ASCII, so \015\012 means something different. I find this all
+# really annoying.
+$EBCDIC = "\t" ne "\011";
+if ($OS eq 'VMS') {
+ $CRLF = "\n";
+} elsif ($EBCDIC) {
+ $CRLF= "\r\n";
+} else {
+ $CRLF = "\015\012";
+}
+
+if ($needs_binmode) {
+ $CGI::DefaultClass->binmode(\*main::STDOUT);
+ $CGI::DefaultClass->binmode(\*main::STDIN);
+ $CGI::DefaultClass->binmode(\*main::STDERR);
+}
+
+%EXPORT_TAGS = (
+ ':html2'=>['h1'..'h6',qw/p br hr ol ul li dl dt dd menu code var strong em
+ tt u i b blockquote pre img a address cite samp dfn html head
+ base body Link nextid title meta kbd start_html end_html
+ input Select option comment charset escapeHTML/],
+ ':html3'=>[qw/div table caption th td TR Tr sup Sub strike applet Param nobr
+ embed basefont style span layer ilayer font frameset frame script small big Area Map/],
+ ':html4'=>[qw/abbr acronym bdo col colgroup del fieldset iframe
+ ins label legend noframes noscript object optgroup Q
+ thead tbody tfoot/],
+ ':netscape'=>[qw/blink fontsize center/],
+ ':form'=>[qw/textfield textarea filefield password_field hidden checkbox checkbox_group
+ submit reset defaults radio_group popup_menu button autoEscape
+ scrolling_list image_button start_form end_form startform endform
+ start_multipart_form end_multipart_form isindex tmpFileName uploadInfo URL_ENCODED MULTIPART/],
+ ':cgi'=>[qw/param upload path_info path_translated request_uri url self_url script_name
+ cookie Dump
+ raw_cookie request_method query_string Accept user_agent remote_host content_type
+ remote_addr referer server_name server_software server_port server_protocol virtual_port
+ virtual_host remote_ident auth_type http append
+ save_parameters restore_parameters param_fetch
+ remote_user user_name header redirect import_names put
+ Delete Delete_all url_param cgi_error/],
+ ':ssl' => [qw/https/],
+ ':cgi-lib' => [qw/ReadParse PrintHeader HtmlTop HtmlBot SplitParam Vars/],
+ ':html' => [qw/:html2 :html3 :html4 :netscape/],
+ ':standard' => [qw/:html2 :html3 :html4 :form :cgi/],
+ ':push' => [qw/multipart_init multipart_start multipart_end multipart_final/],
+ ':all' => [qw/:html2 :html3 :netscape :form :cgi :internal :html4/]
+ );
+
+# Custom 'can' method for both autoloaded and non-autoloaded subroutines.
+# Author: Cees Hek <cees@sitesuite.com.au>
+
+sub can {
+ my($class, $method) = @_;
+
+ # See if UNIVERSAL::can finds it.
+
+ if (my $func = $class -> SUPER::can($method) ){
+ return $func;
+ }
+
+ # Try to compile the function.
+
+ eval {
+ # _compile looks at $AUTOLOAD for the function name.
+
+ local $AUTOLOAD = join "::", $class, $method;
+ &_compile;
+ };
+
+ # Now that the function is loaded (if it exists)
+ # just use UNIVERSAL::can again to do the work.
+
+ return $class -> SUPER::can($method);
+}
+
+# to import symbols into caller
+sub import {
+ my $self = shift;
+
+ # This causes modules to clash.
+ undef %EXPORT_OK;
+ undef %EXPORT;
+
+ $self->_setup_symbols(@_);
+ my ($callpack, $callfile, $callline) = caller;
+
+ # To allow overriding, search through the packages
+ # Till we find one in which the correct subroutine is defined.
+ my @packages = ($self,@{"$self\:\:ISA"});
+ for $sym (keys %EXPORT) {
+ my $pck;
+ my $def = ${"$self\:\:AutoloadClass"} || $DefaultClass;
+ for $pck (@packages) {
+ if (defined(&{"$pck\:\:$sym"})) {
+ $def = $pck;
+ last;
+ }
+ }
+ *{"${callpack}::$sym"} = \&{"$def\:\:$sym"};
+ }
+}
+
+sub compile {
+ my $pack = shift;
+ $pack->_setup_symbols('-compile',@_);
+}
+
+sub expand_tags {
+ my($tag) = @_;
+ return ("start_$1","end_$1") if $tag=~/^(?:\*|start_|end_)(.+)/;
+ my(@r);
+ return ($tag) unless $EXPORT_TAGS{$tag};
+ for (@{$EXPORT_TAGS{$tag}}) {
+ push(@r,&expand_tags($_));
+ }
+ return @r;
+}
+
+#### Method: new
+# The new routine. This will check the current environment
+# for an existing query string, and initialize itself, if so.
+####
+sub new {
+ my($class,@initializer) = @_;
+ my $self = {};
+
+ bless $self,ref $class || $class || $DefaultClass;
+
+ # always use a tempfile
+ $self->{'use_tempfile'} = 1;
+
+ if (ref($initializer[0])
+ && (UNIVERSAL::isa($initializer[0],'Apache')
+ ||
+ UNIVERSAL::isa($initializer[0],'Apache2::RequestRec')
+ )) {
+ $self->r(shift @initializer);
+ }
+ if (ref($initializer[0])
+ && (UNIVERSAL::isa($initializer[0],'CODE'))) {
+ $self->upload_hook(shift @initializer, shift @initializer);
+ $self->{'use_tempfile'} = shift @initializer if (@initializer > 0);
+ }
+ if ($MOD_PERL) {
+ if ($MOD_PERL == 1) {
+ $self->r(Apache->request) unless $self->r;
+ my $r = $self->r;
+ $r->register_cleanup(\&CGI::_reset_globals);
+ $self->_setup_symbols(@SAVED_SYMBOLS) if @SAVED_SYMBOLS;
+ }
+ else {
+ # XXX: once we have the new API
+ # will do a real PerlOptions -SetupEnv check
+ $self->r(Apache2::RequestUtil->request) unless $self->r;
+ my $r = $self->r;
+ $r->subprocess_env unless exists $ENV{REQUEST_METHOD};
+ $r->pool->cleanup_register(\&CGI::_reset_globals);
+ $self->_setup_symbols(@SAVED_SYMBOLS) if @SAVED_SYMBOLS;
+ }
+ undef $NPH;
+ }
+ $self->_reset_globals if $PERLEX;
+ $self->init(@initializer);
+ return $self;
+}
+
+# We provide a DESTROY method so that we can ensure that
+# temporary files are closed (via Fh->DESTROY) before they
+# are unlinked (via CGITempFile->DESTROY) because it is not
+# possible to unlink an open file on Win32. We explicitly
+# call DESTROY on each, rather than just undefing them and
+# letting Perl DESTROY them by garbage collection, in case the
+# user is still holding any reference to them as well.
+sub DESTROY {
+ my $self = shift;
+ if ($OS eq 'WINDOWS') {
+ for my $href (values %{$self->{'.tmpfiles'}}) {
+ $href->{hndl}->DESTROY if defined $href->{hndl};
+ $href->{name}->DESTROY if defined $href->{name};
+ }
+ }
+}
+
+sub r {
+ my $self = shift;
+ my $r = $self->{'.r'};
+ $self->{'.r'} = shift if @_;
+ $r;
+}
+
+sub upload_hook {
+ my $self;
+ if (ref $_[0] eq 'CODE') {
+ $CGI::Q = $self = $CGI::DefaultClass->new(@_);
+ } else {
+ $self = shift;
+ }
+ my ($hook,$data,$use_tempfile) = @_;
+ $self->{'.upload_hook'} = $hook;
+ $self->{'.upload_data'} = $data;
+ $self->{'use_tempfile'} = $use_tempfile if defined $use_tempfile;
+}
+
+#### Method: param
+# Returns the value(s)of a named parameter.
+# If invoked in a list context, returns the
+# entire list. Otherwise returns the first
+# member of the list.
+# If name is not provided, return a list of all
+# the known parameters names available.
+# If more than one argument is provided, the
+# second and subsequent arguments are used to
+# set the value of the parameter.
+####
+sub param {
+ my($self,@p) = self_or_default(@_);
+ return $self->all_parameters unless @p;
+ my($name,$value,@other);
+
+ # For compatibility between old calling style and use_named_parameters() style,
+ # we have to special case for a single parameter present.
+ if (@p > 1) {
+ ($name,$value,@other) = rearrange([NAME,[DEFAULT,VALUE,VALUES]],@p);
+ my(@values);
+
+ if (substr($p[0],0,1) eq '-') {
+ @values = defined($value) ? (ref($value) && ref($value) eq 'ARRAY' ? @{$value} : $value) : ();
+ } else {
+ for ($value,@other) {
+ push(@values,$_) if defined($_);
+ }
+ }
+ # If values is provided, then we set it.
+ if (@values or defined $value) {
+ $self->add_parameter($name);
+ $self->{param}{$name}=[@values];
+ }
+ } else {
+ $name = $p[0];
+ }
+
+ return unless defined($name) && $self->{param}{$name};
+
+ my @result = @{$self->{param}{$name}};
+
+ if ($PARAM_UTF8) {
+ eval "require Encode; 1;" unless Encode->can('decode'); # bring in these functions
+ @result = map {ref $_ ? $_ : $self->_decode_utf8($_) } @result;
+ }
+
+ return wantarray ? @result : $result[0];
+}
+
+sub _decode_utf8 {
+ my ($self, $val) = @_;
+
+ if (Encode::is_utf8($val)) {
+ return $val;
+ }
+ else {
+ return Encode::decode(utf8 => $val);
+ }
+}
+
+sub self_or_default {
+ return @_ if defined($_[0]) && (!ref($_[0])) &&($_[0] eq 'CGI');
+ unless (defined($_[0]) &&
+ (ref($_[0]) eq 'CGI' || UNIVERSAL::isa($_[0],'CGI')) # slightly optimized for common case
+ ) {
+ $Q = $CGI::DefaultClass->new unless defined($Q);
+ unshift(@_,$Q);
+ }
+ return wantarray ? @_ : $Q;
+}
+
+sub self_or_CGI {
+ local $^W=0; # prevent a warning
+ if (defined($_[0]) &&
+ (substr(ref($_[0]),0,3) eq 'CGI'
+ || UNIVERSAL::isa($_[0],'CGI'))) {
+ return @_;
+ } else {
+ return ($DefaultClass,@_);
+ }
+}
+
+########################################
+# THESE METHODS ARE MORE OR LESS PRIVATE
+# GO TO THE __DATA__ SECTION TO SEE MORE
+# PUBLIC METHODS
+########################################
+
+# Initialize the query object from the environment.
+# If a parameter list is found, this object will be set
+# to a hash in which parameter names are keys
+# and the values are stored as lists
+# If a keyword list is found, this method creates a bogus
+# parameter list with the single parameter 'keywords'.
+
+sub init {
+ my $self = shift;
+ my($query_string,$meth,$content_length,$fh,@lines) = ('','','','');
+
+ my $is_xforms;
+
+ my $initializer = shift; # for backward compatibility
+ local($/) = "\n";
+
+ # set autoescaping on by default
+ $self->{'escape'} = 1;
+
+ # if we get called more than once, we want to initialize
+ # ourselves from the original query (which may be gone
+ # if it was read from STDIN originally.)
+ if (defined(@QUERY_PARAM) && !defined($initializer)) {
+ for my $name (@QUERY_PARAM) {
+ my $val = $QUERY_PARAM{$name}; # always an arrayref;
+ $self->param('-name'=>$name,'-value'=> $val);
+ if (defined $val and ref $val eq 'ARRAY') {
+ for my $fh (grep {defined(fileno($_))} @$val) {
+ seek($fh,0,0); # reset the filehandle.
+ }
+
+ }
+ }
+ $self->charset($QUERY_CHARSET);
+ $self->{'.fieldnames'} = {%QUERY_FIELDNAMES};
+ $self->{'.tmpfiles'} = {%QUERY_TMPFILES};
+ return;
+ }
+
+ $meth=$ENV{'REQUEST_METHOD'} if defined($ENV{'REQUEST_METHOD'});
+ $content_length = defined($ENV{'CONTENT_LENGTH'}) ? $ENV{'CONTENT_LENGTH'} : 0;
+
+ $fh = to_filehandle($initializer) if $initializer;
+
+ # set charset to the safe ISO-8859-1
+ $self->charset('ISO-8859-1');
+
+ METHOD: {
+
+ # avoid unreasonably large postings
+ if (($POST_MAX > 0) && ($content_length > $POST_MAX)) {
+ #discard the post, unread
+ $self->cgi_error("413 Request entity too large");
+ last METHOD;
+ }
+
+ # Process multipart postings, but only if the initializer is
+ # not defined.
+ if ($meth eq 'POST'
+ && defined($ENV{'CONTENT_TYPE'})
+ && $ENV{'CONTENT_TYPE'}=~m|^multipart/form-data|
+ && !defined($initializer)
+ ) {
+ my($boundary) = $ENV{'CONTENT_TYPE'} =~ /boundary=\"?([^\";,]+)\"?/;
+ $self->read_multipart($boundary,$content_length);
+ last METHOD;
+ }
+
+ # Process XForms postings. We know that we have XForms in the
+ # following cases:
+ # method eq 'POST' && content-type eq 'application/xml'
+ # method eq 'POST' && content-type =~ /multipart\/related.+start=/
+ # There are more cases, actually, but for now, we don't support other
+ # methods for XForm posts.
+ # In a XForm POST, the QUERY_STRING is parsed normally.
+ # If the content-type is 'application/xml', we just set the param
+ # XForms:Model (referring to the xml syntax) param containing the
+ # unparsed XML data.
+ # In the case of multipart/related we set XForms:Model as above, but
+ # the other parts are available as uploads with the Content-ID as the
+ # the key.
+ # See the URL below for XForms specs on this issue.
+ # http://www.w3.org/TR/2006/REC-xforms-20060314/slice11.html#submit-options
+ if ($meth eq 'POST' && defined($ENV{'CONTENT_TYPE'})) {
+ if ($ENV{'CONTENT_TYPE'} eq 'application/xml') {
+ my($param) = 'XForms:Model';
+ my($value) = '';
+ $self->add_parameter($param);
+ $self->read_from_client(\$value,$content_length,0)
+ if $content_length > 0;
+ push (@{$self->{param}{$param}},$value);
+ $is_xforms = 1;
+ } elsif ($ENV{'CONTENT_TYPE'} =~ /multipart\/related.+boundary=\"?([^\";,]+)\"?.+start=\"?\<?([^\"\>]+)\>?\"?/) {
+ my($boundary,$start) = ($1,$2);
+ my($param) = 'XForms:Model';
+ $self->add_parameter($param);
+ my($value) = $self->read_multipart_related($start,$boundary,$content_length,0);
+ push (@{$self->{param}{$param}},$value);
+ if ($MOD_PERL) {
+ $query_string = $self->r->args;
+ } else {
+ $query_string = $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
+ $query_string ||= $ENV{'REDIRECT_QUERY_STRING'} if defined $ENV{'REDIRECT_QUERY_STRING'};
+ }
+ $is_xforms = 1;
+ }
+ }
+
+
+ # If initializer is defined, then read parameters
+ # from it.
+ if (!$is_xforms && defined($initializer)) {
+ if (UNIVERSAL::isa($initializer,'CGI')) {
+ $query_string = $initializer->query_string;
+ last METHOD;
+ }
+ if (ref($initializer) && ref($initializer) eq 'HASH') {
+ for (keys %$initializer) {
+ $self->param('-name'=>$_,'-value'=>$initializer->{$_});
+ }
+ last METHOD;
+ }
+
+ if (defined($fh) && ($fh ne '')) {
+ while (my $line = <$fh>) {
+ chomp $line;
+ last if $line =~ /^=$/;
+ push(@lines,$line);
+ }
+ # massage back into standard format
+ if ("@lines" =~ /=/) {
+ $query_string=join("&",@lines);
+ } else {
+ $query_string=join("+",@lines);
+ }
+ last METHOD;
+ }
+
+ # last chance -- treat it as a string
+ $initializer = $$initializer if ref($initializer) eq 'SCALAR';
+ $query_string = $initializer;
+
+ last METHOD;
+ }
+
+ # If method is GET or HEAD, fetch the query from
+ # the environment.
+ if ($is_xforms || $meth=~/^(GET|HEAD)$/) {
+ if ($MOD_PERL) {
+ $query_string = $self->r->args;
+ } else {
+ $query_string = $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
+ $query_string ||= $ENV{'REDIRECT_QUERY_STRING'} if defined $ENV{'REDIRECT_QUERY_STRING'};
+ }
+ last METHOD;
+ }
+
+ if ($meth eq 'POST' || $meth eq 'PUT') {
+ if ( $content_length > 0 ) {
+ $self->read_from_client(\$query_string,$content_length,0);
+ }
+ else {
+ $self->read_from_stdin(\$query_string);
+ # should this be PUTDATA in case of PUT ?
+ my($param) = $meth . 'DATA' ;
+ $self->add_parameter($param) ;
+ push (@{$self->{param}{$param}},$query_string);
+ undef $query_string ;
+ }
+ # Some people want to have their cake and eat it too!
+ # Uncomment this line to have the contents of the query string
+ # APPENDED to the POST data.
+ # $query_string .= (length($query_string) ? '&' : '') . $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
+ last METHOD;
+ }
+
+ # If $meth is not of GET, POST, PUT or HEAD, assume we're
+ # being debugged offline.
+ # Check the command line and then the standard input for data.
+ # We use the shellwords package in order to behave the way that
+ # UN*X programmers expect.
+ if ($DEBUG)
+ {
+ my $cmdline_ret = read_from_cmdline();
+ $query_string = $cmdline_ret->{'query_string'};
+ if (defined($cmdline_ret->{'subpath'}))
+ {
+ $self->path_info($cmdline_ret->{'subpath'});
+ }
+ }
+ }
+
+# YL: Begin Change for XML handler 10/19/2001
+ if (!$is_xforms && ($meth eq 'POST' || $meth eq 'PUT')
+ && defined($ENV{'CONTENT_TYPE'})
+ && $ENV{'CONTENT_TYPE'} !~ m|^application/x-www-form-urlencoded|
+ && $ENV{'CONTENT_TYPE'} !~ m|^multipart/form-data| ) {
+ my($param) = $meth . 'DATA' ;
+ $self->add_parameter($param) ;
+ push (@{$self->{param}{$param}},$query_string);
+ undef $query_string ;
+ }
+# YL: End Change for XML handler 10/19/2001
+
+ # We now have the query string in hand. We do slightly
+ # different things for keyword lists and parameter lists.
+ if (defined $query_string && length $query_string) {
+ if ($query_string =~ /[&=;]/) {
+ $self->parse_params($query_string);
+ } else {
+ $self->add_parameter('keywords');
+ $self->{param}{'keywords'} = [$self->parse_keywordlist($query_string)];
+ }
+ }
+
+ # Special case. Erase everything if there is a field named
+ # .defaults.
+ if ($self->param('.defaults')) {
+ $self->delete_all();
+ }
+
+ # hash containing our defined fieldnames
+ $self->{'.fieldnames'} = {};
+ for ($self->param('.cgifields')) {
+ $self->{'.fieldnames'}->{$_}++;
+ }
+
+ # Clear out our default submission button flag if present
+ $self->delete('.submit');
+ $self->delete('.cgifields');
+
+ $self->save_request unless defined $initializer;
+}
+
+# FUNCTIONS TO OVERRIDE:
+# Turn a string into a filehandle
+sub to_filehandle {
+ my $thingy = shift;
+ return undef unless $thingy;
+ return $thingy if UNIVERSAL::isa($thingy,'GLOB');
+ return $thingy if UNIVERSAL::isa($thingy,'FileHandle');
+ if (!ref($thingy)) {
+ my $caller = 1;
+ while (my $package = caller($caller++)) {
+ my($tmp) = $thingy=~/[\':]/ ? $thingy : "$package\:\:$thingy";
+ return $tmp if defined(fileno($tmp));
+ }
+ }
+ return undef;
+}
+
+# send output to the browser
+sub put {
+ my($self,@p) = self_or_default(@_);
+ $self->print(@p);
+}
+
+# print to standard output (for overriding in mod_perl)
+sub print {
+ shift;
+ CORE::print(@_);
+}
+
+# get/set last cgi_error
+sub cgi_error {
+ my ($self,$err) = self_or_default(@_);
+ $self->{'.cgi_error'} = $err if defined $err;
+ return $self->{'.cgi_error'};
+}
+
+sub save_request {
+ my($self) = @_;
+ # We're going to play with the package globals now so that if we get called
+ # again, we initialize ourselves in exactly the same way. This allows
+ # us to have several of these objects.
+ @QUERY_PARAM = $self->param; # save list of parameters
+ for (@QUERY_PARAM) {
+ next unless defined $_;
+ $QUERY_PARAM{$_}=$self->{param}{$_};
+ }
+ $QUERY_CHARSET = $self->charset;
+ %QUERY_FIELDNAMES = %{$self->{'.fieldnames'}};
+ %QUERY_TMPFILES = %{ $self->{'.tmpfiles'} || {} };
+}
+
+sub parse_params {
+ my($self,$tosplit) = @_;
+ my(@pairs) = split(/[&;]/,$tosplit);
+ my($param,$value);
+ for (@pairs) {
+ ($param,$value) = split('=',$_,2);
+ next unless defined $param;
+ next if $NO_UNDEF_PARAMS and not defined $value;
+ $value = '' unless defined $value;
+ $param = unescape($param);
+ $value = unescape($value);
+ $self->add_parameter($param);
+ push (@{$self->{param}{$param}},$value);
+ }
+}
+
+sub add_parameter {
+ my($self,$param)=@_;
+ return unless defined $param;
+ push (@{$self->{'.parameters'}},$param)
+ unless defined($self->{param}{$param});
+}
+
+sub all_parameters {
+ my $self = shift;
+ return () unless defined($self) && $self->{'.parameters'};
+ return () unless @{$self->{'.parameters'}};
+ return @{$self->{'.parameters'}};
+}
+
+# put a filehandle into binary mode (DOS)
+sub binmode {
+ return unless defined($_[1]) && defined fileno($_[1]);
+ CORE::binmode($_[1]);
+}
+
+sub _make_tag_func {
+ my ($self,$tagname) = @_;
+ my $func = qq(
+ sub $tagname {
+ my (\$q,\$a,\@rest) = self_or_default(\@_);
+ my(\$attr) = '';
+ if (ref(\$a) && ref(\$a) eq 'HASH') {
+ my(\@attr) = make_attributes(\$a,\$q->{'escape'});
+ \$attr = " \@attr" if \@attr;
+ } else {
+ unshift \@rest,\$a if defined \$a;
+ }
+ );
+ if ($tagname=~/start_(\w+)/i) {
+ $func .= qq! return "<\L$1\E\$attr>";} !;
+ } elsif ($tagname=~/end_(\w+)/i) {
+ $func .= qq! return "<\L/$1\E>"; } !;
+ } else {
+ $func .= qq#
+ return \$XHTML ? "\L<$tagname\E\$attr />" : "\L<$tagname\E\$attr>" unless \@rest;
+ my(\$tag,\$untag) = ("\L<$tagname\E\$attr>","\L</$tagname>\E");
+ my \@result = map { "\$tag\$_\$untag" }
+ (ref(\$rest[0]) eq 'ARRAY') ? \@{\$rest[0]} : "\@rest";
+ return "\@result";
+ }#;
+ }
+return $func;
+}
+
+sub AUTOLOAD {
+ print STDERR "CGI::AUTOLOAD for $AUTOLOAD\n" if $CGI::AUTOLOAD_DEBUG;
+ my $func = &_compile;
+ goto &$func;
+}
+
+sub _compile {
+ my($func) = $AUTOLOAD;
+ my($pack,$func_name);
+ {
+ local($1,$2); # this fixes an obscure variable suicide problem.
+ $func=~/(.+)::([^:]+)$/;
+ ($pack,$func_name) = ($1,$2);
+ $pack=~s/::SUPER$//; # fix another obscure problem
+ $pack = ${"$pack\:\:AutoloadClass"} || $CGI::DefaultClass
+ unless defined(${"$pack\:\:AUTOLOADED_ROUTINES"});
+
+ my($sub) = \%{"$pack\:\:SUBS"};
+ unless (%$sub) {
+ my($auto) = \${"$pack\:\:AUTOLOADED_ROUTINES"};
+ local ($@,$!);
+ eval "package $pack; $$auto";
+ croak("$AUTOLOAD: $@") if $@;
+ $$auto = ''; # Free the unneeded storage (but don't undef it!!!)
+ }
+ my($code) = $sub->{$func_name};
+
+ $code = "sub $AUTOLOAD { }" if (!$code and $func_name eq 'DESTROY');
+ if (!$code) {
+ (my $base = $func_name) =~ s/^(start_|end_)//i;
+ if ($EXPORT{':any'} ||
+ $EXPORT{'-any'} ||
+ $EXPORT{$base} ||
+ (%EXPORT_OK || grep(++$EXPORT_OK{$_},&expand_tags(':html')))
+ && $EXPORT_OK{$base}) {
+ $code = $CGI::DefaultClass->_make_tag_func($func_name);
+ }
+ }
+ croak("Undefined subroutine $AUTOLOAD\n") unless $code;
+ local ($@,$!);
+ eval "package $pack; $code";
+ if ($@) {
+ $@ =~ s/ at .*\n//;
+ croak("$AUTOLOAD: $@");
+ }
+ }
+ CORE::delete($sub->{$func_name}); #free storage
+ return "$pack\:\:$func_name";
+}
+
+sub _selected {
+ my $self = shift;
+ my $value = shift;
+ return '' unless $value;
+ return $XHTML ? qq(selected="selected" ) : qq(selected );
+}
+
+sub _checked {
+ my $self = shift;
+ my $value = shift;
+ return '' unless $value;
+ return $XHTML ? qq(checked="checked" ) : qq(checked );
+}
+
+sub _reset_globals { initialize_globals(); }
+
+sub _setup_symbols {
+ my $self = shift;
+ my $compile = 0;
+
+ # to avoid reexporting unwanted variables
+ undef %EXPORT;
+
+ for (@_) {
+ $HEADERS_ONCE++, next if /^[:-]unique_headers$/;
+ $NPH++, next if /^[:-]nph$/;
+ $NOSTICKY++, next if /^[:-]nosticky$/;
+ $DEBUG=0, next if /^[:-]no_?[Dd]ebug$/;
+ $DEBUG=2, next if /^[:-][Dd]ebug$/;
+ $USE_PARAM_SEMICOLONS++, next if /^[:-]newstyle_urls$/;
+ $PARAM_UTF8++, next if /^[:-]utf8$/;
+ $XHTML++, next if /^[:-]xhtml$/;
+ $XHTML=0, next if /^[:-]no_?xhtml$/;
+ $USE_PARAM_SEMICOLONS=0, next if /^[:-]oldstyle_urls$/;
+ $PRIVATE_TEMPFILES++, next if /^[:-]private_tempfiles$/;
+ $TABINDEX++, next if /^[:-]tabindex$/;
+ $CLOSE_UPLOAD_FILES++, next if /^[:-]close_upload_files$/;
+ $EXPORT{$_}++, next if /^[:-]any$/;
+ $compile++, next if /^[:-]compile$/;
+ $NO_UNDEF_PARAMS++, next if /^[:-]no_undef_params$/;
+
+ # This is probably extremely evil code -- to be deleted some day.
+ if (/^[-]autoload$/) {
+ my($pkg) = caller(1);
+ *{"${pkg}::AUTOLOAD"} = sub {
+ my($routine) = $AUTOLOAD;
+ $routine =~ s/^.*::/CGI::/;
+ &$routine;
+ };
+ next;
+ }
+
+ for (&expand_tags($_)) {
+ tr/a-zA-Z0-9_//cd; # don't allow weird function names
+ $EXPORT{$_}++;
+ }
+ }
+ _compile_all(keys %EXPORT) if $compile;
+ @SAVED_SYMBOLS = @_;
+}
+
+sub charset {
+ my ($self,$charset) = self_or_default(@_);
+ $self->{'.charset'} = $charset if defined $charset;
+ $self->{'.charset'};
+}
+
+sub element_id {
+ my ($self,$new_value) = self_or_default(@_);
+ $self->{'.elid'} = $new_value if defined $new_value;
+ sprintf('%010d',$self->{'.elid'}++);
+}
+
+sub element_tab {
+ my ($self,$new_value) = self_or_default(@_);
+ $self->{'.etab'} ||= 1;
+ $self->{'.etab'} = $new_value if defined $new_value;
+ my $tab = $self->{'.etab'}++;
+ return '' unless $TABINDEX or defined $new_value;
+ return qq(tabindex="$tab" );
+}
+
+###############################################################################
+################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND ####################
+###############################################################################
+$AUTOLOADED_ROUTINES = ''; # get rid of -w warning
+$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
+
+%SUBS = (
+
+'URL_ENCODED'=> <<'END_OF_FUNC',
+sub URL_ENCODED { 'application/x-www-form-urlencoded'; }
+END_OF_FUNC
+
+'MULTIPART' => <<'END_OF_FUNC',
+sub MULTIPART { 'multipart/form-data'; }
+END_OF_FUNC
+
+'SERVER_PUSH' => <<'END_OF_FUNC',
+sub SERVER_PUSH { 'multipart/x-mixed-replace;boundary="' . shift() . '"'; }
+END_OF_FUNC
+
+'new_MultipartBuffer' => <<'END_OF_FUNC',
+# Create a new multipart buffer
+sub new_MultipartBuffer {
+ my($self,$boundary,$length) = @_;
+ return MultipartBuffer->new($self,$boundary,$length);
+}
+END_OF_FUNC
+
+'read_from_client' => <<'END_OF_FUNC',
+# Read data from a file handle
+sub read_from_client {
+ my($self, $buff, $len, $offset) = @_;
+ local $^W=0; # prevent a warning
+ return $MOD_PERL
+ ? $self->r->read($$buff, $len, $offset)
+ : read(\*STDIN, $$buff, $len, $offset);
+}
+END_OF_FUNC
+
+'read_from_stdin' => <<'END_OF_FUNC',
+# Read data from stdin until all is read
+sub read_from_stdin {
+ my($self, $buff) = @_;
+ local $^W=0; # prevent a warning
+
+ #
+ # TODO: loop over STDIN until all is read
+ #
+
+ my($eoffound) = 0;
+ my($localbuf) = '';
+ my($tempbuf) = '';
+ my($bufsiz) = 1024;
+ my($res);
+ while ($eoffound == 0) {
+ if ( $MOD_PERL ) {
+ $res = $self->r->read($tempbuf, $bufsiz, 0)
+ }
+ else {
+ $res = read(\*STDIN, $tempbuf, $bufsiz);
+ }
+
+ if ( !defined($res) ) {
+ # TODO: how to do error reporting ?
+ $eoffound = 1;
+ last;
+ }
+ if ( $res == 0 ) {
+ $eoffound = 1;
+ last;
+ }
+ $localbuf .= $tempbuf;
+ }
+
+ $$buff = $localbuf;
+
+ return $res;
+}
+END_OF_FUNC
+
+'delete' => <<'END_OF_FUNC',
+#### Method: delete
+# Deletes the named parameter entirely.
+####
+sub delete {
+ my($self,@p) = self_or_default(@_);
+ my(@names) = rearrange([NAME],@p);
+ my @to_delete = ref($names[0]) eq 'ARRAY' ? @$names[0] : @names;
+ my %to_delete;
+ for my $name (@to_delete)
+ {
+ CORE::delete $self->{param}{$name};
+ CORE::delete $self->{'.fieldnames'}->{$name};
+ $to_delete{$name}++;
+ }
+ @{$self->{'.parameters'}}=grep { !exists($to_delete{$_}) } $self->param();
+ return;
+}
+END_OF_FUNC
+
+#### Method: import_names
+# Import all parameters into the given namespace.
+# Assumes namespace 'Q' if not specified
+####
+'import_names' => <<'END_OF_FUNC',
+sub import_names {
+ my($self,$namespace,$delete) = self_or_default(@_);
+ $namespace = 'Q' unless defined($namespace);
+ die "Can't import names into \"main\"\n" if \%{"${namespace}::"} == \%::;
+ if ($delete || $MOD_PERL || exists $ENV{'FCGI_ROLE'}) {
+ # can anyone find an easier way to do this?
+ for (keys %{"${namespace}::"}) {
+ local *symbol = "${namespace}::${_}";
+ undef $symbol;
+ undef @symbol;
+ undef %symbol;
+ }
+ }
+ my($param,@value,$var);
+ for $param ($self->param) {
+ # protect against silly names
+ ($var = $param)=~tr/a-zA-Z0-9_/_/c;
+ $var =~ s/^(?=\d)/_/;
+ local *symbol = "${namespace}::$var";
+ @value = $self->param($param);
+ @symbol = @value;
+ $symbol = $value[0];
+ }
+}
+END_OF_FUNC
+
+#### Method: keywords
+# Keywords acts a bit differently. Calling it in a list context
+# returns the list of keywords.
+# Calling it in a scalar context gives you the size of the list.
+####
+'keywords' => <<'END_OF_FUNC',
+sub keywords {
+ my($self,@values) = self_or_default(@_);
+ # If values is provided, then we set it.
+ $self->{param}{'keywords'}=[@values] if @values;
+ my(@result) = defined($self->{param}{'keywords'}) ? @{$self->{param}{'keywords'}} : ();
+ @result;
+}
+END_OF_FUNC
+
+# These are some tie() interfaces for compatibility
+# with Steve Brenner's cgi-lib.pl routines
+'Vars' => <<'END_OF_FUNC',
+sub Vars {
+ my $q = shift;
+ my %in;
+ tie(%in,CGI,$q);
+ return %in if wantarray;
+ return \%in;
+}
+END_OF_FUNC
+
+# These are some tie() interfaces for compatibility
+# with Steve Brenner's cgi-lib.pl routines
+'ReadParse' => <<'END_OF_FUNC',
+sub ReadParse {
+ local(*in);
+ if (@_) {
+ *in = $_[0];
+ } else {
+ my $pkg = caller();
+ *in=*{"${pkg}::in"};
+ }
+ tie(%in,CGI);
+ return scalar(keys %in);
+}
+END_OF_FUNC
+
+'PrintHeader' => <<'END_OF_FUNC',
+sub PrintHeader {
+ my($self) = self_or_default(@_);
+ return $self->header();
+}
+END_OF_FUNC
+
+'HtmlTop' => <<'END_OF_FUNC',
+sub HtmlTop {
+ my($self,@p) = self_or_default(@_);
+ return $self->start_html(@p);
+}
+END_OF_FUNC
+
+'HtmlBot' => <<'END_OF_FUNC',
+sub HtmlBot {
+ my($self,@p) = self_or_default(@_);
+ return $self->end_html(@p);
+}
+END_OF_FUNC
+
+'SplitParam' => <<'END_OF_FUNC',
+sub SplitParam {
+ my ($param) = @_;
+ my (@params) = split ("\0", $param);
+ return (wantarray ? @params : $params[0]);
+}
+END_OF_FUNC
+
+'MethGet' => <<'END_OF_FUNC',
+sub MethGet {
+ return request_method() eq 'GET';
+}
+END_OF_FUNC
+
+'MethPost' => <<'END_OF_FUNC',
+sub MethPost {
+ return request_method() eq 'POST';
+}
+END_OF_FUNC
+
+'MethPut' => <<'END_OF_FUNC',
+sub MethPut {
+ return request_method() eq 'PUT';
+}
+END_OF_FUNC
+
+'TIEHASH' => <<'END_OF_FUNC',
+sub TIEHASH {
+ my $class = shift;
+ my $arg = $_[0];
+ if (ref($arg) && UNIVERSAL::isa($arg,'CGI')) {
+ return $arg;
+ }
+ return $Q ||= $class->new(@_);
+}
+END_OF_FUNC
+
+'STORE' => <<'END_OF_FUNC',
+sub STORE {
+ my $self = shift;
+ my $tag = shift;
+ my $vals = shift;
+ my @vals = index($vals,"\0")!=-1 ? split("\0",$vals) : $vals;
+ $self->param(-name=>$tag,-value=>\@vals);
+}
+END_OF_FUNC
+
+'FETCH' => <<'END_OF_FUNC',
+sub FETCH {
+ return $_[0] if $_[1] eq 'CGI';
+ return undef unless defined $_[0]->param($_[1]);
+ return join("\0",$_[0]->param($_[1]));
+}
+END_OF_FUNC
+
+'FIRSTKEY' => <<'END_OF_FUNC',
+sub FIRSTKEY {
+ $_[0]->{'.iterator'}=0;
+ $_[0]->{'.parameters'}->[$_[0]->{'.iterator'}++];
+}
+END_OF_FUNC
+
+'NEXTKEY' => <<'END_OF_FUNC',
+sub NEXTKEY {
+ $_[0]->{'.parameters'}->[$_[0]->{'.iterator'}++];
+}
+END_OF_FUNC
+
+'EXISTS' => <<'END_OF_FUNC',
+sub EXISTS {
+ exists $_[0]->{param}{$_[1]};
+}
+END_OF_FUNC
+
+'DELETE' => <<'END_OF_FUNC',
+sub DELETE {
+ $_[0]->delete($_[1]);
+}
+END_OF_FUNC
+
+'CLEAR' => <<'END_OF_FUNC',
+sub CLEAR {
+ %{$_[0]}=();
+}
+####
+END_OF_FUNC
+
+####
+# Append a new value to an existing query
+####
+'append' => <<'EOF',
+sub append {
+ my($self,@p) = self_or_default(@_);
+ my($name,$value) = rearrange([NAME,[VALUE,VALUES]],@p);
+ my(@values) = defined($value) ? (ref($value) ? @{$value} : $value) : ();
+ if (@values) {
+ $self->add_parameter($name);
+ push(@{$self->{param}{$name}},@values);
+ }
+ return $self->param($name);
+}
+EOF
+
+#### Method: delete_all
+# Delete all parameters
+####
+'delete_all' => <<'EOF',
+sub delete_all {
+ my($self) = self_or_default(@_);
+ my @param = $self->param();
+ $self->delete(@param);
+}
+EOF
+
+'Delete' => <<'EOF',
+sub Delete {
+ my($self,@p) = self_or_default(@_);
+ $self->delete(@p);
+}
+EOF
+
+'Delete_all' => <<'EOF',
+sub Delete_all {
+ my($self,@p) = self_or_default(@_);
+ $self->delete_all(@p);
+}
+EOF
+
+#### Method: autoescape
+# If you want to turn off the autoescaping features,
+# call this method with undef as the argument
+'autoEscape' => <<'END_OF_FUNC',
+sub autoEscape {
+ my($self,$escape) = self_or_default(@_);
+ my $d = $self->{'escape'};
+ $self->{'escape'} = $escape;
+ $d;
+}
+END_OF_FUNC
+
+
+#### Method: version
+# Return the current version
+####
+'version' => <<'END_OF_FUNC',
+sub version {
+ return $VERSION;
+}
+END_OF_FUNC
+
+#### Method: url_param
+# Return a parameter in the QUERY_STRING, regardless of
+# whether this was a POST or a GET
+####
+'url_param' => <<'END_OF_FUNC',
+sub url_param {
+ my ($self,@p) = self_or_default(@_);
+ my $name = shift(@p);
+ return undef unless exists($ENV{QUERY_STRING});
+ unless (exists($self->{'.url_param'})) {
+ $self->{'.url_param'}={}; # empty hash
+ if ($ENV{QUERY_STRING} =~ /=/) {
+ my(@pairs) = split(/[&;]/,$ENV{QUERY_STRING});
+ my($param,$value);
+ for (@pairs) {
+ ($param,$value) = split('=',$_,2);
+ $param = unescape($param);
+ $value = unescape($value);
+ push(@{$self->{'.url_param'}->{$param}},$value);
+ }
+ } else {
+ my @keywords = $self->parse_keywordlist($ENV{QUERY_STRING});
+ $self->{'.url_param'}{'keywords'} = \@keywords if @keywords;
+ }
+ }
+ return keys %{$self->{'.url_param'}} unless defined($name);
+ return () unless $self->{'.url_param'}->{$name};
+ return wantarray ? @{$self->{'.url_param'}->{$name}}
+ : $self->{'.url_param'}->{$name}->[0];
+}
+END_OF_FUNC
+
+#### Method: Dump
+# Returns a string in which all the known parameter/value
+# pairs are represented as nested lists, mainly for the purposes
+# of debugging.
+####
+'Dump' => <<'END_OF_FUNC',
+sub Dump {
+ my($self) = self_or_default(@_);
+ my($param,$value,@result);
+ return '<ul></ul>' unless $self->param;
+ push(@result,"<ul>");
+ for $param ($self->param) {
+ my($name)=$self->_maybe_escapeHTML($param);
+ push(@result,"<li><strong>$name</strong></li>");
+ push(@result,"<ul>");
+ for $value ($self->param($param)) {
+ $value = $self->_maybe_escapeHTML($value);
+ $value =~ s/\n/<br \/>\n/g;
+ push(@result,"<li>$value</li>");
+ }
+ push(@result,"</ul>");
+ }
+ push(@result,"</ul>");
+ return join("\n",@result);
+}
+END_OF_FUNC
+
+#### Method as_string
+#
+# synonym for "dump"
+####
+'as_string' => <<'END_OF_FUNC',
+sub as_string {
+ &Dump(@_);
+}
+END_OF_FUNC
+
+#### Method: save
+# Write values out to a filehandle in such a way that they can
+# be reinitialized by the filehandle form of the new() method
+####
+'save' => <<'END_OF_FUNC',
+sub save {
+ my($self,$filehandle) = self_or_default(@_);
+ $filehandle = to_filehandle($filehandle);
+ my($param);
+ local($,) = ''; # set print field separator back to a sane value
+ local($\) = ''; # set output line separator to a sane value
+ for $param ($self->param) {
+ my($escaped_param) = escape($param);
+ my($value);
+ for $value ($self->param($param)) {
+ print $filehandle "$escaped_param=",escape("$value"),"\n"
+ if length($escaped_param) or length($value);
+ }
+ }
+ for (keys %{$self->{'.fieldnames'}}) {
+ print $filehandle ".cgifields=",escape("$_"),"\n";
+ }
+ print $filehandle "=\n"; # end of record
+}
+END_OF_FUNC
+
+
+#### Method: save_parameters
+# An alias for save() that is a better name for exportation.
+# Only intended to be used with the function (non-OO) interface.
+####
+'save_parameters' => <<'END_OF_FUNC',
+sub save_parameters {
+ my $fh = shift;
+ return save(to_filehandle($fh));
+}
+END_OF_FUNC
+
+#### Method: restore_parameters
+# A way to restore CGI parameters from an initializer.
+# Only intended to be used with the function (non-OO) interface.
+####
+'restore_parameters' => <<'END_OF_FUNC',
+sub restore_parameters {
+ $Q = $CGI::DefaultClass->new(@_);
+}
+END_OF_FUNC
+
+#### Method: multipart_init
+# Return a Content-Type: style header for server-push
+# This has to be NPH on most web servers, and it is advisable to set $| = 1
+#
+# Many thanks to Ed Jordan <ed@fidalgo.net> for this
+# contribution, updated by Andrew Benham (adsb@bigfoot.com)
+####
+'multipart_init' => <<'END_OF_FUNC',
+sub multipart_init {
+ my($self,@p) = self_or_default(@_);
+ my($boundary,@other) = rearrange_header([BOUNDARY],@p);
+ $boundary = $boundary || '------- =_aaaaaaaaaa0';
+ $self->{'separator'} = "$CRLF--$boundary$CRLF";
+ $self->{'final_separator'} = "$CRLF--$boundary--$CRLF";
+ $type = SERVER_PUSH($boundary);
+ return $self->header(
+ -nph => 0,
+ -type => $type,
+ (map { split "=", $_, 2 } @other),
+ ) . "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY." . $self->multipart_end;
+}
+END_OF_FUNC
+
+
+#### Method: multipart_start
+# Return a Content-Type: style header for server-push, start of section
+#
+# Many thanks to Ed Jordan <ed@fidalgo.net> for this
+# contribution, updated by Andrew Benham (adsb@bigfoot.com)
+####
+'multipart_start' => <<'END_OF_FUNC',
+sub multipart_start {
+ my(@header);
+ my($self,@p) = self_or_default(@_);
+ my($type,@other) = rearrange([TYPE],@p);
+ $type = $type || 'text/html';
+ push(@header,"Content-Type: $type");
+
+ # rearrange() was designed for the HTML portion, so we
+ # need to fix it up a little.
+ for (@other) {
+ # Don't use \s because of perl bug 21951
+ next unless my($header,$value) = /([^ \r\n\t=]+)=\"?(.+?)\"?$/;
+ ($_ = $header) =~ s/^(\w)(.*)/$1 . lc ($2) . ': '.$self->unescapeHTML($value)/e;
+ }
+ push(@header,@other);
+ my $header = join($CRLF,@header)."${CRLF}${CRLF}";
+ return $header;
+}
+END_OF_FUNC
+
+
+#### Method: multipart_end
+# Return a MIME boundary separator for server-push, end of section
+#
+# Many thanks to Ed Jordan <ed@fidalgo.net> for this
+# contribution
+####
+'multipart_end' => <<'END_OF_FUNC',
+sub multipart_end {
+ my($self,@p) = self_or_default(@_);
+ return $self->{'separator'};
+}
+END_OF_FUNC
+
+
+#### Method: multipart_final
+# Return a MIME boundary separator for server-push, end of all sections
+#
+# Contributed by Andrew Benham (adsb@bigfoot.com)
+####
+'multipart_final' => <<'END_OF_FUNC',
+sub multipart_final {
+ my($self,@p) = self_or_default(@_);
+ return $self->{'final_separator'} . "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY." . $CRLF;
+}
+END_OF_FUNC
+
+
+#### Method: header
+# Return a Content-Type: style header
+#
+####
+'header' => <<'END_OF_FUNC',
+sub header {
+ my($self,@p) = self_or_default(@_);
+ my(@header);
+
+ return "" if $self->{'.header_printed'}++ and $HEADERS_ONCE;
+
+ my($type,$status,$cookie,$target,$expires,$nph,$charset,$attachment,$p3p,@other) =
+ rearrange([['TYPE','CONTENT_TYPE','CONTENT-TYPE'],
+ 'STATUS',['COOKIE','COOKIES'],'TARGET',
+ 'EXPIRES','NPH','CHARSET',
+ 'ATTACHMENT','P3P'],@p);
+
+ $nph ||= $NPH;
+
+ $type ||= 'text/html' unless defined($type);
+
+ if (defined $charset) {
+ $self->charset($charset);
+ } else {
+ $charset = $self->charset if $type =~ /^text\//;
+ }
+ $charset ||= '';
+
+ # rearrange() was designed for the HTML portion, so we
+ # need to fix it up a little.
+ for (@other) {
+ # Don't use \s because of perl bug 21951
+ next unless my($header,$value) = /([^ \r\n\t=]+)=\"?(.+?)\"?$/;
+ ($_ = $header) =~ s/^(\w)(.*)/"\u$1\L$2" . ': '.$self->unescapeHTML($value)/e;
+ }
+
+ $type .= "; charset=$charset"
+ if $type ne ''
+ and $type !~ /\bcharset\b/
+ and defined $charset
+ and $charset ne '';
+
+ # Maybe future compatibility. Maybe not.
+ my $protocol = $ENV{SERVER_PROTOCOL} || 'HTTP/1.0';
+ push(@header,$protocol . ' ' . ($status || '200 OK')) if $nph;
+ push(@header,"Server: " . &server_software()) if $nph;
+
+ push(@header,"Status: $status") if $status;
+ push(@header,"Window-Target: $target") if $target;
+ if ($p3p) {
+ $p3p = join ' ',@$p3p if ref($p3p) eq 'ARRAY';
+ push(@header,qq(P3P: policyref="/w3c/p3p.xml", CP="$p3p"));
+ }
+ # push all the cookies -- there may be several
+ if ($cookie) {
+ my(@cookie) = ref($cookie) && ref($cookie) eq 'ARRAY' ? @{$cookie} : $cookie;
+ for (@cookie) {
+ my $cs = UNIVERSAL::isa($_,'CGI::Cookie') ? $_->as_string : $_;
+ push(@header,"Set-Cookie: $cs") if $cs ne '';
+ }
+ }
+ # if the user indicates an expiration time, then we need
+ # both an Expires and a Date header (so that the browser is
+ # uses OUR clock)
+ push(@header,"Expires: " . expires($expires,'http'))
+ if $expires;
+ push(@header,"Date: " . expires(0,'http')) if $expires || $cookie || $nph;
+ push(@header,"Pragma: no-cache") if $self->cache();
+ push(@header,"Content-Disposition: attachment; filename=\"$attachment\"") if $attachment;
+ push(@header,map {ucfirst $_} @other);
+ push(@header,"Content-Type: $type") if $type ne '';
+ my $header = join($CRLF,@header)."${CRLF}${CRLF}";
+ if (($MOD_PERL >= 1) && !$nph) {
+ $self->r->send_cgi_header($header);
+ return '';
+ }
+ return $header;
+}
+END_OF_FUNC
+
+
+#### Method: cache
+# Control whether header() will produce the no-cache
+# Pragma directive.
+####
+'cache' => <<'END_OF_FUNC',
+sub cache {
+ my($self,$new_value) = self_or_default(@_);
+ $new_value = '' unless $new_value;
+ if ($new_value ne '') {
+ $self->{'cache'} = $new_value;
+ }
+ return $self->{'cache'};
+}
+END_OF_FUNC
+
+
+#### Method: redirect
+# Return a Location: style header
+#
+####
+'redirect' => <<'END_OF_FUNC',
+sub redirect {
+ my($self,@p) = self_or_default(@_);
+ my($url,$target,$status,$cookie,$nph,@other) =
+ rearrange([[LOCATION,URI,URL],TARGET,STATUS,['COOKIE','COOKIES'],NPH],@p);
+ $status = '302 Found' unless defined $status;
+ $url ||= $self->self_url;
+ my(@o);
+ for (@other) { tr/\"//d; push(@o,split("=",$_,2)); }
+ unshift(@o,
+ '-Status' => $status,
+ '-Location'=> $url,
+ '-nph' => $nph);
+ unshift(@o,'-Target'=>$target) if $target;
+ unshift(@o,'-Type'=>'');
+ my @unescaped;
+ unshift(@unescaped,'-Cookie'=>$cookie) if $cookie;
+ return $self->header((map {$self->unescapeHTML($_)} @o),@unescaped);
+}
+END_OF_FUNC
+
+
+#### Method: start_html
+# Canned HTML header
+#
+# Parameters:
+# $title -> (optional) The title for this HTML document (-title)
+# $author -> (optional) e-mail address of the author (-author)
+# $base -> (optional) if set to true, will enter the BASE address of this document
+# for resolving relative references (-base)
+# $xbase -> (optional) alternative base at some remote location (-xbase)
+# $target -> (optional) target window to load all links into (-target)
+# $script -> (option) Javascript code (-script)
+# $no_script -> (option) Javascript <noscript> tag (-noscript)
+# $meta -> (optional) Meta information tags
+# $head -> (optional) any other elements you'd like to incorporate into the <head> tag
+# (a scalar or array ref)
+# $style -> (optional) reference to an external style sheet
+# @other -> (optional) any other named parameters you'd like to incorporate into
+# the <body> tag.
+####
+'start_html' => <<'END_OF_FUNC',
+sub start_html {
+ my($self,@p) = &self_or_default(@_);
+ my($title,$author,$base,$xbase,$script,$noscript,
+ $target,$meta,$head,$style,$dtd,$lang,$encoding,$declare_xml,@other) =
+ rearrange([TITLE,AUTHOR,BASE,XBASE,SCRIPT,NOSCRIPT,TARGET,
+ META,HEAD,STYLE,DTD,LANG,ENCODING,DECLARE_XML],@p);
+
+ $self->element_id(0);
+ $self->element_tab(0);
+
+ $encoding = lc($self->charset) unless defined $encoding;
+
+ # Need to sort out the DTD before it's okay to call escapeHTML().
+ my(@result,$xml_dtd);
+ if ($dtd) {
+ if (defined(ref($dtd)) and (ref($dtd) eq 'ARRAY')) {
+ $dtd = $DEFAULT_DTD unless $dtd->[0] =~ m|^-//|;
+ } else {
+ $dtd = $DEFAULT_DTD unless $dtd =~ m|^-//|;
+ }
+ } else {
+ $dtd = $XHTML ? XHTML_DTD : $DEFAULT_DTD;
+ }
+
+ $xml_dtd++ if ref($dtd) eq 'ARRAY' && $dtd->[0] =~ /\bXHTML\b/i;
+ $xml_dtd++ if ref($dtd) eq '' && $dtd =~ /\bXHTML\b/i;
+ push @result,qq(<?xml version="1.0" encoding="$encoding"?>) if $xml_dtd && $declare_xml;
+
+ if (ref($dtd) && ref($dtd) eq 'ARRAY') {
+ push(@result,qq(<!DOCTYPE html\n\tPUBLIC "$dtd->[0]"\n\t "$dtd->[1]">));
+ $DTD_PUBLIC_IDENTIFIER = $dtd->[0];
+ } else {
+ push(@result,qq(<!DOCTYPE html\n\tPUBLIC "$dtd">));
+ $DTD_PUBLIC_IDENTIFIER = $dtd;
+ }
+
+ # Now that we know whether we're using the HTML 3.2 DTD or not, it's okay to
+ # call escapeHTML(). Strangely enough, the title needs to be escaped as
+ # HTML while the author needs to be escaped as a URL.
+ $title = $self->_maybe_escapeHTML($title || 'Untitled Document');
+ $author = $self->escape($author);
+
+ if ($DTD_PUBLIC_IDENTIFIER =~ /[^X]HTML (2\.0|3\.2|4\.01?)/i) {
+ $lang = "" unless defined $lang;
+ $XHTML = 0;
+ }
+ else {
+ $lang = 'en-US' unless defined $lang;
+ }
+
+ my $lang_bits = $lang ne '' ? qq( lang="$lang" xml:lang="$lang") : '';
+ my $meta_bits = qq(<meta http-equiv="Content-Type" content="text/html; charset=$encoding" />)
+ if $XHTML && $encoding && !$declare_xml;
+
+ push(@result,$XHTML ? qq(<html xmlns="http://www.w3.org/1999/xhtml"$lang_bits>\n<head>\n<title>$title</title>)
+ : ($lang ? qq(<html lang="$lang">) : "<html>")
+ . "<head><title>$title</title>");
+ if (defined $author) {
+ push(@result,$XHTML ? "<link rev=\"made\" href=\"mailto:$author\" />"
+ : "<link rev=\"made\" href=\"mailto:$author\">");
+ }
+
+ if ($base || $xbase || $target) {
+ my $href = $xbase || $self->url('-path'=>1);
+ my $t = $target ? qq/ target="$target"/ : '';
+ push(@result,$XHTML ? qq(<base href="$href"$t />) : qq(<base href="$href"$t>));
+ }
+
+ if ($meta && ref($meta) && (ref($meta) eq 'HASH')) {
+ for (keys %$meta) { push(@result,$XHTML ? qq(<meta name="$_" content="$meta->{$_}" />)
+ : qq(<meta name="$_" content="$meta->{$_}">)); }
+ }
+
+ my $meta_bits_set = 0;
+ if( $head ) {
+ if( ref $head ) {
+ push @result, @$head;
+ $meta_bits_set = 1 if grep { /http-equiv=["']Content-Type/i }@$head;
+ }
+ else {
+ push @result, $head;
+ $meta_bits_set = 1 if $head =~ /http-equiv=["']Content-Type/i;
+ }
+ }
+
+ # handle the infrequently-used -style and -script parameters
+ push(@result,$self->_style($style)) if defined $style;
+ push(@result,$self->_script($script)) if defined $script;
+ push(@result,$meta_bits) if defined $meta_bits and !$meta_bits_set;
+
+ # handle -noscript parameter
+ push(@result,<<END) if $noscript;
+<noscript>
+$noscript
+</noscript>
+END
+ ;
+ my($other) = @other ? " @other" : '';
+ push(@result,"</head>\n<body$other>\n");
+ return join("\n",@result);
+}
+END_OF_FUNC
+
+### Method: _style
+# internal method for generating a CSS style section
+####
+'_style' => <<'END_OF_FUNC',
+sub _style {
+ my ($self,$style) = @_;
+ my (@result);
+
+ my $type = 'text/css';
+ my $rel = 'stylesheet';
+
+
+ my $cdata_start = $XHTML ? "\n<!--/* <![CDATA[ */" : "\n<!-- ";
+ my $cdata_end = $XHTML ? "\n/* ]]> */-->\n" : " -->\n";
+
+ my @s = ref($style) eq 'ARRAY' ? @$style : $style;
+ my $other = '';
+
+ for my $s (@s) {
+ if (ref($s)) {
+ my($src,$code,$verbatim,$stype,$alternate,$foo,@other) =
+ rearrange([qw(SRC CODE VERBATIM TYPE ALTERNATE FOO)],
+ ('-foo'=>'bar',
+ ref($s) eq 'ARRAY' ? @$s : %$s));
+ my $type = defined $stype ? $stype : 'text/css';
+ my $rel = $alternate ? 'alternate stylesheet' : 'stylesheet';
+ $other = "@other" if @other;
+
+ if (ref($src) eq "ARRAY") # Check to see if the $src variable is an array reference
+ { # If it is, push a LINK tag for each one
+ for $src (@$src)
+ {
+ push(@result,$XHTML ? qq(<link rel="$rel" type="$type" href="$src" $other/>)
+ : qq(<link rel="$rel" type="$type" href="$src"$other>)) if $src;
+ }
+ }
+ else
+ { # Otherwise, push the single -src, if it exists.
+ push(@result,$XHTML ? qq(<link rel="$rel" type="$type" href="$src" $other/>)
+ : qq(<link rel="$rel" type="$type" href="$src"$other>)
+ ) if $src;
+ }
+ if ($verbatim) {
+ my @v = ref($verbatim) eq 'ARRAY' ? @$verbatim : $verbatim;
+ push(@result, "<style type=\"text/css\">\n$_\n</style>") for @v;
+ }
+ my @c = ref($code) eq 'ARRAY' ? @$code : $code if $code;
+ push(@result,style({'type'=>$type},"$cdata_start\n$_\n$cdata_end")) for @c;
+
+ } else {
+ my $src = $s;
+ push(@result,$XHTML ? qq(<link rel="$rel" type="$type" href="$src" $other/>)
+ : qq(<link rel="$rel" type="$type" href="$src"$other>));
+ }
+ }
+ @result;
+}
+END_OF_FUNC
+
+'_script' => <<'END_OF_FUNC',
+sub _script {
+ my ($self,$script) = @_;
+ my (@result);
+
+ my (@scripts) = ref($script) eq 'ARRAY' ? @$script : ($script);
+ for $script (@scripts) {
+ my($src,$code,$language);
+ if (ref($script)) { # script is a hash
+ ($src,$code,$type) =
+ rearrange(['SRC','CODE',['LANGUAGE','TYPE']],
+ '-foo'=>'bar', # a trick to allow the '-' to be omitted
+ ref($script) eq 'ARRAY' ? @$script : %$script);
+ $type ||= 'text/javascript';
+ unless ($type =~ m!\w+/\w+!) {
+ $type =~ s/[\d.]+$//;
+ $type = "text/$type";
+ }
+ } else {
+ ($src,$code,$type) = ('',$script, 'text/javascript');
+ }
+
+ my $comment = '//'; # javascript by default
+ $comment = '#' if $type=~/perl|tcl/i;
+ $comment = "'" if $type=~/vbscript/i;
+
+ my ($cdata_start,$cdata_end);
+ if ($XHTML) {
+ $cdata_start = "$comment<![CDATA[\n";
+ $cdata_end .= "\n$comment]]>";
+ } else {
+ $cdata_start = "\n<!-- Hide script\n";
+ $cdata_end = $comment;
+ $cdata_end .= " End script hiding -->\n";
+ }
+ my(@satts);
+ push(@satts,'src'=>$src) if $src;
+ push(@satts,'type'=>$type);
+ $code = $cdata_start . $code . $cdata_end if defined $code;
+ push(@result,$self->script({@satts},$code || ''));
+ }
+ @result;
+}
+END_OF_FUNC
+
+#### Method: end_html
+# End an HTML document.
+# Trivial method for completeness. Just returns "</body>"
+####
+'end_html' => <<'END_OF_FUNC',
+sub end_html {
+ return "\n</body>\n</html>";
+}
+END_OF_FUNC
+
+
+################################
+# METHODS USED IN BUILDING FORMS
+################################
+
+#### Method: isindex
+# Just prints out the isindex tag.
+# Parameters:
+# $action -> optional URL of script to run
+# Returns:
+# A string containing a <isindex> tag
+'isindex' => <<'END_OF_FUNC',
+sub isindex {
+ my($self,@p) = self_or_default(@_);
+ my($action,@other) = rearrange([ACTION],@p);
+ $action = qq/ action="$action"/ if $action;
+ my($other) = @other ? " @other" : '';
+ return $XHTML ? "<isindex$action$other />" : "<isindex$action$other>";
+}
+END_OF_FUNC
+
+
+#### Method: startform
+# This method is DEPRECATED
+# Start a form
+# Parameters:
+# $method -> optional submission method to use (GET or POST)
+# $action -> optional URL of script to run
+# $enctype ->encoding to use (URL_ENCODED or MULTIPART)
+'startform' => <<'END_OF_FUNC',
+sub startform {
+ my($self,@p) = self_or_default(@_);
+
+ my($method,$action,$enctype,@other) =
+ rearrange([METHOD,ACTION,ENCTYPE],@p);
+
+ $method = $self->_maybe_escapeHTML(lc($method || 'post'));
+ $enctype = $self->_maybe_escapeHTML($enctype || &URL_ENCODED);
+ if (defined $action) {
+ $action = $self->_maybe_escapeHTML($action);
+ }
+ else {
+ $action = $self->_maybe_escapeHTML($self->request_uri || $self->self_url);
+ }
+ $action = qq(action="$action");
+ my($other) = @other ? " @other" : '';
+ $self->{'.parametersToAdd'}={};
+ return qq/<form method="$method" $action enctype="$enctype"$other>\n/;
+}
+END_OF_FUNC
+
+#### Method: start_form
+# Start a form
+# Parameters:
+# $method -> optional submission method to use (GET or POST)
+# $action -> optional URL of script to run
+# $enctype ->encoding to use (URL_ENCODED or MULTIPART)
+'start_form' => <<'END_OF_FUNC',
+sub start_form {
+ my($self,@p) = self_or_default(@_);
+
+ my($method,$action,$enctype,@other) =
+ rearrange([METHOD,ACTION,ENCTYPE],@p);
+
+ $method = $self->_maybe_escapeHTML(lc($method || 'post'));
+
+ if( $XHTML ){
+ $enctype = $self->_maybe_escapeHTML($enctype || &MULTIPART);
+ }else{
+ $enctype = $self->_maybe_escapeHTML($enctype || &URL_ENCODED);
+ }
+
+ if (defined $action) {
+ $action = $self->_maybe_escapeHTML($action);
+ }
+ else {
+ $action = $self->_maybe_escapeHTML($self->request_uri || $self->self_url);
+ }
+ $action = qq(action="$action");
+ my($other) = @other ? " @other" : '';
+ $self->{'.parametersToAdd'}={};
+ return qq/<form method="$method" $action enctype="$enctype"$other>\n/;
+}
+END_OF_FUNC
+
+#### Method: start_multipart_form
+'start_multipart_form' => <<'END_OF_FUNC',
+sub start_multipart_form {
+ my($self,@p) = self_or_default(@_);
+ if (defined($p[0]) && substr($p[0],0,1) eq '-') {
+ return $self->start_form(-enctype=>&MULTIPART,@p);
+ } else {
+ my($method,$action,@other) =
+ rearrange([METHOD,ACTION],@p);
+ return $self->start_form($method,$action,&MULTIPART,@other);
+ }
+}
+END_OF_FUNC
+
+
+
+#### Method: end_form
+# End a form
+'end_form' => <<'END_OF_FUNC',
+sub end_form {
+ my($self,@p) = self_or_default(@_);
+ if ( $NOSTICKY ) {
+ return wantarray ? ("</form>") : "\n</form>";
+ } else {
+ if (my @fields = $self->get_fields) {
+ return wantarray ? ("<div>",@fields,"</div>","</form>")
+ : "<div>".(join '',@fields)."</div>\n</form>";
+ } else {
+ return "</form>";
+ }
+ }
+}
+END_OF_FUNC
+
+#### Method: end_multipart_form
+# end a multipart form
+'end_multipart_form' => <<'END_OF_FUNC',
+sub end_multipart_form {
+ &end_form;
+}
+END_OF_FUNC
+
+
+'_textfield' => <<'END_OF_FUNC',
+sub _textfield {
+ my($self,$tag,@p) = self_or_default(@_);
+ my($name,$default,$size,$maxlength,$override,$tabindex,@other) =
+ rearrange([NAME,[DEFAULT,VALUE,VALUES],SIZE,MAXLENGTH,[OVERRIDE,FORCE],TABINDEX],@p);
+
+ my $current = $override ? $default :
+ (defined($self->param($name)) ? $self->param($name) : $default);
+
+ $current = defined($current) ? $self->_maybe_escapeHTML($current,1) : '';
+ $name = defined($name) ? $self->_maybe_escapeHTML($name) : '';
+ my($s) = defined($size) ? qq/ size="$size"/ : '';
+ my($m) = defined($maxlength) ? qq/ maxlength="$maxlength"/ : '';
+ my($other) = @other ? " @other" : '';
+ # this entered at cristy's request to fix problems with file upload fields
+ # and WebTV -- not sure it won't break stuff
+ my($value) = $current ne '' ? qq(value="$current") : '';
+ $tabindex = $self->element_tab($tabindex);
+ return $XHTML ? qq(<input type="$tag" name="$name" $tabindex$value$s$m$other />)
+ : qq(<input type="$tag" name="$name" $value$s$m$other>);
+}
+END_OF_FUNC
+
+#### Method: textfield
+# Parameters:
+# $name -> Name of the text field
+# $default -> Optional default value of the field if not
+# already defined.
+# $size -> Optional width of field in characaters.
+# $maxlength -> Optional maximum number of characters.
+# Returns:
+# A string containing a <input type="text"> field
+#
+'textfield' => <<'END_OF_FUNC',
+sub textfield {
+ my($self,@p) = self_or_default(@_);
+ $self->_textfield('text',@p);
+}
+END_OF_FUNC
+
+
+#### Method: filefield
+# Parameters:
+# $name -> Name of the file upload field
+# $size -> Optional width of field in characaters.
+# $maxlength -> Optional maximum number of characters.
+# Returns:
+# A string containing a <input type="file"> field
+#
+'filefield' => <<'END_OF_FUNC',
+sub filefield {
+ my($self,@p) = self_or_default(@_);
+ $self->_textfield('file',@p);
+}
+END_OF_FUNC
+
+
+#### Method: password
+# Create a "secret password" entry field
+# Parameters:
+# $name -> Name of the field
+# $default -> Optional default value of the field if not
+# already defined.
+# $size -> Optional width of field in characters.
+# $maxlength -> Optional maximum characters that can be entered.
+# Returns:
+# A string containing a <input type="password"> field
+#
+'password_field' => <<'END_OF_FUNC',
+sub password_field {
+ my ($self,@p) = self_or_default(@_);
+ $self->_textfield('password',@p);
+}
+END_OF_FUNC
+
+#### Method: textarea
+# Parameters:
+# $name -> Name of the text field
+# $default -> Optional default value of the field if not
+# already defined.
+# $rows -> Optional number of rows in text area
+# $columns -> Optional number of columns in text area
+# Returns:
+# A string containing a <textarea></textarea> tag
+#
+'textarea' => <<'END_OF_FUNC',
+sub textarea {
+ my($self,@p) = self_or_default(@_);
+ my($name,$default,$rows,$cols,$override,$tabindex,@other) =
+ rearrange([NAME,[DEFAULT,VALUE],ROWS,[COLS,COLUMNS],[OVERRIDE,FORCE],TABINDEX],@p);
+
+ my($current)= $override ? $default :
+ (defined($self->param($name)) ? $self->param($name) : $default);
+
+ $name = defined($name) ? $self->_maybe_escapeHTML($name) : '';
+ $current = defined($current) ? $self->_maybe_escapeHTML($current) : '';
+ my($r) = $rows ? qq/ rows="$rows"/ : '';
+ my($c) = $cols ? qq/ cols="$cols"/ : '';
+ my($other) = @other ? " @other" : '';
+ $tabindex = $self->element_tab($tabindex);
+ return qq{<textarea name="$name" $tabindex$r$c$other>$current</textarea>};
+}
+END_OF_FUNC
+
+
+#### Method: button
+# Create a javascript button.
+# Parameters:
+# $name -> (optional) Name for the button. (-name)
+# $value -> (optional) Value of the button when selected (and visible name) (-value)
+# $onclick -> (optional) Text of the JavaScript to run when the button is
+# clicked.
+# Returns:
+# A string containing a <input type="button"> tag
+####
+'button' => <<'END_OF_FUNC',
+sub button {
+ my($self,@p) = self_or_default(@_);
+
+ my($label,$value,$script,$tabindex,@other) = rearrange([NAME,[VALUE,LABEL],
+ [ONCLICK,SCRIPT],TABINDEX],@p);
+
+ $label=$self->_maybe_escapeHTML($label);
+ $value=$self->_maybe_escapeHTML($value,1);
+ $script=$self->_maybe_escapeHTML($script);
+
+ $script ||= '';
+
+ my($name) = '';
+ $name = qq/ name="$label"/ if $label;
+ $value = $value || $label;
+ my($val) = '';
+ $val = qq/ value="$value"/ if $value;
+ $script = qq/ onclick="$script"/ if $script;
+ my($other) = @other ? " @other" : '';
+ $tabindex = $self->element_tab($tabindex);
+ return $XHTML ? qq(<input type="button" $tabindex$name$val$script$other />)
+ : qq(<input type="button"$name$val$script$other>);
+}
+END_OF_FUNC
+
+
+#### Method: submit
+# Create a "submit query" button.
+# Parameters:
+# $name -> (optional) Name for the button.
+# $value -> (optional) Value of the button when selected (also doubles as label).
+# $label -> (optional) Label printed on the button(also doubles as the value).
+# Returns:
+# A string containing a <input type="submit"> tag
+####
+'submit' => <<'END_OF_FUNC',
+sub submit {
+ my($self,@p) = self_or_default(@_);
+
+ my($label,$value,$tabindex,@other) = rearrange([NAME,[VALUE,LABEL],TABINDEX],@p);
+
+ $label=$self->_maybe_escapeHTML($label);
+ $value=$self->_maybe_escapeHTML($value,1);
+
+ my $name = $NOSTICKY ? '' : 'name=".submit" ';
+ $name = qq/name="$label" / if defined($label);
+ $value = defined($value) ? $value : $label;
+ my $val = '';
+ $val = qq/value="$value" / if defined($value);
+ $tabindex = $self->element_tab($tabindex);
+ my($other) = @other ? "@other " : '';
+ return $XHTML ? qq(<input type="submit" $tabindex$name$val$other/>)
+ : qq(<input type="submit" $name$val$other>);
+}
+END_OF_FUNC
+
+
+#### Method: reset
+# Create a "reset" button.
+# Parameters:
+# $name -> (optional) Name for the button.
+# Returns:
+# A string containing a <input type="reset"> tag
+####
+'reset' => <<'END_OF_FUNC',
+sub reset {
+ my($self,@p) = self_or_default(@_);
+ my($label,$value,$tabindex,@other) = rearrange(['NAME',['VALUE','LABEL'],TABINDEX],@p);
+ $label=$self->_maybe_escapeHTML($label);
+ $value=$self->_maybe_escapeHTML($value,1);
+ my ($name) = ' name=".reset"';
+ $name = qq/ name="$label"/ if defined($label);
+ $value = defined($value) ? $value : $label;
+ my($val) = '';
+ $val = qq/ value="$value"/ if defined($value);
+ my($other) = @other ? " @other" : '';
+ $tabindex = $self->element_tab($tabindex);
+ return $XHTML ? qq(<input type="reset" $tabindex$name$val$other />)
+ : qq(<input type="reset"$name$val$other>);
+}
+END_OF_FUNC
+
+
+#### Method: defaults
+# Create a "defaults" button.
+# Parameters:
+# $name -> (optional) Name for the button.
+# Returns:
+# A string containing a <input type="submit" name=".defaults"> tag
+#
+# Note: this button has a special meaning to the initialization script,
+# and tells it to ERASE the current query string so that your defaults
+# are used again!
+####
+'defaults' => <<'END_OF_FUNC',
+sub defaults {
+ my($self,@p) = self_or_default(@_);
+
+ my($label,$tabindex,@other) = rearrange([[NAME,VALUE],TABINDEX],@p);
+
+ $label=$self->_maybe_escapeHTML($label,1);
+ $label = $label || "Defaults";
+ my($value) = qq/ value="$label"/;
+ my($other) = @other ? " @other" : '';
+ $tabindex = $self->element_tab($tabindex);
+ return $XHTML ? qq(<input type="submit" name=".defaults" $tabindex$value$other />)
+ : qq/<input type="submit" NAME=".defaults"$value$other>/;
+}
+END_OF_FUNC
+
+
+#### Method: comment
+# Create an HTML <!-- comment -->
+# Parameters: a string
+'comment' => <<'END_OF_FUNC',
+sub comment {
+ my($self,@p) = self_or_CGI(@_);
+ return "<!-- @p -->";
+}
+END_OF_FUNC
+
+#### Method: checkbox
+# Create a checkbox that is not logically linked to any others.
+# The field value is "on" when the button is checked.
+# Parameters:
+# $name -> Name of the checkbox
+# $checked -> (optional) turned on by default if true
+# $value -> (optional) value of the checkbox, 'on' by default
+# $label -> (optional) a user-readable label printed next to the box.
+# Otherwise the checkbox name is used.
+# Returns:
+# A string containing a <input type="checkbox"> field
+####
+'checkbox' => <<'END_OF_FUNC',
+sub checkbox {
+ my($self,@p) = self_or_default(@_);
+
+ my($name,$checked,$value,$label,$labelattributes,$override,$tabindex,@other) =
+ rearrange([NAME,[CHECKED,SELECTED,ON],VALUE,LABEL,LABELATTRIBUTES,
+ [OVERRIDE,FORCE],TABINDEX],@p);
+
+ $value = defined $value ? $value : 'on';
+
+ if (!$override && ($self->{'.fieldnames'}->{$name} ||
+ defined $self->param($name))) {
+ $checked = grep($_ eq $value,$self->param($name)) ? $self->_checked(1) : '';
+ } else {
+ $checked = $self->_checked($checked);
+ }
+ my($the_label) = defined $label ? $label : $name;
+ $name = $self->_maybe_escapeHTML($name);
+ $value = $self->_maybe_escapeHTML($value,1);
+ $the_label = $self->_maybe_escapeHTML($the_label);
+ my($other) = @other ? "@other " : '';
+ $tabindex = $self->element_tab($tabindex);
+ $self->register_parameter($name);
+ return $XHTML ? CGI::label($labelattributes,
+ qq{<input type="checkbox" name="$name" value="$value" $tabindex$checked$other/>$the_label})
+ : qq{<input type="checkbox" name="$name" value="$value"$checked$other>$the_label};
+}
+END_OF_FUNC
+
+
+
+# Escape HTML
+'escapeHTML' => <<'END_OF_FUNC',
+sub escapeHTML {
+ # hack to work around earlier hacks
+ push @_,$_[0] if @_==1 && $_[0] eq 'CGI';
+ my ($self,$toencode,$newlinestoo) = CGI::self_or_default(@_);
+ return undef unless defined($toencode);
+ $toencode =~ s{&}{&amp;}gso;
+ $toencode =~ s{<}{&lt;}gso;
+ $toencode =~ s{>}{&gt;}gso;
+ if ($DTD_PUBLIC_IDENTIFIER =~ /[^X]HTML 3\.2/i) {
+ # $quot; was accidentally omitted from the HTML 3.2 DTD -- see
+ # <http://validator.w3.org/docs/errors.html#bad-entity> /
+ # <http://lists.w3.org/Archives/Public/www-html/1997Mar/0003.html>.
+ $toencode =~ s{"}{&#34;}gso;
+ }
+ else {
+ $toencode =~ s{"}{&quot;}gso;
+ }
+
+ # Handle bug in some browsers with Latin charsets
+ if ($self->{'.charset'}
+ && (uc($self->{'.charset'}) eq 'ISO-8859-1'
+ || uc($self->{'.charset'}) eq 'WINDOWS-1252')) {
+ $toencode =~ s{'}{&#39;}gso;
+ $toencode =~ s{\x8b}{&#8249;}gso;
+ $toencode =~ s{\x9b}{&#8250;}gso;
+ if (defined $newlinestoo && $newlinestoo) {
+ $toencode =~ s{\012}{&#10;}gso;
+ $toencode =~ s{\015}{&#13;}gso;
+ }
+ }
+ return $toencode;
+}
+END_OF_FUNC
+
+# unescape HTML -- used internally
+'unescapeHTML' => <<'END_OF_FUNC',
+sub unescapeHTML {
+ # hack to work around earlier hacks
+ push @_,$_[0] if @_==1 && $_[0] eq 'CGI';
+ my ($self,$string) = CGI::self_or_default(@_);
+ return undef unless defined($string);
+ my $latin = defined $self->{'.charset'} ? $self->{'.charset'} =~ /^(ISO-8859-1|WINDOWS-1252)$/i
+ : 1;
+ # thanks to Randal Schwartz for the correct solution to this one
+ $string=~ s[&(\S*?);]{
+ local $_ = $1;
+ /^amp$/i ? "&" :
+ /^quot$/i ? '"' :
+ /^gt$/i ? ">" :
+ /^lt$/i ? "<" :
+ /^#(\d+)$/ && $latin ? chr($1) :
+ /^#x([0-9a-f]+)$/i && $latin ? chr(hex($1)) :
+ $_
+ }gex;
+ return $string;
+}
+END_OF_FUNC
+
+# Internal procedure - don't use
+'_tableize' => <<'END_OF_FUNC',
+sub _tableize {
+ my($rows,$columns,$rowheaders,$colheaders,@elements) = @_;
+ my @rowheaders = $rowheaders ? @$rowheaders : ();
+ my @colheaders = $colheaders ? @$colheaders : ();
+ my($result);
+
+ if (defined($columns)) {
+ $rows = int(0.99 + @elements/$columns) unless defined($rows);
+ }
+ if (defined($rows)) {
+ $columns = int(0.99 + @elements/$rows) unless defined($columns);
+ }
+
+ # rearrange into a pretty table
+ $result = "<table>";
+ my($row,$column);
+ unshift(@colheaders,'') if @colheaders && @rowheaders;
+ $result .= "<tr>" if @colheaders;
+ for (@colheaders) {
+ $result .= "<th>$_</th>";
+ }
+ for ($row=0;$row<$rows;$row++) {
+ $result .= "<tr>";
+ $result .= "<th>$rowheaders[$row]</th>" if @rowheaders;
+ for ($column=0;$column<$columns;$column++) {
+ $result .= "<td>" . $elements[$column*$rows + $row] . "</td>"
+ if defined($elements[$column*$rows + $row]);
+ }
+ $result .= "</tr>";
+ }
+ $result .= "</table>";
+ return $result;
+}
+END_OF_FUNC
+
+
+#### Method: radio_group
+# Create a list of logically-linked radio buttons.
+# Parameters:
+# $name -> Common name for all the buttons.
+# $values -> A pointer to a regular array containing the
+# values for each button in the group.
+# $default -> (optional) Value of the button to turn on by default. Pass '-'
+# to turn _nothing_ on.
+# $linebreak -> (optional) Set to true to place linebreaks
+# between the buttons.
+# $labels -> (optional)
+# A pointer to a hash of labels to print next to each checkbox
+# in the form $label{'value'}="Long explanatory label".
+# Otherwise the provided values are used as the labels.
+# Returns:
+# An ARRAY containing a series of <input type="radio"> fields
+####
+'radio_group' => <<'END_OF_FUNC',
+sub radio_group {
+ my($self,@p) = self_or_default(@_);
+ $self->_box_group('radio',@p);
+}
+END_OF_FUNC
+
+#### Method: checkbox_group
+# Create a list of logically-linked checkboxes.
+# Parameters:
+# $name -> Common name for all the check boxes
+# $values -> A pointer to a regular array containing the
+# values for each checkbox in the group.
+# $defaults -> (optional)
+# 1. If a pointer to a regular array of checkbox values,
+# then this will be used to decide which
+# checkboxes to turn on by default.
+# 2. If a scalar, will be assumed to hold the
+# value of a single checkbox in the group to turn on.
+# $linebreak -> (optional) Set to true to place linebreaks
+# between the buttons.
+# $labels -> (optional)
+# A pointer to a hash of labels to print next to each checkbox
+# in the form $label{'value'}="Long explanatory label".
+# Otherwise the provided values are used as the labels.
+# Returns:
+# An ARRAY containing a series of <input type="checkbox"> fields
+####
+
+'checkbox_group' => <<'END_OF_FUNC',
+sub checkbox_group {
+ my($self,@p) = self_or_default(@_);
+ $self->_box_group('checkbox',@p);
+}
+END_OF_FUNC
+
+'_box_group' => <<'END_OF_FUNC',
+sub _box_group {
+ my $self = shift;
+ my $box_type = shift;
+
+ my($name,$values,$defaults,$linebreak,$labels,$labelattributes,
+ $attributes,$rows,$columns,$rowheaders,$colheaders,
+ $override,$nolabels,$tabindex,$disabled,@other) =
+ rearrange([NAME,[VALUES,VALUE],[DEFAULT,DEFAULTS],LINEBREAK,LABELS,LABELATTRIBUTES,
+ ATTRIBUTES,ROWS,[COLUMNS,COLS],[ROWHEADERS,ROWHEADER],[COLHEADERS,COLHEADER],
+ [OVERRIDE,FORCE],NOLABELS,TABINDEX,DISABLED
+ ],@_);
+
+
+ my($result,$checked,@elements,@values);
+
+ @values = $self->_set_values_and_labels($values,\$labels,$name);
+ my %checked = $self->previous_or_default($name,$defaults,$override);
+
+ # If no check array is specified, check the first by default
+ $checked{$values[0]}++ if $box_type eq 'radio' && !%checked;
+
+ $name=$self->_maybe_escapeHTML($name);
+
+ my %tabs = ();
+ if ($TABINDEX && $tabindex) {
+ if (!ref $tabindex) {
+ $self->element_tab($tabindex);
+ } elsif (ref $tabindex eq 'ARRAY') {
+ %tabs = map {$_=>$self->element_tab} @$tabindex;
+ } elsif (ref $tabindex eq 'HASH') {
+ %tabs = %$tabindex;
+ }
+ }
+ %tabs = map {$_=>$self->element_tab} @values unless %tabs;
+ my $other = @other ? "@other " : '';
+ my $radio_checked;
+
+ # for disabling groups of radio/checkbox buttons
+ my %disabled;
+ for (@{$disabled}) {
+ $disabled{$_}=1;
+ }
+
+ for (@values) {
+ my $disable="";
+ if ($disabled{$_}) {
+ $disable="disabled='1'";
+ }
+
+ my $checkit = $self->_checked($box_type eq 'radio' ? ($checked{$_} && !$radio_checked++)
+ : $checked{$_});
+ my($break);
+ if ($linebreak) {
+ $break = $XHTML ? "<br />" : "<br>";
+ }
+ else {
+ $break = '';
+ }
+ my($label)='';
+ unless (defined($nolabels) && $nolabels) {
+ $label = $_;
+ $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
+ $label = $self->_maybe_escapeHTML($label,1);
+ $label = "<span style=\"color:gray\">$label</span>" if $disabled{$_};
+ }
+ my $attribs = $self->_set_attributes($_, $attributes);
+ my $tab = $tabs{$_};
+ $_=$self->_maybe_escapeHTML($_);
+
+ if ($XHTML) {
+ push @elements,
+ CGI::label($labelattributes,
+ qq(<input type="$box_type" name="$name" value="$_" $checkit$other$tab$attribs$disable/>$label)).${break};
+ } else {
+ push(@elements,qq/<input type="$box_type" name="$name" value="$_" $checkit$other$tab$attribs$disable>${label}${break}/);
+ }
+ }
+ $self->register_parameter($name);
+ return wantarray ? @elements : "@elements"
+ unless defined($columns) || defined($rows);
+ return _tableize($rows,$columns,$rowheaders,$colheaders,@elements);
+}
+END_OF_FUNC
+
+
+#### Method: popup_menu
+# Create a popup menu.
+# Parameters:
+# $name -> Name for all the menu
+# $values -> A pointer to a regular array containing the
+# text of each menu item.
+# $default -> (optional) Default item to display
+# $labels -> (optional)
+# A pointer to a hash of labels to print next to each checkbox
+# in the form $label{'value'}="Long explanatory label".
+# Otherwise the provided values are used as the labels.
+# Returns:
+# A string containing the definition of a popup menu.
+####
+'popup_menu' => <<'END_OF_FUNC',
+sub popup_menu {
+ my($self,@p) = self_or_default(@_);
+
+ my($name,$values,$default,$labels,$attributes,$override,$tabindex,@other) =
+ rearrange([NAME,[VALUES,VALUE],[DEFAULT,DEFAULTS],LABELS,
+ ATTRIBUTES,[OVERRIDE,FORCE],TABINDEX],@p);
+ my($result,%selected);
+
+ if (!$override && defined($self->param($name))) {
+ $selected{$self->param($name)}++;
+ } elsif (defined $default) {
+ %selected = map {$_=>1} ref($default) eq 'ARRAY'
+ ? @$default
+ : $default;
+ }
+ $name=$self->_maybe_escapeHTML($name);
+ my($other) = @other ? " @other" : '';
+
+ my(@values);
+ @values = $self->_set_values_and_labels($values,\$labels,$name);
+ $tabindex = $self->element_tab($tabindex);
+ $result = qq/<select name="$name" $tabindex$other>\n/;
+ for (@values) {
+ if (/<optgroup/) {
+ for my $v (split(/\n/)) {
+ my $selectit = $XHTML ? 'selected="selected"' : 'selected';
+ for my $selected (keys %selected) {
+ $v =~ s/(value="\Q$selected\E")/$selectit $1/;
+ }
+ $result .= "$v\n";
+ }
+ }
+ else {
+ my $attribs = $self->_set_attributes($_, $attributes);
+ my($selectit) = $self->_selected($selected{$_});
+ my($label) = $_;
+ $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
+ my($value) = $self->_maybe_escapeHTML($_);
+ $label = $self->_maybe_escapeHTML($label,1);
+ $result .= "<option${attribs} ${selectit}value=\"$value\">$label</option>\n";
+ }
+ }
+
+ $result .= "</select>";
+ return $result;
+}
+END_OF_FUNC
+
+
+#### Method: optgroup
+# Create a optgroup.
+# Parameters:
+# $name -> Label for the group
+# $values -> A pointer to a regular array containing the
+# values for each option line in the group.
+# $labels -> (optional)
+# A pointer to a hash of labels to print next to each item
+# in the form $label{'value'}="Long explanatory label".
+# Otherwise the provided values are used as the labels.
+# $labeled -> (optional)
+# A true value indicates the value should be used as the label attribute
+# in the option elements.
+# The label attribute specifies the option label presented to the user.
+# This defaults to the content of the <option> element, but the label
+# attribute allows authors to more easily use optgroup without sacrificing
+# compatibility with browsers that do not support option groups.
+# $novals -> (optional)
+# A true value indicates to suppress the val attribute in the option elements
+# Returns:
+# A string containing the definition of an option group.
+####
+'optgroup' => <<'END_OF_FUNC',
+sub optgroup {
+ my($self,@p) = self_or_default(@_);
+ my($name,$values,$attributes,$labeled,$noval,$labels,@other)
+ = rearrange([NAME,[VALUES,VALUE],ATTRIBUTES,LABELED,NOVALS,LABELS],@p);
+
+ my($result,@values);
+ @values = $self->_set_values_and_labels($values,\$labels,$name,$labeled,$novals);
+ my($other) = @other ? " @other" : '';
+
+ $name=$self->_maybe_escapeHTML($name);
+ $result = qq/<optgroup label="$name"$other>\n/;
+ for (@values) {
+ if (/<optgroup/) {
+ for (split(/\n/)) {
+ my $selectit = $XHTML ? 'selected="selected"' : 'selected';
+ s/(value="$selected")/$selectit $1/ if defined $selected;
+ $result .= "$_\n";
+ }
+ }
+ else {
+ my $attribs = $self->_set_attributes($_, $attributes);
+ my($label) = $_;
+ $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
+ $label=$self->_maybe_escapeHTML($label);
+ my($value)=$self->_maybe_escapeHTML($_,1);
+ $result .= $labeled ? $novals ? "<option$attribs label=\"$value\">$label</option>\n"
+ : "<option$attribs label=\"$value\" value=\"$value\">$label</option>\n"
+ : $novals ? "<option$attribs>$label</option>\n"
+ : "<option$attribs value=\"$value\">$label</option>\n";
+ }
+ }
+ $result .= "</optgroup>";
+ return $result;
+}
+END_OF_FUNC
+
+
+#### Method: scrolling_list
+# Create a scrolling list.
+# Parameters:
+# $name -> name for the list
+# $values -> A pointer to a regular array containing the
+# values for each option line in the list.
+# $defaults -> (optional)
+# 1. If a pointer to a regular array of options,
+# then this will be used to decide which
+# lines to turn on by default.
+# 2. Otherwise holds the value of the single line to turn on.
+# $size -> (optional) Size of the list.
+# $multiple -> (optional) If set, allow multiple selections.
+# $labels -> (optional)
+# A pointer to a hash of labels to print next to each checkbox
+# in the form $label{'value'}="Long explanatory label".
+# Otherwise the provided values are used as the labels.
+# Returns:
+# A string containing the definition of a scrolling list.
+####
+'scrolling_list' => <<'END_OF_FUNC',
+sub scrolling_list {
+ my($self,@p) = self_or_default(@_);
+ my($name,$values,$defaults,$size,$multiple,$labels,$attributes,$override,$tabindex,@other)
+ = rearrange([NAME,[VALUES,VALUE],[DEFAULTS,DEFAULT],
+ SIZE,MULTIPLE,LABELS,ATTRIBUTES,[OVERRIDE,FORCE],TABINDEX],@p);
+
+ my($result,@values);
+ @values = $self->_set_values_and_labels($values,\$labels,$name);
+
+ $size = $size || scalar(@values);
+
+ my(%selected) = $self->previous_or_default($name,$defaults,$override);
+
+ my($is_multiple) = $multiple ? qq/ multiple="multiple"/ : '';
+ my($has_size) = $size ? qq/ size="$size"/: '';
+ my($other) = @other ? " @other" : '';
+
+ $name=$self->_maybe_escapeHTML($name);
+ $tabindex = $self->element_tab($tabindex);
+ $result = qq/<select name="$name" $tabindex$has_size$is_multiple$other>\n/;
+ for (@values) {
+ if (/<optgroup/) {
+ for my $v (split(/\n/)) {
+ my $selectit = $XHTML ? 'selected="selected"' : 'selected';
+ for my $selected (keys %selected) {
+ $v =~ s/(value="$selected")/$selectit $1/;
+ }
+ $result .= "$v\n";
+ }
+ }
+ else {
+ my $attribs = $self->_set_attributes($_, $attributes);
+ my($selectit) = $self->_selected($selected{$_});
+ my($label) = $_;
+ $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
+ my($value) = $self->_maybe_escapeHTML($_);
+ $label = $self->_maybe_escapeHTML($label,1);
+ $result .= "<option${attribs} ${selectit}value=\"$value\">$label</option>\n";
+ }
+ }
+
+ $result .= "</select>";
+ $self->register_parameter($name);
+ return $result;
+}
+END_OF_FUNC
+
+
+#### Method: hidden
+# Parameters:
+# $name -> Name of the hidden field
+# @default -> (optional) Initial values of field (may be an array)
+# or
+# $default->[initial values of field]
+# Returns:
+# A string containing a <input type="hidden" name="name" value="value">
+####
+'hidden' => <<'END_OF_FUNC',
+sub hidden {
+ my($self,@p) = self_or_default(@_);
+
+ # this is the one place where we departed from our standard
+ # calling scheme, so we have to special-case (darn)
+ my(@result,@value);
+ my($name,$default,$override,@other) =
+ rearrange([NAME,[DEFAULT,VALUE,VALUES],[OVERRIDE,FORCE]],@p);
+
+ my $do_override = 0;
+ if ( ref($p[0]) || substr($p[0],0,1) eq '-') {
+ @value = ref($default) ? @{$default} : $default;
+ $do_override = $override;
+ } else {
+ for ($default,$override,@other) {
+ push(@value,$_) if defined($_);
+ }
+ undef @other;
+ }
+
+ # use previous values if override is not set
+ my @prev = $self->param($name);
+ @value = @prev if !$do_override && @prev;
+
+ $name=$self->_maybe_escapeHTML($name);
+ for (@value) {
+ $_ = defined($_) ? $self->_maybe_escapeHTML($_,1) : '';
+ push @result,$XHTML ? qq(<input type="hidden" name="$name" value="$_" @other />)
+ : qq(<input type="hidden" name="$name" value="$_" @other>);
+ }
+ return wantarray ? @result : join('',@result);
+}
+END_OF_FUNC
+
+
+#### Method: image_button
+# Parameters:
+# $name -> Name of the button
+# $src -> URL of the image source
+# $align -> Alignment style (TOP, BOTTOM or MIDDLE)
+# Returns:
+# A string containing a <input type="image" name="name" src="url" align="alignment">
+####
+'image_button' => <<'END_OF_FUNC',
+sub image_button {
+ my($self,@p) = self_or_default(@_);
+
+ my($name,$src,$alignment,@other) =
+ rearrange([NAME,SRC,ALIGN],@p);
+
+ my($align) = $alignment ? " align=\L\"$alignment\"" : '';
+ my($other) = @other ? " @other" : '';
+ $name=$self->_maybe_escapeHTML($name);
+ return $XHTML ? qq(<input type="image" name="$name" src="$src"$align$other />)
+ : qq/<input type="image" name="$name" src="$src"$align$other>/;
+}
+END_OF_FUNC
+
+
+#### Method: self_url
+# Returns a URL containing the current script and all its
+# param/value pairs arranged as a query. You can use this
+# to create a link that, when selected, will reinvoke the
+# script with all its state information preserved.
+####
+'self_url' => <<'END_OF_FUNC',
+sub self_url {
+ my($self,@p) = self_or_default(@_);
+ return $self->url('-path_info'=>1,'-query'=>1,'-full'=>1,@p);
+}
+END_OF_FUNC
+
+
+# This is provided as a synonym to self_url() for people unfortunate
+# enough to have incorporated it into their programs already!
+'state' => <<'END_OF_FUNC',
+sub state {
+ &self_url;
+}
+END_OF_FUNC
+
+
+#### Method: url
+# Like self_url, but doesn't return the query string part of
+# the URL.
+####
+'url' => <<'END_OF_FUNC',
+sub url {
+ my($self,@p) = self_or_default(@_);
+ my ($relative,$absolute,$full,$path_info,$query,$base,$rewrite) =
+ rearrange(['RELATIVE','ABSOLUTE','FULL',['PATH','PATH_INFO'],['QUERY','QUERY_STRING'],'BASE','REWRITE'],@p);
+ my $url = '';
+ $full++ if $base || !($relative || $absolute);
+ $rewrite++ unless defined $rewrite;
+
+ my $path = $self->path_info;
+ my $script_name = $self->script_name;
+ my $request_uri = unescape($self->request_uri) || '';
+ my $query_str = $self->query_string;
+
+ my $rewrite_in_use = $request_uri && $request_uri !~ /^\Q$script_name/;
+ undef $path if $rewrite_in_use && $rewrite; # path not valid when rewriting active
+
+ my $uri = $rewrite && $request_uri ? $request_uri : $script_name;
+ $uri =~ s/\?.*$//s; # remove query string
+ $uri =~ s/\Q$ENV{PATH_INFO}\E$// if defined $ENV{PATH_INFO};
+# $uri =~ s/\Q$path\E$// if defined $path; # remove path
+
+ if ($full) {
+ my $protocol = $self->protocol();
+ $url = "$protocol://";
+ my $vh = http('x_forwarded_host') || http('host') || '';
+ $vh =~ s/\:\d+$//; # some clients add the port number (incorrectly). Get rid of it.
+ if ($vh) {
+ $url .= $vh;
+ } else {
+ $url .= server_name();
+ }
+ my $port = $self->server_port;
+ $url .= ":" . $port
+ unless (lc($protocol) eq 'http' && $port == 80)
+ || (lc($protocol) eq 'https' && $port == 443);
+ return $url if $base;
+ $url .= $uri;
+ } elsif ($relative) {
+ ($url) = $uri =~ m!([^/]+)$!;
+ } elsif ($absolute) {
+ $url = $uri;
+ }
+
+ $url .= $path if $path_info and defined $path;
+ $url .= "?$query_str" if $query and $query_str ne '';
+ $url ||= '';
+ $url =~ s/([^a-zA-Z0-9_.%;&?\/\\:+=~-])/sprintf("%%%02X",ord($1))/eg;
+ return $url;
+}
+
+END_OF_FUNC
+
+#### Method: cookie
+# Set or read a cookie from the specified name.
+# Cookie can then be passed to header().
+# Usual rules apply to the stickiness of -value.
+# Parameters:
+# -name -> name for this cookie (optional)
+# -value -> value of this cookie (scalar, array or hash)
+# -path -> paths for which this cookie is valid (optional)
+# -domain -> internet domain in which this cookie is valid (optional)
+# -secure -> if true, cookie only passed through secure channel (optional)
+# -expires -> expiry date in format Wdy, DD-Mon-YYYY HH:MM:SS GMT (optional)
+####
+'cookie' => <<'END_OF_FUNC',
+sub cookie {
+ my($self,@p) = self_or_default(@_);
+ my($name,$value,$path,$domain,$secure,$expires,$httponly) =
+ rearrange([NAME,[VALUE,VALUES],PATH,DOMAIN,SECURE,EXPIRES,HTTPONLY],@p);
+
+ require CGI::Cookie;
+
+ # if no value is supplied, then we retrieve the
+ # value of the cookie, if any. For efficiency, we cache the parsed
+ # cookies in our state variables.
+ unless ( defined($value) ) {
+ $self->{'.cookies'} = CGI::Cookie->fetch;
+
+ # If no name is supplied, then retrieve the names of all our cookies.
+ return () unless $self->{'.cookies'};
+ return keys %{$self->{'.cookies'}} unless $name;
+ return () unless $self->{'.cookies'}->{$name};
+ return $self->{'.cookies'}->{$name}->value if defined($name) && $name ne '';
+ }
+
+ # If we get here, we're creating a new cookie
+ return undef unless defined($name) && $name ne ''; # this is an error
+
+ my @param;
+ push(@param,'-name'=>$name);
+ push(@param,'-value'=>$value);
+ push(@param,'-domain'=>$domain) if $domain;
+ push(@param,'-path'=>$path) if $path;
+ push(@param,'-expires'=>$expires) if $expires;
+ push(@param,'-secure'=>$secure) if $secure;
+ push(@param,'-httponly'=>$httponly) if $httponly;
+
+ return CGI::Cookie->new(@param);
+}
+END_OF_FUNC
+
+'parse_keywordlist' => <<'END_OF_FUNC',
+sub parse_keywordlist {
+ my($self,$tosplit) = @_;
+ $tosplit = unescape($tosplit); # unescape the keywords
+ $tosplit=~tr/+/ /; # pluses to spaces
+ my(@keywords) = split(/\s+/,$tosplit);
+ return @keywords;
+}
+END_OF_FUNC
+
+'param_fetch' => <<'END_OF_FUNC',
+sub param_fetch {
+ my($self,@p) = self_or_default(@_);
+ my($name) = rearrange([NAME],@p);
+ unless (exists($self->{param}{$name})) {
+ $self->add_parameter($name);
+ $self->{param}{$name} = [];
+ }
+
+ return $self->{param}{$name};
+}
+END_OF_FUNC
+
+###############################################
+# OTHER INFORMATION PROVIDED BY THE ENVIRONMENT
+###############################################
+
+#### Method: path_info
+# Return the extra virtual path information provided
+# after the URL (if any)
+####
+'path_info' => <<'END_OF_FUNC',
+sub path_info {
+ my ($self,$info) = self_or_default(@_);
+ if (defined($info)) {
+ $info = "/$info" if $info ne '' && substr($info,0,1) ne '/';
+ $self->{'.path_info'} = $info;
+ } elsif (! defined($self->{'.path_info'}) ) {
+ my (undef,$path_info) = $self->_name_and_path_from_env;
+ $self->{'.path_info'} = $path_info || '';
+ }
+ return $self->{'.path_info'};
+}
+END_OF_FUNC
+
+# This function returns a potentially modified version of SCRIPT_NAME
+# and PATH_INFO. Some HTTP servers do sanitise the paths in those
+# variables. It is the case of at least Apache 2. If for instance the
+# user requests: /path/./to/script.cgi/x//y/z/../x?y, Apache will set:
+# REQUEST_URI=/path/./to/script.cgi/x//y/z/../x?y
+# SCRIPT_NAME=/path/to/env.cgi
+# PATH_INFO=/x/y/x
+#
+# This is all fine except that some bogus CGI scripts expect
+# PATH_INFO=/http://foo when the user requests
+# http://xxx/script.cgi/http://foo
+#
+# Old versions of this module used to accomodate with those scripts, so
+# this is why we do this here to keep those scripts backward compatible.
+# Basically, we accomodate with those scripts but within limits, that is
+# we only try to preserve the number of / that were provided by the user
+# if $REQUEST_URI and "$SCRIPT_NAME$PATH_INFO" only differ by the number
+# of consecutive /.
+#
+# So for instance, in: http://foo/x//y/script.cgi/a//b, we'll return a
+# script_name of /x//y/script.cgi and a path_info of /a//b, but in:
+# http://foo/./x//z/script.cgi/a/../b//c, we'll return the versions
+# possibly sanitised by the HTTP server, so in the case of Apache 2:
+# script_name == /foo/x/z/script.cgi and path_info == /b/c.
+#
+# Future versions of this module may no longer do that, so one should
+# avoid relying on the browser, proxy, server, and CGI.pm preserving the
+# number of consecutive slashes as no guarantee can be made there.
+'_name_and_path_from_env' => <<'END_OF_FUNC',
+sub _name_and_path_from_env {
+ my $self = shift;
+ my $script_name = $ENV{SCRIPT_NAME} || '';
+ my $path_info = $ENV{PATH_INFO} || '';
+ my $uri = $self->request_uri || '';
+
+ $uri =~ s/\?.*//s;
+ $uri = unescape($uri);
+
+ if ($uri ne "$script_name$path_info") {
+ my $script_name_pattern = quotemeta($script_name);
+ my $path_info_pattern = quotemeta($path_info);
+ $script_name_pattern =~ s{(?:\\/)+}{/+}g;
+ $path_info_pattern =~ s{(?:\\/)+}{/+}g;
+
+ if ($uri =~ /^($script_name_pattern)($path_info_pattern)$/s) {
+ # REQUEST_URI and SCRIPT_NAME . PATH_INFO only differ by the
+ # numer of consecutive slashes, so we can extract the info from
+ # REQUEST_URI:
+ ($script_name, $path_info) = ($1, $2);
+ }
+ }
+ return ($script_name,$path_info);
+}
+END_OF_FUNC
+
+
+#### Method: request_method
+# Returns 'POST', 'GET', 'PUT' or 'HEAD'
+####
+'request_method' => <<'END_OF_FUNC',
+sub request_method {
+ return (defined $ENV{'REQUEST_METHOD'}) ? $ENV{'REQUEST_METHOD'} : undef;
+}
+END_OF_FUNC
+
+#### Method: content_type
+# Returns the content_type string
+####
+'content_type' => <<'END_OF_FUNC',
+sub content_type {
+ return (defined $ENV{'CONTENT_TYPE'}) ? $ENV{'CONTENT_TYPE'} : undef;
+}
+END_OF_FUNC
+
+#### Method: path_translated
+# Return the physical path information provided
+# by the URL (if any)
+####
+'path_translated' => <<'END_OF_FUNC',
+sub path_translated {
+ return (defined $ENV{'PATH_TRANSLATED'}) ? $ENV{'PATH_TRANSLATED'} : undef;
+}
+END_OF_FUNC
+
+
+#### Method: request_uri
+# Return the literal request URI
+####
+'request_uri' => <<'END_OF_FUNC',
+sub request_uri {
+ return (defined $ENV{'REQUEST_URI'}) ? $ENV{'REQUEST_URI'} : undef;
+}
+END_OF_FUNC
+
+
+#### Method: query_string
+# Synthesize a query string from our current
+# parameters
+####
+'query_string' => <<'END_OF_FUNC',
+sub query_string {
+ my($self) = self_or_default(@_);
+ my($param,$value,@pairs);
+ for $param ($self->param) {
+ my($eparam) = escape($param);
+ for $value ($self->param($param)) {
+ $value = escape($value);
+ next unless defined $value;
+ push(@pairs,"$eparam=$value");
+ }
+ }
+ for (keys %{$self->{'.fieldnames'}}) {
+ push(@pairs,".cgifields=".escape("$_"));
+ }
+ return join($USE_PARAM_SEMICOLONS ? ';' : '&',@pairs);
+}
+END_OF_FUNC
+
+
+#### Method: accept
+# Without parameters, returns an array of the
+# MIME types the browser accepts.
+# With a single parameter equal to a MIME
+# type, will return undef if the browser won't
+# accept it, 1 if the browser accepts it but
+# doesn't give a preference, or a floating point
+# value between 0.0 and 1.0 if the browser
+# declares a quantitative score for it.
+# This handles MIME type globs correctly.
+####
+'Accept' => <<'END_OF_FUNC',
+sub Accept {
+ my($self,$search) = self_or_CGI(@_);
+ my(%prefs,$type,$pref,$pat);
+
+ my(@accept) = defined $self->http('accept')
+ ? split(',',$self->http('accept'))
+ : ();
+
+ for (@accept) {
+ ($pref) = /q=(\d\.\d+|\d+)/;
+ ($type) = m#(\S+/[^;]+)#;
+ next unless $type;
+ $prefs{$type}=$pref || 1;
+ }
+
+ return keys %prefs unless $search;
+
+ # if a search type is provided, we may need to
+ # perform a pattern matching operation.
+ # The MIME types use a glob mechanism, which
+ # is easily translated into a perl pattern match
+
+ # First return the preference for directly supported
+ # types:
+ return $prefs{$search} if $prefs{$search};
+
+ # Didn't get it, so try pattern matching.
+ for (keys %prefs) {
+ next unless /\*/; # not a pattern match
+ ($pat = $_) =~ s/([^\w*])/\\$1/g; # escape meta characters
+ $pat =~ s/\*/.*/g; # turn it into a pattern
+ return $prefs{$_} if $search=~/$pat/;
+ }
+}
+END_OF_FUNC
+
+
+#### Method: user_agent
+# If called with no parameters, returns the user agent.
+# If called with one parameter, does a pattern match (case
+# insensitive) on the user agent.
+####
+'user_agent' => <<'END_OF_FUNC',
+sub user_agent {
+ my($self,$match)=self_or_CGI(@_);
+ my $user_agent = $self->http('user_agent');
+ return $user_agent unless $match && $user_agent;
+ return $user_agent =~ /$match/i;
+}
+END_OF_FUNC
+
+
+#### Method: raw_cookie
+# Returns the magic cookies for the session.
+# The cookies are not parsed or altered in any way, i.e.
+# cookies are returned exactly as given in the HTTP
+# headers. If a cookie name is given, only that cookie's
+# value is returned, otherwise the entire raw cookie
+# is returned.
+####
+'raw_cookie' => <<'END_OF_FUNC',
+sub raw_cookie {
+ my($self,$key) = self_or_CGI(@_);
+
+ require CGI::Cookie;
+
+ if (defined($key)) {
+ $self->{'.raw_cookies'} = CGI::Cookie->raw_fetch
+ unless $self->{'.raw_cookies'};
+
+ return () unless $self->{'.raw_cookies'};
+ return () unless $self->{'.raw_cookies'}->{$key};
+ return $self->{'.raw_cookies'}->{$key};
+ }
+ return $self->http('cookie') || $ENV{'COOKIE'} || '';
+}
+END_OF_FUNC
+
+#### Method: virtual_host
+# Return the name of the virtual_host, which
+# is not always the same as the server
+######
+'virtual_host' => <<'END_OF_FUNC',
+sub virtual_host {
+ my $vh = http('x_forwarded_host') || http('host') || server_name();
+ $vh =~ s/:\d+$//; # get rid of port number
+ return $vh;
+}
+END_OF_FUNC
+
+#### Method: remote_host
+# Return the name of the remote host, or its IP
+# address if unavailable. If this variable isn't
+# defined, it returns "localhost" for debugging
+# purposes.
+####
+'remote_host' => <<'END_OF_FUNC',
+sub remote_host {
+ return $ENV{'REMOTE_HOST'} || $ENV{'REMOTE_ADDR'}
+ || 'localhost';
+}
+END_OF_FUNC
+
+
+#### Method: remote_addr
+# Return the IP addr of the remote host.
+####
+'remote_addr' => <<'END_OF_FUNC',
+sub remote_addr {
+ return $ENV{'REMOTE_ADDR'} || '127.0.0.1';
+}
+END_OF_FUNC
+
+
+#### Method: script_name
+# Return the partial URL to this script for
+# self-referencing scripts. Also see
+# self_url(), which returns a URL with all state information
+# preserved.
+####
+'script_name' => <<'END_OF_FUNC',
+sub script_name {
+ my ($self,@p) = self_or_default(@_);
+ if (@p) {
+ $self->{'.script_name'} = shift @p;
+ } elsif (!exists $self->{'.script_name'}) {
+ my ($script_name,$path_info) = $self->_name_and_path_from_env();
+ $self->{'.script_name'} = $script_name;
+ }
+ return $self->{'.script_name'};
+}
+END_OF_FUNC
+
+
+#### Method: referer
+# Return the HTTP_REFERER: useful for generating
+# a GO BACK button.
+####
+'referer' => <<'END_OF_FUNC',
+sub referer {
+ my($self) = self_or_CGI(@_);
+ return $self->http('referer');
+}
+END_OF_FUNC
+
+
+#### Method: server_name
+# Return the name of the server
+####
+'server_name' => <<'END_OF_FUNC',
+sub server_name {
+ return $ENV{'SERVER_NAME'} || 'localhost';
+}
+END_OF_FUNC
+
+#### Method: server_software
+# Return the name of the server software
+####
+'server_software' => <<'END_OF_FUNC',
+sub server_software {
+ return $ENV{'SERVER_SOFTWARE'} || 'cmdline';
+}
+END_OF_FUNC
+
+#### Method: virtual_port
+# Return the server port, taking virtual hosts into account
+####
+'virtual_port' => <<'END_OF_FUNC',
+sub virtual_port {
+ my($self) = self_or_default(@_);
+ my $vh = $self->http('x_forwarded_host') || $self->http('host');
+ my $protocol = $self->protocol;
+ if ($vh) {
+ return ($vh =~ /:(\d+)$/)[0] || ($protocol eq 'https' ? 443 : 80);
+ } else {
+ return $self->server_port();
+ }
+}
+END_OF_FUNC
+
+#### Method: server_port
+# Return the tcp/ip port the server is running on
+####
+'server_port' => <<'END_OF_FUNC',
+sub server_port {
+ return $ENV{'SERVER_PORT'} || 80; # for debugging
+}
+END_OF_FUNC
+
+#### Method: server_protocol
+# Return the protocol (usually HTTP/1.0)
+####
+'server_protocol' => <<'END_OF_FUNC',
+sub server_protocol {
+ return $ENV{'SERVER_PROTOCOL'} || 'HTTP/1.0'; # for debugging
+}
+END_OF_FUNC
+
+#### Method: http
+# Return the value of an HTTP variable, or
+# the list of variables if none provided
+####
+'http' => <<'END_OF_FUNC',
+sub http {
+ my ($self,$parameter) = self_or_CGI(@_);
+ if ( defined($parameter) ) {
+ $parameter =~ tr/-a-z/_A-Z/;
+ if ( $parameter =~ /^HTTP(?:_|$)/ ) {
+ return $ENV{$parameter};
+ }
+ return $ENV{"HTTP_$parameter"};
+ }
+ return grep { /^HTTP(?:_|$)/ } keys %ENV;
+}
+END_OF_FUNC
+
+#### Method: https
+# Return the value of HTTPS, or
+# the value of an HTTPS variable, or
+# the list of variables
+####
+'https' => <<'END_OF_FUNC',
+sub https {
+ my ($self,$parameter) = self_or_CGI(@_);
+ if ( defined($parameter) ) {
+ $parameter =~ tr/-a-z/_A-Z/;
+ if ( $parameter =~ /^HTTPS(?:_|$)/ ) {
+ return $ENV{$parameter};
+ }
+ return $ENV{"HTTPS_$parameter"};
+ }
+ return wantarray
+ ? grep { /^HTTPS(?:_|$)/ } keys %ENV
+ : $ENV{'HTTPS'};
+}
+END_OF_FUNC
+
+#### Method: protocol
+# Return the protocol (http or https currently)
+####
+'protocol' => <<'END_OF_FUNC',
+sub protocol {
+ local($^W)=0;
+ my $self = shift;
+ return 'https' if uc($self->https()) eq 'ON';
+ return 'https' if $self->server_port == 443;
+ my $prot = $self->server_protocol;
+ my($protocol,$version) = split('/',$prot);
+ return "\L$protocol\E";
+}
+END_OF_FUNC
+
+#### Method: remote_ident
+# Return the identity of the remote user
+# (but only if his host is running identd)
+####
+'remote_ident' => <<'END_OF_FUNC',
+sub remote_ident {
+ return (defined $ENV{'REMOTE_IDENT'}) ? $ENV{'REMOTE_IDENT'} : undef;
+}
+END_OF_FUNC
+
+
+#### Method: auth_type
+# Return the type of use verification/authorization in use, if any.
+####
+'auth_type' => <<'END_OF_FUNC',
+sub auth_type {
+ return (defined $ENV{'AUTH_TYPE'}) ? $ENV{'AUTH_TYPE'} : undef;
+}
+END_OF_FUNC
+
+
+#### Method: remote_user
+# Return the authorization name used for user
+# verification.
+####
+'remote_user' => <<'END_OF_FUNC',
+sub remote_user {
+ return (defined $ENV{'REMOTE_USER'}) ? $ENV{'REMOTE_USER'} : undef;
+}
+END_OF_FUNC
+
+
+#### Method: user_name
+# Try to return the remote user's name by hook or by
+# crook
+####
+'user_name' => <<'END_OF_FUNC',
+sub user_name {
+ my ($self) = self_or_CGI(@_);
+ return $self->http('from') || $ENV{'REMOTE_IDENT'} || $ENV{'REMOTE_USER'};
+}
+END_OF_FUNC
+
+#### Method: nosticky
+# Set or return the NOSTICKY global flag
+####
+'nosticky' => <<'END_OF_FUNC',
+sub nosticky {
+ my ($self,$param) = self_or_CGI(@_);
+ $CGI::NOSTICKY = $param if defined($param);
+ return $CGI::NOSTICKY;
+}
+END_OF_FUNC
+
+#### Method: nph
+# Set or return the NPH global flag
+####
+'nph' => <<'END_OF_FUNC',
+sub nph {
+ my ($self,$param) = self_or_CGI(@_);
+ $CGI::NPH = $param if defined($param);
+ return $CGI::NPH;
+}
+END_OF_FUNC
+
+#### Method: private_tempfiles
+# Set or return the private_tempfiles global flag
+####
+'private_tempfiles' => <<'END_OF_FUNC',
+sub private_tempfiles {
+ my ($self,$param) = self_or_CGI(@_);
+ $CGI::PRIVATE_TEMPFILES = $param if defined($param);
+ return $CGI::PRIVATE_TEMPFILES;
+}
+END_OF_FUNC
+#### Method: close_upload_files
+# Set or return the close_upload_files global flag
+####
+'close_upload_files' => <<'END_OF_FUNC',
+sub close_upload_files {
+ my ($self,$param) = self_or_CGI(@_);
+ $CGI::CLOSE_UPLOAD_FILES = $param if defined($param);
+ return $CGI::CLOSE_UPLOAD_FILES;
+}
+END_OF_FUNC
+
+
+#### Method: default_dtd
+# Set or return the default_dtd global
+####
+'default_dtd' => <<'END_OF_FUNC',
+sub default_dtd {
+ my ($self,$param,$param2) = self_or_CGI(@_);
+ if (defined $param2 && defined $param) {
+ $CGI::DEFAULT_DTD = [ $param, $param2 ];
+ } elsif (defined $param) {
+ $CGI::DEFAULT_DTD = $param;
+ }
+ return $CGI::DEFAULT_DTD;
+}
+END_OF_FUNC
+
+# -------------- really private subroutines -----------------
+'_maybe_escapeHTML' => <<'END_OF_FUNC',
+sub _maybe_escapeHTML {
+ # hack to work around earlier hacks
+ push @_,$_[0] if @_==1 && $_[0] eq 'CGI';
+ my ($self,$toencode,$newlinestoo) = CGI::self_or_default(@_);
+ return undef unless defined($toencode);
+ return $toencode if ref($self) && !$self->{'escape'};
+ return $self->escapeHTML($toencode, $newlinestoo);
+}
+END_OF_FUNC
+
+'previous_or_default' => <<'END_OF_FUNC',
+sub previous_or_default {
+ my($self,$name,$defaults,$override) = @_;
+ my(%selected);
+
+ if (!$override && ($self->{'.fieldnames'}->{$name} ||
+ defined($self->param($name)) ) ) {
+ $selected{$_}++ for $self->param($name);
+ } elsif (defined($defaults) && ref($defaults) &&
+ (ref($defaults) eq 'ARRAY')) {
+ $selected{$_}++ for @{$defaults};
+ } else {
+ $selected{$defaults}++ if defined($defaults);
+ }
+
+ return %selected;
+}
+END_OF_FUNC
+
+'register_parameter' => <<'END_OF_FUNC',
+sub register_parameter {
+ my($self,$param) = @_;
+ $self->{'.parametersToAdd'}->{$param}++;
+}
+END_OF_FUNC
+
+'get_fields' => <<'END_OF_FUNC',
+sub get_fields {
+ my($self) = @_;
+ return $self->CGI::hidden('-name'=>'.cgifields',
+ '-values'=>[keys %{$self->{'.parametersToAdd'}}],
+ '-override'=>1);
+}
+END_OF_FUNC
+
+'read_from_cmdline' => <<'END_OF_FUNC',
+sub read_from_cmdline {
+ my($input,@words);
+ my($query_string);
+ my($subpath);
+ if ($DEBUG && @ARGV) {
+ @words = @ARGV;
+ } elsif ($DEBUG > 1) {
+ require "shellwords.pl";
+ print STDERR "(offline mode: enter name=value pairs on standard input; press ^D or ^Z when done)\n";
+ chomp(@lines = <STDIN>); # remove newlines
+ $input = join(" ",@lines);
+ @words = &shellwords($input);
+ }
+ for (@words) {
+ s/\\=/%3D/g;
+ s/\\&/%26/g;
+ }
+
+ if ("@words"=~/=/) {
+ $query_string = join('&',@words);
+ } else {
+ $query_string = join('+',@words);
+ }
+ if ($query_string =~ /^(.*?)\?(.*)$/)
+ {
+ $query_string = $2;
+ $subpath = $1;
+ }
+ return { 'query_string' => $query_string, 'subpath' => $subpath };
+}
+END_OF_FUNC
+
+#####
+# subroutine: read_multipart
+#
+# Read multipart data and store it into our parameters.
+# An interesting feature is that if any of the parts is a file, we
+# create a temporary file and open up a filehandle on it so that the
+# caller can read from it if necessary.
+#####
+'read_multipart' => <<'END_OF_FUNC',
+sub read_multipart {
+ my($self,$boundary,$length) = @_;
+ my($buffer) = $self->new_MultipartBuffer($boundary,$length);
+ return unless $buffer;
+ my(%header,$body);
+ my $filenumber = 0;
+ while (!$buffer->eof) {
+ %header = $buffer->readHeader;
+
+ unless (%header) {
+ $self->cgi_error("400 Bad request (malformed multipart POST)");
+ return;
+ }
+
+ $header{'Content-Disposition'} ||= ''; # quench uninit variable warning
+
+ my($param)= $header{'Content-Disposition'}=~/[\s;]name="([^"]*)"/;
+ $param .= $TAINTED;
+
+ # See RFC 1867, 2183, 2045
+ # NB: File content will be loaded into memory should
+ # content-disposition parsing fail.
+ my ($filename) = $header{'Content-Disposition'}
+ =~/ filename=(("[^"]*")|([a-z\d!\#'\*\+,\.^_\`\{\}\|\~]*))/i;
+
+ $filename ||= ''; # quench uninit variable warning
+
+ $filename =~ s/^"([^"]*)"$/$1/;
+ # Test for Opera's multiple upload feature
+ my($multipart) = ( defined( $header{'Content-Type'} ) &&
+ $header{'Content-Type'} =~ /multipart\/mixed/ ) ?
+ 1 : 0;
+
+ # add this parameter to our list
+ $self->add_parameter($param);
+
+ # If no filename specified, then just read the data and assign it
+ # to our parameter list.
+ if ( ( !defined($filename) || $filename eq '' ) && !$multipart ) {
+ my($value) = $buffer->readBody;
+ $value .= $TAINTED;
+ push(@{$self->{param}{$param}},$value);
+ next;
+ }
+
+ my ($tmpfile,$tmp,$filehandle);
+ UPLOADS: {
+ # If we get here, then we are dealing with a potentially large
+ # uploaded form. Save the data to a temporary file, then open
+ # the file for reading.
+
+ # skip the file if uploads disabled
+ if ($DISABLE_UPLOADS) {
+ while (defined($data = $buffer->read)) { }
+ last UPLOADS;
+ }
+
+ # set the filename to some recognizable value
+ if ( ( !defined($filename) || $filename eq '' ) && $multipart ) {
+ $filename = "multipart/mixed";
+ }
+
+ # choose a relatively unpredictable tmpfile sequence number
+ my $seqno = unpack("%16C*",join('',localtime,grep {defined $_} values %ENV));
+ for (my $cnt=10;$cnt>0;$cnt--) {
+ next unless $tmpfile = CGITempFile->new($seqno);
+ $tmp = $tmpfile->as_string;
+ last if defined($filehandle = Fh->new($filename,$tmp,$PRIVATE_TEMPFILES));
+ $seqno += int rand(100);
+ }
+ die "CGI open of tmpfile: $!\n" unless defined $filehandle;
+ $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode
+ && defined fileno($filehandle);
+
+ # if this is an multipart/mixed attachment, save the header
+ # together with the body for later parsing with an external
+ # MIME parser module
+ if ( $multipart ) {
+ for ( keys %header ) {
+ print $filehandle "$_: $header{$_}${CRLF}";
+ }
+ print $filehandle "${CRLF}";
+ }
+
+ my ($data);
+ local($\) = '';
+ my $totalbytes = 0;
+ while (defined($data = $buffer->read)) {
+ if (defined $self->{'.upload_hook'})
+ {
+ $totalbytes += length($data);
+ &{$self->{'.upload_hook'}}($filename ,$data, $totalbytes, $self->{'.upload_data'});
+ }
+ print $filehandle $data if ($self->{'use_tempfile'});
+ }
+
+ # back up to beginning of file
+ seek($filehandle,0,0);
+
+ ## Close the filehandle if requested this allows a multipart MIME
+ ## upload to contain many files, and we won't die due to too many
+ ## open file handles. The user can access the files using the hash
+ ## below.
+ close $filehandle if $CLOSE_UPLOAD_FILES;
+ $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode;
+
+ # Save some information about the uploaded file where we can get
+ # at it later.
+ # Use the typeglob as the key, as this is guaranteed to be
+ # unique for each filehandle. Don't use the file descriptor as
+ # this will be re-used for each filehandle if the
+ # close_upload_files feature is used.
+ $self->{'.tmpfiles'}->{$$filehandle}= {
+ hndl => $filehandle,
+ name => $tmpfile,
+ info => {%header},
+ };
+ push(@{$self->{param}{$param}},$filehandle);
+ }
+ }
+}
+END_OF_FUNC
+
+#####
+# subroutine: read_multipart_related
+#
+# Read multipart/related data and store it into our parameters. The
+# first parameter sets the start of the data. The part identified by
+# this Content-ID will not be stored as a file upload, but will be
+# returned by this method. All other parts will be available as file
+# uploads accessible by their Content-ID
+#####
+'read_multipart_related' => <<'END_OF_FUNC',
+sub read_multipart_related {
+ my($self,$start,$boundary,$length) = @_;
+ my($buffer) = $self->new_MultipartBuffer($boundary,$length);
+ return unless $buffer;
+ my(%header,$body);
+ my $filenumber = 0;
+ my $returnvalue;
+ while (!$buffer->eof) {
+ %header = $buffer->readHeader;
+
+ unless (%header) {
+ $self->cgi_error("400 Bad request (malformed multipart POST)");
+ return;
+ }
+
+ my($param) = $header{'Content-ID'}=~/\<([^\>]*)\>/;
+ $param .= $TAINTED;
+
+ # If this is the start part, then just read the data and assign it
+ # to our return variable.
+ if ( $param eq $start ) {
+ $returnvalue = $buffer->readBody;
+ $returnvalue .= $TAINTED;
+ next;
+ }
+
+ # add this parameter to our list
+ $self->add_parameter($param);
+
+ my ($tmpfile,$tmp,$filehandle);
+ UPLOADS: {
+ # If we get here, then we are dealing with a potentially large
+ # uploaded form. Save the data to a temporary file, then open
+ # the file for reading.
+
+ # skip the file if uploads disabled
+ if ($DISABLE_UPLOADS) {
+ while (defined($data = $buffer->read)) { }
+ last UPLOADS;
+ }
+
+ # choose a relatively unpredictable tmpfile sequence number
+ my $seqno = unpack("%16C*",join('',localtime,grep {defined $_} values %ENV));
+ for (my $cnt=10;$cnt>0;$cnt--) {
+ next unless $tmpfile = CGITempFile->new($seqno);
+ $tmp = $tmpfile->as_string;
+ last if defined($filehandle = Fh->new($param,$tmp,$PRIVATE_TEMPFILES));
+ $seqno += int rand(100);
+ }
+ die "CGI open of tmpfile: $!\n" unless defined $filehandle;
+ $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode
+ && defined fileno($filehandle);
+
+ my ($data);
+ local($\) = '';
+ my $totalbytes;
+ while (defined($data = $buffer->read)) {
+ if (defined $self->{'.upload_hook'})
+ {
+ $totalbytes += length($data);
+ &{$self->{'.upload_hook'}}($param ,$data, $totalbytes, $self->{'.upload_data'});
+ }
+ print $filehandle $data if ($self->{'use_tempfile'});
+ }
+
+ # back up to beginning of file
+ seek($filehandle,0,0);
+
+ ## Close the filehandle if requested this allows a multipart MIME
+ ## upload to contain many files, and we won't die due to too many
+ ## open file handles. The user can access the files using the hash
+ ## below.
+ close $filehandle if $CLOSE_UPLOAD_FILES;
+ $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode;
+
+ # Save some information about the uploaded file where we can get
+ # at it later.
+ # Use the typeglob as the key, as this is guaranteed to be
+ # unique for each filehandle. Don't use the file descriptor as
+ # this will be re-used for each filehandle if the
+ # close_upload_files feature is used.
+ $self->{'.tmpfiles'}->{$$filehandle}= {
+ hndl => $filehandle,
+ name => $tmpfile,
+ info => {%header},
+ };
+ push(@{$self->{param}{$param}},$filehandle);
+ }
+ }
+ return $returnvalue;
+}
+END_OF_FUNC
+
+
+'upload' =><<'END_OF_FUNC',
+sub upload {
+ my($self,$param_name) = self_or_default(@_);
+ my @param = grep {ref($_) && defined(fileno($_))} $self->param($param_name);
+ return unless @param;
+ return wantarray ? @param : $param[0];
+}
+END_OF_FUNC
+
+'tmpFileName' => <<'END_OF_FUNC',
+sub tmpFileName {
+ my($self,$filename) = self_or_default(@_);
+ return $self->{'.tmpfiles'}->{$$filename}->{name} ?
+ $self->{'.tmpfiles'}->{$$filename}->{name}->as_string
+ : '';
+}
+END_OF_FUNC
+
+'uploadInfo' => <<'END_OF_FUNC',
+sub uploadInfo {
+ my($self,$filename) = self_or_default(@_);
+ return $self->{'.tmpfiles'}->{$$filename}->{info};
+}
+END_OF_FUNC
+
+# internal routine, don't use
+'_set_values_and_labels' => <<'END_OF_FUNC',
+sub _set_values_and_labels {
+ my $self = shift;
+ my ($v,$l,$n) = @_;
+ $$l = $v if ref($v) eq 'HASH' && !ref($$l);
+ return $self->param($n) if !defined($v);
+ return $v if !ref($v);
+ return ref($v) eq 'HASH' ? keys %$v : @$v;
+}
+END_OF_FUNC
+
+# internal routine, don't use
+'_set_attributes' => <<'END_OF_FUNC',
+sub _set_attributes {
+ my $self = shift;
+ my($element, $attributes) = @_;
+ return '' unless defined($attributes->{$element});
+ $attribs = ' ';
+ for my $attrib (keys %{$attributes->{$element}}) {
+ (my $clean_attrib = $attrib) =~ s/^-//;
+ $attribs .= "@{[lc($clean_attrib)]}=\"$attributes->{$element}{$attrib}\" ";
+ }
+ $attribs =~ s/ $//;
+ return $attribs;
+}
+END_OF_FUNC
+
+'_compile_all' => <<'END_OF_FUNC',
+sub _compile_all {
+ for (@_) {
+ next if defined(&$_);
+ $AUTOLOAD = "CGI::$_";
+ _compile();
+ }
+}
+END_OF_FUNC
+
+);
+END_OF_AUTOLOAD
+;
+
+#########################################################
+# Globals and stubs for other packages that we use.
+#########################################################
+
+################### Fh -- lightweight filehandle ###############
+package Fh;
+
+use overload
+ '""' => \&asString,
+ 'cmp' => \&compare,
+ 'fallback'=>1;
+
+$FH='fh00000';
+
+*Fh::AUTOLOAD = \&CGI::AUTOLOAD;
+
+sub DESTROY {
+ my $self = shift;
+ close $self;
+}
+
+$AUTOLOADED_ROUTINES = ''; # prevent -w error
+$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
+%SUBS = (
+'asString' => <<'END_OF_FUNC',
+sub asString {
+ my $self = shift;
+ # get rid of package name
+ (my $i = $$self) =~ s/^\*(\w+::fh\d{5})+//;
+ $i =~ s/%(..)/ chr(hex($1)) /eg;
+ return $i.$CGI::TAINTED;
+# BEGIN DEAD CODE
+# This was an extremely clever patch that allowed "use strict refs".
+# Unfortunately it relied on another bug that caused leaky file descriptors.
+# The underlying bug has been fixed, so this no longer works. However
+# "strict refs" still works for some reason.
+# my $self = shift;
+# return ${*{$self}{SCALAR}};
+# END DEAD CODE
+}
+END_OF_FUNC
+
+'compare' => <<'END_OF_FUNC',
+sub compare {
+ my $self = shift;
+ my $value = shift;
+ return "$self" cmp $value;
+}
+END_OF_FUNC
+
+'new' => <<'END_OF_FUNC',
+sub new {
+ my($pack,$name,$file,$delete) = @_;
+ _setup_symbols(@SAVED_SYMBOLS) if @SAVED_SYMBOLS;
+ require Fcntl unless defined &Fcntl::O_RDWR;
+ (my $safename = $name) =~ s/([':%])/ sprintf '%%%02X', ord $1 /eg;
+ my $fv = ++$FH . $safename;
+ my $ref = \*{"Fh::$fv"};
+
+ # Note this same regex is also used elsewhere in the same file for CGITempFile::new
+ $file =~ m!^([a-zA-Z0-9_ \'\":/.\$\\\+-]+)$! || return;
+ my $safe = $1;
+ sysopen($ref,$safe,Fcntl::O_RDWR()|Fcntl::O_CREAT()|Fcntl::O_EXCL(),0600) || return;
+ unlink($safe) if $delete;
+ CORE::delete $Fh::{$fv};
+ return bless $ref,$pack;
+}
+END_OF_FUNC
+
+'handle' => <<'END_OF_FUNC',
+sub handle {
+ my $self = shift;
+ eval "require IO::Handle" unless IO::Handle->can('new_from_fd');
+ return IO::Handle->new_from_fd(fileno $self,"<");
+}
+END_OF_FUNC
+
+);
+END_OF_AUTOLOAD
+
+######################## MultipartBuffer ####################
+package MultipartBuffer;
+
+use constant DEBUG => 0;
+
+# how many bytes to read at a time. We use
+# a 4K buffer by default.
+$INITIAL_FILLUNIT = 1024 * 4;
+$TIMEOUT = 240*60; # 4 hour timeout for big files
+$SPIN_LOOP_MAX = 2000; # bug fix for some Netscape servers
+$CRLF=$CGI::CRLF;
+
+#reuse the autoload function
+*MultipartBuffer::AUTOLOAD = \&CGI::AUTOLOAD;
+
+# avoid autoloader warnings
+sub DESTROY {}
+
+###############################################################################
+################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND ####################
+###############################################################################
+$AUTOLOADED_ROUTINES = ''; # prevent -w error
+$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
+%SUBS = (
+
+'new' => <<'END_OF_FUNC',
+sub new {
+ my($package,$interface,$boundary,$length) = @_;
+ $FILLUNIT = $INITIAL_FILLUNIT;
+ $CGI::DefaultClass->binmode($IN); # if $CGI::needs_binmode; # just do it always
+
+ # If the user types garbage into the file upload field,
+ # then Netscape passes NOTHING to the server (not good).
+ # We may hang on this read in that case. So we implement
+ # a read timeout. If nothing is ready to read
+ # by then, we return.
+
+ # Netscape seems to be a little bit unreliable
+ # about providing boundary strings.
+ my $boundary_read = 0;
+ if ($boundary) {
+
+ # Under the MIME spec, the boundary consists of the
+ # characters "--" PLUS the Boundary string
+
+ # BUG: IE 3.01 on the Macintosh uses just the boundary -- not
+ # the two extra hyphens. We do a special case here on the user-agent!!!!
+ $boundary = "--$boundary" unless CGI::user_agent('MSIE\s+3\.0[12];\s*Mac|DreamPassport');
+
+ } else { # otherwise we find it ourselves
+ my($old);
+ ($old,$/) = ($/,$CRLF); # read a CRLF-delimited line
+ $boundary = <STDIN>; # BUG: This won't work correctly under mod_perl
+ $length -= length($boundary);
+ chomp($boundary); # remove the CRLF
+ $/ = $old; # restore old line separator
+ $boundary_read++;
+ }
+
+ my $self = {LENGTH=>$length,
+ CHUNKED=>!$length,
+ BOUNDARY=>$boundary,
+ INTERFACE=>$interface,
+ BUFFER=>'',
+ };
+
+ $FILLUNIT = length($boundary)
+ if length($boundary) > $FILLUNIT;
+
+ my $retval = bless $self,ref $package || $package;
+
+ # Read the preamble and the topmost (boundary) line plus the CRLF.
+ unless ($boundary_read) {
+ while ($self->read(0)) { }
+ }
+ die "Malformed multipart POST: data truncated\n" if $self->eof;
+
+ return $retval;
+}
+END_OF_FUNC
+
+'readHeader' => <<'END_OF_FUNC',
+sub readHeader {
+ my($self) = @_;
+ my($end);
+ my($ok) = 0;
+ my($bad) = 0;
+
+ local($CRLF) = "\015\012" if $CGI::OS eq 'VMS' || $CGI::EBCDIC;
+
+ do {
+ $self->fillBuffer($FILLUNIT);
+ $ok++ if ($end = index($self->{BUFFER},"${CRLF}${CRLF}")) >= 0;
+ $ok++ if $self->{BUFFER} eq '';
+ $bad++ if !$ok && $self->{LENGTH} <= 0;
+ # this was a bad idea
+ # $FILLUNIT *= 2 if length($self->{BUFFER}) >= $FILLUNIT;
+ } until $ok || $bad;
+ return () if $bad;
+
+ #EBCDIC NOTE: translate header into EBCDIC, but watch out for continuation lines!
+
+ my($header) = substr($self->{BUFFER},0,$end+2);
+ substr($self->{BUFFER},0,$end+4) = '';
+ my %return;
+
+ if ($CGI::EBCDIC) {
+ warn "untranslated header=$header\n" if DEBUG;
+ $header = CGI::Util::ascii2ebcdic($header);
+ warn "translated header=$header\n" if DEBUG;
+ }
+
+ # See RFC 2045 Appendix A and RFC 822 sections 3.4.8
+ # (Folding Long Header Fields), 3.4.3 (Comments)
+ # and 3.4.5 (Quoted-Strings).
+
+ my $token = '[-\w!\#$%&\'*+.^_\`|{}~]';
+ $header=~s/$CRLF\s+/ /og; # merge continuation lines
+
+ while ($header=~/($token+):\s+([^$CRLF]*)/mgox) {
+ my ($field_name,$field_value) = ($1,$2);
+ $field_name =~ s/\b(\w)/uc($1)/eg; #canonicalize
+ $return{$field_name}=$field_value;
+ }
+ return %return;
+}
+END_OF_FUNC
+
+# This reads and returns the body as a single scalar value.
+'readBody' => <<'END_OF_FUNC',
+sub readBody {
+ my($self) = @_;
+ my($data);
+ my($returnval)='';
+
+ #EBCDIC NOTE: want to translate returnval into EBCDIC HERE
+
+ while (defined($data = $self->read)) {
+ $returnval .= $data;
+ }
+
+ if ($CGI::EBCDIC) {
+ warn "untranslated body=$returnval\n" if DEBUG;
+ $returnval = CGI::Util::ascii2ebcdic($returnval);
+ warn "translated body=$returnval\n" if DEBUG;
+ }
+ return $returnval;
+}
+END_OF_FUNC
+
+# This will read $bytes or until the boundary is hit, whichever happens
+# first. After the boundary is hit, we return undef. The next read will
+# skip over the boundary and begin reading again;
+'read' => <<'END_OF_FUNC',
+sub read {
+ my($self,$bytes) = @_;
+
+ # default number of bytes to read
+ $bytes = $bytes || $FILLUNIT;
+
+ # Fill up our internal buffer in such a way that the boundary
+ # is never split between reads.
+ $self->fillBuffer($bytes);
+
+ my $boundary_start = $CGI::EBCDIC ? CGI::Util::ebcdic2ascii($self->{BOUNDARY}) : $self->{BOUNDARY};
+ my $boundary_end = $CGI::EBCDIC ? CGI::Util::ebcdic2ascii($self->{BOUNDARY}.'--') : $self->{BOUNDARY}.'--';
+
+ # Find the boundary in the buffer (it may not be there).
+ my $start = index($self->{BUFFER},$boundary_start);
+
+ warn "boundary=$self->{BOUNDARY} length=$self->{LENGTH} start=$start\n" if DEBUG;
+
+ # protect against malformed multipart POST operations
+ die "Malformed multipart POST\n" unless $self->{CHUNKED} || ($start >= 0 || $self->{LENGTH} > 0);
+
+ #EBCDIC NOTE: want to translate boundary search into ASCII here.
+
+ # If the boundary begins the data, then skip past it
+ # and return undef.
+ if ($start == 0) {
+
+ # clear us out completely if we've hit the last boundary.
+ if (index($self->{BUFFER},$boundary_end)==0) {
+ $self->{BUFFER}='';
+ $self->{LENGTH}=0;
+ return undef;
+ }
+
+ # just remove the boundary.
+ substr($self->{BUFFER},0,length($boundary_start))='';
+ $self->{BUFFER} =~ s/^\012\015?//;
+ return undef;
+ }
+
+ my $bytesToReturn;
+ if ($start > 0) { # read up to the boundary
+ $bytesToReturn = $start-2 > $bytes ? $bytes : $start;
+ } else { # read the requested number of bytes
+ # leave enough bytes in the buffer to allow us to read
+ # the boundary. Thanks to Kevin Hendrick for finding
+ # this one.
+ $bytesToReturn = $bytes - (length($boundary_start)+1);
+ }
+
+ my $returnval=substr($self->{BUFFER},0,$bytesToReturn);
+ substr($self->{BUFFER},0,$bytesToReturn)='';
+
+ # If we hit the boundary, remove the CRLF from the end.
+ return ($bytesToReturn==$start)
+ ? substr($returnval,0,-2) : $returnval;
+}
+END_OF_FUNC
+
+
+# This fills up our internal buffer in such a way that the
+# boundary is never split between reads
+'fillBuffer' => <<'END_OF_FUNC',
+sub fillBuffer {
+ my($self,$bytes) = @_;
+ return unless $self->{CHUNKED} || $self->{LENGTH};
+
+ my($boundaryLength) = length($self->{BOUNDARY});
+ my($bufferLength) = length($self->{BUFFER});
+ my($bytesToRead) = $bytes - $bufferLength + $boundaryLength + 2;
+ $bytesToRead = $self->{LENGTH} if !$self->{CHUNKED} && $self->{LENGTH} < $bytesToRead;
+
+ # Try to read some data. We may hang here if the browser is screwed up.
+ my $bytesRead = $self->{INTERFACE}->read_from_client(\$self->{BUFFER},
+ $bytesToRead,
+ $bufferLength);
+ warn "bytesToRead=$bytesToRead, bufferLength=$bufferLength, buffer=$self->{BUFFER}\n" if DEBUG;
+ $self->{BUFFER} = '' unless defined $self->{BUFFER};
+
+ # An apparent bug in the Apache server causes the read()
+ # to return zero bytes repeatedly without blocking if the
+ # remote user aborts during a file transfer. I don't know how
+ # they manage this, but the workaround is to abort if we get
+ # more than SPIN_LOOP_MAX consecutive zero reads.
+ if ($bytesRead <= 0) {
+ die "CGI.pm: Server closed socket during multipart read (client aborted?).\n"
+ if ($self->{ZERO_LOOP_COUNTER}++ >= $SPIN_LOOP_MAX);
+ } else {
+ $self->{ZERO_LOOP_COUNTER}=0;
+ }
+
+ $self->{LENGTH} -= $bytesRead if !$self->{CHUNKED} && $bytesRead;
+}
+END_OF_FUNC
+
+
+# Return true when we've finished reading
+'eof' => <<'END_OF_FUNC'
+sub eof {
+ my($self) = @_;
+ return 1 if (length($self->{BUFFER}) == 0)
+ && ($self->{LENGTH} <= 0);
+ undef;
+}
+END_OF_FUNC
+
+);
+END_OF_AUTOLOAD
+
+####################################################################################
+################################## TEMPORARY FILES #################################
+####################################################################################
+package CGITempFile;
+
+sub find_tempdir {
+ $SL = $CGI::SL;
+ $MAC = $CGI::OS eq 'MACINTOSH';
+ my ($vol) = $MAC ? MacPerl::Volumes() =~ /:(.*)/ : "";
+ unless (defined $TMPDIRECTORY) {
+ @TEMP=("${SL}usr${SL}tmp","${SL}var${SL}tmp",
+ "C:${SL}temp","${SL}tmp","${SL}temp",
+ "${vol}${SL}Temporary Items",
+ "${SL}WWW_ROOT", "${SL}SYS\$SCRATCH",
+ "C:${SL}system${SL}temp");
+
+ if( $CGI::OS eq 'WINDOWS' ){
+ # PeterH: These evars may not exist if this is invoked within a service and untainting
+ # is in effect - with 'use warnings' the undefined array entries causes Perl to die
+ unshift(@TEMP,$ENV{TEMP}) if defined $ENV{TEMP};
+ unshift(@TEMP,$ENV{TMP}) if defined $ENV{TMP};
+ unshift(@TEMP,$ENV{WINDIR} . $SL . 'TEMP') if defined $ENV{WINDIR};
+ }
+
+ unshift(@TEMP,$ENV{'TMPDIR'}) if defined $ENV{'TMPDIR'};
+
+ # this feature was supposed to provide per-user tmpfiles, but
+ # it is problematic.
+ # unshift(@TEMP,(getpwuid($<))[7].'/tmp') if $CGI::OS eq 'UNIX';
+ # Rob: getpwuid() is unfortunately UNIX specific. On brain dead OS'es this
+ # : can generate a 'getpwuid() not implemented' exception, even though
+ # : it's never called. Found under DOS/Win with the DJGPP perl port.
+ # : Refer to getpwuid() only at run-time if we're fortunate and have UNIX.
+ # unshift(@TEMP,(eval {(getpwuid($>))[7]}).'/tmp') if $CGI::OS eq 'UNIX' and $> != 0;
+
+ for (@TEMP) {
+ do {$TMPDIRECTORY = $_; last} if -d $_ && -w _;
+ }
+ }
+ $TMPDIRECTORY = $MAC ? "" : "." unless $TMPDIRECTORY;
+}
+
+find_tempdir();
+
+$MAXTRIES = 5000;
+
+# cute feature, but overload implementation broke it
+# %OVERLOAD = ('""'=>'as_string');
+*CGITempFile::AUTOLOAD = \&CGI::AUTOLOAD;
+
+sub DESTROY {
+ my($self) = @_;
+ $$self =~ m!^([a-zA-Z0-9_ \'\":/.\$\\~-]+)$! || return;
+ my $safe = $1; # untaint operation
+ unlink $safe; # get rid of the file
+}
+
+###############################################################################
+################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND ####################
+###############################################################################
+$AUTOLOADED_ROUTINES = ''; # prevent -w error
+$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
+%SUBS = (
+
+'new' => <<'END_OF_FUNC',
+sub new {
+ my($package,$sequence) = @_;
+ my $filename;
+ find_tempdir() unless -w $TMPDIRECTORY;
+ for (my $i = 0; $i < $MAXTRIES; $i++) {
+ last if ! -f ($filename = sprintf("\%s${SL}CGItemp%d", $TMPDIRECTORY, $sequence++));
+ }
+ # check that it is a more-or-less valid filename
+ # Note this same regex is also used elsewhere in the same file for Fh::new
+ return unless $filename =~ m!^([a-zA-Z0-9_ \'\":/.\$\\\+-]+)$!;
+ # this used to untaint, now it doesn't
+ # $filename = $1;
+ return bless \$filename;
+}
+END_OF_FUNC
+
+'as_string' => <<'END_OF_FUNC'
+sub as_string {
+ my($self) = @_;
+ return $$self;
+}
+END_OF_FUNC
+
+);
+END_OF_AUTOLOAD
+
+package CGI;
+
+# We get a whole bunch of warnings about "possibly uninitialized variables"
+# when running with the -w switch. Touch them all once to get rid of the
+# warnings. This is ugly and I hate it.
+if ($^W) {
+ $CGI::CGI = '';
+ $CGI::CGI=<<EOF;
+ $CGI::VERSION;
+ $MultipartBuffer::SPIN_LOOP_MAX;
+ $MultipartBuffer::CRLF;
+ $MultipartBuffer::TIMEOUT;
+ $MultipartBuffer::INITIAL_FILLUNIT;
+EOF
+ ;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+CGI - Handle Common Gateway Interface requests and responses
+
+=head1 SYNOPSIS
+
+ use CGI;
+
+ my $q = CGI->new;
+
+ # Process an HTTP request
+ @values = $q->param('form_field');
+
+ $fh = $q->upload('file_field');
+
+ $riddle = $query->cookie('riddle_name');
+ %answers = $query->cookie('answers');
+
+ # Prepare various HTTP responses
+ print $q->header();
+ print $q->header('application/json');
+
+ $cookie1 = $q->cookie(-name=>'riddle_name', -value=>"The Sphynx's Question");
+ $cookie2 = $q->cookie(-name=>'answers', -value=>\%answers);
+ print $q->header(
+ -type => 'image/gif',
+ -expires => '+3d',
+ -cookie => [$cookie1,$cookie2]
+ );
+
+ print $q->redirect('http://somewhere.else/in/movie/land');
+
+=head1 DESCRIPTION
+
+CGI.pm is a stable, complete and mature solution for processing and preparing
+HTTP requests and responses. Major features including processing form
+submissions, file uploads, reading and writing cookies, query string generation
+and manipulation, and processing and preparing HTTP headers. Some HTML
+generation utilities are included as well.
+
+CGI.pm performs very well in in a vanilla CGI.pm environment and also comes
+with built-in support for mod_perl and mod_perl2 as well as FastCGI.
+
+It has the benefit of having developed and refined over 10 years with input
+from dozens of contributors and being deployed on thousands of websites.
+CGI.pm has been included in the Perl distribution since Perl 5.4, and has
+become a de-facto standard.
+
+=head2 PROGRAMMING STYLE
+
+There are two styles of programming with CGI.pm, an object-oriented
+style and a function-oriented style. In the object-oriented style you
+create one or more CGI objects and then use object methods to create
+the various elements of the page. Each CGI object starts out with the
+list of named parameters that were passed to your CGI script by the
+server. You can modify the objects, save them to a file or database
+and recreate them. Because each object corresponds to the "state" of
+the CGI script, and because each object's parameter list is
+independent of the others, this allows you to save the state of the
+script and restore it later.
+
+For example, using the object oriented style, here is how you create
+a simple "Hello World" HTML page:
+
+ #!/usr/local/bin/perl -w
+ use CGI; # load CGI routines
+ $q = CGI->new; # create new CGI object
+ print $q->header, # create the HTTP header
+ $q->start_html('hello world'), # start the HTML
+ $q->h1('hello world'), # level 1 header
+ $q->end_html; # end the HTML
+
+In the function-oriented style, there is one default CGI object that
+you rarely deal with directly. Instead you just call functions to
+retrieve CGI parameters, create HTML tags, manage cookies, and so
+on. This provides you with a cleaner programming interface, but
+limits you to using one CGI object at a time. The following example
+prints the same page, but uses the function-oriented interface.
+The main differences are that we now need to import a set of functions
+into our name space (usually the "standard" functions), and we don't
+need to create the CGI object.
+
+ #!/usr/local/bin/perl
+ use CGI qw/:standard/; # load standard CGI routines
+ print header, # create the HTTP header
+ start_html('hello world'), # start the HTML
+ h1('hello world'), # level 1 header
+ end_html; # end the HTML
+
+The examples in this document mainly use the object-oriented style.
+See HOW TO IMPORT FUNCTIONS for important information on
+function-oriented programming in CGI.pm
+
+=head2 CALLING CGI.PM ROUTINES
+
+Most CGI.pm routines accept several arguments, sometimes as many as 20
+optional ones! To simplify this interface, all routines use a named
+argument calling style that looks like this:
+
+ print $q->header(-type=>'image/gif',-expires=>'+3d');
+
+Each argument name is preceded by a dash. Neither case nor order
+matters in the argument list. -type, -Type, and -TYPE are all
+acceptable. In fact, only the first argument needs to begin with a
+dash. If a dash is present in the first argument, CGI.pm assumes
+dashes for the subsequent ones.
+
+Several routines are commonly called with just one argument. In the
+case of these routines you can provide the single argument without an
+argument name. header() happens to be one of these routines. In this
+case, the single argument is the document type.
+
+ print $q->header('text/html');
+
+Other such routines are documented below.
+
+Sometimes named arguments expect a scalar, sometimes a reference to an
+array, and sometimes a reference to a hash. Often, you can pass any
+type of argument and the routine will do whatever is most appropriate.
+For example, the param() routine is used to set a CGI parameter to a
+single or a multi-valued value. The two cases are shown below:
+
+ $q->param(-name=>'veggie',-value=>'tomato');
+ $q->param(-name=>'veggie',-value=>['tomato','tomahto','potato','potahto']);
+
+A large number of routines in CGI.pm actually aren't specifically
+defined in the module, but are generated automatically as needed.
+These are the "HTML shortcuts," routines that generate HTML tags for
+use in dynamically-generated pages. HTML tags have both attributes
+(the attribute="value" pairs within the tag itself) and contents (the
+part between the opening and closing pairs.) To distinguish between
+attributes and contents, CGI.pm uses the convention of passing HTML
+attributes as a hash reference as the first argument, and the
+contents, if any, as any subsequent arguments. It works out like
+this:
+
+ Code Generated HTML
+ ---- --------------
+ h1() <h1>
+ h1('some','contents'); <h1>some contents</h1>
+ h1({-align=>left}); <h1 align="LEFT">
+ h1({-align=>left},'contents'); <h1 align="LEFT">contents</h1>
+
+HTML tags are described in more detail later.
+
+Many newcomers to CGI.pm are puzzled by the difference between the
+calling conventions for the HTML shortcuts, which require curly braces
+around the HTML tag attributes, and the calling conventions for other
+routines, which manage to generate attributes without the curly
+brackets. Don't be confused. As a convenience the curly braces are
+optional in all but the HTML shortcuts. If you like, you can use
+curly braces when calling any routine that takes named arguments. For
+example:
+
+ print $q->header( {-type=>'image/gif',-expires=>'+3d'} );
+
+If you use the B<-w> switch, you will be warned that some CGI.pm argument
+names conflict with built-in Perl functions. The most frequent of
+these is the -values argument, used to create multi-valued menus,
+radio button clusters and the like. To get around this warning, you
+have several choices:
+
+=over 4
+
+=item 1.
+
+Use another name for the argument, if one is available.
+For example, -value is an alias for -values.
+
+=item 2.
+
+Change the capitalization, e.g. -Values
+
+=item 3.
+
+Put quotes around the argument name, e.g. '-values'
+
+=back
+
+Many routines will do something useful with a named argument that it
+doesn't recognize. For example, you can produce non-standard HTTP
+header fields by providing them as named arguments:
+
+ print $q->header(-type => 'text/html',
+ -cost => 'Three smackers',
+ -annoyance_level => 'high',
+ -complaints_to => 'bit bucket');
+
+This will produce the following nonstandard HTTP header:
+
+ HTTP/1.0 200 OK
+ Cost: Three smackers
+ Annoyance-level: high
+ Complaints-to: bit bucket
+ Content-type: text/html
+
+Notice the way that underscores are translated automatically into
+hyphens. HTML-generating routines perform a different type of
+translation.
+
+This feature allows you to keep up with the rapidly changing HTTP and
+HTML "standards".
+
+=head2 CREATING A NEW QUERY OBJECT (OBJECT-ORIENTED STYLE):
+
+ $query = CGI->new;
+
+This will parse the input (from both POST and GET methods) and store
+it into a perl5 object called $query.
+
+Any filehandles from file uploads will have their position reset to
+the beginning of the file.
+
+=head2 CREATING A NEW QUERY OBJECT FROM AN INPUT FILE
+
+ $query = CGI->new(INPUTFILE);
+
+If you provide a file handle to the new() method, it will read
+parameters from the file (or STDIN, or whatever). The file can be in
+any of the forms describing below under debugging (i.e. a series of
+newline delimited TAG=VALUE pairs will work). Conveniently, this type
+of file is created by the save() method (see below). Multiple records
+can be saved and restored.
+
+Perl purists will be pleased to know that this syntax accepts
+references to file handles, or even references to filehandle globs,
+which is the "official" way to pass a filehandle:
+
+ $query = CGI->new(\*STDIN);
+
+You can also initialize the CGI object with a FileHandle or IO::File
+object.
+
+If you are using the function-oriented interface and want to
+initialize CGI state from a file handle, the way to do this is with
+B<restore_parameters()>. This will (re)initialize the
+default CGI object from the indicated file handle.
+
+ open (IN,"test.in") || die;
+ restore_parameters(IN);
+ close IN;
+
+You can also initialize the query object from a hash
+reference:
+
+ $query = CGI->new( {'dinosaur'=>'barney',
+ 'song'=>'I love you',
+ 'friends'=>[qw/Jessica George Nancy/]}
+ );
+
+or from a properly formatted, URL-escaped query string:
+
+ $query = CGI->new('dinosaur=barney&color=purple');
+
+or from a previously existing CGI object (currently this clones the
+parameter list, but none of the other object-specific fields, such as
+autoescaping):
+
+ $old_query = CGI->new;
+ $new_query = CGI->new($old_query);
+
+To create an empty query, initialize it from an empty string or hash:
+
+ $empty_query = CGI->new("");
+
+ -or-
+
+ $empty_query = CGI->new({});
+
+=head2 FETCHING A LIST OF KEYWORDS FROM THE QUERY:
+
+ @keywords = $query->keywords
+
+If the script was invoked as the result of an <ISINDEX> search, the
+parsed keywords can be obtained as an array using the keywords() method.
+
+=head2 FETCHING THE NAMES OF ALL THE PARAMETERS PASSED TO YOUR SCRIPT:
+
+ @names = $query->param
+
+If the script was invoked with a parameter list
+(e.g. "name1=value1&name2=value2&name3=value3"), the param() method
+will return the parameter names as a list. If the script was invoked
+as an <ISINDEX> script and contains a string without ampersands
+(e.g. "value1+value2+value3") , there will be a single parameter named
+"keywords" containing the "+"-delimited keywords.
+
+NOTE: As of version 1.5, the array of parameter names returned will
+be in the same order as they were submitted by the browser.
+Usually this order is the same as the order in which the
+parameters are defined in the form (however, this isn't part
+of the spec, and so isn't guaranteed).
+
+=head2 FETCHING THE VALUE OR VALUES OF A SINGLE NAMED PARAMETER:
+
+ @values = $query->param('foo');
+
+ -or-
+
+ $value = $query->param('foo');
+
+Pass the param() method a single argument to fetch the value of the
+named parameter. If the parameter is multivalued (e.g. from multiple
+selections in a scrolling list), you can ask to receive an array. Otherwise
+the method will return a single value.
+
+If a value is not given in the query string, as in the queries
+"name1=&name2=", it will be returned as an empty string.
+
+
+If the parameter does not exist at all, then param() will return undef
+in a scalar context, and the empty list in a list context.
+
+
+=head2 SETTING THE VALUE(S) OF A NAMED PARAMETER:
+
+ $query->param('foo','an','array','of','values');
+
+This sets the value for the named parameter 'foo' to an array of
+values. This is one way to change the value of a field AFTER
+the script has been invoked once before. (Another way is with
+the -override parameter accepted by all methods that generate
+form elements.)
+
+param() also recognizes a named parameter style of calling described
+in more detail later:
+
+ $query->param(-name=>'foo',-values=>['an','array','of','values']);
+
+ -or-
+
+ $query->param(-name=>'foo',-value=>'the value');
+
+=head2 APPENDING ADDITIONAL VALUES TO A NAMED PARAMETER:
+
+ $query->append(-name=>'foo',-values=>['yet','more','values']);
+
+This adds a value or list of values to the named parameter. The
+values are appended to the end of the parameter if it already exists.
+Otherwise the parameter is created. Note that this method only
+recognizes the named argument calling syntax.
+
+=head2 IMPORTING ALL PARAMETERS INTO A NAMESPACE:
+
+ $query->import_names('R');
+
+This creates a series of variables in the 'R' namespace. For example,
+$R::foo, @R:foo. For keyword lists, a variable @R::keywords will appear.
+If no namespace is given, this method will assume 'Q'.
+WARNING: don't import anything into 'main'; this is a major security
+risk!!!!
+
+NOTE 1: Variable names are transformed as necessary into legal Perl
+variable names. All non-legal characters are transformed into
+underscores. If you need to keep the original names, you should use
+the param() method instead to access CGI variables by name.
+
+NOTE 2: In older versions, this method was called B<import()>. As of version 2.20,
+this name has been removed completely to avoid conflict with the built-in
+Perl module B<import> operator.
+
+=head2 DELETING A PARAMETER COMPLETELY:
+
+ $query->delete('foo','bar','baz');
+
+This completely clears a list of parameters. It sometimes useful for
+resetting parameters that you don't want passed down between script
+invocations.
+
+If you are using the function call interface, use "Delete()" instead
+to avoid conflicts with Perl's built-in delete operator.
+
+=head2 DELETING ALL PARAMETERS:
+
+ $query->delete_all();
+
+This clears the CGI object completely. It might be useful to ensure
+that all the defaults are taken when you create a fill-out form.
+
+Use Delete_all() instead if you are using the function call interface.
+
+=head2 HANDLING NON-URLENCODED ARGUMENTS
+
+
+If POSTed data is not of type application/x-www-form-urlencoded or
+multipart/form-data, then the POSTed data will not be processed, but
+instead be returned as-is in a parameter named POSTDATA. To retrieve
+it, use code like this:
+
+ my $data = $query->param('POSTDATA');
+
+Likewise if PUTed data can be retrieved with code like this:
+
+ my $data = $query->param('PUTDATA');
+
+(If you don't know what the preceding means, don't worry about it. It
+only affects people trying to use CGI for XML processing and other
+specialized tasks.)
+
+
+=head2 DIRECT ACCESS TO THE PARAMETER LIST:
+
+ $q->param_fetch('address')->[1] = '1313 Mockingbird Lane';
+ unshift @{$q->param_fetch(-name=>'address')},'George Munster';
+
+If you need access to the parameter list in a way that isn't covered
+by the methods above, you can obtain a direct reference to it by
+calling the B<param_fetch()> method with the name of the . This
+will return an array reference to the named parameters, which you then
+can manipulate in any way you like.
+
+You can also use a named argument style using the B<-name> argument.
+
+=head2 FETCHING THE PARAMETER LIST AS A HASH:
+
+ $params = $q->Vars;
+ print $params->{'address'};
+ @foo = split("\0",$params->{'foo'});
+ %params = $q->Vars;
+
+ use CGI ':cgi-lib';
+ $params = Vars;
+
+Many people want to fetch the entire parameter list as a hash in which
+the keys are the names of the CGI parameters, and the values are the
+parameters' values. The Vars() method does this. Called in a scalar
+context, it returns the parameter list as a tied hash reference.
+Changing a key changes the value of the parameter in the underlying
+CGI parameter list. Called in a list context, it returns the
+parameter list as an ordinary hash. This allows you to read the
+contents of the parameter list, but not to change it.
+
+When using this, the thing you must watch out for are multivalued CGI
+parameters. Because a hash cannot distinguish between scalar and
+list context, multivalued parameters will be returned as a packed
+string, separated by the "\0" (null) character. You must split this
+packed string in order to get at the individual values. This is the
+convention introduced long ago by Steve Brenner in his cgi-lib.pl
+module for Perl version 4.
+
+If you wish to use Vars() as a function, import the I<:cgi-lib> set of
+function calls (also see the section on CGI-LIB compatibility).
+
+=head2 SAVING THE STATE OF THE SCRIPT TO A FILE:
+
+ $query->save(\*FILEHANDLE)
+
+This will write the current state of the form to the provided
+filehandle. You can read it back in by providing a filehandle
+to the new() method. Note that the filehandle can be a file, a pipe,
+or whatever!
+
+The format of the saved file is:
+
+ NAME1=VALUE1
+ NAME1=VALUE1'
+ NAME2=VALUE2
+ NAME3=VALUE3
+ =
+
+Both name and value are URL escaped. Multi-valued CGI parameters are
+represented as repeated names. A session record is delimited by a
+single = symbol. You can write out multiple records and read them
+back in with several calls to B<new>. You can do this across several
+sessions by opening the file in append mode, allowing you to create
+primitive guest books, or to keep a history of users' queries. Here's
+a short example of creating multiple session records:
+
+ use CGI;
+
+ open (OUT,">>test.out") || die;
+ $records = 5;
+ for (0..$records) {
+ my $q = CGI->new;
+ $q->param(-name=>'counter',-value=>$_);
+ $q->save(\*OUT);
+ }
+ close OUT;
+
+ # reopen for reading
+ open (IN,"test.out") || die;
+ while (!eof(IN)) {
+ my $q = CGI->new(\*IN);
+ print $q->param('counter'),"\n";
+ }
+
+The file format used for save/restore is identical to that used by the
+Whitehead Genome Center's data exchange format "Boulderio", and can be
+manipulated and even databased using Boulderio utilities. See
+
+ http://stein.cshl.org/boulder/
+
+for further details.
+
+If you wish to use this method from the function-oriented (non-OO)
+interface, the exported name for this method is B<save_parameters()>.
+
+=head2 RETRIEVING CGI ERRORS
+
+Errors can occur while processing user input, particularly when
+processing uploaded files. When these errors occur, CGI will stop
+processing and return an empty parameter list. You can test for
+the existence and nature of errors using the I<cgi_error()> function.
+The error messages are formatted as HTTP status codes. You can either
+incorporate the error text into an HTML page, or use it as the value
+of the HTTP status:
+
+ my $error = $q->cgi_error;
+ if ($error) {
+ print $q->header(-status=>$error),
+ $q->start_html('Problems'),
+ $q->h2('Request not processed'),
+ $q->strong($error);
+ exit 0;
+ }
+
+When using the function-oriented interface (see the next section),
+errors may only occur the first time you call I<param()>. Be ready
+for this!
+
+=head2 USING THE FUNCTION-ORIENTED INTERFACE
+
+To use the function-oriented interface, you must specify which CGI.pm
+routines or sets of routines to import into your script's namespace.
+There is a small overhead associated with this importation, but it
+isn't much.
+
+ use CGI <list of methods>;
+
+The listed methods will be imported into the current package; you can
+call them directly without creating a CGI object first. This example
+shows how to import the B<param()> and B<header()>
+methods, and then use them directly:
+
+ use CGI 'param','header';
+ print header('text/plain');
+ $zipcode = param('zipcode');
+
+More frequently, you'll import common sets of functions by referring
+to the groups by name. All function sets are preceded with a ":"
+character as in ":html3" (for tags defined in the HTML 3 standard).
+
+Here is a list of the function sets you can import:
+
+=over 4
+
+=item B<:cgi>
+
+Import all CGI-handling methods, such as B<param()>, B<path_info()>
+and the like.
+
+=item B<:form>
+
+Import all fill-out form generating methods, such as B<textfield()>.
+
+=item B<:html2>
+
+Import all methods that generate HTML 2.0 standard elements.
+
+=item B<:html3>
+
+Import all methods that generate HTML 3.0 elements (such as
+<table>, <super> and <sub>).
+
+=item B<:html4>
+
+Import all methods that generate HTML 4 elements (such as
+<abbrev>, <acronym> and <thead>).
+
+=item B<:netscape>
+
+Import the <blink>, <fontsize> and <center> tags.
+
+=item B<:html>
+
+Import all HTML-generating shortcuts (i.e. 'html2', 'html3', 'html4' and 'netscape')
+
+=item B<:standard>
+
+Import "standard" features, 'html2', 'html3', 'html4', 'form' and 'cgi'.
+
+=item B<:all>
+
+Import all the available methods. For the full list, see the CGI.pm
+code, where the variable %EXPORT_TAGS is defined.
+
+=back
+
+If you import a function name that is not part of CGI.pm, the module
+will treat it as a new HTML tag and generate the appropriate
+subroutine. You can then use it like any other HTML tag. This is to
+provide for the rapidly-evolving HTML "standard." For example, say
+Microsoft comes out with a new tag called <gradient> (which causes the
+user's desktop to be flooded with a rotating gradient fill until his
+machine reboots). You don't need to wait for a new version of CGI.pm
+to start using it immediately:
+
+ use CGI qw/:standard :html3 gradient/;
+ print gradient({-start=>'red',-end=>'blue'});
+
+Note that in the interests of execution speed CGI.pm does B<not> use
+the standard L<Exporter> syntax for specifying load symbols. This may
+change in the future.
+
+If you import any of the state-maintaining CGI or form-generating
+methods, a default CGI object will be created and initialized
+automatically the first time you use any of the methods that require
+one to be present. This includes B<param()>, B<textfield()>,
+B<submit()> and the like. (If you need direct access to the CGI
+object, you can find it in the global variable B<$CGI::Q>). By
+importing CGI.pm methods, you can create visually elegant scripts:
+
+ use CGI qw/:standard/;
+ print
+ header,
+ start_html('Simple Script'),
+ h1('Simple Script'),
+ start_form,
+ "What's your name? ",textfield('name'),p,
+ "What's the combination?",
+ checkbox_group(-name=>'words',
+ -values=>['eenie','meenie','minie','moe'],
+ -defaults=>['eenie','moe']),p,
+ "What's your favorite color?",
+ popup_menu(-name=>'color',
+ -values=>['red','green','blue','chartreuse']),p,
+ submit,
+ end_form,
+ hr,"\n";
+
+ if (param) {
+ print
+ "Your name is ",em(param('name')),p,
+ "The keywords are: ",em(join(", ",param('words'))),p,
+ "Your favorite color is ",em(param('color')),".\n";
+ }
+ print end_html;
+
+=head2 PRAGMAS
+
+In addition to the function sets, there are a number of pragmas that
+you can import. Pragmas, which are always preceded by a hyphen,
+change the way that CGI.pm functions in various ways. Pragmas,
+function sets, and individual functions can all be imported in the
+same use() line. For example, the following use statement imports the
+standard set of functions and enables debugging mode (pragma
+-debug):
+
+ use CGI qw/:standard -debug/;
+
+The current list of pragmas is as follows:
+
+=over 4
+
+=item -any
+
+When you I<use CGI -any>, then any method that the query object
+doesn't recognize will be interpreted as a new HTML tag. This allows
+you to support the next I<ad hoc> HTML
+extension. This lets you go wild with new and unsupported tags:
+
+ use CGI qw(-any);
+ $q=CGI->new;
+ print $q->gradient({speed=>'fast',start=>'red',end=>'blue'});
+
+Since using <cite>any</cite> causes any mistyped method name
+to be interpreted as an HTML tag, use it with care or not at
+all.
+
+=item -compile
+
+This causes the indicated autoloaded methods to be compiled up front,
+rather than deferred to later. This is useful for scripts that run
+for an extended period of time under FastCGI or mod_perl, and for
+those destined to be crunched by Malcolm Beattie's Perl compiler. Use
+it in conjunction with the methods or method families you plan to use.
+
+ use CGI qw(-compile :standard :html3);
+
+or even
+
+ use CGI qw(-compile :all);
+
+Note that using the -compile pragma in this way will always have
+the effect of importing the compiled functions into the current
+namespace. If you want to compile without importing use the
+compile() method instead:
+
+ use CGI();
+ CGI->compile();
+
+This is particularly useful in a mod_perl environment, in which you
+might want to precompile all CGI routines in a startup script, and
+then import the functions individually in each mod_perl script.
+
+=item -nosticky
+
+By default the CGI module implements a state-preserving behavior
+called "sticky" fields. The way this works is that if you are
+regenerating a form, the methods that generate the form field values
+will interrogate param() to see if similarly-named parameters are
+present in the query string. If they find a like-named parameter, they
+will use it to set their default values.
+
+Sometimes this isn't what you want. The B<-nosticky> pragma prevents
+this behavior. You can also selectively change the sticky behavior in
+each element that you generate.
+
+=item -tabindex
+
+Automatically add tab index attributes to each form field. With this
+option turned off, you can still add tab indexes manually by passing a
+-tabindex option to each field-generating method.
+
+=item -no_undef_params
+
+This keeps CGI.pm from including undef params in the parameter list.
+
+=item -no_xhtml
+
+By default, CGI.pm versions 2.69 and higher emit XHTML
+(http://www.w3.org/TR/xhtml1/). The -no_xhtml pragma disables this
+feature. Thanks to Michalis Kabrianis <kabrianis@hellug.gr> for this
+feature.
+
+If start_html()'s -dtd parameter specifies an HTML 2.0,
+3.2, 4.0 or 4.01 DTD,
+XHTML will automatically be disabled without needing to use this
+pragma.
+
+=item -utf8
+
+This makes CGI.pm treat all parameters as UTF-8 strings. Use this with
+care, as it will interfere with the processing of binary uploads. It
+is better to manually select which fields are expected to return utf-8
+strings and convert them using code like this:
+
+ use Encode;
+ my $arg = decode utf8=>param('foo');
+
+=item -nph
+
+This makes CGI.pm produce a header appropriate for an NPH (no
+parsed header) script. You may need to do other things as well
+to tell the server that the script is NPH. See the discussion
+of NPH scripts below.
+
+=item -newstyle_urls
+
+Separate the name=value pairs in CGI parameter query strings with
+semicolons rather than ampersands. For example:
+
+ ?name=fred;age=24;favorite_color=3
+
+Semicolon-delimited query strings are always accepted, and will be emitted by
+self_url() and query_string(). newstyle_urls became the default in version
+2.64.
+
+=item -oldstyle_urls
+
+Separate the name=value pairs in CGI parameter query strings with
+ampersands rather than semicolons. This is no longer the default.
+
+=item -autoload
+
+This overrides the autoloader so that any function in your program
+that is not recognized is referred to CGI.pm for possible evaluation.
+This allows you to use all the CGI.pm functions without adding them to
+your symbol table, which is of concern for mod_perl users who are
+worried about memory consumption. I<Warning:> when
+I<-autoload> is in effect, you cannot use "poetry mode"
+(functions without the parenthesis). Use I<hr()> rather
+than I<hr>, or add something like I<use subs qw/hr p header/>
+to the top of your script.
+
+=item -no_debug
+
+This turns off the command-line processing features. If you want to
+run a CGI.pm script from the command line to produce HTML, and you
+don't want it to read CGI parameters from the command line or STDIN,
+then use this pragma:
+
+ use CGI qw(-no_debug :standard);
+
+=item -debug
+
+This turns on full debugging. In addition to reading CGI arguments
+from the command-line processing, CGI.pm will pause and try to read
+arguments from STDIN, producing the message "(offline mode: enter
+name=value pairs on standard input)" features.
+
+See the section on debugging for more details.
+
+=item -private_tempfiles
+
+CGI.pm can process uploaded file. Ordinarily it spools the uploaded
+file to a temporary directory, then deletes the file when done.
+However, this opens the risk of eavesdropping as described in the file
+upload section. Another CGI script author could peek at this data
+during the upload, even if it is confidential information. On Unix
+systems, the -private_tempfiles pragma will cause the temporary file
+to be unlinked as soon as it is opened and before any data is written
+into it, reducing, but not eliminating the risk of eavesdropping
+(there is still a potential race condition). To make life harder for
+the attacker, the program chooses tempfile names by calculating a 32
+bit checksum of the incoming HTTP headers.
+
+To ensure that the temporary file cannot be read by other CGI scripts,
+use suEXEC or a CGI wrapper program to run your script. The temporary
+file is created with mode 0600 (neither world nor group readable).
+
+The temporary directory is selected using the following algorithm:
+
+ 1. if the current user (e.g. "nobody") has a directory named
+ "tmp" in its home directory, use that (Unix systems only).
+
+ 2. if the environment variable TMPDIR exists, use the location
+ indicated.
+
+ 3. Otherwise try the locations /usr/tmp, /var/tmp, C:\temp,
+ /tmp, /temp, ::Temporary Items, and \WWW_ROOT.
+
+Each of these locations is checked that it is a directory and is
+writable. If not, the algorithm tries the next choice.
+
+=back
+
+=head2 SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS
+
+Many of the methods generate HTML tags. As described below, tag
+functions automatically generate both the opening and closing tags.
+For example:
+
+ print h1('Level 1 Header');
+
+produces
+
+ <h1>Level 1 Header</h1>
+
+There will be some times when you want to produce the start and end
+tags yourself. In this case, you can use the form start_I<tag_name>
+and end_I<tag_name>, as in:
+
+ print start_h1,'Level 1 Header',end_h1;
+
+With a few exceptions (described below), start_I<tag_name> and
+end_I<tag_name> functions are not generated automatically when you
+I<use CGI>. However, you can specify the tags you want to generate
+I<start/end> functions for by putting an asterisk in front of their
+name, or, alternatively, requesting either "start_I<tag_name>" or
+"end_I<tag_name>" in the import list.
+
+Example:
+
+ use CGI qw/:standard *table start_ul/;
+
+In this example, the following functions are generated in addition to
+the standard ones:
+
+=over 4
+
+=item 1. start_table() (generates a <table> tag)
+
+=item 2. end_table() (generates a </table> tag)
+
+=item 3. start_ul() (generates a <ul> tag)
+
+=item 4. end_ul() (generates a </ul> tag)
+
+=back
+
+=head1 GENERATING DYNAMIC DOCUMENTS
+
+Most of CGI.pm's functions deal with creating documents on the fly.
+Generally you will produce the HTTP header first, followed by the
+document itself. CGI.pm provides functions for generating HTTP
+headers of various types as well as for generating HTML. For creating
+GIF images, see the GD.pm module.
+
+Each of these functions produces a fragment of HTML or HTTP which you
+can print out directly so that it displays in the browser window,
+append to a string, or save to a file for later use.
+
+=head2 CREATING A STANDARD HTTP HEADER:
+
+Normally the first thing you will do in any CGI script is print out an
+HTTP header. This tells the browser what type of document to expect,
+and gives other optional information, such as the language, expiration
+date, and whether to cache the document. The header can also be
+manipulated for special purposes, such as server push and pay per view
+pages.
+
+ print header;
+
+ -or-
+
+ print header('image/gif');
+
+ -or-
+
+ print header('text/html','204 No response');
+
+ -or-
+
+ print header(-type=>'image/gif',
+ -nph=>1,
+ -status=>'402 Payment required',
+ -expires=>'+3d',
+ -cookie=>$cookie,
+ -charset=>'utf-7',
+ -attachment=>'foo.gif',
+ -Cost=>'$2.00');
+
+header() returns the Content-type: header. You can provide your own
+MIME type if you choose, otherwise it defaults to text/html. An
+optional second parameter specifies the status code and a human-readable
+message. For example, you can specify 204, "No response" to create a
+script that tells the browser to do nothing at all.
+
+The last example shows the named argument style for passing arguments
+to the CGI methods using named parameters. Recognized parameters are
+B<-type>, B<-status>, B<-expires>, and B<-cookie>. Any other named
+parameters will be stripped of their initial hyphens and turned into
+header fields, allowing you to specify any HTTP header you desire.
+Internal underscores will be turned into hyphens:
+
+ print header(-Content_length=>3002);
+
+Most browsers will not cache the output from CGI scripts. Every time
+the browser reloads the page, the script is invoked anew. You can
+change this behavior with the B<-expires> parameter. When you specify
+an absolute or relative expiration interval with this parameter, some
+browsers and proxy servers will cache the script's output until the
+indicated expiration date. The following forms are all valid for the
+-expires field:
+
+ +30s 30 seconds from now
+ +10m ten minutes from now
+ +1h one hour from now
+ -1d yesterday (i.e. "ASAP!")
+ now immediately
+ +3M in three months
+ +10y in ten years time
+ Thursday, 25-Apr-1999 00:40:33 GMT at the indicated time & date
+
+The B<-cookie> parameter generates a header that tells the browser to provide
+a "magic cookie" during all subsequent transactions with your script.
+Some cookies have a special format that includes interesting attributes
+such as expiration time. Use the cookie() method to create and retrieve
+session cookies.
+
+The B<-nph> parameter, if set to a true value, will issue the correct
+headers to work with a NPH (no-parse-header) script. This is important
+to use with certain servers that expect all their scripts to be NPH.
+
+The B<-charset> parameter can be used to control the character set
+sent to the browser. If not provided, defaults to ISO-8859-1. As a
+side effect, this sets the charset() method as well.
+
+The B<-attachment> parameter can be used to turn the page into an
+attachment. Instead of displaying the page, some browsers will prompt
+the user to save it to disk. The value of the argument is the
+suggested name for the saved file. In order for this to work, you may
+have to set the B<-type> to "application/octet-stream".
+
+The B<-p3p> parameter will add a P3P tag to the outgoing header. The
+parameter can be an arrayref or a space-delimited string of P3P tags.
+For example:
+
+ print header(-p3p=>[qw(CAO DSP LAW CURa)]);
+ print header(-p3p=>'CAO DSP LAW CURa');
+
+In either case, the outgoing header will be formatted as:
+
+ P3P: policyref="/w3c/p3p.xml" cp="CAO DSP LAW CURa"
+
+=head2 GENERATING A REDIRECTION HEADER
+
+ print $q->redirect('http://somewhere.else/in/movie/land');
+
+Sometimes you don't want to produce a document yourself, but simply
+redirect the browser elsewhere, perhaps choosing a URL based on the
+time of day or the identity of the user.
+
+The redirect() method redirects the browser to a different URL. If
+you use redirection like this, you should B<not> print out a header as
+well.
+
+You should always use full URLs (including the http: or ftp: part) in
+redirection requests. Relative URLs will not work correctly.
+
+You can also use named arguments:
+
+ print $q->redirect(
+ -uri=>'http://somewhere.else/in/movie/land',
+ -nph=>1,
+ -status=>301);
+
+All names arguments recognized by header() are also recognized by
+redirect(). However, most HTTP headers, including those generated by
+-cookie and -target, are ignored by the browser.
+
+The B<-nph> parameter, if set to a true value, will issue the correct
+headers to work with a NPH (no-parse-header) script. This is important
+to use with certain servers, such as Microsoft IIS, which
+expect all their scripts to be NPH.
+
+The B<-status> parameter will set the status of the redirect. HTTP
+defines three different possible redirection status codes:
+
+ 301 Moved Permanently
+ 302 Found
+ 303 See Other
+
+The default if not specified is 302, which means "moved temporarily."
+You may change the status to another status code if you wish. Be
+advised that changing the status to anything other than 301, 302 or
+303 will probably break redirection.
+
+=head2 CREATING THE HTML DOCUMENT HEADER
+
+ print start_html(-title=>'Secrets of the Pyramids',
+ -author=>'fred@capricorn.org',
+ -base=>'true',
+ -target=>'_blank',
+ -meta=>{'keywords'=>'pharaoh secret mummy',
+ 'copyright'=>'copyright 1996 King Tut'},
+ -style=>{'src'=>'/styles/style1.css'},
+ -BGCOLOR=>'blue');
+
+After creating the HTTP header, most CGI scripts will start writing
+out an HTML document. The start_html() routine creates the top of the
+page, along with a lot of optional information that controls the
+page's appearance and behavior.
+
+This method returns a canned HTML header and the opening <body> tag.
+All parameters are optional. In the named parameter form, recognized
+parameters are -title, -author, -base, -xbase, -dtd, -lang and -target
+(see below for the explanation). Any additional parameters you
+provide, such as the unofficial BGCOLOR attribute, are added
+to the <body> tag. Additional parameters must be proceeded by a
+hyphen.
+
+The argument B<-xbase> allows you to provide an HREF for the <base> tag
+different from the current location, as in
+
+ -xbase=>"http://home.mcom.com/"
+
+All relative links will be interpreted relative to this tag.
+
+The argument B<-target> allows you to provide a default target frame
+for all the links and fill-out forms on the page. B<This is a
+non-standard HTTP feature which only works with some browsers!>
+
+ -target=>"answer_window"
+
+All relative links will be interpreted relative to this tag.
+You add arbitrary meta information to the header with the B<-meta>
+argument. This argument expects a reference to a hash
+containing name/value pairs of meta information. These will be turned
+into a series of header <meta> tags that look something like this:
+
+ <meta name="keywords" content="pharaoh secret mummy">
+ <meta name="description" content="copyright 1996 King Tut">
+
+To create an HTTP-EQUIV type of <meta> tag, use B<-head>, described
+below.
+
+The B<-style> argument is used to incorporate cascading stylesheets
+into your code. See the section on CASCADING STYLESHEETS for more
+information.
+
+The B<-lang> argument is used to incorporate a language attribute into
+the <html> tag. For example:
+
+ print $q->start_html(-lang=>'fr-CA');
+
+The default if not specified is "en-US" for US English, unless the
+-dtd parameter specifies an HTML 2.0 or 3.2 DTD, in which case the
+lang attribute is left off. You can force the lang attribute to left
+off in other cases by passing an empty string (-lang=>'').
+
+The B<-encoding> argument can be used to specify the character set for
+XHTML. It defaults to iso-8859-1 if not specified.
+
+The B<-declare_xml> argument, when used in conjunction with XHTML,
+will put a <?xml> declaration at the top of the HTML header. The sole
+purpose of this declaration is to declare the character set
+encoding. In the absence of -declare_xml, the output HTML will contain
+a <meta> tag that specifies the encoding, allowing the HTML to pass
+most validators. The default for -declare_xml is false.
+
+You can place other arbitrary HTML elements to the <head> section with the
+B<-head> tag. For example, to place the rarely-used <link> element in the
+head section, use this:
+
+ print start_html(-head=>Link({-rel=>'next',
+ -href=>'http://www.capricorn.com/s2.html'}));
+
+To incorporate multiple HTML elements into the <head> section, just pass an
+array reference:
+
+ print start_html(-head=>[
+ Link({-rel=>'next',
+ -href=>'http://www.capricorn.com/s2.html'}),
+ Link({-rel=>'previous',
+ -href=>'http://www.capricorn.com/s1.html'})
+ ]
+ );
+
+And here's how to create an HTTP-EQUIV <meta> tag:
+
+ print start_html(-head=>meta({-http_equiv => 'Content-Type',
+ -content => 'text/html'}))
+
+
+JAVASCRIPTING: The B<-script>, B<-noScript>, B<-onLoad>,
+B<-onMouseOver>, B<-onMouseOut> and B<-onUnload> parameters are used
+to add JavaScript calls to your pages. B<-script> should
+point to a block of text containing JavaScript function definitions.
+This block will be placed within a <script> block inside the HTML (not
+HTTP) header. The block is placed in the header in order to give your
+page a fighting chance of having all its JavaScript functions in place
+even if the user presses the stop button before the page has loaded
+completely. CGI.pm attempts to format the script in such a way that
+JavaScript-naive browsers will not choke on the code: unfortunately
+there are some browsers, such as Chimera for Unix, that get confused
+by it nevertheless.
+
+The B<-onLoad> and B<-onUnload> parameters point to fragments of JavaScript
+code to execute when the page is respectively opened and closed by the
+browser. Usually these parameters are calls to functions defined in the
+B<-script> field:
+
+ $query = CGI->new;
+ print header;
+ $JSCRIPT=<<END;
+ // Ask a silly question
+ function riddle_me_this() {
+ var r = prompt("What walks on four legs in the morning, " +
+ "two legs in the afternoon, " +
+ "and three legs in the evening?");
+ response(r);
+ }
+ // Get a silly answer
+ function response(answer) {
+ if (answer == "man")
+ alert("Right you are!");
+ else
+ alert("Wrong! Guess again.");
+ }
+ END
+ print start_html(-title=>'The Riddle of the Sphinx',
+ -script=>$JSCRIPT);
+
+Use the B<-noScript> parameter to pass some HTML text that will be displayed on
+browsers that do not have JavaScript (or browsers where JavaScript is turned
+off).
+
+The <script> tag, has several attributes including "type" and src.
+The latter is particularly interesting, as it allows you to keep the
+JavaScript code in a file or CGI script rather than cluttering up each
+page with the source. To use these attributes pass a HASH reference
+in the B<-script> parameter containing one or more of -type, -src, or
+-code:
+
+ print $q->start_html(-title=>'The Riddle of the Sphinx',
+ -script=>{-type=>'JAVASCRIPT',
+ -src=>'/javascript/sphinx.js'}
+ );
+
+ print $q->(-title=>'The Riddle of the Sphinx',
+ -script=>{-type=>'PERLSCRIPT',
+ -code=>'print "hello world!\n;"'}
+ );
+
+
+A final feature allows you to incorporate multiple <script> sections into the
+header. Just pass the list of script sections as an array reference.
+this allows you to specify different source files for different dialects
+of JavaScript. Example:
+
+ print $q->start_html(-title=>'The Riddle of the Sphinx',
+ -script=>[
+ { -type => 'text/javascript',
+ -src => '/javascript/utilities10.js'
+ },
+ { -type => 'text/javascript',
+ -src => '/javascript/utilities11.js'
+ },
+ { -type => 'text/jscript',
+ -src => '/javascript/utilities12.js'
+ },
+ { -type => 'text/ecmascript',
+ -src => '/javascript/utilities219.js'
+ }
+ ]
+ );
+
+The option "-language" is a synonym for -type, and is supported for
+backwad compatibility.
+
+The old-style positional parameters are as follows:
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The title
+
+=item 2.
+
+The author's e-mail address (will create a <link rev="MADE"> tag if present
+
+=item 3.
+
+A 'true' flag if you want to include a <base> tag in the header. This
+helps resolve relative addresses to absolute ones when the document is moved,
+but makes the document hierarchy non-portable. Use with care!
+
+=item 4, 5, 6...
+
+Any other parameters you want to include in the <body> tag. This is a good
+place to put HTML extensions, such as colors and wallpaper patterns.
+
+=back
+
+=head2 ENDING THE HTML DOCUMENT:
+
+ print end_html
+
+This ends an HTML document by printing the </body></html> tags.
+
+=head2 CREATING A SELF-REFERENCING URL THAT PRESERVES STATE INFORMATION:
+
+ $myself = self_url;
+ print q(<a href="$myself">I'm talking to myself.</a>);
+
+self_url() will return a URL, that, when selected, will reinvoke
+this script with all its state information intact. This is most
+useful when you want to jump around within the document using
+internal anchors but you don't want to disrupt the current contents
+of the form(s). Something like this will do the trick.
+
+ $myself = self_url;
+ print "<a href=\"$myself#table1\">See table 1</a>";
+ print "<a href=\"$myself#table2\">See table 2</a>";
+ print "<a href=\"$myself#yourself\">See for yourself</a>";
+
+If you want more control over what's returned, using the B<url()>
+method instead.
+
+You can also retrieve the unprocessed query string with query_string():
+
+ $the_string = query_string;
+
+=head2 OBTAINING THE SCRIPT'S URL
+
+ $full_url = url();
+ $full_url = url(-full=>1); #alternative syntax
+ $relative_url = url(-relative=>1);
+ $absolute_url = url(-absolute=>1);
+ $url_with_path = url(-path_info=>1);
+ $url_with_path_and_query = url(-path_info=>1,-query=>1);
+ $netloc = url(-base => 1);
+
+B<url()> returns the script's URL in a variety of formats. Called
+without any arguments, it returns the full form of the URL, including
+host name and port number
+
+ http://your.host.com/path/to/script.cgi
+
+You can modify this format with the following named arguments:
+
+=over 4
+
+=item B<-absolute>
+
+If true, produce an absolute URL, e.g.
+
+ /path/to/script.cgi
+
+=item B<-relative>
+
+Produce a relative URL. This is useful if you want to reinvoke your
+script with different parameters. For example:
+
+ script.cgi
+
+=item B<-full>
+
+Produce the full URL, exactly as if called without any arguments.
+This overrides the -relative and -absolute arguments.
+
+=item B<-path> (B<-path_info>)
+
+Append the additional path information to the URL. This can be
+combined with B<-full>, B<-absolute> or B<-relative>. B<-path_info>
+is provided as a synonym.
+
+=item B<-query> (B<-query_string>)
+
+Append the query string to the URL. This can be combined with
+B<-full>, B<-absolute> or B<-relative>. B<-query_string> is provided
+as a synonym.
+
+=item B<-base>
+
+Generate just the protocol and net location, as in http://www.foo.com:8000
+
+=item B<-rewrite>
+
+If Apache's mod_rewrite is turned on, then the script name and path
+info probably won't match the request that the user sent. Set
+-rewrite=>1 (default) to return URLs that match what the user sent
+(the original request URI). Set -rewrite=>0 to return URLs that match
+the URL after mod_rewrite's rules have run. Because the additional
+path information only makes sense in the context of the rewritten URL,
+-rewrite is set to false when you request path info in the URL.
+
+=back
+
+=head2 MIXING POST AND URL PARAMETERS
+
+ $color = url_param('color');
+
+It is possible for a script to receive CGI parameters in the URL as
+well as in the fill-out form by creating a form that POSTs to a URL
+containing a query string (a "?" mark followed by arguments). The
+B<param()> method will always return the contents of the POSTed
+fill-out form, ignoring the URL's query string. To retrieve URL
+parameters, call the B<url_param()> method. Use it in the same way as
+B<param()>. The main difference is that it allows you to read the
+parameters, but not set them.
+
+
+Under no circumstances will the contents of the URL query string
+interfere with similarly-named CGI parameters in POSTed forms. If you
+try to mix a URL query string with a form submitted with the GET
+method, the results will not be what you expect.
+
+=head1 CREATING STANDARD HTML ELEMENTS:
+
+CGI.pm defines general HTML shortcut methods for most, if not all of
+the HTML 3 and HTML 4 tags. HTML shortcuts are named after a single
+HTML element and return a fragment of HTML text that you can then
+print or manipulate as you like. Each shortcut returns a fragment of
+HTML code that you can append to a string, save to a file, or, most
+commonly, print out so that it displays in the browser window.
+
+This example shows how to use the HTML methods:
+
+ print $q->blockquote(
+ "Many years ago on the island of",
+ $q->a({href=>"http://crete.org/"},"Crete"),
+ "there lived a Minotaur named",
+ $q->strong("Fred."),
+ ),
+ $q->hr;
+
+This results in the following HTML code (extra newlines have been
+added for readability):
+
+ <blockquote>
+ Many years ago on the island of
+ <a href="http://crete.org/">Crete</a> there lived
+ a minotaur named <strong>Fred.</strong>
+ </blockquote>
+ <hr>
+
+If you find the syntax for calling the HTML shortcuts awkward, you can
+import them into your namespace and dispense with the object syntax
+completely (see the next section for more details):
+
+ use CGI ':standard';
+ print blockquote(
+ "Many years ago on the island of",
+ a({href=>"http://crete.org/"},"Crete"),
+ "there lived a minotaur named",
+ strong("Fred."),
+ ),
+ hr;
+
+=head2 PROVIDING ARGUMENTS TO HTML SHORTCUTS
+
+The HTML methods will accept zero, one or multiple arguments. If you
+provide no arguments, you get a single tag:
+
+ print hr; # <hr>
+
+If you provide one or more string arguments, they are concatenated
+together with spaces and placed between opening and closing tags:
+
+ print h1("Chapter","1"); # <h1>Chapter 1</h1>"
+
+If the first argument is a hash reference, then the keys
+and values of the hash become the HTML tag's attributes:
+
+ print a({-href=>'fred.html',-target=>'_new'},
+ "Open a new frame");
+
+ <a href="fred.html",target="_new">Open a new frame</a>
+
+You may dispense with the dashes in front of the attribute names if
+you prefer:
+
+ print img {src=>'fred.gif',align=>'LEFT'};
+
+ <img align="LEFT" src="fred.gif">
+
+Sometimes an HTML tag attribute has no argument. For example, ordered
+lists can be marked as COMPACT. The syntax for this is an argument that
+that points to an undef string:
+
+ print ol({compact=>undef},li('one'),li('two'),li('three'));
+
+Prior to CGI.pm version 2.41, providing an empty ('') string as an
+attribute argument was the same as providing undef. However, this has
+changed in order to accommodate those who want to create tags of the form
+<img alt="">. The difference is shown in these two pieces of code:
+
+ CODE RESULT
+ img({alt=>undef}) <img alt>
+ img({alt=>''}) <img alt="">
+
+=head2 THE DISTRIBUTIVE PROPERTY OF HTML SHORTCUTS
+
+One of the cool features of the HTML shortcuts is that they are
+distributive. If you give them an argument consisting of a
+B<reference> to a list, the tag will be distributed across each
+element of the list. For example, here's one way to make an ordered
+list:
+
+ print ul(
+ li({-type=>'disc'},['Sneezy','Doc','Sleepy','Happy'])
+ );
+
+This example will result in HTML output that looks like this:
+
+ <ul>
+ <li type="disc">Sneezy</li>
+ <li type="disc">Doc</li>
+ <li type="disc">Sleepy</li>
+ <li type="disc">Happy</li>
+ </ul>
+
+This is extremely useful for creating tables. For example:
+
+ print table({-border=>undef},
+ caption('When Should You Eat Your Vegetables?'),
+ Tr({-align=>'CENTER',-valign=>'TOP'},
+ [
+ th(['Vegetable', 'Breakfast','Lunch','Dinner']),
+ td(['Tomatoes' , 'no', 'yes', 'yes']),
+ td(['Broccoli' , 'no', 'no', 'yes']),
+ td(['Onions' , 'yes','yes', 'yes'])
+ ]
+ )
+ );
+
+=head2 HTML SHORTCUTS AND LIST INTERPOLATION
+
+Consider this bit of code:
+
+ print blockquote(em('Hi'),'mom!'));
+
+It will ordinarily return the string that you probably expect, namely:
+
+ <blockquote><em>Hi</em> mom!</blockquote>
+
+Note the space between the element "Hi" and the element "mom!".
+CGI.pm puts the extra space there using array interpolation, which is
+controlled by the magic $" variable. Sometimes this extra space is
+not what you want, for example, when you are trying to align a series
+of images. In this case, you can simply change the value of $" to an
+empty string.
+
+ {
+ local($") = '';
+ print blockquote(em('Hi'),'mom!'));
+ }
+
+I suggest you put the code in a block as shown here. Otherwise the
+change to $" will affect all subsequent code until you explicitly
+reset it.
+
+=head2 NON-STANDARD HTML SHORTCUTS
+
+A few HTML tags don't follow the standard pattern for various
+reasons.
+
+B<comment()> generates an HTML comment (<!-- comment -->). Call it
+like
+
+ print comment('here is my comment');
+
+Because of conflicts with built-in Perl functions, the following functions
+begin with initial caps:
+
+ Select
+ Tr
+ Link
+ Delete
+ Accept
+ Sub
+
+In addition, start_html(), end_html(), start_form(), end_form(),
+start_multipart_form() and all the fill-out form tags are special.
+See their respective sections.
+
+=head2 AUTOESCAPING HTML
+
+By default, all HTML that is emitted by the form-generating functions
+is passed through a function called escapeHTML():
+
+=over 4
+
+=item $escaped_string = escapeHTML("unescaped string");
+
+Escape HTML formatting characters in a string.
+
+=back
+
+Provided that you have specified a character set of ISO-8859-1 (the
+default), the standard HTML escaping rules will be used. The "<"
+character becomes "&lt;", ">" becomes "&gt;", "&" becomes "&amp;", and
+the quote character becomes "&quot;". In addition, the hexadecimal
+0x8b and 0x9b characters, which some browsers incorrectly interpret
+as the left and right angle-bracket characters, are replaced by their
+numeric character entities ("&#8249" and "&#8250;"). If you manually change
+the charset, either by calling the charset() method explicitly or by
+passing a -charset argument to header(), then B<all> characters will
+be replaced by their numeric entities, since CGI.pm has no lookup
+table for all the possible encodings.
+
+C<escapeHTML()> expects the supplied string to be a character string. This means you
+should Encode::decode data received from "outside" and Encode::encode your
+strings before sending them back outside. If your source code UTF-8 encoded and
+you want to upgrade string literals in your source to character strings, you
+can use "use utf8". See L<perlunitut>, L<perlunifaq> and L<perlunicode> for more
+information on how Perl handles the difference between bytes and characters.
+
+The automatic escaping does not apply to other shortcuts, such as
+h1(). You should call escapeHTML() yourself on untrusted data in
+order to protect your pages against nasty tricks that people may enter
+into guestbooks, etc.. To change the character set, use charset().
+To turn autoescaping off completely, use autoEscape(0):
+
+=over 4
+
+=item $charset = charset([$charset]);
+
+Get or set the current character set.
+
+=item $flag = autoEscape([$flag]);
+
+Get or set the value of the autoescape flag.
+
+=back
+
+=head2 PRETTY-PRINTING HTML
+
+By default, all the HTML produced by these functions comes out as one
+long line without carriage returns or indentation. This is yuck, but
+it does reduce the size of the documents by 10-20%. To get
+pretty-printed output, please use L<CGI::Pretty>, a subclass
+contributed by Brian Paulsen.
+
+=head1 CREATING FILL-OUT FORMS:
+
+I<General note> The various form-creating methods all return strings
+to the caller, containing the tag or tags that will create the requested
+form element. You are responsible for actually printing out these strings.
+It's set up this way so that you can place formatting tags
+around the form elements.
+
+I<Another note> The default values that you specify for the forms are only
+used the B<first> time the script is invoked (when there is no query
+string). On subsequent invocations of the script (when there is a query
+string), the former values are used even if they are blank.
+
+If you want to change the value of a field from its previous value, you have two
+choices:
+
+(1) call the param() method to set it.
+
+(2) use the -override (alias -force) parameter (a new feature in version 2.15).
+This forces the default value to be used, regardless of the previous value:
+
+ print textfield(-name=>'field_name',
+ -default=>'starting value',
+ -override=>1,
+ -size=>50,
+ -maxlength=>80);
+
+I<Yet another note> By default, the text and labels of form elements are
+escaped according to HTML rules. This means that you can safely use
+"<CLICK ME>" as the label for a button. However, it also interferes with
+your ability to incorporate special HTML character sequences, such as &Aacute;,
+into your fields. If you wish to turn off automatic escaping, call the
+autoEscape() method with a false value immediately after creating the CGI object:
+
+ $query = CGI->new;
+ $query->autoEscape(0);
+
+Note that autoEscape() is exclusively used to effect the behavior of how some
+CGI.pm HTML generation fuctions handle escaping. Calling escapeHTML()
+explicitly will always escape the HTML.
+
+I<A Lurking Trap!> Some of the form-element generating methods return
+multiple tags. In a scalar context, the tags will be concatenated
+together with spaces, or whatever is the current value of the $"
+global. In a list context, the methods will return a list of
+elements, allowing you to modify them if you wish. Usually you will
+not notice this behavior, but beware of this:
+
+ printf("%s\n",end_form())
+
+end_form() produces several tags, and only the first of them will be
+printed because the format only expects one value.
+
+<p>
+
+
+=head2 CREATING AN ISINDEX TAG
+
+ print isindex(-action=>$action);
+
+ -or-
+
+ print isindex($action);
+
+Prints out an <isindex> tag. Not very exciting. The parameter
+-action specifies the URL of the script to process the query. The
+default is to process the query with the current script.
+
+=head2 STARTING AND ENDING A FORM
+
+ print start_form(-method=>$method,
+ -action=>$action,
+ -enctype=>$encoding);
+ <... various form stuff ...>
+ print end_form;
+
+ -or-
+
+ print start_form($method,$action,$encoding);
+ <... various form stuff ...>
+ print end_form;
+
+start_form() will return a <form> tag with the optional method,
+action and form encoding that you specify. The defaults are:
+
+ method: POST
+ action: this script
+ enctype: application/x-www-form-urlencoded for non-XHTML
+ multipart/form-data for XHTML, see mulitpart/form-data below.
+
+end_form() returns the closing </form> tag.
+
+Start_form()'s enctype argument tells the browser how to package the various
+fields of the form before sending the form to the server. Two
+values are possible:
+
+B<Note:> These methods were previously named startform() and endform().
+These methods are now DEPRECATED.
+Please use start_form() and end_form() instead.
+
+=over 4
+
+=item B<application/x-www-form-urlencoded>
+
+This is the older type of encoding. It is compatible with many CGI scripts and is
+suitable for short fields containing text data. For your
+convenience, CGI.pm stores the name of this encoding
+type in B<&CGI::URL_ENCODED>.
+
+=item B<multipart/form-data>
+
+This is the newer type of encoding.
+It is suitable for forms that contain very large fields or that
+are intended for transferring binary data. Most importantly,
+it enables the "file upload" feature. For
+your convenience, CGI.pm stores the name of this encoding type
+in B<&CGI::MULTIPART>
+
+Forms that use this type of encoding are not easily interpreted
+by CGI scripts unless they use CGI.pm or another library designed
+to handle them.
+
+If XHTML is activated (the default), then forms will be automatically
+created using this type of encoding.
+
+=back
+
+The start_form() method uses the older form of encoding by
+default unless XHTML is requested. If you want to use the
+newer form of encoding by default, you can call
+B<start_multipart_form()> instead of B<start_form()>. The
+method B<end_multipart_form()> is an alias to B<end_form()>.
+
+JAVASCRIPTING: The B<-name> and B<-onSubmit> parameters are provided
+for use with JavaScript. The -name parameter gives the
+form a name so that it can be identified and manipulated by
+JavaScript functions. -onSubmit should point to a JavaScript
+function that will be executed just before the form is submitted to your
+server. You can use this opportunity to check the contents of the form
+for consistency and completeness. If you find something wrong, you
+can put up an alert box or maybe fix things up yourself. You can
+abort the submission by returning false from this function.
+
+Usually the bulk of JavaScript functions are defined in a <script>
+block in the HTML header and -onSubmit points to one of these function
+call. See start_html() for details.
+
+=head2 FORM ELEMENTS
+
+After starting a form, you will typically create one or more
+textfields, popup menus, radio groups and other form elements. Each
+of these elements takes a standard set of named arguments. Some
+elements also have optional arguments. The standard arguments are as
+follows:
+
+=over 4
+
+=item B<-name>
+
+The name of the field. After submission this name can be used to
+retrieve the field's value using the param() method.
+
+=item B<-value>, B<-values>
+
+The initial value of the field which will be returned to the script
+after form submission. Some form elements, such as text fields, take
+a single scalar -value argument. Others, such as popup menus, take a
+reference to an array of values. The two arguments are synonyms.
+
+=item B<-tabindex>
+
+A numeric value that sets the order in which the form element receives
+focus when the user presses the tab key. Elements with lower values
+receive focus first.
+
+=item B<-id>
+
+A string identifier that can be used to identify this element to
+JavaScript and DHTML.
+
+=item B<-override>
+
+A boolean, which, if true, forces the element to take on the value
+specified by B<-value>, overriding the sticky behavior described
+earlier for the B<-nosticky> pragma.
+
+=item B<-onChange>, B<-onFocus>, B<-onBlur>, B<-onMouseOver>, B<-onMouseOut>, B<-onSelect>
+
+These are used to assign JavaScript event handlers. See the
+JavaScripting section for more details.
+
+=back
+
+Other common arguments are described in the next section. In addition
+to these, all attributes described in the HTML specifications are
+supported.
+
+=head2 CREATING A TEXT FIELD
+
+ print textfield(-name=>'field_name',
+ -value=>'starting value',
+ -size=>50,
+ -maxlength=>80);
+ -or-
+
+ print textfield('field_name','starting value',50,80);
+
+textfield() will return a text input field.
+
+=over 4
+
+=item B<Parameters>
+
+=item 1.
+
+The first parameter is the required name for the field (-name).
+
+=item 2.
+
+The optional second parameter is the default starting value for the field
+contents (-value, formerly known as -default).
+
+=item 3.
+
+The optional third parameter is the size of the field in
+ characters (-size).
+
+=item 4.
+
+The optional fourth parameter is the maximum number of characters the
+ field will accept (-maxlength).
+
+=back
+
+As with all these methods, the field will be initialized with its
+previous contents from earlier invocations of the script.
+When the form is processed, the value of the text field can be
+retrieved with:
+
+ $value = param('foo');
+
+If you want to reset it from its initial value after the script has been
+called once, you can do so like this:
+
+ param('foo',"I'm taking over this value!");
+
+=head2 CREATING A BIG TEXT FIELD
+
+ print textarea(-name=>'foo',
+ -default=>'starting value',
+ -rows=>10,
+ -columns=>50);
+
+ -or
+
+ print textarea('foo','starting value',10,50);
+
+textarea() is just like textfield, but it allows you to specify
+rows and columns for a multiline text entry box. You can provide
+a starting value for the field, which can be long and contain
+multiple lines.
+
+=head2 CREATING A PASSWORD FIELD
+
+ print password_field(-name=>'secret',
+ -value=>'starting value',
+ -size=>50,
+ -maxlength=>80);
+ -or-
+
+ print password_field('secret','starting value',50,80);
+
+password_field() is identical to textfield(), except that its contents
+will be starred out on the web page.
+
+=head2 CREATING A FILE UPLOAD FIELD
+
+ print filefield(-name=>'uploaded_file',
+ -default=>'starting value',
+ -size=>50,
+ -maxlength=>80);
+ -or-
+
+ print filefield('uploaded_file','starting value',50,80);
+
+filefield() will return a file upload field.
+In order to take full advantage of this I<you must use the new
+multipart encoding scheme> for the form. You can do this either
+by calling B<start_form()> with an encoding type of B<&CGI::MULTIPART>,
+or by calling the new method B<start_multipart_form()> instead of
+vanilla B<start_form()>.
+
+=over 4
+
+=item B<Parameters>
+
+=item 1.
+
+The first parameter is the required name for the field (-name).
+
+=item 2.
+
+The optional second parameter is the starting value for the field contents
+to be used as the default file name (-default).
+
+For security reasons, browsers don't pay any attention to this field,
+and so the starting value will always be blank. Worse, the field
+loses its "sticky" behavior and forgets its previous contents. The
+starting value field is called for in the HTML specification, however,
+and possibly some browser will eventually provide support for it.
+
+=item 3.
+
+The optional third parameter is the size of the field in
+characters (-size).
+
+=item 4.
+
+The optional fourth parameter is the maximum number of characters the
+field will accept (-maxlength).
+
+=back
+
+JAVASCRIPTING: The B<-onChange>, B<-onFocus>, B<-onBlur>,
+B<-onMouseOver>, B<-onMouseOut> and B<-onSelect> parameters are
+recognized. See textfield() for details.
+
+=head2 PROCESSING A FILE UPLOAD FIELD
+
+=head3 Basics
+
+When the form is processed, you can retrieve an L<IO::Handle> compatibile
+handle for a file upload field like this:
+
+ $lightweight_fh = $q->upload('field_name');
+
+ # undef may be returned if it's not a valid file handle
+ if (defined $lightweight_fh) {
+ # Upgrade the handle to one compatible with IO::Handle:
+ my $io_handle = $lightweight_fh->handle;
+
+ open (OUTFILE,">>/usr/local/web/users/feedback");
+ while ($bytesread = $io_handle->read($buffer,1024)) {
+ print OUTFILE $buffer;
+ }
+ }
+
+In a list context, upload() will return an array of filehandles.
+This makes it possible to process forms that use the same name for
+multiple upload fields.
+
+If you want the entered file name for the file, you can just call param():
+
+ $filename = $q->param('field_name');
+
+Different browsers will return slightly different things for the
+name. Some browsers return the filename only. Others return the full
+path to the file, using the path conventions of the user's machine.
+Regardless, the name returned is always the name of the file on the
+I<user's> machine, and is unrelated to the name of the temporary file
+that CGI.pm creates during upload spooling (see below).
+
+When a file is uploaded the browser usually sends along some
+information along with it in the format of headers. The information
+usually includes the MIME content type. To
+retrieve this information, call uploadInfo(). It returns a reference to
+a hash containing all the document headers.
+
+ $filename = $q->param('uploaded_file');
+ $type = $q->uploadInfo($filename)->{'Content-Type'};
+ unless ($type eq 'text/html') {
+ die "HTML FILES ONLY!";
+ }
+
+If you are using a machine that recognizes "text" and "binary" data
+modes, be sure to understand when and how to use them (see the Camel book).
+Otherwise you may find that binary files are corrupted during file
+uploads.
+
+=head3 Accessing the temp files directly
+
+When processing an uploaded file, CGI.pm creates a temporary file on your hard
+disk and passes you a file handle to that file. After you are finished with the
+file handle, CGI.pm unlinks (deletes) the temporary file. If you need to you
+can access the temporary file directly. You can access the temp file for a file
+upload by passing the file name to the tmpFileName() method:
+
+ $filename = $query->param('uploaded_file');
+ $tmpfilename = $query->tmpFileName($filename);
+
+The temporary file will be deleted automatically when your program exits unless
+you manually rename it. On some operating systems (such as Windows NT), you
+will need to close the temporary file's filehandle before your program exits.
+Otherwise the attempt to delete the temporary file will fail.
+
+=head3 Handling interrupted file uploads
+
+There are occasionally problems involving parsing the uploaded file.
+This usually happens when the user presses "Stop" before the upload is
+finished. In this case, CGI.pm will return undef for the name of the
+uploaded file and set I<cgi_error()> to the string "400 Bad request
+(malformed multipart POST)". This error message is designed so that
+you can incorporate it into a status code to be sent to the browser.
+Example:
+
+ $file = $q->upload('uploaded_file');
+ if (!$file && $q->cgi_error) {
+ print $q->header(-status=>$q->cgi_error);
+ exit 0;
+ }
+
+You are free to create a custom HTML page to complain about the error,
+if you wish.
+
+=head3 Progress bars for file uploads and avoiding temp files
+
+CGI.pm gives you low-level access to file upload management through
+a file upload hook. You can use this feature to completely turn off
+the temp file storage of file uploads, or potentially write your own
+file upload progess meter.
+
+This is much like the UPLOAD_HOOK facility available in L<Apache::Request>, with
+the exception that the first argument to the callback is an L<Apache::Upload>
+object, here it's the remote filename.
+
+ $q = CGI->new(\&hook [,$data [,$use_tempfile]]);
+
+ sub hook {
+ my ($filename, $buffer, $bytes_read, $data) = @_;
+ print "Read $bytes_read bytes of $filename\n";
+ }
+
+The C<< $data >> field is optional; it lets you pass configuration
+information (e.g. a database handle) to your hook callback.
+
+The C<< $use_tempfile >> field is a flag that lets you turn on and off
+CGI.pm's use of a temporary disk-based file during file upload. If you
+set this to a FALSE value (default true) then $q->param('uploaded_file')
+will no longer work, and the only way to get at the uploaded data is
+via the hook you provide.
+
+If using the function-oriented interface, call the CGI::upload_hook()
+method before calling param() or any other CGI functions:
+
+ CGI::upload_hook(\&hook [,$data [,$use_tempfile]]);
+
+This method is not exported by default. You will have to import it
+explicitly if you wish to use it without the CGI:: prefix.
+
+=head3 Troubleshooting file uploads on Windows
+
+If you are using CGI.pm on a Windows platform and find that binary
+files get slightly larger when uploaded but that text files remain the
+same, then you have forgotten to activate binary mode on the output
+filehandle. Be sure to call binmode() on any handle that you create
+to write the uploaded file to disk.
+
+=head3 Older ways to process file uploads
+
+( This section is here for completeness. if you are building a new application with CGI.pm, you can skip it. )
+
+The original way to process file uploads with CGI.pm was to use param(). The
+value it returns has a dual nature as both a file name and a lightweight
+filehandle. This dual nature is problematic if you following the recommended
+practice of having C<use strict> in your code. Perl will complain when you try
+to use a string as a filehandle. More seriously, it is possible for the remote
+user to type garbage into the upload field, in which case what you get from
+param() is not a filehandle at all, but a string.
+
+To solve this problem the upload() method was added, which always returns a
+lightweight filehandle. This generally works well, but will have trouble
+interoperating with some other modules because the file handle is not derived
+from L<IO::Handle>. So that brings us to current recommedation given above,
+which is to call the handle() method on the file handle returned by upload().
+That upgrades the handle to an IO::Handle. It's a big win for compatibility for
+a small penalty of loading IO::Handle the first time you call it.
+
+
+=head2 CREATING A POPUP MENU
+
+ print popup_menu('menu_name',
+ ['eenie','meenie','minie'],
+ 'meenie');
+
+ -or-
+
+ %labels = ('eenie'=>'your first choice',
+ 'meenie'=>'your second choice',
+ 'minie'=>'your third choice');
+ %attributes = ('eenie'=>{'class'=>'class of first choice'});
+ print popup_menu('menu_name',
+ ['eenie','meenie','minie'],
+ 'meenie',\%labels,\%attributes);
+
+ -or (named parameter style)-
+
+ print popup_menu(-name=>'menu_name',
+ -values=>['eenie','meenie','minie'],
+ -default=>['meenie','minie'],
+ -labels=>\%labels,
+ -attributes=>\%attributes);
+
+popup_menu() creates a menu.
+
+=over 4
+
+=item 1.
+
+The required first argument is the menu's name (-name).
+
+=item 2.
+
+The required second argument (-values) is an array B<reference>
+containing the list of menu items in the menu. You can pass the
+method an anonymous array, as shown in the example, or a reference to
+a named array, such as "\@foo".
+
+=item 3.
+
+The optional third parameter (-default) is the name of the default
+menu choice. If not specified, the first item will be the default.
+The values of the previous choice will be maintained across
+queries. Pass an array reference to select multiple defaults.
+
+=item 4.
+
+The optional fourth parameter (-labels) is provided for people who
+want to use different values for the user-visible label inside the
+popup menu and the value returned to your script. It's a pointer to an
+hash relating menu values to user-visible labels. If you
+leave this parameter blank, the menu values will be displayed by
+default. (You can also leave a label undefined if you want to).
+
+=item 5.
+
+The optional fifth parameter (-attributes) is provided to assign
+any of the common HTML attributes to an individual menu item. It's
+a pointer to a hash relating menu values to another
+hash with the attribute's name as the key and the
+attribute's value as the value.
+
+=back
+
+When the form is processed, the selected value of the popup menu can
+be retrieved using:
+
+ $popup_menu_value = param('menu_name');
+
+=head2 CREATING AN OPTION GROUP
+
+Named parameter style
+
+ print popup_menu(-name=>'menu_name',
+ -values=>[qw/eenie meenie minie/,
+ optgroup(-name=>'optgroup_name',
+ -values => ['moe','catch'],
+ -attributes=>{'catch'=>{'class'=>'red'}})],
+ -labels=>{'eenie'=>'one',
+ 'meenie'=>'two',
+ 'minie'=>'three'},
+ -default=>'meenie');
+
+ Old style
+ print popup_menu('menu_name',
+ ['eenie','meenie','minie',
+ optgroup('optgroup_name', ['moe', 'catch'],
+ {'catch'=>{'class'=>'red'}})],'meenie',
+ {'eenie'=>'one','meenie'=>'two','minie'=>'three'});
+
+optgroup() creates an option group within a popup menu.
+
+=over 4
+
+=item 1.
+
+The required first argument (B<-name>) is the label attribute of the
+optgroup and is B<not> inserted in the parameter list of the query.
+
+=item 2.
+
+The required second argument (B<-values>) is an array reference
+containing the list of menu items in the menu. You can pass the
+method an anonymous array, as shown in the example, or a reference
+to a named array, such as \@foo. If you pass a HASH reference,
+the keys will be used for the menu values, and the values will be
+used for the menu labels (see -labels below).
+
+=item 3.
+
+The optional third parameter (B<-labels>) allows you to pass a reference
+to a hash containing user-visible labels for one or more
+of the menu items. You can use this when you want the user to see one
+menu string, but have the browser return your program a different one.
+If you don't specify this, the value string will be used instead
+("eenie", "meenie" and "minie" in this example). This is equivalent
+to using a hash reference for the -values parameter.
+
+=item 4.
+
+An optional fourth parameter (B<-labeled>) can be set to a true value
+and indicates that the values should be used as the label attribute
+for each option element within the optgroup.
+
+=item 5.
+
+An optional fifth parameter (-novals) can be set to a true value and
+indicates to suppress the val attribute in each option element within
+the optgroup.
+
+See the discussion on optgroup at W3C
+(http://www.w3.org/TR/REC-html40/interact/forms.html#edef-OPTGROUP)
+for details.
+
+=item 6.
+
+An optional sixth parameter (-attributes) is provided to assign
+any of the common HTML attributes to an individual menu item. It's
+a pointer to a hash relating menu values to another
+hash with the attribute's name as the key and the
+attribute's value as the value.
+
+=back
+
+=head2 CREATING A SCROLLING LIST
+
+ print scrolling_list('list_name',
+ ['eenie','meenie','minie','moe'],
+ ['eenie','moe'],5,'true',{'moe'=>{'class'=>'red'}});
+ -or-
+
+ print scrolling_list('list_name',
+ ['eenie','meenie','minie','moe'],
+ ['eenie','moe'],5,'true',
+ \%labels,%attributes);
+
+ -or-
+
+ print scrolling_list(-name=>'list_name',
+ -values=>['eenie','meenie','minie','moe'],
+ -default=>['eenie','moe'],
+ -size=>5,
+ -multiple=>'true',
+ -labels=>\%labels,
+ -attributes=>\%attributes);
+
+scrolling_list() creates a scrolling list.
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first and second arguments are the list name (-name) and values
+(-values). As in the popup menu, the second argument should be an
+array reference.
+
+=item 2.
+
+The optional third argument (-default) can be either a reference to a
+list containing the values to be selected by default, or can be a
+single value to select. If this argument is missing or undefined,
+then nothing is selected when the list first appears. In the named
+parameter version, you can use the synonym "-defaults" for this
+parameter.
+
+=item 3.
+
+The optional fourth argument is the size of the list (-size).
+
+=item 4.
+
+The optional fifth argument can be set to true to allow multiple
+simultaneous selections (-multiple). Otherwise only one selection
+will be allowed at a time.
+
+=item 5.
+
+The optional sixth argument is a pointer to a hash
+containing long user-visible labels for the list items (-labels).
+If not provided, the values will be displayed.
+
+=item 6.
+
+The optional sixth parameter (-attributes) is provided to assign
+any of the common HTML attributes to an individual menu item. It's
+a pointer to a hash relating menu values to another
+hash with the attribute's name as the key and the
+attribute's value as the value.
+
+When this form is processed, all selected list items will be returned as
+a list under the parameter name 'list_name'. The values of the
+selected items can be retrieved with:
+
+ @selected = param('list_name');
+
+=back
+
+=head2 CREATING A GROUP OF RELATED CHECKBOXES
+
+ print checkbox_group(-name=>'group_name',
+ -values=>['eenie','meenie','minie','moe'],
+ -default=>['eenie','moe'],
+ -linebreak=>'true',
+ -disabled => ['moe'],
+ -labels=>\%labels,
+ -attributes=>\%attributes);
+
+ print checkbox_group('group_name',
+ ['eenie','meenie','minie','moe'],
+ ['eenie','moe'],'true',\%labels,
+ {'moe'=>{'class'=>'red'}});
+
+ HTML3-COMPATIBLE BROWSERS ONLY:
+
+ print checkbox_group(-name=>'group_name',
+ -values=>['eenie','meenie','minie','moe'],
+ -rows=2,-columns=>2);
+
+
+checkbox_group() creates a list of checkboxes that are related
+by the same name.
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first and second arguments are the checkbox name and values,
+respectively (-name and -values). As in the popup menu, the second
+argument should be an array reference. These values are used for the
+user-readable labels printed next to the checkboxes as well as for the
+values passed to your script in the query string.
+
+=item 2.
+
+The optional third argument (-default) can be either a reference to a
+list containing the values to be checked by default, or can be a
+single value to checked. If this argument is missing or undefined,
+then nothing is selected when the list first appears.
+
+=item 3.
+
+The optional fourth argument (-linebreak) can be set to true to place
+line breaks between the checkboxes so that they appear as a vertical
+list. Otherwise, they will be strung together on a horizontal line.
+
+=back
+
+
+The optional B<-labels> argument is a pointer to a hash
+relating the checkbox values to the user-visible labels that will be
+printed next to them. If not provided, the values will be used as the
+default.
+
+
+The optional parameters B<-rows>, and B<-columns> cause
+checkbox_group() to return an HTML3 compatible table containing the
+checkbox group formatted with the specified number of rows and
+columns. You can provide just the -columns parameter if you wish;
+checkbox_group will calculate the correct number of rows for you.
+
+The option B<-disabled> takes an array of checkbox values and disables
+them by greying them out (this may not be supported by all browsers).
+
+The optional B<-attributes> argument is provided to assign any of the
+common HTML attributes to an individual menu item. It's a pointer to
+a hash relating menu values to another hash
+with the attribute's name as the key and the attribute's value as the
+value.
+
+The optional B<-tabindex> argument can be used to control the order in which
+radio buttons receive focus when the user presses the tab button. If
+passed a scalar numeric value, the first element in the group will
+receive this tab index and subsequent elements will be incremented by
+one. If given a reference to an array of radio button values, then
+the indexes will be jiggered so that the order specified in the array
+will correspond to the tab order. You can also pass a reference to a
+hash in which the hash keys are the radio button values and the values
+are the tab indexes of each button. Examples:
+
+ -tabindex => 100 # this group starts at index 100 and counts up
+ -tabindex => ['moe','minie','eenie','meenie'] # tab in this order
+ -tabindex => {meenie=>100,moe=>101,minie=>102,eenie=>200} # tab in this order
+
+The optional B<-labelattributes> argument will contain attributes
+attached to the <label> element that surrounds each button.
+
+When the form is processed, all checked boxes will be returned as
+a list under the parameter name 'group_name'. The values of the
+"on" checkboxes can be retrieved with:
+
+ @turned_on = param('group_name');
+
+The value returned by checkbox_group() is actually an array of button
+elements. You can capture them and use them within tables, lists,
+or in other creative ways:
+
+ @h = checkbox_group(-name=>'group_name',-values=>\@values);
+ &use_in_creative_way(@h);
+
+=head2 CREATING A STANDALONE CHECKBOX
+
+ print checkbox(-name=>'checkbox_name',
+ -checked=>1,
+ -value=>'ON',
+ -label=>'CLICK ME');
+
+ -or-
+
+ print checkbox('checkbox_name','checked','ON','CLICK ME');
+
+checkbox() is used to create an isolated checkbox that isn't logically
+related to any others.
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first parameter is the required name for the checkbox (-name). It
+will also be used for the user-readable label printed next to the
+checkbox.
+
+=item 2.
+
+The optional second parameter (-checked) specifies that the checkbox
+is turned on by default. Synonyms are -selected and -on.
+
+=item 3.
+
+The optional third parameter (-value) specifies the value of the
+checkbox when it is checked. If not provided, the word "on" is
+assumed.
+
+=item 4.
+
+The optional fourth parameter (-label) is the user-readable label to
+be attached to the checkbox. If not provided, the checkbox name is
+used.
+
+=back
+
+The value of the checkbox can be retrieved using:
+
+ $turned_on = param('checkbox_name');
+
+=head2 CREATING A RADIO BUTTON GROUP
+
+ print radio_group(-name=>'group_name',
+ -values=>['eenie','meenie','minie'],
+ -default=>'meenie',
+ -linebreak=>'true',
+ -labels=>\%labels,
+ -attributes=>\%attributes);
+
+ -or-
+
+ print radio_group('group_name',['eenie','meenie','minie'],
+ 'meenie','true',\%labels,\%attributes);
+
+
+ HTML3-COMPATIBLE BROWSERS ONLY:
+
+ print radio_group(-name=>'group_name',
+ -values=>['eenie','meenie','minie','moe'],
+ -rows=2,-columns=>2);
+
+radio_group() creates a set of logically-related radio buttons
+(turning one member of the group on turns the others off)
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first argument is the name of the group and is required (-name).
+
+=item 2.
+
+The second argument (-values) is the list of values for the radio
+buttons. The values and the labels that appear on the page are
+identical. Pass an array I<reference> in the second argument, either
+using an anonymous array, as shown, or by referencing a named array as
+in "\@foo".
+
+=item 3.
+
+The optional third parameter (-default) is the name of the default
+button to turn on. If not specified, the first item will be the
+default. You can provide a nonexistent button name, such as "-" to
+start up with no buttons selected.
+
+=item 4.
+
+The optional fourth parameter (-linebreak) can be set to 'true' to put
+line breaks between the buttons, creating a vertical list.
+
+=item 5.
+
+The optional fifth parameter (-labels) is a pointer to an associative
+array relating the radio button values to user-visible labels to be
+used in the display. If not provided, the values themselves are
+displayed.
+
+=back
+
+
+All modern browsers can take advantage of the optional parameters
+B<-rows>, and B<-columns>. These parameters cause radio_group() to
+return an HTML3 compatible table containing the radio group formatted
+with the specified number of rows and columns. You can provide just
+the -columns parameter if you wish; radio_group will calculate the
+correct number of rows for you.
+
+To include row and column headings in the returned table, you
+can use the B<-rowheaders> and B<-colheaders> parameters. Both
+of these accept a pointer to an array of headings to use.
+The headings are just decorative. They don't reorganize the
+interpretation of the radio buttons -- they're still a single named
+unit.
+
+The optional B<-tabindex> argument can be used to control the order in which
+radio buttons receive focus when the user presses the tab button. If
+passed a scalar numeric value, the first element in the group will
+receive this tab index and subsequent elements will be incremented by
+one. If given a reference to an array of radio button values, then
+the indexes will be jiggered so that the order specified in the array
+will correspond to the tab order. You can also pass a reference to a
+hash in which the hash keys are the radio button values and the values
+are the tab indexes of each button. Examples:
+
+ -tabindex => 100 # this group starts at index 100 and counts up
+ -tabindex => ['moe','minie','eenie','meenie'] # tab in this order
+ -tabindex => {meenie=>100,moe=>101,minie=>102,eenie=>200} # tab in this order
+
+
+The optional B<-attributes> argument is provided to assign any of the
+common HTML attributes to an individual menu item. It's a pointer to
+a hash relating menu values to another hash
+with the attribute's name as the key and the attribute's value as the
+value.
+
+The optional B<-labelattributes> argument will contain attributes
+attached to the <label> element that surrounds each button.
+
+When the form is processed, the selected radio button can
+be retrieved using:
+
+ $which_radio_button = param('group_name');
+
+The value returned by radio_group() is actually an array of button
+elements. You can capture them and use them within tables, lists,
+or in other creative ways:
+
+ @h = radio_group(-name=>'group_name',-values=>\@values);
+ &use_in_creative_way(@h);
+
+=head2 CREATING A SUBMIT BUTTON
+
+ print submit(-name=>'button_name',
+ -value=>'value');
+
+ -or-
+
+ print submit('button_name','value');
+
+submit() will create the query submission button. Every form
+should have one of these.
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first argument (-name) is optional. You can give the button a
+name if you have several submission buttons in your form and you want
+to distinguish between them.
+
+=item 2.
+
+The second argument (-value) is also optional. This gives the button
+a value that will be passed to your script in the query string. The
+name will also be used as the user-visible label.
+
+=item 3.
+
+You can use -label as an alias for -value. I always get confused
+about which of -name and -value changes the user-visible label on the
+button.
+
+=back
+
+You can figure out which button was pressed by using different
+values for each one:
+
+ $which_one = param('button_name');
+
+=head2 CREATING A RESET BUTTON
+
+ print reset
+
+reset() creates the "reset" button. Note that it restores the
+form to its value from the last time the script was called,
+NOT necessarily to the defaults.
+
+Note that this conflicts with the Perl reset() built-in. Use
+CORE::reset() to get the original reset function.
+
+=head2 CREATING A DEFAULT BUTTON
+
+ print defaults('button_label')
+
+defaults() creates a button that, when invoked, will cause the
+form to be completely reset to its defaults, wiping out all the
+changes the user ever made.
+
+=head2 CREATING A HIDDEN FIELD
+
+ print hidden(-name=>'hidden_name',
+ -default=>['value1','value2'...]);
+
+ -or-
+
+ print hidden('hidden_name','value1','value2'...);
+
+hidden() produces a text field that can't be seen by the user. It
+is useful for passing state variable information from one invocation
+of the script to the next.
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first argument is required and specifies the name of this
+field (-name).
+
+=item 2.
+
+The second argument is also required and specifies its value
+(-default). In the named parameter style of calling, you can provide
+a single value here or a reference to a whole list
+
+=back
+
+Fetch the value of a hidden field this way:
+
+ $hidden_value = param('hidden_name');
+
+Note, that just like all the other form elements, the value of a
+hidden field is "sticky". If you want to replace a hidden field with
+some other values after the script has been called once you'll have to
+do it manually:
+
+ param('hidden_name','new','values','here');
+
+=head2 CREATING A CLICKABLE IMAGE BUTTON
+
+ print image_button(-name=>'button_name',
+ -src=>'/source/URL',
+ -align=>'MIDDLE');
+
+ -or-
+
+ print image_button('button_name','/source/URL','MIDDLE');
+
+image_button() produces a clickable image. When it's clicked on the
+position of the click is returned to your script as "button_name.x"
+and "button_name.y", where "button_name" is the name you've assigned
+to it.
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first argument (-name) is required and specifies the name of this
+field.
+
+=item 2.
+
+The second argument (-src) is also required and specifies the URL
+
+=item 3.
+The third option (-align, optional) is an alignment type, and may be
+TOP, BOTTOM or MIDDLE
+
+=back
+
+Fetch the value of the button this way:
+ $x = param('button_name.x');
+ $y = param('button_name.y');
+
+=head2 CREATING A JAVASCRIPT ACTION BUTTON
+
+ print button(-name=>'button_name',
+ -value=>'user visible label',
+ -onClick=>"do_something()");
+
+ -or-
+
+ print button('button_name',"user visible value","do_something()");
+
+button() produces an C<< <input> >> tag with C<type="button">. When it's
+pressed the fragment of JavaScript code pointed to by the B<-onClick> parameter
+will be executed.
+
+=head1 HTTP COOKIES
+
+Browsers support a so-called "cookie" designed to help maintain state
+within a browser session. CGI.pm has several methods that support
+cookies.
+
+A cookie is a name=value pair much like the named parameters in a CGI
+query string. CGI scripts create one or more cookies and send
+them to the browser in the HTTP header. The browser maintains a list
+of cookies that belong to a particular Web server, and returns them
+to the CGI script during subsequent interactions.
+
+In addition to the required name=value pair, each cookie has several
+optional attributes:
+
+=over 4
+
+=item 1. an expiration time
+
+This is a time/date string (in a special GMT format) that indicates
+when a cookie expires. The cookie will be saved and returned to your
+script until this expiration date is reached if the user exits
+the browser and restarts it. If an expiration date isn't specified, the cookie
+will remain active until the user quits the browser.
+
+=item 2. a domain
+
+This is a partial or complete domain name for which the cookie is
+valid. The browser will return the cookie to any host that matches
+the partial domain name. For example, if you specify a domain name
+of ".capricorn.com", then the browser will return the cookie to
+Web servers running on any of the machines "www.capricorn.com",
+"www2.capricorn.com", "feckless.capricorn.com", etc. Domain names
+must contain at least two periods to prevent attempts to match
+on top level domains like ".edu". If no domain is specified, then
+the browser will only return the cookie to servers on the host the
+cookie originated from.
+
+=item 3. a path
+
+If you provide a cookie path attribute, the browser will check it
+against your script's URL before returning the cookie. For example,
+if you specify the path "/cgi-bin", then the cookie will be returned
+to each of the scripts "/cgi-bin/tally.pl", "/cgi-bin/order.pl",
+and "/cgi-bin/customer_service/complain.pl", but not to the script
+"/cgi-private/site_admin.pl". By default, path is set to "/", which
+causes the cookie to be sent to any CGI script on your site.
+
+=item 4. a "secure" flag
+
+If the "secure" attribute is set, the cookie will only be sent to your
+script if the CGI request is occurring on a secure channel, such as SSL.
+
+=back
+
+The interface to HTTP cookies is the B<cookie()> method:
+
+ $cookie = cookie(-name=>'sessionID',
+ -value=>'xyzzy',
+ -expires=>'+1h',
+ -path=>'/cgi-bin/database',
+ -domain=>'.capricorn.org',
+ -secure=>1);
+ print header(-cookie=>$cookie);
+
+B<cookie()> creates a new cookie. Its parameters include:
+
+=over 4
+
+=item B<-name>
+
+The name of the cookie (required). This can be any string at all.
+Although browsers limit their cookie names to non-whitespace
+alphanumeric characters, CGI.pm removes this restriction by escaping
+and unescaping cookies behind the scenes.
+
+=item B<-value>
+
+The value of the cookie. This can be any scalar value,
+array reference, or even hash reference. For example,
+you can store an entire hash into a cookie this way:
+
+ $cookie=cookie(-name=>'family information',
+ -value=>\%childrens_ages);
+
+=item B<-path>
+
+The optional partial path for which this cookie will be valid, as described
+above.
+
+=item B<-domain>
+
+The optional partial domain for which this cookie will be valid, as described
+above.
+
+=item B<-expires>
+
+The optional expiration date for this cookie. The format is as described
+in the section on the B<header()> method:
+
+ "+1h" one hour from now
+
+=item B<-secure>
+
+If set to true, this cookie will only be used within a secure
+SSL session.
+
+=back
+
+The cookie created by cookie() must be incorporated into the HTTP
+header within the string returned by the header() method:
+
+ use CGI ':standard';
+ print header(-cookie=>$my_cookie);
+
+To create multiple cookies, give header() an array reference:
+
+ $cookie1 = cookie(-name=>'riddle_name',
+ -value=>"The Sphynx's Question");
+ $cookie2 = cookie(-name=>'answers',
+ -value=>\%answers);
+ print header(-cookie=>[$cookie1,$cookie2]);
+
+To retrieve a cookie, request it by name by calling cookie() method
+without the B<-value> parameter. This example uses the object-oriented
+form:
+
+ use CGI;
+ $query = CGI->new;
+ $riddle = $query->cookie('riddle_name');
+ %answers = $query->cookie('answers');
+
+Cookies created with a single scalar value, such as the "riddle_name"
+cookie, will be returned in that form. Cookies with array and hash
+values can also be retrieved.
+
+The cookie and CGI namespaces are separate. If you have a parameter
+named 'answers' and a cookie named 'answers', the values retrieved by
+param() and cookie() are independent of each other. However, it's
+simple to turn a CGI parameter into a cookie, and vice-versa:
+
+ # turn a CGI parameter into a cookie
+ $c=cookie(-name=>'answers',-value=>[param('answers')]);
+ # vice-versa
+ param(-name=>'answers',-value=>[cookie('answers')]);
+
+If you call cookie() without any parameters, it will return a list of
+the names of all cookies passed to your script:
+
+ @cookies = cookie();
+
+See the B<cookie.cgi> example script for some ideas on how to use
+cookies effectively.
+
+=head1 WORKING WITH FRAMES
+
+It's possible for CGI.pm scripts to write into several browser panels
+and windows using the HTML 4 frame mechanism. There are three
+techniques for defining new frames programmatically:
+
+=over 4
+
+=item 1. Create a <Frameset> document
+
+After writing out the HTTP header, instead of creating a standard
+HTML document using the start_html() call, create a <frameset>
+document that defines the frames on the page. Specify your script(s)
+(with appropriate parameters) as the SRC for each of the frames.
+
+There is no specific support for creating <frameset> sections
+in CGI.pm, but the HTML is very simple to write.
+
+=item 2. Specify the destination for the document in the HTTP header
+
+You may provide a B<-target> parameter to the header() method:
+
+ print header(-target=>'ResultsWindow');
+
+This will tell the browser to load the output of your script into the
+frame named "ResultsWindow". If a frame of that name doesn't already
+exist, the browser will pop up a new window and load your script's
+document into that. There are a number of magic names that you can
+use for targets. See the HTML C<< <frame> >> documentation for details.
+
+=item 3. Specify the destination for the document in the <form> tag
+
+You can specify the frame to load in the FORM tag itself. With
+CGI.pm it looks like this:
+
+ print start_form(-target=>'ResultsWindow');
+
+When your script is reinvoked by the form, its output will be loaded
+into the frame named "ResultsWindow". If one doesn't already exist
+a new window will be created.
+
+=back
+
+The script "frameset.cgi" in the examples directory shows one way to
+create pages in which the fill-out form and the response live in
+side-by-side frames.
+
+=head1 SUPPORT FOR JAVASCRIPT
+
+The usual way to use JavaScript is to define a set of functions in a
+<SCRIPT> block inside the HTML header and then to register event
+handlers in the various elements of the page. Events include such
+things as the mouse passing over a form element, a button being
+clicked, the contents of a text field changing, or a form being
+submitted. When an event occurs that involves an element that has
+registered an event handler, its associated JavaScript code gets
+called.
+
+The elements that can register event handlers include the <BODY> of an
+HTML document, hypertext links, all the various elements of a fill-out
+form, and the form itself. There are a large number of events, and
+each applies only to the elements for which it is relevant. Here is a
+partial list:
+
+=over 4
+
+=item B<onLoad>
+
+The browser is loading the current document. Valid in:
+
+ + The HTML <BODY> section only.
+
+=item B<onUnload>
+
+The browser is closing the current page or frame. Valid for:
+
+ + The HTML <BODY> section only.
+
+=item B<onSubmit>
+
+The user has pressed the submit button of a form. This event happens
+just before the form is submitted, and your function can return a
+value of false in order to abort the submission. Valid for:
+
+ + Forms only.
+
+=item B<onClick>
+
+The mouse has clicked on an item in a fill-out form. Valid for:
+
+ + Buttons (including submit, reset, and image buttons)
+ + Checkboxes
+ + Radio buttons
+
+=item B<onChange>
+
+The user has changed the contents of a field. Valid for:
+
+ + Text fields
+ + Text areas
+ + Password fields
+ + File fields
+ + Popup Menus
+ + Scrolling lists
+
+=item B<onFocus>
+
+The user has selected a field to work with. Valid for:
+
+ + Text fields
+ + Text areas
+ + Password fields
+ + File fields
+ + Popup Menus
+ + Scrolling lists
+
+=item B<onBlur>
+
+The user has deselected a field (gone to work somewhere else). Valid
+for:
+
+ + Text fields
+ + Text areas
+ + Password fields
+ + File fields
+ + Popup Menus
+ + Scrolling lists
+
+=item B<onSelect>
+
+The user has changed the part of a text field that is selected. Valid
+for:
+
+ + Text fields
+ + Text areas
+ + Password fields
+ + File fields
+
+=item B<onMouseOver>
+
+The mouse has moved over an element.
+
+ + Text fields
+ + Text areas
+ + Password fields
+ + File fields
+ + Popup Menus
+ + Scrolling lists
+
+=item B<onMouseOut>
+
+The mouse has moved off an element.
+
+ + Text fields
+ + Text areas
+ + Password fields
+ + File fields
+ + Popup Menus
+ + Scrolling lists
+
+=back
+
+In order to register a JavaScript event handler with an HTML element,
+just use the event name as a parameter when you call the corresponding
+CGI method. For example, to have your validateAge() JavaScript code
+executed every time the textfield named "age" changes, generate the
+field like this:
+
+ print textfield(-name=>'age',-onChange=>"validateAge(this)");
+
+This example assumes that you've already declared the validateAge()
+function by incorporating it into a <SCRIPT> block. The CGI.pm
+start_html() method provides a convenient way to create this section.
+
+Similarly, you can create a form that checks itself over for
+consistency and alerts the user if some essential value is missing by
+creating it this way:
+ print start_form(-onSubmit=>"validateMe(this)");
+
+See the javascript.cgi script for a demonstration of how this all
+works.
+
+
+=head1 LIMITED SUPPORT FOR CASCADING STYLE SHEETS
+
+CGI.pm has limited support for HTML3's cascading style sheets (css).
+To incorporate a stylesheet into your document, pass the
+start_html() method a B<-style> parameter. The value of this
+parameter may be a scalar, in which case it is treated as the source
+URL for the stylesheet, or it may be a hash reference. In the latter
+case you should provide the hash with one or more of B<-src> or
+B<-code>. B<-src> points to a URL where an externally-defined
+stylesheet can be found. B<-code> points to a scalar value to be
+incorporated into a <style> section. Style definitions in B<-code>
+override similarly-named ones in B<-src>, hence the name "cascading."
+
+You may also specify the type of the stylesheet by adding the optional
+B<-type> parameter to the hash pointed to by B<-style>. If not
+specified, the style defaults to 'text/css'.
+
+To refer to a style within the body of your document, add the
+B<-class> parameter to any HTML element:
+
+ print h1({-class=>'Fancy'},'Welcome to the Party');
+
+Or define styles on the fly with the B<-style> parameter:
+
+ print h1({-style=>'Color: red;'},'Welcome to Hell');
+
+You may also use the new B<span()> element to apply a style to a
+section of text:
+
+ print span({-style=>'Color: red;'},
+ h1('Welcome to Hell'),
+ "Where did that handbasket get to?"
+ );
+
+Note that you must import the ":html3" definitions to have the
+B<span()> method available. Here's a quick and dirty example of using
+CSS's. See the CSS specification at
+http://www.w3.org/Style/CSS/ for more information.
+
+ use CGI qw/:standard :html3/;
+
+ #here's a stylesheet incorporated directly into the page
+ $newStyle=<<END;
+ <!--
+ P.Tip {
+ margin-right: 50pt;
+ margin-left: 50pt;
+ color: red;
+ }
+ P.Alert {
+ font-size: 30pt;
+ font-family: sans-serif;
+ color: red;
+ }
+ -->
+ END
+ print header();
+ print start_html( -title=>'CGI with Style',
+ -style=>{-src=>'http://www.capricorn.com/style/st1.css',
+ -code=>$newStyle}
+ );
+ print h1('CGI with Style'),
+ p({-class=>'Tip'},
+ "Better read the cascading style sheet spec before playing with this!"),
+ span({-style=>'color: magenta'},
+ "Look Mom, no hands!",
+ p(),
+ "Whooo wee!"
+ );
+ print end_html;
+
+Pass an array reference to B<-code> or B<-src> in order to incorporate
+multiple stylesheets into your document.
+
+Should you wish to incorporate a verbatim stylesheet that includes
+arbitrary formatting in the header, you may pass a -verbatim tag to
+the -style hash, as follows:
+
+print start_html (-style => {-verbatim => '@import url("/server-common/css/'.$cssFile.'");',
+ -src => '/server-common/css/core.css'});
+
+
+This will generate an HTML header that contains this:
+
+ <link rel="stylesheet" type="text/css" href="/server-common/css/core.css">
+ <style type="text/css">
+ @import url("/server-common/css/main.css");
+ </style>
+
+Any additional arguments passed in the -style value will be
+incorporated into the <link> tag. For example:
+
+ start_html(-style=>{-src=>['/styles/print.css','/styles/layout.css'],
+ -media => 'all'});
+
+This will give:
+
+ <link rel="stylesheet" type="text/css" href="/styles/print.css" media="all"/>
+ <link rel="stylesheet" type="text/css" href="/styles/layout.css" media="all"/>
+
+<p>
+
+To make more complicated <link> tags, use the Link() function
+and pass it to start_html() in the -head argument, as in:
+
+ @h = (Link({-rel=>'stylesheet',-type=>'text/css',-src=>'/ss/ss.css',-media=>'all'}),
+ Link({-rel=>'stylesheet',-type=>'text/css',-src=>'/ss/fred.css',-media=>'paper'}));
+ print start_html({-head=>\@h})
+
+To create primary and "alternate" stylesheet, use the B<-alternate> option:
+
+ start_html(-style=>{-src=>[
+ {-src=>'/styles/print.css'},
+ {-src=>'/styles/alt.css',-alternate=>1}
+ ]
+ });
+
+=head1 DEBUGGING
+
+If you are running the script from the command line or in the perl
+debugger, you can pass the script a list of keywords or
+parameter=value pairs on the command line or from standard input (you
+don't have to worry about tricking your script into reading from
+environment variables). You can pass keywords like this:
+
+ your_script.pl keyword1 keyword2 keyword3
+
+or this:
+
+ your_script.pl keyword1+keyword2+keyword3
+
+or this:
+
+ your_script.pl name1=value1 name2=value2
+
+or this:
+
+ your_script.pl name1=value1&name2=value2
+
+To turn off this feature, use the -no_debug pragma.
+
+To test the POST method, you may enable full debugging with the -debug
+pragma. This will allow you to feed newline-delimited name=value
+pairs to the script on standard input.
+
+When debugging, you can use quotes and backslashes to escape
+characters in the familiar shell manner, letting you place
+spaces and other funny characters in your parameter=value
+pairs:
+
+ your_script.pl "name1='I am a long value'" "name2=two\ words"
+
+Finally, you can set the path info for the script by prefixing the first
+name/value parameter with the path followed by a question mark (?):
+
+ your_script.pl /your/path/here?name1=value1&name2=value2
+
+=head2 DUMPING OUT ALL THE NAME/VALUE PAIRS
+
+The Dump() method produces a string consisting of all the query's
+name/value pairs formatted nicely as a nested list. This is useful
+for debugging purposes:
+
+ print Dump
+
+
+Produces something that looks like:
+
+ <ul>
+ <li>name1
+ <ul>
+ <li>value1
+ <li>value2
+ </ul>
+ <li>name2
+ <ul>
+ <li>value1
+ </ul>
+ </ul>
+
+As a shortcut, you can interpolate the entire CGI object into a string
+and it will be replaced with the a nice HTML dump shown above:
+
+ $query=CGI->new;
+ print "<h2>Current Values</h2> $query\n";
+
+=head1 FETCHING ENVIRONMENT VARIABLES
+
+Some of the more useful environment variables can be fetched
+through this interface. The methods are as follows:
+
+=over 4
+
+=item B<Accept()>
+
+Return a list of MIME types that the remote browser accepts. If you
+give this method a single argument corresponding to a MIME type, as in
+Accept('text/html'), it will return a floating point value
+corresponding to the browser's preference for this type from 0.0
+(don't want) to 1.0. Glob types (e.g. text/*) in the browser's accept
+list are handled correctly.
+
+Note that the capitalization changed between version 2.43 and 2.44 in
+order to avoid conflict with Perl's accept() function.
+
+=item B<raw_cookie()>
+
+Returns the HTTP_COOKIE variable. Cookies have a special format, and
+this method call just returns the raw form (?cookie dough). See
+cookie() for ways of setting and retrieving cooked cookies.
+
+Called with no parameters, raw_cookie() returns the packed cookie
+structure. You can separate it into individual cookies by splitting
+on the character sequence "; ". Called with the name of a cookie,
+retrieves the B<unescaped> form of the cookie. You can use the
+regular cookie() method to get the names, or use the raw_fetch()
+method from the CGI::Cookie module.
+
+=item B<user_agent()>
+
+Returns the HTTP_USER_AGENT variable. If you give
+this method a single argument, it will attempt to
+pattern match on it, allowing you to do something
+like user_agent(Mozilla);
+
+=item B<path_info()>
+
+Returns additional path information from the script URL.
+E.G. fetching /cgi-bin/your_script/additional/stuff will result in
+path_info() returning "/additional/stuff".
+
+NOTE: The Microsoft Internet Information Server
+is broken with respect to additional path information. If
+you use the Perl DLL library, the IIS server will attempt to
+execute the additional path information as a Perl script.
+If you use the ordinary file associations mapping, the
+path information will be present in the environment,
+but incorrect. The best thing to do is to avoid using additional
+path information in CGI scripts destined for use with IIS.
+
+=item B<path_translated()>
+
+As per path_info() but returns the additional
+path information translated into a physical path, e.g.
+"/usr/local/etc/httpd/htdocs/additional/stuff".
+
+The Microsoft IIS is broken with respect to the translated
+path as well.
+
+=item B<remote_host()>
+
+Returns either the remote host name or IP address.
+if the former is unavailable.
+
+=item B<remote_addr()>
+
+Returns the remote host IP address, or
+127.0.0.1 if the address is unavailable.
+
+=item B<script_name()>
+Return the script name as a partial URL, for self-refering
+scripts.
+
+=item B<referer()>
+
+Return the URL of the page the browser was viewing
+prior to fetching your script. Not available for all
+browsers.
+
+=item B<auth_type ()>
+
+Return the authorization/verification method in use for this
+script, if any.
+
+=item B<server_name ()>
+
+Returns the name of the server, usually the machine's host
+name.
+
+=item B<virtual_host ()>
+
+When using virtual hosts, returns the name of the host that
+the browser attempted to contact
+
+=item B<server_port ()>
+
+Return the port that the server is listening on.
+
+=item B<virtual_port ()>
+
+Like server_port() except that it takes virtual hosts into account.
+Use this when running with virtual hosts.
+
+=item B<server_software ()>
+
+Returns the server software and version number.
+
+=item B<remote_user ()>
+
+Return the authorization/verification name used for user
+verification, if this script is protected.
+
+=item B<user_name ()>
+
+Attempt to obtain the remote user's name, using a variety of different
+techniques. This only works with older browsers such as Mosaic.
+Newer browsers do not report the user name for privacy reasons!
+
+=item B<request_method()>
+
+Returns the method used to access your script, usually
+one of 'POST', 'GET' or 'HEAD'.
+
+=item B<content_type()>
+
+Returns the content_type of data submitted in a POST, generally
+multipart/form-data or application/x-www-form-urlencoded
+
+=item B<http()>
+
+Called with no arguments returns the list of HTTP environment
+variables, including such things as HTTP_USER_AGENT,
+HTTP_ACCEPT_LANGUAGE, and HTTP_ACCEPT_CHARSET, corresponding to the
+like-named HTTP header fields in the request. Called with the name of
+an HTTP header field, returns its value. Capitalization and the use
+of hyphens versus underscores are not significant.
+
+For example, all three of these examples are equivalent:
+
+ $requested_language = http('Accept-language');
+ $requested_language = http('Accept_language');
+ $requested_language = http('HTTP_ACCEPT_LANGUAGE');
+
+=item B<https()>
+
+The same as I<http()>, but operates on the HTTPS environment variables
+present when the SSL protocol is in effect. Can be used to determine
+whether SSL is turned on.
+
+=back
+
+=head1 USING NPH SCRIPTS
+
+NPH, or "no-parsed-header", scripts bypass the server completely by
+sending the complete HTTP header directly to the browser. This has
+slight performance benefits, but is of most use for taking advantage
+of HTTP extensions that are not directly supported by your server,
+such as server push and PICS headers.
+
+Servers use a variety of conventions for designating CGI scripts as
+NPH. Many Unix servers look at the beginning of the script's name for
+the prefix "nph-". The Macintosh WebSTAR server and Microsoft's
+Internet Information Server, in contrast, try to decide whether a
+program is an NPH script by examining the first line of script output.
+
+
+CGI.pm supports NPH scripts with a special NPH mode. When in this
+mode, CGI.pm will output the necessary extra header information when
+the header() and redirect() methods are
+called.
+
+The Microsoft Internet Information Server requires NPH mode. As of
+version 2.30, CGI.pm will automatically detect when the script is
+running under IIS and put itself into this mode. You do not need to
+do this manually, although it won't hurt anything if you do. However,
+note that if you have applied Service Pack 6, much of the
+functionality of NPH scripts, including the ability to redirect while
+setting a cookie, B<do not work at all> on IIS without a special patch
+from Microsoft. See
+http://web.archive.org/web/20010812012030/http://support.microsoft.com/support/kb/articles/Q280/3/41.ASP
+Non-Parsed Headers Stripped From CGI Applications That Have nph-
+Prefix in Name.
+
+=over 4
+
+=item In the B<use> statement
+
+Simply add the "-nph" pragmato the list of symbols to be imported into
+your script:
+
+ use CGI qw(:standard -nph)
+
+=item By calling the B<nph()> method:
+
+Call B<nph()> with a non-zero parameter at any point after using CGI.pm in your program.
+
+ CGI->nph(1)
+
+=item By using B<-nph> parameters
+
+in the B<header()> and B<redirect()> statements:
+
+ print header(-nph=>1);
+
+=back
+
+=head1 Server Push
+
+CGI.pm provides four simple functions for producing multipart
+documents of the type needed to implement server push. These
+functions were graciously provided by Ed Jordan <ed@fidalgo.net>. To
+import these into your namespace, you must import the ":push" set.
+You are also advised to put the script into NPH mode and to set $| to
+1 to avoid buffering problems.
+
+Here is a simple script that demonstrates server push:
+
+ #!/usr/local/bin/perl
+ use CGI qw/:push -nph/;
+ $| = 1;
+ print multipart_init(-boundary=>'----here we go!');
+ for (0 .. 4) {
+ print multipart_start(-type=>'text/plain'),
+ "The current time is ",scalar(localtime),"\n";
+ if ($_ < 4) {
+ print multipart_end;
+ } else {
+ print multipart_final;
+ }
+ sleep 1;
+ }
+
+This script initializes server push by calling B<multipart_init()>.
+It then enters a loop in which it begins a new multipart section by
+calling B<multipart_start()>, prints the current local time,
+and ends a multipart section with B<multipart_end()>. It then sleeps
+a second, and begins again. On the final iteration, it ends the
+multipart section with B<multipart_final()> rather than with
+B<multipart_end()>.
+
+=over 4
+
+=item multipart_init()
+
+ multipart_init(-boundary=>$boundary);
+
+Initialize the multipart system. The -boundary argument specifies
+what MIME boundary string to use to separate parts of the document.
+If not provided, CGI.pm chooses a reasonable boundary for you.
+
+=item multipart_start()
+
+ multipart_start(-type=>$type)
+
+Start a new part of the multipart document using the specified MIME
+type. If not specified, text/html is assumed.
+
+=item multipart_end()
+
+ multipart_end()
+
+End a part. You must remember to call multipart_end() once for each
+multipart_start(), except at the end of the last part of the multipart
+document when multipart_final() should be called instead of multipart_end().
+
+=item multipart_final()
+
+ multipart_final()
+
+End all parts. You should call multipart_final() rather than
+multipart_end() at the end of the last part of the multipart document.
+
+=back
+
+Users interested in server push applications should also have a look
+at the CGI::Push module.
+
+=head1 Avoiding Denial of Service Attacks
+
+A potential problem with CGI.pm is that, by default, it attempts to
+process form POSTings no matter how large they are. A wily hacker
+could attack your site by sending a CGI script a huge POST of many
+megabytes. CGI.pm will attempt to read the entire POST into a
+variable, growing hugely in size until it runs out of memory. While
+the script attempts to allocate the memory the system may slow down
+dramatically. This is a form of denial of service attack.
+
+Another possible attack is for the remote user to force CGI.pm to
+accept a huge file upload. CGI.pm will accept the upload and store it
+in a temporary directory even if your script doesn't expect to receive
+an uploaded file. CGI.pm will delete the file automatically when it
+terminates, but in the meantime the remote user may have filled up the
+server's disk space, causing problems for other programs.
+
+The best way to avoid denial of service attacks is to limit the amount
+of memory, CPU time and disk space that CGI scripts can use. Some Web
+servers come with built-in facilities to accomplish this. In other
+cases, you can use the shell I<limit> or I<ulimit>
+commands to put ceilings on CGI resource usage.
+
+
+CGI.pm also has some simple built-in protections against denial of
+service attacks, but you must activate them before you can use them.
+These take the form of two global variables in the CGI name space:
+
+=over 4
+
+=item B<$CGI::POST_MAX>
+
+If set to a non-negative integer, this variable puts a ceiling
+on the size of POSTings, in bytes. If CGI.pm detects a POST
+that is greater than the ceiling, it will immediately exit with an error
+message. This value will affect both ordinary POSTs and
+multipart POSTs, meaning that it limits the maximum size of file
+uploads as well. You should set this to a reasonably high
+value, such as 1 megabyte.
+
+=item B<$CGI::DISABLE_UPLOADS>
+
+If set to a non-zero value, this will disable file uploads
+completely. Other fill-out form values will work as usual.
+
+=back
+
+You can use these variables in either of two ways.
+
+=over 4
+
+=item B<1. On a script-by-script basis>
+
+Set the variable at the top of the script, right after the "use" statement:
+
+ use CGI qw/:standard/;
+ use CGI::Carp 'fatalsToBrowser';
+ $CGI::POST_MAX=1024 * 100; # max 100K posts
+ $CGI::DISABLE_UPLOADS = 1; # no uploads
+
+=item B<2. Globally for all scripts>
+
+Open up CGI.pm, find the definitions for $POST_MAX and
+$DISABLE_UPLOADS, and set them to the desired values. You'll
+find them towards the top of the file in a subroutine named
+initialize_globals().
+
+=back
+
+An attempt to send a POST larger than $POST_MAX bytes will cause
+I<param()> to return an empty CGI parameter list. You can test for
+this event by checking I<cgi_error()>, either after you create the CGI
+object or, if you are using the function-oriented interface, call
+<param()> for the first time. If the POST was intercepted, then
+cgi_error() will return the message "413 POST too large".
+
+This error message is actually defined by the HTTP protocol, and is
+designed to be returned to the browser as the CGI script's status
+ code. For example:
+
+ $uploaded_file = param('upload');
+ if (!$uploaded_file && cgi_error()) {
+ print header(-status=>cgi_error());
+ exit 0;
+ }
+
+However it isn't clear that any browser currently knows what to do
+with this status code. It might be better just to create an
+HTML page that warns the user of the problem.
+
+=head1 COMPATIBILITY WITH CGI-LIB.PL
+
+To make it easier to port existing programs that use cgi-lib.pl the
+compatibility routine "ReadParse" is provided. Porting is simple:
+
+OLD VERSION
+ require "cgi-lib.pl";
+ &ReadParse;
+ print "The value of the antique is $in{antique}.\n";
+
+NEW VERSION
+ use CGI;
+ CGI::ReadParse();
+ print "The value of the antique is $in{antique}.\n";
+
+CGI.pm's ReadParse() routine creates a tied variable named %in,
+which can be accessed to obtain the query variables. Like
+ReadParse, you can also provide your own variable. Infrequently
+used features of ReadParse, such as the creation of @in and $in
+variables, are not supported.
+
+Once you use ReadParse, you can retrieve the query object itself
+this way:
+
+ $q = $in{CGI};
+ print textfield(-name=>'wow',
+ -value=>'does this really work?');
+
+This allows you to start using the more interesting features
+of CGI.pm without rewriting your old scripts from scratch.
+
+=head1 AUTHOR INFORMATION
+
+The CGI.pm distribution is copyright 1995-2007, Lincoln D. Stein. It is
+distributed under GPL and the Artistic License 2.0.
+
+Address bug reports and comments to: lstein@cshl.org. When sending
+bug reports, please provide the version of CGI.pm, the version of
+Perl, the name and version of your Web server, and the name and
+version of the operating system you are using. If the problem is even
+remotely browser dependent, please provide information about the
+affected browers as well.
+
+=head1 CREDITS
+
+Thanks very much to:
+
+=over 4
+
+=item Matt Heffron (heffron@falstaff.css.beckman.com)
+
+=item James Taylor (james.taylor@srs.gov)
+
+=item Scott Anguish <sanguish@digifix.com>
+
+=item Mike Jewell (mlj3u@virginia.edu)
+
+=item Timothy Shimmin (tes@kbs.citri.edu.au)
+
+=item Joergen Haegg (jh@axis.se)
+
+=item Laurent Delfosse (delfosse@delfosse.com)
+
+=item Richard Resnick (applepi1@aol.com)
+
+=item Craig Bishop (csb@barwonwater.vic.gov.au)
+
+=item Tony Curtis (tc@vcpc.univie.ac.at)
+
+=item Tim Bunce (Tim.Bunce@ig.co.uk)
+
+=item Tom Christiansen (tchrist@convex.com)
+
+=item Andreas Koenig (k@franz.ww.TU-Berlin.DE)
+
+=item Tim MacKenzie (Tim.MacKenzie@fulcrum.com.au)
+
+=item Kevin B. Hendricks (kbhend@dogwood.tyler.wm.edu)
+
+=item Stephen Dahmen (joyfire@inxpress.net)
+
+=item Ed Jordan (ed@fidalgo.net)
+
+=item David Alan Pisoni (david@cnation.com)
+
+=item Doug MacEachern (dougm@opengroup.org)
+
+=item Robin Houston (robin@oneworld.org)
+
+=item ...and many many more...
+
+for suggestions and bug fixes.
+
+=back
+
+=head1 A COMPLETE EXAMPLE OF A SIMPLE FORM-BASED SCRIPT
+
+
+ #!/usr/local/bin/perl
+
+ use CGI ':standard';
+
+ print header;
+ print start_html("Example CGI.pm Form");
+ print "<h1> Example CGI.pm Form</h1>\n";
+ print_prompt();
+ do_work();
+ print_tail();
+ print end_html;
+
+ sub print_prompt {
+ print start_form;
+ print "<em>What's your name?</em><br>";
+ print textfield('name');
+ print checkbox('Not my real name');
+
+ print "<p><em>Where can you find English Sparrows?</em><br>";
+ print checkbox_group(
+ -name=>'Sparrow locations',
+ -values=>[England,France,Spain,Asia,Hoboken],
+ -linebreak=>'yes',
+ -defaults=>[England,Asia]);
+
+ print "<p><em>How far can they fly?</em><br>",
+ radio_group(
+ -name=>'how far',
+ -values=>['10 ft','1 mile','10 miles','real far'],
+ -default=>'1 mile');
+
+ print "<p><em>What's your favorite color?</em> ";
+ print popup_menu(-name=>'Color',
+ -values=>['black','brown','red','yellow'],
+ -default=>'red');
+
+ print hidden('Reference','Monty Python and the Holy Grail');
+
+ print "<p><em>What have you got there?</em><br>";
+ print scrolling_list(
+ -name=>'possessions',
+ -values=>['A Coconut','A Grail','An Icon',
+ 'A Sword','A Ticket'],
+ -size=>5,
+ -multiple=>'true');
+
+ print "<p><em>Any parting comments?</em><br>";
+ print textarea(-name=>'Comments',
+ -rows=>10,
+ -columns=>50);
+
+ print "<p>",reset;
+ print submit('Action','Shout');
+ print submit('Action','Scream');
+ print end_form;
+ print "<hr>\n";
+ }
+
+ sub do_work {
+ my(@values,$key);
+
+ print "<h2>Here are the current settings in this form</h2>";
+
+ for $key (param) {
+ print "<strong>$key</strong> -> ";
+ @values = param($key);
+ print join(", ",@values),"<br>\n";
+ }
+ }
+
+ sub print_tail {
+ print <<END;
+ <hr>
+ <address>Lincoln D. Stein</address><br>
+ <a href="/">Home Page</a>
+ END
+ }
+
+=head1 BUGS
+
+Please report them.
+
+=head1 SEE ALSO
+
+L<CGI::Carp> - provides a L<Carp> implementation tailored to the CGI environment.
+
+L<CGI::Fast> - supports running CGI applications under FastCGI
+
+L<CGI::Pretty> - pretty prints HTML generated by CGI.pm (with a performance penalty)
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/CPAN.pm b/Master/tlpkg/tlperl.straw/lib/CPAN.pm
new file mode 100755
index 00000000000..cb0b8909fa5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPAN.pm
@@ -0,0 +1,3771 @@
+# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*-
+# vim: ts=4 sts=4 sw=4:
+use strict;
+package CPAN;
+$CPAN::VERSION = '1.94_54';
+$CPAN::VERSION =~ s/_//;
+
+# we need to run chdir all over and we would get at wrong libraries
+# there
+use File::Spec ();
+BEGIN {
+ if (File::Spec->can("rel2abs")) {
+ for my $inc (@INC) {
+ $inc = File::Spec->rel2abs($inc) unless ref $inc;
+ }
+ }
+}
+use CPAN::Author;
+use CPAN::HandleConfig;
+use CPAN::Version;
+use CPAN::Bundle;
+use CPAN::CacheMgr;
+use CPAN::Complete;
+use CPAN::Debug;
+use CPAN::Distribution;
+use CPAN::Distrostatus;
+use CPAN::FTP;
+use CPAN::Index 1.93; # https://rt.cpan.org/Ticket/Display.html?id=43349
+use CPAN::InfoObj;
+use CPAN::Module;
+use CPAN::Prompt;
+use CPAN::URL;
+use CPAN::Queue;
+use CPAN::Tarzip;
+use CPAN::DeferredCode;
+use CPAN::Shell;
+use CPAN::LWP::UserAgent;
+use CPAN::Exception::RecursiveDependency;
+use CPAN::Exception::yaml_not_installed;
+
+use Carp ();
+use Config ();
+use Cwd qw(chdir);
+use DirHandle ();
+use Exporter ();
+use ExtUtils::MakeMaker qw(prompt); # for some unknown reason,
+ # 5.005_04 does not work without
+ # this
+use File::Basename ();
+use File::Copy ();
+use File::Find;
+use File::Path ();
+use FileHandle ();
+use Fcntl qw(:flock);
+use Safe ();
+use Sys::Hostname qw(hostname);
+use Text::ParseWords ();
+use Text::Wrap ();
+
+# protect against "called too early"
+sub find_perl ();
+sub anycwd ();
+sub _uniq;
+
+no lib ".";
+
+require Mac::BuildTools if $^O eq 'MacOS';
+if ($ENV{PERL5_CPAN_IS_RUNNING} && $$ != $ENV{PERL5_CPAN_IS_RUNNING}) {
+ $ENV{PERL5_CPAN_IS_RUNNING_IN_RECURSION} ||= $ENV{PERL5_CPAN_IS_RUNNING};
+ my @rec = _uniq split(/,/, $ENV{PERL5_CPAN_IS_RUNNING_IN_RECURSION}), $$;
+ $ENV{PERL5_CPAN_IS_RUNNING_IN_RECURSION} = join ",", @rec;
+ # warn "# Note: Recursive call of CPAN.pm detected\n";
+ my $w = sprintf "# Note: CPAN.pm is running in process %d now", pop @rec;
+ my %sleep = (
+ 5 => 30,
+ 6 => 60,
+ 7 => 120,
+ );
+ my $sleep = @rec > 7 ? 300 : ($sleep{scalar @rec}||0);
+ my $verbose = @rec >= 4;
+ while (@rec) {
+ $w .= sprintf " which has been called by process %d", pop @rec;
+ }
+ if ($sleep) {
+ $w .= ".\n\n# Sleeping $sleep seconds to protect other processes\n";
+ }
+ if ($verbose) {
+ warn $w;
+ }
+ local $| = 1;
+ while ($sleep > 0) {
+ printf "\r#%5d", --$sleep;
+ sleep 1;
+ }
+ print "\n";
+}
+$ENV{PERL5_CPAN_IS_RUNNING}=$$;
+$ENV{PERL5_CPANPLUS_IS_RUNNING}=$$; # https://rt.cpan.org/Ticket/Display.html?id=23735
+
+END { $CPAN::End++; &cleanup; }
+
+$CPAN::Signal ||= 0;
+$CPAN::Frontend ||= "CPAN::Shell";
+unless (@CPAN::Defaultsites) {
+ @CPAN::Defaultsites = map {
+ CPAN::URL->new(TEXT => $_, FROM => "DEF")
+ }
+ "http://www.perl.org/CPAN/",
+ "ftp://ftp.perl.org/pub/CPAN/";
+}
+# $CPAN::iCwd (i for initial)
+$CPAN::iCwd ||= CPAN::anycwd();
+$CPAN::Perl ||= CPAN::find_perl();
+$CPAN::Defaultdocs ||= "http://search.cpan.org/perldoc?";
+$CPAN::Defaultrecent ||= "http://search.cpan.org/uploads.rdf";
+$CPAN::Defaultrecent ||= "http://cpan.uwinnipeg.ca/htdocs/cpan.xml";
+
+# our globals are getting a mess
+use vars qw(
+ $AUTOLOAD
+ $Be_Silent
+ $CONFIG_DIRTY
+ $Defaultdocs
+ $Echo_readline
+ $Frontend
+ $GOTOSHELL
+ $HAS_USABLE
+ $Have_warned
+ $MAX_RECURSION
+ $META
+ $RUN_DEGRADED
+ $Signal
+ $SQLite
+ $Suppress_readline
+ $VERSION
+ $autoload_recursion
+ $term
+ @Defaultsites
+ @EXPORT
+ );
+
+$MAX_RECURSION = 32;
+
+@CPAN::ISA = qw(CPAN::Debug Exporter);
+
+# note that these functions live in CPAN::Shell and get executed via
+# AUTOLOAD when called directly
+@EXPORT = qw(
+ autobundle
+ bundle
+ clean
+ cvs_import
+ expand
+ force
+ fforce
+ get
+ install
+ install_tested
+ is_tested
+ make
+ mkmyconfig
+ notest
+ perldoc
+ readme
+ recent
+ recompile
+ report
+ shell
+ smoke
+ test
+ upgrade
+ );
+
+sub soft_chdir_with_alternatives ($);
+
+{
+ $autoload_recursion ||= 0;
+
+ #-> sub CPAN::AUTOLOAD ;
+ sub AUTOLOAD { ## no critic
+ $autoload_recursion++;
+ my($l) = $AUTOLOAD;
+ $l =~ s/.*:://;
+ if ($CPAN::Signal) {
+ warn "Refusing to autoload '$l' while signal pending";
+ $autoload_recursion--;
+ return;
+ }
+ if ($autoload_recursion > 1) {
+ my $fullcommand = join " ", map { "'$_'" } $l, @_;
+ warn "Refusing to autoload $fullcommand in recursion\n";
+ $autoload_recursion--;
+ return;
+ }
+ my(%export);
+ @export{@EXPORT} = '';
+ CPAN::HandleConfig->load unless $CPAN::Config_loaded++;
+ if (exists $export{$l}) {
+ CPAN::Shell->$l(@_);
+ } else {
+ die(qq{Unknown CPAN command "$AUTOLOAD". }.
+ qq{Type ? for help.\n});
+ }
+ $autoload_recursion--;
+ }
+}
+
+{
+ my $x = *SAVEOUT; # avoid warning
+ open($x,">&STDOUT") or die "dup failed";
+ my $redir = 0;
+ sub _redirect(@) {
+ #die if $redir;
+ local $_;
+ push(@_,undef);
+ while(defined($_=shift)) {
+ if (s/^\s*>//){
+ my ($m) = s/^>// ? ">" : "";
+ s/\s+//;
+ $_=shift unless length;
+ die "no dest" unless defined;
+ open(STDOUT,">$m$_") or die "open:$_:$!\n";
+ $redir=1;
+ } elsif ( s/^\s*\|\s*// ) {
+ my $pipe="| $_";
+ while(defined($_[0])){
+ $pipe .= ' ' . shift;
+ }
+ open(STDOUT,$pipe) or die "open:$pipe:$!\n";
+ $redir=1;
+ } else {
+ push(@_,$_);
+ }
+ }
+ return @_;
+ }
+ sub _unredirect {
+ return unless $redir;
+ $redir = 0;
+ ## redirect: unredirect and propagate errors. explicit close to wait for pipe.
+ close(STDOUT);
+ open(STDOUT,">&SAVEOUT");
+ die "$@" if "$@";
+ ## redirect: done
+ }
+}
+
+sub _uniq {
+ my(@list) = @_;
+ my %seen;
+ return grep { !$seen{$_}++ } @list;
+}
+
+#-> sub CPAN::shell ;
+sub shell {
+ my($self) = @_;
+ $Suppress_readline = ! -t STDIN unless defined $Suppress_readline;
+ CPAN::HandleConfig->load unless $CPAN::Config_loaded++;
+
+ my $oprompt = shift || CPAN::Prompt->new;
+ my $prompt = $oprompt;
+ my $commandline = shift || "";
+ $CPAN::CurrentCommandId ||= 1;
+
+ local($^W) = 1;
+ unless ($Suppress_readline) {
+ require Term::ReadLine;
+ if (! $term
+ or
+ $term->ReadLine eq "Term::ReadLine::Stub"
+ ) {
+ $term = Term::ReadLine->new('CPAN Monitor');
+ }
+ if ($term->ReadLine eq "Term::ReadLine::Gnu") {
+ my $attribs = $term->Attribs;
+ $attribs->{attempted_completion_function} = sub {
+ &CPAN::Complete::gnu_cpl;
+ }
+ } else {
+ $readline::rl_completion_function =
+ $readline::rl_completion_function = 'CPAN::Complete::cpl';
+ }
+ if (my $histfile = $CPAN::Config->{'histfile'}) {{
+ unless ($term->can("AddHistory")) {
+ $CPAN::Frontend->mywarn("Terminal does not support AddHistory.\n");
+ last;
+ }
+ $META->readhist($term,$histfile);
+ }}
+ for ($CPAN::Config->{term_ornaments}) { # alias
+ local $Term::ReadLine::termcap_nowarn = 1;
+ $term->ornaments($_) if defined;
+ }
+ # $term->OUT is autoflushed anyway
+ my $odef = select STDERR;
+ $| = 1;
+ select STDOUT;
+ $| = 1;
+ select $odef;
+ }
+
+ $META->checklock();
+ my @cwd = grep { defined $_ and length $_ }
+ CPAN::anycwd(),
+ File::Spec->can("tmpdir") ? File::Spec->tmpdir() : (),
+ File::Spec->rootdir();
+ my $try_detect_readline;
+ $try_detect_readline = $term->ReadLine eq "Term::ReadLine::Stub" if $term;
+ unless ($CPAN::Config->{inhibit_startup_message}) {
+ my $rl_avail = $Suppress_readline ? "suppressed" :
+ ($term->ReadLine ne "Term::ReadLine::Stub") ? "enabled" :
+ "available (maybe install Bundle::CPAN or Bundle::CPANxxl?)";
+ $CPAN::Frontend->myprint(
+ sprintf qq{
+cpan shell -- CPAN exploration and modules installation (v%s)
+Enter 'h' for help.
+
+},
+ $CPAN::VERSION,
+ $rl_avail
+ )
+ }
+ my($continuation) = "";
+ my $last_term_ornaments;
+ SHELLCOMMAND: while () {
+ if ($Suppress_readline) {
+ if ($Echo_readline) {
+ $|=1;
+ }
+ print $prompt;
+ last SHELLCOMMAND unless defined ($_ = <> );
+ if ($Echo_readline) {
+ # backdoor: I could not find a way to record sessions
+ print $_;
+ }
+ chomp;
+ } else {
+ last SHELLCOMMAND unless
+ defined ($_ = $term->readline($prompt, $commandline));
+ }
+ $_ = "$continuation$_" if $continuation;
+ s/^\s+//;
+ next SHELLCOMMAND if /^$/;
+ s/^\s*\?\s*/help /;
+ if (/^(?:q(?:uit)?|bye|exit)\s*$/i) {
+ last SHELLCOMMAND;
+ } elsif (s/\\$//s) {
+ chomp;
+ $continuation = $_;
+ $prompt = " > ";
+ } elsif (/^\!/) {
+ s/^\!//;
+ my($eval) = $_;
+ package
+ CPAN::Eval; # hide from the indexer
+ use strict;
+ use vars qw($import_done);
+ CPAN->import(':DEFAULT') unless $import_done++;
+ CPAN->debug("eval[$eval]") if $CPAN::DEBUG;
+ eval($eval);
+ warn $@ if $@;
+ $continuation = "";
+ $prompt = $oprompt;
+ } elsif (/./) {
+ my(@line);
+ eval { @line = Text::ParseWords::shellwords($_) };
+ warn($@), next SHELLCOMMAND if $@;
+ warn("Text::Parsewords could not parse the line [$_]"),
+ next SHELLCOMMAND unless @line;
+ $CPAN::META->debug("line[".join("|",@line)."]") if $CPAN::DEBUG;
+ my $command = shift @line;
+ eval {
+ local (*STDOUT)=*STDOUT;
+ @line = _redirect(@line);
+ CPAN::Shell->$command(@line)
+ };
+ my $command_error = $@;
+ _unredirect;
+ my $reported_error;
+ if ($command_error) {
+ my $err = $command_error;
+ if (ref $err and $err->isa('CPAN::Exception::blocked_urllist')) {
+ $CPAN::Frontend->mywarn("Client not fully configured, please proceed with configuring.$err");
+ $reported_error = ref $err;
+ } else {
+ # I'd prefer never to arrive here and make all errors exception objects
+ if ($err =~ /\S/) {
+ require Carp;
+ require Dumpvalue;
+ my $dv = Dumpvalue->new(tick => '"');
+ Carp::cluck(sprintf "Catching error: %s", $dv->stringify($err));
+ }
+ }
+ }
+ if ($command =~ /^(
+ # classic commands
+ make
+ |test
+ |install
+ |clean
+
+ # pragmas for classic commands
+ |ff?orce
+ |notest
+
+ # compounds
+ |report
+ |smoke
+ |upgrade
+ )$/x) {
+ # only commands that tell us something about failed distros
+ # eval necessary for people without an urllist
+ eval {CPAN::Shell->failed($CPAN::CurrentCommandId,1);};
+ if (my $err = $@) {
+ unless (ref $err and $reported_error eq ref $err) {
+ die $@;
+ }
+ }
+ }
+ soft_chdir_with_alternatives(\@cwd);
+ $CPAN::Frontend->myprint("\n");
+ $continuation = "";
+ $CPAN::CurrentCommandId++;
+ $prompt = $oprompt;
+ }
+ } continue {
+ $commandline = ""; # I do want to be able to pass a default to
+ # shell, but on the second command I see no
+ # use in that
+ $Signal=0;
+ CPAN::Queue->nullify_queue;
+ if ($try_detect_readline) {
+ if ($CPAN::META->has_inst("Term::ReadLine::Gnu")
+ ||
+ $CPAN::META->has_inst("Term::ReadLine::Perl")
+ ) {
+ delete $INC{"Term/ReadLine.pm"};
+ my $redef = 0;
+ local($SIG{__WARN__}) = CPAN::Shell::paintdots_onreload(\$redef);
+ require Term::ReadLine;
+ $CPAN::Frontend->myprint("\n$redef subroutines in ".
+ "Term::ReadLine redefined\n");
+ $GOTOSHELL = 1;
+ }
+ }
+ if ($term and $term->can("ornaments")) {
+ for ($CPAN::Config->{term_ornaments}) { # alias
+ if (defined $_) {
+ if (not defined $last_term_ornaments
+ or $_ != $last_term_ornaments
+ ) {
+ local $Term::ReadLine::termcap_nowarn = 1;
+ $term->ornaments($_);
+ $last_term_ornaments = $_;
+ }
+ } else {
+ undef $last_term_ornaments;
+ }
+ }
+ }
+ for my $class (qw(Module Distribution)) {
+ # again unsafe meta access?
+ for my $dm (keys %{$CPAN::META->{readwrite}{"CPAN::$class"}}) {
+ next unless $CPAN::META->{readwrite}{"CPAN::$class"}{$dm}{incommandcolor};
+ CPAN->debug("BUG: $class '$dm' was in command state, resetting");
+ delete $CPAN::META->{readwrite}{"CPAN::$class"}{$dm}{incommandcolor};
+ }
+ }
+ if ($GOTOSHELL) {
+ $GOTOSHELL = 0; # not too often
+ $META->savehist if $CPAN::term && $CPAN::term->can("GetHistory");
+ @_ = ($oprompt,"");
+ goto &shell;
+ }
+ }
+ soft_chdir_with_alternatives(\@cwd);
+}
+
+#-> CPAN::soft_chdir_with_alternatives ;
+sub soft_chdir_with_alternatives ($) {
+ my($cwd) = @_;
+ unless (@$cwd) {
+ my $root = File::Spec->rootdir();
+ $CPAN::Frontend->mywarn(qq{Warning: no good directory to chdir to!
+Trying '$root' as temporary haven.
+});
+ push @$cwd, $root;
+ }
+ while () {
+ if (chdir $cwd->[0]) {
+ return;
+ } else {
+ if (@$cwd>1) {
+ $CPAN::Frontend->mywarn(qq{Could not chdir to "$cwd->[0]": $!
+Trying to chdir to "$cwd->[1]" instead.
+});
+ shift @$cwd;
+ } else {
+ $CPAN::Frontend->mydie(qq{Could not chdir to "$cwd->[0]": $!});
+ }
+ }
+ }
+}
+
+sub _flock {
+ my($fh,$mode) = @_;
+ if ( $Config::Config{d_flock} || $Config::Config{d_fcntl_can_lock} ) {
+ return flock $fh, $mode;
+ } elsif (!$Have_warned->{"d_flock"}++) {
+ $CPAN::Frontend->mywarn("Your OS does not seem to support locking; continuing and ignoring all locking issues\n");
+ $CPAN::Frontend->mysleep(5);
+ return 1;
+ } else {
+ return 1;
+ }
+}
+
+sub _yaml_module () {
+ my $yaml_module = $CPAN::Config->{yaml_module} || "YAML";
+ if (
+ $yaml_module ne "YAML"
+ &&
+ !$CPAN::META->has_inst($yaml_module)
+ ) {
+ # $CPAN::Frontend->mywarn("'$yaml_module' not installed, falling back to 'YAML'\n");
+ $yaml_module = "YAML";
+ }
+ if ($yaml_module eq "YAML"
+ &&
+ $CPAN::META->has_inst($yaml_module)
+ &&
+ $YAML::VERSION < 0.60
+ &&
+ !$Have_warned->{"YAML"}++
+ ) {
+ $CPAN::Frontend->mywarn("Warning: YAML version '$YAML::VERSION' is too low, please upgrade!\n".
+ "I'll continue but problems are *very* likely to happen.\n"
+ );
+ $CPAN::Frontend->mysleep(5);
+ }
+ return $yaml_module;
+}
+
+# CPAN::_yaml_loadfile
+sub _yaml_loadfile {
+ my($self,$local_file) = @_;
+ return +[] unless -s $local_file;
+ my $yaml_module = _yaml_module;
+ if ($CPAN::META->has_inst($yaml_module)) {
+ # temporarly enable yaml code deserialisation
+ no strict 'refs';
+ # 5.6.2 could not do the local() with the reference
+ # so we do it manually instead
+ my $old_loadcode = ${"$yaml_module\::LoadCode"};
+ ${ "$yaml_module\::LoadCode" } = $CPAN::Config->{yaml_load_code} || 0;
+
+ my ($code, @yaml);
+ if ($code = UNIVERSAL::can($yaml_module, "LoadFile")) {
+ eval { @yaml = $code->($local_file); };
+ if ($@) {
+ # this shall not be done by the frontend
+ die CPAN::Exception::yaml_process_error->new($yaml_module,$local_file,"parse",$@);
+ }
+ } elsif ($code = UNIVERSAL::can($yaml_module, "Load")) {
+ local *FH;
+ open FH, $local_file or die "Could not open '$local_file': $!";
+ local $/;
+ my $ystream = <FH>;
+ eval { @yaml = $code->($ystream); };
+ if ($@) {
+ # this shall not be done by the frontend
+ die CPAN::Exception::yaml_process_error->new($yaml_module,$local_file,"parse",$@);
+ }
+ }
+ ${"$yaml_module\::LoadCode"} = $old_loadcode;
+ return \@yaml;
+ } else {
+ # this shall not be done by the frontend
+ die CPAN::Exception::yaml_not_installed->new($yaml_module, $local_file, "parse");
+ }
+ return +[];
+}
+
+# CPAN::_yaml_dumpfile
+sub _yaml_dumpfile {
+ my($self,$local_file,@what) = @_;
+ my $yaml_module = _yaml_module;
+ if ($CPAN::META->has_inst($yaml_module)) {
+ my $code;
+ if (UNIVERSAL::isa($local_file, "FileHandle")) {
+ $code = UNIVERSAL::can($yaml_module, "Dump");
+ eval { print $local_file $code->(@what) };
+ } elsif ($code = UNIVERSAL::can($yaml_module, "DumpFile")) {
+ eval { $code->($local_file,@what); };
+ } elsif ($code = UNIVERSAL::can($yaml_module, "Dump")) {
+ local *FH;
+ open FH, ">$local_file" or die "Could not open '$local_file': $!";
+ print FH $code->(@what);
+ }
+ if ($@) {
+ die CPAN::Exception::yaml_process_error->new($yaml_module,$local_file,"dump",$@);
+ }
+ } else {
+ if (UNIVERSAL::isa($local_file, "FileHandle")) {
+ # I think this case does not justify a warning at all
+ } else {
+ die CPAN::Exception::yaml_not_installed->new($yaml_module, $local_file, "dump");
+ }
+ }
+}
+
+sub _init_sqlite () {
+ unless ($CPAN::META->has_inst("CPAN::SQLite")) {
+ $CPAN::Frontend->mywarn(qq{CPAN::SQLite not installed, trying to work without\n})
+ unless $Have_warned->{"CPAN::SQLite"}++;
+ return;
+ }
+ require CPAN::SQLite::META; # not needed since CVS version of 2006-12-17
+ $CPAN::SQLite ||= CPAN::SQLite::META->new($CPAN::META);
+}
+
+{
+ my $negative_cache = {};
+ sub _sqlite_running {
+ if ($negative_cache->{time} && time < $negative_cache->{time} + 60) {
+ # need to cache the result, otherwise too slow
+ return $negative_cache->{fact};
+ } else {
+ $negative_cache = {}; # reset
+ }
+ my $ret = $CPAN::Config->{use_sqlite} && ($CPAN::SQLite || _init_sqlite());
+ return $ret if $ret; # fast anyway
+ $negative_cache->{time} = time;
+ return $negative_cache->{fact} = $ret;
+ }
+}
+
+$META ||= CPAN->new; # In case we re-eval ourselves we need the ||
+
+# from here on only subs.
+################################################################################
+
+sub _perl_fingerprint {
+ my($self,$other_fingerprint) = @_;
+ my $dll = eval {OS2::DLLname()};
+ my $mtime_dll = 0;
+ if (defined $dll) {
+ $mtime_dll = (-f $dll ? (stat(_))[9] : '-1');
+ }
+ my $mtime_perl = (-f CPAN::find_perl ? (stat(_))[9] : '-1');
+ my $this_fingerprint = {
+ '$^X' => CPAN::find_perl,
+ sitearchexp => $Config::Config{sitearchexp},
+ 'mtime_$^X' => $mtime_perl,
+ 'mtime_dll' => $mtime_dll,
+ };
+ if ($other_fingerprint) {
+ if (exists $other_fingerprint->{'stat($^X)'}) { # repair fp from rev. 1.88_57
+ $other_fingerprint->{'mtime_$^X'} = $other_fingerprint->{'stat($^X)'}[9];
+ }
+ # mandatory keys since 1.88_57
+ for my $key (qw($^X sitearchexp mtime_dll mtime_$^X)) {
+ return unless $other_fingerprint->{$key} eq $this_fingerprint->{$key};
+ }
+ return 1;
+ } else {
+ return $this_fingerprint;
+ }
+}
+
+sub suggest_myconfig () {
+ SUGGEST_MYCONFIG: if(!$INC{'CPAN/MyConfig.pm'}) {
+ $CPAN::Frontend->myprint("You don't seem to have a user ".
+ "configuration (MyConfig.pm) yet.\n");
+ my $new = CPAN::Shell::colorable_makemaker_prompt("Do you want to create a ".
+ "user configuration now? (Y/n)",
+ "yes");
+ if($new =~ m{^y}i) {
+ CPAN::Shell->mkmyconfig();
+ return &checklock;
+ } else {
+ $CPAN::Frontend->mydie("OK, giving up.");
+ }
+ }
+}
+
+#-> sub CPAN::all_objects ;
+sub all_objects {
+ my($mgr,$class) = @_;
+ CPAN::HandleConfig->load unless $CPAN::Config_loaded++;
+ CPAN->debug("mgr[$mgr] class[$class]") if $CPAN::DEBUG;
+ CPAN::Index->reload;
+ values %{ $META->{readwrite}{$class} }; # unsafe meta access, ok
+}
+
+# Called by shell, not in batch mode. In batch mode I see no risk in
+# having many processes updating something as installations are
+# continually checked at runtime. In shell mode I suspect it is
+# unintentional to open more than one shell at a time
+
+#-> sub CPAN::checklock ;
+sub checklock {
+ my($self) = @_;
+ my $lockfile = File::Spec->catfile($CPAN::Config->{cpan_home},".lock");
+ if (-f $lockfile && -M _ > 0) {
+ my $fh = FileHandle->new($lockfile) or
+ $CPAN::Frontend->mydie("Could not open lockfile '$lockfile': $!");
+ my $otherpid = <$fh>;
+ my $otherhost = <$fh>;
+ $fh->close;
+ if (defined $otherpid && $otherpid) {
+ chomp $otherpid;
+ }
+ if (defined $otherhost && $otherhost) {
+ chomp $otherhost;
+ }
+ my $thishost = hostname();
+ if (defined $otherhost && defined $thishost &&
+ $otherhost ne '' && $thishost ne '' &&
+ $otherhost ne $thishost) {
+ $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: Lockfile '$lockfile'\n".
+ "reports other host $otherhost and other ".
+ "process $otherpid.\n".
+ "Cannot proceed.\n"));
+ } elsif ($RUN_DEGRADED) {
+ $CPAN::Frontend->mywarn("Running in downgraded mode (experimental)\n");
+ } elsif (defined $otherpid && $otherpid) {
+ return if $$ == $otherpid; # should never happen
+ $CPAN::Frontend->mywarn(
+ qq{
+There seems to be running another CPAN process (pid $otherpid). Contacting...
+});
+ if (kill 0, $otherpid or $!{EPERM}) {
+ $CPAN::Frontend->mywarn(qq{Other job is running.\n});
+ my($ans) =
+ CPAN::Shell::colorable_makemaker_prompt
+ (qq{Shall I try to run in downgraded }.
+ qq{mode? (Y/n)},"y");
+ if ($ans =~ /^y/i) {
+ $CPAN::Frontend->mywarn("Running in downgraded mode (experimental).
+Please report if something unexpected happens\n");
+ $RUN_DEGRADED = 1;
+ for ($CPAN::Config) {
+ # XXX
+ # $_->{build_dir_reuse} = 0; # 2006-11-17 akoenig Why was that?
+ $_->{commandnumber_in_prompt} = 0; # visibility
+ $_->{histfile} = ""; # who should win otherwise?
+ $_->{cache_metadata} = 0; # better would be a lock?
+ $_->{use_sqlite} = 0; # better would be a write lock!
+ $_->{auto_commit} = 0; # we are violent, do not persist
+ $_->{test_report} = 0; # Oliver Paukstadt had sent wrong reports in degraded mode
+ }
+ } else {
+ $CPAN::Frontend->mydie("
+You may want to kill the other job and delete the lockfile. On UNIX try:
+ kill $otherpid
+ rm $lockfile
+");
+ }
+ } elsif (-w $lockfile) {
+ my($ans) =
+ CPAN::Shell::colorable_makemaker_prompt
+ (qq{Other job not responding. Shall I overwrite }.
+ qq{the lockfile '$lockfile'? (Y/n)},"y");
+ $CPAN::Frontend->myexit("Ok, bye\n")
+ unless $ans =~ /^y/i;
+ } else {
+ Carp::croak(
+ qq{Lockfile '$lockfile' not writable by you. }.
+ qq{Cannot proceed.\n}.
+ qq{ On UNIX try:\n}.
+ qq{ rm '$lockfile'\n}.
+ qq{ and then rerun us.\n}
+ );
+ }
+ } else {
+ $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: Found invalid lockfile ".
+ "'$lockfile', please remove. Cannot proceed.\n"));
+ }
+ }
+ my $dotcpan = $CPAN::Config->{cpan_home};
+ eval { File::Path::mkpath($dotcpan);};
+ if ($@) {
+ # A special case at least for Jarkko.
+ my $firsterror = $@;
+ my $seconderror;
+ my $symlinkcpan;
+ if (-l $dotcpan) {
+ $symlinkcpan = readlink $dotcpan;
+ die "readlink $dotcpan failed: $!" unless defined $symlinkcpan;
+ eval { File::Path::mkpath($symlinkcpan); };
+ if ($@) {
+ $seconderror = $@;
+ } else {
+ $CPAN::Frontend->mywarn(qq{
+Working directory $symlinkcpan created.
+});
+ }
+ }
+ unless (-d $dotcpan) {
+ my $mess = qq{
+Your configuration suggests "$dotcpan" as your
+CPAN.pm working directory. I could not create this directory due
+to this error: $firsterror\n};
+ $mess .= qq{
+As "$dotcpan" is a symlink to "$symlinkcpan",
+I tried to create that, but I failed with this error: $seconderror
+} if $seconderror;
+ $mess .= qq{
+Please make sure the directory exists and is writable.
+};
+ $CPAN::Frontend->mywarn($mess);
+ return suggest_myconfig;
+ }
+ } # $@ after eval mkpath $dotcpan
+ if (0) { # to test what happens when a race condition occurs
+ for (reverse 1..10) {
+ print $_, "\n";
+ sleep 1;
+ }
+ }
+ # locking
+ if (!$RUN_DEGRADED && !$self->{LOCKFH}) {
+ my $fh;
+ unless ($fh = FileHandle->new("+>>$lockfile")) {
+ if ($! =~ /Permission/) {
+ $CPAN::Frontend->mywarn(qq{
+
+Your configuration suggests that CPAN.pm should use a working
+directory of
+ $CPAN::Config->{cpan_home}
+Unfortunately we could not create the lock file
+ $lockfile
+due to permission problems.
+
+Please make sure that the configuration variable
+ \$CPAN::Config->{cpan_home}
+points to a directory where you can write a .lock file. You can set
+this variable in either a CPAN/MyConfig.pm or a CPAN/Config.pm in your
+\@INC path;
+});
+ return suggest_myconfig;
+ }
+ }
+ my $sleep = 1;
+ while (!CPAN::_flock($fh, LOCK_EX|LOCK_NB)) {
+ if ($sleep>10) {
+ $CPAN::Frontend->mydie("Giving up\n");
+ }
+ $CPAN::Frontend->mysleep($sleep++);
+ $CPAN::Frontend->mywarn("Could not lock lockfile with flock: $!; retrying\n");
+ }
+
+ seek $fh, 0, 0;
+ truncate $fh, 0;
+ $fh->autoflush(1);
+ $fh->print($$, "\n");
+ $fh->print(hostname(), "\n");
+ $self->{LOCK} = $lockfile;
+ $self->{LOCKFH} = $fh;
+ }
+ $SIG{TERM} = sub {
+ my $sig = shift;
+ &cleanup;
+ $CPAN::Frontend->mydie("Got SIG$sig, leaving");
+ };
+ $SIG{INT} = sub {
+ # no blocks!!!
+ my $sig = shift;
+ &cleanup if $Signal;
+ die "Got yet another signal" if $Signal > 1;
+ $CPAN::Frontend->mydie("Got another SIG$sig") if $Signal;
+ $CPAN::Frontend->mywarn("Caught SIG$sig, trying to continue\n");
+ $Signal++;
+ };
+
+# From: Larry Wall <larry@wall.org>
+# Subject: Re: deprecating SIGDIE
+# To: perl5-porters@perl.org
+# Date: Thu, 30 Sep 1999 14:58:40 -0700 (PDT)
+#
+# The original intent of __DIE__ was only to allow you to substitute one
+# kind of death for another on an application-wide basis without respect
+# to whether you were in an eval or not. As a global backstop, it should
+# not be used any more lightly (or any more heavily :-) than class
+# UNIVERSAL. Any attempt to build a general exception model on it should
+# be politely squashed. Any bug that causes every eval {} to have to be
+# modified should be not so politely squashed.
+#
+# Those are my current opinions. It is also my optinion that polite
+# arguments degenerate to personal arguments far too frequently, and that
+# when they do, it's because both people wanted it to, or at least didn't
+# sufficiently want it not to.
+#
+# Larry
+
+ # global backstop to cleanup if we should really die
+ $SIG{__DIE__} = \&cleanup;
+ $self->debug("Signal handler set.") if $CPAN::DEBUG;
+}
+
+#-> sub CPAN::DESTROY ;
+sub DESTROY {
+ &cleanup; # need an eval?
+}
+
+#-> sub CPAN::anycwd ;
+sub anycwd () {
+ my $getcwd;
+ $getcwd = $CPAN::Config->{'getcwd'} || 'cwd';
+ CPAN->$getcwd();
+}
+
+#-> sub CPAN::cwd ;
+sub cwd {Cwd::cwd();}
+
+#-> sub CPAN::getcwd ;
+sub getcwd {Cwd::getcwd();}
+
+#-> sub CPAN::fastcwd ;
+sub fastcwd {Cwd::fastcwd();}
+
+#-> sub CPAN::backtickcwd ;
+sub backtickcwd {my $cwd = `cwd`; chomp $cwd; $cwd}
+
+#-> sub CPAN::find_perl ;
+sub find_perl () {
+ my($perl) = File::Spec->file_name_is_absolute($^X) ? $^X : "";
+ unless ($perl) {
+ my $candidate = File::Spec->catfile($CPAN::iCwd,$^X);
+ $^X = $perl = $candidate if MM->maybe_command($candidate);
+ }
+ unless ($perl) {
+ my ($component,$perl_name);
+ DIST_PERLNAME: foreach $perl_name ($^X, 'perl', 'perl5', "perl$]") {
+ PATH_COMPONENT: foreach $component (File::Spec->path(),
+ $Config::Config{'binexp'}) {
+ next unless defined($component) && $component;
+ my($abs) = File::Spec->catfile($component,$perl_name);
+ if (MM->maybe_command($abs)) {
+ $^X = $perl = $abs;
+ last DIST_PERLNAME;
+ }
+ }
+ }
+ }
+ return $perl;
+}
+
+
+#-> sub CPAN::exists ;
+sub exists {
+ my($mgr,$class,$id) = @_;
+ CPAN::HandleConfig->load unless $CPAN::Config_loaded++;
+ CPAN::Index->reload;
+ ### Carp::croak "exists called without class argument" unless $class;
+ $id ||= "";
+ $id =~ s/:+/::/g if $class eq "CPAN::Module";
+ my $exists;
+ if (CPAN::_sqlite_running) {
+ $exists = (exists $META->{readonly}{$class}{$id} or
+ $CPAN::SQLite->set($class, $id));
+ } else {
+ $exists = exists $META->{readonly}{$class}{$id};
+ }
+ $exists ||= exists $META->{readwrite}{$class}{$id}; # unsafe meta access, ok
+}
+
+#-> sub CPAN::delete ;
+sub delete {
+ my($mgr,$class,$id) = @_;
+ delete $META->{readonly}{$class}{$id}; # unsafe meta access, ok
+ delete $META->{readwrite}{$class}{$id}; # unsafe meta access, ok
+}
+
+#-> sub CPAN::has_usable
+# has_inst is sometimes too optimistic, we should replace it with this
+# has_usable whenever a case is given
+sub has_usable {
+ my($self,$mod,$message) = @_;
+ return 1 if $HAS_USABLE->{$mod};
+ my $has_inst = $self->has_inst($mod,$message);
+ return unless $has_inst;
+ my $usable;
+ $usable = {
+
+ #
+ # these subroutines die if they believe the installed version is unusable;
+ #
+
+ LWP => [ # we frequently had "Can't locate object
+ # method "new" via package "LWP::UserAgent" at
+ # (eval 69) line 2006
+ sub {require LWP},
+ sub {require LWP::UserAgent},
+ sub {require HTTP::Request},
+ sub {require URI::URL;
+ unless (CPAN::Version->vge(URI::URL::->VERSION,0.08)) {
+ for ("Will not use URI::URL, need 0.08\n") {
+ $CPAN::Frontend->mywarn($_);
+ die $_;
+ }
+ }
+ },
+ ],
+ 'Net::FTP' => [
+ sub {require Net::FTP},
+ sub {require Net::Config},
+ ],
+ 'File::HomeDir' => [
+ sub {require File::HomeDir;
+ unless (CPAN::Version->vge(File::HomeDir::->VERSION, 0.52)) {
+ for ("Will not use File::HomeDir, need 0.52\n") {
+ $CPAN::Frontend->mywarn($_);
+ die $_;
+ }
+ }
+ },
+ ],
+ 'Archive::Tar' => [
+ sub {require Archive::Tar;
+ my $demand = "1.50";
+ unless (CPAN::Version->vge(Archive::Tar::->VERSION, $demand)) {
+ my $atv = Archive::Tar->VERSION;
+ for ("You have Archive::Tar $atv, but $demand or later is recommended. Please upgrade.\n") {
+ $CPAN::Frontend->mywarn($_);
+ # don't die, because we may need
+ # Archive::Tar to upgrade
+ }
+
+ }
+ },
+ ],
+ 'File::Temp' => [
+ # XXX we should probably delete from
+ # %INC too so we can load after we
+ # installed a new enough version --
+ # I'm not sure.
+ sub {require File::Temp;
+ unless (CPAN::Version->vge(File::Temp::->VERSION,0.16)) {
+ for ("Will not use File::Temp, need 0.16\n") {
+ $CPAN::Frontend->mywarn($_);
+ die $_;
+ }
+ }
+ },
+ ]
+ };
+ if ($usable->{$mod}) {
+ for my $c (0..$#{$usable->{$mod}}) {
+ my $code = $usable->{$mod}[$c];
+ my $ret = eval { &$code() };
+ $ret = "" unless defined $ret;
+ if ($@) {
+ # warn "DEBUG: c[$c]\$\@[$@]ret[$ret]";
+ return;
+ }
+ }
+ }
+ return $HAS_USABLE->{$mod} = 1;
+}
+
+#-> sub CPAN::has_inst
+sub has_inst {
+ my($self,$mod,$message) = @_;
+ Carp::croak("CPAN->has_inst() called without an argument")
+ unless defined $mod;
+ my %dont = map { $_ => 1 } keys %{$CPAN::META->{dontload_hash}||{}},
+ keys %{$CPAN::Config->{dontload_hash}||{}},
+ @{$CPAN::Config->{dontload_list}||[]};
+ if (defined $message && $message eq "no" # afair only used by Nox
+ ||
+ $dont{$mod}
+ ) {
+ $CPAN::META->{dontload_hash}{$mod}||=1; # unsafe meta access, ok
+ return 0;
+ }
+ my $file = $mod;
+ my $obj;
+ $file =~ s|::|/|g;
+ $file .= ".pm";
+ if ($INC{$file}) {
+ # checking %INC is wrong, because $INC{LWP} may be true
+ # although $INC{"URI/URL.pm"} may have failed. But as
+ # I really want to say "bla loaded OK", I have to somehow
+ # cache results.
+ ### warn "$file in %INC"; #debug
+ return 1;
+ } elsif (eval { require $file }) {
+ # eval is good: if we haven't yet read the database it's
+ # perfect and if we have installed the module in the meantime,
+ # it tries again. The second require is only a NOOP returning
+ # 1 if we had success, otherwise it's retrying
+
+ my $mtime = (stat $INC{$file})[9];
+ # privileged files loaded by has_inst; Note: we use $mtime
+ # as a proxy for a checksum.
+ $CPAN::Shell::reload->{$file} = $mtime;
+ my $v = eval "\$$mod\::VERSION";
+ $v = $v ? " (v$v)" : "";
+ CPAN::Shell->optprint("load_module","CPAN: $mod loaded ok$v\n");
+ if ($mod eq "CPAN::WAIT") {
+ push @CPAN::Shell::ISA, 'CPAN::WAIT';
+ }
+ return 1;
+ } elsif ($mod eq "Net::FTP") {
+ $CPAN::Frontend->mywarn(qq{
+ Please, install Net::FTP as soon as possible. CPAN.pm installs it for you
+ if you just type
+ install Bundle::libnet
+
+}) unless $Have_warned->{"Net::FTP"}++;
+ $CPAN::Frontend->mysleep(3);
+ } elsif ($mod eq "Digest::SHA") {
+ if ($Have_warned->{"Digest::SHA"}++) {
+ $CPAN::Frontend->mywarn(qq{CPAN: checksum security checks disabled }.
+ qq{because Digest::SHA not installed.\n});
+ } else {
+ $CPAN::Frontend->mywarn(qq{
+ CPAN: checksum security checks disabled because Digest::SHA not installed.
+ Please consider installing the Digest::SHA module.
+
+});
+ $CPAN::Frontend->mysleep(2);
+ }
+ } elsif ($mod eq "Module::Signature") {
+ # NOT prefs_lookup, we are not a distro
+ my $check_sigs = $CPAN::Config->{check_sigs};
+ if (not $check_sigs) {
+ # they do not want us:-(
+ } elsif (not $Have_warned->{"Module::Signature"}++) {
+ # No point in complaining unless the user can
+ # reasonably install and use it.
+ if (eval { require Crypt::OpenPGP; 1 } ||
+ (
+ defined $CPAN::Config->{'gpg'}
+ &&
+ $CPAN::Config->{'gpg'} =~ /\S/
+ )
+ ) {
+ $CPAN::Frontend->mywarn(qq{
+ CPAN: Module::Signature security checks disabled because Module::Signature
+ not installed. Please consider installing the Module::Signature module.
+ You may also need to be able to connect over the Internet to the public
+ keyservers like pgp.mit.edu (port 11371).
+
+});
+ $CPAN::Frontend->mysleep(2);
+ }
+ }
+ } else {
+ delete $INC{$file}; # if it inc'd LWP but failed during, say, URI
+ }
+ return 0;
+}
+
+#-> sub CPAN::instance ;
+sub instance {
+ my($mgr,$class,$id) = @_;
+ CPAN::Index->reload;
+ $id ||= "";
+ # unsafe meta access, ok?
+ return $META->{readwrite}{$class}{$id} if exists $META->{readwrite}{$class}{$id};
+ $META->{readwrite}{$class}{$id} ||= $class->new(ID => $id);
+}
+
+#-> sub CPAN::new ;
+sub new {
+ bless {}, shift;
+}
+
+#-> sub CPAN::cleanup ;
+sub cleanup {
+ # warn "cleanup called with arg[@_] End[$CPAN::End] Signal[$Signal]";
+ local $SIG{__DIE__} = '';
+ my($message) = @_;
+ my $i = 0;
+ my $ineval = 0;
+ my($subroutine);
+ while ((undef,undef,undef,$subroutine) = caller(++$i)) {
+ $ineval = 1, last if
+ $subroutine eq '(eval)';
+ }
+ return if $ineval && !$CPAN::End;
+ return unless defined $META->{LOCK};
+ return unless -f $META->{LOCK};
+ $META->savehist;
+ close $META->{LOCKFH};
+ unlink $META->{LOCK};
+ # require Carp;
+ # Carp::cluck("DEBUGGING");
+ if ( $CPAN::CONFIG_DIRTY ) {
+ $CPAN::Frontend->mywarn("Warning: Configuration not saved.\n");
+ }
+ $CPAN::Frontend->myprint("Lockfile removed.\n");
+}
+
+#-> sub CPAN::readhist
+sub readhist {
+ my($self,$term,$histfile) = @_;
+ my $histsize = $CPAN::Config->{'histsize'} || 100;
+ $term->Attribs->{'MaxHistorySize'} = $histsize if (defined($term->Attribs->{'MaxHistorySize'}));
+ my($fh) = FileHandle->new;
+ open $fh, "<$histfile" or return;
+ local $/ = "\n";
+ while (<$fh>) {
+ chomp;
+ $term->AddHistory($_);
+ }
+ close $fh;
+}
+
+#-> sub CPAN::savehist
+sub savehist {
+ my($self) = @_;
+ my($histfile,$histsize);
+ unless ($histfile = $CPAN::Config->{'histfile'}) {
+ $CPAN::Frontend->mywarn("No history written (no histfile specified).\n");
+ return;
+ }
+ $histsize = $CPAN::Config->{'histsize'} || 100;
+ if ($CPAN::term) {
+ unless ($CPAN::term->can("GetHistory")) {
+ $CPAN::Frontend->mywarn("Terminal does not support GetHistory.\n");
+ return;
+ }
+ } else {
+ return;
+ }
+ my @h = $CPAN::term->GetHistory;
+ splice @h, 0, @h-$histsize if @h>$histsize;
+ my($fh) = FileHandle->new;
+ open $fh, ">$histfile" or $CPAN::Frontend->mydie("Couldn't open >$histfile: $!");
+ local $\ = local $, = "\n";
+ print $fh @h;
+ close $fh;
+}
+
+#-> sub CPAN::is_tested
+sub is_tested {
+ my($self,$what,$when) = @_;
+ unless ($what) {
+ Carp::cluck("DEBUG: empty what");
+ return;
+ }
+ $self->{is_tested}{$what} = $when;
+}
+
+#-> sub CPAN::reset_tested
+# forget all distributions tested -- resets what gets included in PERL5LIB
+sub reset_tested {
+ my ($self) = @_;
+ $self->{is_tested} = {};
+}
+
+#-> sub CPAN::is_installed
+# unsets the is_tested flag: as soon as the thing is installed, it is
+# not needed in set_perl5lib anymore
+sub is_installed {
+ my($self,$what) = @_;
+ delete $self->{is_tested}{$what};
+}
+
+sub _list_sorted_descending_is_tested {
+ my($self) = @_;
+ sort
+ { ($self->{is_tested}{$b}||0) <=> ($self->{is_tested}{$a}||0) }
+ keys %{$self->{is_tested}}
+}
+
+#-> sub CPAN::set_perl5lib
+# Notes on max environment variable length:
+# - Win32 : XP or later, 8191; Win2000 or NT4, 2047
+{
+my $fh;
+sub set_perl5lib {
+ my($self,$for) = @_;
+ unless ($for) {
+ (undef,undef,undef,$for) = caller(1);
+ $for =~ s/.*://;
+ }
+ $self->{is_tested} ||= {};
+ return unless %{$self->{is_tested}};
+ my $env = $ENV{PERL5LIB};
+ $env = $ENV{PERLLIB} unless defined $env;
+ my @env;
+ push @env, split /\Q$Config::Config{path_sep}\E/, $env if defined $env and length $env;
+ #my @dirs = map {("$_/blib/arch", "$_/blib/lib")} keys %{$self->{is_tested}};
+ #$CPAN::Frontend->myprint("Prepending @dirs to PERL5LIB.\n");
+
+ my @dirs = map {("$_/blib/arch", "$_/blib/lib")} $self->_list_sorted_descending_is_tested;
+ return if !@dirs;
+
+ if (@dirs < 12) {
+ $CPAN::Frontend->optprint('perl5lib', "Prepending @dirs to PERL5LIB for '$for'\n");
+ $ENV{PERL5LIB} = join $Config::Config{path_sep}, @dirs, @env;
+ } elsif (@dirs < 24 ) {
+ my @d = map {my $cp = $_;
+ $cp =~ s/^\Q$CPAN::Config->{build_dir}\E/%BUILDDIR%/;
+ $cp
+ } @dirs;
+ $CPAN::Frontend->optprint('perl5lib', "Prepending @d to PERL5LIB; ".
+ "%BUILDDIR%=$CPAN::Config->{build_dir} ".
+ "for '$for'\n"
+ );
+ $ENV{PERL5LIB} = join $Config::Config{path_sep}, @dirs, @env;
+ } else {
+ my $cnt = keys %{$self->{is_tested}};
+ $CPAN::Frontend->optprint('perl5lib', "Prepending blib/arch and blib/lib of ".
+ "$cnt build dirs to PERL5LIB; ".
+ "for '$for'\n"
+ );
+ $ENV{PERL5LIB} = join $Config::Config{path_sep}, @dirs, @env;
+ }
+}}
+
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+CPAN - query, download and build perl modules from CPAN sites
+
+=head1 SYNOPSIS
+
+Interactive mode:
+
+ perl -MCPAN -e shell
+
+--or--
+
+ cpan
+
+Basic commands:
+
+ # Modules:
+
+ cpan> install Acme::Meta # in the shell
+
+ CPAN::Shell->install("Acme::Meta"); # in perl
+
+ # Distributions:
+
+ cpan> install NWCLARK/Acme-Meta-0.02.tar.gz # in the shell
+
+ CPAN::Shell->
+ install("NWCLARK/Acme-Meta-0.02.tar.gz"); # in perl
+
+ # module objects:
+
+ $mo = CPAN::Shell->expandany($mod);
+ $mo = CPAN::Shell->expand("Module",$mod); # same thing
+
+ # distribution objects:
+
+ $do = CPAN::Shell->expand("Module",$mod)->distribution;
+ $do = CPAN::Shell->expandany($distro); # same thing
+ $do = CPAN::Shell->expand("Distribution",
+ $distro); # same thing
+
+=head1 DESCRIPTION
+
+The CPAN module automates or at least simplifies the make and install
+of perl modules and extensions. It includes some primitive searching
+capabilities and knows how to use Net::FTP, LWP, and certain external
+download clients to fetch distributions from the net.
+
+These are fetched from one or more mirrored CPAN (Comprehensive
+Perl Archive Network) sites and unpacked in a dedicated directory.
+
+The CPAN module also supports named and versioned
+I<bundles> of modules. Bundles simplify handling of sets of
+related modules. See Bundles below.
+
+The package contains a session manager and a cache manager. The
+session manager keeps track of what has been fetched, built, and
+installed in the current session. The cache manager keeps track of the
+disk space occupied by the make processes and deletes excess space
+using a simple FIFO mechanism.
+
+All methods provided are accessible in a programmer style and in an
+interactive shell style.
+
+=head2 CPAN::shell([$prompt, $command]) Starting Interactive Mode
+
+Enter interactive mode by running
+
+ perl -MCPAN -e shell
+
+or
+
+ cpan
+
+which puts you into a readline interface. If C<Term::ReadKey> and
+either of C<Term::ReadLine::Perl> or C<Term::ReadLine::Gnu> are installed,
+history and command completion are supported.
+
+Once at the command line, type C<h> for one-page help
+screen; the rest should be self-explanatory.
+
+The function call C<shell> takes two optional arguments: one the
+prompt, the second the default initial command line (the latter
+only works if a real ReadLine interface module is installed).
+
+The most common uses of the interactive modes are
+
+=over 2
+
+=item Searching for authors, bundles, distribution files and modules
+
+There are corresponding one-letter commands C<a>, C<b>, C<d>, and C<m>
+for each of the four categories and another, C<i> for any of the
+mentioned four. Each of the four entities is implemented as a class
+with slightly differing methods for displaying an object.
+
+Arguments to these commands are either strings exactly matching
+the identification string of an object, or regular expressions
+matched case-insensitively against various attributes of the
+objects. The parser only recognizes a regular expression when you
+enclose it with slashes.
+
+The principle is that the number of objects found influences how an
+item is displayed. If the search finds one item, the result is
+displayed with the rather verbose method C<as_string>, but if
+more than one is found, each object is displayed with the terse method
+C<as_glimpse>.
+
+Examples:
+
+ cpan> m Acme::MetaSyntactic
+ Module id = Acme::MetaSyntactic
+ CPAN_USERID BOOK (Philippe Bruhat (BooK) <[...]>)
+ CPAN_VERSION 0.99
+ CPAN_FILE B/BO/BOOK/Acme-MetaSyntactic-0.99.tar.gz
+ UPLOAD_DATE 2006-11-06
+ MANPAGE Acme::MetaSyntactic - Themed metasyntactic variables names
+ INST_FILE /usr/local/lib/perl/5.10.0/Acme/MetaSyntactic.pm
+ INST_VERSION 0.99
+ cpan> a BOOK
+ Author id = BOOK
+ EMAIL [...]
+ FULLNAME Philippe Bruhat (BooK)
+ cpan> d BOOK/Acme-MetaSyntactic-0.99.tar.gz
+ Distribution id = B/BO/BOOK/Acme-MetaSyntactic-0.99.tar.gz
+ CPAN_USERID BOOK (Philippe Bruhat (BooK) <[...]>)
+ CONTAINSMODS Acme::MetaSyntactic Acme::MetaSyntactic::Alias [...]
+ UPLOAD_DATE 2006-11-06
+ cpan> m /lorem/
+ Module = Acme::MetaSyntactic::loremipsum (BOOK/Acme-MetaSyntactic-0.99.tar.gz)
+ Module Text::Lorem (ADEOLA/Text-Lorem-0.3.tar.gz)
+ Module Text::Lorem::More (RKRIMEN/Text-Lorem-More-0.12.tar.gz)
+ Module Text::Lorem::More::Source (RKRIMEN/Text-Lorem-More-0.12.tar.gz)
+ cpan> i /berlin/
+ Distribution BEATNIK/Filter-NumberLines-0.02.tar.gz
+ Module = DateTime::TimeZone::Europe::Berlin (DROLSKY/DateTime-TimeZone-0.7904.tar.gz)
+ Module Filter::NumberLines (BEATNIK/Filter-NumberLines-0.02.tar.gz)
+ Author [...]
+
+The examples illustrate several aspects: the first three queries
+target modules, authors, or distros directly and yield exactly one
+result. The last two use regular expressions and yield several
+results. The last one targets all of bundles, modules, authors, and
+distros simultaneously. When more than one result is available, they
+are printed in one-line format.
+
+=item C<get>, C<make>, C<test>, C<install>, C<clean> modules or distributions
+
+These commands take any number of arguments and investigate what is
+necessary to perform the action. Argument processing is as follows:
+
+ known module name in format Foo/Bar.pm module
+ other embedded slash distribution
+ - with trailing slash dot directory
+ enclosing slashes regexp
+ known module name in format Foo::Bar module
+
+If the argument is a distribution file name (recognized by embedded
+slashes), it is processed. If it is a module, CPAN determines the
+distribution file in which this module is included and processes that,
+following any dependencies named in the module's META.yml or
+Makefile.PL (this behavior is controlled by the configuration
+parameter C<prerequisites_policy>). If an argument is enclosed in
+slashes it is treated as a regular expression: it is expanded and if
+the result is a single object (distribution, bundle or module), this
+object is processed.
+
+Example:
+
+ install Dummy::Perl # installs the module
+ install AUXXX/Dummy-Perl-3.14.tar.gz # installs that distribution
+ install /Dummy-Perl-3.14/ # same if the regexp is unambiguous
+
+C<get> downloads a distribution file and untars or unzips it, C<make>
+builds it, C<test> runs the test suite, and C<install> installs it.
+
+Any C<make> or C<test> is run unconditionally. An
+
+ install <distribution_file>
+
+is also run unconditionally. But for
+
+ install <module>
+
+CPAN checks whether an install is needed and prints
+I<module up to date> if the distribution file containing
+the module doesn't need updating.
+
+CPAN also keeps track of what it has done within the current session
+and doesn't try to build a package a second time regardless of whether it
+succeeded or not. It does not repeat a test run if the test
+has been run successfully before. Same for install runs.
+
+The C<force> pragma may precede another command (currently: C<get>,
+C<make>, C<test>, or C<install>) to execute the command from scratch
+and attempt to continue past certain errors. See the section below on
+the C<force> and the C<fforce> pragma.
+
+The C<notest> pragma skips the test part in the build
+process.
+
+Example:
+
+ cpan> notest install Tk
+
+A C<clean> command results in a
+
+ make clean
+
+being executed within the distribution file's working directory.
+
+=item C<readme>, C<perldoc>, C<look> module or distribution
+
+C<readme> displays the README file of the associated distribution.
+C<Look> gets and untars (if not yet done) the distribution file,
+changes to the appropriate directory and opens a subshell process in
+that directory. C<perldoc> displays the module's pod documentation
+in html or plain text format.
+
+=item C<ls> author
+
+=item C<ls> globbing_expression
+
+The first form lists all distribution files in and below an author's
+CPAN directory as stored in the CHECKUMS files distributed on
+CPAN. The listing recurses into subdirectories.
+
+The second form limits or expands the output with shell
+globbing as in the following examples:
+
+ ls JV/make*
+ ls GSAR/*make*
+ ls */*make*
+
+The last example is very slow and outputs extra progress indicators
+that break the alignment of the result.
+
+Note that globbing only lists directories explicitly asked for, for
+example FOO/* will not list FOO/bar/Acme-Sthg-n.nn.tar.gz. This may be
+regarded as a bug that may be changed in some future version.
+
+=item C<failed>
+
+The C<failed> command reports all distributions that failed on one of
+C<make>, C<test> or C<install> for some reason in the currently
+running shell session.
+
+=item Persistence between sessions
+
+If the C<YAML> or the C<YAML::Syck> module is installed a record of
+the internal state of all modules is written to disk after each step.
+The files contain a signature of the currently running perl version
+for later perusal.
+
+If the configurations variable C<build_dir_reuse> is set to a true
+value, then CPAN.pm reads the collected YAML files. If the stored
+signature matches the currently running perl, the stored state is
+loaded into memory such that persistence between sessions
+is effectively established.
+
+=item The C<force> and the C<fforce> pragma
+
+To speed things up in complex installation scenarios, CPAN.pm keeps
+track of what it has already done and refuses to do some things a
+second time. A C<get>, a C<make>, and an C<install> are not repeated.
+A C<test> is repeated only if the previous test was unsuccessful. The
+diagnostic message when CPAN.pm refuses to do something a second time
+is one of I<Has already been >C<unwrapped|made|tested successfully> or
+something similar. Another situation where CPAN refuses to act is an
+C<install> if the corresponding C<test> was not successful.
+
+In all these cases, the user can override this stubborn behaviour by
+prepending the command with the word force, for example:
+
+ cpan> force get Foo
+ cpan> force make AUTHOR/Bar-3.14.tar.gz
+ cpan> force test Baz
+ cpan> force install Acme::Meta
+
+Each I<forced> command is executed with the corresponding part of its
+memory erased.
+
+The C<fforce> pragma is a variant that emulates a C<force get> which
+erases the entire memory followed by the action specified, effectively
+restarting the whole get/make/test/install procedure from scratch.
+
+=item Lockfile
+
+Interactive sessions maintain a lockfile, by default C<~/.cpan/.lock>.
+Batch jobs can run without a lockfile and not disturb each other.
+
+The shell offers to run in I<downgraded mode> when another process is
+holding the lockfile. This is an experimental feature that is not yet
+tested very well. This second shell then does not write the history
+file, does not use the metadata file, and has a different prompt.
+
+=item Signals
+
+CPAN.pm installs signal handlers for SIGINT and SIGTERM. While you are
+in the cpan-shell, it is intended that you can press C<^C> anytime and
+return to the cpan-shell prompt. A SIGTERM will cause the cpan-shell
+to clean up and leave the shell loop. You can emulate the effect of a
+SIGTERM by sending two consecutive SIGINTs, which usually means by
+pressing C<^C> twice.
+
+CPAN.pm ignores SIGPIPE. If the user sets C<inactivity_timeout>, a
+SIGALRM is used during the run of the C<perl Makefile.PL> or C<perl
+Build.PL> subprocess. A SIGALRM is also used during module version
+parsing, and is controlled by C<version_timeout>.
+
+=back
+
+=head2 CPAN::Shell
+
+The commands available in the shell interface are methods in
+the package CPAN::Shell. If you enter the shell command, your
+input is split by the Text::ParseWords::shellwords() routine, which
+acts like most shells do. The first word is interpreted as the
+method to be invoked, and the rest of the words are treated as the method's arguments.
+Continuation lines are supported by ending a line with a
+literal backslash.
+
+=head2 autobundle
+
+C<autobundle> writes a bundle file into the
+C<$CPAN::Config-E<gt>{cpan_home}/Bundle> directory. The file contains
+a list of all modules that are both available from CPAN and currently
+installed within @INC. The name of the bundle file is based on the
+current date and a counter.
+
+=head2 hosts
+
+Note: this feature is still in alpha state and may change in future
+versions of CPAN.pm
+
+This commands provides a statistical overview over recent download
+activities. The data for this is collected in the YAML file
+C<FTPstats.yml> in your C<cpan_home> directory. If no YAML module is
+configured or YAML not installed, no stats are provided.
+
+=head2 mkmyconfig
+
+mkmyconfig() writes your own CPAN::MyConfig file into your C<~/.cpan/>
+directory so that you can save your own preferences instead of the
+system-wide ones.
+
+=head2 recent ***EXPERIMENTAL COMMAND***
+
+The C<recent> command downloads a list of recent uploads to CPAN and
+displays them I<slowly>. While the command is running, a $SIG{INT}
+exits the loop after displaying the current item.
+
+B<Note>: This command requires XML::LibXML installed.
+
+B<Note>: This whole command currently is just a hack and will
+probably change in future versions of CPAN.pm, but the general
+approach will likely remain.
+
+B<Note>: See also L<smoke>
+
+=head2 recompile
+
+recompile() is a special command that takes no argument and
+runs the make/test/install cycle with brute force over all installed
+dynamically loadable extensions (aka XS modules) with 'force' in
+effect. The primary purpose of this command is to finish a network
+installation. Imagine you have a common source tree for two different
+architectures. You decide to do a completely independent fresh
+installation. You start on one architecture with the help of a Bundle
+file produced earlier. CPAN installs the whole Bundle for you, but
+when you try to repeat the job on the second architecture, CPAN
+responds with a C<"Foo up to date"> message for all modules. So you
+invoke CPAN's recompile on the second architecture and you're done.
+
+Another popular use for C<recompile> is to act as a rescue in case your
+perl breaks binary compatibility. If one of the modules that CPAN uses
+is in turn depending on binary compatibility (so you cannot run CPAN
+commands), then you should try the CPAN::Nox module for recovery.
+
+=head2 report Bundle|Distribution|Module
+
+The C<report> command temporarily turns on the C<test_report> config
+variable, then runs the C<force test> command with the given
+arguments. The C<force> pragma reruns the tests and repeats
+every step that might have failed before.
+
+=head2 smoke ***EXPERIMENTAL COMMAND***
+
+B<*** WARNING: this command downloads and executes software from CPAN to
+your computer of completely unknown status. You should never do
+this with your normal account and better have a dedicated well
+separated and secured machine to do this. ***>
+
+The C<smoke> command takes the list of recent uploads to CPAN as
+provided by the C<recent> command and tests them all. While the
+command is running $SIG{INT} is defined to mean that the current item
+shall be skipped.
+
+B<Note>: This whole command currently is just a hack and will
+probably change in future versions of CPAN.pm, but the general
+approach will likely remain.
+
+B<Note>: See also L<recent>
+
+=head2 upgrade [Module|/Regex/]...
+
+The C<upgrade> command first runs an C<r> command with the given
+arguments and then installs the newest versions of all modules that
+were listed by that.
+
+=head2 The four C<CPAN::*> Classes: Author, Bundle, Module, Distribution
+
+Although it may be considered internal, the class hierarchy does matter
+for both users and programmer. CPAN.pm deals with the four
+classes mentioned above, and those classes all share a set of methods. Classical
+single polymorphism is in effect. A metaclass object registers all
+objects of all kinds and indexes them with a string. The strings
+referencing objects have a separated namespace (well, not completely
+separated):
+
+ Namespace Class
+
+ words containing a "/" (slash) Distribution
+ words starting with Bundle:: Bundle
+ everything else Module or Author
+
+Modules know their associated Distribution objects. They always refer
+to the most recent official release. Developers may mark their releases
+as unstable development versions (by inserting an underbar into the
+module version number which will also be reflected in the distribution
+name when you run 'make dist'), so the really hottest and newest
+distribution is not always the default. If a module Foo circulates
+on CPAN in both version 1.23 and 1.23_90, CPAN.pm offers a convenient
+way to install version 1.23 by saying
+
+ install Foo
+
+This would install the complete distribution file (say
+BAR/Foo-1.23.tar.gz) with all accompanying material. But if you would
+like to install version 1.23_90, you need to know where the
+distribution file resides on CPAN relative to the authors/id/
+directory. If the author is BAR, this might be BAR/Foo-1.23_90.tar.gz;
+so you would have to say
+
+ install BAR/Foo-1.23_90.tar.gz
+
+The first example will be driven by an object of the class
+CPAN::Module, the second by an object of class CPAN::Distribution.
+
+=head2 Integrating local directories
+
+Note: this feature is still in alpha state and may change in future
+versions of CPAN.pm
+
+Distribution objects are normally distributions from the CPAN, but
+there is a slightly degenerate case for Distribution objects, too, of
+projects held on the local disk. These distribution objects have the
+same name as the local directory and end with a dot. A dot by itself
+is also allowed for the current directory at the time CPAN.pm was
+used. All actions such as C<make>, C<test>, and C<install> are applied
+directly to that directory. This gives the command C<cpan .> an
+interesting touch: while the normal mantra of installing a CPAN module
+without CPAN.pm is one of
+
+ perl Makefile.PL perl Build.PL
+ ( go and get prerequisites )
+ make ./Build
+ make test ./Build test
+ make install ./Build install
+
+the command C<cpan .> does all of this at once. It figures out which
+of the two mantras is appropriate, fetches and installs all
+prerequisites, takes care of them recursively, and finally finishes the
+installation of the module in the current directory, be it a CPAN
+module or not.
+
+The typical usage case is for private modules or working copies of
+projects from remote repositories on the local disk.
+
+=head2 Redirection
+
+The usual shell redirection symbols C< | > and C<< > >> are recognized
+by the cpan shell B<only when surrounded by whitespace>. So piping to
+pager or redirecting output into a file works somewhat as in a normal
+shell, with the stipulation that you must type extra spaces.
+
+=head1 CONFIGURATION
+
+When the CPAN module is used for the first time, a configuration
+dialogue tries to determine a couple of site specific options. The
+result of the dialog is stored in a hash reference C< $CPAN::Config >
+in a file CPAN/Config.pm.
+
+Default values defined in the CPAN/Config.pm file can be
+overridden in a user specific file: CPAN/MyConfig.pm. Such a file is
+best placed in C<$HOME/.cpan/CPAN/MyConfig.pm>, because C<$HOME/.cpan> is
+added to the search path of the CPAN module before the use() or
+require() statements. The mkmyconfig command writes this file for you.
+
+The C<o conf> command has various bells and whistles:
+
+=over
+
+=item completion support
+
+If you have a ReadLine module installed, you can hit TAB at any point
+of the commandline and C<o conf> will offer you completion for the
+built-in subcommands and/or config variable names.
+
+=item displaying some help: o conf help
+
+Displays a short help
+
+=item displaying current values: o conf [KEY]
+
+Displays the current value(s) for this config variable. Without KEY,
+displays all subcommands and config variables.
+
+Example:
+
+ o conf shell
+
+If KEY starts and ends with a slash, the string in between is
+treated as a regular expression and only keys matching this regex
+are displayed
+
+Example:
+
+ o conf /color/
+
+=item changing of scalar values: o conf KEY VALUE
+
+Sets the config variable KEY to VALUE. The empty string can be
+specified as usual in shells, with C<''> or C<"">
+
+Example:
+
+ o conf wget /usr/bin/wget
+
+=item changing of list values: o conf KEY SHIFT|UNSHIFT|PUSH|POP|SPLICE|LIST
+
+If a config variable name ends with C<list>, it is a list. C<o conf
+KEY shift> removes the first element of the list, C<o conf KEY pop>
+removes the last element of the list. C<o conf KEYS unshift LIST>
+prepends a list of values to the list, C<o conf KEYS push LIST>
+appends a list of valued to the list.
+
+Likewise, C<o conf KEY splice LIST> passes the LIST to the corresponding
+splice command.
+
+Finally, any other list of arguments is taken as a new list value for
+the KEY variable discarding the previous value.
+
+Examples:
+
+ o conf urllist unshift http://cpan.dev.local/CPAN
+ o conf urllist splice 3 1
+ o conf urllist http://cpan1.local http://cpan2.local ftp://ftp.perl.org
+
+=item reverting to saved: o conf defaults
+
+Reverts all config variables to the state in the saved config file.
+
+=item saving the config: o conf commit
+
+Saves all config variables to the current config file (CPAN/Config.pm
+or CPAN/MyConfig.pm that was loaded at start).
+
+=back
+
+The configuration dialog can be started any time later again by
+issuing the command C< o conf init > in the CPAN shell. A subset of
+the configuration dialog can be run by issuing C<o conf init WORD>
+where WORD is any valid config variable or a regular expression.
+
+=head2 Config Variables
+
+The following keys in the hash reference $CPAN::Config are
+currently defined:
+
+ applypatch path to external prg
+ auto_commit commit all changes to config variables to disk
+ build_cache size of cache for directories to build modules
+ build_dir locally accessible directory to build modules
+ build_dir_reuse boolean if distros in build_dir are persistent
+ build_requires_install_policy
+ to install or not to install when a module is
+ only needed for building. yes|no|ask/yes|ask/no
+ bzip2 path to external prg
+ cache_metadata use serializer to cache metadata
+ check_sigs if signatures should be verified
+ colorize_debug Term::ANSIColor attributes for debugging output
+ colorize_output boolean if Term::ANSIColor should colorize output
+ colorize_print Term::ANSIColor attributes for normal output
+ colorize_warn Term::ANSIColor attributes for warnings
+ commandnumber_in_prompt
+ boolean if you want to see current command number
+ commands_quote preferred character to use for quoting external
+ commands when running them. Defaults to double
+ quote on Windows, single tick everywhere else;
+ can be set to space to disable quoting
+ connect_to_internet_ok
+ whether to ask if opening a connection is ok before
+ urllist is specified
+ cpan_home local directory reserved for this package
+ curl path to external prg
+ dontload_hash DEPRECATED
+ dontload_list arrayref: modules in the list will not be
+ loaded by the CPAN::has_inst() routine
+ ftp path to external prg
+ ftp_passive if set, the envariable FTP_PASSIVE is set for downloads
+ ftp_proxy proxy host for ftp requests
+ ftpstats_period max number of days to keep download statistics
+ ftpstats_size max number of items to keep in the download statistics
+ getcwd see below
+ gpg path to external prg
+ gzip location of external program gzip
+ halt_on_failure stop processing after the first failure of queued
+ items or dependencies
+ histfile file to maintain history between sessions
+ histsize maximum number of lines to keep in histfile
+ http_proxy proxy host for http requests
+ inactivity_timeout breaks interactive Makefile.PLs or Build.PLs
+ after this many seconds inactivity. Set to 0 to
+ disable timeouts.
+ index_expire refetch index files after this many days
+ inhibit_startup_message
+ if true, suppress the startup message
+ keep_source_where directory in which to keep the source (if we do)
+ load_module_verbosity
+ report loading of optional modules used by CPAN.pm
+ lynx path to external prg
+ make location of external make program
+ make_arg arguments that should always be passed to 'make'
+ make_install_make_command
+ the make command for running 'make install', for
+ example 'sudo make'
+ make_install_arg same as make_arg for 'make install'
+ makepl_arg arguments passed to 'perl Makefile.PL'
+ mbuild_arg arguments passed to './Build'
+ mbuild_install_arg arguments passed to './Build install'
+ mbuild_install_build_command
+ command to use instead of './Build' when we are
+ in the install stage, for example 'sudo ./Build'
+ mbuildpl_arg arguments passed to 'perl Build.PL'
+ ncftp path to external prg
+ ncftpget path to external prg
+ no_proxy don't proxy to these hosts/domains (comma separated list)
+ pager location of external program more (or any pager)
+ password your password if you CPAN server wants one
+ patch path to external prg
+ patches_dir local directory containing patch files
+ perl5lib_verbosity verbosity level for PERL5LIB additions
+ prefer_installer legal values are MB and EUMM: if a module comes
+ with both a Makefile.PL and a Build.PL, use the
+ former (EUMM) or the latter (MB); if the module
+ comes with only one of the two, that one will be
+ used no matter the setting
+ prerequisites_policy
+ what to do if you are missing module prerequisites
+ ('follow' automatically, 'ask' me, or 'ignore')
+ prefs_dir local directory to store per-distro build options
+ proxy_user username for accessing an authenticating proxy
+ proxy_pass password for accessing an authenticating proxy
+ randomize_urllist add some randomness to the sequence of the urllist
+ scan_cache controls scanning of cache ('atstart' or 'never')
+ shell your favorite shell
+ show_unparsable_versions
+ boolean if r command tells which modules are versionless
+ show_upload_date boolean if commands should try to determine upload date
+ show_zero_versions boolean if r command tells for which modules $version==0
+ tar location of external program tar
+ tar_verbosity verbosity level for the tar command
+ term_is_latin deprecated: if true Unicode is translated to ISO-8859-1
+ (and nonsense for characters outside latin range)
+ term_ornaments boolean to turn ReadLine ornamenting on/off
+ test_report email test reports (if CPAN::Reporter is installed)
+ trust_test_report_history
+ skip testing when previously tested ok (according to
+ CPAN::Reporter history)
+ unzip location of external program unzip
+ urllist arrayref to nearby CPAN sites (or equivalent locations)
+ use_sqlite use CPAN::SQLite for metadata storage (fast and lean)
+ username your username if you CPAN server wants one
+ version_timeout stops version parsing after this many seconds.
+ Default is 15 secs. Set to 0 to disable.
+ wait_list arrayref to a wait server to try (See CPAN::WAIT)
+ wget path to external prg
+ yaml_load_code enable YAML code deserialisation via CPAN::DeferredCode
+ yaml_module which module to use to read/write YAML files
+
+You can set and query each of these options interactively in the cpan
+shell with the C<o conf> or the C<o conf init> command as specified below.
+
+=over 2
+
+=item C<o conf E<lt>scalar optionE<gt>>
+
+prints the current value of the I<scalar option>
+
+=item C<o conf E<lt>scalar optionE<gt> E<lt>valueE<gt>>
+
+Sets the value of the I<scalar option> to I<value>
+
+=item C<o conf E<lt>list optionE<gt>>
+
+prints the current value of the I<list option> in MakeMaker's
+neatvalue format.
+
+=item C<o conf E<lt>list optionE<gt> [shift|pop]>
+
+shifts or pops the array in the I<list option> variable
+
+=item C<o conf E<lt>list optionE<gt> [unshift|push|splice] E<lt>listE<gt>>
+
+works like the corresponding perl commands.
+
+=item interactive editing: o conf init [MATCH|LIST]
+
+Runs an interactive configuration dialog for matching variables.
+Without argument runs the dialog over all supported config variables.
+To specify a MATCH the argument must be enclosed by slashes.
+
+Examples:
+
+ o conf init ftp_passive ftp_proxy
+ o conf init /color/
+
+Note: this method of setting config variables often provides more
+explanation about the functioning of a variable than the manpage.
+
+=back
+
+=head2 CPAN::anycwd($path): Note on config variable getcwd
+
+CPAN.pm changes the current working directory often and needs to
+determine its own current working directory. By default it uses
+Cwd::cwd, but if for some reason this doesn't work on your system,
+configure alternatives according to the following table:
+
+=over 4
+
+=item cwd
+
+Calls Cwd::cwd
+
+=item getcwd
+
+Calls Cwd::getcwd
+
+=item fastcwd
+
+Calls Cwd::fastcwd
+
+=item backtickcwd
+
+Calls the external command cwd.
+
+=back
+
+=head2 Note on the format of the urllist parameter
+
+urllist parameters are URLs according to RFC 1738. We do a little
+guessing if your URL is not compliant, but if you have problems with
+C<file> URLs, please try the correct format. Either:
+
+ file://localhost/whatever/ftp/pub/CPAN/
+
+or
+
+ file:///home/ftp/pub/CPAN/
+
+=head2 The urllist parameter has CD-ROM support
+
+The C<urllist> parameter of the configuration table contains a list of
+URLs used for downloading. If the list contains any
+C<file> URLs, CPAN always tries there first. This
+feature is disabled for index files. So the recommendation for the
+owner of a CD-ROM with CPAN contents is: include your local, possibly
+outdated CD-ROM as a C<file> URL at the end of urllist, e.g.
+
+ o conf urllist push file://localhost/CDROM/CPAN
+
+CPAN.pm will then fetch the index files from one of the CPAN sites
+that come at the beginning of urllist. It will later check for each
+module to see whether there is a local copy of the most recent version.
+
+Another peculiarity of urllist is that the site that we could
+successfully fetch the last file from automatically gets a preference
+token and is tried as the first site for the next request. So if you
+add a new site at runtime it may happen that the previously preferred
+site will be tried another time. This means that if you want to disallow
+a site for the next transfer, it must be explicitly removed from
+urllist.
+
+=head2 Maintaining the urllist parameter
+
+If you have YAML.pm (or some other YAML module configured in
+C<yaml_module>) installed, CPAN.pm collects a few statistical data
+about recent downloads. You can view the statistics with the C<hosts>
+command or inspect them directly by looking into the C<FTPstats.yml>
+file in your C<cpan_home> directory.
+
+To get some interesting statistics, it is recommended that
+C<randomize_urllist> be set; this introduces some amount of
+randomness into the URL selection.
+
+=head2 The C<requires> and C<build_requires> dependency declarations
+
+Since CPAN.pm version 1.88_51 modules declared as C<build_requires> by
+a distribution are treated differently depending on the config
+variable C<build_requires_install_policy>. By setting
+C<build_requires_install_policy> to C<no>, such a module is not
+installed. It is only built and tested, and then kept in the list of
+tested but uninstalled modules. As such, it is available during the
+build of the dependent module by integrating the path to the
+C<blib/arch> and C<blib/lib> directories in the environment variable
+PERL5LIB. If C<build_requires_install_policy> is set ti C<yes>, then
+both modules declared as C<requires> and those declared as
+C<build_requires> are treated alike. By setting to C<ask/yes> or
+C<ask/no>, CPAN.pm asks the user and sets the default accordingly.
+
+=head2 Configuration for individual distributions (I<Distroprefs>)
+
+(B<Note:> This feature has been introduced in CPAN.pm 1.8854 and is
+still considered beta quality)
+
+Distributions on CPAN usually behave according to what we call the
+CPAN mantra. Or since the advent of Module::Build we should talk about
+two mantras:
+
+ perl Makefile.PL perl Build.PL
+ make ./Build
+ make test ./Build test
+ make install ./Build install
+
+But some modules cannot be built with this mantra. They try to get
+some extra data from the user via the environment, extra arguments, or
+interactively--thus disturbing the installation of large bundles like
+Phalanx100 or modules with many dependencies like Plagger.
+
+The distroprefs system of C<CPAN.pm> addresses this problem by
+allowing the user to specify extra informations and recipes in YAML
+files to either
+
+=over
+
+=item
+
+pass additional arguments to one of the four commands,
+
+=item
+
+set environment variables
+
+=item
+
+instantiate an Expect object that reads from the console, waits for
+some regular expressions and enters some answers
+
+=item
+
+temporarily override assorted C<CPAN.pm> configuration variables
+
+=item
+
+specify dependencies the original maintainer forgot
+
+=item
+
+disable the installation of an object altogether
+
+=back
+
+See the YAML and Data::Dumper files that come with the C<CPAN.pm>
+distribution in the C<distroprefs/> directory for examples.
+
+=head2 Filenames
+
+The YAML files themselves must have the C<.yml> extension; all other
+files are ignored (for two exceptions see I<Fallback Data::Dumper and
+Storable> below). The containing directory can be specified in
+C<CPAN.pm> in the C<prefs_dir> config variable. Try C<o conf init
+prefs_dir> in the CPAN shell to set and activate the distroprefs
+system.
+
+Every YAML file may contain arbitrary documents according to the YAML
+specification, and every document is treated as an entity that
+can specify the treatment of a single distribution.
+
+Filenames can be picked arbitrarily; C<CPAN.pm> always reads
+all files (in alphabetical order) and takes the key C<match> (see
+below in I<Language Specs>) as a hashref containing match criteria
+that determine if the current distribution matches the YAML document
+or not.
+
+=head2 Fallback Data::Dumper and Storable
+
+If neither your configured C<yaml_module> nor YAML.pm is installed,
+CPAN.pm falls back to using Data::Dumper and Storable and looks for
+files with the extensions C<.dd> or C<.st> in the C<prefs_dir>
+directory. These files are expected to contain one or more hashrefs.
+For Data::Dumper generated files, this is expected to be done with by
+defining C<$VAR1>, C<$VAR2>, etc. The YAML shell would produce these
+with the command
+
+ ysh < somefile.yml > somefile.dd
+
+For Storable files the rule is that they must be constructed such that
+C<Storable::retrieve(file)> returns an array reference and the array
+elements represent one distropref object each. The conversion from
+YAML would look like so:
+
+ perl -MYAML=LoadFile -MStorable=nstore -e '
+ @y=LoadFile(shift);
+ nstore(\@y, shift)' somefile.yml somefile.st
+
+In bootstrapping situations it is usually sufficient to translate only
+a few YAML files to Data::Dumper for crucial modules like
+C<YAML::Syck>, C<YAML.pm> and C<Expect.pm>. If you prefer Storable
+over Data::Dumper, remember to pull out a Storable version that writes
+an older format than all the other Storable versions that will need to
+read them.
+
+=head2 Blueprint
+
+The following example contains all supported keywords and structures
+with the exception of C<eexpect> which can be used instead of
+C<expect>.
+
+ ---
+ comment: "Demo"
+ match:
+ module: "Dancing::Queen"
+ distribution: "^CHACHACHA/Dancing-"
+ not_distribution: "\.zip$"
+ perl: "/usr/local/cariba-perl/bin/perl"
+ perlconfig:
+ archname: "freebsd"
+ not_cc: "gcc"
+ env:
+ DANCING_FLOOR: "Shubiduh"
+ disabled: 1
+ cpanconfig:
+ make: gmake
+ pl:
+ args:
+ - "--somearg=specialcase"
+
+ env: {}
+
+ expect:
+ - "Which is your favorite fruit"
+ - "apple\n"
+
+ make:
+ args:
+ - all
+ - extra-all
+
+ env: {}
+
+ expect: []
+
+ commandline: "echo SKIPPING make"
+
+ test:
+ args: []
+
+ env: {}
+
+ expect: []
+
+ install:
+ args: []
+
+ env:
+ WANT_TO_INSTALL: YES
+
+ expect:
+ - "Do you really want to install"
+ - "y\n"
+
+ patches:
+ - "ABCDE/Fedcba-3.14-ABCDE-01.patch"
+
+ depends:
+ configure_requires:
+ LWP: 5.8
+ build_requires:
+ Test::Exception: 0.25
+ requires:
+ Spiffy: 0.30
+
+
+=head2 Language Specs
+
+Every YAML document represents a single hash reference. The valid keys
+in this hash are as follows:
+
+=over
+
+=item comment [scalar]
+
+A comment
+
+=item cpanconfig [hash]
+
+Temporarily override assorted C<CPAN.pm> configuration variables.
+
+Supported are: C<build_requires_install_policy>, C<check_sigs>,
+C<make>, C<make_install_make_command>, C<prefer_installer>,
+C<test_report>. Please report as a bug when you need another one
+supported.
+
+=item depends [hash] *** EXPERIMENTAL FEATURE ***
+
+All three types, namely C<configure_requires>, C<build_requires>, and
+C<requires> are supported in the way specified in the META.yml
+specification. The current implementation I<merges> the specified
+dependencies with those declared by the package maintainer. In a
+future implementation this may be changed to override the original
+declaration.
+
+=item disabled [boolean]
+
+Specifies that this distribution shall not be processed at all.
+
+=item features [array] *** EXPERIMENTAL FEATURE ***
+
+Experimental implementation to deal with optional_features from
+META.yml. Still needs coordination with installer software and
+currently works only for META.yml declaring C<dynamic_config=0>. Use
+with caution.
+
+=item goto [string]
+
+The canonical name of a delegate distribution to install
+instead. Useful when a new version, although it tests OK itself,
+breaks something else or a developer release or a fork is already
+uploaded that is better than the last released version.
+
+=item install [hash]
+
+Processing instructions for the C<make install> or C<./Build install>
+phase of the CPAN mantra. See below under I<Processing Instructions>.
+
+=item make [hash]
+
+Processing instructions for the C<make> or C<./Build> phase of the
+CPAN mantra. See below under I<Processing Instructions>.
+
+=item match [hash]
+
+A hashref with one or more of the keys C<distribution>, C<modules>,
+C<perl>, C<perlconfig>, and C<env> that specify whether a document is
+targeted at a specific CPAN distribution or installation.
+Keys prefixed with C<not_> negates the corresponding match.
+
+The corresponding values are interpreted as regular expressions. The
+C<distribution> related one will be matched against the canonical
+distribution name, e.g. "AUTHOR/Foo-Bar-3.14.tar.gz".
+
+The C<module> related one will be matched against I<all> modules
+contained in the distribution until one module matches.
+
+The C<perl> related one will be matched against C<$^X> (but with the
+absolute path).
+
+The value associated with C<perlconfig> is itself a hashref that is
+matched against corresponding values in the C<%Config::Config> hash
+living in the C<Config.pm> module.
+Keys prefixed with C<not_> negates the corresponding match.
+
+The value associated with C<env> is itself a hashref that is
+matched against corresponding values in the C<%ENV> hash.
+Keys prefixed with C<not_> negates the corresponding match.
+
+If more than one restriction of C<module>, C<distribution>, etc. is
+specified, the results of the separately computed match values must
+all match. If so, the hashref represented by the
+YAML document is returned as the preference structure for the current
+distribution.
+
+=item patches [array]
+
+An array of patches on CPAN or on the local disk to be applied in
+order via an external patch program. If the value for the C<-p>
+parameter is C<0> or C<1> is determined by reading the patch
+beforehand. The path to each patch is either an absolute path on the
+local filesystem or relative to a patch directory specified in the
+C<patches_dir> configuration variable or in the format of a canonical
+distroname. For examples please consult the distroprefs/ directory in
+the CPAN.pm distribution (these examples are not installed by
+default).
+
+Note: if the C<applypatch> program is installed and C<CPAN::Config>
+knows about it B<and> a patch is written by the C<makepatch> program,
+then C<CPAN.pm> lets C<applypatch> apply the patch. Both C<makepatch>
+and C<applypatch> are available from CPAN in the C<JV/makepatch-*>
+distribution.
+
+=item pl [hash]
+
+Processing instructions for the C<perl Makefile.PL> or C<perl
+Build.PL> phase of the CPAN mantra. See below under I<Processing
+Instructions>.
+
+=item test [hash]
+
+Processing instructions for the C<make test> or C<./Build test> phase
+of the CPAN mantra. See below under I<Processing Instructions>.
+
+=back
+
+=head2 Processing Instructions
+
+=over
+
+=item args [array]
+
+Arguments to be added to the command line
+
+=item commandline
+
+A full commandline to run via C<system()>.
+During execution, the environment variable PERL is set
+to $^X (but with an absolute path). If C<commandline> is specified,
+C<args> is not used.
+
+=item eexpect [hash]
+
+Extended C<expect>. This is a hash reference with four allowed keys,
+C<mode>, C<timeout>, C<reuse>, and C<talk>.
+
+You must install the C<Expect> module to use C<eexpect>. CPAN.pm
+does not install it for you.
+
+C<mode> may have the values C<deterministic> for the case where all
+questions come in the order written down and C<anyorder> for the case
+where the questions may come in any order. The default mode is
+C<deterministic>.
+
+C<timeout> denotes a timeout in seconds. Floating-point timeouts are
+OK. With C<mode=deterministic>, the timeout denotes the
+timeout per question; with C<mode=anyorder> it denotes the
+timeout per byte received from the stream or questions.
+
+C<talk> is a reference to an array that contains alternating questions
+and answers. Questions are regular expressions and answers are literal
+strings. The Expect module watches the stream from the
+execution of the external program (C<perl Makefile.PL>, C<perl
+Build.PL>, C<make>, etc.).
+
+For C<mode=deterministic>, the CPAN.pm injects the
+corresponding answer as soon as the stream matches the regular expression.
+
+For C<mode=anyorder> CPAN.pm answers a question as soon
+as the timeout is reached for the next byte in the input stream. In
+this mode you can use the C<reuse> parameter to decide what will
+happen with a question-answer pair after it has been used. In the
+default case (reuse=0) it is removed from the array, avoiding being
+used again accidentally. If you want to answer the
+question C<Do you really want to do that> several times, then it must
+be included in the array at least as often as you want this answer to
+be given. Setting the parameter C<reuse> to 1 makes this repetition
+unnecessary.
+
+=item env [hash]
+
+Environment variables to be set during the command
+
+=item expect [array]
+
+You must install the C<Expect> module to use C<expect>. CPAN.pm
+does not install it for you.
+
+C<< expect: <array> >> is a short notation for this C<eexpect>:
+
+ eexpect:
+ mode: deterministic
+ timeout: 15
+ talk: <array>
+
+=back
+
+=head2 Schema verification with C<Kwalify>
+
+If you have the C<Kwalify> module installed (which is part of the
+Bundle::CPANxxl), then all your distroprefs files are checked for
+syntactic correctness.
+
+=head2 Example Distroprefs Files
+
+C<CPAN.pm> comes with a collection of example YAML files. Note that these
+are really just examples and should not be used without care because
+they cannot fit everybody's purpose. After all, the authors of the
+packages that ask questions had a need to ask, so you should watch
+their questions and adjust the examples to your environment and your
+needs. You have been warned:-)
+
+=head1 PROGRAMMER'S INTERFACE
+
+If you do not enter the shell, shell commands are
+available both as methods (C<CPAN::Shell-E<gt>install(...)>) and as
+functions in the calling package (C<install(...)>). Before calling low-level
+commands, it makes sense to initialize components of CPAN you need, e.g.:
+
+ CPAN::HandleConfig->load;
+ CPAN::Shell::setup_output;
+ CPAN::Index->reload;
+
+High-level commands do such initializations automatically.
+
+There's currently only one class that has a stable interface -
+CPAN::Shell. All commands that are available in the CPAN shell are
+methods of the class CPAN::Shell. Each of the commands that produce
+listings of modules (C<r>, C<autobundle>, C<u>) also return a list of
+the IDs of all modules within the list.
+
+=over 2
+
+=item expand($type,@things)
+
+The IDs of all objects available within a program are strings that can
+be expanded to the corresponding real objects with the
+C<CPAN::Shell-E<gt>expand("Module",@things)> method. Expand returns a
+list of CPAN::Module objects according to the C<@things> arguments
+given. In scalar context, it returns only the first element of the
+list.
+
+=item expandany(@things)
+
+Like expand, but returns objects of the appropriate type, i.e.
+CPAN::Bundle objects for bundles, CPAN::Module objects for modules, and
+CPAN::Distribution objects for distributions. Note: it does not expand
+to CPAN::Author objects.
+
+=item Programming Examples
+
+This enables the programmer to do operations that combine
+functionalities that are available in the shell.
+
+ # install everything that is outdated on my disk:
+ perl -MCPAN -e 'CPAN::Shell->install(CPAN::Shell->r)'
+
+ # install my favorite programs if necessary:
+ for $mod (qw(Net::FTP Digest::SHA Data::Dumper)) {
+ CPAN::Shell->install($mod);
+ }
+
+ # list all modules on my disk that have no VERSION number
+ for $mod (CPAN::Shell->expand("Module","/./")) {
+ next unless $mod->inst_file;
+ # MakeMaker convention for undefined $VERSION:
+ next unless $mod->inst_version eq "undef";
+ print "No VERSION in ", $mod->id, "\n";
+ }
+
+ # find out which distribution on CPAN contains a module:
+ print CPAN::Shell->expand("Module","Apache::Constants")->cpan_file
+
+Or if you want to schedule a I<cron> job to watch CPAN, you could list
+all modules that need updating. First a quick and dirty way:
+
+ perl -e 'use CPAN; CPAN::Shell->r;'
+
+If you don't want any output should all modules be
+up to date, parse the output of above command for the regular
+expression C</modules are up to date/> and decide to mail the output
+only if it doesn't match.
+
+If you prefer to do it more in a programmerish style in one single
+process, something like this may better suit you:
+
+ # list all modules on my disk that have newer versions on CPAN
+ for $mod (CPAN::Shell->expand("Module","/./")) {
+ next unless $mod->inst_file;
+ next if $mod->uptodate;
+ printf "Module %s is installed as %s, could be updated to %s from CPAN\n",
+ $mod->id, $mod->inst_version, $mod->cpan_version;
+ }
+
+If that gives too much output every day, you may want to
+watch only for three modules. You can write
+
+ for $mod (CPAN::Shell->expand("Module","/Apache|LWP|CGI/")) {
+
+as the first line instead. Or you can combine some of the above
+tricks:
+
+ # watch only for a new mod_perl module
+ $mod = CPAN::Shell->expand("Module","mod_perl");
+ exit if $mod->uptodate;
+ # new mod_perl arrived, let me know all update recommendations
+ CPAN::Shell->r;
+
+=back
+
+=head2 Methods in the other Classes
+
+=over 4
+
+=item CPAN::Author::as_glimpse()
+
+Returns a one-line description of the author
+
+=item CPAN::Author::as_string()
+
+Returns a multi-line description of the author
+
+=item CPAN::Author::email()
+
+Returns the author's email address
+
+=item CPAN::Author::fullname()
+
+Returns the author's name
+
+=item CPAN::Author::name()
+
+An alias for fullname
+
+=item CPAN::Bundle::as_glimpse()
+
+Returns a one-line description of the bundle
+
+=item CPAN::Bundle::as_string()
+
+Returns a multi-line description of the bundle
+
+=item CPAN::Bundle::clean()
+
+Recursively runs the C<clean> method on all items contained in the bundle.
+
+=item CPAN::Bundle::contains()
+
+Returns a list of objects' IDs contained in a bundle. The associated
+objects may be bundles, modules or distributions.
+
+=item CPAN::Bundle::force($method,@args)
+
+Forces CPAN to perform a task that it normally would have refused to
+do. Force takes as arguments a method name to be called and any number
+of additional arguments that should be passed to the called method.
+The internals of the object get the needed changes so that CPAN.pm
+does not refuse to take the action. The C<force> is passed recursively
+to all contained objects. See also the section above on the C<force>
+and the C<fforce> pragma.
+
+=item CPAN::Bundle::get()
+
+Recursively runs the C<get> method on all items contained in the bundle
+
+=item CPAN::Bundle::inst_file()
+
+Returns the highest installed version of the bundle in either @INC or
+C<< $CPAN::Config->{cpan_home} >>. Note that this is different from
+CPAN::Module::inst_file.
+
+=item CPAN::Bundle::inst_version()
+
+Like CPAN::Bundle::inst_file, but returns the $VERSION
+
+=item CPAN::Bundle::uptodate()
+
+Returns 1 if the bundle itself and all its members are uptodate.
+
+=item CPAN::Bundle::install()
+
+Recursively runs the C<install> method on all items contained in the bundle
+
+=item CPAN::Bundle::make()
+
+Recursively runs the C<make> method on all items contained in the bundle
+
+=item CPAN::Bundle::readme()
+
+Recursively runs the C<readme> method on all items contained in the bundle
+
+=item CPAN::Bundle::test()
+
+Recursively runs the C<test> method on all items contained in the bundle
+
+=item CPAN::Distribution::as_glimpse()
+
+Returns a one-line description of the distribution
+
+=item CPAN::Distribution::as_string()
+
+Returns a multi-line description of the distribution
+
+=item CPAN::Distribution::author
+
+Returns the CPAN::Author object of the maintainer who uploaded this
+distribution
+
+=item CPAN::Distribution::pretty_id()
+
+Returns a string of the form "AUTHORID/TARBALL", where AUTHORID is the
+author's PAUSE ID and TARBALL is the distribution filename.
+
+=item CPAN::Distribution::base_id()
+
+Returns the distribution filename without any archive suffix. E.g
+"Foo-Bar-0.01"
+
+=item CPAN::Distribution::clean()
+
+Changes to the directory where the distribution has been unpacked and
+runs C<make clean> there.
+
+=item CPAN::Distribution::containsmods()
+
+Returns a list of IDs of modules contained in a distribution file.
+Works only for distributions listed in the 02packages.details.txt.gz
+file. This typically means that just most recent version of a
+distribution is covered.
+
+=item CPAN::Distribution::cvs_import()
+
+Changes to the directory where the distribution has been unpacked and
+runs something like
+
+ cvs -d $cvs_root import -m $cvs_log $cvs_dir $userid v$version
+
+there.
+
+=item CPAN::Distribution::dir()
+
+Returns the directory into which this distribution has been unpacked.
+
+=item CPAN::Distribution::force($method,@args)
+
+Forces CPAN to perform a task that it normally would have refused to
+do. Force takes as arguments a method name to be called and any number
+of additional arguments that should be passed to the called method.
+The internals of the object get the needed changes so that CPAN.pm
+does not refuse to take the action. See also the section above on the
+C<force> and the C<fforce> pragma.
+
+=item CPAN::Distribution::get()
+
+Downloads the distribution from CPAN and unpacks it. Does nothing if
+the distribution has already been downloaded and unpacked within the
+current session.
+
+=item CPAN::Distribution::install()
+
+Changes to the directory where the distribution has been unpacked and
+runs the external command C<make install> there. If C<make> has not
+yet been run, it will be run first. A C<make test> is issued in
+any case and if this fails, the install is cancelled. The
+cancellation can be avoided by letting C<force> run the C<install> for
+you.
+
+This install method only has the power to install the distribution if
+there are no dependencies in the way. To install an object along with all
+its dependencies, use CPAN::Shell->install.
+
+Note that install() gives no meaningful return value. See uptodate().
+
+=item CPAN::Distribution::install_tested()
+
+Install all distributions that have tested sucessfully but
+not yet installed. See also C<is_tested>.
+
+=item CPAN::Distribution::isa_perl()
+
+Returns 1 if this distribution file seems to be a perl distribution.
+Normally this is derived from the file name only, but the index from
+CPAN can contain a hint to achieve a return value of true for other
+filenames too.
+
+=item CPAN::Distribution::look()
+
+Changes to the directory where the distribution has been unpacked and
+opens a subshell there. Exiting the subshell returns.
+
+=item CPAN::Distribution::make()
+
+First runs the C<get> method to make sure the distribution is
+downloaded and unpacked. Changes to the directory where the
+distribution has been unpacked and runs the external commands C<perl
+Makefile.PL> or C<perl Build.PL> and C<make> there.
+
+=item CPAN::Distribution::perldoc()
+
+Downloads the pod documentation of the file associated with a
+distribution (in HTML format) and runs it through the external
+command I<lynx> specified in C<< $CPAN::Config->{lynx} >>. If I<lynx>
+isn't available, it converts it to plain text with the external
+command I<html2text> and runs it through the pager specified
+in C<< $CPAN::Config->{pager} >>.
+
+=item CPAN::Distribution::prefs()
+
+Returns the hash reference from the first matching YAML file that the
+user has deposited in the C<prefs_dir/> directory. The first
+succeeding match wins. The files in the C<prefs_dir/> are processed
+alphabetically, and the canonical distroname (e.g.
+AUTHOR/Foo-Bar-3.14.tar.gz) is matched against the regular expressions
+stored in the $root->{match}{distribution} attribute value.
+Additionally all module names contained in a distribution are matched
+against the regular expressions in the $root->{match}{module} attribute
+value. The two match values are ANDed together. Each of the two
+attributes are optional.
+
+=item CPAN::Distribution::prereq_pm()
+
+Returns the hash reference that has been announced by a distribution
+as the C<requires> and C<build_requires> elements. These can be
+declared either by the C<META.yml> (if authoritative) or can be
+deposited after the run of C<Build.PL> in the file C<./_build/prereqs>
+or after the run of C<Makfile.PL> written as the C<PREREQ_PM> hash in
+a comment in the produced C<Makefile>. I<Note>: this method only works
+after an attempt has been made to C<make> the distribution. Returns
+undef otherwise.
+
+=item CPAN::Distribution::readme()
+
+Downloads the README file associated with a distribution and runs it
+through the pager specified in C<< $CPAN::Config->{pager} >>.
+
+=item CPAN::Distribution::reports()
+
+Downloads report data for this distribution from www.cpantesters.org
+and displays a subset of them.
+
+=item CPAN::Distribution::read_yaml()
+
+Returns the content of the META.yml of this distro as a hashref. Note:
+works only after an attempt has been made to C<make> the distribution.
+Returns undef otherwise. Also returns undef if the content of META.yml
+is not authoritative. (The rules about what exactly makes the content
+authoritative are still in flux.)
+
+=item CPAN::Distribution::test()
+
+Changes to the directory where the distribution has been unpacked and
+runs C<make test> there.
+
+=item CPAN::Distribution::uptodate()
+
+Returns 1 if all the modules contained in the distribution are
+uptodate. Relies on containsmods.
+
+=item CPAN::Index::force_reload()
+
+Forces a reload of all indices.
+
+=item CPAN::Index::reload()
+
+Reloads all indices if they have not been read for more than
+C<< $CPAN::Config->{index_expire} >> days.
+
+=item CPAN::InfoObj::dump()
+
+CPAN::Author, CPAN::Bundle, CPAN::Module, and CPAN::Distribution
+inherit this method. It prints the data structure associated with an
+object. Useful for debugging. Note: the data structure is considered
+internal and thus subject to change without notice.
+
+=item CPAN::Module::as_glimpse()
+
+Returns a one-line description of the module in four columns: The
+first column contains the word C<Module>, the second column consists
+of one character: an equals sign if this module is already installed
+and uptodate, a less-than sign if this module is installed but can be
+upgraded, and a space if the module is not installed. The third column
+is the name of the module and the fourth column gives maintainer or
+distribution information.
+
+=item CPAN::Module::as_string()
+
+Returns a multi-line description of the module
+
+=item CPAN::Module::clean()
+
+Runs a clean on the distribution associated with this module.
+
+=item CPAN::Module::cpan_file()
+
+Returns the filename on CPAN that is associated with the module.
+
+=item CPAN::Module::cpan_version()
+
+Returns the latest version of this module available on CPAN.
+
+=item CPAN::Module::cvs_import()
+
+Runs a cvs_import on the distribution associated with this module.
+
+=item CPAN::Module::description()
+
+Returns a 44 character description of this module. Only available for
+modules listed in The Module List (CPAN/modules/00modlist.long.html
+or 00modlist.long.txt.gz)
+
+=item CPAN::Module::distribution()
+
+Returns the CPAN::Distribution object that contains the current
+version of this module.
+
+=item CPAN::Module::dslip_status()
+
+Returns a hash reference. The keys of the hash are the letters C<D>,
+C<S>, C<L>, C<I>, and <P>, for development status, support level,
+language, interface and public licence respectively. The data for the
+DSLIP status are collected by pause.perl.org when authors register
+their namespaces. The values of the 5 hash elements are one-character
+words whose meaning is described in the table below. There are also 5
+hash elements C<DV>, C<SV>, C<LV>, C<IV>, and <PV> that carry a more
+verbose value of the 5 status variables.
+
+Where the 'DSLIP' characters have the following meanings:
+
+ D - Development Stage (Note: *NO IMPLIED TIMESCALES*):
+ i - Idea, listed to gain consensus or as a placeholder
+ c - under construction but pre-alpha (not yet released)
+ a/b - Alpha/Beta testing
+ R - Released
+ M - Mature (no rigorous definition)
+ S - Standard, supplied with Perl 5
+
+ S - Support Level:
+ m - Mailing-list
+ d - Developer
+ u - Usenet newsgroup comp.lang.perl.modules
+ n - None known, try comp.lang.perl.modules
+ a - abandoned; volunteers welcome to take over maintainance
+
+ L - Language Used:
+ p - Perl-only, no compiler needed, should be platform independent
+ c - C and perl, a C compiler will be needed
+ h - Hybrid, written in perl with optional C code, no compiler needed
+ + - C++ and perl, a C++ compiler will be needed
+ o - perl and another language other than C or C++
+
+ I - Interface Style
+ f - plain Functions, no references used
+ h - hybrid, object and function interfaces available
+ n - no interface at all (huh?)
+ r - some use of unblessed References or ties
+ O - Object oriented using blessed references and/or inheritance
+
+ P - Public License
+ p - Standard-Perl: user may choose between GPL and Artistic
+ g - GPL: GNU General Public License
+ l - LGPL: "GNU Lesser General Public License" (previously known as
+ "GNU Library General Public License")
+ b - BSD: The BSD License
+ a - Artistic license alone
+ 2 - Artistic license 2.0 or later
+ o - open source: appoved by www.opensource.org
+ d - allows distribution without restrictions
+ r - restricted distribtion
+ n - no license at all
+
+=item CPAN::Module::force($method,@args)
+
+Forces CPAN to perform a task it would normally refuse to
+do. Force takes as arguments a method name to be invoked and any number
+of additional arguments to pass that method.
+The internals of the object get the needed changes so that CPAN.pm
+does not refuse to take the action. See also the section above on the
+C<force> and the C<fforce> pragma.
+
+=item CPAN::Module::get()
+
+Runs a get on the distribution associated with this module.
+
+=item CPAN::Module::inst_file()
+
+Returns the filename of the module found in @INC. The first file found
+is reported, just as perl itself stops searching @INC once it finds a
+module.
+
+=item CPAN::Module::available_file()
+
+Returns the filename of the module found in PERL5LIB or @INC. The
+first file found is reported. The advantage of this method over
+C<inst_file> is that modules that have been tested but not yet
+installed are included because PERL5LIB keeps track of tested modules.
+
+=item CPAN::Module::inst_version()
+
+Returns the version number of the installed module in readable format.
+
+=item CPAN::Module::available_version()
+
+Returns the version number of the available module in readable format.
+
+=item CPAN::Module::install()
+
+Runs an C<install> on the distribution associated with this module.
+
+=item CPAN::Module::look()
+
+Changes to the directory where the distribution associated with this
+module has been unpacked and opens a subshell there. Exiting the
+subshell returns.
+
+=item CPAN::Module::make()
+
+Runs a C<make> on the distribution associated with this module.
+
+=item CPAN::Module::manpage_headline()
+
+If module is installed, peeks into the module's manpage, reads the
+headline, and returns it. Moreover, if the module has been downloaded
+within this session, does the equivalent on the downloaded module even
+if it hasn't been installed yet.
+
+=item CPAN::Module::perldoc()
+
+Runs a C<perldoc> on this module.
+
+=item CPAN::Module::readme()
+
+Runs a C<readme> on the distribution associated with this module.
+
+=item CPAN::Module::reports()
+
+Calls the reports() method on the associated distribution object.
+
+=item CPAN::Module::test()
+
+Runs a C<test> on the distribution associated with this module.
+
+=item CPAN::Module::uptodate()
+
+Returns 1 if the module is installed and up-to-date.
+
+=item CPAN::Module::userid()
+
+Returns the author's ID of the module.
+
+=back
+
+=head2 Cache Manager
+
+Currently the cache manager only keeps track of the build directory
+($CPAN::Config->{build_dir}). It is a simple FIFO mechanism that
+deletes complete directories below C<build_dir> as soon as the size of
+all directories there gets bigger than $CPAN::Config->{build_cache}
+(in MB). The contents of this cache may be used for later
+re-installations that you intend to do manually, but will never be
+trusted by CPAN itself. This is due to the fact that the user might
+use these directories for building modules on different architectures.
+
+There is another directory ($CPAN::Config->{keep_source_where}) where
+the original distribution files are kept. This directory is not
+covered by the cache manager and must be controlled by the user. If
+you choose to have the same directory as build_dir and as
+keep_source_where directory, then your sources will be deleted with
+the same fifo mechanism.
+
+=head2 Bundles
+
+A bundle is just a perl module in the namespace Bundle:: that does not
+define any functions or methods. It usually only contains documentation.
+
+It starts like a perl module with a package declaration and a $VERSION
+variable. After that the pod section looks like any other pod with the
+only difference being that I<one special pod section> exists starting with
+(verbatim):
+
+ =head1 CONTENTS
+
+In this pod section each line obeys the format
+
+ Module_Name [Version_String] [- optional text]
+
+The only required part is the first field, the name of a module
+(e.g. Foo::Bar, ie. I<not> the name of the distribution file). The rest
+of the line is optional. The comment part is delimited by a dash just
+as in the man page header.
+
+The distribution of a bundle should follow the same convention as
+other distributions.
+
+Bundles are treated specially in the CPAN package. If you say 'install
+Bundle::Tkkit' (assuming such a bundle exists), CPAN will install all
+the modules in the CONTENTS section of the pod. You can install your
+own Bundles locally by placing a conformant Bundle file somewhere into
+your @INC path. The autobundle() command which is available in the
+shell interface does that for you by including all currently installed
+modules in a snapshot bundle file.
+
+=head1 PREREQUISITES
+
+The CPAN program is trying to depend on as little as possible so the
+user can use it in hostile enviroment. It works better the more goodies
+the environment provides. For example if you try in the CPAN shell
+
+ install Bundle::CPAN
+
+or
+
+ install Bundle::CPANxxl
+
+you will find the shell more convenient than the bare shell before.
+
+If you have a local mirror of CPAN and can access all files with
+"file:" URLs, then you only need a perl later than perl5.003 to run
+this module. Otherwise Net::FTP is strongly recommended. LWP may be
+required for non-UNIX systems, or if your nearest CPAN site is
+associated with a URL that is not C<ftp:>.
+
+If you have neither Net::FTP nor LWP, there is a fallback mechanism
+implemented for an external ftp command or for an external lynx
+command.
+
+=head1 UTILITIES
+
+=head2 Finding packages and VERSION
+
+This module presumes that all packages on CPAN
+
+=over 2
+
+=item *
+
+declare their $VERSION variable in an easy to parse manner. This
+prerequisite can hardly be relaxed because it consumes far too much
+memory to load all packages into the running program just to determine
+the $VERSION variable. Currently all programs that are dealing with
+version use something like this
+
+ perl -MExtUtils::MakeMaker -le \
+ 'print MM->parse_version(shift)' filename
+
+If you are author of a package and wonder if your $VERSION can be
+parsed, please try the above method.
+
+=item *
+
+come as compressed or gzipped tarfiles or as zip files and contain a
+C<Makefile.PL> or C<Build.PL> (well, we try to handle a bit more, but
+with little enthusiasm).
+
+=back
+
+=head2 Debugging
+
+Debugging this module is more than a bit complex due to interference from
+the software producing the indices on CPAN, the mirroring process on CPAN,
+packaging, configuration, synchronicity, and even (gasp!) due to bugs
+within the CPAN.pm module itself.
+
+For debugging the code of CPAN.pm itself in interactive mode, some
+debugging aid can be turned on for most packages within
+CPAN.pm with one of
+
+=over 2
+
+=item o debug package...
+
+sets debug mode for packages.
+
+=item o debug -package...
+
+unsets debug mode for packages.
+
+=item o debug all
+
+turns debugging on for all packages.
+
+=item o debug number
+
+=back
+
+which sets the debugging packages directly. Note that C<o debug 0>
+turns debugging off.
+
+What seems a successful strategy is the combination of C<reload
+cpan> and the debugging switches. Add a new debug statement while
+running in the shell and then issue a C<reload cpan> and see the new
+debugging messages immediately without losing the current context.
+
+C<o debug> without an argument lists the valid package names and the
+current set of packages in debugging mode. C<o debug> has built-in
+completion support.
+
+For debugging of CPAN data there is the C<dump> command which takes
+the same arguments as make/test/install and outputs each object's
+Data::Dumper dump. If an argument looks like a perl variable and
+contains one of C<$>, C<@> or C<%>, it is eval()ed and fed to
+Data::Dumper directly.
+
+=head2 Floppy, Zip, Offline Mode
+
+CPAN.pm works nicely without network access, too. If you maintain machines
+that are not networked at all, you should consider working with C<file:>
+URLs. You'll have to collect your modules somewhere first. So
+you might use CPAN.pm to put together all you need on a networked
+machine. Then copy the $CPAN::Config->{keep_source_where} (but not
+$CPAN::Config->{build_dir}) directory on a floppy. This floppy is kind
+of a personal CPAN. CPAN.pm on the non-networked machines works nicely
+with this floppy. See also below the paragraph about CD-ROM support.
+
+=head2 Basic Utilities for Programmers
+
+=over 2
+
+=item has_inst($module)
+
+Returns true if the module is installed. Used to load all modules into
+the running CPAN.pm that are considered optional. The config variable
+C<dontload_list> intercepts the C<has_inst()> call such
+that an optional module is not loaded despite being available. For
+example, the following command will prevent C<YAML.pm> from being
+loaded:
+
+ cpan> o conf dontload_list push YAML
+
+See the source for details.
+
+=item has_usable($module)
+
+Returns true if the module is installed and in a usable state. Only
+useful for a handful of modules that are used internally. See the
+source for details.
+
+=item instance($module)
+
+The constructor for all the singletons used to represent modules,
+distributions, authors, and bundles. If the object already exists, this
+method returns the object; otherwise, it calls the constructor.
+
+=back
+
+=head1 SECURITY
+
+There's no strong security layer in CPAN.pm. CPAN.pm helps you to
+install foreign, unmasked, unsigned code on your machine. We compare
+to a checksum that comes from the net just as the distribution file
+itself. But we try to make it easy to add security on demand:
+
+=head2 Cryptographically signed modules
+
+Since release 1.77, CPAN.pm has been able to verify cryptographically
+signed module distributions using Module::Signature. The CPAN modules
+can be signed by their authors, thus giving more security. The simple
+unsigned MD5 checksums that were used before by CPAN protect mainly
+against accidental file corruption.
+
+You will need to have Module::Signature installed, which in turn
+requires that you have at least one of Crypt::OpenPGP module or the
+command-line F<gpg> tool installed.
+
+You will also need to be able to connect over the Internet to the public
+keyservers, like pgp.mit.edu, and their port 11731 (the HKP protocol).
+
+The configuration parameter check_sigs is there to turn signature
+checking on or off.
+
+=head1 EXPORT
+
+Most functions in package CPAN are exported by default. The reason
+for this is that the primary use is intended for the cpan shell or for
+one-liners.
+
+=head1 ENVIRONMENT
+
+When the CPAN shell enters a subshell via the look command, it sets
+the environment CPAN_SHELL_LEVEL to 1, or increments that variable if it is
+already set.
+
+When CPAN runs, it sets the environment variable PERL5_CPAN_IS_RUNNING
+to the ID of the running process. It also sets
+PERL5_CPANPLUS_IS_RUNNING to prevent runaway processes which could
+happen with older versions of Module::Install.
+
+When running C<perl Makefile.PL>, the environment variable
+C<PERL5_CPAN_IS_EXECUTING> is set to the full path of the
+C<Makefile.PL> that is being executed. This prevents runaway processes
+with newer versions of Module::Install.
+
+When the config variable ftp_passive is set, all downloads will be run
+with the environment variable FTP_PASSIVE set to this value. This is
+in general a good idea as it influences both Net::FTP and LWP based
+connections. The same effect can be achieved by starting the cpan
+shell with this environment variable set. For Net::FTP alone, one can
+also always set passive mode by running libnetcfg.
+
+=head1 POPULATE AN INSTALLATION WITH LOTS OF MODULES
+
+Populating a freshly installed perl with one's favorite modules is pretty
+easy if you maintain a private bundle definition file. To get a useful
+blueprint of a bundle definition file, the command autobundle can be used
+on the CPAN shell command line. This command writes a bundle definition
+file for all modules installed for the current perl
+interpreter. It's recommended to run this command once only, and from then
+on maintain the file manually under a private name, say
+Bundle/my_bundle.pm. With a clever bundle file you can then simply say
+
+ cpan> install Bundle::my_bundle
+
+then answer a few questions and go out for coffee (possibly
+even in a different city).
+
+Maintaining a bundle definition file means keeping track of two
+things: dependencies and interactivity. CPAN.pm sometimes fails on
+calculating dependencies because not all modules define all MakeMaker
+attributes correctly, so a bundle definition file should specify
+prerequisites as early as possible. On the other hand, it's
+annoying that so many distributions need some interactive configuring. So
+what you can try to accomplish in your private bundle file is to have the
+packages that need to be configured early in the file and the gentle
+ones later, so you can go out for cofeee after a few minutes and leave CPAN.pm
+to churn away untended.
+
+=head1 WORKING WITH CPAN.pm BEHIND FIREWALLS
+
+Thanks to Graham Barr for contributing the following paragraphs about
+the interaction between perl, and various firewall configurations. For
+further information on firewalls, it is recommended to consult the
+documentation that comes with the I<ncftp> program. If you are unable to
+go through the firewall with a simple Perl setup, it is likely
+that you can configure I<ncftp> so that it works through your firewall.
+
+=head2 Three basic types of firewalls
+
+Firewalls can be categorized into three basic types.
+
+=over 4
+
+=item http firewall
+
+This is when the firewall machine runs a web server, and to access the
+outside world, you must do so via that web server. If you set environment
+variables like http_proxy or ftp_proxy to values beginning with http://,
+or in your web browser you've proxy information set, then you know
+you are running behind an http firewall.
+
+To access servers outside these types of firewalls with perl (even for
+ftp), you need LWP.
+
+=item ftp firewall
+
+This where the firewall machine runs an ftp server. This kind of
+firewall will only let you access ftp servers outside the firewall.
+This is usually done by connecting to the firewall with ftp, then
+entering a username like "user@outside.host.com".
+
+To access servers outside these type of firewalls with perl, you
+need Net::FTP.
+
+=item One-way visibility
+
+One-way visibility means these firewalls try to make themselves
+invisible to users inside the firewall. An FTP data connection is
+normally created by sending your IP address to the remote server and then
+listening for the return connection. But the remote server will not be able to
+connect to you because of the firewall. For these types of firewall,
+FTP connections need to be done in a passive mode.
+
+There are two that I can think off.
+
+=over 4
+
+=item SOCKS
+
+If you are using a SOCKS firewall, you will need to compile perl and link
+it with the SOCKS library. This is what is normally called a 'socksified'
+perl. With this executable you will be able to connect to servers outside
+the firewall as if it were not there.
+
+=item IP Masquerade
+
+This is when the firewall implemented in the kernel (via NAT, or networking
+address translation), it allows you to hide a complete network behind one
+IP address. With this firewall no special compiling is needed as you can
+access hosts directly.
+
+For accessing ftp servers behind such firewalls you usually need to
+set the environment variable C<FTP_PASSIVE> or the config variable
+ftp_passive to a true value.
+
+=back
+
+=back
+
+=head2 Configuring lynx or ncftp for going through a firewall
+
+If you can go through your firewall with e.g. lynx, presumably with a
+command such as
+
+ /usr/local/bin/lynx -pscott:tiger
+
+then you would configure CPAN.pm with the command
+
+ o conf lynx "/usr/local/bin/lynx -pscott:tiger"
+
+That's all. Similarly for ncftp or ftp, you would configure something
+like
+
+ o conf ncftp "/usr/bin/ncftp -f /home/scott/ncftplogin.cfg"
+
+Your mileage may vary...
+
+=head1 FAQ
+
+=over 4
+
+=item 1)
+
+I installed a new version of module X but CPAN keeps saying,
+I have the old version installed
+
+Probably you B<do> have the old version installed. This can
+happen if a module installs itself into a different directory in the
+@INC path than it was previously installed. This is not really a
+CPAN.pm problem, you would have the same problem when installing the
+module manually. The easiest way to prevent this behaviour is to add
+the argument C<UNINST=1> to the C<make install> call, and that is why
+many people add this argument permanently by configuring
+
+ o conf make_install_arg UNINST=1
+
+=item 2)
+
+So why is UNINST=1 not the default?
+
+Because there are people who have their precise expectations about who
+may install where in the @INC path and who uses which @INC array. In
+fine tuned environments C<UNINST=1> can cause damage.
+
+=item 3)
+
+I want to clean up my mess, and install a new perl along with
+all modules I have. How do I go about it?
+
+Run the autobundle command for your old perl and optionally rename the
+resulting bundle file (e.g. Bundle/mybundle.pm), install the new perl
+with the Configure option prefix, e.g.
+
+ ./Configure -Dprefix=/usr/local/perl-5.6.78.9
+
+Install the bundle file you produced in the first step with something like
+
+ cpan> install Bundle::mybundle
+
+and you're done.
+
+=item 4)
+
+When I install bundles or multiple modules with one command
+there is too much output to keep track of.
+
+You may want to configure something like
+
+ o conf make_arg "| tee -ai /root/.cpan/logs/make.out"
+ o conf make_install_arg "| tee -ai /root/.cpan/logs/make_install.out"
+
+so that STDOUT is captured in a file for later inspection.
+
+
+=item 5)
+
+I am not root, how can I install a module in a personal directory?
+
+First of all, you will want to use your own configuration, not the one
+that your root user installed. If you do not have permission to write
+in the cpan directory that root has configured, you will be asked if
+you want to create your own config. Answering "yes" will bring you into
+CPAN's configuration stage, using the system config for all defaults except
+things that have to do with CPAN's work directory, saving your choices to
+your MyConfig.pm file.
+
+You can also manually initiate this process with the following command:
+
+ % perl -MCPAN -e 'mkmyconfig'
+
+or by running
+
+ mkmyconfig
+
+from the CPAN shell.
+
+You will most probably also want to configure something like this:
+
+ o conf makepl_arg "LIB=~/myperl/lib \
+ INSTALLMAN1DIR=~/myperl/man/man1 \
+ INSTALLMAN3DIR=~/myperl/man/man3 \
+ INSTALLSCRIPT=~/myperl/bin \
+ INSTALLBIN=~/myperl/bin"
+
+and then the equivalent command for Module::Build, which is
+
+ o conf mbuildpl_arg "--lib=~/myperl/lib \
+ --installman1dir=~/myperl/man/man1 \
+ --installman3dir=~/myperl/man/man3 \
+ --installscript=~/myperl/bin \
+ --installbin=~/myperl/bin"
+
+You can make this setting permanent like all C<o conf> settings with
+C<o conf commit> or by setting C<auto_commit> beforehand.
+
+You will have to add ~/myperl/man to the MANPATH environment variable
+and also tell your perl programs to look into ~/myperl/lib, e.g. by
+including
+
+ use lib "$ENV{HOME}/myperl/lib";
+
+or setting the PERL5LIB environment variable.
+
+While we're speaking about $ENV{HOME}, it might be worth mentioning,
+that for Windows we use the File::HomeDir module that provides an
+equivalent to the concept of the home directory on Unix.
+
+Another thing you should bear in mind is that the UNINST parameter can
+be dangerous when you are installing into a private area because you
+might accidentally remove modules that other people depend on that are
+not using the private area.
+
+=item 6)
+
+How to get a package, unwrap it, and make a change before building it?
+
+Have a look at the C<look> (!) command.
+
+=item 7)
+
+I installed a Bundle and had a couple of fails. When I
+retried, everything resolved nicely. Can this be fixed to work
+on first try?
+
+The reason for this is that CPAN does not know the dependencies of all
+modules when it starts out. To decide about the additional items to
+install, it just uses data found in the META.yml file or the generated
+Makefile. An undetected missing piece breaks the process. But it may
+well be that your Bundle installs some prerequisite later than some
+depending item and thus your second try is able to resolve everything.
+Please note, CPAN.pm does not know the dependency tree in advance and
+cannot sort the queue of things to install in a topologically correct
+order. It resolves perfectly well B<if> all modules declare the
+prerequisites correctly with the PREREQ_PM attribute to MakeMaker or
+the C<requires> stanza of Module::Build. For bundles which fail and
+you need to install often, it is recommended to sort the Bundle
+definition file manually.
+
+=item 8)
+
+In our intranet, we have many modules for internal use. How
+can I integrate these modules with CPAN.pm but without uploading
+the modules to CPAN?
+
+Have a look at the CPAN::Site module.
+
+=item 9)
+
+When I run CPAN's shell, I get an error message about things in my
+C</etc/inputrc> (or C<~/.inputrc>) file.
+
+These are readline issues and can only be fixed by studying readline
+configuration on your architecture and adjusting the referenced file
+accordingly. Please make a backup of the C</etc/inputrc> or C<~/.inputrc>
+and edit them. Quite often harmless changes like uppercasing or
+lowercasing some arguments solves the problem.
+
+=item 10)
+
+Some authors have strange characters in their names.
+
+Internally CPAN.pm uses the UTF-8 charset. If your terminal is
+expecting ISO-8859-1 charset, a converter can be activated by setting
+term_is_latin to a true value in your config file. One way of doing so
+would be
+
+ cpan> o conf term_is_latin 1
+
+If other charset support is needed, please file a bugreport against
+CPAN.pm at rt.cpan.org and describe your needs. Maybe we can extend
+the support or maybe UTF-8 terminals become widely available.
+
+Note: this config variable is deprecated and will be removed in a
+future version of CPAN.pm. It will be replaced with the conventions
+around the family of $LANG and $LC_* environment variables.
+
+=item 11)
+
+When an install fails for some reason and then I correct the error
+condition and retry, CPAN.pm refuses to install the module, saying
+C<Already tried without success>.
+
+Use the force pragma like so
+
+ force install Foo::Bar
+
+Or you can use
+
+ look Foo::Bar
+
+and then C<make install> directly in the subshell.
+
+=item 12)
+
+How do I install a "DEVELOPER RELEASE" of a module?
+
+By default, CPAN will install the latest non-developer release of a
+module. If you want to install a dev release, you have to specify the
+partial path starting with the author id to the tarball you wish to
+install, like so:
+
+ cpan> install KWILLIAMS/Module-Build-0.27_07.tar.gz
+
+Note that you can use the C<ls> command to get this path listed.
+
+=item 13)
+
+How do I install a module and all its dependencies from the commandline,
+without being prompted for anything, despite my CPAN configuration
+(or lack thereof)?
+
+CPAN uses ExtUtils::MakeMaker's prompt() function to ask its questions, so
+if you set the PERL_MM_USE_DEFAULT environment variable, you shouldn't be
+asked any questions at all (assuming the modules you are installing are
+nice about obeying that variable as well):
+
+ % PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install My::Module'
+
+=item 14)
+
+How do I create a Module::Build based Build.PL derived from an
+ExtUtils::MakeMaker focused Makefile.PL?
+
+http://search.cpan.org/dist/Module-Build-Convert/
+
+=item 15)
+
+I'm frequently irritated with the CPAN shell's inability to help me
+select a good mirror.
+
+The urllist config parameter is yours. You can add and remove sites at
+will. You should find out which sites have the best uptodateness,
+bandwidth, reliability, etc. and are topologically close to you. Some
+people prefer fast downloads, others uptodateness, others reliability.
+You decide which to try in which order.
+
+Henk P. Penning maintains a site that collects data about CPAN sites:
+
+ http://www.cs.uu.nl/people/henkp/mirmon/cpan.html
+
+Also, feel free to play with experimental features. Run
+
+ o conf init randomize_urllist ftpstats_period ftpstats_size
+
+and choose your favorite parameters. After a few downloads running the
+C<hosts> command will probably assist you in choosing the best mirror
+sites.
+
+=item 16)
+
+Why do I get asked the same questions every time I start the shell?
+
+You can make your configuration changes permanent by calling the
+command C<o conf commit>. Alternatively set the C<auto_commit>
+variable to true by running C<o conf init auto_commit> and answering
+the following question with yes.
+
+=item 17)
+
+Older versions of CPAN.pm had the original root directory of all
+tarballs in the build directory. Now there are always random
+characters appended to these directory names. Why was this done?
+
+The random characters are provided by File::Temp and ensure that each
+module's individual build directory is unique. This makes running
+CPAN.pm in concurrent processes simultaneously safe.
+
+=item 18)
+
+Speaking of the build directory. Do I have to clean it up myself?
+
+You have the choice to set the config variable C<scan_cache> to
+C<never>. Then you must clean it up yourself. The other possible
+value, C<atstart> only cleans up the build directory when you start
+the CPAN shell. If you never start up the CPAN shell, you probably
+also have to clean up the build directory yourself.
+
+=back
+
+=head1 COMPATIBILITY
+
+=head2 OLD PERL VERSIONS
+
+CPAN.pm is regularly tested to run under 5.004, 5.005, and assorted
+newer versions. It is getting more and more difficult to get the
+minimal prerequisites working on older perls. It is close to
+impossible to get the whole Bundle::CPAN working there. If you're in
+the position to have only these old versions, be advised that CPAN is
+designed to work fine without the Bundle::CPAN installed.
+
+To get things going, note that GBARR/Scalar-List-Utils-1.18.tar.gz is
+compatible with ancient perls and that File::Temp is listed as a
+prerequisite but CPAN has reasonable workarounds if it is missing.
+
+=head2 CPANPLUS
+
+This module and its competitor, the CPANPLUS module, are both much
+cooler than the other. CPAN.pm is older. CPANPLUS was designed to be
+more modular, but it was never intended to be compatible with CPAN.pm.
+
+=head1 SECURITY ADVICE
+
+This software enables you to upgrade software on your computer and so
+is inherently dangerous because the newly installed software may
+contain bugs and may alter the way your computer works or even make it
+unusable. Please consider backing up your data before every upgrade.
+
+=head1 BUGS
+
+Please report bugs via L<http://rt.cpan.org/>
+
+Before submitting a bug, please make sure that the traditional method
+of building a Perl module package from a shell by following the
+installation instructions of that package still works in your
+environment.
+
+=head1 AUTHOR
+
+Andreas Koenig C<< <andk@cpan.org> >>
+
+=head1 LICENSE
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=head1 TRANSLATIONS
+
+Kawai,Takanori provides a Japanese translation of a very old version
+of this manpage at
+L<http://homepage3.nifty.com/hippo2000/perltips/CPAN.htm>
+
+=head1 SEE ALSO
+
+Many people enter the CPAN shell by running the L<cpan> utility
+program which is installed in the same directory as perl itself. So if
+you have this directory in your PATH variable (or some equivalent in
+your operating system) then typing C<cpan> in a console window will
+work for you as well. Above that the utility provides several
+commandline shortcuts.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Backend.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Backend.pm
new file mode 100755
index 00000000000..a599e5429eb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Backend.pm
@@ -0,0 +1,1330 @@
+package CPANPLUS::Backend;
+
+use strict;
+
+
+use CPANPLUS::Error;
+use CPANPLUS::Configure;
+use CPANPLUS::Internals;
+use CPANPLUS::Internals::Constants;
+use CPANPLUS::Module;
+use CPANPLUS::Module::Author;
+use CPANPLUS::Backend::RV;
+
+use FileHandle;
+use File::Spec ();
+use File::Spec::Unix ();
+use File::Basename ();
+use Params::Check qw[check];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+$Params::Check::VERBOSE = 1;
+
+use vars qw[@ISA $VERSION];
+
+@ISA = qw[CPANPLUS::Internals];
+$VERSION = $CPANPLUS::Internals::VERSION;
+
+### mark that we're running under CPANPLUS to spawned processes
+$ENV{'PERL5_CPANPLUS_IS_RUNNING'} = $$;
+
+### XXX version.pm MAY format this version, if it's in use... :(
+### so for consistency, just call ->VERSION ourselves as well.
+$ENV{'PERL5_CPANPLUS_IS_VERSION'} = __PACKAGE__->VERSION;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Backend
+
+=head1 SYNOPSIS
+
+ my $cb = CPANPLUS::Backend->new;
+ my $conf = $cb->configure_object;
+
+ my $author = $cb->author_tree('KANE');
+ my $mod = $cb->module_tree('Some::Module');
+ my $mod = $cb->parse_module( module => 'Some::Module' );
+
+ my @objs = $cb->search( type => TYPE,
+ allow => [...] );
+
+ $cb->flush('all');
+ $cb->reload_indices;
+ $cb->local_mirror;
+
+
+=head1 DESCRIPTION
+
+This module provides the programmer's interface to the C<CPANPLUS>
+libraries.
+
+=head1 ENVIRONMENT
+
+When C<CPANPLUS::Backend> is loaded, which is necessary for just
+about every <CPANPLUS> operation, the environment variable
+C<PERL5_CPANPLUS_IS_RUNNING> is set to the current process id.
+
+Additionally, the environment variable C<PERL5_CPANPLUS_IS_VERSION>
+will be set to the version of C<CPANPLUS::Backend>.
+
+This information might be useful somehow to spawned processes.
+
+=head1 METHODS
+
+=head2 $cb = CPANPLUS::Backend->new( [CONFIGURE_OBJ] )
+
+This method returns a new C<CPANPLUS::Backend> object.
+This also initialises the config corresponding to this object.
+You have two choices in this:
+
+=over 4
+
+=item Provide a valid C<CPANPLUS::Configure> object
+
+This will be used verbatim.
+
+=item No arguments
+
+Your default config will be loaded and used.
+
+=back
+
+New will return a C<CPANPLUS::Backend> object on success and die on
+failure.
+
+=cut
+
+sub new {
+ my $class = shift;
+ my $conf;
+
+ if( $_[0] && IS_CONFOBJ->( conf => $_[0] ) ) {
+ $conf = shift;
+ } else {
+ $conf = CPANPLUS::Configure->new() or return;
+ }
+
+ my $self = $class->SUPER::_init( _conf => $conf );
+
+ return $self;
+}
+
+=pod
+
+=head2 $href = $cb->module_tree( [@modules_names_list] )
+
+Returns a reference to the CPANPLUS module tree.
+
+If you give it any arguments, they will be treated as module names
+and C<module_tree> will try to look up these module names and
+return the corresponding module objects instead.
+
+See L<CPANPLUS::Module> for the operations you can perform on a
+module object.
+
+=cut
+
+sub module_tree {
+ my $self = shift;
+ my $modtree = $self->_module_tree;
+
+ if( @_ ) {
+ my @rv;
+ for my $name ( grep { defined } @_) {
+
+ ### From John Malmberg: This is failing on VMS
+ ### because ODS-2 does not retain the case of
+ ### filenames that are created.
+ ### The problem is the filename is being converted
+ ### to a module name and then looked up in the
+ ### %$modtree hash.
+ ###
+ ### As a fix, we do a search on VMS instead --
+ ### more cpu cycles, but it gets around the case
+ ### problem --kane
+ my ($modobj) = do {
+ ON_VMS
+ ? $self->search(
+ type => 'module',
+ allow => [qr/^$name$/i],
+ )
+ : $modtree->{$name}
+ };
+
+ push @rv, $modobj || '';
+ }
+ return @rv == 1 ? $rv[0] : @rv;
+ } else {
+ return $modtree;
+ }
+}
+
+=pod
+
+=head2 $href = $cb->author_tree( [@author_names_list] )
+
+Returns a reference to the CPANPLUS author tree.
+
+If you give it any arguments, they will be treated as author names
+and C<author_tree> will try to look up these author names and
+return the corresponding author objects instead.
+
+See L<CPANPLUS::Module::Author> for the operations you can perform on
+an author object.
+
+=cut
+
+sub author_tree {
+ my $self = shift;
+ my $authtree = $self->_author_tree;
+
+ if( @_ ) {
+ my @rv;
+ for my $name (@_) {
+ push @rv, $authtree->{$name} || '';
+ }
+ return @rv == 1 ? $rv[0] : @rv;
+ } else {
+ return $authtree;
+ }
+}
+
+=pod
+
+=head2 $conf = $cb->configure_object;
+
+Returns a copy of the C<CPANPLUS::Configure> object.
+
+See L<CPANPLUS::Configure> for operations you can perform on a
+configure object.
+
+=cut
+
+sub configure_object { return shift->_conf() };
+
+=head2 $su = $cb->selfupdate_object;
+
+Returns a copy of the C<CPANPLUS::Selfupdate> object.
+
+See the L<CPANPLUS::Selfupdate> manpage for the operations
+you can perform on the selfupdate object.
+
+=cut
+
+sub selfupdate_object { return shift->_selfupdate() };
+
+=pod
+
+=head2 @mods = $cb->search( type => TYPE, allow => AREF, [data => AREF, verbose => BOOL] )
+
+C<search> enables you to search for either module or author objects,
+based on their data. The C<type> you can specify is any of the
+accessors specified in C<CPANPLUS::Module::Author> or
+C<CPANPLUS::Module>. C<search> will determine by the C<type> you
+specified whether to search by author object or module object.
+
+You have to specify an array reference of regular expressions or
+strings to match against. The rules used for this array ref are the
+same as in C<Params::Check>, so read that manpage for details.
+
+The search is an C<or> search, meaning that if C<any> of the criteria
+match, the search is considered to be successful.
+
+You can specify the result of a previous search as C<data> to limit
+the new search to these module or author objects, rather than the
+entire module or author tree. This is how you do C<and> searches.
+
+Returns a list of module or author objects on success and false
+on failure.
+
+See L<CPANPLUS::Module> for the operations you can perform on a
+module object.
+See L<CPANPLUS::Module::Author> for the operations you can perform on
+an author object.
+
+=cut
+
+sub search {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my ($type);
+ my $args = do {
+ local $Params::Check::NO_DUPLICATES = 0;
+ local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ type => { required => 1, allow => [CPANPLUS::Module->accessors(),
+ CPANPLUS::Module::Author->accessors()], store => \$type },
+ allow => { required => 1, default => [ ], strict_type => 1 },
+ };
+
+ check( $tmpl, \%hash )
+ } or return;
+
+ ### figure out whether it was an author or a module search
+ ### when ambiguous, it'll be an author search.
+ my $aref;
+ if( grep { $type eq $_ } CPANPLUS::Module::Author->accessors() ) {
+ $aref = $self->_search_author_tree( %$args );
+ } else {
+ $aref = $self->_search_module_tree( %$args );
+ }
+
+ return @$aref if $aref;
+ return;
+}
+
+=pod
+
+=head2 $backend_rv = $cb->fetch( modules => \@mods )
+
+Fetches a list of modules. C<@mods> can be a list of distribution
+names, module names or module objects--basically anything that
+L<parse_module> can understand.
+
+See the equivalent method in C<CPANPLUS::Module> for details on
+other options you can pass.
+
+Since this is a multi-module method call, the return value is
+implemented as a C<CPANPLUS::Backend::RV> object. Please consult
+that module's documentation on how to interpret the return value.
+
+=head2 $backend_rv = $cb->extract( modules => \@mods )
+
+Extracts a list of modules. C<@mods> can be a list of distribution
+names, module names or module objects--basically anything that
+L<parse_module> can understand.
+
+See the equivalent method in C<CPANPLUS::Module> for details on
+other options you can pass.
+
+Since this is a multi-module method call, the return value is
+implemented as a C<CPANPLUS::Backend::RV> object. Please consult
+that module's documentation on how to interpret the return value.
+
+=head2 $backend_rv = $cb->install( modules => \@mods )
+
+Installs a list of modules. C<@mods> can be a list of distribution
+names, module names or module objects--basically anything that
+L<parse_module> can understand.
+
+See the equivalent method in C<CPANPLUS::Module> for details on
+other options you can pass.
+
+Since this is a multi-module method call, the return value is
+implemented as a C<CPANPLUS::Backend::RV> object. Please consult
+that module's documentation on how to interpret the return value.
+
+=head2 $backend_rv = $cb->readme( modules => \@mods )
+
+Fetches the readme for a list of modules. C<@mods> can be a list of
+distribution names, module names or module objects--basically
+anything that L<parse_module> can understand.
+
+See the equivalent method in C<CPANPLUS::Module> for details on
+other options you can pass.
+
+Since this is a multi-module method call, the return value is
+implemented as a C<CPANPLUS::Backend::RV> object. Please consult
+that module's documentation on how to interpret the return value.
+
+=head2 $backend_rv = $cb->files( modules => \@mods )
+
+Returns a list of files used by these modules if they are installed.
+C<@mods> can be a list of distribution names, module names or module
+objects--basically anything that L<parse_module> can understand.
+
+See the equivalent method in C<CPANPLUS::Module> for details on
+other options you can pass.
+
+Since this is a multi-module method call, the return value is
+implemented as a C<CPANPLUS::Backend::RV> object. Please consult
+that module's documentation on how to interpret the return value.
+
+=head2 $backend_rv = $cb->distributions( modules => \@mods )
+
+Returns a list of module objects representing all releases for this
+module on success.
+C<@mods> can be a list of distribution names, module names or module
+objects, basically anything that L<parse_module> can understand.
+
+See the equivalent method in C<CPANPLUS::Module> for details on
+other options you can pass.
+
+Since this is a multi-module method call, the return value is
+implemented as a C<CPANPLUS::Backend::RV> object. Please consult
+that module's documentation on how to interpret the return value.
+
+=cut
+
+### XXX add direcotry_tree, packlist etc? or maybe remove files? ###
+for my $func (qw[fetch extract install readme files distributions]) {
+ no strict 'refs';
+
+ *$func = sub {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my ($mods);
+ my $args = do {
+ local $Params::Check::NO_DUPLICATES = 1;
+ local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ modules => { default => [], strict_type => 1,
+ required => 1, store => \$mods },
+ };
+
+ check( $tmpl, \%hash );
+ } or return;
+
+ ### make them all into module objects ###
+ my %mods = map { $_ => $self->parse_module(module => $_) || '' } @$mods;
+
+ my $flag; my $href;
+ while( my($name,$obj) = each %mods ) {
+ $href->{$name} = IS_MODOBJ->( mod => $obj )
+ ? $obj->$func( %$args )
+ : undef;
+
+ $flag++ unless $href->{$name};
+ }
+
+ return CPANPLUS::Backend::RV->new(
+ function => $func,
+ ok => !$flag,
+ rv => $href,
+ args => \%hash,
+ );
+ }
+}
+
+=pod
+
+=head2 $mod_obj = $cb->parse_module( module => $modname|$distname|$modobj|URI|PATH )
+
+C<parse_module> tries to find a C<CPANPLUS::Module> object that
+matches your query. Here's a list of examples you could give to
+C<parse_module>;
+
+=over 4
+
+=item Text::Bastardize
+
+=item Text-Bastardize
+
+=item Text-Bastardize-1.06
+
+=item AYRNIEU/Text-Bastardize
+
+=item AYRNIEU/Text-Bastardize-1.06
+
+=item AYRNIEU/Text-Bastardize-1.06.tar.gz
+
+=item http://example.com/Text-Bastardize-1.06.tar.gz
+
+=item file:///tmp/Text-Bastardize-1.06.tar.gz
+
+=item /tmp/Text-Bastardize-1.06
+
+=item ./Text-Bastardize-1.06
+
+=item .
+
+=back
+
+These items would all come up with a C<CPANPLUS::Module> object for
+C<Text::Bastardize>. The ones marked explicitly as being version 1.06
+would give back a C<CPANPLUS::Module> object of that version.
+Even if the version on CPAN is currently higher.
+
+The last three are examples of PATH resolution. In the first, we supply
+an absolute path to the unwrapped distribution. In the second the
+distribution is relative to the current working directory.
+In the third, we will use the current working directory.
+
+If C<parse_module> is unable to actually find the module you are looking
+for in its module tree, but you supplied it with an author, module
+and version part in a distribution name or URI, it will create a fake
+C<CPANPLUS::Module> object for you, that you can use just like the
+real thing.
+
+See L<CPANPLUS::Module> for the operations you can perform on a
+module object.
+
+If even this fancy guessing doesn't enable C<parse_module> to create
+a fake module object for you to use, it will warn about an error and
+return false.
+
+=cut
+
+sub parse_module {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my $mod;
+ my $tmpl = {
+ module => { required => 1, store => \$mod },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ return $mod if IS_MODOBJ->( module => $mod );
+
+ ### ok, so it's not a module object, but a ref nonetheless?
+ ### what are you smoking?
+ if( ref $mod ) {
+ error(loc("Can not parse module string from reference '%1'", $mod ));
+ return;
+ }
+
+ ### check only for allowed characters in a module name
+ unless( $mod =~ /[^\w:]/ ) {
+
+ ### perhaps we can find it in the module tree?
+ my $maybe = $self->module_tree($mod);
+ return $maybe if IS_MODOBJ->( module => $maybe );
+ }
+
+ ### Special case arbitary file paths such as '.' etc.
+ if ( $mod and -d File::Spec->rel2abs($mod) ) {
+ my $dir = File::Spec->rel2abs($mod);
+ my $parent = File::Spec->rel2abs( File::Spec->catdir( $dir, '..' ) );
+
+ ### fix paths on VMS
+ if (ON_VMS) {
+ $dir = VMS::Filespec::unixify($dir);
+ $parent = VMS::Filespec::unixify($parent);
+ }
+
+ my $dist = $mod = File::Basename::basename($dir);
+ $dist .= '-0' unless $dist =~ /\-[0-9._]+$/;
+ $dist .= '.tar.gz' unless $dist =~ /\.[A-Za-z]+$/;
+
+ my $modobj = CPANPLUS::Module::Fake->new(
+ module => $mod,
+ version => 0,
+ package => $dist,
+ path => $parent,
+ author => CPANPLUS::Module::Author::Fake->new
+ );
+
+ ### better guess for the version
+ $modobj->version( $modobj->package_version )
+ if defined $modobj->package_version;
+
+ ### better guess at module name, if possible
+ if ( my $pkgname = $modobj->package_name ) {
+ $pkgname =~ s/-/::/g;
+
+ ### no sense replacing it unless we changed something
+ $modobj->module( $pkgname )
+ if ($pkgname ne $modobj->package_name) || $pkgname !~ /-/;
+ }
+
+ $modobj->status->fetch( $parent );
+ $modobj->status->extract( $dir );
+ $modobj->get_installer_type;
+ return $modobj;
+ }
+
+ ### ok, so it looks like a distribution then?
+ my @parts = split '/', $mod;
+ my $dist = pop @parts;
+
+ ### ah, it's a URL
+ if( $mod =~ m|\w+://.+| ) {
+ my $modobj = CPANPLUS::Module::Fake->new(
+ module => $dist,
+ version => 0,
+ package => $dist,
+ path => File::Spec::Unix->catdir(
+ $conf->_get_mirror('base'),
+ UNKNOWN_DL_LOCATION ),
+ author => CPANPLUS::Module::Author::Fake->new
+ );
+
+ ### set the fetch_from accessor so we know to by pass the
+ ### usual mirrors
+ $modobj->status->_fetch_from( $mod );
+
+ ### better guess for the version
+ $modobj->version( $modobj->package_version )
+ if defined $modobj->package_version;
+
+ ### better guess at module name, if possible
+ if ( my $pkgname = $modobj->package_name ) {
+ $pkgname =~ s/-/::/g;
+
+ ### no sense replacing it unless we changed something
+ $modobj->module( $pkgname )
+ if ($pkgname ne $modobj->package_name) || $pkgname !~ /-/;
+ }
+
+ return $modobj;
+ }
+
+ ### perhaps we can find it's a third party module?
+ { my $modobj = CPANPLUS::Module::Fake->new(
+ module => $mod,
+ version => 0,
+ package => $dist,
+ path => File::Spec::Unix->catdir(
+ $conf->_get_mirror('base'),
+ UNKNOWN_DL_LOCATION ),
+ author => CPANPLUS::Module::Author::Fake->new
+ );
+ if( $modobj->is_third_party ) {
+ my $info = $modobj->third_party_information;
+
+ $modobj->author->author( $info->{author} );
+ $modobj->author->email( $info->{author_url} );
+ $modobj->description( $info->{url} );
+
+ return $modobj;
+ }
+ }
+
+ unless( $dist ) {
+ error( loc("%1 is not a proper distribution name!", $mod) );
+ return;
+ }
+
+ ### there's wonky uris out there, like this:
+ ### E/EY/EYCK/Net/Lite/Net-Lite-FTP-0.091
+ ### compensate for that
+ my $author;
+ ### you probably have an A/AB/ABC/....../Dist.tgz type uri
+ if( (defined $parts[0] and length $parts[0] == 1) and
+ (defined $parts[1] and length $parts[1] == 2) and
+ $parts[2] =~ /^$parts[0]/i and $parts[2] =~ /^$parts[1]/i
+ ) {
+ splice @parts, 0, 2; # remove the first 2 entries from the list
+ $author = shift @parts; # this is the actual author name then
+
+ ### we''ll assume a ABC/..../Dist.tgz
+ } else {
+ $author = shift @parts || '';
+ }
+
+ my($pkg, $version, $ext, $full) =
+ $self->_split_package_string( package => $dist );
+
+ ### translate a distribution into a module name ###
+ my $guess = $pkg;
+ $guess =~ s/-/::/g if $guess;
+
+ my $maybe = $self->module_tree( $guess );
+ if( IS_MODOBJ->( module => $maybe ) ) {
+
+ ### maybe you asked for a package instead
+ if ( $maybe->package eq $mod ) {
+ return $maybe;
+
+ ### perhaps an outdated version instead?
+ } elsif ( $version ) {
+ my $auth_obj; my $path;
+
+ ### did you give us an author part? ###
+ if( $author ) {
+ $auth_obj = CPANPLUS::Module::Author::Fake->new(
+ _id => $maybe->_id,
+ cpanid => uc $author,
+ author => uc $author,
+ );
+ $path = File::Spec::Unix->catdir(
+ $conf->_get_mirror('base'),
+ substr(uc $author, 0, 1),
+ substr(uc $author, 0, 2),
+ uc $author,
+ @parts, #possible sub dirs
+ );
+ } else {
+ $auth_obj = $maybe->author;
+ $path = $maybe->path;
+ }
+
+ if( $maybe->package_name eq $pkg ) {
+
+ my $modobj = CPANPLUS::Module::Fake->new(
+ module => $maybe->module,
+ version => $version,
+ ### no extension? use the extension the original package
+ ### had instead
+ package => do { $ext
+ ? $full
+ : $full .'.'. $maybe->package_extension
+ },
+ path => $path,
+ author => $auth_obj,
+ _id => $maybe->_id
+ );
+ return $modobj;
+
+ ### you asked for a specific version?
+ ### assume our $maybe is the one you wanted,
+ ### and fix up the version..
+ } else {
+
+ my $modobj = $maybe->clone;
+ $modobj->version( $version );
+ $modobj->package(
+ $maybe->package_name .'-'.
+ $version .'.'.
+ $maybe->package_extension
+ );
+
+ ### you wanted a specific author, but it's not the one
+ ### from the module tree? we'll fix it up
+ if( $author and $author ne $modobj->author->cpanid ) {
+ $modobj->author( $auth_obj );
+ $modobj->path( $path );
+ }
+
+ return $modobj;
+ }
+
+ ### you didn't care about a version, so just return the object then
+ } elsif ( !$version ) {
+ return $maybe;
+ }
+
+ ### ok, so we can't find it, and it's not an outdated dist either
+ ### perhaps we can fake one based on the author name and so on
+ } elsif ( $author and $version ) {
+
+ ### be extra friendly and pad the .tar.gz suffix where needed
+ ### it's just a guess of course, but most dists are .tar.gz
+ $dist .= '.tar.gz' unless $dist =~ /\.[A-Za-z]+$/;
+
+ ### XXX duplication from above for generating author obj + path...
+ my $modobj = CPANPLUS::Module::Fake->new(
+ module => $guess,
+ version => $version,
+ package => $dist,
+ author => CPANPLUS::Module::Author::Fake->new(
+ author => uc $author,
+ cpanid => uc $author,
+ _id => $self->_id,
+ ),
+ path => File::Spec::Unix->catdir(
+ $conf->_get_mirror('base'),
+ substr(uc $author, 0, 1),
+ substr(uc $author, 0, 2),
+ uc $author,
+ @parts, #possible subdirs
+ ),
+ _id => $self->_id,
+ );
+
+ return $modobj;
+
+ ### face it, we have /no/ idea what he or she wants...
+ ### let's start putting the blame somewhere
+ } else {
+
+ # Lets not give up too easily. There is one last chance
+ # http://perlmonks.org/?node_id=805957
+ # This should catch edge-cases where the package name
+ # is unrelated to the modules it contains.
+
+ my ($modobj) = grep { $_->package_name eq $mod }
+ $self->search( type => 'package', allow => [ qr/^\Q$mod\E/ ], );
+ return $modobj if IS_MODOBJ->( module => $modobj );
+
+ unless( $author ) {
+ error( loc( "'%1' does not contain an author part", $mod ) );
+ }
+
+ error( loc( "Cannot find '%1' in the module tree", $mod ) );
+ }
+
+ return;
+}
+
+=pod
+
+=head2 $bool = $cb->reload_indices( [update_source => BOOL, verbose => BOOL] );
+
+This method reloads the source files.
+
+If C<update_source> is set to true, this will fetch new source files
+from your CPAN mirror. Otherwise, C<reload_indices> will do its
+usual cache checking and only update them if they are out of date.
+
+By default, C<update_source> will be false.
+
+The verbose setting defaults to what you have specified in your
+config file.
+
+Returns true on success and false on failure.
+
+=cut
+
+sub reload_indices {
+ my $self = shift;
+ my %hash = @_;
+ my $conf = $self->configure_object;
+
+ my $tmpl = {
+ update_source => { default => 0, allow => [qr/^\d$/] },
+ verbose => { default => $conf->get_conf('verbose') },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ ### make a call to the internal _module_tree, so it triggers cache
+ ### file age
+ my $uptodate = $self->_check_trees( %$args );
+
+
+ return 1 if $self->_build_trees(
+ uptodate => $uptodate,
+ use_stored => 0,
+ verbose => $conf->get_conf('verbose'),
+ );
+
+ error( loc( "Error rebuilding source trees!" ) );
+
+ return;
+}
+
+=pod
+
+=head2 $bool = $cb->flush(CACHE_NAME)
+
+This method allows flushing of caches.
+There are several things which can be flushed:
+
+=over 4
+
+=item * C<methods>
+
+The return status of methods which have been attempted, such as
+different ways of fetching files. It is recommended that automatic
+flushing be used instead.
+
+=item * C<hosts>
+
+The return status of URIs which have been attempted, such as
+different hosts of fetching files. It is recommended that automatic
+flushing be used instead.
+
+=item * C<modules>
+
+Information about modules such as prerequisites and whether
+installation succeeded, failed, or was not attempted.
+
+=item * C<lib>
+
+This resets PERL5LIB, which is changed to ensure that while installing
+modules they are in our @INC.
+
+=item * C<load>
+
+This resets the cache of modules we've attempted to load, but failed.
+This enables you to load them again after a failed load, if they
+somehow have become available.
+
+=item * C<all>
+
+Flush all of the aforementioned caches.
+
+=back
+
+Returns true on success and false on failure.
+
+=cut
+
+sub flush {
+ my $self = shift;
+ my $type = shift or return;
+
+ my $cache = {
+ methods => [ qw( methods load ) ],
+ hosts => [ qw( hosts ) ],
+ modules => [ qw( modules lib) ],
+ lib => [ qw( lib ) ],
+ load => [ qw( load ) ],
+ all => [ qw( hosts lib modules methods load ) ],
+ };
+
+ my $aref = $cache->{$type}
+ or (
+ error( loc("No such cache '%1'", $type) ),
+ return
+ );
+
+ return $self->_flush( list => $aref );
+}
+
+=pod
+
+=head2 @mods = $cb->installed()
+
+Returns a list of module objects of all your installed modules.
+If an error occurs, it will return false.
+
+See L<CPANPLUS::Module> for the operations you can perform on a
+module object.
+
+=cut
+
+sub installed {
+ my $self = shift;
+ my $aref = $self->_all_installed;
+
+ return @$aref if $aref;
+ return;
+}
+
+=pod
+
+=head2 $bool = $cb->local_mirror([path => '/dir/to/save/to', index_files => BOOL, force => BOOL, verbose => BOOL] )
+
+Creates a local mirror of CPAN, of only the most recent sources in a
+location you specify. If you set this location equal to a custom host
+in your C<CPANPLUS::Config> you can use your local mirror to install
+from.
+
+It takes the following arguments:
+
+=over 4
+
+=item path
+
+The location where to create the local mirror.
+
+=item index_files
+
+Enable/disable fetching of index files. You can disable fetching of the
+index files if you don't plan to use the local mirror as your primary
+site, or if you'd like up-to-date index files be fetched from elsewhere.
+
+Defaults to true.
+
+=item force
+
+Forces refetching of packages, even if they are there already.
+
+Defaults to whatever setting you have in your C<CPANPLUS::Config>.
+
+=item verbose
+
+Prints more messages about what its doing.
+
+Defaults to whatever setting you have in your C<CPANPLUS::Config>.
+
+=back
+
+Returns true on success and false on error.
+
+=cut
+
+sub local_mirror {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($path, $index, $force, $verbose);
+ my $tmpl = {
+ path => { default => $conf->get_conf('base'),
+ store => \$path },
+ index_files => { default => 1, store => \$index },
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ unless( -d $path ) {
+ $self->_mkdir( dir => $path )
+ or( error( loc( "Could not create '%1', giving up", $path ) ),
+ return
+ );
+ } elsif ( ! -w _ ) {
+ error( loc( "Could not write to '%1', giving up", $path ) );
+ return;
+ }
+
+ my $flag;
+ AUTHOR: {
+ for my $auth ( sort { $a->cpanid cmp $b->cpanid }
+ values %{$self->author_tree}
+ ) {
+
+ MODULE: {
+ my $i;
+ for my $mod ( $auth->modules ) {
+ my $fetchdir = File::Spec->catdir( $path, $mod->path );
+
+ my %opts = (
+ verbose => $verbose,
+ force => $force,
+ fetchdir => $fetchdir,
+ );
+
+ ### only do this the for the first module ###
+ unless( $i++ ) {
+ $mod->_get_checksums_file(
+ %opts
+ ) or (
+ error( loc( "Could not fetch %1 file, " .
+ "skipping author '%2'",
+ CHECKSUMS, $auth->cpanid ) ),
+ $flag++, next AUTHOR
+ );
+ }
+
+ $mod->fetch( %opts )
+ or( error( loc( "Could not fetch '%1'", $mod->module ) ),
+ $flag++, next MODULE
+ );
+ } }
+ } }
+
+ if( $index ) {
+ for my $name (qw[auth dslip mod]) {
+ $self->_update_source(
+ name => $name,
+ verbose => $verbose,
+ path => $path,
+ ) or ( $flag++, next );
+ }
+ }
+
+ return !$flag;
+}
+
+=pod
+
+=head2 $file = $cb->autobundle([path => OUTPUT_PATH, force => BOOL, verbose => BOOL])
+
+Writes out a snapshot of your current installation in C<CPAN> bundle
+style. This can then be used to install the same modules for a
+different or on a different machine by issuing the following commands:
+
+ ### using the default shell:
+ CPAN Terminal> i file://path/to/Snapshot_XXYY.pm
+
+ ### using the API
+ $modobj = $cb->parse_module( module => 'file://path/to/Snapshot_XXYY.pm' );
+ $modobj->install;
+
+It will, by default, write to an 'autobundle' directory under your
+cpanplus homedirectory, but you can override that by supplying a
+C<path> argument.
+
+It will return the location of the output file on success and false on
+failure.
+
+=cut
+
+sub autobundle {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($path,$force,$verbose);
+ my $tmpl = {
+ force => { default => $conf->get_conf('force'), store => \$force },
+ verbose => { default => $conf->get_conf('verbose'), store => \$verbose },
+ path => { default => File::Spec->catdir(
+ $conf->get_conf('base'),
+ $self->_perl_version( perl => $^X ),
+ $conf->_get_build('distdir'),
+ $conf->_get_build('autobundle') ),
+ store => \$path },
+ };
+
+ check($tmpl, \%hash) or return;
+
+ unless( -d $path ) {
+ $self->_mkdir( dir => $path )
+ or( error(loc("Could not create directory '%1'", $path ) ),
+ return
+ );
+ }
+
+ my $name; my $file;
+ { ### default filename for the bundle ###
+ my($year,$month,$day) = (localtime)[5,4,3];
+ $year += 1900; $month++;
+
+ my $ext = 0;
+
+ my $prefix = $conf->_get_build('autobundle_prefix');
+ my $format = "${prefix}_%04d_%02d_%02d_%02d";
+
+ BLOCK: {
+ $name = sprintf( $format, $year, $month, $day, $ext);
+
+ $file = File::Spec->catfile( $path, $name . '.pm' );
+
+ -f $file ? ++$ext && redo BLOCK : last BLOCK;
+ }
+ }
+ my $fh;
+ unless( $fh = FileHandle->new( ">$file" ) ) {
+ error( loc( "Could not open '%1' for writing: %2", $file, $! ) );
+ return;
+ }
+
+ ### make sure we load the module tree *before* doing this, as it
+ ### starts to chdir all over the place
+ $self->module_tree;
+
+ my $string = join "\n\n",
+ map {
+ join ' ',
+ $_->module,
+ ($_->installed_version(verbose => 0) || 'undef')
+ } sort {
+ $a->module cmp $b->module
+ } $self->installed;
+
+ my $now = scalar localtime;
+ my $head = '=head1';
+ my $pkg = __PACKAGE__;
+ my $version = $self->VERSION;
+ my $perl_v = join '', `$^X -V`;
+
+ print $fh <<EOF;
+package $name;
+
+\$VERSION = '0.01';
+
+1;
+
+__END__
+
+$head NAME
+
+$name - Snapshot of your installation at $now
+
+$head SYNOPSIS
+
+To install the modules from this snapshot, run:
+
+ cpanp -i file://full/path/to/${name}.pm
+
+$head CONTENTS
+
+$string
+
+$head CONFIGURATION
+
+$perl_v
+
+$head AUTHOR
+
+This bundle has been generated autotomatically by
+ $pkg $version
+
+EOF
+
+ close $fh;
+
+ return $file;
+}
+
+=head2 $bool = $cb->save_state
+
+Explicit command to save memory state to disk. This can be used to save
+information to disk about where a module was extracted, the result of
+C<make test>, etc. This will then be re-loaded into memory when a new
+session starts.
+
+The capability of saving state to disk depends on the source engine
+being used (See C<CPANPLUS::Config> for the option to choose your
+source engine). The default storage engine supports this option.
+
+Most users will not need this command, but it can handy for automated
+systems like setting up CPAN smoke testers.
+
+The method will return true if it managed to save the state to disk,
+or false if it did not.
+
+=cut
+
+sub save_state {
+ my $self = shift;
+ return $self->_save_state( @_ );
+}
+
+
+### XXX these wrappers are not individually tested! only the underlying
+### code through source.t and indirectly trought he CustomSource plugin.
+=pod
+
+=head1 CUSTOM MODULE SOURCES
+
+Besides the sources as provided by the general C<CPAN> mirrors, it's
+possible to add your own sources list to your C<CPANPLUS> index.
+
+The methodology behind this works much like C<Debian's apt-sources>.
+
+The methods below show you how to make use of this functionality. Also
+note that most of these methods are available through the default shell
+plugin command C</cs>, making them available as shortcuts through the
+shell and via the commandline.
+
+=head2 %files = $cb->list_custom_sources
+
+Returns a mapping of registered custom sources and their local indices
+as follows:
+
+ /full/path/to/local/index => http://remote/source
+
+Note that any file starting with an C<#> is being ignored.
+
+=cut
+
+sub list_custom_sources {
+ return shift->__list_custom_module_sources( @_ );
+}
+
+=head2 $local_index = $cb->add_custom_source( uri => URI, [verbose => BOOL] );
+
+Adds an C<URI> to your own sources list and mirrors its index. See the
+documentation on C<< $cb->update_custom_source >> on how this is done.
+
+Returns the full path to the local index on success, or false on failure.
+
+Note that when adding a new C<URI>, the change to the in-memory tree is
+not saved until you rebuild or save the tree to disk again. You can do
+this using the C<< $cb->reload_indices >> method.
+
+=cut
+
+sub add_custom_source {
+ return shift->_add_custom_module_source( @_ );
+}
+
+=head2 $local_index = $cb->remove_custom_source( uri => URI, [verbose => BOOL] );
+
+Removes an C<URI> from your own sources list and removes its index.
+
+To find out what C<URI>s you have as part of your own sources list, use
+the C<< $cb->list_custom_sources >> method.
+
+Returns the full path to the deleted local index file on success, or false
+on failure.
+
+=cut
+
+### XXX do clever dispatching based on arg number?
+sub remove_custom_source {
+ return shift->_remove_custom_module_source( @_ );
+}
+
+=head2 $bool = $cb->update_custom_source( [remote => URI] );
+
+Updates the indexes for all your custom sources. It does this by fetching
+a file called C<packages.txt> in the root of the custom sources's C<URI>.
+If you provide the C<remote> argument, it will only update the index for
+that specific C<URI>.
+
+Here's an example of how custom sources would resolve into index files:
+
+ file:///path/to/sources => file:///path/to/sources/packages.txt
+ http://example.com/sources => http://example.com/sources/packages.txt
+ ftp://example.com/sources => ftp://example.com/sources/packages.txt
+
+The file C<packages.txt> simply holds a list of packages that can be found
+under the root of the C<URI>. This file can be automatically generated for
+you when the remote source is a C<file:// URI>. For C<http://>, C<ftp://>,
+and similar, the administrator of that repository should run the method
+C<< $cb->write_custom_source_index >> on the repository to allow remote
+users to index it.
+
+For details, see the C<< $cb->write_custom_source_index >> method below.
+
+All packages that are added via this mechanism will be attributed to the
+author with C<CPANID> C<LOCAL>. You can use this id to search for all
+added packages.
+
+=cut
+
+sub update_custom_source {
+ my $self = shift;
+
+ ### if it mentions /remote/, the request is to update a single uri,
+ ### not all the ones we have, so dispatch appropriately
+ my $rv = grep( /remote/i, @_)
+ ? $self->__update_custom_module_source( @_ )
+ : $self->__update_custom_module_sources( @_ );
+
+ return $rv;
+}
+
+=head2 $file = $cb->write_custom_source_index( path => /path/to/package/root, [to => /path/to/index/file, verbose => BOOL] );
+
+Writes the index for a custom repository root. Most users will not have to
+worry about this, but administrators of a repository will need to make sure
+their indexes are up to date.
+
+The index will be written to a file called C<packages.txt> in your repository
+root, which you can specify with the C<path> argument. You can override this
+location by specifying the C<to> argument, but in normal operation, that should
+not be required.
+
+Once the index file is written, users can then add the C<URI> pointing to
+the repository to their custom list of sources and start using it right away. See the C<< $cb->add_custom_source >> method for user details.
+
+=cut
+
+sub write_custom_source_index {
+ return shift->__write_custom_module_index( @_ );
+}
+
+1;
+
+=pod
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<CPANPLUS::Configure>, L<CPANPLUS::Module>, L<CPANPLUS::Module::Author>,
+L<CPANPLUS::Selfupdate>
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
+__END__
+
+todo:
+sub dist { # not sure about this one -- probably already done
+ enough in Module.pm
+sub reports { # in Module.pm, wrapper here
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Backend/RV.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Backend/RV.pm
new file mode 100755
index 00000000000..9edbe0452c9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Backend/RV.pm
@@ -0,0 +1,144 @@
+package CPANPLUS::Backend::RV;
+
+use strict;
+use vars qw[$STRUCT];
+
+
+use CPANPLUS::Error;
+use CPANPLUS::Internals::Constants;
+
+use IPC::Cmd qw[can_run run];
+use Params::Check qw[check];
+
+use base 'Object::Accessor';
+
+local $Params::Check::VERBOSE = 1;
+
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Backend::RV
+
+=head1 SYNOPSIS
+
+ ### create a CPANPLUS::Backend::RV object
+ $backend_rv = CPANPLUS::Backend::RV->new(
+ ok => $boolean,
+ args => $args,
+ rv => $return_value
+ function => $calling_function );
+
+ ### if you have a CPANPLUS::Backend::RV object
+ $passed_args = $backend_rv->args; # args passed to function
+ $ok = $backend_rv->ok; # boolean indication overall
+ # result of the call
+ $function = $backend_rv->fucntion # name of the calling
+ # function
+ $rv = $backend_rv->rv # the actual return value
+ # of the calling function
+
+=head1 DESCRIPTION
+
+This module provides return value objects for multi-module
+calls to CPANPLUS::Backend. In boolean context, it returns the status
+of the overall result (ie, the same as the C<ok> method would).
+
+=head1 METHODS
+
+=head2 new( ok => BOOL, args => DATA, rv => DATA, [function => $method_name] )
+
+Creates a new CPANPLUS::Backend::RV object from the data provided.
+This method should only be called by CPANPLUS::Backend functions.
+The accessors may be used by users inspecting an RV object.
+
+All the argument names can be used as accessors later to retrieve the
+data.
+
+Arguments:
+
+=over 4
+
+=item ok
+
+Boolean indicating overall success
+
+=item args
+
+The arguments provided to the function that returned this rv object.
+Useful to inspect later to see what was actually passed to the function
+in case of an error.
+
+=item rv
+
+An arbitrary data structure that has the detailed return values of each
+of your multi-module calls.
+
+=item function
+
+The name of the function that created this rv object.
+Can be explicitly passed. If not, C<new()> will try to deduce the name
+from C<caller()> information.
+
+=back
+
+=cut
+
+sub new {
+ my $class = shift;
+ my %hash = @_;
+
+ my $tmpl = {
+ ok => { required => 1, allow => BOOLEANS },
+ args => { required => 1 },
+ rv => { required => 1 },
+ function => { default => CALLING_FUNCTION->() },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+ my $self = bless {}, $class;
+
+# $self->mk_accessors( qw[ok args function rv] );
+ $self->mk_accessors( keys %$tmpl );
+
+ ### set the values passed in the struct ###
+ while( my($key,$val) = each %$args ) {
+ $self->$key( $val );
+ }
+
+ return $self;
+}
+
+sub _ok { return shift->ok }
+#sub _stringify { Carp::carp( "stringifying!" ); overload::StrVal( shift ) }
+
+### make it easier to check if($rv) { foo() }
+### this allows people to not have to explicitly say
+### if( $rv->ok ) { foo() }
+### XXX add an explicit stringify, so it doesn't fall back to "bool"? :(
+use overload bool => \&_ok,
+# '""' => \&_stringify,
+ fallback => 1;
+
+=pod
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Config.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Config.pm
new file mode 100755
index 00000000000..71d2b4fd03a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Config.pm
@@ -0,0 +1,849 @@
+package CPANPLUS::Config;
+
+use strict;
+use warnings;
+
+use base 'Object::Accessor';
+
+use base 'CPANPLUS::Internals::Utils';
+
+use Config;
+use File::Spec;
+use Module::Load;
+use CPANPLUS;
+use CPANPLUS::Error;
+use CPANPLUS::Internals::Constants;
+
+use File::Basename qw[dirname];
+use IPC::Cmd qw[can_run];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+use Module::Load::Conditional qw[check_install];
+
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Config
+
+=head1 SYNOPSIS
+
+ ### conf object via CPANPLUS::Backend;
+ $cb = CPANPLUS::Backend->new;
+ $conf = $cb->configure_object;
+
+ ### or as a standalone object
+ $conf = CPANPLUS::Configure->new;
+
+ ### values in 'conf' section
+ $verbose = $conf->get_conf( 'verbose' );
+ $conf->set_conf( verbose => 1 );
+
+ ### values in 'program' section
+ $editor = $conf->get_program( 'editor' );
+ $conf->set_program( editor => '/bin/vi' );
+
+=head1 DESCRIPTION
+
+This module contains defaults and heuristics for configuration
+information for CPANPLUS. To change any of these values, please
+see the documentation in C<CPANPLUS::Configure>.
+
+Below you'll find a list of configuration types and keys, and
+their meaning.
+
+=head1 CONFIGURATION
+
+=cut
+
+### BAH! you can't have POD interleaved with a hash
+### declaration.. so declare every entry seperatedly :(
+my $Conf = {
+ '_fetch' => {
+ 'blacklist' => [ 'ftp' ],
+ },
+
+ ### _source, _build and _mirror are supposed to be static
+ ### no changes should be needed unless pause/cpan changes
+ '_source' => {
+ 'hosts' => 'MIRRORED.BY',
+ 'auth' => '01mailrc.txt.gz',
+ 'stored' => 'sourcefiles',
+ 'dslip' => '03modlist.data.gz',
+ 'update' => '86400',
+ 'mod' => '02packages.details.txt.gz',
+ 'custom_index' => 'packages.txt',
+ },
+ '_build' => {
+ 'plugins' => 'plugins',
+ 'moddir' => 'build',
+ 'startdir' => '',
+ 'distdir' => 'dist',
+ 'autobundle' => 'autobundle',
+ 'autobundle_prefix' => 'Snapshot',
+ 'autdir' => 'authors',
+ 'install_log_dir' => 'install-logs',
+ 'custom_sources' => 'custom-sources',
+ 'sanity_check' => 1,
+ },
+ '_mirror' => {
+ 'base' => 'authors/id/',
+ 'auth' => 'authors/01mailrc.txt.gz',
+ 'dslip' => 'modules/03modlist.data.gz',
+ 'mod' => 'modules/02packages.details.txt.gz'
+ },
+};
+
+=head2 Section 'conf'
+
+=over 4
+
+=item hosts
+
+An array ref containing hosts entries to be queried for packages.
+
+An example entry would like this:
+
+ { 'scheme' => 'ftp',
+ 'path' => '/pub/CPAN/',
+ 'host' => 'ftp.cpan.org'
+ },
+
+=cut
+
+ ### default host list
+ $Conf->{'conf'}->{'hosts'} = [
+ {
+ 'scheme' => 'http',
+ 'path' => '/',
+ 'host' => 'cpan.strawberryperl.com'
+ },
+ {
+ 'scheme' => 'ftp',
+ 'path' => '/pub/CPAN/',
+ 'host' => 'ftp.cpan.org'
+ },
+ {
+ 'scheme' => 'http',
+ 'path' => '/',
+ 'host' => 'www.cpan.org'
+ },
+ {
+ 'scheme' => 'ftp',
+ 'path' => '/pub/CPAN/',
+ 'host' => 'ftp.nl.uu.net'
+ },
+ {
+ 'scheme' => 'ftp',
+ 'path' => '/pub/CPAN/',
+ 'host' => 'cpan.valueclick.com'
+ },
+ {
+ 'scheme' => 'ftp',
+ 'path' => '/pub/languages/perl/CPAN/',
+ 'host' => 'ftp.funet.fi'
+ }
+ ];
+
+# If we are on fake Hotel/Airport wireless,
+# prefer a minicpan to the poisoned wireless.
+if ( -d 'C:\strawberry\minicpan' ) {
+ eval {
+ require LWP::Online;
+ require URI::file;
+ 1;
+ };
+ unless ( $@ ) {
+ my $path = URI::file->new('C:\strawberry\minicpan');
+
+ if ( LWP::Online::online() ) {
+ push @{$Conf->{'conf'}->{'hosts'}}, {
+ 'path' => $path->path(),
+ 'scheme' => 'file',
+ 'host' => ''
+ };
+ } else {
+ unshift @{$Conf->{'conf'}->{'hosts'}}, {
+ 'path' => $path->path(),
+ 'scheme' => 'file',
+ 'host' => ''
+ };
+ }
+ }
+}
+
+if ( -d 'C:\minicpan' ) {
+ eval {
+ require LWP::Online;
+ require URI::file;
+ 1;
+ };
+ unless ( $@ ) {
+ my $path = URI::file->new('C:\minicpan');
+
+ if ( LWP::Online::online() ) {
+ push @{$Conf->{'conf'}->{'hosts'}}, {
+ 'path' => $path->path(),
+ 'scheme' => 'file',
+ 'host' => ''
+ };
+ } else {
+ unshift @{$Conf->{'conf'}->{'hosts'}}, {
+ 'path' => $path->path(),
+ 'scheme' => 'file',
+ 'host' => ''
+ };
+ }
+ }
+}
+
+
+=item allow_build_interactivity
+
+Boolean flag to indicate whether 'perl Makefile.PL' and similar
+are run interactively or not. Defaults to 'true'.
+
+=cut
+
+ $Conf->{'conf'}->{'allow_build_interactivity'} = 1;
+
+=item base
+
+The directory CPANPLUS keeps all its build and state information in.
+Defaults to ~/.cpanplus.
+
+=cut
+
+ $Conf->{'conf'}->{'base'} = File::Spec->catdir('C:', 'cpanplus');
+
+=item buildflags
+
+Any flags to be passed to 'perl Build.PL'. See C<perldoc Module::Build>
+for details. Defaults to an empty string.
+
+=cut
+
+ $Conf->{'conf'}->{'buildflags'} = '--uninst 1';
+
+=item cpantest
+
+Boolean flag to indicate whether or not to mail test results of module
+installations to C<http://testers.cpan.org>. Defaults to 'false'.
+
+=cut
+
+ $Conf->{'conf'}->{'cpantest'} = 0;
+
+=item cpantest_mx
+
+String holding an explicit mailserver to use when sending out emails
+for C<http://testers.cpan.org>. An empty string will use your system
+settings. Defaults to an empty string.
+
+=cut
+
+ $Conf->{'conf'}->{'cpantest_mx'} = '';
+
+=item debug
+
+Boolean flag to enable or disable extensive debuggging information.
+Defaults to 'false'.
+
+=cut
+
+ $Conf->{'conf'}->{'debug'} = 0;
+
+=item dist_type
+
+Default distribution type to use when building packages. See C<cpan2dist>
+or C<CPANPLUS::Dist> for details. An empty string will not use any
+package building software. Defaults to an empty string.
+
+=cut
+
+ $Conf->{'conf'}->{'dist_type'} = '';
+
+=item email
+
+Email address to use for anonymous ftp access and as C<from> address
+when sending emails. Defaults to an C<example.com> address.
+
+=cut
+
+ $Conf->{'conf'}->{'email'} = DEFAULT_EMAIL;
+
+=item enable_custom_sources
+
+Boolean flag indicating whether custom sources should be enabled or
+not. See the C<CUSTOM MODULE SOURCES> in C<CPANPLUS::Backend> for
+details on how to use them.
+
+Defaults to C<true>
+
+=cut
+ ### csjewell@cpan.org: This is very slow, so turning off.
+
+ ### this addresses #32248 which requests a possibillity to
+ ### turn off custom sources
+ $Conf->{'conf'}->{'enable_custom_sources'} = 0;
+
+=item extractdir
+
+String containing the directory where fetched archives should be
+extracted. An empty string will use a directory under your C<base>
+directory. Defaults to an empty string.
+
+=cut
+
+ $Conf->{'conf'}->{'extractdir'} = '';
+
+=item fetchdir
+
+String containing the directory where fetched archives should be
+stored. An empty string will use a directory under your C<base>
+directory. Defaults to an empty string.
+
+=cut
+
+ $Conf->{'conf'}->{'fetchdir'} = '';
+
+=item flush
+
+Boolean indicating whether build failures, cache dirs etc should
+be flushed after every operation or not. Defaults to 'true'.
+
+=cut
+
+ $Conf->{'conf'}->{'flush'} = 1;
+
+=item force
+
+Boolean indicating whether files should be forcefully overwritten
+if they exist, modules should be installed when they fail tests,
+etc. Defaults to 'false'.
+
+=cut
+
+ $Conf->{'conf'}->{'force'} = 0;
+
+=item lib
+
+An array ref holding directories to be added to C<@INC> when CPANPLUS
+starts up. Defaults to an empty array reference.
+
+=cut
+
+ $Conf->{'conf'}->{'lib'} = [];
+
+=item makeflags
+
+A string holding flags that will be passed to the C<make> program
+when invoked. Defaults to an empty string.
+
+=cut
+
+ $Conf->{'conf'}->{'makeflags'} = 'UNINST=1';
+
+=item makemakerflags
+
+A string holding flags that will be passed to C<perl Makefile.PL>
+when invoked. Defaults to an empty string.
+
+=cut
+
+ $Conf->{'conf'}->{'makemakerflags'} = '';
+
+=item md5
+
+A boolean indicating whether or not md5 checks should be done when
+an archive is fetched. Defaults to 'true' if you have C<Digest::MD5>
+installed, 'false' otherwise.
+
+=cut
+
+ $Conf->{'conf'}->{'md5'} = (
+ check_install( module => 'Digest::MD5' ) ? 1 : 0 );
+
+=item no_update
+
+A boolean indicating whether or not C<CPANPLUS>' source files should be
+updated or not. Defaults to 'false'.
+
+=cut
+
+ $Conf->{'conf'}->{'no_update'} = 0;
+
+=item passive
+
+A boolean indicating whether or not to use passive ftp connections.
+Defaults to 'true'.
+
+=cut
+
+ $Conf->{'conf'}->{'passive'} = 1;
+
+=item prefer_bin
+
+A boolean indicating whether or not to prefer command line programs
+over perl modules. Defaults to 'false' unless you do not have
+C<Compress::Zlib> installed (as that would mean we could not extract
+C<.tar.gz> files)
+
+=cut
+ ### if we dont have c::zlib, we'll need to use /bin/tar or we
+ ### can not extract any files. Good time to change the default
+ $Conf->{'conf'}->{'prefer_bin'} =
+ (eval {require Compress::Zlib; 1} ? 0 : 1 );
+
+=item prefer_makefile
+
+A boolean indicating whether or not prefer a C<Makefile.PL> over a
+C<Build.PL> file if both are present. Defaults to 'true'.
+
+=cut
+
+ $Conf->{'conf'}->{'prefer_makefile'} = 0;
+
+=item prereqs
+
+A digit indicating what to do when a package you are installing has a
+prerequisite. Options are:
+
+ 0 Do not install
+ 1 Install
+ 2 Ask
+ 3 Ignore (dangerous, install will probably fail!)
+
+The default is to ask.
+
+=cut
+
+ $Conf->{'conf'}->{'prereqs'} = PREREQ_INSTALL;
+
+=item shell
+
+A string holding the shell class you wish to start up when starting
+C<CPANPLUS> in interactive mode.
+
+Defaults to C<CPANPLUS::Shell::Default>, the default CPANPLUS shell.
+
+=cut
+
+ $Conf->{'conf'}->{'shell'} = 'CPANPLUS::Shell::Default';
+
+=item show_startup_tip
+
+A boolean indicating whether or not to show start up tips in the
+interactive shell. Defaults to 'true'.
+
+=cut
+
+ $Conf->{'conf'}->{'show_startup_tip'} = 1;
+
+=item signature
+
+A boolean indicating whether or not check signatures if packages are
+signed. Defaults to 'true' if you have C<gpg> or C<Crypt::OpenPGP>
+installed, 'false' otherwise.
+
+=cut
+
+ $Conf->{'conf'}->{'signature'} = do {
+ check_install( module => 'Module::Signature', version => '0.06' )
+ and ( can_run('gpg') ||
+ check_install(module => 'Crypt::OpenPGP')
+ );
+ } ? 1 : 0;
+
+=item skiptest
+
+A boolean indicating whether or not to skip tests when installing modules.
+Defaults to 'false'.
+
+=cut
+
+ $Conf->{'conf'}->{'skiptest'} = 0;
+
+=item storable
+
+A boolean indicating whether or not to use C<Storable> to write compiled
+source file information to disk. This makes for faster startup and look
+up times, but takes extra diskspace. Defaults to 'true' if you have
+C<Storable> installed and 'false' if you don't.
+
+=cut
+
+ $Conf->{'conf'}->{'storable'} =
+ ( check_install( module => 'Storable' ) ? 1 : 0 );
+
+=item timeout
+
+Digit indicating the time before a fetch request times out (in seconds).
+Defaults to 300.
+
+=cut
+
+ $Conf->{'conf'}->{'timeout'} = 300;
+
+=item verbose
+
+A boolean indicating whether or not C<CPANPLUS> runs in verbose mode.
+Defaults to 'true' if you have the environment variable
+C<PERL5_CPANPLUS_VERBOSE> set to true, 'false' otherwise.
+
+It is recommended you run with verbose enabled, but it is disabled
+for historical reasons.
+
+=cut
+
+ $Conf->{'conf'}->{'verbose'} = $ENV{PERL5_CPANPLUS_VERBOSE} || 0;
+
+=item write_install_log
+
+A boolean indicating whether or not to write install logs after installing
+a module using the interactive shell. Defaults to 'true'.
+
+
+=cut
+
+ $Conf->{'conf'}->{'write_install_logs'} = 1;
+
+=item source_engine
+
+Class to use as the source engine, which is generally a subclass of
+C<CPANPLUS::Internals::Source>. Default to C<CPANPLUS::Internals::Source::Memory>.
+
+=cut
+
+ $Conf->{'conf'}->{'source_engine'} = 'CPANPLUS::Internals::Source::SQLite';
+
+=item cpantest_reporter_args
+
+A hashref of key => value pairs that are passed to the constructor
+of C<Test::Reporter>. If you'd want to enable TLS for example, you'd
+set it to:
+
+ { transport => 'Net::SMTP::TLS',
+ transport_args => [ User => 'Joe', Password => '123' ],
+ }
+
+=cut
+
+ $Conf->{'conf'}->{'cpantest_reporter_args'} = {};
+
+=back
+
+=head2 Section 'program'
+
+=cut
+
+ ### Paths get stripped of whitespace on win32 in the constructor
+ ### sudo gets emptied if there's no need for it in the constructor
+
+=over 4
+
+=item editor
+
+A string holding the path to your editor of choice. Defaults to your
+$ENV{EDITOR}, $ENV{VISUAL}, 'vi' or 'pico' programs, in that order.
+
+=cut
+
+ $Conf->{'program'}->{'editor'} = do {
+ $ENV{'EDITOR'} || $ENV{'VISUAL'} ||
+ can_run('vi') || can_run('pico')
+ };
+
+=item make
+
+A string holding the path to your C<make> binary. Looks for the C<make>
+program used to build perl or failing that, a C<make> in your path.
+
+=cut
+
+ $Conf->{'program'}->{'make'} =
+ can_run($Config{'make'}) || can_run('make');
+
+=item pager
+
+A string holding the path to your pager of choice. Defaults to your
+$ENV{PAGER}, 'less' or 'more' programs, in that order.
+
+=cut
+
+ $Conf->{'program'}->{'pager'} =
+ $ENV{'PAGER'} || can_run('less') || can_run('more');
+
+ ### no one uses this feature anyway, and it's only working for EU::MM
+ ### and not for module::build
+ #'perl' => '',
+
+=item shell
+
+A string holding the path to your login shell of choice. Defaults to your
+$ENV{SHELL} setting, or $ENV{COMSPEC} on Windows.
+
+=cut
+
+ $Conf->{'program'}->{'shell'} = $^O eq 'MSWin32'
+ ? $ENV{COMSPEC}
+ : $ENV{SHELL};
+
+=item sudo
+
+A string holding the path to your C<sudo> binary if your install path
+requires super user permissions. Looks for C<sudo> in your path, or
+remains empty if you do not require super user permissiosn to install.
+
+=cut
+
+ $Conf->{'program'}->{'sudo'} = do {
+ ### let's assume you dont need sudo,
+ ### unless one of the below criteria tells us otherwise
+ my $sudo = undef;
+
+ ### you're a normal user, you might need sudo
+ if( $> ) {
+
+ ### check for all install dirs!
+ ### you have write permissions to the installdir,
+ ### you don't need sudo
+ if( -w $Config{'installsitelib'} && -w $Config{'installsitebin'} ) {
+
+ ### installsiteman3dir is a 5.8'ism.. don't check
+ ### it on 5.6.x...
+ if( defined $Config{'installsiteman3dir'} ) {
+ $sudo = -w $Config{'installsiteman3dir'}
+ ? undef
+ : can_run('sudo');
+ } else {
+ $sudo = undef;
+ }
+
+ ### you have PERL_MM_OPT set to some alternate
+ ### install place. You probably have write permissions
+ ### to that
+ } elsif ( $ENV{'PERL_MM_OPT'} and
+ $ENV{'PERL_MM_OPT'} =~ /INSTALL|LIB|PREFIX/
+ ) {
+ $sudo = undef;
+
+ ### you probably don't have write permissions
+ } else {
+ $sudo = can_run('sudo');
+ }
+ }
+
+ ### and return the value
+ $sudo;
+ };
+
+=item perlwrapper
+
+A string holding the path to the C<cpanp-run-perl> utility bundled
+with CPANPLUS, which is used to enable autoflushing in spawned processes.
+
+=cut
+
+ ### perlwrapper that allows us to turn on autoflushing
+ $Conf->{'program'}->{'perlwrapper'} = sub {
+ my $name = 'cpanp-run-perl';
+
+ my @bins = do{
+ require Config;
+ my $ver = $Config::Config{version};
+
+ ### if we are running with 'versiononly' enabled,
+ ### all binaries will have the perlversion appended
+ ### ie, cpanp will become cpanp5.9.5
+ ### so prefer the versioned binary in that case
+ $Config::Config{versiononly}
+ ? ($name.$ver, $name)
+ : ($name, $name.$ver);
+ };
+
+ ### patch from Steve Hay Fri 29 Jun 2007 14:26:02 GMT+02:00
+ ### Msg-Id: <4684FA5A.7030506@uk.radan.com>
+ ### look for files with a ".bat" extension as well on Win32
+ @bins = map { $_, "$_.bat" } @bins if $^O eq 'MSWin32';
+
+ my $path;
+ BIN: for my $bin (@bins) {
+
+ ### parallel to your cpanp/cpanp-boxed
+ my $maybe = File::Spec->rel2abs(
+ File::Spec->catfile( dirname($0), $bin )
+ );
+ $path = $maybe and last BIN if -f $maybe;
+
+ ### parallel to your CPANPLUS.pm:
+ ### $INC{cpanplus}/../bin/cpanp-run-perl
+ $maybe = File::Spec->rel2abs(
+ File::Spec->catfile(
+ dirname($INC{'CPANPLUS.pm'}),
+ '..', # lib dir
+ 'bin', # bin dir
+ $bin, # script
+ )
+ );
+ $path = $maybe and last BIN if -f $maybe;
+
+ ### you installed CPANPLUS in a custom prefix,
+ ### so go paralel to /that/. PREFIX=/tmp/cp
+ ### would put cpanp-run-perl in /tmp/cp/bin and
+ ### CPANPLUS.pm in
+ ### /tmp/cp/lib/perl5/site_perl/5.8.8
+ $maybe = File::Spec->rel2abs(
+ File::Spec->catfile(
+ dirname( $INC{'CPANPLUS.pm'} ),
+ '..', '..', '..', '..', # 4x updir
+ 'bin', # bin dir
+ $bin, # script
+ )
+ );
+ $path = $maybe and last BIN if -f $maybe;
+
+ ### in your path -- take this one last, the
+ ### previous two assume extracted tarballs
+ ### or user installs
+ ### note that we don't use 'can_run' as it's
+ ### not an executable, just a wrapper...
+ ### prefer anything that's found in the path paralel to your $^X
+ for my $dir (File::Spec->rel2abs( dirname($^X) ),
+ split(/\Q$Config::Config{path_sep}\E/, $ENV{PATH}),
+ File::Spec->curdir,
+ ) {
+
+ ### On VMS the path could be in UNIX format, and we
+ ### currently need it to be in VMS format
+ $dir = VMS::Filespec::vmspath($dir) if ON_VMS;
+
+ $maybe = File::Spec->catfile( $dir, $bin );
+ $path = $maybe and last BIN if -f $maybe;
+ }
+ }
+
+ ### we should have a $path by now ideally, if so return it
+ return $path if defined $path;
+
+ ### if not, warn about it and give sensible default.
+ ### XXX try to be a no-op instead then..
+ ### cross your fingers...
+ ### pass '-P' to perl: "run program through C
+ ### preprocessor before compilation"
+ ### XXX using -P actually changes the way some Makefile.PLs
+ ### are executed, so don't do that... --kane
+ error(loc(
+ "Could not find the '%1' binary in your path".
+ "--this may be a problem.\n".
+ "Please locate this program and set ".
+ "your '%2' config entry to its path.\n".
+ "From the default shell, you can do this by typing:\n\n".
+ " %3\n".
+ " %4\n",
+ $name, 'perlwrapper',
+ 's program perlwrapper FULL_PATH_TO_CPANP_RUN_PERL',
+ 's save'
+ ));
+ return '';
+ }->();
+
+=back
+
+=cut
+
+sub new {
+ my $class = shift;
+ my $obj = $class->SUPER::new;
+
+ $obj->mk_accessors( keys %$Conf );
+
+ for my $acc ( keys %$Conf ) {
+ my $subobj = Object::Accessor->new;
+ $subobj->mk_accessors( keys %{$Conf->{$acc}} );
+
+ ### read in all the settings from the sub accessors;
+ for my $subacc ( $subobj->ls_accessors ) {
+ $subobj->$subacc( $Conf->{$acc}->{$subacc} );
+ }
+
+ ### now store it in the parent object
+ $obj->$acc( $subobj );
+ }
+
+ $obj->_clean_up_paths;
+
+ ### shut up IPC::Cmd warning about not findin IPC::Run on win32
+ $IPC::Cmd::WARN = 0;
+
+ return $obj;
+}
+
+sub _clean_up_paths {
+ my $self = shift;
+
+ ### clean up paths if we are on win32
+ if( $^O eq 'MSWin32' ) {
+ for my $pgm ( $self->program->ls_accessors ) {
+ my $path = $self->program->$pgm;
+
+ ### paths with whitespace needs to be shortened
+ ### for shell outs.
+ if ($path and $path =~ /\s+/) {
+ my($prog, $args);
+
+ ### patch from Steve Hay, 13nd of June 2007
+ ### msg-id: <467012A4.6060705@uk.radan.com>
+ ### windows directories are not allowed to end with
+ ### a space, so any occurrence of '\w\s+/\w+' means
+ ### we're dealing with arguments, not directory
+ ### names.
+ if ($path =~ /^(.*?)(\s+\/.*$)/) {
+ ($prog, $args) = ($1, $2);
+
+ ### otherwise, there are no arguments
+ } else {
+ ($prog, $args) = ($path, '');
+ }
+
+ $prog = Win32::GetShortPathName( $prog );
+ $self->program->$pgm( $prog . $args );
+ }
+ }
+ }
+
+ return 1;
+}
+
+1;
+
+=pod
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<CPANPLUS::Backend>, L<CPANPLUS::Configure::Setup>, L<CPANPLUS::Configure>
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Configure.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Configure.pm
new file mode 100755
index 00000000000..baac91dc886
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Configure.pm
@@ -0,0 +1,630 @@
+package CPANPLUS::Configure;
+use strict;
+
+
+use CPANPLUS::Internals::Constants;
+use CPANPLUS::Error;
+use CPANPLUS::Config;
+
+use Log::Message;
+use Module::Load qw[load];
+use Params::Check qw[check];
+use File::Basename qw[dirname];
+use Module::Loaded ();
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+use vars qw[$AUTOLOAD $VERSION $MIN_CONFIG_VERSION];
+use base qw[CPANPLUS::Internals::Utils];
+
+local $Params::Check::VERBOSE = 1;
+
+### require, avoid circular use ###
+require CPANPLUS::Internals;
+$VERSION = $CPANPLUS::Internals::VERSION = $CPANPLUS::Internals::VERSION;
+
+### can't use O::A as we're using our own AUTOLOAD to get to
+### the config options.
+for my $meth ( qw[conf _lib _perl5lib]) {
+ no strict 'refs';
+
+ *$meth = sub {
+ my $self = shift;
+ $self->{'_'.$meth} = $_[0] if @_;
+ return $self->{'_'.$meth};
+ }
+}
+
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Configure
+
+=head1 SYNOPSIS
+
+ $conf = CPANPLUS::Configure->new( );
+
+ $bool = $conf->can_save;
+ $bool = $conf->save( $where );
+
+ @opts = $conf->options( $type );
+
+ $make = $conf->get_program('make');
+ $verbose = $conf->set_conf( verbose => 1 );
+
+=head1 DESCRIPTION
+
+This module deals with all the configuration issues for CPANPLUS.
+Users can use objects created by this module to alter the behaviour
+of CPANPLUS.
+
+Please refer to the C<CPANPLUS::Backend> documentation on how to
+obtain a C<CPANPLUS::Configure> object.
+
+=head1 METHODS
+
+=head2 $Configure = CPANPLUS::Configure->new( load_configs => BOOL )
+
+This method returns a new object. Normal users will never need to
+invoke the C<new> method, but instead retrieve the desired object via
+a method call on a C<CPANPLUS::Backend> object.
+
+=item load_configs
+
+Controls whether or not additional user configurations are to be loaded
+or not. Defaults to C<true>.
+
+=cut
+
+### store teh CPANPLUS::Config object in a closure, so we only
+### initialize it once.. otherwise, on a 2nd ->new, settings
+### from configs on top of this one will be reset
+{ my $Config;
+
+ sub new {
+ my $class = shift;
+ my %hash = @_;
+
+ ### XXX pass on options to ->init() like rescan?
+ my ($load);
+ my $tmpl = {
+ load_configs => { default => 1, store => \$load },
+ };
+
+ check( $tmpl, \%hash ) or (
+ warn Params::Check->last_error, return
+ );
+
+ $Config ||= CPANPLUS::Config->new;
+ my $self = bless {}, $class;
+ $self->conf( $Config );
+
+ ### you want us to load other configs?
+ ### these can override things in the default config
+ $self->init if $load;
+
+ ### after processing the config files, check what
+ ### @INC and PERL5LIB are set to.
+ $self->_lib( \@INC );
+ $self->_perl5lib( $ENV{'PERL5LIB'} );
+
+ return $self;
+ }
+}
+
+=head2 $bool = $Configure->init( [rescan => BOOL])
+
+Initialize the configure with other config files than just
+the default 'CPANPLUS::Config'.
+
+Called from C<new()> to load user/system configurations
+
+If the C<rescan> option is provided, your disk will be
+examined again to see if there are new config files that
+could be read. Defaults to C<false>.
+
+Returns true on success, false on failure.
+
+=cut
+
+### move the Module::Pluggable detection to runtime, rather
+### than compile time, so that a simple 'require CPANPLUS'
+### doesn't start running over your filesystem for no good
+### reason. Make sure we only do the M::P call once though.
+### we use $loaded to mark it
+{ my $loaded;
+ my $warned;
+ sub init {
+ my $self = shift;
+ my $obj = $self->conf;
+ my %hash = @_;
+
+ my ($rescan);
+ my $tmpl = {
+ rescan => { default => 0, store => \$rescan },
+ };
+
+ check( $tmpl, \%hash ) or (
+ warn Params::Check->last_error, return
+ );
+
+ ### if the base dir is changed, we have to rescan it
+ ### for any CPANPLUS::Config::* files as well, so keep
+ ### track of it
+ my $cur_base = $self->get_conf('base');
+
+ ### warn if we find an old style config specified
+ ### via environment variables
+ { my $env = ENV_CPANPLUS_CONFIG;
+ if( $ENV{$env} and not $warned ) {
+ $warned++;
+ error(loc("Specifying a config file in your environment " .
+ "using %1 is obsolete.\nPlease follow the ".
+ "directions outlined in %2 or use the '%3' command\n".
+ "in the default shell to use custom config files.",
+ $env, "CPANPLUS::Configure->save", 's save'));
+ }
+ }
+
+ { ### make sure that the homedir is included now
+ local @INC = ( LIB_DIR->($cur_base), @INC );
+
+ ### only set it up once
+ if( !$loaded++ or $rescan ) {
+ ### find plugins & extra configs
+ ### check $home/.cpanplus/lib as well
+ require Module::Pluggable;
+
+ Module::Pluggable->import(
+ search_path => ['CPANPLUS::Config'],
+ search_dirs => [ LIB_DIR->($cur_base) ],
+ except => qr/::SUPER$/,
+ sub_name => 'configs'
+ );
+ }
+
+
+ ### do system config, user config, rest.. in that order
+ ### apparently, on a 2nd invocation of -->configs, a
+ ### ::ISA::CACHE package can appear.. that's bad...
+ my %confs = map { $_ => $_ }
+ grep { $_ !~ /::ISA::/ } __PACKAGE__->configs;
+ my @confs = grep { defined }
+ map { delete $confs{$_} } CONFIG_SYSTEM, CONFIG_USER;
+ push @confs, sort keys %confs;
+
+ for my $plugin ( @confs ) {
+ msg(loc("Found config '%1'", $plugin),0);
+
+ ### if we already did this the /last/ time around dont
+ ### run the setup agian.
+ if( my $loc = Module::Loaded::is_loaded( $plugin ) ) {
+ msg(loc(" Already loaded '%1' (%2)", $plugin, $loc), 0);
+ next;
+ } else {
+ msg(loc(" Loading config '%1'", $plugin),0);
+
+ if( eval { load $plugin; 1 } ) {
+ msg(loc(" Loaded '%1' (%2)",
+ $plugin, Module::Loaded::is_loaded( $plugin ) ), 0);
+ } else {
+ error(loc(" Error loading '%1': %2", $plugin, $@));
+ }
+ }
+
+ if( $@ ) {
+ error(loc("Could not load '%1': %2", $plugin, $@));
+ next;
+ }
+
+ my $sub = $plugin->can('setup');
+ $sub->( $self ) if $sub;
+ }
+ }
+
+ ### did one of the plugins change the base dir? then we should
+ ### scan the dirs again
+ if( $cur_base ne $self->get_conf('base') ) {
+ msg(loc("Base dir changed from '%1' to '%2', rescanning",
+ $cur_base, $self->get_conf('base')), 0);
+ $self->init( @_, rescan => 1 );
+ }
+
+ ### clean up the paths once more, just in case
+ $obj->_clean_up_paths;
+
+ ### XXX in case the 'lib' param got changed, we need to
+ ### add that now, or it's not propagating ;(
+ { my $lib = $self->get_conf('lib');
+ my %inc = map { $_ => $_ } @INC;
+ for my $l ( @$lib ) {
+ push @INC, $l unless $inc{$l};
+ }
+ $self->_lib( \@INC );
+ }
+
+ return 1;
+ }
+}
+=pod
+
+=head2 can_save( [$config_location] )
+
+Check if we can save the configuration to the specified file.
+If no file is provided, defaults to your personal config.
+
+Returns true if the file can be saved, false otherwise.
+
+=cut
+
+sub can_save {
+ my $self = shift;
+ my $file = shift || CONFIG_USER_FILE->();
+
+ return 1 unless -e $file;
+
+ chmod 0644, $file;
+ return (-w $file);
+}
+
+=pod
+
+=head2 $file = $conf->save( [$package_name] )
+
+Saves the configuration to the package name you provided.
+If this package is not C<CPANPLUS::Config::System>, it will
+be saved in your C<.cpanplus> directory, otherwise it will
+be attempted to be saved in the system wide directory.
+
+If no argument is provided, it will default to your personal
+config.
+
+Returns the full path to the file if the config was saved,
+false otherwise.
+
+=cut
+
+sub _config_pm_to_file {
+ my $self = shift;
+ my $pm = shift or return;
+ my $dir = shift || CONFIG_USER_LIB_DIR->();
+
+ ### only 3 types of files know: home, system and 'other'
+ ### so figure out where to save them based on their type
+ my $file;
+ if( $pm eq CONFIG_USER ) {
+ $file = CONFIG_USER_FILE->();
+
+ } elsif ( $pm eq CONFIG_SYSTEM ) {
+ $file = CONFIG_SYSTEM_FILE->();
+
+ ### third party file
+ } else {
+ my $cfg_pkg = CONFIG . '::';
+ unless( $pm =~ /^$cfg_pkg/ ) {
+ error(loc(
+ "WARNING: Your config package '%1' is not in the '%2' ".
+ "namespace and will not be automatically detected by %3",
+ $pm, $cfg_pkg, 'CPANPLUS'
+ ));
+ }
+
+ $file = File::Spec->catfile(
+ $dir,
+ split( '::', $pm )
+ ) . '.pm';
+ }
+
+ return $file;
+}
+
+
+sub save {
+ my $self = shift;
+ my $pm = shift || CONFIG_USER;
+ my $savedir = shift || '';
+
+ my $file = $self->_config_pm_to_file( $pm, $savedir ) or return;
+ my $dir = dirname( $file );
+
+ unless( -d $dir ) {
+ $self->_mkdir( dir => $dir ) or (
+ error(loc("Can not create directory '%1' to save config to",$dir)),
+ return
+ )
+ }
+ return unless $self->can_save($file);
+
+ ### find only accesors that are not private
+ my @acc = sort grep { $_ !~ /^_/ } $self->conf->ls_accessors;
+
+ ### for dumping the values
+ use Data::Dumper;
+
+ my @lines;
+ for my $acc ( @acc ) {
+
+ push @lines, "### $acc section", $/;
+
+ for my $key ( $self->conf->$acc->ls_accessors ) {
+ my $val = Dumper( $self->conf->$acc->$key );
+
+ $val =~ s/\$VAR1\s+=\s+//;
+ $val =~ s/;\n//;
+
+ push @lines, '$'. "conf->set_${acc}( $key => $val );", $/;
+ }
+ push @lines, $/,$/;
+
+ }
+
+ my $str = join '', map { " $_" } @lines;
+
+ ### use a variable to make sure the pod parser doesn't snag it
+ my $is = '=';
+ my $time = gmtime;
+
+
+ my $msg = <<_END_OF_CONFIG_;
+###############################################
+###
+### Configuration structure for $pm
+###
+###############################################
+
+#last changed: $time GMT
+
+### minimal pod, so you can find it with perldoc -l, etc
+${is}pod
+
+${is}head1 NAME
+
+$pm
+
+${is}head1 DESCRIPTION
+
+This is a CPANPLUS configuration file. Editing this
+config changes the way CPANPLUS will behave
+
+${is}cut
+
+package $pm;
+
+use strict;
+
+sub setup {
+ my \$conf = shift;
+
+$str
+
+ return 1;
+}
+
+1;
+
+_END_OF_CONFIG_
+
+ $self->_move( file => $file, to => "$file~" ) if -f $file;
+
+ my $fh = new FileHandle;
+ $fh->open(">$file")
+ or (error(loc("Could not open '%1' for writing: %2", $file, $!)),
+ return );
+
+ $fh->print($msg);
+ $fh->close;
+
+ return $file;
+}
+
+=pod
+
+=head2 options( type => TYPE )
+
+Returns a list of all valid config options given a specific type
+(like for example C<conf> of C<program>) or false if the type does
+not exist
+
+=cut
+
+sub options {
+ my $self = shift;
+ my $conf = $self->conf;
+ my %hash = @_;
+
+ my $type;
+ my $tmpl = {
+ type => { required => 1, default => '',
+ strict_type => 1, store => \$type },
+ };
+
+ check($tmpl, \%hash) or return;
+
+ my %seen;
+ return sort grep { !$seen{$_}++ }
+ map { $_->$type->ls_accessors if $_->can($type) }
+ $self->conf;
+ return;
+}
+
+=pod
+
+=head1 ACCESSORS
+
+Accessors that start with a C<_> are marked private -- regular users
+should never need to use these.
+
+See the C<CPANPLUS::Config> documentation for what items can be
+set and retrieved.
+
+=head2 get_SOMETHING( ITEM, [ITEM, ITEM, ... ] );
+
+The C<get_*> style accessors merely retrieves one or more desired
+config options.
+
+=head2 set_SOMETHING( ITEM => VAL, [ITEM => VAL, ITEM => VAL, ... ] );
+
+The C<set_*> style accessors set the current value for one
+or more config options and will return true upon success, false on
+failure.
+
+=head2 add_SOMETHING( ITEM => VAL, [ITEM => VAL, ITEM => VAL, ... ] );
+
+The C<add_*> style accessor adds a new key to a config key.
+
+Currently, the following accessors exist:
+
+=over 4
+
+=item set|get_conf
+
+Simple configuration directives like verbosity and favourite shell.
+
+=item set|get_program
+
+Location of helper programs.
+
+=item _set|_get_build
+
+Locations of where to put what files for CPANPLUS.
+
+=item _set|_get_source
+
+Locations and names of source files locally.
+
+=item _set|_get_mirror
+
+Locations and names of source files remotely.
+
+=item _set|_get_fetch
+
+Special settings pertaining to the fetching of files.
+
+=back
+
+=cut
+
+sub AUTOLOAD {
+ my $self = shift;
+ my $conf = $self->conf;
+
+ my $name = $AUTOLOAD;
+ $name =~ s/.+:://;
+
+ my ($private, $action, $field) =
+ $name =~ m/^(_)?((?:[gs]et|add))_([a-z]+)$/;
+
+ my $type = '';
+ $type .= '_' if $private;
+ $type .= $field if $field;
+
+ unless ( $conf->can($type) ) {
+ error( loc("Invalid method type: '%1'", $name) );
+ return;
+ }
+
+ unless( scalar @_ ) {
+ error( loc("No arguments provided!") );
+ return;
+ }
+
+ ### retrieve a current value for an existing key ###
+ if( $action eq 'get' ) {
+ for my $key (@_) {
+ my @list = ();
+
+ ### get it from the user config first
+ if( $conf->can($type) and $conf->$type->can($key) ) {
+ push @list, $conf->$type->$key;
+
+ ### XXX EU::AI compatibility hack to provide lookups like in
+ ### cpanplus 0.04x; we renamed ->_get_build('base') to
+ ### ->get_conf('base')
+ } elsif ( $type eq '_build' and $key eq 'base' ) {
+ return $self->get_conf($key);
+
+ } else {
+ error( loc(q[No such key '%1' in field '%2'], $key, $type) );
+ return;
+ }
+
+ return wantarray ? @list : $list[0];
+ }
+
+ ### set an existing key to a new value ###
+ } elsif ( $action eq 'set' ) {
+ my %args = @_;
+
+ while( my($key,$val) = each %args ) {
+
+ if( $conf->can($type) and $conf->$type->can($key) ) {
+ $conf->$type->$key( $val );
+
+ } else {
+ error( loc(q[No such key '%1' in field '%2'], $key, $type) );
+ return;
+ }
+ }
+
+ return 1;
+
+ ### add a new key to the config ###
+ } elsif ( $action eq 'add' ) {
+ my %args = @_;
+
+ while( my($key,$val) = each %args ) {
+
+ if( $conf->$type->can($key) ) {
+ error( loc( q[Key '%1' already exists for field '%2'],
+ $key, $type));
+ return;
+ } else {
+ $conf->$type->mk_accessors( $key );
+ $conf->$type->$key( $val );
+ }
+ }
+ return 1;
+
+ } else {
+
+ error( loc(q[Unknown action '%1'], $action) );
+ return;
+ }
+}
+
+sub DESTROY { 1 };
+
+1;
+
+=pod
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<CPANPLUS::Backend>, L<CPANPLUS::Configure::Setup>, L<CPANPLUS::Config>
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Configure/Setup.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Configure/Setup.pm
new file mode 100755
index 00000000000..3bcf8f45090
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Configure/Setup.pm
@@ -0,0 +1,1653 @@
+package CPANPLUS::Configure::Setup;
+
+use strict;
+use vars qw(@ISA);
+
+use base qw[CPANPLUS::Internals::Utils];
+use base qw[Object::Accessor];
+
+use Config;
+use Term::UI;
+use Module::Load;
+use Term::ReadLine;
+
+
+use CPANPLUS::Internals::Utils;
+use CPANPLUS::Internals::Constants;
+use CPANPLUS::Error;
+
+use IPC::Cmd qw[can_run];
+use Params::Check qw[check];
+use Module::Load::Conditional qw[check_install];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+### silence Term::UI
+$Term::UI::VERBOSE = 0;
+
+#Can't ioctl TIOCGETP: Unknown error
+#Consider installing Term::ReadKey from CPAN site nearby
+# at http://www.perl.com/CPAN
+#Or use
+# perl -MCPAN -e shell
+#to reach CPAN. Falling back to 'stty'.
+# If you do not want to see this warning, set PERL_READLINE_NOWARN
+#in your environment.
+#'stty' is not recognized as an internal or external command,
+#operable program or batch file.
+#Cannot call `stty': No such file or directory at C:/Perl/site/lib/Term/ReadLine/
+
+### setting this var in the meantime to avoid this warning ###
+$ENV{PERL_READLINE_NOWARN} = 1;
+
+
+sub new {
+ my $class = shift;
+ my %hash = @_;
+
+ my $tmpl = {
+ configure_object => { },
+ term => { },
+ backend => { },
+ autoreply => { default => 0, },
+ skip_mirrors => { default => 0, },
+ use_previous => { default => 1, },
+ config_type => { default => CONFIG_USER },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ ### initialize object
+ my $obj = $class->SUPER::new( keys %$tmpl );
+ for my $acc ( $obj->ls_accessors ) {
+ $obj->$acc( $args->{$acc} );
+ }
+
+ ### otherwise there's a circular use ###
+ load CPANPLUS::Configure;
+ load CPANPLUS::Backend;
+
+ $obj->configure_object( CPANPLUS::Configure->new() )
+ unless $obj->configure_object;
+
+ $obj->backend( CPANPLUS::Backend->new( $obj->configure_object ) )
+ unless $obj->backend;
+
+ ### use empty string in case user only has T::R::Stub -- it complains
+ $obj->term( Term::ReadLine->new('') )
+ unless $obj->term;
+
+ ### enable autoreply if that was passed ###
+ $Term::UI::AUTOREPLY = $obj->autoreply;
+
+ return $obj;
+}
+
+sub init {
+ my $self = shift;
+ my $term = $self->term;
+
+ ### default setting, unless changed
+ $self->config_type( CONFIG_USER ) unless $self->config_type;
+
+ my $save = loc('Save & exit');
+ my $exit = loc('Quit without saving');
+ my @map = (
+ # key on the display # method to dispatch to
+ [ loc('Select Configuration file') => '_save_where' ],
+ [ loc('Setup CLI Programs') => '_setup_program' ],
+ [ loc('Setup CPANPLUS Home directory') => '_setup_base' ],
+ [ loc('Setup FTP/Email settings') => '_setup_ftp' ],
+ [ loc('Setup basic preferences') => '_setup_conf' ],
+ [ loc('Setup installer settings') => '_setup_installer' ],
+ [ loc('Select mirrors'), => '_setup_hosts' ],
+ [ loc('Edit configuration file') => '_edit' ],
+ [ $save => '_save' ],
+ [ $exit => 1 ],
+ );
+
+ my @keys = map { $_->[0] } @map; # sorted keys
+ my %map = map { @$_ } @map; # lookup hash
+
+ PICK_SECTION: {
+ print loc("
+=================> MAIN MENU <=================
+
+Welcome to the CPANPLUS configuration. Please select which
+parts you wish to configure
+
+Defaults are taken from your current configuration.
+If you would save now, your settings would be written to:
+
+ %1
+
+ ", $self->config_type );
+
+ my $choice = $term->get_reply(
+ prompt => "Section to configure:",
+ choices => \@keys,
+ default => $keys[0]
+ );
+
+ ### exit configuration?
+ if( $choice eq $exit ) {
+ print loc("
+Quitting setup, changes will not be saved.
+ ");
+ return 1;
+ }
+
+ my $method = $map{$choice};
+
+ my $rv = $self->$method or print loc("
+There was an error setting up this section. You might want to try again
+ ");
+
+ ### was it save & exit?
+ if( $choice eq $save and $rv ) {
+ print loc("
+Quitting setup, changes are saved to '%1'
+ ", $self->config_type
+ );
+ return 1;
+ }
+
+ ### otherwise, present choice again
+ redo PICK_SECTION;
+ }
+
+ return 1;
+}
+
+
+
+### sub that figures out what kind of config type the user wants
+sub _save_where {
+ my $self = shift;
+ my $term = $self->term;
+ my $conf = $self->configure_object;
+
+
+ ASK_CONFIG_TYPE: {
+
+ print loc( q[
+Where would you like to save your CPANPLUS Configuration file?
+
+If you want to configure CPANPLUS for this user only,
+select the '%1' option.
+The file will then be saved in your homedirectory.
+
+If you are the system administrator of this machine,
+and would like to make this config available globally,
+select the '%2' option.
+The file will be then be saved in your CPANPLUS
+installation directory.
+
+ ], CONFIG_USER, CONFIG_SYSTEM );
+
+
+ ### ask what config type we should save to
+ my $type = $term->get_reply(
+ prompt => loc("Type of configuration file"),
+ default => $self->config_type || CONFIG_USER,
+ choices => [CONFIG_USER, CONFIG_SYSTEM],
+ );
+
+ my $file = $conf->_config_pm_to_file( $type );
+
+ ### can we save to this file?
+ unless( $conf->can_save( $file ) ) {
+ error(loc(
+ "Can not save to file '%1'-- please check permissions " .
+ "and try again", $file
+ ));
+
+ redo ASK_CONFIG_FILE;
+ }
+
+ ### you already have the file -- are we allowed to overwrite
+ ### or should we try again?
+ if ( -e $file and -w _ ) {
+ print loc(q[
+I see you already have this file:
+ %1
+
+The file will not be overwritten until you explicitly save it.
+
+ ], $file );
+
+ redo ASK_CONFIG_TYPE
+ unless $term->ask_yn(
+ prompt => loc( "Do you wish to use this file?"),
+ default => 'n',
+ );
+ }
+
+ print $/, loc("Using '%1' as your configuration type", $type);
+
+ return $self->config_type($type);
+ }
+}
+
+
+### setup the build & cache dirs
+sub _setup_base {
+ my $self = shift;
+ my $term = $self->term;
+ my $conf = $self->configure_object;
+
+ my $base = $conf->get_conf('base');
+ my $home = File::Spec->catdir( $self->_home_dir, DOT_CPANPLUS );
+
+ print loc("
+CPANPLUS needs a directory of its own to cache important index
+files and maybe keep a temporary mirror of CPAN files.
+This may be a site-wide directory or a personal directory.
+
+For a single-user installation, we suggest using your home directory.
+
+");
+
+ my $where;
+ ASK_HOME_DIR: {
+ my $other = loc('Somewhere else');
+ if( $base and ($base ne $home) ) {
+ print loc("You have several choices:");
+
+ $where = $term->get_reply(
+ prompt => loc('Please pick one'),
+ choices => [$home, $base, $other],
+ default => $home,
+ );
+ } else {
+ $where = $base;
+ }
+
+ if( $where and -d $where ) {
+ print loc("
+I see you already have a directory:
+ %1
+
+ "), $where;
+
+ my $yn = $term->ask_yn(
+ prompt => loc('Should I use it?'),
+ default => 'y',
+ );
+ $where = '' unless $yn;
+ }
+
+ if( $where and ($where ne $other) and not -d $where ) {
+ if (!$self->_mkdir( dir => $where ) ) {
+ print "\n", loc("Unable to create directory '%1'", $where);
+ redo ASK_HOME_DIR;
+ }
+
+ } elsif( not $where or ($where eq $other) ) {
+ print loc("
+First of all, I'd like to create this directory.
+
+ ");
+
+ NEW_HOME: {
+ $where = $term->get_reply(
+ prompt => loc('Where shall I create it?'),
+ default => $home,
+ );
+
+ my $again;
+ if( -d $where and not -w _ ) {
+ print "\n", loc("I can't seem to write in this directory");
+ $again++;
+ } elsif (!$self->_mkdir( dir => $where ) ) {
+ print "\n", loc("Unable to create directory '%1'", $where);
+ $again++;
+ }
+
+ if( $again ) {
+ print "\n", loc('Please select another directory'), "\n\n";
+ redo NEW_HOME;
+ }
+ }
+ }
+ }
+
+ ### tidy up the path and store it
+ $where = File::Spec->rel2abs($where);
+ $conf->set_conf( base => $where );
+
+ ### create subdirectories ###
+ my @dirs =
+ File::Spec->catdir( $where, $self->_perl_version(perl => $^X),
+ $conf->_get_build('moddir') ),
+ map {
+ File::Spec->catdir( $where, $conf->_get_build($_) )
+ } qw[autdir distdir];
+
+ for my $dir ( @dirs ) {
+ unless( $self->_mkdir( dir => $dir ) ) {
+ warn loc("I wasn't able to create '%1'", $dir), "\n";
+ }
+ }
+
+ ### clear away old storable images before 0.031
+ for my $src (qw[dslip mailrc packages]) {
+ 1 while unlink File::Spec->catfile( $where, $src );
+
+ }
+
+ print loc(q[
+Your CPANPLUS build and cache directory has been set to:
+ %1
+
+ ], $where);
+
+ return 1;
+}
+
+sub _setup_ftp {
+ my $self = shift;
+ my $term = $self->term;
+ my $conf = $self->configure_object;
+
+ #########################
+ ## are you a pacifist? ##
+ #########################
+
+ print loc("
+If you are connecting through a firewall or proxy that doesn't handle
+FTP all that well you can use passive FTP.
+
+");
+
+ my $yn = $term->ask_yn(
+ prompt => loc("Use passive FTP?"),
+ default => $conf->get_conf('passive'),
+ );
+
+ $conf->set_conf(passive => $yn);
+
+ ### set the ENV var as well, else it won't get set till AFTER
+ ### the configuration is saved. but we fetch files BEFORE that.
+ $ENV{FTP_PASSIVE} = $yn;
+
+ print "\n";
+ print $yn
+ ? loc("I will use passive FTP.")
+ : loc("I won't use passive FTP.");
+ print "\n";
+
+ #############################
+ ## should fetches timeout? ##
+ #############################
+
+ print loc("
+CPANPLUS can specify a network timeout for downloads (in whole seconds).
+If none is desired (or to skip this question), enter '0'.
+
+");
+
+ my $timeout = 0 + $term->get_reply(
+ prompt => loc("Network timeout for downloads"),
+ default => $conf->get_conf('timeout') || 0,
+ allow => qr/(?!\D)/, ### whole numbers only
+ );
+
+ $conf->set_conf(timeout => $timeout);
+
+ print "\n";
+ print $timeout
+ ? loc("The network timeout for downloads is %1 seconds.", $timeout)
+ : loc("The network timeout for downloads is not set.");
+ print "\n";
+
+ ############################
+ ## where can I reach you? ##
+ ############################
+
+ print loc("
+What email address should we send as our anonymous password when
+fetching modules from CPAN servers? Some servers will NOT allow you to
+connect without a valid email address, or at least something that looks
+like one.
+Also, if you choose to report test results at some point, a valid email
+is required for the 'from' field, so choose wisely.
+
+ ");
+
+ my $other = 'Something else';
+ my @choices = (DEFAULT_EMAIL, $Config{cf_email}, $other);
+ my $current = $conf->get_conf('email');
+
+ ### if your current address is not in the list, add it to the choices
+ unless (grep { $_ eq $current } @choices) {
+ unshift @choices, $current;
+ }
+
+ my $email = $term->get_reply(
+ prompt => loc('Which email address shall I use?'),
+ default => $current || $choices[0],
+ choices => \@choices,
+ );
+
+ if( $email eq $other ) {
+ EMAIL: {
+ $email = $term->get_reply(
+ prompt => loc('Email address: '),
+ );
+
+ unless( $self->_valid_email($email) ) {
+ print loc("
+You did not enter a valid email address, please try again!
+ ") if length $email;
+
+ redo EMAIL;
+ }
+ }
+ }
+
+ print loc("
+Your 'email' is now:
+ %1
+
+ ", $email);
+
+ $conf->set_conf( email => $email );
+
+ return 1;
+}
+
+
+### commandline programs
+sub _setup_program {
+ my $self = shift;
+ my $term = $self->term;
+ my $conf = $self->configure_object;
+
+ print loc("
+CPANPLUS can use command line utilities to do certain
+tasks, rather than use perl modules.
+
+If you wish to use a certain command utility, just enter
+the full path (or accept the default). If you do not wish
+to use it, enter a single space.
+
+Note that the paths you provide should not contain spaces, which is
+needed to make a distinction between program name and options to that
+program. For Win32 machines, you can use the short name for a path,
+like '%1'.
+", 'c:\Progra~1\prog.exe' );
+
+ for my $prog ( sort $conf->options( type => 'program') ) {
+ PROGRAM: {
+ print "\n", loc("Where can I find your '%1' utility? ".
+ "(Enter a single space to disable)", $prog ), "\n";
+
+ my $loc = $term->get_reply(
+ prompt => "Path to your '$prog'",
+ default => $conf->get_program( $prog ),
+ );
+
+ ### empty line clears it
+ my $cmd = $loc =~ /^\s*$/ ? undef : $loc;
+ my ($bin) = $cmd =~ /^(\S+)/;
+
+ ### did you provide a valid program ?
+ if( $bin and not can_run( $bin ) ) {
+ print "\n";
+ print loc("Can not find the binary '%1' in your path!", $bin);
+ redo PROGRAM;
+ }
+
+ ### make is special -- we /need/ it!
+ if( $prog eq 'make' and not $bin ) {
+ print loc(
+ "==> Without your '%1' utility, I can not function! <==",
+ 'make'
+ );
+ print loc("Please provide one!");
+
+ ### show win32 where to download
+ if ( $^O eq 'MSWin32' ) {
+ print loc("You can get '%1' from:", NMAKE);
+ print "\t". NMAKE_URL ."\n";
+ }
+ print "\n";
+ redo PROGRAM;
+ }
+
+ $conf->set_program( $prog => $cmd );
+ print $cmd
+ ? loc( "Your '%1' utility has been set to '%2'.",
+ $prog, $cmd )
+ : loc( "Your '%1' has been disabled.", $prog );
+ print "\n";
+ }
+ }
+
+ return 1;
+}
+
+sub _setup_installer {
+ my $self = shift;
+ my $term = $self->term;
+ my $conf = $self->configure_object;
+
+ my $none = 'None';
+ {
+ print loc("
+CPANPLUS uses binary programs as well as Perl modules to accomplish
+various tasks. Normally, CPANPLUS will prefer the use of Perl modules
+over binary programs.
+
+You can change this setting by making CPANPLUS prefer the use of
+certain binary programs if they are available.
+
+ ");
+
+ ### default to using binaries if we don't have compress::zlib only
+ ### -- it'll get very noisy otherwise
+ my $type = 'prefer_bin';
+ my $yn = $term->ask_yn(
+ prompt => loc("Should I prefer the use of binary programs?"),
+ default => $conf->get_conf( $type ),
+ );
+
+ print $yn
+ ? loc("Ok, I will prefer to use binary programs if possible.")
+ : loc("Ok, I will prefer to use Perl modules if possible.");
+ print "\n\n";
+
+
+ $conf->set_conf( $type => $yn );
+ }
+
+ {
+ print loc("
+Makefile.PL is run by perl in a separate process, and accepts various
+flags that controls the module's installation. For instance, if you
+would like to install modules to your private user directory, set
+'makemakerflags' to:
+
+LIB=~/perl/lib INSTALLMAN1DIR=~/perl/man/man1 INSTALLMAN3DIR=~/perl/man/man3
+
+and be sure that you do NOT set UNINST=1 in 'makeflags' below.
+
+Enter a name=value list separated by whitespace, but quote any embedded
+spaces that you want to preserve. (Enter a space to clear any existing
+settings.)
+
+If you don't understand this question, just press ENTER.
+
+ ");
+
+ my $type = 'makemakerflags';
+ my $flags = $term->get_reply(
+ prompt => 'Makefile.PL flags?',
+ default => $conf->get_conf($type),
+ );
+
+ $flags = '' if $flags eq $none || $flags !~ /\S/;
+
+ print "\n", loc("Your '%1' have been set to:", 'Makefile.PL flags'),
+ "\n ", ( $flags ? $flags : loc('*nothing entered*')),
+ "\n\n";
+
+ $conf->set_conf( $type => $flags );
+ }
+
+ {
+ print loc("
+Like Makefile.PL, we run 'make' and 'make install' as separate processes.
+If you have any parameters (e.g. '-j3' in dual processor systems) you want
+to pass to the calls, please specify them here.
+
+In particular, 'UNINST=1' is recommended for root users, unless you have
+fine-tuned ideas of where modules should be installed in the \@INC path.
+
+Enter a name=value list separated by whitespace, but quote any embedded
+spaces that you want to preserve. (Enter a space to clear any existing
+settings.)
+
+Again, if you don't understand this question, just press ENTER.
+
+ ");
+ my $type = 'makeflags';
+ my $flags = $term->get_reply(
+ prompt => 'make flags?',
+ default => $conf->get_conf($type),
+ );
+
+ $flags = '' if $flags eq $none || $flags !~ /\S/;
+
+ print "\n", loc("Your '%1' have been set to:", $type),
+ "\n ", ( $flags ? $flags : loc('*nothing entered*')),
+ "\n\n";
+
+ $conf->set_conf( $type => $flags );
+ }
+
+ {
+ print loc("
+An alternative to ExtUtils::MakeMaker and Makefile.PL there's a module
+called Module::Build which uses a Build.PL.
+
+If you would like to specify any flags to pass when executing the
+Build.PL (and Build) script, please enter them below.
+
+For instance, if you would like to install modules to your private
+user directory, you could enter:
+
+ install_base=/my/private/path
+
+Or to uninstall old copies of modules before updating, you might
+want to enter:
+
+ uninst=1
+
+Again, if you don't understand this question, just press ENTER.
+
+ ");
+
+ my $type = 'buildflags';
+ my $flags = $term->get_reply(
+ prompt => 'Build.PL and Build flags?',
+ default => $conf->get_conf($type),
+ );
+
+ $flags = '' if $flags eq $none || $flags !~ /\S/;
+
+ print "\n", loc("Your '%1' have been set to:",
+ 'Build.PL and Build flags'),
+ "\n ", ( $flags ? $flags : loc('*nothing entered*')),
+ "\n\n";
+
+ $conf->set_conf( $type => $flags );
+ }
+
+ ### use EU::MM or module::build? ###
+ {
+ print loc("
+Some modules provide both a Build.PL (Module::Build) and a Makefile.PL
+(ExtUtils::MakeMaker). By default, CPANPLUS prefers Makefile.PL.
+
+Module::Build support is not bundled standard with CPANPLUS, but
+requires you to install 'CPANPLUS::Dist::Build' from CPAN.
+
+Although Module::Build is a pure perl solution, which means you will
+not need a 'make' binary, it does have some limitations. The most
+important is that CPANPLUS is unable to uninstall any modules installed
+by Module::Build.
+
+Again, if you don't understand this question, just press ENTER.
+
+ ");
+ my $type = 'prefer_makefile';
+ my $yn = $term->ask_yn(
+ prompt => loc("Prefer Makefile.PL over Build.PL?"),
+ default => $conf->get_conf($type),
+ );
+
+ $conf->set_conf( $type => $yn );
+ }
+
+ {
+ print loc('
+If you like, CPANPLUS can add extra directories to your @INC list during
+startup. These will just be used by CPANPLUS and will not change your
+external environment or perl interpreter. Enter a space separated list of
+pathnames to be added to your @INC, quoting any with embedded whitespace.
+(To clear the current value enter a single space.)
+
+ ');
+
+ my $type = 'lib';
+ my $flags = $term->get_reply(
+ prompt => loc('Additional @INC directories to add?'),
+ default => (join " ", @{$conf->get_conf($type) || []} ),
+ );
+
+ my $lib;
+ unless( $flags =~ /\S/ ) {
+ $lib = [];
+ } else {
+ (@$lib) = $flags =~ m/\s*("[^"]+"|'[^']+'|[^\s]+)/g;
+ }
+
+ print "\n", loc("Your additional libs are now:"), "\n";
+
+ print scalar @$lib
+ ? map { " $_\n" } @$lib
+ : " ", loc("*nothing entered*"), "\n";
+ print "\n\n";
+
+ $conf->set_conf( $type => $lib );
+ }
+
+ return 1;
+}
+
+
+sub _setup_conf {
+ my $self = shift;
+ my $term = $self->term;
+ my $conf = $self->configure_object;
+
+ my $none = 'None';
+ {
+ ############
+ ## noisy? ##
+ ############
+
+ print loc("
+In normal operation I can just give you basic information about what I
+am doing, or I can be more verbose and give you every little detail.
+
+ ");
+
+ my $type = 'verbose';
+ my $yn = $term->ask_yn(
+ prompt => loc("Should I be verbose?"),
+ default => $conf->get_conf( $type ), );
+
+ print "\n";
+ print $yn
+ ? loc("You asked for it!")
+ : loc("I'll try to be quiet");
+
+ $conf->set_conf( $type => $yn );
+ }
+
+ {
+ #######################
+ ## flush you animal! ##
+ #######################
+
+ print loc("
+In the interest of speed, we keep track of what modules were installed
+successfully and which failed in the current session. We can flush this
+data automatically, or you can explicitly issue a 'flush' when you want
+to purge it.
+
+ ");
+
+ my $type = 'flush';
+ my $yn = $term->ask_yn(
+ prompt => loc("Flush automatically?"),
+ default => $conf->get_conf( $type ),
+ );
+
+ print "\n";
+ print $yn
+ ? loc("I'll flush after every full module install.")
+ : loc("I won't flush until you tell me to.");
+
+ $conf->set_conf( $type => $yn );
+ }
+
+ {
+ #####################
+ ## force installs? ##
+ #####################
+
+ print loc("
+Usually, when a test fails, I won't install the module, but if you
+prefer, I can force the install anyway.
+
+ ");
+
+ my $type = 'force';
+ my $yn = $term->ask_yn(
+ prompt => loc("Force installs?"),
+ default => $conf->get_conf( $type ),
+ );
+
+ print "\n";
+ print $yn
+ ? loc("I will force installs.")
+ : loc("I won't force installs.");
+
+ $conf->set_conf( $type => $yn );
+ }
+
+ {
+ ###################
+ ## about prereqs ##
+ ###################
+
+ print loc("
+Sometimes a module will require other modules to be installed before it
+will work. CPANPLUS can attempt to install these for you automatically
+if you like, or you can do the deed yourself.
+
+If you would prefer that we NEVER try to install extra modules
+automatically, select NO. (Usually you will want this set to YES.)
+
+If you would like to build modules to satisfy testing or prerequisites,
+but not actually install them, select BUILD.
+
+NOTE: This feature requires you to flush the 'lib' cache for longer
+running programs (refer to the CPANPLUS::Backend documentations for
+more details).
+
+Otherwise, select ASK to have us ask your permission to install them.
+
+ ");
+
+ my $type = 'prereqs';
+
+ my @map = (
+ [ PREREQ_IGNORE, # conf value
+ loc('No, do not install prerequisites'), # UI Value
+ loc("I won't install prerequisites") # diag message
+ ],
+ [ PREREQ_INSTALL,
+ loc('Yes, please install prerequisites'),
+ loc("I will install prerequisites")
+ ],
+ [ PREREQ_ASK,
+ loc('Ask me before installing a prerequisite'),
+ loc("I will ask permission to install")
+ ],
+ [ PREREQ_BUILD,
+ loc('Build prerequisites, but do not install them'),
+ loc( "I will only build, but not install prerequisites" )
+ ],
+ );
+
+ my %reply = map { $_->[1] => $_->[0] } @map; # choice => value
+ my %diag = map { $_->[1] => $_->[2] } @map; # choice => diag message
+ my %conf = map { $_->[0] => $_->[1] } @map; # value => ui choice
+
+ my $reply = $term->get_reply(
+ prompt => loc('Follow prerequisites?'),
+ default => $conf{ $conf->get_conf( $type ) },
+ choices => [ @conf{ sort keys %conf } ],
+ );
+ print "\n";
+
+ my $value = $reply{ $reply };
+ my $diag = $diag{ $reply };
+
+ $conf->set_conf( $type => $value );
+ print $diag, "\n";
+ }
+
+ { print loc("
+Modules in the CPAN archives are protected with md5 checksums.
+
+This requires the Perl module Digest::MD5 to be installed (which
+CPANPLUS can do for you later);
+
+ ");
+ my $type = 'md5';
+
+ my $yn = $term->ask_yn(
+ prompt => loc("Shall I use the MD5 checksums?"),
+ default => $conf->get_conf( $type ),
+ );
+
+ print $yn
+ ? loc("I will use the MD5 checksums if you have it")
+ : loc("I won't use the MD5 checksums");
+
+ $conf->set_conf( $type => $yn );
+
+ }
+
+
+ { ###########################################
+ ## sally sells seashells by the seashore ##
+ ###########################################
+
+ print loc("
+By default CPANPLUS uses its own shell when invoked. If you would prefer
+a different shell, such as one you have written or otherwise acquired,
+please enter the full name for your shell module.
+
+ ");
+
+ my $type = 'shell';
+ my $other = 'Other';
+ my @choices = (qw| CPANPLUS::Shell::Default
+ CPANPLUS::Shell::Classic |,
+ $other );
+ my $default = $conf->get_conf($type);
+
+ unshift @choices, $default unless grep { $_ eq $default } @choices;
+
+ my $reply = $term->get_reply(
+ prompt => loc('Which CPANPLUS shell do you want to use?'),
+ default => $default,
+ choices => \@choices,
+ );
+
+ if( $reply eq $other ) {
+ SHELL: {
+ $reply = $term->get_reply(
+ prompt => loc( 'Please enter the name of the shell '.
+ 'you wish to use: '),
+ );
+
+ unless( check_install( module => $reply ) ) {
+ print "\n",
+ loc("Could not find '$reply' in your path " .
+ "-- please try again"),
+ "\n";
+ redo SHELL;
+ }
+ }
+ }
+
+ print "\n", loc("Your shell is now: %1", $reply), "\n\n";
+
+ $conf->set_conf( $type => $reply );
+ }
+
+ {
+ ###################
+ ## use storable? ##
+ ###################
+
+ print loc("
+To speed up the start time of CPANPLUS, and maintain a cache over
+multiple runs, we can use Storable to freeze some information.
+Would you like to do this?
+
+");
+ my $type = 'storable';
+ my $yn = $term->ask_yn(
+ prompt => loc("Use Storable?"),
+ default => $conf->get_conf( $type ) ? 1 : 0,
+ );
+ print "\n";
+ print $yn
+ ? loc("I will use Storable if you have it")
+ : loc("I will not use Storable");
+
+ $conf->set_conf( $type => $yn );
+ }
+
+ {
+ ###################
+ ## use sqlite ? ##
+ ###################
+
+ print loc("
+
+To limit the amount of RAM used by CPANPLUS, you can use the SQLite
+source backend instead. Note that it is currently still experimental.
+Would you like to do this?
+
+");
+ my $type = 'source_engine';
+ my $class = 'CPANPLUS::Internals::Source::SQLite';
+ my $yn = $term->ask_yn(
+ prompt => loc("Use SQLite?"),
+ default => $conf->get_conf( $type ) eq $class ? 1 : 0,
+ );
+ print "\n";
+ print $yn
+ ? loc("I will use SQLite")
+ : loc("I will not use SQLite");
+
+ $conf->set_conf( $type => $class );
+ }
+
+ {
+ ###################
+ ## use cpantest? ##
+ ###################
+
+ print loc("
+CPANPLUS has support for the Test::Reporter module, which can be utilized
+to report success and failures of modules installed by CPANPLUS. Would
+you like to do this? Note that you will still be prompted before
+sending each report.
+
+If you don't have all the required modules installed yet, you should
+consider installing '%1'
+
+This package bundles all the required modules to enable test reporting
+and querying from CPANPLUS.
+You can do so straight after this installation.
+
+ ", 'Bundle::CPANPLUS::Test::Reporter');
+
+ my $type = 'cpantest';
+ my $yn = $term->ask_yn(
+ prompt => loc('Report test results?'),
+ default => $conf->get_conf( $type ) ? 1 : 0,
+ );
+
+ print "\n";
+ print $yn
+ ? loc("I will prompt you to report test results")
+ : loc("I won't prompt you to report test results");
+
+ $conf->set_conf( $type => $yn );
+ }
+
+ {
+ ###################################
+ ## use cryptographic signatures? ##
+ ###################################
+
+ print loc("
+The Module::Signature extension allows CPAN authors to sign their
+distributions using PGP signatures. Would you like to check for
+module's cryptographic integrity before attempting to install them?
+Note that this requires either the 'gpg' utility or Crypt::OpenPGP
+to be installed.
+
+ ");
+ my $type = 'signature';
+
+ my $yn = $term->ask_yn(
+ prompt => loc('Shall I check module signatures?'),
+ default => $conf->get_conf($type) ? 1 : 0,
+ );
+
+ print "\n";
+ print $yn
+ ? loc("Ok, I will attempt to check module signatures.")
+ : loc("Ok, I won't attempt to check module signatures.");
+
+ $conf->set_conf( $type => $yn );
+ }
+
+ return 1;
+}
+
+sub _setup_hosts {
+ my $self = shift;
+ my $term = $self->term;
+ my $conf = $self->configure_object;
+
+
+ if( scalar @{ $conf->get_conf('hosts') } ) {
+
+ my $hosts;
+ for my $href ( @{$conf->get_conf('hosts')} ) {
+ $hosts .= "\t$href->{scheme}://$href->{host}$href->{path}\n";
+ }
+
+ print loc("
+I see you already have some hosts selected:
+
+$hosts
+
+If you'd like to stick with your current settings, just select 'Yes'.
+Otherwise, select 'No' and you can reconfigure your hosts
+
+");
+ my $yn = $term->ask_yn(
+ prompt => loc("Would you like to keep your current hosts?"),
+ default => 'y',
+ );
+ return 1 if $yn;
+ }
+
+ my @hosts;
+ MAIN: {
+
+ print loc("
+Now we need to know where your favorite CPAN sites are located. Make a
+list of a few sites (just in case the first on the array won't work).
+
+If you are mirroring CPAN to your local workstation, specify a file:
+URI by picking the CUSTOM option.
+
+Otherwise, let us fetch the official CPAN mirror list and you can pick
+the mirror that suits you best from a list by using the MIRROR option;
+First, pick a nearby continent and country. Then, you will be presented
+with a list of URLs of CPAN mirrors in the country you selected. Select
+one or more of those URLs.
+
+Note, the latter option requires a working net connection.
+
+You can select VIEW to see your current selection and QUIT when you
+are done.
+
+");
+
+ my $reply = $term->get_reply(
+ prompt => loc('Please choose an option'),
+ choices => [qw|Mirror Custom View Quit|],
+ default => 'Mirror',
+ );
+
+ goto MIRROR if $reply eq 'Mirror';
+ goto CUSTOM if $reply eq 'Custom';
+ goto QUIT if $reply eq 'Quit';
+
+ $self->_view_hosts(@hosts) if $reply eq 'View';
+ redo MAIN;
+ }
+
+ my $mirror_file;
+ my $hosts;
+ MIRROR: {
+ $mirror_file ||= $self->_get_mirrored_by or return;
+ $hosts ||= $self->_parse_mirrored_by($mirror_file) or return;
+
+ my ($continent, $country, $host) = $self->_guess_from_timezone( $hosts );
+
+ CONTINENT: {
+ my %seen;
+ my @choices = sort map {
+ $_->{'continent'}
+ } grep {
+ not $seen{$_->{'continent'}}++
+ } values %$hosts;
+ push @choices, qw[Custom Up Quit];
+
+ my $reply = $term->get_reply(
+ prompt => loc('Pick a continent'),
+ default => $continent,
+ choices => \@choices,
+ );
+
+ goto MAIN if $reply eq 'Up';
+ goto CUSTOM if $reply eq 'Custom';
+ goto QUIT if $reply eq 'Quit';
+
+ $continent = $reply;
+ }
+
+ COUNTRY: {
+ my %seen;
+ my @choices = sort map {
+ $_->{'country'}
+ } grep {
+ not $seen{$_->{'country'}}++
+ } grep {
+ ($_->{'continent'} eq $continent)
+ } values %$hosts;
+ push @choices, qw[Custom Up Quit];
+
+ my $reply = $term->get_reply(
+ prompt => loc('Pick a country'),
+ default => $country,
+ choices => \@choices,
+ );
+
+ goto CONTINENT if $reply eq 'Up';
+ goto CUSTOM if $reply eq 'Custom';
+ goto QUIT if $reply eq 'Quit';
+
+ $country = $reply;
+ }
+
+ HOST: {
+ my @list = grep {
+ $_->{'continent'} eq $continent and
+ $_->{'country'} eq $country
+ } values %$hosts;
+
+ my %map; my $default;
+ for my $href (@list) {
+ for my $con ( @{$href->{'connections'}} ) {
+ next unless length $con->{'host'};
+
+ my $entry = $con->{'scheme'} . '://' . $con->{'host'};
+ $default = $entry if $con->{'host'} eq $host;
+
+ $map{$entry} = $con;
+ }
+ }
+
+ CHOICE: {
+
+ ### doesn't play nice with Term::UI :(
+ ### should make t::ui figure out pager opens
+ #$self->_pager_open; # host lists might be long
+
+ print loc("
+You can enter multiple sites by seperating them by a space.
+For example:
+ 1 4 2 5
+ ");
+
+ my @reply = $term->get_reply(
+ prompt => loc('Please pick a site: '),
+ choices => [sort(keys %map),
+ qw|Custom View Up Quit|],
+ default => $default,
+ multi => 1,
+ );
+ #$self->_pager_close;
+
+
+ goto COUNTRY if grep { $_ eq 'Up' } @reply;
+ goto CUSTOM if grep { $_ eq 'Custom' } @reply;
+ goto QUIT if grep { $_ eq 'Quit' } @reply;
+
+ ### add the host, but only if it's not on the stack already ###
+ unless( grep { $_ eq 'View' } @reply ) {
+ for my $reply (@reply) {
+ if( grep { $_ eq $map{$reply} } @hosts ) {
+ print loc("Host '%1' already selected", $reply);
+ print "\n\n";
+ } else {
+ push @hosts, $map{$reply}
+ }
+ }
+ }
+
+ $self->_view_hosts(@hosts);
+
+ goto QUIT if $self->autoreply;
+ redo CHOICE;
+ }
+ }
+ }
+
+ CUSTOM: {
+ print loc("
+If there are any additional URLs you would like to use, please add them
+now. You may enter them separately or as a space delimited list.
+
+We provide a default fall-back URL, but you are welcome to override it
+with e.g. 'http://www.cpan.org/' if LWP, wget or curl is installed.
+
+(Enter a single space when you are done, or to simply skip this step.)
+
+Note that if you want to use a local depository, you will have to enter
+as follows:
+
+file://server/path/to/cpan
+
+if the file is on a server on your local network or as:
+
+file:///path/to/cpan
+
+if the file is on your local disk. Note the three /// after the file: bit
+
+");
+
+ CHOICE: {
+ my $reply = $term->get_reply(
+ prompt => loc("Additionals host(s) to add: "),
+ default => '',
+ );
+
+ last CHOICE unless $reply =~ /\S/;
+
+ my $href = $self->_parse_host($reply);
+
+ if( $href ) {
+ push @hosts, $href
+ unless grep {
+ $href->{'scheme'} eq $_->{'scheme'} and
+ $href->{'host'} eq $_->{'host'} and
+ $href->{'path'} eq $_->{'path'}
+ } @hosts;
+
+ last CHOICE if $self->autoreply;
+ } else {
+ print loc("Invalid uri! Please try again!");
+ }
+
+ $self->_view_hosts(@hosts);
+
+ redo CHOICE;
+ }
+
+ DONE: {
+
+ print loc("
+Where would you like to go now?
+
+Please pick one of the following options or Quit when you are done
+
+");
+ my $answer = $term->get_reply(
+ prompt => loc("Where to now?"),
+ default => 'Quit',
+ choices => [qw|Mirror Custom View Quit|],
+ );
+
+ if( $answer eq 'View' ) {
+ $self->_view_hosts(@hosts);
+ redo DONE;
+ }
+
+ goto MIRROR if $answer eq 'Mirror';
+ goto CUSTOM if $answer eq 'Custom';
+ goto QUIT if $answer eq 'Quit';
+ }
+ }
+
+ QUIT: {
+ $conf->set_conf( hosts => \@hosts );
+
+ print loc("
+Your host configuration has been saved
+
+");
+ }
+
+ return 1;
+}
+
+sub _view_hosts {
+ my $self = shift;
+ my @hosts = @_;
+
+ print "\n\n";
+
+ if( scalar @hosts ) {
+ my $i = 1;
+ for my $host (@hosts) {
+
+ ### show full path on file uris, otherwise, just show host
+ my $path = join '', (
+ $host->{'scheme'} eq 'file'
+ ? ( ($host->{'host'} || '[localhost]'),
+ $host->{path} )
+ : $host->{'host'}
+ );
+
+ printf "%-40s %30s\n",
+ loc("Selected %1",$host->{'scheme'} . '://' . $path ),
+ loc("%quant(%2,host) selected thus far.", $i);
+ $i++;
+ }
+ } else {
+ print loc("No hosts selected so far.");
+ }
+
+ print "\n\n";
+
+ return 1;
+}
+
+sub _get_mirrored_by {
+ my $self = shift;
+ my $cpan = $self->backend;
+ my $conf = $self->configure_object;
+
+ print loc("
+Now, we are going to fetch the mirror list for first-time configurations.
+This may take a while...
+
+");
+
+ ### use the enew configuratoin ###
+ $cpan->configure_object( $conf );
+
+ load CPANPLUS::Module::Fake;
+ load CPANPLUS::Module::Author::Fake;
+
+ my $mb = CPANPLUS::Module::Fake->new(
+ module => $conf->_get_source('hosts'),
+ path => '',
+ package => $conf->_get_source('hosts'),
+ author => CPANPLUS::Module::Author::Fake->new(
+ _id => $cpan->_id ),
+ _id => $cpan->_id,
+ );
+
+ my $file = $cpan->_fetch( fetchdir => $conf->get_conf('base'),
+ module => $mb );
+
+ return $file if $file;
+ return;
+}
+
+sub _parse_mirrored_by {
+ my $self = shift;
+ my $file = shift;
+
+ -s $file or return;
+
+ my $fh = new FileHandle;
+ $fh->open("$file")
+ or (
+ warn(loc('Could not open file "%1": %2', $file, $!)),
+ return
+ );
+
+ ### slurp the file in ###
+ { local $/; $file = <$fh> }
+
+ ### remove comments ###
+ $file =~ s/#.*$//gm;
+
+ $fh->close;
+
+ ### sample host entry ###
+ # ftp.sun.ac.za:
+ # frequency = "daily"
+ # dst_ftp = "ftp://ftp.sun.ac.za/CPAN/CPAN/"
+ # dst_location = "Stellenbosch, South Africa, Africa (-26.1992 28.0564)"
+ # dst_organisation = "University of Stellenbosch"
+ # dst_timezone = "+2"
+ # dst_contact = "ftpadm@ftp.sun.ac.za"
+ # dst_src = "ftp.funet.fi"
+ #
+ # # dst_dst = "ftp://ftp.sun.ac.za/CPAN/CPAN/"
+ # # dst_contact = "mailto:ftpadm@ftp.sun.ac.za
+ # # dst_src = "ftp.funet.fi"
+
+ ### host name as key, rest of the entry as value ###
+ my %hosts = $file =~ m/([a-zA-Z0-9\-\.]+):\s+((?:\w+\s+=\s+".*?"\s+)+)/gs;
+
+ while (my($host,$data) = each %hosts) {
+
+ my $href;
+ map {
+ s/^\s*//;
+ my @a = split /\s*=\s*/;
+ $a[1] =~ s/^"(.+?)"$/$1/g;
+ $href->{ pop @a } = pop @a;
+ } grep /\S/, split /\n/, $data;
+
+ ($href->{city_area}, $href->{country}, $href->{continent},
+ $href->{latitude}, $href->{longitude} ) =
+ $href->{dst_location} =~
+ m/
+ #Aizu-Wakamatsu, Tohoku-chiho, Fukushima
+ ^"?(
+ (?:[^,]+?)\s* # city
+ (?:
+ (?:,\s*[^,]+?)\s* # optional area
+ )*? # some have multiple areas listed
+ )
+
+ #Japan
+ ,\s*([^,]+?)\s* # country
+
+ #Asia
+ ,\s*([^,]+?)\s* # continent
+
+ # (37.4333 139.9821)
+ \((\S+)\s+(\S+?)\)"?$ # (latitude longitude)
+ /sx;
+
+ ### parse the different hosts, store them in config format ###
+ my @list;
+
+ for my $type (qw[dst_ftp dst_rsync dst_http]) {
+ my $path = $href->{$type};
+ next unless $path =~ /\w/;
+ if ($type eq 'dst_rsync' && $path !~ /^rsync:/) {
+ $path =~ s{::}{/};
+ $path = "rsync://$path/";
+ }
+ my $parts = $self->_parse_host($path);
+ push @list, $parts;
+ }
+
+ $href->{connections} = \@list;
+ $hosts{$host} = $href;
+ }
+
+ return \%hosts;
+}
+
+sub _parse_host {
+ my $self = shift;
+ my $host = shift;
+
+ my @parts = $host =~ m|^(\w*)://([^/]*)(/.*)$|s;
+
+ my $href;
+ for my $key (qw[scheme host path]) {
+ $href->{$key} = shift @parts;
+ }
+
+ return if lc($href->{'scheme'}) ne 'file' and !$href->{'host'};
+ return if !$href->{'path'};
+
+ return $href;
+}
+
+## tries to figure out close hosts based on your timezone
+##
+## Currently can only report on unique items for each of zones, countries, and
+## sites. In the future this will be combined with something else (perhaps a
+## ping?) to narrow down multiple choices.
+##
+## Tries to return the best zone, country, and site for your location. Any non-
+## unique items will be set to undef instead.
+##
+## (takes hashref, returns array)
+##
+sub _guess_from_timezone {
+ my $self = shift;
+ my $hosts = shift;
+ my (%zones, %countries, %sites);
+
+ ### autrijus - build time zone table
+ my %freq_weight = (
+ 'hourly' => 2400,
+ '4 times a day' => 400,
+ '4x daily' => 400,
+ 'daily' => 100,
+ 'twice daily' => 50,
+ 'weekly' => 15,
+ );
+
+ while (my ($site, $host) = each %{$hosts}) {
+ my ($zone, $continent, $country, $frequency) =
+ @{$host}{qw/dst_timezone continent country frequency/};
+
+
+ # skip non-well-formed ones
+ next unless $continent and $country and $zone =~ /^[-+]?\d+(?::30)?/;
+ ### fix style
+ chomp $zone;
+ $zone =~ s/:30/.5/;
+ $zone =~ s/^\+//;
+ $zone =~ s/"//g;
+
+ $zones{$zone}{$continent}++;
+ $countries{$zone}{$continent}{$country}++;
+ $sites{$zone}{$continent}{$country}{$site} = $freq_weight{$frequency};
+ }
+
+ use Time::Local;
+ my $offset = ((timegm(localtime) - timegm(gmtime)) / 3600);
+
+ local $_;
+
+ ## pick the entry with most country/site/frequency, one level each;
+ ## note it has to be sorted -- otherwise we're depending on the hash order.
+ ## also, the list context assignment (pick first one) is deliberate.
+
+ my ($continent) = map {
+ (sort { ($_->{$b} <=> $_->{$a}) or $b cmp $a } keys(%{$_}))
+ } $zones{$offset};
+
+ my ($country) = map {
+ (sort { ($_->{$b} <=> $_->{$a}) or $b cmp $a } keys(%{$_}))
+ } $countries{$offset}{$continent};
+
+ my ($site) = map {
+ (sort { ($_->{$b} <=> $_->{$a}) or $b cmp $a } keys(%{$_}))
+ } $sites{$offset}{$continent}{$country};
+
+ return ($continent, $country, $site);
+} # _guess_from_timezone
+
+
+### big big regex, stolen to check if you enter a valid address
+{
+ my $RFC822PAT; # RFC pattern to match for valid email address
+
+ sub _valid_email {
+ my $self = shift;
+ if (!$RFC822PAT) {
+ my $esc = '\\\\'; my $Period = '\.'; my $space = '\040';
+ my $tab = '\t'; my $OpenBR = '\['; my $CloseBR = '\]';
+ my $OpenParen = '\('; my $CloseParen = '\)'; my $NonASCII = '\x80-\xff';
+ my $ctrl = '\000-\037'; my $CRlist = '\012\015';
+
+ my $qtext = qq/[^$esc$NonASCII$CRlist\"]/;
+ my $dtext = qq/[^$esc$NonASCII$CRlist$OpenBR$CloseBR]/;
+ my $quoted_pair = qq< $esc [^$NonASCII] >; # an escaped character
+ my $ctext = qq< [^$esc$NonASCII$CRlist()] >;
+ my $Cnested = qq< $OpenParen $ctext* (?: $quoted_pair $ctext* )* $CloseParen >;
+ my $comment = qq< $OpenParen $ctext* (?: (?: $quoted_pair | $Cnested ) $ctext* )* $CloseParen >;
+ my $X = qq< [$space$tab]* (?: $comment [$space$tab]* )* >;
+ my $atom_char = qq/[^($space)<>\@,;:\".$esc$OpenBR$CloseBR$ctrl$NonASCII]/;
+ my $atom = qq< $atom_char+ (?!$atom_char) >;
+ my $quoted_str = qq< \" $qtext * (?: $quoted_pair $qtext * )* \" >;
+ my $word = qq< (?: $atom | $quoted_str ) >;
+ my $domain_ref = $atom;
+ my $domain_lit = qq< $OpenBR (?: $dtext | $quoted_pair )* $CloseBR >;
+ my $sub_domain = qq< (?: $domain_ref | $domain_lit) $X >;
+ my $domain = qq< $sub_domain (?: $Period $X $sub_domain)* >;
+ my $route = qq< \@ $X $domain (?: , $X \@ $X $domain )* : $X >;
+ my $local_part = qq< $word $X (?: $Period $X $word $X )* >;
+ my $addr_spec = qq< $local_part \@ $X $domain >;
+ my $route_addr = qq[ < $X (?: $route )? $addr_spec > ];
+ my $phrase_ctrl = '\000-\010\012-\037'; # like ctrl, but without tab
+ my $phrase_char = qq/[^()<>\@,;:\".$esc$OpenBR$CloseBR$NonASCII$phrase_ctrl]/;
+ my $phrase = qq< $word $phrase_char * (?: (?: $comment | $quoted_str ) $phrase_char * )* >;
+ $RFC822PAT = qq< $X (?: $addr_spec | $phrase $route_addr) >;
+ }
+
+ return scalar ($_[0] =~ /$RFC822PAT/ox);
+ }
+}
+
+
+
+
+
+
+1;
+
+
+sub _edit {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my $file = shift || $conf->_config_pm_to_file( $self->config_type );
+ my $editor = shift || $conf->get_program('editor');
+ my $term = $self->term;
+
+ unless( $editor ) {
+ print loc("
+I'm sorry, I can't find a suitable editor, so I can't offer you
+post-configuration editing of the config file
+
+");
+ return 1;
+ }
+
+ ### save the thing first, so there's something to edit
+ $self->_save;
+
+ return !system("$editor $file");
+}
+
+sub _save {
+ my $self = shift;
+ my $conf = $self->configure_object;
+
+ return $conf->save( $self->config_type );
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist.pm
new file mode 100755
index 00000000000..00c68c39806
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist.pm
@@ -0,0 +1,688 @@
+package CPANPLUS::Dist;
+
+use strict;
+
+use CPANPLUS::Error;
+use CPANPLUS::Internals::Constants;
+
+use Cwd ();
+use Object::Accessor;
+use Parse::CPAN::Meta;
+
+use IPC::Cmd qw[run];
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load check_install];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+use base 'Object::Accessor';
+
+local $Params::Check::VERBOSE = 1;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Dist
+
+=head1 SYNOPSIS
+
+ my $dist = CPANPLUS::Dist::YOUR_DIST_TYPE_HERE->new(
+ module => $modobj,
+ );
+
+=head1 DESCRIPTION
+
+C<CPANPLUS::Dist> is a base class for C<CPANPLUS::Dist::MM>
+and C<CPANPLUS::Dist::Build>. Developers of other C<CPANPLUS::Dist::*>
+plugins should look at C<CPANPLUS::Dist::Base>.
+
+=head1 ACCESSORS
+
+=over 4
+
+=item parent()
+
+Returns the C<CPANPLUS::Module> object that parented this object.
+
+=item status()
+
+Returns the C<Object::Accessor> object that keeps the status for
+this module.
+
+=back
+
+=head1 STATUS ACCESSORS
+
+All accessors can be accessed as follows:
+ $deb->status->ACCESSOR
+
+=over 4
+
+=item created()
+
+Boolean indicating whether the dist was created successfully.
+Explicitly set to C<0> when failed, so a value of C<undef> may be
+interpreted as C<not yet attempted>.
+
+=item installed()
+
+Boolean indicating whether the dist was installed successfully.
+Explicitly set to C<0> when failed, so a value of C<undef> may be
+interpreted as C<not yet attempted>.
+
+=item uninstalled()
+
+Boolean indicating whether the dist was uninstalled successfully.
+Explicitly set to C<0> when failed, so a value of C<undef> may be
+interpreted as C<not yet attempted>.
+
+=item dist()
+
+The location of the final distribution. This may be a file or
+directory, depending on how your distribution plug in of choice
+works. This will be set upon a successful create.
+
+=cut
+
+=back
+
+=head2 $dist = CPANPLUS::Dist::YOUR_DIST_TYPE_HERE->new( module => MODOBJ );
+
+Create a new C<CPANPLUS::Dist::YOUR_DIST_TYPE_HERE> object based on the
+provided C<MODOBJ>.
+
+*** DEPRECATED ***
+The optional argument C<format> is used to indicate what type of dist
+you would like to create (like C<CPANPLUS::Dist::MM> or
+C<CPANPLUS::Dist::Build> and so on ).
+
+C<< CPANPLUS::Dist->new >> is exlusively meant as a method to be
+inherited by C<CPANPLUS::Dist::MM|Build>.
+
+Returns a C<CPANPLUS::Dist::YOUR_DIST_TYPE_HERE> object on success
+and false on failure.
+
+=cut
+
+sub new {
+ my $self = shift;
+ my $class = ref $self || $self;
+ my %hash = @_;
+
+ ### first verify we got a module object ###
+ my( $mod, $format );
+ my $tmpl = {
+ module => { required => 1, allow => IS_MODOBJ, store => \$mod },
+ ### for backwards compatibility
+ format => { default => $class, store => \$format,
+ allow => [ __PACKAGE__->dist_types ],
+ },
+ };
+ check( $tmpl, \%hash ) or return;
+
+ unless( can_load( modules => { $format => '0.0' }, verbose => 1 ) ) {
+ error(loc("'%1' not found -- you need '%2' version '%3' or higher ".
+ "to detect plugins", $format, 'Module::Pluggable','2.4'));
+ return;
+ }
+
+ ### get an empty o::a object for this class
+ my $obj = $format->SUPER::new;
+
+ $obj->mk_accessors( qw[parent status] );
+
+ ### set the parent
+ $obj->parent( $mod );
+
+ ### create a status object ###
+ { my $acc = Object::Accessor->new;
+ $obj->status($acc);
+
+ ### add minimum supported accessors
+ $acc->mk_accessors( qw[prepared created installed uninstalled
+ distdir dist] );
+ }
+
+ ### get the conf object ###
+ my $conf = $mod->parent->configure_object();
+
+ ### check if the format is available in this environment ###
+ if( $conf->_get_build('sanity_check') and not $obj->format_available ) {
+ error( loc( "Format '%1' is not available", $format) );
+ return;
+ }
+
+ ### now initialize it or admit failure
+ unless( $obj->init ) {
+ error(loc("Dist initialization of '%1' failed for '%2'",
+ $format, $mod->module));
+ return;
+ }
+
+ ### return the object
+ return $obj;
+}
+
+=head2 @dists = CPANPLUS::Dist->dist_types;
+
+Returns a list of the CPANPLUS::Dist::* classes available
+
+=cut
+
+### returns a list of dist_types we support
+### will get overridden by Module::Pluggable if loaded
+### XXX add support for 'plugin' dir in config as well
+{ my $Loaded;
+ my @Dists = (INSTALLER_MM);
+ my @Ignore = ();
+
+ ### backdoor method to add more dist types
+ sub _add_dist_types { my $self = shift; push @Dists, @_ };
+
+ ### backdoor method to exclude dist types
+ sub _ignore_dist_types { my $self = shift; push @Ignore, @_ };
+ sub _reset_dist_ignore { @Ignore = () };
+
+ ### locally add the plugins dir to @INC, so we can find extra plugins
+ #local @INC = @INC, File::Spec->catdir(
+ # $conf->get_conf('base'),
+ # $conf->_get_build('plugins') );
+
+ ### load any possible plugins
+ sub dist_types {
+
+ if ( !$Loaded++ and check_install( module => 'Module::Pluggable',
+ version => '2.4')
+ ) {
+ require Module::Pluggable;
+
+ my $only_re = __PACKAGE__ . '::\w+$';
+ my %except = map { $_ => 1 }
+ INSTALLER_SAMPLE,
+ INSTALLER_BASE;
+
+ Module::Pluggable->import(
+ sub_name => '_dist_types',
+ search_path => __PACKAGE__,
+ only => qr/$only_re/,
+ require => 1,
+ except => [ keys %except ]
+ );
+ my %ignore = map { $_ => $_ } @Ignore;
+
+ push @Dists, grep { not $ignore{$_} and not $except{$_} }
+ __PACKAGE__->_dist_types;
+ }
+
+ return @Dists;
+ }
+
+=head2 $bool = CPANPLUS::Dist->rescan_dist_types;
+
+Rescans C<@INC> for available dist types. Useful if you've installed new
+C<CPANPLUS::Dist::*> classes and want to make them available to the
+current process.
+
+=cut
+
+ sub rescan_dist_types {
+ my $dist = shift;
+ $Loaded = 0; # reset the flag;
+ return $dist->dist_types;
+ }
+}
+
+=head2 $bool = CPANPLUS::Dist->has_dist_type( $type )
+
+Returns true if distribution type C<$type> is loaded/supported.
+
+=cut
+
+sub has_dist_type {
+ my $dist = shift;
+ my $type = shift or return;
+
+ return scalar grep { $_ eq $type } CPANPLUS::Dist->dist_types;
+}
+
+=head2 $bool = $dist->prereq_satisfied( modobj => $modobj, version => $version_spec )
+
+Returns true if this prereq is satisfied. Returns false if it's not.
+Also issues an error if it seems "unsatisfiable," i.e. if it can't be
+found on CPAN or the latest CPAN version doesn't satisfy it.
+
+=cut
+
+sub prereq_satisfied {
+ my $dist = shift;
+ my $cb = $dist->parent->parent;
+ my %hash = @_;
+
+ my($mod,$ver);
+ my $tmpl = {
+ version => { required => 1, store => \$ver },
+ modobj => { required => 1, store => \$mod, allow => IS_MODOBJ },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ return 1 if $mod->is_uptodate( version => $ver );
+
+ if ( $cb->_vcmp( $ver, $mod->version ) > 0 ) {
+
+ error(loc(
+ "This distribution depends on %1, but the latest version".
+ " of %2 on CPAN (%3) doesn't satisfy the specific version".
+ " dependency (%4). You may have to resolve this dependency ".
+ "manually.",
+ $mod->module, $mod->module, $mod->version, $ver ));
+
+ }
+
+ return;
+}
+
+=head2 $configure_requires = $dist->find_configure_requires( [file => /path/to/META.yml] )
+
+Reads the configure_requires for this distribution from the META.yml
+file in the root directory and returns a hashref with module names
+and versions required.
+
+=cut
+
+sub find_configure_requires {
+ my $self = shift;
+ my $mod = $self->parent;
+ my $meth = 'configure_requires';
+
+ ### the prereqs as we have them now
+ my @args = (
+ defaults => $mod->status->$meth || {},
+ keys => [ $meth ],
+ );
+
+ ### the default file to use, which may be overriden
+ push @args, ( file => META_YML->( $mod->status->extract ) )
+ if defined $mod->status->extract;
+
+ my $href = $self->_prereqs_from_meta_file( @args, @_ );
+
+ ### and store it in the module
+ $mod->status->$meth( $href );
+
+ return { %$href };
+}
+
+sub find_mymeta_requires {
+ my $self = shift;
+ my $mod = $self->parent;
+ my $meth = 'prereqs';
+
+ ### the prereqs as we have them now
+ my @args = (
+ defaults => $mod->status->$meth || {},
+ keys => [qw|requires build_requires|],
+ );
+
+ ### the default file to use, which may be overriden
+ push @args, ( file => MYMETA_YML->( $mod->status->extract ) )
+ if defined $mod->status->extract;
+
+ my $href = $self->_prereqs_from_meta_file( @args, @_ );
+
+ ### and store it in the module
+ $mod->status->$meth( $href );
+
+ return { %$href };
+}
+
+sub _prereqs_from_meta_file {
+ my $self = shift;
+ my $mod = $self->parent;
+ my %hash = @_;
+
+ my( $meta, $defaults, $keys );
+ my $tmpl = { ### check if we have an extract path. if not, we
+ ### get 'undef value' warnings from file::spec
+ file => { default => do { defined $mod->status->extract
+ ? META_YML->( $mod->status->extract )
+ : '' },
+ store => \$meta,
+ },
+ defaults => { required => 1, default => {}, strict_type => 1,
+ store => \$defaults },
+ keys => { required => 1, default => [], strict_type => 1,
+ store => \$keys },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### if there's a meta file, we read it;
+ if( -e $meta ) {
+
+ ### Parse::CPAN::Meta uses exceptions for errors
+ ### hash returned in list context!!!
+ my ($doc) = eval { Parse::CPAN::Meta::LoadFile( $meta ) };
+
+ unless( $doc ) {
+ error(loc( "Could not read %1: '%2'", $meta, $@ ));
+ return $defaults;
+ }
+
+ ### read the keys now, make sure not to throw
+ ### away anything that was already added
+ for my $key ( @$keys ) {
+ $defaults = {
+ %$defaults,
+ %{ $doc->{$key} },
+ } if $doc->{ $key };
+ }
+ }
+
+ ### and return a copy
+ return \%{ $defaults };
+}
+
+=head2 $bool = $dist->_resolve_prereqs( ... )
+
+Makes sure prerequisites are resolved
+
+ format The dist class to use to make the prereqs
+ (ie. CPANPLUS::Dist::MM)
+
+ prereqs Hash of the prerequisite modules and their versions
+
+ target What to do with the prereqs.
+ create => Just build them
+ install => Install them
+ ignore => Ignore them
+
+ prereq_build If true, always build the prereqs even if already
+ resolved
+
+ verbose Be verbose
+
+ force Force the prereq to be built, even if already resolved
+
+=cut
+
+sub _resolve_prereqs {
+ my $dist = shift;
+ my $self = $dist->parent;
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my ($prereqs, $format, $verbose, $target, $force, $prereq_build);
+ my $tmpl = {
+ ### XXX perhaps this should not be required, since it may not be
+ ### packaged, just installed...
+ ### Let it be empty as well -- that means the $modobj->install
+ ### routine will figure it out, which is fine if we didn't have any
+ ### very specific wishes (it will even detect the favourite
+ ### dist_type).
+ format => { required => 1, store => \$format,
+ allow => ['',__PACKAGE__->dist_types], },
+ prereqs => { required => 1, default => { },
+ strict_type => 1, store => \$prereqs },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ ### make sure allow matches with $mod->install's list
+ target => { default => '', store => \$target,
+ allow => ['',qw[create ignore install]] },
+ prereq_build => { default => 0, store => \$prereq_build },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### so there are no prereqs? then don't even bother
+ return 1 unless keys %$prereqs;
+
+ ### Make sure we wound up where we started.
+ my $original_wd = Cwd::cwd;
+
+ ### so you didn't provide an explicit target.
+ ### maybe your config can tell us what to do.
+ $target ||= {
+ PREREQ_ASK, TARGET_INSTALL, # we'll bail out if the user says no
+ PREREQ_BUILD, TARGET_CREATE,
+ PREREQ_IGNORE, TARGET_IGNORE,
+ PREREQ_INSTALL, TARGET_INSTALL,
+ }->{ $conf->get_conf('prereqs') } || '';
+
+ ### XXX BIG NASTY HACK XXX FIXME at some point.
+ ### when installing Bundle::CPANPLUS::Dependencies, we want to
+ ### install all packages matching 'cpanplus' to be installed last,
+ ### as all CPANPLUS' prereqs are being installed as well, but are
+ ### being loaded for bootstrapping purposes. This means CPANPLUS
+ ### can find them, but for example cpanplus::dist::build won't,
+ ### which gets messy FAST. So, here we sort our prereqs only IF
+ ### the parent module is Bundle::CPANPLUS::Dependencies.
+ ### Really, we would wnat some sort of sorted prereq mechanism,
+ ### but Bundle:: doesn't support it, and we flatten everything
+ ### to a hash internally. A sorted hash *might* do the trick if
+ ### we got a transparent implementation.. that would mean we would
+ ### just have to remove the 'sort' here, and all will be well
+ my @sorted_prereqs;
+
+ ### use regex, could either be a module name, or a package name
+ if( $self->module =~ /^Bundle(::|-)CPANPLUS(::|-)Dependencies/ ) {
+ my (@first, @last);
+ for my $mod ( sort keys %$prereqs ) {
+ $mod =~ /CPANPLUS/
+ ? push @last, $mod
+ : push @first, $mod;
+ }
+ @sorted_prereqs = (@first, @last);
+ } else {
+ @sorted_prereqs = sort keys %$prereqs;
+ }
+
+ ### first, transfer this key/value pairing into a
+ ### list of module objects + desired versions
+ my @install_me;
+
+ for my $mod ( @sorted_prereqs ) {
+ my $version = $prereqs->{$mod};
+
+ ### 'perl' is a special case, there's no mod object for it
+ if( $mod eq PERL_CORE ) {
+
+ ### run a CLI invocation to see if the perl you specified is
+ ### uptodate
+ my $ok = run( command => "$^X -M$version -e1", verbose => 0 );
+
+ unless( $ok ) {
+ error(loc( "Module '%1' needs perl version '%2', but you ".
+ "only have version '%3' -- can not proceed",
+ $self->module, $version,
+ $cb->_perl_version( perl => $^X ) ) );
+ return;
+ }
+
+ next;
+ }
+
+ my $modobj = $cb->module_tree($mod);
+
+ #### XXX we ignore the version, and just assume that the latest
+ #### version from cpan will meet your requirements... dodgy =/
+ unless( $modobj ) {
+ # Check if it is a core module
+ my $sub = CPANPLUS::Module->can(
+ 'module_is_supplied_with_perl_core' );
+ my $core = $sub->( $mod );
+ unless ( $core ) {
+ error( loc( "No such module '%1' found on CPAN", $mod ) );
+ next;
+ }
+ if ( $cb->_vcmp( $version, $core ) > 0 ) {
+ error(loc( "Version of core module '%1' ('%2') is too low for ".
+ "'%3' (needs '%4') -- carrying on but this may be a problem",
+ $mod, $core,
+ $self->module, $version ));
+ }
+ next;
+ }
+
+ ### it's not uptodate, we need to install it
+ if( !$dist->prereq_satisfied(modobj => $modobj, version => $version)) {
+ msg(loc("Module '%1' requires '%2' version '%3' to be installed ",
+ $self->module, $modobj->module, $version), $verbose );
+
+ push @install_me, [$modobj, $version];
+
+ ### it's not an MM or Build format, that means it's a package
+ ### manager... we'll need to install it as well, via the PM
+ } elsif ( INSTALL_VIA_PACKAGE_MANAGER->($format) and
+ !$modobj->package_is_perl_core and
+ ($target ne TARGET_IGNORE)
+ ) {
+ msg(loc("Module '%1' depends on '%2', may need to build a '%3' ".
+ "package for it as well", $self->module, $modobj->module,
+ $format));
+ push @install_me, [$modobj, $version];
+ }
+ }
+
+
+
+ ### so you just want to ignore prereqs? ###
+ if( $target eq TARGET_IGNORE ) {
+
+ ### but you have modules you need to install
+ if( @install_me ) {
+ msg(loc("Ignoring prereqs, this may mean your install will fail"),
+ $verbose);
+ msg(loc("'%1' listed the following dependencies:", $self->module),
+ $verbose);
+
+ for my $aref (@install_me) {
+ my ($mod,$version) = @$aref;
+
+ my $str = sprintf "\t%-35s %8s\n", $mod->module, $version;
+ msg($str,$verbose);
+ }
+
+ return;
+
+ ### ok, no problem, you have all needed prereqs anyway
+ } else {
+ return 1;
+ }
+ }
+
+ my $flag;
+ for my $aref (@install_me) {
+ my($modobj,$version) = @$aref;
+
+ ### another prereq may have already installed this one...
+ ### so dont ask again if the module turns out to be uptodate
+ ### see bug [#11840]
+ ### if either force or prereq_build are given, the prereq
+ ### should be built anyway
+ next if (!$force and !$prereq_build) &&
+ $dist->prereq_satisfied(modobj => $modobj, version => $version);
+
+ ### either we're told to ignore the prereq,
+ ### or the user wants us to ask him
+ if( ( $conf->get_conf('prereqs') == PREREQ_ASK and not
+ $cb->_callbacks->install_prerequisite->($self, $modobj)
+ )
+ ) {
+ msg(loc("Will not install prerequisite '%1' -- Note " .
+ "that the overall install may fail due to this",
+ $modobj->module), $verbose);
+ next;
+ }
+
+ ### value set and false -- means failure ###
+ if( defined $modobj->status->installed
+ && !$modobj->status->installed
+ ) {
+ error( loc( "Prerequisite '%1' failed to install before in " .
+ "this session", $modobj->module ) );
+ $flag++;
+ last;
+ }
+
+ ### part of core?
+ if( $modobj->package_is_perl_core ) {
+ error(loc("Prerequisite '%1' is perl-core (%2) -- not ".
+ "installing that. Aborting install",
+ $modobj->module, $modobj->package ) );
+ $flag++;
+ last;
+ }
+
+ ### circular dependency code ###
+ my $pending = $cb->_status->pending_prereqs || {};
+
+ ### recursive dependency ###
+ if ( $pending->{ $modobj->module } ) {
+ error( loc( "Recursive dependency detected (%1) -- skipping",
+ $modobj->module ) );
+ next;
+ }
+
+ ### register this dependency as pending ###
+ $pending->{ $modobj->module } = $modobj;
+ $cb->_status->pending_prereqs( $pending );
+
+ ### call $modobj->install rather than doing
+ ### CPANPLUS::Dist->new and the like ourselves,
+ ### since ->install will take care of fetch &&
+ ### extract as well
+ my $pa = $dist->status->_prepare_args || {};
+ my $ca = $dist->status->_create_args || {};
+ my $ia = $dist->status->_install_args || {};
+
+ unless( $modobj->install( %$pa, %$ca, %$ia,
+ force => $force,
+ verbose => $verbose,
+ format => $format,
+ target => $target )
+ ) {
+ error(loc("Failed to install '%1' as prerequisite " .
+ "for '%2'", $modobj->module, $self->module ) );
+ $flag++;
+ }
+
+ ### unregister the pending dependency ###
+ $pending->{ $modobj->module } = 0;
+ $cb->_status->pending_prereqs( $pending );
+
+ last if $flag;
+
+ ### don't want us to install? ###
+ if( $target ne TARGET_INSTALL ) {
+ my $dir = $modobj->status->extract
+ or error(loc("No extraction dir for '%1' found ".
+ "-- weird", $modobj->module));
+
+ $modobj->add_to_includepath();
+
+ next;
+ }
+ }
+
+ ### reset the $prereqs iterator, in case we bailed out early ###
+ keys %$prereqs;
+
+ ### chdir back to where we started
+ $cb->_chdir( dir => $original_wd );
+
+ return 1 unless $flag;
+ return;
+}
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Autobundle.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Autobundle.pm
new file mode 100755
index 00000000000..16638b258f8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Autobundle.pm
@@ -0,0 +1,117 @@
+package CPANPLUS::Dist::Autobundle;
+
+use strict;
+use warnings;
+use CPANPLUS::Error qw[error msg];
+use Params::Check qw[check];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+use base qw[CPANPLUS::Dist::Base];
+
+=head1 NAME
+
+CPANPLUS::Dist::Autobundle
+
+=head1 SYNOPSIS
+
+ $modobj = $cb->parse_module( module => 'file://path/to/Snapshot_XXYY.pm' );
+ $modobj->install;
+
+=head1 DESCRIPTION
+
+C<CPANPLUS::Dist::Autobundle> is a distribution class for installing installation
+snapshots as created by C<CPANPLUS>' C<autobundle> command.
+
+All modules as mentioned in the snapshot will be installed on your system.
+
+=cut
+
+sub init {
+ my $dist = shift;
+ my $status = $dist->status;
+
+ $status->mk_accessors(
+ qw[prepared created installed _prepare_args _create_args _install_args]
+ );
+
+ return 1;
+}
+
+sub prepare {
+ my $dist = shift;
+ my %args = @_;
+
+ ### store the arguments, so ->install can use them in recursive loops ###
+ $dist->status->_prepare_args( \%args );
+
+ return $dist->status->prepared( 1 );
+}
+
+sub create {
+ my $dist = shift;
+ my $self = $dist->parent;
+
+ ### we're also the cpan_dist, since we don't need to have anything
+ ### prepared
+ $dist = $self->status->dist_cpan if $self->status->dist_cpan;
+ $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my( $force, $verbose, $prereq_target, $prereq_format, $prereq_build);
+
+ my $args = do {
+ local $Params::Check::ALLOW_UNKNOWN = 1;
+ my $tmpl = {
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ prereq_target => { default => '', store => \$prereq_target },
+
+ ### don't set the default prereq format to 'makemaker' -- wrong!
+ prereq_format => { #default => $self->status->installer_type,
+ default => '',
+ store => \$prereq_format },
+ prereq_build => { default => 0, store => \$prereq_build },
+ };
+
+ check( $tmpl, \%hash ) or return;
+ };
+
+ ### maybe we already ran a create on this object? ###
+ return 1 if $dist->status->created && !$force;
+
+ ### store the arguments, so ->install can use them in recursive loops ###
+ $dist->status->_create_args( \%hash );
+
+ msg(loc("Resolving prerequisites mentioned in the bundle"), $verbose);
+
+ ### this will set the directory back to the start
+ ### dir, so we must chdir /again/
+ my $ok = $dist->_resolve_prereqs(
+ format => $prereq_format,
+ verbose => $verbose,
+ prereqs => $self->status->prereqs,
+ target => $prereq_target,
+ force => $force,
+ prereq_build => $prereq_build,
+ );
+
+ ### if all went well, mark it & return
+ return $dist->status->created( $ok ? 1 : 0);
+}
+
+sub install {
+ my $dist = shift;
+ my %args = @_;
+
+ ### store the arguments, so ->install can use them in recursive loops ###
+ $dist->status->_install_args( \%args );
+
+ return $dist->status->installed( 1 );
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Base.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Base.pm
new file mode 100755
index 00000000000..c7108ed1392
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Base.pm
@@ -0,0 +1,261 @@
+package CPANPLUS::Dist::Base;
+
+use strict;
+
+use base qw[CPANPLUS::Dist];
+use vars qw[$VERSION];
+$VERSION = $CPANPLUS::Internals::VERSION = $CPANPLUS::Internals::VERSION;
+
+
+=head1 NAME
+
+CPANPLUS::Dist::Base - Base class for custom distribution classes
+
+=head1 SYNOPSIS
+
+ package CPANPLUS::Dist::MY_IMPLEMENTATION
+
+ use base 'CPANPLUS::Dist::Base';
+
+ sub prepare {
+ my $dist = shift;
+
+ ### do the 'standard' things
+ $dist->SUPER::prepare( @_ ) or return;
+
+ ### do MY_IMPLEMENTATION specific things
+ ...
+
+ ### don't forget to set the status!
+ return $dist->status->prepared( $SUCCESS ? 1 : 0 );
+ }
+
+
+=head1 DESCRIPTION
+
+CPANPLUS::Dist::Base functions as a base class for all custom
+distribution implementations. It does all the mundane work
+CPANPLUS would have done without a custom distribution, so you
+can override just the parts you need to make your own implementation
+work.
+
+=head1 FLOW
+
+Below is a brief outline when and in which order methods in this
+class are called:
+
+ $Class->format_available; # can we use this class on this system?
+
+ $dist->init; # set up custom accessors, etc
+ $dist->prepare; # find/write meta information
+ $dist->create; # write the distribution file
+ $dist->install; # install the distribution file
+
+ $dist->uninstall; # remove the distribution (OPTIONAL)
+
+=head1 METHODS
+
+=cut
+
+=head2 @subs = $Class->methods
+
+Returns a list of methods that this class implements that you can
+override.
+
+=cut
+
+sub methods {
+ return qw[format_available init prepare create install uninstall]
+}
+
+=head2 $bool = $Class->format_available
+
+This method is called when someone requests a module to be installed
+via the superclass. This gives you the opportunity to check if all
+the needed requirements to build and install this distribution have
+been met.
+
+For example, you might need a command line program, or a certain perl
+module installed to do your job. Now is the time to check.
+
+Simply return true if the request can proceed and false if it can not.
+
+The C<CPANPLUS::Dist::Base> implementation always returns true.
+
+=cut
+
+sub format_available { return 1 }
+
+
+=head2 $bool = $dist->init
+
+This method is called just after the new dist object is set up and
+before the C<prepare> method is called. This is the time to set up
+the object so it can be used with your class.
+
+For example, you might want to add extra accessors to the C<status>
+object, which you might do as follows:
+
+ $dist->status->mk_accessors( qw[my_implementation_accessor] );
+
+The C<status> object is implemented as an instance of the
+C<Object::Accessor> class. Please refer to its documentation for
+details.
+
+Return true if the initialization was successul, and false if it was
+not.
+
+The C<CPANPLUS::Dist::Base> implementation does not alter your object
+and always returns true.
+
+=cut
+
+sub init { return 1; }
+
+=head2 $bool = $dist->prepare
+
+This runs the preparation step of your distribution. This step is meant
+to set up the environment so the C<create> step can create the actual
+distribution(file).
+A C<prepare> call in the standard C<ExtUtils::MakeMaker> distribution
+would, for example, run C<perl Makefile.PL> to find the dependencies
+for a distribution. For a C<debian> distribution, this is where you
+would write all the metafiles required for the C<dpkg-*> tools.
+
+The C<CPANPLUS::Dist::Base> implementation simply calls the underlying
+distribution class (Typically C<CPANPLUS::Dist::MM> or
+C<CPANPLUS::Dist::Build>).
+
+Sets C<< $dist->status->prepared >> to the return value of this function.
+If you override this method, you should make sure to set this value.
+
+=cut
+
+sub prepare {
+ ### just in case you already did a create call for this module object
+ ### just via a different dist object
+ my $dist = shift;
+ my $self = $dist->parent;
+ my $dist_cpan = $self->status->dist_cpan;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+
+ $dist->status->prepared( $dist_cpan->prepare( @_ ) );
+}
+
+=head2 $bool = $dist->create
+
+This runs the creation step of your distribution. This step is meant
+to follow up on the C<prepare> call, that set up your environment so
+the C<create> step can create the actual distribution(file).
+A C<create> call in the standard C<ExtUtils::MakeMaker> distribution
+would, for example, run C<make> and C<make test> to build and test
+a distribution. For a C<debian> distribution, this is where you
+would create the actual C<.deb> file using C<dpkg>.
+
+The C<CPANPLUS::Dist::Base> implementation simply calls the underlying
+distribution class (Typically C<CPANPLUS::Dist::MM> or
+C<CPANPLUS::Dist::Build>).
+
+Sets C<< $dist->status->dist >> to the location of the created
+distribution.
+If you override this method, you should make sure to set this value.
+
+Sets C<< $dist->status->created >> to the return value of this function.
+If you override this method, you should make sure to set this value.
+
+=cut
+
+sub create {
+ ### just in case you already did a create call for this module object
+ ### just via a different dist object
+ my $dist = shift;
+ my $self = $dist->parent;
+ my $dist_cpan = $self->status->dist_cpan;
+ $dist = $self->status->dist if $self->status->dist;
+ $self->status->dist( $dist ) unless $self->status->dist;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my $format = ref $dist;
+
+ ### make sure to set this variable, if the caller hasn't yet
+ ### just so we have some clue where the dist left off.
+ $dist->status->dist( $dist_cpan->status->distdir )
+ unless defined $dist->status->dist;
+
+ $dist->status->created( $dist_cpan->create(prereq_format => $format, @_) );
+}
+
+=head2 $bool = $dist->install
+
+This runs the install step of your distribution. This step is meant
+to follow up on the C<create> call, which prepared a distribution(file)
+to install.
+A C<create> call in the standard C<ExtUtils::MakeMaker> distribution
+would, for example, run C<make install> to copy the distribution files
+to their final destination. For a C<debian> distribution, this is where
+you would run C<dpkg --install> on the created C<.deb> file.
+
+The C<CPANPLUS::Dist::Base> implementation simply calls the underlying
+distribution class (Typically C<CPANPLUS::Dist::MM> or
+C<CPANPLUS::Dist::Build>).
+
+Sets C<< $dist->status->installed >> to the return value of this function.
+If you override this method, you should make sure to set this value.
+
+=cut
+
+sub install {
+ ### just in case you already did a create call for this module object
+ ### just via a different dist object
+ my $dist = shift;
+ my $self = $dist->parent;
+ my $dist_cpan = $self->status->dist_cpan;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+
+ $dist->status->installed( $dist_cpan->install( @_ ) );
+}
+
+=head2 $bool = $dist->uninstall
+
+This runs the uninstall step of your distribution. This step is meant
+to remove the distribution from the file system.
+A C<uninstall> call in the standard C<ExtUtils::MakeMaker> distribution
+would, for example, run C<make uninstall> to remove the distribution
+files the file system. For a C<debian> distribution, this is where you
+would run C<dpkg --uninstall PACKAGE>.
+
+The C<CPANPLUS::Dist::Base> implementation simply calls the underlying
+distribution class (Typically C<CPANPLUS::Dist::MM> or
+C<CPANPLUS::Dist::Build>).
+
+Sets C<< $dist->status->uninstalled >> to the return value of this function.
+If you override this method, you should make sure to set this value.
+
+=cut
+
+sub uninstall {
+ ### just in case you already did a create call for this module object
+ ### just via a different dist object
+ my $dist = shift;
+ my $self = $dist->parent;
+ my $dist_cpan = $self->status->dist_cpan;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+
+ $dist->status->uninstalled( $dist_cpan->uninstall( @_ ) );
+}
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Build.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Build.pm
new file mode 100755
index 00000000000..0f27639cda5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Build.pm
@@ -0,0 +1,836 @@
+package CPANPLUS::Dist::Build;
+
+use strict;
+use warnings;
+use vars qw[@ISA $STATUS $VERSION];
+@ISA = qw[CPANPLUS::Dist];
+
+use CPANPLUS::Internals::Constants;
+
+### these constants were exported by CPANPLUS::Internals::Constants
+### in previous versions.. they do the same though. If we want to have
+### a normal 'use' here, up the dependency to CPANPLUS 0.056 or higher
+BEGIN {
+ require CPANPLUS::Dist::Build::Constants;
+ CPANPLUS::Dist::Build::Constants->import()
+ if not __PACKAGE__->can('BUILD') && __PACKAGE__->can('BUILD_DIR');
+}
+
+use CPANPLUS::Error;
+
+use Config;
+use FileHandle;
+use Cwd;
+use version;
+
+use IPC::Cmd qw[run];
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load check_install];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+local $Params::Check::VERBOSE = 1;
+
+$VERSION = '0.46';
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Dist::Build - CPANPLUS plugin to install packages that use Build.PL
+
+=head1 SYNOPSIS
+
+ my $build = CPANPLUS::Dist->new(
+ format => 'CPANPLUS::Dist::Build',
+ module => $modobj,
+ );
+
+ $build->prepare; # runs Build.PL
+ $build->create; # runs build && build test
+ $build->install; # runs build install
+
+
+=head1 DESCRIPTION
+
+C<CPANPLUS::Dist::Build> is a distribution class for C<Module::Build>
+related modules.
+Using this package, you can create, install and uninstall perl
+modules. It inherits from C<CPANPLUS::Dist>.
+
+Normal users won't have to worry about the interface to this module,
+as it functions transparently as a plug-in to C<CPANPLUS> and will
+just C<Do The Right Thing> when it's loaded.
+
+=head1 ACCESSORS
+
+=over 4
+
+=item C<parent()>
+
+Returns the C<CPANPLUS::Module> object that parented this object.
+
+=item C<status()>
+
+Returns the C<Object::Accessor> object that keeps the status for
+this module.
+
+=back
+
+=head1 STATUS ACCESSORS
+
+All accessors can be accessed as follows:
+ $build->status->ACCESSOR
+
+=over 4
+
+=item C<build_pl ()>
+
+Location of the Build file.
+Set to 0 explicitly if something went wrong.
+
+=item C<build ()>
+
+BOOL indicating if the C<Build> command was successful.
+
+=item C<test ()>
+
+BOOL indicating if the C<Build test> command was successful.
+
+=item C<prepared ()>
+
+BOOL indicating if the C<prepare> call exited succesfully
+This gets set after C<perl Build.PL>
+
+=item C<distdir ()>
+
+Full path to the directory in which the C<prepare> call took place,
+set after a call to C<prepare>.
+
+=item C<created ()>
+
+BOOL indicating if the C<create> call exited succesfully. This gets
+set after C<Build> and C<Build test>.
+
+=item C<installed ()>
+
+BOOL indicating if the module was installed. This gets set after
+C<Build install> exits successfully.
+
+=item uninstalled ()
+
+BOOL indicating if the module was uninstalled properly.
+
+=item C<_create_args ()>
+
+Storage of the arguments passed to C<create> for this object. Used
+for recursive calls when satisfying prerequisites.
+
+=item C<_install_args ()>
+
+Storage of the arguments passed to C<install> for this object. Used
+for recursive calls when satisfying prerequisites.
+
+=back
+
+=cut
+
+=head1 METHODS
+
+=head2 $bool = CPANPLUS::Dist::Build->format_available();
+
+Returns a boolean indicating whether or not you can use this package
+to create and install modules in your environment.
+
+=cut
+
+### check if the format is available ###
+sub format_available {
+ my $mod = "Module::Build";
+ unless( can_load( modules => { $mod => '0.2611' } ) ) {
+ error( loc( "You do not have '%1' -- '%2' not available",
+ $mod, __PACKAGE__ ) );
+ return;
+ }
+
+ return 1;
+}
+
+
+=head2 $bool = $dist->init();
+
+Sets up the C<CPANPLUS::Dist::Build> object for use.
+Effectively creates all the needed status accessors.
+
+Called automatically whenever you create a new C<CPANPLUS::Dist> object.
+
+=cut
+
+sub init {
+ my $dist = shift;
+ my $status = $dist->status;
+
+ $status->mk_accessors(qw[build_pl build test created installed uninstalled
+ _create_args _install_args _prepare_args
+ _mb_object _buildflags
+ ]);
+
+ ### just in case 'format_available' didn't get called
+ require Module::Build;
+
+ return 1;
+}
+
+=pod
+
+=head2 $bool = $dist->prepare([perl => '/path/to/perl', buildflags => 'EXTRA=FLAGS', force => BOOL, verbose => BOOL])
+
+C<prepare> prepares a distribution, running C<Build.PL>
+and establishing any prerequisites this
+distribution has.
+
+The variable C<PERL5_CPANPLUS_IS_EXECUTING> will be set to the full path
+of the C<Build.PL> that is being executed. This enables any code inside
+the C<Build.PL> to know that it is being installed via CPANPLUS.
+
+After a succcesfull C<prepare> you may call C<create> to create the
+distribution, followed by C<install> to actually install it.
+
+Returns true on success and false on failure.
+
+=cut
+
+sub prepare {
+ ### just in case you already did a create call for this module object
+ ### just via a different dist object
+ my $dist = shift;
+ my $self = $dist->parent;
+
+ ### we're also the cpan_dist, since we don't need to have anything
+ ### prepared from another installer
+ $dist = $self->status->dist_cpan if $self->status->dist_cpan;
+ $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $dir;
+ unless( $dir = $self->status->extract ) {
+ error( loc( "No dir found to operate on!" ) );
+ return;
+ }
+
+ my $args;
+ my( $force, $verbose, $buildflags, $perl, $prereq_target, $prereq_format,
+ $prereq_build );
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+ my $tmpl = {
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ perl => { default => $^X, store => \$perl },
+ buildflags => { default => $conf->get_conf('buildflags'),
+ store => \$buildflags },
+ prereq_target => { default => '', store => \$prereq_target },
+ prereq_format => { default => '',
+ store => \$prereq_format },
+ prereq_build => { default => 0, store => \$prereq_build },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ return 1 if $dist->status->prepared && !$force;
+
+ $dist->status->_prepare_args( $args );
+
+ ### chdir to work directory ###
+ my $orig = cwd();
+ unless( $cb->_chdir( dir => $dir ) ) {
+ error( loc( "Could not chdir to build directory '%1'", $dir ) );
+ return;
+ }
+
+ ### by now we've loaded module::build, and we're using the API, so
+ ### it's safe to remove CPANPLUS::inc from our inc path, especially
+ ### because it can trip up tests run under taint (just like EU::MM).
+ ### turn off our PERL5OPT so no modules from CPANPLUS::inc get
+ ### included in make test -- it should build without.
+ ### also, modules that run in taint mode break if we leave
+ ### our code ref in perl5opt
+ ### XXX we've removed the ENV settings from cp::inc, so only need
+ ### to reset the @INC
+ #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt;
+ #local $ENV{PERL5LIB} = CPANPLUS::inc->original_perl5lib;
+ #local @INC = CPANPLUS::inc->original_inc;
+
+ ### this will generate warnings under anything lower than M::B 0.2606
+ my @buildflags = $dist->_buildflags_as_list( $buildflags );
+ $dist->status->_buildflags( $buildflags );
+
+ my $fail;
+ RUN: {
+ # 0.85_01
+ ### we resolve 'configure requires' here, so we can run the 'perl
+ ### Makefile.PL' command
+ ### XXX for tests: mock f_c_r to something that *can* resolve and
+ ### something that *doesnt* resolve. Check the error log for ok
+ ### on this step or failure
+ ### XXX make a seperate tarball to test for this scenario: simply
+ ### containing a makefile.pl/build.pl for test purposes?
+ my $safe_ver = version->new('0.85_01');
+ if ( version->new($CPANPLUS::Internals::VERSION) >= $safe_ver )
+ { my $configure_requires = $dist->find_configure_requires;
+ my $ok = $dist->_resolve_prereqs(
+ format => $prereq_format,
+ verbose => $verbose,
+ prereqs => $configure_requires,
+ target => $prereq_target,
+ force => $force,
+ prereq_build => $prereq_build,
+ );
+
+ unless( $ok ) {
+
+ #### use $dist->flush to reset the cache ###
+ error( loc( "Unable to satisfy '%1' for '%2' " .
+ "-- aborting install",
+ 'configure_requires', $self->module ) );
+ $dist->status->prepared(0);
+ $fail++;
+ last RUN;
+ }
+ ### end of prereq resolving ###
+ }
+
+ # Wrap the exception that may be thrown here (should likely be
+ # done at a much higher level).
+ my $prep_output;
+
+ my $env = ENV_CPANPLUS_IS_EXECUTING;
+ local $ENV{$env} = BUILD_PL->( $dir );
+ my $run_perl = $conf->get_program('perlwrapper');
+ my $cmd = [$perl, $run_perl, BUILD_PL->($dir), @buildflags];
+
+ unless ( scalar run( command => $cmd,
+ buffer => \$prep_output,
+ verbose => $verbose )
+ ) {
+ error( loc( "Build.PL failed: %1", $prep_output ) );
+ $fail++; last RUN;
+ }
+
+ msg( $prep_output, 0 );
+
+ my $prereqs = $self->status->prereqs;
+
+ $prereqs ||= $dist->_find_prereqs( verbose => $verbose,
+ dir => $dir,
+ perl => $perl,
+ buildflags => $buildflags );
+
+ }
+
+ ### send out test report? ###
+ if( $fail and $conf->get_conf('cpantest') ) {
+ $cb->_send_report(
+ module => $self,
+ failed => $fail,
+ buffer => CPANPLUS::Error->stack_as_string,
+ verbose => $verbose,
+ force => $force,
+ ) or error(loc("Failed to send test report for '%1'",
+ $self->module ) );
+ }
+
+ unless( $cb->_chdir( dir => $orig ) ) {
+ error( loc( "Could not chdir back to start dir '%1'", $orig ) );
+ }
+
+ ### save where we wrote this stuff -- same as extract dir in normal
+ ### installer circumstances
+ $dist->status->distdir( $self->status->extract );
+
+ return $dist->status->prepared( $fail ? 0 : 1 );
+}
+
+sub _find_prereqs {
+ my $dist = shift;
+ my $self = $dist->parent;
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my ($verbose, $dir, $buildflags, $perl);
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose'), store => \$verbose },
+ dir => { default => $self->status->extract, store => \$dir },
+ perl => { default => $^X, store => \$perl },
+ buildflags => { default => $conf->get_conf('buildflags'),
+ store => \$buildflags },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ my $prereqs = {};
+
+ $prereqs = $dist->find_mymeta_requires()
+ if $dist->can('find_mymeta_requires');
+
+ if ( keys %$prereqs ) {
+ # Ugly hack
+ }
+ else {
+ my $safe_ver = version->new('0.31_03');
+ my $content;
+ PREREQS: {
+ if ( version->new( $Module::Build::VERSION ) >= $safe_ver and IPC::Cmd->can_capture_buffer ) {
+ my @buildflags = $dist->_buildflags_as_list( $buildflags );
+
+ # Use the new Build action 'prereq_data'
+ my $run_perl = $conf->get_program('perlwrapper');
+
+ unless ( scalar run( command => [$perl, $run_perl, BUILD->($dir), 'prereq_data', @buildflags],
+ buffer => \$content,
+ verbose => 0 )
+ ) {
+ error( loc( "Build 'prereq_data' failed: %1 %2", $!, $content ) );
+ #return;
+ }
+ else {
+ last PREREQS;
+ }
+
+ }
+
+ my $file = File::Spec->catfile( $dir, '_build', 'prereqs' );
+ return unless -f $file;
+
+ my $fh = FileHandle->new();
+
+ unless( $fh->open( $file ) ) {
+ error( loc( "Cannot open '%1': %2", $file, $! ) );
+ return;
+ }
+
+ $content = do { local $/; <$fh> };
+
+ }
+
+ return unless $content;
+ my $bphash = eval $content;
+ return unless $bphash and ref $bphash eq 'HASH';
+ foreach my $type ('requires', 'build_requires') {
+ next unless $bphash->{$type} and ref $bphash->{$type} eq 'HASH';
+ $prereqs->{$_} = $bphash->{$type}->{$_} for keys %{ $bphash->{$type} };
+ }
+ }
+ # Temporary fix
+ delete $prereqs->{'perl'};
+
+ ### allows for a user defined callback to filter the prerequisite
+ ### list as they see fit, to remove (or add) any prereqs they see
+ ### fit. The default installed callback will return the hashref in
+ ### an unmodified form
+ ### this callback got added after cpanplus 0.0562, so use a 'can'
+ ### to find out if it's supported. For older versions, we'll just
+ ### return the hashref as is ourselves.
+ my $href = $cb->_callbacks->can('filter_prereqs')
+ ? $cb->_callbacks->filter_prereqs->( $cb, $prereqs )
+ : $prereqs;
+
+ $self->status->prereqs( $href );
+
+ ### make sure it's not the same ref
+ return { %$href };
+}
+
+=pod
+
+=head2 $dist->create([perl => '/path/to/perl', buildflags => 'EXTRA=FLAGS', prereq_target => TARGET, force => BOOL, verbose => BOOL, skiptest => BOOL])
+
+C<create> preps a distribution for installation. This means it will
+run C<Build> and C<Build test>.
+This will also satisfy any prerequisites the module may have.
+
+If you set C<skiptest> to true, it will skip the C<Build test> stage.
+If you set C<force> to true, it will go over all the stages of the
+C<Build> process again, ignoring any previously cached results. It
+will also ignore a bad return value from C<Build test> and still allow
+the operation to return true.
+
+Returns true on success and false on failure.
+
+You may then call C<< $dist->install >> on the object to actually
+install it.
+
+=cut
+
+sub create {
+ ### just in case you already did a create call for this module object
+ ### just via a different dist object
+ my $dist = shift;
+ my $self = $dist->parent;
+
+ ### we're also the cpan_dist, since we don't need to have anything
+ ### prepared from another installer
+ $dist = $self->status->dist_cpan if $self->status->dist_cpan;
+ $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $dir;
+ unless( $dir = $self->status->extract ) {
+ error( loc( "No dir found to operate on!" ) );
+ return;
+ }
+
+ my $args;
+ my( $force, $verbose, $buildflags, $skiptest, $prereq_target,
+ $perl, $prereq_format, $prereq_build);
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+ my $tmpl = {
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ perl => { default => $^X, store => \$perl },
+ buildflags => { default => $conf->get_conf('buildflags'),
+ store => \$buildflags },
+ skiptest => { default => $conf->get_conf('skiptest'),
+ store => \$skiptest },
+ prereq_target => { default => '', store => \$prereq_target },
+ ### don't set the default format to 'build' -- that is wrong!
+ prereq_format => { #default => $self->status->installer_type,
+ default => '',
+ store => \$prereq_format },
+ prereq_build => { default => 0, store => \$prereq_build },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ # restore the state as we have created this already.
+ if ( $dist->status->created && !$force ) {
+ ### add this directory to your lib ###
+ $self->add_to_includepath();
+ return 1;
+ }
+
+ $dist->status->_create_args( $args );
+
+ ### is this dist prepared?
+ unless( $dist->status->prepared ) {
+ error( loc( "You have not successfully prepared a '%2' distribution ".
+ "yet -- cannot create yet", __PACKAGE__ ) );
+ return;
+ }
+
+ ### chdir to work directory ###
+ my $orig = cwd();
+ unless( $cb->_chdir( dir => $dir ) ) {
+ error( loc( "Could not chdir to build directory '%1'", $dir ) );
+ return;
+ }
+
+ ### by now we've loaded module::build, and we're using the API, so
+ ### it's safe to remove CPANPLUS::inc from our inc path, especially
+ ### because it can trip up tests run under taint (just like EU::MM).
+ ### turn off our PERL5OPT so no modules from CPANPLUS::inc get
+ ### included in make test -- it should build without.
+ ### also, modules that run in taint mode break if we leave
+ ### our code ref in perl5opt
+ ### XXX we've removed the ENV settings from cp::inc, so only need
+ ### to reset the @INC
+ #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt;
+ #local $ENV{PERL5LIB} = CPANPLUS::inc->original_perl5lib;
+ #local @INC = CPANPLUS::inc->original_inc;
+
+ ### but do it *before* the new_from_context, as M::B seems
+ ### to be actually running the file...
+ ### an unshift in the block seems to be ignored.. somehow...
+ #{ my $lib = $self->best_path_to_module_build;
+ # unshift @INC, $lib if $lib;
+ #}
+ unshift @INC, $self->best_path_to_module_build
+ if $self->best_path_to_module_build;
+
+ ### this will generate warnings under anything lower than M::B 0.2606
+ my @buildflags = $dist->_buildflags_as_list( $buildflags );
+ $dist->status->_buildflags( $buildflags );
+
+ my $fail; my $prereq_fail; my $test_fail;
+ RUN: {
+
+ my $run_perl = $conf->get_program('perlwrapper');
+
+ ### this will set the directory back to the start
+ ### dir, so we must chdir /again/
+ my $ok = $dist->_resolve_prereqs(
+ force => $force,
+ format => $prereq_format,
+ verbose => $verbose,
+ prereqs => $self->status->prereqs,
+ target => $prereq_target,
+ prereq_build => $prereq_build,
+ );
+
+ unless( $cb->_chdir( dir => $dir ) ) {
+ error( loc( "Could not chdir to build directory '%1'", $dir ) );
+ return;
+ }
+
+ unless( $ok ) {
+ #### use $dist->flush to reset the cache ###
+ error( loc( "Unable to satisfy prerequisites for '%1' " .
+ "-- aborting install", $self->module ) );
+ $dist->status->build(0);
+ $fail++; $prereq_fail++;
+ last RUN;
+ }
+
+ my ($captured, $cmd);
+ if ( ON_VMS ) {
+ $cmd = [$perl, BUILD->($dir), @buildflags];
+ }
+ else {
+ $cmd = [$perl, $run_perl, BUILD->($dir), @buildflags];
+ }
+
+ unless ( scalar run( command => $cmd,
+ buffer => \$captured,
+ verbose => $verbose )
+ ) {
+ error( loc( "MAKE failed:\n%1", $captured ) );
+ $dist->status->build(0);
+ $fail++; last RUN;
+ }
+
+ msg( $captured, 0 );
+
+ $dist->status->build(1);
+
+ ### add this directory to your lib ###
+ $self->add_to_includepath();
+
+ ### this buffer will not include what tests failed due to a
+ ### M::B/Test::Harness bug. Reported as #9793 with patch
+ ### against 0.2607 on 26/1/2005
+ unless( $skiptest ) {
+ my $test_output;
+ if ( ON_VMS ) {
+ $cmd = [$perl, BUILD->($dir), "test", @buildflags];
+ }
+ else {
+ $cmd = [$perl, $run_perl, BUILD->($dir), "test", @buildflags];
+ }
+ unless ( scalar run( command => $cmd,
+ buffer => \$test_output,
+ verbose => $verbose )
+ ) {
+ error( loc( "MAKE TEST failed:\n%1 ", $test_output ) );
+
+ ### mark specifically *test* failure.. so we dont
+ ### send success on force...
+ $test_fail++;
+
+ if( !$force and !$cb->_callbacks->proceed_on_test_failure->(
+ $self, $@ )
+ ) {
+ $dist->status->test(0);
+ $fail++; last RUN;
+ }
+
+ }
+ else {
+ msg( loc( "MAKE TEST passed:\n%1", $test_output ), 0 );
+ #msg( $test_output, 0 );
+ $dist->status->test(1);
+ }
+ }
+ else {
+ msg(loc("Tests skipped"), $verbose);
+ }
+ }
+
+ unless( $cb->_chdir( dir => $orig ) ) {
+ error( loc( "Could not chdir back to start dir '%1'", $orig ) );
+ }
+
+ ### send out test report? ###
+ if( $conf->get_conf('cpantest') and not $prereq_fail ) {
+ $cb->_send_report(
+ module => $self,
+ failed => $test_fail || $fail,
+ buffer => CPANPLUS::Error->stack_as_string,
+ verbose => $verbose,
+ force => $force,
+ tests_skipped => $skiptest,
+ ) or error(loc("Failed to send test report for '%1'",
+ $self->module ) );
+ }
+
+ return $dist->status->created( $fail ? 0 : 1 );
+}
+
+=head2 $dist->install([verbose => BOOL, perl => /path/to/perl])
+
+Actually installs the created dist.
+
+Returns true on success and false on failure.
+
+=cut
+
+sub install {
+ ### just in case you already did a create call for this module object
+ ### just via a different dist object
+ my $dist = shift;
+ my $self = $dist->parent;
+
+ ### we're also the cpan_dist, since we don't need to have anything
+ ### prepared from another installer
+ $dist = $self->status->dist_cpan if $self->status->dist_cpan;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+
+ my $verbose; my $perl; my $force; my $buildflags;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ buildflags => { default => $conf->get_conf('buildflags'),
+ store => \$buildflags },
+ perl => { default => $^X, store => \$perl },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+ $dist->status->_install_args( $args );
+ }
+
+ my $dir;
+ unless( $dir = $self->status->extract ) {
+ error( loc( "No dir found to operate on!" ) );
+ return;
+ }
+
+ my $orig = cwd();
+
+ unless( $cb->_chdir( dir => $dir ) ) {
+ error( loc( "Could not chdir to build directory '%1'", $dir ) );
+ return;
+ }
+
+ ### value set and false -- means failure ###
+ if( defined $self->status->installed &&
+ !$self->status->installed && !$force
+ ) {
+ error( loc( "Module '%1' has failed to install before this session " .
+ "-- aborting install", $self->module ) );
+ return;
+ }
+
+ my $fail;
+ my @buildflags = $dist->_buildflags_as_list( $buildflags );
+ my $run_perl = $conf->get_program('perlwrapper');
+
+ ### hmm, how is this going to deal with sudo?
+ ### for now, check effective uid, if it's not root,
+ ### shell out, otherwise use the method
+ if( $> ) {
+
+ ### don't worry about loading the right version of M::B anymore
+ ### the 'new_from_context' already added the 'right' path to
+ ### M::B at the top of the build.pl
+ my $cmd;
+ if ( ON_VMS ) {
+ $cmd = [$perl, BUILD->($dir), "install", @buildflags];
+ }
+ else {
+ $cmd = [$perl, $run_perl, BUILD->($dir), "install", @buildflags];
+ }
+ my $sudo = $conf->get_program('sudo');
+ unshift @$cmd, $sudo if $sudo;
+
+
+ my $buffer;
+ unless( scalar run( command => $cmd,
+ buffer => \$buffer,
+ verbose => $verbose )
+ ) {
+ error(loc("Could not run '%1': %2", 'Build install', $buffer));
+ $fail++;
+ }
+ } else {
+ my ($install_output, $cmd);
+ if ( ON_VMS ) {
+ $cmd = [$perl, BUILD->($dir), "install", @buildflags];
+ }
+ else {
+ $cmd = [$perl, $run_perl, BUILD->($dir), "install", @buildflags];
+ }
+ unless( scalar run( command => $cmd,
+ buffer => \$install_output,
+ verbose => $verbose )
+ ) {
+ error(loc("Could not run '%1': %2", 'Build install', $install_output));
+ $fail++;
+ }
+ else {
+ msg( $install_output, 0 );
+ }
+ }
+
+
+ unless( $cb->_chdir( dir => $orig ) ) {
+ error( loc( "Could not chdir back to start dir '%1'", $orig ) );
+ }
+
+ return $dist->status->installed( $fail ? 0 : 1 );
+}
+
+### returns the string 'foo=bar --zot quux'
+### as the list 'foo=bar', '--zot', 'qux'
+sub _buildflags_as_list {
+ my $self = shift;
+ my $flags = shift or return;
+
+ return Module::Build->split_like_shell($flags);
+}
+
+=head1 AUTHOR
+
+Originally by Jos Boumans E<lt>kane@cpan.orgE<gt>. Brought to working
+condition by Ken Williams E<lt>kwilliams@cpan.orgE<gt>.
+
+Other hackery and currently maintained by Chris C<BinGOs> Williams ( no relation ). E<lt>bingos@cpan.orgE<gt>.
+
+=head1 LICENSE
+
+The CPAN++ interface (of which this module is a part of) is
+copyright (c) 2001, 2002, 2003, 2004, 2005 Jos Boumans E<lt>kane@cpan.orgE<gt>.
+All rights reserved.
+
+This library is free software;
+you may redistribute and/or modify it under the same
+terms as Perl itself.
+
+=cut
+
+qq[Putting the Module::Build into CPANPLUS];
+
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Build/Constants.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Build/Constants.pm
new file mode 100755
index 00000000000..1ac02108e44
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Build/Constants.pm
@@ -0,0 +1,69 @@
+package CPANPLUS::Dist::Build::Constants;
+
+use strict;
+use warnings;
+use File::Spec;
+
+BEGIN {
+
+ require Exporter;
+ use vars qw[$VERSION @ISA @EXPORT];
+
+ $VERSION = '0.46';
+ @ISA = qw[Exporter];
+ @EXPORT = qw[ BUILD_DIR BUILD ];
+}
+
+
+use constant BUILD_DIR => sub { return @_
+ ? File::Spec->catdir($_[0], '_build')
+ : '_build';
+ };
+use constant BUILD => sub { my $file = @_
+ ? File::Spec->catfile($_[0], 'Build')
+ : 'Build';
+
+ ### on VMS, '.com' is appended when
+ ### creating the Build file
+ $file .= '.com' if $^O eq 'VMS';
+
+ return $file;
+ };
+
+1;
+
+=head1 NAME
+
+CPANPLUS::Dist::Build::Constants - Constants for CPANPLUS::Dist::Build
+
+=head1 SYNOPSIS
+
+ use CPANPLUS::Dist::Build::Constants;
+
+=head1 DESCRIPTION
+
+CPANPLUS::Dist::Build::Constants provides some constants required by L<CPANPLUS::Dist::Build>.
+
+=head1 AUTHOR
+
+Originally by Jos Boumans E<lt>kane@cpan.orgE<gt>. Brought to working
+condition and currently maintained by Ken Williams E<lt>kwilliams@cpan.orgE<gt>.
+
+=head1 LICENSE
+
+The CPAN++ interface (of which this module is a part of) is
+copyright (c) 2001, 2002, 2003, 2004, 2005 Jos Boumans E<lt>kane@cpan.orgE<gt>.
+All rights reserved.
+
+This library is free software;
+you may redistribute and/or modify it under the same
+terms as Perl itself.
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/MM.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/MM.pm
new file mode 100755
index 00000000000..be65cd43cc8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/MM.pm
@@ -0,0 +1,1007 @@
+package CPANPLUS::Dist::MM;
+
+use warnings;
+use strict;
+use vars qw[@ISA $STATUS];
+use base 'CPANPLUS::Dist::Base';
+
+use CPANPLUS::Internals::Constants;
+use CPANPLUS::Internals::Constants::Report;
+use CPANPLUS::Error;
+use FileHandle;
+use Cwd;
+
+use IPC::Cmd qw[run];
+use Params::Check qw[check];
+use File::Basename qw[dirname];
+use Module::Load::Conditional qw[can_load check_install];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+local $Params::Check::VERBOSE = 1;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Dist::MM
+
+=head1 SYNOPSIS
+
+ $mm = CPANPLUS::Dist::MM->new( module => $modobj );
+
+ $mm->create; # runs make && make test
+ $mm->install; # runs make install
+
+
+=head1 DESCRIPTION
+
+C<CPANPLUS::Dist::MM> is a distribution class for MakeMaker related
+modules.
+Using this package, you can create, install and uninstall perl
+modules. It inherits from C<CPANPLUS::Dist>.
+
+=head1 ACCESSORS
+
+=over 4
+
+=item parent()
+
+Returns the C<CPANPLUS::Module> object that parented this object.
+
+=item status()
+
+Returns the C<Object::Accessor> object that keeps the status for
+this module.
+
+=back
+
+=head1 STATUS ACCESSORS
+
+All accessors can be accessed as follows:
+ $mm->status->ACCESSOR
+
+=over 4
+
+=item makefile ()
+
+Location of the Makefile (or Build file).
+Set to 0 explicitly if something went wrong.
+
+=item make ()
+
+BOOL indicating if the C<make> (or C<Build>) command was successful.
+
+=item test ()
+
+BOOL indicating if the C<make test> (or C<Build test>) command was
+successful.
+
+=item prepared ()
+
+BOOL indicating if the C<prepare> call exited succesfully
+This gets set after C<perl Makefile.PL>
+
+=item distdir ()
+
+Full path to the directory in which the C<prepare> call took place,
+set after a call to C<prepare>.
+
+=item created ()
+
+BOOL indicating if the C<create> call exited succesfully. This gets
+set after C<make> and C<make test>.
+
+=item installed ()
+
+BOOL indicating if the module was installed. This gets set after
+C<make install> (or C<Build install>) exits successfully.
+
+=item uninstalled ()
+
+BOOL indicating if the module was uninstalled properly.
+
+=item _create_args ()
+
+Storage of the arguments passed to C<create> for this object. Used
+for recursive calls when satisfying prerequisites.
+
+=item _install_args ()
+
+Storage of the arguments passed to C<install> for this object. Used
+for recursive calls when satisfying prerequisites.
+
+=back
+
+=cut
+
+=head1 METHODS
+
+=head2 $bool = $dist->format_available();
+
+Returns a boolean indicating whether or not you can use this package
+to create and install modules in your environment.
+
+=cut
+
+### check if the format is available ###
+sub format_available {
+ my $dist = shift;
+
+ ### we might be called as $class->format_available =/
+ require CPANPLUS::Internals;
+ my $cb = CPANPLUS::Internals->_retrieve_id(
+ CPANPLUS::Internals->_last_id );
+ my $conf = $cb->configure_object;
+
+ my $mod = "ExtUtils::MakeMaker";
+ unless( can_load( modules => { $mod => 0.0 } ) ) {
+ error( loc( "You do not have '%1' -- '%2' not available",
+ $mod, __PACKAGE__ ) );
+ return;
+ }
+
+ for my $pgm ( qw[make] ) {
+ unless( $conf->get_program( $pgm ) ) {
+ error(loc(
+ "You do not have '%1' in your path -- '%2' not available\n" .
+ "Please check your config entry for '%1'",
+ $pgm, __PACKAGE__ , $pgm
+ ));
+ return;
+ }
+ }
+
+ return 1;
+}
+
+=pod $bool = $dist->init();
+
+Sets up the C<CPANPLUS::Dist::MM> object for use.
+Effectively creates all the needed status accessors.
+
+Called automatically whenever you create a new C<CPANPLUS::Dist> object.
+
+=cut
+
+sub init {
+ my $dist = shift;
+ my $status = $dist->status;
+
+ $status->mk_accessors(qw[makefile make test created installed uninstalled
+ bin_make _prepare_args _create_args _install_args]
+ );
+
+ return 1;
+}
+
+=pod $bool = $dist->prepare([perl => '/path/to/perl', makemakerflags => 'EXTRA=FLAGS', force => BOOL, verbose => BOOL])
+
+C<prepare> preps a distribution for installation. This means it will
+run C<perl Makefile.PL> and determine what prerequisites this distribution
+declared.
+
+If you set C<force> to true, it will go over all the stages of the
+C<prepare> process again, ignoring any previously cached results.
+
+When running C<perl Makefile.PL>, the environment variable
+C<PERL5_CPANPLUS_IS_EXECUTING> will be set to the full path of the
+C<Makefile.PL> that is being executed. This enables any code inside
+the C<Makefile.PL> to know that it is being installed via CPANPLUS.
+
+Returns true on success and false on failure.
+
+You may then call C<< $dist->create >> on the object to create the
+installable files.
+
+=cut
+
+sub prepare {
+ ### just in case you already did a create call for this module object
+ ### just via a different dist object
+ my $dist = shift;
+ my $self = $dist->parent;
+
+ ### we're also the cpan_dist, since we don't need to have anything
+ ### prepared
+ $dist = $self->status->dist_cpan if $self->status->dist_cpan;
+ $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $dir;
+ unless( $dir = $self->status->extract ) {
+ error( loc( "No dir found to operate on!" ) );
+ return;
+ }
+
+ my $args;
+ my( $force, $verbose, $perl, @mmflags, $prereq_target, $prereq_format,
+ $prereq_build );
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+ my $tmpl = {
+ perl => { default => $^X, store => \$perl },
+ makemakerflags => { default =>
+ $conf->get_conf('makemakerflags') || '',
+ store => \$mmflags[0] },
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ prereq_target => { default => '', store => \$prereq_target },
+ prereq_format => { default => '',
+ store => \$prereq_format },
+ prereq_build => { default => 0, store => \$prereq_build },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+
+ ### maybe we already ran a create on this object? ###
+ return 1 if $dist->status->prepared && !$force;
+
+ ### store the arguments, so ->install can use them in recursive loops ###
+ $dist->status->_prepare_args( $args );
+
+ ### chdir to work directory ###
+ my $orig = cwd();
+ unless( $cb->_chdir( dir => $dir ) ) {
+ error( loc( "Could not chdir to build directory '%1'", $dir ) );
+ return;
+ }
+
+ my $fail;
+ RUN: {
+
+ ### we resolve 'configure requires' here, so we can run the 'perl
+ ### Makefile.PL' command
+ ### XXX for tests: mock f_c_r to something that *can* resolve and
+ ### something that *doesnt* resolve. Check the error log for ok
+ ### on this step or failure
+ ### XXX make a seperate tarball to test for this scenario: simply
+ ### containing a makefile.pl/build.pl for test purposes?
+ { my $configure_requires = $dist->find_configure_requires;
+ my $ok = $dist->_resolve_prereqs(
+ format => $prereq_format,
+ verbose => $verbose,
+ prereqs => $configure_requires,
+ target => $prereq_target,
+ force => $force,
+ prereq_build => $prereq_build,
+ );
+
+ unless( $ok ) {
+
+ #### use $dist->flush to reset the cache ###
+ error( loc( "Unable to satisfy '%1' for '%2' " .
+ "-- aborting install",
+ 'configure_requires', $self->module ) );
+ $dist->status->prepared(0);
+ $fail++;
+ last RUN;
+ }
+ ### end of prereq resolving ###
+ }
+
+
+
+ ### don't run 'perl makefile.pl' again if there's a makefile already
+ if( -e MAKEFILE->() && (-M MAKEFILE->() < -M $dir) && !$force ) {
+ msg(loc("'%1' already exists, not running '%2 %3' again ".
+ " unless you force",
+ MAKEFILE->(), $perl, MAKEFILE_PL->() ), $verbose );
+
+ } else {
+ unless( -e MAKEFILE_PL->() ) {
+ msg(loc("No '%1' found - attempting to generate one",
+ MAKEFILE_PL->() ), $verbose );
+
+ $dist->write_makefile_pl(
+ verbose => $verbose,
+ force => $force
+ );
+
+ ### bail out if there's no makefile.pl ###
+ unless( -e MAKEFILE_PL->() ) {
+ error( loc( "Could not find '%1' - cannot continue",
+ MAKEFILE_PL->() ) );
+
+ ### mark that we screwed up ###
+ $dist->status->makefile(0);
+ $fail++; last RUN;
+ }
+ }
+
+ ### you can turn off running this verbose by changing
+ ### the config setting below, although it is really not
+ ### recommended
+ my $run_verbose = $verbose ||
+ $conf->get_conf('allow_build_interactivity') ||
+ 0;
+
+ ### this makes MakeMaker use defaults if possible, according
+ ### to schwern. See ticket 8047 for details.
+ local $ENV{PERL_MM_USE_DEFAULT} = 1 unless $run_verbose;
+
+ ### turn off our PERL5OPT so no modules from CPANPLUS::inc get
+ ### included in the makefile.pl -- it should build without
+ ### also, modules that run in taint mode break if we leave
+ ### our code ref in perl5opt
+ ### XXX we've removed the ENV settings from cp::inc, so only need
+ ### to reset the @INC
+ #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt || '';
+
+ ### make sure it's a string, so that mmflags that have more than
+ ### one key value pair are passed as is, rather than as:
+ ### perl Makefile.PL "key=val key=>val"
+
+
+ #### XXX this needs to be the absolute path to the Makefile.PL
+ ### since cpanp-run-perl uses 'do' to execute the file, and do()
+ ### checks your @INC.. so, if there's _another_ makefile.pl in
+ ### your @INC, it will execute that one...
+ my $makefile_pl = MAKEFILE_PL->( $cb->_safe_path( path => $dir ) );
+
+ ### setting autoflush to true fixes issue from rt #8047
+ ### XXX this means that we need to keep the path to CPANPLUS
+ ### in @INC, stopping us from resolving dependencies on CPANPLUS
+ ### at bootstrap time properly.
+
+ ### XXX this fails under ipc::run due to the extra quotes,
+ ### but it works in ipc::open3. however, ipc::open3 doesn't work
+ ### on win32/cygwin. XXX TODO get a windows box and sort this out
+ # my $cmd = qq[$perl -MEnglish -le ] .
+ # QUOTE_PERL_ONE_LINER->(
+ # qq[\$OUTPUT_AUTOFLUSH++,do(q($makefile_pl))]
+ # )
+ # . $mmflags;
+
+ # my $flush = OPT_AUTOFLUSH;
+ # my $cmd = "$perl $flush $makefile_pl $mmflags";
+
+ my $run_perl = $conf->get_program('perlwrapper');
+ my $cmd = [$perl, $run_perl, $makefile_pl, @mmflags];
+
+ ### set ENV var to tell underlying code this is what we're
+ ### executing.
+ my $captured;
+ my $rv = do {
+ my $env = ENV_CPANPLUS_IS_EXECUTING;
+ local $ENV{$env} = $makefile_pl;
+ scalar run( command => $cmd,
+ buffer => \$captured,
+ verbose => $run_verbose, # may be interactive
+ );
+ };
+
+ unless( $rv ) {
+ error( loc( "Could not run '%1 %2': %3 -- cannot continue",
+ $perl, MAKEFILE_PL->(), $captured ) );
+
+ $dist->status->makefile(0);
+ $fail++; last RUN;
+ }
+
+ ### put the output on the stack, don't print it
+ msg( $captured, 0 );
+ }
+
+ ### so, nasty feature in Module::Build, that when a Makefile.PL
+ ### is a disguised Build.PL, it generates a Build file, not a
+ ### Makefile. this breaks everything :( see rt bug #19741
+ if( not -e MAKEFILE->( $dir ) and -e BUILD_PL->( $dir ) ) {
+ error(loc(
+ "We just ran '%1' without errors, but no '%2' is ".
+ "present. However, there is a '%3' file, so this may ".
+ "be related to bug #19741 in %4, which describes a ".
+ "fake '%5' which generates a '%6' file instead of a '%7'. ".
+ "You could try to work around this issue by setting '%8' ".
+ "to false and trying again. This will attempt to use the ".
+ "'%9' instead.",
+ "$^X ".MAKEFILE_PL->(), MAKEFILE->(), BUILD_PL->(),
+ 'Module::Build', MAKEFILE_PL->(), 'Build', MAKEFILE->(),
+ 'prefer_makefile', BUILD_PL->()
+ ));
+
+ $fail++, last RUN;
+ }
+
+ ### if we got here, we managed to make a 'makefile' ###
+ $dist->status->makefile( MAKEFILE->($dir) );
+
+ ### start resolving prereqs ###
+ my $prereqs = $self->status->prereqs;
+
+ ### a hashref of prereqs on success, undef on failure ###
+ $prereqs ||= $dist->_find_prereqs(
+ verbose => $verbose,
+ file => $dist->status->makefile
+ );
+
+ unless( $prereqs ) {
+ error( loc( "Unable to scan '%1' for prereqs",
+ $dist->status->makefile ) );
+
+ $fail++; last RUN;
+ }
+ }
+
+ unless( $cb->_chdir( dir => $orig ) ) {
+ error( loc( "Could not chdir back to start dir '%1'", $orig ) );
+ }
+
+ ### save where we wrote this stuff -- same as extract dir in normal
+ ### installer circumstances
+ $dist->status->distdir( $self->status->extract );
+
+ return $dist->status->prepared( $fail ? 0 : 1);
+}
+
+=pod
+
+=head2 $href = $dist->_find_prereqs( file => '/path/to/Makefile', [verbose => BOOL])
+
+Parses a C<Makefile> for C<PREREQ_PM> entries and distills from that
+any prerequisites mentioned in the C<Makefile>
+
+Returns a hash with module-version pairs on success and false on
+failure.
+
+=cut
+
+sub _find_prereqs {
+ my $dist = shift;
+ my $self = $dist->parent;
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my ($verbose, $file);
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose'), store => \$verbose },
+ file => { required => 1, allow => FILE_READABLE, store => \$file },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ ### see if we got prereqs from MYMETA
+ my $prereqs = $dist->find_mymeta_requires();
+
+ ### we found some prereqs, we'll trust MYMETA
+ ### but we do need to run it through the callback
+ return $cb->_callbacks->filter_prereqs->( $cb, $prereqs ) if keys %$prereqs;
+
+ my $fh = FileHandle->new();
+ unless( $fh->open( $file ) ) {
+ error( loc( "Cannot open '%1': %2", $file, $! ) );
+ return;
+ }
+
+ my %p;
+ while( local $_ = <$fh> ) {
+ my ($found) = m|^[\#]\s+PREREQ_PM\s+=>\s+(.+)|;
+
+ next unless $found;
+
+ while( $found =~ m/(?:\s)([\w\:]+)=>(?:q\[(.*?)\],?|undef)/g ) {
+ if( defined $p{$1} ) {
+ my $ver = $cb->_version_to_number(version => $2);
+ $p{$1} = $ver
+ if $cb->_vcmp( $ver, $p{$1} ) > 0;
+ }
+ else {
+ $p{$1} = $cb->_version_to_number(version => $2);
+ }
+ }
+ last;
+ }
+
+ my $href = $cb->_callbacks->filter_prereqs->( $cb, \%p );
+
+ $self->status->prereqs( $href );
+
+ ### just to make sure it's not the same reference ###
+ return { %$href };
+}
+
+=pod
+
+=head2 $bool = $dist->create([perl => '/path/to/perl', make => '/path/to/make', makeflags => 'EXTRA=FLAGS', prereq_target => TARGET, skiptest => BOOL, force => BOOL, verbose => BOOL])
+
+C<create> creates the files necessary for installation. This means
+it will run C<make> and C<make test>. This will also scan for and
+attempt to satisfy any prerequisites the module may have.
+
+If you set C<skiptest> to true, it will skip the C<make test> stage.
+If you set C<force> to true, it will go over all the stages of the
+C<make> process again, ignoring any previously cached results. It
+will also ignore a bad return value from C<make test> and still allow
+the operation to return true.
+
+Returns true on success and false on failure.
+
+You may then call C<< $dist->install >> on the object to actually
+install it.
+
+=cut
+
+sub create {
+ ### just in case you already did a create call for this module object
+ ### just via a different dist object
+ my $dist = shift;
+ my $self = $dist->parent;
+
+ ### we're also the cpan_dist, since we don't need to have anything
+ ### prepared
+ $dist = $self->status->dist_cpan if $self->status->dist_cpan;
+ $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $dir;
+ unless( $dir = $self->status->extract ) {
+ error( loc( "No dir found to operate on!" ) );
+ return;
+ }
+
+ my $args;
+ my( $force, $verbose, $make, $makeflags, $skiptest, $prereq_target, $perl,
+ @mmflags, $prereq_format, $prereq_build);
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+ my $tmpl = {
+ perl => { default => $^X, store => \$perl },
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ make => { default => $conf->get_program('make'),
+ store => \$make },
+ makeflags => { default => $conf->get_conf('makeflags'),
+ store => \$makeflags },
+ skiptest => { default => $conf->get_conf('skiptest'),
+ store => \$skiptest },
+ prereq_target => { default => '', store => \$prereq_target },
+ ### don't set the default prereq format to 'makemaker' -- wrong!
+ prereq_format => { #default => $self->status->installer_type,
+ default => '',
+ store => \$prereq_format },
+ prereq_build => { default => 0, store => \$prereq_build },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ ### maybe we already ran a create on this object?
+ ### make sure we add to include path again, just in case we came from
+ ### ->save_state, at which point we need to restore @INC/$PERL5LIB
+ if( $dist->status->created && !$force ) {
+ $self->add_to_includepath;
+ return 1;
+ }
+
+ ### store the arguments, so ->install can use them in recursive loops ###
+ $dist->status->_create_args( $args );
+
+ unless( $dist->status->prepared ) {
+ error( loc( "You have not successfully prepared a '%2' distribution ".
+ "yet -- cannot create yet", __PACKAGE__ ) );
+ return;
+ }
+
+
+ ### chdir to work directory ###
+ my $orig = cwd();
+ unless( $cb->_chdir( dir => $dir ) ) {
+ error( loc( "Could not chdir to build directory '%1'", $dir ) );
+ return;
+ }
+
+ my $fail; my $prereq_fail; my $test_fail;
+ RUN: {
+ ### this will set the directory back to the start
+ ### dir, so we must chdir /again/
+ my $ok = $dist->_resolve_prereqs(
+ format => $prereq_format,
+ verbose => $verbose,
+ prereqs => $self->status->prereqs,
+ target => $prereq_target,
+ force => $force,
+ prereq_build => $prereq_build,
+ );
+
+ unless( $cb->_chdir( dir => $dir ) ) {
+ error( loc( "Could not chdir to build directory '%1'", $dir ) );
+ return;
+ }
+
+ unless( $ok ) {
+
+ #### use $dist->flush to reset the cache ###
+ error( loc( "Unable to satisfy prerequisites for '%1' " .
+ "-- aborting install", $self->module ) );
+ $dist->status->make(0);
+ $fail++; $prereq_fail++;
+ last RUN;
+ }
+ ### end of prereq resolving ###
+
+ my $captured;
+
+ ### 'make' section ###
+ if( -d BLIB->($dir) && (-M BLIB->($dir) < -M $dir) && !$force ) {
+ msg(loc("Already ran '%1' for this module [%2] -- " .
+ "not running again unless you force",
+ $make, $self->module ), $verbose );
+ } else {
+ unless(scalar run( command => [$make, $makeflags],
+ buffer => \$captured,
+ verbose => $verbose )
+ ) {
+ error( loc( "MAKE failed: %1 %2", $!, $captured ) );
+ $dist->status->make(0);
+ $fail++; last RUN;
+ }
+
+ ### put the output on the stack, don't print it
+ msg( $captured, 0 );
+
+ $dist->status->make(1);
+
+ ### add this directory to your lib ###
+ $self->add_to_includepath();
+
+ ### dont bail out here, there's a conditional later on
+ #last RUN if $skiptest;
+ }
+
+ ### 'make test' section ###
+ unless( $skiptest ) {
+
+ ### turn off our PERL5OPT so no modules from CPANPLUS::inc get
+ ### included in make test -- it should build without
+ ### also, modules that run in taint mode break if we leave
+ ### our code ref in perl5opt
+ ### XXX CPANPLUS::inc functionality is now obsolete.
+ #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt || '';
+
+ ### you can turn off running this verbose by changing
+ ### the config setting below, although it is really not
+ ### recommended
+ my $run_verbose =
+ $verbose ||
+ $conf->get_conf('allow_build_interactivity') ||
+ 0;
+
+ ### XXX need to add makeflags here too?
+ ### yes, but they should really be split out -- see bug #4143
+ if( scalar run(
+ command => [$make, 'test', $makeflags],
+ buffer => \$captured,
+ verbose => $run_verbose,
+ ) ) {
+ ### tests might pass because it doesn't have any tests defined
+ ### log this occasion non-verbosely, so our test reporter can
+ ### pick up on this
+ if ( NO_TESTS_DEFINED->( $captured ) ) {
+ msg( NO_TESTS_DEFINED->( $captured ), 0 )
+ } else {
+ msg( loc( "MAKE TEST passed: %1", $captured ), 0 );
+ }
+
+ $dist->status->test(1);
+ } else {
+ error( loc( "MAKE TEST failed: %1 %2", $!, $captured ) );
+
+ ### send out error report here? or do so at a higher level?
+ ### --higher level --kane.
+ $dist->status->test(0);
+
+ ### mark specifically *test* failure.. so we dont
+ ### send success on force...
+ $test_fail++;
+
+ if( !$force and !$cb->_callbacks->proceed_on_test_failure->(
+ $self, $captured )
+ ) {
+ $fail++; last RUN;
+ }
+ }
+ }
+ } #</RUN>
+
+ unless( $cb->_chdir( dir => $orig ) ) {
+ error( loc( "Could not chdir back to start dir '%1'", $orig ) );
+ }
+
+ ### send out test report?
+ ### only do so if the failure is this module, not its prereq
+ if( $conf->get_conf('cpantest') and not $prereq_fail) {
+ $cb->_send_report(
+ module => $self,
+ failed => $test_fail || $fail,
+ buffer => CPANPLUS::Error->stack_as_string,
+ verbose => $verbose,
+ force => $force,
+ ) or error(loc("Failed to send test report for '%1'",
+ $self->module ) );
+ }
+
+ return $dist->status->created( $fail ? 0 : 1);
+}
+
+=pod
+
+=head2 $bool = $dist->install([make => '/path/to/make', makemakerflags => 'EXTRA=FLAGS', force => BOOL, verbose => BOOL])
+
+C<install> runs the following command:
+ make install
+
+Returns true on success, false on failure.
+
+=cut
+
+sub install {
+
+ ### just in case you did the create with ANOTHER dist object linked
+ ### to the same module object
+ my $dist = shift();
+ my $self = $dist->parent;
+ $dist = $self->status->dist_cpan if $self->status->dist_cpan;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+
+ unless( $dist->status->created ) {
+ error(loc("You have not successfully created a '%2' distribution yet " .
+ "-- cannot install yet", __PACKAGE__ ));
+ return;
+ }
+
+ my $dir;
+ unless( $dir = $self->status->extract ) {
+ error( loc( "No dir found to operate on!" ) );
+ return;
+ }
+
+ my $args;
+ my($force,$verbose,$make,$makeflags);
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+ my $tmpl = {
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ make => { default => $conf->get_program('make'),
+ store => \$make },
+ makeflags => { default => $conf->get_conf('makeflags'),
+ store => \$makeflags },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ ### value set and false -- means failure ###
+ if( defined $self->status->installed &&
+ !$self->status->installed && !$force
+ ) {
+ error( loc( "Module '%1' has failed to install before this session " .
+ "-- aborting install", $self->module ) );
+ return;
+ }
+
+
+ $dist->status->_install_args( $args );
+
+ my $orig = cwd();
+ unless( $cb->_chdir( dir => $dir ) ) {
+ error( loc( "Could not chdir to build directory '%1'", $dir ) );
+ return;
+ }
+
+ my $fail; my $captured;
+
+ ### 'make install' section ###
+ ### XXX need makeflags here too?
+ ### yes, but they should really be split out.. see bug #4143
+ my $cmd = [$make, 'install', $makeflags];
+ my $sudo = $conf->get_program('sudo');
+ unshift @$cmd, $sudo if $sudo and $>;
+
+ $cb->flush('lib');
+ unless(scalar run( command => $cmd,
+ verbose => $verbose,
+ buffer => \$captured,
+ ) ) {
+ error( loc( "MAKE INSTALL failed: %1 %2", $!, $captured ) );
+ $fail++;
+ }
+
+ ### put the output on the stack, don't print it
+ msg( $captured, 0 );
+
+ unless( $cb->_chdir( dir => $orig ) ) {
+ error( loc( "Could not chdir back to start dir '%1'", $orig ) );
+ }
+
+ return $dist->status->installed( $fail ? 0 : 1 );
+
+}
+
+=pod
+
+=head2 $bool = $dist->write_makefile_pl([force => BOOL, verbose => BOOL])
+
+This routine can write a C<Makefile.PL> from the information in a
+module object. It is used to write a C<Makefile.PL> when the original
+author forgot it (!!).
+
+Returns 1 on success and false on failure.
+
+The file gets written to the directory the module's been extracted
+to.
+
+=cut
+
+sub write_makefile_pl {
+ ### just in case you already did a call for this module object
+ ### just via a different dist object
+ my $dist = shift;
+ my $self = $dist->parent;
+ $dist = $self->status->dist_cpan if $self->status->dist_cpan;
+ $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $dir;
+ unless( $dir = $self->status->extract ) {
+ error( loc( "No dir found to operate on!" ) );
+ return;
+ }
+
+ my ($force, $verbose);
+ my $tmpl = {
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ my $file = MAKEFILE_PL->($dir);
+ if( -s $file && !$force ) {
+ msg(loc("Already created '%1' - not doing so again without force",
+ $file ), $verbose );
+ return 1;
+ }
+
+ ### due to a bug with AS perl 5.8.4 built 810 (and maybe others)
+ ### opening files with content in them already does nasty things;
+ ### seek to pos 0 and then print, but not truncating the file
+ ### bug reported to activestate on 19 sep 2004:
+ ### http://bugs.activestate.com/show_bug.cgi?id=34051
+ unlink $file if $force;
+
+ my $fh = new FileHandle;
+ unless( $fh->open( ">$file" ) ) {
+ error( loc( "Could not create file '%1': %2", $file, $! ) );
+ return;
+ }
+
+ my $mf = MAKEFILE_PL->();
+ my $name = $self->module;
+ my $version = $self->version;
+ my $author = $self->author->author;
+ my $href = $self->status->prereqs;
+ my $prereqs = join ",\n", map {
+ (' ' x 25) . "'$_'\t=> '$href->{$_}'"
+ } keys %$href;
+ $prereqs ||= ''; # just in case there are none;
+
+ print $fh qq|
+ ### Auto-generated $mf by CPANPLUS ###
+
+ use ExtUtils::MakeMaker;
+
+ WriteMakefile(
+ NAME => '$name',
+ VERSION => '$version',
+ AUTHOR => '$author',
+ PREREQ_PM => {
+$prereqs
+ },
+ );
+ \n|;
+
+ $fh->close;
+ return 1;
+}
+
+sub dist_dir {
+ ### just in case you already did a call for this module object
+ ### just via a different dist object
+ my $dist = shift;
+ my $self = $dist->parent;
+ $dist = $self->status->dist_cpan if $self->status->dist_cpan;
+ $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan;
+
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $make; my $verbose;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+ my $tmpl = {
+ make => { default => $conf->get_program('make'),
+ store => \$make },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ };
+
+ check( $tmpl, \%hash ) or return;
+ }
+
+
+ my $dir;
+ unless( $dir = $self->status->extract ) {
+ error( loc( "No dir found to operate on!" ) );
+ return;
+ }
+
+ ### chdir to work directory ###
+ my $orig = cwd();
+ unless( $cb->_chdir( dir => $dir ) ) {
+ error( loc( "Could not chdir to build directory '%1'", $dir ) );
+ return;
+ }
+
+ my $fail; my $distdir;
+ TRY: {
+ $dist->prepare( @_ ) or (++$fail, last TRY);
+
+
+ my $captured;
+ unless(scalar run( command => [$make, 'distdir'],
+ buffer => \$captured,
+ verbose => $verbose )
+ ) {
+ error( loc( "MAKE DISTDIR failed: %1 %2", $!, $captured ) );
+ ++$fail, last TRY;
+ }
+
+ ### /path/to/Foo-Bar-1.2/Foo-Bar-1.2
+ $distdir = File::Spec->catdir( $dir, $self->package_name . '-' .
+ $self->package_version );
+
+ unless( -d $distdir ) {
+ error(loc("Do not know where '%1' got created", 'distdir'));
+ ++$fail, last TRY;
+ }
+ }
+
+ unless( $cb->_chdir( dir => $orig ) ) {
+ error( loc( "Could not chdir to start directory '%1'", $orig ) );
+ return;
+ }
+
+ return if $fail;
+ return $distdir;
+}
+
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Sample.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Sample.pm
new file mode 100755
index 00000000000..0b0939208ff
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Dist/Sample.pm
@@ -0,0 +1,16 @@
+package CPANPLUS::Dist::Sample;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Dist::Sample -- Sample code to create your own Dist::* plugin
+
+=head1 Description.
+
+This document is B<Obsolete>. Please read the documentation and code
+in C<CPANPLUS::Dist::Base>.
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Error.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Error.pm
new file mode 100755
index 00000000000..38710a8a857
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Error.pm
@@ -0,0 +1,201 @@
+package CPANPLUS::Error;
+
+use strict;
+
+use Log::Message private => 0;;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Error
+
+=head1 SYNOPSIS
+
+ use CPANPLUS::Error qw[cp_msg cp_error];
+
+=head1 DESCRIPTION
+
+This module provides the error handling code for the CPANPLUS
+libraries, and is mainly intended for internal use.
+
+=head1 FUNCTIONS
+
+=head2 cp_msg("message string" [,VERBOSE])
+
+Records a message on the stack, and prints it to C<STDOUT> (or actually
+C<$MSG_FH>, see the C<GLOBAL VARIABLES> section below), if the
+C<VERBOSE> option is true.
+The C<VERBOSE> option defaults to false.
+
+=head2 msg()
+
+An alias for C<cp_msg>.
+
+=head2 cp_error("error string" [,VERBOSE])
+
+Records an error on the stack, and prints it to C<STDERR> (or actually
+C<$ERROR_FH>, see the C<GLOBAL VARIABLES> sections below), if the
+C<VERBOSE> option is true.
+The C<VERBOSE> options defaults to true.
+
+=head2 error()
+
+An alias for C<cp_error>.
+
+=head1 CLASS METHODS
+
+=head2 CPANPLUS::Error->stack()
+
+Retrieves all the items on the stack. Since C<CPANPLUS::Error> is
+implemented using C<Log::Message>, consult its manpage for the
+function C<retrieve> to see what is returned and how to use the items.
+
+=head2 CPANPLUS::Error->stack_as_string([TRACE])
+
+Returns the whole stack as a printable string. If the C<TRACE> option is
+true all items are returned with C<Carp::longmess> output, rather than
+just the message.
+C<TRACE> defaults to false.
+
+=head2 CPANPLUS::Error->flush()
+
+Removes all the items from the stack and returns them. Since
+C<CPANPLUS::Error> is implemented using C<Log::Message>, consult its
+manpage for the function C<retrieve> to see what is returned and how
+to use the items.
+
+=cut
+
+BEGIN {
+ use Exporter;
+ use Params::Check qw[check];
+ use vars qw[@EXPORT @ISA $ERROR_FH $MSG_FH];
+
+ @ISA = 'Exporter';
+ @EXPORT = qw[cp_error cp_msg error msg];
+
+ my $log = new Log::Message;
+
+ for my $func ( @EXPORT ) {
+ no strict 'refs';
+
+ my $prefix = 'cp_';
+ my $name = $func;
+ $name =~ s/^$prefix//g;
+
+ *$func = sub {
+ my $msg = shift;
+
+ ### no point storing non-messages
+ return unless defined $msg;
+
+ $log->store(
+ message => $msg,
+ tag => uc $name,
+ level => $prefix . $name,
+ extra => [@_]
+ );
+ };
+ }
+
+ sub flush {
+ return reverse $log->flush;
+ }
+
+ sub stack {
+ return $log->retrieve( chrono => 1 );
+ }
+
+ sub stack_as_string {
+ my $class = shift;
+ my $trace = shift() ? 1 : 0;
+
+ return join $/, map {
+ '[' . $_->tag . '] [' . $_->when . '] ' .
+ ($trace ? $_->message . ' ' . $_->longmess
+ : $_->message);
+ } __PACKAGE__->stack;
+ }
+}
+
+=head1 GLOBAL VARIABLES
+
+=over 4
+
+=item $ERROR_FH
+
+This is the filehandle all the messages sent to C<error()> are being
+printed. This defaults to C<*STDERR>.
+
+=item $MSG_FH
+
+This is the filehandle all the messages sent to C<msg()> are being
+printed. This default to C<*STDOUT>.
+
+=cut
+local $| = 1;
+$ERROR_FH = \*STDERR;
+$MSG_FH = \*STDOUT;
+
+package Log::Message::Handlers;
+use Carp ();
+
+{
+
+ sub cp_msg {
+ my $self = shift;
+ my $verbose = shift;
+
+ ### so you don't want us to print the msg? ###
+ return if defined $verbose && $verbose == 0;
+
+ my $old_fh = select $CPANPLUS::Error::MSG_FH;
+
+ print '['. $self->tag . '] ' . $self->message . "\n";
+ select $old_fh;
+
+ return;
+ }
+
+ sub cp_error {
+ my $self = shift;
+ my $verbose = shift;
+
+ ### so you don't want us to print the error? ###
+ return if defined $verbose && $verbose == 0;
+
+ my $old_fh = select $CPANPLUS::Error::ERROR_FH;
+
+ ### is only going to be 1 for now anyway ###
+ ### C::I may not be loaded, so do a can() check first
+ my $cb = CPANPLUS::Internals->can('_return_all_objects')
+ ? (CPANPLUS::Internals->_return_all_objects)[0]
+ : undef;
+
+ ### maybe we didn't initialize an internals object (yet) ###
+ my $debug = $cb ? $cb->configure_object->get_conf('debug') : 0;
+ my $msg = '['. $self->tag . '] ' . $self->message . "\n";
+
+ ### i'm getting this warning in the test suite:
+ ### Ambiguous call resolved as CORE::warn(), qualify as such or
+ ### use & at CPANPLUS/Error.pm line 57.
+ ### no idea where it's coming from, since there's no 'sub warn'
+ ### anywhere to be found, but i'll mark it explicitly nonetheless
+ ### --kane
+ print $debug ? Carp::shortmess($msg) : $msg . "\n";
+
+ select $old_fh;
+
+ return;
+ }
+}
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/FAQ.pod b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/FAQ.pod
new file mode 100755
index 00000000000..82bb57aaf47
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/FAQ.pod
@@ -0,0 +1,30 @@
+=pod
+
+=head1 NAME
+
+CPANPLUS::FAQ
+
+=head1 DESCRIPTION
+
+This document attempts to provide answers to commonly asked questions.
+
+ XXX Work in progress
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Hacking.pod b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Hacking.pod
new file mode 100755
index 00000000000..1a28b9e5b05
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Hacking.pod
@@ -0,0 +1,135 @@
+=pod
+
+=head1 NAME
+
+CPANPLUS::Hacking
+
+=head1 DESCRIPTION
+
+This document attempts to describe how to develop with the
+CPANPLUS environment most easily, how certain things work and why.
+
+This is basically a quick-start guide to people who want to add
+features or patches to CPANPLUS.
+
+=head1 OBTAINING CPANPLUS
+
+Checkout CPANPLUS from its Subversion repository at
+L<http://oss.dwim.org/cpanplus-devel> .
+
+=head1 INSTALLING CPANPLUS
+
+CPANPLUS follows the standard perl module installation process:
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+=head1 CONFIGURING CPANPLUS
+
+When running C<perl Makefile.PL> you will be prompted to configure.
+If you have already done so, and merely wish to update the C<Makefile>,
+simply run:
+
+ perl Makefile.PL JFDI=1
+
+This will keep your configuration intact. Note however, if there are
+changes to the default configuration file C<Config.pm-orig>, you should
+either delete your current config file and reconfigure, or patch your
+config file from the new entries in C<Config.pm-orig>.
+
+=head1 RUNNING CPANPLUS FROM DEVELOPMENT ENVIRONMENT
+
+If you'd rather not install the development version to your
+C<site_perl> directory, that's no problem. You can set your C<PERL5LIB>
+environment variable to CPANPLUS' C<lib> directory, and you can run it
+from there.
+
+=head1 RUNNING CPANPLUS TESTS
+
+Tests are what tells us if CPANPLUS is working. If a test is not working,
+try to run it explicilty like this:
+
+ perl -I/path/to/cpanplus/lib t/XX_name_of_test.t 1
+
+The extra '1' makes sure that all the messages and errors (they might
+be errors we're testing for!) are being printed rather than kept quiet.
+This is a great way to find out the context of any failures that may
+occur.
+
+If you believe this test failure proves a bug in CPANPLUS, the long
+output of the test file is something we'd like to see alongside your
+bug report.
+
+=head1 FINDING BUGS
+
+Sometimes you might find bugs in CPANPLUS' behaviour. If you encounter
+these in a development snapshot, we'd appreciate a complete patch (as
+described below in the L<SENDING PATCHES> section.
+
+If it's way over your head, then of course reporting the bug is always
+better than not reporting it at all. Before you do so though, make
+sure you have the B<latest> development snapshot, and the bug still
+persists there. If so, report the bug to this address:
+
+ cpanplus-devel@lists.sourceforge.net
+
+A good C<patch> would have the following characteristics:
+
+=over 4
+
+=item Problem description
+
+Describe clearly what the bug is you found, and what it should have
+done instead.
+
+=item Program demonstrating the bug
+
+Show us how to reproduce the bug, in a simple of a program as possible
+
+=item [OPTIONAL] A patch to the test suite to test for the bug
+
+Amend our test suite by making sure this bug will be found in this, and
+future versions of CPANPLUS (see L<SUPPLYING PATCHES>)
+
+=item [OPTIONAL] A patch to the code + tests + documentation
+
+Fix the bug, update the docs & tests. That way your bug will be gone
+forever :)
+
+=back
+
+=head1 SUPPLYING PATCHES
+
+Patches are a good thing, and they are welcome. Especially if they fix
+bugs you've found along the way, or that others have reported.
+
+We prefer patches in the following format:
+
+=over 4
+
+=item * In C<diff -u> or C<diff -c> format
+
+=item * From the root of the snapshot
+
+=item * Including patches for code + tests + docs
+
+=item * Sent per mail to cpanplus-devel@lists.sourceforge.net
+
+=item * With subject containing C<[PATCH]> + description of the patch
+
+=back
+
+You will always be informed if a patch is applied or rejected, and in
+case of rejection why that is (perhaps you can tweak the patch to have
+it accepted after all).
+
+=cut
+
+__END__
+
+* perl5lib
+* perl t/foo 1
+* patches to cpanplus-devel
+* snap/devel.tgz
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals.pm
new file mode 100755
index 00000000000..1c21bbec0ee
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals.pm
@@ -0,0 +1,516 @@
+package CPANPLUS::Internals;
+
+### we /need/ perl5.6.1 or higher -- we use coderefs in @INC,
+### and 5.6.0 is just too buggy
+use 5.006001;
+
+use strict;
+use Config;
+
+
+use CPANPLUS::Error;
+
+use CPANPLUS::Selfupdate;
+
+use CPANPLUS::Internals::Extract;
+use CPANPLUS::Internals::Fetch;
+use CPANPLUS::Internals::Utils;
+use CPANPLUS::Internals::Constants;
+use CPANPLUS::Internals::Search;
+use CPANPLUS::Internals::Report;
+
+
+require base;
+use Cwd qw[cwd];
+use Module::Load qw[load];
+use Params::Check qw[check];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+use Module::Load::Conditional qw[can_load];
+
+use Object::Accessor;
+
+
+local $Params::Check::VERBOSE = 1;
+
+use vars qw[@ISA $VERSION];
+
+@ISA = qw[
+ CPANPLUS::Internals::Extract
+ CPANPLUS::Internals::Fetch
+ CPANPLUS::Internals::Utils
+ CPANPLUS::Internals::Search
+ CPANPLUS::Internals::Report
+ ];
+
+$VERSION = "0.9001";
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Internals
+
+=head1 SYNOPSIS
+
+ my $internals = CPANPLUS::Internals->_init( _conf => $conf );
+ my $backend = CPANPLUS::Internals->_retrieve_id( $ID );
+
+=head1 DESCRIPTION
+
+This module is the guts of CPANPLUS -- it inherits from all other
+modules in the CPANPLUS::Internals::* namespace, thus defying normal
+rules of OO programming -- but if you're reading this, you already
+know what's going on ;)
+
+Please read the C<CPANPLUS::Backend> documentation for the normal API.
+
+=head1 ACCESSORS
+
+=over 4
+
+=item _conf
+
+Get/set the configure object
+
+=item _id
+
+Get/set the id
+
+=cut
+
+### autogenerate accessors ###
+for my $key ( qw[_conf _id _modules _hosts _methods _status
+ _callbacks _selfupdate _mtree _atree]
+) {
+ no strict 'refs';
+ *{__PACKAGE__."::$key"} = sub {
+ $_[0]->{$key} = $_[1] if @_ > 1;
+ return $_[0]->{$key};
+ }
+}
+
+=pod
+
+=back
+
+=head1 METHODS
+
+=head2 $internals = CPANPLUS::Internals->_init( _conf => CONFIG_OBJ )
+
+C<_init> creates a new CPANPLUS::Internals object.
+
+You have to pass it a valid C<CPANPLUS::Configure> object.
+
+Returns the object on success, or dies on failure.
+
+=cut
+{ ### NOTE:
+ ### if extra callbacks are added, don't forget to update the
+ ### 02-internals.t test script with them!
+ my $callback_map = {
+ ### name default value
+ install_prerequisite => 1, # install prereqs when 'ask' is set?
+ edit_test_report => 0, # edit the prepared test report?
+ send_test_report => 1, # send the test report?
+ # munge the test report
+ munge_test_report => sub { return $_[1] },
+ # filter out unwanted prereqs
+ filter_prereqs => sub { return $_[1] },
+ # continue if 'make test' fails?
+ proceed_on_test_failure => sub { return 0 },
+ munge_dist_metafile => sub { return $_[1] },
+ };
+
+ my $status = Object::Accessor->new;
+ $status->mk_accessors(qw[pending_prereqs]);
+
+ my $callback = Object::Accessor->new;
+ $callback->mk_accessors(keys %$callback_map);
+
+ my $conf;
+ my $Tmpl = {
+ _conf => { required => 1, store => \$conf,
+ allow => IS_CONFOBJ },
+ _id => { default => '', no_override => 1 },
+ _authortree => { default => '', no_override => 1 },
+ _modtree => { default => '', no_override => 1 },
+ _hosts => { default => {}, no_override => 1 },
+ _methods => { default => {}, no_override => 1 },
+ _status => { default => '<empty>', no_override => 1 },
+ _callbacks => { default => '<empty>', no_override => 1 },
+ };
+
+ sub _init {
+ my $class = shift;
+ my %hash = @_;
+
+ ### temporary warning until we fix the storing of multiple id's
+ ### and their serialization:
+ ### probably not going to happen --kane
+ if( my $id = $class->_last_id ) {
+ # make it a singleton.
+ warn loc(q[%1 currently only supports one %2 object per ] .
+ qq[running program\n], 'CPANPLUS', $class);
+
+ return $class->_retrieve_id( $id );
+ }
+
+ my $args = check($Tmpl, \%hash)
+ or die loc(qq[Could not initialize '%1' object], $class);
+
+ bless $args, $class;
+
+ $args->{'_id'} = $args->_inc_id;
+ $args->{'_status'} = $status;
+ $args->{'_callbacks'} = $callback;
+
+ ### initialize callbacks to default state ###
+ for my $name ( $callback->ls_accessors ) {
+ my $rv = ref $callback_map->{$name} ? 'sub return value' :
+ $callback_map->{$name} ? 'true' : 'false';
+
+ $args->_callbacks->$name(
+ sub { msg(loc("DEFAULT '%1' HANDLER RETURNING '%2'",
+ $name, $rv), $args->_conf->get_conf('debug'));
+ return ref $callback_map->{$name}
+ ? $callback_map->{$name}->( @_ )
+ : $callback_map->{$name};
+ }
+ );
+ }
+
+ ### create a selfupdate object
+ $args->_selfupdate( CPANPLUS::Selfupdate->new( $args ) );
+
+ ### initalize it as an empty hashref ###
+ $args->_status->pending_prereqs( {} );
+
+ $conf->_set_build( startdir => cwd() ),
+ or error( loc("couldn't locate current dir!") );
+
+ $ENV{FTP_PASSIVE} = 1, if $conf->get_conf('passive');
+
+ my $id = $args->_store_id( $args );
+
+ unless ( $id == $args->_id ) {
+ error( loc("IDs do not match: %1 != %2. Storage failed!",
+ $id, $args->_id) );
+ }
+
+ ### different source engines available now, so set them here
+ { my $store = $conf->get_conf( 'source_engine' )
+ || DEFAULT_SOURCE_ENGINE;
+
+ unless( can_load( modules => { $store => '0.0' }, verbose => 1 ) ) {
+ error( loc( "Could not load source engine '%1'", $store ) );
+
+ if( $store ne DEFAULT_SOURCE_ENGINE ) {
+ msg( loc("Falling back to %1", DEFAULT_SOURCE_ENGINE), 1 );
+
+ load DEFAULT_SOURCE_ENGINE;
+
+ base->import( DEFAULT_SOURCE_ENGINE );
+ } else {
+ return;
+ }
+ } else {
+ base->import( $store );
+ }
+ }
+
+ return $args;
+ }
+
+=pod
+
+=head2 $bool = $internals->_flush( list => \@caches )
+
+Flushes the designated caches from the C<CPANPLUS> object.
+
+Returns true on success, false if one or more caches could not be
+be flushed.
+
+=cut
+
+ sub _flush {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my $aref;
+ my $tmpl = {
+ list => { required => 1, default => [],
+ strict_type => 1, store => \$aref },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ my $flag = 0;
+ for my $what (@$aref) {
+ my $cache = '_' . $what;
+
+ ### set the include paths back to their original ###
+ if( $what eq 'lib' ) {
+ $ENV{PERL5LIB} = $conf->_perl5lib || '';
+ @INC = @{$conf->_lib};
+
+ ### give all modules a new status object -- this is slightly
+ ### costly, but the best way to make sure all statusses are
+ ### forgotten --kane
+ } elsif ( $what eq 'modules' ) {
+ for my $modobj ( values %{$self->module_tree} ) {
+
+ $modobj->_flush;
+ }
+
+ ### blow away the methods cache... currently, that's only
+ ### File::Fetch's method fail list
+ } elsif ( $what eq 'methods' ) {
+
+ ### still fucking p4 :( ###
+ $File'Fetch::METHOD_FAIL = $File'Fetch::METHOD_FAIL = {};
+
+ ### blow away the m::l::c cache, so modules can be (re)loaded
+ ### again if they become available
+ } elsif ( $what eq 'load' ) {
+ undef $Module::Load::Conditional::CACHE;
+
+ } else {
+ unless ( exists $self->{$cache} && exists $Tmpl->{$cache} ) {
+ error( loc( "No such cache: '%1'", $what ) );
+ $flag++;
+ next;
+ } else {
+ $self->$cache( {} );
+ }
+ }
+ }
+ return !$flag;
+ }
+
+### NOTE:
+### if extra callbacks are added, don't forget to update the
+### 02-internals.t test script with them!
+
+=pod
+
+=head2 $bool = $internals->_register_callback( name => CALLBACK_NAME, code => CODEREF );
+
+Registers a callback for later use by the internal libraries.
+
+Here is a list of the currently used callbacks:
+
+=over 4
+
+=item install_prerequisite
+
+Is called when the user wants to be C<asked> about what to do with
+prerequisites. Should return a boolean indicating true to install
+the prerequisite and false to skip it.
+
+=item send_test_report
+
+Is called when the user should be prompted if he wishes to send the
+test report. Should return a boolean indicating true to send the
+test report and false to skip it.
+
+=item munge_test_report
+
+Is called when the test report message has been composed, giving
+the user a chance to programatically alter it. Should return the
+(munged) message to be sent.
+
+=item edit_test_report
+
+Is called when the user should be prompted to edit test reports
+about to be sent out by Test::Reporter. Should return a boolean
+indicating true to edit the test report in an editor and false
+to skip it.
+
+=item proceed_on_test_failure
+
+Is called when 'make test' or 'Build test' fails. Should return
+a boolean indicating whether the install should continue even if
+the test failed.
+
+=item munge_dist_metafile
+
+Is called when the C<CPANPLUS::Dist::*> metafile is created, like
+C<control> for C<CPANPLUS::Dist::Deb>, giving the user a chance to
+programatically alter it. Should return the (munged) text to be
+written to the metafile.
+
+=back
+
+=cut
+
+ sub _register_callback {
+ my $self = shift or return;
+ my %hash = @_;
+
+ my ($name,$code);
+ my $tmpl = {
+ name => { required => 1, store => \$name,
+ allow => [$callback->ls_accessors] },
+ code => { required => 1, allow => IS_CODEREF,
+ store => \$code },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ $self->_callbacks->$name( $code ) or return;
+
+ return 1;
+ }
+
+# =head2 $bool = $internals->_add_callback( name => CALLBACK_NAME, code => CODEREF );
+#
+# Adds a new callback to be used from anywhere in the system. If the callback
+# is already known, an error is raised and false is returned. If the callback
+# is not yet known, it is added, and the corresponding coderef is registered
+# using the
+#
+# =cut
+#
+# sub _add_callback {
+# my $self = shift or return;
+# my %hash = @_;
+#
+# my ($name,$code);
+# my $tmpl = {
+# name => { required => 1, store => \$name, },
+# code => { required => 1, allow => IS_CODEREF,
+# store => \$code },
+# };
+#
+# check( $tmpl, \%hash ) or return;
+#
+# if( $callback->can( $name ) ) {
+# error(loc("Callback '%1' is already registered"));
+# return;
+# }
+#
+# $callback->mk_accessor( $name );
+#
+# $self->_register_callback( name => $name, code => $code ) or return;
+#
+# return 1;
+# }
+
+}
+
+=pod
+
+=head2 $bool = $internals->_add_to_includepath( directories => \@dirs )
+
+Adds a list of directories to the include path.
+This means they get added to C<@INC> as well as C<$ENV{PERL5LIB}>.
+
+Returns true on success, false on failure.
+
+=cut
+
+sub _add_to_includepath {
+ my $self = shift;
+ my %hash = @_;
+
+ my $dirs;
+ my $tmpl = {
+ directories => { required => 1, default => [], store => \$dirs,
+ strict_type => 1 },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my $s = $Config{'path_sep'};
+
+ ### only add if it's not added yet
+ for my $lib (@$dirs) {
+ push @INC, $lib unless grep { $_ eq $lib } @INC;
+ #
+ ### it will be complaining if $ENV{PERL5LIB] is not defined (yet).
+ local $^W;
+ $ENV{'PERL5LIB'} .= $s . $lib
+ unless $ENV{'PERL5LIB'} =~ qr|\Q$s$lib\E|;
+ }
+
+ return 1;
+}
+
+=pod
+
+=head2 $id = CPANPLUS::Internals->_last_id
+
+Return the id of the last object stored.
+
+=head2 $id = CPANPLUS::Internals->_store_id( $internals )
+
+Store this object; return its id.
+
+=head2 $obj = CPANPLUS::Internals->_retrieve_id( $ID )
+
+Retrieve an object based on its ID -- return false on error.
+
+=head2 CPANPLUS::Internals->_remove_id( $ID )
+
+Remove the object marked by $ID from storage.
+
+=head2 @objs = CPANPLUS::Internals->_return_all_objects
+
+Return all stored objects.
+
+=cut
+
+
+### code for storing multiple objects
+### -- although we only support one right now
+### XXX when support for multiple objects comes, saving source will have
+### to change
+{
+ my $idref = {};
+ my $count = 0;
+
+ sub _inc_id { return ++$count; }
+
+ sub _last_id { $count }
+
+ sub _store_id {
+ my $self = shift;
+ my $obj = shift or return;
+
+ unless( IS_INTERNALS_OBJ->($obj) ) {
+ error( loc("The object you passed has the wrong ref type: '%1'",
+ ref $obj) );
+ return;
+ }
+
+ $idref->{ $obj->_id } = $obj;
+ return $obj->_id;
+ }
+
+ sub _retrieve_id {
+ my $self = shift;
+ my $id = shift or return;
+
+ my $obj = $idref->{$id};
+ return $obj;
+ }
+
+ sub _remove_id {
+ my $self = shift;
+ my $id = shift or return;
+
+ return delete $idref->{$id};
+ }
+
+ sub _return_all_objects { return values %$idref }
+}
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Constants.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Constants.pm
new file mode 100755
index 00000000000..1a38200dfb7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Constants.pm
@@ -0,0 +1,375 @@
+package CPANPLUS::Internals::Constants;
+
+use strict;
+
+use CPANPLUS::Error;
+
+use Config;
+use File::Spec;
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+require Exporter;
+use vars qw[$VERSION @ISA @EXPORT];
+
+use Package::Constants;
+
+@ISA = qw[Exporter];
+@EXPORT = Package::Constants->list( __PACKAGE__ );
+
+
+sub constants { @EXPORT };
+
+use constant INSTALLER_BUILD
+ => 'CPANPLUS::Dist::Build';
+use constant INSTALLER_MM => 'CPANPLUS::Dist::MM';
+use constant INSTALLER_SAMPLE
+ => 'CPANPLUS::Dist::Sample';
+use constant INSTALLER_BASE => 'CPANPLUS::Dist::Base';
+use constant INSTALLER_AUTOBUNDLE
+ => 'CPANPLUS::Dist::Autobundle';
+
+use constant SHELL_DEFAULT => 'CPANPLUS::Shell::Default';
+use constant SHELL_CLASSIC => 'CPANPLUS::Shell::Classic';
+
+use constant CONFIG => 'CPANPLUS::Config';
+use constant CONFIG_USER => 'CPANPLUS::Config::User';
+use constant CONFIG_SYSTEM => 'CPANPLUS::Config::System';
+use constant CONFIG_BOXED => 'CPANPLUS::Config::Boxed';
+
+use constant DEFAULT_SOURCE_ENGINE
+ => 'CPANPLUS::Internals::Source::Memory';
+
+use constant TARGET_INIT => 'init';
+use constant TARGET_CREATE => 'create';
+use constant TARGET_PREPARE => 'prepare';
+use constant TARGET_INSTALL => 'install';
+use constant TARGET_IGNORE => 'ignore';
+
+use constant ON_WIN32 => $^O eq 'MSWin32';
+use constant ON_NETWARE => $^O eq 'NetWare';
+use constant ON_CYGWIN => $^O eq 'cygwin';
+use constant ON_VMS => $^O eq 'VMS';
+
+use constant DOT_CPANPLUS => ON_VMS ? '_cpanplus' : '.cpanplus';
+
+use constant OPT_AUTOFLUSH => '-MCPANPLUS::Internals::Utils::Autoflush';
+
+use constant UNKNOWN_DL_LOCATION
+ => 'UNKNOWN-ORIGIN';
+
+use constant NMAKE => 'nmake.exe';
+use constant NMAKE_URL =>
+ 'ftp://ftp.microsoft.com/Softlib/MSLFILES/nmake15.exe';
+
+use constant INSTALL_VIA_PACKAGE_MANAGER
+ => sub { my $fmt = $_[0] or return;
+ return 1 if $fmt ne INSTALLER_BUILD and
+ $fmt ne INSTALLER_MM;
+ };
+
+use constant IS_CODEREF => sub { ref $_[-1] eq 'CODE' };
+use constant IS_MODOBJ => sub { UNIVERSAL::isa($_[-1],
+ 'CPANPLUS::Module') };
+use constant IS_FAKE_MODOBJ => sub { UNIVERSAL::isa($_[-1],
+ 'CPANPLUS::Module::Fake') };
+use constant IS_AUTHOBJ => sub { UNIVERSAL::isa($_[-1],
+ 'CPANPLUS::Module::Author') };
+use constant IS_FAKE_AUTHOBJ
+ => sub { UNIVERSAL::isa($_[-1],
+ 'CPANPLUS::Module::Author::Fake') };
+
+use constant IS_CONFOBJ => sub { UNIVERSAL::isa($_[-1],
+ 'CPANPLUS::Configure') };
+
+use constant IS_RVOBJ => sub { UNIVERSAL::isa($_[-1],
+ 'CPANPLUS::Backend::RV') };
+
+use constant IS_INTERNALS_OBJ
+ => sub { UNIVERSAL::isa($_[-1],
+ 'CPANPLUS::Internals') };
+
+use constant IS_FILE => sub { return 1 if -e $_[-1] };
+
+use constant FILE_EXISTS => sub {
+ my $file = $_[-1];
+ return 1 if IS_FILE->($file);
+ local $Carp::CarpLevel =
+ $Carp::CarpLevel+2;
+ error(loc( q[File '%1' does not exist],
+ $file));
+ return;
+ };
+
+use constant FILE_READABLE => sub {
+ my $file = $_[-1];
+ return 1 if -e $file && -r _;
+ local $Carp::CarpLevel =
+ $Carp::CarpLevel+2;
+ error( loc( q[File '%1' is not readable ].
+ q[or does not exist], $file));
+ return;
+ };
+use constant IS_DIR => sub { return 1 if -d $_[-1] };
+
+use constant DIR_EXISTS => sub {
+ my $dir = $_[-1];
+ return 1 if IS_DIR->($dir);
+ local $Carp::CarpLevel =
+ $Carp::CarpLevel+2;
+ error(loc(q[Dir '%1' does not exist],
+ $dir));
+ return;
+ };
+
+ ### On VMS, if the $Config{make} is either MMK
+ ### or MMS, then the makefile is 'DESCRIP.MMS'.
+use constant MAKEFILE => sub { my $file =
+ (ON_VMS and
+ $Config::Config{make} =~ /MM[S|K]/i)
+ ? 'DESCRIP.MMS'
+ : 'Makefile';
+
+ return @_
+ ? File::Spec->catfile( @_, $file )
+ : $file;
+ };
+use constant MAKEFILE_PL => sub { return @_
+ ? File::Spec->catfile( @_,
+ 'Makefile.PL' )
+ : 'Makefile.PL';
+ };
+use constant BUILD_PL => sub { return @_
+ ? File::Spec->catfile( @_,
+ 'Build.PL' )
+ : 'Build.PL';
+ };
+
+use constant META_YML => sub { return @_
+ ? File::Spec->catfile( @_, 'META.yml' )
+ : 'META.yml';
+ };
+
+use constant MYMETA_YML => sub { return @_
+ ? File::Spec->catfile( @_, 'MYMETA.yml' )
+ : 'MYMETA.yml';
+ };
+
+use constant BLIB => sub { return @_
+ ? File::Spec->catfile(@_, 'blib')
+ : 'blib';
+ };
+
+use constant LIB => 'lib';
+use constant LIB_DIR => sub { return @_
+ ? File::Spec->catdir(@_, LIB)
+ : LIB;
+ };
+use constant AUTO => 'auto';
+use constant LIB_AUTO_DIR => sub { return @_
+ ? File::Spec->catdir(@_, LIB, AUTO)
+ : File::Spec->catdir(LIB, AUTO)
+ };
+use constant ARCH => 'arch';
+use constant ARCH_DIR => sub { return @_
+ ? File::Spec->catdir(@_, ARCH)
+ : ARCH;
+ };
+use constant ARCH_AUTO_DIR => sub { return @_
+ ? File::Spec->catdir(@_,ARCH,AUTO)
+ : File::Spec->catdir(ARCH,AUTO)
+ };
+
+use constant BLIB_LIBDIR => sub { return @_
+ ? File::Spec->catdir(
+ @_, BLIB->(), LIB )
+ : File::Spec->catdir( BLIB->(), LIB );
+ };
+
+use constant CONFIG_USER_LIB_DIR => sub {
+ require CPANPLUS::Internals::Utils;
+ LIB_DIR->(
+ CPANPLUS::Internals::Utils->_home_dir,
+ DOT_CPANPLUS
+ );
+ };
+use constant CONFIG_USER_FILE => sub {
+ File::Spec->catfile(
+ CONFIG_USER_LIB_DIR->(),
+ split('::', CONFIG_USER),
+ ) . '.pm';
+ };
+use constant CONFIG_SYSTEM_FILE => sub {
+ require CPANPLUS::Internals;
+ require File::Basename;
+ my $dir = File::Basename::dirname(
+ $INC{'CPANPLUS/Internals.pm'}
+ );
+
+ ### XXX use constants
+ File::Spec->catfile(
+ $dir, qw[Config System.pm]
+ );
+ };
+
+use constant README => sub { my $obj = $_[0];
+ my $pkg = $obj->package_name;
+ $pkg .= '-' . $obj->package_version .
+ '.readme';
+ return $pkg;
+ };
+use constant META_EXT => 'meta';
+
+use constant META => sub { my $obj = $_[0];
+ my $pkg = $obj->package_name;
+ $pkg .= '-' . $obj->package_version .
+ '.' . META_EXT;
+ return $pkg;
+ };
+
+use constant OPEN_FILE => sub {
+ my($file, $mode) = (@_, '');
+ my $fh;
+ open $fh, "$mode" . $file
+ or error(loc(
+ "Could not open file '%1': %2",
+ $file, $!));
+ return $fh if $fh;
+ return;
+ };
+
+use constant OPEN_DIR => sub {
+ my $dir = shift;
+ my $dh;
+ opendir $dh, $dir or error(loc(
+ "Could not open dir '%1': %2", $dir, $!
+ ));
+
+ return $dh if $dh;
+ return;
+ };
+
+use constant READ_DIR => sub {
+ my $dir = shift;
+ my $dh = OPEN_DIR->( $dir ) or return;
+
+ ### exclude . and ..
+ my @files = grep { $_ !~ /^\.{1,2}/ }
+ readdir($dh);
+
+ ### Remove trailing dot on VMS when
+ ### using VMS syntax.
+ if( ON_VMS ) {
+ s/(?<!\^)\.$// for @files;
+ }
+
+ return @files;
+ };
+
+use constant STRIP_GZ_SUFFIX
+ => sub {
+ my $file = $_[0] or return;
+ $file =~ s/.gz$//i;
+ return $file;
+ };
+
+use constant CHECKSUMS => 'CHECKSUMS';
+use constant PGP_HEADER => '-----BEGIN PGP SIGNED MESSAGE-----';
+use constant ENV_CPANPLUS_CONFIG
+ => 'PERL5_CPANPLUS_CONFIG';
+use constant ENV_CPANPLUS_IS_EXECUTING
+ => 'PERL5_CPANPLUS_IS_EXECUTING';
+use constant DEFAULT_EMAIL => 'cpanplus@example.com';
+use constant CPANPLUS_UA => sub { ### for the version number ###
+ require CPANPLUS::Internals;
+ "CPANPLUS/$CPANPLUS::Internals::VERSION"
+ };
+use constant TESTERS_URL => sub {
+ 'http://cpantesters.org/distro/'.
+ uc(substr($_[0],0,1)) .'/'. $_[0] . '.yaml';
+ };
+use constant TESTERS_DETAILS_URL
+ => sub {
+ 'http://cpantesters.org/distro/'.
+ uc(substr($_[0],0,1)) .'/'. $_[0];
+ };
+
+use constant CREATE_FILE_URI
+ => sub {
+ my $dir = $_[0] or return;
+ return $dir =~ m|^/|
+ ? 'file://' . $dir
+ : 'file:///' . $dir;
+ };
+
+use constant EMPTY_DSLIP => ' ';
+
+use constant CUSTOM_AUTHOR_ID
+ => 'LOCAL';
+
+use constant DOT_SHELL_DEFAULT_RC
+ => '.shell-default.rc';
+
+use constant SOURCE_SQLITE_DB
+ => 'db.sql';
+
+use constant PREREQ_IGNORE => 0;
+use constant PREREQ_INSTALL => 1;
+use constant PREREQ_ASK => 2;
+use constant PREREQ_BUILD => 3;
+use constant BOOLEANS => [0,1];
+use constant CALLING_FUNCTION
+ => sub { my $lvl = $_[0] || 0;
+ return join '::', (caller(2+$lvl))[3]
+ };
+use constant PERL_CORE => 'perl';
+use constant STORABLE_EXT => '.stored';
+
+use constant GET_XS_FILES => sub { my $dir = $_[0] or return;
+ require File::Find;
+ my @files;
+ File::Find::find(
+ sub { push @files, $File::Find::name
+ if $File::Find::name =~ /\.xs$/i
+ }, $dir );
+
+ return @files;
+ };
+
+use constant INSTALL_LOG_FILE
+ => sub { my $obj = shift or return;
+ my $name = $obj->name; $name =~ s/::/-/g;
+ $name .= '-'. $obj->version;
+ $name .= '-'. scalar(time) . '.log';
+ return $name;
+ };
+
+use constant ON_OLD_CYGWIN => do { ON_CYGWIN and $] < 5.008
+ ? loc(
+ "Your perl version for %1 is too low; ".
+ "Require %2 or higher for this function",
+ $^O, '5.8.0' )
+ : '';
+ };
+
+### XXX these 2 are probably obsolete -- check & remove;
+use constant DOT_EXISTS => '.exists';
+
+use constant QUOTE_PERL_ONE_LINER
+ => sub { my $line = shift or return;
+
+ ### use double quotes on these systems
+ return qq["$line"]
+ if ON_WIN32 || ON_NETWARE || ON_VMS;
+
+ ### single quotes on the rest
+ return qq['$line'];
+ };
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Constants/Report.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Constants/Report.pm
new file mode 100755
index 00000000000..59a41a6083b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Constants/Report.pm
@@ -0,0 +1,407 @@
+package CPANPLUS::Internals::Constants::Report;
+
+use strict;
+use CPANPLUS::Error;
+
+use File::Spec;
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+require Exporter;
+use vars qw[$VERSION @ISA @EXPORT];
+
+use Package::Constants;
+
+### for the version
+require CPANPLUS::Internals;
+
+$VERSION = $CPANPLUS::Internals::VERSION = $CPANPLUS::Internals::VERSION;
+@ISA = qw[Exporter];
+@EXPORT = Package::Constants->list( __PACKAGE__ );
+
+
+### OS to regex map ###
+my %OS = (
+ Amiga => 'amigaos',
+ Atari => 'mint',
+ BSD => 'bsdos|darwin|freebsd|openbsd|netbsd',
+ Be => 'beos',
+ BeOS => 'beos',
+ Cygwin => 'cygwin',
+ Darwin => 'darwin',
+ EBCDIC => 'os390|os400|posix-bc|vmesa',
+ HPUX => 'hpux',
+ Linux => 'linux',
+ MSDOS => 'dos|os2|MSWin32|cygwin',
+ 'bin\\d*Mac'=> 'MacOS|darwin', # binMac, bin56Mac, bin58Mac...
+ Mac => 'MacOS|darwin',
+ MacPerl => 'MacOS',
+ MacOS => 'MacOS|darwin',
+ MacOSX => 'darwin',
+ MPE => 'mpeix',
+ MPEiX => 'mpeix',
+ OS2 => 'os2',
+ Plan9 => 'plan9',
+ RISCOS => 'riscos',
+ SGI => 'irix',
+ Solaris => 'solaris',
+ Unix => 'aix|bsdos|darwin|dgux|dynixptx|freebsd|'.
+ 'linux|hpux|machten|netbsd|next|openbsd|dec_osf|'.
+ 'svr4|sco_sv|unicos|unicosmk|solaris|sunos',
+ VMS => 'VMS',
+ VOS => 'VOS',
+ Win32 => 'MSWin32|cygwin',
+ Win32API => 'MSWin32|cygwin',
+);
+
+use constant GRADE_FAIL => 'fail';
+use constant GRADE_PASS => 'pass';
+use constant GRADE_NA => 'na';
+use constant GRADE_UNKNOWN => 'unknown';
+
+use constant MAX_REPORT_SEND
+ => 2;
+
+use constant CPAN_TESTERS_EMAIL
+ => 'cpan-testers@perl.org';
+
+### the cpan mail account for this user ###
+use constant CPAN_MAIL_ACCOUNT
+ => sub {
+ my $username = shift or return;
+ return $username . '@cpan.org';
+ };
+
+### check if this module is platform specific and if we're on that
+### specific platform. Alternately, the module is not platform specific
+### and we're always OK to send out test results.
+use constant RELEVANT_TEST_RESULT
+ => sub {
+ my $mod = shift or return;
+ my $name = $mod->module;
+ my $specific;
+ for my $platform (keys %OS) {
+ if( $name =~ /\b$platform\b/i ) {
+ # beware the Mac != MAC
+ next if($platform eq 'Mac' &&
+ $name !~ /\b$platform\b/);
+ $specific++;
+ return 1 if
+ $^O =~ /^(?:$OS{$platform})$/
+ }
+ };
+ return $specific ? 0 : 1;
+ };
+
+use constant UNSUPPORTED_OS
+ => sub {
+ my $buffer = shift or return;
+ if( $buffer =~
+ /No support for OS|OS unsupported/im ) {
+ return 1;
+ }
+ return 0;
+ };
+
+use constant PERL_VERSION_TOO_LOW
+ => sub {
+ my $buffer = shift or return;
+ # ExtUtils::MakeMaker format
+ if( $buffer =~
+ /Perl .*? required--this is only .*?/m ) {
+ return 1;
+ }
+ # Module::Build format
+ if( $buffer =~
+ /ERROR:( perl:)? Version .*?( of perl)? is installed, but we need version >= .*?/m ) {
+ return 1;
+ }
+ return 0;
+ };
+
+use constant NO_TESTS_DEFINED
+ => sub {
+ my $buffer = shift or return;
+ if( $buffer =~
+ /(No tests defined( for [\w:]+ extension)?\.)/
+ and $buffer !~ /\*\.t/m and
+ $buffer !~ /test\.pl/m
+ ) {
+ return $1
+ }
+
+ return;
+ };
+
+### what stage did the test fail? ###
+use constant TEST_FAIL_STAGE
+ => sub {
+ my $buffer = shift or return;
+ return $buffer =~ /(MAKE [A-Z]+).*/
+ ? lc $1 :
+ 'fetch';
+ };
+
+
+use constant MISSING_PREREQS_LIST
+ => sub {
+ my $buffer = shift;
+ my $last = ( split /\[ERROR\] .+? MAKE TEST/, $buffer )[-1];
+ my @list = map { s/.pm$//; s|/|::|g; $_ }
+ ($last =~
+ m/\bCan\'t locate (\S+) in \@INC/g);
+
+ ### make sure every missing prereq is only
+ ### listed once
+ { my %seen;
+ @list = grep { !$seen{$_}++ } @list
+ }
+
+ return @list;
+ };
+
+use constant MISSING_EXTLIBS_LIST
+ => sub {
+ my $buffer = shift;
+ my @list =
+ ($buffer =~
+ m/No library found for -l([-\w]+)/g);
+
+ return @list;
+ };
+
+use constant REPORT_MESSAGE_HEADER
+ => sub {
+ my ($version, $author) = @_;
+ return << ".";
+
+Dear $author,
+
+This is a computer-generated error report created automatically by
+CPANPLUS, version $version. Testers personal comments may appear
+at the end of this report.
+
+.
+ };
+
+use constant REPORT_MESSAGE_FAIL_HEADER
+ => sub {
+ my($stage, $buffer) = @_;
+ return << ".";
+
+Thank you for uploading your work to CPAN. However, it appears that
+there were some problems testing your distribution.
+
+TEST RESULTS:
+
+Below is the error stack from stage '$stage':
+
+$buffer
+
+.
+ };
+
+use constant REPORT_MISSING_PREREQS
+ => sub {
+ my ($author,$email,@missing) = @_;
+ $author = ($author && $email)
+ ? "$author ($email)"
+ : 'Your Name Here';
+
+ my $modules = join "\n", @missing;
+ my $prereqs = join "\n",
+ map {"\t'$_'\t=> '0',".
+ " # or a minimum working version"}
+ @missing;
+
+ return << ".";
+
+MISSING PREREQUISITES:
+
+It was observed that the test suite seem to fail without these modules:
+
+$modules
+
+As such, adding the prerequisite module(s) to 'PREREQ_PM' in your
+Makefile.PL should solve this problem. For example:
+
+WriteMakefile(
+ AUTHOR => '$author',
+ ... # other information
+ PREREQ_PM => {
+$prereqs
+ }
+);
+
+Thanks! :-)
+
+.
+ };
+
+use constant REPORT_MISSING_TESTS
+ => sub {
+ return << ".";
+RECOMMENDATIONS:
+
+It would be very helpful if you could include even a simple test
+script in the next release, so people can verify which platforms
+can successfully install them, as well as avoid regression bugs?
+
+A simple 't/use.t' that says:
+
+#!/usr/bin/env perl -w
+use strict;
+use Test;
+BEGIN { plan tests => 1 }
+
+use Your::Module::Here; ok(1);
+exit;
+__END__
+
+would be appreciated. If you are interested in making a more robust
+test suite, please see the Test::Simple, Test::More and Test::Tutorial
+documentation at <http://search.cpan.org/dist/Test-Simple/>.
+
+Thanks! :-)
+
+.
+ };
+
+use constant REPORT_LOADED_PREREQS
+ => sub {
+ my $mod = shift;
+ my $cb = $mod->parent;
+ my $prq = $mod->status->prereqs || {};
+
+ ### not every prereq may be coming from CPAN
+ ### so maybe we wont find it in our module
+ ### tree at all...
+ ### skip ones that cant be found in teh list
+ ### as reported in #12723
+ my @prq = grep { defined }
+ map { $cb->module_tree($_) }
+ sort keys %$prq;
+
+ ### no prereqs?
+ return '' unless @prq;
+
+ ### some apparently, list what we loaded
+ my $str = << ".";
+PREREQUISITES:
+
+Here is a list of prerequisites you specified and versions we
+managed to load:
+
+.
+ $str .= join '',
+ map { sprintf "\t%s %-30s %8s %8s\n",
+ @$_
+
+ } [' ', 'Module Name', 'Have', 'Want'],
+ map { my $want = $prq->{$_->name};
+ [ do { $_->is_uptodate(
+ version => $want
+ ) ? ' ' : '!'
+ },
+ $_->name,
+ $_->installed_version,
+ $want
+ ],
+ ### might be empty entries in there
+ } grep { $_ } @prq;
+
+ return $str;
+ };
+
+use constant REPORT_TOOLCHAIN_VERSIONS
+ => sub {
+ my $mod = shift;
+ my $cb = $mod->parent;
+ #die unless $cb->isa('CPANPLUS::Backend');
+
+ my @toolchain_modules= qw(
+ CPANPLUS
+ CPANPLUS::Dist::Build
+ Cwd
+ ExtUtils::CBuilder
+ ExtUtils::Command
+ ExtUtils::Install
+ ExtUtils::MakeMaker
+ ExtUtils::Manifest
+ ExtUtils::ParseXS
+ File::Spec
+ Module::Build
+ Test::Harness
+ Test::More
+ version
+ );
+
+ my @toolchain =
+ grep { $_ } #module_tree returns '' when module is not found
+ map { $cb->module_tree($_) }
+ sort @toolchain_modules;
+
+ ### no prereqs?
+ return '' unless @toolchain;
+
+ ### toolchain modules
+ my $str = << ".";
+
+Perl module toolchain versions installed:
+.
+ $str .= join '',
+ map { sprintf "\t%-30s %8s\n",
+ @$_
+
+ } ['Module Name', 'Have'],
+ map {
+ [ $_->name,
+ $_->installed_version,
+ ],
+ ### might be empty entries in there
+ } @toolchain;
+
+ return $str;
+ };
+
+
+use constant REPORT_TESTS_SKIPPED
+ => sub {
+ return << ".";
+
+******************************** NOTE ********************************
+*** ***
+*** The tests for this module were skipped during this build ***
+*** ***
+**********************************************************************
+
+.
+ };
+
+use constant REPORT_MESSAGE_FOOTER
+ => sub {
+ return << ".";
+
+******************************** NOTE ********************************
+The comments above are created mechanically, possibly without manual
+checking by the sender. As there are many people performing automatic
+tests on each upload to CPAN, it is likely that you will receive
+identical messages about the same problem.
+
+If you believe that the message is mistaken, please reply to the first
+one with correction and/or additional informations, and do not take
+it personally. We appreciate your patience. :)
+**********************************************************************
+
+Additional comments:
+
+.
+ };
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Extract.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Extract.pm
new file mode 100755
index 00000000000..84a48a50dea
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Extract.pm
@@ -0,0 +1,243 @@
+package CPANPLUS::Internals::Extract;
+
+use strict;
+
+use CPANPLUS::Error;
+use CPANPLUS::Internals::Constants;
+
+use File::Spec ();
+use File::Basename ();
+use Archive::Extract;
+use IPC::Cmd qw[run];
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load check_install];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+local $Params::Check::VERBOSE = 1;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Internals::Extract
+
+=head1 SYNOPSIS
+
+ ### for source files ###
+ $self->_gunzip( file => 'foo.gz', output => 'blah.txt' );
+
+ ### for modules/packages ###
+ $dir = $self->_extract( module => $modobj,
+ extractdir => '/some/where' );
+
+=head1 DESCRIPTION
+
+CPANPLUS::Internals::Extract extracts compressed files for CPANPLUS.
+It can do this by either a pure perl solution (preferred) with the
+use of C<Archive::Tar> and C<Compress::Zlib>, or with binaries, like
+C<gzip> and C<tar>.
+
+The flow looks like this:
+
+ $cb->_extract
+ Delegate to Archive::Extract
+
+=head1 METHODS
+
+=head2 $dir = _extract( module => $modobj, [perl => '/path/to/perl', extractdir => '/path/to/extract/to', prefer_bin => BOOL, verbose => BOOL, force => BOOL] )
+
+C<_extract> will take a module object and extract it to C<extractdir>
+if provided, or the default location which is obtained from your
+config.
+
+The file name is obtained by looking at C<< $modobj->status->fetch >>
+and will be parsed to see if it's a tar or zip archive.
+
+If it's a zip archive, C<__unzip> will be called, otherwise C<__untar>
+will be called. In the unlikely event the file is of neither format,
+an error will be thrown.
+
+C<_extract> takes the following options:
+
+=over 4
+
+=item module
+
+A C<CPANPLUS::Module> object. This is required.
+
+=item extractdir
+
+The directory to extract the archive to. By default this looks
+something like:
+ /CPANPLUS_BASE/PERL_VERSION/BUILD/MODULE_NAME
+
+=item prefer_bin
+
+A flag indicating whether you prefer a pure perl solution, ie
+C<Archive::Tar> or C<Archive::Zip> respectively, or a binary solution
+like C<unzip> and C<tar>.
+
+=item perl
+
+The path to the perl executable to use for any perl calls. Also used
+to determine the build version directory for extraction.
+
+=item verbose
+
+Specifies whether to be verbose or not. Defaults to your corresponding
+config entry.
+
+=item force
+
+Specifies whether to force the extraction or not. Defaults to your
+corresponding config entry.
+
+=back
+
+All other options are passed on verbatim to C<__unzip> or C<__untar>.
+
+Returns the directory the file was extracted to on success and false
+on failure.
+
+=cut
+
+sub _extract {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my( $mod, $verbose, $force );
+ my $tmpl = {
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ prefer_bin => { default => $conf->get_conf('prefer_bin') },
+ extractdir => { default => $conf->get_conf('extractdir') },
+ module => { required => 1, allow => IS_MODOBJ, store => \$mod },
+ perl => { default => $^X },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ ### did we already extract it ? ###
+ my $loc = $mod->status->extract();
+
+ if( $loc && !$force ) {
+ msg(loc("Already extracted '%1' to '%2'. ".
+ "Won't extract again without force",
+ $mod->module, $loc), $verbose);
+ return $loc;
+ }
+
+ ### did we already fetch the file? ###
+ my $file = $mod->status->fetch();
+ unless( -s $file ) {
+ error( loc( "File '%1' has zero size: cannot extract", $file ) );
+ return;
+ }
+
+ ### the dir to extract to ###
+ my $to = $args->{'extractdir'} ||
+ File::Spec->catdir(
+ $conf->get_conf('base'),
+ $self->_perl_version( perl => $args->{'perl'} ),
+ $conf->_get_build('moddir'),
+ );
+
+ ### delegate to Archive::Extract ###
+ ### set up some flags for archive::extract ###
+ local $Archive::Extract::PREFER_BIN = $args->{'prefer_bin'};
+ local $Archive::Extract::DEBUG = $conf->get_conf('debug');
+ local $Archive::Extract::WARN = $verbose;
+
+ my $ae = Archive::Extract->new( archive => $file );
+
+ unless( $ae->extract( to => $to ) ) {
+ error( loc( "Unable to extract '%1' to '%2': %3",
+ $file, $to, $ae->error ) );
+ return;
+ }
+
+ ### if ->files is not filled, we dont know what the hell was
+ ### extracted.. try to offer a suggestion and bail :(
+ unless ( $ae->files ) {
+ error( loc( "'%1' was not able to determine extracted ".
+ "files from the archive. Instal '%2' and ensure ".
+ "it works properly and try again",
+ $ae->is_zip ? 'Archive::Zip' : 'Archive::Tar' ) );
+ return;
+ }
+
+
+ ### print out what files we extracted ###
+ msg(loc("Extracted '%1'",$_),$verbose) for @{$ae->files};
+
+ ### set them all to be +w for the owner, so we don't get permission
+ ### denied for overwriting files that are just +r
+
+ ### this is to rigurous -- just change to +w for the owner [cpan #13358]
+ #chmod 0755, map { File::Spec->rel2abs( File::Spec->catdir($to, $_) ) }
+ # @{$ae->files};
+
+ for my $file ( @{$ae->files} ) {
+ my $path = File::Spec->rel2abs( File::Spec->catfile($to, $file) );
+
+ $self->_mode_plus_w( file => $path );
+ }
+
+ ### check the return value for the extracted path ###
+ ### Make an educated guess if we didn't get an extract_path
+ ### back
+ ### XXX apparently some people make their own dists and they
+ ### pack up '.' which means the leading directory is '.'
+ ### and only the second directory is the actual module directory
+ ### so, we'll have to check if our educated guess exists first,
+ ### then see if the extract path works.. and if nothing works...
+ ### well, then we really don't know.
+
+ my $dir;
+ for my $try (
+ File::Spec->rel2abs(
+ ### _safe_path must be called before catdir because catdir on
+ ### VMS currently will not handle the extra dots in the directories.
+ File::Spec->catdir( $self->_safe_path( path => $to ) ,
+ $self->_safe_path( path =>
+ $mod->package_name .'-'.
+ $mod->package_version
+ ) ) ) ,
+ File::Spec->rel2abs( $ae->extract_path ),
+ ) {
+ ($dir = $try) && last if -d $try;
+ }
+
+ ### test if the dir exists ###
+ unless( $dir && -d $dir ) {
+ error(loc("Unable to determine extract dir for '%1'",$mod->module));
+ return;
+
+ } else {
+ msg(loc("Extracted '%1' to '%2'", $mod->module, $dir), $verbose);
+
+ ### register where we extracted the files to,
+ ### also store what files were extracted
+ $mod->status->extract( $dir );
+ $mod->status->files( $ae->files );
+ }
+
+ ### also, figure out what kind of install we're dealing with ###
+ $mod->get_installer_type();
+
+ return $mod->status->extract();
+}
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Fetch.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Fetch.pm
new file mode 100755
index 00000000000..395965bab60
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Fetch.pm
@@ -0,0 +1,473 @@
+package CPANPLUS::Internals::Fetch;
+
+use strict;
+
+use CPANPLUS::Error;
+use CPANPLUS::Internals::Constants;
+
+use File::Fetch;
+use File::Spec;
+use Cwd qw[cwd];
+use IPC::Cmd qw[run];
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+$Params::Check::VERBOSE = 1;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Internals::Fetch
+
+=head1 SYNOPSIS
+
+ my $output = $cb->_fetch(
+ module => $modobj,
+ fetchdir => '/path/to/save/to',
+ verbose => BOOL,
+ force => BOOL,
+ );
+
+ $cb->_add_fail_host( host => 'foo.com' );
+ $cb->_host_ok( host => 'foo.com' );
+
+
+=head1 DESCRIPTION
+
+CPANPLUS::Internals::Fetch fetches files from either ftp, http, file
+or rsync mirrors.
+
+This is the rough flow:
+
+ $cb->_fetch
+ Delegate to File::Fetch;
+
+
+=head1 METHODS
+
+=cut
+
+=head1 $path = _fetch( module => $modobj, [fetchdir => '/path/to/save/to', fetch_from => 'scheme://path/to/fetch/from', verbose => BOOL, force => BOOL, prefer_bin => BOOL, ttl => $seconds] )
+
+C<_fetch> will fetch files based on the information in a module
+object. You always need a module object. If you want a fake module
+object for a one-off fetch, look at C<CPANPLUS::Module::Fake>.
+
+C<fetchdir> is the place to save the file to. Usually this
+information comes from your configuration, but you can override it
+expressly if needed.
+
+C<fetch_from> lets you specify an URI to get this file from. If you
+do not specify one, your list of configured hosts will be probed to
+download the file from.
+
+C<force> forces a new download, even if the file already exists.
+
+C<verbose> simply indicates whether or not to print extra messages.
+
+C<prefer_bin> indicates whether you prefer the use of commandline
+programs over perl modules. Defaults to your corresponding config
+setting.
+
+C<ttl> (in seconds) indicates how long a cached copy is valid for. If
+the fetch time of the local copy is within the ttl, the cached copy is
+returned. Otherwise, the file is refetched.
+
+C<_fetch> figures out, based on the host list, what scheme to use and
+from there, delegates to C<File::Fetch> do the actual fetching.
+
+Returns the path of the output file on success, false on failure.
+
+Note that you can set a C<blacklist> on certain methods in the config.
+Simply add the identifying name of the method (ie, C<lwp>) to:
+ $conf->_set_fetch( blacklist => ['lwp'] );
+
+And the C<LWP> function will be skipped by C<File::Fetch>.
+
+=cut
+
+sub _fetch {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ local $Params::Check::NO_DUPLICATES = 0;
+
+ my ($modobj, $verbose, $force, $fetch_from, $ttl);
+ my $tmpl = {
+ module => { required => 1, allow => IS_MODOBJ, store => \$modobj },
+ fetchdir => { default => $conf->get_conf('fetchdir') },
+ fetch_from => { default => '', store => \$fetch_from },
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ prefer_bin => { default => $conf->get_conf('prefer_bin') },
+ ttl => { default => 0, store => \$ttl },
+ };
+
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ ### check if we already downloaded the thing ###
+ if( (my $where = $modobj->status->fetch()) and not $force and not $ttl ) {
+
+ msg(loc("Already fetched '%1' to '%2', " .
+ "won't fetch again without force",
+ $modobj->module, $where ), $verbose );
+ return $where;
+ }
+
+ my ($remote_file, $local_file, $local_path);
+
+ ### build the local path to downlaod to ###
+ {
+ $local_path = $args->{fetchdir} ||
+ File::Spec->catdir(
+ $conf->get_conf('base'),
+ $modobj->path,
+ );
+
+ ### create the path if it doesn't exist ###
+ unless( -d $local_path ) {
+ unless( $self->_mkdir( dir => $local_path ) ) {
+ msg( loc("Could not create path '%1'", $local_path), $verbose);
+ return;
+ }
+ }
+
+ $local_file = File::Spec->rel2abs(
+ File::Spec->catfile(
+ $local_path,
+ $modobj->package,
+ )
+ );
+
+ ### do we already have the file? if so, can we use the cached version,
+ ### or do we need to refetch?
+ if( -e $local_file ) {
+
+ my $unlink = 0;
+ my $use_cached = 0;
+
+ ### if force is in effect, we have to refetch
+ if( $force ) {
+ $unlink++
+
+ ### if you provided a ttl, and it was exceeded, we'll refetch,
+ } elsif( $ttl and ([stat $local_file]->[9] + $ttl > time) ) {
+ msg(loc("Using cached file '%1' on disk; ".
+ "ttl (%2s) is not exceeded",
+ $local_file, $ttl), $verbose );
+
+ $use_cached++;
+
+ ### if you provided a ttl, and the above conditional didn't match,
+ ### we exceeded the ttl, so we refetch
+ } elsif ( $ttl ) {
+ $unlink++;
+
+ ### otherwise we can use the cached version
+ } else {
+ $use_cached++;
+ }
+
+ if( $unlink ) {
+ ### some fetches will fail if the files exist already, so let's
+ ### delete them first
+ 1 while unlink $local_file;
+
+ msg(loc("Could not delete %1, some methods may " .
+ "fail to force a download", $local_file), $verbose)
+ if -e $local_file;
+
+ } else {
+
+ ### store where we fetched it ###
+ $modobj->status->fetch( $local_file );
+
+ return $local_file;
+ }
+ }
+ }
+
+
+ ### we got a custom URI
+ if ( $fetch_from ) {
+ my $abs = $self->__file_fetch( from => $fetch_from,
+ to => $local_path,
+ verbose => $verbose );
+
+ unless( $abs ) {
+ error(loc("Unable to download '%1'", $fetch_from));
+ return;
+ }
+
+ ### store where we fetched it ###
+ $modobj->status->fetch( $abs );
+
+ return $abs;
+
+ ### we will get it from one of our mirrors
+ } else {
+ ### build the remote path to download from ###
+ { $remote_file = File::Spec::Unix->catfile(
+ $modobj->path,
+ $modobj->package,
+ );
+ unless( $remote_file ) {
+ error( loc('No remote file given for download') );
+ return;
+ }
+ }
+
+ ### see if we even have a host or a method to use to download with ###
+ my $found_host;
+ my @maybe_bad_host;
+
+ HOST: {
+ ### F*CKING PIECE OF F*CKING p4 SHIT makes
+ ### '$File :: Fetch::SOME_VAR'
+ ### into a meta variable and starts substituting the file name...
+ ### GRAAAAAAAAAAAAAAAAAAAAAAH!
+ ### use ' to combat it!
+
+ ### set up some flags for File::Fetch ###
+ local $File'Fetch::BLACKLIST = $conf->_get_fetch('blacklist');
+ local $File'Fetch::TIMEOUT = $conf->get_conf('timeout');
+ local $File'Fetch::DEBUG = $conf->get_conf('debug');
+ local $File'Fetch::FTP_PASSIVE = $conf->get_conf('passive');
+ local $File'Fetch::FROM_EMAIL = $conf->get_conf('email');
+ local $File'Fetch::PREFER_BIN = $conf->get_conf('prefer_bin');
+ local $File'Fetch::WARN = $verbose;
+
+
+ ### loop over all hosts we have ###
+ for my $host ( @{$conf->get_conf('hosts')} ) {
+ $found_host++;
+
+ my $where;
+
+ ### file:// uris are special and need parsing
+ if( $host->{'scheme'} eq 'file' ) {
+
+ ### the full path in the native format of the OS
+ my $host_spec =
+ File::Spec->file_name_is_absolute( $host->{'path'} )
+ ? $host->{'path'}
+ : File::Spec->rel2abs( $host->{'path'} );
+
+ ### there might be volumes involved on vms/win32
+ if( ON_WIN32 or ON_VMS ) {
+
+ ### now extract the volume in order to be Win32 and
+ ### VMS friendly.
+ ### 'no_file' indicates that there's no file part
+ ### of this path, so we only get 2 bits returned.
+ my ($vol, $host_path) = File::Spec->splitpath(
+ $host_spec, 'no_file'
+ );
+
+ ### and split up the directories
+ my @host_dirs = File::Spec->splitdir( $host_path );
+
+ ### if we got a volume we pretend its a directory for
+ ### the sake of the file:// url
+ if( defined $vol and $vol ) {
+
+ ### D:\foo\bar needs to be encoded as D|\foo\bar
+ ### For details, see the following link:
+ ### http://en.wikipedia.org/wiki/File://
+ ### The RFC doesnt seem to address Windows volume
+ ### descriptors but it does address VMS volume
+ ### descriptors, however wikipedia covers a bit of
+ ### history regarding win32
+ $vol =~ s/:$/|/ if ON_WIN32;
+
+ $vol =~ s/:// if ON_VMS;
+
+ ### XXX i'm not sure what cases this is addressing.
+ ### this comes straight from dmq's file:// patches
+ ### for win32. --kane
+ ### According to dmq, the best summary is:
+ ### "if file:// urls dont look right on VMS reuse
+ ### the win32 logic and see if that fixes things"
+
+ ### first element not empty? Might happen on VMS.
+ ### prepend the volume in that case.
+ if( $host_dirs[0] ) {
+ unshift @host_dirs, $vol;
+
+ ### element empty? reuse it to store the volume
+ ### encoded as a directory name. (Win32/VMS)
+ } else {
+ $host_dirs[0] = $vol;
+ }
+ }
+
+ ### now it's in UNIX format, which is the same format
+ ### as used for URIs
+ $host_spec = File::Spec::Unix->catdir( @host_dirs );
+ }
+
+ ### now create the file:// uri from the components
+ $where = CREATE_FILE_URI->(
+ File::Spec::Unix->catfile(
+ $host->{'host'} || '',
+ $host_spec,
+ $remote_file,
+ )
+ );
+
+ ### its components will be in unix format, for a http://,
+ ### ftp:// or any other style of URI
+ } else {
+ my $mirror_path = File::Spec::Unix->catfile(
+ $host->{'path'}, $remote_file
+ );
+
+ my %args = ( scheme => $host->{scheme},
+ host => $host->{host},
+ path => $mirror_path,
+ );
+
+ $where = $self->_host_to_uri( %args );
+ }
+
+ my $abs = $self->__file_fetch( from => $where,
+ to => $local_path,
+ verbose => $verbose );
+
+ ### we got a path back?
+ if( $abs ) {
+ ### store where we fetched it ###
+ $modobj->status->fetch( $abs );
+
+ ### this host is good, the previous ones are apparently
+ ### not, so mark them as such.
+ $self->_add_fail_host( host => $_ ) for @maybe_bad_host;
+
+ return $abs;
+ }
+
+ ### so we tried to get the file but didn't actually fetch it --
+ ### there's a chance this host is bad. mark it as such and
+ ### actually flag it back if we manage to get the file
+ ### somewhere else
+ push @maybe_bad_host, $host;
+ }
+ }
+
+ $found_host
+ ? error(loc("Fetch failed: host list exhausted " .
+ "-- are you connected today?"))
+ : error(loc("No hosts found to download from " .
+ "-- check your config"));
+ }
+
+ return;
+}
+
+sub __file_fetch {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my ($where, $local_path, $verbose);
+ my $tmpl = {
+ from => { required => 1, store => \$where },
+ to => { required => 1, store => \$local_path },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ msg(loc("Trying to get '%1'", $where ), $verbose );
+
+ ### build the object ###
+ my $ff = File::Fetch->new( uri => $where );
+
+ ### sanity check ###
+ error(loc("Bad uri '%1'",$where)), return unless $ff;
+
+ if( my $file = $ff->fetch( to => $local_path ) ) {
+ unless( -e $file && -s _ ) {
+ msg(loc("'%1' said it fetched '%2', but it was not created",
+ 'File::Fetch', $file), $verbose);
+
+ } else {
+ my $abs = File::Spec->rel2abs( $file );
+
+ ### so TTLs will work
+ $self->_update_timestamp( file => $abs );
+
+ return $abs;
+ }
+
+ } else {
+ error(loc("Fetching of '%1' failed: %2", $where, $ff->error));
+ }
+
+ return;
+}
+
+=pod
+
+=head2 _add_fail_host( host => $host_hashref )
+
+Mark a particular host as bad. This makes C<CPANPLUS::Internals::Fetch>
+skip it in fetches until this cache is flushed.
+
+=head2 _host_ok( host => $host_hashref )
+
+Query the cache to see if this host is ok, or if it has been flagged
+as bad.
+
+Returns true if the host is ok, false otherwise.
+
+=cut
+
+{ ### caching functions ###
+
+ sub _add_fail_host {
+ my $self = shift;
+ my %hash = @_;
+
+ my $host;
+ my $tmpl = {
+ host => { required => 1, default => {},
+ strict_type => 1, store => \$host },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ return $self->_hosts->{$host} = 1;
+ }
+
+ sub _host_ok {
+ my $self = shift;
+ my %hash = @_;
+
+ my $host;
+ my $tmpl = {
+ host => { required => 1, store => \$host },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ return $self->_hosts->{$host} ? 0 : 1;
+ }
+}
+
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Report.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Report.pm
new file mode 100755
index 00000000000..774c6b91a02
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Report.pm
@@ -0,0 +1,645 @@
+package CPANPLUS::Internals::Report;
+
+use strict;
+
+use CPANPLUS::Error;
+use CPANPLUS::Internals::Constants;
+use CPANPLUS::Internals::Constants::Report;
+
+use Data::Dumper;
+
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+$Params::Check::VERBOSE = 1;
+
+### for the version ###
+require CPANPLUS::Internals;
+
+=head1 NAME
+
+CPANPLUS::Internals::Report
+
+=head1 SYNOPSIS
+
+ ### enable test reporting
+ $cb->configure_object->set_conf( cpantest => 1 );
+
+ ### set custom mx host, shouldn't normally be needed
+ $cb->configure_object->set_conf( cpantest_mx => 'smtp.example.com' );
+
+=head1 DESCRIPTION
+
+This module provides all the functionality to send test reports to
+C<http://testers.cpan.org> using the C<Test::Reporter> module.
+
+All methods will be called automatically if you have C<CPANPLUS>
+configured to enable test reporting (see the C<SYNOPSIS>).
+
+=head1 METHODS
+
+=head2 $bool = $cb->_have_query_report_modules
+
+This function checks if all the required modules are here for querying
+reports. It returns true and loads them if they are, or returns false
+otherwise.
+
+=head2 $bool = $cb->_have_send_report_modules
+
+This function checks if all the required modules are here for sending
+reports. It returns true and loads them if they are, or returns false
+otherwise.
+
+=cut
+
+### XXX remove this list and move it into selfupdate, somehow..
+### this is dual administration
+{ my $query_list = {
+ 'File::Fetch' => '0.13_02',
+ 'Parse::CPAN::Meta' => '0.0',
+ 'File::Temp' => '0.0',
+ };
+
+ my $send_list = {
+ %$query_list,
+ 'Test::Reporter' => '1.34',
+ };
+
+ sub _have_query_report_modules {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose') },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ return can_load( modules => $query_list, verbose => $args->{verbose} )
+ ? 1
+ : 0;
+ }
+
+ sub _have_send_report_modules {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose') },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ return can_load( modules => $send_list, verbose => $args->{verbose} )
+ ? 1
+ : 0;
+ }
+}
+
+=head2 @list = $cb->_query_report( module => $modobj, [all_versions => BOOL, verbose => BOOL] )
+
+This function queries the CPAN testers database at
+I<http://testers.cpan.org/> for test results of specified module objects,
+module names or distributions.
+
+The optional argument C<all_versions> controls whether all versions of
+a given distribution should be grabbed. It defaults to false
+(fetching only reports for the current version).
+
+Returns the a list with the following data structures (for CPANPLUS
+version 0.042) on success, or false on failure. The contents of the
+data structure depends on what I<http://testers.cpan.org> returns,
+but generally looks like this:
+
+ {
+ 'grade' => 'PASS',
+ 'dist' => 'CPANPLUS-0.042',
+ 'platform' => 'i686-pld-linux-thread-multi'
+ 'details' => 'http://nntp.x.perl.org/group/perl.cpan.testers/98316'
+ ...
+ },
+ {
+ 'grade' => 'PASS',
+ 'dist' => 'CPANPLUS-0.042',
+ 'platform' => 'i686-linux-thread-multi'
+ 'details' => 'http://nntp.x.perl.org/group/perl.cpan.testers/99416'
+ ...
+ },
+ {
+ 'grade' => 'FAIL',
+ 'dist' => 'CPANPLUS-0.042',
+ 'platform' => 'cygwin-multi-64int',
+ 'details' => 'http://nntp.x.perl.org/group/perl.cpan.testers/99371'
+ ...
+ },
+ {
+ 'grade' => 'FAIL',
+ 'dist' => 'CPANPLUS-0.042',
+ 'platform' => 'i586-linux',
+ 'details' => 'http://nntp.x.perl.org/group/perl.cpan.testers/99396'
+ ...
+ },
+
+The status of the test can be one of the following:
+UNKNOWN, PASS, FAIL or NA (not applicable).
+
+=cut
+
+sub _query_report {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($mod, $verbose, $all);
+ my $tmpl = {
+ module => { required => 1, allow => IS_MODOBJ,
+ store => \$mod },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ all_versions => { default => 0, store => \$all },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### check if we have the modules we need for querying
+ return unless $self->_have_query_report_modules( verbose => 1 );
+
+
+ ### XXX no longer use LWP here. However, that means we don't
+ ### automagically set proxies anymore!!!
+ # my $ua = LWP::UserAgent->new;
+ # $ua->agent( CPANPLUS_UA->() );
+ #
+ ### set proxies if we have them ###
+ # $ua->env_proxy();
+
+ my $url = TESTERS_URL->($mod->package_name);
+ my $ff = File::Fetch->new( uri => $url );
+
+ msg( loc("Fetching: '%1'", $url), $verbose );
+
+ my $res = do {
+ my $tempdir = File::Temp::tempdir();
+ my $where = $ff->fetch( to => $tempdir );
+
+ unless( $where ) {
+ error( loc( "Fetching report for '%1' failed: %2",
+ $url, $ff->error ) );
+ return;
+ }
+
+ my $fh = OPEN_FILE->( $where );
+
+ do { local $/; <$fh> };
+ };
+
+ my ($aref) = eval { Parse::CPAN::Meta::Load( $res ) };
+
+ if( $@ ) {
+ error(loc("Error reading result: %1", $@));
+ return;
+ };
+
+ my $dist = $mod->package_name .'-'. $mod->package_version;
+ my $details = TESTERS_DETAILS_URL->($mod->package_name);
+
+ my @rv;
+ for my $href ( @$aref ) {
+ next unless $all or defined $href->{'distversion'} &&
+ $href->{'distversion'} eq $dist;
+
+ $href->{'details'} = $details;
+
+ ### backwards compatibility :(
+ $href->{'dist'} ||= $href->{'distversion'};
+ $href->{'grade'} ||= $href->{'action'} || $href->{'status'};
+
+ push @rv, $href;
+ }
+
+ return @rv if @rv;
+ return;
+}
+
+=pod
+
+=head2 $bool = $cb->_send_report( module => $modobj, buffer => $make_output, failed => BOOL, [save => BOOL, address => $email_to, verbose => BOOL, force => BOOL]);
+
+This function sends a testers report to C<cpan-testers@perl.org> for a
+particular distribution.
+It returns true on success, and false on failure.
+
+It takes the following options:
+
+=over 4
+
+=item module
+
+The module object of this particular distribution
+
+=item buffer
+
+The output buffer from the 'make/make test' process
+
+=item failed
+
+Boolean indicating if the 'make/make test' went wrong
+
+=item save
+
+Boolean indicating if the report should be saved locally instead of
+mailed out. If provided, this function will return the location the
+report was saved to, rather than a simple boolean 'TRUE'.
+
+Defaults to false.
+
+=item address
+
+The email address to mail the report for. You should never need to
+override this, but it might be useful for debugging purposes.
+
+Defaults to C<cpan-testers@perl.org>.
+
+=item verbose
+
+Boolean indicating on whether or not to be verbose.
+
+Defaults to your configuration settings
+
+=item force
+
+Boolean indicating whether to force the sending, even if the max
+amount of reports for fails have already been reached, or if you
+may already have sent it before.
+
+Defaults to your configuration settings
+
+=back
+
+=cut
+
+sub _send_report {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ ### do you even /have/ test::reporter? ###
+ unless( $self->_have_send_report_modules(verbose => 1) ) {
+ error( loc( "You don't have '%1' (or modules required by '%2') ".
+ "installed, you cannot report test results.",
+ 'Test::Reporter', 'Test::Reporter' ) );
+ return;
+ }
+
+ ### check arguments ###
+ my ($buffer, $failed, $mod, $verbose, $force, $address, $save,
+ $tests_skipped );
+ my $tmpl = {
+ module => { required => 1, store => \$mod, allow => IS_MODOBJ },
+ buffer => { required => 1, store => \$buffer },
+ failed => { required => 1, store => \$failed },
+ address => { default => CPAN_TESTERS_EMAIL, store => \$address },
+ save => { default => 0, store => \$save },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ force => { default => $conf->get_conf('force'),
+ store => \$force },
+ tests_skipped
+ => { default => 0, store => \$tests_skipped },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### get the data to fill the email with ###
+ my $name = $mod->module;
+ my $dist = $mod->package_name . '-' . $mod->package_version;
+ my $author = $mod->author->author;
+ my $email = $mod->author->email || CPAN_MAIL_ACCOUNT->( $author );
+ my $cp_conf = $conf->get_conf('cpantest') || '';
+ my $int_ver = $CPANPLUS::Internals::VERSION;
+ my $cb = $mod->parent;
+
+
+ ### will be 'fetch', 'make', 'test', 'install', etc ###
+ my $stage = TEST_FAIL_STAGE->($buffer);
+
+ ### determine the grade now ###
+
+ my $grade;
+ ### check if this is a platform specific module ###
+ ### if we failed the test, there may be reasons why
+ ### an 'NA' might have to be insted
+ GRADE: { if ( $failed ) {
+
+
+ ### XXX duplicated logic between this block
+ ### and REPORTED_LOADED_PREREQS :(
+
+ ### figure out if the prereqs are on CPAN at all
+ ### -- if not, send NA grade
+ ### Also, if our version of prereqs is too low,
+ ### -- send NA grade.
+ ### This is to address bug: #25327: do not count
+ ### as FAIL modules where prereqs are not filled
+ { my $prq = $mod->status->prereqs || {};
+
+ while( my($prq_name,$prq_ver) = each %$prq ) {
+ my $obj = $cb->module_tree( $prq_name );
+ my $sub = CPANPLUS::Module->can(
+ 'module_is_supplied_with_perl_core' );
+
+ ### if we can't find the module and it's not supplied with core.
+ ### this addresses: #32064: NA reports generated for failing
+ ### tests where core prereqs are specified
+ ### Note that due to a bug in Module::CoreList, in some released
+ ### version of perl (5.8.6+ and 5.9.2-4 at the time of writing)
+ ### 'Config' is not recognized as a core module. See this bug:
+ ### http://rt.cpan.org/Ticket/Display.html?id=32155
+ if( !$obj and !$sub->( $prq_name ) ) {
+ msg(loc( "Prerequisite '%1' for '%2' could not be obtained".
+ " from CPAN -- sending N/A grade",
+ $prq_name, $name ), $verbose );
+
+ $grade = GRADE_NA;
+ last GRADE;
+ }
+
+ if ( !$obj ) {
+ my $vcore = $sub->( $prq_name );
+ if ( $cb->_vcmp( $prq_ver, $vcore ) > 0 ) {
+ msg(loc( "Version of core module '%1' ('%2') is too low for ".
+ "'%3' (needs '%4') -- sending N/A grade",
+ $prq_name, $vcore,
+ $name, $prq_ver ), $verbose );
+
+ $grade = GRADE_NA;
+ last GRADE;
+ }
+ }
+
+ if( $obj and $cb->_vcmp( $prq_ver, $obj->installed_version ) > 0 ) {
+ msg(loc( "Installed version of '%1' ('%2') is too low for ".
+ "'%3' (needs '%4') -- sending N/A grade",
+ $prq_name, $obj->installed_version,
+ $name, $prq_ver ), $verbose );
+
+ $grade = GRADE_NA;
+ last GRADE;
+ }
+ }
+ }
+
+ unless( RELEVANT_TEST_RESULT->($mod) ) {
+ msg(loc(
+ "'%1' is a platform specific module, and the test results on".
+ " your platform are not relevant --sending N/A grade.",
+ $name), $verbose);
+
+ $grade = GRADE_NA;
+
+ } elsif ( UNSUPPORTED_OS->( $buffer ) ) {
+ msg(loc(
+ "'%1' is a platform specific module, and the test results on".
+ " your platform are not relevant --sending N/A grade.",
+ $name), $verbose);
+
+ $grade = GRADE_NA;
+
+ ### you dont have a high enough perl version?
+ } elsif ( PERL_VERSION_TOO_LOW->( $buffer ) ) {
+ msg(loc("'%1' requires a higher version of perl than your current ".
+ "version -- sending N/A grade.", $name), $verbose);
+
+ $grade = GRADE_NA;
+
+ ### perhaps where were no tests...
+ ### see if the thing even had tests ###
+ } elsif ( NO_TESTS_DEFINED->( $buffer ) ) {
+ $grade = GRADE_UNKNOWN;
+ ### failures in PL or make/build stage are now considered UNKNOWN
+ } elsif ( $stage !~ /\btest\b/ ) {
+
+ $grade = GRADE_UNKNOWN
+
+ } else {
+
+ $grade = GRADE_FAIL;
+ }
+
+ ### if we got here, it didn't fail and tests were present.. so a PASS
+ ### is in order
+ } else {
+ $grade = GRADE_PASS;
+ } }
+
+ ### so an error occurred, let's see what stage it went wrong in ###
+
+ ### the header -- always include so the CPANPLUS version is apparent
+ my $message = REPORT_MESSAGE_HEADER->( $int_ver, $author );
+
+ if( $grade eq GRADE_FAIL or $grade eq GRADE_UNKNOWN) {
+
+ ### return if one or more missing external libraries
+ if( my @missing = MISSING_EXTLIBS_LIST->($buffer) ) {
+ msg(loc("Not sending test report - " .
+ "external libraries not pre-installed"));
+ return 1;
+ }
+
+ ### return if we're only supposed to report make_test failures ###
+ return 1 if $cp_conf =~ /\bmaketest_only\b/i
+ and ($stage !~ /\btest\b/);
+
+ ### the bit where we inform what went wrong
+ $message .= REPORT_MESSAGE_FAIL_HEADER->( $stage, $buffer );
+
+ ### was it missing prereqs? ###
+ if( my @missing = MISSING_PREREQS_LIST->($buffer) ) {
+ if(!$self->_verify_missing_prereqs(
+ module => $mod,
+ missing => \@missing
+ )) {
+ msg(loc("Not sending test report - " .
+ "bogus missing prerequisites report"));
+ return 1;
+ }
+ $message .= REPORT_MISSING_PREREQS->($author,$email,@missing);
+ }
+
+ ### was it missing test files? ###
+ if( NO_TESTS_DEFINED->($buffer) ) {
+ $message .= REPORT_MISSING_TESTS->();
+ }
+
+ ### add a list of what modules have been loaded of your prereqs list
+ $message .= REPORT_LOADED_PREREQS->($mod);
+
+ ### add a list of versions of toolchain modules
+ $message .= REPORT_TOOLCHAIN_VERSIONS->($mod);
+
+ ### the footer
+ $message .= REPORT_MESSAGE_FOOTER->();
+
+ ### it may be another grade than fail/unknown.. may be worth noting
+ ### that tests got skipped, since the buffer is not added in
+ } elsif ( $tests_skipped ) {
+ $message .= REPORT_TESTS_SKIPPED->();
+ } elsif( $grade eq GRADE_NA) {
+
+ ### the bit where we inform what went wrong
+ $message .= REPORT_MESSAGE_FAIL_HEADER->( $stage, $buffer );
+
+ ### the footer
+ $message .= REPORT_MESSAGE_FOOTER->();
+
+ }
+
+ msg( loc("Sending test report for '%1'", $dist), $verbose);
+
+ ### reporter object ###
+ my $reporter = do {
+ my $args = $conf->get_conf('cpantest_reporter_args') || {};
+
+ unless( UNIVERSAL::isa( $args, 'HASH' ) ) {
+ error(loc("'%1' must be a hashref, ignoring...",
+ 'cpantest_reporter_args'));
+ $args = {};
+ }
+
+ Test::Reporter->new(
+ grade => $grade,
+ distribution => $dist,
+ via => "CPANPLUS $int_ver",
+ timeout => $conf->get_conf('timeout') || 60,
+ debug => $conf->get_conf('debug'),
+ %$args,
+ );
+ };
+
+ ### set a custom mx, if requested
+ $reporter->mx( [ $conf->get_conf('cpantest_mx') ] )
+ if $conf->get_conf('cpantest_mx');
+
+ ### set the from address ###
+ $reporter->from( $conf->get_conf('email') )
+ if $conf->get_conf('email') !~ /\@example\.\w+$/i;
+
+ ### give the user a chance to programattically alter the message
+ $message = $self->_callbacks->munge_test_report->($mod, $message, $grade);
+
+ ### add the body if we have any ###
+ $reporter->comments( $message ) if defined $message && length $message;
+
+ ### do a callback to ask if we should send the report
+ unless ($self->_callbacks->send_test_report->($mod, $grade)) {
+ msg(loc("Ok, not sending test report"));
+ return 1;
+ }
+
+ ### do a callback to ask if we should edit the report
+ if ($self->_callbacks->edit_test_report->($mod, $grade)) {
+ ### test::reporter 1.20 and lower don't have a way to set
+ ### the preferred editor with a method call, but it does
+ ### respect your env variable, so let's set that.
+ local $ENV{VISUAL} = $conf->get_program('editor')
+ if $conf->get_program('editor');
+
+ $reporter->edit_comments;
+ }
+
+ ### allow to be overridden, but default to the normal address ###
+ $reporter->address( $address );
+
+ ### should we save it locally? ###
+ if( $save ) {
+ if( my $file = $reporter->write() ) {
+ msg(loc("Successfully wrote report for '%1' to '%2'",
+ $dist, $file), $verbose);
+ return $file;
+
+ } else {
+ error(loc("Failed to write report for '%1'", $dist));
+ return;
+ }
+
+ ### XXX should we do an 'already sent' check? ###
+ ### something broke :( ###
+ }
+ else {
+ my $status;
+ eval {
+ $status = $reporter->send();
+ };
+ if ( $@ ) {
+ error(loc("Could not send '%1' report for '%2': %3",
+ $grade, $dist, $@));
+ return;
+ }
+ if ( $status ) {
+ msg(loc("Successfully sent '%1' report for '%2'", $grade, $dist),
+ $verbose);
+ return 1;
+ }
+ error(loc("Could not send '%1' report for '%2': %3",
+ $grade, $dist, $reporter->errstr));
+ return;
+ }
+}
+
+sub _verify_missing_prereqs {
+ my $self = shift;
+ my %hash = @_;
+
+ ### check arguments ###
+ my ($mod, $missing);
+ my $tmpl = {
+ module => { required => 1, store => \$mod },
+ missing => { required => 1, store => \$missing },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+
+ my %missing = map {$_ => 1} @$missing;
+ my $conf = $self->configure_object;
+ my $extract = $mod->status->extract;
+
+ ### Read pre-requisites from Makefile.PL or Build.PL (if there is one),
+ ### of the form:
+ ### 'PREREQ_PM' => {
+ ### 'Compress::Zlib' => '1.20',
+ ### 'Test::More' => 0,
+ ### },
+ ### Build.PL uses 'requires' instead of 'PREREQ_PM'.
+
+ my @search;
+ push @search, ($extract ? MAKEFILE_PL->( $extract ) : MAKEFILE_PL->());
+ push @search, ($extract ? BUILD_PL->( $extract ) : BUILD_PL->());
+
+ for my $file ( @search ) {
+ if(-e $file and -r $file) {
+ my $slurp = $self->_get_file_contents(file => $file);
+ my ($prereq) =
+ ($slurp =~ /'?(?:PREREQ_PM|requires)'?\s*=>\s*{(.*?)}/s);
+ my @prereq =
+ ($prereq =~ /'?([\w\:]+)'?\s*=>\s*'?\d[\d\.\-\_]*'?/sg);
+ delete $missing{$_} for(@prereq);
+ }
+ }
+
+ return 1 if(keys %missing); # There ARE missing prerequisites
+ return; # All prerequisites accounted for
+}
+
+1;
+
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Search.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Search.pm
new file mode 100755
index 00000000000..63c4da64d92
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Search.pm
@@ -0,0 +1,363 @@
+package CPANPLUS::Internals::Search;
+
+use strict;
+
+use CPANPLUS::Error;
+use CPANPLUS::Internals::Constants;
+use CPANPLUS::Module;
+use CPANPLUS::Module::Author;
+
+use File::Find;
+use File::Spec;
+
+use Params::Check qw[check allow];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+$Params::Check::VERBOSE = 1;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Internals::Search
+
+=head1 SYNOPSIS
+
+ my $aref = $cpan->_search_module_tree(
+ type => 'package',
+ allow => [qr/DBI/],
+ );
+
+ my $aref = $cpan->_search_author_tree(
+ type => 'cpanid',
+ data => \@old_results,
+ verbose => 1,
+ allow => [qw|KANE AUTRIJUS|],
+ );
+
+ my $aref = $cpan->_all_installed( );
+
+=head1 DESCRIPTION
+
+The functions in this module are designed to find module(objects)
+based on certain criteria and return them.
+
+=head1 METHODS
+
+=head2 _search_module_tree( type => TYPE, allow => \@regexes, [data => \@previous_results ] )
+
+Searches the moduletree for module objects matching the criteria you
+specify. Returns an array ref of module objects on success, and false
+on failure.
+
+It takes the following arguments:
+
+=over 4
+
+=item type
+
+This can be any of the accessors for the C<CPANPLUS::Module> objects.
+This is a required argument.
+
+=item allow
+
+A set of rules, or more precisely, a list of regexes (via C<qr//> or
+plain strings), that the C<type> must adhere too. You can specify as
+many as you like, and it will be treated as an C<OR> search.
+For an C<AND> search, see the C<data> argument.
+
+This is a required argument.
+
+=item data
+
+An arrayref of previous search results. This is the way to do an C<AND>
+search -- C<_search_module_tree> will only search the module objects
+specified in C<data> if provided, rather than the moduletree itself.
+
+=back
+
+=cut
+
+# Although the Params::Check solution is more graceful, it is WAY too slow.
+#
+# This sample script:
+#
+# use CPANPLUS::Backend;
+# my $cb = new CPANPLUS::Backend;
+# $cb->module_tree;
+# my @list = $cb->search( type => 'module', allow => [qr/^Acme/] );
+# print $_->module, $/ for @list;
+#
+# Produced the following output using Dprof WITH params::check code
+#
+# Total Elapsed Time = 3.670024 Seconds
+# User+System Time = 3.390373 Seconds
+# Exclusive Times
+# %Time ExclSec CumulS #Calls sec/call Csec/c Name
+# 88.7 3.008 4.463 20610 0.0001 0.0002 Params::Check::check
+# 47.4 1.610 1.610 1 1.6100 1.6100 Storable::net_pstore
+# 25.6 0.869 0.737 20491 0.0000 0.0000 Locale::Maketext::Simple::_default
+# _gettext
+# 23.2 0.789 0.524 40976 0.0000 0.0000 Params::Check::_who_was_it
+# 23.2 0.789 0.677 20610 0.0000 0.0000 Params::Check::_sanity_check
+# 19.7 0.670 0.670 1 0.6700 0.6700 Storable::pretrieve
+# 14.1 0.480 0.211 41350 0.0000 0.0000 Params::Check::_convert_case
+# 11.5 0.390 0.256 20610 0.0000 0.0000 Params::Check::_hashdefs
+# 11.5 0.390 0.255 20697 0.0000 0.0000 Params::Check::_listreqs
+# 11.4 0.389 0.177 20653 0.0000 0.0000 Params::Check::_canon_key
+# 10.9 0.370 0.356 20697 0.0000 0.0000 Params::Check::_hasreq
+# 8.02 0.272 4.750 1 0.2723 4.7501 CPANPLUS::Internals::Search::_sear
+# ch_module_tree
+# 6.49 0.220 0.086 20653 0.0000 0.0000 Params::Check::_iskey
+# 6.19 0.210 0.077 20488 0.0000 0.0000 Params::Check::_store_error
+# 5.01 0.170 0.036 20680 0.0000 0.0000 CPANPLUS::Module::__ANON__
+#
+# and this output /without/
+#
+# Total Elapsed Time = 2.803426 Seconds
+# User+System Time = 2.493426 Seconds
+# Exclusive Times
+# %Time ExclSec CumulS #Calls sec/call Csec/c Name
+# 56.9 1.420 1.420 1 1.4200 1.4200 Storable::net_pstore
+# 25.6 0.640 0.640 1 0.6400 0.6400 Storable::pretrieve
+# 9.22 0.230 0.096 20680 0.0000 0.0000 CPANPLUS::Module::__ANON__
+# 7.06 0.176 0.272 1 0.1762 0.2719 CPANPLUS::Internals::Search::_sear
+# ch_module_tree
+# 3.21 0.080 0.098 10 0.0080 0.0098 IPC::Cmd::BEGIN
+# 1.60 0.040 0.205 13 0.0031 0.0158 CPANPLUS::Internals::BEGIN
+# 1.20 0.030 0.030 29 0.0010 0.0010 vars::BEGIN
+# 1.20 0.030 0.117 10 0.0030 0.0117 Log::Message::BEGIN
+# 1.20 0.030 0.029 9 0.0033 0.0033 CPANPLUS::Internals::Search::BEGIN
+# 0.80 0.020 0.020 5 0.0040 0.0040 DynaLoader::dl_load_file
+# 0.80 0.020 0.127 10 0.0020 0.0127 CPANPLUS::Module::BEGIN
+# 0.80 0.020 0.389 2 0.0099 0.1944 main::BEGIN
+# 0.80 0.020 0.359 12 0.0017 0.0299 CPANPLUS::Backend::BEGIN
+# 0.40 0.010 0.010 30 0.0003 0.0003 Config::FETCH
+# 0.40 0.010 0.010 18 0.0006 0.0005 Locale::Maketext::Simple::load_loc
+#
+
+sub _search_module_tree {
+
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($mods,$list,$verbose,$type);
+ my $tmpl = {
+ data => { default => [],
+ strict_type=> 1, store => \$mods },
+ allow => { required => 1, default => [ ], strict_type => 1,
+ store => \$list },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ type => { required => 1, allow => [CPANPLUS::Module->accessors()],
+ store => \$type },
+ };
+
+ my $args = do {
+ ### don't check the template for sanity
+ ### -- we know it's good and saves a lot of performance
+ local $Params::Check::SANITY_CHECK_TEMPLATE = 0;
+
+ check( $tmpl, \%hash );
+ } or return;
+
+ ### a list of module objects was supplied
+ if( @$mods ) {
+ local $Params::Check::VERBOSE = 0;
+
+ my @rv;
+ for my $mod (@$mods) {
+ #push @rv, $mod if check(
+ # { $type => { allow => $list } },
+ # { $type => $mod->$type() }
+ # );
+ push @rv, $mod if allow( $mod->$type() => $list );
+
+ }
+ return \@rv;
+
+ } else {
+ my @rv = $self->_source_search_module_tree(
+ allow => $list,
+ type => $type,
+ );
+ return \@rv;
+ }
+}
+
+=pod
+
+=head2 _search_author_tree( type => TYPE, allow => \@regexex, [data => \@previous_results ] )
+
+Searches the authortree for author objects matching the criteria you
+specify. Returns an array ref of author objects on success, and false
+on failure.
+
+It takes the following arguments:
+
+=over 4
+
+=item type
+
+This can be any of the accessors for the C<CPANPLUS::Module::Author>
+objects. This is a required argument.
+
+=item allow
+
+
+A set of rules, or more precisely, a list of regexes (via C<qr//> or
+plain strings), that the C<type> must adhere too. You can specify as
+many as you like, and it will be treated as an C<OR> search.
+For an C<AND> search, see the C<data> argument.
+
+This is a required argument.
+
+=item data
+
+An arrayref of previous search results. This is the way to do an C<and>
+search -- C<_search_author_tree> will only search the author objects
+specified in C<data> if provided, rather than the authortree itself.
+
+=back
+
+=cut
+
+sub _search_author_tree {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($authors,$list,$verbose,$type);
+ my $tmpl = {
+ data => { default => [],
+ strict_type=> 1, store => \$authors },
+ allow => { required => 1, default => [ ], strict_type => 1,
+ store => \$list },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ type => { required => 1, allow => [CPANPLUS::Module::Author->accessors()],
+ store => \$type },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ if( @$authors ) {
+ local $Params::Check::VERBOSE = 0;
+
+ my @rv;
+ for my $auth (@$authors) {
+ #push @rv, $auth if check(
+ # { $type => { allow => $list } },
+ # { $type => $auth->$type }
+ # );
+ push @rv, $auth if allow( $auth->$type() => $list );
+ }
+ return \@rv;
+ } else {
+ my @rv = $self->_source_search_author_tree(
+ allow => $list,
+ type => $type,
+ );
+ return \@rv;
+ }
+}
+
+=pod
+
+=head2 _all_installed()
+
+This function returns an array ref of module objects of modules that
+are installed on this system.
+
+=cut
+
+sub _all_installed {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ ### File::Find uses follow_skip => 1 by default, which doesn't die
+ ### on duplicates, unless they are directories or symlinks.
+ ### Ticket #29796 shows this code dying on Alien::WxWidgets,
+ ### which uses symlinks.
+ ### File::Find doc says to use follow_skip => 2 to ignore duplicates
+ ### so this will stop it from dying.
+ my %find_args = ( follow_skip => 2 );
+
+ ### File::Find uses lstat, which quietly becomes stat on win32
+ ### it then uses -l _ which is not allowed by the statbuffer because
+ ### you did a stat, not an lstat (duh!). so don't tell win32 to
+ ### follow symlinks, as that will break badly
+ $find_args{'follow_fast'} = 1 unless ON_WIN32;
+
+ ### never use the @INC hooks to find installed versions of
+ ### modules -- they're just there in case they're not on the
+ ### perl install, but the user shouldn't trust them for *other*
+ ### modules!
+ ### XXX CPANPLUS::inc is now obsolete, remove the calls
+ #local @INC = CPANPLUS::inc->original_inc;
+
+ my %seen; my @rv;
+ for my $dir (@INC ) {
+ next if $dir eq '.';
+
+ ### not a directory after all
+ ### may be coderef or some such
+ next unless -d $dir;
+
+ ### make sure to clean up the directories just in case,
+ ### as we're making assumptions about the length
+ ### This solves rt.cpan issue #19738
+
+ ### John M. notes: On VMS cannonpath can not currently handle
+ ### the $dir values that are in UNIX format.
+ $dir = File::Spec->canonpath( $dir ) unless ON_VMS;
+
+ ### have to use F::S::Unix on VMS, or things will break
+ my $file_spec = ON_VMS ? 'File::Spec::Unix' : 'File::Spec';
+
+ ### XXX in some cases File::Find can actually die!
+ ### so be safe and wrap it in an eval.
+ eval { File::Find::find(
+ { %find_args,
+ wanted => sub {
+
+ return unless /\.pm$/i;
+ my $mod = $File::Find::name;
+
+ ### make sure it's in Unix format, as it
+ ### may be in VMS format on VMS;
+ $mod = VMS::Filespec::unixify( $mod ) if ON_VMS;
+
+ $mod = substr($mod, length($dir) + 1, -3);
+ $mod = join '::', $file_spec->splitdir($mod);
+
+ return if $seen{$mod}++;
+
+ my $modobj = $self->module_tree($mod);
+
+ ### seperate return, a list context return with one ''
+ ### in it, is also true!
+ return unless $modobj;
+
+ push @rv, $modobj;
+ },
+ }, $dir
+ ) };
+
+ ### report the error if file::find died
+ error(loc("Error finding installed files in '%1': %2", $dir, $@)) if $@;
+ }
+
+ return \@rv;
+}
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source.pm
new file mode 100755
index 00000000000..54e9d710cfd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source.pm
@@ -0,0 +1,1417 @@
+package CPANPLUS::Internals::Source;
+
+use strict;
+
+use CPANPLUS::Error;
+use CPANPLUS::Module;
+use CPANPLUS::Module::Fake;
+use CPANPLUS::Module::Author;
+use CPANPLUS::Internals::Constants;
+
+use File::Fetch;
+use Archive::Extract;
+
+use IPC::Cmd qw[can_run];
+use File::Temp qw[tempdir];
+use File::Basename qw[dirname];
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+$Params::Check::VERBOSE = 1;
+
+### list of methods the parent class must implement
+{ for my $sub ( qw[_init_trees _finalize_trees
+ _standard_trees_completed _custom_trees_completed
+ _add_module_object _add_author_object _save_state
+ ]
+ ) {
+ no strict 'refs';
+ *$sub = sub {
+ my $self = shift;
+ my $class = ref $self || $self;
+
+ require Carp;
+ Carp::croak( loc( "Class %1 must implement method '%2'",
+ $class, $sub ) );
+ }
+ }
+}
+
+{
+ my $recurse; # flag to prevent recursive calls to *_tree functions
+
+ ### lazy loading of module tree
+ sub _module_tree {
+ my $self = $_[0];
+
+ unless ($self->_mtree or $recurse++ > 0) {
+ my $uptodate = $self->_check_trees( @_[1..$#_] );
+ $self->_build_trees(uptodate => $uptodate);
+ }
+
+ $recurse--;
+ return $self->_mtree;
+ }
+
+ ### lazy loading of author tree
+ sub _author_tree {
+ my $self = $_[0];
+
+ unless ($self->_atree or $recurse++ > 0) {
+ my $uptodate = $self->_check_trees( @_[1..$#_] );
+ $self->_build_trees(uptodate => $uptodate);
+ }
+
+ $recurse--;
+ return $self->_atree;
+ }
+
+}
+
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Internals::Source
+
+=head1 SYNOPSIS
+
+ ### lazy load author/module trees ###
+
+ $cb->_author_tree;
+ $cb->_module_tree;
+
+=head1 DESCRIPTION
+
+CPANPLUS::Internals::Source controls the updating of source files and
+the parsing of them into usable module/author trees to be used by
+C<CPANPLUS>.
+
+Functions exist to check if source files are still C<good to use> as
+well as update them, and then parse them.
+
+The flow looks like this:
+
+ $cb->_author_tree || $cb->_module_tree
+ $cb->_check_trees
+ $cb->__check_uptodate
+ $cb->_update_source
+ $cb->__update_custom_module_sources
+ $cb->__update_custom_module_source
+ $cb->_build_trees
+ ### engine methods
+ { $cb->_init_trees;
+ $cb->_standard_trees_completed
+ $cb->_custom_trees_completed
+ }
+ $cb->__create_author_tree
+ ### engine methods
+ { $cb->_add_author_object }
+ $cb->__create_module_tree
+ $cb->__create_dslip_tree
+ ### engine methods
+ { $cb->_add_module_object }
+ $cb->__create_custom_module_entries
+
+ $cb->_dslip_defs
+
+=head1 METHODS
+
+=cut
+
+=pod
+
+=head2 $cb->_build_trees( uptodate => BOOL, [use_stored => BOOL, path => $path, verbose => BOOL] )
+
+This method rebuilds the author- and module-trees from source.
+
+It takes the following arguments:
+
+=over 4
+
+=item uptodate
+
+Indicates whether any on disk caches are still ok to use.
+
+=item path
+
+The absolute path to the directory holding the source files.
+
+=item verbose
+
+A boolean flag indicating whether or not to be verbose.
+
+=item use_stored
+
+A boolean flag indicating whether or not it is ok to use previously
+stored trees. Defaults to true.
+
+=back
+
+Returns a boolean indicating success.
+
+=cut
+
+### (re)build the trees ###
+sub _build_trees {
+ my ($self, %hash) = @_;
+ my $conf = $self->configure_object;
+
+ my($path,$uptodate,$use_stored,$verbose);
+ my $tmpl = {
+ path => { default => $conf->get_conf('base'), store => \$path },
+ verbose => { default => $conf->get_conf('verbose'), store => \$verbose },
+ uptodate => { required => 1, store => \$uptodate },
+ use_stored => { default => 1, store => \$use_stored },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ $self->_init_trees(
+ path => $path,
+ uptodate => $uptodate,
+ verbose => $verbose,
+ use_stored => $use_stored,
+ ) or do {
+ error( loc("Could not initialize trees" ) );
+ return;
+ };
+
+ ### return if we weren't able to build the trees ###
+ return unless $self->_mtree && $self->_atree;
+
+ ### did we get everything from a stored state? if not,
+ ### process them now.
+ if( not $self->_standard_trees_completed ) {
+
+ ### first, prep the author tree
+ $self->__create_author_tree(
+ uptodate => $uptodate,
+ path => $path,
+ verbose => $verbose,
+ ) or return;
+
+ ### and now the module tree
+ $self->_create_mod_tree(
+ uptodate => $uptodate,
+ path => $path,
+ verbose => $verbose,
+ ) or return;
+ }
+
+ ### XXX unpleasant hack. since custom sources uses ->parse_module, we
+ ### already have a special module object with extra meta data. that
+ ### doesn't gelwell with the sqlite storage engine. So, we check 'normal'
+ ### trees from seperate trees, so the engine can treat them differently.
+ ### Effectively this means that with the SQLite engine, for now, custom
+ ### sources are continuously reparsed =/ -kane
+ if( not $self->_custom_trees_completed ) {
+
+ ### update them if the other sources are also deemed out of date
+ if( $conf->get_conf('enable_custom_sources') ) {
+ $self->__update_custom_module_sources( verbose => $verbose )
+ or error(loc("Could not update custom module sources"));
+ }
+
+ ### add custom sources here if enabled
+ if( $conf->get_conf('enable_custom_sources') ) {
+ $self->__create_custom_module_entries( verbose => $verbose )
+ or error(loc("Could not create custom module entries"));
+ }
+ }
+
+ ### give the source engine a chance to wrap up creation
+ $self->_finalize_trees(
+ path => $path,
+ uptodate => $uptodate,
+ verbose => $verbose,
+ use_stored => $use_stored,
+ ) or do {
+ error(loc( "Could not finalize trees" ));
+ return;
+ };
+
+ ### still necessary? can only run one instance now ###
+ ### will probably stay that way --kane
+# my $id = $self->_store_id( $self );
+#
+# unless ( $id == $self->_id ) {
+# error( loc("IDs do not match: %1 != %2. Storage failed!", $id, $self->_id) );
+# }
+
+ return 1;
+}
+
+=pod
+
+=head2 $cb->_check_trees( [update_source => BOOL, path => PATH, verbose => BOOL] )
+
+Retrieve source files and return a boolean indicating whether or not
+the source files are up to date.
+
+Takes several arguments:
+
+=over 4
+
+=item update_source
+
+A flag to force re-fetching of the source files, even
+if they are still up to date.
+
+=item path
+
+The absolute path to the directory holding the source files.
+
+=item verbose
+
+A boolean flag indicating whether or not to be verbose.
+
+=back
+
+Will get information from the config file by default.
+
+=cut
+
+### retrieve source files, and returns a boolean indicating if it's up to date
+sub _check_trees {
+ my ($self, %hash) = @_;
+ my $conf = $self->configure_object;
+
+ my $update_source;
+ my $verbose;
+ my $path;
+
+ my $tmpl = {
+ path => { default => $conf->get_conf('base'),
+ store => \$path
+ },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose
+ },
+ update_source => { default => 0, store => \$update_source },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ ### if the user never wants to update their source without explicitly
+ ### telling us, shortcircuit here
+ return 1 if $conf->get_conf('no_update') && !$update_source;
+
+ ### a check to see if our source files are still up to date ###
+ msg( loc("Checking if source files are up to date"), $verbose );
+
+ my $uptodate = 1; # default return value
+
+ for my $name (qw[auth dslip mod]) {
+ for my $file ( $conf->_get_source( $name ) ) {
+ $self->__check_uptodate(
+ file => File::Spec->catfile( $path, $file ),
+ name => $name,
+ update_source => $update_source,
+ verbose => $verbose,
+ ) or $uptodate = 0;
+ }
+ }
+
+ ### if we're explicitly asked to update the sources, or if the
+ ### standard source files are out of date, update the custom sources
+ ### as well
+ ### RT #47820: Don't try to update custom sources if they are disabled
+ ### in the configuration.
+ $self->__update_custom_module_sources( verbose => $verbose )
+ if $conf->get_conf('enable_custom_sources') and ( $update_source or !$uptodate );
+
+ return $uptodate;
+}
+
+=pod
+
+=head2 $cb->__check_uptodate( file => $file, name => $name, [update_source => BOOL, verbose => BOOL] )
+
+C<__check_uptodate> checks if a given source file is still up-to-date
+and if not, or when C<update_source> is true, will re-fetch the source
+file.
+
+Takes the following arguments:
+
+=over 4
+
+=item file
+
+The source file to check.
+
+=item name
+
+The internal shortcut name for the source file (used for config
+lookups).
+
+=item update_source
+
+Flag to force updating of sourcefiles regardless.
+
+=item verbose
+
+Boolean to indicate whether to be verbose or not.
+
+=back
+
+Returns a boolean value indicating whether the current files are up
+to date or not.
+
+=cut
+
+### this method checks whether or not the source files we are using are still up to date
+sub __check_uptodate {
+ my $self = shift;
+ my %hash = @_;
+ my $conf = $self->configure_object;
+
+
+ my $tmpl = {
+ file => { required => 1 },
+ name => { required => 1 },
+ update_source => { default => 0 },
+ verbose => { default => $conf->get_conf('verbose') },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ my $flag;
+ unless ( -e $args->{'file'} && (
+ ( stat $args->{'file'} )[9]
+ + $conf->_get_source('update') )
+ > time ) {
+ $flag = 1;
+ }
+
+ if ( $flag or $args->{'update_source'} ) {
+
+ if ( $self->_update_source( name => $args->{'name'} ) ) {
+ return 0; # return 0 so 'uptodate' will be set to 0, meaning no
+ # use of previously stored hashrefs!
+ } else {
+ msg( loc("Unable to update source, attempting to get away with using old source file!"), $args->{verbose} );
+ return 1;
+ }
+
+ } else {
+ return 1;
+ }
+}
+
+=pod
+
+=head2 $cb->_update_source( name => $name, [path => $path, verbose => BOOL] )
+
+This method does the actual fetching of source files.
+
+It takes the following arguments:
+
+=over 4
+
+=item name
+
+The internal shortcut name for the source file (used for config
+lookups).
+
+=item path
+
+The full path where to write the files.
+
+=item verbose
+
+Boolean to indicate whether to be verbose or not.
+
+=back
+
+Returns a boolean to indicate success.
+
+=cut
+
+### this sub fetches new source files ###
+sub _update_source {
+ my $self = shift;
+ my %hash = @_;
+ my $conf = $self->configure_object;
+
+ my $verbose;
+ my $tmpl = {
+ name => { required => 1 },
+ path => { default => $conf->get_conf('base') },
+ verbose => { default => $conf->get_conf('verbose'), store => \$verbose },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+
+ my $path = $args->{path};
+ { ### this could use a clean up - Kane
+ ### no worries about the / -> we get it from the _ftp configuration, so
+ ### it's not platform dependant. -kane
+ my ($dir, $file) = $conf->_get_mirror( $args->{'name'} ) =~ m|(.+/)(.+)$|sg;
+
+ msg( loc("Updating source file '%1'", $file), $verbose );
+
+ my $fake = CPANPLUS::Module::Fake->new(
+ module => $args->{'name'},
+ path => $dir,
+ package => $file,
+ _id => $self->_id,
+ );
+
+ ### can't use $fake->fetch here, since ->parent won't work --
+ ### the sources haven't been saved yet
+ my $rv = $self->_fetch(
+ module => $fake,
+ fetchdir => $path,
+ force => 1,
+ );
+
+
+ unless ($rv) {
+ error( loc("Couldn't fetch '%1'", $file) );
+ return;
+ }
+
+ $self->_update_timestamp( file => File::Spec->catfile($path, $file) );
+ }
+
+ return 1;
+}
+
+=pod
+
+=head2 $cb->__create_author_tree([path => $path, uptodate => BOOL, verbose => BOOL])
+
+This method opens a source files and parses its contents into a
+searchable author-tree or restores a file-cached version of a
+previous parse, if the sources are uptodate and the file-cache exists.
+
+It takes the following arguments:
+
+=over 4
+
+=item uptodate
+
+A flag indicating whether the file-cache is uptodate or not.
+
+=item path
+
+The absolute path to the directory holding the source files.
+
+=item verbose
+
+A boolean flag indicating whether or not to be verbose.
+
+=back
+
+Will get information from the config file by default.
+
+Returns a tree on success, false on failure.
+
+=cut
+
+sub __create_author_tree {
+ my $self = shift;
+ my %hash = @_;
+ my $conf = $self->configure_object;
+
+
+ my $tmpl = {
+ path => { default => $conf->get_conf('base') },
+ verbose => { default => $conf->get_conf('verbose') },
+ uptodate => { default => 0 },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ my $file = File::Spec->catfile(
+ $args->{path},
+ $conf->_get_source('auth')
+ );
+
+ msg(loc("Rebuilding author tree, this might take a while"),
+ $args->{verbose});
+
+ ### extract the file ###
+ my $ae = Archive::Extract->new( archive => $file ) or return;
+ my $out = STRIP_GZ_SUFFIX->($file);
+
+ ### make sure to set the PREFER_BIN flag if desired ###
+ { local $Archive::Extract::PREFER_BIN = $conf->get_conf('prefer_bin');
+ $ae->extract( to => $out ) or return;
+ }
+
+ my $cont = $self->_get_file_contents( file => $out ) or return;
+
+ ### don't need it anymore ###
+ unlink $out;
+
+ for ( split /\n/, $cont ) {
+ my($id, $name, $email) = m/^alias \s+
+ (\S+) \s+
+ "\s* ([^\"\<]+?) \s* <(.+)> \s*"
+ /x;
+
+ $self->_add_author_object(
+ author => $name, #authors name
+ email => $email, #authors email address
+ cpanid => $id, #authors CPAN ID
+ ) or error( loc("Could not add author '%1'", $name ) );
+
+ }
+
+ return $self->_atree;
+
+} #__create_author_tree
+
+=pod
+
+=head2 $cb->_create_mod_tree([path => $path, uptodate => BOOL, verbose => BOOL])
+
+This method opens a source files and parses its contents into a
+searchable module-tree or restores a file-cached version of a
+previous parse, if the sources are uptodate and the file-cache exists.
+
+It takes the following arguments:
+
+=over 4
+
+=item uptodate
+
+A flag indicating whether the file-cache is up-to-date or not.
+
+=item path
+
+The absolute path to the directory holding the source files.
+
+=item verbose
+
+A boolean flag indicating whether or not to be verbose.
+
+=back
+
+Will get information from the config file by default.
+
+Returns a tree on success, false on failure.
+
+=cut
+
+### this builds a hash reference with the structure of the cpan module tree ###
+sub _create_mod_tree {
+ my $self = shift;
+ my %hash = @_;
+ my $conf = $self->configure_object;
+
+
+ my $tmpl = {
+ path => { default => $conf->get_conf('base') },
+ verbose => { default => $conf->get_conf('verbose') },
+ uptodate => { default => 0 },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return undef;
+ my $file = File::Spec->catfile($args->{path}, $conf->_get_source('mod'));
+
+ msg(loc("Rebuilding module tree, this might take a while"),
+ $args->{verbose});
+
+
+ my $dslip_tree = $self->__create_dslip_tree( %$args );
+
+ ### extract the file ###
+ my $ae = Archive::Extract->new( archive => $file ) or return;
+ my $out = STRIP_GZ_SUFFIX->($file);
+
+ ### make sure to set the PREFER_BIN flag if desired ###
+ { local $Archive::Extract::PREFER_BIN = $conf->get_conf('prefer_bin');
+ $ae->extract( to => $out ) or return;
+ }
+
+ my $content = $self->_get_file_contents( file => $out ) or return;
+ my $lines = $content =~ tr/\n/\n/;
+
+ ### don't need it anymore ###
+ unlink $out;
+
+ my($past_header, $count);
+ for ( split /\n/, $content ) {
+
+ ### quick hack to read past the header of the file ###
+ ### this is still rather evil... fix some time - Kane
+ if( m|^\s*$| ) {
+ unless( $count ) {
+ error(loc("Could not determine line count from %1", $file));
+ return;
+ }
+ $past_header = 1;
+ }
+
+ ### we're still in the header -- find the amount of lines we expect
+ unless( $past_header ) {
+
+ ### if the line count doesn't match what we expect, bail out
+ ### this should address: #45644: detect broken index
+ $count = $1 if /^Line-Count:\s+(\d+)/;
+ if( $count ) {
+ if( $lines < $count ) {
+ error(loc("Expected to read at least %1 lines, but %2 ".
+ "contains only %3 lines!",
+ $count, $file, $lines ));
+ return;
+ }
+ }
+ ### still in the header, keep moving
+ next;
+ }
+
+ ### skip empty lines ###
+ next unless /\S/;
+ chomp;
+
+ my @data = split /\s+/;
+
+ ### filter out the author and filename as well ###
+ ### authors can apparently have digits in their names,
+ ### and dirs can have dots... blah!
+ my ($author, $package) = $data[2] =~
+ m| (?:[A-Z\d-]/)?
+ (?:[A-Z\d-]{2}/)?
+ ([A-Z\d-]+) (?:/[\S]+)?/
+ ([^/]+)$
+ |xsg;
+
+ ### remove file name from the path
+ $data[2] =~ s|/[^/]+$||;
+
+ my $aobj = $self->author_tree($author);
+ unless( $aobj ) {
+ error( loc( "No such author '%1' -- can't make module object " .
+ "'%2' that is supposed to belong to this author",
+ $author, $data[0] ) );
+ next;
+ }
+
+ ### adding the dslip info
+ ### probably can use some optimization
+ my $dslip;
+ for my $item ( qw[ statd stats statl stati statp ] ) {
+ ### checking if there's an entry in the dslip info before
+ ### catting it on. appeasing warnings this way
+ $dslip .= $dslip_tree->{ $data[0] }->{$item}
+ ? $dslip_tree->{ $data[0] }->{$item}
+ : ' ';
+ }
+
+ ### XXX this could be sped up if we used author names, not author
+ ### objects in creation, and then look them up in the author tree
+ ### when needed. This will need a fix to all the places that create
+ ### fake author/module objects as well.
+
+ ### callback to store the individual object
+ $self->_add_module_object(
+ module => $data[0], # full module name
+ version => ($data[1] eq 'undef' # version number
+ ? '0.0'
+ : $data[1]),
+ path => File::Spec::Unix->catfile(
+ $conf->_get_mirror('base'),
+ $data[2],
+ ), # extended path on the cpan mirror,
+ # like /A/AB/ABIGAIL
+ comment => $data[3], # comment on the module
+ author => $aobj,
+ package => $package, # package name, like
+ # 'foo-bar-baz-1.03.tar.gz'
+ description => $dslip_tree->{ $data[0] }->{'description'},
+ dslip => $dslip,
+ mtime => '',
+ ) or error( loc( "Could not add module '%1'", $data[0] ) );
+
+ } #for
+
+ return $self->_mtree;
+
+} #_create_mod_tree
+
+=pod
+
+=head2 $cb->__create_dslip_tree([path => $path, uptodate => BOOL, verbose => BOOL])
+
+This method opens a source files and parses its contents into a
+searchable dslip-tree or restores a file-cached version of a
+previous parse, if the sources are uptodate and the file-cache exists.
+
+It takes the following arguments:
+
+=over 4
+
+=item uptodate
+
+A flag indicating whether the file-cache is uptodate or not.
+
+=item path
+
+The absolute path to the directory holding the source files.
+
+=item verbose
+
+A boolean flag indicating whether or not to be verbose.
+
+=back
+
+Will get information from the config file by default.
+
+Returns a tree on success, false on failure.
+
+=cut
+
+sub __create_dslip_tree {
+ my $self = shift;
+ my %hash = @_;
+ my $conf = $self->configure_object;
+
+ my $tmpl = {
+ path => { default => $conf->get_conf('base') },
+ verbose => { default => $conf->get_conf('verbose') },
+ uptodate => { default => 0 },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ ### get the file name of the source ###
+ my $file = File::Spec->catfile($args->{path}, $conf->_get_source('dslip'));
+
+ ### extract the file ###
+ my $ae = Archive::Extract->new( archive => $file ) or return;
+ my $out = STRIP_GZ_SUFFIX->($file);
+
+ ### make sure to set the PREFER_BIN flag if desired ###
+ { local $Archive::Extract::PREFER_BIN = $conf->get_conf('prefer_bin');
+ $ae->extract( to => $out ) or return;
+ }
+
+ my $in = $self->_get_file_contents( file => $out ) or return;
+
+ ### don't need it anymore ###
+ unlink $out;
+
+
+ ### get rid of the comments and the code ###
+ ### need a smarter parser, some people have this in their dslip info:
+ # [
+ # 'Statistics::LTU',
+ # 'R',
+ # 'd',
+ # 'p',
+ # 'O',
+ # '?',
+ # 'Implements Linear Threshold Units',
+ # ...skipping...
+ # "\x{c4}dd \x{fc}ml\x{e4}\x{fc}ts t\x{f6} \x{eb}v\x{eb}r\x{ff}th\x{ef}ng!",
+ # 'BENNIE',
+ # '11'
+ # ],
+ ### also, older versions say:
+ ### $cols = [....]
+ ### and newer versions say:
+ ### $CPANPLUS::Modulelist::cols = [...]
+ ### split '$cols' and '$data' into 2 variables ###
+ ### use this regex to make sure dslips with ';' in them don't cause
+ ### parser errors
+ my ($ds_one, $ds_two) = ($in =~ m|.+}\s+
+ (\$(?:CPAN::Modulelist::)?cols.*?)
+ (\$(?:CPAN::Modulelist::)?data.*)
+ |sx);
+
+ ### eval them into existence ###
+ ### still not too fond of this solution - kane ###
+ my ($cols, $data);
+ { #local $@; can't use this, it's buggy -kane
+
+ $cols = eval $ds_one;
+ error( loc("Error in eval of dslip source files: %1", $@) ) if $@;
+
+ $data = eval $ds_two;
+ error( loc("Error in eval of dslip source files: %1", $@) ) if $@;
+
+ }
+
+ my $tree = {};
+ my $primary = "modid";
+
+ ### this comes from CPAN::Modulelist
+ ### which is in 03modlist.data.gz
+ for (@$data){
+ my %hash;
+ @hash{@$cols} = @$_;
+ $tree->{$hash{$primary}} = \%hash;
+ }
+
+ return $tree;
+
+} #__create_dslip_tree
+
+=pod
+
+=head2 $cb->_dslip_defs ()
+
+This function returns the definition structure (ARRAYREF) of the
+dslip tree.
+
+=cut
+
+### these are the definitions used for dslip info
+### they shouldn't change over time.. so hardcoding them doesn't appear to
+### be a problem. if it is, we need to parse 03modlist.data better to filter
+### all this out.
+### right now, this is just used to look up dslip info from a module
+sub _dslip_defs {
+ my $self = shift;
+
+ my $aref = [
+
+ # D
+ [ q|Development Stage|, {
+ i => loc('Idea, listed to gain consensus or as a placeholder'),
+ c => loc('under construction but pre-alpha (not yet released)'),
+ a => loc('Alpha testing'),
+ b => loc('Beta testing'),
+ R => loc('Released'),
+ M => loc('Mature (no rigorous definition)'),
+ S => loc('Standard, supplied with Perl 5'),
+ }],
+
+ # S
+ [ q|Support Level|, {
+ m => loc('Mailing-list'),
+ d => loc('Developer'),
+ u => loc('Usenet newsgroup comp.lang.perl.modules'),
+ n => loc('None known, try comp.lang.perl.modules'),
+ a => loc('Abandoned; volunteers welcome to take over maintainance'),
+ }],
+
+ # L
+ [ q|Language Used|, {
+ p => loc('Perl-only, no compiler needed, should be platform independent'),
+ c => loc('C and perl, a C compiler will be needed'),
+ h => loc('Hybrid, written in perl with optional C code, no compiler needed'),
+ '+' => loc('C++ and perl, a C++ compiler will be needed'),
+ o => loc('perl and another language other than C or C++'),
+ }],
+
+ # I
+ [ q|Interface Style|, {
+ f => loc('plain Functions, no references used'),
+ h => loc('hybrid, object and function interfaces available'),
+ n => loc('no interface at all (huh?)'),
+ r => loc('some use of unblessed References or ties'),
+ O => loc('Object oriented using blessed references and/or inheritance'),
+ }],
+
+ # P
+ [ q|Public License|, {
+ p => loc('Standard-Perl: user may choose between GPL and Artistic'),
+ g => loc('GPL: GNU General Public License'),
+ l => loc('LGPL: "GNU Lesser General Public License" (previously known as "GNU Library General Public License")'),
+ b => loc('BSD: The BSD License'),
+ a => loc('Artistic license alone'),
+ o => loc('other (but distribution allowed without restrictions)'),
+ }],
+ ];
+
+ return $aref;
+}
+
+=head2 $file = $cb->_add_custom_module_source( uri => URI, [verbose => BOOL] );
+
+Adds a custom source index and updates it based on the provided URI.
+
+Returns the full path to the index file on success or false on failure.
+
+=cut
+
+sub _add_custom_module_source {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($verbose,$uri);
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ uri => { required => 1, store => \$uri }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### what index file should we use on disk?
+ my $index = $self->__custom_module_source_index_file( uri => $uri );
+
+ ### already have it.
+ if( IS_FILE->( $index ) ) {
+ msg(loc("Source '%1' already added", $uri));
+ return 1;
+ }
+
+ ### do we need to create the targe dir?
+ { my $dir = dirname( $index );
+ unless( IS_DIR->( $dir ) ) {
+ $self->_mkdir( dir => $dir ) or return
+ }
+ }
+
+ ### write the file
+ my $fh = OPEN_FILE->( $index => '>' ) or do {
+ error(loc("Could not open index file for '%1'", $uri));
+ return;
+ };
+
+ ### basically we 'touched' it. Check the return value, may be
+ ### important on win32 and similar OS, where there's file length
+ ### limits
+ close $fh or do {
+ error(loc("Could not write index file to disk for '%1'", $uri));
+ return;
+ };
+
+ $self->__update_custom_module_source(
+ remote => $uri,
+ local => $index,
+ verbose => $verbose,
+ ) or do {
+ ### we faild to update it, we probably have an empty
+ ### possibly silly filename on disk now -- remove it
+ 1 while unlink $index;
+ return;
+ };
+
+ return $index;
+}
+
+=head2 $index = $cb->__custom_module_source_index_file( uri => $uri );
+
+Returns the full path to the encoded index file for C<$uri>, as used by
+all C<custom module source> routines.
+
+=cut
+
+sub __custom_module_source_index_file {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($verbose,$uri);
+ my $tmpl = {
+ uri => { required => 1, store => \$uri }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my $index = File::Spec->catfile(
+ $conf->get_conf('base'),
+ $conf->_get_build('custom_sources'),
+ $self->_uri_encode( uri => $uri ),
+ );
+
+ return $index;
+}
+
+=head2 $file = $cb->_remove_custom_module_source( uri => URI, [verbose => BOOL] );
+
+Removes a custom index file based on the URI provided.
+
+Returns the full path to the index file on success or false on failure.
+
+=cut
+
+sub _remove_custom_module_source {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($verbose,$uri);
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ uri => { required => 1, store => \$uri }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### use uri => local, instead of the other way around
+ my %files = reverse $self->__list_custom_module_sources;
+
+ ### On VMS the case of key to %files can be either exact or lower case
+ ### XXX abstract this lookup out? --kane
+ my $file = $files{ $uri };
+ $file = $files{ lc $uri } if !defined($file) && ON_VMS;
+
+ unless (defined $file) {
+ error(loc("No such custom source '%1'", $uri));
+ return;
+ };
+
+ 1 while unlink $file;
+
+ if( IS_FILE->( $file ) ) {
+ error(loc("Could not remove index file '%1' for custom source '%2'",
+ $file, $uri));
+ return;
+ }
+
+ msg(loc("Successfully removed index file for '%1'", $uri), $verbose);
+
+ return $file;
+}
+
+=head2 %files = $cb->__list_custom_module_sources
+
+This method scans the 'custom-sources' directory in your base directory
+for additional sources to include in your module tree.
+
+Returns a list of key value pairs as follows:
+
+ /full/path/to/source/file%3Fencoded => http://decoded/mirror/path
+
+=cut
+
+sub __list_custom_module_sources {
+ my $self = shift;
+ my $conf = $self->configure_object;
+
+ my($verbose);
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ };
+
+ my $dir = File::Spec->catdir(
+ $conf->get_conf('base'),
+ $conf->_get_build('custom_sources'),
+ );
+
+ unless( IS_DIR->( $dir ) ) {
+ msg(loc("No '%1' dir, skipping custom sources", $dir), $verbose);
+ return;
+ }
+
+ ### unencode the files
+ ### skip ones starting with # though
+ my %files = map {
+ my $org = $_;
+ my $dec = $self->_uri_decode( uri => $_ );
+ File::Spec->catfile( $dir, $org ) => $dec
+ } grep { $_ !~ /^#/ } READ_DIR->( $dir );
+
+ return %files;
+}
+
+=head2 $bool = $cb->__update_custom_module_sources( [verbose => BOOL] );
+
+Attempts to update all the index files to your custom module sources.
+
+If the index is missing, and it's a C<file://> uri, it will generate
+a new local index for you.
+
+Return true on success, false on failure.
+
+=cut
+
+sub __update_custom_module_sources {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my $verbose;
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my %files = $self->__list_custom_module_sources;
+
+ ### uptodate check has been done a few levels up.
+ my $fail;
+ while( my($local,$remote) = each %files ) {
+
+ $self->__update_custom_module_source(
+ remote => $remote,
+ local => $local,
+ verbose => $verbose,
+ ) or ( $fail++, next );
+ }
+
+ error(loc("Failed updating one or more remote sources files")) if $fail;
+
+ return if $fail;
+ return 1;
+}
+
+=head2 $ok = $cb->__update_custom_module_source
+
+Attempts to update all the index files to your custom module sources.
+
+If the index is missing, and it's a C<file://> uri, it will generate
+a new local index for you.
+
+Return true on success, false on failure.
+
+=cut
+
+sub __update_custom_module_source {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($verbose,$local,$remote);
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ local => { store => \$local, allow => FILE_EXISTS },
+ remote => { required => 1, store => \$remote },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ msg( loc("Updating sources from '%1'", $remote), $verbose);
+
+ ### if you didn't provide a local file, we'll look in your custom
+ ### dir to find the local encoded version for you
+ $local ||= do {
+ ### find all files we know of
+ my %files = reverse $self->__list_custom_module_sources or do {
+ error(loc("No custom modules sources defined -- need '%1' argument",
+ 'local'));
+ return;
+ };
+
+ ### On VMS the case of key to %files can be either exact or lower case
+ ### XXX abstract this lookup out? --kane
+ my $file = $files{ $remote };
+ $file = $files{ lc $remote } if !defined ($file) && ON_VMS;
+
+ ### return the local file we're supposed to use
+ $file or do {
+ error(loc("Remote source '%1' unknown -- needs '%2' argument",
+ $remote, 'local'));
+ return;
+ };
+ };
+
+ my $uri = join '/', $remote, $conf->_get_source('custom_index');
+ my $ff = File::Fetch->new( uri => $uri );
+
+ ### tempdir doesn't clean up by default, as opposed to tempfile()
+ ### so add it explicitly.
+ my $dir = tempdir( CLEANUP => 1 );
+
+ my $res = do { local $File::Fetch::WARN = 0;
+ local $File::Fetch::WARN = 0;
+ $ff->fetch( to => $dir );
+ };
+
+ ### couldn't get the file
+ unless( $res ) {
+
+ ### it's not a local scheme, so can't auto index
+ unless( $ff->scheme eq 'file' ) {
+ error(loc("Could not update sources from '%1': %2",
+ $remote, $ff->error ));
+ return;
+
+ ### it's a local uri, we can index it ourselves
+ } else {
+ msg(loc("No index file found at '%1', generating one",
+ $ff->uri), $verbose );
+
+ ### ON VMS, if you are working with a UNIX file specification,
+ ### you need currently use the UNIX variants of the File::Spec.
+ my $ff_path = do {
+ my $file_class = 'File::Spec';
+ $file_class .= '::Unix' if ON_VMS;
+ $file_class->catdir( File::Spec::Unix->splitdir( $ff->path ) );
+ };
+
+ $self->__write_custom_module_index(
+ path => $ff_path,
+ to => $local,
+ verbose => $verbose,
+ ) or return;
+
+ ### XXX don't write that here, __write_custom_module_index
+ ### already prints this out
+ #msg(loc("Index file written to '%1'", $to), $verbose);
+ }
+
+ ### copy it to the real spot and update its timestamp
+ } else {
+ $self->_move( file => $res, to => $local ) or return;
+ $self->_update_timestamp( file => $local );
+
+ msg(loc("Index file saved to '%1'", $local), $verbose);
+ }
+
+ return $local;
+}
+
+=head2 $bool = $cb->__write_custom_module_index( path => /path/to/packages, [to => /path/to/index/file, verbose => BOOL] )
+
+Scans the C<path> you provided for packages and writes an index with all
+the available packages to C<$path/packages.txt>. If you'd like the index
+to be written to a different file, provide the C<to> argument.
+
+Returns true on success and false on failure.
+
+=cut
+
+sub __write_custom_module_index {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my ($verbose, $path, $to);
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ path => { required => 1, allow => DIR_EXISTS, store => \$path },
+ to => { store => \$to },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### no explicit to? then we'll use our default
+ $to ||= File::Spec->catfile( $path, $conf->_get_source('custom_index') );
+
+ my @files;
+ require File::Find;
+ File::Find::find( sub {
+ ### let's see if A::E can even parse it
+ my $ae = do {
+ local $Archive::Extract::WARN = 0;
+ local $Archive::Extract::WARN = 0;
+ Archive::Extract->new( archive => $File::Find::name )
+ } or return;
+
+ ### it's a type A::E recognize, so we can add it
+ $ae->type or return;
+
+ ### neither $_ nor $File::Find::name have the chunk of the path in
+ ### it starting $path -- it's either only the filename, or the full
+ ### path, so we have to strip it ourselves
+ ### make sure to remove the leading slash as well.
+ my $copy = $File::Find::name;
+ my $re = quotemeta($path);
+ $copy =~ s|^$re[\\/]?||i;
+
+ push @files, $copy;
+
+ }, $path );
+
+ ### does the dir exist? if not, create it.
+ { my $dir = dirname( $to );
+ unless( IS_DIR->( $dir ) ) {
+ $self->_mkdir( dir => $dir ) or return
+ }
+ }
+
+ ### create the index file
+ my $fh = OPEN_FILE->( $to => '>' ) or return;
+
+ print $fh "$_\n" for @files;
+ close $fh;
+
+ msg(loc("Successfully written index file to '%1'", $to), $verbose);
+
+ return $to;
+}
+
+
+=head2 $bool = $cb->__create_custom_module_entries( [verbose => BOOL] )
+
+Creates entries in the module tree based upon the files as returned
+by C<__list_custom_module_sources>.
+
+Returns true on success, false on failure.
+
+=cut
+
+### use $auth_obj as a persistant version, so we don't have to recreate
+### modules all the time
+{ my $auth_obj;
+
+ sub __create_custom_module_entries {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my $verbose;
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose'), store => \$verbose },
+ };
+
+ check( $tmpl, \%hash ) or return undef;
+
+ my %files = $self->__list_custom_module_sources;
+
+ while( my($file,$name) = each %files ) {
+
+ msg(loc("Adding packages from custom source '%1'", $name), $verbose);
+
+ my $fh = OPEN_FILE->( $file ) or next;
+
+ while( local $_ = <$fh> ) {
+ chomp;
+ next if /^#/;
+ next unless /\S+/;
+
+ ### join on / -- it's a URI after all!
+ my $parse = join '/', $name, $_;
+
+ ### try to make a module object out of it
+ my $mod = $self->parse_module( module => $parse ) or (
+ error(loc("Could not parse '%1'", $_)),
+ next
+ );
+
+ ### mark this object with a custom author
+ $auth_obj ||= do {
+ my $id = CUSTOM_AUTHOR_ID;
+
+ ### if the object is being created for the first time,
+ ### make sure there's an entry in the author tree as
+ ### well, so we can search on the CPAN ID
+ $self->author_tree->{ $id } =
+ CPANPLUS::Module::Author::Fake->new( cpanid => $id );
+ };
+
+ $mod->author( $auth_obj );
+
+ ### and now add it to the modlue tree -- this MAY
+ ### override things of course
+ if( my $old_mod = $self->module_tree( $mod->module ) ) {
+
+ ### On VMS use the old module name to get the real case
+ $mod->module( $old_mod->module ) if ON_VMS;
+
+ msg(loc("About to overwrite module tree entry for '%1' with '%2'",
+ $mod->module, $mod->package), $verbose);
+ }
+
+ ### mark where it came from
+ $mod->description( loc("Custom source from '%1'",$name) );
+
+ ### store it in the module tree
+ $self->module_tree->{ $mod->module } = $mod;
+ }
+ }
+
+ return 1;
+ }
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source/Memory.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source/Memory.pm
new file mode 100755
index 00000000000..cb3fd4f1e76
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source/Memory.pm
@@ -0,0 +1,374 @@
+package CPANPLUS::Internals::Source::Memory;
+
+use base 'CPANPLUS::Internals::Source';
+
+use strict;
+
+use CPANPLUS::Error;
+use CPANPLUS::Module;
+use CPANPLUS::Module::Fake;
+use CPANPLUS::Module::Author;
+use CPANPLUS::Internals::Constants;
+
+use File::Fetch;
+use Archive::Extract;
+
+use IPC::Cmd qw[can_run];
+use File::Temp qw[tempdir];
+use File::Basename qw[dirname];
+use Params::Check qw[allow check];
+use Module::Load::Conditional qw[can_load];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+$Params::Check::VERBOSE = 1;
+
+=head1 NAME
+
+CPANPLUS::Internals::Source::Memory - In memory implementation
+
+=cut
+
+### flag to show if init_trees got its' data from storable. This allows
+### us to not write an existing stored file back to disk
+{ my $from_storable;
+
+ sub _init_trees {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($path,$uptodate,$verbose,$use_stored);
+ my $tmpl = {
+ path => { default => $conf->get_conf('base'), store => \$path },
+ verbose => { default => $conf->get_conf('verbose'), store => \$verbose },
+ uptodate => { required => 1, store => \$uptodate },
+ use_stored => { default => 1, store => \$use_stored },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### retrieve the stored source files ###
+ my $stored = $self->__memory_retrieve_source(
+ path => $path,
+ uptodate => $uptodate && $use_stored,
+ verbose => $verbose,
+ ) || {};
+
+ ### we got this from storable if $stored has keys..
+ $from_storable = keys %$stored ? 1 : 0;
+
+ ### set up the trees
+ $self->_atree( $stored->{_atree} || {} );
+ $self->_mtree( $stored->{_mtree} || {} );
+
+ return 1;
+ }
+
+ sub _standard_trees_completed { return $from_storable }
+ sub _custom_trees_completed { return $from_storable }
+
+ sub _finalize_trees {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($path,$uptodate,$verbose);
+ my $tmpl = {
+ path => { default => $conf->get_conf('base'), store => \$path },
+ verbose => { default => $conf->get_conf('verbose'), store => \$verbose },
+ uptodate => { required => 1, store => \$uptodate },
+ };
+
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+ check( $tmpl, \%hash ) or return;
+ }
+
+ ### write the stored files to disk, so we can keep using them
+ ### from now on, till they become invalid
+ ### write them if the original sources weren't uptodate, or
+ ### we didn't just load storable files
+ $self->__memory_save_source() if !$uptodate or not $from_storable;
+
+ return 1;
+ }
+
+ ### saves current memory state
+ sub _save_state {
+ my $self = shift;
+ return $self->_finalize_trees( @_, uptodate => 0 );
+ }
+}
+
+sub _add_author_object {
+ my $self = shift;
+ my %hash = @_;
+
+ my $class;
+ my $tmpl = {
+ class => { default => 'CPANPLUS::Module::Author', store => \$class },
+ map { $_ => { required => 1 } }
+ qw[ author cpanid email ]
+ };
+
+ my $href = do {
+ local $Params::Check::NO_DUPLICATES = 1;
+ check( $tmpl, \%hash ) or return;
+ };
+
+ my $obj = $class->new( %$href, _id => $self->_id );
+
+ $self->author_tree->{ $href->{'cpanid'} } = $obj or return;
+
+ return $obj;
+}
+
+sub _add_module_object {
+ my $self = shift;
+ my %hash = @_;
+
+ my $class;
+ my $tmpl = {
+ class => { default => 'CPANPLUS::Module', store => \$class },
+ map { $_ => { required => 1 } }
+ qw[ module version path comment author package description dslip mtime ]
+ };
+
+ my $href = do {
+ local $Params::Check::NO_DUPLICATES = 1;
+ check( $tmpl, \%hash ) or return;
+ };
+
+ my $obj = $class->new( %$href, _id => $self->_id );
+
+ ### Every module get's stored as a module object ###
+ $self->module_tree->{ $href->{module} } = $obj or return;
+
+ return $obj;
+}
+
+{ my %map = (
+ _source_search_module_tree => [ module_tree => 'CPANPLUS::Module' ],
+ _source_search_author_tree => [ author_tree => 'CPANPLUS::Module::Author' ],
+ );
+
+ while( my($sub, $aref) = each %map ) {
+ no strict 'refs';
+
+ my($meth, $class) = @$aref;
+
+ *$sub = sub {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($authors,$list,$verbose,$type);
+ my $tmpl = {
+ data => { default => [],
+ strict_type=> 1, store => \$authors },
+ allow => { required => 1, default => [ ], strict_type => 1,
+ store => \$list },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ type => { required => 1, allow => [$class->accessors()],
+ store => \$type },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ my @rv;
+ for my $obj ( values %{ $self->$meth } ) {
+ #push @rv, $auth if check(
+ # { $type => { allow => $list } },
+ # { $type => $auth->$type }
+ # );
+ push @rv, $obj if allow( $obj->$type() => $list );
+ }
+
+ return @rv;
+ }
+ }
+}
+
+=pod
+
+=head2 $cb->__memory_retrieve_source(name => $name, [path => $path, uptodate => BOOL, verbose => BOOL])
+
+This method retrieves a I<storable>d tree identified by C<$name>.
+
+It takes the following arguments:
+
+=over 4
+
+=item name
+
+The internal name for the source file to retrieve.
+
+=item uptodate
+
+A flag indicating whether the file-cache is up-to-date or not.
+
+=item path
+
+The absolute path to the directory holding the source files.
+
+=item verbose
+
+A boolean flag indicating whether or not to be verbose.
+
+=back
+
+Will get information from the config file by default.
+
+Returns a tree on success, false on failure.
+
+=cut
+
+sub __memory_retrieve_source {
+ my $self = shift;
+ my %hash = @_;
+ my $conf = $self->configure_object;
+
+ my $tmpl = {
+ path => { default => $conf->get_conf('base') },
+ verbose => { default => $conf->get_conf('verbose') },
+ uptodate => { default => 0 },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ ### check if we can retrieve a frozen data structure with storable ###
+ my $storable = can_load( modules => {'Storable' => '0.0'} )
+ if $conf->get_conf('storable');
+
+ return unless $storable;
+
+ ### $stored is the name of the frozen data structure ###
+ my $stored = $self->__memory_storable_file( $args->{path} );
+
+ if ($storable && -e $stored && -s _ && $args->{'uptodate'}) {
+ msg( loc("Retrieving %1", $stored), $args->{'verbose'} );
+
+ my $href = Storable::retrieve($stored);
+ return $href;
+ } else {
+ return;
+ }
+}
+
+=pod
+
+=head2 $cb->__memory_save_source([verbose => BOOL, path => $path])
+
+This method saves all the parsed trees in I<storable>d format if
+C<Storable> is available.
+
+It takes the following arguments:
+
+=over 4
+
+=item path
+
+The absolute path to the directory holding the source files.
+
+=item verbose
+
+A boolean flag indicating whether or not to be verbose.
+
+=back
+
+Will get information from the config file by default.
+
+Returns true on success, false on failure.
+
+=cut
+
+sub __memory_save_source {
+ my $self = shift;
+ my %hash = @_;
+ my $conf = $self->configure_object;
+
+
+ my $tmpl = {
+ path => { default => $conf->get_conf('base'), allow => DIR_EXISTS },
+ verbose => { default => $conf->get_conf('verbose') },
+ force => { default => 1 },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ my $aref = [qw[_mtree _atree]];
+
+ ### check if we can retrieve a frozen data structure with storable ###
+ my $storable;
+ $storable = can_load( modules => {'Storable' => '0.0'} )
+ if $conf->get_conf('storable');
+ return unless $storable;
+
+ my $to_write = {};
+ foreach my $key ( @$aref ) {
+ next unless ref( $self->$key );
+ $to_write->{$key} = $self->$key;
+ }
+
+ return unless keys %$to_write;
+
+ ### $stored is the name of the frozen data structure ###
+ my $stored = $self->__memory_storable_file( $args->{path} );
+
+ if (-e $stored && not -w $stored) {
+ msg( loc("%1 not writable; skipped.", $stored), $args->{'verbose'} );
+ return;
+ }
+
+ msg( loc("Writing compiled source information to disk. This might take a little while."),
+ $args->{'verbose'} );
+
+ my $flag;
+ unless( Storable::nstore( $to_write, $stored ) ) {
+ error( loc("could not store %1!", $stored) );
+ $flag++;
+ }
+
+ return $flag ? 0 : 1;
+}
+
+sub __memory_storable_file {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my $path = shift or return;
+
+ ### check if we can retrieve a frozen data structure with storable ###
+ my $storable = $conf->get_conf('storable')
+ ? can_load( modules => {'Storable' => '0.0'} )
+ : 0;
+
+ return unless $storable;
+
+ ### $stored is the name of the frozen data structure ###
+ ### changed to use File::Spec->catfile -jmb
+ my $stored = File::Spec->rel2abs(
+ File::Spec->catfile(
+ $path, #base dir
+ $conf->_get_source('stored') #file
+ . '.s' .
+ $Storable::VERSION #the version of storable
+ . '.c' .
+ $self->VERSION #the version of CPANPLUS
+ . STORABLE_EXT #append a suffix
+ )
+ );
+
+ return $stored;
+}
+
+
+
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source/SQLite.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source/SQLite.pm
new file mode 100755
index 00000000000..a0ddf499bf6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source/SQLite.pm
@@ -0,0 +1,326 @@
+package CPANPLUS::Internals::Source::SQLite;
+
+use strict;
+use warnings;
+
+use base 'CPANPLUS::Internals::Source';
+
+use CPANPLUS::Error;
+use CPANPLUS::Internals::Constants;
+use CPANPLUS::Internals::Source::SQLite::Tie;
+
+use Data::Dumper;
+use DBIx::Simple;
+use DBD::SQLite;
+
+use Params::Check qw[allow check];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+use constant TXN_COMMIT => 1000;
+
+=head1 NAME
+
+CPANPLUS::Internals::Source::SQLite - SQLite implementation
+
+=cut
+
+{ my $Dbh;
+ my $DbFile;
+
+ sub __sqlite_file {
+ return $DbFile if $DbFile;
+
+ my $self = shift;
+ my $conf = $self->configure_object;
+
+ $DbFile = File::Spec->catdir(
+ $conf->get_conf('base'),
+ SOURCE_SQLITE_DB
+ );
+
+ return $DbFile;
+ };
+
+ sub __sqlite_dbh {
+ return $Dbh if $Dbh;
+
+ my $self = shift;
+ $Dbh = DBIx::Simple->connect(
+ "dbi:SQLite:dbname=" . $self->__sqlite_file,
+ '', '',
+ { AutoCommit => 1 }
+ );
+ #$Dbh->dbh->trace(1);
+
+ return $Dbh;
+ };
+}
+
+{ my $used_old_copy = 0;
+
+ sub _init_trees {
+ my $self = shift;
+ my $conf = $self->configure_object;
+ my %hash = @_;
+
+ my($path,$uptodate,$verbose,$use_stored);
+ my $tmpl = {
+ path => { default => $conf->get_conf('base'), store => \$path },
+ verbose => { default => $conf->get_conf('verbose'), store => \$verbose },
+ uptodate => { required => 1, store => \$uptodate },
+ use_stored => { default => 1, store => \$use_stored },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### if it's not uptodate, or the file doesn't exist, we need to create
+ ### a new sqlite db
+ if( not $uptodate or not -e $self->__sqlite_file ) {
+ $used_old_copy = 0;
+
+ ### chuck the file
+ 1 while unlink $self->__sqlite_file;
+
+ ### and create a new one
+ $self->__sqlite_create_db or do {
+ error(loc("Could not create new SQLite DB"));
+ return;
+ }
+ } else {
+ $used_old_copy = 1;
+ }
+
+ ### set up the author tree
+ { my %at;
+ tie %at, 'CPANPLUS::Internals::Source::SQLite::Tie',
+ dbh => $self->__sqlite_dbh, table => 'author',
+ key => 'cpanid', cb => $self;
+
+ $self->_atree( \%at );
+ }
+
+ ### set up the author tree
+ { my %mt;
+ tie %mt, 'CPANPLUS::Internals::Source::SQLite::Tie',
+ dbh => $self->__sqlite_dbh, table => 'module',
+ key => 'module', cb => $self;
+
+ $self->_mtree( \%mt );
+ }
+
+ ### start a transaction
+ $self->__sqlite_dbh->query('BEGIN');
+
+ return 1;
+
+ }
+
+ sub _standard_trees_completed { return $used_old_copy }
+ sub _custom_trees_completed { return }
+ ### finish transaction
+ sub _finalize_trees { $_[0]->__sqlite_dbh->query('COMMIT'); return 1 }
+
+ ### saves current memory state, but not implemented in sqlite
+ sub _save_state {
+ error(loc("%1 has not implemented writing state to disk", __PACKAGE__));
+ return;
+ }
+}
+
+{ my $txn_count = 0;
+
+ ### XXX move this outside the sub, so we only compute it once
+ my $class;
+ my @keys = qw[ author cpanid email ];
+ my $tmpl = {
+ class => { default => 'CPANPLUS::Module::Author', store => \$class },
+ map { $_ => { required => 1 } } @keys
+ };
+
+ ### dbix::simple's expansion of (??) is REALLY expensive, so do it manually
+ my $ph = join ',', map { '?' } @keys;
+
+
+ sub _add_author_object {
+ my $self = shift;
+ my %hash = @_;
+ my $dbh = $self->__sqlite_dbh;
+
+ my $href = do {
+ local $Params::Check::NO_DUPLICATES = 1;
+ local $Params::Check::SANITY_CHECK_TEMPLATE = 0;
+ check( $tmpl, \%hash ) or return;
+ };
+
+ ### keep counting how many we inserted
+ unless( ++$txn_count % TXN_COMMIT ) {
+ #warn "Committing transaction $txn_count";
+ $dbh->query('COMMIT') or error( $dbh->error ); # commit previous transaction
+ $dbh->query('BEGIN') or error( $dbh->error ); # and start a new one
+ }
+
+ $dbh->query(
+ "INSERT INTO author (". join(',',keys(%$href)) .") VALUES ($ph)",
+ values %$href
+ ) or do {
+ error( $dbh->error );
+ return;
+ };
+
+ return 1;
+ }
+}
+
+{ my $txn_count = 0;
+
+ ### XXX move this outside the sub, so we only compute it once
+ my $class;
+ my @keys = qw[ module version path comment author package description dslip mtime ];
+ my $tmpl = {
+ class => { default => 'CPANPLUS::Module', store => \$class },
+ map { $_ => { required => 1 } } @keys
+ };
+
+ ### dbix::simple's expansion of (??) is REALLY expensive, so do it manually
+ my $ph = join ',', map { '?' } @keys;
+
+ sub _add_module_object {
+ my $self = shift;
+ my %hash = @_;
+ my $dbh = $self->__sqlite_dbh;
+
+ my $href = do {
+ local $Params::Check::NO_DUPLICATES = 1;
+ local $Params::Check::SANITY_CHECK_TEMPLATE = 0;
+ check( $tmpl, \%hash ) or return;
+ };
+
+ ### fix up author to be 'plain' string
+ $href->{'author'} = $href->{'author'}->cpanid;
+
+ ### keep counting how many we inserted
+ unless( ++$txn_count % TXN_COMMIT ) {
+ #warn "Committing transaction $txn_count";
+ $dbh->query('COMMIT') or error( $dbh->error ); # commit previous transaction
+ $dbh->query('BEGIN') or error( $dbh->error ); # and start a new one
+ }
+
+ $dbh->query(
+ "INSERT INTO module (". join(',',keys(%$href)) .") VALUES ($ph)",
+ values %$href
+ ) or do {
+ error( $dbh->error );
+ return;
+ };
+
+ return 1;
+ }
+}
+
+{ my %map = (
+ _source_search_module_tree
+ => [ module => module => 'CPANPLUS::Module' ],
+ _source_search_author_tree
+ => [ author => cpanid => 'CPANPLUS::Module::Author' ],
+ );
+
+ while( my($sub, $aref) = each %map ) {
+ no strict 'refs';
+
+ my($table, $key, $class) = @$aref;
+ *$sub = sub {
+ my $self = shift;
+ my %hash = @_;
+ my $dbh = $self->__sqlite_dbh;
+
+ my($list,$type);
+ my $tmpl = {
+ allow => { required => 1, default => [ ], strict_type => 1,
+ store => \$list },
+ type => { required => 1, allow => [$class->accessors()],
+ store => \$type },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+
+ ### we aliased 'module' to 'name', so change that here too
+ $type = 'module' if $type eq 'name';
+
+ my $res = $dbh->query( "SELECT * from $table" );
+
+ my $meth = $table .'_tree';
+ my @rv = map { $self->$meth( $_->{$key} ) }
+ grep { allow( $_->{$type} => $list ) } $res->hashes;
+
+ return @rv;
+ }
+ }
+}
+
+
+
+sub __sqlite_create_db {
+ my $self = shift;
+ my $dbh = $self->__sqlite_dbh;
+
+ ### we can ignore the result/error; not all sqlite implemantation
+ ### support this
+ $dbh->query( qq[
+ DROP TABLE IF EXISTS author;
+ \n]
+ ) or do {
+ msg( $dbh->error );
+ };
+ $dbh->query( qq[
+ DROP TABLE IF EXISTS module;
+ \n]
+ ) or do {
+ msg( $dbh->error );
+ };
+
+
+
+ $dbh->query( qq[
+ /* the author information */
+ CREATE TABLE author (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+
+ author varchar(255),
+ email varchar(255),
+ cpanid varchar(255)
+ );
+ \n]
+
+ ) or do {
+ error( $dbh->error );
+ return;
+ };
+
+ $dbh->query( qq[
+ /* the module information */
+ CREATE TABLE module (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+
+ module varchar(255),
+ version varchar(255),
+ path varchar(255),
+ comment varchar(255),
+ author varchar(255),
+ package varchar(255),
+ description varchar(255),
+ dslip varchar(255),
+ mtime varchar(255)
+ );
+
+ \n]
+
+ ) or do {
+ error( $dbh->error );
+ return;
+ };
+
+ return 1;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source/SQLite/Tie.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source/SQLite/Tie.pm
new file mode 100755
index 00000000000..f908c9803e4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Source/SQLite/Tie.pm
@@ -0,0 +1,145 @@
+package CPANPLUS::Internals::Source::SQLite::Tie;
+
+use strict;
+use warnings;
+
+use CPANPLUS::Error;
+use CPANPLUS::Module;
+use CPANPLUS::Module::Fake;
+use CPANPLUS::Module::Author::Fake;
+use CPANPLUS::Internals::Constants;
+
+
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+
+use Data::Dumper;
+$Data::Dumper::Indent = 1;
+
+require Tie::Hash;
+use vars qw[@ISA];
+push @ISA, 'Tie::StdHash';
+
+
+sub TIEHASH {
+ my $class = shift;
+ my %hash = @_;
+
+ my $tmpl = {
+ dbh => { required => 1 },
+ table => { required => 1 },
+ key => { required => 1 },
+ cb => { required => 1 },
+ offset => { default => 0 },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+ my $obj = bless { %$args, store => {} } , $class;
+
+ return $obj;
+}
+
+sub FETCH {
+ my $self = shift;
+ my $key = shift or return;
+ my $dbh = $self->{dbh};
+ my $cb = $self->{cb};
+ my $table = $self->{table};
+
+
+ ### did we look this one up before?
+ if( my $obj = $self->{store}->{$key} ) {
+ return $obj;
+ }
+
+ my $res = $dbh->query(
+ "SELECT * from $table where $self->{key} = ?", $key
+ ) or do {
+ error( $dbh->error );
+ return;
+ };
+
+ my $href = $res->hash;
+
+ ### get rid of the primary key
+ delete $href->{'id'};
+
+ ### no results?
+ return unless keys %$href;
+
+ ### expand author if needed
+ ### XXX no longer generic :(
+ if( $table eq 'module' ) {
+ $href->{author} = $cb->author_tree( $href->{author } ) or return;
+ }
+
+ my $class = {
+ module => 'CPANPLUS::Module',
+ author => 'CPANPLUS::Module::Author',
+ }->{ $table };
+
+ my $obj = $self->{store}->{$key} = $class->new( %$href, _id => $cb->_id );
+
+ return $obj;
+}
+
+sub STORE {
+ my $self = shift;
+ my $key = shift;
+ my $val = shift;
+
+ $self->{store}->{$key} = $val;
+}
+
+1;
+
+sub FIRSTKEY {
+ my $self = shift;
+ my $dbh = $self->{'dbh'};
+
+ my $res = $dbh->query(
+ "select $self->{key} from $self->{table} order by $self->{key} limit 1"
+ );
+
+ $self->{offset} = 0;
+
+ my $key = $res->flat->[0];
+
+ return $key;
+}
+
+sub NEXTKEY {
+ my $self = shift;
+ my $dbh = $self->{'dbh'};
+
+ my $res = $dbh->query(
+ "select $self->{key} from $self->{table} ".
+ "order by $self->{key} limit 1 offset $self->{offset}"
+ );
+
+ $self->{offset} +=1;
+
+ my $key = $res->flat->[0];
+ my $val = $self->FETCH( $key );
+
+ ### use each() semantics
+ return wantarray ? ( $key, $val ) : $key;
+}
+
+sub EXISTS { !!$_[0]->FETCH( $_[1] ) }
+
+sub SCALAR {
+ my $self = shift;
+ my $dbh = $self->{'dbh'};
+
+ my $res = $dbh->query( "select count(*) from $self->{table}" );
+
+ return $res->flat;
+}
+
+### intentionally left blank
+sub DELETE { }
+sub CLEAR { }
+
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Utils.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Utils.pm
new file mode 100755
index 00000000000..8475c362023
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Utils.pm
@@ -0,0 +1,657 @@
+package CPANPLUS::Internals::Utils;
+
+use strict;
+
+use CPANPLUS::Error;
+use CPANPLUS::Internals::Constants;
+
+use Cwd qw[chdir cwd];
+use File::Copy;
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+local $Params::Check::VERBOSE = 1;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Internals::Utils
+
+=head1 SYNOPSIS
+
+ my $bool = $cb->_mkdir( dir => 'blah' );
+ my $bool = $cb->_chdir( dir => 'blah' );
+ my $bool = $cb->_rmdir( dir => 'blah' );
+
+ my $bool = $cb->_move( from => '/some/file', to => '/other/file' );
+ my $bool = $cb->_move( from => '/some/dir', to => '/other/dir' );
+
+ my $cont = $cb->_get_file_contents( file => '/path/to/file' );
+
+
+ my $version = $cb->_perl_version( perl => $^X );
+
+=head1 DESCRIPTION
+
+C<CPANPLUS::Internals::Utils> holds a few convenience functions for
+CPANPLUS libraries.
+
+=head1 METHODS
+
+=head2 $cb->_mkdir( dir => '/some/dir' )
+
+C<_mkdir> creates a full path to a directory.
+
+Returns true on success, false on failure.
+
+=cut
+
+sub _mkdir {
+ my $self = shift;
+
+ my %hash = @_;
+
+ my $tmpl = {
+ dir => { required => 1 },
+ };
+
+ my $args = check( $tmpl, \%hash ) or (
+ error(loc( Params::Check->last_error ) ), return
+ );
+
+ unless( can_load( modules => { 'File::Path' => 0.0 } ) ) {
+ error( loc("Could not use File::Path! This module should be core!") );
+ return;
+ }
+
+ eval { File::Path::mkpath($args->{dir}) };
+
+ if($@) {
+ chomp($@);
+ error(loc(qq[Could not create directory '%1': %2], $args->{dir}, $@ ));
+ return;
+ }
+
+ return 1;
+}
+
+=pod
+
+=head2 $cb->_chdir( dir => '/some/dir' )
+
+C<_chdir> changes directory to a dir.
+
+Returns true on success, false on failure.
+
+=cut
+
+sub _chdir {
+ my $self = shift;
+ my %hash = @_;
+
+ my $tmpl = {
+ dir => { required => 1, allow => DIR_EXISTS },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ unless( chdir $args->{dir} ) {
+ error( loc(q[Could not chdir into '%1'], $args->{dir}) );
+ return;
+ }
+
+ return 1;
+}
+
+=pod
+
+=head2 $cb->_rmdir( dir => '/some/dir' );
+
+Removes a directory completely, even if it is non-empty.
+
+Returns true on success, false on failure.
+
+=cut
+
+sub _rmdir {
+ my $self = shift;
+ my %hash = @_;
+
+ my $tmpl = {
+ dir => { required => 1, allow => IS_DIR },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ unless( can_load( modules => { 'File::Path' => 0.0 } ) ) {
+ error( loc("Could not use File::Path! This module should be core!") );
+ return;
+ }
+
+ eval { File::Path::rmtree($args->{dir}) };
+
+ if($@) {
+ chomp($@);
+ error(loc(qq[Could not delete directory '%1': %2], $args->{dir}, $@ ));
+ return;
+ }
+
+ return 1;
+}
+
+=pod
+
+=head2 $cb->_perl_version ( perl => 'some/perl/binary' );
+
+C<_perl_version> returns the version of a certain perl binary.
+It does this by actually running a command.
+
+Returns the perl version on success and false on failure.
+
+=cut
+
+sub _perl_version {
+ my $self = shift;
+ my %hash = @_;
+
+ my $perl;
+ my $tmpl = {
+ perl => { required => 1, store => \$perl },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my $perl_version;
+ ### special perl, or the one we are running under?
+ if( $perl eq $^X ) {
+ ### just load the config
+ require Config;
+ $perl_version = $Config::Config{version};
+
+ } else {
+ my $cmd = $perl .
+ ' -MConfig -eprint+Config::config_vars+version';
+ ($perl_version) = (`$cmd` =~ /version='(.*)'/);
+ }
+
+ return $perl_version if defined $perl_version;
+ return;
+}
+
+=pod
+
+=head2 $cb->_version_to_number( version => $version );
+
+Returns a proper module version, or '0.0' if none was available.
+
+=cut
+
+sub _version_to_number {
+ my $self = shift;
+ my %hash = @_;
+
+ my $version;
+ my $tmpl = {
+ version => { default => '0.0', store => \$version },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ return $version if $version =~ /^\.?\d/;
+ return '0.0';
+}
+
+=pod
+
+=head2 $cb->_whoami
+
+Returns the name of the subroutine you're currently in.
+
+=cut
+
+sub _whoami { my $name = (caller 1)[3]; $name =~ s/.+:://; $name }
+
+=pod
+
+=head2 _get_file_contents( file => $file );
+
+Returns the contents of a file
+
+=cut
+
+sub _get_file_contents {
+ my $self = shift;
+ my %hash = @_;
+
+ my $file;
+ my $tmpl = {
+ file => { required => 1, store => \$file }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my $fh = OPEN_FILE->($file) or return;
+ my $contents = do { local $/; <$fh> };
+
+ return $contents;
+}
+
+=pod $cb->_move( from => $file|$dir, to => $target );
+
+Moves a file or directory to the target.
+
+Returns true on success, false on failure.
+
+=cut
+
+sub _move {
+ my $self = shift;
+ my %hash = @_;
+
+ my $from; my $to;
+ my $tmpl = {
+ file => { required => 1, allow => [IS_FILE,IS_DIR],
+ store => \$from },
+ to => { required => 1, store => \$to }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ if( File::Copy::move( $from, $to ) ) {
+ return 1;
+ } else {
+ error(loc("Failed to move '%1' to '%2': %3", $from, $to, $!));
+ return;
+ }
+}
+
+=pod $cb->_copy( from => $file|$dir, to => $target );
+
+Moves a file or directory to the target.
+
+Returns true on success, false on failure.
+
+=cut
+
+sub _copy {
+ my $self = shift;
+ my %hash = @_;
+
+ my($from,$to);
+ my $tmpl = {
+ file =>{ required => 1, allow => [IS_FILE,IS_DIR],
+ store => \$from },
+ to => { required => 1, store => \$to }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ if( File::Copy::copy( $from, $to ) ) {
+ return 1;
+ } else {
+ error(loc("Failed to copy '%1' to '%2': %3", $from, $to, $!));
+ return;
+ }
+}
+
+=head2 $cb->_mode_plus_w( file => '/path/to/file' );
+
+Sets the +w bit for the file.
+
+Returns true on success, false on failure.
+
+=cut
+
+sub _mode_plus_w {
+ my $self = shift;
+ my %hash = @_;
+
+ require File::stat;
+
+ my $file;
+ my $tmpl = {
+ file => { required => 1, allow => IS_FILE, store => \$file },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### set the mode to +w for a file and +wx for a dir
+ my $x = File::stat::stat( $file );
+ my $mask = -d $file ? 0100 : 0200;
+
+ if( $x and chmod( $x->mode|$mask, $file ) ) {
+ return 1;
+
+ } else {
+ error(loc("Failed to '%1' '%2': '%3'", 'chmod +w', $file, $!));
+ return;
+ }
+}
+
+=head2 $uri = $cb->_host_to_uri( scheme => SCHEME, host => HOST, path => PATH );
+
+Turns a CPANPLUS::Config style C<host> entry into an URI string.
+
+Returns the uri on success, and false on failure
+
+=cut
+
+sub _host_to_uri {
+ my $self = shift;
+ my %hash = @_;
+
+ my($scheme, $host, $path);
+ my $tmpl = {
+ scheme => { required => 1, store => \$scheme },
+ host => { default => 'localhost', store => \$host },
+ path => { default => '', store => \$path },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### it's an URI, so unixify the path.
+ ### VMS has a special method for just that
+ $path = ON_VMS
+ ? VMS::Filespec::unixify($path)
+ : File::Spec::Unix->catdir( File::Spec->splitdir( $path ) );
+
+ return "$scheme://" . File::Spec::Unix->catdir( $host, $path );
+}
+
+=head2 $cb->_vcmp( VERSION, VERSION );
+
+Normalizes the versions passed and does a '<=>' on them, returning the result.
+
+=cut
+
+sub _vcmp {
+ my $self = shift;
+ my ($x, $y) = @_;
+
+ s/_//g foreach $x, $y;
+
+ return $x <=> $y;
+}
+
+=head2 $cb->_home_dir
+
+Returns the user's homedir, or C<cwd> if it could not be found
+
+=cut
+
+sub _home_dir {
+ my @os_home_envs = qw( APPDATA HOME USERPROFILE WINDIR SYS$LOGIN );
+
+ for my $env ( @os_home_envs ) {
+ next unless exists $ENV{ $env };
+ next unless defined $ENV{ $env } && length $ENV{ $env };
+ return $ENV{ $env } if -d $ENV{ $env };
+ }
+
+ return cwd();
+}
+
+=head2 $path = $cb->_safe_path( path => $path );
+
+Returns a path that's safe to us on Win32 and VMS.
+
+Only cleans up the path on Win32 if the path exists.
+
+On VMS, it encodes dots to _ using C<VMS::Filespec::vmsify>
+
+=cut
+
+sub _safe_path {
+ my $self = shift;
+
+ my %hash = @_;
+
+ my $path;
+ my $tmpl = {
+ path => { required => 1, store => \$path },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ if( ON_WIN32 ) {
+ ### only need to fix it up if there's spaces in the path
+ return $path unless $path =~ /\s+/;
+
+ ### clean up paths if we are on win32
+ return Win32::GetShortPathName( $path ) || $path;
+
+ } elsif ( ON_VMS ) {
+ ### XXX According to John Malmberg, there's an VMS issue:
+ ### catdir on VMS can not currently deal with directory components
+ ### with dots in them.
+ ### Fixing this is a a three step procedure, which will work for
+ ### VMS in its traditional ODS-2 mode, and it will also work if
+ ### VMS is in the ODS-5 mode that is being implemented.
+ ### If the path is already in VMS syntax, assume that we are done.
+
+ ### VMS format is a path with a trailing ']' or ':'
+ return $path if $path =~ /\:|\]$/;
+
+ ### 1. Make sure that the value to be converted, $path is
+ ### in UNIX directory syntax by appending a '/' to it.
+ $path .= '/' unless $path =~ m|/$|;
+
+ ### 2. Use VMS::Filespec::vmsify($path . '/') to convert the dots to
+ ### underscores if needed. The trailing '/' is needed as so that
+ ### C<vmsify> knows that it should use directory translation instead of
+ ### filename translation, as filename translation leaves one dot.
+ $path = VMS::Filespec::vmsify( $path );
+
+ ### 3. Use $path = File::Spec->splitdir( VMS::Filespec::vmsify(
+ ### $path . '/') to remove the directory delimiters.
+
+ ### From John Malmberg:
+ ### File::Spec->catdir will put the path back together.
+ ### The '/' trick only works if the string is a directory name
+ ### with UNIX style directory delimiters or no directory delimiters.
+ ### It is to force vmsify to treat the input specification as UNIX.
+ ###
+ ### There is a VMS::Filespec::unixpath() to do the appending of the '/'
+ ### to the specification, which will do a VMS::Filespec::vmsify()
+ ### if needed.
+ ### However it is not a good idea to call vmsify() on a pathname
+ ### returned by unixify(), and it is not a good idea to call unixify()
+ ### on a pathname returned by vmsify(). Because of the nature of the
+ ### conversion, not all file specifications can make the round trip.
+ ###
+ ### I think that directory specifications can safely make the round
+ ### trip, but not ones containing filenames.
+ $path = File::Spec->catdir( File::Spec->splitdir( $path ) )
+ }
+
+ return $path;
+}
+
+
+=head2 ($pkg, $version, $ext) = $cb->_split_package_string( package => PACKAGE_STRING );
+
+Splits the name of a CPAN package string up into its package, version
+and extension parts.
+
+For example, C<Foo-Bar-1.2.tar.gz> would return the following parts:
+
+ Package: Foo-Bar
+ Version: 1.2
+ Extension: tar.gz
+
+=cut
+
+{ my $del_re = qr/[-_\+]/i; # delimiter between elements
+ my $pkg_re = qr/[a-z] # any letters followed by
+ [a-z\d]* # any letters, numbers
+ (?i:\.pm)? # followed by '.pm'--authors do this :(
+ (?: # optionally repeating:
+ $del_re # followed by a delimiter
+ [a-z] # any letters followed by
+ [a-z\d]* # any letters, numbers
+ (?i:\.pm)? # followed by '.pm'--authors do this :(
+ )*
+ /xi;
+
+ my $ver_re = qr/[a-z]*\d*?[a-z]* # contains a digit and possibly letters
+ (?: # however, some start with a . only :(
+ [-._] # followed by a delimiter
+ [a-z\d]+ # and more digits and or letters
+ )*?
+ /xi;
+
+ my $ext_re = qr/[a-z] # a letter, followed by
+ [a-z\d]* # letters and or digits, optionally
+ (?:
+ \. # followed by a dot and letters
+ [a-z\d]+ # and or digits (like .tar.bz2)
+ )? # optionally
+ /xi;
+
+ my $ver_ext_re = qr/
+ ($ver_re+) # version, optional
+ (?:
+ \. # a literal .
+ ($ext_re) # extension,
+ )? # optional, but requires version
+ /xi;
+
+ ### composed regex for CPAN packages
+ my $full_re = qr/
+ ^
+ ( # the whole thing
+ ($pkg_re+) # package
+ (?:
+ $del_re # delimiter
+ $ver_ext_re # version + extension
+ )?
+ )
+ $
+ /xi;
+
+ ### composed regex for perl packages
+ my $perl = PERL_CORE;
+ my $perl_re = qr/
+ ^
+ ( # the whole thing
+ ($perl) # package name for 'perl'
+ (?:
+ $ver_ext_re # version + extension
+ )?
+ )
+ $
+ /xi;
+
+
+sub _split_package_string {
+ my $self = shift;
+ my %hash = @_;
+
+ my $str;
+ my $tmpl = { package => { required => 1, store => \$str } };
+ check( $tmpl, \%hash ) or return;
+
+
+ ### 2 different regexes, one for the 'perl' package,
+ ### one for ordinary CPAN packages.. try them both,
+ ### first match wins.
+ for my $re ( $full_re, $perl_re ) {
+
+ ### try the next if the match fails
+ $str =~ $re or next;
+
+ my $full = $1 || '';
+ my $pkg = $2 || '';
+ my $ver = $3 || '';
+ my $ext = $4 || '';
+
+ ### this regex resets the capture markers!
+ ### strip the trailing delimiter
+ $pkg =~ s/$del_re$//;
+
+ ### strip the .pm package suffix some authors insist on adding
+ $pkg =~ s/\.pm$//i;
+
+ return ($pkg, $ver, $ext, $full );
+ }
+
+ return;
+ }
+}
+
+{ my %escapes = map {
+ chr($_) => sprintf("%%%02X", $_)
+ } 0 .. 255;
+
+ sub _uri_encode {
+ my $self = shift;
+ my %hash = @_;
+
+ my $str;
+ my $tmpl = {
+ uri => { store => \$str, required => 1 }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### XXX taken straight from URI::Encode
+ ### Default unsafe characters. RFC 2732 ^(uric - reserved)
+ $str =~ s|([^A-Za-z0-9\-_.!~*'()])|$escapes{$1}|g;
+
+ return $str;
+ }
+
+
+ sub _uri_decode {
+ my $self = shift;
+ my %hash = @_;
+
+ my $str;
+ my $tmpl = {
+ uri => { store => \$str, required => 1 }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### XXX use unencode routine in utils?
+ $str =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+
+ return $str;
+ }
+}
+
+sub _update_timestamp {
+ my $self = shift;
+ my %hash = @_;
+
+ my $file;
+ my $tmpl = {
+ file => { required => 1, store => \$file, allow => FILE_EXISTS }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### `touch` the file, so windoze knows it's new -jmb
+ ### works on *nix too, good fix -Kane
+ ### make sure it is writable first, otherwise the `touch` will fail
+
+ my $now = time;
+ unless( chmod( 0644, $file) && utime ($now, $now, $file) ) {
+ error( loc("Couldn't touch %1", $file) );
+ return;
+ }
+
+ return 1;
+}
+
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Utils/Autoflush.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Utils/Autoflush.pm
new file mode 100755
index 00000000000..56566436a14
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Internals/Utils/Autoflush.pm
@@ -0,0 +1,5 @@
+package CPANPLUS::Internals::Utils::Autoflush;
+
+BEGIN { $|++ };
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module.pm
new file mode 100755
index 00000000000..2122c6d51f9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module.pm
@@ -0,0 +1,1816 @@
+package CPANPLUS::Module;
+
+use strict;
+use vars qw[@ISA];
+
+
+use CPANPLUS::Dist;
+use CPANPLUS::Error;
+use CPANPLUS::Module::Signature;
+use CPANPLUS::Module::Checksums;
+use CPANPLUS::Internals::Constants;
+
+use FileHandle;
+
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+use IPC::Cmd qw[can_run run];
+use File::Find qw[find];
+use Params::Check qw[check];
+use File::Basename qw[dirname];
+use Module::Load::Conditional qw[can_load check_install];
+
+$Params::Check::VERBOSE = 1;
+
+@ISA = qw[ CPANPLUS::Module::Signature CPANPLUS::Module::Checksums];
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Module
+
+=head1 SYNOPSIS
+
+ ### get a module object from the CPANPLUS::Backend object
+ my $mod = $cb->module_tree('Some::Module');
+
+ ### accessors
+ $mod->version;
+ $mod->package;
+
+ ### methods
+ $mod->fetch;
+ $mod->extract;
+ $mod->install;
+
+
+=head1 DESCRIPTION
+
+C<CPANPLUS::Module> creates objects from the information in the
+source files. These can then be used to query and perform actions
+on, like fetching or installing.
+
+These objects should only be created internally. For C<fake> objects,
+there's the C<CPANPLUS::Module::Fake> class. To obtain a module object
+consult the C<CPANPLUS::Backend> documentation.
+
+=cut
+
+my $tmpl = {
+ module => { default => '', required => 1 }, # full module name
+ version => { default => '0.0' }, # version number
+ path => { default => '', required => 1 }, # extended path on the
+ # cpan mirror, like
+ # /author/id/K/KA/KANE
+ comment => { default => ''}, # comment on module
+ package => { default => '', required => 1 }, # package name, like
+ # 'bar-baz-1.03.tgz'
+ description => { default => '' }, # description of the
+ # module
+ dslip => { default => EMPTY_DSLIP }, # dslip information
+ _id => { required => 1 }, # id of the Internals
+ # parent object
+ _status => { no_override => 1 }, # stores status object
+ author => { default => '', required => 1,
+ allow => IS_AUTHOBJ }, # module author
+ mtime => { default => '' },
+};
+
+### some of these will be resolved by wrapper functions that
+### do Clever Things to find the actual value, so don't create
+### an autogenerated sub for that just here, take an alternate
+### name to allow for a wrapper
+{ my %rename = (
+ dslip => '_dslip'
+ );
+
+ ### autogenerate accessors ###
+ for my $key ( keys %$tmpl ) {
+ no strict 'refs';
+
+ my $sub = $rename{$key} || $key;
+
+ *{__PACKAGE__."::$sub"} = sub {
+ $_[0]->{$key} = $_[1] if @_ > 1;
+ return $_[0]->{$key};
+ }
+ }
+}
+
+
+=pod
+
+=head1 CLASS METHODS
+
+=head2 accessors ()
+
+Returns a list of all accessor methods to the object
+
+=cut
+
+### *name is an alias, include it explicitly
+sub accessors { return ('name', keys %$tmpl) };
+
+=head1 ACCESSORS
+
+An objects of this class has the following accessors:
+
+=over 4
+
+=item name
+
+Name of the module.
+
+=item module
+
+Name of the module.
+
+=item version
+
+Version of the module. Defaults to '0.0' if none was provided.
+
+=item path
+
+Extended path on the mirror.
+
+=item comment
+
+Any comment about the module -- largely unused.
+
+=item package
+
+The name of the package.
+
+=item description
+
+Description of the module -- only registered modules have this.
+
+=item dslip
+
+The five character dslip string, that represents meta-data of the
+module -- again, only registered modules have this.
+
+=cut
+
+sub dslip {
+ my $self = shift;
+
+ ### if this module has relevant dslip info, return it
+ return $self->_dslip if $self->_dslip ne EMPTY_DSLIP;
+
+ ### if not, look at other modules in the same package,
+ ### see if *they* have any dslip info
+ for my $mod ( $self->contains ) {
+ return $mod->_dslip if $mod->_dslip ne EMPTY_DSLIP;
+ }
+
+ ### ok, really no dslip info found, return the default
+ return EMPTY_DSLIP;
+}
+
+
+=pod
+
+=item status
+
+The C<CPANPLUS::Module::Status> object associated with this object.
+(see below).
+
+=item author
+
+The C<CPANPLUS::Module::Author> object associated with this object.
+
+=item parent
+
+The C<CPANPLUS::Internals> object that spawned this module object.
+
+=back
+
+=cut
+
+### Alias ->name to ->module, for human beings.
+*name = *module;
+
+sub parent {
+ my $self = shift;
+ my $obj = CPANPLUS::Internals->_retrieve_id( $self->_id );
+
+ return $obj;
+}
+
+=head1 STATUS ACCESSORS
+
+C<CPANPLUS> caches a lot of results from method calls and saves data
+it collected along the road for later reuse.
+
+C<CPANPLUS> uses this internally, but it is also available for the end
+user. You can get a status object by calling:
+
+ $modobj->status
+
+You can then query the object as follows:
+
+=over 4
+
+=item installer_type
+
+The installer type used for this distribution. Will be one of
+'makemaker' or 'build'. This determines whether C<CPANPLUS::Dist::MM>
+or C<CPANPLUS::Dist::Build> will be used to build this distribution.
+
+=item dist_cpan
+
+The dist object used to do the CPAN-side of the installation. Either
+a C<CPANPLUS::Dist::MM> or C<CPANPLUS::Dist::Build> object.
+
+=item dist
+
+The custom dist object used to do the operating specific side of the
+installation, if you've chosen to use this. For example, if you've
+chosen to install using the C<ports> format, this may be a
+C<CPANPLUS::Dist::Ports> object.
+
+Undefined if you didn't specify a separate format to install through.
+
+=item prereqs | requires
+
+A hashref of prereqs this distribution was found to have. Will look
+something like this:
+
+ { Carp => 0.01, strict => 0 }
+
+Might be undefined if the distribution didn't have any prerequisites.
+
+=item configure_requires
+
+Like prereqs, but these are necessary to be installed before the
+build process can even begin.
+
+=item signature
+
+Flag indicating, if a signature check was done, whether it was OK or
+not.
+
+=item extract
+
+The directory this distribution was extracted to.
+
+=item fetch
+
+The location this distribution was fetched to.
+
+=item readme
+
+The text of this distributions README file.
+
+=item uninstall
+
+Flag indicating if an uninstall call was done successfully.
+
+=item created
+
+Flag indicating if the C<create> call to your dist object was done
+successfully.
+
+=item installed
+
+Flag indicating if the C<install> call to your dist object was done
+successfully.
+
+=item checksums
+
+The location of this distributions CHECKSUMS file.
+
+=item checksum_ok
+
+Flag indicating if the checksums check was done successfully.
+
+=item checksum_value
+
+The checksum value this distribution is expected to have
+
+=back
+
+=head1 METHODS
+
+=head2 $self = CPANPLUS::Module->new( OPTIONS )
+
+This method returns a C<CPANPLUS::Module> object. Normal users
+should never call this method directly, but instead use the
+C<CPANPLUS::Backend> to obtain module objects.
+
+This example illustrates a C<new()> call with all required arguments:
+
+ CPANPLUS::Module->new(
+ module => 'Foo',
+ path => 'authors/id/A/AA/AAA',
+ package => 'Foo-1.0.tgz',
+ author => $author_object,
+ _id => INTERNALS_OBJECT_ID,
+ );
+
+Every accessor is also a valid option to pass to C<new>.
+
+Returns a module object on success and false on failure.
+
+=cut
+
+
+sub new {
+ my($class, %hash) = @_;
+
+ ### don't check the template for sanity
+ ### -- we know it's good and saves a lot of performance
+ local $Params::Check::SANITY_CHECK_TEMPLATE = 0;
+
+ my $object = check( $tmpl, \%hash ) or return;
+
+ bless $object, $class;
+
+ return $object;
+}
+
+### only create status objects when they're actually asked for
+sub status {
+ my $self = shift;
+ return $self->_status if $self->_status;
+
+ my $acc = Object::Accessor->new;
+ $acc->mk_accessors( qw[ installer_type dist_cpan dist prereqs
+ signature extract fetch readme uninstall
+ created installed prepared checksums files
+ checksum_ok checksum_value _fetch_from
+ configure_requires
+ ] );
+
+ ### create an alias from 'requires' to 'prereqs', so it's more in
+ ### line with 'configure_requires';
+ $acc->mk_aliases( requires => 'prereqs' );
+
+ $self->_status( $acc );
+
+ return $self->_status;
+}
+
+
+### flush the cache of this object ###
+sub _flush {
+ my $self = shift;
+ $self->status->mk_flush;
+ return 1;
+}
+
+=head2 $mod->package_name( [$package_string] )
+
+Returns the name of the package a module is in. For C<Acme::Bleach>
+that might be C<Acme-Bleach>.
+
+=head2 $mod->package_version( [$package_string] )
+
+Returns the version of the package a module is in. For a module
+in the package C<Acme-Bleach-1.1.tar.gz> this would be C<1.1>.
+
+=head2 $mod->package_extension( [$package_string] )
+
+Returns the suffix added by the compression method of a package a
+certain module is in. For a module in C<Acme-Bleach-1.1.tar.gz>, this
+would be C<tar.gz>.
+
+=head2 $mod->package_is_perl_core
+
+Returns a boolean indicating of the package a particular module is in,
+is actually a core perl distribution.
+
+=head2 $mod->module_is_supplied_with_perl_core( [version => $]] )
+
+Returns a boolean indicating whether C<ANY VERSION> of this module
+was supplied with the current running perl's core package.
+
+=head2 $mod->is_bundle
+
+Returns a boolean indicating if the module you are looking at, is
+actually a bundle. Bundles are identified as modules whose name starts
+with C<Bundle::>.
+
+=head2 $mod->is_autobundle;
+
+Returns a boolean indicating if the module you are looking at, is
+actually an autobundle as generated by C<< $cb->autobundle >>.
+
+=head2 $mod->is_third_party
+
+Returns a boolean indicating whether the package is a known third-party
+module (i.e. it's not provided by the standard Perl distribution and
+is not available on the CPAN, but on a third party software provider).
+See L<Module::ThirdParty> for more details.
+
+=head2 $mod->third_party_information
+
+Returns a reference to a hash with more information about a third-party
+module. See the documentation about C<module_information()> in
+L<Module::ThirdParty> for more details.
+
+=cut
+
+{ ### fetches the test reports for a certain module ###
+ my %map = (
+ name => 0,
+ version => 1,
+ extension => 2,
+ );
+
+ while ( my($type, $index) = each %map ) {
+ my $name = 'package_' . $type;
+
+ no strict 'refs';
+ *$name = sub {
+ my $self = shift;
+ my $val = shift || $self->package;
+ my @res = $self->parent->_split_package_string( package => $val );
+
+ ### return the corresponding index from the result
+ return $res[$index] if @res;
+ return;
+ };
+ }
+
+ sub package_is_perl_core {
+ my $self = shift;
+ my $cb = $self->parent;
+
+ ### check if the package looks like a perl core package
+ return 1 if $self->package_name eq PERL_CORE;
+
+ ### address #44562: ::Module->package_is_perl_code : problem comparing
+ ### version strings -- use $cb->_vcmp to avoid warnings when version
+ ### have _ in them
+
+ my $core = $self->module_is_supplied_with_perl_core;
+ ### ok, so it's found in the core, BUT it could be dual-lifed
+ if ($core) {
+ ### if the package is newer than installed, then it's dual-lifed
+ return if $cb->_vcmp($self->version, $self->installed_version) > 0;
+
+ ### if the package is newer or equal to the corelist,
+ ### then it's dual-lifed
+ return if $cb->_vcmp( $self->version, $core ) >= 0;
+
+ ### otherwise, it's older than corelist, thus unsuitable.
+ return 1;
+ }
+
+ ### not in corelist, not a perl core package.
+ return;
+ }
+
+ sub module_is_supplied_with_perl_core {
+ my $self = shift;
+ my $ver = shift || $];
+
+ ### allow it to be called as a package function as well like:
+ ### CPANPLUS::Module::module_is_supplied_with_perl_core('Config')
+ ### so that we can check the status of modules that aren't released
+ ### to CPAN, but are part of the core.
+ my $name = ref $self ? $self->module : $self;
+
+ ### check Module::CoreList to see if it's a core package
+ require Module::CoreList;
+
+ ### Address #41157: Module::module_is_supplied_with_perl_core()
+ ### broken for perl 5.10: Module::CoreList's version key for the
+ ### hash has a different number of trailing zero than $] aka
+ ### $PERL_VERSION.
+ my $core = $Module::CoreList::version{ 0+$ver }->{ $name };
+
+ return $core;
+ }
+
+ ### make sure Bundle-Foo also gets flagged as bundle
+ sub is_bundle {
+ my $self = shift;
+
+ ### cpan'd bundle
+ return 1 if $self->module =~ /^bundle(?:-|::)/i;
+
+ ### autobundle
+ return 1 if $self->is_autobundle;
+
+ ### neither
+ return;
+ }
+
+ ### full path to a generated autobundle
+ sub is_autobundle {
+ my $self = shift;
+ my $conf = $self->parent->configure_object;
+ my $prefix = $conf->_get_build('autobundle_prefix');
+
+ return 1 if $self->module eq $prefix;
+ return;
+ }
+
+ sub is_third_party {
+ my $self = shift;
+
+ return unless can_load( modules => { 'Module::ThirdParty' => 0 } );
+
+ return Module::ThirdParty::is_3rd_party( $self->name );
+ }
+
+ sub third_party_information {
+ my $self = shift;
+
+ return unless $self->is_third_party;
+
+ return Module::ThirdParty::module_information( $self->name );
+ }
+}
+
+=pod
+
+=head2 $clone = $self->clone
+
+Clones the current module object for tinkering with.
+It will have a clean C<CPANPLUS::Module::Status> object, as well as
+a fake C<CPANPLUS::Module::Author> object.
+
+=cut
+
+{ ### accessors dont change during run time, so only compute once
+ my @acc = grep !/status/, __PACKAGE__->accessors();
+
+ sub clone {
+ my $self = shift;
+
+ ### clone the object ###
+ my %data = map { $_ => $self->$_ } @acc;
+
+ my $obj = CPANPLUS::Module::Fake->new( %data );
+
+ return $obj;
+ }
+}
+
+=pod
+
+=head2 $where = $self->fetch
+
+Fetches the module from a CPAN mirror.
+Look at L<CPANPLUS::Internals::Fetch::_fetch()> for details on the
+options you can pass.
+
+=cut
+
+sub fetch {
+ my $self = shift;
+ my $cb = $self->parent;
+
+ ### custom args
+ my %args = ( module => $self );
+
+ ### if a custom fetch location got specified before, add that here
+ $args{fetch_from} = $self->status->_fetch_from
+ if $self->status->_fetch_from;
+
+ my $where = $cb->_fetch( @_, %args ) or return;
+
+ ### do an md5 check ###
+ if( !$self->status->_fetch_from and
+ $cb->configure_object->get_conf('md5') and
+ $self->package ne CHECKSUMS
+ ) {
+ unless( $self->_validate_checksum ) {
+ error( loc( "Checksum error for '%1' -- will not trust package",
+ $self->package) );
+ return;
+ }
+ }
+
+ return $where;
+}
+
+=pod
+
+=head2 $path = $self->extract
+
+Extracts the fetched module.
+Look at L<CPANPLUS::Internals::Extract::_extract()> for details on
+the options you can pass.
+
+=cut
+
+sub extract {
+ my $self = shift;
+ my $cb = $self->parent;
+
+ unless( $self->status->fetch ) {
+ error( loc( "You have not fetched '%1' yet -- cannot extract",
+ $self->module) );
+ return;
+ }
+
+ ### can't extract these, so just use the basedir for the file
+ if( $self->is_autobundle ) {
+
+ ### this is expected to be set after an extract call
+ $self->get_installer_type;
+
+ return $self->status->extract( dirname( $self->status->fetch ) );
+ }
+
+ return $cb->_extract( @_, module => $self );
+}
+
+=head2 $type = $self->get_installer_type([prefer_makefile => BOOL])
+
+Gets the installer type for this module. This may either be C<build> or
+C<makemaker>. If C<Module::Build> is unavailable or no installer type
+is available, it will fall back to C<makemaker>. If both are available,
+it will pick the one indicated by your config, or by the
+C<prefer_makefile> option you can pass to this function.
+
+Returns the installer type on success, and false on error.
+
+=cut
+
+sub get_installer_type {
+ my $self = shift;
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my ($prefer_makefile,$verbose);
+ my $tmpl = {
+ prefer_makefile => { default => $conf->get_conf('prefer_makefile'),
+ store => \$prefer_makefile, allow => BOOLEANS },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my $type;
+
+ ### autobundles use their own installer, so return that
+ if( $self->is_autobundle ) {
+ $type = INSTALLER_AUTOBUNDLE;
+
+ } else {
+ my $extract = $self->status->extract();
+ unless( $extract ) {
+ error(loc(
+ "Cannot determine installer type of unextracted module '%1'",
+ $self->module
+ ));
+ return;
+ }
+
+ ### check if it's a makemaker or a module::build type dist ###
+ my $found_build = -e BUILD_PL->( $extract );
+ my $found_makefile = -e MAKEFILE_PL->( $extract );
+
+ $type = INSTALLER_BUILD if !$prefer_makefile && $found_build;
+ $type = INSTALLER_BUILD if $found_build && !$found_makefile;
+ $type = INSTALLER_MM if $prefer_makefile && $found_makefile;
+ $type = INSTALLER_MM if $found_makefile && !$found_build;
+ }
+
+ ### ok, so it's a 'build' installer, but you don't /have/ module build
+ ### XXX duplicated from CPANPLUS::Selfupdate. fix somehow?
+ if( $type and $type eq INSTALLER_BUILD and (
+ not CPANPLUS::Dist->has_dist_type( INSTALLER_BUILD )
+ or not $cb->module_tree( INSTALLER_BUILD )
+ ->is_uptodate( version => '0.24' )
+ ) ) {
+
+ ### XXX this is for recording purposes only. We *have* to install
+ ### these before even creating a dist object, or we'll get an error
+ ### saying 'no such dist type';
+ ### XXX duplicated from CPANPLUS::Selfupdate. fix somehow?
+ my $href = $self->status->configure_requires || {};
+ my $deps = { INSTALLER_BUILD, '0.24', %$href };
+
+ $self->status->configure_requires( $deps );
+
+ msg(loc("This module requires '%1' and '%2' to be installed first. ".
+ "Adding these modules to your prerequisites list",
+ 'Module::Build', INSTALLER_BUILD
+ ), $verbose );
+
+
+ ### ok, actually we found neither ###
+ } elsif ( !$type ) {
+ error( loc( "Unable to find '%1' or '%2' for '%3'; ".
+ "Will default to '%4' but might be unable ".
+ "to install!", BUILD_PL->(), MAKEFILE_PL->(),
+ $self->module, INSTALLER_MM ) );
+ $type = INSTALLER_MM;
+ }
+
+ return $self->status->installer_type( $type ) if $type;
+ return;
+}
+
+=pod
+
+=head2 $dist = $self->dist([target => 'prepare|create', format => DISTRIBUTION_TYPE, args => {key => val}]);
+
+Create a distribution object, ready to be installed.
+Distribution type defaults to your config settings
+
+The optional C<args> hashref is passed on to the specific distribution
+types' C<create> method after being dereferenced.
+
+Returns a distribution object on success, false on failure.
+
+See C<CPANPLUS::Dist> for details.
+
+=cut
+
+sub dist {
+ my $self = shift;
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ ### have you determined your installer type yet? if not, do it here,
+ ### we need the info
+ $self->get_installer_type unless $self->status->installer_type;
+
+ my($type,$args,$target);
+ my $tmpl = {
+ format => { default => $conf->get_conf('dist_type') ||
+ $self->status->installer_type,
+ store => \$type },
+ target => { default => TARGET_CREATE, store => \$target },
+ args => { default => {}, store => \$args },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### ok, check for $type. Do we have it?
+ unless( CPANPLUS::Dist->has_dist_type( $type ) ) {
+
+ ### ok, we don't have it. Is it C::D::Build? if so we can install the
+ ### whole thing now
+ ### XXX we _could_ do this for any type we dont have actually...
+ if( $type eq INSTALLER_BUILD ) {
+ msg(loc("Bootstrapping installer '%1'", $type));
+
+ ### don't propagate the format, it's the one we're trying to
+ ### bootstrap, so it'll be an infinite loop if we do
+
+ $cb->module_tree( $type )->install( target => $target, %$args ) or
+ do {
+ error(loc("Could not bootstrap installer '%1' -- ".
+ "can not continue", $type));
+ return;
+ };
+
+ ### re-scan for available modules now
+ CPANPLUS::Dist->rescan_dist_types;
+
+ unless( CPANPLUS::Dist->has_dist_type( $type ) ) {
+ error(loc("Newly installed installer type '%1' should be ".
+ "available, but is not! -- aborting", $type));
+ return;
+ } else {
+ msg(loc("Installer '%1' succesfully bootstrapped", $type));
+ }
+
+ ### some other plugin you dont have. Abort
+ } else {
+ error(loc("Installer type '%1' not found. Please verify your ".
+ "installation -- aborting", $type ));
+ return;
+ }
+ }
+
+ ### make sure we don't overwrite it, just in case we came
+ ### back from a ->save_state. This allows restoration to
+ ### work correctly
+ my( $dist, $dist_cpan );
+
+ unless( $dist = $self->status->dist ) {
+ $dist = $type->new( module => $self ) or return;
+ $self->status->dist( $dist );
+ }
+
+ unless( $dist_cpan = $self->status->dist_cpan ) {
+
+ $dist_cpan = $type eq $self->status->installer_type
+ ? $self->status->dist
+ : $self->status->installer_type->new( module => $self );
+
+
+ $self->status->dist_cpan( $dist_cpan );
+ }
+
+
+ DIST: {
+ ### just wanted the $dist object?
+ last DIST if $target eq TARGET_INIT;
+
+ ### first prepare the dist
+ $dist->prepare( %$args ) or return;
+ $self->status->prepared(1);
+
+ ### you just wanted us to prepare?
+ last DIST if $target eq TARGET_PREPARE;
+
+ $dist->create( %$args ) or return;
+ $self->status->created(1);
+ }
+
+ return $dist;
+}
+
+=pod
+
+=head2 $bool = $mod->prepare( )
+
+Convenience method around C<install()> that prepares a module
+without actually building it. This is equivalent to invoking C<install>
+with C<target> set to C<prepare>
+
+Returns true on success, false on failure.
+
+=cut
+
+sub prepare {
+ my $self = shift;
+ return $self->install( @_, target => TARGET_PREPARE );
+}
+
+=head2 $bool = $mod->create( )
+
+Convenience method around C<install()> that creates a module.
+This is equivalent to invoking C<install> with C<target> set to
+C<create>
+
+Returns true on success, false on failure.
+
+=cut
+
+sub create {
+ my $self = shift;
+ return $self->install( @_, target => TARGET_CREATE );
+}
+
+=head2 $bool = $mod->test( )
+
+Convenience wrapper around C<install()> that tests a module, without
+installing it.
+It's the equivalent to invoking C<install()> with C<target> set to
+C<create> and C<skiptest> set to C<0>.
+
+Returns true on success, false on failure.
+
+=cut
+
+sub test {
+ my $self = shift;
+ return $self->install( @_, target => TARGET_CREATE, skiptest => 0 );
+}
+
+=pod
+
+=head2 $bool = $self->install([ target => 'init|prepare|create|install', format => FORMAT_TYPE, extractdir => DIRECTORY, fetchdir => DIRECTORY, prefer_bin => BOOL, force => BOOL, verbose => BOOL, ..... ]);
+
+Installs the current module. This includes fetching it and extracting
+it, if this hasn't been done yet, as well as creating a distribution
+object for it.
+
+This means you can pass it more arguments than described above, which
+will be passed on to the relevant methods as they are called.
+
+See C<CPANPLUS::Internals::Fetch>, C<CPANPLUS::Internals::Extract> and
+C<CPANPLUS::Dist> for details.
+
+Returns true on success, false on failure.
+
+=cut
+
+sub install {
+ my $self = shift;
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $args; my $target; my $format;
+ { ### so we can use the rest of the args to the create calls etc ###
+ local $Params::Check::NO_DUPLICATES = 1;
+ local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ ### targets 'dist' and 'test' are now completely ignored ###
+ my $tmpl = {
+ ### match this allow list with Dist->_resolve_prereqs
+ target => { default => TARGET_INSTALL, store => \$target,
+ allow => [TARGET_PREPARE, TARGET_CREATE,
+ TARGET_INSTALL, TARGET_INIT ] },
+ force => { default => $conf->get_conf('force'), },
+ verbose => { default => $conf->get_conf('verbose'), },
+ format => { default => $conf->get_conf('dist_type'),
+ store => \$format },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+
+ ### if this target isn't 'install', we will need to at least 'create'
+ ### every prereq, so it can build
+ ### XXX prereq_target of 'prepare' will do weird things here, and is
+ ### not supported.
+ $args->{'prereq_target'} ||= TARGET_CREATE if $target ne TARGET_INSTALL;
+
+ ### check if it's already upto date ###
+ if( $target eq TARGET_INSTALL and !$args->{'force'} and
+ !$self->package_is_perl_core() and # separate rules apply
+ ( $self->status->installed() or $self->is_uptodate ) and
+ !INSTALL_VIA_PACKAGE_MANAGER->($format)
+ ) {
+ msg(loc("Module '%1' already up to date, won't install without force",
+ $self->module), $args->{'verbose'} );
+ return $self->status->installed(1);
+ }
+
+ # if it's a non-installable core package, abort the install.
+ if( $self->package_is_perl_core() ) {
+ # if the installed is newer, say so.
+ if( $self->installed_version > $self->version ) {
+ error(loc("The core Perl %1 module '%2' (%3) is more ".
+ "recent than the latest release on CPAN (%4). ".
+ "Aborting install.",
+ $], $self->module, $self->installed_version,
+ $self->version ) );
+ # if the installed matches, say so.
+ } elsif( $self->installed_version == $self->version ) {
+ error(loc("The core Perl %1 module '%2' (%3) can only ".
+ "be installed by Perl itself. ".
+ "Aborting install.",
+ $], $self->module, $self->installed_version ) );
+ # otherwise, the installed is older; say so.
+ } else {
+ error(loc("The core Perl %1 module '%2' can only be ".
+ "upgraded from %3 to %4 by Perl itself (%5). ".
+ "Aborting install.",
+ $], $self->module, $self->installed_version,
+ $self->version, $self->package ) );
+ }
+ return;
+
+ ### it might be a known 3rd party module
+ } elsif ( $self->is_third_party ) {
+ my $info = $self->third_party_information;
+ error(loc(
+ "%1 is a known third-party module.\n\n".
+ "As it isn't available on the CPAN, CPANPLUS can't install " .
+ "it automatically. Therefore you need to install it manually " .
+ "before proceeding.\n\n".
+ "%2 is part of %3, published by %4, and should be available ".
+ "for download at the following address:\n\t%5",
+ $self->name, $self->name, $info->{name}, $info->{author},
+ $info->{url}
+ ));
+
+ return;
+ }
+
+ ### fetch it if need be ###
+ unless( $self->status->fetch ) {
+ my $params;
+ for (qw[prefer_bin fetchdir]) {
+ $params->{$_} = $args->{$_} if exists $args->{$_};
+ }
+ for (qw[force verbose]) {
+ $params->{$_} = $args->{$_} if defined $args->{$_};
+ }
+ $self->fetch( %$params ) or return;
+ }
+
+ ### extract it if need be ###
+ unless( $self->status->extract ) {
+ my $params;
+ for (qw[prefer_bin extractdir]) {
+ $params->{$_} = $args->{$_} if exists $args->{$_};
+ }
+ for (qw[force verbose]) {
+ $params->{$_} = $args->{$_} if defined $args->{$_};
+ }
+ $self->extract( %$params ) or return;
+ }
+
+ $args->{'prereq_format'} = $format if $format;
+ $format ||= $self->status->installer_type;
+
+ unless( $format ) {
+ error( loc( "Don't know what installer to use; " .
+ "Couldn't find either '%1' or '%2' in the extraction " .
+ "directory '%3' -- will be unable to install",
+ BUILD_PL->(), MAKEFILE_PL->(), $self->status->extract ) );
+
+ $self->status->installed(0);
+ return;
+ }
+
+
+ ### do SIGNATURE checks? ###
+ ### XXX check status and not recheck EVERY time?
+ if( $conf->get_conf('signature') ) {
+ unless( $self->check_signature( verbose => $args->{verbose} ) ) {
+ error( loc( "Signature check failed for module '%1' ".
+ "-- Not trusting this module, aborting install",
+ $self->module ) );
+ $self->status->signature(0);
+
+ ### send out test report on broken sig
+ if( $conf->get_conf('cpantest') ) {
+ $cb->_send_report(
+ module => $self,
+ failed => 1,
+ buffer => CPANPLUS::Error->stack_as_string,
+ verbose => $args->{verbose},
+ force => $args->{force},
+ ) or error(loc("Failed to send test report for '%1'",
+ $self->module ) );
+ }
+
+ return;
+
+ } else {
+ ### signature OK ###
+ $self->status->signature(1);
+ }
+ }
+
+ ### a target of 'create' basically means not to run make test ###
+ ### eh, no it /doesn't/.. skiptest => 1 means skiptest => 1.
+ #$args->{'skiptest'} = 1 if $target eq 'create';
+
+ ### bundle rules apply ###
+ if( $self->is_bundle ) {
+ ### check what we need to install ###
+ my @prereqs = $self->bundle_modules();
+ unless( @prereqs ) {
+ error( loc( "Bundle '%1' does not specify any modules to install",
+ $self->module ) );
+
+ ### XXX mark an error here? ###
+ }
+ }
+
+ my $dist = $self->dist( format => $format,
+ target => $target,
+ args => $args );
+ unless( $dist ) {
+ error( loc( "Unable to create a new distribution object for '%1' " .
+ "-- cannot continue", $self->module ) );
+ return;
+ }
+
+ return 1 if $target ne TARGET_INSTALL;
+
+ my $ok = $dist->install( %$args ) ? 1 : 0;
+
+ $self->status->installed($ok);
+
+ return 1 if $ok;
+ return;
+}
+
+=pod @list = $self->bundle_modules()
+
+Returns a list of module objects the Bundle specifies.
+
+This requires you to have extracted the bundle already, using the
+C<extract()> method.
+
+Returns false on error.
+
+=cut
+
+sub bundle_modules {
+ my $self = shift;
+ my $cb = $self->parent;
+
+ unless( $self->is_bundle ) {
+ error( loc("'%1' is not a bundle", $self->module ) );
+ return;
+ }
+
+ my @files;
+
+ ### autobundles are special files generated by CPANPLUS. If we can
+ ### read the file, we can determine the prereqs
+ if( $self->is_autobundle ) {
+ my $where;
+ unless( $where = $self->status->fetch ) {
+ error(loc("Don't know where '%1' was fetched to", $self->package));
+ return;
+ }
+
+ push @files, $where
+
+ ### regular bundle::* upload
+ } else {
+ my $dir;
+ unless( $dir = $self->status->extract ) {
+ error(loc("Don't know where '%1' was extracted to", $self->module));
+ return;
+ }
+
+ find( {
+ wanted => sub { push @files, File::Spec->rel2abs($_) if /\.pm/i },
+ no_chdir => 1,
+ }, $dir );
+ }
+
+ my $prereqs = {}; my @list; my $seen = {};
+ for my $file ( @files ) {
+ my $fh = FileHandle->new($file)
+ or( error(loc("Could not open '%1' for reading: %2",
+ $file,$!)), next );
+
+ my $flag;
+ while( local $_ = <$fh> ) {
+ ### quick hack to read past the header of the file ###
+ last if $flag && m|^=head|i;
+
+ ### from perldoc cpan:
+ ### =head1 CONTENTS
+ ### In this pod section each line obeys the format
+ ### Module_Name [Version_String] [- optional text]
+ $flag = 1 if m|^=head1 CONTENTS|i;
+
+ if ($flag && /^(?!=)(\S+)\s*(\S+)?/) {
+ my $module = $1;
+ my $version = $cb->_version_to_number( version => $2 );
+
+ my $obj = $cb->module_tree($module);
+
+ unless( $obj ) {
+ error(loc("Cannot find bundled module '%1'", $module),
+ loc("-- it does not seem to exist") );
+ next;
+ }
+
+ ### make sure we list no duplicates ###
+ unless( $seen->{ $obj->module }++ ) {
+ push @list, $obj;
+ $prereqs->{ $module } =
+ $cb->_version_to_number( version => $version );
+ }
+ }
+ }
+ }
+
+ ### store the prereqs we just found ###
+ $self->status->prereqs( $prereqs );
+
+ return @list;
+}
+
+=pod
+
+=head2 $text = $self->readme
+
+Fetches the readme belonging to this module and stores it under
+C<< $obj->status->readme >>. Returns the readme as a string on
+success and returns false on failure.
+
+=cut
+
+sub readme {
+ my $self = shift;
+ my $conf = $self->parent->configure_object;
+
+ ### did we already dl the readme once? ###
+ return $self->status->readme() if $self->status->readme();
+
+ ### this should be core ###
+ return unless can_load( modules => { FileHandle => '0.0' },
+ verbose => 1,
+ );
+
+ ### get a clone of the current object, with a fresh status ###
+ my $obj = $self->clone or return;
+
+ ### munge the package name
+ my $pkg = README->( $obj );
+ $obj->package($pkg);
+
+ my $file;
+ { ### disable checksum fetches on readme downloads
+
+ my $tmp = $conf->get_conf( 'md5' );
+ $conf->set_conf( md5 => 0 );
+
+ $file = $obj->fetch;
+
+ $conf->set_conf( md5 => $tmp );
+
+ return unless $file;
+ }
+
+ ### read the file into a scalar, to store in the original object ###
+ my $fh = new FileHandle;
+ unless( $fh->open($file) ) {
+ error( loc( "Could not open file '%1': %2", $file, $! ) );
+ return;
+ }
+
+ my $in = do{ local $/; <$fh> };
+ $fh->close;
+
+ return $self->status->readme( $in );
+}
+
+=pod
+
+=head2 $version = $self->installed_version()
+
+Returns the currently installed version of this module, if any.
+
+=head2 $where = $self->installed_file()
+
+Returns the location of the currently installed file of this module,
+if any.
+
+=head2 $dir = $self->installed_dir()
+
+Returns the directory (or more accurately, the C<@INC> handle) from
+which this module was loaded, if any.
+
+=head2 $bool = $self->is_uptodate([version => VERSION_NUMBER])
+
+Returns a boolean indicating if this module is uptodate or not.
+
+=cut
+
+### uptodate/installed functions
+{ my $map = { # hashkey, alternate rv
+ installed_version => ['version', 0 ],
+ installed_file => ['file', ''],
+ installed_dir => ['dir', ''],
+ is_uptodate => ['uptodate', 0 ],
+ };
+
+ while( my($method, $aref) = each %$map ) {
+ my($key,$alt_rv) = @$aref;
+
+ no strict 'refs';
+ *$method = sub {
+ ### never use the @INC hooks to find installed versions of
+ ### modules -- they're just there in case they're not on the
+ ### perl install, but the user shouldn't trust them for *other*
+ ### modules!
+ ### XXX CPANPLUS::inc is now obsolete, so this should not
+ ### be needed anymore
+ #local @INC = CPANPLUS::inc->original_inc;
+
+ my $self = shift;
+
+ ### make sure check_install is not looking in %INC, as
+ ### that may contain some of our sneakily loaded modules
+ ### that aren't installed as such. -- kane
+ local $Module::Load::Conditional::CHECK_INC_HASH = 0;
+ ### this should all that is required for deprecated core modules
+ local $Module::Load::Conditional::DEPRECATED = 1;
+ my $href = check_install(
+ module => $self->module,
+ version => $self->version,
+ @_,
+ );
+
+ return $href->{$key} || $alt_rv;
+ }
+ }
+}
+
+
+
+=pod
+
+=head2 $href = $self->details()
+
+Returns a hashref with key/value pairs offering more information about
+a particular module. For example, for C<Time::HiRes> it might look like
+this:
+
+ Author Jarkko Hietaniemi (jhi@iki.fi)
+ Description High resolution time, sleep, and alarm
+ Development Stage Released
+ Installed File /usr/local/perl/lib/Time/Hires.pm
+ Interface Style plain Functions, no references used
+ Language Used C and perl, a C compiler will be needed
+ Package Time-HiRes-1.65.tar.gz
+ Public License Unknown
+ Support Level Developer
+ Version Installed 1.52
+ Version on CPAN 1.65
+
+=cut
+
+sub details {
+ my $self = shift;
+ my $conf = $self->parent->configure_object();
+ my $cb = $self->parent;
+ my %hash = @_;
+
+ my $res = {
+ Author => loc("%1 (%2)", $self->author->author(),
+ $self->author->email() ),
+ Package => $self->package,
+ Description => $self->description || loc('None given'),
+ 'Version on CPAN' => $self->version,
+ };
+
+ ### check if we have the module installed
+ ### if so, add version have and version on cpan
+ $res->{'Version Installed'} = $self->installed_version
+ if $self->installed_version;
+ $res->{'Installed File'} = $self->installed_file if $self->installed_file;
+
+ my $i = 0;
+ for my $item( split '', $self->dslip ) {
+ $res->{ $cb->_dslip_defs->[$i]->[0] } =
+ $cb->_dslip_defs->[$i]->[1]->{$item} || loc('Unknown');
+ $i++;
+ }
+
+ return $res;
+}
+
+=head2 @list = $self->contains()
+
+Returns a list of module objects that represent the modules also
+present in the package of this module.
+
+For example, for C<Archive::Tar> this might return:
+
+ Archive::Tar
+ Archive::Tar::Constant
+ Archive::Tar::File
+
+=cut
+
+sub contains {
+ my $self = shift;
+ my $cb = $self->parent;
+ my $pkg = $self->package;
+
+ my @mods = $cb->search( type => 'package', allow => [qr/^$pkg$/] );
+
+ return @mods;
+}
+
+=pod
+
+=head2 @list_of_hrefs = $self->fetch_report()
+
+This function queries the CPAN testers database at
+I<http://testers.cpan.org/> for test results of specified module
+objects, module names or distributions.
+
+Look at L<CPANPLUS::Internals::Report::_query_report()> for details on
+the options you can pass and the return value to expect.
+
+=cut
+
+sub fetch_report {
+ my $self = shift;
+ my $cb = $self->parent;
+
+ return $cb->_query_report( @_, module => $self );
+}
+
+=pod
+
+=head2 $bool = $self->uninstall([type => [all|man|prog])
+
+This function uninstalls the specified module object.
+
+You can install 2 types of files, either C<man> pages or C<prog>ram
+files. Alternately you can specify C<all> to uninstall both (which
+is the default).
+
+Returns true on success and false on failure.
+
+Do note that this does an uninstall via the so-called C<.packlist>,
+so if you used a module installer like say, C<ports> or C<apt>, you
+should not use this, but use your package manager instead.
+
+=cut
+
+sub uninstall {
+ my $self = shift;
+ my $conf = $self->parent->configure_object();
+ my %hash = @_;
+
+ my ($type,$verbose);
+ my $tmpl = {
+ type => { default => 'all', allow => [qw|man prog all|],
+ store => \$type },
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ force => { default => $conf->get_conf('force') },
+ };
+
+ ### XXX add a warning here if your default install dist isn't
+ ### makefile or build -- that means you are using a package manager
+ ### and this will not do what you think!
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ if( $conf->get_conf('dist_type') and (
+ ($conf->get_conf('dist_type') ne INSTALLER_BUILD) or
+ ($conf->get_conf('dist_type') ne INSTALLER_MM))
+ ) {
+ msg(loc("You have a default installer type set (%1) ".
+ "-- you should probably use that package manager to " .
+ "uninstall modules", $conf->get_conf('dist_type')), $verbose);
+ }
+
+ ### check if we even have the module installed -- no point in continuing
+ ### otherwise
+ unless( $self->installed_version ) {
+ error( loc( "Module '%1' is not installed, so cannot uninstall",
+ $self->module ) );
+ return;
+ }
+
+ ### nothing to uninstall ###
+ my $files = $self->files( type => $type ) or return;
+ my $dirs = $self->directory_tree( type => $type ) or return;
+ my $sudo = $conf->get_program('sudo');
+
+ ### just in case there's no file; M::B doensn't provide .packlists yet ###
+ my $pack = $self->packlist;
+ $pack = $pack->[0]->packlist_file() if $pack;
+
+ ### first remove the files, then the dirs if they are empty ###
+ my $flag = 0;
+ for my $file( @$files, $pack ) {
+ next unless defined $file && -f $file;
+
+ msg(loc("Unlinking '%1'", $file), $verbose);
+
+ my @cmd = ($^X, "-eunlink+q[$file]");
+ unshift @cmd, $sudo if $sudo;
+
+ my $buffer;
+ unless ( run( command => \@cmd,
+ verbose => $verbose,
+ buffer => \$buffer )
+ ) {
+ error(loc("Failed to unlink '%1': '%2'",$file, $buffer));
+ $flag++;
+ }
+ }
+
+ for my $dir ( sort @$dirs ) {
+ local *DIR;
+ opendir DIR, $dir or next;
+ my @count = readdir(DIR);
+ close DIR;
+
+ next unless @count == 2; # . and ..
+
+ msg(loc("Removing '%1'", $dir), $verbose);
+
+ ### this fails on my win2k machines.. it indeed leaves the
+ ### dir, but it's not a critical error, since the files have
+ ### been removed. --kane
+ #unless( rmdir $dir ) {
+ # error( loc( "Could not remove '%1': %2", $dir, $! ) )
+ # unless $^O eq 'MSWin32';
+ #}
+
+ my @cmd = ($^X, "-e", "rmdir q[$dir]");
+ unshift @cmd, $sudo if $sudo;
+
+ my $buffer;
+ unless ( run( command => \@cmd,
+ verbose => $verbose,
+ buffer => \$buffer )
+ ) {
+ error(loc("Failed to rmdir '%1': %2",$dir,$buffer));
+ $flag++;
+ }
+ }
+
+ $self->status->uninstall(!$flag);
+ $self->status->installed( $flag ? 1 : undef);
+
+ return !$flag;
+}
+
+=pod
+
+=head2 @modobj = $self->distributions()
+
+Returns a list of module objects representing all releases for this
+module on success, false on failure.
+
+=cut
+
+sub distributions {
+ my $self = shift;
+ my %hash = @_;
+
+ my @list = $self->author->distributions( %hash, module => $self ) or return;
+
+ ### it's another release then by the same author ###
+ return grep { $_->package_name eq $self->package_name } @list;
+}
+
+=pod
+
+=head2 @list = $self->files ()
+
+Returns a list of files used by this module, if it is installed.
+
+=head2 @list = $self->directory_tree ()
+
+Returns a list of directories used by this module.
+
+=head2 @list = $self->packlist ()
+
+Returns the C<ExtUtils::Packlist> object for this module.
+
+=head2 @list = $self->validate ()
+
+Returns a list of files that are missing for this modules, but
+are present in the .packlist file.
+
+=cut
+
+for my $sub (qw[files directory_tree packlist validate]) {
+ no strict 'refs';
+ *$sub = sub {
+ return shift->_extutils_installed( @_, method => $sub );
+ }
+}
+
+### generic method to call an ExtUtils::Installed method ###
+sub _extutils_installed {
+ my $self = shift;
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my $home = $cb->_home_dir; # may be needed to fix up prefixes
+ my %hash = @_;
+
+ my ($verbose,$type,$method);
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose, },
+ type => { default => 'all',
+ allow => [qw|prog man all|],
+ store => \$type, },
+ method => { required => 1,
+ store => \$method,
+ allow => [qw|files directory_tree packlist
+ validate|],
+ },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ ### old versions of cygwin + perl < 5.8 are buggy here. bail out if we
+ ### find we're being used by them
+ { my $err = ON_OLD_CYGWIN;
+ if($err) { error($err); return };
+ }
+
+ return unless can_load(
+ modules => { 'ExtUtils::Installed' => '0.0' },
+ verbose => $verbose,
+ );
+
+ my @config_names = (
+ ### lib
+ { lib => 'privlib', # perl-only
+ arch => 'archlib', # compiled code
+ prefix => 'prefix', # prefix to both
+ },
+ ### site
+ { lib => 'sitelib',
+ arch => 'sitearch',
+ prefix => 'siteprefix',
+ },
+ ### vendor
+ { lib => 'vendorlib',
+ arch => 'vendorarch',
+ prefix => 'vendorprefix',
+ },
+ );
+
+ ### search in your regular @INC, and anything you added to your config.
+ ### this lets EU::Installed find .packlists that are *not* in the standard
+ ### compiled in @INC path. Requires EU::I 1.42 or up. this addresses #33438
+ ### make sure the archname path is also added, as that's where the .packlist
+ ### files are written
+ my @libs;
+ for my $lib ( @{ $conf->get_conf('lib') } ) {
+ require Config;
+
+ ### and just the standard dir
+ push @libs, $lib;
+
+ ### figure out what an MM prefix expands to. Basically, it's the
+ ### site install target from %Config, ie: /opt/lib/perl5/site_perl/5.8.8
+ ### minus the site wide prefix, ie: /opt
+ ### this lets users add the dir they have set as their EU::MM PREFIX
+ ### to our 'lib' config and it Just Works
+ ### the arch specific dir, ie:
+ ### /opt/lib/perl5/site_perl/5.8.8/darwin-2level
+ ### XXX is this the right thing to do?
+
+ ### we add all 6 dir combos for prefixes:
+ ### /foo/lib
+ ### /foo/lib/arch
+ ### /foo/site/lib
+ ### /foo/site/lib/arch
+ ### /foo/vendor/lib
+ ### /foo/vendor/lib/arch
+ for my $href ( @config_names ) {
+ for my $key ( qw[lib arch] ) {
+
+ ### look up the config value -- use EXP for the EXPANDED
+ ### version, so no ~ etc are found in there
+ my $dir = $Config::Config{ $href->{ $key } .'exp' } or next;
+ my $prefix = $Config::Config{ $href->{prefix} };
+
+ ### prefix may be relative to home, and contain a ~
+ ### if so, fix it up.
+ $prefix =~ s/^~/$home/;
+
+ ### remove the prefix from it, so we can append to our $lib
+ $dir =~ s/^\Q$prefix\E//;
+
+ ### do the appending
+ push @libs, File::Spec->catdir( $lib, $dir );
+
+ }
+ }
+ }
+
+ my $inst;
+ unless( $inst = ExtUtils::Installed->new( extra_libs => \@libs ) ) {
+ error( loc("Could not create an '%1' object", 'ExtUtils::Installed' ) );
+
+ ### in case it's being used directly... ###
+ return;
+ }
+
+
+ { ### EU::Installed can die =/
+ my @files;
+ eval { @files = $inst->$method( $self->module, $type ) };
+
+ if( $@ ) {
+ chomp $@;
+ error( loc("Could not get '%1' for '%2': %3",
+ $method, $self->module, $@ ) );
+ return;
+ }
+
+ return wantarray ? @files : \@files;
+ }
+}
+
+=head2 $bool = $self->add_to_includepath;
+
+Adds the current modules path to C<@INC> and C<$PERL5LIB>. This allows
+you to add the module from its build dir to your path.
+
+You can reset C<@INC> and C<$PERL5LIB> to its original state when you
+started the program, by calling:
+
+ $self->parent->flush('lib');
+
+=cut
+
+sub add_to_includepath {
+ my $self = shift;
+ my $cb = $self->parent;
+
+ if( my $dir = $self->status->extract ) {
+
+ $cb->_add_to_includepath(
+ directories => [
+ File::Spec->catdir(BLIB->($dir), LIB),
+ File::Spec->catdir(BLIB->($dir), ARCH),
+ BLIB->($dir),
+ ]
+ ) or return;
+
+ } else {
+ error(loc( "No extract dir registered for '%1' -- can not add ".
+ "add builddir to search path!", $self->module ));
+ return;
+ }
+
+ return 1;
+
+}
+
+=pod
+
+=head2 $path = $self->best_path_to_module_build();
+
+B<OBSOLETE>
+
+If a newer version of Module::Build is found in your path, it will
+return this C<special> path. If the newest version of C<Module::Build>
+is found in your regular C<@INC>, the method will return false. This
+indicates you do not need to add a special directory to your C<@INC>.
+
+Note that this is only relevant if you're building your own
+C<CPANPLUS::Dist::*> plugin -- the built-in dist types already have
+this taken care of.
+
+=cut
+
+### make sure we're always running 'perl Build.PL' and friends
+### against the highest version of module::build available
+sub best_path_to_module_build {
+ my $self = shift;
+
+ ### Since M::B will actually shell out and run the Build.PL, we must
+ ### make sure it refinds the proper version of M::B in the path.
+ ### that may be either in our cp::inc or in site_perl, or even a
+ ### new M::B being installed.
+ ### don't add anything else here, as that might screw up prereq checks
+
+ ### XXX this might be needed for Dist::MM too, if a makefile.pl is
+ ### masquerading as a Build.PL
+
+ ### did we find the most recent module::build in our installer path?
+
+ ### XXX can't do changes to @INC, they're being ignored by
+ ### new_from_context when writing a Build script. see ticket:
+ ### #8826 Module::Build ignores changes to @INC when writing Build
+ ### from new_from_context
+ ### XXX applied schwern's patches (as seen on CPANPLUS::Devel 10/12/04)
+ ### and upped the version to 0.26061 of the bundled version, and things
+ ### work again
+
+ ### this functionality is now obsolete -- prereqs should be installed
+ ### and we no longer use the CPANPLUS::inc magic.. so comment this out.
+# require Module::Build;
+# if( CPANPLUS::inc->path_to('Module::Build') and (
+# CPANPLUS::inc->path_to('Module::Build') eq
+# CPANPLUS::inc->installer_path )
+# ) {
+#
+# ### if the module being installed is *not* Module::Build
+# ### itself -- as that would undoubtedly be newer -- add
+# ### the path to the installers to @INC
+# ### if it IS module::build itself, add 'lib' to its path,
+# ### as the Build.PL would do as well, but the API doesn't.
+# ### this makes self updates possible
+# return $self->module eq 'Module::Build'
+# ? 'lib'
+# : CPANPLUS::inc->installer_path;
+# }
+
+ ### otherwise, the path was found through a 'normal' way of
+ ### scanning @INC.
+ return;
+}
+
+=pod
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
+1;
+
+__END__
+
+todo:
+reports();
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Author.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Author.pm
new file mode 100755
index 00000000000..92940fa51ff
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Author.pm
@@ -0,0 +1,232 @@
+package CPANPLUS::Module::Author;
+
+use strict;
+
+use CPANPLUS::Error;
+use CPANPLUS::Internals::Constants;
+use Params::Check qw[check];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+local $Params::Check::VERBOSE = 1;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Module::Author
+
+=head1 SYNOPSIS
+
+ my $author = CPANPLUS::Module::Author->new(
+ author => 'Jack Ashton',
+ cpanid => 'JACKASH',
+ _id => INTERNALS_OBJECT_ID,
+ );
+
+ $author->cpanid;
+ $author->author;
+ $author->email;
+
+ @dists = $author->distributions;
+ @mods = $author->modules;
+
+ @accessors = CPANPLUS::Module::Author->accessors;
+
+=head1 DESCRIPTION
+
+C<CPANPLUS::Module::Author> creates objects from the information in the
+source files. These can then be used to query on.
+
+These objects should only be created internally. For C<fake> objects,
+there's the C<CPANPLUS::Module::Author::Fake> class.
+
+=head1 ACCESSORS
+
+An objects of this class has the following accessors:
+
+=over 4
+
+=item author
+
+Name of the author.
+
+=item cpanid
+
+The CPAN id of the author.
+
+=item email
+
+The email address of the author, which defaults to '' if not provided.
+
+=item parent
+
+The C<CPANPLUS::Internals::Object> that spawned this module object.
+
+=back
+
+=cut
+
+my $tmpl = {
+ author => { required => 1 }, # full name of the author
+ cpanid => { required => 1 }, # cpan id
+ email => { default => '' }, # email address of the author
+ _id => { required => 1 }, # id of the Internals object that spawned us
+};
+
+### autogenerate accessors ###
+for my $key ( keys %$tmpl ) {
+ no strict 'refs';
+ *{__PACKAGE__."::$key"} = sub {
+ my $self = shift;
+ $self->{$key} = $_[0] if @_;
+ return $self->{$key};
+ }
+}
+
+sub parent {
+ my $self = shift;
+ my $obj = CPANPLUS::Internals->_retrieve_id( $self->_id );
+
+ return $obj;
+}
+
+=pod
+
+=head1 METHODS
+
+=head2 $auth = CPANPLUS::Module::Author->new( author => AUTHOR_NAME, cpanid => CPAN_ID, _id => INTERNALS_ID [, email => AUTHOR_EMAIL] )
+
+This method returns a C<CPANPLUS::Module::Author> object, based on the given
+parameters.
+
+Returns false on failure.
+
+=cut
+
+sub new {
+ my $class = shift;
+ my %hash = @_;
+
+ ### don't check the template for sanity
+ ### -- we know it's good and saves a lot of performance
+ local $Params::Check::SANITY_CHECK_TEMPLATE = 0;
+
+ my $object = check( $tmpl, \%hash ) or return;
+
+ return bless $object, $class;
+}
+
+=pod
+
+=head2 @mod_objs = $auth->modules()
+
+Return a list of module objects this author has released.
+
+=cut
+
+sub modules {
+ my $self = shift;
+ my $cb = $self->parent;
+
+ my $aref = $cb->_search_module_tree(
+ type => 'author',
+ ### XXX, depending on backend, this is either an object
+ ### or the cpanid string. Dont know an elegant way to
+ ### solve this right now, so passing both
+ allow => [$self, $self->cpanid],
+ );
+ return @$aref if $aref;
+ return;
+}
+
+=pod
+
+=head2 @dists = $auth->distributions()
+
+Returns a list of module objects representing all the distributions
+this author has released.
+
+=cut
+
+sub distributions {
+ my $self = shift;
+ my %hash = @_;
+
+ local $Params::Check::ALLOW_UNKNOWN = 1;
+ local $Params::Check::NO_DUPLICATES = 1;
+
+ my $mod;
+ my $tmpl = {
+ module => { default => '', store => \$mod },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ ### if we didn't get a module object passed, we'll find one ourselves ###
+ unless( $mod ) {
+ my @list = $self->modules;
+ if( @list ) {
+ $mod = $list[0];
+ } else {
+ error( loc( "This author has released no modules" ) );
+ return;
+ }
+ }
+
+ my $file = $mod->checksums( %hash );
+ my $href = $mod->_parse_checksums_file( file => $file ) or return;
+
+ my @rv;
+ for my $name ( keys %$href ) {
+
+ ### shortcut asap, so we avoid extra ops. On big checksums files
+ ### the call to clone() takes up a lot of time.
+ ### .meta files are now also in the checksums file,
+ ### which means we have to filter out things that dont
+ ### match our regex
+ next if $mod->package_extension( $name ) eq META_EXT;
+
+ ### used to do this wiht ->clone. However, that calls ->dslip,
+ ### (which is wrong anyway, as we're doing a different module),
+ ### which in turn calls ->contains, which scans the entire
+ ### module tree using _search_module_tree, which uses P::C
+ ### and is therefor VERY VERY slow.
+ ### so let's do this the direct way for speed ups.
+ my $dist = CPANPLUS::Module::Fake->new(
+ module => do { my $m = $mod->package_name( $name );
+ $m =~ s/-/::/g; $m;
+ },
+ version => $mod->package_version( $name ),
+ package => $name,
+ path => $mod->path, # same author after all
+ author => $mod->author, # same author after all
+ mtime => $href->{$name}->{'mtime'}, # release date
+ );
+
+ push @rv, $dist;
+ }
+
+ return @rv;
+}
+
+
+=pod
+
+=head1 CLASS METHODS
+
+=head2 accessors ()
+
+Returns a list of all accessor methods to the object
+
+=cut
+
+sub accessors { return keys %$tmpl };
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Author/Fake.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Author/Fake.pm
new file mode 100755
index 00000000000..3156c5c7abb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Author/Fake.pm
@@ -0,0 +1,80 @@
+package CPANPLUS::Module::Author::Fake;
+
+
+use CPANPLUS::Module::Author;
+use CPANPLUS::Internals;
+use CPANPLUS::Error;
+
+use strict;
+use vars qw[@ISA];
+use Params::Check qw[check];
+
+@ISA = qw[CPANPLUS::Module::Author];
+
+$Params::Check::VERBOSE = 1;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Module::Author::Fake
+
+=head1 SYNOPSIS
+
+ my $auth = CPANPLUS::Module::Author::Fake->new(
+ author => 'Foo Bar',
+ email => 'luser@foo.com',
+ cpanid => 'FOO',
+ _id => $cpan->id,
+ );
+
+=head1 DESCRIPTION
+
+A class for creating fake author objects, for shortcut use internally
+by CPANPLUS.
+
+Inherits from C<CPANPLUS::Module::Author>.
+
+=head1 METHODS
+
+=head2 new( _id => DIGIT )
+
+Creates a dummy author object. It can take the same options as
+C<< CPANPLUS::Module::Author->new >>, but will fill in default ones
+if none are provided. Only the _id key is required.
+
+=cut
+
+sub new {
+ my $class = shift;
+ my %hash = @_;
+
+ my $tmpl = {
+ author => { default => 'CPANPLUS Internals' },
+ email => { default => 'cpanplus-info@lists.sf.net' },
+ cpanid => { default => 'CPANPLUS' },
+ _id => { default => CPANPLUS::Internals->_last_id },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ my $obj = CPANPLUS::Module::Author->new( %$args ) or return;
+
+ unless( $obj->_id ) {
+ error(loc("No '%1' specified -- No CPANPLUS object associated!",'_id'));
+ return;
+ }
+
+ ### rebless object ###
+ return bless $obj, $class;
+}
+
+1;
+
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Checksums.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Checksums.pm
new file mode 100755
index 00000000000..e1a2bbdb6ad
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Checksums.pm
@@ -0,0 +1,251 @@
+package CPANPLUS::Module::Checksums;
+
+use strict;
+use vars qw[@ISA];
+
+
+use CPANPLUS::Error;
+use CPANPLUS::Internals::Constants;
+
+use FileHandle;
+
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load];
+
+$Params::Check::VERBOSE = 1;
+
+@ISA = qw[ CPANPLUS::Module::Signature ];
+
+=head1 NAME
+
+CPANPLUS::Module::Checksums
+
+=head1 SYNOPSIS
+
+ $file = $modobj->checksums;
+ $bool = $mobobj->_validate_checksum;
+
+=head1 DESCRIPTION
+
+This is a class that provides functions for checking the checksum
+of a distribution. Should not be loaded directly, but used via the
+interface provided via C<CPANPLUS::Module>.
+
+=head1 METHODS
+
+=head2 $mod->checksums
+
+Fetches the checksums file for this module object.
+For the options it can take, see C<CPANPLUS::Module::fetch()>.
+
+Returns the location of the checksums file on success and false
+on error.
+
+The location of the checksums file is also stored as
+
+ $mod->status->checksums
+
+=cut
+
+sub checksums {
+ my $mod = shift or return;
+
+ my $file = $mod->_get_checksums_file( @_ );
+
+ return $mod->status->checksums( $file ) if $file;
+
+ return;
+}
+
+### checks if the package checksum matches the one
+### from the checksums file
+sub _validate_checksum {
+ my $self = shift; #must be isa CPANPLUS::Module
+ my $conf = $self->parent->configure_object;
+ my %hash = @_;
+
+ my $verbose;
+ my $tmpl = {
+ verbose => { default => $conf->get_conf('verbose'),
+ store => \$verbose },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### if we can't check it, we must assume it's ok ###
+ return $self->status->checksum_ok(1)
+ unless can_load( modules => { 'Digest::MD5' => '0.0' } );
+ #class CPANPLUS::Module::Status is runtime-generated
+
+ my $file = $self->_get_checksums_file( verbose => $verbose ) or (
+ error(loc(q[Could not fetch '%1' file], CHECKSUMS)), return );
+
+ $self->_check_signature_for_checksum_file( file => $file ) or (
+ error(loc(q[Could not verify '%1' file], CHECKSUMS)), return );
+ #for whole CHECKSUMS file
+
+ my $href = $self->_parse_checksums_file( file => $file ) or (
+ error(loc(q[Could not parse '%1' file], CHECKSUMS)), return );
+
+ my $size = $href->{ $self->package }->{'size'};
+
+ ### the checksums file tells us the size of the archive
+ ### but the downloaded file is of different size
+ if( defined $size ) {
+ if( not (-s $self->status->fetch == $size) ) {
+ error(loc( "Archive size does not match for '%1': " .
+ "size is '%2' but should be '%3'",
+ $self->package, -s $self->status->fetch, $size));
+ return $self->status->checksum_ok(0);
+ }
+ } else {
+ msg(loc("Archive size is not known for '%1'",$self->package),$verbose);
+ }
+
+ my $md5 = $href->{ $self->package }->{'md5'};
+
+ unless( defined $md5 ) {
+ msg(loc("No 'md5' checksum known for '%1'",$self->package),$verbose);
+
+ return $self->status->checksum_ok(1);
+ }
+
+ $self->status->checksum_value($md5);
+
+
+ my $fh = FileHandle->new( $self->status->fetch ) or return;
+ binmode $fh;
+
+ my $ctx = Digest::MD5->new;
+ $ctx->addfile( $fh );
+
+ my $flag = $ctx->hexdigest eq $md5;
+ $flag
+ ? msg(loc("Checksum matches for '%1'", $self->package),$verbose)
+ : error(loc("Checksum does not match for '%1': " .
+ "MD5 is '%2' but should be '%3'",
+ $self->package, $ctx->hexdigest, $md5),$verbose);
+
+
+ return $self->status->checksum_ok(1) if $flag;
+ return $self->status->checksum_ok(0);
+}
+
+
+### fetches the module objects checksum file ###
+sub _get_checksums_file {
+ my $self = shift;
+ my %hash = @_;
+
+ my $clone = $self->clone;
+ $clone->package( CHECKSUMS );
+
+ my $file = $clone->fetch( ttl => 3600, %hash ) or return;
+
+ return $file;
+}
+
+sub _parse_checksums_file {
+ my $self = shift;
+ my %hash = @_;
+
+ my $file;
+ my $tmpl = {
+ file => { required => 1, allow => FILE_READABLE, store => \$file },
+ };
+ my $args = check( $tmpl, \%hash );
+
+ my $fh = OPEN_FILE->( $file ) or return;
+
+ ### loop over the header, there might be a pgp signature ###
+ my $signed;
+ while (local $_ = <$fh>) {
+ last if /^\$cksum = \{\s*$/; # skip till this line
+ my $header = PGP_HEADER; # but be tolerant of whitespace
+ $signed = 1 if /^${header}\s*$/;# due to crossplatform linebreaks
+ }
+
+ ### read the filehandle, parse it rather than eval it, even though it
+ ### *should* be valid perl code
+ my $dist;
+ my $cksum = {};
+ while (local $_ = <$fh>) {
+
+ if (/^\s*'([^']+)' => \{\s*$/) {
+ $dist = $1;
+
+ } elsif (/^\s*'([^']+)' => '?([^'\n]+)'?,?\s*$/ and defined $dist) {
+ $cksum->{$dist}{$1} = $2;
+
+ } elsif (/^\s*}[,;]?\s*$/) {
+ undef $dist;
+
+ } elsif (/^__END__\s*$/) {
+ last;
+
+ } else {
+ error( loc("Malformed %1 line: %2", CHECKSUMS, $_) );
+ }
+ }
+
+ return $cksum;
+}
+
+sub _check_signature_for_checksum_file {
+ my $self = shift;
+
+ my $conf = $self->parent->configure_object;
+ my %hash = @_;
+
+ ### you don't want to check signatures,
+ ### so let's just return true;
+ return 1 unless $conf->get_conf('signature');
+
+ my($force,$file,$verbose);
+ my $tmpl = {
+ file => { required => 1, allow => FILE_READABLE, store => \$file },
+ force => { default => $conf->get_conf('force'), store => \$force },
+ verbose => { default => $conf->get_conf('verbose'), store => \$verbose },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ my $fh = OPEN_FILE->($file) or return;
+
+ my $signed;
+ while (local $_ = <$fh>) {
+ my $header = PGP_HEADER;
+ $signed = 1 if /^$header$/;
+ }
+
+ if ( !$signed ) {
+ msg(loc("No signature found in %1 file '%2'",
+ CHECKSUMS, $file), $verbose);
+
+ return 1 unless $force;
+
+ error( loc( "%1 file '%2' is not signed -- aborting",
+ CHECKSUMS, $file ) );
+ return;
+
+ }
+
+ if( can_load( modules => { 'Module::Signature' => '0.06' } ) ) {
+ # local $Module::Signature::SIGNATURE = $file;
+ # ... check signatures ...
+ }
+
+ return 1;
+}
+
+
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Fake.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Fake.pm
new file mode 100755
index 00000000000..84d0233cf83
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Fake.pm
@@ -0,0 +1,86 @@
+package CPANPLUS::Module::Fake;
+
+
+use CPANPLUS::Error;
+use CPANPLUS::Module;
+use CPANPLUS::Module::Author::Fake;
+use CPANPLUS::Internals;
+
+use strict;
+use vars qw[@ISA];
+use Params::Check qw[check];
+
+@ISA = qw[CPANPLUS::Module];
+$Params::Check::VERBOSE = 1;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Module::Fake
+
+=head1 SYNOPSIS
+
+ my $obj = CPANPLUS::Module::Fake->new(
+ module => 'Foo',
+ path => 'ftp/path/to/foo',
+ author => CPANPLUS::Module::Author::Fake->new,
+ package => 'fake-1.1.tgz',
+ _id => $cpan->_id,
+ );
+
+=head1 DESCRIPTION
+
+A class for creating fake module objects, for shortcut use internally
+by CPANPLUS.
+
+Inherits from C<CPANPLUS::Module>.
+
+=head1 METHODS
+
+=head2 new( module => $mod, path => $path, package => $pkg, [_id => DIGIT] )
+
+Creates a dummy module object from the above parameters. It can
+take more options (same as C<< CPANPLUS::Module->new >> but the above
+are required.
+
+=cut
+
+sub new {
+ my $class = shift;
+ my %hash = @_;
+
+ local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ module => { required => 1 },
+ path => { required => 1 },
+ package => { required => 1 },
+ _id => { default => CPANPLUS::Internals->_last_id },
+ author => { default => '' },
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+
+ $args->{author} ||= CPANPLUS::Module::Author::Fake->new(
+ _id => $args->{_id} );
+
+ my $obj = CPANPLUS::Module->new( %$args ) or return;
+
+ unless( $obj->_id ) {
+ error(loc("No '%1' specified -- No CPANPLUS object associated!",'_id'));
+ return;
+ }
+
+ ### rebless object ###
+ return bless $obj, $class;
+}
+
+1;
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Signature.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Signature.pm
new file mode 100755
index 00000000000..cec6f2906b0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Module/Signature.pm
@@ -0,0 +1,65 @@
+package CPANPLUS::Module::Signature;
+
+use strict;
+
+
+use Cwd;
+use CPANPLUS::Error;
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load];
+
+
+### detached sig, not actually used afaik --kane ###
+#sub get_signature {
+# my $self = shift;
+#
+# my $clone = $self->clone;
+# $clone->package( $self->package . '.sig' );
+#
+# return $clone->fetch;
+#}
+
+sub check_signature {
+ my $self = shift;
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $verbose;
+ my $tmpl = {
+ verbose => {default => $conf->get_conf('verbose'), store => \$verbose},
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my $dir = $self->status->extract or (
+ error( loc( "Do not know what dir '%1' was extracted to; ".
+ "Cannot check signature", $self->module ) ),
+ return );
+
+ my $cwd = cwd();
+ unless( $cb->_chdir( dir => $dir ) ) {
+ error(loc( "Could not chdir to '%1', cannot verify distribution '%2'",
+ $dir, $self->module ));
+ return;
+ }
+
+
+ ### check prerequisites
+ my $flag;
+ my $use_list = { 'Module::Signature' => '0.06' };
+ if( can_load( modules => $use_list, verbose => 1 ) ) {
+ my $rv = Module::Signature::verify();
+
+ unless ($rv eq Module::Signature::SIGNATURE_OK() or
+ $rv eq Module::Signature::SIGNATURE_MISSING()
+ ) {
+ $flag++; # whoops, bad sig
+ }
+ }
+
+ $cb->_chdir( dir => $cwd );
+ return $flag ? 0 : 1;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Selfupdate.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Selfupdate.pm
new file mode 100755
index 00000000000..48f918ce82e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Selfupdate.pm
@@ -0,0 +1,547 @@
+package CPANPLUS::Selfupdate;
+
+use strict;
+use Params::Check qw[check];
+use IPC::Cmd qw[can_run];
+use CPANPLUS::Error qw[error msg];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+use CPANPLUS::Internals::Constants;
+
+$Params::Check::VERBOSE = 1;
+
+=head1 NAME
+
+CPANPLUS::Selfupdate
+
+=head1 SYNOPSIS
+
+ $su = $cb->selfupdate_object;
+
+ @feats = $su->list_features;
+ @feats = $su->list_enabled_features;
+
+ @mods = map { $su->modules_for_feature( $_ ) } @feats;
+ @mods = $su->list_core_dependencies;
+ @mods = $su->list_core_modules;
+
+ for ( @mods ) {
+ print $_->name " should be version " . $_->version_required;
+ print "Installed version is not uptodate!"
+ unless $_->is_installed_version_sufficient;
+ }
+
+ $ok = $su->selfupdate( update => 'all', latest => 0 );
+
+=cut
+
+### a config has describing our deps etc
+{
+
+ my $Modules = {
+ dependencies => {
+ 'File::Fetch' => '0.15_02', # lynx & 404 handling
+ 'File::Spec' => '0.82',
+ 'IPC::Cmd' => '0.36', # 5.6.2 compat: 2-arg open
+ 'Locale::Maketext::Simple' => '0.01',
+ 'Log::Message' => '0.01',
+ 'Module::Load' => '0.10',
+ 'Module::Load::Conditional' => '0.31_01', # returns dir for loaded
+ # modules
+ 'version' => '0.73', # needed for M::L::C
+ # addresses #24630 and
+ # #24675
+ # Address ~0 overflow issue
+ 'Params::Check' => '0.22',
+ 'Package::Constants' => '0.01',
+ 'Term::UI' => '0.18', # option parsing
+ 'Test::Harness' => '2.62', # due to bug #19505
+ # only 2.58 and 2.60 are bad
+ 'Test::More' => '0.47', # to run our tests
+ 'Archive::Extract' => '0.16', # ./Dir bug fix
+ 'Archive::Tar' => '1.23',
+ 'IO::Zlib' => '1.04', # needed for Archive::Tar
+ 'Object::Accessor' => '0.34', # mk_aliases support
+ 'Module::CoreList' => '2.22', # deprecated core modules
+ 'Module::Pluggable' => '2.4',
+ 'Module::Loaded' => '0.01',
+ 'Parse::CPAN::Meta' => '0.02', # config_requires support
+ 'ExtUtils::Install' => '1.42', # uninstall outside @INC
+ },
+
+ features => {
+ # config_key_name => [
+ # sub { } to list module key/value pairs
+ # sub { } to check if feature is enabled
+ # ]
+ prefer_makefile => [
+ sub {
+ my $cb = shift;
+ $cb->configure_object->get_conf('prefer_makefile')
+ ? { }
+ : { 'CPANPLUS::Dist::Build' => '0.24' };
+ },
+ sub { return 1 }, # always enabled
+ ],
+ cpantest => [
+ { 'Test::Reporter' => '1.34',
+ 'Parse::CPAN::Meta' => '0.0'
+ },
+ sub {
+ my $cb = shift;
+ return $cb->configure_object->get_conf('cpantest');
+ },
+ ],
+ dist_type => [
+ sub {
+ my $cb = shift;
+ my $dist = $cb->configure_object->get_conf('dist_type');
+ return { $dist => '0.0' } if $dist;
+ return;
+ },
+ sub {
+ my $cb = shift;
+ return $cb->configure_object->get_conf('dist_type');
+ },
+ ],
+
+ md5 => [
+ {
+ 'Digest::MD5' => '0.0',
+ },
+ sub {
+ my $cb = shift;
+ return $cb->configure_object->get_conf('md5');
+ },
+ ],
+ shell => [
+ sub {
+ my $cb = shift;
+ my $dist = $cb->configure_object->get_conf('shell');
+
+ ### we bundle these shells, so don't bother having a dep
+ ### on them... If we don't do this, CPAN.pm actually detects
+ ### a recursive dependency and breaks (see #26077).
+ ### This is not an issue for CPANPLUS itself, it handles
+ ### it smartly.
+ return if $dist eq SHELL_DEFAULT or $dist eq SHELL_CLASSIC;
+ return { $dist => '0.0' } if $dist;
+ return;
+ },
+ sub { return 1 },
+ ],
+ signature => [
+ sub {
+ my $cb = shift;
+ return {
+ 'Module::Signature' => '0.06',
+ } if can_run('gpg');
+ ### leave this out -- Crypt::OpenPGP is fairly
+ ### painful to install, and broken on some platforms
+ ### so we'll just always fall back to gpg. It may
+ ### issue a warning or 2, but that's about it.
+ ### this change due to this ticket: #26914
+ # and $cb->configure_object->get_conf('prefer_bin');
+
+ return {
+ 'Crypt::OpenPGP' => '0.0',
+ 'Module::Signature' => '0.06',
+ };
+ },
+ sub {
+ my $cb = shift;
+ return $cb->configure_object->get_conf('signature');
+ },
+ ],
+ storable => [
+ { 'Storable' => '0.0' },
+ sub {
+ my $cb = shift;
+ return $cb->configure_object->get_conf('storable');
+ },
+ ],
+ sqlite_backend => [
+ { 'DBIx::Simple' => '0.0',
+ 'DBD::SQLite' => '0.0',
+ },
+ sub {
+ my $cb = shift;
+ my $conf = $cb->configure_object;
+ return $conf->get_conf('source_engine')
+ eq 'CPANPLUS::Internals::Source::SQLite'
+ },
+ ],
+ },
+ core => {
+ 'CPANPLUS' => '0.0',
+ },
+ };
+
+ sub _get_config { return $Modules }
+}
+
+=head1 METHODS
+
+=head2 $self = CPANPLUS::Selfupdate->new( $backend_object );
+
+Sets up a new selfupdate object. Called automatically when
+a new backend object is created.
+
+=cut
+
+sub new {
+ my $class = shift;
+ my $cb = shift or return;
+ return bless sub { $cb }, $class;
+}
+
+
+{ ### cache to find the relevant modules
+ my $cache = {
+ core
+ => sub { my $self = shift;
+ core => [ $self->list_core_modules ] },
+
+ dependencies
+ => sub { my $self = shift;
+ dependencies => [ $self->list_core_dependencies ] },
+
+ enabled_features
+ => sub { my $self = shift;
+ map { $_ => [ $self->modules_for_feature( $_ ) ] }
+ $self->list_enabled_features
+ },
+ features
+ => sub { my $self = shift;
+ map { $_ => [ $self->modules_for_feature( $_ ) ] }
+ $self->list_features
+ },
+ ### make sure to do 'core' first, in case
+ ### we are out of date ourselves
+ all => [ qw|core dependencies enabled_features| ],
+ };
+
+
+=head2 @cat = $self->list_categories
+
+Returns a list of categories that the C<selfupdate> method accepts.
+
+See C<selfupdate> for details.
+
+=cut
+
+ sub list_categories { return sort keys %$cache }
+
+=head2 %list = $self->list_modules_to_update( update => "core|dependencies|enabled_features|features|all", [latest => BOOL] )
+
+List which modules C<selfupdate> would upgrade. You can update either
+the core (CPANPLUS itself), the core dependencies, all features you have
+currently turned on, or all features available, or everything.
+
+The C<latest> option determines whether it should update to the latest
+version on CPAN, or if the minimal required version for CPANPLUS is
+good enough.
+
+Returns a hash of feature names and lists of module objects to be
+upgraded based on the category you provided. For example:
+
+ %list = $self->list_modules_to_update( update => 'core' );
+
+Would return:
+
+ ( core => [ $module_object_for_cpanplus ] );
+
+=cut
+
+ sub list_modules_to_update {
+ my $self = shift;
+ my $cb = $self->();
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my($type, $latest);
+ my $tmpl = {
+ update => { required => 1, store => \$type,
+ allow => [ keys %$cache ], },
+ latest => { default => 0, store => \$latest, allow => BOOLEANS },
+ };
+
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+ check( $tmpl, \%hash ) or return;
+ }
+
+ my $ref = $cache->{$type};
+
+ ### a list of ( feature1 => \@mods, feature2 => \@mods, etc )
+ my %list = UNIVERSAL::isa( $ref, 'ARRAY' )
+ ? map { $cache->{$_}->( $self ) } @$ref
+ : $ref->( $self );
+
+ ### filter based on whether we need the latest ones or not
+ for my $aref ( values %list ) {
+ $aref = [ $latest
+ ? grep { !$_->is_uptodate } @$aref
+ : grep { !$_->is_installed_version_sufficient } @$aref
+ ];
+ }
+
+ return %list;
+ }
+
+=head2 $bool = $self->selfupdate( update => "core|dependencies|enabled_features|features|all", [latest => BOOL, force => BOOL] )
+
+Selfupdate CPANPLUS. You can update either the core (CPANPLUS itself),
+the core dependencies, all features you have currently turned on, or
+all features available, or everything.
+
+The C<latest> option determines whether it should update to the latest
+version on CPAN, or if the minimal required version for CPANPLUS is
+good enough.
+
+Returns true on success, false on error.
+
+=cut
+
+ sub selfupdate {
+ my $self = shift;
+ my $cb = $self->();
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $force;
+ my $tmpl = {
+ force => { default => $conf->get_conf('force'), store => \$force },
+ };
+
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+ check( $tmpl, \%hash ) or return;
+ }
+
+ my %list = $self->list_modules_to_update( %hash ) or return;
+
+ ### just the modules please
+ my @mods = map { @$_ } values %list;
+
+ my $flag;
+ for my $mod ( @mods ) {
+ unless( $mod->install( force => $force ) ) {
+ $flag++;
+ error(loc("Failed to update module '%1'", $mod->name));
+ }
+ }
+
+ return if $flag;
+ return 1;
+ }
+
+}
+
+=head2 @features = $self->list_features
+
+Returns a list of features that are supported by CPANPLUS.
+
+=cut
+
+sub list_features {
+ my $self = shift;
+ return keys %{ $self->_get_config->{'features'} };
+}
+
+=head2 @features = $self->list_enabled_features
+
+Returns a list of features that are enabled in your current
+CPANPLUS installation.
+
+=cut
+
+sub list_enabled_features {
+ my $self = shift;
+ my $cb = $self->();
+
+ my @enabled;
+ for my $feat ( $self->list_features ) {
+ my $ref = $self->_get_config->{'features'}->{$feat}->[1];
+ push @enabled, $feat if $ref->($cb);
+ }
+
+ return @enabled;
+}
+
+=head2 @mods = $self->modules_for_feature( FEATURE [,AS_HASH] )
+
+Returns a list of C<CPANPLUS::Selfupdate::Module> objects which
+represent the modules required to support this feature.
+
+For a list of features, call the C<list_features> method.
+
+If the C<AS_HASH> argument is provided, no module objects are
+returned, but a hashref where the keys are names of the modules,
+and values are their minimum versions.
+
+=cut
+
+sub modules_for_feature {
+ my $self = shift;
+ my $feature = shift or return;
+ my $as_hash = shift || 0;
+ my $cb = $self->();
+
+ unless( exists $self->_get_config->{'features'}->{$feature} ) {
+ error(loc("Unknown feature '%1'", $feature));
+ return;
+ }
+
+ my $ref = $self->_get_config->{'features'}->{$feature}->[0];
+
+ ### it's either a list of modules/versions or a subroutine that
+ ### returns a list of modules/versions
+ my $href = UNIVERSAL::isa( $ref, 'HASH' ) ? $ref : $ref->( $cb );
+
+ return unless $href; # nothing needed for the feature?
+
+ return $href if $as_hash;
+ return $self->_hashref_to_module( $href );
+}
+
+
+=head2 @mods = $self->list_core_dependencies( [AS_HASH] )
+
+Returns a list of C<CPANPLUS::Selfupdate::Module> objects which
+represent the modules that comprise the core dependencies of CPANPLUS.
+
+If the C<AS_HASH> argument is provided, no module objects are
+returned, but a hashref where the keys are names of the modules,
+and values are their minimum versions.
+
+=cut
+
+sub list_core_dependencies {
+ my $self = shift;
+ my $as_hash = shift || 0;
+ my $cb = $self->();
+ my $href = $self->_get_config->{'dependencies'};
+
+ return $href if $as_hash;
+ return $self->_hashref_to_module( $href );
+}
+
+=head2 @mods = $self->list_core_modules( [AS_HASH] )
+
+Returns a list of C<CPANPLUS::Selfupdate::Module> objects which
+represent the modules that comprise the core of CPANPLUS.
+
+If the C<AS_HASH> argument is provided, no module objects are
+returned, but a hashref where the keys are names of the modules,
+and values are their minimum versions.
+
+=cut
+
+sub list_core_modules {
+ my $self = shift;
+ my $as_hash = shift || 0;
+ my $cb = $self->();
+ my $href = $self->_get_config->{'core'};
+
+ return $href if $as_hash;
+ return $self->_hashref_to_module( $href );
+}
+
+sub _hashref_to_module {
+ my $self = shift;
+ my $cb = $self->();
+ my $href = shift or return;
+
+ return map {
+ CPANPLUS::Selfupdate::Module->new(
+ $cb->module_tree($_) => $href->{$_}
+ )
+ } keys %$href;
+}
+
+
+=head1 CPANPLUS::Selfupdate::Module
+
+C<CPANPLUS::Selfupdate::Module> extends C<CPANPLUS::Module> objects
+by providing accessors to aid in selfupdating CPANPLUS.
+
+These objects are returned by all methods of C<CPANPLUS::Selfupdate>
+that return module objects.
+
+=cut
+
+{ package CPANPLUS::Selfupdate::Module;
+ use base 'CPANPLUS::Module';
+
+ ### stores module name -> cpanplus required version
+ ### XXX only can deal with 1 pair!
+ my %Cache = ();
+ my $Acc = 'version_required';
+
+ sub new {
+ my $class = shift;
+ my $mod = shift or return;
+ my $ver = shift; return unless defined $ver;
+
+ my $obj = $mod->clone; # clone the module object
+ bless $obj, $class; # rebless it to our class
+
+ $obj->$Acc( $ver );
+
+ return $obj;
+ }
+
+=head2 $version = $mod->version_required
+
+Returns the version of this module required for CPANPLUS.
+
+=cut
+
+ sub version_required {
+ my $self = shift;
+ $Cache{ $self->name } = shift() if @_;
+ return $Cache{ $self->name };
+ }
+
+=head2 $bool = $mod->is_installed_version_sufficient
+
+Returns true if the installed version of this module is sufficient
+for CPANPLUS, or false if it is not.
+
+=cut
+
+
+ sub is_installed_version_sufficient {
+ my $self = shift;
+ return $self->is_uptodate( version => $self->$Acc );
+ }
+
+}
+
+1;
+
+=pod
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell.pm
new file mode 100755
index 00000000000..854d46b16a4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell.pm
@@ -0,0 +1,341 @@
+package CPANPLUS::Shell;
+
+use strict;
+
+use CPANPLUS::Error;
+use CPANPLUS::Configure;
+use CPANPLUS::Internals::Constants;
+
+use Module::Load qw[load];
+use Params::Check qw[check];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+$Params::Check::VERBOSE = 1;
+
+use vars qw[@ISA $SHELL $DEFAULT];
+
+$DEFAULT = SHELL_DEFAULT;
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Shell
+
+=head1 SYNOPSIS
+
+ use CPANPLUS::Shell; # load the shell indicated by your
+ # config -- defaults to
+ # CPANPLUS::Shell::Default
+
+ use CPANPLUS::Shell qw[Classic] # load CPANPLUS::Shell::Classic;
+
+ my $ui = CPANPLUS::Shell->new();
+ my $name = $ui->which; # Find out what shell you loaded
+
+ $ui->shell; # run the ui shell
+
+
+=head1 DESCRIPTION
+
+This module is the generic loading (and base class) for all C<CPANPLUS>
+shells. Through this module you can load any installed C<CPANPLUS>
+shell.
+
+Just about all the functionality is provided by the shell that you have
+loaded, and not by this class (which merely functions as a generic
+loading class), so please consult the documentation of your shell of
+choice.
+
+=cut
+
+sub import {
+ my $class = shift;
+ my $option = shift;
+
+ ### find out what shell we're supposed to load ###
+ $SHELL = $option
+ ? $class . '::' . $option
+ : do { ### XXX this should offer to reconfigure
+ ### CPANPLUS, somehow. --rs
+ ### XXX load Configure only if we really have to
+ ### as that means any $Conf passed later on will
+ ### be ignored in favour of the one that was
+ ### retrieved via ->new --kane
+ my $conf = CPANPLUS::Configure->new() or
+ die loc("No configuration available -- aborting") . $/;
+ $conf->get_conf('shell') || $DEFAULT;
+ };
+
+ ### load the shell, fall back to the default if required
+ ### and die if even that doesn't work
+ EVAL: {
+ eval { load $SHELL };
+
+ if( $@ ) {
+ my $err = $@;
+
+ die loc("Your default shell '%1' is not available: %2",
+ $DEFAULT, $err) .
+ loc("Check your installation!") . "\n"
+ if $SHELL eq $DEFAULT;
+
+ warn loc("Failed to use '%1': %2", $SHELL, $err),
+ loc("Switching back to the default shell '%1'", $DEFAULT),
+ "\n";
+
+ $SHELL = $DEFAULT;
+ redo EVAL;
+ }
+ }
+ @ISA = ($SHELL);
+}
+
+sub which { return $SHELL }
+
+1;
+
+###########################################################################
+### abstracted out subroutines available to programmers of other shells ###
+###########################################################################
+
+package CPANPLUS::Shell::_Base::ReadLine;
+
+use strict;
+use vars qw($AUTOLOAD $TMPL);
+
+use FileHandle;
+use CPANPLUS::Error;
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+$Params::Check::VERBOSE = 1;
+
+
+$TMPL = {
+ brand => { default => '', strict_type => 1 },
+ prompt => { default => '> ', strict_type => 1 },
+ pager => { default => '' },
+ backend => { default => '' },
+ term => { default => '' },
+ format => { default => '' },
+ dist_format => { default => '' },
+ remote => { default => undef },
+ noninteractive => { default => '' },
+ cache => { default => [ ] },
+ settings => { default => { install_all_prereqs => undef },
+ no_override => 1 },
+ _old_sigpipe => { default => '', no_override => 1 },
+ _old_outfh => { default => '', no_override => 1 },
+ _signals => { default => { INT => { } }, no_override => 1 },
+};
+
+### autogenerate accessors ###
+for my $key ( keys %$TMPL ) {
+ no strict 'refs';
+ *{__PACKAGE__."::$key"} = sub {
+ my $self = shift;
+ $self->{$key} = $_[0] if @_;
+ return $self->{$key};
+ }
+}
+
+sub _init {
+ my $class = shift;
+ my %hash = @_;
+
+ my $self = check( $TMPL, \%hash ) or return;
+
+ bless $self, $class;
+
+ ### signal handler ###
+ $SIG{INT} = $self->_signals->{INT}->{handler} =
+ sub {
+ unless ( $self->_signals->{INT}->{count}++ ) {
+ warn loc("Caught SIGINT"), "\n";
+ } else {
+ warn loc("Got another SIGINT"), "\n"; die;
+ }
+ };
+ ### end sig handler ###
+
+ return $self;
+}
+
+### display shell's banner, takes the Backend object as argument
+sub _show_banner {
+ my $self = shift;
+ my $cpan = $self->backend;
+ my $term = $self->term;
+
+ ### Tries to probe for our ReadLine support status
+ # a) under an interactive shell?
+ my $rl_avail = (!$term->isa('CPANPLUS::Shell::_Faked'))
+ # b) do we have a tty terminal?
+ ? (-t STDIN)
+ # c) should we enable the term?
+ ? (!$self->__is_bad_terminal($term))
+ # d) external modules available?
+ ? ($term->ReadLine ne "Term::ReadLine::Stub")
+ # a+b+c+d => "Smart" terminal
+ ? loc("enabled")
+ # a+b+c => "Stub" terminal
+ : loc("available (try 'i Term::ReadLine::Perl')")
+ # a+b => "Bad" terminal
+ : loc("disabled")
+ # a => "Dumb" terminal
+ : loc("suppressed")
+ # none => "Faked" terminal
+ : loc("suppressed in batch mode");
+
+ $rl_avail = loc("ReadLine support %1.", $rl_avail);
+ $rl_avail = "\n*** $rl_avail" if (length($rl_avail) > 45);
+
+ $self->__print(
+ loc("%1 -- CPAN exploration and module installation (v%2)",
+ $self->which, $self->which->VERSION()), "\n",
+ loc("*** Please report bugs to <bug-cpanplus\@rt.cpan.org>."), "\n",
+ loc("*** Using CPANPLUS::Backend v%1. %2",
+ $cpan->VERSION, $rl_avail), "\n\n"
+ );
+}
+
+### checks whether the Term::ReadLine is broken and needs to fallback to Stub
+sub __is_bad_terminal {
+ my $self = shift;
+ my $term = $self->term;
+
+ return unless $^O eq 'MSWin32';
+
+ ### replace the term with the default (stub) one
+ return $self->term(Term::ReadLine::Stub->new( $self->brand ) );
+}
+
+### open a pager handle
+sub _pager_open {
+ my $self = shift;
+ my $cpan = $self->backend;
+ my $cmd = $cpan->configure_object->get_program('pager') or return;
+
+ $self->_old_sigpipe( $SIG{PIPE} );
+ $SIG{PIPE} = 'IGNORE';
+
+ my $fh = new FileHandle;
+ unless ( $fh->open("| $cmd") ) {
+ error(loc("could not pipe to %1: %2\n", $cmd, $!) );
+ return;
+ }
+
+ $fh->autoflush(1);
+
+ $self->pager( $fh );
+ $self->_old_outfh( select $fh );
+
+ return $fh;
+}
+
+### print to the current pager handle, or STDOUT if it's not opened
+sub _pager_close {
+ my $self = shift;
+ my $pager = $self->pager or return;
+
+ $pager->close if (ref($pager) and $pager->can('close'));
+
+ $self->pager( undef );
+
+ select $self->_old_outfh;
+ $SIG{PIPE} = $self->_old_sigpipe;
+
+ return 1;
+}
+
+
+
+{
+ my $win32_console;
+
+ ### determines row count of current terminal; defaults to 25.
+ ### used by the pager functions
+ sub _term_rowcount {
+ my $self = shift;
+ my $cpan = $self->backend;
+ my %hash = @_;
+
+ my $default;
+ my $tmpl = {
+ default => { default => 25, allow => qr/^\d$/,
+ store => \$default }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ if ( $^O eq 'MSWin32' ) {
+ if ( can_load( modules => { 'Win32::Console' => '0.0' } ) ) {
+ $win32_console ||= Win32::Console->new();
+ my $rows = ($win32_console->Info)[-1];
+ return $rows;
+ }
+
+ } else {
+ local $Module::Load::Conditional::VERBOSE = 0;
+ if ( can_load(modules => {'Term::Size' => '0.0'}) ) {
+ my ($cols, $rows) = Term::Size::chars();
+ return $rows;
+ }
+ }
+ return $default;
+ }
+}
+
+### Custom print routines, mainly to be able to catch output
+### in test cases, or redirect it if need be
+{ sub __print {
+ my $self = shift;
+ print @_;
+ }
+
+ sub __printf {
+ my $self = shift;
+ my $fmt = shift;
+
+ ### MUST specify $fmt as a seperate param, and not as part
+ ### of @_, as it will then miss the $fmt and return the
+ ### number of elements in the list... =/ --kane
+ $self->__print( sprintf( $fmt, @_ ) );
+ }
+}
+
+1;
+
+=pod
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<CPANPLUS::Shell::Default>, L<CPANPLUS::Shell::Classic>, L<cpanp>
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Classic.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Classic.pm
new file mode 100755
index 00000000000..08c03bcf383
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Classic.pm
@@ -0,0 +1,1236 @@
+##################################################
+### CPANPLUS/Shell/Classic.pm ###
+### Backwards compatible shell for CPAN++ ###
+### Written 08-04-2002 by Jos Boumans ###
+##################################################
+
+package CPANPLUS::Shell::Classic;
+
+use strict;
+
+
+use CPANPLUS::Error;
+use CPANPLUS::Backend;
+use CPANPLUS::Configure::Setup;
+use CPANPLUS::Internals::Constants;
+
+use Cwd;
+use IPC::Cmd;
+use Term::UI;
+use Data::Dumper;
+use Term::ReadLine;
+
+use Module::Load qw[load];
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load];
+
+$Params::Check::VERBOSE = 1;
+$Params::Check::ALLOW_UNKNOWN = 1;
+
+BEGIN {
+ use vars qw[ $VERSION @ISA ];
+ @ISA = qw[ CPANPLUS::Shell::_Base::ReadLine ];
+ $VERSION = '0.0562';
+}
+
+load CPANPLUS::Shell;
+
+
+### our command set ###
+my $map = {
+ a => '_author',
+ b => '_bundle',
+ d => '_distribution',
+ 'm' => '_module',
+ i => '_find_all',
+ r => '_uptodate',
+ u => '_not_supported',
+ ls => '_ls',
+ get => '_fetch',
+ make => '_install',
+ test => '_install',
+ install => '_install',
+ clean => '_not_supported',
+ look => '_shell',
+ readme => '_readme',
+ h => '_help',
+ '?' => '_help',
+ o => '_set_conf',
+ reload => '_reload',
+ autobundle => '_autobundle',
+ '!' => '_bang',
+ #'q' => '_quit', # done it the loop itself
+};
+
+### the shell object, scoped to the file ###
+my $Shell;
+my $Brand = 'cpan';
+my $Prompt = $Brand . '> ';
+
+sub new {
+ my $class = shift;
+
+ my $cb = new CPANPLUS::Backend;
+ my $self = $class->SUPER::_init(
+ brand => $Brand,
+ term => Term::ReadLine->new( $Brand ),
+ prompt => $Prompt,
+ backend => $cb,
+ format => "%5s %-50s %8s %-10s\n",
+ );
+ ### make it available package wide ###
+ $Shell = $self;
+
+ ### enable verbose, it's the cpan.pm way
+ $cb->configure_object->set_conf( verbose => 1 );
+
+
+ ### register install callback ###
+ $cb->_register_callback(
+ name => 'install_prerequisite',
+ code => \&__ask_about_install,
+ );
+
+ ### register test report callback ###
+ $cb->_register_callback(
+ name => 'edit_test_report',
+ code => \&__ask_about_test_report,
+ );
+
+ return $self;
+}
+
+sub shell {
+ my $self = shift;
+ my $term = $self->term;
+
+ $self->_show_banner;
+ $self->_input_loop && print "\n";
+ $self->_quit;
+}
+
+sub _input_loop {
+ my $self = shift;
+ my $term = $self->term;
+ my $cb = $self->backend;
+
+ my $normal_quit = 0;
+ while (
+ defined (my $input = eval { $term->readline($self->prompt) } )
+ or $self->_signals->{INT}{count} == 1
+ ) {
+ ### re-initiate all signal handlers
+ while (my ($sig, $entry) = each %{$self->_signals} ) {
+ $SIG{$sig} = $entry->{handler} if exists($entry->{handler});
+ }
+
+ last if $self->_dispatch_on_input( input => $input );
+
+ ### flush the lib cache ###
+ $cb->_flush( list => [qw|lib load|] );
+
+ } continue {
+ $self->_signals->{INT}{count}--
+ if $self->_signals->{INT}{count}; # clear the sigint count
+ }
+
+ return 1;
+}
+
+sub _dispatch_on_input {
+ my $self = shift;
+ my $conf = $self->backend->configure_object();
+ my $term = $self->term;
+ my %hash = @_;
+
+ my $string;
+ my $tmpl = {
+ input => { required => 1, store => \$string }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### the original force setting;
+ my $force_store = $conf->get_conf( 'force' );
+
+ ### parse the input: the first part before the space
+ ### is the command, followed by arguments.
+ ### see the usage below
+ my $key;
+ PARSE_INPUT: {
+ $string =~ s|^\s*([\w\?\!]+)\s*||;
+ chomp $string;
+ $key = lc($1);
+ }
+
+ ### you prefixed the input with 'force'
+ ### that means we set the force flag, and
+ ### reparse the input...
+ ### YAY goto block :)
+ if( $key eq 'force' ) {
+ $conf->set_conf( force => 1 );
+ goto PARSE_INPUT;
+ }
+
+ ### you want to quit
+ return 1 if $key =~ /^q/;
+
+ my $method = $map->{$key};
+ unless( $self->can( $method ) ) {
+ print "Unknown command '$key'. Type ? for help.\n";
+ return;
+ }
+
+ ### dispatch the method call
+ eval { $self->$method(
+ command => $key,
+ result => [ split /\s+/, $string ],
+ input => $string );
+ };
+ warn $@ if $@;
+
+ return;
+}
+
+### displays quit message
+sub _quit {
+
+ ### well, that's what CPAN.pm says...
+ print "Lockfile removed\n";
+}
+
+sub _not_supported {
+ my $self = shift;
+ my %hash = @_;
+
+ my $cmd;
+ my $tmpl = {
+ command => { required => 1, store => \$cmd }
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ print "Sorry, the command '$cmd' is not supported\n";
+
+ return;
+}
+
+sub _fetch {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my($aref, $input);
+ my $tmpl = {
+ result => { store => \$aref, default => [] },
+ input => { default => 'all', store => \$input },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ for my $mod (@$aref) {
+ my $obj;
+
+ unless( $obj = $cb->module_tree($mod) ) {
+ print "Warning: Cannot get $input, don't know what it is\n";
+ print "Try the command\n\n";
+ print "\ti /$mod/\n\n";
+ print "to find objects with matching identifiers.\n";
+
+ next;
+ }
+
+ $obj->fetch && $obj->extract;
+ }
+
+ return $aref;
+}
+
+sub _install {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my $mapping = {
+ make => { target => TARGET_CREATE, skiptest => 1 },
+ test => { target => TARGET_CREATE },
+ install => { target => TARGET_INSTALL },
+ };
+
+ my($aref,$cmd);
+ my $tmpl = {
+ result => { store => \$aref, default => [] },
+ command => { required => 1, store => \$cmd, allow => [keys %$mapping] },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ for my $mod (@$aref) {
+ my $obj = $cb->module_tree( $mod );
+
+ unless( $obj ) {
+ print "No such module '$mod'\n";
+ next;
+ }
+
+ my $opts = $mapping->{$cmd};
+ $obj->install( %$opts );
+ }
+
+ return $aref;
+}
+
+sub _shell {
+ my $self = shift;
+ my $cb = $self->backend;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my($aref, $cmd);
+ my $tmpl = {
+ result => { store => \$aref, default => [] },
+ command => { required => 1, store => \$cmd },
+
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+
+ my $shell = $conf->get_program('shell');
+ unless( $shell ) {
+ print "Your configuration does not define a value for subshells.\n".
+ qq[Please define it with "o conf shell <your shell>"\n];
+ return;
+ }
+
+ my $cwd = Cwd::cwd();
+
+ for my $mod (@$aref) {
+ print "Running $cmd for $mod\n";
+
+ my $obj = $cb->module_tree( $mod ) or next;
+ $obj->fetch or next;
+ $obj->extract or next;
+
+ $cb->_chdir( dir => $obj->status->extract ) or next;
+
+ #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt;
+ if( system($shell) and $! ) {
+ print "Error executing your subshell '$shell': $!\n";
+ next;
+ }
+ }
+ $cb->_chdir( dir => $cwd );
+
+ return $aref;
+}
+
+sub _readme {
+ my $self = shift;
+ my $cb = $self->backend;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my($aref, $cmd);
+ my $tmpl = {
+ result => { store => \$aref, default => [] },
+ command => { required => 1, store => \$cmd },
+
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ for my $mod (@$aref) {
+ my $obj = $cb->module_tree( $mod ) or next;
+
+ if( my $readme = $obj->readme ) {
+
+ $self->_pager_open;
+ print $readme;
+ $self->_pager_close;
+ }
+ }
+
+ return 1;
+}
+
+sub _reload {
+ my $self = shift;
+ my $cb = $self->backend;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my($input, $cmd);
+ my $tmpl = {
+ input => { default => 'all', store => \$input },
+ command => { required => 1, store => \$cmd },
+
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ if ( $input =~ /cpan/i ) {
+ print qq[You want to reload the CPAN code\n];
+ print qq[Just type 'q' and then restart... ] .
+ qq[Trust me, it is MUCH safer\n];
+
+ } elsif ( $input =~ /index/i ) {
+ $cb->reload_indices(update_source => 1);
+
+ } else {
+ print qq[cpan re-evals the CPANPLUS.pm file\n];
+ print qq[index re-reads the index files\n];
+ }
+
+ return 1;
+}
+
+sub _autobundle {
+ my $self = shift;
+ my $cb = $self->backend;
+
+ print qq[Writing bundle file... This may take a while\n];
+
+ my $where = $cb->autobundle();
+
+ print $where
+ ? qq[\nWrote autobundle to $where\n]
+ : qq[\nCould not create autobundle\n];
+
+ return 1;
+}
+
+sub _set_conf {
+ my $self = shift;
+ my $cb = $self->backend;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my($aref, $input);
+ my $tmpl = {
+ result => { store => \$aref, default => [] },
+ input => { default => 'all', store => \$input },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my $type = shift @$aref;
+
+ if( $type eq 'debug' ) {
+ print qq[Sorry you cannot set debug options through ] .
+ qq[this shell in CPANPLUS\n];
+ return;
+
+ } elsif ( $type eq 'conf' ) {
+
+ ### from CPAN.pm :o)
+ # CPAN::Shell::o and CPAN::Config::edit are closely related. 'o conf'
+ # should have been called set and 'o debug' maybe 'set debug'
+
+ # commit Commit changes to disk
+ # defaults Reload defaults from disk
+ # init Interactive setting of all options
+
+ my $name = shift @$aref;
+ my $value = "@$aref";
+
+ if( $name eq 'init' ) {
+ my $setup = CPANPLUS::Configure::Setup->new(
+ conf => $cb->configure_object,
+ term => $self->term,
+ backend => $cb,
+ );
+ return $setup->init;
+
+ } elsif ($name eq 'commit' ) {;
+ $cb->configure_object->save;
+ print "Your CPAN++ configuration info has been saved!\n\n";
+ return;
+
+ } elsif ($name eq 'defaults' ) {
+ print qq[Sorry, CPANPLUS cannot restore default for you.\n] .
+ qq[Perhaps you should run the interactive setup again.\n] .
+ qq[\ttry running 'o conf init'\n];
+ return;
+
+ ### we're just supplying things in the 'conf' section now,
+ ### not the program section.. it's a bit of a hassle to make that
+ ### work cleanly with the original CPAN.pm interface, so we'll fix
+ ### it when people start complaining, which is hopefully never.
+ } else {
+ unless( $name ) {
+ my @list = grep { $_ ne 'hosts' }
+ $conf->options( type => $type );
+
+ my $method = 'get_' . $type;
+
+ local $Data::Dumper::Indent = 0;
+ for my $name ( @list ) {
+ my $val = $conf->$method($name);
+ ($val) = ref($val)
+ ? (Data::Dumper::Dumper($val) =~ /= (.*);$/)
+ : "'$val'";
+ printf " %-25s %s\n", $name, $val;
+ }
+
+ } elsif ( $name eq 'hosts' ) {
+ print "Setting hosts is not trivial.\n" .
+ "It is suggested you edit the " .
+ "configuration file manually";
+
+ } else {
+ my $method = 'set_' . $type;
+ if( $conf->$method($name => defined $value ? $value : '') ) {
+ my $set_to = defined $value ? $value : 'EMPTY STRING';
+ print "Key '$name' was set to '$set_to'\n";
+ }
+ }
+ }
+ } else {
+ print qq[Known options:\n] .
+ qq[ conf set or get configuration variables\n] .
+ qq[ debug set or get debugging options\n];
+ }
+
+ return;
+}
+
+########################
+### search functions ###
+########################
+
+sub _author {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my($aref, $short, $input, $class);
+ my $tmpl = {
+ result => { store => \$aref, default => ['/./'] },
+ short => { default => 0, store => \$short },
+ input => { default => 'all', store => \$input },
+ class => { default => 'Author', no_override => 1,
+ store => \$class },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my @regexes = map { m|/(.+)/| ? qr/$1/ : $_ } @$aref;
+
+
+ my @rv;
+ for my $type (qw[author cpanid]) {
+ push @rv, $cb->search( type => $type, allow => \@regexes );
+ }
+
+ unless( @rv ) {
+ print "No object of type $class found for argument $input\n"
+ unless $short;
+ return;
+ }
+
+ return $self->_pp_author(
+ result => \@rv,
+ class => $class,
+ short => $short,
+ input => $input );
+
+}
+
+### find all modules matching a query ###
+sub _module {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my($aref, $short, $input, $class);
+ my $tmpl = {
+ result => { store => \$aref, default => ['/./'] },
+ short => { default => 0, store => \$short },
+ input => { default => 'all', store => \$input },
+ class => { default => 'Module', no_override => 1,
+ store => \$class },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my @rv;
+ for my $module (@$aref) {
+ if( $module =~ m|/(.+)/| ) {
+ push @rv, $cb->search( type => 'module',
+ allow => [qr/$1/i] );
+ } else {
+ my $obj = $cb->module_tree( $module ) or next;
+ push @rv, $obj;
+ }
+ }
+
+ return $self->_pp_module(
+ result => \@rv,
+ class => $class,
+ short => $short,
+ input => $input );
+}
+
+### find all bundles matching a query ###
+sub _bundle {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my($aref, $short, $input, $class);
+ my $tmpl = {
+ result => { store => \$aref, default => ['/./'] },
+ short => { default => 0, store => \$short },
+ input => { default => 'all', store => \$input },
+ class => { default => 'Bundle', no_override => 1,
+ store => \$class },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my @rv;
+ for my $bundle (@$aref) {
+ if( $bundle =~ m|/(.+)/| ) {
+ push @rv, $cb->search( type => 'module',
+ allow => [qr/Bundle::.*?$1/i] );
+ } else {
+ my $obj = $cb->module_tree( "Bundle::${bundle}" ) or next;
+ push @rv, $obj;
+ }
+ }
+
+ return $self->_pp_module(
+ result => \@rv,
+ class => $class,
+ short => $short,
+ input => $input );
+}
+
+sub _distribution {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my($aref, $short, $input, $class);
+ my $tmpl = {
+ result => { store => \$aref, default => ['/./'] },
+ short => { default => 0, store => \$short },
+ input => { default => 'all', store => \$input },
+ class => { default => 'Distribution', no_override => 1,
+ store => \$class },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my @rv;
+ for my $module (@$aref) {
+ ### if it's a regex... ###
+ if ( my ($match) = $module =~ m|^/(.+)/$|) {
+
+ ### something like /FOO/Bar.tar.gz/ was entered
+ if (my ($path,$package) = $match =~ m|^/?(.+)/(.+)$|) {
+ my $seen;
+
+ my @data = $cb->search( type => 'package',
+ allow => [qr/$package/i] );
+
+ my @list = $cb->search( type => 'path',
+ allow => [qr/$path/i],
+ data => \@data );
+
+ ### make sure we dont list the same dist twice
+ for my $val ( @list ) {
+ next if $seen->{$val->package}++;
+
+ push @rv, $val;
+ }
+
+ ### something like /FOO/ or /Bar.tgz/ was entered
+ ### so we look both in the path, as well as in the package name
+ } else {
+ my $seen;
+ { my @list = $cb->search( type => 'package',
+ allow => [qr/$match/i] );
+
+ ### make sure we dont list the same dist twice
+ for my $val ( @list ) {
+ next if $seen->{$val->package}++;
+
+ push @rv, $val;
+ }
+ }
+
+ { my @list = $cb->search( type => 'path',
+ allow => [qr/$match/i] );
+
+ ### make sure we dont list the same dist twice
+ for my $val ( @list ) {
+ next if $seen->{$val->package}++;
+
+ push @rv, $val;
+ }
+
+ }
+ }
+
+ } else {
+
+ ### user entered a full dist, like: R/RC/RCAPUTO/POE-0.19.tar.gz
+ if (my ($path,$package) = $module =~ m|^/?(.+)/(.+)$|) {
+ my @data = $cb->search( type => 'package',
+ allow => [qr/^$package$/] );
+ my @list = $cb->search( type => 'path',
+ allow => [qr/$path$/i],
+ data => \@data);
+
+ ### make sure we dont list the same dist twice
+ my $seen;
+ for my $val ( @list ) {
+ next if $seen->{$val->package}++;
+
+ push @rv, $val;
+ }
+ }
+ }
+ }
+
+ return $self->_pp_distribution(
+ result => \@rv,
+ class => $class,
+ short => $short,
+ input => $input );
+}
+
+sub _find_all {
+ my $self = shift;
+
+ my @rv;
+ for my $method (qw[_author _bundle _module _distribution]) {
+ my $aref = $self->$method( @_, short => 1 );
+
+ push @rv, @$aref if $aref;
+ }
+
+ print scalar(@rv). " items found\n"
+}
+
+sub _uptodate {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my($aref, $short, $input, $class);
+ my $tmpl = {
+ result => { store => \$aref, default => ['/./'] },
+ short => { default => 0, store => \$short },
+ input => { default => 'all', store => \$input },
+ class => { default => 'Uptodate', no_override => 1,
+ store => \$class },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+
+ my @rv;
+ if( @$aref) {
+ for my $module (@$aref) {
+ if( $module =~ m|/(.+)/| ) {
+ my @list = $cb->search( type => 'module',
+ allow => [qr/$1/i] );
+
+ ### only add those that are installed and not core
+ push @rv, grep { not $_->package_is_perl_core }
+ grep { $_->installed_file }
+ @list;
+
+ } else {
+ my $obj = $cb->module_tree( $module ) or next;
+ push @rv, $obj;
+ }
+ }
+ } else {
+ @rv = @{$cb->_all_installed};
+ }
+
+ return $self->_pp_uptodate(
+ result => \@rv,
+ class => $class,
+ short => $short,
+ input => $input );
+}
+
+sub _ls {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my($aref, $short, $input, $class);
+ my $tmpl = {
+ result => { store => \$aref, default => [] },
+ short => { default => 0, store => \$short },
+ input => { default => 'all', store => \$input },
+ class => { default => 'Uptodate', no_override => 1,
+ store => \$class },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my @rv;
+ for my $name (@$aref) {
+ my $auth = $cb->author_tree( uc $name );
+
+ unless( $auth ) {
+ print qq[ls command rejects argument $name: not an author\n];
+ next;
+ }
+
+ push @rv, $auth->distributions;
+ }
+
+ return $self->_pp_ls(
+ result => \@rv,
+ class => $class,
+ short => $short,
+ input => $input );
+}
+
+############################
+### pretty printing subs ###
+############################
+
+
+sub _pp_author {
+ my $self = shift;
+ my %hash = @_;
+
+ my( $aref, $short, $class, $input );
+ my $tmpl = {
+ result => { required => 1, default => [], strict_type => 1,
+ store => \$aref },
+ short => { default => 0, store => \$short },
+ class => { required => 1, store => \$class },
+ input => { required => 1, store => \$input },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### no results
+ if( !@$aref ) {
+ print "No objects of type $class found for argument $input\n"
+ unless $short;
+
+ ### one result, long output desired;
+ } elsif( @$aref == 1 and !$short ) {
+
+ ### should look like this:
+ #cpan> a KANE
+ #Author id = KANE
+ # EMAIL boumans@frg.eur.nl
+ # FULLNAME Jos Boumans
+
+ my $obj = shift @$aref;
+
+ print "$class id = ", $obj->cpanid(), "\n";
+ printf " %-12s %s\n", 'EMAIL', $obj->email();
+ printf " %-12s %s%s\n", 'FULLNAME', $obj->author();
+
+ } else {
+
+ ### should look like this:
+ #Author KANE (Jos Boumans)
+ #Author LBROCARD (Leon Brocard)
+ #2 items found
+
+ for my $obj ( @$aref ) {
+ printf qq[%-15s %s ("%s" (%s))\n],
+ $class, $obj->cpanid, $obj->author, $obj->email;
+ }
+ print scalar(@$aref)." items found\n" unless $short;
+ }
+
+ return $aref;
+}
+
+sub _pp_module {
+ my $self = shift;
+ my %hash = @_;
+
+ my( $aref, $short, $class, $input );
+ my $tmpl = {
+ result => { required => 1, default => [], strict_type => 1,
+ store => \$aref },
+ short => { default => 0, store => \$short },
+ class => { required => 1, store => \$class },
+ input => { required => 1, store => \$input },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+
+ ### no results
+ if( !@$aref ) {
+ print "No objects of type $class found for argument $input\n"
+ unless $short;
+
+ ### one result, long output desired;
+ } elsif( @$aref == 1 and !$short ) {
+
+
+ ### should look like this:
+ #Module id = LWP
+ # DESCRIPTION Libwww-perl
+ # CPAN_USERID GAAS (Gisle Aas <gisle@ActiveState.com>)
+ # CPAN_VERSION 5.64
+ # CPAN_FILE G/GA/GAAS/libwww-perl-5.64.tar.gz
+ # DSLI_STATUS RmpO (released,mailing-list,perl,object-oriented)
+ # MANPAGE LWP - The World-Wide Web library for Perl
+ # INST_FILE C:\Perl\site\lib\LWP.pm
+ # INST_VERSION 5.62
+
+ my $obj = shift @$aref;
+ my $aut_obj = $obj->author;
+ my $format = " %-12s %s%s\n";
+
+ print "$class id = ", $obj->module(), "\n";
+ printf $format, 'DESCRIPTION', $obj->description()
+ if $obj->description();
+
+ printf $format, 'CPAN_USERID', $aut_obj->cpanid() . " (" .
+ $aut_obj->author() . " <" . $aut_obj->email() . ">)";
+
+ printf $format, 'CPAN_VERSION', $obj->version();
+ printf $format, 'CPAN_FILE', $obj->path() . '/' . $obj->package();
+
+ printf $format, 'DSLI_STATUS', $self->_pp_dslip($obj->dslip)
+ if $obj->dslip() =~ /\w/;
+
+ #printf $format, 'MANPAGE', $obj->foo();
+ ### this is for bundles... CPAN.pm downloads them,
+ #printf $format, 'CONATAINS,
+ # parses and goes from there...
+
+ printf $format, 'INST_FILE', $obj->installed_file ||
+ '(not installed)';
+ printf $format, 'INST_VERSION', $obj->installed_version;
+
+
+
+ } else {
+
+ ### should look like this:
+ #Module LWP (G/GA/GAAS/libwww-perl-5.64.tar.gz)
+ #Module POE (R/RC/RCAPUTO/POE-0.19.tar.gz)
+ #2 items found
+
+ for my $obj ( @$aref ) {
+ printf "%-15s %-15s (%s)\n", $class, $obj->module(),
+ $obj->path() .'/'. $obj->package();
+ }
+ print scalar(@$aref). " items found\n" unless $short;
+ }
+
+ return $aref;
+}
+
+sub _pp_dslip {
+ my $self = shift;
+ my $dslip = shift or return;
+
+ my (%_statusD, %_statusS, %_statusL, %_statusI);
+
+ @_statusD{qw(? i c a b R M S)} =
+ qw(unknown idea pre-alpha alpha beta released mature standard);
+
+ @_statusS{qw(? m d u n)} =
+ qw(unknown mailing-list developer comp.lang.perl.* none);
+
+ @_statusL{qw(? p c + o h)} = qw(unknown perl C C++ other hybrid);
+ @_statusI{qw(? f r O h)} =
+ qw(unknown functions references+ties object-oriented hybrid);
+
+ my @status = split("", $dslip);
+
+ my $results = sprintf( "%s (%s,%s,%s,%s)",
+ $dslip,
+ $_statusD{$status[0]},
+ $_statusS{$status[1]},
+ $_statusL{$status[2]},
+ $_statusI{$status[3]}
+ );
+
+ return $results;
+}
+
+sub _pp_distribution {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my( $aref, $short, $class, $input );
+ my $tmpl = {
+ result => { required => 1, default => [], strict_type => 1,
+ store => \$aref },
+ short => { default => 0, store => \$short },
+ class => { required => 1, store => \$class },
+ input => { required => 1, store => \$input },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+
+ ### no results
+ if( !@$aref ) {
+ print "No objects of type $class found for argument $input\n"
+ unless $short;
+
+ ### one result, long output desired;
+ } elsif( @$aref == 1 and !$short ) {
+
+
+ ### should look like this:
+ #Distribution id = S/SA/SABECK/POE-Component-Client-POP3-0.02.tar.gz
+ # CPAN_USERID SABECK (Scott Beck <scott@gossamer-threads.com>)
+ # CONTAINSMODS POE::Component::Client::POP3
+
+ my $obj = shift @$aref;
+ my $aut_obj = $obj->author;
+ my $pkg = $obj->package;
+ my $format = " %-12s %s\n";
+
+ my @list = $cb->search( type => 'package',
+ allow => [qr/^$pkg$/] );
+
+
+ print "$class id = ", $obj->path(), '/', $obj->package(), "\n";
+ printf $format, 'CPAN_USERID',
+ $aut_obj->cpanid .' ('. $aut_obj->author .
+ ' '. $aut_obj->email .')';
+
+ ### yes i know it's ugly, but it's what cpan.pm does
+ printf $format, 'CONTAINSMODS', join (' ', map { $_->module } @list);
+
+ } else {
+
+ ### should look like this:
+ #Distribution LWP (G/GA/GAAS/libwww-perl-5.64.tar.gz)
+ #Distribution POE (R/RC/RCAPUTO/POE-0.19.tar.gz)
+ #2 items found
+
+ for my $obj ( @$aref ) {
+ printf "%-15s %s\n", $class, $obj->path() .'/'. $obj->package();
+ }
+
+ print scalar(@$aref). " items found\n" unless $short;
+ }
+
+ return $aref;
+}
+
+sub _pp_uptodate {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my( $aref, $short, $class, $input );
+ my $tmpl = {
+ result => { required => 1, default => [], strict_type => 1,
+ store => \$aref },
+ short => { default => 0, store => \$short },
+ class => { required => 1, store => \$class },
+ input => { required => 1, store => \$input },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my $format = "%-25s %9s %9s %s\n";
+
+ my @not_uptodate;
+ my $no_version;
+
+ my %seen;
+ for my $mod (@$aref) {
+ next if $mod->package_is_perl_core;
+ next if $seen{ $mod->package }++;
+
+
+ if( $mod->installed_file and not $mod->installed_version ) {
+ $no_version++;
+ next;
+ }
+
+ push @not_uptodate, $mod unless $mod->is_uptodate;
+ }
+
+ unless( @not_uptodate ) {
+ my $string = $input
+ ? "for $input"
+ : '';
+ print "All modules are up to date $string\n";
+ return;
+
+ } else {
+ printf $format, ( 'Package namespace',
+ 'installed',
+ 'latest',
+ 'in CPAN file'
+ );
+ }
+
+ for my $mod ( sort { $a->module cmp $b->module } @not_uptodate ) {
+ printf $format, ( $mod->module,
+ $mod->installed_version,
+ $mod->version,
+ $mod->path .'/'. $mod->package,
+ );
+ }
+
+ print "$no_version installed modules have no (parsable) version number\n"
+ if $no_version;
+
+ return \@not_uptodate;
+}
+
+sub _pp_ls {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my( $aref, $short, $class, $input );
+ my $tmpl = {
+ result => { required => 1, default => [], strict_type => 1,
+ store => \$aref },
+ short => { default => 0, store => \$short },
+ class => { required => 1, store => \$class },
+ input => { required => 1, store => \$input },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### should look something like this:
+ #6272 2002-05-12 KANE/Acme-Comment-1.00.tar.gz
+ #8171 2002-08-13 KANE/Acme-Comment-1.01.zip
+ #7110 2002-09-04 KANE/Acme-Comment-1.02.tar.gz
+ #7571 2002-09-08 KANE/Acme-Intraweb-1.01.tar.gz
+ #6625 2001-08-23 KANE/Acme-POE-Knee-1.10.zip
+ #3058 2003-10-05 KANE/Acme-Test-0.02.tar.gz
+
+ ### don't know size or mtime
+ #my $format = "%8d %10s %s/%s\n";
+
+ for my $mod ( sort { $a->package cmp $b->package } @$aref ) {
+ print "\t" . $mod->package . "\n";
+ }
+
+ return $aref;
+}
+
+
+#############################
+### end pretty print subs ###
+#############################
+
+
+sub _bang {
+ my $self = shift;
+ my %hash = @_;
+
+ my( $input );
+ my $tmpl = {
+ input => { required => 1, store => \$input },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ eval $input;
+ warn $@ if $@;
+
+ print "\n";
+
+ return;
+}
+
+sub _help {
+ print qq[
+Display Information
+ a authors
+ b string display bundles
+ d or info distributions
+ m /regex/ about modules
+ i or anything of above
+ r none reinstall recommendations
+ u uninstalled distributions
+
+Download, Test, Make, Install...
+ get download
+ make make (implies get)
+ test modules, make test (implies make)
+ install dists, bundles make install (implies test)
+ clean make clean
+ look open subshell in these dists' directories
+ readme display these dists' README files
+
+Other
+ h,? display this menu ! perl-code eval a perl command
+ o conf [opt] set and query options q quit the cpan shell
+ reload cpan load CPAN.pm again reload index load newer indices
+ autobundle Snapshot force cmd unconditionally do cmd
+];
+
+}
+
+
+
+1;
+__END__
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Shell::Classic - CPAN.pm emulation for CPANPLUS
+
+=head1 DESCRIPTION
+
+The Classic shell is designed to provide the feel of the CPAN.pm shell
+using CPANPLUS underneath.
+
+For detailed documentation, refer to L<CPAN>.
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<CPANPLUS::Configure>, L<CPANPLUS::Module>, L<CPANPLUS::Module::Author>
+
+=cut
+
+
+=head1 SEE ALSO
+
+L<CPAN>
+
+=cut
+
+
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default.pm
new file mode 100755
index 00000000000..a441c87e794
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default.pm
@@ -0,0 +1,1938 @@
+package CPANPLUS::Shell::Default;
+
+use strict;
+
+
+use CPANPLUS::Error;
+use CPANPLUS::Backend;
+use CPANPLUS::Configure::Setup;
+use CPANPLUS::Internals::Constants;
+use CPANPLUS::Internals::Constants::Report qw[GRADE_FAIL];
+
+use Cwd;
+use IPC::Cmd;
+use Term::UI;
+use Data::Dumper;
+use Term::ReadLine;
+
+use Module::Load qw[load];
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load check_install];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+local $Params::Check::VERBOSE = 1;
+local $Data::Dumper::Indent = 1; # for dumpering from !
+
+BEGIN {
+ use vars qw[ $VERSION @ISA ];
+ @ISA = qw[ CPANPLUS::Shell::_Base::ReadLine ];
+ $VERSION = "0.9001";
+}
+
+load CPANPLUS::Shell;
+
+
+my $map = {
+ 'm' => '_search_module',
+ 'a' => '_search_author',
+ '!' => '_bang',
+ '?' => '_help',
+ 'h' => '_help',
+ 'q' => '_quit',
+ 'r' => '_readme',
+ 'v' => '_show_banner',
+ 'w' => '__display_results',
+ 'd' => '_fetch',
+ 'z' => '_shell',
+ 'f' => '_distributions',
+ 'x' => '_reload_indices',
+ 'i' => '_install',
+ 't' => '_install',
+ 'l' => '_details',
+ 'p' => '_print',
+ 's' => '_set_conf',
+ 'o' => '_uptodate',
+ 'b' => '_autobundle',
+ 'u' => '_uninstall',
+ '/' => '_meta', # undocumented for now
+ 'c' => '_reports',
+};
+### free letters: e g j k n y ###
+
+
+### will be filled if you have a .default-shell.rc and
+### Config::Auto installed
+my $rc = {};
+
+### the shell object, scoped to the file ###
+my $Shell;
+my $Brand = loc('CPAN Terminal');
+my $Prompt = $Brand . '> ';
+
+=pod
+
+=head1 NAME
+
+CPANPLUS::Shell::Default
+
+=head1 SYNOPSIS
+
+ ### loading the shell:
+ $ cpanp # run 'cpanp' from the command line
+ $ perl -MCPANPLUS -eshell # load the shell from the command line
+
+
+ use CPANPLUS::Shell qw[Default]; # load this shell via the API
+ # always done via CPANPLUS::Shell
+
+ my $ui = CPANPLUS::Shell->new;
+ $ui->shell; # run the shell
+ $ui->dispatch_on_input( input => 'x'); # update the source using the
+ # dispatch method
+
+ ### when in the shell:
+ ### Note that all commands can also take options.
+ ### Look at their underlying CPANPLUS::Backend methods to see
+ ### what options those are.
+ cpanp> h # show help messages
+ cpanp> ? # show help messages
+
+ cpanp> m Acme # find acme modules, allows regexes
+ cpanp> a KANE # find modules by kane, allows regexes
+ cpanp> f Acme::Foo # get a list of all releases of Acme::Foo
+
+ cpanp> i Acme::Foo # install Acme::Foo
+ cpanp> i Acme-Foo-1.3 # install version 1.3 of Acme::Foo
+ cpanp> i <URI> # install from URI, like ftp://foo.com/X.tgz
+ cpanp> i <DIR> # install from an absolute or relative directory
+ cpanp> i 1 3..5 # install search results 1, 3, 4 and 5
+ cpanp> i * # install all search results
+ cpanp> a KANE; i *; # find modules by kane, install all results
+ cpanp> t Acme::Foo # test Acme::Foo, without installing it
+ cpanp> u Acme::Foo # uninstall Acme::Foo
+ cpanp> d Acme::Foo # download Acme::Foo
+ cpanp> z Acme::Foo # download & extract Acme::Foo, then open a
+ # shell in the extraction directory
+
+ cpanp> c Acme::Foo # get a list of test results for Acme::Foo
+ cpanp> l Acme::Foo # view details about the Acme::Foo package
+ cpanp> r Acme::Foo # view Acme::Foo's README file
+ cpanp> o # get a list of all installed modules that
+ # are out of date
+ cpanp> o 1..3 # list uptodateness from a previous search
+
+ cpanp> s conf # show config settings
+ cpanp> s conf md5 1 # enable md5 checks
+ cpanp> s program # show program settings
+ cpanp> s edit # edit config file
+ cpanp> s reconfigure # go through initial configuration again
+ cpanp> s selfupdate # update your CPANPLUS install
+ cpanp> s save # save config to disk
+ cpanp> s mirrors # show currently selected mirrors
+
+ cpanp> ! [PERL CODE] # execute the following perl code
+
+ cpanp> b # create an autobundle for this computers
+ # perl installation
+ cpanp> x # reload index files (purges cache)
+ cpanp> x --update_source # reload index files, get fresh source files
+ cpanp> p [FILE] # print error stack (to a file)
+ cpanp> v # show the banner
+ cpanp> w # show last search results again
+
+ cpanp> q # quit the shell
+
+ cpanp> /plugins # list avialable plugins
+ cpanp> /? PLUGIN # list help test of <PLUGIN>
+
+ ### common options:
+ cpanp> i ... --skiptest # skip tests
+ cpanp> i ... --force # force all operations
+ cpanp> i ... --verbose # run in verbose mode
+
+=head1 DESCRIPTION
+
+This module provides the default user interface to C<CPANPLUS>. You
+can start it via the C<cpanp> binary, or as detailed in the L<SYNOPSIS>.
+
+=cut
+
+sub new {
+ my $class = shift;
+
+ my $cb = CPANPLUS::Backend->new( @_ );
+ my $self = $class->SUPER::_init(
+ brand => $Brand,
+ term => Term::ReadLine->new( $Brand ),
+ prompt => $Prompt,
+ backend => $cb,
+ format => "%4s %-55s %8s %-10s\n",
+ dist_format => "%4s %-42s %-12s %8s %-10s\n",
+ );
+ ### make it available package wide ###
+ $Shell = $self;
+
+ my $rc_file = File::Spec->catfile(
+ $cb->configure_object->get_conf('base'),
+ DOT_SHELL_DEFAULT_RC,
+ );
+
+
+ if( -e $rc_file && -r _ ) {
+ $rc = $self->_read_configuration_from_rc( $rc_file );
+ }
+
+ ### register install callback ###
+ $cb->_register_callback(
+ name => 'install_prerequisite',
+ code => \&__ask_about_install,
+ );
+
+ ### execute any login commands specified ###
+ $self->dispatch_on_input( input => $rc->{'login'} )
+ if defined $rc->{'login'};
+
+ ### register test report callbacks ###
+ $cb->_register_callback(
+ name => 'edit_test_report',
+ code => \&__ask_about_edit_test_report,
+ );
+
+ $cb->_register_callback(
+ name => 'send_test_report',
+ code => \&__ask_about_send_test_report,
+ );
+
+ $cb->_register_callback(
+ name => 'proceed_on_test_failure',
+ code => \&__ask_about_test_failure,
+ );
+
+ ### load all the plugins
+ $self->_plugins_init;
+
+ return $self;
+}
+
+sub shell {
+ my $self = shift;
+ my $term = $self->term;
+ my $conf = $self->backend->configure_object;
+
+ $self->_show_banner;
+ $self->__print( "*** Type 'p' now to show start up log\n" ); # XXX add to banner?
+ $self->_show_random_tip if $conf->get_conf('show_startup_tip');
+ $self->_input_loop && $self->__print( "\n" );
+ $self->_quit;
+}
+
+sub _input_loop {
+ my $self = shift;
+ my $term = $self->term;
+ my $cb = $self->backend;
+
+ my $normal_quit = 0;
+ while (
+ defined (my $input = eval { $term->readline($self->prompt) } )
+ or $self->_signals->{INT}{count} == 1
+ ) {
+ ### re-initiate all signal handlers
+ while (my ($sig, $entry) = each %{$self->_signals} ) {
+ $SIG{$sig} = $entry->{handler} if exists($entry->{handler});
+ }
+
+ $self->__print( "\n" );
+ last if $self->dispatch_on_input( input => $input );
+
+ ### flush the lib cache ###
+ $cb->_flush( list => [qw|lib load|] );
+
+ } continue {
+ ### clear the sigint count
+ $self->_signals->{INT}{count}--
+ if $self->_signals->{INT}{count};
+
+ ### reset the 'install prereq?' cached answer
+ $self->settings->{'install_all_prereqs'} = undef;
+
+ }
+
+ return 1;
+}
+
+### return 1 to quit ###
+sub dispatch_on_input {
+ my $self = shift;
+ my $conf = $self->backend->configure_object();
+ my $term = $self->term;
+ my %hash = @_;
+
+ my($string, $noninteractive);
+ my $tmpl = {
+ input => { required => 1, store => \$string },
+ noninteractive => { required => 0, store => \$noninteractive },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### indicates whether or not the user will receive a shell
+ ### prompt after the command has finished.
+ $self->noninteractive($noninteractive) if defined $noninteractive;
+
+ my $rv = 1;
+
+ my @cmds = split ';', $string;
+ while( my $input = shift @cmds ) {
+
+ ### to send over the socket ###
+ my $org_input = $input;
+
+ my $key; my $options;
+ { ### make whitespace not count when using special chars
+ { $input =~ s|^\s*([!?/])|$1 |; }
+
+ ### get the first letter of the input
+ $input =~ s|^\s*([\w\?\!/])\w*||;
+
+ chomp $input;
+ $key = lc($1);
+
+ ### we figured out what the command was...
+ ### if we have more input, that DOES NOT start with a white
+ ### space char, we misparsed.. like 'Test::Foo::Bar', which
+ ### would turn into 't', '::Foo::Bar'...
+ if( $input and $input !~ s/^\s+// ) {
+ $self->__print( loc("Could not understand command: %1\n".
+ "Possibly missing command before argument(s)?\n",
+ $org_input) );
+ return;
+ }
+
+ ### allow overrides from the config file ###
+ if( defined $rc->{$key} ) {
+ $input = $rc->{$key} . $input;
+ }
+
+ ### grab command line options like --no-force and --verbose ###
+ ($options,$input) = $term->parse_options($input)
+ unless $key eq '!';
+ }
+
+ ### emtpy line? ###
+ return unless $key;
+
+ ### time to quit ###
+ return 1 if $key eq 'q';
+
+ my $method = $map->{$key};
+
+ ### dispatch meta locally at all times ###
+ if( $key eq '/' ) {
+ ### keep track of failures
+ $rv *= length $self->$method(input => $input, options => $options);
+ next;
+ }
+
+ ### flush unless we're trying to print the stack
+ CPANPLUS::Error->flush unless $key eq 'p';
+
+ ### connected over a socket? ###
+ if( $self->remote ) {
+
+ ### unsupported commands ###
+ if( $key eq 'z' or
+ ($key eq 's' and $input =~ /^\s*edit/)
+ ) {
+ $self->__print( "\n",
+ loc( "Command '%1' not supported over remote connection",
+ join ' ', $key, $input
+ ), "\n\n" );
+
+ } else {
+ my($status,$buff) = $self->__send_remote_command($org_input);
+
+ $self->__print( "\n", loc("Command failed!"), "\n\n" )
+ unless $status;
+
+ ### keep track of failures
+ $rv *= length $status;
+
+ $self->_pager_open if $buff =~ tr/\n// > $self->_term_rowcount;
+ $self->__print( $buff );
+ $self->_pager_close;
+ }
+
+ ### or just a plain local shell? ###
+ } else {
+
+ unless( $self->can($method) ) {
+ $self->__print(loc("Unknown command '%1'. Usage:", $key), "\n");
+ $self->_help;
+
+ } else {
+
+ ### some methods don't need modules ###
+ my @mods;
+ @mods = $self->_select_modules($input)
+ unless grep {$key eq $_} qw[! m a v w x p s b / ? h];
+
+ ### keep track of failures
+ $rv *= defined eval { $self->$method(
+ modules => \@mods,
+ options => $options,
+ input => $input,
+ choice => $key )
+ };
+ error( $@ ) if $@;
+ }
+ }
+ }
+
+ ### outside the shell loop, we can return the actual return value;
+ return $rv if $self->noninteractive;
+
+ return;
+}
+
+sub _select_modules {
+ my $self = shift;
+ my $input = shift or return;
+ my $cache = $self->cache;
+ my $cb = $self->backend;
+
+ ### expand .. in $input
+ $input =~ s{\b(\d+)\s*\.\.\s*(\d+)\b}
+ {join(' ', ($1 < 1 ? 1 : $1) .. ($2 > $#{$cache} ? $#{$cache} : $2))}eg;
+
+ $input = join(' ', 1 .. $#{$cache}) if $input eq '*';
+ $input =~ s/'/::/g; # perl 4 convention
+
+ my @rv;
+ for my $mod (split /\s+/, $input) {
+
+ ### it's a cache look up ###
+ if( $mod =~ /^\d+/ and $mod > 0 ) {
+ unless( scalar @$cache ) {
+ $self->__print( loc("No search was done yet!"), "\n" );
+
+ } elsif ( my $obj = $cache->[$mod] ) {
+ push @rv, $obj;
+
+ } else {
+ $self->__print( loc("No such module: %1", $mod), "\n" );
+ }
+
+ } else {
+ my $obj = $cb->parse_module( module => $mod );
+
+ unless( $obj ) {
+ $self->__print( loc("No such module: %1", $mod), "\n" );
+
+ } else {
+ push @rv, $obj;
+ }
+ }
+ }
+
+ unless( scalar @rv ) {
+ $self->__print( loc("No modules found to operate on!\n") );
+ return;
+ } else {
+ return @rv;
+ }
+}
+
+sub _format_version {
+ my $self = shift;
+ my $version = shift || 0;
+
+ ### fudge $version into the 'optimal' format
+ $version = 0 if $version eq 'undef';
+ $version =~ s/_//g; # everything after gets stripped off otherwise
+
+ ### allow 6 digits after the dot, as that's how perl stringifies
+ ### x.y.z numbers.
+ $version = sprintf('%3.6f', $version);
+ $version = '' if $version == '0.00';
+ $version =~ s/(00{0,3})$/' ' x (length $1)/e;
+
+ return $version;
+}
+
+sub __display_results {
+ my $self = shift;
+ my $cache = $self->cache;
+
+ my @rv = @$cache;
+
+ if( scalar @rv ) {
+
+ $self->_pager_open if $#{$cache} >= $self->_term_rowcount;
+
+ my $i = 1;
+ for my $mod (@rv) {
+ next unless $mod; # first one is undef
+ # humans start counting at 1
+
+ ### for dists only -- we have checksum info
+ if( $mod->mtime ) {
+ $self->__printf(
+ $self->dist_format,
+ $i,
+ $mod->module,
+ $mod->mtime,
+ $self->_format_version( $mod->version ),
+ $mod->author->cpanid
+ );
+
+ } else {
+ $self->__printf(
+ $self->format,
+ $i,
+ $mod->module,
+ $self->_format_version( $mod->version ),
+ $mod->author->cpanid
+ );
+ }
+ $i++;
+ }
+
+ $self->_pager_close;
+
+ } else {
+ $self->__print( loc("No results to display"), "\n" );
+ }
+
+ return 1;
+}
+
+
+sub _quit {
+ my $self = shift;
+
+ $self->dispatch_on_input( input => $rc->{'logout'} )
+ if defined $rc->{'logout'};
+
+ $self->__print( loc("Exiting CPANPLUS shell"), "\n" );
+
+ return 1;
+}
+
+###########################
+### actual command subs ###
+###########################
+
+
+### print out the help message ###
+### perhaps, '?' should be a slightly different version ###
+{ my @help;
+ sub _help {
+ my $self = shift;
+ my %hash = @_;
+
+ my $input;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ input => { required => 0, store => \$input }
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+ }
+
+ @help = (
+loc('[General]' ),
+loc(' h | ? # display help' ),
+loc(' q # exit' ),
+loc(' v # version information' ),
+loc('[Search]' ),
+loc(' a AUTHOR ... # search by author(s)' ),
+loc(' m MODULE ... # search by module(s)' ),
+loc(' f MODULE ... # list all releases of a module' ),
+loc(" o [ MODULE ... ] # list installed module(s) that aren't up to date" ),
+loc(' w # display the result of your last search again' ),
+loc('[Operations]' ),
+loc(' i MODULE | NUMBER ... # install module(s), by name or by search number' ),
+loc(' i URI | ... # install module(s), by URI (ie http://foo.com/X.tgz)' ),
+loc(' i DIR | ... # install module(s), by path (ie ./Module-1.0)' ),
+loc(' t MODULE | NUMBER ... # test module(s), by name or by search number' ),
+loc(' u MODULE | NUMBER ... # uninstall module(s), by name or by search number' ),
+loc(' d MODULE | NUMBER ... # download module(s)' ),
+loc(' l MODULE | NUMBER ... # display detailed information about module(s)' ),
+loc(' r MODULE | NUMBER ... # display README files of module(s)' ),
+loc(' c MODULE | NUMBER ... # check for module report(s) from cpan-testers' ),
+loc(' z MODULE | NUMBER ... # extract module(s) and open command prompt in it' ),
+loc('[Local Administration]' ),
+loc(' b # write a bundle file for your configuration' ),
+loc(' s program [OPT VALUE] # set program locations for this session' ),
+loc(' s conf [OPT VALUE] # set config options for this session' ),
+loc(' s mirrors # show currently selected mirrors' ),
+loc(' s reconfigure # reconfigure settings ' ),
+loc(' s selfupdate # update your CPANPLUS install '),
+loc(' s save [user|system] # save settings for this user or systemwide' ),
+loc(' s edit [user|system] # open configuration file in editor and reload' ),
+loc(' ! EXPR # evaluate a perl statement' ),
+loc(' p [FILE] # print the error stack (optionally to a file)' ),
+loc(' x # reload CPAN indices (purges cache)' ),
+loc(' x --update_source # reload CPAN indices, get fresh source files' ),
+loc('[Common Options]' ),
+loc(' i ... --skiptest # skip tests' ),
+loc(' i ... --force # force all operations' ),
+loc(' i ... --verbose # run in verbose mode' ),
+loc('[Plugins]' ),
+loc(' /plugins # list available plugins' ),
+loc(' /? [PLUGIN NAME] # show usage for (a particular) plugin(s)' ),
+
+ ) unless @help;
+
+ $self->_pager_open if (@help >= $self->_term_rowcount);
+ ### XXX: functional placeholder for actual 'detailed' help.
+ $self->__print( "Detailed help for the command '$input' is " .
+ "not available.\n\n" ) if length $input;
+ $self->__print( map {"$_\n"} @help );
+ $self->__print( $/ );
+ $self->_pager_close;
+
+ return 1;
+ }
+}
+
+### eval some code ###
+sub _bang {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+
+ my $input;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ input => { required => 1, store => \$input }
+ };
+
+ my $args = check( $tmpl, \%hash ) or return;
+ }
+
+ local $Data::Dumper::Indent = 1; # for dumpering from !
+ eval $input;
+ error( $@ ) if $@;
+ $self->__print( "\n" );
+
+ return if $@;
+ return 1;
+}
+
+sub _search_module {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my $args;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ input => { required => 1, },
+ options => { default => { } },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ my @regexes = map { qr/$_/i } split /\s+/, $args->{'input'};
+
+ ### XXX this is rather slow, because (probably)
+ ### of the many method calls
+ ### XXX need to profile to speed it up =/
+
+ ### find the modules ###
+ my @rv = sort { $a->module cmp $b->module }
+ $cb->search(
+ %{$args->{'options'}},
+ type => 'module',
+ allow => \@regexes,
+ );
+
+ ### store the result in the cache ###
+ $self->cache([undef,@rv]);
+
+ $self->__display_results;
+
+ return 1;
+}
+
+sub _search_author {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my $args;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ input => { required => 1, },
+ options => { default => { } },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ my @regexes = map { qr/$_/i } split /\s+/, $args->{'input'};
+
+ my @rv;
+ for my $type (qw[author cpanid]) {
+ push @rv, $cb->search(
+ %{$args->{'options'}},
+ type => $type,
+ allow => \@regexes,
+ );
+ }
+
+ my %seen;
+ my @list = sort { $a->module cmp $b->module }
+ grep { defined }
+ map { $_->modules }
+ grep { not $seen{$_}++ } @rv;
+
+ $self->cache([undef,@list]);
+
+ $self->__display_results;
+ return 1;
+}
+
+sub _readme {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my $args; my $mods; my $opts;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ modules => { required => 1, store => \$mods },
+ options => { default => { }, store => \$opts },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ return unless scalar @$mods;
+
+ $self->_pager_open;
+ for my $mod ( @$mods ) {
+ $self->__print( $mod->readme( %$opts ) );
+ }
+
+ $self->_pager_close;
+
+ return 1;
+}
+
+sub _fetch {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my $args; my $mods; my $opts;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ modules => { required => 1, store => \$mods },
+ options => { default => { }, store => \$opts },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ $self->_pager_open if @$mods >= $self->_term_rowcount;
+ my $rv = 1;
+ for my $mod (@$mods) {
+ my $where = $mod->fetch( %$opts );
+
+ $rv *= length $where;
+
+ $self->__print(
+ $where
+ ? loc("Successfully fetched '%1' to '%2'",
+ $mod->module, $where )
+ : loc("Failed to fetch '%1'", $mod->module)
+ );
+ $self->__print( "\n" );
+ }
+ $self->_pager_close;
+
+ return 1 if $rv;
+ return;
+}
+
+sub _shell {
+ my $self = shift;
+ my $cb = $self->backend;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $shell = $conf->get_program('shell');
+ unless( $shell ) {
+ $self->__print(
+ loc("Your config does not specify a subshell!"), "\n",
+ loc("Perhaps you need to re-run your setup?"), "\n"
+ );
+ return;
+ }
+
+ my $args; my $mods; my $opts;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ modules => { required => 1, store => \$mods },
+ options => { default => { }, store => \$opts },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ my $cwd = Cwd::cwd();
+ for my $mod (@$mods) {
+ $mod->fetch( %$opts ) or next;
+ $mod->extract( %$opts ) or next;
+
+ $cb->_chdir( dir => $mod->status->extract() ) or next;
+
+ #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt;
+
+ if( system($shell) and $! ) {
+ $self->__print(
+ loc("Error executing your subshell '%1': %2",
+ $shell, $!),"\n"
+ );
+ next;
+ }
+ }
+ $cb->_chdir( dir => $cwd );
+
+ return 1;
+}
+
+sub _distributions {
+ my $self = shift;
+ my $cb = $self->backend;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $args; my $mods; my $opts;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ modules => { required => 1, store => \$mods },
+ options => { default => { }, store => \$opts },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ my @list;
+ for my $mod (@$mods) {
+ push @list, sort { $a->version <=> $b->version }
+ grep { defined } $mod->distributions( %$opts );
+ }
+
+ my @rv = sort { $a->module cmp $b->module } @list;
+
+ $self->cache([undef,@rv]);
+ $self->__display_results;
+
+ return 1;
+}
+
+sub _reload_indices {
+ my $self = shift;
+ my $cb = $self->backend;
+ my %hash = @_;
+
+ my $args; my $opts;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ options => { default => { }, store => \$opts },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ my $rv = $cb->reload_indices( %$opts );
+
+ ### so the update failed, but you didnt give it any options either
+ if( !$rv and !(keys %$opts) ) {
+ $self->__print(
+ "\nFailure may be due to corrupt source files\n" .
+ "Try this:\n\tx --update_source\n\n" );
+ }
+
+ return $rv;
+
+}
+
+sub _install {
+ my $self = shift;
+ my $cb = $self->backend;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $args; my $mods; my $opts; my $choice;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ modules => { required => 1, store => \$mods },
+ options => { default => { }, store => \$opts },
+ choice => { required => 1, store => \$choice,
+ allow => [qw|i t|] },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ unless( scalar @$mods ) {
+ $self->__print( loc("Nothing done\n") );
+ return;
+ }
+
+ my $target = $choice eq 'i' ? TARGET_INSTALL : TARGET_CREATE;
+ my $prompt = $choice eq 'i' ? loc('Installing ') : loc('Testing ');
+ my $action = $choice eq 'i' ? 'install' : 'test';
+
+ my $status = {};
+ ### first loop over the mods to install them ###
+ for my $mod (@$mods) {
+ $self->__print( $prompt, $mod->module, " (".$mod->version.")", "\n" );
+
+ my $log_length = length CPANPLUS::Error->stack_as_string;
+
+ ### store the status for look up when we're done with all
+ ### install calls
+ $status->{$mod} = $mod->install( %$opts, target => $target );
+
+ ### would you like a log file of what happened?
+ if( $conf->get_conf('write_install_logs') ) {
+
+ if ( ON_WIN32 and !check_install(
+ module => 'IPC::Run', version => 0.55 )
+ ) {
+ error(loc("IPC::Run version '%1' is required on MSWin32"
+ . " in order to capture buffers."
+ . " The logfile generated may not contain"
+ . " any useful data, until it is installed", 0.55));
+ }
+
+ my $dir = File::Spec->catdir(
+ $conf->get_conf('base'),
+ $conf->_get_build('install_log_dir'),
+ );
+ ### create the dir if it doesn't exit yet
+ $cb->_mkdir( dir => $dir ) unless -d $dir;
+
+ my $file = File::Spec->catfile(
+ $dir,
+ INSTALL_LOG_FILE->( $mod )
+ );
+ if ( open my $fh, ">$file" ) {
+ my $stack = CPANPLUS::Error->stack_as_string;
+ ### remove everything in the log that was there *before*
+ ### we started this install
+ substr( $stack, 0, $log_length, '' );
+
+ print $fh $stack;
+ close $fh;
+
+ $self->__print(
+ loc("*** Install log written to:\n %1\n\n", $file)
+ );
+ } else {
+ warn "Could not open '$file': $!\n";
+ next;
+ }
+ }
+ }
+
+ my $flag;
+ ### then report whether all this went ok or not ###
+ for my $mod (@$mods) {
+ # if( $mod->status->installed ) {
+ if( $status->{$mod} ) {
+ $self->__print(
+ loc("Module '%1' %tense(%2,past) successfully\n",
+ $mod->module, $action)
+ );
+ } else {
+ $flag++;
+ $self->__print(
+ loc("Error %tense(%1,present) '%2'\n", $action, $mod->module)
+ );
+ }
+ }
+
+
+
+ if( !$flag ) {
+ $self->__print(
+ loc("No errors %tense(%1,present) all modules", $action), "\n"
+ );
+ } else {
+ $self->__print(
+ loc("Problem %tense(%1,present) one or more modules", $action)
+ );
+ $self->__print( "\n" );
+
+ $self->__print(
+ loc("*** You can view the complete error buffer by pressing ".
+ "'%1' ***\n", 'p')
+ ) unless $conf->get_conf('verbose') || $self->noninteractive;
+ }
+ $self->__print( "\n" );
+
+ return !$flag;
+}
+
+sub __ask_about_install {
+ my $mod = shift or return;
+ my $prereq = shift or return;
+ my $term = $Shell->term;
+
+ $Shell->__print( "\n" );
+ $Shell->__print( loc("Module '%1' requires '%2' to be installed",
+ $mod->module, $prereq->module ) );
+ $Shell->__print( "\n\n" );
+
+ ### previously cached answer?
+ return $Shell->settings->{'install_all_prereqs'}
+ if defined $Shell->settings->{'install_all_prereqs'};
+
+
+ $Shell->__print(
+ loc( "If you don't wish to see this question anymore\n".
+ "you can disable it by entering the following ".
+ "commands on the prompt:\n '%1'",
+ 's conf prereqs 1; s save' ) );
+ $Shell->__print("\n\n");
+
+ my $yes = loc("Yes");
+ my $no = loc("No");
+ my $all = loc("Yes to all (for this module)");
+ my $none = loc("No to all (for this module)");
+
+ my $reply = $term->get_reply(
+ prompt => loc("Should I install this module?"),
+ choices => [ $yes, $no, $all, $none ],
+ default => $yes,
+ );
+
+ ### if 'all' or 'none', save this, so we can apply it to
+ ### other prereqs in this chain.
+ $Shell->settings->{'install_all_prereqs'} =
+ $reply eq $all ? 1 :
+ $reply eq $none ? 0 :
+ undef;
+
+ ### if 'yes' or 'all', the user wants it installed
+ return $reply eq $all ? 1 :
+ $reply eq $yes ? 1 :
+ 0;
+}
+
+sub __ask_about_send_test_report {
+ my($mod, $grade) = @_;
+ return 1 unless $grade eq GRADE_FAIL;
+
+ my $term = $Shell->term;
+
+ $Shell->__print( "\n" );
+ $Shell->__print(
+ loc("Test report prepared for module '%1'.\n Would you like to ".
+ "send it? (You can edit it if you like)", $mod->module ) );
+ $Shell->__print( "\n\n" );
+ my $bool = $term->ask_yn(
+ prompt => loc("Would you like to send the test report?"),
+ default => 'n'
+ );
+
+ return $bool;
+}
+
+sub __ask_about_edit_test_report {
+ my($mod, $grade) = @_;
+ return 0 unless $grade eq GRADE_FAIL;
+
+ my $term = $Shell->term;
+
+ $Shell->__print( "\n" );
+ $Shell->__print(
+ loc("Test report prepared for module '%1'. You can edit this ".
+ "report if you would like", $mod->module ) );
+ $Shell->__print("\n\n");
+ my $bool = $term->ask_yn(
+ prompt => loc("Would you like to edit the test report?"),
+ default => 'y'
+ );
+
+ return $bool;
+}
+
+sub __ask_about_test_failure {
+ my $mod = shift;
+ my $captured = shift || '';
+ my $term = $Shell->term;
+
+ $Shell->__print( "\n" );
+ $Shell->__print(
+ loc( "The tests for '%1' failed. Would you like me to proceed ".
+ "anyway or should we abort?", $mod->module ) );
+ $Shell->__print( "\n\n" );
+
+ my $bool = $term->ask_yn(
+ prompt => loc("Proceed anyway?"),
+ default => 'n',
+ );
+
+ return $bool;
+}
+
+
+sub _details {
+ my $self = shift;
+ my $cb = $self->backend;
+ my $conf = $cb->configure_object;
+ my %hash = @_;
+
+ my $args; my $mods; my $opts;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ modules => { required => 1, store => \$mods },
+ options => { default => { }, store => \$opts },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ ### every module has about 10 lines of details
+ ### maybe more later with Module::CPANTS etc
+ $self->_pager_open if scalar @$mods * 10 > $self->_term_rowcount;
+
+
+ my $format = "%-24s %-45s\n";
+ my $cformat = "%-24s %-45s %-10s\n";
+ for my $mod (@$mods) {
+ my $href = $mod->details( %$opts );
+ my @list = sort { $a->module cmp $b->module } $mod->contains;
+
+ unless( $href ) {
+ $self->__print(
+ loc("No details for %1 - it might be outdated.",
+ $mod->module), "\n" );
+ next;
+
+ } else {
+ $self->__print( loc( "Details for '%1'\n", $mod->module ) );
+ for my $item ( sort keys %$href ) {
+ $self->__printf( $format, $item, $href->{$item} );
+ }
+
+ my $showed;
+ for my $item ( @list ) {
+ $self->__printf(
+ $cformat, ($showed ? '' : 'Contains:'),
+ $item->module, $item->version
+ );
+ $showed++;
+ }
+ $self->__print( "\n" );
+ }
+ }
+ $self->_pager_close;
+ $self->__print( "\n" );
+
+ return 1;
+}
+
+sub _print {
+ my $self = shift;
+ my %hash = @_;
+
+ my $args; my $opts; my $file;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ options => { default => { }, store => \$opts },
+ input => { default => '', store => \$file },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ my $old; my $fh;
+ if( $file ) {
+ $fh = FileHandle->new( ">$file" )
+ or( warn loc("Could not open '%1': '%2'", $file, $!),
+ return
+ );
+ $old = select $fh;
+ }
+
+
+ $self->_pager_open if !$file;
+
+ $self->__print( CPANPLUS::Error->stack_as_string );
+
+ $self->_pager_close;
+
+ select $old if $old;
+ $self->__print( "\n" );
+
+ return 1;
+}
+
+sub _set_conf {
+ my $self = shift;
+ my %hash = @_;
+ my $cb = $self->backend;
+ my $conf = $cb->configure_object;
+
+ ### possible options
+ ### XXX hard coded, not optimal :(
+ my %types = (
+ reconfigure => '',
+ save => q([user | system | boxed]),
+ edit => '',
+ program => q([key => val]),
+ conf => q([key => val]),
+ mirrors => '',
+ selfupdate => '', # XXX add all opts here?
+ );
+
+
+ my $args; my $opts; my $input;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ options => { default => { }, store => \$opts },
+ input => { default => '', store => \$input },
+ };
+
+ $args = check( $tmpl, \%hash ) or return;
+ }
+
+ my ($type,$key,$value) = $input =~ m/(\w+)\s*(\w*)\s*(.*?)$/;
+ $value =~ s/\s+$//g if $value;
+ $type = lc $type;
+
+ if( $type eq 'reconfigure' ) {
+ my $setup = CPANPLUS::Configure::Setup->new(
+ configure_object => $conf,
+ term => $self->term,
+ backend => $cb,
+ );
+ return $setup->init;
+
+ } elsif ( $type eq 'save' ) {
+ my $where = {
+ user => CONFIG_USER,
+ system => CONFIG_SYSTEM,
+ boxed => CONFIG_BOXED,
+ }->{ $key } || CONFIG_USER;
+
+ ### boxed is special, so let's get its value from %INC
+ ### so we can tell it where to save
+ ### XXX perhaps this logic should be generic for all
+ ### types, and put in the ->save() routine
+ my $dir;
+ if( $where eq CONFIG_BOXED ) {
+ my $file = join( '/', split( '::', CONFIG_BOXED ) ) . '.pm';
+ my $file_re = quotemeta($file);
+
+ my $path = $INC{$file} || '';
+ $path =~ s/$file_re$//;
+ $dir = $path;
+ }
+
+ my $rv = $cb->configure_object->save( $where => $dir );
+
+ $self->__print(
+ $rv
+ ? loc("Configuration successfully saved to %1\n (%2)\n",
+ $where, $rv)
+ : loc("Failed to save configuration\n" )
+ );
+ return $rv;
+
+ } elsif ( $type eq 'edit' ) {
+
+ my $editor = $conf->get_program('editor')
+ or( print(loc("No editor specified")), return );
+
+ my $where = {
+ user => CONFIG_USER,
+ system => CONFIG_SYSTEM,
+ }->{ $key } || CONFIG_USER;
+
+ my $file = $conf->_config_pm_to_file( $where );
+ system($editor,$file);
+
+ ### now reload it
+ ### disable warnings for this
+ { require Module::Loaded;
+ Module::Loaded::mark_as_unloaded( $where );
+
+ ### reinitialize the config
+ local $^W;
+ $conf->init;
+ }
+
+ return 1;
+
+ } elsif ( $type eq 'mirrors' ) {
+
+ $self->__print(
+ loc("Readonly list of mirrors (in order of preference):\n\n" ) );
+
+ my $i;
+ for my $host ( @{$conf->get_conf('hosts')} ) {
+ my $uri = $cb->_host_to_uri( %$host );
+
+ $i++;
+ $self->__print( "\t[$i] $uri\n" );
+ }
+
+ $self->__print(
+ loc("\nTo edit this list, please type: '%1'\n", 's edit') );
+
+ } elsif ( $type eq 'selfupdate' ) {
+ my %valid = map { $_ => $_ }
+ $cb->selfupdate_object->list_categories;
+
+ unless( $valid{$key} ) {
+ $self->__print(
+ loc( "To update your current CPANPLUS installation, ".
+ "choose one of the these options:\n%1",
+ ( join $/, map {
+ sprintf "\ts selfupdate %-17s " .
+ "[--latest=0] [--dryrun]", $_
+ } sort keys %valid )
+ )
+ );
+ } else {
+ my %update_args = (
+ update => $key,
+ latest => 1,
+ %$opts
+ );
+
+
+ my %list = $cb->selfupdate_object
+ ->list_modules_to_update( %update_args );
+
+ $self->__print(loc("The following updates will take place:"),$/.$/);
+
+ for my $feature ( sort keys %list ) {
+ my $aref = $list{$feature};
+
+ ### is it a 'feature' or a built in?
+ $self->__print(
+ $valid{$feature}
+ ? " " . ucfirst($feature) . ":\n"
+ : " Modules for '$feature' support:\n"
+ );
+
+ ### show what modules would be installed
+ $self->__print(
+ scalar @$aref
+ ? map { sprintf " %-42s %-6s -> %-6s \n",
+ $_->name, $_->installed_version, $_->version
+ } @$aref
+ : " No upgrades required\n"
+ );
+ $self->__print( $/ );
+ }
+
+
+ unless( $opts->{'dryrun'} ) {
+ $self->__print( loc("Updating your CPANPLUS installation\n") );
+ $cb->selfupdate_object->selfupdate( %update_args );
+ }
+ }
+
+ } else {
+
+ if ( $type eq 'program' or $type eq 'conf' ) {
+
+ my $format = {
+ conf => '%-25s %s',
+ program => '%-12s %s',
+ }->{ $type };
+
+ unless( $key ) {
+ my @list = grep { $_ ne 'hosts' }
+ $conf->options( type => $type );
+
+ my $method = 'get_' . $type;
+
+ local $Data::Dumper::Indent = 0;
+ for my $name ( @list ) {
+ my $val = $conf->$method($name) || '';
+ ($val) = ref($val)
+ ? (Data::Dumper::Dumper($val) =~ /= (.*);$/)
+ : "'$val'";
+
+ $self->__printf( " $format\n", $name, $val );
+ }
+
+ } elsif ( $key eq 'hosts' or $key eq 'lib' ) {
+ $self->__print(
+ loc( "Setting %1 is not trivial.\n" .
+ "It is suggested you use '%2' and edit the " .
+ "configuration file manually", $key, 's edit')
+ );
+ } else {
+ my $method = 'set_' . $type;
+ $conf->$method( $key => defined $value ? $value : '' )
+ and $self->__print( loc("Key '%1' was set to '%2'", $key,
+ defined $value ? $value : 'EMPTY STRING') );
+ }
+
+ } else {
+ $self->__print( loc("Unknown type '%1'",$type || 'EMPTY' ) );
+ $self->__print( $/ );
+ $self->__print( loc("Try one of the following:") );
+ $self->__print( $/, join $/,
+ map { sprintf "\t%-11s %s", $_, $types{$_} }
+ sort keys %types );
+ }
+ }
+ $self->__print( "\n" );
+ return 1;
+}
+
+sub _uptodate {
+ my $self = shift;
+ my %hash = @_;
+ my $cb = $self->backend;
+ my $conf = $cb->configure_object;
+
+ my $opts; my $mods;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ options => { default => { }, store => \$opts },
+ modules => { required => 1, store => \$mods },
+ };
+
+ check( $tmpl, \%hash ) or return;
+ }
+
+ ### long listing? short is default ###
+ my $long = $opts->{'long'} ? 1 : 0;
+
+ my @list = scalar @$mods ? @$mods : @{$cb->_all_installed};
+
+ my @rv; my %seen;
+ for my $mod (@list) {
+ ### skip this mod if it's up to date ###
+ next if $mod->is_uptodate;
+ ### skip this mod if it's core ###
+ next if $mod->package_is_perl_core;
+
+ if( $long or !$seen{$mod->package}++ ) {
+ push @rv, $mod;
+ }
+ }
+
+ @rv = sort { $a->module cmp $b->module } @rv;
+
+ $self->cache([undef,@rv]);
+
+ $self->_pager_open if scalar @rv >= $self->_term_rowcount;
+
+ my $format = "%5s %12s %12s %-36s %-10s\n";
+
+ my $i = 1;
+ for my $mod ( @rv ) {
+ $self->__printf(
+ $format,
+ $i,
+ $self->_format_version($mod->installed_version) || 'Unparsable',
+ $self->_format_version( $mod->version ),
+ $mod->module,
+ $mod->author->cpanid
+ );
+ $i++;
+ }
+ $self->_pager_close;
+
+ return 1;
+}
+
+sub _autobundle {
+ my $self = shift;
+ my %hash = @_;
+ my $cb = $self->backend;
+ my $conf = $cb->configure_object;
+
+ my $opts; my $input;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ options => { default => { }, store => \$opts },
+ input => { default => '', store => \$input },
+ };
+
+ check( $tmpl, \%hash ) or return;
+ }
+
+ $opts->{'path'} = $input if $input;
+
+ my $where = $cb->autobundle( %$opts );
+
+ $self->__print(
+ $where
+ ? loc("Wrote autobundle to '%1'", $where)
+ : loc("Could not create autobundle" )
+ );
+ $self->__print( "\n" );
+
+ return $where ? 1 : 0;
+}
+
+sub _uninstall {
+ my $self = shift;
+ my %hash = @_;
+ my $cb = $self->backend;
+ my $term = $self->term;
+ my $conf = $cb->configure_object;
+
+ my $opts; my $mods;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ options => { default => { }, store => \$opts },
+ modules => { default => [], store => \$mods },
+ };
+
+ check( $tmpl, \%hash ) or return;
+ }
+
+ my $force = $opts->{'force'} || $conf->get_conf('force');
+
+ unless( $force ) {
+ my $list = join "\n", map { ' ' . $_->module } @$mods;
+
+ $self->__print( loc("
+This will uninstall the following modules:
+%1
+
+Note that if you installed them via a package manager, you probably
+should use the same package manager to uninstall them
+
+", $list) );
+
+ return unless $term->ask_yn(
+ prompt => loc("Are you sure you want to continue?"),
+ default => 'n',
+ );
+ }
+
+ ### first loop over all the modules to uninstall them ###
+ for my $mod (@$mods) {
+ $self->__print( loc("Uninstalling '%1'", $mod->module), "\n" );
+
+ $mod->uninstall( %$opts );
+ }
+
+ my $flag;
+ ### then report whether all this went ok or not ###
+ for my $mod (@$mods) {
+ if( $mod->status->uninstall ) {
+ $self->__print(
+ loc("Module '%1' %tense(uninstall,past) successfully\n",
+ $mod->module ) );
+ } else {
+ $flag++;
+ $self->__print(
+ loc("Error %tense(uninstall,present) '%1'\n", $mod->module) );
+ }
+ }
+
+ if( !$flag ) {
+ $self->__print(
+ loc("All modules %tense(uninstall,past) successfully"), "\n" );
+ } else {
+ $self->__print(
+ loc("Problem %tense(uninstall,present) one or more modules" ),
+ "\n" );
+
+ $self->__print(
+ loc("*** You can view the complete error buffer by pressing '%1'".
+ "***\n", 'p') ) unless $conf->get_conf('verbose');
+ }
+ $self->__print( "\n" );
+
+ return !$flag;
+}
+
+sub _reports {
+ my $self = shift;
+ my %hash = @_;
+ my $cb = $self->backend;
+ my $term = $self->term;
+ my $conf = $cb->configure_object;
+
+ my $opts; my $mods;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ options => { default => { }, store => \$opts },
+ modules => { default => '', store => \$mods },
+ };
+
+ check( $tmpl, \%hash ) or return;
+ }
+
+ ### XXX might need to be conditional ###
+ $self->_pager_open;
+
+ for my $mod (@$mods) {
+ my @list = $mod->fetch_report( %$opts )
+ or( print(loc("No reports available for this distribution.")),
+ next
+ );
+
+ @list = reverse
+ map { $_->[0] }
+ sort { $a->[1] cmp $b->[1] }
+ map { [$_, $_->{'dist'}.':'.$_->{'platform'}] } @list;
+
+
+
+ ### XXX this may need to be sorted better somehow ###
+ my $url;
+ my $format = "%8s %s %s\n";
+
+ my %seen;
+ for my $href (@list ) {
+ $self->__print(
+ "[" . $mod->author->cpanid .'/'. $href->{'dist'} . "]\n"
+ ) unless $seen{ $href->{'dist'} }++;
+
+ $self->__printf(
+ $format,
+ $href->{'grade'},
+ $href->{'platform'},
+ ($href->{'details'} ? '(*)' : '')
+ );
+
+ $url ||= $href->{'details'};
+ }
+
+ $self->__print( "\n==> $url\n" ) if $url;
+ $self->__print( "\n" );
+ }
+ $self->_pager_close;
+
+ return 1;
+}
+
+### Load plugins
+{ my @PluginModules;
+ my %Dispatch = (
+ showtip => [ __PACKAGE__, '_show_random_tip'],
+ plugins => [ __PACKAGE__, '_list_plugins' ],
+ '?' => [ __PACKAGE__, '_plugins_usage' ],
+ );
+
+ sub plugin_modules { return @PluginModules }
+ sub plugin_table { return %Dispatch }
+
+ my $init_done;
+ sub _plugins_init {
+
+ ### only initialize once
+ return if $init_done++;
+
+ ### find all plugins first
+ if( check_install( module => 'Module::Pluggable', version => '2.4') ) {
+ require Module::Pluggable;
+
+ my $only_re = __PACKAGE__ . '::Plugins::\w+$';
+
+ Module::Pluggable->import(
+ sub_name => '_plugins',
+ search_path => __PACKAGE__,
+ only => qr/$only_re/,
+ #except => [ INSTALLER_MM, INSTALLER_SAMPLE ]
+ );
+
+ push @PluginModules, __PACKAGE__->_plugins;
+ }
+
+ ### now try to load them
+ for my $p ( __PACKAGE__->plugin_modules ) {
+ my %map = eval { load $p; $p->import; $p->plugins };
+ error(loc("Could not load plugin '$p': $@")), next if $@;
+
+ ### register each plugin
+ while( my($name, $func) = each %map ) {
+
+ if( not length $name or not length $func ) {
+ error(loc("Empty plugin name or dispatch function detected"));
+ next;
+ }
+
+ if( exists( $Dispatch{$name} ) ) {
+ error(loc("'%1' is already registered by '%2'",
+ $name, $Dispatch{$name}->[0]));
+ next;
+ }
+
+ ### register name, package and function
+ $Dispatch{$name} = [ $p, $func ];
+ }
+ }
+ }
+
+ ### dispatch a plugin command to its function
+ sub _meta {
+ my $self = shift;
+ my %hash = @_;
+ my $cb = $self->backend;
+ my $term = $self->term;
+ my $conf = $cb->configure_object;
+
+ my $opts; my $input;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ options => { default => { }, store => \$opts },
+ input => { default => '', store => \$input },
+ };
+
+ check( $tmpl, \%hash ) or return;
+ }
+
+ $input =~ s/\s*(\S+)\s*//;
+ my $cmd = $1;
+
+ ### look up the command, or go to the default
+ my $aref = $Dispatch{ $cmd } || [ __PACKAGE__, '_plugin_default' ];
+
+ my($pkg,$func) = @$aref;
+
+ my $rv = eval { $pkg->$func( $self, $cb, $cmd, $input, $opts ) };
+
+ error( $@ ) if $@;
+
+ ### return $rv instead, so input loop can be terminated?
+ return 1;
+ }
+
+ sub _plugin_default { error(loc("No such plugin command")) }
+}
+
+### plugin commands
+{ my $help_format = " /%-21s # %s\n";
+
+ sub _list_plugins {
+ my $self = shift;
+
+ $self->__print( loc("Available plugins:\n") );
+ $self->__print( loc(" List usage by using: /? PLUGIN_NAME\n" ) );
+ $self->__print( $/ );
+
+ my %table = __PACKAGE__->plugin_table;
+ for my $name( sort keys %table ) {
+ my $pkg = $table{$name}->[0];
+ my $this = __PACKAGE__;
+
+ my $who = $pkg eq $this
+ ? "Standard Plugin"
+ : do { my $v = $self->_format_version($pkg->VERSION) || '';
+ $pkg =~ s/^$this/../;
+ sprintf "Provided by: %-30s %-10s", $pkg, $v;
+ };
+
+ $self->__printf( $help_format, $name, $who );
+ }
+
+ $self->__print( $/.$/ );
+
+ $self->__print(
+ " Write your own plugins? Read the documentation of:\n" .
+ " CPANPLUS::Shell::Default::Plugins::HOWTO\n" );
+
+ $self->__print( $/ );
+ }
+
+ sub _list_plugins_help {
+ return sprintf $help_format, 'plugins', loc("lists available plugins");
+ }
+
+ ### registered as a plugin too
+ sub _show_random_tip_help {
+ return sprintf $help_format, 'showtip', loc("show usage tips" );
+ }
+
+ sub _plugins_usage {
+ my $self = shift;
+ my $shell = shift;
+ my $cb = shift;
+ my $cmd = shift;
+ my $input = shift;
+ my %table = $self->plugin_table;
+
+ my @list = length $input ? split /\s+/, $input : sort keys %table;
+
+ for my $name( @list ) {
+
+ ### no such plugin? skip
+ error(loc("No such plugin '$name'")), next unless $table{$name};
+
+ my $pkg = $table{$name}->[0];
+ my $func = $table{$name}->[1] . '_help';
+
+ if ( my $sub = $pkg->can( $func ) ) {
+ eval { $self->__print( $sub->() ) };
+ error( $@ ) if $@;
+
+ } else {
+ $self->__print(" No usage for '$name' -- try perldoc $pkg");
+ }
+
+ $self->__print( $/ );
+ }
+
+ $self->__print( $/.$/ );
+ }
+
+ sub _plugins_usage_help {
+ return sprintf $help_format, '? [NAME ...]',
+ loc("show usage for plugins");
+ }
+}
+
+### send a command to a remote host, retrieve the answer;
+sub __send_remote_command {
+ my $self = shift;
+ my $cmd = shift;
+ my $remote = $self->remote or return;
+ my $user = $remote->{'username'};
+ my $pass = $remote->{'password'};
+ my $conn = $remote->{'connection'};
+ my $end = "\015\012";
+ my $answer;
+
+ my $send = join "\0", $user, $pass, $cmd;
+
+ print $conn $send . $end;
+
+ ### XXX why doesn't something like this just work?
+ #1 while recv($conn, $answer, 1024, 0);
+ while(1) {
+ my $buff;
+ $conn->recv( $buff, 1024, 0 );
+ $answer .= $buff;
+ last if $buff =~ /$end$/;
+ }
+
+ my($status,$buffer) = split "\0", $answer;
+
+ return ($status, $buffer);
+}
+
+
+sub _read_configuration_from_rc {
+ my $self = shift;
+ my $rc_file = shift;
+
+ my $href;
+ if( can_load( modules => { 'Config::Auto' => '0.0' } ) ) {
+ $Config::Auto::DisablePerl = 1;
+
+ eval { $href = Config::Auto::parse( $rc_file, format => 'space' ) };
+
+ $self->__print(
+ loc( "Unable to read in config file '%1': %2", $rc_file, $@ )
+ ) if $@;
+ }
+
+ return $href || {};
+}
+
+{ my @tips = (
+ loc( "You can update CPANPLUS by running: '%1'", 's selfupdate' ),
+ loc( "You can install modules by URL using '%1'", 'i URL' ),
+ loc( "You can turn off these tips using '%1'",
+ 's conf show_startup_tip 0' ),
+ loc( "You can use wildcards like '%1' and '%2' on search results",
+ '*', '2..5' ) ,
+ loc( "You can use plugins. Type '%1' to list available plugins",
+ '/plugins' ),
+ loc( "You can show all your out of date modules using '%1'", 'o' ),
+ loc( "Many operations take options, like '%1', '%2' or '%3'",
+ '--verbose', '--force', '--skiptest' ),
+ loc( "The documentation in %1 and %2 is very useful",
+ "CPANPLUS::Module", "CPANPLUS::Backend" ),
+ loc( "You can type '%1' for help and '%2' to exit", 'h', 'q' ),
+ loc( "You can run an interactive setup using '%1'", 's reconfigure' ),
+ loc( "You can add custom sources to your index. See '%1' for details",
+ '/cs --help' ),
+ loc( "CPANPLUS now has an experimental SQLite backend. You can enable ".
+ "it via: '%1'. Update dependencies via '%2'",
+ 's conf source_engine CPANPLUS::Internals::Source::SQLite; s save',
+ 's selfupdate enabled_features ' ),
+ );
+
+ sub _show_random_tip {
+ my $self = shift;
+ $self->__print( $/, "Did you know...\n ",
+ $tips[ int rand scalar @tips ], $/ );
+ return 1;
+ }
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<CPANPLUS::Shell::Classic>, L<CPANPLUS::Shell>, L<cpanp>
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
+__END__
+
+TODO:
+ e => "_expand_inc", # scratch it, imho -- not used enough
+
+### free letters: g j k n y ###
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/CustomSource.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/CustomSource.pm
new file mode 100755
index 00000000000..ad4701a488c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/CustomSource.pm
@@ -0,0 +1,201 @@
+package CPANPLUS::Shell::Default::Plugins::CustomSource;
+
+use strict;
+use CPANPLUS::Error qw[error msg];
+use CPANPLUS::Internals::Constants;
+
+use Data::Dumper;
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+=head1 NAME
+
+CPANPLUS::Shell::Default::Plugins::CustomSource
+
+=head1 SYNOPSIS
+
+ ### elaborate help text
+ CPAN Terminal> /? cs
+
+ ### add a new custom source
+ CPAN Terminal> /cs --add file:///path/to/releases
+
+ ### list all your custom sources by
+ CPAN Terminal> /cs --list
+
+ ### display the contents of a custom source by URI or ID
+ CPAN Terminal> /cs --contents file:///path/to/releases
+ CPAN Terminal> /cs --contents 1
+
+ ### Update a custom source by URI or ID
+ CPAN Terminal> /cs --update file:///path/to/releases
+ CPAN Terminal> /cs --update 1
+
+ ### Remove a custom source by URI or ID
+ CPAN Terminal> /cs --remove file:///path/to/releases
+ CPAN Terminal> /cs --remove 1
+
+ ### Write an index file for a custom source, to share
+ ### with 3rd parties or remote users
+ CPAN Terminal> /cs --write file:///path/to/releases
+
+ ### Make sure to save your sources when adding/removing
+ ### sources, so your changes are reflected in the cache:
+ CPAN Terminal> x
+
+=head1 DESCRIPTION
+
+This is a C<CPANPLUS::Shell::Default> plugin that can add
+custom sources to your CPANPLUS installation. This is a
+wrapper around the C<custom module sources> code as outlined
+in L<CPANPLUS::Backend/CUSTOM MODULE SOURCES>.
+
+This allows you to extend your index of available modules
+beyond what's available on C<CPAN> with your own local
+distributions, or ones offered by third parties.
+
+=cut
+
+
+sub plugins {
+ return ( cs => 'custom_source' )
+}
+
+my $Cb;
+my $Shell;
+my @Index = ();
+
+sub _uri_from_cache {
+ my $self = shift;
+ my $input = shift or return;
+
+ ### you gave us a search number
+ my $uri = $input =~ /^\d+$/
+ ? $Index[ $input - 1 ] # remember, off by 1!
+ : $input;
+
+ my %files = reverse $Cb->list_custom_sources;
+
+ ### it's an URI we know
+ ### VMS can lower case all files, so make sure we check that too
+ my $local = $files{ $uri };
+ $local = $files{ lc $uri } if !$local && ON_VMS;
+
+ if( $local ) {
+ return wantarray
+ ? ($uri, $local)
+ : $uri;
+ }
+
+ ### couldn't resolve the input
+ error(loc("Unknown URI/index: '%1'", $input));
+ return;
+}
+
+sub _list_custom_sources {
+ my $class = shift;
+
+ my %files = $Cb->list_custom_sources;
+
+ $Shell->__print( loc("Your remote sources:"), $/ ) if keys %files;
+
+ my $i = 0;
+ while(my($local,$remote) = each %files) {
+ $Shell->__printf( " [%2d] %s\n", ++$i, $remote );
+
+ ### remember, off by 1!
+ push @Index, $remote;
+ }
+
+ $Shell->__print( $/ );
+}
+
+sub _list_contents {
+ my $class = shift;
+ my $input = shift;
+
+ my ($uri,$local) = $class->_uri_from_cache( $input );
+ unless( $uri ) {
+ error(loc("--contents needs URI parameter"));
+ return;
+ }
+
+ my $fh = OPEN_FILE->( $local ) or return;
+
+ $Shell->__printf( " %s", $_ ) for sort <$fh>;
+ $Shell->__print( $/ );
+}
+
+sub custom_source {
+ my $class = shift;
+ my $shell = shift; $Shell = $shell; # available to all methods now
+ my $cb = shift; $Cb = $cb; # available to all methods now
+ my $cmd = shift;
+ my $input = shift || '';
+ my $opts = shift || {};
+
+ ### show a list
+ if( $opts->{'list'} ) {
+ $class->_list_custom_sources;
+
+ } elsif ( $opts->{'contents'} ) {
+ $class->_list_contents( $input );
+
+ } elsif ( $opts->{'add'} ) {
+ unless( $input ) {
+ error(loc("--add needs URI parameter"));
+ return;
+ }
+
+ $cb->add_custom_source( uri => $input )
+ and $shell->__print(loc("Added remote source '%1'", $input), $/);
+
+ $Shell->__print($/, loc("Remote source contains:"), $/, $/);
+ $class->_list_contents( $input );
+
+ } elsif ( $opts->{'remove'} ) {
+ my($uri,$local) = $class->_uri_from_cache( $input );
+ unless( $uri ) {
+ error(loc("--remove needs URI parameter"));
+ return;
+ }
+
+ 1 while unlink $local;
+
+ $shell->__print( loc("Removed remote source '%1'", $uri), $/ );
+
+ } elsif ( $opts->{'update'} ) {
+ ### did we get input? if so, it's a remote part
+ my $uri = $class->_uri_from_cache( $input );
+
+ $cb->update_custom_source( $uri ? ( remote => $uri ) : () )
+ and do { $shell->__print( loc("Updated remote sources"), $/ ) };
+
+ } elsif ( $opts->{'write'} ) {
+ $cb->write_custom_source_index( path => $input ) and
+ $shell->__print( loc("Wrote remote source index for '%1'", $input), $/);
+
+ } else {
+ error(loc("Unrecognized command, see '%1' for help", '/? cs'));
+ }
+
+ return;
+}
+
+sub custom_source_help {
+ return loc(
+ $/ .
+ ' # Plugin to manage custom sources from the default shell' . $/ .
+ " # See the 'CUSTOM MODULE SOURCES' section in the " . $/ .
+ ' # CPANPLUS::Backend documentation for details.' . $/ .
+ ' /cs --list # list available sources' . $/ .
+ ' /cs --add URI # add source' . $/ .
+ ' /cs --remove URI | INDEX # remove source' . $/ .
+ ' /cs --contents URI | INDEX # show packages from source'. $/ .
+ ' /cs --update [URI | INDEX] # update source index' . $/ .
+ ' /cs --write PATH # write source index' . $/
+ );
+
+}
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/HOWTO.pod b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/HOWTO.pod
new file mode 100755
index 00000000000..ca765f9e0ac
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/HOWTO.pod
@@ -0,0 +1,136 @@
+=head1 NAME
+
+CPANPLUS::Shell::Default::Plugins::HOWTO -- documentation on how to write your own plugins
+
+=head1 SYNOPSIS
+
+ package CPANPLUS::Shell::Default::Plugins::MyPlugin;
+
+ ### return command => method mapping
+ sub plugins { ( myplugin1 => 'mp1', myplugin2 => 'mp2' ) }
+
+ ### method called when the command '/myplugin1' is issued
+ sub mp1 { .... }
+
+ ### method called when the command '/? myplugin1' is issued
+ sub mp1_help { return "Help Text" }
+
+=head1 DESCRIPTION
+
+This pod text explains how to write your own plugins for
+C<CPANPLUS::Shell::Default>.
+
+=head1 HOWTO
+
+=head2 Registering Plugin Modules
+
+Plugins are detected by using C<Module::Pluggable>. Every module in
+the C<CPANPLUS::Shell::Default::Plugins::*> namespace is considered a
+plugin, and is attempted to be loaded.
+
+Therefor, any plugin must be declared in that namespace, in a corresponding
+C<.pm> file.
+
+=head2 Registering Plugin Commands
+
+To register any plugin commands, a list of key value pairs must be returned
+by a C<plugins> method in your package. The keys are the commands you wish
+to register, the values are the methods in the plugin package you wish to have
+called when the command is issued.
+
+For example, a simple 'Hello, World!' plugin:
+
+ package CPANPLUS::Shell::Default::Plugins::HW;
+
+ sub plugins { return ( helloworld => 'hw' ) };
+
+ sub hw { print "Hello, world!\n" }
+
+When the user in the default shell now issues the C</helloworld> command,
+this command will be dispatched to the plugin, and its C<hw> method will
+be called
+
+=head2 Registering Plugin Help
+
+To provide usage information for your plugin, the user of the default shell
+can type C</? PLUGIN_COMMAND>. In that case, the function C<PLUGIN_COMMAND_help>
+will be called in your plugin package.
+
+For example, extending the above example, when a user calls C</? helloworld>,
+the function C<hw_help> will be called, which might look like this:
+
+ sub hw_help { " /helloworld # prints "Hello, world!\n" }
+
+If you dont provide a corresponding _help function to your commands, the
+default shell will handle it gracefully, but the user will be stuck without
+usage information on your commands, so it's considered undesirable to omit
+the help functions.
+
+=head2 Arguments to Plugin Commands
+
+Any plugin function will receive the following arguments when called, which
+are all positional:
+
+=over 4
+
+=item Classname -- The name of your plugin class
+
+=item Shell -- The CPANPLUS::Shell::Default object
+
+=item Backend -- The CPANPLUS::Backend object
+
+=item Command -- The command issued by the user
+
+=item Input -- The input string from the user
+
+=item Options -- A hashref of options provided by the user
+
+=back
+
+For example, the following command:
+
+ /helloworld bob --nofoo --bar=2 joe
+
+Would yield the following arguments:
+
+ sub hw {
+ my $class = shift; # CPANPLUS::Shell::Default::Plugins::HW
+ my $shell = shift; # CPANPLUS::Shell::Default object
+ my $cb = shift; # CPANPLUS::Backend object
+ my $cmd = shift; # 'helloworld'
+ my $input = shift; # 'bob joe'
+ my $opts = shift; # { foo => 0, bar => 2 }
+
+ ....
+ }
+
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<CPANPLUS::Shell::Default>, L<CPANPLUS::Shell>, L<cpanp>
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/Remote.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/Remote.pm
new file mode 100755
index 00000000000..d2b829abded
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/Remote.pm
@@ -0,0 +1,186 @@
+package CPANPLUS::Shell::Default::Plugins::Remote;
+
+use strict;
+
+use Module::Load;
+use Params::Check qw[check];
+use CPANPLUS::Error qw[error msg];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+=head1 NAME
+
+CPANPLUS::Shell::Default::Plugins::Remote
+
+=head1 SYNOPSIS
+
+ CPAN Terminal> /connect localhost 1337 --user=foo --pass=bar
+ ...
+ CPAN Terminal@localhost> /disconnect
+
+=head1 DESCRIPTION
+
+This is a C<CPANPLUS::Shell::Default> plugin that allows you to connect
+to a machine running an instance of C<CPANPLUS::Daemon>, allowing remote
+usage of the C<CPANPLUS Shell>.
+
+A sample session, updating all modules on a remote machine, might look
+like this:
+
+ CPAN Terminal> /connect --user=my_user --pass=secret localhost 1337
+
+ Connection accepted
+
+ Successfully connected to 'localhost' on port '11337'
+
+ Note that no output will appear until a command has completed
+ -- this may take a while
+
+
+ CPAN Terminal@localhost> o; i *
+
+ [....]
+
+ CPAN Terminal@localhost> /disconnect
+
+ CPAN Terminal>
+
+=cut
+
+### store the original prompt here, so we can restore it on disconnect
+my $Saved_Prompt;
+
+sub plugins { ( connect => 'connect', disconnect => 'disconnect' ) }
+
+sub connect {
+ my $class = shift;
+ my $shell = shift;
+ my $cb = shift;
+ my $cmd = shift;
+ my $input = shift || '';
+ my $opts = shift || {};
+ my $conf = $cb->configure_object;
+
+ my $user; my $pass;
+ { local $Params::Check::ALLOW_UNKNOWN = 1;
+
+ my $tmpl = {
+ user => { default => 'cpanpd', store => \$user },
+ pass => { required => 1, store => \$pass },
+ };
+
+ check( $tmpl, $opts ) or return;
+ }
+
+ my @parts = split /\s+/, $input;
+ my $host = shift @parts || 'localhost';
+ my $port = shift @parts || '1337';
+
+ load IO::Socket;
+
+ my $remote = IO::Socket::INET->new(
+ Proto => "tcp",
+ PeerAddr => $host,
+ PeerPort => $port,
+ ) or (
+ error( loc( "Cannot connect to port '%1' ".
+ "on host '%2'", $port, $host ) ),
+ return
+ );
+
+ my $con = {
+ connection => $remote,
+ username => $user,
+ password => $pass,
+ };
+
+ ### store the connection
+ $shell->remote( $con );
+
+ my($status,$buffer) = $shell->__send_remote_command(
+ "VERSION=$CPANPLUS::Shell::Default::VERSION");
+
+ if( $status ) {
+ print "\n$buffer\n\n";
+
+ print loc( "Successfully connected to '%1' on port '%2'",
+ $host, $port );
+ print "\n\n";
+ print loc( "Note that no output will appear until a command ".
+ "has completed\n-- this may take a while" );
+ print "\n\n";
+
+ ### save the original prompt
+ $Saved_Prompt = $shell->prompt;
+
+ $shell->prompt( $shell->brand .'@'. $host .':'. $port .'> ' );
+
+ } else {
+ print "\n$buffer\n\n";
+
+ print loc( "Failed to connect to '%1' on port '%2'",
+ $host, $port );
+ print "\n\n";
+
+ $shell->remote( undef );
+ }
+}
+
+sub disconnect {
+ my $class = shift;
+ my $shell = shift;
+
+ print "\n", ( $shell->remote
+ ? loc( "Disconnecting from remote host" )
+ : loc( "Not connected to remote host" )
+ ), "\n\n";
+
+ $shell->remote( undef );
+ $shell->prompt( $Saved_Prompt );
+}
+
+sub connect_help {
+ return loc(
+ " /connect [HOST PORT] # Connect to the remote machine,\n" .
+ " # defaults taken from your config\n" .
+ " --user=USER # Optional username\n" .
+ " --pass=PASS # Optional password" );
+}
+
+sub disconnect_help {
+ return loc(
+ " /disconnect # Disconnect from the remote server" );
+}
+
+1;
+
+=pod
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<CPANPLUS::Shell::Default>, L<CPANPLUS::Shell>, L<cpanp>
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
diff --git a/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/Source.pm b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/Source.pm
new file mode 100755
index 00000000000..889b3d3d9bd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/CPANPLUS/Shell/Default/Plugins/Source.pm
@@ -0,0 +1,107 @@
+package CPANPLUS::Shell::Default::Plugins::Source;
+
+use strict;
+use CPANPLUS::Error qw[error msg];
+use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
+
+=head1 NAME
+
+CPANPLUS::Shell::Default::Plugins::Source
+
+=head1 SYNOPSIS
+
+ CPAN Terminal> /source /tmp/list_of_commands /tmp/more_commands
+
+=head1 DESCRIPTION
+
+This is a C<CPANPLUS::Shell::Default> plugin that works just like
+your unix shells source(1) command; it reads in a file that has
+commands in it to execute, and then executes them.
+
+A sample file might look like this:
+
+ # first, update all the source files
+ x --update_source
+
+ # find all of my modules that are on the CPAN
+ # test them, and store the error log
+ a ^KANE$'
+ t *
+ p /home/kane/cpan-autotest/log
+
+ # and inform us we're good to go
+ ! print "Autotest complete, log stored; please enter your commands!"
+
+Note how empty lines, and lines starting with a '#' are being skipped
+in the execution.
+
+=cut
+
+
+sub plugins { return ( source => 'source' ) }
+
+sub source {
+ my $class = shift;
+ my $shell = shift;
+ my $cb = shift;
+ my $cmd = shift;
+ my $input = shift || '';
+ my $opts = shift || {};
+ my $verbose = $cb->configure_object->get_conf('verbose');
+
+ for my $file ( split /\s+/, $input ) {
+ my $fh = FileHandle->new("$file") or(
+ error(loc("Could not open file '%1': %2", $file, $!)),
+ next
+ );
+
+ while( my $line = <$fh> ) {
+ chomp $line;
+
+ next if $line !~ /\S+/; # skip empty/whitespace only lines
+ next if $line =~ /^#/; # skip comments
+
+ msg(loc("Dispatching '%1'", $line), $verbose);
+ return 1 if $shell->dispatch_on_input( input => $line );
+ }
+ }
+}
+
+sub source_help {
+ return loc(' /source FILE [FILE ..] '.
+ '# read in commands from the specified file' ),
+}
+
+1;
+
+=pod
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+The CPAN++ interface (of which this module is a part of) is copyright (c)
+2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<CPANPLUS::Shell::Default>, L<CPANPLUS::Shell>, L<cpanp>
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Carp/Heavy.pm b/Master/tlpkg/tlperl.straw/lib/Carp/Heavy.pm
new file mode 100755
index 00000000000..91d6ab165e4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Carp/Heavy.pm
@@ -0,0 +1,308 @@
+# Carp::Heavy uses some variables in common with Carp.
+package Carp;
+
+=head1 NAME
+
+Carp::Heavy - heavy machinery, no user serviceable parts inside
+
+=cut
+
+# On one line so MakeMaker will see it.
+use Carp; our $VERSION = $Carp::VERSION;
+# use strict; # not yet
+
+# 'use Carp' just installs some very lightweight stubs; the first time
+# these are called, they require Carp::Heavy which installs the real
+# routines.
+
+# The members of %Internal are packages that are internal to perl.
+# Carp will not report errors from within these packages if it
+# can. The members of %CarpInternal are internal to Perl's warning
+# system. Carp will not report errors from within these packages
+# either, and will not report calls *to* these packages for carp and
+# croak. They replace $CarpLevel, which is deprecated. The
+# $Max(EvalLen|(Arg(Len|Nums)) variables are used to specify how the eval
+# text and function arguments should be formatted when printed.
+
+# disable these by default, so they can live w/o require Carp
+$CarpInternal{Carp}++;
+$CarpInternal{warnings}++;
+$Internal{Exporter}++;
+$Internal{'Exporter::Heavy'}++;
+
+
+our ($CarpLevel, $MaxArgNums, $MaxEvalLen, $MaxArgLen, $Verbose);
+
+# XXX longmess_real and shortmess_real should really be merged into
+# XXX {long|sort}mess_heavy at some point
+
+sub longmess_real {
+ # Icky backwards compatibility wrapper. :-(
+ #
+ # The story is that the original implementation hard-coded the
+ # number of call levels to go back, so calls to longmess were off
+ # by one. Other code began calling longmess and expecting this
+ # behaviour, so the replacement has to emulate that behaviour.
+ my $call_pack = caller();
+ if ($Internal{$call_pack} or $CarpInternal{$call_pack}) {
+ return longmess_heavy(@_);
+ }
+ else {
+ local $CarpLevel = $CarpLevel + 1;
+ return longmess_heavy(@_);
+ }
+};
+
+sub shortmess_real {
+ # Icky backwards compatibility wrapper. :-(
+ local @CARP_NOT = caller();
+ shortmess_heavy(@_);
+};
+
+# replace the two hooks added by Carp
+
+# aliasing the whole glob rather than just the CV slot avoids 'redefined'
+# warnings, even in the presence of perl -W (as used by lib/warnings.t !)
+# However it has the potential to create infinite loops, if somehow Carp
+# is forcibly reloaded, but $INC{"Carp/Heavy.pm"} remains true.
+# Hence the extra hack of deleting the previous typeglob first.
+
+delete $Carp::{shortmess_jmp};
+delete $Carp::{longmess_jmp};
+*longmess_jmp = *longmess_real;
+*shortmess_jmp = *shortmess_real;
+
+
+sub caller_info {
+ my $i = shift(@_) + 1;
+ package DB;
+ my %call_info;
+ @call_info{
+ qw(pack file line sub has_args wantarray evaltext is_require)
+ } = caller($i);
+
+ unless (defined $call_info{pack}) {
+ return ();
+ }
+
+ my $sub_name = Carp::get_subname(\%call_info);
+ if ($call_info{has_args}) {
+ my @args = map {Carp::format_arg($_)} @DB::args;
+ if ($MaxArgNums and @args > $MaxArgNums) { # More than we want to show?
+ $#args = $MaxArgNums;
+ push @args, '...';
+ }
+ # Push the args onto the subroutine
+ $sub_name .= '(' . join (', ', @args) . ')';
+ }
+ $call_info{sub_name} = $sub_name;
+ return wantarray() ? %call_info : \%call_info;
+}
+
+# Transform an argument to a function into a string.
+sub format_arg {
+ my $arg = shift;
+ if (ref($arg)) {
+ $arg = defined($overload::VERSION) ? overload::StrVal($arg) : "$arg";
+ }
+ if (defined($arg)) {
+ $arg =~ s/'/\\'/g;
+ $arg = str_len_trim($arg, $MaxArgLen);
+
+ # Quote it?
+ $arg = "'$arg'" unless $arg =~ /^-?[\d.]+\z/;
+ } else {
+ $arg = 'undef';
+ }
+
+ # The following handling of "control chars" is direct from
+ # the original code - it is broken on Unicode though.
+ # Suggestions?
+ utf8::is_utf8($arg)
+ or $arg =~ s/([[:cntrl:]]|[[:^ascii:]])/sprintf("\\x{%x}",ord($1))/eg;
+ return $arg;
+}
+
+# Takes an inheritance cache and a package and returns
+# an anon hash of known inheritances and anon array of
+# inheritances which consequences have not been figured
+# for.
+sub get_status {
+ my $cache = shift;
+ my $pkg = shift;
+ $cache->{$pkg} ||= [{$pkg => $pkg}, [trusts_directly($pkg)]];
+ return @{$cache->{$pkg}};
+}
+
+# Takes the info from caller() and figures out the name of
+# the sub/require/eval
+sub get_subname {
+ my $info = shift;
+ if (defined($info->{evaltext})) {
+ my $eval = $info->{evaltext};
+ if ($info->{is_require}) {
+ return "require $eval";
+ }
+ else {
+ $eval =~ s/([\\\'])/\\$1/g;
+ return "eval '" . str_len_trim($eval, $MaxEvalLen) . "'";
+ }
+ }
+
+ return ($info->{sub} eq '(eval)') ? 'eval {...}' : $info->{sub};
+}
+
+# Figures out what call (from the point of view of the caller)
+# the long error backtrace should start at.
+sub long_error_loc {
+ my $i;
+ my $lvl = $CarpLevel;
+ {
+ my $pkg = caller(++$i);
+ unless(defined($pkg)) {
+ # This *shouldn't* happen.
+ if (%Internal) {
+ local %Internal;
+ $i = long_error_loc();
+ last;
+ }
+ else {
+ # OK, now I am irritated.
+ return 2;
+ }
+ }
+ redo if $CarpInternal{$pkg};
+ redo unless 0 > --$lvl;
+ redo if $Internal{$pkg};
+ }
+ return $i - 1;
+}
+
+
+sub longmess_heavy {
+ return @_ if ref($_[0]); # don't break references as exceptions
+ my $i = long_error_loc();
+ return ret_backtrace($i, @_);
+}
+
+# Returns a full stack backtrace starting from where it is
+# told.
+sub ret_backtrace {
+ my ($i, @error) = @_;
+ my $mess;
+ my $err = join '', @error;
+ $i++;
+
+ my $tid_msg = '';
+ if (defined &threads::tid) {
+ my $tid = threads->tid;
+ $tid_msg = " thread $tid" if $tid;
+ }
+
+ my %i = caller_info($i);
+ $mess = "$err at $i{file} line $i{line}$tid_msg\n";
+
+ while (my %i = caller_info(++$i)) {
+ $mess .= "\t$i{sub_name} called at $i{file} line $i{line}$tid_msg\n";
+ }
+
+ return $mess;
+}
+
+sub ret_summary {
+ my ($i, @error) = @_;
+ my $err = join '', @error;
+ $i++;
+
+ my $tid_msg = '';
+ if (defined &threads::tid) {
+ my $tid = threads->tid;
+ $tid_msg = " thread $tid" if $tid;
+ }
+
+ my %i = caller_info($i);
+ return "$err at $i{file} line $i{line}$tid_msg\n";
+}
+
+
+sub short_error_loc {
+ # You have to create your (hash)ref out here, rather than defaulting it
+ # inside trusts *on a lexical*, as you want it to persist across calls.
+ # (You can default it on $_[2], but that gets messy)
+ my $cache = {};
+ my $i = 1;
+ my $lvl = $CarpLevel;
+ {
+ my $called = caller($i++);
+ my $caller = caller($i);
+
+ return 0 unless defined($caller); # What happened?
+ redo if $Internal{$caller};
+ redo if $CarpInternal{$caller};
+ redo if $CarpInternal{$called};
+ redo if trusts($called, $caller, $cache);
+ redo if trusts($caller, $called, $cache);
+ redo unless 0 > --$lvl;
+ }
+ return $i - 1;
+}
+
+
+sub shortmess_heavy {
+ return longmess_heavy(@_) if $Verbose;
+ return @_ if ref($_[0]); # don't break references as exceptions
+ my $i = short_error_loc();
+ if ($i) {
+ ret_summary($i, @_);
+ }
+ else {
+ longmess_heavy(@_);
+ }
+}
+
+# If a string is too long, trims it with ...
+sub str_len_trim {
+ my $str = shift;
+ my $max = shift || 0;
+ if (2 < $max and $max < length($str)) {
+ substr($str, $max - 3) = '...';
+ }
+ return $str;
+}
+
+# Takes two packages and an optional cache. Says whether the
+# first inherits from the second.
+#
+# Recursive versions of this have to work to avoid certain
+# possible endless loops, and when following long chains of
+# inheritance are less efficient.
+sub trusts {
+ my $child = shift;
+ my $parent = shift;
+ my $cache = shift;
+ my ($known, $partial) = get_status($cache, $child);
+ # Figure out consequences until we have an answer
+ while (@$partial and not exists $known->{$parent}) {
+ my $anc = shift @$partial;
+ next if exists $known->{$anc};
+ $known->{$anc}++;
+ my ($anc_knows, $anc_partial) = get_status($cache, $anc);
+ my @found = keys %$anc_knows;
+ @$known{@found} = ();
+ push @$partial, @$anc_partial;
+ }
+ return exists $known->{$parent};
+}
+
+# Takes a package and gives a list of those trusted directly
+sub trusts_directly {
+ my $class = shift;
+ no strict 'refs';
+ no warnings 'once';
+ return @{"$class\::CARP_NOT"}
+ ? @{"$class\::CARP_NOT"}
+ : @{"$class\::ISA"};
+}
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Compress/Bzip2.pm b/Master/tlpkg/tlperl.straw/lib/Compress/Bzip2.pm
new file mode 100755
index 00000000000..f7ffb0541a1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Compress/Bzip2.pm
@@ -0,0 +1,1579 @@
+# File : Bzip2.pm
+# Author : Rob Janes
+# Created : 14 April 2005
+# Modified : 9 Aug 2005
+# Version : 2.09
+#
+# Copyright (c) 2005 Rob Janes. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+
+package Compress::Bzip2;
+
+use 5.006;
+
+use strict;
+use warnings;
+
+use Carp;
+use Getopt::Std;
+use Fcntl qw(:DEFAULT :mode);
+
+require Exporter;
+use AutoLoader;
+
+our @ISA = qw(Exporter);
+
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+
+# This allows declaration use Compress::Bzip2 ':all';
+# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
+# will save memory.
+our %EXPORT_TAGS =
+ ( 'constants' => [ qw(
+ BZ_CONFIG_ERROR
+ BZ_DATA_ERROR
+ BZ_DATA_ERROR_MAGIC
+ BZ_FINISH
+ BZ_FINISH_OK
+ BZ_FLUSH
+ BZ_FLUSH_OK
+ BZ_IO_ERROR
+ BZ_MAX_UNUSED
+ BZ_MEM_ERROR
+ BZ_OK
+ BZ_OUTBUFF_FULL
+ BZ_PARAM_ERROR
+ BZ_RUN
+ BZ_RUN_OK
+ BZ_SEQUENCE_ERROR
+ BZ_STREAM_END
+ BZ_UNEXPECTED_EOF
+ ) ],
+
+ 'utilities' => [ qw(
+ &bzopen
+ &bzinflateInit
+ &bzdeflateInit
+ &memBzip &memBunzip
+ &compress &decompress
+ &bzip2 &bunzip2
+ &bzlibversion
+ $bzerrno
+ ) ],
+
+ 'bzip1' => [ qw(
+ &compress
+ &decompress
+ &compress_init
+ &decompress_init
+ &version
+ ) ],
+
+ 'gzip' => [ qw(
+ &gzopen
+ &inflateInit
+ &deflateInit
+ &compress &uncompress
+ &adler32 &crc32
+
+ ZLIB_VERSION
+
+ $gzerrno
+
+ Z_OK
+ Z_STREAM_END
+ Z_NEED_DICT
+ Z_ERRNO
+ Z_STREAM_ERROR
+ Z_DATA_ERROR
+ Z_MEM_ERROR
+ Z_BUF_ERROR
+ Z_VERSION_ERROR
+
+ Z_NO_FLUSH
+ Z_PARTIAL_FLUSH
+ Z_SYNC_FLUSH
+ Z_FULL_FLUSH
+ Z_FINISH
+ Z_BLOCK
+
+ Z_NO_COMPRESSION
+ Z_BEST_SPEED
+ Z_BEST_COMPRESSION
+ Z_DEFAULT_COMPRESSION
+
+ Z_FILTERED
+ Z_HUFFMAN_ONLY
+ Z_RLE
+ Z_DEFAULT_STRATEGY
+
+ Z_BINARY
+ Z_ASCII
+ Z_UNKNOWN
+
+ Z_DEFLATED
+ Z_NULL
+ ) ],
+ );
+
+our @EXPORT_OK = ( @{ $EXPORT_TAGS{'utilities'} },
+ @{ $EXPORT_TAGS{'constants'} },
+ @{ $EXPORT_TAGS{'bzip1'} },
+ @{ $EXPORT_TAGS{'gzip'} },
+ );
+
+$EXPORT_TAGS{'all'} = [ @EXPORT_OK ];
+
+our @EXPORT = ( @{ $EXPORT_TAGS{'utilities'} }, @{ $EXPORT_TAGS{'constants'} } );
+
+our $VERSION = "2.09";
+
+our $bzerrno = "";
+our $gzerrno;
+*gzerrno = \$bzerrno;
+
+# Zlib compatibility
+##
+use constant ZLIB_VERSION => '1.x';
+# allowed flush values
+use constant { Z_NO_FLUSH => 0, Z_PARTIAL_FLUSH => 1, Z_SYNC_FLUSH => 2,
+ Z_FULL_FLUSH => 3, Z_FINISH => 4, Z_BLOCK => 5 };
+# return codes for functions, positive normal, negative error
+use constant { Z_OK => 0, Z_STREAM_END => 1, Z_NEED_DICT => 2, Z_ERRNO => -1,
+ Z_STREAM_ERROR => -2, Z_DATA_ERROR => -3, Z_MEM_ERROR => -4,
+ Z_BUF_ERROR => -5, Z_VERSION_ERROR => -6 };
+# compression levels
+use constant { Z_NO_COMPRESSION => 0, Z_BEST_SPEED => 1,
+ Z_BEST_COMPRESSION => 9, Z_DEFAULT_COMPRESSION => -1 };
+# compression strategy, for deflateInit
+use constant { Z_FILTERED => 1, Z_HUFFMAN_ONLY => 2, Z_RLE => 3,
+ Z_DEFAULT_STRATEGY => 0 };
+# possible values of data_type (inflate)
+use constant { Z_BINARY => 0, Z_ASCII => 1, Z_UNKNOWN => 2 };
+# the deflate compression method
+use constant Z_DEFLATED => 8;
+# for initialization
+use constant Z_NULL => 0;
+
+## gzopen, $gzerror, gzerror, gzclose, gzreadline, gzwrite
+
+sub AUTOLOAD {
+ # This AUTOLOAD is used to 'autoload' constants from the constant()
+ # XS function.
+
+ my $constname;
+ our $AUTOLOAD;
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ croak "&Compress::Bzip2::constant not defined" if $constname eq 'constant';
+ my ($error, $val) = constant($constname);
+ if ($error) { croak $error; }
+ {
+ no strict 'refs';
+ # Fixed between 5.005_53 and 5.005_61
+#XXX if ($] >= 5.00561) {
+#XXX *$AUTOLOAD = sub () { $val };
+#XXX }
+#XXX else {
+ *$AUTOLOAD = sub { $val };
+#XXX }
+ }
+ goto &$AUTOLOAD;
+}
+
+require XSLoader;
+XSLoader::load('Compress::Bzip2', $VERSION);
+
+#bootstrap Compress::Bzip2 $VERSION;
+
+##############################################################################
+## file compress uncompress commands
+
+sub _writefileopen ( $$;$ ) {
+ ## open a protected file for write
+ my ( $handle, $filename, $force ) = @_;
+
+ if ( sysopen($handle, $filename, $force ? O_WRONLY|O_CREAT|O_TRUNC : O_WRONLY|O_CREAT|O_EXCL, S_IWUSR|S_IRUSR) ) {
+ $_[0] = $handle if !defined($_[0]);
+ return $handle;
+ }
+
+ return undef;
+}
+
+sub _stat_snapshot ( $ ) {
+ my ( $filename ) = @_;
+ return undef if !defined($filename);
+
+ my @stats = stat $filename;
+ if (!@stats) {
+ warn "stat of $filename failed: $!\n" if !@stats;
+ return undef;
+ }
+
+ return \@stats;
+}
+
+sub _check_stat ( $$;$ ) {
+ my ( $filename, $statsnap, $force ) = @_;
+
+ if ( !defined($statsnap) || (ref($statsnap) eq 'ARRAY' && @$statsnap == 0) ) {
+ $statsnap = _stat_snapshot( $filename );
+ if ( $statsnap ) {
+ if ( @_>1 ) {
+ if ( !defined($_[1]) ) {
+ $_[1] = $statsnap;
+ }
+ elsif ( ref($_[1]) eq 'ARRAY' && @{ $_[1] } == 0 ) {
+ @{ $_[1] } = @$statsnap;
+ }
+ }
+ }
+ else {
+ return undef;
+ }
+ }
+
+ if ( S_ISDIR( $statsnap->[2] ) ) {
+ bz_seterror( &BZ_IO_ERROR, "file $filename is a directory" );
+ return 0;
+ }
+
+ if ( !S_ISREG( $statsnap->[2] ) ) {
+ bz_seterror( &BZ_IO_ERROR, "file $filename is not a normal file" );
+ return 0;
+ }
+
+ if ( !$force && S_ISLNK( $statsnap->[2] ) ) {
+ bz_seterror( &BZ_IO_ERROR, "file $filename is a symlink" );
+ return 0;
+ }
+
+ if ( !$force && $statsnap->[3] > 1 ) {
+ bz_seterror( &BZ_IO_ERROR, "file $filename has too many hard links" );
+ return 0;
+ }
+
+ return 1;
+}
+
+sub _set_stat_from_snapshot ( $$ ) {
+ my ( $filename, $statsnap ) = @_;
+
+ if ( !chmod( S_IMODE( $statsnap->[2] ), $filename ) ) {
+ bz_seterror( &BZ_IO_ERROR, "chmod ".sprintf('%03o', S_IMODE( $statsnap->[2] ))." $filename failed: $!" );
+ return undef;
+ }
+
+ if ( !utime @$statsnap[8,9], $filename ) {
+ bz_seterror( &BZ_IO_ERROR,
+ "utime " . join(' ',map { strftime('%Y-%m-%d %H:%M:%S', localtime $_) } @$statsnap[8,9] ) .
+ " $filename failed: $!" );
+ return undef;
+ }
+
+ if ( !chown @$statsnap[4,5], $filename ) {
+ bz_seterror( &BZ_IO_ERROR,
+ "chown " . join(':', ( getpwuid($statsnap->[4]) )[0], ( getgrgid($statsnap->[5]) )[0]) .
+ " $filename failed: $!" );
+ return 0;
+ }
+
+ return 1;
+}
+
+sub bzip2 ( @ ) {
+ return _process_files( 'bzip2', 'cfvks123456789', @_ );
+}
+
+sub bunzip2 ( @ ) {
+ return _process_files( 'bunzip2', 'cdzfks123456789', @_ );
+}
+
+sub bzcat ( @ ) {
+ return _process_files( 'bzcat', 'cdzfks123456789', @_ );
+}
+
+sub _process_files ( @ ) {
+ my $command = shift;
+ my $opts = shift;
+
+ local @ARGV = @_;
+
+ my %opts;
+ return undef if !getopt( $opts, \%opts );
+ # c compress or decompress to stdout
+ # d decompress
+ # z compress
+ # f force
+ # v verbose
+ # k keep
+ # s small
+ # 123456789
+
+ $opts{c} = 1 if $command eq 'bzcat';
+ $opts{d} = 1 if $command eq 'bunzip2' || $command eq 'bzcat';
+ $opts{z} = 1 if $command eq 'bzip2';
+
+ my $read_from_stdin;
+ my ( $in, $bzin );
+ my ( $out, $bzout );
+
+ if ( !@ARGV ) {
+ $read_from_stdin = 1;
+ $opts{c} = 1;
+ if ( !open( $in, "<&STDIN" ) ) {
+ die "Error: failed to input from STDIN: '$!'\n";
+ }
+
+ $bzin = bzopen( $in, "r" );
+ }
+
+ if ( $opts{c} ) {
+ if ( !open( $out, ">&STDOUT" ) ) {
+ die "Error: failed to output to STDOUT: '$!'\n";
+ }
+
+ $bzout = bzopen( $out, "w" );
+ }
+
+ if ( !$opts{d} && !$opts{z} ) {
+ die "Error: neither compress nor decompress was indicated.\n";
+ }
+
+ my $doneflag = 0;
+ while ( !$doneflag ) {
+ my $infile;
+ my $outfile;
+ my @statbuf;
+
+ if ( !$read_from_stdin ) {
+ $infile = shift @ARGV;
+ if ( ! -r $infile ) {
+ print STDERR "Error: file $infile is not readable\n";
+ next;
+ }
+
+ @statbuf = stat _;
+ if ( !@statbuf ) {
+ print STDERR "Error: failed to stat $infile: '$!'\n";
+ next;
+ }
+
+ if ( !_check_stat( $infile, \@statbuf, $opts{f} ) ) {
+ print STDERR "Error: file $infile stat check fails: $bzerrno\n";
+ next;
+ }
+ }
+
+ my $outfile_exists;
+ if ( !$opts{c} ) {
+ undef $out;
+ if ( $opts{d} ) {
+ $outfile = $infile . '.bz2';
+ }
+ elsif ( $opts{z} ) {
+ $outfile = $infile =~ /\.bz2$/ ? substr($infile,0,-4) : $infile.'.out';
+ }
+
+ $outfile_exists = -e $outfile;
+ if ( !_writefileopen( $out, $outfile, $opts{f} ) ) {
+ print STDERR "Error: failed to open $outfile for write: '$!'\n";
+ next;
+ }
+ }
+
+ if ( !$read_from_stdin ) {
+ undef $in;
+ if ( !open( $in, $infile ) ) {
+ print STDERR "Error: unable to open $infile: '$!'\n";
+ unlink( $outfile ) if !$outfile_exists;
+ next;
+ }
+ }
+
+ if ( $opts{d} ) {
+ $bzin = bzopen( $in, "r" ) if !$read_from_stdin;
+
+ my $buf;
+ my $notdone = 1;
+ while ( $notdone ) {
+ my $ln = bzread( $in, $buf, 1024 );
+ if ( $ln > 0 ) {
+ syswrite( $out, $buf, $ln );
+ }
+ elsif ( $ln == 0 ) {
+ undef $notdone;
+ }
+ else {
+ }
+ }
+
+ close($out);
+
+ if ( !$read_from_stdin ) {
+ bzclose($in);
+ unlink( $infile ) if !$opts{k};
+ _set_stat_from_snapshot( $outfile, \@statbuf );
+ }
+ }
+ elsif ( $opts{z} ) {
+ $bzout = bzopen( $out, "w" ) if !$opts{c};
+
+ my $buf;
+ my $notdone = 1;
+ while ( $notdone ) {
+ my $ln = sysread( $in, $buf, 1024 );
+ if ( $ln > 0 ) {
+ bzwrite( $bzout, $buf, $ln );
+ }
+ elsif ( $ln == 0 ) {
+ undef $notdone;
+ }
+ else {
+ }
+ }
+
+ close($in);
+
+ if ( !$opts{c} ) {
+ bzclose($bzout);
+ unlink( $infile ) if !$opts{k};
+ _set_stat_from_snapshot( $outfile, \@statbuf );
+ }
+ }
+ }
+}
+
+##############################################################################
+##############################################################################
+## compatibility with Compress::Bzip2 1.03
+
+sub add ( $$ ) {
+ my ( $obj, $buffer ) = @_;
+
+ my @res = $obj->is_write ? $obj->bzdeflate( $buffer ) : $obj->bzinflate( $buffer );
+
+ return $res[0];
+}
+
+sub finish ( $;$ ) {
+ my ( $obj, $buffer ) = @_;
+ my ( @res, $out );
+
+ if ( defined($buffer) ) {
+ @res = $obj->is_write ? $obj->bzdeflate( $buffer ) : $obj->bzinflate( $buffer );
+ return undef if $res[1] != &BZ_OK;
+
+ $out = $res[0];
+ }
+ $out = '' if !defined($out);
+
+ @res = $obj->bzclose;
+ return undef if $res[1] != &BZ_OK;
+
+ return $out.$res[0];
+}
+
+sub input_size ( $ ) {
+ my ( $obj ) = @_;
+ return $obj->total_in;
+}
+
+sub output_size ( $ ) {
+ my ( $obj ) = @_;
+ return $obj->total_out;
+}
+
+sub version ( ) {
+ return bzlibversion();
+}
+
+sub error ( $ ) {
+ return $_[0]->bzerror;
+}
+
+##############################################################################
+##############################################################################
+## THE Compress::Zlib compatibility section
+
+sub _bzerror2gzerror {
+ my ( $bz_error_num ) = @_;
+ my $gz_error_num =
+ $bz_error_num == &BZ_OK ? Z_OK :
+ $bz_error_num == &BZ_RUN_OK ? Z_OK :
+ $bz_error_num == &BZ_FLUSH_OK ? Z_STREAM_END :
+ $bz_error_num == &BZ_FINISH_OK ? Z_STREAM_END :
+ $bz_error_num == &BZ_STREAM_END ? Z_STREAM_END :
+
+ $bz_error_num == &BZ_SEQUENCE_ERROR ? Z_VERSION_ERROR :
+ $bz_error_num == &BZ_PARAM_ERROR ? Z_ERRNO :
+ $bz_error_num == &BZ_MEM_ERROR ? Z_MEM_ERROR :
+ $bz_error_num == &BZ_DATA_ERROR ? Z_DATA_ERROR :
+ $bz_error_num == &BZ_DATA_ERROR_MAGIC ? Z_DATA_ERROR :
+ $bz_error_num == &BZ_IO_ERROR ? Z_ERRNO :
+ $bz_error_num == &BZ_UNEXPECTED_EOF ? Z_STREAM_ERROR :
+ $bz_error_num == &BZ_OUTBUFF_FULL ? Z_BUF_ERROR :
+ $bz_error_num == &BZ_CONFIG_ERROR ? Z_VERSION_ERROR :
+ Z_VERSION_ERROR
+ ;
+
+ return $gz_error_num;
+}
+
+sub gzopen ( $$ ) {
+ goto &bzopen;
+}
+
+sub gzread ( $$;$ ) {
+ goto &bzread;
+}
+
+sub gzreadline ( $$ ) {
+ goto &bzreadline;
+}
+
+sub gzwrite ( $$ ) {
+ goto &bzwrite;
+}
+
+sub gzflush ( $;$ ) {
+ my ( $obj, $flush ) = @_;
+ return Z_OK if $flush == Z_NO_FLUSH;
+ goto &bzflush;
+}
+
+sub gzclose ( $ ) {
+ goto &bzclose;
+}
+
+sub gzeof ( $ ) {
+ goto &bzeof;
+}
+
+sub gzsetparams ( $$$ ) {
+ ## ignore params
+ my ( $obj, $level, $strategy ) = @_;
+ return Z_OK;
+}
+
+sub gzerror ( $ ) {
+ goto &bzerror;
+}
+
+sub deflateInit ( @ ) {
+ ## ignore all options:
+ ## -Level, -Method, -WindowBits, -MemLevel, -Strategy, -Dictionary, -Bufsize
+
+ my @res = bzdeflateInit();
+ return $res[0] if !wantarray;
+
+ return ( $res[0], _bzerror2gzerror( $res[1] ) );
+}
+
+sub deflate ( $$ ) {
+ my ( $obj, $buffer ) = @_;
+
+ my @res = $obj->bzdeflate( $buffer );
+
+ return $res[0] if !wantarray;
+ return ( $res[0], _bzerror2gzerror( $res[1] ) );
+}
+
+sub deflateParams ( $;@ ) {
+ ## ignore all options
+ return Z_OK;
+}
+
+sub flush ( $;$ ) {
+ my ( $obj, $flush_type ) = @_;
+
+ $flush_type = Z_FINISH if !defined($flush_type);
+ return Z_OK if $flush_type == Z_NO_FLUSH;
+
+ my $bz_flush_type;
+ my @res;
+
+ $bz_flush_type =
+ $flush_type == Z_PARTIAL_FLUSH || $flush_type == Z_SYNC_FLUSH ? &BZ_FLUSH :
+ $flush_type == Z_FULL_FLUSH ? &BZ_FINISH :
+ &BZ_FINISH;
+
+ @res = $obj->bzflush( $bz_flush_type );
+
+ return $res[0] if !wantarray;
+ return ( $res[0], _bzerror2gzerror( $res[1] ) );
+}
+
+sub dict_adler ( $ ) {
+ return 1; # ???
+}
+
+sub msg ( $ ) {
+ my ( $obj ) = @_;
+
+ return ''.($obj->bzerror).''; # stringify
+}
+
+sub inflateInit ( @ ) {
+ ## ignore all options:
+ ## -WindowBits, -Dictionary, -Bufsize
+
+ my @res = bzinflateInit();
+ return $res[0] if !wantarray;
+
+ return ( $res[0], _bzerror2gzerror( $res[1] ) );
+}
+
+sub inflate ( $$ ) {
+ my ( $obj, $buffer ) = @_;
+
+ my @res = $obj->bzinflate( $buffer );
+
+ return $res[0] if !wantarray;
+ return ( $res[0], _bzerror2gzerror( $res[1] ) );
+}
+
+sub inflateSync ( $ ) {
+ return Z_VERSION_ERROR; # ?? what
+}
+
+sub memGzip ( $ ) {
+ goto &memBzip;
+}
+
+sub memGunzip ( $ ) {
+ goto &memBunzip;
+}
+
+sub adler32 ( $;$ ) {
+ return 0;
+}
+
+sub crc32 ( $;$ ) {
+ return 0;
+}
+
+# sub compress ( $;$ ) {
+# ## ignore $level
+# my ( $source, $level ) = @_;
+# return memBzip( $source );
+# }
+
+sub uncompress ( $ ) {
+ my ( $source, $level ) = @_;
+ return memBunzip( $source );
+}
+
+# Autoload methods go after =cut, and are processed by the autosplit program.
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Compress::Bzip2 - Interface to Bzip2 compression library
+
+=head1 SYNOPSIS
+
+ use Compress::Bzip2 qw(:all :constant :utilities :gzip);
+
+ ($bz, $status) = bzdeflateInit( [PARAMS] ) ;
+ ($out, $status) = $bz->bzdeflate($buffer) ;
+
+ ($bz, $status) = bzinflateInit( [PARAMS] ) ;
+ ($out, $status) = $bz->bzinflate($buffer) ;
+
+ ($out, $status) = $bz->bzflush() ;
+ ($out, $status) = $bz->bzclose() ;
+
+ $dest = memBzip($source);
+ alias compress
+ $dest = memBunzip($source);
+ alias decompress
+
+ $bz = Compress::Bzip2->new( [PARAMS] );
+
+ $bz = bzopen($filename or filehandle, $mode);
+ alternate, with $bz created by new():
+ $bz->bzopen($filename or filehandle, $mode);
+
+ $bytesread = $bz->bzread($buffer [,$size]) ;
+ $bytesread = $bz->bzreadline($line);
+ $byteswritten = $bz->bzwrite($buffer [,$limit]);
+ $errstring = $bz->bzerror();
+ $status = $bz->bzeof();
+ $status = $bz->bzflush();
+ $status = $bz->bzclose() ;
+
+ $status = $bz->bzsetparams( $param => $setting );
+
+ $bz->total_in() ;
+ $bz->total_out() ;
+
+ $verstring = $bz->bzversion();
+
+ $Compress::Bzip2::bzerrno
+
+=head1 DESCRIPTION
+
+The I<Compress::Bzip2> module provides a Perl interface to the I<Bzip2>
+compression library (see L</AUTHOR> for details about where to get
+I<Bzip2>). A relevant subset of the functionality provided by I<Bzip2>
+is available in I<Compress::Bzip2>.
+
+All string parameters can either be a scalar or a scalar reference.
+
+The module can be split into two general areas of functionality, namely
+in-memory compression/decompression and read/write access to I<bzip2>
+files. Each of these areas will be discussed separately below.
+
+=head1 FILE READ/WRITE INTERFACE
+
+A number of functions are supplied in I<bzlib> for reading and writing
+I<bzip2> files. Unfortunately, most of them are not suitable. So, this
+module provides another interface, built over top of the low level bzlib
+methods.
+
+=over 5
+
+=head2 B<$bz = bzopen(filename or filehandle, mode)>
+
+This function returns an object which is used to access the other
+I<bzip2> methods.
+
+The B<mode> parameter is used to specify both whether the file is
+opened for reading or writing, with "r" or "w" respectively.
+
+If a reference to an open filehandle is passed in place of the
+filename, it better be positioned to the start of a
+compression/decompression sequence.
+
+=head2 B<$bz = Compress::Bzip2-E<gt>new( [PARAMS] )>
+
+Create a Compress::Bzip2 object. Optionally, provide
+compression/decompression parameters as a keyword => setting list.
+See I<bzsetparams()> for a description of the parameters.
+
+=head2 B<$bz-E<gt>bzopen(filename or filehandle, mode)>
+
+This is bzopen, but it uses an object previously created by the new
+method. Other than that, it is identical to the above bzopen.
+
+=head2 B<$bytesread = $bz-E<gt>bzread($buffer [, $size]) ;>
+
+Reads B<$size> bytes from the compressed file into B<$buffer>. If
+B<$size> is not specified, it will default to 4096. If the scalar
+B<$buffer> is not large enough, it will be extended automatically.
+
+Returns the number of bytes actually read. On EOF it returns 0 and in
+the case of an error, -1.
+
+=head2 B<$bytesread = $bz-E<gt>bzreadline($line) ;>
+
+Reads the next line from the compressed file into B<$line>.
+
+Returns the number of bytes actually read. On EOF it returns 0 and in
+the case of an error, -1.
+
+It IS legal to intermix calls to B<bzread> and B<bzreadline>.
+
+At this time B<bzreadline> ignores the variable C<$/>
+(C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use). The
+end of a line is denoted by the C character C<'\n'>.
+
+=head2 B<$byteswritten = $bz-E<gt>bzwrite($buffer [, $limit]) ;>
+
+Writes the contents of B<$buffer> to the compressed file. Returns the
+number of bytes actually written, or 0 on error.
+
+If $limit is given and non-zero, then only that many bytes from
+$buffer will be written.
+
+=head2 B<$status = $bz-E<gt>bzflush($flush) ;>
+
+Flushes all pending output to the compressed file.
+Works identically to the I<zlib> function it interfaces to. Note that
+the use of B<bzflush> can degrade compression.
+
+Returns C<BZ_OK> if B<$flush> is C<BZ_FINISH> and all output could be
+flushed. Otherwise the bzlib error code is returned.
+
+Refer to the I<bzlib> documentation for the valid values of B<$flush>.
+
+=head2 B<$status = $bz-E<gt>bzeof() ;>
+
+Returns 1 if the end of file has been detected while reading the input
+file, otherwise returns 0.
+
+=head2 B<$bz-E<gt>bzclose>
+
+Closes the compressed file. Any pending data is flushed to the file
+before it is closed.
+
+=head2 B<$bz-E<gt>bzsetparams( [PARAMS] );>
+
+Change settings for the deflate stream C<$bz>.
+
+The list of the valid options is shown below. Options not specified
+will remain unchanged.
+
+=over 5
+
+=item B<-verbosity>
+
+Defines the verbosity level. Valid values are 0 through 4,
+
+The default is C<-verbosity =E<gt> 0>.
+
+=item B<-blockSize100k>
+
+For bzip object opened for stream deflation or write.
+
+Defines the buffering factor of compression method. The algorithm
+buffers all data until the buffer is full, then it flushes all the
+data out. Use -blockSize100k to specify the size of the buffer.
+
+Valid settings are 1 through 9, representing a blocking in multiples
+of 100k.
+
+Note that each such block has an overhead of leading and trailing
+synchronization bytes. bzip2 recovery uses this information to
+pull useable data out of a corrupted file.
+
+A streaming application would probably want to set the blocking low.
+
+=item B<-workFactor>
+
+For bzip object opened for stream deflation or write.
+
+The workFactor setting tells the deflation algorithm how much work
+to invest to compensate for repetitive data.
+
+workFactor may be a number from 0 to 250 inclusive. The default setting
+is 30.
+
+See the bzip documentation for more information.
+
+=item B<-small>
+
+For bzip object opened for stream inflation or read.
+
+B<small> may be 0 or 1. Set C<small> to one to use a slower, less
+memory intensive algorithm.
+
+=back
+
+=head2 B<$bz-E<gt>bzerror>
+
+Returns the I<bzlib> error message or number for the last operation
+associated with B<$bz>. The return value will be the I<bzlib> error
+number when used in a numeric context and the I<bzlib> error message
+when used in a string context. The I<bzlib> error number constants,
+shown below, are available for use.
+
+ BZ_CONFIG_ERROR
+ BZ_DATA_ERROR
+ BZ_DATA_ERROR_MAGIC
+ BZ_FINISH
+ BZ_FINISH_OK
+ BZ_FLUSH
+ BZ_FLUSH_OK
+ BZ_IO_ERROR
+ BZ_MAX_UNUSED
+ BZ_MEM_ERROR
+ BZ_OK
+ BZ_OUTBUFF_FULL
+ BZ_PARAM_ERROR
+ BZ_RUN
+ BZ_RUN_OK
+ BZ_SEQUENCE_ERROR
+ BZ_STREAM_END
+ BZ_UNEXPECTED_EOF
+
+=head2 B<$bzerrno>
+
+The B<$bzerrno> scalar holds the error code associated with the most
+recent I<bzip2> routine. Note that unlike B<bzerror()>, the error is
+I<not> associated with a particular file.
+
+As with B<bzerror()> it returns an error number in numeric context and
+an error message in string context. Unlike B<bzerror()> though, the
+error message will correspond to the I<bzlib> message when the error is
+associated with I<bzlib> itself, or the UNIX error message when it is
+not (i.e. I<bzlib> returned C<Z_ERRORNO>).
+
+As there is an overlap between the error numbers used by I<bzlib> and
+UNIX, B<$bzerrno> should only be used to check for the presence of
+I<an> error in numeric context. Use B<bzerror()> to check for specific
+I<bzlib> errors. The I<bzcat> example below shows how the variable can
+be used safely.
+
+=back
+
+=head1 Compress::Bzip2 1.03 COMPATIBILITY
+
+While the 2.x thread forked off of 1.00, another line of development
+came to a head at 1.03. The 1.03 version worked with bzlib 1.0.2, had
+improvements to the error handling, single buffer inflate/deflate, a
+streaming interface to inflate/deflate, and a cpan style test suite.
+
+=over 5
+
+=head2 B<$dest = compress( $string, [$level] )>
+
+Alias to memBzip, this compresses string, using the optional
+compression level, 1 through 9, the default being 1. Returns a string
+containing the compressed data.
+
+On error I<undef> is returned.
+
+=head2 B<$dest = decompress($string)>
+
+Alias to memBunzip, this decompresses the data in string, returning a
+string containing the decompressed data.
+
+On error I<undef> is returned.
+
+=head2 B<$stream = compress_init( [PARAMS] )>
+
+Alias to bzdeflateInit. In addition to the named parameters
+documented for bzdeflateInit, the following are accepted:
+
+ -level, alias to -blockSize100k
+ -buffer, to set the buffer size.
+
+The -buffer option is ignored. The intermediate buffer size is not
+changeable.
+
+=head2 B<$stream = decompress_init( [PARAMS] )>
+
+Alias to bzinflateInit. See bzinflateInit for a description of the parameters.
+The option "-buffer" is accepted, but ignored.
+
+=head2 B<$output = $stream-E<gt>add( $string )>
+
+Add data to be compressed/decompressed. Returns whatever output is available
+(possibly none, if it's still buffering it), or undef on error.
+
+=head2 B<$output = $stream-E<gt>finish( [$string] )>
+
+Finish the operation; takes an optional final data string. Whatever is
+returned completes the output; returns undef on error.
+
+=head2 B<$stream-E<gt>error>
+
+Like the function, but applies to the current object only. Note that errors
+in a stream object are also returned by the function.
+
+=head2 B<$stream-E<gt>input_size>
+
+Alias to total_in. Total bytes passed to the stream.
+
+=head2 B<$stream-E<gt>output_size>
+
+Alias to total_out. Total bytes received from the stream.
+
+=back
+
+=head1 GZIP COMPATIBILITY INTERFACE
+
+Except for the exact state and error numbers, this package presents an
+interface very much like that given by the Compress::Zlib package.
+Mostly, if you take the method name, state or error number from
+Compress::Zlib and replace the "g" with a "b", your code should work.
+
+To make the interoperability even easier, all the Compress::Zlib method
+names have been used as aliases or cover functions for the bzip2 methods.
+
+Therefore, most code that uses Compress::Zlib should be able to use
+this package, with a one line change.
+
+Simply change
+
+ $gz = Compress::Zlib::gzopen( "filename", "w" );
+
+to
+
+ $gz = Compress::Bzip2::gzopen( "filename", "w" );
+
+Some of the Compress::Zlib aliases don't return anything useful, like
+crc32 or adler32, cause bzip2 doesn't do that sort of thing.
+
+=over 5
+
+=head2 B< $gz = gzopen( $filename, $mode ) >
+
+Alias for bzopen.
+
+=head2 B< $gz-E<gt>gzread( $buffer, [ $length ] ) >
+
+Alias for bzread.
+
+=head2 B< $gz-E<gt>gzreadline( $buffer ) >
+
+Alias for bzreadline.
+
+=head2 B< $gz-E<gt>gzwrite( $buffer ) >
+
+Alias for bzwrite.
+
+=head2 B< $gz-E<gt>gzflush( [$flushtype] ) >
+
+Alias for bzflush, with return code translation.
+
+=head2 B< $gz-E<gt>gzclose( ) >
+
+Alias for bzclose.
+
+=head2 B< $gz-E<gt>gzeof( ) >
+
+Alias for bzeof.
+
+=head2 B< $gz-E<gt>gzerror( ) >
+
+Alias for bzerror.
+
+=head2 B< $gz-E<gt>gzsetparams( $level, $strategy ) >
+
+This is a no-op.
+
+=head2 B< $d = deflateInit( [OPTS] ) >
+
+Alias for bzdeflateInit, with return code translation.
+
+All OPTS are ignored.
+
+=head2 B< $d-E<gt>deflate( $buffer ) >
+
+Alias for bzdeflate, with return code translation.
+
+=head2 B< $d-E<gt>deflateParams( [OPTS] ) >
+
+This is a no-op.
+
+=head2 B< $d-E<gt>flush( [$flushtype] ) >
+
+Cover function for bzflush or bzclose, depending on $flushtype.
+
+See the Compress::Zlib documentation for more information.
+
+=head2 B< $d-E<gt>dict_adler( ) >
+
+This is a no-op.
+
+=head2 B< $d-E<gt>msg( ) >
+
+This is a no-op.
+
+=head2 B< $d = inflateInit( [OPTS] ) >
+
+Alias for bzinflateInit, with return code translation.
+
+All OPTS are ignored.
+
+=head2 B< $d-E<gt>inflate( ) >
+
+Alias for bzinflate, with return code translation.
+
+=head2 B< $d-E<gt>inflateSync( ) >
+
+This is a no-op.
+
+=head2 B< $d-E<gt>adler32( $crc ) >
+
+This is a no-op.
+
+=head2 B< $d-E<gt>crc32( $crc ) >
+
+This is a no-op.
+
+=head2 B< $buffer = memGzip( $buffer ) >
+
+Alias for memBzip.
+
+=head2 B< $buffer = memGunzip( $buffer ) >
+
+Alias for memBunzip.
+
+=back
+
+=head1 IN-MEMORY COMPRESS/UNCOMPRESS
+
+Two high-level functions are provided by I<bzlib> to perform in-memory
+compression. They are B<memBzip> and B<memBunzip>. Two Perl subs are
+provided which provide similar functionality.
+
+=over 5
+
+=head2 B<$compressed = memBzip($buffer);>
+
+Compresses B<$source>. If successful it returns the compressed
+data. Otherwise it returns I<undef>.
+
+The buffer parameter can either be a scalar or a scalar reference.
+
+Essentially, an in-memory bzip file is created. It creates a minimal
+bzip header.
+
+=head2 B<$uncompressed = memBunzip($buffer);>
+
+Uncompresses B<$source>. If successful it returns the uncompressed
+data. Otherwise it returns I<undef>.
+
+The source buffer can either be a scalar or a scalar reference.
+
+The buffer parameter can either be a scalar or a scalar reference. The
+contents of the buffer parameter are destroyed after calling this
+function.
+
+=back
+
+=head1 STREAM DEFLATE
+
+The Perl interface will I<always> consume the complete input buffer
+before returning. Also the output buffer returned will be
+automatically grown to fit the amount of output available.
+
+Here is a definition of the interface available:
+
+=head2 B<($d, $status) = bzdeflateInit( [PARAMS] )>
+
+Initialises a deflation stream.
+
+If successful, it will return the initialised deflation stream, B<$d>
+and B<$status> of C<BZ_OK> in a list context. In scalar context it
+returns the deflation stream, B<$d>, only.
+
+If not successful, the returned deflation stream (B<$d>) will be
+I<undef> and B<$status> will hold the exact I<bzip2> error code.
+
+The function optionally takes a number of named options specified as
+C<-Name=E<gt>value> pairs. This allows individual options to be
+tailored without having to specify them all in the parameter list.
+
+Here is a list of the valid options:
+
+=over 5
+
+=item B<-verbosity>
+
+Defines the verbosity level. Valid values are 0 through 4,
+
+The default is C<-verbosity =E<gt> 0>.
+
+=item B<-blockSize100k>
+
+Defines the buffering factor of compression method. The algorithm
+buffers all data until the buffer is full, then it flushes all the
+data out. Use -blockSize100k to specify the size of the buffer.
+
+Valid settings are 1 through 9, representing a blocking in multiples
+of 100k.
+
+Note that each such block has an overhead of leading and trailing
+synchronization bytes. bzip2 recovery uses this information to
+pull useable data out of a corrupted file.
+
+A streaming application would probably want to set the blocking low.
+
+=item B<-workFactor>
+
+The workFactor setting tells the deflation algorithm how much work
+to invest to compensate for repetitive data.
+
+workFactor may be a number from 0 to 250 inclusive. The default setting
+is 30.
+
+See the bzip documentation for more information.
+
+=back
+
+Here is an example of using the B<deflateInit> optional parameter list
+to override the default buffer size and compression level. All other
+options will take their default values.
+
+ bzdeflateInit( -blockSize100k => 1, -verbosity => 1 );
+
+=head2 B<($out, $status) = $d-E<gt>bzdeflate($buffer)>
+
+Deflates the contents of B<$buffer>. The buffer can either be a scalar
+or a scalar reference. When finished, B<$buffer> will be
+completely processed (assuming there were no errors). If the deflation
+was successful it returns deflated output, B<$out>, and a status
+value, B<$status>, of C<Z_OK>.
+
+On error, B<$out> will be I<undef> and B<$status> will contain the
+I<zlib> error code.
+
+In a scalar context B<bzdeflate> will return B<$out> only.
+
+As with the internal buffering of the I<deflate> function in I<bzip2>,
+it is not necessarily the case that any output will be produced by
+this method. So don't rely on the fact that B<$out> is empty for an
+error test. In fact, given the size of bzdeflates internal buffer,
+with most files it's likely you won't see any output at all until
+flush or close.
+
+=head2 B<($out, $status) = $d-E<gt>bzflush([flush_type])>
+
+Typically used to finish the deflation. Any pending output will be
+returned via B<$out>. B<$status> will have a value C<BZ_OK> if
+successful.
+
+In a scalar context B<bzflush> will return B<$out> only.
+
+Note that flushing can seriously degrade the compression ratio, so it
+should only be used to terminate a decompression (using C<BZ_FLUSH>) or
+when you want to create a I<full flush point> (using C<BZ_FINISH>).
+
+The allowable values for C<flush_type> are C<BZ_FLUSH> and C<BZ_FINISH>.
+
+For a handle opened for "w" (bzwrite), the default is C<BZ_FLUSH>.
+For a stream, the default for C<flush_type> is C<BZ_FINISH> (which is
+essentially a close and reopen).
+
+It is strongly recommended that you only set the C<flush_type>
+parameter if you fully understand the implications of what it
+does. See the C<bzip2> documentation for details.
+
+=head2 Example
+
+Here is a trivial example of using B<bzdeflate>. It simply reads standard
+input, deflates it and writes it to standard output.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Bzip2 ;
+
+ binmode STDIN;
+ binmode STDOUT;
+ my $x = bzdeflateInit()
+ or die "Cannot create a deflation stream\n" ;
+
+ my ($output, $status) ;
+ while (<>)
+ {
+ ($output, $status) = $x->bzdeflate($_) ;
+
+ $status == BZ_OK
+ or die "deflation failed\n" ;
+
+ print $output ;
+ }
+
+ ($output, $status) = $x->bzclose() ;
+
+ $status == BZ_OK
+ or die "deflation failed\n" ;
+
+ print $output ;
+
+=head1 STREAM INFLATE
+
+Here is a definition of the interface:
+
+=head2 B<($i, $status) = inflateInit()>
+
+Initialises an inflation stream.
+
+In a list context it returns the inflation stream, B<$i>, and the
+I<zlib> status code (B<$status>). In a scalar context it returns the
+inflation stream only.
+
+If successful, B<$i> will hold the inflation stream and B<$status> will
+be C<BZ_OK>.
+
+If not successful, B<$i> will be I<undef> and B<$status> will hold the
+I<bzlib.h> error code.
+
+The function optionally takes a number of named options specified as
+C<-Name=E<gt>value> pairs. This allows individual options to be
+tailored without having to specify them all in the parameter list.
+
+For backward compatibility, it is also possible to pass the parameters
+as a reference to a hash containing the name=>value pairs.
+
+The function takes one optional parameter, a reference to a hash. The
+contents of the hash allow the deflation interface to be tailored.
+
+Here is a list of the valid options:
+
+=over 5
+
+=item B<-small>
+
+B<small> may be 0 or 1. Set C<small> to one to use a slower, less
+memory intensive algorithm.
+
+=item B<-verbosity>
+
+Defines the verbosity level. Valid values are 0 through 4,
+
+The default is C<-verbosity =E<gt> 0>.
+
+=back
+
+Here is an example of using the B<bzinflateInit> optional parameter.
+
+ bzinflateInit( -small => 1, -verbosity => 1 );
+
+=head2 B<($out, $status) = $i-E<gt>bzinflate($buffer)>
+
+Inflates the complete contents of B<$buffer>. The buffer can either be
+a scalar or a scalar reference.
+
+Returns C<BZ_OK> if successful and C<BZ_STREAM_END> if the end of the
+compressed data has been successfully reached. If not successful,
+B<$out> will be I<undef> and B<$status> will hold the I<bzlib> error
+code.
+
+The C<$buffer> parameter is modified by C<bzinflate>. On completion it
+will contain what remains of the input buffer after inflation. This
+means that C<$buffer> will be an empty string when the return status
+is C<BZ_OK>. When the return status is C<BZ_STREAM_END> the C<$buffer>
+parameter will contains what (if anything) was stored in the input
+buffer after the deflated data stream.
+
+This feature is useful when processing a file format that encapsulates
+a compressed data stream.
+
+=head2 Example
+
+Here is an example of using B<bzinflate>.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Bzip2;
+
+ my $x = bzinflateInit()
+ or die "Cannot create a inflation stream\n" ;
+
+ my $input = '' ;
+ binmode STDIN;
+ binmode STDOUT;
+
+ my ($output, $status) ;
+ while (read(STDIN, $input, 4096))
+ {
+ ($output, $status) = $x->bzinflate(\$input) ;
+
+ print $output
+ if $status == BZ_OK or $status == BZ_STREAM_END ;
+
+ last if $status != BZ_OK ;
+ }
+
+ die "inflation failed\n"
+ unless $status == BZ_STREAM_END ;
+
+=head1 EXAMPLES
+
+Here are some example scripts of using the interface.
+
+=over 5
+
+=head2 B<A bzcat function>
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Bzip2 ;
+
+ die "Usage: bzcat file...\n" unless @ARGV ;
+
+ my $file ;
+
+ foreach $file (@ARGV) {
+ my $buffer ;
+
+ my $bz = bzopen($file, "rb")
+ or die "Cannot open $file: $bzerrno\n" ;
+
+ print $buffer while $bz->bzread($buffer) > 0 ;
+
+ die "Error reading from $file: $bzerrno" . ($bzerrno+0) . "\n"
+ if $bzerrno != BZ_STREAM_END ;
+
+ $bz->bzclose() ;
+ }
+
+=head2 B<A grep using bzreadline>
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Bzip2 ;
+
+ die "Usage: bzgrep pattern file...\n" unless @ARGV >= 2;
+
+ my $pattern = shift ;
+
+ my $file ;
+
+ foreach $file (@ARGV) {
+ my $bz = bzopen($file, "rb")
+ or die "Cannot open $file: $bzerrno\n" ;
+
+ while ($bz->bzreadline($_) > 0) {
+ print if /$pattern/ ;
+ }
+
+ die "Error reading from $file: $bzerrno\n"
+ if $bzerrno != Z_STREAM_END ;
+
+ $bz->bzclose() ;
+ }
+
+=head2 B<Streaming Compression>
+
+This script, I<bzstream>, does the opposite of the I<bzcat> script
+above. It reads from standard input and writes a bzip file to standard
+output.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Bzip2 ;
+
+ binmode STDOUT; # bzopen only sets it on the fd
+
+ my $bz = bzopen(\*STDOUT, "wb")
+ or die "Cannot open stdout: $bzerrno\n" ;
+
+ while (<>) {
+ $bz->bzwrite($_) or die "error writing: $bzerrno\n" ;
+ }
+
+ $bz->bzclose ;
+
+=back
+
+=head1 EXPORT
+
+Use the tags :all, :utilities, :constants, :bzip1 and :gzip.
+
+=head2 Export tag :all
+
+This exports all the exportable methods.
+
+=head2 Export tag :constants
+
+This exports only the BZ_* constants.
+
+=head2 Export tag :bzip1
+
+This exports the Compress::Bzip2 1.x functions, for compatibility.
+
+ compress
+ decompress
+ compress_init
+ decompress_init
+ version
+
+These are actually aliases to memBzip and memBunzip.
+
+=head2 Export tag :utilities
+
+This gives an interface to the bzip2 methods.
+
+ bzopen
+ bzinflateInit
+ bzdeflateInit
+ memBzip
+ memBunzip
+ bzip2
+ bunzip2
+ bzcat
+ bzlibversion
+ $bzerrno
+
+=head2 Export tag :gzip
+
+This gives compatibility with Compress::Zlib.
+
+ gzopen
+ gzinflateInit
+ gzdeflateInit
+ memGzip
+ memGunzip
+ $gzerrno
+
+=head1 Exportable constants
+
+All the I<bzlib> constants are automatically imported when you make use
+of I<Compress::Bzip2>.
+
+ BZ_CONFIG_ERROR
+ BZ_DATA_ERROR
+ BZ_DATA_ERROR_MAGIC
+ BZ_FINISH
+ BZ_FINISH_OK
+ BZ_FLUSH
+ BZ_FLUSH_OK
+ BZ_IO_ERROR
+ BZ_MAX_UNUSED
+ BZ_MEM_ERROR
+ BZ_OK
+ BZ_OUTBUFF_FULL
+ BZ_PARAM_ERROR
+ BZ_RUN
+ BZ_RUN_OK
+ BZ_SEQUENCE_ERROR
+ BZ_STREAM_END
+ BZ_UNEXPECTED_EOF
+
+=head1 SEE ALSO
+
+The documentation for zlib, bzip2 and Compress::Zlib.
+
+=head1 AUTHOR
+
+Rob Janes, E<lt>arjay at cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2005 by Rob Janes
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.8.3 or,
+at your option, any later version of Perl 5 you may have available.
+
+=head1 AUTHOR
+
+The I<Compress::Bzip2> module was originally written by Gawdi Azem
+F<azemgi@rupert.informatik.uni-stuttgart.de>.
+
+The first I<Compress::Bzip2> module was written by Gawdi Azem
+F<azemgi@rupert.informatik.uni-stuttgart.de>. It provided an
+interface to the in memory inflate and deflate routines.
+
+I<Compress::Bzip2> was subsequently passed on to Marco Carnut
+F<kiko@tempest.com.br> who shepharded it through to version 1.03, a
+set of changes which included upgrades to handle bzlib 1.0.2, and
+improvements to the in memory inflate and deflate routines. The
+streaming interface and error information were added by David Robins
+F<dbrobins@davidrobins.net>.
+
+Version 2 of I<Compress::Bzip2> is due to Rob Janes, of
+arjay@cpan.org. This release is intended to give an interface
+close to that of Compress::Zlib. It's development forks from 1.00,
+not 1.03, so the streaming interface is not the same as that in 1.03,
+although apparently compatible as it passes the 1.03 test suite.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+2.00 Second public release of I<Compress::Bzip2>.
+
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Compress/Raw/Bzip2.pm b/Master/tlpkg/tlperl.straw/lib/Compress/Raw/Bzip2.pm
new file mode 100755
index 00000000000..48f82073355
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Compress/Raw/Bzip2.pm
@@ -0,0 +1,355 @@
+
+package Compress::Raw::Bzip2;
+
+use strict ;
+use warnings ;
+
+require 5.004 ;
+require Exporter;
+use AutoLoader;
+use Carp ;
+
+use bytes ;
+our ($VERSION, $XS_VERSION, @ISA, @EXPORT, $AUTOLOAD);
+
+$VERSION = '2.024';
+$XS_VERSION = $VERSION;
+$VERSION = eval $VERSION;
+
+@ISA = qw(Exporter);
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+@EXPORT = qw(
+ BZ_RUN
+ BZ_FLUSH
+ BZ_FINISH
+
+ BZ_OK
+ BZ_RUN_OK
+ BZ_FLUSH_OK
+ BZ_FINISH_OK
+ BZ_STREAM_END
+ BZ_SEQUENCE_ERROR
+ BZ_PARAM_ERROR
+ BZ_MEM_ERROR
+ BZ_DATA_ERROR
+ BZ_DATA_ERROR_MAGIC
+ BZ_IO_ERROR
+ BZ_UNEXPECTED_EOF
+ BZ_OUTBUFF_FULL
+ BZ_CONFIG_ERROR
+
+ );
+
+sub AUTOLOAD {
+ my($constname);
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ my ($error, $val) = constant($constname);
+ Carp::croak $error if $error;
+ no strict 'refs';
+ *{$AUTOLOAD} = sub { $val };
+ goto &{$AUTOLOAD};
+
+}
+
+use constant FLAG_APPEND => 1 ;
+use constant FLAG_CRC => 2 ;
+use constant FLAG_ADLER => 4 ;
+use constant FLAG_CONSUME_INPUT => 8 ;
+
+eval {
+ require XSLoader;
+ XSLoader::load('Compress::Raw::Bzip2', $XS_VERSION);
+ 1;
+}
+or do {
+ require DynaLoader;
+ local @ISA = qw(DynaLoader);
+ bootstrap Compress::Raw::Bzip2 $XS_VERSION ;
+};
+
+#sub Compress::Raw::Bzip2::new
+#{
+# my $class = shift ;
+# my ($ptr, $status) = _new(@_);
+# return wantarray ? (undef, $status) : undef
+# unless $ptr ;
+# my $obj = bless [$ptr], $class ;
+# return wantarray ? ($obj, $status) : $obj;
+#}
+#
+#package Compress::Raw::Bunzip2 ;
+#
+#sub Compress::Raw::Bunzip2::new
+#{
+# my $class = shift ;
+# my ($ptr, $status) = _new(@_);
+# return wantarray ? (undef, $status) : undef
+# unless $ptr ;
+# my $obj = bless [$ptr], $class ;
+# return wantarray ? ($obj, $status) : $obj;
+#}
+
+package Compress::Raw::Bzip2;
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+Compress::Raw::Bzip2 - Low-Level Interface to bzip2 compression library
+
+=head1 SYNOPSIS
+
+ use Compress::Raw::Bzip2 ;
+
+ my ($bz, $status) = new Compress::Raw::Bzip2 [OPTS]
+ or die "Cannot create bzip2 object: $bzerno\n";
+
+ $status = $bz->bzdeflate($input, $output);
+ $status = $bz->bzflush($output);
+ $status = $bz->bzclose($output);
+
+ my ($bz, $status) = new Compress::Raw::Bunzip2 [OPTS]
+ or die "Cannot create bunzip2 object: $bzerno\n";
+
+ $status = $bz->bzinflate($input, $output);
+
+ my $version = Compress::Raw::Bzip2::bzlibversion();
+
+=head1 DESCRIPTION
+
+C<Compress::Raw::Bzip2> provides an interface to the in-memory
+compression/uncompression functions from the bzip2 compression library.
+
+Although the primary purpose for the existence of C<Compress::Raw::Bzip2>
+is for use by the C<IO::Compress::Bzip2> and C<IO::Compress::Bunzip2>
+modules, it can be used on its own for simple compression/uncompression
+tasks.
+
+=head1 Compression
+
+=head2 ($z, $status) = new Compress::Raw::Bzip2 $appendOutput, $blockSize100k, $workfactor;
+
+Creates a new compression object.
+
+If successful, it will return the initialised compression object, C<$z>
+and a C<$status> of C<BZ_OK> in a list context. In scalar context it
+returns the deflation object, C<$z>, only.
+
+If not successful, the returned compression object, C<$z>, will be
+I<undef> and C<$status> will hold the a I<bzip2> error code.
+
+Below is a list of the valid options:
+
+=over 5
+
+=item B<$appendOutput>
+
+Controls whether the compressed data is appended to the output buffer in
+the C<bzdeflate>, C<bzflush> and C<bzclose> methods.
+
+Defaults to 1.
+
+=item B<$blockSize100k>
+
+To quote the bzip2 documentation
+
+ blockSize100k specifies the block size to be used for compression. It
+ should be a value between 1 and 9 inclusive, and the actual block size
+ used is 100000 x this figure. 9 gives the best compression but takes
+ most memory.
+
+Defaults to 1.
+
+=item B<$workfactor>
+
+To quote the bzip2 documentation
+
+ This parameter controls how the compression phase behaves when
+ presented with worst case, highly repetitive, input data. If
+ compression runs into difficulties caused by repetitive data, the
+ library switches from the standard sorting algorithm to a fallback
+ algorithm. The fallback is slower than the standard algorithm by
+ perhaps a factor of three, but always behaves reasonably, no matter how
+ bad the input.
+
+ Lower values of workFactor reduce the amount of effort the standard
+ algorithm will expend before resorting to the fallback. You should set
+ this parameter carefully; too low, and many inputs will be handled by
+ the fallback algorithm and so compress rather slowly, too high, and
+ your average-to-worst case compression times can become very large. The
+ default value of 30 gives reasonable behaviour over a wide range of
+ circumstances.
+
+ Allowable values range from 0 to 250 inclusive. 0 is a special case,
+ equivalent to using the default value of 30.
+
+Defaults to 0.
+
+=back
+
+=head2 $status = $bz->bzdeflate($input, $output);
+
+Reads the contents of C<$input>, compresses it and writes the compressed
+data to C<$output>.
+
+Returns C<BZ_RUN_OK> on success and a C<bzip2> error code on failure.
+
+If C<appendOutput> is enabled in the constructor for the bzip2 object, the
+compressed data will be appended to C<$output>. If not enabled, C<$output>
+will be truncated before the compressed data is written to it.
+
+=head2 $status = $bz->bzflush($output);
+
+Flushes any pending compressed data to C<$output>.
+
+Returns C<BZ_RUN_OK> on success and a C<bzip2> error code on failure.
+
+=head2 $status = $bz->bzclose($output);
+
+Terminates the compressed data stream and flushes any pending compressed
+data to C<$output>.
+
+Returns C<BZ_STREAM_END> on success and a C<bzip2> error code on failure.
+
+=head2 Example
+
+=head1 Uncompression
+
+=head2 ($z, $status) = new Compress::Raw::Bunzip2 $appendOutput, $consumeInput, $small, $limitOutput;
+
+If successful, it will return the initialised uncompression object, C<$z>
+and a C<$status> of C<BZ_OK> in a list context. In scalar context it
+returns the deflation object, C<$z>, only.
+
+If not successful, the returned uncompression object, C<$z>, will be
+I<undef> and C<$status> will hold the a I<bzip2> error code.
+
+Below is a list of the valid options:
+
+=over 5
+
+=item B<$appendOutput>
+
+Controls whether the compressed data is appended to the output buffer in the
+C<bzinflate>, C<bzflush> and C<bzclose> methods.
+
+Defaults to 1.
+
+=item B<$consumeInput>
+
+=item B<$small>
+
+To quote the bzip2 documentation
+
+ If small is nonzero, the library will use an alternative decompression
+ algorithm which uses less memory but at the cost of decompressing more
+ slowly (roughly speaking, half the speed, but the maximum memory
+ requirement drops to around 2300k).
+
+Defaults to 0.
+
+=item B<$limitOutput>
+
+The C<LimitOutput> option changes the behavior of the C<< $i->bzinflate >>
+method so that the amount of memory used by the output buffer can be
+limited.
+
+When C<LimitOutput> is used the size of the output buffer used will either
+be the 16k or the amount of memory already allocated to C<$output>,
+whichever is larger. Predicting the output size available is tricky, so
+don't rely on getting an exact output buffer size.
+
+When C<LimitOutout> is not specified C<< $i->bzinflate >> will use as much
+memory as it takes to write all the uncompressed data it creates by
+uncompressing the input buffer.
+
+If C<LimitOutput> is enabled, the C<ConsumeInput> option will also be
+enabled.
+
+This option defaults to false.
+
+=back
+
+=head2 $status = $z->bzinflate($input, $output);
+
+Uncompresses C<$input> and writes the uncompressed data to C<$output>.
+
+Returns C<BZ_OK> if the uncompression was successful, but the end of the
+compressed data stream has not been reached. Returns C<BZ_STREAM_END> on
+successful uncompression and the end of the compression stream has been
+reached.
+
+If C<consumeInput> is enabled in the constructor for the bunzip2 object,
+C<$input> will have all compressed data removed from it after
+uncompression. On C<BZ_OK> return this will mean that C<$input> will be an
+empty string; when C<BZ_STREAM_END> C<$input> will either be an empty
+string or will contain whatever data immediately followed the compressed
+data stream.
+
+If C<appendOutput> is enabled in the constructor for the bunzip2 object,
+the uncompressed data will be appended to C<$output>. If not enabled,
+C<$output> will be truncated before the uncompressed data is written to it.
+
+=head1 Misc
+
+=head2 my $version = Compress::Raw::Bzip2::bzlibversion();
+
+Returns the version of the underlying bzip2 library.
+
+=head1 Constants
+
+The following bzip2 constants are exported by this module
+
+ BZ_RUN
+ BZ_FLUSH
+ BZ_FINISH
+
+ BZ_OK
+ BZ_RUN_OK
+ BZ_FLUSH_OK
+ BZ_FINISH_OK
+ BZ_STREAM_END
+ BZ_SEQUENCE_ERROR
+ BZ_PARAM_ERROR
+ BZ_MEM_ERROR
+ BZ_DATA_ERROR
+ BZ_DATA_ERROR_MAGIC
+ BZ_IO_ERROR
+ BZ_UNEXPECTED_EOF
+ BZ_OUTBUFF_FULL
+ BZ_CONFIG_ERROR
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+The primary site for the bzip2 program is F<http://www.bzip.org>.
+
+See the module L<Compress::Bzip2|Compress::Bzip2>
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Compress/Raw/Zlib.pm b/Master/tlpkg/tlperl.straw/lib/Compress/Raw/Zlib.pm
new file mode 100755
index 00000000000..79c96b76ccd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Compress/Raw/Zlib.pm
@@ -0,0 +1,1419 @@
+
+package Compress::Raw::Zlib;
+
+require 5.004 ;
+require Exporter;
+use AutoLoader;
+use Carp ;
+
+#use Parse::Parameters;
+
+use strict ;
+use warnings ;
+use bytes ;
+our ($VERSION, $XS_VERSION, @ISA, @EXPORT, $AUTOLOAD);
+
+$VERSION = '2.024';
+$XS_VERSION = $VERSION;
+$VERSION = eval $VERSION;
+
+@ISA = qw(Exporter);
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+@EXPORT = qw(
+ adler32 crc32
+
+ ZLIB_VERSION
+ ZLIB_VERNUM
+
+ DEF_WBITS
+ OS_CODE
+
+ MAX_MEM_LEVEL
+ MAX_WBITS
+
+ Z_ASCII
+ Z_BEST_COMPRESSION
+ Z_BEST_SPEED
+ Z_BINARY
+ Z_BLOCK
+ Z_BUF_ERROR
+ Z_DATA_ERROR
+ Z_DEFAULT_COMPRESSION
+ Z_DEFAULT_STRATEGY
+ Z_DEFLATED
+ Z_ERRNO
+ Z_FILTERED
+ Z_FIXED
+ Z_FINISH
+ Z_FULL_FLUSH
+ Z_HUFFMAN_ONLY
+ Z_MEM_ERROR
+ Z_NEED_DICT
+ Z_NO_COMPRESSION
+ Z_NO_FLUSH
+ Z_NULL
+ Z_OK
+ Z_PARTIAL_FLUSH
+ Z_RLE
+ Z_STREAM_END
+ Z_STREAM_ERROR
+ Z_SYNC_FLUSH
+ Z_UNKNOWN
+ Z_VERSION_ERROR
+
+ WANT_GZIP
+ WANT_GZIP_OR_ZLIB
+);
+
+use constant WANT_GZIP => 16;
+use constant WANT_GZIP_OR_ZLIB => 32;
+
+sub AUTOLOAD {
+ my($constname);
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ my ($error, $val) = constant($constname);
+ Carp::croak $error if $error;
+ no strict 'refs';
+ *{$AUTOLOAD} = sub { $val };
+ goto &{$AUTOLOAD};
+}
+
+use constant FLAG_APPEND => 1 ;
+use constant FLAG_CRC => 2 ;
+use constant FLAG_ADLER => 4 ;
+use constant FLAG_CONSUME_INPUT => 8 ;
+use constant FLAG_LIMIT_OUTPUT => 16 ;
+
+eval {
+ require XSLoader;
+ XSLoader::load('Compress::Raw::Zlib', $XS_VERSION);
+ 1;
+}
+or do {
+ require DynaLoader;
+ local @ISA = qw(DynaLoader);
+ bootstrap Compress::Raw::Zlib $XS_VERSION ;
+};
+
+
+use constant Parse_any => 0x01;
+use constant Parse_unsigned => 0x02;
+use constant Parse_signed => 0x04;
+use constant Parse_boolean => 0x08;
+use constant Parse_string => 0x10;
+use constant Parse_custom => 0x12;
+
+use constant Parse_store_ref => 0x100 ;
+
+use constant OFF_PARSED => 0 ;
+use constant OFF_TYPE => 1 ;
+use constant OFF_DEFAULT => 2 ;
+use constant OFF_FIXED => 3 ;
+use constant OFF_FIRST_ONLY => 4 ;
+use constant OFF_STICKY => 5 ;
+
+
+
+sub ParseParameters
+{
+ my $level = shift || 0 ;
+
+ my $sub = (caller($level + 1))[3] ;
+ #local $Carp::CarpLevel = 1 ;
+ my $p = new Compress::Raw::Zlib::Parameters() ;
+ $p->parse(@_)
+ or croak "$sub: $p->{Error}" ;
+
+ return $p;
+}
+
+
+sub Compress::Raw::Zlib::Parameters::new
+{
+ my $class = shift ;
+
+ my $obj = { Error => '',
+ Got => {},
+ } ;
+
+ #return bless $obj, ref($class) || $class || __PACKAGE__ ;
+ return bless $obj, 'Compress::Raw::Zlib::Parameters' ;
+}
+
+sub Compress::Raw::Zlib::Parameters::setError
+{
+ my $self = shift ;
+ my $error = shift ;
+ my $retval = @_ ? shift : undef ;
+
+ $self->{Error} = $error ;
+ return $retval;
+}
+
+#sub getError
+#{
+# my $self = shift ;
+# return $self->{Error} ;
+#}
+
+sub Compress::Raw::Zlib::Parameters::parse
+{
+ my $self = shift ;
+
+ my $default = shift ;
+
+ my $got = $self->{Got} ;
+ my $firstTime = keys %{ $got } == 0 ;
+
+ my (@Bad) ;
+ my @entered = () ;
+
+ # Allow the options to be passed as a hash reference or
+ # as the complete hash.
+ if (@_ == 0) {
+ @entered = () ;
+ }
+ elsif (@_ == 1) {
+ my $href = $_[0] ;
+ return $self->setError("Expected even number of parameters, got 1")
+ if ! defined $href or ! ref $href or ref $href ne "HASH" ;
+
+ foreach my $key (keys %$href) {
+ push @entered, $key ;
+ push @entered, \$href->{$key} ;
+ }
+ }
+ else {
+ my $count = @_;
+ return $self->setError("Expected even number of parameters, got $count")
+ if $count % 2 != 0 ;
+
+ for my $i (0.. $count / 2 - 1) {
+ push @entered, $_[2* $i] ;
+ push @entered, \$_[2* $i+1] ;
+ }
+ }
+
+
+ while (my ($key, $v) = each %$default)
+ {
+ croak "need 4 params [@$v]"
+ if @$v != 4 ;
+
+ my ($first_only, $sticky, $type, $value) = @$v ;
+ my $x ;
+ $self->_checkType($key, \$value, $type, 0, \$x)
+ or return undef ;
+
+ $key = lc $key;
+
+ if ($firstTime || ! $sticky) {
+ $got->{$key} = [0, $type, $value, $x, $first_only, $sticky] ;
+ }
+
+ $got->{$key}[OFF_PARSED] = 0 ;
+ }
+
+ for my $i (0.. @entered / 2 - 1) {
+ my $key = $entered[2* $i] ;
+ my $value = $entered[2* $i+1] ;
+
+ #print "Key [$key] Value [$value]" ;
+ #print defined $$value ? "[$$value]\n" : "[undef]\n";
+
+ $key =~ s/^-// ;
+ my $canonkey = lc $key;
+
+ if ($got->{$canonkey} && ($firstTime ||
+ ! $got->{$canonkey}[OFF_FIRST_ONLY] ))
+ {
+ my $type = $got->{$canonkey}[OFF_TYPE] ;
+ my $s ;
+ $self->_checkType($key, $value, $type, 1, \$s)
+ or return undef ;
+ #$value = $$value unless $type & Parse_store_ref ;
+ $value = $$value ;
+ $got->{$canonkey} = [1, $type, $value, $s] ;
+ }
+ else
+ { push (@Bad, $key) }
+ }
+
+ if (@Bad) {
+ my ($bad) = join(", ", @Bad) ;
+ return $self->setError("unknown key value(s) @Bad") ;
+ }
+
+ return 1;
+}
+
+sub Compress::Raw::Zlib::Parameters::_checkType
+{
+ my $self = shift ;
+
+ my $key = shift ;
+ my $value = shift ;
+ my $type = shift ;
+ my $validate = shift ;
+ my $output = shift;
+
+ #local $Carp::CarpLevel = $level ;
+ #print "PARSE $type $key $value $validate $sub\n" ;
+ if ( $type & Parse_store_ref)
+ {
+ #$value = $$value
+ # if ref ${ $value } ;
+
+ $$output = $value ;
+ return 1;
+ }
+
+ $value = $$value ;
+
+ if ($type & Parse_any)
+ {
+ $$output = $value ;
+ return 1;
+ }
+ elsif ($type & Parse_unsigned)
+ {
+ return $self->setError("Parameter '$key' must be an unsigned int, got 'undef'")
+ if $validate && ! defined $value ;
+ return $self->setError("Parameter '$key' must be an unsigned int, got '$value'")
+ if $validate && $value !~ /^\d+$/;
+
+ $$output = defined $value ? $value : 0 ;
+ return 1;
+ }
+ elsif ($type & Parse_signed)
+ {
+ return $self->setError("Parameter '$key' must be a signed int, got 'undef'")
+ if $validate && ! defined $value ;
+ return $self->setError("Parameter '$key' must be a signed int, got '$value'")
+ if $validate && $value !~ /^-?\d+$/;
+
+ $$output = defined $value ? $value : 0 ;
+ return 1 ;
+ }
+ elsif ($type & Parse_boolean)
+ {
+ return $self->setError("Parameter '$key' must be an int, got '$value'")
+ if $validate && defined $value && $value !~ /^\d*$/;
+ $$output = defined $value ? $value != 0 : 0 ;
+ return 1;
+ }
+ elsif ($type & Parse_string)
+ {
+ $$output = defined $value ? $value : "" ;
+ return 1;
+ }
+
+ $$output = $value ;
+ return 1;
+}
+
+
+
+sub Compress::Raw::Zlib::Parameters::parsed
+{
+ my $self = shift ;
+ my $name = shift ;
+
+ return $self->{Got}{lc $name}[OFF_PARSED] ;
+}
+
+sub Compress::Raw::Zlib::Parameters::value
+{
+ my $self = shift ;
+ my $name = shift ;
+
+ if (@_)
+ {
+ $self->{Got}{lc $name}[OFF_PARSED] = 1;
+ $self->{Got}{lc $name}[OFF_DEFAULT] = $_[0] ;
+ $self->{Got}{lc $name}[OFF_FIXED] = $_[0] ;
+ }
+
+ return $self->{Got}{lc $name}[OFF_FIXED] ;
+}
+
+sub Compress::Raw::Zlib::Deflate::new
+{
+ my $pkg = shift ;
+ my ($got) = ParseParameters(0,
+ {
+ 'AppendOutput' => [1, 1, Parse_boolean, 0],
+ 'CRC32' => [1, 1, Parse_boolean, 0],
+ 'ADLER32' => [1, 1, Parse_boolean, 0],
+ 'Bufsize' => [1, 1, Parse_unsigned, 4096],
+
+ 'Level' => [1, 1, Parse_signed, Z_DEFAULT_COMPRESSION()],
+ 'Method' => [1, 1, Parse_unsigned, Z_DEFLATED()],
+ 'WindowBits' => [1, 1, Parse_signed, MAX_WBITS()],
+ 'MemLevel' => [1, 1, Parse_unsigned, MAX_MEM_LEVEL()],
+ 'Strategy' => [1, 1, Parse_unsigned, Z_DEFAULT_STRATEGY()],
+ 'Dictionary' => [1, 1, Parse_any, ""],
+ }, @_) ;
+
+
+ croak "Compress::Raw::Zlib::Deflate::new: Bufsize must be >= 1, you specified " .
+ $got->value('Bufsize')
+ unless $got->value('Bufsize') >= 1;
+
+ my $flags = 0 ;
+ $flags |= FLAG_APPEND if $got->value('AppendOutput') ;
+ $flags |= FLAG_CRC if $got->value('CRC32') ;
+ $flags |= FLAG_ADLER if $got->value('ADLER32') ;
+
+ my $windowBits = $got->value('WindowBits');
+ $windowBits += MAX_WBITS()
+ if ($windowBits & MAX_WBITS()) == 0 ;
+
+ _deflateInit($flags,
+ $got->value('Level'),
+ $got->value('Method'),
+ $windowBits,
+ $got->value('MemLevel'),
+ $got->value('Strategy'),
+ $got->value('Bufsize'),
+ $got->value('Dictionary')) ;
+
+}
+
+sub Compress::Raw::Zlib::Inflate::new
+{
+ my $pkg = shift ;
+ my ($got) = ParseParameters(0,
+ {
+ 'AppendOutput' => [1, 1, Parse_boolean, 0],
+ 'LimitOutput' => [1, 1, Parse_boolean, 0],
+ 'CRC32' => [1, 1, Parse_boolean, 0],
+ 'ADLER32' => [1, 1, Parse_boolean, 0],
+ 'ConsumeInput' => [1, 1, Parse_boolean, 1],
+ 'Bufsize' => [1, 1, Parse_unsigned, 4096],
+
+ 'WindowBits' => [1, 1, Parse_signed, MAX_WBITS()],
+ 'Dictionary' => [1, 1, Parse_any, ""],
+ }, @_) ;
+
+
+ croak "Compress::Raw::Zlib::Inflate::new: Bufsize must be >= 1, you specified " .
+ $got->value('Bufsize')
+ unless $got->value('Bufsize') >= 1;
+
+ my $flags = 0 ;
+ $flags |= FLAG_APPEND if $got->value('AppendOutput') ;
+ $flags |= FLAG_CRC if $got->value('CRC32') ;
+ $flags |= FLAG_ADLER if $got->value('ADLER32') ;
+ $flags |= FLAG_CONSUME_INPUT if $got->value('ConsumeInput') ;
+ $flags |= FLAG_LIMIT_OUTPUT if $got->value('LimitOutput') ;
+
+
+ my $windowBits = $got->value('WindowBits');
+ $windowBits += MAX_WBITS()
+ if ($windowBits & MAX_WBITS()) == 0 ;
+
+ _inflateInit($flags, $windowBits, $got->value('Bufsize'),
+ $got->value('Dictionary')) ;
+}
+
+sub Compress::Raw::Zlib::InflateScan::new
+{
+ my $pkg = shift ;
+ my ($got) = ParseParameters(0,
+ {
+ 'CRC32' => [1, 1, Parse_boolean, 0],
+ 'ADLER32' => [1, 1, Parse_boolean, 0],
+ 'Bufsize' => [1, 1, Parse_unsigned, 4096],
+
+ 'WindowBits' => [1, 1, Parse_signed, -MAX_WBITS()],
+ 'Dictionary' => [1, 1, Parse_any, ""],
+ }, @_) ;
+
+
+ croak "Compress::Raw::Zlib::InflateScan::new: Bufsize must be >= 1, you specified " .
+ $got->value('Bufsize')
+ unless $got->value('Bufsize') >= 1;
+
+ my $flags = 0 ;
+ #$flags |= FLAG_APPEND if $got->value('AppendOutput') ;
+ $flags |= FLAG_CRC if $got->value('CRC32') ;
+ $flags |= FLAG_ADLER if $got->value('ADLER32') ;
+ #$flags |= FLAG_CONSUME_INPUT if $got->value('ConsumeInput') ;
+
+ _inflateScanInit($flags, $got->value('WindowBits'), $got->value('Bufsize'),
+ '') ;
+}
+
+sub Compress::Raw::Zlib::inflateScanStream::createDeflateStream
+{
+ my $pkg = shift ;
+ my ($got) = ParseParameters(0,
+ {
+ 'AppendOutput' => [1, 1, Parse_boolean, 0],
+ 'CRC32' => [1, 1, Parse_boolean, 0],
+ 'ADLER32' => [1, 1, Parse_boolean, 0],
+ 'Bufsize' => [1, 1, Parse_unsigned, 4096],
+
+ 'Level' => [1, 1, Parse_signed, Z_DEFAULT_COMPRESSION()],
+ 'Method' => [1, 1, Parse_unsigned, Z_DEFLATED()],
+ 'WindowBits' => [1, 1, Parse_signed, - MAX_WBITS()],
+ 'MemLevel' => [1, 1, Parse_unsigned, MAX_MEM_LEVEL()],
+ 'Strategy' => [1, 1, Parse_unsigned, Z_DEFAULT_STRATEGY()],
+ }, @_) ;
+
+ croak "Compress::Raw::Zlib::InflateScan::createDeflateStream: Bufsize must be >= 1, you specified " .
+ $got->value('Bufsize')
+ unless $got->value('Bufsize') >= 1;
+
+ my $flags = 0 ;
+ $flags |= FLAG_APPEND if $got->value('AppendOutput') ;
+ $flags |= FLAG_CRC if $got->value('CRC32') ;
+ $flags |= FLAG_ADLER if $got->value('ADLER32') ;
+
+ $pkg->_createDeflateStream($flags,
+ $got->value('Level'),
+ $got->value('Method'),
+ $got->value('WindowBits'),
+ $got->value('MemLevel'),
+ $got->value('Strategy'),
+ $got->value('Bufsize'),
+ ) ;
+
+}
+
+sub Compress::Raw::Zlib::inflateScanStream::inflate
+{
+ my $self = shift ;
+ my $buffer = $_[1];
+ my $eof = $_[2];
+
+ my $status = $self->scan(@_);
+
+ if ($status == Z_OK() && $_[2]) {
+ my $byte = ' ';
+
+ $status = $self->scan(\$byte, $_[1]) ;
+ }
+
+ return $status ;
+}
+
+sub Compress::Raw::Zlib::deflateStream::deflateParams
+{
+ my $self = shift ;
+ my ($got) = ParseParameters(0, {
+ 'Level' => [1, 1, Parse_signed, undef],
+ 'Strategy' => [1, 1, Parse_unsigned, undef],
+ 'Bufsize' => [1, 1, Parse_unsigned, undef],
+ },
+ @_) ;
+
+ croak "Compress::Raw::Zlib::deflateParams needs Level and/or Strategy"
+ unless $got->parsed('Level') + $got->parsed('Strategy') +
+ $got->parsed('Bufsize');
+
+ croak "Compress::Raw::Zlib::Inflate::deflateParams: Bufsize must be >= 1, you specified " .
+ $got->value('Bufsize')
+ if $got->parsed('Bufsize') && $got->value('Bufsize') <= 1;
+
+ my $flags = 0;
+ $flags |= 1 if $got->parsed('Level') ;
+ $flags |= 2 if $got->parsed('Strategy') ;
+ $flags |= 4 if $got->parsed('Bufsize') ;
+
+ $self->_deflateParams($flags, $got->value('Level'),
+ $got->value('Strategy'), $got->value('Bufsize'));
+
+}
+
+
+# Autoload methods go after __END__, and are processed by the autosplit program.
+
+1;
+__END__
+
+
+=head1 NAME
+
+Compress::Raw::Zlib - Low-Level Interface to zlib compression library
+
+=head1 SYNOPSIS
+
+ use Compress::Raw::Zlib ;
+
+ ($d, $status) = new Compress::Raw::Zlib::Deflate( [OPT] ) ;
+ $status = $d->deflate($input, $output) ;
+ $status = $d->flush($output [, $flush_type]) ;
+ $d->deflateReset() ;
+ $d->deflateParams(OPTS) ;
+ $d->deflateTune(OPTS) ;
+ $d->dict_adler() ;
+ $d->crc32() ;
+ $d->adler32() ;
+ $d->total_in() ;
+ $d->total_out() ;
+ $d->msg() ;
+ $d->get_Strategy();
+ $d->get_Level();
+ $d->get_BufSize();
+
+ ($i, $status) = new Compress::Raw::Zlib::Inflate( [OPT] ) ;
+ $status = $i->inflate($input, $output [, $eof]) ;
+ $status = $i->inflateSync($input) ;
+ $i->dict_adler() ;
+ $d->crc32() ;
+ $d->adler32() ;
+ $i->total_in() ;
+ $i->total_out() ;
+ $i->msg() ;
+ $d->get_BufSize();
+
+ $crc = adler32($buffer [,$crc]) ;
+ $crc = crc32($buffer [,$crc]) ;
+
+ $crc = adler32_combine($crc1, $crc2, $len2)l
+ $crc = crc32_combine($adler1, $adler2, $len2)
+
+ my $version = Compress::Raw::Zlib::zlib_version();
+
+=head1 DESCRIPTION
+
+The I<Compress::Raw::Zlib> module provides a Perl interface to the I<zlib>
+compression library (see L</AUTHOR> for details about where to get
+I<zlib>).
+
+=head1 Compress::Raw::Zlib::Deflate
+
+This section defines an interface that allows in-memory compression using
+the I<deflate> interface provided by zlib.
+
+Here is a definition of the interface available:
+
+=head2 B<($d, $status) = new Compress::Raw::Zlib::Deflate( [OPT] ) >
+
+Initialises a deflation object.
+
+If you are familiar with the I<zlib> library, it combines the
+features of the I<zlib> functions C<deflateInit>, C<deflateInit2>
+and C<deflateSetDictionary>.
+
+If successful, it will return the initialised deflation object, C<$d>
+and a C<$status> of C<Z_OK> in a list context. In scalar context it
+returns the deflation object, C<$d>, only.
+
+If not successful, the returned deflation object, C<$d>, will be
+I<undef> and C<$status> will hold the a I<zlib> error code.
+
+The function optionally takes a number of named options specified as
+C<< Name => value >> pairs. This allows individual options to be
+tailored without having to specify them all in the parameter list.
+
+For backward compatibility, it is also possible to pass the parameters
+as a reference to a hash containing the name=>value pairs.
+
+Below is a list of the valid options:
+
+=over 5
+
+=item B<-Level>
+
+Defines the compression level. Valid values are 0 through 9,
+C<Z_NO_COMPRESSION>, C<Z_BEST_SPEED>, C<Z_BEST_COMPRESSION>, and
+C<Z_DEFAULT_COMPRESSION>.
+
+The default is C<Z_DEFAULT_COMPRESSION>.
+
+=item B<-Method>
+
+Defines the compression method. The only valid value at present (and
+the default) is Z_DEFLATED.
+
+=item B<-WindowBits>
+
+To compress an RFC 1950 data stream, set C<WindowBits> to a positive
+number between 8 and 15.
+
+To compress an RFC 1951 data stream, set C<WindowBits> to C<-MAX_WBITS>.
+
+To compress an RFC 1952 data stream (i.e. gzip), set C<WindowBits> to
+C<WANT_GZIP>.
+
+For a definition of the meaning and valid values for C<WindowBits>
+refer to the I<zlib> documentation for I<deflateInit2>.
+
+Defaults to C<MAX_WBITS>.
+
+=item B<-MemLevel>
+
+For a definition of the meaning and valid values for C<MemLevel>
+refer to the I<zlib> documentation for I<deflateInit2>.
+
+Defaults to MAX_MEM_LEVEL.
+
+=item B<-Strategy>
+
+Defines the strategy used to tune the compression. The valid values are
+C<Z_DEFAULT_STRATEGY>, C<Z_FILTERED>, C<Z_RLE>, C<Z_FIXED> and
+C<Z_HUFFMAN_ONLY>.
+
+The default is Z_DEFAULT_STRATEGY.
+
+=item B<-Dictionary>
+
+When a dictionary is specified I<Compress::Raw::Zlib> will automatically
+call C<deflateSetDictionary> directly after calling C<deflateInit>. The
+Adler32 value for the dictionary can be obtained by calling the method
+C<$d-E<gt>dict_adler()>.
+
+The default is no dictionary.
+
+=item B<-Bufsize>
+
+Sets the initial size for the output buffer used by the C<$d-E<gt>deflate>
+and C<$d-E<gt>flush> methods. If the buffer has to be
+reallocated to increase the size, it will grow in increments of
+C<Bufsize>.
+
+The default buffer size is 4096.
+
+=item B<-AppendOutput>
+
+This option controls how data is written to the output buffer by the
+C<$d-E<gt>deflate> and C<$d-E<gt>flush> methods.
+
+If the C<AppendOutput> option is set to false, the output buffers in the
+C<$d-E<gt>deflate> and C<$d-E<gt>flush> methods will be truncated before
+uncompressed data is written to them.
+
+If the option is set to true, uncompressed data will be appended to the
+output buffer in the C<$d-E<gt>deflate> and C<$d-E<gt>flush> methods.
+
+This option defaults to false.
+
+=item B<-CRC32>
+
+If set to true, a crc32 checksum of the uncompressed data will be
+calculated. Use the C<$d-E<gt>crc32> method to retrieve this value.
+
+This option defaults to false.
+
+=item B<-ADLER32>
+
+If set to true, an adler32 checksum of the uncompressed data will be
+calculated. Use the C<$d-E<gt>adler32> method to retrieve this value.
+
+This option defaults to false.
+
+=back
+
+Here is an example of using the C<Compress::Raw::Zlib::Deflate> optional
+parameter list to override the default buffer size and compression
+level. All other options will take their default values.
+
+ my $d = new Compress::Raw::Zlib::Deflate ( -Bufsize => 300,
+ -Level => Z_BEST_SPEED ) ;
+
+=head2 B<$status = $d-E<gt>deflate($input, $output)>
+
+Deflates the contents of C<$input> and writes the compressed data to
+C<$output>.
+
+The C<$input> and C<$output> parameters can be either scalars or scalar
+references.
+
+When finished, C<$input> will be completely processed (assuming there
+were no errors). If the deflation was successful it writes the deflated
+data to C<$output> and returns a status value of C<Z_OK>.
+
+On error, it returns a I<zlib> error code.
+
+If the C<AppendOutput> option is set to true in the constructor for
+the C<$d> object, the compressed data will be appended to C<$output>. If
+it is false, C<$output> will be truncated before any compressed data is
+written to it.
+
+B<Note>: This method will not necessarily write compressed data to
+C<$output> every time it is called. So do not assume that there has been
+an error if the contents of C<$output> is empty on returning from
+this method. As long as the return code from the method is C<Z_OK>,
+the deflate has succeeded.
+
+=head2 B<$status = $d-E<gt>flush($output [, $flush_type]) >
+
+Typically used to finish the deflation. Any pending output will be
+written to C<$output>.
+
+Returns C<Z_OK> if successful.
+
+Note that flushing can seriously degrade the compression ratio, so it
+should only be used to terminate a decompression (using C<Z_FINISH>) or
+when you want to create a I<full flush point> (using C<Z_FULL_FLUSH>).
+
+By default the C<flush_type> used is C<Z_FINISH>. Other valid values
+for C<flush_type> are C<Z_NO_FLUSH>, C<Z_PARTIAL_FLUSH>, C<Z_SYNC_FLUSH>
+and C<Z_FULL_FLUSH>. It is strongly recommended that you only set the
+C<flush_type> parameter if you fully understand the implications of
+what it does. See the C<zlib> documentation for details.
+
+If the C<AppendOutput> option is set to true in the constructor for
+the C<$d> object, the compressed data will be appended to C<$output>. If
+it is false, C<$output> will be truncated before any compressed data is
+written to it.
+
+=head2 B<$status = $d-E<gt>deflateReset() >
+
+This method will reset the deflation object C<$d>. It can be used when you
+are compressing multiple data streams and want to use the same object to
+compress each of them. It should only be used once the previous data stream
+has been flushed successfully, i.e. a call to C<< $d->flush(Z_FINISH) >> has
+returned C<Z_OK>.
+
+Returns C<Z_OK> if successful.
+
+=head2 B<$status = $d-E<gt>deflateParams([OPT])>
+
+Change settings for the deflate object C<$d>.
+
+The list of the valid options is shown below. Options not specified
+will remain unchanged.
+
+=over 5
+
+=item B<-Level>
+
+Defines the compression level. Valid values are 0 through 9,
+C<Z_NO_COMPRESSION>, C<Z_BEST_SPEED>, C<Z_BEST_COMPRESSION>, and
+C<Z_DEFAULT_COMPRESSION>.
+
+=item B<-Strategy>
+
+Defines the strategy used to tune the compression. The valid values are
+C<Z_DEFAULT_STRATEGY>, C<Z_FILTERED> and C<Z_HUFFMAN_ONLY>.
+
+=item B<-BufSize>
+
+Sets the initial size for the output buffer used by the C<$d-E<gt>deflate>
+and C<$d-E<gt>flush> methods. If the buffer has to be
+reallocated to increase the size, it will grow in increments of
+C<Bufsize>.
+
+=back
+
+=head2 B<$status = $d-E<gt>deflateTune($good_length, $max_lazy, $nice_length, $max_chain)>
+
+Tune the internal settings for the deflate object C<$d>. This option is
+only available if you are running zlib 1.2.2.3 or better.
+
+Refer to the documentation in zlib.h for instructions on how to fly
+C<deflateTune>.
+
+=head2 B<$d-E<gt>dict_adler()>
+
+Returns the adler32 value for the dictionary.
+
+=head2 B<$d-E<gt>crc32()>
+
+Returns the crc32 value for the uncompressed data to date.
+
+If the C<CRC32> option is not enabled in the constructor for this object,
+this method will always return 0;
+
+=head2 B<$d-E<gt>adler32()>
+
+Returns the adler32 value for the uncompressed data to date.
+
+=head2 B<$d-E<gt>msg()>
+
+Returns the last error message generated by zlib.
+
+=head2 B<$d-E<gt>total_in()>
+
+Returns the total number of bytes uncompressed bytes input to deflate.
+
+=head2 B<$d-E<gt>total_out()>
+
+Returns the total number of compressed bytes output from deflate.
+
+=head2 B<$d-E<gt>get_Strategy()>
+
+Returns the deflation strategy currently used. Valid values are
+C<Z_DEFAULT_STRATEGY>, C<Z_FILTERED> and C<Z_HUFFMAN_ONLY>.
+
+=head2 B<$d-E<gt>get_Level()>
+
+Returns the compression level being used.
+
+=head2 B<$d-E<gt>get_BufSize()>
+
+Returns the buffer size used to carry out the compression.
+
+=head2 Example
+
+Here is a trivial example of using C<deflate>. It simply reads standard
+input, deflates it and writes it to standard output.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Raw::Zlib ;
+
+ binmode STDIN;
+ binmode STDOUT;
+ my $x = new Compress::Raw::Zlib::Deflate
+ or die "Cannot create a deflation stream\n" ;
+
+ my ($output, $status) ;
+ while (<>)
+ {
+ $status = $x->deflate($_, $output) ;
+
+ $status == Z_OK
+ or die "deflation failed\n" ;
+
+ print $output ;
+ }
+
+ $status = $x->flush($output) ;
+
+ $status == Z_OK
+ or die "deflation failed\n" ;
+
+ print $output ;
+
+=head1 Compress::Raw::Zlib::Inflate
+
+This section defines an interface that allows in-memory uncompression using
+the I<inflate> interface provided by zlib.
+
+Here is a definition of the interface:
+
+=head2 B< ($i, $status) = new Compress::Raw::Zlib::Inflate( [OPT] ) >
+
+Initialises an inflation object.
+
+In a list context it returns the inflation object, C<$i>, and the
+I<zlib> status code (C<$status>). In a scalar context it returns the
+inflation object only.
+
+If successful, C<$i> will hold the inflation object and C<$status> will
+be C<Z_OK>.
+
+If not successful, C<$i> will be I<undef> and C<$status> will hold the
+I<zlib> error code.
+
+The function optionally takes a number of named options specified as
+C<< -Name => value >> pairs. This allows individual options to be
+tailored without having to specify them all in the parameter list.
+
+For backward compatibility, it is also possible to pass the parameters
+as a reference to a hash containing the C<< name=>value >> pairs.
+
+Here is a list of the valid options:
+
+=over 5
+
+=item B<-WindowBits>
+
+To uncompress an RFC 1950 data stream, set C<WindowBits> to a positive
+number between 8 and 15.
+
+To uncompress an RFC 1951 data stream, set C<WindowBits> to C<-MAX_WBITS>.
+
+To uncompress an RFC 1952 data stream (i.e. gzip), set C<WindowBits> to
+C<WANT_GZIP>.
+
+To auto-detect and uncompress an RFC 1950 or RFC 1952 data stream (i.e.
+gzip), set C<WindowBits> to C<WANT_GZIP_OR_ZLIB>.
+
+For a full definition of the meaning and valid values for C<WindowBits>
+refer to the I<zlib> documentation for I<inflateInit2>.
+
+Defaults to C<MAX_WBITS>.
+
+=item B<-Bufsize>
+
+Sets the initial size for the output buffer used by the C<$i-E<gt>inflate>
+method. If the output buffer in this method has to be reallocated to
+increase the size, it will grow in increments of C<Bufsize>.
+
+Default is 4096.
+
+=item B<-Dictionary>
+
+The default is no dictionary.
+
+=item B<-AppendOutput>
+
+This option controls how data is written to the output buffer by the
+C<$i-E<gt>inflate> method.
+
+If the option is set to false, the output buffer in the C<$i-E<gt>inflate>
+method will be truncated before uncompressed data is written to it.
+
+If the option is set to true, uncompressed data will be appended to the
+output buffer by the C<$i-E<gt>inflate> method.
+
+This option defaults to false.
+
+=item B<-CRC32>
+
+If set to true, a crc32 checksum of the uncompressed data will be
+calculated. Use the C<$i-E<gt>crc32> method to retrieve this value.
+
+This option defaults to false.
+
+=item B<-ADLER32>
+
+If set to true, an adler32 checksum of the uncompressed data will be
+calculated. Use the C<$i-E<gt>adler32> method to retrieve this value.
+
+This option defaults to false.
+
+=item B<-ConsumeInput>
+
+If set to true, this option will remove compressed data from the input
+buffer of the C<< $i->inflate >> method as the inflate progresses.
+
+This option can be useful when you are processing compressed data that is
+embedded in another file/buffer. In this case the data that immediately
+follows the compressed stream will be left in the input buffer.
+
+This option defaults to true.
+
+=item B<-LimitOutput>
+
+The C<LimitOutput> option changes the behavior of the C<< $i->inflate >>
+method so that the amount of memory used by the output buffer can be
+limited.
+
+When C<LimitOutput> is used the size of the output buffer used will either
+be the value of the C<Bufsize> option or the amount of memory already
+allocated to C<$output>, whichever is larger. Predicting the output size
+available is tricky, so don't rely on getting an exact output buffer size.
+
+When C<LimitOutout> is not specified C<< $i->inflate >> will use as much
+memory as it takes to write all the uncompressed data it creates by
+uncompressing the input buffer.
+
+If C<LimitOutput> is enabled, the C<ConsumeInput> option will also be
+enabled.
+
+This option defaults to false.
+
+See L</The LimitOutput option> for a discussion on why C<LimitOutput> is
+needed and how to use it.
+
+=back
+
+Here is an example of using an optional parameter to override the default
+buffer size.
+
+ my ($i, $status) = new Compress::Raw::Zlib::Inflate( -Bufsize => 300 ) ;
+
+=head2 B< $status = $i-E<gt>inflate($input, $output [,$eof]) >
+
+Inflates the complete contents of C<$input> and writes the uncompressed
+data to C<$output>. The C<$input> and C<$output> parameters can either be
+scalars or scalar references.
+
+Returns C<Z_OK> if successful and C<Z_STREAM_END> if the end of the
+compressed data has been successfully reached.
+
+If not successful C<$status> will hold the I<zlib> error code.
+
+If the C<ConsumeInput> option has been set to true when the
+C<Compress::Raw::Zlib::Inflate> object is created, the C<$input> parameter
+is modified by C<inflate>. On completion it will contain what remains
+of the input buffer after inflation. In practice, this means that when
+the return status is C<Z_OK> the C<$input> parameter will contain an
+empty string, and when the return status is C<Z_STREAM_END> the C<$input>
+parameter will contains what (if anything) was stored in the input buffer
+after the deflated data stream.
+
+This feature is useful when processing a file format that encapsulates
+a compressed data stream (e.g. gzip, zip) and there is useful data
+immediately after the deflation stream.
+
+If the C<AppendOutput> option is set to true in the constructor for
+this object, the uncompressed data will be appended to C<$output>. If
+it is false, C<$output> will be truncated before any uncompressed data
+is written to it.
+
+The C<$eof> parameter needs a bit of explanation.
+
+Prior to version 1.2.0, zlib assumed that there was at least one trailing
+byte immediately after the compressed data stream when it was carrying out
+decompression. This normally isn't a problem because the majority of zlib
+applications guarantee that there will be data directly after the
+compressed data stream. For example, both gzip (RFC 1950) and zip both
+define trailing data that follows the compressed data stream.
+
+The C<$eof> parameter only needs to be used if B<all> of the following
+conditions apply
+
+=over 5
+
+=item 1
+
+You are either using a copy of zlib that is older than version 1.2.0 or you
+want your application code to be able to run with as many different
+versions of zlib as possible.
+
+=item 2
+
+You have set the C<WindowBits> parameter to C<-MAX_WBITS> in the constructor
+for this object, i.e. you are uncompressing a raw deflated data stream
+(RFC 1951).
+
+=item 3
+
+There is no data immediately after the compressed data stream.
+
+=back
+
+If B<all> of these are the case, then you need to set the C<$eof> parameter
+to true on the final call (and only the final call) to C<$i-E<gt>inflate>.
+
+If you have built this module with zlib >= 1.2.0, the C<$eof> parameter is
+ignored. You can still set it if you want, but it won't be used behind the
+scenes.
+
+=head2 B<$status = $i-E<gt>inflateSync($input)>
+
+This method can be used to attempt to recover good data from a compressed
+data stream that is partially corrupt.
+It scans C<$input> until it reaches either a I<full flush point> or the
+end of the buffer.
+
+If a I<full flush point> is found, C<Z_OK> is returned and C<$input>
+will be have all data up to the flush point removed. This data can then be
+passed to the C<$i-E<gt>inflate> method to be uncompressed.
+
+Any other return code means that a flush point was not found. If more
+data is available, C<inflateSync> can be called repeatedly with more
+compressed data until the flush point is found.
+
+Note I<full flush points> are not present by default in compressed
+data streams. They must have been added explicitly when the data stream
+was created by calling C<Compress::Deflate::flush> with C<Z_FULL_FLUSH>.
+
+=head2 B<$i-E<gt>dict_adler()>
+
+Returns the adler32 value for the dictionary.
+
+=head2 B<$i-E<gt>crc32()>
+
+Returns the crc32 value for the uncompressed data to date.
+
+If the C<CRC32> option is not enabled in the constructor for this object,
+this method will always return 0;
+
+=head2 B<$i-E<gt>adler32()>
+
+Returns the adler32 value for the uncompressed data to date.
+
+If the C<ADLER32> option is not enabled in the constructor for this object,
+this method will always return 0;
+
+=head2 B<$i-E<gt>msg()>
+
+Returns the last error message generated by zlib.
+
+=head2 B<$i-E<gt>total_in()>
+
+Returns the total number of bytes compressed bytes input to inflate.
+
+=head2 B<$i-E<gt>total_out()>
+
+Returns the total number of uncompressed bytes output from inflate.
+
+=head2 B<$d-E<gt>get_BufSize()>
+
+Returns the buffer size used to carry out the decompression.
+
+=head2 Examples
+
+Here is an example of using C<inflate>.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Raw::Zlib;
+
+ my $x = new Compress::Raw::Zlib::Inflate()
+ or die "Cannot create a inflation stream\n" ;
+
+ my $input = '' ;
+ binmode STDIN;
+ binmode STDOUT;
+
+ my ($output, $status) ;
+ while (read(STDIN, $input, 4096))
+ {
+ $status = $x->inflate($input, $output) ;
+
+ print $output ;
+
+ last if $status != Z_OK ;
+ }
+
+ die "inflation failed\n"
+ unless $status == Z_STREAM_END ;
+
+The next example show how to use the C<LimitOutput> option. Notice the use
+of two nested loops in this case. The outer loop reads the data from the
+input source - STDIN and the inner loop repeatedly calls C<inflate> until
+C<$input> is exhausted, we get an error, or the end of the stream is
+reached. One point worth remembering is by using the C<LimitOutput> option
+you also get C<ConsumeInput> set as well - this makes the code below much
+simpler.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Raw::Zlib;
+
+ my $x = new Compress::Raw::Zlib::Inflate(LimitOutput => 1)
+ or die "Cannot create a inflation stream\n" ;
+
+ my $input = '' ;
+ binmode STDIN;
+ binmode STDOUT;
+
+ my ($output, $status) ;
+
+ OUTER:
+ while (read(STDIN, $input, 4096))
+ {
+ do
+ {
+ $status = $x->inflate($input, $output) ;
+
+ print $output ;
+
+ last OUTER
+ unless $status == Z_OK || $status == Z_BUF_ERROR ;
+ }
+ while ($status == Z_OK && length $input);
+ }
+
+ die "inflation failed\n"
+ unless $status == Z_STREAM_END ;
+
+=head1 CHECKSUM FUNCTIONS
+
+Two functions are provided by I<zlib> to calculate checksums. For the
+Perl interface, the order of the two parameters in both functions has
+been reversed. This allows both running checksums and one off
+calculations to be done.
+
+ $crc = adler32($buffer [,$crc]) ;
+ $crc = crc32($buffer [,$crc]) ;
+
+The buffer parameters can either be a scalar or a scalar reference.
+
+If the $crc parameters is C<undef>, the crc value will be reset.
+
+If you have built this module with zlib 1.2.3 or better, two more
+CRC-related functions are available.
+
+ $crc = adler32_combine($crc1, $crc2, $len2)l
+ $crc = crc32_combine($adler1, $adler2, $len2)
+
+These functions allow checksums to be merged.
+
+=head1 Misc
+
+=head2 my $version = Compress::Raw::Zlib::zlib_version();
+
+Returns the version of the zlib library.
+
+=head1 The LimitOutput option.
+
+By default C<< $i->inflate($input, $output) >> will uncompress I<all> data
+in C<$input> and write I<all> of the uncompressed data it has generated to
+C<$output>. This makes the interface to C<inflate> much simpler - if the
+method has uncompressed C<$input> successfully I<all> compressed data in
+C<$input> will have been dealt with. So if you are reading from an input
+source and uncompressing as you go the code will look something like this
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Raw::Zlib;
+
+ my $x = new Compress::Raw::Zlib::Inflate()
+ or die "Cannot create a inflation stream\n" ;
+
+ my $input = '' ;
+
+ my ($output, $status) ;
+ while (read(STDIN, $input, 4096))
+ {
+ $status = $x->inflate($input, $output) ;
+
+ print $output ;
+
+ last if $status != Z_OK ;
+ }
+
+ die "inflation failed\n"
+ unless $status == Z_STREAM_END ;
+
+The points to note are
+
+=over 5
+
+=item *
+
+The main processing loop in the code handles reading of compressed data
+from STDIN.
+
+=item *
+
+The status code returned from C<inflate> will only trigger termination of
+the main processing loop if it isn't C<Z_OK>. When C<LimitOutput> has not
+been used the C<Z_OK> status means means that the end of the compressed
+data stream has been reached or there has been an error in uncompression.
+
+=item *
+
+After the call to C<inflate> I<all> of the uncompressed data in C<$input>
+will have been processed. This means the subsequent call to C<read> can
+overwrite it's contents without any problem.
+
+=back
+
+For most use-cases the behavior described above is acceptable (this module
+and it's predecessor, C<Compress::Zlib>, have used it for over 10 years
+without an issue), but in a few very specific use-cases the amount of
+memory required for C<$output> can prohibitively large. For example, if the
+compressed data stream contains the same pattern repeated thousands of
+times, a relatively small compressed data stream can uncompress into
+hundreds of megabytes. Remember C<inflate> will keep allocating memory
+until I<all> the uncompressed data has been written to the output buffer -
+the size of C<$output> is unbounded.
+
+The C<LimitOutput> option is designed to help with this use-case.
+
+The main difference in your code when using C<LimitOutput> is having to
+deal with cases where the C<$input> parameter still contains some
+uncompressed data that C<inflate> hasn't processed yet. The status code
+returned from C<inflate> will be C<Z_OK> if uncompression took place and
+C<Z_BUF_ERROR> if the output buffer is full.
+
+Below is typical code that shows how to use C<LimitOutput>.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Raw::Zlib;
+
+ my $x = new Compress::Raw::Zlib::Inflate(LimitOutput => 1)
+ or die "Cannot create a inflation stream\n" ;
+
+ my $input = '' ;
+ binmode STDIN;
+ binmode STDOUT;
+
+ my ($output, $status) ;
+
+ OUTER:
+ while (read(STDIN, $input, 4096))
+ {
+ do
+ {
+ $status = $x->inflate($input, $output) ;
+
+ print $output ;
+
+ last OUTER
+ unless $status == Z_OK || $status == Z_BUF_ERROR ;
+ }
+ while ($status == Z_OK && length $input);
+ }
+
+ die "inflation failed\n"
+ unless $status == Z_STREAM_END ;
+
+Points to note this time:
+
+=over 5
+
+=item *
+
+There are now two nested loops in the code: the outer loop for reading the
+compressed data from STDIN, as before; and the inner loop to carry out the
+uncompression.
+
+=item *
+
+There are two exit points from the inner uncompression loop.
+
+Firstly when C<inflate> has returned a status other than C<Z_OK> or
+C<Z_BUF_ERROR>. This means that either the end of the compressed data
+stream has been reached (C<Z_STREAM_END>) or there is an error in the
+compressed data. In either of these cases there is no point in continuing
+with reading the compressed data, so both loops are terminated.
+
+The second exit point tests if there is any data left in the input buffer,
+C<$input> - remember that the C<ConsumeInput> option is automatically
+enabled when C<LimitOutput> is used. When the input buffer has been
+exhausted, the outer loop can run again and overwrite a now empty
+C<$input>.
+
+=back
+
+=head1 ACCESSING ZIP FILES
+
+Although it is possible (with some effort on your part) to use this module
+to access .zip files, there are other perl modules available that will
+do all the hard work for you. Check out C<Archive::Zip>,
+C<IO::Compress::Zip> and C<IO::Uncompress::Unzip>.
+
+=head1 CONSTANTS
+
+All the I<zlib> constants are automatically imported when you make use
+of I<Compress::Raw::Zlib>.
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+For RFC 1950, 1951 and 1952 see
+F<http://www.faqs.org/rfcs/rfc1950.html>,
+F<http://www.faqs.org/rfcs/rfc1951.html> and
+F<http://www.faqs.org/rfcs/rfc1952.html>
+
+The I<zlib> compression library was written by Jean-loup Gailly
+F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
+
+The primary site for the I<zlib> compression library is
+F<http://www.zlib.org>.
+
+The primary site for gzip is F<http://www.gzip.org>.
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Compress/Zlib.pm b/Master/tlpkg/tlperl.straw/lib/Compress/Zlib.pm
new file mode 100755
index 00000000000..9424df63b8b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Compress/Zlib.pm
@@ -0,0 +1,1494 @@
+
+package Compress::Zlib;
+
+require 5.004 ;
+require Exporter;
+use AutoLoader;
+use Carp ;
+use IO::Handle ;
+use Scalar::Util qw(dualvar);
+
+use IO::Compress::Base::Common 2.024 ;
+use Compress::Raw::Zlib 2.024 ;
+use IO::Compress::Gzip 2.024 ;
+use IO::Uncompress::Gunzip 2.024 ;
+
+use strict ;
+use warnings ;
+use bytes ;
+our ($VERSION, $XS_VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $AUTOLOAD);
+
+$VERSION = '2.024';
+$XS_VERSION = $VERSION;
+$VERSION = eval $VERSION;
+
+@ISA = qw(Exporter);
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+@EXPORT = qw(
+ deflateInit inflateInit
+
+ compress uncompress
+
+ gzopen $gzerrno
+ );
+
+push @EXPORT, @Compress::Raw::Zlib::EXPORT ;
+
+@EXPORT_OK = qw(memGunzip memGzip zlib_version);
+%EXPORT_TAGS = (
+ ALL => \@EXPORT
+);
+
+BEGIN
+{
+ *zlib_version = \&Compress::Raw::Zlib::zlib_version;
+}
+
+sub AUTOLOAD {
+ my($constname);
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ my ($error, $val) = Compress::Raw::Zlib::constant($constname);
+ Carp::croak $error if $error;
+ no strict 'refs';
+ *{$AUTOLOAD} = sub { $val };
+ goto &{$AUTOLOAD};
+}
+
+use constant FLAG_APPEND => 1 ;
+use constant FLAG_CRC => 2 ;
+use constant FLAG_ADLER => 4 ;
+use constant FLAG_CONSUME_INPUT => 8 ;
+
+our (@my_z_errmsg);
+
+@my_z_errmsg = (
+ "need dictionary", # Z_NEED_DICT 2
+ "stream end", # Z_STREAM_END 1
+ "", # Z_OK 0
+ "file error", # Z_ERRNO (-1)
+ "stream error", # Z_STREAM_ERROR (-2)
+ "data error", # Z_DATA_ERROR (-3)
+ "insufficient memory", # Z_MEM_ERROR (-4)
+ "buffer error", # Z_BUF_ERROR (-5)
+ "incompatible version",# Z_VERSION_ERROR(-6)
+ );
+
+
+sub _set_gzerr
+{
+ my $value = shift ;
+
+ if ($value == 0) {
+ $Compress::Zlib::gzerrno = 0 ;
+ }
+ elsif ($value == Z_ERRNO() || $value > 2) {
+ $Compress::Zlib::gzerrno = $! ;
+ }
+ else {
+ $Compress::Zlib::gzerrno = dualvar($value+0, $my_z_errmsg[2 - $value]);
+ }
+
+ return $value ;
+}
+
+sub _set_gzerr_undef
+{
+ _set_gzerr(@_);
+ return undef;
+}
+sub _save_gzerr
+{
+ my $gz = shift ;
+ my $test_eof = shift ;
+
+ my $value = $gz->errorNo() || 0 ;
+
+ if ($test_eof) {
+ #my $gz = $self->[0] ;
+ # gzread uses Z_STREAM_END to denote a successful end
+ $value = Z_STREAM_END() if $gz->eof() && $value == 0 ;
+ }
+
+ _set_gzerr($value) ;
+}
+
+sub gzopen($$)
+{
+ my ($file, $mode) = @_ ;
+
+ my $gz ;
+ my %defOpts = (Level => Z_DEFAULT_COMPRESSION(),
+ Strategy => Z_DEFAULT_STRATEGY(),
+ );
+
+ my $writing ;
+ $writing = ! ($mode =~ /r/i) ;
+ $writing = ($mode =~ /[wa]/i) ;
+
+ $defOpts{Level} = $1 if $mode =~ /(\d)/;
+ $defOpts{Strategy} = Z_FILTERED() if $mode =~ /f/i;
+ $defOpts{Strategy} = Z_HUFFMAN_ONLY() if $mode =~ /h/i;
+ $defOpts{Append} = 1 if $mode =~ /a/i;
+
+ my $infDef = $writing ? 'deflate' : 'inflate';
+ my @params = () ;
+
+ croak "gzopen: file parameter is not a filehandle or filename"
+ unless isaFilehandle $file || isaFilename $file ||
+ (ref $file && ref $file eq 'SCALAR');
+
+ return undef unless $mode =~ /[rwa]/i ;
+
+ _set_gzerr(0) ;
+
+ if ($writing) {
+ $gz = new IO::Compress::Gzip($file, Minimal => 1, AutoClose => 1,
+ %defOpts)
+ or $Compress::Zlib::gzerrno = $IO::Compress::Gzip::GzipError;
+ }
+ else {
+ $gz = new IO::Uncompress::Gunzip($file,
+ Transparent => 1,
+ Append => 0,
+ AutoClose => 1,
+ MultiStream => 1,
+ Strict => 0)
+ or $Compress::Zlib::gzerrno = $IO::Uncompress::Gunzip::GunzipError;
+ }
+
+ return undef
+ if ! defined $gz ;
+
+ bless [$gz, $infDef], 'Compress::Zlib::gzFile';
+}
+
+sub Compress::Zlib::gzFile::gzread
+{
+ my $self = shift ;
+
+ return _set_gzerr(Z_STREAM_ERROR())
+ if $self->[1] ne 'inflate';
+
+ my $len = defined $_[1] ? $_[1] : 4096 ;
+
+ if ($self->gzeof() || $len == 0) {
+ # Zap the output buffer to match ver 1 behaviour.
+ $_[0] = "" ;
+ return 0 ;
+ }
+
+ my $gz = $self->[0] ;
+ my $status = $gz->read($_[0], $len) ;
+ _save_gzerr($gz, 1);
+ return $status ;
+}
+
+sub Compress::Zlib::gzFile::gzreadline
+{
+ my $self = shift ;
+
+ my $gz = $self->[0] ;
+ {
+ # Maintain backward compatibility with 1.x behaviour
+ # It didn't support $/, so this can't either.
+ local $/ = "\n" ;
+ $_[0] = $gz->getline() ;
+ }
+ _save_gzerr($gz, 1);
+ return defined $_[0] ? length $_[0] : 0 ;
+}
+
+sub Compress::Zlib::gzFile::gzwrite
+{
+ my $self = shift ;
+ my $gz = $self->[0] ;
+
+ return _set_gzerr(Z_STREAM_ERROR())
+ if $self->[1] ne 'deflate';
+
+ $] >= 5.008 and (utf8::downgrade($_[0], 1)
+ or croak "Wide character in gzwrite");
+
+ my $status = $gz->write($_[0]) ;
+ _save_gzerr($gz);
+ return $status ;
+}
+
+sub Compress::Zlib::gzFile::gztell
+{
+ my $self = shift ;
+ my $gz = $self->[0] ;
+ my $status = $gz->tell() ;
+ _save_gzerr($gz);
+ return $status ;
+}
+
+sub Compress::Zlib::gzFile::gzseek
+{
+ my $self = shift ;
+ my $offset = shift ;
+ my $whence = shift ;
+
+ my $gz = $self->[0] ;
+ my $status ;
+ eval { $status = $gz->seek($offset, $whence) ; };
+ if ($@)
+ {
+ my $error = $@;
+ $error =~ s/^.*: /gzseek: /;
+ $error =~ s/ at .* line \d+\s*$//;
+ croak $error;
+ }
+ _save_gzerr($gz);
+ return $status ;
+}
+
+sub Compress::Zlib::gzFile::gzflush
+{
+ my $self = shift ;
+ my $f = shift ;
+
+ my $gz = $self->[0] ;
+ my $status = $gz->flush($f) ;
+ my $err = _save_gzerr($gz);
+ return $status ? 0 : $err;
+}
+
+sub Compress::Zlib::gzFile::gzclose
+{
+ my $self = shift ;
+ my $gz = $self->[0] ;
+
+ my $status = $gz->close() ;
+ my $err = _save_gzerr($gz);
+ return $status ? 0 : $err;
+}
+
+sub Compress::Zlib::gzFile::gzeof
+{
+ my $self = shift ;
+ my $gz = $self->[0] ;
+
+ return 0
+ if $self->[1] ne 'inflate';
+
+ my $status = $gz->eof() ;
+ _save_gzerr($gz);
+ return $status ;
+}
+
+sub Compress::Zlib::gzFile::gzsetparams
+{
+ my $self = shift ;
+ croak "Usage: Compress::Zlib::gzFile::gzsetparams(file, level, strategy)"
+ unless @_ eq 2 ;
+
+ my $gz = $self->[0] ;
+ my $level = shift ;
+ my $strategy = shift;
+
+ return _set_gzerr(Z_STREAM_ERROR())
+ if $self->[1] ne 'deflate';
+
+ my $status = *$gz->{Compress}->deflateParams(-Level => $level,
+ -Strategy => $strategy);
+ _save_gzerr($gz);
+ return $status ;
+}
+
+sub Compress::Zlib::gzFile::gzerror
+{
+ my $self = shift ;
+ my $gz = $self->[0] ;
+
+ return $Compress::Zlib::gzerrno ;
+}
+
+
+sub compress($;$)
+{
+ my ($x, $output, $err, $in) =('', '', '', '') ;
+
+ if (ref $_[0] ) {
+ $in = $_[0] ;
+ croak "not a scalar reference" unless ref $in eq 'SCALAR' ;
+ }
+ else {
+ $in = \$_[0] ;
+ }
+
+ $] >= 5.008 and (utf8::downgrade($$in, 1)
+ or croak "Wide character in compress");
+
+ my $level = (@_ == 2 ? $_[1] : Z_DEFAULT_COMPRESSION() );
+
+ $x = new Compress::Raw::Zlib::Deflate -AppendOutput => 1, -Level => $level
+ or return undef ;
+
+ $err = $x->deflate($in, $output) ;
+ return undef unless $err == Z_OK() ;
+
+ $err = $x->flush($output) ;
+ return undef unless $err == Z_OK() ;
+
+ return $output ;
+
+}
+
+sub uncompress($)
+{
+ my ($x, $output, $err, $in) =('', '', '', '') ;
+
+ if (ref $_[0] ) {
+ $in = $_[0] ;
+ croak "not a scalar reference" unless ref $in eq 'SCALAR' ;
+ }
+ else {
+ $in = \$_[0] ;
+ }
+
+ $] >= 5.008 and (utf8::downgrade($$in, 1)
+ or croak "Wide character in uncompress");
+
+ $x = new Compress::Raw::Zlib::Inflate -ConsumeInput => 0 or return undef ;
+
+ $err = $x->inflate($in, $output) ;
+ return undef unless $err == Z_STREAM_END() ;
+
+ return $output ;
+}
+
+
+
+sub deflateInit(@)
+{
+ my ($got) = ParseParameters(0,
+ {
+ 'Bufsize' => [1, 1, Parse_unsigned, 4096],
+ 'Level' => [1, 1, Parse_signed, Z_DEFAULT_COMPRESSION()],
+ 'Method' => [1, 1, Parse_unsigned, Z_DEFLATED()],
+ 'WindowBits' => [1, 1, Parse_signed, MAX_WBITS()],
+ 'MemLevel' => [1, 1, Parse_unsigned, MAX_MEM_LEVEL()],
+ 'Strategy' => [1, 1, Parse_unsigned, Z_DEFAULT_STRATEGY()],
+ 'Dictionary' => [1, 1, Parse_any, ""],
+ }, @_ ) ;
+
+ croak "Compress::Zlib::deflateInit: Bufsize must be >= 1, you specified " .
+ $got->value('Bufsize')
+ unless $got->value('Bufsize') >= 1;
+
+ my $obj ;
+
+ my $status = 0 ;
+ ($obj, $status) =
+ Compress::Raw::Zlib::_deflateInit(0,
+ $got->value('Level'),
+ $got->value('Method'),
+ $got->value('WindowBits'),
+ $got->value('MemLevel'),
+ $got->value('Strategy'),
+ $got->value('Bufsize'),
+ $got->value('Dictionary')) ;
+
+ my $x = ($status == Z_OK() ? bless $obj, "Zlib::OldDeflate" : undef) ;
+ return wantarray ? ($x, $status) : $x ;
+}
+
+sub inflateInit(@)
+{
+ my ($got) = ParseParameters(0,
+ {
+ 'Bufsize' => [1, 1, Parse_unsigned, 4096],
+ 'WindowBits' => [1, 1, Parse_signed, MAX_WBITS()],
+ 'Dictionary' => [1, 1, Parse_any, ""],
+ }, @_) ;
+
+
+ croak "Compress::Zlib::inflateInit: Bufsize must be >= 1, you specified " .
+ $got->value('Bufsize')
+ unless $got->value('Bufsize') >= 1;
+
+ my $status = 0 ;
+ my $obj ;
+ ($obj, $status) = Compress::Raw::Zlib::_inflateInit(FLAG_CONSUME_INPUT,
+ $got->value('WindowBits'),
+ $got->value('Bufsize'),
+ $got->value('Dictionary')) ;
+
+ my $x = ($status == Z_OK() ? bless $obj, "Zlib::OldInflate" : undef) ;
+
+ wantarray ? ($x, $status) : $x ;
+}
+
+package Zlib::OldDeflate ;
+
+our (@ISA);
+@ISA = qw(Compress::Raw::Zlib::deflateStream);
+
+
+sub deflate
+{
+ my $self = shift ;
+ my $output ;
+
+ my $status = $self->SUPER::deflate($_[0], $output) ;
+ wantarray ? ($output, $status) : $output ;
+}
+
+sub flush
+{
+ my $self = shift ;
+ my $output ;
+ my $flag = shift || Compress::Zlib::Z_FINISH();
+ my $status = $self->SUPER::flush($output, $flag) ;
+
+ wantarray ? ($output, $status) : $output ;
+}
+
+package Zlib::OldInflate ;
+
+our (@ISA);
+@ISA = qw(Compress::Raw::Zlib::inflateStream);
+
+sub inflate
+{
+ my $self = shift ;
+ my $output ;
+ my $status = $self->SUPER::inflate($_[0], $output) ;
+ wantarray ? ($output, $status) : $output ;
+}
+
+package Compress::Zlib ;
+
+use IO::Compress::Gzip::Constants 2.024 ;
+
+sub memGzip($)
+{
+ my $out;
+
+ # if the deflation buffer isn't a reference, make it one
+ my $string = (ref $_[0] ? $_[0] : \$_[0]) ;
+
+ $] >= 5.008 and (utf8::downgrade($$string, 1)
+ or croak "Wide character in memGzip");
+
+ _set_gzerr(0);
+ if ( ! IO::Compress::Gzip::gzip($string, \$out, Minimal => 1) )
+ {
+ $Compress::Zlib::gzerrno = $IO::Compress::Gzip::GzipError;
+ return undef ;
+ }
+
+ return $out;
+}
+
+sub _removeGzipHeader($)
+{
+ my $string = shift ;
+
+ return Z_DATA_ERROR()
+ if length($$string) < GZIP_MIN_HEADER_SIZE ;
+
+ my ($magic1, $magic2, $method, $flags, $time, $xflags, $oscode) =
+ unpack ('CCCCVCC', $$string);
+
+ return Z_DATA_ERROR()
+ unless $magic1 == GZIP_ID1 and $magic2 == GZIP_ID2 and
+ $method == Z_DEFLATED() and !($flags & GZIP_FLG_RESERVED) ;
+ substr($$string, 0, GZIP_MIN_HEADER_SIZE) = '' ;
+
+ # skip extra field
+ if ($flags & GZIP_FLG_FEXTRA)
+ {
+ return Z_DATA_ERROR()
+ if length($$string) < GZIP_FEXTRA_HEADER_SIZE ;
+
+ my ($extra_len) = unpack ('v', $$string);
+ $extra_len += GZIP_FEXTRA_HEADER_SIZE;
+ return Z_DATA_ERROR()
+ if length($$string) < $extra_len ;
+
+ substr($$string, 0, $extra_len) = '';
+ }
+
+ # skip orig name
+ if ($flags & GZIP_FLG_FNAME)
+ {
+ my $name_end = index ($$string, GZIP_NULL_BYTE);
+ return Z_DATA_ERROR()
+ if $name_end == -1 ;
+ substr($$string, 0, $name_end + 1) = '';
+ }
+
+ # skip comment
+ if ($flags & GZIP_FLG_FCOMMENT)
+ {
+ my $comment_end = index ($$string, GZIP_NULL_BYTE);
+ return Z_DATA_ERROR()
+ if $comment_end == -1 ;
+ substr($$string, 0, $comment_end + 1) = '';
+ }
+
+ # skip header crc
+ if ($flags & GZIP_FLG_FHCRC)
+ {
+ return Z_DATA_ERROR()
+ if length ($$string) < GZIP_FHCRC_SIZE ;
+ substr($$string, 0, GZIP_FHCRC_SIZE) = '';
+ }
+
+ return Z_OK();
+}
+
+sub _ret_gun_error
+{
+ $Compress::Zlib::gzerrno = $IO::Uncompress::Gunzip::GunzipError;
+ return undef;
+}
+
+
+sub memGunzip($)
+{
+ # if the buffer isn't a reference, make it one
+ my $string = (ref $_[0] ? $_[0] : \$_[0]);
+
+ $] >= 5.008 and (utf8::downgrade($$string, 1)
+ or croak "Wide character in memGunzip");
+
+ _set_gzerr(0);
+
+ my $status = _removeGzipHeader($string) ;
+ $status == Z_OK()
+ or return _set_gzerr_undef($status);
+
+ my $bufsize = length $$string > 4096 ? length $$string : 4096 ;
+ my $x = new Compress::Raw::Zlib::Inflate({-WindowBits => - MAX_WBITS(),
+ -Bufsize => $bufsize})
+
+ or return _ret_gun_error();
+
+ my $output = "" ;
+ $status = $x->inflate($string, $output);
+
+ if ( $status == Z_OK() )
+ {
+ _set_gzerr(Z_DATA_ERROR());
+ return undef;
+ }
+
+ return _ret_gun_error()
+ if ($status != Z_STREAM_END());
+
+ if (length $$string >= 8)
+ {
+ my ($crc, $len) = unpack ("VV", substr($$string, 0, 8));
+ substr($$string, 0, 8) = '';
+ return _set_gzerr_undef(Z_DATA_ERROR())
+ unless $len == length($output) and
+ $crc == crc32($output);
+ }
+ else
+ {
+ $$string = '';
+ }
+
+ return $output;
+}
+
+# Autoload methods go after __END__, and are processed by the autosplit program.
+
+1;
+__END__
+
+
+=head1 NAME
+
+Compress::Zlib - Interface to zlib compression library
+
+=head1 SYNOPSIS
+
+ use Compress::Zlib ;
+
+ ($d, $status) = deflateInit( [OPT] ) ;
+ $status = $d->deflate($input, $output) ;
+ $status = $d->flush([$flush_type]) ;
+ $d->deflateParams(OPTS) ;
+ $d->deflateTune(OPTS) ;
+ $d->dict_adler() ;
+ $d->crc32() ;
+ $d->adler32() ;
+ $d->total_in() ;
+ $d->total_out() ;
+ $d->msg() ;
+ $d->get_Strategy();
+ $d->get_Level();
+ $d->get_BufSize();
+
+ ($i, $status) = inflateInit( [OPT] ) ;
+ $status = $i->inflate($input, $output [, $eof]) ;
+ $status = $i->inflateSync($input) ;
+ $i->dict_adler() ;
+ $d->crc32() ;
+ $d->adler32() ;
+ $i->total_in() ;
+ $i->total_out() ;
+ $i->msg() ;
+ $d->get_BufSize();
+
+ $dest = compress($source) ;
+ $dest = uncompress($source) ;
+
+ $gz = gzopen($filename or filehandle, $mode) ;
+ $bytesread = $gz->gzread($buffer [,$size]) ;
+ $bytesread = $gz->gzreadline($line) ;
+ $byteswritten = $gz->gzwrite($buffer) ;
+ $status = $gz->gzflush($flush) ;
+ $offset = $gz->gztell() ;
+ $status = $gz->gzseek($offset, $whence) ;
+ $status = $gz->gzclose() ;
+ $status = $gz->gzeof() ;
+ $status = $gz->gzsetparams($level, $strategy) ;
+ $errstring = $gz->gzerror() ;
+ $gzerrno
+
+ $dest = Compress::Zlib::memGzip($buffer) ;
+ $dest = Compress::Zlib::memGunzip($buffer) ;
+
+ $crc = adler32($buffer [,$crc]) ;
+ $crc = crc32($buffer [,$crc]) ;
+
+ $crc = adler32_combine($crc1, $crc2, $len2)l
+ $crc = crc32_combine($adler1, $adler2, $len2)
+
+ my $version = Compress::Raw::Zlib::zlib_version();
+
+=head1 DESCRIPTION
+
+The I<Compress::Zlib> module provides a Perl interface to the I<zlib>
+compression library (see L</AUTHOR> for details about where to get
+I<zlib>).
+
+The C<Compress::Zlib> module can be split into two general areas of
+functionality, namely a simple read/write interface to I<gzip> files
+and a low-level in-memory compression/decompression interface.
+
+Each of these areas will be discussed in the following sections.
+
+=head2 Notes for users of Compress::Zlib version 1
+
+The main change in C<Compress::Zlib> version 2.x is that it does not now
+interface directly to the zlib library. Instead it uses the
+C<IO::Compress::Gzip> and C<IO::Uncompress::Gunzip> modules for
+reading/writing gzip files, and the C<Compress::Raw::Zlib> module for some
+low-level zlib access.
+
+The interface provided by version 2 of this module should be 100% backward
+compatible with version 1. If you find a difference in the expected
+behaviour please contact the author (See L</AUTHOR>). See L<GZIP INTERFACE>
+
+With the creation of the C<IO::Compress> and C<IO::Uncompress> modules no
+new features are planned for C<Compress::Zlib> - the new modules do
+everything that C<Compress::Zlib> does and then some. Development on
+C<Compress::Zlib> will be limited to bug fixes only.
+
+If you are writing new code, your first port of call should be one of the
+new C<IO::Compress> or C<IO::Uncompress> modules.
+
+=head1 GZIP INTERFACE
+
+A number of functions are supplied in I<zlib> for reading and writing
+I<gzip> files that conform to RFC 1952. This module provides an interface
+to most of them.
+
+If you have previously used C<Compress::Zlib> 1.x, the following
+enhancements/changes have been made to the C<gzopen> interface:
+
+=over 5
+
+=item 1
+
+If you want to to open either STDIN or STDOUT with C<gzopen>, you can now
+optionally use the special filename "C<->" as a synonym for C<\*STDIN> and
+C<\*STDOUT>.
+
+=item 2
+
+In C<Compress::Zlib> version 1.x, C<gzopen> used the zlib library to open
+the underlying file. This made things especially tricky when a Perl
+filehandle was passed to C<gzopen>. Behind the scenes the numeric C file
+descriptor had to be extracted from the Perl filehandle and this passed to
+the zlib library.
+
+Apart from being non-portable to some operating systems, this made it
+difficult to use C<gzopen> in situations where you wanted to extract/create
+a gzip data stream that is embedded in a larger file, without having to
+resort to opening and closing the file multiple times.
+
+It also made it impossible to pass a perl filehandle that wasn't associated
+with a real filesystem file, like, say, an C<IO::String>.
+
+In C<Compress::Zlib> version 2.x, the C<gzopen> interface has been
+completely rewritten to use the L<IO::Compress::Gzip|IO::Compress::Gzip>
+for writing gzip files and L<IO::Uncompress::Gunzip|IO::Uncompress::Gunzip>
+for reading gzip files. None of the limitations mentioned above apply.
+
+=item 3
+
+Addition of C<gzseek> to provide a restricted C<seek> interface.
+
+=item 4.
+
+Added C<gztell>.
+
+=back
+
+A more complete and flexible interface for reading/writing gzip
+files/buffers is included with the module C<IO-Compress-Zlib>. See
+L<IO::Compress::Gzip|IO::Compress::Gzip> and
+L<IO::Uncompress::Gunzip|IO::Uncompress::Gunzip> for more details.
+
+=over 5
+
+=item B<$gz = gzopen($filename, $mode)>
+
+=item B<$gz = gzopen($filehandle, $mode)>
+
+This function opens either the I<gzip> file C<$filename> for reading or
+writing or attaches to the opened filehandle, C<$filehandle>.
+It returns an object on success and C<undef> on failure.
+
+When writing a gzip file this interface will I<always> create the smallest
+possible gzip header (exactly 10 bytes). If you want greater control over
+what gets stored in the gzip header (like the original filename or a
+comment) use L<IO::Compress::Gzip|IO::Compress::Gzip> instead. Similarly if
+you want to read the contents of the gzip header use
+L<IO::Uncompress::Gunzip|IO::Uncompress::Gunzip>.
+
+The second parameter, C<$mode>, is used to specify whether the file is
+opened for reading or writing and to optionally specify a compression
+level and compression strategy when writing. The format of the C<$mode>
+parameter is similar to the mode parameter to the 'C' function C<fopen>,
+so "rb" is used to open for reading, "wb" for writing and "ab" for
+appending (writing at the end of the file).
+
+To specify a compression level when writing, append a digit between 0
+and 9 to the mode string -- 0 means no compression and 9 means maximum
+compression.
+If no compression level is specified Z_DEFAULT_COMPRESSION is used.
+
+To specify the compression strategy when writing, append 'f' for filtered
+data, 'h' for Huffman only compression, or 'R' for run-length encoding.
+If no strategy is specified Z_DEFAULT_STRATEGY is used.
+
+So, for example, "wb9" means open for writing with the maximum compression
+using the default strategy and "wb4R" means open for writing with compression
+level 4 and run-length encoding.
+
+Refer to the I<zlib> documentation for the exact format of the C<$mode>
+parameter.
+
+=item B<$bytesread = $gz-E<gt>gzread($buffer [, $size]) ;>
+
+Reads C<$size> bytes from the compressed file into C<$buffer>. If
+C<$size> is not specified, it will default to 4096. If the scalar
+C<$buffer> is not large enough, it will be extended automatically.
+
+Returns the number of bytes actually read. On EOF it returns 0 and in
+the case of an error, -1.
+
+=item B<$bytesread = $gz-E<gt>gzreadline($line) ;>
+
+Reads the next line from the compressed file into C<$line>.
+
+Returns the number of bytes actually read. On EOF it returns 0 and in
+the case of an error, -1.
+
+It is legal to intermix calls to C<gzread> and C<gzreadline>.
+
+To maintain backward compatibility with version 1.x of this module
+C<gzreadline> ignores the C<$/> variable - it I<always> uses the string
+C<"\n"> as the line delimiter.
+
+If you want to read a gzip file a line at a time and have it respect the
+C<$/> variable (or C<$INPUT_RECORD_SEPARATOR>, or C<$RS> when C<English> is
+in use) see L<IO::Uncompress::Gunzip|IO::Uncompress::Gunzip>.
+
+=item B<$byteswritten = $gz-E<gt>gzwrite($buffer) ;>
+
+Writes the contents of C<$buffer> to the compressed file. Returns the
+number of bytes actually written, or 0 on error.
+
+=item B<$status = $gz-E<gt>gzflush($flush_type) ;>
+
+Flushes all pending output into the compressed file.
+
+This method takes an optional parameter, C<$flush_type>, that controls
+how the flushing will be carried out. By default the C<$flush_type>
+used is C<Z_FINISH>. Other valid values for C<$flush_type> are
+C<Z_NO_FLUSH>, C<Z_SYNC_FLUSH>, C<Z_FULL_FLUSH> and C<Z_BLOCK>. It is
+strongly recommended that you only set the C<flush_type> parameter if
+you fully understand the implications of what it does - overuse of C<flush>
+can seriously degrade the level of compression achieved. See the C<zlib>
+documentation for details.
+
+Returns 0 on success.
+
+=item B<$offset = $gz-E<gt>gztell() ;>
+
+Returns the uncompressed file offset.
+
+=item B<$status = $gz-E<gt>gzseek($offset, $whence) ;>
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the compressed file.
+It is a fatal error to attempt to seek backward.
+
+When opened for writing, empty parts of the file will have NULL (0x00)
+bytes written to them.
+
+The C<$whence> parameter should be one of SEEK_SET, SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=item B<$gz-E<gt>gzclose>
+
+Closes the compressed file. Any pending data is flushed to the file
+before it is closed.
+
+Returns 0 on success.
+
+=item B<$gz-E<gt>gzsetparams($level, $strategy>
+
+Change settings for the deflate stream C<$gz>.
+
+The list of the valid options is shown below. Options not specified
+will remain unchanged.
+
+Note: This method is only available if you are running zlib 1.0.6 or better.
+
+=over 5
+
+=item B<$level>
+
+Defines the compression level. Valid values are 0 through 9,
+C<Z_NO_COMPRESSION>, C<Z_BEST_SPEED>, C<Z_BEST_COMPRESSION>, and
+C<Z_DEFAULT_COMPRESSION>.
+
+=item B<$strategy>
+
+Defines the strategy used to tune the compression. The valid values are
+C<Z_DEFAULT_STRATEGY>, C<Z_FILTERED> and C<Z_HUFFMAN_ONLY>.
+
+=back
+
+=item B<$gz-E<gt>gzerror>
+
+Returns the I<zlib> error message or number for the last operation
+associated with C<$gz>. The return value will be the I<zlib> error
+number when used in a numeric context and the I<zlib> error message
+when used in a string context. The I<zlib> error number constants,
+shown below, are available for use.
+
+ Z_OK
+ Z_STREAM_END
+ Z_ERRNO
+ Z_STREAM_ERROR
+ Z_DATA_ERROR
+ Z_MEM_ERROR
+ Z_BUF_ERROR
+
+=item B<$gzerrno>
+
+The C<$gzerrno> scalar holds the error code associated with the most
+recent I<gzip> routine. Note that unlike C<gzerror()>, the error is
+I<not> associated with a particular file.
+
+As with C<gzerror()> it returns an error number in numeric context and
+an error message in string context. Unlike C<gzerror()> though, the
+error message will correspond to the I<zlib> message when the error is
+associated with I<zlib> itself, or the UNIX error message when it is
+not (i.e. I<zlib> returned C<Z_ERRORNO>).
+
+As there is an overlap between the error numbers used by I<zlib> and
+UNIX, C<$gzerrno> should only be used to check for the presence of
+I<an> error in numeric context. Use C<gzerror()> to check for specific
+I<zlib> errors. The I<gzcat> example below shows how the variable can
+be used safely.
+
+=back
+
+=head2 Examples
+
+Here is an example script which uses the interface. It implements a
+I<gzcat> function.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Zlib ;
+
+ # use stdin if no files supplied
+ @ARGV = '-' unless @ARGV ;
+
+ foreach my $file (@ARGV) {
+ my $buffer ;
+
+ my $gz = gzopen($file, "rb")
+ or die "Cannot open $file: $gzerrno\n" ;
+
+ print $buffer while $gz->gzread($buffer) > 0 ;
+
+ die "Error reading from $file: $gzerrno" . ($gzerrno+0) . "\n"
+ if $gzerrno != Z_STREAM_END ;
+
+ $gz->gzclose() ;
+ }
+
+Below is a script which makes use of C<gzreadline>. It implements a
+very simple I<grep> like script.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Zlib ;
+
+ die "Usage: gzgrep pattern [file...]\n"
+ unless @ARGV >= 1;
+
+ my $pattern = shift ;
+
+ # use stdin if no files supplied
+ @ARGV = '-' unless @ARGV ;
+
+ foreach my $file (@ARGV) {
+ my $gz = gzopen($file, "rb")
+ or die "Cannot open $file: $gzerrno\n" ;
+
+ while ($gz->gzreadline($_) > 0) {
+ print if /$pattern/ ;
+ }
+
+ die "Error reading from $file: $gzerrno\n"
+ if $gzerrno != Z_STREAM_END ;
+
+ $gz->gzclose() ;
+ }
+
+This script, I<gzstream>, does the opposite of the I<gzcat> script
+above. It reads from standard input and writes a gzip data stream to
+standard output.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Zlib ;
+
+ binmode STDOUT; # gzopen only sets it on the fd
+
+ my $gz = gzopen(\*STDOUT, "wb")
+ or die "Cannot open stdout: $gzerrno\n" ;
+
+ while (<>) {
+ $gz->gzwrite($_)
+ or die "error writing: $gzerrno\n" ;
+ }
+
+ $gz->gzclose ;
+
+=head2 Compress::Zlib::memGzip
+
+This function is used to create an in-memory gzip file with the minimum
+possible gzip header (exactly 10 bytes).
+
+ $dest = Compress::Zlib::memGzip($buffer)
+ or die "Cannot compress: $gzerrno\n";
+
+If successful, it returns the in-memory gzip file. Otherwise it returns
+C<undef> and the C<$gzerrno> variable will store the zlib error code.
+
+The C<$buffer> parameter can either be a scalar or a scalar reference.
+
+See L<IO::Compress::Gzip|IO::Compress::Gzip> for an alternative way to
+carry out in-memory gzip compression.
+
+=head2 Compress::Zlib::memGunzip
+
+This function is used to uncompress an in-memory gzip file.
+
+ $dest = Compress::Zlib::memGunzip($buffer)
+ or die "Cannot uncomprss: $gzerrno\n";
+
+If successful, it returns the uncompressed gzip file. Otherwise it
+returns C<undef> and the C<$gzerrno> variable will store the zlib error
+code.
+
+The C<$buffer> parameter can either be a scalar or a scalar reference. The
+contents of the C<$buffer> parameter are destroyed after calling this function.
+
+If C<$buffer> consists of multiple concatenated gzip data streams only the
+first will be uncompressed. Use C<gunzip> with the C<MultiStream> option in
+the C<IO::Uncompress::Gunzip> module if you need to deal with concatenated
+data streams.
+
+See L<IO::Uncompress::Gunzip|IO::Uncompress::Gunzip> for an alternative way
+to carry out in-memory gzip uncompression.
+
+=head1 COMPRESS/UNCOMPRESS
+
+Two functions are provided to perform in-memory compression/uncompression of
+RFC 1950 data streams. They are called C<compress> and C<uncompress>.
+
+=over 5
+
+=item B<$dest = compress($source [, $level] ) ;>
+
+Compresses C<$source>. If successful it returns the compressed
+data. Otherwise it returns I<undef>.
+
+The source buffer, C<$source>, can either be a scalar or a scalar
+reference.
+
+The C<$level> parameter defines the compression level. Valid values are
+0 through 9, C<Z_NO_COMPRESSION>, C<Z_BEST_SPEED>,
+C<Z_BEST_COMPRESSION>, and C<Z_DEFAULT_COMPRESSION>.
+If C<$level> is not specified C<Z_DEFAULT_COMPRESSION> will be used.
+
+=item B<$dest = uncompress($source) ;>
+
+Uncompresses C<$source>. If successful it returns the uncompressed
+data. Otherwise it returns I<undef>.
+
+The source buffer can either be a scalar or a scalar reference.
+
+=back
+
+Please note: the two functions defined above are I<not> compatible with
+the Unix commands of the same name.
+
+See L<IO::Deflate|IO::Deflate> and L<IO::Inflate|IO::Inflate> included with
+this distribution for an alternative interface for reading/writing RFC 1950
+files/buffers.
+
+=head1 Deflate Interface
+
+This section defines an interface that allows in-memory compression using
+the I<deflate> interface provided by zlib.
+
+Here is a definition of the interface available:
+
+=head2 B<($d, $status) = deflateInit( [OPT] )>
+
+Initialises a deflation stream.
+
+It combines the features of the I<zlib> functions C<deflateInit>,
+C<deflateInit2> and C<deflateSetDictionary>.
+
+If successful, it will return the initialised deflation stream, C<$d>
+and C<$status> of C<Z_OK> in a list context. In scalar context it
+returns the deflation stream, C<$d>, only.
+
+If not successful, the returned deflation stream (C<$d>) will be
+I<undef> and C<$status> will hold the exact I<zlib> error code.
+
+The function optionally takes a number of named options specified as
+C<< -Name=>value >> pairs. This allows individual options to be
+tailored without having to specify them all in the parameter list.
+
+For backward compatibility, it is also possible to pass the parameters
+as a reference to a hash containing the name=>value pairs.
+
+The function takes one optional parameter, a reference to a hash. The
+contents of the hash allow the deflation interface to be tailored.
+
+Here is a list of the valid options:
+
+=over 5
+
+=item B<-Level>
+
+Defines the compression level. Valid values are 0 through 9,
+C<Z_NO_COMPRESSION>, C<Z_BEST_SPEED>, C<Z_BEST_COMPRESSION>, and
+C<Z_DEFAULT_COMPRESSION>.
+
+The default is Z_DEFAULT_COMPRESSION.
+
+=item B<-Method>
+
+Defines the compression method. The only valid value at present (and
+the default) is Z_DEFLATED.
+
+=item B<-WindowBits>
+
+To create an RFC 1950 data stream, set C<WindowBits> to a positive number.
+
+To create an RFC 1951 data stream, set C<WindowBits> to C<-MAX_WBITS>.
+
+For a full definition of the meaning and valid values for C<WindowBits> refer
+to the I<zlib> documentation for I<deflateInit2>.
+
+Defaults to MAX_WBITS.
+
+=item B<-MemLevel>
+
+For a definition of the meaning and valid values for C<MemLevel>
+refer to the I<zlib> documentation for I<deflateInit2>.
+
+Defaults to MAX_MEM_LEVEL.
+
+=item B<-Strategy>
+
+Defines the strategy used to tune the compression. The valid values are
+C<Z_DEFAULT_STRATEGY>, C<Z_FILTERED> and C<Z_HUFFMAN_ONLY>.
+
+The default is Z_DEFAULT_STRATEGY.
+
+=item B<-Dictionary>
+
+When a dictionary is specified I<Compress::Zlib> will automatically
+call C<deflateSetDictionary> directly after calling C<deflateInit>. The
+Adler32 value for the dictionary can be obtained by calling the method
+C<$d->dict_adler()>.
+
+The default is no dictionary.
+
+=item B<-Bufsize>
+
+Sets the initial size for the deflation buffer. If the buffer has to be
+reallocated to increase the size, it will grow in increments of
+C<Bufsize>.
+
+The default is 4096.
+
+=back
+
+Here is an example of using the C<deflateInit> optional parameter list
+to override the default buffer size and compression level. All other
+options will take their default values.
+
+ deflateInit( -Bufsize => 300,
+ -Level => Z_BEST_SPEED ) ;
+
+=head2 B<($out, $status) = $d-E<gt>deflate($buffer)>
+
+Deflates the contents of C<$buffer>. The buffer can either be a scalar
+or a scalar reference. When finished, C<$buffer> will be
+completely processed (assuming there were no errors). If the deflation
+was successful it returns the deflated output, C<$out>, and a status
+value, C<$status>, of C<Z_OK>.
+
+On error, C<$out> will be I<undef> and C<$status> will contain the
+I<zlib> error code.
+
+In a scalar context C<deflate> will return C<$out> only.
+
+As with the I<deflate> function in I<zlib>, it is not necessarily the
+case that any output will be produced by this method. So don't rely on
+the fact that C<$out> is empty for an error test.
+
+=head2 B<($out, $status) = $d-E<gt>flush()>
+=head2 B<($out, $status) = $d-E<gt>flush($flush_type)>
+
+Typically used to finish the deflation. Any pending output will be
+returned via C<$out>.
+C<$status> will have a value C<Z_OK> if successful.
+
+In a scalar context C<flush> will return C<$out> only.
+
+Note that flushing can seriously degrade the compression ratio, so it
+should only be used to terminate a decompression (using C<Z_FINISH>) or
+when you want to create a I<full flush point> (using C<Z_FULL_FLUSH>).
+
+By default the C<flush_type> used is C<Z_FINISH>. Other valid values
+for C<flush_type> are C<Z_NO_FLUSH>, C<Z_PARTIAL_FLUSH>, C<Z_SYNC_FLUSH>
+and C<Z_FULL_FLUSH>. It is strongly recommended that you only set the
+C<flush_type> parameter if you fully understand the implications of
+what it does. See the C<zlib> documentation for details.
+
+=head2 B<$status = $d-E<gt>deflateParams([OPT])>
+
+Change settings for the deflate stream C<$d>.
+
+The list of the valid options is shown below. Options not specified
+will remain unchanged.
+
+=over 5
+
+=item B<-Level>
+
+Defines the compression level. Valid values are 0 through 9,
+C<Z_NO_COMPRESSION>, C<Z_BEST_SPEED>, C<Z_BEST_COMPRESSION>, and
+C<Z_DEFAULT_COMPRESSION>.
+
+=item B<-Strategy>
+
+Defines the strategy used to tune the compression. The valid values are
+C<Z_DEFAULT_STRATEGY>, C<Z_FILTERED> and C<Z_HUFFMAN_ONLY>.
+
+=back
+
+=head2 B<$d-E<gt>dict_adler()>
+
+Returns the adler32 value for the dictionary.
+
+=head2 B<$d-E<gt>msg()>
+
+Returns the last error message generated by zlib.
+
+=head2 B<$d-E<gt>total_in()>
+
+Returns the total number of bytes uncompressed bytes input to deflate.
+
+=head2 B<$d-E<gt>total_out()>
+
+Returns the total number of compressed bytes output from deflate.
+
+=head2 Example
+
+Here is a trivial example of using C<deflate>. It simply reads standard
+input, deflates it and writes it to standard output.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Zlib ;
+
+ binmode STDIN;
+ binmode STDOUT;
+ my $x = deflateInit()
+ or die "Cannot create a deflation stream\n" ;
+
+ my ($output, $status) ;
+ while (<>)
+ {
+ ($output, $status) = $x->deflate($_) ;
+
+ $status == Z_OK
+ or die "deflation failed\n" ;
+
+ print $output ;
+ }
+
+ ($output, $status) = $x->flush() ;
+
+ $status == Z_OK
+ or die "deflation failed\n" ;
+
+ print $output ;
+
+=head1 Inflate Interface
+
+This section defines the interface available that allows in-memory
+uncompression using the I<deflate> interface provided by zlib.
+
+Here is a definition of the interface:
+
+=head2 B<($i, $status) = inflateInit()>
+
+Initialises an inflation stream.
+
+In a list context it returns the inflation stream, C<$i>, and the
+I<zlib> status code in C<$status>. In a scalar context it returns the
+inflation stream only.
+
+If successful, C<$i> will hold the inflation stream and C<$status> will
+be C<Z_OK>.
+
+If not successful, C<$i> will be I<undef> and C<$status> will hold the
+I<zlib> error code.
+
+The function optionally takes a number of named options specified as
+C<< -Name=>value >> pairs. This allows individual options to be
+tailored without having to specify them all in the parameter list.
+
+For backward compatibility, it is also possible to pass the parameters
+as a reference to a hash containing the name=>value pairs.
+
+The function takes one optional parameter, a reference to a hash. The
+contents of the hash allow the deflation interface to be tailored.
+
+Here is a list of the valid options:
+
+=over 5
+
+=item B<-WindowBits>
+
+To uncompress an RFC 1950 data stream, set C<WindowBits> to a positive number.
+
+To uncompress an RFC 1951 data stream, set C<WindowBits> to C<-MAX_WBITS>.
+
+For a full definition of the meaning and valid values for C<WindowBits> refer
+to the I<zlib> documentation for I<inflateInit2>.
+
+Defaults to MAX_WBITS.
+
+=item B<-Bufsize>
+
+Sets the initial size for the inflation buffer. If the buffer has to be
+reallocated to increase the size, it will grow in increments of
+C<Bufsize>.
+
+Default is 4096.
+
+=item B<-Dictionary>
+
+The default is no dictionary.
+
+=back
+
+Here is an example of using the C<inflateInit> optional parameter to
+override the default buffer size.
+
+ inflateInit( -Bufsize => 300 ) ;
+
+=head2 B<($out, $status) = $i-E<gt>inflate($buffer)>
+
+Inflates the complete contents of C<$buffer>. The buffer can either be
+a scalar or a scalar reference.
+
+Returns C<Z_OK> if successful and C<Z_STREAM_END> if the end of the
+compressed data has been successfully reached.
+If not successful, C<$out> will be I<undef> and C<$status> will hold
+the I<zlib> error code.
+
+The C<$buffer> parameter is modified by C<inflate>. On completion it
+will contain what remains of the input buffer after inflation. This
+means that C<$buffer> will be an empty string when the return status is
+C<Z_OK>. When the return status is C<Z_STREAM_END> the C<$buffer>
+parameter will contains what (if anything) was stored in the input
+buffer after the deflated data stream.
+
+This feature is useful when processing a file format that encapsulates
+a compressed data stream (e.g. gzip, zip).
+
+=head2 B<$status = $i-E<gt>inflateSync($buffer)>
+
+Scans C<$buffer> until it reaches either a I<full flush point> or the
+end of the buffer.
+
+If a I<full flush point> is found, C<Z_OK> is returned and C<$buffer>
+will be have all data up to the flush point removed. This can then be
+passed to the C<deflate> method.
+
+Any other return code means that a flush point was not found. If more
+data is available, C<inflateSync> can be called repeatedly with more
+compressed data until the flush point is found.
+
+=head2 B<$i-E<gt>dict_adler()>
+
+Returns the adler32 value for the dictionary.
+
+=head2 B<$i-E<gt>msg()>
+
+Returns the last error message generated by zlib.
+
+=head2 B<$i-E<gt>total_in()>
+
+Returns the total number of bytes compressed bytes input to inflate.
+
+=head2 B<$i-E<gt>total_out()>
+
+Returns the total number of uncompressed bytes output from inflate.
+
+=head2 Example
+
+Here is an example of using C<inflate>.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Zlib ;
+
+ my $x = inflateInit()
+ or die "Cannot create a inflation stream\n" ;
+
+ my $input = '' ;
+ binmode STDIN;
+ binmode STDOUT;
+
+ my ($output, $status) ;
+ while (read(STDIN, $input, 4096))
+ {
+ ($output, $status) = $x->inflate(\$input) ;
+
+ print $output
+ if $status == Z_OK or $status == Z_STREAM_END ;
+
+ last if $status != Z_OK ;
+ }
+
+ die "inflation failed\n"
+ unless $status == Z_STREAM_END ;
+
+=head1 CHECKSUM FUNCTIONS
+
+Two functions are provided by I<zlib> to calculate checksums. For the
+Perl interface, the order of the two parameters in both functions has
+been reversed. This allows both running checksums and one off
+calculations to be done.
+
+ $crc = adler32($buffer [,$crc]) ;
+ $crc = crc32($buffer [,$crc]) ;
+
+The buffer parameters can either be a scalar or a scalar reference.
+
+If the $crc parameters is C<undef>, the crc value will be reset.
+
+If you have built this module with zlib 1.2.3 or better, two more
+CRC-related functions are available.
+
+ $crc = adler32_combine($crc1, $crc2, $len2)l
+ $crc = crc32_combine($adler1, $adler2, $len2)
+
+These functions allow checksums to be merged.
+
+=head1 Misc
+
+=head2 my $version = Compress::Zlib::zlib_version();
+
+Returns the version of the zlib library.
+
+=head1 CONSTANTS
+
+All the I<zlib> constants are automatically imported when you make use
+of I<Compress::Zlib>.
+
+=head1 SEE ALSO
+
+L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+For RFC 1950, 1951 and 1952 see
+F<http://www.faqs.org/rfcs/rfc1950.html>,
+F<http://www.faqs.org/rfcs/rfc1951.html> and
+F<http://www.faqs.org/rfcs/rfc1952.html>
+
+The I<zlib> compression library was written by Jean-loup Gailly
+F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
+
+The primary site for the I<zlib> compression library is
+F<http://www.zlib.org>.
+
+The primary site for gzip is F<http://www.gzip.org>.
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 1995-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Compress/unLZMA.pm b/Master/tlpkg/tlperl.straw/lib/Compress/unLZMA.pm
new file mode 100755
index 00000000000..dc7d4c95a8a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Compress/unLZMA.pm
@@ -0,0 +1,158 @@
+package Compress::unLZMA;
+
+use strict;
+use warnings;
+
+require Exporter;
+
+our @ISA = qw(Exporter);
+
+our %EXPORT_TAGS = ( 'all' => [ qw(
+ uncompress uncompressfile
+) ] );
+
+our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
+
+our $VERSION = '0.03';
+
+require XSLoader;
+XSLoader::load('Compress::unLZMA', $VERSION);
+
+sub compress {
+ die "not implemented!\n";
+}
+
+sub compressfile {
+ die "not implemented!\n";
+}
+
+sub uncompress {
+ my ($data) = @_;
+
+ return undef if (length($data) < 14);
+
+ my $properties = substr($data, 0, 5);
+
+ my $size = 0;
+ for (my $ii = 0; $ii < 4; $ii++) {
+ my $b = ord(substr($data, $ii + 5, 1));
+ $size += $b << ($ii * 8);
+ }
+
+ for (my $ii = 0; $ii < 4; $ii++) {
+ my $b = ord(substr($data, $ii + 9, 1));
+ if ($b != 0) {
+ return undef;
+ }
+ }
+
+ if (ord(substr($properties, 0, 1)) >= (9 * 5 * 5)) {
+ return undef;
+ }
+
+ if ( $size == 0 ) { # empty file: no data to uncompress
+ return '';
+ }
+
+ $data = substr($data, 13);
+
+ my $result = uncompressdata($data, length($data), $size, $properties);
+
+ return $result;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Compress::unLZMA - Interface to LZMA decompression library
+
+=head1 SYNOPSIS
+
+ use Compress::unLZMA qw(uncompress uncompressfile);
+ my $data = uncompressfile('foo.lzma');
+ my $data = uncompress($content);
+
+=head1 DESCRIPTION
+
+LZMA is default and general compression method of 7z format
+in 7-Zip program. LZMA provides high compression ratio and very
+fast decompression.
+
+This module is based on the LZMA SDK which provides a cross-platform
+implementation of the LZMA decompression algorithm in ANSI C.
+
+From SDK lzma.txt file:
+
+ LZMA decompression code was ported from original C++ sources to C.
+ Also it was simplified and optimized for code size.
+ But it is fully compatible with LZMA from 7-Zip.
+
+=head1 METHODS
+
+=over 4
+
+=item $data = uncompress($content)
+
+Uncompress $data. if successfull, it returns the uncompressed data.
+Otherwise it returns undef and $@ contains the error message.
+
+The source buffer can be either be a scalar or a scalar reference.
+
+=item $data = uncompressfile($file)
+
+Uncompress the file $file. if successfull, it returns the uncompressed data.
+Otherwise it returns undef and $@ contains the error message.
+
+=back
+
+=head1 CAVEATS
+
+This version only implements in-memory decompression (patches are welcomed).
+
+There is no way to recognize a valid LZMA encoded file with the SDK.
+So, in some cases, you can crash your script if you try to uncompress
+a non valid LZMA encoded file.
+
+=head1 REQUESTS & BUGS
+
+Please report any requests, suggestions or bugs via the RT bug-tracking system
+at http://rt.cpan.org/ or email to bug-Compress-unLZMA\@rt.cpan.org.
+
+http://rt.cpan.org/NoAuth/Bugs.html?Dist=Compress-unLZMA is the RT queue for Compress::unLZMA.
+Please check to see if your bug has already been reported.
+
+=head1 MAINTAINER
+
+Adriano Ferreira, ferreira@cpan.org
+
+=head1 COPYRIGHT
+
+Copyright 2004
+
+Fabien Potencier, fabpot@cpan.org
+
+This software may be freely copied and distributed under the same
+terms and conditions as Perl.
+
+=head1 LZMA COPYRIGHT
+
+LZMA SDK 4.01 Copyright (C) 1999-2004 Igor Pavlov 2004-02-15
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+LZMA SDK also can be available under a proprietary license for
+those who cannot use the GNU LGPL in their code. To request
+such proprietary license or any additional consultations,
+write to support@7-zip.org
+
+=head1 SEE ALSO
+
+perl(1), http://www.7-zip.org/.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Config/Extensions.pm b/Master/tlpkg/tlperl.straw/lib/Config/Extensions.pm
new file mode 100755
index 00000000000..82fb9e09e89
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Config/Extensions.pm
@@ -0,0 +1,63 @@
+package Config::Extensions;
+use strict;
+use vars qw(%Extensions $VERSION @ISA @EXPORT_OK);
+use Config;
+require Exporter;
+
+$VERSION = '0.01';
+@ISA = 'Exporter';
+@EXPORT_OK = '%Extensions';
+
+foreach my $type (qw(static dynamic nonxs)) {
+ foreach (split /\s+/, $Config{$type . '_ext'}) {
+ s!/!::!g;
+ $Extensions{$_} = $type;
+ }
+}
+
+1;
+__END__
+=head1 NAME
+
+Config::Extensions - hash lookup of which core extensions were built.
+
+=head1 SYNOPSIS
+
+ use Config::Extensions '%Extensions';
+ if ($Extensions{PerlIO::via}) {
+ # This perl has PerlIO::via built
+ }
+
+=head1 DESCRIPTION
+
+The Config::Extensions module provides a hash C<%Extensions> containing all
+the core extensions that were enabled for this perl. The hash is keyed by
+extension name, with each entry having one of 3 possible values:
+
+=over 4
+
+=item dynamic
+
+The extension is dynamically linked
+
+=item nonxs
+
+The extension is pure perl, so doesn't need linking to the perl executable
+
+=item static
+
+The extension is statically linked to the perl binary
+
+=back
+
+As all values evaluate to true, a simple C<if> test is good enough to determine
+whether an extension is present.
+
+All the data uses to generate the C<%Extensions> hash is already present in
+the C<Config> module, but not in such a convenient format to quickly reference.
+
+=head1 AUTHOR
+
+Nicholas Clark <nick@ccl4.org>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Config_git.pl b/Master/tlpkg/tlperl.straw/lib/Config_git.pl
new file mode 100755
index 00000000000..6aacc4c1f4d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Config_git.pl
@@ -0,0 +1,12 @@
+######################################################################
+# WARNING: 'lib/Config_git.pl' is generated by make_patchnum.pl
+# DO NOT EDIT DIRECTLY - edit make_patchnum.pl instead
+######################################################################
+$Config::Git_Data=<<'ENDOFGIT';
+git_commit_id=''
+git_describe=''
+git_branch=''
+git_uncommitted_changes=''
+git_commit_id_title=''
+
+ENDOFGIT
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/Blowfish.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/Blowfish.pm
new file mode 100755
index 00000000000..784501882ac
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/Blowfish.pm
@@ -0,0 +1,207 @@
+package Crypt::Blowfish;
+
+require Exporter;
+require DynaLoader;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+
+@ISA = qw(Exporter DynaLoader);
+# @ISA = qw(Exporter DynaLoader Crypt::BlockCipher);
+
+# Items to export into callers namespace by default
+@EXPORT = qw();
+
+# Other items we are prepared to export if requested
+@EXPORT_OK = qw(
+ blocksize keysize min_keysize max_keysize
+ new encrypt decrypt
+);
+
+$VERSION = '2.10';
+bootstrap Crypt::Blowfish $VERSION;
+
+use strict;
+use Carp;
+
+sub usage
+{
+ my ($package, $filename, $line, $subr) = caller(1);
+ $Carp::CarpLevel = 2;
+ croak "Usage: $subr(@_)";
+}
+
+
+sub blocksize { 8; } # /* byte my shiny metal.. */
+sub keysize { 0; } # /* we'll leave this at 8 .. for now. expect change. */
+sub min_keysize { 8; }
+sub max_keysize { 56; }
+
+sub new
+{
+ usage("new Blowfish key") unless @_ == 2;
+
+ my $type = shift; my $self = {}; bless $self, $type;
+
+ $self->{'ks'} = Crypt::Blowfish::init(shift);
+
+ $self;
+}
+
+sub encrypt
+{
+ usage("encrypt data[8 bytes]") unless @_ == 2;
+
+ my $self = shift;
+ my $data = shift;
+
+ Crypt::Blowfish::crypt($data, $data, $self->{'ks'}, 0);
+
+ $data;
+}
+
+sub decrypt
+{
+ usage("decrypt data[8 bytes]") unless @_ == 2;
+
+ my $self = shift;
+ my $data = shift;
+
+ Crypt::Blowfish::crypt($data, $data, $self->{'ks'}, 1);
+
+ $data;
+}
+
+1;
+
+__END__
+#
+# Parts Copyright (C) 1995, 1996 Systemics Ltd (http://www.systemics.com/)
+# New Parts Copyright (C) 2000, 2001 W3Works, LLC (http://www.w3works.com/)
+# All rights reserved.
+#
+
+=head1 NAME
+
+Crypt::Blowfish - Perl Blowfish encryption module
+
+=head1 SYNOPSIS
+
+ use Crypt::Blowfish;
+ my $cipher = new Crypt::Blowfish $key;
+ my $ciphertext = $cipher->encrypt($plaintext);
+ my $plaintext = $cipher->decrypt($ciphertext);
+
+=head1 DESCRIPTION
+
+Blowfish is capable of strong encryption and can use key sizes up
+to 56 bytes (a 448 bit key). You're encouraged to take advantage
+of the full key size to ensure the strongest encryption possible
+from this module.
+
+Crypt::Blowfish has the following methods:
+
+=over 4
+
+ blocksize()
+ keysize()
+ encrypt()
+ decrypt()
+
+=back
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item blocksize
+
+Returns the size (in bytes) of the block cipher.
+
+Crypt::Blowfish doesn't return a key size due to its ability
+to use variable-length keys. (well, more accurately, it won't
+as of 2.09 .. for now, it does. expect that to change)
+
+=item new
+
+ my $cipher = new Crypt::Blowfish $key;
+
+This creates a new Crypt::Blowfish BlockCipher object, using $key,
+where $key is a key of C<keysize()> bytes (minimum of eight bytes).
+
+=item encrypt
+
+ my $cipher = new Crypt::Blowfish $key;
+ my $ciphertext = $cipher->encrypt($plaintext);
+
+This function encrypts $plaintext and returns the $ciphertext
+where $plaintext and $ciphertext must be of C<blocksize()> bytes.
+(hint: Blowfish is an 8 byte block cipher)
+
+=item decrypt
+
+ my $cipher = new Crypt::Blowfish $key;
+ my $plaintext = $cipher->decrypt($ciphertext);
+
+This function decrypts $ciphertext and returns the $plaintext
+where $plaintext and $ciphertext must be of C<blocksize()> bytes.
+(hint: see previous hint)
+
+=back
+
+=head1 EXAMPLE
+
+ my $key = pack("H16", "0123456789ABCDEF"); # min. 8 bytes
+ my $cipher = new Crypt::Blowfish $key;
+ my $ciphertext = $cipher->encrypt("plaintex"); # SEE NOTES
+ print unpack("H16", $ciphertext), "\n";
+
+=head1 PLATFORMS
+
+ Please see the README document for platforms and performance
+ tests.
+
+=head1 NOTES
+
+The module is capable of being used with Crypt::CBC. You're
+encouraged to read the perldoc for Crypt::CBC if you intend to
+use this module for Cipher Block Chaining modes. In fact, if
+you have any intentions of encrypting more than eight bytes of
+data with this, or any other block cipher, you're going to need
+B<some> type of block chaining help. Crypt::CBC tends to be
+very good at this. If you're not going to encrypt more than
+eight bytes, your data B<must> be B<exactly> eight bytes long.
+If need be, do your own padding. "\0" as a null byte is perfectly
+valid to use for this. Additionally, the current maintainer for
+Crypt::Blowfish may or may not release Crypt::CBC_R which
+replaces the default 'RandomIV' initialization vector in
+Crypt::CBC with a random initialization vector. (to the limits
+of /dev/urandom and associates) In either case, please email
+amused@pobox.com for Crypt::CBC_R.
+
+=head1 SEE ALSO
+
+Crypt::CBC,
+Crypt::DES,
+Crypt::IDEA
+
+Bruce Schneier, I<Applied Cryptography>, 1995, Second Edition,
+published by John Wiley & Sons, Inc.
+
+=head1 COPYRIGHT
+
+The implementation of the Blowfish algorithm was developed by,
+and is copyright of, A.M. Kuchling.
+
+Other parts of the perl extension and module are
+copyright of Systemics Ltd ( http://www.systemics.com/ ).
+
+Code revisions, updates, and standalone release are copyright
+1999-2001 W3Works, LLC.
+
+=head1 AUTHOR
+
+Original algorithm, Bruce Shneier. Original implementation, A.M.
+Kuchling. Original Perl implementation, Systemics Ltd. Current
+maintenance by W3Works, LLC.
+
+Current revision and maintainer: Dave Paris <amused@pobox.com>
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/CAST5_PP.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/CAST5_PP.pm
new file mode 100755
index 00000000000..225b731c61f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/CAST5_PP.pm
@@ -0,0 +1,261 @@
+package Crypt::CAST5_PP;
+
+require 5.004;
+use strict;
+use AutoLoader qw( AUTOLOAD );
+use Carp;
+use integer;
+use vars qw( @s1 @s2 @s3 @s4 @s5 @s6 @s7 @s8 $VERSION );
+
+$VERSION = "1.04";
+
+sub new {
+ my ($class, $key) = @_;
+ my $cast5 = { };
+ bless $cast5 => $class;
+ $cast5->init($key) if defined $key;
+ return $cast5;
+} # new
+
+sub blocksize { return 8 }
+sub keysize { return 16 }
+
+1 # end module
+__END__
+
+=head1 NAME
+
+Crypt::CAST5_PP - CAST5 block cipher in pure Perl
+
+=head1 SYNOPSIS
+
+ use Crypt::CBC;
+
+ my $crypt = Crypt::CBC->new({
+ key => "secret key",
+ cipher => "CAST5_PP",
+ });
+
+ my $message = "All mimsy were the borogoves";
+ my $ciphertext = $crypt->encrypt($message);
+ print unpack("H*", $ciphertext), "\n";
+
+ my $plaintext = $crypt->decrypt($ciphertext);
+ print $plaintext, "\n";
+
+=head1 DESCRIPTION
+
+This module provides a pure Perl implementation of the CAST5 block cipher.
+CAST5 is also known as CAST-128. It is a product of the CAST design
+procedure developed by C. Adams and S. Tavares.
+
+The CAST5 cipher is available royalty-free.
+
+=head1 FUNCTIONS
+
+=head2 blocksize
+
+Returns the CAST5 block size, which is 8 bytes. This function exists
+so that Crypt::CAST5_PP can work with Crypt::CBC.
+
+=head2 keysize
+
+Returns the maximum CAST5 key size, 16 bytes.
+
+=head2 new
+
+ $cast5 = Crypt::CAST5_PP->new($key);
+
+Create a new encryption object. If the optional key parameter is given,
+it will be passed to the init() function.
+
+=head2 init
+
+ $cast5->init($key);
+
+Set or change the encryption key to be used. The key must be from 40 bits
+(5 bytes) to 128 bits (16 bytes) in length. Note that if the key used is
+80 bits or less, encryption and decryption will be somewhat faster.
+
+It is best for the key to be random binary data, not something printable
+like a password. A message digest function may be useful for converting
+a password to an encryption key; see L<Digest::SHA1> or L<Digest::MD5>.
+Note that Crypt::CBC runs the given "key" through MD5 to get the actual
+encryption key.
+
+=head2 encrypt
+
+ $ciphertext = $cast5->encrypt($plaintext);
+
+Encrypt a block of plaintext using the current encryption key, and return
+the corresponding ciphertext. The input must be 8 bytes long, and the output
+has the same length. Note that the encryption is in ECB mode, which means
+that it encrypts each block independently. That can leave you vulnerable
+to dictionary attacks, so it is generally best to use some form of chaining
+between blocks; see L<Crypt::CBC>.
+
+=head2 decrypt
+
+ $plaintext = $cast5->decrypt($ciphertext);
+
+Decrypt the ciphertext and return the corresponding plaintext.
+
+=head1 LIMITATIONS
+
+Always produces untainted output, even if the input is tainted, because
+that's what perl's pack() function does.
+
+=head1 SEE ALSO
+
+RFC 2144, "The CAST-128 Encryption Algorithm", C. Adams, May 1997
+
+L<Crypt::CBC>
+
+=head1 AUTHOR
+
+Bob Mathews, <bobmathews@alumni.calpoly.edu>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2006 Bob Mathews. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
+sub init {
+ use strict;
+ use integer;
+ my ($cast5, $key) = @_;
+ croak "Key length must be 40 to 128 bits"
+ if length($key) < 5 || length($key) > 16;
+ require Crypt::CAST5_PP::Tables;
+
+ # untaint the key. this keeps the evals from blowing up later.
+ # arguably, a tainted key should result in tainted output. oh well.
+ $key =~ /^(.*)$/s and $key = $1;
+
+ # null-pad the key to 16 bytes, and then split it into 32-bit chunks
+ my ($s, $t, $u, $v) = unpack "N4", pack "a16", $key;
+
+ # compute the key schedule
+ # don't try to read this -- it's generated by mkschedule
+ my ($w, $x, $y, $z, @k);
+ for (1..2) {
+ $w=$s^$s5[$v>>16&255]^$s6[$v&255]^$s7[$v>>24&255]^$s8[$v>>8&255]^$s7[$u>>24&255];
+ $x=$u^$s5[$w>>24&255]^$s6[$w>>8&255]^$s7[$w>>16&255]^$s8[$w&255]^$s8[$u>>8&255];
+ $y=$v^$s5[$x&255]^$s6[$x>>8&255]^$s7[$x>>16&255]^$s8[$x>>24&255]^$s5[$u>>16&255];
+ $z=$t^$s5[$y>>8&255]^$s6[$y>>16&255]^$s7[$y&255]^$s8[$y>>24&255]^$s6[$u&255];
+ push@k,$s5[$y>>24&255]^$s6[$y>>16&255]^$s7[$x&255]^$s8[$x>>8&255]^$s5[$w>>8&255];
+ push@k,$s5[$y>>8&255]^$s6[$y&255]^$s7[$x>>16&255]^$s8[$x>>24&255]^$s6[$x>>8&255];
+ push@k,$s5[$z>>24&255]^$s6[$z>>16&255]^$s7[$w&255]^$s8[$w>>8&255]^$s7[$y>>16&255];
+ push@k,$s5[$z>>8&255]^$s6[$z&255]^$s7[$w>>16&255]^$s8[$w>>24&255]^$s8[$z>>24&255];
+ $s=$y^$s5[$x>>16&255]^$s6[$x&255]^$s7[$x>>24&255]^$s8[$x>>8&255]^$s7[$w>>24&255];
+ $t=$w^$s5[$s>>24&255]^$s6[$s>>8&255]^$s7[$s>>16&255]^$s8[$s&255]^$s8[$w>>8&255];
+ $u=$x^$s5[$t&255]^$s6[$t>>8&255]^$s7[$t>>16&255]^$s8[$t>>24&255]^$s5[$w>>16&255];
+ $v=$z^$s5[$u>>8&255]^$s6[$u>>16&255]^$s7[$u&255]^$s8[$u>>24&255]^$s6[$w&255];
+ push@k,$s5[$s&255]^$s6[$s>>8&255]^$s7[$v>>24&255]^$s8[$v>>16&255]^$s5[$u>>24&255];
+ push@k,$s5[$s>>16&255]^$s6[$s>>24&255]^$s7[$v>>8&255]^$s8[$v&255]^$s6[$v>>16&255];
+ push@k,$s5[$t&255]^$s6[$t>>8&255]^$s7[$u>>24&255]^$s8[$u>>16&255]^$s7[$s&255];
+ push@k,$s5[$t>>16&255]^$s6[$t>>24&255]^$s7[$u>>8&255]^$s8[$u&255]^$s8[$t&255];
+ $w=$s^$s5[$v>>16&255]^$s6[$v&255]^$s7[$v>>24&255]^$s8[$v>>8&255]^$s7[$u>>24&255];
+ $x=$u^$s5[$w>>24&255]^$s6[$w>>8&255]^$s7[$w>>16&255]^$s8[$w&255]^$s8[$u>>8&255];
+ $y=$v^$s5[$x&255]^$s6[$x>>8&255]^$s7[$x>>16&255]^$s8[$x>>24&255]^$s5[$u>>16&255];
+ $z=$t^$s5[$y>>8&255]^$s6[$y>>16&255]^$s7[$y&255]^$s8[$y>>24&255]^$s6[$u&255];
+ push@k,$s5[$w&255]^$s6[$w>>8&255]^$s7[$z>>24&255]^$s8[$z>>16&255]^$s5[$y>>16&255];
+ push@k,$s5[$w>>16&255]^$s6[$w>>24&255]^$s7[$z>>8&255]^$s8[$z&255]^$s6[$z>>24&255];
+ push@k,$s5[$x&255]^$s6[$x>>8&255]^$s7[$y>>24&255]^$s8[$y>>16&255]^$s7[$w>>8&255];
+ push@k,$s5[$x>>16&255]^$s6[$x>>24&255]^$s7[$y>>8&255]^$s8[$y&255]^$s8[$x>>8&255];
+ $s=$y^$s5[$x>>16&255]^$s6[$x&255]^$s7[$x>>24&255]^$s8[$x>>8&255]^$s7[$w>>24&255];
+ $t=$w^$s5[$s>>24&255]^$s6[$s>>8&255]^$s7[$s>>16&255]^$s8[$s&255]^$s8[$w>>8&255];
+ $u=$x^$s5[$t&255]^$s6[$t>>8&255]^$s7[$t>>16&255]^$s8[$t>>24&255]^$s5[$w>>16&255];
+ $v=$z^$s5[$u>>8&255]^$s6[$u>>16&255]^$s7[$u&255]^$s8[$u>>24&255]^$s6[$w&255];
+ push@k,$s5[$u>>24&255]^$s6[$u>>16&255]^$s7[$t&255]^$s8[$t>>8&255]^$s5[$s&255];
+ push@k,$s5[$u>>8&255]^$s6[$u&255]^$s7[$t>>16&255]^$s8[$t>>24&255]^$s6[$t&255];
+ push@k,$s5[$v>>24&255]^$s6[$v>>16&255]^$s7[$s&255]^$s8[$s>>8&255]^$s7[$u>>24&255];
+ push@k,$s5[$v>>8&255]^$s6[$v&255]^$s7[$s>>16&255]^$s8[$s>>24&255]^$s8[$v>>16&255];
+ }
+
+ for (16..31) { $k[$_] &= 31 }
+ delete $cast5->{encrypt};
+ delete $cast5->{decrypt};
+ $cast5->{rounds} = length($key) <= 10 ? 12 : 16;
+ $cast5->{key} = \@k;
+ return $cast5;
+} # init
+
+sub encrypt {
+ use strict;
+ use integer;
+ my ($cast5, $block) = @_;
+ croak "Block size must be 8" if length($block) != 8;
+
+ my $encrypt = $cast5->{encrypt};
+ unless ($encrypt) {
+ my $key = $cast5->{key} or croak "Call init() first";
+ my $f = 'sub{my($l,$r,$i)=unpack"N2",$_[0];';
+
+ my ($l, $r) = qw( $l $r );
+ my ($op1, $op2, $op3) = qw( + ^ - );
+ foreach my $round (0 .. $cast5->{rounds}-1) {
+ my $km = $key->[$round];
+ my $kr = $key->[$round+16];
+
+ my $rot = "";
+ if ($kr) {
+ my $mask = ~(~0<<$kr) & 0xffffffff;
+ my $kr2 = 32-$kr;
+ $rot = "\$i=\$i<<$kr|\$i>>$kr2&$mask;"
+ }
+
+ $f .= "\$i=$km$op1$r;$rot$l^=((\$s1[\$i>>24&255]$op2\$s2[\$i>>16&255])$op3\$s3[\$i>>8&255])$op1\$s4[\$i&255];";
+ ($l, $r) = ($r, $l);
+ ($op1, $op2, $op3) = ($op2, $op3, $op1);
+ }
+
+ $f .= 'pack"N2",$r&0xffffffff,$l&0xffffffff}';
+ $cast5->{encrypt} = $encrypt = eval $f;
+ }
+
+ return $encrypt->($block);
+} # encrypt
+
+sub decrypt {
+ use strict;
+ use integer;
+ my ($cast5, $block) = @_;
+ croak "Block size must be 8" if length($block) != 8;
+
+ my $decrypt = $cast5->{decrypt};
+ unless ($decrypt) {
+ my $key = $cast5->{key} or croak "Call init() first";
+ my $rounds = $cast5->{rounds};
+ my $f = 'sub{my($r,$l,$i)=unpack"N2",$_[0];';
+
+ my ($l, $r) = qw( $r $l );
+ my ($op1, $op2, $op3) = qw( - + ^ );
+ foreach (1 .. $rounds%3) { ($op1, $op2, $op3) = ($op2, $op3, $op1) }
+ foreach my $round (1 .. $rounds) {
+ my $km = $key->[$rounds-$round];
+ my $kr = $key->[$rounds-$round+16];
+
+ my $rot = "";
+ if ($kr) {
+ my $mask = ~(~0<<$kr) & 0xffffffff;
+ my $kr2 = 32-$kr;
+ $rot = "\$i=\$i<<$kr|\$i>>$kr2&$mask;"
+ }
+
+ $f .= "\$i=$km$op1$r;$rot$l^=((\$s1[\$i>>24&255]$op2\$s2[\$i>>16&255])$op3\$s3[\$i>>8&255])$op1\$s4[\$i&255];";
+ ($l, $r) = ($r, $l);
+ ($op1, $op2, $op3) = ($op3, $op1, $op2);
+ }
+
+ $f .= 'pack"N2",$l&0xffffffff,$r&0xffffffff}';
+ $cast5->{decrypt} = $decrypt = eval $f;
+ }
+
+ return $decrypt->($block);
+} # decrypt
+
+# end CAST5_PP.pm
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/CBC.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/CBC.pm
new file mode 100755
index 00000000000..2de20af4d61
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/CBC.pm
@@ -0,0 +1,1050 @@
+package Crypt::CBC;
+
+use Digest::MD5 'md5';
+use Carp;
+use strict;
+use bytes;
+use vars qw($VERSION);
+$VERSION = '2.30';
+
+use constant RANDOM_DEVICE => '/dev/urandom';
+
+sub new {
+ my $class = shift;
+
+ my $options = {};
+
+ # hashref arguments
+ if (ref $_[0] eq 'HASH') {
+ $options = shift;
+ }
+
+ # CGI style arguments
+ elsif ($_[0] =~ /^-[a-zA-Z_]{1,20}$/) {
+ my %tmp = @_;
+ while ( my($key,$value) = each %tmp) {
+ $key =~ s/^-//;
+ $options->{lc $key} = $value;
+ }
+ }
+
+ else {
+ $options->{key} = shift;
+ $options->{cipher} = shift;
+ }
+
+ my $cipher_object_provided = $options->{cipher} && ref $options->{cipher};
+
+ # "key" is a misnomer here, because it is actually usually a passphrase that is used
+ # to derive the true key
+ my $pass = $options->{key};
+
+ if ($cipher_object_provided) {
+ carp "Both a key and a pre-initialized Crypt::* object were passed. The key will be ignored"
+ if defined $pass;
+ $pass ||= '';
+ }
+ elsif (!defined $pass) {
+ croak "Please provide an encryption/decryption passphrase or key using -key"
+ }
+
+ # header mode
+ my %valid_modes = map {$_=>1} qw(none salt randomiv);
+ my $header_mode = $options->{header};
+ $header_mode ||= 'none' if exists $options->{prepend_iv} && !$options->{prepend_iv};
+ $header_mode ||= 'none' if exists $options->{add_header} && !$options->{add_header};
+ $header_mode ||= 'salt'; # default
+ croak "Invalid -header mode '$header_mode'" unless $valid_modes{$header_mode};
+
+ croak "The -salt argument is incompatible with a -header mode of $header_mode"
+ if exists $options->{salt} && $header_mode ne 'salt';
+
+ my $cipher = $options->{cipher};
+ $cipher = 'Crypt::DES' unless $cipher;
+ my $cipherclass = ref $cipher || $cipher;
+
+ unless (ref $cipher) { # munge the class name if no object passed
+ $cipher = $cipher=~/^Crypt::/ ? $cipher : "Crypt::$cipher";
+ $cipher->can('encrypt') or eval "require $cipher; 1" or croak "Couldn't load $cipher: $@";
+ # some crypt modules use the class Crypt::, and others don't
+ $cipher =~ s/^Crypt::// unless $cipher->can('keysize');
+ }
+
+ # allow user to override these values
+ my $ks = $options->{keysize};
+ my $bs = $options->{blocksize};
+
+ # otherwise we get the values from the cipher
+ $ks ||= eval {$cipher->keysize};
+ $bs ||= eval {$cipher->blocksize};
+
+ # Some of the cipher modules are busted and don't report the
+ # keysize (well, Crypt::Blowfish in any case). If we detect
+ # this, and find the blowfish module in use, then assume 56.
+ # Otherwise assume the least common denominator of 8.
+ $ks ||= $cipherclass =~ /blowfish/i ? 56 : 8;
+ $bs ||= $ks;
+
+ my $pcbc = $options->{'pcbc'};
+
+ # Default behavior is to treat -key as a passphrase.
+ # But if the literal_key option is true, then use key as is
+ croak "The options -literal_key and -regenerate_key are incompatible with each other"
+ if exists $options->{literal_key} && exists $options->{regenerate_key};
+ my $key;
+ $key = $pass if $options->{literal_key};
+ $key = $pass if exists $options->{regenerate_key} && !$options->{regenerate_key};
+
+ # Get the salt.
+ my $salt = $options->{salt};
+ my $random_salt = 1 unless defined $salt && $salt ne '1';
+ croak "Argument to -salt must be exactly 8 bytes long" if defined $salt && length $salt != 8 && $salt ne '1';
+
+ # note: iv will be autogenerated by start() if not specified in options
+ my $iv = $options->{iv};
+ my $random_iv = 1 unless defined $iv;
+ croak "Initialization vector must be exactly $bs bytes long when using the $cipherclass cipher" if defined $iv and length($iv) != $bs;
+
+ my $literal_key = $options->{literal_key} || (exists $options->{regenerate_key} && !$options->{regenerate_key});
+ my $legacy_hack = $options->{insecure_legacy_decrypt};
+ my $padding = $options->{padding} || 'standard';
+
+ if ($padding && ref($padding) eq 'CODE') {
+ # check to see that this code does its padding correctly
+ for my $i (1..$bs-1) {
+ my $rbs = length($padding->(" "x$i,$bs,'e'));
+ croak "padding method callback does not behave properly: expected $bs bytes back, got $rbs bytes back."
+ unless ($rbs == $bs);
+ }
+ } else {
+ $padding = $padding eq 'null' ? \&_null_padding
+ :$padding eq 'space' ? \&_space_padding
+ :$padding eq 'oneandzeroes' ? \&_oneandzeroes_padding
+ :$padding eq 'rijndael_compat'? \&_rijndael_compat
+ :$padding eq 'standard' ? \&_standard_padding
+ :croak "'$padding' padding not supported. See perldoc Crypt::CBC for instructions on creating your own.";
+ }
+
+ # CONSISTENCY CHECKS
+ # HEADER consistency
+ if ($header_mode eq 'salt') {
+ croak "Cannot use salt-based key generation if literal key is specified"
+ if $options->{literal_key};
+ croak "Cannot use salt-based IV generation if literal IV is specified"
+ if exists $options->{iv};
+ }
+ elsif ($header_mode eq 'randomiv') {
+ croak "Cannot encrypt using a non-8 byte blocksize cipher when using randomiv header mode"
+ unless $bs == 8 || $legacy_hack;
+ }
+ elsif ($header_mode eq 'none') {
+ croak "You must provide an initialization vector using -iv when using -header=>'none'"
+ unless exists $options->{iv};
+ }
+
+ # KEYSIZE consistency
+ if (defined $key && length($key) != $ks) {
+ croak "If specified by -literal_key, then the key length must be equal to the chosen cipher's key length of $ks bytes";
+ }
+
+ # IV consistency
+ if (defined $iv && length($iv) != $bs) {
+ croak "If specified by -iv, then the initialization vector length must be equal to the chosen cipher's blocksize of $bs bytes";
+ }
+
+
+ return bless {'cipher' => $cipher,
+ 'passphrase' => $pass,
+ 'key' => $key,
+ 'iv' => $iv,
+ 'salt' => $salt,
+ 'padding' => $padding,
+ 'blocksize' => $bs,
+ 'keysize' => $ks,
+ 'header_mode' => $header_mode,
+ 'legacy_hack' => $legacy_hack,
+ 'literal_key' => $literal_key,
+ 'pcbc' => $pcbc,
+ 'make_random_salt' => $random_salt,
+ 'make_random_iv' => $random_iv,
+ },$class;
+}
+
+sub encrypt (\$$) {
+ my ($self,$data) = @_;
+ $self->start('encrypting');
+ my $result = $self->crypt($data);
+ $result .= $self->finish;
+ $result;
+}
+
+sub decrypt (\$$){
+ my ($self,$data) = @_;
+ $self->start('decrypting');
+ my $result = $self->crypt($data);
+ $result .= $self->finish;
+ $result;
+}
+
+sub encrypt_hex (\$$) {
+ my ($self,$data) = @_;
+ return join('',unpack 'H*',$self->encrypt($data));
+}
+
+sub decrypt_hex (\$$) {
+ my ($self,$data) = @_;
+ return $self->decrypt(pack'H*',$data);
+}
+
+# call to start a series of encryption/decryption operations
+sub start (\$$) {
+ my $self = shift;
+ my $operation = shift;
+ croak "Specify <e>ncryption or <d>ecryption" unless $operation=~/^[ed]/i;
+
+ $self->{'buffer'} = '';
+ $self->{'decrypt'} = $operation=~/^d/i;
+}
+
+# call to encrypt/decrypt a bit of data
+sub crypt (\$$){
+ my $self = shift;
+ my $data = shift;
+
+ my $result;
+
+ croak "crypt() called without a preceding start()"
+ unless exists $self->{'buffer'};
+
+ my $d = $self->{'decrypt'};
+
+ unless ($self->{civ}) { # block cipher has not yet been initialized
+ $result = $self->_generate_iv_and_cipher_from_datastream(\$data) if $d;
+ $result = $self->_generate_iv_and_cipher_from_options() unless $d;
+ }
+
+ my $iv = $self->{'civ'};
+ $self->{'buffer'} .= $data;
+
+ my $bs = $self->{'blocksize'};
+
+ croak "When using rijndael_compat padding, plaintext size must be a multiple of $bs"
+ if $self->{'padding'} eq \&_rijndael_compat
+ and length($data) % $bs;
+
+ return $result unless (length($self->{'buffer'}) >= $bs);
+
+ my @blocks = unpack("a$bs "x(int(length($self->{'buffer'})/$bs)) . "a*", $self->{'buffer'});
+ $self->{'buffer'} = '';
+
+ if ($d) { # when decrypting, always leave a free block at the end
+ $self->{'buffer'} = length($blocks[-1]) < $bs ? join '',splice(@blocks,-2) : pop(@blocks);
+ } else {
+ $self->{'buffer'} = pop @blocks if length($blocks[-1]) < $bs; # what's left over
+ }
+
+ foreach my $block (@blocks) {
+ if ($d) { # decrypting
+ $result .= $iv = $iv ^ $self->{'crypt'}->decrypt($block);
+ $iv = $block unless $self->{pcbc};
+ } else { # encrypting
+ $result .= $iv = $self->{'crypt'}->encrypt($iv ^ $block);
+ }
+ $iv = $iv ^ $block if $self->{pcbc};
+ }
+ $self->{'civ'} = $iv; # remember the iv
+ return $result;
+}
+
+# this is called at the end to flush whatever's left
+sub finish (\$) {
+ my $self = shift;
+ my $bs = $self->{'blocksize'};
+ my $block = defined $self->{'buffer'} ? $self->{'buffer'} : '';
+
+ $self->{civ} ||= '';
+
+ my $result;
+ if ($self->{'decrypt'}) { #decrypting
+ $block = length $block ? pack("a$bs",$block) : ''; # pad and truncate to block size
+
+ if (length($block)) {
+ $result = $self->{'civ'} ^ $self->{'crypt'}->decrypt($block);
+ $result = $self->{'padding'}->($result, $bs, 'd');
+ } else {
+ $result = '';
+ }
+
+ } else { # encrypting
+ $block = $self->{'padding'}->($block,$bs,'e') || '';
+ $result = length $block ? $self->{'crypt'}->encrypt($self->{'civ'} ^ $block) : '';
+ }
+ delete $self->{'civ'};
+ delete $self->{'buffer'};
+ return $result;
+}
+
+# this subroutine will generate the actual {en,de}cryption key, the iv
+# and the block cipher object. This is called when reading from a datastream
+# and so it uses previous values of salt or iv if they are encoded in datastream
+# header
+sub _generate_iv_and_cipher_from_datastream {
+ my $self = shift;
+ my $input_stream = shift;
+ my $bs = $self->blocksize;
+
+ # use our header mode to figure out what to do with the data stream
+ my $header_mode = $self->header_mode;
+
+ if ($header_mode eq 'none') {
+ croak "You must specify a $bs byte initialization vector by passing the -iv option to new() when using -header_mode=>'none'"
+ unless exists $self->{iv};
+ $self->{civ} = $self->{iv}; # current IV equals saved IV
+ $self->{key} ||= $self->_key_from_key($self->{passphrase});
+ }
+
+ elsif ($header_mode eq 'salt') {
+ my ($salt) = $$input_stream =~ /^Salted__(.{8})/s;
+ croak "Ciphertext does not begin with a valid header for 'salt' header mode" unless defined $salt;
+ $self->{salt} = $salt; # new salt
+ substr($$input_stream,0,16) = '';
+ my ($key,$iv) = $self->_salted_key_and_iv($self->{passphrase},$salt);
+ $self->{iv} = $self->{civ} = $iv;
+ $self->{key} = $key;
+ }
+
+ elsif ($header_mode eq 'randomiv') {
+ my ($iv) = $$input_stream =~ /^RandomIV(.{8})/s;
+ croak "Ciphertext does not begin with a valid header for 'randomiv' header mode" unless defined $iv;
+ croak "randomiv header mode cannot be used securely when decrypting with a >8 byte block cipher.\nUse the -insecure_legacy_decrypt flag if you are sure you want to do this" unless $self->blocksize == 8 || $self->legacy_hack;
+ $self->{iv} = $self->{civ} = $iv;
+ $self->{key} = $self->_key_from_key($self->{passphrase});
+ undef $self->{salt}; # paranoia
+ substr($$input_stream,0,16) = ''; # truncate
+ }
+
+ else {
+ croak "Invalid header mode '$header_mode'";
+ }
+
+ # we should have the key and iv now, or we are dead in the water
+ croak "Cipher stream did not contain IV or salt, and you did not specify these values in new()"
+ unless $self->{key} && $self->{civ};
+
+ # now we can generate the crypt object itself
+ $self->{crypt} = ref $self->{cipher} ? $self->{cipher}
+ : $self->{cipher}->new($self->{key})
+ or croak "Could not create $self->{cipher} object: $@";
+ return '';
+}
+
+sub _generate_iv_and_cipher_from_options {
+ my $self = shift;
+ my $blocksize = $self->blocksize;
+
+ my $result = '';
+
+ my $header_mode = $self->header_mode;
+ if ($header_mode eq 'none') {
+ croak "You must specify a $blocksize byte initialization vector by passing the -iv option to new() when using -header_mode=>'none'"
+ unless exists $self->{iv};
+ $self->{civ} = $self->{iv};
+ $self->{key} ||= $self->_key_from_key($self->{passphrase});
+ }
+
+ elsif ($header_mode eq 'salt') {
+ $self->{salt} = $self->_get_random_bytes(8) if $self->{make_random_salt};
+ defined (my $salt = $self->{salt}) or croak "No header_mode of 'salt' specified, but no salt value provided"; # shouldn't happen
+ length($salt) == 8 or croak "Salt must be exactly 8 bytes long";
+ my ($key,$iv) = $self->_salted_key_and_iv($self->{passphrase},$salt);
+ $self->{key} = $key;
+ $self->{civ} = $self->{iv} = $iv;
+ $result = "Salted__${salt}";
+ }
+
+ elsif ($header_mode eq 'randomiv') {
+ croak "randomiv header mode cannot be used when encrypting with a >8 byte block cipher. There is no option to allow this"
+ unless $blocksize == 8;
+ $self->{key} ||= $self->_key_from_key($self->{passphrase});
+ $self->{iv} = $self->_get_random_bytes(8) if $self->{make_random_iv};
+ length($self->{iv}) == 8 or croak "IV must be exactly 8 bytes long when used with header mode of 'randomiv'";
+ $self->{civ} = $self->{iv};
+ $result = "RandomIV$self->{iv}";
+ }
+
+ croak "key and/or iv are missing" unless defined $self->{key} && defined $self->{civ};
+
+ $self->_taintcheck($self->{key});
+ $self->{crypt} = ref $self->{cipher} ? $self->{cipher}
+ : $self->{cipher}->new($self->{key})
+ or croak "Could not create $self->{cipher} object: $@";
+ return $result;
+}
+
+sub _taintcheck {
+ my $self = shift;
+ my $key = shift;
+ return unless ${^TAINT};
+
+ my $has_scalar_util = eval "require Scalar::Util; 1";
+ my $tainted;
+
+ if ($has_scalar_util) {
+ $tainted = Scalar::Util::tainted($key);
+ } else {
+ local($@, $SIG{__DIE__}, $SIG{__WARN__});
+ local $^W = 0;
+ eval { kill 0 * $key };
+ $tainted = $@ =~ /^Insecure/;
+ }
+
+ croak "Taint checks are turned on and your key is tainted. Please untaint the key and try again"
+ if $tainted;
+}
+
+sub _key_from_key {
+ my $self = shift;
+ my $pass = shift;
+ my $ks = $self->{keysize};
+
+ return $pass if $self->{literal_key};
+
+ my $material = md5($pass);
+ while (length($material) < $ks) {
+ $material .= md5($material);
+ }
+ return substr($material,0,$ks);
+}
+
+sub _salted_key_and_iv {
+ my $self = shift;
+ my ($pass,$salt) = @_;
+
+ croak "Salt must be 8 bytes long" unless length $salt == 8;
+
+ my $key_len = $self->{keysize};
+ my $iv_len = $self->{blocksize};
+
+ my $desired_len = $key_len+$iv_len;
+
+ my $data = '';
+ my $d = '';
+
+ while (length $data < $desired_len) {
+ $d = md5($d . $pass . $salt);
+ $data .= $d;
+ }
+ return (substr($data,0,$key_len),substr($data,$key_len,$iv_len));
+}
+
+sub random_bytes {
+ my $self = shift;
+ my $bytes = shift or croak "usage: random_bytes(\$byte_length)";
+ $self->_get_random_bytes($bytes);
+}
+
+sub _get_random_bytes {
+ my $self = shift;
+ my $length = shift;
+ my $result;
+
+ if (-r RANDOM_DEVICE && open(F,RANDOM_DEVICE)) {
+ read(F,$result,$length);
+ close F;
+ } else {
+ $result = pack("C*",map {rand(256)} 1..$length);
+ }
+ # Clear taint and check length
+ $result =~ /^(.{$length})$/s or croak "Invalid length while gathering $length randim bytes";
+ return $1;
+}
+
+sub _standard_padding ($$$) {
+ my ($b,$bs,$decrypt) = @_;
+ $b = length $b ? $b : '';
+ if ($decrypt eq 'd') {
+ my $pad_length = unpack("C",substr($b,-1));
+
+ # sanity check for implementations that don't pad correctly
+ return $b unless $pad_length >= 0 && $pad_length <= $bs;
+ my @pad_chars = unpack("C*",substr($b,-$pad_length));
+ return $b if grep {$pad_length != $_} @pad_chars;
+
+ return substr($b,0,$bs-$pad_length);
+ }
+ my $pad = $bs - length($b) % $bs;
+ return $b . pack("C*",($pad)x$pad);
+}
+
+sub _space_padding ($$$) {
+ my ($b,$bs,$decrypt) = @_;
+ return unless length $b;
+ $b = length $b ? $b : '';
+ if ($decrypt eq 'd') {
+ $b=~ s/ *$//s;
+ return $b;
+ }
+ return $b . pack("C*", (32) x ($bs - length($b) % $bs));
+}
+
+sub _null_padding ($$$) {
+ my ($b,$bs,$decrypt) = @_;
+ return unless length $b;
+ $b = length $b ? $b : '';
+ if ($decrypt eq 'd') {
+ $b=~ s/\0*$//s;
+ return $b;
+ }
+ return $b . pack("C*", (0) x ($bs - length($b) % $bs));
+}
+
+sub _oneandzeroes_padding ($$$) {
+ my ($b,$bs,$decrypt) = @_;
+ $b = length $b ? $b : '';
+ if ($decrypt eq 'd') {
+ my $hex = unpack("H*", $b);
+ $hex =~ s/80*$//s;
+ return pack("H*", $hex);
+ }
+ return $b . pack("C*", 128, (0) x ($bs - length($b) % $bs - 1) );
+}
+
+sub _rijndael_compat ($$$) {
+ my ($b,$bs,$decrypt) = @_;
+ return unless length $b;
+ if ($decrypt eq 'd') {
+ my $hex = unpack("H*", $b);
+ $hex =~ s/80*$//s;
+ return pack("H*", $hex);
+ }
+ return $b . pack("C*", 128, (0) x ($bs - length($b) % $bs - 1) );
+}
+
+sub get_initialization_vector (\$) {
+ my $self = shift;
+ $self->iv();
+}
+
+sub set_initialization_vector (\$$) {
+ my $self = shift;
+ my $iv = shift;
+ my $bs = $self->blocksize;
+ croak "Initialization vector must be $bs bytes in length" unless length($iv) == $bs;
+ $self->iv($iv);
+}
+
+sub salt {
+ my $self = shift;
+ my $d = $self->{salt};
+ $self->{salt} = shift if @_;
+ $d;
+}
+
+sub iv {
+ my $self = shift;
+ my $d = $self->{iv};
+ $self->{iv} = shift if @_;
+ $d;
+}
+
+sub key {
+ my $self = shift;
+ my $d = $self->{key};
+ $self->{key} = shift if @_;
+ $d;
+}
+
+sub passphrase {
+ my $self = shift;
+ my $d = $self->{passphrase};
+ if (@_) {
+ undef $self->{key};
+ undef $self->{iv};
+ $self->{passphrase} = shift;
+ }
+ $d;
+}
+
+sub cipher { shift->{cipher} }
+sub padding { shift->{padding} }
+sub keysize { shift->{keysize} }
+sub blocksize { shift->{blocksize} }
+sub pcbc { shift->{pcbc} }
+sub header_mode {shift->{header_mode} }
+sub legacy_hack { shift->{legacy_hack} }
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::CBC - Encrypt Data with Cipher Block Chaining Mode
+
+=head1 SYNOPSIS
+
+ use Crypt::CBC;
+ $cipher = Crypt::CBC->new( -key => 'my secret key',
+ -cipher => 'Blowfish'
+ );
+
+ $ciphertext = $cipher->encrypt("This data is hush hush");
+ $plaintext = $cipher->decrypt($ciphertext);
+
+ $cipher->start('encrypting');
+ open(F,"./BIG_FILE");
+ while (read(F,$buffer,1024)) {
+ print $cipher->crypt($buffer);
+ }
+ print $cipher->finish;
+
+ # do-it-yourself mode -- specify key, initialization vector yourself
+ $key = Crypt::CBC->random_bytes(8); # assuming a 8-byte block cipher
+ $iv = Crypt::CBC->random_bytes(8);
+ $cipher = Crypt::CBC->new(-literal_key => 1,
+ -key => $key,
+ -iv => $iv,
+ -header => 'none');
+
+ $ciphertext = $cipher->encrypt("This data is hush hush");
+ $plaintext = $cipher->decrypt($ciphertext);
+
+ # RANDOMIV-compatible mode
+ $cipher = Crypt::CBC->new(-key => 'Super Secret!'
+ -header => 'randomiv');
+
+
+=head1 DESCRIPTION
+
+This module is a Perl-only implementation of the cryptographic cipher
+block chaining mode (CBC). In combination with a block cipher such as
+DES or IDEA, you can encrypt and decrypt messages of arbitrarily long
+length. The encrypted messages are compatible with the encryption
+format used by the B<OpenSSL> package.
+
+To use this module, you will first create a Crypt::CBC cipher object
+with new(). At the time of cipher creation, you specify an encryption
+key to use and, optionally, a block encryption algorithm. You will
+then call the start() method to initialize the encryption or
+decryption process, crypt() to encrypt or decrypt one or more blocks
+of data, and lastly finish(), to pad and encrypt the final block. For
+your convenience, you can call the encrypt() and decrypt() methods to
+operate on a whole data value at once.
+
+=head2 new()
+
+ $cipher = Crypt::CBC->new( -key => 'my secret key',
+ -cipher => 'Blowfish',
+ );
+
+ # or (for compatibility with versions prior to 2.13)
+ $cipher = Crypt::CBC->new( {
+ key => 'my secret key',
+ cipher => 'Blowfish'
+ }
+ );
+
+
+ # or (for compatibility with versions prior to 2.0)
+ $cipher = new Crypt::CBC('my secret key' => 'Blowfish');
+
+The new() method creates a new Crypt::CBC object. It accepts a list of
+-argument => value pairs selected from the following list:
+
+ Argument Description
+ -------- -----------
+
+ -key The encryption/decryption key (required)
+
+ -cipher The cipher algorithm (defaults to Crypt::DES), or
+ a preexisting cipher object.
+
+ -salt Enables OpenSSL-compatibility. If equal to a value
+ of "1" then causes a random salt to be generated
+ and used to derive the encryption key and IV. Other
+ true values are taken to be the literal salt.
+
+ -iv The initialization vector (IV)
+
+ -header What type of header to prepend to ciphertext. One of
+ 'salt' -- use OpenSSL-compatible salted header
+ 'randomiv' -- Randomiv-compatible "RandomIV" header
+ 'none' -- prepend no header at all
+
+ -padding The padding method, one of "standard" (default),
+ "space", "oneandzeroes", "rijndael_compat",
+ or "null" (default "standard").
+
+ -literal_key If true, the key provided by "key" is used directly
+ for encryption/decryption. Otherwise the actual
+ key used will be a hash of the provided key.
+ (default false)
+
+ -pcbc Whether to use the PCBC chaining algorithm rather than
+ the standard CBC algorithm (default false).
+
+ -keysize Force the cipher keysize to the indicated number of bytes.
+
+ -blocksize Force the cipher blocksize to the indicated number of bytes.
+
+ -insecure_legacy_decrypt
+ Allow decryption of data encrypted using the "RandomIV" header
+ produced by pre-2.17 versions of Crypt::CBC.
+
+ -add_header [deprecated; use -header instread]
+ Whether to add the salt and IV to the header of the output
+ cipher text.
+
+ -regenerate_key [deprecated; use literal_key instead]
+ Whether to use a hash of the provided key to generate
+ the actual encryption key (default true)
+
+ -prepend_iv [deprecated; use add_header instead]
+ Whether to prepend the IV to the beginning of the
+ encrypted stream (default true)
+
+Crypt::CBC requires three pieces of information to do its job. First
+it needs the name of the block cipher algorithm that will encrypt or
+decrypt the data in blocks of fixed length known as the cipher's
+"blocksize." Second, it needs an encryption/decryption key to pass to
+the block cipher. Third, it needs an initialization vector (IV) that
+will be used to propagate information from one encrypted block to the
+next. Both the key and the IV must be exactly the same length as the
+chosen cipher's blocksize.
+
+Crypt::CBC can derive the key and the IV from a passphrase that you
+provide, or can let you specify the true key and IV manually. In
+addition, you have the option of embedding enough information to
+regenerate the IV in a short header that is emitted at the start of
+the encrypted stream, or outputting a headerless encryption stream. In
+the first case, Crypt::CBC will be able to decrypt the stream given
+just the original key or passphrase. In the second case, you will have
+to provide the original IV as well as the key/passphrase.
+
+The B<-cipher> option specifies which block cipher algorithm to use to
+encode each section of the message. This argument is optional and
+will default to the quick-but-not-very-secure DES algorithm unless
+specified otherwise. You may use any compatible block encryption
+algorithm that you have installed. Currently, this includes
+Crypt::DES, Crypt::DES_EDE3, Crypt::IDEA, Crypt::Blowfish,
+Crypt::CAST5 and Crypt::Rijndael. You may refer to them using their
+full names ("Crypt::IDEA") or in abbreviated form ("IDEA").
+
+Instead of passing the name of a cipher class, you may pass an
+already-created block cipher object. This allows you to take advantage
+of cipher algorithms that have parameterized new() methods, such as
+Crypt::Eksblowfish:
+
+ my $eksblowfish = Crypt::Eksblowfish->new(8,$salt,$key);
+ my $cbc = Crypt::CBC->new(-cipher=>$eksblowfish);
+
+The B<-key> argument provides either a passphrase to use to generate
+the encryption key, or the literal value of the block cipher key. If
+used in passphrase mode (which is the default), B<-key> can be any
+number of characters; the actual key will be derived by passing the
+passphrase through a series of MD5 hash operations. To take full
+advantage of a given block cipher, the length of the passphrase should
+be at least equal to the cipher's blocksize. To skip this hashing
+operation and specify the key directly, pass a true value to the
+B<-literal_key> option. In this case, you should choose a key of
+length exactly equal to the cipher's key length. You should also
+specify the IV yourself and a -header mode of 'none'.
+
+If you pass an existing Crypt::* object to new(), then the -key
+argument is ignored and the module will generate a warning.
+
+The B<-header> argument specifies what type of header, if any, to
+prepend to the beginning of the encrypted data stream. The header
+allows Crypt::CBC to regenerate the original IV and correctly decrypt
+the data without your having to provide the same IV used to encrypt
+the data. Valid values for the B<-header> are:
+
+ "salt" -- Combine the passphrase with an 8-byte random value to
+ generate both the block cipher key and the IV from the
+ provided passphrase. The salt will be appended to the
+ beginning of the data stream allowing decryption to
+ regenerate both the key and IV given the correct passphrase.
+ This method is compatible with current versions of OpenSSL.
+
+ "randomiv" -- Generate the block cipher key from the passphrase, and
+ choose a random 8-byte value to use as the IV. The IV will
+ be prepended to the data stream. This method is compatible
+ with ciphertext produced by versions of the library prior to
+ 2.17, but is incompatible with block ciphers that have non
+ 8-byte block sizes, such as Rijndael. Crypt::CBC will exit
+ with a fatal error if you try to use this header mode with a
+ non 8-byte cipher.
+
+ "none" -- Do not generate a header. To decrypt a stream encrypted
+ in this way, you will have to provide the original IV
+ manually.
+
+B<The "salt" header is now the default as of Crypt::CBC version 2.17. In
+all earlier versions "randomiv" was the default.>
+
+When using a "salt" header, you may specify your own value of the
+salt, by passing the desired 8-byte salt to the B<-salt>
+argument. Otherwise, the module will generate a random salt for
+you. Crypt::CBC will generate a fatal error if you specify a salt
+value that isn't exactly 8 bytes long. For backward compatibility
+reasons, passing a value of "1" will generate a random salt, the same
+as if no B<-salt> argument was provided.
+
+The B<-padding> argument controls how the last few bytes of the
+encrypted stream are dealt with when they not an exact multiple of the
+cipher block length. The default is "standard", the method specified
+in PKCS#5.
+
+The B<-pcbc> argument, if true, activates a modified chaining mode
+known as PCBC. It provides better error propagation characteristics
+than the default CBC encryption and is required for authenticating to
+Kerberos4 systems (see RFC 2222).
+
+The B<-keysize> and B<-blocksize> arguments can be used to force the
+cipher's keysize and/or blocksize. This is only currently useful for
+the Crypt::Blowfish module, which accepts a variable length
+keysize. If -keysize is not specified, then Crypt::CBC will use the
+maximum length Blowfish key size of 56 bytes (448 bits). The Openssl
+library defaults to 16 byte Blowfish key sizes, so for compatibility
+with Openssl you may wish to set -keysize=>16. There are currently no
+Crypt::* modules that have variable block sizes, but an option to
+change the block size is provided just in case.
+
+For compatibility with earlier versions of this module, you can
+provide new() with a hashref containing key/value pairs. The key names
+are the same as the arguments described earlier, but without the
+initial hyphen. You may also call new() with one or two positional
+arguments, in which case the first argument is taken to be the key and
+the second to be the optional block cipher algorithm.
+
+B<IMPORTANT NOTE:> Versions of this module prior to 2.17 were
+incorrectly using 8-byte IVs when generating the "randomiv" style of
+header, even when the chosen cipher's blocksize was greater than 8
+bytes. This primarily affects the Rijndael algorithm. Such encrypted
+data streams were B<not secure>. From versions 2.17 onward, Crypt::CBC
+will refuse to encrypt or decrypt using the "randomiv" header and non-8
+byte block ciphers. To decrypt legacy data encrypted with earlier
+versions of the module, you can override the check using the
+B<-insecure_legacy_decrypt> option. It is not possible to override
+encryption. Please use the default "salt" header style, or no headers
+at all.
+
+=head2 start()
+
+ $cipher->start('encrypting');
+ $cipher->start('decrypting');
+
+The start() method prepares the cipher for a series of encryption or
+decryption steps, resetting the internal state of the cipher if
+necessary. You must provide a string indicating whether you wish to
+encrypt or decrypt. "E" or any word that begins with an "e" indicates
+encryption. "D" or any word that begins with a "d" indicates
+decryption.
+
+=head2 crypt()
+
+ $ciphertext = $cipher->crypt($plaintext);
+
+After calling start(), you should call crypt() as many times as
+necessary to encrypt the desired data.
+
+=head2 finish()
+
+ $ciphertext = $cipher->finish();
+
+The CBC algorithm must buffer data blocks inernally until they are
+even multiples of the encryption algorithm's blocksize (typically 8
+bytes). After the last call to crypt() you should call finish().
+This flushes the internal buffer and returns any leftover ciphertext.
+
+In a typical application you will read the plaintext from a file or
+input stream and write the result to standard output in a loop that
+might look like this:
+
+ $cipher = new Crypt::CBC('hey jude!');
+ $cipher->start('encrypting');
+ print $cipher->crypt($_) while <>;
+ print $cipher->finish();
+
+=head2 encrypt()
+
+ $ciphertext = $cipher->encrypt($plaintext)
+
+This convenience function runs the entire sequence of start(), crypt()
+and finish() for you, processing the provided plaintext and returning
+the corresponding ciphertext.
+
+=head2 decrypt()
+
+ $plaintext = $cipher->decrypt($ciphertext)
+
+This convenience function runs the entire sequence of start(), crypt()
+and finish() for you, processing the provided ciphertext and returning
+the corresponding plaintext.
+
+=head2 encrypt_hex(), decrypt_hex()
+
+ $ciphertext = $cipher->encrypt_hex($plaintext)
+ $plaintext = $cipher->decrypt_hex($ciphertext)
+
+These are convenience functions that operate on ciphertext in a
+hexadecimal representation. B<encrypt_hex($plaintext)> is exactly
+equivalent to B<unpack('H*',encrypt($plaintext))>. These functions
+can be useful if, for example, you wish to place the encrypted in an
+email message.
+
+=head2 get_initialization_vector()
+
+ $iv = $cipher->get_initialization_vector()
+
+This function will return the IV used in encryption and or decryption.
+The IV is not guaranteed to be set when encrypting until start() is
+called, and when decrypting until crypt() is called the first
+time. Unless the IV was manually specified in the new() call, the IV
+will change with every complete encryption operation.
+
+=head2 set_initialization_vector()
+
+ $cipher->set_initialization_vector('76543210')
+
+This function sets the IV used in encryption and/or decryption. This
+function may be useful if the IV is not contained within the
+ciphertext string being decrypted, or if a particular IV is desired
+for encryption. Note that the IV must match the chosen cipher's
+blocksize bytes in length.
+
+=head2 iv()
+
+ $iv = $cipher->iv();
+ $cipher->iv($new_iv);
+
+As above, but using a single method call.
+
+=head2 key()
+
+ $key = $cipher->key();
+ $cipher->key($new_key);
+
+Get or set the block cipher key used for encryption/decryption. When
+encrypting, the key is not guaranteed to exist until start() is
+called, and when decrypting, the key is not guaranteed to exist until
+after the first call to crypt(). The key must match the length
+required by the underlying block cipher.
+
+When salted headers are used, the block cipher key will change after
+each complete sequence of encryption operations.
+
+=head2 salt()
+
+ $salt = $cipher->salt();
+ $cipher->salt($new_salt);
+
+Get or set the salt used for deriving the encryption key and IV when
+in OpenSSL compatibility mode.
+
+=head2 passphrase()
+
+ $passphrase = $cipher->passphrase();
+ $cipher->passphrase($new_passphrase);
+
+This gets or sets the value of the B<key> passed to new() when
+B<literal_key> is false.
+
+=head2 $data = get_random_bytes($numbytes)
+
+Return $numbytes worth of random data. On systems that support the
+"/dev/urandom" device file, this data will be read from the
+device. Otherwise, it will be generated by repeated calls to the Perl
+rand() function.
+
+=head2 cipher(), padding(), keysize(), blocksize(), pcbc()
+
+These read-only methods return the identity of the chosen block cipher
+algorithm, padding method, key and block size of the chosen block
+cipher, and whether PCBC chaining is in effect.
+
+=head2 Padding methods
+
+Use the 'padding' option to change the padding method.
+
+When the last block of plaintext is shorter than the block size,
+it must be padded. Padding methods include: "standard" (i.e., PKCS#5),
+"oneandzeroes", "space", "rijndael_compat" and "null".
+
+ standard: (default) Binary safe
+ pads with the number of bytes that should be truncated. So, if
+ blocksize is 8, then "0A0B0C" will be padded with "05", resulting
+ in "0A0B0C0505050505". If the final block is a full block of 8
+ bytes, then a whole block of "0808080808080808" is appended.
+
+ oneandzeroes: Binary safe
+ pads with "80" followed by as many "00" necessary to fill the
+ block. If the last block is a full block and blocksize is 8, a
+ block of "8000000000000000" will be appended.
+
+ rijndael_compat: Binary safe, with caveats
+ similar to oneandzeroes, except that no padding is performed if
+ the last block is a full block. This is provided for
+ compatibility with Crypt::Rijndael only and can only be used
+ with messages that are a multiple of the Rijndael blocksize
+ of 16 bytes.
+
+ null: text only
+ pads with as many "00" necessary to fill the block. If the last
+ block is a full block and blocksize is 8, a block of
+ "0000000000000000" will be appended.
+
+ space: text only
+ same as "null", but with "20".
+
+Both the standard and oneandzeroes paddings are binary safe. The
+space and null paddings are recommended only for text data. Which
+type of padding you use depends on whether you wish to communicate
+with an external (non Crypt::CBC library). If this is the case, use
+whatever padding method is compatible.
+
+You can also pass in a custom padding function. To do this, create a
+function that takes the arguments:
+
+ $padded_block = function($block,$blocksize,$direction);
+
+where $block is the current block of data, $blocksize is the size to
+pad it to, $direction is "e" for encrypting and "d" for decrypting,
+and $padded_block is the result after padding or depadding.
+
+When encrypting, the function should always return a string of
+<blocksize> length, and when decrypting, can expect the string coming
+in to always be that length. See _standard_padding(), _space_padding(),
+_null_padding(), or _oneandzeroes_padding() in the source for examples.
+
+Standard and oneandzeroes padding are recommended, as both space and
+null padding can potentially truncate more characters than they should.
+
+=head1 EXAMPLES
+
+Two examples, des.pl and idea.pl can be found in the eg/ subdirectory
+of the Crypt-CBC distribution. These implement command-line DES and
+IDEA encryption algorithms.
+
+=head1 LIMITATIONS
+
+The encryption and decryption process is about a tenth the speed of
+the equivalent SSLeay programs (compiled C). This could be improved
+by implementing this module in C. It may also be worthwhile to
+optimize the DES and IDEA block algorithms further.
+
+=head1 BUGS
+
+Please report them.
+
+=head1 AUTHOR
+
+Lincoln Stein, lstein@cshl.org
+
+This module is distributed under the ARTISTIC LICENSE using the same
+terms as Perl itself.
+
+=head1 SEE ALSO
+
+perl(1), Crypt::DES(3), Crypt::IDEA(3), rfc2898 (PKCS#5)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/DES.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/DES.pm
new file mode 100755
index 00000000000..35ec11907cb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/DES.pm
@@ -0,0 +1,172 @@
+#
+# Copyright (C) 1995, 1996 Systemics Ltd (http://www.systemics.com/)
+# All rights reserved.
+#
+# Modifications are Copyright (c) 2000, W3Works, LLC
+# All Rights Reserved.
+
+package Crypt::DES;
+
+require Exporter;
+require DynaLoader;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+
+@ISA = qw(Exporter DynaLoader);
+
+# Items to export into callers namespace by default
+@EXPORT = qw();
+
+# Other items we are prepared to export if requested
+@EXPORT_OK = qw();
+
+$VERSION = '2.05';
+bootstrap Crypt::DES $VERSION;
+
+use strict;
+use Carp;
+
+sub usage
+{
+ my ($package, $filename, $line, $subr) = caller(1);
+ $Carp::CarpLevel = 2;
+ croak "Usage: $subr(@_)";
+}
+
+
+sub blocksize { 8; }
+sub keysize { 8; }
+
+sub new
+{
+ usage("new DES key") unless @_ == 2;
+
+ my $type = shift;
+ my $self = {};
+ bless $self, $type;
+
+ $self->{'ks'} = Crypt::DES::expand_key(shift);
+
+ return $self;
+}
+
+sub encrypt
+{
+ usage("encrypt data[8 bytes]") unless @_ == 2;
+
+ my ($self,$data) = @_;
+ return Crypt::DES::crypt($data, $data, $self->{'ks'}, 1);
+}
+
+sub decrypt
+{
+ usage("decrypt data[8 bytes]") unless @_ == 2;
+
+ my ($self,$data) = @_;
+ return Crypt::DES::crypt($data, $data, $self->{'ks'}, 0);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Crypt::DES - Perl DES encryption module
+
+=head1 SYNOPSIS
+
+ use Crypt::DES;
+
+
+=head1 DESCRIPTION
+
+The module implements the Crypt::CBC interface,
+which has the following methods
+
+=over 4
+
+=item blocksize
+=item keysize
+=item encrypt
+=item decrypt
+
+=back
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item blocksize
+
+Returns the size (in bytes) of the block cipher.
+
+=item keysize
+
+Returns the size (in bytes) of the key. Optimal size is 8 bytes.
+
+=item new
+
+ my $cipher = new Crypt::DES $key;
+
+This creates a new Crypt::DES BlockCipher object, using $key,
+where $key is a key of C<keysize()> bytes.
+
+=item encrypt
+
+ my $cipher = new Crypt::DES $key;
+ my $ciphertext = $cipher->encrypt($plaintext);
+
+This function encrypts $plaintext and returns the $ciphertext
+where $plaintext and $ciphertext should be of C<blocksize()> bytes.
+
+=item decrypt
+
+ my $cipher = new Crypt::DES $key;
+ my $plaintext = $cipher->decrypt($ciphertext);
+
+This function decrypts $ciphertext and returns the $plaintext
+where $plaintext and $ciphertext should be of C<blocksize()> bytes.
+
+=back
+
+=head1 EXAMPLE
+
+ my $key = pack("H16", "0123456789ABCDEF");
+ my $cipher = new Crypt::DES $key;
+ my $ciphertext = $cipher->encrypt("plaintex"); # NB - 8 bytes
+ print unpack("H16", $ciphertext), "\n";
+
+=head1 NOTES
+
+Do note that DES only uses 8 byte keys and only works on 8 byte data
+blocks. If you're intending to encrypt larger blocks or entire files,
+please use Crypt::CBC in conjunction with this module. See the
+Crypt::CBC documentation for proper syntax and use.
+
+Also note that the DES algorithm is, by today's standard, weak
+encryption. Crypt::Blowfish is highly recommended if you're
+interested in using strong encryption and a faster algorithm.
+
+=head1 SEE ALSO
+
+Crypt::Blowfish
+Crypt::IDEA
+
+Bruce Schneier, I<Applied Cryptography>, 1995, Second Edition,
+published by John Wiley & Sons, Inc.
+
+=head1 COPYRIGHT
+
+The implementation of the DES algorithm was developed by,
+and is copyright of, Eric Young (eay@mincom.oz.au).
+Other parts of the perl extension and module are
+copyright of Systemics Ltd ( http://www.systemics.com/ ).
+Cross-platform work and packaging for single algorithm
+distribution is copyright of W3Works, LLC.
+
+=head1 MAINTAINER
+
+This single-algorithm package and cross-platform code is
+maintained by Dave Paris <amused@pobox.com>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/DH.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/DH.pm
new file mode 100755
index 00000000000..b9f3ecf0d80
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/DH.pm
@@ -0,0 +1,250 @@
+# $Id: DH.pm 1860 2005-06-11 06:15:44Z btrott $
+
+package Crypt::DH;
+use strict;
+
+use Math::BigInt lib => "GMP,Pari";
+our $VERSION = '0.06';
+
+sub new {
+ my $class = shift;
+ my $dh = bless {}, $class;
+
+ my %param = @_;
+ for my $w (qw( p g priv_key )) {
+ next unless exists $param{$w};
+ $dh->$w(delete $param{$w});
+ }
+ die "Unknown parameters to constructor: " . join(", ", keys %param) if %param;
+
+ $dh;
+}
+
+BEGIN {
+ no strict 'refs';
+ for my $meth (qw( p g pub_key priv_key )) {
+ *$meth = sub {
+ my $key = shift;
+ if (@_) {
+ $key->{$meth} = _any2bigint(shift);
+ }
+ my $ret = $key->{$meth} || "";
+ $ret;
+ };
+ }
+}
+
+sub _any2bigint {
+ my($value) = @_;
+ if (ref $value eq 'Math::BigInt') {
+ return $value;
+ }
+ elsif (ref $value eq 'Math::Pari') {
+ return Math::BigInt->new(Math::Pari::pari2pv($value));
+ }
+ elsif (defined $value && !(ref $value)) {
+ return Math::BigInt->new($value);
+ }
+ elsif (defined $value) {
+ die "Unknown parameter type: $value\n";
+ }
+}
+
+sub generate_keys {
+ my $dh = shift;
+
+ unless (defined $dh->{priv_key}) {
+ my $i = _bitsize($dh->{p}) - 1;
+ $dh->{priv_key} =
+ $Crypt::Random::VERSION ?
+ Crypt::Random::makerandom_itv(Strength => 0, Uniform => 1,
+ Lower => 1, Upper => $dh->{p} - 1) :
+ _makerandom_itv($i, 1, $dh->{p} - 1);
+ }
+
+ $dh->{pub_key} = $dh->{g}->copy->bmodpow($dh->{priv_key}, $dh->{p});
+}
+
+sub compute_key {
+ my $dh = shift;
+ my $pub_key = _any2bigint(shift);
+ $pub_key->copy->bmodpow($dh->{priv_key}, $dh->{p});
+}
+*compute_secret = \&compute_key;
+
+sub _bitsize {
+ return length($_[0]->as_bin) - 2;
+}
+
+sub _makerandom_itv {
+ my ($size, $min_inc, $max_exc) = @_;
+
+ while (1) {
+ my $r = _makerandom($size);
+ return $r if $r >= $min_inc && $r < $max_exc;
+ }
+}
+
+sub _makerandom {
+ my $size = shift;
+
+ my $bytes = int($size / 8) + ($size % 8 ? 1 : 0);
+
+ my $rand;
+ if (-e "/dev/urandom") {
+ my $fh;
+ open($fh, '/dev/urandom')
+ or die "Couldn't open /dev/urandom";
+ my $got = sysread $fh, $rand, $bytes;
+ die "Didn't read all bytes from urandom" unless $got == $bytes;
+ close $fh;
+ } else {
+ for (1..$bytes) {
+ $rand .= chr(int(rand(256)));
+ }
+ }
+
+ my $bits = unpack("b*", $rand);
+ die unless length($bits) >= $size;
+
+ Math::BigInt->new('0b' . substr($bits, 0, $size));
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::DH - Diffie-Hellman key exchange system
+
+=head1 SYNOPSIS
+
+ use Crypt::DH;
+ my $dh = Crypt::DH->new;
+ $dh->g($g);
+ $dh->p($p);
+
+ ## Generate public and private keys.
+ $dh->generate_keys;
+
+ $my_pub_key = $dh->pub_key;
+
+ ## Send $my_pub_key to "other" party, and receive "other"
+ ## public key in return.
+
+ ## Now compute shared secret from "other" public key.
+ my $shared_secret = $dh->compute_secret( $other_pub_key );
+
+=head1 DESCRIPTION
+
+I<Crypt::DH> is a Perl implementation of the Diffie-Hellman key
+exchange system. Diffie-Hellman is an algorithm by which two
+parties can agree on a shared secret key, known only to them.
+The secret is negotiated over an insecure network without the
+two parties ever passing the actual shared secret, or their
+private keys, between them.
+
+=head1 THE ALGORITHM
+
+The algorithm generally works as follows: Party A and Party B
+choose a property I<p> and a property I<g>; these properties are
+shared by both parties. Each party then computes a random private
+key integer I<priv_key>, where the length of I<priv_key> is at
+most (number of bits in I<p>) - 1. Each party then computes a
+public key based on I<g>, I<priv_key>, and I<p>; the exact value
+is
+
+ g ^ priv_key mod p
+
+The parties exchange these public keys.
+
+The shared secret key is generated based on the exchanged public
+key, the private key, and I<p>. If the public key of Party B is
+denoted I<pub_key_B>, then the shared secret is equal to
+
+ pub_key_B ^ priv_key mod p
+
+The mathematical principles involved insure that both parties will
+generate the same shared secret key.
+
+More information can be found in PKCS #3 (Diffie-Hellman Key
+Agreement Standard):
+
+ http://www.rsasecurity.com/rsalabs/pkcs/pkcs-3/
+
+=head1 USAGE
+
+I<Crypt::DH> implements the core routines needed to use
+Diffie-Hellman key exchange. To actually use the algorithm,
+you'll need to start with values for I<p> and I<g>; I<p> is a
+large prime, and I<g> is a base which must be larger than 0
+and less than I<p>.
+
+I<Crypt::DH> uses I<Math::BigInt> internally for big-integer
+calculations. All accessor methods (I<p>, I<g>, I<priv_key>, and
+I<pub_key>) thus return I<Math::BigInt> objects, as does the
+I<compute_secret> method. The accessors, however, allow setting with a
+scalar decimal string, hex string (^0x), Math::BigInt object, or
+Math::Pari object (for backwards compatibility).
+
+=head2 $dh = Crypt::DH->new([ %param ]).
+
+Constructs a new I<Crypt::DH> object and returns the object.
+I<%param> may include none, some, or all of the keys I<p>, I<g>, and
+I<priv_key>.
+
+=head2 $dh->p([ $p ])
+
+Given an argument I<$p>, sets the I<p> parameter (large prime) for
+this I<Crypt::DH> object.
+
+Returns the current value of I<p>. (as a Math::BigInt object)
+
+=head2 $dh->g([ $g ])
+
+Given an argument I<$g>, sets the I<g> parameter (base) for
+this I<Crypt::DH> object.
+
+Returns the current value of I<g>.
+
+=head2 $dh->generate_keys
+
+Generates the public and private key portions of the I<Crypt::DH>
+object, assuming that you've already filled I<p> and I<g> with
+appropriate values.
+
+If you've provided a priv_key, it's used, otherwise a random priv_key
+is created using either Crypt::Random (if already loaded), or
+/dev/urandom, or Perl's rand, in that order.
+
+=head2 $dh->compute_secret( $public_key )
+
+Given the public key I<$public_key> of Party B (the party with which
+you're performing key negotiation and exchange), computes the shared
+secret key, based on that public key, your own private key, and your
+own large prime value (I<p>).
+
+The historical method name "compute_key" is aliased to this for
+compatibility.
+
+=head2 $dh->priv_key([ $priv_key ])
+
+Returns the private key. Given an argument I<$priv_key>, sets the
+I<priv_key> parameter for this I<Crypt::DH> object.
+
+=head2 $dh->pub_key
+
+Returns the public key.
+
+=head1 AUTHOR & COPYRIGHT
+
+Benjamin Trott, ben@rhumba.pair.com
+
+Brad Fitzpatrick, brad@danga.com
+
+Except where otherwise noted, Crypt::DH is Copyright 2001
+Benjamin Trott. All rights reserved. Crypt::DH is free
+software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/DSA.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA.pm
new file mode 100755
index 00000000000..9ef5199103a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA.pm
@@ -0,0 +1,297 @@
+package Crypt::DSA;
+
+use 5.005;
+use strict;
+use Digest::SHA1 qw( sha1 );
+use Carp qw( croak );
+use Crypt::DSA::KeyChain;
+use Crypt::DSA::Key;
+use Crypt::DSA::Signature;
+use Crypt::DSA::Util qw( bitsize bin2mp mod_inverse mod_exp makerandom );
+
+use vars qw( $VERSION );
+BEGIN {
+ $VERSION = '1.16';
+}
+
+sub new {
+ my $class = shift;
+ my $dsa = bless { @_ }, $class;
+ $dsa->{_keychain} = Crypt::DSA::KeyChain->new(@_);
+ $dsa;
+}
+
+sub keygen {
+ my $dsa = shift;
+ my $key = $dsa->{_keychain}->generate_params(@_);
+ $dsa->{_keychain}->generate_keys($key);
+ $key;
+}
+
+sub sign {
+ my $dsa = shift;
+ my %param = @_;
+ my($key, $dgst);
+ croak __PACKAGE__, "->sign: Need a Key" unless $key = $param{Key};
+ unless ($dgst = $param{Digest}) {
+ croak __PACKAGE__, "->sign: Need either Message or Digest"
+ unless $param{Message};
+ $dgst = sha1($param{Message});
+ }
+ my $dlen = length $dgst;
+
+ my $i = bitsize($key->q) / 8;
+ croak "Data too large for key size"
+ if $dlen > $i || $dlen > 50;
+
+ $dsa->_sign_setup($key)
+ unless $key->kinv && $key->r;
+
+ my $m = bin2mp($dgst);
+ my $xr = ($key->priv_key * $key->r) % $key->q;
+ my $s = $xr + $m;
+ $s -= $key->q if $s > $key->q;
+ $s = ($s * $key->kinv) % $key->q;
+
+ my $sig = Crypt::DSA::Signature->new;
+ $sig->r($key->r);
+ $sig->s($s);
+ $sig;
+}
+
+sub _sign_setup {
+ my $dsa = shift;
+ my $key = shift;
+ my($k, $r);
+ {
+ $k = makerandom(Size => bitsize($key->q));
+ $k -= $key->q if $k >= $key->q;
+ redo if $k == 0;
+ }
+ $r = mod_exp($key->g, $k, $key->p);
+ $r %= $key->q;
+ my $kinv = mod_inverse($k, $key->q);
+ $key->r($r);
+ $key->kinv($kinv);
+}
+
+sub verify {
+ my $dsa = shift;
+ my %param = @_;
+ my($key, $dgst, $sig);
+ croak __PACKAGE__, "->verify: Need a Key" unless $key = $param{Key};
+ unless ($dgst = $param{Digest}) {
+ croak __PACKAGE__, "->verify: Need either Message or Digest"
+ unless $param{Message};
+ $dgst = sha1($param{Message});
+ }
+ croak __PACKAGE__, "->verify: Need a Signature"
+ unless $sig = $param{Signature};
+ my $u2 = mod_inverse($sig->s, $key->q);
+ my $u1 = bin2mp($dgst);
+ $u1 = ($u1 * $u2) % $key->q;
+ $u2 = ($sig->r * $u2) % $key->q;
+ my $t1 = mod_exp($key->g, $u1, $key->p);
+ my $t2 = mod_exp($key->pub_key, $u2, $key->p);
+ $u1 = ($t1 * $t2) % $key->p;
+ $u1 %= $key->q;
+ $u1 == $sig->r;
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Crypt::DSA - DSA Signatures and Key Generation
+
+=head1 SYNOPSIS
+
+ use Crypt::DSA;
+ my $dsa = Crypt::DSA->new;
+
+ my $key = $dsa->keygen(
+ Size => 512,
+ Seed => $seed,
+ Verbosity => 1
+ );
+
+ my $sig = $dsa->sign(
+ Message => "foo bar",
+ Key => $key
+ );
+
+ my $verified = $dsa->verify(
+ Message => "foo bar",
+ Signature => $sig,
+ Key => $key,
+ );
+
+=head1 DESCRIPTION
+
+I<Crypt::DSA> is an implementation of the DSA (Digital Signature
+Algorithm) signature verification system. The implementation
+itself is pure Perl, although the heavy-duty mathematics underneath
+are provided by the I<Math::Pari> library.
+
+This package provides DSA signing, signature verification, and key
+generation.
+
+=head1 USAGE
+
+The I<Crypt::DSA> public interface is similar to that of
+I<Crypt::RSA>. This was done intentionally.
+
+=head2 Crypt::DSA->new
+
+Constructs a new I<Crypt::DSA> object. At the moment this isn't
+particularly useful in itself, other than being the object you
+need to do much else in the system.
+
+Returns the new object.
+
+=head2 $key = $dsa->keygen(%arg)
+
+Generates a new set of DSA keys, including both the public and
+private portions of the key.
+
+I<%arg> can contain:
+
+=over 4
+
+=item * Size
+
+The size in bits of the I<p> value to generate. The I<q> and
+I<g> values are always 160 bits each.
+
+This argument is mandatory.
+
+=item * Seed
+
+A seed with which I<q> generation will begin. If this seed does
+not lead to a suitable prime, it will be discarded, and a new
+random seed chosen in its place, until a suitable prime can be
+found.
+
+This is entirely optional, and if not provided a random seed will
+be generated automatically.
+
+=item * Verbosity
+
+Should be either 0 or 1. A value of 1 will give you a progress
+meter during I<p> and I<q> generation--this can be useful, since
+the process can be relatively long.
+
+The default is 0.
+
+=back
+
+=head2 $signature = $dsa->sign(%arg)
+
+Signs a message (or the digest of a message) using the private
+portion of the DSA key and returns the signature.
+
+The return value--the signature--is a I<Crypt::DSA::Signature>
+object.
+
+I<%arg> can include:
+
+=over 4
+
+=item * Digest
+
+A digest to be signed. The digest should be 20 bytes in length
+or less.
+
+You must provide either this argument or I<Message> (see below).
+
+=item * Key
+
+The I<Crypt::DSA::Key> object with which the signature will be
+generated. Should contain a private key attribute (I<priv_key>).
+
+This argument is required.
+
+=item * Message
+
+A plaintext message to be signed. If you provide this argument,
+I<sign> will first produce a SHA1 digest of the plaintext, then
+use that as the digest to sign. Thus writing
+
+ my $sign = $dsa->sign(Message => $message, ... );
+
+is a shorter way of writing
+
+ use Digest::SHA1 qw( sha1 );
+ my $sig = $dsa->sign(Digest => sha1( $message ), ... );
+
+=back
+
+=head2 $verified = $dsa->verify(%arg)
+
+Verifies a signature generated with I<sign>. Returns a true
+value on success and false on failure.
+
+I<%arg> can contain:
+
+=over 4
+
+=item * Key
+
+Key of the signer of the message; a I<Crypt::DSA::Key> object.
+The public portion of the key is used to verify the signature.
+
+This argument is required.
+
+=item * Signature
+
+The signature itself. Should be in the same format as returned
+from I<sign>, a I<Crypt::DSA::Signature> object.
+
+This argument is required.
+
+=item * Digest
+
+The original signed digest whose length is less than or equal to
+20 bytes.
+
+Either this argument or I<Message> (see below) must be present.
+
+=item * Message
+
+As above in I<sign>, the plaintext message that was signed, a
+string of arbitrary length. A SHA1 digest of this message will
+be created and used in the verification process.
+
+=back
+
+=head1 TODO
+
+Add ability to munge format of keys. For example, read/write keys
+from/to key files (SSH key files, etc.), and also write them in
+other formats.
+
+=head1 SUPPORT
+
+Bugs should be reported via the CPAN bug tracker at
+
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Crypt-DSA>
+
+For other issues, contact the author.
+
+=head1 AUTHOR
+
+Benjamin Trott E<lt>ben@sixapart.comE<gt>
+
+=head1 COPYRIGHT
+
+Except where otherwise noted,
+Crypt::DSA is Copyright 2006 - 2009 Benjamin Trott.
+
+Crypt::DSA is free software; you may redistribute it
+and/or modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Key.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Key.pm
new file mode 100755
index 00000000000..69ded9debdd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Key.pm
@@ -0,0 +1,230 @@
+package Crypt::DSA::Key;
+
+use strict;
+use Math::BigInt 1.78 try => 'GMP, Pari';
+use Carp qw( croak );
+use Crypt::DSA::Util qw( bitsize );
+
+
+
+use vars qw{$VERSION};
+BEGIN {
+ $VERSION = '1.16';
+}
+
+sub new {
+ my $class = shift;
+ my %param = @_;
+ my $key = bless { }, $class;
+
+ if ($param{Filename} || $param{Content}) {
+ if ($param{Filename} && $param{Content}) {
+ croak "Filename and Content are mutually exclusive.";
+ }
+ return $key->read(%param);
+ }
+ $key;
+}
+
+sub size { bitsize($_[0]->p) }
+
+BEGIN {
+ no strict 'refs';
+ for my $meth (qw( p q g pub_key priv_key r kinv )) {
+ *$meth = sub {
+ my($key, $value) = @_;
+ if (ref $value eq 'Math::Pari') {
+ $key->{$meth} = Math::Pari::pari2pv($value);
+ }
+ elsif (ref $value) {
+ $key->{$meth} = "$value";
+ }
+ elsif ($value) {
+ if ($value =~ /^0x/) {
+ $key->{$meth} = Math::BigInt->new($value)->bstr;
+ }
+ else {
+ $key->{$meth} = $value;
+ }
+ } elsif (@_ > 1 && !defined $value) {
+ delete $key->{$meth};
+ }
+ my $ret = $key->{$meth} || "";
+ $ret = Math::BigInt->new("$ret") if $ret =~ /^\d+$/;
+ $ret;
+ };
+ }
+}
+
+sub read {
+ my $key = shift;
+ my %param = @_;
+ my $type = $param{Type} or croak "read: Need a key file 'Type'";
+ my $class = join '::', __PACKAGE__, $type;
+ eval "use $class;";
+ croak "Invalid key file type '$type': $@" if $@;
+ bless $key, $class;
+ local *FH;
+ if (my $fname = delete $param{Filename}) {
+ open FH, $fname or return;
+ my $blob = do { local $/; <FH> };
+ close FH;
+ $param{Content} = $blob;
+ }
+ $key->deserialize(%param);
+}
+
+sub write {
+ my $key = shift;
+ my %param = @_;
+ my $type;
+ unless ($type = $param{Type}) {
+ my $pkg = __PACKAGE__;
+ ($type) = ref($key) =~ /^${pkg}::(\w+)$/;
+ }
+ croak "write: Need a key file 'Type'" unless $type;
+ my $class = join '::', __PACKAGE__, $type;
+ eval "use $class;";
+ croak "Invalid key file type '$type': $@" if $@;
+ bless $key, $class;
+ my $blob = $key->serialize(%param);
+ if (my $fname = delete $param{Filename}) {
+ local *FH;
+ open FH, ">$fname" or croak "Can't open $fname: $!";
+ print FH $blob;
+ close FH;
+ }
+ $blob;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::DSA::Key - DSA key
+
+=head1 SYNOPSIS
+
+ use Crypt::DSA::Key;
+ my $key = Crypt::DSA::Key->new;
+
+ $key->p($p);
+
+=head1 DESCRIPTION
+
+I<Crypt::DSA::Key> contains a DSA key, both the public and
+private portions. Subclasses of I<Crypt::DSA::Key> implement
+I<read> and I<write> methods, such that you can store DSA
+keys on disk, and read them back into your application.
+
+=head1 USAGE
+
+Any of the key attributes can be accessed through combination
+get/set methods. The key attributes are: I<p>, I<q>, I<g>,
+I<priv_key>, and I<pub_key>. For example:
+
+ $key->p($p);
+ my $p2 = $key->p;
+
+=head2 $key = Crypt::DSA::Key->new(%arg)
+
+Creates a new (empty) key object. All of the attributes are
+initialized to 0.
+
+Alternately, if you provide the I<Filename> parameter (see
+below), the key will be read in from disk. If you provide
+the I<Type> parameter (mandatory if I<Filename> is provided),
+be aware that your key will actually be blessed into a subclass
+of I<Crypt::DSA::Key>. Specifically, it will be the class
+implementing the specific read functionality for that type,
+eg. I<Crypt::DSA::Key::PEM>.
+
+Returns the key on success, C<undef> otherwise. (See I<Password>
+for one reason why I<new> might return C<undef>).
+
+I<%arg> can contain:
+
+=over 4
+
+=item * Type
+
+The type of file where the key is stored. Currently the only
+option is I<PEM>, which indicates a PEM file (optionally
+encrypted, ASN.1-encoded object). Support for reading/writing
+PEM files comes from I<Convert::PEM>; if you don't have this
+module installed, the I<new> method will die.
+
+This argument is mandatory, I<if> you're either reading the file from
+disk (ie. you provide a I<Filename> argument) or you've specified the
+I<Content> argument.
+
+=item * Filename
+
+The location of the file from which you'd like to read the key.
+Requires a I<Type> argument so the decoder knows what type of file it
+is. You can't specify I<Content> and I<Filename> at the same time.
+
+=item * Content
+
+The serialized version of the key. Requires a I<Type> argument so the
+decoder knows how to decode it. You can't specify I<Content> and
+I<Filename> at the same time.
+
+=item * Password
+
+If your key file is encrypted, you'll need to supply a
+passphrase to decrypt it. You can do that here.
+
+If your passphrase is incorrect, I<new> will return C<undef>.
+
+=back
+
+=head2 $key->write(%arg)
+
+Writes a key (optionally) to disk, using a format that you
+define with the I<Type> parameter.
+
+If your I<$key> object has a defined I<priv_key> (private key portion),
+the key will be written as a DSA private key object; otherwise, it will
+be written out as a public key. Note that not all serialization mechanisms
+can produce public keys in this version--currently, only PEM public keys
+are supported.
+
+I<%arg> can include:
+
+=over 4
+
+=item * Type
+
+The type of file format that you wish to write. I<PEM> is one
+example (in fact, currently, it's the only example).
+
+This argument is mandatory, I<unless> your I<$key> object is
+already blessed into a subclass (eg. I<Crypt::DSA::Key::PEM>),
+and you wish to write the file using the same subclass.
+
+=item * Filename
+
+The location of the file on disk where you want the key file
+to be written.
+
+=item * Password
+
+If you want the key file to be encrypted, provide this
+argument, and the ASN.1-encoded string will be encrypted using
+the passphrase as a key.
+
+=back
+
+=head2 $key->size
+
+Returns the size of the key, in bits. This is actually the
+number of bits in the large prime I<p>.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::DSA manpage for author, copyright,
+and license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Key/PEM.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Key/PEM.pm
new file mode 100755
index 00000000000..b760cc40317
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Key/PEM.pm
@@ -0,0 +1,178 @@
+package Crypt::DSA::Key::PEM;
+
+use strict;
+use Carp qw( croak );
+use Convert::PEM;
+use Crypt::DSA::Key;
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '1.16';
+ @ISA = 'Crypt::DSA::Key';
+}
+
+sub deserialize {
+ my $key = shift;
+ my %param = @_;
+ $param{Content} =~ /DSA PRIVATE KEY/ ?
+ $key->_deserialize_privkey(%param) :
+ $key->_deserialize_pubkey(%param);
+}
+
+sub _deserialize_privkey {
+ my $key = shift;
+ my %param = @_;
+
+ my $pem = $key->_pem;
+ my $pkey = $pem->decode( Content => $param{Content},
+ Password => $param{Password},
+ Macro => 'DSAPrivateKey' );
+ return unless $pkey;
+
+ for my $m (qw( p q g pub_key priv_key )) {
+ $key->$m( $pkey->{$m} );
+ }
+ $key;
+}
+
+sub _deserialize_pubkey {
+ my $key = shift;
+ my %param = @_;
+
+ my $pem = $key->_pem;
+ my $pkey = $pem->decode( Content => $param{Content},
+ Password => $param{Password},
+ Macro => 'DSAPublicKey',
+ Name => 'PUBLIC KEY' );
+ return unless $pkey;
+
+ my $asn = $pem->asn->find('DSAPubKeyInner');
+ my $num = $asn->decode($pkey->{pub_key}[0]) or croak $asn->{error};
+
+ for my $m (qw( p q g )) {
+ $key->$m( $pkey->{inner}{DSAParams}{$m} );
+ }
+ $key->pub_key($num);
+
+ $key;
+}
+
+sub serialize {
+ my $key = shift;
+ ## If this is a private key (has the private key portion), serialize
+ ## it as a private key; otherwise use a public key ASN.1 object.
+ $key->priv_key ? $key->_serialize_privkey(@_) : $key->_serialize_pubkey(@_);
+}
+
+sub _serialize_privkey {
+ my $key = shift;
+ my %param = @_;
+
+ my $pkey = { version => 0 };
+ for my $m (qw( p q g pub_key priv_key )) {
+ $pkey->{$m} = $key->$m();
+ }
+
+ my $pem = $key->_pem;
+ my $buf = $pem->encode(
+ Content => $pkey,
+ Password => $param{Password},
+ Name => 'DSA PRIVATE KEY',
+ Macro => 'DSAPrivateKey',
+ ) or croak $pem->errstr;
+ $buf;
+}
+
+sub _serialize_pubkey {
+ my $key = shift;
+ my %param = @_;
+ my $pem = $key->_pem;
+ my $asn = $pem->asn->find('DSAPubKeyInner');
+ ## Force stringification.
+ my $str = $asn->encode($key->pub_key . '') or croak $asn->{error};
+ my $pkey = {
+ inner => {
+ objId => '1.2.840.10040.4.1',
+ DSAParams => {
+ p => $key->p,
+ q => $key->q,
+ g => $key->g
+ },
+ },
+ pub_key => $str
+ };
+ my $buf = $pem->encode(
+ Content => $pkey,
+ Password => $param{Password},
+ Name => 'PUBLIC KEY',
+ Macro => 'DSAPublicKey',
+ ) or return $key->error($pem->errstr);
+ $buf;
+}
+
+sub _pem {
+ my $key = shift;
+ unless (defined $key->{__pem}) {
+ my $pem = Convert::PEM->new(
+ Name => "DSA PRIVATE KEY",
+ ASN => qq(
+ DSAPrivateKey ::= SEQUENCE {
+ version INTEGER,
+ p INTEGER,
+ q INTEGER,
+ g INTEGER,
+ pub_key INTEGER,
+ priv_key INTEGER
+ }
+
+ DSAPublicKey ::= SEQUENCE {
+ inner SEQUENCE {
+ objId OBJECT IDENTIFIER,
+ DSAParams SEQUENCE {
+ p INTEGER,
+ q INTEGER,
+ g INTEGER
+ }
+ }
+ pub_key BIT STRING
+ }
+
+ DSAPubKeyInner ::= INTEGER
+ ));
+ $key->{__pem} = $pem;
+ }
+ $key->{__pem};
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::DSA::Key::PEM - Read/write DSA PEM files
+
+=head1 SYNOPSIS
+
+ use Crypt::DSA::Key;
+ my $key = Crypt::DSA::Key->new( Type => 'PEM', ...);
+ $key->write( Type => 'PEM', ...);
+
+=head1 DESCRIPTION
+
+I<Crypt::DSA::Key::PEM> provides an interface to reading and
+writing DSA PEM files, using I<Convert::PEM>. The files are
+ASN.1-encoded and optionally encrypted.
+
+You shouldn't use this module directly. As the SYNOPSIS above
+suggests, this module should be considered a plugin for
+I<Crypt::DSA::Key>, and all access to PEM files (reading DSA
+keys from disk, etc.) should be done through that module.
+
+Read the I<Crypt::DSA::Key> documentation for more details.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::DSA manpage for author, copyright,
+and license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Key/SSH2.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Key/SSH2.pm
new file mode 100755
index 00000000000..0260ddb6ada
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Key/SSH2.pm
@@ -0,0 +1,120 @@
+package Crypt::DSA::Key::SSH2;
+
+use strict;
+use MIME::Base64 qw( decode_base64 );
+use Crypt::DSA::Key;
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '1.16';
+ @ISA = 'Crypt::DSA::Key';
+}
+
+use constant PRIVKEY_MAGIC => 0x3f6ff9eb;
+
+sub deserialize {
+ my $key = shift;
+ my %param = @_;
+
+ chomp($param{Content});
+ my($head, $object, $content, $tail) = $param{Content} =~
+ m:(---- BEGIN ([^\n\-]+) ----)\n(.+)(---- END .*? ----)$:s;
+ my @lines = split /\n/, $content;
+ my $escaped = 0;
+ my @real;
+ for my $l (@lines) {
+ if (substr($l, -1) eq '\\') {
+ $escaped++;
+ next;
+ }
+ next if index($l, ':') != -1;
+ if ($escaped) {
+ $escaped--;
+ next;
+ }
+ push @real, $l;
+ }
+ $content = join "\n", @real;
+ $content = decode_base64($content);
+
+ my $b = BufferWithInt->new;
+ $b->append($content);
+ my $magic = $b->get_int32;
+ return unless $magic == PRIVKEY_MAGIC;
+
+ my($ignore);
+ $ignore = $b->get_int32;
+ my $type = $b->get_str;
+ my $cipher = $b->get_str;
+ $ignore = $b->get_int32 for 1..3;
+
+ return unless $cipher eq 'none';
+
+ $key->p( $b->get_mp_ssh2 );
+ $key->g( $b->get_mp_ssh2 );
+ $key->q( $b->get_mp_ssh2 );
+ $key->pub_key( $b->get_mp_ssh2 );
+ $key->priv_key( $b->get_mp_ssh2 );
+
+ #return unless $b->length == $b->offset;
+
+ $key;
+}
+
+sub serialize {
+ my $key = shift;
+ my %param = @_;
+ die "serialize is unimplemented";
+}
+
+package BufferWithInt;
+use strict;
+
+use Data::Buffer;
+use Crypt::DSA::Util qw( bin2mp );
+use base qw( Data::Buffer );
+
+sub get_mp_ssh2 {
+ my $buf = shift;
+ my $bits = $buf->get_int32;
+ my $off = $buf->{offset};
+ my $bytes = int(($bits+7) / 8);
+ my $int = bin2mp( $buf->bytes($off, $bytes) );
+ $buf->{offset} += $bytes;
+ $int;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::DSA::Key::SSH2 - Read/write DSA SSH2 files
+
+=head1 SYNOPSIS
+
+ use Crypt::DSA::Key;
+ my $key = Crypt::DSA::Key->new( Type => 'SSH2', ...);
+ $key->write( Type => 'SSH2', ...);
+
+=head1 DESCRIPTION
+
+I<Crypt::DSA::Key::SSH2> provides an interface to reading and
+writing DSA SSH2 files, using I<Data::Buffer>, which provides
+functionality for SSH-compatible binary in/out buffers.
+
+Currently encrypted key files are not supported.
+
+You shouldn't use this module directly. As the SYNOPSIS above
+suggests, this module should be considered a plugin for
+I<Crypt::DSA::Key>, and all access to SSH2 files (reading DSA
+keys from disk, etc.) should be done through that module.
+
+Read the I<Crypt::DSA::Key> documentation for more details.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::DSA manpage for author, copyright,
+and license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/KeyChain.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/KeyChain.pm
new file mode 100755
index 00000000000..b5555add0e3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/KeyChain.pm
@@ -0,0 +1,257 @@
+package Crypt::DSA::KeyChain;
+
+use strict;
+use Math::BigInt 1.78 try => 'GMP, Pari';
+use Digest::SHA1 qw( sha1 );
+use Carp qw( croak );
+use IPC::Open3;
+use File::Spec;
+use File::Which ();
+use Symbol qw( gensym );
+
+use vars qw{$VERSION};
+BEGIN {
+ $VERSION = '1.16';
+}
+
+use Crypt::DSA::Key;
+use Crypt::DSA::Util qw( bin2mp bitsize mod_exp makerandom isprime );
+
+sub new {
+ my $class = shift;
+ bless { @_ }, $class;
+}
+
+sub generate_params {
+ my $keygen = shift;
+ my %param = @_;
+ my $bits = Math::BigInt->new($param{Size});
+ croak "Number of bits (Size) is too small" unless $bits;
+ delete $param{Seed} if $param{Seed} && length $param{Seed} != 20;
+ my $v = $param{Verbosity};
+
+ # try to use fast implementations found on the system, if available.
+ unless ($param{Seed} || wantarray || $param{PurePerl}) {
+
+ # OpenSSL support
+ my $bin = $^O eq 'MSWin32' ? 'openssl.exe' : 'openssl';
+ my $openssl = File::Which::which($bin);
+ if ( $openssl ) {
+ print STDERR "Using openssl\n" if $v;
+ my $bits_n = int($bits);
+ open( NULL, ">", File::Spec->devnull );
+ my $pid = open3( gensym, \*OPENSSL, ">&NULL", "$openssl dsaparam -text -noout $bits_n" );
+ my @res;
+ while( <OPENSSL> ) {
+ push @res, $_;
+ }
+ waitpid( $pid, 0 );
+ close OPENSSL;
+ close NULL;
+
+ my %parts;
+ my $cur_part;
+ foreach (@res) {
+ if (/^\s+(\w):\s*$/) {
+ $cur_part = $1;
+ next;
+ }
+ if (/^\s*((?:[0-9a-f]{2,2}:?)+)\s*$/) {
+ $parts{$cur_part} .= $1;
+ }
+ }
+
+ $parts{$_} =~ s/://g for keys %parts;
+
+ if (scalar keys %parts == 3) {
+ my $key = Crypt::DSA::Key->new;
+ $key->p(Math::BigInt->new("0x" . $parts{p}));
+ $key->q(Math::BigInt->new("0x" . $parts{q}));
+ $key->g(Math::BigInt->new("0x" . $parts{g}));
+ return $key;
+ }
+ }
+
+ }
+
+ # Pure Perl version:
+
+ my($counter, $q, $p, $seed, $seedp1) = (0);
+
+ ## Generate q.
+ SCOPE: {
+ print STDERR "." if $v;
+ $seed = $param{Seed} ? delete $param{Seed} :
+ join '', map chr rand 256, 1..20;
+ $seedp1 = _seed_plus_one($seed);
+ my $md = sha1($seed) ^ sha1($seedp1);
+ vec($md, 0, 8) |= 0x80;
+ vec($md, 19, 8) |= 0x01;
+ $q = bin2mp($md);
+ redo unless isprime($q);
+ }
+
+ print STDERR "*\n" if $v;
+ my $n = int(("$bits"-1) / 160);
+ my $b = ($bits-1)-Math::BigInt->new($n)*160;
+ my $p_test = Math::BigInt->new(1); $p_test <<= ($bits-1);
+
+ ## Generate p.
+ SCOPE: {
+ print STDERR "." if $v;
+ my $W = Math::BigInt->new(0);
+ for my $k (0..$n) {
+ $seedp1 = _seed_plus_one($seedp1);
+ my $r0 = bin2mp(sha1($seedp1));
+ $r0 %= Math::BigInt->new(2) ** $b
+ if $k == $n;
+ $W += $r0 << (Math::BigInt->new(160) * $k);
+ }
+ my $X = $W + $p_test;
+ $p = $X - ($X % (2 * $q) - 1);
+ last if $p >= $p_test && isprime($p);
+ redo unless ++$counter >= 4096;
+ }
+
+ print STDERR "*" if $v;
+ my $e = ($p - 1) / $q;
+ my $h = Math::BigInt->new(2);
+ my $g;
+ SCOPE: {
+ $g = mod_exp($h, $e, $p);
+ $h++, redo if $g == 1;
+ }
+ print STDERR "\n" if $v;
+
+ my $key = Crypt::DSA::Key->new;
+ $key->p($p);
+ $key->q($q);
+ $key->g($g);
+
+ return wantarray ? ($key, $counter, "$h", $seed) : $key;
+}
+
+sub generate_keys {
+ my $keygen = shift;
+ my $key = shift;
+ my($priv_key, $pub_key);
+ SCOPE: {
+ my $i = bitsize($key->q);
+ $priv_key = makerandom(Size => $i);
+ $priv_key -= $key->q if $priv_key >= $key->q;
+ redo if $priv_key == 0;
+ }
+ $pub_key = mod_exp($key->g, $priv_key, $key->p);
+ $key->priv_key($priv_key);
+ $key->pub_key($pub_key);
+}
+
+sub _seed_plus_one {
+ my($s, $i) = ($_[0]);
+ for ($i=19; $i>=0; $i--) {
+ vec($s, $i, 8)++;
+ last unless vec($s, $i, 8) == 0;
+ }
+ $s;
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+Crypt::DSA::KeyChain - DSA key generation system
+
+=head1 SYNOPSIS
+
+ use Crypt::DSA::KeyChain;
+ my $keychain = Crypt::DSA::KeyChain->new;
+
+ my $key = $keychain->generate_params(
+ Size => 512,
+ Seed => $seed,
+ Verbosity => 1,
+ );
+
+ $keychain->generate_keys($key);
+
+=head1 DESCRIPTION
+
+I<Crypt::DSA::KeyChain> is a lower-level interface to key
+generation than the interface in I<Crypt::DSA> (the I<keygen>
+method). It allows you to separately generate the I<p>, I<q>,
+and I<g> key parameters, given an optional starting seed, and
+a mandatory bit size for I<p> (I<q> and I<g> are 160 bits each).
+
+You can then call I<generate_keys> to generate the public and
+private portions of the key.
+
+=head1 USAGE
+
+=head2 $keychain = Crypt::DSA::KeyChain->new
+
+Constructs a new I<Crypt::DSA::KeyChain> object. At the moment
+this isn't particularly useful in itself, other than being the
+object you need in order to call the other methods.
+
+Returns the new object.
+
+=head2 $key = $keychain->generate_params(%arg)
+
+Generates a set of DSA parameters: the I<p>, I<q>, and I<g>
+values of the key. This involves finding primes, and as such
+it can be a relatively long process.
+
+When invoked in scalar context, returns a new
+I<Crypt::DSA::Key> object.
+
+In list context, returns the new I<Crypt::DSA::Key> object,
+along with: the value of the internal counter when a suitable
+prime I<p> was found; the value of I<h> when I<g> was derived;
+and the value of the seed (a 20-byte string) when I<q> was
+found. These values aren't particularly useful in normal
+circumstances, but they could be useful.
+
+I<%arg> can contain:
+
+=over 4
+
+=item * Size
+
+The size in bits of the I<p> value to generate. The I<q> and
+I<g> values are always 160 bits each.
+
+This argument is mandatory.
+
+=item * Seed
+
+A seed with which I<q> generation will begin. If this seed does
+not lead to a suitable prime, it will be discarded, and a new
+random seed chosen in its place, until a suitable prime can be
+found.
+
+This is entirely optional, and if not provided a random seed will
+be generated automatically.
+
+=item * Verbosity
+
+Should be either 0 or 1. A value of 1 will give you a progress
+meter during I<p> and I<q> generation--this can be useful, since
+the process can be relatively long.
+
+The default is 0.
+
+=back
+
+=head2 $keychain->generate_keys($key)
+
+Generates the public and private portions of the key I<$key>,
+a I<Crypt::DSA::Key> object.
+
+=head1 AUTHOR & COPYRIGHT
+
+Please see the L<Crypt::DSA> manpage for author, copyright,
+and license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Signature.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Signature.pm
new file mode 100755
index 00000000000..3bab8a30d78
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Signature.pm
@@ -0,0 +1,139 @@
+package Crypt::DSA::Signature;
+
+use strict;
+use Carp qw( croak );
+
+use vars qw{$VERSION};
+BEGIN {
+ $VERSION = '1.16';
+}
+
+sub new {
+ my $class = shift;
+ my %param = @_;
+ my $sig = bless { }, $class;
+ if ($param{Content}) {
+ return $sig->deserialize(%param);
+ }
+ $sig;
+}
+
+BEGIN {
+ no strict 'refs';
+ for my $meth (qw( r s )) {
+ *$meth = sub {
+ my($key, $value) = @_;
+ if (ref $value eq 'Math::Pari') {
+ $key->{$meth} = Math::Pari::pari2pv($value);
+ }
+ elsif (ref $value) {
+ $key->{$meth} = "$value";
+ }
+ elsif ($value) {
+ if ($value =~ /^0x/) {
+ $key->{$meth} = Math::BigInt->new($value)->bstr;
+ }
+ else {
+ $key->{$meth} = $value;
+ }
+ }
+ my $ret = $key->{$meth} || "";
+ $ret = Math::BigInt->new("$ret") if $ret =~ /^\d+$/;
+ $ret;
+ };
+ }
+}
+
+sub asn {
+ require Convert::ASN1;
+ my $asn = Convert::ASN1->new;
+ $asn->prepare('SEQUENCE { r INTEGER, s INTEGER }') or croak $asn->{error};
+ $asn;
+}
+
+sub deserialize {
+ my $sig = shift;
+ my %param = @_;
+ my $asn = __PACKAGE__->asn;
+ my $ref;
+ require MIME::Base64;
+ ## Turn off warnings, because we're attempting to base64-decode content
+ ## that may not be base64-encoded.
+ local $^W = 0;
+ for ($param{Content}, MIME::Base64::decode_base64($param{Content})) {
+ my $out = $asn->decode($_);
+ $ref = $out, last if $out;
+ }
+ croak "Invalid Content" unless $ref;
+ $sig->s($ref->{s});
+ $sig->r($ref->{r});
+ $sig;
+}
+
+sub serialize {
+ my $sig = shift;
+ my %param = @_;
+ my $asn = __PACKAGE__->asn;
+ my $buf = $asn->encode({ s => $sig->s, r => $sig->r })
+ or croak $asn->{error};
+ $buf;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::DSA::Signature - DSA signature object
+
+=head1 SYNOPSIS
+
+ use Crypt::DSA::Signature;
+ my $sig = Crypt::DSA::Signature->new;
+
+ $sig->r($r);
+ $sig->s($s);
+
+=head1 DESCRIPTION
+
+I<Crypt::DSA::Signature> represents a DSA signature. It has 2 methods,
+I<r> and I<s>, which are the big number representations of the 2 pieces of
+the DSA signature.
+
+=head1 USAGE
+
+=head2 Crypt::DSA::Signature->new( %options )
+
+Creates a new signature object, and optionally initializes it with the
+information in I<%options>, which can contain:
+
+=over 4
+
+=item * Content
+
+An ASN.1-encoded string representing the DSA signature. In ASN.1 notation,
+this looks like:
+
+ SEQUENCE {
+ r INTEGER,
+ s INTEGER
+ }
+
+If I<Content> is provided, I<new> will automatically call the I<deserialize>
+method to parse the content, and set the I<r> and I<s> methods on the
+resulting I<Crypt::DSA::Signature> object.
+
+=back
+
+=head2 $sig->serialize
+
+Serializes the signature object I<$sig> into the format described above:
+an ASN.1-encoded representation of the signature, using the ASN.1 syntax
+above.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::DSA manpage for author, copyright,
+and license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Util.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Util.pm
new file mode 100755
index 00000000000..32cfbeac860
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/DSA/Util.pm
@@ -0,0 +1,201 @@
+package Crypt::DSA::Util;
+
+use strict;
+use Math::BigInt 1.78 try => 'GMP, Pari';
+use Fcntl;
+use Carp qw( croak );
+
+use vars qw( $VERSION @ISA @EXPORT_OK );
+use Exporter;
+BEGIN {
+ $VERSION = '1.16';
+ @ISA = qw( Exporter );
+ @EXPORT_OK = qw( bitsize bin2mp mp2bin mod_inverse mod_exp makerandom isprime );
+}
+
+## Nicked from Crypt::RSA::DataFormat.
+## Copyright (c) 2001, Vipul Ved Prakash.
+sub bitsize {
+ length(Math::BigInt->new($_[0])->as_bin) - 2;
+}
+
+sub bin2mp {
+ my $s = shift;
+ $s eq '' ?
+ Math::BigInt->new(0) :
+ Math::BigInt->new("0b" . unpack("B*", $s));
+}
+
+sub mp2bin {
+ my $p = Math::BigInt->new(shift);
+ my $base = Math::BigInt->new(256);
+ my $res = '';
+ while ($p != 0) {
+ my $r = $p % $base;
+ $p = ($p-$r) / $base;
+ $res = chr($r) . $res;
+ }
+ $res;
+}
+
+sub mod_exp {
+ my($a, $exp, $n) = @_;
+ $a->copy->bmodpow($exp, $n);
+}
+
+sub mod_inverse {
+ my($a, $n) = @_;
+ $a->copy->bmodinv($n);
+}
+
+sub makerandom {
+ my %param = @_;
+ my $size = $param{Size};
+ my $bytes = int($size / 8) + 1;
+ my $r = '';
+ if ( sysopen my $fh, '/dev/random', O_RDONLY ) {
+ my $read = 0;
+ while ($read < $bytes) {
+ my $got = sysread $fh, my($chunk), $bytes - $read;
+ next unless $got;
+ die "Error: $!" if $got == -1;
+ $r .= $chunk;
+ $read = length $r;
+ }
+ close $fh;
+ }
+ elsif ( require Data::Random ) {
+ $r .= Data::Random::rand_chars( set=>'numeric' ) for 1..$bytes;
+ }
+ else {
+ croak "makerandom requires /dev/random or Data::Random";
+ }
+ my $down = $size - 1;
+ $r = unpack 'H*', pack 'B*', '0' x ( $size % 8 ? 8 - $size % 8 : 0 ) .
+ '1' . unpack "b$down", $r;
+ Math::BigInt->new('0x' . $r);
+}
+
+# For testing, let us choose our isprime function:
+*isprime = \&isprime_algorithms_with_perl;
+
+# from the book "Mastering Algorithms with Perl" by Jon Orwant,
+# Jarkko Hietaniemi, and John Macdonald
+sub isprime_algorithms_with_perl {
+ use integer;
+ my $n = shift;
+ my $n1 = $n - 1;
+ my $one = $n - $n1; # not just 1, but a bigint
+ my $witness = $one * 100;
+
+ # find the power of two for the top bit of $n1
+ my $p2 = $one;
+ my $p2index = -1;
+ ++$p2index, $p2 *= 2
+ while $p2 <= $n1;
+ $p2 /= 2;
+
+ # number of interations: 5 for 260-bit numbers, go up to 25 for smaller
+ my $last_witness = 5;
+ $last_witness += (260 - $p2index) / 13 if $p2index < 260;
+
+ for my $witness_count (1..$last_witness) {
+ $witness *= 1024;
+ $witness += int(rand(1024)); # XXXX use good rand
+ $witness = $witness % $n if $witness > $n;
+ $witness = $one * 100, redo if $witness == 0;
+
+ my $prod = $one;
+ my $n1bits = $n1;
+ my $p2next = $p2;
+
+ # compute $witness ** ($n - 1)
+ while (1) {
+ my $rootone = $prod == 1 || $prod == $n1;
+ $prod = ($prod * $prod) % $n;
+ return 0 if $prod == 1 && ! $rootone;
+ if ($n1bits >= $p2next) {
+ $prod = ($prod * $witness) % $n;
+ $n1bits -= $p2next;
+ }
+ last if $p2next == 1;
+ $p2next /= 2;
+ }
+ return 0 unless $prod == 1;
+ }
+ return 1;
+}
+
+sub isprime_gp_pari {
+ my $n = shift;
+
+ my $sn = "$n";
+ die if $sn =~ /\D/;
+
+ my $is_prime = `echo "isprime($sn)" | gp -f -q`;
+ die "No gp installed?" if $?;
+
+ chomp $is_prime;
+ return $is_prime;
+}
+
+sub isprime_paranoid {
+ my $n = shift;
+
+ my $perl = isprime_algorithms_with_perl($n);
+ my $pari = isprime_gp_pari($n);
+
+ die "Perl vs. PARI don't match on '$n'\n" unless $perl == $pari;
+ return $perl;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::DSA::Util - DSA Utility functions
+
+=head1 SYNOPSIS
+
+ use Crypt::DSA::Util qw( func1 func2 ... );
+
+=head1 DESCRIPTION
+
+I<Crypt::DSA::Util> contains a set of exportable utility functions
+used through the I<Crypt::DSA> set of libraries.
+
+=head2 bitsize($n)
+
+Returns the number of bits in the I<Math::Pari> integer object
+I<$n>.
+
+=head2 bin2mp($string)
+
+Given a string I<$string> of any length, treats the string as a
+base-256 representation of an integer, and returns that integer,
+a I<Math::Pari> object.
+
+=head2 mp2bin($int)
+
+Given a biginteger I<$int> (a I<Math::Pari> object), linearizes
+the integer into an octet string, and returns the octet string.
+
+=head2 mod_exp($a, $exp, $n)
+
+Computes $a ^ $exp mod $n and returns the value. The calculations
+are done using I<Math::Pari>, and the return value is a I<Math::Pari>
+object.
+
+=head2 mod_inverse($a, $n)
+
+Computes the multiplicative inverse of $a mod $n and returns the
+value. The calculations are done using I<Math::Pari>, and the
+return value is a I<Math::Pari> object.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::DSA manpage for author, copyright,
+and license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/IDEA.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/IDEA.pm
new file mode 100755
index 00000000000..d204859e34f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/IDEA.pm
@@ -0,0 +1,85 @@
+#! /usr/local/bin/perl -w
+
+#
+# Copyright (C) 1995, 1996 Systemics Ltd (http://www.systemics.com/)
+# All rights reserved.
+#
+
+package Crypt::IDEA;
+
+require Exporter;
+require DynaLoader;
+
+@ISA = (Exporter, DynaLoader);
+
+# Items to export into callers namespace by default
+@EXPORT = qw();
+
+# Other items we are prepared to export if requested
+@EXPORT_OK = qw();
+
+bootstrap Crypt::IDEA;
+
+
+package IDEA;
+
+$VERSION="1.08";
+
+use strict;
+use Carp;
+
+sub usage
+{
+ my ($mess, $package, $filename, $line, $subr);
+ ($mess) = @_;
+ ($package, $filename, $line, $subr) = caller(1);
+ $Carp::CarpLevel = 2;
+ croak "Usage: $package\::$subr - $mess";
+}
+
+
+sub blocksize { 8; }
+sub keysize { 16; }
+
+sub new
+{
+ usage("new IDEA key") unless @_ == 2;
+
+ my $type = shift; my $self = {}; bless $self, $type;
+
+ $self->{'ks'} = Crypt::IDEA::expand_key(shift);
+
+ $self;
+}
+
+sub encrypt
+{
+ usage("encrypt data[8 bytes]") unless @_ == 2;
+
+ my $self = shift;
+ my $data = shift;
+
+ Crypt::IDEA::crypt($data, $data, $self->{'ks'});
+
+ $data;
+}
+
+sub decrypt
+{
+ usage("decrypt data[8 bytes]") unless @_ == 2;
+
+ my $self = shift;
+ my $data = shift;
+
+ #
+ # Cache Decrypt key schedule
+ #
+ $self->{'dks'} = Crypt::IDEA::invert_key($self->{'ks'})
+ unless exists $self->{'dks'};
+
+ Crypt::IDEA::crypt($data, $data, $self->{'dks'});
+
+ $data;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/IDEA.pod b/Master/tlpkg/tlperl.straw/lib/Crypt/IDEA.pod
new file mode 100755
index 00000000000..d026f8b7ecc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/IDEA.pod
@@ -0,0 +1,87 @@
+=head1 NAME
+
+IDEA - Perl interface to IDEA block cipher
+
+=head1 SYNOPSIS
+
+ use Crypt::IDEA;
+
+
+=head1 DESCRIPTION
+
+This perl extension is an implementation of the IDEA block cipher algorithm.
+The module implements the Crypt::BlockCipher interface,
+which has the following methods
+
+=over 4
+
+=item blocksize
+=item keysize
+=item encrypt
+=item decrypt
+
+=back
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item blocksize
+
+Returns the size (in bytes) of the block cipher.
+
+=item keysize
+
+Returns the size (in bytes) of the key.
+
+=item new
+
+ my $cipher = new IDEA $key;
+
+This creates a new IDEA BlockCipher object, using $key,
+where $key is a key of C<keysize()> bytes.
+
+=item encrypt
+
+ my $cipher = new IDEA $key;
+ my $ciphertext = $cipher->encrypt($plaintext);
+
+This function encrypts $plaintext and returns the $ciphertext
+where $plaintext and $ciphertext should be of C<blocksize()> bytes.
+
+=item decrypt
+
+ my $cipher = new IDEA $key;
+ my $plaintext = $cipher->decrypt($ciphertext);
+
+This function decrypts $ciphertext and returns the $plaintext
+where $plaintext and $ciphertext should be of C<blocksize()> bytes.
+
+=back
+
+=head1 EXAMPLE
+
+ my $key = pack("H32", "0123456789ABCDEF0123456789ABCDEF");
+ my $cipher = new IDEA $key;
+ my $ciphertext = $cipher->encrypt("plaintex"); # NB - 8 bytes
+ print unpack("H16", $ciphertext), "\n";
+
+=head1 SEE ALSO
+
+Crypt::CBD, Crypt::DES, Crypt::Blowfish
+
+Bruce Schneier, I<Applied Cryptography>, 1995, Second Edition,
+published by John Wiley & Sons, Inc.
+
+
+=head1 COPYRIGHT
+
+This implementation is copyright Systemics Ltd ( http://www.systemics.com/ ).
+
+The IDEA algorithm is patented in Europe and the United States
+by Ascom-Tech AG.
+
+Module altered between 1999 and 2005 to allow added functionality with perl -MCPAN,
+Changes by Dave Paris (edited lib paths, endian issues, new tests).
+
+Thank you to contributors for endian patches and new test suite!
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP.pm
new file mode 100755
index 00000000000..962de1db14d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP.pm
@@ -0,0 +1,1678 @@
+package Crypt::OpenPGP;
+use strict;
+use 5.008_001;
+
+use vars qw( $VERSION );
+$VERSION = '1.04';
+
+use Crypt::OpenPGP::Constants qw( DEFAULT_CIPHER );
+use Crypt::OpenPGP::KeyRing;
+use Crypt::OpenPGP::Plaintext;
+use Crypt::OpenPGP::Message;
+use Crypt::OpenPGP::PacketFactory;
+use Crypt::OpenPGP::Config;
+
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+use File::HomeDir;
+use File::Spec;
+
+use vars qw( %COMPAT );
+
+## pgp2 and pgp5 do not trim trailing whitespace from "canonical text"
+## signatures, only from cleartext signatures.
+## See:
+## http://cert.uni-stuttgart.de/archive/ietf-openpgp/2000/01/msg00033.html
+$Crypt::OpenPGP::Globals::Trim_trailing_ws = 1;
+
+{
+ my $env = sub {
+ my $dir = shift; my @paths;
+ if (exists $ENV{$dir}) { for (@_) { push @paths, "$ENV{$dir}/$_" } }
+ return @paths ? @paths : ();
+ };
+
+ my $home = sub {
+ my( @path ) = @_;
+ my $home_dir = File::HomeDir->my_home or return;
+ return File::Spec->catfile( $home_dir, @path );
+ };
+
+ %COMPAT = (
+ PGP2 => {
+ 'sign' => { Digest => 'MD5', Version => 3 },
+ 'encrypt' => { Cipher => 'IDEA', Compress => 'ZIP' },
+ 'keygen' => { Type => 'RSA', Cipher => 'IDEA',
+ Version => 3, Digest => 'MD5' },
+ 'PubRing' => [
+ $env->('PGPPATH','pubring.pgp'),
+ $home->( '.pgp', 'pubring.pgp' ),
+ ],
+ 'SecRing' => [
+ $env->('PGPPATH','secring.pgp'),
+ $home->( '.pgp', 'secring.pgp' ),
+ ],
+ 'Config' => [
+ $env->('PGPPATH', 'config.txt'),
+ $home->( '.pgp', 'config.txt' ),
+ ],
+ },
+
+ PGP5 => {
+ 'sign' => { Digest => 'SHA1', Version => 3 },
+ 'encrypt' => { Cipher => 'DES3', Compress => 'ZIP' },
+ 'keygen' => { Type => 'DSA', Cipher => 'DES3',
+ Version => 4, Digest => 'SHA1' },
+ 'PubRing' => [
+ $env->('PGPPATH','pubring.pkr'),
+ $home->( '.pgp', 'pubring.pkr' ),
+ ],
+ 'SecRing' => [
+ $env->('PGPPATH','secring.skr'),
+ $home->( '.pgp', 'secring.skr' ),
+ ],
+ 'Config' => [
+ $env->('PGPPATH', 'pgp.cfg'),
+ $home->( '.pgp', 'pgp.cfg' ),
+ ],
+ },
+
+ GnuPG => {
+ 'sign' => { Digest => 'RIPEMD160', Version => 4 },
+ 'encrypt' => { Cipher => 'Rijndael', Compress => 'Zlib',
+ MDC => 1 },
+ 'keygen' => { Type => 'DSA', Cipher => 'Rijndael',
+ Version => 4, Digest => 'RIPEMD160' },
+ 'Config' => [
+ $env->('GNUPGHOME', 'options'),
+ $home->( '.gnupg', 'options' ),
+ ],
+ 'PubRing' => [
+ $env->('GNUPGHOME', 'pubring.gpg'),
+ $home->( '.gnupg', 'pubring.gpg' ),
+ ],
+ 'SecRing' => [
+ $env->('GNUPGHOME', 'secring.gpg'),
+ $home->( '.gnupg', 'secring.gpg' ),
+ ],
+ },
+ );
+}
+
+sub version_string { __PACKAGE__ . ' ' . $VERSION }
+
+sub pubrings { $_[0]->{pubrings} }
+sub secrings { $_[0]->{secrings} }
+
+use constant PUBLIC => 1;
+use constant SECRET => 2;
+
+sub add_ring {
+ my $pgp = shift;
+ my($type, $ring) = @_;
+ unless (ref($ring) eq 'Crypt::OpenPGP::KeyRing') {
+ $ring = Crypt::OpenPGP::KeyRing->new( Filename => $ring )
+ or return Crypt::OpenPGP::KeyRing->errstr;
+ }
+ if ($type == SECRET) {
+ push @{ $pgp->{secrings} }, $ring;
+ } else {
+ push @{ $pgp->{pubrings} }, $ring;
+ }
+ $ring;
+}
+
+sub new {
+ my $class = shift;
+ my $pgp = bless { }, $class;
+ $pgp->init(@_);
+}
+
+sub _first_exists {
+ my($list) = @_;
+ for my $f (@$list) {
+ next unless $f;
+ return $f if -e $f;
+ }
+}
+
+sub init {
+ my $pgp = shift;
+ $pgp->{pubrings} = [];
+ $pgp->{secrings} = [];
+ my %param = @_;
+ my $cfg_file = delete $param{ConfigFile};
+ my $cfg = $pgp->{cfg} = Crypt::OpenPGP::Config->new(%param) or
+ return Crypt::OpenPGP::Config->errstr;
+ if (!$cfg_file && (my $compat = $cfg->get('Compat'))) {
+ $cfg_file = _first_exists($COMPAT{$compat}{Config});
+ }
+ if ($cfg_file) {
+ $cfg->read_config($param{Compat}, $cfg_file);
+ }
+ ## Load public and secret keyrings.
+ for my $s (qw( PubRing SecRing )) {
+ unless (defined $cfg->get($s)) {
+ my @compats = $param{Compat} ? ($param{Compat}) : keys %COMPAT;
+ for my $compat (@compats) {
+ my $ring = _first_exists($COMPAT{$compat}{$s});
+ $cfg->set($s, $ring), last if $ring;
+ }
+ }
+ if (my $ring = $cfg->get($s)) {
+ $pgp->add_ring($s eq 'PubRing' ? PUBLIC : SECRET, $ring);
+ }
+ }
+ $pgp;
+}
+
+sub handle {
+ my $pgp = shift;
+ my %param = @_;
+ my($data);
+ unless ($data = $param{Data}) {
+ my $file = $param{Filename} or
+ return $pgp->error("Need either 'Data' or 'Filename' to decrypt");
+ $data = $pgp->_read_files($file) or return $pgp->error($pgp->errstr);
+ }
+ my $msg = Crypt::OpenPGP::Message->new( Data => $data ) or
+ return $pgp->error("Reading data packets failed: " .
+ Crypt::OpenPGP::Message->errstr);
+ my @pieces = $msg->pieces;
+ return $pgp->error("No packets found in message") unless @pieces;
+ while (ref($pieces[0]) eq 'Crypt::OpenPGP::Marker') {
+ shift @pieces;
+ }
+ if (ref($pieces[0]) eq 'Crypt::OpenPGP::Compressed') {
+ $data = $pieces[0]->decompress or
+ return $pgp->error("Decompression error: " . $pieces[0]->errstr);
+ $msg = Crypt::OpenPGP::Message->new( Data => $data ) or
+ return $pgp->error("Reading decompressed data failed: " .
+ Crypt::OpenPGP::Message->errstr);
+ @pieces = $msg->pieces;
+ }
+ my $class = ref($pieces[0]);
+ my(%res);
+ if ($class eq 'Crypt::OpenPGP::OnePassSig' ||
+ $class eq 'Crypt::OpenPGP::Signature') {
+ my($valid, $sig) = $pgp->verify( Signature => $data );
+ return $pgp->error("Error verifying signature: " . $pgp->errstr)
+ if !defined $valid;
+ $res{Validity} = $valid;
+ $res{Signature} = $sig;
+ } else {
+ my $cb = $param{PassphraseCallback} || \&_default_passphrase_cb;
+ my($pt, $valid, $sig) = $pgp->decrypt(
+ Data => $data,
+ PassphraseCallback => $cb,
+ );
+ return $pgp->error("Decryption failed: " . $pgp->errstr)
+ unless defined $pt;
+ return $pgp->error("Error verifying signature: " . $pgp->errstr)
+ if !defined($valid) && $pgp->errstr !~ /^No Signature/;
+ $res{Plaintext} = $pt;
+ $res{Validity} = $valid if defined $valid;
+ $res{Signature} = $sig if defined $sig;
+ }
+ \%res;
+}
+
+sub _default_passphrase_cb {
+ my($cert) = @_;
+ my $prompt;
+ if ($cert) {
+ $prompt = sprintf qq(
+You need a passphrase to unlock the secret key for
+user "%s".
+%d-bit %s key, ID %s
+
+Enter passphrase: ), $cert->uid,
+ $cert->key->size,
+ $cert->key->alg,
+ substr($cert->key_id_hex, -8, 8);
+ } else {
+ $prompt = "Enter passphrase: ";
+ }
+ _prompt($prompt, '', 1);
+}
+
+sub _prompt {
+ my($prompt, $def, $noecho) = @_;
+ require Term::ReadKey;
+ Term::ReadKey->import;
+ print STDERR $prompt . ($def ? "[$def] " : "");
+ if ($noecho) {
+ ReadMode('noecho');
+ }
+ chomp(my $ans = ReadLine(0));
+ ReadMode('restore');
+ print STDERR "\n";
+ $ans ? $ans : $def;
+}
+
+sub sign {
+ my $pgp = shift;
+ my %param = @_;
+ $pgp->_merge_compat(\%param, 'sign') or
+ return $pgp->error( $pgp->errstr );
+ my($cert, $data);
+ require Crypt::OpenPGP::Signature;
+ unless ($data = $param{Data}) {
+ my $file = $param{Filename} or
+ return $pgp->error("Need either 'Data' or 'Filename' to sign");
+ $data = $pgp->_read_files($file) or return $pgp->error($pgp->errstr);
+ }
+ unless ($cert = $param{Key}) {
+ my $kid = $param{KeyID} or return $pgp->error("No KeyID specified");
+ my $ring = $pgp->secrings->[0]
+ or return $pgp->error("No secret keyrings");
+ my $kb = $ring->find_keyblock_by_keyid(pack 'H*', $kid) or
+ return $pgp->error("Could not find secret key with KeyID $kid");
+ $cert = $kb->signing_key;
+ $cert->uid($kb->primary_uid);
+ }
+ if ($cert->is_protected) {
+ my $pass = $param{Passphrase};
+ if (!defined $pass && (my $cb = $param{PassphraseCallback})) {
+ $pass = $cb->($cert);
+ }
+ return $pgp->error("Need passphrase to unlock secret key")
+ unless $pass;
+ $cert->unlock($pass) or
+ return $pgp->error("Secret key unlock failed: " . $cert->errstr);
+ }
+ my @ptarg;
+ push @ptarg, ( Filename => $param{Filename} ) if $param{Filename};
+ if ($param{Clearsign}) {
+ push @ptarg, ( Mode => 't' );
+ ## In clear-signed messages, the line ending before the signature
+ ## is not considered part of the signed text.
+ (my $tmp = $data) =~ s!\r?\n$!!;
+ push @ptarg, ( Data => $tmp );
+ } else {
+ push @ptarg, ( Data => $data );
+ }
+ my $pt = Crypt::OpenPGP::Plaintext->new(@ptarg);
+ my @sigarg;
+ if (my $hash_alg = $param{Digest}) {
+ my $dgst = Crypt::OpenPGP::Digest->new($hash_alg) or
+ return $pgp->error( Crypt::OpenPGP::Digest->errstr );
+ @sigarg = ( Digest => $dgst->alg_id );
+ }
+ push @sigarg, (Type => 0x01) if $param{Clearsign};
+ my $sig = Crypt::OpenPGP::Signature->new(
+ Data => $pt,
+ Key => $cert,
+ Version => $param{Version},
+ @sigarg,
+ );
+ if ($param{Clearsign}) {
+ $param{Armour} = $param{Detach} = 1;
+ }
+ my $sig_data = Crypt::OpenPGP::PacketFactory->save($sig,
+ $param{Detach} ? () : ($pt));
+ if ($param{Armour}) {
+ require Crypt::OpenPGP::Armour;
+ $sig_data = Crypt::OpenPGP::Armour->armour(
+ Data => $sig_data,
+ Object => ($param{Detach} ? 'SIGNATURE' : 'MESSAGE'),
+ ) or return $pgp->error( Crypt::OpenPGP::Armour->errstr );
+ }
+ if ($param{Clearsign}) {
+ require Crypt::OpenPGP::Util;
+ my $hash = Crypt::OpenPGP::Digest->alg($sig->{hash_alg});
+ my $data = Crypt::OpenPGP::Util::dash_escape($data);
+ $data .= "\n" unless $data =~ /\n$/;
+ $sig_data = "-----BEGIN PGP SIGNED MESSAGE-----\n" .
+ ($hash eq 'MD5' ? '' : "Hash: $hash\n") .
+ "\n" .
+ $data .
+ $sig_data;
+ }
+ $sig_data;
+}
+
+sub verify {
+ my $pgp = shift;
+ my %param = @_;
+ my $wants_object = wantarray;
+ my($data, $sig);
+ require Crypt::OpenPGP::Signature;
+ $param{Signature} or $param{SigFile} or
+ return $pgp->error("Need Signature or SigFile to verify");
+ my %arg = $param{Signature} ? (Data => $param{Signature}) :
+ (Filename => $param{SigFile});
+ $arg{IsPacketStream} = 1 if $param{IsPacketStream};
+ my $msg = Crypt::OpenPGP::Message->new( %arg ) or
+ return $pgp->error("Reading signature failed: " .
+ Crypt::OpenPGP::Message->errstr);
+ my @pieces = $msg->pieces;
+ if (ref($pieces[0]) eq 'Crypt::OpenPGP::Compressed') {
+ $data = $pieces[0]->decompress or
+ return $pgp->error("Decompression error: " . $pieces[0]->errstr);
+ $msg = Crypt::OpenPGP::Message->new( Data => $data ) or
+ return $pgp->error("Reading decompressed data failed: " .
+ Crypt::OpenPGP::Message->errstr);
+ @pieces = $msg->pieces;
+ }
+ if (ref($pieces[0]) eq 'Crypt::OpenPGP::OnePassSig') {
+ ($data, $sig) = @pieces[1,2];
+ } elsif (ref($pieces[0]) eq 'Crypt::OpenPGP::Signature') {
+ ($sig, $data) = @pieces[0,1];
+ } else {
+ return $pgp->error("SigFile contents are strange");
+ }
+ unless ($data) {
+ if ($param{Data}) {
+ $data = Crypt::OpenPGP::Plaintext->new( Data => $param{Data} );
+ }
+ else {
+ ## if no Signature or detached sig in SigFile
+ my @files = ref($param{Files}) eq 'ARRAY' ? @{ $param{Files} } :
+ $param{Files};
+ my $fdata = $pgp->_read_files(@files);
+ return $pgp->error("Reading data files failed: " . $pgp->errstr)
+ unless defined $fdata;
+ $data = Crypt::OpenPGP::Plaintext->new( Data => $fdata );
+ }
+ }
+ my($cert, $kb);
+ unless ($cert = $param{Key}) {
+ my $key_id = $sig->key_id;
+ my $ring = $pgp->pubrings->[0];
+ unless ($ring && ($kb = $ring->find_keyblock_by_keyid($key_id))) {
+ my $cfg = $pgp->{cfg};
+ if ($cfg->get('AutoKeyRetrieve') && $cfg->get('KeyServer')) {
+ require Crypt::OpenPGP::KeyServer;
+ my $server = Crypt::OpenPGP::KeyServer->new(
+ Server => $cfg->get('KeyServer'),
+ );
+ $kb = $server->find_keyblock_by_keyid($key_id);
+ }
+ return $pgp->error("Could not find public key with KeyID " .
+ unpack('H*', $key_id))
+ unless $kb;
+ }
+ $cert = $kb->signing_key;
+ }
+
+## pgp2 and pgp5 do not trim trailing whitespace from "canonical text"
+## signatures, only from cleartext signatures. So we first try to verify
+## the signature using proper RFC2440 canonical text, then if that fails,
+## retry without trimming trailing whitespace.
+## See:
+## http://cert.uni-stuttgart.de/archive/ietf-openpgp/2000/01/msg00033.html
+ my($dgst, $found);
+ for (1, 0) {
+ local $Crypt::OpenPGP::Globals::Trim_trailing_ws = $_;
+ $dgst = $sig->hash_data($data) or
+ return $pgp->error( $sig->errstr );
+ $found++, last if substr($dgst, 0, 2) eq $sig->{chk};
+ }
+ return $pgp->error("Message hash does not match signature checkbytes")
+ unless $found;
+ my $valid = $cert->key->public_key->verify($sig, $dgst) ?
+ ($kb && $kb->primary_uid ? $kb->primary_uid : 1) : 0;
+
+ $wants_object ? ($valid, $sig) : $valid;
+}
+
+sub encrypt {
+ my $pgp = shift;
+ my %param = @_;
+ $pgp->_merge_compat(\%param, 'encrypt') or
+ return $pgp->error( $pgp->errstr );
+ my($data);
+ require Crypt::OpenPGP::Cipher;
+ require Crypt::OpenPGP::Ciphertext;
+ unless ($data = $param{Data}) {
+ my $file = $param{Filename} or
+ return $pgp->error("Need either 'Data' or 'Filename' to encrypt");
+ $data = $pgp->_read_files($file) or return $pgp->error($pgp->errstr);
+ }
+ my $ptdata;
+ if ($param{SignKeyID}) {
+ $ptdata = $pgp->sign(
+ Data => $data,
+ KeyID => $param{SignKeyID},
+ Compat => $param{Compat},
+ Armour => 0,
+ Passphrase => $param{SignPassphrase},
+ PassphraseCallback => $param{SignPassphraseCallback},
+ )
+ or return;
+ } else {
+ my $pt = Crypt::OpenPGP::Plaintext->new( Data => $data,
+ $param{Filename} ? (Filename => $param{Filename}) : () );
+ $ptdata = Crypt::OpenPGP::PacketFactory->save($pt);
+ }
+ if (my $alg = $param{Compress}) {
+ require Crypt::OpenPGP::Compressed;
+ $alg = Crypt::OpenPGP::Compressed->alg_id($alg);
+ my $cdata = Crypt::OpenPGP::Compressed->new( Data => $ptdata,
+ Alg => $alg ) or return $pgp->error("Compression error: " .
+ Crypt::OpenPGP::Compressed->errstr);
+ $ptdata = Crypt::OpenPGP::PacketFactory->save($cdata);
+ }
+ require Crypt::Random;
+ my $key_data = Crypt::Random::makerandom_octet( Length => 32 );
+ my $sym_alg = $param{Cipher} ?
+ Crypt::OpenPGP::Cipher->alg_id($param{Cipher}) : DEFAULT_CIPHER;
+ my(@sym_keys);
+ if ($param{Recipients} && !ref($param{Recipients})) {
+ $param{Recipients} = [ $param{Recipients} ];
+ }
+ if (my $kid = delete $param{KeyID}) {
+ my @kid = ref $kid eq 'ARRAY' ? @$kid : $kid;
+ push @{ $param{Recipients} }, @kid;
+ }
+ if ($param{Key} || $param{Recipients}) {
+ require Crypt::OpenPGP::SessionKey;
+ my @keys;
+ if (my $recips = $param{Recipients}) {
+ my @recips = ref $recips eq 'ARRAY' ? @$recips : $recips;
+ my $ring = $pgp->pubrings->[0];
+ my %seen;
+ my $server;
+ my $cfg = $pgp->{cfg};
+ if ($cfg->get('AutoKeyRetrieve') && $cfg->get('KeyServer')) {
+ require Crypt::OpenPGP::KeyServer;
+ $server = Crypt::OpenPGP::KeyServer->new(
+ Server => $cfg->get('KeyServer'),
+ );
+ }
+ for my $r (@recips) {
+ my($lr, @kb) = (length($r));
+ if (($lr == 8 || $lr == 16) && $r !~ /[^\da-fA-F]/) {
+ my $id = pack 'H*', $r;
+ @kb = $ring->find_keyblock_by_keyid($id) if $ring;
+ @kb = $server->find_keyblock_by_keyid($id)
+ if !@kb && $server;
+ } else {
+ @kb = $ring->find_keyblock_by_uid($r) if $ring;
+ @kb = $server->find_keyblock_by_uid($r)
+ if !@kb && $server;
+ }
+ for my $kb (@kb) {
+ next unless my $cert = $kb->encrypting_key;
+ next if $seen{ $cert->key_id }++;
+ $cert->uid($kb->primary_uid);
+ push @keys, $cert;
+ }
+ }
+ if (my $cb = $param{RecipientsCallback}) {
+ @keys = @{ $cb->(\@keys) };
+ }
+ }
+ if ($param{Key}) {
+ push @keys, ref $param{Key} eq 'ARRAY' ? @{$param{Key}} :
+ $param{Key};
+ }
+ return $pgp->error("No known recipients for encryption")
+ unless @keys;
+ for my $key (@keys) {
+ push @sym_keys, Crypt::OpenPGP::SessionKey->new(
+ Key => $key,
+ SymKey => $key_data,
+ Cipher => $sym_alg,
+ ) or
+ return $pgp->error( Crypt::OpenPGP::SessionKey->errstr );
+ }
+ }
+ elsif (my $pass = $param{Passphrase}) {
+ require Crypt::OpenPGP::SKSessionKey;
+ require Crypt::OpenPGP::S2k;
+ my $s2k;
+ if ($param{Compat} && $param{Compat} eq 'PGP2') {
+ $s2k = Crypt::OpenPGP::S2k->new('Simple');
+ $s2k->{hash} = Crypt::OpenPGP::Digest->new('MD5');
+ } else {
+ $s2k = Crypt::OpenPGP::S2k->new('Salt_Iter');
+ }
+ my $keysize = Crypt::OpenPGP::Cipher->new($sym_alg)->keysize;
+ $key_data = $s2k->generate($pass, $keysize);
+ push @sym_keys, Crypt::OpenPGP::SKSessionKey->new(
+ Passphrase => $pass,
+ SymKey => $key_data,
+ Cipher => $sym_alg,
+ S2k => $s2k,
+ ) or
+ return $pgp->error( Crypt::OpenPGP::SKSessionKey->errstr );
+ } else {
+ return $pgp->error("Need something to encrypt with");
+ }
+ my $enc = Crypt::OpenPGP::Ciphertext->new(
+ MDC => $param{MDC},
+ SymKey => $key_data,
+ Data => $ptdata,
+ Cipher => $sym_alg,
+ );
+ my $enc_data = Crypt::OpenPGP::PacketFactory->save(
+ $param{Passphrase} && $param{Compat} && $param{Compat} eq 'PGP2' ?
+ $enc : (@sym_keys, $enc)
+ );
+ if ($param{Armour}) {
+ require Crypt::OpenPGP::Armour;
+ $enc_data = Crypt::OpenPGP::Armour->armour(
+ Data => $enc_data,
+ Object => 'MESSAGE',
+ ) or return $pgp->error( Crypt::OpenPGP::Armour->errstr );
+ }
+ $enc_data;
+}
+
+sub decrypt {
+ my $pgp = shift;
+ my %param = @_;
+ my $wants_verify = wantarray;
+ my($data);
+ unless ($data = $param{Data}) {
+ my $file = $param{Filename} or
+ return $pgp->error("Need either 'Data' or 'Filename' to decrypt");
+ $data = $pgp->_read_files($file) or return $pgp->error($pgp->errstr);
+ }
+ my $msg = Crypt::OpenPGP::Message->new( Data => $data ) or
+ return $pgp->error("Reading data packets failed: " .
+ Crypt::OpenPGP::Message->errstr);
+ my @pieces = $msg->pieces;
+ return $pgp->error("No packets found in message") unless @pieces;
+ while (ref($pieces[0]) eq 'Crypt::OpenPGP::Marker') {
+ shift @pieces;
+ }
+ my($key, $alg);
+ if (ref($pieces[0]) eq 'Crypt::OpenPGP::SessionKey') {
+ my($sym_key, $cert, $ring) = (shift @pieces);
+ unless ($cert = $param{Key}) {
+ $ring = $pgp->secrings->[0]
+ or return $pgp->error("No secret keyrings");
+ }
+ my($kb);
+ while (ref($sym_key) eq 'Crypt::OpenPGP::SessionKey') {
+ if ($cert) {
+ if ($cert->key_id eq $sym_key->key_id) {
+ shift @pieces
+ while ref($pieces[0]) eq 'Crypt::OpenPGP::SessionKey';
+ last;
+ }
+ } else {
+ if ($kb = $ring->find_keyblock_by_keyid($sym_key->key_id)) {
+ shift @pieces
+ while ref($pieces[0]) eq 'Crypt::OpenPGP::SessionKey';
+ last;
+ }
+ }
+ $sym_key = shift @pieces;
+ }
+ return $pgp->error("Can't find a secret key to decrypt message")
+ unless $kb || $cert;
+ if ($kb) {
+ $cert = $kb->encrypting_key;
+ $cert->uid($kb->primary_uid);
+ }
+ if ($cert->is_protected) {
+ my $pass = $param{Passphrase};
+ if (!defined $pass && (my $cb = $param{PassphraseCallback})) {
+ $pass = $cb->($cert);
+ }
+ return $pgp->error("Need passphrase to unlock secret key")
+ unless $pass;
+ $cert->unlock($pass) or
+ return $pgp->error("Seckey unlock failed: " . $cert->errstr);
+ }
+ ($key, $alg) = $sym_key->decrypt($cert) or
+ return $pgp->error("Symkey decrypt failed: " . $sym_key->errstr);
+ }
+ elsif (ref($pieces[0]) eq 'Crypt::OpenPGP::SKSessionKey') {
+ my $sym_key = shift @pieces;
+ my $pass = $param{Passphrase};
+ if (!defined $pass && (my $cb = $param{PassphraseCallback})) {
+ $pass = $cb->();
+ }
+ return $pgp->error("Need passphrase to decrypt session key")
+ unless $pass;
+ ($key, $alg) = $sym_key->decrypt($pass) or
+ return $pgp->error("Symkey decrypt failed: " . $sym_key->errstr);
+ }
+ my $enc = $pieces[0];
+
+ ## If there is still no symkey and symmetric algorithm, *and* the
+ ## first packet is a Crypt::OpenPGP::Ciphertext packet, assume that
+ ## the packet is encrypted using a symmetric key, using a 'Simple' s2k.
+ if (!$key && !$alg && ref($enc) eq 'Crypt::OpenPGP::Ciphertext') {
+ my $pass = $param{Passphrase} or
+ return $pgp->error("Need passphrase to decrypt session key");
+ require Crypt::OpenPGP::Cipher;
+ require Crypt::OpenPGP::S2k;
+ my $ciph = Crypt::OpenPGP::Cipher->new('IDEA');
+ my $s2k = Crypt::OpenPGP::S2k->new('Simple');
+ $s2k->{hash} = Crypt::OpenPGP::Digest->new('MD5');
+ $key = $s2k->generate($pass, $ciph->keysize);
+ $alg = $ciph->alg_id;
+ }
+
+ $data = $enc->decrypt($key, $alg) or
+ return $pgp->error("Ciphertext decrypt failed: " . $enc->errstr);
+
+ ## This is a special hack: if decrypt gets a signed, encrypted message,
+ ## it needs to be able to pass back the decrypted text *and* a flag
+ ## saying whether the signature is valid or not. But in some cases,
+ ## you don't know ahead of time if there is a signature at all--and if
+ ## there isn't, there is no way of knowing whether the signature is valid,
+ ## or if there isn't a signature at all. So this prepopulates the internal
+ ## errstr with the string "No Signature\n"--if there is a signature, and
+ ## there is an error during verification, the second return value will be
+ ## undef, and the errstr will contain the error that occurred. If there is
+ ## *not* a signature, the second return value will still be undef, but
+ ## the errstr is guaranteed to be "No Signature\n".
+ $pgp->error("No Signature");
+
+ my($valid, $sig);
+ $msg = Crypt::OpenPGP::Message->new( Data => $data,
+ IsPacketStream => 1 );
+ @pieces = $msg->pieces;
+
+ ## If the first packet in the decrypted data is compressed,
+ ## decompress it and set the list of packets to the result.
+ if (ref($pieces[0]) eq 'Crypt::OpenPGP::Compressed') {
+ $data = $pieces[0]->decompress or
+ return $pgp->error("Decompression error: " . $pieces[0]->errstr);
+ $msg = Crypt::OpenPGP::Message->new( Data => $data,
+ IsPacketStream => 1 );
+ @pieces = $msg->pieces;
+ }
+
+ my($pt);
+ if (ref($pieces[0]) eq 'Crypt::OpenPGP::OnePassSig' ||
+ ref($pieces[0]) eq 'Crypt::OpenPGP::Signature') {
+ $pt = $pieces[1];
+ if ($wants_verify) {
+ ($valid, $sig) =
+ $pgp->verify( Signature => $data, IsPacketStream => 1 );
+ }
+ } else {
+ $pt = $pieces[0];
+ }
+
+ $wants_verify ? ($pt->data, $valid, $sig) : $pt->data;
+}
+
+sub keygen {
+ my $pgp = shift;
+ my %param = @_;
+ require Crypt::OpenPGP::Certificate;
+ require Crypt::OpenPGP::Key;
+ require Crypt::OpenPGP::KeyBlock;
+ require Crypt::OpenPGP::Signature;
+ require Crypt::OpenPGP::UserID;
+
+ $param{Type} or
+ return $pgp->error("Need a Type of key to generate");
+ $param{Size} ||= 1024;
+ $param{Version} ||= 4;
+ $param{Version} = 3 if $param{Type} eq 'RSA';
+
+ my $kb_pub = Crypt::OpenPGP::KeyBlock->new;
+ my $kb_sec = Crypt::OpenPGP::KeyBlock->new;
+
+ my($pub, $sec) = Crypt::OpenPGP::Key->keygen($param{Type}, %param);
+ die Crypt::OpenPGP::Key->errstr unless $pub && $sec;
+ my $pubcert = Crypt::OpenPGP::Certificate->new(
+ Key => $pub,
+ Version => $param{Version}
+ ) or
+ die Crypt::OpenPGP::Certificate->errstr;
+ my $seccert = Crypt::OpenPGP::Certificate->new(
+ Key => $sec,
+ Passphrase => $param{Passphrase},
+ Version => $param{Version}
+ ) or
+ die Crypt::OpenPGP::Certificate->errstr;
+ $kb_pub->add($pubcert);
+ $kb_sec->add($seccert);
+
+ my $id = Crypt::OpenPGP::UserID->new( Identity => $param{Identity} );
+ $kb_pub->add($id);
+ $kb_sec->add($id);
+
+ my $sig = Crypt::OpenPGP::Signature->new(
+ Data => [ $pubcert, $id ],
+ Key => $seccert,
+ Version => $param{Version},
+ Type => 0x13,
+ );
+ $kb_pub->add($sig);
+ $kb_sec->add($sig);
+
+ ($kb_pub, $kb_sec);
+}
+
+sub _read_files {
+ my $pgp = shift;
+ return $pgp->error("No files specified") unless @_;
+ my @files = @_;
+ my $data = '';
+ for my $file (@files) {
+ $file ||= '';
+ local *FH;
+ open FH, $file or return $pgp->error("Error opening $file: $!");
+ binmode FH;
+ { local $/; $data .= <FH> }
+ close FH or warn "Warning: Got error closing $file: $!";
+ }
+ $data;
+}
+
+{
+ my @MERGE_CONFIG = qw( Cipher Armour Digest );
+ sub _merge_compat {
+ my $pgp = shift;
+ my($param, $meth) = @_;
+ my $compat = $param->{Compat} || $pgp->{cfg}->get('Compat') || return 1;
+ my $ref = $COMPAT{$compat}{$meth} or
+ return $pgp->error("No settings for Compat class '$compat'");
+ for my $arg (keys %$ref) {
+ $param->{$arg} = $ref->{$arg} unless exists $param->{$arg};
+ }
+ for my $key (@MERGE_CONFIG) {
+ $param->{$key} = $pgp->{cfg}->get($key)
+ unless exists $param->{$key};
+ }
+ 1;
+ }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP - Pure-Perl OpenPGP implementation
+
+=head1 SYNOPSIS
+
+ my $pgp = Crypt::OpenPGP->new;
+
+ # Given an input stream (could be a signature, ciphertext, etc),
+ # do the "right thing" to it.
+ my $message_body; $message_body .= $_ while <STDIN>;
+ my $result = $pgp->handle( Data => $message_body );
+
+ # Create a detached, ASCII-armoured signature of $file using the
+ # secret key $key_id, protected with the passphrase $pass.
+ my $file = 'really-from-me.txt';
+ my $key_id = '...';
+ my $pass = 'foo bar';
+ my $signature = $pgp->sign(
+ Filename => $file,
+ KeyID => $key_id,
+ Passphrase => $pass,
+ Detach => 1,
+ Armour => 1,
+ );
+
+ # Verify the detached signature $signature, which should be of the
+ # source file $file.
+ my $is_valid = $pgp->verify(
+ Signature => $signature,
+ Files => [ $file ],
+ );
+
+ # Using the public key associated with $key_id, encrypt the contents
+ # of the file $file, and ASCII-armour the ciphertext.
+ my $ciphertext = $pgp->encrypt(
+ Filename => $file,
+ Recipients => $key_id,
+ Armour => 1,
+ );
+
+ # Decrypt $ciphertext using the secret key used to encrypt it,
+ # which key is protected with the passphrase $pass.
+ my $plaintext = $pgp->decrypt(
+ Data => $ciphertext,
+ Passphrase => $pass,
+ );
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP> is a pure-Perl implementation of the OpenPGP
+standard[1]. In addition to support for the standard itself,
+I<Crypt::OpenPGP> claims compatibility with many other PGP implementations,
+both those that support the standard and those that preceded it.
+
+I<Crypt::OpenPGP> provides signing/verification, encryption/decryption,
+keyring management, and key-pair generation; in short it should provide
+you with everything you need to PGP-enable yourself. Alternatively it
+can be used as part of a larger system; for example, perhaps you have
+a web-form-to-email generator written in Perl, and you'd like to encrypt
+outgoing messages, because they contain sensitive information.
+I<Crypt::OpenPGP> can be plugged into such a scenario, given your public
+key, and told to encrypt all messages; they will then be readable only
+by you.
+
+This module currently supports C<RSA> and C<DSA> for digital signatures,
+and C<RSA> and C<ElGamal> for encryption/decryption. It supports the
+symmetric ciphers C<3DES>, C<Blowfish>, C<IDEA>, C<Twofish>, C<CAST5>, and
+C<Rijndael> (C<AES>). C<Rijndael> is supported for key sizes of C<128>,
+C<192>, and C<256> bits. I<Crypt::OpenPGP> supports the digest algorithms
+C<MD5>, C<SHA-1>, and C<RIPE-MD/160>. And it supports C<ZIP> and C<Zlib>
+compression.
+
+=head1 COMPATIBILITY
+
+One of the highest priorities for I<Crypt::OpenPGP> is compatibility with
+other PGP implementations, including PGP implementations that existed
+before the OpenPGP standard.
+
+As a means towards that end, some of the high-level I<Crypt::OpenPGP>
+methods can be used in compatibility mode; given an argument I<Compat>
+and a PGP implementation with which they should be compatible, these
+method will do their best to choose ciphers, digest algorithms, etc. that
+are compatible with that implementation. For example, PGP2 only supports
+C<IDEA> encryption, C<MD5> digests, and version 3 signature formats; if
+you tell I<Crypt::OpenPGP> that it must be compatible with PGP2, it will
+only use these algorithms/formats when encrypting and signing data.
+
+To use this feature, supply either I<sign> or I<encrypt> with the
+I<Compat> parameter, giving it one of the values from the list below.
+For example:
+
+ my $ct = $pgp->encrypt(
+ Compat => 'PGP2',
+ Filename => 'foo.pl',
+ Recipients => $key_id,
+ );
+
+Because I<PGP2> was specified, the data will automatically be encrypted
+using the C<IDEA> cipher, and will be compressed using C<ZIP>.
+
+Here is a list of the current compatibility sets and the algorithms and
+formats they support.
+
+=over 4
+
+=item * PGP2
+
+Encryption: symmetric cipher = C<IDEA>, compression = C<ZIP>,
+modification detection code (MDC) = C<0>
+
+Signing: digest = C<MD5>, packet format = version 3
+
+=item * PGP5
+
+Encryption: symmetric cipher = C<3DES>, compression = C<ZIP>,
+modification detection code (MDC) = C<0>
+
+Signing: digest = C<SHA-1>, packet format = version 3
+
+=item * GnuPG
+
+Encryption: symmetric cipher = C<Rijndael>, compression = C<Zlib>,
+modification detection code (MDC) = C<1>
+
+Signing: digest = C<RIPE-MD/160>, packet format = version 4
+
+=back
+
+If the compatibility setting is unspecified (that is, if no I<Compat>
+argument is supplied), the settings (ciphers, digests, etc.) fall
+back to their default settings.
+
+=head1 USAGE
+
+I<Crypt::OpenPGP> has the following high-level interface. On failure,
+all methods will return C<undef> and set the I<errstr> for the object;
+look below at the I<ERROR HANDLING> section for more information.
+
+=head2 Crypt::OpenPGP->new( %args )
+
+Constructs a new I<Crypt::OpenPGP> instance and returns that object.
+Returns C<undef> on failure.
+
+I<%args> can contain:
+
+=over 4
+
+=item * Compat
+
+The compatibility mode for this I<Crypt::OpenPGP> object. This value will
+propagate down into method calls upon this object, meaning that it will be
+applied for all method calls invoked on this object. For example, if you set
+I<Compat> here, you do not have to set it again when calling I<encrypt>
+or I<sign> (below), unless, of course, you want to set I<Compat> to a
+different value for those methods.
+
+I<Compat> influences several factors upon object creation, unless otherwise
+overridden in the constructor arguments: if you have a configuration file
+for this compatibility mode (eg. F<~/.gnupg/options> for GnuPG), it will
+be automatically read in, and I<Crypt::OpenPGP> will set any options
+relevant to its execution (symmetric cipher algorithm, etc.); I<PubRing>
+and I<SecRing> (below) are set according to the default values for this
+compatibility mode (eg. F<~/.gnupg/pubring.gpg> for the GnuPG public
+keyring).
+
+=item * SecRing
+
+Path to your secret keyring. If unspecified, I<Crypt::OpenPGP> will look
+for your keyring in a number of default places.
+
+As an alternative to passing in a path to the keyring file, you can pass in
+a I<Crypt::OpenPGP::KeyRing> object representing a secret keyring.
+
+=item * PubRing
+
+Path to your public keyring. If unspecified, I<Crypt::OpenPGP> will look
+for your keyring in a number of default places.
+
+As an alternative to passing in a path to the keyring file, you can pass in
+a I<Crypt::OpenPGP::KeyRing> object representing a public keyring.
+
+=item * ConfigFile
+
+Path to a PGP/GnuPG config file. If specified, you must also pass in a
+value for the I<Compat> parameter, stating what format config file you are
+passing in. For example, if you are passing in the path to a GnuPG config
+file, you should give a value of C<GnuPG> for the I<Compat> flag.
+
+If you leave I<ConfigFile> unspecified, but you have specified a value for
+I<Compat>, I<Crypt::OpenPGP> will try to find your config file, based on
+the value of I<Compat> that you pass in (eg. F<~/.gnupg/options> if
+I<Compat> is C<GnuPG>).
+
+NOTE: if you do not specify a I<Compat> flag, I<Crypt::OpenPGP> cannot read
+any configuration files, even if you I<have> specified a value for the
+I<ConfigFile> parameter, because it will not be able to determine the proper
+config file format.
+
+=item * KeyServer
+
+The hostname of the HKP keyserver. You can get a list of keyservers through
+
+ % host -l pgp.net | grep wwwkeys
+
+If I<AutoKeyRetrieve> is set to a true value,
+keys will be automatically retrieved from the keyserver if they are not found
+in your local keyring.
+
+=item * AutoKeyRetrieve
+
+If set to a true value, and if I<KeyServer> is set to a keyserver name,
+I<encrypt> and I<verify> will automatically try to fetch public keys from
+the keyserver if they are not found in your local keyring.
+
+=back
+
+=head2 $pgp->handle( %args )
+
+A do-what-I-mean wrapper around I<decrypt> and I<verify>. Given either a
+filename or a block of data--for example, data from an incoming email
+message--I<handle> "handles" it as appropriate for whatever encryption or
+signing the message contains. For example, if the data is encrypted, I<handle>
+will return the decrypted data (after prompting you for the passphrase). If
+the data is signed, I<handle> will check the validity of the signature and
+return indication of the validity of the signature.
+
+The return value is a reference to a hash, which may contain the following
+keys, depending on the data passed to the method:
+
+=over 4
+
+=item * Plaintext
+
+If the data is encrypted, the decrypted message.
+
+=item * Validity
+
+If the data is signed, a true value if the signature is valid, a false value
+otherwise. The true value will be either the signer's email address, if
+available, or C<1>, if not.
+
+=item * Signature
+
+If the data is signed, the I<Crypt::OpenPGP::Signature> object representing
+the signature.
+
+=back
+
+If an error occurs, the return value will be C<undef>, and the error message
+can be obtained by calling I<errstr> on the I<Crypt::OpenPGP> object.
+
+I<%args> can contain:
+
+=over 4
+
+=item * Data
+
+The data to be "handled". This should be a simple scalar containing an
+arbitrary amount of data.
+
+I<Data> is optional; if unspecified, you should specify a filename (see
+I<Filename>, below).
+
+=item * Filename
+
+The path to a file to "handle".
+
+I<Filename> is optional; if unspecified, you should specify the data
+in I<Data>, above. If both I<Data> and I<Filename> are specified, the
+data in I<Data> overrides that in I<Filename>.
+
+=item * PassphraseCallback
+
+If the data is encrypted, you will need to supply I<handle> with the proper
+passphrase to unlock the private key, or the password to decrypt the
+symmetrically-encrypted data (depending on the method of encryption used).
+If you do not specify this parameter, this default passphrase callback will be
+used:
+
+ sub _default_passphrase_cb {
+ my($cert) = @_;
+ my $prompt;
+ if ($cert) {
+ $prompt = sprintf qq(
+ You need a passphrase to unlock the secret key for
+ user "%s".
+ %d-bit %s key, ID %s
+
+ Enter passphrase: ), $cert->uid,
+ $cert->key->size,
+ $cert->key->alg,
+ substr($cert->key_id_hex, -8, 8);
+ } else {
+ $prompt = "Enter passphrase: ";
+ }
+ _prompt($prompt, '', 1);
+ }
+
+If you do specify this parameter, make sure that your callback function can
+handle both asymmetric and symmetric encryption.
+
+See the I<PassphraseCallback> parameter for I<decrypt>, below.
+
+=back
+
+=head2 $pgp->encrypt( %args )
+
+Encrypts a block of data. The encryption is actually done with a symmetric
+cipher; the key for the symmetric cipher is then encrypted with either
+the public key of the recipient or using a passphrase that you enter. The
+former case is using public-key cryptography, the latter, standard
+symmetric ciphers. In the first case, the session key can only be
+unlocked by someone with the corresponding secret key; in the second, it
+can only be unlocked by someone who knows the passphrase.
+
+Given the parameter I<SignKeyID> (see below), I<encrypt> will first sign
+the message before encrypting it, adding a Signature packet to the
+encrypted plaintext.
+
+Returns a block of data containing two PGP packets: the encrypted
+symmetric key and the encrypted data.
+
+On failure returns C<undef>.
+
+I<%args> can contain:
+
+=over 4
+
+=item * Compat
+
+Specifies the PGP compatibility setting. See I<COMPATIBILITY>, above.
+
+=item * Data
+
+The plaintext to be encrypted. This should be a simple scalar containing
+an arbitrary amount of data.
+
+I<Data> is optional; if unspecified, you should specify a filename (see
+I<Filename>, below).
+
+=item * Filename
+
+The path to a file to encrypt.
+
+I<Filename> is optional; if unspecified, you should specify the data
+in I<Data>, above. If both I<Data> and I<Filename> are specified, the
+data in I<Data> overrides that in I<Filename>.
+
+=item * Recipients
+
+The intended recipients of the encrypted message. In other words,
+either the key IDs or user IDs of the public keys that should be used
+to encrypt the message. Each recipient specified should be either a
+key ID--an 8-digit or 16-digit hexadecimal number--or part of a user
+ID that can be used to look up the user's public key in your keyring.
+Examples:
+
+ 8-digit hex key ID: 123ABC45
+ 16-digit hex key ID: 678DEF90123ABC45
+ (Part of) User ID: foo@bar
+
+Note that the 8-digit hex key ID is the last 8 digits of the (long)
+16-digit hex key ID.
+
+If you wish to encrypt the message for multiple recipients, the value
+of I<Recipients> should be a reference to a list of recipients (as
+defined above). For each recipient in the list, the public key will be
+looked up in your public keyring, and an encrypted session key packet
+will be added to the encrypted message.
+
+This argument is optional; if not provided you should provide the
+I<Passphrase> option (below) to perform symmetric-key encryption when
+encrypting the session key.
+
+=item * KeyID
+
+A deprecated alias for I<Recipients> (above). There is no need to use
+I<KeyID>, as its functionality has been completely subsumed into the
+I<Recipients> parameter.
+
+=item * Passphrase
+
+The mechanism to use symmetric-key, or "conventional", encryption,
+when encrypting the session key. In other words, this allows you to
+use I<Crypt::OpenPGP> for encryption/decryption without using public-key
+cryptography; this can be useful in certain circumstances (for example,
+when encrypting data locally on disk).
+
+This argument is optional; if not provided you should provide the
+I<Recipients> option (above) to perform public-key encryption when
+encrypting the session key.
+
+=item * RecipientsCallback
+
+After the list of recipients for a message (as given in I<Recipients>,
+above) has been mapped into a set of keys from your public keyring,
+you can use I<RecipientsCallback> to review/modify that list of keys.
+The value of I<RecipientsCallback> should be a reference to a
+subroutine; when invoked that routine will be handed a reference to
+an array of I<Crypt::OpenPGP::Certificate> objects. It should then
+return a reference to a list of such objects.
+
+This can be useful particularly when supplying user IDs in the list
+of I<Recipients> for an encrypted message. Since user IDs are looked
+up using partial matches (eg. I<b> could match I<b>, I<abc>, I<bar>,
+etc.), one intended recipient may actually turn up multiple keys.
+You can use I<RecipientsCallback> to audit that list before actually
+encrypting the message:
+
+ my %BAD_KEYS = (
+ ABCDEF1234567890 => 1,
+ 1234567890ABCDEF => 1,
+ );
+ my $cb = sub {
+ my $keys = shift;
+ my @return;
+ for my $cert (@$keys) {
+ push @return, $cert unless $BAD_KEYS{ $cert->key_id_hex };
+ }
+ \@returns;
+ };
+ my $ct = $pgp->encrypt( ..., RecipientsCallback => $cb, ... );
+
+=item * Cipher
+
+The name of a symmetric cipher with which the plaintext will be
+encrypted. Valid arguments are C<DES3>, C<CAST5>, C<Blowfish>, C<IDEA>,
+C<Twofish>, C<Rijndael>, C<Rijndael192>, and C<Rijndael256> (the last
+two are C<Rijndael> with key sizes of 192 and 256 bits, respectively).
+
+This argument is optional; if you have provided a I<Compat> parameter,
+I<Crypt::OpenPGP> will use the appropriate cipher for the supplied
+compatibility mode. Otherwise, I<Crypt::OpenPGP> currently defaults to
+C<DES3>; this could change in the future.
+
+=item * Compress
+
+The name of a compression algorithm with which the plaintext will be
+compressed before it is encrypted. Valid values are C<ZIP> and
+C<Zlib>.
+
+By default text is not compressed.
+
+=item * Armour
+
+If true, the data returned from I<encrypt> will be ASCII-armoured. This
+can be useful when you need to send data through email, for example.
+
+By default the returned data is not armoured.
+
+=item * SignKeyID
+
+If you wish to sign the plaintext message before encrypting it, provide
+I<encrypt> with the I<SignKeyID> parameter and give it a key ID with
+which the message can be signed. This allows recipients of your message
+to verify its validity.
+
+By default messages not signed.
+
+=item * SignPassphrase
+
+The passphrase to unlock the secret key to be used when signing the
+message.
+
+If you are signing the message--that is, if you have provided the
+I<SignKeyID> parameter--either this argument or I<SignPassphraseCallback>
+is required.
+
+=item * SignPassphraseCallback
+
+The callback routine to enable the passphrase being passed in through
+some user-defined routine. See the I<PassphraseCallback> parameter for
+I<sign>, below.
+
+If you are signing the message--that is, if you have provided the
+I<SignKeyID> parameter--either this argument or I<SignPassphrase> is
+required.
+
+=item * MDC
+
+When set to a true value, instructs I<encrypt> to use encrypted MDC
+(modification detection code) packets instead of standard encrypted
+data packets. These are a newer form of encrypted data packets that
+are followed by a C<SHA-1> hash of the plaintext data. This prevents
+attacks that modify the encrypted text by using a message digest to
+detect changes.
+
+By default I<MDC> is set to C<0>, and I<encrypt> generates standard
+encrypted data packets. Set it to a true value to turn on MDC packets.
+Note that I<MDC> will automatically be turned on if you are using a
+I<Compat> mode that is known to support it.
+
+=back
+
+=head2 $pgp->decrypt( %args )
+
+Decrypts a block of ciphertext. The ciphertext should be of the sort
+returned from I<encrypt>, in either armoured or non-armoured form.
+This is compatible with all other implementations of PGP: the output
+of their encryption should serves as the input to this method.
+
+When called in scalar context, returns the plaintext (that is, the
+decrypted ciphertext), or C<undef> on failure. When called in list
+context, returns a three-element list containing the plaintext and the
+result of signature verification (see next paragraph), or the empty
+list on failure. Either of the failure conditions listed here indicates
+that decryption failed.
+
+If I<decrypt> is called in list context, and the encrypted text
+contains a signature over the plaintext, I<decrypt> will attempt to
+verify the signature and will return the result of that verification
+as the second element in the return list, and the actual
+I<Crypt::OpenPGP::Signature> object as the third element in the return
+list. If you call I<decrypt> in
+list context and the ciphertext does I<not> contain a signature, that
+second element will be C<undef>, and the I<errstr> will be set to
+the string C<No Signature\n>. The second element in the return list can
+have one of three possible values: C<undef>, meaning that either an
+error occurred in verifying the signature, I<or> the ciphertext did
+not contain a signature; C<0>, meaning that the signature is invalid;
+or a true value of either the signer's user ID or C<1>, if the user ID
+cannot be determined. Note that these are the same values returned from
+I<verify> (below).
+
+For example, to decrypt a message that may contain a signature that you
+want verified, you might use code like this:
+
+ my($pt, $valid, $sig) = $pgp->decrypt( ... );
+ die "Decryption failed: ", $pgp->errstr unless $pt;
+ die "Signature verification failed: ", $pgp->errstr
+ unless defined $valid || $pgp->errstr !~ /^No Signature/;
+ print "Signature created at ", $sig->timestamp, "\n";
+
+This checks for errors in decryption, as well as errors in signature
+verification, excluding the error denoting that the plaintext was
+not signed.
+
+I<%args> can contain:
+
+=over 4
+
+=item * Data
+
+The ciphertext to be decrypted. This should be a simple scalar containing
+an arbitrary amount of data.
+
+I<Data> is optional; if unspecified, you should specify a filename (see
+I<Filename>, below).
+
+=item * Filename
+
+The path to a file to decrypt.
+
+I<Filename> is optional; if unspecified, you should specify the data
+in I<Data>, above. If both I<Data> and I<Filename> are specified, the
+data in I<Data> overrides that in I<Filename>.
+
+=item * Passphrase
+
+The passphrase to unlock your secret key, or to decrypt a
+symmetrically-encrypted message; the usage depends on how the message is
+encrypted.
+
+This argument is optional if your secret key is protected; if not
+provided you should supply the I<PassphraseCallback> parameter (below).
+
+=item * PassphraseCallback
+
+A callback routine to allow interactive users (for example) to enter the
+passphrase for the specific key being used to decrypt the ciphertext, or
+the passphrase used to encrypt a symmetrically-encrypted message. This
+is useful when your ciphertext is encrypted to several recipients, if
+you do not necessarily know ahead of time the secret key that will be used
+to decrypt it. It is also useful when you wish to provide an interactive
+user with some feedback about the key being used to decrypt the message,
+or when you don't know what type of encryption (symmetric or public-key)
+will be used to encrypt a message.
+
+The value of this parameter should be a reference to a subroutine. This
+routine will be called when a passphrase is needed from the user, and
+it will be given either zero arguments or one argument, depending on
+whether the message is encrypted symmetrically (zero arguments) or using
+public-key encryption (one argument). If the latter, the one argument is
+a I<Crypt::OpenPGP::Certificate> object representing the secret key. You
+can use the information in this object to present details about the key to
+the user.
+
+In either case, the callback routine should return the passphrase, a
+scalar string.
+
+Your callback routine can use the number of arguments to determine how to
+prompt the user for a passphrase; for example:
+
+ sub passphrase_cb {
+ if (my $cert = $_[0]) {
+ printf "Enter passphrase for secret key %s: ",
+ $cert->key_id_hex;
+ } else {
+ print "Enter passphrase: ";
+ }
+ }
+
+This argument is optional if your secret key is protected; if not
+provided you should supply the I<Passphrase> parameter (above).
+
+=back
+
+=head2 $pgp->sign( %args )
+
+Creates and returns a digital signature on a block of data.
+
+On failure returns C<undef>.
+
+I<%args> can contain:
+
+=over 4
+
+=item * Compat
+
+Specifies the PGP compatibility setting. See I<COMPATIBILITY>, above.
+
+=item * Data
+
+The text to be signed. This should be a simple scalar containing an
+arbitrary amount of data.
+
+I<Data> is optional; if unspecified, you should specify a filename (see
+I<Filename>, below).
+
+=item * Filename
+
+The path to a file to sign.
+
+I<Filename> is optional; if unspecified, you should specify the data
+in I<Data>, above. If both I<Data> and I<Filename> are specified, the
+data in I<Data> overrides that in I<Filename>.
+
+=item * Detach
+
+If set to a true value the signature created will be a detached
+signature; that is, a signature that does not contain the original
+text. This assumes that the person who will be verifying the signature
+can somehow obtain the original text (for example, if you sign the text
+of an email message, the original text is the message).
+
+By default signatures are not detached.
+
+=item * Armour
+
+If true, the data returned from I<sign> will be ASCII-armoured. This
+can be useful when you need to send data through email, for example.
+
+By default the returned signature is not armoured.
+
+=item * Clearsign
+
+If true, the signature created on the data is a clear-text signature.
+This form of signature displays the clear text of the signed data,
+followed by the ASCII-armoured signature on that data. Such a format
+is desirable when sending signed messages to groups of users who may
+or may not have PGP, because it allows the text of the message to be
+readable without special software.
+
+When I<Clearsign> is set to true, I<Armour> and I<Detach> are
+automatically turned on, because the signature created is a detached,
+armoured signature.
+
+By default I<Clearsign> is false.
+
+=item * KeyID
+
+The ID of the secret key that should be used to sign the message. The
+value of the key ID should be specified as a 16-digit hexadecimal number.
+
+This argument is mandatory.
+
+=item * Passphrase
+
+The passphrase to unlock your secret key.
+
+This argument is optional if your secret key is protected; if not
+provided you should supply the I<PassphraseCallback> parameter (below).
+
+=item * PassphraseCallback
+
+A callback routine to allow interactive users (for example) to enter the
+passphrase for the specific key being used to sign the message. This is
+useful when you wish to provide an interactive user with some feedback
+about the key being used to sign the message.
+
+The value of this parameter should be a reference to a subroutine. This
+routine will be called when a passphrase is needed from the user, and
+it will be given one argument: a I<Crypt::OpenPGP::Certificate> object
+representing the secret key. You can use the information in this object
+to present details about the key to the user. The callback routine
+should return the passphrase, a scalar string.
+
+This argument is optional if your secret key is protected; if not
+provided you should supply the I<Passphrase> parameter (above).
+
+=item * Digest
+
+The digest algorithm to use when creating the signature; the data to be
+signed is hashed by a message digest algorithm, then signed. Possible
+values are C<MD5>, C<SHA1>, and C<RIPEMD160>.
+
+This argument is optional; if not provided, the digest algorithm will be
+set based on the I<Compat> setting provided to I<sign> or I<new>. If you
+have not provided a I<Compat> setting, I<SHA1> will be used.
+
+=item * Version
+
+The format version of the created signature. The two possible values
+are C<3> and C<4>; version 4 signatures will not be compatible with
+older PGP implementations.
+
+The default value is C<4>, although this could change in the future.
+
+=back
+
+=head2 $pgp->verify( %args )
+
+Verifies a digital signature. Returns true for a valid signature, C<0>
+for an invalid signature, and C<undef> if an error occurs (in which
+case you should call I<errstr> to determine the source of the error).
+The 'true' value returned for a successful signature will be, if available,
+the PGP User ID of the person who created the signature. If that
+value is unavailable, the return value will be C<1>.
+
+If called in list context, the second element returned in the return list
+will be the I<Crypt::OpenPGP::Signature> object representing the actual
+signature.
+
+I<%args> can contain:
+
+=over 4
+
+=item * Signature
+
+The signature data, as returned from I<sign>. This data can be either
+a detached signature or a non-detached signature. If the former, you
+will need to specify the list of files comprising the original signed
+data (see I<Data> or I<Files>, below).
+
+Either this argument or I<SigFile> is required.
+
+=item * SigFile
+
+The path to a file containing the signature data. This data can be either
+a detached signature or a non-detached signature. If the former, you
+will need to specify the list of files comprising the original signed
+data (see I<Data> or I<Files>, below).
+
+Either this argument or I<SigFile> is required.
+
+=item * Data
+
+Specifies the original signed data.
+
+If the signature (in either I<Signature> or I<SigFile>) is a detached
+signature, either I<Data> or I<Files> is a mandatory argument.
+
+=item * Files
+
+Specifies a list of files comprising the original signed data. The
+value should be a reference to a list of file paths; if there is only
+one file, the value can be specified as a scalar string, rather than
+a reference to a list.
+
+If the signature (in either I<Signature> or I<SigFile>) is a detached
+signature, either I<Data> or I<Files> is a mandatory argument.
+
+=back
+
+=head2 $pgp->keygen( %args )
+
+NOTE: this interface is alpha and could change in future releases!
+
+Generates a public/secret PGP keypair. Returns two keyblocks (objects
+of type I<Crypt::OpenPGP::KeyBlock>), a public and a secret keyblock,
+respectively. A keyblock is essentially a block of keys, subkeys,
+signatures, and user ID PGP packets.
+
+I<%args> can contain:
+
+=over 4
+
+=item * Type
+
+The type of key to generate. Currently there are two valid values:
+C<RSA> and C<DSA>. C<ElGamal> key generation is not supported at the
+moment.
+
+This is a required argument.
+
+=item * Size
+
+Bitsize of the key to be generated. This should be an even integer;
+there is no low end currently implemented in I<Crypt::OpenPGP>, but
+for the sake of security I<Size> should be at least 1024 bits.
+
+This is a required argument.
+
+=item * Identity
+
+A string that identifies the owner of the key. Typically this is the
+combination of the user's name and an email address; for example,
+
+ Foo Bar <foo@bar.com>
+
+The I<Identity> is used to build a User ID packet that is stored in
+each of the returned keyblocks.
+
+This is a required argument.
+
+=item * Passphrase
+
+String with which the secret key will be encrypted. When read in from
+disk, the key can then only be unlocked using this string.
+
+This is a required argument.
+
+=item * Version
+
+Specifies the key version; defaults to version C<4> keys. You should
+only set this to version C<3> if you know why you are doing so (for
+backwards compatibility, most likely). Version C<3> keys only support
+RSA.
+
+=item * Verbosity
+
+Set to a true value to enable a status display during key generation;
+since key generation is a relatively lengthy process, it is helpful
+to have an indication that some action is occurring.
+
+I<Verbosity> is 0 by default.
+
+=back
+
+=head1 ERROR HANDLING
+
+If an error occurs in any of the above methods, the method will return
+C<undef>. You should then call the method I<errstr> to determine the
+source of the error:
+
+ $pgp->errstr
+
+In the case that you do not yet have a I<Crypt::OpenPGP> object (that
+is, if an error occurs while creating a I<Crypt::OpenPGP> object),
+the error can be obtained as a class method:
+
+ Crypt::OpenPGP->errstr
+
+For example, if you try to decrypt some encrypted text, and you do
+not give a passphrase to unlock your secret key:
+
+ my $pt = $pgp->decrypt( Filename => "encrypted_data" )
+ or die "Decryption failed: ", $pgp->errstr;
+
+=head1 SAMPLES/TUTORIALS
+
+Take a look at F<bin/pgplet> for an example of usage of I<Crypt::OpenPGP>.
+It gives you an example of using the four main major methods (I<encrypt>,
+I<sign>, I<decrypt>, and I<verify>), as well as the various parameters to
+those methods. It also demonstrates usage of the callback parameters (eg.
+I<PassphraseCallback>).
+
+F<bin/pgplet> currently does not have any documentation, but its interface
+mirrors that of I<gpg>.
+
+=head1 LICENSE
+
+Crypt::OpenPGP is free software; you may redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 AUTHOR & COPYRIGHT
+
+Except where otherwise noted, Crypt::OpenPGP is Copyright 2001 Benjamin
+Trott, cpan@stupidfool.org. All rights reserved.
+
+=head1 REFERENCES
+
+=over 4
+
+=item 1 RFC2440 - OpenPGP Message Format (1998). http://www.faqs.org/rfcs/rfc2440.html
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Armour.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Armour.pm
new file mode 100755
index 00000000000..26177b77c9e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Armour.pm
@@ -0,0 +1,209 @@
+package Crypt::OpenPGP::Armour;
+use strict;
+
+use Crypt::OpenPGP;
+use MIME::Base64;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub armour {
+ my $class = shift;
+ my %param = @_;
+ my $data = $param{Data} or
+ return $class->error("No Data to armour");
+ my $headers = $param{Headers} || {};
+ $headers->{Version} = Crypt::OpenPGP->version_string;
+ my $head = join "\n", map { "$_: $headers->{$_}" } keys %$headers;
+ my $object = $param{Object} || 'MESSAGE';
+ (my $sdata = encode_base64($data, '')) =~ s!(.{1,64})!$1\n!g;
+
+ "-----BEGIN PGP $object-----\n" .
+ $head . "\n\n" .
+ $sdata .
+ '=' . $class->_checksum($data) .
+ "-----END PGP $object-----\n";
+}
+
+sub unarmour {
+ my $class = shift;
+ my($blob) = @_;
+ ## Get rid of DOSish newlines.
+ $blob =~ s!\r!!g;
+ my($begin, $obj, $head, $data, $end) = $blob =~
+ m!(-----BEGIN ([^\n\-]+)-----)\n(.*?\n\n)?(.+)(-----END .*?-----)!s
+ or return $class->error("Unrecognizable armour");
+ unless ($data =~ s!=([^\n]+)$!!s) {
+ return $class->error("No checksum");
+ }
+ my $csum = $1;
+ $data = decode_base64($data);
+ (my $check = $class->_checksum($data)) =~ s!\n!!;
+ return $class->error("Bad checksum") unless $check eq $csum;
+ my %headers;
+ if ($head) {
+ %headers = map { split /: /, $_, 2 } grep { /\S/ } split /\n/, $head;
+ }
+ { Data => $data,
+ Headers => \%headers,
+ Object => $obj }
+}
+
+sub _checksum {
+ my $class = shift;
+ my($data) = @_;
+ encode_base64(substr(pack('N', crc24($data)), 1));
+}
+
+{
+ my @CRC_TABLE;
+ use constant CRC24_INIT => 0xb704ce;
+
+ sub crc24 {
+ my @data = unpack 'C*', $_[0];
+ my $crc = CRC24_INIT;
+ for my $d (@data) {
+ $crc = ($crc << 8) ^ $CRC_TABLE[(($crc >> 16) ^ $d) & 0xff]
+ }
+ $crc & 0xffffff;
+ }
+
+ @CRC_TABLE = (
+ 0x00000000, 0x00864cfb, 0x018ad50d, 0x010c99f6, 0x0393e6e1,
+ 0x0315aa1a, 0x021933ec, 0x029f7f17, 0x07a18139, 0x0727cdc2,
+ 0x062b5434, 0x06ad18cf, 0x043267d8, 0x04b42b23, 0x05b8b2d5,
+ 0x053efe2e, 0x0fc54e89, 0x0f430272, 0x0e4f9b84, 0x0ec9d77f,
+ 0x0c56a868, 0x0cd0e493, 0x0ddc7d65, 0x0d5a319e, 0x0864cfb0,
+ 0x08e2834b, 0x09ee1abd, 0x09685646, 0x0bf72951, 0x0b7165aa,
+ 0x0a7dfc5c, 0x0afbb0a7, 0x1f0cd1e9, 0x1f8a9d12, 0x1e8604e4,
+ 0x1e00481f, 0x1c9f3708, 0x1c197bf3, 0x1d15e205, 0x1d93aefe,
+ 0x18ad50d0, 0x182b1c2b, 0x192785dd, 0x19a1c926, 0x1b3eb631,
+ 0x1bb8faca, 0x1ab4633c, 0x1a322fc7, 0x10c99f60, 0x104fd39b,
+ 0x11434a6d, 0x11c50696, 0x135a7981, 0x13dc357a, 0x12d0ac8c,
+ 0x1256e077, 0x17681e59, 0x17ee52a2, 0x16e2cb54, 0x166487af,
+ 0x14fbf8b8, 0x147db443, 0x15712db5, 0x15f7614e, 0x3e19a3d2,
+ 0x3e9fef29, 0x3f9376df, 0x3f153a24, 0x3d8a4533, 0x3d0c09c8,
+ 0x3c00903e, 0x3c86dcc5, 0x39b822eb, 0x393e6e10, 0x3832f7e6,
+ 0x38b4bb1d, 0x3a2bc40a, 0x3aad88f1, 0x3ba11107, 0x3b275dfc,
+ 0x31dced5b, 0x315aa1a0, 0x30563856, 0x30d074ad, 0x324f0bba,
+ 0x32c94741, 0x33c5deb7, 0x3343924c, 0x367d6c62, 0x36fb2099,
+ 0x37f7b96f, 0x3771f594, 0x35ee8a83, 0x3568c678, 0x34645f8e,
+ 0x34e21375, 0x2115723b, 0x21933ec0, 0x209fa736, 0x2019ebcd,
+ 0x228694da, 0x2200d821, 0x230c41d7, 0x238a0d2c, 0x26b4f302,
+ 0x2632bff9, 0x273e260f, 0x27b86af4, 0x252715e3, 0x25a15918,
+ 0x24adc0ee, 0x242b8c15, 0x2ed03cb2, 0x2e567049, 0x2f5ae9bf,
+ 0x2fdca544, 0x2d43da53, 0x2dc596a8, 0x2cc90f5e, 0x2c4f43a5,
+ 0x2971bd8b, 0x29f7f170, 0x28fb6886, 0x287d247d, 0x2ae25b6a,
+ 0x2a641791, 0x2b688e67, 0x2beec29c, 0x7c3347a4, 0x7cb50b5f,
+ 0x7db992a9, 0x7d3fde52, 0x7fa0a145, 0x7f26edbe, 0x7e2a7448,
+ 0x7eac38b3, 0x7b92c69d, 0x7b148a66, 0x7a181390, 0x7a9e5f6b,
+ 0x7801207c, 0x78876c87, 0x798bf571, 0x790db98a, 0x73f6092d,
+ 0x737045d6, 0x727cdc20, 0x72fa90db, 0x7065efcc, 0x70e3a337,
+ 0x71ef3ac1, 0x7169763a, 0x74578814, 0x74d1c4ef, 0x75dd5d19,
+ 0x755b11e2, 0x77c46ef5, 0x7742220e, 0x764ebbf8, 0x76c8f703,
+ 0x633f964d, 0x63b9dab6, 0x62b54340, 0x62330fbb, 0x60ac70ac,
+ 0x602a3c57, 0x6126a5a1, 0x61a0e95a, 0x649e1774, 0x64185b8f,
+ 0x6514c279, 0x65928e82, 0x670df195, 0x678bbd6e, 0x66872498,
+ 0x66016863, 0x6cfad8c4, 0x6c7c943f, 0x6d700dc9, 0x6df64132,
+ 0x6f693e25, 0x6fef72de, 0x6ee3eb28, 0x6e65a7d3, 0x6b5b59fd,
+ 0x6bdd1506, 0x6ad18cf0, 0x6a57c00b, 0x68c8bf1c, 0x684ef3e7,
+ 0x69426a11, 0x69c426ea, 0x422ae476, 0x42aca88d, 0x43a0317b,
+ 0x43267d80, 0x41b90297, 0x413f4e6c, 0x4033d79a, 0x40b59b61,
+ 0x458b654f, 0x450d29b4, 0x4401b042, 0x4487fcb9, 0x461883ae,
+ 0x469ecf55, 0x479256a3, 0x47141a58, 0x4defaaff, 0x4d69e604,
+ 0x4c657ff2, 0x4ce33309, 0x4e7c4c1e, 0x4efa00e5, 0x4ff69913,
+ 0x4f70d5e8, 0x4a4e2bc6, 0x4ac8673d, 0x4bc4fecb, 0x4b42b230,
+ 0x49ddcd27, 0x495b81dc, 0x4857182a, 0x48d154d1, 0x5d26359f,
+ 0x5da07964, 0x5cace092, 0x5c2aac69, 0x5eb5d37e, 0x5e339f85,
+ 0x5f3f0673, 0x5fb94a88, 0x5a87b4a6, 0x5a01f85d, 0x5b0d61ab,
+ 0x5b8b2d50, 0x59145247, 0x59921ebc, 0x589e874a, 0x5818cbb1,
+ 0x52e37b16, 0x526537ed, 0x5369ae1b, 0x53efe2e0, 0x51709df7,
+ 0x51f6d10c, 0x50fa48fa, 0x507c0401, 0x5542fa2f, 0x55c4b6d4,
+ 0x54c82f22, 0x544e63d9, 0x56d11cce, 0x56575035, 0x575bc9c3,
+ 0x57dd8538
+ );
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Armour - ASCII Armouring and Unarmouring
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::Armour;
+
+ my $armoured = Crypt::OpenPGP::Armour->armour(
+ Data => "foo bar baz",
+ Object => "FOO OBJECT",
+ Headers => {
+ Version => '0.57',
+ Comment => 'FooBar',
+ },
+ );
+
+ my $decoded = Crypt::OpenPGP::Armour->unarmour( $armoured ) or
+ die Crypt::OpenPGP::Armour->errstr;
+
+=head1 DESCRIPTION
+
+This module converts arbitrary-length strings of binary octets into
+Base64-encoded ASCII messages suitable for transfer as text. It
+also converts in the opposite direction, taking an armoured message
+and returning the binary data, along with headers.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::Armour->armour( %args )
+
+Converts arbitrary-length strings of binary octets in an encoded
+message containing 4 parts: head and tail markers that identify the
+type of content contained therein; a group of newline-separated
+headers at the top of the message; Base64-encoded data; and a
+Base64-encoded CRC24 checksum of the message body.
+
+Returns I<undef> on failure, the encoded message on success. In the
+case of failure call the class method I<errstr> to get the error
+message.
+
+I<%args> can contain:
+
+=over 4
+
+=item * Object
+
+Specifies the type of object being armoured; the string C<PGP > (PGP
+followed by a space) will be prepended to the value you pass in.
+
+This argument is required.
+
+=item * Data
+
+The binary octets to be encoded as the body of the armoured message;
+these octets will be encoded into ASCII using I<MIME::Base64>.
+
+This argument is required.
+
+=item * Headers
+
+A reference to a hash containing key-value pairs, where the key is the
+name of the the header and the value the header value. These headers
+are placed at the top of the encoded message in the form C<Header: Value>.
+
+=back
+
+=head2 Crypt::OpenPGP::Armour->unarmour($message)
+
+Decodes an ASCII-armoured message and returns a hash reference whose
+keys are the arguments provided to I<armour>, above. Returns I<undef>
+on failure (for example, if the checksum fails to match, or if the
+message is in an incomprehensible format). In case of failure call
+the class method I<errstr> to get the text of the error message.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Buffer.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Buffer.pm
new file mode 100755
index 00000000000..7a8c7bda500
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Buffer.pm
@@ -0,0 +1,75 @@
+package Crypt::OpenPGP::Buffer;
+use base qw( Data::Buffer );
+
+use Crypt::OpenPGP::Util qw( bin2mp mp2bin bitsize );
+
+sub get_mp_int {
+ my $buf = shift;
+ my $bits = $buf->get_int16;
+ my $bytes = int(($bits + 7) / 8);
+ my $off = $buf->{offset};
+ $buf->{offset} += $bytes;
+ bin2mp($buf->bytes($off, $bytes));
+}
+
+sub put_mp_int {
+ my $buf = shift;
+ my($n) = @_;
+ $buf->put_int16(bitsize($n));
+ $buf->put_bytes(mp2bin($n));
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Buffer - Binary in/out buffer
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::Buffer;
+
+ my $n = PARI( 1 );
+
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->put_mp_int($n);
+
+ my $m = $buf->get_mp_int;
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Buffer> subclasses the I<Data::Buffer> class to
+provide binary in/out buffer capabilities for I<Crypt::OpenPGP>. In
+addition to the standard I<Data::Buffer> methods, this class adds
+methods to get and put multiple-precision integers (I<Math::Pari>
+objects).
+
+A PGP multiple precision integer is stored in two pieces: a two-octet
+scalar representing the length of the integer in bits, followed by
+a string of octets that is a serialized representation of the integer.
+
+=head1 USAGE
+
+As I<Crypt::OpenPGP::Buffer> subclasses I<Data::Buffer> there is no
+need to reproduce the entire documentation of the latter module. Thus
+this usage section will include only the methods added by
+I<Crypt::OpenPGP::Buffer>.
+
+=head2 $buf->get_mp_int
+
+Grabs a multiple-precision integer from the buffer I<$buf> (starting
+after the current offset position in the buffer) and returns that
+integer.
+
+=head2 $buf->put_mp_int($n)
+
+Serializes a multiple-precision integer into the buffer in the above
+form (two-octet bitsize, string of octets).
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/CFB.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/CFB.pm
new file mode 100755
index 00000000000..adcc182640f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/CFB.pm
@@ -0,0 +1,110 @@
+# This code based slightly on the Systemics Crypt::CFB.
+# Parts Copyright (C) 1995, 1996 Systemics Ltd (http://www.systemics.com/)
+# All rights reserved.
+
+package Crypt::OpenPGP::CFB;
+use strict;
+
+sub new {
+ my $class = shift;
+ my $c = bless { }, $class;
+ $c->init(@_);
+}
+
+sub init {
+ my $c = shift;
+ my($cipher, $iv) = @_;
+ $c->{cipher} = $cipher;
+ $c->{blocksize} = $cipher->blocksize;
+ $c->{iv} = $iv || "\0" x $c->{blocksize};
+ $c;
+}
+
+sub sync { $_[0]->{unused} = '' }
+
+sub encrypt {
+ my $c = shift;
+ my($data) = @_;
+ my $ret = '';
+ my $iv = $c->{iv};
+ my $out = $c->{unused} || '';
+ my $size = length $out;
+ while ($data) {
+ unless ($size) {
+ $out = $c->{cipher}->encrypt($iv);
+ $size = $c->{blocksize};
+ }
+ my $in = substr $data, 0, $size, '';
+ $size -= (my $got = length $in);
+ $iv .= ($in ^= substr $out, 0, $got, '');
+ substr $iv, 0, $got, '';
+ $ret .= $in;
+ }
+ $c->{unused} = $out;
+ $c->{iv} = $iv;
+ $ret;
+}
+
+sub decrypt {
+ my $c = shift;
+ my($data) = @_;
+ my $ret = '';
+ my $iv = $c->{iv};
+ my $out = $c->{unused} || '';
+ my $size = length $out;
+ while ($data) {
+ unless ($size) {
+ $out = $c->{cipher}->encrypt($iv);
+ $size = $c->{blocksize};
+ }
+ my $in = substr $data, 0, $size, '';
+ $size -= (my $got = length $in);
+ substr $iv .= $in, 0, $got, '';
+ $ret .= ($in ^= substr $out, 0, $got, '');
+ }
+ $c->{unused} = $out;
+ $c->{iv} = $iv;
+ $ret;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::CFB - PGP Cipher Feedback Mode
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::CFB;
+
+ my $key = 'foo bar';
+ my $cipher = Crypt::Blowfish->new( $key ); # for example
+ my $cfb = Crypt::OpenPGP::CFB->new( $cipher );
+
+ my $plaintext = 'this is secret!';
+ my $ct = $cfb->encrypt( $plaintext );
+
+ my $pt = $cfb->decrypt( $ct );
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::CFB> implements the variant of Cipher Feedback mode
+that PGP uses in its encryption and decryption. The key difference
+with PGP CFB is that the CFB state is resynchronized at each
+encryption/decryption. This applies both when encrypting secret key
+data and in symmetric encryption of standard encrypted data. More
+differences are described in the OpenPGP RFC, in section 12.8
+(OpenPGP CFB mode).
+
+Typically you should never need to directly use I<Crypt::OpenPGP::CFB>;
+I<Crypt::OpenPGP::Cipher> objects wrap around an instance of this
+class and provide a uniform interface to symmetric ciphers. See
+the documentation for that module for usage details.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Certificate.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Certificate.pm
new file mode 100755
index 00000000000..72d344b9118
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Certificate.pm
@@ -0,0 +1,562 @@
+package Crypt::OpenPGP::Certificate;
+use strict;
+
+use Crypt::OpenPGP::S2k;
+use Crypt::OpenPGP::Key::Public;
+use Crypt::OpenPGP::Key::Secret;
+use Crypt::OpenPGP::Buffer;
+use Crypt::OpenPGP::Util qw( mp2bin bin2mp bitsize );
+use Crypt::OpenPGP::Constants qw( DEFAULT_CIPHER
+ PGP_PKT_PUBLIC_KEY
+ PGP_PKT_PUBLIC_SUBKEY
+ PGP_PKT_SECRET_KEY
+ PGP_PKT_SECRET_SUBKEY );
+use Crypt::OpenPGP::Cipher;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+{
+ my @PKT_TYPES = (
+ PGP_PKT_PUBLIC_KEY,
+ PGP_PKT_PUBLIC_SUBKEY,
+ PGP_PKT_SECRET_KEY,
+ PGP_PKT_SECRET_SUBKEY
+ );
+ sub pkt_type {
+ my $cert = shift;
+ $PKT_TYPES[ ($cert->{is_secret} << 1) | $cert->{is_subkey} ];
+ }
+}
+
+sub new {
+ my $class = shift;
+ my $cert = bless { }, $class;
+ $cert->init(@_);
+}
+
+sub init {
+ my $cert = shift;
+ my %param = @_;
+ if (my $key = $param{Key}) {
+ $cert->{version} = $param{Version} || 4;
+ $cert->{key} = $key;
+ $cert->{is_secret} = $key->is_secret;
+ $cert->{is_subkey} = $param{Subkey} || 0;
+ $cert->{timestamp} = time;
+ $cert->{pk_alg} = $key->alg_id;
+ if ($cert->{version} < 4) {
+ $cert->{validity} = $param{Validity} || 0;
+ $key->alg eq 'RSA' or
+ return (ref $cert)->error("Version 3 keys must be RSA");
+ }
+ $cert->{s2k} = Crypt::OpenPGP::S2k->new('Salt_Iter');
+
+ if ($cert->{is_secret}) {
+ $param{Passphrase} or
+ return (ref $cert)->error("Need a Passphrase to lock key");
+ $cert->{cipher} = $param{Cipher} || DEFAULT_CIPHER;
+ $cert->lock($param{Passphrase});
+ }
+ }
+ $cert;
+}
+
+sub type { $_[0]->{type} }
+sub version { $_[0]->{version} }
+sub timestamp { $_[0]->{timestamp} }
+sub validity { $_[0]->{validity} }
+sub pk_alg { $_[0]->{pk_alg} }
+sub key { $_[0]->{key} }
+sub is_secret { $_[0]->{key}->is_secret }
+sub is_subkey { $_[0]->{is_subkey} }
+sub is_protected { $_[0]->{is_protected} }
+sub can_encrypt { $_[0]->{key}->can_encrypt }
+sub can_sign { $_[0]->{key}->can_sign }
+sub uid {
+ my $cert = shift;
+ $cert->{_uid} = shift if @_;
+ $cert->{_uid};
+}
+
+sub public_cert {
+ my $cert = shift;
+ return $cert unless $cert->is_secret;
+ my $pub = (ref $cert)->new;
+ for my $f (qw( version timestamp pk_alg is_subkey )) {
+ $pub->{$f} = $cert->{$f};
+ }
+ $pub->{validity} = $cert->{validity} if $cert->{version} < 4;
+ $pub->{key} = $cert->{key}->public_key;
+ $pub;
+}
+
+sub key_id {
+ my $cert = shift;
+ unless ($cert->{key_id}) {
+ if ($cert->{version} < 4) {
+ $cert->{key_id} = substr(mp2bin($cert->{key}->n), -8);
+ }
+ else {
+ $cert->{key_id} = substr($cert->fingerprint, -8);
+ }
+ }
+ $cert->{key_id};
+}
+
+sub key_id_hex { uc unpack 'H*', $_[0]->key_id }
+
+sub fingerprint {
+ my $cert = shift;
+ unless ($cert->{fingerprint}) {
+ if ($cert->{version} < 4) {
+ my $dgst = Crypt::OpenPGP::Digest->new('MD5');
+ $cert->{fingerprint} =
+ $dgst->hash(mp2bin($cert->{key}->n) . mp2bin($cert->{key}->e));
+ }
+ else {
+ my $data = $cert->public_cert->save;
+ $cert->{fingerprint} = _gen_v4_fingerprint($data);
+ }
+ }
+ $cert->{fingerprint};
+}
+
+sub fingerprint_hex { uc unpack 'H*', $_[0]->fingerprint }
+
+sub fingerprint_words {
+ require Crypt::OpenPGP::Words;
+ Crypt::OpenPGP::Words->encode($_[0]->fingerprint);
+}
+
+sub _gen_v4_fingerprint {
+ my($data) = @_;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->put_int8(0x99);
+ $buf->put_int16(length $data);
+ $buf->put_bytes($data);
+ my $dgst = Crypt::OpenPGP::Digest->new('SHA1');
+ $dgst->hash($buf->bytes);
+}
+
+sub parse {
+ my $class = shift;
+ my($buf, $secret, $subkey) = @_;
+ my $cert = $class->new;
+ $cert->{is_secret} = $secret;
+ $cert->{is_subkey} = $subkey;
+
+ $cert->{version} = $buf->get_int8;
+ $cert->{timestamp} = $buf->get_int32;
+ if ($cert->{version} < 4) {
+ $cert->{validity} = $buf->get_int16;
+ }
+ $cert->{pk_alg} = $buf->get_int8;
+
+ my $key_class = 'Crypt::OpenPGP::Key::' . ($secret ? 'Secret' : 'Public');
+ my $key = $cert->{key} = $key_class->new($cert->{pk_alg}) or
+ return $class->error("Key creation failed: " . $key_class->errstr);
+
+ my @pub = $key->public_props;
+ for my $e (@pub) {
+ $key->$e($buf->get_mp_int);
+ }
+
+ if ($cert->{version} >= 4) {
+ my $data = $buf->bytes(0, $buf->offset);
+ $cert->{fingerprint} = _gen_v4_fingerprint($data);
+ }
+
+ if ($secret) {
+ $cert->{cipher} = $buf->get_int8;
+ if ($cert->{cipher}) {
+ $cert->{is_protected} = 1;
+ if ($cert->{cipher} == 255 || $cert->{cipher} == 254) {
+ $cert->{sha1check} = $cert->{cipher} == 254;
+ $cert->{cipher} = $buf->get_int8;
+ $cert->{s2k} = Crypt::OpenPGP::S2k->parse($buf);
+ }
+ else {
+ $cert->{s2k} = Crypt::OpenPGP::S2k->new('Simple');
+ $cert->{s2k}->set_hash('MD5');
+ }
+
+ $cert->{iv} = $buf->get_bytes(8);
+ }
+
+ if ($cert->{is_protected}) {
+ if ($cert->{version} < 4) {
+ $cert->{encrypted} = {};
+ my @sec = $key->secret_props;
+ for my $e (@sec) {
+ my $h = $cert->{encrypted}{"${e}h"} = $buf->get_bytes(2);
+ $cert->{encrypted}{"${e}b"} =
+ $buf->get_bytes(int((unpack('n', $h)+7)/8));
+ }
+ $cert->{csum} = $buf->get_int16;
+ }
+ else {
+ $cert->{encrypted} =
+ $buf->get_bytes($buf->length - $buf->offset);
+ }
+ }
+ else {
+ my @sec = $key->secret_props;
+ for my $e (@sec) {
+ $key->$e($buf->get_mp_int);
+ }
+ }
+ }
+
+ $cert;
+}
+
+sub save {
+ my $cert = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+
+ $buf->put_int8($cert->{version});
+ $buf->put_int32($cert->{timestamp});
+ if ($cert->{version} < 4) {
+ $buf->put_int16($cert->{validity});
+ }
+ $buf->put_int8($cert->{pk_alg});
+
+ my $key = $cert->{key};
+ my @pub = $key->public_props;
+ for my $e (@pub) {
+ $buf->put_mp_int($key->$e());
+ }
+
+ if ($cert->{key}->is_secret) {
+ if ($cert->{cipher}) {
+ $buf->put_int8(255);
+ $buf->put_int8($cert->{cipher});
+ $buf->append($cert->{s2k}->save);
+ $buf->put_bytes($cert->{iv});
+
+ if ($cert->{version} < 4) {
+ my @sec = $key->secret_props;
+ for my $e (@sec) {
+ $buf->put_bytes($cert->{encrypted}{"${e}h"});
+ $buf->put_bytes($cert->{encrypted}{"${e}b"});
+ }
+ $buf->put_int16($cert->{csum});
+ }
+ else {
+ $buf->put_bytes($cert->{encrypted});
+ }
+ }
+ else {
+ my @sec = $key->secret_props;
+ for my $e (@sec) {
+ $key->$e($buf->get_mp_int);
+ }
+ }
+ }
+ $buf->bytes;
+}
+
+sub v3_checksum {
+ my $cert = shift;
+ my $k = $cert->{encrypted};
+ my $sum = 0;
+ my @sec = $cert->{key}->secret_props;
+ for my $e (@sec) {
+ $sum += unpack '%16C*', $k->{"${e}h"};
+ $sum += unpack '%16C*', $k->{"${e}b"};
+ }
+ $sum & 0xFFFF;
+}
+
+sub unlock {
+ my $cert = shift;
+ return 1 unless $cert->{is_secret} && $cert->{is_protected};
+ my($passphrase) = @_;
+ my $cipher = Crypt::OpenPGP::Cipher->new($cert->{cipher}) or
+ return $cert->error( Crypt::OpenPGP::Cipher->errstr );
+ my $key = $cert->{s2k}->generate($passphrase, $cipher->keysize);
+ $cipher->init($key, $cert->{iv});
+ my @sec = $cert->{key}->secret_props;
+ if ($cert->{version} < 4) {
+ my $k = $cert->{encrypted};
+ my $r = {};
+ for my $e (@sec) {
+ $r->{$e} = $k->{"${e}b"};
+ $k->{"${e}b"} = $cipher->decrypt($r->{$e});
+ }
+ unless ($cert->{csum} == $cert->v3_checksum) {
+ $k->{"${_}b"} = $r->{$_} for @sec;
+ return $cert->error("Bad checksum");
+ }
+ for my $e (@sec) {
+ $cert->{key}->$e(bin2mp($k->{"${e}b"}));
+ }
+ unless ($cert->{key}->check) {
+ $k->{"${_}b"} = $r->{$_} for @sec;
+ return $cert->error("p*q != n");
+ }
+ }
+ else {
+ my $decrypted = $cipher->decrypt($cert->{encrypted});
+ if ($cert->{sha1check}) {
+ my $dgst = Crypt::OpenPGP::Digest->new('SHA1');
+ my $csum = substr $decrypted, -20, 20, '';
+ unless ($dgst->hash($decrypted) eq $csum) {
+ return $cert->error("Bad SHA-1 hash");
+ }
+ } else {
+ my $csum = unpack "n", substr $decrypted, -2, 2, '';
+ my $gen_csum = unpack '%16C*', $decrypted;
+ unless ($csum == $gen_csum) {
+ return $cert->error("Bad simple checksum");
+ }
+ }
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->append($decrypted);
+ for my $e (@sec) {
+ $cert->{key}->$e( $buf->get_mp_int );
+ }
+ }
+
+ $cert->{is_protected} = 0;
+
+ 1;
+}
+
+sub lock {
+ my $cert = shift;
+ return if !$cert->{is_secret} || $cert->{is_protected};
+ my($passphrase) = @_;
+ my $cipher = Crypt::OpenPGP::Cipher->new($cert->{cipher});
+ my $sym_key = $cert->{s2k}->generate($passphrase, $cipher->keysize);
+ require Crypt::Random;
+ $cert->{iv} = Crypt::Random::makerandom_octet( Length => 8 );
+ $cipher->init($sym_key, $cert->{iv});
+ my @sec = $cert->{key}->secret_props;
+ if ($cert->{version} < 4) {
+ my $k = $cert->{encrypted} = {};
+ my $key = $cert->key;
+ for my $e (@sec) {
+ $k->{"${e}b"} = mp2bin($key->$e());
+ $k->{"${e}h"} = pack 'n', bitsize($key->$e());
+ }
+ $cert->{csum} = $cert->v3_checksum;
+ for my $e (@sec) {
+ $k->{"${e}b"} = $cipher->encrypt( $k->{"${e}b"} );
+ }
+ }
+ else {
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ for my $e (@sec) {
+ $buf->put_mp_int($cert->{key}->$e());
+ }
+ my $cnt = $buf->bytes;
+ $cnt .= pack 'n', unpack '%16C*', $cnt;
+ $cert->{encrypted} = $cipher->encrypt($cnt);
+ }
+
+ $cert->{is_protected} = 1;
+ 1;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Certificate - PGP Key certificate
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::Certificate;
+
+ my $dsa_secret_key = Crypt::OpenPGP::Key::Secret->new( 'DSA' );
+ my $cert = Crypt::OpenPGP::Certificate->new(
+ Key => $dsa_secret_key,
+ Version => 4,
+ Passphrase => 'foobar',
+ );
+ my $serialized = $cert->save;
+
+ # Unlock the locked certificate (using the passphrase from above)
+ $cert->unlock( 'foobar' );
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Certificate> encapsulates a PGP key certificate
+for any underlying public-key algorithm, for public and secret keys,
+and for master keys and subkeys. All of these scenarios are handled
+by the same I<Certificate> class.
+
+A I<Crypt::OpenPGP::Certificate> object wraps around a
+I<Crypt::OpenPGP::Key> object; the latter implements all public-key
+algorithm-specific functionality, while the certificate layer
+manages some meta-data about the key, as well as the mechanisms
+for locking and unlocking a secret key (using a passphrase).
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::Certificate->new( %arg )
+
+Constructs a new PGP key certificate object and returns that object.
+If no arguments are provided in I<%arg>, the certificate is empty;
+this is used in I<parse>, for example, to construct an empty object,
+then fill it with the data in the buffer.
+
+I<%arg> can contain:
+
+=over 4
+
+=item * Key
+
+The public/secret key object, an object of type I<Crypt::OpenPGP::Key>.
+
+This argument is required (for a non-empty certificate).
+
+=item * Version
+
+The certificate packet version, as defined in the OpenPGP RFC. The
+two valid values are C<3> and C<4>.
+
+This argument is optional; if not provided the default is to produce
+version C<4> certificates. You may wish to override this for
+compatibility with older versions of PGP.
+
+=item * Subkey
+
+A boolean flag: if true, indicates that this certificate is a subkey,
+not a master key.
+
+This argument is optional; the default value is C<0>.
+
+=item * Validity
+
+The number of days that this certificate is valid. This argument only
+applies when creating a version 3 certificate; version 4 certificates
+hold this information in a signature.
+
+This argument is optional; the default value is C<0>, which means that
+the certificate never expires.
+
+=item * Passphrase
+
+If you are creating a certificate for a secret key--indicated by whether
+or not the I<Key> (above) is a secret key--you will need to lock it
+(that is, encrypt the secret part of the key). The string provided in
+I<Passphrase> is used as the passphrase to lock the key.
+
+This argument is required if the certificate holds a secret key.
+
+=item * Cipher
+
+Specifies the symmetric cipher to use when locking (encrypting) the
+secret part of a secret key. Valid values are any supported symmetric
+cipher names, which can be found in I<Crypt::OpenPGP::Cipher>.
+
+This argument is optional; if not specified, C<DES3> is used.
+
+=back
+
+=head2 $cert->save
+
+Serializes the I<Crypt::OpenPGP::Certificate> object I<$cert> into a
+string of octets, suitable for saving in a keyring file.
+
+=head2 Crypt::OpenPGP::Certificate->parse($buffer)
+
+Given I<$buffer>, a I<Crypt::OpenPGP::Buffer> object holding (or with
+offset point to) a certificate packet, returns a new object of type
+I<Crypt::OpenPGP::Certificate>, initialized with the data from the
+buffer.
+
+=head2 $cert->lock($passphrase)
+
+Locks the secret key data by encrypting that data with I<$passphrase>.
+
+Returns true on success, C<undef> on failure; in the case of failure
+call I<errstr> to get the error message.
+
+=head2 $cert->unlock($passphrase)
+
+Uses the passphrase I<$passphrase> to unlock (decrypt) the secret
+part of the key.
+
+Returns true on success, C<undef> on failure; in the case of failure
+call I<errstr> to get the error message.
+
+=head2 $cert->fingerprint
+
+Returns the key fingerprint as an octet string.
+
+=head2 $cert->fingerprint_hex
+
+Returns the key fingerprint as a hex string.
+
+=head2 $cert->fingerprint_words
+
+Returns the key fingerprint as a list of English words, where each word
+represents one octet from the fingerprint. See I<Crypt::OpenPGP::Words>
+for more details about the encoding.
+
+=head2 $cert->key_id
+
+Returns the key ID.
+
+=head2 $cert->key_id_hex
+
+Returns the key ID as a hex string.
+
+=head2 $cert->key
+
+Returns the algorithm-specific portion of the certificate, the public
+or secret key object (an object of type I<Crypt::OpenPGP::Key>).
+
+=head2 $cert->public_cert
+
+Returns a public version of the certificate, with a public key. If
+the certificate was already public, the same certificate is returned;
+if it was a secret certificate, a new I<Crypt::OpenPGP::Certificate>
+object is created, and the secret key is made into a public version
+of the key.
+
+=head2 $cert->version
+
+Returns the version of the certificate (C<3> or C<4>).
+
+=head2 $cert->timestamp
+
+Returns the creation date and time (in epoch time).
+
+=head2 $cert->validity
+
+Returns the number of days that the certificate is valid for version
+3 keys.
+
+=head2 $cert->is_secret
+
+Returns true if the certificate holds a secret key, false otherwise.
+
+=head2 $cert->is_protected
+
+Returns true if the certificate is locked, false otherwise.
+
+=head2 $cert->is_subkey
+
+Returns true if the certificate is a subkey, false otherwise.
+
+=head2 $cert->can_encrypt
+
+Returns true if the public key algorithm for the certificate I<$cert>
+can perform encryption/decryption, false otherwise.
+
+=head2 $cert->can_sign
+
+Returns true if the public key algorithm for the certificate I<$cert>
+can perform signing/verification, false otherwise.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Cipher.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Cipher.pm
new file mode 100755
index 00000000000..8476657bbe2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Cipher.pm
@@ -0,0 +1,232 @@
+package Crypt::OpenPGP::Cipher;
+use strict;
+
+use Crypt::OpenPGP::CFB;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+use vars qw( %ALG %ALG_BY_NAME );
+%ALG = (
+ 1 => 'IDEA',
+ 2 => 'DES3',
+ 3 => 'CAST5',
+ 4 => 'Blowfish',
+ 7 => 'Rijndael',
+ 8 => 'Rijndael192',
+ 9 => 'Rijndael256',
+ 10 => 'Twofish',
+);
+%ALG_BY_NAME = map { $ALG{$_} => $_ } keys %ALG;
+
+sub new {
+ my $class = shift;
+ my $alg = shift;
+ $alg = $ALG{$alg} || $alg;
+ return $class->error("Unsupported cipher algorithm '$alg'")
+ unless $alg =~ /^\D/;
+ my $pkg = join '::', $class, $alg;
+ my $ciph = bless { __alg => $alg,
+ __alg_id => $ALG_BY_NAME{$alg} }, $pkg;
+ my $impl_class = $ciph->crypt_class;
+ my @classes = ref($impl_class) eq 'ARRAY' ? @$impl_class : ($impl_class);
+ for my $c (@classes) {
+ eval "use $c;";
+ $ciph->{__impl} = $c, last unless $@;
+ }
+ return $class->error("Error loading cipher implementation for " .
+ "'$alg': no implementations installed.")
+ unless $ciph->{__impl};
+ $ciph->init(@_);
+}
+
+sub init {
+ my $ciph = shift;
+ my($key, $iv) = @_;
+ if ($key) {
+ my $class = $ciph->{__impl};
+ ## Make temp variable, because Rijndael checks SvPOK, which
+ ## doesn't seem to like a value that isn't a variable?
+ my $tmp = substr $key, 0, $ciph->keysize;
+ my $c = $class->new($tmp);
+ $ciph->{cipher} = Crypt::OpenPGP::CFB->new($c, $iv);
+ }
+ $ciph;
+}
+
+sub encrypt { $_[0]->{cipher}->encrypt($_[1]) }
+sub decrypt { $_[0]->{cipher}->decrypt($_[1]) }
+
+sub sync { $_[0]->{cipher}->sync }
+
+sub alg { $_[0]->{__alg} }
+sub alg_id {
+ return $_[0]->{__alg_id} if ref($_[0]);
+ $ALG_BY_NAME{$_[1]} || $_[1];
+}
+sub supported {
+ my $class = shift;
+ my %s;
+ for my $cid (keys %ALG) {
+ my $cipher = $class->new($cid);
+ $s{$cid} = $cipher->alg if $cipher;
+ }
+ \%s;
+}
+
+package Crypt::OpenPGP::Cipher::IDEA;
+use strict;
+use base qw( Crypt::OpenPGP::Cipher );
+
+sub init {
+ my $ciph = shift;
+ my($key, $iv) = @_;
+ if ($key) {
+ my $c = IDEA->new(substr($key, 0, $ciph->keysize));
+ $ciph->{cipher} = Crypt::OpenPGP::CFB->new($c, $iv);
+ }
+ $ciph;
+}
+
+sub crypt_class { 'Crypt::IDEA' }
+sub keysize { 16 }
+sub blocksize { 8 }
+
+package Crypt::OpenPGP::Cipher::Blowfish;
+use strict;
+use base qw( Crypt::OpenPGP::Cipher );
+
+sub crypt_class { 'Crypt::Blowfish' }
+sub keysize { 16 }
+sub blocksize { 8 }
+
+package Crypt::OpenPGP::Cipher::DES3;
+use strict;
+use base qw( Crypt::OpenPGP::Cipher );
+
+sub crypt_class { 'Crypt::DES_EDE3' }
+sub keysize { 24 }
+sub blocksize { 8 }
+
+package Crypt::OpenPGP::Cipher::CAST5;
+use strict;
+use base qw( Crypt::OpenPGP::Cipher );
+
+sub crypt_class { 'Crypt::CAST5_PP' }
+sub keysize { 16 }
+sub blocksize { 8 }
+
+package Crypt::OpenPGP::Cipher::Twofish;
+use strict;
+use base qw( Crypt::OpenPGP::Cipher );
+
+sub crypt_class { 'Crypt::Twofish' }
+sub keysize { 32 }
+sub blocksize { 16 }
+
+package Crypt::OpenPGP::Cipher::Rijndael;
+use strict;
+use base qw( Crypt::OpenPGP::Cipher );
+
+sub crypt_class { 'Crypt::Rijndael' }
+sub keysize { 16 }
+sub blocksize { 16 }
+
+package Crypt::OpenPGP::Cipher::Rijndael192;
+use strict;
+use base qw( Crypt::OpenPGP::Cipher );
+
+sub crypt_class { 'Crypt::Rijndael' }
+sub keysize { 24 }
+sub blocksize { 16 }
+
+package Crypt::OpenPGP::Cipher::Rijndael256;
+use strict;
+use base qw( Crypt::OpenPGP::Cipher );
+
+sub crypt_class { 'Crypt::Rijndael' }
+sub keysize { 32 }
+sub blocksize { 16 }
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Cipher - PGP symmetric cipher factory
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::Cipher;
+
+ my $alg = 'Rijndael';
+ my $cipher = Crypt::OpenPGP::Cipher->new( $alg );
+
+ my $plaintext = 'foo bar';
+ my $ct = $cipher->encrypt($plaintext);
+ my $pt = $cipher->decrypt($ct);
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Cipher> is a factory class for PGP symmetric ciphers.
+All cipher objects are subclasses of this class and share a common
+interface; when creating a new cipher object, the object is blessed
+into the subclass to take on algorithm-specific functionality.
+
+A I<Crypt::OpenPGP::Cipher> object is a wrapper around a
+I<Crypt::OpenPGP::CFB> object, which in turn wraps around the actual
+cipher implementation (eg. I<Crypt::Blowfish> for a Blowfish cipher).
+This allows all ciphers to share a common interface and a simple
+instantiation method.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::Cipher->new($cipher)
+
+Creates a new symmetric cipher object of type I<$cipher>; I<$cipher>
+can be either the name of a cipher (in I<Crypt::OpenPGP> parlance) or
+the numeric ID of the cipher (as defined in the OpenPGP RFC). Using
+a cipher name is recommended, for the simple reason that it is easier
+to understand quickly (not everyone knows the cipher IDs).
+
+Valid cipher names are: C<IDEA>, C<DES3>, C<Blowfish>, C<Rijndael>,
+C<Rijndael192>, C<Rijndael256>, C<Twofish>, and C<CAST5>.
+
+Returns the new cipher object on success. On failure returns C<undef>;
+the caller should check for failure and call the class method I<errstr>
+if a failure occurs. A typical reason this might happen is an
+unsupported cipher name or ID.
+
+=head2 $cipher->encrypt($plaintext)
+
+Encrypts the plaintext I<$plaintext> and returns the encrypted text
+(ie. ciphertext). The encryption is done in CFB mode using the
+underlying cipher implementation.
+
+=head2 $cipher->decrypt($ciphertext)
+
+Decrypts the ciphertext I<$ciphertext> and returns the plaintext. The
+decryption is done in CFB mode using the underlying cipher
+implementation.
+
+=head2 $cipher->alg
+
+Returns the name of the cipher algorithm (as listed above in I<new>).
+
+=head2 $cipher->alg_id
+
+Returns the numeric ID of the cipher algorithm.
+
+=head2 $cipher->blocksize
+
+Returns the blocksize of the cipher algorithm (in bytes).
+
+=head2 $cipher->keysize
+
+Returns the keysize of the cipher algorithm (in bytes).
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Ciphertext.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Ciphertext.pm
new file mode 100755
index 00000000000..4b76e0a104d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Ciphertext.pm
@@ -0,0 +1,221 @@
+package Crypt::OpenPGP::Ciphertext;
+use strict;
+
+use Crypt::OpenPGP::Cipher;
+use Crypt::OpenPGP::Constants qw( DEFAULT_CIPHER
+ PGP_PKT_ENCRYPTED
+ PGP_PKT_ENCRYPTED_MDC );
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+use constant MDC_TRAILER => chr(0xd3) . chr(0x14);
+
+sub pkt_type { $_[0]->{is_mdc} ? PGP_PKT_ENCRYPTED_MDC : PGP_PKT_ENCRYPTED }
+
+sub new {
+ my $class = shift;
+ my $enc = bless { }, $class;
+ $enc->init(@_);
+}
+
+sub init {
+ my $enc = shift;
+ my %param = @_;
+ if ((my $key = $param{SymKey}) && (my $data = $param{Data})) {
+ $enc->{is_mdc} = $param{MDC} || 0;
+ $enc->{version} = 1;
+ require Crypt::Random;
+ my $alg = $param{Cipher} || DEFAULT_CIPHER;
+ my $cipher = Crypt::OpenPGP::Cipher->new($alg, $key);
+ my $bs = $cipher->blocksize;
+ my $pad = Crypt::Random::makerandom_octet( Length => $bs );
+ $pad .= substr $pad, -2, 2;
+ $enc->{ciphertext} = $cipher->encrypt($pad);
+ $cipher->sync unless $enc->{is_mdc};
+ $enc->{ciphertext} .= $cipher->encrypt($data);
+
+ if ($enc->{is_mdc}) {
+ require Crypt::OpenPGP::MDC;
+ my $mdc = Crypt::OpenPGP::MDC->new(
+ Data => $pad . $data . MDC_TRAILER );
+ my $mdc_buf = Crypt::OpenPGP::PacketFactory->save($mdc);
+ $enc->{ciphertext} .= $cipher->encrypt($mdc_buf);
+ }
+ }
+ $enc;
+}
+
+sub parse {
+ my $class = shift;
+ my($buf, $is_mdc) = @_;
+ my $enc = $class->new;
+ $enc->{is_mdc} = $is_mdc;
+ if ($is_mdc) {
+ $enc->{version} = $buf->get_int8;
+ }
+ $enc->{ciphertext} = $buf->get_bytes($buf->length - $buf->offset);
+ $enc;
+}
+
+sub save {
+ my $enc = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ if ($enc->{is_mdc}) {
+ $buf->put_int8($enc->{version});
+ }
+ $buf->put_bytes($enc->{ciphertext});
+ $buf->bytes;
+}
+
+sub display {
+ my $enc = shift;
+ my $str = ":encrypted data packet:\n" .
+ " length: " . length($enc->{ciphertext}) . "\n";
+ if ($enc->{is_mdc}) {
+ $str .= " is_mdc: $enc->{version}\n";
+ }
+ $str;
+}
+
+sub decrypt {
+ my $enc = shift;
+ my($key, $sym_alg) = @_;
+ my $cipher = Crypt::OpenPGP::Cipher->new($sym_alg, $key) or
+ return $enc->error( Crypt::OpenPGP::Cipher->errstr );
+ my $padlen = $cipher->blocksize + 2;
+ my $pt = $enc->{prefix} =
+ $cipher->decrypt(substr $enc->{ciphertext}, 0, $padlen);
+ return $enc->error("Bad checksum")
+ unless substr($pt, -4, 2) eq substr($pt, -2, 2);
+ $cipher->sync unless $enc->{is_mdc};
+ $pt = $cipher->decrypt(substr $enc->{ciphertext}, $padlen);
+ if ($enc->{is_mdc}) {
+ my $mdc_buf = Crypt::OpenPGP::Buffer->new_with_init(substr $pt,-22,22);
+ $pt = substr $pt, 0, -22;
+ my $mdc = Crypt::OpenPGP::PacketFactory->parse($mdc_buf);
+ return $enc->error("Encrypted MDC packet without MDC")
+ unless $mdc && ref($mdc) eq 'Crypt::OpenPGP::MDC';
+ require Crypt::OpenPGP::Digest;
+ my $dgst = Crypt::OpenPGP::Digest->new('SHA1');
+ my $hash = $dgst->hash($enc->{prefix} . $pt . chr(0xd3) . chr(0x14));
+ return $enc->error("SHA-1 hash of plaintext does not match MDC body")
+ unless $mdc->digest eq $hash;
+ }
+ $pt;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Ciphertext - Encrypted data packet
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::Ciphertext;
+
+ my $key_data = 'f' x 64; ## Not a very good key :)
+
+ my $ct = Crypt::OpenPGP::Ciphertext->new(
+ Data => "foo bar baz",
+ SymKey => $key_data,
+ );
+ my $serialized = $ct->save;
+
+ my $buffer = Crypt::OpenPGP::Buffer->new;
+ my $ct2 = Crypt::OpenPGP::Ciphertext->parse( $buffer );
+ my $data = $ct->decrypt( $key_data );
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Ciphertext> implements symmetrically encrypted data
+packets, providing both encryption and decryption functionality. Both
+standard encrypted data packets and encrypted-MDC (modification
+detection code) packets are supported by this class. In the first case,
+the encryption used in the packets is a variant on standard CFB mode,
+and is described in the OpenPGP RFC, in section 12.8 (OpenPGP CFB mode).
+In the second case (encrypted-MDC packets), the encryption is performed
+in standard CFB mode, without the special resync used in PGP's CFB.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::Ciphertext->new( %arg )
+
+Creates a new symmetrically encrypted data packet object and returns
+that object. If there are no arguments in I<%arg>, the object is
+created with an empty data container; this is used, for example, in
+I<parse> (below), to create an empty packet which is then filled from
+the data in the buffer.
+
+If you wish to initialize a non-empty object, I<%arg> can contain:
+
+=over 4
+
+=item * Data
+
+A block of octets that make up the plaintext data to be encrypted.
+
+This argument is required (for a non-empty object).
+
+=item * SymKey
+
+The symmetric cipher key: a string of octets that make up the key data
+of the symmetric cipher key. This should be at least long enough for
+the key length of your chosen cipher (see I<Cipher>, below), or, if
+you have not specified a cipher, at least 64 bytes (to allow for
+long cipher key sizes).
+
+This argument is required (for a non-empty object).
+
+=item * Cipher
+
+The name (or ID) of a supported PGP cipher. See I<Crypt::OpenPGP::Cipher>
+for a list of valid cipher names.
+
+This argument is optional; by default I<Crypt::OpenPGP::Cipher> will
+use C<DES3>.
+
+=item * MDC
+
+When set to a true value, encrypted texts will use encrypted MDC
+(modification detection code) packets instead of standard encrypted data
+packets. These are a newer form of encrypted data packets that
+are followed by a C<SHA-1> hash of the plaintext data. This prevents
+attacks that modify the encrypted text by using a message digest to
+detect changes.
+
+By default I<MDC> is set to C<0>, and encrypted texts use standard
+encrypted data packets. Set it to a true value to turn on MDC packets.
+
+=back
+
+=head2 $ct->save
+
+Returns the block of ciphertext created in I<new> (assuming that you
+created a non-empty packet by specifying some data; otherwise returns
+an empty string).
+
+=head2 Crypt::OpenPGP::Ciphertext->parse($buffer)
+
+Given I<$buffer>, a I<Crypt::OpenPGP::Buffer> object holding (or
+with offset pointing to) a symmetrically encrypted data packet, returns
+a new I<Crypt::OpenPGP::Ciphertext> object, initialized with the
+ciphertext in the buffer.
+
+=head2 $ct->decrypt($key, $alg)
+
+Decrypts the ciphertext in the I<Crypt::OpenPGP::Ciphertext> object
+and returns the plaintext. I<$key> is the encryption key, and I<$alg>
+is the name (or ID) of the I<Crypt::OpenPGP::Cipher> type used to
+encrypt the message. Obviously you can't just guess at these
+parameters; this method (along with I<parse>, above) is best used along
+with the I<Crypt::OpenPGP::SessionKey> object, which holds an encrypted
+version of the key and cipher algorithm.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Compressed.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Compressed.pm
new file mode 100755
index 00000000000..3d9c4fc2b8f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Compressed.pm
@@ -0,0 +1,178 @@
+package Crypt::OpenPGP::Compressed;
+use strict;
+
+use Compress::Zlib;
+use Crypt::OpenPGP::Buffer;
+use Crypt::OpenPGP::Constants qw( DEFAULT_COMPRESS );
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+use vars qw( %ALG %ALG_BY_NAME );
+%ALG = ( 1 => 'ZIP', 2 => 'Zlib' );
+%ALG_BY_NAME = map { $ALG{$_} => $_ } keys %ALG;
+
+sub alg {
+ return $_[0]->{__alg} if ref($_[0]);
+ $ALG{$_[1]} || $_[1];
+}
+
+sub alg_id {
+ return $_[0]->{__alg_id} if ref($_[0]);
+ $ALG_BY_NAME{$_[1]} || $_[1];
+}
+
+sub new {
+ my $comp = bless { }, shift;
+ $comp->init(@_);
+}
+
+sub init {
+ my $comp = shift;
+ my %param = @_;
+ if (my $data = $param{Data}) {
+ my $alg = $param{Alg} || DEFAULT_COMPRESS;
+ $alg = $ALG{$alg} || $alg;
+ $comp->{__alg} = $alg;
+ $comp->{__alg_id} = $ALG_BY_NAME{$alg};
+ my %args;
+ if ($comp->{__alg_id} == 1) {
+ %args = (-WindowBits => -13, -MemLevel => 8);
+ }
+ my($d, $status, $compressed);
+ ($d, $status) = deflateInit(\%args);
+ return (ref $comp)->error("Zlib deflateInit error: $status")
+ unless $status == Compress::Zlib::Z_OK();
+ {
+ my($output, $out);
+ ($output, $status) = $d->deflate($data);
+ last unless $status == Compress::Zlib::Z_OK();
+ ($out, $status) = $d->flush();
+ last unless $status == Compress::Zlib::Z_OK();
+ $compressed = $output . $out;
+ }
+ return (ref $comp)->error("Zlib deflation error: $status")
+ unless defined $compressed;
+ $comp->{data} = $compressed;
+ }
+ $comp;
+}
+
+sub parse {
+ my $class = shift;
+ my($buf) = @_;
+ my $comp = $class->new;
+ $comp->{__alg_id} = $buf->get_int8;
+ $comp->{__alg} = $ALG{ $comp->{__alg_id} };
+ $comp->{data} = $buf->get_bytes($buf->length - $buf->offset);
+ $comp;
+}
+
+sub save {
+ my $comp = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->put_int8($comp->{__alg_id});
+ $buf->put_bytes($comp->{data});
+ $buf->bytes;
+}
+
+sub decompress {
+ my $comp = shift;
+ my %args;
+ if ($comp->{__alg_id} == 1) {
+ %args = (-WindowBits => -13);
+ }
+ my($i, $status, $out);
+ ($i, $status) = inflateInit(\%args);
+ return $comp->error("Zlib inflateInit error: $status")
+ unless $status == Compress::Zlib::Z_OK();
+ ($out, $status) = $i->inflate($comp->{data});
+ return $comp->error("Zlib inflate error: $status")
+ unless defined $out;
+ $out;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Compressed - Compressed data packets
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::Compressed;
+
+ my $data = 'serialized openpgp packets';
+ my $cdata = Crypt::OpenPGP::Compressed->new( Data => $data );
+ my $serialized = $cdata->save;
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Compressed> implements compressed data packets,
+providing both compression and decompression functionality, for all
+supported compression algorithms (C<Zlib> and C<ZIP>). This class
+uses I<Compress::Zlib> for all compression/decompression needs for
+both algorithms: C<ZIP> is simply C<Zlib> with a different setting
+for the I<WindowBits> parameter.
+
+Decompressing a compressed data packet should always yield a stream
+of valid PGP packets (which you can then parse using
+I<Crypt::OpenPGP::PacketFactory>). Similarly, when compressing a
+packet the input data should be a stream of packets.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::Compressed->new( %arg )
+
+Creates a new compressed data packet object and returns that object.
+If there are no arguments in I<%arg>, the object is created with an
+empty compressed data container; this is used, for example, in
+I<parse> (below), to create an empty packet which is then filled with
+the data in the buffer.
+
+If you wish to initialize a non-empty object, I<%arg> can contain:
+
+=over 4
+
+=item * Data
+
+A block of octets that make up the data that you wish to compress.
+As mentioned above, the data to compress should always be a stream
+of valid PGP packets (saved using I<Crypt::OpenPGP::PacketFactory::save>).
+
+This argument is required (for a non-empty object).
+
+=item * Alg
+
+The name (or ID) of a supported PGP compression algorithm. Valid
+names are C<Zlib> and C<ZIP>.
+
+This argument is optional; by default I<Crypt::OpenPGP::Compressed> will
+use C<ZIP>.
+
+=back
+
+=head2 $cdata->save
+
+Returns the serialized compressed data packet, which consists of
+a one-octet compression algorithm ID, followed by the compressed
+data.
+
+=head2 Crypt::OpenPGP::Compressed->parse($buffer)
+
+Given I<$buffer>, a I<Crypt::OpenPGP::Buffer> object holding (or with
+offset pointing to) a compressed data packet, returns a new
+I<Crypt::OpenPGP::Compressed> object, initialized with the data from
+the buffer.
+
+=head2 $cdata->decompress
+
+Decompresses the compressed data in the I<Crypt::OpenPGP::Compressed>
+object I<$cdata> and returns the decompressed data.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Config.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Config.pm
new file mode 100755
index 00000000000..ee5dc41442d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Config.pm
@@ -0,0 +1,109 @@
+package Crypt::OpenPGP::Config;
+use strict;
+
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub new {
+ my $class = shift;
+ my $cfg = bless { o => { @_ } }, $class;
+ $cfg;
+}
+
+sub get { $_[0]->{o}{ $_[1] } }
+sub set {
+ my $cfg = shift;
+ my($key, $val) = @_;
+ $cfg->{o}{$key} = $val;
+}
+
+{
+ my %STANDARD = (
+ str => \&_set_str,
+ bool => \&_set_bool,
+ );
+
+ sub read_config {
+ my $cfg = shift;
+ my($compat, $cfg_file) = @_;
+ my $class = join '::', __PACKAGE__, $compat;
+ my $directives = $class->directives;
+ local(*FH, $_, $/);
+ $/ = "\n";
+ open FH, $cfg_file or
+ return $cfg->error("Error opening file '$cfg_file': $!");
+ while (<FH>) {
+ chomp;
+ next if !/\S/ || /^#/;
+ if (/^\s*([^\s=]+)(?:(?:(?:\s*=\s*)|\s+)(.*))?/) {
+ my($key, $val) = ($1, $2);
+ my $ref = $directives->{lc $key};
+ next unless $ref;
+ my $code = ref($ref->[0]) eq 'CODE' ? $ref->[0] :
+ $STANDARD{$ref->[0]};
+ $code->($cfg, $ref->[1], $val);
+ }
+ }
+ close FH;
+ }
+}
+
+sub _set_str { $_[0]->{o}{$_[1]} = $_[2] }
+{
+ my %BOOL = ( off => 0, on => 1 );
+ sub _set_bool {
+ my($cfg, $key, $val) = @_;
+ $val = 1 unless defined $val;
+ $val = $BOOL{$val} || $val;
+ $cfg->{o}{$key} = $val;
+ }
+}
+
+package Crypt::OpenPGP::Config::GnuPG;
+sub directives {
+ {
+ armor => [ 'bool', 'Armour' ],
+ 'default-key' => [ 'str', 'DefaultKey' ],
+ recipient => [ 'str', 'Recipient' ],
+ 'default-recipient' => [ 'str', 'DefaultRecipient' ],
+ 'default-recipient-self' => [ 'bool', 'DefaultSelfRecipient' ],
+ 'encrypt-to' => [ 'str', 'Recipient' ],
+ verbose => [ 'bool', 'Verbose' ],
+ textmode => [ 'bool', 'TextMode' ],
+ keyring => [ 'str', 'PubRing' ],
+ 'secret-keyring' => [ 'str', 'SecRing' ],
+ 'cipher-algo' => [ \&_set_cipher ],
+ 'digest-algo' => [ 'str', 'Digest' ],
+ 'compress-algo' => [ \&_set_compress ],
+ }
+}
+
+{
+ my %Ciphers = (
+ '3DES' => 'DES3', BLOWFISH => 'Blowfish',
+ RIJNDAEL => 'Rijndael', RIJNDAEL192 => 'Rijndael192',
+ RIJNDAEL256 => 'Rijndael256', TWOFISH => 'Twofish',
+ CAST5 => 'CAST5',
+ );
+ sub _set_cipher { $_[0]->{o}{Cipher} = $Ciphers{$_[2]} }
+
+ my %Compress = ( 1 => 'ZIP', 2 => 'Zlib' );
+ sub _set_compress { $_[0]->{o}{Compress} = $Compress{$_[2]} }
+}
+
+package Crypt::OpenPGP::Config::PGP2;
+sub directives {
+ {
+ armor => [ 'bool', 'Armour' ],
+ compress => [ 'bool', 'Compress' ],
+ encrypttoself => [ 'bool', 'EncryptToSelf' ],
+ myname => [ 'str', 'DefaultSelfRecipient' ],
+ pubring => [ 'str', 'PubRing' ],
+ secring => [ 'str', 'SecRing' ],
+ }
+}
+
+package Crypt::OpenPGP::Config::PGP5;
+*directives = \&Crypt::OpenPGP::Config::PGP2::directives;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Constants.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Constants.pm
new file mode 100755
index 00000000000..7ad9e14a477
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Constants.pm
@@ -0,0 +1,113 @@
+package Crypt::OpenPGP::Constants;
+use strict;
+
+use vars qw( %CONSTANTS );
+
+%CONSTANTS = (
+ 'PGP_PKT_PUBKEY_ENC' => 1,
+ 'PGP_PKT_SIGNATURE' => 2,
+ 'PGP_PKT_SYMKEY_ENC' => 3,
+ 'PGP_PKT_ONEPASS_SIG' => 4,
+ 'PGP_PKT_SECRET_KEY' => 5,
+ 'PGP_PKT_PUBLIC_KEY' => 6,
+ 'PGP_PKT_SECRET_SUBKEY' => 7,
+ 'PGP_PKT_COMPRESSED' => 8,
+ 'PGP_PKT_ENCRYPTED' => 9,
+ 'PGP_PKT_MARKER' => 10,
+ 'PGP_PKT_PLAINTEXT' => 11,
+ 'PGP_PKT_RING_TRUST' => 12,
+ 'PGP_PKT_USER_ID' => 13,
+ 'PGP_PKT_PUBLIC_SUBKEY' => 14,
+ 'PGP_PKT_ENCRYPTED_MDC' => 18,
+ 'PGP_PKT_MDC' => 19,
+
+ 'DEFAULT_CIPHER' => 2,
+ 'DEFAULT_DIGEST' => 2,
+ 'DEFAULT_COMPRESS' => 1,
+);
+
+use vars qw( %TAGS );
+my %RULES = (
+ '^PGP_PKT' => 'packet',
+);
+
+for my $re (keys %RULES) {
+ $TAGS{ $RULES{$re} } = [ grep /$re/, keys %CONSTANTS ];
+}
+
+sub import {
+ my $class = shift;
+
+ my @to_export;
+ my @args = @_;
+ for my $item (@args) {
+ push @to_export,
+ $item =~ s/^:// ? @{ $TAGS{$item} } : $item;
+ }
+
+ no strict 'refs';
+ my $pkg = caller;
+ for my $con (@to_export) {
+ warn __PACKAGE__, " does not export the constant '$con'"
+ unless exists $CONSTANTS{$con};
+ *{"${pkg}::$con"} = sub () { $CONSTANTS{$con} }
+ }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Constants - Exportable constants
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Constants> provides a list of common and useful
+constants for use in I<Crypt::OpenPGP>.
+
+=head1 USAGE
+
+None of the constants are exported by default; you have to ask for
+them explicitly. Some of the constants are grouped into bundles that
+you can grab all at once; alternatively you can just take the
+individual constants, one by one.
+
+If you wish to import a group, your I<use> statement should look
+something like this:
+
+ use Crypt::OpenPGP::Constants qw( :group );
+
+Here are the groups:
+
+=over 4
+
+=item * packet
+
+All of the I<PGP_PKT_*> constants. These are constants that define
+packet types.
+
+=back
+
+Other exportable constants, not belonging to a group, are:
+
+=over 4
+
+=item * DEFAULT_CIPHER
+
+=item * DEFAULT_DIGEST
+
+=item * DEFAULT_COMPRESS
+
+Default cipher, digest, and compression algorithms, to be used if no
+specific cipher, digest, or compression algorithm is otherwise
+specified.
+
+=back
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Digest.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Digest.pm
new file mode 100755
index 00000000000..6b76cadfc9c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Digest.pm
@@ -0,0 +1,147 @@
+package Crypt::OpenPGP::Digest;
+use strict;
+
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+use vars qw( %ALG %ALG_BY_NAME );
+%ALG = (
+ 1 => 'MD5',
+ 2 => 'SHA1',
+ 3 => 'RIPEMD160',
+);
+%ALG_BY_NAME = map { $ALG{$_} => $_ } keys %ALG;
+
+sub new {
+ my $class = shift;
+ my $alg = shift;
+ $alg = $ALG{$alg} || $alg;
+ return $class->error("Unsupported digest algorithm '$alg'")
+ unless $alg =~ /^\D/;
+ my $pkg = join '::', $class, $alg;
+ my $dig = bless { __alg => $alg,
+ __alg_id => $ALG_BY_NAME{$alg} }, $pkg;
+ $dig->init(@_);
+}
+
+sub init { $_[0] }
+sub hash { $_[0]->{md}->($_[1]) }
+
+sub alg {
+ return $_[0]->{__alg} if ref($_[0]);
+ $ALG{$_[1]} || $_[1];
+}
+
+sub alg_id {
+ return $_[0]->{__alg_id} if ref($_[0]);
+ $ALG_BY_NAME{$_[1]} || $_[1];
+}
+
+sub supported {
+ my $class = shift;
+ my %s;
+ for my $did (keys %ALG) {
+ my $digest = $class->new($did);
+ $s{$did} = $digest->alg if $digest;
+ }
+ \%s;
+}
+
+package Crypt::OpenPGP::Digest::MD5;
+use strict;
+use base qw( Crypt::OpenPGP::Digest );
+
+sub init {
+ my $dig = shift;
+ require Digest::MD5;
+ $dig->{md} = \&Digest::MD5::md5;
+ $dig;
+}
+
+package Crypt::OpenPGP::Digest::SHA1;
+use strict;
+use base qw( Crypt::OpenPGP::Digest );
+
+sub init {
+ my $dig = shift;
+ require Digest::SHA1;
+ $dig->{md} = \&Digest::SHA1::sha1;
+ $dig;
+}
+
+package Crypt::OpenPGP::Digest::RIPEMD160;
+use strict;
+use base qw( Crypt::OpenPGP::Digest );
+
+sub init {
+ my $dig = shift;
+ require Crypt::RIPEMD160;
+ $dig->{md} = sub { Crypt::RIPEMD160->hash($_[0]) };
+ $dig;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Digest - PGP message digest factory
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::Digest;
+
+ my $alg = 'SHA1';
+ my $dgst = Crypt::OpenPGP::Digest->new( $alg );
+ my $data = 'foo bar';
+ my $hashed_data = $dgst->hash($data);
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Digest> is a factory class for PGP message digest
+objects. All digest objects are subclasses of this class and share a
+common interface; when creating a new digest object, the object is
+blessed into the subclass to take on algorithm-specific functionality.
+
+A I<Crypt::OpenPGP::Digest> object wraps around a function reference
+providing the actual digest implementation (eg. I<Digest::MD::md5> for
+an MD5 digest). This allows all digest objects to share a common
+interface and a simple instantiation method.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::Digest->new($digest)
+
+Creates a new message digest object of type I<$digest>; I<$digest> can
+be either the name of a digest algorithm (in I<Crypt::OpenPGP>
+parlance) or the numeric ID of the algorithm (as defined in the
+OpenPGP RFC). Using an algorithm name is recommended, for the simple
+reason that it is easier to understand quickly (not everyone knows
+the algorithm IDs).
+
+Valid digest names are: C<MD5>, C<SHA1>, and C<RIPEMD160>.
+
+Returns the new digest object on success. On failure returns C<undef>;
+the caller should check for failure and call the class method I<errstr>
+if a failure occurs. A typical reason this might happen is an
+unsupported digest name or ID.
+
+=head2 $dgst->hash($data)
+
+Creates a message digest hash of the data I<$data>, a string of
+octets, and returns the digest.
+
+=head2 $dgst->alg
+
+Returns the name of the digest algorithm (as listed above in I<new>).
+
+=head2 $dgst->alg_id
+
+Returns the numeric ID of the digest algorithm.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/ErrorHandler.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/ErrorHandler.pm
new file mode 100755
index 00000000000..fd28b0c04ae
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/ErrorHandler.pm
@@ -0,0 +1,92 @@
+package Crypt::OpenPGP::ErrorHandler;
+use strict;
+
+use vars qw( $ERROR );
+
+sub new { bless {}, shift }
+sub error {
+ my $msg = $_[1];
+ $msg .= "\n" unless $msg =~ /\n$/;
+ if (ref($_[0])) {
+ $_[0]->{_errstr} = $msg;
+ } else {
+ $ERROR = $msg;
+ }
+ return;
+ }
+sub errstr { ref($_[0]) ? $_[0]->{_errstr} : $ERROR }
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::ErrorHandler - Crypt::OpenPGP error handling
+
+=head1 SYNOPSIS
+
+ package Foo;
+ use Crypt::OpenPGP::ErrorHandler;
+ use base qw( Crypt::OpenPGP::ErrorHandler );
+
+ sub class_method {
+ my $class = shift;
+ # Stuff happens...
+ return $class->error("Help!");
+ }
+
+ sub object_method {
+ my $obj = shift;
+ # Stuff happens...
+ return $obj->error("I am no more");
+ }
+
+ package main;
+
+ Foo->class_method or die Foo->errstr;
+
+ my $foo = Foo->new;
+ $foo->object_method or die $foo->errstr;
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::ErrorHandler> provides an error-handling mechanism
+for all I<Crypt::OpenPGP> modules/classes. It is meant to be used as
+a base class for classes that wish to use its error-handling methods:
+derived classes use its two methods, I<error> and I<errstr>, to
+communicate error messages back to the calling program.
+
+On failure (for whatever reason), a subclass should call I<error>
+and return to the caller; I<error> itself sets the error message
+internally, then returns C<undef>. This has the effect of the method
+that failed returning C<undef> to the caller. The caller should
+check for errors by checking for a return value of C<undef>, and
+in this case should call I<errstr> to get the value of the error
+message. Note that calling I<errstr> when an error has not occurred
+is undefined behavior and will I<rarely> do what you want.
+
+As demonstrated in the I<SYNOPSIS> (above), I<error> and I<errstr> work
+both as class methods and as object methods.
+
+=head1 USAGE
+
+=head2 Class->error($message)
+
+=head2 $object->error($message)
+
+Sets the error message for either the class I<Class> or the object
+I<$object> to the message I<$message>. Returns C<undef>.
+
+=head2 Class->errstr
+
+=head2 $object->errstr
+
+Accesses the last error message set in the class I<Class> or the
+object I<$object>, respectively, and returns that error message.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key.pm
new file mode 100755
index 00000000000..0fd5edc4a65
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key.pm
@@ -0,0 +1,236 @@
+package Crypt::OpenPGP::Key;
+use strict;
+
+use Carp qw( confess );
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+use vars qw( %ALG %ALG_BY_NAME );
+%ALG = (
+ 1 => 'RSA',
+ 16 => 'ElGamal',
+ 17 => 'DSA',
+);
+%ALG_BY_NAME = map { $ALG{$_} => $_ } keys %ALG;
+
+sub new {
+ my $class = shift;
+ my $alg = shift;
+ $alg = $ALG{$alg} || $alg;
+ my $pkg = join '::', $class, $alg;
+ eval "use $pkg;";
+ return $class->error("Unsupported algorithm '$alg': $@") if $@;
+ my @valid = $pkg->all_props;
+ my %valid = map { $_ => 1 } @valid;
+ my $key = bless { __valid => \%valid, __alg => $alg,
+ __alg_id => $ALG_BY_NAME{$alg} }, $pkg;
+ $key->init(@_);
+}
+
+sub keygen {
+ my $class = shift;
+ my $alg = shift;
+ $alg = $ALG{$alg} || $alg;
+ my $pkg = join '::', __PACKAGE__, 'Public', $alg;
+ eval "use $pkg;";
+ return $class->error("Unsupported algorithm '$alg': $@") if $@;
+ my($pub_data, $sec_data) = $pkg->keygen(@_);
+ return $class->error("Key generation failed: " . $class->errstr)
+ unless $pub_data && $sec_data;
+ my $pub_pkg = join '::', __PACKAGE__, 'Public';
+ my $pub = $pub_pkg->new($alg, $pub_data);
+ my $sec_pkg = join '::', __PACKAGE__, 'Secret';
+ my $sec = $sec_pkg->new($alg, $sec_data);
+ ($pub, $sec);
+}
+
+sub init { $_[0] }
+
+sub check { 1 }
+
+sub alg { $_[0]->{__alg} }
+sub alg_id { $_[0]->{__alg_id} }
+
+sub size { 0 }
+sub bytesize { int(($_[0]->size + 7) / 8) }
+
+sub public_key { }
+sub is_secret { 0 }
+
+sub can_encrypt { 0 }
+sub can_sign { 0 }
+
+sub DESTROY { }
+
+use vars qw( $AUTOLOAD );
+sub AUTOLOAD {
+ my $key = shift;
+ (my $meth = $AUTOLOAD) =~ s/.*:://;
+ confess "Can't call method $meth on Key $key"
+ unless $key->{__valid}{$meth};
+ $key->{key_data}->$meth(@_);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Key - OpenPGP key factory
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::Key;
+ my($pub, $sec) = Crypt::OpenPGP::Key->keygen('DSA', Size => 1024);
+
+ use Crypt::OpenPGP::Key::Public;
+ my $pubkey = Crypt::OpenPGP::Key::Public->new('DSA');
+
+ use Crypt::OpenPGP::Key::Secret;
+ my $seckey = Crypt::OpenPGP::Key::Secret->new('RSA');
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Key> provides base class functionality for all
+I<Crypt::OpenPGP> public and secret keys. It functions as a factory
+class for key generation and key instantiation.
+
+The only time you will ever use I<Crypt::OpenPGP::Key> directly is
+to generate a key-pair; in all other scenarios--for example, when
+instantiating a new key object--you should use either
+I<Crypt::OpenPGP::Key::Public> or I<Crypt::OpenPGP::Key::Secret>,
+depending on whether the key is public or secret, respectively.
+
+=head1 KEY GENERATION
+
+=head2 Crypt::OpenPGP::Key->keygen( $type, %arg )
+
+Generates a new key-pair of public key algorithm I<$type>. Returns
+a public and a secret key, each blessed into the appropriate
+implementation class. Returns an empty list on failure, in which case
+you should call the class method I<errstr> to determine the error.
+
+Valid values for type are C<DSA>, C<RSA>, and C<ElGamal>.
+
+I<%arg> can contain:
+
+=over 4
+
+=item * Size
+
+Bitsize of the key to be generated. This should be an even integer;
+there is no low end currently set, but for the sake of security
+I<Size> should be at least 1024 bits.
+
+This is a required argument.
+
+=item * Verbosity
+
+Set to a true value to enable a status display during key generation;
+since key generation is a relatively length process, it is helpful
+to have an indication that some action is occurring.
+
+I<Verbosity> is 0 by default.
+
+=back
+
+=head1 METHODS
+
+I<Crypt::OpenPGP::Key> is not meant to be used directly (unless you
+are generating keys; see I<KEY GENERATION>, above); instead you should
+use the subclasses of this module. There are, however, useful interface
+methods that are shared by all subclasses.
+
+=head2 Key Data Access
+
+Each public-key algorithm has different key data associated with it.
+For example, a public DSA key has 4 attributes: I<p>, I<q>, I<g>, and
+I<y>. A secret DSA key has the same attributes as a public key, and
+in addition it has an attribute I<x>.
+
+All of the key data attributes can be accessed by calling methods of
+the same name on the I<Key> object. For example:
+
+ my $q = $dsa_key->q;
+
+The attributes for each public-key algorithm are:
+
+=over 4
+
+=item * RSA
+
+Public key: I<n>, I<e>
+
+Secret key: I<n>, I<e>, I<d>, I<p>, I<q>, I<u>
+
+=item * DSA
+
+Public key: I<p>, I<q>, I<g>, I<y>
+
+Secret key: I<p>, I<q>, I<g>, I<y>, I<x>
+
+=item * ElGamal
+
+Public key: I<p>, I<g>, I<y>
+
+Secret key: I<p>, I<g>, I<y>, I<x>
+
+=back
+
+=head2 $key->check
+
+Check the key data to determine if it is valid. For example, an RSA
+secret key would multiply the values of I<p> and I<q> and verify that
+the product is equal to the value of I<n>. Returns true if the key
+is valid, false otherwise.
+
+Not all public key algorithm implementations implement a I<check>
+method; for those that don't, I<check> will always return true.
+
+=head2 $key->size
+
+Returns the "size" of the key. The definition of "size" depends on
+the public key algorithm; for example, DSA defines the size of a key
+as the bitsize of the value of I<p>.
+
+=head2 $key->bytesize
+
+Whereas I<size> will return a bitsize of the key, I<bytesize> returns
+the size in bytes. This value is defined as C<int((bitsize(key)+7)/8)>.
+
+=head2 $key->is_secret
+
+Returns true if the key I<$key> is a secret key, false otherwise.
+
+=head2 $key->public_key
+
+Returns the public part of the key I<$key>. If I<$key> is already a
+public key, I<$key> is returned; otherwise a new public key object
+(I<Crypt::OpenPGP::Key::Public>) is constructed, and the public values
+from the secret key are copied into the public key. The new public
+key is returned.
+
+=head2 $key->can_encrypt
+
+Returns true if the key algorithm has encryption/decryption
+capabilities, false otherwise.
+
+=head2 $key->can_sign
+
+Returns true if the key algorithm has signing/verification
+capabilities, false otherwise.
+
+=head2 $key->alg
+
+Returns the name of the public key algorithm.
+
+=head2 $key->alg_id
+
+Returns the number ID of the public key algorithm.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public.pm
new file mode 100755
index 00000000000..837d81f4d87
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public.pm
@@ -0,0 +1,12 @@
+package Crypt::OpenPGP::Key::Public;
+use strict;
+
+use Crypt::OpenPGP::Key;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::Key Crypt::OpenPGP::ErrorHandler );
+
+sub all_props { $_[0]->public_props }
+sub is_secret { 0 }
+sub public_key { $_[0] }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public/DSA.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public/DSA.pm
new file mode 100755
index 00000000000..321c62c913f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public/DSA.pm
@@ -0,0 +1,53 @@
+package Crypt::OpenPGP::Key::Public::DSA;
+use strict;
+
+use Crypt::DSA::Key;
+use Crypt::OpenPGP::Key::Public;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::Key::Public Crypt::OpenPGP::ErrorHandler );
+
+sub can_sign { 1 }
+sub abbrev { 'D' }
+
+sub init {
+ my $key = shift;
+ $key->{key_data} = shift || Crypt::DSA::Key->new;
+ $key;
+}
+
+sub keygen {
+ my $class = shift;
+ my %param = @_;
+ require Crypt::DSA;
+ my $dsa = Crypt::DSA->new;
+ my $sec = $dsa->keygen( %param );
+ my $pub = bless { }, 'Crypt::DSA::Key';
+ for my $e (qw( p q g pub_key )) {
+ $pub->$e( $sec->$e() );
+ }
+ ($pub, $sec);
+}
+
+sub public_props { qw( p q g y ) }
+sub sig_props { qw( r s ) }
+
+sub y { $_[0]->{key_data}->pub_key(@_[1..$#_]) }
+
+sub size { $_[0]->{key_data}->size }
+
+sub verify {
+ my $key = shift;
+ my($sig, $dgst) = @_;
+ require Crypt::DSA;
+ my $dsa = Crypt::DSA->new;
+ my $dsa_sig = Crypt::DSA::Signature->new;
+ $dsa_sig->r($sig->{r});
+ $dsa_sig->s($sig->{s});
+ $dsa->verify(
+ Key => $key->{key_data},
+ Digest => $dgst,
+ Signature => $dsa_sig
+ );
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public/ElGamal.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public/ElGamal.pm
new file mode 100755
index 00000000000..a6f589c0f82
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public/ElGamal.pm
@@ -0,0 +1,80 @@
+package Crypt::OpenPGP::Key::Public::ElGamal;
+use strict;
+
+use Crypt::OpenPGP::Util qw( bitsize);
+use Crypt::OpenPGP::Key::Public;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::Key::Public Crypt::OpenPGP::ErrorHandler );
+
+sub can_encrypt { 1 }
+sub abbrev { 'g' }
+
+sub public_props { qw( p g y ) }
+sub crypt_props { qw( a b ) }
+sub sig_props { qw( a b ) }
+
+sub size { bitsize($_[0]->p) }
+
+sub init {
+ my $key = shift;
+ $key->{key_data} = shift || Crypt::OpenPGP::ElGamal::Public->new;
+ $key;
+}
+
+sub keygen {
+ return $_[0]->error("ElGamal key generation is not supported");
+}
+
+sub encrypt {
+ my $key = shift;
+ my($M) = @_;
+ $key->{key_data}->encrypt($M);
+}
+
+package Crypt::OpenPGP::ElGamal::Public;
+use strict;
+
+use Crypt::OpenPGP::Util qw( mod_exp );
+use Math::Pari qw( Mod lift gcd );
+
+sub new { bless {}, $_[0] }
+
+sub encrypt {
+ my $key = shift;
+ my($M) = @_;
+ my $k = gen_k($key->p);
+ my $a = mod_exp($key->g, $k, $key->p);
+ my $b = mod_exp($key->y, $k, $key->p);
+ $b = Mod($b, $key->p);
+ $b = lift($b * $M);
+ { a => $a, b => $b };
+}
+
+sub gen_k {
+ my($p) = @_;
+ ## XXX choose bitsize based on bitsize of $p
+ my $bits = 198;
+ my $p_minus1 = $p - 1;
+ require Crypt::Random;
+ my $k = Crypt::Random::makerandom( Size => $bits, Strength => 0 );
+ while (1) {
+ last if gcd($k, $p_minus1) == 1;
+ $k++;
+ }
+ $k;
+}
+
+sub _getset {
+ my $e = shift;
+ sub {
+ my $key = shift;
+ $key->{$e} = shift if @_;
+ $key->{$e};
+ }
+}
+
+*p = _getset('p');
+*g = _getset('g');
+*y = _getset('y');
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public/RSA.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public/RSA.pm
new file mode 100755
index 00000000000..1ebca3397bd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Public/RSA.pm
@@ -0,0 +1,82 @@
+package Crypt::OpenPGP::Key::Public::RSA;
+use strict;
+
+use Crypt::RSA::Key::Public;
+use Crypt::OpenPGP::Digest;
+use Crypt::OpenPGP::Util qw( bitsize bin2mp mp2bin );
+use Crypt::OpenPGP::Key::Public;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::Key::Public Crypt::OpenPGP::ErrorHandler );
+
+sub can_encrypt { 1 }
+sub can_sign { 1 }
+sub abbrev { 'R' }
+
+sub public_props { qw( n e ) }
+sub crypt_props { qw( c ) }
+sub sig_props { qw( c ) }
+
+sub init {
+ my $key = shift;
+ $key->{key_data} = shift || Crypt::RSA::Key::Public->new;
+ $key;
+}
+
+sub keygen {
+ my $class = shift;
+ my %param = @_;
+ $param{Password} = $param{Passphrase};
+ require Crypt::RSA::Key;
+ my $chain = Crypt::RSA::Key->new;
+ my($pub, $sec) = $chain->generate( %param );
+ return $class->errstr( $chain->errstr ) unless $pub && $sec;
+ ($pub, $sec);
+}
+
+sub size { bitsize($_[0]->{key_data}->n) }
+
+sub check { $_[0]->{key_data}->check }
+
+sub encrypt {
+ my $key = shift;
+ my($M) = @_;
+ require Crypt::RSA::Primitives;
+ my $prim = Crypt::RSA::Primitives->new;
+ my $c = $prim->core_encrypt( Key => $key->{key_data}, Plaintext => $M ) or
+ return $key->error($prim->errstr);
+ { c => $c }
+}
+
+sub verify {
+ my $key = shift;
+ my($sig, $dgst) = @_;
+ my $k = $key->bytesize;
+ require Crypt::RSA::Primitives;
+ my $prim = Crypt::RSA::Primitives->new;
+ my $c = $sig->{c};
+ my $m = $prim->core_verify( Key => $key->{key_data}, Signature => $c) or
+ return;
+ $m = mp2bin($m, $k - 1);
+ my $hash_alg = Crypt::OpenPGP::Digest->alg($sig->{hash_alg});
+ my $M = encode($dgst, $hash_alg, $k - 1);
+ $m eq $M;
+}
+
+{
+ my %ENCODING = (
+ MD2 => pack('H*', '3020300C06082A864886F70D020205000410'),
+ MD5 => pack('H*', '3020300C06082A864886F70D020505000410'),
+ SHA1 => pack('H*', '3021300906052B0E03021A05000414'),
+ );
+
+ sub encode {
+ my($dgst, $hash_alg, $mlen) = @_;
+ my $alg = $ENCODING{$hash_alg};
+ my $m = $alg . $dgst;
+ my $padlen = $mlen - length($m) - 2;
+ my $pad = chr(255) x $padlen;
+ chr(1) . $pad . chr(0) . $m;
+ }
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret.pm
new file mode 100755
index 00000000000..3a93e9afe60
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret.pm
@@ -0,0 +1,21 @@
+package Crypt::OpenPGP::Key::Secret;
+use strict;
+
+use Crypt::OpenPGP::Key;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::Key Crypt::OpenPGP::ErrorHandler );
+
+sub is_secret { 1 }
+sub all_props { ($_[0]->public_props, $_[0]->secret_props) }
+
+sub public_key {
+ my $key = shift;
+ my @pub = $key->public_props;
+ my $pub = Crypt::OpenPGP::Key::Public->new($key->alg);
+ for my $e (@pub) {
+ $pub->$e($key->$e());
+ }
+ $pub;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret/DSA.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret/DSA.pm
new file mode 100755
index 00000000000..cfb1bbec4c4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret/DSA.pm
@@ -0,0 +1,39 @@
+package Crypt::OpenPGP::Key::Secret::DSA;
+use strict;
+
+use Crypt::DSA::Key;
+use Crypt::OpenPGP::Key::Public::DSA;
+use Crypt::OpenPGP::Key::Secret;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::Key::Secret Crypt::OpenPGP::ErrorHandler );
+
+sub secret_props { qw( x ) }
+*sig_props = \&Crypt::OpenPGP::Key::Public::DSA::sig_props;
+*public_props = \&Crypt::OpenPGP::Key::Public::DSA::public_props;
+*size = \&Crypt::OpenPGP::Key::Public::DSA::size;
+*keygen = \&Crypt::OpenPGP::Key::Public::DSA::keygen;
+*can_sign = \&Crypt::OpenPGP::Key::Public::DSA::can_sign;
+
+sub init {
+ my $key = shift;
+ $key->{key_data} = shift || Crypt::DSA::Key->new;
+ $key;
+}
+
+sub y { $_[0]->{key_data}->pub_key(@_[1..$#_]) }
+sub x { $_[0]->{key_data}->priv_key(@_[1..$#_]) }
+
+sub sign {
+ my $key = shift;
+ my($dgst) = @_;
+ require Crypt::DSA;
+ my $dsa = Crypt::DSA->new;
+ my $sig = $dsa->sign(
+ Key => $key->{key_data},
+ Digest => $dgst,
+ );
+}
+
+*verify = \&Crypt::OpenPGP::Key::Public::DSA::verify;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret/ElGamal.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret/ElGamal.pm
new file mode 100755
index 00000000000..b7d6eb3d7b1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret/ElGamal.pm
@@ -0,0 +1,56 @@
+package Crypt::OpenPGP::Key::Secret::ElGamal;
+use strict;
+
+use Crypt::OpenPGP::Key::Public::ElGamal;
+use Crypt::OpenPGP::Key::Secret;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::Key::Secret Crypt::OpenPGP::ErrorHandler );
+
+sub secret_props { qw( x ) }
+*public_props = \&Crypt::OpenPGP::Key::Public::ElGamal::public_props;
+*crypt_props = \&Crypt::OpenPGP::Key::Public::ElGamal::crypt_props;
+*size = \&Crypt::OpenPGP::Key::Public::ElGamal::size;
+*keygen = \&Crypt::OpenPGP::Key::Public::ElGamal::keygen;
+*can_encrypt = \&Crypt::OpenPGP::Key::Public::ElGamal::can_encrypt;
+
+sub init {
+ my $key = shift;
+ $key->{key_data} = shift || Crypt::OpenPGP::ElGamal::Private->new;
+ $key;
+}
+
+sub decrypt { $_[0]->{key_data}->decrypt(@_[1..$#_]) }
+
+package Crypt::OpenPGP::ElGamal::Private;
+use strict;
+
+use Crypt::OpenPGP::Util qw( mod_exp mod_inverse );
+use Math::Pari qw( Mod lift );
+
+sub new { bless {}, $_[0] }
+
+sub decrypt {
+ my $key = shift;
+ my($C) = @_;
+ my $p = $key->p;
+ my $t1 = mod_exp($C->{a}, $key->x, $p);
+ $t1 = mod_inverse($t1, $p);
+ my $output = Mod($C->{b}, $p);
+ lift($output * $t1);
+}
+
+sub _getset {
+ my $e = shift;
+ sub {
+ my $key = shift;
+ $key->{$e} = shift if @_;
+ $key->{$e};
+ }
+}
+
+*p = _getset('p');
+*g = _getset('g');
+*y = _getset('y');
+*x = _getset('x');
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret/RSA.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret/RSA.pm
new file mode 100755
index 00000000000..4db25036456
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Key/Secret/RSA.pm
@@ -0,0 +1,49 @@
+package Crypt::OpenPGP::Key::Secret::RSA;
+use strict;
+
+use Crypt::RSA::Key::Private;
+use Crypt::OpenPGP::Key::Public::RSA;
+use Crypt::OpenPGP::Key::Secret;
+use Crypt::OpenPGP::Util qw( bin2mp );
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::Key::Secret Crypt::OpenPGP::ErrorHandler );
+
+sub secret_props { qw( d p q u ) }
+*sig_props = \&Crypt::OpenPGP::Key::Public::RSA::sig_props;
+*public_props = \&Crypt::OpenPGP::Key::Public::RSA::public_props;
+*crypt_props = \&Crypt::OpenPGP::Key::Public::RSA::crypt_props;
+*size = \&Crypt::OpenPGP::Key::Public::RSA::size;
+*encode = \&Crypt::OpenPGP::Key::Public::RSA::encode;
+*keygen = \&Crypt::OpenPGP::Key::Public::RSA::keygen;
+*can_encrypt = \&Crypt::OpenPGP::Key::Public::RSA::can_encrypt;
+*can_sign = \&Crypt::OpenPGP::Key::Public::RSA::can_sign;
+
+sub init {
+ my $key = shift;
+ $key->{key_data} = shift ||
+ Crypt::RSA::Key::Private->new( Password => 'pgp' );
+ $key;
+}
+
+*encrypt = \&Crypt::OpenPGP::Key::Public::RSA::encrypt;
+
+sub decrypt {
+ my $key = shift;
+ my($C) = @_;
+ require Crypt::RSA::Primitives;
+ my $prim = Crypt::RSA::Primitives->new;
+ $prim->core_decrypt( Key => $key->{key_data}, Cyphertext => $C->{c} );
+}
+
+sub sign {
+ my $key = shift;
+ my($dgst, $hash_alg) = @_;
+ my $m = encode($dgst, $hash_alg, $key->bytesize - 1);
+ require Crypt::RSA::Primitives;
+ my $prim = Crypt::RSA::Primitives->new;
+ $m = bin2mp($m);
+ my $c = $prim->core_sign( Key => $key->{key_data}, Message => $m );
+ { c => $c }
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/KeyBlock.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/KeyBlock.pm
new file mode 100755
index 00000000000..5784bbb11ac
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/KeyBlock.pm
@@ -0,0 +1,145 @@
+package Crypt::OpenPGP::KeyBlock;
+use strict;
+
+use Crypt::OpenPGP::PacketFactory;
+
+sub primary_uid {
+ $_[0]->{pkt}{ 'Crypt::OpenPGP::UserID' } ?
+ $_[0]->{pkt}{ 'Crypt::OpenPGP::UserID' }->[0]->id : undef;
+}
+
+sub key { $_[0]->get('Crypt::OpenPGP::Certificate')->[0] }
+sub subkey { $_[0]->get('Crypt::OpenPGP::Certificate')->[1] }
+
+sub encrypting_key {
+ my $kb = shift;
+ my $keys = $kb->get('Crypt::OpenPGP::Certificate');
+ return unless $keys && @$keys;
+ for my $key (@$keys) {
+ return $key if $key->can_encrypt;
+ }
+}
+
+sub signing_key {
+ my $kb = shift;
+ my $keys = $kb->get('Crypt::OpenPGP::Certificate');
+ return unless $keys && @$keys;
+ for my $key (@$keys) {
+ return $key if $key->can_sign;
+ }
+}
+
+sub key_by_id { $_[0]->{keys_by_id}->{$_[1]} ||
+ $_[0]->{keys_by_short_id}->{$_[1]} }
+
+sub new {
+ my $class = shift;
+ my $kb = bless { }, $class;
+ $kb->init(@_);
+}
+
+sub init {
+ my $kb = shift;
+ $kb->{pkt} = { };
+ $kb->{order} = [ ];
+ $kb->{keys_by_id} = { };
+ $kb;
+}
+
+sub add {
+ my $kb = shift;
+ my($pkt) = @_;
+ push @{ $kb->{pkt}->{ ref($pkt) } }, $pkt;
+ push @{ $kb->{order} }, $pkt;
+ if (ref($pkt) eq 'Crypt::OpenPGP::Certificate') {
+ my $kid = $pkt->key_id;
+ $kb->{keys_by_id}{ $kid } = $pkt;
+ $kb->{keys_by_short_id}{ substr $kid, -4, 4 } = $pkt;
+ }
+}
+
+sub get { $_[0]->{pkt}->{ $_[1] } }
+
+sub save {
+ my $kb = shift;
+ Crypt::OpenPGP::PacketFactory->save( @{ $kb->{order} } );
+}
+
+sub save_armoured {
+ my $kb = shift;
+ require Crypt::OpenPGP::Armour;
+ Crypt::OpenPGP::Armour->armour(
+ Data => $kb->save,
+ Object => 'PUBLIC KEY BLOCK'
+ );
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::KeyBlock - Key block object
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::KeyBlock;
+
+ my $packet = Crypt::OpenPGP::UserID->new( Identity => 'foo' );
+ my $kb = Crypt::OpenPGP::KeyBlock->new;
+ $kb->add($packet);
+
+ my $serialized = $kb->save;
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::KeyBlock> represents a single keyblock in a keyring.
+A key block is essentially just a set of associated keys containing
+exactly one master key, zero or more subkeys, some user ID packets, some
+signatures, etc. The key is that there is only one master key
+associated with each keyblock.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::KeyBlock->new
+
+Constructs a new key block object and returns that object.
+
+=head2 $kb->encrypting_key
+
+Returns the key that performs encryption in this key block. For example,
+if a DSA key is the master key in a key block with an ElGamal subkey,
+I<encrypting_key> returns the ElGamal subkey certificate, because DSA
+keys do not perform encryption/decryption.
+
+=head2 $kb->signing_key
+
+Returns the key that performs signing in this key block. For example,
+if a DSA key is the master key in a key block with an ElGamal subkey,
+I<encrypting_key> returns the DSA master key certificate, because DSA
+supports signing/verification.
+
+=head2 $kb->add($packet)
+
+Adds the packet I<$packet> to the key block. If the packet is a PGP
+certificate (a I<Crypt::OpenPGP::Certificate> object), the certificate
+is also added to the internal key-management mechanism.
+
+=head2 $kb->save
+
+Serializes each of the packets contained in the I<KeyBlock> object,
+in order, and returns the serialized data. This output can then be
+fed to I<Crypt::OpenPGP::Armour> for ASCII-armouring, for example,
+or can be written out to a keyring file.
+
+=head2 $kb->save_armoured
+
+Saves an armoured version of the keyblock (this is useful for exporting
+public keys).
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/KeyRing.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/KeyRing.pm
new file mode 100755
index 00000000000..6709ed47a77
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/KeyRing.pm
@@ -0,0 +1,267 @@
+package Crypt::OpenPGP::KeyRing;
+use strict;
+
+use Crypt::OpenPGP::Constants qw( PGP_PKT_USER_ID
+ PGP_PKT_PUBLIC_KEY
+ PGP_PKT_SECRET_KEY
+ PGP_PKT_PUBLIC_SUBKEY
+ PGP_PKT_SECRET_SUBKEY );
+use Crypt::OpenPGP::Buffer;
+use Crypt::OpenPGP::KeyBlock;
+use Crypt::OpenPGP::PacketFactory;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub new {
+ my $class = shift;
+ my $ring = bless { }, $class;
+ $ring->init(@_);
+}
+
+sub init {
+ my $ring = shift;
+ my %param = @_;
+ $ring->{_data} = $param{Data} || '';
+ if (!$ring->{_data} && (my $file = $param{Filename})) {
+ local *FH;
+ open FH, $file or
+ return (ref $ring)->error("Can't open keyring $file: $!");
+ binmode FH;
+ { local $/; $ring->{_data} = <FH> }
+ close FH;
+ }
+ if ($ring->{_data} =~ /-----BEGIN/) {
+ require Crypt::OpenPGP::Armour;
+ my $rec = Crypt::OpenPGP::Armour->unarmour($ring->{_data}) or
+ return (ref $ring)->error("Unarmour failed: " .
+ Crypt::OpenPGP::Armour->errstr);
+ $ring->{_data} = $rec->{Data};
+ }
+ $ring;
+}
+
+sub save {
+ my $ring = shift;
+ my @blocks = $ring->blocks;
+ my $res = '';
+ for my $block (@blocks) {
+ $res .= $block->save;
+ }
+ $res;
+}
+
+sub read {
+ my $ring = shift;
+ return $ring->error("No data to read") unless $ring->{_data};
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->append($ring->{_data});
+ $ring->restore($buf);
+ 1;
+}
+
+sub restore {
+ my $ring = shift;
+ my($buf) = @_;
+ $ring->{blocks} = [];
+ my($kb);
+ while (my $packet = Crypt::OpenPGP::PacketFactory->parse($buf)) {
+ if (ref($packet) eq "Crypt::OpenPGP::Certificate" &&
+ !$packet->is_subkey) {
+ $kb = Crypt::OpenPGP::KeyBlock->new;
+ $ring->add($kb);
+ }
+ $kb->add($packet) if $kb;
+ }
+}
+
+sub add {
+ my $ring = shift;
+ my($entry) = @_;
+ push @{ $ring->{blocks} }, $entry;
+}
+
+sub find_keyblock_by_keyid {
+ my $ring = shift;
+ my($key_id) = @_;
+ my $ref = $ring->{by_keyid}{$key_id};
+ unless ($ref) {
+ my $len = length($key_id);
+ my @kbs = $ring->find_keyblock(
+ sub { substr($_[0]->key_id, -$len, $len) eq $key_id },
+ [ PGP_PKT_PUBLIC_KEY, PGP_PKT_SECRET_KEY,
+ PGP_PKT_PUBLIC_SUBKEY, PGP_PKT_SECRET_SUBKEY ], 1 );
+ return unless @kbs;
+ $ref = $ring->{by_keyid}{ $key_id } = \@kbs;
+ }
+ return wantarray ? @$ref : $ref->[0];
+}
+
+sub find_keyblock_by_uid {
+ my $ring = shift;
+ my($uid) = @_;
+ $ring->find_keyblock(sub { $_[0]->id =~ /$uid/i },
+ [ PGP_PKT_USER_ID ], 1 );
+}
+
+sub find_keyblock_by_index {
+ my $ring = shift;
+ my($index) = @_;
+ ## XXX should not have to read entire keyring
+ $ring->read;
+ ($ring->blocks)[$index];
+}
+
+sub find_keyblock {
+ my $ring = shift;
+ my($test, $pkttypes, $multiple) = @_;
+ $pkttypes ||= [];
+ return $ring->error("No data to read") unless $ring->{_data};
+ my $buf = Crypt::OpenPGP::Buffer->new_with_init($ring->{_data});
+ my($last_kb_start_offset, $last_kb_start_cert, @kbs);
+ while (my $pkt = Crypt::OpenPGP::PacketFactory->parse($buf,
+ [ PGP_PKT_SECRET_KEY, PGP_PKT_PUBLIC_KEY,
+ @$pkttypes ], $pkttypes)) {
+ if (($pkt->{__unparsed} && ($pkt->{type} == PGP_PKT_SECRET_KEY ||
+ $pkt->{type} == PGP_PKT_PUBLIC_KEY)) ||
+ (ref($pkt) eq 'Crypt::OpenPGP::Certificate' && !$pkt->is_subkey)) {
+ $last_kb_start_offset = $buf->offset;
+ $last_kb_start_cert = $pkt;
+ }
+ next unless !$pkt->{__unparsed} && $test->($pkt);
+ my $kb = Crypt::OpenPGP::KeyBlock->new;
+
+ ## Rewind buffer; if start-cert is parsed, rewind to offset
+ ## after start-cert--otherwise rewind before start-cert
+ if ($last_kb_start_cert->{__unparsed}) {
+ $buf->set_offset($last_kb_start_offset -
+ $last_kb_start_cert->{__pkt_len});
+ my $cert = Crypt::OpenPGP::PacketFactory->parse($buf);
+ $kb->add($cert);
+ } else {
+ $buf->set_offset($last_kb_start_offset);
+ $kb->add($last_kb_start_cert);
+ }
+ {
+ my $off = $buf->offset;
+ my $packet = Crypt::OpenPGP::PacketFactory->parse($buf);
+ last unless $packet;
+ $buf->set_offset($off),
+ last if ref($packet) eq "Crypt::OpenPGP::Certificate" &&
+ !$packet->is_subkey;
+ $kb->add($packet) if $kb;
+ redo;
+ }
+ unless ($multiple) {
+ return wantarray ? ($kb, $pkt) : $kb;
+ } else {
+ return $kb unless wantarray;
+ push @kbs, $kb;
+ }
+ }
+ @kbs;
+}
+
+sub blocks { $_[0]->{blocks} ? @{ $_[0]->{blocks} } : () }
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::KeyRing - Key ring object
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::KeyRing;
+
+ my $ring = Crypt::OpenPGP::KeyRing->new( Filename => 'foo.ring' );
+
+ my $key_id = '...';
+ my $kb = $ring->find_keyblock_by_keyid($key_id);
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::KeyRing> provides keyring management and key lookup
+for I<Crypt::OpenPGP>. A I<KeyRing>, in this case, does not necessarily
+have to be a keyring file; a I<KeyRing> object is just a collection of
+key blocks, where each key block contains exactly one master key,
+zero or more subkeys, some user ID packets, some signatures, etc.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::KeyRing->new( %arg )
+
+Constructs a new I<Crypt::OpenPGP::KeyRing> object and returns that
+object. This has the effect os hooking the object to a particular
+keyring, so that all subsequent methods called on the I<KeyRing>
+object will use the data specified in the arguments to I<new>.
+
+I<%arg> can contain:
+
+=over 4
+
+=item * Data
+
+A block of data specifying the serialized keyring, presumably as read
+in from a file on disk. This data can be either in binary form or in
+ASCII-armoured form; if the latter it will be unarmoured automatically.
+
+This argument is optional.
+
+=item * Filename
+
+The path to a keyring file, or at least, a file containing a key (and
+perhaps other associated keyblock data). The data in this file can be
+either in binary form or in ASCII-armoured form; if the latter it will be
+unarmoured automatically.
+
+This argument is optional.
+
+=back
+
+=head2 $ring->find_keyblock_by_keyid($key_id)
+
+Looks up the key ID I<$key_id> in the keyring I<$ring>. I<$key_id>
+should be either a 4-octet or 8-octet string--it should I<not> be a
+string of hexadecimal digits. If that is what you have, use I<pack> to
+convert it to an octet string:
+
+ pack 'H*', $hex_key_id
+
+If a keyblock is found where the key ID of either the master key or
+subkey matches I<$key_id>, that keyblock will be returned. The
+definition of "match" depends on the length of I<$key_id>: if it is a
+16-digit hex number, only exact matches will be returned; if it is an
+8-digit hex number, any keyblocks containing keys whose last 8 hex
+digits match I<$key_id> will be returned.
+
+In scalar context, only the first keyblock found in the keyring is
+returned; in list context, all matching keyblocks are returned. In
+practice, duplicated key IDs are rare, particularly so if you specify
+the full 16 hex digits in I<$key_id>.
+
+Returns false on failure (C<undef> in scalar context, an empty list in
+list context).
+
+=head2 $ring->find_keyblock_by_uid($uid)
+
+Given a string I<$uid>, looks up all keyblocks with User ID packets
+matching the string I<$uid>, including partial matches.
+
+In scalar context, returns only the first keyblock with a matching
+user ID; in list context, returns all matching keyblocks.
+
+Returns false on failure.
+
+=head2 $ring->find_keyblock_by_index($index)
+
+Given an index into a list of keyblocks I<$index>, returns the keyblock
+(a I<Crypt::OpenPGP::KeyBlock> object) at that index. Accepts negative
+indexes, so C<-1> will give you the last keyblock in the keyring.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/KeyServer.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/KeyServer.pm
new file mode 100755
index 00000000000..a82f17f9616
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/KeyServer.pm
@@ -0,0 +1,153 @@
+package Crypt::OpenPGP::KeyServer;
+use strict;
+
+use Crypt::OpenPGP;
+use Crypt::OpenPGP::KeyRing;
+use LWP::UserAgent;
+use URI::Escape;
+
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub new {
+ my $class = shift;
+ my $server = bless { }, $class;
+ $server->init(@_)
+ or return $class->error($server->errstr);
+ $server;
+}
+
+sub init {
+ my $server = shift;
+ my %param = @_;
+ $server->{keyserver} = $param{Server}
+ or return $server->error("Need a keyserver ('Server')");
+ $server->{keyserver} = 'http://' . $server->{keyserver} . ':11371' .
+ '/pks/lookup';
+ $server->{include_revoked} = $param{IncludeRevoked} || 0;
+ $server;
+}
+
+
+sub find_keyblock_by_uid {
+ my $server = shift;
+ my($address) = @_;
+ my $ua = LWP::UserAgent->new;
+ $ua->agent('Crypt::OpenPGP/' . Crypt::OpenPGP->VERSION);
+ my $url = $server->{keyserver} . '?op=index&search=' .
+ uri_escape($address);
+ my $req = HTTP::Request->new(GET => $url);
+ my $res = $ua->request($req);
+ return $server->error("HTTP error: " . $res->status_line)
+ unless $res->is_success;
+ my $page = $res->content;
+ my @kb;
+ while ($page =~ m!(pub.*?&gt;)!gs) {
+ my $line = $1;
+ next if index($line, "*** KEY REVOKED ***") != -1 &&
+ !$server->{include_revoked};
+ my($key_id) = $line =~ m!<a.*?>(.{8})</a>!g;
+ my $kb = $server->find_keyblock_by_keyid(pack 'H*', $key_id) or next;
+ push @kb, $kb;
+ }
+ @kb;
+}
+
+sub find_keyblock_by_keyid {
+ my $server = shift;
+ my($key_id) = @_;
+ $key_id = unpack 'H*', $key_id;
+ my $ua = LWP::UserAgent->new;
+ $ua->agent('Crypt::OpenPGP/' . Crypt::OpenPGP->VERSION);
+ $key_id = substr($key_id, -8, 8);
+ my $url = $server->{keyserver} . '?op=get&search=0x' . $key_id;
+ my $req = HTTP::Request->new(GET => $url);
+ my $res = $ua->request($req);
+ return $server->error("HTTP error: " . $res->status_line)
+ unless $res->is_success;
+ my $page = $res->content;
+ my($key) = $page =~ /(-----BEGIN PGP PUBLIC KEY BLOCK-----.*?-----END PGP PUBLIC KEY BLOCK-----)/s;
+ return $server->error("No matching keys") unless $key;
+ my $ring = Crypt::OpenPGP::KeyRing->new( Data => $key )
+ or return Crypt::OpenPGP::KeyRing->errstr;
+ $ring->find_keyblock_by_index(0);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::KeyServer - Interface to HKP keyservers
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::KeyServer;
+
+ my $key_id = '...';
+ my $server = Crypt::OpenPGP::KeyServer->new(
+ Server => 'wwwkeys.us.pgp.net'
+ );
+ my $kb = $server->find_keyblock_by_keyid($key_id);
+ print $kb->primary_uid, "\n";
+ my $cert = $kb->key;
+
+ my @kbs = $server->find_keyblock_by_uid( 'foo@bar.com' );
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::KeyServer> is an interface to HKP keyservers; it provides
+lookup by UID and by key ID. At the moment only HKP keyservers are
+supported; future releases will likely support the NAI LDAP servers and
+the email keyservers.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::KeyServer->new( %arg )
+
+Constructs a new I<Crypt::OpenPGP::KeyServer> object and returns that
+object.
+
+I<%arg> can contain:
+
+=over 4
+
+=item * Server
+
+The hostname of the HKP keyserver. This is a required argument. You can get
+a list of keyservers through
+
+ % host -l pgp.net | grep wwwkeys
+
+=item * IncludeRevoked
+
+By default, revoked keys will be skipped when calling I<find_keyblock_by_uid>.
+If you set I<IncludeRevoked> to C<1>, I<find_keyblock_by_keyid> will include
+any revoked keys in the list of keys returned.
+
+=back
+
+=head2 $ring->find_keyblock_by_keyid($key_id)
+
+Looks up the key ID I<$key_id> in the keyring I<$ring>. For consistency
+with the I<Crypt::OpenPGP::KeyRing::find_keyblock_by_keyid> interface,
+I<$key_id> should be either a 4-octet or 8-octet string--it should
+B<not> be a string of hexadecimal digits. If you have the hex key ID, use
+I<pack> to convert it to an octet string:
+
+ pack 'H*', $hex_key_id
+
+Returns false on failure.
+
+=head2 $ring->find_keyblock_by_uid($uid)
+
+Given a string I<$uid>, searches the keyserver for all keyblocks matching
+the user ID I<$uid>, including partial matches. Returns all of the matching
+keyblocks, the empty list on failure.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/MDC.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/MDC.pm
new file mode 100755
index 00000000000..c59b32f3bc1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/MDC.pm
@@ -0,0 +1,97 @@
+package Crypt::OpenPGP::MDC;
+use strict;
+
+use Crypt::OpenPGP::Digest;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub new {
+ my $mdc = bless { }, shift;
+ $mdc->init(@_);
+}
+
+sub init {
+ my $mdc = shift;
+ my %param = @_;
+ if (my $data = $param{Data}) {
+ my $dgst = Crypt::OpenPGP::Digest->new('SHA1');
+ $mdc->{body} = $dgst->hash($data);
+ }
+ $mdc;
+}
+
+sub digest { $_[0]->{body} }
+
+sub parse {
+ my $class = shift;
+ my($buf) = @_;
+ my $mdc = $class->new;
+ $mdc->{body} = $buf->get_bytes($buf->length - $buf->offset);
+ $mdc;
+}
+
+sub save { $_[0]->{body} }
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::MDC - MDC (modification detection code) packet
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::MDC;
+
+ my $mdc = Crypt::OpenPGP::MDC->new( Data => 'foobar' );
+ my $digest = $mdc->digest;
+ my $serialized = $mdc->save;
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::MDC> is a PGP MDC (modification detection code) packet.
+Such a packet is used alongside Encrypted-MDC data packets so that
+modifications to the ciphertext can be detected. The MDC packet contains
+a C<SHA-1> digest of the plaintext for comparison with the decrypted
+plaintext.
+
+You generally will never need to construct a I<Crypt::OpenPGP::MDC>
+packet yourself; usage is by the I<Crypt::OpenPGP::Ciphertext> object.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::MDC->new( [ Data => $data ] )
+
+Creates a new MDC packet object and returns that object. If you do not
+supply any data I<$data>, the object is created empty; this is used, for
+example, in I<parse> (below), to create an empty packet which is then
+filled from the data in the buffer.
+
+If you wish to initialize a non-empty object, supply I<new> with
+the I<Data> parameter along with a value I<$data>. I<$data> should
+contain the plaintext prefix (length = cipher blocksize + 2), the actual
+plaintext, and two octets corresponding to the hex digits C<0xd3> and
+C<0x14>.
+
+=head2 $mdc->save
+
+Returns the text of the MDC packet; this is the digest of the data passed
+to I<new> (above) as I<$data>, for example.
+
+=head2 Crypt::OpenPGP::MDC->parse($buffer)
+
+Given I<$buffer>, a I<Crypt::OpenPGP::Buffer> object holding (or
+with offset pointing to) an MDC packet, returns a new <Crypt::OpenPGP::MDC>
+object, initialized with the MDC data in the buffer.
+
+=head2 $mdc->digest
+
+Returns the MDC digest data (eg. the string passed as I<$data> to
+I<new>, above).
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Marker.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Marker.pm
new file mode 100755
index 00000000000..69d9c3363c1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Marker.pm
@@ -0,0 +1,40 @@
+package Crypt::OpenPGP::Marker;
+use strict;
+
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub new { bless { }, $_[0] }
+sub parse {
+ my $class = shift;
+ my($buf) = @_;
+ my $marker = $class->new;
+ $marker->{mark} = $buf->bytes;
+ $marker;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Marker - PGP Marker packet
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Marker> is a PGP Marker packet. These packets are
+used by PGP 5.x to signal to earlier versions of PGP (eg. 2.6.x)
+that the message requires newer software to be read and understood.
+
+The contents of the Marker packet are always the same: the three
+octets 0x50, 0x47, and 0x50 (which spell C<PGP>).
+
+It is very likely that you will never have to use a Marker packet
+directly.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Message.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Message.pm
new file mode 100755
index 00000000000..fcf606f509d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Message.pm
@@ -0,0 +1,157 @@
+package Crypt::OpenPGP::Message;
+use strict;
+
+use Crypt::OpenPGP::Buffer;
+use Crypt::OpenPGP::PacketFactory;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub new {
+ my $class = shift;
+ my $msg = bless { }, $class;
+ $msg->init(@_);
+}
+
+sub init {
+ my $msg = shift;
+ my %param = @_;
+ $msg->{is_packet_stream} = delete $param{IsPacketStream};
+ $msg->{pieces} = [];
+ $msg->{_data} = $param{Data} || '';
+ if (!$msg->{_data} && (my $file = $param{Filename})) {
+ local *FH;
+ open FH, $file or
+ return (ref $msg)->error("Can't open message $file: $!");
+ binmode FH;
+ { local $/; $msg->{_data} = <FH> }
+ close FH;
+ }
+ $msg->read or return;
+ $msg;
+}
+
+sub read {
+ my $msg = shift;
+ my $data = $msg->{_data} or
+ return $msg->error("Message contains no data");
+ my $pt;
+ if (!$msg->{is_packet_stream} &&
+ $data =~ /-----BEGIN PGP SIGNED MESSAGE/) {
+ require Crypt::OpenPGP::Armour;
+ require Crypt::OpenPGP::Util;
+ require Crypt::OpenPGP::Plaintext;
+ my($head, $text, $sig) = $data =~
+ m!-----BEGIN PGP SIGNED MESSAGE-----(.*?\r?\n\r?\n)?(.+?)(-----BEGIN PGP SIGNATURE.*?END PGP SIGNATURE-----)!s;
+ ## In clear-signed messages, the line ending before the signature
+ ## is not considered part of the signed text.
+ $text =~ s!\r?\n$!!;
+ $pt = Crypt::OpenPGP::Plaintext->new(
+ Data => Crypt::OpenPGP::Util::dash_unescape($text),
+ Mode => 't',
+ );
+ $data = $sig;
+ }
+
+ if (!$msg->{is_packet_stream} && $data =~ /^-----BEGIN PGP/m) {
+ require Crypt::OpenPGP::Armour;
+ my $rec = Crypt::OpenPGP::Armour->unarmour($data) or
+ return $msg->error("Unarmour failed: " .
+ Crypt::OpenPGP::Armour->errstr);
+ $data = $rec->{Data};
+ }
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->append($data);
+ $msg->restore($buf);
+ push @{ $msg->{pieces} }, $pt if $pt;
+ 1;
+}
+
+sub restore {
+ my $msg = shift;
+ my($buf) = @_;
+ while (my $packet = Crypt::OpenPGP::PacketFactory->parse($buf)) {
+ push @{ $msg->{pieces} }, $packet;
+ }
+}
+
+sub pieces { @{ $_[0]->{pieces} } }
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Message - Sequence of PGP packets
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::Message;
+
+ my $data; $data .= $_ while <STDIN>;
+ my $msg = Crypt::OpenPGP::Message->new( Data => $data );
+ my @pieces = $msg->pieces;
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Message> provides a container for a sequence of PGP
+packets. It transparently handles ASCII-armoured messages, as well as
+cleartext signatures.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::Message->new( %arg )
+
+Constructs a new I<Crypt::OpenPGP::Message> object, presumably to be
+filled with some data, where the data is a serialized stream of PGP
+packets.
+
+Reads the packets into in-memory packet objects.
+
+Returns the new I<Message> object on success, C<undef> on failure.
+
+I<%arg> can contain:
+
+=over 4
+
+=item * Data
+
+A scalar string containing the serialized packets.
+
+This argument is optional, but either this argument or I<Filename> must
+be provided.
+
+=item * Filename
+
+The path to a file that contains a serialized stream of packets.
+
+This argument is optional, but either this argument or I<Data> must be
+provided.
+
+=item * IsPacketStream
+
+By default I<Crypt::OpenPGP::Message> will attempt to unarmour ASCII-armoured
+text. Since the armoured text can actually appear anywhere in a string, as
+long as it starts at the beginning of a line, this can cause problems when a
+stream of packets happens to include armoured text. At those times you want
+the packets to be treated as a stream, not as a string that happens to contain
+armoured text.
+
+In this case, set I<IsPacketStream> to a true value, and the ASCII armour
+detection will be skipped.
+
+=back
+
+=head2 $msg->pieces
+
+Returns an array containing packet objects. For example, if the packet
+stream contains a public key packet, a user ID packet, and a signature
+packet, the array will contain three objects: a
+I<Crypt::OpenPGP::Certificate> object; a I<Crypt::OpenPGP::UserID>
+object; and a I<Crypt::OpenPGP::Signature> object, in that order.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/OnePassSig.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/OnePassSig.pm
new file mode 100755
index 00000000000..b85779385c1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/OnePassSig.pm
@@ -0,0 +1,52 @@
+package Crypt::OpenPGP::OnePassSig;
+use strict;
+
+sub new { bless { }, $_[0] }
+
+sub parse {
+ my $class = shift;
+ my($buf) = @_;
+ my $onepass = $class->new;
+ $onepass->{version} = $buf->get_int8;
+ $onepass->{type} = $buf->get_int8;
+ $onepass->{hash_alg} = $buf->get_int8;
+ $onepass->{pk_alg} = $buf->get_int8;
+ $onepass->{key_id} = $buf->get_bytes(8);
+ $onepass->{nested} = $buf->get_int8;
+ $onepass;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::OnePassSig - One-Pass Signature packet
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::OnePassSig> implements a PGP One-Pass Signature
+packet, a packet that precedes the signature data and contains
+enough information to allow the receiver of the signature to begin
+computing the hashed data. Standard signature packets always come
+I<before> the signed data, which forces receivers to backtrack to
+the beginning of the message--to the signature packet--to add on
+the signature trailer data. The one-pass signature packet allows
+the receive to start computing the hashed data while reading the
+data packet, then continue on sequentially when it reaches the
+signature packet.
+
+=head1 USAGE
+
+=head2 my $onepass = Crypt::OpenPGP::OnePassSig->parse($buffer)
+
+Given the I<Crypt::OpenPGP::Buffer> object buffer, which should
+contain a one-pass signature packet, parses the object from the
+buffer and returns the object.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/PacketFactory.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/PacketFactory.pm
new file mode 100755
index 00000000000..eba1ad88def
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/PacketFactory.pm
@@ -0,0 +1,255 @@
+package Crypt::OpenPGP::PacketFactory;
+use strict;
+
+use Crypt::OpenPGP::Constants qw( :packet );
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+use vars qw( %PACKET_TYPES %PACKET_TYPES_BY_CLASS );
+%PACKET_TYPES = (
+ PGP_PKT_PUBKEY_ENC() => { class => 'Crypt::OpenPGP::SessionKey' },
+ PGP_PKT_SIGNATURE() => { class => 'Crypt::OpenPGP::Signature' },
+ PGP_PKT_SYMKEY_ENC() => { class => 'Crypt::OpenPGP::SKSessionKey' },
+ PGP_PKT_ONEPASS_SIG() => { class => 'Crypt::OpenPGP::OnePassSig' },
+ PGP_PKT_SECRET_KEY() => { class => 'Crypt::OpenPGP::Certificate',
+ args => [ 1, 0 ] },
+ PGP_PKT_PUBLIC_KEY() => { class => 'Crypt::OpenPGP::Certificate',
+ args => [ 0, 0 ] },
+ PGP_PKT_SECRET_SUBKEY() => { class => 'Crypt::OpenPGP::Certificate',
+ args => [ 1, 1 ] },
+ PGP_PKT_USER_ID() => { class => 'Crypt::OpenPGP::UserID' },
+ PGP_PKT_PUBLIC_SUBKEY() => { class => 'Crypt::OpenPGP::Certificate',
+ args => [ 0, 1 ] },
+ PGP_PKT_COMPRESSED() => { class => 'Crypt::OpenPGP::Compressed' },
+ PGP_PKT_ENCRYPTED() => { class => 'Crypt::OpenPGP::Ciphertext' },
+ PGP_PKT_MARKER() => { class => 'Crypt::OpenPGP::Marker' },
+ PGP_PKT_PLAINTEXT() => { class => 'Crypt::OpenPGP::Plaintext' },
+ PGP_PKT_RING_TRUST() => { class => 'Crypt::OpenPGP::Trust' },
+ PGP_PKT_ENCRYPTED_MDC() => { class => 'Crypt::OpenPGP::Ciphertext',
+ args => [ 1 ] },
+ PGP_PKT_MDC() => { class => 'Crypt::OpenPGP::MDC' },
+);
+
+%PACKET_TYPES_BY_CLASS = map { $PACKET_TYPES{$_}{class} => $_ } keys %PACKET_TYPES;
+
+sub parse {
+ my $class = shift;
+ my($buf, $find, $parse) = @_;
+ return unless $buf && $buf->offset < $buf->length;
+ my(%find, %parse);
+ if ($find) {
+ %find = ref($find) eq 'ARRAY' ? (map { $_ => 1 } @$find) :
+ ($find => 1);
+ }
+ else {
+ %find = map { $_ => 1 } keys %PACKET_TYPES;
+ }
+ if ($parse) {
+ %parse = ref($parse) eq 'ARRAY' ? (map { $_ => 1 } @$parse) :
+ ($parse => 1);
+ }
+ else {
+ %parse = %find;
+ }
+
+ my($type, $len, $partial, $hdrlen, $b);
+ do {
+ ($type, $len, $partial, $hdrlen) = $class->_parse_header($buf);
+ $b = $buf->extract($len ? $len : $buf->length - $buf->offset);
+ return unless $type;
+ } while !$find{$type}; ## Skip
+
+ while ($partial) {
+ my $off = $buf->offset;
+ (my($nlen), $partial) = $class->_parse_new_len_header($buf);
+ $len += $nlen + ($buf->offset - $off);
+ $b->append( $buf->get_bytes($nlen) );
+ }
+
+ my $obj;
+ if ($parse{$type} && (my $ref = $PACKET_TYPES{$type})) {
+ my $pkt_class = $ref->{class};
+ my @args = $ref->{args} ? @{ $ref->{args} } : ();
+ eval "use $pkt_class;";
+ return $class->error("Loading $pkt_class failed: $@") if $@;
+ $obj = $pkt_class->parse($b, @args);
+ }
+ else {
+ $obj = { type => $type, length => $len,
+ __pkt_len => $len + $hdrlen, __unparsed => 1 };
+ }
+ $obj;
+}
+
+sub _parse_header {
+ my $class = shift;
+ my($buf) = @_;
+ return unless $buf && $buf->offset < $buf->length;
+
+ my $off_start = $buf->offset;
+ my $tag = $buf->get_int8;
+ return $class->error("Parse error: bit 7 not set!")
+ unless $tag & 0x80;
+ my $is_new = $tag & 0x40;
+ my($type, $len, $partial);
+ if ($is_new) {
+ $type = $tag & 0x3f;
+ ($len, $partial) = $class->_parse_new_len_header($buf);
+ }
+ else {
+ $type = ($tag>>2)&0xf;
+ my $lenbytes = (($tag&3)==3) ? 0 : (1<<($tag & 3));
+ $len = 0;
+ for (1..$lenbytes) {
+ $len <<= 8;
+ $len += $buf->get_int8;
+ }
+ }
+ ($type, $len, $partial, $buf->offset - $off_start);
+}
+
+sub _parse_new_len_header {
+ my $class = shift;
+ my($buf) = @_;
+ return unless $buf && $buf->offset < $buf->length;
+ my $lb1 = $buf->get_int8;
+ my($partial, $len);
+ if ($lb1 <= 191) {
+ $len = $lb1;
+ } elsif ($lb1 <= 223) {
+ $len = (($lb1-192) << 8) + $buf->get_int8 + 192;
+ } elsif ($lb1 < 255) {
+ $partial++;
+ $len = 1 << ($lb1 & 0x1f);
+ } else {
+ $len = $buf->get_int32;
+ }
+ ($len, $partial);
+}
+
+sub save {
+ my $class = shift;
+ my @objs = @_;
+ my $ser = '';
+ for my $obj (@objs) {
+ my $body = $obj->save;
+ my $len = length($body);
+ my $type = $obj->can('pkt_type') ? $obj->pkt_type :
+ $PACKET_TYPES_BY_CLASS{ref($obj)};
+ my $hdrlen = $obj->can('pkt_hdrlen') ? $obj->pkt_hdrlen : undef;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ if ($obj->{is_new} || $type > 15) {
+ my $tag = 0xc0 | ($type & 0x3f);
+ $buf->put_int8($tag);
+ return $class->error("Can't write partial length packets")
+ unless $len;
+ if ($len < 192) {
+ $buf->put_int8($len);
+ } elsif ($len < 8384) {
+ $len -= 192;
+ $buf->put_int8(int($len / 256) + 192);
+ $buf->put_int8($len % 256);
+ } else {
+ $buf->put_int8(0xff);
+ $buf->put_int32($len);
+ }
+ }
+ else {
+ unless ($hdrlen) {
+ if (!defined $len) {
+ $hdrlen = 0;
+ } elsif ($len < 256) {
+ $hdrlen = 1;
+ } elsif ($len < 65536) {
+ $hdrlen = 2;
+ } else {
+ $hdrlen = 4;
+ }
+ }
+ return $class->error("Packet overflow: overflow preset len")
+ if $hdrlen == 1 && $len > 255;
+ $hdrlen = 4 if $hdrlen == 2 && $len > 65535;
+ my $tag = 0x80 | ($type << 2);
+ if ($hdrlen == 0) {
+ $buf->put_int8($tag | 3);
+ } elsif ($hdrlen == 1) {
+ $buf->put_int8($tag);
+ $buf->put_int8($len);
+ } elsif ($hdrlen == 2) {
+ $buf->put_int8($tag | 1);
+ $buf->put_int16($len);
+ } else {
+ $buf->put_int8($tag | 2);
+ $buf->put_int32($len);
+ }
+ }
+ $buf->put_bytes($body);
+ $ser .= $buf->bytes;
+ }
+ $ser;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::PacketFactory - Parse and save PGP packet streams
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::PacketFactory;
+
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ while (my $packet = Crypt::OpenPGP::PacketFactory->parse($buf)) {
+ ## Do something with $packet
+ }
+
+ my @packets;
+ my $serialized = Crypt::OpenPGP::PacketFactory->save(@packets);
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::PacketFactory> parses PGP buffers (objects of type
+I<Crypt::OpenPGP::Buffer>) and generates packet objects of various
+packet classes (for example, I<Crypt::OpenPGP::Certificate> objects,
+I<Crypt::OpenPGP::Signature> objects, etc.). It also takes lists of
+packets, serializes each of them, and adds type/length headers to
+them, forming a stream of packets suitable for armouring, writing
+to disk, sending through email, etc.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::PacketFactory->parse($buffer [, $find ])
+
+Given a buffer object I<$buffer> of type I<Crypt::OpenPGP::Buffer>,
+iterates through the packets serialized in the buffer, parsing
+each one, and returning each packet one by one. In other words, given
+a buffer, it acts as a standard iterator.
+
+By default I<parse> parses and returns all packets in the buffer, of
+any packet type. If you are only looking for packets of a specific
+type, though, it makes no sense to return every packet; you can
+control which packets I<parse> parses and returns with I<$find>, which
+should be a reference to a list of packet types to find in the buffer.
+Only packets of those types will be parsed and returned to you. You
+can get the packet type constants from I<Crypt::OpenPGP::Constants>
+by importing the C<:packet> tag.
+
+Returns the next packet in the buffer until the end of the buffer
+is reached (or until there are no more of the packets which you wish
+to find), at which point returns a false value.
+
+=head2 Crypt::OpenPGP::PacketFactory->save(@packets)
+
+Given a list of packets I<@packets>, serializes each packet, then
+adds a type/length header on to each one, resulting in a string of
+octets representing the serialized packets, suitable for passing in
+to I<parse>, or for writing to disk, or anywhere else.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Plaintext.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Plaintext.pm
new file mode 100755
index 00000000000..892bf15679d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Plaintext.pm
@@ -0,0 +1,137 @@
+package Crypt::OpenPGP::Plaintext;
+use strict;
+
+use Crypt::OpenPGP::Buffer;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub new {
+ my $class = shift;
+ my $pt = bless { }, $class;
+ $pt->init(@_);
+}
+
+sub data { $_[0]->{data} }
+sub mode { $_[0]->{mode} }
+
+sub init {
+ my $pt = shift;
+ my %param = @_;
+ if (my $data = $param{Data}) {
+ $pt->{data} = $data;
+ $pt->{mode} = $param{Mode} || 'b';
+ $pt->{timestamp} = time;
+ $pt->{filename} = $param{Filename} || '';
+ }
+ $pt;
+}
+
+sub parse {
+ my $class = shift;
+ my($buf) = @_;
+ my $pt = $class->new;
+ $pt->{mode} = $buf->get_char;
+ $pt->{filename} = $buf->get_bytes($buf->get_int8);
+ $pt->{timestamp} = $buf->get_int32;
+ $pt->{data} = $buf->get_bytes( $buf->length - $buf->offset );
+ $pt;
+}
+
+sub save {
+ my $pt = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->put_char($pt->{mode});
+ $buf->put_int8(length $pt->{filename});
+ $buf->put_bytes($pt->{filename});
+ $buf->put_int32($pt->{timestamp});
+ $buf->put_bytes($pt->{data});
+ $buf->bytes;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Plaintext - A plaintext, literal-data packet
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::Plaintext;
+
+ my $data = 'foo bar';
+ my $file = 'foo.txt';
+
+ my $pt = Crypt::OpenPGP::Plaintext->new(
+ Data => $data,
+ Filename => $file,
+ );
+ my $serialized = $pt->save;
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Plaintext> implements plaintext literal-data packets,
+and is essentially just a container for a string of octets, along
+with some meta-data about the plaintext.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::Plaintext->new( %arg )
+
+Creates a new plaintext data packet object and returns that object.
+If there are no arguments in I<%arg>, the object is created with an
+empty data container; this is used, for example, in I<parse> (below),
+to create an empty packet which is then filled from the data in the
+buffer.
+
+If you wish to initialize a non-empty object, I<%arg> can contain:
+
+=over 4
+
+=item * Data
+
+A block of octets that make up the plaintext data.
+
+This argument is required (for a non-empty object).
+
+=item * Filename
+
+The name of the file that this data came from, or the name of a file
+where it should be saved upon extraction from the packet (after
+decryption, for example, if this packet is going to be encrypted).
+
+=item * Mode
+
+The mode in which the data is formatted. Valid values are C<t> and
+C<b>, meaning "text" and "binary", respectively.
+
+This argument is optional; I<Mode> defaults to C<b>.
+
+=back
+
+=head2 $pt->save
+
+Returns the serialized form of the plaintext object, which is the
+plaintext data, preceded by some meta-data describing the data.
+
+=head2 Crypt::OpenPGP::Plaintext->parse($buffer)
+
+Given I<$buffer>, a I<Crypt::OpenPGP::Buffer> object holding (or
+with offset pointing to) a plaintext data packet, returns a new
+I<Crypt::OpenPGP::Ciphertext> object, initialized with the data
+in the buffer.
+
+=head2 $pt->data
+
+Returns the plaintext data.
+
+=head2 $pt->mode
+
+Returns the mode of the packet (either C<t> or C<b>).
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/S2k.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/S2k.pm
new file mode 100755
index 00000000000..0ce398c24d1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/S2k.pm
@@ -0,0 +1,245 @@
+package Crypt::OpenPGP::S2k;
+use strict;
+
+use Crypt::OpenPGP::Buffer;
+use Crypt::OpenPGP::Digest;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+use vars qw( %TYPES );
+%TYPES = (
+ 0 => 'Simple',
+ 1 => 'Salted',
+ 3 => 'Salt_Iter',
+);
+
+sub new {
+ my $class = shift;
+ my $type = shift;
+ $type = $TYPES{ $type } || $type;
+ return $class->error("Invalid type of S2k") unless $type;
+ my $pkg = join '::', __PACKAGE__, $type;
+ my $s2k = bless { }, $pkg;
+ $s2k->init(@_);
+}
+
+sub parse {
+ my $class = shift;
+ my($buf) = @_;
+ my $id = $buf->get_int8;
+ my $type = $TYPES{$id};
+ $class->new($type, $buf);
+}
+
+sub init { $_[0] }
+sub generate {
+ my $s2k = shift;
+ my($passphrase, $keysize) = @_;
+ my($material, $pass) = ('', 0);
+ my $hash = $s2k->{hash};
+ while (length($material) < $keysize) {
+ my $pad = '' . chr(0) x $pass;
+ $material .= $s2k->s2k($passphrase, $pad);
+ $pass++;
+ }
+ substr($material, 0, $keysize);
+}
+sub set_hash {
+ my $s2k = shift;
+ my($hash_alg) = @_;
+ $s2k->{hash} = ref($hash_alg) ? $hash_alg :
+ Crypt::OpenPGP::Digest->new($hash_alg);
+}
+
+package Crypt::OpenPGP::S2k::Simple;
+use base qw( Crypt::OpenPGP::S2k );
+
+use Crypt::OpenPGP::Constants qw( DEFAULT_DIGEST );
+
+sub init {
+ my $s2k = shift;
+ my($buf) = @_;
+ if ($buf) {
+ $s2k->{hash_alg} = $buf->get_int8;
+ }
+ else {
+ $s2k->{hash_alg} = DEFAULT_DIGEST;
+ }
+ if ($s2k->{hash_alg}) {
+ $s2k->{hash} = Crypt::OpenPGP::Digest->new($s2k->{hash_alg});
+ }
+ $s2k;
+}
+
+sub s2k { $_[0]->{hash}->hash($_[2] . $_[1]) }
+
+sub save {
+ my $s2k = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->put_int8(1);
+ $buf->put_int8($s2k->{hash_alg});
+ $buf->bytes;
+}
+
+package Crypt::OpenPGP::S2k::Salted;
+use base qw( Crypt::OpenPGP::S2k );
+
+use Crypt::OpenPGP::Constants qw( DEFAULT_DIGEST );
+
+sub init {
+ my $s2k = shift;
+ my($buf) = @_;
+ if ($buf) {
+ $s2k->{hash_alg} = $buf->get_int8;
+ $s2k->{salt} = $buf->get_bytes(8);
+ }
+ else {
+ $s2k->{hash_alg} = DEFAULT_DIGEST;
+ require Crypt::Random;
+ $s2k->{salt} = Crypt::Random::makerandom_octet( Length => 8 );
+ }
+ if ($s2k->{hash_alg}) {
+ $s2k->{hash} = Crypt::OpenPGP::Digest->new($s2k->{hash_alg});
+ }
+ $s2k;
+}
+
+sub s2k { $_[0]->{hash}->hash($_[0]->{salt} . $_[2] . $_[1]) }
+
+sub save {
+ my $s2k = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->put_int8(2);
+ $buf->put_int8($s2k->{hash_alg});
+ $buf->put_bytes($s2k->{salt});
+ $buf->bytes;
+}
+
+package Crypt::OpenPGP::S2k::Salt_Iter;
+use base qw( Crypt::OpenPGP::S2k );
+
+use Crypt::OpenPGP::Constants qw( DEFAULT_DIGEST );
+
+sub init {
+ my $s2k = shift;
+ my($buf) = @_;
+ if ($buf) {
+ $s2k->{hash_alg} = $buf->get_int8;
+ $s2k->{salt} = $buf->get_bytes(8);
+ $s2k->{count} = $buf->get_int8;
+ }
+ else {
+ $s2k->{hash_alg} = DEFAULT_DIGEST;
+ require Crypt::Random;
+ $s2k->{salt} = Crypt::Random::makerandom_octet( Length => 8 );
+ $s2k->{count} = 96;
+ }
+ if ($s2k->{hash_alg}) {
+ $s2k->{hash} = Crypt::OpenPGP::Digest->new($s2k->{hash_alg});
+ }
+ $s2k;
+}
+
+sub s2k {
+ my $s2k = shift;
+ my($pass, $pad) = @_;
+ my $salt = $s2k->{salt};
+ my $count = (16 + ($s2k->{count} & 15)) << (($s2k->{count} >> 4) + 6);
+ my $len = length($pass) + 8;
+ if ($count < $len) {
+ $count = $len;
+ }
+ my $res = $pad;
+ while ($count > $len) {
+ $res .= $salt . $pass;
+ $count -= $len;
+ }
+ if ($count < 8) {
+ $res .= substr($salt, 0, $count);
+ } else {
+ $res .= $salt;
+ $count -= 8;
+ $res .= substr($pass, 0, $count);
+ }
+ $s2k->{hash}->hash($res);
+}
+
+sub save {
+ my $s2k = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->put_int8(3);
+ $buf->put_int8($s2k->{hash_alg});
+ $buf->put_bytes($s2k->{salt});
+ $buf->put_int8($s2k->{count});
+ $buf->bytes;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::S2k - String-to-key generation
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::S2k;
+
+ # S2k generates an encryption key from a passphrase; in order to
+ # understand how large of a key to generate, we need to know which
+ # cipher we're using, and what the passphrase is.
+ my $cipher = Crypt::OpenPGP::Cipher->new( '...' );
+ my $passphrase = 'foo';
+
+ my $s2k = Crypt::OpenPGP::S2k->new( 'Salt_Iter' );
+ my $key = $s2k->generate( $passphrase, $cipher->keysize );
+
+ my $serialized = $s2k->save;
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::S2k> implements string-to-key generation for use in
+generating symmetric cipher keys from standard, arbitrary-length
+passphrases (like those used to lock secret key files). Since a
+passphrase can be of any length, and key material must be a very
+specific length, a method is needed to translate the passphrase into
+the key. The OpenPGP RFC defines three such methods, each of which
+this class implements.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::S2k->new($type)
+
+Creates a new type of S2k-generator of type I<$type>; valid values for
+I<$type> are C<Simple>, C<Salted>, and C<Salt_Iter>. These generator
+types are described in the OpenPGP RFC section 3.6.
+
+Returns the new S2k-generator object.
+
+=head2 Crypt::OpenPGP::S2k->parse($buffer)
+
+Given a buffer I<$buffer> of type I<Crypt::OpenPGP::Buffer>, determines
+the type of S2k from the first octet in the buffer (one of the types
+listed above in I<new>), then creates a new object of that type and
+initializes the S2k state from the buffer I<$buffer>. Different
+initializations occur based on the type of S2k.
+
+Returns the new S2k-generator object.
+
+=head2 $s2k->save
+
+Serializes the S2k object and returns the serialized form; this form
+will differ based on the type of S2k.
+
+=head2 $s2k->generate($passphrase, $keysize)
+
+Given a passphrase I<$passphrase>, which should be a string of octets
+of arbitrary length, and a keysize I<$keysize>, generates enough key
+material to meet the size I<$keysize>, and returns that key material.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/SKSessionKey.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/SKSessionKey.pm
new file mode 100755
index 00000000000..ec1e61ac536
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/SKSessionKey.pm
@@ -0,0 +1,195 @@
+package Crypt::OpenPGP::SKSessionKey;
+use strict;
+
+use Crypt::OpenPGP::Constants qw( DEFAULT_CIPHER );
+use Crypt::OpenPGP::Buffer;
+use Crypt::OpenPGP::S2k;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub new {
+ my $class = shift;
+ my $key = bless { }, $class;
+ $key->init(@_);
+}
+
+sub init {
+ my $key = shift;
+ my %param = @_;
+ $key->{version} = 4;
+ if ((my $sym_key = $param{SymKey}) && (my $pass = $param{Passphrase})) {
+ my $alg = $param{Cipher} || DEFAULT_CIPHER;
+ my $cipher = Crypt::OpenPGP::Cipher->new($alg);
+ my $keysize = $cipher->keysize;
+ $key->{s2k_ciph} = $cipher->alg_id;
+ $key->{s2k} = $param{S2k} || Crypt::OpenPGP::S2k->new('Salt_Iter');
+ $sym_key = substr $sym_key, 0, $keysize;
+ my $s2k_key = $key->{s2k}->generate($pass, $keysize);
+ $cipher->init($s2k_key);
+ }
+ $key;
+}
+
+sub parse {
+ my $class = shift;
+ my($buf) = @_;
+ my $key = $class->new;
+ $key->{version} = $buf->get_int8;
+ return $class->error("Unsupported version ($key->{version})")
+ unless $key->{version} == 4;
+ $key->{s2k_ciph} = $buf->get_int8;
+ $key->{s2k} = Crypt::OpenPGP::S2k->parse($buf);
+ if ($buf->offset < $buf->length) {
+ $key->{encrypted} = $buf->get_bytes( $buf->length - $buf->offset );
+ }
+ $key;
+}
+
+sub save {
+ my $key = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->put_int8($key->{version});
+ $buf->put_int8($key->{s2k_ciph});
+ $buf->put_bytes( $key->{s2k}->save );
+ $buf->bytes;
+}
+
+sub decrypt {
+ my $key = shift;
+ my($passphrase) = @_;
+ my $cipher = Crypt::OpenPGP::Cipher->new($key->{s2k_ciph});
+ my $keysize = $cipher->keysize;
+ my $s2k_key = $key->{s2k}->generate($passphrase, $keysize);
+ my($sym_key, $alg);
+ if ($key->{encrypted}) {
+ $cipher->init($s2k_key);
+ $sym_key = $cipher->decrypt($key->{encrypted});
+ $alg = ord substr $sym_key, 0, 1, '';
+ } else {
+ $sym_key = $s2k_key;
+ $alg = $cipher->alg_id;
+ }
+ ($sym_key, $alg);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::SKSessionKey - Symmetric-Key Encrypted Session Key
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::SKSessionKey;
+
+ my $passphrase = 'foobar'; # Not a very good passphrase
+ my $key_data = 'f' x 64; # Not a very good key
+
+ my $skey = Crypt::OpenPGP::SKSessionKey->new(
+ Passphrase => $passphrase,
+ SymKey => $key_data,
+ );
+ my $serialized = $skey->save;
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::SKSessionKey> implements symmetric-key encrypted
+session key packets; these packets store symmetric-key-encrypted key data
+that, when decrypted using the proper passphrase, can be used to decrypt a
+block of ciphertext--that is, a I<Crypt::OpenPGP::Ciphertext> object.
+
+Symmetric-key encrypted session key packets can work in two different
+ways: in one scenario the passphrase you provide is used to encrypt
+a randomly chosen string of key material; the key material is the key
+that is actually used to encrypt the data packet, and the passphrase
+just serves to encrypt the key material. This encrypted key material
+is then serialized into the symmetric-key encrypted session key packet.
+
+The other method of using this encryption form is to use the passphrase
+directly to encrypt the data packet. In this scenario the need for any
+additional key material goes away, because all the receiver needs is
+the same passphrase that you have entered to encrypt the data.
+
+At the moment I<Crypt::OpenPGP> really only supports the first
+scenario; note also that the interface to I<new> may change in the
+future when support for the second scenario is added.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::SKSessionKey->new( %arg )
+
+Creates a new encrypted session key packet object and returns that
+object. If there are no arguments in I<%arg>, the object is created
+empty; this is used, for example in I<parse> (below), to create an
+empty packet which is then filled from the data in the buffer.
+
+If you wish to initialize a non-empty object, I<%arg> can contain:
+
+=over 4
+
+=item * Passphrase
+
+An arbitrary-length passphrase; that is, a string of octets. The
+passphrase is used to encrypt the actual session key such that it can
+only be decrypted by supplying the correct passphrase.
+
+This argument is required (for a non-empty object).
+
+=item * SymKey
+
+The symmetric cipher key: a string of octets that make up the key data
+of the symmetric cipher key. This should be at least long enough for
+the key length of your chosen cipher (see I<Cipher>, below), or, if
+you have not specified a cipher, at least 64 bytes (to allow for long
+cipher key sizes).
+
+This argument is required (for a non-empty object).
+
+=item * S2k
+
+An object of type I<Crypt::OpenPGP::S2k> (or rather, of one of its
+subclasses). If you use the passphrase directly to encrypt the data
+packet (scenario one, above), you will probably be generating the
+key material outside of this class, meaning that you will need to pass
+in the I<S2k> object that was used to generate that key material from
+the passphrase. This is the way to do that.
+
+=item * Cipher
+
+The name (or ID) of a supported PGP cipher. See I<Crypt::OpenPGP::Cipher>
+for a list of valid cipher names.
+
+This argument is optional; by default I<Crypt::OpenPGP::Cipher> will
+use C<DES3>.
+
+=back
+
+=head2 $skey->save
+
+Serializes the session key packet and returns the string of octets.
+
+=head2 Crypt::OpenPGP::SKSessionKey->parse($buffer)
+
+Given I<$buffer>, a I<Crypt::OpenPGP::Buffer> object holding (or
+with offset pointing to) an encrypted session key packet, returns
+a new I<Crypt::OpenPGP::Ciphertext> object, initialized with the
+data in the buffer.
+
+=head2 $skey->decrypt($passphrase)
+
+Given a passphrase I<$passphrase>, decrypts the encrypted session key
+data. The key data includes the symmetric key itself, along with a
+one-octet ID of the symmetric cipher used to encrypt the message.
+
+Returns a list containing two items: the symmetric key and the cipher
+algorithm ID. These are suitable for passing off to the I<decrypt>
+method of a I<Crypt::OpenPGP::Ciphertext> object to decrypt a block
+of encrypted data.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/SessionKey.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/SessionKey.pm
new file mode 100755
index 00000000000..8ebb112a4c3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/SessionKey.pm
@@ -0,0 +1,221 @@
+package Crypt::OpenPGP::SessionKey;
+use strict;
+
+use Crypt::OpenPGP::Constants qw( DEFAULT_CIPHER );
+use Crypt::OpenPGP::Key::Public;
+use Crypt::OpenPGP::Util qw( mp2bin bin2mp bitsize );
+use Crypt::OpenPGP::Buffer;
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub key_id { $_[0]->{key_id} }
+
+sub new {
+ my $class = shift;
+ my $key = bless { }, $class;
+ $key->init(@_);
+}
+
+sub init {
+ my $key = shift;
+ my %param = @_;
+ $key->{version} = 3;
+ if ((my $cert = $param{Key}) && (my $sym_key = $param{SymKey})) {
+ my $alg = $param{Cipher} || DEFAULT_CIPHER;
+ my $keysize = Crypt::OpenPGP::Cipher->new($alg)->keysize;
+ $sym_key = substr $sym_key, 0, $keysize;
+ my $pk = $cert->key->public_key;
+ my $enc = $key->_encode($sym_key, $alg, $pk->bytesize) or
+ return (ref $key)->error("Encoding symkey failed: " . $key->errstr);
+ $key->{key_id} = $cert->key_id;
+ $key->{C} = $pk->encrypt($enc) or
+ return (ref $key)->error("Encryption failed: " . $pk->errstr);
+ $key->{pk_alg} = $pk->alg_id;
+ }
+ $key;
+}
+
+sub parse {
+ my $class = shift;
+ my($buf) = @_;
+ my $key = $class->new;
+ $key->{version} = $buf->get_int8;
+ return $class->error("Unsupported version ($key->{version})")
+ unless $key->{version} == 2 || $key->{version} == 3;
+ $key->{key_id} = $buf->get_bytes(8);
+ $key->{pk_alg} = $buf->get_int8;
+ my $pk = Crypt::OpenPGP::Key::Public->new($key->{pk_alg});
+ my @props = $pk->crypt_props;
+ for my $e (@props) {
+ $key->{C}{$e} = $buf->get_mp_int;
+ }
+ $key;
+}
+
+sub save {
+ my $key = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->put_int8($key->{version});
+ $buf->put_bytes($key->{key_id}, 8);
+ $buf->put_int8($key->{pk_alg});
+ my $c = $key->{C};
+ for my $mp (values %$c) {
+ $buf->put_mp_int($mp);
+ }
+ $buf->bytes;
+}
+
+sub display {
+ my $key = shift;
+ my $str = sprintf ":pubkey enc packet: version %d, algo %d, keyid %s\n",
+ $key->{version}, $key->{pk_alg}, uc unpack('H*', $key->{key_id});
+ for my $mp (values %{ $key->{C} }) {
+ $str .= sprintf " data: [%d bits]\n", bitsize($mp);
+ }
+ $str;
+}
+
+sub decrypt {
+ my $key = shift;
+ my($sk) = @_;
+ return $key->error("Invalid secret key ID")
+ unless $key->key_id eq $sk->key_id;
+ my($sym_key, $alg) = __PACKAGE__->_decode($sk->key->decrypt($key->{C}))
+ or return $key->error("Session key decryption failed: " .
+ __PACKAGE__->errstr);
+ ($sym_key, $alg);
+}
+
+sub _encode {
+ my $class = shift;
+ require Crypt::Random;
+ my($sym_key, $sym_alg, $size) = @_;
+ my $padlen = $size - length($sym_key) - 2 - 2 - 2;
+ my $pad = Crypt::Random::makerandom_octet( Length => $padlen,
+ Skip => chr(0) );
+ bin2mp(pack 'na*na*n', 2, $pad, $sym_alg, $sym_key,
+ unpack('%16C*', $sym_key));
+}
+
+sub _decode {
+ my $class = shift;
+ my($n) = @_;
+ my $ser = mp2bin($n);
+ return $class->error("Encoded data must start with 2")
+ unless unpack('C', $ser) == 2;
+ my $csum = unpack 'n', substr $ser, -2, 2, '';
+ my($pad, $sym_key) = split /\0/, $ser, 2;
+ my $sym_alg = ord substr $sym_key, 0, 1, '';
+ return $class->error("Encoded data has bad checksum")
+ unless unpack('%16C*', $sym_key) == $csum;
+ ($sym_key, $sym_alg);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::SessionKey - Encrypted Session Key
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::SessionKey;
+
+ my $public_key = Crypt::OpenPGP::Key::Public->new( 'RSA' );
+ my $key_data = 'f' x 64; ## Not a very good key :)
+
+ my $skey = Crypt::OpenPGP::SessionKey->new(
+ Key => $public_key,
+ SymKey => $key_data,
+ );
+ my $serialized = $skey->save;
+
+ my $secret_key = Crypt::OpenPGP::Key::Secret->new( 'RSA' );
+ ( $key_data, my( $alg ) ) = $skey->decrypt( $secret_key );
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::SessionKey> implements encrypted session key packets;
+these packets store public-key-encrypted key data that, when decrypted
+using the corresponding secret key, can be used to decrypt a block of
+ciphertext--that is, a I<Crypt::OpenPGP::Ciphertext> object.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::SessionKey->new( %arg )
+
+Creates a new encrypted session key packet object and returns that
+object. If there are no arguments in I<%arg>, the object is created
+empty; this is used, for example in I<parse> (below), to create an
+empty packet which is then filled from the data in the buffer.
+
+If you wish to initialize a non-empty object, I<%arg> can contain:
+
+=over 4
+
+=item * Key
+
+A public key object; in other words, an object of a subclass of
+I<Crypt::OpenPGP::Key::Private>. The public key is used to encrypt the
+encoded session key such that it can only be decrypted by the secret
+portion of the key.
+
+This argument is required (for a non-empty object).
+
+=item * SymKey
+
+The symmetric cipher key: a string of octets that make up the key data
+of the symmetric cipher key. This should be at least long enough for
+the key length of your chosen cipher (see I<Cipher>, below), or, if
+you have not specified a cipher, at least 64 bytes (to allow for long
+cipher key sizes).
+
+This argument is required (for a non-empty object).
+
+=item * Cipher
+
+The name (or ID) of a supported PGP cipher. See I<Crypt::OpenPGP::Cipher>
+for a list of valid cipher names.
+
+This argument is optional; by default I<Crypt::OpenPGP::Cipher> will
+use C<DES3>.
+
+=back
+
+=head2 $skey->save
+
+Serializes the session key packet and returns the string of octets.
+
+=head2 Crypt::OpenPGP::SessionKey->parse($buffer)
+
+Given I<$buffer>, a I<Crypt::OpenPGP::Buffer> object holding (or
+with offset pointing to) an encrypted session key packet, returns
+a new I<Crypt::OpenPGP::Ciphertext> object, initialized with the
+data in the buffer.
+
+=head2 $skey->decrypt($secret_key)
+
+Given a secret key object I<$secret_key> (an object of a subclass of
+I<Crypt::OpenPGP::Key::Public>), decrypts and decodes the encrypted
+session key data. The key data includes the symmetric key itself,
+along with a one-octet ID of the symmetric cipher used to encrypt
+the message.
+
+Returns a list containing two items: the symmetric key and the cipher
+algorithm ID. These are suitable for passing off to the I<decrypt>
+method of a I<Crypt::OpenPGP::Ciphertext> object to decrypt a block
+of encrypted data.
+
+=head2 $skey->key_id
+
+Returns the key ID of the public key used to encrypt the session key;
+this is necessary for finding the appropriate secret key to decrypt
+the key.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Signature.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Signature.pm
new file mode 100755
index 00000000000..7fe236cc5ee
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Signature.pm
@@ -0,0 +1,423 @@
+package Crypt::OpenPGP::Signature;
+use strict;
+
+use Crypt::OpenPGP::Digest;
+use Crypt::OpenPGP::Signature::SubPacket;
+use Crypt::OpenPGP::Key::Public;
+use Crypt::OpenPGP::Constants qw( DEFAULT_DIGEST );
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub pkt_hdrlen { 2 }
+
+sub key_id {
+ my $sig = shift;
+ unless ($sig->{key_id}) {
+ my $sp = $sig->find_subpacket(16);
+ $sig->{key_id} = $sp->{data};
+ }
+ $sig->{key_id};
+}
+
+sub timestamp {
+ my $sig = shift;
+ $sig->{version} < 4 ?
+ $sig->{timestamp} :
+ $sig->find_subpacket(2)->{data};
+}
+
+sub digest {
+ my $sig = shift;
+ Crypt::OpenPGP::Digest->new($sig->{hash_alg});
+}
+
+sub find_subpacket {
+ my $sig = shift;
+ my($type) = @_;
+ my @sp = (@{$sig->{subpackets_hashed}}, @{$sig->{subpackets_unhashed}});
+ for my $sp (@sp) {
+ return $sp if $sp->{type} == $type;
+ }
+}
+
+sub new {
+ my $class = shift;
+ my $sig = bless { }, $class;
+ $sig->init(@_);
+}
+
+sub init {
+ my $sig = shift;
+ my %param = @_;
+ $sig->{subpackets_hashed} = [];
+ $sig->{subpackets_unhashed} = [];
+ if ((my $obj = $param{Data}) && (my $cert = $param{Key})) {
+ $sig->{version} = $param{Version} || 4;
+ $sig->{type} = $param{Type} || 0x00;
+ $sig->{hash_alg} = $param{Digest} ? $param{Digest} :
+ $sig->{version} == 4 ? DEFAULT_DIGEST : 1;
+ $sig->{pk_alg} = $cert->key->alg_id;
+ if ($sig->{version} < 4) {
+ $sig->{timestamp} = time;
+ $sig->{key_id} = $cert->key_id;
+ $sig->{hash_len} = 5;
+ }
+ else {
+ my $sp = Crypt::OpenPGP::Signature::SubPacket->new;
+ $sp->{type} = 2;
+ $sp->{data} = time;
+ push @{ $sig->{subpackets_hashed} }, $sp;
+ $sp = Crypt::OpenPGP::Signature::SubPacket->new;
+ $sp->{type} = 16;
+ $sp->{data} = $cert->key_id;
+ push @{ $sig->{subpackets_unhashed} }, $sp;
+ }
+ my $hash = $sig->hash_data(ref($obj) eq 'ARRAY' ? @$obj : $obj);
+ $sig->{chk} = substr $hash, 0, 2;
+ my $sig_data = $cert->key->sign($hash,
+ Crypt::OpenPGP::Digest->alg($sig->{hash_alg}));
+ my @sig = $cert->key->sig_props;
+ for my $e (@sig) {
+ $sig->{$e} = $sig_data->{$e};
+ }
+ }
+ $sig;
+}
+
+sub sig_trailer {
+ my $sig = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ if ($sig->{version} < 4) {
+ $buf->put_int8($sig->{type});
+ $buf->put_int32($sig->{timestamp});
+ }
+ else {
+ $buf->put_int8($sig->{version});
+ $buf->put_int8($sig->{type});
+ $buf->put_int8($sig->{pk_alg});
+ $buf->put_int8($sig->{hash_alg});
+ my $sp_data = $sig->_save_subpackets('hashed');
+ $buf->put_int16(defined $sp_data ? length($sp_data) : 0);
+ $buf->put_bytes($sp_data) if $sp_data;
+ my $len = $buf->length;
+ $buf->put_int8($sig->{version});
+ $buf->put_int8(0xff);
+ $buf->put_int32($len);
+ }
+ $buf->bytes;
+}
+
+sub parse {
+ my $class = shift;
+ my($buf) = @_;
+ my $sig = $class->new;
+
+ $sig->{version} = $buf->get_int8;
+ if ($sig->{version} < 4) {
+ $sig->{sig_data} = $buf->bytes($buf->offset+1, 5);
+ $sig->{hash_len} = $buf->get_int8;
+ return $class->error("Hash len $sig->{hash_len} != 5")
+ unless $sig->{hash_len} == 5;
+ $sig->{type} = $buf->get_int8;
+ $sig->{timestamp} = $buf->get_int32;
+ $sig->{key_id} = $buf->get_bytes(8);
+ $sig->{pk_alg} = $buf->get_int8;
+ $sig->{hash_alg} = $buf->get_int8;
+ }
+ else {
+ $sig->{sig_data} = $buf->bytes($buf->offset-1, 6);
+ $sig->{type} = $buf->get_int8;
+ $sig->{pk_alg} = $buf->get_int8;
+ $sig->{hash_alg} = $buf->get_int8;
+ for my $h (qw( hashed unhashed )) {
+ my $subpack_len = $buf->get_int16;
+ my $sp_buf = $buf->extract($subpack_len);
+ $sig->{sig_data} .= $sp_buf->bytes if $h eq 'hashed';
+ while ($sp_buf->offset < $sp_buf->length) {
+ my $len = $sp_buf->get_int8;
+ if ($len >= 192 && $len < 255) {
+ my $len2 = $sp_buf->get_int8;
+ $len = (($len-192) << 8) + $len2 + 192;
+ } elsif ($len == 255) {
+ $len = $sp_buf->get_int32;
+ }
+ my $this_buf = $sp_buf->extract($len);
+ my $sp = Crypt::OpenPGP::Signature::SubPacket->parse($this_buf);
+ push @{ $sig->{"subpackets_$h"} }, $sp;
+ }
+ }
+ }
+ $sig->{chk} = $buf->get_bytes(2);
+ ## XXX should be Crypt::OpenPGP::Signature->new($sig->{pk_alg})?
+ my $key = Crypt::OpenPGP::Key::Public->new($sig->{pk_alg})
+ or return $class->error(Crypt::OpenPGP::Key::Public->errstr);
+ my @sig = $key->sig_props;
+ for my $e (@sig) {
+ $sig->{$e} = $buf->get_mp_int;
+ }
+ $sig;
+}
+
+sub save {
+ my $sig = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ $buf->put_int8($sig->{version});
+ if ($sig->{version} < 4) {
+ $buf->put_int8($sig->{hash_len});
+ $buf->put_int8($sig->{type});
+ $buf->put_int32($sig->{timestamp});
+ $buf->put_bytes($sig->{key_id}, 8);
+ $buf->put_int8($sig->{pk_alg});
+ $buf->put_int8($sig->{hash_alg});
+ }
+ else {
+ $buf->put_int8($sig->{type});
+ $buf->put_int8($sig->{pk_alg});
+ $buf->put_int8($sig->{hash_alg});
+ for my $h (qw( hashed unhashed )) {
+ my $sp_data = $sig->_save_subpackets($h);
+ $buf->put_int16(defined $sp_data ? length($sp_data) : 0);
+ $buf->put_bytes($sp_data) if $sp_data;
+ }
+ }
+ $buf->put_bytes($sig->{chk}, 2);
+ ## XXX should be Crypt::OpenPGP::Signature->new($sig->{pk_alg})?
+ my $key = Crypt::OpenPGP::Key::Public->new($sig->{pk_alg});
+ my @sig = $key->sig_props;
+ for my $e (@sig) {
+ $buf->put_mp_int($sig->{$e});
+ }
+ $buf->bytes;
+}
+
+sub _save_subpackets {
+ my $sig = shift;
+ my($h) = @_;
+ my @sp;
+ return unless $sig->{"subpackets_$h"} &&
+ (@sp = @{ $sig->{"subpackets_$h"} });
+ my $sp_buf = Crypt::OpenPGP::Buffer->new;
+ for my $sp (@sp) {
+ my $data = $sp->save;
+ my $len = length $data;
+ if ($len < 192) {
+ $sp_buf->put_int8($len);
+ } elsif ($len < 8384) {
+ $len -= 192;
+ $sp_buf->put_int8( int($len / 256) + 192 );
+ $sp_buf->put_int8( $len % 256 );
+ } else {
+ $sp_buf->put_int8(255);
+ $sp_buf->put_int32($len);
+ }
+ $sp_buf->put_bytes($data);
+ }
+ $sp_buf->bytes;
+}
+
+sub hash_data {
+ my $sig = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ my $type = ref($_[0]);
+ if ($type eq 'Crypt::OpenPGP::Certificate') {
+ my $cert = shift;
+ $buf->put_int8(0x99);
+ my $pk = $cert->public_cert->save;
+ $buf->put_int16(length $pk);
+ $buf->put_bytes($pk);
+
+ if (@_) {
+ if (ref($_[0]) eq 'Crypt::OpenPGP::UserID') {
+ my $uid = shift;
+ my $ud = $uid->save;
+ if ($sig->{version} >= 4) {
+ $buf->put_int8(0xb4);
+ $buf->put_int32(length $ud);
+ }
+ $buf->put_bytes($ud);
+ }
+ elsif (ref($_[0]) eq 'Crypt::OpenPGP::Certificate') {
+ my $subcert = shift;
+ $buf->put_int8(0x99);
+ my $k = $subcert->public_cert->save;
+ $buf->put_int16(length $k);
+ $buf->put_bytes($k);
+ }
+ }
+ }
+ elsif ($type eq 'Crypt::OpenPGP::Plaintext') {
+ my $pt = shift;
+ my $data = $pt->data;
+ if ($pt->mode eq 't') {
+ require Crypt::OpenPGP::Util;
+ $buf->put_bytes(Crypt::OpenPGP::Util::canonical_text($data));
+ }
+ else {
+ $buf->put_bytes($data);
+ }
+ }
+
+ $buf->put_bytes($sig->sig_trailer);
+
+ my $hash = Crypt::OpenPGP::Digest->new($sig->{hash_alg}) or
+ return $sig->error( Crypt::OpenPGP::Digest->errstr );
+ $hash->hash($buf->bytes);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Signature - Signature packet
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::Signature;
+
+ my $cert = Crypt::OpenPGP::Certificate->new;
+ my $plaintext = 'foo bar';
+
+ my $sig = Crypt::OpenPGP::Signature->new(
+ Key => $cert,
+ Data => $plaintext,
+ );
+ my $serialized = $sig->save;
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Signature> implements PGP signature packets and
+provides functionality for hashing PGP packets to obtain message
+digests; these digests are then signed by the secret key to form a
+signature.
+
+I<Crypt::OpenPGP::Signature> reads and writes both version 3 and version
+4 signatures, along with the signature subpackets found in version 4
+(see I<Crypt::OpenPGP::Signature::SubPacket>).
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::Signature->new( %arg )
+
+Creates a new signature packet object and returns that object. If
+there are no arguments in I<%arg>, the object is created empty; this is
+used, for example, in I<parse> (below), to create an empty packet which is
+then filled from the data in the buffer.
+
+If you wish to initialize a non-empty object, I<%arg> can contain:
+
+=over 4
+
+=item * Data
+
+A PGP packet object of some kind. Currently the two supported objects
+are I<Crypt::OpenPGP::Certificate> objects, to create self-signatures
+for keyrings, and I<Crypt::OpenPGP::Plaintext> objects, for signatures
+on blocks of data.
+
+This argument is required (for a non-empty packet).
+
+=item * Key
+
+A secret-key certificate that can be used to sign the data. In other
+words an object of type I<Crypt::OpenPGP::Certificate> that holds
+a secret key.
+
+This argument is required.
+
+=item * Version
+
+The packet format version of the signature. Valid values are either
+C<3> or C<4>; version C<4> signatures are the default, but will be
+incompatible with older PGP implementations; for example, PGP2 will
+only read version 3 signatures; PGP5 can read version 4 signatures,
+but only on signatures of data packets (not on key signatures).
+
+This argument is optional; the default is version 4.
+
+=item * Type
+
+Specifies the type of signature (data, key, etc.). Valid values can
+be found in the OpenPGP RFC, section 5.2.1.
+
+This argument is optional; the default is C<0x00>, signature of a
+binary document.
+
+=item * Digest
+
+The digest algorithm to use when generating the digest of the data
+to be signed. See the documentation for I<Crypt::OpenPGP::Digest>
+for a list of valid values.
+
+This argument is optional; the default is C<SHA1>.
+
+=back
+
+=head2 $sig->save
+
+Serializes the signature packet and returns a string of octets.
+
+=head2 Crypt::OpenPGP::Signature->parse($buffer)
+
+Given I<$buffer>, a I<Crypt::OpenPGP::Buffer> object holding (or
+with offset pointing to) a signature packet, returns a new
+I<Crypt::OpenPGP::Signature> object, initialized with the signature
+data in the buffer.
+
+=head2 $sig->hash_data(@data)
+
+Prepares a digital hash of the packets in I<@data>; the hashing method
+depends on the type of packets in I<@data>, and the hashing algorithm used
+depends on the algorithm associated with the I<Crypt::OpenPGP::Signature>
+object I<$sig>. This digital hash is then signed to produce the signature
+itself.
+
+You generally do not need to use this method unless you have not passed in
+the I<Data> parameter to I<new> (above).
+
+There are two possible packet types that can be included in I<@data>:
+
+=over 4
+
+=item * Key Certificate and User ID
+
+An OpenPGP keyblock contains a key certificate and a signature of the
+public key and user ID made by the secret key. This is called a
+self-signature. To produce a self-signature, I<@data> should contain two
+packet objects: a I<Crypt::OpenPGP::Certificate> object and a
+I<Crypt::OpenPGP::UserID> object. For example:
+
+ my $hash = $sig->hash_data($cert, $id)
+ or die $sig->errstr;
+
+=item * Plaintext
+
+To sign a piece of plaintext, pass in a I<Crypt::OpenPGP::Plaintext> object.
+This is a standard OpenPGP signature.
+
+ my $pt = Crypt::OpenPGP::Plaintext->new( Data => 'foo bar' );
+ my $hash = $sig->hash_data($pt)
+ or die $sig->errstr;
+
+=back
+
+=head2 $sig->key_id
+
+Returns the ID of the key that created the signature.
+
+=head2 $sig->timestamp
+
+Returns the time that the signature was created in Unix epoch time (seconds
+since 1970).
+
+=head2 $sig->digest
+
+Returns a Crypt::OpenPGP::Digest object representing the digest algorithm
+used by the signature.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Signature/SubPacket.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Signature/SubPacket.pm
new file mode 100755
index 00000000000..9e6139238f4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Signature/SubPacket.pm
@@ -0,0 +1,140 @@
+package Crypt::OpenPGP::Signature::SubPacket;
+use strict;
+
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+use vars qw( %SUBPACKET_TYPES );
+%SUBPACKET_TYPES = (
+ 2 => { name => 'Signature creation time',
+ r => sub { $_[0]->get_int32 },
+ w => sub { $_[0]->put_int32($_[1]) } },
+
+ 3 => { name => 'Signature expiration time',
+ r => sub { $_[0]->get_int32 },
+ w => sub { $_[0]->put_int32($_[1]) } },
+
+ 4 => { name => 'Exportable certification',
+ r => sub { $_[0]->get_int8 },
+ w => sub { $_[0]->put_int8($_[1]) } },
+
+ 5 => { name => 'Trust signature',
+ r => sub { $_[0]->get_int8 },
+ w => sub { $_[0]->put_int8($_[1]) } },
+
+ 6 => { name => 'Regular expression',
+ r => sub { $_[0]->bytes },
+ w => sub { $_[0]->append($_[1]) } },
+
+ 7 => { name => 'Revocable',
+ r => sub { $_[0]->get_int8 },
+ w => sub { $_[0]->put_int8($_[1]) } },
+
+ 9 => { name => 'Key expiration time',
+ r => sub { $_[0]->get_int32 },
+ w => sub { $_[0]->put_int32($_[1]) } },
+
+ 10 => { name => '(Unsupported placeholder',
+ r => sub { },
+ w => sub { } },
+
+ 11 => { name => 'Preferred symmetric algorithms',
+ r => sub { [ unpack 'C*', $_[0]->bytes ] },
+ w => sub { $_[0]->append(pack 'C*', @{ $_[1] }) } },
+
+ 12 => { name => 'Revocation key',
+ r => sub {
+ { class => $_[0]->get_int8,
+ alg_id => $_[0]->get_int8,
+ fingerprint => $_[0]->get_bytes(20) } },
+ w => sub {
+ $_[0]->put_int8($_[1]->{class});
+ $_[0]->put_int8($_[1]->{alg_id});
+ $_[0]->put_bytes($_[1]->{fingerprint}, 20) } },
+
+ 16 => { name => 'Issuer key ID',
+ r => sub { $_[0]->get_bytes(8) },
+ w => sub { $_[0]->put_bytes($_[1], 8) } },
+
+ 20 => { name => 'Notation data',
+ r => sub {
+ { flags => $_[0]->get_int32,
+ name => $_[0]->get_bytes($_[0]->get_int16),
+ value => $_[0]->get_bytes($_[0]->get_int16) } },
+ w => sub {
+ $_[0]->put_int32($_[1]->{flags});
+ $_[0]->put_int16(length $_[1]->{name});
+ $_[0]->put_bytes($_[1]->{name});
+ $_[0]->put_int16(length $_[1]->{value});
+ $_[0]->put_bytes($_[1]->{value}) } },
+
+ 21 => { name => 'Preferred hash algorithms',
+ r => sub { [ unpack 'C', $_[0]->bytes ] },
+ w => sub { $_[0]->put_bytes(pack 'C*', @{ $_[1] }) } },
+
+ 22 => { name => 'Preferred compression algorithms',
+ r => sub { [ unpack 'C', $_[0]->bytes ] },
+ w => sub { $_[0]->put_bytes(pack 'C*', @{ $_[1] }) } },
+
+ 23 => { name => 'Key server preferences',
+ r => sub { $_[0]->bytes },
+ w => sub { $_[0]->append($_[1]) } },
+
+ 24 => { name => 'Preferred key server',
+ r => sub { $_[0]->bytes },
+ w => sub { $_[0]->append($_[1]) } },
+
+ 25 => { name => 'Primary user ID',
+ r => sub { $_[0]->get_int8 },
+ w => sub { $_[0]->put_int8($_[1]) } },
+
+ 26 => { name => 'Policy URL',
+ r => sub { $_[0]->bytes },
+ w => sub { $_[0]->append($_[1]) } },
+
+ 27 => { name => 'Key flags',
+ r => sub { $_[0]->bytes },
+ w => sub { $_[0]->append($_[1]) } },
+
+ 28 => { name => 'Signer\'s user ID',
+ r => sub { $_[0]->bytes },
+ w => sub { $_[0]->append($_[1]) } },
+
+ 29 => { name => 'Reason for revocation',
+ r => sub {
+ { code => $_[0]->get_int8,
+ reason => $_[0]->get_bytes($_[0]->length -
+ $_[0]->offset) } },
+ w => sub {
+ $_[0]->put_int8($_[1]->{code});
+ $_[0]->put_bytes($_[1]->{reason}) } },
+);
+
+sub new { bless { }, $_[0] }
+
+sub parse {
+ my $class = shift;
+ my($buf) = @_;
+ my $sp = $class->new;
+ my $tag = $buf->get_int8;
+ $sp->{critical} = $tag & 0x80;
+ $sp->{type} = $tag & 0x7f;
+ $buf->bytes(0, 1, ''); ## Cut off tag byte
+ $buf->{offset} = 0;
+ my $ref = $SUBPACKET_TYPES{$sp->{type}};
+ $sp->{data} = $ref->{r}->($buf) if $ref && $ref->{r};
+ $sp;
+}
+
+sub save {
+ my $sp = shift;
+ my $buf = Crypt::OpenPGP::Buffer->new;
+ my $tag = $sp->{type};
+ $tag |= 0x80 if $sp->{critical};
+ $buf->put_int8($tag);
+ my $ref = $SUBPACKET_TYPES{$sp->{type}};
+ $ref->{w}->($buf, $sp->{data}) if $ref && $ref->{w};
+ $buf->bytes;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Trust.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Trust.pm
new file mode 100755
index 00000000000..ffe324d3e80
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Trust.pm
@@ -0,0 +1,36 @@
+package Crypt::OpenPGP::Trust;
+use strict;
+
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub new { bless { }, $_[0] }
+sub flags { $_[0]->{flags} }
+sub parse {
+ my $class = shift;
+ my($buf) = @_;
+ my $trust = $class->new;
+ $trust->{flags} = $buf->get_int8;
+ $trust;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Trust - PGP Trust packet
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Trust> is a PGP Trust packet. From the OpenPGP
+RFC: "Trust packets contain data that record the user's specifications
+of which key holders are trustworthy introducers, along with other
+information that implementing software uses for trust information."
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/UserID.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/UserID.pm
new file mode 100755
index 00000000000..3d312e3aa0f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/UserID.pm
@@ -0,0 +1,90 @@
+package Crypt::OpenPGP::UserID;
+use strict;
+
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+sub new {
+ my $id = bless { }, shift;
+ $id->init(@_);
+}
+
+sub init {
+ my $id = shift;
+ my %param = @_;
+ if (my $ident = $param{Identity}) {
+ $id->{id} = $ident;
+ }
+ $id;
+}
+
+sub id { $_[0]->{id} }
+sub parse {
+ my $class = shift;
+ my($buf) = @_;
+ my $id = $class->new;
+ $id->{id} = $buf->bytes;
+ $id;
+}
+
+sub save { $_[0]->{id} }
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::UserID - PGP User ID packet
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::UserID;
+
+ my $uid = Crypt::OpenPGP::UserID->new( Identity => 'Foo' );
+ my $serialized = $uid->save;
+ my $identity = $uid->id;
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::UserID> is a PGP User ID packet. Such a packet is
+used to represent the name and email address of the key holder,
+and typically contains an RFC822 mail name like
+
+ Foo Bar <foo@bar.com>
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::UserID->new( [ Identity => $identity ] )
+
+Creates a new User ID packet object and returns that object. If you
+do not supply an identity, the object is created empty; this is used,
+for example, in I<parse> (below), to create an empty packet which is
+then filled from the data in the buffer.
+
+If you wish to initialize a non-empty object, supply I<new> with
+the I<Identity> parameter along with a value I<$identity> which
+should generally be in RFC822 form (above).
+
+=head2 $uid->save
+
+Returns the text of the user ID packet; this is the string passed to
+I<new> (above) as I<$identity>, for example.
+
+=head2 Crypt::OpenPGP::UserID->parse($buffer)
+
+Given I<$buffer>, a I<Crypt::OpenPGP::Buffer> object holding (or
+with offset pointing to) a User ID packet, returns a new
+<Crypt::OpenPGP::UserID> object, initialized with the user ID data
+in the buffer.
+
+=head2 $uid->id
+
+Returns the user ID data (eg. the string passed as I<$identity> to
+I<new>, above).
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Util.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Util.pm
new file mode 100755
index 00000000000..495dc936317
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Util.pm
@@ -0,0 +1,137 @@
+package Crypt::OpenPGP::Util;
+use strict;
+
+use Math::Pari qw( PARI pari2num floor Mod lift );
+
+use vars qw( @EXPORT_OK @ISA );
+use Exporter;
+@EXPORT_OK = qw( bitsize bin2mp mp2bin mod_exp mod_inverse
+ dash_escape dash_unescape canonical_text );
+@ISA = qw( Exporter );
+
+sub bitsize {
+ return pari2num(floor(Math::Pari::log($_[0])/Math::Pari::log(2)) + 1);
+}
+
+sub bin2mp { Math::Pari::_hex_cvt('0x' . unpack 'H*', $_[0]) }
+
+sub mp2bin {
+ my($p) = @_;
+ $p = PARI($p);
+ my $base = PARI(1) << PARI(4*8);
+ my $res = '';
+ while ($p != 0) {
+ my $r = $p % $base;
+ $p = ($p-$r) / $base;
+ my $buf = pack 'N', $r;
+ if ($p == 0) {
+ $buf = $r >= 16777216 ? $buf :
+ $r >= 65536 ? substr($buf, -3, 3) :
+ $r >= 256 ? substr($buf, -2, 2) :
+ substr($buf, -1, 1);
+ }
+ $res = $buf . $res;
+ }
+ $res;
+}
+
+sub mod_exp {
+ my($a, $exp, $n) = @_;
+ my $m = Mod($a, $n);
+ lift($m ** $exp);
+}
+
+sub mod_inverse {
+ my($a, $n) = @_;
+ my $m = Mod(1, $n);
+ lift($m / $a);
+}
+
+sub dash_escape {
+ my($data) = @_;
+ $data =~ s/^-/- -/mg;
+ $data;
+}
+
+sub dash_unescape {
+ my($data) = @_;
+ $data =~ s/^-\s//mg;
+ $data;
+}
+
+sub canonical_text {
+ my($text) = @_;
+ my @lines = split /\n/, $text, -1;
+ for my $l (@lines) {
+## pgp2 and pgp5 do not trim trailing whitespace from "canonical text"
+## signatures, only from cleartext signatures.
+## See:
+## http://cert.uni-stuttgart.de/archive/ietf-openpgp/2000/01/msg00033.html
+ if ($Crypt::OpenPGP::Globals::Trim_trailing_ws) {
+ $l =~ s/[ \t\r\n]*$//;
+ } else {
+ $l =~ s/[\r\n]*$//;
+ }
+ }
+ join "\r\n", @lines;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Util - Miscellaneous utility functions
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Util> contains a set of exportable utility functions
+used through the I<Crypt::OpenPGP> set of libraries.
+
+=head2 bitsize($n)
+
+Returns the number of bits in the I<Math::Pari> integer object
+I<$n>.
+
+=head2 bin2mp($string)
+
+Given a string I<$string> of any length, treats the string as a
+base-256 representation of an integer, and returns that integer,
+a I<Math::Pari> object.
+
+=head2 mp2bin($int)
+
+Given a biginteger I<$int> (a I<Math::Pari> object), linearizes
+the integer into an octet string, and returns the octet string.
+
+=head2 mod_exp($a, $exp, $n)
+
+Computes $a ^ $exp mod $n and returns the value. The calculations
+are done using I<Math::Pari>, and the return value is a I<Math::Pari>
+object.
+
+=head2 mod_inverse($a, $n)
+
+Computes the multiplicative inverse of $a mod $n and returns the
+value. The calculations are done using I<Math::Pari>, and the
+return value is a I<Math::Pari> object.
+
+=head2 canonical_text($text)
+
+Takes a piece of text content I<$text> and formats it into PGP canonical
+text, where: 1) all whitespace at the end of lines is stripped, and
+2) all line endings are made up of a carriage return followed by a line
+feed. Returns the canonical form of the text.
+
+=head2 dash_escape($text)
+
+Escapes I<$text> for use in a cleartext signature; the escaping looks
+for any line starting with a dash, and on such lines prepends a dash
+('-') followed by a space (' '). Returns the escaped text.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Words.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Words.pm
new file mode 100755
index 00000000000..f487af76ab3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/OpenPGP/Words.pm
@@ -0,0 +1,222 @@
+package Crypt::OpenPGP::Words;
+use strict;
+
+use Crypt::OpenPGP::ErrorHandler;
+use base qw( Crypt::OpenPGP::ErrorHandler );
+
+## Biometric word lists as defined in manual for
+## PGPFreeware for Windows 6.5.1, Appendix D
+
+## Code based on Mike Dillon's PGPWords.pm
+
+{
+ my @WORDS;
+
+ sub encode_hex { $_[0]->encode(pack 'H*', $_[1]) }
+
+ sub encode {
+ my $class = shift;
+ my($data) = @_;
+ my $toggle = 1;
+ map { $WORDS[$toggle = !$toggle][$_] } unpack 'C*', $data;
+ }
+
+ @WORDS = (
+
+ ## Two-syllable words for encoding odd bytes
+ [ qw(
+ aardvark absurd accrue acme
+ adrift adult afflict ahead
+ aimless Algol allow alone
+ ammo ancient apple artist
+ assume Athens atlas Aztec
+ baboon backfield backward banjo
+ beaming bedlamp beehive beeswax
+ befriend Belfast berserk billiard
+ bison blackjack blockade blowtorch
+ bluebird bombast bookshelf brackish
+ breadline breakup brickyard briefcase
+ Burbank button buzzard cement
+ chairlift chatter checkup chisel
+ choking chopper Christmas clamshell
+ classic classroom cleanup clockwork
+ cobra commence concert cowbell
+ crackdown cranky crowfoot crucial
+ crumpled crusade cubic dashboard
+ deadbolt deckhand dogsled dragnet
+ drainage dreadful drifter dropper
+ drumbeat drunken Dupont dwelling
+ eating edict egghead eightball
+ endorse endow enlist erase
+ escape exceed eyeglass eyetooth
+ facial fallout flagpole flatfoot
+ flytrap fracture framework freedom
+ frighten gazelle Geiger glitter
+ glucose goggles goldfish gremlin
+ guidance hamlet highchair hockey
+ indoors indulge inverse involve
+ island jawbone keyboard kickoff
+ kiwi klaxon locale lockup
+ merit minnow miser Mohawk
+ mural music necklace Neptune
+ newborn nightbird Oakland obtuse
+ offload optic orca payday
+ peachy pheasant physique playhouse
+ Pluto preclude prefer preshrunk
+ printer prowler pupil puppy
+ python quadrant quiver quota
+ ragtime ratchet rebirth reform
+ regain reindeer rematch repay
+ retouch revenge reward rhythm
+ ribcage ringbolt robust rocker
+ ruffled sailboat sawdust scallion
+ scenic scorecard Scotland seabird
+ select sentence shadow shamrock
+ showgirl skullcap skydive slingshot
+ slowdown snapline snapshot snowcap
+ snowslide solo southward soybean
+ spaniel spearhead spellbind spheroid
+ spigot spindle spyglass stagehand
+ stagnate stairway standard stapler
+ steamship sterling stockman stopwatch
+ stormy sugar surmount suspense
+ sweatband swelter tactics talon
+ tapeworm tempest tiger tissue
+ tonic topmost tracker transit
+ trauma treadmill Trojan trouble
+ tumor tunnel tycoon uncut
+ unearth unwind uproot upset
+ upshot vapor village virus
+ Vulcan waffle wallet watchword
+ wayside willow woodlark Zulu
+ ) ],
+
+ ## Three-syllable words for encoding even bytes
+ [ qw(
+ adroitness adviser aftermath aggregate
+ alkali almighty amulet amusement
+ antenna applicant Apollo armistice
+ article asteroid Atlantic atmosphere
+ autopsy Babylon backwater barbecue
+ belowground bifocals bodyguard bookseller
+ borderline bottomless Bradbury bravado
+ Brazilian breakaway Burlington businessman
+ butterfat Camelot candidate cannonball
+ Capricorn caravan caretaker celebrate
+ cellulose certify chambermaid Cherokee
+ Chicago clergyman coherence combustion
+ commando company component concurrent
+ confidence conformist congregate consensus
+ consulting corporate corrosion councilman
+ crossover crucifix cumbersome customer
+ Dakota decadence December decimal
+ designing detector detergent determine
+ dictator dinosaur direction disable
+ disbelief disruptive distortion document
+ embezzle enchanting enrollment enterprise
+ equation equipment escapade Eskimo
+ everyday examine existence exodus
+ fascinate filament finicky forever
+ fortitude frequency gadgetry Galveston
+ getaway glossary gossamer graduate
+ gravity guitarist hamburger Hamilton
+ handiwork hazardous headwaters hemisphere
+ hesitate hideaway holiness hurricane
+ hydraulic impartial impetus inception
+ indigo inertia infancy inferno
+ informant insincere insurgent integrate
+ intention inventive Istanbul Jamaica
+ Jupiter leprosy letterhead liberty
+ maritime matchmaker maverick Medusa
+ megaton microscope microwave midsummer
+ millionaire miracle misnomer molasses
+ molecule Montana monument mosquito
+ narrative nebula newsletter Norwegian
+ October Ohio onlooker opulent
+ Orlando outfielder Pacific pandemic
+ Pandora paperweight paragon paragraph
+ paramount passenger pedigree Pegasus
+ penetrate perceptive performance pharmacy
+ phonetic photograph pioneer pocketful
+ politeness positive potato processor
+ provincial proximate puberty publisher
+ pyramid quantity racketeer rebellion
+ recipe recover repellent replica
+ reproduce resistor responsive retraction
+ retrieval retrospect revenue revival
+ revolver sandalwood sardonic Saturday
+ savagery scavenger sensation sociable
+ souvenir specialist speculate stethoscope
+ stupendous supportive surrender suspicious
+ sympathy tambourine telephone therapist
+ tobacco tolerance tomorrow torpedo
+ tradition travesty trombonist truncated
+ typewriter ultimate undaunted underfoot
+ unicorn unify universe unravel
+ upcoming vacancy vagabond vertigo
+ Virginia visitor vocalist voyager
+ warranty Waterloo whimsical Wichita
+ Wilmington Wyoming yesteryear Yucatan
+ ) ]
+
+ );
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::OpenPGP::Words - Create English-word encodings
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenPGP::Words;
+ my $cert = Crypt::OpenPGP::Certificate->new;
+ my @words = Crypt::OpenPGP::Words->encode( $cert->fingerprint );
+
+=head1 DESCRIPTION
+
+I<Crypt::OpenPGP::Words> provides routines to convert either octet or
+hexadecimal strings into a list of English words, using the same
+algorithm and biometric word lists as used in PGP (see
+I<AUTHOR & COPYRIGHTS> for source of word lists).
+
+In PGP this is often used for creating memorable fingerprints, the idea
+being that it is easier to associate a list of words with one's key
+than a string of hex digits. See the I<fingerprint_words> method in
+I<Crypt::OpenPGP::Certificate> for an interface to word fingerprints.
+
+=head1 USAGE
+
+=head2 Crypt::OpenPGP::Words->encode( $octet_str )
+
+Given an octet string I<$octet_str>, encodes that string into a list of
+English words.
+
+The encoding is performed by splitting the string into octets; the list
+of octets is then iterated over. There are two lists of words, 256 words
+each. Two-syllable words are used for encoding odd iterations through
+the loop; three-syllable words for even iterations. The word list is
+formed by treating each octet as an index into the appropriate word list
+(two- or three-syllable), then adding the word at that index to the list.
+
+Returns the list of words.
+
+=head2 Crypt::OpenPGP::Words->encode_hex( $hex_str )
+
+Performs the exact same encoding as I<encode>; I<$hex_str>, a string
+of hexadecimal digits, is first transformed into a string of octets,
+then passed to I<encode>.
+
+Returns the list of words.
+
+=head1 AUTHOR & COPYRIGHTS
+
+Based on PGPWords.pm by Mike Dillon. Biometric word lists as defined in
+manual for PGPFreeware for Windows 6.5.1, Appendix D
+
+Please see the Crypt::OpenPGP manpage for author, copyright, and
+license information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/Primes.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/Primes.pm
new file mode 100755
index 00000000000..64d41f5555d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/Primes.pm
@@ -0,0 +1,901 @@
+#!/usr/bin/perl -s
+##
+## Crypt::Primes -- Provable Prime Number Generator
+## for Cryptographic Applications.
+##
+## Copyright (c) 1998-2000, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: Primes.pm,v 0.49 2001/06/11 01:04:23 vipul Exp vipul $
+
+package Crypt::Primes;
+require Exporter;
+use vars qw($VERSION @EXPORT_OK);
+use Crypt::Random qw( makerandom makerandom_itv );
+use Math::Pari qw( PARI Mod floor sqrt);
+*import = \&Exporter::import;
+
+@EXPORT_OK = qw( maurer trialdiv rsaparams );
+( $VERSION ) = '$Revision: 0.50 $' =~ /(\d+\.\d+)/;
+
+## list of small primes for trial division.
+
+@PRIMES = qw(
+ 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101
+103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197
+199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311
+313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431
+433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557
+563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661
+673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809
+811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937
+941 947 953 967 971 977 983 991 997 1009 1013 1019 1021 1031 1033 1039 1049
+1051 1061 1063 1069 1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 1153
+1163 1171 1181 1187 1193 1201 1213 1217 1223 1229 1231 1237 1249 1259 1277
+1279 1283 1289 1291 1297 1301 1303 1307 1319 1321 1327 1361 1367 1373 1381
+1399 1409 1423 1427 1429 1433 1439 1447 1451 1453 1459 1471 1481 1483 1487
+1489 1493 1499 1511 1523 1531 1543 1549 1553 1559 1567 1571 1579 1583 1597
+1601 1607 1609 1613 1619 1621 1627 1637 1657 1663 1667 1669 1693 1697 1699
+1709 1721 1723 1733 1741 1747 1753 1759 1777 1783 1787 1789 1801 1811 1823
+1831 1847 1861 1867 1871 1873 1877 1879 1889 1901 1907 1913 1931 1933 1949
+1951 1973 1979 1987 1993 1997 1999 2003 2011 2017 2027 2029 2039 2053 2063
+2069 2081 2083 2087 2089 2099 2111 2113 2129 2131 2137 2141 2143 2153 2161
+2179 2203 2207 2213 2221 2237 2239 2243 2251 2267 2269 2273 2281 2287 2293
+2297 2309 2311 2333 2339 2341 2347 2351 2357 2371 2377 2381 2383 2389 2393
+2399 2411 2417 2423 2437 2441 2447 2459 2467 2473 2477 2503 2521 2531 2539
+2543 2549 2551 2557 2579 2591 2593 2609 2617 2621 2633 2647 2657 2659 2663
+2671 2677 2683 2687 2689 2693 2699 2707 2711 2713 2719 2729 2731 2741 2749
+2753 2767 2777 2789 2791 2797 2801 2803 2819 2833 2837 2843 2851 2857 2861
+2879 2887 2897 2903 2909 2917 2927 2939 2953 2957 2963 2969 2971 2999 3001
+3011 3019 3023 3037 3041 3049 3061 3067 3079 3083 3089 3109 3119 3121 3137
+3163 3167 3169 3181 3187 3191 3203 3209 3217 3221 3229 3251 3253 3257 3259
+3271 3299 3301 3307 3313 3319 3323 3329 3331 3343 3347 3359 3361 3371 3373
+3389 3391 3407 3413 3433 3449 3457 3461 3463 3467 3469 3491 3499 3511 3517
+3527 3529 3533 3539 3541 3547 3557 3559 3571 3581 3583 3593 3607 3613 3617
+3623 3631 3637 3643 3659 3671 3673 3677 3691 3697 3701 3709 3719 3727 3733
+3739 3761 3767 3769 3779 3793 3797 3803 3821 3823 3833 3847 3851 3853 3863
+3877 3881 3889 3907 3911 3917 3919 3923 3929 3931 3943 3947 3967 3989 4001
+4003 4007 4013 4019 4021 4027 4049 4051 4057 4073 4079 4091 4093 4099 4111
+4127 4129 4133 4139 4153 4157 4159 4177 4201 4211 4217 4219 4229 4231 4241
+4243 4253 4259 4261 4271 4273 4283 4289 4297 4327 4337 4339 4349 4357 4363
+4373 4391 4397 4409 4421 4423 4441 4447 4451 4457 4463 4481 4483 4493 4507
+4513 4517 4519 4523 4547 4549 4561 4567 4583 4591 4597 4603 4621 4637 4639
+4643 4649 4651 4657 4663 4673 4679 4691 4703 4721 4723 4729 4733 4751 4759
+4783 4787 4789 4793 4799 4801 4813 4817 4831 4861 4871 4877 4889 4903 4909
+4919 4931 4933 4937 4943 4951 4957 4967 4969 4973 4987 4993 4999 5003 5009
+5011 5021 5023 5039 5051 5059 5077 5081 5087 5099 5101 5107 5113 5119 5147
+5153 5167 5171 5179 5189 5197 5209 5227 5231 5233 5237 5261 5273 5279 5281
+5297 5303 5309 5323 5333 5347 5351 5381 5387 5393 5399 5407 5413 5417 5419
+5431 5437 5441 5443 5449 5471 5477 5479 5483 5501 5503 5507 5519 5521 5527
+5531 5557 5563 5569 5573 5581 5591 5623 5639 5641 5647 5651 5653 5657 5659
+5669 5683 5689 5693 5701 5711 5717 5737 5741 5743 5749 5779 5783 5791 5801
+5807 5813 5821 5827 5839 5843 5849 5851 5857 5861 5867 5869 5879 5881 5897
+5903 5923 5927 5939 5953 5981 5987 6007 6011 6029 6037 6043 6047 6053 6067
+6073 6079 6089 6091 6101 6113 6121 6131 6133 6143 6151 6163 6173 6197 6199
+6203 6211 6217 6221 6229 6247 6257 6263 6269 6271 6277 6287 6299 6301 6311
+6317 6323 6329 6337 6343 6353 6359 6361 6367 6373 6379 6389 6397 6421 6427
+6449 6451 6469 6473 6481 6491 6521 6529 6547 6551 6553 6563 6569 6571 6577
+6581 6599 6607 6619 6637 6653 6659 6661 6673 6679 6689 6691 6701 6703 6709
+6719 6733 6737 6761 6763 6779 6781 6791 6793 6803 6823 6827 6829 6833 6841
+6857 6863 6869 6871 6883 6899 6907 6911 6917 6947 6949 6959 6961 6967 6971
+6977 6983 6991 6997 7001 7013 7019 7027 7039 7043 7057 7069 7079 7103 7109
+7121 7127 7129 7151 7159 7177 7187 7193 7207 7211 7213 7219 7229 7237 7243
+7247 7253 7283 7297 7307 7309 7321 7331 7333 7349 7351 7369 7393 7411 7417
+7433 7451 7457 7459 7477 7481 7487 7489 7499 7507 7517 7523 7529 7537 7541
+7547 7549 7559 7561 7573 7577 7583 7589 7591 7603 7607 7621 7639 7643 7649
+7669 7673 7681 7687 7691 7699 7703 7717 7723 7727 7741 7753 7757 7759 7789
+7793 7817 7823 7829 7841 7853 7867 7873 7877 7879 7883 7901 7907 7919 7927
+7933 7937 7949 7951 7963 7993 8009 8011 8017 8039 8053 8059 8069 8081 8087
+8089 8093 8101 8111 8117 8123 8147 8161 8167 8171 8179 8191 8209 8219 8221
+8231 8233 8237 8243 8263 8269 8273 8287 8291 8293 8297 8311 8317 8329 8353
+8363 8369 8377 8387 8389 8419 8423 8429 8431 8443 8447 8461 8467 8501 8513
+8521 8527 8537 8539 8543 8563 8573 8581 8597 8599 8609 8623 8627 8629 8641
+8647 8663 8669 8677 8681 8689 8693 8699 8707 8713 8719 8731 8737 8741 8747
+8753 8761 8779 8783 8803 8807 8819 8821 8831 8837 8839 8849 8861 8863 8867
+8887 8893 8923 8929 8933 8941 8951 8963 8969 8971 8999 9001 9007 9011 9013
+9029 9041 9043 9049 9059 9067 9091 9103 9109 9127 9133 9137 9151 9157 9161
+9173 9181 9187 9199 9203 9209 9221 9227 9239 9241 9257 9277 9281 9283 9293
+9311 9319 9323 9337 9341 9343 9349 9371 9377 9391 9397 9403 9413 9419 9421
+9431 9433 9437 9439 9461 9463 9467 9473 9479 9491 9497 9511 9521 9533 9539
+9547 9551 9587 9601 9613 9619 9623 9629 9631 9643 9649 9661 9677 9679 9689
+9697 9719 9721 9733 9739 9743 9749 9767 9769 9781 9787 9791 9803 9811 9817
+9829 9833 9839 9851 9857 9859 9871 9883 9887 9901 9907 9923 9929 9931 9941
+9949 9967 9973 10007 10009 10037 10039 10061 10067 10069 10079 10091 10093
+10099 10103 10111 10133 10139 10141 10151 10159 10163 10169 10177 10181
+10193 10211 10223 10243 10247 10253 10259 10267 10271 10273 10289 10301
+10303 10313 10321 10331 10333 10337 10343 10357 10369 10391 10399 10427
+10429 10433 10453 10457 10459 10463 10477 10487 10499 10501 10513 10529
+10531 10559 10567 10589 10597 10601 10607 10613 10627 10631 10639 10651
+10657 10663 10667 10687 10691 10709 10711 10723 10729 10733 10739 10753
+10771 10781 10789 10799 10831 10837 10847 10853 10859 10861 10867 10883
+10889 10891 10903 10909 10937 10939 10949 10957 10973 10979 10987 10993
+11003 11027 11047 11057 11059 11069 11071 11083 11087 11093 11113 11117
+11119 11131 11149 11159 11161 11171 11173 11177 11197 11213 11239 11243
+11251 11257 11261 11273 11279 11287 11299 11311 11317 11321 11329 11351
+11353 11369 11383 11393 11399 11411 11423 11437 11443 11447 11467 11471
+11483 11489 11491 11497 11503 11519 11527 11549 11551 11579 11587 11593
+11597 11617 11621 11633 11657 11677 11681 11689 11699 11701 11717 11719
+11731 11743 11777 11779 11783 11789 11801 11807 11813 11821 11827 11831
+11833 11839 11863 11867 11887 11897 11903 11909 11923 11927 11933 11939
+11941 11953 11959 11969 11971 11981 11987 12007 12011 12037 12041 12043
+12049 12071 12073 12097 12101 12107 12109 12113 12119 12143 12149 12157
+12161 12163 12197 12203 12211 12227 12239 12241 12251 12253 12263 12269
+12277 12281 12289 12301 12323 12329 12343 12347 12373 12377 12379 12391
+12401 12409 12413 12421 12433 12437 12451 12457 12473 12479 12487 12491
+12497 12503 12511 12517 12527 12539 12541 12547 12553 12569 12577 12583
+12589 12601 12611 12613 12619 12637 12641 12647 12653 12659 12671 12689
+12697 12703 12713 12721 12739 12743 12757 12763 12781 12791 12799 12809
+12821 12823 12829 12841 12853 12889 12893 12899 12907 12911 12917 12919
+12923 12941 12953 12959 12967 12973 12979 12983 13001 13003 13007 13009
+13033 13037 13043 13049 13063 13093 13099 13103 13109 13121 13127 13147
+13151 13159 13163 13171 13177 13183 13187 13217 13219 13229 13241 13249
+13259 13267 13291 13297 13309 13313 13327 13331 13337 13339 13367 13381
+13397 13399 13411 13417 13421 13441 13451 13457 13463 13469 13477 13487
+13499 13513 13523 13537 13553 13567 13577 13591 13597 13613 13619 13627
+13633 13649 13669 13679 13681 13687 13691 13693 13697 13709 13711 13721
+13723 13729 13751 13757 13759 13763 13781 13789 13799 13807 13829 13831
+13841 13859 13873 13877 13879 13883 13901 13903 13907 13913 13921 13931
+13933 13963 13967 13997 13999 14009 14011 14029 14033 14051 14057 14071
+14081 14083 14087 14107 14143 14149 14153 14159 14173 14177 14197 14207
+14221 14243 14249 14251 14281 14293 14303 14321 14323 14327 14341 14347
+14369 14387 14389 14401 14407 14411 14419 14423 14431 14437 14447 14449
+14461 14479 14489 14503 14519 14533 14537 14543 14549 14551 14557 14561
+14563 14591 14593 14621 14627 14629 14633 14639 14653 14657 14669 14683
+14699 14713 14717 14723 14731 14737 14741 14747 14753 14759 14767 14771
+14779 14783 14797 14813 14821 14827 14831 14843 14851 14867 14869 14879
+14887 14891 14897 14923 14929 14939 14947 14951 14957 14969 14983 15013
+15017 15031 15053 15061 15073 15077 15083 15091 15101 15107 15121 15131
+15137 15139 15149 15161 15173 15187 15193 15199 15217 15227 15233 15241
+15259 15263 15269 15271 15277 15287 15289 15299 15307 15313 15319 15329
+15331 15349 15359 15361 15373 15377 15383 15391 15401 15413 15427 15439
+15443 15451 15461 15467 15473 15493 15497 15511 15527 15541 15551 15559
+15569 15581 15583 15601 15607 15619 15629 15641 15643 15647 15649 15661
+15667 15671 15679 15683 15727 15731 15733 15737 15739 15749 15761 15767
+15773 15787 15791 15797 15803 15809 15817 15823 15859 15877 15881 15887
+15889 15901 15907 15913 15919 15923 15937 15959 15971 15973 15991 16001
+16007 16033 16057 16061 16063 16067 16069 16073 16087 16091 16097 16103
+16111 16127 16139 16141 16183 16187 16189 16193 16217 16223 16229 16231
+16249 16253 16267 16273 16301 16319 16333 16339 16349 16361 16363 16369
+16381 16411 16417 16421 16427 16433 16447 16451 16453 16477 16481 16487
+16493 16519 16529 16547 16553 16561 16567 16573 16603 16607 16619 16631
+16633 16649 16651 16657 16661 16673 16691 16693 16699 16703 16729 16741
+16747 16759 16763 16787 16811 16823 16829 16831 16843 16871 16879 16883
+16889 16901 16903 16921 16927 16931 16937 16943 16963 16979 16981 16987
+16993 17011 17021 17027 17029 17033 17041 17047 17053 17077 17093 17099
+17107 17117 17123 17137 17159 17167 17183 17189 17191 17203 17207 17209
+17231 17239 17257 17291 17293 17299 17317 17321 17327 17333 17341 17351
+17359 17377 17383 17387 17389 17393 17401 17417 17419 17431 17443 17449
+17467 17471 17477 17483 17489 17491 17497 17509 17519 17539 17551 17569
+17573 17579 17581 17597 17599 17609 17623 17627 17657 17659 17669 17681
+17683 17707 17713 17729 17737 17747 17749 17761 17783 17789 17791 17807
+17827 17837 17839 17851 17863 17881 17891 17903 17909 17911 17921 17923
+17929 17939 17957 17959 17971 17977 17981 17987 17989 18013 18041 18043
+18047 18049 18059 18061 18077 18089 18097 18119 18121 18127 18131 18133
+18143 18149 18169 18181 18191 18199 18211 18217 18223 18229 18233 18251
+18253 18257 18269 18287 18289 18301 18307 18311 18313 18329 18341 18353
+18367 18371 18379 18397 18401 18413 18427 18433 18439 18443 18451 18457
+18461 18481 18493 18503 18517 18521 18523 18539 18541 18553 18583 18587
+18593 18617 18637 18661 18671 18679 18691 18701 18713 18719 18731 18743
+18749 18757 18773 18787 18793 18797 18803 18839 18859 18869 18899 18911
+18913 18917 18919 18947 18959 18973 18979 19001 19009 19013 19031 19037
+19051 19069 19073 19079 19081 19087 19121 19139 19141 19157 19163 19181
+19183 19207 19211 19213 19219 19231 19237 19249 19259 19267 19273 19289
+19301 19309 19319 19333 19373 19379 19381 19387 19391 19403 19417 19421
+19423 19427 19429 19433 19441 19447 19457 19463 19469 19471 19477 19483
+19489 19501 19507 19531 19541 19543 19553 19559 19571 19577 19583 19597
+19603 19609 19661 19681 19687 19697 19699 19709 19717 19727 19739 19751
+19753 19759 19763 19777 19793 19801 19813 19819 19841 19843 19853 19861
+19867 19889 19891 19913 19919 19927 19937 19949 19961 19963 19973 19979
+19991 19993 19997 20011 20021 20023 20029 20047 20051 20063 20071 20089
+20101 20107 20113 20117 20123 20129 20143 20147 20149 20161 20173 20177
+20183 20201 20219 20231 20233 20249 20261 20269 20287 20297 20323 20327
+20333 20341 20347 20353 20357 20359 20369 20389 20393 20399 20407 20411
+20431 20441 20443 20477 20479 20483 20507 20509 20521 20533 20543 20549
+20551 20563 20593 20599 20611 20627 20639 20641 20663 20681 20693 20707
+20717 20719 20731 20743 20747 20749 20753 20759 20771 20773 20789 20807
+20809 20849 20857 20873 20879 20887 20897 20899 20903 20921 20929 20939
+20947 20959 20963 20981 20983 21001 21011 21013 21017 21019 21023 21031
+21059 21061 21067 21089 21101 21107 21121 21139 21143 21149 21157 21163
+21169 21179 21187 21191 21193 21211 21221 21227 21247 21269 21277 21283
+21313 21317 21319 21323 21341 21347 21377 21379 21383 21391 21397 21401
+21407 21419 21433 21467 21481 21487 21491 21493 21499 21503 21517 21521
+21523 21529 21557 21559 21563 21569 21577 21587 21589 21599 21601 21611
+21613 21617 21647 21649 21661 21673 21683 21701 21713 21727 21737 21739
+21751 21757 21767 21773 21787 21799 21803 21817 21821 21839 21841 21851
+21859 21863 21871 21881 21893 21911 21929 21937 21943 21961 21977 21991
+21997 22003 22013 22027 22031 22037 22039 22051 22063 22067 22073 22079
+22091 22093 22109 22111 22123 22129 22133 22147 22153 22157 22159 22171
+22189 22193 22229 22247 22259 22271 22273 22277 22279 22283 22291 22303
+22307 22343 22349 22367 22369 22381 22391 22397 22409 22433 22441 22447
+22453 22469 22481 22483 22501 22511 22531 22541 22543 22549 22567 22571
+22573 22613 22619 22621 22637 22639 22643 22651 22669 22679 22691 22697
+22699 22709 22717 22721 22727 22739 22741 22751 22769 22777 22783 22787
+22807 22811 22817 22853 22859 22861 22871 22877 22901 22907 22921 22937
+22943 22961 22963 22973 22993 23003 23011 23017 23021 23027 23029 23039
+23041 23053 23057 23059 23063 23071 23081 23087 23099 23117 23131 23143
+23159 23167 23173 23189 23197 23201 23203 23209 23227 23251 23269 23279
+23291 23293 23297 23311 23321 23327 23333 23339 23357 23369 23371 23399
+23417 23431 23447 23459 23473 23497 23509 23531 23537 23539 23549 23557
+23561 23563 23567 23581 23593 23599 23603 23609 23623 23627 23629 23633
+23663 23669 23671 23677 23687 23689 23719 23741 23743 23747 23753 23761
+23767 23773 23789 23801 23813 23819 23827 23831 23833 23857 23869 23873
+23879 23887 23893 23899 23909 23911 23917 23929 23957 23971 23977 23981
+23993 24001 24007 24019 24023 24029 24043 24049 24061 24071 24077 24083
+24091 24097 24103 24107 24109 24113 24121 24133 24137 24151 24169 24179
+24181 24197 24203 24223 24229 24239 24247 24251 24281 24317 24329 24337
+24359 24371 24373 24379 24391 24407 24413 24419 24421 24439 24443 24469
+24473 24481 24499 24509 24517 24527 24533 24547 24551 24571 24593 24611
+24623 24631 24659 24671 24677 24683 24691 24697 24709 24733 24749 24763
+24767 24781 24793 24799 24809 24821 24841 24847 24851 24859 24877 24889
+24907 24917 24919 24923 24943 24953 24967 24971 24977 24979 24989 25013
+25031 25033 25037 25057 25073 25087 25097 25111 25117 25121 25127 25147
+25153 25163 25169 25171 25183 25189 25219 25229 25237 25243 25247 25253
+25261 25301 25303 25307 25309 25321 25339 25343 25349 25357 25367 25373
+25391 25409 25411 25423 25439 25447 25453 25457 25463 25469 25471 25523
+25537 25541 25561 25577 25579 25583 25589 25601 25603 25609 25621 25633
+25639 25643 25657 25667 25673 25679 25693 25703 25717 25733 25741 25747
+25759 25763 25771 25793 25799 25801 25819 25841 25847 25849 25867 25873
+25889 25903 25913 25919 25931 25933 25939 25943 25951 25969 25981 25997
+25999 26003 26017 26021 26029 26041 26053 26083 26099 26107 26111 26113
+26119 26141 26153 26161 26171 26177 26183 26189 26203 26209 26227 26237
+26249 26251 26261 26263 26267 26293 26297 26309 26317 26321 26339 26347
+26357 26371 26387 26393 26399 26407 26417 26423 26431 26437 26449 26459
+26479 26489 26497 26501 26513 26539 26557 26561 26573 26591 26597 26627
+26633 26641 26647 26669 26681 26683 26687 26693 26699 26701 26711 26713
+26717 26723 26729 26731 26737 26759 26777 26783 26801 26813 26821 26833
+26839 26849 26861 26863 26879 26881 26891 26893 26903 26921 26927 26947
+26951 26953 26959 26981 26987 26993 27011 27017 27031 27043 27059 27061
+27067 27073 27077 27091 27103 27107 27109 27127 27143 27179 27191 27197
+27211 27239 27241 27253 27259 27271 27277 27281 27283 27299 27329 27337
+27361 27367 27397 27407 27409 27427 27431 27437 27449 27457 27479 27481
+27487 27509 27527 27529 27539 27541 27551 27581 27583 27611 27617 27631
+27647 27653 27673 27689 27691 27697 27701 27733 27737 27739 27743 27749
+27751 27763 27767 27773 27779 27791 27793 27799 27803 27809 27817 27823
+27827 27847 27851 27883 27893 27901 27917 27919 27941 27943 27947 27953
+27961 27967 27983 27997 28001 28019 28027 28031 28051 28057 28069 28081
+28087 28097 28099 28109 28111 28123 28151 28163 28181 28183 28201 28211
+28219 28229 28277 28279 28283 28289 28297 28307 28309 28319 28349 28351
+28387 28393 28403 28409 28411 28429 28433 28439 28447 28463 28477 28493
+28499 28513 28517 28537 28541 28547 28549 28559 28571 28573 28579 28591
+28597 28603 28607 28619 28621 28627 28631 28643 28649 28657 28661 28663
+28669 28687 28697 28703 28711 28723 28729 28751 28753 28759 28771 28789
+28793 28807 28813 28817 28837 28843 28859 28867 28871 28879 28901 28909
+28921 28927 28933 28949 28961 28979 29009 29017 29021 29023 29027 29033
+29059 29063 29077 29101 29123 29129 29131 29137 29147 29153 29167 29173
+29179 29191 29201 29207 29209 29221 29231 29243 29251 29269 29287 29297
+29303 29311 29327 29333 29339 29347 29363 29383 29387 29389 29399 29401
+29411 29423 29429 29437 29443 29453 29473 29483 29501 29527 29531 29537
+29567 29569 29573 29581 29587 29599 29611 29629 29633 29641 29663 29669
+29671 29683 29717 29723 29741 29753 29759 29761 29789 29803 29819 29833
+29837 29851 29863 29867 29873 29879 29881 29917 29921 29927 29947 29959
+29983 29989 30011 30013 30029 30047 30059 30071 30089 30091 30097 30103
+30109 30113 30119 30133 30137 30139 30161 30169 30181 30187 30197 30203
+30211 30223 30241 30253 30259 30269 30271 30293 30307 30313 30319 30323
+30341 30347 30367 30389 30391 30403 30427 30431 30449 30467 30469 30491
+30493 30497 30509 30517 30529 30539 30553 30557 30559 30577 30593 30631
+30637 30643 30649 30661 30671 30677 30689 30697 30703 30707 30713 30727
+30757 30763 30773 30781 30803 30809 30817 30829 30839 30841 30851 30853
+30859 30869 30871 30881 30893 30911 30931 30937 30941 30949 30971 30977
+30983 31013 31019 31033 31039 31051 31063 31069 31079 31081 31091 31121
+31123 31139 31147 31151 31153 31159 31177 31181 31183 31189 31193 31219
+31223 31231 31237 31247 31249 31253 31259 31267 31271 31277 31307 31319
+31321 31327 31333 31337 31357 31379 31387 31391 31393 31397 31469 31477
+31481 31489 31511 31513 31517 31531 31541 31543 31547 31567 31573 31583
+31601 31607 31627 31643 31649 31657 31663 31667 31687 31699 31721 31723
+31727 31729 31741 31751 31769 31771 31793 31799 31817 31847 31849 31859
+31873 31883 31891 31907 31957 31963 31973 31981 31991 32003 32009 32027
+32029 32051 32057 32059 32063 32069 32077 32083 32089 32099 32117 32119
+32141 32143 32159 32173 32183 32189 32191 32203 32213 32233 32237 32251
+32257 32261 32297 32299 32303 32309 32321 32323 32327 32341 32353 32359
+32363 32369 32371 32377 32381 32401 32411 32413 32423 32429 32441 32443
+32467 32479 32491 32497 32503 32507 32531 32533 32537 32561 32563 32569
+32573 32579 32587 32603 32609 32611 32621 32633 32647 32653 32687 32693
+32707 32713 32717 32719 32749 32771 32779 32783 32789 32797 32801 32803
+32831 32833 32839 32843 32869 32887 32909 32911 32917 32933 32939 32941
+32957 32969 32971 32983 32987 32993 32999 33013 33023 33029 33037 33049
+33053 33071 33073 33083 33091 33107 33113 33119 33149 33151 33161 33179
+33181 33191 33199 33203 33211 33223 33247 33287 33289 33301 33311 33317
+33329 33331 33343 33347 33349 33353 33359 33377 33391 33403 33409 33413
+33427 33457 33461 33469 33479 33487 33493 33503 33521 33529 33533 33547
+33563 33569 33577 33581 33587 33589 33599 33601 33613 33617 33619 33623
+33629 33637 33641 33647 33679 33703 33713 33721 33739 33749 33751 33757
+33767 33769 33773 33791 33797 33809 33811 33827 33829 33851 33857 33863
+33871 33889 33893 33911 33923 33931 33937 33941 33961 33967 33997 34019
+34031 34033 34039 34057 34061 34123 34127 34129 34141 34147 34157 34159
+34171 34183 34211 34213 34217 34231 34253 34259 34261 34267 34273 34283
+34297 34301 34303 34313 34319 34327 34337 34351 34361 34367 34369 34381
+34403 34421 34429 34439 34457 34469 34471 34483 34487 34499 34501 34511
+34513 34519 34537 34543 34549 34583 34589 34591 34603 34607 34613 34631
+34649 34651 34667 34673 34679 34687 34693 34703 34721 34729 34739 34747
+34757 34759 34763 34781 34807 34819 34841 34843 34847 34849 34871 34877
+34883 34897 34913 34919 34939 34949 34961 34963 34981 35023 35027 35051
+35053 35059 35069 35081 35083 35089 35099 35107 35111 35117 35129 35141
+35149 35153 35159 35171 35201 35221 35227 35251 35257 35267 35279 35281
+35291 35311 35317 35323 35327 35339 35353 35363 35381 35393 35401 35407
+35419 35423 35437 35447 35449 35461 35491 35507 35509 35521 35527 35531
+35533 35537 35543 35569 35573 35591 35593 35597 35603 35617 35671 35677
+35729 35731 35747 35753 35759 35771 35797 35801 35803 35809 35831 35837
+35839 35851 35863 35869 35879 35897 35899 35911 35923 35933 35951 35963
+35969 35977 35983 35993 35999 36007 36011 36013 36017 36037 36061 36067
+36073 36083 36097 36107 36109 36131 36137 36151 36161 36187 36191 36209
+36217 36229 36241 36251 36263 36269 36277 36293 36299 36307 36313 36319
+36341 36343 36353 36373 36383 36389 36433 36451 36457 36467 36469 36473
+36479 36493 36497 36523 36527 36529 36541 36551 36559 36563 36571 36583
+36587 36599 36607 36629 36637 36643 36653 36671 36677 36683 36691 36697
+36709 36713 36721 36739 36749 36761 36767 36779 36781 36787 36791 36793
+36809 36821 36833 36847 36857 36871 36877 36887 36899 36901 36913 36919
+36923 36929 36931 36943 36947 36973 36979 36997 37003 37013 37019 37021
+37039 37049 37057 37061 37087 37097 37117 37123 37139 37159 37171 37181
+37189 37199 37201 37217 37223 37243 37253 37273 37277 37307 37309 37313
+37321 37337 37339 37357 37361 37363 37369 37379 37397 37409 37423 37441
+37447 37463 37483 37489 37493 37501 37507 37511 37517 37529 37537 37547
+37549 37561 37567 37571 37573 37579 37589 37591 37607 37619 37633 37643
+37649 37657 37663 37691 37693 37699 37717 37747 37781 37783 37799 37811
+37813 37831 37847 37853 37861 37871 37879 37889 37897 37907 37951 37957
+37963 37967 37987 37991 37993 37997 38011 38039 38047 38053 38069 38083
+38113 38119 38149 38153 38167 38177 38183 38189 38197 38201 38219 38231
+38237 38239 38261 38273 38281 38287 38299 38303 38317 38321 38327 38329
+38333 38351 38371 38377 38393 38431 38447 38449 38453 38459 38461 38501
+38543 38557 38561 38567 38569 38593 38603 38609 38611 38629 38639 38651
+38653 38669 38671 38677 38693 38699 38707 38711 38713 38723 38729 38737
+38747 38749 38767 38783 38791 38803 38821 38833 38839 38851 38861 38867
+38873 38891 38903 38917 38921 38923 38933 38953 38959 38971 38977 38993
+39019 39023 39041 39043 39047 39079 39089 39097 39103 39107 39113 39119
+39133 39139 39157 39161 39163 39181 39191 39199 39209 39217 39227 39229
+39233 39239 39241 39251 39293 39301 39313 39317 39323 39341 39343 39359
+39367 39371 39373 39383 39397 39409 39419 39439 39443 39451 39461 39499
+39503 39509 39511 39521 39541 39551 39563 39569 39581 39607 39619 39623
+39631 39659 39667 39671 39679 39703 39709 39719 39727 39733 39749 39761
+39769 39779 39791 39799 39821 39827 39829 39839 39841 39847 39857 39863
+39869 39877 39883 39887 39901 39929 39937 39953 39971 39979 39983 39989
+40009 40013 40031 40037 40039 40063 40087 40093 40099 40111 40123 40127
+40129 40151 40153 40163 40169 40177 40189 40193 40213 40231 40237 40241
+40253 40277 40283 40289 40343 40351 40357 40361 40387 40423 40427 40429
+40433 40459 40471 40483 40487 40493 40499 40507 40519 40529 40531 40543
+40559 40577 40583 40591 40597 40609 40627 40637 40639 40693 40697 40699
+40709 40739 40751 40759 40763 40771 40787 40801 40813 40819 40823 40829
+40841 40847 40849 40853 40867 40879 40883 40897 40903 40927 40933 40939
+40949 40961 40973 40993 41011 41017 41023 41039 41047 41051 41057 41077
+41081 41113 41117 41131 41141 41143 41149 41161 41177 41179 41183 41189
+41201 41203 41213 41221 41227 41231 41233 41243 41257 41263 41269 41281
+41299 41333 41341 41351 41357 41381 41387 41389 41399 41411 41413 41443
+41453 41467 41479 41491 41507 41513 41519 41521 41539 41543 41549 41579
+41593 41597 41603 41609 41611 41617 41621 41627 41641 41647 41651 41659
+41669 41681 41687 41719 41729 41737 41759 41761 41771 41777 41801 41809
+41813 41843 41849 41851 41863 41879 41887 41893 41897 41903 41911 41927
+41941 41947 41953 41957 41959 41969 41981 41983 41999 42013 42017 42019
+42023 42043 42061 42071 42073 42083 42089 42101 42131 42139 42157 42169
+42179 42181 42187 42193 42197 42209 42221 42223 42227 42239 42257 42281
+42283 42293 42299 42307 42323 42331 42337 42349 42359 42373 42379 42391
+42397 42403 42407 42409 42433 42437 42443 42451 42457 42461 42463 42467
+42473 42487 42491 42499 42509 42533 42557 42569 42571 42577 42589 42611
+42641 42643 42649 42667 42677 42683 42689 42697 42701 42703 42709 42719
+42727 42737 42743 42751 42767 42773 42787 42793 42797 42821 42829 42839
+42841 42853 42859 42863 42899 42901 42923 42929 42937 42943 42953 42961
+42967 42979 42989 43003 43013 43019 43037 43049 43051 43063 43067 43093
+43103 43117 43133 43151 43159 43177 43189 43201 43207 43223 43237 43261
+43271 43283 43291 43313 43319 43321 43331 43391 43397 43399 43403 43411
+43427 43441 43451 43457 43481 43487 43499 43517 43541 43543 43573 43577
+43579 43591 43597 43607 43609 43613 43627 43633 43649 43651 43661 43669
+43691 43711 43717 43721 43753 43759 43777 43781 43783 43787 43789 43793
+43801 43853 43867 43889 43891 43913 43933 43943 43951 43961 43963 43969
+43973 43987 43991 43997 44017 44021 44027 44029 44041 44053 44059 44071
+44087 44089 44101 44111 44119 44123 44129 44131 44159 44171 44179 44189
+44201 44203 44207 44221 44249 44257 44263 44267 44269 44273 44279 44281
+44293 44351 44357 44371 44381 44383 44389 44417 44449 44453 44483 44491
+44497 44501 44507 44519 44531 44533 44537 44543 44549 44563 44579 44587
+44617 44621 44623 44633 44641 44647 44651 44657 44683 44687 44699 44701
+44711 44729 44741 44753 44771 44773 44777 44789 44797 44809 44819 44839
+44843 44851 44867 44879 44887 44893 44909 44917 44927 44939 44953 44959
+44963 44971 44983 44987 45007 45013 45053 45061 45077 45083 45119 45121
+45127 45131 45137 45139 45161 45179 45181 45191 45197 45233 45247 45259
+45263 45281 45289 45293 45307 45317 45319 45329 45337 45341 45343 45361
+45377 45389 45403 45413 45427 45433 45439 45481 45491 45497 45503 45523
+45533 45541 45553 45557 45569 45587 45589 45599 45613 45631 45641 45659
+45667 45673 45677 45691 45697 45707 45737 45751 45757 45763 45767 45779
+45817 45821 45823 45827 45833 45841 45853 45863 45869 45887 45893 45943
+45949 45953 45959 45971 45979 45989 46021 46027 46049 46051 46061 46073
+46091 46093 46099 46103 46133 46141 46147 46153 46171 46181 46183 46187
+46199 46219 46229 46237 46261 46271 46273 46279 46301 46307 46309 46327
+46337 46349 46351 46381 46399 46411 46439 46441 46447 46451 46457 46471
+46477 46489 46499 46507 46511 46523 46549 46559 46567 46573 46589 46591
+46601 46619 46633 46639 46643 46649 46663 46679 46681 46687 46691 46703
+46723 46727 46747 46751 46757 46769 46771 46807 46811 46817 46819 46829
+46831 46853 46861 46867 46877 46889 46901 46919 46933 46957 46993 46997
+47017 47041 47051 47057 47059 47087 47093 47111 47119 47123 47129 47137
+47143 47147 47149 47161 47189 47207 47221 47237 47251 47269 47279 47287
+47293 47297 47303 47309 47317 47339 47351 47353 47363 47381 47387 47389
+47407 47417 47419 47431 47441 47459 47491 47497 47501 47507 47513 47521
+47527 47533 47543 47563 47569 47581 47591 47599 47609 47623 47629 47639
+47653 47657 47659 47681 47699 47701 47711 47713 47717 47737 47741 47743
+47777 47779 47791 47797 47807 47809 47819 47837 47843 47857 47869 47881
+47903 47911 47917 47933 47939 47947 47951 47963 47969 47977 47981 48017
+48023 48029 48049 48073 48079 48091 48109 48119 48121 48131 48157 48163
+48179 48187 48193 48197 48221 48239 48247 48259 48271 48281 48299 48311
+48313 48337 48341 48353 48371 48383 48397 48407 48409 48413 48437 48449
+48463 48473 48479 48481 48487 48491 48497 48523 48527 48533 48539 48541
+48563 48571 48589 48593 48611 48619 48623 48647 48649 48661 48673 48677
+48679 48731 48733 48751 48757 48761 48767 48779 48781 48787 48799 48809
+48817 48821 48823 48847 48857 48859 48869 48871 48883 48889 48907 48947
+48953 48973 48989 48991 49003 49009 49019 49031 49033 49037 49043 49057
+49069 49081 49103 49109 49117 49121 49123 49139 49157 49169 49171 49177
+49193 49199 49201 49207 49211 49223 49253 49261 49277 49279 49297 49307
+49331 49333 49339 49363 49367 49369 49391 49393 49409 49411 49417 49429
+49433 49451 49459 49463 49477 49481 49499 49523 49529 49531 49537 49547
+49549 49559 49597 49603 49613 49627 49633 49639 49663 49667 49669 49681
+49697 49711 49727 49739 49741 49747 49757 49783 49787 49789 49801 49807
+49811 49823 49831 49843 49853 49871 49877 49891 49919 49921 49927 49937
+49939 49943 49957 49991 49993 49999 50021 50023 50033 50047 50051 50053
+50069 50077 50087 50093 50101 50111 50119 50123 50129 50131 50147 50153
+50159 50177 50207 50221 50227 50231 50261 50263 50273 50287 50291 50311
+50321 50329 50333 50341 50359 50363 50377 50383 50387 50411 50417 50423
+50441 50459 50461 50497 50503 50513 50527 50539 50543 50549 50551 50581
+50587 50591 50593 50599 50627 50647 50651 50671 50683 50707 50723 50741
+50753 50767 50773 50777 50789 50821 50833 50839 50849 50857 50867 50873
+50891 50893 50909 50923 50929 50951 50957 50969 50971 50989 50993 51001
+51031 51043 51047 51059 51061 51071 51109 51131 51133 51137 51151 51157
+51169 51193 51197 51199 51203 51217 51229 51239 51241 51257 51263 51283
+51287 51307 51329 51341 51343 51347 51349 51361 51383 51407 51413 51419
+51421 51427 51431 51437 51439 51449 51461 51473 51479 51481 51487 51503
+51511 51517 51521 51539 51551 51563 51577 51581 51593 51599 51607 51613
+51631 51637 51647 51659 51673 51679 51683 51691 51713 51719 51721 51749
+51767 51769 51787 51797 51803 51817 51827 51829 51839 51853 51859 51869
+51871 51893 51899 51907 51913 51929 51941 51949 51971 51973 51977 51991
+52009 52021 52027 52051 52057 52067 52069 52081 52103 52121 52127 52147
+52153 52163 52177 52181 52183 52189 52201 52223 52237 52249 52253 52259
+52267 52289 52291 52301 52313 52321 52361 52363 52369 52379 52387 52391
+52433 52453 52457 52489 52501 52511 52517 52529 52541 52543 52553 52561
+52567 52571 52579 52583 52609 52627 52631 52639 52667 52673 52691 52697
+52709 52711 52721 52727 52733 52747 52757 52769 52783 52807 52813 52817
+52837 52859 52861 52879 52883 52889 52901 52903 52919 52937 52951 52957
+52963 52967 52973 52981 52999 53003 53017 53047 53051 53069 53077 53087
+53089 53093 53101 53113 53117 53129 53147 53149 53161 53171 53173 53189
+53197 53201 53231 53233 53239 53267 53269 53279 53281 53299 53309 53323
+53327 53353 53359 53377 53381 53401 53407 53411 53419 53437 53441 53453
+53479 53503 53507 53527 53549 53551 53569 53591 53593 53597 53609 53611
+53617 53623 53629 53633 53639 53653 53657 53681 53693 53699 53717 53719
+53731 53759 53773 53777 53783 53791 53813 53819 53831 53849 53857 53861
+53881 53887 53891 53897 53899 53917 53923 53927 53939 53951 53959 53987
+53993 54001 54011 54013 54037 54049 54059 54083 54091 54101 54121 54133
+54139 54151 54163 54167 54181 54193 54217 54251 54269 54277 54287 54293
+54311 54319 54323 54331 54347 54361 54367 54371 54377 54401 54403 54409
+54413 54419 54421 54437 54443 54449 54469 54493 54497 54499 54503 54517
+54521 54539 54541 54547 54559 54563 54577 54581 54583 54601 54617 54623
+54629 54631 54647 54667 54673 54679 54709 54713 54721 54727 54751 54767
+54773 54779 54787 54799 54829 54833 54851 54869 54877 54881 54907 54917
+54919 54941 54949 54959 54973 54979 54983 55001 55009 55021 55049 55051
+55057 55061 55073 55079 55103 55109 55117 55127 55147 55163 55171 55201
+55207 55213 55217 55219 55229 55243 55249 55259 55291 55313 55331 55333
+55337 55339 55343 55351 55373 55381 55399 55411 55439 55441 55457 55469
+55487 55501 55511 55529 55541 55547 55579 55589 55603 55609 55619 55621
+55631 55633 55639 55661 55663 55667 55673 55681 55691 55697 55711 55717
+55721 55733 55763 55787 55793 55799 55807 55813 55817 55819 55823 55829
+55837 55843 55849 55871 55889 55897 55901 55903 55921 55927 55931 55933
+55949 55967 55987 55997 56003 56009 56039 56041 56053 56081 56087 56093
+56099 56101 56113 56123 56131 56149 56167 56171 56179 56197 56207 56209
+56237 56239 56249 56263 56267 56269 56299 56311 56333 56359 56369 56377
+56383 56393 56401 56417 56431 56437 56443 56453 56467 56473 56477 56479
+56489 56501 56503 56509 56519 56527 56531 56533 56543 56569 56591 56597
+56599 56611 56629 56633 56659 56663 56671 56681 56687 56701 56711 56713
+56731 56737 56747 56767 56773 56779 56783 56807 56809 56813 56821 56827
+56843 56857 56873 56891 56893 56897 56909 56911 56921 56923 56929 56941
+56951 56957 56963 56983 56989 56993 56999 57037 57041 57047 57059 57073
+57077 57089 57097 57107 57119 57131 57139 57143 57149 57163 57173 57179
+57191 57193 57203 57221 57223 57241 57251 57259 57269 57271 57283 57287
+57301 57329 57331 57347 57349 57367 57373 57383 57389 57397 57413 57427
+57457 57467 57487 57493 57503 57527 57529 57557 57559 57571 57587 57593
+57601 57637 57641 57649 57653 57667 57679 57689 57697 57709 57713 57719
+57727 57731 57737 57751 57773 57781 57787 57791 57793 57803 57809 57829
+57839 57847 57853 57859 57881 57899 57901 57917 57923 57943 57947 57973
+57977 57991 58013 58027 58031 58043 58049 58057 58061 58067 58073 58099
+58109 58111 58129 58147 58151 58153 58169 58171 58189 58193 58199 58207
+58211 58217 58229 58231 58237 58243 58271 58309 58313 58321 58337 58363
+58367 58369 58379 58391 58393 58403 58411 58417 58427 58439 58441 58451
+58453 58477 58481 58511 58537 58543 58549 58567 58573 58579 58601 58603
+58613 58631 58657 58661 58679 58687 58693 58699 58711 58727 58733 58741
+58757 58763 58771 58787 58789 58831 58889 58897 58901 58907 58909 58913
+58921 58937 58943 58963 58967 58979 58991 58997 59009 59011 59021 59023
+59029 59051 59053 59063 59069 59077 59083 59093 59107 59113 59119 59123
+59141 59149 59159 59167 59183 59197 59207 59209 59219 59221 59233 59239
+59243 59263 59273 59281 59333 59341 59351 59357 59359 59369 59377 59387
+59393 59399 59407 59417 59419 59441 59443 59447 59453 59467 59471 59473
+59497 59509 59513 59539 59557 59561 59567 59581 59611 59617 59621 59627
+59629 59651 59659 59663 59669 59671 59693 59699 59707 59723 59729 59743
+59747 59753 59771 59779 59791 59797 59809 59833 59863 59879 59887 59921
+59929 59951 59957 59971 59981 59999 60013 60017 60029 60037 60041 60077
+60083 60089 60091 60101 60103 60107 60127 60133 60139 60149 60161 60167
+60169 60209 60217 60223 60251 60257 60259 60271 60289 60293 60317 60331
+60337 60343 60353 60373 60383 60397 60413 60427 60443 60449 60457 60493
+60497 60509 60521 60527 60539 60589 60601 60607 60611 60617 60623 60631
+60637 60647 60649 60659 60661 60679 60689 60703 60719 60727 60733 60737
+60757 60761 60763 60773 60779 60793 60811 60821 60859 60869 60887 60889
+60899 60901 60913 60917 60919 60923 60937 60943 60953 60961 61001 61007
+61027 61031 61043 61051 61057 61091 61099 61121 61129 61141 61151 61153
+61169 61211 61223 61231 61253 61261 61283 61291 61297 61331 61333 61339
+61343 61357 61363 61379 61381 61403 61409 61417 61441 61463 61469 61471
+61483 61487 61493 61507 61511 61519 61543 61547 61553 61559 61561 61583
+61603 61609 61613 61627 61631 61637 61643 61651 61657 61667 61673 61681
+61687 61703 61717 61723 61729 61751 61757 61781 61813 61819 61837 61843
+61861 61871 61879 61909 61927 61933 61949 61961 61967 61979 61981 61987
+61991 62003 62011 62017 62039 62047 62053 62057 62071 62081 62099 62119
+62129 62131 62137 62141 62143 62171 62189 62191 62201 62207 62213 62219
+62233 62273 62297 62299 62303 62311 62323 62327 62347 62351 62383 62401
+62417 62423 62459 62467 62473 62477 62483 62497 62501 62507 62533 62539
+62549 62563 62581 62591 62597 62603 62617 62627 62633 62639 62653 62659
+62683 62687 62701 62723 62731 62743 62753 62761 62773 62791 62801 62819
+62827 62851 62861 62869 62873 62897 62903 62921 62927 62929 62939 62969
+62971 62981 62983 62987 62989 63029 63031 63059 63067 63073 63079 63097
+63103 63113 63127 63131 63149 63179 63197 63199 63211 63241 63247 63277
+63281 63299 63311 63313 63317 63331 63337 63347 63353 63361 63367 63377
+63389 63391 63397 63409 63419 63421 63439 63443 63463 63467 63473 63487
+63493 63499 63521 63527 63533 63541 63559 63577 63587 63589 63599 63601
+63607 63611 63617 63629 63647 63649 63659 63667 63671 63689 63691 63697
+63703 63709 63719 63727 63737 63743 63761 63773 63781 63793 63799 63803
+63809 63823 63839 63841 63853 63857 63863 63901 63907 63913 63929 63949
+63977 63997 64007 64013 64019 64033 64037 64063 64067 64081 64091 64109
+64123 64151 64153 64157 64171 64187 64189 64217 64223 64231 64237 64271
+64279 64283 64301 64303 64319 64327 64333 64373 64381 64399 64403 64433
+64439 64451 64453 64483 64489 64499 64513 64553 64567 64577 64579 64591
+64601 64609 64613 64621 64627 64633 64661 64663 64667 64679 64693 64709
+64717 64747 64763 64781 64783 64793 64811 64817 64849 64853 64871 64877
+64879 64891 64901 64919 64921 64927 64937 64951 64969 64997 65003 65011
+65027 65029 65033 65053 65063 65071 65089 65099 65101 65111 65119 65123
+65129 65141 65147 65167 65171 65173 65179 65183 65203 65213 65239 65257
+65267 65269 65287 65293 65309 65323 65327 65353 65357 65371 65381 65393
+65407 65413 65419 65423 65437 65447 65449 65479 65497 65519 65521 );
+
+my $l;
+my @used;
+my @gens;
+
+sub rsaparams {
+ my (%params) = @_;
+ @used = ();
+ my %paramsrsa = (%params, (Relprime => 1));
+ my $p = maurer (%paramsrsa); print "\n" if $params{Verbosity};
+ my $q = maurer (%paramsrsa); print "\n" if $params{Verbosity};
+ return { p => $p, q => $q, e => 65537 }
+}
+
+sub maurer {
+
+ my ( %params ) = @_;
+
+ my $k = $params { Size }; #-- bitsize of the required prime.
+ my $v = $params { Verbosity }; #-- process reporting verbosity.
+ #-- whether to find intermediate generators.
+ my $p0 = 20; #-- generate primes of bitsize less
+ #-- than $p0 with nextprime().
+ my $maxfact = 140; #-- bitsize of the biggest number we
+ #-- can factor easily.
+ $| = 1;
+
+ if ( $k <= $p0 ) {
+ my $spr = makerandom Size => $k;
+ return Math::Pari::nextprime ( $spr );
+ }
+
+ my $c_opt = 0.09; my $m = 20;
+ my $B = floor ( $c_opt * ( $k ** 2 ) );
+ my $r = PARI ( 2 ** ( ( rand ) - 1 ) );
+ srand ( makerandom ( Size => 32, Strength => 0 ) );
+
+ if ( $k > ( 2 * $m ) ) {
+ my $frs = 0; until ( $frs ) {
+ $r = 2 ** ( (rand) - 1 );
+ my $rbits = $k-($r*$k);
+ $frs = 1 if $rbits > $m;
+ $frs = 0 if ($params{Generator} && ($rbits > $maxfact));
+ }
+ } else {
+ $r = 0.5;
+ }
+
+ my $q = maurer ( Size => floor ( $r * $k ) + 2, Verbosity => $v,
+ Generator => $params{Generator}, Intermediates => $params{Intermediates} );
+ if ($params{Relprime}) {
+ while ((grep /$q/, @used)) {
+ print "<" if $v == 1;
+ $q = maurer ( Size => floor ( $r * $k ) + 2, Verbosity => $v, Relprime => 1,
+ Generator => $params{Generator}, Intermediates => $params{Intermediates} );
+ }
+ }
+ $q = $q->{Prime} if (ref $q eq 'HASH');
+
+ print "B = $B, r = $r, k = $k, q = $q\n" if $v == 2;
+ push @used, $q;
+
+ my $o1 = PARI ( 2 * $q );
+ my $o2 = PARI '2' ** PARI "@{[$k - 1]}";
+ my $I = floor ( $o2 / $o1 );
+ my $n = PARI ();
+
+ while (1) {
+
+ my $R = PARI ( makerandom_itv ( Lower => $I + 1, Upper => 2 * $I ) );
+ $n = floor( 2 * $R * $q + 1 );
+ print "n = $n\n" if $v == 2;
+ print "." if $v == 1;
+
+ my $a = PARI();
+ if ( trialdiv ( $n, $B ) ) {
+ BASE: {
+ print "(passes trial division)\n" if $v == 2; print "+" if $v == 1;
+ $a = makerandom_itv( Lower => 2, Upper=> $n - 2 );
+ $a = makerandom_itv( Lower => 2, Upper=> $R ) if $params{Generator};
+ my $t1 = Mod (2, $n); my $t2 = Mod ($a, $n);
+ my $b = $t2 ** ( $n - 1 );
+ if ( ($b == 1) && ( $q > $n ** (1/3.0) ) ) {
+ print "$n is prime! a = $a, R = $R\n" if $v == 2;
+ print "($k)" if $v == 1;
+ my @s;
+ if ($params{Generator}) {
+ print "computing a generator...\n" if $v == 2;
+ print "# " if $v == 1;
+ @s = Math::Pari::factor($R) =~ m:[\[\(\;](\d+)(?=,):g;
+ push @s, ($q,2); my $p = PARI (1); for (@s) { $p *= $_ };
+ for (@s) { my $b = Mod ($a, $p) ** PARI($p/$_);
+ if ($b == 1) {
+ print "@!" if $v == 1;
+ print "$a is not a generator\n" if $v == 2;
+ next BASE;
+ }
+ }
+ }
+ my @factors = ( Factors => \@s, R => $R ) if $params{Factors};
+ my @intermediates = ( Intermediates => \@used ) if $params{Intermediates};
+ return { @factors, @intermediates, Prime => $n, Generator => $a } if $params{Generator};
+ return { @factors, @intermediates, Prime => $n } if $params{Factors} or $params{Intermediates};
+ return $n;
+ }
+ }
+
+ }
+
+ }
+
+}
+
+
+sub trialdiv {
+
+ my ( $n, $limit, $v ) = @_;
+
+ my $end = _trialdiv_limit ( $n, $limit );
+ for ( $i=0; $i <= $end; $i++ ) {
+ return undef unless Math::Pari::gmod ( $n, $PRIMES[ $i ] );
+ }
+
+ return 1;
+
+}
+
+
+sub _trialdiv_limit {
+
+ my ($n, $limit) = @_;
+ my $start = 0;
+ my $mid;
+ my $end = $#PRIMES;
+ $limit = int(sqrt($n)) unless $limit;
+
+ if ( $limit <= $PRIMES[ $end ] ) {
+ while ( ( $start + 1 ) != $end ) {
+ use integer;
+ $mid = int (( $end + $start ) / 2);
+ no integer;
+ $start = $mid if $limit > $PRIMES[ $mid ];
+ $end = $mid if $limit <= $PRIMES[ $mid ];
+ }
+ }
+
+ return $end;
+
+}
+
+"True Value";
+
+
+=head1 NAME
+
+Crypt::Primes - Provable Prime Number Generator suitable for Cryptographic Applications.
+
+=head1 VERSION
+
+ $Revision: 0.49 $
+ $Date: 2001/06/11 01:04:23 $
+
+=head1 SYNOPSIS
+
+ # generate a random, provable 512-bit prime.
+
+ use Crypt::Primes qw(maurer);
+ my $prime = maurer (Size => 512);
+
+ # generate a random, provable 2048-bit prime and report
+ # progress on console.
+
+ my $another_prime = maurer (
+ Size => 2048,
+ Verbosity => 1
+ );
+
+
+ # generate a random 1024-bit prime and a group
+ # generator of Z*(n).
+
+ my $hash_ref = maurer (
+ Size => 1024,
+ Generator => 1,
+ Verbosity => 1
+ );
+
+=head1 WARNING
+
+The codebase is stable, but the API will most definitely change in a future
+release.
+
+=head1 DESCRIPTION
+
+This module implements Ueli Maurer's algorithm for generating large
+I<provable> primes and secure parameters for public-key cryptosystems. The
+generated primes are almost uniformly distributed over the set of primes of
+the specified bitsize and expected time for generation is less than the time
+required for generating a pseudo-prime of the same size with Miller-Rabin
+tests. Detailed description and running time analysis of the algorithm can
+be found in Maurer's paper[1].
+
+Crypt::Primes is a pure perl implementation. It uses Math::Pari for
+multiple precision integer arithmetic and number theoretic functions.
+Random numbers are gathered with Crypt::Random, a perl interface to
+/dev/u?random devices found on most modern Unix operating systems.
+
+=head1 FUNCTIONS
+
+The following functions are availble for import. They must be explicitely
+imported.
+
+=over 4
+
+=item B<maurer(%params)>
+
+Generates a prime number of the specified bitsize. Takes a hash as
+parameter and returns a Math::Pari object (prime number) or a hash reference
+(prime number and generator) when group generator computation is requested.
+Following hash keys are understood:
+
+=back
+
+=over 0
+
+=item B<Size>
+
+Bitsize of the required prime number.
+
+=item B<Verbosity>
+
+Level of verbosity of progress reporting. Report is printed on STDOUT.
+Level of 1 indicates normal, terse reporting. Level of 2 prints lots of
+intermediate computations, useful for debugging.
+
+=item B<Generator>
+
+When Generator key is set to a non-zero value, a group generator of Z*(n) is
+computed. Group generators are required key material in public-key
+cryptosystems like Elgamal and Diffie-Hellman that are based on
+intractability of the discrete logarithm problem. When this option is
+present, maurer() returns a hash reference that contains two keys, Prime and
+Generator.
+
+=item B<Relprime>
+
+When set to 1, maurer() stores intermediate primes in a class array, and
+ensures they are not used during construction of primes in the future calls
+to maurer() with Reprime => 1. This is used by rsaparams().
+
+=item B<Intermediates>
+
+When set to 1, maurer() returns a hash reference that contains
+(corresponding to the key 'Intermediates') a reference to an array of
+intermediate primes generated.
+
+=item B<Factors>
+
+When set to 1, maurer() returns a hash reference that contains
+(corresponding to the key 'Factors') a reference to an array of
+factors of p-1 where p is the prime generated, and also (corresponding
+to the key 'R') a divisor of p.
+
+=back
+
+=over 4
+
+=item B<rsaparams(%params)>
+
+Generates two primes (p,q) and public exponent (e) of a RSA key pair. The
+key pair generated with this method is resistant to iterative encryption
+attack. See Appendix 2 of
+[1] for more information.
+
+rsaparams() takes the same arguments as maurer() with the exception of
+`Generator' and `Relprime'. Size specifies the common bitsize of p an q.
+Returns a hash reference with keys p, q and e.
+
+=item B<trialdiv($n,$limit)>
+
+Performs trial division on $n to ensure it's not divisible by any prime
+smaller than or equal to $limit. The module maintains a lookup table of
+primes (from 2 to 65521) for this purpose. If $limit is not provided, a
+suitable value is computed automatically. trialdiv() is used by maurer() to
+weed out composite random numbers before performing computationally
+intensive modular exponentiation tests. It is, however, documented should
+you need to use it directly.
+
+=back
+
+=head1 IMPLEMENTATION NOTE
+
+This module implements a modified FastPrime, as described in [1], to
+facilitate group generator computation. (Refer to [1] and [2] for
+description and pseudo-code of FastPrime). The modification involves
+introduction of an additional constraint on relative size r of q. While
+computing r, we ensure k * r is always greater than maxfact, where maxfact
+is the bitsize of the largest number we can factor easily. This value
+defaults to 140 bits. As a result, R is always smaller than maxfact, which
+allows us to get a complete factorization of 2Rq and use it to find a
+generator of the cyclic group Z*(2Rq).
+
+=head1 RUNNING TIME
+
+Crypt::Primes generates 512-bit primes in 7 seconds (on average), and
+1024-bit primes in 37 seconds (on average), on my PII 300 Mhz notebook.
+There are no computational limits by design; primes upto 8192-bits were
+generated to stress test the code. For detailed runtime analysis see [1].
+
+=head1 SEE ALSO
+
+largeprimes(1), Crypt::Random(3), Math::Pari(3)
+
+=head1 BIBLIOGRAPHY
+
+=over 4
+
+=item 1 Fast Generation of Prime Numbers and Secure Public-Key Cryptographic
+Parameters, Ueli Maurer (1994).
+
+=item 2 Corrections to Fast Generation of Prime Numbers and Secure Public-Key
+Cryptographic Parameters, Ueli Maurer (1996).
+
+=item 3 Handbook of Applied Cryptography by Menezes, Paul C. van Oorschot
+and Scott Vanstone (1997).
+
+=item Documents 1 & 2 can be found under docs/ of the source distribution.
+
+=back
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=cut
+
+=head1 LICENSE
+
+Copyright (c) 1998-2001, Vipul Ved Prakash. All rights reserved. This code
+is free software; you can redistribute it and/or modify it under the same
+terms as Perl itself.
+
+=head1 TODO
+
+Maurer's algorithm generates primes of progressively larger bitsize using
+a recursive construction method. The algorithm enters recursion with a
+prime number and bitsize of the next prime to be generated. (Bitsizes of
+the intermediate primes are computed using a probability distribution that
+ensures generated primes are sufficiently random.) This recursion can be
+distributed over multiple machines, participating in a competitive
+computation model, to achieve close to best running time of the algorithm.
+Support for this will be implemented some day, possibly when the next
+version of Penguin hits CPAN.
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RIPEMD160.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RIPEMD160.pm
new file mode 100755
index 00000000000..001e76ef4b5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RIPEMD160.pm
@@ -0,0 +1,280 @@
+package Crypt::RIPEMD160;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+
+require Exporter;
+require DynaLoader;
+require AutoLoader;
+@ISA = qw(Exporter AutoLoader DynaLoader);
+
+# Items to export into callers namespace by default
+@EXPORT = qw();
+
+@EXPORT_OK = qw();
+
+$VERSION = '0.04';
+
+bootstrap Crypt::RIPEMD160 $VERSION;
+
+#package RIPEMD160; # Package-Definition like in Crypt::IDEA
+
+#use strict;
+use Carp;
+
+sub addfile
+{
+ no strict 'refs';
+ my ($self, $handle) = @_;
+ my ($package, $file, $line) = caller;
+ my ($data);
+
+ if (!ref($handle)) {
+ $handle = $package . "::" . $handle unless ($handle =~ /(\:\:|\')/);
+ }
+ while (read($handle, $data, 8192)) {
+ $self->add($data);
+ }
+}
+
+sub hexdigest
+{
+ my ($self) = shift;
+ my ($tmp);
+
+ $tmp = unpack("H*", ($self->digest()));
+ return(substr($tmp, 0,8) . " " . substr($tmp, 8,8) . " " .
+ substr($tmp,16,8) . " " . substr($tmp,24,8) . " " .
+ substr($tmp,32,8));
+}
+
+sub hash
+{
+ my($self, $data) = @_;
+
+ if (ref($self)) {
+ $self->reset();
+ } else {
+ $self = new Crypt::RIPEMD160;
+ }
+ $self->add($data);
+ $self->digest();
+}
+
+sub hexhash
+{
+ my($self, $data) = @_;
+
+ if (ref($self)) {
+ $self->reset();
+ } else {
+ $self = new Crypt::RIPEMD160;
+ }
+ $self->add($data);
+ $self->hexdigest();
+}
+
+1;
+__END__
+# Below is the stub of documentation for your module. You better edit it!
+
+=head1 NAME
+
+Crypt::RIPEMD160 - Perl extension for the RIPEMD-160 Hash function
+
+=head1 SYNOPSIS
+
+ use Crypt::RIPEMD160;
+
+ $context = new Crypt::RIPEMD160;
+ $context->reset();
+
+ $context->add(LIST);
+ $context->addfile(HANDLE);
+
+ $digest = $context->digest();
+ $string = $context->hexdigest();
+
+ $digest = Crypt::RIPEMD160->hash(SCALAR);
+ $string = Crypt::RIPEMD160->hexhash(SCALAR);
+
+=head1 DESCRIPTION
+
+The B<Crypt::RIPEMD160> module allows you to use the RIPEMD160
+Message Digest algorithm from within Perl programs.
+
+The module is based on the implementation from Antoon Bosselaers from
+Katholieke Universiteit Leuven.
+
+A new RIPEMD160 context object is created with the B<new> operation.
+Multiple simultaneous digest contexts can be maintained, if desired.
+The context is updated with the B<add> operation which adds the
+strings contained in the I<LIST> parameter. Note, however, that
+C<add('foo', 'bar')>, C<add('foo')> followed by C<add('bar')> and
+C<add('foobar')> should all give the same result.
+
+The final message digest value is returned by the B<digest> operation
+as a 20-byte binary string. This operation delivers the result of
+B<add> operations since the last B<new> or B<reset> operation. Note
+that the B<digest> operation is effectively a destructive, read-once
+operation. Once it has been performed, the context must be B<reset>
+before being used to calculate another digest value.
+
+Several convenience functions are also provided. The B<addfile>
+operation takes an open file-handle and reads it until end-of file in
+8192 byte blocks adding the contents to the context. The file-handle
+can either be specified by name or passed as a type-glob reference, as
+shown in the examples below. The B<hexdigest> operation calls
+B<digest> and returns the result as a printable string of hexdecimal
+digits. This is exactly the same operation as performed by the
+B<unpack> operation in the examples below.
+
+The B<hash> operation can act as either a static member function (ie
+you invoke it on the RIPEMD160 class as in the synopsis above) or as a
+normal virtual function. In both cases it performs the complete RIPEMD160
+cycle (reset, add, digest) on the supplied scalar value. This is
+convenient for handling small quantities of data. When invoked on the
+class a temporary context is created. When invoked through an already
+created context object, this context is used. The latter form is
+slightly more efficient. The B<hexhash> operation is analogous to
+B<hexdigest>.
+
+=head1 EXAMPLES
+
+ use Crypt::RIPEMD160;
+
+ $ripemd160 = new Crypt::RIPEMD160;
+ $ripemd160->add('foo', 'bar');
+ $ripemd160->add('baz');
+ $digest = $ripemd160->digest();
+
+ print("Digest is " . unpack("H*", $digest) . "\n");
+
+The above example would print out the message
+
+ Digest is f137cb536c05ec2bc97e73327937b6e81d3a4cc9
+
+provided that the implementation is working correctly.
+
+Remembering the Perl motto ("There's more than one way to do it"), the
+following should all give the same result:
+
+ use Crypt::RIPEMD160;
+ $ripemd160 = new Crypt::RIPEMD160;
+
+ die "Can't open /etc/passwd ($!)\n" unless open(P, "/etc/passwd");
+
+ seek(P, 0, 0);
+ $ripemd160->reset;
+ $ripemd160->addfile(P);
+ $d = $ripemd160->hexdigest;
+ print "addfile (handle name) = $d\n";
+
+ seek(P, 0, 0);
+ $ripemd160->reset;
+ $ripemd160->addfile(\*P);
+ $d = $ripemd160->hexdigest;
+ print "addfile (type-glob reference) = $d\n";
+
+ seek(P, 0, 0);
+ $ripemd160->reset;
+ while (<P>)
+ {
+ $ripemd160->add($_);
+ }
+ $d = $ripemd160->hexdigest;
+ print "Line at a time = $d\n";
+
+ seek(P, 0, 0);
+ $ripemd160->reset;
+ $ripemd160->add(<P>);
+ $d = $ripemd160->hexdigest;
+ print "All lines at once = $d\n";
+
+ seek(P, 0, 0);
+ $ripemd160->reset;
+ while (read(P, $data, (rand % 128) + 1))
+ {
+ $ripemd160->add($data);
+ }
+ $d = $ripemd160->hexdigest;
+ print "Random chunks = $d\n";
+
+ seek(P, 0, 0);
+ $ripemd160->reset;
+ undef $/;
+ $data = <P>;
+ $d = $ripemd160->hexhash($data);
+ print "Single string = $d\n";
+
+ close(P);
+
+=head1 NOTE
+
+The RIPEMD160 extension may be redistributed under the same terms as Perl.
+The RIPEMD160 algorithm is published in "Fast Software Encryption, LNCS 1039,
+D. Gollmann (Ed.), pp.71-82".
+
+The basic C code implementing the algorithm is covered by the
+following copyright:
+
+=over 1
+
+C<
+/********************************************************************\
+ *
+ * FILE: rmd160.c
+ *
+ * CONTENTS: A sample C-implementation of the RIPEMD-160
+ * hash-function.
+ * TARGET: any computer with an ANSI C compiler
+ *
+ * AUTHOR: Antoon Bosselaers, ESAT-COSIC
+ * DATE: 1 March 1996
+ * VERSION: 1.0
+ *
+ * Copyright (c) Katholieke Universiteit Leuven
+ * 1996, All Rights Reserved
+ *
+\********************************************************************/
+>
+
+=back
+
+=head1 RIPEMD-160 test suite results (ASCII):
+
+C<
+* message: "" (empty string)
+ hashcode: 9c1185a5c5e9fc54612808977ee8f548b2258d31
+* message: "a"
+ hashcode: 0bdc9d2d256b3ee9daae347be6f4dc835a467ffe
+* message: "abc"
+ hashcode: 8eb208f7e05d987a9b044a8e98c6b087f15a0bfc
+* message: "message digest"
+ hashcode: 5d0689ef49d2fae572b881b123a85ffa21595f36
+* message: "abcdefghijklmnopqrstuvwxyz"
+ hashcode: f71c27109c692c1b56bbdceb5b9d2865b3708dbc
+* message: "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+ hashcode: 12a053384a9c0c88e405a06c27dcf49ada62eb2b
+* message: "A...Za...z0...9"
+ hashcode: b0e20b6e3116640286ed3a87a5713079b21f5189
+* message: 8 times "1234567890"
+ hashcode: 9b752e45573d4b39f4dbd3323cab82bf63326bfb
+* message: 1 million times "a"
+ hashcode: 52783243c1697bdbe16d37f97f68f08325dc1528
+>
+
+This copyright does not prohibit distribution of any version of Perl
+containing this extension under the terms of the GNU or Artistic
+licences.
+
+=head1 AUTHOR
+
+The RIPEMD-160 interface was written by Christian H. Geuer-Pollmann (CHGEUER)
+(C<geuer-pollmann@nue.et-inf.uni.siegen.de>) and Ken Neighbors (C<ken@nsds.com>).
+
+=head1 SEE ALSO
+
+MD5(3pm) and SHA(1).
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RIPEMD160/MAC.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RIPEMD160/MAC.pm
new file mode 100755
index 00000000000..092d4a45a7b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RIPEMD160/MAC.pm
@@ -0,0 +1,162 @@
+package Crypt::RIPEMD160::MAC;
+
+use Crypt::RIPEMD160 0.03;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT);
+
+require Exporter;
+@ISA = qw(Exporter);
+
+# Items to export into callers namespace by default
+@EXPORT = qw();
+$VERSION = '0.01';
+
+sub new {
+ my($pkg, $key) = @_;
+
+ my $self = {
+ 'key' => $key,
+ 'hash' => new Crypt::RIPEMD160,
+ 'k_ipad' => chr(0x36) x 64,
+ 'k_opad' => chr(0x5c) x 64,
+ };
+
+ bless $self, $pkg;
+
+ if (length($self->{'key'}) > 64) {
+ $self->{'key'} = Crypt::RIPEMD160->hash($self->{'key'});
+ }
+
+ $self->{'k_ipad'} ^= $self->{'key'};
+ $self->{'k_opad'} ^= $self->{'key'};
+
+ $self->{'hash'}->add($self->{'k_ipad'});
+
+ return $self;
+}
+
+sub reset {
+ my($self) = @_;
+
+ $self->{'hash'}->reset();
+ $self->{'k_ipad'} = chr(0x36) x 64;
+ $self->{'k_opad'} = chr(0x5c) x 64;
+
+ if (length($self->{'key'}) > 64) {
+ $self->{'key'} = Crypt::RIPEMD160->hash($self->{'key'});
+ }
+
+ $self->{'k_ipad'} ^= $self->{'key'};
+ $self->{'k_opad'} ^= $self->{'key'};
+
+ $self->{'hash'}->add($self->{'k_ipad'});
+
+ return $self;
+}
+
+sub add {
+ my($self, @data) = @_;
+
+ $self->{'hash'}->add(@data);
+}
+
+sub addfile
+{
+ no strict 'refs';
+ my ($self, $handle) = @_;
+ my ($package, $file, $line) = caller;
+ my ($data);
+
+ if (!ref($handle)) {
+ $handle = $package . "::" . $handle unless ($handle =~ /(\:\:|\')/);
+ }
+ while (read($handle, $data, 8192)) {
+ $self->{'hash'}->add($data);
+ }
+}
+
+sub mac {
+ my($self) = @_;
+
+ my($inner) = $self->{'hash'}->digest();
+
+ my($outer) = Crypt::RIPEMD160->hash($self->{'k_opad'}.$inner);
+
+ $self->{'key'} = "";
+ $self->{'k_ipad'} = "";
+ $self->{'k_opad'} = "";
+
+ return($outer);
+}
+
+sub hexmac {
+ my($self) = @_;
+
+ my($inner) = $self->{'hash'}->digest();
+
+ my($outer) = Crypt::RIPEMD160->hexhash($self->{'k_opad'}.$inner);
+
+ $self->{'key'} = "";
+ $self->{'k_ipad'} = "";
+ $self->{'k_opad'} = "";
+
+ return($outer);
+}
+
+1;
+__END__
+# Below is the stub of documentation for your module. You better edit it!
+
+=head1 NAME
+
+Crypt::RIPEMD160::MAC - Perl extension for RIPEMD-160 MAC function
+
+=head1 SYNOPSIS
+
+ use Crypt::RIPEMD160::MAC;
+
+ $key = "This is the secret key";
+
+ $mac = new Crypt::RIPEMD160::MAC($key);
+
+ $mac->reset();
+
+ $mac->add(LIST);
+ $mac->addfile(HANDLE);
+
+ $digest = $mac->mac();
+ $string = $mac->hexmac();
+
+=head1 DESCRIPTION
+
+The B<Crypt::RIPEMD160> module allows you to use the RIPEMD160
+Message Digest algorithm from within Perl programs.
+
+=head1 EXAMPLES
+
+ use Crypt::RIPEMD160;
+
+ $ripemd160 = new Crypt::RIPEMD160;
+ $ripemd160->add('foo', 'bar');
+ $ripemd160->add('baz');
+ $digest = $ripemd160->digest();
+
+ print("Digest is " . unpack("H*", $digest) . "\n");
+
+The above example would print out the message
+
+ Digest is f137cb536c05ec2bc97e73327937b6e81d3a4cc9
+
+provided that the implementation is working correctly.
+
+=head1 AUTHOR
+
+The RIPEMD-160 interface was written by Christian H. Geuer
+(C<christian.geuer@crypto.gun.de>).
+
+=head1 SEE ALSO
+
+MD5(3pm) and SHA(1).
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA.pm
new file mode 100755
index 00000000000..5a3d3bcfb9e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA.pm
@@ -0,0 +1,617 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA - Pure-perl implementation of RSA encryption/signing
+## algorithms.
+##
+## Copyright (c) 2000-2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: RSA.pm,v 1.48 2001/09/25 12:44:55 vipul Exp $
+
+package Crypt::RSA;
+use FindBin qw($Bin);
+use lib "$Bin/../../lib";
+use strict;
+use base 'Class::Loader';
+use base 'Crypt::RSA::Errorhandler';
+use Crypt::RSA::Key;
+use Crypt::RSA::DataFormat qw(steak octet_len);
+use Convert::ASCII::Armour;
+use Carp;
+
+$Crypt::RSA::VERSION = '1.99'; # change this elsewhere too!
+
+my %DEFAULTS = (
+ 'ES' => { Name => 'OAEP_ES' },
+ 'SS' => { Name => 'PSS_SS' },
+ 'PP' => { Name => 'ASCII_PP' },
+);
+
+
+my %KNOWNMAP = (
+
+ # ENCRYPTION SCHEMES
+
+ OAEP_ES => { Module => "Crypt::RSA::ES::OAEP" },
+ PKCS1v21_ES => { Module => "Crypt::RSA::ES::OAEP" },
+ PKCS1v15_ES => { Module => "Crypt::RSA::ES::PKCS1v15" },
+
+ # SIGNATURE SCHEMES
+
+ PSS_SS => { Module => "Crypt::RSA::SS::PSS" },
+ PKCS1v21_SS => { Module => "Crypt::RSA::SS::PSS" },
+ PKCS1v15_SS => { Module => "Crypt::RSA::SS::PKCS1v15" },
+
+ # POST PROCESSORS
+
+ ASCII_PP => { Module => "Convert::ASCII::Armour" },
+
+);
+
+
+sub new {
+
+ my ($class, %params) = @_;
+ my %self = (%DEFAULTS, %params);
+ my $self = bless \%self, $class;
+
+ $self->_storemap (%KNOWNMAP);
+
+ for (qw(ES SS PP)) {
+ $$self{$_} = { Name => $$self{$_} . "_$_" } unless ref $$self{$_};
+ $$self{lc($_)} = $self->_load ( %{$$self{$_}} );
+ }
+
+ $$self{keychain} = new Crypt::RSA::Key;
+
+ return bless \%self, $class;
+
+}
+
+
+sub keygen {
+
+ my ($self, %params) = @_;
+ $params{KF} = $$self{KF} if $$self{KF};
+
+ my @keys;
+ return (@keys = $self->{keychain}->generate (%params))
+ ? @keys
+ : $self->error ($self->{keychain}->errstr);
+
+}
+
+
+sub encrypt {
+
+ my ($self, %params) = @_;
+ my $plaintext = $params{Message} || $params{Plaintext};
+ my $key = $params{Key};
+
+ return $self->error ($key->errstr, \%params, $key, \$plaintext)
+ unless $key->check();
+
+ my $blocksize = blocksize ( $$self{es}->encryptblock (Key => $key),
+ length($plaintext)
+ );
+
+ return $self->error("Message too long.", \$key, \%params) if $blocksize <= 0;
+
+ my $cyphertext;
+ my @segments = steak ($plaintext, $blocksize);
+ for (@segments) {
+ $cyphertext .= $self->{es}->encrypt (Message => $_, Key => $key)
+ || return $self->error ($self->{es}->errstr, \$key, \%params);
+ }
+
+ if ($params{Armour} || $params{Armor}) {
+ $cyphertext = $self->{pp}->armour (
+ Object => 'RSA ENCRYPTED MESSAGE',
+ Headers => {
+ Scheme => $$self{ES}{Module} || ${$KNOWNMAP{$$self{ES}{Name}}}{Module},
+ Version => $self->{es}->version()
+ },
+ Content => { Cyphertext => $cyphertext },
+ Compress => 1,
+ );
+ }
+
+ return $cyphertext;
+
+}
+
+
+sub decrypt {
+
+ my ($self , %params) = @_;
+ my $cyphertext = $params{Cyphertext} || $params{Ciphertext};
+ my $key = $params{Key};
+
+ return $self->error ($key->errstr, \%params, $key) unless $key->check();
+
+ if ($params{Armour} || $params{Armor}) {
+ my $decoded = $self->{pp}->unarmour ($cyphertext) ||
+ return $self->error ($self->{pp}->errstr());
+ $cyphertext = $$decoded{Content}{Cyphertext}
+ }
+
+ my $plaintext;
+ my $blocksize = blocksize ( $$self{es}->decryptblock (Key => $key),
+ length($cyphertext)
+ );
+
+ return $self->error("Message too long.") if $blocksize <= 0;
+
+ my @segments = steak ($cyphertext, $blocksize);
+ for (@segments) {
+ $plaintext .= $self->{es}->decrypt (Cyphertext=> $_, Key => $key)
+ || return $self->error ($self->{es}->errstr, \$key, \%params);
+ }
+
+ return $plaintext;
+
+}
+
+
+sub sign {
+
+ my ($self, %params) = @_;
+ my $signature = $self->{ss}->sign (%params)
+ || return $self->error ($self->{ss}->errstr,
+ $params{Key}, \%params);
+
+ if ($params{Armour} || $params{Armor}) {
+ $signature = $self->{pp}->armour (
+ Object => "RSA SIGNATURE",
+ Headers => {
+ Scheme => $$self{SS}{Module} || ${$KNOWNMAP{$$self{SS}{Name}}}{Module},
+ Version => $self->{ss}->version() },
+ Content => { Signature => $signature },
+ );
+ }
+
+ return $signature;
+
+}
+
+
+sub verify {
+
+ my ($self, %params) = @_;
+
+ if ($params{Armour} || $params{Armor}) {
+ my $decoded = $self->{pp}->unarmour ($params{Signature}) ||
+ return $self->error ($self->{pp}->errstr());
+ $params{Signature} = $$decoded{Content}{Signature}
+ }
+
+ my $verify = $self->{ss}->verify (%params) ||
+ return $self->error ($self->{ss}->errstr, $params{Key}, \%params);
+
+ return $verify;
+
+}
+
+
+sub blocksize {
+
+ my ($blocksize, $ptsize) = @_;
+ return $ptsize if $blocksize == -1;
+ return 0 if $blocksize < 1;
+ return $blocksize;
+
+}
+
+1;
+
+
+=head1 NAME
+
+Crypt::RSA - RSA public-key cryptosystem.
+
+=head1 SYNOPSIS
+
+ my $rsa = new Crypt::RSA;
+
+ my ($public, $private) =
+ $rsa->keygen (
+ Identity => 'Lord Macbeth <macbeth@glamis.com>',
+ Size => 1024,
+ Password => 'A day so foul & fair',
+ Verbosity => 1,
+ ) or die $rsa->errstr();
+
+
+ my $cyphertext =
+ $rsa->encrypt (
+ Message => $message,
+ Key => $public,
+ Armour => 1,
+ ) || die $rsa->errstr();
+
+
+ my $plaintext =
+ $rsa->decrypt (
+ Cyphertext => $cyphertext,
+ Key => $private,
+ Armour => 1,
+ ) || die $rsa->errstr();
+
+
+ my $signature =
+ $rsa->sign (
+ Message => $message,
+ Key => $private
+ ) || die $rsa->errstr();
+
+
+ my $verify =
+ $rsa->verify (
+ Message => $message,
+ Signature => $signature,
+ Key => $public
+ ) || die $rsa->errstr();
+
+=head1 NOTE
+
+This manual assumes familiarity with public-key cryptography and the RSA
+algorithm. If you don't know what these are or how they work, please refer
+to the sci.crypt FAQ[15]. A formal treatment of RSA can be found in [1].
+
+=head1 DESCRIPTION
+
+Crypt::RSA is a pure-perl, cleanroom implementation of the RSA public-key
+cryptosystem. It uses Math::Pari(3), a perl interface to the blazingly
+fast PARI library, for big integer arithmetic and number theoretic
+computations.
+
+Crypt::RSA provides arbitrary size key-pair generation, plaintext-aware
+encryption (OAEP) and digital signatures with appendix (PSS). For
+compatibility with SSLv3, RSAREF2, PGP and other applications that follow
+the PKCS #1 v1.5 standard, it also provides PKCS #1 v1.5 encryption and
+signatures.
+
+Crypt::RSA is structured as bundle of modules that encapsulate different
+parts of the RSA cryptosystem. The RSA algorithm is implemented in
+Crypt::RSA::Primitives(3). Encryption schemes, located under
+Crypt::RSA::ES, and signature schemes, located under Crypt::RSA::SS, use
+the RSA algorithm to build encryption/signature schemes that employ secure
+padding. (See the note on Security of Padding Schemes.)
+
+The key generation engine and other functions that work on both components
+of the key-pair are encapsulated in Crypt::RSA::Key(3).
+Crypt::RSA::Key::Public(3) & Crypt::RSA::Key::Private(3) provide
+mechanisms for storage & retrival of keys from disk, decoding & encoding
+of keys in certain formats, and secure representation of keys in memory.
+Finally, the Crypt::RSA module provides a convenient, DWIM wrapper around
+the rest of the modules in the bundle.
+
+=head1 SECURITY OF PADDING SCHEMES
+
+It has been conclusively shown that textbook RSA is insecure[3,7]. Secure
+RSA requires that plaintext is padded in a specific manner before
+encryption and signing. There are four main standards for padding: PKCS
+#1 v1.5 encryption & signatures, and OAEP encryption & PSS signatures.
+Crypt::RSA implements these as four modules that
+provide overloaded encrypt(), decrypt(), sign() and verify() methods that
+add padding functionality to the basic RSA operations.
+
+Crypt::RSA::ES::PKCS1v15(3) implements PKCS #1 v1.5 encryption,
+Crypt::RSA::SS::PKCS1v15(3) implements PKCS #1 v1.5 signatures,
+Crypt::RSA::ES::OAEP(3) implements Optimal Asymmetric Encryption and
+Crypt::RSA::SS::PSS(3) Probabilistic Signatures.
+
+PKCS #1 v1.5 schemes are older and hence more widely deployed, but PKCS #1
+v1.5 encryption has certain flaws that make it vulnerable to
+chosen-cyphertext attacks[9]. Even though Crypt::RSA works around these
+vulnerabilities, it is recommended that new applications use OAEP and PSS,
+both of which are provably secure[13]. In any event,
+Crypt::RSA::Primitives (without padding) should never be used directly.
+
+That said, there exists a scheme called Simple RSA[16] that provides
+security without padding. However, Crypt::RSA doesn't implement this
+scheme yet.
+
+=head1 METHODS
+
+=over 4
+
+=item B<new()>
+
+The constructor. When no arguments are provided, new() returns an object
+loaded with default values. This object can be customized by specifying
+encryption & signature schemes, key formats and post processors. For
+details see the section on B<Customizing the Crypt::RSA
+object> later in this manpage.
+
+=item B<keygen()>
+
+keygen() generates and returns an RSA key-pair of specified bitsize.
+keygen() is a synonym for Crypt::RSA::Key::generate(). Parameters and
+return values are described in the Crypt::RSA::Key(3) manpage.
+
+=item B<encrypt()>
+
+encrypt() performs RSA encryption on a string of arbitrary length with a
+public key using the encryption scheme bound to the object. The default
+scheme is OAEP. encrypt() returns cyphertext (a string) on success and
+undef on failure. It takes a hash as argument with following keys:
+
+=over 4
+
+=item B<Message>
+
+An arbitrary length string to be encrypted.
+
+=item B<Key>
+
+Public key of the recipient, a Crypt::RSA::Key::Public(3) or
+compatible object.
+
+=item B<Armour>
+
+A boolean parameter that forces cyphertext through a post processor after
+encrpytion. The default post processor is Convert::ASCII::Armour(3) that
+encodes binary octets in 6-bit clean ASCII messages. The cyphertext is
+returned as-is, when the Armour key is not present.
+
+=back
+
+=item B<decrypt()>
+
+decrypt() performs RSA decryption with a private key using the encryption
+scheme bound to the object. The default scheme is OAEP. decrypt() returns
+plaintext on success and undef on failure. It takes a hash as argument
+with following keys:
+
+=over 4
+
+=item B<Cyphertext>
+
+Cyphertext of arbitrary length.
+
+=item B<Key>
+
+Private key, a Crypt::RSA::Key::Private(3) or compatible object.
+
+=item B<Armour>
+
+Boolean parameter that specifies whether the Cyphertext is encoded with a
+post processor.
+
+=back
+
+=item B<sign()>
+
+sign() creates an RSA signature on a string with a private key using the
+signature scheme bound to the object. The default scheme is
+PSS. sign() returns a signature on success and undef on failure. It takes
+a hash as argument with following keys:
+
+=over 4
+
+=item B<Message>
+
+A string of arbitrary length to be signed.
+
+=item B<Key>
+
+Private key of the sender, a Crypt::RSA::Key::Private(3) or
+compatible object.
+
+=item B<Armour>
+
+A boolean parameter that forces the computed signature to be post
+processed.
+
+=back
+
+=item B<verify()>
+
+verify() verifies an RSA signature with a public key using the signature
+scheme bound to the object. The default scheme is PSS. verify() returns a
+true value on success and undef on failure. It takes a hash as argument
+with following keys:
+
+=over 4
+
+=item B<Message>
+
+A signed message, a string of arbitrary length.
+
+=item B<Key>
+
+Public key of the signer, a Crypt::RSA::Key::Public(3) or
+compatible object.
+
+=item B<Sign>
+
+A signature computed with sign().
+
+=item B<Armour>
+
+Boolean parameter that specifies whether the Signature has been
+post processed.
+
+=back
+
+=back
+
+=head1 MODULES
+
+Apart from Crypt::RSA, the following modules are intended for application
+developer and end-user consumption:
+
+=over 4
+
+=item B<Crypt::RSA::Key>
+
+RSA key pair generator.
+
+=item B<Crypt::RSA::Key::Public>
+
+RSA Public Key Management.
+
+=item B<Crypt::RSA::Key::Private>
+
+RSA Private Key Management.
+
+=item B<Crypt::RSA::ES::OAEP>
+
+Plaintext-aware encryption with RSA.
+
+=item B<Crypt::RSA::SS::PSS>
+
+Probabilistic Signature Scheme based on RSA.
+
+=item B<Crypt::RSA::ES::PKCS1v15>
+
+PKCS #1 v1.5 encryption scheme.
+
+=item B<Crypt::RSA::SS::PKCS1v15>
+
+PKCS #1 v1.5 signature scheme.
+
+=back
+
+=head1 CUSTOMISING A CRYPT::RSA OBJECT
+
+A Crypt::RSA object can be customized by passing any of the following keys
+in a hash to new(): ES to specify the encryption scheme, SS to specify the
+signature scheme, PP to specify the post processor, and KF to specify the
+key format. The value associated with these keys can either be a name (a
+string) or a hash reference that specifies a module name, its constructor,
+and constructor arguments. For example:
+
+ my $rsa = new Crypt::RSA ( ES => 'OAEP' );
+
+ or
+
+ my $rsa = new Crypt::RSA ( ES => { Module => 'Crypt::RSA::ES::OAEP' } );
+
+A module thus specified need not be included in the Crypt::RSA bundle, but
+it must be interface compatible with the ones provided with Crypt::RSA.
+
+As of this writing, the following names are recognised:
+
+=over 4
+
+=item B<ES> (Encryption Scheme)
+
+ 'OAEP', 'PKCS1v15'
+
+=item B<SS> (Signature Scheme)
+
+ 'PSS', 'PKCS1v15'
+
+=item B<KF> (Key Format)
+
+ 'Native', 'SSH'
+
+=item B<PP> (Post Processor)
+
+ 'ASCII'
+
+=back
+
+=head1 ERROR HANDLING
+
+All modules in the Crypt::RSA bundle use a common error handling method
+(implemented in Crypt::RSA::Errorhandler(3)). When a method fails it
+returns undef and calls $self->error() with the error message. This error
+message is available to the caller through the errstr() method. For more
+details see the Crypt::RSA::Errorhandler(3) manpage.
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Ilya Zakharevich for help with Math::Pari, Benjamin Trott for
+several patches including SSH key support, Genèche Ramanoudjame for
+extensive testing and numerous bug reports, Shizukesa on #perl for
+suggesting the error handling method used in this module, and Dave Paris
+for good advice.
+
+=head1 LICENSE
+
+Copyright (c) 2000-2008, Vipul Ved Prakash. This code is free software;
+it is distributed under the same license as Perl itself.
+
+I have received requests for commercial licenses of
+Crypt::RSA, from those who desire contractual support and
+indemnification. I'd be happy to provide a commercial license
+if you need one. Please send me mail at C<mail@vipul.net> with
+the subject "Crypt::RSA license". Please don't send me mail
+asking if you need a commercial license. You don't, if
+Artistic of GPL suit you fine.
+
+=head1 SEE ALSO
+
+Crypt::RSA::Primitives(3), Crypt::RSA::DataFormat(3),
+Crypt::RSA::Errorhandler(3), Crypt::RSA::Debug(3), Crypt::Primes(3),
+Crypt::Random(3), Crypt::CBC(3), Crypt::Blowfish(3),
+Tie::EncryptedHash(3), Convert::ASCII::Armour(3), Math::Pari(3),
+Class::Loader(3), crypt-rsa-interoperability(3),
+crypt-rsa-interoperability-table(3).
+
+=head1 REPORTING BUGS
+
+All bug reports related to Crypt::RSA should go to rt.cpan.org
+at C<http://rt.cpan.org/Dist/Display.html?Queue=Crypt-RSA>
+
+Crypt::RSA is considered to be stable. If you are running into a
+problem, it's likely of your own making. Please check your code
+and consult the documentation before posting a bug report. A
+google search with the error message might also shed light if it
+is a common mistake that you've made.
+
+If the module installation fails with a "Segmentation Fault" or
+"Bus Error", it is likely a Math::Pari issue. Please consult
+Math::Pari bugs on rt.cpan.org or open a bug there. There have
+been known issues on HP-UX and SunOS systems (with Math::Pari),
+so if you are on those OSes, please consult Math::Pari
+resources before opening a Crypt::RSA bug.
+
+=head1 BIBLIOGRAPHY
+
+Chronologically sorted (for the most part).
+
+=over 4
+
+=item 1 B<R. Rivest, A. Shamir, L. Aldeman.> A Method for Obtaining Digital Signatures and Public-Key Cryptosystems (1978).
+
+=item 2 B<U. Maurer.> Fast Generation of Prime Numbers and Secure Public-Key Cryptographic Parameters (1994).
+
+=item 3 B<M. Bellare, P. Rogaway.> Optimal Asymmetric Encryption - How to Encrypt with RSA (1995).
+
+=item 4 B<M. Bellare, P. Rogaway.> The Exact Security of Digital Signatures - How to sign with RSA and Rabin (1996).
+
+=item 5 B<B. Schneier.> Applied Cryptography, Second Edition (1996).
+
+=item 6 B<A. Menezes, P. Oorschot, S. Vanstone.> Handbook of Applied Cryptography (1997).
+
+=item 7 B<D. Boneh.> Twenty Years of Attacks on the RSA Cryptosystem (1998).
+
+=item 8 B<D. Bleichenbacher, M. Joye, J. Quisquater.> A New and Optimal Chosen-message Attack on RSA-type Cryptosystems (1998).
+
+=item 9 B<B. Kaliski, J. Staddon.> Recent Results on PKCS #1: RSA Encryption Standard, RSA Labs Bulletin Number 7 (1998).
+
+=item 10 B<B. Kaliski, J. Staddon.> PKCS #1: RSA Cryptography Specifications v2.0, RFC 2437 (1998).
+
+=item 11 B<SSH Communications Security.> SSH 1.2.7 source code (1998).
+
+=item 12 B<S. Simpson.> PGP DH vs. RSA FAQ v1.5 (1999).
+
+=item 13 B<RSA Laboratories.> Draft I, PKCS #1 v2.1: RSA Cryptography Standard (1999).
+
+=item 14 B<E. Young, T. Hudson, OpenSSL Team.> OpenSSL 0.9.5a source code (2000).
+
+=item 15 B<Several Authors.> The sci.crypt FAQ at
+http://www.faqs.org/faqs/cryptography-faq/part01/index.html
+
+=item 16 B<Victor Shoup.> A Proposal for an ISO Standard for Public Key Encryption (2001).
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/DataFormat.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/DataFormat.pm
new file mode 100755
index 00000000000..07edffd5340
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/DataFormat.pm
@@ -0,0 +1,194 @@
+#!/usr/bin/perl -s
+##
+## Crypt::RSA::DataFormat -- Functions for converting, shaping and
+## creating and reporting data formats.
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: DataFormat.pm,v 1.13 2001/05/20 23:37:45 vipul Exp $
+
+package Crypt::RSA::DataFormat;
+use vars qw(@ISA);
+use Math::Pari qw(PARI pari2pv floor pari2num);
+use Crypt::Random qw(makerandom);
+use Digest::SHA1 qw(sha1);
+use Carp;
+require Exporter;
+@ISA = qw(Exporter);
+
+@EXPORT_OK = qw(i2osp os2ip h2osp octet_xor octet_len bitsize
+ generate_random_octet mgf1 steak);
+
+
+sub i2osp {
+ my $num = PARI(shift);
+ my $d = $num;
+ my $l = shift || 0;
+ my $base = PARI(256); my $result = '';
+ if ($l) { return if $num > $base ** $l }
+
+ do {
+ my $r = $d % $base;
+ $d = ($d-$r) / $base;
+ $result = chr($r) . $result;
+ } until ($d < $base);
+ $result = chr($d) . $result if $d != 0;
+
+ if (length($result) < $l) {
+ $result = chr(0)x($l-length($result)) . $result;
+ }
+ return $result;
+}
+
+
+sub os2ip {
+ my $string = shift;
+ my $base = PARI(256);
+ my $result = 0;
+ my $l = length($string);
+ for (0 .. $l-1) {
+ my ($c) = unpack "x$_ a", $string;
+ my $a = int(ord($c));
+ my $val = int($l-$_-1);
+ $result += $a * ($base**$val);
+ }
+ return $result;
+}
+
+
+sub h2osp {
+ my $hex = shift;
+ $hex =~ s/[ \n]//ig;
+ my $num = Math::Pari::_hex_cvt($hex);
+ return i2osp ($num);
+}
+
+
+sub generate_random_octet {
+ my ( $l, $str ) = @_;
+ my $r = makerandom ( Size => int($l*8), Strength => $str );
+ return i2osp ($r, $l);
+}
+
+
+sub bitsize ($) {
+ return pari2num(floor(Math::Pari::log(shift)/Math::Pari::log(2)) + 1);
+}
+
+
+sub octet_len {
+ return pari2num(floor(PARI((bitsize(shift)+7)/8)));
+}
+
+
+sub octet_xor {
+ my ($a, $b) = @_; my @xor;
+ my @ba = split //, unpack "B*", $a;
+ my @bb = split //, unpack "B*", $b;
+ if (@ba != @bb) {
+ if (@ba < @bb) {
+ for (1..@bb-@ba) { unshift @ba, '0' }
+ } else {
+ for (1..@ba-@bb) { unshift @bb, '0' }
+ }
+ }
+ for (0..$#ba) {
+ $xor[$_] = ($ba[$_] xor $bb[$_]) || 0;
+ }
+ return pack "B*", join '',@xor;
+}
+
+
+sub mgf1 {
+ my ($seed, $l) = @_;
+ my $hlen = 20; my ($T, $i) = ("",0);
+ while ($i <= $l) {
+ my $C = i2osp (int($i), 4);
+ $T .= sha1("$seed$C");
+ $i += $hlen;
+ }
+ my ($output) = unpack "a$l", $T;
+ return $output;
+}
+
+
+sub steak {
+ my ($text, $blocksize) = @_;
+ my $textsize = length($text);
+ my $chunkcount = $textsize % $blocksize
+ ? int($textsize/$blocksize) + 1 : $textsize/$blocksize;
+ my @segments = unpack "a$blocksize"x$chunkcount, $text;
+ return @segments;
+}
+
+1;
+
+=head1 NAME
+
+Crypt::RSA::DataFormat - Data creation, conversion and reporting primitives.
+
+=head1 DESCRIPTION
+
+This module implements several data creation, conversion and reporting
+primitives used throughout the Crypt::RSA implementation. Primitives are
+available as exportable functions.
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item B<i2osp> Integer, Length
+
+Integer To Octet String Primitive. Converts an integer into its
+equivalent octet string representation of length B<Length>. If
+necessary, the resulting string is prefixed with nulls. If
+B<Length> is not provided, returns an octet string of shortest
+possible length.
+
+=item B<h2osp> Hex String
+
+Hex To Octet String Primitive. Converts a I<hex string> into its
+equivalent octet string representation and returns an octet
+string of shortest possible length. The hex string is not
+prefixed with C<0x>, etc.
+
+=item B<os2ip> String
+
+Octet String to Integer Primitive. Converts an octet string into its
+equivalent integer representation.
+
+=item B<generate_random_octet> Length, Strength
+
+Generates a random octet string of length B<Length>. B<Strength> specifies
+the degree of randomness. See Crypt::Random(3) for an explanation of the
+B<Strength> parameter.
+
+=item B<bitsize> Integer
+
+Returns the length of the B<Integer> in bits.
+
+=item B<octet_len> Integer
+
+Returns the octet length of the integer. If the length is not a whole
+number, the fractional part is dropped to make it whole.
+
+=item B<octet_xor> String1, String2
+
+Returns the result of B<String1> XOR B<String2>.
+
+=item B<steak> String, Length
+
+Returns an array of segments of length B<Length> from B<String>. The final
+segment can be smaller than B<Length>.
+
+=back
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Debug.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Debug.pm
new file mode 100755
index 00000000000..f264088102c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Debug.pm
@@ -0,0 +1,84 @@
+#!/usr/bin/perl -s
+##
+## Crypt::RSA::Debug
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: Debug.pm,v 1.9 2001/04/09 22:21:49 vipul Exp $
+
+package Crypt::RSA::Debug;
+use strict;
+use vars qw(@ISA @EXPORT_OK);
+require Exporter;
+@ISA = qw(Exporter);
+
+@EXPORT_OK = qw(debug debuglevel);
+
+my $DEBUG = 0;
+
+sub debug{
+ return undef unless $DEBUG;
+ my ($caller, undef) = caller;
+ my (undef,undef,$line,$sub) = caller(1); $sub =~ s/.*://;
+ $sub = sprintf "%12s()%4d", $sub, $line;
+ $sub .= " | " . (shift);
+ $sub =~ s/\x00/[0]/g;
+ $sub =~ s/\x01/[1]/g;
+ $sub =~ s/\x02/[2]/g;
+ $sub =~ s/\x04/[4]/g;
+ $sub =~ s/\x05/[5]/g;
+ $sub =~ s/\xff/[-]/g;
+ $sub =~ s/[\x00-\x1f]/\./g;
+ $sub =~ s/[\x7f-\xfe]/_/g;
+ print "$sub\n";
+}
+
+
+sub debuglevel {
+
+ my ($level) = shift;
+ $DEBUG = $level;
+
+}
+
+
+=head1 NAME
+
+Crypt::RSA::Debug - Debug routine for Crypt::RSA.
+
+=head1 SYNOPSIS
+
+ use Crypt::RSA::Debug qw(debug);
+ debug ("oops!");
+
+=head1 DESCRIPTION
+
+The module provides support for the I<print> method of debugging!
+
+=head1 FUNCTION
+
+=over 4
+
+=item B<debug> String
+
+Prints B<String> on STDOUT, along with caller's function name and line number.
+
+=item B<debuglevel> Integer
+
+Sets the class data I<debuglevel> to specified value. The value
+defaults to 0. Callers can use the debuglevel facility by
+comparing $Crypt::RSA::DEBUG to the desired debug level before
+generating a debug statement.
+
+=back
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=cut
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/OAEP.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/OAEP.pm
new file mode 100755
index 00000000000..98b980c0575
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/OAEP.pm
@@ -0,0 +1,289 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA::ES::OAEP
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: OAEP.pm,v 1.24 2001/06/22 23:27:37 vipul Exp $
+
+package Crypt::RSA::ES::OAEP;
+use strict;
+use base 'Crypt::RSA::Errorhandler';
+use Crypt::Random qw(makerandom_octet);
+use Crypt::RSA::DataFormat qw(bitsize os2ip i2osp octet_xor mgf1 octet_len);
+use Crypt::RSA::Primitives;
+use Crypt::RSA::Debug qw(debug);
+use Digest::SHA1 qw(sha1);
+use Math::Pari qw(floor);
+use Sort::Versions qw(versioncmp);
+use Carp;
+
+$Crypt::RSA::ES::OAEP::VERSION = '1.99';
+
+sub new {
+ my ($class, %params) = @_;
+ my $self = bless { primitives => new Crypt::RSA::Primitives,
+ P => "",
+ hlen => 20,
+ VERSION => $Crypt::RSA::ES::OAEP::VERSION,
+ }, $class;
+ if ($params{Version}) {
+ if (versioncmp($params{Version}, '1.15') == -1) {
+ $$self{P} = "Crypt::RSA";
+ $$self{VERSION} = $params{Version};
+ } elsif (versioncmp($params{Version}, $$self{VERSION}) == 1) {
+ croak "Required version ($params{Version}) greater than installed version ($$self{VERSION}) of $class.\n";
+ }
+ }
+ return $self;
+}
+
+
+sub encrypt {
+ my ($self, %params) = @_;
+ my $key = $params{Key}; my $M = $params{Message} || $params{Plaintext};
+ return $self->error ("Missing Message or Plaintext parameter", \$key, \%params) unless $M;
+ return $self->error ($key->errstr, \$M, $key, \%params) unless $key->check;
+ my $k = octet_len ($key->n); debug ("octet_len of modulus: $k");
+ my $em = $self->encode ($M, $self->{P}, $k-1) ||
+ return $self->error ($self->errstr, \$M, $key, \%params);
+ my $m = os2ip ($em);
+ my $c = $self->{primitives}->core_encrypt ( Plaintext => $m, Key => $key );
+ my $ec = i2osp ($c, $k); debug ("ec: $ec");
+ return $ec;
+}
+
+
+sub decrypt {
+ my ($self, %params) = @_;
+ my $key = $params{Key}; my $C = $params{Cyphertext} || $params{Ciphertext};
+ return $self->error ("Missing Cyphertext or Ciphertext parameter", \$key, \%params) unless $C;
+ return $self->error ($key->errstr, $key, \%params) unless $key->check;
+ my $k = octet_len ($key->n);
+ my $c = os2ip ($C);
+ if (bitsize($c) > bitsize($key->n)) {
+ return $self->error ("Decryption error.", $key, \%params)
+ }
+ my $m = $self->{primitives}->core_decrypt (Cyphertext => $c, Key => $key) ||
+ return $self->error ("Decryption error.", $key, \%params);
+ my $em = i2osp ($m, $k-1) ||
+ return $self->error ("Decryption error.", $key, \%params);
+ my $M; $self->errstrrst; # reset the errstr
+ unless ($M = $self->decode ($em, $$self{P})) {
+ return $self->error ("Decryption error.", $key, \%params) if $self->errstr();
+ return $M;
+ }
+ return $M;
+}
+
+
+sub encode {
+ my ($self, $M, $P, $emlen) = @_;
+ my $hlen = $$self{hlen};
+ my $mlen = length($M);
+ return $self->error ("Message too long.", \$P, \$M) if $mlen > $emlen-(2*$hlen)-1;
+ my ($PS, $pslen) = ("", 0);
+ if ($pslen = $emlen-(2*$hlen+1+$mlen)) {
+ $PS = chr(0)x$pslen;
+ }
+ my $phash = $self->hash ($P);
+ my $db = $phash . $PS . chr(1) . $M;
+ my $seed = makerandom_octet (Length => $hlen);
+ my $dbmask = $self->mgf ($seed, $emlen-$hlen);
+ my $maskeddb = octet_xor ($db, $dbmask);
+ my $seedmask = $self->mgf ($maskeddb, $hlen);
+ my $maskedseed = octet_xor ($seed, $seedmask);
+ my $em = $maskedseed . $maskeddb;
+
+ debug ("emlen == $emlen");
+ debug ("M == $M [" . length($M) . "]");
+ debug ("PS == $PS [$pslen]");
+ debug ("phash == $phash [" . length($phash) . "]");
+ debug ("seed == $seed [" . length($seed) . "]");
+ debug ("seedmask == $seedmask [" . length($seedmask) . "]");
+ debug ("db == $db [" . length($db) . "]");
+ debug ("dbmask == $dbmask [" . length($dbmask) . "]");
+ debug ("maskeddb == $maskeddb [" . length($maskeddb) . "]");
+ debug ("em == $em [" . length($em) . "]");
+
+ return $em;
+}
+
+
+sub decode {
+ my ($self, $em, $P) = @_;
+ my $hlen = $$self{hlen};
+
+ debug ("P == $P");
+ return $self->error ("Decoding error.", \$P) if length($em) < 2*$hlen+1;
+ my $maskedseed = substr $em, 0, $hlen;
+ my $maskeddb = substr $em, $hlen;
+ my $seedmask = $self->mgf ($maskeddb, $hlen);
+ my $seed = octet_xor ($maskedseed, $seedmask);
+ my $dbmask = $self->mgf ($seed, length($em) - $hlen);
+ my $db = octet_xor ($maskeddb, $dbmask);
+ my $phash = $self->hash ($P);
+
+ debug ("em == $em [" . length($em) . "]");
+ debug ("phash == $phash [" . length($phash) . "]");
+ debug ("seed == $seed [" . length($seed) . "]");
+ debug ("seedmask == $seedmask [" . length($seedmask) . "]");
+ debug ("maskedseed == $maskedseed [" . length($maskedseed) . "]");
+ debug ("db == $db [" . length($db) . "]");
+ debug ("maskeddb == $maskeddb [" . length($maskeddb) . "]");
+ debug ("dbmask == $dbmask [" . length($dbmask) . "]");
+
+ my ($phashorig) = substr $db, 0, $hlen;
+ debug ("phashorig == $phashorig [" . length($phashorig) . "]");
+ return $self->error ("Decoding error.", \$P) unless $phashorig eq $phash;
+ $db = substr $db, $hlen;
+ my ($chr0, $chr1) = (chr(0), chr(1));
+ my ($ps, $m);
+ debug ("db == $db [" . length($db) . "]");
+ unless ( ($ps, undef, $m) = $db =~ /^($chr0*)($chr1)(.*)$/s ) {
+ return $self->error ("Decoding error.", \$P);
+ }
+
+ return $m;
+}
+
+
+sub hash {
+ my ($self, $data) = @_;
+ return sha1 ($data);
+}
+
+
+sub mgf {
+ my ($self, @data) = @_;
+ return mgf1 (@data);
+}
+
+
+sub encryptblock {
+ my ($self, %params) = @_;
+ return octet_len ($params{Key}->n) - 42;
+}
+
+
+sub decryptblock {
+ my ($self, %params) = @_;
+ return octet_len ($params{Key}->n);
+}
+
+
+# should be able to call this as a class method.
+sub version {
+ my $self = shift;
+ return $self->{VERSION};
+}
+
+
+1;
+
+=head1 NAME
+
+Crypt::RSA::ES::OAEP - Plaintext-aware encryption with RSA.
+
+=head1 SYNOPSIS
+
+ my $oaep = new Crypt::RSA::ES::OAEP;
+
+ my $ct = $oaep->encrypt( Key => $key, Message => $message ) ||
+ die $oaep->errstr;
+
+ my $pt = $oaep->decrypt( Key => $key, Cyphertext => $ct ) ||
+ die $oaep->errstr;
+
+=head1 DESCRIPTION
+
+This module implements Optimal Asymmetric Encryption, a plaintext-aware
+encryption scheme based on RSA. The notion of plaintext-aware implies it's
+computationally infeasible to obtain full or partial information about a
+message from a cyphertext, and computationally infeasible to generate a
+valid cyphertext without knowing the corresponding message.
+Plaintext-aware schemes, such as OAEP, are semantically secure,
+non-malleable and secure against chosen-ciphertext attack. For more
+information on OAEP and plaintext-aware encryption, see [3], [9] & [13].
+
+=head1 METHODS
+
+=head2 B<new()>
+
+Constructor.
+
+=head2 B<version()>
+
+Returns the version number of the module.
+
+=head2 B<encrypt()>
+
+Encrypts a string with a public key and returns the encrypted string
+on success. encrypt() takes a hash argument with the following
+mandatory keys:
+
+=over 4
+
+=item B<Message>
+
+A string to be encrypted. The length of this string should not exceed k-42
+octets, where k is the octet length of the RSA modulus. If Message is
+longer than k-42, the method will fail and set $self->errstr to "Message
+too long." This means the key must be at least _336_ bits long if you are
+to use OAEP.
+
+=item B<Key>
+
+Public key of the recipient, a Crypt::RSA::Key::Public object.
+
+=back
+
+=head2 B<decrypt()>
+
+Decrypts cyphertext with a private key and returns plaintext on
+success. $self->errstr is set to "Decryption Error." or appropriate
+error on failure. decrypt() takes a hash argument with the following
+mandatory keys:
+
+=over 4
+
+=item B<Cyphertext>
+
+A string encrypted with encrypt(). The length of the cyphertext must be k
+octets, where k is the length of the RSA modulus.
+
+=item B<Key>
+
+Private key of the receiver, a Crypt::RSA::Key::Private object.
+
+=item B<Version>
+
+Version of the module that was used for creating the Cyphertext. This is
+an optional argument. When present, decrypt() will ensure before
+proceeding that the installed version of the module can successfully
+decrypt the Cyphertext.
+
+=back
+
+=head1 ERROR HANDLING
+
+See ERROR HANDLING in Crypt::RSA(3) manpage.
+
+=head1 BIBLIOGRAPHY
+
+See BIBLIOGRAPHY in Crypt::RSA(3) manpage.
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=head1 SEE ALSO
+
+Crypt::RSA(3), Crypt::RSA::Primitives(3), Crypt::RSA::Keys(3),
+Crypt::RSA::SSA::PSS(3)
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/PKCS1v15.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/PKCS1v15.pm
new file mode 100755
index 00000000000..345c8dc4e14
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/PKCS1v15.pm
@@ -0,0 +1,215 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA::ES::PKCS1v15
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: PKCS1v15.pm,v 1.10 2001/06/22 23:27:37 vipul Exp $
+
+package Crypt::RSA::ES::PKCS1v15;
+use strict;
+use base 'Crypt::RSA::Errorhandler';
+use Crypt::Random qw(makerandom_octet);
+use Crypt::RSA::DataFormat qw(bitsize octet_len os2ip i2osp);
+use Crypt::RSA::Primitives;
+use Crypt::RSA::Debug qw(debug);
+use Math::Pari qw(floor);
+use Sort::Versions qw(versioncmp);
+use Carp;
+
+$Crypt::RSA::ES::PKCS1v15::VERSION = '1.99';
+
+sub new {
+ my ($class, %params) = @_;
+ my $self = bless { primitives => new Crypt::RSA::Primitives,
+ VERSION => $Crypt::RSA::ES::PKCS1v15::VERSION,
+ }, $class;
+ if ($params{Version}) {
+ # do versioning here.
+ }
+ return $self;
+}
+
+
+sub encrypt {
+ my ($self, %params) = @_;
+ my $key = $params{Key}; my $M = $params{Message} || $params{Plaintext};
+ return $self->error ("No Message or Plaintext parameter", \$key, \%params) unless $M;
+ return $self->error ($key->errstr, \$M, $key, \%params) unless $key->check;
+ my $k = octet_len ($key->n); debug ("octet_len of modulus: $k");
+ my $em = $self->encode ($M, $k-1) ||
+ return $self->error ($self->errstr, \$M, $key, \%params);
+ debug ("encoded: $em");
+ my $m = os2ip ($em);
+ my $c = $self->{primitives}->core_encrypt (Plaintext => $m, Key => $key);
+ my $ec = i2osp ($c, $k); debug ("cyphertext: $ec");
+ return $ec;
+}
+
+
+sub decrypt {
+ my ($self, %params) = @_;
+ my $key = $params{Key}; my $C = $params{Cyphertext} || $params{Ciphertext};
+ return $self->error ("No Cyphertext or Ciphertext parameter", \$key, \%params) unless $C;
+ return $self->error ($key->errstr, $key, \%params) unless $key->check;
+ my $k = octet_len ($key->n);
+ my $c = os2ip ($C);
+ debug ("bitsize(c): " . bitsize($c));
+ debug ("bitsize(n): " . bitsize($key->n));
+ if (bitsize($c) > bitsize($key->n)) {
+ return $self->error ("Decryption error.", $key, \%params)
+ }
+ my $m = $self->{primitives}->core_decrypt (Cyphertext => $c, Key => $key) ||
+ return $self->error ("Decryption error.", $key, \%params);
+ my $em = i2osp ($m, $k-1) ||
+ return $self->error ("Decryption error.", $key, \%params);
+ my $M; $self->errstrrst; # reset the errstr
+ unless ($M = $self->decode ($em)) {
+ return $self->error ("Decryption error.", $key, \%params) if $self->errstr();
+ return $M;
+ }
+ return $M;
+}
+
+
+sub encode {
+ my ($self, $M, $emlen) = @_;
+ $M = $M || ""; my $mlen = length($M);
+ return $self->error ("Message too long.", \$M) if $mlen > $emlen-10;
+ my ($PS, $pslen) = ("", 0);
+
+ $pslen = $emlen-$mlen-2;
+ $PS = makerandom_octet (Length => $pslen, Skip => chr(0));
+ my $em = chr(2).$PS.chr(0).$M;
+ return $em;
+}
+
+
+sub decode {
+ my ($self, $em) = @_;
+
+ return $self->error ("Decoding error.") if length($em) < 10;
+
+ debug ("to decode: $em");
+ my ($chr0, $chr2) = (chr(0), chr(2));
+ my ($ps, $M);
+ unless ( ($ps, $M) = $em =~ /^$chr2(.*?)$chr0(.*)$/s ) {
+ return $self->error ("Decoding error.");
+ }
+ return $self->error ("Decoding error.") if length($ps) < 8;
+ return $M;
+}
+
+
+sub encryptblock {
+ my ($self, %params) = @_;
+ return octet_len ($params{Key}->n) - 11;
+}
+
+
+sub decryptblock {
+ my ($self, %params) = @_;
+ return octet_len ($params{Key}->n);
+}
+
+
+sub version {
+ my $self = shift;
+ return $self->{VERSION};
+}
+
+
+1;
+
+=head1 NAME
+
+Crypt::RSA::ES::PKCS1v15 - PKCS #1 v1.5 padded encryption scheme based on RSA.
+
+=head1 SYNOPSIS
+
+ my $pkcs = new Crypt::RSA::ES::PKCS1v15;
+
+ my $ct = $pkcs->encrypt( Key => $key, Message => $message ) ||
+ die $pkcs->errstr;
+
+ my $pt = $pkcs->decrypt( Key => $key, Cyphertext => $ct ) ||
+ die $pkcs->errstr;
+
+=head1 DESCRIPTION
+
+This module implements PKCS #1 v1.5 padded encryption scheme based on RSA.
+See [13] for details on the encryption scheme.
+
+=head1 METHODS
+
+=head2 B<new()>
+
+Constructor.
+
+=head2 B<version()>
+
+Returns the version number of the module.
+
+=head2 B<encrypt()>
+
+Encrypts a string with a public key and returns the encrypted string
+on success. encrypt() takes a hash argument with the following
+mandatory keys:
+
+=over 4
+
+=item B<Message>
+
+A string to be encrypted. The length of this string should not exceed k-10
+octets, where k is the octet length of the RSA modulus. If Message is
+longer than k-10, the method will fail and set $self->errstr to "Message
+too long."
+
+=item B<Key>
+
+Public key of the recipient, a Crypt::RSA::Key::Public object.
+
+=back
+
+=head2 B<decrypt()>
+
+Decrypts cyphertext with a private key and returns plaintext on
+success. $self->errstr is set to "Decryption Error." or appropriate
+error on failure. decrypt() takes a hash argument with the following
+mandatory keys:
+
+=over 4
+
+=item B<Cyphertext>
+
+A string encrypted with encrypt(). The length of the cyphertext must be k
+octets, where k is the length of the RSA modulus.
+
+=item B<Key>
+
+Private key of the receiver, a Crypt::RSA::Key::Private object.
+
+=back
+
+=head1 ERROR HANDLING
+
+See ERROR HANDLING in Crypt::RSA(3) manpage.
+
+=head1 BIBLIOGRAPHY
+
+See BIBLIOGRAPHY in Crypt::RSA(3) manpage.
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=head1 SEE ALSO
+
+Crypt::RSA(3), Crypt::RSA::Primitives(3), Crypt::RSA::Keys(3),
+Crypt::RSA::SSA::PSS(3)
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Errorhandler.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Errorhandler.pm
new file mode 100755
index 00000000000..87df0e00b0b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Errorhandler.pm
@@ -0,0 +1,135 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA::Errorhandler -- Base class that provides error
+## handling functionality.
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: Errorhandler.pm,v 1.5 2001/06/22 23:27:35 vipul Exp $
+
+package Crypt::RSA::Errorhandler;
+use strict;
+
+sub new {
+ bless {}, shift
+}
+
+
+sub error {
+ my ($self, $errstr, @towipe) = @_;
+ $$self{errstr} = "$errstr\n";
+ for (@towipe) {
+ my $var = $_;
+ if (ref($var) =~ /Crypt::RSA/) {
+ $var->DESTROY();
+ } elsif (ref($var) eq "SCALAR") {
+ $$var = "";
+ } elsif (ref($var) eq "ARRAY") {
+ @$var = ();
+ } elsif (ref($var) eq "HASH") {
+ %$var = ();
+ }
+ }
+ return;
+}
+
+
+sub errstr {
+ my $self = shift;
+ return $$self{errstr};
+}
+
+sub errstrrst {
+ my $self = shift;
+ $$self{errstr} = "";
+}
+
+1;
+
+
+=head1 NAME
+
+Crypt::RSA::Errorhandler - Error handling mechanism for Crypt::RSA.
+
+=head1 SYNOPSIS
+
+ package Foo;
+
+ use Crypt::RSA::Errorhandler;
+ @ISA = qw(Crypt::RSA::Errorhandler);
+
+ sub alive {
+ ..
+ ..
+ return
+ $self->error ("Awake, awake! Ring the alarum bell. \
+ Murther and treason!", $dagger)
+ if $self->murdered($king);
+ }
+
+
+ package main;
+
+ use Foo;
+ my $foo = new Foo;
+ $foo->alive($king) or print $foo->errstr();
+ # prints "Awake, awake! ... "
+
+=head1 DESCRIPTION
+
+Crypt::RSA::Errorhandler encapsulates the error handling mechanism used
+by the modules in Crypt::RSA bundle. Crypt::RSA::Errorhandler doesn't
+have a constructor and is meant to be inherited. The derived modules use
+its two methods, error() and errstr(), to communicate error messages to
+the caller.
+
+When a method of the derived module fails, it calls $self->error() and
+returns undef to the caller. The error message passed to error() is made
+available to the caller through the errstr() accessor. error() also
+accepts a list of sensitive data that it wipes out (undef'es) before
+returning.
+
+The caller should B<never> call errstr() to check for errors. errstr()
+should be called only when a method indicates (usually through an undef
+return value) that an error has occured. This is because errstr() is
+never overwritten and will always contain a value after the occurance of
+first error.
+
+=head1 METHODS
+
+=over 4
+
+=item B<new()>
+
+Barebones constructor.
+
+=item B<error($mesage, ($wipeme, $wipemetoo))>
+
+The first argument to error() is $message which is placed in $self-
+>{errstr} and the remaining arguments are interpretted as
+variables containing sensitive data that are wiped out from the
+memory. error() always returns undef.
+
+=item B<errstr()>
+
+errstr() is an accessor method for $self->{errstr}.
+
+=item B<errstrrst()>
+
+This method sets $self->{errstr} to an empty string.
+
+=back
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=head1 SEE ALSO
+
+Crypt::RSA(3)
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key.pm
new file mode 100755
index 00000000000..caee6cdb5d0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key.pm
@@ -0,0 +1,231 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA::Keys
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: Key.pm,v 1.13 2001/05/25 00:20:40 vipul Exp $
+
+package Crypt::RSA::Key;
+use strict;
+use base 'Class::Loader';
+use base 'Crypt::RSA::Errorhandler';
+use Crypt::Primes qw(rsaparams);
+use Crypt::RSA::DataFormat qw(bitsize);
+use Math::Pari qw(PARI Mod lift);
+use Crypt::RSA::Key::Private;
+use Crypt::RSA::Key::Public;
+
+$Crypt::RSA::Key::VERSION = '1.99';
+
+my %MODMAP = (
+ Native_PKF => { Module => "Crypt::RSA::Key::Public" },
+ Native_SKF => { Module => "Crypt::RSA::Key::Private" },
+ SSH_PKF => { Module => "Crypt::RSA::Key::Public::SSH" },
+ SSH_SKF => { Module => "Crypt::RSA::Key::Private::SSH" },
+);
+
+
+sub new {
+ my $class = shift;
+ my $self = {};
+ bless $self, $class;
+ $self->_storemap ( %MODMAP );
+ return $self;
+}
+
+
+sub generate {
+
+ my ($self, %params) = @_;
+
+ my $key;
+ unless ($params{q} && $params{p} && $params{e}) {
+
+ return $self->error ("Missing argument.") unless $params{Size};
+
+ return $self->error ("Keysize too small.") if
+ $params{Size} < 48;
+
+ return $self->error ("Odd keysize.") if
+ $params{Size} % 2;
+
+ my $size = int($params{Size}/2);
+ my $verbosity = $params{Verbosity} || 0;
+
+ my $cbitsize = 0;
+ while (!($cbitsize)) {
+ $key = rsaparams ( Size => $size, Verbosity => $verbosity );
+ my $n = $$key{p} * $$key{q};
+ $cbitsize = 1 if bitsize($n) == $params{Size}
+ }
+
+ }
+
+ if ($params{KF}) {
+ $params{PKF} = { Name => "$params{KF}_PKF" };
+ $params{SKF} = { Name => "$params{KF}_SKF" }
+ }
+
+ my $pubload = $params{PKF} ? $params{PKF} : { Name => "Native_PKF" };
+ my $priload = $params{SKF} ? $params{SKF} : { Name => "Native_SKF" };
+
+ my $pubkey = $self->_load (%$pubload) ||
+ return $self->error ("Couldn't load the public key module.");
+ my $prikey = $self->_load ((%$priload), Args => ['Cipher' => $params{Cipher}, 'Password', $params{Password} ]) ||
+ return $self->error ("Couldn't load the private key module.");
+ $pubkey->Identity ($params{Identity});
+ $prikey->Identity ($params{Identity});
+
+ $pubkey->e ($$key{e} || $params{e});
+ $prikey->e ($$key{e} || $params{e});
+ $prikey->p ($$key{p} || $params{p});
+ $prikey->q ($$key{q} || $params{q});
+
+ $prikey->phi (($prikey->p - 1) * ($prikey->q - 1));
+ my $m = Mod (1, $prikey->phi);
+
+ $prikey->d (lift($m/$pubkey->e));
+ $prikey->n ($prikey->p * $prikey->q);
+ $pubkey->n ($prikey->n);
+
+ $prikey->dp ($prikey->d % ($prikey->p - 1));
+ $prikey->dq ($prikey->d % ($prikey->q - 1));
+ $prikey->u (mod_inverse($prikey->p, $prikey->q));
+
+ return $self->error ("d is too small. Regenerate.") if
+ bitsize($prikey->d) < 0.25 * bitsize($prikey->n);
+
+ $$key{p} = 0; $$key{q} = 0; $$key{e} = 0; $m = 0;
+
+ if ($params{Filename}) {
+ $pubkey->write (Filename => "$params{Filename}.public");
+ $prikey->write (Filename => "$params{Filename}.private");
+ }
+
+ return ($pubkey, $prikey);
+
+}
+
+
+sub mod_inverse {
+ my($a, $n) = @_;
+ my $m = Mod(1, $n);
+ lift($m / $a);
+}
+
+
+1;
+
+=head1 NAME
+
+Crypt::RSA::Key - RSA Key Pair Generator.
+
+=head1 SYNOPSIS
+
+ my $keychain = new Crypt::RSA::Key;
+ my ($public, $private) = $keychain->generate (
+ Identity => 'Lord Macbeth <macbeth@glamis.com>',
+ Size => 2048,
+ Password => 'A day so foul & fair',
+ Verbosity => 1,
+ ) or die $keychain->errstr();
+
+=head1 DESCRIPTION
+
+This module provides a method to generate an RSA key pair.
+
+=head1 METHODS
+
+=head2 new()
+
+Constructor.
+
+=head2 generate()
+
+generate() generates an RSA key of specified bitsize. It returns a list of
+two elements, a Crypt::RSA::Key::Public object that holds the public part
+of the key pair and a Crypt::RSA::Key::Private object that holds that
+private part. On failure, it returns undef and sets $self->errstr to
+appropriate error string. generate() takes a hash argument with the
+following keys:
+
+=over 4
+
+=item B<Size>
+
+Bitsize of the key to be generated. This should be an even integer > 48.
+Bitsize is a mandatory argument.
+
+=item B<Password>
+
+String with which the private key will be encrypted. If Password is not
+provided the key will be stored unencrypted.
+
+=item B<Identity>
+
+A string that identifies the owner of the key. This string usually takes
+the form of a name and an email address. The identity is not bound to the
+key with a signature. However, a future release or another module will
+provide this facility.
+
+=item B<Cipher>
+
+The block cipher which is used for encrypting the private key. Defaults to
+`Blowfish'. Cipher could be set to any value that works with Crypt::CBC(3)
+and Tie::EncryptedHash(3).
+
+=item B<Verbosity>
+
+When set to 1, generate() will draw a progress display on STDOUT.
+
+=item B<Filename>
+
+The generated key pair will be written to disk, in $Filename.public and
+$Filename.private files, if this argument is provided. Disk writes can be
+deferred by skipping this argument and achieved later with the write()
+method of Crypt::RSA::Key::Public(3) and Crypt::RSA::Key::Private(3).
+
+=item B<KF>
+
+A string that specifies the key format. As of this writing, two key
+formats, `Native' and `SSH', are supported. KF defaults to `Native'.
+
+=item B<SKF>
+
+Secret (Private) Key Format. Instead of specifying KF, the user could
+choose to specify secret and public key formats separately. The value for
+SKF can be a string ("Native" or "SSH") or a hash reference that specifies
+a module name, its constructor and constructor arguments. The specified
+module is loaded with Class::Loader(3) and must be interface compatible
+with Crypt::RSA::Key::Private(3).
+
+=item B<PKF>
+
+Public Key Format. This option is like SKF but for the public key.
+
+=back
+
+=head1 ERROR HANDLING
+
+See B<ERROR HANDLING> in Crypt::RSA(3) manpage.
+
+=head1 BUGS
+
+There's an inefficiency in the way generate() ensures the key pair is
+exactly Size bits long. This will be fixed in a future release.
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=head1 SEE ALSO
+
+Crypt::RSA(3), Crypt::RSA::Key::Public(3), Crypt::RSA::Key::Private(3),
+Crypt::Primes(3), Tie::EncryptedHash(3), Class::Loader(3)
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Private.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Private.pm
new file mode 100755
index 00000000000..36dc51d0dd6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Private.pm
@@ -0,0 +1,339 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA::Key::Private
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: Private.pm,v 1.15 2001/09/25 14:11:22 vipul Exp $
+
+package Crypt::RSA::Key::Private;
+use strict;
+use vars qw($AUTOLOAD $VERSION);
+use base 'Crypt::RSA::Errorhandler';
+use Tie::EncryptedHash;
+use Data::Dumper;
+use Math::Pari qw(PARI pari2pv Mod isprime lcm lift);
+use Carp;
+
+$Crypt::RSA::Key::Private::VERSION = '1.99';
+
+sub new {
+
+ my ($class, %params) = @_;
+ my $self = { Version => $Crypt::RSA::Key::Private::VERSION };
+ if ($params{Filename}) {
+ bless $self, $class;
+ $self = $self->read (%params);
+ return bless $self, $class;
+ } else {
+ bless $self, $class;
+ $self->Identity ($params{Identity}) if $params{Identity};
+ $self->Cipher ($params{Cipher}||"Blowfish");
+ $self->Password ($params{Password}) if $params{Password};
+ return $self;
+ }
+
+}
+
+
+sub AUTOLOAD {
+
+ my ($self, $value) = @_;
+ my $key = $AUTOLOAD; $key =~ s/.*:://;
+ if ($key =~ /^(e|n|d|p|q|dp|dq|u|phi)$/) {
+ if (ref $value eq 'Math::Pari') {
+ $self->{private}{"_$key"} = $value;
+ $self->{Checked} = 0;
+ } elsif ($value && !(ref $value)) {
+ if ($value =~ /^0x/) {
+ $self->{private}->{"_$key"} =
+ Math::Pari::_hex_cvt($value);
+ $self->{Checked} = 0;
+ } else { $self->{private}{"_$key"} = PARI($value) }
+ }
+ return $self->{private}{"_$key"} ||
+ $self->{private_encrypted}{"_$key"} ||
+ "";
+ } elsif ($key =~ /^Identity|Cipher|Password$/) {
+ $self->{$key} = $value if $value;
+ return $self->{$key};
+ } elsif ($key =~ /^Checked$/) {
+ my ($package) = caller();
+ $self->{Checked} = $value if ($value && $package eq "Crypt::RSA::Key::Private") ;
+ return $self->{Checked};
+ }
+}
+
+
+sub hide {
+
+ my ($self) = @_;
+
+ return undef unless $$self{Password};
+
+ $self->{private_encrypted} = new Tie::EncryptedHash
+ __password => $self->{Password},
+ __cipher => $self->{Cipher};
+
+ for (keys %{$$self{private}}) {
+ $$self{private_encrypted}{$_} = pari2pv($$self{private}{$_});
+ }
+
+ my $private = $self->{private_encrypted};
+ delete $private->{__password};
+ delete $$self{private};
+ delete $$self{Password};
+
+}
+
+
+sub reveal {
+
+ my ($self, %params) = @_;
+ $$self{Password} = $params{Password} if $params{Password};
+ return undef unless $$self{Password};
+ $$self{private_encrypted}{__password} = $params{Password};
+ for (keys %{$$self{private_encrypted}}) {
+ $$self{private}{$_} = PARI($$self{private_encrypted}{$_});
+ }
+
+}
+
+
+sub check {
+
+ my ($self) = @_;
+
+ return 1 if $self->{Checked};
+
+ return $self->error ("Incomplete key.") unless
+ ($self->n && $self->d) || ($self->n && $self->p && $self->q);
+
+ if ($self->p && $self->q) {
+ return $self->error ("n is not a number.") if $self->n =~ /\D/;
+ return $self->error ("p is not a number.") if $self->p =~ /\D/;
+ return $self->error ("p is not a number.") if $self->p =~ /\D/;
+ return $self->error ("n is not p*q." ) unless $self->n == $self->p * $self->q;
+ return $self->error ("p is not prime.") unless isprime($self->p);
+ return $self->error ("q is not prime.") unless isprime($self->q);
+ }
+
+ if ($self->e) {
+ # d * e == 1 mod lcm(p-1, q-1)
+ return $self->error ("e is not a number.") if $self->e =~ /\D/;
+ my $k = lcm (($self->p -1), ($self->q -1));
+ my $K = Mod (1, $k); my $KI = lift($K * $self->d * $self->e);
+ return $self->error ("Bad `d'.") unless $KI == 1;
+ }
+
+ if ($self->dp) {
+ # dp == d mod (p-1)
+ return $self->error ("Bad `dp'.") unless $self->dp == $self->d % ($self->p - 1);
+ }
+
+ if ($self->dq) {
+ # dq == d mod (q-1)
+ return $self->error ("Bad `dq'.") unless $self->dq == $self->d % ($self->q - 1);
+ }
+
+ if ($self->u && $self->q && $self->p) {
+ my $m = Mod (1,$self->q); $m = lift ($m / $self->p);
+ return $self->error ("Bad `u'.") unless $self->u == $m;
+ }
+
+ $self->Checked(1);
+ return 1;
+
+}
+
+
+sub DESTROY {
+
+ my $self = shift;
+ delete $$self{private_encrypted}{__password};
+ delete $$self{private_encrypted};
+ delete $$self{private};
+ delete $$self{Password};
+ undef $self;
+
+}
+
+
+sub write {
+
+ my ($self, %params) = @_;
+ $self->hide();
+ my $string = $self->serialize (%params);
+ open DISK, ">$params{Filename}" or
+ croak "Can't open $params{Filename} for writing.";
+ binmode DISK;
+ print DISK $string;
+ close DISK;
+
+}
+
+
+sub read {
+ my ($self, %params) = @_;
+ open DISK, $params{Filename} or
+ croak "Can't open $params{Filename} to read.";
+ binmode DISK;
+ my @key = <DISK>;
+ close DISK;
+ $self = $self->deserialize (String => \@key);
+ $self->reveal(%params);
+ return $self;
+}
+
+
+sub serialize {
+
+ my ($self, %params) = @_;
+ if ($$self{private}) { # this is an unencrypted key
+ for (keys %{$$self{private}}) {
+ $$self{private}{$_} = pari2pv($$self{private}{$_});
+ }
+ }
+ return Dumper $self;
+
+}
+
+
+sub deserialize {
+
+ my ($self, %params) = @_;
+ my $string = join'', @{$params{String}};
+ $string =~ s/\$VAR1 =//;
+ $self = eval $string;
+ if ($$self{private}) { # the key is unencrypted
+ for (keys %{$$self{private}}) {
+ $$self{private}{$_} = PARI($$self{private}{$_});
+ }
+ return $self;
+ }
+ my $private = new Tie::EncryptedHash;
+ %$private = %{$$self{private_encrypted}};
+ $self->{private_encrypted} = $private;
+ return $self;
+
+}
+
+
+1;
+
+=head1 NAME
+
+Crypt::RSA::Key::Private -- RSA Private Key Management.
+
+=head1 SYNOPSIS
+
+ $key = new Crypt::RSA::Key::Private (
+ Identity => 'Lord Banquo <banquo@lochaber.com>',
+ Password => 'The earth hath bubbles',
+ );
+
+ $key->hide();
+
+ $key->write( Filename => 'rsakeys/banquo.private' );
+
+ $akey = new Crypt::RSA::Key::Private (
+ Filename => 'rsakeys/banquo.private'
+ );
+
+ $akey->reveal ( Password => 'The earth hath bubbles' );
+
+=head1 DESCRIPTION
+
+Crypt::RSA::Key::Private provides basic private key management
+functionality for Crypt::RSA private keys. Following methods are
+available:
+
+=over 4
+
+=item B<new()>
+
+The constructor. Takes a hash, usually with two arguments: C<Filename> and
+C<Password>. C<Filename> indicates a file from which the private key
+should be read. More often than not, private keys are kept encrypted with
+a symmetric cipher and MUST be decrypted before use. When a C<Password>
+argument is provided, the key is also decrypted before it is returned by
+C<new()>. Here's a complete list of arguments accepted by C<new()> (all of
+which are optional):
+
+=over 4
+
+=item Identity
+
+A string identifying the owner of the key. Canonically, a name and
+email address.
+
+=item Filename
+
+Name of the file that contains the private key.
+
+=item Password
+
+Password with which the private key is encrypted, or should be encrypted
+(in case of a new key).
+
+=item Cipher
+
+Name of the symmetric cipher in which the private key is encrypted (or
+should be encrypted). The default is "Blowfish" and possible values
+include DES, IDEA, Twofish and other ciphers supported by Crypt::CBC.
+
+=back
+
+=item B<reveal()>
+
+If the key is not decrypted at C<new()>, it can be decrypted by
+calling C<reveal()> with a C<Password> argument.
+
+=item B<hide()>
+
+C<hide()> causes the key to be encrypted by the chosen symmetric cipher
+and password.
+
+=item B<write()>
+
+Causes the key to be written to a disk file specified by the
+C<Filename> argument. C<write()> will call C<hide()> before
+writing the key to disk. If you wish to store the key in plain,
+don't specify a password at C<new()>.
+
+=item B<read()>
+
+Causes the key to be read from a disk file specified by
+C<Filename> into the object. If C<Password> is provided, the
+method automatically calls reveal() to decrypt the key.
+
+=item B<serialize()>
+
+Creates a Data::Dumper(3) serialization of the private key and
+returns the string representation.
+
+=item B<deserialize()>
+
+Accepts a serialized key under the C<String> parameter and
+coverts it into the perl representation stored in the object.
+
+=item C<check()>
+
+Check the consistency of the key. If the key checks out, it sets
+$self->{Checked} = 1. Returns undef on failure.
+
+=back
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=head1 SEE ALSO
+
+Crypt::RSA::Key(3), Crypt::RSA::Public(3)
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Private/SSH.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Private/SSH.pm
new file mode 100755
index 00000000000..e777d211ec9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Private/SSH.pm
@@ -0,0 +1,180 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA::Key::Private::SSH
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: SSH.pm,v 1.1 2001/05/20 23:37:47 vipul Exp $
+
+package Crypt::RSA::Key::Private::SSH::Buffer;
+use strict;
+use Crypt::RSA::DataFormat qw( os2ip bitsize i2osp );
+use Data::Buffer;
+use base qw( Data::Buffer );
+
+sub get_mp_int {
+ my $buf = shift;
+ my $off = $buf->{offset};
+ my $bits = unpack "n", $buf->bytes($off, 2);
+ my $bytes = int(($bits+7)/8);
+ my $p = os2ip( $buf->bytes($off+2, $bytes) );
+ $buf->{offset} += 2 + $bytes;
+ $p;
+}
+
+sub put_mp_int {
+ my $buf = shift;
+ my $int = shift;
+ my $bits = bitsize($int);
+ $buf->put_int16($bits);
+ $buf->put_chars( i2osp($int) );
+}
+
+
+package Crypt::RSA::Key::Private::SSH;
+use FindBin qw($Bin);
+use lib "$Bin/../../../../../lib";
+use strict;
+use constant PRIVKEY_ID => "SSH PRIVATE KEY FILE FORMAT 1.1\n";
+use vars qw( %CIPHERS );
+
+BEGIN {
+ %CIPHERS = (
+ 1 => 'IDEA',
+ 2 => 'DES',
+ 3 => 'DES3',
+ 4 => 'ARCFOUR',
+ 6 => 'Blowfish',
+ );
+}
+
+use Carp qw( croak );
+use Data::Buffer;
+use Crypt::CBC;
+use Crypt::RSA::Key::Private;
+use base qw( Crypt::RSA::Key::Private );
+
+sub deserialize {
+ my($key, %params) = @_;
+ my $blob = join '', @{$params{String}};
+ my $passphrase = $params{Passphrase} || '';
+
+ my $buffer = new Crypt::RSA::Key::Private::SSH::Buffer;
+ $buffer->append($blob);
+
+ my $id = $buffer->bytes(0, length(PRIVKEY_ID), '');
+ croak "Bad key file format" unless $id eq PRIVKEY_ID;
+ $buffer->bytes(0, 1, '');
+
+ my $cipher_type = $buffer->get_int8;
+ $buffer->get_int32; ## Reserved data.
+
+ $buffer->get_int32; ## Private key bits.
+ $key->n( $buffer->get_mp_int );
+ $key->e( $buffer->get_mp_int );
+
+ $key->Identity( $buffer->get_str ); ## Comment.
+
+ if ($cipher_type != 0) {
+ my $cipher_name = $CIPHERS{$cipher_type} or
+ croak "Unknown cipher '$cipher_type' used in key file";
+ my $class = 'Crypt::' . $cipher_name;
+ eval { require $class };
+ if ($@) { croak "Unsupported cipher '$cipher_name': $@" }
+
+ my $cipher = Crypt::CBC->new($passphrase, $cipher_name);
+ my $decrypted =
+ $cipher->decrypt($buffer->bytes($buffer->offset));
+ $buffer->empty;
+ $buffer->append($decrypted);
+ }
+
+ my $check1 = $buffer->get_int8;
+ my $check2 = $buffer->get_int8;
+ unless ($check1 == $buffer->get_int8 &&
+ $check2 == $buffer->get_int8) {
+ croak "Bad passphrase supplied for key file";
+ }
+
+ $key->d( $buffer->get_mp_int );
+ $key->u( $buffer->get_mp_int );
+ $key->p( $buffer->get_mp_int );
+ $key->q( $buffer->get_mp_int );
+
+ $key;
+}
+
+
+sub serialize {
+ my($key, %params) = @_;
+ my $passphrase = $params{Password} || '';
+ my $cipher_type = $passphrase eq '' ? 0 :
+ $params{Cipher} || 3;
+
+ my $buffer = new Crypt::RSA::Key::Private::SSH::Buffer;
+ my($check1, $check2);
+ $buffer->put_int8($check1 = int rand 255);
+ $buffer->put_int8($check2 = int rand 255);
+ $buffer->put_int8($check1);
+ $buffer->put_int8($check2);
+
+ $buffer->put_mp_int($key->d);
+ $buffer->put_mp_int($key->u);
+ $buffer->put_mp_int($key->p);
+ $buffer->put_mp_int($key->q);
+
+ $buffer->put_int8(0)
+ while $buffer->length % 8;
+
+ my $encrypted = new Crypt::RSA::Key::Private::SSH::Buffer;
+ $encrypted->put_chars(PRIVKEY_ID);
+ $encrypted->put_int8(0);
+ $encrypted->put_int8($cipher_type);
+ $encrypted->put_int32(0);
+
+ $encrypted->put_int32(Crypt::RSA::DataFormat::bitsize($key->n));
+ $encrypted->put_mp_int($key->n);
+ $encrypted->put_mp_int($key->e);
+ $encrypted->put_str($key->Identity || '');
+
+ if ($cipher_type) {
+ my $cipher_name = $CIPHERS{$cipher_type};
+ my $class = 'Crypt::' . $cipher_name;
+ eval { require $class };
+ if ($@) { croak "Unsupported cipher '$cipher_name': $@" }
+
+ my $cipher = Crypt::CBC->new($passphrase, $cipher_name);
+ $encrypted->append( $cipher->encrypt($buffer->bytes) );
+ }
+ else {
+ $encrypted->append($buffer->bytes);
+ }
+
+ $encrypted->bytes;
+}
+
+
+sub hide {}
+
+=head1 NAME
+
+Crypt::RSA::Key::Private::SSH - SSH Private Key Import
+
+=head1 SYNOPSIS
+
+ Crypt::RSA::Key::Private::SSH is a class derived from
+ Crypt::RSA::Key::Private that provides serialize() and
+ deserialze() methods for SSH 2.x keys.
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=cut
+
+
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Public.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Public.pm
new file mode 100755
index 00000000000..b9086b77300
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Public.pm
@@ -0,0 +1,184 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA::Key::Public
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: Public.pm,v 1.8 2001/09/25 14:11:23 vipul Exp $
+
+package Crypt::RSA::Key::Public;
+use strict;
+use vars qw($AUTOLOAD);
+use Carp;
+use Data::Dumper;
+use base 'Crypt::RSA::Errorhandler';
+use Math::Pari qw(PARI pari2pv);
+
+$Crypt::RSA::Key::Public::VERSION = '1.99';
+
+sub new {
+
+ my ($class, %params) = @_;
+ my $self = { Version => $Crypt::RSA::Key::Public::VERSION };
+ if ($params{Filename}) {
+ bless $self, $class;
+ $self = $self->read (%params);
+ return bless $self, $class;
+ } else {
+ return bless $self, $class;
+ }
+
+}
+
+
+sub AUTOLOAD {
+ my ($self, $value) = @_;
+ my $key = $AUTOLOAD; $key =~ s/.*:://;
+ if ($key =~ /^n|e$/) {
+ if (ref $value eq 'Math::Pari') {
+ $self->{$key} = pari2pv($value)
+ } elsif ($value && !(ref $value)) {
+ if ($value =~ /^0x/) {
+ $self->{$key} = pari2pv(Math::Pari::_hex_cvt($value));
+ } else { $self->{$key} = $value }
+ }
+ my $return = $self->{$key} || "";
+ $return = PARI("$return") if $return =~ /^\d+$/;
+ return $return;
+ } elsif ($key =~ /^Identity$/) {
+ $self->{$key} = $value if $value;
+ return $self->{$key};
+ }
+
+}
+
+
+sub DESTROY {
+
+ my $self = shift;
+ undef $self;
+
+}
+
+
+sub check {
+
+ my $self = shift;
+ return $self->error ("Incomplete key.") unless $self->n && $self->e;
+ return 1;
+
+}
+
+
+sub write {
+
+ my ($self, %params) = @_;
+ $self->hide();
+ my $string = $self->serialize (%params);
+ open DISK, ">$params{Filename}" or
+ croak "Can't open $params{Filename} for writing.";
+ binmode DISK;
+ print DISK $string;
+ close DISK;
+
+}
+
+
+sub read {
+ my ($self, %params) = @_;
+ open DISK, $params{Filename} or
+ croak "Can't open $params{Filename} to read.";
+ binmode DISK;
+ my @key = <DISK>;
+ close DISK;
+ $self = $self->deserialize (String => \@key);
+ return $self;
+}
+
+
+sub serialize {
+
+ my ($self, %params) = @_;
+ return Dumper $self;
+
+}
+
+
+sub deserialize {
+
+ my ($self, %params) = @_;
+ my $string = join'', @{$params{String}};
+ $string =~ s/\$VAR1 =//;
+ $self = eval $string;
+ return $self;
+
+}
+
+
+1;
+
+=head1 NAME
+
+Crypt::RSA::Key::Public -- RSA Public Key Management.
+
+=head1 SYNOPSIS
+
+ $key = new Crypt::RSA::Key::Public;
+ $key->write ( Filename => 'rsakeys/banquo.public' );
+
+ $akey = new Crypt::RSA::Key::Public (
+ Filename => 'rsakeys/banquo.public'
+ );
+
+
+=head1 DESCRIPTION
+
+Crypt::RSA::Key::Public provides basic key management functionality for
+Crypt::RSA public keys. Following methods are available:
+
+=over 4
+
+=item B<new()>
+
+The constructor. Reads the public key from a disk file when
+called with a C<Filename> argument.
+
+=item B<write()>
+
+Causes the key to be written to a disk file specified by the
+C<Filename> argument.
+
+=item B<read()>
+
+Causes the key to be read from a disk file specified by
+C<Filename> into the object.
+
+=item B<serialize()>
+
+Creates a Data::Dumper(3) serialization of the private key and
+returns the string representation.
+
+=item B<deserialize()>
+
+Accepts a serialized key under the C<String> parameter and
+coverts it into the perl representation stored in the object.
+
+=item C<check()>
+
+Check the consistency of the key. Returns undef on failure.
+
+=back
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=head1 SEE ALSO
+
+Crypt::RSA::Key(3), Crypt::RSA::Key::Private(3)
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Public/SSH.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Public/SSH.pm
new file mode 100755
index 00000000000..ffb85c84b7a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Key/Public/SSH.pm
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA::Key::Private::SSH
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: SSH.pm,v 1.1 2001/05/20 23:37:48 vipul Exp $
+
+package Crypt::RSA::Key::Public::SSH;
+use strict;
+use Crypt::RSA::DataFormat qw(bitsize);
+use Crypt::RSA::Key::Public;
+use vars qw(@ISA);
+@ISA = qw(Crypt::RSA::Key::Public);
+
+sub deserialize {
+ my ($self, %params) = @_;
+ my ($bitsize, $e, $n, $ident) = split /\s/, join'',@{$params{String}};
+ $self->n ($n);
+ $self->e ($e);
+ $self->Identity ($ident);
+ return $self;
+}
+
+sub serialize {
+ my ($self, %params) = @_;
+ my $bitsize = bitsize ($self->n);
+ my $string = join ' ', $bitsize, $self->e, $self->n, $self->Identity;
+ return $string;
+}
+
+1;
+
+=head1 NAME
+
+Crypt::RSA::Key::Public::SSH - SSH Public Key Import
+
+=head1 SYNOPSIS
+
+ Crypt::RSA::Key::Public::SSH is a class derived from
+ Crypt::RSA::Key::Public that provides serialize() and
+ deserialze() methods for SSH 2.x keys.
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Primitives.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Primitives.pm
new file mode 100755
index 00000000000..0fd2ed8b1b0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/Primitives.pm
@@ -0,0 +1,149 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA::Primitives -- Cryptography and encoding primitives
+## used by Crypt::RSA.
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: Primitives.pm,v 1.14 2001/06/22 23:27:35 vipul Exp $
+
+package Crypt::RSA::Primitives;
+use strict;
+use base 'Crypt::RSA::Errorhandler';
+use Crypt::RSA::Debug qw(debug);
+use Math::Pari qw(PARI Mod lift);
+use Carp;
+
+sub new {
+ return bless {}, shift;
+}
+
+
+sub core_encrypt {
+
+ # procedure:
+ # c = (m ** e) mod n
+
+ my ($self, %params) = @_;
+ my $key = $params{Key};
+ $self->error ("Bad key.", \%params, $key) unless $key->check();
+ my $plaintext = $params{Message} || $params{Plaintext};
+ debug ("pt == $plaintext");
+
+ my $e = $key->e; my $n = $key->n;
+ return $self->error ("Numeric representation of plaintext is out of bound.",
+ \$plaintext, $key, \%params) if $plaintext > $n;
+ my $c = mod_exp($plaintext, $e, $n);
+ debug ("ct == $c");
+ $n = undef; $e = undef;
+ return $c;
+
+}
+
+
+sub core_decrypt {
+
+ # procedure:
+ # p = (c ** d) mod n
+
+
+ my ($self, %params) = @_;
+ my $key = $params{Key};
+ $self->error ("Bad key.") unless $key->check();
+
+ my $cyphertext = $params{Cyphertext} || $params{Ciphertext};
+ my $n = $key->n;
+ return $self->error ("Decryption error.") if $cyphertext > $n;
+
+ my $pt;
+ if ($key->p && $key->q) {
+ my($p, $q, $d) = ($key->p, $key->q, $key->d);
+ $key->u (mod_inverse($p, $q)) unless $key->u;
+ $key->dp ($d % ($p-1)) unless $key->dp;
+ $key->dq ($d % ($q-1)) unless $key->dq;
+ my $p2 = mod_exp($cyphertext % $p, $key->dp, $p);
+ my $q2 = mod_exp($cyphertext % $q, $key->dq, $q);
+ $pt = $p2 + ($p * ((($q2 - $p2) * $key->u) % $q));
+ }
+ else {
+ $pt = mod_exp ($cyphertext, $key->d, $n);
+ }
+
+ debug ("ct == $cyphertext");
+ debug ("pt == $pt");
+ return $pt;
+
+}
+
+
+sub core_sign {
+
+ my ($self, %params) = @_;
+ $params{Cyphertext} = $params{Message} || $params{Plaintext};
+ return $self->core_decrypt (%params);
+
+}
+
+
+sub core_verify {
+
+ my ($self, %params) = @_;
+ $params{Plaintext} = $params{Signature};
+ return $self->core_encrypt (%params);
+
+}
+
+
+sub mod_inverse {
+ my($a, $n) = @_;
+ my $m = Mod(1, $n);
+ lift($m / $a);
+}
+
+
+sub mod_exp {
+ my($a, $exp, $n) = @_;
+ my $m = Mod($a, $n);
+ lift($m ** $exp);
+}
+
+
+1;
+
+=head1 NAME
+
+Crypt::RSA::Primitives - RSA encryption, decryption, signature and verification primitives.
+
+=head1 SYNOPSIS
+
+ my $prim = new Crypt::RSA::Primitives;
+ my $ctxt = $prim->core_encrypt (Key => $key, Plaintext => $string);
+ my $ptxt = $prim->core_decrypt (Key => $key, Cyphertext => $ctxt);
+ my $sign = $prim->core_sign (Key => $key, Message => $string);
+ my $vrfy = $prim->core_verify (Key => $key, Signature => $sig);
+
+=head1 DESCRIPTION
+
+This module implements RSA encryption, decryption, signature and
+verfication primitives. These primitives should only be used in the
+context of an encryption or signing scheme. See Crypt::RSA::ES::OAEP(3),
+and Crypt::RSA::SS::PSS(3) for the implementation of two such schemes.
+
+=head1 ERROR HANDLING
+
+See B<ERROR HANDLING> in Crypt::RSA(3) manpage.
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=head1 SEE ALSO
+
+Crypt::RSA(3), Crypt::RSA::Key(3), Crypt::RSA::ES::OAEP(3),
+Crypt::RSA::SS::PSS(3)
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/SS/PKCS1v15.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/SS/PKCS1v15.pm
new file mode 100755
index 00000000000..07373f7cd99
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/SS/PKCS1v15.pm
@@ -0,0 +1,247 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA::SS:PKCS1v15
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: PKCS1v15.pm,v 1.6 2001/06/22 23:27:38 vipul Exp $
+
+package Crypt::RSA::SS::PKCS1v15;
+use strict;
+use base 'Crypt::RSA::Errorhandler';
+use Crypt::RSA::DataFormat qw(octet_len os2ip i2osp h2osp);
+use Crypt::RSA::Primitives;
+use Crypt::RSA::Debug qw(debug);
+use Digest::SHA1 qw(sha1);
+use Digest::MD5 qw(md5);
+use Digest::MD2 qw(md2);
+use Math::Pari qw(floor);
+
+$Crypt::RSA::SS::PKCS1v15::VERSION = '1.99';
+
+sub new {
+
+ my ($class, %params) = @_;
+ my $self = bless {
+ primitives => new Crypt::RSA::Primitives,
+ digest => $params{Digest} || 'SHA1',
+ encoding => {
+ MD2 => "0x 30 20 30 0C 06 08 2A 86 48
+ 86 F7 0D 02 02 05 00 04 10",
+ MD5 => "0x 30 20 30 0C 06 08 2A 86 48
+ 86 F7 0D 02 05 05 00 04 10",
+ SHA1 => "0x 30 21 30 09 06 05 2B 0E 03
+ 02 1A 05 00 04 14",
+ },
+ VERSION => $Crypt::RSA::SS::PKCS1v15::VERSION,
+ }, $class;
+ if ($params{Version}) {
+ # do versioning here
+ }
+ return $self;
+
+}
+
+
+sub sign {
+
+ my ($self, %params) = @_;
+ my $key = $params{Key}; my $M = $params{Message} || $params{Plaintext};
+ return $self->error ("No Message or Plaintext parameter", \$key, \%params) unless $M;
+ return $self->error ("No Key parameter", \$M, \%params) unless $key;
+ my $k = octet_len ($key->n);
+
+ my $em;
+ unless ($em = $self->encode ($M, $k-1)) {
+ return $self->error ($self->errstr, \$key, \%params, \$M)
+ if $self->errstr eq "Message too long.";
+ return $self->error ("Modulus too short.", \$key, \%params, \$M)
+ if $self->errstr eq "Intended encoded message length too short";
+ }
+
+ my $m = os2ip ($em);
+ my $sig = $self->{primitives}->core_sign (Key => $key, Message => $m);
+ return i2osp ($sig, $k);
+
+}
+
+
+sub verify {
+
+ my ($self, %params) = @_;
+ my $key = $params{Key}; my $M = $params{Message} || $params{Plaintext};
+ my $S = $params{Signature};
+ return $self->error ("No Message or Plaintext parameter", \$key, \%params) unless $M;
+ return $self->error ("No Key parameter", \$M, \$S, \%params) unless $key;
+ return $self->error ("No Signature parameter", \$key, \$M, \%params) unless $S;
+ my $k = octet_len ($key->n);
+ return $self->error ("Invalid signature.", \$key, \$M, \%params) if length($S) != $k;
+ my $s = os2ip ($S);
+ my $m = $self->{primitives}->core_verify (Key => $key, Signature => $s) ||
+ $self->error ("Invalid signature.", \$M, $key, \%params);
+ my $em = i2osp ($m, $k-1) ||
+ return $self->error ("Invalid signature.", \$M, \$S, $key, \%params);
+ my $em1;
+ unless ($em1 = $self->encode ($M, $k-1)) {
+ return $self->error ($self->errstr, \$key, \%params, \$M)
+ if $self->errstr eq "Message too long.";
+ return $self->error ("Modulus too short.", \$key, \%params, \$M)
+ if $self->errstr eq "Intended encoded message length too short.";
+ }
+
+ debug ("em: $em"); debug ("em1: $em1");
+
+ return 1 if $em eq $em1;
+ return $self->error ("Invalid signature.", \$M, \$key, \%params);
+
+}
+
+
+sub encode {
+
+ my ($self, $M, $emlen) = @_;
+
+ my $H;
+ if ($self->{digest} eq "SHA1") { $H = sha1 ($M) }
+ elsif ($self->{digest} eq "MD5" ) { $H = md5 ($M) }
+ elsif ($self->{digest} eq "MD2" ) { $H = md2 ($M) }
+
+ my $alg = h2osp($self->{encoding}->{$self->{digest}});
+ my $T = $alg . $H;
+ $self->error ("Intended encoded message length too short.", \$M) if $emlen < length($T) + 10;
+ my $pslen = $emlen - length($T) - 2;
+ my $PS = chr(0xff) x $pslen;
+ my $em = chr(1) . $PS . chr(0) . $T;
+ return $em;
+
+}
+
+
+sub version {
+ my $self = shift;
+ return $self->{VERSION};
+}
+
+
+sub signblock {
+ return -1;
+}
+
+
+sub verifyblock {
+ my ($self, %params) = @_;
+ return octet_len($params{Key}->n);
+}
+
+
+1;
+
+=head1 NAME
+
+Crypt::RSA::SS::PKCS1v15 - PKCS #1 v1.5 signatures.
+
+=head1 SYNOPSIS
+
+ my $pkcs = new Crypt::RSA::SS::PKCS1v15 (
+ Digest => 'MD5'
+ );
+
+ my $signature = $pkcs->sign (
+ Message => $message,
+ Key => $private,
+ ) || die $pss->errstr;
+
+ my $verify = $pkcs->verify (
+ Message => $message,
+ Key => $key,
+ Signature => $signature,
+ ) || die $pss->errstr;
+
+
+=head1 DESCRIPTION
+
+This module implements PKCS #1 v1.5 signatures based on RSA. See [13]
+for details on the scheme.
+
+=head1 METHODS
+
+=head2 B<new()>
+
+Constructor. Takes a hash as argument with the following key:
+
+=over 4
+
+=item B<Digest>
+
+Name of the Message Digest algorithm. Three Digest algorithms are
+supported: MD2, MD5 and SHA1. Digest defaults to SHA1.
+
+=back
+
+
+=head2 B<version()>
+
+Returns the version number of the module.
+
+=head2 B<sign()>
+
+Computes a PKCS #1 v1.5 signature on a message with the private key of the
+signer. sign() takes a hash argument with the following mandatory keys:
+
+=over 4
+
+=item B<Message>
+
+Message to be signed, a string of arbitrary length.
+
+=item B<Key>
+
+Private key of the signer, a Crypt::RSA::Key::Private object.
+
+=back
+
+=head2 B<verify()>
+
+Verifies a signature generated with sign(). Returns a true value on
+success and false on failure. $self->errstr is set to "Invalid signature."
+or appropriate error on failure. verify() takes a hash argument with the
+following mandatory keys:
+
+=over 4
+
+=item B<Key>
+
+Public key of the signer, a Crypt::RSA::Key::Public object.
+
+=item B<Message>
+
+The original signed message, a string of arbitrary length.
+
+=item B<Signature>
+
+Signature computed with sign(), a string.
+
+=back
+
+=head1 ERROR HANDLING
+
+See ERROR HANDLING in Crypt::RSA(3) manpage.
+
+=head1 BIBLIOGRAPHY
+
+See BIBLIOGRAPHY in Crypt::RSA(3) manpage.
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=head1 SEE ALSO
+
+Crypt::RSA(3), Crypt::RSA::Primitives(3), Crypt::RSA::Keys(3),
+Crypt::RSA::EME::OAEP(3)
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/SS/PSS.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/SS/PSS.pm
new file mode 100755
index 00000000000..b6727020246
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/SS/PSS.pm
@@ -0,0 +1,274 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA::SS:PSS
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: PSS.pm,v 1.5 2001/06/22 23:27:38 vipul Exp $
+
+package Crypt::RSA::SS::PSS;
+use strict;
+use base 'Crypt::RSA::Errorhandler';
+use Crypt::Random qw(makerandom_octet);
+use Crypt::RSA::DataFormat qw(octet_len os2ip i2osp octet_xor mgf1);
+use Crypt::RSA::Primitives;
+use Crypt::RSA::Debug qw(debug);
+use Digest::SHA1 qw(sha1);
+use Math::Pari qw(floor);
+
+$Crypt::RSA::SS::PSS::VERSION = '1.99';
+
+sub new {
+ my ($class, %params) = @_;
+ my $self = bless { primitives => new Crypt::RSA::Primitives,
+ hlen => 20,
+ VERSION => $Crypt::RSA::SS::PSS::VERSION,
+ }, $class;
+ if ($params{Version}) {
+ # do versioning here
+ }
+ return $self;
+}
+
+
+sub sign {
+ my ($self, %params) = @_;
+ my $key = $params{Key}; my $M = $params{Message} || $params{Plaintext};
+ return $self->error("No Key parameter", \$M, \%params) unless $key;
+ return $self->error("No Message or Plaintext parameter", \$key, \%params) unless $M;
+ my $k = octet_len ($key->n);
+ my $salt = makerandom_octet (Length => $self->{hlen});
+ my $em = $self->encode ($M, $salt, $k-1);
+ my $m = os2ip ($em);
+ my $sig = $self->{primitives}->core_sign (Key => $key, Message => $m);
+ my $S = i2osp ($sig, $k);
+ return ($S, $salt) if wantarray;
+ return $S;
+}
+
+
+sub verify_with_salt {
+ my ($self, %params) = @_;
+ my $key = $params{Key}; my $M = $params{Message} || $params{Plaintext};
+ my $S = $params{Signature}; my $salt = $params{Salt};
+ return $self->error("No Key parameter", \$S, \%params) unless $key;
+ return $self->error("No Signature parameter", \$key, \%params) unless $S;
+ my $k = octet_len ($key->n);
+ my $em;
+ unless ($em = $self->encode ($M, $salt, $k-1)) {
+ return if $self->errstr eq "Message too long.";
+ return $self->error ("Modulus too short.", \$M, \$S, \$key, \%params) if
+ $self->errstr eq "Intended encoded message length too short.";
+ }
+ return $self->error ("Invalid signature.", \$M, \$S, $key, \%params) if length($S) < $k;
+ my $s = os2ip ($S);
+ my $m = $self->{primitives}->core_verify (Key => $key, Signature => $s) ||
+ $self->error ("Invalid signature.", \$M, \$S, $key, \%params);
+ my $em1 = i2osp ($m, $k-1) ||
+ return $self->error ("Invalid signature.", \$M, \$S, $key, \%params);
+ return 1 if $em eq $em1;
+ return $self->error ("Invalid signature.", \$M, \$S, $key, \%params);
+}
+
+
+sub verify {
+ my ($self, %params) = @_;
+ my $key = $params{Key}; my $M = $params{Message} || $params{Plaintext};
+ my $S = $params{Signature};
+ return $self->error("No Key parameter", \$S, \$M, \%params) unless $key;
+ return $self->error("No Signature parameter", \$key, \$M, \%params) unless $S;
+ return $self->error("No Message or Plaintext parameter", \$key, \$S, \%params) unless $M;
+ my $k = octet_len ($key->n);
+ my $s = os2ip ($S);
+ my $m = $self->{primitives}->core_verify (Key => $key, Signature => $s) ||
+ $self->error ("Invalid signature.", \$M, \$S, $key, \%params);
+ my $em1 = i2osp ($m, $k-1) ||
+ return $self->error ("Invalid signature.", \$M, \$S, $key, \%params);
+ return 1 if $self->verify_with_salt_recovery ($M, $em1);
+ return $self->error ("Invalid signature.", \$M, \$S, $key, \%params);
+}
+
+
+sub encode {
+ my ($self, $M, $salt, $emlen) = @_;
+ return $self->error ("Intended encoded message length too short.", \$M, \$salt )
+ if $emlen < 2 * $self->{hlen};
+ my $H = $self->hash ("$salt$M");
+ my $padlength = $emlen - (2*$$self{hlen});
+ my $PS = chr(0)x$padlength;
+ my $db = $salt . $PS;
+ my $dbmask = $self->mgf ($H, $emlen - $self->{hlen});
+ my $maskeddb = octet_xor ($db, $dbmask);
+ my $em = $H . $maskeddb;
+ return $em;
+}
+
+
+sub verify_with_salt_recovery {
+ my ($self, $M, $EM) = @_;
+ my $hlen = $$self{hlen};
+ my $emlen = length ($EM);
+ return $self->error ("Encoded message too short.", \$M, \$EM) if $emlen < (2*$hlen);
+ my $H = substr $EM, 0, $hlen;
+ my $maskeddb = substr $EM, $hlen;
+ my $dbmask = $self->mgf ($H, $emlen-$hlen);
+ my $db = octet_xor ($maskeddb, $dbmask);
+ my $salt = substr $db, 0, $hlen;
+ my $PS = substr $db, $hlen;
+ my $check = chr(0) x ($emlen-(2*$hlen)); debug ("PS: $PS");
+ return $self->error ("Inconsistent.") unless $check eq $PS;
+ my $H1 = $self->hash ("$salt$M");
+ return 1 if $H eq $H1;
+ return $self->error ("Inconsistent.");
+}
+
+
+sub hash {
+ my ($self, $data) = @_;
+ return sha1 ($data);
+}
+
+
+sub mgf {
+ my ($self, @data) = @_;
+ return mgf1 (@data);
+}
+
+
+sub version {
+ my $self = shift;
+ return $self->{VERSION};
+}
+
+
+sub signblock {
+ return -1;
+}
+
+
+sub verifyblock {
+ my ($self, %params) = @_;
+ return octet_len($params{Key}->n);
+}
+
+
+1;
+
+=head1 NAME
+
+Crypt::RSA::SS::PSS - Probabilistic Signature Scheme based on RSA.
+
+=head1 SYNOPSIS
+
+ my $pss = new Crypt::RSA::SS::PSS;
+
+ my $signature = $pss->sign (
+ Message => $message,
+ Key => $private,
+ ) || die $pss->errstr;
+
+ my $verify = $pss->verify (
+ Message => $message,
+ Key => $key,
+ Signature => $signature,
+ ) || die $pss->errstr;
+
+
+=head1 DESCRIPTION
+
+PSS (Probabilistic Signature Scheme) is a provably secure method of
+creating digital signatures with RSA. "Provable" means that the
+difficulty of forging signatures can be directly related to inverting
+the RSA function. "Probabilistic" alludes to the randomly generated salt
+value included in the signature to enhance security. For more details
+on PSS, see [4] & [13].
+
+=head1 METHODS
+
+=head2 B<new()>
+
+Constructor.
+
+=head2 B<version()>
+
+Returns the version number of the module.
+
+=head2 B<sign()>
+
+Computes a PSS signature on a message with the private key of the signer.
+In scalar context, sign() returns the computed signature. In array
+context, it returns the signature and the random salt. The signature can
+verified with verify() or verify_with_salt(). sign() takes a hash argument
+with the following mandatory keys:
+
+=over 4
+
+=item B<Message>
+
+Message to be signed, a string of arbitrary length.
+
+=item B<Key>
+
+Private key of the signer, a Crypt::RSA::Key::Private object.
+
+=back
+
+=head2 B<verify()>
+
+Verifies a signature generated with sign(). The salt is recovered from the
+signature and need not be passed. Returns a true value on success and
+false on failure. $self->errstr is set to "Invalid signature." or
+appropriate error on failure. verify() takes a hash argument with the
+following mandatory keys:
+
+=over 4
+
+=item B<Key>
+
+Public key of the signer, a Crypt::RSA::Key::Public object.
+
+=item B<Message>
+
+The original signed message, a string of arbitrary length.
+
+=item B<Signature>
+
+Signature computed with sign(), a string.
+
+=item B<Version>
+
+Version of the module that was used for creating the Signature. This is an
+optional argument. When present, verify() will ensure before proceeding
+that the installed version of the module can successfully verify the
+Signature.
+
+=back
+
+=head2 B<verify_with_salt()>
+
+Verifies a signature given the salt. Takes the same arguments as verify()
+in addition to B<Salt>, which is a 20-byte string returned by sign() in
+array context.
+
+=head1 ERROR HANDLING
+
+See ERROR HANDLING in Crypt::RSA(3) manpage.
+
+=head1 BIBLIOGRAPHY
+
+See BIBLIOGRAPHY in Crypt::RSA(3) manpage.
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=head1 SEE ALSO
+
+Crypt::RSA(3), Crypt::RSA::Primitives(3), Crypt::RSA::Keys(3),
+Crypt::RSA::EME::OAEP(3)
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/Random.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/Random.pm
new file mode 100755
index 00000000000..dc573d5b405
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/Random.pm
@@ -0,0 +1,267 @@
+#!/usr/bin/perl -s
+##
+## Crypt::Random -- Interface to /dev/random and /dev/urandom.
+##
+## Copyright (c) 1998, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: Random.pm,v 1.11 2001/07/12 15:59:47 vipul Exp $
+
+package Crypt::Random;
+require Exporter;
+use vars qw($VERSION @EXPORT_OK);
+
+BEGIN {
+ *import = \&Exporter::import;
+ @EXPORT_OK = qw( makerandom makerandom_itv makerandom_octet );
+}
+
+use Math::Pari qw(PARI floor Mod pari2pv pari2num lift);
+use Carp;
+use Data::Dumper;
+use Class::Loader;
+use Crypt::Random::Generator;
+
+$VERSION = 1.25;
+
+
+sub _pickprovider {
+
+ my (%params) = @_;
+
+ return $params{Provider} if $params{Provider};
+ $params{Strength} ||= 0;
+ my $gen = new Crypt::Random::Generator Strength => $params{Strength};
+ return $gen->{Provider};
+
+}
+
+sub makerandom {
+
+ my ( %params ) = @_;
+
+ $params{Verbosity} = 0 unless $params{Verbosity};
+ my $uniform = $params{Uniform} || 0;
+ local $| = 1;
+
+ my $provider = _pickprovider(%params);
+ my $loader = new Class::Loader;
+ my $po = $loader->_load ( Module => "Crypt::Random::Provider::$provider",
+ Args => [ map { $_ => $params{$_} }
+ qw(Strength Provider) ] )
+
+ or die "Unable to load module Crypt::Random::Provider::$provider - $!";
+ my $r = $po->get_data( %params );
+
+ my $size = $params{Size};
+ my $down = $size - 1;
+
+ unless ($uniform) {
+
+ # We always set the high bit of the random number if
+ # we want the result to occupy exactly $size bits.
+
+ $y = unpack "H*", pack "B*", '0' x ( $size%8 ? 8-$size % 8 : 0 ). '1'.
+ unpack "b$down", $r;
+
+ } else {
+
+ # If $uniform is set $size of 2 could return 00
+ # and 01 in addition to 10 and 11. 00 and 01 can
+ # be represented in less than 2 bits, but
+ # the result of this generation is uniformally
+ # distributed.
+
+ $y = unpack "H*", pack "B*", '0' x ( $size%8 ? 8-$size % 8 : 0 ).
+ unpack "b$size", $r;
+
+ }
+
+ return Math::Pari::_hex_cvt ( "0x$y" );
+
+}
+
+
+sub makerandom_itv {
+
+ my ( %params ) = @_;
+
+ my $a = $params{ Lower } || 0; $a = PARI ( $a );
+ my $b = $params{ Upper }; $b = PARI ( $b );
+
+ my $itv = Mod ( 0, $b - $a );
+ my $size = length ( $itv ) * 5;
+ my $random = makerandom %params, Size => $size;
+
+ do { $random = makerandom %params, Size => $size }
+ while ( $random >= (PARI(2)**$size) - ((PARI(2)**$size) % lift($b-$a)));
+
+ $itv += $random;
+ my $r = PARI ( lift ( $itv ) + $a );
+
+ undef $itv; undef $a; undef $b;
+ return "$r";
+
+}
+
+
+sub makerandom_octet {
+
+ my ( %params ) = @_;
+
+ $params{Verbosity} = 0 unless $params{Verbosity};
+
+ my $provider = _pickprovider(%params);
+ my $loader = new Class::Loader;
+ my $po = $loader->_load ( Module => "Crypt::Random::Provider::$provider",
+ Args => [ %params ] );
+ return $po->get_data( %params );
+
+
+}
+
+
+'True Value';
+
+=head1 NAME
+
+Crypt::Random - Cryptographically Secure, True Random Number Generator.
+
+=head1 VERSION
+
+ $Revision: 1.11 $
+ $Date: 2001/07/12 15:59:47 $
+
+=head1 SYNOPSIS
+
+ use Crypt::Random qw( makerandom );
+ my $r = makerandom ( Size => 512, Strength => 1 );
+
+=head1 DESCRIPTION
+
+Crypt::Random is an interface module to the /dev/random device found on
+most modern unix systems. It also interfaces with egd, a user space
+entropy gathering daemon, available for systems where /dev/random (or
+similar) devices are not available. When Math::Pari is installed,
+Crypt::Random can generate random integers of arbritary size of a given
+bitsize or in a specified interval.
+
+=head1 BLOCKING BEHAVIOUR
+
+The /dev/random driver maintains an estimate of true randomness in the
+pool and decreases it every time random strings are requested for use.
+When the estimate goes down to zero, the routine blocks and waits for the
+occurrence of non-deterministic events to refresh the pool.
+
+When the routine is blocked, Crypt::Random's read() will be blocked till
+desired amount of random bytes have been read off of the device. The
+/dev/random kernel module also provides another interface, /dev/urandom,
+that does not wait for the entropy-pool to recharge and returns as many
+bytes as requested. For applications that must not block (for a
+potentially long time) should use /dev/urandom. /dev/random should be
+reserved for instances where very high quality randomness is desired.
+
+=head1 HARDWARE RNG
+
+If there's a hardware random number generator available, for instance the
+Intel i8x0 random number generator, please use it instead of /dev/random!.
+It'll be high quality, a lot faster and it won't block! Usually your OS
+will provide access to the RNG as a device, eg (/dev/intel_rng).
+
+=head1 METHODS
+
+=over 4
+
+=item B<makerandom()>
+
+Generates a random number of requested bitsize in base 10. Following
+arguments can be specified.
+
+=over 4
+
+=item B<Size>
+
+Bitsize of the random number.
+
+=item B<Strength> 0 || 1
+
+Value of 1 implies that /dev/random should be used
+for requesting random bits while 0 implies /dev/urandom.
+
+=item B<Device>
+
+Alternate device to request random bits from.
+
+=item B<Uniform> 0 || 1
+
+Value of 0 (default) implies that the high bit of the generated random
+number is always set, ensuring the bitsize of the generated random will be
+exactly Size bits. For uniformally distributed random numbers, Uniform
+should be set to 1.
+
+=back
+
+=item B<makerandom_itv()>
+
+Generates a random number in the specified interval. In addition
+to the arguments to makerandom() following attributes can be
+specified.
+
+=over 4
+
+=item B<Lower>
+
+Inclusive Lower limit.
+
+=item B<Upper>
+
+Exclusive Upper limit.
+
+=back
+
+=item B<makerandom_octet()>
+
+Generates a random octet string of specified length. In addition to
+B<Strength>, B<Device> and B<Verbosity>, following arguments can be
+specified.
+
+=over 4
+
+=item B<Length>
+
+Length of the desired octet string.
+
+=item B<Skip>
+
+An octet string consisting of characters to be skipped while reading from
+the random device.
+
+=back
+
+=back
+
+=head1 DEPENDENCIES
+
+Crypt::Random needs Math::Pari 2.001802 or higher. As of this writing, the
+latest version of Math::Pari isn't available from CPAN. Fetch it from
+ftp://ftp.math.ohio-state.edu/pub/users/ilya/perl/modules/
+
+=head1 BIBLIOGRAPHY
+
+=over 4
+
+=item 1 random.c by Theodore Ts'o. Found in drivers/char directory of
+the Linux kernel sources.
+
+=item 2 Handbook of Applied Cryptography by Menezes, Paul C. van Oorschot
+and Scott Vanstone.
+
+=back
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, <mail@vipul.net>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Generator.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Generator.pm
new file mode 100755
index 00000000000..8833b0e7679
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Generator.pm
@@ -0,0 +1,101 @@
+#!/usr/bin/perl -sw
+##
+##
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: Generator.pm,v 1.2 2001/06/22 03:43:51 vipul Exp $
+
+package Crypt::Random::Generator;
+use Crypt::Random qw(makerandom makerandom_itv makerandom_octet);
+use Carp;
+
+my @PROVIDERS = qw(devrandom devurandom egd rand);
+my %STRENGTH = ( 0 => [ qw(devurandom egd rand) ], 1 => [ qw(devrandom egd rand) ] );
+
+sub new {
+
+ my ($class, %params) = @_;
+
+ my $self = { _STRENGTH => \%STRENGTH, _PROVIDERS => \@PROVIDERS };
+
+ $$self{Strength} = $params{Strength} || 0;
+ $$self{Provider} = $params{Provider} || "";
+ $$self{ProviderParams} = $params{ProviderParams} || "";
+
+ bless $self, $class;
+
+ unless ($$self{Provider}) {
+ SELECT_PROVIDER: for ($self->strength_order($$self{Strength})) {
+ my $pname = $_; my $fqpname = "Crypt::Random::Provider::$pname";
+ if (eval "use $fqpname; $fqpname->available()") {
+ if (grep { $pname eq $_ } $self->providers) {
+ $$self{Provider} = $pname;
+ last SELECT_PROVIDER;
+ }
+ }
+ }
+ }
+
+ croak "No provider available.\n" unless $$self{Provider};
+ return $self;
+
+}
+
+
+sub providers {
+
+ my ($self, @args) = @_;
+ if (@args) { $$self{_PROVIDERS} = [@args] }
+ return @{$$self{_PROVIDERS}};
+
+}
+
+
+sub strength_order {
+
+ my ($self, $strength, @args) = @_;
+ if (@args) { $$self{_STRENGTH}{$strength} = [@args] }
+ return @{$$self{_STRENGTH}{$strength}}
+
+}
+
+
+sub integer {
+
+ my ($self, %params) = @_;
+ if ($params{Size}) {
+ return makerandom (
+ Size => $params{Size},
+ Provider => $$self{Provider},
+ Verbosity => $params{Verbosity} || $$self{Verbosity},
+ %{$$self{ProviderParams}},
+ )
+ } elsif ($params{Upper}) {
+ return makerandom_itv (
+ Lower => $params{Lower} || 0,
+ Upper => $params{Upper},
+ Provider => $$self{Provider},
+ Verbosity => $params{Verbosity} || $$self{Verbosity},
+ %{$$self{ProviderParams}},
+ )
+ }
+
+}
+
+
+sub string {
+
+ my ($self, %params) = @_;
+ return makerandom_octet (
+ %params,
+ Provider => $$self{Provider},
+ Verbosity => $params{Verbosity} || $$self{Verbosity},
+ %{$$self{ProviderParams}},
+ )
+
+}
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/File.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/File.pm
new file mode 100755
index 00000000000..816f8054d07
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/File.pm
@@ -0,0 +1,62 @@
+package Crypt::Random::Provider::File;
+use strict;
+use Carp;
+use Math::Pari qw(pari2num);
+use Fcntl;
+
+sub _defaultsource {
+ return;
+}
+
+
+sub new {
+
+ my ($class, %args) = @_;
+ my $self = { Source => $args{File} || $args{Device} || $args{Filename} || $class->_defaultsource() };
+ return bless $self, $class;
+
+}
+
+
+sub get_data {
+
+ my ($self, %params) = @_;
+ $self = {} unless ref $self;
+
+ my $size = $params{Size};
+ my $skip = $params{Skip} || $$self{Skip} || '';
+ my $q_skip = quotemeta($skip);
+
+ if ($size && ref $size eq "Math::Pari") {
+ $size = pari2num($size);
+ }
+
+ my $bytes = $params{Length} || (int($size / 8) + 1);
+
+ sysopen RANDOM, $$self{Source}, O_RDONLY;
+
+ my($r, $read, $rt) = ('', 0);
+ while ($read < $bytes) {
+ my $howmany = sysread RANDOM, $rt, $bytes - $read;
+ next unless $howmany;
+ if ($howmany == -1) {
+ croak "Error while reading from $$self{Source}. $!"
+ }
+ $rt =~ s/[$q_skip]//g if $skip;
+ $r .= $rt;
+ $read = length $r;
+ }
+
+ $r;
+
+}
+
+
+sub available {
+ my ($class) = @_;
+ return -e $class->_defaultsource();
+}
+
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/devrandom.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/devrandom.pm
new file mode 100755
index 00000000000..a25f59ab14c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/devrandom.pm
@@ -0,0 +1,21 @@
+#!/usr/bin/perl -sw
+##
+##
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: devrandom.pm,v 1.2 2001/06/22 18:16:29 vipul Exp $
+
+package Crypt::Random::Provider::devrandom;
+use strict;
+use lib qw(lib);
+use Crypt::Random::Provider::File;
+use vars qw(@ISA);
+@ISA = qw(Crypt::Random::Provider::File);
+
+sub _defaultsource { return "/dev/random" }
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/devurandom.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/devurandom.pm
new file mode 100755
index 00000000000..d24d4b064ac
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/devurandom.pm
@@ -0,0 +1,21 @@
+#!/usr/bin/perl -sw
+##
+##
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: devurandom.pm,v 1.2 2001/06/22 18:16:29 vipul Exp $
+
+package Crypt::Random::Provider::devurandom;
+use strict;
+use lib qw(lib);
+use Crypt::Random::Provider::File;
+use vars qw(@ISA);
+@ISA = qw(Crypt::Random::Provider::File);
+
+sub _defaultsource { return "/dev/urandom" }
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/egd.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/egd.pm
new file mode 100755
index 00000000000..869180c9a49
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/egd.pm
@@ -0,0 +1,90 @@
+#!/usr/bin/perl -sw
+##
+##
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: egd.pm,v 1.5 2001/07/12 15:59:48 vipul Exp $
+
+package Crypt::Random::Provider::egd;
+use strict;
+
+use IO::Socket;
+use Carp;
+use Math::Pari qw(pari2num);
+
+
+sub _defaultsource {
+
+ my $source;
+ for my $d (qw( /var/run/egd-pool /dev/egd-pool /etc/entropy )) {
+ if (IO::Socket::UNIX->new(Peer => $d)) { $source = $d; last }
+ }
+ return $source;
+
+}
+
+
+sub new {
+
+ my ($class, %args) = @_;
+ my $self = { Source => $args{Source} || $args{Device} || $args{Filename} };
+ $$self{Source} = $class->_defaultsource() unless $$self{Source};
+ croak "egd entropy pool file not found.\n" unless $$self{Source};
+ return bless $self, $class;
+
+}
+
+
+sub get_data {
+
+ my ( $self, %params ) = @_;
+ my $class = ref $self || $self;
+ $self = {} unless ref $self;
+
+ my $bytes = $params{Length} ||
+ (int( pari2num($params{ Size }) / 8) + 1);
+ my $dev = $params{Source} || $$self{Source};
+ my $skip = $params{Skip};
+
+ croak "$dev doesn't exist. aborting." unless $dev && -e $dev;
+
+ my $s = IO::Socket::UNIX->new(Peer => $dev);
+ croak "couldn't talk to egd. $!" unless $s;
+
+ my($r, $read) = ('', 0);
+ while ($read < $bytes) {
+ my $msg = pack "CC", 0x01, 1;
+ $s->syswrite($msg, length $msg);
+ my $rt;
+ my $nread = $s->sysread($rt, 1);
+ croak "read from entropy socket failed" unless $nread == 1;
+ my $count = unpack("C", $rt);
+ $nread = $s->sysread($rt, $count);
+ croak "couldn't get all the requested entropy. aborting."
+ unless $nread == $count;
+ unless ($skip && $skip =~ /\Q$rt\E/) {
+ if ($params{Verbosity}) { print '.' unless $read % 2 }
+ $r .= $rt;
+ $read++;
+ }
+ }
+
+ $r;
+}
+
+
+sub available {
+
+ my $class = shift;
+ return 1 if $class->_defaultsource();
+ return;
+
+}
+
+
+1;
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/rand.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/rand.pm
new file mode 100755
index 00000000000..8f34f193f57
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/Random/Provider/rand.pm
@@ -0,0 +1,60 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::Random::Provider::rand
+##
+## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: rand.pm,v 1.2 2001/06/22 18:16:29 vipul Exp $
+
+package Crypt::Random::Provider::rand;
+use strict;
+use Math::Pari qw(pari2num);
+
+sub new {
+
+ my ($class, %params) = @_;
+ my $self = { Source => $params{Source} || sub { return rand($_[0]) } };
+ return bless $self, $class;
+
+}
+
+
+sub get_data {
+
+ my ($self, %params) = @_;
+ $self = {} unless ref $self;
+
+ my $size = $params{Size};
+ my $skip = $params{Skip} || $$self{Skip};
+
+ if ($size && ref $size eq "Math::Pari") {
+ $size = pari2num($size);
+ }
+
+ my $bytes = $params{Length} || (int($size / 8) + 1);
+ my $source = $$self{Source} || sub { rand($_[0]) };
+
+ my($r, $read, $rt) = ('', 0);
+ while ($read < $bytes) {
+ $rt = chr(int(&$source(256)));
+ unless ($skip && $skip =~ /\Q$rt\E/) {
+ $r .= $rt; $read++;
+ }
+ }
+
+ $r;
+
+}
+
+
+sub available {
+
+ return 1;
+
+}
+
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/Rijndael.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/Rijndael.pm
new file mode 100755
index 00000000000..e1991fad532
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/Rijndael.pm
@@ -0,0 +1,135 @@
+=head1 NAME
+
+Crypt::Rijndael - Crypt::CBC compliant Rijndael encryption module
+
+=head1 SYNOPSIS
+
+ use Crypt::Rijndael;
+
+ # keysize() is 32, but 24 and 16 are also possible
+ # blocksize() is 16
+
+ $cipher = Crypt::Rijndael->new( "a" x 32, Crypt::Rijndael::MODE_CBC() );
+
+ $cipher->set_iv($iv);
+ $crypted = $cipher->encrypt($plaintext);
+ # - OR -
+ $plaintext = $cipher->decrypt($crypted);
+
+=head1 DESCRIPTION
+
+This module implements the Rijndael cipher, which has just been selected
+as the Advanced Encryption Standard.
+
+=over 4
+
+=cut
+
+package Crypt::Rijndael;
+use strict;
+use vars qw( $VERSION @ISA );
+
+use warnings;
+no warnings;
+
+require DynaLoader;
+
+$VERSION = '1.09';
+@ISA = qw/DynaLoader/;
+
+bootstrap Crypt::Rijndael $VERSION;
+
+=item keysize
+
+Returns the keysize, which is 32 (bytes). The Rijndael cipher
+actually supports keylengths of 16, 24 or 32 bytes, but there is no
+way to communicate this to C<Crypt::CBC>.
+
+=item blocksize
+
+The blocksize for Rijndael is 16 bytes (128 bits), although the
+algorithm actually supports any blocksize that is any multiple of
+our bytes. 128 bits, is however, the AES-specified block size,
+so this is all we support.
+
+=item $cipher = Crypt::Rijndael->new( $key [, $mode] )
+
+Create a new C<Crypt::Rijndael> cipher object with the given key
+(which must be 128, 192 or 256 bits long). The additional C<$mode>
+argument is the encryption mode, either C<MODE_ECB> (electronic
+codebook mode, the default), C<MODE_CBC> (cipher block chaining, the
+same that C<Crypt::CBC> does), C<MODE_CFB> (128-bit cipher feedback),
+C<MODE_OFB> (128-bit output feedback), or C<MODE_CTR> (counter mode).
+
+ECB mode is very insecure (read a book on cryptography if you dont
+know why!), so you should probably use CBC mode.
+
+=item $cipher->set_iv($iv)
+
+This allows you to change the initial value vector used by the
+chaining modes. It is not relevant for ECB mode.
+
+=item $cipher->encrypt($data)
+
+Encrypt data. The size of C<$data> must be a multiple of C<blocksize>
+(16 bytes), otherwise this function will croak. Apart from that, it
+can be of (almost) any length.
+
+=item $cipher->decrypt($data)
+
+Decrypts C<$data>.
+
+=back
+
+=head2 Encryption modes
+
+Use these constants to select the cipher type:
+
+=over 4
+
+=item MODE_CBC - Cipher Block Chaining
+
+=item MODE_CFB - Cipher feedback
+
+=item MODE_CTR - Counter mode
+
+=item MODE_ECB - Electronic cookbook mode
+
+=item MODE_OFB - Output feedback
+
+=item MODE_PCBC - ignore this one for now :)
+
+=back
+
+=head1 SEE ALSO
+
+L<Crypt::CBC>, http://www.csrc.nist.gov/encryption/aes/
+
+=head1 BUGS
+
+Should EXPORT or EXPORT_OK the MODE constants.
+
+=head1 AUTHOR
+
+Currently maintained by brian d foy, C<< <bdfoy@cpan.org> >>.
+
+Original code by Rafael R. Sevilla.
+
+The Rijndael Algorithm was developed by Vincent Rijmen and Joan Daemen,
+and has been selected as the US Government's Advanced Encryption Standard.
+
+=head1 SOURCE
+
+This code is in Github:
+
+ git://github.com/briandfoy/crypt-rijndael.git
+
+=head1 LICENSE
+
+This software is licensed under the Lesser GNU Public License. See the included
+COPYING file for details.
+
+=cut
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay.pm
new file mode 100755
index 00000000000..4a9ee5a2c6f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay.pm
@@ -0,0 +1,423 @@
+package Crypt::SSLeay;
+
+use strict;
+use vars '$VERSION';
+$VERSION = '0.57';
+
+eval {
+ require XSLoader;
+ XSLoader::load('Crypt::SSLeay', $VERSION);
+ 1;
+}
+or do {
+ require DynaLoader;
+ use vars '@ISA'; # not really locally scoped, it just looks that way
+ @ISA = qw(DynaLoader);
+ bootstrap Crypt::SSLeay $VERSION;
+};
+
+use vars qw(%CIPHERS);
+%CIPHERS = (
+ 'NULL-MD5' => "No encryption with a MD5 MAC",
+ 'RC4-MD5' => "128 bit RC4 encryption with a MD5 MAC",
+ 'EXP-RC4-MD5' => "40 bit RC4 encryption with a MD5 MAC",
+ 'RC2-CBC-MD5' => "128 bit RC2 encryption with a MD5 MAC",
+ 'EXP-RC2-CBC-MD5' => "40 bit RC2 encryption with a MD5 MAC",
+ 'IDEA-CBC-MD5' => "128 bit IDEA encryption with a MD5 MAC",
+ 'DES-CBC-MD5' => "56 bit DES encryption with a MD5 MAC",
+ 'DES-CBC-SHA' => "56 bit DES encryption with a SHA MAC",
+ 'DES-CBC3-MD5' => "192 bit EDE3 DES encryption with a MD5 MAC",
+ 'DES-CBC3-SHA' => "192 bit EDE3 DES encryption with a SHA MAC",
+ 'DES-CFB-M1' => "56 bit CFB64 DES encryption with a one byte MD5 MAC",
+);
+
+use Crypt::SSLeay::X509;
+
+# A xsupp bug made this nessesary
+sub Crypt::SSLeay::CTX::DESTROY { shift->free; }
+sub Crypt::SSLeay::Conn::DESTROY { shift->free; }
+sub Crypt::SSLeay::X509::DESTROY { shift->free; }
+
+1;
+
+__END__
+
+=head1 NAME
+
+Crypt::SSLeay - OpenSSL support for LWP
+
+=head1 SYNOPSIS
+
+ lwp-request https://www.example.com
+
+ use LWP::UserAgent;
+ my $ua = LWP::UserAgent->new;
+ my $req = HTTP::Request->new('GET', 'https://www.example.com/');
+ my $res = $ua->request($req);
+ print $res->content, "\n";
+
+=head1 DESCRIPTION
+
+This document describes C<Crypt::SSLeay> version 0.57, released
+2007-09-17.
+
+This perl module provides support for the https protocol under LWP,
+to allow an C<LWP::UserAgent> object to perform GET, HEAD and POST
+requests. Please see LWP for more information on POST requests.
+
+The C<Crypt::SSLeay> package provides C<Net::SSL>, which is loaded
+by C<LWP::Protocol::https> for https requests and provides the
+necessary SSL glue.
+
+This distribution also makes following deprecated modules available:
+
+ Crypt::SSLeay::CTX
+ Crypt::SSLeay::Conn
+ Crypt::SSLeay::X509
+
+Work on Crypt::SSLeay has been continued only to provide https
+support for the LWP (libwww-perl) libraries.
+
+=head1 ENVIRONMENT VARIABLES
+
+The following environment variables change the way
+C<Crypt::SSLeay> and C<Net::SSL> behave.
+
+ # proxy support
+ $ENV{HTTPS_PROXY} = 'http://proxy_hostname_or_ip:port';
+
+ # proxy_basic_auth
+ $ENV{HTTPS_PROXY_USERNAME} = 'username';
+ $ENV{HTTPS_PROXY_PASSWORD} = 'password';
+
+ # debugging (SSL diagnostics)
+ $ENV{HTTPS_DEBUG} = 1;
+
+ # default ssl version
+ $ENV{HTTPS_VERSION} = '3';
+
+ # client certificate support
+ $ENV{HTTPS_CERT_FILE} = 'certs/notacacert.pem';
+ $ENV{HTTPS_KEY_FILE} = 'certs/notacakeynopass.pem';
+
+ # CA cert peer verification
+ $ENV{HTTPS_CA_FILE} = 'certs/ca-bundle.crt';
+ $ENV{HTTPS_CA_DIR} = 'certs/';
+
+ # Client PKCS12 cert support
+ $ENV{HTTPS_PKCS12_FILE} = 'certs/pkcs12.pkcs12';
+ $ENV{HTTPS_PKCS12_PASSWORD} = 'PKCS12_PASSWORD';
+
+=head1 INSTALL
+
+=head2 OpenSSL
+
+You must have OpenSSL or SSLeay installed before compiling
+this module. You can get the latest OpenSSL package from:
+
+ http://www.openssl.org/
+
+On Debian systems, you will need to install the libssl-dev package,
+at least for the duration of the build (it may be removed afterwards).
+
+Other package-based systems may require something similar. The key
+is that Crypt::SSLeay makes calls to the OpenSSL library, and how
+to do so is specified in the C header files that come with the
+library. Some systems break out the header files into a separate
+package from that of the libraries. Once the program has been built,
+you don't need the headers any more.
+
+When installing openssl make sure your config looks like:
+
+ ./config --openssldir=/usr/local/openssl
+ or
+ ./config --openssldir=/usr/local/ssl
+
+If you are planning on upgrading the default OpenSSL libraries on
+a system like RedHat, (not recommended), then try something like:
+
+ ./config --openssldir=/usr --shared
+
+The --shared option to config will set up building the .so
+shared libraries which is important for such systems. This is
+followed by:
+
+ make
+ make test
+ make install
+
+This way Crypt::SSLeay will pick up the includes and
+libraries automatically. If your includes end up
+going into a separate directory like /usr/local/include,
+then you may need to symlink /usr/local/openssl/include
+to /usr/local/include
+
+=head2 Crypt::SSLeay
+
+The latest Crypt::SSLeay can be found at your nearest CPAN,
+as well as:
+
+ http://search.cpan.org/dist/Crypt-SSLeay/
+
+Once you have downloaded it, Crypt::SSLeay installs easily
+using the C<make> * commands as shown below.
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+ * use nmake or dmake on Win32
+
+For unattended (batch) installations, to be absolutely certain that
+F<Makefile.PL> does not prompt for questions on STDIN, set the
+following environment variable beforehand:
+
+ PERL_MM_USE_DEFAULT=1
+
+(This is true for any CPAN module that uses C<ExtUtils::MakeMaker>).
+
+=head3 Windows
+
+C<Crypt::SSLeay> builds correctly with Strawberry Perl.
+
+For Activestate users, the ActiveState company does not have a
+permit from the Canadian Federal Government to distribute cryptographic
+software. This prevents C<Crypt::SSLeay> from being distributed as
+a PPM package from their repository. See
+L<http://aspn.activestate.com/ASPN/docs/ActivePerl/5.8/faq/ActivePerl-faq2.html#crypto_packages>
+for more information on this issue.
+
+You may download it from Randy Kobes's PPM repository by using
+the following command:
+
+ ppm install http://theoryx5.uwinnipeg.ca/ppms/Crypt-SSLeay.ppd
+
+An alternative is to add the uwinnipeg.ca PPM repository to your
+local installation. See L<http://cpan.uwinnipeg.ca/htdocs/faqs/ppm.html>
+for more details.
+
+=head3 VMS
+
+It is assumed that the OpenSSL installation is located at
+C</ssl$root>. Define this logical to point to the appropriate
+place in the filesystem.
+
+=head1 PROXY SUPPORT
+
+LWP::UserAgent and Crypt::SSLeay have their own versions of
+proxy support. Please read these sections to see which one
+is appropriate.
+
+=head2 LWP::UserAgent proxy support
+
+LWP::UserAgent has its own methods of proxying which may work for
+you and is likely to be incompatible with Crypt::SSLeay proxy support.
+To use LWP::UserAgent proxy support, try something like:
+
+ my $ua = new LWP::UserAgent;
+ $ua->proxy([qw( https http )], "$proxy_ip:$proxy_port");
+
+At the time of this writing, libwww v5.6 seems to proxy https
+requests fine with an Apache mod_proxy server. It sends a line like:
+
+ GET https://www.example.com HTTP/1.1
+
+to the proxy server, which is not the CONNECT request that
+some proxies would expect, so this may not work with other
+proxy servers than mod_proxy. The CONNECT method is used
+by Crypt::SSLeay's internal proxy support.
+
+=head2 Crypt::SSLeay proxy support
+
+For native Crypt::SSLeay proxy support of https requests,
+you need to set the environment variable C<HTTPS_PROXY> to your
+proxy server and port, as in:
+
+ # proxy support
+ $ENV{HTTPS_PROXY} = 'http://proxy_hostname_or_ip:port';
+ $ENV{HTTPS_PROXY} = '127.0.0.1:8080';
+
+Use of the C<HTTPS_PROXY> environment variable in this way
+is similar to C<LWP::UserAgent->env_proxy()> usage, but calling
+that method will likely override or break the Crypt::SSLeay
+support, so do not mix the two.
+
+Basic auth credentials to the proxy server can be provided
+this way:
+
+ # proxy_basic_auth
+ $ENV{HTTPS_PROXY_USERNAME} = 'username';
+ $ENV{HTTPS_PROXY_PASSWORD} = 'password';
+
+For an example of LWP scripting with C<Crypt::SSLeay> native proxy
+support, please look at the F<eg/lwp-ssl-test> script in the
+C<Crypt::SSLeay> distribution.
+
+=head1 CLIENT CERTIFICATE SUPPORT
+
+Client certificates are supported. PEM0encoded certificate and
+private key files may be used like this:
+
+ $ENV{HTTPS_CERT_FILE} = 'certs/notacacert.pem';
+ $ENV{HTTPS_KEY_FILE} = 'certs/notacakeynopass.pem';
+
+You may test your files with the F<eg/net-ssl-test> program,
+bundled with the distribution, by issuing a command like:
+
+ perl eg/net-ssl-test -cert=certs/notacacert.pem \
+ -key=certs/notacakeynopass.pem -d GET $HOST_NAME
+
+Additionally, if you would like to tell the client where
+the CA file is, you may set these.
+
+ $ENV{HTTPS_CA_FILE} = "some_file";
+ $ENV{HTTPS_CA_DIR} = "some_dir";
+
+There is no sample CA cert file at this time for testing,
+but you may configure F<eg/net-ssl-test> to use your CA cert
+with the -CAfile option. (TODO: then what is the ./certs
+directory in the distribution?)
+
+=head2 Creating a test certificate
+
+To create simple test certificates with OpenSSL, you may
+run the following command:
+
+ openssl req -config /usr/local/openssl/openssl.cnf \
+ -new -days 365 -newkey rsa:1024 -x509 \
+ -keyout notacakey.pem -out notacacert.pem
+
+To remove the pass phrase from the key file, run:
+
+ openssl rsa -in notacakey.pem -out notacakeynopass.pem
+
+=head2 PKCS12 support
+
+The directives for enabling use of PKCS12 certificates is:
+
+ $ENV{HTTPS_PKCS12_FILE} = 'certs/pkcs12.pkcs12';
+ $ENV{HTTPS_PKCS12_PASSWORD} = 'PKCS12_PASSWORD';
+
+Use of this type of certificate takes precedence over previous
+certificate settings described. (TODO: unclear? Meaning "the
+presence of this type of certificate??)
+
+=head1 SSL versions
+
+Crypt::SSLeay tries very hard to connect to I<any> SSL web server
+accomodating servers that are buggy, old or simply
+not standards-compliant. To this effect, this module will
+try SSL connections in this order:
+
+ SSL v23 - should allow v2 and v3 servers to pick their best type
+ SSL v3 - best connection type
+ SSL v2 - old connection type
+
+Unfortunately, some servers seem not to handle a reconnect
+to SSL v3 after a failed connect of SSL v23 is tried,
+so you may set before using LWP or Net::SSL:
+
+ $ENV{HTTPS_VERSION} = 3;
+
+to force a version 3 SSL connection first. At this time only a
+version 2 SSL connection will be tried after this, as the connection
+attempt order remains unchanged by this setting.
+
+=head1 ACKNOWLEDGEMENTS
+
+Many thanks to Gisle Aas for writing this module and many others
+including libwww, for perl. The web will never be the same :)
+
+Ben Laurie deserves kudos for his excellent patches for better error
+handling, SSL information inspection, and random seeding.
+
+Thanks to Dongqiang Bai for host name resolution fix when using a
+proxy.
+
+Thanks to Stuart Horner of Core Communications, Inc. who found the
+need for building --shared OpenSSL libraries.
+
+Thanks to Pavel Hlavnicka for a patch for freeing memory when using
+a pkcs12 file, and for inspiring more robust read() behavior.
+
+James Woodyatt is a champ for finding a ridiculous memory leak that
+has been the bane of many a Crypt::SSLeay user.
+
+Thanks to Bryan Hart for his patch adding proxy support,
+and thanks to Tobias Manthey for submitting another approach.
+
+Thanks to Alex Rhomberg for Alpha linux ccc patch.
+
+Thanks to Tobias Manthey for his patches for client certificate
+support.
+
+Thanks to Daisuke Kuroda for adding PKCS12 certificate support.
+
+Thanks to Gamid Isayev for CA cert support and insights into error
+messaging.
+
+Thanks to Jeff Long for working through a tricky CA cert SSLClientVerify
+issue.
+
+Thanks to Chip Turner for patch to build under perl 5.8.0.
+
+Thanks to Joshua Chamas for the time he spent maintaining the
+module.
+
+Thanks to Jeff Lavallee for help with alarms on read failures (CPAN
+bug #12444).
+
+Thanks to Guenter Knauf for significant improvements in configuring
+things in Win32 and Netware lands and Jan Dubois for various
+suggestions for improvements.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Net::SSL
+
+If you have downloaded this distribution as of a dependency
+of another distribution, it's probably due to this module
+(which is included in this distribution).
+
+=item Net::SSLeay
+
+A module that offers access to the OpenSSL API directly from Perl.
+
+ http://search.cpan.org/dist/Net_SSLeay.pm/
+
+=item http://www.openssl.org/related/binaries.html
+
+Pointers on where to find OpenSSL binary packages (Windows).
+
+=back
+
+=head1 SUPPORT
+
+For use of Crypt::SSLeay & Net::SSL with perl's LWP, please
+send email to C<libwww@perl.org>.
+
+For OpenSSL or general SSL support please email the
+openssl user mailing list at C<openssl-users@openssl.org>.
+This includes issues associated with building and installing
+OpenSSL on one's system.
+
+Please report all bugs at
+L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Crypt-SSLeay>.
+
+This module was originally written by Gisle Aas, and was subsequently
+maintained by Joshua Chamas. It is currently maintained by David
+Landgren.
+
+=head1 COPYRIGHT
+
+ Copyright (c) 2006-2007 David Landgren.
+ Copyright (c) 1999-2003 Joshua Chamas.
+ Copyright (c) 1998 Gisle Aas.
+
+This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/CTX.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/CTX.pm
new file mode 100755
index 00000000000..8712ba81887
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/CTX.pm
@@ -0,0 +1,4 @@
+package Crypt::SSLeay::CTX;
+require Crypt::SSLeay;
+use strict;
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/Conn.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/Conn.pm
new file mode 100755
index 00000000000..80abd4f46a9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/Conn.pm
@@ -0,0 +1,4 @@
+package Crypt::SSLeay::Conn;
+require Crypt::SSLeay;
+use strict;
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/Err.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/Err.pm
new file mode 100755
index 00000000000..013e4a6b082
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/Err.pm
@@ -0,0 +1,4 @@
+package Crypt::SSLeay::Err;
+require Crypt::SSLeay;
+use strict;
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/MainContext.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/MainContext.pm
new file mode 100755
index 00000000000..fd019364e81
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/MainContext.pm
@@ -0,0 +1,42 @@
+package Crypt::SSLeay::MainContext;
+
+# maintains a single instance of the Crypt::SSLeay::CTX class
+
+use strict;
+use Carp ();
+
+require Crypt::SSLeay::CTX;
+
+my $ctx = &main_ctx();
+
+sub main_ctx {
+ my $ssl_version = shift || 23;
+
+ my $ctx = Crypt::SSLeay::CTX->new($ssl_version);
+ $ctx->set_cipher_list($ENV{CRYPT_SSLEAY_CIPHER})
+ if $ENV{CRYPT_SSLEAY_CIPHER};
+
+ $ctx;
+}
+
+my %sub_cache = ('main_ctx' => \&main_ctx );
+
+sub import {
+ my $pkg = shift;
+ my $callpkg = caller();
+ my @func = @_;
+ for (@func) {
+ s/^&//;
+ Carp::croak("Can't export $_ from $pkg") if /\W/;;
+ my $sub = $sub_cache{$_};
+ unless ($sub) {
+ my $method = $_;
+ $method =~ s/^main_ctx_//; # optional prefix
+ $sub = $sub_cache{$_} = sub { $ctx->$method(@_) };
+ }
+ no strict 'refs';
+ *{"${callpkg}::$_"} = $sub;
+ }
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/X509.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/X509.pm
new file mode 100755
index 00000000000..5fd50ca6cb7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/SSLeay/X509.pm
@@ -0,0 +1,26 @@
+package Crypt::SSLeay::X509;
+
+use strict;
+
+sub not_before {
+ my $cert = shift;
+ not_string2time($cert->get_notBeforeString);
+}
+
+sub not_after {
+ my $cert = shift;
+ not_string2time($cert->get_notAfterString);
+}
+
+sub not_string2time {
+ my $string = shift;
+ # $string has the form 021019235959Z
+ my($year, $month, $day, $hour, $minute, $second, $GMT)=
+ $string=~m/(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(Z)?/;
+ $year += 2000;
+ my $time="$year-$month-$day $hour:$minute:$second";
+ $time .= " GMT" if $GMT;
+ $time;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/Twofish.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/Twofish.pm
new file mode 100755
index 00000000000..ed4b125a051
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/Twofish.pm
@@ -0,0 +1,159 @@
+# $Id: Twofish.pm,v 2.12 2001/05/21 17:38:01 ams Exp $
+# Copyright 2001 Abhijit Menon-Sen <ams@toroid.org>
+
+package Crypt::Twofish;
+
+use strict;
+use Carp;
+use DynaLoader;
+use vars qw( @ISA $VERSION );
+
+@ISA = qw( DynaLoader );
+$VERSION = '2.13';
+
+bootstrap Crypt::Twofish $VERSION;
+
+sub keysize () { 16 }
+sub blocksize () { 16 }
+
+sub new
+{
+ my ($class, $key) = @_;
+
+ croak "Usage: ".__PACKAGE__."->new(\$key)" unless $key;
+ return Crypt::Twofish::setup($key);
+}
+
+sub encrypt
+{
+ my ($self, $data) = @_;
+
+ croak "Usage: \$cipher->encrypt(\$data)" unless ref($self) && $data;
+ $self->crypt($data, $data, 0);
+}
+
+sub decrypt
+{
+ my ($self, $data) = @_;
+
+ croak "Usage: \$cipher->decrypt(\$data)" unless ref($self) && $data;
+ $self->crypt($data, $data, 1);
+}
+
+# The functions below provide an interface that is call-compatible with
+# the Crypt::Twofish 1.0 module. They do not, however, behave in exactly
+# the same way: they don't pad keys, and cannot decrypt ciphertext which
+# was written by the old module.
+#
+# (This interface is deprecated. Please use the documented interface
+# instead).
+
+sub Encipher
+{
+ my ($key, $keylength, $plaintext) = @_;
+
+ require Crypt::CBC;
+ my $cipher = Crypt::CBC->new($key, "Twofish");
+ return $cipher->encrypt($plaintext);
+}
+
+sub Decipher
+{
+ my ($key, $keylength, $ciphertext, $cipherlength) = @_;
+
+ require Crypt::CBC;
+ my $cipher = Crypt::CBC->new($key, "Twofish");
+ return $cipher->decrypt($ciphertext);
+}
+
+sub LastError { ""; }
+sub CheckTwofish { undef; }
+
+1;
+
+__END__
+
+=head1 NAME
+
+Crypt::Twofish - The Twofish Encryption Algorithm
+
+=head1 SYNOPSIS
+
+use Crypt::Twofish;
+
+$cipher = Crypt::Twofish->new($key);
+
+$ciphertext = $cipher->encrypt($plaintext);
+
+$plaintext = $cipher->decrypt($ciphertext);
+
+=head1 DESCRIPTION
+
+Twofish is a 128-bit symmetric block cipher with a variable length (128,
+192, or 256-bit) key, developed by Counterpane Labs. It is unpatented
+and free for all uses, as described at
+<URL:http://www.counterpane.com/twofish.html>.
+
+This module implements Twofish encryption. It supports the Crypt::CBC
+interface, with the functions described below. It also provides an
+interface that is call-compatible with Crypt::Twofish 1.0, but its use
+in new code is strongly discouraged.
+
+=head2 Functions
+
+=over
+
+=item blocksize
+
+Returns the size (in bytes) of the block (16, in this case).
+
+=item keysize
+
+Returns the size (in bytes) of the key. Although the module understands
+128, 192, and 256-bit keys, it returns 16 for compatibility with
+Crypt::CBC.
+
+=item new($key)
+
+This creates a new Crypt::Twofish object with the specified key (which
+should be 16, 24, or 32 bytes long).
+
+=item encrypt($data)
+
+Encrypts blocksize() bytes of $data and returns the corresponding
+ciphertext.
+
+=item decrypt($data)
+
+Decrypts blocksize() bytes of $data and returns the corresponding
+plaintext.
+
+=back
+
+=head1 SEE ALSO
+
+Crypt::CBC, Crypt::Blowfish, Crypt::TEA
+
+=head1 ACKNOWLEDGEMENTS
+
+=over 4
+
+=item Nishant Kakani
+
+For writing Crypt::Twofish 1.0 (this version is a complete rewrite).
+
+=item Tony Cook
+
+For making the module work under Activeperl, testing on several
+platforms, and suggesting that I probe for features via %Config.
+
+=back
+
+=head1 AUTHOR
+
+Abhijit Menon-Sen <ams@toroid.org>
+
+Copyright 2001 Abhijit Menon-Sen.
+
+This module is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/DBM.pm b/Master/tlpkg/tlperl.straw/lib/DBD/DBM.pm
new file mode 100755
index 00000000000..1dea6b54ad9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/DBM.pm
@@ -0,0 +1,975 @@
+#######################################################################
+#
+# DBD::DBM - a DBI driver for DBM files
+#
+# Copyright (c) 2004 by Jeff Zucker < jzucker AT cpan.org >
+#
+# All rights reserved.
+#
+# You may freely distribute and/or modify this module under the terms
+# of either the GNU General Public License (GPL) or the Artistic License,
+# as specified in the Perl README file.
+#
+# USERS - see the pod at the bottom of this file
+#
+# DBD AUTHORS - see the comments in the code
+#
+#######################################################################
+require 5.005_03;
+use strict;
+
+#################
+package DBD::DBM;
+#################
+use base qw( DBD::File );
+use vars qw($VERSION $ATTRIBUTION $drh $methods_already_installed);
+$VERSION = '0.03';
+$ATTRIBUTION = 'DBD::DBM by Jeff Zucker';
+
+# no need to have driver() unless you need private methods
+#
+sub driver ($;$) {
+ my($class, $attr) = @_;
+ return $drh if $drh;
+
+ # do the real work in DBD::File
+ #
+ $attr->{Attribution} = 'DBD::DBM by Jeff Zucker';
+ my $this = $class->SUPER::driver($attr);
+
+ # install private methods
+ #
+ # this requires that dbm_ (or foo_) be a registered prefix
+ # but you can write private methods before official registration
+ # by hacking the $dbd_prefix_registry in a private copy of DBI.pm
+ #
+ if ( $DBI::VERSION >= 1.37 and !$methods_already_installed++ ) {
+ DBD::DBM::db->install_method('dbm_versions');
+ DBD::DBM::st->install_method('dbm_schema');
+ }
+
+ $this;
+}
+
+sub CLONE {
+ undef $drh;
+}
+
+#####################
+package DBD::DBM::dr;
+#####################
+$DBD::DBM::dr::imp_data_size = 0;
+@DBD::DBM::dr::ISA = qw(DBD::File::dr);
+
+# you can get by without connect() if you don't have to check private
+# attributes, DBD::File will gather the connection string arguements for you
+#
+sub connect ($$;$$$) {
+ my($drh, $dbname, $user, $auth, $attr)= @_;
+
+ # create a 'blank' dbh
+ my $this = DBI::_new_dbh($drh, {
+ Name => $dbname,
+ });
+
+ # parse the connection string for name=value pairs
+ if ($this) {
+
+ # define valid private attributes
+ #
+ # attempts to set non-valid attrs in connect() or
+ # with $dbh->{attr} will throw errors
+ #
+ # the attrs here *must* start with dbm_ or foo_
+ #
+ # see the STORE methods below for how to check these attrs
+ #
+ $this->{dbm_valid_attrs} = {
+ dbm_tables => 1 # per-table information
+ , dbm_type => 1 # the global DBM type e.g. SDBM_File
+ , dbm_mldbm => 1 # the global MLDBM serializer
+ , dbm_cols => 1 # the global column names
+ , dbm_version => 1 # verbose DBD::DBM version
+ , dbm_ext => 1 # file extension
+ , dbm_lockfile => 1 # lockfile extension
+ , dbm_store_metadata => 1 # column names, etc.
+ , dbm_berkeley_flags => 1 # for BerkeleyDB
+ };
+
+ my($var, $val);
+ $this->{f_dir} = $DBD::File::haveFileSpec ? File::Spec->curdir() : '.';
+ while (length($dbname)) {
+ if ($dbname =~ s/^((?:[^\\;]|\\.)*?);//s) {
+ $var = $1;
+ } else {
+ $var = $dbname;
+ $dbname = '';
+ }
+ if ($var =~ /^(.+?)=(.*)/s) {
+ $var = $1;
+ ($val = $2) =~ s/\\(.)/$1/g;
+
+ # in the connect string the attr names
+ # can either have dbm_ (or foo_) prepended or not
+ # this will add the prefix if it's missing
+ #
+ $var = 'dbm_' . $var unless $var =~ /^dbm_/
+ or $var eq 'f_dir';
+ # XXX should pass back to DBI via $attr for connect() to STORE
+ $this->{$var} = $val;
+ }
+ }
+ $this->{f_version} = $DBD::File::VERSION;
+ $this->{dbm_version} = $DBD::DBM::VERSION;
+ for (qw( nano_version statement_version)) {
+ $this->{'sql_'.$_} = $DBI::SQL::Nano::versions->{$_}||'';
+ }
+ $this->{sql_handler} = ($this->{sql_statement_version})
+ ? 'SQL::Statement'
+ : 'DBI::SQL::Nano';
+ }
+ $this->STORE('Active',1);
+ return $this;
+}
+
+# you could put some :dr private methods here
+
+# you may need to over-ride some DBD::File::dr methods here
+# but you can probably get away with just letting it do the work
+# in most cases
+
+#####################
+package DBD::DBM::db;
+#####################
+$DBD::DBM::db::imp_data_size = 0;
+@DBD::DBM::db::ISA = qw(DBD::File::db);
+
+# the ::db::STORE method is what gets called when you set
+# a lower-cased database handle attribute such as $dbh->{somekey}=$someval;
+#
+# STORE should check to make sure that "somekey" is a valid attribute name
+# but only if it is really one of our attributes (starts with dbm_ or foo_)
+# You can also check for valid values for the attributes if needed
+# and/or perform other operations
+#
+sub STORE ($$$) {
+ my ($dbh, $attrib, $value) = @_;
+
+ # use DBD::File's STORE unless its one of our own attributes
+ #
+ return $dbh->SUPER::STORE($attrib,$value) unless $attrib =~ /^dbm_/;
+
+ # throw an error if it has our prefix but isn't a valid attr name
+ #
+ if ( $attrib ne 'dbm_valid_attrs' # gotta start somewhere :-)
+ and !$dbh->{dbm_valid_attrs}->{$attrib} ) {
+ return $dbh->set_err( $DBI::stderr,"Invalid attribute '$attrib'!");
+ }
+ else {
+
+ # check here if you need to validate values
+ # or conceivably do other things as well
+ #
+ $dbh->{$attrib} = $value;
+ return 1;
+ }
+}
+
+# and FETCH is done similar to STORE
+#
+sub FETCH ($$) {
+ my ($dbh, $attrib) = @_;
+
+ return $dbh->SUPER::FETCH($attrib) unless $attrib =~ /^dbm_/;
+
+ # throw an error if it has our prefix but isn't a valid attr name
+ #
+ if ( $attrib ne 'dbm_valid_attrs' # gotta start somewhere :-)
+ and !$dbh->{dbm_valid_attrs}->{$attrib} ) {
+ return $dbh->set_err( $DBI::stderr,"Invalid attribute '$attrib'");
+ }
+ else {
+
+ # check here if you need to validate values
+ # or conceivably do other things as well
+ #
+ return $dbh->{$attrib};
+ }
+}
+
+
+# this is an example of a private method
+# these used to be done with $dbh->func(...)
+# see above in the driver() sub for how to install the method
+#
+sub dbm_versions {
+ my $dbh = shift;
+ my $table = shift || '';
+ my $dtype = $dbh->{dbm_tables}->{$table}->{type}
+ || $dbh->{dbm_type}
+ || 'SDBM_File';
+ my $mldbm = $dbh->{dbm_tables}->{$table}->{mldbm}
+ || $dbh->{dbm_mldbm}
+ || '';
+ $dtype .= ' + MLDBM + ' . $mldbm if $mldbm;
+
+ my %version = ( DBI => $DBI::VERSION );
+ $version{"DBI::PurePerl"} = $DBI::PurePerl::VERSION if $DBI::PurePerl;
+ $version{OS} = "$^O ($Config::Config{osvers})";
+ $version{Perl} = "$] ($Config::Config{archname})";
+ my $str = sprintf "%-16s %s\n%-16s %s\n%-16s %s\n",
+ 'DBD::DBM' , $dbh->{Driver}->{Version} . " using $dtype"
+ , ' DBD::File' , $dbh->{f_version}
+ , ' DBI::SQL::Nano' , $dbh->{sql_nano_version}
+ ;
+ $str .= sprintf "%-16s %s\n",
+ , ' SQL::Statement' , $dbh->{sql_statement_version}
+ if $dbh->{sql_handler} eq 'SQL::Statement';
+ for (sort keys %version) {
+ $str .= sprintf "%-16s %s\n", $_, $version{$_};
+ }
+ return "$str\n";
+}
+
+# you may need to over-ride some DBD::File::db methods here
+# but you can probably get away with just letting it do the work
+# in most cases
+
+#####################
+package DBD::DBM::st;
+#####################
+$DBD::DBM::st::imp_data_size = 0;
+@DBD::DBM::st::ISA = qw(DBD::File::st);
+
+sub dbm_schema {
+ my($sth,$tname)=@_;
+ return $sth->set_err($DBI::stderr,'No table name supplied!') unless $tname;
+ return $sth->set_err($DBI::stderr,"Unknown table '$tname'!")
+ unless $sth->{Database}->{dbm_tables}
+ and $sth->{Database}->{dbm_tables}->{$tname};
+ return $sth->{Database}->{dbm_tables}->{$tname}->{schema};
+}
+# you could put some :st private methods here
+
+# you may need to over-ride some DBD::File::st methods here
+# but you can probably get away with just letting it do the work
+# in most cases
+
+############################
+package DBD::DBM::Statement;
+############################
+use base qw( DBD::File::Statement );
+use IO::File; # for locking only
+use Fcntl;
+
+my $HAS_FLOCK = eval { flock STDOUT, 0; 1 };
+
+# you must define open_table;
+# it is done at the start of all executes;
+# it doesn't necessarily have to "open" anything;
+# you must define the $tbl and at least the col_names and col_nums;
+# anything else you put in depends on what you need in your
+# ::Table methods below; you must bless the $tbl into the
+# appropriate class as shown
+#
+# see also the comments inside open_table() showing the difference
+# between global, per-table, and default settings
+#
+sub open_table ($$$$$) {
+ my($self, $data, $table, $createMode, $lockMode) = @_;
+ my $dbh = $data->{Database};
+
+ my $tname = $table || $self->{tables}->[0]->{name};
+ my $file;
+ ($table,$file) = $self->get_file_name($data,$tname);
+
+ # note the use of three levels of attribute settings below
+ # first it looks for a per-table setting
+ # if none is found, it looks for a global setting
+ # if none is found, it sets a default
+ #
+ # your DBD may not need this, gloabls and defaults may be enough
+ #
+ my $dbm_type = $dbh->{dbm_tables}->{$tname}->{type}
+ || $dbh->{dbm_type}
+ || 'SDBM_File';
+ $dbh->{dbm_tables}->{$tname}->{type} = $dbm_type;
+
+ my $serializer = $dbh->{dbm_tables}->{$tname}->{mldbm}
+ || $dbh->{dbm_mldbm}
+ || '';
+ $dbh->{dbm_tables}->{$tname}->{mldbm} = $serializer if $serializer;
+
+ my $ext = '' if $dbm_type eq 'GDBM_File'
+ or $dbm_type eq 'DB_File'
+ or $dbm_type eq 'BerkeleyDB';
+ # XXX NDBM_File on FreeBSD (and elsewhere?) may actually be Berkeley
+ # behind the scenes and so create a single .db file.
+ $ext = '.pag' if $dbm_type eq 'NDBM_File'
+ or $dbm_type eq 'SDBM_File'
+ or $dbm_type eq 'ODBM_File';
+ $ext = $dbh->{dbm_ext} if defined $dbh->{dbm_ext};
+ $ext = $dbh->{dbm_tables}->{$tname}->{ext}
+ if defined $dbh->{dbm_tables}->{$tname}->{ext};
+ $ext = '' unless defined $ext;
+
+ my $open_mode = O_RDONLY;
+ $open_mode = O_RDWR if $lockMode;
+ $open_mode = O_RDWR|O_CREAT|O_TRUNC if $createMode;
+
+ my($tie_type);
+
+ if ( $serializer ) {
+ require 'MLDBM.pm';
+ $MLDBM::UseDB = $dbm_type;
+ $MLDBM::UseDB = 'BerkeleyDB::Hash' if $dbm_type eq 'BerkeleyDB';
+ $MLDBM::Serializer = $serializer;
+ $tie_type = 'MLDBM';
+ }
+ else {
+ require "$dbm_type.pm";
+ $tie_type = $dbm_type;
+ }
+
+ # Second-guessing the file extension isn't great here (or in general)
+ # could replace this by trying to open the file in non-create mode
+ # first and dieing if that succeeds.
+ # Currently this test doesn't work where NDBM is actually Berkeley (.db)
+ die "Cannot CREATE '$file$ext' because it already exists"
+ if $createMode and (-e "$file$ext");
+
+ # LOCKING
+ #
+ my($nolock,$lockext,$lock_table);
+ $lockext = $dbh->{dbm_tables}->{$tname}->{lockfile};
+ $lockext = $dbh->{dbm_lockfile} if !defined $lockext;
+ if ( (defined $lockext and $lockext == 0) or !$HAS_FLOCK
+ ) {
+ undef $lockext;
+ $nolock = 1;
+ }
+ else {
+ $lockext ||= '.lck';
+ }
+ # open and flock the lockfile, creating it if necessary
+ #
+ if (!$nolock) {
+ $lock_table = $self->SUPER::open_table(
+ $data, "$table$lockext", $createMode, $lockMode
+ );
+ }
+
+ # TIEING
+ #
+ # allow users to pass in a pre-created tied object
+ #
+ my @tie_args;
+ if ($dbm_type eq 'BerkeleyDB') {
+ my $DB_CREATE = 1; # but import constants if supplied
+ my $DB_RDONLY = 16; #
+ my %flags;
+ if (my $f = $dbh->{dbm_berkeley_flags}) {
+ $DB_CREATE = $f->{DB_CREATE} if $f->{DB_CREATE};
+ $DB_RDONLY = $f->{DB_RDONLY} if $f->{DB_RDONLY};
+ delete $f->{DB_CREATE};
+ delete $f->{DB_RDONLY};
+ %flags = %$f;
+ }
+ $flags{'-Flags'} = $DB_RDONLY;
+ $flags{'-Flags'} = $DB_CREATE if $lockMode or $createMode;
+ my $t = 'BerkeleyDB::Hash';
+ $t = 'MLDBM' if $serializer;
+ @tie_args = ($t, -Filename=>$file, %flags);
+ }
+ else {
+ @tie_args = ($tie_type, $file, $open_mode, 0666);
+ }
+ my %h;
+ if ( $self->{command} ne 'DROP') {
+ my $tie_class = shift @tie_args;
+ eval { tie %h, $tie_class, @tie_args };
+ die "Cannot tie(%h $tie_class @tie_args): $@" if $@;
+ }
+
+
+ # COLUMN NAMES
+ #
+ my $store = $dbh->{dbm_tables}->{$tname}->{store_metadata};
+ $store = $dbh->{dbm_store_metadata} unless defined $store;
+ $store = 1 unless defined $store;
+ $dbh->{dbm_tables}->{$tname}->{store_metadata} = $store;
+
+ my($meta_data,$schema,$col_names);
+ $meta_data = $col_names = $h{"_metadata \0"} if $store;
+ if ($meta_data and $meta_data =~ m~<dbd_metadata>(.+)</dbd_metadata>~is) {
+ $schema = $col_names = $1;
+ $schema =~ s~.*<schema>(.+)</schema>.*~$1~is;
+ $col_names =~ s~.*<col_names>(.+)</col_names>.*~$1~is;
+ }
+ $col_names ||= $dbh->{dbm_tables}->{$tname}->{c_cols}
+ || $dbh->{dbm_tables}->{$tname}->{cols}
+ || $dbh->{dbm_cols}
+ || ['k','v'];
+ $col_names = [split /,/,$col_names] if (ref $col_names ne 'ARRAY');
+ $dbh->{dbm_tables}->{$tname}->{cols} = $col_names;
+ $dbh->{dbm_tables}->{$tname}->{schema} = $schema;
+
+ my $i;
+ my %col_nums = map { $_ => $i++ } @$col_names;
+
+ my $tbl = {
+ table_name => $tname,
+ file => $file,
+ ext => $ext,
+ hash => \%h,
+ dbm_type => $dbm_type,
+ store_metadata => $store,
+ mldbm => $serializer,
+ lock_fh => $lock_table->{fh},
+ lock_ext => $lockext,
+ nolock => $nolock,
+ col_nums => \%col_nums,
+ col_names => $col_names
+ };
+
+ my $class = ref($self);
+ $class =~ s/::Statement/::Table/;
+ bless($tbl, $class);
+ $tbl;
+}
+
+########################
+package DBD::DBM::Table;
+########################
+use base qw( DBD::File::Table );
+
+# you must define drop
+# it is called from execute of a SQL DROP statement
+#
+sub drop ($$) {
+ my($self,$data) = @_;
+ untie %{$self->{hash}} if $self->{hash};
+ my $ext = $self->{ext};
+ unlink $self->{file}.$ext if -f $self->{file}.$ext;
+ unlink $self->{file}.'.dir' if -f $self->{file}.'.dir'
+ and $ext eq '.pag';
+ if (!$self->{nolock}) {
+ $self->{lock_fh}->close if $self->{lock_fh};
+ unlink $self->{file}.$self->{lock_ext}
+ if -f $self->{file}.$self->{lock_ext};
+ }
+ return 1;
+}
+
+# you must define fetch_row, it is called on all fetches;
+# it MUST return undef when no rows are left to fetch;
+# checking for $ary[0] is specific to hashes so you'll
+# probably need some other kind of check for nothing-left.
+# as Janis might say: "undef's just another word for
+# nothing left to fetch" :-)
+#
+sub fetch_row ($$$) {
+ my($self, $data, $row) = @_;
+ # fetch with %each
+ #
+ my @ary = each %{$self->{hash}};
+ @ary = each %{$self->{hash}} if $self->{store_metadata}
+ and $ary[0]
+ and $ary[0] eq "_metadata \0";
+
+ my($key,$val) = @ary;
+ return undef unless $key;
+ my @row = (ref($val) eq 'ARRAY') ? ($key,@$val) : ($key,$val);
+ return (@row) if wantarray;
+ return \@row;
+
+ # fetch without %each
+ #
+ # $self->{keys} = [sort keys %{$self->{hash}}] unless $self->{keys};
+ # my $key = shift @{$self->{keys}};
+ # $key = shift @{$self->{keys}} if $self->{store_metadata}
+ # and $key
+ # and $key eq "_metadata \0";
+ # return undef unless defined $key;
+ # my @ary;
+ # $row = $self->{hash}->{$key};
+ # if (ref $row eq 'ARRAY') {
+ # @ary = ( $key, @{$row} );
+ # }
+ # else {
+ # @ary = ($key,$row);
+ # }
+ # return (@ary) if wantarray;
+ # return \@ary;
+}
+
+# you must define push_row
+# it is called on inserts and updates
+#
+sub push_row ($$$) {
+ my($self, $data, $row_aryref) = @_;
+ my $key = shift @$row_aryref;
+ if ( $self->{mldbm} ) {
+ $self->{hash}->{$key}= $row_aryref;
+ }
+ else {
+ $self->{hash}->{$key}=$row_aryref->[0];
+ }
+ 1;
+}
+
+# this is where you grab the column names from a CREATE statement
+# if you don't need to do that, it must be defined but can be empty
+#
+sub push_names ($$$) {
+ my($self, $data, $row_aryref) = @_;
+ $data->{Database}->{dbm_tables}->{$self->{table_name}}->{c_cols}
+ = $row_aryref;
+ return unless $self->{store_metadata};
+ my $stmt = $data->{f_stmt};
+ my $col_names = join ',', @{$row_aryref};
+ my $schema = $data->{Database}->{Statement};
+ $schema =~ s/^[^\(]+\((.+)\)$/$1/s;
+ $schema = $stmt->schema_str if $stmt->can('schema_str');
+ $self->{hash}->{"_metadata \0"} = "<dbd_metadata>"
+ . "<schema>$schema</schema>"
+ . "<col_names>$col_names</col_names>"
+ . "</dbd_metadata>"
+ ;
+}
+
+# fetch_one_row, delete_one_row, update_one_row
+# are optimized for hash-style lookup without looping;
+# if you don't need them, omit them, they're optional
+# but, in that case you may need to define
+# truncate() and seek(), see below
+#
+sub fetch_one_row ($$;$) {
+ my($self,$key_only,$key) = @_;
+ return $self->{col_names}->[0] if $key_only;
+ return undef unless exists $self->{hash}->{$key};
+ my $val = $self->{hash}->{$key};
+ $val = (ref($val)eq'ARRAY') ? $val : [$val];
+ my $row = [$key, @$val];
+ return @$row if wantarray;
+ return $row;
+}
+sub delete_one_row ($$$) {
+ my($self,$data,$aryref) = @_;
+ delete $self->{hash}->{$aryref->[0]};
+}
+sub update_one_row ($$$) {
+ my($self,$data,$aryref) = @_;
+ my $key = shift @$aryref;
+ return undef unless defined $key;
+ my $row = (ref($aryref)eq'ARRAY') ? $aryref : [$aryref];
+ if ( $self->{mldbm} ) {
+ $self->{hash}->{$key}= $row;
+ }
+ else {
+ $self->{hash}->{$key}=$row->[0];
+ }
+}
+
+# you may not need to explicitly DESTROY the ::Table
+# put cleanup code to run when the execute is done
+#
+sub DESTROY ($) {
+ my $self=shift;
+ untie %{$self->{hash}} if $self->{hash};
+ # release the flock on the lock file
+ $self->{lock_fh}->close if !$self->{nolock} and $self->{lock_fh};
+}
+
+# truncate() and seek() must be defined to satisfy DBI::SQL::Nano
+# *IF* you define the *_one_row methods above, truncate() and
+# seek() can be empty or you can use them without actually
+# truncating or seeking anything but if you don't define the
+# *_one_row methods, you may need to define these
+
+# if you need to do something after a series of
+# deletes or updates, you can put it in truncate()
+# which is called at the end of executing
+#
+sub truncate ($$) {
+ my($self,$data) = @_;
+ 1;
+}
+
+# seek() is only needed if you use IO::File
+# though it could be used for other non-file operations
+# that you need to do before "writes" or truncate()
+#
+sub seek ($$$$) {
+ my($self, $data, $pos, $whence) = @_;
+}
+
+# Th, th, th, that's all folks! See DBD::File and DBD::CSV for other
+# examples of creating pure perl DBDs. I hope this helped.
+# Now it's time to go forth and create your own DBD!
+# Remember to check in with dbi-dev@perl.org before you get too far.
+# We may be able to make suggestions or point you to other related
+# projects.
+
+1;
+__END__
+
+=pod
+
+=head1 NAME
+
+DBD::DBM - a DBI driver for DBM & MLDBM files
+
+=head1 SYNOPSIS
+
+ use DBI;
+ $dbh = DBI->connect('dbi:DBM:'); # defaults to SDBM_File
+ $dbh = DBI->connect('DBI:DBM(RaiseError=1):'); # defaults to SDBM_File
+ $dbh = DBI->connect('dbi:DBM:type=GDBM_File'); # defaults to GDBM_File
+ $dbh = DBI->connect('dbi:DBM:mldbm=Storable'); # MLDBM with SDBM_File
+ # and Storable
+
+or
+
+ $dbh = DBI->connect('dbi:DBM:', undef, undef);
+ $dbh = DBI->connect('dbi:DBM:', undef, undef, { dbm_type => 'ODBM_File' });
+
+and other variations on connect() as shown in the DBI docs and with
+the dbm_ attributes shown below
+
+... and then use standard DBI prepare, execute, fetch, placeholders, etc.,
+see L<QUICK START> for an example
+
+=head1 DESCRIPTION
+
+DBD::DBM is a database management sytem that can work right out of the box. If you have a standard installation of Perl and a standard installation of DBI, you can begin creating, accessing, and modifying database tables without any further installation. You can also add some other modules to it for more robust capabilities if you wish.
+
+The module uses a DBM file storage layer. DBM file storage is common on many platforms and files can be created with it in many languges. That means that, in addition to creating files with DBI/SQL, you can also use DBI/SQL to access and modify files created by other DBM modules and programs. You can also use those programs to access files created with DBD::DBM.
+
+DBM files are stored in binary format optimized for quick retrieval when using a key field. That optimization can be used advantageously to make DBD::DBM SQL operations that use key fields very fast. There are several different "flavors" of DBM - different storage formats supported by different sorts of perl modules such as SDBM_File and MLDBM. This module supports all of the flavors that perl supports and, when used with MLDBM, supports tables with any number of columns and insertion of Perl objects into tables.
+
+DBD::DBM has been tested with the following DBM types: SDBM_File, NDBM_File, ODBM_File, GDBM_File, DB_File, BerekeleyDB. Each type was tested both with and without MLDBM.
+
+=head1 QUICK START
+
+DBD::DBM operates like all other DBD drivers - it's basic syntax and operation is specified by DBI. If you're not familiar with DBI, you should start by reading L<DBI> and the documents it points to and then come back and read this file. If you are familiar with DBI, you already know most of what you need to know to operate this module. Just jump in and create a test script something like the one shown below.
+
+You should be aware that there are several options for the SQL engine underlying DBD::DBM, see L<Supported SQL syntax>. There are also many options for DBM support, see especially the section on L<Adding multi-column support with MLDBM>.
+
+But here's a sample to get you started.
+
+ use DBI;
+ my $dbh = DBI->connect('dbi:DBM:');
+ $dbh->{RaiseError} = 1;
+ for my $sql( split /;\n+/,"
+ CREATE TABLE user ( user_name TEXT, phone TEXT );
+ INSERT INTO user VALUES ('Fred Bloggs','233-7777');
+ INSERT INTO user VALUES ('Sanjay Patel','777-3333');
+ INSERT INTO user VALUES ('Junk','xxx-xxxx');
+ DELETE FROM user WHERE user_name = 'Junk';
+ UPDATE user SET phone = '999-4444' WHERE user_name = 'Sanjay Patel';
+ SELECT * FROM user
+ "){
+ my $sth = $dbh->prepare($sql);
+ $sth->execute;
+ $sth->dump_results if $sth->{NUM_OF_FIELDS};
+ }
+ $dbh->disconnect;
+
+=head1 USAGE
+
+=head2 Specifiying Files and Directories
+
+DBD::DBM will automatically supply an appropriate file extension for the type of DBM you are using. For example, if you use SDBM_File, a table called "fruit" will be stored in two files called "fruit.pag" and "fruit.dir". You should I<never> specify the file extensions in your SQL statements.
+
+However, I am not aware (and therefore DBD::DBM is not aware) of all possible extensions for various DBM types. If your DBM type uses an extension other than .pag and .dir, you should set the I<dbm_ext> attribute to the extension. B<And> you should write me with the name of the implementation and extension so I can add it to DBD::DBM! Thanks in advance for that :-).
+
+ $dbh = DBI->connect('dbi:DBM:ext=.db'); # .db extension is used
+ $dbh = DBI->connect('dbi:DBM:ext='); # no extension is used
+
+or
+
+ $dbh->{dbm_ext}='.db'; # global setting
+ $dbh->{dbm_tables}->{'qux'}->{ext}='.db'; # setting for table 'qux'
+
+By default files are assumed to be in the current working directory. To have the module look in a different directory, specify the I<f_dir> attribute in either the connect string or by setting the database handle attribute.
+
+For example, this will look for the file /foo/bar/fruit (or /foo/bar/fruit.pag for DBM types that use that extension)
+
+ my $dbh = DBI->connect('dbi:DBM:f_dir=/foo/bar');
+ my $ary = $dbh->selectall_arrayref(q{ SELECT * FROM fruit });
+
+And this will too:
+
+ my $dbh = DBI->connect('dbi:DBM:');
+ $dbh->{f_dir} = '/foo/bar';
+ my $ary = $dbh->selectall_arrayref(q{ SELECT x FROM fruit });
+
+You can also use delimited identifiers to specify paths directly in SQL statements. This looks in the same place as the two examples above but without setting I<f_dir>:
+
+ my $dbh = DBI->connect('dbi:DBM:');
+ my $ary = $dbh->selectall_arrayref(q{
+ SELECT x FROM "/foo/bar/fruit"
+ });
+
+If you have SQL::Statement installed, you can use table aliases:
+
+ my $dbh = DBI->connect('dbi:DBM:');
+ my $ary = $dbh->selectall_arrayref(q{
+ SELECT f.x FROM "/foo/bar/fruit" AS f
+ });
+
+See the L<GOTCHAS AND WARNINGS> for using DROP on tables.
+
+=head2 Table locking and flock()
+
+Table locking is accomplished using a lockfile which has the same name as the table's file but with the file extension '.lck' (or a lockfile extension that you suppy, see belwo). This file is created along with the table during a CREATE and removed during a DROP. Every time the table itself is opened, the lockfile is flocked(). For SELECT, this is an shared lock. For all other operations, it is an exclusive lock.
+
+Since the locking depends on flock(), it only works on operating systems that support flock(). In cases where flock() is not implemented, DBD::DBM will not complain, it will simply behave as if the flock() had occurred although no actual locking will happen. Read the documentation for flock() if you need to understand this.
+
+Even on those systems that do support flock(), the locking is only advisory - as is allways the case with flock(). This means that if some other program tries to access the table while DBD::DBM has the table locked, that other program will *succeed* at opening the table. DBD::DBM's locking only applies to DBD::DBM. An exception to this would be the situation in which you use a lockfile with the other program that has the same name as the lockfile used in DBD::DBM and that program also uses flock() on that lockfile. In that case, DBD::DBM and your other program will respect each other's locks.
+
+If you wish to use a lockfile extension other than '.lck', simply specify the dbm_lockfile attribute:
+
+ $dbh = DBI->connect('dbi:DBM:lockfile=.foo');
+ $dbh->{dbm_lockfile} = '.foo';
+ $dbh->{dbm_tables}->{qux}->{lockfile} = '.foo';
+
+If you wish to disable locking, set the dbm_lockfile equal to 0.
+
+ $dbh = DBI->connect('dbi:DBM:lockfile=0');
+ $dbh->{dbm_lockfile} = 0;
+ $dbh->{dbm_tables}->{qux}->{lockfile} = 0;
+
+=head2 Specifying the DBM type
+
+Each "flavor" of DBM stores its files in a different format and has different capabilities and different limitations. See L<AnyDBM_File> for a comparison of DBM types.
+
+By default, DBD::DBM uses the SDBM_File type of storage since SDBM_File comes with Perl itself. But if you have other types of DBM storage available, you can use any of them with DBD::DBM also.
+
+You can specify the DBM type using the "dbm_type" attribute which can be set in the connection string or with the $dbh->{dbm_type} attribute for global settings or with the $dbh->{dbm_tables}->{$table_name}->{type} attribute for per-table settings in cases where a single script is accessing more than one kind of DBM file.
+
+In the connection string, just set type=TYPENAME where TYPENAME is any DBM type such as GDBM_File, DB_File, etc. Do I<not> use MLDBM as your dbm_type, that is set differently, see below.
+
+ my $dbh=DBI->connect('dbi:DBM:'); # uses the default SDBM_File
+ my $dbh=DBI->connect('dbi:DBM:type=GDBM_File'); # uses the GDBM_File
+
+You can also use $dbh->{dbm_type} to set global DBM type:
+
+ $dbh->{dbm_type} = 'GDBM_File'; # set the global DBM type
+ print $dbh->{dbm_type}; # display the global DBM type
+
+If you are going to have several tables in your script that come from different DBM types, you can use the $dbh->{dbm_tables} hash to store different settings for the various tables. You can even use this to perform joins on files that have completely different storage mechanisms.
+
+ my $dbh->('dbi:DBM:type=GDBM_File');
+ #
+ # sets global default of GDBM_File
+
+ my $dbh->{dbm_tables}->{foo}->{type} = 'DB_File';
+ #
+ # over-rides the global setting, but only for the table called "foo"
+
+ print $dbh->{dbm_tables}->{foo}->{type};
+ #
+ # prints the dbm_type for the table "foo"
+
+=head2 Adding multi-column support with MLDBM
+
+Most of the DBM types only support two columns. However a CPAN module called MLDBM overcomes this limitation by allowing more than two columns. It does this by serializing the data - basically it puts a reference to an array into the second column. It can also put almost any kind of Perl object or even Perl coderefs into columns.
+
+If you want more than two columns, you must install MLDBM. It's available for many platforms and is easy to install.
+
+MLDBM can use three different modules to serialize the column - Data::Dumper, Storable, and FreezeThaw. Data::Dumper is the default, Storable is the fastest. MLDBM can also make use of user-defined serialization methods. All of this is available to you through DBD::DBM with just one attribute setting.
+
+To use MLDBM with DBD::DBM, you need to set the dbm_mldbm attribute to the name of the serialization module.
+
+Some examples:
+
+ $dbh=DBI->connect('dbi:DBM:mldbm=Storable'); # use MLDBM with Storable
+ $dbh=DBI->connect(
+ 'dbi:DBM:mldbm=MySerializer' # use MLDBM with a user defined module
+ );
+ $dbh->{dbm_mldbm} = 'MySerializer'; # same as above
+ print $dbh->{dbm_mldbm} # show the MLDBM serializer
+ $dbh->{dbm_tables}->{foo}->{mldbm}='Data::Dumper'; # set Data::Dumper for table "foo"
+ print $dbh->{dbm_tables}->{foo}->{mldbm}; # show serializer for table "foo"
+
+MLDBM works on top of other DBM modules so you can also set a DBM type along with setting dbm_mldbm. The examples above would default to using SDBM_File with MLDBM. If you wanted GDBM_File instead, here's how:
+
+ $dbh = DBI->connect('dbi:DBM:type=GDBM_File;mldbm=Storable');
+ #
+ # uses GDBM_File with MLDBM and Storable
+
+SDBM_File, the default file type is quite limited, so if you are going to use MLDBM, you should probably use a different type, see L<AnyDBM_File>.
+
+See below for some L<GOTCHAS AND WARNINGS> about MLDBM.
+
+=head2 Support for Berkeley DB
+
+The Berkeley DB storage type is supported through two different Perl modules - DB_File (which supports only features in old versions of Berkeley DB) and BerkeleyDB (which supports all versions). DBD::DBM supports specifying either "DB_File" or "BerkeleyDB" as a I<dbm_type>, with or without MLDBM support.
+
+The "BerkeleyDB" dbm_type is experimental and its interface is likely to chagne. It currently defaults to BerkeleyDB::Hash and does not currently support ::Btree or ::Recno.
+
+With BerkeleyDB, you can specify initialization flags by setting them in your script like this:
+
+ my $dbh = DBI->connect('dbi:DBM:type=BerkeleyDB;mldbm=Storable');
+ use BerkeleyDB;
+ my $env = new BerkeleyDB::Env -Home => $dir; # and/or other Env flags
+ $dbh->{dbm_berkeley_flags} = {
+ 'DB_CREATE' => DB_CREATE # pass in constants
+ , 'DB_RDONLY' => DB_RDONLY # pass in constants
+ , '-Cachesize' => 1000 # set a ::Hash flag
+ , '-Env' => $env # pass in an environment
+ };
+
+Do I<not> set the -Flags or -Filename flags, those are determined by the SQL (e.g. -Flags => DB_RDONLY is set automatically when you issue a SELECT statement).
+
+Time has not permitted me to provide support in this release of DBD::DBM for further Berkeley DB features such as transactions, concurrency, locking, etc. I will be working on these in the future and would value suggestions, patches, etc.
+
+See L<DB_File> and L<BerkeleyDB> for further details.
+
+=head2 Supported SQL syntax
+
+DBD::DBM uses a subset of SQL. The robustness of that subset depends on what other modules you have installed. Both options support basic SQL operations including CREATE TABLE, DROP TABLE, INSERT, DELETE, UPDATE, and SELECT.
+
+B<Option #1:> By default, this module inherits its SQL support from DBI::SQL::Nano that comes with DBI. Nano is, as its name implies, a *very* small SQL engine. Although limited in scope, it is faster than option #2 for some operations. See L<DBI::SQL::Nano> for a description of the SQL it supports and comparisons of it with option #2.
+
+B<Option #2:> If you install the pure Perl CPAN module SQL::Statement, DBD::DBM will use it instead of Nano. This adds support for table aliases, for functions, for joins, and much more. If you're going to use DBD::DBM for anything other than very simple tables and queries, you should install SQL::Statement. You don't have to change DBD::DBM or your scripts in any way, simply installing SQL::Statement will give you the more robust SQL capabilities without breaking scripts written for DBI::SQL::Nano. See L<SQL::Statement> for a description of the SQL it supports.
+
+To find out which SQL module is working in a given script, you can use the dbm_versions() method or, if you don't need the full output and version numbers, just do this:
+
+ print $dbh->{sql_handler};
+
+That will print out either "SQL::Statement" or "DBI::SQL::Nano".
+
+=head2 Optimizing use of key fields
+
+Most "flavors" of DBM have only two physical columns (but can contain multiple logical columns as explained below). They work similarly to a Perl hash with the first column serving as the key. Like a Perl hash, DBM files permit you to do quick lookups by specifying the key and thus avoid looping through all records. Also like a Perl hash, the keys must be unique. It is impossible to create two records with the same key. To put this all more simply and in SQL terms, the key column functions as the PRIMARY KEY.
+
+In DBD::DBM, you can take advantage of the speed of keyed lookups by using a WHERE clause with a single equal comparison on the key field. For example, the following SQL statements are optimized for keyed lookup:
+
+ CREATE TABLE user ( user_name TEXT, phone TEXT);
+ INSERT INTO user VALUES ('Fred Bloggs','233-7777');
+ # ... many more inserts
+ SELECT phone FROM user WHERE user_name='Fred Bloggs';
+
+The "user_name" column is the key column since it is the first column. The SELECT statement uses the key column in a single equal comparision - "user_name='Fred Bloggs' - so the search will find it very quickly without having to loop through however many names were inserted into the table.
+
+In contrast, thes searches on the same table are not optimized:
+
+ 1. SELECT phone FROM user WHERE user_name < 'Fred';
+ 2. SELECT user_name FROM user WHERE phone = '233-7777';
+
+In #1, the operation uses a less-than (<) comparison rather than an equals comparison, so it will not be optimized for key searching. In #2, the key field "user_name" is not specified in the WHERE clause, and therefore the search will need to loop through all rows to find the desired result.
+
+=head2 Specifying Column Names
+
+DBM files don't have a standard way to store column names. DBD::DBM gets around this issue with a DBD::DBM specific way of storing the column names. B<If you are working only with DBD::DBM and not using files created by or accessed with other DBM programs, you can ignore this section.>
+
+DBD::DBM stores column names as a row in the file with the key I<_metadata \0>. So this code
+
+ my $dbh = DBI->connect('dbi:DBM:');
+ $dbh->do("CREATE TABLE baz (foo CHAR(10), bar INTEGER)");
+ $dbh->do("INSERT INTO baz (foo,bar) VALUES ('zippy',1)");
+
+Will create a file that has a structure something like this:
+
+ _metadata \0 | foo,bar
+ zippy | 1
+
+The next time you access this table with DBD::DBM, it will treat the _metadata row as a header rather than as data and will pull the column names from there. However, if you access the file with something other than DBD::DBM, the row will be treated as a regular data row.
+
+If you do not want the column names stored as a data row in the table you can set the I<dbm_store_metadata> attribute to 0.
+
+ my $dbh = DBI->connect('dbi:DBM:store_metadata=0');
+
+or
+
+ $dbh->{dbm_store_metadata} = 0;
+
+or, for per-table setting
+
+ $dbh->{dbm_tables}->{qux}->{store_metadata} = 0;
+
+By default, DBD::DBM assumes that you have two columns named "k" and "v" (short for "key" and "value"). So if you have I<dbm_store_metadata> set to 1 and you want to use alternate column names, you need to specify the column names like this:
+
+ my $dbh = DBI->connect('dbi:DBM:store_metadata=0;cols=foo,bar');
+
+or
+
+ $dbh->{dbm_store_metadata} = 0;
+ $dbh->{dbm_cols} = 'foo,bar';
+
+To set the column names on per-table basis, do this:
+
+ $dbh->{dbm_tables}->{qux}->{store_metadata} = 0;
+ $dbh->{dbm_tables}->{qux}->{cols} = 'foo,bar';
+ #
+ # sets the column names only for table "qux"
+
+If you have a file that was created by another DBM program or created with I<dbm_store_metadata> set to zero and you want to convert it to using DBD::DBM's column name storage, just use one of the methods above to name the columns but *without* specifying I<dbm_store_metadata> as zero. You only have to do that once - thereafter you can get by without setting either I<dbm_store_metadata> or setting I<dbm_cols> because the names will be stored in the file.
+
+=head2 Statement handle ($sth) attributes and methods
+
+Most statement handle attributes such as NAME, NUM_OF_FIELDS, etc. are available only after an execute. The same is true of $sth->rows which is available after the execute but does I<not> require a fetch.
+
+=head2 The $dbh->dbm_versions() method
+
+The private method dbm_versions() presents a summary of what other modules are being used at any given time. DBD::DBM can work with or without many other modules - it can use either SQL::Statement or DBI::SQL::Nano as its SQL engine, it can be run with DBI or DBI::PurePerl, it can use many kinds of DBM modules, and many kinds of serializers when run with MLDBM. The dbm_versions() method reports on all of that and more.
+
+ print $dbh->dbm_versions; # displays global settings
+ print $dbh->dbm_versions($table_name); # displays per table settings
+
+An important thing to note about this method is that when called with no arguments, it displays the *global* settings. If you over-ride these by setting per-table attributes, these will I<not> be shown unless you specifiy a table name as an argument to the method call.
+
+=head2 Storing Objects
+
+If you are using MLDBM, you can use DBD::DBM to take advantage of its serializing abilities to serialize any Perl object that MLDBM can handle. To store objects in columns, you should (but don't absolutely need to) declare it as a column of type BLOB (the type is *currently* ignored by the SQL engine, but heh, it's good form).
+
+You *must* use placeholders to insert or refer to the data.
+
+=head1 GOTCHAS AND WARNINGS
+
+Using the SQL DROP command will remove any file that has the name specified in the command with either '.pag' or '.dir' or your {dbm_ext} appended to it. So
+this be dangerous if you aren't sure what file it refers to:
+
+ $dbh->do(qq{DROP TABLE "/path/to/any/file"});
+
+Each DBM type has limitations. SDBM_File, for example, can only store values of less than 1,000 characters. *You* as the script author must ensure that you don't exceed those bounds. If you try to insert a value that is bigger than the DBM can store, the results will be unpredictable. See the documentation for whatever DBM you are using for details.
+
+Different DBM implementations return records in different orders. That means that you can I<not> depend on the order of records unless you use an ORDER BY statement. DBI::SQL::Nano does not currently support ORDER BY (though it may soon) so if you need ordering, you'll have to install SQL::Statement.
+
+DBM data files are platform-specific. To move them from one platform to another, you'll need to do something along the lines of dumping your data to CSV on platform #1 and then dumping from CSV to DBM on platform #2. DBD::AnyData and DBD::CSV can help with that. There may also be DBM conversion tools for your platforms which would probably be quickest.
+
+When using MLDBM, there is a very powerful serializer - it will allow you to store Perl code or objects in database columns. When these get de-serialized, they may be evaled - in other words MLDBM (or actually Data::Dumper when used by MLDBM) may take the values and try to execute them in Perl. Obviously, this can present dangers, so if you don't know what's in a file, be careful before you access it with MLDBM turned on!
+
+See the entire section on L<Table locking and flock()> for gotchas and warnings about the use of flock().
+
+=head1 GETTING HELP, MAKING SUGGESTIONS, AND REPORTING BUGS
+
+If you need help installing or using DBD::DBM, please write to the DBI users mailing list at dbi-users@perl.org or to the comp.lang.perl.modules newsgroup on usenet. I'm afraid I can't always answer these kinds of questions quickly and there are many on the mailing list or in the newsgroup who can.
+
+If you have suggestions, ideas for improvements, or bugs to report, please write me directly at the email shown below.
+
+When reporting bugs, please send the output of $dbh->dbm_versions($table) for a table that exhibits the bug and, if possible, as small a sample as you can make of the code that produces the bug. And of course, patches are welcome too :-).
+
+=head1 ACKNOWLEDGEMENTS
+
+Many, many thanks to Tim Bunce for prodding me to write this, and for copious, wise, and patient suggestions all along the way.
+
+=head1 AUTHOR AND COPYRIGHT
+
+This module is written and maintained by
+
+Jeff Zucker < jzucker AT cpan.org >
+
+Copyright (c) 2004 by Jeff Zucker, all rights reserved.
+
+You may freely distribute and/or modify this module under the terms of either the GNU General Public License (GPL) or the Artistic License, as specified in the Perl README file.
+
+=head1 SEE ALSO
+
+L<DBI>, L<SQL::Statement>, L<DBI::SQL::Nano>, L<AnyDBM_File>, L<MLDBM>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/ExampleP.pm b/Master/tlpkg/tlperl.straw/lib/DBD/ExampleP.pm
new file mode 100755
index 00000000000..a4159d7df4b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/ExampleP.pm
@@ -0,0 +1,430 @@
+{
+ package DBD::ExampleP;
+
+ use Symbol;
+
+ use DBI qw(:sql_types);
+
+ @EXPORT = qw(); # Do NOT @EXPORT anything.
+ $VERSION = sprintf("12.%06d", q$Revision: 10007 $ =~ /(\d+)/o);
+
+
+# $Id: ExampleP.pm 10007 2007-09-27 20:53:04Z timbo $
+#
+# Copyright (c) 1994,1997,1998 Tim Bunce
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+ @statnames = qw(dev ino mode nlink
+ uid gid rdev size
+ atime mtime ctime
+ blksize blocks name);
+ @statnames{@statnames} = (0 .. @statnames-1);
+
+ @stattypes = (SQL_INTEGER, SQL_INTEGER, SQL_INTEGER, SQL_INTEGER,
+ SQL_INTEGER, SQL_INTEGER, SQL_INTEGER, SQL_INTEGER,
+ SQL_INTEGER, SQL_INTEGER, SQL_INTEGER,
+ SQL_INTEGER, SQL_INTEGER, SQL_VARCHAR);
+ @stattypes{@statnames} = @stattypes;
+ @statprec = ((10) x (@statnames-1), 1024);
+ @statprec{@statnames} = @statprec;
+ die unless @statnames == @stattypes;
+ die unless @statprec == @stattypes;
+
+ $drh = undef; # holds driver handle once initialised
+ #$gensym = "SYM000"; # used by st::execute() for filehandles
+
+ sub driver{
+ return $drh if $drh;
+ my($class, $attr) = @_;
+ $class .= "::dr";
+ ($drh) = DBI::_new_drh($class, {
+ 'Name' => 'ExampleP',
+ 'Version' => $VERSION,
+ 'Attribution' => 'DBD Example Perl stub by Tim Bunce',
+ }, ['example implementors private data '.__PACKAGE__]);
+ $drh;
+ }
+
+ sub CLONE {
+ undef $drh;
+ }
+}
+
+
+{ package DBD::ExampleP::dr; # ====== DRIVER ======
+ $imp_data_size = 0;
+ use strict;
+
+ sub connect { # normally overridden, but a handy default
+ my($drh, $dbname, $user, $auth)= @_;
+ my ($outer, $dbh) = DBI::_new_dbh($drh, {
+ Name => $dbname,
+ examplep_private_dbh_attrib => 42, # an example, for testing
+ });
+ $dbh->{examplep_get_info} = {
+ 29 => '"', # SQL_IDENTIFIER_QUOTE_CHAR
+ 41 => '.', # SQL_CATALOG_NAME_SEPARATOR
+ 114 => 1, # SQL_CATALOG_LOCATION
+ };
+ #$dbh->{Name} = $dbname;
+ $dbh->STORE('Active', 1);
+ return $outer;
+ }
+
+ sub data_sources {
+ return ("dbi:ExampleP:dir=."); # possibly usefully meaningless
+ }
+
+}
+
+
+{ package DBD::ExampleP::db; # ====== DATABASE ======
+ $imp_data_size = 0;
+ use strict;
+
+ sub prepare {
+ my($dbh, $statement)= @_;
+ my @fields;
+ my($fields, $dir) = $statement =~ m/^\s*select\s+(.*?)\s+from\s+(\S*)/i;
+
+ if (defined $fields and defined $dir) {
+ @fields = ($fields eq '*')
+ ? keys %DBD::ExampleP::statnames
+ : split(/\s*,\s*/, $fields);
+ }
+ else {
+ return $dbh->set_err($DBI::stderr, "Syntax error in select statement (\"$statement\")")
+ unless $statement =~ m/^\s*set\s+/;
+ # the SET syntax is just a hack so the ExampleP driver can
+ # be used to test non-select statements.
+ # Now we have DBI::DBM etc., ExampleP should be deprecated
+ }
+
+ my ($outer, $sth) = DBI::_new_sth($dbh, {
+ 'Statement' => $statement,
+ examplep_private_sth_attrib => 24, # an example, for testing
+ }, ['example implementors private data '.__PACKAGE__]);
+
+ my @bad = map {
+ defined $DBD::ExampleP::statnames{$_} ? () : $_
+ } @fields;
+ return $dbh->set_err($DBI::stderr, "Unknown field names: @bad")
+ if @bad;
+
+ $outer->STORE('NUM_OF_FIELDS' => scalar(@fields));
+
+ $sth->{examplep_ex_dir} = $dir if defined($dir) && $dir !~ /\?/;
+ $outer->STORE('NUM_OF_PARAMS' => ($dir) ? $dir =~ tr/?/?/ : 0);
+
+ if (@fields) {
+ $outer->STORE('NAME' => \@fields);
+ $outer->STORE('NULLABLE' => [ (0) x @fields ]);
+ $outer->STORE('SCALE' => [ (0) x @fields ]);
+ }
+
+ $outer;
+ }
+
+
+ sub table_info {
+ my $dbh = shift;
+ my ($catalog, $schema, $table, $type) = @_;
+
+ my @types = split(/["']*,["']/, $type || 'TABLE');
+ my %types = map { $_=>$_ } @types;
+
+ # Return a list of all subdirectories
+ my $dh = Symbol::gensym(); # "DBD::ExampleP::".++$DBD::ExampleP::gensym;
+ my $haveFileSpec = eval { require File::Spec };
+ my $dir = $catalog || ($haveFileSpec ? File::Spec->curdir() : ".");
+ my @list;
+ if ($types{VIEW}) { # for use by test harness
+ push @list, [ undef, "schema", "table", 'VIEW', undef ];
+ push @list, [ undef, "sch-ema", "table", 'VIEW', undef ];
+ push @list, [ undef, "schema", "ta-ble", 'VIEW', undef ];
+ push @list, [ undef, "sch ema", "table", 'VIEW', undef ];
+ push @list, [ undef, "schema", "ta ble", 'VIEW', undef ];
+ }
+ if ($types{TABLE}) {
+ no strict 'refs';
+ opendir($dh, $dir)
+ or return $dbh->set_err(int($!), "Failed to open directory $dir: $!");
+ while (defined(my $item = readdir($dh))) {
+ if ($^O eq 'VMS') {
+ # if on VMS then avoid warnings from catdir if you use a file
+ # (not a dir) as the item below
+ next if $item !~ /\.dir$/oi;
+ }
+ my $file = ($haveFileSpec) ? File::Spec->catdir($dir,$item) : $item;
+ next unless -d $file;
+ my($dev, $ino, $mode, $nlink, $uid) = lstat($file);
+ my $pwnam = undef; # eval { scalar(getpwnam($uid)) } || $uid;
+ push @list, [ $dir, $pwnam, $item, 'TABLE', undef ];
+ }
+ close($dh);
+ }
+ # We would like to simply do a DBI->connect() here. However,
+ # this is wrong if we are in a subclass like DBI::ProxyServer.
+ $dbh->{'dbd_sponge_dbh'} ||= DBI->connect("DBI:Sponge:", '','')
+ or return $dbh->set_err($DBI::err,
+ "Failed to connect to DBI::Sponge: $DBI::errstr");
+
+ my $attr = {
+ 'rows' => \@list,
+ 'NUM_OF_FIELDS' => 5,
+ 'NAME' => ['TABLE_CAT', 'TABLE_SCHEM', 'TABLE_NAME',
+ 'TABLE_TYPE', 'REMARKS'],
+ 'TYPE' => [DBI::SQL_VARCHAR(), DBI::SQL_VARCHAR(),
+ DBI::SQL_VARCHAR(), DBI::SQL_VARCHAR(), DBI::SQL_VARCHAR() ],
+ 'NULLABLE' => [1, 1, 1, 1, 1]
+ };
+ my $sdbh = $dbh->{'dbd_sponge_dbh'};
+ my $sth = $sdbh->prepare("SHOW TABLES FROM $dir", $attr)
+ or return $dbh->set_err($sdbh->err(), $sdbh->errstr());
+ $sth;
+ }
+
+
+ sub type_info_all {
+ my ($dbh) = @_;
+ my $ti = [
+ { TYPE_NAME => 0,
+ DATA_TYPE => 1,
+ COLUMN_SIZE => 2,
+ LITERAL_PREFIX => 3,
+ LITERAL_SUFFIX => 4,
+ CREATE_PARAMS => 5,
+ NULLABLE => 6,
+ CASE_SENSITIVE => 7,
+ SEARCHABLE => 8,
+ UNSIGNED_ATTRIBUTE=> 9,
+ FIXED_PREC_SCALE=> 10,
+ AUTO_UNIQUE_VALUE => 11,
+ LOCAL_TYPE_NAME => 12,
+ MINIMUM_SCALE => 13,
+ MAXIMUM_SCALE => 14,
+ },
+ [ 'VARCHAR', DBI::SQL_VARCHAR, 1024, "'","'", undef, 0, 1, 1, 0, 0,0,undef,0,0 ],
+ [ 'INTEGER', DBI::SQL_INTEGER, 10, "","", undef, 0, 0, 1, 0, 0,0,undef,0,0 ],
+ ];
+ return $ti;
+ }
+
+
+ sub ping {
+ (shift->FETCH('Active')) ? 2 : 0; # the value 2 is checked for by t/80proxy.t
+ }
+
+
+ sub disconnect {
+ shift->STORE(Active => 0);
+ return 1;
+ }
+
+
+ sub get_info {
+ my ($dbh, $info_type) = @_;
+ return $dbh->{examplep_get_info}->{$info_type};
+ }
+
+
+ sub FETCH {
+ my ($dbh, $attrib) = @_;
+ # In reality this would interrogate the database engine to
+ # either return dynamic values that cannot be precomputed
+ # or fetch and cache attribute values too expensive to prefetch.
+ # else pass up to DBI to handle
+ return $INC{"DBD/ExampleP.pm"} if $attrib eq 'example_driver_path';
+ return $dbh->SUPER::FETCH($attrib);
+ }
+
+
+ sub STORE {
+ my ($dbh, $attrib, $value) = @_;
+ # would normally validate and only store known attributes
+ # else pass up to DBI to handle
+ if ($attrib eq 'AutoCommit') {
+ # convert AutoCommit values to magic ones to let DBI
+ # know that the driver has 'handled' the AutoCommit attribute
+ $value = ($value) ? -901 : -900;
+ }
+ return $dbh->{$attrib} = $value if $attrib =~ /^examplep_/;
+ return $dbh->SUPER::STORE($attrib, $value);
+ }
+
+ sub DESTROY {
+ my $dbh = shift;
+ $dbh->disconnect if $dbh->FETCH('Active');
+ undef
+ }
+
+
+ # This is an example to demonstrate the use of driver-specific
+ # methods via $dbh->func().
+ # Use it as follows:
+ # my @tables = $dbh->func($re, 'examplep_tables');
+ #
+ # Returns all the tables that match the regular expression $re.
+ sub examplep_tables {
+ my $dbh = shift; my $re = shift;
+ grep { $_ =~ /$re/ } $dbh->tables();
+ }
+
+ sub parse_trace_flag {
+ my ($h, $name) = @_;
+ return 0x01000000 if $name eq 'foo';
+ return 0x02000000 if $name eq 'bar';
+ return 0x04000000 if $name eq 'baz';
+ return 0x08000000 if $name eq 'boo';
+ return 0x10000000 if $name eq 'bop';
+ return $h->SUPER::parse_trace_flag($name);
+ }
+
+ sub private_attribute_info {
+ return { example_driver_path => undef };
+ }
+}
+
+
+{ package DBD::ExampleP::st; # ====== STATEMENT ======
+ $imp_data_size = 0;
+ use strict; no strict 'refs'; # cause problems with filehandles
+
+ my $haveFileSpec = eval { require File::Spec };
+
+ sub bind_param {
+ my($sth, $param, $value, $attribs) = @_;
+ $sth->{'dbd_param'}->[$param-1] = $value;
+ return 1;
+ }
+
+
+ sub execute {
+ my($sth, @dir) = @_;
+ my $dir;
+
+ if (@dir) {
+ $sth->bind_param($_, $dir[$_-1]) or return
+ foreach (1..@dir);
+ }
+
+ my $dbd_param = $sth->{'dbd_param'} || [];
+ return $sth->set_err(2, @$dbd_param." values bound when $sth->{NUM_OF_PARAMS} expected")
+ unless @$dbd_param == $sth->{NUM_OF_PARAMS};
+
+ return 0 unless $sth->{NUM_OF_FIELDS}; # not a select
+
+ $dir = $dbd_param->[0] || $sth->{examplep_ex_dir};
+ return $sth->set_err(2, "No bind parameter supplied")
+ unless defined $dir;
+
+ $sth->finish;
+
+ #
+ # If the users asks for directory "long_list_4532", then we fake a
+ # directory with files "file4351", "file4350", ..., "file0".
+ # This is a special case used for testing, especially DBD::Proxy.
+ #
+ if ($dir =~ /^long_list_(\d+)$/) {
+ $sth->{dbd_dir} = [ $1 ]; # array ref indicates special mode
+ $sth->{dbd_datahandle} = undef;
+ }
+ else {
+ $sth->{dbd_dir} = $dir;
+ my $sym = Symbol::gensym(); # "DBD::ExampleP::".++$DBD::ExampleP::gensym;
+ opendir($sym, $dir)
+ or return $sth->set_err(2, "opendir($dir): $!");
+ $sth->{dbd_datahandle} = $sym;
+ }
+ $sth->STORE(Active => 1);
+ return 1;
+ }
+
+
+ sub fetch {
+ my $sth = shift;
+ my $dir = $sth->{dbd_dir};
+ my %s;
+
+ if (ref $dir) { # special fake-data test mode
+ my $num = $dir->[0]--;
+ unless ($num > 0) {
+ $sth->finish();
+ return;
+ }
+ my $time = time;
+ @s{@DBD::ExampleP::statnames} =
+ ( 2051, 1000+$num, 0644, 2, $>, $), 0, 1024,
+ $time, $time, $time, 512, 2, "file$num")
+ }
+ else { # normal mode
+ my $dh = $sth->{dbd_datahandle}
+ or return $sth->set_err($DBI::stderr, "fetch without successful execute");
+ my $f = readdir($dh);
+ unless ($f) {
+ $sth->finish;
+ return;
+ }
+ # untaint $f so that we can use this for DBI taint tests
+ ($f) = ($f =~ m/^(.*)$/);
+ my $file = $haveFileSpec
+ ? File::Spec->catfile($dir, $f) : "$dir/$f";
+ # put in all the data fields
+ @s{ @DBD::ExampleP::statnames } = (lstat($file), $f);
+ }
+
+ # return just what fields the query asks for
+ my @new = @s{ @{$sth->{NAME}} };
+
+ return $sth->_set_fbav(\@new);
+ }
+ *fetchrow_arrayref = \&fetch;
+
+
+ sub finish {
+ my $sth = shift;
+ closedir($sth->{dbd_datahandle}) if $sth->{dbd_datahandle};
+ $sth->{dbd_datahandle} = undef;
+ $sth->{dbd_dir} = undef;
+ $sth->SUPER::finish();
+ return 1;
+ }
+
+
+ sub FETCH {
+ my ($sth, $attrib) = @_;
+ # In reality this would interrogate the database engine to
+ # either return dynamic values that cannot be precomputed
+ # or fetch and cache attribute values too expensive to prefetch.
+ if ($attrib eq 'TYPE'){
+ return [ @DBD::ExampleP::stattypes{ @{ $sth->FETCH(q{NAME_lc}) } } ];
+ }
+ elsif ($attrib eq 'PRECISION'){
+ return [ @DBD::ExampleP::statprec{ @{ $sth->FETCH(q{NAME_lc}) } } ];
+ }
+ elsif ($attrib eq 'ParamValues') {
+ my $dbd_param = $sth->{dbd_param} || [];
+ my %pv = map { $_ => $dbd_param->[$_-1] } 1..@$dbd_param;
+ return \%pv;
+ }
+ # else pass up to DBI to handle
+ return $sth->SUPER::FETCH($attrib);
+ }
+
+
+ sub STORE {
+ my ($sth, $attrib, $value) = @_;
+ # would normally validate and only store known attributes
+ # else pass up to DBI to handle
+ return $sth->{$attrib} = $value
+ if $attrib eq 'NAME' or $attrib eq 'NULLABLE' or $attrib eq 'SCALE' or $attrib eq 'PRECISION';
+ return $sth->SUPER::STORE($attrib, $value);
+ }
+
+ *parse_trace_flag = \&DBD::ExampleP::db::parse_trace_flag;
+}
+
+1;
+# vim: sw=4:ts=8
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/File.pm b/Master/tlpkg/tlperl.straw/lib/DBD/File.pm
new file mode 100755
index 00000000000..fe72e8812d4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/File.pm
@@ -0,0 +1,989 @@
+# -*- perl -*-
+#
+# DBD::File - A base class for implementing DBI drivers that
+# act on plain files
+#
+# This module is currently maintained by
+#
+# H.Merijn Brand & Jens Rehsack
+#
+# The original author is Jochen Wiedmann.
+#
+# Copyright (C) 2009 by H.Merijn Brand & Jens Rehsack
+# Copyright (C) 2004 by Jeff Zucker
+# Copyright (C) 1998 by Jochen Wiedmann
+#
+# All rights reserved.
+#
+# You may distribute this module under the terms of either the GNU
+# General Public License or the Artistic License, as specified in
+# the Perl README file.
+
+require 5.005;
+
+use strict;
+
+use DBI ();
+require DBI::SQL::Nano;
+require File::Spec;
+
+package DBD::File;
+
+use strict;
+
+use vars qw( @ISA $VERSION $drh $valid_attrs );
+
+$VERSION = "0.37";
+
+$drh = undef; # holds driver handle(s) once initialised
+
+sub driver ($;$)
+{
+ my ($class, $attr) = @_;
+
+ # Drivers typically use a singleton object for the $drh
+ # We use a hash here to have one singleton per subclass.
+ # (Otherwise DBD::CSV and DBD::DBM, for example, would
+ # share the same driver object which would cause problems.)
+ # An alternative would be not not cache the $drh here at all
+ # and require that subclasses do that. Subclasses should do
+ # their own caching, so caching here just provides extra safety.
+ $drh->{$class} and return $drh->{$class};
+
+ DBI->setup_driver ("DBD::File"); # only needed once but harmless to repeat
+ $attr ||= {};
+ { no strict "refs";
+ unless ($attr->{Attribution}) {
+ $class eq "DBD::File" and $attr->{Attribution} = "$class by Jeff Zucker";
+ $attr->{Attribution} ||= ${$class . "::ATTRIBUTION"} ||
+ "oops the author of $class forgot to define this";
+ }
+ $attr->{Version} ||= ${$class . "::VERSION"};
+ $attr->{Name} or ($attr->{Name} = $class) =~ s/^DBD\:\://;
+ }
+
+ $drh->{$class} = DBI::_new_drh ($class . "::dr", $attr);
+ $drh->{$class}->STORE (ShowErrorStatement => 1);
+ return $drh->{$class};
+ } # driver
+
+sub CLONE
+{
+ undef $drh;
+ } # CLONE
+
+sub file2table
+{
+ my ($data, $dir, $file, $file_is_tab, $quoted) = @_;
+
+ $file eq "." || $file eq ".." and return;
+
+ my ($ext, $req) = ("", 0, 0);
+ if ($data->{f_ext}) {
+ ($ext, my $opt) = split m/\//, $data->{f_ext};
+ if ($ext && $opt) {
+ $opt =~ m/r/i and $req = 1;
+ }
+ }
+
+ (my $tbl = $file) =~ s/$ext$//i;
+ $file_is_tab and $file = "$tbl$ext";
+
+ # Fully Qualified File Name
+ my $fqfn;
+ unless ($quoted) { # table names are case insensitive in SQL
+ local *DIR;
+ opendir DIR, $dir;
+ my @f = grep { lc $_ eq lc $file } readdir DIR;
+ @f == 1 and $file = $f[0];
+ }
+ $fqfn = File::Spec->catfile ($dir, $file);
+
+ $file = $fqfn;
+ if ($ext) {
+ if ($req) {
+ # File extension required
+ $file =~ s/$ext$//i or return;
+ }
+ else {
+ # File extension optional, skip if file with extension exists
+ grep m/$ext$/i, glob "$fqfn.*" and return;
+ $file =~ s/$ext$//i;
+ }
+ }
+
+ $data->{f_map}{$tbl} = $fqfn;
+ return $tbl;
+ } # file2table
+
+# ====== DRIVER ================================================================
+
+package DBD::File::dr;
+
+use strict;
+
+$DBD::File::dr::imp_data_size = 0;
+
+sub connect ($$;$$$)
+{
+ my ($drh, $dbname, $user, $auth, $attr)= @_;
+
+ # create a 'blank' dbh
+ my $this = DBI::_new_dbh ($drh, {
+ Name => $dbname,
+ USER => $user,
+ CURRENT_USER => $user,
+ });
+
+ if ($this) {
+ my ($var, $val);
+ $this->{f_dir} = File::Spec->curdir ();
+ $this->{f_ext} = "";
+ $this->{f_map} = {};
+ while (length $dbname) {
+ if ($dbname =~ s/^((?:[^\\;]|\\.)*?);//s) {
+ $var = $1;
+ }
+ else {
+ $var = $dbname;
+ $dbname = "";
+ }
+ if ($var =~ m/^(.+?)=(.*)/s) {
+ $var = $1;
+ ($val = $2) =~ s/\\(.)/$1/g;
+ $this->{$var} = $val;
+ }
+ }
+ $this->{f_valid_attrs} = {
+ f_version => 1, # DBD::File version
+ f_dir => 1, # base directory
+ f_ext => 1, # file extension
+ f_schema => 1, # schema name
+ f_tables => 1, # base directory
+ };
+ $this->{sql_valid_attrs} = {
+ sql_handler => 1, # Nano or S:S
+ sql_nano_version => 1, # Nano version
+ sql_statement_version => 1, # S:S version
+ };
+ }
+ $this->STORE ("Active", 1);
+ return set_versions ($this);
+ } # connect
+
+sub set_versions
+{
+ my $this = shift;
+ $this->{f_version} = $DBD::File::VERSION;
+ for (qw( nano_version statement_version)) {
+ $this->{"sql_$_"} = $DBI::SQL::Nano::versions->{$_} || "";
+ }
+ $this->{sql_handler} = $this->{sql_statement_version}
+ ? "SQL::Statement"
+ : "DBI::SQL::Nano";
+ return $this;
+ } # set_versions
+
+sub data_sources ($;$)
+{
+ my ($drh, $attr) = @_;
+ my $dir = $attr && exists $attr->{f_dir}
+ ? $attr->{f_dir}
+ : File::Spec->curdir ();
+ my ($dirh) = Symbol::gensym ();
+ unless (opendir ($dirh, $dir)) {
+ $drh->set_err ($DBI::stderr, "Cannot open directory $dir: $!");
+ return;
+ }
+
+ my ($file, @dsns, %names, $driver);
+ if ($drh->{ImplementorClass} =~ m/^dbd\:\:([^\:]+)\:\:/i) {
+ $driver = $1;
+ }
+ else {
+ $driver = "File";
+ }
+
+ while (defined ($file = readdir ($dirh))) {
+ if ($^O eq "VMS") {
+ # if on VMS then avoid warnings from catdir if you use a file
+ # (not a dir) as the file below
+ $file !~ m/\.dir$/oi and next;
+ }
+ my $d = File::Spec->catdir ($dir, $file);
+ # allow current dir ... it can be a data_source too
+ $file ne File::Spec->updir () && -d $d and
+ push @dsns, "DBI:$driver:f_dir=$d";
+ }
+ @dsns;
+ } # data_sources
+
+sub disconnect_all
+{
+ } # disconnect_all
+
+sub DESTROY
+{
+ undef;
+ } # DESTROY
+
+# ====== DATABASE ==============================================================
+
+package DBD::File::db;
+
+use strict;
+use Carp;
+
+$DBD::File::db::imp_data_size = 0;
+
+sub ping
+{
+ return (shift->FETCH ("Active")) ? 1 : 0;
+ } # ping
+
+sub prepare ($$;@)
+{
+ my ($dbh, $statement, @attribs) = @_;
+
+ # create a 'blank' sth
+ my $sth = DBI::_new_sth ($dbh, {Statement => $statement});
+
+ if ($sth) {
+ my $class = $sth->FETCH ("ImplementorClass");
+ $class =~ s/::st$/::Statement/;
+ my $stmt;
+
+ # if using SQL::Statement version > 1
+ # cache the parser object if the DBD supports parser caching
+ # SQL::Nano and older SQL::Statements don't support this
+
+ if ( $dbh->{sql_handler} eq "SQL::Statement" and
+ $dbh->{sql_statement_version} > 1) {
+ my $parser = $dbh->{csv_sql_parser_object};
+ $parser ||= eval { $dbh->func ("csv_cache_sql_parser_object") };
+ if ($@) {
+ $stmt = eval { $class->new ($statement) };
+ }
+ else {
+ $stmt = eval { $class->new ($statement, $parser) };
+ }
+ }
+ else {
+ $stmt = eval { $class->new ($statement) };
+ }
+ if ($@) {
+ $dbh->set_err ($DBI::stderr, $@);
+ undef $sth;
+ }
+ else {
+ $sth->STORE ("f_stmt", $stmt);
+ $sth->STORE ("f_params", []);
+ $sth->STORE ("NUM_OF_PARAMS", scalar ($stmt->params ()));
+ }
+ }
+ $sth;
+ } # prepare
+
+sub csv_cache_sql_parser_object
+{
+ my $dbh = shift;
+ my $parser = {
+ dialect => "CSV",
+ RaiseError => $dbh->FETCH ("RaiseError"),
+ PrintError => $dbh->FETCH ("PrintError"),
+ };
+ my $sql_flags = $dbh->FETCH ("sql_flags") || {};
+ %$parser = (%$parser, %$sql_flags);
+ $parser = SQL::Parser->new ($parser->{dialect}, $parser);
+ $dbh->{csv_sql_parser_object} = $parser;
+ return $parser;
+ } # csv_cache_sql_parser_object
+
+sub disconnect ($)
+{
+ shift->STORE ("Active", 0);
+ 1;
+ } # disconnect
+
+sub FETCH ($$)
+{
+ my ($dbh, $attrib) = @_;
+ $attrib eq "AutoCommit" and
+ return 1;
+
+ if ($attrib eq (lc $attrib)) {
+ # Driver private attributes are lower cased
+
+ # Error-check for valid attributes
+ # not implemented yet, see STORE
+ #
+ return $dbh->{$attrib};
+ }
+ # else pass up to DBI to handle
+ return $dbh->SUPER::FETCH ($attrib);
+ } # FETCH
+
+sub STORE ($$$)
+{
+ my ($dbh, $attrib, $value) = @_;
+
+ if ($attrib eq "AutoCommit") {
+ $value and return 1; # is already set
+ croak "Can't disable AutoCommit";
+ }
+
+ if ($attrib eq lc $attrib) {
+ # Driver private attributes are lower cased
+
+ # I'm not implementing this yet becuase other drivers may be
+ # setting f_ and sql_ attrs I don't know about
+ # I'll investigate and publicize warnings to DBD authors
+ # then implement this
+
+ # return to implementor if not f_ or sql_
+ # not implemented yet
+ # my $class = $dbh->FETCH ("ImplementorClass");
+ #
+ # !$dbh->{f_valid_attrs}->{$attrib} && !$dbh->{sql_valid_attrs}->{$attrib} and
+ # return $dbh->set_err ($DBI::stderr, "Invalid attribute '$attrib'");
+ # $dbh->{$attrib} = $value;
+
+ if ($attrib eq "f_dir") {
+ -d $value or
+ return $dbh->set_err ($DBI::stderr, "No such directory '$value'")
+ }
+ if ($attrib eq "f_ext") {
+ $value eq "" || $value =~ m{^\.\w+(?:/[rR]*)?$}
+ or carp "'$value' doesn't look like a valid file extension attribute\n";
+ }
+ $dbh->{$attrib} = $value;
+ return 1;
+ }
+ return $dbh->SUPER::STORE ($attrib, $value);
+ } # STORE
+
+sub DESTROY ($)
+{
+ my $dbh = shift;
+ $dbh->SUPER::FETCH ("Active") and $dbh->disconnect ;
+ } # DESTROY
+
+sub type_info_all ($)
+{
+ [ { TYPE_NAME => 0,
+ DATA_TYPE => 1,
+ PRECISION => 2,
+ LITERAL_PREFIX => 3,
+ LITERAL_SUFFIX => 4,
+ CREATE_PARAMS => 5,
+ NULLABLE => 6,
+ CASE_SENSITIVE => 7,
+ SEARCHABLE => 8,
+ UNSIGNED_ATTRIBUTE => 9,
+ MONEY => 10,
+ AUTO_INCREMENT => 11,
+ LOCAL_TYPE_NAME => 12,
+ MINIMUM_SCALE => 13,
+ MAXIMUM_SCALE => 14,
+ },
+ [ "VARCHAR", DBI::SQL_VARCHAR (),
+ undef, "'", "'", undef, 0, 1, 1, 0, 0, 0, undef, 1, 999999,
+ ],
+ [ "CHAR", DBI::SQL_CHAR (),
+ undef, "'", "'", undef, 0, 1, 1, 0, 0, 0, undef, 1, 999999,
+ ],
+ [ "INTEGER", DBI::SQL_INTEGER (),
+ undef, "", "", undef, 0, 0, 1, 0, 0, 0, undef, 0, 0,
+ ],
+ [ "REAL", DBI::SQL_REAL (),
+ undef, "", "", undef, 0, 0, 1, 0, 0, 0, undef, 0, 0,
+ ],
+ [ "BLOB", DBI::SQL_LONGVARBINARY (),
+ undef, "'", "'", undef, 0, 1, 1, 0, 0, 0, undef, 1, 999999,
+ ],
+ [ "BLOB", DBI::SQL_LONGVARBINARY (),
+ undef, "'", "'", undef, 0, 1, 1, 0, 0, 0, undef, 1, 999999,
+ ],
+ [ "TEXT", DBI::SQL_LONGVARCHAR (),
+ undef, "'", "'", undef, 0, 1, 1, 0, 0, 0, undef, 1, 999999,
+ ]];
+ } # type_info_all
+
+{ my $names = [
+ qw( TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS )];
+
+ sub table_info ($)
+ {
+ my $dbh = shift;
+ my $dir = $dbh->{f_dir};
+ my $dirh = Symbol::gensym ();
+
+ unless (opendir $dirh, $dir) {
+ $dbh->set_err ($DBI::stderr, "Cannot open directory $dir: $!");
+ return;
+ }
+
+ my ($file, @tables, %names);
+ my $schema = exists $dbh->{f_schema}
+ ? $dbh->{f_schema}
+ : eval { getpwuid ((stat $dir)[4]) };
+ while (defined ($file = readdir ($dirh))) {
+ my $tbl = DBD::File::file2table ($dbh, $dir, $file, 0, 0) or next;
+ push @tables, [ undef, $schema, $tbl, "TABLE", undef ];
+ }
+ unless (closedir $dirh) {
+ $dbh->set_err ($DBI::stderr, "Cannot close directory $dir: $!");
+ return;
+ }
+
+ my $dbh2 = $dbh->{csv_sponge_driver};
+ unless ($dbh2) {
+ $dbh2 = $dbh->{csv_sponge_driver} = DBI->connect ("DBI:Sponge:");
+ unless ($dbh2) {
+ $dbh->set_err ($DBI::stderr, $DBI::errstr);
+ return;
+ }
+ }
+
+ # Temporary kludge: DBD::Sponge dies if @tables is empty. :-(
+ @tables or return;
+
+ my $sth = $dbh2->prepare ("TABLE_INFO", {
+ rows => \@tables,
+ NAMES => $names,
+ });
+ $sth or $dbh->set_err ($DBI::stderr, $dbh2->errstr);
+ $sth;
+ } # table_info
+ }
+
+sub list_tables ($)
+{
+ my $dbh = shift;
+ my ($sth, @tables);
+ $sth = $dbh->table_info () or return;
+ while (my $ref = $sth->fetchrow_arrayref ()) {
+ push @tables, $ref->[2];
+ }
+ @tables;
+ } # list_tables
+
+sub quote ($$;$)
+{
+ my ($self, $str, $type) = @_;
+ defined $str or return "NULL";
+ defined $type && (
+ $type == DBI::SQL_NUMERIC ()
+ || $type == DBI::SQL_DECIMAL ()
+ || $type == DBI::SQL_INTEGER ()
+ || $type == DBI::SQL_SMALLINT ()
+ || $type == DBI::SQL_FLOAT ()
+ || $type == DBI::SQL_REAL ()
+ || $type == DBI::SQL_DOUBLE ()
+ || $type == DBI::SQL_TINYINT ())
+ and return $str;
+
+ $str =~ s/\\/\\\\/sg;
+ $str =~ s/\0/\\0/sg;
+ $str =~ s/\'/\\\'/sg;
+ $str =~ s/\n/\\n/sg;
+ $str =~ s/\r/\\r/sg;
+ "'$str'";
+ } # quote
+
+sub commit ($)
+{
+ my $dbh = shift;
+ $dbh->FETCH ("Warn") and
+ carp "Commit ineffective while AutoCommit is on", -1;
+ 1;
+ } # commit
+
+sub rollback ($)
+{
+ my $dbh = shift;
+ $dbh->FETCH ("Warn") and
+ carp "Rollback ineffective while AutoCommit is on", -1;
+ 0;
+ } # rollback
+
+# ====== STATEMENT =============================================================
+
+package DBD::File::st;
+
+use strict;
+
+$DBD::File::st::imp_data_size = 0;
+
+sub bind_param ($$$;$)
+{
+ my ($sth, $pNum, $val, $attr) = @_;
+ if ($attr && defined $val) {
+ my $type = ref $attr eq "HASH" ? $attr->{TYPE} : $attr;
+ if ( $attr == DBI::SQL_BIGINT ()
+ || $attr == DBI::SQL_INTEGER ()
+ || $attr == DBI::SQL_SMALLINT ()
+ || $attr == DBI::SQL_TINYINT ()
+ ) {
+ $val += 0;
+ }
+ elsif ($attr == DBI::SQL_DECIMAL ()
+ || $attr == DBI::SQL_DOUBLE ()
+ || $attr == DBI::SQL_FLOAT ()
+ || $attr == DBI::SQL_NUMERIC ()
+ || $attr == DBI::SQL_REAL ()
+ ) {
+ $val += 0.;
+ }
+ else {
+ $val = "$val";
+ }
+ }
+ $sth->{f_params}[$pNum - 1] = $val;
+ 1;
+ } # bind_param
+
+sub execute
+{
+ my $sth = shift;
+ my $params = @_ ? ($sth->{f_params} = [ @_ ]) : $sth->{f_params};
+
+ $sth->finish;
+ my $stmt = $sth->{f_stmt};
+ unless ($sth->{f_params_checked}++) {
+ # bug in SQL::Statement 1.20 and below causes breakage
+ # on all but the first call
+ unless ((my $req_prm = $stmt->params ()) == (my $nparm = @$params)) {
+ my $msg = "You passed $nparm parameters where $req_prm required";
+ $sth->set_err ($DBI::stderr, $msg);
+ return;
+ }
+ }
+ my @err;
+ my $result = eval {
+ local $SIG{__WARN__} = sub { push @err, @_ };
+ $stmt->execute ($sth, $params);
+ };
+ if ($@ || @err) {
+ $sth->set_err ($DBI::stderr, $@ || $err[0]);
+ return undef;
+ }
+
+ if ($stmt->{NUM_OF_FIELDS}) { # is a SELECT statement
+ $sth->STORE (Active => 1);
+ $sth->FETCH ("NUM_OF_FIELDS") or
+ $sth->STORE ("NUM_OF_FIELDS", $stmt->{NUM_OF_FIELDS})
+ }
+ return $result;
+ } # execute
+
+sub finish
+{
+ my $sth = shift;
+ $sth->SUPER::STORE (Active => 0);
+ delete $sth->{f_stmt}->{data};
+ return 1;
+ } # finish
+
+sub fetch ($)
+{
+ my $sth = shift;
+ my $data = $sth->{f_stmt}->{data};
+ if (!$data || ref $data ne "ARRAY") {
+ $sth->set_err ($DBI::stderr,
+ "Attempt to fetch row without a preceeding execute () call or from a non-SELECT statement"
+ );
+ return
+ }
+ my $dav = shift @$data;
+ unless ($dav) {
+ $sth->finish;
+ return
+ }
+ if ($sth->FETCH ("ChopBlanks")) {
+ $_ && $_ =~ s/\s+$// for @$dav;
+ }
+ $sth->_set_fbav ($dav);
+ } # fetch
+*fetchrow_arrayref = \&fetch;
+
+my %unsupported_attrib = map { $_ => 1 } qw( TYPE PRECISION );
+
+sub FETCH ($$)
+{
+ my ($sth, $attrib) = @_;
+ exists $unsupported_attrib{$attrib}
+ and return undef; # Workaround for a bug in DBI 0.93
+ $attrib eq "NAME" and
+ return $sth->FETCH ("f_stmt")->{NAME};
+ if ($attrib eq "NULLABLE") {
+ my ($meta) = $sth->FETCH ("f_stmt")->{NAME}; # Intentional !
+ $meta or return undef;
+ return [ (1) x @$meta ];
+ }
+ if ($attrib eq lc $attrib) {
+ # Private driver attributes are lower cased
+ return $sth->{$attrib};
+ }
+ # else pass up to DBI to handle
+ return $sth->SUPER::FETCH ($attrib);
+ } # FETCH
+
+sub STORE ($$$)
+{
+ my ($sth, $attrib, $value) = @_;
+ exists $unsupported_attrib{$attrib}
+ and return; # Workaround for a bug in DBI 0.93
+ if ($attrib eq lc $attrib) {
+ # Private driver attributes are lower cased
+ $sth->{$attrib} = $value;
+ return 1;
+ }
+ return $sth->SUPER::STORE ($attrib, $value);
+ } # STORE
+
+sub DESTROY ($)
+{
+ my $sth = shift;
+ $sth->SUPER::FETCH ("Active") and $sth->finish;
+ } # DESTROY
+
+sub rows ($)
+{
+ shift->{f_stmt}->{NUM_OF_ROWS};
+ } # rows
+
+package DBD::File::Statement;
+
+use strict;
+use Carp;
+
+# We may have a working flock () built-in but that doesn't mean that locking
+# will work on NFS (flock () may hang hard)
+my $locking = eval { flock STDOUT, 0; 1 };
+
+# Jochen's old check for flock ()
+#
+# my $locking = $^O ne "MacOS" &&
+# ($^O ne "MSWin32" || !Win32::IsWin95 ()) &&
+# $^O ne "VMS";
+
+@DBD::File::Statement::ISA = qw( DBI::SQL::Nano::Statement );
+
+my $open_table_re = sprintf "(?:%s|%s|%s)",
+ quotemeta (File::Spec->curdir ()),
+ quotemeta (File::Spec->updir ()),
+ quotemeta (File::Spec->rootdir ());
+
+sub get_file_name ($$$)
+{
+ my ($self, $data, $table) = @_;
+ my $quoted = 0;
+ $table =~ s/^\"// and $quoted = 1; # handle quoted identifiers
+ $table =~ s/\"$//;
+ my $file = $table;
+ if ( $file !~ m/^$open_table_re/o
+ and $file !~ m{^[/\\]} # root
+ and $file !~ m{^[a-z]\:} # drive letter
+ ) {
+ exists $data->{Database}{f_map}{$table} or
+ DBD::File::file2table ($data->{Database},
+ $data->{Database}{f_dir}, $file, 1, $quoted);
+ $file = $data->{Database}{f_map}{$table} || undef;
+ }
+ return ($table, $file);
+ } # get_file_name
+
+sub open_table ($$$$$)
+{
+ my ($self, $data, $table, $createMode, $lockMode) = @_;
+ my $file;
+ ($table, $file) = $self->get_file_name ($data, $table);
+ defined $file && $file ne "" or croak "No filename given";
+ require IO::File;
+ my $fh;
+ my $safe_drop = $self->{ignore_missing_table} ? 1 : 0;
+ if ($createMode) {
+ -f $file and
+ croak "Cannot create table $table: Already exists";
+ $fh = IO::File->new ($file, "a+") or
+ croak "Cannot open $file for writing: $!";
+ $fh->seek (0, 0) or
+ croak "Error while seeking back: $!";
+ }
+ else {
+ unless ($fh = IO::File->new ($file, ($lockMode ? "r+" : "r"))) {
+ $safe_drop or croak "Cannot open $file: $!";
+ }
+ }
+ $fh and binmode $fh;
+ if ($locking and $fh) {
+ if ($lockMode) {
+ flock $fh, 2 or croak "Cannot obtain exclusive lock on $file: $!";
+ }
+ else {
+ flock $fh, 1 or croak "Cannot obtain shared lock on $file: $!";
+ }
+ }
+ my $columns = {};
+ my $array = [];
+ my $pos = $fh ? $fh->tell () : undef;
+ my $tbl = {
+ file => $file,
+ fh => $fh,
+ col_nums => $columns,
+ col_names => $array,
+ first_row_pos => $pos,
+ };
+ my $class = ref $self;
+ $class =~ s/::Statement/::Table/;
+ bless $tbl, $class;
+ $tbl;
+ } # open_table
+
+package DBD::File::Table;
+
+use strict;
+use Carp;
+
+@DBD::File::Table::ISA = qw(DBI::SQL::Nano::Table);
+
+sub drop ($)
+{
+ my $self = shift;
+ # We have to close the file before unlinking it: Some OS'es will
+ # refuse the unlink otherwise.
+ $self->{fh} and $self->{fh}->close ();
+ unlink $self->{file};
+ return 1;
+ } # drop
+
+sub seek ($$$$)
+{
+ my ($self, $data, $pos, $whence) = @_;
+ if ($whence == 0 && $pos == 0) {
+ $pos = $self->{first_row_pos};
+ }
+ elsif ($whence != 2 || $pos != 0) {
+ croak "Illegal seek position: pos = $pos, whence = $whence";
+ }
+
+ $self->{fh}->seek ($pos, $whence) or
+ croak "Error while seeking in " . $self->{file} . ": $!";
+ } # seek
+
+sub truncate ($$)
+{
+ my ($self, $data) = @_;
+ $self->{fh}->truncate ($self->{fh}->tell ()) or
+ croak "Error while truncating " . $self->{file} . ": $!";
+ 1;
+ } # truncate
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBD::File - Base class for writing DBI drivers
+
+=head1 SYNOPSIS
+
+ This module is a base class for writing other DBDs.
+ It is not intended to function as a DBD itself.
+ If you want to access flatfiles, use DBD::AnyData, or DBD::CSV,
+ (both of which are subclasses of DBD::File).
+
+=head1 DESCRIPTION
+
+The DBD::File module is not a true DBI driver, but an abstract
+base class for deriving concrete DBI drivers from it. The implication is,
+that these drivers work with plain files, for example CSV files or
+INI files. The module is based on the SQL::Statement module, a simple
+SQL engine.
+
+See L<DBI> for details on DBI, L<SQL::Statement> for details on
+SQL::Statement and L<DBD::CSV> or L<DBD::IniFile> for example
+drivers.
+
+
+=head2 Metadata
+
+The following attributes are handled by DBI itself and not by DBD::File,
+thus they all work like expected:
+
+ Active
+ ActiveKids
+ CachedKids
+ CompatMode (Not used)
+ InactiveDestroy
+ Kids
+ PrintError
+ RaiseError
+ Warn (Not used)
+
+The following DBI attributes are handled by DBD::File:
+
+=over 4
+
+=item AutoCommit
+
+Always on
+
+=item ChopBlanks
+
+Works
+
+=item NUM_OF_FIELDS
+
+Valid after C<$sth->execute>
+
+=item NUM_OF_PARAMS
+
+Valid after C<$sth->prepare>
+
+=item NAME
+
+Valid after C<$sth->execute>; undef for Non-Select statements.
+
+=item NULLABLE
+
+Not really working, always returns an array ref of one's, as DBD::CSV
+doesn't verify input data. Valid after C<$sth->execute>; undef for
+Non-Select statements.
+
+=back
+
+These attributes and methods are not supported:
+
+ bind_param_inout
+ CursorName
+ LongReadLen
+ LongTruncOk
+
+Additional to the DBI attributes, you can use the following dbh
+attribute:
+
+=over 4
+
+=item f_dir
+
+This attribute is used for setting the directory where CSV files are
+opened. Usually you set it in the dbh, it defaults to the current
+directory ("."). However, it is overwritable in the statement handles.
+
+=item f_ext
+
+This attribute is used for setting the file extension where (CSV) files are
+opened. There are several possibilities.
+
+ DBI:CSV:f_dir=data;f_ext=.csv
+
+In this case, DBD::File will open only C<table.csv> if both C<table.csv> and
+C<table> exist in the datadir. The table will still be named C<table>. If
+your datadir has files with extensions, and you do not pass this attribute,
+your table is named C<table.csv>, which is probably not what you wanted. The
+extension is always case-insensitive. The table names are not.
+
+ DBI:CSV:f_dir=data;f_ext=.csv/r
+
+In this case the extension is required, and all filenames that do not match
+are ignored.
+
+=item f_schema
+
+This will set the schema name. Default is the owner of the folder in which
+the table file resides. C<undef> is allowed.
+
+ my $dbh = DBI->connect ("dbi:CSV:", "", "", {
+ f_schema => undef,
+ f_dir => "data",
+ f_ext => ".csv/r",
+ }) or die $DBI::errstr;
+
+The effect is that when you get table names from DBI, you can force all
+tables into the same (or no) schema:
+
+ my @tables $dbh->tables ();
+
+ # no f_schema
+ "merijn".foo
+ "merijn".bar
+
+ # f_schema => "dbi"
+ "dbi".foo
+ "dbi".bar
+
+ # f_schema => undef
+ foo
+ bar
+
+=back
+
+=head2 Driver private methods
+
+=over 4
+
+=item data_sources
+
+The C<data_sources> method returns a list of subdirectories of the current
+directory in the form "DBI:CSV:f_dir=$dirname".
+
+If you want to read the subdirectories of another directory, use
+
+ my ($drh) = DBI->install_driver ("CSV");
+ my (@list) = $drh->data_sources (f_dir => "/usr/local/csv_data" );
+
+=item list_tables
+
+This method returns a list of file names inside $dbh->{f_dir}.
+Example:
+
+ my ($dbh) = DBI->connect ("DBI:CSV:f_dir=/usr/local/csv_data");
+ my (@list) = $dbh->func ("list_tables");
+
+Note that the list includes all files contained in the directory, even
+those that have non-valid table names, from the view of SQL.
+
+=back
+
+=head1 KNOWN BUGS
+
+=over 8
+
+=item *
+
+The module is using flock () internally. However, this function is not
+available on all platforms. Using flock () is disabled on MacOS and
+Windows 95: There's no locking at all (perhaps not so important on
+MacOS and Windows 95, as there's a single user anyways).
+
+=back
+
+=head1 AUTHOR
+
+This module is currently maintained by
+
+H.Merijn Brand < h.m.brand at xs4all.nl > and
+Jens Rehsack < rehsack at googlemail.com >
+
+The original author is Jochen Wiedmann.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2009 by H.Merijn Brand & Jens Rehsack
+Copyright (C) 2004 by Jeff Zucker
+Copyright (C) 1998 by Jochen Wiedmann
+
+All rights reserved.
+
+You may freely distribute and/or modify this module under the terms of
+either the GNU General Public License (GPL) or the Artistic License, as
+specified in the Perl README file.
+
+=head1 SEE ALSO
+
+L<DBI>, L<Text::CSV>, L<Text::CSV_XS>, L<SQL::Statement>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/Gofer.pm b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer.pm
new file mode 100755
index 00000000000..aa78557afe4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer.pm
@@ -0,0 +1,1284 @@
+{
+ package DBD::Gofer;
+
+ use strict;
+
+ require DBI;
+ require DBI::Gofer::Request;
+ require DBI::Gofer::Response;
+ require Carp;
+
+ our $VERSION = sprintf("0.%06d", q$Revision: 11565 $ =~ /(\d+)/o);
+
+# $Id: Gofer.pm 11565 2008-07-22 20:17:33Z timbo $
+#
+# Copyright (c) 2007, Tim Bunce, Ireland
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+
+
+ # attributes we'll allow local STORE
+ our %xxh_local_store_attrib = map { $_=>1 } qw(
+ Active
+ CachedKids
+ Callbacks
+ DbTypeSubclass
+ ErrCount Executed
+ FetchHashKeyName
+ HandleError HandleSetErr
+ InactiveDestroy
+ PrintError PrintWarn
+ Profile
+ RaiseError
+ RootClass
+ ShowErrorStatement
+ Taint TaintIn TaintOut
+ TraceLevel
+ Warn
+ dbi_quote_identifier_cache
+ dbi_connect_closure
+ dbi_go_execute_unique
+ );
+ our %xxh_local_store_attrib_if_same_value = map { $_=>1 } qw(
+ Username
+ dbi_connect_method
+ );
+
+ our $drh = undef; # holds driver handle once initialised
+ our $methods_already_installed;
+
+ sub driver{
+ return $drh if $drh;
+
+ DBI->setup_driver('DBD::Gofer');
+
+ unless ($methods_already_installed++) {
+ my $opts = { O=> 0x0004 }; # IMA_KEEP_ERR
+ DBD::Gofer::db->install_method('go_dbh_method', $opts);
+ DBD::Gofer::st->install_method('go_sth_method', $opts);
+ DBD::Gofer::st->install_method('go_clone_sth', $opts);
+ DBD::Gofer::db->install_method('go_cache', $opts);
+ DBD::Gofer::st->install_method('go_cache', $opts);
+ }
+
+ my($class, $attr) = @_;
+ $class .= "::dr";
+ ($drh) = DBI::_new_drh($class, {
+ 'Name' => 'Gofer',
+ 'Version' => $VERSION,
+ 'Attribution' => 'DBD Gofer by Tim Bunce',
+ });
+
+ $drh;
+ }
+
+
+ sub CLONE {
+ undef $drh;
+ }
+
+
+ sub go_cache {
+ my $h = shift;
+ $h->{go_cache} = shift if @_;
+ # return handle's override go_cache, if it has one
+ return $h->{go_cache} if defined $h->{go_cache};
+ # or else the transports default go_cache
+ return $h->{go_transport}->{go_cache};
+ }
+
+
+ sub set_err_from_response { # set error/warn/info and propagate warnings
+ my $h = shift;
+ my $response = shift;
+ if (my $warnings = $response->warnings) {
+ warn $_ for @$warnings;
+ }
+ return $h->set_err($response->err_errstr_state);
+ }
+
+
+ sub install_methods_proxy {
+ my ($installed_methods) = @_;
+ while ( my ($full_method, $attr) = each %$installed_methods ) {
+ # need to install both a DBI dispatch stub and a proxy stub
+ # (the dispatch stub may be already here due to local driver use)
+
+ DBI->_install_method($full_method, "", $attr||{})
+ unless defined &{$full_method};
+
+ # now install proxy stubs on the driver side
+ $full_method =~ m/^DBI::(\w\w)::(\w+)$/
+ or die "Invalid method name '$full_method' for install_method";
+ my ($type, $method) = ($1, $2);
+ my $driver_method = "DBD::Gofer::${type}::${method}";
+ next if defined &{$driver_method};
+ my $sub;
+ if ($type eq 'db') {
+ $sub = sub { return shift->go_dbh_method(undef, $method, @_) };
+ }
+ else {
+ $sub = sub { shift->set_err($DBI::stderr, "Can't call \$${type}h->$method when using DBD::Gofer"); return; };
+ }
+ no strict 'refs';
+ *$driver_method = $sub;
+ }
+ }
+}
+
+
+{ package DBD::Gofer::dr; # ====== DRIVER ======
+
+ $imp_data_size = 0;
+ use strict;
+
+ sub connect_cached {
+ my ($drh, $dsn, $user, $auth, $attr)= @_;
+ $attr ||= {};
+ return $drh->SUPER::connect_cached($dsn, $user, $auth, {
+ (%$attr),
+ go_connect_method => $attr->{go_connect_method} || 'connect_cached',
+ });
+ }
+
+
+ sub connect {
+ my($drh, $dsn, $user, $auth, $attr)= @_;
+ my $orig_dsn = $dsn;
+
+ # first remove dsn= and everything after it
+ my $remote_dsn = ($dsn =~ s/;?\bdsn=(.*)$// && $1)
+ or return $drh->set_err($DBI::stderr, "No dsn= argument in '$orig_dsn'");
+
+ if ($attr->{go_bypass}) { # don't use DBD::Gofer for this connection
+ # useful for testing with DBI_AUTOPROXY, e.g., t/03handle.t
+ return DBI->connect($remote_dsn, $user, $auth, $attr);
+ }
+
+ my %go_attr;
+ # extract any go_ attributes from the connect() attr arg
+ for my $k (grep { /^go_/ } keys %$attr) {
+ $go_attr{$k} = delete $attr->{$k};
+ }
+ # then override those with any attributes embedded in our dsn (not remote_dsn)
+ for my $kv (grep /=/, split /;/, $dsn, -1) {
+ my ($k, $v) = split /=/, $kv, 2;
+ $go_attr{ "go_$k" } = $v;
+ }
+
+ if (not ref $go_attr{go_policy}) { # if not a policy object already
+ my $policy_class = $go_attr{go_policy} || 'classic';
+ $policy_class = "DBD::Gofer::Policy::$policy_class"
+ unless $policy_class =~ /::/;
+ _load_class($policy_class)
+ or return $drh->set_err($DBI::stderr, "Can't load $policy_class: $@");
+ # replace policy name in %go_attr with policy object
+ $go_attr{go_policy} = eval { $policy_class->new(\%go_attr) }
+ or return $drh->set_err($DBI::stderr, "Can't instanciate $policy_class: $@");
+ }
+ # policy object is left in $go_attr{go_policy} so transport can see it
+ my $go_policy = $go_attr{go_policy};
+
+ if ($go_attr{go_cache} and not ref $go_attr{go_cache}) { # if not a cache object already
+ my $cache_class = $go_attr{go_cache};
+ $cache_class = "DBI::Util::CacheMemory" if $cache_class eq '1';
+ _load_class($cache_class)
+ or return $drh->set_err($DBI::stderr, "Can't load $cache_class $@");
+ $go_attr{go_cache} = eval { $cache_class->new() }
+ or $drh->set_err(0, "Can't instanciate $cache_class: $@"); # warning
+ }
+
+ # delete any other attributes that don't apply to transport
+ my $go_connect_method = delete $go_attr{go_connect_method};
+
+ my $transport_class = delete $go_attr{go_transport}
+ or return $drh->set_err($DBI::stderr, "No transport= argument in '$orig_dsn'");
+ $transport_class = "DBD::Gofer::Transport::$transport_class"
+ unless $transport_class =~ /::/;
+ _load_class($transport_class)
+ or return $drh->set_err($DBI::stderr, "Can't load $transport_class: $@");
+ my $go_transport = eval { $transport_class->new(\%go_attr) }
+ or return $drh->set_err($DBI::stderr, "Can't instanciate $transport_class: $@");
+
+ my $request_class = "DBI::Gofer::Request";
+ my $go_request = eval {
+ my $go_attr = { %$attr };
+ # XXX user/pass of fwd server vs db server ? also impact of autoproxy
+ if ($user) {
+ $go_attr->{Username} = $user;
+ $go_attr->{Password} = $auth;
+ }
+ # delete any attributes we can't serialize (or don't want to)
+ delete @{$go_attr}{qw(Profile HandleError HandleSetErr Callbacks)};
+ # delete any attributes that should only apply to the client-side
+ delete @{$go_attr}{qw(RootClass DbTypeSubclass)};
+
+ $go_connect_method ||= $go_policy->connect_method($remote_dsn, $go_attr) || 'connect';
+ $request_class->new({
+ dbh_connect_call => [ $go_connect_method, $remote_dsn, $user, $auth, $go_attr ],
+ })
+ } or return $drh->set_err($DBI::stderr, "Can't instanciate $request_class: $@");
+
+ my ($dbh, $dbh_inner) = DBI::_new_dbh($drh, {
+ 'Name' => $dsn,
+ 'USER' => $user,
+ go_transport => $go_transport,
+ go_request => $go_request,
+ go_policy => $go_policy,
+ });
+
+ # mark as inactive temporarily for STORE. Active not set until connected() called.
+ $dbh->STORE(Active => 0);
+
+ # should we ping to check the connection
+ # and fetch dbh attributes
+ my $skip_connect_check = $go_policy->skip_connect_check($attr, $dbh);
+ if (not $skip_connect_check) {
+ if (not $dbh->go_dbh_method(undef, 'ping')) {
+ return undef if $dbh->err; # error already recorded, typically
+ return $dbh->set_err($DBI::stderr, "ping failed");
+ }
+ }
+
+ return $dbh;
+ }
+
+ sub _load_class { # return true or false+$@
+ my $class = shift;
+ (my $pm = $class) =~ s{::}{/}g;
+ $pm .= ".pm";
+ return 1 if eval { require $pm };
+ delete $INC{$pm}; # shouldn't be needed (perl bug?) and assigning undef isn't enough
+ undef; # error in $@
+ }
+
+}
+
+
+{ package DBD::Gofer::db; # ====== DATABASE ======
+ $imp_data_size = 0;
+ use strict;
+ use Carp qw(carp croak);
+
+ my %dbh_local_store_attrib = %DBD::Gofer::xxh_local_store_attrib;
+
+ sub connected {
+ shift->STORE(Active => 1);
+ }
+
+ sub go_dbh_method {
+ my $dbh = shift;
+ my $meta = shift;
+ # @_ now contains ($method_name, @args)
+
+ my $request = $dbh->{go_request};
+ $request->init_request([ wantarray, @_ ], $dbh);
+ ++$dbh->{go_request_count};
+
+ my $go_policy = $dbh->{go_policy};
+ my $dbh_attribute_update = $go_policy->dbh_attribute_update();
+ $request->dbh_attributes( $go_policy->dbh_attribute_list() )
+ if $dbh_attribute_update eq 'every'
+ or $dbh->{go_request_count}==1;
+
+ $request->dbh_last_insert_id_args($meta->{go_last_insert_id_args})
+ if $meta->{go_last_insert_id_args};
+
+ my $transport = $dbh->{go_transport}
+ or return $dbh->set_err($DBI::stderr, "Not connected (no transport)");
+
+ local $transport->{go_cache} = $dbh->{go_cache}
+ if defined $dbh->{go_cache};
+
+ my ($response, $retransmit_sub) = $transport->transmit_request($request);
+ $response ||= $transport->receive_response($request, $retransmit_sub);
+ $dbh->{go_response} = $response
+ or die "No response object returned by $transport";
+
+ die "response '$response' returned by $transport is not a response object"
+ unless UNIVERSAL::isa($response,"DBI::Gofer::Response");
+
+ if (my $dbh_attributes = $response->dbh_attributes) {
+
+ # XXX installed_methods piggbacks on dbh_attributes for now
+ if (my $installed_methods = delete $dbh_attributes->{dbi_installed_methods}) {
+ DBD::Gofer::install_methods_proxy($installed_methods)
+ if $dbh->{go_request_count}==1;
+ }
+
+ # XXX we don't STORE here, we just stuff the value into the attribute cache
+ $dbh->{$_} = $dbh_attributes->{$_}
+ for keys %$dbh_attributes;
+ }
+
+ my $rv = $response->rv;
+ if (my $resultset_list = $response->sth_resultsets) {
+ # dbh method call returned one or more resultsets
+ # (was probably a metadata method like table_info)
+ #
+ # setup an sth but don't execute/forward it
+ my $sth = $dbh->prepare(undef, { go_skip_prepare_check => 1 });
+ # set the sth response to our dbh response
+ (tied %$sth)->{go_response} = $response;
+ # setup the sth with the results in our response
+ $sth->more_results;
+ # and return that new sth as if it came from original request
+ $rv = [ $sth ];
+ }
+ elsif (!$rv) { # should only occur for major transport-level error
+ #carp("no rv in response { @{[ %$response ]} }");
+ $rv = [ ];
+ }
+
+ DBD::Gofer::set_err_from_response($dbh, $response);
+
+ return (wantarray) ? @$rv : $rv->[0];
+ }
+
+
+ # Methods that should be forwarded but can be cached
+ for my $method (qw(
+ tables table_info column_info primary_key_info foreign_key_info statistics_info
+ data_sources type_info_all get_info
+ parse_trace_flags parse_trace_flag
+ func
+ )) {
+ my $policy_name = "cache_$method";
+ my $super_name = "SUPER::$method";
+ my $sub = sub {
+ my $dbh = shift;
+ my $rv;
+
+ # if we know the remote side doesn't override the DBI's default method
+ # then we might as well just call the DBI's default method on the client
+ # (which may, in turn, call other methods that are forwarded, like get_info)
+ if ($dbh->{dbi_default_methods}{$method} && $dbh->{go_policy}->skip_default_methods()) {
+ $dbh->trace_msg(" !! $method: using local default as remote method is also default\n");
+ return $dbh->$super_name(@_);
+ }
+
+ my $cache;
+ my $cache_key;
+ if (my $cache_it = $dbh->{go_policy}->$policy_name(undef, $dbh, @_)) {
+ $cache = $dbh->{go_meta_cache} ||= {}; # keep separate from go_cache
+ $cache_key = sprintf "%s_wa%d(%s)", $policy_name, wantarray||0,
+ join(",\t", map { # XXX basic but sufficient for now
+ !ref($_) ? DBI::neat($_,1e6)
+ : ref($_) eq 'ARRAY' ? DBI::neat_list($_,1e6,",\001")
+ : ref($_) eq 'HASH' ? do { my @k = sort keys %$_; DBI::neat_list([@k,@{$_}{@k}],1e6,",\002") }
+ : do { warn "unhandled argument type ($_)"; $_ }
+ } @_);
+ if ($rv = $cache->{$cache_key}) {
+ $dbh->trace_msg("$method(@_) returning previously cached value ($cache_key)\n",4);
+ my @cache_rv = @$rv;
+ # if it's an sth we have to clone it
+ $cache_rv[0] = $cache_rv[0]->go_clone_sth if UNIVERSAL::isa($cache_rv[0],'DBI::st');
+ return (wantarray) ? @cache_rv : $cache_rv[0];
+ }
+ }
+
+ $rv = [ (wantarray)
+ ? ($dbh->go_dbh_method(undef, $method, @_))
+ : scalar $dbh->go_dbh_method(undef, $method, @_)
+ ];
+
+ if ($cache) {
+ $dbh->trace_msg("$method(@_) caching return value ($cache_key)\n",4);
+ my @cache_rv = @$rv;
+ # if it's an sth we have to clone it
+ #$cache_rv[0] = $cache_rv[0]->go_clone_sth
+ # if UNIVERSAL::isa($cache_rv[0],'DBI::st');
+ $cache->{$cache_key} = \@cache_rv
+ unless UNIVERSAL::isa($cache_rv[0],'DBI::st'); # XXX cloning sth not yet done
+ }
+
+ return (wantarray) ? @$rv : $rv->[0];
+ };
+ no strict 'refs';
+ *$method = $sub;
+ }
+
+
+ # Methods that can use the DBI defaults for some situations/drivers
+ for my $method (qw(
+ quote quote_identifier
+ )) { # XXX keep DBD::Gofer::Policy::Base in sync
+ my $policy_name = "locally_$method";
+ my $super_name = "SUPER::$method";
+ my $sub = sub {
+ my $dbh = shift;
+
+ # if we know the remote side doesn't override the DBI's default method
+ # then we might as well just call the DBI's default method on the client
+ # (which may, in turn, call other methods that are forwarded, like get_info)
+ if ($dbh->{dbi_default_methods}{$method} && $dbh->{go_policy}->skip_default_methods()) {
+ $dbh->trace_msg(" !! $method: using local default as remote method is also default\n");
+ return $dbh->$super_name(@_);
+ }
+
+ # false: use remote gofer
+ # 1: use local DBI default method
+ # code ref: use the code ref
+ my $locally = $dbh->{go_policy}->$policy_name($dbh, @_);
+ if ($locally) {
+ return $locally->($dbh, @_) if ref $locally eq 'CODE';
+ return $dbh->$super_name(@_);
+ }
+ return $dbh->go_dbh_method(undef, $method, @_); # propagate context
+ };
+ no strict 'refs';
+ *$method = $sub;
+ }
+
+
+ # Methods that should always fail
+ for my $method (qw(
+ begin_work commit rollback
+ )) {
+ no strict 'refs';
+ *$method = sub { return shift->set_err($DBI::stderr, "$method not available with DBD::Gofer") }
+ }
+
+
+ sub do {
+ my ($dbh, $sql, $attr, @args) = @_;
+ delete $dbh->{Statement}; # avoid "Modification of non-creatable hash value attempted"
+ $dbh->{Statement} = $sql; # for profiling and ShowErrorStatement
+ my $meta = { go_last_insert_id_args => $attr->{go_last_insert_id_args} };
+ return $dbh->go_dbh_method($meta, 'do', $sql, $attr, @args);
+ }
+
+ sub ping {
+ my $dbh = shift;
+ return $dbh->set_err(0, "can't ping while not connected") # warning
+ unless $dbh->SUPER::FETCH('Active');
+ my $skip_ping = $dbh->{go_policy}->skip_ping();
+ return ($skip_ping) ? 1 : $dbh->go_dbh_method(undef, 'ping', @_);
+ }
+
+ sub last_insert_id {
+ my $dbh = shift;
+ my $response = $dbh->{go_response} or return undef;
+ return $response->last_insert_id;
+ }
+
+ sub FETCH {
+ my ($dbh, $attrib) = @_;
+
+ # FETCH is effectively already cached because the DBI checks the
+ # attribute cache in the handle before calling FETCH
+ # and this FETCH copies the value into the attribute cache
+
+ # forward driver-private attributes (except ours)
+ if ($attrib =~ m/^[a-z]/ && $attrib !~ /^go_/) {
+ my $value = $dbh->go_dbh_method(undef, 'FETCH', $attrib);
+ $dbh->{$attrib} = $value; # XXX forces caching by DBI
+ return $dbh->{$attrib} = $value;
+ }
+
+ # else pass up to DBI to handle
+ return $dbh->SUPER::FETCH($attrib);
+ }
+
+ sub STORE {
+ my ($dbh, $attrib, $value) = @_;
+ if ($attrib eq 'AutoCommit') {
+ croak "Can't enable transactions when using DBD::Gofer" if !$value;
+ return $dbh->SUPER::STORE($attrib => ($value) ? -901 : -900);
+ }
+ return $dbh->SUPER::STORE($attrib => $value)
+ # we handle this attribute locally
+ if $dbh_local_store_attrib{$attrib}
+ # or it's a private_ (application) attribute
+ or $attrib =~ /^private_/
+ # or not yet connected (ie being called by DBI->connect)
+ or not $dbh->FETCH('Active');
+
+ return $dbh->SUPER::STORE($attrib => $value)
+ if $DBD::Gofer::xxh_local_store_attrib_if_same_value{$attrib}
+ && do { # values are the same
+ my $crnt = $dbh->FETCH($attrib);
+ local $^W;
+ (defined($value) ^ defined($crnt))
+ ? 0 # definedness differs
+ : $value eq $crnt;
+ };
+
+ # dbh attributes are set at connect-time - see connect()
+ carp("Can't alter \$dbh->{$attrib} after handle created with DBD::Gofer") if $dbh->FETCH('Warn');
+ return $dbh->set_err($DBI::stderr, "Can't alter \$dbh->{$attrib} after handle created with DBD::Gofer");
+ }
+
+ sub disconnect {
+ my $dbh = shift;
+ $dbh->{go_transport} = undef;
+ $dbh->STORE(Active => 0);
+ }
+
+ sub prepare {
+ my ($dbh, $statement, $attr)= @_;
+
+ return $dbh->set_err($DBI::stderr, "Can't prepare when disconnected")
+ unless $dbh->FETCH('Active');
+
+ $attr = { %$attr } if $attr; # copy so we can edit
+
+ my $policy = delete($attr->{go_policy}) || $dbh->{go_policy};
+ my $lii_args = delete $attr->{go_last_insert_id_args};
+ my $go_prepare = delete($attr->{go_prepare_method})
+ || $dbh->{go_prepare_method}
+ || $policy->prepare_method($dbh, $statement, $attr)
+ || 'prepare'; # e.g. for code not using placeholders
+ my $go_cache = delete $attr->{go_cache};
+ # set to undef if there are no attributes left for the actual prepare call
+ $attr = undef if $attr and not %$attr;
+
+ my ($sth, $sth_inner) = DBI::_new_sth($dbh, {
+ Statement => $statement,
+ go_prepare_call => [ 0, $go_prepare, $statement, $attr ],
+ # go_method_calls => [], # autovivs if needed
+ go_request => $dbh->{go_request},
+ go_transport => $dbh->{go_transport},
+ go_policy => $policy,
+ go_last_insert_id_args => $lii_args,
+ go_cache => $go_cache,
+ });
+ $sth->STORE(Active => 0);
+
+ my $skip_prepare_check = $policy->skip_prepare_check($attr, $dbh, $statement, $attr, $sth);
+ if (not $skip_prepare_check) {
+ $sth->go_sth_method() or return undef;
+ }
+
+ return $sth;
+ }
+
+ sub prepare_cached {
+ my ($dbh, $sql, $attr, $if_active)= @_;
+ $attr ||= {};
+ return $dbh->SUPER::prepare_cached($sql, {
+ %$attr,
+ go_prepare_method => $attr->{go_prepare_method} || 'prepare_cached',
+ }, $if_active);
+ }
+
+ *go_cache = \&DBD::Gofer::go_cache;
+}
+
+
+{ package DBD::Gofer::st; # ====== STATEMENT ======
+ $imp_data_size = 0;
+ use strict;
+
+ my %sth_local_store_attrib = (%DBD::Gofer::xxh_local_store_attrib, NUM_OF_FIELDS => 1);
+
+ sub go_sth_method {
+ my ($sth, $meta) = @_;
+
+ if (my $ParamValues = $sth->{ParamValues}) {
+ my $ParamAttr = $sth->{ParamAttr};
+ # XXX the sort here is a hack to work around a DBD::Sybase bug
+ # but only works properly for params 1..9
+ # (reverse because of the unshift)
+ my @params = reverse sort keys %$ParamValues;
+ if (@params > 9 && ($sth->{Database}{go_dsn}||'') =~ /dbi:Sybase/) {
+ # if more than 9 then we need to do a proper numeric sort
+ # also warn to alert user of this issue
+ warn "Sybase param binding order hack in use";
+ @params = sort { $b <=> $a } @params;
+ }
+ for my $p (@params) {
+ # unshift to put binds before execute call
+ unshift @{ $sth->{go_method_calls} },
+ [ 'bind_param', $p, $ParamValues->{$p}, $ParamAttr->{$p} ];
+ }
+ }
+
+ my $dbh = $sth->{Database} or die "panic";
+ ++$dbh->{go_request_count};
+
+ my $request = $sth->{go_request};
+ $request->init_request($sth->{go_prepare_call}, $sth);
+ $request->sth_method_calls(delete $sth->{go_method_calls})
+ if $sth->{go_method_calls};
+ $request->sth_result_attr({}); # (currently) also indicates this is an sth request
+
+ $request->dbh_last_insert_id_args($meta->{go_last_insert_id_args})
+ if $meta->{go_last_insert_id_args};
+
+ my $go_policy = $sth->{go_policy};
+ my $dbh_attribute_update = $go_policy->dbh_attribute_update();
+ $request->dbh_attributes( $go_policy->dbh_attribute_list() )
+ if $dbh_attribute_update eq 'every'
+ or $dbh->{go_request_count}==1;
+
+ my $transport = $sth->{go_transport}
+ or return $sth->set_err($DBI::stderr, "Not connected (no transport)");
+
+ local $transport->{go_cache} = $sth->{go_cache}
+ if defined $sth->{go_cache};
+
+ my ($response, $retransmit_sub) = $transport->transmit_request($request);
+ $response ||= $transport->receive_response($request, $retransmit_sub);
+ $sth->{go_response} = $response
+ or die "No response object returned by $transport";
+ $dbh->{go_response} = $response; # mainly for last_insert_id
+
+ if (my $dbh_attributes = $response->dbh_attributes) {
+ # XXX we don't STORE here, we just stuff the value into the attribute cache
+ $dbh->{$_} = $dbh_attributes->{$_}
+ for keys %$dbh_attributes;
+ # record the values returned, so we know that we have fetched
+ # values are which we have fetched (see dbh->FETCH method)
+ $dbh->{go_dbh_attributes_fetched} = $dbh_attributes;
+ }
+
+ my $rv = $response->rv; # may be undef on error
+ if ($response->sth_resultsets) {
+ # setup first resultset - including sth attributes
+ $sth->more_results;
+ }
+ else {
+ $sth->STORE(Active => 0);
+ $sth->{go_rows} = $rv;
+ }
+ # set error/warn/info (after more_results as that'll clear err)
+ DBD::Gofer::set_err_from_response($sth, $response);
+
+ return $rv;
+ }
+
+
+ sub bind_param {
+ my ($sth, $param, $value, $attr) = @_;
+ $sth->{ParamValues}{$param} = $value;
+ $sth->{ParamAttr}{$param} = $attr
+ if defined $attr; # attr is sticky if not explicitly set
+ return 1;
+ }
+
+
+ sub execute {
+ my $sth = shift;
+ $sth->bind_param($_, $_[$_-1]) for (1..@_);
+ push @{ $sth->{go_method_calls} }, [ 'execute' ];
+ my $meta = { go_last_insert_id_args => $sth->{go_last_insert_id_args} };
+ return $sth->go_sth_method($meta);
+ }
+
+
+ sub more_results {
+ my $sth = shift;
+
+ $sth->finish;
+
+ my $response = $sth->{go_response} or do {
+ # e.g., we haven't sent a request yet (ie prepare then more_results)
+ $sth->trace_msg(" No response object present", 3);
+ return;
+ };
+
+ my $resultset_list = $response->sth_resultsets
+ or return $sth->set_err($DBI::stderr, "No sth_resultsets");
+
+ my $meta = shift @$resultset_list
+ or return undef; # no more result sets
+ #warn "more_results: ".Data::Dumper::Dumper($meta);
+
+ # pull out the special non-atributes first
+ my ($rowset, $err, $errstr, $state)
+ = delete @{$meta}{qw(rowset err errstr state)};
+
+ # copy meta attributes into attribute cache
+ my $NUM_OF_FIELDS = delete $meta->{NUM_OF_FIELDS};
+ $sth->STORE('NUM_OF_FIELDS', $NUM_OF_FIELDS);
+ # XXX need to use STORE for some?
+ $sth->{$_} = $meta->{$_} for keys %$meta;
+
+ if (($NUM_OF_FIELDS||0) > 0) {
+ $sth->{go_rows} = ($rowset) ? @$rowset : -1;
+ $sth->{go_current_rowset} = $rowset;
+ $sth->{go_current_rowset_err} = [ $err, $errstr, $state ]
+ if defined $err;
+ $sth->STORE(Active => 1) if $rowset;
+ }
+
+ return $sth;
+ }
+
+
+ sub go_clone_sth {
+ my ($sth1) = @_;
+ # clone an (un-fetched-from) sth - effectively undoes the initial more_results
+ # not 100% so just for use in caching returned sth e.g. table_info
+ my $sth2 = $sth1->{Database}->prepare($sth1->{Statement}, { go_skip_prepare_check => 1 });
+ $sth2->STORE($_, $sth1->{$_}) for qw(NUM_OF_FIELDS Active);
+ my $sth2_inner = tied %$sth2;
+ $sth2_inner->{$_} = $sth1->{$_} for qw(NUM_OF_PARAMS FetchHashKeyName);
+ die "not fully implemented yet";
+ return $sth2;
+ }
+
+
+ sub fetchrow_arrayref {
+ my ($sth) = @_;
+ my $resultset = $sth->{go_current_rowset} || do {
+ # should only happen if fetch called after execute failed
+ my $rowset_err = $sth->{go_current_rowset_err}
+ || [ 1, 'no result set (did execute fail)' ];
+ return $sth->set_err( @$rowset_err );
+ };
+ return $sth->_set_fbav(shift @$resultset) if @$resultset;
+ $sth->finish; # no more data so finish
+ return undef;
+ }
+ *fetch = \&fetchrow_arrayref; # alias
+
+
+ sub fetchall_arrayref {
+ my ($sth, $slice, $max_rows) = @_;
+ my $resultset = $sth->{go_current_rowset} || do {
+ # should only happen if fetch called after execute failed
+ my $rowset_err = $sth->{go_current_rowset_err}
+ || [ 1, 'no result set (did execute fail)' ];
+ return $sth->set_err( @$rowset_err );
+ };
+ my $mode = ref($slice) || 'ARRAY';
+ return $sth->SUPER::fetchall_arrayref($slice, $max_rows)
+ if ref($slice) or defined $max_rows;
+ $sth->finish; # no more data after this so finish
+ return $resultset;
+ }
+
+
+ sub rows {
+ return shift->{go_rows};
+ }
+
+
+ sub STORE {
+ my ($sth, $attrib, $value) = @_;
+
+ return $sth->SUPER::STORE($attrib => $value)
+ if $sth_local_store_attrib{$attrib} # handle locally
+ # or it's a private_ (application) attribute
+ or $attrib =~ /^private_/;
+
+ # otherwise warn but do it anyway
+ # this will probably need refining later
+ my $msg = "Altering \$sth->{$attrib} won't affect proxied handle";
+ Carp::carp($msg) if $sth->FETCH('Warn');
+
+ # XXX could perhaps do
+ # push @{ $sth->{go_method_calls} }, [ 'STORE', $attrib, $value ]
+ # if not $sth->FETCH('Executed');
+ # but how to handle repeat executions? How to we know when an
+ # attribute is being set to affect the current resultset or the
+ # next execution?
+ # Could just always use go_method_calls I guess.
+
+ # do the store locally anyway, just in case
+ $sth->SUPER::STORE($attrib => $value);
+
+ return $sth->set_err($DBI::stderr, $msg);
+ }
+
+ # sub bind_param_array
+ # we use DBI's default, which sets $sth->{ParamArrays}{$param} = $value
+ # and calls bind_param($param, undef, $attr) if $attr.
+
+ sub execute_array {
+ my $sth = shift;
+ my $attr = shift;
+ $sth->bind_param_array($_, $_[$_-1]) for (1..@_);
+ push @{ $sth->{go_method_calls} }, [ 'execute_array', $attr ];
+ return $sth->go_sth_method($attr);
+ }
+
+ *go_cache = \&DBD::Gofer::go_cache;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBD::Gofer - A stateless-proxy driver for communicating with a remote DBI
+
+=head1 SYNOPSIS
+
+ use DBI;
+
+ $original_dsn = "dbi:..."; # your original DBI Data Source Name
+
+ $dbh = DBI->connect("dbi:Gofer:transport=$transport;...;dsn=$original_dsn",
+ $user, $passwd, \%attributes);
+
+ ... use $dbh as if it was connected to $original_dsn ...
+
+
+The C<transport=$transport> part specifies the name of the module to use to
+transport the requests to the remote DBI. If $transport doesn't contain any
+double colons then it's prefixed with C<DBD::Gofer::Transport::>.
+
+The C<dsn=$original_dsn> part I<must be the last element> of the DSN because
+everything after C<dsn=> is assumed to be the DSN that the remote DBI should
+use.
+
+The C<...> represents attributes that influence the operation of the Gofer
+driver or transport. These are described below or in the documentation of the
+transport module being used.
+
+=head1 DESCRIPTION
+
+DBD::Gofer is a DBI database driver that forwards requests to another DBI
+driver, usually in a seperate process, often on a separate machine. It tries to
+be as transparent as possible so it appears that you are using the remote
+driver directly.
+
+DBD::Gofer is very similar to DBD::Proxy. The major difference is that with
+DBD::Gofer no state is maintained on the remote end. That means every
+request contains all the information needed to create the required state. (So,
+for example, every request includes the DSN to connect to.) Each request can be
+sent to any available server. The server executes the request and returns a
+single response that includes all the data.
+
+This is very similar to the way http works as a stateless protocol for the web.
+Each request from your web browser can be handled by a different web server process.
+
+=head2 Use Cases
+
+This may seem like pointless overhead but there are situations where this is a
+very good thing. Let's consider a specific case.
+
+Imagine using DBD::Gofer with an http transport. Your application calls
+connect(), prepare("select * from table where foo=?"), bind_param(), and execute().
+At this point DBD::Gofer builds a request containing all the information
+about the method calls. It then uses the httpd transport to send that request
+to an apache web server.
+
+This 'dbi execute' web server executes the request (using DBI::Gofer::Execute
+and related modules) and builds a response that contains all the rows of data,
+if the statement returned any, along with all the attributes that describe the
+results, such as $sth->{NAME}. This response is sent back to DBD::Gofer which
+unpacks it and presents it to the application as if it had executed the
+statement itself.
+
+=head2 Advantages
+
+Okay, but you still don't see the point? Well let's consider what we've gained:
+
+=head3 Connection Pooling and Throttling
+
+The 'dbi execute' web server leverages all the functionality of web
+infrastructure in terms of load balancing, high-availability, firewalls, access
+management, proxying, caching.
+
+At its most basic level you get a configurable pool of persistent database connections.
+
+=head3 Simple Scaling
+
+Got thousands of processes all trying to connect to the database? You can use
+DBD::Gofer to connect them to your smaller pool of 'dbi execute' web servers instead.
+
+=head3 Caching
+
+Client-side caching is as simple as adding "C<cache=1>" to the DSN.
+This feature alone can be worth using DBD::Gofer for.
+
+=head3 Fewer Network Round-trips
+
+DBD::Gofer sends as few requests as possible (dependent on the policy being used).
+
+=head3 Thin Clients / Unsupported Platforms
+
+You no longer need drivers for your database on every system. DBD::Gofer is pure perl.
+
+=head1 CONSTRAINTS
+
+There are some natural constraints imposed by the DBD::Gofer 'stateless' approach.
+But not many:
+
+=head2 You can't change database handle attributes after connect()
+
+You can't change database handle attributes after you've connected.
+Use the connect() call to specify all the attribute settings you want.
+
+This is because it's critical that when a request is complete the database
+handle is left in the same state it was when first connected.
+
+An exception is made for attributes with names starting "C<private_>":
+They can be set after connect() but the change is only applied locally.
+
+=head2 You can't change statement handle attributes after prepare()
+
+You can't change statment handle attributes after prepare.
+
+An exception is made for attributes with names starting "C<private_>":
+They can be set after prepare() but the change is only applied locally.
+
+=head2 You can't use transactions
+
+AutoCommit only. Transactions aren't supported.
+
+(In theory transactions could be supported when using a transport that
+maintains a connection, like C<stream> does. If you're interested in this
+please get in touch via dbi-dev@perl.org)
+
+=head2 You can't call driver-private sth methods
+
+But that's rarely needed anyway.
+
+=head1 GENERAL CAVEATS
+
+A few important things to keep in mind when using DBD::Gofer:
+
+=head2 Temporary tables, locks, and other per-connection persistent state
+
+You shouldn't expect any per-session state to persist between requests.
+This includes locks and temporary tables.
+
+Because the server-side may execute your requests via a different
+database connections, you can't rely on any per-connection persistent state,
+such as temporary tables, being available from one request to the next.
+
+This is an easy trap to fall into. A good way to check for this is to test your
+code with a Gofer policy package that sets the C<connect_method> policy to
+'connect' to force a new connection for each request. The C<pedantic> policy does this.
+
+=head2 Driver-private Database Handle Attributes
+
+Some driver-private dbh attributes may not be available if the driver has not
+implemented the private_attribute_info() method (added in DBI 1.54).
+
+=head2 Driver-private Statement Handle Attributes
+
+Driver-private sth attributes can be set in the prepare() call. TODO
+
+Some driver-private dbh attributes may not be available if the driver has not
+implemented the private_attribute_info() method (added in DBI 1.54).
+
+=head2 Multiple Resultsets
+
+Multiple resultsets are supported only if the driver supports the more_results() method
+(an exception is made for DBD::Sybase).
+
+=head2 Statement activity that also updates dbh attributes
+
+Some drivers may update one or more dbh attributes after performing activity on
+a child sth. For example, DBD::mysql provides $dbh->{mysql_insertid} in addition to
+$sth->{mysql_insertid}. Currently mysql_insertid is supported via a hack but a
+more general mechanism is needed for other drivers to use.
+
+=head2 Methods that report an error always return undef
+
+With DBD::Gofer, a method that sets an error always return an undef or empty list.
+That shouldn't be a problem in practice because the DBI doesn't define any
+methods that return meaningful values while also reporting an error.
+
+=head2 Subclassing only applies to client-side
+
+The RootClass and DbTypeSubclass attributes are not passed to the Gofer server.
+
+=head1 CAVEATS FOR SPECIFIC METHODS
+
+=head2 last_insert_id
+
+To enable use of last_insert_id you need to indicate to DBD::Gofer that you'd
+like to use it. You do that my adding a C<go_last_insert_id_args> attribute to
+the do() or prepare() method calls. For example:
+
+ $dbh->do($sql, { go_last_insert_id_args => [...] });
+
+or
+
+ $sth = $dbh->prepare($sql, { go_last_insert_id_args => [...] });
+
+The array reference should contains the args that you want passed to the
+last_insert_id() method.
+
+=head2 execute_for_fetch
+
+The array methods bind_param_array() and execute_array() are supported.
+When execute_array() is called the data is serialized and executed in a single
+round-trip to the Gofer server. This makes it very fast, but requires enough
+memory to store all the serialized data.
+
+The execute_for_fetch() method currently isn't optimised, it uses the DBI
+fallback behaviour of executing each tuple individually.
+(It could be implemented as a wrapper for execute_array() - patches welcome.)
+
+=head1 TRANSPORTS
+
+DBD::Gofer doesn't concern itself with transporting requests and responses to and fro.
+For that it uses special Gofer transport modules.
+
+Gofer transport modules usually come in pairs: one for the 'client' DBD::Gofer
+driver to use and one for the remote 'server' end. They have very similar names:
+
+ DBD::Gofer::Transport::<foo>
+ DBI::Gofer::Transport::<foo>
+
+Sometimes the transports on the DBD and DBI sides may have different names. For
+example DBD::Gofer::Transport::http is typically used with DBI::Gofer::Transport::mod_perl
+(DBD::Gofer::Transport::http and DBI::Gofer::Transport::mod_perl modules are
+part of the GoferTransport-http distribution).
+
+=head2 Bundled Transports
+
+Several transport modules are provided with DBD::Gofer:
+
+=head3 null
+
+The null transport is the simplest of them all. It doesn't actually transport the request anywhere.
+It just serializes (freezes) the request into a string, then thaws it back into
+a data structure before passing it to DBI::Gofer::Execute to execute. The same
+freeze and thaw is applied to the results.
+
+The null transport is the best way to test if your application will work with Gofer.
+Just set the DBI_AUTOPROXY environment variable to "C<dbi:Gofer:transport=null;policy=pedantic>"
+(see L</Using DBI_AUTOPROXY> below) and run your application, or ideally its test suite, as usual.
+
+It doesn't take any parameters.
+
+=head3 pipeone
+
+The pipeone transport launches a subprocess for each request. It passes in the
+request and reads the response.
+
+The fact that a new subprocess is started for each request ensures that the
+server side is truly stateless. While this does make the transport I<very> slow,
+it is useful as a way to test that your application doesn't depend on
+per-connection state, such as temporary tables, persisting between requests.
+
+It's also useful both as a proof of concept and as a base class for the stream
+driver.
+
+=head3 stream
+
+The stream driver also launches a subprocess and writes requests and reads
+responses, like the pipeone transport. In this case, however, the subprocess
+is expected to handle more that one request. (Though it will be automitically
+restarted if it exits.)
+
+This is the first transport that is truly useful because it can launch the
+subprocess on a remote machine using C<ssh>. This means you can now use DBD::Gofer
+to easily access any databases that's accessible from any system you can login to.
+You also get all the benefits of ssh, including encryption and optional compression.
+
+See L</Using DBI_AUTOPROXY> below for an example.
+
+=head2 Other Transports
+
+Implementing a Gofer transport is I<very> simple, and more transports are very welcome.
+Just take a look at any existing transports that are similar to your needs.
+
+=head3 http
+
+See the GoferTransport-http distribution on CPAN: http://search.cpan.org/dist/GoferTransport-http/
+
+=head3 Gearman
+
+I know Ask Bjørn Hansen has implemented a transport for the C<gearman> distributed
+job system, though it's not on CPAN at the time of writing this.
+
+=head1 CONNECTING
+
+Simply prefix your existing DSN with "C<dbi:Gofer:transport=$transport;dsn=>"
+where $transport is the name of the Gofer transport you want to use (see L</TRANSPORTS>).
+The C<transport> and C<dsn> attributes must be specified and the C<dsn> attributes must be last.
+
+Other attributes can be specified in the DSN to configure DBD::Gofer and/or the
+Gofer transport module being used. The main attributes after C<transport>, are
+C<url> and C<policy>. These and other attributes are described below.
+
+=head2 Using DBI_AUTOPROXY
+
+The simplest way to try out DBD::Gofer is to set the DBI_AUTOPROXY environment variable.
+In this case you don't include the C<dsn=> part. For example:
+
+ export DBI_AUTOPROXY="dbi:Gofer:transport=null"
+
+or, for a more useful example, try:
+
+ export DBI_AUTOPROXY="dbi:Gofer:transport=stream;url=ssh:user@example.com"
+
+=head2 Connection Attributes
+
+These attributes can be specified in the DSN. They can also be passed in the
+\%attr parameter of the DBI connect method by adding a "C<go_>" prefix to the name.
+
+=head3 transport
+
+Specifies the Gofer transport class to use. Required. See L</TRANSPORTS> above.
+
+If the value does not include C<::> then "C<DBD::Gofer::Transport::>" is prefixed.
+
+The transport object can be accessed via $h->{go_transport}.
+
+=head3 dsn
+
+Specifies the DSN for the remote side to connect to. Required, and must be last.
+
+=head3 url
+
+Used to tell the transport where to connect to. The exact form of the value depends on the transport used.
+
+=head3 policy
+
+Specifies the policy to use. See L</CONFIGURING BEHAVIOUR POLICY>.
+
+If the value does not include C<::> then "C<DBD::Gofer::Policy>" is prefixed.
+
+The policy object can be accessed via $h->{go_policy}.
+
+=head3 timeout
+
+Specifies a timeout, in seconds, to use when waiting for responses from the server side.
+
+=head3 retry_limit
+
+Specifies the number of times a failed request will be retried. Default is 0.
+
+=head3 retry_hook
+
+Specifies a code reference to be called to decide if a failed request should be retried.
+The code reference is called like this:
+
+ $transport = $h->{go_transport};
+ $retry = $transport->go_retry_hook->($request, $response, $transport);
+
+If it returns true then the request will be retried, upto the C<retry_limit>.
+If it returns a false but defined value then the request will not be retried.
+If it returns undef then the default behaviour will be used, as if C<retry_hook>
+had not been specified.
+
+The default behaviour is to retry requests where $request->is_idempotent is true,
+or the error message matches C</induced by DBI_GOFER_RANDOM/>.
+
+=head3 cache
+
+Specifies that client-side caching should be performed. The value is the name
+of a cache class to use.
+
+Any class implementing get($key) and set($key, $value) methods can be used.
+That includes a great many powerful caching classes on CPAN, including the
+Cache and Cache::Cache distributions.
+
+You can use "C<cache=1>" is a shortcut for "C<cache=DBI::Util::CacheMemory>".
+See L<DBI::Util::CacheMemory> for a description of this simple fast default cache.
+
+The cache object can be accessed via $h->go_cache. For example:
+
+ $dbh->go_cache->clear; # free up memory being used by the cache
+
+The cache keys are the frozen (serialized) requests, and the values are the
+frozen responses.
+
+The default behaviour is to only use the cache for requests where
+$request->is_idempotent is true (i.e., the dbh has the ReadOnly attribute set
+or the SQL statement is obviously a SELECT without a FOR UPDATE clause.)
+
+For even more control you can use the C<go_cache> attribute to pass in an
+instanciated cache object. Individual methods, including prepare(), can also
+specify alternative caches via the C<go_cache> attribute. For example, to
+specify no caching for a particular query, you could use
+
+ $sth = $dbh->prepare( $sql, { go_cache => 0 } );
+
+This can be used to implement different caching policies for different statements.
+
+It's interesting to note that DBD::Gofer can be used to add client-side caching
+to any (gofer compatible) application, with no code changes and no need for a
+gofer server. Just set the DBI_AUTOPROXY environment variable like this:
+
+ DBI_AUTOPROXY='dbi:Gofer:transport=null;cache=1'
+
+=head1 CONFIGURING BEHAVIOUR POLICY
+
+DBD::Gofer supports a 'policy' mechanism that allows you to fine-tune the number of round-trips to the Gofer server.
+The policies are grouped into classes (which may be subclassed) and referenced by the name of the class.
+
+The L<DBD::Gofer::Policy::Base> class is the base class for all the policy
+packages and describes all the available policies.
+
+Three policy packages are supplied with DBD::Gofer:
+
+L<DBD::Gofer::Policy::pedantic> is most 'transparent' but slowest because it
+makes more round-trips to the Gofer server.
+
+L<DBD::Gofer::Policy::classic> is a reasonable compromise - it's the default policy.
+
+L<DBD::Gofer::Policy::rush> is fastest, but may require code changes in your applications.
+
+Generally the default C<classic> policy is fine. When first testing an existing
+application with Gofer it is a good idea to start with the C<pedantic> policy
+first and then switch to C<classic> or a custom policy, for final testing.
+
+
+=head1 AUTHOR
+
+Tim Bunce, L<http://www.tim.bunce.name>
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2007, Tim Bunce, Ireland. All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See L<perlartistic>.
+
+=head1 ACKNOWLEDGEMENTS
+
+The development of DBD::Gofer and related modules was sponsored by
+Shopzilla.com (L<http://Shopzilla.com>), where I currently work.
+
+=head1 SEE ALSO
+
+L<DBI::Gofer::Request>, L<DBI::Gofer::Response>, L<DBI::Gofer::Execute>.
+
+L<DBI::Gofer::Transport::Base>, L<DBD::Gofer::Policy::Base>.
+
+L<DBI>
+
+=head1 Caveats for specific drivers
+
+This section aims to record issues to be aware of when using Gofer with specific drivers.
+It usually only documents issues that are not natural consequences of the limitations
+of the Gofer approach - as documented avove.
+
+=head1 TODO
+
+This is just a random brain dump... (There's more in the source of the Changes file, not the pod)
+
+Document policy mechanism
+
+Add mechanism for transports to list config params and for Gofer to apply any that match (and warn if any left over?)
+
+Driver-private sth attributes - set via prepare() - change DBI spec
+
+add hooks into transport base class for checking & updating a result set cache
+ ie via a standard cache interface such as:
+ http://search.cpan.org/~robm/Cache-FastMmap/FastMmap.pm
+ http://search.cpan.org/~bradfitz/Cache-Memcached/lib/Cache/Memcached.pm
+ http://search.cpan.org/~dclinton/Cache-Cache/
+ http://search.cpan.org/~cleishman/Cache/
+Also caching instructions could be passed through the httpd transport layer
+in such a way that appropriate http cache headers are added to the results
+so that web caches (squid etc) could be used to implement the caching.
+(MUST require the use of GET rather than POST requests.)
+
+Rework handling of installed_methods to not piggback on dbh_attributes?
+
+Perhaps support transactions for transports where it's possible (ie null and stream)?
+Would make stream transport (ie ssh) more useful to more people.
+
+Make sth_result_attr more like dbh_attributes (using '*' etc)
+
+Add @val = FETCH_many(@names) to DBI in C and use in Gofer/Execute?
+
+Implement _new_sth in C.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/Base.pm b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/Base.pm
new file mode 100755
index 00000000000..1725b0316ad
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/Base.pm
@@ -0,0 +1,162 @@
+package DBD::Gofer::Policy::Base;
+
+# $Id: Base.pm 10087 2007-10-16 12:42:37Z timbo $
+#
+# Copyright (c) 2007, Tim Bunce, Ireland
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+use strict;
+use warnings;
+use Carp;
+
+our $VERSION = sprintf("0.%06d", q$Revision: 10087 $ =~ /(\d+)/o);
+our $AUTOLOAD;
+
+my %policy_defaults = (
+ # force connect method (unless overridden by go_connect_method=>'...' attribute)
+ # if false: call same method on client as on server
+ connect_method => 'connect',
+ # force prepare method (unless overridden by go_prepare_method=>'...' attribute)
+ # if false: call same method on client as on server
+ prepare_method => 'prepare',
+ skip_connect_check => 0,
+ skip_default_methods => 0,
+ skip_prepare_check => 0,
+ skip_ping => 0,
+ dbh_attribute_update => 'every',
+ dbh_attribute_list => ['*'],
+ locally_quote => 0,
+ locally_quote_identifier => 0,
+ cache_parse_trace_flags => 1,
+ cache_parse_trace_flag => 1,
+ cache_data_sources => 1,
+ cache_type_info_all => 1,
+ cache_tables => 0,
+ cache_table_info => 0,
+ cache_column_info => 0,
+ cache_primary_key_info => 0,
+ cache_foreign_key_info => 0,
+ cache_statistics_info => 0,
+ cache_get_info => 0,
+ cache_func => 0,
+);
+
+my $base_policy_file = $INC{"DBD/Gofer/Policy/Base.pm"};
+
+__PACKAGE__->create_policy_subs(\%policy_defaults);
+
+sub create_policy_subs {
+ my ($class, $policy_defaults) = @_;
+
+ while ( my ($policy_name, $policy_default) = each %$policy_defaults) {
+ my $policy_attr_name = "go_$policy_name";
+ my $sub = sub {
+ # $policy->foo($attr, ...)
+ #carp "$policy_name($_[1],...)";
+ # return the policy default value unless an attribute overrides it
+ return (ref $_[1] && exists $_[1]->{$policy_attr_name})
+ ? $_[1]->{$policy_attr_name}
+ : $policy_default;
+ };
+ no strict 'refs';
+ *{$class . '::' . $policy_name} = $sub;
+ }
+}
+
+sub AUTOLOAD {
+ carp "Unknown policy name $AUTOLOAD used";
+ # only warn once
+ no strict 'refs';
+ *$AUTOLOAD = sub { undef };
+ return undef;
+}
+
+sub new {
+ my ($class, $args) = @_;
+ my $policy = {};
+ bless $policy, $class;
+}
+
+sub DESTROY { };
+
+1;
+
+=head1 NAME
+
+DBD::Gofer::Policy::Base - Base class for DBD::Gofer policies
+
+=head1 SYNOPSIS
+
+ $dbh = DBI->connect("dbi:Gofer:transport=...;policy=...", ...)
+
+=head1 DESCRIPTION
+
+DBD::Gofer can be configured via a 'policy' mechanism that allows you to
+fine-tune the number of round-trips to the Gofer server. The policies are
+grouped into classes (which may be subclassed) and referenced by the name of
+the class.
+
+The L<DBD::Gofer::Policy::Base> class is the base class for all the policy
+classes and describes all the individual policy items.
+
+The Base policy is not used directly. You should use a policy class derived from it.
+
+=head1 POLICY CLASSES
+
+Three policy classes are supplied with DBD::Gofer:
+
+L<DBD::Gofer::Policy::pedantic> is most 'transparent' but slowest because it
+makes more round-trips to the Gofer server.
+
+L<DBD::Gofer::Policy::classic> is a reasonable compromise - it's the default policy.
+
+L<DBD::Gofer::Policy::rush> is fastest, but may require code changes in your applications.
+
+Generally the default C<classic> policy is fine. When first testing an existing
+application with Gofer it is a good idea to start with the C<pedantic> policy
+first and then switch to C<classic> or a custom policy, for final testing.
+
+=head1 POLICY ITEMS
+
+These are temporary docs: See the source code for list of policies and their defaults.
+
+In a future version the policies and their defaults will be defined in the pod and parsed out at load-time.
+
+See the source code to this module for more details.
+
+=head1 POLICY CUSTOMIZATION
+
+XXX This area of DBD::Gofer is subject to change.
+
+There are three ways to customize policies:
+
+Policy classes are designed to influence the overall behaviour of DBD::Gofer
+with existing, unaltered programs, so they work in a reasonably optimal way
+without requiring code changes. You can implement new policy classes as
+subclasses of existing policies.
+
+In many cases individual policy items can be overridden on a case-by-case basis
+within your application code. You do this by passing a corresponding
+C<<go_<policy_name>>> attribute into DBI methods by your application code.
+This let's you fine-tune the behaviour for special cases.
+
+The policy items are implemented as methods. In many cases the methods are
+passed parameters relating to the DBD::Gofer code being executed. This means
+the policy can implement dynamic behaviour that varies depending on the
+particular circumstances, such as the particular statement being executed.
+
+=head1 AUTHOR
+
+Tim Bunce, L<http://www.tim.bunce.name>
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2007, Tim Bunce, Ireland. All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See L<perlartistic>.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/classic.pm b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/classic.pm
new file mode 100755
index 00000000000..8f828f0ddba
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/classic.pm
@@ -0,0 +1,79 @@
+package DBD::Gofer::Policy::classic;
+
+# $Id: classic.pm 10087 2007-10-16 12:42:37Z timbo $
+#
+# Copyright (c) 2007, Tim Bunce, Ireland
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+use strict;
+use warnings;
+
+our $VERSION = sprintf("0.%06d", q$Revision: 10087 $ =~ /(\d+)/o);
+
+use base qw(DBD::Gofer::Policy::Base);
+
+__PACKAGE__->create_policy_subs({
+
+ # always use connect_cached on server
+ connect_method => 'connect_cached',
+
+ # use same methods on server as is called on client
+ prepare_method => '',
+
+ # don't skip the connect check since that also sets dbh attributes
+ # although this makes connect more expensive, that's partly offset
+ # by skip_ping=>1 below, which makes connect_cached very fast.
+ skip_connect_check => 0,
+
+ # most code doesn't rely on sth attributes being set after prepare
+ skip_prepare_check => 1,
+
+ # we're happy to use local method if that's the same as the remote
+ skip_default_methods => 1,
+
+ # ping is not important for DBD::Gofer and most transports
+ skip_ping => 1,
+
+ # only update dbh attributes on first contact with server
+ dbh_attribute_update => 'first',
+
+ # we'd like to set locally_* but can't because drivers differ
+
+ # get_info results usually don't change
+ cache_get_info => 1,
+});
+
+
+1;
+
+=head1 NAME
+
+DBD::Gofer::Policy::classic - The 'classic' policy for DBD::Gofer
+
+=head1 SYNOPSIS
+
+ $dbh = DBI->connect("dbi:Gofer:transport=...;policy=classic", ...)
+
+The C<classic> policy is the default DBD::Gofer policy, so need not be included in the DSN.
+
+=head1 DESCRIPTION
+
+Temporary docs: See the source code for list of policies and their defaults.
+
+In a future version the policies and their defaults will be defined in the pod and parsed out at load-time.
+
+=head1 AUTHOR
+
+Tim Bunce, L<http://www.tim.bunce.name>
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2007, Tim Bunce, Ireland. All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See L<perlartistic>.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/pedantic.pm b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/pedantic.pm
new file mode 100755
index 00000000000..6829beafe3d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/pedantic.pm
@@ -0,0 +1,53 @@
+package DBD::Gofer::Policy::pedantic;
+
+# $Id: pedantic.pm 10087 2007-10-16 12:42:37Z timbo $
+#
+# Copyright (c) 2007, Tim Bunce, Ireland
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+use strict;
+use warnings;
+
+our $VERSION = sprintf("0.%06d", q$Revision: 10087 $ =~ /(\d+)/o);
+
+use base qw(DBD::Gofer::Policy::Base);
+
+# the 'pedantic' policy is the same as the Base policy
+
+1;
+
+=head1 NAME
+
+DBD::Gofer::Policy::pedantic - The 'pedantic' policy for DBD::Gofer
+
+=head1 SYNOPSIS
+
+ $dbh = DBI->connect("dbi:Gofer:transport=...;policy=pedantic", ...)
+
+=head1 DESCRIPTION
+
+The C<pedantic> policy tries to be as transparent as possible. To do this it
+makes round-trips to the server for almost every DBI method call.
+
+This is the best policy to use when first testing existing code with Gofer.
+Once it's working well you should consider moving to the C<classic> policy or defining your own policy class.
+
+Temporary docs: See the source code for list of policies and their defaults.
+
+In a future version the policies and their defaults will be defined in the pod and parsed out at load-time.
+
+=head1 AUTHOR
+
+Tim Bunce, L<http://www.tim.bunce.name>
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2007, Tim Bunce, Ireland. All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See L<perlartistic>.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/rush.pm b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/rush.pm
new file mode 100755
index 00000000000..9cfd5826829
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Policy/rush.pm
@@ -0,0 +1,90 @@
+package DBD::Gofer::Policy::rush;
+
+# $Id: rush.pm 10087 2007-10-16 12:42:37Z timbo $
+#
+# Copyright (c) 2007, Tim Bunce, Ireland
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+use strict;
+use warnings;
+
+our $VERSION = sprintf("0.%06d", q$Revision: 10087 $ =~ /(\d+)/o);
+
+use base qw(DBD::Gofer::Policy::Base);
+
+__PACKAGE__->create_policy_subs({
+
+ # always use connect_cached on server
+ connect_method => 'connect_cached',
+
+ # use same methods on server as is called on client
+ # (because code not using placeholders would bloat the sth cache)
+ prepare_method => '',
+
+ # Skipping the connect check is fast, but it also skips
+ # fetching the remote dbh attributes!
+ # Make sure that your application doesn't need access to dbh attributes.
+ skip_connect_check => 1,
+
+ # most code doesn't rely on sth attributes being set after prepare
+ skip_prepare_check => 1,
+
+ # we're happy to use local method if that's the same as the remote
+ skip_default_methods => 1,
+
+ # ping is almost meaningless for DBD::Gofer and most transports anyway
+ skip_ping => 1,
+
+ # don't update dbh attributes at all
+ # XXX actually we currently need dbh_attribute_update for skip_default_methods to work
+ # and skip_default_methods is more valuable to us than the cost of dbh_attribute_update
+ dbh_attribute_update => 'none', # actually means 'first' currently
+ #dbh_attribute_list => undef,
+
+ # we'd like to set locally_* but can't because drivers differ
+
+ # in a rush assume metadata doesn't change
+ cache_tables => 1,
+ cache_table_info => 1,
+ cache_column_info => 1,
+ cache_primary_key_info => 1,
+ cache_foreign_key_info => 1,
+ cache_statistics_info => 1,
+ cache_get_info => 1,
+});
+
+
+1;
+
+=head1 NAME
+
+DBD::Gofer::Policy::rush - The 'rush' policy for DBD::Gofer
+
+=head1 SYNOPSIS
+
+ $dbh = DBI->connect("dbi:Gofer:transport=...;policy=rush", ...)
+
+=head1 DESCRIPTION
+
+The C<rush> policy tries to make as few round-trips as possible.
+It's the opposite end of the policy spectrum to the C<pedantic> policy.
+
+Temporary docs: See the source code for list of policies and their defaults.
+
+In a future version the policies and their defaults will be defined in the pod and parsed out at load-time.
+
+=head1 AUTHOR
+
+Tim Bunce, L<http://www.tim.bunce.name>
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2007, Tim Bunce, Ireland. All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See L<perlartistic>.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/Base.pm b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/Base.pm
new file mode 100755
index 00000000000..fa9a24b727f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/Base.pm
@@ -0,0 +1,410 @@
+package DBD::Gofer::Transport::Base;
+
+# $Id: Base.pm 12536 2009-02-24 22:37:09Z timbo $
+#
+# Copyright (c) 2007, Tim Bunce, Ireland
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+use strict;
+use warnings;
+
+use base qw(DBI::Gofer::Transport::Base);
+
+our $VERSION = sprintf("0.%06d", q$Revision: 12536 $ =~ /(\d+)/o);
+
+__PACKAGE__->mk_accessors(qw(
+ trace
+ go_dsn
+ go_url
+ go_policy
+ go_timeout
+ go_retry_hook
+ go_retry_limit
+ go_cache
+ cache_hit
+ cache_miss
+ cache_store
+));
+__PACKAGE__->mk_accessors_using(make_accessor_autoviv_hashref => qw(
+ meta
+));
+
+
+sub new {
+ my ($class, $args) = @_;
+ $args->{$_} = 0 for (qw(cache_hit cache_miss cache_store));
+ $args->{keep_meta_frozen} ||= 1 if $args->{go_cache};
+ #warn "args @{[ %$args ]}\n";
+ return $class->SUPER::new($args);
+}
+
+
+sub _init_trace { $ENV{DBD_GOFER_TRACE} || 0 }
+
+
+sub new_response {
+ my $self = shift;
+ return DBI::Gofer::Response->new(@_);
+}
+
+
+sub transmit_request {
+ my ($self, $request) = @_;
+ my $trace = $self->trace;
+ my $response;
+
+ my ($go_cache, $request_cache_key);
+ if ($go_cache = $self->{go_cache}) {
+ $request_cache_key
+ = $request->{meta}{request_cache_key}
+ = $self->get_cache_key_for_request($request);
+ if ($request_cache_key) {
+ my $frozen_response = eval { $go_cache->get($request_cache_key) };
+ if ($frozen_response) {
+ $self->_dump("cached response found for ".ref($request), $request)
+ if $trace;
+ $response = $self->thaw_response($frozen_response);
+ $self->trace_msg("transmit_request is returning a response from cache $go_cache\n")
+ if $trace;
+ ++$self->{cache_hit};
+ return $response;
+ }
+ warn $@ if $@;
+ ++$self->{cache_miss};
+ $self->trace_msg("transmit_request cache miss\n")
+ if $trace;
+ }
+ }
+
+ my $to = $self->go_timeout;
+ my $transmit_sub = sub {
+ $self->trace_msg("transmit_request\n") if $trace;
+ local $SIG{ALRM} = sub { die "TIMEOUT\n" } if $to;
+
+ my $response = eval {
+ local $SIG{PIPE} = sub {
+ my $extra = ($! eq "Broken pipe") ? "" : " ($!)";
+ die "Unable to send request: Broken pipe$extra\n";
+ };
+ alarm($to) if $to;
+ $self->transmit_request_by_transport($request);
+ };
+ alarm(0) if $to;
+
+ if ($@) {
+ return $self->transport_timedout("transmit_request", $to)
+ if $@ eq "TIMEOUT\n";
+ return $self->new_response({ err => 1, errstr => $@ });
+ }
+
+ return $response;
+ };
+
+ $response = $self->_transmit_request_with_retries($request, $transmit_sub);
+
+ if ($response) {
+ my $frozen_response = delete $response->{meta}{frozen};
+ $self->_store_response_in_cache($frozen_response, $request_cache_key)
+ if $request_cache_key;
+ }
+
+ $self->trace_msg("transmit_request is returning a response itself\n")
+ if $trace && $response;
+
+ return $response unless wantarray;
+ return ($response, $transmit_sub);
+}
+
+
+sub _transmit_request_with_retries {
+ my ($self, $request, $transmit_sub) = @_;
+ my $response;
+ do {
+ $response = $transmit_sub->();
+ } while ( $response && $self->response_needs_retransmit($request, $response) );
+ return $response;
+}
+
+
+sub receive_response {
+ my ($self, $request, $retransmit_sub) = @_;
+ my $to = $self->go_timeout;
+
+ my $receive_sub = sub {
+ $self->trace_msg("receive_response\n");
+ local $SIG{ALRM} = sub { die "TIMEOUT\n" } if $to;
+
+ my $response = eval {
+ alarm($to) if $to;
+ $self->receive_response_by_transport($request);
+ };
+ alarm(0) if $to;
+
+ if ($@) {
+ return $self->transport_timedout("receive_response", $to)
+ if $@ eq "TIMEOUT\n";
+ return $self->new_response({ err => 1, errstr => $@ });
+ }
+ return $response;
+ };
+
+ my $response;
+ do {
+ $response = $receive_sub->();
+ if ($self->response_needs_retransmit($request, $response)) {
+ $response = $self->_transmit_request_with_retries($request, $retransmit_sub);
+ $response ||= $receive_sub->();
+ }
+ } while ( $self->response_needs_retransmit($request, $response) );
+
+ if ($response) {
+ my $frozen_response = delete $response->{meta}{frozen};
+ my $request_cache_key = $request->{meta}{request_cache_key};
+ $self->_store_response_in_cache($frozen_response, $request_cache_key)
+ if $request_cache_key && $self->{go_cache};
+ }
+
+ return $response;
+}
+
+
+sub response_retry_preference {
+ my ($self, $request, $response) = @_;
+
+ # give the user a chance to express a preference (or undef for default)
+ if (my $go_retry_hook = $self->go_retry_hook) {
+ my $retry = $go_retry_hook->($request, $response, $self);
+ $self->trace_msg(sprintf "go_retry_hook returned %s\n",
+ (defined $retry) ? $retry : 'undef');
+ return $retry if defined $retry;
+ }
+
+ # This is the main decision point. We don't retry requests that got
+ # as far as executing because the error is probably from the database
+ # (not transport) so retrying is unlikely to help. But note that any
+ # severe transport error occuring after execute is likely to return
+ # a new response object that doesn't have the execute flag set. Beware!
+ return 0 if $response->executed_flag_set;
+
+ return 1 if ($response->errstr || '') =~ m/induced by DBI_GOFER_RANDOM/;
+
+ return 1 if $request->is_idempotent; # i.e. is SELECT or ReadOnly was set
+
+ return undef; # we couldn't make up our mind
+}
+
+
+sub response_needs_retransmit {
+ my ($self, $request, $response) = @_;
+
+ my $err = $response->err
+ or return 0; # nothing went wrong
+
+ my $retry = $self->response_retry_preference($request, $response);
+
+ if (!$retry) { # false or undef
+ $self->trace_msg("response_needs_retransmit: response not suitable for retry\n");
+ return 0;
+ }
+
+ # we'd like to retry but have we retried too much already?
+
+ my $retry_limit = $self->go_retry_limit;
+ if (!$retry_limit) {
+ $self->trace_msg("response_needs_retransmit: retries disabled (retry_limit not set)\n");
+ return 0;
+ }
+
+ my $request_meta = $request->meta;
+ my $retry_count = $request_meta->{retry_count} || 0;
+ if ($retry_count >= $retry_limit) {
+ $self->trace_msg("response_needs_retransmit: $retry_count is too many retries\n");
+ # XXX should be possible to disable altering the err
+ $response->errstr(sprintf "%s (after %d retries by gofer)", $response->errstr, $retry_count);
+ return 0;
+ }
+
+ # will retry now, do the admin
+ ++$retry_count;
+ $self->trace_msg("response_needs_retransmit: retry $retry_count\n");
+
+ # hook so response_retry_preference can defer some code execution
+ # until we've checked retry_count and retry_limit.
+ if (ref $retry eq 'CODE') {
+ $retry->($retry_count, $retry_limit)
+ and warn "should return false"; # protect future use
+ }
+
+ ++$request_meta->{retry_count}; # update count for this request object
+ ++$self->meta->{request_retry_count}; # update cumulative transport stats
+
+ return 1;
+}
+
+
+sub transport_timedout {
+ my ($self, $method, $timeout) = @_;
+ $timeout ||= $self->go_timeout;
+ return $self->new_response({ err => 1, errstr => "DBD::Gofer $method timed-out after $timeout seconds" });
+}
+
+
+# return undef if we don't want to cache this request
+# subclasses may use more specialized rules
+sub get_cache_key_for_request {
+ my ($self, $request) = @_;
+
+ # we only want to cache idempotent requests
+ # is_idempotent() is true if GOf_REQUEST_IDEMPOTENT or GOf_REQUEST_READONLY set
+ return undef if not $request->is_idempotent;
+
+ # XXX would be nice to avoid the extra freeze here
+ my $key = $self->freeze_request($request, undef, 1);
+
+ #use Digest::MD5; warn "get_cache_key_for_request: ".Digest::MD5::md5_base64($key)."\n";
+
+ return $key;
+}
+
+
+sub _store_response_in_cache {
+ my ($self, $frozen_response, $request_cache_key) = @_;
+ my $go_cache = $self->{go_cache}
+ or return;
+
+ # new() ensures that enabling go_cache also enables keep_meta_frozen
+ warn "No meta frozen in response" if !$frozen_response;
+ warn "No request_cache_key" if !$request_cache_key;
+
+ if ($frozen_response && $request_cache_key) {
+ $self->trace_msg("receive_response added response to cache $go_cache\n");
+ eval { $go_cache->set($request_cache_key, $frozen_response) };
+ warn $@ if $@;
+ ++$self->{cache_store};
+ }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBD::Gofer::Transport::Base - base class for DBD::Gofer client transports
+
+=head1 SYNOPSIS
+
+ my $remote_dsn = "..."
+ DBI->connect("dbi:Gofer:transport=...;url=...;timeout=...;retry_limit=...;dsn=$remote_dsn",...)
+
+or, enable by setting the DBI_AUTOPROXY environment variable:
+
+ export DBI_AUTOPROXY='dbi:Gofer:transport=...;url=...'
+
+which will force I<all> DBI connections to be made via that Gofer server.
+
+=head1 DESCRIPTION
+
+This is the base class for all DBD::Gofer client transports.
+
+=head1 ATTRIBUTES
+
+Gofer transport attributes can be specified either in the attributes parameter
+of the connect() method call, or in the DSN string. When used in the DSN
+string, attribute names don't have the C<go_> prefix.
+
+=head2 go_dsn
+
+The full DBI DSN that the Gofer server should connect to on your behalf.
+
+When used in the DSN it must be the last element in the DSN string.
+
+=head2 go_timeout
+
+A time limit for sending a request and receiving a response. Some drivers may
+implement sending and receiving as separate steps, in which case (currently)
+the timeout applies to each separately.
+
+If a request needs to be resent then the timeout is restarted for each sending
+of a request and receiving of a response.
+
+=head2 go_retry_limit
+
+The maximum number of times an request may be retried. The default is 2.
+
+=head2 go_retry_hook
+
+This subroutine reference is called, if defined, for each response received where $response->err is true.
+
+The subroutine is pass three parameters: the request object, the response object, and the transport object.
+
+If it returns an undefined value then the default retry behaviour is used. See L</RETRY ON ERROR> below.
+
+If it returns a defined but false value then the request is not resent.
+
+If it returns true value then the request is resent, so long as the number of retries does not exceed C<go_retry_limit>.
+
+=head1 RETRY ON ERROR
+
+The default retry on error behaviour is:
+
+ - Retry if the error was due to DBI_GOFER_RANDOM. See L<DBI::Gofer::Execute>.
+
+ - Retry if $request->is_idempotent returns true. See L<DBI::Gofer::Request>.
+
+A retry won't be allowed if the number of previous retries has reached C<go_retry_limit>.
+
+=head1 TRACING
+
+Tracing of gofer requests and reponses can be enabled by setting the
+C<DBD_GOFER_TRACE> environment variable. A value of 1 gives a reasonably
+compact summary of each request and response. A value of 2 or more gives a
+detailed, and voluminous, dump.
+
+The trace is written using DBI->trace_msg() and so is written to the default
+DBI trace output, which is usually STDERR.
+
+=head1 METHODS
+
+I<This section is currently far from complete.>
+
+=head2 response_retry_preference
+
+ $retry = $transport->response_retry_preference($request, $response);
+
+The response_retry_preference is called by DBD::Gofer when considering if a
+request should be retried after an error.
+
+Returns true (would like to retry), false (must not retry), undef (no preference).
+
+If a true value is returned in the form of a CODE ref then, if DBD::Gofer does
+decide to retry the request, it calls the code ref passing $retry_count, $retry_limit.
+Can be used for logging and/or to implement exponential backoff behaviour.
+Currently the called code must return using C<return;> to allow for future extensions.
+
+=head1 AUTHOR
+
+Tim Bunce, L<http://www.tim.bunce.name>
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2007-2008, Tim Bunce, Ireland. All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See L<perlartistic>.
+
+=head1 SEE ALSO
+
+L<DBD::Gofer>, L<DBI::Gofer::Request>, L<DBI::Gofer::Response>, L<DBI::Gofer::Execute>.
+
+and some example transports:
+
+L<DBD::Gofer::Transport::stream>
+
+L<DBD::Gofer::Transport::http>
+
+L<DBI::Gofer::Transport::mod_perl>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/null.pm b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/null.pm
new file mode 100755
index 00000000000..4b8d86c6271
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/null.pm
@@ -0,0 +1,111 @@
+package DBD::Gofer::Transport::null;
+
+# $Id: null.pm 10087 2007-10-16 12:42:37Z timbo $
+#
+# Copyright (c) 2007, Tim Bunce, Ireland
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+use strict;
+use warnings;
+
+use base qw(DBD::Gofer::Transport::Base);
+
+use DBI::Gofer::Execute;
+
+our $VERSION = sprintf("0.%06d", q$Revision: 10087 $ =~ /(\d+)/o);
+
+__PACKAGE__->mk_accessors(qw(
+ pending_response
+ transmit_count
+));
+
+my $executor = DBI::Gofer::Execute->new();
+
+
+sub transmit_request_by_transport {
+ my ($self, $request) = @_;
+ $self->transmit_count( ($self->transmit_count()||0) + 1 ); # just for tests
+
+ my $frozen_request = $self->freeze_request($request);
+
+ # ...
+ # the request is magically transported over to ... ourselves
+ # ...
+
+ my $response = $executor->execute_request( $self->thaw_request($frozen_request, undef, 1) );
+
+ # put response 'on the shelf' ready for receive_response()
+ $self->pending_response( $response );
+
+ return undef;
+}
+
+
+sub receive_response_by_transport {
+ my $self = shift;
+
+ my $response = $self->pending_response;
+
+ my $frozen_response = $self->freeze_response($response, undef, 1);
+
+ # ...
+ # the response is magically transported back to ... ourselves
+ # ...
+
+ return $self->thaw_response($frozen_response);
+}
+
+
+1;
+__END__
+
+=head1 NAME
+
+DBD::Gofer::Transport::null - DBD::Gofer client transport for testing
+
+=head1 SYNOPSIS
+
+ my $original_dsn = "..."
+ DBI->connect("dbi:Gofer:transport=null;dsn=$original_dsn",...)
+
+or, enable by setting the DBI_AUTOPROXY environment variable:
+
+ export DBI_AUTOPROXY="dbi:Gofer:transport=null"
+
+=head1 DESCRIPTION
+
+Connect via DBD::Gofer but execute the requests within the same process.
+
+This is a quick and simple way to test applications for compatibility with the
+(few) restrictions that DBD::Gofer imposes.
+
+It also provides a simple, portable way for the DBI test suite to be used to
+test DBD::Gofer on all platforms with no setup.
+
+Also, by measuring the difference in performance between normal connections and
+connections via C<dbi:Gofer:transport=null> the basic cost of using DBD::Gofer
+can be measured. Furthermore, the additional cost of more advanced transports can be
+isolated by comparing their performance with the null transport.
+
+The C<t/85gofer.t> script in the DBI distribution includes a comparative benchmark.
+
+=head1 AUTHOR
+
+Tim Bunce, L<http://www.tim.bunce.name>
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2007, Tim Bunce, Ireland. All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See L<perlartistic>.
+
+=head1 SEE ALSO
+
+L<DBD::Gofer::Transport::Base>
+
+L<DBD::Gofer>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/pipeone.pm b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/pipeone.pm
new file mode 100755
index 00000000000..3df2bf3f103
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/pipeone.pm
@@ -0,0 +1,253 @@
+package DBD::Gofer::Transport::pipeone;
+
+# $Id: pipeone.pm 10087 2007-10-16 12:42:37Z timbo $
+#
+# Copyright (c) 2007, Tim Bunce, Ireland
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+use strict;
+use warnings;
+
+use Carp;
+use Fcntl;
+use IO::Select;
+use IPC::Open3 qw(open3);
+use Symbol qw(gensym);
+
+use base qw(DBD::Gofer::Transport::Base);
+
+our $VERSION = sprintf("0.%06d", q$Revision: 10087 $ =~ /(\d+)/o);
+
+__PACKAGE__->mk_accessors(qw(
+ connection_info
+ go_perl
+));
+
+
+sub new {
+ my ($self, $args) = @_;
+ $args->{go_perl} ||= do {
+ ($INC{"blib.pm"}) ? [ $^X, '-Mblib' ] : [ $^X ];
+ };
+ if (not ref $args->{go_perl}) {
+ # user can override the perl to be used, either with an array ref
+ # containing the command name and args to use, or with a string
+ # (ie via the DSN) in which case, to enable args to be passed,
+ # we split on two or more consecutive spaces (otherwise the path
+ # to perl couldn't contain a space itself).
+ $args->{go_perl} = [ split /\s{2,}/, $args->{go_perl} ];
+ }
+ return $self->SUPER::new($args);
+}
+
+
+# nonblock($fh) puts filehandle into nonblocking mode
+sub nonblock {
+ my $fh = shift;
+ my $flags = fcntl($fh, F_GETFL, 0)
+ or croak "Can't get flags for filehandle $fh: $!";
+ fcntl($fh, F_SETFL, $flags | O_NONBLOCK)
+ or croak "Can't make filehandle $fh nonblocking: $!";
+}
+
+
+sub start_pipe_command {
+ my ($self, $cmd) = @_;
+ $cmd = [ $cmd ] unless ref $cmd eq 'ARRAY';
+
+ # if it's important that the subprocess uses the same
+ # (versions of) modules as us then the caller should
+ # set PERL5LIB itself.
+
+ # limit various forms of insanity, for now
+ local $ENV{DBI_TRACE}; # use DBI_GOFER_TRACE instead
+ local $ENV{DBI_AUTOPROXY};
+ local $ENV{DBI_PROFILE};
+
+ my ($wfh, $rfh, $efh) = (gensym, gensym, gensym);
+ my $pid = open3($wfh, $rfh, $efh, @$cmd)
+ or die "error starting @$cmd: $!\n";
+ if ($self->trace) {
+ $self->trace_msg(sprintf("Started pid $pid: @$cmd {fd: w%d r%d e%d, ppid=$$}\n", fileno $wfh, fileno $rfh, fileno $efh),0);
+ }
+ nonblock($rfh);
+ nonblock($efh);
+ my $ios = IO::Select->new($rfh, $efh);
+
+ return {
+ cmd=>$cmd,
+ pid=>$pid,
+ wfh=>$wfh, rfh=>$rfh, efh=>$efh,
+ ios=>$ios,
+ };
+}
+
+
+sub cmd_as_string {
+ my $self = shift;
+ # XXX meant to return a properly shell-escaped string suitable for system
+ # but its only for debugging so that can wait
+ my $connection_info = $self->connection_info;
+ return join " ", map { (m/^[-:\w]*$/) ? $_ : "'$_'" } @{$connection_info->{cmd}};
+}
+
+
+sub transmit_request_by_transport {
+ my ($self, $request) = @_;
+
+ my $frozen_request = $self->freeze_request($request);
+
+ my $cmd = [ @{$self->go_perl}, qw(-MDBI::Gofer::Transport::pipeone -e run_one_stdio)];
+ my $info = $self->start_pipe_command($cmd);
+
+ my $wfh = delete $info->{wfh};
+ # send frozen request
+ local $\;
+ print $wfh $frozen_request
+ or warn "error writing to @$cmd: $!\n";
+ # indicate that there's no more
+ close $wfh
+ or die "error closing pipe to @$cmd: $!\n";
+
+ $self->connection_info( $info );
+ return;
+}
+
+
+sub read_response_from_fh {
+ my ($self, $fh_actions) = @_;
+ my $trace = $self->trace;
+
+ my $info = $self->connection_info || die;
+ my ($ios) = @{$info}{qw(ios)};
+ my $errors = 0;
+ my $complete;
+
+ die "No handles to read response from" unless $ios->count;
+
+ while ($ios->count) {
+ my @readable = $ios->can_read();
+ for my $fh (@readable) {
+ local $_;
+ my $actions = $fh_actions->{$fh} || die "panic: no action for $fh";
+ my $rv = sysread($fh, $_='', 1024*31); # to fit in 32KB slab
+ unless ($rv) { # error (undef) or end of file (0)
+ my $action;
+ unless (defined $rv) { # was an error
+ $self->trace_msg("error on handle $fh: $!\n") if $trace >= 4;
+ $action = $actions->{error} || $actions->{eof};
+ ++$errors;
+ # XXX an error may be a permenent condition of the handle
+ # if so we'll loop here - not good
+ }
+ else {
+ $action = $actions->{eof};
+ $self->trace_msg("eof on handle $fh\n") if $trace >= 4;
+ }
+ if ($action->($fh)) {
+ $self->trace_msg("removing $fh from handle set\n") if $trace >= 4;
+ $ios->remove($fh);
+ }
+ next;
+ }
+ # action returns true if the response is now complete
+ # (we finish all handles
+ $actions->{read}->($fh) && ++$complete;
+ }
+ last if $complete;
+ }
+ return $errors;
+}
+
+
+sub receive_response_by_transport {
+ my $self = shift;
+
+ my $info = $self->connection_info || die;
+ my ($pid, $rfh, $efh, $ios, $cmd) = @{$info}{qw(pid rfh efh ios cmd)};
+
+ my $frozen_response;
+ my $stderr_msg;
+
+ $self->read_response_from_fh( {
+ $efh => {
+ error => sub { warn "error reading response stderr: $!"; 1 },
+ eof => sub { warn "eof on stderr" if 0; 1 },
+ read => sub { $stderr_msg .= $_; 0 },
+ },
+ $rfh => {
+ error => sub { warn "error reading response: $!"; 1 },
+ eof => sub { warn "eof on stdout" if 0; 1 },
+ read => sub { $frozen_response .= $_; 0 },
+ },
+ });
+
+ waitpid $info->{pid}, 0
+ or warn "waitpid: $!"; # XXX do something more useful?
+
+ die ref($self)." command (@$cmd) failed: $stderr_msg"
+ if not $frozen_response; # no output on stdout at all
+
+ # XXX need to be able to detect and deal with corruption
+ my $response = $self->thaw_response($frozen_response);
+
+ if ($stderr_msg) {
+ # add stderr messages as warnings (for PrintWarn)
+ $response->add_err(0, $stderr_msg, undef, $self->trace)
+ # but ignore warning from old version of blib
+ unless $stderr_msg =~ /^Using .*blib/ && "@$cmd" =~ /-Mblib/;
+ }
+
+ return $response;
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBD::Gofer::Transport::pipeone - DBD::Gofer client transport for testing
+
+=head1 SYNOPSIS
+
+ $original_dsn = "...";
+ DBI->connect("dbi:Gofer:transport=pipeone;dsn=$original_dsn",...)
+
+or, enable by setting the DBI_AUTOPROXY environment variable:
+
+ export DBI_AUTOPROXY="dbi:Gofer:transport=pipeone"
+
+=head1 DESCRIPTION
+
+Connect via DBD::Gofer and execute each request by starting executing a subprocess.
+
+This is, as you might imagine, spectacularly inefficient!
+
+It's only intended for testing. Specifically it demonstrates that the server
+side is completely stateless.
+
+It also provides a base class for the much more useful L<DBD::Gofer::Transport::stream>
+transport.
+
+=head1 AUTHOR
+
+Tim Bunce, L<http://www.tim.bunce.name>
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2007, Tim Bunce, Ireland. All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See L<perlartistic>.
+
+=head1 SEE ALSO
+
+L<DBD::Gofer::Transport::Base>
+
+L<DBD::Gofer>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/stream.pm b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/stream.pm
new file mode 100755
index 00000000000..ed31637e733
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/Gofer/Transport/stream.pm
@@ -0,0 +1,291 @@
+package DBD::Gofer::Transport::stream;
+
+# $Id: stream.pm 10905 2008-03-10 22:01:04Z timbo $
+#
+# Copyright (c) 2007, Tim Bunce, Ireland
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+use strict;
+use warnings;
+
+use Carp;
+
+use base qw(DBD::Gofer::Transport::pipeone);
+
+our $VERSION = sprintf("0.%06d", q$Revision: 10905 $ =~ /(\d+)/o);
+
+__PACKAGE__->mk_accessors(qw(
+ go_persist
+));
+
+my $persist_all = 5;
+my %persist;
+
+
+sub _connection_key {
+ my ($self) = @_;
+ return join "~", $self->go_url||"", @{ $self->go_perl || [] };
+}
+
+
+sub _connection_get {
+ my ($self) = @_;
+
+ my $persist = $self->go_persist; # = 0 can force non-caching
+ $persist = $persist_all if not defined $persist;
+ my $key = ($persist) ? $self->_connection_key : '';
+ if ($persist{$key} && $self->_connection_check($persist{$key})) {
+ $self->trace_msg("reusing persistent connection $key\n",0) if $self->trace >= 1;
+ return $persist{$key};
+ }
+
+ my $connection = $self->_make_connection;
+
+ if ($key) {
+ %persist = () if keys %persist > $persist_all; # XXX quick hack to limit subprocesses
+ $persist{$key} = $connection;
+ }
+
+ return $connection;
+}
+
+
+sub _connection_check {
+ my ($self, $connection) = @_;
+ $connection ||= $self->connection_info;
+ my $pid = $connection->{pid};
+ my $ok = (kill 0, $pid);
+ $self->trace_msg("_connection_check: $ok (pid $$)\n",0) if $self->trace;
+ return $ok;
+}
+
+
+sub _connection_kill {
+ my ($self) = @_;
+ my $connection = $self->connection_info;
+ my ($pid, $wfh, $rfh, $efh) = @{$connection}{qw(pid wfh rfh efh)};
+ $self->trace_msg("_connection_kill: closing write handle\n",0) if $self->trace;
+ # closing the write file handle should be enough, generally
+ close $wfh;
+ # in future we may want to be more aggressive
+ #close $rfh; close $efh; kill 15, $pid
+ # but deleting from the persist cache...
+ delete $persist{ $self->_connection_key };
+ # ... and removing the connection_info should suffice
+ $self->connection_info( undef );
+ return;
+}
+
+
+sub _make_connection {
+ my ($self) = @_;
+
+ my $go_perl = $self->go_perl;
+ my $cmd = [ @$go_perl, qw(-MDBI::Gofer::Transport::stream -e run_stdio_hex)];
+
+ #push @$cmd, "DBI_TRACE=2=/tmp/goferstream.log", "sh", "-c";
+ if (my $url = $self->go_url) {
+ die "Only 'ssh:user\@host' style url supported by this transport"
+ unless $url =~ s/^ssh://;
+ my $ssh = $url;
+ my $setup_env = join "||", map { "source $_ 2>/dev/null" } qw(.bash_profile .bash_login .profile);
+ my $setup = $setup_env.q{; exec "$@"};
+ # don't use $^X on remote system by default as it's possibly wrong
+ $cmd->[0] = 'perl' if "@$go_perl" eq $^X;
+ # -x not only 'Disables X11 forwarding' but also makes connections *much* faster
+ unshift @$cmd, qw(ssh -xq), split(' ', $ssh), qw(bash -c), $setup;
+ }
+
+ $self->trace_msg("new connection: @$cmd\n",0) if $self->trace;
+
+ # XXX add a handshake - some message from DBI::Gofer::Transport::stream that's
+ # sent as soon as it starts that we can wait for to report success - and soak up
+ # and report useful warnings etc from ssh before we get it? Increases latency though.
+ my $connection = $self->start_pipe_command($cmd);
+ return $connection;
+}
+
+
+sub transmit_request_by_transport {
+ my ($self, $request) = @_;
+ my $trace = $self->trace;
+
+ my $connection = $self->connection_info || do {
+ my $con = $self->_connection_get;
+ $self->connection_info( $con );
+ $con;
+ };
+
+ my $encoded_request = unpack("H*", $self->freeze_request($request));
+ $encoded_request .= "\015\012";
+
+ my $wfh = $connection->{wfh};
+ $self->trace_msg(sprintf("transmit_request_by_transport: to fh %s fd%d\n", $wfh, fileno($wfh)),0)
+ if $trace >= 4;
+
+ # send frozen request
+ local $\;
+ print $wfh $encoded_request # autoflush enabled
+ or do {
+ # XXX should make new connection and retry
+ $self->_connection_kill;
+ die "Error sending request: $!";
+ };
+ $self->trace_msg("Request sent: $encoded_request\n",0) if $trace >= 4;
+
+ return;
+}
+
+
+sub receive_response_by_transport {
+ my $self = shift;
+ my $trace = $self->trace;
+
+ $self->trace_msg("receive_response_by_transport: awaiting response\n",0) if $trace >= 4;
+ my $connection = $self->connection_info || die;
+ my ($pid, $rfh, $efh, $cmd) = @{$connection}{qw(pid rfh efh cmd)};
+
+ my $errno = 0;
+ my $encoded_response;
+ my $stderr_msg;
+
+ $self->read_response_from_fh( {
+ $efh => {
+ error => sub { warn "error reading response stderr: $!"; $errno||=$!; 1 },
+ eof => sub { warn "eof reading efh" if $trace >= 4; 1 },
+ read => sub { $stderr_msg .= $_; 0 },
+ },
+ $rfh => {
+ error => sub { warn "error reading response: $!"; $errno||=$!; 1 },
+ eof => sub { warn "eof reading rfh" if $trace >= 4; 1 },
+ read => sub { $encoded_response .= $_; ($encoded_response=~s/\015\012$//) ? 1 : 0 },
+ },
+ });
+
+ # if we got no output on stdout at all then the command has
+ # probably exited, possibly with an error to stderr.
+ # Turn this situation into a reasonably useful DBI error.
+ if (not $encoded_response) {
+ my @msg;
+ push @msg, "error while reading response: $errno" if $errno;
+ if ($stderr_msg) {
+ chomp $stderr_msg;
+ push @msg, sprintf "error reported by \"%s\" (pid %d%s): %s",
+ $self->cmd_as_string,
+ $pid, ((kill 0, $pid) ? "" : ", exited"),
+ $stderr_msg;
+ }
+ die join(", ", "No response received", @msg)."\n";
+ }
+
+ $self->trace_msg("Response received: $encoded_response\n",0)
+ if $trace >= 4;
+
+ $self->trace_msg("Gofer stream stderr message: $stderr_msg\n",0)
+ if $stderr_msg && $trace;
+
+ my $frozen_response = pack("H*", $encoded_response);
+
+ # XXX need to be able to detect and deal with corruption
+ my $response = $self->thaw_response($frozen_response);
+
+ if ($stderr_msg) {
+ # add stderr messages as warnings (for PrintWarn)
+ $response->add_err(0, $stderr_msg, undef, $trace)
+ # but ignore warning from old version of blib
+ unless $stderr_msg =~ /^Using .*blib/ && "@$cmd" =~ /-Mblib/;
+ }
+
+ return $response;
+}
+
+sub transport_timedout {
+ my $self = shift;
+ $self->_connection_kill;
+ return $self->SUPER::transport_timedout(@_);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBD::Gofer::Transport::stream - DBD::Gofer transport for stdio streaming
+
+=head1 SYNOPSIS
+
+ DBI->connect('dbi:Gofer:transport=stream;url=ssh:username@host.example.com;dsn=dbi:...',...)
+
+or, enable by setting the DBI_AUTOPROXY environment variable:
+
+ export DBI_AUTOPROXY='dbi:Gofer:transport=stream;url=ssh:username@host.example.com'
+
+=head1 DESCRIPTION
+
+Without the C<url=> parameter it launches a subprocess as
+
+ perl -MDBI::Gofer::Transport::stream -e run_stdio_hex
+
+and feeds requests into it and reads responses from it. But that's not very useful.
+
+With a C<url=ssh:username@host.example.com> parameter it uses ssh to launch the subprocess
+on a remote system. That's much more useful!
+
+It gives you secure remote access to DBI databases on any system you can login to.
+Using ssh also gives you optional compression and many other features (see the
+ssh manual for how to configure that and many other options via ~/.ssh/config file).
+
+The actual command invoked is something like:
+
+ ssh -xq ssh:username@host.example.com bash -c $setup $run
+
+where $run is the command shown above, and $command is
+
+ . .bash_profile 2>/dev/null || . .bash_login 2>/dev/null || . .profile 2>/dev/null; exec "$@"
+
+which is trying (in a limited and fairly unportable way) to setup the environment
+(PATH, PERL5LIB etc) as it would be if you had logged in to that system.
+
+The "C<perl>" used in the command will default to the value of $^X when not using ssh.
+On most systems that's the full path to the perl that's currently executing.
+
+
+=head1 PERSISTENCE
+
+Currently gofer stream connections persist (remain connected) after all
+database handles have been disconnected. This makes later connections in the
+same process very fast.
+
+Currently up to 5 different gofer stream connections (based on url) can
+persist. If more than 5 are in the cache when a new connection is made then
+the cache is cleared before adding the new connection. Simple but effective.
+
+=head1 TO DO
+
+Document go_perl attribute
+
+Automatically reconnect (within reason) if there's a transport error.
+
+Decide on default for persistent connection - on or off? limits? ttl?
+
+=head1 AUTHOR
+
+Tim Bunce, L<http://www.tim.bunce.name>
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2007, Tim Bunce, Ireland. All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See L<perlartistic>.
+
+=head1 SEE ALSO
+
+L<DBD::Gofer::Transport::Base>
+
+L<DBD::Gofer>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/NullP.pm b/Master/tlpkg/tlperl.straw/lib/DBD/NullP.pm
new file mode 100755
index 00000000000..51cc259770f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/NullP.pm
@@ -0,0 +1,151 @@
+{
+ package DBD::NullP;
+
+ require DBI;
+ require Carp;
+
+ @EXPORT = qw(); # Do NOT @EXPORT anything.
+ $VERSION = sprintf("12.%06d", q$Revision: 9215 $ =~ /(\d+)/o);
+
+# $Id: NullP.pm 9215 2007-03-08 17:03:58Z timbo $
+#
+# Copyright (c) 1994-2007 Tim Bunce
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+ $drh = undef; # holds driver handle once initialised
+
+ sub driver{
+ return $drh if $drh;
+ my($class, $attr) = @_;
+ $class .= "::dr";
+ ($drh) = DBI::_new_drh($class, {
+ 'Name' => 'NullP',
+ 'Version' => $VERSION,
+ 'Attribution' => 'DBD Example Null Perl stub by Tim Bunce',
+ }, [ qw'example implementors private data']);
+ $drh;
+ }
+
+ sub CLONE {
+ undef $drh;
+ }
+}
+
+
+{ package DBD::NullP::dr; # ====== DRIVER ======
+ $imp_data_size = 0;
+ use strict;
+
+ sub connect { # normally overridden, but a handy default
+ my $dbh = shift->SUPER::connect(@_)
+ or return;
+ $dbh->STORE(Active => 1);
+ $dbh;
+ }
+
+
+ sub DESTROY { undef }
+}
+
+
+{ package DBD::NullP::db; # ====== DATABASE ======
+ $imp_data_size = 0;
+ use strict;
+ use Carp qw(croak);
+
+ sub prepare {
+ my ($dbh, $statement)= @_;
+
+ my ($outer, $sth) = DBI::_new_sth($dbh, {
+ 'Statement' => $statement,
+ });
+
+ return $outer;
+ }
+
+ sub FETCH {
+ my ($dbh, $attrib) = @_;
+ # In reality this would interrogate the database engine to
+ # either return dynamic values that cannot be precomputed
+ # or fetch and cache attribute values too expensive to prefetch.
+ return $dbh->SUPER::FETCH($attrib);
+ }
+
+ sub STORE {
+ my ($dbh, $attrib, $value) = @_;
+ # would normally validate and only store known attributes
+ # else pass up to DBI to handle
+ if ($attrib eq 'AutoCommit') {
+ Carp::croak("Can't disable AutoCommit") unless $value;
+ # convert AutoCommit values to magic ones to let DBI
+ # know that the driver has 'handled' the AutoCommit attribute
+ $value = ($value) ? -901 : -900;
+ }
+ return $dbh->SUPER::STORE($attrib, $value);
+ }
+
+ sub ping { 1 }
+
+ sub disconnect {
+ shift->STORE(Active => 0);
+ }
+
+}
+
+
+{ package DBD::NullP::st; # ====== STATEMENT ======
+ $imp_data_size = 0;
+ use strict;
+
+ sub bind_param {
+ my ($sth, $param, $value, $attr) = @_;
+ $sth->{ParamValues}{$param} = $value;
+ $sth->{ParamAttr}{$param} = $attr
+ if defined $attr; # attr is sticky if not explicitly set
+ return 1;
+ }
+
+ sub execute {
+ my $sth = shift;
+ $sth->bind_param($_, $_[$_-1]) for (1..@_);
+ if ($sth->{Statement} =~ m/^ \s* SELECT \s+/xmsi) {
+ $sth->STORE(NUM_OF_FIELDS => 1);
+ $sth->{NAME} = [ "fieldname" ];
+ # just for the sake of returning something, we return the params
+ my $params = $sth->{ParamValues} || {};
+ $sth->{dbd_nullp_data} = [ @{$params}{ sort keys %$params } ];
+ $sth->STORE(Active => 1);
+ }
+ 1;
+ }
+
+ sub fetchrow_arrayref {
+ my $sth = shift;
+ my $data = $sth->{dbd_nullp_data};
+ if (!$data || !@$data) {
+ $sth->finish; # no more data so finish
+ return undef;
+ }
+ return $sth->_set_fbav(shift @$data);
+ }
+ *fetch = \&fetchrow_arrayref; # alias
+
+ sub FETCH {
+ my ($sth, $attrib) = @_;
+ # would normally validate and only fetch known attributes
+ # else pass up to DBI to handle
+ return $sth->SUPER::FETCH($attrib);
+ }
+
+ sub STORE {
+ my ($sth, $attrib, $value) = @_;
+ # would normally validate and only store known attributes
+ # else pass up to DBI to handle
+ return $sth->SUPER::STORE($attrib, $value);
+ }
+
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/ODBC.pm b/Master/tlpkg/tlperl.straw/lib/DBD/ODBC.pm
new file mode 100755
index 00000000000..3b77711cd5d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/ODBC.pm
@@ -0,0 +1,1690 @@
+# $Id: ODBC.pm 13205 2009-08-19 08:51:11Z mjevans $
+#
+# Copyright (c) 1994,1995,1996,1998 Tim Bunce
+# portions Copyright (c) 1997-2004 Jeff Urlwin
+# portions Copyright (c) 1997 Thomas K. Wenrich
+# portions Copyright (c) 2007-2009 Martin J. Evans
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+## no critic (ProhibitManyArgs ProhibitMultiplePackages)
+
+require 5.006;
+
+$DBD::ODBC::VERSION = '1.23';
+
+{
+ ## no critic (ProhibitMagicNumbers ProhibitExplicitISA)
+ ## no critic (ProhibitPackageVars)
+ package DBD::ODBC;
+
+ use DBI ();
+ use DynaLoader ();
+ use Exporter ();
+
+ @ISA = qw(Exporter DynaLoader);
+
+ # my $Revision = substr(q$Id: ODBC.pm 13205 2009-08-19 08:51:11Z mjevans $, 13,2);
+
+ require_version DBI 1.21;
+
+ bootstrap DBD::ODBC $VERSION;
+
+ $err = 0; # holds error code for DBI::err
+ $errstr = q{}; # holds error string for DBI::errstr
+ $sqlstate = "00000";
+ $drh = undef; # holds driver handle once initialised
+
+ sub parse_trace_flag {
+ my ($class, $name) = @_;
+ return 0x02_00_00_00 if $name eq 'odbcunicode';
+ return 0x04_00_00_00 if $name eq 'odbcconnection';
+ return DBI::parse_trace_flag($class, $name);
+ }
+
+ sub parse_trace_flags {
+ my ($class, $flags) = @_;
+ return DBI::parse_trace_flags($class, $flags);
+ }
+
+ sub driver{
+ return $drh if $drh;
+ my($class, $attr) = @_;
+
+ $class .= "::dr";
+
+ # not a 'my' since we use it above to prevent multiple drivers
+
+ $drh = DBI::_new_drh($class, {
+ 'Name' => 'ODBC',
+ 'Version' => $VERSION,
+ 'Err' => \$DBD::ODBC::err,
+ 'Errstr' => \$DBD::ODBC::errstr,
+ 'State' => \$DBD::ODBC::sqlstate,
+ 'Attribution' => 'DBD::ODBC by Jeff Urlwin, Tim Bunce and Martin J. Evans',
+ });
+
+ return $drh;
+ }
+
+ sub CLONE { undef $drh }
+ 1;
+}
+
+
+{ package DBD::ODBC::dr; # ====== DRIVER ======
+ use strict;
+ use warnings;
+
+ ## no critic (ProhibitBuiltinHomonyms)
+ sub connect {
+ my($drh, $dbname, $user, $auth, $attr)= @_;
+ #$user = q{} unless defined $user;
+ #$auth = q{} unless defined $auth;
+
+ # create a 'blank' dbh
+ my $this = DBI::_new_dbh($drh, {
+ 'Name' => $dbname,
+ 'USER' => $user,
+ 'CURRENT_USER' => $user,
+ });
+
+ # Call ODBC _login func in Driver.xst file => dbd_db_login6
+ # and populate internal handle data.
+ # There are 3 versions (currently) if you have a recent DBI:
+ # dbd_db_login (oldest)
+ # dbd_db_login6 (with attribs hash & char * args) and
+ # dbd_db_login6_sv (as dbd_db_login6 with perl scalar args
+
+ DBD::ODBC::db::_login($this, $dbname, $user, $auth, $attr) or return;
+
+ return $this;
+ }
+ ## use critic
+
+}
+
+
+{ package DBD::ODBC::db; # ====== DATABASE ======
+ use strict;
+ use warnings;
+
+ use constant SQL_DRIVER_HSTMT => 5;
+ use constant SQL_DRIVER_HLIB => 76;
+ use constant SQL_DRIVER_HDESC => 135;
+
+
+ sub parse_trace_flag {
+ my ($h, $name) = @_;
+ return DBD::ODBC->parse_trace_flag($name);
+ }
+
+ sub private_attribute_info {
+ return {
+ odbc_ignore_named_placeholders => undef, # sth and dbh
+ odbc_default_bind_type => undef, # sth and dbh
+ odbc_force_rebind => undef, # sth & dbh
+ odbc_async_exec => undef, # sth and dbh
+ odbc_exec_direct => undef,
+ odbc_SQL_ROWSET_SIZE => undef,
+ SQL_DRIVER_ODBC_VER => undef,
+ odbc_cursortype => undef,
+ odbc_query_timeout => undef, # sth and dbh
+ odbc_has_unicode => undef,
+ odbc_out_connect_string => undef,
+ odbc_version => undef,
+ odbc_err_handler => undef,
+ odbc_putdata_start => undef, # sth and dbh
+ odbc_column_display_size => undef # sth and dbh
+ };
+ }
+
+ sub prepare {
+ my($dbh, $statement, @attribs)= @_;
+
+ # create a 'blank' sth
+ my $sth = DBI::_new_sth($dbh, {
+ 'Statement' => $statement,
+ });
+
+ # Call ODBC func in ODBC.xs file.
+ # (This will actually also call SQLPrepare for you.)
+ # and populate internal handle data.
+
+ DBD::ODBC::st::_prepare($sth, $statement, @attribs)
+ or return;
+
+ return $sth;
+ }
+
+ sub column_info {
+ my ($dbh, $catalog, $schema, $table, $column) = @_;
+
+ $catalog = q{} if (!$catalog);
+ $schema = q{} if (!$schema);
+ $table = q{} if (!$table);
+ $column = q{} if (!$column);
+ # create a "blank" statement handle
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLColumns" });
+
+ _columns($dbh,$sth, $catalog, $schema, $table, $column)
+ or return;
+
+ return $sth;
+ }
+
+ sub columns {
+ my ($dbh, $catalog, $schema, $table, $column) = @_;
+
+ $catalog = q{} if (!$catalog);
+ $schema = q{} if (!$schema);
+ $table = q{} if (!$table);
+ $column = q{} if (!$column);
+ # create a "blank" statement handle
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLColumns" });
+
+ _columns($dbh,$sth, $catalog, $schema, $table, $column)
+ or return;
+
+ return $sth;
+ }
+
+
+ sub table_info {
+ my ($dbh, $catalog, $schema, $table, $type) = @_;
+
+ if ($#_ == 1) {
+ my $attrs = $_[1];
+ $catalog = $attrs->{TABLE_CAT};
+ $schema = $attrs->{TABLE_SCHEM};
+ $table = $attrs->{TABLE_NAME};
+ $type = $attrs->{TABLE_TYPE};
+ }
+
+ $catalog = q{} if (!$catalog);
+ $schema = q{} if (!$schema);
+ $table = q{} if (!$table);
+ $type = q{} if (!$type);
+
+ # create a "blank" statement handle
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLTables" });
+
+ DBD::ODBC::st::_tables($dbh,$sth, $catalog, $schema, $table, $type)
+ or return;
+ return $sth;
+ }
+
+ sub primary_key_info {
+ my ($dbh, $catalog, $schema, $table ) = @_;
+
+ # create a "blank" statement handle
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLPrimaryKeys" });
+
+ $catalog = q{} if (!$catalog);
+ $schema = q{} if (!$schema);
+ $table = q{} if (!$table);
+ DBD::ODBC::st::_primary_keys($dbh,$sth, $catalog, $schema, $table )
+ or return;
+ return $sth;
+ }
+ sub statistics_info {
+ my ($dbh, $catalog, $schema, $table, $unique, $quick ) = @_;
+
+ # create a "blank" statement handle
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLStatistics" });
+
+ $catalog = q{} if (!$catalog);
+ $schema = q{} if (!$schema);
+ $table = q{} if (!$table);
+ $unique = 1 if (!$unique);
+ $quick = 1 if (!$quick);
+
+ DBD::ODBC::st::_statistics($dbh, $sth, $catalog, $schema, $table,
+ $unique, $quick)
+ or return;
+ return $sth;
+ }
+
+ sub foreign_key_info {
+ my ($dbh, $pkcatalog, $pkschema, $pktable, $fkcatalog, $fkschema, $fktable ) = @_;
+
+ # create a "blank" statement handle
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLForeignKeys" });
+
+ $pkcatalog = q{} if (!$pkcatalog);
+ $pkschema = q{} if (!$pkschema);
+ $pktable = q{} if (!$pktable);
+ $fkcatalog = q{} if (!$fkcatalog);
+ $fkschema = q{} if (!$fkschema);
+ $fktable = q{} if (!$fktable);
+ _GetForeignKeys($dbh, $sth, $pkcatalog, $pkschema, $pktable, $fkcatalog, $fkschema, $fktable) or return;
+ return $sth;
+ }
+
+ sub ping {
+ my $dbh = shift;
+
+ # DBD::Gofer does the following (with a 0 instead of "0") but it I
+ # cannot make it set a warning.
+ #return $dbh->SUPER::set_err("0", "can't ping while not connected") # warning
+ # unless $dbh->SUPER::FETCH('Active');
+
+ #my $pe = $dbh->FETCH('PrintError');
+ #$dbh->STORE('PrintError', 0);
+ my $evalret = eval {
+ # create a "blank" statement handle
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLTables_PING" })
+ or return 1;
+
+ my ($catalog, $schema, $table, $type);
+
+ $catalog = q{};
+ $schema = q{};
+ $table = 'NOXXTABLE';
+ $type = q{};
+
+ DBD::ODBC::st::_tables($dbh,$sth, $catalog, $schema, $table, $type)
+ or return 1;
+ $sth->finish;
+ return 0;
+ };
+ #$dbh->STORE('PrintError', $pe);
+ $dbh->set_err(undef,'',''); # clear any stored error from eval above
+ if ($evalret == 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+
+##### # saved, just for posterity.
+##### sub oldping {
+##### my $dbh = shift;
+##### my $state = undef;
+#####
+##### # should never 'work' but if it does, that's okay!
+##### # JLU incorporated patches from Jon Smirl 5/4/99
+##### {
+##### local $dbh->{RaiseError} = 0 if $dbh->{RaiseError};
+##### # JLU added local PrintError handling for completeness.
+##### # it shouldn't print, I think.
+##### local $dbh->{PrintError} = 0 if $dbh->{PrintError};
+##### my $sql = "select sysdate from dual1__NOT_FOUND__CANNOT";
+##### my $sth = $dbh->prepare($sql);
+##### # fixed "my" $state = below. Was causing problem with
+##### # ping! Also, fetching fields as some drivers (Oracle 8)
+##### # may not actually check the database for activity until
+##### # the query is "described".
+##### # Right now, Oracle8 is the only known version which
+##### # does not actually check the server during prepare.
+##### my $ok = $sth && $sth->execute();
+#####
+##### $state = $dbh->state;
+##### $DBD::ODBC::err = 0;
+##### $DBD::ODBC::errstr = "";
+##### $DBD::ODBC::sqlstate = "00000";
+##### return 1 if $ok;
+##### }
+##### return 1 if $state eq 'S0002'; # Base table not found
+##### return 1 if $state eq '42S02'; # Base table not found.Solid EE v3.51
+##### return 1 if $state eq 'S0022'; # Column not found
+##### return 1 if $state eq '37000'; # statement could not be prepared (19991011, JLU)
+##### # return 1 if $state eq 'S1000'; # General Error? ? 5/30/02, JLU. This is what Openlink is returning
+##### # We assume that any other error means the database
+##### # is no longer connected.
+##### # Some special cases may need to be added to the code above.
+##### return 0;
+##### }
+
+ # New support for DBI which has the get_info command.
+ # leaving support for ->func(xxx, GetInfo) (below) for a period of time
+ # to support older applications which used this.
+ sub get_info {
+ my ($dbh, $item) = @_;
+ # Ignore some we cannot do
+ if ($item == SQL_DRIVER_HSTMT ||
+ $item == SQL_DRIVER_HLIB ||
+ $item == SQL_DRIVER_HDESC) {
+ return;
+ }
+ return _GetInfo($dbh, $item);
+ }
+
+ # new override of do method provided by Merijn Broeren
+ # this optimizes "do" to use SQLExecDirect for simple
+ # do statements without parameters.
+ ## no critic (ProhibitBuiltinHomonyms)
+ sub do {
+ my($dbh, $statement, $attr, @params) = @_;
+ my $rows = 0;
+ ## no critic (ProhibitMagicNumbers)
+ if( -1 == $#params )
+ {
+ # No parameters, use execute immediate
+ $rows = ExecDirect( $dbh, $statement );
+ if( 0 == $rows )
+ {
+ $rows = "0E0"; # 0 but true
+ }
+ elsif( $rows < -1 )
+ {
+ undef $rows;
+ }
+ }
+ else
+ {
+ $rows = $dbh->SUPER::do( $statement, $attr, @params );
+ }
+ return $rows
+ }
+ ## use critic
+ #
+ # can also be called as $dbh->func($sql, ExecDirect);
+ # if, for some reason, there are compatibility issues
+ # later with DBI's do.
+ #
+ sub ExecDirect {
+ my ($dbh, $sql) = @_;
+ return _ExecDirect($dbh, $sql);
+ }
+
+ # Call the ODBC function SQLGetInfo
+ # Args are:
+ # $dbh - the database handle
+ # $item: the requested item. For example, pass 6 for SQL_DRIVER_NAME
+ # See the ODBC documentation for more information about this call.
+ #
+ sub GetInfo {
+ my ($dbh, $item) = @_;
+ return get_info($dbh, $item);
+ }
+
+ # Call the ODBC function SQLStatistics
+ # Args are:
+ # See the ODBC documentation for more information about this call.
+ #
+ sub GetStatistics {
+ my ($dbh, $catalog, $schema, $table, $unique) = @_;
+ # create a "blank" statement handle
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLStatistics" });
+ _GetStatistics($dbh, $sth, $catalog, $schema,
+ $table, $unique) or return;
+ return $sth;
+ }
+
+ # Call the ODBC function SQLForeignKeys
+ # Args are:
+ # See the ODBC documentation for more information about this call.
+ #
+ sub GetForeignKeys {
+ my ($dbh, $pk_catalog, $pk_schema, $pk_table,
+ $fk_catalog, $fk_schema, $fk_table) = @_;
+ # create a "blank" statement handle
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLForeignKeys" });
+ _GetForeignKeys($dbh, $sth, $pk_catalog, $pk_schema, $pk_table,
+ $fk_catalog, $fk_schema, $fk_table) or return;
+ return $sth;
+ }
+
+ # Call the ODBC function SQLPrimaryKeys
+ # Args are:
+ # See the ODBC documentation for more information about this call.
+ #
+ sub GetPrimaryKeys {
+ my ($dbh, $catalog, $schema, $table) = @_;
+ # create a "blank" statement handle
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLPrimaryKeys" });
+ _GetPrimaryKeys($dbh, $sth, $catalog, $schema, $table) or return;
+ return $sth;
+ }
+
+ # Call the ODBC function SQLSpecialColumns
+ # Args are:
+ # See the ODBC documentation for more information about this call.
+ #
+ sub GetSpecialColumns {
+ my ($dbh, $identifier, $catalog, $schema, $table, $scope, $nullable) = @_;
+ # create a "blank" statement handle
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLSpecialColumns" });
+ _GetSpecialColumns($dbh, $sth, $identifier, $catalog, $schema,
+ $table, $scope, $nullable) or return;
+ return $sth;
+ }
+
+ sub GetTypeInfo {
+ my ($dbh, $sqltype) = @_;
+ # create a "blank" statement handle
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLGetTypeInfo" });
+ # print "SQL Type is $sqltype\n";
+ _GetTypeInfo($dbh, $sth, $sqltype) or return;
+ return $sth;
+ }
+
+ sub type_info_all {
+ my ($dbh, $sqltype) = @_;
+ $sqltype = DBI::SQL_ALL_TYPES unless defined $sqltype;
+ my $sth = DBI::_new_sth($dbh, { 'Statement' => "SQLGetTypeInfo" });
+ _GetTypeInfo($dbh, $sth, $sqltype) or return;
+ my $info = $sth->fetchall_arrayref;
+ unshift @{$info}, {
+ map { ($sth->{NAME}->[$_] => $_) } 0..$sth->{NUM_OF_FIELDS}-1
+ };
+ return $info;
+ }
+}
+
+
+{ package DBD::ODBC::st; # ====== STATEMENT ======
+ use strict;
+ use warnings;
+
+ *parse_trace_flag = \&DBD::ODBC::db::parse_trace_flag;
+
+ sub private_attribute_info {
+ return {
+ odbc_ignore_named_placeholders => undef, # sth and dbh
+ odbc_default_bind_type => undef, # sth and dbh
+ odbc_force_rebind => undef, # sth & dbh
+ odbc_async_exec => undef, # sth and dbh
+ odbc_query_timeout => undef, # sth and dbh
+ odbc_putdata_start => undef, # sth and dbh
+ odbc_column_display_size => undef # sth and dbh
+ };
+ }
+
+ sub ColAttributes { # maps to SQLColAttributes
+ my ($sth, $colno, $desctype) = @_;
+ my $tmp = _ColAttributes($sth, $colno, $desctype);
+ return $tmp;
+ }
+
+ sub cancel {
+ my $sth = shift;
+ my $tmp = _Cancel($sth);
+ return $tmp;
+ }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+DBD::ODBC - ODBC Driver for DBI
+
+=head1 VERSION
+
+This documentation refers to DBD::ODBC version 1.22_2.
+
+=head1 SYNOPSIS
+
+ use DBI;
+
+ $dbh = DBI->connect('dbi:ODBC:DSN', 'user', 'password');
+
+See L<DBI> for more information.
+
+=head1 DESCRIPTION
+
+=head2 Change log and FAQs
+
+Please note that the change log has been moved to
+DBD::ODBC::Changes. To access this documentation, use
+C<perldoc DBD::ODBC::Changes>.
+
+The FAQs have also moved to DBD::ODBC::FAQ.pm. To access the FAQs use
+C<perldoc DBD::ODBC::FAQ>.
+
+=head2 Important note about the tests
+
+Please note that some tests may fail or report they are unsupported on
+this platform. Notably Oracle's ODBC driver will fail the "advanced"
+binding tests in t/08bind2.t. These tests run perfectly under SQL
+Server 2000. This is normal and expected. Until Oracle fixes their
+drivers to do the right thing from an ODBC perspective, it's going to
+be tough to fix the issue. The workaround for Oracle is to bind date
+types with SQL_TIMESTAMP. Also note that some tests may be skipped,
+such as t/09multi.t, if your driver doesn't seem to support returning
+multiple result sets. This is normal.
+
+=head2 Version Control
+
+DBD::ODBC source code is under version control at svn.perl.org. If
+you would like to use the "bleeding" edge version, you can get the
+latest from svn.perl.org via Subversion version control. Note there
+is no guarantee that this version is any different than what you get
+from the tarball from CPAN, but it might be :)
+
+You may read about Subversion at L<http://subversion.tigris.org>
+
+You can get a subversion client from there and check dbd-odbc out via:
+
+ svn checkout http://svn.perl.org/modules/dbd-odbc/trunk <your directory name here>
+
+Which will pull all the files from the subversion trunk to your
+specified directory. If you want to see what has changed since the
+last release of DBD::ODBC read the Changes file or use "svn log" to
+get a list of checked in changes.
+
+=head2 Contributing
+
+There are six main ways you may help with the development and
+maintenance of this module:
+
+=over
+
+=item Submitting patches
+
+Please use Subversion (see above) to get the latest version of
+DBD::ODBC from the trunk and submit any patches against that.
+
+Please, before submitting a patch:
+
+ svn update
+ <try and included a test which demonstrates the fix/change working>
+ <test your patch>
+ svn diff > describe_my_diffs.patch
+
+and send the resulting file to me and cc the dbi-users@perl.org
+mailing list (if you are not a member - why not!).
+
+=item Reporting installs
+
+Install CPAN::Reporter and report you installations. This is easy to
+do - see L</CPAN Testers Reporting>.
+
+=item Report bugs
+
+If you find what you believe is a bug then enter it into the
+L<http://rt.cpan.org/Dist/Display.html?Name=DBD-ODBC> system. Where
+possible include code which reproduces the problem including any
+schema required and the versions of software you are using.
+
+If you are unsure whether you have found a bug report it anyway or
+post it to the dbi-users mailing list.
+
+=item pod comments and corrections
+
+If you find inaccuracies in the DBD::ODBC pod or have a comment which
+you think should be added then go to L<http://annocpan.org> and submit
+them there. I get an email for every comment added and will review
+each one and apply any changes to the documentation.
+
+=item Review DBD::ODBC
+
+Add your review of DBD::ODBC on L<http://cpanratings.perl.org>.
+
+If you are a member on ohloh then add your review or register your
+use of DBD::ODBC at L<http://www.ohloh.net/projects/perl_dbd_odbc>.
+
+=item submit test cases
+
+Most DBDs are built against a single client library for the database.
+
+Unlike other DBDs, DBD::ODBC works with many different ODBC drivers.
+Although they all should be written with regard to the ODBC
+specification drivers have bugs and in some places the specification is
+open to interpretation. As a result, when changes are applied to
+DBD::ODBC it is very easy to break something in one ODBC driver.
+
+What helps enormously to identify problems in the many combinations
+of DBD::ODBC and ODBC drivers is a large test suite. I would greatly
+appreciate any test cases and in particular any new test cases for
+databases other than MS SQL Server.
+
+=back
+
+=head2 DBI attribute handling
+
+If a DBI defined attribute is not mentioned here it behaves as per the
+DBI specification.
+
+=head3 ReadOnly (boolean)
+
+DBI documents the C<ReadOnly> attribute as being settleable and
+retrievable on connection and statement handles. In ODBC setting
+ReadOnly to true causes the connection attribute C<SQL_ATTR_ACCESS_MODE>
+to be set to C<SQL_MODE_READ_ONLY> and setting it to false will set the
+access mode to C<SQL_MODE_READ_WRITE> (which is the default in ODBC).
+
+B<Note:> There is no equivalent of setting ReadOnly on a statement
+handle in ODBC.
+
+B<Note:> See ODBC documentation on C<SQL_ATTR_ACCESS_MODE> as setting it
+to C<SQL_MODE_READ_ONLY> does B<not> prevent your script from running
+updates or deletes; it is simply a hint to the driver/database that
+you won't being doing updates.
+
+This attribute requires DBI version 1.55 or better.
+
+=head2 Private attributes common to connection and statement handles
+
+=head3 odbc_ignore_named_placeholders
+
+Use this if you have special needs (such as Oracle triggers, etc)
+where :new or :name mean something special and are not just place
+holder names. You I<must> then use ? for binding parameters. Example:
+
+ $dbh->{odbc_ignore_named_placeholders} = 1;
+ $dbh->do("create trigger foo as if :new.x <> :old.x then ... etc");
+
+Without this, DBD::ODBC will think :new and :old are placeholders for
+binding and get confused.
+
+=head3 odbc_default_bind_type
+
+This value defaults to 0.
+
+Older versions of DBD::ODBC assumed that the parameter binding type
+was 12 (C<SQL_VARCHAR>). Newer versions always attempt to call
+C<SQLDescribeParam> to find the parameter types but if
+C<SQLDescribeParam> is unavailable DBD::ODBC falls back to a default
+bind type. The internal default bind type is C<SQL_VARCHAR> (for
+non-unicode build) and C<SQL_WVARCHAR> (for a unicode build). If you
+set C<odbc_default_bind_type> to a value other than 0 you override the
+internal default.
+
+B<N.B> If you call the C<bind_param> method with a SQL type this
+overrides everything else above.
+
+=head3 odbc_force_rebind
+
+This is to handle special cases, especially when using multiple result sets.
+Set this before execute to "force" DBD::ODBC to re-obtain the result set's
+number of columns and column types for each execute. Especially useful for
+calling stored procedures which may return different result sets each
+execute. The only performance penalty is during execute(), but I didn't
+want to incur that penalty for all circumstances. It is probably fairly
+rare that this occurs. This attribute will be automatically set when
+multiple result sets are triggered. Most people shouldn't have to worry
+about this.
+
+=head3 odbc_async_exec
+
+Allow asynchronous execution of queries. This causes a spin-loop
+(with a small "sleep") until the ODBC API being called is complete
+(i.e., while the ODBC API returns C<SQL_STILL_EXECUTING>). This is
+useful, however, if you want the error handling and asynchronous
+messages (see the L</odbc_err_handler> and F<t/20SQLServer.t> for an
+example of this.
+
+=head3 odbc_query_timeout
+
+This allows you to change the ODBC query timeout (the ODBC statement
+attribute C<SQL_ATTR_QUERY_TIMEOUT>). ODBC defines the query time out as
+the number of seconds to wait for a SQL statement to execute before
+returning to the application. A value of 0 (the default) means there
+is no time out. Do not confuse this with the ODBC attributes
+C<SQL_ATTR_LOGIN_TIMEOUT> and C<SQL_ATTR_CONNECTION_TIMEOUT>. Add
+
+ { odbc_query_timeout => 30 }
+
+to your connect, set on the C<dbh> before creating a statement or
+explicitly set it on your statement handle. The odbc_query_timeout on
+a statement is inherited from the parent connection.
+
+Note that internally DBD::ODBC only sets the query timeout if you set it
+explicitly and the default of 0 (no time out) is implemented by the
+ODBC driver and not DBD::ODBC.
+
+Note that some ODBC drivers implement a maximum query timeout value
+and will limit timeouts set above their maximum. You may see a
+warning if your time out is capped by the driver but there is
+currently no way to retrieve the capped value back from the driver.
+
+Note that some drivers may not support this attribute.
+
+See F<t/20SqlServer.t> for an example.
+
+=head3 odbc_putdata_start
+
+C<odbc_putdata_start> defines the size at which DBD::ODBC uses
+C<SQLPutData> and C<SQLParamData> to send larger objects to the
+database instead of simply binding them as normal with
+C<SQLBindParameter>. It is mostly a placeholder for future changes
+allowing chunks of data to be sent to the database and there is little
+reason for anyone to change it currently.
+
+The default for odbc_putdata_start is 32768 because this value was
+hard-coded in DBD::ODBC until 1.16_1.
+
+=head3 odbc_column_display_size
+
+If you ODBC driver does not support the SQL_COLUMN_DISPLAY_SIZE and
+SQL_COLUMN_LENGTH attributes to SQLColAtrributes then DBD::ODBC does
+not know how big the column might be. odbc_column_display_size sets
+the default value for the column size when retrieving column data
+where the size cannot be determined.
+
+The default for odbc_column_display_size is 2001 because this value was
+hard-coded in DBD::ODBC until 1.17_3.
+
+=head2 Private connection attributes
+
+=head3 odbc_err_handler
+
+B<NOTE:> There should be no reason to use this now as there is a DBI
+attribute of a similar name. In future versions this attribute will
+be deleted.
+
+Allow errors to be handled by the application. A call-back function
+supplied by the application to handle or ignore messages.
+
+The callback function receives three parameters: state (string),
+error (string) and the native error code (number).
+
+If the error handler returns 0, the error is ignored, otherwise the
+error is passed through the normal DBI error handling.
+
+This can also be used for procedures under MS SQL Server (Sybase too,
+probably) to obtain messages from system procedures such as DBCC.
+Check F<t/20SQLServer.t> and F<t/10handler.t>.
+
+ $dbh->{RaiseError} = 1;
+ sub err_handler {
+ ($state, $msg, $native) = @_;
+ if ($state = '12345')
+ return 0; # ignore this error
+ else
+ return 1; # propagate error
+ }
+ $dbh->{odbc_err_handler} = \$err_handler;
+ # do something to cause an error
+ $dbh->{odbc_err_handler} = undef; # cancel the handler
+
+=head3 odbc_SQL_ROWSET_SIZE
+
+Here is the information from the original patch, however, this
+could/has caused SQL Server to "lock up". Please use at your own
+risk!
+
+C<SQL_ROWSET_SIZE> attribute patch from Andrew Brown
+
+ > There are only 2 additional lines allowing for the setting of
+ > SQL_ROWSET_SIZE as db handle option.
+ >
+ > The purpose to my madness is simple. SqlServer (7 anyway) by default
+ > supports only one select statement at once (using standard ODBC cursors).
+ > According to the SqlServer documentation you can alter the default
+ > setting of three values to force the use of server cursors - in
+ > which case multiple selects are possible.
+ >
+ > The code change allows for:
+ > $dbh->{SQL_ROWSET_SIZE} = 2; # Any value > 1
+ >
+ > For this very purpose.
+ >
+ > The setting of SQL_ROWSET_SIZE only affects the extended fetch
+ > command as far as I can work out and thus setting this option
+ > shouldn't affect DBD::ODBC operations directly in any way.
+ >
+ > Andrew
+ >
+
+In versions of SQL Server 2008 and later see "Multiple Active
+Statements (MAS)" in the DBD::ODBC::FAQ instead of using this
+attribute.
+
+=head3 odbc_exec_direct
+
+Force DBD::ODBC to use C<SQLExecDirect> instead of
+C<SQLPrepare>/C<SQLExecute>.
+
+There are drivers that only support C<SQLExecDirect> and the DBD::ODBC
+do() override does not allow returning result sets. Therefore, the
+way to do this now is to set the attribute odbc_exec_direct.
+
+NOTE: You may also want to use this option if you are creating
+temporary objects (e.g., tables) in MS SQL Server and for some
+reason cannot use the C<do> method. see
+L<http://technet.microsoft.com/en-US/library/ms131667.aspx> which says
+I<Prepared statements cannot be used to create temporary objects on
+SQL Server 2000 or later...>. Without odbc_exec_direct, the temporary
+object will disappear before you can use it.
+
+There are currently two ways to get this:
+
+ $dbh->prepare($sql, { odbc_exec_direct => 1});
+
+and
+
+ $dbh->{odbc_exec_direct} = 1;
+
+B<NOTE:> Even if you build DBD::ODBC with unicode support you can
+still not pass unicode strings to the prepare method if you also set
+odbc_exec_direct. This is a restriction in this attribute which is
+unavoidable.
+
+=head3 SQL_DRIVER_ODBC_VER
+
+This, while available via get_info() is captured here. I may get rid
+of this as I only used it for debugging purposes.
+
+=head3 odbc_cursortype
+
+This allows multiple concurrent statements on SQL*Server. In your
+connect, add
+
+ { odbc_cursortype => 2 }.
+
+If you are using DBI > 1.41, you should also be able to use
+
+ { odbc_cursortype => DBI::SQL_CURSOR_DYNAMIC }
+
+instead. For example:
+
+ my $dbh = DBI->connect("dbi:ODBC:$DSN", $user, $pass,
+ { RaiseError => 1, odbc_cursortype => 2});
+ my $sth = $dbh->prepare("one statement");
+ my $sth2 = $dbh->prepare("two statement");
+ $sth->execute;
+ my @row;
+ while (@row = $sth->fetchrow_array) {
+ $sth2->execute($row[0]);
+ }
+
+See F<t/20SqlServer.t> for an example.
+
+=head3 odbc_has_unicode
+
+A read-only attribute signifying whether DBD::ODBC was built with the
+C macro WITH_UNICODE or not. A value of 1 indicates DBD::ODBC was built
+with WITH_UNICODE else the value returned is 0.
+
+Building WITH_UNICODE affects columns and parameters which are
+SQL_C_WCHAR, SQL_WCHAR, SQL_WVARCHAR, and SQL_WLONGVARCHAR, SQL,
+the connect method and a lot more. See L</Unicode>.
+
+When odbc_has_unicode is 1, DBD::ODBC will:
+
+=over
+
+=item bind columns the database declares as wide characters as SQL_Wxxx
+
+This means that UNICODE data stored in these columns will be returned
+to Perl in UTF-8 and with the UTF8 flag set.
+
+=item bind parameters the database declares as wide characters as SQL_Wxxx
+
+Parameters bound where the database declares the parameter as being
+a wide character (or where the parameter type is explicitly set to a
+wide type - SQL_Wxxx) can be UTF8 in Perl and will be mapped to UTF16
+before passing to the driver.
+
+=item SQL
+
+SQL passed to the C<prepare> or C<do> methods which has the UTF8 flag set
+will be converted to UTF16 before being passed to the ODBC APIs C<SQLPrepare>
+or C<SQLExecDirect>.
+
+=item connection strings
+
+Connection strings passed to the C<connect> method will be converted
+to UTF16 before being passed to the ODBC API C<SQLDriverConnectW>. This happens
+irrespective of whether the UTF8 flag is set on the perl connect strings
+because unixODBC requires an application to call SQLDriverConnectW to indicate
+it will be calling the wide ODBC APIs.
+
+=back
+
+NOTE: You will need at least Perl 5.8.1 to use UNICODE with DBD::ODBC.
+
+NOTE: Binding of unicode output parameters is coded but untested.
+
+NOTE: When building DBD::ODBC on Windows ($^O eq 'MSWin32') the
+WITH_UNICODE macro is automatically added. To disable specify -nou as
+an argument to Makefile.PL (e.g. C<perl Makefile.PL -nou>). On non-Windows
+platforms the WITH_UNICODE macro is B<not> enabled by default and to enable
+you need to specify the -u argument to Makefile.PL. Please bare in mind
+that some ODBC drivers do not support SQL_Wxxx columns or parameters.
+
+NOTE: Unicode support on Windows 64 bit platforms is currently
+untested. Let me know how you get on with it.
+
+UNICODE support in ODBC Drivers differs considerably. Please read the
+README.unicode file for further details.
+
+=head3 odbc_out_connect_string
+
+After calling the connect method this will be the ODBC driver's
+out connection string - see documentation on SQLDriverConnect.
+
+=head3 odbc_version
+
+This was added prior to the move to ODBC 3.x to allow the caller to
+"force" ODBC 3.0 compatibility. It's probably not as useful now, but
+it allowed get_info and get_type_info to return correct/updated
+information that ODBC 2.x didn't permit/provide. Since DBD::ODBC is
+now 3.x, this can be used to force 2.x behavior via something like: my
+
+ $dbh = DBI->connect("dbi:ODBC:$DSN", $user, $pass,
+ { odbc_version =>2});
+
+=head2 Private statement attributes
+
+=head3 odbc_more_results
+
+Use this attribute to determine if there are more result sets
+available. SQL Server supports this feature. Use this as follows:
+
+ do {
+ my @row;
+ while (@row = $sth->fetchrow_array()) {
+ # do stuff here
+ }
+ } while ($sth->{odbc_more_results});
+
+Note that with multiple result sets and output parameters (i.e,. using
+bind_param_inout, don't expect output parameters to be bound until ALL
+result sets have been retrieved.
+
+=head2 Private DBD::ODBC Functions
+
+You use DBD::ODBC private functions like this:
+
+ $dbh->func(arg, private_function_name, @args);
+
+=head3 GetInfo
+
+B<This private function is now superceded by DBI's get_info method.>
+
+This function maps to the ODBC SQLGetInfo call and the argument
+should be a valid ODBC information type (see ODBC specification).
+e.g.
+
+ $value = $dbh->func(6, 'GetInfo');
+
+which returns the C<SQL_DRIVER_NAME>.
+
+This function returns a scalar value, which can be a numeric or string
+value depending on the information value requested.
+
+=head3 SQLGetTypeInfo
+
+B<This private function is now superceded by DBI's type_info and
+type_info_all methods.>
+
+This function maps to the ODBC SQLGetTypeInfo API and the argument
+should be a SQL type number (e.g. SQL_VARCHAR) or
+SQL_ALL_TYPES. SQLGetTypeInfo returns information about a data type
+supported by the data source.
+
+e.g.
+
+ use DBI qw(:sql_types);
+
+ $sth = $dbh->func(SQL_ALL_TYPES, GetTypeInfo);
+ DBI::dump_results($sth);
+
+This function returns a DBI statement handle for the SQLGetTypeInfo
+result-set containing many columns of type attributes (see ODBC
+specification).
+
+NOTE: It is VERY important that the C<use DBI> includes the
+C<qw(:sql_types)> so that values like SQL_VARCHAR are correctly
+interpreted. This "imports" the sql type names into the program's
+name space. A very common mistake is to forget the C<qw(:sql_types)>
+and obtain strange results.
+
+=head3 GetFunctions
+
+This function maps to the ODBC SQLGetFunctions API which returns
+information on whether a function is supported by the ODBC driver.
+
+The argument should be C<SQL_API_ALL_FUNCTIONS> (0) for all functions
+or a valid ODBC function number (e.g. C<SQL_API_SQLDESCRIBEPARAM>
+which is 58). See ODBC specification or examine your sqlext.h and
+sql.h header files for all the SQL_API_XXX macros.
+
+If called with C<SQL_API_ALL_FUNCTIONS> (0), then a 100 element array is
+returned where each element will contain a '1' if the ODBC function with
+that SQL_API_XXX index is supported or '' if it is not.
+
+If called with a specific SQL_API_XXX value for a single function it will
+return true if the ODBC driver supports that function, otherwise false.
+
+e.g.
+
+
+ my @x = $dbh->func(0,"GetFunctions");
+ print "SQLDescribeParam is supported\n" if ($x[58]);
+
+or
+
+ print "SQLDescribeParam is supported\n"
+ if $dbh->func(58, "GetFunctions");
+
+=head3 GetStatistics
+
+B<This private function is now superceded by DBI's statistics_info
+method.>
+
+See the ODBC specification for the SQLStatistics API.
+You call SQLStatistics like this:
+
+ $dbh->func($catalog, $schema, $table, $unique, 'GetStatistics');
+
+Prior to DBD::ODBC 1.16 $unique was not defined as being true/false or
+SQL_INDEX_UNIQUE/SQL_INDEX_ALL. In fact, whatever value you provided
+for $unique was passed through to the ODBC API SQLStatistics call
+unchanged. This changed in 1.16, where $unique became a true/false
+value which is interpreted into SQL_INDEX_UNIQUE for true and
+SQL_INDEX_ALL for false.
+
+=head3 GetForeignKeys
+
+B<This private function is now superceded by DBI's foreign_key_info
+method.>
+
+See the ODBC specification for the SQLForeignKeys API.
+You call SQLForeignKeys like this:
+
+ $dbh->func($pcatalog, $pschema, $ptable,
+ $fcatalog, $fschema, $ftable,
+ "GetForeignKeys");
+
+=head3 GetPrimaryKeys
+
+B<This private function is now superceded by DBI's primary_key_info
+method.>
+
+See the ODBC specification for the SQLPrimaryKeys API.
+You call SQLPrimaryKeys like this:
+
+ $dbh->func($catalog, $schema, $table, "GetPrimaryKeys");
+
+=head3 data_sources
+
+B<This private function is now superceded by DBI's data_sources
+method.>
+
+You call data_sources like this:
+
+ @dsns = $dbh->func("data_sources);
+
+Handled since 0.21.
+
+=head3 GetSpecialColumns
+
+See the ODBC specification for the SQLSpecialColumns API.
+You call SQLSpecialColumns like this:
+
+ $dbh->func($identifier, $catalog, $schema, $table, $scope,
+ $nullable, 'GetSpecialColumns');
+
+Handled as of version 0.28
+
+head3 ColAttributes
+
+B<This private function is now superceded by DBI's statement attributes
+NAME, TYPE, PRECISION, SCALE, NULLABLE etc).>
+
+See the ODBC specification for the SQLColAttributes API.
+You call SQLColAttributes like this:
+
+ $dbh->func($column, $ftype, "ColAttributes");
+
+ SQL_COLUMN_COUNT = 0
+ SQL_COLUMN_NAME = 1
+ SQL_COLUMN_TYPE = 2
+ SQL_COLUMN_LENGTH = 3
+ SQL_COLUMN_PRECISION = 4
+ SQL_COLUMN_SCALE = 5
+ SQL_COLUMN_DISPLAY_SIZE = 6
+ SQL_COLUMN_NULLABLE = 7
+ SQL_COLUMN_UNSIGNED = 8
+ SQL_COLUMN_MONEY = 9
+ SQL_COLUMN_UPDATABLE = 10
+ SQL_COLUMN_AUTO_INCREMENT = 11
+ SQL_COLUMN_CASE_SENSITIVE = 12
+ SQL_COLUMN_SEARCHABLE = 13
+ SQL_COLUMN_TYPE_NAME = 14
+ SQL_COLUMN_TABLE_NAME = 15
+ SQL_COLUMN_OWNER_NAME = 16
+ SQL_COLUMN_QUALIFIER_NAME = 17
+ SQL_COLUMN_LABEL = 18
+
+B<Note:>Oracle's ODBC driver for linux in instant client 11r1 often
+returns strange values for column name e.g., '20291'. It is wiser to
+use DBI's NAME and NAME_xx attributes for portability.
+
+
+head3 DescribeCol
+
+B<This private function is now superceded by DBI's statement attributes
+NAME, TYPE, PRECISION, SCLARE, NULLABLE etc).>
+
+See the ODBC specification for the SQLDescribeCol API.
+You call SQLDescribeCol like this:
+
+ @info = $dbh->func($column, "DescribeCol");
+
+The returned array contains the column attributes in the order described
+in the ODBC specification for SQLDescribeCol.
+
+=head2 Tracing
+
+DBD::ODBC now supports the parse_trace_flag and parse_trace_flags
+methods introduced in DBI 1.42 (see DBI for a full description). As
+of DBI 1.604, the only trace flag defined which is relevant to
+DBD::ODBC is 'SQL' which DBD::ODBC supports by outputting the SQL
+strings (after modification) passed to the prepare and do methods.
+
+Currently DBD::ODBC supports two private trace flags. The
+'odbcunicode' flag traces some unicode operations and the
+odbcconnection traces the connect process.
+
+To enable tracing of particular flags you use:
+
+ $h->trace($h->parse_trace_flags('SQL|odbcconnection'));
+ $h->trace($h->parse_trace_flags('1|odbcunicode'));
+
+In the first case 'SQL' and 'odbcconnection' tracing is enabled on
+$h. In the second case trace level 1 is set and 'odbcunicode' tracing
+is enabled.
+
+If you want to enable a DBD::ODBC private trace flag before connecting
+you need to do something like:
+
+ use DBD::ODBC;
+ DBI->trace(DBD::ODBC->parse_trace_flag('odbcconnection'));
+
+or
+
+ use DBD::ODBC;
+ DBI->trace(DBD::ODBC->parse_trace_flags('odbcconnection|odbcunicode'));
+
+DBD::ODBC outputs tracing at levels 3 and above (as levels 1 and 2 are
+reserved for DBI).
+
+For comprehensive tracing of DBI method calls without all the DBI
+internals see L<DBIx::Log4perl>.
+
+=head2 Deviations from the DBI specification
+
+=head3 Mixed placeholder types
+
+There are 3 conventions for place holders in DBI. These are '?', ':N'
+and ':name' (where 'N' is a number and 'name' is an alpha numeric
+string not beginning with a number). DBD::ODBC supports all these methods
+for naming placeholders but you must only use one method throughout
+a particular SQL string. If you mix placeholder methods you will get
+an error like:
+
+ Can't mix placeholder styles (1/2)
+
+=head3 Using the same placeholder more than once
+
+DBD::ODBC does not support (currently) the use of one named placeholder
+more than once in the a single SQL string. i.e.,
+
+ insert into foo values (:bar, :p1, :p2, :bar);
+
+is not supported because 'bar' is used more than once but:
+
+ insert into foo values(:bar, :p1, :p2)
+
+is ok. If you do the former you will get an error like:
+
+ DBD::ODBC does not yet support binding a named parameter more than once
+
+=head3 Binding named placeholders
+
+Although the DBI documentation (as of 1.604) does not say how named
+parameters are bound Tim Bunce has said that in Oracle they are bound
+with the leading ':' as part of the name and that has always been the
+case. i.e.,
+
+ prepare("insert into mytable values (:fred)");
+ bind_param(":foo", 1);
+
+DBD::ODBC does not support binding named parameters with the ':' introducer.
+In the above example you must use:
+
+ bind_param("foo", 1);
+
+In discussion on the dbi-dev list is was suggested that the ':' could
+be made optional and there were no basic objections but it has not
+made it's way into the pod yet.
+
+=head3 Sticky Parameter Types
+
+The DBI specification post 1.608 says in bind_param:
+
+ The data type is 'sticky' in that bind values passed to execute()
+ are bound with the data type specified by earlier bind_param()
+ calls, if any. Portable applications should not rely on being able
+ to change the data type after the first C<bind_param> call.
+
+DBD::ODBC does allow a parameter to be rebound with another data type as
+ODBC inherently allows this. Therefore you can do:
+
+ # parameter 1 set as a SQL_LONGVARCHAR
+ $sth->bind_param(1, $data, DBI::SQL_LONGVARCHAR);
+ # without the bind above the $data parameter would be either a DBD::ODBC
+ # internal default or whatever the ODBC driver said it was but because
+ # parameter types are sticky, the type is still SQL_LONGVARCHAR.
+ $sth->execute($data);
+ # change the bound type to SQL_VARCHAR
+ # some DBDs will ignore the type in the following, DBD::ODBC does not
+ $sth->bind_param(1, $data, DBI::SQL_VARCHAR);
+
+
+=head2 Unicode
+
+The ODBC specification supports wide character versions (a postfix of
+'W') of some of the normal ODBC APIs e.g., SQLDriverConnectW is a wide
+character version of SQLDriverConnect.
+
+In ODBC on Windows the wide characters are defined as SQLWCHARs (2
+bytes) and are UCS-2. On non-Windows, the main driver managers I know
+of have implemented the wide character APIs differently:
+
+=over
+
+=item unixODBC
+
+unixODBC mimics the Windows ODBC API precisely meaning the wide
+character versions expect and return 2-byte characters in
+UCS-2.
+
+unixODBC will happily recognise ODBC drivers which only have the ANSI
+versions of the ODBC API and those that have the wide versions
+too.
+
+unixODBC will allow an ANSI application to work with a unicode
+ODBC driver and vice versa (although in the latter case you obviously
+cannot actually use unicode).
+
+unixODBC does not prevent you sending UTF-8 in the ANSI versions of
+the ODBC APIs but whether that is understood by your ODBC driver is
+another matter.
+
+unixODBC differs in only one way from the Microsoft ODBC driver in
+terms of unicode support in that it avoids unnecessary translations
+between single byte and double byte characters when an ANSI
+application is using a unicode-aware ODBC driver by requiring unicode
+applications to signal their intent by calling SQLDriverConnectW
+first. On Windows, the ODBC driver manager always uses the wide
+versions of the ODBC API in ODBC drivers which provide the wide
+versions regardless of what the application really needs and this
+results in a lot of unnecessary character translations when you have
+an ANSI application and a unicode ODBC driver.
+
+=item iODBC
+
+The wide character versions expect and return wchar_t types.
+
+=back
+
+DBD::ODBC has gone with unixODBC so you cannot use iODBC with a
+unicode build of DBD::ODBC. However, some ODBC drivers support UTF-8
+(although how they do this with SQLGetData reliably I don't know)
+and so you should be able to use those with DBD::ODBC not built for
+unicode.
+
+=head3 Enabling and Disabling Unicode support
+
+On Windows Unicode support as ss enabled by default and to disable it
+you will need to specify C<-nou> to F<Makefile.PL> to get back to the
+original behavior of DBD::ODBC before any Unicode support was added.
+
+e.g.,
+
+ perl Makfile.PL -nou
+
+On non-Windows platforms Unicode support is disabled by default. To
+enable it specify C<-u> to F<Makefile.PL> when you configure DBD::ODBC.
+
+e.g.,
+
+ perl Makefile.PL -u
+
+=head3 Unicode - What is supported?
+
+As of version 1.17 DBD::ODBC has the following unicode support:
+
+=over
+
+=item SQL (introduced in 1.16_2)
+
+Unicode strings in calls to the C<prepare> and C<do> methods are
+supported so long as the C<odbc_execdirect> attribute is not used.
+
+=item unicode connection strings (introduced in 1.16_2)
+
+Unicode connection strings are supported but you will need a DBI
+post 1.607 for that.
+
+=item column names
+
+Unicode column names are returned.
+
+=item bound columns (introduced in 1.15)
+
+If the DBMS reports the column as being a wide character (SQL_Wxxx) it
+will be bound as a wide character and any returned data will be
+converted from UTF16 to UTF8 and the UTF8 flag will then be set on the
+data.
+
+=item bound parameters
+
+If the perl scalars you bind to parameters are marked UTF8 and the
+DBMS reports the type as being a wide type or you bind the parameter
+as a wide type they will be converted to wide characters and bound as
+such.
+
+=back
+
+Since version 1.16_4, the default parameter bind type is SQL_WVARCHAR
+for unicode builds of DBD::ODBC. This only affects ODBC drivers which
+do not support SQLDescribeParam and only then if you do not
+specifically set a sql type on the bind_param method call.
+
+The above Unicode support has been tested with the SQL Server, Oracle
+9.2+ and Postgres drivers on Windows and various Easysoft ODBC drivers
+on UNIX.
+
+=head3 Unicode - What is not supported?
+
+You cannot use unicode parameter names e.g.,
+
+ select * from table where column = :unicode_param_name
+
+You cannot use unicode strings in calls to prepare if you set the
+odbc_execdirect attribute.
+
+You cannot use the iODBC driver manager with DBD::ODBC built for
+unicode.
+
+=head3 Unicode - Caveats
+
+For Unicode support on any platform in Perl you will need at least
+Perl 5.8.1 - sorry but this is the way it is with Perl.
+
+The Unicode support in DBD::ODBC expects a WCHAR to be 2 bytes (as it
+is on Windows and as the ODBC specification suggests it is). Until
+ODBC specifies any other Unicode support it is not envisioned this
+will change. On UNIX there are a few different ODBC driver
+managers. I have only tested the unixODBC driver manager
+(http://www.unixodbc.org) with Unicode support and it was built with
+defaults which set WCHAR as 2 bytes.
+
+I believe that the iODBC driver manager expects wide characters to be
+wchar_t types (which are usually 4) and hence DBD::ODBC will not work
+iODBC when built for unicode.
+
+The ODBC Driver must expect Unicode data specified in SQLBindParameter
+and SQLBindCol to be UTF16 in local endianess. Similarly, in calls to
+SQLPrepareW, SQLDescribeColW and SQLDriverConnectW.
+
+You should be aware that once Unicode support is enabled it affects a
+number of DBI methods (some of which you might not expect). For
+instance, when listing tables, columns etc some drivers
+(e.g. Microsoft SQL Server) will report the column types as wide types
+even if the strings actually fit in 7-bit ASCII. As a result, there is
+an overhead for retrieving this column data as 2 bytes per character
+will be transmitted (compared with 1 when Unicode support is not
+enabled) and these strings will be converted into UTF8 but will end up
+fitting (in most cases) into 7bit ASCII so a lot of conversion work
+has been performed for nothing. If you don't have Unicode table and
+column names or Unicode column data in your tables you are best
+disabling Unicode support.
+
+I am at present unsure if ChopBlanks processing on Unicode strings is
+working correctly on UNIX. If nothing else the construct L' ' in
+dbdimp.c might not work with all UNIX compilers. Reports of issues and
+patches welcome.
+
+=head3 Unicode implementation in DBD::ODBC
+
+DBD::ODBC uses the wide character versions of the ODBC API and the
+SQL_WCHAR ODBC type to support unicode in Perl.
+
+Wide characters returned from the ODBC driver will be converted to
+UTF-8 and the perl scalars will have the utf8 flag set (by using
+sv_utf8_decode).
+
+perl scalars which are UTF-8 and are sent through the ODBC API will be
+converted to UTF-16 and passed to the ODBC wide APIs or signalled as
+SQL_WCHARs (e.g., in the case of bound columns).
+
+When built for unicode, DBD::ODBC will always call SQLDriverConnectW
+(and not SQLDriverConnect) even if a) your connection string is not
+unicode b) you have not got a DBI later than 1.607, because unixODBC
+requires SQLDriverConnectW to be called if you want to call other
+unicode ODBC APIs later. As a result, if you build for unicode and
+pass ASCII strings to the connect method they will be converted to
+UTF-16 and passed to SQLDriverConnectW. This should make no real
+difference to perl not using unicode connection strings.
+
+You will need a DBI later than 1.607 to support unicode connection
+strings because until post 1.607 there was no way for DBI to pass
+unicode strings to the DBD.
+
+=head3 Unicode and Oracle
+
+You have to set the environment variables C<NLS_NCHAR=AL32UTF8> and
+C<NLS_LANG=AMERICAN_AMERICA.AL32UTF8> (or any other language setting
+ending with C<.AL32UTF8>) before loading DBD::ODBC to make Oracle
+return Unicode data. (See also "Oracle and Unicode" in the POD of
+DBD::Oracle.)
+
+On Windows, using the Oracle ODBC Driver you have to enable the B<Force
+SQL_WCHAR support> Workaround in the data source configuration to make
+Oracle return Unicode to a non-Unicode application. Alternatively, you
+can include C<FWC=T> in your connect string.
+
+Unless you need to use ODBC, if you want Unicode support with Oracle
+you are better off using L<DBD::Oracle>.
+
+=head3 Unicode and PostgreSQL
+
+Some tests from the original DBD::ODBC 1.13 fail with PostgreSQL
+8.0.3, so you may not want to use DBD::ODBC to connect to PostgreSQL
+8.0.3.
+
+Unicode tests fail because PostgreSQL seems not to give any hints
+about Unicode, so all data is treated as non-Unicode.
+
+Unless you need to use ODBC, if you want Unicode support with Postgres
+you are better off with L<DBD::Pg> as it has a specific attribute named
+C<pg_enable_utf8> to enable Unicode support.
+
+=head3 Unicode and Easysoft ODBC Drivers
+
+We have tested the Easysoft SQL Server, Oracle and ODBC Bridge drivers
+with DBD::ODBC built for Unicode. All work as described without
+modification except for the Oracle driver you will need to set you
+NLS_LANG as mentioned above.
+
+=head3 Unicode and other ODBC drivers
+
+If you have a unicode-enabled ODBC driver and it works with DBD::ODBC
+let me know and I will include it here.
+
+=head2 ODBC Support in ODBC Drivers
+
+=head3 Drivers without SQLDescribeParam
+
+Some drivers do not support the C<SQLDescribeParam> ODBC API (e.g.,
+Microsoft Access).
+
+DBD::ODBC uses the C<SQLDescribeParam> API when parameters are bound
+to your SQL to find the types of the parameters. If the ODBC driver
+does not support C<SQLDescribeParam>, DBD::ODBC assumes the parameters
+are C<SQL_VARCHAR> or C<SQL_WVARCHAR> types (depending on whether
+DBD::ODBC is built for unicode or not). In any case, if you bind a
+parameter and specify a SQL type this overrides any type DBD::ODBC
+would choose.
+
+For ODBC drivers which do not support C<SQLDescribeParam> the default
+behavior in DBD::ODBC may not be what you want. To change the default
+parameter bind type set L</odbc_default_bind_type>. If, after that you
+have some SQL where you need to vary the parameter types used add the
+SQL type to the end of the C<bind_param> method.
+
+ use DBI qw(:sql_types);
+ $h = DBI->connect;
+ # set the default bound parameter type
+ $h->{odbc_default_bind_type} = SQL_VARCHAR;
+ # bind a parameter with a specific type
+ $s = $h->prepare(q/insert into mytable values(?)/);
+ $s->bind_param(1, "\x{263a}", SQL_WVARCHAR);
+
+=head2 CPAN Testers Reporting
+
+Please, please, please (is that enough), consider installing
+CPAN::Reporter so that when you install perl modules a report of the
+installation success or failure can be sent to cpan testers. In this
+way module authors 1) get feedback on the fact that a module is being
+installed 2) get to know if there are any installation problems. Also
+other people like you may look at the test reports to see how
+successful they are before choosing the version of a module to
+install.
+
+CPAN::Reporter is easy to install and configure like this:
+
+ perl -MCPAN -e shell
+ cpan> install CPAN::Reporter
+ cpan> reload cpan
+ cpan> o conf init test_report
+
+Simply answer the questions to configure CPAN::Reporter.
+
+You can find the CPAN testers wiki at L<http://wiki.cpantesters.org/>
+and the installation guide for CPAN::Reporter at
+L<http://wiki.cpantesters.org/wiki/CPANInstall>.
+
+=head2 Others/todo?
+
+Level 2
+
+ SQLColumnPrivileges
+ SQLProcedureColumns
+ SQLProcedures
+ SQLTablePrivileges
+ SQLDrivers
+ SQLNativeSql
+
+=head2 Random Links
+
+These are in need of sorting and annotating. Some are relevant only
+to ODBC developers.
+
+You can find DBD::ODBC on ohloh now at:
+
+L<http://www.ohloh.net/projects/perl_dbd_odbc>
+
+If you use ohloh and DBD::ODBC please say you use it and rate it.
+
+There is a good search engine for the various Perl DBI lists at the
+following URLS:
+
+L<http://perl.markmail.org/search/list:org.perl.dbi-users>
+
+L<http://perl.markmail.org/search/list:org.perl.dbi-dev>
+
+L<http://perl.markmail.org/search/list:org.perl.dbi-announce>
+
+L<http://www.syware.com>
+
+L<http://www.microsoft.com/odbc>
+
+For Linux/Unix folks, compatible ODBC driver managers can be found at:
+
+L<http://www.unixodbc.org> (unixODBC source and rpms)
+
+L<http://www.iodbc.org> (iODBC driver manager source)
+
+For Linux/Unix folks, you can checkout the following for ODBC Drivers and
+Bridges:
+
+L<http://www.easysoft.com>
+
+L<http://www.openlinksw.com>
+
+L<http://www.datadirect.com>
+
+L<http://www.atinet.com>
+
+Some useful tutorials:
+
+Debugging Perl DBI:
+
+L<http://www.easysoft.com/developer/languages/perl/dbi-debugging.html>
+
+Enabling ODBC support in Perl with Perl DBI and DBD::ODBC:
+
+
+L<http://www.easysoft.com/developer/languages/perl/dbi_dbd_odbc.html>
+
+Perl DBI/DBD::ODBC Tutorial Part 1 - Drivers, Data Sources and Connection:
+
+L<http://www.easysoft.com/developer/languages/perl/dbd_odbc_tutorial_part_1.html>
+
+Perl DBI/DBD::ODBC Tutorial Part 2 - Introduction to retrieving data from your database:
+
+L<http://www.easysoft.com/developer/languages/perl/dbd_odbc_tutorial_part_2.html>
+
+Perl DBI/DBD::ODBC Tutorial Part 3 - Connecting Perl on UNIX or Linux to Microsoft SQL Server:
+
+L<http://www.easysoft.com/developer/languages/perl/sql_server_unix_tutorial.html>
+
+Perl DBI - Put Your Data On The Web:
+
+L<http://www.easysoft.com/developer/languages/perl/tutorial_data_web.html>
+
+=head2 Frequently Asked Questions
+
+Frequently asked questions are now in L<DBD::ODBC::FAQ>. Run
+C<perldoc DBD::ODBC::FAQ> to view them.
+
+=head1 CONFIGURATION AND ENVIRONMENT
+
+You should consult the documentation for the ODBC Driver Manager
+you are using.
+
+=head1 DEPENDENCIES
+
+L<DBI>
+
+L<Test::Simple>
+
+=head1 INCOMPATIBILITIES
+
+=head1 BUGS AND LIMITATIONS
+
+None known other than the deviations from the DBI specification mentioned
+above in L</Deviations from the DBI specification>.
+
+Please report any to me via the CPAN RT system. See
+L<http://rt.cpan.org/> for more details.
+
+=head1 AUTHOR
+
+Tim Bunce
+
+Jeff Urlwin
+
+Thomas K. Wenrich
+
+Martin J. Evans
+
+=head1 LICENSE AND COPYRIGHT
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself. See L<perlartistic>. This
+program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.
+
+Portions of this software are Copyright Tim Bunce, Thomas K. Wenrich,
+Jeff Urlwin and Martin J. Evans - see the source.
+
+=head1 SEE ALSO
+
+L<DBI>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/ODBC/Changes.pm b/Master/tlpkg/tlperl.straw/lib/DBD/ODBC/Changes.pm
new file mode 100755
index 00000000000..1388aab9b31
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/ODBC/Changes.pm
@@ -0,0 +1,1682 @@
+=head1 NAME
+
+DBD::ODBC::Changes - Log of significant changes to the DBD::ODBC
+
+(As of $LastChangedDate: 2009-08-19 09:51:11 +0100 (Wed, 19 Aug 2009) $ $Revision: 10667 $)
+
+=cut
+
+=head1 Todo
+
+ Add array parameter binding (per new DBI Spec)
+ Add row caching/multiple row fetches to speed selects
+ Better/more tests on multiple statement handles which ensure the
+ correct number of rows
+ Better/more tests on all queries which ensure the correct number of
+ rows and data
+ Better tests on SQLExecDirect/do
+ Keep checking Oracle's ODBC drivers for Windows to fix the Date binding problem
+ Change SQLSetConnectOption to SQLSetConnectAttr as we are ODBC 3 now
+ Change SQLColAttributes calls (now deprecated) to SQLColAttribute
+ Change SQLTransact calls to SQLEndTran calls.
+ Add support for $sth->more_results based on DBD::ODBC-specific attribute
+ Use odbcinst (if it exists to point people at the ini files they need to use)
+ Use odbc_config (if it exists to find out about unixODBC).
+ There is a Columns private ODBC method which is not documented.
+ Add support for sending lobs in chunks instead of all in one go. Although
+ DBD::ODBC uses SQLParamData and SQLPutData internally they are not exposed
+ so anyone binding a lob has to have all of it available before it can
+ be bound.
+ Try to produce a Module::Install build.
+ There is a blob_read method in DBI (undocumented) that DBD:DB2 & DBD::Pg
+ use and might be useful in DBD::ODBC.
+ The SQL_DRIVER_ODBC_VER attribute should be odbc_SQL_DRIVER_ODBC_VER.
+ Why does level 15 tracing of any DBD::ODBC script show alot of these:
+ !!DBD::ODBC unsupported attribute passed (PrintError)
+ !!DBD::ODBC unsupported attribute passed (Username)
+ !!DBD::ODBC unsupported attribute passed (dbi_connect_closure)
+ !!DBD::ODBC unsupported attribute passed (LongReadLen)
+ strawberry perl build issue:
+ http://groups.google.com/group/perl.dbd.pg.changes/browse_thread/thread/8205bf83b5a48f63/cf43d87fe644798f?hl=en&q=easysoft&pli=1
+ http://www.nntp.perl.org/group/perl.dbi.users/2008/10/msg33322.html
+ Add a perlcritic test - see DBD::Pg
+ Why doesn't http://www.presicient.com/dbidocs/ display DBD::ODBC docs
+ properly.
+ ParamTypes attribute not visible until after execute
+
+=head1 CHANGES
+
+=head2 Changes in DBD::ODBC 1.23 September 11, 2009
+
+Only a readme change and version bumped to 1.23. This is a full
+release of all the 1.22_x development releases.
+
+=head2 Changes in DBD::ODBC 1.22_3 August 19, 2009
+
+Fix skip count in rt_38977.t and typo in ok call.
+
+Workaround a bug in unixODBC 2.2.11 which can write off the end of the
+string buffer passed to SQLColAttributes.
+
+Fix skip count in rt_null_nvarchar.t test for non SQL Server drivers.
+
+Fix test in 02simple.t which reported a fail if you have no ODBC
+datasources.
+
+In 99_yaml.t pick up the yaml spec version from the meta file instead
+of specifying it.
+
+Change calls to SQLPrepare which passed in the string lenth of the SQL
+to use SQL_NTS because a) they are null terminated and more
+importantly b) unixODBC contains a bug in versions up to 2.2.16 which
+can overwrite the stack by 1 byte if the string length is specified
+and not built with iconv support and converting the SQL from ASCII to
+Unicode.
+
+Fixed bug in ping method reported by Lee Anne Lester where it dies if
+used after the connection is closed.
+
+A great deal of changes to Makefile.PL to improve the automatic
+detection and configuration for ODBC driver managers - especially on
+64bit platforms. See rt47650 from Marten Lehmann which started it all
+off.
+
+Add changes from Chris Clark for detecting IngresCLI.
+
+Fix for rt 48304. If you are using a Microsoft SQL Server database and
+nvarchar(max) you could not insert values between 4001 and 8000
+(inclusive) in size. A test was added to the existing rt_38977.t test.
+Thanks to Michael Thomas for spotting this.
+
+Added FAQ on UTF-8 encoding and IBM iSeries ODBC driver.
+
+Add support for not passing usernames and passwords in call to
+connect. Previously DBD::ODBC would set an unspecified
+username/password to '' in ODBC.pm before calling one of the login_xxx
+functions. This allows the driver to pull the username/password from
+elsewhere e.g., like the odbc.ini file.
+
+=head2 Changes in DBD::ODBC 1.22_1 June 16, 2009
+
+Applied a slightly modified version of patch from Jens Rehsack to
+improve support for finding the iODBC driver manager.
+
+A UNICODE enabled DBD::ODBC (the default on Windows) did not handle
+UNICODE usernames and passwords in the connect call properly.
+
+Updated "Attribution" in ODBC.pm.
+
+Unicode support is no longer experimental hence warning and prompt
+removed from the Makefile.PL.
+
+old_ping method removed.
+
+Fixed bug in 02simple.t test which is supposed to check you have at
+least one data source defined. Unfortunately, it was checking you had
+more than 1 data source defined.
+
+rt_null_varchar had wrong skip count meaning non-sql-server drivers or
+sql server drivers too old skipped 2 tests more than were planned.
+
+=head2 Changes in DBD::ODBC 1.22 June 10, 2009
+
+Fixed bug which led to "Use of uninitialized value in subroutine
+entry" warnings when writing a NULL into a NVARCHAR with a
+unicode-enabled DBD::ODBC. Thanks to Jirka Novak and Pavel Richter who
+found, reported and patched a fix.
+
+Fixed serious bug in unicode_helper.c for utf16_len which I'm ashamed to say
+was using an unsigned short to return the length. This meant you could
+never have UTF16 strings of more than ~64K without risking serious
+problems. The DBD::ODBC test code actually got a
+
+*** glibc detected *** /usr/bin/perl: double free or corruption
+(out): 0x406dd008 ***
+
+If you use a UNICODE enabled DBD::ODBC (the default on Windows) and
+unicode strings larger than 64K you should definitely upgrade now.
+
+=head2 Changes in DBD::ODBC 1.21_1 June 2, 2009
+
+Fixed bug referred to in rt 46597 reported by taioba and identified by
+Tim Bunce. In Calls to bind_param for a given statement handle if you
+specify a SQL type to bind as, this should be "sticky" for that
+parameter. That means if you do:
+
+$sth->bind_param(1, $param, DBI::SQL_LONGVARCHAR)
+
+and follow it up with execute calls that also specify the parameter:
+
+$sth->execute("a param");
+
+then the parameter should stick with the SQL_LONGVARCHAR type and not
+revert to the default parameter type. The DBI docs (from 1.609)
+make it clear the parameter type is sticky for the duration of the
+statement but some DBDs allow the parameter to be rebound with a
+different type - DBD::ODBC is one of those drivers.
+
+=head2 Changes in DBD::ODBC 1.21 April 27, 2009
+
+Change 02simple test to output Perl, DBI and DBD::ODBC versions.
+
+Fixed bug where if ODBC driver supports SQLDescribeParam and it
+succeeds for a parameterised query but you override the parameter
+type, DBD::ODBC was still using the size returned by
+SQLDescribeParam. Thanks to Brian Becker for finding, diagnosing and
+fixing this issue.
+
+Added FAQ entry about SQL Server and calling procedures with named
+parameters out of order.
+
+Added test_results.txt containing some supplied make test results.
+
+=head2 Changes in DBD::ODBC 1.20 April 20, 2009
+
+Fix bug in handling of SQL_WLONGVARCHAR when not built with unicode
+support. The column was not identified as a long column and hence the
+size of the column was not restricted to LongReadLen. Can cause
+DBD::ODBC to attempt to allocate a huge amount of memory.
+
+Minor changes to Makefile.PL to help diagnose how it decided which
+driver manager to use and where it was found.
+
+Offer suggestion to debian-based systems when some of unixODBC is
+found (the bin part) but the development part is missing.
+
+In 20SqlServer.t attempt to drop any procedures we created if they
+still exist at the end of the test. Reported by Michael Higgins.
+
+In 12blob.t separate code to delete test table into sub and call at
+being and end, handle failures from prepare there were two ENDs.
+
+In ODBCTEST.pm when no acceptable test column type is found output all
+the found types and BAIL_OUT the entire test.
+
+Skip rt_39841.t unless actually using the SQL Server ODBC driver or
+native client.
+
+Handle drivers which return 0 for SQL_MAX_COLUMN_NAME_LEN.
+
+Double the buffer size used for column names if built with unicode.
+
+=head2 Changes in DBD::ODBC 1.19 April 2, 2009
+
+Some minor diagnostic output during tests when running against freeTDS
+to show we know of issues in freeTDS.
+
+Fixed issue in 20SqlServer.t where the connection string got set with
+two consecutive semi-colons. Most drivers don't mind this but freeTDS
+ignores everything after that point in the connection string.
+
+Quieten some delete table output during tests.
+
+Handle connect failures in 20SqlServer.t in the multiple active
+statement tests.
+
+In 02simple.t cope with ODBC drivers or databases that do not need a
+username or password (MS Access).
+
+In 20SqlServer.t fix skip count and an erroneous assignment for
+driver_name.
+
+Change some if tests to Test::More->is tests in 02simple.t.
+
+Fix "invalid precision" error during tests with the new ACEODBC.DLL MS
+Access driver. Same workaround applied for the old MS Access driver
+(ODBCJT32.DLL) some time ago.
+
+Fix out of memory error during tests against the new MS Access driver
+(ACEODBC.DLL). The problem appears to be that the new Access driver
+reports ridiculously large parameter sizes for "select ?" queries and
+there are some of these in the unicode round trip test.
+
+Fixed minor typo in Makefile.PL - diagnostic message mentioned "ODBC
+HOME" instead of ODBCHOME.
+
+12blob.t test somehow got lost from MANIFEST - replaced. Also changed
+algorithm to get a long char type column as some MS Access drivers
+only show SQL_WLONGVARCHAR type in unicode.
+
+Added diagnostic output to 02simple.t to show the state of
+odbc_has_unicode.
+
+=head2 Changes in DBD::ODBC 1.18_4 March 13, 2009
+
+A mistake in the MANIFEST lead to the rt_43384.t test being omitted.
+
+Brian Becker reported the tables PERL_DBD_39897 and PERL_DBD_TEST are
+left behind after testing. I've fixed the former but not the latter
+yet.
+
+Yet another variation on the changes for rt 43384. If the parameter is
+bound specifically as SQL_VARCHAR, you got invalid precision
+error. Thanks to Øystein Torget for finding this and helping me verify
+the fix.
+
+If you attempt to insert large amounts of data into MS Access (which
+does not have SQLDescribeParam) you can get an invalid precision error
+which can be worked around by setting the bind type to
+SQL_LONGVARCHAR. This version does that for you.
+
+08bind2.t had a wrong skip count.
+
+12blob.t had strict commented out and GetTypeInfo was not quoted. Also
+introduced a skip if the execute fails as it just leads to more
+obvious failures.
+
+In dbdimp.c/rebind_ph there was a specific workaround for SQL Server
+which was not done after testing if we are using SQL Server - this
+was breaking tests to MS Access.
+
+=head2 Changes in DBD::ODBC 1.18_2 March 9, 2009
+
+Added yet another workaround for the SQL Server Native Client driver
+version 2007.100.1600.22 and 2005.90.1399.00 (driver version
+09.00.1399) which leads to HY104, "Invalid precision value" in the
+rt_39841.t test.
+
+=head2 Changes in DBD::ODBC 1.18_1 March 6, 2009
+
+Fixed bug reported by Toni Salomäki leading to a describe failed error
+when calling procedures with no results. Test cases added to
+20SqlServer.t.
+
+Fixed bug rt 43384 reported by Øystein Torget where you cannot insert
+more than 127 characters into a Microsoft Access text(255) column when
+DBD::ODBC is built in unicode mode.
+
+=head2 Changes in DBD::ODBC 1.18 January 16, 2009
+
+Major release of all the 1.17 development releases below.
+
+=head2 Changes in DBD::ODBC 1.17_3 December 19, 2008
+
+Reinstated the answer in the FAQ for "Why do I get invalid value for
+cast specification" which had got lost - thanks to EvanCarroll in
+rt41663.
+
+rt 41713. Applied patch from JHF Remmelzwaal to handle ODBC drivers
+which do not support SQL_COLUMN_DISPLAY_SIZE and SQL_COLUMN_LENGTH
+attributes in the SQLColAttributes calls after SQLTables and
+SQLColumns. Specifically, the driver he was using was the "Infor
+Integration ODBC driver".
+
+Added notes from JHF Remmelzwaal on resolving some problems he came
+across building DBD::ODBC on Windows with Visual Studio 6.0 and SDK
+Feb 2003.
+
+New odbc_column_display_size attribute for when drivers does not
+return a display size.
+
+Loads of tracing changes to make it easier for me to debug problems.
+
+Fixed bug in tracing of dbd_execute when parameter is char but undef
+which was leading to an access violation on Windows when tracing
+enabled.
+
+Minor changes to diagnostic output in some rt tests.
+
+One of the rt tests was not skipping the correct number of tests if the
+driver was not SQL Server.
+
+=head2 Changes in DBD::ODBC 1.17_2 November 17, 2008
+
+Changed ParamTypes attribute to be as specification i.e.,
+
+ {
+ parameter_1 => {TYPE => sql_type}
+ parameter_2 => {TYPE => sql_type}
+ ...
+ }
+
+and changed the tests in 07bind.t to reflect this.
+
+A few minor perlcritic changes to ODBC.pm.
+
+Added 99_yaml.t test to check META.yml.
+
+Added patch from Spicy Jack to workaround problems with Strawberry
+Perl setting INC on the command line when running Makefile.PL.
+
+=head2 Changes in DBD::ODBC 1.17_1 October 10, 2008
+
+Missing newline from end of META.yml upsets cpan
+
+Add code to Makefile.PL to spot command line containing INC, outline
+problem and resolution and not generate Makefile to avoid cpan-testers
+failures.
+
+Loads of pod formatting changes including a section in the wrong place
+
+New kwalitee test
+
+Fix rt 39841. Bug in SQL Server ODBC driver which describes parameters
+by rearranging your SQL to do a select on the columns matching the
+parameters. Sometimes it gets this wrong and ends up describing the
+wrong column. This can lead to a varchar(10) being described with a
+column-size less than 10 and hence you get data truncation on execute.
+
+Added a test case for rt 39841.
+
+Fix rt 39897. 1.17 added support for varchar(max) in SQL Server
+but it broke support for SQL_VARCHAR columns in that they had LongReadLen
+and LongTruncOk applied to them. This means that in 1.16 you could retrieve
+a SQL_VARCHAR column without worrying about how long it was but in 1.17
+if the same column was greater than 80 characters then you would
+get a truncated error. The only way the around this was to set
+LongTruncOk or LongReadLen.
+
+Added a test case for rt 39897.
+
+=head2 Changes in DBD::ODBC 1.17 September 22, 2008
+
+In the absence of any bug reports since 1.16_4 this is the official
+1.17 release. See below for changes since 1.16.
+
+Minor pod changes.
+
+Added support for ParamTypes (see DBI spec) and notes in DBD::ODBC
+pod.
+
+=head2 Changes in DBD::ODBC 1.16_4 September 12, 2008
+
+Small change to Makefile.PL to work around problem in darwin 8 with
+iODBC which leads to "Symbol not found: _SQLGetPrivateProfileString"
+errors.
+
+Added new [n]varXXX(max) column type tests to 20SqlServer.t.
+
+Fixed support for SQL_WCHAR and SQL_WVARCHAR support in non-unicode
+build. These types had ended up only being included for unicode
+builds.
+
+More changes to ODBC pod to 1) encourage people to use CPAN::Reporter,
+2) rework contributing section, 3) mention DBIx::Log4perl 4) add a
+BUGS section 5) add a "ODBC Support in ODBC Drivers" section etc.
+
+Changed default fallback parameter bind type to SQL_WVARCHAR for
+unicode builds. This affects ODBC drivers which don't have
+SQLDescribeParam. Problem reported by Vasili Galka with MS Access when
+reading unicode data from one table and inserting it into another
+table. The read data was unicode but it was inserted as SQL_CHARs
+because SQLDescribeParam does not exist in MS Access so we fallback to
+either a default bind type (which was SQL_VARCHAR) or whatever was
+specified in the bind_param call.
+
+Fixed bug in 20SqlServer.t when DBI_DSN is defined including "DSN=".
+
+=head2 Changes in DBD::ODBC 1.16_3 September 3, 2008
+
+Changed Makefile.PL to add "-framework CoreFoundation" to linker line on
+OSX/darwin.
+
+Disallow building with iODBC if it is a unicode build.
+
+More tracing for odbcconnect flag.
+
+Fix bug in out connection string handling that attempted to use an out
+connection string when SQLDriverConnect[W] fails.
+
+Fixed yet more test count problems due to Test::NoWarnings not being
+installed.
+
+Skip private_attribute_info tests if DBI < 1.54
+
+About a 30% rewrite of bound parameter code which started with an
+attempt to support the new VARBINARY(MAX) and VARCHAR(MAX) columns in
+SQL Server when the parameter length is > 400K in size (see elsewhere
+in this Changelog). This is a seriously big change to DBD::ODBC to
+attempt to be a bit more clever in its handling of drivers which
+either do not support SQLDescribeParam or do support SQLDescribeParam
+but cannot describe all parameters e.g., MS SQL Server ODBC driver
+cannot describe "select ?, LEN(?)". If you specify the bound parameter
+type in your calls to bind_param and run them to an ODBC driver which
+supports SQLDescribeParam you may want to check carefully and probably
+remove the parameter type from the bind_param method call.
+
+Added rt_38977.t test to test suite to test varchar(max) and
+varbinary(max) columns in SQL Server.
+
+Moved most of README.unicode to ODBC.pm pod.
+
+Added workaround for problem with the Microsoft SQL Server driver when
+attempting to insert more than 400K into a varbinary(max) or
+varchar(max) column. Thanks to Julian Lishev for finding the problem
+and identifying 2 possible solutions.
+
+=head2 Changes in DBD::ODBC 1.16_2 September 2, 2008
+
+Removed szDummyBuffer field from imp_fbh_st and code in dbd_describe
+which clears it. It was never used so this was a waste of time.
+
+Changed the remaining calls to SQLAllocEnv, SQLAllocConnect and
+SQLAllocStmt and their respective free calls to the ODBC 3.0
+SQLAllocHandle and SQLFreeHandle equivalents.
+
+Rewrote ColAttributes code to understand string and numeric attributes
+rather than trying to guess by what the driver returns. If you see any
+change in behaviour in ColAttributes calls you'll have to let me know
+as there were a number of undocumented workarounds for drivers.
+
+Unicode build of DBD::ODBC now supports:
+
+=over
+
+=item column names
+
+The retrieval of unicode column names
+
+=item SQL strings
+
+Unicode in prepare strings (but not unicode parameter names) e.g.,
+
+ select unicode_column from unicode_table
+
+is fine but
+
+ select * from table where column = :unicode_param_name
+
+is not so stick to ascii parameter names if you use named parameters.
+
+Unicode SQL strings passed to the do method are supported.
+
+SQL strings passed to DBD::ODBC when the odbc_exec_direct attribute
+is set will B<not> be passed as unicode strings - this is a limitation of
+the odbc_exec_direct attribute.
+
+=item connection strings
+
+True unicode connection string support will require a new version
+of DBI (post 1.607).
+
+B<note> that even though unicode connection strings are
+not supported currently DBD::ODBC has had to be changed to call
+SQLDriverConnectW/SQLConnectW to indicate to the driver manager it's
+intention to use some of the ODBC wide APIs. This only affects DBD::ODBC
+when built for unicode.
+
+=item odbcunicode trace flag
+
+There is a new odbcunicode trace flag to enable unicode-specific
+tracing.
+
+=back
+
+Skipped 40Unicode.t test if the ODBC driver is Oracle's ODBC as I
+cannot make it work.
+
+Changes internally to use sv_utf8_decode (where defined) instead of
+setting utf8 flag.
+
+Fix problems in the test when Test::NoWarnings is not installed.
+
+Removed some unused variables that were leading to compiler warnings.
+
+Changed a lot of tracing to use new odbcconnection flag
+
+Changed to use dbd_db_login6_sv if DBI supports it.
+
+Commented out a diag in 20SqlServer.t that was leading to confusion.
+
+Added diag to 20SqlServer.t in mars test to explain why it may fail.
+
+Various pod changes for clarification and to note odbc_err_handler is
+deprecated.
+
+Removed odbcdev trace flag - it was not really used.
+
+New odbc_out_connect_string attribute for connections which returns
+the ODBC driver out connection string.
+
+=head2 Changes in DBD::ODBC 1.16_1 August 28, 2008
+
+Fixed bug in odbc_cancel which was checking the ACTIVE flag was on
+before calling SQLCancel. Non-select statements can also be cancelled
+so this was wrong. Thanks to Dean Arnold for spotting.
+
+Minor changes to test 01base to attempt to catch install_driver
+failing, report it as a fail and skip other tests.
+
+Fixed bug reported by James K. Lowden with asynchronous mode and
+SQLParamData where the code was not expecting SQL_STILL_EXECUTING and
+did not handle it
+
+Added odbc_putdata_start attribute to determine when to start using
+SQLPutData on lobs.
+
+Fixed bug in lob inserts where decimal_digits was being set to the
+size of the bound lob unnecessarily.
+
+Minor change to connect/login code to delete driver-specific attributes
+passed to connect so they do not have to be processed again when DBI
+calls STORE with them.
+
+New 12blob.t test.
+
+A lot of code tidy up but not expecting any real benefit or detriment
+when using DBD::ODBC.
+
+Fixed retrieving [n]varchar(max) columns which were only returning 1
+byte - thanks to Fumiaki Yoshimatsu and perl monks for finding it.
+See http://markmail.org/message/fiym5r7q22oqlzsf#query:Fumiaki Yoshimatsu odbc+page:1+mid:fiym5r7q22oqlzsf+state:results
+
+Various minor changes to get the CPANTS kwalitee score up.
+ fixed pod issues in FAQ.pm
+ moved mytest dir to examples
+ added generated_by and requires perl version to META.yml
+ added pod and pod-coverage tests
+ removed executable flag from Makefile.PL
+ added use warnings to some modules and tests
+ fixed pod errors in ODBC.pm
+ added AUTHOR and LICENSE section to ODBC.pm
+ added Test::NoWarnings to tests
+
+Added support for setting the new(ish) DBI ReadOnly attribute on a
+connection. See notes in pod.
+
+Changes to test suite to work around problems in Oracle's instant
+client 11r1 ODBC driver for Linux (SQLColAttributes problems - see
+02simple.t).
+
+New tests in 30Oracle.t for oracle procedures.
+
+=head2 Changes in DBD::ODBC 1.16 May 13, 2008
+
+=head3 Test Changes
+
+Small change to the last test in 10handler.t to cope with the prepare
+failing instead of the execute failing - spotted by Andrei Kovalevski
+with the ODBCng Postgres driver.
+
+Changed the 20SqlServer.t test to specifically disable MARS for the
+test to check multiple active statements and added a new test to check
+that when MARS_Connection is enabled multiple active statements are
+allowed.
+
+Changed the 09multi.t test to use ; as a SQL statement seperator
+instead of a newline.
+
+A few minor "use of unitialised" fixes in tests when a test fails.
+
+In 02simple.t Output DBMS_NAME/VER, DRIVER_NAME/VER as useful
+debugging aid when cpan testers report a fail.
+
+2 new tests for odbc_query_timeout added to 03dbatt.t.
+
+Changed 02simple.t test which did not work for Oracle due to a "select
+1" in the test. Test changed to do "select 1 from dual" for Oracle.
+
+New tests for numbered and named placeholders.
+
+=head3 Documentation Changes
+
+Added references to DBD::ODBC ohloh listing and markmail archives.
+
+Added Tracing sections.
+
+Added "Deviations from the DBI specification" section.
+
+Moved the FAQ entries from ODBC.pm to new FAQ document. You can view
+the FAQ with perldoc DBD::ODBC::FAQ.
+
+Added provisional README.windows document.
+
+Rewrote pod for odbc_query_timeout.
+
+Added a README.osx.
+
+=head3 Internal Changes
+
+More tracing in dbdimp.c for named parameters.
+
+#ifdeffed out odbc_get_primary_keys in dbdimp.c as it is no longer
+used. $h->func($catalog, $schema, $table, 'GetPrimaryKeys') ends up
+in dbdimp.c/dbd_st_primary_keys now.
+
+Reformatted dbdimp.c to avoid going over 80 columns.
+
+Tracing changed. Levels reviewed and changed in many cases avoiding levels 1
+and 2 which are reserved for DBI. Now using DBIc_TRACE macro internally.
+Also tracing SQL when 'SQL' flag set.
+
+=head3 Build Changes
+
+Changes to Makefile.PL to fix a newly introduced bug with 'tr', remove
+easysoft OOB detection and to try and use odbc_config and odbcinst if
+we find them to aid automatic configuration. This latter change also
+adds "odbc_config --cflags" to the CC line when building DBD::ODBC.
+
+Avoid warning when testing ExtUtils::MakeMaker version and it is a
+test release with an underscore in the version.
+
+=head3 Functionality Changes
+
+Added support for parse_trace_flag and parse_trace_flags methods and
+defined a DBD::ODBC private flag 'odbcdev' as a test case.
+
+Add support for the 'SQL' trace type. Added private trace type odbcdev
+as an experimental start.
+
+Change odbc_query_timeout attribute handling so if it is set to 0
+after having set it to a non-zero value the default of no time out is
+restored.
+
+Added support for DBI's statistics_info method.
+
+=head3 Bug Fixes
+
+Fix bug in support for named placeholders leading to error "Can't
+rebind placeholder" when there is more than one named placeholder.
+
+Guard against scripts attempting to use a named placeholder more than
+once in a single SQL statement.
+
+If you called some methods after disconnecting (e.g., prepare/do and
+any of the DBD::ODBC specific methods via "func") then no error was
+generated.
+
+Fixed issue with use of true/false as fields names in structure on MAC
+OS X 10.5 (Leopard) thanks to Hayden Stainsby.
+
+Remove tracing of bound wide characters as it relies on
+null-terminated strings that don't exist.
+
+Fix issue causing a problem with repeatedly executing a stored
+procedure which returns no result-set. SQLMoreResults was only called
+on the first execute and some drivers (SQL Server) insist a procedure
+is not finished until SQLMoreResults returns SQL_NO_DATA.
+
+=head2 Changes in DBD::ODBC 1.15 January 29, 2008
+
+1.15 final release.
+
+Fixed bug reported by Toni Salomaki where DBD::ODBC may call
+SQLNumResultCols after SQLMoreResults returns SQL_NO_DATA. It led to
+the error:
+
+Describe failed during DBI::st=HASH(0x19c2048)->FETCH(NUM_OF_FIELDS,0)
+
+when NUM_OF_FIELDS was referenced in the Perl script.
+
+Updated odbc_exec_direct documentation to describe its requirement
+when creating temporary objects in SQL Server.
+
+Added FAQ on SQL Server temporary tables.
+
+Fixed bug in dbdimp.c which was using SQL_WCHAR without testing it was
+defined - thanks Jergen Dutch.
+
+Fixed use of "our" in UCHelp.pm which fails on older Perls.
+
+Minor changes to 02simple.t and 03dbatt.t to fix diagnostics output
+and help debug DBD which does not handle long data properly.
+
+Further changes to Makefile.PL to avoid change in behavior of
+ExtUtils::MakeMaker wrt order of execution of PREREQ_PM and CONFIGURE.
+Now if DBI::DBD is not installed we just warn and exit 0 to avoid a
+cpan-testers failure.
+
+=head2 Changes in DBD::ODBC 1.15_2 November 14, 2007
+
+Fix bug in DBD::ODBC's private function data_sources which was
+returning data sources prefixed with "DBI:ODBC" instead of "dbi:ODBC".
+
+If you don't have at least DBI 1.21 it is now a fatal error instead of
+just a warning.
+
+DBI->connect changed so informational diagnostics like "Changed
+database context to 'master'" from SQL Server are available in
+errstr/state. These don't cause DBI->connect to die but you can test
+$h->err eq "" after connect and obtain the informational diagnostics
+from errstr/state if you want them.
+
+Fixed problem in 41Unicode.t where utf8 was used before testing we had
+a recent enough Perl - thank you cpan testers.
+
+Changed "our" back to "my" in Makefile.PL - thank you cpan testers.
+
+Removed all calls to DBIh_EVENT2 in dbdimp.c as it is no longer used
+(see posts on dbi-dev).
+
+Changed text output when a driver manager is not found to stop
+referring to iodbcsrc which is no longer included with DBD::ODBC.
+
+Changed Makefile.PL to attempt to find unixODBC if -o or ODBCHOME not
+specified.
+
+Updated META.yml based on new 1.2 spec.
+
+Changed Makefile.PL so if an ODBC driver manager is not found then we
+issue warning and exit cleanly but not generating a Makefile. This
+should stop cpan-testers from flagging a fail because they haven't got
+an ODBC driver manager.
+
+Changed Makefile.PL so it no longer "use"s DBI/DBI::DBD because this
+makes cpan-testers log a fail if DBI is not installed. Changed to put
+the DBI::DBD use in the CONFIGURE sub so PREREQ_PM will filter out
+machines where DBI is not installed.
+
+Fix a possible typo, used once in 10handler.t.
+
+=head2 Changes in DBD::ODBC 1.15_1 November 6, 2007
+
+Minor changes to 20SqlServer.t test for SQL Server 2008 (Katmai).
+Timestamps now return an extra 4 digits of precision (all 0000) and
+the driver reported in dbcc messages has a '.' in the version which
+was not handled.
+
+New FAQ entry and test code for "Datetime field overflow" problem in
+Oracle.
+
+Changed all ODBC code to use new SQLLEN/SQLULEN types where
+Microsoft's headers indicate, principally so DBD::ODBC builds and
+works on win64. NOTE: you will need an ODBC Driver Manager on UNIX
+which knows SQLLEN/SQLULEN types. The unixODBC driver manager uses
+SQLLEN/SQLULEN in versions from at least 2.2.12. Thanks to Nelson
+Oliveira for finding, patching and testing this and then fixing
+problems with bound parameters on 64 bit Windows.
+
+Added private_attribute_info method DBI introduced (see DBI docs)
+and test cases to 02simple.t.
+
+Fairly major changes to dbd_describe in dbdimp.c to reduce ODBC calls
+by 1 SQLDescribeCol call per column when describing result
+sets. Instead of calculating the amount of memory required to hold
+every column name we work on the basis that (num_columns + 1) *
+SQL_MAX_COLUMN_NAME_LEN can hold all column names. However, to avoid
+using a large amount of memory unnecessarily if an ODBC driver
+supports massive column name lengths the maximum size per column is
+restricted to 256.
+
+Changed to avoid using explicit use of DBIc_ERRXXX in favour of newish
+(ok, DBD::ODBC is a bit behind the times in this respect)
+DBIh_SET_ERR_CHAR. This involved a reworking or the error handling
+and although all test cases still pass I cannot guarantee it has no
+other effects - please let me know if you spot differences in error
+messages.
+
+Fixed bug in 20SqlServer test for multiple results that was passing
+but for the wrong reason (namely, that the odbc_err_handler was being
+called when it should not have been).
+
+Fixed bug in odbc_err_handler that prevented it from being reset so
+you don't have an error handler. Looks like the problem was in
+dbd_db_STORE_attrib where "if(valuesv == &PL_sv_undef)" was used to
+detect undef and I think it should be "if (!SvOK(valuesv))".
+
+Improvements to odbc_err_handler documentation.
+
+Added 10handler.t test cases.
+
+More tests in 02simple.t to check NUM_OF_FIELDS and NAMES_uc.
+
+Bit of a tidy up:
+
+Removed some unused variable declarations from dbdimp.c.
+
+Lots of changes to DBD::ODBC tracing, particularly in dbd_describe,
+and dbd_error2 and login6.
+
+Removed a lot of tracing code in comments or #if 0 as it never gets
+built.
+
+Changed dual tests on SQL_SUCCESS and SQL_SUCCESS_WITH_INFO to use
+SQL_SUCCEEDED.
+
+=head2 Changes in DBD::ODBC 1.14 July 17, 2007
+
+Fix bug reported where ping crashes after disconnect thanks to Steffen
+Goeldner.
+
+Fix bug in dbd_bind_ph which leads to the error Can't change param 1
+maxlen (51->50) after first bind in the 20SqlServer test. This is
+caused by svGROW in Perl 5.8.8 being changed to possibly grow by more
+than you asked (e.g. up to the next longword boundary).
+
+Fix problem with binding undef as an output parameter. Reported by
+Stephen More with IBM's ODBC driver for iSeries.
+
+Removed comment delimiters in comments in dbdimp.h leading to warnings.
+
+Removed some unused variable declarations leading to warnings.
+
+Removed PerlIO_flush calls as it is believed they are not required.
+
+Add logging for whether SQLDescribeParam is supported.
+
+Fixed use of unitialised variable in dbd_bind_ph where an undef is
+bound and tracing is enabled.
+
+Fixed issue with TRACESTATUS change in 20SqlServer.t tests 28, 31, 32
+and 33 leading to those tests failing when testing with SQL Server
+2005 or Express.
+
+Many compiler warnings fixed - especially for incompatible types.
+
+Add provisional Unicode support - thanks to Alexander Foken. This
+change is very experimental (especially on UNIX). Please see ODBC.pm
+documentation. Also see README.unicode and README.af. New database
+attribute odbc_has_unicode to test if DBD::ODBC was built with UNICODE
+support. New tests for Unicode. New requirement for Perl 5.8.1 if
+Unicode support required. New -[no]u argument to Makefile.PL. New
+warning in Makefile.PL if Unicode support built for UNIX.
+
+Fix use of unitialised var in Makefile.PL.
+
+Fix use of scalar with no effect on Makefile.PL
+
+Added warning to Makefile.PL about building/running with LANG using
+UTF8.
+
+Added warning to Makefile.PL about using thread-safe ODBC drivers.
+
+Updated MANIFEST to include more test code from mytest and remove
+MANIFEST.SKIP etc.
+
+Removed calls to get ODBC errors when SQLMoreResults returns SQL_NO_DATA.
+These are a waste of time since SQL_NO_DATA is expected and there is no
+error diagnostic to retrieve.
+
+Changes to test 17 of 02simple.t which got "not ok 17 - Col count
+matches correct col count" errors with some Postgres ODBC
+drivers. Caused by test expecting column names to come back
+uppercase. Fixes by uppercasing returned column names.
+
+Changes to tests in 03batt.t which correctly expects an ODBC 3 driver
+to return the column names in SQLTables result-set as per ODBC 3.0
+spec. Postgres which reports itself as an ODBC 3.0 driver seems to
+return the ODBC 2 defined column names. Changed tests to catch ODBC
+2.0 names are pass test put issue warning.
+
+For postgres skip test (with warning) checking $sth->{NAME} returns
+empty listafter execute on update
+
+Updated FAQ, added a few more questions etc.
+
+DBD::ODBC requires at least 5.6.0 of Perl.
+
+Many updates to pod documentation.
+
+Removed some dead HTTP links in the pod I could not find equivalents for -
+ let me know if you have working replacements for ones removed
+
+Add some HTTP links to useful tutorials on DBD::ODBC
+
+=head2 Changes in DBD::ODBC 1.13 November 8, 2004
+
+Fix inconsistency/bug with odbc_exec_direct vs. odbc_execdirect settings. Now made consistent with
+odbc_exec_direct. For now, will still look for odbc_execdirect in prepare, but not as DBH attribute
+as a backup (which is what it was doing), but that support will be dropped at some time in the future.
+Please use odbc_exec_direct from now on...
+
+Fix handling of print statements for SQL Server thanks to Martin Evans! Thanks for all your work on this!
+Due to bug in SQL Server, you must use odbc_exec_direct. See t/20SqlServer.t for example. You will need
+to call $sth->{odbc_more_results} to clear out any trailing messages.
+
+Change tests to use Test::More. Whew, that's much nicer!
+
+Fix Oracle integral/numeric output params so that warning not printed about value not being numeric (even though it is!)
+
+=head2 Changes in DBD::ODBC 1.12 October 26, 2004
+
+Fix bug with odbc_execdirect attributed thanks to Martin Evans
+Fix bug(s) with odbc_query_timeout and tested with SQL*Server.
+Oracle tests failed with setting timeout. Probably not handled by Oracle's ODBC driver
+
+=head2 Changes in DBD::ODBC 1.11 October 11, 2004
+
+Added odbc_timeout, but untested
+
+=head2 Changes in DBD::ODBC 1.10 September 8, 2004
+
+Fixed bug in Makefile.PL.
+Added pod.t test, taken from DBI.
+Fixed various small POD issues, discovered during the pod test.
+Fixed bug in bind_param_inout
+
+=head2 Changes in DBD::ODBC 1.09 March 10, 2004
+
+Duh. I forgot to add new dbivport.h to MANIFEST and SVN before submitting. Fixed.
+
+=head2 Changes in DBD::ODBC 1.08 March 6, 2004
+
+Added check in Makefile.PL to detect if the environment variable LANG is
+Set. If so, prints a warning about potential makefile generation issues.
+Change to use dbivport.h per new DBI spec.
+Add ability to set the cursor type during the connect. This may allow some servers
+which do not support multiple concurrent statements to permit them --
+tested with SQL Server. Thanks to Martin Busik!
+See odbc_cursortype information in the ODBC POD.
+
+
+=head2 Changes in DBD::ODBC 1.07 February 19, 2004
+
+Added to Subversion version control hosted by perl.org. Thanks Robert! See ODBC.pm POD for more information.
+Added contributing section to ODBC.pm POD -- see more details there!
+Added parameter to odbc_errhandler for the NativeError -- thanks to Martin Busik.
+Fix for Makefile.PL not having tab in front of $(NOOP) (Finally).
+Fix for SQLForeignKeys thanks to Kevin Shepherd.
+
+=head2 Changes in DBD::ODBC 1.06 June 19, 2003
+
+Fixed test in t/02simple.t to skip if the DSN defined by the user has DSN= in it.
+Added tests for wrong DSN, ensuring the DBI::errstr is appropriately set.
+Fixed small issue in Makefile.PL for Unix systems thanks to H.Merijn Brand.
+Update to NOT copy user id and password to connect string if UID or PWD parameter in connect string.
+Updated Makefile.PL for dmake, per patch by Steffen Goldner. Thanks Steffen!
+
+=head2 Changes in DBD::ODBC 1.05 March 14, 2003
+
+Cleaned up Makefile.PL and added Informix support thanks to Jonathan Leffler (see README.informix)
+Added nicer error message when attempting to do anything while the database is disconnected.
+Fixed fetchrow_hashref('NAME_uc | NAME_lc') with odbc_more_results.
+Added exporter to allow perl -MDBD::ODBC=9999 command line to determine version
+Fixed for building with DBI 1.33 and greater
+Removed all C++ style comments
+Ensured files are in Unix format, with the exception of the README type information and Makefile.PL
+
+=head2 Changes in DBD::ODBC 1.04 January 24, 2003
+
+It seems that case insensitive string comparison with a limit causes problems for
+multiple platforms. strncmpi, strncasecmp, _strcmpin are all functions hit and
+it seems to be a hit-or-miss. Hence, I rewrote it to upper case the string
+then do strncmp, which should be safe...sheesh. A simple thing turned into
+a headache...
+
+=head2 Changes in DBD::ODBC 1.03 January 17, 2003
+
+Add automatic detection of DRIVER= or DSN= to add user id and password to
+connect string.
+
+
+=head2 Changes in DBD::ODBC 1.02 January 6, 2003
+
+Fix to call finish() automatically if execute is re-called in a loop
+(and test in t/02simple.t to ensure it's fixed)
+
+Augmented error message when longs are truncated to help users determine where
+to look for help.
+
+Fixes for build under Win32 with Perl5.8.
+
+
+=head2 Changes in DBD::ODBC 1.01 December 9, 2002
+
+Forgot to fix require DBI 1.201 in ODBC.pm to work for perl 5.8. Fixed
+
+=head2 Changes in DBD::ODBC 1.00 December 8, 2002
+
+(Please see all changes since version 0.43)
+
+Updated Makefile.PL to handle SQL_Wxxx types correctly with unixODBC and linking
+directly with EasySoft OOB. Note that I could not find where iODBC defines SQL_WLONG_VARCHAR,
+so I'm not sure it's fixed on all other platforms. Should not have been a problem under
+Win32...
+
+Found that the fix in _18 was only enabled if debug enabled and it broke something else.
+removed the fix.
+
+Updated Makefile.PL to use DBI version 1.21 instead of 1.201 to facilitate builds under
+latest development versions of Perl.
+
+Updated code to use the *greater* of the column display size and the column length for
+allocating column buffers. This *should* workaround a problem with DBD::ODBC and the
+Universe database.
+
+Added code thanks to Michael Riber to handle SQLExecDirect instead of SQLPrepare. There are
+two ways to get this:
+
+ $dbh->prepare($sql, { odbc_execdirect => 1});
+ and
+ $dbh->{odbc_execdirect} = 1;
+
+When $dbh->prepare() is called with the attribute "ExecDirect" set to a non-zero value
+dbd_st_prepare do NOT call SQLPrepare, but set the sth flag odbc_exec_direct to 1.
+
+Fixed numeric value binding when binding non-integral values. Now lets the driver
+or the database handle the conversion.
+
+Fixed makefile.pl generation of makefile to force the ODBC directory first in the
+include list to help those installing ODBC driver managers on systems which
+already have ODBC drivers in their standard include path.
+
+=head2 Changes in DBD::ODBC 0.45_18 September 26, 2002
+
+Updated MANIFEST to include more of the mytest/* files (examples, tests)
+Fixed problem when attempting to get NUM_OF_FIELDS after execute returns no rows/columns.
+
+=head2 Changes in DBD::ODBC 0.45_17 August 26, 2002
+
+More fixes for multiple result sets. Needed to clear the DBIc_FIELDS_AV
+when re-executing the multiple-result set stored procedure/query.
+
+=head2 Changes in DBD::ODBC 0.45_16 August 26, 2002
+
+Updated to fix output parameters with multiple result sets. The output
+parameters are not set until the last result set has been retrieved.
+
+=head2 Changes in DBD::ODBC 0.45_15 August 20, 2002
+
+Updated for new DBIc_STATE macros (all debug, as it turned out) to be thread safer in the long run
+
+Updated for the new DBIc_LOGFP macros
+
+Added CLONE method
+
+Fix for SQL Server where multiple result sets being returned from a stored proc,
+where one of the result sets was empty (insert/update).
+
+Added new attribute odbc_force_rebind, which forces DBD::ODBC to
+check recheck for new result sets every execute. This is only
+really necessary if you have a stored procedure which returns different
+result sets with each execute, given the same "prepare". Many times
+this will be automatically set by DBD::ODBC, however, if there is only
+one result set in the stored proc, but it can differ with each call,
+then DBD::ODBC will not know to set it.
+
+Updated the DBD::ODBC POD documentation to document DBD::ODBC
+private attributes and usage.
+
+=head2 Changes in DBD::ODBC 0.45_14 August 13, 2002
+
+Added support to handle (better) DBI begin_work().
+
+Fix for binding undef parameters on SQL Server.
+
+Fix bug when connecting twice in the same script. Trying to set the environment ODBC version
+twice against the same henv caused an error.
+
+=head2 Changes in DBD::ODBC 0.45_13 August 9, 2002
+
+Workaround problem with iODBC where SQLAllocHandleStd is not present in iODBC.
+Made Changes file accessible via perldoc DBD::ODBC::Changes. In the near future
+the change log will be removed from here and put in changes to tidy up a bit.
+
+=head2 Changes in DBD::ODBC 0.45_12 August 9, 2002
+
+Fixed global destruction access violation (which was seemingly random).
+
+=head2 Changes in DBD::ODBC 0.45_11 August 8, 2002
+
+Updated manifest to include more samples.
+Working on checking for leaks on Linux, where I might get more information about
+the process memory.
+
+Working on fixing problems with MS SQL Server binding parameters. It seems that SQLServer
+gets "confused" if you bind a NULL first. In "older" (SQLServer 2000 initial release) versions
+of the driver, it would truncate char fields. In "newer" versions of the SQL Server
+driver, it seems to only truncate dates (actually, round them to the nearest minute). If you have
+problems in the SQL Server tests, please upgrade your driver to the latest version on
+Microsoft's website (MDAC 2.7 or above) http://www.microsoft.com/data
+
+=head2 Changes in DBD::ODBC 0.45_10 July 30, 2002
+
+Added database specific tests to ensure things are working. Some of the tests may
+not work for all people or may not be desirable. I have tried to keep them as
+safe as possible, but if they don't work, please let me know.
+
+Added support for the internal function GetFunctions to handle ODBC 3's
+SQL_API_ODBC3_ALL_FUNCTIONS. Would have caused a memory overwrite on the
+stack if it was called.
+
+
+=head2 Changes in DBD::ODBC 0.45_9 July 30, 2002
+
+Fixed bug in procedure handling for SQLServer. Was not re-describing the result sets
+if the SQLMoreResults in the execute needs to be called.
+
+=head2 Changes in DBD::ODBC 0.45_8 July 25, 2002
+
+Fixed bug in tracing code when binding an undef parameter which did not
+happen to have a valid buffer with tracing level >= 2
+
+Fixed bug when binding undef after a valid data bind on a timestamp. The
+Scale value was being calculated based upon the string that had been bound
+prior to the bind of the undef and if that had a sub-second value, then
+the scale would be set to the wrong value...I.e.
+
+ bind_param(1, '2000-05-17 00:01:00.250', SQL_TYPE_TIMESTAMP) then
+ execute
+ bind_param(1, undef, SQL_TYPE_TIMESTAMP) then
+
+Fixed SQL Server issue when binding a null and the length was set to 0 instead of 1
+
+=head2 Changes in DBD::ODBC 0.45_7 July 25, 2002
+
+Adding support for array binding, but not finished.
+
+Fixed bug where SqlServer Stored procedures which perform INSERT would not correctly
+return a result set. Thanks to Joe Tebelskis for finding it and Martin Evans for
+supplying a fix.
+
+Fixed bug where binding the empty string would cuase a problem. Fixed and added
+test in t/07bind.t.
+
+=head2 Changes in DBD::ODBC 0.45_6 July 24, 2002
+
+Added support for new DBI ParamValues feature.
+
+=head2 Changes in DBD::ODBC 0.45_5 July 23, 2002
+
+Added odbc_err_handler and odbc_async_exec thanks to patches by David L. Good.
+See example in mytest/testerrhandler.pl
+
+Here's the notes about it:
+
+ I've implemented two separate functions. The first is an "error
+ handler" similar to that in DBD::Sybase. The error handler can be used
+ to intercept error and status messages from the server. It is the only
+ way (at least currently) that you can retrieve non-error status messages
+ when execution is successful.
+
+ To use the error handler, set the "odbc_err_handler" attribute on
+ your database handle to a reference to a subroutine that will act
+ as the error handler. This subroutine will be passed two args, the
+ SQLSTATE and the error message. If the subroutine returns 0, the
+ error message will be otherwise ignored. If it returns non-zero,
+ the error message will be processed normally.
+
+ The second function implemented is asynchronous execution. It's only
+ useful for retrieving server messages with an error handler during an
+ execute() that takes a long time (such as a DBCC on a large database) ODBC
+ doesn't have the concept of a callback routine like Sybase's DBlib/CTlib
+ does, so asynchronous execution is needed to be able to get the server
+ messages before the SQL statement is done processing.
+
+ To use asynchronous execution, set the "odbc_async_exec" attribute on
+ your database handle to 1. Not all ODBC drivers support asynchronous
+ execution. To see if yours does, set odbc_async_exec to 1 and then check
+ it's value. If the value is 1, your ODBC driver can do asynchronous
+ execution. If the value is 0, your ODBC driver cannot.
+
+=head2 Changes in DBD::ODBC 0.45_4 July 22, 2002
+
+More fixes for DB2 tests and timestamp handling.
+
+=head2 Changes in DBD::ODBC 0.45_3 July 22, 2002
+
+Changes to internal timestamp type handling and test structure to ensure tests
+work for all platforms. DB2 was giving me fits due to bad assumptions. Thanks
+to Martin Evans (again) for help in identifying the problems and helping research
+solutions. This includes the scale/precision values to correctly store full timestamps.
+
+=head2 Changes in DBD::ODBC 0.45_2 July 19, 2002
+
+Moving API usage to ODBC 3.0 specifications. With lots of help from Martin Evans (again!).
+Thanks Martin!!!!!
+
+=head2 Changes in DBD::ODBC 0.44 July 18, 2002
+
+.44 was never officially released.
+Fix for do() and execute to handle DB2 correctly. Patch/discovery thanks to Martin Evans.
+Partly moving towards defaulting to ODBC 3.x standards.
+
+=head2 Changes in DBD::ODBC 0.43 July 18, 2002
+
+Fix for FoxPro (and potentially other) Drivers!!!!!
+
+Add support for DBI column_info
+
+Fix for binding undef value which comes from dereferencing hash
+
+Fix to make all bound columns word (int) aligned in the buffer.
+
+=head2 Changes in DBD::ODBC 0.42 July 8, 2002
+
+Added patches to the tests to support ActiveState's automated build process.
+
+Fix ping() to try SQLTables for a test, instead of a strange query.
+
+=head2 Changes in DBD::ODBC 0.41 April 15, 2002
+
+Fixed problem where SQLDescribeParam would fail (probably
+bug in ODBC driver). Now reverts to SQL_VARCHAR if that
+happens, instead of failing the query.
+
+Fixed error report when using Oracle's driver. There is
+a known problem. Left the error on the test, but added
+warning indicating it's a known problem.
+
+=head2 Changes in DBD::ODBC 0.40 April 12, 2002
+
+Most significant change is the change in the default binding
+type which forces DBD::ODBC to attempt to determine the bind
+type if one is not passed. I decided to make this the default
+behavior to make things as simple as possible.
+
+Fixed connection code put in 0.39 to work correctly.
+
+Two minor patches for building, one for Cygwin one
+if both iODBC and unixODBC libraries are installed.
+Probably need better command line on this, but if
+someone has the problem, please let me know (and
+hopefully send a patch with it).
+
+=head2 Changes in DBD::ODBC 0.39 March 12, 2002
+
+See mytest/longbin.pl for demonstration of inserting and retrieving
+long binary files to/from the db. Uses MD5 algorithm to verify data.
+Please do some similar test(s) with your database before using it
+in production. The various bind types are different for each database!
+
+Finally removed distribution of old iODBC. See www.iodbc.org or
+www.unixodbc.org for newer/better versions of the ODBC driver
+manager for Unix (and others?).
+
+Added ability to force ODBC environment version.
+
+Fix to SQLColAttributes.
+
+Changes to connect sequence to provide better error
+messages for those using DSN-less connections.
+
+=head2 Changes in DBD::ODBC 0.38 February 12, 2002
+
+Fixed do function (again) thanks to work by Martin Evans.
+
+=head2 Changes in DBD::ODBC 0.37 February 10, 2002
+
+Patches for get_info where return type is string. Patches
+thanks to Steffen Goldner. Thanks Steffen!
+
+Patched get_info to NOT attempt to get data for SQL_DRIVER_HSTMT
+and SQL_DRIVER_HDESC as they expect data in and have limited value
+(IMHO).
+
+Further fixed build for ODBC 2.x drivers. The new SQLExecDirect
+code had SQLAllocHandle which is a 3.x function, not a 2.x function.
+Sigh. I should have caught that the first time. Signed, the Mad-and-
+not-thorough-enough-patcher.
+
+Additionally, a random core dump occurred in the tests, based upon the
+new SQLExecDirect code. This has been fixed.
+
+
+=head2 Changes in DBD::ODBC 0.36 February 10, 2002
+
+Fixed build for ODBC 2.x drivers. The new SQLExecDirect code
+had SQLFreeHandle which is a 3.x function, not a 2.x function.
+
+=head2 Changes in DBD::ODBC 0.35 February 9, 2002
+
+Fixed (finally) multiple result sets with differing
+numbers of columns. The final fix was to call
+SQLFreeStmt(SQL_UNBIND) before repreparing
+the statement for the next query.
+
+Added more to the multi-statement tests to ensure
+the data retrieved was what was expected.
+
+Now, DBD::ODBC overrides DBI's do to call SQLExecDirect
+for simple statements (those without parameters).
+Please advise if you run into problems. Hopefully,
+this will provide some small speed improvement for
+simple "do" statements. You can also call
+$dbh->func($stmt, ExecDirect). I'm not sure this has
+great value unless you need to ensure SQLExecDirect
+is being called. Patches thanks to Merijn Broeren.
+Thanks Merijn!
+
+=head2 Changes in DBD::ODBC 0.34 February 7, 2002
+
+Further revamped tests to attempt to determine if SQLDescribeParam
+will work to handle the binding types. The t/08bind.t attempts
+to determine if SQLDescribeParam is supported. note that Oracle's
+ODBC driver under NT doesn't work correctly when binding dates
+using the ODBC date formatting {d } or {ts }. So, test #3 will
+fail in t/08bind.t
+
+New support for primary_key_info thanks to patches by Martin Evans.
+New support for catalog, schema, table and table_type in table_info
+thanks to Martin Evans. Thanks Martin for your work and your
+continuing testing, suggestions and general support!
+
+Support for upcoming dbi get_info.
+
+=head2 Changes in DBD::ODBC 0.33_3 February 4, 2002
+
+Revamped tests to include tests for multiple result sets.
+The tests are ODBC driver platform specific and will be skipped
+for drivers which do not support multiple result sets.
+
+=head2 Changes in DBD::ODBC 0.33_2 February 4, 2002
+
+Finally tested new binding techniques with SQL Server 2000,
+but there is a nice little bug in their MDAC and ODBC
+drivers according to the knowledge base article # Q273813, titled
+
+ "FIX: "Incorrect Syntax near the Keyword 'by' "
+ Error Message with Column Names of "C", "CA" or "CAS" (Q273813)
+
+DBD::ODBC now does not name any of the columns A, B, C, or D
+they are now COL_A, COL_B, COL_C, COL_D.
+
+ *** NOTE: *** I AM STRONGLY CONSIDERING MAKING THE NEW
+ BINDING the default for future versions. I do not believe
+ it will break much existing code (if any) as anyone binding
+ to non VARCHAR (without the ODBC driver doing a good conversion
+ from the VARCHAR) will have a problem. It may be subtle, however,
+ since much code will work, but say, binding dates may not with
+ some drivers.
+
+ Please comment soon...
+
+=head2 Changes in DBD::ODBC 0.33_1 February 4, 2002
+
+*** WARNING: ***
+
+ Changes to the binding code to allow the use of SQLDescribeParam
+ to determine if the type of column being bound. This is
+ experimental and activated by setting
+
+ $dbh->{odbc_default_bind_type} = 0; # before creating the query...
+
+Currently the default value of odbc_default_bind_type = SQL_VARCHAR
+which mimicks the current behavior. If you set
+odbc_default_bind_type to 0, then SQLDescribeParam will be
+called to determine the columen type. Not ALL databases
+handle this correctly. For example, Oracle returns
+SQL_VARCHAR for all types and attempts to convert to the
+correct type for us. However, if you use the ODBC escaped
+date/time format such as: {ts '1998-05-13 00:01:00'} then
+Oracle complains. If you bind this with a SQL_TIMESTAMP type,
+however, Oracle's ODBC driver will parse the time/date correctly.
+Use at your own risk!
+
+Fix to dbdimp.c to allow quoted identifiers to begin/end
+with either " or '.
+The following will not be treated as if they have a bind placeholder:
+
+ "isEstimated?"
+ '01-JAN-1987 00:00:00'
+ 'Does anyone insert a ?'
+
+
+=head2 Changes in DBD::ODBC 0.32 January 22, 2002
+
+More SAP patches to Makfile.PL to eliminate the call to Data Sources
+
+A patch to the test (for SAP and potentially others), to allow
+fallback to SQL_TYPE_DATE in the tests
+
+=head2 Changes in DBD::ODBC 0.31 January 18, 2002
+
+Added SAP patches to build directly against SAP driver instead of
+driver manager thanks to Flemming Frandsen (thanks!)
+
+Added support to fix ping for Oracle8. May break other databases,
+so please report this as soon as possible. The downside is that
+we need to actually execute the dummy query.
+
+
+=head2 Changes in DBD::ODBC 0.30 January 8, 2002
+
+Added ping patch for Solid courtesy of Marko Asplund
+
+Updated disconnect to rollback if autocommit is not on.
+This should silence some errors when disconnecting.
+
+Updated SQL_ROWSET_SIZE attribute. Needed to force it to
+odbc_SQL_ROWSET_SIZE to obey the DBI rules.
+
+Added odbc_SQL_DRIVER_ODBC_VER, which obtains the version of
+the Driver upon connect. This internal capture of the version is
+a read-only attributed and is used during array binding of parameters.
+
+Added odbc_ignore_named_placeholders attribute to facilicate
+creating triggers within SAPDB and Oracle, to name two. The
+syntax in these DBs is to allow use of :old and :new to
+access column values before and after updates. Example:
+
+ $dbh->{odbc_ignore_named_placeholders} = 1; # set it for all future statements
+ # ignores :foo, :new, etc, but not :1 or ?
+ $dbh->do("create or replace etc :new.D = sysdate etc");
+
+
+=head2 Changes in DBD::ODBC 0.29 August 22, 2001
+
+Cygwin patches from Neil Lunn (untested by me). Thanks Neil!
+
+SQL_ROWSET_SIZE attribute patch from Andrew Brown
+
+ There are only 2 additional lines allowing for the setting of
+ SQL_ROWSET_SIZE as db handle option.
+
+ The purpose to my madness is simple. SqlServer (7 anyway) by default
+ supports only one select statement at once (using std ODBC cursors).
+ According to the SqlServer documentation you can alter the default setting
+ of
+ three values to force the use of server cursors - in which case multiple
+ selects are possible.
+
+ The code change allows for:
+ $dbh->{SQL_ROWSET_SIZE} = 2; # Any value > 1
+
+ For this very purpose.
+
+ The setting of SQL_ROWSET_SIZE only affects the extended fetch command as
+ far as I can work out and thus setting this option shouldn't affect
+ DBD::ODBC operations directly in any way.
+
+ Andrew
+
+
+VMS and other patches from Martin Evans (thanks!)
+
+[1] a fix for Makefile.PL to build DBD::ODBC on OpenVMS.
+
+[2] fix trace message coredumping after SQLDriverConnect
+
+[3] fix call to SQLCancel which fails to pass the statement handle properly.
+
+[4] consume diagnostics after SQLDriverConnect/SQLConnect call or they remain
+ until the next error occurs and it then looks confusing (this is due to
+ ODBC spec for SQLError). e.g. test 02simple returns a data truncated error
+ only now instead of all the informational diags that are left from the
+ connect call, like the "database changed", "language changed" messages you
+ get from MS SQL Server.
+
+Replaced C++ style comments with C style to support more platforms more easily.
+
+Fixed bug which use the single quote (') instead of a double quote (") for "literal" column names. This
+ helped when having a colon (:) in the column name.
+
+Fixed bug which would cause DBD::ODBC to core-dump (crash) if DBI tracing level was greater than 3.
+
+Fixed problem where ODBC.pm would have "use of uninitialized variable" if calling DBI's type_info.
+
+Fixed problem where ODBC.xs *may* have an overrun when calling SQLDataSources.
+
+Fixed problem with DBI 1.14, where fprintf was being called instead of PerlIO_printf for debug information
+
+Fixed problem building with unixODBC per patch from Nick Gorham
+
+Added ability to bind_param_inout() via patches from Jeremy Cooper. Haven't figured out a good, non-db specific
+ way to test. My current test platform attempts to determine the connected database type via
+ ugly hacks and will test, if it thinks it can. Feel free to patch and send me something...Also, my
+ current Oracle ODBC driver fails miserably and dies.
+
+Updated t/02simple.t to not print an error, when there is not one.
+
+=head2 Changes in DBD::ODBC 0.28 March 23, 2000
+
+Added support for SQLSpecialColumns thanks to patch provided by Martin J. Evans [martin@easysoft.com]
+
+Fixed bug introduced in 0.26 which was introduced of SQLMoreResults was not supported by the driver.
+
+=head2 Changes in DBD::ODBC 0.27 March 8, 2000
+
+Examined patch for ping method to repair problem reported by Chris Bezil. Thanks Chris!
+
+Added simple test for ping method working which should identify this in the future.
+
+=head2 Changes in DBD::ODBC 0.26 March 5, 2000
+
+Put in patch for returning only positive rowcounts from dbd_st_execute. The original patch
+was submitted by Jon Smirl and put back in by David Good. Reasoning seems sound, so I put it
+back in. However, any databases that return negative rowcounts for specific reasons,
+will no longer do so.
+
+Put in David Good's patch for multiple result sets. Thanks David! See mytest\moreresults.pl for
+an example of usage.
+
+Added readme.txt in iodbcsrc explaining an issue there with iODBC 2.50.3 and C<data_sources>.
+
+Put in rudimentary cancel support via SQLCancel. Call $sth->cencel to utilize. However, it is largely
+untested by me, as I do not have a good sample for this yet. It may come in handy with threaded
+perl, someday or it may work in a signal handler.
+
+=head2 Changes in DBD::ODBC 0.25 March 4, 2000
+
+Added conditional compilation for SQL_WVARCHAR and SQL_WLONGVARCHAR. If they
+are not defined by your driver manager, they will not be compiled in to the code.
+If you would like to support these types on some platforms, you may be able to
+#define SQL_WVARCHAR (-9)
+#define SQL_WLONGVARCHAR (-10)
+
+Added more long tests with binding in t\09bind.t. Note use of bind_param!
+
+=head2 Changes in DBD::ODBC 0.24 February 24, 2000
+
+Fixed Test #13 in 02simple.t. Would fail, improperly, if there was only one data source defined.
+
+Fixed (hopefully) SQL Server 7 and ntext type "Out of Memory!" errors via patch from Thomas Lowery. Thanks Thomas!
+
+Added more support for Solid to handle the fact that it does not support data_sources nor SQLDriverConnect.
+Patch supplied by Samuli Karkkainen [skarkkai@woods.iki.fi]. Thanks! It's untested by me, however.
+
+Added some information from Adam Curtin about a bug in iodbc 2.50.3's data_sources. See
+iodbcsrc\readme.txt.
+
+Added information in this pod from Stephen Arehart regarding DSNLess connections.
+
+Added fix for sp_prepare/sp_execute bug reported by Paul G. Weiss.
+
+Added some code for handling a hint on disconnect where the user gets an error for not committing.
+
+=head2 Changes in DBD::ODBC 0.22 September 8, 1999
+
+Fixed for threaded perl builds. Note that this was tested only on Win32, with no threads in use and using DBI 1.13.
+Note, for ActiveState/PERL_OBJECT builds, DBI 1.13_01 is required as of 9/8/99.
+If you are using ActiveState's perl, this can be installed by using PPM.
+
+
+=head2 Changes in DBD::ODBC 0.21
+
+Thanks to all who provided patches!
+
+Added ability to connect to an ODBC source without prior creation of DSN. See mytest/contest.pl for example with MS Access.
+(Also note that you will need documentation for your ODBC driver -- which, sadly, can be difficult to find).
+
+Fixed case sensitivity in tests.
+
+Hopefully fixed test #4 in t/09bind.t. Updated it to insert the date column and updated it to find the right
+type of the column. However, it doesn't seem to work on my Linux test machine, using the OpenLink drivers
+with MS-SQL Server (6.5). It complains about binding the date time. The same test works under Win32 with
+SQL Server 6.5, Oracle 8.0.3 and MS Access 97 ODBC drivers. Hmmph.
+
+Fixed some binary type issues (patches from Jon Smirl)
+
+Added SQLStatistics, SQLForeignKeys, SQLPrimaryKeys (patches from Jon Smirl)
+Thanks (again), Jon, for providing the build_results function to help reduce duplicate code!
+
+Worked on LongTruncOk for Openlink drivers.
+
+Note: those trying to bind variables need to remember that you should use the following syntax:
+
+ use DBI;
+ ...
+ $sth->bind_param(1, $str, DBI::SQL_LONGVARCHAR);
+
+Added support for unixodbc (per Nick Gorham)
+Added support for OpenLinks udbc (per Patrick van Kleef)
+Added Support for esodbc (per Martin Evans)
+Added Support for Easysoft (per Bob Kline)
+
+Changed table_info to produce a list of views, too.
+Fixed bug in SQLColumns call.
+Fixed blob handling via patches from Jochen Wiedmann.
+Added data_sources capability via snarfing code from DBD::Adabas (Jochen Wiedmann)
+
+=head2 Changes in DBD::ODBC 0.20 August 14, 1998
+
+SQLColAttributes fixes for SQL Server and MySQL. Fixed tables method
+by renaming to new table_info method. Added new tyoe_info_all method.
+Improved Makefile.PL support for Adabase.
+
+=head2 Changes in DBD::ODBC 0.19
+
+Added iODBC source code to distribution.Fall-back to using iODBC header
+files in some cases.
+
+=head2 Changes in DBD::ODBC 0.18
+
+Enhancements to build process. Better handling of errors in
+error handling code.
+
+=head2 Changes in DBD::ODBC 0.17
+
+This release is mostly due to the good work of Jeff Urlwin.
+My eternal thanks to you Jeff.
+
+Fixed "SQLNumResultCols err" on joins and 'order by' with some
+drivers (see Microsoft Knowledge Base article #Q124899).
+Thanks to Paul O'Fallon for that one.
+
+Added more (probably incomplete) support for unix ODBC in Makefile.PL
+
+Increased default SQL_COLUMN_DISPLAY_SIZE and SQL_COLUMN_LENGTH to 2000
+for drivers that don't provide a way to query them dynamically. Was 100!
+
+When fetch reaches the end-of-data it automatically frees the internal
+ODBC statement handle and marks the DBI statement handle as inactive
+(thus an explicit 'finish' is *not* required).
+
+Also:
+
+LongTruncOk for Oracle ODBC (where fbh->datalen < 0)
+
+Added tracing into SQLBindParameter (help diagnose oracle odbc bug)
+
+Fixed/worked around bug/result from Latest Oracle ODBC driver where in
+SQLColAttribute cbInfoValue was changed to 0 to indicate fDesc had a value
+
+Added work around for compiling w/ActiveState PRK (PERL_OBJECT)
+
+Updated tests to include date insert and type
+
+Added more "backup" SQL_xxx types for tests
+
+Updated bind test to test binding select
+
+ NOTE: bind insert fails on Paradox driver (don't know why)
+
+Added support for: (see notes below)
+
+ SQLGetInfo via $dbh->func(xxx, GetInfo)
+ SQLGetTypeInfo via $dbh->func(xxx, GetTypeInfo)
+ SQLDescribeCol via $sth->func(colno, DescribeCol)
+ SQLColAttributes via $sth->func(xxx, colno, ColAttributes)
+ SQLGetFunctions via $dbh->func(xxx, GetFunctions)
+ SQLColumns via $dbh->func(catalog, schema, table, column, 'columns')
+
+Fixed $DBI::err to reflect the real ODBC error code
+which is a 5 char code, not necessarily numeric.
+
+Fixed fetches when LongTruncOk == 1.
+
+Updated tests to pass more often (hopefully 100% <G>)
+
+Updated tests to test long reading, inserting and the LongTruncOk attribute.
+
+Updated tests to be less driver specific.
+
+They now rely upon SQLGetTypeInfo I<heavily> in order to create the tables.
+The test use this function to "ask" the driver for the name of the SQL type
+to correctly create long, varchar, etc types. For example, in Oracle the
+SQL_VARCHAR type is VARCHAR2, while MS Access uses TEXT for the SQL Name.
+Again, in Oracle the SQL_LONGVARCHAR is LONG, while in Access it's MEMO.
+The tests currently handle this correctly (at least with Access and Oracle,
+MS SQL server will be tested also).
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/ODBC/FAQ.pm b/Master/tlpkg/tlperl.straw/lib/DBD/ODBC/FAQ.pm
new file mode 100755
index 00000000000..15714ea92f4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/ODBC/FAQ.pm
@@ -0,0 +1,681 @@
+=head1 NAME
+
+DBD::ODBC::FAQ - Frequently Asked Questions for DBD::ODBC
+
+=head1 SYNOPSIS
+
+ perldoc DBD::ODBC::FAQ
+
+=head1 VERSION
+
+($Revision: 13204 $)
+
+=head1 QUESTIONS
+
+=head2 How do I read more than N characters from a Memo | BLOB | LONG field?
+
+See LongReadLen in the DBI docs.
+
+Example:
+
+ $dbh->{LongReadLen} = 20000;
+ $sth = $dbh->prepare("select long_col from big_table");
+ $sth->execute;
+ etc
+
+=head2 What is DBD::ODBC?
+
+=head2 Why can't I connect?
+
+=head2 Do I need an ODBC driver?
+
+=head2 What is the ODBC driver manager?
+
+These, general questions lead to needing definitions.
+
+=over 4
+
+=item ODBC Driver
+
+The ODBC Driver is the driver that the ODBC manager uses to connect
+and interact with the RDBMS. You B<DEFINITELY> need this to connect to
+any database. For Win32, they are plentiful and installed with many
+applications. For Linux/Unix, you can find a fairly comprehensive list
+at L<http://www.unixodbc.org/drivers.html>.
+
+=item ODBC Driver Manager
+
+The ODBC driver manager is the interface between an ODBC application
+(DBD::ODBC in this case) and the ODBC driver. The driver manager
+principally provides the ODBC API so ODBC applications may link with a
+single shared object (or dll) and be able to talk to a range of ODBC
+drivers. At run time the application provides a connection string
+which defines the ODBC data source it wants to connect to and this in
+turn defines the ODBC driver which will handle this data source. The
+driver manager loads the requested ODBC driver and passes all ODBC API
+calls on to the driver. In this way, an ODBC application can be built
+and distributed without knowing which ODBC driver it will be using.
+
+However, this is a rather simplistic description of what the driver
+manager does. The ODBC driver manager also:
+
+* Controls a repository of installed ODBC drivers (on UNIX this is the
+file odbcinst.ini).
+
+* Controls a repository of defined ODBC data sources (on UNIX these are
+the files odbc.ini and .odbc.ini).
+
+* Provides the ODBC driver APIs (SQLGetPrivateProfileString and
+SQLWritePrivateProfileString) to read and write ODBC data source
+attributes.
+
+* Handles ConfigDSN which the driver exports to configure data
+sources.
+
+* Provides APIs to install and uninstall drivers (SQLInstallDriver).
+
+* Maps ODBC versions e.g. so an ODBC 2.0 application can work with an
+ODBC 3.0 driver and vice versa.
+
+* Maps ODBC states between different versions of ODBC.
+
+* Provides a cursor library for drivers which only support
+forward-only cursors.
+
+* Provides SQLDataSources and SQLDrivers so an application can find
+out what ODBC drivers are installed and what ODBC data sources are
+defined.
+
+* Provides an ODBC administrator which driver writers can use to
+install ODBC drivers and users can use to define ODBC data sources.
+
+The ODBC Driver Manager is the piece of software which interacts with
+the drivers for the application. It "hides" some of the differences
+between the drivers (i.e. if a function call is not supported by a
+driver, it 'hides' that and informs the application that the call is
+not supported. DBD::ODBC needs this to talk to drivers.
+
+Under Win32, you usually get the ODBC Driver Manager as part of the
+OS. Under Unix/Linux you may have to find and build the driver
+manager yourself. The two main driver managers for Unix are unixODBC
+(L<http://www.unixodbc.org>) and iODBC (L<http://www.iodbc.org>).
+
+B<It is strongly advised you get an ODBC Driver Manager before trying to
+build DBD::ODBC unless you intend linking DBD::ODBC directly with your
+driver.>
+
+For a reasonable description of ODBC on Unix/Linux see
+L<http://www.easysoft.com/developer/interfaces/odbc/linux.html>
+
+=item DBD::ODBC
+
+DBD::ODBC uses the driver manager to talk to the ODBC driver(s) on
+your system. You need both a driver manager and driver installed and
+tested before working with DBD::ODBC. You need to have a DSN (see
+below) configured and B<TESTED> before being able to test DBD::ODBC.
+
+=item DSN (Data Source Name)
+
+
+The DSN is a way of referring to a particular driver and database by
+any name you wish. The DSN is usually a key to a list of attributes
+the ODBC driver needs to connect to the database (e.g. ip address and
+port) but there is always a key which names the driver so the driver
+manager knows which driver to use with which data source. Do no
+confuse DSNs with ODBC connection strings or DBI's "$data_source" (the
+first argument to L<DBI/connect>.
+
+The $data_source argument to DBI is composed of 'dbi:DRIVER:something_else'
+where DRIVER is the name of the DBD driver you want to use (ODBC of
+course for DBD::ODBC). The "something_else" for DBD::ODBC can be a DSN
+name or it can be a normal ODBC connection string.
+
+An ODBC connection string consists of attribute/value pairs separated
+with semicolons (;). You can replace "something_else" above with a
+normal ODBC connection string but as a special case for DBD::ODBC you can
+just use the DSN name without the usual ODBC connection string prefix
+of "DSN=dsn_name".
+
+e.g.
+
+=over
+
+=item dbi:ODBC:DSN=fred
+
+ODBC connection string using fred DSN
+
+=item dbi:ODBC:fred
+
+Same as above (a special case).
+
+=item dbi:ODBC:Driver={blah blah driver};Host=1.2.3.4;Port=1000;
+
+This is known as a DSN-less connection string for obvious reasons.
+
+=back
+
+=back
+
+=head2 Where do I get an ODBC driver manager for Unix/Linux?
+
+DBD::ODBC used to come bundled with a driver manager but this became
+inconvenient when the driver manager was updated.
+
+The two main ODBC Driver Managers for Unix are unixODBC (L<http://www.unixodbc/org>) and iODBC (L<http://www.iodbc.org>).
+
+If you are running a packaged Linux like RedHat, Ubuntu, Fedora, Suse
+etc etc you'll usually find it packaged with unixODBC and using the
+package manager to install it is fairly straight forward. However,
+make sure that if the driver manager is split into multiple packages
+you install the development package as well as that contains the C
+header files required by DBD::ODBC.
+
+If you cannot find an ODBC Driver Manager package for your OS you can
+download the source tar files for either of the driver managers above
+and build it yourself.
+
+=head2 How do I access a MS SQL Server database from Linux/UNIX?
+
+You have loads of choices (in no particular order):
+
+* using DBI::ProxyServer or DBD::Gofer. You'll need the former if you
+ use transactions.
+
+* using a commercial ODBC Driver or bridge like the ones from Easysoft
+or Openlink.
+
+* using FreeTDS an open source TDS library which includes an ODBC Driver.
+
+* using DBD::Sybase and Sybase libraries.
+
+=head2 How do I access a MS-Access database from Linux?
+
+There are basically two choices:
+
+* a commercial ODBC Bridge like the ones from Easysoft or OpenLink.
+
+* using mdbtools although as of writing it has not been updated since
+June 2004, only provides read access and seems to be a little buggy.
+
+=head2 Almost all of my tests for DBD::ODBC fail. They complain about not being able to connect or the DSN is not found.
+
+Please, please test your configuration of ODBC and driver before
+trying to test DBD::ODBC. Most of the time, this stems from the fact
+that the DSN (or ODBC) is not configured properly. unixODBC comes with
+a small program isql and iODBC comes with odbctest and you should use
+these to test your ODBC configuration is working properly first.
+
+=head2 I'm attempting to bind a Long Var char (or other specific type)
+and the binding is not working.
+
+The code I'm using is below:
+
+ $sth->bind_param(1, $str, $DBI::SQL_LONGVARCHAR);
+ ^^^
+
+The problem is that DBI::SQL_LONGVARCHAR is not the same as
+$DBI::SQL_LONGVARCHAR and that $DBI::SQL_LONGVARCHAR is an error!
+
+It should be:
+
+ $sth->bind_param(1, $str, DBI::SQL_LONGVARCHAR);
+
+=head2 Does DBD::ODBC support Multiple Active Statements?
+
+Multiple Active Statements (MAS) are concurrent statements created
+from the same database handle which both have pending actions on them
+(e.g. they both have executed a select statement but not retrieved all
+the available rows yet).
+
+DBD::ODBC does support MAS but whether you can actually use MAS is
+down to the ODBC Driver.
+
+By default MS SQL Server did not used to support multiple active
+statements if any of them were select statements. You could get around
+this (with caution) by changing to a dynamic cursor. There is a "hack"
+in DBD::ODBC which can be used to enable MAS but you have to fully
+understand the implications of doing so(see
+L</DBD/ODBC/odbc_SQL_ROWSET_SIZE> and L</DBD/ODBC/odbc_cursortype>).
+
+In MS SQL Server 2005, there is a new thing called MARS (Multiple
+Active Result Sets) which allows multiple active select statements but
+it has some nasty implications if you are also doing transactions. To
+enable MARS from DBD::ODBC add "MARS_Connection=Yes" to the connection
+string as in:
+
+ $h->DBI->connect('dbi:ODBC:DSN=mydsn;MARS_Connection=Yes;');
+
+For other drivers it depends. I believe various Oracle ODBC drivers do
+support multiple active statements as myodbc does.
+
+Think carefully before using multiple active statements. It is
+probably not portable and there is nearly always a better way of doing
+it.
+
+If anyone wants to report success with a particular driver and
+multiple active statements I will collect them here.
+
+=head2 Why do I get "Datetime field overflow" when attempting to insert a
+date into Oracle?
+
+If you are using the Oracle or Microsoft ODBC drivers then you may get
+the following error when inserting dates into an Oracle database:
+
+ [Oracle][ODBC]Datetime field overflow. (SQL-22008)
+
+If you do then check v$nls_parameters and v$parameter to see if you are
+using a date format containing the RR format. e.g.,
+
+ select * from v$nls_parameters where parameter = 'NLS_DATE_FORMAT'
+ select * from v$parameter where name = 'nls_date_format'
+
+If you see a date format like 'DD-MON-RR' (e.g., contains an RR) then
+all I can suggest is you change the date format for your session as I
+have never been able to bind a date using this format. You can do this
+with:
+
+ alter session set nls_date_format='YYYY/MM/DD'
+
+and use any format you like but keep away from 'RR'.
+
+You can find some test code in the file examples/rtcpan_28821.pl which
+demonstrates this problem. This was originally a rt.cpan issue which
+can be found at L<http://rt.cpan.org/Ticket/Display.html?id=28821>.
+
+As an aside, if anyone is reading this and can shed some light on the problem
+I'd love to hear from you. The technical details are:
+
+ create table rtcpan28821 (a date)
+ insert into rtcpan28821 values('23-MAR-62') fails
+
+Looking at the ODBC trace, SQLDescribeParam returns:
+
+ data type: 93, SQL_TYPE_TIMESTAMP
+ size: 19
+ decimal digits: 0
+ nullable: 1
+
+and DBD::ODBC calls SQLBindParameter with:
+
+ ValueType: SQL_C_CHAR
+ ParameterType: SQL_TYPE_TIMESTAMP
+ ColumnSize: 9
+ DecimalDigits: 0
+ Data: 23-MAR-62
+ BufferLength: 9
+
+=head2 Why do my SQL Server temporary objects disappear?
+
+If you are creating temporary objects (e.g., temporary tables) in
+SQL Server you find they have disappeared when you attempt to use
+them. Temporary objects only have a lifetime of the session they
+are created in but in addition, they cannot be created using
+prepare/execute. e.g., the following fails:
+
+ $s = $h->prepare('select * into #tmp from mytable');
+ $s->execute;
+ $s = $h->selectall_arrayref('select * from #tmp');
+
+with "Invalid object name '#tmp'". Your should read
+L<http://technet.microsoft.com/en-US/library/ms131667.aspx> which
+basically says I<Prepared statements cannot be used to create
+temporary objects on SQL Server 2000 or later...>. The proper way to
+avoid this is to use the C<do> method but if you cannot do that then
+you need to add the L</odbc_exec_direct> attribute to your prepare as
+follows:
+
+ my $s = $h->prepare('select * into #tmp from mytable',
+ { odbc_exec_direct => 1});
+
+See L</odbc_exec_direct>.
+
+=head2 Why cannot I connect to my data source on Windows 64?
+
+If you are running a 32bit Perl on a 64bit Windows machine you will
+need to be aware there are two ODBC administrators and you need to
+create your DSNs with the right one. The ODBC Administrator you get to
+from Control Panel, Administrative Tools, Data Sources is the 64bit
+one and data sources created here will not be visible or useable from
+32bit applications. The ODBC administrator you need to use for 32bit
+applications can be found at X:\windows\syswow64\odbcad32.exe.
+
+=head2 How do I use DBD::ODBC with web servers under Win32.
+
+=over 4
+
+=item General Commentary re web database access
+
+This should be a DBI faq, actually, but this has somewhat of an
+Win32/ODBC twist to it.
+
+Typically, the Web server is installed as an NT service or a Windows
+95/98 service. This typically means that the web server itself does
+not have the same environment and permissions the web developer does.
+This situation, of course, can and does apply to Unix web servers.
+Under Win32, however, the problems are usually slightly different.
+
+=item Defining your DSN -- which type should I use?
+
+Under Win32 take care to define your DSN as a system DSN, not as a user
+DSN. The system DSN is a "global" one, while the user is local to a
+user. Typically, as stated above, the web server is "logged in" as a
+different user than the web developer. This helps cause the situation
+where someone asks why a script succeeds from the command line, but
+fails when called from the web server.
+
+=item Defining your DSN -- careful selection of the file itself is important!
+
+For file based drivers, rather than client server drivers, the file
+path is VERY important. There are a few things to keep in mind. This
+applies to, for example, MS Access databases.
+
+1) If the file is on an NTFS partition, check to make sure that the Web
+B<service> user has permissions to access that file.
+
+2) If the file is on a remote computer, check to make sure the Web
+B<service> user has permissions to access the file.
+
+3) If the file is on a remote computer, try using a UNC path the file,
+rather than a X:\ notation. This can be VERY important as services
+don't quite get the same access permissions to the mapped drive letters
+B<and>, more importantly, the drive letters themselves are GLOBAL to
+the machine. That means that if the service tries to access Z:, the Z:
+it gets can depend upon the user who is logged into the machine at the
+time. (I've tested this while I was developing a service -- it's ugly
+and worth avoiding at all costs).
+
+Unfortunately, the Access ODBC driver that I have does not allow one to
+specify the UNC path, only the X:\ notation. There is at least one way
+around that. The simplest is probably to use Regedit and go to
+(assuming it's a system DSN, of course)
+HKEY_LOCAL_USERS\SOFTWARE\ODBC\"YOUR DSN" You will see a few settings
+which are typically driver specific. The important value to change for
+the Access driver, for example, is the DBQ value. That's actually the
+file name of the Access database.
+
+=back
+
+=head2 How do I connect without DSN
+
+The ability to connect without a full DSN was introduced in version 0.21.
+
+Example (using MS Access):
+
+ my $DSN = 'driver=Microsoft Access Driver(*.mdb);dbq=\\\\cheese\\g$\\perltest.mdb';
+ my $dbh = DBI->connect("dbi:ODBC:$DSN", '','') or die "$DBI::errstr\n";
+
+The above sample uses Microsoft's UNC naming convention to point to
+the MSAccess file (\\cheese\g$\perltest.mdb). The dbq parameter tells
+the access driver which file to use for the database.
+
+Example (using MSSQL Server):
+
+ my $DSN = 'driver={SQL Server};Server=server_name;database=database_name;uid=user;pwd=password;';
+ my $dbh = DBI->connect("dbi:ODBC:$DSN") or die "$DBI::errstr\n";
+
+=head2 Why do I get data truncated error from SQL Server when inserting with parameters?
+
+DBD::ODBC attempts to use the ODBC API C<SQLDescribeParam> to obtain
+information about parameters in parameterised SQL. e.g.,
+
+ insert into mytable (column1) values(?)
+
+The C<?> is a parameter marker. You supply the parameter value (in
+this case parameter 1) with a call to the C<bind_param> method or by
+adding the parameter to the C<execute> method call. When DBD::ODBC
+sees the parameter marker in the SQL it will call C<SQLDescribeParam>
+to obtain information about the parameter size and type etc (assuming
+your ODBC driver supports C<SQLDescribeParam>).
+
+When you call C<SQLDescribeParam> in the MS SQL Server ODBC driver the
+driver will scan your SQL attempting to discover the columns in your
+database the parameters align with. e.g., in the above case the
+parameter to be bound is linked with "column1" so C<SQLDescribeParam>
+should return information about "column1". The SQL Server ODBC driver
+finds information about "column1" (in this example) by creating SQL such
+as:
+
+ select column1 from mytable where 1 = 2
+
+then looking at the column details. Unfortunately, some SQL confuses
+SQL Server and it will generate SQL to find out about your parameters
+which examines the wrong columns and on rare occasions it may even
+generate totally incorrect SQL. The test case F<t/rt_39841.t>
+domonstrates a couple of these.
+
+The upshot of this is that DBD::ODBC is sometimes lied to about
+parameters and will then bind your parameters incorrectly. This can lead
+to later errors when C<execute> is called. This happens most commonly
+when using parameters in SQL with sub-selects. For example:
+
+ create table one (a1 integer, a2 varchar(10))
+ create table two (b1 varchar(10), b2 varchar(20))
+
+ insert into one values(1, 'aaaaaaaaaa')
+ insert into two values('aaaaaaaaaa','bbbbbbbbbbbbbbbbbbbb')
+
+ select b1, (select a2 from one where a2 = b1) from two where b2 = ?
+
+ param 1 bound as 'bbbbbbbbbbbbbbbbbbbb'
+
+Clearly in this example, the one and only parameter is for two.b2 which
+is a varchar(20) but when SQL Server rearranges your SQL to describe
+the parameter it issues:
+
+ select a2 from one where 1 = 0
+
+and DBD::ODBC is told the parameter is a VARCHAR(10). In DBD::ODBC
+1.17 this would then lead to a data truncation error because parameter
+1 would be bound as 'bbbbbbbbbbbbbbbbbbbb' but with a column size of
+10 as that is what SQLDescribeParam returned. DBD::ODBC 1.17_1 (and
+later) works around this problem for VARCHAR columns because it is
+obvious a VARCHAR parameter of length 20 cannot have a column size of
+10 so the column size is increased to the length of the parameter.
+
+However, a more difficult error can occur when SQL Server describes
+the parameter as totally the wrong type. The first example in
+F<t/rt_39841.t> demonstrates this. SQL Server describes a VARCHAR
+parameter as an integer which DBD::ODBC has little choice to believe
+but when something like 'bbbbbbbbbb' is bound as an integer, SQL
+Server will then return an error like "invalid value for cast
+specification". The only way around this is to specifically name the
+parameter type. e.g.,
+
+ create table one (a1 integer, a2 varchar(20))
+ create table two (b1 double precision, b2 varchar(8))
+
+ insert into one values(1, 'aaaaaaaaaa')
+ insert into two values(1, 'bbbbbbbb')
+
+ select b1, ( select a2 from one where a1 = b1 ) from two where b2 = ?
+
+ param 1 bound as 'bbbbbbbbbb'
+
+Clearly parameter 1 is a varchar(8) but SQL Server rearranges the SQL to:
+
+ select a1 from one where 1 = 2
+
+when it should have run
+
+ select b2 from two where 1 = 2
+
+As a result parameter 1 is described as an integer and this leads to the
+problem. To workaround this problem you would need to bind parameter 1
+naming the SQL type of the parameter using something like:
+
+ use DBI qw(:sql_types);
+
+ bind_param(1, 'bbbbbbbbbb', SQL_VARCHAR);
+
+as omitting SQL_VARCHAR will cause DBD::ODBC to use the type
+C<SQLDescribeParam> returned.
+
+=head2 Why do I get invalid value for cast specification (22018) from SQL Server when inserting with parameters?
+
+See L<http://support.microsoft.com/kb/269011> on the microsoft web site for
+a bug you may have hit.
+
+In Perl the most common reason for this is that you have bound column
+data in SQL which does not match the column type in the database and
+the ODBC driver cannot perform the necessary conversion. DBD::ODBC
+mostly binds all column data as strings and lets the ODBC driver
+convert the string to the right column type. If you supply a string
+which cannot be converted to the native column type you will get this
+error e.g., if you attempt to bind a non-datetime string to a datetime
+column or a non-numeric string to a numeric column.
+
+=head2 Why do I get strange results with SQL Server and named parameters?
+
+If you are using a MS SQL Server driver and named parameters to
+procedures be very careful to use then in the sasme order they are
+defined in the procedure. i.e., if you have a procedure like this:
+
+ create procedure test
+ @param1 varchar(50),
+ @param2 smallint
+ as
+ begin
+ ..
+ end
+
+then ensure if you call it using named parameters you specify them in
+the same order they are declared:
+
+ exec test @param1=?,@param2=?
+
+and not
+
+ exec test @param2=?,@param1=?
+
+The reason for this is that all SQL Server drivers we have seen
+describe procedures parameters in the order they are declared and
+ignore the order they are used in the SQL. If you specify them out of
+order DBD::ODBC will get details on p1 which are really for p2
+etc. This can lead to data truncation errors and all sort of other
+problems it is impossible for DBD::ODBC spot or workaround.
+
+=head2 Why do I get "Numeric value out of range" when binding dates in Oracle?
+
+Also see "Why do I get "Datetime field overflow" when attempting to insert a
+date into Oracle?".
+
+Here is some example code binding dates; some work, some don't, see comments.
+
+ use DBI;
+ use strict;
+
+ # table is "create table martin (a date, b int)"
+
+ my $h = DBI->connect;
+
+ $h->do(q{alter session set nls_date_format='DD-MON-YY'});
+
+ my $s = $h->prepare(q{select * from v$nls_parameters where parameter = 'NLS_DATE_FORMAT'});
+ $s->execute;
+ print DBI::dump_results($s);
+
+ my $date = '30-DEC-99';
+ my $dateodbc = qq/{ d '1999-12-30'}/;
+
+ # the following works ok - resulting in 2099-12-30 being inserted
+ $h->do(qq{insert into martin values ('$date', 1)});
+
+ # the following works resulting in 1999-12-30 being inserted
+ $h->do(qq{insert into martin values ($dateodbc, 2)});
+
+ # fails
+ eval {
+ my $s = $h->prepare(q{insert into martin values(?,3)});
+ $s->bind_param(1, $date);
+ # fails
+ # Numeric value out of range: invalid character in date/time string (SQL-22003)
+ $s->execute;
+ };
+
+ # works resulting in 2099-12-30 being inserted
+ eval {
+ my $s = $h->prepare(q{insert into martin values(?,4)});
+ $s->bind_param(1, $date, DBI::SQL_VARCHAR);
+ $s->execute;
+ };
+
+ # works resulting in 1999-12-30 being inserted
+ eval {
+ my $s = $h->prepare(q{insert into martin values(?,5)});
+ $s->bind_param(1, $dateodbc);
+ $s->execute;
+ };
+
+In general, when using an ODBC driver you should use the ODBC syntax
+for dates, times and timestamps as those are the only formats an ODBC
+has to support.
+
+In the above case with Oracle, the date parameter is described as a
+SQL_TYPE_DATE SQL type so by default DBD::ODBC binds your parameter as
+a SQL_TYPE_DATE. If you use '30-DEC-99' then that means the C type is
+SQL_CHAR and the SQL type is SQL_TYPE_DATE so the driver is forced to
+parse the date before sending it to Oracle (that would mean knowing
+what your NLS_DATE_FORMAT is and it would also mean knowing all the
+magic special characters Oracle can use to define date formats).
+
+If you override the bind type to SQL_VARCHAR then the driver sees
+SQL_CHAR => SQL_VARCHAR, nothing to do and hence Oracle itself does
+the translation - that is why the SQL_VARCHAR works.
+
+=head2 CWB0111 error with System i Access ODBC Driver
+
+The full error this relates to is:
+
+[unixODBC][IBM][System i Access ODBC Driver]Column 1: CWB0111 - A buffer passed to a system call is too small to hold return data (SQL-22018)
+
+The iSeries ODBC driver looks at your environment and decides that if
+you have UTF-8 set it will encode data returned from the database in
+UTF-8.
+
+e.g., LC_CTYPE=fr_FR.UTF-8
+
+If you then select data from your database containing non-ASCII
+characters e.g., accented characters the iSeries ODBC driver will
+encode the data in UTF-8. UTF-8 encoding increases the size of strings
+containing characters with codes > 127.
+
+DBD::ODBC uses SQLDescribeCol and SQLColAttribute ODBC calls to work
+out the size of the columns you are retrieving and allocate space for
+them. As the ODBC API specifies the sizes returned are on bytes when
+the driver says a string column is N is size DBD::ODBC allocates N+1
+(for NULL) bytes. If the driver then encodes N characters in UTF-8 the
+size will be too big to fit into DBD::ODBC's buffer and you will get
+the error above. This is most often seen with char(N) columns as the
+trailing spaces are returned by the driver so you are bound to
+overflow the buffer as soon as a non-ASCII characters is found.
+
+What are your possible solutions?
+
+You can attempt to trim the data to leave room for the encoding.
+e.g., RTRIM(column_name) in your select on char(N) columns but this is
+a poor choice and only going to work in a few circumstances.
+
+You can increase the sizes of your columns in the database but this is
+another hack.
+
+You can rearrange your SQL to cast the columns in question to larger
+types.
+
+Remove UTF-8 from your locale. This is the best solution as it is
+guaranteed to stop this error but if you have data which cannot be
+represented in 8 bit characters this won't help.
+
+=head1 AUTHOR
+
+Parts of this document were written by Tim Bunce,
+Jeff Urlwin and Martin J. Evans.
+
+=head1 LICENSE
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.8.7 or,
+at your option, any later version of Perl 5 you may have available.
+
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/Pg.pm b/Master/tlpkg/tlperl.straw/lib/DBD/Pg.pm
new file mode 100755
index 00000000000..0218e222a07
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/Pg.pm
@@ -0,0 +1,4208 @@
+# -*-cperl-*-
+# $Id: Pg.pm 13752 2010-01-20 19:19:06Z turnstep $
+#
+# Copyright (c) 2002-2010 Greg Sabino Mullane and others: see the Changes file
+# Portions Copyright (c) 2002 Jeffrey W. Baker
+# Portions Copyright (c) 1997-2001 Edmund Mergl
+# Portions Copyright (c) 1994-1997 Tim Bunce
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+
+use strict;
+use warnings;
+use 5.006001;
+
+{
+ package DBD::Pg;
+
+ use version; our $VERSION = qv('2.16.1');
+
+ use DBI ();
+ use DynaLoader ();
+ use Exporter ();
+ use vars qw(@ISA %EXPORT_TAGS $err $errstr $sqlstate $drh $dbh $DBDPG_DEFAULT @EXPORT);
+ @ISA = qw(DynaLoader Exporter);
+
+
+ %EXPORT_TAGS =
+ (
+ async => [qw(PG_ASYNC PG_OLDQUERY_CANCEL PG_OLDQUERY_WAIT)],
+ pg_types => [qw(
+ PG_ABSTIME PG_ABSTIMEARRAY PG_ACLITEM PG_ACLITEMARRAY PG_ANY
+ PG_ANYARRAY PG_ANYELEMENT PG_ANYENUM PG_ANYNONARRAY PG_BIT
+ PG_BITARRAY PG_BOOL PG_BOOLARRAY PG_BOX PG_BOXARRAY
+ PG_BPCHAR PG_BPCHARARRAY PG_BYTEA PG_BYTEAARRAY PG_CHAR
+ PG_CHARARRAY PG_CID PG_CIDARRAY PG_CIDR PG_CIDRARRAY
+ PG_CIRCLE PG_CIRCLEARRAY PG_CSTRING PG_CSTRINGARRAY PG_DATE
+ PG_DATEARRAY PG_FLOAT4 PG_FLOAT4ARRAY PG_FLOAT8 PG_FLOAT8ARRAY
+ PG_GTSVECTOR PG_GTSVECTORARRAY PG_INET PG_INETARRAY PG_INT2
+ PG_INT2ARRAY PG_INT2VECTOR PG_INT2VECTORARRAY PG_INT4 PG_INT4ARRAY
+ PG_INT8 PG_INT8ARRAY PG_INTERNAL PG_INTERVAL PG_INTERVALARRAY
+ PG_LANGUAGE_HANDLER PG_LINE PG_LINEARRAY PG_LSEG PG_LSEGARRAY
+ PG_MACADDR PG_MACADDRARRAY PG_MONEY PG_MONEYARRAY PG_NAME
+ PG_NAMEARRAY PG_NUMERIC PG_NUMERICARRAY PG_OID PG_OIDARRAY
+ PG_OIDVECTOR PG_OIDVECTORARRAY PG_OPAQUE PG_PATH PG_PATHARRAY
+ PG_PG_ATTRIBUTE PG_PG_CLASS PG_PG_PROC PG_PG_TYPE PG_POINT
+ PG_POINTARRAY PG_POLYGON PG_POLYGONARRAY PG_RECORD PG_RECORDARRAY
+ PG_REFCURSOR PG_REFCURSORARRAY PG_REGCLASS PG_REGCLASSARRAY PG_REGCONFIG
+ PG_REGCONFIGARRAY PG_REGDICTIONARY PG_REGDICTIONARYARRAY PG_REGOPER PG_REGOPERARRAY
+ PG_REGOPERATOR PG_REGOPERATORARRAY PG_REGPROC PG_REGPROCARRAY PG_REGPROCEDURE
+ PG_REGPROCEDUREARRAY PG_REGTYPE PG_REGTYPEARRAY PG_RELTIME PG_RELTIMEARRAY
+ PG_SMGR PG_TEXT PG_TEXTARRAY PG_TID PG_TIDARRAY
+ PG_TIME PG_TIMEARRAY PG_TIMESTAMP PG_TIMESTAMPARRAY PG_TIMESTAMPTZ
+ PG_TIMESTAMPTZARRAY PG_TIMETZ PG_TIMETZARRAY PG_TINTERVAL PG_TINTERVALARRAY
+ PG_TRIGGER PG_TSQUERY PG_TSQUERYARRAY PG_TSVECTOR PG_TSVECTORARRAY
+ PG_TXID_SNAPSHOT PG_TXID_SNAPSHOTARRAY PG_UNKNOWN PG_UUID PG_UUIDARRAY
+ PG_VARBIT PG_VARBITARRAY PG_VARCHAR PG_VARCHARARRAY PG_VOID
+ PG_XID PG_XIDARRAY PG_XML PG_XMLARRAY
+ )]
+ );
+
+ {
+ package DBD::Pg::DefaultValue;
+ sub new { my $self = {}; return bless $self, shift; }
+ }
+ $DBDPG_DEFAULT = DBD::Pg::DefaultValue->new();
+ Exporter::export_ok_tags('pg_types', 'async');
+ @EXPORT = qw($DBDPG_DEFAULT PG_ASYNC PG_OLDQUERY_CANCEL PG_OLDQUERY_WAIT PG_BYTEA);
+
+ require_version DBI 1.52;
+
+ bootstrap DBD::Pg $VERSION;
+
+ $err = 0; # holds error code for DBI::err
+ $errstr = ''; # holds error string for DBI::errstr
+ $sqlstate = ''; # holds five character SQLSTATE code
+ $drh = undef; # holds driver handle once initialized
+
+ ## These two methods are here to allow calling before connect()
+ sub parse_trace_flag {
+ my ($class, $flag) = @_;
+ return (0x7FFFFF00 - 0x08000000) if $flag eq 'DBD'; ## all but the prefix
+ return 0x01000000 if $flag eq 'pglibpq';
+ return 0x02000000 if $flag eq 'pgstart';
+ return 0x04000000 if $flag eq 'pgend';
+ return 0x08000000 if $flag eq 'pgprefix';
+ return 0x10000000 if $flag eq 'pglogin';
+ return 0x20000000 if $flag eq 'pgquote';
+ return DBI::parse_trace_flag($class, $flag);
+ }
+ sub parse_trace_flags {
+ my ($class, $flags) = @_;
+ return DBI::parse_trace_flags($class, $flags);
+ }
+
+ sub CLONE {
+ $drh = undef;
+ return;
+ }
+
+ ## Deprecated
+ sub _pg_use_catalog {
+ return 'pg_catalog.';
+ }
+
+ sub driver {
+ return $drh if defined $drh;
+ my($class, $attr) = @_;
+
+ $class .= '::dr';
+
+ $drh = DBI::_new_drh($class, {
+ 'Name' => 'Pg',
+ 'Version' => $VERSION,
+ 'Err' => \$DBD::Pg::err,
+ 'Errstr' => \$DBD::Pg::errstr,
+ 'State' => \$DBD::Pg::sqlstate,
+ 'Attribution' => "DBD::Pg $VERSION by Greg Sabino Mullane and others",
+ });
+
+
+ DBD::Pg::db->install_method('pg_cancel');
+ DBD::Pg::db->install_method('pg_endcopy');
+ DBD::Pg::db->install_method('pg_getline');
+ DBD::Pg::db->install_method('pg_getcopydata');
+ DBD::Pg::db->install_method('pg_getcopydata_async');
+ DBD::Pg::db->install_method('pg_notifies');
+ DBD::Pg::db->install_method('pg_putcopydata');
+ DBD::Pg::db->install_method('pg_putcopyend');
+ DBD::Pg::db->install_method('pg_ping');
+ DBD::Pg::db->install_method('pg_putline');
+ DBD::Pg::db->install_method('pg_ready');
+ DBD::Pg::db->install_method('pg_release');
+ DBD::Pg::db->install_method('pg_result');
+ DBD::Pg::db->install_method('pg_rollback_to');
+ DBD::Pg::db->install_method('pg_savepoint');
+ DBD::Pg::db->install_method('pg_server_trace');
+ DBD::Pg::db->install_method('pg_server_untrace');
+ DBD::Pg::db->install_method('pg_type_info');
+
+ DBD::Pg::st->install_method('pg_cancel');
+ DBD::Pg::st->install_method('pg_result');
+ DBD::Pg::st->install_method('pg_ready');
+
+ DBD::Pg::db->install_method('pg_lo_creat');
+ DBD::Pg::db->install_method('pg_lo_open');
+ DBD::Pg::db->install_method('pg_lo_write');
+ DBD::Pg::db->install_method('pg_lo_read');
+ DBD::Pg::db->install_method('pg_lo_lseek');
+ DBD::Pg::db->install_method('pg_lo_tell');
+ DBD::Pg::db->install_method('pg_lo_close');
+ DBD::Pg::db->install_method('pg_lo_unlink');
+ DBD::Pg::db->install_method('pg_lo_import');
+ DBD::Pg::db->install_method('pg_lo_export');
+
+ return $drh;
+
+ } ## end of driver
+
+
+ 1;
+
+} ## end of package DBD::Pg
+
+
+{
+ package DBD::Pg::dr;
+
+ use strict;
+
+ ## Returns an array of formatted database names from the pg_database table
+ sub data_sources {
+
+ my $drh = shift;
+ my $attr = shift || '';
+ ## Future: connect to "postgres" when the minimum version we support is 8.0
+ my $connstring = 'dbname=template1';
+ if ($ENV{DBI_DSN}) {
+ ($connstring = $ENV{DBI_DSN}) =~ s/dbi:Pg://;
+ }
+ if (length $attr) {
+ $connstring .= ";$attr";
+ }
+
+ my $dbh = DBD::Pg::dr::connect($drh, $connstring) or return undef;
+ $dbh->{AutoCommit}=1;
+ my $SQL = 'SELECT pg_catalog.quote_ident(datname) FROM pg_catalog.pg_database ORDER BY 1';
+ my $sth = $dbh->prepare($SQL);
+ $sth->execute() or die $DBI::errstr;
+ $attr and $attr = ";$attr";
+ my @sources = map { "dbi:Pg:dbname=$_->[0]$attr" } @{$sth->fetchall_arrayref()};
+ $dbh->disconnect;
+ return @sources;
+ }
+
+
+ sub connect { ## no critic (ProhibitBuiltinHomonyms)
+ my ($drh, $dbname, $user, $pass, $attr) = @_;
+
+ ## Allow "db" and "database" as synonyms for "dbname"
+ $dbname =~ s/\b(?:db|database)\s*=/dbname=/;
+
+ my $name = $dbname;
+ if ($dbname =~ m{dbname\s*=\s*[\"\']([^\"\']+)}) {
+ $name = "'$1'";
+ $dbname =~ s/\"/\'/g;
+ }
+ elsif ($dbname =~ m{dbname\s*=\s*([^;]+)}) {
+ $name = $1;
+ }
+
+ $user = defined($user) ? $user : defined $ENV{DBI_USER} ? $ENV{DBI_USER} : '';
+ $pass = defined($pass) ? $pass : defined $ENV{DBI_PASS} ? $ENV{DBI_PASS} : '';
+
+ my ($dbh) = DBI::_new_dbh($drh, {
+ 'Name' => $dbname,
+ 'Username' => $user,
+ 'CURRENT_USER' => $user,
+ });
+
+ # Connect to the database..
+ DBD::Pg::db::_login($dbh, $dbname, $user, $pass) or return undef;
+
+ my $version = $dbh->{pg_server_version};
+ $dbh->{private_dbdpg}{version} = $version;
+
+ if ($attr) {
+ if ($attr->{dbd_verbose}) {
+ $dbh->trace('DBD');
+ }
+ }
+
+ return $dbh;
+ }
+
+ sub private_attribute_info {
+ return {
+ };
+ }
+
+} ## end of package DBD::Pg::dr
+
+
+{
+ package DBD::Pg::db;
+
+ use DBI qw(:sql_types);
+
+ use strict;
+
+ sub parse_trace_flag {
+ my ($h, $flag) = @_;
+ return DBD::Pg->parse_trace_flag($flag);
+ }
+
+ sub prepare {
+ my($dbh, $statement, @attribs) = @_;
+
+ return undef if ! defined $statement;
+
+ # Create a 'blank' statement handle:
+ my $sth = DBI::_new_sth($dbh, {
+ 'Statement' => $statement,
+ });
+
+ DBD::Pg::st::_prepare($sth, $statement, @attribs) || 0;
+
+ return $sth;
+ }
+
+ sub last_insert_id {
+
+ my ($dbh, $catalog, $schema, $table, $col, $attr) = @_;
+
+ ## Our ultimate goal is to get a sequence
+ my ($sth, $count, $SQL, $sequence);
+
+ ## Cache all of our table lookups? Default is yes
+ my $cache = 1;
+
+ ## Catalog and col are not used
+ $schema = '' if ! defined $schema;
+ $table = '' if ! defined $table;
+ my $cachename = "lii$table$schema";
+
+ if (defined $attr and length $attr) {
+ ## If not a hash, assume it is a sequence name
+ if (! ref $attr) {
+ $attr = {sequence => $attr};
+ }
+ elsif (ref $attr ne 'HASH') {
+ $dbh->set_err(1, 'last_insert_id must be passed a hashref as the final argument');
+ return undef;
+ }
+ ## Named sequence overrides any table or schema settings
+ if (exists $attr->{sequence} and length $attr->{sequence}) {
+ $sequence = $attr->{sequence};
+ }
+ if (exists $attr->{pg_cache}) {
+ $cache = $attr->{pg_cache};
+ }
+ }
+
+ if (! defined $sequence and exists $dbh->{private_dbdpg}{$cachename} and $cache) {
+ $sequence = $dbh->{private_dbdpg}{$cachename};
+ }
+ elsif (! defined $sequence) {
+ ## At this point, we must have a valid table name
+ if (! length $table) {
+ $dbh->set_err(1, 'last_insert_id needs at least a sequence or table name');
+ return undef;
+ }
+ my @args = ($table);
+ ## Make sure the table in question exists and grab its oid
+ my ($schemajoin,$schemawhere) = ('','');
+ if (length $schema) {
+ $schemajoin = "\n JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)";
+ $schemawhere = "\n AND n.nspname = ?";
+ push @args, $schema;
+ }
+ $SQL = "SELECT c.oid FROM pg_catalog.pg_class c $schemajoin\n WHERE relname = ?$schemawhere";
+ if (! length $schema) {
+ $SQL .= ' AND pg_catalog.pg_table_is_visible(c.oid)';
+ }
+ $sth = $dbh->prepare_cached($SQL);
+ $count = $sth->execute(@args);
+ if (!defined $count or $count eq '0E0') {
+ $sth->finish();
+ my $message = qq{Could not find the table "$table"};
+ length $schema and $message .= qq{ in the schema "$schema"};
+ $dbh->set_err(1, $message);
+ return undef;
+ }
+ my $oid = $sth->fetchall_arrayref()->[0][0];
+ $oid =~ /(\d+)/ or die qq{OID was not numeric?!?\n};
+ $oid = $1;
+ ## This table has a primary key. Is there a sequence associated with it via a unique, indexed column?
+ $SQL = "SELECT a.attname, i.indisprimary, pg_catalog.pg_get_expr(adbin,adrelid)\n".
+ "FROM pg_catalog.pg_index i, pg_catalog.pg_attribute a, pg_catalog.pg_attrdef d\n ".
+ "WHERE i.indrelid = $oid AND d.adrelid=a.attrelid AND d.adnum=a.attnum\n".
+ " AND a.attrelid = $oid AND i.indisunique IS TRUE\n".
+ " AND a.atthasdef IS TRUE AND i.indkey[0]=a.attnum\n".
+ q{ AND d.adsrc ~ '^nextval'};
+ $sth = $dbh->prepare($SQL);
+ $count = $sth->execute();
+ if (!defined $count or $count eq '0E0') {
+ $sth->finish();
+ $dbh->set_err(1, qq{No suitable column found for last_insert_id of table "$table"});
+ return undef;
+ }
+ my $info = $sth->fetchall_arrayref();
+
+ ## We have at least one with a default value. See if we can determine sequences
+ my @def;
+ for (@$info) {
+ next unless $_->[2] =~ /^nextval\(+'([^']+)'::/o;
+ push @$_, $1;
+ push @def, $_;
+ }
+ if (!@def) {
+ $dbh->set_err(1, qq{No suitable column found for last_insert_id of table "$table"\n});
+ }
+ ## Tiebreaker goes to the primary keys
+ if (@def > 1) {
+ my @pri = grep { $_->[1] } @def;
+ if (1 != @pri) {
+ $dbh->set_err(1, qq{No suitable column found for last_insert_id of table "$table"\n});
+ }
+ @def = @pri;
+ }
+ $sequence = $def[0]->[3];
+ ## Cache this information for subsequent calls
+ $dbh->{private_dbdpg}{$cachename} = $sequence;
+ }
+
+ $sth = $dbh->prepare_cached('SELECT currval(?)');
+ $count = $sth->execute($sequence);
+ return undef if ! defined $count;
+ return $sth->fetchall_arrayref()->[0][0];
+
+ } ## end of last_insert_id
+
+ sub ping {
+ my $dbh = shift;
+ local $SIG{__WARN__} = sub { } if $dbh->FETCH('PrintError');
+ my $ret = DBD::Pg::db::_ping($dbh);
+ return $ret < 1 ? 0 : $ret;
+ }
+
+ sub pg_ping {
+ my $dbh = shift;
+ local $SIG{__WARN__} = sub { } if $dbh->FETCH('PrintError');
+ return DBD::Pg::db::_ping($dbh);
+ }
+
+ sub pg_type_info {
+ my($dbh,$pg_type) = @_;
+ local $SIG{__WARN__} = sub { } if $dbh->FETCH('PrintError');
+ my $ret = DBD::Pg::db::_pg_type_info($pg_type);
+ return $ret;
+ }
+
+ # Column expected in statement handle returned.
+ # table_cat, table_schem, table_name, column_name, data_type, type_name,
+ # column_size, buffer_length, DECIMAL_DIGITS, NUM_PREC_RADIX, NULLABLE,
+ # REMARKS, COLUMN_DEF, SQL_DATA_TYPE, SQL_DATETIME_SUB, CHAR_OCTET_LENGTH,
+ # ORDINAL_POSITION, IS_NULLABLE
+ # The result set is ordered by TABLE_SCHEM, TABLE_NAME and ORDINAL_POSITION.
+
+ sub column_info {
+ my $dbh = shift;
+ my ($catalog, $schema, $table, $column) = @_;
+
+ my @search;
+ ## If the schema or table has an underscore or a %, use a LIKE comparison
+ if (defined $schema and length $schema) {
+ push @search, 'n.nspname ' . ($schema =~ /[_%]/ ? 'LIKE ' : '= ') .
+ $dbh->quote($schema);
+ }
+ if (defined $table and length $table) {
+ push @search, 'c.relname ' . ($table =~ /[_%]/ ? 'LIKE ' : '= ') .
+ $dbh->quote($table);
+ }
+ if (defined $column and length $column) {
+ push @search, 'a.attname ' . ($column =~ /[_%]/ ? 'LIKE ' : '= ') .
+ $dbh->quote($column);
+ }
+
+ my $whereclause = join "\n\t\t\t\tAND ", '', @search;
+
+ my $schemajoin = 'JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)';
+
+ my $remarks = 'pg_catalog.col_description(a.attrelid, a.attnum)';
+
+ my $column_def = $dbh->{private_dbdpg}{version} >= 80000
+ ? 'pg_catalog.pg_get_expr(af.adbin, af.adrelid)'
+ : 'af.adsrc';
+
+ my $col_info_sql = qq!
+ SELECT
+ NULL::text AS "TABLE_CAT"
+ , quote_ident(n.nspname) AS "TABLE_SCHEM"
+ , quote_ident(c.relname) AS "TABLE_NAME"
+ , quote_ident(a.attname) AS "COLUMN_NAME"
+ , a.atttypid AS "DATA_TYPE"
+ , pg_catalog.format_type(a.atttypid, NULL) AS "TYPE_NAME"
+ , a.attlen AS "COLUMN_SIZE"
+ , NULL::text AS "BUFFER_LENGTH"
+ , NULL::text AS "DECIMAL_DIGITS"
+ , NULL::text AS "NUM_PREC_RADIX"
+ , CASE a.attnotnull WHEN 't' THEN 0 ELSE 1 END AS "NULLABLE"
+ , $remarks AS "REMARKS"
+ , $column_def AS "COLUMN_DEF"
+ , NULL::text AS "SQL_DATA_TYPE"
+ , NULL::text AS "SQL_DATETIME_SUB"
+ , NULL::text AS "CHAR_OCTET_LENGTH"
+ , a.attnum AS "ORDINAL_POSITION"
+ , CASE a.attnotnull WHEN 't' THEN 'NO' ELSE 'YES' END AS "IS_NULLABLE"
+ , pg_catalog.format_type(a.atttypid, a.atttypmod) AS "pg_type"
+ , '?' AS "pg_constraint"
+ , n.nspname AS "pg_schema"
+ , c.relname AS "pg_table"
+ , a.attname AS "pg_column"
+ , a.attrelid AS "pg_attrelid"
+ , a.attnum AS "pg_attnum"
+ , a.atttypmod AS "pg_atttypmod"
+ , t.typtype AS "_pg_type_typtype"
+ , t.oid AS "_pg_type_oid"
+ FROM
+ pg_catalog.pg_type t
+ JOIN pg_catalog.pg_attribute a ON (t.oid = a.atttypid)
+ JOIN pg_catalog.pg_class c ON (a.attrelid = c.oid)
+ LEFT JOIN pg_catalog.pg_attrdef af ON (a.attnum = af.adnum AND a.attrelid = af.adrelid)
+ $schemajoin
+ WHERE
+ a.attnum >= 0
+ AND c.relkind IN ('r','v')
+ $whereclause
+ ORDER BY "TABLE_SCHEM", "TABLE_NAME", "ORDINAL_POSITION"
+ !;
+
+ my $data = $dbh->selectall_arrayref($col_info_sql) or return undef;
+
+ # To turn the data back into a statement handle, we need
+ # to fetch the data as an array of arrays, and also have a
+ # a matching array of all the column names
+ my %col_map = (qw/
+ TABLE_CAT 0
+ TABLE_SCHEM 1
+ TABLE_NAME 2
+ COLUMN_NAME 3
+ DATA_TYPE 4
+ TYPE_NAME 5
+ COLUMN_SIZE 6
+ BUFFER_LENGTH 7
+ DECIMAL_DIGITS 8
+ NUM_PREC_RADIX 9
+ NULLABLE 10
+ REMARKS 11
+ COLUMN_DEF 12
+ SQL_DATA_TYPE 13
+ SQL_DATETIME_SUB 14
+ CHAR_OCTET_LENGTH 15
+ ORDINAL_POSITION 16
+ IS_NULLABLE 17
+ pg_type 18
+ pg_constraint 19
+ pg_schema 20
+ pg_table 21
+ pg_column 22
+ pg_enum_values 23
+ /);
+
+ for my $row (@$data) {
+ my $typoid = pop @$row;
+ my $typtype = pop @$row;
+ my $typmod = pop @$row;
+ my $attnum = pop @$row;
+ my $aid = pop @$row;
+
+ $row->[$col_map{COLUMN_SIZE}] =
+ _calc_col_size($typmod,$row->[$col_map{COLUMN_SIZE}]);
+
+ # Replace the Pg type with the SQL_ type
+ $row->[$col_map{DATA_TYPE}] = DBD::Pg::db::pg_type_info($dbh,$row->[$col_map{DATA_TYPE}]);
+
+ # Add pg_constraint
+ my $SQL = q{SELECT consrc FROM pg_catalog.pg_constraint WHERE contype = 'c' AND }.
+ qq{conrelid = $aid AND conkey = '{$attnum}'};
+ my $info = $dbh->selectall_arrayref($SQL);
+ if (@$info) {
+ $row->[19] = $info->[0][0];
+ }
+ else {
+ $row->[19] = undef;
+ }
+
+ if ( $typtype eq 'e' ) {
+ $SQL = "SELECT enumlabel FROM pg_catalog.pg_enum WHERE enumtypid = $typoid ORDER BY oid";
+ $row->[23] = $dbh->selectcol_arrayref($SQL);
+ }
+ else {
+ $row->[23] = undef;
+ }
+ }
+
+ # Since we've processed the data in Perl, we have to jump through a hoop
+ # To turn it back into a statement handle
+ #
+ return _prepare_from_data
+ (
+ 'column_info',
+ $data,
+ [ sort { $col_map{$a} <=> $col_map{$b} } keys %col_map]
+ );
+ }
+
+ sub _prepare_from_data {
+ my ($statement, $data, $names, %attr) = @_;
+ my $sponge = DBI->connect('dbi:Sponge:', '', '', { RaiseError => 1 });
+ my $sth = $sponge->prepare($statement, { rows=>$data, NAME=>$names, %attr });
+ return $sth;
+ }
+
+ sub statistics_info {
+
+ my $dbh = shift;
+ my ($catalog, $schema, $table, $unique_only, $quick, $attr) = @_;
+
+ ## Catalog is ignored, but table is mandatory
+ return undef unless defined $table and length $table;
+
+ my $schema_where = '';
+ my @exe_args = ($table);
+
+ my $input_schema = (defined $schema and length $schema) ? 1 : 0;
+
+ if ($input_schema) {
+ $schema_where = 'AND n.nspname = ? AND n.oid = d.relnamespace';
+ push(@exe_args, $schema);
+ }
+ else {
+ $schema_where = 'AND n.oid = d.relnamespace';
+ }
+
+ my $table_stats_sql = qq{
+ SELECT d.relpages, d.reltuples, n.nspname
+ FROM pg_catalog.pg_class d, pg_catalog.pg_namespace n
+ WHERE d.relname = ? $schema_where
+ };
+
+ my $colnames_sql = qq{
+ SELECT
+ a.attnum, a.attname
+ FROM
+ pg_catalog.pg_attribute a, pg_catalog.pg_class d, pg_catalog.pg_namespace n
+ WHERE
+ a.attrelid = d.oid AND d.relname = ? $schema_where
+ };
+
+ my $stats_sql = qq{
+ SELECT
+ c.relname, i.indkey, i.indisunique, i.indisclustered, a.amname,
+ n.nspname, c.relpages, c.reltuples, i.indexprs,
+ pg_get_expr(i.indpred,i.indrelid) as predicate
+ FROM
+ pg_catalog.pg_index i, pg_catalog.pg_class c,
+ pg_catalog.pg_class d, pg_catalog.pg_am a,
+ pg_catalog.pg_namespace n
+ WHERE
+ d.relname = ? $schema_where AND d.oid = i.indrelid
+ AND i.indexrelid = c.oid AND c.relam = a.oid
+ ORDER BY
+ i.indisunique desc, a.amname, c.relname
+ };
+
+ my @output_rows;
+
+ # Table-level stats
+ if (!$unique_only) {
+ my $table_stats_sth = $dbh->prepare($table_stats_sql);
+ $table_stats_sth->execute(@exe_args) or return undef;
+ my $tst = $table_stats_sth->fetchrow_hashref or return undef;
+ push(@output_rows, [
+ undef, # TABLE_CAT
+ $tst->{nspname}, # TABLE_SCHEM
+ $table, # TABLE_NAME
+ undef, # NON_UNIQUE
+ undef, # INDEX_QUALIFIER
+ undef, # INDEX_NAME
+ 'table', # TYPE
+ undef, # ORDINAL_POSITION
+ undef, # COLUMN_NAME
+ undef, # ASC_OR_DESC
+ $tst->{reltuples},# CARDINALITY
+ $tst->{relpages}, # PAGES
+ undef, # FILTER_CONDITION
+ ]);
+ }
+
+ # Fetch the column names for later use
+ my $colnames_sth = $dbh->prepare($colnames_sql);
+ $colnames_sth->execute(@exe_args) or return undef;
+ my $colnames = $colnames_sth->fetchall_hashref('attnum');
+
+ # Fetch the index definitions
+ my $sth = $dbh->prepare($stats_sql);
+ $sth->execute(@exe_args) or return undef;
+
+ STAT_ROW:
+ #use Data::Dumper;
+ #warn Dumper $stats_sql;
+ while (my $row = $sth->fetchrow_hashref) {
+ #warn Dumper $row;
+ next if $row->{indexprs}; # We can't return these accurately via this interface ...
+ next if $unique_only and !$row->{indisunique};
+
+ my $indtype = $row->{indisclustered}
+ ? 'clustered'
+ : ( $row->{amname} eq 'btree' )
+ ? 'btree'
+ : ($row->{amname} eq 'hash' )
+ ? 'hashed' : 'other';
+
+ my $nonunique = $row->{indisunique} ? 0 : 1;
+
+ my @index_row = (
+ undef, # TABLE_CAT
+ $row->{nspname}, # TABLE_SCHEM
+ $table, # TABLE_NAME
+ $nonunique, # NON_UNIQUE
+ undef, # INDEX_QUALIFIER
+ $row->{relname}, # INDEX_NAME
+ $indtype, # TYPE
+ undef, # ORDINAL_POSITION
+ undef, # COLUMN_NAME
+ 'A', # ASC_OR_DESC
+ $row->{reltuples}, # CARDINALITY
+ $row->{relpages}, # PAGES
+ $row->{predicate}, # FILTER_CONDITION
+ );
+
+ my $col_nums = $row->{indkey};
+ $col_nums =~ s/^\s+//;
+ my @col_nums = split(/\s+/, $col_nums);
+
+ my $ord_pos = 1;
+ for my $col_num (@col_nums) {
+ my @copy = @index_row;
+ $copy[7] = $ord_pos++; # ORDINAL_POSITION
+ $copy[8] = $colnames->{$col_num}->{attname}; # COLUMN_NAME
+ push(@output_rows, \@copy);
+ }
+ }
+
+ my @output_colnames = qw/ TABLE_CAT TABLE_SCHEM TABLE_NAME NON_UNIQUE INDEX_QUALIFIER
+ INDEX_NAME TYPE ORDINAL_POSITION COLUMN_NAME ASC_OR_DESC
+ CARDINALITY PAGES FILTER_CONDITION /;
+
+ return _prepare_from_data('statistics_info', \@output_rows, \@output_colnames);
+ }
+
+ sub primary_key_info {
+
+ my $dbh = shift;
+ my ($catalog, $schema, $table, $attr) = @_;
+
+ ## Catalog is ignored, but table is mandatory
+ return undef unless defined $table and length $table;
+
+ my $whereclause = 'AND c.relname = ' . $dbh->quote($table);
+
+ if (defined $schema and length $schema) {
+ $whereclause .= "\n\t\t\tAND n.nspname = " . $dbh->quote($schema);
+ }
+
+ my $TSJOIN = 'pg_catalog.pg_tablespace t ON (t.oid = c.reltablespace)';
+ if ($dbh->{private_dbdpg}{version} < 80000) {
+ $TSJOIN = '(SELECT 0 AS oid, 0 AS spcname, 0 AS spclocation LIMIT 0) AS t ON (t.oid=1)';
+ }
+
+ my $pri_key_sql = qq{
+ SELECT
+ c.oid
+ , quote_ident(n.nspname)
+ , quote_ident(c.relname)
+ , quote_ident(c2.relname)
+ , i.indkey, quote_ident(t.spcname), quote_ident(t.spclocation)
+ , n.nspname, c.relname, c2.relname
+ FROM
+ pg_catalog.pg_class c
+ JOIN pg_catalog.pg_index i ON (i.indrelid = c.oid)
+ JOIN pg_catalog.pg_class c2 ON (c2.oid = i.indexrelid)
+ LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
+ LEFT JOIN $TSJOIN
+ WHERE
+ i.indisprimary IS TRUE
+ $whereclause
+ };
+
+ my $sth = $dbh->prepare($pri_key_sql) or return undef;
+ $sth->execute();
+ my $info = $sth->fetchall_arrayref()->[0];
+ return undef if ! defined $info;
+
+ # Get the attribute information
+ my $indkey = join ',', split /\s+/, $info->[4];
+ my $sql = qq{
+ SELECT a.attnum, pg_catalog.quote_ident(a.attname) AS colname,
+ pg_catalog.quote_ident(t.typname) AS typename
+ FROM pg_catalog.pg_attribute a, pg_catalog.pg_type t
+ WHERE a.attrelid = '$info->[0]'
+ AND a.atttypid = t.oid
+ AND attnum IN ($indkey);
+ };
+ $sth = $dbh->prepare($sql) or return undef;
+ $sth->execute();
+ my $attribs = $sth->fetchall_hashref('attnum');
+
+ my $pkinfo = [];
+
+ ## Normal way: complete "row" per column in the primary key
+ if (!exists $attr->{'pg_onerow'}) {
+ my $x=0;
+ my @key_seq = split/\s+/, $info->[4];
+ for (@key_seq) {
+ # TABLE_CAT
+ $pkinfo->[$x][0] = undef;
+ # SCHEMA_NAME
+ $pkinfo->[$x][1] = $info->[1];
+ # TABLE_NAME
+ $pkinfo->[$x][2] = $info->[2];
+ # COLUMN_NAME
+ $pkinfo->[$x][3] = $attribs->{$_}{colname};
+ # KEY_SEQ
+ $pkinfo->[$x][4] = $_;
+ # PK_NAME
+ $pkinfo->[$x][5] = $info->[3];
+ # DATA_TYPE
+ $pkinfo->[$x][6] = $attribs->{$_}{typename};
+ $pkinfo->[$x][7] = $info->[5];
+ $pkinfo->[$x][8] = $info->[6];
+ $pkinfo->[$x][9] = $info->[7];
+ $pkinfo->[$x][10] = $info->[8];
+ $pkinfo->[$x][11] = $info->[9];
+ $x++;
+ }
+ }
+ else { ## Nicer way: return only one row
+
+ # TABLE_CAT
+ $info->[0] = undef;
+ # TABLESPACES
+ $info->[7] = $info->[5];
+ $info->[8] = $info->[6];
+ # Unquoted names
+ $info->[9] = $info->[7];
+ $info->[10] = $info->[8];
+ $info->[11] = $info->[9];
+ # PK_NAME
+ $info->[5] = $info->[3];
+ # COLUMN_NAME
+ $info->[3] = 2==$attr->{'pg_onerow'} ?
+ [ map { $attribs->{$_}{colname} } split /\s+/, $info->[4] ] :
+ join ', ', map { $attribs->{$_}{colname} } split /\s+/, $info->[4];
+ # DATA_TYPE
+ $info->[6] = 2==$attr->{'pg_onerow'} ?
+ [ map { $attribs->{$_}{typename} } split /\s+/, $info->[4] ] :
+ join ', ', map { $attribs->{$_}{typename} } split /\s+/, $info->[4];
+ # KEY_SEQ
+ $info->[4] = 2==$attr->{'pg_onerow'} ?
+ [ split /\s+/, $info->[4] ] :
+ join ', ', split /\s+/, $info->[4];
+
+ $pkinfo = [$info];
+ }
+
+ my @cols = (qw(TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME
+ KEY_SEQ PK_NAME DATA_TYPE));
+ push @cols, 'pg_tablespace_name', 'pg_tablespace_location';
+ push @cols, 'pg_schema', 'pg_table', 'pg_column';
+
+ return _prepare_from_data('primary_key_info', $pkinfo, \@cols);
+
+ }
+
+ sub primary_key {
+ my $sth = primary_key_info(@_[0..3], {pg_onerow => 2});
+ return defined $sth ? @{$sth->fetchall_arrayref()->[0][3]} : ();
+ }
+
+
+ sub foreign_key_info {
+
+ my $dbh = shift;
+
+ ## PK: catalog, schema, table, FK: catalog, schema, table, attr
+
+ my $oldname = $dbh->{FetchHashKeyName};
+
+ local $dbh->{FetchHashKeyName} = 'NAME_lc';
+
+ ## Each of these may be undef or empty
+ my $pschema = $_[1] || '';
+ my $ptable = $_[2] || '';
+ my $fschema = $_[4] || '';
+ my $ftable = $_[5] || '';
+ my $args = $_[6];
+
+ ## No way to currently specify it, but we are ready when there is
+ my $odbc = 0;
+
+ ## Must have at least one named table
+ return undef if !$ptable and !$ftable;
+
+ ## If only the primary table is given, we return only those columns
+ ## that are used as foreign keys, even if that means that we return
+ ## unique keys but not primary one. We also return all the foreign
+ ## tables/columns that are referencing them, of course.
+
+ ## The first step is to find the oid of each specific table in the args:
+ ## Return undef if no matching relation found
+ my %oid;
+ for ([$ptable, $pschema, 'P'], [$ftable, $fschema, 'F']) {
+ if (length $_->[0]) {
+ my $SQL = "SELECT c.oid AS schema FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n\n".
+ 'WHERE c.relnamespace = n.oid AND c.relname = ' . $dbh->quote($_->[0]);
+ if (length $_->[1]) {
+ $SQL .= ' AND n.nspname = ' . $dbh->quote($_->[1]);
+ }
+ my $info = $dbh->selectall_arrayref($SQL);
+ return undef if ! @$info;
+ $oid{$_->[2]} = $info->[0][0];
+ }
+ }
+
+ ## We now need information about each constraint we care about.
+ ## Foreign table: only 'f' / Primary table: only 'p' or 'u'
+ my $WHERE = $odbc ? q{((contype = 'p'} : q{((contype IN ('p','u')};
+ if (length $ptable) {
+ $WHERE .= " AND conrelid=$oid{'P'}::oid";
+ }
+ else {
+ $WHERE .= " AND conrelid IN (SELECT DISTINCT confrelid FROM pg_catalog.pg_constraint WHERE conrelid=$oid{'F'}::oid)";
+ if (length $pschema) {
+ $WHERE .= ' AND n2.nspname = ' . $dbh->quote($pschema);
+ }
+ }
+
+ $WHERE .= ")\n \t\t\t\tOR \n \t\t\t\t(contype = 'f'";
+ if (length $ftable) {
+ $WHERE .= " AND conrelid=$oid{'F'}::oid";
+ if (length $ptable) {
+ $WHERE .= " AND confrelid=$oid{'P'}::oid";
+ }
+ }
+ else {
+ $WHERE .= " AND confrelid = $oid{'P'}::oid";
+ if (length $fschema) {
+ $WHERE .= ' AND n2.nspname = ' . $dbh->quote($fschema);
+ }
+ }
+ $WHERE .= '))';
+
+ ## Grab everything except specific column names:
+ my $fk_sql = qq{
+ SELECT conrelid, confrelid, contype, conkey, confkey,
+ pg_catalog.quote_ident(c.relname) AS t_name, pg_catalog.quote_ident(n2.nspname) AS t_schema,
+ pg_catalog.quote_ident(n.nspname) AS c_schema, pg_catalog.quote_ident(conname) AS c_name,
+ CASE
+ WHEN confupdtype = 'c' THEN 0
+ WHEN confupdtype = 'r' THEN 1
+ WHEN confupdtype = 'n' THEN 2
+ WHEN confupdtype = 'a' THEN 3
+ WHEN confupdtype = 'd' THEN 4
+ ELSE -1
+ END AS update,
+ CASE
+ WHEN confdeltype = 'c' THEN 0
+ WHEN confdeltype = 'r' THEN 1
+ WHEN confdeltype = 'n' THEN 2
+ WHEN confdeltype = 'a' THEN 3
+ WHEN confdeltype = 'd' THEN 4
+ ELSE -1
+ END AS delete,
+ CASE
+ WHEN condeferrable = 'f' THEN 7
+ WHEN condeferred = 't' THEN 6
+ WHEN condeferred = 'f' THEN 5
+ ELSE -1
+ END AS defer
+ FROM pg_catalog.pg_constraint k, pg_catalog.pg_class c, pg_catalog.pg_namespace n, pg_catalog.pg_namespace n2
+ WHERE $WHERE
+ AND k.connamespace = n.oid
+ AND k.conrelid = c.oid
+ AND c.relnamespace = n2.oid
+ ORDER BY conrelid ASC
+ };
+
+ my $sth = $dbh->prepare($fk_sql);
+ $sth->execute();
+ my $info = $sth->fetchall_arrayref({});
+ return undef if ! defined $info or ! @$info;
+
+ ## Return undef if just ptable given but no fk found
+ return undef if ! length $ftable and ! grep { $_->{'contype'} eq 'f'} @$info;
+
+ ## Figure out which columns we need information about
+ my %colnum;
+ for my $row (@$info) {
+ for (@{$row->{'conkey'}}) {
+ $colnum{$row->{'conrelid'}}{$_}++;
+ }
+ if ($row->{'contype'} eq 'f') {
+ for (@{$row->{'confkey'}}) {
+ $colnum{$row->{'confrelid'}}{$_}++;
+ }
+ }
+ }
+ ## Get the information about the columns computed above
+ my $SQL = qq{
+ SELECT a.attrelid, a.attnum, pg_catalog.quote_ident(a.attname) AS colname,
+ pg_catalog.quote_ident(t.typname) AS typename
+ FROM pg_catalog.pg_attribute a, pg_catalog.pg_type t
+ WHERE a.atttypid = t.oid
+ AND (\n};
+
+ $SQL .= join "\n\t\t\t\tOR\n" => map {
+ my $cols = join ',' => keys %{$colnum{$_}};
+ "\t\t\t\t( a.attrelid = '$_' AND a.attnum IN ($cols) )"
+ } sort keys %colnum;
+
+ $sth = $dbh->prepare(qq{$SQL \)});
+ $sth->execute();
+ my $attribs = $sth->fetchall_arrayref({});
+
+ ## Make a lookup hash
+ my %attinfo;
+ for (@$attribs) {
+ $attinfo{"$_->{'attrelid'}"}{"$_->{'attnum'}"} = $_;
+ }
+
+ ## This is an array in case we have identical oid/column combos. Lowest oid wins
+ my %ukey;
+ for my $c (grep { $_->{'contype'} ne 'f' } @$info) {
+ ## Munge multi-column keys into sequential order
+ my $multi = join ' ' => sort @{$c->{'conkey'}};
+ push @{$ukey{$c->{'conrelid'}}{$multi}}, $c;
+ }
+
+ ## Finally, return as a SQL/CLI structure:
+ my $fkinfo = [];
+ my $x=0;
+ for my $t (sort { $a->{'c_name'} cmp $b->{'c_name'} } grep { $_->{'contype'} eq 'f' } @$info) {
+ ## We need to find which constraint row (if any) matches our confrelid-confkey combo
+ ## by checking out ukey hash. We sort for proper matching of { 1 2 } vs. { 2 1 }
+ ## No match means we have a pure index constraint
+ my $u;
+ my $multi = join ' ' => sort @{$t->{'confkey'}};
+ if (exists $ukey{$t->{'confrelid'}}{$multi}) {
+ $u = $ukey{$t->{'confrelid'}}{$multi}->[0];
+ }
+ else {
+ ## Mark this as an index so we can fudge things later on
+ $multi = 'index';
+ ## Grab the first one found, modify later on as needed
+ $u = ((values %{$ukey{$t->{'confrelid'}}})[0]||[])->[0];
+ ## Bail in case there was no match
+ next if ! ref $u;
+ }
+
+ ## ODBC is primary keys only
+ next if $odbc and ($u->{'contype'} ne 'p' or $multi eq 'index');
+
+ my $conkey = $t->{'conkey'};
+ my $confkey = $t->{'confkey'};
+ for (my $y=0; $conkey->[$y]; $y++) {
+ # UK_TABLE_CAT
+ $fkinfo->[$x][0] = undef;
+ # UK_TABLE_SCHEM
+ $fkinfo->[$x][1] = $u->{'t_schema'};
+ # UK_TABLE_NAME
+ $fkinfo->[$x][2] = $u->{'t_name'};
+ # UK_COLUMN_NAME
+ $fkinfo->[$x][3] = $attinfo{$t->{'confrelid'}}{$confkey->[$y]}{'colname'};
+ # FK_TABLE_CAT
+ $fkinfo->[$x][4] = undef;
+ # FK_TABLE_SCHEM
+ $fkinfo->[$x][5] = $t->{'t_schema'};
+ # FK_TABLE_NAME
+ $fkinfo->[$x][6] = $t->{'t_name'};
+ # FK_COLUMN_NAME
+ $fkinfo->[$x][7] = $attinfo{$t->{'conrelid'}}{$conkey->[$y]}{'colname'};
+ # ORDINAL_POSITION
+ $fkinfo->[$x][8] = $conkey->[$y];
+ # UPDATE_RULE
+ $fkinfo->[$x][9] = "$t->{'update'}";
+ # DELETE_RULE
+ $fkinfo->[$x][10] = "$t->{'delete'}";
+ # FK_NAME
+ $fkinfo->[$x][11] = $t->{'c_name'};
+ # UK_NAME (may be undef if an index with no named constraint)
+ $fkinfo->[$x][12] = $multi eq 'index' ? undef : $u->{'c_name'};
+ # DEFERRABILITY
+ $fkinfo->[$x][13] = "$t->{'defer'}";
+ # UNIQUE_OR_PRIMARY
+ $fkinfo->[$x][14] = ($u->{'contype'} eq 'p' and $multi ne 'index') ? 'PRIMARY' : 'UNIQUE';
+ # UK_DATA_TYPE
+ $fkinfo->[$x][15] = $attinfo{$t->{'confrelid'}}{$confkey->[$y]}{'typename'};
+ # FK_DATA_TYPE
+ $fkinfo->[$x][16] = $attinfo{$t->{'conrelid'}}{$conkey->[$y]}{'typename'};
+ $x++;
+ } ## End each column in this foreign key
+ } ## End each foreign key
+
+ my @CLI_cols = (qw(
+ UK_TABLE_CAT UK_TABLE_SCHEM UK_TABLE_NAME UK_COLUMN_NAME
+ FK_TABLE_CAT FK_TABLE_SCHEM FK_TABLE_NAME FK_COLUMN_NAME
+ ORDINAL_POSITION UPDATE_RULE DELETE_RULE FK_NAME UK_NAME
+ DEFERABILITY UNIQUE_OR_PRIMARY UK_DATA_TYPE FK_DATA_TYPE
+ ));
+
+ my @ODBC_cols = (qw(
+ PKTABLE_CAT PKTABLE_SCHEM PKTABLE_NAME PKCOLUMN_NAME
+ FKTABLE_CAT FKTABLE_SCHEM FKTABLE_NAME FKCOLUMN_NAME
+ KEY_SEQ UPDATE_RULE DELETE_RULE FK_NAME PK_NAME
+ DEFERABILITY UNIQUE_OR_PRIMARY PK_DATA_TYPE FKDATA_TYPE
+ ));
+
+ if ($oldname eq 'NAME_lc') {
+ if ($odbc) {
+ for my $col (@ODBC_cols) {
+ $col = lc $col;
+ }
+ }
+ else {
+ for my $col (@CLI_cols) {
+ $col = lc $col;
+ }
+ }
+ }
+
+ return _prepare_from_data('foreign_key_info', $fkinfo, $odbc ? \@ODBC_cols : \@CLI_cols);
+
+ }
+
+
+ sub table_info {
+
+ my $dbh = shift;
+ my ($catalog, $schema, $table, $type) = @_;
+
+ my $tbl_sql = ();
+
+ my $extracols = q{,NULL::text AS pg_schema, NULL::text AS pg_table};
+ if ( # Rule 19a
+ (defined $catalog and $catalog eq '%')
+ and (defined $schema and $schema eq '')
+ and (defined $table and $table eq '')
+ ) {
+ $tbl_sql = qq{
+ SELECT
+ NULL::text AS "TABLE_CAT"
+ , NULL::text AS "TABLE_SCHEM"
+ , NULL::text AS "TABLE_NAME"
+ , NULL::text AS "TABLE_TYPE"
+ , NULL::text AS "REMARKS" $extracols
+ };
+ }
+ elsif (# Rule 19b
+ (defined $catalog and $catalog eq '')
+ and (defined $schema and $schema eq '%')
+ and (defined $table and $table eq '')
+ ) {
+ $extracols = q{,n.nspname AS pg_schema, NULL::text AS pg_table};
+ $tbl_sql = qq{SELECT
+ NULL::text AS "TABLE_CAT"
+ , quote_ident(n.nspname) AS "TABLE_SCHEM"
+ , NULL::text AS "TABLE_NAME"
+ , NULL::text AS "TABLE_TYPE"
+ , CASE WHEN n.nspname ~ '^pg_' THEN 'system schema' ELSE 'owned by ' || pg_get_userbyid(n.nspowner) END AS "REMARKS" $extracols
+ FROM pg_catalog.pg_namespace n
+ ORDER BY "TABLE_SCHEM"
+ };
+ }
+ elsif (# Rule 19c
+ (defined $catalog and $catalog eq '')
+ and (defined $schema and $schema eq '')
+ and (defined $table and $table eq '')
+ and (defined $type and $type eq '%')
+ ) {
+ $tbl_sql = qq{
+ SELECT
+ NULL::text AS "TABLE_CAT"
+ , NULL::text AS "TABLE_SCHEM"
+ , NULL::text AS "TABLE_NAME"
+ , 'TABLE' AS "TABLE_TYPE"
+ , 'relkind: r' AS "REMARKS" $extracols
+ UNION
+ SELECT
+ NULL::text AS "TABLE_CAT"
+ , NULL::text AS "TABLE_SCHEM"
+ , NULL::text AS "TABLE_NAME"
+ , 'VIEW' AS "TABLE_TYPE"
+ , 'relkind: v' AS "REMARKS" $extracols
+ };
+ }
+ else {
+ # Default SQL
+ $extracols = q{,n.nspname AS pg_schema, c.relname AS pg_table};
+ my @search;
+ my $showtablespace = ', quote_ident(t.spcname) AS "pg_tablespace_name", quote_ident(t.spclocation) AS "pg_tablespace_location"';
+
+ ## If the schema or table has an underscore or a %, use a LIKE comparison
+ if (defined $schema and length $schema) {
+ push @search, 'n.nspname ' . ($schema =~ /[_%]/ ? 'LIKE ' : '= ') . $dbh->quote($schema);
+ }
+ if (defined $table and length $table) {
+ push @search, 'c.relname ' . ($table =~ /[_%]/ ? 'LIKE ' : '= ') . $dbh->quote($table);
+ }
+ ## All we can see is "table" or "view". Default is both
+ my $typesearch = q{IN ('r','v')};
+ if (defined $type and length $type) {
+ if ($type =~ /\btable\b/i and $type !~ /\bview\b/i) {
+ $typesearch = q{= 'r'};
+ }
+ elsif ($type =~ /\bview\b/i and $type !~ /\btable\b/i) {
+ $typesearch = q{= 'v'};
+ }
+ }
+ push @search, "c.relkind $typesearch";
+
+ my $TSJOIN = 'pg_catalog.pg_tablespace t ON (t.oid = c.reltablespace)';
+ if ($dbh->{private_dbdpg}{version} < 80000) {
+ $TSJOIN = '(SELECT 0 AS oid, 0 AS spcname, 0 AS spclocation LIMIT 0) AS t ON (t.oid=1)';
+ }
+ my $whereclause = join "\n\t\t\t\t\t AND " => @search;
+ $tbl_sql = qq{
+ SELECT NULL::text AS "TABLE_CAT"
+ , quote_ident(n.nspname) AS "TABLE_SCHEM"
+ , quote_ident(c.relname) AS "TABLE_NAME"
+ , CASE
+ WHEN c.relkind = 'v' THEN
+ CASE WHEN quote_ident(n.nspname) ~ '^pg_' THEN 'SYSTEM VIEW' ELSE 'VIEW' END
+ ELSE
+ CASE WHEN quote_ident(n.nspname) ~ '^pg_' THEN 'SYSTEM TABLE' ELSE 'TABLE' END
+ END AS "TABLE_TYPE"
+ , d.description AS "REMARKS" $showtablespace $extracols
+ FROM pg_catalog.pg_class AS c
+ LEFT JOIN pg_catalog.pg_description AS d
+ ON (c.oid = d.objoid AND c.tableoid = d.classoid AND d.objsubid = 0)
+ LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
+ LEFT JOIN $TSJOIN
+ WHERE $whereclause
+ ORDER BY "TABLE_TYPE", "TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME"
+ };
+ }
+ my $sth = $dbh->prepare( $tbl_sql ) or return undef;
+ $sth->execute();
+
+ return $sth;
+ }
+
+ sub tables {
+ my ($dbh, @args) = @_;
+ my $attr = $args[4];
+ my $sth = $dbh->table_info(@args) or return;
+ my $tables = $sth->fetchall_arrayref() or return;
+ my @tables = map { (! (ref $attr eq 'HASH' and $attr->{pg_noprefix})) ?
+ "$_->[1].$_->[2]" : $_->[2] } @$tables;
+ return @tables;
+ }
+
+ sub table_attributes {
+ my ($dbh, $table) = @_;
+
+ my $sth = $dbh->column_info(undef,undef,$table,undef);
+
+ my %convert = (
+ COLUMN_NAME => 'NAME',
+ DATA_TYPE => 'TYPE',
+ COLUMN_SIZE => 'SIZE',
+ NULLABLE => 'NOTNULL',
+ REMARKS => 'REMARKS',
+ COLUMN_DEF => 'DEFAULT',
+ pg_constraint => 'CONSTRAINT',
+ );
+
+ my $attrs = $sth->fetchall_arrayref(\%convert);
+
+ for my $row (@$attrs) {
+ # switch the column names
+ for my $name (keys %$row) {
+ $row->{ $convert{$name} } = $row->{$name};
+
+ ## Keep some original columns
+ delete $row->{$name} unless ($name eq 'REMARKS' or $name eq 'NULLABLE');
+
+ }
+ # Moved check outside of loop as it was inverting the NOTNULL value for
+ # attribute.
+ # NOTNULL inverts the sense of NULLABLE
+ $row->{NOTNULL} = ($row->{NOTNULL} ? 0 : 1);
+
+ my @pri_keys = ();
+ @pri_keys = $dbh->primary_key( undef, undef, $table );
+ $row->{PRIMARY_KEY} = scalar(grep { /^$row->{NAME}$/i } @pri_keys) ? 1 : 0;
+ }
+
+ return $attrs;
+
+ }
+
+ sub _calc_col_size {
+
+ my $mod = shift;
+ my $size = shift;
+
+
+ if ((defined $size) and ($size > 0)) {
+ return $size;
+ } elsif ($mod > 0xffff) {
+ my $prec = ($mod & 0xffff) - 4;
+ $mod >>= 16;
+ my $dig = $mod;
+ return "$prec,$dig";
+ } elsif ($mod >= 4) {
+ return $mod - 4;
+ } # else {
+ # $rtn = $mod;
+ # $rtn = undef;
+ # }
+
+ return;
+ }
+
+
+ sub type_info_all {
+ my ($dbh) = @_;
+
+ my $names =
+ {
+ TYPE_NAME => 0,
+ DATA_TYPE => 1,
+ COLUMN_SIZE => 2,
+ LITERAL_PREFIX => 3,
+ LITERAL_SUFFIX => 4,
+ CREATE_PARAMS => 5,
+ NULLABLE => 6,
+ CASE_SENSITIVE => 7,
+ SEARCHABLE => 8,
+ UNSIGNED_ATTRIBUTE => 9,
+ FIXED_PREC_SCALE => 10,
+ AUTO_UNIQUE_VALUE => 11,
+ LOCAL_TYPE_NAME => 12,
+ MINIMUM_SCALE => 13,
+ MAXIMUM_SCALE => 14,
+ SQL_DATA_TYPE => 15,
+ SQL_DATETIME_SUB => 16,
+ NUM_PREC_RADIX => 17,
+ INTERVAL_PRECISION => 18,
+ };
+
+ ## This list is derived from dbi_sql.h in DBI, from types.c and types.h, and from the PG docs
+
+ ## Aids to make the list more readable:
+ my $GIG = 1073741824;
+ my $PS = 'precision/scale';
+ my $LEN = 'length';
+ my $UN = undef;
+ my $ti =
+ [
+ $names,
+# name sql_type size pfx/sfx crt n/c/s +-/P/I local min max sub rdx itvl
+
+['unknown', SQL_UNKNOWN_TYPE, 0, $UN,$UN, $UN, 1,0,0, $UN,0,0, 'UNKNOWN', $UN,$UN,
+ SQL_UNKNOWN_TYPE, $UN, $UN, $UN ],
+['bytea', SQL_VARBINARY, $GIG, q{'},q{'}, $UN, 1,0,3, $UN,0,0, 'BYTEA', $UN,$UN,
+ SQL_VARBINARY, $UN, $UN, $UN ],
+['bpchar', SQL_CHAR, $GIG, q{'},q{'}, $LEN, 1,1,3, $UN,0,0, 'CHARACTER', $UN,$UN,
+ SQL_CHAR, $UN, $UN, $UN ],
+['numeric', SQL_DECIMAL, 1000, $UN,$UN, $PS, 1,0,2, 0,0,0, 'FLOAT', 0,1000,
+ SQL_DECIMAL, $UN, $UN, $UN ],
+['numeric', SQL_NUMERIC, 1000, $UN,$UN, $PS, 1,0,2, 0,0,0, 'FLOAT', 0,1000,
+ SQL_NUMERIC, $UN, $UN, $UN ],
+['int4', SQL_INTEGER, 10, $UN,$UN, $UN, 1,0,2, 0,0,0, 'INTEGER', 0,0,
+ SQL_INTEGER, $UN, $UN, $UN ],
+['int2', SQL_SMALLINT, 5, $UN,$UN, $UN, 1,0,2, 0,0,0, 'SMALLINT', 0,0,
+ SQL_SMALLINT, $UN, $UN, $UN ],
+['float4', SQL_FLOAT, 6, $UN,$UN, $PS, 1,0,2, 0,0,0, 'FLOAT', 0,6,
+ SQL_FLOAT, $UN, $UN, $UN ],
+['float8', SQL_REAL, 15, $UN,$UN, $PS, 1,0,2, 0,0,0, 'REAL', 0,15,
+ SQL_REAL, $UN, $UN, $UN ],
+['int8', SQL_DOUBLE, 20, $UN,$UN, $UN, 1,0,2, 0,0,0, 'LONGINT', 0,0,
+ SQL_DOUBLE, $UN, $UN, $UN ],
+['date', SQL_DATE, 10, q{'},q{'}, $UN, 1,0,2, $UN,0,0, 'DATE', 0,0,
+ SQL_DATE, $UN, $UN, $UN ],
+['tinterval',SQL_TIME, 18, q{'},q{'}, $UN, 1,0,2, $UN,0,0, 'TINTERVAL', 0,6,
+ SQL_TIME, $UN, $UN, $UN ],
+['timestamp',SQL_TIMESTAMP, 29, q{'},q{'}, $UN, 1,0,2, $UN,0,0, 'TIMESTAMP', 0,6,
+ SQL_TIMESTAMP, $UN, $UN, $UN ],
+['text', SQL_VARCHAR, $GIG, q{'},q{'}, $LEN, 1,1,3, $UN,0,0, 'TEXT', $UN,$UN,
+ SQL_VARCHAR, $UN, $UN, $UN ],
+['bool', SQL_BOOLEAN, 1, q{'},q{'}, $UN, 1,0,2, $UN,0,0, 'BOOLEAN', $UN,$UN,
+ SQL_BOOLEAN, $UN, $UN, $UN ],
+['array', SQL_ARRAY, 1, q{'},q{'}, $UN, 1,0,2, $UN,0,0, 'ARRAY', $UN,$UN,
+ SQL_ARRAY, $UN, $UN, $UN ],
+['date', SQL_TYPE_DATE, 10, q{'},q{'}, $UN, 1,0,2, $UN,0,0, 'DATE', 0,0,
+ SQL_TYPE_DATE, $UN, $UN, $UN ],
+['time', SQL_TYPE_TIME, 18, q{'},q{'}, $UN, 1,0,2, $UN,0,0, 'TIME', 0,6,
+ SQL_TYPE_TIME, $UN, $UN, $UN ],
+['timestamp',SQL_TYPE_TIMESTAMP,29, q{'},q{'}, $UN, 1,0,2, $UN,0,0, 'TIMESTAMP', 0,6,
+ SQL_TYPE_TIMESTAMP, $UN, $UN, $UN ],
+['timetz', SQL_TYPE_TIME_WITH_TIMEZONE,
+ 29, q{'},q{'}, $UN, 1,0,2, $UN,0,0, 'TIMETZ', 0,6,
+ SQL_TYPE_TIME_WITH_TIMEZONE, $UN, $UN, $UN ],
+['timestamptz',SQL_TYPE_TIMESTAMP_WITH_TIMEZONE,
+ 29, q{'},q{'}, $UN, 1,0,2, $UN,0,0, 'TIMESTAMPTZ',0,6,
+ SQL_TYPE_TIMESTAMP_WITH_TIMEZONE, $UN, $UN, $UN ],
+ #
+ # intentionally omitted: char, all geometric types, internal types
+ ];
+ return $ti;
+ }
+
+
+ # Characters that need to be escaped by quote().
+ my %esc = (
+ q{'} => '\\047', # '\\' . sprintf("%03o", ord("'")), # ISO SQL 2
+ '\\' => '\\134', # '\\' . sprintf("%03o", ord("\\")),
+ );
+
+ # Set up lookup for SQL types we don't want to escape.
+ my %no_escape = map { $_ => 1 }
+ DBI::SQL_INTEGER, DBI::SQL_SMALLINT, DBI::SQL_DECIMAL,
+ DBI::SQL_FLOAT, DBI::SQL_REAL, DBI::SQL_DOUBLE, DBI::SQL_NUMERIC;
+
+ sub get_info {
+
+ my ($dbh,$type) = @_;
+
+ return undef unless defined $type and length $type;
+
+ my %type = (
+
+## Driver information:
+
+ 116 => ['SQL_ACTIVE_ENVIRONMENTS', 0 ], ## unlimited
+ 10021 => ['SQL_ASYNC_MODE', 2 ], ## SQL_AM_STATEMENT
+ 120 => ['SQL_BATCH_ROW_COUNT', 2 ], ## SQL_BRC_EXPLICIT
+ 121 => ['SQL_BATCH_SUPPORT', 3 ], ## 12 SELECT_PROC + ROW_COUNT_PROC
+ 2 => ['SQL_DATA_SOURCE_NAME', "dbi:Pg:$dbh->{Name}" ],
+ 3 => ['SQL_DRIVER_HDBC', 0 ], ## not applicable
+ 135 => ['SQL_DRIVER_HDESC', 0 ], ## not applicable
+ 4 => ['SQL_DRIVER_HENV', 0 ], ## not applicable
+ 76 => ['SQL_DRIVER_HLIB', 0 ], ## not applicable
+ 5 => ['SQL_DRIVER_HSTMT', 0 ], ## not applicable
+ ## Not clear what should go here. Some things suggest 'Pg', others 'Pg.pm'. We'll use DBD::Pg for now
+ 6 => ['SQL_DRIVER_NAME', 'DBD::Pg' ],
+ 77 => ['SQL_DRIVER_ODBC_VERSION', '03.00' ],
+ 7 => ['SQL_DRIVER_VER', 'DBDVERSION' ], ## magic word
+ 144 => ['SQL_DYNAMIC_CURSOR_ATTRIBUTES1', 0 ], ## we can FETCH, but not via methods
+ 145 => ['SQL_DYNAMIC_CURSOR_ATTRIBUTES2', 0 ], ## same as above
+ 84 => ['SQL_FILE_USAGE', 0 ], ## SQL_FILE_NOT_SUPPORTED (this is good)
+ 146 => ['SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1', 519 ], ## not clear what this refers to in DBD context
+ 147 => ['SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2', 5209 ], ## see above
+ 81 => ['SQL_GETDATA_EXTENSIONS', 15 ], ## 1+2+4+8
+ 149 => ['SQL_INFO_SCHEMA_VIEWS', 3932149 ], ## not: assert, charset, collat, trans
+ 150 => ['SQL_KEYSET_CURSOR_ATTRIBUTES1', 0 ], ## applies to us?
+ 151 => ['SQL_KEYSET_CURSOR_ATTRIBUTES2', 0 ], ## see above
+ 10022 => ['SQL_MAX_ASYNC_CONCURRENT_STATEMENTS', 0 ], ## unlimited, probably
+ 0 => ['SQL_MAX_DRIVER_CONNECTIONS', 'MAXCONNECTIONS' ], ## magic word
+ 152 => ['SQL_ODBC_INTERFACE_CONFORMANCE', 1 ], ## SQL_OIC_LEVEL_1
+ 10 => ['SQL_ODBC_VER', '03.00.0000' ],
+ 153 => ['SQL_PARAM_ARRAY_ROW_COUNTS', 2 ], ## correct?
+ 154 => ['SQL_PARAM_ARRAY_SELECTS', 3 ], ## PAS_NO_SELECT
+ 11 => ['SQL_ROW_UPDATES', 'N' ],
+ 14 => ['SQL_SEARCH_PATTERN_ESCAPE', '\\' ],
+ 13 => ['SQL_SERVER_NAME', 'CURRENTDB' ], ## magic word
+ 166 => ['SQL_STANDARD_CLI_CONFORMANCE', 2 ], ## ??
+ 167 => ['SQL_STATIC_CURSOR_ATTRIBUTES1', 519 ], ## ??
+ 168 => ['SQL_STATIC_CURSOR_ATTRIBUTES2', 5209 ], ## ??
+
+## DBMS Information
+
+ 16 => ['SQL_DATABASE_NAME', 'CURRENTDB' ], ## magic word
+ 17 => ['SQL_DBMS_NAME', 'PostgreSQL' ],
+ 18 => ['SQL_DBMS_VERSION', 'ODBCVERSION' ], ## magic word
+
+## Data source information
+
+ 20 => ['SQL_ACCESSIBLE_PROCEDURES', 'Y' ], ## is this really true?
+ 19 => ['SQL_ACCESSIBLE_TABLES', 'Y' ], ## is this really true?
+ 82 => ['SQL_BOOKMARK_PERSISTENCE', 0 ],
+ 42 => ['SQL_CATALOG_TERM', '' ], ## empty = catalogs are not supported
+ 10004 => ['SQL_COLLATION_SEQ', 'ENCODING' ], ## magic word
+ 22 => ['SQL_CONCAT_NULL_BEHAVIOR', 0 ], ## SQL_CB_NULL
+ 23 => ['SQL_CURSOR_COMMIT_BEHAVIOR', 1 ], ## SQL_CB_CLOSE
+ 24 => ['SQL_CURSOR_ROLLBACK_BEHAVIOR', 1 ], ## SQL_CB_CLOSE
+ 10001 => ['SQL_CURSOR_SENSITIVITY', 1 ], ## SQL_INSENSITIVE
+ 25 => ['SQL_DATA_SOURCE_READ_ONLY', 'READONLY' ], ## magic word
+ 26 => ['SQL_DEFAULT_TXN_ISOLATION', 'DEFAULTTXN' ], ## magic word (2 or 8)
+ 10002 => ['SQL_DESCRIBE_PARAMETER', 'Y' ],
+ 36 => ['SQL_MULT_RESULT_SETS', 'Y' ],
+ 37 => ['SQL_MULTIPLE_ACTIVE_TXN', 'Y' ],
+ 111 => ['SQL_NEED_LONG_DATA_LEN', 'N' ],
+ 85 => ['SQL_NULL_COLLATION', 0 ], ## SQL_NC_HIGH
+ 40 => ['SQL_PROCEDURE_TERM', 'function' ], ## for now
+ 39 => ['SQL_SCHEMA_TERM', 'schema' ],
+ 44 => ['SQL_SCROLL_OPTIONS', 8 ], ## not really for DBD?
+ 45 => ['SQL_TABLE_TERM', 'table' ],
+ 46 => ['SQL_TXN_CAPABLE', 2 ], ## SQL_TC_ALL
+ 72 => ['SQL_TXN_ISOLATION_OPTION', 10 ], ## 2+8
+ 47 => ['SQL_USER_NAME', $dbh->{CURRENT_USER} ],
+
+## Supported SQL
+
+ 169 => ['SQL_AGGREGATE_FUNCTIONS', 127 ], ## all of 'em
+ 117 => ['SQL_ALTER_DOMAIN', 31 ], ## all but deferred
+ 86 => ['SQL_ALTER_TABLE', 32639 ], ## no collate
+ 114 => ['SQL_CATALOG_LOCATION', 0 ],
+ 10003 => ['SQL_CATALOG_NAME', 'N' ],
+ 41 => ['SQL_CATALOG_NAME_SEPARATOR', '' ],
+ 92 => ['SQL_CATALOG_USAGE', 0 ],
+ 87 => ['SQL_COLUMN_ALIAS', 'Y' ],
+ 74 => ['SQL_CORRELATION_NAME', 2 ], ## SQL_CN_ANY
+ 127 => ['SQL_CREATE_ASSERTION', 0 ],
+ 128 => ['SQL_CREATE_CHARACTER_SET', 0 ],
+ 129 => ['SQL_CREATE_COLLATION', 0 ],
+ 130 => ['SQL_CREATE_DOMAIN', 23 ], ## no collation, no defer
+ 131 => ['SQL_CREATE_SCHEMA', 3 ], ## 1+2 schema + authorize
+ 132 => ['SQL_CREATE_TABLE', 13845 ], ## no collation
+ 133 => ['SQL_CREATE_TRANSLATION', 0 ],
+ 134 => ['SQL_CREATE_VIEW', 9 ], ## local + create?
+ 119 => ['SQL_DATETIME_LITERALS', 65535 ], ## all?
+ 170 => ['SQL_DDL_INDEX', 3 ], ## create + drop
+ 136 => ['SQL_DROP_ASSERTION', 0 ],
+ 137 => ['SQL_DROP_CHARACTER_SET', 0 ],
+ 138 => ['SQL_DROP_COLLATION', 0 ],
+ 139 => ['SQL_DROP_DOMAIN', 7 ],
+ 140 => ['SQL_DROP_SCHEMA', 7 ],
+ 141 => ['SQL_DROP_TABLE', 7 ],
+ 142 => ['SQL_DROP_TRANSLATION', 0 ],
+ 143 => ['SQL_DROP_VIEW', 7 ],
+ 27 => ['SQL_EXPRESSIONS_IN_ORDERBY', 'Y' ],
+ 88 => ['SQL_GROUP_BY', 2 ], ## GROUP_BY_CONTAINS_SELECT
+ 28 => ['SQL_IDENTIFIER_CASE', 2 ], ## SQL_IC_LOWER
+ 29 => ['SQL_IDENTIFIER_QUOTE_CHAR', q{"} ],
+ 148 => ['SQL_INDEX_KEYWORDS', 0 ], ## not needed for Pg
+ 172 => ['SQL_INSERT_STATEMENT', 7 ], ## 1+2+4 = all
+ 73 => ['SQL_INTEGRITY', 'Y' ], ## e.g. ON DELETE CASCADE?
+ 89 => ['SQL_KEYWORDS', 'KEYWORDS' ], ## magic word
+ 113 => ['SQL_LIKE_ESCAPE_CLAUSE', 'Y' ],
+ 75 => ['SQL_NON_NULLABLE_COLUMNS', 1 ], ## NNC_NOT_NULL
+ 115 => ['SQL_OJ_CAPABILITIES', 127 ], ## all
+ 90 => ['SQL_ORDER_BY_COLUMNS_IN_SELECT', 'N' ],
+ 38 => ['SQL_OUTER_JOINS', 'Y' ],
+ 21 => ['SQL_PROCEDURES', 'Y' ],
+ 93 => ['SQL_QUOTED_IDENTIFIER_CASE', 3 ], ## SQL_IC_SENSITIVE
+ 91 => ['SQL_SCHEMA_USAGE', 31 ], ## all
+ 94 => ['SQL_SPECIAL_CHARACTERS', '$' ], ## there are actually many more...
+ 118 => ['SQL_SQL_CONFORMANCE', 4 ], ## SQL92_INTERMEDIATE ??
+ 95 => ['SQL_SUBQUERIES', 31 ], ## all
+ 96 => ['SQL_UNION', 3 ], ## 1+2 = all
+
+## SQL limits
+
+ 112 => ['SQL_MAX_BINARY_LITERAL_LEN', 0 ],
+ 34 => ['SQL_MAX_CATALOG_NAME_LEN', 0 ],
+ 108 => ['SQL_MAX_CHAR_LITERAL_LEN', 0 ],
+ 30 => ['SQL_MAX_COLUMN_NAME_LEN', 'NAMEDATALEN' ], ## magic word
+ 97 => ['SQL_MAX_COLUMNS_IN_GROUP_BY', 0 ],
+ 98 => ['SQL_MAX_COLUMNS_IN_INDEX', 0 ],
+ 99 => ['SQL_MAX_COLUMNS_IN_ORDER_BY', 0 ],
+ 100 => ['SQL_MAX_COLUMNS_IN_SELECT', 0 ],
+ 101 => ['SQL_MAX_COLUMNS_IN_TABLE', 250 ], ## 250-1600 (depends on column types)
+ 31 => ['SQL_MAX_CURSOR_NAME_LEN', 'NAMEDATALEN' ], ## magic word
+ 10005 => ['SQL_MAX_IDENTIFIER_LEN', 'NAMEDATALEN' ], ## magic word
+ 102 => ['SQL_MAX_INDEX_SIZE', 0 ],
+ 102 => ['SQL_MAX_PROCEDURE_NAME_LEN', 'NAMEDATALEN' ], ## magic word
+ 104 => ['SQL_MAX_ROW_SIZE', 0 ], ## actually 1.6 TB, but too big to represent here
+ 103 => ['SQL_MAX_ROW_SIZE_INCLUDES_LONG', 'Y' ],
+ 32 => ['SQL_MAX_SCHEMA_NAME_LEN', 'NAMEDATALEN' ], ## magic word
+ 105 => ['SQL_MAX_STATEMENT_LEN', 0 ],
+ 35 => ['SQL_MAX_TABLE_NAME_LEN', 'NAMEDATALEN' ], ## magic word
+ 106 => ['SQL_MAX_TABLES_IN_SELECT', 0 ],
+ 107 => ['SQL_MAX_USER_NAME_LEN', 'NAMEDATALEN' ], ## magic word
+
+## Scalar function information
+
+ 48 => ['SQL_CONVERT_FUNCTIONS', 2 ], ## CVT_CAST only?
+ 49 => ['SQL_NUMERIC_FUNCTIONS', 16777215 ], ## ?? all but some naming clashes: rand(om), trunc(ate), log10=ln, etc.
+ 50 => ['SQL_STRING_FUNCTIONS', 16280984 ], ## ??
+ 51 => ['SQL_SYSTEM_FUNCTIONS', 0 ], ## ??
+ 109 => ['SQL_TIMEDATE_ADD_INTERVALS', 0 ], ## ?? no explicit timestampadd?
+ 110 => ['SQL_TIMEDATE_DIFF_INTERVALS', 0 ], ## ??
+ 52 => ['SQL_TIMEDATE_FUNCTIONS', 1966083 ],
+
+## Conversion information - all but BIT, LONGVARBINARY, and LONGVARCHAR
+
+ 53 => ['SQL_CONVERT_BIGINT', 1830399 ],
+ 54 => ['SQL_CONVERT_BINARY', 1830399 ],
+ 55 => ['SQL_CONVERT_BIT', 0 ],
+ 56 => ['SQL_CONVERT_CHAR', 1830399 ],
+ 57 => ['SQL_CONVERT_DATE', 1830399 ],
+ 58 => ['SQL_CONVERT_DECIMAL', 1830399 ],
+ 59 => ['SQL_CONVERT_DOUBLE', 1830399 ],
+ 60 => ['SQL_CONVERT_FLOAT', 1830399 ],
+ 61 => ['SQL_CONVERT_INTEGER', 1830399 ],
+ 123 => ['SQL_CONVERT_INTERVAL_DAY_TIME', 1830399 ],
+ 124 => ['SQL_CONVERT_INTERVAL_YEAR_MONTH', 1830399 ],
+ 71 => ['SQL_CONVERT_LONGVARBINARY', 0 ],
+ 62 => ['SQL_CONVERT_LONGVARCHAR', 0 ],
+ 63 => ['SQL_CONVERT_NUMERIC', 1830399 ],
+ 64 => ['SQL_CONVERT_REAL', 1830399 ],
+ 65 => ['SQL_CONVERT_SMALLINT', 1830399 ],
+ 66 => ['SQL_CONVERT_TIME', 1830399 ],
+ 67 => ['SQL_CONVERT_TIMESTAMP', 1830399 ],
+ 68 => ['SQL_CONVERT_TINYINT', 1830399 ],
+ 69 => ['SQL_CONVERT_VARBINARY', 0 ],
+ 70 => ['SQL_CONVERT_VARCHAR', 1830399 ],
+ 122 => ['SQL_CONVERT_WCHAR', 0 ],
+ 125 => ['SQL_CONVERT_WLONGVARCHAR', 0 ],
+ 126 => ['SQL_CONVERT_WVARCHAR', 0 ],
+
+ ); ## end of %type
+
+ ## Put both numbers and names into a hash
+ my %t;
+ for (keys %type) {
+ $t{$_} = $type{$_}->[1];
+ $t{$type{$_}->[0]} = $type{$_}->[1];
+ }
+
+ return undef unless exists $t{$type};
+
+ my $ans = $t{$type};
+
+ if ($ans eq 'NAMEDATALEN') {
+ return $dbh->selectall_arrayref('SHOW max_identifier_length')->[0][0];
+ }
+ elsif ($ans eq 'ODBCVERSION') {
+ my $version = $dbh->{private_dbdpg}{version};
+ return '00.00.0000' unless $version =~ /^(\d\d?)(\d\d)(\d\d)$/o;
+ return sprintf '%02d.%02d.%.2d00', $1,$2,$3;
+ }
+ elsif ($ans eq 'DBDVERSION') {
+ my $simpleversion = $DBD::Pg::VERSION;
+ $simpleversion =~ s/_/./g;
+ return sprintf '%02d.%02d.%1d%1d%1d%1d', split (/\./, "$simpleversion.0.0.0.0.0.0");
+ }
+ elsif ($ans eq 'MAXCONNECTIONS') {
+ return $dbh->selectall_arrayref('SHOW max_connections')->[0][0];
+ }
+ elsif ($ans eq 'ENCODING') {
+ return $dbh->selectall_arrayref('SHOW server_encoding')->[0][0];
+ }
+ elsif ($ans eq 'KEYWORDS') {
+ ## http://www.postgresql.org/docs/current/static/sql-keywords-appendix.html
+ ## Basically, we want ones that are 'reserved' for PostgreSQL but not 'reserved' in SQL:2003
+ ##
+ return join ',' => (qw(ANALYSE ANALYZE ASC DEFERRABLE DESC DO FREEZE ILIKE INITIALLY ISNULL LIMIT NOTNULL OFF OFFSET PLACING RETURNING VERBOSE));
+ }
+ elsif ($ans eq 'CURRENTDB') {
+ return $dbh->selectall_arrayref('SELECT pg_catalog.current_database()')->[0][0];
+ }
+ elsif ($ans eq 'READONLY') {
+ my $SQL = q{SELECT CASE WHEN setting = 'on' THEN 'Y' ELSE 'N' END FROM pg_settings WHERE name = 'transaction_read_only'};
+ my $info = $dbh->selectall_arrayref($SQL);
+ return defined $info->[0] ? $info->[0][0] : 'N';
+ }
+ elsif ($ans eq 'DEFAULTTXN') {
+ my $SQL = q{SELECT CASE WHEN setting = 'read committed' THEN 2 ELSE 8 END FROM pg_settings WHERE name = 'default_transaction_isolation'};
+ my $info = $dbh->selectall_arrayref($SQL);
+ return defined $info->[0] ? $info->[0][0] : 2;
+ }
+
+ return $ans;
+ } # end of get_info
+
+ sub private_attribute_info {
+ return {
+ pg_async_status => undef,
+ pg_bool_tf => undef,
+ pg_db => undef,
+ pg_default_port => undef,
+ pg_enable_utf8 => undef,
+ pg_errorlevel => undef,
+ pg_expand_array => undef,
+ pg_host => undef,
+ pg_INV_READ => undef,
+ pg_INV_WRITE => undef,
+ pg_lib_version => undef,
+ pg_options => undef,
+ pg_pass => undef,
+ pg_pid => undef,
+ pg_placeholder_dollaronly => undef,
+ pg_port => undef,
+ pg_prepare_now => undef,
+ pg_protocol => undef,
+ pg_server_prepare => undef,
+ pg_server_version => undef,
+ pg_socket => undef,
+ pg_standard_conforming_strings => undef,
+ pg_user => undef,
+ };
+ }
+}
+
+
+{
+ package DBD::Pg::st;
+
+ sub parse_trace_flag {
+ my ($h, $flag) = @_;
+ return DBD::Pg->parse_trace_flag($flag);
+ }
+
+ sub bind_param_array {
+
+ ## Binds an array of data to a specific placeholder in a statement
+ ## The DBI version is broken, so we implement a near-copy here
+
+ my $sth = shift;
+ my ($p_id, $value_array, $attr) = @_;
+
+ ## Bail if the second arg is not undef or an an arrayref
+ return $sth->set_err(1, "Value for parameter $p_id must be a scalar or an arrayref, not a ".ref($value_array))
+ if defined $value_array and ref $value_array and ref $value_array ne 'ARRAY';
+
+ ## Bail if the first arg is not a number
+ return $sth->set_err(1, q{Can't use named placeholders for non-driver supported bind_param_array})
+ unless DBI::looks_like_number($p_id); # because we rely on execute(@ary) here
+
+ ## Store the list of items in the hash (will be undef or an arayref)
+ $sth->{ParamArrays}{$p_id} = $value_array;
+
+ ## If any attribs were passed in, we need to call bind_param
+ return $sth->bind_param($p_id, '', $attr) if $attr; ## This is the big change so -w does not complain
+
+ return 1;
+ } ## end bind_param_array
+
+ sub private_attribute_info {
+ return {
+ pg_async => undef,
+ pg_bound => undef,
+ pg_current_row => undef,
+ pg_direct => undef,
+ pg_numbound => undef,
+ pg_cmd_status => undef,
+ pg_oid_status => undef,
+ pg_placeholder_dollaronly => undef,
+ pg_prepare_name => undef,
+ pg_prepare_now => undef,
+ pg_segments => undef,
+ pg_server_prepare => undef,
+ pg_size => undef,
+ pg_type => undef,
+ };
+ }
+
+} ## end st section
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBD::Pg - PostgreSQL database driver for the DBI module
+
+=head1 SYNOPSIS
+
+ use DBI;
+
+ $dbh = DBI->connect("dbi:Pg:dbname=$dbname", '', '', {AutoCommit => 0});
+ # The AutoCommit attribute should always be explicitly set
+
+ # For some advanced uses you may need PostgreSQL type values:
+ use DBD::Pg qw(:pg_types);
+
+ # For asynchronous calls, import the async constants:
+ use DBD::Pg qw(:async);
+
+ $dbh->do('INSERT INTO mytable(a) VALUES (1)');
+
+ $sth = $dbh->prepare('INSERT INTO mytable(a) VALUES (?)');
+ $sth->execute();
+
+=head1 VERSION
+
+This documents version 2.16.1 of the DBD::Pg module
+
+=head1 DESCRIPTION
+
+DBD::Pg is a Perl module that works with the DBI module to provide access to
+PostgreSQL databases.
+
+=head1 MODULE DOCUMENTATION
+
+This documentation describes driver specific behavior and restrictions. It is
+not supposed to be used as the only reference for the user. In any case
+consult the B<DBI> documentation first!
+
+=for html <a href="http://search.cpan.org/~timb/DBI/DBI.pm">Latest DBI docmentation.</a>
+
+=head1 THE DBI CLASS
+
+=head2 DBI Class Methods
+
+=head3 B<connect>
+
+This method creates a database handle by connecting to a database, and is the DBI
+equivalent of the "new" method. To connect to a Postgres database with a minimum of parameters,
+use the following syntax:
+
+ $dbh = DBI->connect("dbi:Pg:dbname=$dbname", '', '', {AutoCommit => 0});
+
+This connects to the database named in the C<$dbname> variable on the default port (usually 5432)
+without any user authentication.
+
+The following connect statement shows almost all possible parameters:
+
+ $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$host;port=$port;options=$options",
+ $username,
+ $password,
+ {AutoCommit => 0, RaiseError => 1, PrintError => 0}
+ );
+
+If a parameter is not given, the connect() method will first look for
+specific environment variables, and then fall back to hard-coded defaults:
+
+ parameter environment variable hard coded default
+ ------------------------------------------------------
+ host PGHOST local domain socket
+ hostaddr PGHOSTADDR local domain socket
+ port PGPORT 5432
+ dbname* PGDATABASE current userid
+ username PGUSER current userid
+ password PGPASSWORD (none)
+ options PGOPTIONS (none)
+ service PGSERVICE (none)
+ sslmode PGSSLMODE (none)
+
+* May also use the aliases C<db> or C<database>
+
+If the username and password values passed via C<connect()> are undefined (as opposed
+to merely being empty strings), DBI will use the environment variables I<DBI_USER>
+and I<DBI_PASS> if they exist.
+
+You can also connect by using a service connection file, which is named
+F<pg_service.conf>. The location of this file can be controlled by
+setting the I<PGSYSCONFDIR> environment variable. To use one of the named
+services within the file, set the name by using either the I<service> parameter
+or the environment variable I<PGSERVICE>. Note that when connecting this way,
+only the minimum parameters should be used. For example, to connect to a
+service named "zephyr", you could use:
+
+ $dbh = DBI->connect("dbi:Pg:service=zephyr", '', '');
+
+You could also set C<$ENV{PGSERVICE}> to "zephyr" and connect like this:
+
+ $dbh = DBI->connect("dbi:Pg:", '', '');
+
+The format of the F<pg_service.conf> file is simply a bracketed service
+name, followed by one parameter per line in the format name=value.
+For example:
+
+ [zephyr]
+ dbname=winds
+ user=wisp
+ password=W$2Hc00YSgP
+ port=6543
+
+There are four valid arguments to the I<sslmode> parameter, which controls
+whether to use SSL to connect to the database:
+
+=over 4
+
+=item * disable: SSL connections are never used
+
+=item * allow: try non-SSL, then SSL
+
+=item * prefer: try SSL, then non-SSL
+
+=item * require: connect only with SSL
+
+=back
+
+You can also connect using sockets in a specific directory. This
+may be needed if the server you are connecting to has a different
+default socket directory from the one used to compile DBD::Pg.
+Use the complete path to the socket directory as the name of the
+host, like this:
+
+ $dbh = DBI->connect('dbi:Pg:dbname=foo;host=/var/tmp/socket',
+ $username,
+ $password,
+ {AutoCommit => 0, RaiseError => 1});
+
+The attribute hash can also contain a key named C<dbd_verbose>, which
+simply calls C<< $dbh->trace('DBD') >> after the handle is created. This attribute
+is not recommended, as it is clearer to simply explicitly call C<trace> explicitly
+in your script.
+
+=head3 B<connect_cached>
+
+ $dbh = DBI->connect_cached("dbi:Pg:dbname=$dbname", $username, $password, \%options);
+
+Implemented by DBI, no driver-specific impact.
+
+=head3 B<data_sources>
+
+ @data_sources = DBI->data_sources('Pg');
+ @data_sources = $dbh->data_sources();
+
+Returns a list of available databases. Unless the environment variable C<DBI_DSN> is set,
+a connection will be attempted to the database C<template1>. The normal connection
+environment variables also apply, such as C<PGHOST>, C<PGPORT>, C<DBI_USER>,
+C<DBI_PASS>, and C<PGSERVICE>.
+
+You can also pass in options to add to the connection string For example, to specify
+an alternate port and host:
+
+ @data_sources = DBI->data_sources('Pg', 'port=5824;host=example.com');
+
+ or:
+
+ @data_sources = $dbh->data_sources('port=5824;host=example.com');
+
+
+=head2 Methods Common To All Handles
+
+For all of the methods below, B<$h> can be either a database handle (B<$dbh>)
+or a statement handle (B<$sth>). Note that I<$dbh> and I<$sth> can be replaced with
+any variable name you choose: these are just the names most often used. Another
+common variable used in this documentation is $I<rv>, which stands for "return value".
+
+=head3 B<err>
+
+ $rv = $h->err;
+
+Returns the error code from the last method called. For the connect method it returns
+C<PQstatus>, which is a number used by I<libpq> (the Postgres connection library). A value of 0
+indicates no error (CONNECTION_OK), while any other number indicates a failed connection. The
+only other number commonly seen is 1 (CONNECTION_BAD). See the libpq documentation for the
+complete list of return codes.
+
+In all other non-connect methods C<< $h->err >> returns the C<PQresultStatus> of the current
+handle. This is a number used by libpq and is one of:
+
+ 0 Empty query string
+ 1 A command that returns no data successfully completed.
+ 2 A command that returns data sucessfully completed.
+ 3 A COPY OUT command is still in progress.
+ 4 A COPY IN command is still in progress.
+ 5 A bad response was received from the backend.
+ 6 A nonfatal error occurred (a notice or warning message)
+ 7 A fatal error was returned: the last query failed.
+
+=head3 B<errstr>
+
+ $str = $h->errstr;
+
+Returns the last error that was reported by Postgres. This message is affected
+by the L</pg_errorlevel> setting.
+
+=head3 B<state>
+
+ $str = $h->state;
+
+Returns a five-character "SQLSTATE" code. Success is indicated by a C<00000> code, which
+gets mapped to an empty string by DBI. A code of C<S8006> indicates a connection failure,
+usually because the connection to the Postgres server has been lost.
+
+While this method can be called as either C<< $sth->state >> or C<< $dbh->state >>, it
+is usually clearer to always use C<< $dbh->state >>.
+
+The list of codes used by PostgreSQL can be found at:
+L<http://www.postgresql.org/docs/current/static/errcodes-appendix.html>
+
+Note that these codes are part of the SQL standard and only a small number
+of them will be used by PostgreSQL.
+
+Common codes:
+
+ 00000 Successful completion
+ 25P01 No active SQL transaction
+ 25P02 In failed SQL transaction
+ S8006 Connection failure
+
+=head3 B<trace>
+
+ $h->trace($trace_settings);
+ $h->trace($trace_settings, $trace_filename);
+ $trace_settings = $h->trace;
+
+Changes the trace settings on a database or statement handle.
+The optional second argument specifies a file to write the
+trace information to. If no filename is given, the information
+is written to F<STDERR>. Note that tracing can be set globally as
+well by setting C<< DBI->trace >>, or by using the environment
+variable I<DBI_TRACE>.
+
+The value is either a numeric level or a named flag. For the
+flags that DBD::Pg uses, see L<parse_trace_flag|/parse_trace_flag and parse_trace_flags>.
+
+=head3 B<trace_msg>
+
+ $h->trace_msg($message_text);
+ $h->trace_msg($message_text, $min_level);
+
+Writes a message to the current trace output (as set by the L</trace> method). If a second argument
+is given, the message is only written if the current tracing level is equal to or greater than
+the C<$min_level>.
+
+=head3 B<parse_trace_flag> and B<parse_trace_flags>
+
+ $h->trace($h->parse_trace_flags('SQL|pglibpq'));
+ $h->trace($h->parse_trace_flags('1|pgstart'));
+
+ ## Simpler:
+ $h->trace('SQL|pglibpq');
+ $h->trace('1|pgstart');
+
+ my $value = DBD::Pg->parse_trace_flag('pglibpq');
+ DBI->trace($value);
+
+The parse_trace_flags method is used to convert one or more named
+flags to a number which can passed to the L</trace> method.
+DBD::Pg currently supports the DBI-specific flag, C<SQL>,
+as well as the ones listed below.
+
+Flags can be combined by using the parse_trace_flags method,
+which simply calls C<parse_trace_flag> on each item and
+combines them.
+
+Sometimes you may wish to turn the tracing on before you connect
+to the database. The second example above shows a way of doing this:
+the call to C<< DBD::Pg->parse_trace_flags >> provides a number than can
+be fed to C<< DBI->trace >> before you create a database handle.
+
+DBD::Pg supports the following trace flags:
+
+=over 4
+
+=item SQL
+
+Outputs all SQL statements. Note that the output provided will not
+necessarily be in a form suitable to passing directly to Postgres,
+as server-side prepared statements are used extensively by DBD::Pg.
+For maximum portability of output (but with a potential performance
+hit), use with C<< $dbh->{pg_server_prepare} = 0 >>.
+
+=item DBD
+
+Turns on all non-DBI flags, in other words, only the ones that are specific
+to DBD::Pg (all those below which start with the letters 'pg').
+
+=item pglibpq
+
+Outputs the name of each libpq function (without arguments) immediately
+before running it. This is a good way to trace the flow of your program
+at a low level. This information is also output if the trace level
+is set to 4 or greater.
+
+=item pgstart
+
+Outputs the name of each internal DBD::Pg function, and other information such as
+the function arguments or important global variables, as each function starts. This
+information is also output if the trace level is set to 4 or greater.
+
+=item pgend
+
+Outputs a simple message at the very end of each internal DBD::Pg function. This is also
+output if the trace level is set to 4 or greater.
+
+=item pgprefix
+
+Forces each line of trace output to begin with the string B<C<dbdpg: >>. This helps to
+differentiate it from the normal DBI trace output.
+
+=item pglogin
+
+Outputs a message showing the connection string right before a new database connection
+is attempted, a message when the connection was successful, and a message right after
+the database has been disconnected. Also output if trace level is 5 or greater.
+
+=back
+
+=for text See the DBI section on TRACING for more information.
+
+=for html See the <a href="http://search.cpan.org/~timb/DBI/DBI.pm#TRACING">DBI section on TRACING</a> for more information.<br />
+
+=head3 B<func>
+
+DBD::Pg uses the C<func> method to support a variety of functions.
+Note that the name of the function comes I<last>, after the arguments.
+
+=over
+
+=item table_attributes
+
+ $attrs = $dbh->func($table, 'table_attributes');
+
+Use of the tables_attributes function is no longer recommended. Instead,
+you can use the more portable C<column_info> and C<primary_key> methods
+to access the same information.
+
+The table_attributes method returns, for the given table argument, a
+reference to an array of hashes, each of which contains the following keys:
+
+ NAME attribute name
+ TYPE attribute type
+ SIZE attribute size (-1 for variable size)
+ NULLABLE flag nullable
+ DEFAULT default value
+ CONSTRAINT constraint
+ PRIMARY_KEY flag is_primary_key
+ REMARKS attribute description
+
+=item pg_lo_creat
+
+ $lobjId = $dbh->pg_lo_creat($mode);
+
+Creates a new large object and returns the object-id. C<$mode> is a bitmask
+describing read and write access to the new object. This setting is ignored
+since Postgres version 8.1. For backwards compatibility, however, you should
+set a valid mode anyway (see L</pg_lo_open> for a list of valid modes).
+
+Upon failure it returns C<undef>. This function cannot be used if AutoCommit is enabled.
+
+The old way of calling large objects functions is deprecated: $dbh->func(.., 'lo_);
+
+=item lo_open
+
+ $lobj_fd = $dbh->pg_lo_open($lobjId, $mode);
+
+Opens an existing large object and returns an object-descriptor for use in
+subsequent C<lo_*> calls. C<$mode> is a bitmask describing read and write
+access to the opened object. It may be one of:
+
+ $dbh->{pg_INV_READ}
+ $dbh->{pg_INV_WRITE}
+ $dbh->{pg_INV_READ} | $dbh->{pg_INV_WRITE}
+
+C<pg_INV_WRITE> and C<pg_INV_WRITE | pg_INV_READ> modes are identical; in
+both modes, the large object can be read from or written to.
+Reading from the object will provide the object as written in other committed
+transactions, along with any writes performed by the current transaction.
+Objects opened with C<pg_INV_READ> cannot be written to. Reading from this
+object will provide the stored data at the time of the transaction snapshot
+which was active when C<lo_write> was called.
+
+Returns C<undef> upon failure. Note that 0 is a perfectly correct (and common)
+object descriptor! This function cannot be used if AutoCommit is enabled.
+
+=item lo_write
+
+ $nbytes = $dbh->pg_lo_write($lobj_fd, $buffer, $len);
+
+Writes C<$len> bytes of c<$buffer> into the large object C<$lobj_fd>. Returns the number
+of bytes written and C<undef> upon failure. This function cannot be used if AutoCommit is enabled.
+
+=item lo_read
+
+ $nbytes = $dbh->pg_lo_read($lobj_fd, $buffer, $len);
+
+Reads C<$len> bytes into c<$buffer> from large object C<$lobj_fd>. Returns the number of
+bytes read and C<undef> upon failure. This function cannot be used if AutoCommit is enabled.
+
+=item lo_lseek
+
+ $loc = $dbh->pg_lo_lseek($lobj_fd, $offset, $whence);
+
+Changes the current read or write location on the large object
+C<$obj_id>. Currently C<$whence> can only be 0 (which is L_SET). Returns the current
+location and C<undef> upon failure. This function cannot be used if AutoCommit is enabled.
+
+=item lo_tell
+
+ $loc = $dbh->pg_lo_tell($lobj_fd);
+
+Returns the current read or write location on the large object C<$lobj_fd> and C<undef> upon failure.
+This function cannot be used if AutoCommit is enabled.
+
+=item lo_close
+
+ $lobj_fd = $dbh->pg_lo_close($lobj_fd);
+
+Closes an existing large object. Returns true upon success and false upon failure.
+This function cannot be used if AutoCommit is enabled.
+
+=item lo_unlink
+
+ $ret = $dbh->pg_lo_unlink($lobjId);
+
+Deletes an existing large object. Returns true upon success and false upon failure.
+This function cannot be used if AutoCommit is enabled.
+
+=item lo_import
+
+
+ $lobjId = $dbh->pg_lo_import($filename);
+
+Imports a Unix file as a large object and returns the object id of the new
+object or C<undef> upon failure.
+
+=item lo_export
+
+ $ret = $dbh->pg_lo_export($lobjId, $filename);
+
+Exports a large object into a Unix file. Returns false upon failure, true otherwise.
+
+=item getfd
+
+ $fd = $dbh->func('getfd');
+
+Deprecated, use L<< $dbh->{pg_socket}|/pg_socket >> instead.
+
+=back
+
+=head3 B<private_attribute_info>
+
+ $hashref = $dbh->private_attribute_info();
+ $hashref = $sth->private_attribute_info();
+
+Returns a hash of all private attributes used by DBD::Pg, for either
+a database or a statement handle. Currently, all the hash values are undef.
+
+=head1 ATTRIBUTES COMMON TO ALL HANDLES
+
+=head3 B<InactiveDestroy> (boolean)
+
+If set to true, then the L</disconnect> method will not be automatically called when
+the database handle goes out of scope. This is required if you are forking, and even
+then you must tread carefully and ensure that either the parent or the child (but not
+both!) handles all database calls from that point forwards, so that messages from the
+Postgres backend are only handled by one of the processes. If you don't set things up
+properly, you will see messages such as "I<server closed the connection unexpectedly>",
+and "I<message type 0x32 arrived from server while idle>". The best solution is to either
+have the child process reconnect to the database with a fresh database handle, or to
+rewrite your application not to use use forking. See the section on L</Asynchronous Queries>
+for a way to have your script continue to work while the database is processing a request.
+
+=head3 B<RaiseError> (boolean, inherited)
+
+Forces errors to always raise an exception. Although it defaults to off, it is recommended that this
+be turned on, as the alternative is to check the return value of every method (prepare, execute, fetch, etc.)
+manually, which is easy to forget to do.
+
+=head3 B<PrintError> (boolean, inherited)
+
+Forces database errors to also generate warnings, which can then be filtered with methods such as
+locally redefining I<$SIG{__WARN__}> or using modules such as C<CGI::Carp>. This attribute is on
+by default.
+
+=head3 B<ShowErrorStatement> (boolean, inherited)
+
+Appends information about the current statement to error messages. If placeholder information
+is available, adds that as well. Defaults to false.
+
+=head3 B<Warn> (boolean, inherited)
+
+Enables warnings. This is on by default, and should only be turned off in a local block
+for a short a time only when absolutely needed.
+
+=head3 B<Executed> (boolean, read-only)
+
+Indicates if a handle has been executed. For database handles, this value is true after the L</do> method has been called, or
+when one of the child statement handles has issued an L</execute>. Issuing a L</commit> or L</rollback> always resets the
+attribute to false for database handles. For statement handles, any call to L</execute> or its variants will flip the value to
+true for the lifetime of the statement handle.
+
+=head3 B<TraceLevel> (integer, inherited)
+
+Sets the trace level, similar to the L</trace> method. See the sections on
+L</trace> and L</parse_trace_flag> for more details.
+
+=head3 B<Active> (boolean, read-only)
+
+Indicates if a handle is active or not. For database handles, this indicates if the database has
+been disconnected or not. For statement handles, it indicates if all the data has been fetched yet
+or not. Use of this attribute is not encouraged.
+
+=head3 B<Kids> (integer, read-only)
+
+Returns the number of child processes created for each handle type. For a driver handle, indicates the number
+of database handles created. For a database handle, indicates the number of statement handles created. For
+statement handles, it always returns zero, because statement handles do not create kids.
+
+=head3 B<ActiveKids> (integer, read-only)
+
+Same as C<Kids>, but only returns those that are active.
+
+=head3 B<CachedKids> (hash ref)
+
+Returns a hashref of handles. If called on a database handle, returns all statement handles created by use of the
+C<prepare_cached> method. If called on a driver handle, returns all database handles created by the L</connect_cached>
+method.
+
+=head3 B<ChildHandles> (array ref)
+
+Implemented by DBI, no driver-specific impact.
+
+=head3 B<PrintWarn> (boolean, inherited)
+
+Implemented by DBI, no driver-specific impact.
+
+=head3 B<HandleError> (boolean, inherited)
+
+Implemented by DBI, no driver-specific impact.
+
+=head3 B<HandleSetErr> (code ref, inherited)
+
+Implemented by DBI, no driver-specific impact.
+
+=head3 B<ErrCount> (unsigned integer)
+
+Implemented by DBI, no driver-specific impact.
+
+=head3 B<FetchHashKeyName> (string, inherited)
+
+Implemented by DBI, no driver-specific impact.
+
+=head3 B<ChopBlanks> (boolean, inherited)
+
+Supported by DBD::Pg as proposed by DBI. This method is similar to the
+SQL function C<RTRIM>.
+
+=head3 B<Taint> (boolean, inherited)
+
+Implemented by DBI, no driver-specific impact.
+
+=head3 B<TaintIn> (boolean, inherited)
+
+Implemented by DBI, no driver-specific impact.
+
+=head3 B<TaintOut> (boolean, inherited)
+
+Implemented by DBI, no driver-specific impact.
+
+=head3 B<Profile> (inherited)
+
+Implemented by DBI, no driver-specific impact.
+
+=head3 B<Type> (scalar)
+
+Returns C<dr> for a driver handle, C<db> for a database handle, and C<st> for a statement handle.
+Should be rarely needed.
+
+=head3 B<LongReadLen>
+
+Not used by DBD::Pg
+
+=head3 B<LongTruncOk>
+
+Not used by DBD::Pg
+
+=head3 B<CompatMode>
+
+Not used by DBD::Pg
+
+=head1 DBI DATABASE HANDLE OBJECTS
+
+=head2 Database Handle Methods
+
+=head3 B<selectall_arrayref>
+
+ $ary_ref = $dbh->selectall_arrayref($sql);
+ $ary_ref = $dbh->selectall_arrayref($sql, \%attr);
+ $ary_ref = $dbh->selectall_arrayref($sql, \%attr, @bind_values);
+
+Returns a reference to an array containing the rows returned by preparing and executing the SQL string.
+See the DBI documentation for full details.
+
+=head3 B<selectall_hashref>
+
+ $hash_ref = $dbh->selectall_hashref($sql, $key_field);
+
+Returns a reference to a hash containing the rows returned by preparing and executing the SQL string.
+See the DBI documentation for full details.
+
+=head3 B<selectcol_arrayref>
+
+ $ary_ref = $dbh->selectcol_arrayref($sql, \%attr, @bind_values);
+
+Returns a reference to an array containing the first column
+from each rows returned by preparing and executing the SQL string. It is possible to specify exactly
+which columns to return. See the DBI documentation for full details.
+
+=head3 B<prepare>
+
+ $sth = $dbh->prepare($statement, \%attr);
+
+WARNING: DBD::Pg now (as of version 1.40) uses true prepared statements by sending them
+to the backend to be prepared by the Postgres server. Statements
+that were legal before may no longer work. See below for details.
+
+The prepare method prepares a statement for later execution. PostgreSQL supports
+prepared statements, which enables DBD::Pg to only send the query once, and
+simply send the arguments for every subsequent call to L</execute>.
+DBD::Pg can use these server-side prepared statements, or it can
+just send the entire query to the server each time. The best way
+is automatically chosen for each query. This will be sufficient for
+most users: keep reading for a more detailed explanation and some
+optional flags.
+
+Queries that do not begin with the word "SELECT", "INSERT",
+"UPDATE", or "DELETE" are never sent as server-side prepared statements.
+
+Deciding whether or not to use prepared statements depends on many factors,
+but you can force them to be used or not used by using the
+L</pg_server_prepare> attribute when calling L</prepare>. Setting this to "0" means to never use
+prepared statements. Setting L</pg_server_prepare> to "1" means that prepared
+statements should be used whenever possible. This is the default when connected
+to Postgres servers version 8.0 or higher. Servers that are version 7.4 get a special
+default value of "2", because server-side statements were only partially supported
+in that version. In this case, it only uses server-side prepares if all
+parameters are specifically bound.
+
+The L</pg_server_prepare> attribute can also be set at connection time like so:
+
+ $dbh = DBI->connect($DBNAME, $DBUSER, $DBPASS,
+ { AutoCommit => 0,
+ RaiseError => 1,
+ pg_server_prepare => 0,
+ });
+
+or you may set it after your database handle is created:
+
+ $dbh->{pg_server_prepare} = 1;
+
+To enable it for just one particular statement:
+
+ $sth = $dbh->prepare("SELECT id FROM mytable WHERE val = ?",
+ { pg_server_prepare => 1 });
+
+You can even toggle between the two as you go:
+
+ $sth->{pg_server_prepare} = 1;
+ $sth->execute(22);
+ $sth->{pg_server_prepare} = 0;
+ $sth->execute(44);
+ $sth->{pg_server_prepare} = 1;
+ $sth->execute(66);
+
+In the above example, the first execute will use the previously prepared statement.
+The second execute will not, but will build the query into a single string and send
+it to the server. The third one will act like the first and only send the arguments.
+Even if you toggle back and forth, a statement is only prepared once.
+
+Using prepared statements is in theory quite a bit faster: not only does the
+PostgreSQL backend only have to prepare the query only once, but DBD::Pg no
+longer has to worry about quoting each value before sending it to the server.
+
+However, there are some drawbacks. The server cannot always choose the ideal
+parse plan because it will not know the arguments before hand. But for most
+situations in which you will be executing similar data many times, the default
+plan will probably work out well. Programs such as PgBouncer which cache connections
+at a low level should not use prepared statements via DBD::Pg, or must take
+extra care in the application to account for the fact that prepared statements
+are not shared across database connections. Further discussion on this subject is beyond
+the scope of this documentation: please consult the pgsql-performance mailing
+list, L<http://archives.postgresql.org/pgsql-performance/>
+
+Only certain commands will be sent to a server-side prepare: currently these
+include C<SELECT>, C<INSERT>, C<UPDATE>, and C<DELETE>. DBD::Pg uses a simple
+naming scheme for the prepared statements themselves: B<dbdpg_XY_Z>, where B<Y> is the current
+PID, B<X> is either 'p' or 'n' (depending on if the PID is a positive or negative
+number), and B<Z> is a number that starts at 1 and increases each time a new statement
+is prepared. This number is tracked at the database handle level, so multiple
+statement handles will not collide.
+
+You cannot send more than one command at a time in the same prepare command
+(by separating them with semi-colons) when using server-side prepares.
+
+The actual C<PREPARE> is usually not performed until the first execute is called, due
+to the fact that information on the data types (provided by L</bind_param>) may
+be provided after the prepare but before the execute.
+
+A server-side prepare may happen before the first L</execute>, but only if the server can
+handle the server-side prepare, and the statement contains no placeholders. It will
+also be prepared if the L</pg_prepare_now> attribute is passed in and set to a true
+value. Similarly, the L</pg_prepare_now> attribute can be set to 0 to ensure that
+the statement is B<not> prepared immediately, although the cases in which you would
+want this are very rare. Finally, you can set the default behavior of all prepare
+statements by setting the L</pg_prepare_now> attribute on the database handle:
+
+ $dbh->{pg_prepare_now} = 1;
+
+The following two examples will be prepared right away:
+
+ $sth->prepare("SELECT 123"); ## no placeholders
+
+ $sth->prepare("SELECT 123, ?", {pg_prepare_now => 1});
+
+The following two examples will NOT be prepared right away:
+
+ $sth->prepare("SELECT 123, ?"); ## has a placeholder
+
+ $sth->prepare("SELECT 123", {pg_prepare_now => 0});
+
+There are times when you may want to prepare a statement yourself. To do this,
+simply send the C<PREPARE> statement directly to the server (e.g. with
+the L</do> method). Create a statement handle and set the prepared name via
+the L</pg_prepare_name> attribute. The statement handle can be created with a dummy
+statement, as it will not be executed. However, it should have the same
+number of placeholders as your prepared statement. Example:
+
+ $dbh->do('PREPARE mystat AS SELECT COUNT(*) FROM pg_class WHERE reltuples < ?');
+ $sth = $dbh->prepare('SELECT ?');
+ $sth->bind_param(1, 1, SQL_INTEGER);
+ $sth->{pg_prepare_name} = 'mystat';
+ $sth->execute(123);
+
+The above will run the equivalent of this query on the backend:
+
+ EXECUTE mystat(123);
+
+which is the equivalent of:
+
+ SELECT COUNT(*) FROM pg_class WHERE reltuples < 123;
+
+You can force DBD::Pg to send your query directly to the server by adding
+the L</pg_direct> attribute to your prepare call. This is not recommended,
+but is added just in case you need it.
+
+=head4 B<Placeholders>
+
+There are three types of placeholders that can be used in DBD::Pg. The first is
+the "question mark" type, in which each placeholder is represented by a single
+question mark character. This is the method recommended by the DBI specs and is the most
+portable. Each question mark is internally replaced by a "dollar sign number" in the order
+in which they appear in the query (important when using L</bind_param>).
+
+The method second type of placeholder is "dollar sign numbers". This is the method
+that Postgres uses internally and is overall probably the best method to use
+if you do not need compatibility with other database systems. DBD::Pg, like
+PostgreSQL, allows the same number to be used more than once in the query.
+Numbers must start with "1" and increment by one value (but can appear in any order
+within the query). If the same number appears more than once in a query, it is treated as a
+single parameter and all instances are replaced at once. Examples:
+
+Not legal:
+
+ $SQL = 'SELECT count(*) FROM pg_class WHERE relpages > $2'; # Does not start with 1
+
+ $SQL = 'SELECT count(*) FROM pg_class WHERE relpages BETWEEN $1 AND $3'; # Missing 2
+
+Legal:
+
+ $SQL = 'SELECT count(*) FROM pg_class WHERE relpages > $1';
+
+ $SQL = 'SELECT count(*) FROM pg_class WHERE relpages BETWEEN $1 AND $2';
+
+ $SQL = 'SELECT count(*) FROM pg_class WHERE relpages BETWEEN $2 AND $1'; # legal but confusing
+
+ $SQL = 'SELECT count(*) FROM pg_class WHERE relpages BETWEEN $1 AND $2 AND reltuples > $1';
+
+ $SQL = 'SELECT count(*) FROM pg_class WHERE relpages > $1 AND reltuples > $1';
+
+In the final statement above, DBI thinks there is only one placeholder, so this
+statement will replace both placeholders:
+
+ $sth->bind_param(1, 2045);
+
+While a simple execute with no bind_param calls requires only a single argument as well:
+
+ $sth->execute(2045);
+
+The final placeholder type is "named parameters" in the format ":foo". While this
+syntax is supported by DBD::Pg, its use is discouraged in favor of
+dollar-sign numbers.
+
+The different types of placeholders cannot be mixed within a statement, but you may
+use different ones for each statement handle you have. This is confusing at best, so
+stick to one style within your program.
+
+If your queries use operators that contain question marks (e.g. some of the native
+Postgres geometric operators) or array slices (e.g. C<data[100:300]>), you can tell
+DBD::Pg to ignore any non-dollar sign placeholders by setting the
+L</pg_placeholder_dollaronly> attribute at either the database handle or the statement
+handle level. Examples:
+
+ $dbh->{pg_placeholder_dollaronly} = 1;
+ $sth = $dbh->prepare(q{SELECT * FROM mytable WHERE lseg1 ?# lseg2 AND name = $1});
+ $sth->execute('segname');
+
+Alternatively, you can set it at prepare time:
+
+ $sth = $dbh->prepare(q{SELECT * FROM mytable WHERE lseg1 ?-| lseg2 AND name = $1},
+ {pg_placeholder_dollaronly = 1});
+ $sth->execute('segname');
+
+=head3 B<prepare_cached>
+
+ $sth = $dbh->prepare_cached($statement, \%attr);
+
+Implemented by DBI, no driver-specific impact. This method is most useful
+when using a server that supports server-side prepares, and you have asked
+the prepare to happen immediately via the L</pg_prepare_now> attribute.
+
+=head3 B<do>
+
+ $rv = $dbh->do($statement);
+ $rv = $dbh->do($statement, \%attr);
+ $rv = $dbh->do($statement, \%attr, @bind_values);
+
+Prepare and execute a single statement. Returns the number of rows affected if the
+query was successful, returns undef if an error occurred, and returns -1 if the
+number of rows is unknown or not available. Note that this method will return B<0E0> instead
+of 0 for 'no rows were affected', in order to always return a true value if no error occurred.
+
+If neither C<\%attr> nor C<@bind_values> is given, the query will be sent directly
+to the server without the overhead of internally creating a statement handle and
+running prepare and execute, for a measurable speed increase.
+
+Note that an empty statement (a string with no length) will not be passed to
+the server; if you want a simple test, use "SELECT 123" or the L</ping> method.
+
+=head3 B<last_insert_id>
+
+ $rv = $dbh->last_insert_id(undef, $schema, $table, undef);
+ $rv = $dbh->last_insert_id(undef, $schema, $table, undef, {sequence => $seqname});
+
+Attempts to return the id of the last value to be inserted into a table.
+You can either provide a sequence name (preferred) or provide a table
+name with optional schema, and DBD::Pg will attempt to find the sequence itself.
+The current value of the sequence is returned by a call to the C<CURRVAL()>
+PostgreSQL function. This will fail if the sequence has not yet been used in the
+current database connection.
+
+If you do not know the name of the sequence, you can provide a table name and
+DBD::Pg will attempt to return the correct value. To do this, there must be at
+least one column in the table with a C<NOT NULL> constraint, that has a unique
+constraint, and which uses a sequence as a default value. If more than one column
+meets these conditions, the primary key will be used. This involves some
+looking up of things in the system table, so DBD::Pg will cache the sequence
+name for subsequent calls. If you need to disable this caching for some reason,
+(such as the sequence name changing), you can control it by adding C<< pg_cache => 0 >>
+to the final (hashref) argument for last_insert_id.
+
+Please keep in mind that this method is far from foolproof, so make your
+script use it properly. Specifically, make sure that it is called
+immediately after the insert, and that the insert does not add a value
+to the column that is using the sequence as a default value. However, because
+we are using sequences, you can be sure that the value you got back has not
+been used by any other process.
+
+Some examples:
+
+ $dbh->do('CREATE SEQUENCE lii_seq START 1');
+ $dbh->do(q{CREATE TABLE lii (
+ foobar INTEGER NOT NULL UNIQUE DEFAULT nextval('lii_seq'),
+ baz VARCHAR)});
+ $SQL = 'INSERT INTO lii(baz) VALUES (?)';
+ $sth = $dbh->prepare($SQL);
+ for (qw(uno dos tres cuatro)) {
+ $sth->execute($_);
+ my $newid = $dbh->last_insert_id(undef,undef,undef,undef,{sequence=>'lii_seq'});
+ print "Last insert id was $newid\n";
+ }
+
+If you did not want to worry about the sequence name:
+
+ $dbh->do('CREATE TABLE lii2 (
+ foobar SERIAL UNIQUE,
+ baz VARCHAR)');
+ $SQL = 'INSERT INTO lii2(baz) VALUES (?)';
+ $sth = $dbh->prepare($SQL);
+ for (qw(uno dos tres cuatro)) {
+ $sth->execute($_);
+ my $newid = $dbh->last_insert_id(undef,undef,"lii2",undef);
+ print "Last insert id was $newid\n";
+ }
+
+=head3 B<commit>
+
+ $rv = $dbh->commit;
+
+Issues a COMMIT to the server, indicating that the current transaction is finished and that
+all changes made will be visible to other processes. If AutoCommit is enabled, then
+a warning is given and no COMMIT is issued. Returns true on success, false on error.
+See also the the section on L</Transactions>.
+
+=head3 B<rollback>
+
+ $rv = $dbh->rollback;
+
+Issues a ROLLBACK to the server, which discards any changes made in the current transaction. If AutoCommit
+is enabled, then a warning is given and no ROLLBACK is issued. Returns true on success, and
+false on error. See also the the section on L</Transactions>.
+
+=head3 B<begin_work>
+
+This method turns on transactions until the next call to L</commit> or L</rollback>, if L</AutoCommit> is
+currently enabled. If it is not enabled, calling begin_work will issue an error. Note that the
+transaction will not actually begin until the first statement after begin_work is called.
+Example:
+
+ $dbh->{AutoCommit} = 1;
+ $dbh->do('INSERT INTO foo VALUES (123)'); ## Changes committed immediately
+ $dbh->begin_work();
+ ## Not in a transaction yet, but AutoCommit is set to 0
+
+ $dbh->do("INSERT INTO foo VALUES (345)");
+ ## DBD::PG actually issues two statements here:
+ ## BEGIN;
+ ## INSERT INTO foo VALUES (345)
+ ## We are now in a transaction
+
+ $dbh->commit();
+ ## AutoCommit is now set to 1 again
+
+=head3 B<disconnect>
+
+ $rv = $dbh->disconnect;
+
+Disconnects from the Postgres database. Any uncommitted changes will be rolled back upon disconnection. It's
+good policy to always explicitly call commit or rollback at some point before disconnecting, rather than
+relying on the default rollback behavior.
+
+This method may give warnings about "disconnect invalidates X active statement handle(s)". This means that
+you called C<< $sth->execute() >> but did not finish fetching all the rows from them. To avoid seeing this
+warning, either fetch all the rows or call C<< $sth->finish() >> for each executed statement handle.
+
+If the script exits before disconnect is called (or, more precisely, if the database handle is no longer
+referenced by anything), then the database handle's DESTROY method will call the rollback() and disconnect()
+methods automatically. It is best to explicitly disconnect rather than rely on this behavior.
+
+=head3 B<quote>
+
+ $rv = $dbh->quote($value, $data_type);
+
+This module implements its own C<quote> method. For simple string types, both backslashes
+and single quotes are doubled. You may also quote arrayrefs and receive a string
+suitable for passing into Postgres array columns.
+
+If the value contains backslashes, and the server is version 8.1 or higher,
+then the escaped string syntax will be used (which places a capital E before
+the first single quote). This syntax is always used when quoting bytea values
+on servers 8.1 and higher.
+
+The C<data_type> argument is optional and should be one of the type constants
+exported by DBD::Pg (such as PG_BYTEA). In addition to string, bytea, char, bool,
+and other standard types, the following geometric types are supported: point, line,
+lseg, box, path, polygon, and circle (PG_POINT, PG_LINE, PG_LSEG, PG_BOX,
+PG_PATH, PG_POLYGON, and PG_CIRCLE respectively). To quote a Postgres-specific
+data type, you must use a 'hashref' argument like so:
+
+ my $quotedval = $dbh->quote($value, { pg_type => PG_VARCHAR });
+
+B<NOTE:> The undocumented (and invalid) support for the C<SQL_BINARY> data
+type is officially deprecated. Use C<PG_BYTEA> with C<bind_param()> instead:
+
+ $rv = $sth->bind_param($param_num, $bind_value,
+ { pg_type => PG_BYTEA });
+
+=head3 B<quote_identifier>
+
+ $string = $dbh->quote_identifier( $name );
+ $string = $dbh->quote_identifier( undef, $schema, $table);
+
+Returns a quoted version of the supplied string, which is commonly a schema,
+table, or column name. The three argument form will return the schema and
+the table together, separated by a dot. Examples:
+
+ print $dbh->quote_identifier('grapefruit'); ## Prints: "grapefruit"
+
+ print $dbh->quote_identifier('juicy fruit'); ## Prints: "juicy fruit"
+
+ print $dbh->quote_identifier(undef, 'public', 'pg_proc');
+ ## Prints: "public"."pg_proc"
+
+=head3 B<pg_notifies>
+
+ $ret = $dbh->pg_notifies;
+
+Looks for any asynchronous notifications received and returns either C<undef>
+or a reference to a three-element array consisting of an event name, the PID
+of the backend that sent the NOTIFY command, and the optional payload string.
+Note that this does not check if the connection to the database is still valid first -
+for that, use the c<ping> method. You may need to commit if not in autocommit mode -
+new notices will not be picked up while in the middle of a transaction. An example:
+
+ $dbh->do("LISTEN abc");
+ $dbh->do("LISTEN def");
+
+ ## Hang around until we get the message we want
+ LISTENLOOP: {
+ while (my $notify = $dbh->pg_notifies) {
+ my ($name, $pid, $payload) = @$notify;
+ print qq{I received notice "$name" from PID $pid, payload was "$payload"\n};
+ ## Do something based on the notice received
+ }
+ $dbh->ping() or die qq{Ping failed!};
+ $dbh->commit();
+ sleep(5);
+ redo;
+ }
+
+Payloads will always be an empty string unless you are connecting to a Postgres
+server version 8.5 or higher.
+
+=head3 B<ping>
+
+ $rv = $dbh->ping;
+
+This C<ping> method is used to check the validity of a database handle. The value returned is
+either 0, indicating that the connection is no longer valid, or a positive integer, indicating
+the following:
+
+ Value Meaning
+ --------------------------------------------------
+ 1 Database is idle (not in a transaction)
+ 2 Database is active, there is a command in progress (usually seen after a COPY command)
+ 3 Database is idle within a transaction
+ 4 Database is idle, within a failed transaction
+
+Additional information on why a handle is not valid can be obtained by using the
+L</pg_ping> method.
+
+=head3 B<pg_ping>
+
+ $rv = $dbh->pg_ping;
+
+This is a DBD::Pg-specific extension to the L</ping> method. This will check the
+validity of a database handle in exactly the same way as C<ping>, but instead of
+returning a 0 for an invalid connection, it will return a negative number. So in
+addition to returning the positive numbers documented for C<ping>, it may also
+return the following:
+
+ Value Meaning
+ --------------------------------------------------
+ -1 There is no connection to the database at all (e.g. after C<disconnect>)
+ -2 An unknown transaction status was returned (e.g. after forking)
+ -3 The handle exists, but no data was returned from a test query.
+
+In practice, you should only ever see -1 and -2.
+
+=head3 B<get_info>
+
+ $value = $dbh->get_info($info_type);
+
+Supports a very large set (> 250) of the information types, including the minimum
+recommended by DBI.
+
+=head3 B<table_info>
+
+ $sth = $dbh->table_info(undef, $schema, $table, $type);
+
+Returns all tables and views visible to the current user.
+The schema and table arguments will do a C<LIKE> search if a percent sign (C<%>) or an
+underscore (C<_>) is detected in the argument. The C<$type> argument accepts a value of either
+"TABLE" or "VIEW" (using both is the default action). Note that a statement handle is returned,
+and not a direct list of tables. See the examples below for ways to handle this.
+
+The following fields are returned:
+
+B<TABLE_CAT>: Always NULL, as Postgres does not have the concept of catalogs.
+
+B<TABLE_SCHEM>: The name of the schema that the table or view is in.
+
+B<TABLE_NAME>: The name of the table or view.
+
+B<TABLE_TYPE>: The type of object returned. Will be one of "TABLE", "VIEW",
+or "SYSTEM TABLE".
+
+The TABLE_SCHEM and TABLE_NAME will be quoted via C<quote_ident()>.
+
+Two additional fields specific to DBD::Pg are returned:
+
+B<pg_schema>: the unquoted name of the schema
+
+B<pg_table>: the unquoted name of the table
+
+If your database supports tablespaces (version 8.0 or greater), two additional
+DBD::Pg specific fields are returned:
+
+B<pg_tablespace_name>: the name of the tablespace the table is in
+
+B<pg_tablespace_location>: the location of the tablespace the table is in
+
+Tables that have not been assigned to a particular tablespace (or views)
+will return NULL (C<undef>) for both of the above field.
+
+Rows are returned alphabetically, with all tables first, and then all views.
+
+Examples of use:
+
+ ## Display all tables and views in the public schema:
+ $sth = $dbh->table_info('', 'public', undef, undef);
+ for my $rel (@{$sth->fetchall_arrayref({})}) {
+ print "$rel->{TABLE_TYPE} name is $rel->{TABLE_NAME}\n";
+ }
+
+
+ # Display the schema of all tables named 'foo':
+ $sth = $dbh->table_info('', undef, 'foo', 'TABLE');
+ for my $rel (@{$sth->fetchall_arrayref({})}) {
+ print "Table name is $rel->{TABLE_SCHEM}.$rel->{TABLE_NAME}\n";
+ }
+
+=head3 B<column_info>
+
+ $sth = $dbh->column_info( undef, $schema, $table, $column );
+
+Supported by this driver as proposed by DBI with the follow exceptions.
+These fields are currently always returned with NULL (C<undef>) values:
+
+ TABLE_CAT
+ BUFFER_LENGTH
+ DECIMAL_DIGITS
+ NUM_PREC_RADIX
+ SQL_DATA_TYPE
+ SQL_DATETIME_SUB
+ CHAR_OCTET_LENGTH
+
+Also, six additional non-standard fields are returned:
+
+B<pg_type>: data type with additional info i.e. "character varying(20)"
+
+B<pg_constraint>: holds column constraint definition
+
+B<pg_schema>: the unquoted name of the schema
+
+B<pg_table>: the unquoted name of the table
+
+B<pg_column>: the unquoted name of the column
+
+B<pg_enum_values>: an array reference of allowed values for an enum column
+
+Note that the TABLE_SCHEM, TABLE_NAME, and COLUMN_NAME fields all return
+output wrapped in quote_ident(). If you need the unquoted version, use
+the pg_ fields above.
+
+=head3 B<primary_key_info>
+
+ $sth = $dbh->primary_key_info( undef, $schema, $table, \%attr );
+
+Supported by this driver as proposed by DBI. There are no search patterns allowed, but leaving the
+$schema argument blank will cause the first table found in the schema
+search path to be used. An additional field, "DATA_TYPE", is returned and
+shows the data type for each of the arguments in the "COLUMN_NAME" field.
+
+This method will also return tablespace information for servers that support
+tablespaces. See the L</table_info> entry for more information.
+
+The five additional custom fields returned are:
+
+B<pg_tablespace_name>: name of the tablespace, if any
+
+B<pg_tablespace_location>: location of the tablespace
+
+B<pg_schema>: the unquoted name of the schema
+
+B<pg_table>: the unquoted name of the table
+
+B<pg_column>: the unquoted name of the column
+
+In addition to the standard format of returning one row for each column
+found for the primary key, you can pass the C<pg_onerow> attribute to force
+a single row to be used. If the primary key has multiple columns, the
+"KEY_SEQ", "COLUMN_NAME", and "DATA_TYPE" fields will return a comma-delimited
+string. If the C<pg_onerow> attribute is set to "2", the fields will be
+returned as an arrayref, which can be useful when multiple columns are
+involved:
+
+ $sth = $dbh->primary_key_info('', '', 'dbd_pg_test', {pg_onerow => 2});
+ if (defined $sth) {
+ my $pk = $sth->fetchall_arrayref()->[0];
+ print "Table $pk->[2] has a primary key on these columns:\n";
+ for (my $x=0; defined $pk->[3][$x]; $x++) {
+ print "Column: $pk->[3][$x] (data type: $pk->[6][$x])\n";
+ }
+ }
+
+=head3 B<primary_key>
+
+ @key_column_names = $dbh->primary_key(undef, $schema, $table);
+
+Simple interface to the L</primary_key_info> method. Returns a list of the column names that
+comprise the primary key of the specified table. The list is in primary key column sequence
+order. If there is no primary key then an empty list is returned.
+
+=head3 B<foreign_key_info>
+
+ $sth = $dbh->foreign_key_info( $pk_catalog, $pk_schema, $pk_table,
+ $fk_catalog, $fk_schema, $fk_table );
+
+Supported by this driver as proposed by DBI, using the SQL/CLI variant.
+There are no search patterns allowed, but leaving the C<$schema> argument
+blank will cause the first table found in the schema search path to be
+used. Two additional fields, "UK_DATA_TYPE" and "FK_DATA_TYPE", are returned
+to show the data type for the unique and foreign key columns. Foreign
+keys that have no named constraint (where the referenced column only has
+an unique index) will return C<undef> for the "UK_NAME" field.
+
+=head3 B<statistics_info>
+
+ $sth = $dbh->statistics_info( undef, $schema, $table, $unique_only, $quick );
+
+Returns a statement handle that can be fetched from to give statistics information
+on a specific table and its indexes. The C<$table> argument is mandatory. The
+C<$schema> argument is optional but recommended. The C<$unique_only> argument, if true,
+causes only information about unique indexes to be returned. The C<$quick> argument is
+not used by DBD::Pg. For information on the format of the rows returned, please see the DBI
+documentation.
+
+=for html <a href="http://search.cpan.org/~timb/DBI/DBI.pm#statistics_info">DBI section on statistics_info</a>
+
+=head3 B<tables>
+
+ @names = $dbh->tables( undef, $schema, $table, $type, \%attr );
+
+Supported by this driver as proposed by DBI. This method returns all tables
+and/or views which are visible to the current user: see L</table_info>
+for more information about the arguments. The name of the schema appears
+before the table or view name. This can be turned off by adding in the
+C<pg_noprefix> attribute:
+
+ my @tables = $dbh->tables( '', '', 'dbd_pg_test', '', {pg_noprefix => 1} );
+
+=head3 B<type_info_all>
+
+ $type_info_all = $dbh->type_info_all;
+
+Supported by this driver as proposed by DBI. Information is only provided for
+SQL datatypes and for frequently used datatypes. The mapping between the
+PostgreSQL typename and the SQL92 datatype (if possible) has been done
+according to the following table:
+
+ +---------------+------------------------------------+
+ | typname | SQL92 |
+ |---------------+------------------------------------|
+ | bool | BOOL |
+ | text | / |
+ | bpchar | CHAR(n) |
+ | varchar | VARCHAR(n) |
+ | int2 | SMALLINT |
+ | int4 | INT |
+ | int8 | / |
+ | money | / |
+ | float4 | FLOAT(p) p<7=float4, p<16=float8 |
+ | float8 | REAL |
+ | abstime | / |
+ | reltime | / |
+ | tinterval | / |
+ | date | / |
+ | time | / |
+ | datetime | / |
+ | timespan | TINTERVAL |
+ | timestamp | TIMESTAMP |
+ +---------------+------------------------------------+
+
+=head3 B<type_info>
+
+ @type_info = $dbh->type_info($data_type);
+
+Returns a list of hash references holding information about one or more variants of $data_type.
+See the DBI documentation for more details.
+
+=head3 B<pg_server_trace>
+
+ $dbh->pg_server_trace($filehandle);
+
+Writes debugging information from the PostgreSQL backend to a file. This is
+not related to the DBI L</trace> method and you should not use this method unless
+you know what you are doing. If you do enable this, be aware that the file
+will grow very large, very quick. To stop logging to the file, use the
+L</pg_server_untrace> method. The first argument must be a file handle, not
+a filename. Example:
+
+ my $pid = $dbh->{pg_pid};
+ my $file = "pgbackend.$pid.debug.log";
+ open(my $fh, ">$file") or die qq{Could not open "$file": $!\n};
+ $dbh->pg_server_trace($fh);
+ ## Run code you want to trace here
+ $dbh->pg_server_untrace;
+ close($fh);
+
+=head3 B<pg_server_untrace>
+
+ $dbh->pg_server_untrace;
+
+Stop server logging to a previously opened file.
+
+=head3 B<selectrow_array>
+
+ @row_ary = $dbh->selectrow_array($sql);
+ @row_ary = $dbh->selectrow_array($sql, \%attr);
+ @row_ary = $dbh->selectrow_array($sql, \%attr, @bind_values);
+
+Returns an array of row information after preparing and executing the provided SQL string. The rows are returned
+by calling L</fetchrow_array>. The string can also be a statement handle generated by a previous prepare. Note that
+only the first row of data is returned. If called in a scalar context, only the first column of the first row is
+returned. Because this is not portable, it is not recommended that you use this method in that way.
+
+=head3 B<selectrow_arrayref>
+
+ $ary_ref = $dbh->selectrow_arrayref($statement);
+ $ary_ref = $dbh->selectrow_arrayref($statement, \%attr);
+ $ary_ref = $dbh->selectrow_arrayref($statement, \%attr, @bind_values);
+
+Exactly the same as L</selectrow_array>, except that it returns a reference to an array, by internal use of
+the L</fetchrow_arrayref> method.
+
+=head3 B<selectrow_hashref>
+
+ $hash_ref = $dbh->selectrow_hashref($sql);
+ $hash_ref = $dbh->selectrow_hashref($sql, \%attr);
+ $hash_ref = $dbh->selectrow_hashref($sql, \%attr, @bind_values);
+
+Exactly the same as L</selectrow_array>, except that it returns a reference to an hash, by internal use of
+the L</fetchrow_hashref> method.
+
+=head3 B<clone>
+
+ $other_dbh = $dbh->clone();
+
+Creates a copy of the database handle by connecting with the same parameters as the original
+handle, then trying to merge the attributes. See the DBI documentation for complete usage.
+
+=head2 Database Handle Attributes
+
+=head3 B<AutoCommit> (boolean)
+
+Supported by DBD::Pg as proposed by DBI. According to the classification of
+DBI, PostgreSQL is a database in which a transaction must be explicitly
+started. Without starting a transaction, every change to the database becomes
+immediately permanent. The default of AutoCommit is on, but this may change
+in the future, so it is highly recommended that you explicitly set it when
+calling L</connect>. For details see the notes about L</Transactions>
+elsewhere in this document.
+
+=head3 B<pg_bool_tf> (boolean)
+
+DBD::Pg specific attribute. If true, boolean values will be returned
+as the characters 't' and 'f' instead of '1' and '0'.
+
+=head3 B<ReadOnly> (boolean)
+
+$dbh->{ReadOnly} = 1;
+
+Specifies if the current database connection should be in read-only mode or not.
+In this mode, changes that change the database are not allowed and will throw
+an error. Note: this method will B<not> work if L</AutoCommit> is true. The
+read-only effect is accomplished by sending a S<SET TRANSACTION READ ONLY> after
+every begin. For more details, please see:
+
+http://www.postgresql.org/docs/current/interactive/sql-set-transaction.html
+
+Please not that this method is not foolproof: there are still ways to update the
+database. Consider this a safety net to catch applications that should not be
+issuing commands such as INSERT, UPDATE, or DELETE.
+
+This method method requires DBI version 1.55 or better.
+
+=head3 B<pg_server_prepare> (integer)
+
+DBD::Pg specific attribute. Indicates if DBD::Pg should attempt to use server-side
+prepared statements. The default value, 1, indicates that prepared statements should
+be used whenever possible. See the section on the L</prepare> method for more information.
+
+=head3 B<pg_placeholder_dollaronly> (boolean)
+
+DBD::Pg specific attribute. Defaults to false. When true, question marks inside of statements
+are not treated as L<placeholders|/Placeholders>. Useful for statements that contain unquoted question
+marks, such as geometric operators.
+
+=head3 B<pg_enable_utf8> (boolean)
+
+DBD::Pg specific attribute. If true, then the C<utf8> flag will be turned on
+for returned character data (if the data is valid UTF-8). For details about
+the C<utf8> flag, see the C<Encode> module. This attribute is only relevant under
+perl 5.8 and later.
+
+=head3 B<pg_errorlevel> (integer)
+
+DBD::Pg specific attribute. Sets the amount of information returned by the server's
+error messages. Valid entries are 0, 1, and 2. Any other number will be forced to the
+default value of 1.
+
+A value of 0 ("TERSE") will show severity, primary text, and position only
+and will usually fit on a single line. A value of 1 ("DEFAULT") will also
+show any detail, hint, or context fields. A value of 2 ("VERBOSE") will
+show all available information.
+
+=head3 B<pg_lib_version> (integer, read-only)
+
+DBD::Pg specific attribute. Indicates which version of PostgreSQL that
+DBD::Pg was compiled against. In other words, which libraries were used.
+Returns a number with major, minor, and revision together; version 8.1.4
+would be returned as C<80104>.
+
+=head3 B<pg_server_version> (integer, read-only)
+
+DBD::Pg specific attribute. Indicates which version of PostgreSQL that
+the current database handle is connected to. Returns a number with major,
+minor, and revision together; version 8.0.1 would be C<80001>.
+
+=head3 B<Name> (string, read-only)
+
+Returns the name of the current database. This is the same as the DSN, without the
+"dbi:Pg:" part. Before version 2.0.0, this only returned the bare database name
+(e.g. 'foo'). From version 2.0.0 onwards, it returns the more correct
+output (e.g. 'dbname=foo')
+
+=head3 B<Username> (string, read-only)
+
+Returns the name of the user connected to the database.
+
+=head3 B<pg_db> (string, read-only)
+
+DBD::Pg specific attribute. Returns the name of the current database.
+
+=head3 B<pg_user> (string, read-only)
+
+DBD::Pg specific attribute. Returns the name of the user that
+connected to the server.
+
+=head3 B<pg_host> (string, read-only)
+
+DBD::Pg specific attribute. Returns the host of the current
+server connection. Locally connected hosts will return an empty
+string.
+
+=head3 B<pg_port> (integer, read-only)
+
+DBD::Pg specific attribute. Returns the port of the connection to
+the server.
+
+=head3 B<pg_socket> (integer, read-only)
+
+DBD::Pg specific attribute. Returns the file description number of
+the connection socket to the server.
+
+=head3 B<pg_pass> (string, read-only)
+
+DBD::Pg specific attribute. Returns the password used to connect
+to the server.
+
+=head3 B<pg_options> (string, read-only)
+
+DBD::Pg specific attribute. Returns the command-line options passed
+to the server. May be an empty string.
+
+=head3 B<pg_default_port> (integer, read-only)
+
+DBD::Pg specific attribute. Returns the default port used if none is
+specifically given.
+
+=head3 B<pg_pid> (integer, read-only)
+
+DBD::Pg specific attribute. Returns the process id (PID) of the
+backend server process handling the connection.
+
+=head3 B<pg_prepare_now> (boolean)
+
+DBD::Pg specific attribute. Default is off. If true, then the L</prepare> method will
+immediately prepare commands, rather than waiting until the first execute.
+
+=head3 B<pg_expand_array> (boolean)
+
+DBD::Pg specific attribute. Defaults to true. If false, arrays returned from the server will
+not be changed into a Perl arrayref, but remain as a string.
+
+=head3 B<pg_async_status> (integer, read-only)
+
+DBD::Pg specific attribute. Returns the current status of an L<asynchronous|/Asynchronous Queries>
+command. 0 indicates no asynchronous command is in progress, 1 indicates that
+an asynchronous command has started and -1 indicated that an asynchronous command
+has been cancelled.
+
+=head3 B<pg_standard_conforming_strings> (boolean, read-only)
+
+DBD::Pg specific attribute. Returns true if the server is currently using
+standard conforming strings. Only available if the target
+server is version 8.2 or better.
+
+=head3 B<pg_INV_READ> (integer, read-only)
+
+Constant to be used for the mode in L</lo_creat> and L</lo_open>.
+
+=head3 B<pg_INV_WRITE> (integer, read-only)
+
+Constant to be used for the mode in L</lo_creat> and L</lo_open>.
+
+=head3 B<Driver> (handle, read-only)
+
+Holds the handle of the parent driver. The only recommended use for this is to find the name
+of the driver using:
+
+ $dbh->{Driver}->{Name}
+
+=head3 B<pg_protocol> (integer, read-only)
+
+DBD::Pg specific attribute. Returns the version of the PostgreSQL server.
+If DBD::Pg is unable to figure out the version, it will return a "0". Otherwise,
+a "3" is returned.
+
+=head3 B<RowCacheSize>
+
+Not used by DBD::Pg
+
+=head1 DBI STATEMENT HANDLE OBJECTS
+
+=head2 Statement Handle Methods
+
+=head3 B<bind_param>
+
+ $rv = $sth->bind_param($param_num, $bind_value);
+ $rv = $sth->bind_param($param_num, $bind_value, $bind_type);
+ $rv = $sth->bind_param($param_num, $bind_value, \%attr);
+
+Allows the user to bind a value and/or a data type to a placeholder. This is
+especially important when using server-side prepares. See the
+L</prepare> method for more information.
+
+The value of C<$param_num> is a number if using the '?' or '$1' style
+placeholders. If using ":foo" style placeholders, the complete name
+(e.g. ":foo") must be given. For numeric values, you can either use a
+number or use a literal '$1'. See the examples below.
+
+The C<$bind_value> argument is fairly self-explanatory. A value of C<undef> will
+bind a C<NULL> to the placeholder. Using C<undef> is useful when you want
+to change just the type and will be overwriting the value later.
+(Any value is actually usable, but C<undef> is easy and efficient).
+
+The C<\%attr> hash is used to indicate the data type of the placeholder.
+The default value is "varchar". If you need something else, you must
+use one of the values provided by DBI or by DBD::Pg. To use a SQL value,
+modify your "use DBI" statement at the top of your script as follows:
+
+ use DBI qw(:sql_types);
+
+This will import some constants into your script. You can plug those
+directly into the L</bind_param> call. Some common ones that you will
+encounter are:
+
+ SQL_INTEGER
+
+To use PostgreSQL data types, import the list of values like this:
+
+ use DBD::Pg qw(:pg_types);
+
+You can then set the data types by setting the value of the C<pg_type>
+key in the hash passed to L</bind_param>.
+The current list of Postgres data types exported is:
+
+ PG_ABSTIME PG_ABSTIMEARRAY PG_ACLITEM PG_ACLITEMARRAY PG_ANY PG_ANYARRAY
+ PG_ANYELEMENT PG_ANYENUM PG_ANYNONARRAY PG_BIT PG_BITARRAY PG_BOOL
+ PG_BOOLARRAY PG_BOX PG_BOXARRAY PG_BPCHAR PG_BPCHARARRAY PG_BYTEA
+ PG_BYTEAARRAY PG_CHAR PG_CHARARRAY PG_CID PG_CIDARRAY PG_CIDR
+ PG_CIDRARRAY PG_CIRCLE PG_CIRCLEARRAY PG_CSTRING PG_CSTRINGARRAY PG_DATE
+ PG_DATEARRAY PG_FLOAT4 PG_FLOAT4ARRAY PG_FLOAT8 PG_FLOAT8ARRAY PG_GTSVECTOR
+ PG_GTSVECTORARRAY PG_INET PG_INETARRAY PG_INT2 PG_INT2ARRAY PG_INT2VECTOR
+ PG_INT2VECTORARRAY PG_INT4 PG_INT4ARRAY PG_INT8 PG_INT8ARRAY PG_INTERNAL
+ PG_INTERVAL PG_INTERVALARRAY PG_LANGUAGE_HANDLER PG_LINE PG_LINEARRAY PG_LSEG
+ PG_LSEGARRAY PG_MACADDR PG_MACADDRARRAY PG_MONEY PG_MONEYARRAY PG_NAME
+ PG_NAMEARRAY PG_NUMERIC PG_NUMERICARRAY PG_OID PG_OIDARRAY PG_OIDVECTOR
+ PG_OIDVECTORARRAY PG_OPAQUE PG_PATH PG_PATHARRAY PG_PG_ATTRIBUTE PG_PG_CLASS
+ PG_PG_PROC PG_PG_TYPE PG_POINT PG_POINTARRAY PG_POLYGON PG_POLYGONARRAY
+ PG_RECORD PG_RECORDARRAY PG_REFCURSOR PG_REFCURSORARRAY PG_REGCLASS PG_REGCLASSARRAY
+ PG_REGCONFIG PG_REGCONFIGARRAY PG_REGDICTIONARY PG_REGDICTIONARYARRAY PG_REGOPER PG_REGOPERARRAY
+ PG_REGOPERATOR PG_REGOPERATORARRAY PG_REGPROC PG_REGPROCARRAY PG_REGPROCEDURE PG_REGPROCEDUREARRAY
+ PG_REGTYPE PG_REGTYPEARRAY PG_RELTIME PG_RELTIMEARRAY PG_SMGR PG_TEXT
+ PG_TEXTARRAY PG_TID PG_TIDARRAY PG_TIME PG_TIMEARRAY PG_TIMESTAMP
+ PG_TIMESTAMPARRAY PG_TIMESTAMPTZ PG_TIMESTAMPTZARRAY PG_TIMETZ PG_TIMETZARRAY PG_TINTERVAL
+ PG_TINTERVALARRAY PG_TRIGGER PG_TSQUERY PG_TSQUERYARRAY PG_TSVECTOR PG_TSVECTORARRAY
+ PG_TXID_SNAPSHOT PG_TXID_SNAPSHOTARRAY PG_UNKNOWN PG_UUID PG_UUIDARRAY PG_VARBIT
+ PG_VARBITARRAY PG_VARCHAR PG_VARCHARARRAY PG_VOID PG_XID PG_XIDARRAY
+ PG_XML PG_XMLARRAY
+
+Data types are "sticky," in that once a data type is set to a certain placeholder,
+it will remain for that placeholder, unless it is explicitly set to something
+else afterwards. If the statement has already been prepared, and you switch the
+data type to something else, DBD::Pg will re-prepare the statement for you before
+doing the next execute.
+
+Examples:
+
+ use DBI qw(:sql_types);
+ use DBD::Pg qw(:pg_types);
+
+ $SQL = "SELECT id FROM ptable WHERE size > ? AND title = ?";
+ $sth = $dbh->prepare($SQL);
+
+ ## Both arguments below are bound to placeholders as "varchar"
+ $sth->execute(123, "Merk");
+
+ ## Reset the datatype for the first placeholder to an integer
+ $sth->bind_param(1, undef, SQL_INTEGER);
+
+ ## The "undef" bound above is not used, since we supply params to execute
+ $sth->execute(123, "Merk");
+
+ ## Set the first placeholder's value and data type
+ $sth->bind_param(1, 234, { pg_type => PG_TIMESTAMP });
+
+ ## Set the second placeholder's value and data type.
+ ## We don't send a third argument, so the default "varchar" is used
+ $sth->bind_param('$2', "Zool");
+
+ ## We realize that the wrong data type was set above, so we change it:
+ $sth->bind_param('$1', 234, { pg_type => SQL_INTEGER });
+
+ ## We also got the wrong value, so we change that as well.
+ ## Because the data type is sticky, we don't need to change it
+ $sth->bind_param(1, 567);
+
+ ## This executes the statement with 567 (integer) and "Zool" (varchar)
+ $sth->execute();
+
+=head3 B<bind_param_inout>
+
+ $rv = $sth->bind_param_inout($param_num, \$scalar, 0);
+
+
+Experimental support for this feature is provided. The first argument to
+bind_param_inout should be a placeholder number. The second argument
+should be a reference to a scalar variable in your script. The third argument
+is not used and should simply be set to 0. Note that what this really does is
+assign a returned column to the variable, in the order in which the column
+appears. For example:
+
+ my $foo = 123;
+ $sth = $dbh->prepare("SELECT 1+?::int");
+ $sth->bind_param_inout(1, \$foo, 0);
+ $foo = 222;
+ $sth->execute(444);
+ $sth->fetch;
+
+The above will cause $foo to have a new value of "223" after the final fetch.
+Note that the variables bound in this manner are very sticky, and will trump any
+values passed in to execute. This is because the binding is done as late as possible,
+at the execute() stage, allowing the value to be changed between the time it was bound
+and the time the query is executed. Thus, the above execute is the same as:
+
+ $sth->execute();
+
+=head3 B<bind_param_array>
+
+
+ $rv = $sth->bind_param_array($param_num, $array_ref_or_value)
+ $rv = $sth->bind_param_array($param_num, $array_ref_or_value, $bind_type)
+ $rv = $sth->bind_param_array($param_num, $array_ref_or_value, \%attr)
+
+Binds an array of values to a placeholder, so that each is used in turn by a call
+to the L</execute_array> method.
+
+=head3 B<execute>
+
+ $rv = $sth->execute(@bind_values);
+
+Executes a previously prepared statement. In addition to C<UPDATE>, C<DELETE>,
+C<INSERT> statements, for which it returns always the number of affected rows,
+the C<execute> method can also be used for C<SELECT ... INTO table> statements.
+
+The "prepare/bind/execute" process has changed significantly for PostgreSQL
+servers 7.4 and later: please see the C<prepare()> and C<bind_param()> entries for
+much more information.
+
+Setting one of the bind_values to "undef" is the equivalent of setting the value
+to NULL in the database. Setting the bind_value to $DBDPG_DEFAULT is equivalent
+to sending the literal string 'DEFAULT' to the backend. Note that using this
+option will force server-side prepares off until such time as PostgreSQL
+supports using DEFAULT in prepared statements.
+
+DBD::Pg also supports passing in arrays to execute: simply pass in an arrayref,
+and DBD::Pg will flatten it into a string suitable for input on the backend.
+
+If you are using Postgres version 8.2 or greater, you can also use any of the
+fetch methods to retrieve the values of a C<RETURNING> clause after you execute
+an C<UPDATE>, C<DELETE>, or C<INSERT>. For example:
+
+ $dbh->do(q{CREATE TABLE abc (id SERIAL, country TEXT)});
+ $SQL = q{INSERT INTO abc (country) VALUES (?) RETURNING id};
+ $sth = $dbh->prepare($SQL);
+ $sth->execute('France');
+ $countryid = $sth->fetch()->[0];
+ $sth->execute('New Zealand');
+ $countryid = $sth->fetch()->[0];
+
+=head3 B<execute_array>
+
+ $tuples = $sth->execute_array() or die $sth->errstr;
+ $tuples = $sth->execute_array(\%attr) or die $sth->errstr;
+ $tuples = $sth->execute_array(\%attr, @bind_values) or die $sth->errstr;
+
+ ($tuples, $rows) = $sth->execute_array(\%attr) or die $sth->errstr;
+ ($tuples, $rows) = $sth->execute_array(\%attr, @bind_values) or die $sth->errstr;
+
+Execute a prepared statement once for each item in a passed-in hashref, or items that
+were previously bound via the L</bind_param_array> method. See the DBI documentation
+for more details.
+
+=head3 B<execute_for_fetch>
+
+ $tuples = $sth->execute_for_fetch($fetch_tuple_sub);
+ $tuples = $sth->execute_for_fetch($fetch_tuple_sub, \@tuple_status);
+
+ ($tuples, $rows) = $sth->execute_for_fetch($fetch_tuple_sub);
+ ($tuples, $rows) = $sth->execute_for_fetch($fetch_tuple_sub, \@tuple_status);
+
+Used internally by the L</execute_array> method, and rarely used directly. See the
+DBI documentation for more details.
+
+=head3 B<fetchrow_arrayref>
+
+ $ary_ref = $sth->fetchrow_arrayref;
+
+Fetches the next row of data from the statement handle, and returns a reference to an array
+holding the column values. Any columns that are NULL are returned as undef within the array.
+
+If there are no more rows or if an error occurs, the this method return undef. You should
+check C<< $sth->err >> afterwards (or use the L</RaiseError> attribute) to discover if the undef returned
+was due to an error.
+
+Note that the same array reference is returned for each fetch, so don't store the reference and
+then use it after a later fetch. Also, the elements of the array are also reused for each row,
+so take care if you want to take a reference to an element. See also L</bind_columns>.
+
+=head3 B<fetchrow_array>
+
+ @ary = $sth->fetchrow_array;
+
+Similar to the L</fetchrow_arrayref> method, but returns a list of column information rather than
+a reference to a list. Do not use this in a scalar context.
+
+=head3 B<fetchrow_hashref>
+
+ $hash_ref = $sth->fetchrow_hashref;
+ $hash_ref = $sth->fetchrow_hashref($name);
+
+Fetches the next row of data and returns a hashref containing the name of the columns as the keys
+and the data itself as the values. Any NULL value is returned as as undef value.
+
+If there are no more rows or if an error occurs, the this method return undef. You should
+check C<< $sth->err >> afterwards (or use the L</RaiseError> attribute) to discover if the undef returned
+was due to an error.
+
+The optional C<$name> argument should be either C<NAME>, C<NAME_lc> or C<NAME_uc>, and indicates
+what sort of transformation to make to the keys in the hash.
+
+=head3 B<fetchall_arrayref>
+
+ $tbl_ary_ref = $sth->fetchall_arrayref();
+ $tbl_ary_ref = $sth->fetchall_arrayref( $slice );
+ $tbl_ary_ref = $sth->fetchall_arrayref( $slice, $max_rows );
+
+Returns a reference to an array of arrays that contains all the remaining rows to be fetched from the
+statement handle. If there are no more rows, an empty arrayref will be returned. If an error occurs,
+the data read in so far will be returned. Because of this, you should always check C<< $sth->err >> after
+calling this method, unless L</RaiseError> has been enabled.
+
+If C<$slice> is an array reference, fetchall_arrayref uses the L</fetchrow_arrayref> method to fetch each
+row as an array ref. If the C<$slice> array is not empty then it is used as a slice to select individual
+columns by perl array index number (starting at 0, unlike column and parameter numbers which start at 1).
+
+With no parameters, or if $slice is undefined, fetchall_arrayref acts as if passed an empty array ref.
+
+If C<$slice> is a hash reference, fetchall_arrayref uses L</fetchrow_hashref> to fetch each row as a hash reference.
+
+See the DBI documentation for a complete discussion.
+
+=head3 B<fetchall_hashref>
+
+ $hash_ref = $sth->fetchall_hashref( $key_field );
+
+Returns a hashref containing all rows to be fetched from the statement handle. See the DBI documentation for
+a full discussion.
+
+=head3 B<finish>
+
+ $rv = $sth->finish;
+
+Indicates to DBI that you are finished with the statement handle and are not going to use it again. Only needed
+when you have not fetched all the possible rows.
+
+=head3 B<rows>
+
+ $rv = $sth->rows;
+
+Returns the number of rows returned by the last query. In contrast to many other DBD modules,
+the number of rows is available immediately after calling C<< $sth->execute >>. Note that
+the L</execute> method itself returns the number of rows itself, which means that this
+method is rarely needed.
+
+=head3 B<bind_col>
+
+ $rv = $sth->bind_col($column_number, \$var_to_bind);
+ $rv = $sth->bind_col($column_number, \$var_to_bind, \%attr );
+ $rv = $sth->bind_col($column_number, \$var_to_bind, $bind_type );
+
+Binds a Perl variable and/or some attributes to an output column of a SELECT statement.
+Column numbers count up from 1. You do not need to bind output columns in order to fetch data.
+
+See the DBI documentation for a discussion of the optional parameters C<\%attr> and C<$bind_type>
+
+=head3 B<bind_columns>
+
+ $rv = $sth->bind_columns(@list_of_refs_to_vars_to_bind);
+
+Calls the L</bind_col> method for each column in the SELECT statement, using the supplied list.
+
+=head3 B<dump_results>
+
+ $rows = $sth->dump_results($maxlen, $lsep, $fsep, $fh);
+
+Fetches all the rows from the statement handle, calls C<DBI::neat_list> for each row, and
+prints the results to C<$fh> (which defaults to F<STDOUT>). Rows are separated by C<$lsep> (which defaults
+to a newline). Columns are separated by C<$fsep> (which defaults to a comma). The C<$maxlen> controls
+how wide the output can be, and defaults to 35.
+
+This method is designed as a handy utility for prototyping and testing queries. Since it uses
+"neat_list" to format and edit the string for reading by humans, it is not recommended
+for data transfer applications.
+
+=head3 B<blob_read>
+
+ $blob = $sth->blob_read($id, $offset, $len);
+
+Supported by DBD::Pg. This method is implemented by DBI but not
+currently documented by DBI, so this method might change.
+
+This method seems to be heavily influenced by the current implementation of
+blobs in Oracle. Nevertheless we try to be as compatible as possible. Whereas
+Oracle suffers from the limitation that blobs are related to tables and every
+table can have only one blob (datatype LONG), PostgreSQL handles its blobs
+independent of any table by using so-called object identifiers. This explains
+why the C<blob_read> method is blessed into the STATEMENT package and not part of
+the DATABASE package. Here the field parameter has been used to handle this
+object identifier. The offset and len parameters may be set to zero, in which
+case the whole blob is fetched at once.
+
+See also the PostgreSQL-specific functions concerning blobs, which are
+available via the C<func> interface.
+
+For further information and examples about blobs, please read the chapter
+about Large Objects in the PostgreSQL Programmer's Guide at
+L<http://www.postgresql.org/docs/current/static/largeobjects.html>.
+
+=head2 Statement Handle Attributes
+
+=head3 B<NUM_OF_FIELDS> (integer, read-only)
+
+Returns the number of columns returned by the current statement. A number will only be returned for
+SELECT statements, for SHOW statements (which always return C<1>), and for INSERT,
+UPDATE, and DELETE statements which contain a RETURNING clause.
+This method returns undef if called before C<execute()>.
+
+=head3 B<NUM_OF_PARAMS> (integer, read-only)
+
+Returns the number of placeholders in the current statement.
+
+=head3 B<NAME> (arrayref, read-only)
+
+Returns an arrayref of column names for the current statement. This
+method will only work for SELECT statements, for SHOW statements, and for
+INSERT, UPDATE, and DELETE statements which contain a RETURNING clause.
+This method returns undef if called before C<execute()>.
+
+=head3 B<NAME_lc> (arrayref, read-only)
+
+The same as the C<NAME> attribute, except that all column names are forced to lower case.
+
+=head3 B<NAME_uc> (arrayref, read-only)
+
+The same as the C<NAME> attribute, except that all column names are forced to upper case.
+
+=head3 B<NAME_hash> (hashref, read-only)
+
+Similar to the C<NAME> attribute, but returns a hashref of column names instead of an arrayref. The names of the columns
+are the keys of the hash, and the values represent the order in which the columns are returned, starting at 0.
+This method returns undef if called before C<execute()>.
+
+=head3 B<NAME_lc_hash> (hashref, read-only)
+
+The same as the C<NAME_hash> attribute, except that all column names are forced to lower case.
+
+=head3 B<NAME_uc_hash> (hashref, read-only)
+
+The same as the C<NAME_hash> attribute, except that all column names are forced to lower case.
+
+=head3 B<TYPE> (arrayref, read-only)
+
+Returns an arrayref indicating the data type for each column in the statement.
+This method returns undef if called before C<execute()>.
+
+=head3 B<PRECISION> (arrayref, read-only)
+
+Returns an arrayref of integer values for each column returned by the statement.
+The number indicates the precision for C<NUMERIC> columns, the size in number of
+characters for C<CHAR> and C<VARCHAR> columns, and for all other types of columns
+it returns the number of I<bytes>.
+This method returns undef if called before C<execute()>.
+
+=head3 B<SCALE> (arrayref, read-only)
+
+Returns an arrayref of integer values for each column returned by the statement. The number
+indicates the scale of the that column. The only type that will return a value is C<NUMERIC>.
+This method returns undef if called before C<execute()>.
+
+=head3 B<NULLABLE> (arrayref, read-only)
+
+Returns an arrayref of integer values for each column returned by the statement. The number
+indicates if the column is nullable or not. 0 = not nullable, 1 = nullable, 2 = unknown.
+This method returns undef if called before C<execute()>.
+
+=head3 B<Database> (dbh, read-only)
+
+Returns the database handle this statement handle was created from.
+
+=head3 B<ParamValues> (hash ref, read-only)
+
+Returns a reference to a hash containing the values currently bound to placeholders. If the "named parameters"
+type of placeholders are being used (such as ":foo"), then the keys of the hash will be the names of the
+placeholders (without the colon). If the "dollar sign numbers" type of placeholders are being used, the keys of the hash will
+be the numbers, without the dollar signs. If the "question mark" type is used, integer numbers will be returned,
+starting at one and increasing for every placeholder.
+
+If this method is called before L</execute>, the literal values passed in are returned. If called after
+L</execute>, then the quoted versions of the values are returned.
+
+=head3 B<ParamTypes> (hash ref, read-only)
+
+Returns a reference to a hash containing the type names currently bound to placeholders. The keys
+are the same as returned by the ParamValues method. The values are hashrefs containing a single key value
+pair, in which the key is either 'TYPE' if the type has a generic SQL equivalent, and 'pg_type' if the type can
+only be expressed by a Postgres type. The value is the internal number corresponding to the type originally
+passed in. (Placeholders that have not yet been bound will return undef as the value). This allows the output of
+ParamTypes to be passed back to the L</bind_param> method.
+
+=head3 B<Statement> (string, read-only)
+
+Returns the statement string passed to the most recent "prepare" method called in this database handle, even if that method
+failed. This is especially useful where "RaiseError" is enabled and the exception handler checks $@ and sees that a C<prepare>
+method call failed.
+
+=head3 B<pg_current_row> (integer, read-only)
+
+DBD::Pg specific attribute. Returns the number of the tuple (row) that was
+most recently fetched. Returns zero before and after fetching is performed.
+
+=head3 B<pg_numbound> (integer, read-only)
+
+DBD::Pg specific attribute. Returns the number of placeholders
+that are currently bound (via bind_param).
+
+=head3 B<pg_bound> (hashref, read-only)
+
+DBD::Pg specific attribute. Returns a hash of all named placeholders. The
+key is the name of the placeholder, and the value is a 0 or a 1, indicating if
+the placeholder has been bound yet (e.g. via bind_param)
+
+=head3 B<pg_size> (arrayref, read-only)
+
+DBD::Pg specific attribute. It returns a reference to an array of integer
+values for each column. The integer shows the size of the column in
+bytes. Variable length columns are indicated by -1.
+
+=head3 B<pg_type> (arrayref, read-only)
+
+DBD::Pg specific attribute. It returns a reference to an array of strings
+for each column. The string shows the name of the data_type.
+
+=head3 B<pg_segments> (arrayref, read-only)
+
+DBD::Pg specific attribute. Returns an arrayref of the query split on the
+placeholders.
+
+=head3 B<pg_oid_status> (integer, read-only)
+
+DBD::Pg specific attribute. It returns the OID of the last INSERT command.
+
+=head3 B<pg_cmd_status> (integer, read-only)
+
+DBD::Pg specific attribute. It returns the type of the last
+command. Possible types are: "INSERT", "DELETE", "UPDATE", "SELECT".
+
+=head3 B<pg_direct> (boolean)
+
+DBD::Pg specific attribute. Default is false. If true, the query is passed
+directly to the backend without parsing for placeholders.
+
+=head3 B<pg_prepare_now> (boolean)
+
+DBD::Pg specific attribute. Default is off. If true, the query will be immediately
+prepared, rather than waiting for the L</execute> call.
+
+=head3 B<pg_prepare_name> (string)
+
+DBD::Pg specific attribute. Specifies the name of the prepared statement to use for this
+statement handle. Not normally needed, see the section on the L</prepare> method for
+more information.
+
+=head3 B<pg_server_prepare> (integer)
+
+DBD::Pg specific attribute. Indicates if DBD::Pg should attempt to use server-side
+prepared statements for this statement handle. The default value, 1, indicates that prepared
+statements should be used whenever possible. See the section on the L</prepare> method for
+more information.
+
+=head3 B<pg_placeholder_dollaronly> (boolean)
+
+DBD::Pg specific attribute. Defaults to off. When true, question marks inside of the query
+being prepared are not treated as placeholders. Useful for statements that contain unquoted question
+marks, such as geometric operators.
+
+=head3 B<pg_async> (integer)
+
+DBD::Pg specific attribute. Indicates the current behavior for asynchronous queries. See the section
+on L</Asynchronous Constants> for more information.
+
+=head3 B<RowsInCache>
+
+Not used by DBD::Pg
+
+=head3 B<RowCache>
+
+Not used by DBD::Pg
+
+=head3 B<CursorName>
+
+Not used by DBD::Pg. See the note about L</Cursors> elsewhere in this document.
+
+=head1 FURTHER INFORMATION
+
+=head2 Transactions
+
+Transaction behavior is controlled via the L</AutoCommit> attribute. For a
+complete definition of C<AutoCommit> please refer to the DBI documentation.
+
+According to the DBI specification the default for C<AutoCommit> is a true
+value. In this mode, any change to the database becomes valid immediately. Any
+C<BEGIN>, C<COMMIT> or C<ROLLBACK> statements will be rejected. DBD::Pg
+implements C<AutoCommit> by issuing a C<BEGIN> statement immediately before
+executing a statement, and a C<COMMIT> afterwards. Note that preparing a
+statement is not always enough to trigger the first C<BEGIN>, as the actual
+C<PREPARE> is usually postponed until the first call to L</execute>.
+
+=head2 Savepoints
+
+PostgreSQL version 8.0 introduced the concept of savepoints, which allows
+transactions to be rolled back to a certain point without affecting the
+rest of the transaction. DBD::Pg encourages using the following methods to
+control savepoints:
+
+=head3 C<pg_savepoint>
+
+Creates a savepoint. This will fail unless you are inside of a transaction. The
+only argument is the name of the savepoint. Note that PostgreSQL DOES allow
+multiple savepoints with the same name to exist.
+
+ $dbh->pg_savepoint("mysavepoint");
+
+=head3 C<pg_rollback_to>
+
+Rolls the database back to a named savepoint, discarding any work performed after
+that point. If more than one savepoint with that name exists, rolls back to the
+most recently created one.
+
+ $dbh->pg_rollback_to("mysavepoint");
+
+=head3 C<pg_release>
+
+Releases (or removes) a named savepoint. If more than one savepoint with that name
+exists, it will only destroy the most recently created one. Note that all savepoints
+created after the one being released are also destroyed.
+
+ $dbh->pg_release("mysavepoint");
+
+=head2 Asynchronous Queries
+
+It is possible to send a query to the backend and have your script do other work while the query is
+running on the backend. Both queries sent by the L</do> method, and by the L</execute> method can be
+sent asynchronously. (NOTE: This will only work if DBD::Pg has been compiled against Postgres libraries
+of version 8.0 or greater) The basic usage is as follows:
+
+ use DBD::Pg ':async';
+
+ print "Async do() example:\n";
+ $dbh->do("SELECT long_running_query()", {pg_async => PG_ASYNC});
+ do_something_else();
+ {
+ if ($dbh->pg_ready()) {
+ $res = $pg_result();
+ print "Result of do(): $res\n";
+ }
+ print "Query is still running...\n";
+ if (cancel_request_received) {
+ $dbh->pg_cancel();
+ }
+ sleep 1;
+ redo;
+ }
+
+ print "Async prepare/execute example:\n";
+ $sth = $dbh->prepare("SELECT long_running_query(1)", {pg_async => PG_ASYNC});
+ $sth->execute();
+
+ ## Changed our mind, cancel and run again:
+ $sth = $dbh->prepare("SELECT 678", {pg_async => PG_ASYNC + PG_OLDQUERY_CANCEL});
+ $sth->execute();
+
+ do_something_else();
+
+ if (!$sth->pg_ready) {
+ do_another_thing();
+ }
+
+ ## We wait until it is done, and get the result:
+ $res = $dbh->pg_result();
+
+=head3 Asynchronous Constants
+
+There are currently three asynchronous constants exported by DBD::Pg. You can import all of them by putting
+either of these at the top of your script:
+
+ use DBD::Pg;
+
+ use DBD::Pg ':async';
+
+You may also use the numbers instead of the constants, but using the constants is recommended as it
+makes your script more readable.
+
+=over 4
+
+=item PG_ASYNC
+
+This is a constant for the number 1. It is passed to either the L</do> or the L</prepare> method as a value
+to the pg_async key and indicates that the query should be sent asynchronously.
+
+=item PG_OLDQUERY_CANCEL
+
+This is a constant for the number 2. When passed to either the L</do> or the L</prepare> method, it causes any
+currently running asynchronous query to be cancelled and rolled back. It has no effect if no asynchronous
+query is currently running.
+
+=item PG_OLDQUERY_WAIT
+
+This is a constant for the number 4. When passed to either the L</do> or the L</prepare> method, it waits for any
+currently running asynchronous query to complete. It has no effect if there is no asynchronous query currently running.
+
+=back
+
+=head3 Asynchronous Methods
+
+=over 4
+
+=item B<pg_cancel>
+
+This database-level method attempts to cancel any currently running asynchronous query. It returns true if
+the cancel succeeded, and false otherwise. Note that a query that has finished before this method is executed
+will also return false. B<WARNING>: a successful cancellation will leave the database in an unusable state,
+so DBD::Pg will automatically clear out the error message and issue a ROLLBACK.
+
+ $result = $dbh->pg_cancel();
+
+=item B<pg_ready>
+
+This method can be called as a database handle method or (for convenience) as a statement handle method. Both simply
+see if a previously issued asynchronous query has completed yet. It returns true if the statement has finished, in which
+case you should then call the L</pg_result> method. Calls to C<pg_ready()> should only be used when you have other
+things to do while the query is running. If you simply want to wait until the query is done, do not call pg_ready()
+over and over, but simply call the pg_result() method.
+
+ my $time = 0;
+ while (!$dbh->pg_ready) {
+ print "Query is still running. Seconds: $time\n";
+ $time++;
+ sleep 1;
+ }
+ $result = $dbh->pg_result;
+
+=item B<pg_result>
+
+This database handle method returns the results of a previously issued asynchronous query. If the query is still
+running, this method will wait until it has finished. The result returned is the number of rows: the same thing
+that would have been returned by the asynchronous L</do> or L</execute> if it had been called without an asynchronous flag.
+
+ $result = $dbh->pg_result;
+
+=back
+
+=head3 Asynchronous Examples
+
+Here are some working examples of asynchronous queries. Note that we'll use the B<pg_sleep> function to emulate a
+long-running query.
+
+ use strict;
+ use warnings;
+ use Time::HiRes 'sleep';
+ use DBD::Pg ':async';
+
+ my $dbh = DBI->connect('dbi:Pg:dbname=postgres', 'postgres', '', {AutoCommit=>0,RaiseError=>1});
+
+ ## Kick off a long running query on the first database:
+ my $sth = $dbh->prepare("SELECT pg_sleep(?)", {pg_async => PG_ASYNC});
+ $sth->execute(5);
+
+ ## While that is running, do some other things
+ print "Your query is processing. Thanks for waiting\n";
+ check_on_the_kids(); ## Expensive sub, takes at least three seconds.
+
+ while (!$dbh->pg_ready) {
+ check_on_the_kids();
+ ## If the above function returns quickly for some reason, we add a small sleep
+ sleep 0.1;
+ }
+
+ print "The query has finished. Gathering results\n";
+ my $result = $sth->pg_result;
+ print "Result: $result\n";
+ my $info = $sth->fetchall_arrayref();
+
+Without asynchronous queries, the above script would take about 8 seconds to run: five seconds waiting
+for the execute to finish, then three for the check_on_the_kids() function to return. With asynchronous
+queries, the script takes about 6 seconds to run, and gets in two iterations of check_on_the_kids in
+the process.
+
+Here's an example showing the ability to cancel a long-running query. Imagine two slave databases in
+different geographic locations over a slow network. You need information as quickly as possible, so
+you query both at once. When you get an answer, you tell the other one to stop working on your query,
+as you don't need it anymore.
+
+ use strict;
+ use warnings;
+ use Time::HiRes 'sleep';
+ use DBD::Pg ':async';
+
+ my $dbhslave1 = DBI->connect('dbi:Pg:dbname=postgres;host=slave1', 'postgres', '', {AutoCommit=>0,RaiseError=>1});
+ my $dbhslave2 = DBI->connect('dbi:Pg:dbname=postgres;host=slave2', 'postgres', '', {AutoCommit=>0,RaiseError=>1});
+
+ $SQL = "SELECT count(*) FROM largetable WHERE flavor='blueberry'";
+
+ my $sth1 = $dbhslave1->prepare($SQL, {pg_async => PG_ASYNC});
+ my $sth2 = $dbhslave2->prepare($SQL, {pg_async => PG_ASYNC});
+
+ $sth1->execute();
+ $sth2->execute();
+
+ my $winner;
+ while (!defined $winner) {
+ if ($sth1->pg_ready) {
+ $winner = 1;
+ }
+ elsif ($sth2->pg_ready) {
+ $winner = 2;
+ }
+ Time::HiRes::sleep 0.05;
+ }
+
+ my $count;
+ if ($winner == 1) {
+ $sth2->pg_cancel();
+ $sth1->pg_result();
+ $count = $sth1->fetchall_arrayref()->[0][0];
+ }
+ else {
+ $sth1->pg_cancel();
+ $sth2->pg_result();
+ $count = $sth2->fetchall_arrayref()->[0][0];
+ }
+
+=head2 Array support
+
+DBD::Pg allows arrays (as arrayrefs) to be passed in to both
+the L</quote> and the L</execute> methods. In both cases, the array is
+flattened into a string representing a Postgres array.
+
+When fetching rows from a table that contains a column with an
+array type, the result will be passed back to your script as an arrayref.
+
+To turn off the automatic parsing of returned arrays into arrayrefs,
+you can set the attribute L<pg_expand_array|/pg_expand_array_(boolean)>, which is true by default.
+
+ $dbh->{pg_expand_array} = 0;
+
+
+=head2 COPY support
+
+DBD::Pg allows for quick (bulk) reading and storing of data by using
+the B<COPY> command. The basic process is to use C<< $dbh->do >> to issue a
+COPY command, and then to either add rows using L</pg_putcopydata>, or to
+read them by using L</pg_getcopydata>.
+
+The first step is to put the server into "COPY" mode. This is done by
+sending a complete COPY command to the server, by using the L</do> method.
+For example:
+
+ $dbh->do("COPY foobar FROM STDIN");
+
+This would tell the server to enter a COPY IN mode (yes, that's confusing, but
+the I<mode> is COPY IN because of the I<command> COPY FROM). It is now ready to
+receive information via the L</pg_putcopydata> method. The complete syntax of the
+COPY command is more complex and not documented here: the canonical
+PostgreSQL documentation for COPY can be found at:
+
+http://www.postgresql.org/docs/current/static/sql-copy.html
+
+Once a COPY command has been issued, no other SQL commands are allowed
+until L</pg_putcopyend> has been issued (for COPY FROM), or the final
+L</pg_getcopydata> has been called (for COPY TO).
+
+Note: All other COPY methods (pg_putline, pg_getline, etc.) are now
+heavily deprecated in favor of the pg_getcopydata, pg_putcopydata, and
+pg_putcopyend methods.
+
+=head3 B<pg_getcopydata>
+
+Used to retrieve data from a table after the server has been put into a
+COPY OUT mode by calling "COPY tablename TO STDOUT". Data is always returned
+one data row at a time. The first argument to pg_getcopydata
+is the variable into which the data will be stored (this variable should not
+be undefined, or it may throw a warning, although it may be a reference). The
+pg_gecopydata method returns a number greater than 1 indicating the new size of
+the variable, or a -1 when the COPY has finished. Once a -1 has been returned, no
+other action is necessary, as COPY mode will have already terminated. Example:
+
+ $dbh->do("COPY mytable TO STDOUT");
+ my @data;
+ my $x=0;
+ 1 while $dbh->pg_getcopydata($data[$x++]) >= 0;
+
+There is also a variation of this method called B<pg_getcopydata_async>, which,
+as the name suggests, returns immediately. The only difference from the original
+method is that this version may return a 0, indicating that the row is not
+ready to be delivered yet. When this happens, the variable has not been changed,
+and you will need to call the method again until you get a non-zero result.
+(Data is still always returned one data row at a time.)
+
+=head3 B<pg_putcopydata>
+
+Used to put data into a table after the server has been put into COPY IN mode
+by calling "COPY tablename FROM STDIN". The only argument is the data you want
+inserted. Issue a pg_putcopyend() when you have added all your rows.
+
+The default delimiter is a tab character, but this can be changed in
+the COPY statement. Returns a 1 on successful input. Examples:
+
+ ## Simple example:
+ $dbh->do("COPY mytable FROM STDIN");
+ $dbh->pg_putcopydata("123\tPepperoni\t3\n");
+ $dbh->pg_putcopydata("314\tMushroom\t8\n");
+ $dbh->pg_putcopydata("6\tAnchovies\t100\n");
+ $dbh->pg_putcopyend();
+
+ ## This example uses explicit columns and a custom delimiter
+ $dbh->do("COPY mytable(flavor, slices) FROM STDIN WITH DELIMITER '~'");
+ $dbh->pg_putcopydata("Pepperoni~123\n");
+ $dbh->pg_putcopydata("Mushroom~314\n");
+ $dbh->pg_putcopydata("Anchovies~6\n");
+ $dbh->pg_putcopyend();
+
+=head3 B<pg_putcopyend>
+
+When you are finished with pg_putcopydata, call pg_putcopyend to let the server know
+that you are done, and it will return to a normal, non-COPY state. Returns a 1 on
+success. This method will fail if called when not in COPY IN mode.
+
+=head2 Large Objects
+
+DBD::Pg supports all largeobject functions provided by libpq via the
+C<func> method. Please note that access to a large object, even read-only
+large objects, must be put into a transaction.
+
+=head2 Cursors
+
+Although PostgreSQL supports cursors, they have not been used in the current
+implementation. When DBD::Pg was created, cursors in PostgreSQL could only be
+used inside a transaction block. Because only one transaction block at a time
+is allowed, this would have implied the restriction not to use any nested
+C<SELECT> statements. Therefore the L</execute> method fetches all data at
+once into data structures located in the front-end application. This fact
+must to be considered when selecting large amounts of data!
+
+You can use cursors in your application, but you'll need to do a little
+work. First you must declare your cursor. Now you can issue queries against
+the cursor, then select against your queries. This typically results in a
+double loop, like this:
+
+ # WITH HOLD is not needed if AutoCommit is off
+ $dbh->do("DECLARE csr CURSOR WITH HOLD FOR $sql");
+ while (1) {
+ my $sth = $dbh->prepare("fetch 1000 from csr");
+ $sth->execute;
+ last if 0 == $sth->rows;
+
+ while (my $row = $sth->fetchrow_hashref) {
+ # Do something with the data.
+ }
+ }
+ $dbh->do("CLOSE csr");
+
+=head2 Datatype bool
+
+The current implementation of PostgreSQL returns 't' for true and 'f' for
+false. From the Perl point of view, this is a rather unfortunate
+choice. DBD::Pg therefore translates the result for the C<BOOL> data type in a
+Perlish manner: 'f' becomes the number C<0> and 't' becomes the number C<1>. This way
+the application does not have to check the database-specific returned values for
+the data-type C<BOOL> because Perl treats C<0> as false and C<1> as true. You may
+set the L<pg_bool_tf|/pg_bool_tf_(boolean)> attribute to a true value to change the values back to 't' and
+'f' if you wish.
+
+Boolean values can be passed to PostgreSQL as TRUE, 't', 'true', 'y', 'yes' or
+'1' for true and FALSE, 'f', 'false', 'n', 'no' or '0' for false.
+
+=head2 Schema support
+
+The PostgreSQL schema concept may differ from those of other databases. In a nutshell,
+a schema is a named collection of objects within a single database. Please refer to the
+PostgreSQL documentation for more details:
+
+L<http://www.postgresql.org/docs/current/static/ddl-schemas.html>
+
+DBD::Pg does not provide explicit support for PostgreSQL schemas.
+However, schema functionality may be used without any restrictions by
+explicitly addressing schema objects, e.g.
+
+ my $res = $dbh->selectall_arrayref("SELECT * FROM my_schema.my_table");
+
+or by manipulating the schema search path with C<SET search_path>, e.g.
+
+ $dbh->do("SET search_path TO my_schema, public");
+
+=head1 SEE ALSO
+
+=for text The B<DBI> module.
+
+=for html <a href="http://search.cpan.org/~timb/DBI/DBI.pm">The DBI module</a>
+
+=head1 BUGS
+
+To report a bug, or view the current list of bugs, please visit
+http://rt.cpan.org/Public/Dist/Display.html?Name=DBD-Pg
+
+=head1 AUTHORS
+
+DBI by Tim Bunce L<http://www.tim.bunce.name>
+
+The original DBD-Pg was by Edmund Mergl (E.Mergl@bawue.de) and Jeffrey W. Baker
+(jwbaker@acm.org). Major developers include David Wheeler <david@justatheory.com>, Jason
+Stewart <jason@openinformatics.com>, Bruce Momjian <pgman@candle.pha.pa.us>, and
+Greg Sabino Mullane <greg@turnstep.com>, with help from many others: see the F<Changes>
+file for a complete list.
+
+Parts of this package were originally copied from DBI and DBD-Oracle.
+
+B<Mailing List>
+
+The current maintainers may be reached through the 'dbd-pg' mailing list:
+<dbd-pg@perl.org>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 1994-2010, Greg Sabino Mullane
+
+This module (DBD::Pg) is free software; you can redistribute it and/or modify it
+under the same terms as Perl 5.10.0. For more details, see the full text of the
+licenses in the directory LICENSES.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/Proxy.pm b/Master/tlpkg/tlperl.straw/lib/DBD/Proxy.pm
new file mode 100755
index 00000000000..f0e8a364476
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/Proxy.pm
@@ -0,0 +1,997 @@
+# -*- perl -*-
+#
+#
+# DBD::Proxy - DBI Proxy driver
+#
+#
+# Copyright (c) 1997,1998 Jochen Wiedmann
+#
+# The DBD::Proxy module is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself. In particular permission
+# is granted to Tim Bunce for distributing this as a part of the DBI.
+#
+#
+# Author: Jochen Wiedmann
+# Am Eisteich 9
+# 72555 Metzingen
+# Germany
+#
+# Email: joe@ispsoft.de
+# Phone: +49 7123 14881
+#
+
+use strict;
+use Carp;
+
+require DBI;
+DBI->require_version(1.0201);
+
+use RPC::PlClient 0.2000; # XXX change to 0.2017 once it's released
+
+{ package DBD::Proxy::RPC::PlClient;
+ @DBD::Proxy::RPC::PlClient::ISA = qw(RPC::PlClient);
+ sub Call {
+ my $self = shift;
+ if ($self->{debug}) {
+ my ($rpcmeth, $obj, $method, @args) = @_;
+ local $^W; # silence undefs
+ Carp::carp("Server $rpcmeth $method(@args)");
+ }
+ return $self->SUPER::Call(@_);
+ }
+}
+
+
+package DBD::Proxy;
+
+use vars qw($VERSION $drh %ATTR);
+
+$VERSION = "0.2004";
+
+$drh = undef; # holds driver handle once initialised
+
+%ATTR = ( # common to db & st, see also %ATTR in DBD::Proxy::db & ::st
+ 'Warn' => 'local',
+ 'Active' => 'local',
+ 'Kids' => 'local',
+ 'CachedKids' => 'local',
+ 'PrintError' => 'local',
+ 'RaiseError' => 'local',
+ 'HandleError' => 'local',
+ 'TraceLevel' => 'cached',
+ 'CompatMode' => 'local',
+);
+
+sub driver ($$) {
+ if (!$drh) {
+ my($class, $attr) = @_;
+
+ $class .= "::dr";
+
+ $drh = DBI::_new_drh($class, {
+ 'Name' => 'Proxy',
+ 'Version' => $VERSION,
+ 'Attribution' => 'DBD::Proxy by Jochen Wiedmann',
+ });
+ $drh->STORE(CompatMode => 1); # disable DBI dispatcher attribute cache (for FETCH)
+ }
+ $drh;
+}
+
+sub CLONE {
+ undef $drh;
+}
+
+sub proxy_set_err {
+ my ($h,$errmsg) = @_;
+ my ($err, $state) = ($errmsg =~ s/ \[err=(.*?),state=(.*?)\]//)
+ ? ($1, $2) : (1, ' ' x 5);
+ return $h->set_err($err, $errmsg, $state);
+}
+
+package DBD::Proxy::dr; # ====== DRIVER ======
+
+$DBD::Proxy::dr::imp_data_size = 0;
+
+sub connect ($$;$$) {
+ my($drh, $dsn, $user, $auth, $attr)= @_;
+ my($dsnOrig) = $dsn;
+
+ my %attr = %$attr;
+ my ($var, $val);
+ while (length($dsn)) {
+ if ($dsn =~ /^dsn=(.*)/) {
+ $attr{'dsn'} = $1;
+ last;
+ }
+ if ($dsn =~ /^(.*?);(.*)/) {
+ $var = $1;
+ $dsn = $2;
+ } else {
+ $var = $dsn;
+ $dsn = '';
+ }
+ if ($var =~ /^(.*?)=(.*)/) {
+ $var = $1;
+ $val = $2;
+ $attr{$var} = $val;
+ }
+ }
+
+ my $err = '';
+ if (!defined($attr{'hostname'})) { $err .= " Missing hostname."; }
+ if (!defined($attr{'port'})) { $err .= " Missing port."; }
+ if (!defined($attr{'dsn'})) { $err .= " Missing remote dsn."; }
+
+ # Create a cipher object, if requested
+ my $cipherRef = undef;
+ if ($attr{'cipher'}) {
+ $cipherRef = eval { $attr{'cipher'}->new(pack('H*',
+ $attr{'key'})) };
+ if ($@) { $err .= " Cannot create cipher object: $@."; }
+ }
+ my $userCipherRef = undef;
+ if ($attr{'userkey'}) {
+ my $cipher = $attr{'usercipher'} || $attr{'cipher'};
+ $userCipherRef = eval { $cipher->new(pack('H*', $attr{'userkey'})) };
+ if ($@) { $err .= " Cannot create usercipher object: $@."; }
+ }
+
+ return DBD::Proxy::proxy_set_err($drh, $err) if $err; # Returns undef
+
+ my %client_opts = (
+ 'peeraddr' => $attr{'hostname'},
+ 'peerport' => $attr{'port'},
+ 'socket_proto' => 'tcp',
+ 'application' => $attr{dsn},
+ 'user' => $user || '',
+ 'password' => $auth || '',
+ 'version' => $DBD::Proxy::VERSION,
+ 'cipher' => $cipherRef,
+ 'debug' => $attr{debug} || 0,
+ 'timeout' => $attr{timeout} || undef,
+ 'logfile' => $attr{logfile} || undef
+ );
+ # Options starting with 'proxy_rpc_' are forwarded to the RPC layer after
+ # stripping the prefix.
+ while (my($var,$val) = each %attr) {
+ if ($var =~ s/^proxy_rpc_//) {
+ $client_opts{$var} = $val;
+ }
+ }
+ # Create an RPC::PlClient object.
+ my($client, $msg) = eval { DBD::Proxy::RPC::PlClient->new(%client_opts) };
+
+ return DBD::Proxy::proxy_set_err($drh, "Cannot log in to DBI::ProxyServer: $@")
+ if $@; # Returns undef
+ return DBD::Proxy::proxy_set_err($drh, "Constructor didn't return a handle: $msg")
+ unless ($msg =~ /^((?:\w+|\:\:)+)=(\w+)/); # Returns undef
+
+ $msg = RPC::PlClient::Object->new($1, $client, $msg);
+
+ my $max_proto_ver;
+ my ($server_ver_str) = eval { $client->Call('Version') };
+ if ( $@ ) {
+ # Server denies call, assume legacy protocol.
+ $max_proto_ver = 1;
+ } else {
+ # Parse proxy server version.
+ my ($server_ver_num) = $server_ver_str =~ /^DBI::ProxyServer\s+([\d\.]+)/;
+ $max_proto_ver = $server_ver_num >= 0.3 ? 2 : 1;
+ }
+ my $req_proto_ver;
+ if ( exists $attr{proxy_lazy_prepare} ) {
+ $req_proto_ver = ($attr{proxy_lazy_prepare} == 0) ? 2 : 1;
+ return DBD::Proxy::proxy_set_err($drh,
+ "DBI::ProxyServer does not support synchronous statement preparation.")
+ if $max_proto_ver < $req_proto_ver;
+ }
+
+ # Switch to user specific encryption mode, if desired
+ if ($userCipherRef) {
+ $client->{'cipher'} = $userCipherRef;
+ }
+
+ # create a 'blank' dbh
+ my $this = DBI::_new_dbh($drh, {
+ 'Name' => $dsnOrig,
+ 'proxy_dbh' => $msg,
+ 'proxy_client' => $client,
+ 'RowCacheSize' => $attr{'RowCacheSize'} || 20,
+ 'proxy_proto_ver' => $req_proto_ver || 1
+ });
+
+ foreach $var (keys %attr) {
+ if ($var =~ /proxy_/) {
+ $this->{$var} = $attr{$var};
+ }
+ }
+ $this->SUPER::STORE('Active' => 1);
+
+ $this;
+}
+
+
+sub DESTROY { undef }
+
+
+package DBD::Proxy::db; # ====== DATABASE ======
+
+$DBD::Proxy::db::imp_data_size = 0;
+
+# XXX probably many more methods need to be added here
+# in order to trigger our AUTOLOAD to redirect them to the server.
+# (Unless the sub is declared it's bypassed by perl method lookup.)
+# See notes in ToDo about method metadata
+# The question is whether to add all the methods in %DBI::DBI_methods
+# to the corresponding classes (::db, ::st etc)
+# Also need to consider methods that, if proxied, would change the server state
+# in a way that might not be visible on the client, ie begin_work -> AutoCommit.
+
+sub commit;
+sub connected;
+sub rollback;
+sub ping;
+
+
+use vars qw(%ATTR $AUTOLOAD);
+
+# inherited: STORE / FETCH against this class.
+# local: STORE / FETCH against parent class.
+# cached: STORE to remote and local objects, FETCH from local.
+# remote: STORE / FETCH against remote object only (default).
+#
+# Note: Attribute names starting with 'proxy_' always treated as 'inherited'.
+#
+%ATTR = ( # see also %ATTR in DBD::Proxy::st
+ %DBD::Proxy::ATTR,
+ RowCacheSize => 'inherited',
+ #AutoCommit => 'cached',
+ 'FetchHashKeyName' => 'cached',
+ Statement => 'local',
+ Driver => 'local',
+ dbi_connect_closure => 'local',
+ Username => 'local',
+);
+
+sub AUTOLOAD {
+ my $method = $AUTOLOAD;
+ $method =~ s/(.*::(.*)):://;
+ my $class = $1;
+ my $type = $2;
+ #warn "AUTOLOAD of $method (class=$class, type=$type)";
+ my %expand = (
+ 'method' => $method,
+ 'class' => $class,
+ 'type' => $type,
+ 'call' => "$method(\@_)",
+ # XXX was trying to be smart but was tripping up over the DBI's own
+ # smartness. Disabled, but left here in case there are issues.
+ # 'call' => (UNIVERSAL::can("DBI::_::$type", $method)) ? "$method(\@_)" : "func(\@_, '$method')",
+ );
+
+ my $method_code = q{
+ package ~class~;
+ sub ~method~ {
+ my $h = shift;
+ local $@;
+ my @result = wantarray
+ ? eval { $h->{'proxy_~type~h'}->~call~ }
+ : eval { scalar $h->{'proxy_~type~h'}->~call~ };
+ return DBD::Proxy::proxy_set_err($h, $@) if $@;
+ return wantarray ? @result : $result[0];
+ }
+ };
+ $method_code =~ s/\~(\w+)\~/$expand{$1}/eg;
+ local $SIG{__DIE__} = 'DEFAULT';
+ my $err = do { local $@; eval $method_code.2; $@ };
+ die $err if $err;
+ goto &$AUTOLOAD;
+}
+
+sub DESTROY {
+ my $dbh = shift;
+ local $@ if $@; # protect $@
+ $dbh->disconnect if $dbh->SUPER::FETCH('Active');
+}
+
+sub disconnect ($) {
+ my ($dbh) = @_;
+
+ # Sadly the Proxy too-often disagrees with the backend database
+ # on the subject of 'Active'. In the short term, I'd like the
+ # Proxy to ease up and let me decide when it's proper to go over
+ # the wire. This ultimately applies to finish() as well.
+ #return unless $dbh->SUPER::FETCH('Active');
+
+ # Drop database connection at remote end
+ my $rdbh = $dbh->{'proxy_dbh'};
+ if ( $rdbh ) {
+ local $SIG{__DIE__} = 'DEFAULT';
+ local $@;
+ eval { $rdbh->disconnect() } ;
+ DBD::Proxy::proxy_set_err($dbh, $@) if $@;
+ }
+
+ # Close TCP connect to remote
+ # XXX possibly best left till DESTROY? Add a config attribute to choose?
+ #$dbh->{proxy_client}->Disconnect(); # Disconnect method requires newer PlRPC module
+ $dbh->{proxy_client}->{socket} = undef; # hack
+
+ $dbh->SUPER::STORE('Active' => 0);
+ 1;
+}
+
+
+sub STORE ($$$) {
+ my($dbh, $attr, $val) = @_;
+ my $type = $ATTR{$attr} || 'remote';
+
+ if ($attr eq 'TraceLevel') {
+ warn("TraceLevel $val");
+ my $pc = $dbh->{proxy_client} || die;
+ $pc->{logfile} ||= 1; # XXX hack
+ $pc->{debug} = ($val && $val >= 4);
+ $pc->Debug("$pc debug enabled") if $pc->{debug};
+ }
+
+ if ($attr =~ /^proxy_/ || $type eq 'inherited') {
+ $dbh->{$attr} = $val;
+ return 1;
+ }
+
+ if ($type eq 'remote' || $type eq 'cached') {
+ local $SIG{__DIE__} = 'DEFAULT';
+ local $@;
+ my $result = eval { $dbh->{'proxy_dbh'}->STORE($attr => $val) };
+ return DBD::Proxy::proxy_set_err($dbh, $@) if $@; # returns undef
+ $dbh->SUPER::STORE($attr => $val) if $type eq 'cached';
+ return $result;
+ }
+ return $dbh->SUPER::STORE($attr => $val);
+}
+
+sub FETCH ($$) {
+ my($dbh, $attr) = @_;
+ # we only get here for cached attribute values if the handle is in CompatMode
+ # otherwise the DBI dispatcher handles the FETCH itself from the attribute cache.
+ my $type = $ATTR{$attr} || 'remote';
+
+ if ($attr =~ /^proxy_/ || $type eq 'inherited' || $type eq 'cached') {
+ return $dbh->{$attr};
+ }
+
+ return $dbh->SUPER::FETCH($attr) unless $type eq 'remote';
+
+ local $SIG{__DIE__} = 'DEFAULT';
+ local $@;
+ my $result = eval { $dbh->{'proxy_dbh'}->FETCH($attr) };
+ return DBD::Proxy::proxy_set_err($dbh, $@) if $@;
+ return $result;
+}
+
+sub prepare ($$;$) {
+ my($dbh, $stmt, $attr) = @_;
+ my $sth = DBI::_new_sth($dbh, {
+ 'Statement' => $stmt,
+ 'proxy_attr' => $attr,
+ 'proxy_cache_only' => 0,
+ 'proxy_params' => [],
+ }
+ );
+ my $proto_ver = $dbh->{'proxy_proto_ver'};
+ if ( $proto_ver > 1 ) {
+ $sth->{'proxy_attr_cache'} = {cache_filled => 0};
+ my $rdbh = $dbh->{'proxy_dbh'};
+ local $SIG{__DIE__} = 'DEFAULT';
+ local $@;
+ my $rsth = eval { $rdbh->prepare($sth->{'Statement'}, $sth->{'proxy_attr'}, undef, $proto_ver) };
+ return DBD::Proxy::proxy_set_err($sth, $@) if $@;
+ return DBD::Proxy::proxy_set_err($sth, "Constructor didn't return a handle: $rsth")
+ unless ($rsth =~ /^((?:\w+|\:\:)+)=(\w+)/);
+
+ my $client = $dbh->{'proxy_client'};
+ $rsth = RPC::PlClient::Object->new($1, $client, $rsth);
+
+ $sth->{'proxy_sth'} = $rsth;
+ # If statement is a positioned update we do not want any readahead.
+ $sth->{'RowCacheSize'} = 1 if $stmt =~ /\bfor\s+update\b/i;
+ # Since resources are used by prepared remote handle, mark us active.
+ $sth->SUPER::STORE(Active => 1);
+ }
+ $sth;
+}
+
+sub quote {
+ my $dbh = shift;
+ my $proxy_quote = $dbh->{proxy_quote} || 'remote';
+
+ return $dbh->SUPER::quote(@_)
+ if $proxy_quote eq 'local' && @_ == 1;
+
+ # For the common case of only a single argument
+ # (no $data_type) we could learn and cache the behaviour.
+ # Or we could probe the driver with a few test cases.
+ # Or we could add a way to ask the DBI::ProxyServer
+ # if $dbh->can('quote') == \&DBI::_::db::quote.
+ # Tim
+ #
+ # Sounds all *very* smart to me. I'd rather suggest to
+ # implement some of the typical quote possibilities
+ # and let the user set
+ # $dbh->{'proxy_quote'} = 'backslash_escaped';
+ # for example.
+ # Jochen
+ local $SIG{__DIE__} = 'DEFAULT';
+ local $@;
+ my $result = eval { $dbh->{'proxy_dbh'}->quote(@_) };
+ return DBD::Proxy::proxy_set_err($dbh, $@) if $@;
+ return $result;
+}
+
+sub table_info {
+ my $dbh = shift;
+ my $rdbh = $dbh->{'proxy_dbh'};
+ #warn "table_info(@_)";
+ local $SIG{__DIE__} = 'DEFAULT';
+ local $@;
+ my($numFields, $names, $types, @rows) = eval { $rdbh->table_info(@_) };
+ return DBD::Proxy::proxy_set_err($dbh, $@) if $@;
+ my ($sth, $inner) = DBI::_new_sth($dbh, {
+ 'Statement' => "SHOW TABLES",
+ 'proxy_params' => [],
+ 'proxy_data' => \@rows,
+ 'proxy_attr_cache' => {
+ 'NUM_OF_PARAMS' => 0,
+ 'NUM_OF_FIELDS' => $numFields,
+ 'NAME' => $names,
+ 'TYPE' => $types,
+ 'cache_filled' => 1
+ },
+ 'proxy_cache_only' => 1,
+ });
+ $sth->SUPER::STORE('NUM_OF_FIELDS' => $numFields);
+ $inner->{NAME} = $names;
+ $inner->{TYPE} = $types;
+ $sth->SUPER::STORE('Active' => 1); # already execute()'d
+ $sth->{'proxy_rows'} = @rows;
+ return $sth;
+}
+
+sub tables {
+ my $dbh = shift;
+ #warn "tables(@_)";
+ return $dbh->SUPER::tables(@_);
+}
+
+
+sub type_info_all {
+ my $dbh = shift;
+ local $SIG{__DIE__} = 'DEFAULT';
+ local $@;
+ my $result = eval { $dbh->{'proxy_dbh'}->type_info_all(@_) };
+ return DBD::Proxy::proxy_set_err($dbh, $@) if $@;
+ return $result;
+}
+
+
+package DBD::Proxy::st; # ====== STATEMENT ======
+
+$DBD::Proxy::st::imp_data_size = 0;
+
+use vars qw(%ATTR);
+
+# inherited: STORE to current object. FETCH from current if exists, else call up
+# to the (proxy) database object.
+# local: STORE / FETCH against parent class.
+# cache_only: STORE noop (read-only). FETCH from private_* if exists, else call
+# remote and cache the result.
+# remote: STORE / FETCH against remote object only (default).
+#
+# Note: Attribute names starting with 'proxy_' always treated as 'inherited'.
+#
+%ATTR = ( # see also %ATTR in DBD::Proxy::db
+ %DBD::Proxy::ATTR,
+ 'Database' => 'local',
+ 'RowsInCache' => 'local',
+ 'RowCacheSize' => 'inherited',
+ 'NULLABLE' => 'cache_only',
+ 'NAME' => 'cache_only',
+ 'TYPE' => 'cache_only',
+ 'PRECISION' => 'cache_only',
+ 'SCALE' => 'cache_only',
+ 'NUM_OF_FIELDS' => 'cache_only',
+ 'NUM_OF_PARAMS' => 'cache_only'
+);
+
+*AUTOLOAD = \&DBD::Proxy::db::AUTOLOAD;
+
+sub execute ($@) {
+ my $sth = shift;
+ my $params = @_ ? \@_ : $sth->{'proxy_params'};
+
+ # new execute, so delete any cached rows from previous execute
+ undef $sth->{'proxy_data'};
+ undef $sth->{'proxy_rows'};
+
+ my $rsth = $sth->{proxy_sth};
+ my $dbh = $sth->FETCH('Database');
+ my $proto_ver = $dbh->{proxy_proto_ver};
+
+ my ($numRows, @outData);
+
+ local $SIG{__DIE__} = 'DEFAULT';
+ local $@;
+ if ( $proto_ver > 1 ) {
+ ($numRows, @outData) = eval { $rsth->execute($params, $proto_ver) };
+ return DBD::Proxy::proxy_set_err($sth, $@) if $@;
+
+ # Attributes passed back only on the first execute() of a statement.
+ unless ($sth->{proxy_attr_cache}->{cache_filled}) {
+ my ($numFields, $numParams, $names, $types) = splice(@outData, 0, 4);
+ $sth->{'proxy_attr_cache'} = {
+ 'NUM_OF_FIELDS' => $numFields,
+ 'NUM_OF_PARAMS' => $numParams,
+ 'NAME' => $names,
+ 'cache_filled' => 1
+ };
+ $sth->SUPER::STORE('NUM_OF_FIELDS' => $numFields);
+ $sth->SUPER::STORE('NUM_OF_PARAMS' => $numParams);
+ }
+
+ }
+ else {
+ if ($rsth) {
+ ($numRows, @outData) = eval { $rsth->execute($params, $proto_ver) };
+ return DBD::Proxy::proxy_set_err($sth, $@) if $@;
+
+ }
+ else {
+ my $rdbh = $dbh->{'proxy_dbh'};
+
+ # Legacy prepare is actually prepare + first execute on the server.
+ ($rsth, @outData) =
+ eval { $rdbh->prepare($sth->{'Statement'},
+ $sth->{'proxy_attr'}, $params, $proto_ver) };
+ return DBD::Proxy::proxy_set_err($sth, $@) if $@;
+ return DBD::Proxy::proxy_set_err($sth, "Constructor didn't return a handle: $rsth")
+ unless ($rsth =~ /^((?:\w+|\:\:)+)=(\w+)/);
+
+ my $client = $dbh->{'proxy_client'};
+ $rsth = RPC::PlClient::Object->new($1, $client, $rsth);
+
+ my ($numFields, $numParams, $names, $types) = splice(@outData, 0, 4);
+ $sth->{'proxy_sth'} = $rsth;
+ $sth->{'proxy_attr_cache'} = {
+ 'NUM_OF_FIELDS' => $numFields,
+ 'NUM_OF_PARAMS' => $numParams,
+ 'NAME' => $names
+ };
+ $sth->SUPER::STORE('NUM_OF_FIELDS' => $numFields);
+ $sth->SUPER::STORE('NUM_OF_PARAMS' => $numParams);
+ $numRows = shift @outData;
+ }
+ }
+ # Always condition active flag.
+ $sth->SUPER::STORE('Active' => 1) if $sth->FETCH('NUM_OF_FIELDS'); # is SELECT
+ $sth->{'proxy_rows'} = $numRows;
+ # Any remaining items are output params.
+ if (@outData) {
+ foreach my $p (@$params) {
+ if (ref($p->[0])) {
+ my $ref = shift @outData;
+ ${$p->[0]} = $$ref;
+ }
+ }
+ }
+
+ $sth->{'proxy_rows'} || '0E0';
+}
+
+sub fetch ($) {
+ my $sth = shift;
+
+ my $data = $sth->{'proxy_data'};
+
+ $sth->{'proxy_rows'} = 0 unless defined $sth->{'proxy_rows'};
+
+ if(!$data || !@$data) {
+ return undef unless $sth->SUPER::FETCH('Active');
+
+ my $rsth = $sth->{'proxy_sth'};
+ if (!$rsth) {
+ die "Attempt to fetch row without execute";
+ }
+ my $num_rows = $sth->FETCH('RowCacheSize') || 20;
+ local $SIG{__DIE__} = 'DEFAULT';
+ local $@;
+ my @rows = eval { $rsth->fetch($num_rows) };
+ return DBD::Proxy::proxy_set_err($sth, $@) if $@;
+ unless (@rows == $num_rows) {
+ undef $sth->{'proxy_data'};
+ # server side has already called finish
+ $sth->SUPER::STORE(Active => 0);
+ }
+ return undef unless @rows;
+ $sth->{'proxy_data'} = $data = [@rows];
+ }
+ my $row = shift @$data;
+
+ $sth->SUPER::STORE(Active => 0) if ( $sth->{proxy_cache_only} and !@$data );
+ $sth->{'proxy_rows'}++;
+ return $sth->_set_fbav($row);
+}
+*fetchrow_arrayref = \&fetch;
+
+sub rows ($) {
+ my $rows = shift->{'proxy_rows'};
+ return (defined $rows) ? $rows : -1;
+}
+
+sub finish ($) {
+ my($sth) = @_;
+ return 1 unless $sth->SUPER::FETCH('Active');
+ my $rsth = $sth->{'proxy_sth'};
+ $sth->SUPER::STORE('Active' => 0);
+ return 0 unless $rsth; # Something's out of sync
+ my $no_finish = exists($sth->{'proxy_no_finish'})
+ ? $sth->{'proxy_no_finish'}
+ : $sth->FETCH('Database')->{'proxy_no_finish'};
+ unless ($no_finish) {
+ local $SIG{__DIE__} = 'DEFAULT';
+ local $@;
+ my $result = eval { $rsth->finish() };
+ return DBD::Proxy::proxy_set_err($sth, $@) if $@;
+ return $result;
+ }
+ 1;
+}
+
+sub STORE ($$$) {
+ my($sth, $attr, $val) = @_;
+ my $type = $ATTR{$attr} || 'remote';
+
+ if ($attr =~ /^proxy_/ || $type eq 'inherited') {
+ $sth->{$attr} = $val;
+ return 1;
+ }
+
+ if ($type eq 'cache_only') {
+ return 0;
+ }
+
+ if ($type eq 'remote' || $type eq 'cached') {
+ my $rsth = $sth->{'proxy_sth'} or return undef;
+ local $SIG{__DIE__} = 'DEFAULT';
+ local $@;
+ my $result = eval { $rsth->STORE($attr => $val) };
+ return DBD::Proxy::proxy_set_err($sth, $@) if ($@);
+ return $result if $type eq 'remote'; # else fall through to cache locally
+ }
+ return $sth->SUPER::STORE($attr => $val);
+}
+
+sub FETCH ($$) {
+ my($sth, $attr) = @_;
+
+ if ($attr =~ /^proxy_/) {
+ return $sth->{$attr};
+ }
+
+ my $type = $ATTR{$attr} || 'remote';
+ if ($type eq 'inherited') {
+ if (exists($sth->{$attr})) {
+ return $sth->{$attr};
+ }
+ return $sth->FETCH('Database')->{$attr};
+ }
+
+ if ($type eq 'cache_only' &&
+ exists($sth->{'proxy_attr_cache'}->{$attr})) {
+ return $sth->{'proxy_attr_cache'}->{$attr};
+ }
+
+ if ($type ne 'local') {
+ my $rsth = $sth->{'proxy_sth'} or return undef;
+ local $SIG{__DIE__} = 'DEFAULT';
+ local $@;
+ my $result = eval { $rsth->FETCH($attr) };
+ return DBD::Proxy::proxy_set_err($sth, $@) if $@;
+ return $result;
+ }
+ elsif ($attr eq 'RowsInCache') {
+ my $data = $sth->{'proxy_data'};
+ $data ? @$data : 0;
+ }
+ else {
+ $sth->SUPER::FETCH($attr);
+ }
+}
+
+sub bind_param ($$$@) {
+ my $sth = shift; my $param = shift;
+ $sth->{'proxy_params'}->[$param-1] = [@_];
+}
+*bind_param_inout = \&bind_param;
+
+sub DESTROY {
+ my $sth = shift;
+ $sth->finish if $sth->SUPER::FETCH('Active');
+}
+
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+DBD::Proxy - A proxy driver for the DBI
+
+=head1 SYNOPSIS
+
+ use DBI;
+
+ $dbh = DBI->connect("dbi:Proxy:hostname=$host;port=$port;dsn=$db",
+ $user, $passwd);
+
+ # See the DBI module documentation for full details
+
+=head1 DESCRIPTION
+
+DBD::Proxy is a Perl module for connecting to a database via a remote
+DBI driver. See L<DBD::Gofer> for an alternative with different trade-offs.
+
+This is of course not needed for DBI drivers which already
+support connecting to a remote database, but there are engines which
+don't offer network connectivity.
+
+Another application is offering database access through a firewall, as
+the driver offers query based restrictions. For example you can
+restrict queries to exactly those that are used in a given CGI
+application.
+
+Speaking of CGI, another application is (or rather, will be) to reduce
+the database connect/disconnect overhead from CGI scripts by using
+proxying the connect_cached method. The proxy server will hold the
+database connections open in a cache. The CGI script then trades the
+database connect/disconnect overhead for the DBD::Proxy
+connect/disconnect overhead which is typically much less.
+I<Note that the connect_cached method is new and still experimental.>
+
+
+=head1 CONNECTING TO THE DATABASE
+
+Before connecting to a remote database, you must ensure, that a Proxy
+server is running on the remote machine. There's no default port, so
+you have to ask your system administrator for the port number. See
+L<DBI::ProxyServer> for details.
+
+Say, your Proxy server is running on machine "alpha", port 3334, and
+you'd like to connect to an ODBC database called "mydb" as user "joe"
+with password "hello". When using DBD::ODBC directly, you'd do a
+
+ $dbh = DBI->connect("DBI:ODBC:mydb", "joe", "hello");
+
+With DBD::Proxy this becomes
+
+ $dsn = "DBI:Proxy:hostname=alpha;port=3334;dsn=DBI:ODBC:mydb";
+ $dbh = DBI->connect($dsn, "joe", "hello");
+
+You see, this is mainly the same. The DBD::Proxy module will create a
+connection to the Proxy server on "alpha" which in turn will connect
+to the ODBC database.
+
+Refer to the L<DBI> documentation on the C<connect> method for a way
+to automatically use DBD::Proxy without having to change your code.
+
+DBD::Proxy's DSN string has the format
+
+ $dsn = "DBI:Proxy:key1=val1; ... ;keyN=valN;dsn=valDSN";
+
+In other words, it is a collection of key/value pairs. The following
+keys are recognized:
+
+=over 4
+
+=item hostname
+
+=item port
+
+Hostname and port of the Proxy server; these keys must be present,
+no defaults. Example:
+
+ hostname=alpha;port=3334
+
+=item dsn
+
+The value of this attribute will be used as a dsn name by the Proxy
+server. Thus it must have the format C<DBI:driver:...>, in particular
+it will contain colons. The I<dsn> value may contain semicolons, hence
+this key *must* be the last and it's value will be the complete
+remaining part of the dsn. Example:
+
+ dsn=DBI:ODBC:mydb
+
+=item cipher
+
+=item key
+
+=item usercipher
+
+=item userkey
+
+By using these fields you can enable encryption. If you set,
+for example,
+
+ cipher=$class;key=$key
+
+(note the semicolon) then DBD::Proxy will create a new cipher object
+by executing
+
+ $cipherRef = $class->new(pack("H*", $key));
+
+and pass this object to the RPC::PlClient module when creating a
+client. See L<RPC::PlClient>. Example:
+
+ cipher=IDEA;key=97cd2375efa329aceef2098babdc9721
+
+The usercipher/userkey attributes allow you to use two phase encryption:
+The cipher/key encryption will be used in the login and authorisation
+phase. Once the client is authorised, he will change to usercipher/userkey
+encryption. Thus the cipher/key pair is a B<host> based secret, typically
+less secure than the usercipher/userkey secret and readable by anyone.
+The usercipher/userkey secret is B<your> private secret.
+
+Of course encryption requires an appropriately configured server. See
+<DBD::ProxyServer/CONFIGURATION FILE>.
+
+=item debug
+
+Turn on debugging mode
+
+=item stderr
+
+This attribute will set the corresponding attribute of the RPC::PlClient
+object, thus logging will not use syslog(), but redirected to stderr.
+This is the default under Windows.
+
+ stderr=1
+
+=item logfile
+
+Similar to the stderr attribute, but output will be redirected to the
+given file.
+
+ logfile=/dev/null
+
+=item RowCacheSize
+
+The DBD::Proxy driver supports this attribute (which is DBI standard,
+as of DBI 1.02). It's used to reduce network round-trips by fetching
+multiple rows in one go. The current default value is 20, but this may
+change.
+
+
+=item proxy_no_finish
+
+This attribute can be used to reduce network traffic: If the
+application is calling $sth->finish() then the proxy tells the server
+to finish the remote statement handle. Of course this slows down things
+quite a lot, but is prefectly good for reducing memory usage with
+persistent connections.
+
+However, if you set the I<proxy_no_finish> attribute to a TRUE value,
+either in the database handle or in the statement handle, then finish()
+calls will be supressed. This is what you want, for example, in small
+and fast CGI applications.
+
+=item proxy_quote
+
+This attribute can be used to reduce network traffic: By default calls
+to $dbh->quote() are passed to the remote driver. Of course this slows
+down things quite a lot, but is the safest default behaviour.
+
+However, if you set the I<proxy_quote> attribute to the value 'C<local>'
+either in the database handle or in the statement handle, and the call
+to quote has only one parameter, then the local default DBI quote
+method will be used (which will be faster but may be wrong).
+
+=back
+
+=head1 KNOWN ISSUES
+
+=head2 Unproxied method calls
+
+If a method isn't being proxied, try declaring a stub sub in the appropriate
+package (DBD::Proxy::db for a dbh method, and DBD::Proxy::st for an sth method).
+For example:
+
+ sub DBD::Proxy::db::selectall_arrayref;
+
+That will enable selectall_arrayref to be proxied.
+
+Currently many methods aren't explicitly proxied and so you get the DBI's
+default methods executed on the client.
+
+Some of those methods, like selectall_arrayref, may then call other methods
+that are proxied (selectall_arrayref calls fetchall_arrayref which calls fetch
+which is proxied). So things may appear to work but operate more slowly than
+the could.
+
+This may all change in a later version.
+
+=head2 Complex handle attributes
+
+Sometimes handles are having complex attributes like hash refs or
+array refs and not simple strings or integers. For example, with
+DBD::CSV, you would like to write something like
+
+ $dbh->{"csv_tables"}->{"passwd"} =
+ { "sep_char" => ":", "eol" => "\n";
+
+The above example would advice the CSV driver to assume the file
+"passwd" to be in the format of the /etc/passwd file: Colons as
+separators and a line feed without carriage return as line
+terminator.
+
+Surprisingly this example doesn't work with the proxy driver. To understand
+the reasons, you should consider the following: The Perl compiler is
+executing the above example in two steps:
+
+=over
+
+=item 1
+
+The first step is fetching the value of the key "csv_tables" in the
+handle $dbh. The value returned is complex, a hash ref.
+
+=item 2
+
+The second step is storing some value (the right hand side of the
+assignment) as the key "passwd" in the hash ref from step 1.
+
+=back
+
+This becomes a little bit clearer, if we rewrite the above code:
+
+ $tables = $dbh->{"csv_tables"};
+ $tables->{"passwd"} = { "sep_char" => ":", "eol" => "\n";
+
+While the examples work fine without the proxy, the fail due to a
+subtile difference in step 1: By DBI magic, the hash ref
+$dbh->{'csv_tables'} is returned from the server to the client.
+The client creates a local copy. This local copy is the result of
+step 1. In other words, step 2 modifies a local copy of the hash ref,
+but not the server's hash ref.
+
+The workaround is storing the modified local copy back to the server:
+
+ $tables = $dbh->{"csv_tables"};
+ $tables->{"passwd"} = { "sep_char" => ":", "eol" => "\n";
+ $dbh->{"csv_tables"} = $tables;
+
+
+=head1 AUTHOR AND COPYRIGHT
+
+This module is Copyright (c) 1997, 1998
+
+ Jochen Wiedmann
+ Am Eisteich 9
+ 72555 Metzingen
+ Germany
+
+ Email: joe@ispsoft.de
+ Phone: +49 7123 14887
+
+The DBD::Proxy module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. In particular permission
+is granted to Tim Bunce for distributing this as a part of the DBI.
+
+
+=head1 SEE ALSO
+
+L<DBI>, L<RPC::PlClient>, L<Storable>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/SQLite.pm b/Master/tlpkg/tlperl.straw/lib/DBD/SQLite.pm
new file mode 100755
index 00000000000..cec461c38d7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/SQLite.pm
@@ -0,0 +1,1575 @@
+package DBD::SQLite;
+
+use 5.006;
+use strict;
+use DBI 1.57 ();
+use DynaLoader ();
+
+use vars qw($VERSION @ISA);
+use vars qw{$err $errstr $drh $sqlite_version};
+use vars qw{%COLLATION};
+
+BEGIN {
+ $VERSION = '1.29';
+ @ISA = 'DynaLoader';
+
+ # Initialize errors
+ $err = undef;
+ $errstr = undef;
+
+ # Driver singleton
+ $drh = undef;
+
+ # sqlite_version cache
+ $sqlite_version = undef;
+}
+
+__PACKAGE__->bootstrap($VERSION);
+
+tie %COLLATION, 'DBD::SQLite::_WriteOnceHash';
+$COLLATION{perl} = sub { $_[0] cmp $_[1] };
+$COLLATION{perllocale} = sub { use locale; $_[0] cmp $_[1] };
+
+my $methods_are_installed;
+
+sub driver {
+ return $drh if $drh;
+
+ if (!$methods_are_installed && $DBI::VERSION >= 1.608) {
+ DBI->setup_driver('DBD::SQLite');
+
+ DBD::SQLite::db->install_method('sqlite_last_insert_rowid');
+ DBD::SQLite::db->install_method('sqlite_busy_timeout');
+ DBD::SQLite::db->install_method('sqlite_create_function');
+ DBD::SQLite::db->install_method('sqlite_create_aggregate');
+ DBD::SQLite::db->install_method('sqlite_create_collation');
+ DBD::SQLite::db->install_method('sqlite_collation_needed');
+ DBD::SQLite::db->install_method('sqlite_progress_handler');
+ DBD::SQLite::db->install_method('sqlite_commit_hook');
+ DBD::SQLite::db->install_method('sqlite_rollback_hook');
+ DBD::SQLite::db->install_method('sqlite_update_hook');
+ DBD::SQLite::db->install_method('sqlite_set_authorizer');
+ DBD::SQLite::db->install_method('sqlite_backup_from_file');
+ DBD::SQLite::db->install_method('sqlite_backup_to_file');
+ DBD::SQLite::db->install_method('sqlite_enable_load_extension');
+ $methods_are_installed++;
+ }
+
+ $drh = DBI::_new_drh( "$_[0]::dr", {
+ Name => 'SQLite',
+ Version => $VERSION,
+ Attribution => 'DBD::SQLite by Matt Sergeant et al',
+ } );
+ return $drh;
+}
+
+sub CLONE {
+ undef $drh;
+}
+
+package DBD::SQLite::dr;
+
+sub connect {
+ my ($drh, $dbname, $user, $auth, $attr) = @_;
+
+ # Default PrintWarn to the value of $^W
+ unless ( defined $attr->{PrintWarn} ) {
+ $attr->{PrintWarn} = $^W ? 1 : 0;
+ }
+
+ my $dbh = DBI::_new_dbh( $drh, {
+ Name => $dbname,
+ } );
+
+ my $real = $dbname;
+ if ( $dbname =~ /=/ ) {
+ foreach my $attrib ( split(/;/, $dbname) ) {
+ my ($key, $value) = split(/=/, $attrib, 2);
+ if ( $key eq 'dbname' ) {
+ $real = $value;
+ } else {
+ $attr->{$key} = $value;
+ }
+ }
+ }
+
+ # To avoid unicode and long file name problems on Windows,
+ # convert to the shortname if the file (or parent directory) exists.
+ if ( $^O =~ /MSWin32/ and $real ne ':memory:' and $real ne '') {
+ require Win32;
+ require File::Basename;
+ my ($file, $dir, $suffix) = File::Basename::fileparse($real);
+ my $short = Win32::GetShortPathName($real);
+ if ( $short && -f $short ) {
+ # Existing files will work directly.
+ $real = $short;
+ } elsif ( -d $dir ) {
+ # We are creating a new file.
+ # Does the directory it's in at least exist?
+ $real = join '', grep { defined } Win32::GetShortPathName($dir), $file, $suffix;
+ } else {
+ # SQLite can't do mkpath anyway.
+ # So let it go through as it and fail.
+ }
+ }
+
+ # Hand off to the actual login function
+ DBD::SQLite::db::_login($dbh, $real, $user, $auth, $attr) or return undef;
+
+ # Register the on-demand collation installer
+ $DBI::VERSION >= 1.608
+ ? $dbh->sqlite_collation_needed(\&install_collation)
+ : $dbh->func(\&install_collation, "collation_needed");
+
+ # Register the REGEXP function
+ $DBI::VERSION >= 1.608
+ ? $dbh->sqlite_create_function("REGEXP", 2, \&regexp)
+ : $dbh->func("REGEXP", 2, \&regexp, "create_function");
+
+ # HACK: Since PrintWarn = 0 doesn't seem to actually prevent warnings
+ # in DBD::SQLite we set Warn to false if PrintWarn is false.
+ unless ( $attr->{PrintWarn} ) {
+ $attr->{Warn} = 0;
+ }
+
+ return $dbh;
+}
+
+
+sub install_collation {
+ my ($dbh, $collation_name) = @_;
+ my $collation = $DBD::SQLite::COLLATION{$collation_name}
+ or die "can't install, unknown collation : $collation_name";
+ $DBI::VERSION >= 1.608
+ ? $dbh->sqlite_create_collation($collation_name => $collation)
+ : $dbh->func($collation_name => $collation, "create_collation");
+}
+
+# default implementation for sqlite 'REGEXP' infix operator.
+# Note : args are reversed, i.e. "a REGEXP b" calls REGEXP(b, a)
+# (see http://www.sqlite.org/vtab.html#xfindfunction)
+sub regexp {
+ use locale;
+ return scalar($_[1] =~ $_[0]);
+}
+
+
+package DBD::SQLite::db;
+
+sub prepare {
+ my $dbh = shift;
+ my $sql = shift;
+ $sql = '' unless defined $sql;
+
+ my $sth = DBI::_new_sth( $dbh, {
+ Statement => $sql,
+ } );
+
+ DBD::SQLite::st::_prepare($sth, $sql, @_) or return undef;
+
+ return $sth;
+}
+
+sub _get_version {
+ return ( DBD::SQLite::db::FETCH($_[0], 'sqlite_version') );
+}
+
+my %info = (
+ 17 => 'SQLite', # SQL_DBMS_NAME
+ 18 => \&_get_version, # SQL_DBMS_VER
+ 29 => '"', # SQL_IDENTIFIER_QUOTE_CHAR
+);
+
+sub get_info {
+ my($dbh, $info_type) = @_;
+ my $v = $info{int($info_type)};
+ $v = $v->($dbh) if ref $v eq 'CODE';
+ return $v;
+}
+
+sub _attached_database_list {
+ my $dbh = shift;
+ my @attached;
+
+ my $sth_databases = $dbh->prepare( 'PRAGMA database_list' );
+ $sth_databases->execute;
+ while ( my $db_info = $sth_databases->fetchrow_hashref ) {
+ push @attached, $db_info->{name} if $db_info->{seq} >= 2;
+ }
+ return @attached;
+}
+
+# SQL/CLI (ISO/IEC JTC 1/SC 32 N 0595), 6.63 Tables
+# Based on DBD::Oracle's
+# See also http://www.ch-werner.de/sqliteodbc/html/sqlite3odbc_8c.html#a213
+sub table_info {
+ my ($dbh, $cat_val, $sch_val, $tbl_val, $typ_val, $attr) = @_;
+
+ my @where = ();
+ my $sql;
+ if ( defined($cat_val) && $cat_val eq '%'
+ && defined($sch_val) && $sch_val eq ''
+ && defined($tbl_val) && $tbl_val eq '') { # Rule 19a
+ $sql = <<'END_SQL';
+SELECT NULL TABLE_CAT
+ , NULL TABLE_SCHEM
+ , NULL TABLE_NAME
+ , NULL TABLE_TYPE
+ , NULL REMARKS
+END_SQL
+ }
+ elsif ( defined($cat_val) && $cat_val eq ''
+ && defined($sch_val) && $sch_val eq '%'
+ && defined($tbl_val) && $tbl_val eq '') { # Rule 19b
+ $sql = <<'END_SQL';
+SELECT NULL TABLE_CAT
+ , t.tn TABLE_SCHEM
+ , NULL TABLE_NAME
+ , NULL TABLE_TYPE
+ , NULL REMARKS
+FROM (
+ SELECT 'main' tn
+ UNION SELECT 'temp' tn
+END_SQL
+ for my $db_name (_attached_database_list($dbh)) {
+ $sql .= " UNION SELECT '$db_name' tn\n";
+ }
+ $sql .= ") t\n";
+ }
+ elsif ( defined($cat_val) && $cat_val eq ''
+ && defined($sch_val) && $sch_val eq ''
+ && defined($tbl_val) && $tbl_val eq ''
+ && defined($typ_val) && $typ_val eq '%') { # Rule 19c
+ $sql = <<'END_SQL';
+SELECT NULL TABLE_CAT
+ , NULL TABLE_SCHEM
+ , NULL TABLE_NAME
+ , t.tt TABLE_TYPE
+ , NULL REMARKS
+FROM (
+ SELECT 'TABLE' tt UNION
+ SELECT 'VIEW' tt UNION
+ SELECT 'LOCAL TEMPORARY' tt
+) t
+ORDER BY TABLE_TYPE
+END_SQL
+ }
+ else {
+ $sql = <<'END_SQL';
+SELECT *
+FROM
+(
+SELECT NULL TABLE_CAT
+ , TABLE_SCHEM
+ , tbl_name TABLE_NAME
+ , TABLE_TYPE
+ , NULL REMARKS
+ , sql sqlite_sql
+FROM (
+ SELECT 'main' TABLE_SCHEM, tbl_name, upper(type) TABLE_TYPE, sql
+ FROM sqlite_master
+UNION ALL
+ SELECT 'temp' TABLE_SCHEM, tbl_name, 'LOCAL TEMPORARY' TABLE_TYPE, sql
+ FROM sqlite_temp_master
+END_SQL
+
+ for my $db_name (_attached_database_list($dbh)) {
+ $sql .= <<"END_SQL";
+UNION ALL
+ SELECT '$db_name' TABLE_SCHEM, tbl_name, upper(type) TABLE_TYPE, sql
+ FROM "$db_name".sqlite_master
+END_SQL
+ }
+
+ $sql .= <<'END_SQL';
+UNION ALL
+ SELECT 'main' TABLE_SCHEM, 'sqlite_master' tbl_name, 'SYSTEM TABLE' TABLE_TYPE, NULL sql
+UNION ALL
+ SELECT 'temp' TABLE_SCHEM, 'sqlite_temp_master' tbl_name, 'SYSTEM TABLE' TABLE_TYPE, NULL sql
+)
+)
+END_SQL
+ $attr = {} unless ref $attr eq 'HASH';
+ my $escape = defined $attr->{Escape} ? " ESCAPE '$attr->{Escape}'" : '';
+ if ( defined $sch_val ) {
+ push @where, "TABLE_SCHEM LIKE '$sch_val'$escape";
+ }
+ if ( defined $tbl_val ) {
+ push @where, "TABLE_NAME LIKE '$tbl_val'$escape";
+ }
+ if ( defined $typ_val ) {
+ my $table_type_list;
+ $typ_val =~ s/^\s+//;
+ $typ_val =~ s/\s+$//;
+ my @ttype_list = split (/\s*,\s*/, $typ_val);
+ foreach my $table_type (@ttype_list) {
+ if ($table_type !~ /^'.*'$/) {
+ $table_type = "'" . $table_type . "'";
+ }
+ }
+ $table_type_list = join(', ', @ttype_list);
+ push @where, "TABLE_TYPE IN (\U$table_type_list)" if $table_type_list;
+ }
+ $sql .= ' WHERE ' . join("\n AND ", @where ) . "\n" if @where;
+ $sql .= " ORDER BY TABLE_TYPE, TABLE_SCHEM, TABLE_NAME\n";
+ }
+ my $sth = $dbh->prepare($sql) or return undef;
+ $sth->execute or return undef;
+ $sth;
+}
+
+sub primary_key_info {
+ my ($dbh, $catalog, $schema, $table) = @_;
+
+ # Escape the schema and table name
+ $schema =~ s/([\\_%])/\\$1/g if defined $schema;
+ my $escaped = $table;
+ $escaped =~ s/([\\_%])/\\$1/g;
+ my $sth_tables = $dbh->table_info($catalog, $schema, $escaped, undef, {Escape => '\\'});
+
+ # This is a hack but much simpler than using pragma index_list etc
+ # also the pragma doesn't list 'INTEGER PRIMARY KEY' autoinc PKs!
+ my @pk_info;
+ while ( my $row = $sth_tables->fetchrow_hashref ) {
+ my $sql = $row->{sqlite_sql} or next;
+ next unless $sql =~ /(.*?)\s*PRIMARY\s+KEY\s*(?:\(\s*(.*?)\s*\))?/si;
+ my @pk = split /\s*,\s*/, $2 || '';
+ unless ( @pk ) {
+ my $prefix = $1;
+ $prefix =~ s/.*create\s+table\s+.*?\(\s*//si;
+ $prefix = (split /\s*,\s*/, $prefix)[-1];
+ @pk = (split /\s+/, $prefix)[0]; # take first word as name
+ }
+ my $key_seq = 0;
+ foreach my $pk_field (@pk) {
+ push @pk_info, {
+ TABLE_SCHEM => $row->{TABLE_SCHEM},
+ TABLE_NAME => $row->{TABLE_NAME},
+ COLUMN_NAME => $pk_field,
+ KEY_SEQ => ++$key_seq,
+ PK_NAME => 'PRIMARY KEY',
+ };
+ }
+ }
+
+ my $sponge = DBI->connect("DBI:Sponge:", '','')
+ or return $dbh->DBI::set_err($DBI::err, "DBI::Sponge: $DBI::errstr");
+ my @names = qw(TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME KEY_SEQ PK_NAME);
+ my $sth = $sponge->prepare( "primary_key_info $table", {
+ rows => [ map { [ @{$_}{@names} ] } @pk_info ],
+ NUM_OF_FIELDS => scalar @names,
+ NAME => \@names,
+ }) or return $dbh->DBI::set_err(
+ $sponge->err(),
+ $sponge->errstr()
+ );
+ return $sth;
+}
+
+sub type_info_all {
+ return; # XXX code just copied from DBD::Oracle, not yet thought about
+# return [
+# {
+# TYPE_NAME => 0,
+# DATA_TYPE => 1,
+# COLUMN_SIZE => 2,
+# LITERAL_PREFIX => 3,
+# LITERAL_SUFFIX => 4,
+# CREATE_PARAMS => 5,
+# NULLABLE => 6,
+# CASE_SENSITIVE => 7,
+# SEARCHABLE => 8,
+# UNSIGNED_ATTRIBUTE => 9,
+# FIXED_PREC_SCALE => 10,
+# AUTO_UNIQUE_VALUE => 11,
+# LOCAL_TYPE_NAME => 12,
+# MINIMUM_SCALE => 13,
+# MAXIMUM_SCALE => 14,
+# SQL_DATA_TYPE => 15,
+# SQL_DATETIME_SUB => 16,
+# NUM_PREC_RADIX => 17,
+# },
+# [ 'CHAR', 1, 255, '\'', '\'', 'max length', 1, 1, 3,
+# undef, '0', '0', undef, undef, undef, 1, undef, undef
+# ],
+# [ 'NUMBER', 3, 38, undef, undef, 'precision,scale', 1, '0', 3,
+# '0', '0', '0', undef, '0', 38, 3, undef, 10
+# ],
+# [ 'DOUBLE', 8, 15, undef, undef, undef, 1, '0', 3,
+# '0', '0', '0', undef, undef, undef, 8, undef, 10
+# ],
+# [ 'DATE', 9, 19, '\'', '\'', undef, 1, '0', 3,
+# undef, '0', '0', undef, '0', '0', 11, undef, undef
+# ],
+# [ 'VARCHAR', 12, 1024*1024, '\'', '\'', 'max length', 1, 1, 3,
+# undef, '0', '0', undef, undef, undef, 12, undef, undef
+# ]
+# ];
+}
+
+my @COLUMN_INFO = qw(
+ TABLE_CAT
+ TABLE_SCHEM
+ TABLE_NAME
+ COLUMN_NAME
+ DATA_TYPE
+ TYPE_NAME
+ COLUMN_SIZE
+ BUFFER_LENGTH
+ DECIMAL_DIGITS
+ NUM_PREC_RADIX
+ NULLABLE
+ REMARKS
+ COLUMN_DEF
+ SQL_DATA_TYPE
+ SQL_DATETIME_SUB
+ CHAR_OCTET_LENGTH
+ ORDINAL_POSITION
+ IS_NULLABLE
+);
+
+sub column_info {
+ my ($dbh, $cat_val, $sch_val, $tbl_val, $col_val) = @_;
+
+ if ( defined $col_val and $col_val eq '%' ) {
+ $col_val = undef;
+ }
+
+ # Get a list of all tables ordered by TABLE_SCHEM, TABLE_NAME
+ my $sql = <<'END_SQL';
+SELECT TABLE_SCHEM, tbl_name TABLE_NAME
+FROM (
+ SELECT 'main' TABLE_SCHEM, tbl_name
+ FROM sqlite_master
+ WHERE type IN ('table','view')
+UNION ALL
+ SELECT 'temp' TABLE_SCHEM, tbl_name
+ FROM sqlite_temp_master
+ WHERE type IN ('table','view')
+END_SQL
+
+ for my $db_name (_attached_database_list($dbh)) {
+ $sql .= <<"END_SQL";
+UNION ALL
+ SELECT '$db_name' TABLE_SCHEM, tbl_name
+ FROM "$db_name".sqlite_master
+ WHERE type IN ('table','view')
+END_SQL
+ }
+
+ $sql .= <<'END_SQL';
+UNION ALL
+ SELECT 'main' TABLE_SCHEM, 'sqlite_master' tbl_name
+UNION ALL
+ SELECT 'temp' TABLE_SCHEM, 'sqlite_temp_master' tbl_name
+)
+END_SQL
+
+ my @where;
+ if ( defined $sch_val ) {
+ push @where, "TABLE_SCHEM LIKE '$sch_val'";
+ }
+ if ( defined $tbl_val ) {
+ push @where, "TABLE_NAME LIKE '$tbl_val'";
+ }
+ $sql .= ' WHERE ' . join("\n AND ", @where ) . "\n" if @where;
+ $sql .= " ORDER BY TABLE_SCHEM, TABLE_NAME\n";
+ my $sth_tables = $dbh->prepare($sql) or return undef;
+ $sth_tables->execute or return undef;
+
+ # Taken from Fey::Loader::SQLite
+ my @cols;
+ while ( my ($schema, $table) = $sth_tables->fetchrow_array ) {
+ my $sth_columns = $dbh->prepare(qq{PRAGMA "$schema".table_info("$table")});
+ $sth_columns->execute;
+
+ for ( my $position = 1; my $col_info = $sth_columns->fetchrow_hashref; $position++ ) {
+ if ( defined $col_val ) {
+ # This must do a LIKE comparison
+ my $sth = $dbh->prepare("SELECT '$col_info->{name}' LIKE '$col_val'") or return undef;
+ $sth->execute or return undef;
+ # Skip columns that don't match $col_val
+ next unless ($sth->fetchrow_array)[0];
+ }
+
+ my %col = (
+ TABLE_SCHEM => $schema,
+ TABLE_NAME => $table,
+ COLUMN_NAME => $col_info->{name},
+ ORDINAL_POSITION => $position,
+ );
+
+ my $type = $col_info->{type};
+ if ( $type =~ s/(\w+) ?\((\d+)(?:,(\d+))?\)/$1/ ) {
+ $col{COLUMN_SIZE} = $2;
+ $col{DECIMAL_DIGITS} = $3;
+ }
+
+ $col{TYPE_NAME} = $type;
+
+ if ( defined $col_info->{dflt_value} ) {
+ $col{COLUMN_DEF} = $col_info->{dflt_value}
+ }
+
+ if ( $col_info->{notnull} ) {
+ $col{NULLABLE} = 0;
+ $col{IS_NULLABLE} = 'NO';
+ } else {
+ $col{NULLABLE} = 1;
+ $col{IS_NULLABLE} = 'YES';
+ }
+
++ push @cols, \%col;
+ }
+ $sth_columns->finish;
+ }
+ $sth_tables->finish;
+
+ my $sponge = DBI->connect("DBI:Sponge:", '','')
+ or return $dbh->DBI::set_err($DBI::err, "DBI::Sponge: $DBI::errstr");
+ $sponge->prepare( "column_info", {
+ rows => [ map { [ @{$_}{@COLUMN_INFO} ] } @cols ],
+ NUM_OF_FIELDS => scalar @COLUMN_INFO,
+ NAME => [ @COLUMN_INFO ],
+ } ) or return $dbh->DBI::set_err(
+ $sponge->err,
+ $sponge->errstr,
+ );
+}
+
+#======================================================================
+# An internal tied hash package used for %DBD::SQLite::COLLATION, to
+# prevent people from unintentionally overriding globally registered collations.
+
+package DBD::SQLite::_WriteOnceHash;
+
+require Tie::Hash;
+
+our @ISA = qw(Tie::StdHash);
+
+sub TIEHASH {
+ bless {}, $_[0];
+}
+
+sub STORE {
+ ! exists $_[0]->{$_[1]} or die "entry $_[1] already registered";
+ $_[0]->{$_[1]} = $_[2];
+}
+
+sub DELETE {
+ die "deletion of entry $_[1] is forbidden";
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+DBD::SQLite - Self-contained RDBMS in a DBI Driver
+
+=head1 SYNOPSIS
+
+ use DBI;
+ my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","");
+
+=head1 DESCRIPTION
+
+SQLite is a public domain file-based relational database engine that
+you can find at L<http://www.sqlite.org/>.
+
+B<DBD::SQLite> is a Perl DBI driver for SQLite, that includes
+the entire thing in the distribution.
+So in order to get a fast transaction capable RDBMS working for your
+perl project you simply have to install this module, and B<nothing>
+else.
+
+SQLite supports the following features:
+
+=over 4
+
+=item Implements a large subset of SQL92
+
+See L<http://www.sqlite.org/lang.html> for details.
+
+=item A complete DB in a single disk file
+
+Everything for your database is stored in a single disk file, making it
+easier to move things around than with L<DBD::CSV>.
+
+=item Atomic commit and rollback
+
+Yes, B<DBD::SQLite> is small and light, but it supports full transactions!
+
+=item Extensible
+
+User-defined aggregate or regular functions can be registered with the
+SQL parser.
+
+=back
+
+There's lots more to it, so please refer to the docs on the SQLite web
+page, listed above, for SQL details. Also refer to L<DBI> for details
+on how to use DBI itself. The API works like every DBI module does.
+However, currently many statement attributes are not implemented or
+are limited by the typeless nature of the SQLite database.
+
+=head1 NOTABLE DIFFERENCES FROM OTHER DRIVERS
+
+=head2 Database Name Is A File Name
+
+SQLite creates a file per a database. You should pass the C<path> of
+the database file (with or without a parent directory) in the DBI
+connection string (as a database C<name>):
+
+ my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","");
+
+The file is opened in read/write mode, and will be created if
+it does not exist yet.
+
+Although the database is stored in a single file, the directory
+containing the database file must be writable by SQLite because the
+library will create several temporary files there.
+
+If the filename C<$dbfile> is ":memory:", then a private, temporary
+in-memory database is created for the connection. This in-memory
+database will vanish when the database connection is closed.
+It is handy for your library tests.
+
+Note that future versions of SQLite might make use of additional
+special filenames that begin with the ":" character. It is recommended
+that when a database filename actually does begin with a ":" character
+you should prefix the filename with a pathname such as "./" to avoid
+ambiguity.
+
+If the filename C<$dbfile> is an empty string, then a private,
+temporary on-disk database will be created. This private database will
+be automatically deleted as soon as the database connection is closed.
+
+=head2 Accessing A Database With Other Tools
+
+To access the database from the command line, try using C<dbish>
+which comes with the L<DBI::Shell> module. Just type:
+
+ dbish dbi:SQLite:foo.db
+
+On the command line to access the file F<foo.db>.
+
+Alternatively you can install SQLite from the link above without
+conflicting with B<DBD::SQLite> and use the supplied C<sqlite3>
+command line tool.
+
+=head2 Blobs
+
+As of version 1.11, blobs should "just work" in SQLite as text columns.
+However this will cause the data to be treated as a string, so SQL
+statements such as length(x) will return the length of the column as a NUL
+terminated string, rather than the size of the blob in bytes. In order to
+store natively as a BLOB use the following code:
+
+ use DBI qw(:sql_types);
+ my $dbh = DBI->connect("dbi:SQLite:dbfile","","");
+
+ my $blob = `cat foo.jpg`;
+ my $sth = $dbh->prepare("INSERT INTO mytable VALUES (1, ?)");
+ $sth->bind_param(1, $blob, SQL_BLOB);
+ $sth->execute();
+
+And then retrieval just works:
+
+ $sth = $dbh->prepare("SELECT * FROM mytable WHERE id = 1");
+ $sth->execute();
+ my $row = $sth->fetch;
+ my $blobo = $row->[1];
+
+ # now $blobo == $blob
+
+=head2 Functions And Bind Parameters
+
+As of this writing, a SQL that compares a return value of a function
+with a numeric bind value like this doesn't work as you might expect.
+
+ my $sth = $dbh->prepare(q{
+ SELECT bar FROM foo GROUP BY bar HAVING count(*) > ?;
+ });
+ $sth->execute(5);
+
+This is because DBD::SQLite assumes that all the bind values are text
+(and should be quoted) by default. Thus the above statement becomes
+like this while executing:
+
+ SELECT bar FROM foo GROUP BY bar HAVING count(*) > "5";
+
+There are two workarounds for this.
+
+=over 4
+
+=item Use bind_param() explicitly
+
+As shown above in the C<BLOB> section, you can always use
+C<bind_param()> to tell the type of a bind value.
+
+ use DBI qw(:sql_types); # Don't forget this
+
+ my $sth = $dbh->prepare(q{
+ SELECT bar FROM foo GROUP BY bar HAVING count(*) > ?;
+ });
+ $sth->bind_param(1, 5, SQL_INTEGER);
+ $sth->execute();
+
+=item Add zero to make it a number
+
+This is somewhat weird, but works anyway.
+
+ my $sth = $dbh->prepare(q{
+ SELECT bar FROM foo GROUP BY bar HAVING count(*) > (? + 0);
+ });
+ $sth->execute(5);
+
+=back
+
+=head2 Foreign Keys
+
+B<BE PREPARED! WOLVES APPROACH!!>
+
+SQLite has started supporting foreign key constraints since 3.6.19
+(released on Oct 14, 2009; bundled with DBD::SQLite 1.26_05).
+To be exact, SQLite has long been able to parse a schema with foreign
+keys, but the constraints has not been enforced. Now you can issue
+a pragma actually to enable this feature and enforce the constraints.
+
+To do this, issue the following pragma (see below), preferably as
+soon as you connect to a database and you're not in a transaction:
+
+ $dbh->do("PRAGMA foreign_keys = ON");
+
+And you can explicitly disable the feature whenever you like by
+turning the pragma off:
+
+ $dbh->do("PRAGMA foreign_keys = OFF");
+
+As of this writing, this feature is disabled by default by the
+sqlite team, and by us, to secure backward compatibility, as
+this feature may break your applications, and actually broke
+some for us. If you have used a schema with foreign key constraints
+but haven't cared them much and supposed they're always ignored for
+SQLite, be prepared, and B<please do extensive testing to ensure
+that your applications will continue to work when the foreign keys
+support is enabled by default>. It is very likely that the sqlite
+team will turn it default-on in the future, and we plan to do it
+NO LATER THAN they do so.
+
+See L<http://www.sqlite.org/foreignkeys.html> for details.
+
+=head2 Pragma
+
+SQLite has a set of "Pragma"s to modifiy its operation or to query
+for its internal data. These are specific to SQLite and are not
+likely to work with other DBD libraries, but you may find some of
+these are quite useful. DBD::SQLite actually sets some (like
+C<show_datatypes>) for you when you connect to a database.
+See L<http://www.sqlite.org/pragma.html> for details.
+
+=head2 Transactions
+
+DBI/DBD::SQLite's transactions may be a bit confusing. They behave
+differently according to the status of the C<AutoCommit> flag:
+
+=over 4
+
+=item When the AutoCommit flag is on
+
+You're supposed to always use the auto-commit mode, except you
+explicitly begin a transaction, and when the transaction ended,
+you're supposed to go back to the auto-commit mode. To begin a
+transaction, call C<begin_work> method, or issue a C<BEGIN>
+statement. To end it, call C<commit/rollback> methods, or issue
+the corresponding statements.
+
+ $dbh->{AutoCommit} = 1;
+
+ $dbh->begin_work; # or $dbh->do('BEGIN TRANSACTION');
+
+ # $dbh->{AutoCommit} is turned off temporarily during a transaction;
+
+ $dbh->commit; # or $dbh->do('COMMIT');
+
+ # $dbh->{AutoCommit} is turned on again;
+
+=item When the AutoCommit flag is off
+
+You're supposed to always use the transactinal mode, until you
+explicitly turn on the AutoCommit flag. You can explicitly issue
+a C<BEGIN> statement (only when an actual transaction has not
+begun yet) but you're not allowed to call C<begin_work> method
+(if you don't issue a C<BEGIN>, it will be issued internally).
+You can commit or roll it back freely. Another transaction will
+automatically begins if you execute another statement.
+
+ $dbh->{AutoCommit} = 0;
+
+ # $dbh->do('BEGIN TRANSACTION') is not necessary, but possible
+
+ ...
+
+ $dbh->commit; # or $dbh->do('COMMIT');
+
+ # $dbh->{AutoCommit} stays intact;
+
+ $dbh->{AutoCommit} = 1; # ends the transactional mode
+
+=back
+
+This C<AutoCommit> mode is independent from the autocommit mode
+of the internal SQLite library, which always begins by a C<BEGIN>
+statement, and ends by a C<COMMIT> or a <ROLLBACK>.
+
+=head2 Performance
+
+SQLite is fast, very fast. Matt processed my 72MB log file with it,
+inserting the data (400,000+ rows) by using transactions and only
+committing every 1000 rows (otherwise the insertion is quite slow),
+and then performing queries on the data.
+
+Queries like count(*) and avg(bytes) took fractions of a second to
+return, but what surprised him most of all was:
+
+ SELECT url, count(*) as count
+ FROM access_log
+ GROUP BY url
+ ORDER BY count desc
+ LIMIT 20
+
+To discover the top 20 hit URLs on the site (L<http://axkit.org>),
+and it returned within 2 seconds. He was seriously considering
+switching his log analysis code to use this little speed demon!
+
+Oh yeah, and that was with no indexes on the table, on a 400MHz PIII.
+
+For best performance be sure to tune your hdparm settings if you
+are using linux. Also you might want to set:
+
+ PRAGMA default_synchronous = OFF
+
+Which will prevent sqlite from doing fsync's when writing (which
+slows down non-transactional writes significantly) at the expense
+of some peace of mind. Also try playing with the cache_size pragma.
+
+The memory usage of SQLite can also be tuned using the cache_size
+pragma.
+
+ $dbh->do("PRAGMA cache_size = 800000");
+
+The above will allocate 800M for DB cache; the default is 2M.
+Your sweet spot probably lies somewhere in between.
+
+=head1 DRIVER PRIVATE ATTRIBUTES
+
+=head2 Database Handle Attributes
+
+=over 4
+
+=item sqlite_version
+
+Returns the version of the SQLite library which B<DBD::SQLite> is using,
+e.g., "2.8.0". Can only be read.
+
+=item sqlite_unicode
+
+If set to a true value, B<DBD::SQLite> will turn the UTF-8 flag on for all
+text strings coming out of the database (this feature is currently disabled
+for perl < 5.8.5). For more details on the UTF-8 flag see
+L<perlunicode>. The default is for the UTF-8 flag to be turned off.
+
+Also note that due to some bizarreness in SQLite's type system (see
+L<http://www.sqlite.org/datatype3.html>), if you want to retain
+blob-style behavior for B<some> columns under C<< $dbh->{sqlite_unicode} = 1
+>> (say, to store images in the database), you have to state so
+explicitly using the 3-argument form of L<DBI/bind_param> when doing
+updates:
+
+ use DBI qw(:sql_types);
+ $dbh->{sqlite_unicode} = 1;
+ my $sth = $dbh->prepare("INSERT INTO mytable (blobcolumn) VALUES (?)");
+
+ # Binary_data will be stored as is.
+ $sth->bind_param(1, $binary_data, SQL_BLOB);
+
+Defining the column type as C<BLOB> in the DDL is B<not> sufficient.
+
+This attribute was originally named as C<unicode>, and renamed to
+C<sqlite_unicode> for integrity since version 1.26_06. Old C<unicode>
+attribute is still accessible but will be deprecated in the near future.
+
+=back
+
+=head1 METHODS
+
+=head2 table_info
+
+ $sth = $dbh->table_info(undef, $schema, $table, $type, \%attr);
+
+Returns all tables and schemas (databases) as specified in L<DBI/table_info>.
+The schema and table arguments will do a C<LIKE> search. You can specify an
+ESCAPE character by including an 'Escape' attribute in \%attr. The C<$type>
+argument accepts a comma seperated list of the following types 'TABLE',
+'VIEW', 'LOCAL TEMPORARY' and 'SYSTEM TABLE' (by default all are returned).
+Note that a statement handle is returned, and not a direct list of tables.
+
+The following fields are returned:
+
+B<TABLE_CAT>: Always NULL, as SQLite does not have the concept of catalogs.
+
+B<TABLE_SCHEM>: The name of the schema (database) that the table or view is
+in. The default schema is 'main', temporary tables are in 'temp' and other
+databases will be in the name given when the database was attached.
+
+B<TABLE_NAME>: The name of the table or view.
+
+B<TABLE_TYPE>: The type of object returned. Will be one of 'TABLE', 'VIEW',
+'LOCAL TEMPORARY' or 'SYSTEM TABLE'.
+
+=head1 DRIVER PRIVATE METHODS
+
+The following methods can be called via the func() method with a little
+tweak, but the use of func() method is now discouraged by the L<DBI> author
+for various reasons (see DBI's document
+L<http://search.cpan.org/dist/DBI/lib/DBI/DBD.pm#Using_install_method()_to_expose_driver-private_methods>
+for details). So, if you're using L<DBI> >= 1.608, use these C<sqlite_>
+methods. If you need to use an older L<DBI>, you can call these like this:
+
+ $dbh->func( ..., "(method name without sqlite_ prefix)" );
+
+=head2 $dbh->sqlite_last_insert_rowid()
+
+This method returns the last inserted rowid. If you specify an INTEGER PRIMARY
+KEY as the first column in your table, that is the column that is returned.
+Otherwise, it is the hidden ROWID column. See the sqlite docs for details.
+
+Generally you should not be using this method. Use the L<DBI> last_insert_id
+method instead. The usage of this is:
+
+ $h->last_insert_id($catalog, $schema, $table_name, $field_name [, \%attr ])
+
+Running C<$h-E<gt>last_insert_id("","","","")> is the equivalent of running
+C<$dbh-E<gt>sqlite_last_insert_rowid()> directly.
+
+=head2 $dbh->sqlite_busy_timeout()
+
+Retrieve the current busy timeout.
+
+=head2 $dbh->sqlite_busy_timeout( $ms )
+
+Set the current busy timeout. The timeout is in milliseconds.
+
+=head2 $dbh->sqlite_create_function( $name, $argc, $code_ref )
+
+This method will register a new function which will be useable in an SQL
+query. The method's parameters are:
+
+=over
+
+=item $name
+
+The name of the function. This is the name of the function as it will
+be used from SQL.
+
+=item $argc
+
+The number of arguments taken by the function. If this number is -1,
+the function can take any number of arguments.
+
+=item $code_ref
+
+This should be a reference to the function's implementation.
+
+=back
+
+For example, here is how to define a now() function which returns the
+current number of seconds since the epoch:
+
+ $dbh->sqlite_create_function( 'now', 0, sub { return time } );
+
+After this, it could be use from SQL as:
+
+ INSERT INTO mytable ( now() );
+
+=head3 REGEXP function
+
+SQLite includes syntactic support for an infix operator 'REGEXP', but
+without any implementation. The C<DBD::SQLite> driver
+automatically registers an implementation that performs standard
+perl regular expression matching, using current locale. So for example
+you can search for words starting with an 'A' with a query like
+
+ SELECT * from table WHERE column REGEXP '\bA\w+'
+
+If you want case-insensitive searching, use perl regex flags, like this :
+
+ SELECT * from table WHERE column REGEXP '(?i:\bA\w+)'
+
+The default REGEXP implementation can be overriden through the
+C<create_function> API described above.
+
+Note that regexp matching will B<not> use SQLite indices, but will iterate
+over all rows, so it could be quite costly in terms of performance.
+
+=head2 $dbh->sqlite_create_collation( $name, $code_ref )
+
+This method manually registers a new function which will be useable in an SQL
+query as a COLLATE option for sorting. Such functions can also be registered
+automatically on demand: see section L</"COLLATION FUNCTIONS"> below.
+
+The method's parameters are:
+
+=over
+
+=item $name
+
+The name of the function exposed to SQL.
+
+=item $code_ref
+
+Reference to the function's implementation.
+The driver will check that this is a proper sorting function.
+
+=back
+
+=head2 $dbh->sqlite_collation_needed( $code_ref )
+
+This method manually registers a callback function that will
+be invoked whenever an undefined collation sequence is required
+from an SQL statement. The callback is invoked as
+
+ $code_ref->($dbh, $collation_name)
+
+and should register the desired collation using
+L</"sqlite_create_collation">.
+
+An initial callback is already registered by C<DBD::SQLite>,
+so for most common cases it will be simpler to just
+add your collation sequences in the C<%DBD::SQLite::COLLATION>
+hash (see section L</"COLLATION FUNCTIONS"> below).
+
+=head2 $dbh->sqlite_create_aggregate( $name, $argc, $pkg )
+
+This method will register a new aggregate function which can then be used
+from SQL. The method's parameters are:
+
+=over
+
+=item $name
+
+The name of the aggregate function, this is the name under which the
+function will be available from SQL.
+
+=item $argc
+
+This is an integer which tells the SQL parser how many arguments the
+function takes. If that number is -1, the function can take any number
+of arguments.
+
+=item $pkg
+
+This is the package which implements the aggregator interface.
+
+=back
+
+The aggregator interface consists of defining three methods:
+
+=over
+
+=item new()
+
+This method will be called once to create an object which should
+be used to aggregate the rows in a particular group. The step() and
+finalize() methods will be called upon the reference return by
+the method.
+
+=item step(@_)
+
+This method will be called once for each row in the aggregate.
+
+=item finalize()
+
+This method will be called once all rows in the aggregate were
+processed and it should return the aggregate function's result. When
+there is no rows in the aggregate, finalize() will be called right
+after new().
+
+=back
+
+Here is a simple aggregate function which returns the variance
+(example adapted from pysqlite):
+
+ package variance;
+
+ sub new { bless [], shift; }
+
+ sub step {
+ my ( $self, $value ) = @_;
+
+ push @$self, $value;
+ }
+
+ sub finalize {
+ my $self = $_[0];
+
+ my $n = @$self;
+
+ # Variance is NULL unless there is more than one row
+ return undef unless $n || $n == 1;
+
+ my $mu = 0;
+ foreach my $v ( @$self ) {
+ $mu += $v;
+ }
+ $mu /= $n;
+
+ my $sigma = 0;
+ foreach my $v ( @$self ) {
+ $sigma += ($x - $mu)**2;
+ }
+ $sigma = $sigma / ($n - 1);
+
+ return $sigma;
+ }
+
+ $dbh->sqlite_create_aggregate( "variance", 1, 'variance' );
+
+The aggregate function can then be used as:
+
+ SELECT group_name, variance(score)
+ FROM results
+ GROUP BY group_name;
+
+For more examples, see the L<DBD::SQLite::Cookbook>.
+
+=head2 $dbh->sqlite_progress_handler( $n_opcodes, $code_ref )
+
+This method registers a handler to be invoked periodically during long
+running calls to SQLite.
+
+An example use for this interface is to keep a GUI updated during a
+large query. The parameters are:
+
+=over
+
+=item $n_opcodes
+
+The progress handler is invoked once for every C<$n_opcodes>
+virtual machine opcodes in SQLite.
+
+=item $code_ref
+
+Reference to the handler subroutine. If the progress handler returns
+non-zero, the SQLite operation is interrupted. This feature can be used to
+implement a "Cancel" button on a GUI dialog box.
+
+Set this argument to C<undef> if you want to unregister a previous
+progress handler.
+
+=back
+
+=head2 $dbh->sqlite_commit_hook( $code_ref )
+
+This method registers a callback function to be invoked whenever a
+transaction is committed. Any callback set by a previous call to
+C<sqlite_commit_hook> is overridden. A reference to the previous
+callback (if any) is returned. Registering an C<undef> disables the
+callback.
+
+When the commit hook callback returns zero, the commit operation is
+allowed to continue normally. If the callback returns non-zero, then
+the commit is converted into a rollback (in that case, any attempt to
+I<explicitly> call C<< $dbh->rollback() >> afterwards would yield an
+error).
+
+=head2 $dbh->sqlite_rollback_hook( $code_ref )
+
+This method registers a callback function to be invoked whenever a
+transaction is rolled back. Any callback set by a previous call to
+C<sqlite_rollback_hook> is overridden. A reference to the previous
+callback (if any) is returned. Registering an C<undef> disables the
+callback.
+
+=head2 $dbh->sqlite_update_hook( $code_ref )
+
+This method registers a callback function to be invoked whenever a row
+is updated, inserted or deleted. Any callback set by a previous call to
+C<sqlite_update_hook> is overridden. A reference to the previous
+callback (if any) is returned. Registering an C<undef> disables the
+callback.
+
+The callback will be called as
+
+ $code_ref->($action_code, $database, $table, $rowid)
+
+where
+
+=over
+
+=item $action_code
+
+is an integer equal to either C<DBD::SQLite::INSERT>,
+C<DBD::SQLite::DELETE> or C<DBD::SQLite::UPDATE>
+(see L</"Action Codes">);
+
+=item $database
+
+is the name of the database containing the affected row;
+
+=item $table
+
+is the name of the table containing the affected row;
+
+=item $rowid
+
+is the unique 64-bit signed integer key of the affected row within that table.
+
+=back
+
+=head2 $dbh->sqlite_set_authorizer( $code_ref )
+
+This method registers an authorizer callback to be invoked whenever
+SQL statements are being compiled by the L<DBI/prepare> method. The
+authorizer callback should return C<DBD::SQLite::OK> to allow the
+action, C<DBD::SQLite::IGNORE> to disallow the specific action but
+allow the SQL statement to continue to be compiled, or
+C<DBD::SQLite::DENY> to cause the entire SQL statement to be rejected
+with an error. If the authorizer callback returns any other value,
+then then C<prepare> call that triggered the authorizer will fail with
+an error message.
+
+An authorizer is used when preparing SQL statements from an untrusted
+source, to ensure that the SQL statements do not try to access data
+they are not allowed to see, or that they do not try to execute
+malicious statements that damage the database. For example, an
+application may allow a user to enter arbitrary SQL queries for
+evaluation by a database. But the application does not want the user
+to be able to make arbitrary changes to the database. An authorizer
+could then be put in place while the user-entered SQL is being
+prepared that disallows everything except SELECT statements.
+
+The callback will be called as
+
+ $code_ref->($action_code, $string1, $string2, $database, $trigger_or_view)
+
+where
+
+=over
+
+=item $action_code
+
+is an integer that specifies what action is being authorized
+(see L</"Action Codes">).
+
+=item $string1, $string2
+
+are strings that depend on the action code
+(see L</"Action Codes">).
+
+=item $database
+
+is the name of the database (C<main>, C<temp>, etc.) if applicable.
+
+=item $trigger_or_view
+
+is the name of the inner-most trigger or view that is responsible for
+the access attempt, or C<undef> if this access attempt is directly from
+top-level SQL code.
+
+=back
+
+=head2 $dbh->sqlite_backup_from_file( $filename )
+
+This method accesses the SQLite Online Backup API, and will take a backup of
+the named database file, copying it to, and overwriting, your current database
+connection. This can be particularly handy if your current connection is to the
+special :memory: database, and you wish to populate it from an existing DB.
+
+=head2 $dbh->sqlite_backup_to_file( $filename )
+
+This method accesses the SQLite Online Backup API, and will take a backup of
+the currently connected database, and write it out to the named file.
+
+=head2 $dbh->sqlite_enable_load_extension( $bool )
+
+Calling this method with a true value enables loading (external)
+sqlite3 extensions. After the call, you can load extensions like this:
+
+ $dbh->sqlite_enable_load_extension(1);
+ $sth = $dbh->prepare("select load_extension('libsqlitefunctions.so')")
+ or die "Cannot prepare: " . $dbh->errstr();
+
+=head1 DRIVER CONSTANTS
+
+A subset of SQLite C constants are made available to Perl,
+because they may be needed when writing
+hooks or authorizer callbacks. For accessing such constants,
+the C<DBD::Sqlite> module must be explicitly C<use>d at compile
+time. For example, an authorizer that forbids any
+DELETE operation would be written as follows :
+
+ use DBD::SQLite;
+ $dbh->sqlite_set_authorizer(sub {
+ my $action_code = shift;
+ return $action_code == DBD::SQLite::DELETE ? DBD::SQLite::DENY
+ : DBD::SQLite::OK;
+ });
+
+The list of constants implemented in C<DBD::SQLite> is given
+below; more information can be found ad
+at L<http://www.sqlite.org/c3ref/constlist.html>.
+
+=head2 Authorizer Return Codes
+
+ OK
+ DENY
+ IGNORE
+
+=head2 Action Codes
+
+The L</set_authorizer> method registers a callback function that is
+invoked to authorize certain SQL statement actions. The first
+parameter to the callback is an integer code that specifies what
+action is being authorized. The second and third parameters to the
+callback are strings, the meaning of which varies according to the
+action code. Below is the list of action codes, together with their
+associated strings.
+
+ # constant string1 string2
+ # ======== ======= =======
+ CREATE_INDEX Index Name Table Name
+ CREATE_TABLE Table Name undef
+ CREATE_TEMP_INDEX Index Name Table Name
+ CREATE_TEMP_TABLE Table Name undef
+ CREATE_TEMP_TRIGGER Trigger Name Table Name
+ CREATE_TEMP_VIEW View Name undef
+ CREATE_TRIGGER Trigger Name Table Name
+ CREATE_VIEW View Name undef
+ DELETE Table Name undef
+ DROP_INDEX Index Name Table Name
+ DROP_TABLE Table Name undef
+ DROP_TEMP_INDEX Index Name Table Name
+ DROP_TEMP_TABLE Table Name undef
+ DROP_TEMP_TRIGGER Trigger Name Table Name
+ DROP_TEMP_VIEW View Name undef
+ DROP_TRIGGER Trigger Name Table Name
+ DROP_VIEW View Name undef
+ INSERT Table Name undef
+ PRAGMA Pragma Name 1st arg or undef
+ READ Table Name Column Name
+ SELECT undef undef
+ TRANSACTION Operation undef
+ UPDATE Table Name Column Name
+ ATTACH Filename undef
+ DETACH Database Name undef
+ ALTER_TABLE Database Name Table Name
+ REINDEX Index Name undef
+ ANALYZE Table Name undef
+ CREATE_VTABLE Table Name Module Name
+ DROP_VTABLE Table Name Module Name
+ FUNCTION undef Function Name
+ SAVEPOINT Operation Savepoint Name
+
+=head1 COLLATION FUNCTIONS
+
+=head2 Definition
+
+SQLite v3 provides the ability for users to supply arbitrary
+comparison functions, known as user-defined "collation sequences" or
+"collating functions", to be used for comparing two text values.
+L<http://www.sqlite.org/datatype3.html#collation>
+explains how collations are used in various SQL expressions.
+
+=head2 Builtin collation sequences
+
+The following collation sequences are builtin within SQLite :
+
+=over
+
+=item B<BINARY>
+
+Compares string data using memcmp(), regardless of text encoding.
+
+=item B<NOCASE>
+
+The same as binary, except the 26 upper case characters of ASCII are
+folded to their lower case equivalents before the comparison is
+performed. Note that only ASCII characters are case folded. SQLite
+does not attempt to do full UTF case folding due to the size of the
+tables required.
+
+=item B<RTRIM>
+
+The same as binary, except that trailing space characters are ignored.
+
+=back
+
+In addition, C<DBD::SQLite> automatically installs the
+following collation sequences :
+
+=over
+
+=item B<perl>
+
+corresponds to the Perl C<cmp> operator
+
+=item B<perllocale>
+
+Perl C<cmp> operator, in a context where C<use locale> is activated.
+
+=back
+
+=head2 Usage
+
+You can write for example
+
+ CREATE TABLE foo(
+ txt1 COLLATE perl,
+ txt2 COLLATE perllocale,
+ txt3 COLLATE nocase
+ )
+
+or
+
+ SELECT * FROM foo ORDER BY name COLLATE perllocale
+
+=head2 Unicode handling
+
+If the attribute C<< $dbh->{sqlite_unicode} >> is set, strings coming from
+the database and passed to the collation function will be properly
+tagged with the utf8 flag; but this only works if the
+C<sqlite_unicode> attribute is set B<before> the first call to
+a perl collation sequence . The recommended way to activate unicode
+is to set the parameter at connection time :
+
+ my $dbh = DBI->connect(
+ "dbi:SQLite:dbname=foo", "", "",
+ {
+ RaiseError => 1,
+ sqlite_unicode => 1,
+ }
+ );
+
+=head2 Adding user-defined collations
+
+The native SQLite API for adding user-defined collations is
+exposed through methods L</"sqlite_create_collation"> and
+L</"sqlite_collation_needed">.
+
+To avoid calling these functions every time a C<$dbh> handle is
+created, C<DBD::SQLite> offers a simpler interface through the
+C<%DBD::SQLite::COLLATION> hash : just insert your own
+collation functions in that hash, and whenever an unknown
+collation name is encountered in SQL, the appropriate collation
+function will be loaded on demand from the hash. For example,
+here is a way to sort text values regardless of their accented
+characters :
+
+ use DBD::SQLite;
+ $DBD::SQLite::COLLATION{no_accents} = sub {
+ my ( $a, $b ) = map lc, @_;
+ tr[àâáäåãçðèêéëìîíïñòôóöõøùûúüý]
+ [aaaaaacdeeeeiiiinoooooouuuuy] for $a, $b;
+ $a cmp $b;
+ };
+ my $dbh = DBI->connect("dbi:SQLite:dbname=dbfile");
+ my $sql = "SELECT ... FROM ... ORDER BY ... COLLATE no_accents");
+ my $rows = $dbh->selectall_arrayref($sql);
+
+The builtin C<perl> or C<perllocale> collations are predefined
+in that same hash.
+
+The COLLATION hash is a global registry within the current process;
+hence there is a risk of undesired side-effects. Therefore, to
+prevent action at distance, the hash is implemented as a "write-only"
+hash, that will happily accept new entries, but will raise an
+exception if any attempt is made to override or delete a existing
+entry (including the builtin C<perl> and C<perllocale>).
+
+If you really, really need to change or delete an entry, you can
+always grab the tied object underneath C<%DBD::SQLite::COLLATION> ---
+but don't do that unless you really know what you are doing. Also
+observe that changes in the global hash will not modify existing
+collations in existing database handles: it will only affect new
+I<requests> for collations. In other words, if you want to change
+the behaviour of a collation within an existing C<$dbh>, you
+need to call the L</create_collation> method directly.
+
+=head1 TO DO
+
+The following items remain to be done.
+
+=head2 Warnings Upgrade
+
+We currently use a horridly hacky method to issue and suppress warnings.
+It suffices for now, but just barely.
+
+Migrate all of the warning code to use the recommended L<DBI> warnings.
+
+=head2 Leak Detection
+
+Implement one or more leak detection tests that only run during
+AUTOMATED_TESTING and RELEASE_TESTING and validate that none of the C
+code we work with leaks.
+
+=head2 Stream API for Blobs
+
+Reading/writing into blobs using C<sqlite2_blob_open> / C<sqlite2_blob_close>.
+
+=head2 Flags for sqlite3_open_v2
+
+Support the full API of sqlite3_open_v2 (flags for opening the file).
+
+=head1 SUPPORT
+
+Bugs should be reported via the CPAN bug tracker at
+
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=DBD-SQLite>
+
+Note that bugs of bundled sqlite library (i.e. bugs in C<sqlite3.[ch]>)
+should be reported to the sqlite developers at sqlite.org via their bug
+tracker or via their mailing list.
+
+=head1 AUTHORS
+
+Matt Sergeant E<lt>matt@sergeant.orgE<gt>
+
+Francis J. Lacoste E<lt>flacoste@logreport.orgE<gt>
+
+Wolfgang Sourdeau E<lt>wolfgang@logreport.orgE<gt>
+
+Adam Kennedy E<lt>adamk@cpan.orgE<gt>
+
+Max Maischein E<lt>corion@cpan.orgE<gt>
+
+Laurent Dami E<lt>dami@cpan.orgE<gt>
+
+Kenichi Ishigaki E<lt>ishigaki@cpan.orgE<gt>
+
+=head1 COPYRIGHT
+
+The bundled SQLite code in this distribution is Public Domain.
+
+DBD::SQLite is copyright 2002 - 2007 Matt Sergeant.
+
+Some parts copyright 2008 Francis J. Lacoste.
+
+Some parts copyright 2008 Wolfgang Sourdeau.
+
+Some parts copyright 2008 - 2010 Adam Kennedy.
+
+Some parts derived from L<DBD::SQLite::Amalgamation>
+copyright 2008 Audrey Tang.
+
+This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+The full text of the license can be found in the
+LICENSE file included with this module.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/SQLite/Cookbook.pod b/Master/tlpkg/tlperl.straw/lib/DBD/SQLite/Cookbook.pod
new file mode 100755
index 00000000000..bdf6260b5b0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/SQLite/Cookbook.pod
@@ -0,0 +1,168 @@
+=head1 NAME
+
+DBD::SQLite::Cookbook - The DBD::SQLite Cookbook
+
+=head1 DESCRIPTION
+
+This is the L<DBD::SQLite> cookbook.
+
+It is intended to provide a place to keep a variety of functions and
+formals for use in callback APIs in L<DBD::SQLite>.
+
+=head2 Variance
+
+This is a simple aggregate function which returns a variance. It is
+adapted from an example implementation in pysqlite.
+
+ package variance;
+
+ sub new { bless [], shift; }
+
+ sub step {
+ my ( $self, $value ) = @_;
+
+ push @$self, $value;
+ }
+
+ sub finalize {
+ my $self = $_[0];
+
+ my $n = @$self;
+
+ # Variance is NULL unless there is more than one row
+ return undef unless $n || $n == 1;
+
+ my $mu = 0;
+ foreach my $v ( @$self ) {
+ $mu += $v;
+ }
+ $mu /= $n;
+
+ my $sigma = 0;
+ foreach my $v ( @$self ) {
+ $sigma += ($x - $mu)**2;
+ }
+ $sigma = $sigma / ($n - 1);
+
+ return $sigma;
+ }
+
+ # NOTE: If you use an older DBI (< 1.608),
+ # use $dbh->func(..., "create_aggregate") instead.
+ $dbh->sqlite_create_aggregate( "variance", 1, 'variance' );
+
+The function can then be used as:
+
+ SELECT group_name, variance(score)
+ FROM results
+ GROUP BY group_name;
+
+=head2 Variance (Memory Efficient)
+
+A more efficient variance function, optimized for memory usage at the
+expense of precision:
+
+ package variance2;
+
+ my $sum = 0;
+ my $count = 0;
+ my %hash;
+
+ sub new { bless [], shift; }
+
+ sub step {
+ my ( $self, $value ) = @_;
+
+ # by truncating and hashing, we can comsume many more data points
+ $value = int($value); # change depending on need for precision
+ # use sprintf for arbitrary fp precision
+ if (defined $hash{$value}) {
+ $hash{$value}++;
+ } else {
+ $hash{$value} = 1;
+ }
+ $sum += $value;
+ $count++;
+ }
+
+ sub finalize {
+ my $self = $_[0];
+
+ # Variance is NULL unless there is more than one row
+ return undef unless $count > 1;
+
+ # calculate avg
+ my $mu = $sum / $count;
+
+ my $sigma = 0;
+ foreach my $h (keys %hash) {
+ $sigma += (($h - $mu)**2) * $hash{$h};
+ }
+ $sigma = $sigma / ($count - 1);
+
+ return $sigma;
+ }
+
+The function can then be used as:
+
+ SELECT group_name, variance2(score)
+ FROM results
+ GROUP BY group_name;
+
+=head2 Variance (Highly Scalable)
+
+A third variable implementation, designed for arbitrarily large data sets:
+
+ package variance;
+
+ my $mu = 0;
+ my $count = 0;
+ my $S = 0
+
+ sub new { bless [], shift; }
+
+ sub step {
+ my ( $self, $value ) = @_;
+ $count++;
+ $delta = $value - $mu;
+ $mu = $mu + $delta/$count
+ $S = $S + $delta*($value - $mu);
+ }
+
+ sub finalize {
+ my $self = $_[0];
+ return $S / ($count - 1);
+ }
+
+The function can then be used as:
+
+ SELECT group_name, variance3(score)
+ FROM results
+ GROUP BY group_name;
+
+=head1 SUPPORT
+
+Bugs should be reported via the CPAN bug tracker at
+
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=DBD-SQLite>
+
+=head1 TO DO
+
+* Add more and varied cookbook recipes, until we have enough to
+turn them into a seperate CPAN distribution.
+
+* Create a series of tests scripts that validate the cookbook recipies.
+
+=head1 AUTHOR
+
+Adam Kennedy E<lt>adamk@cpan.orgE<gt>
+
+=head1 COPYRIGHT
+
+Copyright 2009 Adam Kennedy.
+
+This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+The full text of the license can be found in the
+LICENSE file included with this module.
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/Sponge.pm b/Master/tlpkg/tlperl.straw/lib/DBD/Sponge.pm
new file mode 100755
index 00000000000..2413bc08506
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/Sponge.pm
@@ -0,0 +1,305 @@
+{
+ package DBD::Sponge;
+
+ require DBI;
+ require Carp;
+
+ our @EXPORT = qw(); # Do NOT @EXPORT anything.
+ our $VERSION = sprintf("12.%06d", q$Revision: 10002 $ =~ /(\d+)/o);
+
+
+# $Id: Sponge.pm 10002 2007-09-26 21:03:25Z timbo $
+#
+# Copyright (c) 1994-2003 Tim Bunce Ireland
+#
+# You may distribute under the terms of either the GNU General Public
+# License or the Artistic License, as specified in the Perl README file.
+
+ $drh = undef; # holds driver handle once initialised
+ my $methods_already_installed;
+
+ sub driver{
+ return $drh if $drh;
+
+ DBD::Sponge::db->install_method("sponge_test_installed_method")
+ unless $methods_already_installed++;
+
+ my($class, $attr) = @_;
+ $class .= "::dr";
+ ($drh) = DBI::_new_drh($class, {
+ 'Name' => 'Sponge',
+ 'Version' => $VERSION,
+ 'Attribution' => "DBD::Sponge $VERSION (fake cursor driver) by Tim Bunce",
+ });
+ $drh;
+ }
+
+ sub CLONE {
+ undef $drh;
+ }
+}
+
+
+{ package DBD::Sponge::dr; # ====== DRIVER ======
+ $imp_data_size = 0;
+ # we use default (dummy) connect method
+}
+
+
+{ package DBD::Sponge::db; # ====== DATABASE ======
+ $imp_data_size = 0;
+ use strict;
+
+ sub prepare {
+ my($dbh, $statement, $attribs) = @_;
+ my $rows = delete $attribs->{'rows'}
+ or return $dbh->set_err($DBI::stderr,"No rows attribute supplied to prepare");
+ my ($outer, $sth) = DBI::_new_sth($dbh, {
+ 'Statement' => $statement,
+ 'rows' => $rows,
+ (map { exists $attribs->{$_} ? ($_=>$attribs->{$_}) : () }
+ qw(execute_hook)
+ ),
+ });
+ if (my $behave_like = $attribs->{behave_like}) {
+ $outer->{$_} = $behave_like->{$_}
+ foreach (qw(RaiseError PrintError HandleError ShowErrorStatement));
+ }
+
+ if ($statement =~ /^\s*insert\b/) { # very basic, just for testing execute_array()
+ $sth->{is_insert} = 1;
+ my $NUM_OF_PARAMS = $attribs->{NUM_OF_PARAMS}
+ or return $dbh->set_err($DBI::stderr,"NUM_OF_PARAMS not specified for INSERT statement");
+ $sth->STORE('NUM_OF_PARAMS' => $attribs->{NUM_OF_PARAMS} );
+ }
+ else { #assume select
+
+ # we need to set NUM_OF_FIELDS
+ my $numFields;
+ if ($attribs->{'NUM_OF_FIELDS'}) {
+ $numFields = $attribs->{'NUM_OF_FIELDS'};
+ } elsif ($attribs->{'NAME'}) {
+ $numFields = @{$attribs->{NAME}};
+ } elsif ($attribs->{'TYPE'}) {
+ $numFields = @{$attribs->{TYPE}};
+ } elsif (my $firstrow = $rows->[0]) {
+ $numFields = scalar @$firstrow;
+ } else {
+ return $dbh->set_err($DBI::stderr, 'Cannot determine NUM_OF_FIELDS');
+ }
+ $sth->STORE('NUM_OF_FIELDS' => $numFields);
+ $sth->{NAME} = $attribs->{NAME}
+ || [ map { "col$_" } 1..$numFields ];
+ $sth->{TYPE} = $attribs->{TYPE}
+ || [ (DBI::SQL_VARCHAR()) x $numFields ];
+ $sth->{PRECISION} = $attribs->{PRECISION}
+ || [ map { length($sth->{NAME}->[$_]) } 0..$numFields -1 ];
+ $sth->{SCALE} = $attribs->{SCALE}
+ || [ (0) x $numFields ];
+ $sth->{NULLABLE} = $attribs->{NULLABLE}
+ || [ (2) x $numFields ];
+ }
+
+ $outer;
+ }
+
+ sub type_info_all {
+ my ($dbh) = @_;
+ my $ti = [
+ { TYPE_NAME => 0,
+ DATA_TYPE => 1,
+ PRECISION => 2,
+ LITERAL_PREFIX => 3,
+ LITERAL_SUFFIX => 4,
+ CREATE_PARAMS => 5,
+ NULLABLE => 6,
+ CASE_SENSITIVE => 7,
+ SEARCHABLE => 8,
+ UNSIGNED_ATTRIBUTE=> 9,
+ MONEY => 10,
+ AUTO_INCREMENT => 11,
+ LOCAL_TYPE_NAME => 12,
+ MINIMUM_SCALE => 13,
+ MAXIMUM_SCALE => 14,
+ },
+ [ 'VARCHAR', DBI::SQL_VARCHAR(), undef, "'","'", undef, 0, 1, 1, 0, 0,0,undef,0,0 ],
+ ];
+ return $ti;
+ }
+
+ sub FETCH {
+ my ($dbh, $attrib) = @_;
+ # In reality this would interrogate the database engine to
+ # either return dynamic values that cannot be precomputed
+ # or fetch and cache attribute values too expensive to prefetch.
+ return 1 if $attrib eq 'AutoCommit';
+ # else pass up to DBI to handle
+ return $dbh->SUPER::FETCH($attrib);
+ }
+
+ sub STORE {
+ my ($dbh, $attrib, $value) = @_;
+ # would normally validate and only store known attributes
+ # else pass up to DBI to handle
+ if ($attrib eq 'AutoCommit') {
+ return 1 if $value; # is already set
+ Carp::croak("Can't disable AutoCommit");
+ }
+ return $dbh->SUPER::STORE($attrib, $value);
+ }
+
+ sub sponge_test_installed_method {
+ my ($dbh, @args) = @_;
+ return $dbh->set_err(42, "not enough parameters") unless @args >= 2;
+ return \@args;
+ }
+}
+
+
+{ package DBD::Sponge::st; # ====== STATEMENT ======
+ $imp_data_size = 0;
+ use strict;
+
+ sub execute {
+ my $sth = shift;
+
+ # hack to support ParamValues (when not using bind_param)
+ $sth->{ParamValues} = (@_) ? { map { $_ => $_[$_-1] } 1..@_ } : undef;
+
+ if (my $hook = $sth->{execute_hook}) {
+ &$hook($sth, @_) or return;
+ }
+
+ if ($sth->{is_insert}) {
+ my $row;
+ $row = (@_) ? [ @_ ] : die "bind_param not supported yet" ;
+ my $NUM_OF_PARAMS = $sth->{NUM_OF_PARAMS};
+ return $sth->set_err($DBI::stderr, @$row." values bound (@$row) but $NUM_OF_PARAMS expected")
+ if @$row != $NUM_OF_PARAMS;
+ { local $^W; $sth->trace_msg("inserting (@$row)\n"); }
+ push @{ $sth->{rows} }, $row;
+ }
+ else { # mark select sth as Active
+ $sth->STORE(Active => 1);
+ }
+ # else do nothing for select as data is already in $sth->{rows}
+ return 1;
+ }
+
+ sub fetch {
+ my ($sth) = @_;
+ my $row = shift @{$sth->{'rows'}};
+ unless ($row) {
+ $sth->STORE(Active => 0);
+ return undef;
+ }
+ return $sth->_set_fbav($row);
+ }
+ *fetchrow_arrayref = \&fetch;
+
+ sub FETCH {
+ my ($sth, $attrib) = @_;
+ # would normally validate and only fetch known attributes
+ # else pass up to DBI to handle
+ return $sth->SUPER::FETCH($attrib);
+ }
+
+ sub STORE {
+ my ($sth, $attrib, $value) = @_;
+ # would normally validate and only store known attributes
+ # else pass up to DBI to handle
+ return $sth->SUPER::STORE($attrib, $value);
+ }
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+DBD::Sponge - Create a DBI statement handle from Perl data
+
+=head1 SYNOPSIS
+
+ my $sponge = DBI->connect("dbi:Sponge:","","",{ RaiseError => 1 });
+ my $sth = $sponge->prepare($statement, {
+ rows => $data,
+ NAME => $names,
+ %attr
+ }
+ );
+
+=head1 DESCRIPTION
+
+DBD::Sponge is useful for making a Perl data structure accessible through a
+standard DBI statement handle. This may be useful to DBD module authors who
+need to transform data in this way.
+
+=head1 METHODS
+
+=head2 connect()
+
+ my $sponge = DBI->connect("dbi:Sponge:","","",{ RaiseError => 1 });
+
+Here's a sample syntax for creating a database handle for the Sponge driver.
+No username and password are needed.
+
+=head2 prepare()
+
+ my $sth = $sponge->prepare($statement, {
+ rows => $data,
+ NAME => $names,
+ %attr
+ }
+ );
+
+=over 4
+
+=item *
+
+The C<$statement> here is an arbitrary statement or name you want
+to provide as identity of your data. If you're using DBI::Profile
+it will appear in the profile data.
+
+Generally it's expected that you are preparing a statement handle
+as if a C<select> statement happened.
+
+=item *
+
+C<$data> is a reference to the data you are providing, given as an array of arrays.
+
+=item *
+
+C<$names> is a reference an array of column names for the C<$data> you are providing.
+The number and order should match the number and ordering of the C<$data> columns.
+
+=item *
+
+C<%attr> is a hash of other standard DBI attributes that you might pass to a prepare statement.
+
+Currently only NAME, TYPE, and PRECISION are supported.
+
+=back
+
+=head1 BUGS
+
+Using this module to prepare INSERT-like statements is not currently documented.
+
+=head1 AUTHOR AND COPYRIGHT
+
+This module is Copyright (c) 2003 Tim Bunce
+
+Documentation initially written by Mark Stosberg
+
+The DBD::Sponge module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. In particular permission
+is granted to Tim Bunce for distributing this as a part of the DBI.
+
+=head1 SEE ALSO
+
+L<DBI>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/mysql.pm b/Master/tlpkg/tlperl.straw/lib/DBD/mysql.pm
new file mode 100755
index 00000000000..d961d08baf0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/mysql.pm
@@ -0,0 +1,1939 @@
+# -*- cperl -*-
+
+package DBD::mysql;
+use strict;
+use vars qw(@ISA $VERSION $err $errstr $drh);
+
+use DBI ();
+use DynaLoader();
+use Carp ();
+@ISA = qw(DynaLoader);
+
+$VERSION = '4.012';
+
+bootstrap DBD::mysql $VERSION;
+
+
+$err = 0; # holds error code for DBI::err
+$errstr = ""; # holds error string for DBI::errstr
+$drh = undef; # holds driver handle once initialised
+
+sub driver{
+ return $drh if $drh;
+ my($class, $attr) = @_;
+
+ $class .= "::dr";
+
+ # not a 'my' since we use it above to prevent multiple drivers
+ $drh = DBI::_new_drh($class, { 'Name' => 'mysql',
+ 'Version' => $VERSION,
+ 'Err' => \$DBD::mysql::err,
+ 'Errstr' => \$DBD::mysql::errstr,
+ 'Attribution' => 'DBD::mysql by Patrick Galbraith'
+ });
+
+ $drh;
+}
+
+sub CLONE {
+ undef $drh;
+}
+
+sub _OdbcParse($$$) {
+ my($class, $dsn, $hash, $args) = @_;
+ my($var, $val);
+ if (!defined($dsn)) {
+ return;
+ }
+ while (length($dsn)) {
+ if ($dsn =~ /([^:;]*)[:;](.*)/) {
+ $val = $1;
+ $dsn = $2;
+ } else {
+ $val = $dsn;
+ $dsn = '';
+ }
+ if ($val =~ /([^=]*)=(.*)/) {
+ $var = $1;
+ $val = $2;
+ if ($var eq 'hostname' || $var eq 'host') {
+ $hash->{'host'} = $val;
+ } elsif ($var eq 'db' || $var eq 'dbname') {
+ $hash->{'database'} = $val;
+ } else {
+ $hash->{$var} = $val;
+ }
+ } else {
+ foreach $var (@$args) {
+ if (!defined($hash->{$var})) {
+ $hash->{$var} = $val;
+ last;
+ }
+ }
+ }
+ }
+}
+
+sub _OdbcParseHost ($$) {
+ my($class, $dsn) = @_;
+ my($hash) = {};
+ $class->_OdbcParse($dsn, $hash, ['host', 'port']);
+ ($hash->{'host'}, $hash->{'port'});
+}
+
+sub AUTOLOAD {
+ my ($meth) = $DBD::mysql::AUTOLOAD;
+ my ($smeth) = $meth;
+ $smeth =~ s/(.*)\:\://;
+
+ my $val = constant($smeth, @_ ? $_[0] : 0);
+ if ($! == 0) { eval "sub $meth { $val }"; return $val; }
+
+ Carp::croak "$meth: Not defined";
+}
+
+1;
+
+
+package DBD::mysql::dr; # ====== DRIVER ======
+use strict;
+use DBI qw(:sql_types);
+use DBI::Const::GetInfoType;
+
+sub connect {
+ my($drh, $dsn, $username, $password, $attrhash) = @_;
+ my($port);
+ my($cWarn);
+ my $connect_ref= { 'Name' => $dsn };
+ my $dbi_imp_data;
+
+ # Avoid warnings for undefined values
+ $username ||= '';
+ $password ||= '';
+ $attrhash ||= {};
+
+ # create a 'blank' dbh
+ my($this, $privateAttrHash) = (undef, $attrhash);
+ $privateAttrHash = { %$privateAttrHash,
+ 'Name' => $dsn,
+ 'user' => $username,
+ 'password' => $password
+ };
+
+ DBD::mysql->_OdbcParse($dsn, $privateAttrHash,
+ ['database', 'host', 'port']);
+
+
+ if ($DBI::VERSION >= 1.49)
+ {
+ $dbi_imp_data = delete $attrhash->{dbi_imp_data};
+ $connect_ref->{'dbi_imp_data'} = $dbi_imp_data;
+ }
+
+ if (!defined($this = DBI::_new_dbh($drh,
+ $connect_ref,
+ $privateAttrHash)))
+ {
+ return undef;
+ }
+
+ # Call msqlConnect func in mSQL.xs file
+ # and populate internal handle data.
+ DBD::mysql::db::_login($this, $dsn, $username, $password)
+ or $this = undef;
+
+ if ($this && ($ENV{MOD_PERL} || $ENV{GATEWAY_INTERFACE})) {
+ $this->{mysql_auto_reconnect} = 1;
+ }
+ $this;
+}
+
+sub data_sources {
+ my($self) = shift;
+ my($attributes) = shift;
+ my($host, $port, $user, $password) = ('', '', '', '');
+ if ($attributes) {
+ $host = $attributes->{host} || '';
+ $port = $attributes->{port} || '';
+ $user = $attributes->{user} || '';
+ $password = $attributes->{password} || '';
+ }
+ my(@dsn) = $self->func($host, $port, $user, $password, '_ListDBs');
+ my($i);
+ for ($i = 0; $i < @dsn; $i++) {
+ $dsn[$i] = "DBI:mysql:$dsn[$i]";
+ }
+ @dsn;
+}
+
+sub admin {
+ my($drh) = shift;
+ my($command) = shift;
+ my($dbname) = ($command eq 'createdb' || $command eq 'dropdb') ?
+ shift : '';
+ my($host, $port) = DBD::mysql->_OdbcParseHost(shift(@_) || '');
+ my($user) = shift || '';
+ my($password) = shift || '';
+
+ $drh->func(undef, $command,
+ $dbname || '',
+ $host || '',
+ $port || '',
+ $user, $password, '_admin_internal');
+}
+
+package DBD::mysql::db; # ====== DATABASE ======
+use strict;
+use DBI qw(:sql_types);
+
+%DBD::mysql::db::db2ANSI = ("INT" => "INTEGER",
+ "CHAR" => "CHAR",
+ "REAL" => "REAL",
+ "IDENT" => "DECIMAL"
+ );
+
+### ANSI datatype mapping to mSQL datatypes
+%DBD::mysql::db::ANSI2db = ("CHAR" => "CHAR",
+ "VARCHAR" => "CHAR",
+ "LONGVARCHAR" => "CHAR",
+ "NUMERIC" => "INTEGER",
+ "DECIMAL" => "INTEGER",
+ "BIT" => "INTEGER",
+ "TINYINT" => "INTEGER",
+ "SMALLINT" => "INTEGER",
+ "INTEGER" => "INTEGER",
+ "BIGINT" => "INTEGER",
+ "REAL" => "REAL",
+ "FLOAT" => "REAL",
+ "DOUBLE" => "REAL",
+ "BINARY" => "CHAR",
+ "VARBINARY" => "CHAR",
+ "LONGVARBINARY" => "CHAR",
+ "DATE" => "CHAR",
+ "TIME" => "CHAR",
+ "TIMESTAMP" => "CHAR"
+ );
+
+sub prepare {
+ my($dbh, $statement, $attribs)= @_;
+
+ # create a 'blank' dbh
+ my $sth = DBI::_new_sth($dbh, {'Statement' => $statement});
+
+ # Populate internal handle data.
+ if (!DBD::mysql::st::_prepare($sth, $statement, $attribs)) {
+ $sth = undef;
+ }
+
+ $sth;
+}
+
+sub db2ANSI {
+ my $self = shift;
+ my $type = shift;
+ return $DBD::mysql::db::db2ANSI{"$type"};
+}
+
+sub ANSI2db {
+ my $self = shift;
+ my $type = shift;
+ return $DBD::mysql::db::ANSI2db{"$type"};
+}
+
+sub admin {
+ my($dbh) = shift;
+ my($command) = shift;
+ my($dbname) = ($command eq 'createdb' || $command eq 'dropdb') ?
+ shift : '';
+ $dbh->{'Driver'}->func($dbh, $command, $dbname, '', '', '',
+ '_admin_internal');
+}
+
+sub _SelectDB ($$) {
+ die "_SelectDB is removed from this module; use DBI->connect instead.";
+}
+
+sub table_info ($) {
+ my ($dbh, $catalog, $schema, $table, $type, $attr) = @_;
+ $dbh->{mysql_server_prepare}||= 0;
+ my $mysql_server_prepare_save= $dbh->{mysql_server_prepare};
+ $dbh->{mysql_server_prepare}= 0;
+ my @names = qw(TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS);
+ my @rows;
+
+ my $sponge = DBI->connect("DBI:Sponge:", '','')
+ or return $dbh->DBI::set_err($DBI::err, "DBI::Sponge: $DBI::errstr");
+
+# Return the list of catalogs
+ if (defined $catalog && $catalog eq "%" &&
+ (!defined($schema) || $schema eq "") &&
+ (!defined($table) || $table eq ""))
+ {
+ @rows = (); # Empty, because MySQL doesn't support catalogs (yet)
+ }
+ # Return the list of schemas
+ elsif (defined $schema && $schema eq "%" &&
+ (!defined($catalog) || $catalog eq "") &&
+ (!defined($table) || $table eq ""))
+ {
+ my $sth = $dbh->prepare("SHOW DATABASES")
+ or ($dbh->{mysql_server_prepare}= $mysql_server_prepare_save &&
+ return undef);
+
+ $sth->execute()
+ or ($dbh->{mysql_server_prepare}= $mysql_server_prepare_save &&
+ return DBI::set_err($dbh, $sth->err(), $sth->errstr()));
+
+ while (my $ref = $sth->fetchrow_arrayref())
+ {
+ push(@rows, [ undef, $ref->[0], undef, undef, undef ]);
+ }
+ }
+ # Return the list of table types
+ elsif (defined $type && $type eq "%" &&
+ (!defined($catalog) || $catalog eq "") &&
+ (!defined($schema) || $schema eq "") &&
+ (!defined($table) || $table eq ""))
+ {
+ @rows = (
+ [ undef, undef, undef, "TABLE", undef ],
+ [ undef, undef, undef, "VIEW", undef ],
+ );
+ }
+ # Special case: a catalog other than undef, "", or "%"
+ elsif (defined $catalog && $catalog ne "" && $catalog ne "%")
+ {
+ @rows = (); # Nothing, because MySQL doesn't support catalogs yet.
+ }
+ # Uh oh, we actually have a meaty table_info call. Work is required!
+ else
+ {
+ my @schemas;
+ # If no table was specified, we want them all
+ $table ||= "%";
+
+ # If something was given for the schema, we need to expand it to
+ # a list of schemas, since it may be a wildcard.
+ if (defined $schema && $schema ne "")
+ {
+ my $sth = $dbh->prepare("SHOW DATABASES LIKE " .
+ $dbh->quote($schema))
+ or ($dbh->{mysql_server_prepare}= $mysql_server_prepare_save &&
+ return undef);
+ $sth->execute()
+ or ($dbh->{mysql_server_prepare}= $mysql_server_prepare_save &&
+ return DBI::set_err($dbh, $sth->err(), $sth->errstr()));
+
+ while (my $ref = $sth->fetchrow_arrayref())
+ {
+ push @schemas, $ref->[0];
+ }
+ }
+ # Otherwise we want the current database
+ else
+ {
+ push @schemas, $dbh->selectrow_array("SELECT DATABASE()");
+ }
+
+ # Figure out which table types are desired
+ my ($want_tables, $want_views);
+ if (defined $type && $type ne "")
+ {
+ $want_tables = ($type =~ m/table/i);
+ $want_views = ($type =~ m/view/i);
+ }
+ else
+ {
+ $want_tables = $want_views = 1;
+ }
+
+ for my $database (@schemas)
+ {
+ my $sth = $dbh->prepare("SHOW /*!50002 FULL*/ TABLES FROM " .
+ $dbh->quote_identifier($database) .
+ " LIKE " . $dbh->quote($table))
+ or ($dbh->{mysql_server_prepare}= $mysql_server_prepare_save &&
+ return undef);
+
+ $sth->execute() or
+ ($dbh->{mysql_server_prepare}= $mysql_server_prepare_save &&
+ return DBI::set_err($dbh, $sth->err(), $sth->errstr()));
+
+ while (my $ref = $sth->fetchrow_arrayref())
+ {
+ my $type = (defined $ref->[1] &&
+ $ref->[1] =~ /view/i) ? 'VIEW' : 'TABLE';
+ next if $type eq 'TABLE' && not $want_tables;
+ next if $type eq 'VIEW' && not $want_views;
+ push @rows, [ undef, $database, $ref->[0], $type, undef ];
+ }
+ }
+ }
+
+ my $sth = $sponge->prepare("table_info",
+ {
+ rows => \@rows,
+ NUM_OF_FIELDS => scalar @names,
+ NAME => \@names,
+ })
+ or ($dbh->{mysql_server_prepare}= $mysql_server_prepare_save &&
+ return $dbh->DBI::set_err($sponge->err(), $sponge->errstr()));
+
+ $dbh->{mysql_server_prepare}= $mysql_server_prepare_save;
+ return $sth;
+}
+
+sub _ListTables {
+ my $dbh = shift;
+ if (!$DBD::mysql::QUIET) {
+ warn "_ListTables is deprecated, use \$dbh->tables()";
+ }
+ return map { $_ =~ s/.*\.//; $_ } $dbh->tables();
+}
+
+
+sub column_info {
+ my ($dbh, $catalog, $schema, $table, $column) = @_;
+ $dbh->{mysql_server_prepare}||= 0;
+ my $mysql_server_prepare_save= $dbh->{mysql_server_prepare};
+ $dbh->{mysql_server_prepare}= 0;
+
+ # ODBC allows a NULL to mean all columns, so we'll accept undef
+ $column = '%' unless defined $column;
+
+ my $ER_NO_SUCH_TABLE= 1146;
+
+ my $table_id = $dbh->quote_identifier($catalog, $schema, $table);
+
+ my @names = qw(
+ TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME
+ DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS
+ NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF
+ SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH
+ ORDINAL_POSITION IS_NULLABLE CHAR_SET_CAT
+ CHAR_SET_SCHEM CHAR_SET_NAME COLLATION_CAT COLLATION_SCHEM COLLATION_NAME
+ UDT_CAT UDT_SCHEM UDT_NAME DOMAIN_CAT DOMAIN_SCHEM DOMAIN_NAME
+ SCOPE_CAT SCOPE_SCHEM SCOPE_NAME MAX_CARDINALITY
+ DTD_IDENTIFIER IS_SELF_REF
+ mysql_is_pri_key mysql_type_name mysql_values
+ mysql_is_auto_increment
+ );
+ my %col_info;
+
+ local $dbh->{FetchHashKeyName} = 'NAME_lc';
+ # only ignore ER_NO_SUCH_TABLE in internal_execute if issued from here
+ my $desc_sth = $dbh->prepare("DESCRIBE $table_id " . $dbh->quote($column));
+ my $desc = $dbh->selectall_arrayref($desc_sth, { Columns=>{} });
+
+ #return $desc_sth if $desc_sth->err();
+ if (my $err = $desc_sth->err())
+ {
+ # return the error, unless it is due to the table not
+ # existing per DBI spec
+ if ($err != $ER_NO_SUCH_TABLE)
+ {
+ $dbh->{mysql_server_prepare}= $mysql_server_prepare_save;
+ return undef;
+ }
+ $dbh->set_err(undef,undef);
+ $desc = [];
+ }
+
+ my $ordinal_pos = 0;
+ for my $row (@$desc)
+ {
+ my $type = $row->{type};
+ $type =~ m/^(\w+)(?:\((.*?)\))?\s*(.*)/;
+ my $basetype = lc($1);
+ my $typemod = $2;
+ my $attr = $3;
+
+ my $info = $col_info{ $row->{field} }= {
+ TABLE_CAT => $catalog,
+ TABLE_SCHEM => $schema,
+ TABLE_NAME => $table,
+ COLUMN_NAME => $row->{field},
+ NULLABLE => ($row->{null} eq 'YES') ? 1 : 0,
+ IS_NULLABLE => ($row->{null} eq 'YES') ? "YES" : "NO",
+ TYPE_NAME => uc($basetype),
+ COLUMN_DEF => $row->{default},
+ ORDINAL_POSITION => ++$ordinal_pos,
+ mysql_is_pri_key => ($row->{key} eq 'PRI'),
+ mysql_type_name => $row->{type},
+ mysql_is_auto_increment => ($row->{extra} =~ /auto_increment/i ? 1 : 0),
+ };
+ #
+ # This code won't deal with a pathalogical case where a value
+ # contains a single quote followed by a comma, and doesn't unescape
+ # any escaped values. But who would use those in an enum or set?
+ #
+ my @type_params= ($typemod && index($typemod,"'")>=0) ?
+ ("$typemod," =~ /'(.*?)',/g) # assume all are quoted
+ : split /,/, $typemod||''; # no quotes, plain list
+ s/''/'/g for @type_params; # undo doubling of quotes
+
+ my @type_attr= split / /, $attr||'';
+
+ $info->{DATA_TYPE}= SQL_VARCHAR();
+ if ($basetype =~ /^(char|varchar|\w*text|\w*blob)/)
+ {
+ $info->{DATA_TYPE}= SQL_CHAR() if $basetype eq 'char';
+ if ($type_params[0])
+ {
+ $info->{COLUMN_SIZE} = $type_params[0];
+ }
+ else
+ {
+ $info->{COLUMN_SIZE} = 65535;
+ $info->{COLUMN_SIZE} = 255 if $basetype =~ /^tiny/;
+ $info->{COLUMN_SIZE} = 16777215 if $basetype =~ /^medium/;
+ $info->{COLUMN_SIZE} = 4294967295 if $basetype =~ /^long/;
+ }
+ }
+ elsif ($basetype =~ /^(binary|varbinary)/)
+ {
+ $info->{COLUMN_SIZE} = $type_params[0];
+ # SQL_BINARY & SQL_VARBINARY are tempting here but don't match the
+ # semantics for mysql (not hex). SQL_CHAR & SQL_VARCHAR are correct here.
+ $info->{DATA_TYPE} = ($basetype eq 'binary') ? SQL_CHAR() : SQL_VARCHAR();
+ }
+ elsif ($basetype =~ /^(enum|set)/)
+ {
+ if ($basetype eq 'set')
+ {
+ $info->{COLUMN_SIZE} = length(join ",", @type_params);
+ }
+ else
+ {
+ my $max_len = 0;
+ length($_) > $max_len and $max_len = length($_) for @type_params;
+ $info->{COLUMN_SIZE} = $max_len;
+ }
+ $info->{"mysql_values"} = \@type_params;
+ }
+ elsif ($basetype =~ /int/)
+ {
+ # big/medium/small/tiny etc + unsigned?
+ $info->{DATA_TYPE} = SQL_INTEGER();
+ $info->{NUM_PREC_RADIX} = 10;
+ $info->{COLUMN_SIZE} = $type_params[0];
+ }
+ elsif ($basetype =~ /^decimal/)
+ {
+ $info->{DATA_TYPE} = SQL_DECIMAL();
+ $info->{NUM_PREC_RADIX} = 10;
+ $info->{COLUMN_SIZE} = $type_params[0];
+ $info->{DECIMAL_DIGITS} = $type_params[1];
+ }
+ elsif ($basetype =~ /^(float|double)/)
+ {
+ $info->{DATA_TYPE} = ($basetype eq 'float') ? SQL_FLOAT() : SQL_DOUBLE();
+ $info->{NUM_PREC_RADIX} = 2;
+ $info->{COLUMN_SIZE} = ($basetype eq 'float') ? 32 : 64;
+ }
+ elsif ($basetype =~ /date|time/)
+ {
+ # date/datetime/time/timestamp
+ if ($basetype eq 'time' or $basetype eq 'date')
+ {
+ #$info->{DATA_TYPE} = ($basetype eq 'time') ? SQL_TYPE_TIME() : SQL_TYPE_DATE();
+ $info->{DATA_TYPE} = ($basetype eq 'time') ? SQL_TIME() : SQL_DATE();
+ $info->{COLUMN_SIZE} = ($basetype eq 'time') ? 8 : 10;
+ }
+ else
+ {
+ # datetime/timestamp
+ #$info->{DATA_TYPE} = SQL_TYPE_TIMESTAMP();
+ $info->{DATA_TYPE} = SQL_TIMESTAMP();
+ $info->{SQL_DATA_TYPE} = SQL_DATETIME();
+ $info->{SQL_DATETIME_SUB} = $info->{DATA_TYPE} - ($info->{SQL_DATA_TYPE} * 10);
+ $info->{COLUMN_SIZE} = ($basetype eq 'datetime') ? 19 : $type_params[0] || 14;
+ }
+ $info->{DECIMAL_DIGITS}= 0; # no fractional seconds
+ }
+ elsif ($basetype eq 'year')
+ {
+ # no close standard so treat as int
+ $info->{DATA_TYPE} = SQL_INTEGER();
+ $info->{NUM_PREC_RADIX} = 10;
+ $info->{COLUMN_SIZE} = 4;
+ }
+ else
+ {
+ Carp::carp("column_info: unrecognized column type '$basetype' of $table_id.$row->{field} treated as varchar");
+ }
+ $info->{SQL_DATA_TYPE} ||= $info->{DATA_TYPE};
+ #warn Dumper($info);
+ }
+
+ my $sponge = DBI->connect("DBI:Sponge:", '','')
+ or ( $dbh->{mysql_server_prepare}= $mysql_server_prepare_save &&
+ return $dbh->DBI::set_err($DBI::err, "DBI::Sponge: $DBI::errstr"));
+
+ my $sth = $sponge->prepare("column_info $table", {
+ rows => [ map { [ @{$_}{@names} ] } values %col_info ],
+ NUM_OF_FIELDS => scalar @names,
+ NAME => \@names,
+ }) or
+ return ($dbh->{mysql_server_prepare}= $mysql_server_prepare_save &&
+ $dbh->DBI::set_err($sponge->err(), $sponge->errstr()));
+
+ $dbh->{mysql_server_prepare}= $mysql_server_prepare_save;
+ return $sth;
+}
+
+
+sub primary_key_info {
+ my ($dbh, $catalog, $schema, $table) = @_;
+ $dbh->{mysql_server_prepare}||= 0;
+ my $mysql_server_prepare_save= $dbh->{mysql_server_prepare};
+
+ my $table_id = $dbh->quote_identifier($catalog, $schema, $table);
+
+ my @names = qw(
+ TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME KEY_SEQ PK_NAME
+ );
+ my %col_info;
+
+ local $dbh->{FetchHashKeyName} = 'NAME_lc';
+ my $desc_sth = $dbh->prepare("SHOW KEYS FROM $table_id");
+ my $desc= $dbh->selectall_arrayref($desc_sth, { Columns=>{} });
+ my $ordinal_pos = 0;
+ for my $row (grep { $_->{key_name} eq 'PRIMARY'} @$desc)
+ {
+ $col_info{ $row->{column_name} }= {
+ TABLE_CAT => $catalog,
+ TABLE_SCHEM => $schema,
+ TABLE_NAME => $table,
+ COLUMN_NAME => $row->{column_name},
+ KEY_SEQ => $row->{seq_in_index},
+ PK_NAME => $row->{key_name},
+ };
+ }
+
+ my $sponge = DBI->connect("DBI:Sponge:", '','')
+ or
+ ($dbh->{mysql_server_prepare}= $mysql_server_prepare_save &&
+ return $dbh->DBI::set_err($DBI::err, "DBI::Sponge: $DBI::errstr"));
+
+ my $sth= $sponge->prepare("primary_key_info $table", {
+ rows => [ map { [ @{$_}{@names} ] } values %col_info ],
+ NUM_OF_FIELDS => scalar @names,
+ NAME => \@names,
+ }) or
+ ($dbh->{mysql_server_prepare}= $mysql_server_prepare_save &&
+ return $dbh->DBI::set_err($sponge->err(), $sponge->errstr()));
+
+ $dbh->{mysql_server_prepare}= $mysql_server_prepare_save;
+
+ return $sth;
+}
+
+
+sub foreign_key_info {
+ my ($dbh,
+ $pk_catalog, $pk_schema, $pk_table,
+ $fk_catalog, $fk_schema, $fk_table,
+ ) = @_;
+
+ # INFORMATION_SCHEMA.KEY_COLUMN_USAGE was added in 5.0.6
+ my ($maj, $min, $point) = _version($dbh);
+ return if $maj < 5 || ($maj == 5 && $point < 6);
+
+ my $sql = <<'EOF';
+SELECT NULL AS PKTABLE_CAT,
+ A.REFERENCED_TABLE_SCHEMA AS PKTABLE_SCHEM,
+ A.REFERENCED_TABLE_NAME AS PKTABLE_NAME,
+ A.REFERENCED_COLUMN_NAME AS PKCOLUMN_NAME,
+ A.TABLE_CATALOG AS FKTABLE_CAT,
+ A.TABLE_SCHEMA AS FKTABLE_SCHEM,
+ A.TABLE_NAME AS FKTABLE_NAME,
+ A.COLUMN_NAME AS FKCOLUMN_NAME,
+ A.ORDINAL_POSITION AS KEY_SEQ,
+ NULL AS UPDATE_RULE,
+ NULL AS DELETE_RULE,
+ A.CONSTRAINT_NAME AS FK_NAME,
+ NULL AS PK_NAME,
+ NULL AS DEFERABILITY,
+ NULL AS UNIQUE_OR_PRIMARY
+ FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE A,
+ INFORMATION_SCHEMA.TABLE_CONSTRAINTS B
+ WHERE A.TABLE_SCHEMA = B.TABLE_SCHEMA AND A.TABLE_NAME = B.TABLE_NAME
+ AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME AND B.CONSTRAINT_TYPE IS NOT NULL
+EOF
+
+ my @where;
+ my @bind;
+
+ # catalogs are not yet supported by MySQL
+
+# if (defined $pk_catalog) {
+# push @where, 'A.REFERENCED_TABLE_CATALOG = ?';
+# push @bind, $pk_catalog;
+# }
+
+ if (defined $pk_schema) {
+ push @where, 'A.REFERENCED_TABLE_SCHEMA = ?';
+ push @bind, $pk_schema;
+ }
+
+ if (defined $pk_table) {
+ push @where, 'A.REFERENCED_TABLE_NAME = ?';
+ push @bind, $pk_table;
+ }
+
+# if (defined $fk_catalog) {
+# push @where, 'A.TABLE_CATALOG = ?';
+# push @bind, $fk_schema;
+# }
+
+ if (defined $fk_schema) {
+ push @where, 'A.TABLE_SCHEMA = ?';
+ push @bind, $fk_schema;
+ }
+
+ if (defined $fk_table) {
+ push @where, 'A.TABLE_NAME = ?';
+ push @bind, $fk_table;
+ }
+
+ if (@where) {
+ $sql .= ' AND ';
+ $sql .= join ' AND ', @where;
+ }
+ $sql .= " ORDER BY A.TABLE_SCHEMA, A.TABLE_NAME, A.ORDINAL_POSITION";
+
+ local $dbh->{FetchHashKeyName} = 'NAME_uc';
+ my $sth = $dbh->prepare($sql);
+ $sth->execute(@bind);
+
+ return $sth;
+}
+
+
+sub _version {
+ my $dbh = shift;
+
+ return
+ $dbh->get_info($DBI::Const::GetInfoType::GetInfoType{SQL_DBMS_VER})
+ =~ /(\d+)\.(\d+)\.(\d+)/;
+}
+
+
+####################
+# get_info()
+# Generated by DBI::DBD::Metadata
+
+sub get_info {
+ my($dbh, $info_type) = @_;
+ require DBD::mysql::GetInfo;
+ my $v = $DBD::mysql::GetInfo::info{int($info_type)};
+ $v = $v->($dbh) if ref $v eq 'CODE';
+ return $v;
+}
+
+
+
+package DBD::mysql::st; # ====== STATEMENT ======
+use strict;
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+DBD::mysql - MySQL driver for the Perl5 Database Interface (DBI)
+
+=head1 SYNOPSIS
+
+ use DBI;
+
+ $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";
+
+ $dbh = DBI->connect($dsn, $user, $password);
+
+
+ $drh = DBI->install_driver("mysql");
+ @databases = DBI->data_sources("mysql");
+ or
+ @databases = DBI->data_sources("mysql",
+ {"host" => $host, "port" => $port, "user" => $user, password => $pass});
+
+ $sth = $dbh->prepare("SELECT * FROM foo WHERE bla");
+ or
+ $sth = $dbh->prepare("LISTFIELDS $table");
+ or
+ $sth = $dbh->prepare("LISTINDEX $table $index");
+ $sth->execute;
+ $numRows = $sth->rows;
+ $numFields = $sth->{'NUM_OF_FIELDS'};
+ $sth->finish;
+
+ $rc = $drh->func('createdb', $database, $host, $user, $password, 'admin');
+ $rc = $drh->func('dropdb', $database, $host, $user, $password, 'admin');
+ $rc = $drh->func('shutdown', $host, $user, $password, 'admin');
+ $rc = $drh->func('reload', $host, $user, $password, 'admin');
+
+ $rc = $dbh->func('createdb', $database, 'admin');
+ $rc = $dbh->func('dropdb', $database, 'admin');
+ $rc = $dbh->func('shutdown', 'admin');
+ $rc = $dbh->func('reload', 'admin');
+
+
+=head1 EXAMPLE
+
+ #!/usr/bin/perl
+
+ use strict;
+ use DBI();
+
+ # Connect to the database.
+ my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost",
+ "joe", "joe's password",
+ {'RaiseError' => 1});
+
+ # Drop table 'foo'. This may fail, if 'foo' doesn't exist.
+ # Thus we put an eval around it.
+ eval { $dbh->do("DROP TABLE foo") };
+ print "Dropping foo failed: $@\n" if $@;
+
+ # Create a new table 'foo'. This must not fail, thus we don't
+ # catch errors.
+ $dbh->do("CREATE TABLE foo (id INTEGER, name VARCHAR(20))");
+
+ # INSERT some data into 'foo'. We are using $dbh->quote() for
+ # quoting the name.
+ $dbh->do("INSERT INTO foo VALUES (1, " . $dbh->quote("Tim") . ")");
+
+ # Same thing, but using placeholders
+ $dbh->do("INSERT INTO foo VALUES (?, ?)", undef, 2, "Jochen");
+
+ # Now retrieve data from the table.
+ my $sth = $dbh->prepare("SELECT * FROM foo");
+ $sth->execute();
+ while (my $ref = $sth->fetchrow_hashref()) {
+ print "Found a row: id = $ref->{'id'}, name = $ref->{'name'}\n";
+ }
+ $sth->finish();
+
+ # Disconnect from the database.
+ $dbh->disconnect();
+
+
+=head1 DESCRIPTION
+
+B<DBD::mysql> is the Perl5 Database Interface driver for the MySQL
+database. In other words: DBD::mysql is an interface between the Perl
+programming language and the MySQL programming API that comes with
+the MySQL relational database management system. Most functions
+provided by this programming API are supported. Some rarely used
+functions are missing, mainly because noone ever requested
+them. :-)
+
+In what follows we first discuss the use of DBD::mysql,
+because this is what you will need the most. For installation, see the
+sections on L<INSTALLATION>, and L<WIN32 INSTALLATION>
+below. See L<EXAMPLE> for a simple example above.
+
+From perl you activate the interface with the statement
+
+ use DBI;
+
+After that you can connect to multiple MySQL database servers
+and send multiple queries to any of them via a simple object oriented
+interface. Two types of objects are available: database handles and
+statement handles. Perl returns a database handle to the connect
+method like so:
+
+ $dbh = DBI->connect("DBI:mysql:database=$db;host=$host",
+ $user, $password, {RaiseError => 1});
+
+Once you have connected to a database, you can can execute SQL
+statements with:
+
+ my $query = sprintf("INSERT INTO foo VALUES (%d, %s)",
+ $number, $dbh->quote("name"));
+ $dbh->do($query);
+
+See L<DBI(3)> for details on the quote and do methods. An alternative
+approach is
+
+ $dbh->do("INSERT INTO foo VALUES (?, ?)", undef,
+ $number, $name);
+
+in which case the quote method is executed automatically. See also
+the bind_param method in L<DBI(3)>. See L<DATABASE HANDLES> below
+for more details on database handles.
+
+If you want to retrieve results, you need to create a so-called
+statement handle with:
+
+ $sth = $dbh->prepare("SELECT * FROM $table");
+ $sth->execute();
+
+This statement handle can be used for multiple things. First of all
+you can retreive a row of data:
+
+ my $row = $sth->fetchrow_hashref();
+
+If your table has columns ID and NAME, then $row will be hash ref with
+keys ID and NAME. See L<STATEMENT HANDLES> below for more details on
+statement handles.
+
+But now for a more formal approach:
+
+
+=head2 Class Methods
+
+=over
+
+=item B<connect>
+
+ use DBI;
+
+ $dsn = "DBI:mysql:$database";
+ $dsn = "DBI:mysql:database=$database;host=$hostname";
+ $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";
+
+ $dbh = DBI->connect($dsn, $user, $password);
+
+A C<database> must always be specified.
+
+=over
+
+=item host
+
+=item port
+
+The hostname, if not specified or specified as '' or 'localhost', will
+default to a MySQL server running on the local machine using the default for
+the UNIX socket. To connect to a MySQL server on the local machine via TCP,
+you must specify the loopback IP address (127.0.0.1) as the host.
+
+Should the MySQL server be running on a non-standard port number,
+you may explicitly state the port number to connect to in the C<hostname>
+argument, by concatenating the I<hostname> and I<port number> together
+separated by a colon ( C<:> ) character or by using the C<port> argument.
+
+To connect to a MySQL server on localhost using TCP/IP, you must specify the
+hostname as 127.0.0.1 (with the optional port).
+
+=item mysql_client_found_rows
+
+Enables (TRUE value) or disables (FALSE value) the flag CLIENT_FOUND_ROWS
+while connecting to the MySQL server. This has a somewhat funny effect:
+Without mysql_client_found_rows, if you perform a query like
+
+ UPDATE $table SET id = 1 WHERE id = 1
+
+then the MySQL engine will always return 0, because no rows have changed.
+With mysql_client_found_rows however, it will return the number of rows
+that have an id 1, as some people are expecting. (At least for compatibility
+to other engines.)
+
+=item mysql_compression
+
+As of MySQL 3.22.3, a new feature is supported: If your DSN contains
+the option "mysql_compression=1", then the communication between client
+and server will be compressed.
+
+=item mysql_connect_timeout
+
+If your DSN contains the option "mysql_connect_timeout=##", the connect
+request to the server will timeout if it has not been successful after
+the given number of seconds.
+
+=item mysql_read_default_file
+
+=item mysql_read_default_group
+
+These options can be used to read a config file like /etc/my.cnf or
+~/.my.cnf. By default MySQL's C client library doesn't use any config
+files unlike the client programs (mysql, mysqladmin, ...) that do, but
+outside of the C client library. Thus you need to explicitly request
+reading a config file, as in
+
+ $dsn = "DBI:mysql:test;mysql_read_default_file=/home/joe/my.cnf";
+ $dbh = DBI->connect($dsn, $user, $password)
+
+The option mysql_read_default_group can be used to specify the default
+group in the config file: Usually this is the I<client> group, but
+see the following example:
+
+ [client]
+ host=localhost
+
+ [perl]
+ host=perlhost
+
+(Note the order of the entries! The example won't work, if you reverse
+the [client] and [perl] sections!)
+
+If you read this config file, then you'll be typically connected to
+I<localhost>. However, by using
+
+ $dsn = "DBI:mysql:test;mysql_read_default_group=perl;"
+ . "mysql_read_default_file=/home/joe/my.cnf";
+ $dbh = DBI->connect($dsn, $user, $password);
+
+you'll be connected to I<perlhost>. Note that if you specify a
+default group and do not specify a file, then the default config
+files will all be read. See the documentation of
+the C function mysql_options() for details.
+
+=item mysql_socket
+
+As of MySQL 3.21.15, it is possible to choose the Unix socket that is
+used for connecting to the server. This is done, for example, with
+
+ mysql_socket=/dev/mysql
+
+Usually there's no need for this option, unless you are using another
+location for the socket than that built into the client.
+
+=item mysql_ssl
+
+A true value turns on the CLIENT_SSL flag when connecting to the MySQL
+database:
+
+ mysql_ssl=1
+
+This means that your communication with the server will be encrypted.
+
+If you turn mysql_ssl on, you might also wish to use the following
+flags:
+
+=item mysql_ssl_client_key
+
+=item mysql_ssl_client_cert
+
+=item mysql_ssl_ca_file
+
+=item mysql_ssl_ca_path
+
+=item mysql_ssl_cipher
+
+These are used to specify the respective parameters of a call
+to mysql_ssl_set, if mysql_ssl is turned on.
+
+
+=item mysql_local_infile
+
+As of MySQL 3.23.49, the LOCAL capability for LOAD DATA may be disabled
+in the MySQL client library by default. If your DSN contains the option
+"mysql_local_infile=1", LOAD DATA LOCAL will be enabled. (However,
+this option is *ineffective* if the server has also been configured to
+disallow LOCAL.)
+
+=item mysql_multi_statements
+
+As of MySQL 4.1, support for multiple statements seperated by a semicolon
+(;) may be enabled by using this option. Enabling this option may cause
+problems if server-side prepared statements are also enabled.
+
+=item Prepared statement support (server side prepare)
+
+As of 3.0002_1, server side prepare statements were on by default (if your
+server was >= 4.1.3). As of 3.0009, they were off by default again due to
+issues with the prepared statement API (all other mysql connectors are
+set this way until C API issues are resolved). The requirement to use
+prepared statements still remains that you have a server >= 4.1.3
+
+To use server side prepared statements, all you need to do is set the variable
+mysql_server_prepare in the connect:
+
+$dbh = DBI->connect(
+ "DBI:mysql:database=test;host=localhost;mysql_server_prepare=1",
+ "",
+ "",
+ { RaiseError => 1, AutoCommit => 1 }
+ );
+
+* Note: delimiter for this param is ';'
+
+There are many benefits to using server side prepare statements, mostly if you are
+performing many inserts because of that fact that a single statement is prepared
+to accept multiple insert values.
+
+To make sure that the 'make test' step tests whether server prepare works, you just
+need to export the env variable MYSQL_SERVER_PREPARE:
+
+export MYSQL_SERVER_PREPARE=1
+
+
+=item mysql_embedded_options
+
+The option <mysql_embedded_options> can be used to pass 'command-line'
+options to embedded server.
+
+Example:
+
+use DBI;
+$testdsn="DBI:mysqlEmb:database=test;mysql_embedded_options=--help,--verbose";
+$dbh = DBI->connect($testdsn,"a","b");
+
+This would cause the command line help to the embedded MySQL server library
+to be printed.
+
+
+=item mysql_embedded_groups
+
+The option <mysql_embedded_groups> can be used to specify the groups in the
+config file(I<my.cnf>) which will be used to get options for embedded server.
+If not specified [server] and [embedded] groups will be used.
+
+Example:
+
+$testdsn="DBI:mysqlEmb:database=test;mysql_embedded_groups=embedded_server,common";
+
+
+=back
+
+=back
+
+
+=head2 Private MetaData Methods
+
+=over
+
+=item B<ListDBs>
+
+ my $drh = DBI->install_driver("mysql");
+ @dbs = $drh->func("$hostname:$port", '_ListDBs');
+ @dbs = $drh->func($hostname, $port, '_ListDBs');
+ @dbs = $dbh->func('_ListDBs');
+
+Returns a list of all databases managed by the MySQL server
+running on C<$hostname>, port C<$port>. This is a legacy
+method. Instead, you should use the portable method
+
+ @dbs = DBI->data_sources("mysql");
+
+=back
+
+
+=head2 Server Administration
+
+=over
+
+=item admin
+
+ $rc = $drh->func("createdb", $dbname, [host, user, password,], 'admin');
+ $rc = $drh->func("dropdb", $dbname, [host, user, password,], 'admin');
+ $rc = $drh->func("shutdown", [host, user, password,], 'admin');
+ $rc = $drh->func("reload", [host, user, password,], 'admin');
+
+ or
+
+ $rc = $dbh->func("createdb", $dbname, 'admin');
+ $rc = $dbh->func("dropdb", $dbname, 'admin');
+ $rc = $dbh->func("shutdown", 'admin');
+ $rc = $dbh->func("reload", 'admin');
+
+For server administration you need a server connection. For obtaining
+this connection you have two options: Either use a driver handle (drh)
+and supply the appropriate arguments (host, defaults localhost, user,
+defaults to '' and password, defaults to ''). A driver handle can be
+obtained with
+
+ $drh = DBI->install_driver('mysql');
+
+Otherwise reuse the existing connection of a database handle (dbh).
+
+There's only one function available for administrative purposes, comparable
+to the m(y)sqladmin programs. The command being execute depends on the
+first argument:
+
+=over
+
+=item createdb
+
+Creates the database $dbname. Equivalent to "m(y)sqladmin create $dbname".
+
+=item dropdb
+
+Drops the database $dbname. Equivalent to "m(y)sqladmin drop $dbname".
+
+It should be noted that database deletion is
+I<not prompted for> in any way. Nor is it undo-able from DBI.
+
+ Once you issue the dropDB() method, the database will be gone!
+
+These method should be used at your own risk.
+
+=item shutdown
+
+Silently shuts down the database engine. (Without prompting!)
+Equivalent to "m(y)sqladmin shutdown".
+
+=item reload
+
+Reloads the servers configuration files and/or tables. This can be particularly
+important if you modify access privileges or create new users.
+
+=back
+
+=back
+
+
+=head1 DATABASE HANDLES
+
+The DBD::mysql driver supports the following attributes of database
+handles (read only):
+
+ $errno = $dbh->{'mysql_errno'};
+ $error = $dbh->{'mysql_error'};
+ $info = $dbh->{'mysql_hostinfo'};
+ $info = $dbh->{'mysql_info'};
+ $insertid = $dbh->{'mysql_insertid'};
+ $info = $dbh->{'mysql_protoinfo'};
+ $info = $dbh->{'mysql_serverinfo'};
+ $info = $dbh->{'mysql_stat'};
+ $threadId = $dbh->{'mysql_thread_id'};
+
+These correspond to mysql_errno(), mysql_error(), mysql_get_host_info(),
+mysql_info(), mysql_insert_id(), mysql_get_proto_info(),
+mysql_get_server_info(), mysql_stat() and mysql_thread_id(),
+respectively.
+
+
+ $info_hashref = $dhb->{mysql_dbd_stats}
+
+DBD::mysql keeps track of some statistics in the mysql_dbd_stats attribute.
+The following stats are being maintained:
+
+=over
+
+=item auto_reconnects_ok
+
+The number of times that DBD::mysql successfully reconnected to the mysql
+server.
+
+=item auto_reconnects_failed
+
+The number of times that DBD::mysql tried to reconnect to mysql but failed.
+
+=back
+
+The DBD::mysql driver also supports the following attribute(s) of database
+handles (read/write):
+
+ $bool_value = $dbh->{mysql_auto_reconnect};
+ $dbh->{mysql_auto_reconnect} = $AutoReconnect ? 1 : 0;
+
+
+=item mysql_auto_reconnect
+
+This attribute determines whether DBD::mysql will automatically reconnect
+to mysql if the connection be lost. This feature defaults to off; however,
+if either the GATEWAY_INTERFACE or MOD_PERL envionment variable is set,
+DBD::mysql will turn mysql_auto_reconnect on. Setting mysql_auto_reconnect
+to on is not advised if 'lock tables' is used because if DBD::mysql reconnect
+to mysql all table locks will be lost. This attribute is ignored when
+AutoCommit is turned off, and when AutoCommit is turned off, DBD::mysql will
+not automatically reconnect to the server.
+
+=item mysql_use_result
+
+This attribute forces the driver to use mysql_use_result rather than
+mysql_store_result. The former is faster and less memory consuming, but
+tends to block other processes. (That's why mysql_store_result is the
+default.)
+
+It is possible to set default value of the C<mysql_use_result> attribute
+for $dbh using several ways:
+
+ - through DSN
+
+ $dbh= DBI->connect("DBI:mysql:test;mysql_use_result=1", "root", "");
+
+ - after creation of database handle
+
+ $dbh->{'mysql_use_result'}=0; #disable
+ $dbh->{'mysql_use_result'}=1; #enable
+
+It is possible to set/unset the C<mysql_use_result> attribute after
+creation of statement handle. See below.
+
+=item mysql_enable_utf8
+
+This attribute determines whether DBD::mysql should assume strings
+stored in the database are utf8. This feature defaults to off.
+
+When set, a data retrieved from a textual column type (char, varchar,
+etc) will have the UTF-8 flag turned on if necessary. This enables
+character semantics on that string. You will also need to ensure that
+your database / table / column is configured to use UTF8. See Chapter
+10 of the mysql manual for details.
+
+Additionally, turning on this flag tells MySQL that incoming data should
+be treated as UTF-8. This will only take effect if used as part of the
+call to connect(). If you turn the flag on after connecting, you will
+need to issue the command C<SET NAMES utf8> to get the same effect.
+
+This option is experimental and may change in future versions.
+
+=item mysql_bind_type_guessing
+
+This attribute causes the driver (emulated prepare statements)
+to attempt to guess if a value being bound is a numeric value,
+and if so, doesn't quote the value. This was created by
+Dragonchild and is one way to deal with the performance issue
+of using quotes in a statement that is inserting or updating a
+large numeric value. This was previously called
+C<unsafe_bind_type_guessing> because it is experimental. I have
+successfully run the full test suite with this option turned on,
+the name can now be simply C<mysql_bind_type_guessing>.
+
+See bug: https://rt.cpan.org/Ticket/Display.html?id=43822
+
+C<mysql_bind_type_guessing> can be turned on via
+
+ - through DSN
+
+ my $dbh= DBI->connect('DBI:mysql:test', 'username', 'pass',
+ { mysql_bind_type_guessing => 1})
+
+ - OR after handle creation
+
+ $dbh->{mysql_bind_type_guessing} = 1;
+
+=item mysql_no_autocommit_cmd
+
+This attribute causes the driver to not issue 'set autocommit'
+either through explicit or using mysql_autocommit(). This is
+particularly useful in the case of using MySQL Proxy.
+
+See the bug report:
+
+https://rt.cpan.org/Public/Bug/Display.html?id=46308
+
+As well as:
+
+http://bugs.mysql.com/bug.php?id=32464
+
+C<mysql_no_autocommit_cmd> can be turned on via
+
+ - through DSN
+
+ my $dbh= DBI->connect('DBI:mysql:test', 'username', 'pass',
+ { mysql_no_autocommit_cmd => 1})
+
+ - OR after handle creation
+
+ $dbh->{mysql_no_autocommit_cmd} = 1;
+
+
+
+=head1 STATEMENT HANDLES
+
+The statement handles of DBD::mysql support a number
+of attributes. You access these by using, for example,
+
+ my $numFields = $sth->{'NUM_OF_FIELDS'};
+
+Note, that most attributes are valid only after a successfull I<execute>.
+An C<undef> value will returned in that case. The most important exception
+is the C<mysql_use_result> attribute: This forces the driver to use
+mysql_use_result rather than mysql_store_result. The former is faster
+and less memory consuming, but tends to block other processes. (That's why
+mysql_store_result is the default.)
+
+To set the C<mysql_use_result> attribute, use either of the following:
+
+ my $sth = $dbh->prepare("QUERY", { "mysql_use_result" => 1});
+
+or
+
+ my $sth = $dbh->prepare("QUERY");
+ $sth->{"mysql_use_result"} = 1;
+
+Column dependent attributes, for example I<NAME>, the column names,
+are returned as a reference to an array. The array indices are
+corresponding to the indices of the arrays returned by I<fetchrow>
+and similar methods. For example the following code will print a
+header of table names together with all rows:
+
+ my $sth = $dbh->prepare("SELECT * FROM $table");
+ if (!$sth) {
+ die "Error:" . $dbh->errstr . "\n";
+ }
+ if (!$sth->execute) {
+ die "Error:" . $sth->errstr . "\n";
+ }
+ my $names = $sth->{'NAME'};
+ my $numFields = $sth->{'NUM_OF_FIELDS'};
+ for (my $i = 0; $i < $numFields; $i++) {
+ printf("%s%s", $i ? "," : "", $$names[$i]);
+ }
+ print "\n";
+ while (my $ref = $sth->fetchrow_arrayref) {
+ for (my $i = 0; $i < $numFields; $i++) {
+ printf("%s%s", $i ? "," : "", $$ref[$i]);
+ }
+ print "\n";
+ }
+
+For portable applications you should restrict yourself to attributes with
+capitalized or mixed case names. Lower case attribute names are private
+to DBD::mysql. The attribute list includes:
+
+=over
+
+=item ChopBlanks
+
+this attribute determines whether a I<fetchrow> will chop preceding
+and trailing blanks off the column values. Chopping blanks does not
+have impact on the I<max_length> attribute.
+
+=item mysql_insertid
+
+MySQL has the ability to choose unique key values automatically. If this
+happened, the new ID will be stored in this attribute. An alternative
+way for accessing this attribute is via $dbh->{'mysql_insertid'}.
+(Note we are using the $dbh in this case!)
+
+=item mysql_is_blob
+
+Reference to an array of boolean values; TRUE indicates, that the
+respective column is a blob. This attribute is valid for MySQL only.
+
+=item mysql_is_key
+
+Reference to an array of boolean values; TRUE indicates, that the
+respective column is a key. This is valid for MySQL only.
+
+=item mysql_is_num
+
+Reference to an array of boolean values; TRUE indicates, that the
+respective column contains numeric values.
+
+=item mysql_is_pri_key
+
+Reference to an array of boolean values; TRUE indicates, that the
+respective column is a primary key.
+
+=item mysql_is_auto_increment
+
+Reference to an array of boolean values; TRUE indicates that the
+respective column is an AUTO_INCREMENT column. This is only valid
+for MySQL.
+
+=item mysql_length
+
+=item mysql_max_length
+
+A reference to an array of maximum column sizes. The I<max_length> is
+the maximum physically present in the result table, I<length> gives
+the theoretically possible maximum. I<max_length> is valid for MySQL
+only.
+
+=item NAME
+
+A reference to an array of column names.
+
+=item NULLABLE
+
+A reference to an array of boolean values; TRUE indicates that this column
+may contain NULL's.
+
+=item NUM_OF_FIELDS
+
+Number of fields returned by a I<SELECT> or I<LISTFIELDS> statement.
+You may use this for checking whether a statement returned a result:
+A zero value indicates a non-SELECT statement like I<INSERT>,
+I<DELETE> or I<UPDATE>.
+
+=item mysql_table
+
+A reference to an array of table names, useful in a I<JOIN> result.
+
+=item TYPE
+
+A reference to an array of column types. The engine's native column
+types are mapped to portable types like DBI::SQL_INTEGER() or
+DBI::SQL_VARCHAR(), as good as possible. Not all native types have
+a meaningfull equivalent, for example DBD::mysql::FIELD_TYPE_INTERVAL
+is mapped to DBI::SQL_VARCHAR().
+If you need the native column types, use I<mysql_type>. See below.
+
+=item mysql_type
+
+A reference to an array of MySQL's native column types, for example
+DBD::mysql::FIELD_TYPE_SHORT() or DBD::mysql::FIELD_TYPE_STRING().
+Use the I<TYPE> attribute, if you want portable types like
+DBI::SQL_SMALLINT() or DBI::SQL_VARCHAR().
+
+=item mysql_type_name
+
+Similar to mysql, but type names and not numbers are returned.
+Whenever possible, the ANSI SQL name is preferred.
+
+=item mysql_warning_count
+
+The number of warnings generated during execution of the SQL statement.
+
+=back
+
+=head1 TRANSACTION SUPPORT
+
+Beginning with DBD::mysql 2.0416, transactions are supported.
+The transaction support works as follows:
+
+=over
+
+=item *
+
+By default AutoCommit mode is on, following the DBI specifications.
+
+=item *
+
+If you execute
+
+ $dbh->{'AutoCommit'} = 0;
+
+or
+
+ $dbh->{'AutoCommit'} = 1;
+
+then the driver will set the MySQL server variable autocommit to 0 or
+1, respectively. Switching from 0 to 1 will also issue a COMMIT,
+following the DBI specifications.
+
+=item *
+
+The methods
+
+ $dbh->rollback();
+ $dbh->commit();
+
+will issue the commands COMMIT and ROLLBACK, respectively. A
+ROLLBACK will also be issued if AutoCommit mode is off and the
+database handles DESTROY method is called. Again, this is following
+the DBI specifications.
+
+=back
+
+Given the above, you should note the following:
+
+=over
+
+=item *
+
+You should never change the server variable autocommit manually,
+unless you are ignoring DBI's transaction support.
+
+=item *
+
+Switching AutoCommit mode from on to off or vice versa may fail.
+You should always check for errors, when changing AutoCommit mode.
+The suggested way of doing so is using the DBI flag RaiseError.
+If you don't like RaiseError, you have to use code like the
+following:
+
+ $dbh->{'AutoCommit'} = 0;
+ if ($dbh->{'AutoCommit'}) {
+ # An error occurred!
+ }
+
+=item *
+
+If you detect an error while changing the AutoCommit mode, you
+should no longer use the database handle. In other words, you
+should disconnect and reconnect again, because the transaction
+mode is unpredictable. Alternatively you may verify the transaction
+mode by checking the value of the server variable autocommit.
+However, such behaviour isn't portable.
+
+=item *
+
+DBD::mysql has a "reconnect" feature that handles the so-called
+MySQL "morning bug": If the server has disconnected, most probably
+due to a timeout, then by default the driver will reconnect and
+attempt to execute the same SQL statement again. However, this
+behaviour is disabled when AutoCommit is off: Otherwise the
+transaction state would be completely unpredictable after a
+reconnect.
+
+=item *
+
+The "reconnect" feature of DBD::mysql can be toggled by using the
+L<mysql_auto_reconnect> attribute. This behaviour should be turned off
+in code that uses LOCK TABLE because if the database server time out
+and DBD::mysql reconnect, table locks will be lost without any
+indication of such loss.
+
+=back
+
+=over
+
+=head1 MULTIPLE RESULT SETS
+
+As of version 3.0002_5, DBD::mysql supports multiple result sets (Thanks
+to Guy Harrison!). This is the first release of this functionality, so
+there may be issues. Please report bugs if you run into them!
+
+The basic usage of multiple result sets is
+
+ do
+ {
+ while (@row= $sth->fetchrow_array())
+ {
+ do stuff;
+ }
+ } while ($sth->more_results)
+
+An example would be:
+
+ $dbh->do("drop procedure if exists someproc") or print $DBI::errstr;
+
+ $dbh->do("create procedure somproc() deterministic
+ begin
+ declare a,b,c,d int;
+ set a=1;
+ set b=2;
+ set c=3;
+ set d=4;
+ select a, b, c, d;
+ select d, c, b, a;
+ select b, a, c, d;
+ select c, b, d, a;
+ end") or print $DBI::errstr;
+
+ $sth=$dbh->prepare('call someproc()') ||
+ die $DBI::err.": ".$DBI::errstr;
+
+ $sth->execute || die DBI::err.": ".$DBI::errstr; $rowset=0;
+ do {
+ print "\nRowset ".++$i."\n---------------------------------------\n\n";
+ foreach $colno (0..$sth->{NUM_OF_FIELDS}) {
+ print $sth->{NAME}->[$colno]."\t";
+ }
+ print "\n";
+ while (@row= $sth->fetchrow_array()) {
+ foreach $field (0..$#row) {
+ print $row[$field]."\t";
+ }
+ print "\n";
+ }
+ } until (!$sth->more_results)
+
+For more examples, please see the eg/ directory. This is where helpful
+DBD::mysql code snippits will be added in the future.
+
+=head2 Issues with Multiple result sets
+
+So far, the main issue is if your result sets are "jagged", meaning, the
+number of columns of your results vary. Varying numbers of columns could
+result in your script crashing. This is something that will be fixed soon.
+
+
+=head1 MULTITHREADING
+
+The multithreading capabilities of DBD::mysql depend completely
+on the underlying C libraries: The modules are working with handle data
+only, no global variables are accessed or (to the best of my knowledge)
+thread unsafe functions are called. Thus DBD::mysql is believed
+to be completely thread safe, if the C libraries are thread safe
+and you don't share handles among threads.
+
+The obvious question is: Are the C libraries thread safe?
+In the case of MySQL the answer is "mostly" and, in theory, you should
+be able to get a "yes", if the C library is compiled for being thread
+safe (By default it isn't.) by passing the option -with-thread-safe-client
+to configure. See the section on I<How to make a threadsafe client> in
+the manual.
+
+
+=head1 INSTALLATION
+
+Windows users may skip this section and pass over to L<WIN32
+INSTALLATION> below. Others, go on reading.
+
+First of all, you do not need an installed MySQL server for installing
+DBD::mysql. However, you need at least the client
+libraries and possibly the header files, if you are compiling DBD::mysql
+from source. In the case of MySQL you can create a
+client-only version by using the configure option --without-server.
+If you are using precompiled binaries, then it may be possible to
+use just selected RPM's like MySQL-client and MySQL-devel or something
+similar, depending on the distribution.
+
+First you need to install the DBI module. For using I<dbimon>, a
+simple DBI shell it is recommended to install Data::ShowTable another
+Perl module.
+
+I recommend trying automatic installation via the CPAN module. Try
+
+ perl -MCPAN -e shell
+
+If you are using the CPAN module for the first time, it will prompt
+you a lot of questions. If you finally receive the CPAN prompt, enter
+
+ install Bundle::DBD::mysql
+
+If this fails (which may be the case for a number of reasons, for
+example because you are behind a firewall or don't have network
+access), you need to do a manual installation. First of all you
+need to fetch the modules from CPAN search
+
+ http://search.cpan.org/
+
+The following modules are required
+
+ DBI
+ Data::ShowTable
+ DBD::mysql
+
+Then enter the following commands (note - versions are just examples):
+
+ gzip -cd DBI-(version).tar.gz | tar xf -
+ cd DBI-(version)
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+ cd ..
+ gzip -cd Data-ShowTable-(version).tar.gz | tar xf -
+ cd Data-ShowTable-3.3
+ perl Makefile.PL
+ make
+ make install
+
+ cd ..
+ gzip -cd DBD-mysql-(version)-tar.gz | tar xf -
+ cd DBD-mysql-(version)
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+During "perl Makefile.PL" you will be prompted some questions.
+Other questions are the directories with header files and libraries.
+For example, of your file F<mysql.h> is in F</usr/include/mysql/mysql.h>,
+then enter the header directory F</usr>, likewise for
+F</usr/lib/mysql/libmysqlclient.a> or F</usr/lib/libmysqlclient.so>.
+
+
+=head1 WIN32 INSTALLATION
+
+If you are using ActivePerl, you may use ppm to install DBD-mysql.
+For Perl 5.6, upgrade to Build 623 or later, then it is sufficient
+to run
+
+ ppm install DBI
+ ppm install DBD::mysql
+
+If you need an HTTP proxy, you might need to set the environment
+variable http_proxy, for example like this:
+
+ set http_proxy=http://myproxy.com:8080/
+
+As of this writing, DBD::mysql is missing in the ActivePerl 5.8.0
+repository. However, Randy Kobes has kindly donated an own
+distribution and the following might succeed:
+
+ ppm install http://theoryx5.uwinnipeg.ca/ppms/DBD-mysql.ppd
+
+Otherwise you definitely *need* a C compiler. And it *must* be the same
+compiler that was being used for compiling Perl itself. If you don't
+have a C compiler, the file README.win32 from the Perl source
+distribution tells you where to obtain freely distributable C compilers
+like egcs or gcc. The Perl sources are available via CPAN search
+
+ http://search.cpan.org
+
+I recommend using the win32clients package for installing DBD::mysql
+under Win32, available for download on www.tcx.se. The following steps
+have been required for me:
+
+=over
+
+=item -
+
+The current Perl versions (5.6, as of this writing) do have a problem
+with detecting the C libraries. I recommend to apply the following
+patch:
+
+ *** c:\Perl\lib\ExtUtils\Liblist.pm.orig Sat Apr 15 20:03:40 2000
+ --- c:\Perl\lib\ExtUtils\Liblist.pm Sat Apr 15 20:03:45 2000
+ ***************
+ *** 230,235 ****
+ --- 230,239 ----
+ # add "$Config{installarchlib}/CORE" to default search path
+ push @libpath, "$Config{installarchlib}/CORE";
+
+ + if ($VC and exists($ENV{LIB}) and defined($ENV{LIB})) {
+ + push(@libpath, split(/;/, $ENV{LIB}));
+ + }
+ +
+ foreach (Text::ParseWords::quotewords('\s+', 0, $potential_libs)){
+
+ $thislib = $_;
+
+=item -
+
+Extract sources into F<C:\>. This will create a directory F<C:\mysql>
+with subdirectories include and lib.
+
+IMPORTANT: Make sure this subdirectory is not shared by other TCX
+files! In particular do *not* store the MySQL server in the same
+directory. If the server is already installed in F<C:\mysql>,
+choose a location like F<C:\tmp>, extract the win32clients there.
+Note that you can remove this directory entirely once you have
+installed DBD::mysql.
+
+=item -
+
+Extract the DBD::mysql sources into another directory, for
+example F<C:\src\siteperl>
+
+=item -
+
+Open a DOS shell and change directory to F<C:\src\siteperl>.
+
+=item -
+
+The next step is only required if you repeat building the modules: Make
+sure that you have a clean build tree by running
+
+ nmake realclean
+
+If you don't have VC++, replace nmake with your flavour of make. If
+error messages are reported in this step, you may safely ignore them.
+
+=item -
+
+Run
+
+ perl Makefile.PL
+
+which will prompt you for some settings. The really important ones are:
+
+ Which DBMS do you want to use?
+
+enter a 1 here (MySQL only), and
+
+ Where is your mysql installed? Please tell me the directory that
+ contains the subdir include.
+
+where you have to enter the win32clients directory, for example
+F<C:\mysql> or F<C:\tmp\mysql>.
+
+=item -
+
+Continued in the usual way:
+
+ nmake
+ nmake install
+
+=back
+
+If you want to create a PPM package for the ActiveState Perl version, then
+modify the above steps as follows: Run
+
+ perl Makefile.PL NAME=DBD-mysql BINARY_LOCATION=DBD-mysql.tar.gz
+ nmake ppd
+ nmake
+
+Once that is done, use tar and gzip (for example those from the CygWin32
+distribution) to create an archive:
+
+ mkdir x86
+ tar cf x86/DBD-mysql.tar blib
+ gzip x86/DBD-mysql.tar
+
+Put the files x86/DBD-mysql.tar.gz and DBD-mysql.ppd onto some WWW server
+and install them by typing
+
+ install http://your.server.name/your/directory/DBD-mysql.ppd
+
+in the PPM program.
+
+
+=head1 AUTHORS
+
+The current version of B<DBD::mysql> is almost completely written
+by Jochen Wiedmann, and is now being maintained by
+Patrick Galbraith (I<patg@mysql.com>).
+The first version's author was Alligator Descartes, who was aided
+and abetted by Gary Shea, Andreas König and Tim Bunce amongst others.
+
+The B<Mysql> module was originally written by Andreas König
+<koenig@kulturbox.de>. The current version, mainly an emulation
+layer, is from Jochen Wiedmann.
+
+
+=head1 COPYRIGHT
+
+
+This module is
+Large Portions Copyright (c) 2004-2006 MySQL Patrick Galbraith, Alexey Stroganov,
+Large Portions Copyright (c) 2003-2005 Rudolf Lippan; Large Portions
+Copyright (c) 1997-2003 Jochen Wiedmann, with code portions
+Copyright (c)1994-1997 their original authors This module is
+released under the same license as Perl itself. See the Perl README
+for details.
+
+
+=head1 MAILING LIST SUPPORT
+
+This module is maintained and supported on a mailing list,
+
+ perl@lists.mysql.com
+
+To subscribe to this list, go to
+
+http://lists.mysql.com/perl?sub=1
+
+Mailing list archives are available at
+
+http://lists.mysql.com/perl
+
+Additionally you might try the dbi-user mailing list for questions about
+DBI and its modules in general. Subscribe via
+
+dbi-users-subscribe@perl.org
+
+Mailing list archives are at
+
+http://groups.google.com/group/perl.dbi.users?hl=en&lr=
+
+Also, the main DBI site is at
+
+http://dbi.perl.org/
+
+=head1 ADDITIONAL DBI INFORMATION
+
+Additional information on the DBI project can be found on the World
+Wide Web at the following URL:
+
+ http://dbi.perl.org
+
+where documentation, pointers to the mailing lists and mailing list
+archives and pointers to the most current versions of the modules can
+be used.
+
+Information on the DBI interface itself can be gained by typing:
+
+ perldoc DBI
+
+right now!
+
+
+=head1 BUG REPORTING, ENHANCEMENT/FEATURE REQUESTS
+
+Please report bugs, including all the information needed
+such as DBD::mysql version, MySQL version, OS type/version, etc
+to this link:
+
+http://bugs.mysql.com/
+
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/mysql/GetInfo.pm b/Master/tlpkg/tlperl.straw/lib/DBD/mysql/GetInfo.pm
new file mode 100755
index 00000000000..9a7418a8759
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/mysql/GetInfo.pm
@@ -0,0 +1,306 @@
+package DBD::mysql::GetInfo;
+########################################
+# DBD::mysql::GetInfo
+#
+#
+# Generated by DBI::DBD::Metadata
+# $Author: capttofu $ <-- the person to blame
+# $Revision: 8435 $
+# $Date: 2006-12-23 14:03:49 -0500 (Sat, 23 Dec 2006) $
+
+use strict;
+use DBD::mysql;
+# Beware: not officially documented interfaces...
+# use DBI::Const::GetInfoType qw(%GetInfoType);
+# use DBI::Const::GetInfoReturn qw(%GetInfoReturnTypes %GetInfoReturnValues);
+
+my $sql_driver = 'mysql';
+my $sql_ver_fmt = '%02d.%02d.%04d'; # ODBC version string: ##.##.#####
+my $sql_driver_ver = do {
+ no warnings;
+ sprintf $sql_ver_fmt, split (/./, $DBD::mysql::VERSION);
+};
+
+my @Keywords = qw(
+
+BIGINT
+BLOB
+DEFAULT
+KEYS
+LIMIT
+LONGBLOB
+MEDIMUMBLOB
+MEDIUMINT
+MEDIUMTEXT
+PROCEDURE
+REGEXP
+RLIKE
+SHOW
+TABLES
+TINYBLOB
+TINYTEXT
+UNIQUE
+UNSIGNED
+ZEROFILL
+);
+
+
+sub sql_keywords {
+
+ return join ',', @Keywords;
+
+}
+
+
+
+sub sql_data_source_name {
+ my $dbh = shift;
+ return "dbi:$sql_driver:" . $dbh->{Name};
+}
+
+sub sql_user_name {
+ my $dbh = shift;
+ # Non-standard attribute
+ return $dbh->{CURRENT_USER};
+}
+
+
+####################
+# makefunc()
+# returns a ref to a sub that that calls into XS to get
+# values for info types that must needs be coded in C
+
+sub makefunk ($) {
+ my $type = shift;
+ return sub {dbd_mysql_get_info(shift, $type)}
+}
+
+
+
+
+our %info = (
+ 20 => 'N', # SQL_ACCESSIBLE_PROCEDURES
+ 19 => 'Y', # SQL_ACCESSIBLE_TABLES
+ 0 => 0, # SQL_ACTIVE_CONNECTIONS
+ 116 => 0, # SQL_ACTIVE_ENVIRONMENTS
+ 1 => 0, # SQL_ACTIVE_STATEMENTS
+ 169 => 127, # SQL_AGGREGATE_FUNCTIONS
+ 117 => 0, # SQL_ALTER_DOMAIN
+ 86 => 3, # SQL_ALTER_TABLE
+ 10021 => 0, # SQL_ASYNC_MODE
+ 120 => 2, # SQL_BATCH_ROW_COUNT
+ 121 => 2, # SQL_BATCH_SUPPORT
+ 82 => 0, # SQL_BOOKMARK_PERSISTENCE
+ 114 => 1, # SQL_CATALOG_LOCATION
+ 10003 => 'Y', # SQL_CATALOG_NAME
+ 41 => makefunk 41, # SQL_CATALOG_NAME_SEPARATOR
+ 42 => makefunk 42, # SQL_CATALOG_TERM
+ 92 => 29, # SQL_CATALOG_USAGE
+ 10004 => '', # SQL_COLLATING_SEQUENCE
+ 10004 => '', # SQL_COLLATION_SEQ
+ 87 => 'Y', # SQL_COLUMN_ALIAS
+ 22 => 0, # SQL_CONCAT_NULL_BEHAVIOR
+ 53 => 259071, # SQL_CONVERT_BIGINT
+ 54 => 0, # SQL_CONVERT_BINARY
+ 55 => 259071, # SQL_CONVERT_BIT
+ 56 => 259071, # SQL_CONVERT_CHAR
+ 57 => 259071, # SQL_CONVERT_DATE
+ 58 => 259071, # SQL_CONVERT_DECIMAL
+ 59 => 259071, # SQL_CONVERT_DOUBLE
+ 60 => 259071, # SQL_CONVERT_FLOAT
+ 48 => 0, # SQL_CONVERT_FUNCTIONS
+# 173 => undef, # SQL_CONVERT_GUID
+ 61 => 259071, # SQL_CONVERT_INTEGER
+ 123 => 0, # SQL_CONVERT_INTERVAL_DAY_TIME
+ 124 => 0, # SQL_CONVERT_INTERVAL_YEAR_MONTH
+ 71 => 0, # SQL_CONVERT_LONGVARBINARY
+ 62 => 259071, # SQL_CONVERT_LONGVARCHAR
+ 63 => 259071, # SQL_CONVERT_NUMERIC
+ 64 => 259071, # SQL_CONVERT_REAL
+ 65 => 259071, # SQL_CONVERT_SMALLINT
+ 66 => 259071, # SQL_CONVERT_TIME
+ 67 => 259071, # SQL_CONVERT_TIMESTAMP
+ 68 => 259071, # SQL_CONVERT_TINYINT
+ 69 => 0, # SQL_CONVERT_VARBINARY
+ 70 => 259071, # SQL_CONVERT_VARCHAR
+ 122 => 0, # SQL_CONVERT_WCHAR
+ 125 => 0, # SQL_CONVERT_WLONGVARCHAR
+ 126 => 0, # SQL_CONVERT_WVARCHAR
+ 74 => 1, # SQL_CORRELATION_NAME
+ 127 => 0, # SQL_CREATE_ASSERTION
+ 128 => 0, # SQL_CREATE_CHARACTER_SET
+ 129 => 0, # SQL_CREATE_COLLATION
+ 130 => 0, # SQL_CREATE_DOMAIN
+ 131 => 0, # SQL_CREATE_SCHEMA
+ 132 => 1045, # SQL_CREATE_TABLE
+ 133 => 0, # SQL_CREATE_TRANSLATION
+ 134 => 0, # SQL_CREATE_VIEW
+ 23 => 2, # SQL_CURSOR_COMMIT_BEHAVIOR
+ 24 => 2, # SQL_CURSOR_ROLLBACK_BEHAVIOR
+ 10001 => 0, # SQL_CURSOR_SENSITIVITY
+ 2 => \&sql_data_source_name, # SQL_DATA_SOURCE_NAME
+ 25 => 'N', # SQL_DATA_SOURCE_READ_ONLY
+ 119 => 7, # SQL_DATETIME_LITERALS
+ 17 => 'MySQL', # SQL_DBMS_NAME
+ 18 => makefunk 18, # SQL_DBMS_VER
+ 170 => 3, # SQL_DDL_INDEX
+ 26 => 2, # SQL_DEFAULT_TRANSACTION_ISOLATION
+ 26 => 2, # SQL_DEFAULT_TXN_ISOLATION
+ 10002 => 'N', # SQL_DESCRIBE_PARAMETER
+# 171 => undef, # SQL_DM_VER
+ 3 => 137076632, # SQL_DRIVER_HDBC
+# 135 => undef, # SQL_DRIVER_HDESC
+ 4 => 137076088, # SQL_DRIVER_HENV
+# 76 => undef, # SQL_DRIVER_HLIB
+# 5 => undef, # SQL_DRIVER_HSTMT
+ 6 => 'libmyodbc3.so', # SQL_DRIVER_NAME
+ 77 => '03.51', # SQL_DRIVER_ODBC_VER
+ 7 => $sql_driver_ver, # SQL_DRIVER_VER
+ 136 => 0, # SQL_DROP_ASSERTION
+ 137 => 0, # SQL_DROP_CHARACTER_SET
+ 138 => 0, # SQL_DROP_COLLATION
+ 139 => 0, # SQL_DROP_DOMAIN
+ 140 => 0, # SQL_DROP_SCHEMA
+ 141 => 7, # SQL_DROP_TABLE
+ 142 => 0, # SQL_DROP_TRANSLATION
+ 143 => 0, # SQL_DROP_VIEW
+ 144 => 0, # SQL_DYNAMIC_CURSOR_ATTRIBUTES1
+ 145 => 0, # SQL_DYNAMIC_CURSOR_ATTRIBUTES2
+ 27 => 'Y', # SQL_EXPRESSIONS_IN_ORDERBY
+ 8 => 63, # SQL_FETCH_DIRECTION
+ 84 => 0, # SQL_FILE_USAGE
+ 146 => 97863, # SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1
+ 147 => 6016, # SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2
+ 81 => 11, # SQL_GETDATA_EXTENSIONS
+ 88 => 3, # SQL_GROUP_BY
+ 28 => 4, # SQL_IDENTIFIER_CASE
+ #29 => sub {dbd_mysql_get_info(shift,$GetInfoType {SQL_IDENTIFIER_QUOTE_CHAR})},
+ 29 => makefunk 29, # SQL_IDENTIFIER_QUOTE_CHAR
+ 148 => 0, # SQL_INDEX_KEYWORDS
+ 149 => 0, # SQL_INFO_SCHEMA_VIEWS
+ 172 => 7, # SQL_INSERT_STATEMENT
+ 73 => 'N', # SQL_INTEGRITY
+ 150 => 0, # SQL_KEYSET_CURSOR_ATTRIBUTES1
+ 151 => 0, # SQL_KEYSET_CURSOR_ATTRIBUTES2
+ 89 => \&sql_keywords, # SQL_KEYWORDS
+ 113 => 'Y', # SQL_LIKE_ESCAPE_CLAUSE
+ 78 => 0, # SQL_LOCK_TYPES
+ 34 => 64, # SQL_MAXIMUM_CATALOG_NAME_LENGTH
+ 97 => 0, # SQL_MAXIMUM_COLUMNS_IN_GROUP_BY
+ 98 => 32, # SQL_MAXIMUM_COLUMNS_IN_INDEX
+ 99 => 0, # SQL_MAXIMUM_COLUMNS_IN_ORDER_BY
+ 100 => 0, # SQL_MAXIMUM_COLUMNS_IN_SELECT
+ 101 => 0, # SQL_MAXIMUM_COLUMNS_IN_TABLE
+ 30 => 64, # SQL_MAXIMUM_COLUMN_NAME_LENGTH
+ 1 => 0, # SQL_MAXIMUM_CONCURRENT_ACTIVITIES
+ 31 => 18, # SQL_MAXIMUM_CURSOR_NAME_LENGTH
+ 0 => 0, # SQL_MAXIMUM_DRIVER_CONNECTIONS
+ 10005 => 64, # SQL_MAXIMUM_IDENTIFIER_LENGTH
+ 102 => 500, # SQL_MAXIMUM_INDEX_SIZE
+ 104 => 0, # SQL_MAXIMUM_ROW_SIZE
+ 32 => 0, # SQL_MAXIMUM_SCHEMA_NAME_LENGTH
+ 105 => makefunk 105, # SQL_MAXIMUM_STATEMENT_LENGTH
+# 20000 => undef, # SQL_MAXIMUM_STMT_OCTETS
+# 20001 => undef, # SQL_MAXIMUM_STMT_OCTETS_DATA
+# 20002 => undef, # SQL_MAXIMUM_STMT_OCTETS_SCHEMA
+ 106 => makefunk 106, # SQL_MAXIMUM_TABLES_IN_SELECT
+ 35 => 64, # SQL_MAXIMUM_TABLE_NAME_LENGTH
+ 107 => 16, # SQL_MAXIMUM_USER_NAME_LENGTH
+ 10022 => 0, # SQL_MAX_ASYNC_CONCURRENT_STATEMENTS
+ 112 => 0, # SQL_MAX_BINARY_LITERAL_LEN
+ 34 => 64, # SQL_MAX_CATALOG_NAME_LEN
+ 108 => 0, # SQL_MAX_CHAR_LITERAL_LEN
+ 97 => 0, # SQL_MAX_COLUMNS_IN_GROUP_BY
+ 98 => 32, # SQL_MAX_COLUMNS_IN_INDEX
+ 99 => 0, # SQL_MAX_COLUMNS_IN_ORDER_BY
+ 100 => 0, # SQL_MAX_COLUMNS_IN_SELECT
+ 101 => 0, # SQL_MAX_COLUMNS_IN_TABLE
+ 30 => 64, # SQL_MAX_COLUMN_NAME_LEN
+ 1 => 0, # SQL_MAX_CONCURRENT_ACTIVITIES
+ 31 => 18, # SQL_MAX_CURSOR_NAME_LEN
+ 0 => 0, # SQL_MAX_DRIVER_CONNECTIONS
+ 10005 => 64, # SQL_MAX_IDENTIFIER_LEN
+ 102 => 500, # SQL_MAX_INDEX_SIZE
+ 32 => 0, # SQL_MAX_OWNER_NAME_LEN
+ 33 => 0, # SQL_MAX_PROCEDURE_NAME_LEN
+ 34 => 64, # SQL_MAX_QUALIFIER_NAME_LEN
+ 104 => 0, # SQL_MAX_ROW_SIZE
+ 103 => 'Y', # SQL_MAX_ROW_SIZE_INCLUDES_LONG
+ 32 => 0, # SQL_MAX_SCHEMA_NAME_LEN
+ 105 => 8192, # SQL_MAX_STATEMENT_LEN
+ 106 => 31, # SQL_MAX_TABLES_IN_SELECT
+ 35 => makefunk 35, # SQL_MAX_TABLE_NAME_LEN
+ 107 => 16, # SQL_MAX_USER_NAME_LEN
+ 37 => 'Y', # SQL_MULTIPLE_ACTIVE_TXN
+ 36 => 'Y', # SQL_MULT_RESULT_SETS
+ 111 => 'N', # SQL_NEED_LONG_DATA_LEN
+ 75 => 1, # SQL_NON_NULLABLE_COLUMNS
+ 85 => 2, # SQL_NULL_COLLATION
+ 49 => 16777215, # SQL_NUMERIC_FUNCTIONS
+ 9 => 1, # SQL_ODBC_API_CONFORMANCE
+ 152 => 2, # SQL_ODBC_INTERFACE_CONFORMANCE
+ 12 => 1, # SQL_ODBC_SAG_CLI_CONFORMANCE
+ 15 => 1, # SQL_ODBC_SQL_CONFORMANCE
+ 73 => 'N', # SQL_ODBC_SQL_OPT_IEF
+ 10 => '03.80', # SQL_ODBC_VER
+ 115 => 123, # SQL_OJ_CAPABILITIES
+ 90 => 'Y', # SQL_ORDER_BY_COLUMNS_IN_SELECT
+ 38 => 'Y', # SQL_OUTER_JOINS
+ 115 => 123, # SQL_OUTER_JOIN_CAPABILITIES
+ 39 => '', # SQL_OWNER_TERM
+ 91 => 0, # SQL_OWNER_USAGE
+ 153 => 2, # SQL_PARAM_ARRAY_ROW_COUNTS
+ 154 => 3, # SQL_PARAM_ARRAY_SELECTS
+ 80 => 3, # SQL_POSITIONED_STATEMENTS
+ 79 => 31, # SQL_POS_OPERATIONS
+ 21 => 'N', # SQL_PROCEDURES
+ 40 => '', # SQL_PROCEDURE_TERM
+ 114 => 1, # SQL_QUALIFIER_LOCATION
+ 41 => '.', # SQL_QUALIFIER_NAME_SEPARATOR
+ 42 => 'database', # SQL_QUALIFIER_TERM
+ 92 => 29, # SQL_QUALIFIER_USAGE
+ 93 => 3, # SQL_QUOTED_IDENTIFIER_CASE
+ 11 => 'N', # SQL_ROW_UPDATES
+ 39 => '', # SQL_SCHEMA_TERM
+ 91 => 0, # SQL_SCHEMA_USAGE
+ 43 => 7, # SQL_SCROLL_CONCURRENCY
+ 44 => 17, # SQL_SCROLL_OPTIONS
+ 14 => '\\', # SQL_SEARCH_PATTERN_ESCAPE
+ 13 => makefunk 13, # SQL_SERVER_NAME
+ 94 => 'ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜáíóúñÑ', # SQL_SPECIAL_CHARACTERS
+ 155 => 7, # SQL_SQL92_DATETIME_FUNCTIONS
+ 156 => 0, # SQL_SQL92_FOREIGN_KEY_DELETE_RULE
+ 157 => 0, # SQL_SQL92_FOREIGN_KEY_UPDATE_RULE
+ 158 => 8160, # SQL_SQL92_GRANT
+ 159 => 0, # SQL_SQL92_NUMERIC_VALUE_FUNCTIONS
+ 160 => 0, # SQL_SQL92_PREDICATES
+ 161 => 466, # SQL_SQL92_RELATIONAL_JOIN_OPERATORS
+ 162 => 32640, # SQL_SQL92_REVOKE
+ 163 => 7, # SQL_SQL92_ROW_VALUE_CONSTRUCTOR
+ 164 => 255, # SQL_SQL92_STRING_FUNCTIONS
+ 165 => 0, # SQL_SQL92_VALUE_EXPRESSIONS
+ 118 => 4, # SQL_SQL_CONFORMANCE
+ 166 => 2, # SQL_STANDARD_CLI_CONFORMANCE
+ 167 => 97863, # SQL_STATIC_CURSOR_ATTRIBUTES1
+ 168 => 6016, # SQL_STATIC_CURSOR_ATTRIBUTES2
+ 83 => 7, # SQL_STATIC_SENSITIVITY
+ 50 => 491519, # SQL_STRING_FUNCTIONS
+ 95 => 0, # SQL_SUBQUERIES
+ 51 => 7, # SQL_SYSTEM_FUNCTIONS
+ 45 => 'table', # SQL_TABLE_TERM
+ 109 => 0, # SQL_TIMEDATE_ADD_INTERVALS
+ 110 => 0, # SQL_TIMEDATE_DIFF_INTERVALS
+ 52 => 106495, # SQL_TIMEDATE_FUNCTIONS
+ 46 => 3, # SQL_TRANSACTION_CAPABLE
+ 72 => 15, # SQL_TRANSACTION_ISOLATION_OPTION
+ 46 => 3, # SQL_TXN_CAPABLE
+ 72 => 15, # SQL_TXN_ISOLATION_OPTION
+ 96 => 0, # SQL_UNION
+ 96 => 0, # SQL_UNION_STATEMENT
+ 47 => \&sql_user_name, # SQL_USER_NAME
+ 10000 => 1992, # SQL_XOPEN_CLI_YEAR
+);
+
+1;
+
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/DBD/mysql/INSTALL.pod b/Master/tlpkg/tlperl.straw/lib/DBD/mysql/INSTALL.pod
new file mode 100755
index 00000000000..132629c7803
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBD/mysql/INSTALL.pod
@@ -0,0 +1,801 @@
+=head1 NAME
+
+INSTALL - How to install and configure DBD::mysql
+
+
+=head1 SYNOPSIS
+
+ perl Makefile.PL [options]
+ make
+ make test
+ make install
+
+
+=head1 DESCRIPTION
+
+This document describes the installation and configuration of
+DBD::mysql, the Perl DBI driver for the MySQL database. Before
+reading on, make sure that you have the prerequisites available:
+Perl, MySQL and DBI. For details see the separate section.
+L</PREREQUISITES>.
+
+Depending on your version of Perl, it might be possible to
+use a binary distribution of DBD::mysql. If possible, this is
+recommended. Otherwise you need to install from the sources.
+If so, you will definitely need a C compiler. Installation
+from binaries and sources are both described in separate
+sections. L<BINARY INSTALLATION>. L<SOURCE INSTALLATION>.
+
+Finally, if you encounter any problems, do not forget to
+read the section on known problems. L<KNOWN PROBLEMS>. If
+that doesn't help, you should look into the archive of the
+mailing list B<perl@lists.mysql.com>. See
+http://www.mysql.com for archive locations. And if that
+still doesn't help, please post a question on this mailing
+list.
+
+
+=head1 PREREQUISITES
+
+=over
+
+=item Perl
+
+Preferrably a version of Perl, that comes preconfigured with
+your system. For example, all Linux and FreeBSD distributions
+come with Perl. For Windows, ActivePerl is recommended, see
+http://www.activestate.com for details.
+
+=item MySQL
+
+You need not install the actual MySQL database server, the
+client files and the devlopment files are sufficient. For
+example, Fedora Core 4 Linux distribution comes with RPM files
+(using YUM) B<mysql.i386> and B<mysql-server.i386> (use "yum search"
+to find exact package names). These are sufficient, if the MySQL
+server is located on a foreign machine. You may also create client
+files by compiling from the MySQL source distribution and using
+
+ configure --without-server
+
+If you are using Windows and need to compile from sources
+(which is only the case if you are not using ActivePerl),
+then you must ensure that the header and library files are
+installed. This may require choosing a "Custom installation"
+and selecting the appropriate option when running the
+MySQL setup program.
+
+=item DBI
+
+DBD::mysql is a DBI driver, hence you need DBI. It is available
+from the same source where you got the DBD::mysql distribution
+from.
+
+=item C compiler
+
+A C compiler is only required, if you install from source. In
+most cases there are binary distributions of DBD::mysql
+available. However, if you need a C compiler, make sure, that
+it is the same C compiler that was used for compiling Perl and
+MySQL! Otherwise you will almost definitely encounter problems
+because of differences in the underlying C runtime libraries.
+
+In the worst case, this might mean to compile Perl and MySQL
+yourself. But believe me, experience shows that a lot of problems
+are fixed this way.
+
+=item Gzip libraries
+
+Late versions of MySQL come with support for compression. Thus
+it B<may> be required that you have install an RPM package like
+libz-devel, libgz-devel or something similar.
+
+=back
+
+
+=head1 BINARY INSTALLATION
+
+Binary installation is possible in the most cases, depending
+on your system. I give some examples:
+
+
+=head2 Windows
+
+ActivePerl offers a PPM archive of DBD::mysql. All you need to
+do is typing
+
+ ppm
+ install DBI
+ install DBD-mysql
+
+This will fetch the modules via HTTP and install them. If you
+need to use a WWW proxy server, the environment variable
+HTTP_proxy must be set:
+
+ set HTTP_proxy=http://my.proxy.server:8000/
+ ppm
+ install DBI
+ install DBD-mysql
+
+Of course you need to replace the host name C<my.proxy.server>
+and the port number C<8000> with your local values.
+
+If the above procedure doesn't work, please upgrade to the latest
+version of ActivePerl. Versions before build 623 are known to
+have problems.
+
+PPM 3 is said to miss DBD::mysql in the repository. Thus use of
+PPM 3 is discouraged, in favour of PPM 2. If you need to use
+PPM 3, try
+
+ ppm
+ rep add PPM2 http://ppm.activestate.com/PPMPackages/5.6plus/
+ rep 2
+ install DBI
+ install DBD-mysql
+
+
+
+=head2 Red Hat Linux
+
+As of version 7.1, Red Hat Linux comes with MySQL and DBD::mysql.
+You need to ensure that the following RPM's are installed:
+
+ mysql
+ perl-DBI
+ perl-DBD-MySQL
+
+For installation from source the following RPM's are required
+
+ mysql-devel
+ libz-devel
+
+Optional are
+
+ mysql-server
+
+=head2 Fedora Core Linux
+
+As of version 3, Fedora Linux comes with MySQL and DBD::mysql.
+You need to ensure that the following RPM's are installed:
+
+ mysql or mysql-server
+ perl-DBD-MySQL
+
+For installation from source the following RPM's are required
+
+ mysql-devel
+ libz-devel
+
+Please try
+
+ yum search mysql
+
+To see the exact names
+
+Note: (important) FC 3 comes with MySQL 3.x, and some people have
+upgraded using MySQL RPMs for newer versions. If you do this, you
+must re-compile you DBD::mysql because your existing DBD::mysql will be
+linked against the old version of MySQL's client libs. CPAN has no way to
+know or detect that you have upgraded MySQL.
+
+=head2 Other systems
+
+In the case of Linux or FreeBSD distributions it is very likely
+that all you need comes with your distribution, as in the case
+of Red Hat Linux. I just cannot give you names, as I am not using
+these systems.
+
+Please let me know if you find the files in your SuSE Linux, Debian
+Linux or FreeBSD distribution so that I can extend the above list.
+
+
+=head1 SOURCE INSTALLATION
+
+So you need to install from sources. If you are lucky, the Perl
+module C<CPAN> will do all for you, thanks to the excellent work
+of Andreas Koenig. Otherwise you will need to do a manual
+installation. Some of you, in particular system administrators
+of multiple sites, will choose automatic installation. All of
+these installation types have an own section. L</CPAN installation>.
+L</Manual installation>. L</Configuration>.
+
+The DBD::mysql Makefile.PL needs to know where to find your MySQL
+installation. This may be achieved using command line switches
+(see L</Configuration>) or automatically using the mysql_config binary
+which comes with most MySQL distributions. If your MySQL distribution
+contains mysql_config the easiest method is to ensure this binary
+is on your path.
+
+e.g.
+
+ PATH=$PATH:/usr/local/mysql/bin
+ export PATH
+
+
+=head2 CPAN installation
+
+Installation of DBD::mysql can be incredibly easy:
+
+ cpan
+ install DBD::mysql
+
+If you are using the CPAN module for the first time, just answer
+the questions by accepting the defaults which are fine in most
+cases. If you are using an older version of Perl, you might
+instead need a
+
+ perl -MCPAN -e shell
+ install DBD::mysql
+
+If you cannot get the CPAN module working, you might try manual
+installation. If installation with CPAN fails because the your local
+settings have been guessed wrong, you need to ensure MySQL's
+mysql_config is on your path (see L</SOURCE INSTALLATION>) or
+alternatively create a script called C<mysql_config>. This is
+described in more details later. L</Configuration>.
+
+
+=head2 Manual installation
+
+For a manual installation you need to fetch the DBD::mysql
+source distribution. The latest version is always available
+from
+
+ http://www.cpan.org/modules/by-module/DBD/
+
+The name is typically something like
+
+ DBD-mysql-1.2216.tar.gz
+
+The archive needs to be extracted. On Windows you may use a tool
+like WinZip, on Unix you type
+
+ gzip -cd DBD-mysql-1.2216.tar.gz | tar xf -
+
+This will create a subdirectory DBD-mysql-1.2216. Enter this
+subdirectory and type
+
+ perl Makefile.PL
+ make
+ make test
+
+(On Windows you may need to replace "make" with "nmake" or
+"dmake".) If the tests seem to look fine, you may continue with
+
+ make install
+
+If the compilation (make) or tests fail, you might need to
+configure some settings.
+
+For example you might choose a different database, the C
+compiler or the linker might need some flags. L</Configuration>.
+L</Compiler flags>. L</Linker flags>.
+
+For Windows/CygWin there is a special section below.
+L<Windows/CygWin>.
+
+
+=head2 Configuration
+
+The install script "Makefile.PL" can be configured via a lot of
+switches. All switches can be used on the command line. For
+example, the test database:
+
+ perl Makefile.PL --testdb=<db>
+
+If you do not like configuring these switches on the command
+line, you may alternatively create a script called C<mysql_config>.
+This is described later on.
+
+Available switches are:
+
+=over
+
+=item testdb
+
+Name of the test database, defaults to B<test>.
+
+=item testuser
+
+Name of the test user, defaults to empty. If the name is empty,
+then the currently logged in users name will be used.
+
+=item testpassword
+
+Password of the test user, defaults to empty.
+
+=item testhost
+
+Host name or IP number of the test database; defaults to localhost.
+
+=item testport
+
+Port number of the test database
+
+=item ps-protcol=1 or 0
+
+Whether to run the test suite using server prepared statements or driver
+emulated prepared statemetns. ps-protocol=1 means use server prepare,
+ps-protocol=0 means driver emulated.
+
+=item cflags
+
+This is a list of flags that you want to give to the C compiler.
+The most important flag is the location of the MySQL header files.
+For example, on Red Hat Linux the header files are in /usr/include/mysql
+and you might try
+
+ -I/usr/include/mysql
+
+On Windows the header files may be in C:\mysql\include and you might try
+
+ -IC:\mysql\include
+
+The default flags are determined by running
+
+ mysql_config --cflags
+
+More details on the C compiler flags can be found in the following
+section. L</Compiler flags>.
+
+=item libs
+
+This is a list of flags that you want to give to the linker
+or loader. The most important flags are the locations and names
+of additional libraries. For example, on Red Hat Linux your
+MySQL client libraries are in /usr/lib/mysql and you might try
+
+ -L/usr/lib/mysql -lmysqlclient -lz
+
+On Windows the libraries may be in C:\mysql\lib and
+
+ -LC:\mysql\lib -lmysqlclient
+
+might be a good choice. The default flags are determined by running
+
+ mysql_config --libs
+
+More details on the linker flags can be found in a separate section.
+L<Linker flags>.
+
+=back
+
+If a switch is not present on the command line, then the
+script C<mysql_config> will be executed. This script comes
+as part of the MySQL distribution. For example, to determine
+the C compiler flags, we are executing
+
+ mysql_config --cflags
+ mysql_config --libs
+
+If you want to configure your own settings for database name,
+database user and so on, then you have to create a script with
+the same name, that replies
+
+
+=head2 Compiler flags
+
+Note: the folling info about compiler and linker flags, you shouldn't have
+to use these options because Makefile.PL is pretty good at utilising
+mysql_config to get the flags that you need for a successful compile.
+
+It is typically not so difficult to determine the appropriate
+flags for the C compiler. The linker flags, which you find in
+the next section, are another story.
+
+The determination of the C compiler flags is usually left to
+a configuration script called F<mysql_config>, which can be
+invoked with
+
+ mysql_config --cflags
+
+When doing so, it will emit a line with suggested C compiler
+flags, for example like this:
+
+ -L/usr/include/mysql
+
+The C compiler must find some header files. Header files have
+the extension C<.h>. MySQL header files are, for example,
+F<mysql.h> and F<mysql_version.h>. In most cases the header
+files are not installed by default. For example, on Windows
+it is an installation option of the MySQL setup program
+(Custom installation), whether the header files are installed
+or not. On Red Hat Linux, you need to install an RPM archive
+F<mysql-devel> or F<MySQL-devel>.
+
+If you know the location of the header files, then you will
+need to add an option
+
+ -L<header directory>
+
+to the C compiler flags, for example C<-L/usr/include/mysql>.
+
+
+=head2 Linker flags
+
+Appropriate linker flags are the most common source of problems
+while installing DBD::mysql. I will only give a rough overview,
+you'll find more details in the troubleshooting section.
+L<KNOWN PROBLEMS>
+
+The determination of the C compiler flags is usually left to
+a configuration script called F<mysql_config>, which can be
+invoked with
+
+ mysql_config --libs
+
+When doing so, it will emit a line with suggested C compiler
+flags, for example like this:
+
+ -L'/usr/lib/mysql' -lmysqlclient -lnsl -lm -lz -lcrypt
+
+The following items typically need to be configured for the
+linker:
+
+=over
+
+=item The mysqlclient library
+
+The MySQL client library comes as part of the MySQL distribution.
+Depending on your system it may be a file called
+
+ F<libmysqlclient.a> statically linked library, Unix
+ F<libmysqlclient.so> dynamically linked library, Unix
+ F<mysqlclient.lib> statically linked library, Windows
+ F<mysqlclient.dll> dynamically linked library, Windows
+
+or something similar.
+
+As in the case of the header files, the client library is typically
+not installed by default. On Windows you will need to select them
+while running the MySQL setup program (Custom installation). On
+Red Hat Linux an RPM archive F<mysql-devel> or F<MySQL-devel> must
+be installed.
+
+The linker needs to know the location and name of the mysqlclient
+library. This can be done by adding the flags
+
+ -L<lib directory> -lmysqlclient
+
+or by adding the complete path name. Examples:
+
+ -L/usr/lib/mysql -lmysqlclient
+ -LC:\mysql\lib -lmysqlclient
+
+If you would like to use the static libraries (and there are
+excellent reasons to do so), you need to create a separate
+directory, copy the static libraries to that place and use
+the -L switch above to point to your new directory. For example:
+
+ mkdir /tmp/mysql-static
+ cp /usr/lib/mysql/*.a /tmp/mysql-static
+ perl Makefile.PL --libs="-L/tmp/mysql-static -lmysqlclient"
+ make
+ make test
+ make install
+ rm -rf /tmp/mysql-static
+
+
+=item The gzip library
+
+The MySQL client can use compression when talking to the MySQL
+server, a nice feature when sending or receiving large texts over
+a slow network.
+
+On Unix you typically find the appropriate file name by running
+
+ ldconfig -p | grep libz
+ ldconfig -p | grep libgz
+
+Once you know the name (libz.a or libgz.a is best), just add it
+to the list of linker flags. If this seems to be causing problem
+you may also try to link without gzip libraries.
+
+=back
+
+
+=head1 SPECIAL SYSTEMS
+
+Below you find information on particular systems:
+
+
+=head2 Windows/CygWin
+
+If you are a user of Cygwin (the Redhat distribution) you already
+know, it contains a nicely running perl 5.6.1, installation of
+additional modules usually works as a charme via the standard
+procedure of
+
+ perl makefile.PL
+ make
+ make test
+ make install
+
+The Windows binary distribution of MySQL runs smoothly under Cygwin.
+You can start/stop the server and use all Windows clients without problem.
+But to install DBD::mysql you have to take a little special action.
+
+Don't attempt to build DBD::mysql against either the MySQL Windows or
+Linux/Unix BINARY distributions: neither will work!
+
+You MUST compile the MySQL clients yourself under Cygwin, to get a
+'libmysqlclient.a' compiled under Cygwin. Really! You'll only need
+that library and the header files, you don't need any other client parts.
+Continue to use the Windows binaries. And don't attempt (currently) to
+build the MySQL Server part, it is unneccessary, as MySQL AB does an
+excellent job to deliver optimized binaries for the mainstream
+operating systems, and it is told, that the server compiled under Cygwin is
+unstable.
+
+Install MySQL (if you havn't already)
+
+=over
+
+=item -
+
+download the MySQL Windows Binaries from
+http://www.mysql.com/downloads/index.html
+
+=item -
+
+unzip mysql-<version>-win.zip into some temporary location
+
+=item -
+
+start the setup.exe there and follow the instructions
+
+=item -
+
+start the server
+
+=item -
+
+alternatively download, install and start the server on a remote
+server, on what supported OS ever
+
+=back
+
+
+Build MySQL clients under Cygwin:
+
+=over
+
+=item -
+
+download the MySQL LINUX source from
+http://www.mysql.com/downloads/index.html
+
+=item -
+
+unpack mysql-<version>.tar.gz into some tmp location
+
+=item -
+
+cd into the unpacked dir mysql-<version>
+
+ ./configure --prefix=/usr/local/mysql --without-server
+
+This prepares the Makefile with the installed Cygwin features. It
+takes some time, but should finish without error. The 'prefix', as
+given, installs the whole Cygwin/MySQL thingy into a location not
+normally in your PATH, so that you continue to use already installed
+Windows binaries. The --without-server parameter tells configure to
+only build the clients.
+
+=item -
+
+ make
+
+This builds all MySQL client parts ... be patient. It should finish
+finally without any error.
+
+=item -
+
+ make install
+
+This installs the compiled client files under /usr/local/mysql/.
+Remember, you don't need anything except the library under
+/usr/local/mysql/lib and the headers under /usr/local/mysql/include!
+
+Essentially you are now done with this part. If you want, you may try
+your compiled binaries shortly; for that, do:
+
+=item -
+
+ cd /usr/local/mysql/bin
+ ./mysql -h 127.0.0.1
+
+The host (-h) parameter 127.0.0.1 targets the local host, but forces
+the mysql client to use a TCP/IP connection. The default would be a
+pipe/socket connection (even if you say '-h localhost') and this
+doesn't work between Cygwin and Windows (as far as I know).
+
+If you have your MySQL server running on some other box, then please
+substitute '127.0.0.1' with the name or IP-number of that box.
+
+=back
+
+Please note, in my environment the 'mysql' client did not accept a
+simple RETURN, I had to use CTRL-RETURN to send commands
+... strange,
+but I didn't attempt to fix that, as we are only interested in the
+built lib and headers.
+
+At the 'mysql>' prompt do a quick check:
+
+ mysql> use mysql
+ mysql> show tables;
+ mysql> select * from db;
+ mysql> exit
+
+You are now ready to build DBD::mysql!
+
+
+Build DBD::mysql:
+
+=over
+
+=item -
+
+download DBD-mysql-<version>.tar.gz from CPAN
+
+=item -
+
+unpack DBD-mysql-<version>.tar.gz
+
+=item -
+
+cd into unpacked dir DBD-mysql-<version>
+you probably did that already, if you are reading this!
+
+=item -
+
+ cp /usr/local/mysql/bin/mysql_config .
+
+This copies the executable script mentioned in the DBD::mysql docs
+from your just built Cywin/MySQL client directory; it knows about
+your Cygwin installation, especially about the right libraries to link
+with.
+
+=item -
+
+ perl Makefile.PL --testhost=127.0.0.1
+
+The --testhost=127.0.0.1 parameter again forces a TCP/IP connection
+to the MySQL server on the local host instead of a pipe/socket
+connection for the 'make test' phase.
+
+=item -
+
+ make
+
+This should run without error
+
+=item -
+
+ make test
+
+with DBD-mysql-2.1022 or earlier you will see several errors in
+dbdadmin.t, mysql.t and mysql2.t; with later versions you should not
+get errors (except possibly one, indicating, that some tables could
+not be dropped. I'm hunting for a solution to that problem, but have
+none yet).
+
+=item -
+
+ make install
+
+This installs DBD::mysql into the Perl hierarchy.
+
+=back
+
+Notes:
+
+This was tested with MySQL version 3.23.54a and DBD::mysql version
+2.1022. I patched the above mentioned test scripts and sent the
+patches
+to the author of DBD::mysql Jochen Wiedman.
+
+Georg Rehfeld 15. Jan. 2003
+
+
+=head1 KNOWN PROBLEMS
+
+=over
+
+=item 1.)
+
+Some Linux distributions don't come with a gzip library by default.
+Running "make" terminates with an error message like
+
+ LD_RUN_PATH="/usr/lib/mysql:/lib:/usr/lib" gcc
+ -o blib/arch/auto/DBD/mysql/mysql.so -shared
+ -L/usr/local/lib dbdimp.o mysql.o -L/usr/lib/mysql
+ -lmysqlclient -lm -L/usr/lib/gcc-lib/i386-redhat-linux/2.96
+ -lgcc -lz
+ /usr/bin/ld: cannot find -lz
+ collect2: ld returned 1 exit status
+ make: *** [blib/arch/auto/DBD/mysql/mysql.so] Error 1
+
+If this is the case for you, install an RPM archive like
+libz-devel, libgz-devel, zlib-devel or gzlib-devel or something
+similar.
+
+=item 2.)
+
+If Perl was compiled with gcc or egcs, but MySQL was compiled
+with another compiler or on another system, an error message like
+this is very likely when running "Make test":
+
+ t/00base............install_driver(mysql) failed: Can't load
+ '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql:
+ ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: _umoddi3
+ at /usr/local/perl-5.005/lib/5.005/i586-linux-thread/DynaLoader.pm
+ line 168.
+
+This means, that your linker doesn't include libgcc.a. You have
+the following options:
+
+The solution is telling the linker to use libgcc. Run
+
+ gcc --print-libgcc-file
+
+to determine the exact location of libgcc.a or for older versions
+of gcc
+
+ gcc -v
+
+to determine the directory. If you know the directory, add a
+
+ -L<directory> -lgcc
+
+to the list of C compiler flags. L</Configuration>. L</Linker flags>.
+
+=item 3.)
+
+There are known problems with shared versions of libmysqlclient,
+at least on some Linux boxes. If you receive an error message
+similar to
+
+ install_driver(mysql) failed: Can't load
+ '/usr/lib/perl5/site_perl/i586-linux/auto/DBD/mysql/mysql.so'
+ for module DBD::mysql: File not found at
+ /usr/lib/perl5/i586-linux/5.00404/DynaLoader.pm line 166
+
+then this error message can be misleading: It's not mysql.so
+that fails being loaded, but libmysqlclient.so! The usual
+problem is that this file is located in a directory like
+
+ /usr/lib/mysql
+
+where the linker doesn't look for it.
+
+The best workaround is using a statically linked mysqlclient
+library, for example
+
+ /usr/lib/mysql/libmysqlclient.a
+
+The use of a statically linked library is described in the
+previous section on linker flags. L</Configuration>.
+L</Linker flags>.
+
+=item 4.)
+
+Red Hat 8 & 9 set the Default locale to UTF which causes problems with
+MakeMaker. To build DBD::mysql on these systems, do a 'unset LANG'
+before runing 'perl Makefile.PL'
+
+=back
+
+
+=head1 SUPPORT
+
+Finally, if everything else fails, you are not alone. First of
+all, for an immediate answer, you should look into the archives
+of the mailing list B<perl@lists.mysql.com>. See
+http://www.mysql.com for archive locations.
+
+If you don't find an appropriate posting and reply in the
+mailing list, please post a question. Typically a reply will
+be seen within one or two days.
diff --git a/Master/tlpkg/tlperl.straw/lib/DBI.pm b/Master/tlpkg/tlperl.straw/lib/DBI.pm
new file mode 100755
index 00000000000..95b398fc751
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBI.pm
@@ -0,0 +1,7824 @@
+# $Id: DBI.pm 12812 2009-06-05 22:34:47Z timbo $
+# vim: ts=8:sw=4:noet
+#
+# Copyright (c) 1994-2009 Tim Bunce Ireland
+#
+# See COPYRIGHT section in pod text below for usage and distribution rights.
+#
+
+require 5.006_00;
+
+BEGIN {
+$DBI::VERSION = "1.609"; # ==> ALSO update the version in the pod text below!
+}
+
+=head1 NAME
+
+DBI - Database independent interface for Perl
+
+=head1 SYNOPSIS
+
+ use DBI;
+
+ @driver_names = DBI->available_drivers;
+ %drivers = DBI->installed_drivers;
+ @data_sources = DBI->data_sources($driver_name, \%attr);
+
+ $dbh = DBI->connect($data_source, $username, $auth, \%attr);
+
+ $rv = $dbh->do($statement);
+ $rv = $dbh->do($statement, \%attr);
+ $rv = $dbh->do($statement, \%attr, @bind_values);
+
+ $ary_ref = $dbh->selectall_arrayref($statement);
+ $hash_ref = $dbh->selectall_hashref($statement, $key_field);
+
+ $ary_ref = $dbh->selectcol_arrayref($statement);
+ $ary_ref = $dbh->selectcol_arrayref($statement, \%attr);
+
+ @row_ary = $dbh->selectrow_array($statement);
+ $ary_ref = $dbh->selectrow_arrayref($statement);
+ $hash_ref = $dbh->selectrow_hashref($statement);
+
+ $sth = $dbh->prepare($statement);
+ $sth = $dbh->prepare_cached($statement);
+
+ $rc = $sth->bind_param($p_num, $bind_value);
+ $rc = $sth->bind_param($p_num, $bind_value, $bind_type);
+ $rc = $sth->bind_param($p_num, $bind_value, \%attr);
+
+ $rv = $sth->execute;
+ $rv = $sth->execute(@bind_values);
+ $rv = $sth->execute_array(\%attr, ...);
+
+ $rc = $sth->bind_col($col_num, \$col_variable);
+ $rc = $sth->bind_columns(@list_of_refs_to_vars_to_bind);
+
+ @row_ary = $sth->fetchrow_array;
+ $ary_ref = $sth->fetchrow_arrayref;
+ $hash_ref = $sth->fetchrow_hashref;
+
+ $ary_ref = $sth->fetchall_arrayref;
+ $ary_ref = $sth->fetchall_arrayref( $slice, $max_rows );
+
+ $hash_ref = $sth->fetchall_hashref( $key_field );
+
+ $rv = $sth->rows;
+
+ $rc = $dbh->begin_work;
+ $rc = $dbh->commit;
+ $rc = $dbh->rollback;
+
+ $quoted_string = $dbh->quote($string);
+
+ $rc = $h->err;
+ $str = $h->errstr;
+ $rv = $h->state;
+
+ $rc = $dbh->disconnect;
+
+I<The synopsis above only lists the major methods and parameters.>
+
+
+=head2 GETTING HELP
+
+If you have questions about DBI, or DBD driver modules, you can get
+help from the I<dbi-users@perl.org> mailing list. You don't have to subscribe
+to the list in order to post, though I'd recommend it. You can get help on
+subscribing and using the list by emailing I<dbi-users-help@perl.org>.
+
+I don't recommend the DBI cpanforum (at http://www.cpanforum.com/dist/DBI)
+because relatively few people read it compared with dbi-users@perl.org.
+
+To help you make the best use of the dbi-users mailing list,
+and any other lists or forums you may use, I I<strongly>
+recommend that you read "How To Ask Questions The Smart Way"
+by Eric Raymond: L<http://www.catb.org/~esr/faqs/smart-questions.html>.
+
+If you think you've found a bug then please also read
+"How to Report Bugs Effectively" by Simon Tatham:
+L<http://www.chiark.greenend.org.uk/~sgtatham/bugs.html>.
+
+The DBI home page at L<http://dbi.perl.org/> and the DBI FAQ
+at L<http://faq.dbi-support.com/> are always worth a visit.
+They include links to other resources.
+
+Before asking any questions, reread this document, consult the
+archives and read the DBI FAQ. The archives are listed
+at the end of this document and on the DBI home page.
+
+This document often uses terms like I<references>, I<objects>,
+I<methods>. If you're not familiar with those terms then it would
+be a good idea to read at least the following perl manuals first:
+L<perlreftut>, L<perldsc>, L<perllol>, and L<perlboot>.
+
+Please note that Tim Bunce does not maintain the mailing lists or the
+web page (generous volunteers do that). So please don't send mail
+directly to him; he just doesn't have the time to answer questions
+personally. The I<dbi-users> mailing list has lots of experienced
+people who should be able to help you if you need it. If you do email
+Tim he's very likely to just forward it to the mailing list.
+
+=head2 NOTES
+
+This is the DBI specification that corresponds to the DBI version 1.609
+($Revision: 12812 $).
+
+The DBI is evolving at a steady pace, so it's good to check that
+you have the latest copy.
+
+The significant user-visible changes in each release are documented
+in the L<DBI::Changes> module so you can read them by executing
+C<perldoc DBI::Changes>.
+
+Some DBI changes require changes in the drivers, but the drivers
+can take some time to catch up. Newer versions of the DBI have
+added features that may not yet be supported by the drivers you
+use. Talk to the authors of your drivers if you need a new feature
+that's not yet supported.
+
+Features added after DBI 1.21 (February 2002) are marked in the
+text with the version number of the DBI release they first appeared in.
+
+Extensions to the DBI API often use the C<DBIx::*> namespace.
+See L</Naming Conventions and Name Space>. DBI extension modules
+can be found at L<http://search.cpan.org/search?mode=module&query=DBIx>.
+And all modules related to the DBI can be found at
+L<http://search.cpan.org/search?query=DBI&mode=all>.
+
+=cut
+
+# The POD text continues at the end of the file.
+
+
+package DBI;
+
+use Carp();
+use DynaLoader ();
+use Exporter ();
+
+BEGIN {
+@ISA = qw(Exporter DynaLoader);
+
+# Make some utility functions available if asked for
+@EXPORT = (); # we export nothing by default
+@EXPORT_OK = qw(%DBI %DBI_methods hash); # also populated by export_ok_tags:
+%EXPORT_TAGS = (
+ sql_types => [ qw(
+ SQL_GUID
+ SQL_WLONGVARCHAR
+ SQL_WVARCHAR
+ SQL_WCHAR
+ SQL_BIGINT
+ SQL_BIT
+ SQL_TINYINT
+ SQL_LONGVARBINARY
+ SQL_VARBINARY
+ SQL_BINARY
+ SQL_LONGVARCHAR
+ SQL_UNKNOWN_TYPE
+ SQL_ALL_TYPES
+ SQL_CHAR
+ SQL_NUMERIC
+ SQL_DECIMAL
+ SQL_INTEGER
+ SQL_SMALLINT
+ SQL_FLOAT
+ SQL_REAL
+ SQL_DOUBLE
+ SQL_DATETIME
+ SQL_DATE
+ SQL_INTERVAL
+ SQL_TIME
+ SQL_TIMESTAMP
+ SQL_VARCHAR
+ SQL_BOOLEAN
+ SQL_UDT
+ SQL_UDT_LOCATOR
+ SQL_ROW
+ SQL_REF
+ SQL_BLOB
+ SQL_BLOB_LOCATOR
+ SQL_CLOB
+ SQL_CLOB_LOCATOR
+ SQL_ARRAY
+ SQL_ARRAY_LOCATOR
+ SQL_MULTISET
+ SQL_MULTISET_LOCATOR
+ SQL_TYPE_DATE
+ SQL_TYPE_TIME
+ SQL_TYPE_TIMESTAMP
+ SQL_TYPE_TIME_WITH_TIMEZONE
+ SQL_TYPE_TIMESTAMP_WITH_TIMEZONE
+ SQL_INTERVAL_YEAR
+ SQL_INTERVAL_MONTH
+ SQL_INTERVAL_DAY
+ SQL_INTERVAL_HOUR
+ SQL_INTERVAL_MINUTE
+ SQL_INTERVAL_SECOND
+ SQL_INTERVAL_YEAR_TO_MONTH
+ SQL_INTERVAL_DAY_TO_HOUR
+ SQL_INTERVAL_DAY_TO_MINUTE
+ SQL_INTERVAL_DAY_TO_SECOND
+ SQL_INTERVAL_HOUR_TO_MINUTE
+ SQL_INTERVAL_HOUR_TO_SECOND
+ SQL_INTERVAL_MINUTE_TO_SECOND
+ ) ],
+ sql_cursor_types => [ qw(
+ SQL_CURSOR_FORWARD_ONLY
+ SQL_CURSOR_KEYSET_DRIVEN
+ SQL_CURSOR_DYNAMIC
+ SQL_CURSOR_STATIC
+ SQL_CURSOR_TYPE_DEFAULT
+ ) ], # for ODBC cursor types
+ utils => [ qw(
+ neat neat_list $neat_maxlen dump_results looks_like_number
+ data_string_diff data_string_desc data_diff
+ ) ],
+ profile => [ qw(
+ dbi_profile dbi_profile_merge dbi_profile_merge_nodes dbi_time
+ ) ], # notionally "in" DBI::Profile and normally imported from there
+);
+
+$DBI::dbi_debug = 0;
+$DBI::neat_maxlen = 1000;
+$DBI::stderr = 2_000_000_000; # a very round number below 2**31
+
+# If you get an error here like "Can't find loadable object ..."
+# then you haven't installed the DBI correctly. Read the README
+# then install it again.
+if ( $ENV{DBI_PUREPERL} ) {
+ eval { bootstrap DBI } if $ENV{DBI_PUREPERL} == 1;
+ require DBI::PurePerl if $@ or $ENV{DBI_PUREPERL} >= 2;
+ $DBI::PurePerl ||= 0; # just to silence "only used once" warnings
+}
+else {
+ bootstrap DBI;
+}
+
+$EXPORT_TAGS{preparse_flags} = [ grep { /^DBIpp_\w\w_/ } keys %{__PACKAGE__."::"} ];
+
+Exporter::export_ok_tags(keys %EXPORT_TAGS);
+
+}
+
+# Alias some handle methods to also be DBI class methods
+for (qw(trace_msg set_err parse_trace_flag parse_trace_flags)) {
+ no strict;
+ *$_ = \&{"DBD::_::common::$_"};
+}
+
+use strict;
+
+DBI->trace(split /=/, $ENV{DBI_TRACE}, 2) if $ENV{DBI_TRACE};
+
+$DBI::connect_via ||= "connect";
+
+# check if user wants a persistent database connection ( Apache + mod_perl )
+if ($INC{'Apache/DBI.pm'} && $ENV{MOD_PERL}) {
+ $DBI::connect_via = "Apache::DBI::connect";
+ DBI->trace_msg("DBI connect via $DBI::connect_via in $INC{'Apache/DBI.pm'}\n");
+}
+
+# check for weaken support, used by ChildHandles
+my $HAS_WEAKEN = eval {
+ require Scalar::Util;
+ # this will croak() if this Scalar::Util doesn't have a working weaken().
+ Scalar::Util::weaken( \my $test ); # same test as in t/72childhandles.t
+ 1;
+};
+
+%DBI::installed_drh = (); # maps driver names to installed driver handles
+sub installed_drivers { %DBI::installed_drh }
+%DBI::installed_methods = (); # XXX undocumented, may change
+sub installed_methods { %DBI::installed_methods }
+
+# Setup special DBI dynamic variables. See DBI::var::FETCH for details.
+# These are dynamically associated with the last handle used.
+tie $DBI::err, 'DBI::var', '*err'; # special case: referenced via IHA list
+tie $DBI::state, 'DBI::var', '"state'; # special case: referenced via IHA list
+tie $DBI::lasth, 'DBI::var', '!lasth'; # special case: return boolean
+tie $DBI::errstr, 'DBI::var', '&errstr'; # call &errstr in last used pkg
+tie $DBI::rows, 'DBI::var', '&rows'; # call &rows in last used pkg
+sub DBI::var::TIESCALAR{ my $var = $_[1]; bless \$var, 'DBI::var'; }
+sub DBI::var::STORE { Carp::croak("Can't modify \$DBI::${$_[0]} special variable") }
+
+{ # used to catch DBI->{Attrib} mistake
+ sub DBI::DBI_tie::TIEHASH { bless {} }
+ sub DBI::DBI_tie::STORE { Carp::carp("DBI->{$_[1]} is invalid syntax (you probably want \$h->{$_[1]})");}
+ *DBI::DBI_tie::FETCH = \&DBI::DBI_tie::STORE;
+}
+tie %DBI::DBI => 'DBI::DBI_tie';
+
+# --- Driver Specific Prefix Registry ---
+
+my $dbd_prefix_registry = {
+ ad_ => { class => 'DBD::AnyData', },
+ ado_ => { class => 'DBD::ADO', },
+ amzn_ => { class => 'DBD::Amazon', },
+ best_ => { class => 'DBD::BestWins', },
+ csv_ => { class => 'DBD::CSV', },
+ db2_ => { class => 'DBD::DB2', },
+ dbi_ => { class => 'DBI', },
+ dbm_ => { class => 'DBD::DBM', },
+ df_ => { class => 'DBD::DF', },
+ f_ => { class => 'DBD::File', },
+ file_ => { class => 'DBD::TextFile', },
+ go_ => { class => 'DBD::Gofer', },
+ ib_ => { class => 'DBD::InterBase', },
+ ing_ => { class => 'DBD::Ingres', },
+ ix_ => { class => 'DBD::Informix', },
+ jdbc_ => { class => 'DBD::JDBC', },
+ monetdb_ => { class => 'DBD::monetdb', },
+ msql_ => { class => 'DBD::mSQL', },
+ mvsftp_ => { class => 'DBD::MVS_FTPSQL', },
+ mysql_ => { class => 'DBD::mysql', },
+ mx_ => { class => 'DBD::Multiplex', },
+ nullp_ => { class => 'DBD::NullP', },
+ odbc_ => { class => 'DBD::ODBC', },
+ ora_ => { class => 'DBD::Oracle', },
+ pg_ => { class => 'DBD::Pg', },
+ pgpp_ => { class => 'DBD::PgPP', },
+ plb_ => { class => 'DBD::Plibdata', },
+ proxy_ => { class => 'DBD::Proxy', },
+ rdb_ => { class => 'DBD::RDB', },
+ sapdb_ => { class => 'DBD::SAP_DB', },
+ solid_ => { class => 'DBD::Solid', },
+ sponge_ => { class => 'DBD::Sponge', },
+ sql_ => { class => 'SQL::Statement', },
+ sqlite_ => { class => 'DBD::SQLite', },
+ syb_ => { class => 'DBD::Sybase', },
+ tdat_ => { class => 'DBD::Teradata', },
+ tmpl_ => { class => 'DBD::Template', },
+ tmplss_ => { class => 'DBD::TemplateSS', },
+ tuber_ => { class => 'DBD::Tuber', },
+ uni_ => { class => 'DBD::Unify', },
+ vt_ => { class => 'DBD::Vt', },
+ wmi_ => { class => 'DBD::WMI', },
+ x_ => { }, # for private use
+ xbase_ => { class => 'DBD::XBase', },
+ xl_ => { class => 'DBD::Excel', },
+ yaswi_ => { class => 'DBD::Yaswi', },
+};
+
+sub dump_dbd_registry {
+ require Data::Dumper;
+ local $Data::Dumper::Sortkeys=1;
+ local $Data::Dumper::Indent=1;
+ print Data::Dumper->Dump([$dbd_prefix_registry], [qw($dbd_prefix_registry)]);
+}
+
+# --- Dynamically create the DBI Standard Interface
+
+my $keeperr = { O=>0x0004 };
+
+%DBI::DBI_methods = ( # Define the DBI interface methods per class:
+
+ common => { # Interface methods common to all DBI handle classes
+ 'DESTROY' => { O=>0x004|0x10000 },
+ 'CLEAR' => $keeperr,
+ 'EXISTS' => $keeperr,
+ 'FETCH' => { O=>0x0404 },
+ 'FETCH_many' => { O=>0x0404 },
+ 'FIRSTKEY' => $keeperr,
+ 'NEXTKEY' => $keeperr,
+ 'STORE' => { O=>0x0418 | 0x4 },
+ _not_impl => undef,
+ can => { O=>0x0100 }, # special case, see dispatch
+ debug => { U =>[1,2,'[$debug_level]'], O=>0x0004 }, # old name for trace
+ dump_handle => { U =>[1,3,'[$message [, $level]]'], O=>0x0004 },
+ err => $keeperr,
+ errstr => $keeperr,
+ state => $keeperr,
+ func => { O=>0x0006 },
+ parse_trace_flag => { U =>[2,2,'$name'], O=>0x0404, T=>8 },
+ parse_trace_flags => { U =>[2,2,'$flags'], O=>0x0404, T=>8 },
+ private_data => { U =>[1,1], O=>0x0004 },
+ set_err => { U =>[3,6,'$err, $errmsg [, $state, $method, $rv]'], O=>0x0010 },
+ trace => { U =>[1,3,'[$trace_level, [$filename]]'], O=>0x0004 },
+ trace_msg => { U =>[2,3,'$message_text [, $min_level ]' ], O=>0x0004, T=>8 },
+ swap_inner_handle => { U =>[2,3,'$h [, $allow_reparent ]'] },
+ private_attribute_info => { },
+ visit_child_handles => { U => [2,3,'$coderef [, $info ]'], O=>0x0404, T=>4 },
+ },
+ dr => { # Database Driver Interface
+ 'connect' => { U =>[1,5,'[$db [,$user [,$passwd [,\%attr]]]]'], H=>3, O=>0x8000 },
+ 'connect_cached'=>{U=>[1,5,'[$db [,$user [,$passwd [,\%attr]]]]'], H=>3, O=>0x8000 },
+ 'disconnect_all'=>{ U =>[1,1], O=>0x0800 },
+ data_sources => { U =>[1,2,'[\%attr]' ], O=>0x0800 },
+ default_user => { U =>[3,4,'$user, $pass [, \%attr]' ] },
+ dbixs_revision => $keeperr,
+ },
+ db => { # Database Session Class Interface
+ data_sources => { U =>[1,2,'[\%attr]' ], O=>0x0200 },
+ take_imp_data => { U =>[1,1], O=>0x10000 },
+ clone => { U =>[1,2,'[\%attr]'] },
+ connected => { U =>[1,0], O => 0x0004 },
+ begin_work => { U =>[1,2,'[ \%attr ]'], O=>0x0400 },
+ commit => { U =>[1,1], O=>0x0480|0x0800 },
+ rollback => { U =>[1,1], O=>0x0480|0x0800 },
+ 'do' => { U =>[2,0,'$statement [, \%attr [, @bind_params ] ]'], O=>0x3200 },
+ last_insert_id => { U =>[5,6,'$catalog, $schema, $table_name, $field_name [, \%attr ]'], O=>0x2800 },
+ preparse => { }, # XXX
+ prepare => { U =>[2,3,'$statement [, \%attr]'], O=>0xA200 },
+ prepare_cached => { U =>[2,4,'$statement [, \%attr [, $if_active ] ]'], O=>0xA200 },
+ selectrow_array => { U =>[2,0,'$statement [, \%attr [, @bind_params ] ]'], O=>0x2000 },
+ selectrow_arrayref=>{U =>[2,0,'$statement [, \%attr [, @bind_params ] ]'], O=>0x2000 },
+ selectrow_hashref=>{ U =>[2,0,'$statement [, \%attr [, @bind_params ] ]'], O=>0x2000 },
+ selectall_arrayref=>{U =>[2,0,'$statement [, \%attr [, @bind_params ] ]'], O=>0x2000 },
+ selectall_hashref=>{ U =>[3,0,'$statement, $keyfield [, \%attr [, @bind_params ] ]'], O=>0x2000 },
+ selectcol_arrayref=>{U =>[2,0,'$statement [, \%attr [, @bind_params ] ]'], O=>0x2000 },
+ ping => { U =>[1,1], O=>0x0404 },
+ disconnect => { U =>[1,1], O=>0x0400|0x0800|0x10000 },
+ quote => { U =>[2,3, '$string [, $data_type ]' ], O=>0x0430 },
+ quote_identifier=> { U =>[2,6, '$name [, ...] [, \%attr ]' ], O=>0x0430 },
+ rows => $keeperr,
+
+ tables => { U =>[1,6,'$catalog, $schema, $table, $type [, \%attr ]' ], O=>0x2200 },
+ table_info => { U =>[1,6,'$catalog, $schema, $table, $type [, \%attr ]' ], O=>0x2200|0x8800 },
+ column_info => { U =>[5,6,'$catalog, $schema, $table, $column [, \%attr ]'],O=>0x2200|0x8800 },
+ primary_key_info=> { U =>[4,5,'$catalog, $schema, $table [, \%attr ]' ], O=>0x2200|0x8800 },
+ primary_key => { U =>[4,5,'$catalog, $schema, $table [, \%attr ]' ], O=>0x2200 },
+ foreign_key_info=> { U =>[7,8,'$pk_catalog, $pk_schema, $pk_table, $fk_catalog, $fk_schema, $fk_table [, \%attr ]' ], O=>0x2200|0x8800 },
+ statistics_info => { U =>[6,7,'$catalog, $schema, $table, $unique_only, $quick, [, \%attr ]' ], O=>0x2200|0x8800 },
+ type_info_all => { U =>[1,1], O=>0x2200|0x0800 },
+ type_info => { U =>[1,2,'$data_type'], O=>0x2200 },
+ get_info => { U =>[2,2,'$info_type'], O=>0x2200|0x0800 },
+ },
+ st => { # Statement Class Interface
+ bind_col => { U =>[3,4,'$column, \\$var [, \%attr]'] },
+ bind_columns => { U =>[2,0,'\\$var1 [, \\$var2, ...]'] },
+ bind_param => { U =>[3,4,'$parameter, $var [, \%attr]'] },
+ bind_param_inout=> { U =>[4,5,'$parameter, \\$var, $maxlen, [, \%attr]'] },
+ execute => { U =>[1,0,'[@args]'], O=>0x1040 },
+
+ bind_param_array => { U =>[3,4,'$parameter, $var [, \%attr]'] },
+ bind_param_inout_array => { U =>[4,5,'$parameter, \\@var, $maxlen, [, \%attr]'] },
+ execute_array => { U =>[2,0,'\\%attribs [, @args]'], O=>0x1040|0x4000 },
+ execute_for_fetch => { U =>[2,3,'$fetch_sub [, $tuple_status]'], O=>0x1040|0x4000 },
+
+ fetch => undef, # alias for fetchrow_arrayref
+ fetchrow_arrayref => undef,
+ fetchrow_hashref => undef,
+ fetchrow_array => undef,
+ fetchrow => undef, # old alias for fetchrow_array
+
+ fetchall_arrayref => { U =>[1,3, '[ $slice [, $max_rows]]'] },
+ fetchall_hashref => { U =>[2,2,'$key_field'] },
+
+ blob_read => { U =>[4,5,'$field, $offset, $len [, \\$buf [, $bufoffset]]'] },
+ blob_copy_to_file => { U =>[3,3,'$field, $filename_or_handleref'] },
+ dump_results => { U =>[1,5,'$maxfieldlen, $linesep, $fieldsep, $filehandle'] },
+ more_results => { U =>[1,1] },
+ finish => { U =>[1,1] },
+ cancel => { U =>[1,1], O=>0x0800 },
+ rows => $keeperr,
+
+ _get_fbav => undef,
+ _set_fbav => { T=>6 },
+ },
+);
+
+while ( my ($class, $meths) = each %DBI::DBI_methods ) {
+ my $ima_trace = 0+($ENV{DBI_IMA_TRACE}||0);
+ while ( my ($method, $info) = each %$meths ) {
+ my $fullmeth = "DBI::${class}::$method";
+ if ($DBI::dbi_debug >= 15) { # quick hack to list DBI methods
+ # and optionally filter by IMA flags
+ my $O = $info->{O}||0;
+ printf "0x%04x %-20s\n", $O, $fullmeth
+ unless $ima_trace && !($O & $ima_trace);
+ }
+ DBI->_install_method($fullmeth, 'DBI.pm', $info);
+ }
+}
+
+{
+ package DBI::common;
+ @DBI::dr::ISA = ('DBI::common');
+ @DBI::db::ISA = ('DBI::common');
+ @DBI::st::ISA = ('DBI::common');
+}
+
+# End of init code
+
+
+END {
+ return unless defined &DBI::trace_msg; # return unless bootstrap'd ok
+ local ($!,$?);
+ DBI->trace_msg(sprintf(" -- DBI::END (\$\@: %s, \$!: %s)\n", $@||'', $!||''), 2);
+ # Let drivers know why we are calling disconnect_all:
+ $DBI::PERL_ENDING = $DBI::PERL_ENDING = 1; # avoid typo warning
+ DBI->disconnect_all() if %DBI::installed_drh;
+}
+
+
+sub CLONE {
+ my $olddbis = $DBI::_dbistate;
+ _clone_dbis() unless $DBI::PurePerl; # clone the DBIS structure
+ DBI->trace_msg(sprintf "CLONE DBI for new thread %s\n",
+ $DBI::PurePerl ? "" : sprintf("(dbis %x -> %x)",$olddbis, $DBI::_dbistate));
+ while ( my ($driver, $drh) = each %DBI::installed_drh) {
+ no strict 'refs';
+ next if defined &{"DBD::${driver}::CLONE"};
+ warn("$driver has no driver CLONE() function so is unsafe threaded\n");
+ }
+ %DBI::installed_drh = (); # clear loaded drivers so they have a chance to reinitialize
+}
+
+sub parse_dsn {
+ my ($class, $dsn) = @_;
+ $dsn =~ s/^(dbi):(\w*?)(?:\((.*?)\))?://i or return;
+ my ($scheme, $driver, $attr, $attr_hash) = (lc($1), $2, $3);
+ $driver ||= $ENV{DBI_DRIVER} || '';
+ $attr_hash = { split /\s*=>?\s*|\s*,\s*/, $attr, -1 } if $attr;
+ return ($scheme, $driver, $attr, $attr_hash, $dsn);
+}
+
+sub visit_handles {
+ my ($class, $code, $outer_info) = @_;
+ $outer_info = {} if not defined $outer_info;
+ my %drh = DBI->installed_drivers;
+ for my $h (values %drh) {
+ my $child_info = $code->($h, $outer_info)
+ or next;
+ $h->visit_child_handles($code, $child_info);
+ }
+ return $outer_info;
+}
+
+
+# --- The DBI->connect Front Door methods
+
+sub connect_cached {
+ # For library code using connect_cached() with mod_perl
+ # we redirect those calls to Apache::DBI::connect() as well
+ my ($class, $dsn, $user, $pass, $attr) = @_;
+ my $dbi_connect_method = ($DBI::connect_via eq "Apache::DBI::connect")
+ ? 'Apache::DBI::connect' : 'connect_cached';
+ $attr = {
+ $attr ? %$attr : (), # clone, don't modify callers data
+ dbi_connect_method => $dbi_connect_method,
+ };
+ return $class->connect($dsn, $user, $pass, $attr);
+}
+
+sub connect {
+ my $class = shift;
+ my ($dsn, $user, $pass, $attr, $old_driver) = my @orig_args = @_;
+ my $driver;
+
+ if ($attr and !ref($attr)) { # switch $old_driver<->$attr if called in old style
+ Carp::carp("DBI->connect using 'old-style' syntax is deprecated and will be an error in future versions");
+ ($old_driver, $attr) = ($attr, $old_driver);
+ }
+
+ my $connect_meth = $attr->{dbi_connect_method};
+ $connect_meth ||= $DBI::connect_via; # fallback to default
+
+ $dsn ||= $ENV{DBI_DSN} || $ENV{DBI_DBNAME} || '' unless $old_driver;
+
+ if ($DBI::dbi_debug) {
+ local $^W = 0;
+ pop @_ if $connect_meth ne 'connect';
+ my @args = @_; $args[2] = '****'; # hide password
+ DBI->trace_msg(" -> $class->$connect_meth(".join(", ",@args).")\n");
+ }
+ Carp::croak('Usage: $class->connect([$dsn [,$user [,$passwd [,\%attr]]]])')
+ if (ref $old_driver or ($attr and not ref $attr) or ref $pass);
+
+ # extract dbi:driver prefix from $dsn into $1
+ $dsn =~ s/^dbi:(\w*?)(?:\((.*?)\))?://i
+ or '' =~ /()/; # ensure $1 etc are empty if match fails
+ my $driver_attrib_spec = $2 || '';
+
+ # Set $driver. Old style driver, if specified, overrides new dsn style.
+ $driver = $old_driver || $1 || $ENV{DBI_DRIVER}
+ or Carp::croak("Can't connect to data source '$dsn' "
+ ."because I can't work out what driver to use "
+ ."(it doesn't seem to contain a 'dbi:driver:' prefix "
+ ."and the DBI_DRIVER env var is not set)");
+
+ my $proxy;
+ if ($ENV{DBI_AUTOPROXY} && $driver ne 'Proxy' && $driver ne 'Sponge' && $driver ne 'Switch') {
+ my $dbi_autoproxy = $ENV{DBI_AUTOPROXY};
+ $proxy = 'Proxy';
+ if ($dbi_autoproxy =~ s/^dbi:(\w*?)(?:\((.*?)\))?://i) {
+ $proxy = $1;
+ $driver_attrib_spec = join ",",
+ ($driver_attrib_spec) ? $driver_attrib_spec : (),
+ ($2 ) ? $2 : ();
+ }
+ $dsn = "$dbi_autoproxy;dsn=dbi:$driver:$dsn";
+ $driver = $proxy;
+ DBI->trace_msg(" DBI_AUTOPROXY: dbi:$driver($driver_attrib_spec):$dsn\n");
+ }
+ # avoid recursion if proxy calls DBI->connect itself
+ local $ENV{DBI_AUTOPROXY} if $ENV{DBI_AUTOPROXY};
+
+ my %attributes; # take a copy we can delete from
+ if ($old_driver) {
+ %attributes = %$attr if $attr;
+ }
+ else { # new-style connect so new default semantics
+ %attributes = (
+ PrintError => 1,
+ AutoCommit => 1,
+ ref $attr ? %$attr : (),
+ # attributes in DSN take precedence over \%attr connect parameter
+ $driver_attrib_spec ? (split /\s*=>?\s*|\s*,\s*/, $driver_attrib_spec, -1) : (),
+ );
+ }
+ $attr = \%attributes; # now set $attr to refer to our local copy
+
+ my $drh = $DBI::installed_drh{$driver} || $class->install_driver($driver)
+ or die "panic: $class->install_driver($driver) failed";
+
+ # attributes in DSN take precedence over \%attr connect parameter
+ $user = $attr->{Username} if defined $attr->{Username};
+ $pass = $attr->{Password} if defined $attr->{Password};
+ delete $attr->{Password}; # always delete Password as closure stores it securely
+ if ( !(defined $user && defined $pass) ) {
+ ($user, $pass) = $drh->default_user($user, $pass, $attr);
+ }
+ $attr->{Username} = $user; # force the Username to be the actual one used
+
+ my $connect_closure = sub {
+ my ($old_dbh, $override_attr) = @_;
+
+ #use Data::Dumper;
+ #warn "connect_closure: ".Data::Dumper::Dumper([$attr,\%attributes, $override_attr]);
+
+ my $dbh;
+ unless ($dbh = $drh->$connect_meth($dsn, $user, $pass, $attr)) {
+ $user = '' if !defined $user;
+ $dsn = '' if !defined $dsn;
+ # $drh->errstr isn't safe here because $dbh->DESTROY may not have
+ # been called yet and so the dbh errstr would not have been copied
+ # up to the drh errstr. Certainly true for connect_cached!
+ my $errstr = $DBI::errstr;
+ # Getting '(no error string)' here is a symptom of a ref loop
+ $errstr = '(no error string)' if !defined $errstr;
+ my $msg = "$class connect('$dsn','$user',...) failed: $errstr";
+ DBI->trace_msg(" $msg\n");
+ # XXX HandleWarn
+ unless ($attr->{HandleError} && $attr->{HandleError}->($msg, $drh, $dbh)) {
+ Carp::croak($msg) if $attr->{RaiseError};
+ Carp::carp ($msg) if $attr->{PrintError};
+ }
+ $! = 0; # for the daft people who do DBI->connect(...) || die "$!";
+ return $dbh; # normally undef, but HandleError could change it
+ }
+
+ # merge any attribute overrides but don't change $attr itself (for closure)
+ my $apply = { ($override_attr) ? (%$attr, %$override_attr ) : %$attr };
+
+ # handle basic RootClass subclassing:
+ my $rebless_class = $apply->{RootClass} || ($class ne 'DBI' ? $class : '');
+ if ($rebless_class) {
+ no strict 'refs';
+ if ($apply->{RootClass}) { # explicit attribute (ie not static methd call class)
+ delete $apply->{RootClass};
+ DBI::_load_class($rebless_class, 0);
+ }
+ unless (@{"$rebless_class\::db::ISA"} && @{"$rebless_class\::st::ISA"}) {
+ Carp::carp("DBI subclasses '$rebless_class\::db' and ::st are not setup, RootClass ignored");
+ $rebless_class = undef;
+ $class = 'DBI';
+ }
+ else {
+ $dbh->{RootClass} = $rebless_class; # $dbh->STORE called via plain DBI::db
+ DBI::_set_isa([$rebless_class], 'DBI'); # sets up both '::db' and '::st'
+ DBI::_rebless($dbh, $rebless_class); # appends '::db'
+ }
+ }
+
+ if (%$apply) {
+
+ if ($apply->{DbTypeSubclass}) {
+ my $DbTypeSubclass = delete $apply->{DbTypeSubclass};
+ DBI::_rebless_dbtype_subclass($dbh, $rebless_class||$class, $DbTypeSubclass);
+ }
+ my $a;
+ foreach $a (qw(Profile RaiseError PrintError AutoCommit)) { # do these first
+ next unless exists $apply->{$a};
+ $dbh->{$a} = delete $apply->{$a};
+ }
+ while ( my ($a, $v) = each %$apply) {
+ eval { $dbh->{$a} = $v } or $@ && warn $@;
+ }
+ }
+
+ # confirm to driver (ie if subclassed) that we've connected sucessfully
+ # and finished the attribute setup. pass in the original arguments
+ $dbh->connected(@orig_args); #if ref $dbh ne 'DBI::db' or $proxy;
+
+ DBI->trace_msg(" <- connect= $dbh\n") if $DBI::dbi_debug;
+
+ return $dbh;
+ };
+
+ my $dbh = &$connect_closure(undef, undef);
+
+ $dbh->{dbi_connect_closure} = $connect_closure if $dbh;
+
+ return $dbh;
+}
+
+
+sub disconnect_all {
+ keys %DBI::installed_drh; # reset iterator
+ while ( my ($name, $drh) = each %DBI::installed_drh ) {
+ $drh->disconnect_all() if ref $drh;
+ }
+}
+
+
+sub disconnect { # a regular beginners bug
+ Carp::croak("DBI->disconnect is not a DBI method (read the DBI manual)");
+}
+
+
+sub install_driver { # croaks on failure
+ my $class = shift;
+ my($driver, $attr) = @_;
+ my $drh;
+
+ $driver ||= $ENV{DBI_DRIVER} || '';
+
+ # allow driver to be specified as a 'dbi:driver:' string
+ $driver = $1 if $driver =~ s/^DBI:(.*?)://i;
+
+ Carp::croak("usage: $class->install_driver(\$driver [, \%attr])")
+ unless ($driver and @_<=3);
+
+ # already installed
+ return $drh if $drh = $DBI::installed_drh{$driver};
+
+ $class->trace_msg(" -> $class->install_driver($driver"
+ .") for $^O perl=$] pid=$$ ruid=$< euid=$>\n")
+ if $DBI::dbi_debug;
+
+ # --- load the code
+ my $driver_class = "DBD::$driver";
+ eval qq{package # hide from PAUSE
+ DBI::_firesafe; # just in case
+ require $driver_class; # load the driver
+ };
+ if ($@) {
+ my $err = $@;
+ my $advice = "";
+ if ($err =~ /Can't find loadable object/) {
+ $advice = "Perhaps DBD::$driver was statically linked into a new perl binary."
+ ."\nIn which case you need to use that new perl binary."
+ ."\nOr perhaps only the .pm file was installed but not the shared object file."
+ }
+ elsif ($err =~ /Can't locate.*?DBD\/$driver\.pm in \@INC/) {
+ my @drv = $class->available_drivers(1);
+ $advice = "Perhaps the DBD::$driver perl module hasn't been fully installed,\n"
+ ."or perhaps the capitalisation of '$driver' isn't right.\n"
+ ."Available drivers: ".join(", ", @drv).".";
+ }
+ elsif ($err =~ /Can't load .*? for module DBD::/) {
+ $advice = "Perhaps a required shared library or dll isn't installed where expected";
+ }
+ elsif ($err =~ /Can't locate .*? in \@INC/) {
+ $advice = "Perhaps a module that DBD::$driver requires hasn't been fully installed";
+ }
+ Carp::croak("install_driver($driver) failed: $err$advice\n");
+ }
+ if ($DBI::dbi_debug) {
+ no strict 'refs';
+ (my $driver_file = $driver_class) =~ s/::/\//g;
+ my $dbd_ver = ${"$driver_class\::VERSION"} || "undef";
+ $class->trace_msg(" install_driver: $driver_class version $dbd_ver"
+ ." loaded from $INC{qq($driver_file.pm)}\n");
+ }
+
+ # --- do some behind-the-scenes checks and setups on the driver
+ $class->setup_driver($driver_class);
+
+ # --- run the driver function
+ $drh = eval { $driver_class->driver($attr || {}) };
+ unless ($drh && ref $drh && !$@) {
+ my $advice = "";
+ $@ ||= "$driver_class->driver didn't return a handle";
+ # catch people on case in-sensitive systems using the wrong case
+ $advice = "\nPerhaps the capitalisation of DBD '$driver' isn't right."
+ if $@ =~ /locate object method/;
+ Carp::croak("$driver_class initialisation failed: $@$advice");
+ }
+
+ $DBI::installed_drh{$driver} = $drh;
+ $class->trace_msg(" <- install_driver= $drh\n") if $DBI::dbi_debug;
+ $drh;
+}
+
+*driver = \&install_driver; # currently an alias, may change
+
+
+sub setup_driver {
+ my ($class, $driver_class) = @_;
+ my $type;
+ foreach $type (qw(dr db st)){
+ my $class = $driver_class."::$type";
+ no strict 'refs';
+ push @{"${class}::ISA"}, "DBD::_::$type"
+ unless UNIVERSAL::isa($class, "DBD::_::$type");
+ my $mem_class = "DBD::_mem::$type";
+ push @{"${class}_mem::ISA"}, $mem_class
+ unless UNIVERSAL::isa("${class}_mem", $mem_class)
+ or $DBI::PurePerl;
+ }
+}
+
+
+sub _rebless {
+ my $dbh = shift;
+ my ($outer, $inner) = DBI::_handles($dbh);
+ my $class = shift(@_).'::db';
+ bless $inner => $class;
+ bless $outer => $class; # outer last for return
+}
+
+
+sub _set_isa {
+ my ($classes, $topclass) = @_;
+ my $trace = DBI->trace_msg(" _set_isa([@$classes])\n");
+ foreach my $suffix ('::db','::st') {
+ my $previous = $topclass || 'DBI'; # trees are rooted here
+ foreach my $class (@$classes) {
+ my $base_class = $previous.$suffix;
+ my $sub_class = $class.$suffix;
+ my $sub_class_isa = "${sub_class}::ISA";
+ no strict 'refs';
+ if (@$sub_class_isa) {
+ DBI->trace_msg(" $sub_class_isa skipped (already set to @$sub_class_isa)\n")
+ if $trace;
+ }
+ else {
+ @$sub_class_isa = ($base_class) unless @$sub_class_isa;
+ DBI->trace_msg(" $sub_class_isa = $base_class\n")
+ if $trace;
+ }
+ $previous = $class;
+ }
+ }
+}
+
+
+sub _rebless_dbtype_subclass {
+ my ($dbh, $rootclass, $DbTypeSubclass) = @_;
+ # determine the db type names for class hierarchy
+ my @hierarchy = DBI::_dbtype_names($dbh, $DbTypeSubclass);
+ # add the rootclass prefix to each ('DBI::' or 'MyDBI::' etc)
+ $_ = $rootclass.'::'.$_ foreach (@hierarchy);
+ # load the modules from the 'top down'
+ DBI::_load_class($_, 1) foreach (reverse @hierarchy);
+ # setup class hierarchy if needed, does both '::db' and '::st'
+ DBI::_set_isa(\@hierarchy, $rootclass);
+ # finally bless the handle into the subclass
+ DBI::_rebless($dbh, $hierarchy[0]);
+}
+
+
+sub _dbtype_names { # list dbtypes for hierarchy, ie Informix=>ADO=>ODBC
+ my ($dbh, $DbTypeSubclass) = @_;
+
+ if ($DbTypeSubclass && $DbTypeSubclass ne '1' && ref $DbTypeSubclass ne 'CODE') {
+ # treat $DbTypeSubclass as a comma separated list of names
+ my @dbtypes = split /\s*,\s*/, $DbTypeSubclass;
+ $dbh->trace_msg(" DbTypeSubclass($DbTypeSubclass)=@dbtypes (explicit)\n");
+ return @dbtypes;
+ }
+
+ # XXX will call $dbh->get_info(17) (=SQL_DBMS_NAME) in future?
+
+ my $driver = $dbh->{Driver}->{Name};
+ if ( $driver eq 'Proxy' ) {
+ # XXX Looking into the internals of DBD::Proxy is questionable!
+ ($driver) = $dbh->{proxy_client}->{application} =~ /^DBI:(.+?):/i
+ or die "Can't determine driver name from proxy";
+ }
+
+ my @dbtypes = (ucfirst($driver));
+ if ($driver eq 'ODBC' || $driver eq 'ADO') {
+ # XXX will move these out and make extensible later:
+ my $_dbtype_name_regexp = 'Oracle'; # eg 'Oracle|Foo|Bar'
+ my %_dbtype_name_map = (
+ 'Microsoft SQL Server' => 'MSSQL',
+ 'SQL Server' => 'Sybase',
+ 'Adaptive Server Anywhere' => 'ASAny',
+ 'ADABAS D' => 'AdabasD',
+ );
+
+ my $name;
+ $name = $dbh->func(17, 'GetInfo') # SQL_DBMS_NAME
+ if $driver eq 'ODBC';
+ $name = $dbh->{ado_conn}->Properties->Item('DBMS Name')->Value
+ if $driver eq 'ADO';
+ die "Can't determine driver name! ($DBI::errstr)\n"
+ unless $name;
+
+ my $dbtype;
+ if ($_dbtype_name_map{$name}) {
+ $dbtype = $_dbtype_name_map{$name};
+ }
+ else {
+ if ($name =~ /($_dbtype_name_regexp)/) {
+ $dbtype = lc($1);
+ }
+ else { # generic mangling for other names:
+ $dbtype = lc($name);
+ }
+ $dbtype =~ s/\b(\w)/\U$1/g;
+ $dbtype =~ s/\W+/_/g;
+ }
+ # add ODBC 'behind' ADO
+ push @dbtypes, 'ODBC' if $driver eq 'ADO';
+ # add discovered dbtype in front of ADO/ODBC
+ unshift @dbtypes, $dbtype;
+ }
+ @dbtypes = &$DbTypeSubclass($dbh, \@dbtypes)
+ if (ref $DbTypeSubclass eq 'CODE');
+ $dbh->trace_msg(" DbTypeSubclass($DbTypeSubclass)=@dbtypes\n");
+ return @dbtypes;
+}
+
+sub _load_class {
+ my ($load_class, $missing_ok) = @_;
+ DBI->trace_msg(" _load_class($load_class, $missing_ok)\n", 2);
+ no strict 'refs';
+ return 1 if @{"$load_class\::ISA"}; # already loaded/exists
+ (my $module = $load_class) =~ s!::!/!g;
+ DBI->trace_msg(" _load_class require $module\n", 2);
+ eval { require "$module.pm"; };
+ return 1 unless $@;
+ return 0 if $missing_ok && $@ =~ /^Can't locate \Q$module.pm\E/;
+ die $@;
+}
+
+
+sub init_rootclass { # deprecated
+ return 1;
+}
+
+
+*internal = \&DBD::Switch::dr::driver;
+
+
+sub available_drivers {
+ my($quiet) = @_;
+ my(@drivers, $d, $f);
+ local(*DBI::DIR, $@);
+ my(%seen_dir, %seen_dbd);
+ my $haveFileSpec = eval { require File::Spec };
+ foreach $d (@INC){
+ chomp($d); # Perl 5 beta 3 bug in #!./perl -Ilib from Test::Harness
+ my $dbd_dir =
+ ($haveFileSpec ? File::Spec->catdir($d, 'DBD') : "$d/DBD");
+ next unless -d $dbd_dir;
+ next if $seen_dir{$d};
+ $seen_dir{$d} = 1;
+ # XXX we have a problem here with case insensitive file systems
+ # XXX since we can't tell what case must be used when loading.
+ opendir(DBI::DIR, $dbd_dir) || Carp::carp "opendir $dbd_dir: $!\n";
+ foreach $f (readdir(DBI::DIR)){
+ next unless $f =~ s/\.pm$//;
+ next if $f eq 'NullP';
+ if ($seen_dbd{$f}){
+ Carp::carp "DBD::$f in $d is hidden by DBD::$f in $seen_dbd{$f}\n"
+ unless $quiet;
+ } else {
+ push(@drivers, $f);
+ }
+ $seen_dbd{$f} = $d;
+ }
+ closedir(DBI::DIR);
+ }
+
+ # "return sort @drivers" will not DWIM in scalar context.
+ return wantarray ? sort @drivers : @drivers;
+}
+
+sub installed_versions {
+ my ($class, $quiet) = @_;
+ my %error;
+ my %version = ( DBI => $DBI::VERSION );
+ $version{"DBI::PurePerl"} = $DBI::PurePerl::VERSION
+ if $DBI::PurePerl;
+ for my $driver ($class->available_drivers($quiet)) {
+ next if $DBI::PurePerl && grep { -d "$_/auto/DBD/$driver" } @INC;
+ my $drh = eval {
+ local $SIG{__WARN__} = sub {};
+ $class->install_driver($driver);
+ };
+ ($error{"DBD::$driver"}=$@),next if $@;
+ no strict 'refs';
+ my $vers = ${"DBD::$driver" . '::VERSION'};
+ $version{"DBD::$driver"} = $vers || '?';
+ }
+ if (wantarray) {
+ return map { m/^DBD::(\w+)/ ? ($1) : () } sort keys %version;
+ }
+ if (!defined wantarray) { # void context
+ require Config; # add more detail
+ $version{OS} = "$^O\t($Config::Config{osvers})";
+ $version{Perl} = "$]\t($Config::Config{archname})";
+ $version{$_} = (($error{$_} =~ s/ \(\@INC.*//s),$error{$_})
+ for keys %error;
+ printf " %-16s: %s\n",$_,$version{$_}
+ for reverse sort keys %version;
+ }
+ return \%version;
+}
+
+
+sub data_sources {
+ my ($class, $driver, @other) = @_;
+ my $drh = $class->install_driver($driver);
+ my @ds = $drh->data_sources(@other);
+ return @ds;
+}
+
+
+sub neat_list {
+ my ($listref, $maxlen, $sep) = @_;
+ $maxlen = 0 unless defined $maxlen; # 0 == use internal default
+ $sep = ", " unless defined $sep;
+ join($sep, map { neat($_,$maxlen) } @$listref);
+}
+
+
+sub dump_results { # also aliased as a method in DBD::_::st
+ my ($sth, $maxlen, $lsep, $fsep, $fh) = @_;
+ return 0 unless $sth;
+ $maxlen ||= 35;
+ $lsep ||= "\n";
+ $fh ||= \*STDOUT;
+ my $rows = 0;
+ my $ref;
+ while($ref = $sth->fetch) {
+ print $fh $lsep if $rows++ and $lsep;
+ my $str = neat_list($ref,$maxlen,$fsep);
+ print $fh $str; # done on two lines to avoid 5.003 errors
+ }
+ print $fh "\n$rows rows".($DBI::err ? " ($DBI::err: $DBI::errstr)" : "")."\n";
+ $rows;
+}
+
+
+sub data_diff {
+ my ($a, $b, $logical) = @_;
+
+ my $diff = data_string_diff($a, $b);
+ return "" if $logical and !$diff;
+
+ my $a_desc = data_string_desc($a);
+ my $b_desc = data_string_desc($b);
+ return "" if !$diff and $a_desc eq $b_desc;
+
+ $diff ||= "Strings contain the same sequence of characters"
+ if length($a);
+ $diff .= "\n" if $diff;
+ return "a: $a_desc\nb: $b_desc\n$diff";
+}
+
+
+sub data_string_diff {
+ # Compares 'logical' characters, not bytes, so a latin1 string and an
+ # an equivalent unicode string will compare as equal even though their
+ # byte encodings are different.
+ my ($a, $b) = @_;
+ unless (defined $a and defined $b) { # one undef
+ return ""
+ if !defined $a and !defined $b;
+ return "String a is undef, string b has ".length($b)." characters"
+ if !defined $a;
+ return "String b is undef, string a has ".length($a)." characters"
+ if !defined $b;
+ }
+
+ require utf8;
+ # hack to cater for perl 5.6
+ *utf8::is_utf8 = sub { (DBI::neat(shift)=~/^"/) } unless defined &utf8::is_utf8;
+
+ my @a_chars = (utf8::is_utf8($a)) ? unpack("U*", $a) : unpack("C*", $a);
+ my @b_chars = (utf8::is_utf8($b)) ? unpack("U*", $b) : unpack("C*", $b);
+ my $i = 0;
+ while (@a_chars && @b_chars) {
+ ++$i, shift(@a_chars), shift(@b_chars), next
+ if $a_chars[0] == $b_chars[0];# compare ordinal values
+ my @desc = map {
+ $_ > 255 ? # if wide character...
+ sprintf("\\x{%04X}", $_) : # \x{...}
+ chr($_) =~ /[[:cntrl:]]/ ? # else if control character ...
+ sprintf("\\x%02X", $_) : # \x..
+ chr($_) # else as themselves
+ } ($a_chars[0], $b_chars[0]);
+ # highlight probable double-encoding?
+ foreach my $c ( @desc ) {
+ next unless $c =~ m/\\x\{08(..)}/;
+ $c .= "='" .chr(hex($1)) ."'"
+ }
+ return sprintf "Strings differ at index $i: a[$i]=$desc[0], b[$i]=$desc[1]";
+ }
+ return "String a truncated after $i characters" if @b_chars;
+ return "String b truncated after $i characters" if @a_chars;
+ return "";
+}
+
+
+sub data_string_desc { # describe a data string
+ my ($a) = @_;
+ require bytes;
+ require utf8;
+
+ # hacks to cater for perl 5.6
+ *utf8::is_utf8 = sub { (DBI::neat(shift)=~/^"/) } unless defined &utf8::is_utf8;
+ *utf8::valid = sub { 1 } unless defined &utf8::valid;
+
+ # Give sufficient info to help diagnose at least these kinds of situations:
+ # - valid UTF8 byte sequence but UTF8 flag not set
+ # (might be ascii so also need to check for hibit to make it worthwhile)
+ # - UTF8 flag set but invalid UTF8 byte sequence
+ # could do better here, but this'll do for now
+ my $utf8 = sprintf "UTF8 %s%s",
+ utf8::is_utf8($a) ? "on" : "off",
+ utf8::valid($a||'') ? "" : " but INVALID encoding";
+ return "$utf8, undef" unless defined $a;
+ my $is_ascii = $a =~ m/^[\000-\177]*$/;
+ return sprintf "%s, %s, %d characters %d bytes",
+ $utf8, $is_ascii ? "ASCII" : "non-ASCII",
+ length($a), bytes::length($a);
+}
+
+
+sub connect_test_perf {
+ my($class, $dsn,$dbuser,$dbpass, $attr) = @_;
+ Carp::croak("connect_test_perf needs hash ref as fourth arg") unless ref $attr;
+ # these are non standard attributes just for this special method
+ my $loops ||= $attr->{dbi_loops} || 5;
+ my $par ||= $attr->{dbi_par} || 1; # parallelism
+ my $verb ||= $attr->{dbi_verb} || 1;
+ my $meth ||= $attr->{dbi_meth} || 'connect';
+ print "$dsn: testing $loops sets of $par connections:\n";
+ require "FileHandle.pm"; # don't let toke.c create empty FileHandle package
+ local $| = 1;
+ my $drh = $class->install_driver($dsn) or Carp::croak("Can't install $dsn driver\n");
+ # test the connection and warm up caches etc
+ $drh->connect($dsn,$dbuser,$dbpass) or Carp::croak("connect failed: $DBI::errstr");
+ my $t1 = dbi_time();
+ my $loop;
+ for $loop (1..$loops) {
+ my @cons;
+ print "Connecting... " if $verb;
+ for (1..$par) {
+ print "$_ ";
+ push @cons, ($drh->connect($dsn,$dbuser,$dbpass)
+ or Carp::croak("connect failed: $DBI::errstr\n"));
+ }
+ print "\nDisconnecting...\n" if $verb;
+ for (@cons) {
+ $_->disconnect or warn "disconnect failed: $DBI::errstr"
+ }
+ }
+ my $t2 = dbi_time();
+ my $td = $t2 - $t1;
+ printf "$meth %d and disconnect them, %d times: %.4fs / %d = %.4fs\n",
+ $par, $loops, $td, $loops*$par, $td/($loops*$par);
+ return $td;
+}
+
+
+# Help people doing DBI->errstr, might even document it one day
+# XXX probably best moved to cheaper XS code if this gets documented
+sub err { $DBI::err }
+sub errstr { $DBI::errstr }
+
+
+# --- Private Internal Function for Creating New DBI Handles
+
+# XXX move to PurePerl?
+*DBI::dr::TIEHASH = \&DBI::st::TIEHASH;
+*DBI::db::TIEHASH = \&DBI::st::TIEHASH;
+
+
+# These three special constructors are called by the drivers
+# The way they are called is likely to change.
+
+our $shared_profile;
+
+sub _new_drh { # called by DBD::<drivername>::driver()
+ my ($class, $initial_attr, $imp_data) = @_;
+ # Provide default storage for State,Err and Errstr.
+ # Note that these are shared by all child handles by default! XXX
+ # State must be undef to get automatic faking in DBI::var::FETCH
+ my ($h_state_store, $h_err_store, $h_errstr_store) = (undef, 0, '');
+ my $attr = {
+ # these attributes get copied down to child handles by default
+ 'State' => \$h_state_store, # Holder for DBI::state
+ 'Err' => \$h_err_store, # Holder for DBI::err
+ 'Errstr' => \$h_errstr_store, # Holder for DBI::errstr
+ 'TraceLevel' => 0,
+ FetchHashKeyName=> 'NAME',
+ %$initial_attr,
+ };
+ my ($h, $i) = _new_handle('DBI::dr', '', $attr, $imp_data, $class);
+
+ # XXX DBI_PROFILE unless DBI::PurePerl because for some reason
+ # it kills the t/zz_*_pp.t tests (they silently exit early)
+ if ($ENV{DBI_PROFILE} && !$DBI::PurePerl) {
+ # The profile object created here when the first driver is loaded
+ # is shared by all drivers so we end up with just one set of profile
+ # data and thus the 'total time in DBI' is really the true total.
+ if (!$shared_profile) { # first time
+ $h->{Profile} = $ENV{DBI_PROFILE};
+ $shared_profile = $h->{Profile};
+ }
+ else {
+ $h->{Profile} = $shared_profile;
+ }
+ }
+ return $h unless wantarray;
+ ($h, $i);
+}
+
+sub _new_dbh { # called by DBD::<drivername>::dr::connect()
+ my ($drh, $attr, $imp_data) = @_;
+ my $imp_class = $drh->{ImplementorClass}
+ or Carp::croak("DBI _new_dbh: $drh has no ImplementorClass");
+ substr($imp_class,-4,4) = '::db';
+ my $app_class = ref $drh;
+ substr($app_class,-4,4) = '::db';
+ $attr->{Err} ||= \my $err;
+ $attr->{Errstr} ||= \my $errstr;
+ $attr->{State} ||= \my $state;
+ _new_handle($app_class, $drh, $attr, $imp_data, $imp_class);
+}
+
+sub _new_sth { # called by DBD::<drivername>::db::prepare)
+ my ($dbh, $attr, $imp_data) = @_;
+ my $imp_class = $dbh->{ImplementorClass}
+ or Carp::croak("DBI _new_sth: $dbh has no ImplementorClass");
+ substr($imp_class,-4,4) = '::st';
+ my $app_class = ref $dbh;
+ substr($app_class,-4,4) = '::st';
+ _new_handle($app_class, $dbh, $attr, $imp_data, $imp_class);
+}
+
+
+# end of DBI package
+
+
+
+# --------------------------------------------------------------------
+# === The internal DBI Switch pseudo 'driver' class ===
+
+{ package # hide from PAUSE
+ DBD::Switch::dr;
+ DBI->setup_driver('DBD::Switch'); # sets up @ISA
+
+ $DBD::Switch::dr::imp_data_size = 0;
+ $DBD::Switch::dr::imp_data_size = 0; # avoid typo warning
+ my $drh;
+
+ sub driver {
+ return $drh if $drh; # a package global
+
+ my $inner;
+ ($drh, $inner) = DBI::_new_drh('DBD::Switch::dr', {
+ 'Name' => 'Switch',
+ 'Version' => $DBI::VERSION,
+ 'Attribution' => "DBI $DBI::VERSION by Tim Bunce",
+ });
+ Carp::croak("DBD::Switch init failed!") unless ($drh && $inner);
+ return $drh;
+ }
+ sub CLONE {
+ undef $drh;
+ }
+
+ sub FETCH {
+ my($drh, $key) = @_;
+ return DBI->trace if $key eq 'DebugDispatch';
+ return undef if $key eq 'DebugLog'; # not worth fetching, sorry
+ return $drh->DBD::_::dr::FETCH($key);
+ undef;
+ }
+ sub STORE {
+ my($drh, $key, $value) = @_;
+ if ($key eq 'DebugDispatch') {
+ DBI->trace($value);
+ } elsif ($key eq 'DebugLog') {
+ DBI->trace(-1, $value);
+ } else {
+ $drh->DBD::_::dr::STORE($key, $value);
+ }
+ }
+}
+
+
+# --------------------------------------------------------------------
+# === OPTIONAL MINIMAL BASE CLASSES FOR DBI SUBCLASSES ===
+
+# We only define default methods for harmless functions.
+# We don't, for example, define a DBD::_::st::prepare()
+
+{ package # hide from PAUSE
+ DBD::_::common; # ====== Common base class methods ======
+ use strict;
+
+ # methods common to all handle types:
+
+ sub _not_impl {
+ my ($h, $method) = @_;
+ $h->trace_msg("Driver does not implement the $method method.\n");
+ return; # empty list / undef
+ }
+
+ # generic TIEHASH default methods:
+ sub FIRSTKEY { }
+ sub NEXTKEY { }
+ sub EXISTS { defined($_[0]->FETCH($_[1])) } # XXX undef?
+ sub CLEAR { Carp::carp "Can't CLEAR $_[0] (DBI)" }
+
+ sub FETCH_many { # XXX should move to C one day
+ my $h = shift;
+ # scalar is needed to workaround drivers that return an empty list
+ # for some attributes
+ return map { scalar $h->FETCH($_) } @_;
+ }
+
+ *dump_handle = \&DBI::dump_handle;
+
+ sub install_method {
+ # special class method called directly by apps and/or drivers
+ # to install new methods into the DBI dispatcher
+ # DBD::Foo::db->install_method("foo_mumble", { usage => [...], options => '...' });
+ my ($class, $method, $attr) = @_;
+ Carp::croak("Class '$class' must begin with DBD:: and end with ::db or ::st")
+ unless $class =~ /^DBD::(\w+)::(dr|db|st)$/;
+ my ($driver, $subtype) = ($1, $2);
+ Carp::croak("invalid method name '$method'")
+ unless $method =~ m/^([a-z]+_)\w+$/;
+ my $prefix = $1;
+ my $reg_info = $dbd_prefix_registry->{$prefix};
+ Carp::carp("method name prefix '$prefix' is not associated with a registered driver") unless $reg_info;
+
+ my $full_method = "DBI::${subtype}::$method";
+ $DBI::installed_methods{$full_method} = $attr;
+
+ my (undef, $filename, $line) = caller;
+ # XXX reformat $attr as needed for _install_method
+ my %attr = %{$attr||{}}; # copy so we can edit
+ DBI->_install_method("DBI::${subtype}::$method", "$filename at line $line", \%attr);
+ }
+
+ sub parse_trace_flags {
+ my ($h, $spec) = @_;
+ my $level = 0;
+ my $flags = 0;
+ my @unknown;
+ for my $word (split /\s*[|&,]\s*/, $spec) {
+ if (DBI::looks_like_number($word) && $word <= 0xF && $word >= 0) {
+ $level = $word;
+ } elsif ($word eq 'ALL') {
+ $flags = 0x7FFFFFFF; # XXX last bit causes negative headaches
+ last;
+ } elsif (my $flag = $h->parse_trace_flag($word)) {
+ $flags |= $flag;
+ }
+ else {
+ push @unknown, $word;
+ }
+ }
+ if (@unknown && (ref $h ? $h->FETCH('Warn') : 1)) {
+ Carp::carp("$h->parse_trace_flags($spec) ignored unknown trace flags: ".
+ join(" ", map { DBI::neat($_) } @unknown));
+ }
+ $flags |= $level;
+ return $flags;
+ }
+
+ sub parse_trace_flag {
+ my ($h, $name) = @_;
+ # 0xddDDDDrL (driver, DBI, reserved, Level)
+ return 0x00000100 if $name eq 'SQL';
+ return;
+ }
+
+ sub private_attribute_info {
+ return undef;
+ }
+
+ sub visit_child_handles {
+ my ($h, $code, $info) = @_;
+ $info = {} if not defined $info;
+ for my $ch (@{ $h->{ChildHandles} || []}) {
+ next unless $ch;
+ my $child_info = $code->($ch, $info)
+ or next;
+ $ch->visit_child_handles($code, $child_info);
+ }
+ return $info;
+ }
+}
+
+
+{ package # hide from PAUSE
+ DBD::_::dr; # ====== DRIVER ======
+ @DBD::_::dr::ISA = qw(DBD::_::common);
+ use strict;
+
+ sub default_user {
+ my ($drh, $user, $pass, $attr) = @_;
+ $user = $ENV{DBI_USER} unless defined $user;
+ $pass = $ENV{DBI_PASS} unless defined $pass;
+ return ($user, $pass);
+ }
+
+ sub connect { # normally overridden, but a handy default
+ my ($drh, $dsn, $user, $auth) = @_;
+ my ($this) = DBI::_new_dbh($drh, {
+ 'Name' => $dsn,
+ });
+ # XXX debatable as there's no "server side" here
+ # (and now many uses would trigger warnings on DESTROY)
+ # $this->STORE(Active => 1);
+ # so drivers should set it in their own connect
+ $this;
+ }
+
+
+ sub connect_cached {
+ my $drh = shift;
+ my ($dsn, $user, $auth, $attr) = @_;
+
+ my $cache = $drh->{CachedKids} ||= {};
+ my $key = do { local $^W;
+ join "!\001", $dsn, $user, $auth, DBI::_concat_hash_sorted($attr, "=\001", ",\001", 0, 0)
+ };
+ my $dbh = $cache->{$key};
+ $drh->trace_msg(sprintf(" connect_cached: key '$key', cached dbh $dbh\n", DBI::neat($key), DBI::neat($dbh)))
+ if $DBI::dbi_debug >= 4;
+
+ my $cb = $attr->{Callbacks}; # take care not to autovivify
+ if ($dbh && $dbh->FETCH('Active') && eval { $dbh->ping }) {
+ # If the caller has provided a callback then call it
+ if ($cb and $cb = $cb->{"connect_cached.reused"}) {
+ local $_ = "connect_cached.reused";
+ $cb->($dbh, $dsn, $user, $auth, $attr);
+ }
+ return $dbh;
+ }
+
+ # If the caller has provided a callback then call it
+ if ($cb and $cb = $cb->{"connect_cached.new"}) {
+ local $_ = "connect_cached.new";
+ $cb->($dbh, $dsn, $user, $auth, $attr);
+ }
+
+ $dbh = $drh->connect(@_);
+ $cache->{$key} = $dbh; # replace prev entry, even if connect failed
+ return $dbh;
+ }
+
+}
+
+
+{ package # hide from PAUSE
+ DBD::_::db; # ====== DATABASE ======
+ @DBD::_::db::ISA = qw(DBD::_::common);
+ use strict;
+
+ sub clone {
+ my ($old_dbh, $attr) = @_;
+ my $closure = $old_dbh->{dbi_connect_closure} or return;
+ unless ($attr) {
+ # copy attributes visible in the attribute cache
+ keys %$old_dbh; # reset iterator
+ while ( my ($k, $v) = each %$old_dbh ) {
+ # ignore non-code refs, i.e., caches, handles, Err etc
+ next if ref $v && ref $v ne 'CODE'; # HandleError etc
+ $attr->{$k} = $v;
+ }
+ # explicitly set attributes which are unlikely to be in the
+ # attribute cache, i.e., boolean's and some others
+ $attr->{$_} = $old_dbh->FETCH($_) for (qw(
+ AutoCommit ChopBlanks InactiveDestroy
+ LongTruncOk PrintError PrintWarn Profile RaiseError
+ ShowErrorStatement TaintIn TaintOut
+ ));
+ }
+ # use Data::Dumper; warn Dumper([$old_dbh, $attr]);
+ my $new_dbh = &$closure($old_dbh, $attr);
+ unless ($new_dbh) {
+ # need to copy err/errstr from driver back into $old_dbh
+ my $drh = $old_dbh->{Driver};
+ return $old_dbh->set_err($drh->err, $drh->errstr, $drh->state);
+ }
+ return $new_dbh;
+ }
+
+ sub quote_identifier {
+ my ($dbh, @id) = @_;
+ my $attr = (@id > 3 && ref($id[-1])) ? pop @id : undef;
+
+ my $info = $dbh->{dbi_quote_identifier_cache} ||= [
+ $dbh->get_info(29) || '"', # SQL_IDENTIFIER_QUOTE_CHAR
+ $dbh->get_info(41) || '.', # SQL_CATALOG_NAME_SEPARATOR
+ $dbh->get_info(114) || 1, # SQL_CATALOG_LOCATION
+ ];
+
+ my $quote = $info->[0];
+ foreach (@id) { # quote the elements
+ next unless defined;
+ s/$quote/$quote$quote/g; # escape embedded quotes
+ $_ = qq{$quote$_$quote};
+ }
+
+ # strip out catalog if present for special handling
+ my $catalog = (@id >= 3) ? shift @id : undef;
+
+ # join the dots, ignoring any null/undef elements (ie schema)
+ my $quoted_id = join '.', grep { defined } @id;
+
+ if ($catalog) { # add catalog correctly
+ $quoted_id = ($info->[2] == 2) # SQL_CL_END
+ ? $quoted_id . $info->[1] . $catalog
+ : $catalog . $info->[1] . $quoted_id;
+ }
+ return $quoted_id;
+ }
+
+ sub quote {
+ my ($dbh, $str, $data_type) = @_;
+
+ return "NULL" unless defined $str;
+ unless ($data_type) {
+ $str =~ s/'/''/g; # ISO SQL2
+ return "'$str'";
+ }
+
+ my $dbi_literal_quote_cache = $dbh->{'dbi_literal_quote_cache'} ||= [ {} , {} ];
+ my ($prefixes, $suffixes) = @$dbi_literal_quote_cache;
+
+ my $lp = $prefixes->{$data_type};
+ my $ls = $suffixes->{$data_type};
+
+ if ( ! defined $lp || ! defined $ls ) {
+ my $ti = $dbh->type_info($data_type);
+ $lp = $prefixes->{$data_type} = $ti ? $ti->{LITERAL_PREFIX} || "" : "'";
+ $ls = $suffixes->{$data_type} = $ti ? $ti->{LITERAL_SUFFIX} || "" : "'";
+ }
+ return $str unless $lp || $ls; # no quoting required
+
+ # XXX don't know what the standard says about escaping
+ # in the 'general case' (where $lp != "'").
+ # So we just do this and hope:
+ $str =~ s/$lp/$lp$lp/g
+ if $lp && $lp eq $ls && ($lp eq "'" || $lp eq '"');
+ return "$lp$str$ls";
+ }
+
+ sub rows { -1 } # here so $DBI::rows 'works' after using $dbh
+
+ sub do {
+ my($dbh, $statement, $attr, @params) = @_;
+ my $sth = $dbh->prepare($statement, $attr) or return undef;
+ $sth->execute(@params) or return undef;
+ my $rows = $sth->rows;
+ ($rows == 0) ? "0E0" : $rows;
+ }
+
+ sub _do_selectrow {
+ my ($method, $dbh, $stmt, $attr, @bind) = @_;
+ my $sth = ((ref $stmt) ? $stmt : $dbh->prepare($stmt, $attr))
+ or return;
+ $sth->execute(@bind)
+ or return;
+ my $row = $sth->$method()
+ and $sth->finish;
+ return $row;
+ }
+
+ sub selectrow_hashref { return _do_selectrow('fetchrow_hashref', @_); }
+
+ # XXX selectrow_array/ref also have C implementations in Driver.xst
+ sub selectrow_arrayref { return _do_selectrow('fetchrow_arrayref', @_); }
+ sub selectrow_array {
+ my $row = _do_selectrow('fetchrow_arrayref', @_) or return;
+ return $row->[0] unless wantarray;
+ return @$row;
+ }
+
+ # XXX selectall_arrayref also has C implementation in Driver.xst
+ # which fallsback to this if a slice is given
+ sub selectall_arrayref {
+ my ($dbh, $stmt, $attr, @bind) = @_;
+ my $sth = (ref $stmt) ? $stmt : $dbh->prepare($stmt, $attr)
+ or return;
+ $sth->execute(@bind) || return;
+ my $slice = $attr->{Slice}; # typically undef, else hash or array ref
+ if (!$slice and $slice=$attr->{Columns}) {
+ if (ref $slice eq 'ARRAY') { # map col idx to perl array idx
+ $slice = [ @{$attr->{Columns}} ]; # take a copy
+ for (@$slice) { $_-- }
+ }
+ }
+ my $rows = $sth->fetchall_arrayref($slice, my $MaxRows = $attr->{MaxRows});
+ $sth->finish if defined $MaxRows;
+ return $rows;
+ }
+
+ sub selectall_hashref {
+ my ($dbh, $stmt, $key_field, $attr, @bind) = @_;
+ my $sth = (ref $stmt) ? $stmt : $dbh->prepare($stmt, $attr);
+ return unless $sth;
+ $sth->execute(@bind) || return;
+ return $sth->fetchall_hashref($key_field);
+ }
+
+ sub selectcol_arrayref {
+ my ($dbh, $stmt, $attr, @bind) = @_;
+ my $sth = (ref $stmt) ? $stmt : $dbh->prepare($stmt, $attr);
+ return unless $sth;
+ $sth->execute(@bind) || return;
+ my @columns = ($attr->{Columns}) ? @{$attr->{Columns}} : (1);
+ my @values = (undef) x @columns;
+ my $idx = 0;
+ for (@columns) {
+ $sth->bind_col($_, \$values[$idx++]) || return;
+ }
+ my @col;
+ if (my $max = $attr->{MaxRows}) {
+ push @col, @values while @col<$max && $sth->fetch;
+ }
+ else {
+ push @col, @values while $sth->fetch;
+ }
+ return \@col;
+ }
+
+ sub prepare_cached {
+ my ($dbh, $statement, $attr, $if_active) = @_;
+
+ # Needs support at dbh level to clear cache before complaining about
+ # active children. The XS template code does this. Drivers not using
+ # the template must handle clearing the cache themselves.
+ my $cache = $dbh->{CachedKids} ||= {};
+ my $key = do { local $^W;
+ join "!\001", $statement, DBI::_concat_hash_sorted($attr, "=\001", ",\001", 0, 0)
+ };
+ my $sth = $cache->{$key};
+
+ if ($sth) {
+ return $sth unless $sth->FETCH('Active');
+ Carp::carp("prepare_cached($statement) statement handle $sth still Active")
+ unless ($if_active ||= 0);
+ $sth->finish if $if_active <= 1;
+ return $sth if $if_active <= 2;
+ }
+
+ $sth = $dbh->prepare($statement, $attr);
+ $cache->{$key} = $sth if $sth;
+
+ return $sth;
+ }
+
+ sub ping {
+ my $dbh = shift;
+ $dbh->_not_impl('ping');
+ # "0 but true" is a special kind of true 0 that is used here so
+ # applications can check if the ping was a real ping or not
+ ($dbh->FETCH('Active')) ? "0 but true" : 0;
+ }
+
+ sub begin_work {
+ my $dbh = shift;
+ return $dbh->set_err($DBI::stderr, "Already in a transaction")
+ unless $dbh->FETCH('AutoCommit');
+ $dbh->STORE('AutoCommit', 0); # will croak if driver doesn't support it
+ $dbh->STORE('BegunWork', 1); # trigger post commit/rollback action
+ return 1;
+ }
+
+ sub primary_key {
+ my ($dbh, @args) = @_;
+ my $sth = $dbh->primary_key_info(@args) or return;
+ my ($row, @col);
+ push @col, $row->[3] while ($row = $sth->fetch);
+ Carp::croak("primary_key method not called in list context")
+ unless wantarray; # leave us some elbow room
+ return @col;
+ }
+
+ sub tables {
+ my ($dbh, @args) = @_;
+ my $sth = $dbh->table_info(@args[0,1,2,3,4]) or return;
+ my $tables = $sth->fetchall_arrayref or return;
+ my @tables;
+ if ($dbh->get_info(29)) { # SQL_IDENTIFIER_QUOTE_CHAR
+ @tables = map { $dbh->quote_identifier( @{$_}[0,1,2] ) } @$tables;
+ }
+ else { # temporary old style hack (yeach)
+ @tables = map {
+ my $name = $_->[2];
+ if ($_->[1]) {
+ my $schema = $_->[1];
+ # a sad hack (mostly for Informix I recall)
+ my $quote = ($schema eq uc($schema)) ? '' : '"';
+ $name = "$quote$schema$quote.$name"
+ }
+ $name;
+ } @$tables;
+ }
+ return @tables;
+ }
+
+ sub type_info { # this should be sufficient for all drivers
+ my ($dbh, $data_type) = @_;
+ my $idx_hash;
+ my $tia = $dbh->{dbi_type_info_row_cache};
+ if ($tia) {
+ $idx_hash = $dbh->{dbi_type_info_idx_cache};
+ }
+ else {
+ my $temp = $dbh->type_info_all;
+ return unless $temp && @$temp;
+ # we cache here because type_info_all may be expensive to call
+ # (and we take a copy so the following shift can't corrupt
+ # the data that may be returned by future calls to type_info_all)
+ $tia = $dbh->{dbi_type_info_row_cache} = [ @$temp ];
+ $idx_hash = $dbh->{dbi_type_info_idx_cache} = shift @$tia;
+ }
+
+ my $dt_idx = $idx_hash->{DATA_TYPE} || $idx_hash->{data_type};
+ Carp::croak("type_info_all returned non-standard DATA_TYPE index value ($dt_idx != 1)")
+ if $dt_idx && $dt_idx != 1;
+
+ # --- simple DATA_TYPE match filter
+ my @ti;
+ my @data_type_list = (ref $data_type) ? @$data_type : ($data_type);
+ foreach $data_type (@data_type_list) {
+ if (defined($data_type) && $data_type != DBI::SQL_ALL_TYPES()) {
+ push @ti, grep { $_->[$dt_idx] == $data_type } @$tia;
+ }
+ else { # SQL_ALL_TYPES
+ push @ti, @$tia;
+ }
+ last if @ti; # found at least one match
+ }
+
+ # --- format results into list of hash refs
+ my $idx_fields = keys %$idx_hash;
+ my @idx_names = map { uc($_) } keys %$idx_hash;
+ my @idx_values = values %$idx_hash;
+ Carp::croak "type_info_all result has $idx_fields keys but ".(@{$ti[0]})." fields"
+ if @ti && @{$ti[0]} != $idx_fields;
+ my @out = map {
+ my %h; @h{@idx_names} = @{$_}[ @idx_values ]; \%h;
+ } @ti;
+ return $out[0] unless wantarray;
+ return @out;
+ }
+
+ sub data_sources {
+ my ($dbh, @other) = @_;
+ my $drh = $dbh->{Driver}; # XXX proxy issues?
+ return $drh->data_sources(@other);
+ }
+
+}
+
+
+{ package # hide from PAUSE
+ DBD::_::st; # ====== STATEMENT ======
+ @DBD::_::st::ISA = qw(DBD::_::common);
+ use strict;
+
+ sub bind_param { Carp::croak("Can't bind_param, not implement by driver") }
+
+#
+# ********************************************************
+#
+# BEGIN ARRAY BINDING
+#
+# Array binding support for drivers which don't support
+# array binding, but have sufficient interfaces to fake it.
+# NOTE: mixing scalars and arrayrefs requires using bind_param_array
+# for *all* params...unless we modify bind_param for the default
+# case...
+#
+# 2002-Apr-10 D. Arnold
+
+ sub bind_param_array {
+ my $sth = shift;
+ my ($p_id, $value_array, $attr) = @_;
+
+ return $sth->set_err($DBI::stderr, "Value for parameter $p_id must be a scalar or an arrayref, not a ".ref($value_array))
+ if defined $value_array and ref $value_array and ref $value_array ne 'ARRAY';
+
+ return $sth->set_err($DBI::stderr, "Can't use named placeholder '$p_id' for non-driver supported bind_param_array")
+ unless DBI::looks_like_number($p_id); # because we rely on execute(@ary) here
+
+ return $sth->set_err($DBI::stderr, "Placeholder '$p_id' is out of range")
+ if $p_id <= 0; # can't easily/reliably test for too big
+
+ # get/create arrayref to hold params
+ my $hash_of_arrays = $sth->{ParamArrays} ||= { };
+
+ # If the bind has attribs then we rely on the driver conforming to
+ # the DBI spec in that a single bind_param() call with those attribs
+ # makes them 'sticky' and apply to all later execute(@values) calls.
+ # Since we only call bind_param() if we're given attribs then
+ # applications using drivers that don't support bind_param can still
+ # use bind_param_array() so long as they don't pass any attribs.
+
+ $$hash_of_arrays{$p_id} = $value_array;
+ return $sth->bind_param($p_id, undef, $attr)
+ if $attr;
+ 1;
+ }
+
+ sub bind_param_inout_array {
+ my $sth = shift;
+ # XXX not supported so we just call bind_param_array instead
+ # and then return an error
+ my ($p_num, $value_array, $attr) = @_;
+ $sth->bind_param_array($p_num, $value_array, $attr);
+ return $sth->set_err($DBI::stderr, "bind_param_inout_array not supported");
+ }
+
+ sub bind_columns {
+ my $sth = shift;
+ my $fields = $sth->FETCH('NUM_OF_FIELDS') || 0;
+ if ($fields <= 0 && !$sth->{Active}) {
+ return $sth->set_err($DBI::stderr, "Statement has no result columns to bind"
+ ." (perhaps you need to successfully call execute first)");
+ }
+ # Backwards compatibility for old-style call with attribute hash
+ # ref as first arg. Skip arg if undef or a hash ref.
+ my $attr;
+ $attr = shift if !defined $_[0] or ref($_[0]) eq 'HASH';
+
+ my $idx = 0;
+ $sth->bind_col(++$idx, shift, $attr) or return
+ while (@_ and $idx < $fields);
+
+ return $sth->set_err($DBI::stderr, "bind_columns called with ".($idx+@_)." values but $fields are needed")
+ if @_ or $idx != $fields;
+
+ return 1;
+ }
+
+ sub execute_array {
+ my $sth = shift;
+ my ($attr, @array_of_arrays) = @_;
+ my $NUM_OF_PARAMS = $sth->FETCH('NUM_OF_PARAMS'); # may be undef at this point
+
+ # get tuple status array or hash attribute
+ my $tuple_sts = $attr->{ArrayTupleStatus};
+ return $sth->set_err($DBI::stderr, "ArrayTupleStatus attribute must be an arrayref")
+ if $tuple_sts and ref $tuple_sts ne 'ARRAY';
+
+ # bind all supplied arrays
+ if (@array_of_arrays) {
+ $sth->{ParamArrays} = { }; # clear out old params
+ return $sth->set_err($DBI::stderr,
+ @array_of_arrays." bind values supplied but $NUM_OF_PARAMS expected")
+ if defined ($NUM_OF_PARAMS) && @array_of_arrays != $NUM_OF_PARAMS;
+ $sth->bind_param_array($_, $array_of_arrays[$_-1]) or return
+ foreach (1..@array_of_arrays);
+ }
+
+ my $fetch_tuple_sub;
+
+ if ($fetch_tuple_sub = $attr->{ArrayTupleFetch}) { # fetch on demand
+
+ return $sth->set_err($DBI::stderr,
+ "Can't use both ArrayTupleFetch and explicit bind values")
+ if @array_of_arrays; # previous bind_param_array calls will simply be ignored
+
+ if (UNIVERSAL::isa($fetch_tuple_sub,'DBI::st')) {
+ my $fetch_sth = $fetch_tuple_sub;
+ return $sth->set_err($DBI::stderr,
+ "ArrayTupleFetch sth is not Active, need to execute() it first")
+ unless $fetch_sth->{Active};
+ # check column count match to give more friendly message
+ my $NUM_OF_FIELDS = $fetch_sth->{NUM_OF_FIELDS};
+ return $sth->set_err($DBI::stderr,
+ "$NUM_OF_FIELDS columns from ArrayTupleFetch sth but $NUM_OF_PARAMS expected")
+ if defined($NUM_OF_FIELDS) && defined($NUM_OF_PARAMS)
+ && $NUM_OF_FIELDS != $NUM_OF_PARAMS;
+ $fetch_tuple_sub = sub { $fetch_sth->fetchrow_arrayref };
+ }
+ elsif (!UNIVERSAL::isa($fetch_tuple_sub,'CODE')) {
+ return $sth->set_err($DBI::stderr, "ArrayTupleFetch '$fetch_tuple_sub' is not a code ref or statement handle");
+ }
+
+ }
+ else {
+ my $NUM_OF_PARAMS_given = keys %{ $sth->{ParamArrays} || {} };
+ return $sth->set_err($DBI::stderr,
+ "$NUM_OF_PARAMS_given bind values supplied but $NUM_OF_PARAMS expected")
+ if defined($NUM_OF_PARAMS) && $NUM_OF_PARAMS != $NUM_OF_PARAMS_given;
+
+ # get the length of a bound array
+ my $maxlen;
+ my %hash_of_arrays = %{$sth->{ParamArrays}};
+ foreach (keys(%hash_of_arrays)) {
+ my $ary = $hash_of_arrays{$_};
+ next unless ref $ary eq 'ARRAY';
+ $maxlen = @$ary if !$maxlen || @$ary > $maxlen;
+ }
+ # if there are no arrays then execute scalars once
+ $maxlen = 1 unless defined $maxlen;
+ my @bind_ids = 1..keys(%hash_of_arrays);
+
+ my $tuple_idx = 0;
+ $fetch_tuple_sub = sub {
+ return if $tuple_idx >= $maxlen;
+ my @tuple = map {
+ my $a = $hash_of_arrays{$_};
+ ref($a) ? $a->[$tuple_idx] : $a
+ } @bind_ids;
+ ++$tuple_idx;
+ return \@tuple;
+ };
+ }
+ # pass thru the callers scalar or list context
+ return $sth->execute_for_fetch($fetch_tuple_sub, $tuple_sts);
+ }
+
+ sub execute_for_fetch {
+ my ($sth, $fetch_tuple_sub, $tuple_status) = @_;
+ # start with empty status array
+ ($tuple_status) ? @$tuple_status = () : $tuple_status = [];
+
+ my $rc_total = 0;
+ my $err_count;
+ while ( my $tuple = &$fetch_tuple_sub() ) {
+ if ( my $rc = $sth->execute(@$tuple) ) {
+ push @$tuple_status, $rc;
+ $rc_total = ($rc >= 0 && $rc_total >= 0) ? $rc_total + $rc : -1;
+ }
+ else {
+ $err_count++;
+ push @$tuple_status, [ $sth->err, $sth->errstr, $sth->state ];
+ # XXX drivers implementing execute_for_fetch could opt to "last;" here
+ # if they know the error code means no further executes will work.
+ }
+ }
+ my $tuples = @$tuple_status;
+ return $sth->set_err($DBI::stderr, "executing $tuples generated $err_count errors")
+ if $err_count;
+ $tuples ||= "0E0";
+ return $tuples unless wantarray;
+ return ($tuples, $rc_total);
+ }
+
+
+ sub fetchall_arrayref { # ALSO IN Driver.xst
+ my ($sth, $slice, $max_rows) = @_;
+
+ # when batch fetching with $max_rows were very likely to try to
+ # fetch the 'next batch' after the previous batch returned
+ # <=$max_rows. So don't treat that as an error.
+ return undef if $max_rows and not $sth->FETCH('Active');
+
+ my $mode = ref($slice) || 'ARRAY';
+ my @rows;
+ my $row;
+ if ($mode eq 'ARRAY') {
+ # we copy the array here because fetch (currently) always
+ # returns the same array ref. XXX
+ if ($slice && @$slice) {
+ $max_rows = -1 unless defined $max_rows;
+ push @rows, [ @{$row}[ @$slice] ]
+ while($max_rows-- and $row = $sth->fetch);
+ }
+ elsif (defined $max_rows) {
+ push @rows, [ @$row ]
+ while($max_rows-- and $row = $sth->fetch);
+ }
+ else {
+ push @rows, [ @$row ] while($row = $sth->fetch);
+ }
+ }
+ elsif ($mode eq 'HASH') {
+ $max_rows = -1 unless defined $max_rows;
+ if (keys %$slice) {
+ my @o_keys = keys %$slice;
+ my @i_keys = map { lc } keys %$slice;
+ # XXX this could be made faster by pre-binding a local hash
+ # using bind_columns and then copying it per row
+ while ($max_rows-- and $row = $sth->fetchrow_hashref('NAME_lc')) {
+ my %hash;
+ @hash{@o_keys} = @{$row}{@i_keys};
+ push @rows, \%hash;
+ }
+ }
+ else {
+ # XXX assumes new ref each fetchhash
+ push @rows, $row
+ while ($max_rows-- and $row = $sth->fetchrow_hashref());
+ }
+ }
+ else { Carp::croak("fetchall_arrayref($mode) invalid") }
+ return \@rows;
+ }
+
+ sub fetchall_hashref {
+ my ($sth, $key_field) = @_;
+
+ my $hash_key_name = $sth->{FetchHashKeyName} || 'NAME';
+ my $names_hash = $sth->FETCH("${hash_key_name}_hash");
+ my @key_fields = (ref $key_field) ? @$key_field : ($key_field);
+ my @key_indexes;
+ my $num_of_fields = $sth->FETCH('NUM_OF_FIELDS');
+ foreach (@key_fields) {
+ my $index = $names_hash->{$_}; # perl index not column
+ $index = $_ - 1 if !defined $index && DBI::looks_like_number($_) && $_>=1 && $_ <= $num_of_fields;
+ return $sth->set_err($DBI::stderr, "Field '$_' does not exist (not one of @{[keys %$names_hash]})")
+ unless defined $index;
+ push @key_indexes, $index;
+ }
+ my $rows = {};
+ my $NAME = $sth->FETCH($hash_key_name);
+ my @row = (undef) x $num_of_fields;
+ $sth->bind_columns(\(@row));
+ while ($sth->fetch) {
+ my $ref = $rows;
+ $ref = $ref->{$row[$_]} ||= {} for @key_indexes;
+ @{$ref}{@$NAME} = @row;
+ }
+ return $rows;
+ }
+
+ *dump_results = \&DBI::dump_results;
+
+ sub blob_copy_to_file { # returns length or undef on error
+ my($self, $field, $filename_or_handleref, $blocksize) = @_;
+ my $fh = $filename_or_handleref;
+ my($len, $buf) = (0, "");
+ $blocksize ||= 512; # not too ambitious
+ local(*FH);
+ unless(ref $fh) {
+ open(FH, ">$fh") || return undef;
+ $fh = \*FH;
+ }
+ while(defined($self->blob_read($field, $len, $blocksize, \$buf))) {
+ print $fh $buf;
+ $len += length $buf;
+ }
+ close(FH);
+ $len;
+ }
+
+ sub more_results {
+ shift->{syb_more_results}; # handy grandfathering
+ }
+
+}
+
+unless ($DBI::PurePerl) { # See install_driver
+ { @DBD::_mem::dr::ISA = qw(DBD::_mem::common); }
+ { @DBD::_mem::db::ISA = qw(DBD::_mem::common); }
+ { @DBD::_mem::st::ISA = qw(DBD::_mem::common); }
+ # DBD::_mem::common::DESTROY is implemented in DBI.xs
+}
+
+1;
+__END__
+
+=head1 DESCRIPTION
+
+The DBI is a database access module for the Perl programming language. It defines
+a set of methods, variables, and conventions that provide a consistent
+database interface, independent of the actual database being used.
+
+It is important to remember that the DBI is just an interface.
+The DBI is a layer
+of "glue" between an application and one or more database I<driver>
+modules. It is the driver modules which do most of the real work. The DBI
+provides a standard interface and framework for the drivers to operate
+within.
+
+
+=head2 Architecture of a DBI Application
+
+ |<- Scope of DBI ->|
+ .-. .--------------. .-------------.
+ .-------. | |---| XYZ Driver |---| XYZ Engine |
+ | Perl | | | `--------------' `-------------'
+ | script| |A| |D| .--------------. .-------------.
+ | using |--|P|--|B|---|Oracle Driver |---|Oracle Engine|
+ | DBI | |I| |I| `--------------' `-------------'
+ | API | | |...
+ |methods| | |... Other drivers
+ `-------' | |...
+ `-'
+
+The API, or Application Programming Interface, defines the
+call interface and variables for Perl scripts to use. The API
+is implemented by the Perl DBI extension.
+
+The DBI "dispatches" the method calls to the appropriate driver for
+actual execution. The DBI is also responsible for the dynamic loading
+of drivers, error checking and handling, providing default
+implementations for methods, and many other non-database specific duties.
+
+Each driver
+contains implementations of the DBI methods using the
+private interface functions of the corresponding database engine. Only authors
+of sophisticated/multi-database applications or generic library
+functions need be concerned with drivers.
+
+=head2 Notation and Conventions
+
+The following conventions are used in this document:
+
+ $dbh Database handle object
+ $sth Statement handle object
+ $drh Driver handle object (rarely seen or used in applications)
+ $h Any of the handle types above ($dbh, $sth, or $drh)
+ $rc General Return Code (boolean: true=ok, false=error)
+ $rv General Return Value (typically an integer)
+ @ary List of values returned from the database, typically a row of data
+ $rows Number of rows processed (if available, else -1)
+ $fh A filehandle
+ undef NULL values are represented by undefined values in Perl
+ \%attr Reference to a hash of attribute values passed to methods
+
+Note that Perl will automatically destroy database and statement handle objects
+if all references to them are deleted.
+
+
+=head2 Outline Usage
+
+To use DBI,
+first you need to load the DBI module:
+
+ use DBI;
+ use strict;
+
+(The C<use strict;> isn't required but is strongly recommended.)
+
+Then you need to L</connect> to your data source and get a I<handle> for that
+connection:
+
+ $dbh = DBI->connect($dsn, $user, $password,
+ { RaiseError => 1, AutoCommit => 0 });
+
+Since connecting can be expensive, you generally just connect at the
+start of your program and disconnect at the end.
+
+Explicitly defining the required C<AutoCommit> behaviour is strongly
+recommended and may become mandatory in a later version. This
+determines whether changes are automatically committed to the
+database when executed, or need to be explicitly committed later.
+
+The DBI allows an application to "prepare" statements for later
+execution. A prepared statement is identified by a statement handle
+held in a Perl variable.
+We'll call the Perl variable C<$sth> in our examples.
+
+The typical method call sequence for a C<SELECT> statement is:
+
+ prepare,
+ execute, fetch, fetch, ...
+ execute, fetch, fetch, ...
+ execute, fetch, fetch, ...
+
+for example:
+
+ $sth = $dbh->prepare("SELECT foo, bar FROM table WHERE baz=?");
+
+ $sth->execute( $baz );
+
+ while ( @row = $sth->fetchrow_array ) {
+ print "@row\n";
+ }
+
+The typical method call sequence for a I<non>-C<SELECT> statement is:
+
+ prepare,
+ execute,
+ execute,
+ execute.
+
+for example:
+
+ $sth = $dbh->prepare("INSERT INTO table(foo,bar,baz) VALUES (?,?,?)");
+
+ while(<CSV>) {
+ chomp;
+ my ($foo,$bar,$baz) = split /,/;
+ $sth->execute( $foo, $bar, $baz );
+ }
+
+The C<do()> method can be used for non repeated I<non>-C<SELECT> statement
+(or with drivers that don't support placeholders):
+
+ $rows_affected = $dbh->do("UPDATE your_table SET foo = foo + 1");
+
+To commit your changes to the database (when L</AutoCommit> is off):
+
+ $dbh->commit; # or call $dbh->rollback; to undo changes
+
+Finally, when you have finished working with the data source, you should
+L</disconnect> from it:
+
+ $dbh->disconnect;
+
+
+=head2 General Interface Rules & Caveats
+
+The DBI does not have a concept of a "current session". Every session
+has a handle object (i.e., a C<$dbh>) returned from the C<connect> method.
+That handle object is used to invoke database related methods.
+
+Most data is returned to the Perl script as strings. (Null values are
+returned as C<undef>.) This allows arbitrary precision numeric data to be
+handled without loss of accuracy. Beware that Perl may not preserve
+the same accuracy when the string is used as a number.
+
+Dates and times are returned as character strings in the current
+default format of the corresponding database engine. Time zone effects
+are database/driver dependent.
+
+Perl supports binary data in Perl strings, and the DBI will pass binary
+data to and from the driver without change. It is up to the driver
+implementors to decide how they wish to handle such binary data.
+
+Perl supports two kinds of strings: unicode (utf8 internally) and non-unicode
+(defaults to iso-8859-1 if forced to assume an encoding). Drivers should
+accept both kinds of strings and, if required, convert them to the character
+set of the database being used. Similarly, when fetching from the database
+character data that isn't iso-8859-1 the driver should convert it into utf8.
+
+Multiple SQL statements may not be combined in a single statement
+handle (C<$sth>), although some databases and drivers do support this
+(notably Sybase and SQL Server).
+
+Non-sequential record reads are not supported in this version of the DBI.
+In other words, records can only be fetched in the order that the
+database returned them, and once fetched they are forgotten.
+
+Positioned updates and deletes are not directly supported by the DBI.
+See the description of the C<CursorName> attribute for an alternative.
+
+Individual driver implementors are free to provide any private
+functions and/or handle attributes that they feel are useful.
+Private driver functions can be invoked using the DBI C<func()> method.
+Private driver attributes are accessed just like standard attributes.
+
+Many methods have an optional C<\%attr> parameter which can be used to
+pass information to the driver implementing the method. Except where
+specifically documented, the C<\%attr> parameter can only be used to pass
+driver specific hints. In general, you can ignore C<\%attr> parameters
+or pass it as C<undef>.
+
+
+=head2 Naming Conventions and Name Space
+
+The DBI package and all packages below it (C<DBI::*>) are reserved for
+use by the DBI. Extensions and related modules use the C<DBIx::>
+namespace (see L<http://www.perl.com/CPAN/modules/by-module/DBIx/>).
+Package names beginning with C<DBD::> are reserved for use
+by DBI database drivers. All environment variables used by the DBI
+or by individual DBDs begin with "C<DBI_>" or "C<DBD_>".
+
+The letter case used for attribute names is significant and plays an
+important part in the portability of DBI scripts. The case of the
+attribute name is used to signify who defined the meaning of that name
+and its values.
+
+ Case of name Has a meaning defined by
+ ------------ ------------------------
+ UPPER_CASE Standards, e.g., X/Open, ISO SQL92 etc (portable)
+ MixedCase DBI API (portable), underscores are not used.
+ lower_case Driver or database engine specific (non-portable)
+
+It is of the utmost importance that Driver developers only use
+lowercase attribute names when defining private attributes. Private
+attribute names must be prefixed with the driver name or suitable
+abbreviation (e.g., "C<ora_>" for Oracle, "C<ing_>" for Ingres, etc).
+
+
+=head2 SQL - A Query Language
+
+Most DBI drivers require applications to use a dialect of SQL
+(Structured Query Language) to interact with the database engine.
+The L</"Standards Reference Information"> section provides links
+to useful information about SQL.
+
+The DBI itself does not mandate or require any particular language to
+be used; it is language independent. In ODBC terms, the DBI is in
+"pass-thru" mode, although individual drivers might not be. The only requirement
+is that queries and other statements must be expressed as a single
+string of characters passed as the first argument to the L</prepare> or
+L</do> methods.
+
+For an interesting diversion on the I<real> history of RDBMS and SQL,
+from the people who made it happen, see:
+
+ http://ftp.digital.com/pub/DEC/SRC/technical-notes/SRC-1997-018-html/sqlr95.html
+
+Follow the "Full Contents" then "Intergalactic dataspeak" links for the
+SQL history.
+
+=head2 Placeholders and Bind Values
+
+Some drivers support placeholders and bind values.
+I<Placeholders>, also called parameter markers, are used to indicate
+values in a database statement that will be supplied later,
+before the prepared statement is executed. For example, an application
+might use the following to insert a row of data into the SALES table:
+
+ INSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?)
+
+or the following, to select the description for a product:
+
+ SELECT description FROM products WHERE product_code = ?
+
+The C<?> characters are the placeholders. The association of actual
+values with placeholders is known as I<binding>, and the values are
+referred to as I<bind values>.
+Note that the C<?> is not enclosed in quotation marks, even when the
+placeholder represents a string.
+
+Some drivers also allow placeholders like C<:>I<name> and C<:>I<N> (e.g.,
+C<:1>, C<:2>, and so on) in addition to C<?>, but their use is not portable.
+
+If the C<:>I<N> form of placeholder is supported by the driver you're using,
+then you should be able to use either L</bind_param> or L</execute> to bind
+values. Check your driver documentation.
+
+With most drivers, placeholders can't be used for any element of a
+statement that would prevent the database server from validating the
+statement and creating a query execution plan for it. For example:
+
+ "SELECT name, age FROM ?" # wrong (will probably fail)
+ "SELECT name, ? FROM people" # wrong (but may not 'fail')
+
+Also, placeholders can only represent single scalar values.
+For example, the following
+statement won't work as expected for more than one value:
+
+ "SELECT name, age FROM people WHERE name IN (?)" # wrong
+ "SELECT name, age FROM people WHERE name IN (?,?)" # two names
+
+When using placeholders with the SQL C<LIKE> qualifier, you must
+remember that the placeholder substitutes for the whole string.
+So you should use "C<... LIKE ? ...>" and include any wildcard
+characters in the value that you bind to the placeholder.
+
+B<NULL Values>
+
+Undefined values, or C<undef>, are used to indicate NULL values.
+You can insert and update columns with a NULL value as you would a
+non-NULL value. These examples insert and update the column
+C<age> with a NULL value:
+
+ $sth = $dbh->prepare(qq{
+ INSERT INTO people (fullname, age) VALUES (?, ?)
+ });
+ $sth->execute("Joe Bloggs", undef);
+
+ $sth = $dbh->prepare(qq{
+ UPDATE people SET age = ? WHERE fullname = ?
+ });
+ $sth->execute(undef, "Joe Bloggs");
+
+However, care must be taken when trying to use NULL values in a
+C<WHERE> clause. Consider:
+
+ SELECT fullname FROM people WHERE age = ?
+
+Binding an C<undef> (NULL) to the placeholder will I<not> select rows
+which have a NULL C<age>! At least for database engines that
+conform to the SQL standard. Refer to the SQL manual for your database
+engine or any SQL book for the reasons for this. To explicitly select
+NULLs you have to say "C<WHERE age IS NULL>".
+
+A common issue is to have a code fragment handle a value that could be
+either C<defined> or C<undef> (non-NULL or NULL) at runtime.
+A simple technique is to prepare the appropriate statement as needed,
+and substitute the placeholder for non-NULL cases:
+
+ $sql_clause = defined $age? "age = ?" : "age IS NULL";
+ $sth = $dbh->prepare(qq{
+ SELECT fullname FROM people WHERE $sql_clause
+ });
+ $sth->execute(defined $age ? $age : ());
+
+The following technique illustrates qualifying a C<WHERE> clause with
+several columns, whose associated values (C<defined> or C<undef>) are
+in a hash %h:
+
+ for my $col ("age", "phone", "email") {
+ if (defined $h{$col}) {
+ push @sql_qual, "$col = ?";
+ push @sql_bind, $h{$col};
+ }
+ else {
+ push @sql_qual, "$col IS NULL";
+ }
+ }
+ $sql_clause = join(" AND ", @sql_qual);
+ $sth = $dbh->prepare(qq{
+ SELECT fullname FROM people WHERE $sql_clause
+ });
+ $sth->execute(@sql_bind);
+
+The techniques above call prepare for the SQL statement with each call to
+execute. Because calls to prepare() can be expensive, performance
+can suffer when an application iterates many times over statements
+like the above.
+
+A better solution is a single C<WHERE> clause that supports both
+NULL and non-NULL comparisons. Its SQL statement would need to be
+prepared only once for all cases, thus improving performance.
+Several examples of C<WHERE> clauses that support this are presented
+below. But each example lacks portability, robustness, or simplicity.
+Whether an example is supported on your database engine depends on
+what SQL extensions it provides, and where it supports the C<?>
+placeholder in a statement.
+
+ 0) age = ?
+ 1) NVL(age, xx) = NVL(?, xx)
+ 2) ISNULL(age, xx) = ISNULL(?, xx)
+ 3) DECODE(age, ?, 1, 0) = 1
+ 4) age = ? OR (age IS NULL AND ? IS NULL)
+ 5) age = ? OR (age IS NULL AND SP_ISNULL(?) = 1)
+ 6) age = ? OR (age IS NULL AND ? = 1)
+
+Statements formed with the above C<WHERE> clauses require execute
+statements as follows. The arguments are required, whether their
+values are C<defined> or C<undef>.
+
+ 0,1,2,3) $sth->execute($age);
+ 4,5) $sth->execute($age, $age);
+ 6) $sth->execute($age, defined($age) ? 0 : 1);
+
+Example 0 should not work (as mentioned earlier), but may work on
+a few database engines anyway (e.g. Sybase). Example 0 is part
+of examples 4, 5, and 6, so if example 0 works, these other
+examples may work, even if the engine does not properly support
+the right hand side of the C<OR> expression.
+
+Examples 1 and 2 are not robust: they require that you provide a
+valid column value xx (e.g. '~') which is not present in any row.
+That means you must have some notion of what data won't be stored
+in the column, and expect clients to adhere to that.
+
+Example 5 requires that you provide a stored procedure (SP_ISNULL
+in this example) that acts as a function: it checks whether a value
+is null, and returns 1 if it is, or 0 if not.
+
+Example 6, the least simple, is probably the most portable, i.e., it
+should work with with most, if not all, database engines.
+
+Here is a table that indicates which examples above are known to
+work on various database engines:
+
+ -----Examples------
+ 0 1 2 3 4 5 6
+ - - - - - - -
+ Oracle 9 N Y N Y Y ? Y
+ Informix IDS 9 N N N Y N Y Y
+ MS SQL N N Y N Y ? Y
+ Sybase Y N N N N N Y
+ AnyData,DBM,CSV Y N N N Y Y* Y
+ SQLite 3.3 N N N N Y N N
+
+* Works only because Example 0 works.
+
+DBI provides a sample perl script that will test the examples above
+on your database engine and tell you which ones work. It is located
+in the F<ex/> subdirectory of the DBI source distribution, or here:
+L<http://svn.perl.org/modules/dbi/trunk/ex/perl_dbi_nulls_test.pl>
+Please use the script to help us fill-in and maintain this table.
+
+B<Performance>
+
+Without using placeholders, the insert statement shown previously would have to
+contain the literal values to be inserted and would have to be
+re-prepared and re-executed for each row. With placeholders, the insert
+statement only needs to be prepared once. The bind values for each row
+can be given to the C<execute> method each time it's called. By avoiding
+the need to re-prepare the statement for each row, the application
+typically runs many times faster. Here's an example:
+
+ my $sth = $dbh->prepare(q{
+ INSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?)
+ }) or die $dbh->errstr;
+ while (<>) {
+ chomp;
+ my ($product_code, $qty, $price) = split /,/;
+ $sth->execute($product_code, $qty, $price) or die $dbh->errstr;
+ }
+ $dbh->commit or die $dbh->errstr;
+
+See L</execute> and L</bind_param> for more details.
+
+The C<q{...}> style quoting used in this example avoids clashing with
+quotes that may be used in the SQL statement. Use the double-quote like
+C<qq{...}> operator if you want to interpolate variables into the string.
+See L<perlop/"Quote and Quote-like Operators"> for more details.
+
+See also the L</bind_columns> method, which is used to associate Perl
+variables with the output columns of a C<SELECT> statement.
+
+=head1 THE DBI PACKAGE AND CLASS
+
+In this section, we cover the DBI class methods, utility functions,
+and the dynamic attributes associated with generic DBI handles.
+
+=head2 DBI Constants
+
+Constants representing the values of the SQL standard types can be
+imported individually by name, or all together by importing the
+special C<:sql_types> tag.
+
+The names and values of all the defined SQL standard types can be
+produced like this:
+
+ foreach (@{ $DBI::EXPORT_TAGS{sql_types} }) {
+ printf "%s=%d\n", $_, &{"DBI::$_"};
+ }
+
+These constants are defined by SQL/CLI, ODBC or both.
+C<SQL_BIGINT> is (currently) omitted, because SQL/CLI and ODBC provide
+conflicting codes.
+
+See the L</type_info>, L</type_info_all>, and L</bind_param> methods
+for possible uses.
+
+Note that just because the DBI defines a named constant for a given
+data type doesn't mean that drivers will support that data type.
+
+
+=head2 DBI Class Methods
+
+The following methods are provided by the DBI class:
+
+=head3 C<parse_dsn>
+
+ ($scheme, $driver, $attr_string, $attr_hash, $driver_dsn) = DBI->parse_dsn($dsn)
+ or die "Can't parse DBI DSN '$dsn'";
+
+Breaks apart a DBI Data Source Name (DSN) and returns the individual
+parts. If $dsn doesn't contain a valid DSN then parse_dsn() returns
+an empty list.
+
+$scheme is the first part of the DSN and is currently always 'dbi'.
+$driver is the driver name, possibly defaulted to $ENV{DBI_DRIVER},
+and may be undefined. $attr_string is the contents of the optional attribute
+string, which may be undefined. If $attr_string is not empty then $attr_hash
+is a reference to a hash containing the parsed attribute names and values.
+$driver_dsn is the last part of the DBI DSN string. For example:
+
+ ($scheme, $driver, $attr_string, $attr_hash, $driver_dsn)
+ = DBI->parse_dsn("DBI:MyDriver(RaiseError=>1):db=test;port=42");
+ $scheme = 'dbi';
+ $driver = 'MyDriver';
+ $attr_string = 'RaiseError=>1';
+ $attr_hash = { 'RaiseError' => '1' };
+ $driver_dsn = 'db=test;port=42';
+
+The parse_dsn() method was added in DBI 1.43.
+
+=head3 C<connect>
+
+ $dbh = DBI->connect($data_source, $username, $password)
+ or die $DBI::errstr;
+ $dbh = DBI->connect($data_source, $username, $password, \%attr)
+ or die $DBI::errstr;
+
+Establishes a database connection, or session, to the requested C<$data_source>.
+Returns a database handle object if the connection succeeds. Use
+C<$dbh-E<gt>disconnect> to terminate the connection.
+
+If the connect fails (see below), it returns C<undef> and sets both C<$DBI::err>
+and C<$DBI::errstr>. (It does I<not> explicitly set C<$!>.) You should generally
+test the return status of C<connect> and C<print $DBI::errstr> if it has failed.
+
+Multiple simultaneous connections to multiple databases through multiple
+drivers can be made via the DBI. Simply make one C<connect> call for each
+database and keep a copy of each returned database handle.
+
+The C<$data_source> value must begin with "C<dbi:>I<driver_name>C<:>".
+The I<driver_name> specifies the driver that will be used to make the
+connection. (Letter case is significant.)
+
+As a convenience, if the C<$data_source> parameter is undefined or empty,
+the DBI will substitute the value of the environment variable C<DBI_DSN>.
+If just the I<driver_name> part is empty (i.e., the C<$data_source>
+prefix is "C<dbi::>"), the environment variable C<DBI_DRIVER> is
+used. If neither variable is set, then C<connect> dies.
+
+Examples of C<$data_source> values are:
+
+ dbi:DriverName:database_name
+ dbi:DriverName:database_name@hostname:port
+ dbi:DriverName:database=database_name;host=hostname;port=port
+
+There is I<no standard> for the text following the driver name. Each
+driver is free to use whatever syntax it wants. The only requirement the
+DBI makes is that all the information is supplied in a single string.
+You must consult the documentation for the drivers you are using for a
+description of the syntax they require.
+
+It is recommended that drivers support the ODBC style, shown in the
+last example above. It is also recommended that that they support the
+three common names 'C<host>', 'C<port>', and 'C<database>' (plus 'C<db>'
+as an alias for C<database>). This simplifies automatic construction
+of basic DSNs: C<"dbi:$driver:database=$db;host=$host;port=$port">.
+Drivers should aim to 'do something reasonable' when given a DSN
+in this form, but if any part is meaningless for that driver (such
+as 'port' for Informix) it should generate an error if that part
+is not empty.
+
+If the environment variable C<DBI_AUTOPROXY> is defined (and the
+driver in C<$data_source> is not "C<Proxy>") then the connect request
+will automatically be changed to:
+
+ $ENV{DBI_AUTOPROXY};dsn=$data_source
+
+C<DBI_AUTOPROXY> is typically set as "C<dbi:Proxy:hostname=...;port=...>".
+If $ENV{DBI_AUTOPROXY} doesn't begin with 'C<dbi:>' then "dbi:Proxy:"
+will be prepended to it first. See the DBD::Proxy documentation
+for more details.
+
+If C<$username> or C<$password> are undefined (rather than just empty),
+then the DBI will substitute the values of the C<DBI_USER> and C<DBI_PASS>
+environment variables, respectively. The DBI will warn if the
+environment variables are not defined. However, the everyday use
+of these environment variables is not recommended for security
+reasons. The mechanism is primarily intended to simplify testing.
+See below for alternative way to specify the username and password.
+
+C<DBI-E<gt>connect> automatically installs the driver if it has not been
+installed yet. Driver installation either returns a valid driver
+handle, or it I<dies> with an error message that includes the string
+"C<install_driver>" and the underlying problem. So C<DBI-E<gt>connect>
+will die
+on a driver installation failure and will only return C<undef> on a
+connect failure, in which case C<$DBI::errstr> will hold the error message.
+Use C<eval { ... }> if you need to catch the "C<install_driver>" error.
+
+The C<$data_source> argument (with the "C<dbi:...:>" prefix removed) and the
+C<$username> and C<$password> arguments are then passed to the driver for
+processing. The DBI does not define any interpretation for the
+contents of these fields. The driver is free to interpret the
+C<$data_source>, C<$username>, and C<$password> fields in any way, and supply
+whatever defaults are appropriate for the engine being accessed.
+(Oracle, for example, uses the ORACLE_SID and TWO_TASK environment
+variables if no C<$data_source> is specified.)
+
+The C<AutoCommit> and C<PrintError> attributes for each connection
+default to "on". (See L</AutoCommit> and L</PrintError> for more information.)
+However, it is strongly recommended that you explicitly define C<AutoCommit>
+rather than rely on the default. The C<PrintWarn> attribute defaults to
+on if $^W is true, i.e., perl is running with warnings enabled.
+
+The C<\%attr> parameter can be used to alter the default settings of
+C<PrintError>, C<RaiseError>, C<AutoCommit>, and other attributes. For example:
+
+ $dbh = DBI->connect($data_source, $user, $pass, {
+ PrintError => 0,
+ AutoCommit => 0
+ });
+
+The username and password can also be specified using the attributes
+C<Username> and C<Password>, in which case they take precedence
+over the C<$username> and C<$password> parameters.
+
+You can also define connection attribute values within the C<$data_source>
+parameter. For example:
+
+ dbi:DriverName(PrintWarn=>1,PrintError=>0,Taint=>1):...
+
+Individual attributes values specified in this way take precedence over
+any conflicting values specified via the C<\%attr> parameter to C<connect>.
+
+The C<dbi_connect_method> attribute can be used to specify which driver
+method should be called to establish the connection. The only useful
+values are 'connect', 'connect_cached', or some specialized case like
+'Apache::DBI::connect' (which is automatically the default when running
+within Apache).
+
+Where possible, each session (C<$dbh>) is independent from the transactions
+in other sessions. This is useful when you need to hold cursors open
+across transactions--for example, if you use one session for your long lifespan
+cursors (typically read-only) and another for your short update
+transactions.
+
+For compatibility with old DBI scripts, the driver can be specified by
+passing its name as the fourth argument to C<connect> (instead of C<\%attr>):
+
+ $dbh = DBI->connect($data_source, $user, $pass, $driver);
+
+In this "old-style" form of C<connect>, the C<$data_source> should not start
+with "C<dbi:driver_name:>". (If it does, the embedded driver_name
+will be ignored). Also note that in this older form of C<connect>,
+the C<$dbh-E<gt>{AutoCommit}> attribute is I<undefined>, the
+C<$dbh-E<gt>{PrintError}> attribute is off, and the old C<DBI_DBNAME>
+environment variable is
+checked if C<DBI_DSN> is not defined. Beware that this "old-style"
+C<connect> will soon be withdrawn in a future version of DBI.
+
+=head3 C<connect_cached>
+
+ $dbh = DBI->connect_cached($data_source, $username, $password)
+ or die $DBI::errstr;
+ $dbh = DBI->connect_cached($data_source, $username, $password, \%attr)
+ or die $DBI::errstr;
+
+C<connect_cached> is like L</connect>, except that the database handle
+returned is also
+stored in a hash associated with the given parameters. If another call
+is made to C<connect_cached> with the same parameter values, then the
+corresponding cached C<$dbh> will be returned if it is still valid.
+The cached database handle is replaced with a new connection if it
+has been disconnected or if the C<ping> method fails.
+
+That the behaviour of this method differs in several respects from the
+behaviour of persistent connections implemented by Apache::DBI.
+However, if Apache::DBI is loaded then C<connect_cached> will use it.
+
+Caching connections can be useful in some applications, but it can
+also cause problems, such as too many connections, and so should
+be used with care. In particular, avoid changing the attributes of
+a database handle created via connect_cached() because it will affect
+other code that may be using the same handle.
+
+Where multiple separate parts of a program are using connect_cached()
+to connect to the same database with the same (initial) attributes
+it is a good idea to add a private attribute to the connect_cached()
+call to effectively limit the scope of the caching. For example:
+
+ DBI->connect_cached(..., { private_foo_cachekey => "Bar", ... });
+
+Handles returned from that connect_cached() call will only be returned
+by other connect_cached() call elsewhere in the code if those other
+calls also pass in the same attribute values, including the private one.
+(I've used C<private_foo_cachekey> here as an example, you can use
+any attribute name with a C<private_> prefix.)
+
+Taking that one step further, you can limit a particular connect_cached()
+call to return handles unique to that one place in the code by setting the
+private attribute to a unique value for that place:
+
+ DBI->connect_cached(..., { private_foo_cachekey => __FILE__.__LINE__, ... });
+
+By using a private attribute you still get connection caching for
+the individual calls to connect_cached() but, by making separate
+database connections for separate parts of the code, the database
+handles are isolated from any attribute changes made to other handles.
+
+The cache can be accessed (and cleared) via the L</CachedKids> attribute:
+
+ my $CachedKids_hashref = $dbh->{Driver}->{CachedKids};
+ %$CachedKids_hashref = () if $CachedKids_hashref;
+
+
+=head3 C<available_drivers>
+
+ @ary = DBI->available_drivers;
+ @ary = DBI->available_drivers($quiet);
+
+Returns a list of all available drivers by searching for C<DBD::*> modules
+through the directories in C<@INC>. By default, a warning is given if
+some drivers are hidden by others of the same name in earlier
+directories. Passing a true value for C<$quiet> will inhibit the warning.
+
+=head3 C<installed_drivers>
+
+ %drivers = DBI->installed_drivers();
+
+Returns a list of driver name and driver handle pairs for all drivers
+'installed' (loaded) into the current process. The driver name does not
+include the 'DBD::' prefix.
+
+To get a list of all drivers available in your perl installation you can use
+L</available_drivers>.
+
+Added in DBI 1.49.
+
+=head3 C<installed_versions>
+
+ DBI->installed_versions;
+ @ary = DBI->installed_versions;
+ %hash = DBI->installed_versions;
+
+Calls available_drivers() and attempts to load each of them in turn
+using install_driver(). For each load that succeeds the driver
+name and version number are added to a hash. When running under
+L<DBI::PurePerl> drivers which appear not be pure-perl are ignored.
+
+When called in array context the list of successfully loaded drivers
+is returned (without the 'DBD::' prefix).
+
+When called in scalar context a reference to the hash is returned
+and the hash will also contain other entries for the C<DBI> version,
+C<OS> name, etc.
+
+When called in a void context the installed_versions() method will
+print out a formatted list of the hash contents, one per line.
+
+Due to the potentially high memory cost and unknown risks of loading
+in an unknown number of drivers that just happen to be installed
+on the system, this method is not recommended for general use.
+Use available_drivers() instead.
+
+The installed_versions() method is primarily intended as a quick
+way to see from the command line what's installed. For example:
+
+ perl -MDBI -e 'DBI->installed_versions'
+
+The installed_versions() method was added in DBI 1.38.
+
+=head3 C<data_sources>
+
+ @ary = DBI->data_sources($driver);
+ @ary = DBI->data_sources($driver, \%attr);
+
+Returns a list of data sources (databases) available via the named
+driver. If C<$driver> is empty or C<undef>, then the value of the
+C<DBI_DRIVER> environment variable is used.
+
+The driver will be loaded if it hasn't been already. Note that if the
+driver loading fails then data_sources() I<dies> with an error message
+that includes the string "C<install_driver>" and the underlying problem.
+
+Data sources are returned in a form suitable for passing to the
+L</connect> method (that is, they will include the "C<dbi:$driver:>" prefix).
+
+Note that many drivers have no way of knowing what data sources might
+be available for it. These drivers return an empty or incomplete list
+or may require driver-specific attributes.
+
+There is also a data_sources() method defined for database handles.
+
+
+=head3 C<trace>
+
+ DBI->trace($trace_setting)
+ DBI->trace($trace_setting, $trace_filename)
+ DBI->trace($trace_setting, $trace_filehandle)
+ $trace_setting = DBI->trace;
+
+The C<DBI-E<gt>trace> method sets the I<global default> trace
+settings and returns the I<previous> trace settings. It can also
+be used to change where the trace output is sent.
+
+There's a similar method, C<$h-E<gt>trace>, which sets the trace
+settings for the specific handle it's called on.
+
+See the L</TRACING> section for full details about the DBI's powerful
+tracing facilities.
+
+
+=head3 C<visit_handles>
+
+ DBI->visit_handles( $coderef );
+ DBI->visit_handles( $coderef, $info );
+
+Where $coderef is a reference to a subroutine and $info is an arbitrary value
+which, if undefined, defaults to a reference to an empty hash. Returns $info.
+
+For each installed driver handle, if any, $coderef is invoked as:
+
+ $coderef->($driver_handle, $info);
+
+If the execution of $coderef returns a true value then L</visit_child_handles>
+is called on that child handle and passed the returned value as $info.
+
+For example:
+
+ my $info = $dbh->{Driver}->visit_child_handles(sub {
+ my ($h, $info) = @_;
+ ++$info->{ $h->{Type} }; # count types of handles (dr/db/st)
+ return $info; # visit kids
+ });
+
+See also L</visit_child_handles>.
+
+
+=head2 DBI Utility Functions
+
+In addition to the DBI methods listed in the previous section,
+the DBI package also provides several utility functions.
+
+These can be imported into your code by listing them in
+the C<use> statement. For example:
+
+ use DBI qw(neat data_diff);
+
+Alternatively, all these utility functions (except hash) can be
+imported using the C<:utils> import tag. For example:
+
+ use DBI qw(:utils);
+
+=head3 C<data_string_desc>
+
+ $description = data_string_desc($string);
+
+Returns an informal description of the string. For example:
+
+ UTF8 off, ASCII, 42 characters 42 bytes
+ UTF8 off, non-ASCII, 42 characters 42 bytes
+ UTF8 on, non-ASCII, 4 characters 6 bytes
+ UTF8 on but INVALID encoding, non-ASCII, 4 characters 6 bytes
+ UTF8 off, undef
+
+The initial C<UTF8> on/off refers to Perl's internal SvUTF8 flag.
+If $string has the SvUTF8 flag set but the sequence of bytes it
+contains are not a valid UTF-8 encoding then data_string_desc()
+will report C<UTF8 on but INVALID encoding>.
+
+The C<ASCII> vs C<non-ASCII> portion shows C<ASCII> if I<all> the
+characters in the string are ASCII (have code points <= 127).
+
+The data_string_desc() function was added in DBI 1.46.
+
+=head3 C<data_string_diff>
+
+ $diff = data_string_diff($a, $b);
+
+Returns an informal description of the first character difference
+between the strings. If both $a and $b contain the same sequence
+of characters then data_string_diff() returns an empty string.
+For example:
+
+ Params a & b Result
+ ------------ ------
+ 'aaa', 'aaa' ''
+ 'aaa', 'abc' 'Strings differ at index 2: a[2]=a, b[2]=b'
+ 'aaa', undef 'String b is undef, string a has 3 characters'
+ 'aaa', 'aa' 'String b truncated after 2 characters'
+
+Unicode characters are reported in C<\x{XXXX}> format. Unicode
+code points in the range U+0800 to U+08FF are unassigned and most
+likely to occur due to double-encoding. Characters in this range
+are reported as C<\x{08XX}='C'> where C<C> is the corresponding
+latin-1 character.
+
+The data_string_diff() function only considers logical I<characters>
+and not the underlying encoding. See L</data_diff> for an alternative.
+
+The data_string_diff() function was added in DBI 1.46.
+
+=head3 C<data_diff>
+
+ $diff = data_diff($a, $b);
+ $diff = data_diff($a, $b, $logical);
+
+Returns an informal description of the difference between two strings.
+It calls L</data_string_desc> and L</data_string_diff>
+and returns the combined results as a multi-line string.
+
+For example, C<data_diff("abc", "ab\x{263a}")> will return:
+
+ a: UTF8 off, ASCII, 3 characters 3 bytes
+ b: UTF8 on, non-ASCII, 3 characters 5 bytes
+ Strings differ at index 2: a[2]=c, b[2]=\x{263A}
+
+If $a and $b are identical in both the characters they contain I<and>
+their physical encoding then data_diff() returns an empty string.
+If $logical is true then physical encoding differences are ignored
+(but are still reported if there is a difference in the characters).
+
+The data_diff() function was added in DBI 1.46.
+
+=head3 C<neat>
+
+ $str = neat($value);
+ $str = neat($value, $maxlen);
+
+Return a string containing a neat (and tidy) representation of the
+supplied value.
+
+Strings will be quoted, although internal quotes will I<not> be escaped.
+Values known to be numeric will be unquoted. Undefined (NULL) values
+will be shown as C<undef> (without quotes).
+
+If the string is flagged internally as utf8 then double quotes will
+be used, otherwise single quotes are used and unprintable characters
+will be replaced by dot (.).
+
+For result strings longer than C<$maxlen> the result string will be
+truncated to C<$maxlen-4> and "C<...'>" will be appended. If C<$maxlen> is 0
+or C<undef>, it defaults to C<$DBI::neat_maxlen> which, in turn, defaults to 400.
+
+This function is designed to format values for human consumption.
+It is used internally by the DBI for L</trace> output. It should
+typically I<not> be used for formatting values for database use.
+(See also L</quote>.)
+
+=head3 C<neat_list>
+
+ $str = neat_list(\@listref, $maxlen, $field_sep);
+
+Calls C<neat> on each element of the list and returns a string
+containing the results joined with C<$field_sep>. C<$field_sep> defaults
+to C<", ">.
+
+=head3 C<looks_like_number>
+
+ @bool = looks_like_number(@array);
+
+Returns true for each element that looks like a number.
+Returns false for each element that does not look like a number.
+Returns C<undef> for each element that is undefined or empty.
+
+=head3 C<hash>
+
+ $hash_value = DBI::hash($buffer, $type);
+
+Return a 32-bit integer 'hash' value corresponding to the contents of $buffer.
+The $type parameter selects which kind of hash algorithm should be used.
+
+For the technically curious, type 0 (which is the default if $type
+isn't specified) is based on the Perl 5.1 hash except that the value
+is forced to be negative (for obscure historical reasons).
+Type 1 is the better "Fowler / Noll / Vo" (FNV) hash. See
+L<http://www.isthe.com/chongo/tech/comp/fnv/> for more information.
+Both types are implemented in C and are very fast.
+
+This function doesn't have much to do with databases, except that
+it can be handy to store hash values in a database.
+
+
+=head2 DBI Dynamic Attributes
+
+Dynamic attributes are always associated with the I<last handle used>
+(that handle is represented by C<$h> in the descriptions below).
+
+Where an attribute is equivalent to a method call, then refer to
+the method call for all related documentation.
+
+Warning: these attributes are provided as a convenience but they
+do have limitations. Specifically, they have a short lifespan:
+because they are associated with
+the last handle used, they should only be used I<immediately> after
+calling the method that "sets" them.
+If in any doubt, use the corresponding method call.
+
+=head3 C<$DBI::err>
+
+Equivalent to C<$h-E<gt>err>.
+
+=head3 C<$DBI::errstr>
+
+Equivalent to C<$h-E<gt>errstr>.
+
+=head3 C<$DBI::state>
+
+Equivalent to C<$h-E<gt>state>.
+
+=head3 C<$DBI::rows>
+
+Equivalent to C<$h-E<gt>rows>. Please refer to the documentation
+for the L</rows> method.
+
+=head3 C<$DBI::lasth>
+
+Returns the DBI object handle used for the most recent DBI method call.
+If the last DBI method call was a DESTROY then $DBI::lasth will return
+the handle of the parent of the destroyed handle, if there is one.
+
+
+=head1 METHODS COMMON TO ALL HANDLES
+
+The following methods can be used by all types of DBI handles.
+
+=head3 C<err>
+
+ $rv = $h->err;
+
+Returns the I<native> database engine error code from the last driver
+method called. The code is typically an integer but you should not
+assume that.
+
+The DBI resets $h->err to undef before almost all DBI method calls, so the
+value only has a short lifespan. Also, for most drivers, the statement
+handles share the same error variable as the parent database handle,
+so calling a method on one handle may reset the error on the
+related handles.
+
+(Methods which don't reset err before being called include err() and errstr(),
+obviously, state(), rows(), func(), trace(), trace_msg(), ping(), and the
+tied hash attribute FETCH() and STORE() methods.)
+
+If you need to test for specific error conditions I<and> have your program be
+portable to different database engines, then you'll need to determine what the
+corresponding error codes are for all those engines and test for all of them.
+
+The DBI uses the value of $DBI::stderr as the C<err> value for internal errors.
+Drivers should also do likewise. The default value for $DBI::stderr is 2000000000.
+
+A driver may return C<0> from err() to indicate a warning condition
+after a method call. Similarly, a driver may return an empty string
+to indicate a 'success with information' condition. In both these
+cases the value is false but not undef. The errstr() and state()
+methods may be used to retrieve extra information in these cases.
+
+See L</set_err> for more information.
+
+=head3 C<errstr>
+
+ $str = $h->errstr;
+
+Returns the native database engine error message from the last DBI
+method called. This has the same lifespan issues as the L</err> method
+described above.
+
+The returned string may contain multiple messages separated by
+newline characters.
+
+The errstr() method should not be used to test for errors, use err()
+for that, because drivers may return 'success with information' or
+warning messages via errstr() for methods that have not 'failed'.
+
+See L</set_err> for more information.
+
+=head3 C<state>
+
+ $str = $h->state;
+
+Returns a state code in the standard SQLSTATE five character format.
+Note that the specific success code C<00000> is translated to any empty string
+(false). If the driver does not support SQLSTATE (and most don't),
+then state() will return C<S1000> (General Error) for all errors.
+
+The driver is free to return any value via C<state>, e.g., warning
+codes, even if it has not declared an error by returning a true value
+via the L</err> method described above.
+
+The state() method should not be used to test for errors, use err()
+for that, because drivers may return a 'success with information' or
+warning state code via state() for methods that have not 'failed'.
+
+=head3 C<set_err>
+
+ $rv = $h->set_err($err, $errstr);
+ $rv = $h->set_err($err, $errstr, $state);
+ $rv = $h->set_err($err, $errstr, $state, $method);
+ $rv = $h->set_err($err, $errstr, $state, $method, $rv);
+
+Set the C<err>, C<errstr>, and C<state> values for the handle.
+This method is typically only used by DBI drivers and DBI subclasses.
+
+If the L</HandleSetErr> attribute holds a reference to a subroutine
+it is called first. The subroutine can alter the $err, $errstr, $state,
+and $method values. See L</HandleSetErr> for full details.
+If the subroutine returns a true value then the handle C<err>,
+C<errstr>, and C<state> values are not altered and set_err() returns
+an empty list (it normally returns $rv which defaults to undef, see below).
+
+Setting C<err> to a I<true> value indicates an error and will trigger
+the normal DBI error handling mechanisms, such as C<RaiseError> and
+C<HandleError>, if they are enabled, when execution returns from
+the DBI back to the application.
+
+Setting C<err> to C<""> indicates an 'information' state, and setting
+it to C<"0"> indicates a 'warning' state. Setting C<err> to C<undef>
+also sets C<errstr> to undef, and C<state> to C<"">, irrespective
+of the values of the $errstr and $state parameters.
+
+The $method parameter provides an alternate method name for the
+C<RaiseError>/C<PrintError>/C<PrintWarn> error string instead of
+the fairly unhelpful 'C<set_err>'.
+
+The C<set_err> method normally returns undef. The $rv parameter
+provides an alternate return value.
+
+Some special rules apply if the C<err> or C<errstr>
+values for the handle are I<already> set...
+
+If C<errstr> is true then: "C< [err was %s now %s]>" is appended if $err is
+true and C<err> is already true and the new err value differs from the original
+one. Similarly "C< [state was %s now %s]>" is appended if $state is true and C<state> is
+already true and the new state value differs from the original one. Finally
+"C<\n>" and the new $errstr are appended if $errstr differs from the existing
+errstr value. Obviously the C<%s>'s above are replaced by the corresponding values.
+
+The handle C<err> value is set to $err if: $err is true; or handle
+C<err> value is undef; or $err is defined and the length is greater
+than the handle C<err> length. The effect is that an 'information'
+state only overrides undef; a 'warning' overrides undef or 'information',
+and an 'error' state overrides anything.
+
+The handle C<state> value is set to $state if $state is true and
+the handle C<err> value was set (by the rules above).
+
+Support for warning and information states was added in DBI 1.41.
+
+=head3 C<trace>
+
+ $h->trace($trace_settings);
+ $h->trace($trace_settings, $trace_filename);
+ $trace_settings = $h->trace;
+
+The trace() method is used to alter the trace settings for a handle
+(and any future children of that handle). It can also be used to
+change where the trace output is sent.
+
+There's a similar method, C<DBI-E<gt>trace>, which sets the global
+default trace settings.
+
+See the L</TRACING> section for full details about the DBI's powerful
+tracing facilities.
+
+=head3 C<trace_msg>
+
+ $h->trace_msg($message_text);
+ $h->trace_msg($message_text, $min_level);
+
+Writes C<$message_text> to the trace file if the trace level is
+greater than or equal to $min_level (which defaults to 1).
+Can also be called as C<DBI-E<gt>trace_msg($msg)>.
+
+See L</TRACING> for more details.
+
+=head3 C<func>
+
+ $h->func(@func_arguments, $func_name) or die ...;
+
+The C<func> method can be used to call private non-standard and
+non-portable methods implemented by the driver. Note that the function
+name is given as the I<last> argument.
+
+It's also important to note that the func() method does not clear
+a previous error ($DBI::err etc.) and it does not trigger automatic
+error detection (RaiseError etc.) so you must check the return
+status and/or $h->err to detect errors.
+
+(This method is not directly related to calling stored procedures.
+Calling stored procedures is currently not defined by the DBI.
+Some drivers, such as DBD::Oracle, support it in non-portable ways.
+See driver documentation for more details.)
+
+See also install_method() in L<DBI::DBD> for how you can avoid needing to
+use func() and gain direct access to driver-private methods.
+
+=head3 C<can>
+
+ $is_implemented = $h->can($method_name);
+
+Returns true if $method_name is implemented by the driver or a
+default method is provided by the DBI.
+It returns false where a driver hasn't implemented a method and the
+default method is provided by the DBI is just an empty stub.
+
+=head3 C<parse_trace_flags>
+
+ $trace_settings_integer = $h->parse_trace_flags($trace_settings);
+
+Parses a string containing trace settings and returns the corresponding
+integer value used internally by the DBI and drivers.
+
+The $trace_settings argument is a string containing a trace level
+between 0 and 15 and/or trace flag names separated by vertical bar
+("C<|>") or comma ("C<,>") characters. For example: C<"SQL|3|foo">.
+
+It uses the parse_trace_flag() method, described below, to process
+the individual trace flag names.
+
+The parse_trace_flags() method was added in DBI 1.42.
+
+=head3 C<parse_trace_flag>
+
+ $bit_flag = $h->parse_trace_flag($trace_flag_name);
+
+Returns the bit flag corresponding to the trace flag name in
+$trace_flag_name. Drivers are expected to override this method and
+check if $trace_flag_name is a driver specific trace flags and, if
+not, then call the DBI's default parse_trace_flag().
+
+The parse_trace_flag() method was added in DBI 1.42.
+
+=head3 C<private_attribute_info>
+
+ $hash_ref = $h->private_attribute_info();
+
+Returns a reference to a hash whose keys are the names of driver-private
+attributes available for the kind of handle (driver, database, statement)
+that the method was called on.
+
+For example, the return value when called with a DBD::Sybase $dbh could look like this:
+
+ {
+ syb_dynamic_supported => undef,
+ syb_oc_version => undef,
+ syb_server_version => undef,
+ syb_server_version_string => undef,
+ }
+
+and when called with a DBD::Sybase $sth they could look like this:
+
+ {
+ syb_types => undef,
+ syb_proc_status => undef,
+ syb_result_type => undef,
+ }
+
+The values should be undef. Meanings may be assigned to particular values in future.
+
+=head3 C<swap_inner_handle>
+
+ $rc = $h1->swap_inner_handle( $h2 );
+ $rc = $h1->swap_inner_handle( $h2, $allow_reparent );
+
+Brain transplants for handles. You don't need to know about this
+unless you want to become a handle surgeon.
+
+A DBI handle is a reference to a tied hash. A tied hash has an
+I<inner> hash that actually holds the contents. The swap_inner_handle()
+method swaps the inner hashes between two handles. The $h1 and $h2
+handles still point to the same tied hashes, but what those hashes
+are tied to has been swapped. In effect $h1 I<becomes> $h2 and
+vice-versa. This is powerful stuff, expect problems. Use with care.
+
+As a small safety measure, the two handles, $h1 and $h2, have to
+share the same parent unless $allow_reparent is true.
+
+The swap_inner_handle() method was added in DBI 1.44.
+
+Here's a quick kind of 'diagram' as a worked example to help think about what's
+happening:
+
+ Original state:
+ dbh1o -> dbh1i
+ sthAo -> sthAi(dbh1i)
+ dbh2o -> dbh2i
+
+ swap_inner_handle dbh1o with dbh2o:
+ dbh2o -> dbh1i
+ sthAo -> sthAi(dbh1i)
+ dbh1o -> dbh2i
+
+ create new sth from dbh1o:
+ dbh2o -> dbh1i
+ sthAo -> sthAi(dbh1i)
+ dbh1o -> dbh2i
+ sthBo -> sthBi(dbh2i)
+
+ swap_inner_handle sthAo with sthBo:
+ dbh2o -> dbh1i
+ sthBo -> sthAi(dbh1i)
+ dbh1o -> dbh2i
+ sthAo -> sthBi(dbh2i)
+
+=head3 C<visit_child_handles>
+
+ $h->visit_child_handles( $coderef );
+ $h->visit_child_handles( $coderef, $info );
+
+Where $coderef is a reference to a subroutine and $info is an arbitrary value
+which, if undefined, defaults to a reference to an empty hash. Returns $info.
+
+For each child handle of $h, if any, $coderef is invoked as:
+
+ $coderef->($child_handle, $info);
+
+If the execution of $coderef returns a true value then C<visit_child_handles>
+is called on that child handle and passed the returned value as $info.
+
+For example:
+
+ # count database connections with names (DSN) matching a pattern
+ my $connections = 0;
+ $dbh->{Driver}->visit_child_handles(sub {
+ my ($h, $info) = @_;
+ ++$connections if $h->{Name} =~ /foo/;
+ return 0; # don't visit kids
+ })
+
+See also L</visit_handles>.
+
+=head1 ATTRIBUTES COMMON TO ALL HANDLES
+
+These attributes are common to all types of DBI handles.
+
+Some attributes are inherited by child handles. That is, the value
+of an inherited attribute in a newly created statement handle is the
+same as the value in the parent database handle. Changes to attributes
+in the new statement handle do not affect the parent database handle
+and changes to the database handle do not affect existing statement
+handles, only future ones.
+
+Attempting to set or get the value of an unknown attribute generates a warning,
+except for private driver specific attributes (which all have names
+starting with a lowercase letter).
+
+Example:
+
+ $h->{AttributeName} = ...; # set/write
+ ... = $h->{AttributeName}; # get/read
+
+=head3 C<Warn> (boolean, inherited)
+
+The C<Warn> attribute enables useful warnings for certain bad
+practices. It is enabled by default and should only be disabled in
+rare circumstances. Since warnings are generated using the Perl
+C<warn> function, they can be intercepted using the Perl C<$SIG{__WARN__}>
+hook.
+
+The C<Warn> attribute is not related to the C<PrintWarn> attribute.
+
+=head3 C<Active> (boolean, read-only)
+
+The C<Active> attribute is true if the handle object is "active". This is rarely used in
+applications. The exact meaning of active is somewhat vague at the
+moment. For a database handle it typically means that the handle is
+connected to a database (C<$dbh-E<gt>disconnect> sets C<Active> off). For
+a statement handle it typically means that the handle is a C<SELECT>
+that may have more data to fetch. (Fetching all the data or calling C<$sth-E<gt>finish>
+sets C<Active> off.)
+
+=head3 C<Executed> (boolean)
+
+The C<Executed> attribute is true if the handle object has been "executed".
+Currently only the $dbh do() method and the $sth execute(), execute_array(),
+and execute_for_fetch() methods set the C<Executed> attribute.
+
+When it's set on a handle it is also set on the parent handle at the
+same time. So calling execute() on a $sth also sets the C<Executed>
+attribute on the parent $dbh.
+
+The C<Executed> attribute for a database handle is cleared by the commit() and
+rollback() methods (even if they fail). The C<Executed> attribute of a
+statement handle is not cleared by the DBI under any circumstances and so acts
+as a permanent record of whether the statement handle was ever used.
+
+The C<Executed> attribute was added in DBI 1.41.
+
+=head3 C<Kids> (integer, read-only)
+
+For a driver handle, C<Kids> is the number of currently existing database
+handles that were created from that driver handle. For a database
+handle, C<Kids> is the number of currently existing statement handles that
+were created from that database handle.
+For a statement handle, the value is zero.
+
+=head3 C<ActiveKids> (integer, read-only)
+
+Like C<Kids>, but only counting those that are C<Active> (as above).
+
+=head3 C<CachedKids> (hash ref)
+
+For a database handle, C<CachedKids> returns a reference to the cache (hash) of
+statement handles created by the L</prepare_cached> method. For a
+driver handle, returns a reference to the cache (hash) of
+database handles created by the L</connect_cached> method.
+
+=head3 C<Type> (scalar, read-only)
+
+The C<Type> attribute identifies the type of a DBI handle. Returns
+"dr" for driver handles, "db" for database handles and "st" for
+statement handles.
+
+=head3 C<ChildHandles> (array ref)
+
+The ChildHandles attribute contains a reference to an array of all the
+handles created by this handle which are still accessible. The
+contents of the array are weak-refs and will become undef when the
+handle goes out of scope.
+
+C<ChildHandles> returns undef if your perl version does not support weak
+references (check the L<Scalar::Util|Scalar::Util> module). The referenced
+array returned should be treated as read-only.
+
+For example, to enumerate all driver handles, database handles and
+statement handles:
+
+ sub show_child_handles {
+ my ($h, $level) = @_;
+ printf "%sh %s %s\n", $h->{Type}, "\t" x $level, $h;
+ show_child_handles($_, $level + 1)
+ for (grep { defined } @{$h->{ChildHandles}});
+ }
+
+ my %drivers = DBI->installed_drivers();
+ show_child_handles($_, 0) for (values %drivers);
+
+=head3 C<CompatMode> (boolean, inherited)
+
+The C<CompatMode> attribute is used by emulation layers (such as
+Oraperl) to enable compatible behaviour in the underlying driver
+(e.g., DBD::Oracle) for this handle. Not normally set by application code.
+
+It also has the effect of disabling the 'quick FETCH' of attribute
+values from the handles attribute cache. So all attribute values
+are handled by the drivers own FETCH method. This makes them slightly
+slower but is useful for special-purpose drivers like DBD::Multiplex.
+
+=head3 C<InactiveDestroy> (boolean)
+
+The default value, false, means a handle will be fully destroyed
+as normal when the last reference to it is removed, just as you'd expect.
+
+If set true then the handle will be treated by the DESTROY as if it was no
+longer Active, and so the I<database engine> related effects of DESTROYing a
+handle will be skipped.
+
+Think of the name as meaning 'treat the handle as not-Active in the DESTROY
+method'.
+
+For a database handle, this attribute does not disable an I<explicit>
+call to the disconnect method, only the implicit call from DESTROY
+that happens if the handle is still marked as C<Active>.
+
+This attribute is specifically designed for use in Unix applications
+that "fork" child processes. Either the parent or the child process,
+but not both, should set C<InactiveDestroy> true on all their shared handles.
+(Note that some databases, including Oracle, don't support passing a
+database connection across a fork.)
+
+To help tracing applications using fork the process id is shown in
+the trace log whenever a DBI or handle trace() method is called.
+The process id also shown for I<every> method call if the DBI trace
+level (not handle trace level) is set high enough to show the trace
+from the DBI's method dispatcher, e.g. >= 9.
+
+=head3 C<PrintWarn> (boolean, inherited)
+
+The C<PrintWarn> attribute controls the printing of warnings recorded
+by the driver. When set to a true value the DBI will check method
+calls to see if a warning condition has been set. If so, the DBI
+will effectively do a C<warn("$class $method warning: $DBI::errstr")>
+where C<$class> is the driver class and C<$method> is the name of
+the method which failed. E.g.,
+
+ DBD::Oracle::db execute warning: ... warning text here ...
+
+By default, C<DBI-E<gt>connect> sets C<PrintWarn> "on" if $^W is true,
+i.e., perl is running with warnings enabled.
+
+If desired, the warnings can be caught and processed using a C<$SIG{__WARN__}>
+handler or modules like CGI::Carp and CGI::ErrorWrap.
+
+See also L</set_err> for how warnings are recorded and L</HandleSetErr>
+for how to influence it.
+
+Fetching the full details of warnings can require an extra round-trip
+to the database server for some drivers. In which case the driver
+may opt to only fetch the full details of warnings if the C<PrintWarn>
+attribute is true. If C<PrintWarn> is false then these drivers should
+still indicate the fact that there were warnings by setting the
+warning string to, for example: "3 warnings".
+
+=head3 C<PrintError> (boolean, inherited)
+
+The C<PrintError> attribute can be used to force errors to generate warnings (using
+C<warn>) in addition to returning error codes in the normal way. When set
+"on", any method which results in an error occurring will cause the DBI to
+effectively do a C<warn("$class $method failed: $DBI::errstr")> where C<$class>
+is the driver class and C<$method> is the name of the method which failed. E.g.,
+
+ DBD::Oracle::db prepare failed: ... error text here ...
+
+By default, C<DBI-E<gt>connect> sets C<PrintError> "on".
+
+If desired, the warnings can be caught and processed using a C<$SIG{__WARN__}>
+handler or modules like CGI::Carp and CGI::ErrorWrap.
+
+=head3 C<RaiseError> (boolean, inherited)
+
+The C<RaiseError> attribute can be used to force errors to raise exceptions rather
+than simply return error codes in the normal way. It is "off" by default.
+When set "on", any method which results in an error will cause
+the DBI to effectively do a C<die("$class $method failed: $DBI::errstr")>,
+where C<$class> is the driver class and C<$method> is the name of the method
+that failed. E.g.,
+
+ DBD::Oracle::db prepare failed: ... error text here ...
+
+If you turn C<RaiseError> on then you'd normally turn C<PrintError> off.
+If C<PrintError> is also on, then the C<PrintError> is done first (naturally).
+
+Typically C<RaiseError> is used in conjunction with C<eval { ... }>
+to catch the exception that's been thrown and followed by an
+C<if ($@) { ... }> block to handle the caught exception.
+For example:
+
+ eval {
+ ...
+ $sth->execute();
+ ...
+ };
+ if ($@) {
+ # $sth->err and $DBI::err will be true if error was from DBI
+ warn $@; # print the error
+ ... # do whatever you need to deal with the error
+ }
+
+In that eval block the $DBI::lasth variable can be useful for
+diagnosis and reporting if you can't be sure which handle triggered
+the error. For example, $DBI::lasth->{Type} and $DBI::lasth->{Statement}.
+
+See also L</Transactions>.
+
+If you want to temporarily turn C<RaiseError> off (inside a library function
+that is likely to fail, for example), the recommended way is like this:
+
+ {
+ local $h->{RaiseError}; # localize and turn off for this block
+ ...
+ }
+
+The original value will automatically and reliably be restored by Perl,
+regardless of how the block is exited.
+The same logic applies to other attributes, including C<PrintError>.
+
+=head3 C<HandleError> (code ref, inherited)
+
+The C<HandleError> attribute can be used to provide your own alternative behaviour
+in case of errors. If set to a reference to a subroutine then that
+subroutine is called when an error is detected (at the same point that
+C<RaiseError> and C<PrintError> are handled).
+
+The subroutine is called with three parameters: the error message
+string that C<RaiseError> and C<PrintError> would use,
+the DBI handle being used, and the first value being returned by
+the method that failed (typically undef).
+
+If the subroutine returns a false value then the C<RaiseError>
+and/or C<PrintError> attributes are checked and acted upon as normal.
+
+For example, to C<die> with a full stack trace for any error:
+
+ use Carp;
+ $h->{HandleError} = sub { confess(shift) };
+
+Or to turn errors into exceptions:
+
+ use Exception; # or your own favourite exception module
+ $h->{HandleError} = sub { Exception->new('DBI')->raise($_[0]) };
+
+It is possible to 'stack' multiple HandleError handlers by using
+closures:
+
+ sub your_subroutine {
+ my $previous_handler = $h->{HandleError};
+ $h->{HandleError} = sub {
+ return 1 if $previous_handler and &$previous_handler(@_);
+ ... your code here ...
+ };
+ }
+
+Using a C<my> inside a subroutine to store the previous C<HandleError>
+value is important. See L<perlsub> and L<perlref> for more information
+about I<closures>.
+
+It is possible for C<HandleError> to alter the error message that
+will be used by C<RaiseError> and C<PrintError> if it returns false.
+It can do that by altering the value of $_[0]. This example appends
+a stack trace to all errors and, unlike the previous example using
+Carp::confess, this will work C<PrintError> as well as C<RaiseError>:
+
+ $h->{HandleError} = sub { $_[0]=Carp::longmess($_[0]); 0; };
+
+It is also possible for C<HandleError> to hide an error, to a limited
+degree, by using L</set_err> to reset $DBI::err and $DBI::errstr,
+and altering the return value of the failed method. For example:
+
+ $h->{HandleError} = sub {
+ return 0 unless $_[0] =~ /^\S+ fetchrow_arrayref failed:/;
+ return 0 unless $_[1]->err == 1234; # the error to 'hide'
+ $h->set_err(undef,undef); # turn off the error
+ $_[2] = [ ... ]; # supply alternative return value
+ return 1;
+ };
+
+This only works for methods which return a single value and is hard
+to make reliable (avoiding infinite loops, for example) and so isn't
+recommended for general use! If you find a I<good> use for it then
+please let me know.
+
+=head3 C<HandleSetErr> (code ref, inherited)
+
+The C<HandleSetErr> attribute can be used to intercept
+the setting of handle C<err>, C<errstr>, and C<state> values.
+If set to a reference to a subroutine then that subroutine is called
+whenever set_err() is called, typically by the driver or a subclass.
+
+The subroutine is called with five arguments, the first five that
+were passed to set_err(): the handle, the C<err>, C<errstr>, and
+C<state> values being set, and the method name. These can be altered
+by changing the values in the @_ array. The return value affects
+set_err() behaviour, see L</set_err> for details.
+
+It is possible to 'stack' multiple HandleSetErr handlers by using
+closures. See L</HandleError> for an example.
+
+The C<HandleSetErr> and C<HandleError> subroutines differ in subtle
+but significant ways. HandleError is only invoked at the point where
+the DBI is about to return to the application with C<err> set true.
+It's not invoked by the failure of a method that's been called by
+another DBI method. HandleSetErr, on the other hand, is called
+whenever set_err() is called with a defined C<err> value, even if false.
+So it's not just for errors, despite the name, but also warn and info states.
+The set_err() method, and thus HandleSetErr, may be called multiple
+times within a method and is usually invoked from deep within driver code.
+
+In theory a driver can use the return value from HandleSetErr via
+set_err() to decide whether to continue or not. If set_err() returns
+an empty list, indicating that the HandleSetErr code has 'handled'
+the 'error', the driver could then continue instead of failing (if
+that's a reasonable thing to do). This isn't excepted to be
+common and any such cases should be clearly marked in the driver
+documentation and discussed on the dbi-dev mailing list.
+
+The C<HandleSetErr> attribute was added in DBI 1.41.
+
+=head3 C<ErrCount> (unsigned integer)
+
+The C<ErrCount> attribute is incremented whenever the set_err()
+method records an error. It isn't incremented by warnings or
+information states. It is not reset by the DBI at any time.
+
+The C<ErrCount> attribute was added in DBI 1.41. Older drivers may
+not have been updated to use set_err() to record errors and so this
+attribute may not be incremented when using them.
+
+
+=head3 C<ShowErrorStatement> (boolean, inherited)
+
+The C<ShowErrorStatement> attribute can be used to cause the relevant
+Statement text to be appended to the error messages generated by
+the C<RaiseError>, C<PrintError>, and C<PrintWarn> attributes.
+Only applies to errors on statement handles
+plus the prepare(), do(), and the various C<select*()> database handle methods.
+(The exact format of the appended text is subject to change.)
+
+If C<$h-E<gt>{ParamValues}> returns a hash reference of parameter
+(placeholder) values then those are formatted and appended to the
+end of the Statement text in the error message.
+
+=head3 C<TraceLevel> (integer, inherited)
+
+The C<TraceLevel> attribute can be used as an alternative to the
+L</trace> method to set the DBI trace level and trace flags for a
+specific handle. See L</TRACING> for more details.
+
+The C<TraceLevel> attribute is especially useful combined with
+C<local> to alter the trace settings for just a single block of code.
+
+=head3 C<FetchHashKeyName> (string, inherited)
+
+The C<FetchHashKeyName> attribute is used to specify whether the fetchrow_hashref()
+method should perform case conversion on the field names used for
+the hash keys. For historical reasons it defaults to 'C<NAME>' but
+it is recommended to set it to 'C<NAME_lc>' (convert to lower case)
+or 'C<NAME_uc>' (convert to upper case) according to your preference.
+It can only be set for driver and database handles. For statement
+handles the value is frozen when prepare() is called.
+
+
+=head3 C<ChopBlanks> (boolean, inherited)
+
+The C<ChopBlanks> attribute can be used to control the trimming of trailing space
+characters from fixed width character (CHAR) fields. No other field
+types are affected, even where field values have trailing spaces.
+
+The default is false (although it is possible that the default may change).
+Applications that need specific behaviour should set the attribute as
+needed.
+
+Drivers are not required to support this attribute, but any driver which
+does not support it must arrange to return C<undef> as the attribute value.
+
+
+=head3 C<LongReadLen> (unsigned integer, inherited)
+
+The C<LongReadLen> attribute may be used to control the maximum
+length of 'long' type fields (LONG, BLOB, CLOB, MEMO, etc.) which the driver will
+read from the database automatically when it fetches each row of data.
+
+The C<LongReadLen> attribute only relates to fetching and reading
+long values; it is not involved in inserting or updating them.
+
+A value of 0 means not to automatically fetch any long data.
+Drivers may return undef or an empty string for long fields when
+C<LongReadLen> is 0.
+
+The default is typically 0 (zero) or 80 bytes but may vary between drivers.
+Applications fetching long fields should set this value to slightly
+larger than the longest long field value to be fetched.
+
+Some databases return some long types encoded as pairs of hex digits.
+For these types, C<LongReadLen> relates to the underlying data
+length and not the doubled-up length of the encoded string.
+
+Changing the value of C<LongReadLen> for a statement handle after it
+has been C<prepare>'d will typically have no effect, so it's common to
+set C<LongReadLen> on the C<$dbh> before calling C<prepare>.
+
+For most drivers the value used here has a direct effect on the
+memory used by the statement handle while it's active, so don't be
+too generous. If you can't be sure what value to use you could
+execute an extra select statement to determine the longest value.
+For example:
+
+ $dbh->{LongReadLen} = $dbh->selectrow_array(qq{
+ SELECT MAX(OCTET_LENGTH(long_column_name))
+ FROM table WHERE ...
+ });
+ $sth = $dbh->prepare(qq{
+ SELECT long_column_name, ... FROM table WHERE ...
+ });
+
+You may need to take extra care if the table can be modified between
+the first select and the second being executed. You may also need to
+use a different function if OCTET_LENGTH() does not work for long
+types in your database. For example, for Sybase use DATALENGTH() and
+for Oracle use LENGTHB().
+
+See also L</LongTruncOk> for information on truncation of long types.
+
+=head3 C<LongTruncOk> (boolean, inherited)
+
+The C<LongTruncOk> attribute may be used to control the effect of
+fetching a long field value which has been truncated (typically
+because it's longer than the value of the C<LongReadLen> attribute).
+
+By default, C<LongTruncOk> is false and so fetching a long value that
+needs to be truncated will cause the fetch to fail.
+(Applications should always be sure to
+check for errors after a fetch loop in case an error, such as a divide
+by zero or long field truncation, caused the fetch to terminate
+prematurely.)
+
+If a fetch fails due to a long field truncation when C<LongTruncOk> is
+false, many drivers will allow you to continue fetching further rows.
+
+See also L</LongReadLen>.
+
+=head3 C<TaintIn> (boolean, inherited)
+
+If the C<TaintIn> attribute is set to a true value I<and> Perl is running in
+taint mode (e.g., started with the C<-T> option), then all the arguments
+to most DBI method calls are checked for being tainted. I<This may change.>
+
+The attribute defaults to off, even if Perl is in taint mode.
+See L<perlsec> for more about taint mode. If Perl is not
+running in taint mode, this attribute has no effect.
+
+When fetching data that you trust you can turn off the TaintIn attribute,
+for that statement handle, for the duration of the fetch loop.
+
+The C<TaintIn> attribute was added in DBI 1.31.
+
+=head3 C<TaintOut> (boolean, inherited)
+
+If the C<TaintOut> attribute is set to a true value I<and> Perl is running in
+taint mode (e.g., started with the C<-T> option), then most data fetched
+from the database is considered tainted. I<This may change.>
+
+The attribute defaults to off, even if Perl is in taint mode.
+See L<perlsec> for more about taint mode. If Perl is not
+running in taint mode, this attribute has no effect.
+
+When fetching data that you trust you can turn off the TaintOut attribute,
+for that statement handle, for the duration of the fetch loop.
+
+Currently only fetched data is tainted. It is possible that the results
+of other DBI method calls, and the value of fetched attributes, may
+also be tainted in future versions. That change may well break your
+applications unless you take great care now. If you use DBI Taint mode,
+please report your experience and any suggestions for changes.
+
+The C<TaintOut> attribute was added in DBI 1.31.
+
+=head3 C<Taint> (boolean, inherited)
+
+The C<Taint> attribute is a shortcut for L</TaintIn> and L</TaintOut> (it is also present
+for backwards compatibility).
+
+Setting this attribute sets both L</TaintIn> and L</TaintOut>, and retrieving
+it returns a true value if and only if L</TaintIn> and L</TaintOut> are
+both set to true values.
+
+=head3 C<Profile> (inherited)
+
+The C<Profile> attribute enables the collection and reporting of method call timing statistics.
+See the L<DBI::Profile> module documentation for I<much> more detail.
+
+The C<Profile> attribute was added in DBI 1.24.
+
+=head3 C<ReadOnly> (boolean, inherited)
+
+An application can set the C<ReadOnly> attribute of a handle to a true value to
+indicate that it will not be attempting to make any changes using that handle
+or any children of it.
+
+Note that the exact definition of 'read only' is rather fuzzy.
+For more details see the documentation for the driver you're using.
+
+If the driver can make the handle truly read-only then it should
+(unless doing so would have unpleasant side effect, like changing the
+consistency level from per-statement to per-session).
+Otherwise the attribute is simply advisory.
+
+A driver can set the C<ReadOnly> attribute itself to indicate that the data it
+is connected to cannot be changed for some reason.
+
+Library modules and proxy drivers can use the attribute to influence their behavior.
+For example, the DBD::Gofer driver considers the C<ReadOnly> attribute when
+making a decision about whether to retry an operation that failed.
+
+The attribute should be set to 1 or 0 (or undef). Other values are reserved.
+
+=head3 C<private_your_module_name_*>
+
+The DBI provides a way to store extra information in a DBI handle as
+"private" attributes. The DBI will allow you to store and retrieve any
+attribute which has a name starting with "C<private_>".
+
+It is I<strongly> recommended that you use just I<one> private
+attribute (e.g., use a hash ref) I<and> give it a long and unambiguous
+name that includes the module or application name that the attribute
+relates to (e.g., "C<private_YourFullModuleName_thingy>").
+
+Because of the way the Perl tie mechanism works you cannot reliably
+use the C<||=> operator directly to initialise the attribute, like this:
+
+ my $foo = $dbh->{private_yourmodname_foo} ||= { ... }; # WRONG
+
+you should use a two step approach like this:
+
+ my $foo = $dbh->{private_yourmodname_foo};
+ $foo ||= $dbh->{private_yourmodname_foo} = { ... };
+
+This attribute is primarily of interest to people sub-classing DBI,
+or for applications to piggy-back extra information onto DBI handles.
+
+=head1 DBI DATABASE HANDLE OBJECTS
+
+This section covers the methods and attributes associated with
+database handles.
+
+=head2 Database Handle Methods
+
+The following methods are specified for DBI database handles:
+
+=head3 C<clone>
+
+ $new_dbh = $dbh->clone();
+ $new_dbh = $dbh->clone(\%attr);
+
+The C<clone> method duplicates the $dbh connection by connecting
+with the same parameters ($dsn, $user, $password) as originally used.
+
+The attributes for the cloned connect are the same as those used
+for the original connect, with some other attribute merged over
+them depending on the \%attr parameter.
+
+If \%attr is given then the attributes it contains are merged into
+the original attributes and override any with the same names.
+Effectively the same as doing:
+
+ %attribues_used = ( %original_attributes, %attr );
+
+If \%attr is not given then it defaults to a hash containing all
+the attributes in the attribute cache of $dbh excluding any non-code
+references, plus the main boolean attributes (RaiseError, PrintError,
+AutoCommit, etc.). This behaviour is subject to change.
+
+The clone method can be used even if the database handle is disconnected.
+
+The C<clone> method was added in DBI 1.33. It is very new and likely
+to change.
+
+=head3 C<data_sources>
+
+ @ary = $dbh->data_sources();
+ @ary = $dbh->data_sources(\%attr);
+
+Returns a list of data sources (databases) available via the $dbh
+driver's data_sources() method, plus any extra data sources that
+the driver can discover via the connected $dbh. Typically the extra
+data sources are other databases managed by the same server process
+that the $dbh is connected to.
+
+Data sources are returned in a form suitable for passing to the
+L</connect> method (that is, they will include the "C<dbi:$driver:>" prefix).
+
+The data_sources() method, for a $dbh, was added in DBI 1.38.
+
+=head3 C<do>
+
+ $rows = $dbh->do($statement) or die $dbh->errstr;
+ $rows = $dbh->do($statement, \%attr) or die $dbh->errstr;
+ $rows = $dbh->do($statement, \%attr, @bind_values) or die ...
+
+Prepare and execute a single statement. Returns the number of rows
+affected or C<undef> on error. A return value of C<-1> means the
+number of rows is not known, not applicable, or not available.
+
+This method is typically most useful for I<non>-C<SELECT> statements that
+either cannot be prepared in advance (due to a limitation of the
+driver) or do not need to be executed repeatedly. It should not
+be used for C<SELECT> statements because it does not return a statement
+handle (so you can't fetch any data).
+
+The default C<do> method is logically similar to:
+
+ sub do {
+ my($dbh, $statement, $attr, @bind_values) = @_;
+ my $sth = $dbh->prepare($statement, $attr) or return undef;
+ $sth->execute(@bind_values) or return undef;
+ my $rows = $sth->rows;
+ ($rows == 0) ? "0E0" : $rows; # always return true if no error
+ }
+
+For example:
+
+ my $rows_deleted = $dbh->do(q{
+ DELETE FROM table
+ WHERE status = ?
+ }, undef, 'DONE') or die $dbh->errstr;
+
+Using placeholders and C<@bind_values> with the C<do> method can be
+useful because it avoids the need to correctly quote any variables
+in the C<$statement>. But if you'll be executing the statement many
+times then it's more efficient to C<prepare> it once and call
+C<execute> many times instead.
+
+The C<q{...}> style quoting used in this example avoids clashing with
+quotes that may be used in the SQL statement. Use the double-quote-like
+C<qq{...}> operator if you want to interpolate variables into the string.
+See L<perlop/"Quote and Quote-like Operators"> for more details.
+
+=head3 C<last_insert_id>
+
+ $rv = $dbh->last_insert_id($catalog, $schema, $table, $field);
+ $rv = $dbh->last_insert_id($catalog, $schema, $table, $field, \%attr);
+
+Returns a value 'identifying' the row just inserted, if possible.
+Typically this would be a value assigned by the database server
+to a column with an I<auto_increment> or I<serial> type.
+Returns undef if the driver does not support the method or can't
+determine the value.
+
+The $catalog, $schema, $table, and $field parameters may be required
+for some drivers (see below). If you don't know the parameter values
+and your driver does not need them, then use C<undef> for each.
+
+There are several caveats to be aware of with this method if you want
+to use it for portable applications:
+
+B<*> For some drivers the value may only available immediately after
+the insert statement has executed (e.g., mysql, Informix).
+
+B<*> For some drivers the $catalog, $schema, $table, and $field parameters
+are required, for others they are ignored (e.g., mysql).
+
+B<*> Drivers may return an indeterminate value if no insert has
+been performed yet.
+
+B<*> For some drivers the value may only be available if placeholders
+have I<not> been used (e.g., Sybase, MS SQL). In this case the value
+returned would be from the last non-placeholder insert statement.
+
+B<*> Some drivers may need driver-specific hints about how to get
+the value. For example, being told the name of the database 'sequence'
+object that holds the value. Any such hints are passed as driver-specific
+attributes in the \%attr parameter.
+
+B<*> If the underlying database offers nothing better, then some
+drivers may attempt to implement this method by executing
+"C<select max($field) from $table>". Drivers using any approach
+like this should issue a warning if C<AutoCommit> is true because
+it is generally unsafe - another process may have modified the table
+between your insert and the select. For situations where you know
+it is safe, such as when you have locked the table, you can silence
+the warning by passing C<Warn> => 0 in \%attr.
+
+B<*> If no insert has been performed yet, or the last insert failed,
+then the value is implementation defined.
+
+Given all the caveats above, it's clear that this method must be
+used with care.
+
+The C<last_insert_id> method was added in DBI 1.38.
+
+=head3 C<selectrow_array>
+
+ @row_ary = $dbh->selectrow_array($statement);
+ @row_ary = $dbh->selectrow_array($statement, \%attr);
+ @row_ary = $dbh->selectrow_array($statement, \%attr, @bind_values);
+
+This utility method combines L</prepare>, L</execute> and
+L</fetchrow_array> into a single call. If called in a list context, it
+returns the first row of data from the statement. The C<$statement>
+parameter can be a previously prepared statement handle, in which case
+the C<prepare> is skipped.
+
+If any method fails, and L</RaiseError> is not set, C<selectrow_array>
+will return an empty list.
+
+If called in a scalar context for a statement handle that has more
+than one column, it is undefined whether the driver will return
+the value of the first column or the last. So don't do that.
+Also, in a scalar context, an C<undef> is returned if there are no
+more rows or if an error occurred. That C<undef> can't be distinguished
+from an C<undef> returned because the first field value was NULL.
+For these reasons you should exercise some caution if you use
+C<selectrow_array> in a scalar context, or just don't do that.
+
+
+=head3 C<selectrow_arrayref>
+
+ $ary_ref = $dbh->selectrow_arrayref($statement);
+ $ary_ref = $dbh->selectrow_arrayref($statement, \%attr);
+ $ary_ref = $dbh->selectrow_arrayref($statement, \%attr, @bind_values);
+
+This utility method combines L</prepare>, L</execute> and
+L</fetchrow_arrayref> into a single call. It returns the first row of
+data from the statement. The C<$statement> parameter can be a previously
+prepared statement handle, in which case the C<prepare> is skipped.
+
+If any method fails, and L</RaiseError> is not set, C<selectrow_array>
+will return undef.
+
+
+=head3 C<selectrow_hashref>
+
+ $hash_ref = $dbh->selectrow_hashref($statement);
+ $hash_ref = $dbh->selectrow_hashref($statement, \%attr);
+ $hash_ref = $dbh->selectrow_hashref($statement, \%attr, @bind_values);
+
+This utility method combines L</prepare>, L</execute> and
+L</fetchrow_hashref> into a single call. It returns the first row of
+data from the statement. The C<$statement> parameter can be a previously
+prepared statement handle, in which case the C<prepare> is skipped.
+
+If any method fails, and L</RaiseError> is not set, C<selectrow_hashref>
+will return undef.
+
+
+=head3 C<selectall_arrayref>
+
+ $ary_ref = $dbh->selectall_arrayref($statement);
+ $ary_ref = $dbh->selectall_arrayref($statement, \%attr);
+ $ary_ref = $dbh->selectall_arrayref($statement, \%attr, @bind_values);
+
+This utility method combines L</prepare>, L</execute> and
+L</fetchall_arrayref> into a single call. It returns a reference to an
+array containing a reference to an array (or hash, see below) for each row of
+data fetched.
+
+The C<$statement> parameter can be a previously prepared statement handle,
+in which case the C<prepare> is skipped. This is recommended if the
+statement is going to be executed many times.
+
+If L</RaiseError> is not set and any method except C<fetchall_arrayref>
+fails then C<selectall_arrayref> will return C<undef>; if
+C<fetchall_arrayref> fails then it will return with whatever data
+has been fetched thus far. You should check C<$sth-E<gt>err>
+afterwards (or use the C<RaiseError> attribute) to discover if the data is
+complete or was truncated due to an error.
+
+The L</fetchall_arrayref> method called by C<selectall_arrayref>
+supports a $max_rows parameter. You can specify a value for $max_rows
+by including a 'C<MaxRows>' attribute in \%attr. In which case finish()
+is called for you after fetchall_arrayref() returns.
+
+The L</fetchall_arrayref> method called by C<selectall_arrayref>
+also supports a $slice parameter. You can specify a value for $slice by
+including a 'C<Slice>' or 'C<Columns>' attribute in \%attr. The only
+difference between the two is that if C<Slice> is not defined and
+C<Columns> is an array ref, then the array is assumed to contain column
+index values (which count from 1), rather than perl array index values.
+In which case the array is copied and each value decremented before
+passing to C</fetchall_arrayref>.
+
+You may often want to fetch an array of rows where each row is stored as a
+hash. That can be done simple using:
+
+ my $emps = $dbh->selectall_arrayref(
+ "SELECT ename FROM emp ORDER BY ename",
+ { Slice => {} }
+ );
+ foreach my $emp ( @$emps ) {
+ print "Employee: $emp->{ename}\n";
+ }
+
+Or, to fetch into an array instead of an array ref:
+
+ @result = @{ $dbh->selectall_arrayref($sql, { Slice => {} }) };
+
+See L</fetchall_arrayref> method for more details.
+
+=head3 C<selectall_hashref>
+
+ $hash_ref = $dbh->selectall_hashref($statement, $key_field);
+ $hash_ref = $dbh->selectall_hashref($statement, $key_field, \%attr);
+ $hash_ref = $dbh->selectall_hashref($statement, $key_field, \%attr, @bind_values);
+
+This utility method combines L</prepare>, L</execute> and
+L</fetchall_hashref> into a single call. It returns a reference to a
+hash containing one entry, at most, for each row, as returned by fetchall_hashref().
+
+The C<$statement> parameter can be a previously prepared statement handle,
+in which case the C<prepare> is skipped. This is recommended if the
+statement is going to be executed many times.
+
+The C<$key_field> parameter defines which column, or columns, are used as keys
+in the returned hash. It can either be the name of a single field, or a
+reference to an array containing multiple field names. Using multiple names
+yields a tree of nested hashes.
+
+If a row has the same key as an earlier row then it replaces the earlier row.
+
+If any method except C<fetchrow_hashref> fails, and L</RaiseError> is not set,
+C<selectall_hashref> will return C<undef>. If C<fetchrow_hashref> fails and
+L</RaiseError> is not set, then it will return with whatever data it
+has fetched thus far. $DBI::err should be checked to catch that.
+
+See fetchall_hashref() for more details.
+
+=head3 C<selectcol_arrayref>
+
+ $ary_ref = $dbh->selectcol_arrayref($statement);
+ $ary_ref = $dbh->selectcol_arrayref($statement, \%attr);
+ $ary_ref = $dbh->selectcol_arrayref($statement, \%attr, @bind_values);
+
+This utility method combines L</prepare>, L</execute>, and fetching one
+column from all the rows, into a single call. It returns a reference to
+an array containing the values of the first column from each row.
+
+The C<$statement> parameter can be a previously prepared statement handle,
+in which case the C<prepare> is skipped. This is recommended if the
+statement is going to be executed many times.
+
+If any method except C<fetch> fails, and L</RaiseError> is not set,
+C<selectcol_arrayref> will return C<undef>. If C<fetch> fails and
+L</RaiseError> is not set, then it will return with whatever data it
+has fetched thus far. $DBI::err should be checked to catch that.
+
+The C<selectcol_arrayref> method defaults to pushing a single column
+value (the first) from each row into the result array. However, it can
+also push another column, or even multiple columns per row, into the
+result array. This behaviour can be specified via a 'C<Columns>'
+attribute which must be a ref to an array containing the column number
+or numbers to use. For example:
+
+ # get array of id and name pairs:
+ my $ary_ref = $dbh->selectcol_arrayref("select id, name from table", { Columns=>[1,2] });
+ my %hash = @$ary_ref; # build hash from key-value pairs so $hash{$id} => name
+
+You can specify a maximum number of rows to fetch by including a
+'C<MaxRows>' attribute in \%attr.
+
+=head3 C<prepare>
+
+ $sth = $dbh->prepare($statement) or die $dbh->errstr;
+ $sth = $dbh->prepare($statement, \%attr) or die $dbh->errstr;
+
+Prepares a statement for later execution by the database
+engine and returns a reference to a statement handle object.
+
+The returned statement handle can be used to get attributes of the
+statement and invoke the L</execute> method. See L</Statement Handle Methods>.
+
+Drivers for engines without the concept of preparing a
+statement will typically just store the statement in the returned
+handle and process it when C<$sth-E<gt>execute> is called. Such drivers are
+unlikely to give much useful information about the
+statement, such as C<$sth-E<gt>{NUM_OF_FIELDS}>, until after C<$sth-E<gt>execute>
+has been called. Portable applications should take this into account.
+
+In general, DBI drivers do not parse the contents of the statement
+(other than simply counting any L</Placeholders>). The statement is
+passed directly to the database engine, sometimes known as pass-thru
+mode. This has advantages and disadvantages. On the plus side, you can
+access all the functionality of the engine being used. On the downside,
+you're limited if you're using a simple engine, and you need to take extra care if
+writing applications intended to be portable between engines.
+
+Portable applications should not assume that a new statement can be
+prepared and/or executed while still fetching results from a previous
+statement.
+
+Some command-line SQL tools use statement terminators, like a semicolon,
+to indicate the end of a statement. Such terminators should not normally
+be used with the DBI.
+
+
+=head3 C<prepare_cached>
+
+ $sth = $dbh->prepare_cached($statement)
+ $sth = $dbh->prepare_cached($statement, \%attr)
+ $sth = $dbh->prepare_cached($statement, \%attr, $if_active)
+
+Like L</prepare> except that the statement handle returned will be
+stored in a hash associated with the C<$dbh>. If another call is made to
+C<prepare_cached> with the same C<$statement> and C<%attr> parameter values,
+then the corresponding cached C<$sth> will be returned without contacting the
+database server.
+
+The C<$if_active> parameter lets you adjust the behaviour if an
+already cached statement handle is still Active. There are several
+alternatives:
+
+=over 4
+
+=item B<0>: A warning will be generated, and finish() will be called on
+the statement handle before it is returned. This is the default
+behaviour if $if_active is not passed.
+
+=item B<1>: finish() will be called on the statement handle, but the
+warning is suppressed.
+
+=item B<2>: Disables any checking.
+
+=item B<3>: The existing active statement handle will be removed from the
+cache and a new statement handle prepared and cached in its place.
+This is the safest option because it doesn't affect the state of the
+old handle, it just removes it from the cache. [Added in DBI 1.40]
+
+=back
+
+Here are some examples of C<prepare_cached>:
+
+ sub insert_hash {
+ my ($table, $field_values) = @_;
+ # sort to keep field order, and thus sql, stable for prepare_cached
+ my @fields = sort keys %$field_values;
+ my @values = @{$field_values}{@fields};
+ my $sql = sprintf "insert into %s (%s) values (%s)",
+ $table, join(",", @fields), join(",", ("?")x@fields);
+ my $sth = $dbh->prepare_cached($sql);
+ return $sth->execute(@values);
+ }
+
+ sub search_hash {
+ my ($table, $field_values) = @_;
+ # sort to keep field order, and thus sql, stable for prepare_cached
+ my @fields = sort keys %$field_values;
+ my @values = @{$field_values}{@fields};
+ my $qualifier = "";
+ $qualifier = "where ".join(" and ", map { "$_=?" } @fields) if @fields;
+ $sth = $dbh->prepare_cached("SELECT * FROM $table $qualifier");
+ return $dbh->selectall_arrayref($sth, {}, @values);
+ }
+
+I<Caveat emptor:> This caching can be useful in some applications,
+but it can also cause problems and should be used with care. Here
+is a contrived case where caching would cause a significant problem:
+
+ my $sth = $dbh->prepare_cached('SELECT * FROM foo WHERE bar=?');
+ $sth->execute(...);
+ while (my $data = $sth->fetchrow_hashref) {
+
+ # later, in some other code called within the loop...
+ my $sth2 = $dbh->prepare_cached('SELECT * FROM foo WHERE bar=?');
+ $sth2->execute(...);
+ while (my $data2 = $sth2->fetchrow_arrayref) {
+ do_stuff(...);
+ }
+ }
+
+In this example, since both handles are preparing the exact same statement,
+C<$sth2> will not be its own statement handle, but a duplicate of C<$sth>
+returned from the cache. The results will certainly not be what you expect.
+Typically the the inner fetch loop will work normally, fetching all
+the records and terminating when there are no more, but now $sth
+is the same as $sth2 the outer fetch loop will also terminate.
+
+You'll know if you run into this problem because prepare_cached()
+will generate a warning by default (when $if_active is false).
+
+The cache used by prepare_cached() is keyed by both the statement
+and any attributes so you can also avoid this issue by doing something
+like:
+
+ $sth = $dbh->prepare_cached("...", { dbi_dummy => __FILE__.__LINE__ });
+
+which will ensure that prepare_cached only returns statements cached
+by that line of code in that source file.
+
+If you'd like the cache to managed intelligently, you can tie the
+hashref returned by C<CachedKids> to an appropriate caching module,
+such as L<Tie::Cache::LRU>:
+
+ my $cache;
+ tie %$cache, 'Tie::Cache::LRU', 500;
+ $dbh->{CachedKids} = $cache;
+
+=head3 C<commit>
+
+ $rc = $dbh->commit or die $dbh->errstr;
+
+Commit (make permanent) the most recent series of database changes
+if the database supports transactions and AutoCommit is off.
+
+If C<AutoCommit> is on, then calling
+C<commit> will issue a "commit ineffective with AutoCommit" warning.
+
+See also L</Transactions> in the L</FURTHER INFORMATION> section below.
+
+=head3 C<rollback>
+
+ $rc = $dbh->rollback or die $dbh->errstr;
+
+Rollback (undo) the most recent series of uncommitted database
+changes if the database supports transactions and AutoCommit is off.
+
+If C<AutoCommit> is on, then calling
+C<rollback> will issue a "rollback ineffective with AutoCommit" warning.
+
+See also L</Transactions> in the L</FURTHER INFORMATION> section below.
+
+=head3 C<begin_work>
+
+ $rc = $dbh->begin_work or die $dbh->errstr;
+
+Enable transactions (by turning C<AutoCommit> off) until the next call
+to C<commit> or C<rollback>. After the next C<commit> or C<rollback>,
+C<AutoCommit> will automatically be turned on again.
+
+If C<AutoCommit> is already off when C<begin_work> is called then
+it does nothing except return an error. If the driver does not support
+transactions then when C<begin_work> attempts to set C<AutoCommit> off
+the driver will trigger a fatal error.
+
+See also L</Transactions> in the L</FURTHER INFORMATION> section below.
+
+
+=head3 C<disconnect>
+
+ $rc = $dbh->disconnect or warn $dbh->errstr;
+
+Disconnects the database from the database handle. C<disconnect> is typically only used
+before exiting the program. The handle is of little use after disconnecting.
+
+The transaction behaviour of the C<disconnect> method is, sadly,
+undefined. Some database systems (such as Oracle and Ingres) will
+automatically commit any outstanding changes, but others (such as
+Informix) will rollback any outstanding changes. Applications not
+using C<AutoCommit> should explicitly call C<commit> or C<rollback> before
+calling C<disconnect>.
+
+The database is automatically disconnected by the C<DESTROY> method if
+still connected when there are no longer any references to the handle.
+The C<DESTROY> method for each driver should implicitly call C<rollback> to
+undo any uncommitted changes. This is vital behaviour to ensure that
+incomplete transactions don't get committed simply because Perl calls
+C<DESTROY> on every object before exiting. Also, do not rely on the order
+of object destruction during "global destruction", as it is undefined.
+
+Generally, if you want your changes to be committed or rolled back when
+you disconnect, then you should explicitly call L</commit> or L</rollback>
+before disconnecting.
+
+If you disconnect from a database while you still have active
+statement handles (e.g., SELECT statement handles that may have
+more data to fetch), you will get a warning. The warning may indicate
+that a fetch loop terminated early, perhaps due to an uncaught error.
+To avoid the warning call the C<finish> method on the active handles.
+
+
+=head3 C<ping>
+
+ $rc = $dbh->ping;
+
+Attempts to determine, in a reasonably efficient way, if the database
+server is still running and the connection to it is still working.
+Individual drivers should implement this function in the most suitable
+manner for their database engine.
+
+The current I<default> implementation always returns true without
+actually doing anything. Actually, it returns "C<0 but true>" which is
+true but zero. That way you can tell if the return value is genuine or
+just the default. Drivers should override this method with one that
+does the right thing for their type of database.
+
+Few applications would have direct use for this method. See the specialized
+Apache::DBI module for one example usage.
+
+
+=head3 C<get_info>
+
+ $value = $dbh->get_info( $info_type );
+
+Returns information about the implementation, i.e. driver and data
+source capabilities, restrictions etc. It returns C<undef> for
+unknown or unimplemented information types. For example:
+
+ $database_version = $dbh->get_info( 18 ); # SQL_DBMS_VER
+ $max_select_tables = $dbh->get_info( 106 ); # SQL_MAXIMUM_TABLES_IN_SELECT
+
+See L</"Standards Reference Information"> for more detailed information
+about the information types and their meanings and possible return values.
+
+The DBI::Const::GetInfoType module exports a %GetInfoType hash that
+can be used to map info type names to numbers. For example:
+
+ $database_version = $dbh->get_info( $GetInfoType{SQL_DBMS_VER} );
+
+The names are a merging of the ANSI and ODBC standards (which differ
+in some cases). See L<DBI::Const::GetInfoType> for more details.
+
+Because some DBI methods make use of get_info(), drivers are strongly
+encouraged to support I<at least> the following very minimal set
+of information types to ensure the DBI itself works properly:
+
+ Type Name Example A Example B
+ ---- -------------------------- ------------ ----------------
+ 17 SQL_DBMS_NAME 'ACCESS' 'Oracle'
+ 18 SQL_DBMS_VER '03.50.0000' '08.01.0721 ...'
+ 29 SQL_IDENTIFIER_QUOTE_CHAR '`' '"'
+ 41 SQL_CATALOG_NAME_SEPARATOR '.' '@'
+ 114 SQL_CATALOG_LOCATION 1 2
+
+=head3 C<table_info>
+
+ $sth = $dbh->table_info( $catalog, $schema, $table, $type );
+ $sth = $dbh->table_info( $catalog, $schema, $table, $type, \%attr );
+
+ # then $sth->fetchall_arrayref or $sth->fetchall_hashref etc
+
+Returns an active statement handle that can be used to fetch
+information about tables and views that exist in the database.
+
+The arguments $catalog, $schema and $table may accept search patterns
+according to the database/driver, for example: $table = '%FOO%';
+Remember that the underscore character ('C<_>') is a search pattern
+that means match any character, so 'FOO_%' is the same as 'FOO%'
+and 'FOO_BAR%' will match names like 'FOO1BAR'.
+
+The value of $type is a comma-separated list of one or more types of
+tables to be returned in the result set. Each value may optionally be
+quoted, e.g.:
+
+ $type = "TABLE";
+ $type = "'TABLE','VIEW'";
+
+In addition the following special cases may also be supported by some drivers:
+
+=over 4
+
+=item *
+If the value of $catalog is '%' and $schema and $table name
+are empty strings, the result set contains a list of catalog names.
+For example:
+
+ $sth = $dbh->table_info('%', '', '');
+
+=item *
+If the value of $schema is '%' and $catalog and $table are empty
+strings, the result set contains a list of schema names.
+
+=item *
+If the value of $type is '%' and $catalog, $schema, and $table are all
+empty strings, the result set contains a list of table types.
+
+=back
+
+If your driver doesn't support one or more of the selection filter
+parameters then you may get back more than you asked for and can
+do the filtering yourself.
+
+This method can be expensive, and can return a large amount of data.
+(For example, small Oracle installation returns over 2000 rows.)
+So it's a good idea to use the filters to limit the data as much as possible.
+
+The statement handle returned has at least the following fields in the
+order show below. Other fields, after these, may also be present.
+
+B<TABLE_CAT>: Table catalog identifier. This field is NULL (C<undef>) if not
+applicable to the data source, which is usually the case. This field
+is empty if not applicable to the table.
+
+B<TABLE_SCHEM>: The name of the schema containing the TABLE_NAME value.
+This field is NULL (C<undef>) if not applicable to data source, and
+empty if not applicable to the table.
+
+B<TABLE_NAME>: Name of the table (or view, synonym, etc).
+
+B<TABLE_TYPE>: One of the following: "TABLE", "VIEW", "SYSTEM TABLE",
+"GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM" or a type
+identifier that is specific to the data
+source.
+
+B<REMARKS>: A description of the table. May be NULL (C<undef>).
+
+Note that C<table_info> might not return records for all tables.
+Applications can use any valid table regardless of whether it's
+returned by C<table_info>.
+
+See also L</tables>, L</"Catalog Methods"> and
+L</"Standards Reference Information">.
+
+=head3 C<column_info>
+
+ $sth = $dbh->column_info( $catalog, $schema, $table, $column );
+
+ # then $sth->fetchall_arrayref or $sth->fetchall_hashref etc
+
+Returns an active statement handle that can be used to fetch
+information about columns in specified tables.
+
+The arguments $schema, $table and $column may accept search patterns
+according to the database/driver, for example: $table = '%FOO%';
+
+Note: The support for the selection criteria is driver specific. If the
+driver doesn't support one or more of them then you may get back more
+than you asked for and can do the filtering yourself.
+
+If the arguments don't match any tables then you'll still get a statement
+handle, it'll just return no rows.
+
+The statement handle returned has at least the following fields in the
+order shown below. Other fields, after these, may also be present.
+
+B<TABLE_CAT>: The catalog identifier.
+This field is NULL (C<undef>) if not applicable to the data source,
+which is often the case. This field is empty if not applicable to the
+table.
+
+B<TABLE_SCHEM>: The schema identifier.
+This field is NULL (C<undef>) if not applicable to the data source,
+and empty if not applicable to the table.
+
+B<TABLE_NAME>: The table identifier.
+Note: A driver may provide column metadata not only for base tables, but
+also for derived objects like SYNONYMS etc.
+
+B<COLUMN_NAME>: The column identifier.
+
+B<DATA_TYPE>: The concise data type code.
+
+B<TYPE_NAME>: A data source dependent data type name.
+
+B<COLUMN_SIZE>: The column size.
+This is the maximum length in characters for character data types,
+the number of digits or bits for numeric data types or the length
+in the representation of temporal types.
+See the relevant specifications for detailed information.
+
+B<BUFFER_LENGTH>: The length in bytes of transferred data.
+
+B<DECIMAL_DIGITS>: The total number of significant digits to the right of
+the decimal point.
+
+B<NUM_PREC_RADIX>: The radix for numeric precision.
+The value is 10 or 2 for numeric data types and NULL (C<undef>) if not
+applicable.
+
+B<NULLABLE>: Indicates if a column can accept NULLs.
+The following values are defined:
+
+ SQL_NO_NULLS 0
+ SQL_NULLABLE 1
+ SQL_NULLABLE_UNKNOWN 2
+
+B<REMARKS>: A description of the column.
+
+B<COLUMN_DEF>: The default value of the column, in a format that can be used
+directly in an SQL statement.
+
+Note that this may be an expression and not simply the text used for the
+default value in the original CREATE TABLE statement. For example, given:
+
+ col1 char(30) default current_user -- a 'function'
+ col2 char(30) default 'string' -- a string literal
+
+where "current_user" is the name of a function, the corresponding C<COLUMN_DEF>
+values would be:
+
+ Database col1 col2
+ -------- ---- ----
+ Oracle: current_user 'string'
+ Postgres: "current_user"() 'string'::text
+ MS SQL: (user_name()) ('string')
+
+B<SQL_DATA_TYPE>: The SQL data type.
+
+B<SQL_DATETIME_SUB>: The subtype code for datetime and interval data types.
+
+B<CHAR_OCTET_LENGTH>: The maximum length in bytes of a character or binary
+data type column.
+
+B<ORDINAL_POSITION>: The column sequence number (starting with 1).
+
+B<IS_NULLABLE>: Indicates if the column can accept NULLs.
+Possible values are: 'NO', 'YES' and ''.
+
+SQL/CLI defines the following additional columns:
+
+ CHAR_SET_CAT
+ CHAR_SET_SCHEM
+ CHAR_SET_NAME
+ COLLATION_CAT
+ COLLATION_SCHEM
+ COLLATION_NAME
+ UDT_CAT
+ UDT_SCHEM
+ UDT_NAME
+ DOMAIN_CAT
+ DOMAIN_SCHEM
+ DOMAIN_NAME
+ SCOPE_CAT
+ SCOPE_SCHEM
+ SCOPE_NAME
+ MAX_CARDINALITY
+ DTD_IDENTIFIER
+ IS_SELF_REF
+
+Drivers capable of supplying any of those values should do so in
+the corresponding column and supply undef values for the others.
+
+Drivers wishing to provide extra database/driver specific information
+should do so in extra columns beyond all those listed above, and
+use lowercase field names with the driver-specific prefix (i.e.,
+'ora_...'). Applications accessing such fields should do so by name
+and not by column number.
+
+The result set is ordered by TABLE_CAT, TABLE_SCHEM, TABLE_NAME
+and ORDINAL_POSITION.
+
+Note: There is some overlap with statement handle attributes (in perl) and
+SQLDescribeCol (in ODBC). However, SQLColumns provides more metadata.
+
+See also L</"Catalog Methods"> and L</"Standards Reference Information">.
+
+=head3 C<primary_key_info>
+
+ $sth = $dbh->primary_key_info( $catalog, $schema, $table );
+
+ # then $sth->fetchall_arrayref or $sth->fetchall_hashref etc
+
+Returns an active statement handle that can be used to fetch information
+about columns that make up the primary key for a table.
+The arguments don't accept search patterns (unlike table_info()).
+
+The statement handle will return one row per column, ordered by
+TABLE_CAT, TABLE_SCHEM, TABLE_NAME, and KEY_SEQ.
+If there is no primary key then the statement handle will fetch no rows.
+
+Note: The support for the selection criteria, such as $catalog, is
+driver specific. If the driver doesn't support catalogs and/or
+schemas, it may ignore these criteria.
+
+The statement handle returned has at least the following fields in the
+order shown below. Other fields, after these, may also be present.
+
+B<TABLE_CAT>: The catalog identifier.
+This field is NULL (C<undef>) if not applicable to the data source,
+which is often the case. This field is empty if not applicable to the
+table.
+
+B<TABLE_SCHEM>: The schema identifier.
+This field is NULL (C<undef>) if not applicable to the data source,
+and empty if not applicable to the table.
+
+B<TABLE_NAME>: The table identifier.
+
+B<COLUMN_NAME>: The column identifier.
+
+B<KEY_SEQ>: The column sequence number (starting with 1).
+Note: This field is named B<ORDINAL_POSITION> in SQL/CLI.
+
+B<PK_NAME>: The primary key constraint identifier.
+This field is NULL (C<undef>) if not applicable to the data source.
+
+See also L</"Catalog Methods"> and L</"Standards Reference Information">.
+
+=head3 C<primary_key>
+
+ @key_column_names = $dbh->primary_key( $catalog, $schema, $table );
+
+Simple interface to the primary_key_info() method. Returns a list of
+the column names that comprise the primary key of the specified table.
+The list is in primary key column sequence order.
+If there is no primary key then an empty list is returned.
+
+=head3 C<foreign_key_info>
+
+ $sth = $dbh->foreign_key_info( $pk_catalog, $pk_schema, $pk_table
+ , $fk_catalog, $fk_schema, $fk_table );
+
+ $sth = $dbh->foreign_key_info( $pk_catalog, $pk_schema, $pk_table
+ , $fk_catalog, $fk_schema, $fk_table
+ , \%attr );
+
+ # then $sth->fetchall_arrayref or $sth->fetchall_hashref etc
+
+Returns an active statement handle that can be used to fetch information
+about foreign keys in and/or referencing the specified table(s).
+The arguments don't accept search patterns (unlike table_info()).
+
+C<$pk_catalog>, C<$pk_schema>, C<$pk_table>
+identify the primary (unique) key table (B<PKT>).
+
+C<$fk_catalog>, C<$fk_schema>, C<$fk_table>
+identify the foreign key table (B<FKT>).
+
+If both B<PKT> and B<FKT> are given, the function returns the foreign key, if
+any, in table B<FKT> that refers to the primary (unique) key of table B<PKT>.
+(Note: In SQL/CLI, the result is implementation-defined.)
+
+If only B<PKT> is given, then the result set contains the primary key
+of that table and all foreign keys that refer to it.
+
+If only B<FKT> is given, then the result set contains all foreign keys
+in that table and the primary keys to which they refer.
+(Note: In SQL/CLI, the result includes unique keys too.)
+
+For example:
+
+ $sth = $dbh->foreign_key_info( undef, $user, 'master');
+ $sth = $dbh->foreign_key_info( undef, undef, undef , undef, $user, 'detail');
+ $sth = $dbh->foreign_key_info( undef, $user, 'master', undef, $user, 'detail');
+
+ # then $sth->fetchall_arrayref or $sth->fetchall_hashref etc
+
+Note: The support for the selection criteria, such as C<$catalog>, is
+driver specific. If the driver doesn't support catalogs and/or
+schemas, it may ignore these criteria.
+
+The statement handle returned has the following fields in the order shown below.
+Because ODBC never includes unique keys, they define different columns in the
+result set than SQL/CLI. SQL/CLI column names are shown in parentheses.
+
+B<PKTABLE_CAT ( UK_TABLE_CAT )>:
+The primary (unique) key table catalog identifier.
+This field is NULL (C<undef>) if not applicable to the data source,
+which is often the case. This field is empty if not applicable to the
+table.
+
+B<PKTABLE_SCHEM ( UK_TABLE_SCHEM )>:
+The primary (unique) key table schema identifier.
+This field is NULL (C<undef>) if not applicable to the data source,
+and empty if not applicable to the table.
+
+B<PKTABLE_NAME ( UK_TABLE_NAME )>:
+The primary (unique) key table identifier.
+
+B<PKCOLUMN_NAME (UK_COLUMN_NAME )>:
+The primary (unique) key column identifier.
+
+B<FKTABLE_CAT ( FK_TABLE_CAT )>:
+The foreign key table catalog identifier.
+This field is NULL (C<undef>) if not applicable to the data source,
+which is often the case. This field is empty if not applicable to the
+table.
+
+B<FKTABLE_SCHEM ( FK_TABLE_SCHEM )>:
+The foreign key table schema identifier.
+This field is NULL (C<undef>) if not applicable to the data source,
+and empty if not applicable to the table.
+
+B<FKTABLE_NAME ( FK_TABLE_NAME )>:
+The foreign key table identifier.
+
+B<FKCOLUMN_NAME ( FK_COLUMN_NAME )>:
+The foreign key column identifier.
+
+B<KEY_SEQ ( ORDINAL_POSITION )>:
+The column sequence number (starting with 1).
+
+B<UPDATE_RULE ( UPDATE_RULE )>:
+The referential action for the UPDATE rule.
+The following codes are defined:
+
+ CASCADE 0
+ RESTRICT 1
+ SET NULL 2
+ NO ACTION 3
+ SET DEFAULT 4
+
+B<DELETE_RULE ( DELETE_RULE )>:
+The referential action for the DELETE rule.
+The codes are the same as for UPDATE_RULE.
+
+B<FK_NAME ( FK_NAME )>:
+The foreign key name.
+
+B<PK_NAME ( UK_NAME )>:
+The primary (unique) key name.
+
+B<DEFERRABILITY ( DEFERABILITY )>:
+The deferrability of the foreign key constraint.
+The following codes are defined:
+
+ INITIALLY DEFERRED 5
+ INITIALLY IMMEDIATE 6
+ NOT DEFERRABLE 7
+
+B< ( UNIQUE_OR_PRIMARY )>:
+This column is necessary if a driver includes all candidate (i.e. primary and
+alternate) keys in the result set (as specified by SQL/CLI).
+The value of this column is UNIQUE if the foreign key references an alternate
+key and PRIMARY if the foreign key references a primary key, or it
+may be undefined if the driver doesn't have access to the information.
+
+See also L</"Catalog Methods"> and L</"Standards Reference Information">.
+
+=head3 C<statistics_info>
+
+B<Warning:> This method is experimental and may change.
+
+ $sth = $dbh->statistics_info( $catalog, $schema, $table, $unique_only, $quick );
+
+ # then $sth->fetchall_arrayref or $sth->fetchall_hashref etc
+
+Returns an active statement handle that can be used to fetch statistical
+information about a table and its indexes.
+
+The arguments don't accept search patterns (unlike L</table_info>).
+
+If the boolean argument $unique_only is true, only UNIQUE indexes will be
+returned in the result set, otherwise all indexes will be returned.
+
+If the boolean argument $quick is set, the actual statistical information
+columns (CARDINALITY and PAGES) will only be returned if they are readily
+available from the server, and might not be current. Some databases may
+return stale statistics or no statistics at all with this flag set.
+
+The statement handle will return at most one row per column name per index,
+plus at most one row for the entire table itself, ordered by NON_UNIQUE, TYPE,
+INDEX_QUALIFIER, INDEX_NAME, and ORDINAL_POSITION.
+
+Note: The support for the selection criteria, such as $catalog, is
+driver specific. If the driver doesn't support catalogs and/or
+schemas, it may ignore these criteria.
+
+The statement handle returned has at least the following fields in the
+order shown below. Other fields, after these, may also be present.
+
+B<TABLE_CAT>: The catalog identifier.
+This field is NULL (C<undef>) if not applicable to the data source,
+which is often the case. This field is empty if not applicable to the
+table.
+
+B<TABLE_SCHEM>: The schema identifier.
+This field is NULL (C<undef>) if not applicable to the data source,
+and empty if not applicable to the table.
+
+B<TABLE_NAME>: The table identifier.
+
+B<NON_UNIQUE>: Unique index indicator.
+Returns 0 for unique indexes, 1 for non-unique indexes
+
+B<INDEX_QUALIFIER>: Index qualifier identifier.
+The identifier that is used to qualify the index name when doing a
+C<DROP INDEX>; NULL (C<undef>) is returned if an index qualifier is not
+supported by the data source.
+If a non-NULL (defined) value is returned in this column, it must be used
+to qualify the index name on a C<DROP INDEX> statement; otherwise,
+the TABLE_SCHEM should be used to qualify the index name.
+
+B<INDEX_NAME>: The index identifier.
+
+B<TYPE>: The type of information being returned. Can be any of the
+following values: 'table', 'btree', 'clustered', 'content', 'hashed',
+or 'other'.
+
+In the case that this field is 'table', all fields
+other than TABLE_CAT, TABLE_SCHEM, TABLE_NAME, TYPE,
+CARDINALITY, and PAGES will be NULL (C<undef>).
+
+B<ORDINAL_POSITION>: Column sequence number (starting with 1).
+
+B<COLUMN_NAME>: The column identifier.
+
+B<ASC_OR_DESC>: Column sort sequence.
+C<A> for Ascending, C<D> for Descending, or NULL (C<undef>) if
+not supported for this index.
+
+B<CARDINALITY>: Cardinality of the table or index.
+For indexes, this is the number of unique values in the index.
+For tables, this is the number of rows in the table.
+If not supported, the value will be NULL (C<undef>).
+
+B<PAGES>: Number of storage pages used by this table or index.
+If not supported, the value will be NULL (C<undef>).
+
+B<FILTER_CONDITION>: The index filter condition as a string.
+If the index is not a filtered index, or it cannot be determined
+whether the index is a filtered index, this value is NULL (C<undef>).
+If the index is a filtered index, but the filter condition
+cannot be determined, this value is the empty string C<''>.
+Otherwise it will be the literal filter condition as a string,
+such as C<SALARY <= 4500>.
+
+See also L</"Catalog Methods"> and L</"Standards Reference Information">.
+
+=head3 C<tables>
+
+ @names = $dbh->tables( $catalog, $schema, $table, $type );
+ @names = $dbh->tables; # deprecated
+
+Simple interface to table_info(). Returns a list of matching
+table names, possibly including a catalog/schema prefix.
+
+See L</table_info> for a description of the parameters.
+
+If C<$dbh-E<gt>get_info(29)> returns true (29 is SQL_IDENTIFIER_QUOTE_CHAR)
+then the table names are constructed and quoted by L</quote_identifier>
+to ensure they are usable even if they contain whitespace or reserved
+words etc. This means that the table names returned will include
+quote characters.
+
+=head3 C<type_info_all>
+
+ $type_info_all = $dbh->type_info_all;
+
+Returns a reference to an array which holds information about each data
+type variant supported by the database and driver. The array and its
+contents should be treated as read-only.
+
+The first item is a reference to an 'index' hash of C<Name =>E<gt> C<Index> pairs.
+The items following that are references to arrays, one per supported data
+type variant. The leading index hash defines the names and order of the
+fields within the arrays that follow it.
+For example:
+
+ $type_info_all = [
+ { TYPE_NAME => 0,
+ DATA_TYPE => 1,
+ COLUMN_SIZE => 2, # was PRECISION originally
+ LITERAL_PREFIX => 3,
+ LITERAL_SUFFIX => 4,
+ CREATE_PARAMS => 5,
+ NULLABLE => 6,
+ CASE_SENSITIVE => 7,
+ SEARCHABLE => 8,
+ UNSIGNED_ATTRIBUTE=> 9,
+ FIXED_PREC_SCALE => 10, # was MONEY originally
+ AUTO_UNIQUE_VALUE => 11, # was AUTO_INCREMENT originally
+ LOCAL_TYPE_NAME => 12,
+ MINIMUM_SCALE => 13,
+ MAXIMUM_SCALE => 14,
+ SQL_DATA_TYPE => 15,
+ SQL_DATETIME_SUB => 16,
+ NUM_PREC_RADIX => 17,
+ INTERVAL_PRECISION=> 18,
+ },
+ [ 'VARCHAR', SQL_VARCHAR,
+ undef, "'","'", undef,0, 1,1,0,0,0,undef,1,255, undef
+ ],
+ [ 'INTEGER', SQL_INTEGER,
+ undef, "", "", undef,0, 0,1,0,0,0,undef,0, 0, 10
+ ],
+ ];
+
+More than one row may have the same value in the C<DATA_TYPE>
+field if there are different ways to spell the type name and/or there
+are variants of the type with different attributes (e.g., with and
+without C<AUTO_UNIQUE_VALUE> set, with and without C<UNSIGNED_ATTRIBUTE>, etc).
+
+The rows are ordered by C<DATA_TYPE> first and then by how closely each
+type maps to the corresponding ODBC SQL data type, closest first.
+
+The meaning of the fields is described in the documentation for
+the L</type_info> method.
+
+An 'index' hash is provided so you don't need to rely on index
+values defined above. However, using DBD::ODBC with some old ODBC
+drivers may return older names, shown as comments in the example above.
+Another issue with the index hash is that the lettercase of the
+keys is not defined. It is usually uppercase, as show here, but
+drivers may return names with any lettercase.
+
+Drivers are also free to return extra driver-specific columns of
+information - though it's recommended that they start at column
+index 50 to leave room for expansion of the DBI/ODBC specification.
+
+The type_info_all() method is not normally used directly.
+The L</type_info> method provides a more usable and useful interface
+to the data.
+
+=head3 C<type_info>
+
+ @type_info = $dbh->type_info($data_type);
+
+Returns a list of hash references holding information about one or more
+variants of $data_type. The list is ordered by C<DATA_TYPE> first and
+then by how closely each type maps to the corresponding ODBC SQL data
+type, closest first. If called in a scalar context then only the first
+(best) element is returned.
+
+If $data_type is undefined or C<SQL_ALL_TYPES>, then the list will
+contain hashes for all data type variants supported by the database and driver.
+
+If $data_type is an array reference then C<type_info> returns the
+information for the I<first> type in the array that has any matches.
+
+The keys of the hash follow the same letter case conventions as the
+rest of the DBI (see L</Naming Conventions and Name Space>). The
+following uppercase items should always exist, though may be undef:
+
+=over 4
+
+=item TYPE_NAME (string)
+
+Data type name for use in CREATE TABLE statements etc.
+
+=item DATA_TYPE (integer)
+
+SQL data type number.
+
+=item COLUMN_SIZE (integer)
+
+For numeric types, this is either the total number of digits (if the
+NUM_PREC_RADIX value is 10) or the total number of bits allowed in the
+column (if NUM_PREC_RADIX is 2).
+
+For string types, this is the maximum size of the string in characters.
+
+For date and interval types, this is the maximum number of characters
+needed to display the value.
+
+=item LITERAL_PREFIX (string)
+
+Characters used to prefix a literal. A typical prefix is "C<'>" for characters,
+or possibly "C<0x>" for binary values passed as hexadecimal. NULL (C<undef>) is
+returned for data types for which this is not applicable.
+
+
+=item LITERAL_SUFFIX (string)
+
+Characters used to suffix a literal. Typically "C<'>" for characters.
+NULL (C<undef>) is returned for data types where this is not applicable.
+
+=item CREATE_PARAMS (string)
+
+Parameter names for data type definition. For example, C<CREATE_PARAMS> for a
+C<DECIMAL> would be "C<precision,scale>" if the DECIMAL type should be
+declared as C<DECIMAL(>I<precision,scale>C<)> where I<precision> and I<scale>
+are integer values. For a C<VARCHAR> it would be "C<max length>".
+NULL (C<undef>) is returned for data types for which this is not applicable.
+
+=item NULLABLE (integer)
+
+Indicates whether the data type accepts a NULL value:
+C<0> or an empty string = no, C<1> = yes, C<2> = unknown.
+
+=item CASE_SENSITIVE (boolean)
+
+Indicates whether the data type is case sensitive in collations and
+comparisons.
+
+=item SEARCHABLE (integer)
+
+Indicates how the data type can be used in a WHERE clause, as
+follows:
+
+ 0 - Cannot be used in a WHERE clause
+ 1 - Only with a LIKE predicate
+ 2 - All comparison operators except LIKE
+ 3 - Can be used in a WHERE clause with any comparison operator
+
+=item UNSIGNED_ATTRIBUTE (boolean)
+
+Indicates whether the data type is unsigned. NULL (C<undef>) is returned
+for data types for which this is not applicable.
+
+=item FIXED_PREC_SCALE (boolean)
+
+Indicates whether the data type always has the same precision and scale
+(such as a money type). NULL (C<undef>) is returned for data types
+for which
+this is not applicable.
+
+=item AUTO_UNIQUE_VALUE (boolean)
+
+Indicates whether a column of this data type is automatically set to a
+unique value whenever a new row is inserted. NULL (C<undef>) is returned
+for data types for which this is not applicable.
+
+=item LOCAL_TYPE_NAME (string)
+
+Localized version of the C<TYPE_NAME> for use in dialog with users.
+NULL (C<undef>) is returned if a localized name is not available (in which
+case C<TYPE_NAME> should be used).
+
+=item MINIMUM_SCALE (integer)
+
+The minimum scale of the data type. If a data type has a fixed scale,
+then C<MAXIMUM_SCALE> holds the same value. NULL (C<undef>) is returned for
+data types for which this is not applicable.
+
+=item MAXIMUM_SCALE (integer)
+
+The maximum scale of the data type. If a data type has a fixed scale,
+then C<MINIMUM_SCALE> holds the same value. NULL (C<undef>) is returned for
+data types for which this is not applicable.
+
+=item SQL_DATA_TYPE (integer)
+
+This column is the same as the C<DATA_TYPE> column, except for interval
+and datetime data types. For interval and datetime data types, the
+C<SQL_DATA_TYPE> field will return C<SQL_INTERVAL> or C<SQL_DATETIME>, and the
+C<SQL_DATETIME_SUB> field below will return the subcode for the specific
+interval or datetime data type. If this field is NULL, then the driver
+does not support or report on interval or datetime subtypes.
+
+=item SQL_DATETIME_SUB (integer)
+
+For interval or datetime data types, where the C<SQL_DATA_TYPE>
+field above is C<SQL_INTERVAL> or C<SQL_DATETIME>, this field will
+hold the I<subcode> for the specific interval or datetime data type.
+Otherwise it will be NULL (C<undef>).
+
+Although not mentioned explicitly in the standards, it seems there
+is a simple relationship between these values:
+
+ DATA_TYPE == (10 * SQL_DATA_TYPE) + SQL_DATETIME_SUB
+
+=item NUM_PREC_RADIX (integer)
+
+The radix value of the data type. For approximate numeric types,
+C<NUM_PREC_RADIX>
+contains the value 2 and C<COLUMN_SIZE> holds the number of bits. For
+exact numeric types, C<NUM_PREC_RADIX> contains the value 10 and C<COLUMN_SIZE> holds
+the number of decimal digits. NULL (C<undef>) is returned either for data types
+for which this is not applicable or if the driver cannot report this information.
+
+=item INTERVAL_PRECISION (integer)
+
+The interval leading precision for interval types. NULL is returned
+either for data types for which this is not applicable or if the driver
+cannot report this information.
+
+=back
+
+For example, to find the type name for the fields in a select statement
+you can do:
+
+ @names = map { scalar $dbh->type_info($_)->{TYPE_NAME} } @{ $sth->{TYPE} }
+
+Since DBI and ODBC drivers vary in how they map their types into the
+ISO standard types you may need to search for more than one type.
+Here's an example looking for a usable type to store a date:
+
+ $my_date_type = $dbh->type_info( [ SQL_DATE, SQL_TIMESTAMP ] );
+
+Similarly, to more reliably find a type to store small integers, you could
+use a list starting with C<SQL_SMALLINT>, C<SQL_INTEGER>, C<SQL_DECIMAL>, etc.
+
+See also L</"Standards Reference Information">.
+
+
+=head3 C<quote>
+
+ $sql = $dbh->quote($value);
+ $sql = $dbh->quote($value, $data_type);
+
+Quote a string literal for use as a literal value in an SQL statement,
+by escaping any special characters (such as quotation marks)
+contained within the string and adding the required type of outer
+quotation marks.
+
+ $sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
+ $dbh->quote("Don't");
+
+For most database types, at least those that conform to SQL standards, quote
+would return C<'Don''t'> (including the outer quotation marks). For others it
+may return something like C<'Don\'t'>
+
+An undefined C<$value> value will be returned as the string C<NULL> (without
+single quotation marks) to match how NULLs are represented in SQL.
+
+If C<$data_type> is supplied, it is used to try to determine the required
+quoting behaviour by using the information returned by L</type_info>.
+As a special case, the standard numeric types are optimized to return
+C<$value> without calling C<type_info>.
+
+Quote will probably I<not> be able to deal with all possible input
+(such as binary data or data containing newlines), and is not related in
+any way with escaping or quoting shell meta-characters.
+
+It is valid for the quote() method to return an SQL expression that
+evaluates to the desired string. For example:
+
+ $quoted = $dbh->quote("one\ntwo\0three")
+
+may return something like:
+
+ CONCAT('one', CHAR(12), 'two', CHAR(0), 'three')
+
+The quote() method should I<not> be used with L</"Placeholders and
+Bind Values">.
+
+=head3 C<quote_identifier>
+
+ $sql = $dbh->quote_identifier( $name );
+ $sql = $dbh->quote_identifier( $catalog, $schema, $table, \%attr );
+
+Quote an identifier (table name etc.) for use in an SQL statement,
+by escaping any special characters (such as double quotation marks)
+it contains and adding the required type of outer quotation marks.
+
+Undefined names are ignored and the remainder are quoted and then
+joined together, typically with a dot (C<.>) character. For example:
+
+ $id = $dbh->quote_identifier( undef, 'Her schema', 'My table' );
+
+would, for most database types, return C<"Her schema"."My table">
+(including all the double quotation marks).
+
+If three names are supplied then the first is assumed to be a
+catalog name and special rules may be applied based on what L</get_info>
+returns for SQL_CATALOG_NAME_SEPARATOR (41) and SQL_CATALOG_LOCATION (114).
+For example, for Oracle:
+
+ $id = $dbh->quote_identifier( 'link', 'schema', 'table' );
+
+would return C<"schema"."table"@"link">.
+
+=head3 C<take_imp_data>
+
+ $imp_data = $dbh->take_imp_data;
+
+Leaves the $dbh in an almost dead, zombie-like, state and returns
+a binary string of raw implementation data from the driver which
+describes the current database connection. Effectively it detaches
+the underlying database API connection data from the DBI handle.
+After calling take_imp_data(), all other methods except C<DESTROY>
+will generate a warning and return undef.
+
+Why would you want to do this? You don't, forget I even mentioned it.
+Unless, that is, you're implementing something advanced like a
+multi-threaded connection pool. See L<DBI::Pool>.
+
+The returned $imp_data can be passed as a C<dbi_imp_data> attribute
+to a later connect() call, even in a separate thread in the same
+process, where the driver can use it to 'adopt' the existing
+connection that the implementation data was taken from.
+
+Some things to keep in mind...
+
+B<*> the $imp_data holds the only reference to the underlying
+database API connection data. That connection is still 'live' and
+won't be cleaned up properly unless the $imp_data is used to create
+a new $dbh which is then allowed to disconnect() normally.
+
+B<*> using the same $imp_data to create more than one other new
+$dbh at a time may well lead to unpleasant problems. Don't do that.
+
+Any child statement handles are effectively destroyed when take_imp_data() is
+called.
+
+The C<take_imp_data> method was added in DBI 1.36 but wasn't useful till 1.49.
+
+
+=head2 Database Handle Attributes
+
+This section describes attributes specific to database handles.
+
+Changes to these database handle attributes do not affect any other
+existing or future database handles.
+
+Attempting to set or get the value of an unknown attribute generates a warning,
+except for private driver-specific attributes (which all have names
+starting with a lowercase letter).
+
+Example:
+
+ $h->{AutoCommit} = ...; # set/write
+ ... = $h->{AutoCommit}; # get/read
+
+=head3 C<AutoCommit> (boolean)
+
+If true, then database changes cannot be rolled-back (undone). If false,
+then database changes automatically occur within a "transaction", which
+must either be committed or rolled back using the C<commit> or C<rollback>
+methods.
+
+Drivers should always default to C<AutoCommit> mode (an unfortunate
+choice largely forced on the DBI by ODBC and JDBC conventions.)
+
+Attempting to set C<AutoCommit> to an unsupported value is a fatal error.
+This is an important feature of the DBI. Applications that need
+full transaction behaviour can set C<$dbh-E<gt>{AutoCommit} = 0> (or
+set C<AutoCommit> to 0 via L</connect>)
+without having to check that the value was assigned successfully.
+
+For the purposes of this description, we can divide databases into three
+categories:
+
+ Databases which don't support transactions at all.
+ Databases in which a transaction is always active.
+ Databases in which a transaction must be explicitly started (C<'BEGIN WORK'>).
+
+B<* Databases which don't support transactions at all>
+
+For these databases, attempting to turn C<AutoCommit> off is a fatal error.
+C<commit> and C<rollback> both issue warnings about being ineffective while
+C<AutoCommit> is in effect.
+
+B<* Databases in which a transaction is always active>
+
+These are typically mainstream commercial relational databases with
+"ANSI standard" transaction behaviour.
+If C<AutoCommit> is off, then changes to the database won't have any
+lasting effect unless L</commit> is called (but see also
+L</disconnect>). If L</rollback> is called then any changes since the
+last commit are undone.
+
+If C<AutoCommit> is on, then the effect is the same as if the DBI
+called C<commit> automatically after every successful database
+operation. So calling C<commit> or C<rollback> explicitly while
+C<AutoCommit> is on would be ineffective because the changes would
+have already been committed.
+
+Changing C<AutoCommit> from off to on will trigger a L</commit>.
+
+For databases which don't support a specific auto-commit mode, the
+driver has to commit each statement automatically using an explicit
+C<COMMIT> after it completes successfully (and roll it back using an
+explicit C<ROLLBACK> if it fails). The error information reported to the
+application will correspond to the statement which was executed, unless
+it succeeded and the commit or rollback failed.
+
+B<* Databases in which a transaction must be explicitly started>
+
+For these databases, the intention is to have them act like databases in
+which a transaction is always active (as described above).
+
+To do this, the driver will automatically begin an explicit transaction
+when C<AutoCommit> is turned off, or after a L</commit> or
+L</rollback> (or when the application issues the next database
+operation after one of those events).
+
+In this way, the application does not have to treat these databases
+as a special case.
+
+See L</commit>, L</disconnect> and L</Transactions> for other important
+notes about transactions.
+
+
+=head3 C<Driver> (handle)
+
+Holds the handle of the parent driver. The only recommended use for this
+is to find the name of the driver using:
+
+ $dbh->{Driver}->{Name}
+
+
+=head3 C<Name> (string)
+
+Holds the "name" of the database. Usually (and recommended to be) the
+same as the "C<dbi:DriverName:...>" string used to connect to the database,
+but with the leading "C<dbi:DriverName:>" removed.
+
+
+=head3 C<Statement> (string, read-only)
+
+Returns the statement string passed to the most recent L</prepare> method
+called in this database handle, even if that method failed. This is especially
+useful where C<RaiseError> is enabled and the exception handler checks $@
+and sees that a 'prepare' method call failed.
+
+
+=head3 C<RowCacheSize> (integer)
+
+A hint to the driver indicating the size of the local row cache that the
+application would like the driver to use for future C<SELECT> statements.
+If a row cache is not implemented, then setting C<RowCacheSize> is ignored
+and getting the value returns C<undef>.
+
+Some C<RowCacheSize> values have special meaning, as follows:
+
+ 0 - Automatically determine a reasonable cache size for each C<SELECT>
+ 1 - Disable the local row cache
+ >1 - Cache this many rows
+ <0 - Cache as many rows that will fit into this much memory for each C<SELECT>.
+
+Note that large cache sizes may require a very large amount of memory
+(I<cached rows * maximum size of row>). Also, a large cache will cause
+a longer delay not only for the first fetch, but also whenever the
+cache needs refilling.
+
+See also the L</RowsInCache> statement handle attribute.
+
+=head3 C<Username> (string)
+
+Returns the username used to connect to the database.
+
+
+=head1 DBI STATEMENT HANDLE OBJECTS
+
+This section lists the methods and attributes associated with DBI
+statement handles.
+
+=head2 Statement Handle Methods
+
+The DBI defines the following methods for use on DBI statement handles:
+
+=head3 C<bind_param>
+
+ $sth->bind_param($p_num, $bind_value)
+ $sth->bind_param($p_num, $bind_value, \%attr)
+ $sth->bind_param($p_num, $bind_value, $bind_type)
+
+The C<bind_param> method takes a copy of $bind_value and associates it
+(binds it) with a placeholder, identified by $p_num, embedded in
+the prepared statement. Placeholders are indicated with question
+mark character (C<?>). For example:
+
+ $dbh->{RaiseError} = 1; # save having to check each method call
+ $sth = $dbh->prepare("SELECT name, age FROM people WHERE name LIKE ?");
+ $sth->bind_param(1, "John%"); # placeholders are numbered from 1
+ $sth->execute;
+ DBI::dump_results($sth);
+
+See L</"Placeholders and Bind Values"> for more information.
+
+
+B<Data Types for Placeholders>
+
+The C<\%attr> parameter can be used to hint at the data type the
+placeholder should have. This is rarely needed. Typically, the driver is only
+interested in knowing if the placeholder should be bound as a number or a string.
+
+ $sth->bind_param(1, $value, { TYPE => SQL_INTEGER });
+
+As a short-cut for the common case, the data type can be passed
+directly, in place of the C<\%attr> hash reference. This example is
+equivalent to the one above:
+
+ $sth->bind_param(1, $value, SQL_INTEGER);
+
+The C<TYPE> value indicates the standard (non-driver-specific) type for
+this parameter. To specify the driver-specific type, the driver may
+support a driver-specific attribute, such as C<{ ora_type =E<gt> 97 }>.
+
+The SQL_INTEGER and other related constants can be imported using
+
+ use DBI qw(:sql_types);
+
+See L</"DBI Constants"> for more information.
+
+The data type is 'sticky' in that bind values passed to execute() are bound
+with the data type specified by earlier bind_param() calls, if any.
+Portable applications should not rely on being able to change the data type
+after the first C<bind_param> call.
+
+Perl only has string and number scalar data types. All database types
+that aren't numbers are bound as strings and must be in a format the
+database will understand except where the bind_param() TYPE attribute
+specifies a type that implies a particular format. For example, given:
+
+ $sth->bind_param(1, $value, SQL_DATETIME);
+
+the driver should expect $value to be in the ODBC standard SQL_DATETIME
+format, which is 'YYYY-MM-DD HH:MM:SS'. Similarly for SQL_DATE, SQL_TIME etc.
+
+As an alternative to specifying the data type in the C<bind_param> call,
+you can let the driver pass the value as the default type (C<VARCHAR>).
+You can then use an SQL function to convert the type within the statement.
+For example:
+
+ INSERT INTO price(code, price) VALUES (?, CONVERT(MONEY,?))
+
+The C<CONVERT> function used here is just an example. The actual function
+and syntax will vary between different databases and is non-portable.
+
+See also L</"Placeholders and Bind Values"> for more information.
+
+
+=head3 C<bind_param_inout>
+
+ $rc = $sth->bind_param_inout($p_num, \$bind_value, $max_len) or die $sth->errstr;
+ $rv = $sth->bind_param_inout($p_num, \$bind_value, $max_len, \%attr) or ...
+ $rv = $sth->bind_param_inout($p_num, \$bind_value, $max_len, $bind_type) or ...
+
+This method acts like L</bind_param>, but also enables values to be
+updated by the statement. The statement is typically
+a call to a stored procedure. The C<$bind_value> must be passed as a
+reference to the actual value to be used.
+
+Note that unlike L</bind_param>, the C<$bind_value> variable is not
+copied when C<bind_param_inout> is called. Instead, the value in the
+variable is read at the time L</execute> is called.
+
+The additional C<$max_len> parameter specifies the minimum amount of
+memory to allocate to C<$bind_value> for the new value. If the value
+returned from the database is too
+big to fit, then the execution should fail. If unsure what value to use,
+pick a generous length, i.e., a length larger than the longest value that would ever be
+returned. The only cost of using a larger value than needed is wasted memory.
+
+Undefined values or C<undef> are used to indicate null values.
+See also L</"Placeholders and Bind Values"> for more information.
+
+
+=head3 C<bind_param_array>
+
+ $rc = $sth->bind_param_array($p_num, $array_ref_or_value)
+ $rc = $sth->bind_param_array($p_num, $array_ref_or_value, \%attr)
+ $rc = $sth->bind_param_array($p_num, $array_ref_or_value, $bind_type)
+
+The C<bind_param_array> method is used to bind an array of values
+to a placeholder embedded in the prepared statement which is to be executed
+with L</execute_array>. For example:
+
+ $dbh->{RaiseError} = 1; # save having to check each method call
+ $sth = $dbh->prepare("INSERT INTO staff (first_name, last_name, dept) VALUES(?, ?, ?)");
+ $sth->bind_param_array(1, [ 'John', 'Mary', 'Tim' ]);
+ $sth->bind_param_array(2, [ 'Booth', 'Todd', 'Robinson' ]);
+ $sth->bind_param_array(3, "SALES"); # scalar will be reused for each row
+ $sth->execute_array( { ArrayTupleStatus => \my @tuple_status } );
+
+The C<%attr> ($bind_type) argument is the same as defined for L</bind_param>.
+Refer to L</bind_param> for general details on using placeholders.
+
+(Note that bind_param_array() can I<not> be used to expand a
+placeholder into a list of values for a statement like "SELECT foo
+WHERE bar IN (?)". A placeholder can only ever represent one value
+per execution.)
+
+Scalar values, including C<undef>, may also be bound by
+C<bind_param_array>. In which case the same value will be used for each
+L</execute> call. Driver-specific implementations may behave
+differently, e.g., when binding to a stored procedure call, some
+databases may permit mixing scalars and arrays as arguments.
+
+The default implementation provided by DBI (for drivers that have
+not implemented array binding) is to iteratively call L</execute> for
+each parameter tuple provided in the bound arrays. Drivers may
+provide more optimized implementations using whatever bulk operation
+support the database API provides. The default driver behaviour should
+match the default DBI behaviour, but always consult your driver
+documentation as there may be driver specific issues to consider.
+
+Note that the default implementation currently only supports non-data
+returning statements (INSERT, UPDATE, but not SELECT). Also,
+C<bind_param_array> and L</bind_param> cannot be mixed in the same
+statement execution, and C<bind_param_array> must be used with
+L</execute_array>; using C<bind_param_array> will have no effect
+for L</execute>.
+
+The C<bind_param_array> method was added in DBI 1.22.
+
+=head3 C<execute>
+
+ $rv = $sth->execute or die $sth->errstr;
+ $rv = $sth->execute(@bind_values) or die $sth->errstr;
+
+Perform whatever processing is necessary to execute the prepared
+statement. An C<undef> is returned if an error occurs. A successful
+C<execute> always returns true regardless of the number of rows affected,
+even if it's zero (see below). It is always important to check the
+return status of C<execute> (and most other DBI methods) for errors
+if you're not using L</RaiseError>.
+
+For a I<non>-C<SELECT> statement, C<execute> returns the number of rows
+affected, if known. If no rows were affected, then C<execute> returns
+"C<0E0>", which Perl will treat as 0 but will regard as true. Note that it
+is I<not> an error for no rows to be affected by a statement. If the
+number of rows affected is not known, then C<execute> returns -1.
+
+For C<SELECT> statements, execute simply "starts" the query within the
+database engine. Use one of the fetch methods to retrieve the data after
+calling C<execute>. The C<execute> method does I<not> return the number of
+rows that will be returned by the query (because most databases can't
+tell in advance), it simply returns a true value.
+
+You can tell if the statement was a C<SELECT> statement by checking if
+C<$sth-E<gt>{NUM_OF_FIELDS}> is greater than zero after calling C<execute>.
+
+If any arguments are given, then C<execute> will effectively call
+L</bind_param> for each value before executing the statement. Values
+bound in this way are usually treated as C<SQL_VARCHAR> types unless
+the driver can determine the correct type (which is rare), or unless
+C<bind_param> (or C<bind_param_inout>) has already been used to
+specify the type.
+
+Note that passing C<execute> an empty array is the same as passing no arguments
+at all, which will execute the statement with previously bound values.
+That's probably not what you want.
+
+If execute() is called on a statement handle that's still active
+($sth->{Active} is true) then it should effectively call finish()
+to tidy up the previous execution results before starting this new
+execution.
+
+=head3 C<execute_array>
+
+ $tuples = $sth->execute_array(\%attr) or die $sth->errstr;
+ $tuples = $sth->execute_array(\%attr, @bind_values) or die $sth->errstr;
+
+ ($tuples, $rows) = $sth->execute_array(\%attr) or die $sth->errstr;
+ ($tuples, $rows) = $sth->execute_array(\%attr, @bind_values) or die $sth->errstr;
+
+Execute the prepared statement once for each parameter tuple
+(group of values) provided either in the @bind_values, or by prior
+calls to L</bind_param_array>, or via a reference passed in \%attr.
+
+When called in scalar context the execute_array() method returns the
+number of tuples executed, or C<undef> if an error occurred. Like
+execute(), a successful execute_array() always returns true regardless
+of the number of tuples executed, even if it's zero. If there were any
+errors the ArrayTupleStatus array can be used to discover which tuples
+failed and with what errors.
+
+When called in list context the execute_array() method returns two scalars;
+$tuples is the same as calling execute_array() in scalar context and $rows is
+the sum of the number of rows affected for each tuple, if available or
+-1 if the driver cannot determine this.
+If you are doing an update operation the returned rows affected may not be what
+you expect if, for instance, one or more of the tuples affected the same row
+multiple times. Some drivers may not yet support list context, in which case
+$rows will be undef, or may not be able to provide the number of rows affected
+when performing this batch operation, in which case $rows will be -1.
+
+Bind values for the tuples to be executed may be supplied row-wise
+by an C<ArrayTupleFetch> attribute, or else column-wise in the
+C<@bind_values> argument, or else column-wise by prior calls to
+L</bind_param_array>.
+
+Where column-wise binding is used (via the C<@bind_values> argument
+or calls to bind_param_array()) the maximum number of elements in
+any one of the bound value arrays determines the number of tuples
+executed. Placeholders with fewer values in their parameter arrays
+are treated as if padded with undef (NULL) values.
+
+If a scalar value is bound, instead of an array reference, it is
+treated as a I<variable> length array with all elements having the
+same value. It's does not influence the number of tuples executed,
+so if all bound arrays have zero elements then zero tuples will
+be executed. If I<all> bound values are scalars then one tuple
+will be executed, making execute_array() act just like execute().
+
+The C<ArrayTupleFetch> attribute can be used to specify a reference
+to a subroutine that will be called to provide the bind values for
+each tuple execution. The subroutine should return an reference to
+an array which contains the appropriate number of bind values, or
+return an undef if there is no more data to execute.
+
+As a convenience, the C<ArrayTupleFetch> attribute can also be
+used to specify a statement handle. In which case the fetchrow_arrayref()
+method will be called on the given statement handle in order to
+provide the bind values for each tuple execution.
+
+The values specified via bind_param_array() or the @bind_values
+parameter may be either scalars, or arrayrefs. If any C<@bind_values>
+are given, then C<execute_array> will effectively call L</bind_param_array>
+for each value before executing the statement. Values bound in
+this way are usually treated as C<SQL_VARCHAR> types unless the
+driver can determine the correct type (which is rare), or unless
+C<bind_param>, C<bind_param_inout>, C<bind_param_array>, or
+C<bind_param_inout_array> has already been used to specify the type.
+See L</bind_param_array> for details.
+
+The C<ArrayTupleStatus> attribute can be used to specify a
+reference to an array which will receive the execute status of each
+executed parameter tuple. Note the C<ArrayTupleStatus> attribute was
+mandatory until DBI 1.38.
+
+For tuples which are successfully executed, the element at the same
+ordinal position in the status array is the resulting rowcount.
+If the execution of a tuple causes an error, then the corresponding
+status array element will be set to a reference to an array containing
+the error code and error string set by the failed execution.
+
+If B<any> tuple execution returns an error, C<execute_array> will
+return C<undef>. In that case, the application should inspect the
+status array to determine which parameter tuples failed.
+Some databases may not continue executing tuples beyond the first
+failure. In this case the status array will either hold fewer
+elements, or the elements beyond the failure will be undef.
+
+If all parameter tuples are successfully executed, C<execute_array>
+returns the number tuples executed. If no tuples were executed,
+then execute_array() returns "C<0E0>", just like execute() does,
+which Perl will treat as 0 but will regard as true.
+
+For example:
+
+ $sth = $dbh->prepare("INSERT INTO staff (first_name, last_name) VALUES (?, ?)");
+ my $tuples = $sth->execute_array(
+ { ArrayTupleStatus => \my @tuple_status },
+ \@first_names,
+ \@last_names,
+ );
+ if ($tuples) {
+ print "Successfully inserted $tuples records\n";
+ }
+ else {
+ for my $tuple (0..@last_names-1) {
+ my $status = $tuple_status[$tuple];
+ $status = [0, "Skipped"] unless defined $status;
+ next unless ref $status;
+ printf "Failed to insert (%s, %s): %s\n",
+ $first_names[$tuple], $last_names[$tuple], $status->[1];
+ }
+ }
+
+Support for data returning statements such as SELECT is driver-specific
+and subject to change. At present, the default implementation
+provided by DBI only supports non-data returning statements.
+
+Transaction semantics when using array binding are driver and
+database specific. If C<AutoCommit> is on, the default DBI
+implementation will cause each parameter tuple to be individually
+committed (or rolled back in the event of an error). If C<AutoCommit>
+is off, the application is responsible for explicitly committing
+the entire set of bound parameter tuples. Note that different
+drivers and databases may have different behaviours when some
+parameter tuples cause failures. In some cases, the driver or
+database may automatically rollback the effect of all prior parameter
+tuples that succeeded in the transaction; other drivers or databases
+may retain the effect of prior successfully executed parameter
+tuples. Be sure to check your driver and database for its specific
+behaviour.
+
+Note that, in general, performance will usually be better with
+C<AutoCommit> turned off, and using explicit C<commit> after each
+C<execute_array> call.
+
+The C<execute_array> method was added in DBI 1.22, and ArrayTupleFetch
+was added in 1.36.
+
+=head3 C<execute_for_fetch>
+
+ $tuples = $sth->execute_for_fetch($fetch_tuple_sub);
+ $tuples = $sth->execute_for_fetch($fetch_tuple_sub, \@tuple_status);
+
+ ($tuples, $rows) = $sth->execute_for_fetch($fetch_tuple_sub);
+ ($tuples, $rows) = $sth->execute_for_fetch($fetch_tuple_sub, \@tuple_status);
+
+The execute_for_fetch() method is used to perform bulk operations
+and is most often used via the execute_array() method, not directly.
+
+The fetch subroutine, referenced by $fetch_tuple_sub, is expected
+to return a reference to an array (known as a 'tuple') or undef.
+
+The execute_for_fetch() method calls $fetch_tuple_sub, without any
+parameters, until it returns a false value. Each tuple returned is
+used to provide bind values for an $sth->execute(@$tuple) call.
+
+In scalar context execute_for_fetch() returns C<undef> if there were any
+errors and the number of tuples executed otherwise. Like execute() and
+execute_array() a zero is returned as "0E0" so execute_for_fetch() is
+only false on error. If there were any errors the @tuple_status array
+can be used to discover which tuples failed and with what errors.
+
+When called in list context execute_for_fetch() returns two scalars;
+$tuples is the same as calling execute_for_fetch() in scalar context and $rows is
+the sum of the number of rows affected for each tuple, if available or -1
+if the driver cannot determine this.
+If you are doing an update operation the returned rows affected may not be what
+you expect if, for instance, one or more of the tuples affected the same row
+multiple times. Some drivers may not yet support list context, in which case
+$rows will be undef, or may not be able to provide the number of rows affected
+when performing this batch operation, in which case $rows will be -1.
+
+If \@tuple_status is passed then the execute_for_fetch method uses
+it to return status information. The tuple_status array holds one
+element per tuple. If the corresponding execute() did not fail then
+the element holds the return value from execute(), which is typically
+a row count. If the execute() did fail then the element holds a
+reference to an array containing ($sth->err, $sth->errstr, $sth->state).
+
+If the driver detects an error that it knows means no further tuples can be
+executed then it may return, with an error status, even though $fetch_tuple_sub
+may still have more tuples to be executed.
+
+Although each tuple returned by $fetch_tuple_sub is effectively used
+to call $sth->execute(@$tuple_array_ref) the exact timing may vary.
+Drivers are free to accumulate sets of tuples to pass to the
+database server in bulk group operations for more efficient execution.
+However, the $fetch_tuple_sub is specifically allowed to return
+the same array reference each time (which is what fetchrow_arrayref()
+usually does).
+
+For example:
+
+ my $sel = $dbh1->prepare("select foo, bar from table1");
+ $sel->execute;
+
+ my $ins = $dbh2->prepare("insert into table2 (foo, bar) values (?,?)");
+ my $fetch_tuple_sub = sub { $sel->fetchrow_arrayref };
+
+ my @tuple_status;
+ $rc = $ins->execute_for_fetch($fetch_tuple_sub, \@tuple_status);
+ my @errors = grep { ref $_ } @tuple_status;
+
+Similarly, if you already have an array containing the data rows
+to be processed you'd use a subroutine to shift off and return
+each array ref in turn:
+
+ $ins->execute_for_fetch( sub { shift @array_of_arrays }, \@tuple_status);
+
+The C<execute_for_fetch> method was added in DBI 1.38.
+
+
+=head3 C<fetchrow_arrayref>
+
+ $ary_ref = $sth->fetchrow_arrayref;
+ $ary_ref = $sth->fetch; # alias
+
+Fetches the next row of data and returns a reference to an array
+holding the field values. Null fields are returned as C<undef>
+values in the array.
+This is the fastest way to fetch data, particularly if used with
+C<$sth-E<gt>bind_columns>.
+
+If there are no more rows or if an error occurs, then C<fetchrow_arrayref>
+returns an C<undef>. You should check C<$sth-E<gt>err> afterwards (or use the
+C<RaiseError> attribute) to discover if the C<undef> returned was due to an
+error.
+
+Note that the same array reference is returned for each fetch, so don't
+store the reference and then use it after a later fetch. Also, the
+elements of the array are also reused for each row, so take care if you
+want to take a reference to an element. See also L</bind_columns>.
+
+=head3 C<fetchrow_array>
+
+ @ary = $sth->fetchrow_array;
+
+An alternative to C<fetchrow_arrayref>. Fetches the next row of data
+and returns it as a list containing the field values. Null fields
+are returned as C<undef> values in the list.
+
+If there are no more rows or if an error occurs, then C<fetchrow_array>
+returns an empty list. You should check C<$sth-E<gt>err> afterwards (or use
+the C<RaiseError> attribute) to discover if the empty list returned was
+due to an error.
+
+If called in a scalar context for a statement handle that has more
+than one column, it is undefined whether the driver will return
+the value of the first column or the last. So don't do that.
+Also, in a scalar context, an C<undef> is returned if there are no
+more rows or if an error occurred. That C<undef> can't be distinguished
+from an C<undef> returned because the first field value was NULL.
+For these reasons you should exercise some caution if you use
+C<fetchrow_array> in a scalar context.
+
+=head3 C<fetchrow_hashref>
+
+ $hash_ref = $sth->fetchrow_hashref;
+ $hash_ref = $sth->fetchrow_hashref($name);
+
+An alternative to C<fetchrow_arrayref>. Fetches the next row of data
+and returns it as a reference to a hash containing field name and field
+value pairs. Null fields are returned as C<undef> values in the hash.
+
+If there are no more rows or if an error occurs, then C<fetchrow_hashref>
+returns an C<undef>. You should check C<$sth-E<gt>err> afterwards (or use the
+C<RaiseError> attribute) to discover if the C<undef> returned was due to an
+error.
+
+The optional C<$name> parameter specifies the name of the statement handle
+attribute. For historical reasons it defaults to "C<NAME>", however using either
+"C<NAME_lc>" or "C<NAME_uc>" is recomended for portability.
+
+The keys of the hash are the same names returned by C<$sth-E<gt>{$name}>. If
+more than one field has the same name, there will only be one entry in
+the returned hash for those fields.
+
+Because of the extra work C<fetchrow_hashref> and Perl have to perform, it
+is not as efficient as C<fetchrow_arrayref> or C<fetchrow_array>.
+
+By default a reference to a new hash is returned for each row.
+It is likely that a future version of the DBI will support an
+attribute which will enable the same hash to be reused for each
+row. This will give a significant performance boost, but it won't
+be enabled by default because of the risk of breaking old code.
+
+
+=head3 C<fetchall_arrayref>
+
+ $tbl_ary_ref = $sth->fetchall_arrayref;
+ $tbl_ary_ref = $sth->fetchall_arrayref( $slice );
+ $tbl_ary_ref = $sth->fetchall_arrayref( $slice, $max_rows );
+
+The C<fetchall_arrayref> method can be used to fetch all the data to be
+returned from a prepared and executed statement handle. It returns a
+reference to an array that contains one reference per row.
+
+If there are no rows to return, C<fetchall_arrayref> returns a reference
+to an empty array. If an error occurs, C<fetchall_arrayref> returns the
+data fetched thus far, which may be none. You should check C<$sth-E<gt>err>
+afterwards (or use the C<RaiseError> attribute) to discover if the data is
+complete or was truncated due to an error.
+
+If $slice is an array reference, C<fetchall_arrayref> uses L</fetchrow_arrayref>
+to fetch each row as an array ref. If the $slice array is not empty
+then it is used as a slice to select individual columns by perl array
+index number (starting at 0, unlike column and parameter numbers which
+start at 1).
+
+With no parameters, or if $slice is undefined, C<fetchall_arrayref>
+acts as if passed an empty array ref.
+
+If $slice is a hash reference, C<fetchall_arrayref> uses L</fetchrow_hashref>
+to fetch each row as a hash reference. If the $slice hash is empty then
+fetchrow_hashref() is simply called in a tight loop and the keys in the hashes
+have whatever name lettercase is returned by default from fetchrow_hashref.
+(See L</FetchHashKeyName> attribute.) If the $slice hash is not
+empty, then it is used as a slice to select individual columns by
+name. The values of the hash should be set to 1. The key names
+of the returned hashes match the letter case of the names in the
+parameter hash, regardless of the L</FetchHashKeyName> attribute.
+
+For example, to fetch just the first column of every row:
+
+ $tbl_ary_ref = $sth->fetchall_arrayref([0]);
+
+To fetch the second to last and last column of every row:
+
+ $tbl_ary_ref = $sth->fetchall_arrayref([-2,-1]);
+
+To fetch all fields of every row as a hash ref:
+
+ $tbl_ary_ref = $sth->fetchall_arrayref({});
+
+To fetch only the fields called "foo" and "bar" of every row as a hash ref
+(with keys named "foo" and "BAR"):
+
+ $tbl_ary_ref = $sth->fetchall_arrayref({ foo=>1, BAR=>1 });
+
+The first two examples return a reference to an array of array refs.
+The third and forth return a reference to an array of hash refs.
+
+If $max_rows is defined and greater than or equal to zero then it
+is used to limit the number of rows fetched before returning.
+fetchall_arrayref() can then be called again to fetch more rows.
+This is especially useful when you need the better performance of
+fetchall_arrayref() but don't have enough memory to fetch and return
+all the rows in one go.
+
+Here's an example (assumes RaiseError is enabled):
+
+ my $rows = []; # cache for batches of rows
+ while( my $row = ( shift(@$rows) || # get row from cache, or reload cache:
+ shift(@{$rows=$sth->fetchall_arrayref(undef,10_000)||[]}) )
+ ) {
+ ...
+ }
+
+That I<might> be the fastest way to fetch and process lots of rows using the DBI,
+but it depends on the relative cost of method calls vs memory allocation.
+
+A standard C<while> loop with column binding is often faster because
+the cost of allocating memory for the batch of rows is greater than
+the saving by reducing method calls. It's possible that the DBI may
+provide a way to reuse the memory of a previous batch in future, which
+would then shift the balance back towards fetchall_arrayref().
+
+
+=head3 C<fetchall_hashref>
+
+ $hash_ref = $sth->fetchall_hashref($key_field);
+
+The C<fetchall_hashref> method can be used to fetch all the data to be
+returned from a prepared and executed statement handle. It returns a reference
+to a hash containing a key for each distinct value of the $key_field column
+that was fetched. For each key the corresponding value is a reference to a hash
+containing all the selected columns and their values, as returned by fetchrow_hashref().
+
+If there are no rows to return, C<fetchall_hashref> returns a reference
+to an empty hash. If an error occurs, C<fetchall_hashref> returns the
+data fetched thus far, which may be none. You should check
+C<$sth-E<gt>err> afterwards (or use the C<RaiseError> attribute) to
+discover if the data is complete or was truncated due to an error.
+
+The $key_field parameter provides the name of the field that holds the
+value to be used for the key for the returned hash. For example:
+
+ $dbh->{FetchHashKeyName} = 'NAME_lc';
+ $sth = $dbh->prepare("SELECT FOO, BAR, ID, NAME, BAZ FROM TABLE");
+ $sth->execute;
+ $hash_ref = $sth->fetchall_hashref('id');
+ print "Name for id 42 is $hash_ref->{42}->{name}\n";
+
+The $key_field parameter can also be specified as an integer column
+number (counting from 1). If $key_field doesn't match any column in
+the statement, as a name first then as a number, then an error is
+returned.
+
+For queries returning more than one 'key' column, you can specify
+multiple column names by passing $key_field as a reference to an
+array containing one or more key column names (or index numbers).
+For example:
+
+ $sth = $dbh->prepare("SELECT foo, bar, baz FROM table");
+ $sth->execute;
+ $hash_ref = $sth->fetchall_hashref( [ qw(foo bar) ] );
+ print "For foo 42 and bar 38, baz is $hash_ref->{42}->{38}->{baz}\n";
+
+The fetchall_hashref() method is normally used only where the key
+fields values for each row are unique. If multiple rows are returned
+with the same values for the key fields then later rows overwrite
+earlier ones.
+
+=head3 C<finish>
+
+ $rc = $sth->finish;
+
+Indicate that no more data will be fetched from this statement handle
+before it is either executed again or destroyed. The C<finish> method
+is rarely needed, and frequently overused, but can sometimes be
+helpful in a few very specific situations to allow the server to free
+up resources (such as sort buffers).
+
+When all the data has been fetched from a C<SELECT> statement, the
+driver should automatically call C<finish> for you. So you should
+I<not> normally need to call it explicitly I<except> when you know
+that you've not fetched all the data from a statement handle.
+The most common example is when you only want to fetch one row,
+but in that case the C<selectrow_*> methods are usually better anyway.
+Adding calls to C<finish> after each fetch loop is a common mistake,
+don't do it, it can mask genuine problems like uncaught fetch errors.
+
+Consider a query like:
+
+ SELECT foo FROM table WHERE bar=? ORDER BY foo
+
+where you want to select just the first (smallest) "foo" value from a
+very large table. When executed, the database server will have to use
+temporary buffer space to store the sorted rows. If, after executing
+the handle and selecting one row, the handle won't be re-executed for
+some time and won't be destroyed, the C<finish> method can be used to tell
+the server that the buffer space can be freed.
+
+Calling C<finish> resets the L</Active> attribute for the statement. It
+may also make some statement handle attributes (such as C<NAME> and C<TYPE>)
+unavailable if they have not already been accessed (and thus cached).
+
+The C<finish> method does not affect the transaction status of the
+database connection. It has nothing to do with transactions. It's mostly an
+internal "housekeeping" method that is rarely needed.
+See also L</disconnect> and the L</Active> attribute.
+
+The C<finish> method should have been called C<discard_pending_rows>.
+
+
+=head3 C<rows>
+
+ $rv = $sth->rows;
+
+Returns the number of rows affected by the last row affecting command,
+or -1 if the number of rows is not known or not available.
+
+Generally, you can only rely on a row count after a I<non>-C<SELECT>
+C<execute> (for some specific operations like C<UPDATE> and C<DELETE>), or
+after fetching all the rows of a C<SELECT> statement.
+
+For C<SELECT> statements, it is generally not possible to know how many
+rows will be returned except by fetching them all. Some drivers will
+return the number of rows the application has fetched so far, but
+others may return -1 until all rows have been fetched. So use of the
+C<rows> method or C<$DBI::rows> with C<SELECT> statements is not
+recommended.
+
+One alternative method to get a row count for a C<SELECT> is to execute a
+"SELECT COUNT(*) FROM ..." SQL statement with the same "..." as your
+query and then fetch the row count from that.
+
+
+=head3 C<bind_col>
+
+ $rc = $sth->bind_col($column_number, \$var_to_bind);
+ $rc = $sth->bind_col($column_number, \$var_to_bind, \%attr );
+ $rc = $sth->bind_col($column_number, \$var_to_bind, $bind_type );
+
+Binds a Perl variable and/or some attributes to an output column
+(field) of a C<SELECT> statement. Column numbers count up from 1.
+You do not need to bind output columns in order to fetch data.
+For maximum portability between drivers, bind_col() should be called
+after execute() and not before.
+See also C<bind_columns> for an example.
+
+The binding is performed at a low level using Perl aliasing.
+Whenever a row is fetched from the database $var_to_bind appears
+to be automatically updated simply because it now refers to the same
+memory location as the corresponding column value. This makes using
+bound variables very efficient.
+Binding a tied variable doesn't work, currently.
+
+The L</bind_param> method
+performs a similar, but opposite, function for input variables.
+
+B<Data Types for Column Binding>
+
+The C<\%attr> parameter can be used to hint at the data type
+formatting the column should have. For example, you can use:
+
+ $sth->bind_col(1, undef, { TYPE => SQL_DATETIME });
+
+to specify that you'd like the column (which presumably is some
+kind of datetime type) to be returned in the standard format for
+SQL_DATETIME, which is 'YYYY-MM-DD HH:MM:SS', rather than the
+native formatting the database would normally use.
+
+There's no $var_to_bind in that example to emphasize the point
+that bind_col() works on the underlying column and not just
+a particular bound variable.
+
+As a short-cut for the common case, the data type can be passed
+directly, in place of the C<\%attr> hash reference. This example is
+equivalent to the one above:
+
+ $sth->bind_col(1, undef, SQL_DATETIME);
+
+The C<TYPE> value indicates the standard (non-driver-specific) type for
+this parameter. To specify the driver-specific type, the driver may
+support a driver-specific attribute, such as C<{ ora_type =E<gt> 97 }>.
+
+The SQL_DATETIME and other related constants can be imported using
+
+ use DBI qw(:sql_types);
+
+See L</"DBI Constants"> for more information.
+
+Few drivers support specifying a data type via a C<bind_col> call (most will
+simply ignore the data type). Fewer still allow the data type to be altered
+once set.
+
+The TYPE attribute for bind_col() was first specified in DBI 1.41.
+
+
+=head3 C<bind_columns>
+
+ $rc = $sth->bind_columns(@list_of_refs_to_vars_to_bind);
+
+Calls L</bind_col> for each column of the C<SELECT> statement.
+
+The list of references should have the same number of elements as the number of
+columns in the C<SELECT> statement. If it doesn't then C<bind_columns> will
+bind the elements given, up to the number of columns, and then return an error.
+
+For maximum portability between drivers, bind_columns() should be called
+after execute() and not before.
+
+For example:
+
+ $dbh->{RaiseError} = 1; # do this, or check every call for errors
+ $sth = $dbh->prepare(q{ SELECT region, sales FROM sales_by_region });
+ $sth->execute;
+ my ($region, $sales);
+
+ # Bind Perl variables to columns:
+ $rv = $sth->bind_columns(\$region, \$sales);
+
+ # you can also use Perl's \(...) syntax (see perlref docs):
+ # $sth->bind_columns(\($region, $sales));
+
+ # Column binding is the most efficient way to fetch data
+ while ($sth->fetch) {
+ print "$region: $sales\n";
+ }
+
+For compatibility with old scripts, the first parameter will be
+ignored if it is C<undef> or a hash reference.
+
+Here's a more fancy example that binds columns to the values I<inside>
+a hash (thanks to H.Merijn Brand):
+
+ $sth->execute;
+ my %row;
+ $sth->bind_columns( \( @row{ @{$sth->{NAME_lc} } } ));
+ while ($sth->fetch) {
+ print "$row{region}: $row{sales}\n";
+ }
+
+
+=head3 C<dump_results>
+
+ $rows = $sth->dump_results($maxlen, $lsep, $fsep, $fh);
+
+Fetches all the rows from C<$sth>, calls C<DBI::neat_list> for each row, and
+prints the results to C<$fh> (defaults to C<STDOUT>) separated by C<$lsep>
+(default C<"\n">). C<$fsep> defaults to C<", "> and C<$maxlen> defaults to 35.
+
+This method is designed as a handy utility for prototyping and
+testing queries. Since it uses L</neat_list> to
+format and edit the string for reading by humans, it is not recommended
+for data transfer applications.
+
+
+=head2 Statement Handle Attributes
+
+This section describes attributes specific to statement handles. Most
+of these attributes are read-only.
+
+Changes to these statement handle attributes do not affect any other
+existing or future statement handles.
+
+Attempting to set or get the value of an unknown attribute generates a warning,
+except for private driver specific attributes (which all have names
+starting with a lowercase letter).
+
+Example:
+
+ ... = $h->{NUM_OF_FIELDS}; # get/read
+
+Some drivers cannot provide valid values for some or all of these
+attributes until after C<$sth-E<gt>execute> has been successfully
+called. Typically the attribute will be C<undef> in these situations.
+
+Some attributes, like NAME, are not appropriate to some types of
+statement, like SELECT. Typically the attribute will be C<undef>
+in these situations.
+
+For drivers which support stored procedures and multiple result sets
+(see L</more_results>) these attributes relate to the I<current> result set.
+
+See also L</finish> to learn more about the effect it
+may have on some attributes.
+
+=head3 C<NUM_OF_FIELDS> (integer, read-only)
+
+Number of fields (columns) in the data the prepared statement may return.
+Statements that don't return rows of data, like C<DELETE> and C<CREATE>
+set C<NUM_OF_FIELDS> to 0 (though it may be undef in some drivers).
+
+
+=head3 C<NUM_OF_PARAMS> (integer, read-only)
+
+The number of parameters (placeholders) in the prepared statement.
+See SUBSTITUTION VARIABLES below for more details.
+
+
+=head3 C<NAME> (array-ref, read-only)
+
+Returns a reference to an array of field names for each column. The
+names may contain spaces but should not be truncated or have any
+trailing space. Note that the names have the letter case (upper, lower
+or mixed) as returned by the driver being used. Portable applications
+should use L</NAME_lc> or L</NAME_uc>.
+
+ print "First column name: $sth->{NAME}->[0]\n";
+
+=head3 C<NAME_lc> (array-ref, read-only)
+
+Like L</NAME> but always returns lowercase names.
+
+=head3 C<NAME_uc> (array-ref, read-only)
+
+Like L</NAME> but always returns uppercase names.
+
+=head3 C<NAME_hash> (hash-ref, read-only)
+
+=head3 C<NAME_lc_hash> (hash-ref, read-only)
+
+=head3 C<NAME_uc_hash> (hash-ref, read-only)
+
+The C<NAME_hash>, C<NAME_lc_hash>, and C<NAME_uc_hash> attributes
+return column name information as a reference to a hash.
+
+The keys of the hash are the names of the columns. The letter case of
+the keys corresponds to the letter case returned by the C<NAME>,
+C<NAME_lc>, and C<NAME_uc> attributes respectively (as described above).
+
+The value of each hash entry is the perl index number of the
+corresponding column (counting from 0). For example:
+
+ $sth = $dbh->prepare("select Id, Name from table");
+ $sth->execute;
+ @row = $sth->fetchrow_array;
+ print "Name $row[ $sth->{NAME_lc_hash}{name} ]\n";
+
+
+=head3 C<TYPE> (array-ref, read-only)
+
+Returns a reference to an array of integer values for each
+column. The value indicates the data type of the corresponding column.
+
+The values correspond to the international standards (ANSI X3.135
+and ISO/IEC 9075) which, in general terms, means ODBC. Driver-specific
+types that don't exactly match standard types should generally return
+the same values as an ODBC driver supplied by the makers of the
+database. That might include private type numbers in ranges the vendor
+has officially registered with the ISO working group:
+
+ ftp://sqlstandards.org/SC32/SQL_Registry/
+
+Where there's no vendor-supplied ODBC driver to be compatible with,
+the DBI driver can use type numbers in the range that is now
+officially reserved for use by the DBI: -9999 to -9000.
+
+All possible values for C<TYPE> should have at least one entry in the
+output of the C<type_info_all> method (see L</type_info_all>).
+
+=head3 C<PRECISION> (array-ref, read-only)
+
+Returns a reference to an array of integer values for each column.
+
+For numeric columns, the value is the maximum number of digits
+(without considering a sign character or decimal point). Note that
+the "display size" for floating point types (REAL, FLOAT, DOUBLE)
+can be up to 7 characters greater than the precision (for the
+sign + decimal point + the letter E + a sign + 2 or 3 digits).
+
+For any character type column the value is the OCTET_LENGTH,
+in other words the number of bytes, not characters.
+
+(More recent standards refer to this as COLUMN_SIZE but we stick
+with PRECISION for backwards compatibility.)
+
+=head3 C<SCALE> (array-ref, read-only)
+
+Returns a reference to an array of integer values for each column.
+NULL (C<undef>) values indicate columns where scale is not applicable.
+
+=head3 C<NULLABLE> (array-ref, read-only)
+
+Returns a reference to an array indicating the possibility of each
+column returning a null. Possible values are C<0>
+(or an empty string) = no, C<1> = yes, C<2> = unknown.
+
+ print "First column may return NULL\n" if $sth->{NULLABLE}->[0];
+
+
+=head3 C<CursorName> (string, read-only)
+
+Returns the name of the cursor associated with the statement handle, if
+available. If not available or if the database driver does not support the
+C<"where current of ..."> SQL syntax, then it returns C<undef>.
+
+
+=head3 C<Database> (dbh, read-only)
+
+Returns the parent $dbh of the statement handle.
+
+
+=head3 C<Statement> (string, read-only)
+
+Returns the statement string passed to the L</prepare> method.
+
+
+=head3 C<ParamValues> (hash ref, read-only)
+
+Returns a reference to a hash containing the values currently bound
+to placeholders. The keys of the hash are the 'names' of the
+placeholders, typically integers starting at 1. Returns undef if
+not supported by the driver.
+
+See L</ShowErrorStatement> for an example of how this is used.
+
+* Keys:
+
+If the driver supports C<ParamValues> but no values have been bound
+yet then the driver should return a hash with placeholders names
+in the keys but all the values undef, but some drivers may return
+a ref to an empty hash because they can't pre-determine the names.
+
+It is possible that the keys in the hash returned by C<ParamValues>
+are not exactly the same as those implied by the prepared statement.
+For example, DBD::Oracle translates 'C<?>' placeholders into 'C<:pN>'
+where N is a sequence number starting at 1.
+
+* Values:
+
+It is possible that the values in the hash returned by C<ParamValues>
+are not I<exactly> the same as those passed to bind_param() or execute().
+The driver may have slightly modified values in some way based on the
+TYPE the value was bound with. For example a floating point value
+bound as an SQL_INTEGER type may be returned as an integer.
+The values returned by C<ParamValues> can be passed to another
+bind_param() method with the same TYPE and will be seen by the
+database as the same value. See also L</ParamTypes> below.
+
+The C<ParamValues> attribute was added in DBI 1.28.
+
+=head3 C<ParamTypes> (hash ref, read-only)
+
+Returns a reference to a hash containing the type information
+currently bound to placeholders.
+Returns undef if not supported by the driver.
+
+* Keys:
+
+See L</ParamValues> above.
+
+* Values:
+
+The hash values are hashrefs of type information in the same form as that
+passed to the various bind_param() methods (See L</bind_param> for the format
+and values).
+
+It is possible that the values in the hash returned by C<ParamTypes>
+are not exactly the same as those passed to bind_param() or execute().
+Param attributes specified using the abreviated form, like this:
+
+ $sth->bind_param(1, SQL_INTEGER);
+
+are returned in the expanded form, as if called like this:
+
+ $sth->bind_param(1, { TYPE => SQL_INTEGER });
+
+The driver may have modified the type information in some way based
+on the bound values, other hints provided by the prepare()'d
+SQL statement, or alternate type mappings required by the driver or target
+database system. The driver may also add private keys (with names beginning
+with the drivers reserved prefix, e.g., odbc_xxx).
+
+* Example:
+
+The keys and values in the returned hash can be passed to the various
+bind_param() methods to effectively reproduce a previous param binding.
+For example:
+
+ # assuming $sth1 is a previously prepared statement handle
+ my $sth2 = $dbh->prepare( $sth1->{Statement} );
+ my $ParamValues = $sth1->{ParamValues} || {};
+ my $ParamTypes = $sth1->{ParamTypes} || {};
+ $sth2->bind_param($_, $PV->{$_} $PT->{$_})
+ for keys %{ %$PV, %$PT };
+ $sth2->execute();
+
+The C<ParamTypes> attribute was added in DBI 1.49. Implementation
+is the responsibility of individual drivers; the DBI layer default
+implementation simply returns undef.
+
+
+=head3 C<ParamArrays> (hash ref, read-only)
+
+Returns a reference to a hash containing the values currently bound to
+placeholders with L</execute_array> or L</bind_param_array>. The
+keys of the hash are the 'names' of the placeholders, typically
+integers starting at 1. Returns undef if not supported by the driver
+or no arrays of parameters are bound.
+
+Each key value is an array reference containing a list of the bound
+parameters for that column.
+
+For example:
+
+ $sth = $dbh->prepare("INSERT INTO staff (id, name) values (?,?)");
+ $sth->execute_array({},[1,2], ['fred','dave']);
+ if ($sth->{ParamArrays}) {
+ foreach $param (keys %{$sth->{ParamArrays}}) {
+ printf "Parameters for %s : %s\n", $param,
+ join(",", @{$sth->{ParamArrays}->{$param}});
+ }
+ }
+
+It is possible that the values in the hash returned by C<ParamArrays>
+are not I<exactly> the same as those passed to L</bind_param_array> or
+L</execute_array>. The driver may have slightly modified values in some
+way based on the TYPE the value was bound with. For example a floating
+point value bound as an SQL_INTEGER type may be returned as an
+integer.
+
+It is also possible that the keys in the hash returned by
+C<ParamArrays> are not exactly the same as those implied by the
+prepared statement. For example, DBD::Oracle translates 'C<?>'
+placeholders into 'C<:pN>' where N is a sequence number starting at 1.
+
+=head3 C<RowsInCache> (integer, read-only)
+
+If the driver supports a local row cache for C<SELECT> statements, then
+this attribute holds the number of un-fetched rows in the cache. If the
+driver doesn't, then it returns C<undef>. Note that some drivers pre-fetch
+rows on execute, whereas others wait till the first fetch.
+
+See also the L</RowCacheSize> database handle attribute.
+
+=head1 FURTHER INFORMATION
+
+=head2 Catalog Methods
+
+An application can retrieve metadata information from the DBMS by issuing
+appropriate queries on the views of the Information Schema. Unfortunately,
+C<INFORMATION_SCHEMA> views are seldom supported by the DBMS.
+Special methods (catalog methods) are available to return result sets
+for a small but important portion of that metadata:
+
+ column_info
+ foreign_key_info
+ primary_key_info
+ table_info
+ statistics_info
+
+All catalog methods accept arguments in order to restrict the result sets.
+Passing C<undef> to an optional argument does not constrain the search for
+that argument.
+However, an empty string ('') is treated as a regular search criteria
+and will only match an empty value.
+
+B<Note>: SQL/CLI and ODBC differ in the handling of empty strings. An
+empty string will not restrict the result set in SQL/CLI.
+
+Most arguments in the catalog methods accept only I<ordinary values>, e.g.
+the arguments of C<primary_key_info()>.
+Such arguments are treated as a literal string, i.e. the case is significant
+and quote characters are taken literally.
+
+Some arguments in the catalog methods accept I<search patterns> (strings
+containing '_' and/or '%'), e.g. the C<$table> argument of C<column_info()>.
+Passing '%' is equivalent to leaving the argument C<undef>.
+
+B<Caveat>: The underscore ('_') is valid and often used in SQL identifiers.
+Passing such a value to a search pattern argument may return more rows than
+expected!
+To include pattern characters as literals, they must be preceded by an
+escape character which can be achieved with
+
+ $esc = $dbh->get_info( 14 ); # SQL_SEARCH_PATTERN_ESCAPE
+ $search_pattern =~ s/([_%])/$esc$1/g;
+
+The ODBC and SQL/CLI specifications define a way to change the default
+behaviour described above: All arguments (except I<list value arguments>)
+are treated as I<identifier> if the C<SQL_ATTR_METADATA_ID> attribute is
+set to C<SQL_TRUE>.
+I<Quoted identifiers> are very similar to I<ordinary values>, i.e. their
+body (the string within the quotes) is interpreted literally.
+I<Unquoted identifiers> are compared in UPPERCASE.
+
+The DBI (currently) does not support the C<SQL_ATTR_METADATA_ID> attribute,
+i.e. it behaves like an ODBC driver where C<SQL_ATTR_METADATA_ID> is set to
+C<SQL_FALSE>.
+
+
+=head2 Transactions
+
+Transactions are a fundamental part of any robust database system. They
+protect against errors and database corruption by ensuring that sets of
+related changes to the database take place in atomic (indivisible,
+all-or-nothing) units.
+
+This section applies to databases that support transactions and where
+C<AutoCommit> is off. See L</AutoCommit> for details of using C<AutoCommit>
+with various types of databases.
+
+The recommended way to implement robust transactions in Perl
+applications is to use C<RaiseError> and S<C<eval { ... }>>
+(which is very fast, unlike S<C<eval "...">>). For example:
+
+ $dbh->{AutoCommit} = 0; # enable transactions, if possible
+ $dbh->{RaiseError} = 1;
+ eval {
+ foo(...) # do lots of work here
+ bar(...) # including inserts
+ baz(...) # and updates
+ $dbh->commit; # commit the changes if we get this far
+ };
+ if ($@) {
+ warn "Transaction aborted because $@";
+ # now rollback to undo the incomplete changes
+ # but do it in an eval{} as it may also fail
+ eval { $dbh->rollback };
+ # add other application on-error-clean-up code here
+ }
+
+If the C<RaiseError> attribute is not set, then DBI calls would need to be
+manually checked for errors, typically like this:
+
+ $h->method(@args) or die $h->errstr;
+
+With C<RaiseError> set, the DBI will automatically C<die> if any DBI method
+call on that handle (or a child handle) fails, so you don't have to
+test the return value of each method call. See L</RaiseError> for more
+details.
+
+A major advantage of the C<eval> approach is that the transaction will be
+properly rolled back if I<any> code (not just DBI calls) in the inner
+application dies for any reason. The major advantage of using the
+C<$h-E<gt>{RaiseError}> attribute is that all DBI calls will be checked
+automatically. Both techniques are strongly recommended.
+
+After calling C<commit> or C<rollback> many drivers will not let you
+fetch from a previously active C<SELECT> statement handle that's a child
+of the same database handle. A typical way round this is to connect the
+the database twice and use one connection for C<SELECT> statements.
+
+See L</AutoCommit> and L</disconnect> for other important information
+about transactions.
+
+
+=head2 Handling BLOB / LONG / Memo Fields
+
+Many databases support "blob" (binary large objects), "long", or similar
+datatypes for holding very long strings or large amounts of binary
+data in a single field. Some databases support variable length long
+values over 2,000,000,000 bytes in length.
+
+Since values of that size can't usually be held in memory, and because
+databases can't usually know in advance the length of the longest long
+that will be returned from a C<SELECT> statement (unlike other data
+types), some special handling is required.
+
+In this situation, the value of the C<$h-E<gt>{LongReadLen}>
+attribute is used to determine how much buffer space to allocate
+when fetching such fields. The C<$h-E<gt>{LongTruncOk}> attribute
+is used to determine how to behave if a fetched value can't fit
+into the buffer.
+
+See the description of L</LongReadLen> for more information.
+
+When trying to insert long or binary values, placeholders should be used
+since there are often limits on the maximum size of an C<INSERT>
+statement and the L</quote> method generally can't cope with binary
+data. See L</Placeholders and Bind Values>.
+
+
+=head2 Simple Examples
+
+Here's a complete example program to select and fetch some data:
+
+ my $data_source = "dbi::DriverName:db_name";
+ my $dbh = DBI->connect($data_source, $user, $password)
+ or die "Can't connect to $data_source: $DBI::errstr";
+
+ my $sth = $dbh->prepare( q{
+ SELECT name, phone
+ FROM mytelbook
+ }) or die "Can't prepare statement: $DBI::errstr";
+
+ my $rc = $sth->execute
+ or die "Can't execute statement: $DBI::errstr";
+
+ print "Query will return $sth->{NUM_OF_FIELDS} fields.\n\n";
+ print "Field names: @{ $sth->{NAME} }\n";
+
+ while (($name, $phone) = $sth->fetchrow_array) {
+ print "$name: $phone\n";
+ }
+ # check for problems which may have terminated the fetch early
+ die $sth->errstr if $sth->err;
+
+ $dbh->disconnect;
+
+Here's a complete example program to insert some data from a file.
+(This example uses C<RaiseError> to avoid needing to check each call).
+
+ my $dbh = DBI->connect("dbi:DriverName:db_name", $user, $password, {
+ RaiseError => 1, AutoCommit => 0
+ });
+
+ my $sth = $dbh->prepare( q{
+ INSERT INTO table (name, phone) VALUES (?, ?)
+ });
+
+ open FH, "<phone.csv" or die "Unable to open phone.csv: $!";
+ while (<FH>) {
+ chomp;
+ my ($name, $phone) = split /,/;
+ $sth->execute($name, $phone);
+ }
+ close FH;
+
+ $dbh->commit;
+ $dbh->disconnect;
+
+Here's how to convert fetched NULLs (undefined values) into empty strings:
+
+ while($row = $sth->fetchrow_arrayref) {
+ # this is a fast and simple way to deal with nulls:
+ foreach (@$row) { $_ = '' unless defined }
+ print "@$row\n";
+ }
+
+The C<q{...}> style quoting used in these examples avoids clashing with
+quotes that may be used in the SQL statement. Use the double-quote like
+C<qq{...}> operator if you want to interpolate variables into the string.
+See L<perlop/"Quote and Quote-like Operators"> for more details.
+
+=head2 Threads and Thread Safety
+
+Perl 5.7 and later support a new threading model called iThreads.
+(The old "5.005 style" threads are not supported by the DBI.)
+
+In the iThreads model each thread has it's own copy of the perl
+interpreter. When a new thread is created the original perl
+interpreter is 'cloned' to create a new copy for the new thread.
+
+If the DBI and drivers are loaded and handles created before the
+thread is created then it will get a cloned copy of the DBI, the
+drivers and the handles.
+
+However, the internal pointer data within the handles will refer
+to the DBI and drivers in the original interpreter. Using those
+handles in the new interpreter thread is not safe, so the DBI detects
+this and croaks on any method call using handles that don't belong
+to the current thread (except for DESTROY).
+
+Because of this (possibly temporary) restriction, newly created
+threads must make their own connections to the database. Handles
+can't be shared across threads.
+
+But BEWARE, some underlying database APIs (the code the DBD driver
+uses to talk to the database, often supplied by the database vendor)
+are not thread safe. If it's not thread safe, then allowing more
+than one thread to enter the code at the same time may cause
+subtle/serious problems. In some cases allowing more than
+one thread to enter the code, even if I<not> at the same time,
+can cause problems. You have been warned.
+
+Using DBI with perl threads is not yet recommended for production
+environments. For more information see
+L<http://www.perlmonks.org/index.pl?node_id=288022>
+
+Note: There is a bug in perl 5.8.2 when configured with threads
+and debugging enabled (bug #24463) which causes a DBI test to fail.
+
+=head2 Signal Handling and Canceling Operations
+
+[The following only applies to systems with unix-like signal handling.
+I'd welcome additions for other systems, especially Windows.]
+
+The first thing to say is that signal handling in Perl versions less
+than 5.8 is I<not> safe. There is always a small risk of Perl
+crashing and/or core dumping when, or after, handling a signal
+because the signal could arrive and be handled while internal data
+structures are being changed. If the signal handling code
+used those same internal data structures it could cause all manner
+of subtle and not-so-subtle problems. The risk was reduced with
+5.4.4 but was still present in all perls up through 5.8.0.
+
+Beginning in perl 5.8.0 perl implements 'safe' signal handling if
+your system has the POSIX sigaction() routine. Now when a signal
+is delivered perl just makes a note of it but does I<not> run the
+%SIG handler. The handling is 'deferred' until a 'safe' moment.
+
+Although this change made signal handling safe, it also lead to
+a problem with signals being deferred for longer than you'd like.
+If a signal arrived while executing a system call, such as waiting
+for data on a network connection, the signal is noted and then the
+system call that was executing returns with an EINTR error code
+to indicate that it was interrupted. All fine so far.
+
+The problem comes when the code that made the system call sees the
+EINTR code and decides it's going to call it again. Perl doesn't
+do that, but database code sometimes does. If that happens then the
+signal handler doesn't get called until later. Maybe much later.
+
+Fortunately there are ways around this which we'll discuss below.
+Unfortunately they make signals unsafe again.
+
+The two most common uses of signals in relation to the DBI are for
+canceling operations when the user types Ctrl-C (interrupt), and for
+implementing a timeout using C<alarm()> and C<$SIG{ALRM}>.
+
+=over 4
+
+=item Cancel
+
+The DBI provides a C<cancel> method for statement handles. The
+C<cancel> method should abort the current operation and is designed
+to be called from a signal handler. For example:
+
+ $SIG{INT} = sub { $sth->cancel };
+
+However, few drivers implement this (the DBI provides a default
+method that just returns C<undef>) and, even if implemented, there
+is still a possibility that the statement handle, and even the
+parent database handle, will not be usable afterwards.
+
+If C<cancel> returns true, then it has successfully
+invoked the database engine's own cancel function. If it returns false,
+then C<cancel> failed. If it returns C<undef>, then the database
+driver does not have cancel implemented - very few do.
+
+=item Timeout
+
+The traditional way to implement a timeout is to set C<$SIG{ALRM}>
+to refer to some code that will be executed when an ALRM signal
+arrives and then to call alarm($seconds) to schedule an ALRM signal
+to be delivered $seconds in the future. For example:
+
+ eval {
+ local $SIG{ALRM} = sub { die "TIMEOUT\n" };
+ alarm($seconds);
+ ... code to execute with timeout here ...
+ alarm(0); # cancel alarm (if code ran fast)
+ };
+ alarm(0); # cancel alarm (if eval failed)
+ if ( $@ eq "TIMEOUT\n" ) { ... }
+
+Unfortunately, as described above, this won't always work as expected,
+depending on your perl version and the underlying database code.
+
+With Oracle for instance (DBD::Oracle), if the system which hosts
+the database is down the DBI->connect() call will hang for several
+minutes before returning an error.
+
+=back
+
+The solution on these systems is to use the C<POSIX::sigaction()>
+routine to gain low level access to how the signal handler is installed.
+
+The code would look something like this (for the DBD-Oracle connect()):
+
+ use POSIX ':signal_h';
+
+ my $mask = POSIX::SigSet->new( SIGALRM ); # signals to mask in the handler
+ my $action = POSIX::SigAction->new(
+ sub { die "connect timeout" }, # the handler code ref
+ $mask,
+ # not using (perl 5.8.2 and later) 'safe' switch or sa_flags
+ );
+ my $oldaction = POSIX::SigAction->new();
+ sigaction( 'ALRM', $action, $oldaction );
+ my $dbh;
+ eval {
+ alarm(5); # seconds before time out
+ $dbh = DBI->connect("dbi:Oracle:$dsn" ... );
+ alarm(0); # cancel alarm (if connect worked fast)
+ };
+ alarm(0); # cancel alarm (if eval failed)
+ sigaction( 'ALRM', $oldaction ); # restore original signal handler
+ if ( $@ ) ....
+
+Similar techniques can be used for canceling statement execution.
+
+Unfortunately, this solution is somewhat messy, and it does I<not> work with
+perl versions less than perl 5.8 where C<POSIX::sigaction()> appears to be broken.
+
+For a cleaner implementation that works across perl versions, see Lincoln Baxter's
+Sys::SigAction module at L<http://search.cpan.org/~lbaxter/Sys-SigAction/>.
+The documentation for Sys::SigAction includes an longer discussion
+of this problem, and a DBD::Oracle test script.
+
+Be sure to read all the signal handling sections of the L<perlipc> manual.
+
+And finally, two more points to keep firmly in mind. Firstly,
+remember that what we've done here is essentially revert to old
+style I<unsafe> handling of these signals. So do as little as
+possible in the handler. Ideally just die(). Secondly, the handles
+in use at the time the signal is handled may not be safe to use
+afterwards.
+
+
+=head2 Subclassing the DBI
+
+DBI can be subclassed and extended just like any other object
+oriented module. Before we talk about how to do that, it's important
+to be clear about the various DBI classes and how they work together.
+
+By default C<$dbh = DBI-E<gt>connect(...)> returns a $dbh blessed
+into the C<DBI::db> class. And the C<$dbh-E<gt>prepare> method
+returns an $sth blessed into the C<DBI::st> class (actually it
+simply changes the last four characters of the calling handle class
+to be C<::st>).
+
+The leading 'C<DBI>' is known as the 'root class' and the extra
+'C<::db>' or 'C<::st>' are the 'handle type suffixes'. If you want
+to subclass the DBI you'll need to put your overriding methods into
+the appropriate classes. For example, if you want to use a root class
+of C<MySubDBI> and override the do(), prepare() and execute() methods,
+then your do() and prepare() methods should be in the C<MySubDBI::db>
+class and the execute() method should be in the C<MySubDBI::st> class.
+
+To setup the inheritance hierarchy the @ISA variable in C<MySubDBI::db>
+should include C<DBI::db> and the @ISA variable in C<MySubDBI::st>
+should include C<DBI::st>. The C<MySubDBI> root class itself isn't
+currently used for anything visible and so, apart from setting @ISA
+to include C<DBI>, it can be left empty.
+
+So, having put your overriding methods into the right classes, and
+setup the inheritance hierarchy, how do you get the DBI to use them?
+You have two choices, either a static method call using the name
+of your subclass:
+
+ $dbh = MySubDBI->connect(...);
+
+or specifying a C<RootClass> attribute:
+
+ $dbh = DBI->connect(..., { RootClass => 'MySubDBI' });
+
+If both forms are used then the attribute takes precedence.
+
+The only differences between the two are that using an explicit
+RootClass attribute will a) make the DBI automatically attempt to load
+a module by that name if the class doesn't exist, and b) won't call
+your MySubDBI::connect() method, if you have one.
+
+When subclassing is being used then, after a successful new
+connect, the DBI->connect method automatically calls:
+
+ $dbh->connected($dsn, $user, $pass, \%attr);
+
+The default method does nothing. The call is made just to simplify
+any post-connection setup that your subclass may want to perform.
+The parameters are the same as passed to DBI->connect.
+If your subclass supplies a connected method, it should be part of the
+MySubDBI::db package.
+
+One more thing to note: you must let the DBI do the handle creation. If you
+want to override the connect() method in your *::dr class then it must still
+call SUPER::connect to get a $dbh to work with. Similarly, an overridden
+prepare() method in *::db must still call SUPER::prepare to get a $sth.
+If you try to create your own handles using bless() then you'll find the DBI
+will reject them with an "is not a DBI handle (has no magic)" error.
+
+Here's a brief example of a DBI subclass. A more thorough example
+can be found in F<t/subclass.t> in the DBI distribution.
+
+ package MySubDBI;
+
+ use strict;
+
+ use DBI;
+ use vars qw(@ISA);
+ @ISA = qw(DBI);
+
+ package MySubDBI::db;
+ use vars qw(@ISA);
+ @ISA = qw(DBI::db);
+
+ sub prepare {
+ my ($dbh, @args) = @_;
+ my $sth = $dbh->SUPER::prepare(@args)
+ or return;
+ $sth->{private_mysubdbi_info} = { foo => 'bar' };
+ return $sth;
+ }
+
+ package MySubDBI::st;
+ use vars qw(@ISA);
+ @ISA = qw(DBI::st);
+
+ sub fetch {
+ my ($sth, @args) = @_;
+ my $row = $sth->SUPER::fetch(@args)
+ or return;
+ do_something_magical_with_row_data($row)
+ or return $sth->set_err(1234, "The magic failed", undef, "fetch");
+ return $row;
+ }
+
+When calling a SUPER::method that returns a handle, be careful to
+check the return value before trying to do other things with it in
+your overridden method. This is especially important if you want to
+set a hash attribute on the handle, as Perl's autovivification will
+bite you by (in)conveniently creating an unblessed hashref, which your
+method will then return with usually baffling results later on like
+the error "dbih_getcom handle HASH(0xa4451a8) is not a DBI handle (has
+no magic". It's best to check right after the call and return undef
+immediately on error, just like DBI would and just like the example
+above.
+
+If your method needs to record an error it should call the set_err()
+method with the error code and error string, as shown in the example
+above. The error code and error string will be recorded in the
+handle and available via C<$h-E<gt>err> and C<$DBI::errstr> etc.
+The set_err() method always returns an undef or empty list as
+appropriate. Since your method should nearly always return an undef
+or empty list as soon as an error is detected it's handy to simply
+return what set_err() returns, as shown in the example above.
+
+If the handle has C<RaiseError>, C<PrintError>, or C<HandleError>
+etc. set then the set_err() method will honour them. This means
+that if C<RaiseError> is set then set_err() won't return in the
+normal way but will 'throw an exception' that can be caught with
+an C<eval> block.
+
+You can stash private data into DBI handles
+via C<$h-E<gt>{private_..._*}>. See the entry under L</ATTRIBUTES
+COMMON TO ALL HANDLES> for info and important caveats.
+
+
+=head1 TRACING
+
+The DBI has a powerful tracing mechanism built in. It enables you
+to see what's going on 'behind the scenes', both within the DBI and
+the drivers you're using.
+
+=head2 Trace Settings
+
+Which details are written to the trace output is controlled by a
+combination of a I<trace level>, an integer from 0 to 15, and a set
+of I<trace flags> that are either on or off. Together these are known
+as the I<trace settings> and are stored together in a single integer.
+For normal use you only need to set the trace level, and generally
+only to a value between 1 and 4.
+
+Each handle has it's own trace settings, and so does the DBI.
+When you call a method the DBI merges the handles settings into its
+own for the duration of the call: the trace flags of the handle are
+OR'd into the trace flags of the DBI, and if the handle has a higher
+trace level then the DBI trace level is raised to match it.
+The previous DBI trace settings are restored when the called method
+returns.
+
+=head2 Trace Levels
+
+Trace I<levels> are as follows:
+
+ 0 - Trace disabled.
+ 1 - Trace top-level DBI method calls returning with results or errors.
+ 2 - As above, adding tracing of top-level method entry with parameters.
+ 3 - As above, adding some high-level information from the driver
+ and some internal information from the DBI.
+ 4 - As above, adding more detailed information from the driver.
+ This is the first level to trace all the rows being fetched.
+ 5 to 15 - As above but with more and more internal information.
+
+Trace level 1 is best for a simple overview of what's happening.
+Trace levels 2 thru 4 a good choice for general purpose tracing.
+Levels 5 and above are best reserved for investigating a specific
+problem, when you need to see "inside" the driver and DBI.
+
+The trace output is detailed and typically very useful. Much of the
+trace output is formatted using the L</neat> function, so strings
+in the trace output may be edited and truncated by that function.
+
+=head2 Trace Flags
+
+Trace I<flags> are used to enable tracing of specific activities
+within the DBI and drivers. The DBI defines some trace flags and
+drivers can define others. DBI trace flag names begin with a capital
+letter and driver specific names begin with a lowercase letter, as
+usual.
+
+Currently the DBI only defines two trace flags:
+
+ ALL - turn on all DBI and driver flags (not recommended)
+ SQL - trace SQL statements executed
+ (not yet implemented in DBI but implemented in some DBDs)
+
+The L</parse_trace_flags> and L</parse_trace_flag> methods are used
+to convert trace flag names into the corresponding integer bit flags.
+
+=head2 Enabling Trace
+
+The C<$h-E<gt>trace> method sets the trace settings for a handle
+and C<DBI-E<gt>trace> does the same for the DBI.
+
+In addition to the L</trace> method, you can enable the same trace
+information, and direct the output to a file, by setting the
+C<DBI_TRACE> environment variable before starting Perl.
+See L</DBI_TRACE> for more information.
+
+Finally, you can set, or get, the trace settings for a handle using
+the C<TraceLevel> attribute.
+
+All of those methods use parse_trace_flags() and so allow you set
+both the trace level and multiple trace flags by using a string
+containing the trace level and/or flag names separated by vertical
+bar ("C<|>") or comma ("C<,>") characters. For example:
+
+ local $h->{TraceLevel} = "3|SQL|foo";
+
+=head2 Trace Output
+
+Initially trace output is written to C<STDERR>. Both the
+C<$h-E<gt>trace> and C<DBI-E<gt>trace> methods take an optional
+$trace_file parameter, which may be either the name of a file to be
+opened by DBI in append mode, or a reference to an existing writable
+(possibly layered) filehandle. If $trace_file is a filename,
+and can be opened in append mode, or $trace_file is a writable
+filehandle, then I<all> trace output (currently including that from
+other handles) is redirected to that file. A warning is generated
+if $trace_file can't be opened or is not writable.
+
+Further calls to trace() without $trace_file do not alter where
+the trace output is sent. If $trace_file is undefined, then
+trace output is sent to C<STDERR> and, if the prior trace was opened with
+$trace_file as a filename, the previous trace file is closed; if $trace_file was
+a filehandle, the filehandle is B<not> closed.
+
+B<NOTE>: If $trace_file is specified as a filehandle, the filehandle
+should not be closed until all DBI operations are completed, or the
+application has reset the trace file via another call to
+C<trace()> that changes the trace file.
+
+=head2 Tracing to Layered Filehandles
+
+B<NOTE>:
+
+=over 4
+
+=item *
+Tied filehandles are not currently supported, as
+tie operations are not available to the PerlIO
+methods used by the DBI.
+
+=item *
+PerlIO layer support requires Perl version 5.8 or higher.
+
+=back
+
+As of version 5.8, Perl provides the ability to layer various
+"disciplines" on an open filehandle via the L<PerlIO> module.
+
+A simple example of using PerlIO layers is to use a scalar as the output:
+
+ my $scalar = '';
+ open( my $fh, "+>:scalar", \$scalar );
+ $dbh->trace( 2, $fh );
+
+Now all trace output is simply appended to $scalar.
+
+A more complex application of tracing to a layered filehandle is the
+use of a custom layer (I<Refer to >L<Perlio::via> I<for details
+on creating custom PerlIO layers.>). Consider an application with the
+following logger module:
+
+ package MyFancyLogger;
+
+ sub new
+ {
+ my $self = {};
+ my $fh;
+ open $fh, '>', 'fancylog.log';
+ $self->{_fh} = $fh;
+ $self->{_buf} = '';
+ return bless $self, shift;
+ }
+
+ sub log
+ {
+ my $self = shift;
+ return unless exists $self->{_fh};
+ my $fh = $self->{_fh};
+ $self->{_buf} .= shift;
+ #
+ # DBI feeds us pieces at a time, so accumulate a complete line
+ # before outputing
+ #
+ print $fh "At ", scalar localtime(), ':', $self->{_buf}, "\n" and
+ $self->{_buf} = ''
+ if $self->{_buf}=~tr/\n//;
+ }
+
+ sub close {
+ my $self = shift;
+ return unless exists $self->{_fh};
+ my $fh = $self->{_fh};
+ print $fh "At ", scalar localtime(), ':', $self->{_buf}, "\n" and
+ $self->{_buf} = ''
+ if $self->{_buf};
+ close $fh;
+ delete $self->{_fh};
+ }
+
+ 1;
+
+To redirect DBI traces to this logger requires creating
+a package for the layer:
+
+ package PerlIO::via::MyFancyLogLayer;
+
+ sub PUSHED
+ {
+ my ($class,$mode,$fh) = @_;
+ my $logger;
+ return bless \$logger,$class;
+ }
+
+ sub OPEN {
+ my ($self, $path, $mode, $fh) = @_;
+ #
+ # $path is actually our logger object
+ #
+ $$self = $path;
+ return 1;
+ }
+
+ sub WRITE
+ {
+ my ($self, $buf, $fh) = @_;
+ $$self->log($buf);
+ return length($buf);
+ }
+
+ sub CLOSE {
+ my $self = shift;
+ $$self->close();
+ return 0;
+ }
+
+ 1;
+
+
+The application can then cause DBI traces to be routed to the
+logger using
+
+ use PerlIO::via::MyFancyLogLayer;
+
+ open my $fh, '>:via(MyFancyLogLayer)', MyFancyLogger->new();
+
+ $dbh->trace('SQL', $fh);
+
+Now all trace output will be processed by MyFancyLogger's
+log() method.
+
+=head2 Trace Content
+
+Many of the values embedded in trace output are formatted using the neat()
+utility function. This means they may be quoted, sanitized, and possibly
+truncated if longer than C<$DBI::neat_maxlen>. See L</neat> for more details.
+
+=head2 Tracing Tips
+
+You can add tracing to your own application code using the L</trace_msg> method.
+
+It can sometimes be handy to compare trace files from two different runs of the
+same script. However using a tool like C<diff> on the original log output
+doesn't work well because the trace file is full of object addresses that may
+differ on each run.
+
+The DBI includes a handy utility called dbilogstrip that can be used to
+'normalize' the log content. It can be used as a filter like this:
+
+ DBI_TRACE=2 perl yourscript.pl ...args1... 2>&1 | dbilogstrip > dbitrace1.log
+ DBI_TRACE=2 perl yourscript.pl ...args2... 2>&1 | dbilogstrip > dbitrace2.log
+ diff -u dbitrace1.log dbitrace2.log
+
+See L<dbilogstrip> for more information.
+
+=head1 DBI ENVIRONMENT VARIABLES
+
+The DBI module recognizes a number of environment variables, but most of
+them should not be used most of the time.
+It is better to be explicit about what you are doing to avoid the need
+for environment variables, especially in a web serving system where web
+servers are stingy about which environment variables are available.
+
+=head2 DBI_DSN
+
+The DBI_DSN environment variable is used by DBI->connect if you do not
+specify a data source when you issue the connect.
+It should have a format such as "dbi:Driver:databasename".
+
+=head2 DBI_DRIVER
+
+The DBI_DRIVER environment variable is used to fill in the database
+driver name in DBI->connect if the data source string starts "dbi::"
+(thereby omitting the driver).
+If DBI_DSN omits the driver name, DBI_DRIVER can fill the gap.
+
+=head2 DBI_AUTOPROXY
+
+The DBI_AUTOPROXY environment variable takes a string value that starts
+"dbi:Proxy:" and is typically followed by "hostname=...;port=...".
+It is used to alter the behaviour of DBI->connect.
+For full details, see DBI::Proxy documentation.
+
+=head2 DBI_USER
+
+The DBI_USER environment variable takes a string value that is used as
+the user name if the DBI->connect call is given undef (as distinct from
+an empty string) as the username argument.
+Be wary of the security implications of using this.
+
+=head2 DBI_PASS
+
+The DBI_PASS environment variable takes a string value that is used as
+the password if the DBI->connect call is given undef (as distinct from
+an empty string) as the password argument.
+Be extra wary of the security implications of using this.
+
+=head2 DBI_DBNAME (obsolete)
+
+The DBI_DBNAME environment variable takes a string value that is used only when the
+obsolescent style of DBI->connect (with driver name as fourth parameter) is used, and
+when no value is provided for the first (database name) argument.
+
+=head2 DBI_TRACE
+
+The DBI_TRACE environment variable specifies the global default
+trace settings for the DBI at startup. Can also be used to direct
+trace output to a file. When the DBI is loaded it does:
+
+ DBI->trace(split /=/, $ENV{DBI_TRACE}, 2) if $ENV{DBI_TRACE};
+
+So if C<DBI_TRACE> contains an "C<=>" character then what follows
+it is used as the name of the file to append the trace to.
+
+output appended to that file. If the name begins with a number
+followed by an equal sign (C<=>), then the number and the equal sign are
+stripped off from the name, and the number is used to set the trace
+level. For example:
+
+ DBI_TRACE=1=dbitrace.log perl your_test_script.pl
+
+On Unix-like systems using a Bourne-like shell, you can do this easily
+on the command line:
+
+ DBI_TRACE=2 perl your_test_script.pl
+
+See L</TRACING> for more information.
+
+=head2 PERL_DBI_DEBUG (obsolete)
+
+An old variable that should no longer be used; equivalent to DBI_TRACE.
+
+=head2 DBI_PROFILE
+
+The DBI_PROFILE environment variable can be used to enable profiling
+of DBI method calls. See L<DBI::Profile> for more information.
+
+=head2 DBI_PUREPERL
+
+The DBI_PUREPERL environment variable can be used to enable the
+use of DBI::PurePerl. See L<DBI::PurePerl> for more information.
+
+=head1 WARNING AND ERROR MESSAGES
+
+=head2 Fatal Errors
+
+=over 4
+
+=item Can't call method "prepare" without a package or object reference
+
+The C<$dbh> handle you're using to call C<prepare> is probably undefined because
+the preceding C<connect> failed. You should always check the return status of
+DBI methods, or use the L</RaiseError> attribute.
+
+=item Can't call method "execute" without a package or object reference
+
+The C<$sth> handle you're using to call C<execute> is probably undefined because
+the preceding C<prepare> failed. You should always check the return status of
+DBI methods, or use the L</RaiseError> attribute.
+
+=item DBI/DBD internal version mismatch
+
+The DBD driver module was built with a different version of DBI than
+the one currently being used. You should rebuild the DBD module under
+the current version of DBI.
+
+(Some rare platforms require "static linking". On those platforms, there
+may be an old DBI or DBD driver version actually embedded in the Perl
+executable being used.)
+
+=item DBD driver has not implemented the AutoCommit attribute
+
+The DBD driver implementation is incomplete. Consult the author.
+
+=item Can't [sg]et %s->{%s}: unrecognised attribute
+
+You attempted to set or get an unknown attribute of a handle. Make
+sure you have spelled the attribute name correctly; case is significant
+(e.g., "Autocommit" is not the same as "AutoCommit").
+
+=back
+
+=head1 Pure-Perl DBI
+
+A pure-perl emulation of the DBI is included in the distribution
+for people using pure-perl drivers who, for whatever reason, can't
+install the compiled DBI. See L<DBI::PurePerl>.
+
+=head1 SEE ALSO
+
+=head2 Driver and Database Documentation
+
+Refer to the documentation for the DBD driver that you are using.
+
+Refer to the SQL Language Reference Manual for the database engine that you are using.
+
+=head2 ODBC and SQL/CLI Standards Reference Information
+
+More detailed information about the semantics of certain DBI methods
+that are based on ODBC and SQL/CLI standards is available on-line
+via microsoft.com, for ODBC, and www.jtc1sc32.org for the SQL/CLI
+standard:
+
+ DBI method ODBC function SQL/CLI Working Draft
+ ---------- ------------- ---------------------
+ column_info SQLColumns Page 124
+ foreign_key_info SQLForeignKeys Page 163
+ get_info SQLGetInfo Page 214
+ primary_key_info SQLPrimaryKeys Page 254
+ table_info SQLTables Page 294
+ type_info SQLGetTypeInfo Page 239
+ statistics_info SQLStatistics
+
+For example, for ODBC information on SQLColumns you'd visit:
+
+ http://msdn.microsoft.com/library/en-us/odbc/htm/odbcsqlcolumns.asp
+
+If that URL ceases to work then use the MSDN search facility at:
+
+ http://search.microsoft.com/us/dev/
+
+and search for C<SQLColumns returns> using the exact phrase option.
+The link you want will probably just be called C<SQLColumns> and will
+be part of the Data Access SDK.
+
+And for SQL/CLI standard information on SQLColumns you'd read page 124 of
+the (very large) SQL/CLI Working Draft available from:
+
+ http://jtc1sc32.org/doc/N0701-0750/32N0744T.pdf
+
+=head2 Standards Reference Information
+
+A hyperlinked, browsable version of the BNF syntax for SQL92 (plus
+Oracle 7 SQL and PL/SQL) is available here:
+
+ http://cui.unige.ch/db-research/Enseignement/analyseinfo/SQL92/BNFindex.html
+
+A BNF syntax for SQL3 is available here:
+
+ http://www.sqlstandards.org/SC32/WG3/Progression_Documents/Informal_working_drafts/iso-9075-2-1999.bnf
+
+The following links provide further useful information about SQL.
+Some of these are rather dated now but may still be useful.
+
+ http://www.jcc.com/SQLPages/jccs_sql.htm
+ http://www.contrib.andrew.cmu.edu/~shadow/sql.html
+ http://www.altavista.com/query?q=sql+tutorial
+
+
+=head2 Books and Articles
+
+Programming the Perl DBI, by Alligator Descartes and Tim Bunce.
+L<http://books.perl.org/book/154>
+
+Programming Perl 3rd Ed. by Larry Wall, Tom Christiansen & Jon Orwant.
+L<http://books.perl.org/book/134>
+
+Learning Perl by Randal Schwartz.
+L<http://books.perl.org/book/101>
+
+Details of many other books related to perl can be found at L<http://books.perl.org>
+
+=head2 Perl Modules
+
+Index of DBI related modules available from CPAN:
+
+ http://search.cpan.org/search?mode=module&query=DBIx%3A%3A
+ http://search.cpan.org/search?mode=doc&query=DBI
+
+For a good comparison of RDBMS-OO mappers and some OO-RDBMS mappers
+(including Class::DBI, Alzabo, and DBIx::RecordSet in the former
+category and Tangram and SPOPS in the latter) see the Perl
+Object-Oriented Persistence project pages at:
+
+ http://poop.sourceforge.net
+
+A similar page for Java toolkits can be found at:
+
+ http://c2.com/cgi-bin/wiki?ObjectRelationalToolComparison
+
+=head2 Mailing List
+
+The I<dbi-users> mailing list is the primary means of communication among
+users of the DBI and its related modules. For details send email to:
+
+ dbi-users-help@perl.org
+
+There are typically between 700 and 900 messages per month. You have
+to subscribe in order to be able to post. However you can opt for a
+'post-only' subscription.
+
+Mailing list archives (of variable quality) are held at:
+
+ http://groups.google.com/groups?group=perl.dbi.users
+ http://www.xray.mpe.mpg.de/mailing-lists/dbi/
+ http://www.mail-archive.com/dbi-users%40perl.org/
+
+=head2 Assorted Related WWW Links
+
+The DBI "Home Page":
+
+ http://dbi.perl.org/
+
+Other DBI related links:
+
+ http://tegan.deltanet.com/~phlip/DBUIdoc.html
+ http://dc.pm.org/perl_db.html
+ http://wdvl.com/Authoring/DB/Intro/toc.html
+ http://www.hotwired.com/webmonkey/backend/tutorials/tutorial1.html
+ http://bumppo.net/lists/macperl/1999/06/msg00197.html
+ http://gmax.oltrelinux.com/dbirecipes.html
+
+Other database related links:
+
+ http://www.jcc.com/sql_stnd.html
+ http://cuiwww.unige.ch/OSG/info/FreeDB/FreeDB.home.html
+ http://www.connectionstrings.com/
+
+Security, especially the "SQL Injection" attack:
+
+ http://www.ngssoftware.com/research/papers.html
+ http://www.ngssoftware.com/papers/advanced_sql_injection.pdf
+ http://www.ngssoftware.com/papers/more_advanced_sql_injection.pdf
+ http://www.esecurityplanet.com/trends/article.php/2243461
+ http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf
+ http://www.imperva.com/application_defense_center/white_papers/blind_sql_server_injection.html
+ http://online.securityfocus.com/infocus/1644
+
+Commercial and Data Warehouse Links
+
+ http://www.dwinfocenter.org
+ http://www.datawarehouse.com
+ http://www.datamining.org
+ http://www.olapcouncil.org
+ http://www.idwa.org
+ http://www.knowledgecenters.org/dwcenter.asp
+
+Recommended Perl Programming Links
+
+ http://language.perl.com/style/
+
+
+=head2 FAQ
+
+See L<http://faq.dbi-support.com/>
+
+=head1 AUTHORS
+
+DBI by Tim Bunce, L<http://www.tim.bunce.name>
+
+This pod text by Tim Bunce, J. Douglas Dunlop, Jonathan Leffler and others.
+Perl by Larry Wall and the C<perl5-porters>.
+
+=head1 COPYRIGHT
+
+The DBI module is Copyright (c) 1994-2009 Tim Bunce. Ireland.
+All rights reserved.
+
+You may distribute under the terms of either the GNU General Public
+License or the Artistic License, as specified in the Perl 5.10.0 README file.
+
+=head1 SUPPORT / WARRANTY
+
+The DBI is free Open Source software. IT COMES WITHOUT WARRANTY OF ANY KIND.
+
+=head2 Support
+
+My consulting company, Data Plan Services, offers annual and
+multi-annual support contracts for the DBI. These provide sustained
+support for DBI development, and sustained value for you in return.
+Contact me for details.
+
+=head2 Sponsor Enhancements
+
+The DBI Roadmap is available at L<http://search.cpan.org/~timb/DBI/Roadmap.pod>
+
+If your company would benefit from a specific new DBI feature,
+please consider sponsoring its development. Work is performed
+rapidly, and usually on a fixed-price payment-on-delivery basis.
+Contact me for details.
+
+Using such targeted financing allows you to contribute to DBI
+development, and rapidly get something specific and valuable in return.
+
+=head1 ACKNOWLEDGEMENTS
+
+I would like to acknowledge the valuable contributions of the many
+people I have worked with on the DBI project, especially in the early
+years (1992-1994). In no particular order: Kevin Stock, Buzz Moschetti,
+Kurt Andersen, Ted Lemon, William Hails, Garth Kennedy, Michael Peppler,
+Neil S. Briscoe, Jeff Urlwin, David J. Hughes, Jeff Stander,
+Forrest D Whitcher, Larry Wall, Jeff Fried, Roy Johnson, Paul Hudson,
+Georg Rehfeld, Steve Sizemore, Ron Pool, Jon Meek, Tom Christiansen,
+Steve Baumgarten, Randal Schwartz, and a whole lot more.
+
+Then, of course, there are the poor souls who have struggled through
+untold and undocumented obstacles to actually implement DBI drivers.
+Among their ranks are Jochen Wiedmann, Alligator Descartes, Jonathan
+Leffler, Jeff Urlwin, Michael Peppler, Henrik Tougaard, Edwin Pratomo,
+Davide Migliavacca, Jan Pazdziora, Peter Haworth, Edmund Mergl, Steve
+Williams, Thomas Lowery, and Phlip Plumlee. Without them, the DBI would
+not be the practical reality it is today. I'm also especially grateful
+to Alligator Descartes for starting work on the first edition of the
+"Programming the Perl DBI" book and letting me jump on board.
+
+The DBI and DBD::Oracle were originally developed while I was Technical
+Director (CTO) of Ingeneering in the UK (L<http://www.ig.co.uk>) (formerly known as the
+Paul Ingram Group). So I'd especially like to thank Paul for his generosity
+and vision in supporting this work for many years.
+
+A couple of specific DBI features have been sponsored by enlightened companies:
+
+The development of the swap_inner_handle() method was sponsored by BizRate.com (L<http://BizRate.com>)
+
+The development of DBD::Gofer and related modules was sponsored by
+Shopzilla.com (L<http://Shopzilla.com>), where I currently work.
+
+
+=head1 CONTRIBUTING
+
+As you can see above, many people have contributed to the DBI and
+drivers in many ways over many years.
+
+If you'd like to help then see L<http://dbi.perl.org/contributing>
+and L<http://search.cpan.org/~timb/DBI/Roadmap.pod>
+
+If you'd like the DBI to do something new or different then a good way
+to make that happen is to do it yourself and send me a patch to the
+source code that shows the changes. (But read "Speak before you patch"
+below.)
+
+=head2 Browsing the source code repository
+
+Use http://svn.perl.org/modules/dbi/trunk (basic)
+or http://svn.perl.org/viewcvs/modules/ (more useful)
+
+=head2 How to create a patch using Subversion
+
+The DBI source code is maintained using Subversion (a replacement
+for CVS, see L<http://subversion.tigris.org/>). To access the source
+you'll need to install a Subversion client. Then, to get the source
+code, do:
+
+ svn checkout http://svn.perl.org/modules/dbi/trunk
+
+If it prompts for a username and password use your perl.org account
+if you have one, else just 'guest' and 'guest'. The source code will
+be in a new subdirectory called C<trunk>.
+
+To keep informed about changes to the source you can send an empty email
+to svn-commit-modules-dbi-subscribe@perl.org after which you'll get an email
+with the change log message and diff of each change checked-in to the source.
+
+After making your changes you can generate a patch file, but before
+you do, make sure your source is still up to date using:
+
+ svn update
+
+If you get any conflicts reported you'll need to fix them first.
+Then generate the patch file from within the C<trunk> directory using:
+
+ svn diff > foo.patch
+
+Read the patch file, as a sanity check, and then email it to dbi-dev@perl.org.
+
+=head2 How to create a patch without Subversion
+
+Unpack a fresh copy of the distribution:
+
+ tar xfz DBI-1.40.tar.gz
+
+Rename the newly created top level directory:
+
+ mv DBI-1.40 DBI-1.40.your_foo
+
+Edit the contents of DBI-1.40.your_foo/* till it does what you want.
+
+Test your changes and then remove all temporary files:
+
+ make test && make distclean
+
+Go back to the directory you originally unpacked the distribution:
+
+ cd ..
+
+Unpack I<another> copy of the original distribution you started with:
+
+ tar xfz DBI-1.40.tar.gz
+
+Then create a patch file by performing a recursive C<diff> on the two
+top level directories:
+
+ diff -r -u DBI-1.40 DBI-1.40.your_foo > DBI-1.40.your_foo.patch
+
+=head2 Speak before you patch
+
+For anything non-trivial or possibly controversial it's a good idea
+to discuss (on dbi-dev@perl.org) the changes you propose before
+actually spending time working on them. Otherwise you run the risk
+of them being rejected because they don't fit into some larger plans
+you may not be aware of.
+
+=head1 TRANSLATIONS
+
+A German translation of this manual (possibly slightly out of date) is
+available, thanks to O'Reilly, at:
+
+ http://www.oreilly.de/catalog/perldbiger/
+
+Some other translations:
+
+ http://cronopio.net/perl/ - Spanish
+ http://member.nifty.ne.jp/hippo2000/dbimemo.htm - Japanese
+
+
+=head1 TRAINING
+
+References to DBI related training resources. No recommendation implied.
+
+ http://www.treepax.co.uk/
+ http://www.keller.com/dbweb/
+
+(If you offer professional DBI related training services,
+please send me your details so I can add them here.)
+
+=head1 OTHER RELATED WORK AND PERL MODULES
+
+=over 4
+
+=item Apache::DBI by E.Mergl@bawue.de
+
+To be used with the Apache daemon together with an embedded Perl
+interpreter like C<mod_perl>. Establishes a database connection which
+remains open for the lifetime of the HTTP daemon. This way the CGI
+connect and disconnect for every database access becomes superfluous.
+
+=item SQL Parser
+
+See also the L<SQL::Statement> module, SQL parser and engine.
+
+=back
+
+=cut
+
+# LocalWords: DBI
diff --git a/Master/tlpkg/tlperl.straw/lib/DBIx/Simple.pm b/Master/tlpkg/tlperl.straw/lib/DBIx/Simple.pm
new file mode 100755
index 00000000000..dc13b3c0d18
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBIx/Simple.pm
@@ -0,0 +1,926 @@
+use 5.006;
+use strict;
+use DBI;
+use Carp ();
+
+$DBIx::Simple::VERSION = '1.32';
+$Carp::Internal{$_} = 1
+ for qw(DBIx::Simple DBIx::Simple::Result DBIx::Simple::DeadObject);
+
+my $quoted = qr/(?:'[^']*'|"[^"]*")*/; # 'foo''bar' simply matches the (?:) twice
+my $quoted_mysql = qr/(?:(?:[^\\']*(?:\\.[^\\']*)*)'|"(?:[^\\"]*(?:\\.[^\\"]*)*)")*/;
+
+my %statements; # "$db" => { "$st" => $st, ... }
+my %old_statements; # "$db" => [ [ $query, $st ], ... ]
+my %keep_statements; # "$db" => $int
+
+my $err_message = '%s no longer usable (because of %%s)';
+my $err_cause = '%s at %s line %d';
+
+package DBIx::Simple;
+
+### private helper subs
+
+sub _dummy { bless \my $dummy, 'DBIx::Simple::Dummy' }
+sub _swap {
+ my ($hash1, $hash2) = @_;
+ my $tempref = ref $hash1;
+ my $temphash = { %$hash1 };
+ %$hash1 = %$hash2;
+ bless $hash1, ref $hash2;
+ %$hash2 = %$temphash;
+ bless $hash2, $tempref;
+}
+
+### constructor
+
+sub connect {
+ my ($class, @arguments) = @_;
+ my $self = { lc_columns => 1, result_class => 'DBIx::Simple::Result' };
+ if (defined $arguments[0] and UNIVERSAL::isa($arguments[0], 'DBI::db')) {
+ $self->{dont_disconnect} = 1;
+ $self->{dbh} = shift @arguments;
+ Carp::carp("Additional arguments for $class->connect are ignored")
+ if @arguments;
+ } else {
+ $arguments[3]->{PrintError} = 0
+ unless defined $arguments[3] and defined $arguments[3]{PrintError};
+ $self->{dbh} = DBI->connect(@arguments);
+ }
+
+ return undef unless $self->{dbh};
+
+ $self->{dbd} = $self->{dbh}->{Driver}->{Name};
+ bless $self, $class;
+
+ $statements{$self} = {};
+ $old_statements{$self} = [];
+ $keep_statements{$self} = 16;
+
+ return $self;
+}
+
+sub new {
+ my ($class) = shift;
+ $class->connect(@_);
+}
+
+### properties
+
+sub keep_statements : lvalue { $keep_statements{ $_[0] } }
+sub lc_columns : lvalue { $_[0]->{lc_columns} }
+sub result_class : lvalue { $_[0]->{result_class} }
+
+sub abstract : lvalue {
+ require SQL::Abstract;
+ $_[0]->{abstract} ||= SQL::Abstract->new;
+}
+
+### private methods
+
+# Replace (??) with (?, ?, ?, ...)
+sub _replace_omniholder {
+ my ($self, $query, $binds) = @_;
+ return if $$query !~ /\(\?\?\)/;
+ my $omniholders = 0;
+ my $q = $self->{dbd} =~ /mysql/ ? $quoted_mysql : $quoted;
+ $$query =~ s[($q|\(\?\?\))] {
+ $1 eq '(??)'
+ ? do {
+ Carp::croak('There can be only one omniholder')
+ if $omniholders++;
+ '(' . join(', ', ('?') x @$binds) . ')'
+ }
+ : $1
+ }eg;
+}
+
+# Invalidate and clean up
+sub _die {
+ my ($self, $cause) = @_;
+
+ defined and $_->_die($cause, 0)
+ for values %{ $statements{$self} },
+ map $$_[1], @{ $old_statements{$self} };
+ delete $statements{$self};
+ delete $old_statements{$self};
+ delete $keep_statements{$self};
+
+ unless ($self->{dont_disconnect}) {
+ # Conditional, because destruction order is not guaranteed
+ # during global destruction.
+ $self->{dbh}->disconnect() if defined $self->{dbh};
+ }
+
+ _swap(
+ $self,
+ bless {
+ what => 'Database object',
+ cause => $cause
+ }, 'DBIx::Simple::DeadObject'
+ ) unless $cause =~ /DESTROY/; # Let's not cause infinite loops :)
+}
+
+### public methods
+
+sub query {
+ my ($self, $query, @binds) = @_;
+ $self->{success} = 0;
+
+ $self->_replace_omniholder(\$query, \@binds);
+
+ my $st;
+ my $sth;
+
+ my $old = $old_statements{$self};
+
+ if (my $i = (grep $old->[$_][0] eq $query, 0..$#$old)[0]) {
+ $st = splice(@$old, $i, 1)->[1];
+ $sth = $st->{sth};
+ } else {
+ eval { $sth = $self->{dbh}->prepare($query) } or do {
+ if ($@) {
+ $@ =~ s/ at \S+ line \d+\.\n\z//;
+ Carp::croak($@);
+ }
+ $self->{reason} = "Prepare failed ($DBI::errstr)";
+ return _dummy;
+ };
+
+ # $self is quoted on purpose, to pass along the stringified version,
+ # and avoid increasing reference count.
+ $st = bless {
+ db => "$self",
+ sth => $sth,
+ query => $query
+ }, 'DBIx::Simple::Statement';
+ $statements{$self}{$st} = $st;
+ }
+
+ eval { $sth->execute(@binds) } or do {
+ if ($@) {
+ $@ =~ s/ at \S+ line \d+\.\n\z//;
+ Carp::croak($@);
+ }
+
+ $self->{reason} = "Execute failed ($DBI::errstr)";
+ return _dummy;
+ };
+
+ $self->{success} = 1;
+
+ return bless { st => $st, lc_columns => $self->{lc_columns} }, $self->{result_class};
+}
+
+sub error {
+ my ($self) = @_;
+ return 'DBI error: ' . (ref $self ? $self->{dbh}->errstr : $DBI::errstr);
+}
+
+sub dbh { $_[0]->{dbh} }
+sub begin_work { $_[0]->{dbh}->begin_work }
+sub begin { $_[0]->begin_work }
+sub commit { $_[0]->{dbh}->commit }
+sub rollback { $_[0]->{dbh}->rollback }
+sub func { shift->{dbh}->func(@_) }
+
+sub last_insert_id {
+ my ($self) = @_;
+
+ ($self->{dbi_version} ||= DBI->VERSION) >= 1.38 or Carp::croak(
+ "DBI v1.38 required for last_insert_id" .
+ "--this is only $self->{dbi_version}, stopped"
+ );
+
+ return shift->{dbh}->last_insert_id(@_);
+}
+
+sub disconnect {
+ my ($self) = @_;
+ $self->_die(sprintf($err_cause, "$self->disconnect", (caller)[1, 2]));
+}
+
+sub DESTROY {
+ my ($self) = @_;
+ $self->_die(sprintf($err_cause, "$self->DESTROY", (caller)[1, 2]));
+}
+
+### public methods wrapping SQL::Abstract
+
+for my $method (qw/select insert update delete/) {
+ no strict 'refs';
+ *$method = sub {
+ my $self = shift;
+ return $self->query($self->abstract->$method(@_));
+ }
+}
+
+### public method wrapping SQL::Interp
+
+sub iquery {
+ require SQL::Interp;
+ my $self = shift;
+ return $self->query( SQL::Interp::sql_interp(@_) );
+}
+
+package DBIx::Simple::Dummy;
+
+use overload
+ '""' => sub { shift },
+ bool => sub { 0 };
+
+sub new { bless \my $dummy, shift }
+sub AUTOLOAD { return }
+
+package DBIx::Simple::DeadObject;
+
+sub _die {
+ my ($self) = @_;
+ Carp::croak(
+ sprintf(
+ "(This should NEVER happen!) " .
+ sprintf($err_message, $self->{what}),
+ $self->{cause}
+ )
+ );
+}
+
+sub AUTOLOAD {
+ my ($self) = @_;
+ Carp::croak(
+ sprintf(
+ sprintf($err_message, $self->{what}),
+ $self->{cause}
+ )
+ );
+}
+sub DESTROY { }
+
+package DBIx::Simple::Statement;
+
+sub _die {
+ my ($self, $cause, $save) = @_;
+
+ $self->{sth}->finish() if defined $self->{sth};
+ $self->{dead} = 1;
+
+ my $stringy_db = "$self->{db}";
+ my $stringy_self = "$self";
+
+ my $foo = bless {
+ what => 'Statement object',
+ cause => $cause
+ }, 'DBIx::Simple::DeadObject';
+
+ DBIx::Simple::_swap($self, $foo);
+
+ my $old = $old_statements{ $foo->{db} };
+ my $keep = $keep_statements{ $foo->{db} };
+
+ if ($save and $keep) {
+ $foo->{dead} = 0;
+ shift @$old until @$old + 1 <= $keep;
+ push @$old, [ $foo->{query}, $foo ];
+ }
+
+ delete $statements{ $stringy_db }{ $stringy_self };
+}
+
+sub DESTROY {
+ # This better only happen during global destruction...
+ return if $_[0]->{dead};
+ $_[0]->_die('Ehm', 0);
+}
+
+package DBIx::Simple::Result;
+
+sub _die {
+ my ($self, $cause) = @_;
+ if ($cause) {
+ $self->{st}->_die($cause, 1);
+ DBIx::Simple::_swap(
+ $self,
+ bless {
+ what => 'Result object',
+ cause => $cause,
+ }, 'DBIx::Simple::DeadObject'
+ );
+ } else {
+ $cause = $self->{st}->{cause};
+ DBIx::Simple::_swap(
+ $self,
+ bless {
+ what => 'Result object',
+ cause => $cause
+ }, 'DBIx::Simple::DeadObject'
+ );
+ Carp::croak(
+ sprintf(
+ sprintf($err_message, $self->{what}),
+ $cause
+ )
+ );
+ }
+}
+
+sub func { shift->{st}->{sth}->func(@_) }
+sub attr { my $dummy = $_[0]->{st}->{sth}->{$_[1]} }
+
+sub columns {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ my $c = $_[0]->{st}->{sth}->{ $_[0]->{lc_columns} ? 'NAME_lc' : 'NAME' };
+ return wantarray ? @$c : $c;
+}
+
+sub bind {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ $_[0]->{st}->{sth}->bind_columns(\@_[1..$#_]);
+}
+
+sub fetch {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ return $_[0]->{st}->{sth}->fetch;
+}
+
+sub into {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ my $sth = $_[0]->{st}->{sth};
+ $sth->bind_columns(\@_[1..$#_]) if @_ > 1;
+ return $sth->fetch;
+}
+
+sub list {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ return $_[0]->{st}->{sth}->fetchrow_array if wantarray;
+ return($_[0]->{st}->{sth}->fetchrow_array)[-1];
+}
+
+sub array {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ my $row = $_[0]->{st}->{sth}->fetchrow_arrayref or return;
+ return [ @$row ];
+}
+
+sub hash {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ return $_[0]->{st}->{sth}->fetchrow_hashref(
+ $_[0]->{lc_columns} ? 'NAME_lc' : 'NAME'
+ );
+}
+
+sub flat {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ return map @$_, $_[0]->arrays if wantarray;
+ return [ map @$_, $_[0]->arrays ];
+}
+
+sub arrays {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ return @{ $_[0]->{st}->{sth}->fetchall_arrayref } if wantarray;
+ return $_[0]->{st}->{sth}->fetchall_arrayref;
+}
+
+sub hashes {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ my ($self) = @_;
+ my @return;
+ my $dummy;
+ push @return, $dummy while $dummy = $self->hash;
+ return wantarray ? @return : \@return;
+}
+
+sub map_hashes {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ my ($self, $keyname) = @_;
+ Carp::croak('Key column name not optional') if not defined $keyname;
+ my @rows = $self->hashes;
+ my @keys;
+ push @keys, delete $_->{$keyname} for @rows;
+ my %return;
+ @return{@keys} = @rows;
+ return wantarray ? %return : \%return;
+}
+
+sub map_arrays {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ my ($self, $keyindex) = @_;
+ $keyindex += 0;
+ my @rows = $self->arrays;
+ my @keys;
+ push @keys, splice @$_, $keyindex, 1 for @rows;
+ my %return;
+ @return{@keys} = @rows;
+ return wantarray ? %return : \%return;
+}
+
+sub map {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ return map @$_, @{ $_[0]->{st}->{sth}->fetchall_arrayref } if wantarray;
+ return { map @$_, @{ $_[0]->{st}->{sth}->fetchall_arrayref } };
+}
+
+sub rows {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ $_[0]->{st}->{sth}->rows;
+}
+
+sub xto {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ require DBIx::XHTML_Table;
+ my $self = shift;
+ my $attr = ref $_[0] ? $_[0] : { @_ };
+
+ # Old DBD::SQLite (.29) spits out garbage if done *after* fetching.
+ my $columns = $self->{st}->{sth}->{NAME};
+
+ return DBIx::XHTML_Table->new(
+ scalar $self->arrays,
+ $columns,
+ $attr
+ );
+}
+
+sub html {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ my $self = shift;
+ my $attr = ref $_[0] ? $_[0] : { @_ };
+ return $self->xto($attr)->output($attr);
+}
+
+sub text {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ my ($self, $type) = @_;
+ my $text_table = defined $type && length $type
+ ? 0
+ : eval { require Text::Table; $type = 'table'; 1 };
+ $type ||= 'neat';
+ if ($type eq 'box' or $type eq 'table') {
+ my $box = $type eq 'box';
+ $text_table or require Text::Table;
+ my @columns = map +{ title => $_, align_title => 'center' },
+ @{ $self->{st}->{sth}->{NAME} };
+ my $c = 0;
+ splice @columns, $_ + $c++, 0, \' | ' for 1 .. $#columns;
+ my $table = Text::Table->new(
+ ($box ? \'| ' : ()),
+ @columns,
+ ($box ? \' |' : ())
+ );
+ $table->load($self->arrays);
+ my $rule = $table->rule(qw/- +/);
+ return join '',
+ ($box ? $rule : ()),
+ $table->title, $rule, $table->body,
+ ($box ? $rule : ());
+ }
+ Carp::carp("Unknown type '$type'; using 'neat'") if $type ne 'neat';
+ return join '', map DBI::neat_list($_) . "\n", $self->arrays;
+}
+
+sub finish {
+ $_[0]->_die if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ my ($self) = @_;
+ $self->_die(
+ sprintf($err_cause, "$self->finish", (caller)[1, 2])
+ );
+}
+
+sub DESTROY {
+ return if ref $_[0]->{st} eq 'DBIx::Simple::DeadObject';
+ my ($self) = @_;
+ $self->_die(
+ sprintf($err_cause, "$self->DESTROY", (caller)[1, 2])
+ );
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBIx::Simple - Easy-to-use OO interface to DBI
+
+=head1 SYNOPSIS
+
+=head2 DBIx::Simple
+
+ $db = DBIx::Simple->connect(...) # or ->new
+
+ $db->keep_statements = 16
+ $db->lc_columns = 1
+ $db->result_class = 'DBIx::Simple::Result';
+
+ $db->begin_work $db->commit
+ $db->rollback $db->disconnect
+ $db->func(...) $db->last_insert_id
+
+ $result = $db->query(...)
+
+=head2 DBIx::SImple + SQL::Interp
+
+ $result = $db->iquery(...)
+
+=head2 DBIx::Simple + SQL::Abstract
+
+ $db->abstract = SQL::Abstract->new(...)
+
+ $result = $db->select(...)
+ $result = $db->insert(...)
+ $result = $db->update(...)
+ $result = $db->delete(...)
+
+=head2 DBIx::Simple::Result
+
+ @columns = $result->columns
+
+ $result->into($foo, $bar, $baz)
+ $row = $result->fetch
+
+ @row = $result->list @rows = $result->flat
+ $row = $result->array @rows = $result->arrays
+ $row = $result->hash @rows = $result->hashes
+
+ %map = $result->map_arrays(...)
+ %map = $result->map_hashes(...)
+ %map = $result->map
+
+ $rows = $result->rows
+
+ $dump = $result->text
+
+ $result->finish
+
+=head2 DBIx::Simple::Result + DBIx::XHTML_Table
+
+ $html = $result->html(...)
+
+ $table_object = $result->xto(...)
+
+=head2 Examples
+
+Please read L<DBIx::Simple::Examples> for code examples.
+
+=head1 DESCRIPTION
+
+DBIx::Simple provides a simplified interface to DBI, Perl's powerful database
+module.
+
+This module is aimed at rapid development and easy maintenance. Query
+preparation and execution are combined in a single method, the result object
+(which is a wrapper around the statement handle) provides easy row-by-row and
+slurping methods.
+
+The C<query> method returns either a result object, or a dummy object. The
+dummy object returns undef (or an empty list) for all methods and when used in
+boolean context, is false. The dummy object lets you postpone (or skip) error
+checking, but it also makes immediate error checking simply C<<
+$db->query(...) or die $db->error >>.
+
+=head2 DBIx::Simple methods
+
+=over 4
+
+=item C<< DBIx::Simple->connect($dbh) >>
+
+=item C<< DBIx::Simple->connect($dsn, $user, $pass, \%options) >>
+
+=item C<< DBIx::Simple->new($dbh) >>
+
+=item C<< DBIx::Simple->new($dsn, $user, $pass, \%options) >>
+
+The C<connect> or C<new> class method takes either an existing DBI object
+($dbh), or a list of arguments to pass to C<< DBI->connect >>. See L<DBI> for a
+detailed description.
+
+You cannot use this method to clone a DBIx::Simple object: the $dbh passed
+should be a DBI::db object, not a DBIx::Simple object.
+
+This method is the constructor and returns a DBIx::Simple object on success. On
+failure, it returns undef.
+
+=item C<lc_columns = $bool>
+
+When true at time of query execution, makes C<columns>, C<hash>, C<hashes>, and
+C<map_hashes> use lower cased column names. C<lc_columns> is true by default.
+
+=item C<keep_statements = $integer>
+
+Sets the number of statement objects that DBIx::Simple can keep for reuse. This
+can dramatically speed up repeated queries (like when used in a loop).
+C<keep_statements> is 16 by default.
+
+A query is only reused if it equals a previously used one literally. This means
+that to benefit from this caching mechanism, you must use placeholders and
+never interpolate variables yourself.
+
+ # Wrong:
+ $db->query("INSERT INTO foo VALUES ('$foo', '$bar', '$baz')");
+ $db->query("SELECT FROM foo WHERE foo = '$foo' OR bar = '$bar'");
+
+ # Right:
+ $db->query('INSERT INTO foo VALUES (??)', $foo, $bar, $baz);
+ $db->query('SELECT FROM foo WHERE foo = ? OR bar = ?', $foo, $baz);
+
+Of course, automatic value escaping is a much better reason for using
+placeholders.
+
+=item C<result_class = $string>
+
+Class to use for result objects. Defaults to DBIx::Simple::Result. A
+constructor is not used.
+
+=item C<error>
+
+Returns the error string of the last DBI method. See the discussion of "C<err>"
+and "C<errstr>" in L<DBI>.
+
+=item C<query($query, @values)>
+
+The C<query> method prepares and executes the query and returns a result object.
+
+If the string C<(??)> is present in the query, it is replaced with a list of as
+many question marks as @values.
+
+The database drivers substitute placeholders (question marks that do not appear
+in quoted literals) in the query with the given @values, after them escaping
+them. You should always use placeholders, and never use raw user input in
+database queries.
+
+On success, returns a DBIx::Simple::Result object.
+
+On failure, returns a DBIx::Simple::Dummy object.
+
+=item C<iquery>
+
+Uses SQL::Interp to interpolate values into a query, and uses the resulting
+generated query and bind arguments with C<query>.
+
+See SQL::Interp's documentation for usage information.
+
+I<Requires that Mark Stosberg's SQL::Interp module be installed. It is
+available from CPAN. SQL::Interp is a fork from David Manura's
+SQL::Interpolate.>
+
+=item C<select>, C<insert>, C<update>, C<delete>
+
+Calls the respective method on C<abstract>, and uses the resulting generated
+query and bind arguments with C<query>.
+
+See SQL::Abstract's documentation for usage information. You can override the
+object by assigning to the C<abstract> property.
+
+Obviously, calling C<query> directly is faster for the computer and using these
+abstracting methods is faster for the programmer.
+
+=item C<< abstract = SQL::Abstract->new(...) >>
+
+Sets the object to use with the C<select>, C<insert>, C<update> and C<delete>
+methods. On first access, will create one with SQL::Abstract's default options.
+
+I<Requires that Nathan Wiger's SQL::Abstract module be installed. It is
+available from CPAN.>
+
+In theory, you can assign any object to this property, as long as that object
+has these four methods, and they return a list suitable for use with the
+C<query> method.
+
+=item C<begin_work>, C<begin>, C<commit>, C<rollback>
+
+These transaction related methods call the DBI respective methods and
+Do What You Mean. See L<DBI> for details.
+
+C<begin> is an alias for C<begin_work>.
+
+=item C<func(...)>
+
+This calls the C<func> method of DBI. See L<DBI> for details.
+
+=item C<last_insert_id(...)>
+
+This calls the C<last_insert_id> method of DBI. See L<DBI> for details. Note
+that this feature requires DBI 1.38 or newer.
+
+=item C<dbh>
+
+Exposes the internal database handle. Use this only if you know what you are
+doing. Keeping a reference or doing queries can interfere with DBIx::Simple's
+garbage collection and error reporting.
+
+=item C<disconnect>
+
+Destroys (finishes) active statements and disconnects. Whenever the database
+object is destroyed, this happens automatically if DBIx::Simple handled the
+connection (i.e. you didn't use an existing DBI handle). After disconnecting,
+you can no longer use the database object or any of its result objects.
+
+=back
+
+=head2 DBIx::Simple::Dummy
+
+The C<query> method of DBIx::Simple returns a dummy object on failure. Its
+methods all return an empty list or undef, depending on context. When used in
+boolean context, a dummy object evaluates to false.
+
+=head2 DBIx::Simple::Result methods
+
+=over 12
+
+=item C<columns>
+
+Returns a list of column names. In scalar context, returns an array reference.
+
+Column names are lower cased if C<lc_columns> was true when the query was
+executed.
+
+=item C<bind(LIST)>
+
+Binds the given LIST to the columns. The elements of LIST must be writable
+LVALUEs. In other words, use this method as:
+
+ $result->bind(my ($foo, $bar));
+ $result->fetch;
+
+Or, combined:
+
+ $result->into(my ($foo, $bar));
+
+Unlike with DBI's C<bind_columns>, the C<\> operator is not needed.
+
+Bound variables are very efficient. Binding a tied variable doesn't work.
+
+=item C<fetch>
+
+Fetches a single row and returns a reference to the array that holds the
+values. This is the same array every time.
+
+Subsequent fetches (using any method) may change the values in the variables
+passed and the returned reference's array.
+
+=item C<into(LIST)>
+
+Combines C<bind> with C<fetch>. Returns what C<fetch> returns.
+
+=item C<list>
+
+Fetches a single row and returns a list of values. In scalar context,
+returns only the last value.
+
+=item C<array>
+
+Fetches a single row and returns an array reference.
+
+=item C<hash>
+
+Fetches a single row and returns a hash reference.
+
+Keys are lower cased if C<lc_columns> was true when the query was executed.
+
+=item C<flat>
+
+Fetches all remaining rows and returns a flattened list.
+
+In scalar context, returns an array reference.
+
+=item C<arrays>
+
+Fetches all remaining rows and returns a list of array references.
+
+In scalar context, returns an array reference.
+
+=item C<hashes>
+
+Fetches all remaining rows and returns a list of hash references.
+
+In scalar context, returns an array reference.
+
+Keys are lower cased if C<lc_columns> was true when the query was executed.
+
+=item C<map_arrays($column_number)>
+
+Constructs a hash of array references keyed by the values in the chosen column.
+
+In scalar context, returns a hash reference.
+
+In list context, returns interleaved keys and values.
+
+=item C<map_hashes($column_name)>
+
+Constructs a hash of hash references keyed by the values in the chosen column.
+
+In scalar context, returns a hash reference.
+
+In list context, returns interleaved keys and values.
+
+=item C<map>
+
+Constructs a simple hash, using the two columns as key/value pairs. Should
+only be used with queries that return two columns.
+
+In scalar context, returns a hash reference.
+
+In list context, returns interleaved keys and values.
+
+=item C<rows>
+
+Returns the number of rows affected by the last row affecting command, or -1 if
+the number of rows is not known or not available.
+
+For SELECT statements, it is generally not possible to know how many rows are
+returned. MySQL does provide this information. See L<DBI> for a detailed
+explanation.
+
+=item C<xto(%attr)>
+
+Returns a DBIx::XHTML_Table object, passing the constructor a reference to
+C<%attr>.
+
+I<Requires that Jeffrey Hayes Anderson's DBIx::XHTML_Table module be installed.
+It is available from CPAN.>
+
+In general, using the C<html> method (described below) is much easier. C<xto>
+is available in case you need more flexibility.
+
+This method ignores the C<lc_columns> property.
+
+=item C<html(%attr)>
+
+Returns an (X)HTML formatted table, using the DBIx::XHTML_Table module. Passes
+a reference to C<%attr> to both the constructor and the C<output> method.
+
+I<Requires that Jeffrey Hayes Anderson's DBIx::XHTML_Table module be installed.
+It is available from CPAN.>
+
+This method is a shortcut method. That means that
+
+ $result->html
+
+ $result->html(
+ tr => { bgcolor => [ 'silver', 'white' ] },
+ no_ucfirst => 1
+ )
+
+do the same as:
+
+ $result->xto->output
+
+ $result->xto(
+ tr => { bgcolor => [ 'silver', 'white' ] }
+ )->output(
+ no_ucfirst => 1
+ );
+
+=item C<text($type)>
+
+Returns a string with a simple text representation of the data. C<$type>
+can be any of: C<neat>, C<table>, C<box>. It defaults to C<table> if
+Text::Table is installed, to C<neat> if it is.
+
+I<C<table> and C<box> require that Anno Siegel's Text::Table module be
+installed. It is available from CPAN.>
+
+
+=item C<attr(...)>
+
+Returns a copy of an sth attribute (property). See L<DBI/"Statement Handle
+Attributes"> for details.
+
+=item C<func(...)>
+
+This calls the C<func> method of DBI. See L<DBI> for details.
+
+=item C<finish>
+
+Finishes the statement. After finishing a statement, it can no longer be used.
+When the result object is destroyed, its statement handle is automatically
+finished and destroyed. There should be no reason to call this method
+explicitly; just let the result object go out of scope.
+
+=back
+
+=head1 MISCELLANEOUS
+
+The mapping methods do not check whether the keys are unique. Rows that are
+fetched later overwrite earlier ones.
+
+PrintError is disabled by default. If you enable it, beware that it will report
+line numbers in DBIx/Simple.pm.
+
+=head1 LICENSE
+
+There is no license. This software was released into the public domain. Do with
+it what you want, but on your own risk. The author disclaims any
+responsibility.
+
+=head1 AUTHOR
+
+Juerd Waalboer <juerd@cpan.org> <http://juerd.nl/>
+
+=head1 SEE ALSO
+
+L<perl>, L<perlref>
+
+L<DBI>, L<DBIx::Simple::Examples>, L<SQL::Abstract>, L<DBIx::XHTML_Table>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DBIx/Simple/Comparison.pod b/Master/tlpkg/tlperl.straw/lib/DBIx/Simple/Comparison.pod
new file mode 100755
index 00000000000..062bfe99c37
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBIx/Simple/Comparison.pod
@@ -0,0 +1,131 @@
+=head1 NAME
+
+DBIx::Simple::Comparison - DBIx::Simple in DBI jargon
+
+=head1 DESCRIPTION
+
+This is just a simple and B<inaccurate> overview of what DBI things the
+DBIx::Simple things represent, or the other way around.
+
+This document can be useful to find the foo equivalent of bar.
+
+C<?> means that DBI doesn't have an equivalent or that I couldn't find one.
+
+C<=> means that DBIx::Simple provides a direct wrapper to the DBI function.
+
+C<~> means that DBIx::Simple's method does more or less the same, but usually
+in a more high level way: context sensitive, combining things, automatically
+taking care of something.
+
+Note that DBIx::Simple is a wrapper around DBI. It is not "better" than DBI. In
+fact, DBIx::Simple cannot work without DBI.
+
+Using DBI directly is always faster than using DBIx::Simple's equivalents. (For
+the computer, that is. For you, DBIx::Simple is supposed to be faster.)
+
+=head2 Classes, common names
+
+ use DBI ~ use DBIx::Simple
+
+ $DBI::errstr = DBIx::Simple->error
+
+ DBI::db ~ DBIx::Simple
+ $dbh ~ $db
+ $dbh->errstr = $db->error
+
+ connect ~ connect
+ connect ~ new
+
+ DBI::st ~ DBIx::Simple::Result
+ <undef> ~ DBIx::Simple::Dummy
+ $sth ~ $result
+
+=head2 Queries
+
+DBI
+
+ my $sth = $dbh->prepare_cached($query);
+ $sth->execute(@values);
+
+~ DBIx::Simple
+
+ my $result = $db->query($query, $values);
+
+=head2 Results
+
+ DBI DBIx::Simple
+
+ bind_columns ~ bind
+
+ fetchrow_arrayref/fetch = fetch
+ fetchrow_array ~ list
+ *1 ~ flat
+ [@{fetchrow_arrayref}] = array
+ fetchall_arrayref ~ arrays
+ fetchrow_hashref() *2*3 = hash
+ fetchall_arrayref({}) *4 ~ hashes
+
+ fetchall_hashref *2 = map_hashes
+ ? ? map_arrays
+ fetchall_hashref(1) *2 = map
+
+ $sth->{NAME_lc/NAME} = $result->columns
+
+*1 There's no fetch variant, but you can do C<< { @{
+$dbh->selectcol_arrayref('SELECT ...', { Slice => [] }) } } >>.
+
+*2 To receive the keys (column names) lowercased, use C<<
+$db->{FetchHashKeyName} = 'NAME_lc' >>. DBIx::Simple lower cases them by
+default.
+
+*3 Or supply an argument, C<'NAME_lc'>.
+
+*4 No, arrayref isn't a typo. When supplied an empty hash reference, DBI's
+fetchall_arrayref actually returns hashrefs. This DBI method does not support
+lower casing of keys, DBIx::Simple does.
+
+=head2 Direct access
+
+ DBI DBIx::Simple
+
+ $dbh = $db->dbh
+ $sth->{$foo} = $result->attr($foo)
+
+ func = func
+
+ begin_work = begin_work
+ commit = commit
+ rollback = rollback
+ last_insert_id = last_insert_id
+ rows = rows
+
+ disconnect ~ disconnect
+ finish ~ finish
+
+=head2 DBIx::Simple specific (?)
+
+ keep_statements
+ lc_columns
+ iquery (via SQL::Interp)
+ select, insert, update, delete (via SQL::Abstract)
+ abstract (via SQL::Abstract)
+ flat
+ hashes
+ map_arrays
+ map
+
+=head1 LICENSE
+
+There is no license. This software was released into the public domain. Do with
+it what you want, but on your own risk. The author disclaims any
+responsibility.
+
+=head1 AUTHOR
+
+Juerd Waalboer <juerd@cpan.org> <http://juerd.nl/>
+
+=head1 SEE ALSO
+
+L<DBI>, L<DBIx::Simple>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBIx/Simple/Examples.pod b/Master/tlpkg/tlperl.straw/lib/DBIx/Simple/Examples.pod
new file mode 100755
index 00000000000..dafe78e8d27
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBIx/Simple/Examples.pod
@@ -0,0 +1,390 @@
+=head1 NAME
+
+DBIx::Simple::Examples - Examples of how to use DBIx::Simple
+
+=head1 DESCRIPTION
+
+DBIx::Simple provides a simplified interface to DBI, Perl's powerful database
+module.
+
+=head1 EXAMPLES
+
+=head2 General
+
+ #!/usr/bin/perl -w
+ use strict;
+ use DBIx::Simple;
+
+ # Instant database with DBD::SQLite
+ my $db = DBIx::Simple->connect('dbi:SQLite:dbname=file.dat')
+ or die DBIx::Simple->error;
+
+ # Connecting to a MySQL database
+ my $db = DBIx::Simple->connect(
+ 'DBI:mysql:database=test', # DBI source specification
+ 'test', 'test', # Username and password
+ { RaiseError => 1 } # Additional options
+ );
+
+ # Using an existing database handle
+ my $db = DBIx::Simple->connect($dbh);
+
+ # Abstracted example: $db->query($query, @variables)->what_you_want;
+
+ $db->commit or die $db->error;
+
+=head2 Simple Queries
+
+ $db->query('DELETE FROM foo WHERE id = ?', $id) or die $db->error;
+
+ for (1..100) {
+ $db->query(
+ 'INSERT INTO randomvalues VALUES (?, ?)',
+ int rand(10),
+ int rand(10)
+ ) or die $db->error;
+ }
+
+ $db->query(
+ 'INSERT INTO sometable VALUES (??)',
+ $first, $second, $third, $fourth, $fifth, $sixth
+ );
+ # (??) is expanded to (?, ?, ?, ?, ?, ?) automatically
+
+=head2 Single row queries
+
+ my ($two) = $db->query('SELECT 1 + 1')->list;
+ my ($three, $four) = $db->query('SELECT 3, 2 + 2')->list;
+
+ my ($name, $email) = $db->query(
+ 'SELECT name, email FROM people WHERE email = ? LIMIT 1',
+ $mail
+ )->list;
+
+Or, more efficiently:
+
+ $db->query('SELECT 1 + 1')->into(my $two);
+ $db->query('SELECT 3, 2 + 2')->into(my ($three, $four));
+
+ $db->query(
+ 'SELECT name, email FROM people WHERE email = ? LIMIT 1',
+ $mail
+ )->into(my ($name, $email));
+
+=head2 Fetching all rows in one go
+
+=head3 One big flattened list (primarily for single column queries)
+
+ my @names = $db->query('SELECT name FROM people WHERE id > 5')->flat;
+
+=head3 Rows as array references
+
+ for my $row ($db->query('SELECT name, email FROM people')->arrays) {
+ print "Name: $row->[0], Email: $row->[1]\n";
+ }
+
+=head3 Rows as hash references
+
+ for my $row ($db->query('SELECT name, email FROM people')->hashes) {
+ print "Name: $row->{name}, Email: $row->{email}\n";
+ }
+
+=head2 Fetching one row at a time
+
+=head3 Rows into separate variables
+
+ {
+ my $result = $db->query('SELECT name, email FROM people');
+ $result->bind(my ($name, $email));
+ while ($result->fetch) {
+ print "Name: $name, Email: $email\n";
+ }
+ }
+
+or:
+
+ {
+ my $result = $db->query('SELECT name, email FROM people');
+ while ($result->into(my ($name, $email))) {
+ print "Name: $name, Email: $email\n";
+ }
+ }
+
+=head3 Rows as lists
+
+ {
+ my $result = $db->query('SELECT name, email FROM people');
+ while (my @row = $result->list) {
+ print "Name: $row[0], Email: $row[1]\n";
+ }
+ }
+
+=head3 Rows as array references
+
+ {
+ my $result = $db->query('SELECT name, email FROM people');
+ while (my $row = $result->array) {
+ print "Name: $row->[0], Email: $row->[1]\n";
+ }
+ }
+
+=head3 Rows as hash references
+
+ {
+ my $result = $db->query('SELECT name, email FROM people');
+ while (my $row = $result->hash) {
+ print "Name: $row->{name}, Email: $row->{email}\n";
+ }
+ }
+
+=head2 Building maps (also fetching all rows in one go)
+
+=head3 A hash of hashes
+
+ my $customers =
+ $db
+ -> query('SELECT id, name, location FROM people')
+ -> map_hashes('id');
+
+ # $customers = { $id => { name => $name, location => $location } }
+
+=head3 A hash of arrays
+
+ my $customers =
+ $db
+ -> query('SELECT id, name, location FROM people')
+ -> map_arrays(0);
+
+ # $customers = { $id => [ $name, $location ] }
+
+=head3 A hash of values (two-column queries)
+
+ my $names =
+ $db
+ -> query('SELECT id, name FROM people')
+ -> map;
+
+ # $names = { $id => $name }
+
+=head1 EXAMPLES WITH SQL::Interp
+
+If you have SQL::Interp installed, you can use the semi-abstracting method
+C<iquery>. This works just like C<query>, but with parts of the query
+interleaved with the bind arguments, passed as references.
+
+You should read L<SQL::Interp>. These examples are not enough to fully
+understand all the possibilities.
+
+The following examples are based on the documentation of SQL::Interp.
+
+ my $result = $db->iquery('INSERT INTO table', \%item);
+ my $result = $db->iquery('UPDATE table SET', \%item, 'WHERE y <> ', \2);
+ my $result = $db->iquery('DELETE FROM table WHERE y = ', \2);
+
+ # These two select syntax produce the same result
+ my $result = $db->iquery('SELECT * FROM table WHERE x = ', \$s, 'AND y IN', \@v);
+ my $result = $db->iquery('SELECT * FROM table WHERE', {x => $s, y => \@v});
+
+ for ($result->hashes) { ... }
+
+Use a syntax highlighting editor for good visual distinction.
+
+If you need the helper functions C<sql> and C<sql_type>, you can import them
+with C<use SQL::Interp;>
+
+=head1 EXAMPLES WITH SQL::Abstract
+
+If you have SQL::Abstract installed, you can use the abstracting methods
+C<select>, C<insert>, C<update>, C<delete>. These work like C<query>, but
+instead of a query and bind arguments, use abstracted arguments.
+
+You should read L<SQL::Abstract>. These examples are not enough to fully
+understand all the possibilities.
+
+The SQL::Abstract object is available (writable) through the C<abstract>
+property.
+
+The following examples are based on the documentation of SQL::Abstract.
+
+=head2 Overview
+
+If you don't like the defaults, just assign a new object:
+
+ $db->abstract = SQL::Abstract->new(
+ case => 'lower',
+ cmp => 'like',
+ logic => 'and',
+ convert => 'upper'
+ );
+
+If you don't assign any object, one will be created automatically using the
+default options. The SQL::Abstract module is loaded on demand.
+
+ my $result = $db->select($table, \@fields, \%where, \@order);
+ my $result = $db->insert($table, \%fieldvals || \@values);
+ my $result = $db->update($table, \%fieldvals, \%where);
+ my $result = $db->delete($table, \%where);
+
+ for ($result->hashes) { ... }
+
+=head2 Complete examples
+
+=head3 select
+
+ my @tickets = $db->select(
+ 'tickets', '*', {
+ requestor => 'inna',
+ worker => ['nwiger', 'rcwe', 'sfz'],
+ status => { '!=', 'completed' }
+ }
+ )->hashes;
+
+=head3 insert
+
+If you already have your data as a hash, inserting becomes much easier:
+
+ $db->insert('people', \%data);
+
+Instead of:
+
+ $db->query(
+ q[
+ INSERT
+ INTO people (name, phone, address, ...)
+ VALUES (??)
+ ],
+ @data{'name', 'phone', 'address', ... }
+ );
+
+=head3 update, delete
+
+ $db->update(
+ 'tickets', {
+ worker => 'juerd',
+ status => 'completed'
+ },
+ { id => $id }
+ )
+
+ $db->delete('tickets', { id => $id });
+
+=head3 where
+
+The C<where> method is not wrapped directly, because it doesn't generate a
+query and thus doesn't really have anything to do with the database module.
+
+But using the C<abstract> property, you can still easily access it:
+
+ my $where = $db->abstract->where({ foo => $foo });
+
+=head1 EXAMPLES WITH DBIx::XHTML_Table
+
+If you have DBIx::XHTML_Table installed, you can use the result methods
+C<xto> and C<html>.
+
+You should read L<DBIx::XHTML_Table>. These examples are not enough to fully
+understand what is going on. When reading that documentation, note that you
+don't have to pass hash references to DBIx::Simple's methods. It is supported,
+though.
+
+DBIx::XHTML_Table is loaded on demand.
+
+=head2 Overview
+
+To print a simple table, all you have to do is:
+
+ print $db->query('SELECT * FROM foo')->html;
+
+Of course, anything that produces a result object can be used. The same thing
+using the abstraction method C<select> would be:
+
+ print $db->select('foo', '*')->html;
+
+A DBIx::XHTML_Table object can be generated with the C<xto> (B<X>HTML_B<T>able
+B<O>bject) method:
+
+ my $table = $db->query($query)->xto;
+
+=head2 Passing attributes
+
+DBIx::Simple sends the attributes you pass to C<html> both to the constructor
+and the output method. This allows you to specify both HTML attributes (like
+C<bgcolor>) and options for XHTML_Table (like C<no_ucfirst> and C<no_indent>)
+all at once:
+
+ print $result->html(
+ tr => { bgcolor => [ qw/silver white/ ] },
+ no_ucfirst => 1
+ );
+
+=head2 Using an XHTML_Table object
+
+Not everything can be controlled by passing attributes. For full flexibility,
+the XHTML_Table object can be used directly:
+
+ my $table = $db->query($query)->xto(
+ tr => { bgcolor => [ qw/silver white/ ] }
+ );
+
+ $table->set_group('client', 1);
+ $table->calc_totals('credit', '%.2f');
+
+ print $table->output({ no_ucfirst => 1 }); # note the {}!
+
+=head1 EXAMPLES WITH Text::Table
+
+=over 8
+
+=item C<< $result->text("neat") >>
+
+Neither neat nor pretty, but useful for debugging. Uses DBI's C<neat_list>
+method. Doesn't display column names.
+
+ '1', 'Camel', 'mammal'
+ '2', 'Llama', 'mammal'
+ '3', 'Owl', 'bird'
+ '4', 'Juerd', undef
+
+=item C<< $result->text("table") >>
+
+Displays a simple table using ASCII lines.
+
+ id | animal | type
+ ---+--------+-------
+ 1 | Camel | mammal
+ 2 | Llama | mammal
+ 3 | Owl | bird
+ 4 | Juerd |
+
+=item C<< $result->text("box") >>
+
+Displays a simple table using ASCII lines, with an outside border.
+
+ +----+--------+--------+
+ | id | animal | type |
+ +----+--------+--------+
+ | 1 | Camel | mammal |
+ | 2 | Llama | mammal |
+ | 3 | Owl | bird |
+ | 4 | Juerd | |
+ +----+--------+--------+
+
+=back
+
+For C<table> and C<box>, you need Anno Siegel's Text::Table module installed.
+
+=head1 LICENSE
+
+There is no license. This software was released into the public domain. Do with
+it what you want, but on your own risk. The author disclaims any
+responsibility.
+
+=head1 AUTHOR
+
+Juerd Waalboer <juerd@cpan.org> <http://juerd.nl/>
+
+=head1 SEE ALSO
+
+L<DBIx::Simple>, L<SQL::Abstract>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM/Deep.pm b/Master/tlpkg/tlperl.straw/lib/DBM/Deep.pm
new file mode 100755
index 00000000000..e4a21faad69
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM/Deep.pm
@@ -0,0 +1,630 @@
+package DBM::Deep;
+
+use 5.006_000;
+
+use strict;
+use warnings;
+
+our $VERSION = q(1.0013);
+
+use Data::Dumper ();
+use Fcntl qw( :flock );
+use Scalar::Util ();
+
+use DBM::Deep::Engine;
+use DBM::Deep::File;
+
+use overload
+ '""' => sub { overload::StrVal( $_[0] ) },
+ fallback => 1;
+
+use constant DEBUG => 0;
+
+##
+# Setup constants for users to pass to new()
+##
+sub TYPE_HASH () { DBM::Deep::Engine->SIG_HASH }
+sub TYPE_ARRAY () { DBM::Deep::Engine->SIG_ARRAY }
+
+# This is used in all the children of this class in their TIE<type> methods.
+sub _get_args {
+ my $proto = shift;
+
+ my $args;
+ if (scalar(@_) > 1) {
+ if ( @_ % 2 ) {
+ $proto->_throw_error( "Odd number of parameters to " . (caller(1))[2] );
+ }
+ $args = {@_};
+ }
+ elsif ( ref $_[0] ) {
+ unless ( eval { local $SIG{'__DIE__'}; %{$_[0]} || 1 } ) {
+ $proto->_throw_error( "Not a hashref in args to " . (caller(1))[2] );
+ }
+ $args = $_[0];
+ }
+ else {
+ $args = { file => shift };
+ }
+
+ return $args;
+}
+
+sub new {
+ ##
+ # Class constructor method for Perl OO interface.
+ # Calls tie() and returns blessed reference to tied hash or array,
+ # providing a hybrid OO/tie interface.
+ ##
+ my $class = shift;
+ my $args = $class->_get_args( @_ );
+
+ ##
+ # Check if we want a tied hash or array.
+ ##
+ my $self;
+ if (defined($args->{type}) && $args->{type} eq TYPE_ARRAY) {
+ $class = 'DBM::Deep::Array';
+ require DBM::Deep::Array;
+ tie @$self, $class, %$args;
+ }
+ else {
+ $class = 'DBM::Deep::Hash';
+ require DBM::Deep::Hash;
+ tie %$self, $class, %$args;
+ }
+
+ return bless $self, $class;
+}
+
+# This initializer is called from the various TIE* methods. new() calls tie(),
+# which allows for a single point of entry.
+sub _init {
+ my $class = shift;
+ my ($args) = @_;
+
+ $args->{storage} = DBM::Deep::File->new( $args )
+ unless exists $args->{storage};
+
+ # locking implicitly enables autoflush
+ if ($args->{locking}) { $args->{autoflush} = 1; }
+
+ # These are the defaults to be optionally overridden below
+ my $self = bless {
+ type => TYPE_HASH,
+ base_offset => undef,
+ staleness => undef,
+
+ storage => undef,
+ engine => undef,
+ }, $class;
+
+ $args->{engine} = DBM::Deep::Engine->new( { %{$args}, obj => $self } )
+ unless exists $args->{engine};
+
+ # Grab the parameters we want to use
+ foreach my $param ( keys %$self ) {
+ next unless exists $args->{$param};
+ $self->{$param} = $args->{$param};
+ }
+
+ eval {
+ local $SIG{'__DIE__'};
+
+ $self->lock;
+ $self->_engine->setup_fh( $self );
+ $self->_storage->set_inode;
+ $self->unlock;
+ }; if ( $@ ) {
+ my $e = $@;
+ eval { local $SIG{'__DIE__'}; $self->unlock; };
+ die $e;
+ }
+
+ return $self;
+}
+
+sub TIEHASH {
+ shift;
+ require DBM::Deep::Hash;
+ return DBM::Deep::Hash->TIEHASH( @_ );
+}
+
+sub TIEARRAY {
+ shift;
+ require DBM::Deep::Array;
+ return DBM::Deep::Array->TIEARRAY( @_ );
+}
+
+sub lock {
+ my $self = shift->_get_self;
+ return $self->_storage->lock( $self, @_ );
+}
+
+sub unlock {
+ my $self = shift->_get_self;
+ return $self->_storage->unlock( $self, @_ );
+}
+
+sub _copy_value {
+ my $self = shift->_get_self;
+ my ($spot, $value) = @_;
+
+ if ( !ref $value ) {
+ ${$spot} = $value;
+ }
+ else {
+ # This assumes hash or array only. This is a bad assumption moving forward.
+ # -RobK, 2008-05-27
+ my $r = Scalar::Util::reftype( $value );
+ my $tied;
+ if ( $r eq 'ARRAY' ) {
+ $tied = tied(@$value);
+ }
+ else {
+ $tied = tied(%$value);
+ }
+
+ if ( eval { local $SIG{__DIE__}; $tied->isa( 'DBM::Deep' ) } ) {
+ ${$spot} = $tied->_repr;
+ $tied->_copy_node( ${$spot} );
+ }
+ else {
+ if ( $r eq 'ARRAY' ) {
+ ${$spot} = [ @{$value} ];
+ }
+ else {
+ ${$spot} = { %{$value} };
+ }
+ }
+
+ my $c = Scalar::Util::blessed( $value );
+ if ( defined $c && !$c->isa( 'DBM::Deep') ) {
+ ${$spot} = bless ${$spot}, $c
+ }
+ }
+
+ return 1;
+}
+
+#sub _copy_node {
+# die "Must be implemented in a child class\n";
+#}
+#
+#sub _repr {
+# die "Must be implemented in a child class\n";
+#}
+
+sub export {
+ ##
+ # Recursively export into standard Perl hashes and arrays.
+ ##
+ my $self = shift->_get_self;
+
+ my $temp = $self->_repr;
+
+ $self->lock();
+ $self->_copy_node( $temp );
+ $self->unlock();
+
+ my $classname = $self->_engine->get_classname( $self );
+ if ( defined $classname ) {
+ bless $temp, $classname;
+ }
+
+ return $temp;
+}
+
+sub _check_legality {
+ my $self = shift;
+ my ($val) = @_;
+
+ my $r = Scalar::Util::reftype( $val );
+
+ return $r if !defined $r || '' eq $r;
+ return $r if 'HASH' eq $r;
+ return $r if 'ARRAY' eq $r;
+
+ DBM::Deep->_throw_error(
+ "Storage of references of type '$r' is not supported."
+ );
+}
+
+sub import {
+ # Perl calls import() on use -- ignore
+ return if !ref $_[0];
+
+ my $self = shift->_get_self;
+ my ($struct) = @_;
+
+ my $type = $self->_check_legality( $struct );
+ if ( !$type ) {
+ DBM::Deep->_throw_error( "Cannot import a scalar" );
+ }
+
+ if ( substr( $type, 0, 1 ) ne $self->_type ) {
+ DBM::Deep->_throw_error(
+ "Cannot import " . ('HASH' eq $type ? 'a hash' : 'an array')
+ . " into " . ('HASH' eq $type ? 'an array' : 'a hash')
+ );
+ }
+
+ my %seen;
+ my $recurse;
+ $recurse = sub {
+ my ($db, $val) = @_;
+
+ my $obj = 'HASH' eq Scalar::Util::reftype( $db ) ? tied(%$db) : tied(@$db);
+ $obj ||= $db;
+
+ my $r = $self->_check_legality( $val );
+ if ( 'HASH' eq $r ) {
+ while ( my ($k, $v) = each %$val ) {
+ my $r = $self->_check_legality( $v );
+ if ( $r ) {
+ my $temp = 'HASH' eq $r ? {} : [];
+ if ( my $c = Scalar::Util::blessed( $v ) ) {
+ bless $temp, $c;
+ }
+ $obj->put( $k, $temp );
+ $recurse->( $temp, $v );
+ }
+ else {
+ $obj->put( $k, $v );
+ }
+ }
+ }
+ elsif ( 'ARRAY' eq $r ) {
+ foreach my $k ( 0 .. $#$val ) {
+ my $v = $val->[$k];
+ my $r = $self->_check_legality( $v );
+ if ( $r ) {
+ my $temp = 'HASH' eq $r ? {} : [];
+ if ( my $c = Scalar::Util::blessed( $v ) ) {
+ bless $temp, $c;
+ }
+ $obj->put( $k, $temp );
+ $recurse->( $temp, $v );
+ }
+ else {
+ $obj->put( $k, $v );
+ }
+ }
+ }
+ };
+ $recurse->( $self, $struct );
+
+ return 1;
+}
+
+#XXX Need to keep track of who has a fh to this file in order to
+#XXX close them all prior to optimize on Win32/cygwin
+sub optimize {
+ ##
+ # Rebuild entire database into new file, then move
+ # it back on top of original.
+ ##
+ my $self = shift->_get_self;
+
+#XXX Need to create a new test for this
+# if ($self->_storage->{links} > 1) {
+# $self->_throw_error("Cannot optimize: reference count is greater than 1");
+# }
+
+ #XXX Do we have to lock the tempfile?
+
+ #XXX Should we use tempfile() here instead of a hard-coded name?
+ my $temp_filename = $self->_storage->{file} . '.tmp';
+ my $db_temp = DBM::Deep->new(
+ file => $temp_filename,
+ type => $self->_type,
+
+ # Bring over all the parameters that we need to bring over
+ ( map { $_ => $self->_engine->$_ } qw(
+ byte_size max_buckets data_sector_size num_txns
+ )),
+ );
+
+ $self->lock();
+ $self->_engine->clear_cache;
+ $self->_copy_node( $db_temp );
+ $db_temp->_storage->close;
+ undef $db_temp;
+
+ ##
+ # Attempt to copy user, group and permissions over to new file
+ ##
+ $self->_storage->copy_stats( $temp_filename );
+
+ # q.v. perlport for more information on this variable
+ if ( $^O eq 'MSWin32' || $^O eq 'cygwin' ) {
+ ##
+ # Potential race condition when optmizing on Win32 with locking.
+ # The Windows filesystem requires that the filehandle be closed
+ # before it is overwritten with rename(). This could be redone
+ # with a soft copy.
+ ##
+ $self->unlock();
+ $self->_storage->close;
+ }
+
+ if (!rename $temp_filename, $self->_storage->{file}) {
+ unlink $temp_filename;
+ $self->unlock();
+ $self->_throw_error("Optimize failed: Cannot copy temp file over original: $!");
+ }
+
+ $self->unlock();
+ $self->_storage->close;
+
+ $self->_storage->open;
+ $self->lock();
+ $self->_engine->setup_fh( $self );
+ $self->unlock();
+
+ return 1;
+}
+
+sub clone {
+ ##
+ # Make copy of object and return
+ ##
+ my $self = shift->_get_self;
+
+ return DBM::Deep->new(
+ type => $self->_type,
+ base_offset => $self->_base_offset,
+ staleness => $self->_staleness,
+ storage => $self->_storage,
+ engine => $self->_engine,
+ );
+}
+
+#XXX Migrate this to the engine, where it really belongs and go through some
+# API - stop poking in the innards of someone else..
+{
+ my %is_legal_filter = map {
+ $_ => ~~1,
+ } qw(
+ store_key store_value
+ fetch_key fetch_value
+ );
+
+ sub set_filter {
+ my $self = shift->_get_self;
+ my $type = lc shift;
+ my $func = shift;
+
+ if ( $is_legal_filter{$type} ) {
+ $self->_storage->{"filter_$type"} = $func;
+ return 1;
+ }
+
+ return;
+ }
+
+ sub filter_store_key { $_[0]->set_filter( store_key => $_[1] ); }
+ sub filter_store_value { $_[0]->set_filter( store_value => $_[1] ); }
+ sub filter_fetch_key { $_[0]->set_filter( fetch_key => $_[1] ); }
+ sub filter_fetch_value { $_[0]->set_filter( fetch_value => $_[1] ); }
+}
+
+sub begin_work {
+ my $self = shift->_get_self;
+ return $self->_engine->begin_work( $self, @_ );
+}
+
+sub rollback {
+ my $self = shift->_get_self;
+ return $self->_engine->rollback( $self, @_ );
+}
+
+sub commit {
+ my $self = shift->_get_self;
+ return $self->_engine->commit( $self, @_ );
+}
+
+##
+# Accessor methods
+##
+
+sub _engine {
+ my $self = $_[0]->_get_self;
+ return $self->{engine};
+}
+
+sub _storage {
+ my $self = $_[0]->_get_self;
+ return $self->{storage};
+}
+
+sub _type {
+ my $self = $_[0]->_get_self;
+ return $self->{type};
+}
+
+sub _base_offset {
+ my $self = $_[0]->_get_self;
+ return $self->{base_offset};
+}
+
+sub _staleness {
+ my $self = $_[0]->_get_self;
+ return $self->{staleness};
+}
+
+##
+# Utility methods
+##
+
+sub _throw_error {
+ my $n = 0;
+ while( 1 ) {
+ my @caller = caller( ++$n );
+ next if $caller[0] =~ m/^DBM::Deep/;
+
+ die "DBM::Deep: $_[1] at $0 line $caller[2]\n";
+ }
+}
+
+sub STORE {
+ ##
+ # Store single hash key/value or array element in database.
+ ##
+ my $self = shift->_get_self;
+ my ($key, $value) = @_;
+ warn "STORE($self, $key, $value)\n" if DEBUG;
+
+ unless ( $self->_storage->is_writable ) {
+ $self->_throw_error( 'Cannot write to a readonly filehandle' );
+ }
+
+ ##
+ # Request exclusive lock for writing
+ ##
+ $self->lock( LOCK_EX );
+
+ # User may be storing a complex value, in which case we do not want it run
+ # through the filtering system.
+ if ( !ref($value) && $self->_storage->{filter_store_value} ) {
+ $value = $self->_storage->{filter_store_value}->( $value );
+ }
+
+ $self->_engine->write_value( $self, $key, $value);
+
+ $self->unlock();
+
+ return 1;
+}
+
+sub FETCH {
+ ##
+ # Fetch single value or element given plain key or array index
+ ##
+ my $self = shift->_get_self;
+ my ($key) = @_;
+ warn "FETCH($self,$key)\n" if DEBUG;
+
+ ##
+ # Request shared lock for reading
+ ##
+ $self->lock( LOCK_SH );
+
+ my $result = $self->_engine->read_value( $self, $key);
+
+ $self->unlock();
+
+ # Filters only apply to scalar values, so the ref check is making
+ # sure the fetched bucket is a scalar, not a child hash or array.
+ return ($result && !ref($result) && $self->_storage->{filter_fetch_value})
+ ? $self->_storage->{filter_fetch_value}->($result)
+ : $result;
+}
+
+sub DELETE {
+ ##
+ # Delete single key/value pair or element given plain key or array index
+ ##
+ my $self = shift->_get_self;
+ my ($key) = @_;
+ warn "DELETE($self,$key)\n" if DEBUG;
+
+ unless ( $self->_storage->is_writable ) {
+ $self->_throw_error( 'Cannot write to a readonly filehandle' );
+ }
+
+ ##
+ # Request exclusive lock for writing
+ ##
+ $self->lock( LOCK_EX );
+
+ ##
+ # Delete bucket
+ ##
+ my $value = $self->_engine->delete_key( $self, $key);
+
+ if (defined $value && !ref($value) && $self->_storage->{filter_fetch_value}) {
+ $value = $self->_storage->{filter_fetch_value}->($value);
+ }
+
+ $self->unlock();
+
+ return $value;
+}
+
+sub EXISTS {
+ ##
+ # Check if a single key or element exists given plain key or array index
+ ##
+ my $self = shift->_get_self;
+ my ($key) = @_;
+ warn "EXISTS($self,$key)\n" if DEBUG;
+
+ ##
+ # Request shared lock for reading
+ ##
+ $self->lock( LOCK_SH );
+
+ my $result = $self->_engine->key_exists( $self, $key );
+
+ $self->unlock();
+
+ return $result;
+}
+
+sub CLEAR {
+ ##
+ # Clear all keys from hash, or all elements from array.
+ ##
+ my $self = shift->_get_self;
+ warn "CLEAR($self)\n" if DEBUG;
+
+ unless ( $self->_storage->is_writable ) {
+ $self->_throw_error( 'Cannot write to a readonly filehandle' );
+ }
+
+ ##
+ # Request exclusive lock for writing
+ ##
+ $self->lock( LOCK_EX );
+
+ #XXX Rewrite this dreck to do it in the engine as a tight loop vs.
+ # iterating over keys - such a WASTE - is this required for transactional
+ # clearning?! Surely that can be detected in the engine ...
+ if ( $self->_type eq TYPE_HASH ) {
+ my $key = $self->first_key;
+ while ( $key ) {
+ # Retrieve the key before deleting because we depend on next_key
+ my $next_key = $self->next_key( $key );
+ $self->_engine->delete_key( $self, $key, $key );
+ $key = $next_key;
+ }
+ }
+ else {
+ my $size = $self->FETCHSIZE;
+ for my $key ( 0 .. $size - 1 ) {
+ $self->_engine->delete_key( $self, $key, $key );
+ }
+ $self->STORESIZE( 0 );
+ }
+
+ $self->unlock();
+
+ return 1;
+}
+
+##
+# Public method aliases
+##
+sub put { (shift)->STORE( @_ ) }
+sub store { (shift)->STORE( @_ ) }
+sub get { (shift)->FETCH( @_ ) }
+sub fetch { (shift)->FETCH( @_ ) }
+sub delete { (shift)->DELETE( @_ ) }
+sub exists { (shift)->EXISTS( @_ ) }
+sub clear { (shift)->CLEAR( @_ ) }
+
+sub _dump_file {shift->_get_self->_engine->_dump_file;}
+
+1;
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM/Deep.pod b/Master/tlpkg/tlperl.straw/lib/DBM/Deep.pod
new file mode 100755
index 00000000000..50aea5fd438
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM/Deep.pod
@@ -0,0 +1,1096 @@
+=head1 NAME
+
+DBM::Deep - A pure perl multi-level hash/array DBM that supports transactions
+
+=head1 SYNOPSIS
+
+ use DBM::Deep;
+ my $db = DBM::Deep->new( "foo.db" );
+
+ $db->{key} = 'value';
+ print $db->{key};
+
+ $db->put('key' => 'value');
+ print $db->get('key');
+
+ # true multi-level support
+ $db->{my_complex} = [
+ 'hello', { perl => 'rules' },
+ 42, 99,
+ ];
+
+ $db->begin_work;
+
+ # Do stuff here
+
+ $db->rollback;
+ $db->commit;
+
+ tie my %db, 'DBM::Deep', 'foo.db';
+ $db{key} = 'value';
+ print $db{key};
+
+ tied(%db)->put('key' => 'value');
+ print tied(%db)->get('key');
+
+=head1 DESCRIPTION
+
+A unique flat-file database module, written in pure perl. True multi-level
+hash/array support (unlike MLDBM, which is faked), hybrid OO / tie()
+interface, cross-platform FTPable files, ACID transactions, and is quite fast.
+Can handle millions of keys and unlimited levels without significant
+slow-down. Written from the ground-up in pure perl -- this is NOT a wrapper
+around a C-based DBM. Out-of-the-box compatibility with Unix, Mac OS X and
+Windows.
+
+=head1 VERSION DIFFERENCES
+
+B<NOTE>: 1.0000 has significant file format differences from prior versions.
+THere is a backwards-compatibility layer at C<utils/upgrade_db.pl>. Files
+created by 1.0000 or higher are B<NOT> compatible with scripts using prior
+versions.
+
+=head1 SETUP
+
+Construction can be done OO-style (which is the recommended way), or using
+Perl's tie() function. Both are examined here.
+
+=head2 OO Construction
+
+The recommended way to construct a DBM::Deep object is to use the new()
+method, which gets you a blessed I<and> tied hash (or array) reference.
+
+ my $db = DBM::Deep->new( "foo.db" );
+
+This opens a new database handle, mapped to the file "foo.db". If this
+file does not exist, it will automatically be created. DB files are
+opened in "r+" (read/write) mode, and the type of object returned is a
+hash, unless otherwise specified (see L<OPTIONS> below).
+
+You can pass a number of options to the constructor to specify things like
+locking, autoflush, etc. This is done by passing an inline hash (or hashref):
+
+ my $db = DBM::Deep->new(
+ file => "foo.db",
+ locking => 1,
+ autoflush => 1
+ );
+
+Notice that the filename is now specified I<inside> the hash with
+the "file" parameter, as opposed to being the sole argument to the
+constructor. This is required if any options are specified.
+See L<OPTIONS> below for the complete list.
+
+You can also start with an array instead of a hash. For this, you must
+specify the C<type> parameter:
+
+ my $db = DBM::Deep->new(
+ file => "foo.db",
+ type => DBM::Deep->TYPE_ARRAY
+ );
+
+B<Note:> Specifing the C<type> parameter only takes effect when beginning
+a new DB file. If you create a DBM::Deep object with an existing file, the
+C<type> will be loaded from the file header, and an error will be thrown if
+the wrong type is passed in.
+
+=head2 Tie Construction
+
+Alternately, you can create a DBM::Deep handle by using Perl's built-in
+tie() function. The object returned from tie() can be used to call methods,
+such as lock() and unlock(). (That object can be retrieved from the tied
+variable at any time using tied() - please see L<perltie> for more info.
+
+ my %hash;
+ my $db = tie %hash, "DBM::Deep", "foo.db";
+
+ my @array;
+ my $db = tie @array, "DBM::Deep", "bar.db";
+
+As with the OO constructor, you can replace the DB filename parameter with
+a hash containing one or more options (see L<OPTIONS> just below for the
+complete list).
+
+ tie %hash, "DBM::Deep", {
+ file => "foo.db",
+ locking => 1,
+ autoflush => 1
+ };
+
+=head2 Options
+
+There are a number of options that can be passed in when constructing your
+DBM::Deep objects. These apply to both the OO- and tie- based approaches.
+
+=over
+
+=item * file
+
+Filename of the DB file to link the handle to. You can pass a full absolute
+filesystem path, partial path, or a plain filename if the file is in the
+current working directory. This is a required parameter (though q.v. fh).
+
+=item * fh
+
+If you want, you can pass in the fh instead of the file. This is most useful for doing
+something like:
+
+ my $db = DBM::Deep->new( { fh => \*DATA } );
+
+You are responsible for making sure that the fh has been opened appropriately for your
+needs. If you open it read-only and attempt to write, an exception will be thrown. If you
+open it write-only or append-only, an exception will be thrown immediately as DBM::Deep
+needs to read from the fh.
+
+=item * file_offset
+
+This is the offset within the file that the DBM::Deep db starts. Most of the time, you will
+not need to set this. However, it's there if you want it.
+
+If you pass in fh and do not set this, it will be set appropriately.
+
+=item * type
+
+This parameter specifies what type of object to create, a hash or array. Use
+one of these two constants:
+
+=over 4
+
+=item * C<DBM::Deep-E<gt>TYPE_HASH>
+
+=item * C<DBM::Deep-E<gt>TYPE_ARRAY>.
+
+=back
+
+This only takes effect when beginning a new file. This is an optional
+parameter, and defaults to C<DBM::Deep-E<gt>TYPE_HASH>.
+
+=item * locking
+
+Specifies whether locking is to be enabled. DBM::Deep uses Perl's flock()
+function to lock the database in exclusive mode for writes, and shared mode
+for reads. Pass any true value to enable. This affects the base DB handle
+I<and any child hashes or arrays> that use the same DB file. This is an
+optional parameter, and defaults to 1 (enabled). See L<LOCKING> below for
+more.
+
+=item * autoflush
+
+Specifies whether autoflush is to be enabled on the underlying filehandle.
+This obviously slows down write operations, but is required if you may have
+multiple processes accessing the same DB file (also consider enable I<locking>).
+Pass any true value to enable. This is an optional parameter, and defaults to 1
+(enabled).
+
+=item * filter_*
+
+See L</FILTERS> below.
+
+=back
+
+The following parameters may be specified in the constructor the first time the
+datafile is created. However, they will be stored in the header of the file and
+cannot be overridden by subsequent openings of the file - the values will be set
+from the values stored in the datafile's header.
+
+=over 4
+
+=item * num_txns
+
+This is the number of transactions that can be running at one time. The
+default is one - the HEAD. The minimum is one and the maximum is 255. The more
+transactions, the larger and quicker the datafile grows.
+
+See L</TRANSACTIONS> below.
+
+=item * max_buckets
+
+This is the number of entries that can be added before a reindexing. The larger
+this number is made, the larger a file gets, but the better performance you will
+have. The default and minimum number this can be is 16. The maximum is 256, but
+more than 64 isn't recommended.
+
+=item * data_sector_size
+
+This is the size in bytes of a given data sector. Data sectors will chain, so
+a value of any size can be stored. However, chaining is expensive in terms of
+time. Setting this value to something close to the expected common length of
+your scalars will improve your performance. If it is too small, your file will
+have a lot of chaining. If it is too large, your file will have a lot of dead
+space in it.
+
+The default for this is 64 bytes. The minimum value is 32 and the maximum is
+256 bytes.
+
+B<Note:> There are between 6 and 10 bytes taken up in each data sector for
+bookkeeping. (It's 4 + the number of bytes in your L</pack_size>.) This is
+included within the data_sector_size, thus the effective value is 6-10 bytes
+less than what you specified.
+
+=item * pack_size
+
+This is the size of the file pointer used throughout the file. The valid values
+are:
+
+=over 4
+
+=item * small
+
+This uses 2-byte offsets, allowing for a maximum file size of 65 KB.
+
+=item * medium (default)
+
+This uses 4-byte offsets, allowing for a maximum file size of 4 GB.
+
+=item * large
+
+This uses 8-byte offsets, allowing for a maximum file size of 16 XB
+(exabytes). This can only be enabled if your Perl is compiled for 64-bit.
+
+=back
+
+See L</LARGEFILE SUPPORT> for more information.
+
+=back
+
+=head1 TIE INTERFACE
+
+With DBM::Deep you can access your databases using Perl's standard hash/array
+syntax. Because all DBM::Deep objects are I<tied> to hashes or arrays, you can
+treat them as such. DBM::Deep will intercept all reads/writes and direct them
+to the right place -- the DB file. This has nothing to do with the
+L<TIE CONSTRUCTION> section above. This simply tells you how to use DBM::Deep
+using regular hashes and arrays, rather than calling functions like C<get()>
+and C<put()> (although those work too). It is entirely up to you how to want
+to access your databases.
+
+=head2 Hashes
+
+You can treat any DBM::Deep object like a normal Perl hash reference. Add keys,
+or even nested hashes (or arrays) using standard Perl syntax:
+
+ my $db = DBM::Deep->new( "foo.db" );
+
+ $db->{mykey} = "myvalue";
+ $db->{myhash} = {};
+ $db->{myhash}->{subkey} = "subvalue";
+
+ print $db->{myhash}->{subkey} . "\n";
+
+You can even step through hash keys using the normal Perl C<keys()> function:
+
+ foreach my $key (keys %$db) {
+ print "$key: " . $db->{$key} . "\n";
+ }
+
+Remember that Perl's C<keys()> function extracts I<every> key from the hash and
+pushes them onto an array, all before the loop even begins. If you have an
+extremely large hash, this may exhaust Perl's memory. Instead, consider using
+Perl's C<each()> function, which pulls keys/values one at a time, using very
+little memory:
+
+ while (my ($key, $value) = each %$db) {
+ print "$key: $value\n";
+ }
+
+Please note that when using C<each()>, you should always pass a direct
+hash reference, not a lookup. Meaning, you should B<never> do this:
+
+ # NEVER DO THIS
+ while (my ($key, $value) = each %{$db->{foo}}) { # BAD
+
+This causes an infinite loop, because for each iteration, Perl is calling
+FETCH() on the $db handle, resulting in a "new" hash for foo every time, so
+it effectively keeps returning the first key over and over again. Instead,
+assign a temporary variable to C<$db->{foo}>, then pass that to each().
+
+=head2 Arrays
+
+As with hashes, you can treat any DBM::Deep object like a normal Perl array
+reference. This includes inserting, removing and manipulating elements,
+and the C<push()>, C<pop()>, C<shift()>, C<unshift()> and C<splice()> functions.
+The object must have first been created using type C<DBM::Deep-E<gt>TYPE_ARRAY>,
+or simply be a nested array reference inside a hash. Example:
+
+ my $db = DBM::Deep->new(
+ file => "foo-array.db",
+ type => DBM::Deep->TYPE_ARRAY
+ );
+
+ $db->[0] = "foo";
+ push @$db, "bar", "baz";
+ unshift @$db, "bah";
+
+ my $last_elem = pop @$db; # baz
+ my $first_elem = shift @$db; # bah
+ my $second_elem = $db->[1]; # bar
+
+ my $num_elements = scalar @$db;
+
+=head1 OO INTERFACE
+
+In addition to the I<tie()> interface, you can also use a standard OO interface
+to manipulate all aspects of DBM::Deep databases. Each type of object (hash or
+array) has its own methods, but both types share the following common methods:
+C<put()>, C<get()>, C<exists()>, C<delete()> and C<clear()>. C<fetch()> and
+C<store(> are aliases to C<put()> and C<get()>, respectively.
+
+=over
+
+=item * new() / clone()
+
+These are the constructor and copy-functions.
+
+=item * put() / store()
+
+Stores a new hash key/value pair, or sets an array element value. Takes two
+arguments, the hash key or array index, and the new value. The value can be
+a scalar, hash ref or array ref. Returns true on success, false on failure.
+
+ $db->put("foo", "bar"); # for hashes
+ $db->put(1, "bar"); # for arrays
+
+=item * get() / fetch()
+
+Fetches the value of a hash key or array element. Takes one argument: the hash
+key or array index. Returns a scalar, hash ref or array ref, depending on the
+data type stored.
+
+ my $value = $db->get("foo"); # for hashes
+ my $value = $db->get(1); # for arrays
+
+=item * exists()
+
+Checks if a hash key or array index exists. Takes one argument: the hash key
+or array index. Returns true if it exists, false if not.
+
+ if ($db->exists("foo")) { print "yay!\n"; } # for hashes
+ if ($db->exists(1)) { print "yay!\n"; } # for arrays
+
+=item * delete()
+
+Deletes one hash key/value pair or array element. Takes one argument: the hash
+key or array index. Returns true on success, false if not found. For arrays,
+the remaining elements located after the deleted element are NOT moved over.
+The deleted element is essentially just undefined, which is exactly how Perl's
+internal arrays work.
+
+ $db->delete("foo"); # for hashes
+ $db->delete(1); # for arrays
+
+=item * clear()
+
+Deletes B<all> hash keys or array elements. Takes no arguments. No return
+value.
+
+ $db->clear(); # hashes or arrays
+
+=item * lock() / unlock()
+
+q.v. L</LOCKING> for more info.
+
+=item * optimize()
+
+This will compress the datafile so that it takes up as little space as possible.
+There is a freespace manager so that when space is freed up, it is used before
+extending the size of the datafile. But, that freespace just sits in the datafile
+unless C<optimize()> is called.
+
+=item * import()
+
+Unlike simple assignment, C<import()> does not tie the right-hand side. Instead,
+a copy of your data is put into the DB. C<import()> takes either an arrayref (if
+your DB is an array) or a hashref (if your DB is a hash). C<import()> will die
+if anything else is passed in.
+
+=item * export()
+
+This returns a complete copy of the data structure at the point you do the export.
+This copy is in RAM, not on disk like the DB is.
+
+=item * begin_work() / commit() / rollback()
+
+These are the transactional functions. L</TRANSACTIONS> for more information.
+
+=back
+
+=head2 Hashes
+
+For hashes, DBM::Deep supports all the common methods described above, and the
+following additional methods: C<first_key()> and C<next_key()>.
+
+=over
+
+=item * first_key()
+
+Returns the "first" key in the hash. As with built-in Perl hashes, keys are
+fetched in an undefined order (which appears random). Takes no arguments,
+returns the key as a scalar value.
+
+ my $key = $db->first_key();
+
+=item * next_key()
+
+Returns the "next" key in the hash, given the previous one as the sole argument.
+Returns undef if there are no more keys to be fetched.
+
+ $key = $db->next_key($key);
+
+=back
+
+Here are some examples of using hashes:
+
+ my $db = DBM::Deep->new( "foo.db" );
+
+ $db->put("foo", "bar");
+ print "foo: " . $db->get("foo") . "\n";
+
+ $db->put("baz", {}); # new child hash ref
+ $db->get("baz")->put("buz", "biz");
+ print "buz: " . $db->get("baz")->get("buz") . "\n";
+
+ my $key = $db->first_key();
+ while ($key) {
+ print "$key: " . $db->get($key) . "\n";
+ $key = $db->next_key($key);
+ }
+
+ if ($db->exists("foo")) { $db->delete("foo"); }
+
+=head2 Arrays
+
+For arrays, DBM::Deep supports all the common methods described above, and the
+following additional methods: C<length()>, C<push()>, C<pop()>, C<shift()>,
+C<unshift()> and C<splice()>.
+
+=over
+
+=item * length()
+
+Returns the number of elements in the array. Takes no arguments.
+
+ my $len = $db->length();
+
+=item * push()
+
+Adds one or more elements onto the end of the array. Accepts scalars, hash
+refs or array refs. No return value.
+
+ $db->push("foo", "bar", {});
+
+=item * pop()
+
+Fetches the last element in the array, and deletes it. Takes no arguments.
+Returns undef if array is empty. Returns the element value.
+
+ my $elem = $db->pop();
+
+=item * shift()
+
+Fetches the first element in the array, deletes it, then shifts all the
+remaining elements over to take up the space. Returns the element value. This
+method is not recommended with large arrays -- see L<LARGE ARRAYS> below for
+details.
+
+ my $elem = $db->shift();
+
+=item * unshift()
+
+Inserts one or more elements onto the beginning of the array, shifting all
+existing elements over to make room. Accepts scalars, hash refs or array refs.
+No return value. This method is not recommended with large arrays -- see
+<LARGE ARRAYS> below for details.
+
+ $db->unshift("foo", "bar", {});
+
+=item * splice()
+
+Performs exactly like Perl's built-in function of the same name. See L<perldoc
+-f splice> for usage -- it is too complicated to document here. This method is
+not recommended with large arrays -- see L<LARGE ARRAYS> below for details.
+
+=back
+
+Here are some examples of using arrays:
+
+ my $db = DBM::Deep->new(
+ file => "foo.db",
+ type => DBM::Deep->TYPE_ARRAY
+ );
+
+ $db->push("bar", "baz");
+ $db->unshift("foo");
+ $db->put(3, "buz");
+
+ my $len = $db->length();
+ print "length: $len\n"; # 4
+
+ for (my $k=0; $k<$len; $k++) {
+ print "$k: " . $db->get($k) . "\n";
+ }
+
+ $db->splice(1, 2, "biz", "baf");
+
+ while (my $elem = shift @$db) {
+ print "shifted: $elem\n";
+ }
+
+=head1 LOCKING
+
+Enable or disable automatic file locking by passing a boolean value to the
+C<locking> parameter when constructing your DBM::Deep object (see L<SETUP>
+above).
+
+ my $db = DBM::Deep->new(
+ file => "foo.db",
+ locking => 1
+ );
+
+This causes DBM::Deep to C<flock()> the underlying filehandle with exclusive
+mode for writes, and shared mode for reads. This is required if you have
+multiple processes accessing the same database file, to avoid file corruption.
+Please note that C<flock()> does NOT work for files over NFS. See L<DB OVER
+NFS> below for more.
+
+=head2 Explicit Locking
+
+You can explicitly lock a database, so it remains locked for multiple
+actions. This is done by calling the C<lock()> method, and passing an
+optional lock mode argument (defaults to exclusive mode). This is particularly
+useful for things like counters, where the current value needs to be fetched,
+then incremented, then stored again.
+
+ $db->lock();
+ my $counter = $db->get("counter");
+ $counter++;
+ $db->put("counter", $counter);
+ $db->unlock();
+
+ # or...
+
+ $db->lock();
+ $db->{counter}++;
+ $db->unlock();
+
+You can pass C<lock()> an optional argument, which specifies which mode to use
+(exclusive or shared). Use one of these two constants:
+C<DBM::Deep-E<gt>LOCK_EX> or C<DBM::Deep-E<gt>LOCK_SH>. These are passed
+directly to C<flock()>, and are the same as the constants defined in Perl's
+L<Fcntl> module.
+
+ $db->lock( $db->LOCK_SH );
+ # something here
+ $db->unlock();
+
+=head2 Win32/Cygwin
+
+Due to Win32 actually enforcing the read-only status of a shared lock, all
+locks on Win32 and cygwin are exclusive. This is because of how autovivification
+currently works. Hopefully, this will go away in a future release.
+
+=head1 IMPORTING/EXPORTING
+
+You can import existing complex structures by calling the C<import()> method,
+and export an entire database into an in-memory structure using the C<export()>
+method. Both are examined here.
+
+=head2 Importing
+
+Say you have an existing hash with nested hashes/arrays inside it. Instead of
+walking the structure and adding keys/elements to the database as you go,
+simply pass a reference to the C<import()> method. This recursively adds
+everything to an existing DBM::Deep object for you. Here is an example:
+
+ my $struct = {
+ key1 => "value1",
+ key2 => "value2",
+ array1 => [ "elem0", "elem1", "elem2" ],
+ hash1 => {
+ subkey1 => "subvalue1",
+ subkey2 => "subvalue2"
+ }
+ };
+
+ my $db = DBM::Deep->new( "foo.db" );
+ $db->import( $struct );
+
+ print $db->{key1} . "\n"; # prints "value1"
+
+This recursively imports the entire C<$struct> object into C<$db>, including
+all nested hashes and arrays. If the DBM::Deep object contains exsiting data,
+keys are merged with the existing ones, replacing if they already exist.
+The C<import()> method can be called on any database level (not just the base
+level), and works with both hash and array DB types.
+
+B<Note:> Make sure your existing structure has no circular references in it.
+These will cause an infinite loop when importing. There are plans to fix this
+in a later release.
+
+=head2 Exporting
+
+Calling the C<export()> method on an existing DBM::Deep object will return
+a reference to a new in-memory copy of the database. The export is done
+recursively, so all nested hashes/arrays are all exported to standard Perl
+objects. Here is an example:
+
+ my $db = DBM::Deep->new( "foo.db" );
+
+ $db->{key1} = "value1";
+ $db->{key2} = "value2";
+ $db->{hash1} = {};
+ $db->{hash1}->{subkey1} = "subvalue1";
+ $db->{hash1}->{subkey2} = "subvalue2";
+
+ my $struct = $db->export();
+
+ print $struct->{key1} . "\n"; # prints "value1"
+
+This makes a complete copy of the database in memory, and returns a reference
+to it. The C<export()> method can be called on any database level (not just
+the base level), and works with both hash and array DB types. Be careful of
+large databases -- you can store a lot more data in a DBM::Deep object than an
+in-memory Perl structure.
+
+B<Note:> Make sure your database has no circular references in it.
+These will cause an infinite loop when exporting. There are plans to fix this
+in a later release.
+
+=head1 FILTERS
+
+DBM::Deep has a number of hooks where you can specify your own Perl function
+to perform filtering on incoming or outgoing data. This is a perfect
+way to extend the engine, and implement things like real-time compression or
+encryption. Filtering applies to the base DB level, and all child hashes /
+arrays. Filter hooks can be specified when your DBM::Deep object is first
+constructed, or by calling the C<set_filter()> method at any time. There are
+four available filter hooks.
+
+=head2 set_filter()
+
+This method takes two paramters - the filter type and the filter subreference.
+The four types are:
+
+=over
+
+=item * filter_store_key
+
+This filter is called whenever a hash key is stored. It
+is passed the incoming key, and expected to return a transformed key.
+
+=item * filter_store_value
+
+This filter is called whenever a hash key or array element is stored. It
+is passed the incoming value, and expected to return a transformed value.
+
+=item * filter_fetch_key
+
+This filter is called whenever a hash key is fetched (i.e. via
+C<first_key()> or C<next_key()>). It is passed the transformed key,
+and expected to return the plain key.
+
+=item * filter_fetch_value
+
+This filter is called whenever a hash key or array element is fetched.
+It is passed the transformed value, and expected to return the plain value.
+
+=back
+
+Here are the two ways to setup a filter hook:
+
+ my $db = DBM::Deep->new(
+ file => "foo.db",
+ filter_store_value => \&my_filter_store,
+ filter_fetch_value => \&my_filter_fetch
+ );
+
+ # or...
+
+ $db->set_filter( "filter_store_value", \&my_filter_store );
+ $db->set_filter( "filter_fetch_value", \&my_filter_fetch );
+
+Your filter function will be called only when dealing with SCALAR keys or
+values. When nested hashes and arrays are being stored/fetched, filtering
+is bypassed. Filters are called as static functions, passed a single SCALAR
+argument, and expected to return a single SCALAR value. If you want to
+remove a filter, set the function reference to C<undef>:
+
+ $db->set_filter( "filter_store_value", undef );
+
+=head2 Examples
+
+Please read L<DBM::Deep::Manual> for examples of filters.
+
+=head1 ERROR HANDLING
+
+Most DBM::Deep methods return a true value for success, and call die() on
+failure. You can wrap calls in an eval block to catch the die.
+
+ my $db = DBM::Deep->new( "foo.db" ); # create hash
+ eval { $db->push("foo"); }; # ILLEGAL -- push is array-only call
+
+ print $@; # prints error message
+
+=head1 LARGEFILE SUPPORT
+
+If you have a 64-bit system, and your Perl is compiled with both LARGEFILE
+and 64-bit support, you I<may> be able to create databases larger than 4 GB.
+DBM::Deep by default uses 32-bit file offset tags, but these can be changed
+by specifying the 'pack_size' parameter when constructing the file.
+
+ DBM::Deep->new(
+ filename => $filename,
+ pack_size => 'large',
+ );
+
+This tells DBM::Deep to pack all file offsets with 8-byte (64-bit) quad words
+instead of 32-bit longs. After setting these values your DB files have a
+theoretical maximum size of 16 XB (exabytes).
+
+You can also use C<pack_size =E<gt> 'small'> in order to use 16-bit file
+offsets.
+
+B<Note:> Changing these values will B<NOT> work for existing database files.
+Only change this for new files. Once the value has been set, it is stored in
+the file's header and cannot be changed for the life of the file. These
+parameters are per-file, meaning you can access 32-bit and 64-bit files, as
+you choose.
+
+B<Note:> We have not personally tested files larger than 4 GB -- all our
+systems have only a 32-bit Perl. However, we have received user reports that
+this does indeed work.
+
+=head1 LOW-LEVEL ACCESS
+
+If you require low-level access to the underlying filehandle that DBM::Deep uses,
+you can call the C<_fh()> method, which returns the handle:
+
+ my $fh = $db->_fh();
+
+This method can be called on the root level of the datbase, or any child
+hashes or arrays. All levels share a I<root> structure, which contains things
+like the filehandle, a reference counter, and all the options specified
+when you created the object. You can get access to this file object by
+calling the C<_storage()> method.
+
+ my $file_obj = $db->_storage();
+
+This is useful for changing options after the object has already been created,
+such as enabling/disabling locking. You can also store your own temporary user
+data in this structure (be wary of name collision), which is then accessible from
+any child hash or array.
+
+=head1 CIRCULAR REFERENCES
+
+DBM::Deep has full support for circular references. Meaning you
+can have a nested hash key or array element that points to a parent object.
+This relationship is stored in the DB file, and is preserved between sessions.
+Here is an example:
+
+ my $db = DBM::Deep->new( "foo.db" );
+
+ $db->{foo} = "bar";
+ $db->{circle} = $db; # ref to self
+
+ print $db->{foo} . "\n"; # prints "bar"
+ print $db->{circle}->{foo} . "\n"; # prints "bar" again
+
+This also works as expected with array and hash references. So, the following
+works as expected:
+
+ $db->{foo} = [ 1 .. 3 ];
+ $db->{bar} = $db->{foo};
+
+ push @{$db->{foo}}, 42;
+ is( $db->{bar}[-1], 42 ); # Passes
+
+This, however, does I<not> extend to assignments from one DB file to another.
+So, the following will throw an error:
+
+ my $db1 = DBM::Deep->new( "foo.db" );
+ my $db2 = DBM::Deep->new( "bar.db" );
+
+ $db1->{foo} = [];
+ $db2->{foo} = $db1->{foo}; # dies
+
+B<Note>: Passing the object to a function that recursively walks the
+object tree (such as I<Data::Dumper> or even the built-in C<optimize()> or
+C<export()> methods) will result in an infinite loop. This will be fixed in
+a future release by adding singleton support.
+
+=head1 TRANSACTIONS
+
+As of 1.0000, DBM::Deep hass ACID transactions. Every DBM::Deep object is completely
+transaction-ready - it is not an option you have to turn on. You do have to
+specify how many transactions may run simultaneously (q.v. L</num_txns>).
+
+Three new methods have been added to support them. They are:
+
+=over 4
+
+=item * begin_work()
+
+This starts a transaction.
+
+=item * commit()
+
+This applies the changes done within the transaction to the mainline and ends
+the transaction.
+
+=item * rollback()
+
+This discards the changes done within the transaction to the mainline and ends
+the transaction.
+
+=back
+
+Transactions in DBM::Deep are done using a variant of the MVCC method, the
+same method used by the InnoDB MySQL engine.
+
+=head1 MIGRATION
+
+As of 1.0000, the file format has changed. Furthermore, DBM::Deep is now
+designed to potentially change file format between point-releases, if needed to
+support a requested feature. To aid in this, a migration script is provided
+within the CPAN distribution called C<utils/upgrade_db.pl>.
+
+B<NOTE:> This script is not installed onto your system because it carries a copy
+of every version prior to the current version.
+
+=head1 TODO
+
+The following are items that are planned to be added in future releases. These
+are separate from the L<CAVEATS, ISSUES & BUGS> below.
+
+=head2 Sub-Transactions
+
+Right now, you cannot run a transaction within a transaction. Removing this
+restriction is technically straightforward, but the combinatorial explosion of
+possible usecases hurts my head. If this is something you want to see
+immediately, please submit many testcases.
+
+=head2 Caching
+
+If a client is willing to assert upon opening the file that this process will be
+the only consumer of that datafile, then there are a number of caching
+possibilities that can be taken advantage of. This does, however, mean that
+DBM::Deep is more vulnerable to losing data due to unflushed changes. It also
+means a much larger in-memory footprint. As such, it's not clear exactly how
+this should be done. Suggestions are welcome.
+
+=head2 Ram-only
+
+The techniques used in DBM::Deep simply require a seekable contiguous
+datastore. This could just as easily be a large string as a file. By using
+substr, the STM capabilities of DBM::Deep could be used within a
+single-process. I have no idea how I'd specify this, though. Suggestions are
+welcome.
+
+=head2 Different contention resolution mechanisms
+
+Currently, the only contention resolution mechanism is last-write-wins. This
+is the mechanism used by most RDBMSes and should be good enough for most uses.
+For advanced uses of STM, other contention mechanisms will be needed. If you
+have an idea of how you'd like to see contention resolution in DBM::Deep,
+please let me know.
+
+=head1 CAVEATS, ISSUES & BUGS
+
+This section describes all the known issues with DBM::Deep. These are issues
+that are either intractable or depend on some feature within Perl working
+exactly right. It you have found something that is not listed below, please
+send an e-mail to L<rkinyon@cpan.org>. Likewise, if you think you know of a
+way around one of these issues, please let me know.
+
+=head2 References
+
+(The following assumes a high level of Perl understanding, specifically of
+references. Most users can safely skip this section.)
+
+Currently, the only references supported are HASH and ARRAY. The other reference
+types (SCALAR, CODE, GLOB, and REF) cannot be supported for various reasons.
+
+=over 4
+
+=item * GLOB
+
+These are things like filehandles and other sockets. They can't be supported
+because it's completely unclear how DBM::Deep should serialize them.
+
+=item * SCALAR / REF
+
+The discussion here refers to the following type of example:
+
+ my $x = 25;
+ $db->{key1} = \$x;
+
+ $x = 50;
+
+ # In some other process ...
+
+ my $val = ${ $db->{key1} };
+
+ is( $val, 50, "What actually gets stored in the DB file?" );
+
+The problem is one of synchronization. When the variable being referred to
+changes value, the reference isn't notified, which is kind of the point of
+references. This means that the new value won't be stored in the datafile for
+other processes to read. There is no TIEREF.
+
+It is theoretically possible to store references to values already within a
+DBM::Deep object because everything already is synchronized, but the change to
+the internals would be quite large. Specifically, DBM::Deep would have to tie
+every single value that is stored. This would bloat the RAM footprint of
+DBM::Deep at least twofold (if not more) and be a significant performance drain,
+all to support a feature that has never been requested.
+
+=item * CODE
+
+L<Data::Dump::Streamer> provides a mechanism for serializing coderefs,
+including saving off all closure state. This would allow for DBM::Deep to
+store the code for a subroutine. Then, whenever the subroutine is read, the
+code could be C<eval()>'ed into being. However, just as for SCALAR and REF,
+that closure state may change without notifying the DBM::Deep object storing
+the reference. Again, this would generally be considered a feature.
+
+=back
+
+=head2 External references and transactions
+
+If you do C<my $x = $db-E<gt>{foo};>, then start a transaction, $x will be
+referencing the database from outside the transaction. A fix for this (and other
+issues with how external references into the database) is being looked into. This
+is the skipped set of tests in t/39_singletons.t and a related issue is the focus
+of t/37_delete_edge_cases.t
+
+=head2 File corruption
+
+The current level of error handling in DBM::Deep is minimal. Files I<are> checked
+for a 32-bit signature when opened, but any other form of corruption in the
+datafile can cause segmentation faults. DBM::Deep may try to C<seek()> past
+the end of a file, or get stuck in an infinite loop depending on the level and
+type of corruption. File write operations are not checked for failure (for
+speed), so if you happen to run out of disk space, DBM::Deep will probably fail in
+a bad way. These things will be addressed in a later version of DBM::Deep.
+
+=head2 DB over NFS
+
+Beware of using DBM::Deep files over NFS. DBM::Deep uses flock(), which works
+well on local filesystems, but will NOT protect you from file corruption over
+NFS. I've heard about setting up your NFS server with a locking daemon, then
+using C<lockf()> to lock your files, but your mileage may vary there as well.
+From what I understand, there is no real way to do it. However, if you need
+access to the underlying filehandle in DBM::Deep for using some other kind of
+locking scheme like C<lockf()>, see the L<LOW-LEVEL ACCESS> section above.
+
+=head2 Copying Objects
+
+Beware of copying tied objects in Perl. Very strange things can happen.
+Instead, use DBM::Deep's C<clone()> method which safely copies the object and
+returns a new, blessed and tied hash or array to the same level in the DB.
+
+ my $copy = $db->clone();
+
+B<Note>: Since clone() here is cloning the object, not the database location, any
+modifications to either $db or $copy will be visible to both.
+
+=head2 Large Arrays
+
+Beware of using C<shift()>, C<unshift()> or C<splice()> with large arrays.
+These functions cause every element in the array to move, which can be murder
+on DBM::Deep, as every element has to be fetched from disk, then stored again in
+a different location. This will be addressed in a future version.
+
+This has been somewhat addressed so that the cost is constant, regardless of
+what is stored at those locations. So, small arrays with huge data structures in
+them are faster. But, large arrays are still large.
+
+=head2 Writeonly Files
+
+If you pass in a filehandle to new(), you may have opened it in either a
+readonly or writeonly mode. STORE will verify that the filehandle is writable.
+However, there doesn't seem to be a good way to determine if a filehandle is
+readable. And, if the filehandle isn't readable, it's not clear what will
+happen. So, don't do that.
+
+=head2 Assignments Within Transactions
+
+The following will I<not> work as one might expect:
+
+ my $x = { a => 1 };
+
+ $db->begin_work;
+ $db->{foo} = $x;
+ $db->rollback;
+
+ is( $x->{a}, 1 ); # This will fail!
+
+The problem is that the moment a reference used as the rvalue to a DBM::Deep
+object's lvalue, it becomes tied itself. This is so that future changes to
+C<$x> can be tracked within the DBM::Deep file and is considered to be a
+feature. By the time the rollback occurs, there is no knowledge that there had
+been an C<$x> or what memory location to assign an C<export()> to.
+
+B<NOTE:> This does not affect importing because imports do a walk over the
+reference to be imported in order to explicitly leave it untied.
+
+=head1 CODE COVERAGE
+
+L<Devel::Cover> is used to test the code coverage of the tests. Below is the
+L<Devel::Cover> report on this distribution's test suite.
+
+ ------------------------------------------ ------ ------ ------ ------ ------
+ File stmt bran cond sub total
+ ------------------------------------------ ------ ------ ------ ------ ------
+ blib/lib/DBM/Deep.pm 97.2 90.9 83.3 100.0 95.4
+ blib/lib/DBM/Deep/Array.pm 100.0 95.7 100.0 100.0 99.0
+ blib/lib/DBM/Deep/Engine.pm 95.6 84.7 81.6 98.4 92.5
+ blib/lib/DBM/Deep/File.pm 97.2 81.6 66.7 100.0 91.9
+ blib/lib/DBM/Deep/Hash.pm 100.0 100.0 100.0 100.0 100.0
+ Total 96.7 87.5 82.2 99.2 94.1
+ ------------------------------------------ ------ ------ ------ ------ ------
+
+=head1 MORE INFORMATION
+
+Check out the DBM::Deep Google Group at L<http://groups.google.com/group/DBM-Deep>
+or send email to L<DBM-Deep@googlegroups.com>. You can also visit #dbm-deep on
+irc.perl.org
+
+The source code repository is at L<http://svn.perl.org/modules/DBM-Deep>
+
+=head1 MAINTAINERS
+
+Rob Kinyon, L<rkinyon@cpan.org>
+
+Originally written by Joseph Huckaby, L<jhuckaby@cpan.org>
+
+=head1 SPONSORS
+
+Stonehenge Consulting (L<http://www.stonehenge.com/>) sponsored the
+developement of transactions and freespace management, leading to the 1.0000
+release. A great debt of gratitude goes out to them for their continuing
+leadership in and support of the Perl community.
+
+=head1 CONTRIBUTORS
+
+The following have contributed greatly to make DBM::Deep what it is today:
+
+=over 4
+
+=item * Adam Sah and Rich Gaushell for innumerable contributions early on.
+
+=item * Dan Golden and others at YAPC::NA 2006 for helping me design through transactions.
+
+=back
+
+=head1 SEE ALSO
+
+perltie(1), Tie::Hash(3), Digest::MD5(3), Fcntl(3), flock(2), lockf(3), nfs(5),
+Digest::SHA256(3), Crypt::Blowfish(3), Compress::Zlib(3)
+
+=head1 LICENSE
+
+Copyright (c) 2007 Rob Kinyon. All Rights Reserved.
+This is free software, you may use it and distribute it under the same terms
+as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Array.pm b/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Array.pm
new file mode 100755
index 00000000000..38c51869fda
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Array.pm
@@ -0,0 +1,414 @@
+package DBM::Deep::Array;
+
+use 5.006_000;
+
+use strict;
+use warnings;
+
+our $VERSION = q(1.0013);
+
+# This is to allow DBM::Deep::Array to handle negative indices on
+# its own. Otherwise, Perl would intercept the call to negative
+# indices for us. This was causing bugs for negative index handling.
+our $NEGATIVE_INDICES = 1;
+
+use base 'DBM::Deep';
+
+use Scalar::Util ();
+
+sub _get_self {
+ eval { local $SIG{'__DIE__'}; tied( @{$_[0]} ) } || $_[0]
+}
+
+sub _repr { [] }
+
+sub TIEARRAY {
+ my $class = shift;
+ my $args = $class->_get_args( @_ );
+
+ $args->{type} = $class->TYPE_ARRAY;
+
+ return $class->_init($args);
+}
+
+sub FETCH {
+ my $self = shift->_get_self;
+ my ($key) = @_;
+
+ $self->lock( $self->LOCK_SH );
+
+ if ( !defined $key ) {
+ $self->unlock;
+ DBM::Deep->_throw_error( "Cannot use an undefined array index." );
+ }
+ elsif ( $key =~ /^-?\d+$/ ) {
+ if ( $key < 0 ) {
+ $key += $self->FETCHSIZE;
+ unless ( $key >= 0 ) {
+ $self->unlock;
+ return;
+ }
+ }
+ }
+ elsif ( $key ne 'length' ) {
+ $self->unlock;
+ DBM::Deep->_throw_error( "Cannot use '$key' as an array index." );
+ }
+
+ my $rv = $self->SUPER::FETCH( $key );
+
+ $self->unlock;
+
+ return $rv;
+}
+
+sub STORE {
+ my $self = shift->_get_self;
+ my ($key, $value) = @_;
+
+ $self->lock( $self->LOCK_EX );
+
+ my $size;
+ my $idx_is_numeric;
+ if ( !defined $key ) {
+ $self->unlock;
+ DBM::Deep->_throw_error( "Cannot use an undefined array index." );
+ }
+ elsif ( $key =~ /^-?\d+$/ ) {
+ $idx_is_numeric = 1;
+ if ( $key < 0 ) {
+ $size = $self->FETCHSIZE;
+ if ( $key + $size < 0 ) {
+ die( "Modification of non-creatable array value attempted, subscript $key" );
+ }
+ $key += $size
+ }
+ }
+ elsif ( $key ne 'length' ) {
+ $self->unlock;
+ DBM::Deep->_throw_error( "Cannot use '$key' as an array index." );
+ }
+
+ my $rv = $self->SUPER::STORE( $key, $value );
+
+ if ( $idx_is_numeric ) {
+ $size = $self->FETCHSIZE unless defined $size;
+ if ( $key >= $size ) {
+ $self->STORESIZE( $key + 1 );
+ }
+ }
+
+ $self->unlock;
+
+ return $rv;
+}
+
+sub EXISTS {
+ my $self = shift->_get_self;
+ my ($key) = @_;
+
+ $self->lock( $self->LOCK_SH );
+
+ if ( !defined $key ) {
+ $self->unlock;
+ DBM::Deep->_throw_error( "Cannot use an undefined array index." );
+ }
+ elsif ( $key =~ /^-?\d+$/ ) {
+ if ( $key < 0 ) {
+ $key += $self->FETCHSIZE;
+ unless ( $key >= 0 ) {
+ $self->unlock;
+ return;
+ }
+ }
+ }
+ elsif ( $key ne 'length' ) {
+ $self->unlock;
+ DBM::Deep->_throw_error( "Cannot use '$key' as an array index." );
+ }
+
+ my $rv = $self->SUPER::EXISTS( $key );
+
+ $self->unlock;
+
+ return $rv;
+}
+
+sub DELETE {
+ my $self = shift->_get_self;
+ my ($key) = @_;
+ warn "ARRAY::DELETE($self,$key)\n" if DBM::Deep::DEBUG;
+
+ $self->lock( $self->LOCK_EX );
+
+ my $size = $self->FETCHSIZE;
+ if ( !defined $key ) {
+ $self->unlock;
+ DBM::Deep->_throw_error( "Cannot use an undefined array index." );
+ }
+ elsif ( $key =~ /^-?\d+$/ ) {
+ if ( $key < 0 ) {
+ $key += $size;
+ unless ( $key >= 0 ) {
+ $self->unlock;
+ return;
+ }
+ }
+ }
+ elsif ( $key ne 'length' ) {
+ $self->unlock;
+ DBM::Deep->_throw_error( "Cannot use '$key' as an array index." );
+ }
+
+ my $rv = $self->SUPER::DELETE( $key );
+
+ if ($rv && $key == $size - 1) {
+ $self->STORESIZE( $key );
+ }
+
+ $self->unlock;
+
+ return $rv;
+}
+
+# Now that we have a real Reference sector, we should store arrayzize there. However,
+# arraysize needs to be transactionally-aware, so a simple location to store it isn't
+# going to work.
+sub FETCHSIZE {
+ my $self = shift->_get_self;
+
+ $self->lock( $self->LOCK_SH );
+
+ my $SAVE_FILTER = $self->_storage->{filter_fetch_value};
+ $self->_storage->{filter_fetch_value} = undef;
+
+ my $size = $self->FETCH('length') || 0;
+
+ $self->_storage->{filter_fetch_value} = $SAVE_FILTER;
+
+ $self->unlock;
+
+ return $size;
+}
+
+sub STORESIZE {
+ my $self = shift->_get_self;
+ my ($new_length) = @_;
+
+ $self->lock( $self->LOCK_EX );
+
+ my $SAVE_FILTER = $self->_storage->{filter_store_value};
+ $self->_storage->{filter_store_value} = undef;
+
+ my $result = $self->STORE('length', $new_length, 'length');
+
+ $self->_storage->{filter_store_value} = $SAVE_FILTER;
+
+ $self->unlock;
+
+ return $result;
+}
+
+sub POP {
+ my $self = shift->_get_self;
+
+ $self->lock( $self->LOCK_EX );
+
+ my $length = $self->FETCHSIZE();
+
+ if ($length) {
+ my $content = $self->FETCH( $length - 1 );
+ $self->DELETE( $length - 1 );
+
+ $self->unlock;
+
+ return $content;
+ }
+ else {
+ $self->unlock;
+ return;
+ }
+}
+
+sub PUSH {
+ my $self = shift->_get_self;
+
+ $self->lock( $self->LOCK_EX );
+
+ my $length = $self->FETCHSIZE();
+
+ while (my $content = shift @_) {
+ $self->STORE( $length, $content );
+ $length++;
+ }
+
+ $self->unlock;
+
+ return $length;
+}
+
+# XXX This really needs to be something more direct within the file, not a
+# fetch and re-store. -RobK, 2007-09-20
+sub _move_value {
+ my $self = shift;
+ my ($old_key, $new_key) = @_;
+
+ return $self->_engine->make_reference( $self, $old_key, $new_key );
+}
+
+sub SHIFT {
+ my $self = shift->_get_self;
+ warn "SHIFT($self)\n" if DBM::Deep::DEBUG;
+
+ $self->lock( $self->LOCK_EX );
+
+ my $length = $self->FETCHSIZE();
+
+ if ( !$length ) {
+ $self->unlock;
+ return;
+ }
+
+ my $content = $self->DELETE( 0 );
+
+ # Unless the deletion above has cleared the array ...
+ if ( $length > 1 ) {
+ for (my $i = 0; $i < $length - 1; $i++) {
+ $self->_move_value( $i+1, $i );
+ }
+
+ $self->DELETE( $length - 1 );
+ }
+
+ $self->unlock;
+
+ return $content;
+}
+
+sub UNSHIFT {
+ my $self = shift->_get_self;
+ my @new_elements = @_;
+
+ $self->lock( $self->LOCK_EX );
+
+ my $length = $self->FETCHSIZE();
+ my $new_size = scalar @new_elements;
+
+ if ($length) {
+ for (my $i = $length - 1; $i >= 0; $i--) {
+ $self->_move_value( $i, $i+$new_size );
+ }
+
+ $self->STORESIZE( $length + $new_size );
+ }
+
+ for (my $i = 0; $i < $new_size; $i++) {
+ $self->STORE( $i, $new_elements[$i] );
+ }
+
+ $self->unlock;
+
+ return $length + $new_size;
+}
+
+sub SPLICE {
+ my $self = shift->_get_self;
+
+ $self->lock( $self->LOCK_EX );
+
+ my $length = $self->FETCHSIZE();
+
+ ##
+ # Calculate offset and length of splice
+ ##
+ my $offset = shift;
+ $offset = 0 unless defined $offset;
+ if ($offset < 0) { $offset += $length; }
+
+ my $splice_length;
+ if (scalar @_) { $splice_length = shift; }
+ else { $splice_length = $length - $offset; }
+ if ($splice_length < 0) { $splice_length += ($length - $offset); }
+
+ ##
+ # Setup array with new elements, and copy out old elements for return
+ ##
+ my @new_elements = @_;
+ my $new_size = scalar @new_elements;
+
+ my @old_elements = map {
+ $self->FETCH( $_ )
+ } $offset .. ($offset + $splice_length - 1);
+
+ ##
+ # Adjust array length, and shift elements to accomodate new section.
+ ##
+ if ( $new_size != $splice_length ) {
+ if ($new_size > $splice_length) {
+ for (my $i = $length - 1; $i >= $offset + $splice_length; $i--) {
+ $self->_move_value( $i, $i + ($new_size - $splice_length) );
+ }
+ $self->STORESIZE( $length + $new_size - $splice_length );
+ }
+ else {
+ for (my $i = $offset + $splice_length; $i < $length; $i++) {
+ $self->_move_value( $i, $i + ($new_size - $splice_length) );
+ }
+ for (my $i = 0; $i < $splice_length - $new_size; $i++) {
+ $self->DELETE( $length - 1 );
+ $length--;
+ }
+ }
+ }
+
+ ##
+ # Insert new elements into array
+ ##
+ for (my $i = $offset; $i < $offset + $new_size; $i++) {
+ $self->STORE( $i, shift @new_elements );
+ }
+
+ $self->unlock;
+
+ ##
+ # Return deleted section, or last element in scalar context.
+ ##
+ return wantarray ? @old_elements : $old_elements[-1];
+}
+
+# We don't need to populate it, yet.
+# It will be useful, though, when we split out HASH and ARRAY
+sub EXTEND {
+ ##
+ # Perl will call EXTEND() when the array is likely to grow.
+ # We don't care, but include it because it gets called at times.
+ ##
+}
+
+sub _copy_node {
+ my $self = shift;
+ my ($db_temp) = @_;
+
+ my $length = $self->length();
+ for (my $index = 0; $index < $length; $index++) {
+ $self->_copy_value( \$db_temp->[$index], $self->get($index) );
+ }
+
+ return 1;
+}
+
+##
+# Public method aliases
+##
+sub length { (shift)->FETCHSIZE(@_) }
+sub pop { (shift)->POP(@_) }
+sub push { (shift)->PUSH(@_) }
+sub unshift { (shift)->UNSHIFT(@_) }
+sub splice { (shift)->SPLICE(@_) }
+
+# This must be last otherwise we have to qualify all other calls to shift
+# as calls to CORE::shift
+sub shift { (CORE::shift)->SHIFT(@_) }
+
+1;
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Cookbook.pod b/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Cookbook.pod
new file mode 100755
index 00000000000..4ca50b97a39
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Cookbook.pod
@@ -0,0 +1,199 @@
+=head1 NAME
+
+DBM::Deep::Cookbook
+
+=head1 DESCRIPTION
+
+This is the Cookbook for L<DBM::Deep>. It contains useful tips and tricks,
+plus some examples of how to do common tasks.
+
+=head1 RECIPES
+
+=head2 UTF8 data
+
+When you're using UTF8 data, you may run into the "Wide character in print"
+warning. To fix that in 5.8+, do the following:
+
+ my $db = DBM::Deep->new( ... );
+ binmode $db->_fh, ":utf8";
+
+In 5.6, you will have to do the following:
+
+ my $db = DBM::Deep->new( ... );
+ $db->set_filter( 'store_value' => sub { pack "U0C*", unpack "C*", $_[0] } );
+ $db->set_filter( 'retrieve_value' => sub { pack "C*", unpack "U0C*", $_[0] } );
+
+In a future version, you will be able to specify C<utf8 =E<gt> 1> and
+L<DBM::Deep> will do these things for you.
+
+=head2 Real-time Encryption Example
+
+B<NOTE>: This is just an example of how to write a filter. This most
+definitely should B<NOT> be taken as a proper way to write a filter that does
+encryption.
+
+Here is a working example that uses the I<Crypt::Blowfish> module to
+do real-time encryption / decryption of keys & values with DBM::Deep Filters.
+Please visit L<http://search.cpan.org/search?module=Crypt::Blowfish> for more
+on I<Crypt::Blowfish>. You'll also need the I<Crypt::CBC> module.
+
+ use DBM::Deep;
+ use Crypt::Blowfish;
+ use Crypt::CBC;
+
+ my $cipher = Crypt::CBC->new({
+ 'key' => 'my secret key',
+ 'cipher' => 'Blowfish',
+ 'iv' => '$KJh#(}q',
+ 'regenerate_key' => 0,
+ 'padding' => 'space',
+ 'prepend_iv' => 0
+ });
+
+ my $db = DBM::Deep->new(
+ file => "foo-encrypt.db",
+ filter_store_key => \&my_encrypt,
+ filter_store_value => \&my_encrypt,
+ filter_fetch_key => \&my_decrypt,
+ filter_fetch_value => \&my_decrypt,
+ );
+
+ $db->{key1} = "value1";
+ $db->{key2} = "value2";
+ print "key1: " . $db->{key1} . "\n";
+ print "key2: " . $db->{key2} . "\n";
+
+ undef $db;
+ exit;
+
+ sub my_encrypt {
+ return $cipher->encrypt( $_[0] );
+ }
+ sub my_decrypt {
+ return $cipher->decrypt( $_[0] );
+ }
+
+=head2 Real-time Compression Example
+
+Here is a working example that uses the I<Compress::Zlib> module to do real-time
+compression / decompression of keys & values with DBM::Deep Filters.
+Please visit L<http://search.cpan.org/search?module=Compress::Zlib> for
+more on I<Compress::Zlib>.
+
+ use DBM::Deep;
+ use Compress::Zlib;
+
+ my $db = DBM::Deep->new(
+ file => "foo-compress.db",
+ filter_store_key => \&my_compress,
+ filter_store_value => \&my_compress,
+ filter_fetch_key => \&my_decompress,
+ filter_fetch_value => \&my_decompress,
+ );
+
+ $db->{key1} = "value1";
+ $db->{key2} = "value2";
+ print "key1: " . $db->{key1} . "\n";
+ print "key2: " . $db->{key2} . "\n";
+
+ undef $db;
+ exit;
+
+ sub my_compress {
+ return Compress::Zlib::memGzip( $_[0] ) ;
+ }
+ sub my_decompress {
+ return Compress::Zlib::memGunzip( $_[0] ) ;
+ }
+
+B<Note:> Filtering of keys only applies to hashes. Array "keys" are
+actually numerical index numbers, and are not filtered.
+
+=head1 Custom Digest Algorithm
+
+DBM::Deep by default uses the I<Message Digest 5> (MD5) algorithm for hashing
+keys. However you can override this, and use another algorithm (such as SHA-256)
+or even write your own. But please note that DBM::Deep currently expects zero
+collisions, so your algorithm has to be I<perfect>, so to speak. Collision
+detection may be introduced in a later version.
+
+You can specify a custom digest algorithm by passing it into the parameter
+list for new(), passing a reference to a subroutine as the 'digest' parameter,
+and the length of the algorithm's hashes (in bytes) as the 'hash_size'
+parameter. Here is a working example that uses a 256-bit hash from the
+I<Digest::SHA256> module. Please see
+L<http://search.cpan.org/search?module=Digest::SHA256> for more information.
+
+ use DBM::Deep;
+ use Digest::SHA256;
+
+ my $context = Digest::SHA256::new(256);
+
+ my $db = DBM::Deep->new(
+ filename => "foo-sha.db",
+ digest => \&my_digest,
+ hash_size => 32,
+ );
+
+ $db->{key1} = "value1";
+ $db->{key2} = "value2";
+ print "key1: " . $db->{key1} . "\n";
+ print "key2: " . $db->{key2} . "\n";
+
+ undef $db;
+ exit;
+
+ sub my_digest {
+ return substr( $context->hash($_[0]), 0, 32 );
+ }
+
+B<Note:> Your returned digest strings must be B<EXACTLY> the number
+of bytes you specify in the hash_size parameter (in this case 32). Undefined
+behavior will occur otherwise.
+
+B<Note:> If you do choose to use a custom digest algorithm, you must set it
+every time you access this file. Otherwise, the default (MD5) will be used.
+
+=head1 PERFORMANCE
+
+Because DBM::Deep is a conncurrent datastore, every change is flushed to disk
+immediately and every read goes to disk. This means that DBM::Deep functions
+at the speed of disk (generally 10-20ms) vs. the speed of RAM (generally
+50-70ns), or at least 150-200x slower than the comparable in-memory
+datastructure in Perl.
+
+There are several techniques you can use to speed up how DBM::Deep functions.
+
+=over 4
+
+=item * Put it on a ramdisk
+
+The easiest and quickest mechanism to making DBM::Deep run faster is to create
+a ramdisk and locate the DBM::Deep file there. Doing this as an option may
+become a feature of DBM::Deep, assuming there is a good ramdisk wrapper on CPAN.
+
+=item * Work at the tightest level possible
+
+It is much faster to assign the level of your db that you are working with to
+an intermediate variable than to re-look it up every time. Thus
+
+ # BAD
+ while ( my ($k, $v) = each %{$db->{foo}{bar}{baz}} ) {
+ ...
+ }
+
+ # GOOD
+ my $x = $db->{foo}{bar}{baz};
+ while ( my ($k, $v) = each %$x ) {
+ ...
+ }
+
+=item * Make your file as tight as possible
+
+If you know that you are not going to use more than 65K in your database,
+consider using the C<pack_size =E<gt> 'small'> option. This will instruct
+DBM::Deep to use 16bit addresses, meaning that the seek times will be less.
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Engine.pm b/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Engine.pm
new file mode 100755
index 00000000000..fa04b4f3239
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Engine.pm
@@ -0,0 +1,2325 @@
+package DBM::Deep::Engine;
+
+use 5.006_000;
+
+use strict;
+use warnings;
+
+our $VERSION = q(1.0013);
+
+# Never import symbols into our namespace. We are a class, not a library.
+# -RobK, 2008-05-27
+use Scalar::Util ();
+
+#use Data::Dumper ();
+
+# File-wide notes:
+# * Every method in here assumes that the storage has been appropriately
+# safeguarded. This can be anything from flock() to some sort of manual
+# mutex. But, it's the caller's responsability to make sure that this has
+# been done.
+
+# Setup file and tag signatures. These should never change.
+sub SIG_FILE () { 'DPDB' }
+sub SIG_HEADER () { 'h' }
+sub SIG_HASH () { 'H' }
+sub SIG_ARRAY () { 'A' }
+sub SIG_NULL () { 'N' }
+sub SIG_DATA () { 'D' }
+sub SIG_INDEX () { 'I' }
+sub SIG_BLIST () { 'B' }
+sub SIG_FREE () { 'F' }
+sub SIG_SIZE () { 1 }
+
+my $STALE_SIZE = 2;
+
+# Please refer to the pack() documentation for further information
+my %StP = (
+ 1 => 'C', # Unsigned char value (no order needed as it's just one byte)
+ 2 => 'n', # Unsigned short in "network" (big-endian) order
+ 4 => 'N', # Unsigned long in "network" (big-endian) order
+ 8 => 'Q', # Usigned quad (no order specified, presumably machine-dependent)
+);
+
+################################################################################
+
+sub new {
+ my $class = shift;
+ my ($args) = @_;
+
+ my $self = bless {
+ byte_size => 4,
+
+ digest => undef,
+ hash_size => 16, # In bytes
+ hash_chars => 256, # Number of chars the algorithm uses per byte
+ max_buckets => 16,
+ num_txns => 1, # The HEAD
+ trans_id => 0, # Default to the HEAD
+
+ data_sector_size => 64, # Size in bytes of each data sector
+
+ entries => {}, # This is the list of entries for transactions
+ storage => undef,
+ }, $class;
+
+ # Never allow byte_size to be set directly.
+ delete $args->{byte_size};
+ if ( defined $args->{pack_size} ) {
+ if ( lc $args->{pack_size} eq 'small' ) {
+ $args->{byte_size} = 2;
+ }
+ elsif ( lc $args->{pack_size} eq 'medium' ) {
+ $args->{byte_size} = 4;
+ }
+ elsif ( lc $args->{pack_size} eq 'large' ) {
+ $args->{byte_size} = 8;
+ }
+ else {
+ DBM::Deep->_throw_error( "Unknown pack_size value: '$args->{pack_size}'" );
+ }
+ }
+
+ # Grab the parameters we want to use
+ foreach my $param ( keys %$self ) {
+ next unless exists $args->{$param};
+ $self->{$param} = $args->{$param};
+ }
+
+ my %validations = (
+ max_buckets => { floor => 16, ceil => 256 },
+ num_txns => { floor => 1, ceil => 255 },
+ data_sector_size => { floor => 32, ceil => 256 },
+ );
+
+ while ( my ($attr, $c) = each %validations ) {
+ if ( !defined $self->{$attr}
+ || !length $self->{$attr}
+ || $self->{$attr} =~ /\D/
+ || $self->{$attr} < $c->{floor}
+ ) {
+ $self->{$attr} = '(undef)' if !defined $self->{$attr};
+ warn "Floor of $attr is $c->{floor}. Setting it to $c->{floor} from '$self->{$attr}'\n";
+ $self->{$attr} = $c->{floor};
+ }
+ elsif ( $self->{$attr} > $c->{ceil} ) {
+ warn "Ceiling of $attr is $c->{ceil}. Setting it to $c->{ceil} from '$self->{$attr}'\n";
+ $self->{$attr} = $c->{ceil};
+ }
+ }
+
+ if ( !$self->{digest} ) {
+ require Digest::MD5;
+ $self->{digest} = \&Digest::MD5::md5;
+ }
+
+ return $self;
+}
+
+################################################################################
+
+sub read_value {
+ my $self = shift;
+ my ($obj, $key) = @_;
+
+ # This will be a Reference sector
+ my $sector = $self->_load_sector( $obj->_base_offset )
+ or return;
+
+ if ( $sector->staleness != $obj->_staleness ) {
+ return;
+ }
+
+ my $key_md5 = $self->_apply_digest( $key );
+
+ my $value_sector = $sector->get_data_for({
+ key_md5 => $key_md5,
+ allow_head => 1,
+ });
+
+ unless ( $value_sector ) {
+ $value_sector = DBM::Deep::Engine::Sector::Null->new({
+ engine => $self,
+ data => undef,
+ });
+
+ $sector->write_data({
+ key_md5 => $key_md5,
+ key => $key,
+ value => $value_sector,
+ });
+ }
+
+ return $value_sector->data;
+}
+
+sub get_classname {
+ my $self = shift;
+ my ($obj) = @_;
+
+ # This will be a Reference sector
+ my $sector = $self->_load_sector( $obj->_base_offset )
+ or DBM::Deep->_throw_error( "How did get_classname fail (no sector for '$obj')?!" );
+
+ if ( $sector->staleness != $obj->_staleness ) {
+ return;
+ }
+
+ return $sector->get_classname;
+}
+
+sub make_reference {
+ my $self = shift;
+ my ($obj, $old_key, $new_key) = @_;
+
+ # This will be a Reference sector
+ my $sector = $self->_load_sector( $obj->_base_offset )
+ or DBM::Deep->_throw_error( "How did get_classname fail (no sector for '$obj')?!" );
+
+ if ( $sector->staleness != $obj->_staleness ) {
+ return;
+ }
+
+ my $old_md5 = $self->_apply_digest( $old_key );
+
+ my $value_sector = $sector->get_data_for({
+ key_md5 => $old_md5,
+ allow_head => 1,
+ });
+
+ unless ( $value_sector ) {
+ $value_sector = DBM::Deep::Engine::Sector::Null->new({
+ engine => $self,
+ data => undef,
+ });
+
+ $sector->write_data({
+ key_md5 => $old_md5,
+ key => $old_key,
+ value => $value_sector,
+ });
+ }
+
+ if ( $value_sector->isa( 'DBM::Deep::Engine::Sector::Reference' ) ) {
+ $sector->write_data({
+ key => $new_key,
+ key_md5 => $self->_apply_digest( $new_key ),
+ value => $value_sector,
+ });
+ $value_sector->increment_refcount;
+ }
+ else {
+ $sector->write_data({
+ key => $new_key,
+ key_md5 => $self->_apply_digest( $new_key ),
+ value => $value_sector->clone,
+ });
+ }
+}
+
+sub key_exists {
+ my $self = shift;
+ my ($obj, $key) = @_;
+
+ # This will be a Reference sector
+ my $sector = $self->_load_sector( $obj->_base_offset )
+ or return '';
+
+ if ( $sector->staleness != $obj->_staleness ) {
+ return '';
+ }
+
+ my $data = $sector->get_data_for({
+ key_md5 => $self->_apply_digest( $key ),
+ allow_head => 1,
+ });
+
+ # exists() returns 1 or '' for true/false.
+ return $data ? 1 : '';
+}
+
+sub delete_key {
+ my $self = shift;
+ my ($obj, $key) = @_;
+
+ my $sector = $self->_load_sector( $obj->_base_offset )
+ or return;
+
+ if ( $sector->staleness != $obj->_staleness ) {
+ return;
+ }
+
+ return $sector->delete_key({
+ key_md5 => $self->_apply_digest( $key ),
+ allow_head => 0,
+ });
+}
+
+sub write_value {
+ my $self = shift;
+ my ($obj, $key, $value) = @_;
+
+ my $r = Scalar::Util::reftype( $value ) || '';
+ {
+ last if $r eq '';
+ last if $r eq 'HASH';
+ last if $r eq 'ARRAY';
+
+ DBM::Deep->_throw_error(
+ "Storage of references of type '$r' is not supported."
+ );
+ }
+
+ # This will be a Reference sector
+ my $sector = $self->_load_sector( $obj->_base_offset )
+ or DBM::Deep->_throw_error( "Cannot write to a deleted spot in DBM::Deep." );
+
+ if ( $sector->staleness != $obj->_staleness ) {
+ DBM::Deep->_throw_error( "Cannot write to a deleted spot in DBM::Deep." );
+ }
+
+ my ($class, $type);
+ if ( !defined $value ) {
+ $class = 'DBM::Deep::Engine::Sector::Null';
+ }
+ elsif ( $r eq 'ARRAY' || $r eq 'HASH' ) {
+ my $tmpvar;
+ if ( $r eq 'ARRAY' ) {
+ $tmpvar = tied @$value;
+ } elsif ( $r eq 'HASH' ) {
+ $tmpvar = tied %$value;
+ }
+
+ if ( $tmpvar ) {
+ my $is_dbm_deep = eval { local $SIG{'__DIE__'}; $tmpvar->isa( 'DBM::Deep' ); };
+
+ unless ( $is_dbm_deep ) {
+ DBM::Deep->_throw_error( "Cannot store something that is tied." );
+ }
+
+ unless ( $tmpvar->_engine->storage == $self->storage ) {
+ DBM::Deep->_throw_error( "Cannot store values across DBM::Deep files. Please use export() instead." );
+ }
+
+ # First, verify if we're storing the same thing to this spot. If we are, then
+ # this should be a no-op. -EJS, 2008-05-19
+ my $loc = $sector->get_data_location_for({
+ key_md5 => $self->_apply_digest( $key ),
+ allow_head => 1,
+ });
+
+ if ( defined($loc) && $loc == $tmpvar->_base_offset ) {
+ return 1;
+ }
+
+ #XXX Can this use $loc?
+ my $value_sector = $self->_load_sector( $tmpvar->_base_offset );
+ $sector->write_data({
+ key => $key,
+ key_md5 => $self->_apply_digest( $key ),
+ value => $value_sector,
+ });
+ $value_sector->increment_refcount;
+
+ return 1;
+ }
+
+ $class = 'DBM::Deep::Engine::Sector::Reference';
+ $type = substr( $r, 0, 1 );
+ }
+ else {
+ if ( tied($value) ) {
+ DBM::Deep->_throw_error( "Cannot store something that is tied." );
+ }
+ $class = 'DBM::Deep::Engine::Sector::Scalar';
+ }
+
+ # Create this after loading the reference sector in case something bad happens.
+ # This way, we won't allocate value sector(s) needlessly.
+ my $value_sector = $class->new({
+ engine => $self,
+ data => $value,
+ type => $type,
+ });
+
+ $sector->write_data({
+ key => $key,
+ key_md5 => $self->_apply_digest( $key ),
+ value => $value_sector,
+ });
+
+ # This code is to make sure we write all the values in the $value to the disk
+ # and to make sure all changes to $value after the assignment are reflected
+ # on disk. This may be counter-intuitive at first, but it is correct dwimmery.
+ # NOTE - simply tying $value won't perform a STORE on each value. Hence, the
+ # copy to a temp value.
+ if ( $r eq 'ARRAY' ) {
+ my @temp = @$value;
+ tie @$value, 'DBM::Deep', {
+ base_offset => $value_sector->offset,
+ staleness => $value_sector->staleness,
+ storage => $self->storage,
+ engine => $self,
+ };
+ @$value = @temp;
+ bless $value, 'DBM::Deep::Array' unless Scalar::Util::blessed( $value );
+ }
+ elsif ( $r eq 'HASH' ) {
+ my %temp = %$value;
+ tie %$value, 'DBM::Deep', {
+ base_offset => $value_sector->offset,
+ staleness => $value_sector->staleness,
+ storage => $self->storage,
+ engine => $self,
+ };
+
+ %$value = %temp;
+ bless $value, 'DBM::Deep::Hash' unless Scalar::Util::blessed( $value );
+ }
+
+ return 1;
+}
+
+# XXX Add staleness here
+sub get_next_key {
+ my $self = shift;
+ my ($obj, $prev_key) = @_;
+
+ # XXX Need to add logic about resetting the iterator if any key in the reference has changed
+ unless ( $prev_key ) {
+ $obj->{iterator} = DBM::Deep::Iterator->new({
+ base_offset => $obj->_base_offset,
+ engine => $self,
+ });
+ }
+
+ return $obj->{iterator}->get_next_key( $obj );
+}
+
+################################################################################
+
+sub setup_fh {
+ my $self = shift;
+ my ($obj) = @_;
+
+ # We're opening the file.
+ unless ( $obj->_base_offset ) {
+ my $bytes_read = $self->_read_file_header;
+
+ # Creating a new file
+ unless ( $bytes_read ) {
+ $self->_write_file_header;
+
+ # 1) Create Array/Hash entry
+ my $initial_reference = DBM::Deep::Engine::Sector::Reference->new({
+ engine => $self,
+ type => $obj->_type,
+ });
+ $obj->{base_offset} = $initial_reference->offset;
+ $obj->{staleness} = $initial_reference->staleness;
+
+ $self->storage->flush;
+ }
+ # Reading from an existing file
+ else {
+ $obj->{base_offset} = $bytes_read;
+ my $initial_reference = DBM::Deep::Engine::Sector::Reference->new({
+ engine => $self,
+ offset => $obj->_base_offset,
+ });
+ unless ( $initial_reference ) {
+ DBM::Deep->_throw_error("Corrupted file, no master index record");
+ }
+
+ unless ($obj->_type eq $initial_reference->type) {
+ DBM::Deep->_throw_error("File type mismatch");
+ }
+
+ $obj->{staleness} = $initial_reference->staleness;
+ }
+ }
+
+ return 1;
+}
+
+sub begin_work {
+ my $self = shift;
+ my ($obj) = @_;
+
+ if ( $self->trans_id ) {
+ DBM::Deep->_throw_error( "Cannot begin_work within an active transaction" );
+ }
+
+ my @slots = $self->read_txn_slots;
+ my $found;
+ for my $i ( 0 .. $#slots ) {
+ next if $slots[$i];
+
+ $slots[$i] = 1;
+ $self->set_trans_id( $i + 1 );
+ $found = 1;
+ last;
+ }
+ unless ( $found ) {
+ DBM::Deep->_throw_error( "Cannot allocate transaction ID" );
+ }
+ $self->write_txn_slots( @slots );
+
+ if ( !$self->trans_id ) {
+ DBM::Deep->_throw_error( "Cannot begin_work - no available transactions" );
+ }
+
+ return;
+}
+
+sub rollback {
+ my $self = shift;
+ my ($obj) = @_;
+
+ if ( !$self->trans_id ) {
+ DBM::Deep->_throw_error( "Cannot rollback without an active transaction" );
+ }
+
+ # Each entry is the file location for a bucket that has a modification for
+ # this transaction. The entries need to be expunged.
+ foreach my $entry (@{ $self->get_entries } ) {
+ # Remove the entry here
+ my $read_loc = $entry
+ + $self->hash_size
+ + $self->byte_size
+ + $self->byte_size
+ + ($self->trans_id - 1) * ( $self->byte_size + $STALE_SIZE );
+
+ my $data_loc = $self->storage->read_at( $read_loc, $self->byte_size );
+ $data_loc = unpack( $StP{$self->byte_size}, $data_loc );
+ $self->storage->print_at( $read_loc, pack( $StP{$self->byte_size}, 0 ) );
+
+ if ( $data_loc > 1 ) {
+ $self->_load_sector( $data_loc )->free;
+ }
+ }
+
+ $self->clear_entries;
+
+ my @slots = $self->read_txn_slots;
+ $slots[$self->trans_id-1] = 0;
+ $self->write_txn_slots( @slots );
+ $self->inc_txn_staleness_counter( $self->trans_id );
+ $self->set_trans_id( 0 );
+
+ return 1;
+}
+
+sub commit {
+ my $self = shift;
+ my ($obj) = @_;
+
+ if ( !$self->trans_id ) {
+ DBM::Deep->_throw_error( "Cannot commit without an active transaction" );
+ }
+
+ foreach my $entry (@{ $self->get_entries } ) {
+ # Overwrite the entry in head with the entry in trans_id
+ my $base = $entry
+ + $self->hash_size
+ + $self->byte_size;
+
+ my $head_loc = $self->storage->read_at( $base, $self->byte_size );
+ $head_loc = unpack( $StP{$self->byte_size}, $head_loc );
+
+ my $spot = $base + $self->byte_size + ($self->trans_id - 1) * ( $self->byte_size + $STALE_SIZE );
+ my $trans_loc = $self->storage->read_at(
+ $spot, $self->byte_size,
+ );
+
+ $self->storage->print_at( $base, $trans_loc );
+ $self->storage->print_at(
+ $spot,
+ pack( $StP{$self->byte_size} . ' ' . $StP{$STALE_SIZE}, (0) x 2 ),
+ );
+
+ if ( $head_loc > 1 ) {
+ $self->_load_sector( $head_loc )->free;
+ }
+ }
+
+ $self->clear_entries;
+
+ my @slots = $self->read_txn_slots;
+ $slots[$self->trans_id-1] = 0;
+ $self->write_txn_slots( @slots );
+ $self->inc_txn_staleness_counter( $self->trans_id );
+ $self->set_trans_id( 0 );
+
+ return 1;
+}
+
+sub read_txn_slots {
+ my $self = shift;
+ my $bl = $self->txn_bitfield_len;
+ my $num_bits = $bl * 8;
+ return split '', unpack( 'b'.$num_bits,
+ $self->storage->read_at(
+ $self->trans_loc, $bl,
+ )
+ );
+}
+
+sub write_txn_slots {
+ my $self = shift;
+ my $num_bits = $self->txn_bitfield_len * 8;
+ $self->storage->print_at( $self->trans_loc,
+ pack( 'b'.$num_bits, join('', @_) ),
+ );
+}
+
+sub get_running_txn_ids {
+ my $self = shift;
+ my @transactions = $self->read_txn_slots;
+ my @trans_ids = map { $_+1} grep { $transactions[$_] } 0 .. $#transactions;
+}
+
+sub get_txn_staleness_counter {
+ my $self = shift;
+ my ($trans_id) = @_;
+
+ # Hardcode staleness of 0 for the HEAD
+ return 0 unless $trans_id;
+
+ return unpack( $StP{$STALE_SIZE},
+ $self->storage->read_at(
+ $self->trans_loc + $self->txn_bitfield_len + $STALE_SIZE * ($trans_id - 1),
+ $STALE_SIZE,
+ )
+ );
+}
+
+sub inc_txn_staleness_counter {
+ my $self = shift;
+ my ($trans_id) = @_;
+
+ # Hardcode staleness of 0 for the HEAD
+ return 0 unless $trans_id;
+
+ $self->storage->print_at(
+ $self->trans_loc + $self->txn_bitfield_len + $STALE_SIZE * ($trans_id - 1),
+ pack( $StP{$STALE_SIZE}, $self->get_txn_staleness_counter( $trans_id ) + 1 ),
+ );
+}
+
+sub get_entries {
+ my $self = shift;
+ return [ keys %{ $self->{entries}{$self->trans_id} ||= {} } ];
+}
+
+sub add_entry {
+ my $self = shift;
+ my ($trans_id, $loc) = @_;
+
+ $self->{entries}{$trans_id} ||= {};
+ $self->{entries}{$trans_id}{$loc} = undef;
+}
+
+# If the buckets are being relocated because of a reindexing, the entries
+# mechanism needs to be made aware of it.
+sub reindex_entry {
+ my $self = shift;
+ my ($old_loc, $new_loc) = @_;
+
+ TRANS:
+ while ( my ($trans_id, $locs) = each %{ $self->{entries} } ) {
+ if ( exists $locs->{$old_loc} ) {
+ delete $locs->{$old_loc};
+ $locs->{$new_loc} = undef;
+ next TRANS;
+ }
+ }
+}
+
+sub clear_entries {
+ my $self = shift;
+ delete $self->{entries}{$self->trans_id};
+}
+
+################################################################################
+
+{
+ my $header_fixed = length( SIG_FILE ) + 1 + 4 + 4;
+ my $this_file_version = 3;
+
+ sub _write_file_header {
+ my $self = shift;
+
+ my $nt = $self->num_txns;
+ my $bl = $self->txn_bitfield_len;
+
+ my $header_var = 1 + 1 + 1 + 1 + $bl + $STALE_SIZE * ($nt - 1) + 3 * $self->byte_size;
+
+ my $loc = $self->storage->request_space( $header_fixed + $header_var );
+
+ $self->storage->print_at( $loc,
+ SIG_FILE,
+ SIG_HEADER,
+ pack('N', $this_file_version), # At this point, we're at 9 bytes
+ pack('N', $header_var), # header size
+ # --- Above is $header_fixed. Below is $header_var
+ pack('C', $self->byte_size),
+
+ # These shenanigans are to allow a 256 within a C
+ pack('C', $self->max_buckets - 1),
+ pack('C', $self->data_sector_size - 1),
+
+ pack('C', $nt),
+ pack('C' . $bl, 0 ), # Transaction activeness bitfield
+ pack($StP{$STALE_SIZE}.($nt-1), 0 x ($nt-1) ), # Transaction staleness counters
+ pack($StP{$self->byte_size}, 0), # Start of free chain (blist size)
+ pack($StP{$self->byte_size}, 0), # Start of free chain (data size)
+ pack($StP{$self->byte_size}, 0), # Start of free chain (index size)
+ );
+
+ #XXX Set these less fragilely
+ $self->set_trans_loc( $header_fixed + 4 );
+ $self->set_chains_loc( $header_fixed + 4 + $bl + $STALE_SIZE * ($nt-1) );
+
+ return;
+ }
+
+ sub _read_file_header {
+ my $self = shift;
+
+ my $buffer = $self->storage->read_at( 0, $header_fixed );
+ return unless length($buffer);
+
+ my ($file_signature, $sig_header, $file_version, $size) = unpack(
+ 'A4 A N N', $buffer
+ );
+
+ unless ( $file_signature eq SIG_FILE ) {
+ $self->storage->close;
+ DBM::Deep->_throw_error( "Signature not found -- file is not a Deep DB" );
+ }
+
+ unless ( $sig_header eq SIG_HEADER ) {
+ $self->storage->close;
+ DBM::Deep->_throw_error( "Pre-1.00 file version found" );
+ }
+
+ unless ( $file_version == $this_file_version ) {
+ $self->storage->close;
+ DBM::Deep->_throw_error(
+ "Wrong file version found - " . $file_version .
+ " - expected " . $this_file_version
+ );
+ }
+
+ my $buffer2 = $self->storage->read_at( undef, $size );
+ my @values = unpack( 'C C C C', $buffer2 );
+
+ if ( @values != 4 || grep { !defined } @values ) {
+ $self->storage->close;
+ DBM::Deep->_throw_error("Corrupted file - bad header");
+ }
+
+ #XXX Add warnings if values weren't set right
+ @{$self}{qw(byte_size max_buckets data_sector_size num_txns)} = @values;
+
+ # These shenangians are to allow a 256 within a C
+ $self->{max_buckets} += 1;
+ $self->{data_sector_size} += 1;
+
+ my $bl = $self->txn_bitfield_len;
+
+ my $header_var = scalar(@values) + $bl + $STALE_SIZE * ($self->num_txns - 1) + 3 * $self->byte_size;
+ unless ( $size == $header_var ) {
+ $self->storage->close;
+ DBM::Deep->_throw_error( "Unexpected size found ($size <-> $header_var)." );
+ }
+
+ $self->set_trans_loc( $header_fixed + scalar(@values) );
+ $self->set_chains_loc( $header_fixed + scalar(@values) + $bl + $STALE_SIZE * ($self->num_txns - 1) );
+
+ return length($buffer) + length($buffer2);
+ }
+}
+
+sub _load_sector {
+ my $self = shift;
+ my ($offset) = @_;
+
+ # Add a catch for offset of 0 or 1
+ return if !$offset || $offset <= 1;
+
+ my $type = $self->storage->read_at( $offset, 1 );
+ return if $type eq chr(0);
+
+ if ( $type eq $self->SIG_ARRAY || $type eq $self->SIG_HASH ) {
+ return DBM::Deep::Engine::Sector::Reference->new({
+ engine => $self,
+ type => $type,
+ offset => $offset,
+ });
+ }
+ # XXX Don't we need key_md5 here?
+ elsif ( $type eq $self->SIG_BLIST ) {
+ return DBM::Deep::Engine::Sector::BucketList->new({
+ engine => $self,
+ type => $type,
+ offset => $offset,
+ });
+ }
+ elsif ( $type eq $self->SIG_INDEX ) {
+ return DBM::Deep::Engine::Sector::Index->new({
+ engine => $self,
+ type => $type,
+ offset => $offset,
+ });
+ }
+ elsif ( $type eq $self->SIG_NULL ) {
+ return DBM::Deep::Engine::Sector::Null->new({
+ engine => $self,
+ type => $type,
+ offset => $offset,
+ });
+ }
+ elsif ( $type eq $self->SIG_DATA ) {
+ return DBM::Deep::Engine::Sector::Scalar->new({
+ engine => $self,
+ type => $type,
+ offset => $offset,
+ });
+ }
+ # This was deleted from under us, so just return and let the caller figure it out.
+ elsif ( $type eq $self->SIG_FREE ) {
+ return;
+ }
+
+ DBM::Deep->_throw_error( "'$offset': Don't know what to do with type '$type'" );
+}
+
+sub _apply_digest {
+ my $self = shift;
+ return $self->{digest}->(@_);
+}
+
+sub _add_free_blist_sector { shift->_add_free_sector( 0, @_ ) }
+sub _add_free_data_sector { shift->_add_free_sector( 1, @_ ) }
+sub _add_free_index_sector { shift->_add_free_sector( 2, @_ ) }
+
+sub _add_free_sector {
+ my $self = shift;
+ my ($multiple, $offset, $size) = @_;
+
+ my $chains_offset = $multiple * $self->byte_size;
+
+ my $storage = $self->storage;
+
+ # Increment staleness.
+ # XXX Can this increment+modulo be done by "&= 0x1" ?
+ my $staleness = unpack( $StP{$STALE_SIZE}, $storage->read_at( $offset + SIG_SIZE, $STALE_SIZE ) );
+ $staleness = ($staleness + 1 ) % ( 2 ** ( 8 * $STALE_SIZE ) );
+ $storage->print_at( $offset + SIG_SIZE, pack( $StP{$STALE_SIZE}, $staleness ) );
+
+ my $old_head = $storage->read_at( $self->chains_loc + $chains_offset, $self->byte_size );
+
+ $storage->print_at( $self->chains_loc + $chains_offset,
+ pack( $StP{$self->byte_size}, $offset ),
+ );
+
+ # Record the old head in the new sector after the signature and staleness counter
+ $storage->print_at( $offset + SIG_SIZE + $STALE_SIZE, $old_head );
+}
+
+sub _request_blist_sector { shift->_request_sector( 0, @_ ) }
+sub _request_data_sector { shift->_request_sector( 1, @_ ) }
+sub _request_index_sector { shift->_request_sector( 2, @_ ) }
+
+sub _request_sector {
+ my $self = shift;
+ my ($multiple, $size) = @_;
+
+ my $chains_offset = $multiple * $self->byte_size;
+
+ my $old_head = $self->storage->read_at( $self->chains_loc + $chains_offset, $self->byte_size );
+ my $loc = unpack( $StP{$self->byte_size}, $old_head );
+
+ # We don't have any free sectors of the right size, so allocate a new one.
+ unless ( $loc ) {
+ my $offset = $self->storage->request_space( $size );
+
+ # Zero out the new sector. This also guarantees correct increases
+ # in the filesize.
+ $self->storage->print_at( $offset, chr(0) x $size );
+
+ return $offset;
+ }
+
+ # Read the new head after the signature and the staleness counter
+ my $new_head = $self->storage->read_at( $loc + SIG_SIZE + $STALE_SIZE, $self->byte_size );
+ $self->storage->print_at( $self->chains_loc + $chains_offset, $new_head );
+ $self->storage->print_at(
+ $loc + SIG_SIZE + $STALE_SIZE,
+ pack( $StP{$self->byte_size}, 0 ),
+ );
+
+ return $loc;
+}
+
+################################################################################
+
+sub storage { $_[0]{storage} }
+sub byte_size { $_[0]{byte_size} }
+sub hash_size { $_[0]{hash_size} }
+sub hash_chars { $_[0]{hash_chars} }
+sub num_txns { $_[0]{num_txns} }
+sub max_buckets { $_[0]{max_buckets} }
+sub blank_md5 { chr(0) x $_[0]->hash_size }
+sub data_sector_size { $_[0]{data_sector_size} }
+
+# This is a calculated value
+sub txn_bitfield_len {
+ my $self = shift;
+ unless ( exists $self->{txn_bitfield_len} ) {
+ my $temp = ($self->num_txns) / 8;
+ if ( $temp > int( $temp ) ) {
+ $temp = int( $temp ) + 1;
+ }
+ $self->{txn_bitfield_len} = $temp;
+ }
+ return $self->{txn_bitfield_len};
+}
+
+sub trans_id { $_[0]{trans_id} }
+sub set_trans_id { $_[0]{trans_id} = $_[1] }
+
+sub trans_loc { $_[0]{trans_loc} }
+sub set_trans_loc { $_[0]{trans_loc} = $_[1] }
+
+sub chains_loc { $_[0]{chains_loc} }
+sub set_chains_loc { $_[0]{chains_loc} = $_[1] }
+
+sub cache { $_[0]{cache} ||= {} }
+sub clear_cache { %{$_[0]->cache} = () }
+
+sub _dump_file {
+ my $self = shift;
+
+ # Read the header
+ my $spot = $self->_read_file_header();
+
+ my %types = (
+ 0 => 'B',
+ 1 => 'D',
+ 2 => 'I',
+ );
+
+ my %sizes = (
+ 'D' => $self->data_sector_size,
+ 'B' => DBM::Deep::Engine::Sector::BucketList->new({engine=>$self,offset=>1})->size,
+ 'I' => DBM::Deep::Engine::Sector::Index->new({engine=>$self,offset=>1})->size,
+ );
+
+ my $return = "";
+
+ # Header values
+ $return .= "NumTxns: " . $self->num_txns . $/;
+
+ # Read the free sector chains
+ my %sectors;
+ foreach my $multiple ( 0 .. 2 ) {
+ $return .= "Chains($types{$multiple}):";
+ my $old_loc = $self->chains_loc + $multiple * $self->byte_size;
+ while ( 1 ) {
+ my $loc = unpack(
+ $StP{$self->byte_size},
+ $self->storage->read_at( $old_loc, $self->byte_size ),
+ );
+
+ # We're now out of free sectors of this kind.
+ unless ( $loc ) {
+ last;
+ }
+
+ $sectors{ $types{$multiple} }{ $loc } = undef;
+ $old_loc = $loc + SIG_SIZE + $STALE_SIZE;
+ $return .= " $loc";
+ }
+ $return .= $/;
+ }
+
+ SECTOR:
+ while ( $spot < $self->storage->{end} ) {
+ # Read each sector in order.
+ my $sector = $self->_load_sector( $spot );
+ if ( !$sector ) {
+ # Find it in the free-sectors that were found already
+ foreach my $type ( keys %sectors ) {
+ if ( exists $sectors{$type}{$spot} ) {
+ my $size = $sizes{$type};
+ $return .= sprintf "%08d: %s %04d\n", $spot, 'F' . $type, $size;
+ $spot += $size;
+ next SECTOR;
+ }
+ }
+
+ die "********\n$return\nDidn't find free sector for $spot in chains\n********\n";
+ }
+ else {
+ $return .= sprintf "%08d: %s %04d", $spot, $sector->type, $sector->size;
+ if ( $sector->type eq 'D' ) {
+ $return .= ' ' . $sector->data;
+ }
+ elsif ( $sector->type eq 'A' || $sector->type eq 'H' ) {
+ $return .= ' REF: ' . $sector->get_refcount;
+ }
+ elsif ( $sector->type eq 'B' ) {
+ foreach my $bucket ( $sector->chopped_up ) {
+ $return .= "\n ";
+ $return .= sprintf "%08d", unpack($StP{$self->byte_size},
+ substr( $bucket->[-1], $self->hash_size, $self->byte_size),
+ );
+ my $l = unpack( $StP{$self->byte_size},
+ substr( $bucket->[-1],
+ $self->hash_size + $self->byte_size,
+ $self->byte_size,
+ ),
+ );
+ $return .= sprintf " %08d", $l;
+ foreach my $txn ( 0 .. $self->num_txns - 2 ) {
+ my $l = unpack( $StP{$self->byte_size},
+ substr( $bucket->[-1],
+ $self->hash_size + 2 * $self->byte_size + $txn * ($self->byte_size + $STALE_SIZE),
+ $self->byte_size,
+ ),
+ );
+ $return .= sprintf " %08d", $l;
+ }
+ }
+ }
+ $return .= $/;
+
+ $spot += $sector->size;
+ }
+ }
+
+ return $return;
+}
+
+################################################################################
+
+package DBM::Deep::Iterator;
+
+sub new {
+ my $class = shift;
+ my ($args) = @_;
+
+ my $self = bless {
+ breadcrumbs => [],
+ engine => $args->{engine},
+ base_offset => $args->{base_offset},
+ }, $class;
+
+ Scalar::Util::weaken( $self->{engine} );
+
+ return $self;
+}
+
+sub reset { $_[0]{breadcrumbs} = [] }
+
+sub get_sector_iterator {
+ my $self = shift;
+ my ($loc) = @_;
+
+ my $sector = $self->{engine}->_load_sector( $loc )
+ or return;
+
+ if ( $sector->isa( 'DBM::Deep::Engine::Sector::Index' ) ) {
+ return DBM::Deep::Iterator::Index->new({
+ iterator => $self,
+ sector => $sector,
+ });
+ }
+ elsif ( $sector->isa( 'DBM::Deep::Engine::Sector::BucketList' ) ) {
+ return DBM::Deep::Iterator::BucketList->new({
+ iterator => $self,
+ sector => $sector,
+ });
+ }
+
+ DBM::Deep->_throw_error( "get_sector_iterator(): Why did $loc make a $sector?" );
+}
+
+sub get_next_key {
+ my $self = shift;
+ my ($obj) = @_;
+
+ my $crumbs = $self->{breadcrumbs};
+ my $e = $self->{engine};
+
+ unless ( @$crumbs ) {
+ # This will be a Reference sector
+ my $sector = $e->_load_sector( $self->{base_offset} )
+ # If no sector is found, thist must have been deleted from under us.
+ or return;
+
+ if ( $sector->staleness != $obj->_staleness ) {
+ return;
+ }
+
+ my $loc = $sector->get_blist_loc
+ or return;
+
+ push @$crumbs, $self->get_sector_iterator( $loc );
+ }
+
+ FIND_NEXT_KEY: {
+ # We're at the end.
+ unless ( @$crumbs ) {
+ $self->reset;
+ return;
+ }
+
+ my $iterator = $crumbs->[-1];
+
+ # This level is done.
+ if ( $iterator->at_end ) {
+ pop @$crumbs;
+ redo FIND_NEXT_KEY;
+ }
+
+ if ( $iterator->isa( 'DBM::Deep::Iterator::Index' ) ) {
+ # If we don't have any more, it will be caught at the
+ # prior check.
+ if ( my $next = $iterator->get_next_iterator ) {
+ push @$crumbs, $next;
+ }
+ redo FIND_NEXT_KEY;
+ }
+
+ unless ( $iterator->isa( 'DBM::Deep::Iterator::BucketList' ) ) {
+ DBM::Deep->_throw_error(
+ "Should have a bucketlist iterator here - instead have $iterator"
+ );
+ }
+
+ # At this point, we have a BucketList iterator
+ my $key = $iterator->get_next_key;
+ if ( defined $key ) {
+ return $key;
+ }
+ #XXX else { $iterator->set_to_end() } ?
+
+ # We hit the end of the bucketlist iterator, so redo
+ redo FIND_NEXT_KEY;
+ }
+
+ DBM::Deep->_throw_error( "get_next_key(): How did we get here?" );
+}
+
+package DBM::Deep::Iterator::Index;
+
+sub new {
+ my $self = bless $_[1] => $_[0];
+ $self->{curr_index} = 0;
+ return $self;
+}
+
+sub at_end {
+ my $self = shift;
+ return $self->{curr_index} >= $self->{iterator}{engine}->hash_chars;
+}
+
+sub get_next_iterator {
+ my $self = shift;
+
+ my $loc;
+ while ( !$loc ) {
+ return if $self->at_end;
+ $loc = $self->{sector}->get_entry( $self->{curr_index}++ );
+ }
+
+ return $self->{iterator}->get_sector_iterator( $loc );
+}
+
+package DBM::Deep::Iterator::BucketList;
+
+sub new {
+ my $self = bless $_[1] => $_[0];
+ $self->{curr_index} = 0;
+ return $self;
+}
+
+sub at_end {
+ my $self = shift;
+ return $self->{curr_index} >= $self->{iterator}{engine}->max_buckets;
+}
+
+sub get_next_key {
+ my $self = shift;
+
+ return if $self->at_end;
+
+ my $idx = $self->{curr_index}++;
+
+ my $data_loc = $self->{sector}->get_data_location_for({
+ allow_head => 1,
+ idx => $idx,
+ }) or return;
+
+ #XXX Do we want to add corruption checks here?
+ return $self->{sector}->get_key_for( $idx )->data;
+}
+
+package DBM::Deep::Engine::Sector;
+
+sub new {
+ my $self = bless $_[1], $_[0];
+ Scalar::Util::weaken( $self->{engine} );
+ $self->_init;
+ return $self;
+}
+
+#sub _init {}
+#sub clone { DBM::Deep->_throw_error( "Must be implemented in the child class" ); }
+
+sub engine { $_[0]{engine} }
+sub offset { $_[0]{offset} }
+sub type { $_[0]{type} }
+
+sub base_size {
+ my $self = shift;
+ return $self->engine->SIG_SIZE + $STALE_SIZE;
+}
+
+sub free {
+ my $self = shift;
+
+ my $e = $self->engine;
+
+ $e->storage->print_at( $self->offset, $e->SIG_FREE );
+ # Skip staleness counter
+ $e->storage->print_at( $self->offset + $self->base_size,
+ chr(0) x ($self->size - $self->base_size),
+ );
+
+ my $free_meth = $self->free_meth;
+ $e->$free_meth( $self->offset, $self->size );
+
+ return;
+}
+
+package DBM::Deep::Engine::Sector::Data;
+
+our @ISA = qw( DBM::Deep::Engine::Sector );
+
+# This is in bytes
+sub size { $_[0]{engine}->data_sector_size }
+sub free_meth { return '_add_free_data_sector' }
+
+sub clone {
+ my $self = shift;
+ return ref($self)->new({
+ engine => $self->engine,
+ type => $self->type,
+ data => $self->data,
+ });
+}
+
+package DBM::Deep::Engine::Sector::Scalar;
+
+our @ISA = qw( DBM::Deep::Engine::Sector::Data );
+
+sub free {
+ my $self = shift;
+
+ my $chain_loc = $self->chain_loc;
+
+ $self->SUPER::free();
+
+ if ( $chain_loc ) {
+ $self->engine->_load_sector( $chain_loc )->free;
+ }
+
+ return;
+}
+
+sub type { $_[0]{engine}->SIG_DATA }
+sub _init {
+ my $self = shift;
+
+ my $engine = $self->engine;
+
+ unless ( $self->offset ) {
+ my $data_section = $self->size - $self->base_size - $engine->byte_size - 1;
+
+ $self->{offset} = $engine->_request_data_sector( $self->size );
+
+ my $data = delete $self->{data};
+ my $dlen = length $data;
+ my $continue = 1;
+ my $curr_offset = $self->offset;
+ while ( $continue ) {
+
+ my $next_offset = 0;
+
+ my ($leftover, $this_len, $chunk);
+ if ( $dlen > $data_section ) {
+ $leftover = 0;
+ $this_len = $data_section;
+ $chunk = substr( $data, 0, $this_len );
+
+ $dlen -= $data_section;
+ $next_offset = $engine->_request_data_sector( $self->size );
+ $data = substr( $data, $this_len );
+ }
+ else {
+ $leftover = $data_section - $dlen;
+ $this_len = $dlen;
+ $chunk = $data;
+
+ $continue = 0;
+ }
+
+ $engine->storage->print_at( $curr_offset, $self->type ); # Sector type
+ # Skip staleness
+ $engine->storage->print_at( $curr_offset + $self->base_size,
+ pack( $StP{$engine->byte_size}, $next_offset ), # Chain loc
+ pack( $StP{1}, $this_len ), # Data length
+ $chunk, # Data to be stored in this sector
+ chr(0) x $leftover, # Zero-fill the rest
+ );
+
+ $curr_offset = $next_offset;
+ }
+
+ return;
+ }
+}
+
+sub data_length {
+ my $self = shift;
+
+ my $buffer = $self->engine->storage->read_at(
+ $self->offset + $self->base_size + $self->engine->byte_size, 1
+ );
+
+ return unpack( $StP{1}, $buffer );
+}
+
+sub chain_loc {
+ my $self = shift;
+ return unpack(
+ $StP{$self->engine->byte_size},
+ $self->engine->storage->read_at(
+ $self->offset + $self->base_size,
+ $self->engine->byte_size,
+ ),
+ );
+}
+
+sub data {
+ my $self = shift;
+# my ($args) = @_;
+# $args ||= {};
+
+ my $data;
+ while ( 1 ) {
+ my $chain_loc = $self->chain_loc;
+
+ $data .= $self->engine->storage->read_at(
+ $self->offset + $self->base_size + $self->engine->byte_size + 1, $self->data_length,
+ );
+
+ last unless $chain_loc;
+
+ $self = $self->engine->_load_sector( $chain_loc );
+ }
+
+ return $data;
+}
+
+package DBM::Deep::Engine::Sector::Null;
+
+our @ISA = qw( DBM::Deep::Engine::Sector::Data );
+
+sub type { $_[0]{engine}->SIG_NULL }
+sub data_length { 0 }
+sub data { return }
+
+sub _init {
+ my $self = shift;
+
+ my $engine = $self->engine;
+
+ unless ( $self->offset ) {
+ my $leftover = $self->size - $self->base_size - 1 * $engine->byte_size - 1;
+
+ $self->{offset} = $engine->_request_data_sector( $self->size );
+ $engine->storage->print_at( $self->offset, $self->type ); # Sector type
+ # Skip staleness counter
+ $engine->storage->print_at( $self->offset + $self->base_size,
+ pack( $StP{$engine->byte_size}, 0 ), # Chain loc
+ pack( $StP{1}, $self->data_length ), # Data length
+ chr(0) x $leftover, # Zero-fill the rest
+ );
+
+ return;
+ }
+}
+
+package DBM::Deep::Engine::Sector::Reference;
+
+our @ISA = qw( DBM::Deep::Engine::Sector::Data );
+
+sub _init {
+ my $self = shift;
+
+ my $e = $self->engine;
+
+ unless ( $self->offset ) {
+ my $classname = Scalar::Util::blessed( delete $self->{data} );
+ my $leftover = $self->size - $self->base_size - 3 * $e->byte_size;
+
+ my $class_offset = 0;
+ if ( defined $classname ) {
+ my $class_sector = DBM::Deep::Engine::Sector::Scalar->new({
+ engine => $e,
+ data => $classname,
+ });
+ $class_offset = $class_sector->offset;
+ }
+
+ $self->{offset} = $e->_request_data_sector( $self->size );
+ $e->storage->print_at( $self->offset, $self->type ); # Sector type
+ # Skip staleness counter
+ $e->storage->print_at( $self->offset + $self->base_size,
+ pack( $StP{$e->byte_size}, 0 ), # Index/BList loc
+ pack( $StP{$e->byte_size}, $class_offset ), # Classname loc
+ pack( $StP{$e->byte_size}, 1 ), # Initial refcount
+ chr(0) x $leftover, # Zero-fill the rest
+ );
+ }
+ else {
+ $self->{type} = $e->storage->read_at( $self->offset, 1 );
+ }
+
+ $self->{staleness} = unpack(
+ $StP{$STALE_SIZE},
+ $e->storage->read_at( $self->offset + $e->SIG_SIZE, $STALE_SIZE ),
+ );
+
+ return;
+}
+
+sub staleness { $_[0]{staleness} }
+
+sub get_data_location_for {
+ my $self = shift;
+ my ($args) = @_;
+
+ # Assume that the head is not allowed unless otherwise specified.
+ $args->{allow_head} = 0 unless exists $args->{allow_head};
+
+ # Assume we don't create a new blist location unless otherwise specified.
+ $args->{create} = 0 unless exists $args->{create};
+
+ my $blist = $self->get_bucket_list({
+ key_md5 => $args->{key_md5},
+ key => $args->{key},
+ create => $args->{create},
+ });
+ return unless $blist && $blist->{found};
+
+ # At this point, $blist knows where the md5 is. What it -doesn't- know yet
+ # is whether or not this transaction has this key. That's part of the next
+ # function call.
+ my $location = $blist->get_data_location_for({
+ allow_head => $args->{allow_head},
+ }) or return;
+
+ return $location;
+}
+
+sub get_data_for {
+ my $self = shift;
+ my ($args) = @_;
+
+ my $location = $self->get_data_location_for( $args )
+ or return;
+
+ return $self->engine->_load_sector( $location );
+}
+
+sub write_data {
+ my $self = shift;
+ my ($args) = @_;
+
+ my $blist = $self->get_bucket_list({
+ key_md5 => $args->{key_md5},
+ key => $args->{key},
+ create => 1,
+ }) or DBM::Deep->_throw_error( "How did write_data fail (no blist)?!" );
+
+ # Handle any transactional bookkeeping.
+ if ( $self->engine->trans_id ) {
+ if ( ! $blist->has_md5 ) {
+ $blist->mark_deleted({
+ trans_id => 0,
+ });
+ }
+ }
+ else {
+ my @trans_ids = $self->engine->get_running_txn_ids;
+ if ( $blist->has_md5 ) {
+ if ( @trans_ids ) {
+ my $old_value = $blist->get_data_for;
+ foreach my $other_trans_id ( @trans_ids ) {
+ next if $blist->get_data_location_for({
+ trans_id => $other_trans_id,
+ allow_head => 0,
+ });
+ $blist->write_md5({
+ trans_id => $other_trans_id,
+ key => $args->{key},
+ key_md5 => $args->{key_md5},
+ value => $old_value->clone,
+ });
+ }
+ }
+ }
+ else {
+ if ( @trans_ids ) {
+ foreach my $other_trans_id ( @trans_ids ) {
+ #XXX This doesn't seem to possible to ever happen . . .
+ next if $blist->get_data_location_for({ trans_id => $other_trans_id, allow_head => 0 });
+ $blist->mark_deleted({
+ trans_id => $other_trans_id,
+ });
+ }
+ }
+ }
+ }
+
+ #XXX Is this safe to do transactionally?
+ # Free the place we're about to write to.
+ if ( $blist->get_data_location_for({ allow_head => 0 }) ) {
+ $blist->get_data_for({ allow_head => 0 })->free;
+ }
+
+ $blist->write_md5({
+ key => $args->{key},
+ key_md5 => $args->{key_md5},
+ value => $args->{value},
+ });
+}
+
+sub delete_key {
+ my $self = shift;
+ my ($args) = @_;
+
+ # XXX What should happen if this fails?
+ my $blist = $self->get_bucket_list({
+ key_md5 => $args->{key_md5},
+ }) or DBM::Deep->_throw_error( "How did delete_key fail (no blist)?!" );
+
+ # Save the location so that we can free the data
+ my $location = $blist->get_data_location_for({
+ allow_head => 0,
+ });
+ my $old_value = $location && $self->engine->_load_sector( $location );
+
+ my @trans_ids = $self->engine->get_running_txn_ids;
+
+ # If we're the HEAD and there are running txns, then we need to clone this value to the other
+ # transactions to preserve Isolation.
+ if ( $self->engine->trans_id == 0 ) {
+ if ( @trans_ids ) {
+ foreach my $other_trans_id ( @trans_ids ) {
+ next if $blist->get_data_location_for({ trans_id => $other_trans_id, allow_head => 0 });
+ $blist->write_md5({
+ trans_id => $other_trans_id,
+ key => $args->{key},
+ key_md5 => $args->{key_md5},
+ value => $old_value->clone,
+ });
+ }
+ }
+ }
+
+ my $data;
+ if ( @trans_ids ) {
+ $blist->mark_deleted( $args );
+
+ if ( $old_value ) {
+ $data = $old_value->data({ export => 1 });
+ $old_value->free;
+ }
+ }
+ else {
+ $data = $blist->delete_md5( $args );
+ }
+
+ return $data;
+}
+
+sub get_blist_loc {
+ my $self = shift;
+
+ my $e = $self->engine;
+ my $blist_loc = $e->storage->read_at( $self->offset + $self->base_size, $e->byte_size );
+ return unpack( $StP{$e->byte_size}, $blist_loc );
+}
+
+sub get_bucket_list {
+ my $self = shift;
+ my ($args) = @_;
+ $args ||= {};
+
+ # XXX Add in check here for recycling?
+
+ my $engine = $self->engine;
+
+ my $blist_loc = $self->get_blist_loc;
+
+ # There's no index or blist yet
+ unless ( $blist_loc ) {
+ return unless $args->{create};
+
+ my $blist = DBM::Deep::Engine::Sector::BucketList->new({
+ engine => $engine,
+ key_md5 => $args->{key_md5},
+ });
+
+ $engine->storage->print_at( $self->offset + $self->base_size,
+ pack( $StP{$engine->byte_size}, $blist->offset ),
+ );
+
+ return $blist;
+ }
+
+ my $sector = $engine->_load_sector( $blist_loc )
+ or DBM::Deep->_throw_error( "Cannot read sector at $blist_loc in get_bucket_list()" );
+ my $i = 0;
+ my $last_sector = undef;
+ while ( $sector->isa( 'DBM::Deep::Engine::Sector::Index' ) ) {
+ $blist_loc = $sector->get_entry( ord( substr( $args->{key_md5}, $i++, 1 ) ) );
+ $last_sector = $sector;
+ if ( $blist_loc ) {
+ $sector = $engine->_load_sector( $blist_loc )
+ or DBM::Deep->_throw_error( "Cannot read sector at $blist_loc in get_bucket_list()" );
+ }
+ else {
+ $sector = undef;
+ last;
+ }
+ }
+
+ # This means we went through the Index sector(s) and found an empty slot
+ unless ( $sector ) {
+ return unless $args->{create};
+
+ DBM::Deep->_throw_error( "No last_sector when attempting to build a new entry" )
+ unless $last_sector;
+
+ my $blist = DBM::Deep::Engine::Sector::BucketList->new({
+ engine => $engine,
+ key_md5 => $args->{key_md5},
+ });
+
+ $last_sector->set_entry( ord( substr( $args->{key_md5}, $i - 1, 1 ) ) => $blist->offset );
+
+ return $blist;
+ }
+
+ $sector->find_md5( $args->{key_md5} );
+
+ # See whether or not we need to reindex the bucketlist
+ # Yes, the double-braces are there for a reason. if() doesn't create a redo-able block,
+ # so we have to create a bare block within the if() for redo-purposes. Patch and idea
+ # submitted by sprout@cpan.org. -RobK, 2008-01-09
+ if ( !$sector->has_md5 && $args->{create} && $sector->{idx} == -1 ) {{
+ my $redo;
+
+ my $new_index = DBM::Deep::Engine::Sector::Index->new({
+ engine => $engine,
+ });
+
+ my %blist_cache;
+ #XXX q.v. the comments for this function.
+ foreach my $entry ( $sector->chopped_up ) {
+ my ($spot, $md5) = @{$entry};
+ my $idx = ord( substr( $md5, $i, 1 ) );
+
+ # XXX This is inefficient
+ my $blist = $blist_cache{$idx}
+ ||= DBM::Deep::Engine::Sector::BucketList->new({
+ engine => $engine,
+ });
+
+ $new_index->set_entry( $idx => $blist->offset );
+
+ my $new_spot = $blist->write_at_next_open( $md5 );
+ $engine->reindex_entry( $spot => $new_spot );
+ }
+
+ # Handle the new item separately.
+ {
+ my $idx = ord( substr( $args->{key_md5}, $i, 1 ) );
+
+ # If all the previous blist's items have been thrown into one
+ # blist and the new item belongs in there too, we need
+ # another index.
+ if ( keys %blist_cache == 1 and each %blist_cache == $idx ) {
+ ++$i, ++$redo;
+ } else {
+ my $blist = $blist_cache{$idx}
+ ||= DBM::Deep::Engine::Sector::BucketList->new({
+ engine => $engine,
+ });
+
+ $new_index->set_entry( $idx => $blist->offset );
+
+ #XXX THIS IS HACKY!
+ $blist->find_md5( $args->{key_md5} );
+ $blist->write_md5({
+ key => $args->{key},
+ key_md5 => $args->{key_md5},
+ value => DBM::Deep::Engine::Sector::Null->new({
+ engine => $engine,
+ data => undef,
+ }),
+ });
+ }
+# my $blist = $blist_cache{$idx}
+# ||= DBM::Deep::Engine::Sector::BucketList->new({
+# engine => $engine,
+# });
+#
+# $new_index->set_entry( $idx => $blist->offset );
+#
+# #XXX THIS IS HACKY!
+# $blist->find_md5( $args->{key_md5} );
+# $blist->write_md5({
+# key => $args->{key},
+# key_md5 => $args->{key_md5},
+# value => DBM::Deep::Engine::Sector::Null->new({
+# engine => $engine,
+# data => undef,
+# }),
+# });
+ }
+
+ if ( $last_sector ) {
+ $last_sector->set_entry(
+ ord( substr( $args->{key_md5}, $i - 1, 1 ) ),
+ $new_index->offset,
+ );
+ } else {
+ $engine->storage->print_at( $self->offset + $self->base_size,
+ pack( $StP{$engine->byte_size}, $new_index->offset ),
+ );
+ }
+
+ $sector->clear;
+ $sector->free;
+
+ if ( $redo ) {
+ (undef, $sector) = %blist_cache;
+ $last_sector = $new_index;
+ redo;
+ }
+
+ $sector = $blist_cache{ ord( substr( $args->{key_md5}, $i, 1 ) ) };
+ $sector->find_md5( $args->{key_md5} );
+ }}
+
+ return $sector;
+}
+
+sub get_class_offset {
+ my $self = shift;
+
+ my $e = $self->engine;
+ return unpack(
+ $StP{$e->byte_size},
+ $e->storage->read_at(
+ $self->offset + $self->base_size + 1 * $e->byte_size, $e->byte_size,
+ ),
+ );
+}
+
+sub get_classname {
+ my $self = shift;
+
+ my $class_offset = $self->get_class_offset;
+
+ return unless $class_offset;
+
+ return $self->engine->_load_sector( $class_offset )->data;
+}
+
+sub data {
+ my $self = shift;
+ my ($args) = @_;
+ $args ||= {};
+
+ my $obj;
+ unless ( $obj = $self->engine->cache->{ $self->offset } ) {
+ $obj = DBM::Deep->new({
+ type => $self->type,
+ base_offset => $self->offset,
+ staleness => $self->staleness,
+ storage => $self->engine->storage,
+ engine => $self->engine,
+ });
+
+ if ( $self->engine->storage->{autobless} ) {
+ my $classname = $self->get_classname;
+ if ( defined $classname ) {
+ bless $obj, $classname;
+ }
+ }
+
+ $self->engine->cache->{$self->offset} = $obj;
+ }
+
+ # We're not exporting, so just return.
+ unless ( $args->{export} ) {
+ return $obj;
+ }
+
+ # We shouldn't export if this is still referred to.
+ if ( $self->get_refcount > 1 ) {
+ return $obj;
+ }
+
+ return $obj->export;
+}
+
+sub free {
+ my $self = shift;
+
+ # We're not ready to be removed yet.
+ if ( $self->decrement_refcount > 0 ) {
+ return;
+ }
+
+ # Rebless the object into DBM::Deep::Null.
+ eval { %{ $self->engine->cache->{ $self->offset } } = (); };
+ eval { @{ $self->engine->cache->{ $self->offset } } = (); };
+ bless $self->engine->cache->{ $self->offset }, 'DBM::Deep::Null';
+ delete $self->engine->cache->{ $self->offset };
+
+ my $blist_loc = $self->get_blist_loc;
+ $self->engine->_load_sector( $blist_loc )->free if $blist_loc;
+
+ my $class_loc = $self->get_class_offset;
+ $self->engine->_load_sector( $class_loc )->free if $class_loc;
+
+ $self->SUPER::free();
+}
+
+sub increment_refcount {
+ my $self = shift;
+
+ my $refcount = $self->get_refcount;
+
+ $refcount++;
+
+ $self->write_refcount( $refcount );
+
+ return $refcount;
+}
+
+sub decrement_refcount {
+ my $self = shift;
+
+ my $refcount = $self->get_refcount;
+
+ $refcount--;
+
+ $self->write_refcount( $refcount );
+
+ return $refcount;
+}
+
+sub get_refcount {
+ my $self = shift;
+
+ my $e = $self->engine;
+ return unpack(
+ $StP{$e->byte_size},
+ $e->storage->read_at(
+ $self->offset + $self->base_size + 2 * $e->byte_size, $e->byte_size,
+ ),
+ );
+}
+
+sub write_refcount {
+ my $self = shift;
+ my ($num) = @_;
+
+ my $e = $self->engine;
+ $e->storage->print_at(
+ $self->offset + $self->base_size + 2 * $e->byte_size,
+ pack( $StP{$e->byte_size}, $num ),
+ );
+}
+
+package DBM::Deep::Engine::Sector::BucketList;
+
+our @ISA = qw( DBM::Deep::Engine::Sector );
+
+sub _init {
+ my $self = shift;
+
+ my $engine = $self->engine;
+
+ unless ( $self->offset ) {
+ my $leftover = $self->size - $self->base_size;
+
+ $self->{offset} = $engine->_request_blist_sector( $self->size );
+ $engine->storage->print_at( $self->offset, $engine->SIG_BLIST ); # Sector type
+ # Skip staleness counter
+ $engine->storage->print_at( $self->offset + $self->base_size,
+ chr(0) x $leftover, # Zero-fill the data
+ );
+ }
+
+ if ( $self->{key_md5} ) {
+ $self->find_md5;
+ }
+
+ return $self;
+}
+
+sub clear {
+ my $self = shift;
+ $self->engine->storage->print_at( $self->offset + $self->base_size,
+ chr(0) x ($self->size - $self->base_size), # Zero-fill the data
+ );
+}
+
+sub size {
+ my $self = shift;
+ unless ( $self->{size} ) {
+ my $e = $self->engine;
+ # Base + numbuckets * bucketsize
+ $self->{size} = $self->base_size + $e->max_buckets * $self->bucket_size;
+ }
+ return $self->{size};
+}
+
+sub free_meth { return '_add_free_blist_sector' }
+
+sub free {
+ my $self = shift;
+
+ my $e = $self->engine;
+ foreach my $bucket ( $self->chopped_up ) {
+ my $rest = $bucket->[-1];
+
+ # Delete the keysector
+ my $l = unpack( $StP{$e->byte_size}, substr( $rest, $e->hash_size, $e->byte_size ) );
+ my $s = $e->_load_sector( $l ); $s->free if $s;
+
+ # Delete the HEAD sector
+ $l = unpack( $StP{$e->byte_size},
+ substr( $rest,
+ $e->hash_size + $e->byte_size,
+ $e->byte_size,
+ ),
+ );
+ $s = $e->_load_sector( $l ); $s->free if $s;
+
+ foreach my $txn ( 0 .. $e->num_txns - 2 ) {
+ my $l = unpack( $StP{$e->byte_size},
+ substr( $rest,
+ $e->hash_size + 2 * $e->byte_size + $txn * ($e->byte_size + $STALE_SIZE),
+ $e->byte_size,
+ ),
+ );
+ my $s = $e->_load_sector( $l ); $s->free if $s;
+ }
+ }
+
+ $self->SUPER::free();
+}
+
+sub bucket_size {
+ my $self = shift;
+ unless ( $self->{bucket_size} ) {
+ my $e = $self->engine;
+ # Key + head (location) + transactions (location + staleness-counter)
+ my $location_size = $e->byte_size + $e->byte_size + ($e->num_txns - 1) * ($e->byte_size + $STALE_SIZE);
+ $self->{bucket_size} = $e->hash_size + $location_size;
+ }
+ return $self->{bucket_size};
+}
+
+# XXX This is such a poor hack. I need to rethink this code.
+sub chopped_up {
+ my $self = shift;
+
+ my $e = $self->engine;
+
+ my @buckets;
+ foreach my $idx ( 0 .. $e->max_buckets - 1 ) {
+ my $spot = $self->offset + $self->base_size + $idx * $self->bucket_size;
+ my $md5 = $e->storage->read_at( $spot, $e->hash_size );
+
+ #XXX If we're chopping, why would we ever have the blank_md5?
+ last if $md5 eq $e->blank_md5;
+
+ my $rest = $e->storage->read_at( undef, $self->bucket_size - $e->hash_size );
+ push @buckets, [ $spot, $md5 . $rest ];
+ }
+
+ return @buckets;
+}
+
+sub write_at_next_open {
+ my $self = shift;
+ my ($entry) = @_;
+
+ #XXX This is such a hack!
+ $self->{_next_open} = 0 unless exists $self->{_next_open};
+
+ my $spot = $self->offset + $self->base_size + $self->{_next_open}++ * $self->bucket_size;
+ $self->engine->storage->print_at( $spot, $entry );
+
+ return $spot;
+}
+
+sub has_md5 {
+ my $self = shift;
+ unless ( exists $self->{found} ) {
+ $self->find_md5;
+ }
+ return $self->{found};
+}
+
+sub find_md5 {
+ my $self = shift;
+
+ $self->{found} = undef;
+ $self->{idx} = -1;
+
+ if ( @_ ) {
+ $self->{key_md5} = shift;
+ }
+
+ # If we don't have an MD5, then what are we supposed to do?
+ unless ( exists $self->{key_md5} ) {
+ DBM::Deep->_throw_error( "Cannot find_md5 without a key_md5 set" );
+ }
+
+ my $e = $self->engine;
+ foreach my $idx ( 0 .. $e->max_buckets - 1 ) {
+ my $potential = $e->storage->read_at(
+ $self->offset + $self->base_size + $idx * $self->bucket_size, $e->hash_size,
+ );
+
+ if ( $potential eq $e->blank_md5 ) {
+ $self->{idx} = $idx;
+ return;
+ }
+
+ if ( $potential eq $self->{key_md5} ) {
+ $self->{found} = 1;
+ $self->{idx} = $idx;
+ return;
+ }
+ }
+
+ return;
+}
+
+sub write_md5 {
+ my $self = shift;
+ my ($args) = @_;
+
+ DBM::Deep->_throw_error( "write_md5: no key" ) unless exists $args->{key};
+ DBM::Deep->_throw_error( "write_md5: no key_md5" ) unless exists $args->{key_md5};
+ DBM::Deep->_throw_error( "write_md5: no value" ) unless exists $args->{value};
+
+ my $engine = $self->engine;
+
+ $args->{trans_id} = $engine->trans_id unless exists $args->{trans_id};
+
+ my $spot = $self->offset + $self->base_size + $self->{idx} * $self->bucket_size;
+ $engine->add_entry( $args->{trans_id}, $spot );
+
+ unless ($self->{found}) {
+ my $key_sector = DBM::Deep::Engine::Sector::Scalar->new({
+ engine => $engine,
+ data => $args->{key},
+ });
+
+ $engine->storage->print_at( $spot,
+ $args->{key_md5},
+ pack( $StP{$engine->byte_size}, $key_sector->offset ),
+ );
+ }
+
+ my $loc = $spot
+ + $engine->hash_size
+ + $engine->byte_size;
+
+ if ( $args->{trans_id} ) {
+ $loc += $engine->byte_size + ($args->{trans_id} - 1) * ( $engine->byte_size + $STALE_SIZE );
+
+ $engine->storage->print_at( $loc,
+ pack( $StP{$engine->byte_size}, $args->{value}->offset ),
+ pack( $StP{$STALE_SIZE}, $engine->get_txn_staleness_counter( $args->{trans_id} ) ),
+ );
+ }
+ else {
+ $engine->storage->print_at( $loc,
+ pack( $StP{$engine->byte_size}, $args->{value}->offset ),
+ );
+ }
+}
+
+sub mark_deleted {
+ my $self = shift;
+ my ($args) = @_;
+ $args ||= {};
+
+ my $engine = $self->engine;
+
+ $args->{trans_id} = $engine->trans_id unless exists $args->{trans_id};
+
+ my $spot = $self->offset + $self->base_size + $self->{idx} * $self->bucket_size;
+ $engine->add_entry( $args->{trans_id}, $spot );
+
+ my $loc = $spot
+ + $engine->hash_size
+ + $engine->byte_size;
+
+ if ( $args->{trans_id} ) {
+ $loc += $engine->byte_size + ($args->{trans_id} - 1) * ( $engine->byte_size + $STALE_SIZE );
+
+ $engine->storage->print_at( $loc,
+ pack( $StP{$engine->byte_size}, 1 ), # 1 is the marker for deleted
+ pack( $StP{$STALE_SIZE}, $engine->get_txn_staleness_counter( $args->{trans_id} ) ),
+ );
+ }
+ else {
+ $engine->storage->print_at( $loc,
+ pack( $StP{$engine->byte_size}, 1 ), # 1 is the marker for deleted
+ );
+ }
+
+}
+
+sub delete_md5 {
+ my $self = shift;
+ my ($args) = @_;
+
+ my $engine = $self->engine;
+ return undef unless $self->{found};
+
+ # Save the location so that we can free the data
+ my $location = $self->get_data_location_for({
+ allow_head => 0,
+ });
+ my $key_sector = $self->get_key_for;
+
+ my $spot = $self->offset + $self->base_size + $self->{idx} * $self->bucket_size;
+ $engine->storage->print_at( $spot,
+ $engine->storage->read_at(
+ $spot + $self->bucket_size,
+ $self->bucket_size * ( $engine->max_buckets - $self->{idx} - 1 ),
+ ),
+ chr(0) x $self->bucket_size,
+ );
+
+ $key_sector->free;
+
+ my $data_sector = $self->engine->_load_sector( $location );
+ my $data = $data_sector->data({ export => 1 });
+ $data_sector->free;
+
+ return $data;
+}
+
+sub get_data_location_for {
+ my $self = shift;
+ my ($args) = @_;
+ $args ||= {};
+
+ $args->{allow_head} = 0 unless exists $args->{allow_head};
+ $args->{trans_id} = $self->engine->trans_id unless exists $args->{trans_id};
+ $args->{idx} = $self->{idx} unless exists $args->{idx};
+
+ my $e = $self->engine;
+
+ my $spot = $self->offset + $self->base_size
+ + $args->{idx} * $self->bucket_size
+ + $e->hash_size
+ + $e->byte_size;
+
+ if ( $args->{trans_id} ) {
+ $spot += $e->byte_size + ($args->{trans_id} - 1) * ( $e->byte_size + $STALE_SIZE );
+ }
+
+ my $buffer = $e->storage->read_at(
+ $spot,
+ $e->byte_size + $STALE_SIZE,
+ );
+ my ($loc, $staleness) = unpack( $StP{$e->byte_size} . ' ' . $StP{$STALE_SIZE}, $buffer );
+
+ # XXX Merge the two if-clauses below
+ if ( $args->{trans_id} ) {
+ # We have found an entry that is old, so get rid of it
+ if ( $staleness != (my $s = $e->get_txn_staleness_counter( $args->{trans_id} ) ) ) {
+ $e->storage->print_at(
+ $spot,
+ pack( $StP{$e->byte_size} . ' ' . $StP{$STALE_SIZE}, (0) x 2 ),
+ );
+ $loc = 0;
+ }
+ }
+
+ # If we're in a transaction and we never wrote to this location, try the
+ # HEAD instead.
+ if ( $args->{trans_id} && !$loc && $args->{allow_head} ) {
+ return $self->get_data_location_for({
+ trans_id => 0,
+ allow_head => 1,
+ idx => $args->{idx},
+ });
+ }
+
+ return $loc <= 1 ? 0 : $loc;
+}
+
+sub get_data_for {
+ my $self = shift;
+ my ($args) = @_;
+ $args ||= {};
+
+ return unless $self->{found};
+ my $location = $self->get_data_location_for({
+ allow_head => $args->{allow_head},
+ });
+ return $self->engine->_load_sector( $location );
+}
+
+sub get_key_for {
+ my $self = shift;
+ my ($idx) = @_;
+ $idx = $self->{idx} unless defined $idx;
+
+ if ( $idx >= $self->engine->max_buckets ) {
+ DBM::Deep->_throw_error( "get_key_for(): Attempting to retrieve $idx" );
+ }
+
+ my $location = $self->engine->storage->read_at(
+ $self->offset + $self->base_size + $idx * $self->bucket_size + $self->engine->hash_size,
+ $self->engine->byte_size,
+ );
+ $location = unpack( $StP{$self->engine->byte_size}, $location );
+ DBM::Deep->_throw_error( "get_key_for: No location?" ) unless $location;
+
+ return $self->engine->_load_sector( $location );
+}
+
+package DBM::Deep::Engine::Sector::Index;
+
+our @ISA = qw( DBM::Deep::Engine::Sector );
+
+sub _init {
+ my $self = shift;
+
+ my $engine = $self->engine;
+
+ unless ( $self->offset ) {
+ my $leftover = $self->size - $self->base_size;
+
+ $self->{offset} = $engine->_request_index_sector( $self->size );
+ $engine->storage->print_at( $self->offset, $engine->SIG_INDEX ); # Sector type
+ # Skip staleness counter
+ $engine->storage->print_at( $self->offset + $self->base_size,
+ chr(0) x $leftover, # Zero-fill the rest
+ );
+ }
+
+ return $self;
+}
+
+#XXX Change here
+sub size {
+ my $self = shift;
+ unless ( $self->{size} ) {
+ my $e = $self->engine;
+ $self->{size} = $self->base_size + $e->byte_size * $e->hash_chars;
+ }
+ return $self->{size};
+}
+
+sub free_meth { return '_add_free_index_sector' }
+
+sub free {
+ my $self = shift;
+ my $e = $self->engine;
+
+ for my $i ( 0 .. $e->hash_chars - 1 ) {
+ my $l = $self->get_entry( $i ) or next;
+ $e->_load_sector( $l )->free;
+ }
+
+ $self->SUPER::free();
+}
+
+sub _loc_for {
+ my $self = shift;
+ my ($idx) = @_;
+ return $self->offset + $self->base_size + $idx * $self->engine->byte_size;
+}
+
+sub get_entry {
+ my $self = shift;
+ my ($idx) = @_;
+
+ my $e = $self->engine;
+
+ DBM::Deep->_throw_error( "get_entry: Out of range ($idx)" )
+ if $idx < 0 || $idx >= $e->hash_chars;
+
+ return unpack(
+ $StP{$e->byte_size},
+ $e->storage->read_at( $self->_loc_for( $idx ), $e->byte_size ),
+ );
+}
+
+sub set_entry {
+ my $self = shift;
+ my ($idx, $loc) = @_;
+
+ my $e = $self->engine;
+
+ DBM::Deep->_throw_error( "set_entry: Out of range ($idx)" )
+ if $idx < 0 || $idx >= $e->hash_chars;
+
+ $self->engine->storage->print_at(
+ $self->_loc_for( $idx ),
+ pack( $StP{$e->byte_size}, $loc ),
+ );
+}
+
+# This was copied from MARCEL's Class::Null. However, I couldn't use it because
+# I need an undef value, not an implementation of the Null Class pattern.
+package DBM::Deep::Null;
+
+use overload
+ 'bool' => sub { undef },
+ '""' => sub { undef },
+ '0+' => sub { undef },
+ fallback => 1,
+ nomethod => 'AUTOLOAD';
+
+sub AUTOLOAD { return; }
+
+1;
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM/Deep/File.pm b/Master/tlpkg/tlperl.straw/lib/DBM/Deep/File.pm
new file mode 100755
index 00000000000..13342d82465
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM/Deep/File.pm
@@ -0,0 +1,277 @@
+package DBM::Deep::File;
+
+use 5.006_000;
+
+use strict;
+use warnings;
+
+our $VERSION = q(1.0013);
+
+use Fcntl qw( :DEFAULT :flock :seek );
+
+use constant DEBUG => 0;
+
+sub new {
+ my $class = shift;
+ my ($args) = @_;
+
+ my $self = bless {
+ autobless => 1,
+ autoflush => 1,
+ end => 0,
+ fh => undef,
+ file => undef,
+ file_offset => 0,
+ locking => 1,
+ locked => 0,
+#XXX Migrate this to the engine, where it really belongs.
+ filter_store_key => undef,
+ filter_store_value => undef,
+ filter_fetch_key => undef,
+ filter_fetch_value => undef,
+ }, $class;
+
+ # Grab the parameters we want to use
+ foreach my $param ( keys %$self ) {
+ next unless exists $args->{$param};
+ $self->{$param} = $args->{$param};
+ }
+
+ if ( $self->{fh} && !$self->{file_offset} ) {
+ $self->{file_offset} = tell( $self->{fh} );
+ }
+
+ $self->open unless $self->{fh};
+
+ return $self;
+}
+
+sub open {
+ my $self = shift;
+
+ # Adding O_BINARY should remove the need for the binmode below. However,
+ # I'm not going to remove it because I don't have the Win32 chops to be
+ # absolutely certain everything will be ok.
+ my $flags = O_CREAT | O_BINARY;
+
+ if ( !-e $self->{file} || -w _ ) {
+ $flags |= O_RDWR;
+ }
+ else {
+ $flags |= O_RDONLY;
+ }
+
+ my $fh;
+ sysopen( $fh, $self->{file}, $flags )
+ or die "DBM::Deep: Cannot sysopen file '$self->{file}': $!\n";
+ $self->{fh} = $fh;
+
+ # Even though we use O_BINARY, better be safe than sorry.
+ binmode $fh;
+
+ if ($self->{autoflush}) {
+ my $old = select $fh;
+ $|=1;
+ select $old;
+ }
+
+ return 1;
+}
+
+sub close {
+ my $self = shift;
+
+ if ( $self->{fh} ) {
+ close $self->{fh};
+ $self->{fh} = undef;
+ }
+
+ return 1;
+}
+
+sub set_inode {
+ my $self = shift;
+
+ unless ( defined $self->{inode} ) {
+ my @stats = stat($self->{fh});
+ $self->{inode} = $stats[1];
+ $self->{end} = $stats[7];
+ }
+
+ return 1;
+}
+
+sub print_at {
+ my $self = shift;
+ my $loc = shift;
+
+ local ($/,$\);
+
+ my $fh = $self->{fh};
+ if ( defined $loc ) {
+ seek( $fh, $loc + $self->{file_offset}, SEEK_SET );
+ }
+
+ if ( DEBUG ) {
+ my $caller = join ':', (caller)[0,2];
+ my $len = length( join '', @_ );
+ warn "($caller) print_at( " . (defined $loc ? $loc : '<undef>') . ", $len )\n";
+ }
+
+ print( $fh @_ ) or die "Internal Error (print_at($loc)): $!\n";
+
+ return 1;
+}
+
+sub read_at {
+ my $self = shift;
+ my ($loc, $size) = @_;
+
+ local ($/,$\);
+
+ my $fh = $self->{fh};
+ if ( defined $loc ) {
+ seek( $fh, $loc + $self->{file_offset}, SEEK_SET );
+ }
+
+ if ( DEBUG ) {
+ my $caller = join ':', (caller)[0,2];
+ warn "($caller) read_at( " . (defined $loc ? $loc : '<undef>') . ", $size )\n";
+ }
+
+ my $buffer;
+ read( $fh, $buffer, $size);
+
+ return $buffer;
+}
+
+sub DESTROY {
+ my $self = shift;
+ return unless $self;
+
+ $self->close;
+
+ return;
+}
+
+sub request_space {
+ my $self = shift;
+ my ($size) = @_;
+
+ #XXX Do I need to reset $self->{end} here? I need a testcase
+ my $loc = $self->{end};
+ $self->{end} += $size;
+
+ return $loc;
+}
+
+##
+# If db locking is set, flock() the db file. If called multiple
+# times before unlock(), then the same number of unlocks() must
+# be called before the lock is released.
+##
+sub lock {
+ my $self = shift;
+ my ($obj, $type) = @_;
+
+ $type = LOCK_EX unless defined $type;
+
+ #XXX This is a temporary fix for Win32 and autovivification. It
+ # needs to improve somehow. -RobK, 2008-03-09
+ if ( $^O eq 'MSWin32' || $^O eq 'cygwin' ) {
+ $type = LOCK_EX;
+ }
+
+ if (!defined($self->{fh})) { return; }
+
+ #XXX This either needs to allow for upgrading a shared lock to an
+ # exclusive lock or something else with autovivification.
+ # -RobK, 2008-03-09
+ if ($self->{locking}) {
+ if (!$self->{locked}) {
+ flock($self->{fh}, $type);
+
+ # refresh end counter in case file has changed size
+ my @stats = stat($self->{fh});
+ $self->{end} = $stats[7];
+
+ # double-check file inode, in case another process
+ # has optimize()d our file while we were waiting.
+ if (defined($self->{inode}) && $stats[1] != $self->{inode}) {
+ $self->close;
+ $self->open;
+
+ #XXX This needs work
+ $obj->{engine}->setup_fh( $obj );
+
+ flock($self->{fh}, $type); # re-lock
+
+ # This may not be necessary after re-opening
+ $self->{end} = (stat($self->{fh}))[7]; # re-end
+ }
+ }
+ $self->{locked}++;
+
+ return 1;
+ }
+
+ return;
+}
+
+##
+# If db locking is set, unlock the db file. See note in lock()
+# regarding calling lock() multiple times.
+##
+sub unlock {
+ my $self = shift;
+
+ if (!defined($self->{fh})) { return; }
+
+ if ($self->{locking} && $self->{locked} > 0) {
+ $self->{locked}--;
+ if (!$self->{locked}) { flock($self->{fh}, LOCK_UN); }
+
+ return 1;
+ }
+
+ return;
+}
+
+sub flush {
+ my $self = shift;
+
+ # Flush the filehandle
+ my $old_fh = select $self->{fh};
+ my $old_af = $|; $| = 1; $| = $old_af;
+ select $old_fh;
+
+ return 1;
+}
+
+# Taken from http://www.perlmonks.org/?node_id=691054
+sub is_writable {
+ my $self = shift;
+
+ my $fh = $self->{fh};
+ return unless defined $fh;
+ return unless defined fileno $fh;
+ local $\ = ''; # just in case
+ no warnings; # temporarily disable warnings
+ local $^W; # temporarily disable warnings
+ return print $fh '';
+}
+
+sub copy_stats {
+ my $self = shift;
+ my ($temp_filename) = @_;
+
+ my @stats = stat( $self->{fh} );
+ my $perms = $stats[2] & 07777;
+ my $uid = $stats[4];
+ my $gid = $stats[5];
+ chown( $uid, $gid, $temp_filename );
+ chmod( $perms, $temp_filename );
+}
+
+1;
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Hash.pm b/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Hash.pm
new file mode 100755
index 00000000000..6db4e218f3f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Hash.pm
@@ -0,0 +1,136 @@
+package DBM::Deep::Hash;
+
+use 5.006_000;
+
+use strict;
+use warnings;
+
+our $VERSION = q(1.0013);
+
+use base 'DBM::Deep';
+
+sub _get_self {
+ eval { local $SIG{'__DIE__'}; tied( %{$_[0]} ) } || $_[0]
+}
+
+sub _repr { return {} }
+
+sub TIEHASH {
+ ##
+ # Tied hash constructor method, called by Perl's tie() function.
+ ##
+ my $class = shift;
+ my $args = $class->_get_args( @_ );
+
+ $args->{type} = $class->TYPE_HASH;
+
+ return $class->_init($args);
+}
+
+sub FETCH {
+ my $self = shift->_get_self;
+ DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
+ my $key = ($self->_storage->{filter_store_key})
+ ? $self->_storage->{filter_store_key}->($_[0])
+ : $_[0];
+
+ return $self->SUPER::FETCH( $key, $_[0] );
+}
+
+sub STORE {
+ my $self = shift->_get_self;
+ DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
+ my $key = ($self->_storage->{filter_store_key})
+ ? $self->_storage->{filter_store_key}->($_[0])
+ : $_[0];
+ my $value = $_[1];
+
+ return $self->SUPER::STORE( $key, $value, $_[0] );
+}
+
+sub EXISTS {
+ my $self = shift->_get_self;
+ DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
+ my $key = ($self->_storage->{filter_store_key})
+ ? $self->_storage->{filter_store_key}->($_[0])
+ : $_[0];
+
+ return $self->SUPER::EXISTS( $key );
+}
+
+sub DELETE {
+ my $self = shift->_get_self;
+ DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
+ my $key = ($self->_storage->{filter_store_key})
+ ? $self->_storage->{filter_store_key}->($_[0])
+ : $_[0];
+
+ return $self->SUPER::DELETE( $key, $_[0] );
+}
+
+sub FIRSTKEY {
+ ##
+ # Locate and return first key (in no particular order)
+ ##
+ my $self = shift->_get_self;
+
+ ##
+ # Request shared lock for reading
+ ##
+ $self->lock( $self->LOCK_SH );
+
+ my $result = $self->_engine->get_next_key( $self );
+
+ $self->unlock();
+
+ return ($result && $self->_storage->{filter_fetch_key})
+ ? $self->_storage->{filter_fetch_key}->($result)
+ : $result;
+}
+
+sub NEXTKEY {
+ ##
+ # Return next key (in no particular order), given previous one
+ ##
+ my $self = shift->_get_self;
+
+ my $prev_key = ($self->_storage->{filter_store_key})
+ ? $self->_storage->{filter_store_key}->($_[0])
+ : $_[0];
+
+ ##
+ # Request shared lock for reading
+ ##
+ $self->lock( $self->LOCK_SH );
+
+ my $result = $self->_engine->get_next_key( $self, $prev_key );
+
+ $self->unlock();
+
+ return ($result && $self->_storage->{filter_fetch_key})
+ ? $self->_storage->{filter_fetch_key}->($result)
+ : $result;
+}
+
+##
+# Public method aliases
+##
+sub first_key { (shift)->FIRSTKEY(@_) }
+sub next_key { (shift)->NEXTKEY(@_) }
+
+sub _copy_node {
+ my $self = shift;
+ my ($db_temp) = @_;
+
+ my $key = $self->first_key();
+ while ($key) {
+ my $value = $self->get($key);
+ $self->_copy_value( \$db_temp->{$key}, $value );
+ $key = $self->next_key($key);
+ }
+
+ return 1;
+}
+
+1;
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Internals.pod b/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Internals.pod
new file mode 100755
index 00000000000..132bc9eff17
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM/Deep/Internals.pod
@@ -0,0 +1,281 @@
+=head1 NAME
+
+DBM::Deep::Internals
+
+=head1 DESCRIPTION
+
+B<NOTE>: This document is out-of-date. It describes an intermediate file
+format used during the development from 0.983 to 1.0000. It will be rewritten
+soon.
+
+This is a document describing the internal workings of L<DBM::Deep>. It is
+not necessary to read this document if you only intend to be a user. This
+document is intended for people who either want a deeper understanding of
+specifics of how L<DBM::Deep> works or who wish to help program
+L<DBM::Deep>.
+
+=head1 CLASS LAYOUT
+
+L<DBM::Deep> is broken up into five classes in three inheritance hierarchies.
+
+=over 4
+
+=item *
+
+L<DBM::Deep> is the parent of L<DBM::Deep::Array> and L<DBM::Deep::Hash>.
+These classes form the immediate interface to the outside world. They are the
+classes that provide the TIE mechanisms as well as the OO methods.
+
+=item *
+
+L<DBM::Deep::Engine> is the layer that deals with the mechanics of reading
+and writing to the file. This is where the logic of the file layout is
+handled.
+
+=item *
+
+L<DBM::Deep::File> is the layer that deals with the physical file. As a
+singleton that every other object has a reference to, it also provides a place
+to handle datastructure-wide items, such as transactions.
+
+=back
+
+=head1 FILE LAYOUT
+
+DBM::Deep uses a tagged file layout. Every section has a tag, a size, and then
+the data.
+
+=head2 File header
+
+=over 4
+
+=item * File Signature
+
+The first four bytes are 'DPDB' in network byte order, signifying that this is
+a DBM::Deep file.
+
+=item * File tag/size
+
+This is the tagging of the file header. The file used by versions prior to
+1.00 had a different fifth byte, allowing the difference to the determined.
+
+=item * Version
+
+This is four bytes containing the file version. This lets the file format change over time.
+
+=item * Constants
+
+These are the file-wide constants that determine how the file is laid out.
+They can only be set upon file creation.
+
+=item * Transaction information
+
+The current running transactions are stored here, as is the next transaction
+ID.
+
+=item * Freespace information
+
+Pointers into the next free sectors of the various sector sizes (Index,
+Bucketlist, and Data) are stored here.
+
+=back
+
+=head2 Index
+
+The Index parts can be tagged either as Hash, Array, or Index. The latter
+is if there was a reindexing due to a bucketlist growing too large. The others
+are the root index for their respective datatypes. The index consists of a
+tag, a size, and then 256 sections containing file locations. Each section
+corresponds to each value representable in a byte.
+
+The index is used as follows - whenever a hashed key is being looked up, the
+first byte is used to determine which location to go to from the root index.
+Then, if that's also an index, the second byte is used, and so forth until a
+bucketlist is found.
+
+=head2 Bucketlist
+
+This is the part that contains the link to the data section. A bucketlist
+defaults to being 16 buckets long (modifiable by the I<max_buckets>
+parameter used when creating a new file). Each bucket contains an MD5 and a
+location of the appropriate key section.
+
+=head2 Key area
+
+This is the part that handles transactional awareness. There are
+I<max_buckets> sections. Each section contains the location to the data
+section, a transaction ID, and whether that transaction considers this key to
+be deleted or not.
+
+=head2 Data area
+
+This is the part that actual stores the key, value, and class (if
+appropriate). The layout is:
+
+=over 4
+
+=item * tag
+
+=item * length of the value
+
+=item * the actual value
+
+=item * keylength
+
+=item * the actual key
+
+=item * a byte indicating if this value has a classname
+
+=item * the classname (if one is there)
+
+=back
+
+The key is stored after the value because the value is requested more often
+than the key.
+
+=head1 PERFORMANCE
+
+L<DBM::Deep> is written completely in Perl. It also is a multi-process DBM
+that uses the datafile as a method of synchronizing between multiple
+processes. This is unlike most RDBMSes like MySQL and Oracle. Furthermore,
+unlike all RDBMSes, L<DBM::Deep> stores both the data and the structure of
+that data as it would appear in a Perl program.
+
+=head2 CPU
+
+DBM::Deep attempts to be CPU-light. As it stores all the data on disk,
+DBM::Deep is I/O-bound, not CPU-bound.
+
+=head2 RAM
+
+DBM::Deep uses extremely little RAM relative to the amount of data you can
+access. You can iterate through a million keys (using C<each()>) without
+increasing your memeory usage at all.
+
+=head2 DISK
+
+DBM::Deep is I/O-bound, pure and simple. The faster your disk, the faster
+DBM::Deep will be. Currently, when performing C<my $x = $db-E<gt>{foo}>, there
+are a minimum of 4 seeks and 1332 + N bytes read (where N is the length of your
+data). (All values assume a medium filesize.) The actions taken are:
+
+=over 4
+
+=item 1 Lock the file
+
+=item 1 Perform a stat() to determine if the inode has changed
+
+=item 1 Go to the primary index for the $db (1 seek)
+
+=item 1 Read the tag/size of the primary index (5 bytes)
+
+=item 1 Read the body of the primary index (1024 bytes)
+
+=item 1 Go to the bucketlist for this MD5 (1 seek)
+
+=item 1 Read the tag/size of the bucketlist (5 bytes)
+
+=item 1 Read the body of the bucketlist (144 bytes)
+
+=item 1 Go to the keys location for this MD5 (1 seek)
+
+=item 1 Read the tag/size of the keys section (5 bytes)
+
+=item 1 Read the body of the keys location (144 bytes)
+
+=item 1 Go to the data section that corresponds to this transaction ID. (1 seek)
+
+=item 1 Read the tag/size of the data section (5 bytes)
+
+=item 1 Read the value for this data (N bytes)
+
+=item 1 Unlock the file
+
+=back
+
+Every additional level of indexing (if there are enough keys) requires an
+additional seek and the reading of 1029 additional bytes. If the value is
+blessed, an additional 1 seek and 9 + M bytes are read (where M is the length
+of the classname).
+
+Arrays are (currently) even worse because they're considered "funny hashes"
+with the length stored as just another key. This means that if you do any sort
+of lookup with a negative index, this entire process is performed twice - once
+for the length and once for the value.
+
+=head1 ACTUAL TESTS
+
+=head2 SPEED
+
+Obviously, DBM::Deep isn't going to be as fast as some C-based DBMs, such as
+the almighty I<BerkeleyDB>. But it makes up for it in features like true
+multi-level hash/array support, and cross-platform FTPable files. Even so,
+DBM::Deep is still pretty fast, and the speed stays fairly consistent, even
+with huge databases. Here is some test data:
+
+ Adding 1,000,000 keys to new DB file...
+
+ At 100 keys, avg. speed is 2,703 keys/sec
+ At 200 keys, avg. speed is 2,642 keys/sec
+ At 300 keys, avg. speed is 2,598 keys/sec
+ At 400 keys, avg. speed is 2,578 keys/sec
+ At 500 keys, avg. speed is 2,722 keys/sec
+ At 600 keys, avg. speed is 2,628 keys/sec
+ At 700 keys, avg. speed is 2,700 keys/sec
+ At 800 keys, avg. speed is 2,607 keys/sec
+ At 900 keys, avg. speed is 2,190 keys/sec
+ At 1,000 keys, avg. speed is 2,570 keys/sec
+ At 2,000 keys, avg. speed is 2,417 keys/sec
+ At 3,000 keys, avg. speed is 1,982 keys/sec
+ At 4,000 keys, avg. speed is 1,568 keys/sec
+ At 5,000 keys, avg. speed is 1,533 keys/sec
+ At 6,000 keys, avg. speed is 1,787 keys/sec
+ At 7,000 keys, avg. speed is 1,977 keys/sec
+ At 8,000 keys, avg. speed is 2,028 keys/sec
+ At 9,000 keys, avg. speed is 2,077 keys/sec
+ At 10,000 keys, avg. speed is 2,031 keys/sec
+ At 20,000 keys, avg. speed is 1,970 keys/sec
+ At 30,000 keys, avg. speed is 2,050 keys/sec
+ At 40,000 keys, avg. speed is 2,073 keys/sec
+ At 50,000 keys, avg. speed is 1,973 keys/sec
+ At 60,000 keys, avg. speed is 1,914 keys/sec
+ At 70,000 keys, avg. speed is 2,091 keys/sec
+ At 80,000 keys, avg. speed is 2,103 keys/sec
+ At 90,000 keys, avg. speed is 1,886 keys/sec
+ At 100,000 keys, avg. speed is 1,970 keys/sec
+ At 200,000 keys, avg. speed is 2,053 keys/sec
+ At 300,000 keys, avg. speed is 1,697 keys/sec
+ At 400,000 keys, avg. speed is 1,838 keys/sec
+ At 500,000 keys, avg. speed is 1,941 keys/sec
+ At 600,000 keys, avg. speed is 1,930 keys/sec
+ At 700,000 keys, avg. speed is 1,735 keys/sec
+ At 800,000 keys, avg. speed is 1,795 keys/sec
+ At 900,000 keys, avg. speed is 1,221 keys/sec
+ At 1,000,000 keys, avg. speed is 1,077 keys/sec
+
+This test was performed on a PowerMac G4 1gHz running Mac OS X 10.3.2 & Perl
+5.8.1, with an 80GB Ultra ATA/100 HD spinning at 7200RPM. The hash keys and
+values were between 6 - 12 chars in length. The DB file ended up at 210MB.
+Run time was 12 min 3 sec.
+
+=head2 MEMORY USAGE
+
+One of the great things about L<DBM::Deep> is that it uses very little memory.
+Even with huge databases (1,000,000+ keys) you will not see much increased
+memory on your process. L<DBM::Deep> relies solely on the filesystem for storing
+and fetching data. Here is output from I<top> before even opening a database
+handle:
+
+ PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
+ 22831 root 11 0 2716 2716 1296 R 0.0 0.2 0:07 perl
+
+Basically the process is taking 2,716K of memory. And here is the same
+process after storing and fetching 1,000,000 keys:
+
+ PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
+ 22831 root 14 0 2772 2772 1328 R 0.0 0.2 13:32 perl
+
+Notice the memory usage increased by only 56K. Test was performed on a 700mHz
+x86 box running Linux RedHat 7.2 & Perl 5.6.1.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM_Filter/compress.pm b/Master/tlpkg/tlperl.straw/lib/DBM_Filter/compress.pm
new file mode 100755
index 00000000000..b9f7dea92bf
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM_Filter/compress.pm
@@ -0,0 +1,53 @@
+package DBM_Filter::compress ;
+
+use strict;
+use warnings;
+use Carp;
+
+our $VERSION = '0.02';
+
+BEGIN
+{
+ eval { require Compress::Zlib; Compress::Zlib->import() };
+
+ croak "Compress::Zlib module not found.\n"
+ if $@;
+}
+
+
+
+sub Store { $_ = compress($_) }
+sub Fetch { $_ = uncompress($_) }
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBM_Filter::compress - filter for DBM_Filter
+
+=head1 SYNOPSIS
+
+ use SDBM_File; # or DB_File, or GDBM_File, or NDBM_File, or ODBM_File
+ use DBM_Filter ;
+
+ $db = tie %hash, ...
+ $db->Filter_Push('compress');
+
+=head1 DESCRIPTION
+
+This DBM filter will compress all data before it is written to the database
+and uncompressed it on reading.
+
+A fatal error will be thrown if the Compress::Zlib module is not
+available.
+
+=head1 SEE ALSO
+
+L<DBM_Filter>, L<perldbmfilter>, L<Compress::Zlib>
+
+=head1 AUTHOR
+
+Paul Marquess pmqs@cpan.org
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM_Filter/encode.pm b/Master/tlpkg/tlperl.straw/lib/DBM_Filter/encode.pm
new file mode 100755
index 00000000000..fedb6928116
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM_Filter/encode.pm
@@ -0,0 +1,86 @@
+package DBM_Filter::encode ;
+
+use strict;
+use warnings;
+use Carp;
+
+our $VERSION = '0.02';
+
+BEGIN
+{
+ eval { require Encode; };
+
+ croak "Encode module not found.\n"
+ if $@;
+}
+
+
+sub Filter
+{
+ my $encoding_name = shift || "utf8";
+
+ my $encoding = Encode::find_encoding($encoding_name) ;
+
+ croak "Encoding '$encoding_name' is not available"
+ unless $encoding;
+
+ return {
+ Store => sub {
+ $_ = $encoding->encode($_)
+ if defined $_ ;
+ },
+ Fetch => sub {
+ $_ = $encoding->decode($_)
+ if defined $_ ;
+ }
+ } ;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBM_Filter::encode - filter for DBM_Filter
+
+=head1 SYNOPSIS
+
+ use SDBM_File; # or DB_File, or GDBM_File, or NDBM_File, or ODBM_File
+ use DBM_Filter ;
+
+ $db = tie %hash, ...
+ $db->Filter_Push('encode' => 'iso-8859-16');
+
+=head1 DESCRIPTION
+
+This DBM filter allows you to choose the character encoding will be
+store in the DBM file. The usage is
+
+ $db->Filter_Push('encode' => ENCODING);
+
+where "ENCODING" must be a valid encoding name that the Encode module
+recognises.
+
+A fatal error will be thrown if:
+
+=over 5
+
+=item 1
+
+The Encode module is not available.
+
+=item 2
+
+The encoding requested is not supported by the Encode module.
+
+=back
+
+=head1 SEE ALSO
+
+L<DBM_Filter>, L<perldbmfilter>, L<Encode>
+
+=head1 AUTHOR
+
+Paul Marquess pmqs@cpan.org
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM_Filter/int32.pm b/Master/tlpkg/tlperl.straw/lib/DBM_Filter/int32.pm
new file mode 100755
index 00000000000..d8fa5424af4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM_Filter/int32.pm
@@ -0,0 +1,50 @@
+package DBM_Filter::int32 ;
+
+use strict;
+use warnings;
+
+our $VERSION = '0.02';
+
+# todo get Filter to figure endian.
+
+sub Store
+{
+ $_ = 0 if ! defined $_ || $_ eq "" ;
+ $_ = pack("i", $_);
+}
+
+sub Fetch
+{
+ no warnings 'uninitialized';
+ $_ = unpack("i", $_);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBM_Filter::int32 - filter for DBM_Filter
+
+=head1 SYNOPSIS
+
+ use SDBM_File; # or DB_File, or GDBM_File, or NDBM_File, or ODBM_File
+ use DBM_Filter ;
+
+ $db = tie %hash, ...
+ $db->Filter_Push('int32');
+
+=head1 DESCRIPTION
+
+This DBM filter is used when interoperating with a C/C++ application
+that uses a C int as either the key and/or value in the DBM file.
+
+=head1 SEE ALSO
+
+L<DBM_Filter>, L<perldbmfilter>
+
+=head1 AUTHOR
+
+Paul Marquess pmqs@cpan.org
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM_Filter/null.pm b/Master/tlpkg/tlperl.straw/lib/DBM_Filter/null.pm
new file mode 100755
index 00000000000..ffa10e92f21
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM_Filter/null.pm
@@ -0,0 +1,52 @@
+package DBM_Filter::null ;
+
+use strict;
+use warnings;
+
+our $VERSION = '0.02';
+
+sub Store
+{
+ no warnings 'uninitialized';
+ $_ .= "\x00" ;
+}
+
+sub Fetch
+{
+ no warnings 'uninitialized';
+ s/\x00$// ;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBM_Filter::null - filter for DBM_Filter
+
+=head1 SYNOPSIS
+
+ use SDBM_File; # or DB_File, or GDBM_File, or NDBM_File, or ODBM_File
+ use DBM_Filter ;
+
+ $db = tie %hash, ...
+ $db->Filter_Push('null');
+
+=head1 DESCRIPTION
+
+This filter ensures that all data written to the DBM file is null
+terminated. This is useful when you have a perl script that needs
+to interoperate with a DBM file that a C program also uses. A fairly
+common issue is for the C application to include the terminating null
+in a string when it writes to the DBM file. This filter will ensure that
+all data written to the DBM file can be read by the C application.
+
+
+=head1 SEE ALSO
+
+L<DBM_Filter>, L<perldbmfilter>
+
+=head1 AUTHOR
+
+Paul Marquess pmqs@cpan.org
diff --git a/Master/tlpkg/tlperl.straw/lib/DBM_Filter/utf8.pm b/Master/tlpkg/tlperl.straw/lib/DBM_Filter/utf8.pm
new file mode 100755
index 00000000000..677e66156b6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DBM_Filter/utf8.pm
@@ -0,0 +1,51 @@
+package DBM_Filter::utf8 ;
+
+use strict;
+use warnings;
+use Carp;
+
+our $VERSION = '0.02';
+
+BEGIN
+{
+ eval { require Encode; };
+
+ croak "Encode module not found.\n"
+ if $@;
+}
+
+sub Store { $_ = Encode::encode_utf8($_) if defined $_ }
+
+sub Fetch { $_ = Encode::decode_utf8($_) if defined $_ }
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBM_Filter::utf8 - filter for DBM_Filter
+
+=head1 SYNOPSIS
+
+ use SDBM_File; # or DB_File, or GDBM_File, or NDBM_File, or ODBM_File
+ use DBM_Filter ;
+
+ $db = tie %hash, ...
+ $db->Filter_Push('utf8');
+
+=head1 DESCRIPTION
+
+This Filter will ensure that all data written to the DBM will be encoded
+in UTF-8.
+
+This module uses the Encode module.
+
+=head1 SEE ALSO
+
+L<DBM_Filter>, L<perldbmfilter>, L<Encode>
+
+=head1 AUTHOR
+
+Paul Marquess pmqs@cpan.org
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DB_File.pm b/Master/tlpkg/tlperl.straw/lib/DB_File.pm
new file mode 100755
index 00000000000..86d0b198881
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DB_File.pm
@@ -0,0 +1,2299 @@
+# DB_File.pm -- Perl 5 interface to Berkeley DB
+#
+# written by Paul Marquess (pmqs@cpan.org)
+# last modified 28th October 2007
+# version 1.818
+#
+# Copyright (c) 1995-2009 Paul Marquess. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+
+package DB_File::HASHINFO ;
+
+require 5.00404;
+
+use warnings;
+use strict;
+use Carp;
+require Tie::Hash;
+@DB_File::HASHINFO::ISA = qw(Tie::Hash);
+
+sub new
+{
+ my $pkg = shift ;
+ my %x ;
+ tie %x, $pkg ;
+ bless \%x, $pkg ;
+}
+
+
+sub TIEHASH
+{
+ my $pkg = shift ;
+
+ bless { VALID => {
+ bsize => 1,
+ ffactor => 1,
+ nelem => 1,
+ cachesize => 1,
+ hash => 2,
+ lorder => 1,
+ },
+ GOT => {}
+ }, $pkg ;
+}
+
+
+sub FETCH
+{
+ my $self = shift ;
+ my $key = shift ;
+
+ return $self->{GOT}{$key} if exists $self->{VALID}{$key} ;
+
+ my $pkg = ref $self ;
+ croak "${pkg}::FETCH - Unknown element '$key'" ;
+}
+
+
+sub STORE
+{
+ my $self = shift ;
+ my $key = shift ;
+ my $value = shift ;
+
+ my $type = $self->{VALID}{$key};
+
+ if ( $type )
+ {
+ croak "Key '$key' not associated with a code reference"
+ if $type == 2 && !ref $value && ref $value ne 'CODE';
+ $self->{GOT}{$key} = $value ;
+ return ;
+ }
+
+ my $pkg = ref $self ;
+ croak "${pkg}::STORE - Unknown element '$key'" ;
+}
+
+sub DELETE
+{
+ my $self = shift ;
+ my $key = shift ;
+
+ if ( exists $self->{VALID}{$key} )
+ {
+ delete $self->{GOT}{$key} ;
+ return ;
+ }
+
+ my $pkg = ref $self ;
+ croak "DB_File::HASHINFO::DELETE - Unknown element '$key'" ;
+}
+
+sub EXISTS
+{
+ my $self = shift ;
+ my $key = shift ;
+
+ exists $self->{VALID}{$key} ;
+}
+
+sub NotHere
+{
+ my $self = shift ;
+ my $method = shift ;
+
+ croak ref($self) . " does not define the method ${method}" ;
+}
+
+sub FIRSTKEY { my $self = shift ; $self->NotHere("FIRSTKEY") }
+sub NEXTKEY { my $self = shift ; $self->NotHere("NEXTKEY") }
+sub CLEAR { my $self = shift ; $self->NotHere("CLEAR") }
+
+package DB_File::RECNOINFO ;
+
+use warnings;
+use strict ;
+
+@DB_File::RECNOINFO::ISA = qw(DB_File::HASHINFO) ;
+
+sub TIEHASH
+{
+ my $pkg = shift ;
+
+ bless { VALID => { map {$_, 1}
+ qw( bval cachesize psize flags lorder reclen bfname )
+ },
+ GOT => {},
+ }, $pkg ;
+}
+
+package DB_File::BTREEINFO ;
+
+use warnings;
+use strict ;
+
+@DB_File::BTREEINFO::ISA = qw(DB_File::HASHINFO) ;
+
+sub TIEHASH
+{
+ my $pkg = shift ;
+
+ bless { VALID => {
+ flags => 1,
+ cachesize => 1,
+ maxkeypage => 1,
+ minkeypage => 1,
+ psize => 1,
+ compare => 2,
+ prefix => 2,
+ lorder => 1,
+ },
+ GOT => {},
+ }, $pkg ;
+}
+
+
+package DB_File ;
+
+use warnings;
+use strict;
+our ($VERSION, @ISA, @EXPORT, $AUTOLOAD, $DB_BTREE, $DB_HASH, $DB_RECNO);
+our ($db_version, $use_XSLoader, $splice_end_array, $Error);
+use Carp;
+
+
+$VERSION = "1.820" ;
+$VERSION = eval $VERSION; # needed for dev releases
+
+{
+ local $SIG{__WARN__} = sub {$splice_end_array = "@_";};
+ my @a =(1); splice(@a, 3);
+ $splice_end_array =
+ ($splice_end_array =~ /^splice\(\) offset past end of array at /);
+}
+
+#typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE;
+$DB_BTREE = new DB_File::BTREEINFO ;
+$DB_HASH = new DB_File::HASHINFO ;
+$DB_RECNO = new DB_File::RECNOINFO ;
+
+require Tie::Hash;
+require Exporter;
+use AutoLoader;
+BEGIN {
+ $use_XSLoader = 1 ;
+ { local $SIG{__DIE__} ; eval { require XSLoader } ; }
+
+ if ($@) {
+ $use_XSLoader = 0 ;
+ require DynaLoader;
+ @ISA = qw(DynaLoader);
+ }
+}
+
+push @ISA, qw(Tie::Hash Exporter);
+@EXPORT = qw(
+ $DB_BTREE $DB_HASH $DB_RECNO
+
+ BTREEMAGIC
+ BTREEVERSION
+ DB_LOCK
+ DB_SHMEM
+ DB_TXN
+ HASHMAGIC
+ HASHVERSION
+ MAX_PAGE_NUMBER
+ MAX_PAGE_OFFSET
+ MAX_REC_NUMBER
+ RET_ERROR
+ RET_SPECIAL
+ RET_SUCCESS
+ R_CURSOR
+ R_DUP
+ R_FIRST
+ R_FIXEDLEN
+ R_IAFTER
+ R_IBEFORE
+ R_LAST
+ R_NEXT
+ R_NOKEY
+ R_NOOVERWRITE
+ R_PREV
+ R_RECNOSYNC
+ R_SETCURSOR
+ R_SNAPSHOT
+ __R_UNUSED
+
+);
+
+sub AUTOLOAD {
+ my($constname);
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ my ($error, $val) = constant($constname);
+ Carp::croak $error if $error;
+ no strict 'refs';
+ *{$AUTOLOAD} = sub { $val };
+ goto &{$AUTOLOAD};
+}
+
+
+eval {
+ # Make all Fcntl O_XXX constants available for importing
+ require Fcntl;
+ my @O = grep /^O_/, @Fcntl::EXPORT;
+ Fcntl->import(@O); # first we import what we want to export
+ push(@EXPORT, @O);
+};
+
+if ($use_XSLoader)
+ { XSLoader::load("DB_File", $VERSION)}
+else
+ { bootstrap DB_File $VERSION }
+
+# Preloaded methods go here. Autoload methods go after __END__, and are
+# processed by the autosplit program.
+
+sub tie_hash_or_array
+{
+ my (@arg) = @_ ;
+ my $tieHASH = ( (caller(1))[3] =~ /TIEHASH/ ) ;
+
+ use File::Spec;
+ $arg[1] = File::Spec->rel2abs($arg[1])
+ if defined $arg[1] ;
+
+ $arg[4] = tied %{ $arg[4] }
+ if @arg >= 5 && ref $arg[4] && $arg[4] =~ /=HASH/ && tied %{ $arg[4] } ;
+
+ $arg[2] = O_CREAT()|O_RDWR() if @arg >=3 && ! defined $arg[2];
+ $arg[3] = 0666 if @arg >=4 && ! defined $arg[3];
+
+ # make recno in Berkeley DB version 2 (or better) work like
+ # recno in version 1.
+ if ($db_version >= 4 and ! $tieHASH) {
+ $arg[2] |= O_CREAT();
+ }
+
+ if ($db_version > 1 and defined $arg[4] and $arg[4] =~ /RECNO/ and
+ $arg[1] and ! -e $arg[1]) {
+ open(FH, ">$arg[1]") or return undef ;
+ close FH ;
+ chmod $arg[3] ? $arg[3] : 0666 , $arg[1] ;
+ }
+
+ DoTie_($tieHASH, @arg) ;
+}
+
+sub TIEHASH
+{
+ tie_hash_or_array(@_) ;
+}
+
+sub TIEARRAY
+{
+ tie_hash_or_array(@_) ;
+}
+
+sub CLEAR
+{
+ my $self = shift;
+ my $key = 0 ;
+ my $value = "" ;
+ my $status = $self->seq($key, $value, R_FIRST());
+ my @keys;
+
+ while ($status == 0) {
+ push @keys, $key;
+ $status = $self->seq($key, $value, R_NEXT());
+ }
+ foreach $key (reverse @keys) {
+ my $s = $self->del($key);
+ }
+}
+
+sub EXTEND { }
+
+sub STORESIZE
+{
+ my $self = shift;
+ my $length = shift ;
+ my $current_length = $self->length() ;
+
+ if ($length < $current_length) {
+ my $key ;
+ for ($key = $current_length - 1 ; $key >= $length ; -- $key)
+ { $self->del($key) }
+ }
+ elsif ($length > $current_length) {
+ $self->put($length-1, "") ;
+ }
+}
+
+
+sub SPLICE
+{
+ my $self = shift;
+ my $offset = shift;
+ if (not defined $offset) {
+ warnings::warnif('uninitialized', 'Use of uninitialized value in splice');
+ $offset = 0;
+ }
+
+ my $length = @_ ? shift : 0;
+ # Carping about definedness comes _after_ the OFFSET sanity check.
+ # This is so we get the same error messages as Perl's splice().
+ #
+
+ my @list = @_;
+
+ my $size = $self->FETCHSIZE();
+
+ # 'If OFFSET is negative then it start that far from the end of
+ # the array.'
+ #
+ if ($offset < 0) {
+ my $new_offset = $size + $offset;
+ if ($new_offset < 0) {
+ die "Modification of non-creatable array value attempted, "
+ . "subscript $offset";
+ }
+ $offset = $new_offset;
+ }
+
+ if (not defined $length) {
+ warnings::warnif('uninitialized', 'Use of uninitialized value in splice');
+ $length = 0;
+ }
+
+ if ($offset > $size) {
+ $offset = $size;
+ warnings::warnif('misc', 'splice() offset past end of array')
+ if $splice_end_array;
+ }
+
+ # 'If LENGTH is omitted, removes everything from OFFSET onward.'
+ if (not defined $length) {
+ $length = $size - $offset;
+ }
+
+ # 'If LENGTH is negative, leave that many elements off the end of
+ # the array.'
+ #
+ if ($length < 0) {
+ $length = $size - $offset + $length;
+
+ if ($length < 0) {
+ # The user must have specified a length bigger than the
+ # length of the array passed in. But perl's splice()
+ # doesn't catch this, it just behaves as for length=0.
+ #
+ $length = 0;
+ }
+ }
+
+ if ($length > $size - $offset) {
+ $length = $size - $offset;
+ }
+
+ # $num_elems holds the current number of elements in the database.
+ my $num_elems = $size;
+
+ # 'Removes the elements designated by OFFSET and LENGTH from an
+ # array,'...
+ #
+ my @removed = ();
+ foreach (0 .. $length - 1) {
+ my $old;
+ my $status = $self->get($offset, $old);
+ if ($status != 0) {
+ my $msg = "error from Berkeley DB on get($offset, \$old)";
+ if ($status == 1) {
+ $msg .= ' (no such element?)';
+ }
+ else {
+ $msg .= ": error status $status";
+ if (defined $! and $! ne '') {
+ $msg .= ", message $!";
+ }
+ }
+ die $msg;
+ }
+ push @removed, $old;
+
+ $status = $self->del($offset);
+ if ($status != 0) {
+ my $msg = "error from Berkeley DB on del($offset)";
+ if ($status == 1) {
+ $msg .= ' (no such element?)';
+ }
+ else {
+ $msg .= ": error status $status";
+ if (defined $! and $! ne '') {
+ $msg .= ", message $!";
+ }
+ }
+ die $msg;
+ }
+
+ -- $num_elems;
+ }
+
+ # ...'and replaces them with the elements of LIST, if any.'
+ my $pos = $offset;
+ while (defined (my $elem = shift @list)) {
+ my $old_pos = $pos;
+ my $status;
+ if ($pos >= $num_elems) {
+ $status = $self->put($pos, $elem);
+ }
+ else {
+ $status = $self->put($pos, $elem, $self->R_IBEFORE);
+ }
+
+ if ($status != 0) {
+ my $msg = "error from Berkeley DB on put($pos, $elem, ...)";
+ if ($status == 1) {
+ $msg .= ' (no such element?)';
+ }
+ else {
+ $msg .= ", error status $status";
+ if (defined $! and $! ne '') {
+ $msg .= ", message $!";
+ }
+ }
+ die $msg;
+ }
+
+ die "pos unexpectedly changed from $old_pos to $pos with R_IBEFORE"
+ if $old_pos != $pos;
+
+ ++ $pos;
+ ++ $num_elems;
+ }
+
+ if (wantarray) {
+ # 'In list context, returns the elements removed from the
+ # array.'
+ #
+ return @removed;
+ }
+ elsif (defined wantarray and not wantarray) {
+ # 'In scalar context, returns the last element removed, or
+ # undef if no elements are removed.'
+ #
+ if (@removed) {
+ my $last = pop @removed;
+ return "$last";
+ }
+ else {
+ return undef;
+ }
+ }
+ elsif (not defined wantarray) {
+ # Void context
+ }
+ else { die }
+}
+sub ::DB_File::splice { &SPLICE }
+
+sub find_dup
+{
+ croak "Usage: \$db->find_dup(key,value)\n"
+ unless @_ == 3 ;
+
+ my $db = shift ;
+ my ($origkey, $value_wanted) = @_ ;
+ my ($key, $value) = ($origkey, 0);
+ my ($status) = 0 ;
+
+ for ($status = $db->seq($key, $value, R_CURSOR() ) ;
+ $status == 0 ;
+ $status = $db->seq($key, $value, R_NEXT() ) ) {
+
+ return 0 if $key eq $origkey and $value eq $value_wanted ;
+ }
+
+ return $status ;
+}
+
+sub del_dup
+{
+ croak "Usage: \$db->del_dup(key,value)\n"
+ unless @_ == 3 ;
+
+ my $db = shift ;
+ my ($key, $value) = @_ ;
+ my ($status) = $db->find_dup($key, $value) ;
+ return $status if $status != 0 ;
+
+ $status = $db->del($key, R_CURSOR() ) ;
+ return $status ;
+}
+
+sub get_dup
+{
+ croak "Usage: \$db->get_dup(key [,flag])\n"
+ unless @_ == 2 or @_ == 3 ;
+
+ my $db = shift ;
+ my $key = shift ;
+ my $flag = shift ;
+ my $value = 0 ;
+ my $origkey = $key ;
+ my $wantarray = wantarray ;
+ my %values = () ;
+ my @values = () ;
+ my $counter = 0 ;
+ my $status = 0 ;
+
+ # iterate through the database until either EOF ($status == 0)
+ # or a different key is encountered ($key ne $origkey).
+ for ($status = $db->seq($key, $value, R_CURSOR()) ;
+ $status == 0 and $key eq $origkey ;
+ $status = $db->seq($key, $value, R_NEXT()) ) {
+
+ # save the value or count number of matches
+ if ($wantarray) {
+ if ($flag)
+ { ++ $values{$value} }
+ else
+ { push (@values, $value) }
+ }
+ else
+ { ++ $counter }
+
+ }
+
+ return ($wantarray ? ($flag ? %values : @values) : $counter) ;
+}
+
+
+1;
+__END__
+
+=head1 NAME
+
+DB_File - Perl5 access to Berkeley DB version 1.x
+
+=head1 SYNOPSIS
+
+ use DB_File;
+
+ [$X =] tie %hash, 'DB_File', [$filename, $flags, $mode, $DB_HASH] ;
+ [$X =] tie %hash, 'DB_File', $filename, $flags, $mode, $DB_BTREE ;
+ [$X =] tie @array, 'DB_File', $filename, $flags, $mode, $DB_RECNO ;
+
+ $status = $X->del($key [, $flags]) ;
+ $status = $X->put($key, $value [, $flags]) ;
+ $status = $X->get($key, $value [, $flags]) ;
+ $status = $X->seq($key, $value, $flags) ;
+ $status = $X->sync([$flags]) ;
+ $status = $X->fd ;
+
+ # BTREE only
+ $count = $X->get_dup($key) ;
+ @list = $X->get_dup($key) ;
+ %list = $X->get_dup($key, 1) ;
+ $status = $X->find_dup($key, $value) ;
+ $status = $X->del_dup($key, $value) ;
+
+ # RECNO only
+ $a = $X->length;
+ $a = $X->pop ;
+ $X->push(list);
+ $a = $X->shift;
+ $X->unshift(list);
+ @r = $X->splice(offset, length, elements);
+
+ # DBM Filters
+ $old_filter = $db->filter_store_key ( sub { ... } ) ;
+ $old_filter = $db->filter_store_value( sub { ... } ) ;
+ $old_filter = $db->filter_fetch_key ( sub { ... } ) ;
+ $old_filter = $db->filter_fetch_value( sub { ... } ) ;
+
+ untie %hash ;
+ untie @array ;
+
+=head1 DESCRIPTION
+
+B<DB_File> is a module which allows Perl programs to make use of the
+facilities provided by Berkeley DB version 1.x (if you have a newer
+version of DB, see L<Using DB_File with Berkeley DB version 2 or greater>).
+It is assumed that you have a copy of the Berkeley DB manual pages at
+hand when reading this documentation. The interface defined here
+mirrors the Berkeley DB interface closely.
+
+Berkeley DB is a C library which provides a consistent interface to a
+number of database formats. B<DB_File> provides an interface to all
+three of the database types currently supported by Berkeley DB.
+
+The file types are:
+
+=over 5
+
+=item B<DB_HASH>
+
+This database type allows arbitrary key/value pairs to be stored in data
+files. This is equivalent to the functionality provided by other
+hashing packages like DBM, NDBM, ODBM, GDBM, and SDBM. Remember though,
+the files created using DB_HASH are not compatible with any of the
+other packages mentioned.
+
+A default hashing algorithm, which will be adequate for most
+applications, is built into Berkeley DB. If you do need to use your own
+hashing algorithm it is possible to write your own in Perl and have
+B<DB_File> use it instead.
+
+=item B<DB_BTREE>
+
+The btree format allows arbitrary key/value pairs to be stored in a
+sorted, balanced binary tree.
+
+As with the DB_HASH format, it is possible to provide a user defined
+Perl routine to perform the comparison of keys. By default, though, the
+keys are stored in lexical order.
+
+=item B<DB_RECNO>
+
+DB_RECNO allows both fixed-length and variable-length flat text files
+to be manipulated using the same key/value pair interface as in DB_HASH
+and DB_BTREE. In this case the key will consist of a record (line)
+number.
+
+=back
+
+=head2 Using DB_File with Berkeley DB version 2 or greater
+
+Although B<DB_File> is intended to be used with Berkeley DB version 1,
+it can also be used with version 2, 3 or 4. In this case the interface is
+limited to the functionality provided by Berkeley DB 1.x. Anywhere the
+version 2 or greater interface differs, B<DB_File> arranges for it to work
+like version 1. This feature allows B<DB_File> scripts that were built
+with version 1 to be migrated to version 2 or greater without any changes.
+
+If you want to make use of the new features available in Berkeley DB
+2.x or greater, use the Perl module B<BerkeleyDB> instead.
+
+B<Note:> The database file format has changed multiple times in Berkeley
+DB version 2, 3 and 4. If you cannot recreate your databases, you
+must dump any existing databases with either the C<db_dump> or the
+C<db_dump185> utility that comes with Berkeley DB.
+Once you have rebuilt DB_File to use Berkeley DB version 2 or greater,
+your databases can be recreated using C<db_load>. Refer to the Berkeley DB
+documentation for further details.
+
+Please read L<"COPYRIGHT"> before using version 2.x or greater of Berkeley
+DB with DB_File.
+
+=head2 Interface to Berkeley DB
+
+B<DB_File> allows access to Berkeley DB files using the tie() mechanism
+in Perl 5 (for full details, see L<perlfunc/tie()>). This facility
+allows B<DB_File> to access Berkeley DB files using either an
+associative array (for DB_HASH & DB_BTREE file types) or an ordinary
+array (for the DB_RECNO file type).
+
+In addition to the tie() interface, it is also possible to access most
+of the functions provided in the Berkeley DB API directly.
+See L<THE API INTERFACE>.
+
+=head2 Opening a Berkeley DB Database File
+
+Berkeley DB uses the function dbopen() to open or create a database.
+Here is the C prototype for dbopen():
+
+ DB*
+ dbopen (const char * file, int flags, int mode,
+ DBTYPE type, const void * openinfo)
+
+The parameter C<type> is an enumeration which specifies which of the 3
+interface methods (DB_HASH, DB_BTREE or DB_RECNO) is to be used.
+Depending on which of these is actually chosen, the final parameter,
+I<openinfo> points to a data structure which allows tailoring of the
+specific interface method.
+
+This interface is handled slightly differently in B<DB_File>. Here is
+an equivalent call using B<DB_File>:
+
+ tie %array, 'DB_File', $filename, $flags, $mode, $DB_HASH ;
+
+The C<filename>, C<flags> and C<mode> parameters are the direct
+equivalent of their dbopen() counterparts. The final parameter $DB_HASH
+performs the function of both the C<type> and C<openinfo> parameters in
+dbopen().
+
+In the example above $DB_HASH is actually a pre-defined reference to a
+hash object. B<DB_File> has three of these pre-defined references.
+Apart from $DB_HASH, there is also $DB_BTREE and $DB_RECNO.
+
+The keys allowed in each of these pre-defined references is limited to
+the names used in the equivalent C structure. So, for example, the
+$DB_HASH reference will only allow keys called C<bsize>, C<cachesize>,
+C<ffactor>, C<hash>, C<lorder> and C<nelem>.
+
+To change one of these elements, just assign to it like this:
+
+ $DB_HASH->{'cachesize'} = 10000 ;
+
+The three predefined variables $DB_HASH, $DB_BTREE and $DB_RECNO are
+usually adequate for most applications. If you do need to create extra
+instances of these objects, constructors are available for each file
+type.
+
+Here are examples of the constructors and the valid options available
+for DB_HASH, DB_BTREE and DB_RECNO respectively.
+
+ $a = new DB_File::HASHINFO ;
+ $a->{'bsize'} ;
+ $a->{'cachesize'} ;
+ $a->{'ffactor'};
+ $a->{'hash'} ;
+ $a->{'lorder'} ;
+ $a->{'nelem'} ;
+
+ $b = new DB_File::BTREEINFO ;
+ $b->{'flags'} ;
+ $b->{'cachesize'} ;
+ $b->{'maxkeypage'} ;
+ $b->{'minkeypage'} ;
+ $b->{'psize'} ;
+ $b->{'compare'} ;
+ $b->{'prefix'} ;
+ $b->{'lorder'} ;
+
+ $c = new DB_File::RECNOINFO ;
+ $c->{'bval'} ;
+ $c->{'cachesize'} ;
+ $c->{'psize'} ;
+ $c->{'flags'} ;
+ $c->{'lorder'} ;
+ $c->{'reclen'} ;
+ $c->{'bfname'} ;
+
+The values stored in the hashes above are mostly the direct equivalent
+of their C counterpart. Like their C counterparts, all are set to a
+default values - that means you don't have to set I<all> of the
+values when you only want to change one. Here is an example:
+
+ $a = new DB_File::HASHINFO ;
+ $a->{'cachesize'} = 12345 ;
+ tie %y, 'DB_File', "filename", $flags, 0777, $a ;
+
+A few of the options need extra discussion here. When used, the C
+equivalent of the keys C<hash>, C<compare> and C<prefix> store pointers
+to C functions. In B<DB_File> these keys are used to store references
+to Perl subs. Below are templates for each of the subs:
+
+ sub hash
+ {
+ my ($data) = @_ ;
+ ...
+ # return the hash value for $data
+ return $hash ;
+ }
+
+ sub compare
+ {
+ my ($key, $key2) = @_ ;
+ ...
+ # return 0 if $key1 eq $key2
+ # -1 if $key1 lt $key2
+ # 1 if $key1 gt $key2
+ return (-1 , 0 or 1) ;
+ }
+
+ sub prefix
+ {
+ my ($key, $key2) = @_ ;
+ ...
+ # return number of bytes of $key2 which are
+ # necessary to determine that it is greater than $key1
+ return $bytes ;
+ }
+
+See L<Changing the BTREE sort order> for an example of using the
+C<compare> template.
+
+If you are using the DB_RECNO interface and you intend making use of
+C<bval>, you should check out L<The 'bval' Option>.
+
+=head2 Default Parameters
+
+It is possible to omit some or all of the final 4 parameters in the
+call to C<tie> and let them take default values. As DB_HASH is the most
+common file format used, the call:
+
+ tie %A, "DB_File", "filename" ;
+
+is equivalent to:
+
+ tie %A, "DB_File", "filename", O_CREAT|O_RDWR, 0666, $DB_HASH ;
+
+It is also possible to omit the filename parameter as well, so the
+call:
+
+ tie %A, "DB_File" ;
+
+is equivalent to:
+
+ tie %A, "DB_File", undef, O_CREAT|O_RDWR, 0666, $DB_HASH ;
+
+See L<In Memory Databases> for a discussion on the use of C<undef>
+in place of a filename.
+
+=head2 In Memory Databases
+
+Berkeley DB allows the creation of in-memory databases by using NULL
+(that is, a C<(char *)0> in C) in place of the filename. B<DB_File>
+uses C<undef> instead of NULL to provide this functionality.
+
+=head1 DB_HASH
+
+The DB_HASH file format is probably the most commonly used of the three
+file formats that B<DB_File> supports. It is also very straightforward
+to use.
+
+=head2 A Simple Example
+
+This example shows how to create a database, add key/value pairs to the
+database, delete keys/value pairs and finally how to enumerate the
+contents of the database.
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+ our (%h, $k, $v) ;
+
+ unlink "fruit" ;
+ tie %h, "DB_File", "fruit", O_RDWR|O_CREAT, 0666, $DB_HASH
+ or die "Cannot open file 'fruit': $!\n";
+
+ # Add a few key/value pairs to the file
+ $h{"apple"} = "red" ;
+ $h{"orange"} = "orange" ;
+ $h{"banana"} = "yellow" ;
+ $h{"tomato"} = "red" ;
+
+ # Check for existence of a key
+ print "Banana Exists\n\n" if $h{"banana"} ;
+
+ # Delete a key/value pair.
+ delete $h{"apple"} ;
+
+ # print the contents of the file
+ while (($k, $v) = each %h)
+ { print "$k -> $v\n" }
+
+ untie %h ;
+
+here is the output:
+
+ Banana Exists
+
+ orange -> orange
+ tomato -> red
+ banana -> yellow
+
+Note that the like ordinary associative arrays, the order of the keys
+retrieved is in an apparently random order.
+
+=head1 DB_BTREE
+
+The DB_BTREE format is useful when you want to store data in a given
+order. By default the keys will be stored in lexical order, but as you
+will see from the example shown in the next section, it is very easy to
+define your own sorting function.
+
+=head2 Changing the BTREE sort order
+
+This script shows how to override the default sorting algorithm that
+BTREE uses. Instead of using the normal lexical ordering, a case
+insensitive compare function will be used.
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+
+ my %h ;
+
+ sub Compare
+ {
+ my ($key1, $key2) = @_ ;
+ "\L$key1" cmp "\L$key2" ;
+ }
+
+ # specify the Perl sub that will do the comparison
+ $DB_BTREE->{'compare'} = \&Compare ;
+
+ unlink "tree" ;
+ tie %h, "DB_File", "tree", O_RDWR|O_CREAT, 0666, $DB_BTREE
+ or die "Cannot open file 'tree': $!\n" ;
+
+ # Add a key/value pair to the file
+ $h{'Wall'} = 'Larry' ;
+ $h{'Smith'} = 'John' ;
+ $h{'mouse'} = 'mickey' ;
+ $h{'duck'} = 'donald' ;
+
+ # Delete
+ delete $h{"duck"} ;
+
+ # Cycle through the keys printing them in order.
+ # Note it is not necessary to sort the keys as
+ # the btree will have kept them in order automatically.
+ foreach (keys %h)
+ { print "$_\n" }
+
+ untie %h ;
+
+Here is the output from the code above.
+
+ mouse
+ Smith
+ Wall
+
+There are a few point to bear in mind if you want to change the
+ordering in a BTREE database:
+
+=over 5
+
+=item 1.
+
+The new compare function must be specified when you create the database.
+
+=item 2.
+
+You cannot change the ordering once the database has been created. Thus
+you must use the same compare function every time you access the
+database.
+
+=item 3
+
+Duplicate keys are entirely defined by the comparison function.
+In the case-insensitive example above, the keys: 'KEY' and 'key'
+would be considered duplicates, and assigning to the second one
+would overwrite the first. If duplicates are allowed for (with the
+R_DUP flag discussed below), only a single copy of duplicate keys
+is stored in the database --- so (again with example above) assigning
+three values to the keys: 'KEY', 'Key', and 'key' would leave just
+the first key: 'KEY' in the database with three values. For some
+situations this results in information loss, so care should be taken
+to provide fully qualified comparison functions when necessary.
+For example, the above comparison routine could be modified to
+additionally compare case-sensitively if two keys are equal in the
+case insensitive comparison:
+
+ sub compare {
+ my($key1, $key2) = @_;
+ lc $key1 cmp lc $key2 ||
+ $key1 cmp $key2;
+ }
+
+And now you will only have duplicates when the keys themselves
+are truly the same. (note: in versions of the db library prior to
+about November 1996, such duplicate keys were retained so it was
+possible to recover the original keys in sets of keys that
+compared as equal).
+
+
+=back
+
+=head2 Handling Duplicate Keys
+
+The BTREE file type optionally allows a single key to be associated
+with an arbitrary number of values. This option is enabled by setting
+the flags element of C<$DB_BTREE> to R_DUP when creating the database.
+
+There are some difficulties in using the tied hash interface if you
+want to manipulate a BTREE database with duplicate keys. Consider this
+code:
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+
+ my ($filename, %h) ;
+
+ $filename = "tree" ;
+ unlink $filename ;
+
+ # Enable duplicate records
+ $DB_BTREE->{'flags'} = R_DUP ;
+
+ tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
+ # Add some key/value pairs to the file
+ $h{'Wall'} = 'Larry' ;
+ $h{'Wall'} = 'Brick' ; # Note the duplicate key
+ $h{'Wall'} = 'Brick' ; # Note the duplicate key and value
+ $h{'Smith'} = 'John' ;
+ $h{'mouse'} = 'mickey' ;
+
+ # iterate through the associative array
+ # and print each key/value pair.
+ foreach (sort keys %h)
+ { print "$_ -> $h{$_}\n" }
+
+ untie %h ;
+
+Here is the output:
+
+ Smith -> John
+ Wall -> Larry
+ Wall -> Larry
+ Wall -> Larry
+ mouse -> mickey
+
+As you can see 3 records have been successfully created with key C<Wall>
+- the only thing is, when they are retrieved from the database they
+I<seem> to have the same value, namely C<Larry>. The problem is caused
+by the way that the associative array interface works. Basically, when
+the associative array interface is used to fetch the value associated
+with a given key, it will only ever retrieve the first value.
+
+Although it may not be immediately obvious from the code above, the
+associative array interface can be used to write values with duplicate
+keys, but it cannot be used to read them back from the database.
+
+The way to get around this problem is to use the Berkeley DB API method
+called C<seq>. This method allows sequential access to key/value
+pairs. See L<THE API INTERFACE> for details of both the C<seq> method
+and the API in general.
+
+Here is the script above rewritten using the C<seq> API method.
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+
+ my ($filename, $x, %h, $status, $key, $value) ;
+
+ $filename = "tree" ;
+ unlink $filename ;
+
+ # Enable duplicate records
+ $DB_BTREE->{'flags'} = R_DUP ;
+
+ $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
+ # Add some key/value pairs to the file
+ $h{'Wall'} = 'Larry' ;
+ $h{'Wall'} = 'Brick' ; # Note the duplicate key
+ $h{'Wall'} = 'Brick' ; # Note the duplicate key and value
+ $h{'Smith'} = 'John' ;
+ $h{'mouse'} = 'mickey' ;
+
+ # iterate through the btree using seq
+ # and print each key/value pair.
+ $key = $value = 0 ;
+ for ($status = $x->seq($key, $value, R_FIRST) ;
+ $status == 0 ;
+ $status = $x->seq($key, $value, R_NEXT) )
+ { print "$key -> $value\n" }
+
+ undef $x ;
+ untie %h ;
+
+that prints:
+
+ Smith -> John
+ Wall -> Brick
+ Wall -> Brick
+ Wall -> Larry
+ mouse -> mickey
+
+This time we have got all the key/value pairs, including the multiple
+values associated with the key C<Wall>.
+
+To make life easier when dealing with duplicate keys, B<DB_File> comes with
+a few utility methods.
+
+=head2 The get_dup() Method
+
+The C<get_dup> method assists in
+reading duplicate values from BTREE databases. The method can take the
+following forms:
+
+ $count = $x->get_dup($key) ;
+ @list = $x->get_dup($key) ;
+ %list = $x->get_dup($key, 1) ;
+
+In a scalar context the method returns the number of values associated
+with the key, C<$key>.
+
+In list context, it returns all the values which match C<$key>. Note
+that the values will be returned in an apparently random order.
+
+In list context, if the second parameter is present and evaluates
+TRUE, the method returns an associative array. The keys of the
+associative array correspond to the values that matched in the BTREE
+and the values of the array are a count of the number of times that
+particular value occurred in the BTREE.
+
+So assuming the database created above, we can use C<get_dup> like
+this:
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+
+ my ($filename, $x, %h) ;
+
+ $filename = "tree" ;
+
+ # Enable duplicate records
+ $DB_BTREE->{'flags'} = R_DUP ;
+
+ $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
+ my $cnt = $x->get_dup("Wall") ;
+ print "Wall occurred $cnt times\n" ;
+
+ my %hash = $x->get_dup("Wall", 1) ;
+ print "Larry is there\n" if $hash{'Larry'} ;
+ print "There are $hash{'Brick'} Brick Walls\n" ;
+
+ my @list = sort $x->get_dup("Wall") ;
+ print "Wall => [@list]\n" ;
+
+ @list = $x->get_dup("Smith") ;
+ print "Smith => [@list]\n" ;
+
+ @list = $x->get_dup("Dog") ;
+ print "Dog => [@list]\n" ;
+
+
+and it will print:
+
+ Wall occurred 3 times
+ Larry is there
+ There are 2 Brick Walls
+ Wall => [Brick Brick Larry]
+ Smith => [John]
+ Dog => []
+
+=head2 The find_dup() Method
+
+ $status = $X->find_dup($key, $value) ;
+
+This method checks for the existence of a specific key/value pair. If the
+pair exists, the cursor is left pointing to the pair and the method
+returns 0. Otherwise the method returns a non-zero value.
+
+Assuming the database from the previous example:
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+
+ my ($filename, $x, %h, $found) ;
+
+ $filename = "tree" ;
+
+ # Enable duplicate records
+ $DB_BTREE->{'flags'} = R_DUP ;
+
+ $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
+ $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ;
+ print "Larry Wall is $found there\n" ;
+
+ $found = ( $x->find_dup("Wall", "Harry") == 0 ? "" : "not") ;
+ print "Harry Wall is $found there\n" ;
+
+ undef $x ;
+ untie %h ;
+
+prints this
+
+ Larry Wall is there
+ Harry Wall is not there
+
+
+=head2 The del_dup() Method
+
+ $status = $X->del_dup($key, $value) ;
+
+This method deletes a specific key/value pair. It returns
+0 if they exist and have been deleted successfully.
+Otherwise the method returns a non-zero value.
+
+Again assuming the existence of the C<tree> database
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+
+ my ($filename, $x, %h, $found) ;
+
+ $filename = "tree" ;
+
+ # Enable duplicate records
+ $DB_BTREE->{'flags'} = R_DUP ;
+
+ $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
+ $x->del_dup("Wall", "Larry") ;
+
+ $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ;
+ print "Larry Wall is $found there\n" ;
+
+ undef $x ;
+ untie %h ;
+
+prints this
+
+ Larry Wall is not there
+
+=head2 Matching Partial Keys
+
+The BTREE interface has a feature which allows partial keys to be
+matched. This functionality is I<only> available when the C<seq> method
+is used along with the R_CURSOR flag.
+
+ $x->seq($key, $value, R_CURSOR) ;
+
+Here is the relevant quote from the dbopen man page where it defines
+the use of the R_CURSOR flag with seq:
+
+ Note, for the DB_BTREE access method, the returned key is not
+ necessarily an exact match for the specified key. The returned key
+ is the smallest key greater than or equal to the specified key,
+ permitting partial key matches and range searches.
+
+In the example script below, the C<match> sub uses this feature to find
+and print the first matching key/value pair given a partial key.
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+ use Fcntl ;
+
+ my ($filename, $x, %h, $st, $key, $value) ;
+
+ sub match
+ {
+ my $key = shift ;
+ my $value = 0;
+ my $orig_key = $key ;
+ $x->seq($key, $value, R_CURSOR) ;
+ print "$orig_key\t-> $key\t-> $value\n" ;
+ }
+
+ $filename = "tree" ;
+ unlink $filename ;
+
+ $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
+ # Add some key/value pairs to the file
+ $h{'mouse'} = 'mickey' ;
+ $h{'Wall'} = 'Larry' ;
+ $h{'Walls'} = 'Brick' ;
+ $h{'Smith'} = 'John' ;
+
+
+ $key = $value = 0 ;
+ print "IN ORDER\n" ;
+ for ($st = $x->seq($key, $value, R_FIRST) ;
+ $st == 0 ;
+ $st = $x->seq($key, $value, R_NEXT) )
+
+ { print "$key -> $value\n" }
+
+ print "\nPARTIAL MATCH\n" ;
+
+ match "Wa" ;
+ match "A" ;
+ match "a" ;
+
+ undef $x ;
+ untie %h ;
+
+Here is the output:
+
+ IN ORDER
+ Smith -> John
+ Wall -> Larry
+ Walls -> Brick
+ mouse -> mickey
+
+ PARTIAL MATCH
+ Wa -> Wall -> Larry
+ A -> Smith -> John
+ a -> mouse -> mickey
+
+=head1 DB_RECNO
+
+DB_RECNO provides an interface to flat text files. Both variable and
+fixed length records are supported.
+
+In order to make RECNO more compatible with Perl, the array offset for
+all RECNO arrays begins at 0 rather than 1 as in Berkeley DB.
+
+As with normal Perl arrays, a RECNO array can be accessed using
+negative indexes. The index -1 refers to the last element of the array,
+-2 the second last, and so on. Attempting to access an element before
+the start of the array will raise a fatal run-time error.
+
+=head2 The 'bval' Option
+
+The operation of the bval option warrants some discussion. Here is the
+definition of bval from the Berkeley DB 1.85 recno manual page:
+
+ The delimiting byte to be used to mark the end of a
+ record for variable-length records, and the pad charac-
+ ter for fixed-length records. If no value is speci-
+ fied, newlines (``\n'') are used to mark the end of
+ variable-length records and fixed-length records are
+ padded with spaces.
+
+The second sentence is wrong. In actual fact bval will only default to
+C<"\n"> when the openinfo parameter in dbopen is NULL. If a non-NULL
+openinfo parameter is used at all, the value that happens to be in bval
+will be used. That means you always have to specify bval when making
+use of any of the options in the openinfo parameter. This documentation
+error will be fixed in the next release of Berkeley DB.
+
+That clarifies the situation with regards Berkeley DB itself. What
+about B<DB_File>? Well, the behavior defined in the quote above is
+quite useful, so B<DB_File> conforms to it.
+
+That means that you can specify other options (e.g. cachesize) and
+still have bval default to C<"\n"> for variable length records, and
+space for fixed length records.
+
+Also note that the bval option only allows you to specify a single byte
+as a delimiter.
+
+=head2 A Simple Example
+
+Here is a simple example that uses RECNO (if you are using a version
+of Perl earlier than 5.004_57 this example won't work -- see
+L<Extra RECNO Methods> for a workaround).
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+
+ my $filename = "text" ;
+ unlink $filename ;
+
+ my @h ;
+ tie @h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_RECNO
+ or die "Cannot open file 'text': $!\n" ;
+
+ # Add a few key/value pairs to the file
+ $h[0] = "orange" ;
+ $h[1] = "blue" ;
+ $h[2] = "yellow" ;
+
+ push @h, "green", "black" ;
+
+ my $elements = scalar @h ;
+ print "The array contains $elements entries\n" ;
+
+ my $last = pop @h ;
+ print "popped $last\n" ;
+
+ unshift @h, "white" ;
+ my $first = shift @h ;
+ print "shifted $first\n" ;
+
+ # Check for existence of a key
+ print "Element 1 Exists with value $h[1]\n" if $h[1] ;
+
+ # use a negative index
+ print "The last element is $h[-1]\n" ;
+ print "The 2nd last element is $h[-2]\n" ;
+
+ untie @h ;
+
+Here is the output from the script:
+
+ The array contains 5 entries
+ popped black
+ shifted white
+ Element 1 Exists with value blue
+ The last element is green
+ The 2nd last element is yellow
+
+=head2 Extra RECNO Methods
+
+If you are using a version of Perl earlier than 5.004_57, the tied
+array interface is quite limited. In the example script above
+C<push>, C<pop>, C<shift>, C<unshift>
+or determining the array length will not work with a tied array.
+
+To make the interface more useful for older versions of Perl, a number
+of methods are supplied with B<DB_File> to simulate the missing array
+operations. All these methods are accessed via the object returned from
+the tie call.
+
+Here are the methods:
+
+=over 5
+
+=item B<$X-E<gt>push(list) ;>
+
+Pushes the elements of C<list> to the end of the array.
+
+=item B<$value = $X-E<gt>pop ;>
+
+Removes and returns the last element of the array.
+
+=item B<$X-E<gt>shift>
+
+Removes and returns the first element of the array.
+
+=item B<$X-E<gt>unshift(list) ;>
+
+Pushes the elements of C<list> to the start of the array.
+
+=item B<$X-E<gt>length>
+
+Returns the number of elements in the array.
+
+=item B<$X-E<gt>splice(offset, length, elements);>
+
+Returns a splice of the array.
+
+=back
+
+=head2 Another Example
+
+Here is a more complete example that makes use of some of the methods
+described above. It also makes use of the API interface directly (see
+L<THE API INTERFACE>).
+
+ use warnings ;
+ use strict ;
+ my (@h, $H, $file, $i) ;
+ use DB_File ;
+ use Fcntl ;
+
+ $file = "text" ;
+
+ unlink $file ;
+
+ $H = tie @h, "DB_File", $file, O_RDWR|O_CREAT, 0666, $DB_RECNO
+ or die "Cannot open file $file: $!\n" ;
+
+ # first create a text file to play with
+ $h[0] = "zero" ;
+ $h[1] = "one" ;
+ $h[2] = "two" ;
+ $h[3] = "three" ;
+ $h[4] = "four" ;
+
+
+ # Print the records in order.
+ #
+ # The length method is needed here because evaluating a tied
+ # array in a scalar context does not return the number of
+ # elements in the array.
+
+ print "\nORIGINAL\n" ;
+ foreach $i (0 .. $H->length - 1) {
+ print "$i: $h[$i]\n" ;
+ }
+
+ # use the push & pop methods
+ $a = $H->pop ;
+ $H->push("last") ;
+ print "\nThe last record was [$a]\n" ;
+
+ # and the shift & unshift methods
+ $a = $H->shift ;
+ $H->unshift("first") ;
+ print "The first record was [$a]\n" ;
+
+ # Use the API to add a new record after record 2.
+ $i = 2 ;
+ $H->put($i, "Newbie", R_IAFTER) ;
+
+ # and a new record before record 1.
+ $i = 1 ;
+ $H->put($i, "New One", R_IBEFORE) ;
+
+ # delete record 3
+ $H->del(3) ;
+
+ # now print the records in reverse order
+ print "\nREVERSE\n" ;
+ for ($i = $H->length - 1 ; $i >= 0 ; -- $i)
+ { print "$i: $h[$i]\n" }
+
+ # same again, but use the API functions instead
+ print "\nREVERSE again\n" ;
+ my ($s, $k, $v) = (0, 0, 0) ;
+ for ($s = $H->seq($k, $v, R_LAST) ;
+ $s == 0 ;
+ $s = $H->seq($k, $v, R_PREV))
+ { print "$k: $v\n" }
+
+ undef $H ;
+ untie @h ;
+
+and this is what it outputs:
+
+ ORIGINAL
+ 0: zero
+ 1: one
+ 2: two
+ 3: three
+ 4: four
+
+ The last record was [four]
+ The first record was [zero]
+
+ REVERSE
+ 5: last
+ 4: three
+ 3: Newbie
+ 2: one
+ 1: New One
+ 0: first
+
+ REVERSE again
+ 5: last
+ 4: three
+ 3: Newbie
+ 2: one
+ 1: New One
+ 0: first
+
+Notes:
+
+=over 5
+
+=item 1.
+
+Rather than iterating through the array, C<@h> like this:
+
+ foreach $i (@h)
+
+it is necessary to use either this:
+
+ foreach $i (0 .. $H->length - 1)
+
+or this:
+
+ for ($a = $H->get($k, $v, R_FIRST) ;
+ $a == 0 ;
+ $a = $H->get($k, $v, R_NEXT) )
+
+=item 2.
+
+Notice that both times the C<put> method was used the record index was
+specified using a variable, C<$i>, rather than the literal value
+itself. This is because C<put> will return the record number of the
+inserted line via that parameter.
+
+=back
+
+=head1 THE API INTERFACE
+
+As well as accessing Berkeley DB using a tied hash or array, it is also
+possible to make direct use of most of the API functions defined in the
+Berkeley DB documentation.
+
+To do this you need to store a copy of the object returned from the tie.
+
+ $db = tie %hash, "DB_File", "filename" ;
+
+Once you have done that, you can access the Berkeley DB API functions
+as B<DB_File> methods directly like this:
+
+ $db->put($key, $value, R_NOOVERWRITE) ;
+
+B<Important:> If you have saved a copy of the object returned from
+C<tie>, the underlying database file will I<not> be closed until both
+the tied variable is untied and all copies of the saved object are
+destroyed.
+
+ use DB_File ;
+ $db = tie %hash, "DB_File", "filename"
+ or die "Cannot tie filename: $!" ;
+ ...
+ undef $db ;
+ untie %hash ;
+
+See L<The untie() Gotcha> for more details.
+
+All the functions defined in L<dbopen> are available except for
+close() and dbopen() itself. The B<DB_File> method interface to the
+supported functions have been implemented to mirror the way Berkeley DB
+works whenever possible. In particular note that:
+
+=over 5
+
+=item *
+
+The methods return a status value. All return 0 on success.
+All return -1 to signify an error and set C<$!> to the exact
+error code. The return code 1 generally (but not always) means that the
+key specified did not exist in the database.
+
+Other return codes are defined. See below and in the Berkeley DB
+documentation for details. The Berkeley DB documentation should be used
+as the definitive source.
+
+=item *
+
+Whenever a Berkeley DB function returns data via one of its parameters,
+the equivalent B<DB_File> method does exactly the same.
+
+=item *
+
+If you are careful, it is possible to mix API calls with the tied
+hash/array interface in the same piece of code. Although only a few of
+the methods used to implement the tied interface currently make use of
+the cursor, you should always assume that the cursor has been changed
+any time the tied hash/array interface is used. As an example, this
+code will probably not do what you expect:
+
+ $X = tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0777, $DB_BTREE
+ or die "Cannot tie $filename: $!" ;
+
+ # Get the first key/value pair and set the cursor
+ $X->seq($key, $value, R_FIRST) ;
+
+ # this line will modify the cursor
+ $count = scalar keys %x ;
+
+ # Get the second key/value pair.
+ # oops, it didn't, it got the last key/value pair!
+ $X->seq($key, $value, R_NEXT) ;
+
+The code above can be rearranged to get around the problem, like this:
+
+ $X = tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0777, $DB_BTREE
+ or die "Cannot tie $filename: $!" ;
+
+ # this line will modify the cursor
+ $count = scalar keys %x ;
+
+ # Get the first key/value pair and set the cursor
+ $X->seq($key, $value, R_FIRST) ;
+
+ # Get the second key/value pair.
+ # worked this time.
+ $X->seq($key, $value, R_NEXT) ;
+
+=back
+
+All the constants defined in L<dbopen> for use in the flags parameters
+in the methods defined below are also available. Refer to the Berkeley
+DB documentation for the precise meaning of the flags values.
+
+Below is a list of the methods available.
+
+=over 5
+
+=item B<$status = $X-E<gt>get($key, $value [, $flags]) ;>
+
+Given a key (C<$key>) this method reads the value associated with it
+from the database. The value read from the database is returned in the
+C<$value> parameter.
+
+If the key does not exist the method returns 1.
+
+No flags are currently defined for this method.
+
+=item B<$status = $X-E<gt>put($key, $value [, $flags]) ;>
+
+Stores the key/value pair in the database.
+
+If you use either the R_IAFTER or R_IBEFORE flags, the C<$key> parameter
+will have the record number of the inserted key/value pair set.
+
+Valid flags are R_CURSOR, R_IAFTER, R_IBEFORE, R_NOOVERWRITE and
+R_SETCURSOR.
+
+=item B<$status = $X-E<gt>del($key [, $flags]) ;>
+
+Removes all key/value pairs with key C<$key> from the database.
+
+A return code of 1 means that the requested key was not in the
+database.
+
+R_CURSOR is the only valid flag at present.
+
+=item B<$status = $X-E<gt>fd ;>
+
+Returns the file descriptor for the underlying database.
+
+See L<Locking: The Trouble with fd> for an explanation for why you should
+not use C<fd> to lock your database.
+
+=item B<$status = $X-E<gt>seq($key, $value, $flags) ;>
+
+This interface allows sequential retrieval from the database. See
+L<dbopen> for full details.
+
+Both the C<$key> and C<$value> parameters will be set to the key/value
+pair read from the database.
+
+The flags parameter is mandatory. The valid flag values are R_CURSOR,
+R_FIRST, R_LAST, R_NEXT and R_PREV.
+
+=item B<$status = $X-E<gt>sync([$flags]) ;>
+
+Flushes any cached buffers to disk.
+
+R_RECNOSYNC is the only valid flag at present.
+
+=back
+
+=head1 DBM FILTERS
+
+A DBM Filter is a piece of code that is be used when you I<always>
+want to make the same transformation to all keys and/or values in a
+DBM database.
+
+There are four methods associated with DBM Filters. All work identically,
+and each is used to install (or uninstall) a single DBM Filter. Each
+expects a single parameter, namely a reference to a sub. The only
+difference between them is the place that the filter is installed.
+
+To summarise:
+
+=over 5
+
+=item B<filter_store_key>
+
+If a filter has been installed with this method, it will be invoked
+every time you write a key to a DBM database.
+
+=item B<filter_store_value>
+
+If a filter has been installed with this method, it will be invoked
+every time you write a value to a DBM database.
+
+
+=item B<filter_fetch_key>
+
+If a filter has been installed with this method, it will be invoked
+every time you read a key from a DBM database.
+
+=item B<filter_fetch_value>
+
+If a filter has been installed with this method, it will be invoked
+every time you read a value from a DBM database.
+
+=back
+
+You can use any combination of the methods, from none, to all four.
+
+All filter methods return the existing filter, if present, or C<undef>
+in not.
+
+To delete a filter pass C<undef> to it.
+
+=head2 The Filter
+
+When each filter is called by Perl, a local copy of C<$_> will contain
+the key or value to be filtered. Filtering is achieved by modifying
+the contents of C<$_>. The return code from the filter is ignored.
+
+=head2 An Example -- the NULL termination problem.
+
+Consider the following scenario. You have a DBM database
+that you need to share with a third-party C application. The C application
+assumes that I<all> keys and values are NULL terminated. Unfortunately
+when Perl writes to DBM databases it doesn't use NULL termination, so
+your Perl application will have to manage NULL termination itself. When
+you write to the database you will have to use something like this:
+
+ $hash{"$key\0"} = "$value\0" ;
+
+Similarly the NULL needs to be taken into account when you are considering
+the length of existing keys/values.
+
+It would be much better if you could ignore the NULL terminations issue
+in the main application code and have a mechanism that automatically
+added the terminating NULL to all keys and values whenever you write to
+the database and have them removed when you read from the database. As I'm
+sure you have already guessed, this is a problem that DBM Filters can
+fix very easily.
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+
+ my %hash ;
+ my $filename = "filt" ;
+ unlink $filename ;
+
+ my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH
+ or die "Cannot open $filename: $!\n" ;
+
+ # Install DBM Filters
+ $db->filter_fetch_key ( sub { s/\0$// } ) ;
+ $db->filter_store_key ( sub { $_ .= "\0" } ) ;
+ $db->filter_fetch_value( sub { s/\0$// } ) ;
+ $db->filter_store_value( sub { $_ .= "\0" } ) ;
+
+ $hash{"abc"} = "def" ;
+ my $a = $hash{"ABC"} ;
+ # ...
+ undef $db ;
+ untie %hash ;
+
+Hopefully the contents of each of the filters should be
+self-explanatory. Both "fetch" filters remove the terminating NULL,
+and both "store" filters add a terminating NULL.
+
+
+=head2 Another Example -- Key is a C int.
+
+Here is another real-life example. By default, whenever Perl writes to
+a DBM database it always writes the key and value as strings. So when
+you use this:
+
+ $hash{12345} = "something" ;
+
+the key 12345 will get stored in the DBM database as the 5 byte string
+"12345". If you actually want the key to be stored in the DBM database
+as a C int, you will have to use C<pack> when writing, and C<unpack>
+when reading.
+
+Here is a DBM Filter that does it:
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+ my %hash ;
+ my $filename = "filt" ;
+ unlink $filename ;
+
+
+ my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH
+ or die "Cannot open $filename: $!\n" ;
+
+ $db->filter_fetch_key ( sub { $_ = unpack("i", $_) } ) ;
+ $db->filter_store_key ( sub { $_ = pack ("i", $_) } ) ;
+ $hash{123} = "def" ;
+ # ...
+ undef $db ;
+ untie %hash ;
+
+This time only two filters have been used -- we only need to manipulate
+the contents of the key, so it wasn't necessary to install any value
+filters.
+
+=head1 HINTS AND TIPS
+
+
+=head2 Locking: The Trouble with fd
+
+Until version 1.72 of this module, the recommended technique for locking
+B<DB_File> databases was to flock the filehandle returned from the "fd"
+function. Unfortunately this technique has been shown to be fundamentally
+flawed (Kudos to David Harris for tracking this down). Use it at your own
+peril!
+
+The locking technique went like this.
+
+ $db = tie(%db, 'DB_File', 'foo.db', O_CREAT|O_RDWR, 0644)
+ || die "dbcreat foo.db $!";
+ $fd = $db->fd;
+ open(DB_FH, "+<&=$fd") || die "dup $!";
+ flock (DB_FH, LOCK_EX) || die "flock: $!";
+ ...
+ $db{"Tom"} = "Jerry" ;
+ ...
+ flock(DB_FH, LOCK_UN);
+ undef $db;
+ untie %db;
+ close(DB_FH);
+
+In simple terms, this is what happens:
+
+=over 5
+
+=item 1.
+
+Use "tie" to open the database.
+
+=item 2.
+
+Lock the database with fd & flock.
+
+=item 3.
+
+Read & Write to the database.
+
+=item 4.
+
+Unlock and close the database.
+
+=back
+
+Here is the crux of the problem. A side-effect of opening the B<DB_File>
+database in step 2 is that an initial block from the database will get
+read from disk and cached in memory.
+
+To see why this is a problem, consider what can happen when two processes,
+say "A" and "B", both want to update the same B<DB_File> database
+using the locking steps outlined above. Assume process "A" has already
+opened the database and has a write lock, but it hasn't actually updated
+the database yet (it has finished step 2, but not started step 3 yet). Now
+process "B" tries to open the same database - step 1 will succeed,
+but it will block on step 2 until process "A" releases the lock. The
+important thing to notice here is that at this point in time both
+processes will have cached identical initial blocks from the database.
+
+Now process "A" updates the database and happens to change some of the
+data held in the initial buffer. Process "A" terminates, flushing
+all cached data to disk and releasing the database lock. At this point
+the database on disk will correctly reflect the changes made by process
+"A".
+
+With the lock released, process "B" can now continue. It also updates the
+database and unfortunately it too modifies the data that was in its
+initial buffer. Once that data gets flushed to disk it will overwrite
+some/all of the changes process "A" made to the database.
+
+The result of this scenario is at best a database that doesn't contain
+what you expect. At worst the database will corrupt.
+
+The above won't happen every time competing process update the same
+B<DB_File> database, but it does illustrate why the technique should
+not be used.
+
+=head2 Safe ways to lock a database
+
+Starting with version 2.x, Berkeley DB has internal support for locking.
+The companion module to this one, B<BerkeleyDB>, provides an interface
+to this locking functionality. If you are serious about locking
+Berkeley DB databases, I strongly recommend using B<BerkeleyDB>.
+
+If using B<BerkeleyDB> isn't an option, there are a number of modules
+available on CPAN that can be used to implement locking. Each one
+implements locking differently and has different goals in mind. It is
+therefore worth knowing the difference, so that you can pick the right
+one for your application. Here are the three locking wrappers:
+
+=over 5
+
+=item B<Tie::DB_Lock>
+
+A B<DB_File> wrapper which creates copies of the database file for
+read access, so that you have a kind of a multiversioning concurrent read
+system. However, updates are still serial. Use for databases where reads
+may be lengthy and consistency problems may occur.
+
+=item B<Tie::DB_LockFile>
+
+A B<DB_File> wrapper that has the ability to lock and unlock the database
+while it is being used. Avoids the tie-before-flock problem by simply
+re-tie-ing the database when you get or drop a lock. Because of the
+flexibility in dropping and re-acquiring the lock in the middle of a
+session, this can be massaged into a system that will work with long
+updates and/or reads if the application follows the hints in the POD
+documentation.
+
+=item B<DB_File::Lock>
+
+An extremely lightweight B<DB_File> wrapper that simply flocks a lockfile
+before tie-ing the database and drops the lock after the untie. Allows
+one to use the same lockfile for multiple databases to avoid deadlock
+problems, if desired. Use for databases where updates are reads are
+quick and simple flock locking semantics are enough.
+
+=back
+
+=head2 Sharing Databases With C Applications
+
+There is no technical reason why a Berkeley DB database cannot be
+shared by both a Perl and a C application.
+
+The vast majority of problems that are reported in this area boil down
+to the fact that C strings are NULL terminated, whilst Perl strings are
+not. See L<DBM FILTERS> for a generic way to work around this problem.
+
+Here is a real example. Netscape 2.0 keeps a record of the locations you
+visit along with the time you last visited them in a DB_HASH database.
+This is usually stored in the file F<~/.netscape/history.db>. The key
+field in the database is the location string and the value field is the
+time the location was last visited stored as a 4 byte binary value.
+
+If you haven't already guessed, the location string is stored with a
+terminating NULL. This means you need to be careful when accessing the
+database.
+
+Here is a snippet of code that is loosely based on Tom Christiansen's
+I<ggh> script (available from your nearest CPAN archive in
+F<authors/id/TOMC/scripts/nshist.gz>).
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+ use Fcntl ;
+
+ my ($dotdir, $HISTORY, %hist_db, $href, $binary_time, $date) ;
+ $dotdir = $ENV{HOME} || $ENV{LOGNAME};
+
+ $HISTORY = "$dotdir/.netscape/history.db";
+
+ tie %hist_db, 'DB_File', $HISTORY
+ or die "Cannot open $HISTORY: $!\n" ;;
+
+ # Dump the complete database
+ while ( ($href, $binary_time) = each %hist_db ) {
+
+ # remove the terminating NULL
+ $href =~ s/\x00$// ;
+
+ # convert the binary time into a user friendly string
+ $date = localtime unpack("V", $binary_time);
+ print "$date $href\n" ;
+ }
+
+ # check for the existence of a specific key
+ # remember to add the NULL
+ if ( $binary_time = $hist_db{"http://mox.perl.com/\x00"} ) {
+ $date = localtime unpack("V", $binary_time) ;
+ print "Last visited mox.perl.com on $date\n" ;
+ }
+ else {
+ print "Never visited mox.perl.com\n"
+ }
+
+ untie %hist_db ;
+
+=head2 The untie() Gotcha
+
+If you make use of the Berkeley DB API, it is I<very> strongly
+recommended that you read L<perltie/The untie Gotcha>.
+
+Even if you don't currently make use of the API interface, it is still
+worth reading it.
+
+Here is an example which illustrates the problem from a B<DB_File>
+perspective:
+
+ use DB_File ;
+ use Fcntl ;
+
+ my %x ;
+ my $X ;
+
+ $X = tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_TRUNC
+ or die "Cannot tie first time: $!" ;
+
+ $x{123} = 456 ;
+
+ untie %x ;
+
+ tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_CREAT
+ or die "Cannot tie second time: $!" ;
+
+ untie %x ;
+
+When run, the script will produce this error message:
+
+ Cannot tie second time: Invalid argument at bad.file line 14.
+
+Although the error message above refers to the second tie() statement
+in the script, the source of the problem is really with the untie()
+statement that precedes it.
+
+Having read L<perltie> you will probably have already guessed that the
+error is caused by the extra copy of the tied object stored in C<$X>.
+If you haven't, then the problem boils down to the fact that the
+B<DB_File> destructor, DESTROY, will not be called until I<all>
+references to the tied object are destroyed. Both the tied variable,
+C<%x>, and C<$X> above hold a reference to the object. The call to
+untie() will destroy the first, but C<$X> still holds a valid
+reference, so the destructor will not get called and the database file
+F<tst.fil> will remain open. The fact that Berkeley DB then reports the
+attempt to open a database that is already open via the catch-all
+"Invalid argument" doesn't help.
+
+If you run the script with the C<-w> flag the error message becomes:
+
+ untie attempted while 1 inner references still exist at bad.file line 12.
+ Cannot tie second time: Invalid argument at bad.file line 14.
+
+which pinpoints the real problem. Finally the script can now be
+modified to fix the original problem by destroying the API object
+before the untie:
+
+ ...
+ $x{123} = 456 ;
+
+ undef $X ;
+ untie %x ;
+
+ $X = tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_CREAT
+ ...
+
+
+=head1 COMMON QUESTIONS
+
+=head2 Why is there Perl source in my database?
+
+If you look at the contents of a database file created by DB_File,
+there can sometimes be part of a Perl script included in it.
+
+This happens because Berkeley DB uses dynamic memory to allocate
+buffers which will subsequently be written to the database file. Being
+dynamic, the memory could have been used for anything before DB
+malloced it. As Berkeley DB doesn't clear the memory once it has been
+allocated, the unused portions will contain random junk. In the case
+where a Perl script gets written to the database, the random junk will
+correspond to an area of dynamic memory that happened to be used during
+the compilation of the script.
+
+Unless you don't like the possibility of there being part of your Perl
+scripts embedded in a database file, this is nothing to worry about.
+
+=head2 How do I store complex data structures with DB_File?
+
+Although B<DB_File> cannot do this directly, there is a module which
+can layer transparently over B<DB_File> to accomplish this feat.
+
+Check out the MLDBM module, available on CPAN in the directory
+F<modules/by-module/MLDBM>.
+
+=head2 What does "Invalid Argument" mean?
+
+You will get this error message when one of the parameters in the
+C<tie> call is wrong. Unfortunately there are quite a few parameters to
+get wrong, so it can be difficult to figure out which one it is.
+
+Here are a couple of possibilities:
+
+=over 5
+
+=item 1.
+
+Attempting to reopen a database without closing it.
+
+=item 2.
+
+Using the O_WRONLY flag.
+
+=back
+
+=head2 What does "Bareword 'DB_File' not allowed" mean?
+
+You will encounter this particular error message when you have the
+C<strict 'subs'> pragma (or the full strict pragma) in your script.
+Consider this script:
+
+ use warnings ;
+ use strict ;
+ use DB_File ;
+ my %x ;
+ tie %x, DB_File, "filename" ;
+
+Running it produces the error in question:
+
+ Bareword "DB_File" not allowed while "strict subs" in use
+
+To get around the error, place the word C<DB_File> in either single or
+double quotes, like this:
+
+ tie %x, "DB_File", "filename" ;
+
+Although it might seem like a real pain, it is really worth the effort
+of having a C<use strict> in all your scripts.
+
+=head1 REFERENCES
+
+Articles that are either about B<DB_File> or make use of it.
+
+=over 5
+
+=item 1.
+
+I<Full-Text Searching in Perl>, Tim Kientzle (tkientzle@ddj.com),
+Dr. Dobb's Journal, Issue 295, January 1999, pp 34-41
+
+=back
+
+=head1 HISTORY
+
+Moved to the Changes file.
+
+=head1 BUGS
+
+Some older versions of Berkeley DB had problems with fixed length
+records using the RECNO file format. This problem has been fixed since
+version 1.85 of Berkeley DB.
+
+I am sure there are bugs in the code. If you do find any, or can
+suggest any enhancements, I would welcome your comments.
+
+=head1 AVAILABILITY
+
+B<DB_File> comes with the standard Perl source distribution. Look in
+the directory F<ext/DB_File>. Given the amount of time between releases
+of Perl the version that ships with Perl is quite likely to be out of
+date, so the most recent version can always be found on CPAN (see
+L<perlmodlib/CPAN> for details), in the directory
+F<modules/by-module/DB_File>.
+
+This version of B<DB_File> will work with either version 1.x, 2.x or
+3.x of Berkeley DB, but is limited to the functionality provided by
+version 1.
+
+The official web site for Berkeley DB is F<http://www.oracle.com/technology/products/berkeley-db/db/index.html>.
+All versions of Berkeley DB are available there.
+
+Alternatively, Berkeley DB version 1 is available at your nearest CPAN
+archive in F<src/misc/db.1.85.tar.gz>.
+
+If you are running IRIX, then get Berkeley DB version 1 from
+F<http://reality.sgi.com/ariel>. It has the patches necessary to
+compile properly on IRIX 5.3.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-2007 Paul Marquess. All rights reserved. This program
+is free software; you can redistribute it and/or modify it under the
+same terms as Perl itself.
+
+Although B<DB_File> is covered by the Perl license, the library it
+makes use of, namely Berkeley DB, is not. Berkeley DB has its own
+copyright and its own license. Please take the time to read it.
+
+Here are are few words taken from the Berkeley DB FAQ (at
+F<http://www.oracle.com/technology/products/berkeley-db/db/index.html>) regarding the license:
+
+ Do I have to license DB to use it in Perl scripts?
+
+ No. The Berkeley DB license requires that software that uses
+ Berkeley DB be freely redistributable. In the case of Perl, that
+ software is Perl, and not your scripts. Any Perl scripts that you
+ write are your property, including scripts that make use of
+ Berkeley DB. Neither the Perl license nor the Berkeley DB license
+ place any restriction on what you may do with them.
+
+If you are in any doubt about the license situation, contact either the
+Berkeley DB authors or the author of DB_File. See L<"AUTHOR"> for details.
+
+
+=head1 SEE ALSO
+
+L<perl>, L<dbopen(3)>, L<hash(3)>, L<recno(3)>, L<btree(3)>,
+L<perldbmfilter>
+
+=head1 AUTHOR
+
+The DB_File interface was written by Paul Marquess
+E<lt>pmqs@cpan.orgE<gt>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Devel/DProf.pm b/Master/tlpkg/tlperl.straw/lib/Devel/DProf.pm
new file mode 100755
index 00000000000..7405b78dcf7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Devel/DProf.pm
@@ -0,0 +1,238 @@
+use 5.006_001;
+
+=head1 NAME
+
+Devel::DProf - a Perl code profiler
+
+=head1 SYNOPSIS
+
+ perl -d:DProf test.pl
+
+=head1 DESCRIPTION
+
+The Devel::DProf package is a Perl code profiler. This will collect
+information on the execution time of a Perl script and of the subs in that
+script. This information can be used to determine which subroutines are
+using the most time and which subroutines are being called most often. This
+information can also be used to create an execution graph of the script,
+showing subroutine relationships.
+
+To profile a Perl script run the perl interpreter with the B<-d> debugging
+switch. The profiler uses the debugging hooks. So to profile script
+F<test.pl> the following command should be used:
+
+ perl -d:DProf test.pl
+
+When the script terminates (or when the output buffer is filled) the
+profiler will dump the profile information to a file called
+F<tmon.out>. A tool like I<dprofpp> can be used to interpret the
+information which is in that profile. The following command will
+print the top 15 subroutines which used the most time:
+
+ dprofpp
+
+To print an execution graph of the subroutines in the script use the
+following command:
+
+ dprofpp -T
+
+Consult L<dprofpp> for other options.
+
+=head1 PROFILE FORMAT
+
+The old profile is a text file which looks like this:
+
+ #fOrTyTwO
+ $hz=100;
+ $XS_VERSION='DProf 19970606';
+ # All values are given in HZ
+ $rrun_utime=2; $rrun_stime=0; $rrun_rtime=7
+ PART2
+ + 26 28 566822884 DynaLoader::import
+ - 26 28 566822884 DynaLoader::import
+ + 27 28 566822885 main::bar
+ - 27 28 566822886 main::bar
+ + 27 28 566822886 main::baz
+ + 27 28 566822887 main::bar
+ - 27 28 566822888 main::bar
+ [....]
+
+The first line is the magic number. The second line is the hertz value, or
+clock ticks, of the machine where the profile was collected. The third line
+is the name and version identifier of the tool which created the profile.
+The fourth line is a comment. The fifth line contains three variables
+holding the user time, system time, and realtime of the process while it was
+being profiled. The sixth line indicates the beginning of the sub
+entry/exit profile section.
+
+The columns in B<PART2> are:
+
+ sub entry(+)/exit(-) mark
+ app's user time at sub entry/exit mark, in ticks
+ app's system time at sub entry/exit mark, in ticks
+ app's realtime at sub entry/exit mark, in ticks
+ fully-qualified sub name, when possible
+
+With newer perls another format is used, which may look like this:
+
+ #fOrTyTwO
+ $hz=10000;
+ $XS_VERSION='DProf 19971213';
+ # All values are given in HZ
+ $over_utime=5917; $over_stime=0; $over_rtime=5917;
+ $over_tests=10000;
+ $rrun_utime=1284; $rrun_stime=0; $rrun_rtime=1284;
+ $total_marks=6;
+
+ PART2
+ @ 406 0 406
+ & 2 main bar
+ + 2
+ @ 456 0 456
+ - 2
+ @ 1 0 1
+ & 3 main baz
+ + 3
+ @ 141 0 141
+ + 2
+ @ 141 0 141
+ - 2
+ @ 1 0 1
+ & 4 main foo
+ + 4
+ @ 142 0 142
+ + & Devel::DProf::write
+ @ 5 0 5
+ - & Devel::DProf::write
+
+(with high value of $ENV{PERL_DPROF_TICKS}).
+
+New C<$over_*> values show the measured overhead of making $over_tests
+calls to the profiler These values are used by the profiler to
+subtract the overhead from the runtimes.
+
+Lines starting with C<@> mark the amount of time passed since the
+previous C<@> line. The numbers following the C<@> are integer tick
+counts representing user, system, and real time. Divide these numbers
+by the $hz value in the header to get seconds.
+
+Lines starting with C<&> map subroutine identifiers (an integer) to
+subroutine packages and names. These should only occur once per
+subroutine.
+
+Lines starting with C<+> or C<-> mark normal entering and exit of
+subroutines. The number following is a reference to a subroutine
+identifier.
+
+Lines starting with C<*> mark where subroutines are entered by C<goto
+&subr>, but note that the return will still be marked as coming from
+the original sub. The sequence might look like this:
+
+ + 5
+ * 6
+ - 5
+
+Lines starting with C</> is like C<-> but mark where subroutines are
+exited by dying. Example:
+
+ + 5
+ + 6
+ / 6
+ / 5
+
+Finally you might find C<@> time stamp marks surrounded by C<+ &
+Devel::DProf::write> and C<- & Devel::DProf::write> lines. These 3
+lines are outputted when printing of the mark above actually consumed
+measurable time.
+
+=head1 AUTOLOAD
+
+When Devel::DProf finds a call to an C<&AUTOLOAD> subroutine it looks at the
+C<$AUTOLOAD> variable to find the real name of the sub being called. See
+L<perlsub/"Autoloading">.
+
+=head1 ENVIRONMENT
+
+C<PERL_DPROF_BUFFER> sets size of output buffer in words. Defaults to 2**14.
+
+C<PERL_DPROF_TICKS> sets number of ticks per second on some systems where
+a replacement for times() is used. Defaults to the value of C<HZ> macro.
+
+C<PERL_DPROF_OUT_FILE_NAME> sets the name of the output file. If not set,
+defaults to tmon.out.
+
+=head1 BUGS
+
+Builtin functions cannot be measured by Devel::DProf.
+
+With a newer Perl DProf relies on the fact that the numeric slot of
+$DB::sub contains an address of a subroutine. Excessive manipulation
+of this variable may overwrite this slot, as in
+
+ $DB::sub = 'current_sub';
+ ...
+ $addr = $DB::sub + 0;
+
+will set this numeric slot to numeric value of the string
+C<current_sub>, i.e., to C<0>. This will cause a segfault on the exit
+from this subroutine. Note that the first assignment above does not
+change the numeric slot (it will I<mark> it as invalid, but will not
+write over it).
+
+Another problem is that if a subroutine exits using goto(LABEL),
+last(LABEL) or next(LABEL) then perl may crash or Devel::DProf will die
+with the error:
+
+ panic: Devel::DProf inconsistent subroutine return
+
+For example, this code will break under Devel::DProf:
+
+ sub foo {
+ last FOO;
+ }
+ FOO: {
+ foo();
+ }
+
+A pattern like this is used by Test::More's skip() function, for
+example. See L<perldiag> for more details.
+
+Mail bug reports and feature requests to the perl5-porters mailing list at
+F<E<lt>perl5-porters@perl.orgE<gt>>.
+
+=head1 SEE ALSO
+
+L<perl>, L<dprofpp>, times(2)
+
+=cut
+
+# This sub is needed for calibration.
+package Devel::DProf;
+
+sub NONESUCH_noxs {
+ return $Devel::DProf::VERSION;
+}
+
+package DB;
+
+#
+# As of perl5.003_20, &DB::sub stub is not needed (some versions
+# even had problems if stub was redefined with XS version).
+#
+
+# disable DB single-stepping
+BEGIN { $single = 0; }
+
+# This sub is needed during startup.
+sub DB {
+# print "nonXS DBDB\n";
+}
+
+use XSLoader ();
+
+$Devel::DProf::VERSION = '20080331.00'; # this version not authorized by
+ # Dean Roehrich. See "Changes" file.
+
+XSLoader::load 'Devel::DProf', $Devel::DProf::VERSION;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Devel/InnerPackage.pm b/Master/tlpkg/tlperl.straw/lib/Devel/InnerPackage.pm
new file mode 100755
index 00000000000..614a59a85e5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Devel/InnerPackage.pm
@@ -0,0 +1,128 @@
+package Devel::InnerPackage;
+
+use strict;
+use base qw(Exporter);
+use vars qw($VERSION @EXPORT_OK);
+
+$VERSION = '0.3';
+@EXPORT_OK = qw(list_packages);
+
+=pod
+
+=head1 NAME
+
+
+Devel::InnerPackage - find all the inner packages of a package
+
+=head1 SYNOPSIS
+
+ use Foo::Bar;
+ use Devel::InnerPackage qw(list_packages);
+
+ my @inner_packages = list_packages('Foo::Bar');
+
+
+=head1 DESCRIPTION
+
+
+Given a file like this
+
+
+ package Foo::Bar;
+
+ sub foo {}
+
+
+ package Foo::Bar::Quux;
+
+ sub quux {}
+
+ package Foo::Bar::Quirka;
+
+ sub quirka {}
+
+ 1;
+
+then
+
+ list_packages('Foo::Bar');
+
+will return
+
+ Foo::Bar::Quux
+ Foo::Bar::Quirka
+
+=head1 METHODS
+
+=head2 list_packages <package name>
+
+Return a list of all inner packages of that package.
+
+=cut
+
+sub list_packages {
+ my $pack = shift; $pack .= "::" unless $pack =~ m!::$!;
+
+ no strict 'refs';
+ my @packs;
+ my @stuff = grep !/^(main|)::$/, keys %{$pack};
+ for my $cand (grep /::$/, @stuff)
+ {
+ $cand =~ s!::$!!;
+ my @children = list_packages($pack.$cand);
+
+ push @packs, "$pack$cand" unless $cand =~ /^::/ ||
+ !__PACKAGE__->_loaded($pack.$cand); # or @children;
+ push @packs, @children;
+ }
+ return grep {$_ !~ /::(::ISA::CACHE|SUPER)/} @packs;
+}
+
+### XXX this is an inlining of the Class-Inspector->loaded()
+### method, but inlined to remove the dependency.
+sub _loaded {
+ my ($class, $name) = @_;
+
+ no strict 'refs';
+
+ # Handle by far the two most common cases
+ # This is very fast and handles 99% of cases.
+ return 1 if defined ${"${name}::VERSION"};
+ return 1 if defined @{"${name}::ISA"};
+
+ # Are there any symbol table entries other than other namespaces
+ foreach ( keys %{"${name}::"} ) {
+ next if substr($_, -2, 2) eq '::';
+ return 1 if defined &{"${name}::$_"};
+ }
+
+ # No functions, and it doesn't have a version, and isn't anything.
+ # As an absolute last resort, check for an entry in %INC
+ my $filename = join( '/', split /(?:'|::)/, $name ) . '.pm';
+ return 1 if defined $INC{$filename};
+
+ '';
+}
+
+
+=head1 AUTHOR
+
+Simon Wistow <simon@thegestalt.org>
+
+=head1 COPYING
+
+Copyright, 2005 Simon Wistow
+
+Distributed under the same terms as Perl itself.
+
+=head1 BUGS
+
+None known.
+
+=cut
+
+
+
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Devel/PPPort.pm b/Master/tlpkg/tlperl.straw/lib/Devel/PPPort.pm
new file mode 100755
index 00000000000..5d786f12a50
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Devel/PPPort.pm
@@ -0,0 +1,8269 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! -- Edit PPPort_pm.PL instead. !!!!!
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by PPPort_pm.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+#
+# Perl/Pollution/Portability
+#
+################################################################################
+#
+# $Revision: 65 $
+# $Author: mhx $
+# $Date: 2009/06/12 04:10:36 +0200 $
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2009, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+=head1 NAME
+
+Devel::PPPort - Perl/Pollution/Portability
+
+=head1 SYNOPSIS
+
+ Devel::PPPort::WriteFile(); # defaults to ./ppport.h
+ Devel::PPPort::WriteFile('someheader.h');
+
+=head1 DESCRIPTION
+
+Perl's API has changed over time, gaining new features, new functions,
+increasing its flexibility, and reducing the impact on the C namespace
+environment (reduced pollution). The header file written by this module,
+typically F<ppport.h>, attempts to bring some of the newer Perl API
+features to older versions of Perl, so that you can worry less about
+keeping track of old releases, but users can still reap the benefit.
+
+C<Devel::PPPort> contains a single function, called C<WriteFile>. Its
+only purpose is to write the F<ppport.h> C header file. This file
+contains a series of macros and, if explicitly requested, functions that
+allow XS modules to be built using older versions of Perl. Currently,
+Perl versions from 5.003 to 5.10.0 are supported.
+
+This module is used by C<h2xs> to write the file F<ppport.h>.
+
+=head2 Why use ppport.h?
+
+You should use F<ppport.h> in modern code so that your code will work
+with the widest range of Perl interpreters possible, without significant
+additional work.
+
+You should attempt older code to fully use F<ppport.h>, because the
+reduced pollution of newer Perl versions is an important thing. It's so
+important that the old polluting ways of original Perl modules will not be
+supported very far into the future, and your module will almost certainly
+break! By adapting to it now, you'll gain compatibility and a sense of
+having done the electronic ecology some good.
+
+=head2 How to use ppport.h
+
+Don't direct the users of your module to download C<Devel::PPPort>.
+They are most probably no XS writers. Also, don't make F<ppport.h>
+optional. Rather, just take the most recent copy of F<ppport.h> that
+you can find (e.g. by generating it with the latest C<Devel::PPPort>
+release from CPAN), copy it into your project, adjust your project to
+use it, and distribute the header along with your module.
+
+=head2 Running ppport.h
+
+But F<ppport.h> is more than just a C header. It's also a Perl script
+that can check your source code. It will suggest hints and portability
+notes, and can even make suggestions on how to change your code. You
+can run it like any other Perl program:
+
+ perl ppport.h [options] [files]
+
+It also has embedded documentation, so you can use
+
+ perldoc ppport.h
+
+to find out more about how to use it.
+
+=head1 FUNCTIONS
+
+=head2 WriteFile
+
+C<WriteFile> takes one optional argument. When called with one
+argument, it expects to be passed a filename. When called with
+no arguments, it defaults to the filename F<ppport.h>.
+
+The function returns a true value if the file was written successfully.
+Otherwise it returns a false value.
+
+=head1 COMPATIBILITY
+
+F<ppport.h> supports Perl versions from 5.003 to 5.10.0
+in threaded and non-threaded configurations.
+
+=head2 Provided Perl compatibility API
+
+The header file written by this module, typically F<ppport.h>, provides
+access to the following elements of the Perl API that is not available
+in older Perl releases:
+
+ _aMY_CXT
+ _pMY_CXT
+ aMY_CXT
+ aMY_CXT_
+ aTHX
+ aTHX_
+ aTHXR
+ aTHXR_
+ AvFILLp
+ boolSV
+ call_argv
+ call_method
+ call_pv
+ call_sv
+ ckWARN
+ CopFILE
+ CopFILE_set
+ CopFILEAV
+ CopFILEGV
+ CopFILEGV_set
+ CopFILESV
+ CopSTASH
+ CopSTASH_eq
+ CopSTASH_set
+ CopSTASHPV
+ CopSTASHPV_set
+ CopyD
+ CPERLscope
+ dAX
+ dAXMARK
+ DEFSV
+ DEFSV_set
+ dITEMS
+ dMY_CXT
+ dMY_CXT_SV
+ dNOOP
+ dTHR
+ dTHX
+ dTHXa
+ dTHXoa
+ dTHXR
+ dUNDERBAR
+ dVAR
+ dXCPT
+ dXSTARG
+ END_EXTERN_C
+ ERRSV
+ eval_pv
+ eval_sv
+ EXTERN_C
+ G_METHOD
+ get_av
+ get_cv
+ get_hv
+ get_sv
+ grok_bin
+ grok_hex
+ grok_number
+ GROK_NUMERIC_RADIX
+ grok_numeric_radix
+ grok_oct
+ gv_fetchpvn_flags
+ gv_fetchpvs
+ gv_stashpvn
+ gv_stashpvs
+ GvSVn
+ hv_fetchs
+ hv_stores
+ HvNAME_get
+ HvNAMELEN_get
+ IN_LOCALE
+ IN_LOCALE_COMPILETIME
+ IN_LOCALE_RUNTIME
+ IN_PERL_COMPILETIME
+ INT2PTR
+ IS_NUMBER_GREATER_THAN_UV_MAX
+ IS_NUMBER_IN_UV
+ IS_NUMBER_INFINITY
+ IS_NUMBER_NAN
+ IS_NUMBER_NEG
+ IS_NUMBER_NOT_INT
+ isALNUMC
+ isASCII
+ isBLANK
+ isCNTRL
+ isGRAPH
+ isGV_with_GP
+ isPRINT
+ isPSXSPC
+ isPUNCT
+ isXDIGIT
+ IVdf
+ IVSIZE
+ IVTYPE
+ load_module
+ memEQ
+ memNE
+ MoveD
+ mPUSHi
+ mPUSHn
+ mPUSHp
+ mPUSHs
+ mPUSHu
+ mXPUSHi
+ mXPUSHn
+ mXPUSHp
+ mXPUSHs
+ mXPUSHu
+ MY_CXT
+ MY_CXT_CLONE
+ MY_CXT_INIT
+ my_snprintf
+ my_sprintf
+ my_strlcat
+ my_strlcpy
+ newCONSTSUB
+ newRV_inc
+ newRV_noinc
+ newSV_type
+ newSVpvn
+ newSVpvn_flags
+ newSVpvn_share
+ newSVpvn_utf8
+ newSVpvs
+ newSVpvs_flags
+ newSVuv
+ Newx
+ Newxc
+ Newxz
+ NOOP
+ NUM2PTR
+ NVef
+ NVff
+ NVgf
+ NVTYPE
+ packWARN
+ PERL_ABS
+ PERL_BCDVERSION
+ PERL_GCC_BRACE_GROUPS_FORBIDDEN
+ PERL_HASH
+ PERL_INT_MAX
+ PERL_INT_MIN
+ PERL_LONG_MAX
+ PERL_LONG_MIN
+ PERL_MAGIC_arylen
+ PERL_MAGIC_backref
+ PERL_MAGIC_bm
+ PERL_MAGIC_collxfrm
+ PERL_MAGIC_dbfile
+ PERL_MAGIC_dbline
+ PERL_MAGIC_defelem
+ PERL_MAGIC_env
+ PERL_MAGIC_envelem
+ PERL_MAGIC_ext
+ PERL_MAGIC_fm
+ PERL_MAGIC_glob
+ PERL_MAGIC_isa
+ PERL_MAGIC_isaelem
+ PERL_MAGIC_mutex
+ PERL_MAGIC_nkeys
+ PERL_MAGIC_overload
+ PERL_MAGIC_overload_elem
+ PERL_MAGIC_overload_table
+ PERL_MAGIC_pos
+ PERL_MAGIC_qr
+ PERL_MAGIC_regdata
+ PERL_MAGIC_regdatum
+ PERL_MAGIC_regex_global
+ PERL_MAGIC_shared
+ PERL_MAGIC_shared_scalar
+ PERL_MAGIC_sig
+ PERL_MAGIC_sigelem
+ PERL_MAGIC_substr
+ PERL_MAGIC_sv
+ PERL_MAGIC_taint
+ PERL_MAGIC_tied
+ PERL_MAGIC_tiedelem
+ PERL_MAGIC_tiedscalar
+ PERL_MAGIC_utf8
+ PERL_MAGIC_uvar
+ PERL_MAGIC_uvar_elem
+ PERL_MAGIC_vec
+ PERL_MAGIC_vstring
+ PERL_PV_ESCAPE_ALL
+ PERL_PV_ESCAPE_FIRSTCHAR
+ PERL_PV_ESCAPE_NOBACKSLASH
+ PERL_PV_ESCAPE_NOCLEAR
+ PERL_PV_ESCAPE_QUOTE
+ PERL_PV_ESCAPE_RE
+ PERL_PV_ESCAPE_UNI
+ PERL_PV_ESCAPE_UNI_DETECT
+ PERL_PV_PRETTY_DUMP
+ PERL_PV_PRETTY_ELLIPSES
+ PERL_PV_PRETTY_LTGT
+ PERL_PV_PRETTY_NOCLEAR
+ PERL_PV_PRETTY_QUOTE
+ PERL_PV_PRETTY_REGPROP
+ PERL_QUAD_MAX
+ PERL_QUAD_MIN
+ PERL_REVISION
+ PERL_SCAN_ALLOW_UNDERSCORES
+ PERL_SCAN_DISALLOW_PREFIX
+ PERL_SCAN_GREATER_THAN_UV_MAX
+ PERL_SCAN_SILENT_ILLDIGIT
+ PERL_SHORT_MAX
+ PERL_SHORT_MIN
+ PERL_SIGNALS_UNSAFE_FLAG
+ PERL_SUBVERSION
+ PERL_UCHAR_MAX
+ PERL_UCHAR_MIN
+ PERL_UINT_MAX
+ PERL_UINT_MIN
+ PERL_ULONG_MAX
+ PERL_ULONG_MIN
+ PERL_UNUSED_ARG
+ PERL_UNUSED_CONTEXT
+ PERL_UNUSED_DECL
+ PERL_UNUSED_VAR
+ PERL_UQUAD_MAX
+ PERL_UQUAD_MIN
+ PERL_USE_GCC_BRACE_GROUPS
+ PERL_USHORT_MAX
+ PERL_USHORT_MIN
+ PERL_VERSION
+ Perl_warner
+ Perl_warner_nocontext
+ PERLIO_FUNCS_CAST
+ PERLIO_FUNCS_DECL
+ PL_bufend
+ PL_bufptr
+ PL_compiling
+ PL_copline
+ PL_curcop
+ PL_curstash
+ PL_DBsignal
+ PL_DBsingle
+ PL_DBsub
+ PL_DBtrace
+ PL_debstash
+ PL_defgv
+ PL_diehook
+ PL_dirty
+ PL_dowarn
+ PL_errgv
+ PL_error_count
+ PL_expect
+ PL_hexdigit
+ PL_hints
+ PL_in_my
+ PL_in_my_stash
+ PL_laststatval
+ PL_lex_state
+ PL_lex_stuff
+ PL_linestr
+ PL_na
+ PL_no_modify
+ PL_parser
+ PL_perl_destruct_level
+ PL_perldb
+ PL_ppaddr
+ PL_rsfp
+ PL_rsfp_filters
+ PL_signals
+ PL_stack_base
+ PL_stack_sp
+ PL_statcache
+ PL_stdingv
+ PL_Sv
+ PL_sv_arenaroot
+ PL_sv_no
+ PL_sv_undef
+ PL_sv_yes
+ PL_tainted
+ PL_tainting
+ PL_tokenbuf
+ pMY_CXT
+ pMY_CXT_
+ Poison
+ PoisonFree
+ PoisonNew
+ PoisonWith
+ pTHX
+ pTHX_
+ PTR2IV
+ PTR2nat
+ PTR2NV
+ PTR2ul
+ PTR2UV
+ PTRV
+ PUSHmortal
+ PUSHu
+ pv_display
+ pv_escape
+ pv_pretty
+ SAVE_DEFSV
+ START_EXTERN_C
+ START_MY_CXT
+ STMT_END
+ STMT_START
+ STR_WITH_LEN
+ sv_2pv_flags
+ sv_2pv_nolen
+ sv_2pvbyte
+ sv_2pvbyte_nolen
+ sv_2uv
+ sv_catpv_mg
+ sv_catpvf_mg
+ sv_catpvf_mg_nocontext
+ sv_catpvn_mg
+ sv_catpvn_nomg
+ sv_catpvs
+ sv_catsv_mg
+ sv_catsv_nomg
+ SV_CONST_RETURN
+ SV_COW_DROP_PV
+ SV_COW_SHARED_HASH_KEYS
+ SV_GMAGIC
+ SV_HAS_TRAILING_NUL
+ SV_IMMEDIATE_UNREF
+ sv_magic_portable
+ SV_MUTABLE_RETURN
+ SV_NOSTEAL
+ sv_pvn_force_flags
+ sv_pvn_nomg
+ sv_setiv_mg
+ sv_setnv_mg
+ sv_setpv_mg
+ sv_setpvf_mg
+ sv_setpvf_mg_nocontext
+ sv_setpvn_mg
+ sv_setpvs
+ sv_setsv_mg
+ sv_setsv_nomg
+ sv_setuv
+ sv_setuv_mg
+ SV_SMAGIC
+ sv_usepvn_mg
+ SV_UTF8_NO_ENCODING
+ sv_uv
+ sv_vcatpvf
+ sv_vcatpvf_mg
+ sv_vsetpvf
+ sv_vsetpvf_mg
+ SVf
+ SVf_UTF8
+ SVfARG
+ SvGETMAGIC
+ SvIV_nomg
+ SvMAGIC_set
+ SvPV_const
+ SvPV_flags
+ SvPV_flags_const
+ SvPV_flags_const_nolen
+ SvPV_flags_mutable
+ SvPV_force
+ SvPV_force_flags
+ SvPV_force_flags_mutable
+ SvPV_force_flags_nolen
+ SvPV_force_mutable
+ SvPV_force_nolen
+ SvPV_force_nomg
+ SvPV_force_nomg_nolen
+ SvPV_mutable
+ SvPV_nolen
+ SvPV_nolen_const
+ SvPV_nomg
+ SvPV_nomg_const
+ SvPV_nomg_const_nolen
+ SvPV_renew
+ SvPVbyte
+ SvPVX_const
+ SvPVX_mutable
+ SvREFCNT_inc
+ SvREFCNT_inc_NN
+ SvREFCNT_inc_simple
+ SvREFCNT_inc_simple_NN
+ SvREFCNT_inc_simple_void
+ SvREFCNT_inc_simple_void_NN
+ SvREFCNT_inc_void
+ SvREFCNT_inc_void_NN
+ SvRV_set
+ SvSHARED_HASH
+ SvSTASH_set
+ SvUOK
+ SvUV
+ SvUV_nomg
+ SvUV_set
+ SvUVX
+ SvUVx
+ SvUVXx
+ SvVSTRING_mg
+ UNDERBAR
+ UTF8_MAXBYTES
+ UVof
+ UVSIZE
+ UVTYPE
+ UVuf
+ UVXf
+ UVxf
+ vload_module
+ vnewSVpvf
+ WARN_ALL
+ WARN_AMBIGUOUS
+ WARN_ASSERTIONS
+ WARN_BAREWORD
+ WARN_CLOSED
+ WARN_CLOSURE
+ WARN_DEBUGGING
+ WARN_DEPRECATED
+ WARN_DIGIT
+ WARN_EXEC
+ WARN_EXITING
+ WARN_GLOB
+ WARN_INPLACE
+ WARN_INTERNAL
+ WARN_IO
+ WARN_LAYER
+ WARN_MALLOC
+ WARN_MISC
+ WARN_NEWLINE
+ WARN_NUMERIC
+ WARN_ONCE
+ WARN_OVERFLOW
+ WARN_PACK
+ WARN_PARENTHESIS
+ WARN_PIPE
+ WARN_PORTABLE
+ WARN_PRECEDENCE
+ WARN_PRINTF
+ WARN_PROTOTYPE
+ WARN_QW
+ WARN_RECURSION
+ WARN_REDEFINE
+ WARN_REGEXP
+ WARN_RESERVED
+ WARN_SEMICOLON
+ WARN_SEVERE
+ WARN_SIGNAL
+ WARN_SUBSTR
+ WARN_SYNTAX
+ WARN_TAINT
+ WARN_THREADS
+ WARN_UNINITIALIZED
+ WARN_UNOPENED
+ WARN_UNPACK
+ WARN_UNTIE
+ WARN_UTF8
+ WARN_VOID
+ warner
+ XCPT_CATCH
+ XCPT_RETHROW
+ XCPT_TRY_END
+ XCPT_TRY_START
+ XPUSHmortal
+ XPUSHu
+ XSprePUSH
+ XSPROTO
+ XSRETURN
+ XSRETURN_UV
+ XST_mUV
+ ZeroD
+
+=head2 Perl API not supported by ppport.h
+
+There is still a big part of the API not supported by F<ppport.h>.
+Either because it doesn't make sense to back-port that part of the API,
+or simply because it hasn't been implemented yet. Patches welcome!
+
+Here's a list of the currently unsupported API, and also the version of
+Perl below which it is unsupported:
+
+=over 4
+
+=item perl 5.11.0
+
+ HeUTF8
+ MULTICALL
+ PERL_SYS_TERM
+ POP_MULTICALL
+ PUSH_MULTICALL
+ SvOOK_offset
+ av_iter_p
+ croak_xs_usage
+ fetch_cop_label
+ gv_fetchmethod_flags
+ hv_assert
+ mro_get_from_name
+ mro_get_private_data
+ mro_register
+ mro_set_mro
+ mro_set_private_data
+ pad_sv
+ pregfree2
+ ref
+ save_adelete
+ save_helem_flags
+ save_padsv_and_mortalize
+ save_pushptr
+ stashpv_hvname_match
+ sv_insert_flags
+ sv_utf8_upgrade_flags_grow
+
+=item perl 5.10.0
+
+ hv_common
+ hv_common_key_len
+ sv_destroyable
+ sys_init
+ sys_init3
+ sys_term
+
+=item perl 5.9.5
+
+ Perl_signbit
+ SvRX
+ SvRXOK
+ av_create_and_push
+ av_create_and_unshift_one
+ get_cvn_flags
+ gv_fetchfile_flags
+ mro_get_linear_isa
+ mro_method_changed_in
+ my_dirfd
+ pregcomp
+ ptr_table_clear
+ ptr_table_fetch
+ ptr_table_free
+ ptr_table_new
+ ptr_table_split
+ ptr_table_store
+ re_compile
+ re_intuit_start
+ reg_named_buff_all
+ reg_named_buff_exists
+ reg_named_buff_fetch
+ reg_named_buff_firstkey
+ reg_named_buff_nextkey
+ reg_named_buff_scalar
+ regfree_internal
+ savesharedpvn
+ scan_vstring
+ upg_version
+
+=item perl 5.9.4
+
+ PerlIO_context_layers
+ gv_name_set
+ my_vsnprintf
+ newXS_flags
+ regclass_swash
+ sv_does
+ sv_usepvn_flags
+
+=item perl 5.9.3
+
+ av_arylen_p
+ ckwarn
+ ckwarn_d
+ csighandler
+ dMULTICALL
+ doref
+ gv_const_sv
+ hv_eiter_p
+ hv_eiter_set
+ hv_name_set
+ hv_placeholders_get
+ hv_placeholders_p
+ hv_placeholders_set
+ hv_riter_p
+ hv_riter_set
+ is_utf8_string_loclen
+ newGIVENOP
+ newSVhek
+ newSVpvs_share
+ newWHENOP
+ newWHILEOP
+ savepvs
+ sortsv_flags
+ vverify
+
+=item perl 5.9.2
+
+ SvPVbyte_force
+ find_rundefsvoffset
+ gv_fetchsv
+ op_refcnt_lock
+ op_refcnt_unlock
+ savesvpv
+ vnormal
+
+=item perl 5.9.1
+
+ hv_clear_placeholders
+ hv_scalar
+ scan_version
+ sv_2iv_flags
+ sv_2uv_flags
+
+=item perl 5.9.0
+
+ new_version
+ save_set_svflags
+ vcmp
+ vnumify
+ vstringify
+
+=item perl 5.8.3
+
+ SvIsCOW
+ SvIsCOW_shared_hash
+
+=item perl 5.8.1
+
+ SvVOK
+ doing_taint
+ find_runcv
+ is_utf8_string_loc
+ packlist
+ save_bool
+ savestack_grow_cnt
+ seed
+ sv_cat_decode
+ sv_compile_2op
+ sv_setpviv
+ sv_setpviv_mg
+ unpackstring
+
+=item perl 5.8.0
+
+ hv_iternext_flags
+ hv_store_flags
+ is_utf8_idcont
+ nothreadhook
+
+=item perl 5.7.3
+
+ PerlIO_clearerr
+ PerlIO_close
+ PerlIO_eof
+ PerlIO_error
+ PerlIO_fileno
+ PerlIO_fill
+ PerlIO_flush
+ PerlIO_get_base
+ PerlIO_get_bufsiz
+ PerlIO_get_cnt
+ PerlIO_get_ptr
+ PerlIO_read
+ PerlIO_seek
+ PerlIO_set_cnt
+ PerlIO_set_ptrcnt
+ PerlIO_setlinebuf
+ PerlIO_stderr
+ PerlIO_stdin
+ PerlIO_stdout
+ PerlIO_tell
+ PerlIO_unread
+ PerlIO_write
+ SvLOCK
+ SvSHARE
+ SvUNLOCK
+ atfork_lock
+ atfork_unlock
+ custom_op_desc
+ custom_op_name
+ deb
+ debstack
+ debstackptrs
+ gv_fetchmeth_autoload
+ ibcmp_utf8
+ my_fork
+ my_socketpair
+ pack_cat
+ perl_destruct
+ pv_uni_display
+ save_shared_pvref
+ savesharedpv
+ sortsv
+ sv_copypv
+ sv_magicext
+ sv_nolocking
+ sv_nosharing
+ sv_recode_to_utf8
+ sv_uni_display
+ to_uni_fold
+ to_uni_lower
+ to_uni_title
+ to_uni_upper
+ to_utf8_case
+ to_utf8_fold
+ to_utf8_lower
+ to_utf8_title
+ to_utf8_upper
+ unpack_str
+ uvchr_to_utf8_flags
+ uvuni_to_utf8_flags
+ vdeb
+
+=item perl 5.7.2
+
+ calloc
+ getcwd_sv
+ init_tm
+ malloc
+ mfree
+ mini_mktime
+ my_atof2
+ my_strftime
+ op_null
+ realloc
+ sv_catpvn_flags
+ sv_catsv_flags
+ sv_setsv_flags
+ sv_utf8_upgrade_flags
+ sv_utf8_upgrade_nomg
+ swash_fetch
+
+=item perl 5.7.1
+
+ POPpbytex
+ bytes_from_utf8
+ despatch_signals
+ do_openn
+ gv_handler
+ is_lvalue_sub
+ my_popen_list
+ save_mortalizesv
+ scan_num
+ sv_force_normal_flags
+ sv_setref_uv
+ sv_unref_flags
+ sv_utf8_upgrade
+ utf8_length
+ utf8_to_uvchr
+ utf8_to_uvuni
+ utf8n_to_uvuni
+ uvuni_to_utf8
+
+=item perl 5.6.1
+
+ SvGAMAGIC
+ apply_attrs_string
+ bytes_to_utf8
+ gv_efullname4
+ gv_fullname4
+ is_utf8_string
+ save_generic_pvref
+ utf16_to_utf8
+ utf16_to_utf8_reversed
+ utf8_to_bytes
+
+=item perl 5.6.0
+
+ PERL_SYS_INIT3
+ SvIOK_UV
+ SvIOK_notUV
+ SvIOK_only_UV
+ SvPOK_only_UTF8
+ SvPVbyte_nolen
+ SvPVbytex
+ SvPVbytex_force
+ SvPVutf8
+ SvPVutf8_force
+ SvPVutf8_nolen
+ SvPVutf8x
+ SvPVutf8x_force
+ SvUOK
+ SvUTF8
+ SvUTF8_off
+ SvUTF8_on
+ av_delete
+ av_exists
+ call_atexit
+ cast_i32
+ cast_iv
+ cast_ulong
+ cast_uv
+ do_gv_dump
+ do_gvgv_dump
+ do_hv_dump
+ do_magic_dump
+ do_op_dump
+ do_open9
+ do_pmop_dump
+ do_sv_dump
+ dump_all
+ dump_eval
+ dump_form
+ dump_indent
+ dump_packsubs
+ dump_sub
+ dump_vindent
+ get_context
+ get_ppaddr
+ gv_dump
+ init_i18nl10n
+ init_i18nl14n
+ is_uni_alnum
+ is_uni_alnum_lc
+ is_uni_alnumc
+ is_uni_alnumc_lc
+ is_uni_alpha
+ is_uni_alpha_lc
+ is_uni_ascii
+ is_uni_ascii_lc
+ is_uni_cntrl
+ is_uni_cntrl_lc
+ is_uni_digit
+ is_uni_digit_lc
+ is_uni_graph
+ is_uni_graph_lc
+ is_uni_idfirst
+ is_uni_idfirst_lc
+ is_uni_lower
+ is_uni_lower_lc
+ is_uni_print
+ is_uni_print_lc
+ is_uni_punct
+ is_uni_punct_lc
+ is_uni_space
+ is_uni_space_lc
+ is_uni_upper
+ is_uni_upper_lc
+ is_uni_xdigit
+ is_uni_xdigit_lc
+ is_utf8_alnum
+ is_utf8_alnumc
+ is_utf8_alpha
+ is_utf8_ascii
+ is_utf8_char
+ is_utf8_cntrl
+ is_utf8_digit
+ is_utf8_graph
+ is_utf8_idfirst
+ is_utf8_lower
+ is_utf8_mark
+ is_utf8_print
+ is_utf8_punct
+ is_utf8_space
+ is_utf8_upper
+ is_utf8_xdigit
+ magic_dump
+ mess
+ my_atof
+ my_fflush_all
+ newANONATTRSUB
+ newATTRSUB
+ newXS
+ newXSproto
+ new_collate
+ new_ctype
+ new_numeric
+ op_dump
+ perl_parse
+ pmop_dump
+ re_intuit_string
+ reginitcolors
+ require_pv
+ safesyscalloc
+ safesysfree
+ safesysmalloc
+ safesysrealloc
+ save_I8
+ save_alloc
+ save_destructor
+ save_destructor_x
+ save_re_context
+ save_vptr
+ scan_bin
+ set_context
+ set_numeric_local
+ set_numeric_radix
+ set_numeric_standard
+ str_to_version
+ sv_2pvutf8
+ sv_2pvutf8_nolen
+ sv_force_normal
+ sv_len_utf8
+ sv_pos_b2u
+ sv_pos_u2b
+ sv_pv
+ sv_pvbyte
+ sv_pvbyten
+ sv_pvbyten_force
+ sv_pvutf8
+ sv_pvutf8n
+ sv_pvutf8n_force
+ sv_rvweaken
+ sv_utf8_decode
+ sv_utf8_downgrade
+ sv_utf8_encode
+ swash_init
+ tmps_grow
+ to_uni_lower_lc
+ to_uni_title_lc
+ to_uni_upper_lc
+ utf8_distance
+ utf8_hop
+ vcroak
+ vform
+ vmess
+ vwarn
+ vwarner
+
+=item perl 5.005_03
+
+ POPpx
+ get_vtbl
+ save_generic_svref
+
+=item perl 5.005
+
+ PL_modglobal
+ cx_dump
+ debop
+ debprofdump
+ fbm_compile
+ fbm_instr
+ get_op_descs
+ get_op_names
+ init_stacks
+ mg_length
+ mg_size
+ newHVhv
+ new_stackinfo
+ regdump
+ regexec_flags
+ regnext
+ runops_debug
+ runops_standard
+ save_iv
+ screaminstr
+ sv_iv
+ sv_nv
+ sv_peek
+ sv_pvn
+ sv_pvn_nomg
+ sv_true
+
+=item perl 5.004_05
+
+ do_binmode
+ save_aelem
+ save_helem
+
+=item perl 5.004
+
+ GIMME_V
+ G_VOID
+ HEf_SVKEY
+ HeHASH
+ HeKEY
+ HeKLEN
+ HePV
+ HeSVKEY
+ HeSVKEY_force
+ HeSVKEY_set
+ HeVAL
+ SvSetMagicSV
+ SvSetMagicSV_nosteal
+ SvSetSV_nosteal
+ SvTAINTED
+ SvTAINTED_off
+ SvTAINTED_on
+ block_gimme
+ call_list
+ cv_const_sv
+ delimcpy
+ do_open
+ form
+ gv_autoload4
+ gv_efullname3
+ gv_fetchmethod_autoload
+ gv_fullname3
+ hv_delayfree_ent
+ hv_delete_ent
+ hv_exists_ent
+ hv_fetch_ent
+ hv_free_ent
+ hv_iterkeysv
+ hv_ksplit
+ hv_store_ent
+ ibcmp_locale
+ my_failure_exit
+ my_memcmp
+ my_pclose
+ my_popen
+ newSVpvf
+ rsignal
+ rsignal_state
+ save_I16
+ save_gp
+ share_hek
+ start_subparse
+ sv_catpvf
+ sv_catpvf_mg
+ sv_cmp_locale
+ sv_derived_from
+ sv_gets
+ sv_magic_portable
+ sv_setpvf
+ sv_setpvf_mg
+ sv_taint
+ sv_tainted
+ sv_untaint
+ sv_vcatpvf
+ sv_vcatpvf_mg
+ sv_vcatpvfn
+ sv_vsetpvf
+ sv_vsetpvf_mg
+ sv_vsetpvfn
+ unsharepvn
+ vnewSVpvf
+ warner
+
+=back
+
+=head1 BUGS
+
+If you find any bugs, C<Devel::PPPort> doesn't seem to build on your
+system or any of its tests fail, please use the CPAN Request Tracker
+at L<http://rt.cpan.org/> to create a ticket for the module.
+
+=head1 AUTHORS
+
+=over 2
+
+=item *
+
+Version 1.x of Devel::PPPort was written by Kenneth Albanowski.
+
+=item *
+
+Version 2.x was ported to the Perl core by Paul Marquess.
+
+=item *
+
+Version 3.x was ported back to CPAN by Marcus Holland-Moritz.
+
+=back
+
+=head1 COPYRIGHT
+
+Version 3.x, Copyright (C) 2004-2009, Marcus Holland-Moritz.
+
+Version 2.x, Copyright (C) 2001, Paul Marquess.
+
+Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<h2xs>, L<ppport.h>.
+
+=cut
+
+package Devel::PPPort;
+
+use strict;
+use vars qw($VERSION $data);
+
+$VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.19 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
+
+sub _init_data
+{
+ $data = do { local $/; <DATA> };
+ my $pkg = 'Devel::PPPort';
+ $data =~ s/__PERL_VERSION__/$]/g;
+ $data =~ s/__VERSION__/$VERSION/g;
+ $data =~ s/__PKG__/$pkg/g;
+ $data =~ s/^\|>//gm;
+}
+
+sub WriteFile
+{
+ my $file = shift || 'ppport.h';
+ defined $data or _init_data();
+ my $copy = $data;
+ $copy =~ s/\bppport\.h\b/$file/g;
+
+ open F, ">$file" or return undef;
+ print F $copy;
+ close F;
+
+ return 1;
+}
+
+1;
+
+__DATA__
+#if 0
+<<'SKIP';
+#endif
+/*
+----------------------------------------------------------------------
+
+ ppport.h -- Perl/Pollution/Portability Version __VERSION__
+
+ Automatically created by __PKG__ running under perl __PERL_VERSION__.
+
+ Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
+ includes in parts/inc/ instead.
+
+ Use 'perldoc ppport.h' to view the documentation below.
+
+----------------------------------------------------------------------
+
+SKIP
+
+|>=pod
+|>
+|>=head1 NAME
+|>
+|>ppport.h - Perl/Pollution/Portability version __VERSION__
+|>
+|>=head1 SYNOPSIS
+|>
+|> perl ppport.h [options] [source files]
+|>
+|> Searches current directory for files if no [source files] are given
+|>
+|> --help show short help
+|>
+|> --version show version
+|>
+|> --patch=file write one patch file with changes
+|> --copy=suffix write changed copies with suffix
+|> --diff=program use diff program and options
+|>
+|> --compat-version=version provide compatibility with Perl version
+|> --cplusplus accept C++ comments
+|>
+|> --quiet don't output anything except fatal errors
+|> --nodiag don't show diagnostics
+|> --nohints don't show hints
+|> --nochanges don't suggest changes
+|> --nofilter don't filter input files
+|>
+|> --strip strip all script and doc functionality from
+|> ppport.h
+|>
+|> --list-provided list provided API
+|> --list-unsupported list unsupported API
+|> --api-info=name show Perl API portability information
+|>
+|>=head1 COMPATIBILITY
+|>
+|>This version of F<ppport.h> is designed to support operation with Perl
+|>installations back to 5.003, and has been tested up to 5.10.0.
+|>
+|>=head1 OPTIONS
+|>
+|>=head2 --help
+|>
+|>Display a brief usage summary.
+|>
+|>=head2 --version
+|>
+|>Display the version of F<ppport.h>.
+|>
+|>=head2 --patch=I<file>
+|>
+|>If this option is given, a single patch file will be created if
+|>any changes are suggested. This requires a working diff program
+|>to be installed on your system.
+|>
+|>=head2 --copy=I<suffix>
+|>
+|>If this option is given, a copy of each file will be saved with
+|>the given suffix that contains the suggested changes. This does
+|>not require any external programs. Note that this does not
+|>automagially add a dot between the original filename and the
+|>suffix. If you want the dot, you have to include it in the option
+|>argument.
+|>
+|>If neither C<--patch> or C<--copy> are given, the default is to
+|>simply print the diffs for each file. This requires either
+|>C<Text::Diff> or a C<diff> program to be installed.
+|>
+|>=head2 --diff=I<program>
+|>
+|>Manually set the diff program and options to use. The default
+|>is to use C<Text::Diff>, when installed, and output unified
+|>context diffs.
+|>
+|>=head2 --compat-version=I<version>
+|>
+|>Tell F<ppport.h> to check for compatibility with the given
+|>Perl version. The default is to check for compatibility with Perl
+|>version 5.003. You can use this option to reduce the output
+|>of F<ppport.h> if you intend to be backward compatible only
+|>down to a certain Perl version.
+|>
+|>=head2 --cplusplus
+|>
+|>Usually, F<ppport.h> will detect C++ style comments and
+|>replace them with C style comments for portability reasons.
+|>Using this option instructs F<ppport.h> to leave C++
+|>comments untouched.
+|>
+|>=head2 --quiet
+|>
+|>Be quiet. Don't print anything except fatal errors.
+|>
+|>=head2 --nodiag
+|>
+|>Don't output any diagnostic messages. Only portability
+|>alerts will be printed.
+|>
+|>=head2 --nohints
+|>
+|>Don't output any hints. Hints often contain useful portability
+|>notes. Warnings will still be displayed.
+|>
+|>=head2 --nochanges
+|>
+|>Don't suggest any changes. Only give diagnostic output and hints
+|>unless these are also deactivated.
+|>
+|>=head2 --nofilter
+|>
+|>Don't filter the list of input files. By default, files not looking
+|>like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
+|>
+|>=head2 --strip
+|>
+|>Strip all script and documentation functionality from F<ppport.h>.
+|>This reduces the size of F<ppport.h> dramatically and may be useful
+|>if you want to include F<ppport.h> in smaller modules without
+|>increasing their distribution size too much.
+|>
+|>The stripped F<ppport.h> will have a C<--unstrip> option that allows
+|>you to undo the stripping, but only if an appropriate C<Devel::PPPort>
+|>module is installed.
+|>
+|>=head2 --list-provided
+|>
+|>Lists the API elements for which compatibility is provided by
+|>F<ppport.h>. Also lists if it must be explicitly requested,
+|>if it has dependencies, and if there are hints or warnings for it.
+|>
+|>=head2 --list-unsupported
+|>
+|>Lists the API elements that are known not to be supported by
+|>F<ppport.h> and below which version of Perl they probably
+|>won't be available or work.
+|>
+|>=head2 --api-info=I<name>
+|>
+|>Show portability information for API elements matching I<name>.
+|>If I<name> is surrounded by slashes, it is interpreted as a regular
+|>expression.
+|>
+|>=head1 DESCRIPTION
+|>
+|>In order for a Perl extension (XS) module to be as portable as possible
+|>across differing versions of Perl itself, certain steps need to be taken.
+|>
+|>=over 4
+|>
+|>=item *
+|>
+|>Including this header is the first major one. This alone will give you
+|>access to a large part of the Perl API that hasn't been available in
+|>earlier Perl releases. Use
+|>
+|> perl ppport.h --list-provided
+|>
+|>to see which API elements are provided by ppport.h.
+|>
+|>=item *
+|>
+|>You should avoid using deprecated parts of the API. For example, using
+|>global Perl variables without the C<PL_> prefix is deprecated. Also,
+|>some API functions used to have a C<perl_> prefix. Using this form is
+|>also deprecated. You can safely use the supported API, as F<ppport.h>
+|>will provide wrappers for older Perl versions.
+|>
+|>=item *
+|>
+|>If you use one of a few functions or variables that were not present in
+|>earlier versions of Perl, and that can't be provided using a macro, you
+|>have to explicitly request support for these functions by adding one or
+|>more C<#define>s in your source code before the inclusion of F<ppport.h>.
+|>
+|>These functions or variables will be marked C<explicit> in the list shown
+|>by C<--list-provided>.
+|>
+|>Depending on whether you module has a single or multiple files that
+|>use such functions or variables, you want either C<static> or global
+|>variants.
+|>
+|>For a C<static> function or variable (used only in a single source
+|>file), use:
+|>
+|> #define NEED_function
+|> #define NEED_variable
+|>
+|>For a global function or variable (used in multiple source files),
+|>use:
+|>
+|> #define NEED_function_GLOBAL
+|> #define NEED_variable_GLOBAL
+|>
+|>Note that you mustn't have more than one global request for the
+|>same function or variable in your project.
+|>
+|> Function / Variable Static Request Global Request
+|> -----------------------------------------------------------------------------------------
+|> PL_parser NEED_PL_parser NEED_PL_parser_GLOBAL
+|> PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL
+|> eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL
+|> grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL
+|> grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL
+|> grok_number() NEED_grok_number NEED_grok_number_GLOBAL
+|> grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL
+|> grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL
+|> load_module() NEED_load_module NEED_load_module_GLOBAL
+|> my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL
+|> my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL
+|> my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL
+|> my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL
+|> newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL
+|> newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL
+|> newSV_type() NEED_newSV_type NEED_newSV_type_GLOBAL
+|> newSVpvn_flags() NEED_newSVpvn_flags NEED_newSVpvn_flags_GLOBAL
+|> newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL
+|> pv_display() NEED_pv_display NEED_pv_display_GLOBAL
+|> pv_escape() NEED_pv_escape NEED_pv_escape_GLOBAL
+|> pv_pretty() NEED_pv_pretty NEED_pv_pretty_GLOBAL
+|> sv_2pv_flags() NEED_sv_2pv_flags NEED_sv_2pv_flags_GLOBAL
+|> sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL
+|> sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL
+|> sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL
+|> sv_pvn_force_flags() NEED_sv_pvn_force_flags NEED_sv_pvn_force_flags_GLOBAL
+|> sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL
+|> sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL
+|> vload_module() NEED_vload_module NEED_vload_module_GLOBAL
+|> vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL
+|> warner() NEED_warner NEED_warner_GLOBAL
+|>
+|>To avoid namespace conflicts, you can change the namespace of the
+|>explicitly exported functions / variables using the C<DPPP_NAMESPACE>
+|>macro. Just C<#define> the macro before including C<ppport.h>:
+|>
+|> #define DPPP_NAMESPACE MyOwnNamespace_
+|> #include "ppport.h"
+|>
+|>The default namespace is C<DPPP_>.
+|>
+|>=back
+|>
+|>The good thing is that most of the above can be checked by running
+|>F<ppport.h> on your source code. See the next section for
+|>details.
+|>
+|>=head1 EXAMPLES
+|>
+|>To verify whether F<ppport.h> is needed for your module, whether you
+|>should make any changes to your code, and whether any special defines
+|>should be used, F<ppport.h> can be run as a Perl script to check your
+|>source code. Simply say:
+|>
+|> perl ppport.h
+|>
+|>The result will usually be a list of patches suggesting changes
+|>that should at least be acceptable, if not necessarily the most
+|>efficient solution, or a fix for all possible problems.
+|>
+|>If you know that your XS module uses features only available in
+|>newer Perl releases, if you're aware that it uses C++ comments,
+|>and if you want all suggestions as a single patch file, you could
+|>use something like this:
+|>
+|> perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
+|>
+|>If you only want your code to be scanned without any suggestions
+|>for changes, use:
+|>
+|> perl ppport.h --nochanges
+|>
+|>You can specify a different C<diff> program or options, using
+|>the C<--diff> option:
+|>
+|> perl ppport.h --diff='diff -C 10'
+|>
+|>This would output context diffs with 10 lines of context.
+|>
+|>If you want to create patched copies of your files instead, use:
+|>
+|> perl ppport.h --copy=.new
+|>
+|>To display portability information for the C<newSVpvn> function,
+|>use:
+|>
+|> perl ppport.h --api-info=newSVpvn
+|>
+|>Since the argument to C<--api-info> can be a regular expression,
+|>you can use
+|>
+|> perl ppport.h --api-info=/_nomg$/
+|>
+|>to display portability information for all C<_nomg> functions or
+|>
+|> perl ppport.h --api-info=/./
+|>
+|>to display information for all known API elements.
+|>
+|>=head1 BUGS
+|>
+|>If this version of F<ppport.h> is causing failure during
+|>the compilation of this module, please check if newer versions
+|>of either this module or C<Devel::PPPort> are available on CPAN
+|>before sending a bug report.
+|>
+|>If F<ppport.h> was generated using the latest version of
+|>C<Devel::PPPort> and is causing failure of this module, please
+|>file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>.
+|>
+|>Please include the following information:
+|>
+|>=over 4
+|>
+|>=item 1.
+|>
+|>The complete output from running "perl -V"
+|>
+|>=item 2.
+|>
+|>This file.
+|>
+|>=item 3.
+|>
+|>The name and version of the module you were trying to build.
+|>
+|>=item 4.
+|>
+|>A full log of the build that failed.
+|>
+|>=item 5.
+|>
+|>Any other information that you think could be relevant.
+|>
+|>=back
+|>
+|>For the latest version of this code, please get the C<Devel::PPPort>
+|>module from CPAN.
+|>
+|>=head1 COPYRIGHT
+|>
+|>Version 3.x, Copyright (c) 2004-2009, Marcus Holland-Moritz.
+|>
+|>Version 2.x, Copyright (C) 2001, Paul Marquess.
+|>
+|>Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+|>
+|>This program is free software; you can redistribute it and/or
+|>modify it under the same terms as Perl itself.
+|>
+|>=head1 SEE ALSO
+|>
+|>See L<Devel::PPPort>.
+|>
+|>=cut
+
+use strict;
+
+# Disable broken TRIE-optimization
+BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 }
+
+my $VERSION = __VERSION__;
+
+my %opt = (
+ quiet => 0,
+ diag => 1,
+ hints => 1,
+ changes => 1,
+ cplusplus => 0,
+ filter => 1,
+ strip => 0,
+ version => 0,
+);
+
+my($ppport) = $0 =~ /([\w.]+)$/;
+my $LF = '(?:\r\n|[\r\n])'; # line feed
+my $HS = "[ \t]"; # horizontal whitespace
+
+# Never use C comments in this file!
+my $ccs = '/'.'*';
+my $cce = '*'.'/';
+my $rccs = quotemeta $ccs;
+my $rcce = quotemeta $cce;
+
+eval {
+ require Getopt::Long;
+ Getopt::Long::GetOptions(\%opt, qw(
+ help quiet diag! filter! hints! changes! cplusplus strip version
+ patch=s copy=s diff=s compat-version=s
+ list-provided list-unsupported api-info=s
+ )) or usage();
+};
+
+if ($@ and grep /^-/, @ARGV) {
+ usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
+ die "Getopt::Long not found. Please don't use any options.\n";
+}
+
+if ($opt{version}) {
+ print "This is $0 $VERSION.\n";
+ exit 0;
+}
+
+usage() if $opt{help};
+strip() if $opt{strip};
+
+if (exists $opt{'compat-version'}) {
+ my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
+ if ($@) {
+ die "Invalid version number format: '$opt{'compat-version'}'\n";
+ }
+ die "Only Perl 5 is supported\n" if $r != 5;
+ die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
+ $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
+}
+else {
+ $opt{'compat-version'} = 5;
+}
+
+my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
+ ? ( $1 => {
+ ($2 ? ( base => $2 ) : ()),
+ ($3 ? ( todo => $3 ) : ()),
+ (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()),
+ (index($4, 'p') >= 0 ? ( provided => 1 ) : ()),
+ (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()),
+ } )
+ : die "invalid spec: $_" } qw(
+AvFILLp|5.004050||p
+AvFILL|||
+CLASS|||n
+CPERLscope|5.005000||p
+CX_CURPAD_SAVE|||
+CX_CURPAD_SV|||
+CopFILEAV|5.006000||p
+CopFILEGV_set|5.006000||p
+CopFILEGV|5.006000||p
+CopFILESV|5.006000||p
+CopFILE_set|5.006000||p
+CopFILE|5.006000||p
+CopSTASHPV_set|5.006000||p
+CopSTASHPV|5.006000||p
+CopSTASH_eq|5.006000||p
+CopSTASH_set|5.006000||p
+CopSTASH|5.006000||p
+CopyD|5.009002||p
+Copy|||
+CvPADLIST|||
+CvSTASH|||
+CvWEAKOUTSIDE|||
+DEFSV_set|5.011000||p
+DEFSV|5.004050||p
+END_EXTERN_C|5.005000||p
+ENTER|||
+ERRSV|5.004050||p
+EXTEND|||
+EXTERN_C|5.005000||p
+F0convert|||n
+FREETMPS|||
+GIMME_V||5.004000|n
+GIMME|||n
+GROK_NUMERIC_RADIX|5.007002||p
+G_ARRAY|||
+G_DISCARD|||
+G_EVAL|||
+G_METHOD|5.006001||p
+G_NOARGS|||
+G_SCALAR|||
+G_VOID||5.004000|
+GetVars|||
+GvSVn|5.009003||p
+GvSV|||
+Gv_AMupdate|||
+HEf_SVKEY||5.004000|
+HeHASH||5.004000|
+HeKEY||5.004000|
+HeKLEN||5.004000|
+HePV||5.004000|
+HeSVKEY_force||5.004000|
+HeSVKEY_set||5.004000|
+HeSVKEY||5.004000|
+HeUTF8||5.011000|
+HeVAL||5.004000|
+HvNAMELEN_get|5.009003||p
+HvNAME_get|5.009003||p
+HvNAME|||
+INT2PTR|5.006000||p
+IN_LOCALE_COMPILETIME|5.007002||p
+IN_LOCALE_RUNTIME|5.007002||p
+IN_LOCALE|5.007002||p
+IN_PERL_COMPILETIME|5.008001||p
+IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p
+IS_NUMBER_INFINITY|5.007002||p
+IS_NUMBER_IN_UV|5.007002||p
+IS_NUMBER_NAN|5.007003||p
+IS_NUMBER_NEG|5.007002||p
+IS_NUMBER_NOT_INT|5.007002||p
+IVSIZE|5.006000||p
+IVTYPE|5.006000||p
+IVdf|5.006000||p
+LEAVE|||
+LVRET|||
+MARK|||
+MULTICALL||5.011000|
+MY_CXT_CLONE|5.009002||p
+MY_CXT_INIT|5.007003||p
+MY_CXT|5.007003||p
+MoveD|5.009002||p
+Move|||
+NOOP|5.005000||p
+NUM2PTR|5.006000||p
+NVTYPE|5.006000||p
+NVef|5.006001||p
+NVff|5.006001||p
+NVgf|5.006001||p
+Newxc|5.009003||p
+Newxz|5.009003||p
+Newx|5.009003||p
+Nullav|||
+Nullch|||
+Nullcv|||
+Nullhv|||
+Nullsv|||
+ORIGMARK|||
+PAD_BASE_SV|||
+PAD_CLONE_VARS|||
+PAD_COMPNAME_FLAGS|||
+PAD_COMPNAME_GEN_set|||
+PAD_COMPNAME_GEN|||
+PAD_COMPNAME_OURSTASH|||
+PAD_COMPNAME_PV|||
+PAD_COMPNAME_TYPE|||
+PAD_DUP|||
+PAD_RESTORE_LOCAL|||
+PAD_SAVE_LOCAL|||
+PAD_SAVE_SETNULLPAD|||
+PAD_SETSV|||
+PAD_SET_CUR_NOSAVE|||
+PAD_SET_CUR|||
+PAD_SVl|||
+PAD_SV|||
+PERLIO_FUNCS_CAST|5.009003||p
+PERLIO_FUNCS_DECL|5.009003||p
+PERL_ABS|5.008001||p
+PERL_BCDVERSION|5.011000||p
+PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p
+PERL_HASH|5.004000||p
+PERL_INT_MAX|5.004000||p
+PERL_INT_MIN|5.004000||p
+PERL_LONG_MAX|5.004000||p
+PERL_LONG_MIN|5.004000||p
+PERL_MAGIC_arylen|5.007002||p
+PERL_MAGIC_backref|5.007002||p
+PERL_MAGIC_bm|5.007002||p
+PERL_MAGIC_collxfrm|5.007002||p
+PERL_MAGIC_dbfile|5.007002||p
+PERL_MAGIC_dbline|5.007002||p
+PERL_MAGIC_defelem|5.007002||p
+PERL_MAGIC_envelem|5.007002||p
+PERL_MAGIC_env|5.007002||p
+PERL_MAGIC_ext|5.007002||p
+PERL_MAGIC_fm|5.007002||p
+PERL_MAGIC_glob|5.011000||p
+PERL_MAGIC_isaelem|5.007002||p
+PERL_MAGIC_isa|5.007002||p
+PERL_MAGIC_mutex|5.011000||p
+PERL_MAGIC_nkeys|5.007002||p
+PERL_MAGIC_overload_elem|5.007002||p
+PERL_MAGIC_overload_table|5.007002||p
+PERL_MAGIC_overload|5.007002||p
+PERL_MAGIC_pos|5.007002||p
+PERL_MAGIC_qr|5.007002||p
+PERL_MAGIC_regdata|5.007002||p
+PERL_MAGIC_regdatum|5.007002||p
+PERL_MAGIC_regex_global|5.007002||p
+PERL_MAGIC_shared_scalar|5.007003||p
+PERL_MAGIC_shared|5.007003||p
+PERL_MAGIC_sigelem|5.007002||p
+PERL_MAGIC_sig|5.007002||p
+PERL_MAGIC_substr|5.007002||p
+PERL_MAGIC_sv|5.007002||p
+PERL_MAGIC_taint|5.007002||p
+PERL_MAGIC_tiedelem|5.007002||p
+PERL_MAGIC_tiedscalar|5.007002||p
+PERL_MAGIC_tied|5.007002||p
+PERL_MAGIC_utf8|5.008001||p
+PERL_MAGIC_uvar_elem|5.007003||p
+PERL_MAGIC_uvar|5.007002||p
+PERL_MAGIC_vec|5.007002||p
+PERL_MAGIC_vstring|5.008001||p
+PERL_PV_ESCAPE_ALL|5.009004||p
+PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p
+PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p
+PERL_PV_ESCAPE_NOCLEAR|5.009004||p
+PERL_PV_ESCAPE_QUOTE|5.009004||p
+PERL_PV_ESCAPE_RE|5.009005||p
+PERL_PV_ESCAPE_UNI_DETECT|5.009004||p
+PERL_PV_ESCAPE_UNI|5.009004||p
+PERL_PV_PRETTY_DUMP|5.009004||p
+PERL_PV_PRETTY_ELLIPSES|5.010000||p
+PERL_PV_PRETTY_LTGT|5.009004||p
+PERL_PV_PRETTY_NOCLEAR|5.010000||p
+PERL_PV_PRETTY_QUOTE|5.009004||p
+PERL_PV_PRETTY_REGPROP|5.009004||p
+PERL_QUAD_MAX|5.004000||p
+PERL_QUAD_MIN|5.004000||p
+PERL_REVISION|5.006000||p
+PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p
+PERL_SCAN_DISALLOW_PREFIX|5.007003||p
+PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p
+PERL_SCAN_SILENT_ILLDIGIT|5.008001||p
+PERL_SHORT_MAX|5.004000||p
+PERL_SHORT_MIN|5.004000||p
+PERL_SIGNALS_UNSAFE_FLAG|5.008001||p
+PERL_SUBVERSION|5.006000||p
+PERL_SYS_INIT3||5.006000|
+PERL_SYS_INIT|||
+PERL_SYS_TERM||5.011000|
+PERL_UCHAR_MAX|5.004000||p
+PERL_UCHAR_MIN|5.004000||p
+PERL_UINT_MAX|5.004000||p
+PERL_UINT_MIN|5.004000||p
+PERL_ULONG_MAX|5.004000||p
+PERL_ULONG_MIN|5.004000||p
+PERL_UNUSED_ARG|5.009003||p
+PERL_UNUSED_CONTEXT|5.009004||p
+PERL_UNUSED_DECL|5.007002||p
+PERL_UNUSED_VAR|5.007002||p
+PERL_UQUAD_MAX|5.004000||p
+PERL_UQUAD_MIN|5.004000||p
+PERL_USE_GCC_BRACE_GROUPS|5.009004||p
+PERL_USHORT_MAX|5.004000||p
+PERL_USHORT_MIN|5.004000||p
+PERL_VERSION|5.006000||p
+PL_DBsignal|5.005000||p
+PL_DBsingle|||pn
+PL_DBsub|||pn
+PL_DBtrace|||pn
+PL_Sv|5.005000||p
+PL_bufend|5.011000||p
+PL_bufptr|5.011000||p
+PL_compiling|5.004050||p
+PL_copline|5.011000||p
+PL_curcop|5.004050||p
+PL_curstash|5.004050||p
+PL_debstash|5.004050||p
+PL_defgv|5.004050||p
+PL_diehook|5.004050||p
+PL_dirty|5.004050||p
+PL_dowarn|||pn
+PL_errgv|5.004050||p
+PL_error_count|5.011000||p
+PL_expect|5.011000||p
+PL_hexdigit|5.005000||p
+PL_hints|5.005000||p
+PL_in_my_stash|5.011000||p
+PL_in_my|5.011000||p
+PL_last_in_gv|||n
+PL_laststatval|5.005000||p
+PL_lex_state|5.011000||p
+PL_lex_stuff|5.011000||p
+PL_linestr|5.011000||p
+PL_modglobal||5.005000|n
+PL_na|5.004050||pn
+PL_no_modify|5.006000||p
+PL_ofsgv|||n
+PL_parser|5.009005||p
+PL_perl_destruct_level|5.004050||p
+PL_perldb|5.004050||p
+PL_ppaddr|5.006000||p
+PL_rsfp_filters|5.004050||p
+PL_rsfp|5.004050||p
+PL_rs|||n
+PL_signals|5.008001||p
+PL_stack_base|5.004050||p
+PL_stack_sp|5.004050||p
+PL_statcache|5.005000||p
+PL_stdingv|5.004050||p
+PL_sv_arenaroot|5.004050||p
+PL_sv_no|5.004050||pn
+PL_sv_undef|5.004050||pn
+PL_sv_yes|5.004050||pn
+PL_tainted|5.004050||p
+PL_tainting|5.004050||p
+PL_tokenbuf|5.011000||p
+POP_MULTICALL||5.011000|
+POPi|||n
+POPl|||n
+POPn|||n
+POPpbytex||5.007001|n
+POPpx||5.005030|n
+POPp|||n
+POPs|||n
+PTR2IV|5.006000||p
+PTR2NV|5.006000||p
+PTR2UV|5.006000||p
+PTR2nat|5.009003||p
+PTR2ul|5.007001||p
+PTRV|5.006000||p
+PUSHMARK|||
+PUSH_MULTICALL||5.011000|
+PUSHi|||
+PUSHmortal|5.009002||p
+PUSHn|||
+PUSHp|||
+PUSHs|||
+PUSHu|5.004000||p
+PUTBACK|||
+PerlIO_clearerr||5.007003|
+PerlIO_close||5.007003|
+PerlIO_context_layers||5.009004|
+PerlIO_eof||5.007003|
+PerlIO_error||5.007003|
+PerlIO_fileno||5.007003|
+PerlIO_fill||5.007003|
+PerlIO_flush||5.007003|
+PerlIO_get_base||5.007003|
+PerlIO_get_bufsiz||5.007003|
+PerlIO_get_cnt||5.007003|
+PerlIO_get_ptr||5.007003|
+PerlIO_read||5.007003|
+PerlIO_seek||5.007003|
+PerlIO_set_cnt||5.007003|
+PerlIO_set_ptrcnt||5.007003|
+PerlIO_setlinebuf||5.007003|
+PerlIO_stderr||5.007003|
+PerlIO_stdin||5.007003|
+PerlIO_stdout||5.007003|
+PerlIO_tell||5.007003|
+PerlIO_unread||5.007003|
+PerlIO_write||5.007003|
+Perl_signbit||5.009005|n
+PoisonFree|5.009004||p
+PoisonNew|5.009004||p
+PoisonWith|5.009004||p
+Poison|5.008000||p
+RETVAL|||n
+Renewc|||
+Renew|||
+SAVECLEARSV|||
+SAVECOMPPAD|||
+SAVEPADSV|||
+SAVETMPS|||
+SAVE_DEFSV|5.004050||p
+SPAGAIN|||
+SP|||
+START_EXTERN_C|5.005000||p
+START_MY_CXT|5.007003||p
+STMT_END|||p
+STMT_START|||p
+STR_WITH_LEN|5.009003||p
+ST|||
+SV_CONST_RETURN|5.009003||p
+SV_COW_DROP_PV|5.008001||p
+SV_COW_SHARED_HASH_KEYS|5.009005||p
+SV_GMAGIC|5.007002||p
+SV_HAS_TRAILING_NUL|5.009004||p
+SV_IMMEDIATE_UNREF|5.007001||p
+SV_MUTABLE_RETURN|5.009003||p
+SV_NOSTEAL|5.009002||p
+SV_SMAGIC|5.009003||p
+SV_UTF8_NO_ENCODING|5.008001||p
+SVfARG|5.009005||p
+SVf_UTF8|5.006000||p
+SVf|5.006000||p
+SVt_IV|||
+SVt_NV|||
+SVt_PVAV|||
+SVt_PVCV|||
+SVt_PVHV|||
+SVt_PVMG|||
+SVt_PV|||
+Safefree|||
+Slab_Alloc|||
+Slab_Free|||
+Slab_to_rw|||
+StructCopy|||
+SvCUR_set|||
+SvCUR|||
+SvEND|||
+SvGAMAGIC||5.006001|
+SvGETMAGIC|5.004050||p
+SvGROW|||
+SvIOK_UV||5.006000|
+SvIOK_notUV||5.006000|
+SvIOK_off|||
+SvIOK_only_UV||5.006000|
+SvIOK_only|||
+SvIOK_on|||
+SvIOKp|||
+SvIOK|||
+SvIVX|||
+SvIV_nomg|5.009001||p
+SvIV_set|||
+SvIVx|||
+SvIV|||
+SvIsCOW_shared_hash||5.008003|
+SvIsCOW||5.008003|
+SvLEN_set|||
+SvLEN|||
+SvLOCK||5.007003|
+SvMAGIC_set|5.009003||p
+SvNIOK_off|||
+SvNIOKp|||
+SvNIOK|||
+SvNOK_off|||
+SvNOK_only|||
+SvNOK_on|||
+SvNOKp|||
+SvNOK|||
+SvNVX|||
+SvNV_set|||
+SvNVx|||
+SvNV|||
+SvOK|||
+SvOOK_offset||5.011000|
+SvOOK|||
+SvPOK_off|||
+SvPOK_only_UTF8||5.006000|
+SvPOK_only|||
+SvPOK_on|||
+SvPOKp|||
+SvPOK|||
+SvPVX_const|5.009003||p
+SvPVX_mutable|5.009003||p
+SvPVX|||
+SvPV_const|5.009003||p
+SvPV_flags_const_nolen|5.009003||p
+SvPV_flags_const|5.009003||p
+SvPV_flags_mutable|5.009003||p
+SvPV_flags|5.007002||p
+SvPV_force_flags_mutable|5.009003||p
+SvPV_force_flags_nolen|5.009003||p
+SvPV_force_flags|5.007002||p
+SvPV_force_mutable|5.009003||p
+SvPV_force_nolen|5.009003||p
+SvPV_force_nomg_nolen|5.009003||p
+SvPV_force_nomg|5.007002||p
+SvPV_force|||p
+SvPV_mutable|5.009003||p
+SvPV_nolen_const|5.009003||p
+SvPV_nolen|5.006000||p
+SvPV_nomg_const_nolen|5.009003||p
+SvPV_nomg_const|5.009003||p
+SvPV_nomg|5.007002||p
+SvPV_renew|5.009003||p
+SvPV_set|||
+SvPVbyte_force||5.009002|
+SvPVbyte_nolen||5.006000|
+SvPVbytex_force||5.006000|
+SvPVbytex||5.006000|
+SvPVbyte|5.006000||p
+SvPVutf8_force||5.006000|
+SvPVutf8_nolen||5.006000|
+SvPVutf8x_force||5.006000|
+SvPVutf8x||5.006000|
+SvPVutf8||5.006000|
+SvPVx|||
+SvPV|||
+SvREFCNT_dec|||
+SvREFCNT_inc_NN|5.009004||p
+SvREFCNT_inc_simple_NN|5.009004||p
+SvREFCNT_inc_simple_void_NN|5.009004||p
+SvREFCNT_inc_simple_void|5.009004||p
+SvREFCNT_inc_simple|5.009004||p
+SvREFCNT_inc_void_NN|5.009004||p
+SvREFCNT_inc_void|5.009004||p
+SvREFCNT_inc|||p
+SvREFCNT|||
+SvROK_off|||
+SvROK_on|||
+SvROK|||
+SvRV_set|5.009003||p
+SvRV|||
+SvRXOK||5.009005|
+SvRX||5.009005|
+SvSETMAGIC|||
+SvSHARED_HASH|5.009003||p
+SvSHARE||5.007003|
+SvSTASH_set|5.009003||p
+SvSTASH|||
+SvSetMagicSV_nosteal||5.004000|
+SvSetMagicSV||5.004000|
+SvSetSV_nosteal||5.004000|
+SvSetSV|||
+SvTAINTED_off||5.004000|
+SvTAINTED_on||5.004000|
+SvTAINTED||5.004000|
+SvTAINT|||
+SvTRUE|||
+SvTYPE|||
+SvUNLOCK||5.007003|
+SvUOK|5.007001|5.006000|p
+SvUPGRADE|||
+SvUTF8_off||5.006000|
+SvUTF8_on||5.006000|
+SvUTF8||5.006000|
+SvUVXx|5.004000||p
+SvUVX|5.004000||p
+SvUV_nomg|5.009001||p
+SvUV_set|5.009003||p
+SvUVx|5.004000||p
+SvUV|5.004000||p
+SvVOK||5.008001|
+SvVSTRING_mg|5.009004||p
+THIS|||n
+UNDERBAR|5.009002||p
+UTF8_MAXBYTES|5.009002||p
+UVSIZE|5.006000||p
+UVTYPE|5.006000||p
+UVXf|5.007001||p
+UVof|5.006000||p
+UVuf|5.006000||p
+UVxf|5.006000||p
+WARN_ALL|5.006000||p
+WARN_AMBIGUOUS|5.006000||p
+WARN_ASSERTIONS|5.011000||p
+WARN_BAREWORD|5.006000||p
+WARN_CLOSED|5.006000||p
+WARN_CLOSURE|5.006000||p
+WARN_DEBUGGING|5.006000||p
+WARN_DEPRECATED|5.006000||p
+WARN_DIGIT|5.006000||p
+WARN_EXEC|5.006000||p
+WARN_EXITING|5.006000||p
+WARN_GLOB|5.006000||p
+WARN_INPLACE|5.006000||p
+WARN_INTERNAL|5.006000||p
+WARN_IO|5.006000||p
+WARN_LAYER|5.008000||p
+WARN_MALLOC|5.006000||p
+WARN_MISC|5.006000||p
+WARN_NEWLINE|5.006000||p
+WARN_NUMERIC|5.006000||p
+WARN_ONCE|5.006000||p
+WARN_OVERFLOW|5.006000||p
+WARN_PACK|5.006000||p
+WARN_PARENTHESIS|5.006000||p
+WARN_PIPE|5.006000||p
+WARN_PORTABLE|5.006000||p
+WARN_PRECEDENCE|5.006000||p
+WARN_PRINTF|5.006000||p
+WARN_PROTOTYPE|5.006000||p
+WARN_QW|5.006000||p
+WARN_RECURSION|5.006000||p
+WARN_REDEFINE|5.006000||p
+WARN_REGEXP|5.006000||p
+WARN_RESERVED|5.006000||p
+WARN_SEMICOLON|5.006000||p
+WARN_SEVERE|5.006000||p
+WARN_SIGNAL|5.006000||p
+WARN_SUBSTR|5.006000||p
+WARN_SYNTAX|5.006000||p
+WARN_TAINT|5.006000||p
+WARN_THREADS|5.008000||p
+WARN_UNINITIALIZED|5.006000||p
+WARN_UNOPENED|5.006000||p
+WARN_UNPACK|5.006000||p
+WARN_UNTIE|5.006000||p
+WARN_UTF8|5.006000||p
+WARN_VOID|5.006000||p
+XCPT_CATCH|5.009002||p
+XCPT_RETHROW|5.009002||p
+XCPT_TRY_END|5.009002||p
+XCPT_TRY_START|5.009002||p
+XPUSHi|||
+XPUSHmortal|5.009002||p
+XPUSHn|||
+XPUSHp|||
+XPUSHs|||
+XPUSHu|5.004000||p
+XSPROTO|5.010000||p
+XSRETURN_EMPTY|||
+XSRETURN_IV|||
+XSRETURN_NO|||
+XSRETURN_NV|||
+XSRETURN_PV|||
+XSRETURN_UNDEF|||
+XSRETURN_UV|5.008001||p
+XSRETURN_YES|||
+XSRETURN|||p
+XST_mIV|||
+XST_mNO|||
+XST_mNV|||
+XST_mPV|||
+XST_mUNDEF|||
+XST_mUV|5.008001||p
+XST_mYES|||
+XS_VERSION_BOOTCHECK|||
+XS_VERSION|||
+XSprePUSH|5.006000||p
+XS|||
+ZeroD|5.009002||p
+Zero|||
+_aMY_CXT|5.007003||p
+_pMY_CXT|5.007003||p
+aMY_CXT_|5.007003||p
+aMY_CXT|5.007003||p
+aTHXR_|5.011000||p
+aTHXR|5.011000||p
+aTHX_|5.006000||p
+aTHX|5.006000||p
+add_data|||n
+addmad|||
+allocmy|||
+amagic_call|||
+amagic_cmp_locale|||
+amagic_cmp|||
+amagic_i_ncmp|||
+amagic_ncmp|||
+any_dup|||
+ao|||
+append_elem|||
+append_list|||
+append_madprops|||
+apply_attrs_my|||
+apply_attrs_string||5.006001|
+apply_attrs|||
+apply|||
+atfork_lock||5.007003|n
+atfork_unlock||5.007003|n
+av_arylen_p||5.009003|
+av_clear|||
+av_create_and_push||5.009005|
+av_create_and_unshift_one||5.009005|
+av_delete||5.006000|
+av_exists||5.006000|
+av_extend|||
+av_fetch|||
+av_fill|||
+av_iter_p||5.011000|
+av_len|||
+av_make|||
+av_pop|||
+av_push|||
+av_reify|||
+av_shift|||
+av_store|||
+av_undef|||
+av_unshift|||
+ax|||n
+bad_type|||
+bind_match|||
+block_end|||
+block_gimme||5.004000|
+block_start|||
+boolSV|5.004000||p
+boot_core_PerlIO|||
+boot_core_UNIVERSAL|||
+boot_core_mro|||
+bytes_from_utf8||5.007001|
+bytes_to_uni|||n
+bytes_to_utf8||5.006001|
+call_argv|5.006000||p
+call_atexit||5.006000|
+call_list||5.004000|
+call_method|5.006000||p
+call_pv|5.006000||p
+call_sv|5.006000||p
+calloc||5.007002|n
+cando|||
+cast_i32||5.006000|
+cast_iv||5.006000|
+cast_ulong||5.006000|
+cast_uv||5.006000|
+check_type_and_open|||
+check_uni|||
+checkcomma|||
+checkposixcc|||
+ckWARN|5.006000||p
+ck_anoncode|||
+ck_bitop|||
+ck_concat|||
+ck_defined|||
+ck_delete|||
+ck_die|||
+ck_each|||
+ck_eof|||
+ck_eval|||
+ck_exec|||
+ck_exists|||
+ck_exit|||
+ck_ftst|||
+ck_fun|||
+ck_glob|||
+ck_grep|||
+ck_index|||
+ck_join|||
+ck_lfun|||
+ck_listiob|||
+ck_match|||
+ck_method|||
+ck_null|||
+ck_open|||
+ck_readline|||
+ck_repeat|||
+ck_require|||
+ck_return|||
+ck_rfun|||
+ck_rvconst|||
+ck_sassign|||
+ck_select|||
+ck_shift|||
+ck_sort|||
+ck_spair|||
+ck_split|||
+ck_subr|||
+ck_substr|||
+ck_svconst|||
+ck_trunc|||
+ck_unpack|||
+ckwarn_d||5.009003|
+ckwarn||5.009003|
+cl_and|||n
+cl_anything|||n
+cl_init_zero|||n
+cl_init|||n
+cl_is_anything|||n
+cl_or|||n
+clear_placeholders|||
+closest_cop|||
+convert|||
+cop_free|||
+cr_textfilter|||
+create_eval_scope|||
+croak_nocontext|||vn
+croak_xs_usage||5.011000|
+croak|||v
+csighandler||5.009003|n
+curmad|||
+custom_op_desc||5.007003|
+custom_op_name||5.007003|
+cv_ckproto_len|||
+cv_clone|||
+cv_const_sv||5.004000|
+cv_dump|||
+cv_undef|||
+cx_dump||5.005000|
+cx_dup|||
+cxinc|||
+dAXMARK|5.009003||p
+dAX|5.007002||p
+dITEMS|5.007002||p
+dMARK|||
+dMULTICALL||5.009003|
+dMY_CXT_SV|5.007003||p
+dMY_CXT|5.007003||p
+dNOOP|5.006000||p
+dORIGMARK|||
+dSP|||
+dTHR|5.004050||p
+dTHXR|5.011000||p
+dTHXa|5.006000||p
+dTHXoa|5.006000||p
+dTHX|5.006000||p
+dUNDERBAR|5.009002||p
+dVAR|5.009003||p
+dXCPT|5.009002||p
+dXSARGS|||
+dXSI32|||
+dXSTARG|5.006000||p
+deb_curcv|||
+deb_nocontext|||vn
+deb_stack_all|||
+deb_stack_n|||
+debop||5.005000|
+debprofdump||5.005000|
+debprof|||
+debstackptrs||5.007003|
+debstack||5.007003|
+debug_start_match|||
+deb||5.007003|v
+del_sv|||
+delete_eval_scope|||
+delimcpy||5.004000|
+deprecate_old|||
+deprecate|||
+despatch_signals||5.007001|
+destroy_matcher|||
+die_nocontext|||vn
+die_where|||
+die|||v
+dirp_dup|||
+div128|||
+djSP|||
+do_aexec5|||
+do_aexec|||
+do_aspawn|||
+do_binmode||5.004050|
+do_chomp|||
+do_chop|||
+do_close|||
+do_dump_pad|||
+do_eof|||
+do_exec3|||
+do_execfree|||
+do_exec|||
+do_gv_dump||5.006000|
+do_gvgv_dump||5.006000|
+do_hv_dump||5.006000|
+do_ipcctl|||
+do_ipcget|||
+do_join|||
+do_kv|||
+do_magic_dump||5.006000|
+do_msgrcv|||
+do_msgsnd|||
+do_oddball|||
+do_op_dump||5.006000|
+do_op_xmldump|||
+do_open9||5.006000|
+do_openn||5.007001|
+do_open||5.004000|
+do_pmop_dump||5.006000|
+do_pmop_xmldump|||
+do_print|||
+do_readline|||
+do_seek|||
+do_semop|||
+do_shmio|||
+do_smartmatch|||
+do_spawn_nowait|||
+do_spawn|||
+do_sprintf|||
+do_sv_dump||5.006000|
+do_sysseek|||
+do_tell|||
+do_trans_complex_utf8|||
+do_trans_complex|||
+do_trans_count_utf8|||
+do_trans_count|||
+do_trans_simple_utf8|||
+do_trans_simple|||
+do_trans|||
+do_vecget|||
+do_vecset|||
+do_vop|||
+docatch|||
+doeval|||
+dofile|||
+dofindlabel|||
+doform|||
+doing_taint||5.008001|n
+dooneliner|||
+doopen_pm|||
+doparseform|||
+dopoptoeval|||
+dopoptogiven|||
+dopoptolabel|||
+dopoptoloop|||
+dopoptosub_at|||
+dopoptowhen|||
+doref||5.009003|
+dounwind|||
+dowantarray|||
+dump_all||5.006000|
+dump_eval||5.006000|
+dump_exec_pos|||
+dump_fds|||
+dump_form||5.006000|
+dump_indent||5.006000|v
+dump_mstats|||
+dump_packsubs||5.006000|
+dump_sub||5.006000|
+dump_sv_child|||
+dump_trie_interim_list|||
+dump_trie_interim_table|||
+dump_trie|||
+dump_vindent||5.006000|
+dumpuntil|||
+dup_attrlist|||
+emulate_cop_io|||
+eval_pv|5.006000||p
+eval_sv|5.006000||p
+exec_failed|||
+expect_number|||
+fbm_compile||5.005000|
+fbm_instr||5.005000|
+feature_is_enabled|||
+fetch_cop_label||5.011000|
+filter_add|||
+filter_del|||
+filter_gets|||
+filter_read|||
+find_and_forget_pmops|||
+find_array_subscript|||
+find_beginning|||
+find_byclass|||
+find_hash_subscript|||
+find_in_my_stash|||
+find_runcv||5.008001|
+find_rundefsvoffset||5.009002|
+find_script|||
+find_uninit_var|||
+first_symbol|||n
+fold_constants|||
+forbid_setid|||
+force_ident|||
+force_list|||
+force_next|||
+force_version|||
+force_word|||
+forget_pmop|||
+form_nocontext|||vn
+form||5.004000|v
+fp_dup|||
+fprintf_nocontext|||vn
+free_global_struct|||
+free_tied_hv_pool|||
+free_tmps|||
+gen_constant_list|||
+get_arena|||
+get_aux_mg|||
+get_av|5.006000||p
+get_context||5.006000|n
+get_cvn_flags||5.009005|
+get_cv|5.006000||p
+get_db_sub|||
+get_debug_opts|||
+get_hash_seed|||
+get_hv|5.006000||p
+get_isa_hash|||
+get_mstats|||
+get_no_modify|||
+get_num|||
+get_op_descs||5.005000|
+get_op_names||5.005000|
+get_opargs|||
+get_ppaddr||5.006000|
+get_re_arg|||
+get_sv|5.006000||p
+get_vtbl||5.005030|
+getcwd_sv||5.007002|
+getenv_len|||
+glob_2number|||
+glob_assign_glob|||
+glob_assign_ref|||
+gp_dup|||
+gp_free|||
+gp_ref|||
+grok_bin|5.007003||p
+grok_hex|5.007003||p
+grok_number|5.007002||p
+grok_numeric_radix|5.007002||p
+grok_oct|5.007003||p
+group_end|||
+gv_AVadd|||
+gv_HVadd|||
+gv_IOadd|||
+gv_SVadd|||
+gv_autoload4||5.004000|
+gv_check|||
+gv_const_sv||5.009003|
+gv_dump||5.006000|
+gv_efullname3||5.004000|
+gv_efullname4||5.006001|
+gv_efullname|||
+gv_ename|||
+gv_fetchfile_flags||5.009005|
+gv_fetchfile|||
+gv_fetchmeth_autoload||5.007003|
+gv_fetchmethod_autoload||5.004000|
+gv_fetchmethod_flags||5.011000|
+gv_fetchmethod|||
+gv_fetchmeth|||
+gv_fetchpvn_flags|5.009002||p
+gv_fetchpvs|5.009004||p
+gv_fetchpv|||
+gv_fetchsv||5.009002|
+gv_fullname3||5.004000|
+gv_fullname4||5.006001|
+gv_fullname|||
+gv_get_super_pkg|||
+gv_handler||5.007001|
+gv_init_sv|||
+gv_init|||
+gv_name_set||5.009004|
+gv_stashpvn|5.004000||p
+gv_stashpvs|5.009003||p
+gv_stashpv|||
+gv_stashsv|||
+he_dup|||
+hek_dup|||
+hfreeentries|||
+hsplit|||
+hv_assert||5.011000|
+hv_auxinit|||n
+hv_backreferences_p|||
+hv_clear_placeholders||5.009001|
+hv_clear|||
+hv_common_key_len||5.010000|
+hv_common||5.010000|
+hv_copy_hints_hv|||
+hv_delayfree_ent||5.004000|
+hv_delete_common|||
+hv_delete_ent||5.004000|
+hv_delete|||
+hv_eiter_p||5.009003|
+hv_eiter_set||5.009003|
+hv_exists_ent||5.004000|
+hv_exists|||
+hv_fetch_ent||5.004000|
+hv_fetchs|5.009003||p
+hv_fetch|||
+hv_free_ent||5.004000|
+hv_iterinit|||
+hv_iterkeysv||5.004000|
+hv_iterkey|||
+hv_iternext_flags||5.008000|
+hv_iternextsv|||
+hv_iternext|||
+hv_iterval|||
+hv_kill_backrefs|||
+hv_ksplit||5.004000|
+hv_magic_check|||n
+hv_magic|||
+hv_name_set||5.009003|
+hv_notallowed|||
+hv_placeholders_get||5.009003|
+hv_placeholders_p||5.009003|
+hv_placeholders_set||5.009003|
+hv_riter_p||5.009003|
+hv_riter_set||5.009003|
+hv_scalar||5.009001|
+hv_store_ent||5.004000|
+hv_store_flags||5.008000|
+hv_stores|5.009004||p
+hv_store|||
+hv_undef|||
+ibcmp_locale||5.004000|
+ibcmp_utf8||5.007003|
+ibcmp|||
+incline|||
+incpush_if_exists|||
+incpush_use_sep|||
+incpush|||
+ingroup|||
+init_argv_symbols|||
+init_debugger|||
+init_global_struct|||
+init_i18nl10n||5.006000|
+init_i18nl14n||5.006000|
+init_ids|||
+init_interp|||
+init_main_stash|||
+init_perllib|||
+init_postdump_symbols|||
+init_predump_symbols|||
+init_stacks||5.005000|
+init_tm||5.007002|
+instr|||
+intro_my|||
+intuit_method|||
+intuit_more|||
+invert|||
+io_close|||
+isALNUMC|5.006000||p
+isALNUM|||
+isALPHA|||
+isASCII|5.006000||p
+isBLANK|5.006001||p
+isCNTRL|5.006000||p
+isDIGIT|||
+isGRAPH|5.006000||p
+isGV_with_GP|5.009004||p
+isLOWER|||
+isPRINT|5.004000||p
+isPSXSPC|5.006001||p
+isPUNCT|5.006000||p
+isSPACE|||
+isUPPER|||
+isXDIGIT|5.006000||p
+is_an_int|||
+is_gv_magical_sv|||
+is_handle_constructor|||n
+is_list_assignment|||
+is_lvalue_sub||5.007001|
+is_uni_alnum_lc||5.006000|
+is_uni_alnumc_lc||5.006000|
+is_uni_alnumc||5.006000|
+is_uni_alnum||5.006000|
+is_uni_alpha_lc||5.006000|
+is_uni_alpha||5.006000|
+is_uni_ascii_lc||5.006000|
+is_uni_ascii||5.006000|
+is_uni_cntrl_lc||5.006000|
+is_uni_cntrl||5.006000|
+is_uni_digit_lc||5.006000|
+is_uni_digit||5.006000|
+is_uni_graph_lc||5.006000|
+is_uni_graph||5.006000|
+is_uni_idfirst_lc||5.006000|
+is_uni_idfirst||5.006000|
+is_uni_lower_lc||5.006000|
+is_uni_lower||5.006000|
+is_uni_print_lc||5.006000|
+is_uni_print||5.006000|
+is_uni_punct_lc||5.006000|
+is_uni_punct||5.006000|
+is_uni_space_lc||5.006000|
+is_uni_space||5.006000|
+is_uni_upper_lc||5.006000|
+is_uni_upper||5.006000|
+is_uni_xdigit_lc||5.006000|
+is_uni_xdigit||5.006000|
+is_utf8_alnumc||5.006000|
+is_utf8_alnum||5.006000|
+is_utf8_alpha||5.006000|
+is_utf8_ascii||5.006000|
+is_utf8_char_slow|||n
+is_utf8_char||5.006000|
+is_utf8_cntrl||5.006000|
+is_utf8_common|||
+is_utf8_digit||5.006000|
+is_utf8_graph||5.006000|
+is_utf8_idcont||5.008000|
+is_utf8_idfirst||5.006000|
+is_utf8_lower||5.006000|
+is_utf8_mark||5.006000|
+is_utf8_print||5.006000|
+is_utf8_punct||5.006000|
+is_utf8_space||5.006000|
+is_utf8_string_loclen||5.009003|
+is_utf8_string_loc||5.008001|
+is_utf8_string||5.006001|
+is_utf8_upper||5.006000|
+is_utf8_xdigit||5.006000|
+isa_lookup|||
+items|||n
+ix|||n
+jmaybe|||
+join_exact|||
+keyword|||
+leave_scope|||
+lex_end|||
+lex_start|||
+linklist|||
+listkids|||
+list|||
+load_module_nocontext|||vn
+load_module|5.006000||pv
+localize|||
+looks_like_bool|||
+looks_like_number|||
+lop|||
+mPUSHi|5.009002||p
+mPUSHn|5.009002||p
+mPUSHp|5.009002||p
+mPUSHs|5.011000||p
+mPUSHu|5.009002||p
+mXPUSHi|5.009002||p
+mXPUSHn|5.009002||p
+mXPUSHp|5.009002||p
+mXPUSHs|5.011000||p
+mXPUSHu|5.009002||p
+mad_free|||
+madlex|||
+madparse|||
+magic_clear_all_env|||
+magic_clearenv|||
+magic_clearhint|||
+magic_clearisa|||
+magic_clearpack|||
+magic_clearsig|||
+magic_dump||5.006000|
+magic_existspack|||
+magic_freearylen_p|||
+magic_freeovrld|||
+magic_getarylen|||
+magic_getdefelem|||
+magic_getnkeys|||
+magic_getpack|||
+magic_getpos|||
+magic_getsig|||
+magic_getsubstr|||
+magic_gettaint|||
+magic_getuvar|||
+magic_getvec|||
+magic_get|||
+magic_killbackrefs|||
+magic_len|||
+magic_methcall|||
+magic_methpack|||
+magic_nextpack|||
+magic_regdata_cnt|||
+magic_regdatum_get|||
+magic_regdatum_set|||
+magic_scalarpack|||
+magic_set_all_env|||
+magic_setamagic|||
+magic_setarylen|||
+magic_setcollxfrm|||
+magic_setdbline|||
+magic_setdefelem|||
+magic_setenv|||
+magic_sethint|||
+magic_setisa|||
+magic_setmglob|||
+magic_setnkeys|||
+magic_setpack|||
+magic_setpos|||
+magic_setregexp|||
+magic_setsig|||
+magic_setsubstr|||
+magic_settaint|||
+magic_setutf8|||
+magic_setuvar|||
+magic_setvec|||
+magic_set|||
+magic_sizepack|||
+magic_wipepack|||
+make_matcher|||
+make_trie_failtable|||
+make_trie|||
+malloc_good_size|||n
+malloced_size|||n
+malloc||5.007002|n
+markstack_grow|||
+matcher_matches_sv|||
+measure_struct|||
+memEQ|5.004000||p
+memNE|5.004000||p
+mem_collxfrm|||
+mem_log_common|||n
+mess_alloc|||
+mess_nocontext|||vn
+mess||5.006000|v
+method_common|||
+mfree||5.007002|n
+mg_clear|||
+mg_copy|||
+mg_dup|||
+mg_find|||
+mg_free|||
+mg_get|||
+mg_length||5.005000|
+mg_localize|||
+mg_magical|||
+mg_set|||
+mg_size||5.005000|
+mini_mktime||5.007002|
+missingterm|||
+mode_from_discipline|||
+modkids|||
+mod|||
+more_bodies|||
+more_sv|||
+moreswitches|||
+mro_get_from_name||5.011000|
+mro_get_linear_isa_dfs|||
+mro_get_linear_isa||5.009005|
+mro_get_private_data||5.011000|
+mro_isa_changed_in|||
+mro_meta_dup|||
+mro_meta_init|||
+mro_method_changed_in||5.009005|
+mro_register||5.011000|
+mro_set_mro||5.011000|
+mro_set_private_data||5.011000|
+mul128|||
+mulexp10|||n
+my_atof2||5.007002|
+my_atof||5.006000|
+my_attrs|||
+my_bcopy|||n
+my_betoh16|||n
+my_betoh32|||n
+my_betoh64|||n
+my_betohi|||n
+my_betohl|||n
+my_betohs|||n
+my_bzero|||n
+my_chsize|||
+my_clearenv|||
+my_cxt_index|||
+my_cxt_init|||
+my_dirfd||5.009005|
+my_exit_jump|||
+my_exit|||
+my_failure_exit||5.004000|
+my_fflush_all||5.006000|
+my_fork||5.007003|n
+my_htobe16|||n
+my_htobe32|||n
+my_htobe64|||n
+my_htobei|||n
+my_htobel|||n
+my_htobes|||n
+my_htole16|||n
+my_htole32|||n
+my_htole64|||n
+my_htolei|||n
+my_htolel|||n
+my_htoles|||n
+my_htonl|||
+my_kid|||
+my_letoh16|||n
+my_letoh32|||n
+my_letoh64|||n
+my_letohi|||n
+my_letohl|||n
+my_letohs|||n
+my_lstat|||
+my_memcmp||5.004000|n
+my_memset|||n
+my_ntohl|||
+my_pclose||5.004000|
+my_popen_list||5.007001|
+my_popen||5.004000|
+my_setenv|||
+my_snprintf|5.009004||pvn
+my_socketpair||5.007003|n
+my_sprintf|5.009003||pvn
+my_stat|||
+my_strftime||5.007002|
+my_strlcat|5.009004||pn
+my_strlcpy|5.009004||pn
+my_swabn|||n
+my_swap|||
+my_unexec|||
+my_vsnprintf||5.009004|n
+need_utf8|||n
+newANONATTRSUB||5.006000|
+newANONHASH|||
+newANONLIST|||
+newANONSUB|||
+newASSIGNOP|||
+newATTRSUB||5.006000|
+newAVREF|||
+newAV|||
+newBINOP|||
+newCONDOP|||
+newCONSTSUB|5.004050||p
+newCVREF|||
+newDEFSVOP|||
+newFORM|||
+newFOROP|||
+newGIVENOP||5.009003|
+newGIVWHENOP|||
+newGP|||
+newGVOP|||
+newGVREF|||
+newGVgen|||
+newHVREF|||
+newHVhv||5.005000|
+newHV|||
+newIO|||
+newLISTOP|||
+newLOGOP|||
+newLOOPEX|||
+newLOOPOP|||
+newMADPROP|||
+newMADsv|||
+newMYSUB|||
+newNULLLIST|||
+newOP|||
+newPADOP|||
+newPMOP|||
+newPROG|||
+newPVOP|||
+newRANGE|||
+newRV_inc|5.004000||p
+newRV_noinc|5.004000||p
+newRV|||
+newSLICEOP|||
+newSTATEOP|||
+newSUB|||
+newSVOP|||
+newSVREF|||
+newSV_type|5.009005||p
+newSVhek||5.009003|
+newSViv|||
+newSVnv|||
+newSVpvf_nocontext|||vn
+newSVpvf||5.004000|v
+newSVpvn_flags|5.011000||p
+newSVpvn_share|5.007001||p
+newSVpvn_utf8|5.011000||p
+newSVpvn|5.004050||p
+newSVpvs_flags|5.011000||p
+newSVpvs_share||5.009003|
+newSVpvs|5.009003||p
+newSVpv|||
+newSVrv|||
+newSVsv|||
+newSVuv|5.006000||p
+newSV|||
+newTOKEN|||
+newUNOP|||
+newWHENOP||5.009003|
+newWHILEOP||5.009003|
+newXS_flags||5.009004|
+newXSproto||5.006000|
+newXS||5.006000|
+new_collate||5.006000|
+new_constant|||
+new_ctype||5.006000|
+new_he|||
+new_logop|||
+new_numeric||5.006000|
+new_stackinfo||5.005000|
+new_version||5.009000|
+new_warnings_bitfield|||
+next_symbol|||
+nextargv|||
+nextchar|||
+ninstr|||
+no_bareword_allowed|||
+no_fh_allowed|||
+no_op|||
+not_a_number|||
+nothreadhook||5.008000|
+nuke_stacks|||
+num_overflow|||n
+offer_nice_chunk|||
+oopsAV|||
+oopsHV|||
+op_clear|||
+op_const_sv|||
+op_dump||5.006000|
+op_free|||
+op_getmad_weak|||
+op_getmad|||
+op_null||5.007002|
+op_refcnt_dec|||
+op_refcnt_inc|||
+op_refcnt_lock||5.009002|
+op_refcnt_unlock||5.009002|
+op_xmldump|||
+open_script|||
+pMY_CXT_|5.007003||p
+pMY_CXT|5.007003||p
+pTHX_|5.006000||p
+pTHX|5.006000||p
+packWARN|5.007003||p
+pack_cat||5.007003|
+pack_rec|||
+package|||
+packlist||5.008001|
+pad_add_anon|||
+pad_add_name|||
+pad_alloc|||
+pad_block_start|||
+pad_check_dup|||
+pad_compname_type|||
+pad_findlex|||
+pad_findmy|||
+pad_fixup_inner_anons|||
+pad_free|||
+pad_leavemy|||
+pad_new|||
+pad_peg|||n
+pad_push|||
+pad_reset|||
+pad_setsv|||
+pad_sv||5.011000|
+pad_swipe|||
+pad_tidy|||
+pad_undef|||
+parse_body|||
+parse_unicode_opts|||
+parser_dup|||
+parser_free|||
+path_is_absolute|||n
+peep|||
+pending_Slabs_to_ro|||
+perl_alloc_using|||n
+perl_alloc|||n
+perl_clone_using|||n
+perl_clone|||n
+perl_construct|||n
+perl_destruct||5.007003|n
+perl_free|||n
+perl_parse||5.006000|n
+perl_run|||n
+pidgone|||
+pm_description|||
+pmflag|||
+pmop_dump||5.006000|
+pmop_xmldump|||
+pmruntime|||
+pmtrans|||
+pop_scope|||
+pregcomp||5.009005|
+pregexec|||
+pregfree2||5.011000|
+pregfree|||
+prepend_elem|||
+prepend_madprops|||
+printbuf|||
+printf_nocontext|||vn
+process_special_blocks|||
+ptr_table_clear||5.009005|
+ptr_table_fetch||5.009005|
+ptr_table_find|||n
+ptr_table_free||5.009005|
+ptr_table_new||5.009005|
+ptr_table_split||5.009005|
+ptr_table_store||5.009005|
+push_scope|||
+put_byte|||
+pv_display|5.006000||p
+pv_escape|5.009004||p
+pv_pretty|5.009004||p
+pv_uni_display||5.007003|
+qerror|||
+qsortsvu|||
+re_compile||5.009005|
+re_croak2|||
+re_dup_guts|||
+re_intuit_start||5.009005|
+re_intuit_string||5.006000|
+readpipe_override|||
+realloc||5.007002|n
+reentrant_free|||
+reentrant_init|||
+reentrant_retry|||vn
+reentrant_size|||
+ref_array_or_hash|||
+refcounted_he_chain_2hv|||
+refcounted_he_fetch|||
+refcounted_he_free|||
+refcounted_he_new_common|||
+refcounted_he_new|||
+refcounted_he_value|||
+refkids|||
+refto|||
+ref||5.011000|
+reg_check_named_buff_matched|||
+reg_named_buff_all||5.009005|
+reg_named_buff_exists||5.009005|
+reg_named_buff_fetch||5.009005|
+reg_named_buff_firstkey||5.009005|
+reg_named_buff_iter|||
+reg_named_buff_nextkey||5.009005|
+reg_named_buff_scalar||5.009005|
+reg_named_buff|||
+reg_namedseq|||
+reg_node|||
+reg_numbered_buff_fetch|||
+reg_numbered_buff_length|||
+reg_numbered_buff_store|||
+reg_qr_package|||
+reg_recode|||
+reg_scan_name|||
+reg_skipcomment|||
+reg_temp_copy|||
+reganode|||
+regatom|||
+regbranch|||
+regclass_swash||5.009004|
+regclass|||
+regcppop|||
+regcppush|||
+regcurly|||n
+regdump_extflags|||
+regdump||5.005000|
+regdupe_internal|||
+regexec_flags||5.005000|
+regfree_internal||5.009005|
+reghop3|||n
+reghop4|||n
+reghopmaybe3|||n
+reginclass|||
+reginitcolors||5.006000|
+reginsert|||
+regmatch|||
+regnext||5.005000|
+regpiece|||
+regpposixcc|||
+regprop|||
+regrepeat|||
+regtail_study|||
+regtail|||
+regtry|||
+reguni|||
+regwhite|||n
+reg|||
+repeatcpy|||
+report_evil_fh|||
+report_uninit|||
+require_pv||5.006000|
+require_tie_mod|||
+restore_magic|||
+rninstr|||
+rsignal_restore|||
+rsignal_save|||
+rsignal_state||5.004000|
+rsignal||5.004000|
+run_body|||
+run_user_filter|||
+runops_debug||5.005000|
+runops_standard||5.005000|
+rvpv_dup|||
+rxres_free|||
+rxres_restore|||
+rxres_save|||
+safesyscalloc||5.006000|n
+safesysfree||5.006000|n
+safesysmalloc||5.006000|n
+safesysrealloc||5.006000|n
+same_dirent|||
+save_I16||5.004000|
+save_I32|||
+save_I8||5.006000|
+save_adelete||5.011000|
+save_aelem||5.004050|
+save_alloc||5.006000|
+save_aptr|||
+save_ary|||
+save_bool||5.008001|
+save_clearsv|||
+save_delete|||
+save_destructor_x||5.006000|
+save_destructor||5.006000|
+save_freeop|||
+save_freepv|||
+save_freesv|||
+save_generic_pvref||5.006001|
+save_generic_svref||5.005030|
+save_gp||5.004000|
+save_hash|||
+save_hek_flags|||n
+save_helem_flags||5.011000|
+save_helem||5.004050|
+save_hints|||
+save_hptr|||
+save_int|||
+save_item|||
+save_iv||5.005000|
+save_lines|||
+save_list|||
+save_long|||
+save_magic|||
+save_mortalizesv||5.007001|
+save_nogv|||
+save_op|||
+save_padsv_and_mortalize||5.011000|
+save_pptr|||
+save_pushi32ptr|||
+save_pushptri32ptr|||
+save_pushptrptr|||
+save_pushptr||5.011000|
+save_re_context||5.006000|
+save_scalar_at|||
+save_scalar|||
+save_set_svflags||5.009000|
+save_shared_pvref||5.007003|
+save_sptr|||
+save_svref|||
+save_vptr||5.006000|
+savepvn|||
+savepvs||5.009003|
+savepv|||
+savesharedpvn||5.009005|
+savesharedpv||5.007003|
+savestack_grow_cnt||5.008001|
+savestack_grow|||
+savesvpv||5.009002|
+sawparens|||
+scalar_mod_type|||n
+scalarboolean|||
+scalarkids|||
+scalarseq|||
+scalarvoid|||
+scalar|||
+scan_bin||5.006000|
+scan_commit|||
+scan_const|||
+scan_formline|||
+scan_heredoc|||
+scan_hex|||
+scan_ident|||
+scan_inputsymbol|||
+scan_num||5.007001|
+scan_oct|||
+scan_pat|||
+scan_str|||
+scan_subst|||
+scan_trans|||
+scan_version||5.009001|
+scan_vstring||5.009005|
+scan_word|||
+scope|||
+screaminstr||5.005000|
+search_const|||
+seed||5.008001|
+sequence_num|||
+sequence_tail|||
+sequence|||
+set_context||5.006000|n
+set_numeric_local||5.006000|
+set_numeric_radix||5.006000|
+set_numeric_standard||5.006000|
+setdefout|||
+share_hek_flags|||
+share_hek||5.004000|
+si_dup|||
+sighandler|||n
+simplify_sort|||
+skipspace0|||
+skipspace1|||
+skipspace2|||
+skipspace|||
+softref2xv|||
+sortcv_stacked|||
+sortcv_xsub|||
+sortcv|||
+sortsv_flags||5.009003|
+sortsv||5.007003|
+space_join_names_mortal|||
+ss_dup|||
+stack_grow|||
+start_force|||
+start_glob|||
+start_subparse||5.004000|
+stashpv_hvname_match||5.011000|
+stdize_locale|||
+store_cop_label|||
+strEQ|||
+strGE|||
+strGT|||
+strLE|||
+strLT|||
+strNE|||
+str_to_version||5.006000|
+strip_return|||
+strnEQ|||
+strnNE|||
+study_chunk|||
+sub_crush_depth|||
+sublex_done|||
+sublex_push|||
+sublex_start|||
+sv_2bool|||
+sv_2cv|||
+sv_2io|||
+sv_2iuv_common|||
+sv_2iuv_non_preserve|||
+sv_2iv_flags||5.009001|
+sv_2iv|||
+sv_2mortal|||
+sv_2num|||
+sv_2nv|||
+sv_2pv_flags|5.007002||p
+sv_2pv_nolen|5.006000||p
+sv_2pvbyte_nolen|5.006000||p
+sv_2pvbyte|5.006000||p
+sv_2pvutf8_nolen||5.006000|
+sv_2pvutf8||5.006000|
+sv_2pv|||
+sv_2uv_flags||5.009001|
+sv_2uv|5.004000||p
+sv_add_arena|||
+sv_add_backref|||
+sv_backoff|||
+sv_bless|||
+sv_cat_decode||5.008001|
+sv_catpv_mg|5.004050||p
+sv_catpvf_mg_nocontext|||pvn
+sv_catpvf_mg|5.006000|5.004000|pv
+sv_catpvf_nocontext|||vn
+sv_catpvf||5.004000|v
+sv_catpvn_flags||5.007002|
+sv_catpvn_mg|5.004050||p
+sv_catpvn_nomg|5.007002||p
+sv_catpvn|||
+sv_catpvs|5.009003||p
+sv_catpv|||
+sv_catsv_flags||5.007002|
+sv_catsv_mg|5.004050||p
+sv_catsv_nomg|5.007002||p
+sv_catsv|||
+sv_catxmlpvn|||
+sv_catxmlsv|||
+sv_chop|||
+sv_clean_all|||
+sv_clean_objs|||
+sv_clear|||
+sv_cmp_locale||5.004000|
+sv_cmp|||
+sv_collxfrm|||
+sv_compile_2op||5.008001|
+sv_copypv||5.007003|
+sv_dec|||
+sv_del_backref|||
+sv_derived_from||5.004000|
+sv_destroyable||5.010000|
+sv_does||5.009004|
+sv_dump|||
+sv_dup_inc_multiple|||
+sv_dup|||
+sv_eq|||
+sv_exp_grow|||
+sv_force_normal_flags||5.007001|
+sv_force_normal||5.006000|
+sv_free2|||
+sv_free_arenas|||
+sv_free|||
+sv_gets||5.004000|
+sv_grow|||
+sv_i_ncmp|||
+sv_inc|||
+sv_insert_flags||5.011000|
+sv_insert|||
+sv_isa|||
+sv_isobject|||
+sv_iv||5.005000|
+sv_kill_backrefs|||
+sv_len_utf8||5.006000|
+sv_len|||
+sv_magic_portable|5.011000|5.004000|p
+sv_magicext||5.007003|
+sv_magic|||
+sv_mortalcopy|||
+sv_ncmp|||
+sv_newmortal|||
+sv_newref|||
+sv_nolocking||5.007003|
+sv_nosharing||5.007003|
+sv_nounlocking|||
+sv_nv||5.005000|
+sv_peek||5.005000|
+sv_pos_b2u_midway|||
+sv_pos_b2u||5.006000|
+sv_pos_u2b_cached|||
+sv_pos_u2b_forwards|||n
+sv_pos_u2b_midway|||n
+sv_pos_u2b||5.006000|
+sv_pvbyten_force||5.006000|
+sv_pvbyten||5.006000|
+sv_pvbyte||5.006000|
+sv_pvn_force_flags|5.007002||p
+sv_pvn_force|||
+sv_pvn_nomg|5.007003|5.005000|p
+sv_pvn||5.005000|
+sv_pvutf8n_force||5.006000|
+sv_pvutf8n||5.006000|
+sv_pvutf8||5.006000|
+sv_pv||5.006000|
+sv_recode_to_utf8||5.007003|
+sv_reftype|||
+sv_release_COW|||
+sv_replace|||
+sv_report_used|||
+sv_reset|||
+sv_rvweaken||5.006000|
+sv_setiv_mg|5.004050||p
+sv_setiv|||
+sv_setnv_mg|5.006000||p
+sv_setnv|||
+sv_setpv_mg|5.004050||p
+sv_setpvf_mg_nocontext|||pvn
+sv_setpvf_mg|5.006000|5.004000|pv
+sv_setpvf_nocontext|||vn
+sv_setpvf||5.004000|v
+sv_setpviv_mg||5.008001|
+sv_setpviv||5.008001|
+sv_setpvn_mg|5.004050||p
+sv_setpvn|||
+sv_setpvs|5.009004||p
+sv_setpv|||
+sv_setref_iv|||
+sv_setref_nv|||
+sv_setref_pvn|||
+sv_setref_pv|||
+sv_setref_uv||5.007001|
+sv_setsv_cow|||
+sv_setsv_flags||5.007002|
+sv_setsv_mg|5.004050||p
+sv_setsv_nomg|5.007002||p
+sv_setsv|||
+sv_setuv_mg|5.004050||p
+sv_setuv|5.004000||p
+sv_tainted||5.004000|
+sv_taint||5.004000|
+sv_true||5.005000|
+sv_unglob|||
+sv_uni_display||5.007003|
+sv_unmagic|||
+sv_unref_flags||5.007001|
+sv_unref|||
+sv_untaint||5.004000|
+sv_upgrade|||
+sv_usepvn_flags||5.009004|
+sv_usepvn_mg|5.004050||p
+sv_usepvn|||
+sv_utf8_decode||5.006000|
+sv_utf8_downgrade||5.006000|
+sv_utf8_encode||5.006000|
+sv_utf8_upgrade_flags_grow||5.011000|
+sv_utf8_upgrade_flags||5.007002|
+sv_utf8_upgrade_nomg||5.007002|
+sv_utf8_upgrade||5.007001|
+sv_uv|5.005000||p
+sv_vcatpvf_mg|5.006000|5.004000|p
+sv_vcatpvfn||5.004000|
+sv_vcatpvf|5.006000|5.004000|p
+sv_vsetpvf_mg|5.006000|5.004000|p
+sv_vsetpvfn||5.004000|
+sv_vsetpvf|5.006000|5.004000|p
+sv_xmlpeek|||
+svtype|||
+swallow_bom|||
+swap_match_buff|||
+swash_fetch||5.007002|
+swash_get|||
+swash_init||5.006000|
+sys_init3||5.010000|n
+sys_init||5.010000|n
+sys_intern_clear|||
+sys_intern_dup|||
+sys_intern_init|||
+sys_term||5.010000|n
+taint_env|||
+taint_proper|||
+tmps_grow||5.006000|
+toLOWER|||
+toUPPER|||
+to_byte_substr|||
+to_uni_fold||5.007003|
+to_uni_lower_lc||5.006000|
+to_uni_lower||5.007003|
+to_uni_title_lc||5.006000|
+to_uni_title||5.007003|
+to_uni_upper_lc||5.006000|
+to_uni_upper||5.007003|
+to_utf8_case||5.007003|
+to_utf8_fold||5.007003|
+to_utf8_lower||5.007003|
+to_utf8_substr|||
+to_utf8_title||5.007003|
+to_utf8_upper||5.007003|
+token_free|||
+token_getmad|||
+tokenize_use|||
+tokeq|||
+tokereport|||
+too_few_arguments|||
+too_many_arguments|||
+uiv_2buf|||n
+unlnk|||
+unpack_rec|||
+unpack_str||5.007003|
+unpackstring||5.008001|
+unshare_hek_or_pvn|||
+unshare_hek|||
+unsharepvn||5.004000|
+unwind_handler_stack|||
+update_debugger_info|||
+upg_version||5.009005|
+usage|||
+utf16_to_utf8_reversed||5.006001|
+utf16_to_utf8||5.006001|
+utf8_distance||5.006000|
+utf8_hop||5.006000|
+utf8_length||5.007001|
+utf8_mg_pos_cache_update|||
+utf8_to_bytes||5.006001|
+utf8_to_uvchr||5.007001|
+utf8_to_uvuni||5.007001|
+utf8n_to_uvchr|||
+utf8n_to_uvuni||5.007001|
+utilize|||
+uvchr_to_utf8_flags||5.007003|
+uvchr_to_utf8|||
+uvuni_to_utf8_flags||5.007003|
+uvuni_to_utf8||5.007001|
+validate_suid|||
+varname|||
+vcmp||5.009000|
+vcroak||5.006000|
+vdeb||5.007003|
+vdie_common|||
+vdie_croak_common|||
+vdie|||
+vform||5.006000|
+visit|||
+vivify_defelem|||
+vivify_ref|||
+vload_module|5.006000||p
+vmess||5.006000|
+vnewSVpvf|5.006000|5.004000|p
+vnormal||5.009002|
+vnumify||5.009000|
+vstringify||5.009000|
+vverify||5.009003|
+vwarner||5.006000|
+vwarn||5.006000|
+wait4pid|||
+warn_nocontext|||vn
+warner_nocontext|||vn
+warner|5.006000|5.004000|pv
+warn|||v
+watch|||
+whichsig|||
+write_no_mem|||
+write_to_stderr|||
+xmldump_all|||
+xmldump_attr|||
+xmldump_eval|||
+xmldump_form|||
+xmldump_indent|||v
+xmldump_packsubs|||
+xmldump_sub|||
+xmldump_vindent|||
+yyerror|||
+yylex|||
+yyparse|||
+yywarn|||
+);
+
+if (exists $opt{'list-unsupported'}) {
+ my $f;
+ for $f (sort { lc $a cmp lc $b } keys %API) {
+ next unless $API{$f}{todo};
+ print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
+ }
+ exit 0;
+}
+
+# Scan for possible replacement candidates
+
+my(%replace, %need, %hints, %warnings, %depends);
+my $replace = 0;
+my($hint, $define, $function);
+
+sub find_api
+{
+ my $code = shift;
+ $code =~ s{
+ / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
+ | "[^"\\]*(?:\\.[^"\\]*)*"
+ | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx;
+ grep { exists $API{$_} } $code =~ /(\w+)/mg;
+}
+
+while (<DATA>) {
+ if ($hint) {
+ my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings;
+ if (m{^\s*\*\s(.*?)\s*$}) {
+ for (@{$hint->[1]}) {
+ $h->{$_} ||= ''; # suppress warning with older perls
+ $h->{$_} .= "$1\n";
+ }
+ }
+ else { undef $hint }
+ }
+
+ $hint = [$1, [split /,?\s+/, $2]]
+ if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$};
+
+ if ($define) {
+ if ($define->[1] =~ /\\$/) {
+ $define->[1] .= $_;
+ }
+ else {
+ if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) {
+ my @n = find_api($define->[1]);
+ push @{$depends{$define->[0]}}, @n if @n
+ }
+ undef $define;
+ }
+ }
+
+ $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)};
+
+ if ($function) {
+ if (/^}/) {
+ if (exists $API{$function->[0]}) {
+ my @n = find_api($function->[1]);
+ push @{$depends{$function->[0]}}, @n if @n
+ }
+ undef $function;
+ }
+ else {
+ $function->[1] .= $_;
+ }
+ }
+
+ $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)};
+
+ $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
+ $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
+ $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
+ $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
+
+ if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
+ my @deps = map { s/\s+//g; $_ } split /,/, $3;
+ my $d;
+ for $d (map { s/\s+//g; $_ } split /,/, $1) {
+ push @{$depends{$d}}, @deps;
+ }
+ }
+
+ $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
+}
+
+for (values %depends) {
+ my %s;
+ $_ = [sort grep !$s{$_}++, @$_];
+}
+
+if (exists $opt{'api-info'}) {
+ my $f;
+ my $count = 0;
+ my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
+ for $f (sort { lc $a cmp lc $b } keys %API) {
+ next unless $f =~ /$match/;
+ print "\n=== $f ===\n\n";
+ my $info = 0;
+ if ($API{$f}{base} || $API{$f}{todo}) {
+ my $base = format_version($API{$f}{base} || $API{$f}{todo});
+ print "Supported at least starting from perl-$base.\n";
+ $info++;
+ }
+ if ($API{$f}{provided}) {
+ my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003";
+ print "Support by $ppport provided back to perl-$todo.\n";
+ print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
+ print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
+ print "\n$hints{$f}" if exists $hints{$f};
+ print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f};
+ $info++;
+ }
+ print "No portability information available.\n" unless $info;
+ $count++;
+ }
+ $count or print "Found no API matching '$opt{'api-info'}'.";
+ print "\n";
+ exit 0;
+}
+
+if (exists $opt{'list-provided'}) {
+ my $f;
+ for $f (sort { lc $a cmp lc $b } keys %API) {
+ next unless $API{$f}{provided};
+ my @flags;
+ push @flags, 'explicit' if exists $need{$f};
+ push @flags, 'depend' if exists $depends{$f};
+ push @flags, 'hint' if exists $hints{$f};
+ push @flags, 'warning' if exists $warnings{$f};
+ my $flags = @flags ? ' ['.join(', ', @flags).']' : '';
+ print "$f$flags\n";
+ }
+ exit 0;
+}
+
+my @files;
+my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc );
+my $srcext = join '|', map { quotemeta $_ } @srcext;
+
+if (@ARGV) {
+ my %seen;
+ for (@ARGV) {
+ if (-e) {
+ if (-f) {
+ push @files, $_ unless $seen{$_}++;
+ }
+ else { warn "'$_' is not a file.\n" }
+ }
+ else {
+ my @new = grep { -f } glob $_
+ or warn "'$_' does not exist.\n";
+ push @files, grep { !$seen{$_}++ } @new;
+ }
+ }
+}
+else {
+ eval {
+ require File::Find;
+ File::Find::find(sub {
+ $File::Find::name =~ /($srcext)$/i
+ and push @files, $File::Find::name;
+ }, '.');
+ };
+ if ($@) {
+ @files = map { glob "*$_" } @srcext;
+ }
+}
+
+if (!@ARGV || $opt{filter}) {
+ my(@in, @out);
+ my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files;
+ for (@files) {
+ my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i;
+ push @{ $out ? \@out : \@in }, $_;
+ }
+ if (@ARGV && @out) {
+ warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out);
+ }
+ @files = @in;
+}
+
+die "No input files given!\n" unless @files;
+
+my(%files, %global, %revreplace);
+%revreplace = reverse %replace;
+my $filename;
+my $patch_opened = 0;
+
+for $filename (@files) {
+ unless (open IN, "<$filename") {
+ warn "Unable to read from $filename: $!\n";
+ next;
+ }
+
+ info("Scanning $filename ...");
+
+ my $c = do { local $/; <IN> };
+ close IN;
+
+ my %file = (orig => $c, changes => 0);
+
+ # Temporarily remove C/XS comments and strings from the code
+ my @ccom;
+
+ $c =~ s{
+ ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]*
+ | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* )
+ | ( ^$HS*\#[^\r\n]*
+ | "[^"\\]*(?:\\.[^"\\]*)*"
+ | '[^'\\]*(?:\\.[^'\\]*)*'
+ | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) )
+ }{ defined $2 and push @ccom, $2;
+ defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex;
+
+ $file{ccom} = \@ccom;
+ $file{code} = $c;
+ $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m;
+
+ my $func;
+
+ for $func (keys %API) {
+ my $match = $func;
+ $match .= "|$revreplace{$func}" if exists $revreplace{$func};
+ if ($c =~ /\b(?:Perl_)?($match)\b/) {
+ $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
+ $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
+ if (exists $API{$func}{provided}) {
+ $file{uses_provided}{$func}++;
+ if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
+ $file{uses}{$func}++;
+ my @deps = rec_depend($func);
+ if (@deps) {
+ $file{uses_deps}{$func} = \@deps;
+ for (@deps) {
+ $file{uses}{$_} = 0 unless exists $file{uses}{$_};
+ }
+ }
+ for ($func, @deps) {
+ $file{needs}{$_} = 'static' if exists $need{$_};
+ }
+ }
+ }
+ if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
+ if ($c =~ /\b$func\b/) {
+ $file{uses_todo}{$func}++;
+ }
+ }
+ }
+ }
+
+ while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) {
+ if (exists $need{$2}) {
+ $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
+ }
+ else { warning("Possibly wrong #define $1 in $filename") }
+ }
+
+ for (qw(uses needs uses_todo needed_global needed_static)) {
+ for $func (keys %{$file{$_}}) {
+ push @{$global{$_}{$func}}, $filename;
+ }
+ }
+
+ $files{$filename} = \%file;
+}
+
+# Globally resolve NEED_'s
+my $need;
+for $need (keys %{$global{needs}}) {
+ if (@{$global{needs}{$need}} > 1) {
+ my @targets = @{$global{needs}{$need}};
+ my @t = grep $files{$_}{needed_global}{$need}, @targets;
+ @targets = @t if @t;
+ @t = grep /\.xs$/i, @targets;
+ @targets = @t if @t;
+ my $target = shift @targets;
+ $files{$target}{needs}{$need} = 'global';
+ for (@{$global{needs}{$need}}) {
+ $files{$_}{needs}{$need} = 'extern' if $_ ne $target;
+ }
+ }
+}
+
+for $filename (@files) {
+ exists $files{$filename} or next;
+
+ info("=== Analyzing $filename ===");
+
+ my %file = %{$files{$filename}};
+ my $func;
+ my $c = $file{code};
+ my $warnings = 0;
+
+ for $func (sort keys %{$file{uses_Perl}}) {
+ if ($API{$func}{varargs}) {
+ unless ($API{$func}{nothxarg}) {
+ my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
+ { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
+ if ($changes) {
+ warning("Doesn't pass interpreter argument aTHX to Perl_$func");
+ $file{changes} += $changes;
+ }
+ }
+ }
+ else {
+ warning("Uses Perl_$func instead of $func");
+ $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*}
+ {$func$1(}g);
+ }
+ }
+
+ for $func (sort keys %{$file{uses_replace}}) {
+ warning("Uses $func instead of $replace{$func}");
+ $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
+ }
+
+ for $func (sort keys %{$file{uses_provided}}) {
+ if ($file{uses}{$func}) {
+ if (exists $file{uses_deps}{$func}) {
+ diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
+ }
+ else {
+ diag("Uses $func");
+ }
+ }
+ $warnings += hint($func);
+ }
+
+ unless ($opt{quiet}) {
+ for $func (sort keys %{$file{uses_todo}}) {
+ print "*** WARNING: Uses $func, which may not be portable below perl ",
+ format_version($API{$func}{todo}), ", even with '$ppport'\n";
+ $warnings++;
+ }
+ }
+
+ for $func (sort keys %{$file{needed_static}}) {
+ my $message = '';
+ if (not exists $file{uses}{$func}) {
+ $message = "No need to define NEED_$func if $func is never used";
+ }
+ elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') {
+ $message = "No need to define NEED_$func when already needed globally";
+ }
+ if ($message) {
+ diag($message);
+ $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg);
+ }
+ }
+
+ for $func (sort keys %{$file{needed_global}}) {
+ my $message = '';
+ if (not exists $global{uses}{$func}) {
+ $message = "No need to define NEED_${func}_GLOBAL if $func is never used";
+ }
+ elsif (exists $file{needs}{$func}) {
+ if ($file{needs}{$func} eq 'extern') {
+ $message = "No need to define NEED_${func}_GLOBAL when already needed globally";
+ }
+ elsif ($file{needs}{$func} eq 'static') {
+ $message = "No need to define NEED_${func}_GLOBAL when only used in this file";
+ }
+ }
+ if ($message) {
+ diag($message);
+ $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg);
+ }
+ }
+
+ $file{needs_inc_ppport} = keys %{$file{uses}};
+
+ if ($file{needs_inc_ppport}) {
+ my $pp = '';
+
+ for $func (sort keys %{$file{needs}}) {
+ my $type = $file{needs}{$func};
+ next if $type eq 'extern';
+ my $suffix = $type eq 'global' ? '_GLOBAL' : '';
+ unless (exists $file{"needed_$type"}{$func}) {
+ if ($type eq 'global') {
+ diag("Files [@{$global{needs}{$func}}] need $func, adding global request");
+ }
+ else {
+ diag("File needs $func, adding static request");
+ }
+ $pp .= "#define NEED_$func$suffix\n";
+ }
+ }
+
+ if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) {
+ $pp = '';
+ $file{changes}++;
+ }
+
+ unless ($file{has_inc_ppport}) {
+ diag("Needs to include '$ppport'");
+ $pp .= qq(#include "$ppport"\n)
+ }
+
+ if ($pp) {
+ $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms)
+ || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m)
+ || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m)
+ || ($c =~ s/^/$pp/);
+ }
+ }
+ else {
+ if ($file{has_inc_ppport}) {
+ diag("No need to include '$ppport'");
+ $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m);
+ }
+ }
+
+ # put back in our C comments
+ my $ix;
+ my $cppc = 0;
+ my @ccom = @{$file{ccom}};
+ for $ix (0 .. $#ccom) {
+ if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) {
+ $cppc++;
+ $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/;
+ }
+ else {
+ $c =~ s/$rccs$ix$rcce/$ccom[$ix]/;
+ }
+ }
+
+ if ($cppc) {
+ my $s = $cppc != 1 ? 's' : '';
+ warning("Uses $cppc C++ style comment$s, which is not portable");
+ }
+
+ my $s = $warnings != 1 ? 's' : '';
+ my $warn = $warnings ? " ($warnings warning$s)" : '';
+ info("Analysis completed$warn");
+
+ if ($file{changes}) {
+ if (exists $opt{copy}) {
+ my $newfile = "$filename$opt{copy}";
+ if (-e $newfile) {
+ error("'$newfile' already exists, refusing to write copy of '$filename'");
+ }
+ else {
+ local *F;
+ if (open F, ">$newfile") {
+ info("Writing copy of '$filename' with changes to '$newfile'");
+ print F $c;
+ close F;
+ }
+ else {
+ error("Cannot open '$newfile' for writing: $!");
+ }
+ }
+ }
+ elsif (exists $opt{patch} || $opt{changes}) {
+ if (exists $opt{patch}) {
+ unless ($patch_opened) {
+ if (open PATCH, ">$opt{patch}") {
+ $patch_opened = 1;
+ }
+ else {
+ error("Cannot open '$opt{patch}' for writing: $!");
+ delete $opt{patch};
+ $opt{changes} = 1;
+ goto fallback;
+ }
+ }
+ mydiff(\*PATCH, $filename, $c);
+ }
+ else {
+fallback:
+ info("Suggested changes:");
+ mydiff(\*STDOUT, $filename, $c);
+ }
+ }
+ else {
+ my $s = $file{changes} == 1 ? '' : 's';
+ info("$file{changes} potentially required change$s detected");
+ }
+ }
+ else {
+ info("Looks good");
+ }
+}
+
+close PATCH if $patch_opened;
+
+exit 0;
+
+
+sub try_use { eval "use @_;"; return $@ eq '' }
+
+sub mydiff
+{
+ local *F = shift;
+ my($file, $str) = @_;
+ my $diff;
+
+ if (exists $opt{diff}) {
+ $diff = run_diff($opt{diff}, $file, $str);
+ }
+
+ if (!defined $diff and try_use('Text::Diff')) {
+ $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
+ $diff = <<HEADER . $diff;
+--- $file
++++ $file.patched
+HEADER
+ }
+
+ if (!defined $diff) {
+ $diff = run_diff('diff -u', $file, $str);
+ }
+
+ if (!defined $diff) {
+ $diff = run_diff('diff', $file, $str);
+ }
+
+ if (!defined $diff) {
+ error("Cannot generate a diff. Please install Text::Diff or use --copy.");
+ return;
+ }
+
+ print F $diff;
+}
+
+sub run_diff
+{
+ my($prog, $file, $str) = @_;
+ my $tmp = 'dppptemp';
+ my $suf = 'aaa';
+ my $diff = '';
+ local *F;
+
+ while (-e "$tmp.$suf") { $suf++ }
+ $tmp = "$tmp.$suf";
+
+ if (open F, ">$tmp") {
+ print F $str;
+ close F;
+
+ if (open F, "$prog $file $tmp |") {
+ while (<F>) {
+ s/\Q$tmp\E/$file.patched/;
+ $diff .= $_;
+ }
+ close F;
+ unlink $tmp;
+ return $diff;
+ }
+
+ unlink $tmp;
+ }
+ else {
+ error("Cannot open '$tmp' for writing: $!");
+ }
+
+ return undef;
+}
+
+sub rec_depend
+{
+ my($func, $seen) = @_;
+ return () unless exists $depends{$func};
+ $seen = {%{$seen||{}}};
+ return () if $seen->{$func}++;
+ my %s;
+ grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}};
+}
+
+sub parse_version
+{
+ my $ver = shift;
+
+ if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
+ return ($1, $2, $3);
+ }
+ elsif ($ver !~ /^\d+\.[\d_]+$/) {
+ die "cannot parse version '$ver'\n";
+ }
+
+ $ver =~ s/_//g;
+ $ver =~ s/$/000000/;
+
+ my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+ $v = int $v;
+ $s = int $s;
+
+ if ($r < 5 || ($r == 5 && $v < 6)) {
+ if ($s % 10) {
+ die "cannot parse version '$ver'\n";
+ }
+ }
+
+ return ($r, $v, $s);
+}
+
+sub format_version
+{
+ my $ver = shift;
+
+ $ver =~ s/$/000000/;
+ my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+ $v = int $v;
+ $s = int $s;
+
+ if ($r < 5 || ($r == 5 && $v < 6)) {
+ if ($s % 10) {
+ die "invalid version '$ver'\n";
+ }
+ $s /= 10;
+
+ $ver = sprintf "%d.%03d", $r, $v;
+ $s > 0 and $ver .= sprintf "_%02d", $s;
+
+ return $ver;
+ }
+
+ return sprintf "%d.%d.%d", $r, $v, $s;
+}
+
+sub info
+{
+ $opt{quiet} and return;
+ print @_, "\n";
+}
+
+sub diag
+{
+ $opt{quiet} and return;
+ $opt{diag} and print @_, "\n";
+}
+
+sub warning
+{
+ $opt{quiet} and return;
+ print "*** ", @_, "\n";
+}
+
+sub error
+{
+ print "*** ERROR: ", @_, "\n";
+}
+
+my %given_hints;
+my %given_warnings;
+sub hint
+{
+ $opt{quiet} and return;
+ my $func = shift;
+ my $rv = 0;
+ if (exists $warnings{$func} && !$given_warnings{$func}++) {
+ my $warn = $warnings{$func};
+ $warn =~ s!^!*** !mg;
+ print "*** WARNING: $func\n", $warn;
+ $rv++;
+ }
+ if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) {
+ my $hint = $hints{$func};
+ $hint =~ s/^/ /mg;
+ print " --- hint for $func ---\n", $hint;
+ }
+ $rv;
+}
+
+sub usage
+{
+ my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms;
+ my %M = ( 'I' => '*' );
+ $usage =~ s/^\s*perl\s+\S+/$^X $0/;
+ $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g;
+
+ print <<ENDUSAGE;
+
+Usage: $usage
+
+See perldoc $0 for details.
+
+ENDUSAGE
+
+ exit 2;
+}
+
+sub strip
+{
+ my $self = do { local(@ARGV,$/)=($0); <> };
+ my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms;
+ $copy =~ s/^(?=\S+)/ /gms;
+ $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms;
+ $self =~ s/^SKIP.*(?=^__DATA__)/SKIP
+if (\@ARGV && \$ARGV[0] eq '--unstrip') {
+ eval { require Devel::PPPort };
+ \$@ and die "Cannot require Devel::PPPort, please install.\\n";
+ if (eval \$Devel::PPPort::VERSION < $VERSION) {
+ die "$0 was originally generated with Devel::PPPort $VERSION.\\n"
+ . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n"
+ . "Please install a newer version, or --unstrip will not work.\\n";
+ }
+ Devel::PPPort::WriteFile(\$0);
+ exit 0;
+}
+print <<END;
+
+Sorry, but this is a stripped version of \$0.
+
+To be able to use its original script and doc functionality,
+please try to regenerate this file using:
+
+ \$^X \$0 --unstrip
+
+END
+/ms;
+ my($pl, $c) = $self =~ /(.*^__DATA__)(.*)/ms;
+ $c =~ s{
+ / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
+ | ( "[^"\\]*(?:\\.[^"\\]*)*"
+ | '[^'\\]*(?:\\.[^'\\]*)*' )
+ | ($HS+) }{ defined $2 ? ' ' : ($1 || '') }gsex;
+ $c =~ s!\s+$!!mg;
+ $c =~ s!^$LF!!mg;
+ $c =~ s!^\s*#\s*!#!mg;
+ $c =~ s!^\s+!!mg;
+
+ open OUT, ">$0" or die "cannot strip $0: $!\n";
+ print OUT "$pl$c\n";
+
+ exit 0;
+}
+
+__DATA__
+*/
+
+#ifndef _P_P_PORTABILITY_H_
+#define _P_P_PORTABILITY_H_
+
+#ifndef DPPP_NAMESPACE
+# define DPPP_NAMESPACE DPPP_
+#endif
+
+#define DPPP_CAT2(x,y) CAT2(x,y)
+#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name)
+
+#ifndef PERL_REVISION
+# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
+# define PERL_PATCHLEVEL_H_IMPLICIT
+# include <patchlevel.h>
+# endif
+# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
+# include <could_not_find_Perl_patchlevel.h>
+# endif
+# ifndef PERL_REVISION
+# define PERL_REVISION (5)
+ /* Replace: 1 */
+# define PERL_VERSION PATCHLEVEL
+# define PERL_SUBVERSION SUBVERSION
+ /* Replace PERL_PATCHLEVEL with PERL_VERSION */
+ /* Replace: 0 */
+# endif
+#endif
+
+#define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10))
+#define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION))
+
+/* It is very unlikely that anyone will try to use this with Perl 6
+ (or greater), but who knows.
+ */
+#if PERL_REVISION != 5
+# error ppport.h only works with Perl version 5
+#endif /* PERL_REVISION != 5 */
+#ifndef dTHR
+# define dTHR dNOOP
+#endif
+#ifndef dTHX
+# define dTHX dNOOP
+#endif
+
+#ifndef dTHXa
+# define dTHXa(x) dNOOP
+#endif
+#ifndef pTHX
+# define pTHX void
+#endif
+
+#ifndef pTHX_
+# define pTHX_
+#endif
+
+#ifndef aTHX
+# define aTHX
+#endif
+
+#ifndef aTHX_
+# define aTHX_
+#endif
+
+#if (PERL_BCDVERSION < 0x5006000)
+# ifdef USE_THREADS
+# define aTHXR thr
+# define aTHXR_ thr,
+# else
+# define aTHXR
+# define aTHXR_
+# endif
+# define dTHXR dTHR
+#else
+# define aTHXR aTHX
+# define aTHXR_ aTHX_
+# define dTHXR dTHX
+#endif
+#ifndef dTHXoa
+# define dTHXoa(x) dTHXa(x)
+#endif
+
+#ifdef I_LIMITS
+# include <limits.h>
+#endif
+
+#ifndef PERL_UCHAR_MIN
+# define PERL_UCHAR_MIN ((unsigned char)0)
+#endif
+
+#ifndef PERL_UCHAR_MAX
+# ifdef UCHAR_MAX
+# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
+# else
+# ifdef MAXUCHAR
+# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
+# else
+# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
+# endif
+# endif
+#endif
+
+#ifndef PERL_USHORT_MIN
+# define PERL_USHORT_MIN ((unsigned short)0)
+#endif
+
+#ifndef PERL_USHORT_MAX
+# ifdef USHORT_MAX
+# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
+# else
+# ifdef MAXUSHORT
+# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
+# else
+# ifdef USHRT_MAX
+# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
+# else
+# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
+# endif
+# endif
+# endif
+#endif
+
+#ifndef PERL_SHORT_MAX
+# ifdef SHORT_MAX
+# define PERL_SHORT_MAX ((short)SHORT_MAX)
+# else
+# ifdef MAXSHORT /* Often used in <values.h> */
+# define PERL_SHORT_MAX ((short)MAXSHORT)
+# else
+# ifdef SHRT_MAX
+# define PERL_SHORT_MAX ((short)SHRT_MAX)
+# else
+# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
+# endif
+# endif
+# endif
+#endif
+
+#ifndef PERL_SHORT_MIN
+# ifdef SHORT_MIN
+# define PERL_SHORT_MIN ((short)SHORT_MIN)
+# else
+# ifdef MINSHORT
+# define PERL_SHORT_MIN ((short)MINSHORT)
+# else
+# ifdef SHRT_MIN
+# define PERL_SHORT_MIN ((short)SHRT_MIN)
+# else
+# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
+# endif
+# endif
+# endif
+#endif
+
+#ifndef PERL_UINT_MAX
+# ifdef UINT_MAX
+# define PERL_UINT_MAX ((unsigned int)UINT_MAX)
+# else
+# ifdef MAXUINT
+# define PERL_UINT_MAX ((unsigned int)MAXUINT)
+# else
+# define PERL_UINT_MAX (~(unsigned int)0)
+# endif
+# endif
+#endif
+
+#ifndef PERL_UINT_MIN
+# define PERL_UINT_MIN ((unsigned int)0)
+#endif
+
+#ifndef PERL_INT_MAX
+# ifdef INT_MAX
+# define PERL_INT_MAX ((int)INT_MAX)
+# else
+# ifdef MAXINT /* Often used in <values.h> */
+# define PERL_INT_MAX ((int)MAXINT)
+# else
+# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
+# endif
+# endif
+#endif
+
+#ifndef PERL_INT_MIN
+# ifdef INT_MIN
+# define PERL_INT_MIN ((int)INT_MIN)
+# else
+# ifdef MININT
+# define PERL_INT_MIN ((int)MININT)
+# else
+# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
+# endif
+# endif
+#endif
+
+#ifndef PERL_ULONG_MAX
+# ifdef ULONG_MAX
+# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
+# else
+# ifdef MAXULONG
+# define PERL_ULONG_MAX ((unsigned long)MAXULONG)
+# else
+# define PERL_ULONG_MAX (~(unsigned long)0)
+# endif
+# endif
+#endif
+
+#ifndef PERL_ULONG_MIN
+# define PERL_ULONG_MIN ((unsigned long)0L)
+#endif
+
+#ifndef PERL_LONG_MAX
+# ifdef LONG_MAX
+# define PERL_LONG_MAX ((long)LONG_MAX)
+# else
+# ifdef MAXLONG
+# define PERL_LONG_MAX ((long)MAXLONG)
+# else
+# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
+# endif
+# endif
+#endif
+
+#ifndef PERL_LONG_MIN
+# ifdef LONG_MIN
+# define PERL_LONG_MIN ((long)LONG_MIN)
+# else
+# ifdef MINLONG
+# define PERL_LONG_MIN ((long)MINLONG)
+# else
+# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
+# endif
+# endif
+#endif
+
+#if defined(HAS_QUAD) && (defined(convex) || defined(uts))
+# ifndef PERL_UQUAD_MAX
+# ifdef ULONGLONG_MAX
+# define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX)
+# else
+# ifdef MAXULONGLONG
+# define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG)
+# else
+# define PERL_UQUAD_MAX (~(unsigned long long)0)
+# endif
+# endif
+# endif
+
+# ifndef PERL_UQUAD_MIN
+# define PERL_UQUAD_MIN ((unsigned long long)0L)
+# endif
+
+# ifndef PERL_QUAD_MAX
+# ifdef LONGLONG_MAX
+# define PERL_QUAD_MAX ((long long)LONGLONG_MAX)
+# else
+# ifdef MAXLONGLONG
+# define PERL_QUAD_MAX ((long long)MAXLONGLONG)
+# else
+# define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1))
+# endif
+# endif
+# endif
+
+# ifndef PERL_QUAD_MIN
+# ifdef LONGLONG_MIN
+# define PERL_QUAD_MIN ((long long)LONGLONG_MIN)
+# else
+# ifdef MINLONGLONG
+# define PERL_QUAD_MIN ((long long)MINLONGLONG)
+# else
+# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
+# endif
+# endif
+# endif
+#endif
+
+/* This is based on code from 5.003 perl.h */
+#ifdef HAS_QUAD
+# ifdef cray
+#ifndef IVTYPE
+# define IVTYPE int
+#endif
+
+#ifndef IV_MIN
+# define IV_MIN PERL_INT_MIN
+#endif
+
+#ifndef IV_MAX
+# define IV_MAX PERL_INT_MAX
+#endif
+
+#ifndef UV_MIN
+# define UV_MIN PERL_UINT_MIN
+#endif
+
+#ifndef UV_MAX
+# define UV_MAX PERL_UINT_MAX
+#endif
+
+# ifdef INTSIZE
+#ifndef IVSIZE
+# define IVSIZE INTSIZE
+#endif
+
+# endif
+# else
+# if defined(convex) || defined(uts)
+#ifndef IVTYPE
+# define IVTYPE long long
+#endif
+
+#ifndef IV_MIN
+# define IV_MIN PERL_QUAD_MIN
+#endif
+
+#ifndef IV_MAX
+# define IV_MAX PERL_QUAD_MAX
+#endif
+
+#ifndef UV_MIN
+# define UV_MIN PERL_UQUAD_MIN
+#endif
+
+#ifndef UV_MAX
+# define UV_MAX PERL_UQUAD_MAX
+#endif
+
+# ifdef LONGLONGSIZE
+#ifndef IVSIZE
+# define IVSIZE LONGLONGSIZE
+#endif
+
+# endif
+# else
+#ifndef IVTYPE
+# define IVTYPE long
+#endif
+
+#ifndef IV_MIN
+# define IV_MIN PERL_LONG_MIN
+#endif
+
+#ifndef IV_MAX
+# define IV_MAX PERL_LONG_MAX
+#endif
+
+#ifndef UV_MIN
+# define UV_MIN PERL_ULONG_MIN
+#endif
+
+#ifndef UV_MAX
+# define UV_MAX PERL_ULONG_MAX
+#endif
+
+# ifdef LONGSIZE
+#ifndef IVSIZE
+# define IVSIZE LONGSIZE
+#endif
+
+# endif
+# endif
+# endif
+#ifndef IVSIZE
+# define IVSIZE 8
+#endif
+
+#ifndef PERL_QUAD_MIN
+# define PERL_QUAD_MIN IV_MIN
+#endif
+
+#ifndef PERL_QUAD_MAX
+# define PERL_QUAD_MAX IV_MAX
+#endif
+
+#ifndef PERL_UQUAD_MIN
+# define PERL_UQUAD_MIN UV_MIN
+#endif
+
+#ifndef PERL_UQUAD_MAX
+# define PERL_UQUAD_MAX UV_MAX
+#endif
+
+#else
+#ifndef IVTYPE
+# define IVTYPE long
+#endif
+
+#ifndef IV_MIN
+# define IV_MIN PERL_LONG_MIN
+#endif
+
+#ifndef IV_MAX
+# define IV_MAX PERL_LONG_MAX
+#endif
+
+#ifndef UV_MIN
+# define UV_MIN PERL_ULONG_MIN
+#endif
+
+#ifndef UV_MAX
+# define UV_MAX PERL_ULONG_MAX
+#endif
+
+#endif
+
+#ifndef IVSIZE
+# ifdef LONGSIZE
+# define IVSIZE LONGSIZE
+# else
+# define IVSIZE 4 /* A bold guess, but the best we can make. */
+# endif
+#endif
+#ifndef UVTYPE
+# define UVTYPE unsigned IVTYPE
+#endif
+
+#ifndef UVSIZE
+# define UVSIZE IVSIZE
+#endif
+#ifndef sv_setuv
+# define sv_setuv(sv, uv) \
+ STMT_START { \
+ UV TeMpUv = uv; \
+ if (TeMpUv <= IV_MAX) \
+ sv_setiv(sv, TeMpUv); \
+ else \
+ sv_setnv(sv, (double)TeMpUv); \
+ } STMT_END
+#endif
+#ifndef newSVuv
+# define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
+#endif
+#ifndef sv_2uv
+# define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
+#endif
+
+#ifndef SvUVX
+# define SvUVX(sv) ((UV)SvIVX(sv))
+#endif
+
+#ifndef SvUVXx
+# define SvUVXx(sv) SvUVX(sv)
+#endif
+
+#ifndef SvUV
+# define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
+#endif
+
+#ifndef SvUVx
+# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
+#endif
+
+/* Hint: sv_uv
+ * Always use the SvUVx() macro instead of sv_uv().
+ */
+#ifndef sv_uv
+# define sv_uv(sv) SvUVx(sv)
+#endif
+
+#if !defined(SvUOK) && defined(SvIOK_UV)
+# define SvUOK(sv) SvIOK_UV(sv)
+#endif
+#ifndef XST_mUV
+# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
+#endif
+
+#ifndef XSRETURN_UV
+# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END
+#endif
+#ifndef PUSHu
+# define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
+#endif
+
+#ifndef XPUSHu
+# define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
+#endif
+
+#ifdef HAS_MEMCMP
+#ifndef memNE
+# define memNE(s1,s2,l) (memcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+# define memEQ(s1,s2,l) (!memcmp(s1,s2,l))
+#endif
+
+#else
+#ifndef memNE
+# define memNE(s1,s2,l) (bcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+# define memEQ(s1,s2,l) (!bcmp(s1,s2,l))
+#endif
+
+#endif
+#ifndef MoveD
+# define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifndef CopyD
+# define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifdef HAS_MEMSET
+#ifndef ZeroD
+# define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t))
+#endif
+
+#else
+#ifndef ZeroD
+# define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d)
+#endif
+
+#endif
+#ifndef PoisonWith
+# define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t))
+#endif
+
+#ifndef PoisonNew
+# define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB)
+#endif
+
+#ifndef PoisonFree
+# define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF)
+#endif
+
+#ifndef Poison
+# define Poison(d,n,t) PoisonFree(d,n,t)
+#endif
+#ifndef Newx
+# define Newx(v,n,t) New(0,v,n,t)
+#endif
+
+#ifndef Newxc
+# define Newxc(v,n,t,c) Newc(0,v,n,t,c)
+#endif
+
+#ifndef Newxz
+# define Newxz(v,n,t) Newz(0,v,n,t)
+#endif
+
+#ifndef PERL_UNUSED_DECL
+# ifdef HASATTRIBUTE
+# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
+# define PERL_UNUSED_DECL
+# else
+# define PERL_UNUSED_DECL __attribute__((unused))
+# endif
+# else
+# define PERL_UNUSED_DECL
+# endif
+#endif
+
+#ifndef PERL_UNUSED_ARG
+# if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
+# include <note.h>
+# define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
+# else
+# define PERL_UNUSED_ARG(x) ((void)x)
+# endif
+#endif
+
+#ifndef PERL_UNUSED_VAR
+# define PERL_UNUSED_VAR(x) ((void)x)
+#endif
+
+#ifndef PERL_UNUSED_CONTEXT
+# ifdef USE_ITHREADS
+# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
+# else
+# define PERL_UNUSED_CONTEXT
+# endif
+#endif
+#ifndef NOOP
+# define NOOP /*EMPTY*/(void)0
+#endif
+
+#ifndef dNOOP
+# define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
+#endif
+
+#ifndef NVTYPE
+# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+# define NVTYPE long double
+# else
+# define NVTYPE double
+# endif
+typedef NVTYPE NV;
+#endif
+
+#ifndef INT2PTR
+# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
+# define PTRV UV
+# define INT2PTR(any,d) (any)(d)
+# else
+# if PTRSIZE == LONGSIZE
+# define PTRV unsigned long
+# else
+# define PTRV unsigned
+# endif
+# define INT2PTR(any,d) (any)(PTRV)(d)
+# endif
+#endif
+
+#ifndef PTR2ul
+# if PTRSIZE == LONGSIZE
+# define PTR2ul(p) (unsigned long)(p)
+# else
+# define PTR2ul(p) INT2PTR(unsigned long,p)
+# endif
+#endif
+#ifndef PTR2nat
+# define PTR2nat(p) (PTRV)(p)
+#endif
+
+#ifndef NUM2PTR
+# define NUM2PTR(any,d) (any)PTR2nat(d)
+#endif
+
+#ifndef PTR2IV
+# define PTR2IV(p) INT2PTR(IV,p)
+#endif
+
+#ifndef PTR2UV
+# define PTR2UV(p) INT2PTR(UV,p)
+#endif
+
+#ifndef PTR2NV
+# define PTR2NV(p) NUM2PTR(NV,p)
+#endif
+
+#undef START_EXTERN_C
+#undef END_EXTERN_C
+#undef EXTERN_C
+#ifdef __cplusplus
+# define START_EXTERN_C extern "C" {
+# define END_EXTERN_C }
+# define EXTERN_C extern "C"
+#else
+# define START_EXTERN_C
+# define END_EXTERN_C
+# define EXTERN_C extern
+#endif
+
+#if defined(PERL_GCC_PEDANTIC)
+# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
+# define PERL_GCC_BRACE_GROUPS_FORBIDDEN
+# endif
+#endif
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
+# ifndef PERL_USE_GCC_BRACE_GROUPS
+# define PERL_USE_GCC_BRACE_GROUPS
+# endif
+#endif
+
+#undef STMT_START
+#undef STMT_END
+#ifdef PERL_USE_GCC_BRACE_GROUPS
+# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */
+# define STMT_END )
+#else
+# if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
+# define STMT_START if (1)
+# define STMT_END else (void)0
+# else
+# define STMT_START do
+# define STMT_END while (0)
+# endif
+#endif
+#ifndef boolSV
+# define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
+#endif
+
+/* DEFSV appears first in 5.004_56 */
+#ifndef DEFSV
+# define DEFSV GvSV(PL_defgv)
+#endif
+
+#ifndef SAVE_DEFSV
+# define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
+#endif
+
+#ifndef DEFSV_set
+# define DEFSV_set(sv) (DEFSV = (sv))
+#endif
+
+/* Older perls (<=5.003) lack AvFILLp */
+#ifndef AvFILLp
+# define AvFILLp AvFILL
+#endif
+#ifndef ERRSV
+# define ERRSV get_sv("@",FALSE)
+#endif
+
+/* Hint: gv_stashpvn
+ * This function's backport doesn't support the length parameter, but
+ * rather ignores it. Portability can only be ensured if the length
+ * parameter is used for speed reasons, but the length can always be
+ * correctly computed from the string argument.
+ */
+#ifndef gv_stashpvn
+# define gv_stashpvn(str,len,create) gv_stashpv(str,create)
+#endif
+
+/* Replace: 1 */
+#ifndef get_cv
+# define get_cv perl_get_cv
+#endif
+
+#ifndef get_sv
+# define get_sv perl_get_sv
+#endif
+
+#ifndef get_av
+# define get_av perl_get_av
+#endif
+
+#ifndef get_hv
+# define get_hv perl_get_hv
+#endif
+
+/* Replace: 0 */
+#ifndef dUNDERBAR
+# define dUNDERBAR dNOOP
+#endif
+
+#ifndef UNDERBAR
+# define UNDERBAR DEFSV
+#endif
+#ifndef dAX
+# define dAX I32 ax = MARK - PL_stack_base + 1
+#endif
+
+#ifndef dITEMS
+# define dITEMS I32 items = SP - MARK
+#endif
+#ifndef dXSTARG
+# define dXSTARG SV * targ = sv_newmortal()
+#endif
+#ifndef dAXMARK
+# define dAXMARK I32 ax = POPMARK; \
+ register SV ** const mark = PL_stack_base + ax++
+#endif
+#ifndef XSprePUSH
+# define XSprePUSH (sp = PL_stack_base + ax - 1)
+#endif
+
+#if (PERL_BCDVERSION < 0x5005000)
+# undef XSRETURN
+# define XSRETURN(off) \
+ STMT_START { \
+ PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
+ return; \
+ } STMT_END
+#endif
+#ifndef XSPROTO
+# define XSPROTO(name) void name(pTHX_ CV* cv)
+#endif
+
+#ifndef SVfARG
+# define SVfARG(p) ((void*)(p))
+#endif
+#ifndef PERL_ABS
+# define PERL_ABS(x) ((x) < 0 ? -(x) : (x))
+#endif
+#ifndef dVAR
+# define dVAR dNOOP
+#endif
+#ifndef SVf
+# define SVf "_"
+#endif
+#ifndef UTF8_MAXBYTES
+# define UTF8_MAXBYTES UTF8_MAXLEN
+#endif
+#ifndef CPERLscope
+# define CPERLscope(x) x
+#endif
+#ifndef PERL_HASH
+# define PERL_HASH(hash,str,len) \
+ STMT_START { \
+ const char *s_PeRlHaSh = str; \
+ I32 i_PeRlHaSh = len; \
+ U32 hash_PeRlHaSh = 0; \
+ while (i_PeRlHaSh--) \
+ hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
+ (hash) = hash_PeRlHaSh; \
+ } STMT_END
+#endif
+
+#ifndef PERLIO_FUNCS_DECL
+# ifdef PERLIO_FUNCS_CONST
+# define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs
+# define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs)
+# else
+# define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs
+# define PERLIO_FUNCS_CAST(funcs) (funcs)
+# endif
+#endif
+
+/* provide these typedefs for older perls */
+#if (PERL_BCDVERSION < 0x5009003)
+
+# ifdef ARGSproto
+typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto);
+# else
+typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX);
+# endif
+
+typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
+
+#endif
+#ifndef isPSXSPC
+# define isPSXSPC(c) (isSPACE(c) || (c) == '\v')
+#endif
+
+#ifndef isBLANK
+# define isBLANK(c) ((c) == ' ' || (c) == '\t')
+#endif
+
+#ifdef EBCDIC
+#ifndef isALNUMC
+# define isALNUMC(c) isalnum(c)
+#endif
+
+#ifndef isASCII
+# define isASCII(c) isascii(c)
+#endif
+
+#ifndef isCNTRL
+# define isCNTRL(c) iscntrl(c)
+#endif
+
+#ifndef isGRAPH
+# define isGRAPH(c) isgraph(c)
+#endif
+
+#ifndef isPRINT
+# define isPRINT(c) isprint(c)
+#endif
+
+#ifndef isPUNCT
+# define isPUNCT(c) ispunct(c)
+#endif
+
+#ifndef isXDIGIT
+# define isXDIGIT(c) isxdigit(c)
+#endif
+
+#else
+# if (PERL_BCDVERSION < 0x5010000)
+/* Hint: isPRINT
+ * The implementation in older perl versions includes all of the
+ * isSPACE() characters, which is wrong. The version provided by
+ * Devel::PPPort always overrides a present buggy version.
+ */
+# undef isPRINT
+# endif
+#ifndef isALNUMC
+# define isALNUMC(c) (isALPHA(c) || isDIGIT(c))
+#endif
+
+#ifndef isASCII
+# define isASCII(c) ((c) <= 127)
+#endif
+
+#ifndef isCNTRL
+# define isCNTRL(c) ((c) < ' ' || (c) == 127)
+#endif
+
+#ifndef isGRAPH
+# define isGRAPH(c) (isALNUM(c) || isPUNCT(c))
+#endif
+
+#ifndef isPRINT
+# define isPRINT(c) (((c) >= 32 && (c) < 127))
+#endif
+
+#ifndef isPUNCT
+# define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126))
+#endif
+
+#ifndef isXDIGIT
+# define isXDIGIT(c) (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+#endif
+
+#endif
+
+#ifndef PERL_SIGNALS_UNSAFE_FLAG
+
+#define PERL_SIGNALS_UNSAFE_FLAG 0x0001
+
+#if (PERL_BCDVERSION < 0x5008000)
+# define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG
+#else
+# define D_PPP_PERL_SIGNALS_INIT 0
+#endif
+
+#if defined(NEED_PL_signals)
+static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
+#elif defined(NEED_PL_signals_GLOBAL)
+U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
+#else
+extern U32 DPPP_(my_PL_signals);
+#endif
+#define PL_signals DPPP_(my_PL_signals)
+
+#endif
+
+/* Hint: PL_ppaddr
+ * Calling an op via PL_ppaddr requires passing a context argument
+ * for threaded builds. Since the context argument is different for
+ * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will
+ * automatically be defined as the correct argument.
+ */
+
+#if (PERL_BCDVERSION <= 0x5005005)
+/* Replace: 1 */
+# define PL_ppaddr ppaddr
+# define PL_no_modify no_modify
+/* Replace: 0 */
+#endif
+
+#if (PERL_BCDVERSION <= 0x5004005)
+/* Replace: 1 */
+# define PL_DBsignal DBsignal
+# define PL_DBsingle DBsingle
+# define PL_DBsub DBsub
+# define PL_DBtrace DBtrace
+# define PL_Sv Sv
+# define PL_bufend bufend
+# define PL_bufptr bufptr
+# define PL_compiling compiling
+# define PL_copline copline
+# define PL_curcop curcop
+# define PL_curstash curstash
+# define PL_debstash debstash
+# define PL_defgv defgv
+# define PL_diehook diehook
+# define PL_dirty dirty
+# define PL_dowarn dowarn
+# define PL_errgv errgv
+# define PL_error_count error_count
+# define PL_expect expect
+# define PL_hexdigit hexdigit
+# define PL_hints hints
+# define PL_in_my in_my
+# define PL_laststatval laststatval
+# define PL_lex_state lex_state
+# define PL_lex_stuff lex_stuff
+# define PL_linestr linestr
+# define PL_na na
+# define PL_perl_destruct_level perl_destruct_level
+# define PL_perldb perldb
+# define PL_rsfp_filters rsfp_filters
+# define PL_rsfp rsfp
+# define PL_stack_base stack_base
+# define PL_stack_sp stack_sp
+# define PL_statcache statcache
+# define PL_stdingv stdingv
+# define PL_sv_arenaroot sv_arenaroot
+# define PL_sv_no sv_no
+# define PL_sv_undef sv_undef
+# define PL_sv_yes sv_yes
+# define PL_tainted tainted
+# define PL_tainting tainting
+# define PL_tokenbuf tokenbuf
+/* Replace: 0 */
+#endif
+
+/* Warning: PL_parser
+ * For perl versions earlier than 5.9.5, this is an always
+ * non-NULL dummy. Also, it cannot be dereferenced. Don't
+ * use it if you can avoid is and unless you absolutely know
+ * what you're doing.
+ * If you always check that PL_parser is non-NULL, you can
+ * define DPPP_PL_parser_NO_DUMMY to avoid the creation of
+ * a dummy parser structure.
+ */
+
+#if (PERL_BCDVERSION >= 0x5009005)
+# ifdef DPPP_PL_parser_NO_DUMMY
+# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
+ (croak("panic: PL_parser == NULL in %s:%d", \
+ __FILE__, __LINE__), (yy_parser *) NULL))->var)
+# else
+# ifdef DPPP_PL_parser_NO_DUMMY_WARNING
+# define D_PPP_parser_dummy_warning(var)
+# else
+# define D_PPP_parser_dummy_warning(var) \
+ warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__),
+# endif
+# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
+ (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var)
+#if defined(NEED_PL_parser)
+static yy_parser DPPP_(dummy_PL_parser);
+#elif defined(NEED_PL_parser_GLOBAL)
+yy_parser DPPP_(dummy_PL_parser);
+#else
+extern yy_parser DPPP_(dummy_PL_parser);
+#endif
+
+# endif
+
+/* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */
+/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf
+ * Do not use this variable unless you know exactly what you're
+ * doint. It is internal to the perl parser and may change or even
+ * be removed in the future. As of perl 5.9.5, you have to check
+ * for (PL_parser != NULL) for this variable to have any effect.
+ * An always non-NULL PL_parser dummy is provided for earlier
+ * perl versions.
+ * If PL_parser is NULL when you try to access this variable, a
+ * dummy is being accessed instead and a warning is issued unless
+ * you define DPPP_PL_parser_NO_DUMMY_WARNING.
+ * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access
+ * this variable will croak with a panic message.
+ */
+
+# define PL_expect D_PPP_my_PL_parser_var(expect)
+# define PL_copline D_PPP_my_PL_parser_var(copline)
+# define PL_rsfp D_PPP_my_PL_parser_var(rsfp)
+# define PL_rsfp_filters D_PPP_my_PL_parser_var(rsfp_filters)
+# define PL_linestr D_PPP_my_PL_parser_var(linestr)
+# define PL_bufptr D_PPP_my_PL_parser_var(bufptr)
+# define PL_bufend D_PPP_my_PL_parser_var(bufend)
+# define PL_lex_state D_PPP_my_PL_parser_var(lex_state)
+# define PL_lex_stuff D_PPP_my_PL_parser_var(lex_stuff)
+# define PL_tokenbuf D_PPP_my_PL_parser_var(tokenbuf)
+# define PL_in_my D_PPP_my_PL_parser_var(in_my)
+# define PL_in_my_stash D_PPP_my_PL_parser_var(in_my_stash)
+# define PL_error_count D_PPP_my_PL_parser_var(error_count)
+
+
+#else
+
+/* ensure that PL_parser != NULL and cannot be dereferenced */
+# define PL_parser ((void *) 1)
+
+#endif
+#ifndef mPUSHs
+# define mPUSHs(s) PUSHs(sv_2mortal(s))
+#endif
+
+#ifndef PUSHmortal
+# define PUSHmortal PUSHs(sv_newmortal())
+#endif
+
+#ifndef mPUSHp
+# define mPUSHp(p,l) sv_setpvn(PUSHmortal, (p), (l))
+#endif
+
+#ifndef mPUSHn
+# define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n))
+#endif
+
+#ifndef mPUSHi
+# define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i))
+#endif
+
+#ifndef mPUSHu
+# define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u))
+#endif
+#ifndef mXPUSHs
+# define mXPUSHs(s) XPUSHs(sv_2mortal(s))
+#endif
+
+#ifndef XPUSHmortal
+# define XPUSHmortal XPUSHs(sv_newmortal())
+#endif
+
+#ifndef mXPUSHp
+# define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END
+#endif
+
+#ifndef mXPUSHn
+# define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END
+#endif
+
+#ifndef mXPUSHi
+# define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END
+#endif
+
+#ifndef mXPUSHu
+# define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END
+#endif
+
+/* Replace: 1 */
+#ifndef call_sv
+# define call_sv perl_call_sv
+#endif
+
+#ifndef call_pv
+# define call_pv perl_call_pv
+#endif
+
+#ifndef call_argv
+# define call_argv perl_call_argv
+#endif
+
+#ifndef call_method
+# define call_method perl_call_method
+#endif
+#ifndef eval_sv
+# define eval_sv perl_eval_sv
+#endif
+
+/* Replace: 0 */
+#ifndef PERL_LOADMOD_DENY
+# define PERL_LOADMOD_DENY 0x1
+#endif
+
+#ifndef PERL_LOADMOD_NOIMPORT
+# define PERL_LOADMOD_NOIMPORT 0x2
+#endif
+
+#ifndef PERL_LOADMOD_IMPORT_OPS
+# define PERL_LOADMOD_IMPORT_OPS 0x4
+#endif
+
+#ifndef G_METHOD
+# define G_METHOD 64
+# ifdef call_sv
+# undef call_sv
+# endif
+# if (PERL_BCDVERSION < 0x5006000)
+# define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \
+ (flags) & ~G_METHOD) : perl_call_sv(sv, flags))
+# else
+# define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \
+ (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags))
+# endif
+#endif
+
+/* Replace perl_eval_pv with eval_pv */
+
+#ifndef eval_pv
+#if defined(NEED_eval_pv)
+static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+static
+#else
+extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+#endif
+
+#ifdef eval_pv
+# undef eval_pv
+#endif
+#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b)
+#define Perl_eval_pv DPPP_(my_eval_pv)
+
+#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL)
+
+SV*
+DPPP_(my_eval_pv)(char *p, I32 croak_on_error)
+{
+ dSP;
+ SV* sv = newSVpv(p, 0);
+
+ PUSHMARK(sp);
+ eval_sv(sv, G_SCALAR);
+ SvREFCNT_dec(sv);
+
+ SPAGAIN;
+ sv = POPs;
+ PUTBACK;
+
+ if (croak_on_error && SvTRUE(GvSV(errgv)))
+ croak(SvPVx(GvSV(errgv), na));
+
+ return sv;
+}
+
+#endif
+#endif
+
+#ifndef vload_module
+#if defined(NEED_vload_module)
+static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
+static
+#else
+extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
+#endif
+
+#ifdef vload_module
+# undef vload_module
+#endif
+#define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d)
+#define Perl_vload_module DPPP_(my_vload_module)
+
+#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL)
+
+void
+DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args)
+{
+ dTHR;
+ dVAR;
+ OP *veop, *imop;
+
+ OP * const modname = newSVOP(OP_CONST, 0, name);
+ /* 5.005 has a somewhat hacky force_normal that doesn't croak on
+ SvREADONLY() if PL_compling is true. Current perls take care in
+ ck_require() to correctly turn off SvREADONLY before calling
+ force_normal_flags(). This seems a better fix than fudging PL_compling
+ */
+ SvREADONLY_off(((SVOP*)modname)->op_sv);
+ modname->op_private |= OPpCONST_BARE;
+ if (ver) {
+ veop = newSVOP(OP_CONST, 0, ver);
+ }
+ else
+ veop = NULL;
+ if (flags & PERL_LOADMOD_NOIMPORT) {
+ imop = sawparens(newNULLLIST());
+ }
+ else if (flags & PERL_LOADMOD_IMPORT_OPS) {
+ imop = va_arg(*args, OP*);
+ }
+ else {
+ SV *sv;
+ imop = NULL;
+ sv = va_arg(*args, SV*);
+ while (sv) {
+ imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
+ sv = va_arg(*args, SV*);
+ }
+ }
+ {
+ const line_t ocopline = PL_copline;
+ COP * const ocurcop = PL_curcop;
+ const int oexpect = PL_expect;
+
+#if (PERL_BCDVERSION >= 0x5004000)
+ utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
+ veop, modname, imop);
+#else
+ utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
+ modname, imop);
+#endif
+ PL_expect = oexpect;
+ PL_copline = ocopline;
+ PL_curcop = ocurcop;
+ }
+}
+
+#endif
+#endif
+
+#ifndef load_module
+#if defined(NEED_load_module)
+static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
+static
+#else
+extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
+#endif
+
+#ifdef load_module
+# undef load_module
+#endif
+#define load_module DPPP_(my_load_module)
+#define Perl_load_module DPPP_(my_load_module)
+
+#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL)
+
+void
+DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...)
+{
+ va_list args;
+ va_start(args, ver);
+ vload_module(flags, name, ver, &args);
+ va_end(args);
+}
+
+#endif
+#endif
+#ifndef newRV_inc
+# define newRV_inc(sv) newRV(sv) /* Replace */
+#endif
+
+#ifndef newRV_noinc
+#if defined(NEED_newRV_noinc)
+static SV * DPPP_(my_newRV_noinc)(SV *sv);
+static
+#else
+extern SV * DPPP_(my_newRV_noinc)(SV *sv);
+#endif
+
+#ifdef newRV_noinc
+# undef newRV_noinc
+#endif
+#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a)
+#define Perl_newRV_noinc DPPP_(my_newRV_noinc)
+
+#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL)
+SV *
+DPPP_(my_newRV_noinc)(SV *sv)
+{
+ SV *rv = (SV *)newRV(sv);
+ SvREFCNT_dec(sv);
+ return rv;
+}
+#endif
+#endif
+
+/* Hint: newCONSTSUB
+ * Returns a CV* as of perl-5.7.1. This return value is not supported
+ * by Devel::PPPort.
+ */
+
+/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
+#if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005)
+#if defined(NEED_newCONSTSUB)
+static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
+static
+#else
+extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
+#endif
+
+#ifdef newCONSTSUB
+# undef newCONSTSUB
+#endif
+#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c)
+#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB)
+
+#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
+
+/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */
+/* (There's no PL_parser in perl < 5.005, so this is completely safe) */
+#define D_PPP_PL_copline PL_copline
+
+void
+DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv)
+{
+ U32 oldhints = PL_hints;
+ HV *old_cop_stash = PL_curcop->cop_stash;
+ HV *old_curstash = PL_curstash;
+ line_t oldline = PL_curcop->cop_line;
+ PL_curcop->cop_line = D_PPP_PL_copline;
+
+ PL_hints &= ~HINT_BLOCK_SCOPE;
+ if (stash)
+ PL_curstash = PL_curcop->cop_stash = stash;
+
+ newSUB(
+
+#if (PERL_BCDVERSION < 0x5003022)
+ start_subparse(),
+#elif (PERL_BCDVERSION == 0x5003022)
+ start_subparse(0),
+#else /* 5.003_23 onwards */
+ start_subparse(FALSE, 0),
+#endif
+
+ newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)),
+ newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */
+ newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
+ );
+
+ PL_hints = oldhints;
+ PL_curcop->cop_stash = old_cop_stash;
+ PL_curstash = old_curstash;
+ PL_curcop->cop_line = oldline;
+}
+#endif
+#endif
+
+/*
+ * Boilerplate macros for initializing and accessing interpreter-local
+ * data from C. All statics in extensions should be reworked to use
+ * this, if you want to make the extension thread-safe. See ext/re/re.xs
+ * for an example of the use of these macros.
+ *
+ * Code that uses these macros is responsible for the following:
+ * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
+ * 2. Declare a typedef named my_cxt_t that is a structure that contains
+ * all the data that needs to be interpreter-local.
+ * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
+ * 4. Use the MY_CXT_INIT macro such that it is called exactly once
+ * (typically put in the BOOT: section).
+ * 5. Use the members of the my_cxt_t structure everywhere as
+ * MY_CXT.member.
+ * 6. Use the dMY_CXT macro (a declaration) in all the functions that
+ * access MY_CXT.
+ */
+
+#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
+ defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT)
+
+#ifndef START_MY_CXT
+
+/* This must appear in all extensions that define a my_cxt_t structure,
+ * right after the definition (i.e. at file scope). The non-threads
+ * case below uses it to declare the data as static. */
+#define START_MY_CXT
+
+#if (PERL_BCDVERSION < 0x5004068)
+/* Fetches the SV that keeps the per-interpreter data. */
+#define dMY_CXT_SV \
+ SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
+#else /* >= perl5.004_68 */
+#define dMY_CXT_SV \
+ SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \
+ sizeof(MY_CXT_KEY)-1, TRUE)
+#endif /* < perl5.004_68 */
+
+/* This declaration should be used within all functions that use the
+ * interpreter-local data. */
+#define dMY_CXT \
+ dMY_CXT_SV; \
+ my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
+
+/* Creates and zeroes the per-interpreter data.
+ * (We allocate my_cxtp in a Perl SV so that it will be released when
+ * the interpreter goes away.) */
+#define MY_CXT_INIT \
+ dMY_CXT_SV; \
+ /* newSV() allocates one more than needed */ \
+ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+ Zero(my_cxtp, 1, my_cxt_t); \
+ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+
+/* This macro must be used to access members of the my_cxt_t structure.
+ * e.g. MYCXT.some_data */
+#define MY_CXT (*my_cxtp)
+
+/* Judicious use of these macros can reduce the number of times dMY_CXT
+ * is used. Use is similar to pTHX, aTHX etc. */
+#define pMY_CXT my_cxt_t *my_cxtp
+#define pMY_CXT_ pMY_CXT,
+#define _pMY_CXT ,pMY_CXT
+#define aMY_CXT my_cxtp
+#define aMY_CXT_ aMY_CXT,
+#define _aMY_CXT ,aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+/* Clones the per-interpreter data. */
+#define MY_CXT_CLONE \
+ dMY_CXT_SV; \
+ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+ Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
+ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+#endif
+
+#else /* single interpreter */
+
+#ifndef START_MY_CXT
+
+#define START_MY_CXT static my_cxt_t my_cxt;
+#define dMY_CXT_SV dNOOP
+#define dMY_CXT dNOOP
+#define MY_CXT_INIT NOOP
+#define MY_CXT my_cxt
+
+#define pMY_CXT void
+#define pMY_CXT_
+#define _pMY_CXT
+#define aMY_CXT
+#define aMY_CXT_
+#define _aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+#define MY_CXT_CLONE NOOP
+#endif
+
+#endif
+
+#ifndef IVdf
+# if IVSIZE == LONGSIZE
+# define IVdf "ld"
+# define UVuf "lu"
+# define UVof "lo"
+# define UVxf "lx"
+# define UVXf "lX"
+# else
+# if IVSIZE == INTSIZE
+# define IVdf "d"
+# define UVuf "u"
+# define UVof "o"
+# define UVxf "x"
+# define UVXf "X"
+# endif
+# endif
+#endif
+
+#ifndef NVef
+# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
+ defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000)
+ /* Not very likely, but let's try anyway. */
+# define NVef PERL_PRIeldbl
+# define NVff PERL_PRIfldbl
+# define NVgf PERL_PRIgldbl
+# else
+# define NVef "e"
+# define NVff "f"
+# define NVgf "g"
+# endif
+#endif
+
+#ifndef SvREFCNT_inc
+# ifdef PERL_USE_GCC_BRACE_GROUPS
+# define SvREFCNT_inc(sv) \
+ ({ \
+ SV * const _sv = (SV*)(sv); \
+ if (_sv) \
+ (SvREFCNT(_sv))++; \
+ _sv; \
+ })
+# else
+# define SvREFCNT_inc(sv) \
+ ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
+# endif
+#endif
+
+#ifndef SvREFCNT_inc_simple
+# ifdef PERL_USE_GCC_BRACE_GROUPS
+# define SvREFCNT_inc_simple(sv) \
+ ({ \
+ if (sv) \
+ (SvREFCNT(sv))++; \
+ (SV *)(sv); \
+ })
+# else
+# define SvREFCNT_inc_simple(sv) \
+ ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL)
+# endif
+#endif
+
+#ifndef SvREFCNT_inc_NN
+# ifdef PERL_USE_GCC_BRACE_GROUPS
+# define SvREFCNT_inc_NN(sv) \
+ ({ \
+ SV * const _sv = (SV*)(sv); \
+ SvREFCNT(_sv)++; \
+ _sv; \
+ })
+# else
+# define SvREFCNT_inc_NN(sv) \
+ (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv)
+# endif
+#endif
+
+#ifndef SvREFCNT_inc_void
+# ifdef PERL_USE_GCC_BRACE_GROUPS
+# define SvREFCNT_inc_void(sv) \
+ ({ \
+ SV * const _sv = (SV*)(sv); \
+ if (_sv) \
+ (void)(SvREFCNT(_sv)++); \
+ })
+# else
+# define SvREFCNT_inc_void(sv) \
+ (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
+# endif
+#endif
+#ifndef SvREFCNT_inc_simple_void
+# define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END
+#endif
+
+#ifndef SvREFCNT_inc_simple_NN
+# define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv))
+#endif
+
+#ifndef SvREFCNT_inc_void_NN
+# define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
+#endif
+
+#ifndef SvREFCNT_inc_simple_void_NN
+# define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
+#endif
+
+#ifndef newSV_type
+
+#if defined(NEED_newSV_type)
+static SV* DPPP_(my_newSV_type)(pTHX_ svtype const t);
+static
+#else
+extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t);
+#endif
+
+#ifdef newSV_type
+# undef newSV_type
+#endif
+#define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a)
+#define Perl_newSV_type DPPP_(my_newSV_type)
+
+#if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL)
+
+SV*
+DPPP_(my_newSV_type)(pTHX_ svtype const t)
+{
+ SV* const sv = newSV(0);
+ sv_upgrade(sv, t);
+ return sv;
+}
+
+#endif
+
+#endif
+
+#if (PERL_BCDVERSION < 0x5006000)
+# define D_PPP_CONSTPV_ARG(x) ((char *) (x))
+#else
+# define D_PPP_CONSTPV_ARG(x) (x)
+#endif
+#ifndef newSVpvn
+# define newSVpvn(data,len) ((data) \
+ ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
+ : newSV(0))
+#endif
+#ifndef newSVpvn_utf8
+# define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
+#endif
+#ifndef SVf_UTF8
+# define SVf_UTF8 0
+#endif
+
+#ifndef newSVpvn_flags
+
+#if defined(NEED_newSVpvn_flags)
+static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags);
+static
+#else
+extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags);
+#endif
+
+#ifdef newSVpvn_flags
+# undef newSVpvn_flags
+#endif
+#define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c)
+#define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags)
+
+#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL)
+
+SV *
+DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags)
+{
+ SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len);
+ SvFLAGS(sv) |= (flags & SVf_UTF8);
+ return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
+}
+
+#endif
+
+#endif
+
+/* Backwards compatibility stuff... :-( */
+#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen)
+# define NEED_sv_2pv_flags
+#endif
+#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL)
+# define NEED_sv_2pv_flags_GLOBAL
+#endif
+
+/* Hint: sv_2pv_nolen
+ * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen().
+ */
+#ifndef sv_2pv_nolen
+# define sv_2pv_nolen(sv) SvPV_nolen(sv)
+#endif
+
+#ifdef SvPVbyte
+
+/* Hint: SvPVbyte
+ * Does not work in perl-5.6.1, ppport.h implements a version
+ * borrowed from perl-5.7.3.
+ */
+
+#if (PERL_BCDVERSION < 0x5007000)
+
+#if defined(NEED_sv_2pvbyte)
+static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp);
+static
+#else
+extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp);
+#endif
+
+#ifdef sv_2pvbyte
+# undef sv_2pvbyte
+#endif
+#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b)
+#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte)
+
+#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL)
+
+char *
+DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp)
+{
+ sv_utf8_downgrade(sv,0);
+ return SvPV(sv,*lp);
+}
+
+#endif
+
+/* Hint: sv_2pvbyte
+ * Use the SvPVbyte() macro instead of sv_2pvbyte().
+ */
+
+#undef SvPVbyte
+
+#define SvPVbyte(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
+
+#endif
+
+#else
+
+# define SvPVbyte SvPV
+# define sv_2pvbyte sv_2pv
+
+#endif
+#ifndef sv_2pvbyte_nolen
+# define sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv)
+#endif
+
+/* Hint: sv_pvn
+ * Always use the SvPV() macro instead of sv_pvn().
+ */
+
+/* Hint: sv_pvn_force
+ * Always use the SvPV_force() macro instead of sv_pvn_force().
+ */
+
+/* If these are undefined, they're not handled by the core anyway */
+#ifndef SV_IMMEDIATE_UNREF
+# define SV_IMMEDIATE_UNREF 0
+#endif
+
+#ifndef SV_GMAGIC
+# define SV_GMAGIC 0
+#endif
+
+#ifndef SV_COW_DROP_PV
+# define SV_COW_DROP_PV 0
+#endif
+
+#ifndef SV_UTF8_NO_ENCODING
+# define SV_UTF8_NO_ENCODING 0
+#endif
+
+#ifndef SV_NOSTEAL
+# define SV_NOSTEAL 0
+#endif
+
+#ifndef SV_CONST_RETURN
+# define SV_CONST_RETURN 0
+#endif
+
+#ifndef SV_MUTABLE_RETURN
+# define SV_MUTABLE_RETURN 0
+#endif
+
+#ifndef SV_SMAGIC
+# define SV_SMAGIC 0
+#endif
+
+#ifndef SV_HAS_TRAILING_NUL
+# define SV_HAS_TRAILING_NUL 0
+#endif
+
+#ifndef SV_COW_SHARED_HASH_KEYS
+# define SV_COW_SHARED_HASH_KEYS 0
+#endif
+
+#if (PERL_BCDVERSION < 0x5007002)
+
+#if defined(NEED_sv_2pv_flags)
+static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+static
+#else
+extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+#endif
+
+#ifdef sv_2pv_flags
+# undef sv_2pv_flags
+#endif
+#define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c)
+#define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags)
+
+#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL)
+
+char *
+DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags)
+{
+ STRLEN n_a = (STRLEN) flags;
+ return sv_2pv(sv, lp ? lp : &n_a);
+}
+
+#endif
+
+#if defined(NEED_sv_pvn_force_flags)
+static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+static
+#else
+extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+#endif
+
+#ifdef sv_pvn_force_flags
+# undef sv_pvn_force_flags
+#endif
+#define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c)
+#define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags)
+
+#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL)
+
+char *
+DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags)
+{
+ STRLEN n_a = (STRLEN) flags;
+ return sv_pvn_force(sv, lp ? lp : &n_a);
+}
+
+#endif
+
+#endif
+
+#if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) )
+# define DPPP_SVPV_NOLEN_LP_ARG &PL_na
+#else
+# define DPPP_SVPV_NOLEN_LP_ARG 0
+#endif
+#ifndef SvPV_const
+# define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_mutable
+# define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC)
+#endif
+#ifndef SvPV_flags
+# define SvPV_flags(sv, lp, flags) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags))
+#endif
+#ifndef SvPV_flags_const
+# define SvPV_flags_const(sv, lp, flags) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \
+ (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN))
+#endif
+#ifndef SvPV_flags_const_nolen
+# define SvPV_flags_const_nolen(sv, flags) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? SvPVX_const(sv) : \
+ (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN))
+#endif
+#ifndef SvPV_flags_mutable
+# define SvPV_flags_mutable(sv, lp, flags) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \
+ sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+#endif
+#ifndef SvPV_force
+# define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_force_nolen
+# define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_force_mutable
+# define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_force_nomg
+# define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0)
+#endif
+
+#ifndef SvPV_force_nomg_nolen
+# define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0)
+#endif
+#ifndef SvPV_force_flags
+# define SvPV_force_flags(sv, lp, flags) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags))
+#endif
+#ifndef SvPV_force_flags_nolen
+# define SvPV_force_flags_nolen(sv, flags) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+ ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags))
+#endif
+#ifndef SvPV_force_flags_mutable
+# define SvPV_force_flags_mutable(sv, lp, flags) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+ ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \
+ : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+#endif
+#ifndef SvPV_nolen
+# define SvPV_nolen(sv) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC))
+#endif
+#ifndef SvPV_nolen_const
+# define SvPV_nolen_const(sv) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN))
+#endif
+#ifndef SvPV_nomg
+# define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0)
+#endif
+
+#ifndef SvPV_nomg_const
+# define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0)
+#endif
+
+#ifndef SvPV_nomg_const_nolen
+# define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0)
+#endif
+#ifndef SvPV_renew
+# define SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \
+ SvPV_set((sv), (char *) saferealloc( \
+ (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \
+ } STMT_END
+#endif
+#ifndef SvMAGIC_set
+# define SvMAGIC_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+ (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
+#endif
+
+#if (PERL_BCDVERSION < 0x5009003)
+#ifndef SvPVX_const
+# define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv)))
+#endif
+
+#ifndef SvPVX_mutable
+# define SvPVX_mutable(sv) (0 + SvPVX(sv))
+#endif
+#ifndef SvRV_set
+# define SvRV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \
+ (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END
+#endif
+
+#else
+#ifndef SvPVX_const
+# define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv))
+#endif
+
+#ifndef SvPVX_mutable
+# define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv)
+#endif
+#ifndef SvRV_set
+# define SvRV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \
+ ((sv)->sv_u.svu_rv = (val)); } STMT_END
+#endif
+
+#endif
+#ifndef SvSTASH_set
+# define SvSTASH_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+ (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END
+#endif
+
+#if (PERL_BCDVERSION < 0x5004000)
+#ifndef SvUV_set
+# define SvUV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+ (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END
+#endif
+
+#else
+#ifndef SvUV_set
+# define SvUV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+ (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END
+#endif
+
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf)
+#if defined(NEED_vnewSVpvf)
+static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args);
+static
+#else
+extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args);
+#endif
+
+#ifdef vnewSVpvf
+# undef vnewSVpvf
+#endif
+#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b)
+#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf)
+
+#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL)
+
+SV *
+DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args)
+{
+ register SV *sv = newSV(0);
+ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
+ return sv;
+}
+
+#endif
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf)
+# define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf)
+# define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg)
+#if defined(NEED_sv_catpvf_mg)
+static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+#endif
+
+#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg)
+
+#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL)
+
+void
+DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ SvSETMAGIC(sv);
+ va_end(args);
+}
+
+#endif
+#endif
+
+#ifdef PERL_IMPLICIT_CONTEXT
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext)
+#if defined(NEED_sv_catpvf_mg_nocontext)
+static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+#endif
+
+#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+
+#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL)
+
+void
+DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ SvSETMAGIC(sv);
+ va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */
+#ifndef sv_catpvf_mg
+# ifdef PERL_IMPLICIT_CONTEXT
+# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
+# else
+# define sv_catpvf_mg Perl_sv_catpvf_mg
+# endif
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg)
+# define sv_vcatpvf_mg(sv, pat, args) \
+ STMT_START { \
+ sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \
+ SvSETMAGIC(sv); \
+ } STMT_END
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg)
+#if defined(NEED_sv_setpvf_mg)
+static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+#endif
+
+#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg)
+
+#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL)
+
+void
+DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ SvSETMAGIC(sv);
+ va_end(args);
+}
+
+#endif
+#endif
+
+#ifdef PERL_IMPLICIT_CONTEXT
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext)
+#if defined(NEED_sv_setpvf_mg_nocontext)
+static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+#endif
+
+#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+
+#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL)
+
+void
+DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ SvSETMAGIC(sv);
+ va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */
+#ifndef sv_setpvf_mg
+# ifdef PERL_IMPLICIT_CONTEXT
+# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
+# else
+# define sv_setpvf_mg Perl_sv_setpvf_mg
+# endif
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg)
+# define sv_vsetpvf_mg(sv, pat, args) \
+ STMT_START { \
+ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \
+ SvSETMAGIC(sv); \
+ } STMT_END
+#endif
+
+#ifndef newSVpvn_share
+
+#if defined(NEED_newSVpvn_share)
+static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash);
+static
+#else
+extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash);
+#endif
+
+#ifdef newSVpvn_share
+# undef newSVpvn_share
+#endif
+#define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c)
+#define Perl_newSVpvn_share DPPP_(my_newSVpvn_share)
+
+#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL)
+
+SV *
+DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash)
+{
+ SV *sv;
+ if (len < 0)
+ len = -len;
+ if (!hash)
+ PERL_HASH(hash, (char*) src, len);
+ sv = newSVpvn((char *) src, len);
+ sv_upgrade(sv, SVt_PVIV);
+ SvIVX(sv) = hash;
+ SvREADONLY_on(sv);
+ SvPOK_on(sv);
+ return sv;
+}
+
+#endif
+
+#endif
+#ifndef SvSHARED_HASH
+# define SvSHARED_HASH(sv) (0 + SvUVX(sv))
+#endif
+#ifndef HvNAME_get
+# define HvNAME_get(hv) HvNAME(hv)
+#endif
+#ifndef HvNAMELEN_get
+# define HvNAMELEN_get(hv) (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0)
+#endif
+#ifndef GvSVn
+# define GvSVn(gv) GvSV(gv)
+#endif
+
+#ifndef isGV_with_GP
+# define isGV_with_GP(gv) isGV(gv)
+#endif
+#ifndef WARN_ALL
+# define WARN_ALL 0
+#endif
+
+#ifndef WARN_CLOSURE
+# define WARN_CLOSURE 1
+#endif
+
+#ifndef WARN_DEPRECATED
+# define WARN_DEPRECATED 2
+#endif
+
+#ifndef WARN_EXITING
+# define WARN_EXITING 3
+#endif
+
+#ifndef WARN_GLOB
+# define WARN_GLOB 4
+#endif
+
+#ifndef WARN_IO
+# define WARN_IO 5
+#endif
+
+#ifndef WARN_CLOSED
+# define WARN_CLOSED 6
+#endif
+
+#ifndef WARN_EXEC
+# define WARN_EXEC 7
+#endif
+
+#ifndef WARN_LAYER
+# define WARN_LAYER 8
+#endif
+
+#ifndef WARN_NEWLINE
+# define WARN_NEWLINE 9
+#endif
+
+#ifndef WARN_PIPE
+# define WARN_PIPE 10
+#endif
+
+#ifndef WARN_UNOPENED
+# define WARN_UNOPENED 11
+#endif
+
+#ifndef WARN_MISC
+# define WARN_MISC 12
+#endif
+
+#ifndef WARN_NUMERIC
+# define WARN_NUMERIC 13
+#endif
+
+#ifndef WARN_ONCE
+# define WARN_ONCE 14
+#endif
+
+#ifndef WARN_OVERFLOW
+# define WARN_OVERFLOW 15
+#endif
+
+#ifndef WARN_PACK
+# define WARN_PACK 16
+#endif
+
+#ifndef WARN_PORTABLE
+# define WARN_PORTABLE 17
+#endif
+
+#ifndef WARN_RECURSION
+# define WARN_RECURSION 18
+#endif
+
+#ifndef WARN_REDEFINE
+# define WARN_REDEFINE 19
+#endif
+
+#ifndef WARN_REGEXP
+# define WARN_REGEXP 20
+#endif
+
+#ifndef WARN_SEVERE
+# define WARN_SEVERE 21
+#endif
+
+#ifndef WARN_DEBUGGING
+# define WARN_DEBUGGING 22
+#endif
+
+#ifndef WARN_INPLACE
+# define WARN_INPLACE 23
+#endif
+
+#ifndef WARN_INTERNAL
+# define WARN_INTERNAL 24
+#endif
+
+#ifndef WARN_MALLOC
+# define WARN_MALLOC 25
+#endif
+
+#ifndef WARN_SIGNAL
+# define WARN_SIGNAL 26
+#endif
+
+#ifndef WARN_SUBSTR
+# define WARN_SUBSTR 27
+#endif
+
+#ifndef WARN_SYNTAX
+# define WARN_SYNTAX 28
+#endif
+
+#ifndef WARN_AMBIGUOUS
+# define WARN_AMBIGUOUS 29
+#endif
+
+#ifndef WARN_BAREWORD
+# define WARN_BAREWORD 30
+#endif
+
+#ifndef WARN_DIGIT
+# define WARN_DIGIT 31
+#endif
+
+#ifndef WARN_PARENTHESIS
+# define WARN_PARENTHESIS 32
+#endif
+
+#ifndef WARN_PRECEDENCE
+# define WARN_PRECEDENCE 33
+#endif
+
+#ifndef WARN_PRINTF
+# define WARN_PRINTF 34
+#endif
+
+#ifndef WARN_PROTOTYPE
+# define WARN_PROTOTYPE 35
+#endif
+
+#ifndef WARN_QW
+# define WARN_QW 36
+#endif
+
+#ifndef WARN_RESERVED
+# define WARN_RESERVED 37
+#endif
+
+#ifndef WARN_SEMICOLON
+# define WARN_SEMICOLON 38
+#endif
+
+#ifndef WARN_TAINT
+# define WARN_TAINT 39
+#endif
+
+#ifndef WARN_THREADS
+# define WARN_THREADS 40
+#endif
+
+#ifndef WARN_UNINITIALIZED
+# define WARN_UNINITIALIZED 41
+#endif
+
+#ifndef WARN_UNPACK
+# define WARN_UNPACK 42
+#endif
+
+#ifndef WARN_UNTIE
+# define WARN_UNTIE 43
+#endif
+
+#ifndef WARN_UTF8
+# define WARN_UTF8 44
+#endif
+
+#ifndef WARN_VOID
+# define WARN_VOID 45
+#endif
+
+#ifndef WARN_ASSERTIONS
+# define WARN_ASSERTIONS 46
+#endif
+#ifndef packWARN
+# define packWARN(a) (a)
+#endif
+
+#ifndef ckWARN
+# ifdef G_WARN_ON
+# define ckWARN(a) (PL_dowarn & G_WARN_ON)
+# else
+# define ckWARN(a) PL_dowarn
+# endif
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner)
+#if defined(NEED_warner)
+static void DPPP_(my_warner)(U32 err, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_warner)(U32 err, const char *pat, ...);
+#endif
+
+#define Perl_warner DPPP_(my_warner)
+
+#if defined(NEED_warner) || defined(NEED_warner_GLOBAL)
+
+void
+DPPP_(my_warner)(U32 err, const char *pat, ...)
+{
+ SV *sv;
+ va_list args;
+
+ PERL_UNUSED_ARG(err);
+
+ va_start(args, pat);
+ sv = vnewSVpvf(pat, &args);
+ va_end(args);
+ sv_2mortal(sv);
+ warn("%s", SvPV_nolen(sv));
+}
+
+#define warner Perl_warner
+
+#define Perl_warner_nocontext Perl_warner
+
+#endif
+#endif
+
+/* concatenating with "" ensures that only literal strings are accepted as argument
+ * note that STR_WITH_LEN() can't be used as argument to macros or functions that
+ * under some configurations might be macros
+ */
+#ifndef STR_WITH_LEN
+# define STR_WITH_LEN(s) (s ""), (sizeof(s)-1)
+#endif
+#ifndef newSVpvs
+# define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1)
+#endif
+
+#ifndef newSVpvs_flags
+# define newSVpvs_flags(str, flags) newSVpvn_flags(str "", sizeof(str) - 1, flags)
+#endif
+
+#ifndef sv_catpvs
+# define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1)
+#endif
+
+#ifndef sv_setpvs
+# define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1)
+#endif
+
+#ifndef hv_fetchs
+# define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval)
+#endif
+
+#ifndef hv_stores
+# define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0)
+#endif
+#ifndef gv_fetchpvn_flags
+# define gv_fetchpvn_flags(name, len, flags, svt) gv_fetchpv(name, flags, svt)
+#endif
+
+#ifndef gv_fetchpvs
+# define gv_fetchpvs(name, flags, svt) gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt)
+#endif
+
+#ifndef gv_stashpvs
+# define gv_stashpvs(name, flags) gv_stashpvn(name "", sizeof(name) - 1, flags)
+#endif
+#ifndef SvGETMAGIC
+# define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
+#endif
+#ifndef PERL_MAGIC_sv
+# define PERL_MAGIC_sv '\0'
+#endif
+
+#ifndef PERL_MAGIC_overload
+# define PERL_MAGIC_overload 'A'
+#endif
+
+#ifndef PERL_MAGIC_overload_elem
+# define PERL_MAGIC_overload_elem 'a'
+#endif
+
+#ifndef PERL_MAGIC_overload_table
+# define PERL_MAGIC_overload_table 'c'
+#endif
+
+#ifndef PERL_MAGIC_bm
+# define PERL_MAGIC_bm 'B'
+#endif
+
+#ifndef PERL_MAGIC_regdata
+# define PERL_MAGIC_regdata 'D'
+#endif
+
+#ifndef PERL_MAGIC_regdatum
+# define PERL_MAGIC_regdatum 'd'
+#endif
+
+#ifndef PERL_MAGIC_env
+# define PERL_MAGIC_env 'E'
+#endif
+
+#ifndef PERL_MAGIC_envelem
+# define PERL_MAGIC_envelem 'e'
+#endif
+
+#ifndef PERL_MAGIC_fm
+# define PERL_MAGIC_fm 'f'
+#endif
+
+#ifndef PERL_MAGIC_regex_global
+# define PERL_MAGIC_regex_global 'g'
+#endif
+
+#ifndef PERL_MAGIC_isa
+# define PERL_MAGIC_isa 'I'
+#endif
+
+#ifndef PERL_MAGIC_isaelem
+# define PERL_MAGIC_isaelem 'i'
+#endif
+
+#ifndef PERL_MAGIC_nkeys
+# define PERL_MAGIC_nkeys 'k'
+#endif
+
+#ifndef PERL_MAGIC_dbfile
+# define PERL_MAGIC_dbfile 'L'
+#endif
+
+#ifndef PERL_MAGIC_dbline
+# define PERL_MAGIC_dbline 'l'
+#endif
+
+#ifndef PERL_MAGIC_mutex
+# define PERL_MAGIC_mutex 'm'
+#endif
+
+#ifndef PERL_MAGIC_shared
+# define PERL_MAGIC_shared 'N'
+#endif
+
+#ifndef PERL_MAGIC_shared_scalar
+# define PERL_MAGIC_shared_scalar 'n'
+#endif
+
+#ifndef PERL_MAGIC_collxfrm
+# define PERL_MAGIC_collxfrm 'o'
+#endif
+
+#ifndef PERL_MAGIC_tied
+# define PERL_MAGIC_tied 'P'
+#endif
+
+#ifndef PERL_MAGIC_tiedelem
+# define PERL_MAGIC_tiedelem 'p'
+#endif
+
+#ifndef PERL_MAGIC_tiedscalar
+# define PERL_MAGIC_tiedscalar 'q'
+#endif
+
+#ifndef PERL_MAGIC_qr
+# define PERL_MAGIC_qr 'r'
+#endif
+
+#ifndef PERL_MAGIC_sig
+# define PERL_MAGIC_sig 'S'
+#endif
+
+#ifndef PERL_MAGIC_sigelem
+# define PERL_MAGIC_sigelem 's'
+#endif
+
+#ifndef PERL_MAGIC_taint
+# define PERL_MAGIC_taint 't'
+#endif
+
+#ifndef PERL_MAGIC_uvar
+# define PERL_MAGIC_uvar 'U'
+#endif
+
+#ifndef PERL_MAGIC_uvar_elem
+# define PERL_MAGIC_uvar_elem 'u'
+#endif
+
+#ifndef PERL_MAGIC_vstring
+# define PERL_MAGIC_vstring 'V'
+#endif
+
+#ifndef PERL_MAGIC_vec
+# define PERL_MAGIC_vec 'v'
+#endif
+
+#ifndef PERL_MAGIC_utf8
+# define PERL_MAGIC_utf8 'w'
+#endif
+
+#ifndef PERL_MAGIC_substr
+# define PERL_MAGIC_substr 'x'
+#endif
+
+#ifndef PERL_MAGIC_defelem
+# define PERL_MAGIC_defelem 'y'
+#endif
+
+#ifndef PERL_MAGIC_glob
+# define PERL_MAGIC_glob '*'
+#endif
+
+#ifndef PERL_MAGIC_arylen
+# define PERL_MAGIC_arylen '#'
+#endif
+
+#ifndef PERL_MAGIC_pos
+# define PERL_MAGIC_pos '.'
+#endif
+
+#ifndef PERL_MAGIC_backref
+# define PERL_MAGIC_backref '<'
+#endif
+
+#ifndef PERL_MAGIC_ext
+# define PERL_MAGIC_ext '~'
+#endif
+
+/* That's the best we can do... */
+#ifndef sv_catpvn_nomg
+# define sv_catpvn_nomg sv_catpvn
+#endif
+
+#ifndef sv_catsv_nomg
+# define sv_catsv_nomg sv_catsv
+#endif
+
+#ifndef sv_setsv_nomg
+# define sv_setsv_nomg sv_setsv
+#endif
+
+#ifndef sv_pvn_nomg
+# define sv_pvn_nomg sv_pvn
+#endif
+
+#ifndef SvIV_nomg
+# define SvIV_nomg SvIV
+#endif
+
+#ifndef SvUV_nomg
+# define SvUV_nomg SvUV
+#endif
+
+#ifndef sv_catpv_mg
+# define sv_catpv_mg(sv, ptr) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_catpv(TeMpSv,ptr); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_catpvn_mg
+# define sv_catpvn_mg(sv, ptr, len) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_catpvn(TeMpSv,ptr,len); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_catsv_mg
+# define sv_catsv_mg(dsv, ssv) \
+ STMT_START { \
+ SV *TeMpSv = dsv; \
+ sv_catsv(TeMpSv,ssv); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setiv_mg
+# define sv_setiv_mg(sv, i) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setiv(TeMpSv,i); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setnv_mg
+# define sv_setnv_mg(sv, num) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setnv(TeMpSv,num); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setpv_mg
+# define sv_setpv_mg(sv, ptr) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setpv(TeMpSv,ptr); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setpvn_mg
+# define sv_setpvn_mg(sv, ptr, len) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setpvn(TeMpSv,ptr,len); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setsv_mg
+# define sv_setsv_mg(dsv, ssv) \
+ STMT_START { \
+ SV *TeMpSv = dsv; \
+ sv_setsv(TeMpSv,ssv); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setuv_mg
+# define sv_setuv_mg(sv, i) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setuv(TeMpSv,i); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_usepvn_mg
+# define sv_usepvn_mg(sv, ptr, len) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_usepvn(TeMpSv,ptr,len); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+#ifndef SvVSTRING_mg
+# define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL)
+#endif
+
+/* Hint: sv_magic_portable
+ * This is a compatibility function that is only available with
+ * Devel::PPPort. It is NOT in the perl core.
+ * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when
+ * it is being passed a name pointer with namlen == 0. In that
+ * case, perl 5.8.0 and later store the pointer, not a copy of it.
+ * The compatibility can be provided back to perl 5.004. With
+ * earlier versions, the code will not compile.
+ */
+
+#if (PERL_BCDVERSION < 0x5004000)
+
+ /* code that uses sv_magic_portable will not compile */
+
+#elif (PERL_BCDVERSION < 0x5008000)
+
+# define sv_magic_portable(sv, obj, how, name, namlen) \
+ STMT_START { \
+ SV *SvMp_sv = (sv); \
+ char *SvMp_name = (char *) (name); \
+ I32 SvMp_namlen = (namlen); \
+ if (SvMp_name && SvMp_namlen == 0) \
+ { \
+ MAGIC *mg; \
+ sv_magic(SvMp_sv, obj, how, 0, 0); \
+ mg = SvMAGIC(SvMp_sv); \
+ mg->mg_len = -42; /* XXX: this is the tricky part */ \
+ mg->mg_ptr = SvMp_name; \
+ } \
+ else \
+ { \
+ sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \
+ } \
+ } STMT_END
+
+#else
+
+# define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e)
+
+#endif
+
+#ifdef USE_ITHREADS
+#ifndef CopFILE
+# define CopFILE(c) ((c)->cop_file)
+#endif
+
+#ifndef CopFILEGV
+# define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv)
+#endif
+
+#ifndef CopFILE_set
+# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv))
+#endif
+
+#ifndef CopFILESV
+# define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
+#endif
+
+#ifndef CopFILEAV
+# define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
+#endif
+
+#ifndef CopSTASHPV
+# define CopSTASHPV(c) ((c)->cop_stashpv)
+#endif
+
+#ifndef CopSTASHPV_set
+# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
+#endif
+
+#ifndef CopSTASH
+# define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
+#endif
+
+#ifndef CopSTASH_set
+# define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
+#endif
+
+#ifndef CopSTASH_eq
+# define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \
+ || (CopSTASHPV(c) && HvNAME(hv) \
+ && strEQ(CopSTASHPV(c), HvNAME(hv)))))
+#endif
+
+#else
+#ifndef CopFILEGV
+# define CopFILEGV(c) ((c)->cop_filegv)
+#endif
+
+#ifndef CopFILEGV_set
+# define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
+#endif
+
+#ifndef CopFILE_set
+# define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv))
+#endif
+
+#ifndef CopFILESV
+# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
+#endif
+
+#ifndef CopFILEAV
+# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
+#endif
+
+#ifndef CopFILE
+# define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
+#endif
+
+#ifndef CopSTASH
+# define CopSTASH(c) ((c)->cop_stash)
+#endif
+
+#ifndef CopSTASH_set
+# define CopSTASH_set(c,hv) ((c)->cop_stash = (hv))
+#endif
+
+#ifndef CopSTASHPV
+# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
+#endif
+
+#ifndef CopSTASHPV_set
+# define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
+#endif
+
+#ifndef CopSTASH_eq
+# define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv))
+#endif
+
+#endif /* USE_ITHREADS */
+#ifndef IN_PERL_COMPILETIME
+# define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling)
+#endif
+
+#ifndef IN_LOCALE_RUNTIME
+# define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE)
+#endif
+
+#ifndef IN_LOCALE_COMPILETIME
+# define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE)
+#endif
+
+#ifndef IN_LOCALE
+# define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
+#endif
+#ifndef IS_NUMBER_IN_UV
+# define IS_NUMBER_IN_UV 0x01
+#endif
+
+#ifndef IS_NUMBER_GREATER_THAN_UV_MAX
+# define IS_NUMBER_GREATER_THAN_UV_MAX 0x02
+#endif
+
+#ifndef IS_NUMBER_NOT_INT
+# define IS_NUMBER_NOT_INT 0x04
+#endif
+
+#ifndef IS_NUMBER_NEG
+# define IS_NUMBER_NEG 0x08
+#endif
+
+#ifndef IS_NUMBER_INFINITY
+# define IS_NUMBER_INFINITY 0x10
+#endif
+
+#ifndef IS_NUMBER_NAN
+# define IS_NUMBER_NAN 0x20
+#endif
+#ifndef GROK_NUMERIC_RADIX
+# define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send)
+#endif
+#ifndef PERL_SCAN_GREATER_THAN_UV_MAX
+# define PERL_SCAN_GREATER_THAN_UV_MAX 0x02
+#endif
+
+#ifndef PERL_SCAN_SILENT_ILLDIGIT
+# define PERL_SCAN_SILENT_ILLDIGIT 0x04
+#endif
+
+#ifndef PERL_SCAN_ALLOW_UNDERSCORES
+# define PERL_SCAN_ALLOW_UNDERSCORES 0x01
+#endif
+
+#ifndef PERL_SCAN_DISALLOW_PREFIX
+# define PERL_SCAN_DISALLOW_PREFIX 0x02
+#endif
+
+#ifndef grok_numeric_radix
+#if defined(NEED_grok_numeric_radix)
+static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+static
+#else
+extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+#endif
+
+#ifdef grok_numeric_radix
+# undef grok_numeric_radix
+#endif
+#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b)
+#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix)
+
+#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL)
+bool
+DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
+{
+#ifdef USE_LOCALE_NUMERIC
+#ifdef PL_numeric_radix_sv
+ if (PL_numeric_radix_sv && IN_LOCALE) {
+ STRLEN len;
+ char* radix = SvPV(PL_numeric_radix_sv, len);
+ if (*sp + len <= send && memEQ(*sp, radix, len)) {
+ *sp += len;
+ return TRUE;
+ }
+ }
+#else
+ /* older perls don't have PL_numeric_radix_sv so the radix
+ * must manually be requested from locale.h
+ */
+#include <locale.h>
+ dTHR; /* needed for older threaded perls */
+ struct lconv *lc = localeconv();
+ char *radix = lc->decimal_point;
+ if (radix && IN_LOCALE) {
+ STRLEN len = strlen(radix);
+ if (*sp + len <= send && memEQ(*sp, radix, len)) {
+ *sp += len;
+ return TRUE;
+ }
+ }
+#endif
+#endif /* USE_LOCALE_NUMERIC */
+ /* always try "." if numeric radix didn't match because
+ * we may have data from different locales mixed */
+ if (*sp < send && **sp == '.') {
+ ++*sp;
+ return TRUE;
+ }
+ return FALSE;
+}
+#endif
+#endif
+
+#ifndef grok_number
+#if defined(NEED_grok_number)
+static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+static
+#else
+extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+#endif
+
+#ifdef grok_number
+# undef grok_number
+#endif
+#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c)
+#define Perl_grok_number DPPP_(my_grok_number)
+
+#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL)
+int
+DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep)
+{
+ const char *s = pv;
+ const char *send = pv + len;
+ const UV max_div_10 = UV_MAX / 10;
+ const char max_mod_10 = UV_MAX % 10;
+ int numtype = 0;
+ int sawinf = 0;
+ int sawnan = 0;
+
+ while (s < send && isSPACE(*s))
+ s++;
+ if (s == send) {
+ return 0;
+ } else if (*s == '-') {
+ s++;
+ numtype = IS_NUMBER_NEG;
+ }
+ else if (*s == '+')
+ s++;
+
+ if (s == send)
+ return 0;
+
+ /* next must be digit or the radix separator or beginning of infinity */
+ if (isDIGIT(*s)) {
+ /* UVs are at least 32 bits, so the first 9 decimal digits cannot
+ overflow. */
+ UV value = *s - '0';
+ /* This construction seems to be more optimiser friendly.
+ (without it gcc does the isDIGIT test and the *s - '0' separately)
+ With it gcc on arm is managing 6 instructions (6 cycles) per digit.
+ In theory the optimiser could deduce how far to unroll the loop
+ before checking for overflow. */
+ if (++s < send) {
+ int digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ /* Now got 9 digits, so need to check
+ each time for overflow. */
+ digit = *s - '0';
+ while (digit >= 0 && digit <= 9
+ && (value < max_div_10
+ || (value == max_div_10
+ && digit <= max_mod_10))) {
+ value = value * 10 + digit;
+ if (++s < send)
+ digit = *s - '0';
+ else
+ break;
+ }
+ if (digit >= 0 && digit <= 9
+ && (s < send)) {
+ /* value overflowed.
+ skip the remaining digits, don't
+ worry about setting *valuep. */
+ do {
+ s++;
+ } while (s < send && isDIGIT(*s));
+ numtype |=
+ IS_NUMBER_GREATER_THAN_UV_MAX;
+ goto skip_value;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ numtype |= IS_NUMBER_IN_UV;
+ if (valuep)
+ *valuep = value;
+
+ skip_value:
+ if (GROK_NUMERIC_RADIX(&s, send)) {
+ numtype |= IS_NUMBER_NOT_INT;
+ while (s < send && isDIGIT(*s)) /* optional digits after the radix */
+ s++;
+ }
+ }
+ else if (GROK_NUMERIC_RADIX(&s, send)) {
+ numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
+ /* no digits before the radix means we need digits after it */
+ if (s < send && isDIGIT(*s)) {
+ do {
+ s++;
+ } while (s < send && isDIGIT(*s));
+ if (valuep) {
+ /* integer approximation is valid - it's 0. */
+ *valuep = 0;
+ }
+ }
+ else
+ return 0;
+ } else if (*s == 'I' || *s == 'i') {
+ s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+ s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
+ s++; if (s < send && (*s == 'I' || *s == 'i')) {
+ s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+ s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
+ s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
+ s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
+ s++;
+ }
+ sawinf = 1;
+ } else if (*s == 'N' || *s == 'n') {
+ /* XXX TODO: There are signaling NaNs and quiet NaNs. */
+ s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
+ s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+ s++;
+ sawnan = 1;
+ } else
+ return 0;
+
+ if (sawinf) {
+ numtype &= IS_NUMBER_NEG; /* Keep track of sign */
+ numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
+ } else if (sawnan) {
+ numtype &= IS_NUMBER_NEG; /* Keep track of sign */
+ numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
+ } else if (s < send) {
+ /* we can have an optional exponent part */
+ if (*s == 'e' || *s == 'E') {
+ /* The only flag we keep is sign. Blow away any "it's UV" */
+ numtype &= IS_NUMBER_NEG;
+ numtype |= IS_NUMBER_NOT_INT;
+ s++;
+ if (s < send && (*s == '-' || *s == '+'))
+ s++;
+ if (s < send && isDIGIT(*s)) {
+ do {
+ s++;
+ } while (s < send && isDIGIT(*s));
+ }
+ else
+ return 0;
+ }
+ }
+ while (s < send && isSPACE(*s))
+ s++;
+ if (s >= send)
+ return numtype;
+ if (len == 10 && memEQ(pv, "0 but true", 10)) {
+ if (valuep)
+ *valuep = 0;
+ return IS_NUMBER_IN_UV;
+ }
+ return 0;
+}
+#endif
+#endif
+
+/*
+ * The grok_* routines have been modified to use warn() instead of
+ * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit,
+ * which is why the stack variable has been renamed to 'xdigit'.
+ */
+
+#ifndef grok_bin
+#if defined(NEED_grok_bin)
+static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+static
+#else
+extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+#endif
+
+#ifdef grok_bin
+# undef grok_bin
+#endif
+#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d)
+#define Perl_grok_bin DPPP_(my_grok_bin)
+
+#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL)
+UV
+DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+ const char *s = start;
+ STRLEN len = *len_p;
+ UV value = 0;
+ NV value_nv = 0;
+
+ const UV max_div_2 = UV_MAX / 2;
+ bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+ bool overflowed = FALSE;
+
+ if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+ /* strip off leading b or 0b.
+ for compatibility silently suffer "b" and "0b" as valid binary
+ numbers. */
+ if (len >= 1) {
+ if (s[0] == 'b') {
+ s++;
+ len--;
+ }
+ else if (len >= 2 && s[0] == '0' && s[1] == 'b') {
+ s+=2;
+ len-=2;
+ }
+ }
+ }
+
+ for (; len-- && *s; s++) {
+ char bit = *s;
+ if (bit == '0' || bit == '1') {
+ /* Write it in this wonky order with a goto to attempt to get the
+ compiler to make the common case integer-only loop pretty tight.
+ With gcc seems to be much straighter code than old scan_bin. */
+ redo:
+ if (!overflowed) {
+ if (value <= max_div_2) {
+ value = (value << 1) | (bit - '0');
+ continue;
+ }
+ /* Bah. We're just overflowed. */
+ warn("Integer overflow in binary number");
+ overflowed = TRUE;
+ value_nv = (NV) value;
+ }
+ value_nv *= 2.0;
+ /* If an NV has not enough bits in its mantissa to
+ * represent a UV this summing of small low-order numbers
+ * is a waste of time (because the NV cannot preserve
+ * the low-order bits anyway): we could just remember when
+ * did we overflow and in the end just multiply value_nv by the
+ * right amount. */
+ value_nv += (NV)(bit - '0');
+ continue;
+ }
+ if (bit == '_' && len && allow_underscores && (bit = s[1])
+ && (bit == '0' || bit == '1'))
+ {
+ --len;
+ ++s;
+ goto redo;
+ }
+ if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+ warn("Illegal binary digit '%c' ignored", *s);
+ break;
+ }
+
+ if ( ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+ || (!overflowed && value > 0xffffffff )
+#endif
+ ) {
+ warn("Binary number > 0b11111111111111111111111111111111 non-portable");
+ }
+ *len_p = s - start;
+ if (!overflowed) {
+ *flags = 0;
+ return value;
+ }
+ *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+ if (result)
+ *result = value_nv;
+ return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_hex
+#if defined(NEED_grok_hex)
+static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+static
+#else
+extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+#endif
+
+#ifdef grok_hex
+# undef grok_hex
+#endif
+#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d)
+#define Perl_grok_hex DPPP_(my_grok_hex)
+
+#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL)
+UV
+DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+ const char *s = start;
+ STRLEN len = *len_p;
+ UV value = 0;
+ NV value_nv = 0;
+
+ const UV max_div_16 = UV_MAX / 16;
+ bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+ bool overflowed = FALSE;
+ const char *xdigit;
+
+ if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+ /* strip off leading x or 0x.
+ for compatibility silently suffer "x" and "0x" as valid hex numbers.
+ */
+ if (len >= 1) {
+ if (s[0] == 'x') {
+ s++;
+ len--;
+ }
+ else if (len >= 2 && s[0] == '0' && s[1] == 'x') {
+ s+=2;
+ len-=2;
+ }
+ }
+ }
+
+ for (; len-- && *s; s++) {
+ xdigit = strchr((char *) PL_hexdigit, *s);
+ if (xdigit) {
+ /* Write it in this wonky order with a goto to attempt to get the
+ compiler to make the common case integer-only loop pretty tight.
+ With gcc seems to be much straighter code than old scan_hex. */
+ redo:
+ if (!overflowed) {
+ if (value <= max_div_16) {
+ value = (value << 4) | ((xdigit - PL_hexdigit) & 15);
+ continue;
+ }
+ warn("Integer overflow in hexadecimal number");
+ overflowed = TRUE;
+ value_nv = (NV) value;
+ }
+ value_nv *= 16.0;
+ /* If an NV has not enough bits in its mantissa to
+ * represent a UV this summing of small low-order numbers
+ * is a waste of time (because the NV cannot preserve
+ * the low-order bits anyway): we could just remember when
+ * did we overflow and in the end just multiply value_nv by the
+ * right amount of 16-tuples. */
+ value_nv += (NV)((xdigit - PL_hexdigit) & 15);
+ continue;
+ }
+ if (*s == '_' && len && allow_underscores && s[1]
+ && (xdigit = strchr((char *) PL_hexdigit, s[1])))
+ {
+ --len;
+ ++s;
+ goto redo;
+ }
+ if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+ warn("Illegal hexadecimal digit '%c' ignored", *s);
+ break;
+ }
+
+ if ( ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+ || (!overflowed && value > 0xffffffff )
+#endif
+ ) {
+ warn("Hexadecimal number > 0xffffffff non-portable");
+ }
+ *len_p = s - start;
+ if (!overflowed) {
+ *flags = 0;
+ return value;
+ }
+ *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+ if (result)
+ *result = value_nv;
+ return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_oct
+#if defined(NEED_grok_oct)
+static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+static
+#else
+extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+#endif
+
+#ifdef grok_oct
+# undef grok_oct
+#endif
+#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d)
+#define Perl_grok_oct DPPP_(my_grok_oct)
+
+#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL)
+UV
+DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+ const char *s = start;
+ STRLEN len = *len_p;
+ UV value = 0;
+ NV value_nv = 0;
+
+ const UV max_div_8 = UV_MAX / 8;
+ bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+ bool overflowed = FALSE;
+
+ for (; len-- && *s; s++) {
+ /* gcc 2.95 optimiser not smart enough to figure that this subtraction
+ out front allows slicker code. */
+ int digit = *s - '0';
+ if (digit >= 0 && digit <= 7) {
+ /* Write it in this wonky order with a goto to attempt to get the
+ compiler to make the common case integer-only loop pretty tight.
+ */
+ redo:
+ if (!overflowed) {
+ if (value <= max_div_8) {
+ value = (value << 3) | digit;
+ continue;
+ }
+ /* Bah. We're just overflowed. */
+ warn("Integer overflow in octal number");
+ overflowed = TRUE;
+ value_nv = (NV) value;
+ }
+ value_nv *= 8.0;
+ /* If an NV has not enough bits in its mantissa to
+ * represent a UV this summing of small low-order numbers
+ * is a waste of time (because the NV cannot preserve
+ * the low-order bits anyway): we could just remember when
+ * did we overflow and in the end just multiply value_nv by the
+ * right amount of 8-tuples. */
+ value_nv += (NV)digit;
+ continue;
+ }
+ if (digit == ('_' - '0') && len && allow_underscores
+ && (digit = s[1] - '0') && (digit >= 0 && digit <= 7))
+ {
+ --len;
+ ++s;
+ goto redo;
+ }
+ /* Allow \octal to work the DWIM way (that is, stop scanning
+ * as soon as non-octal characters are seen, complain only iff
+ * someone seems to want to use the digits eight and nine). */
+ if (digit == 8 || digit == 9) {
+ if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+ warn("Illegal octal digit '%c' ignored", *s);
+ }
+ break;
+ }
+
+ if ( ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+ || (!overflowed && value > 0xffffffff )
+#endif
+ ) {
+ warn("Octal number > 037777777777 non-portable");
+ }
+ *len_p = s - start;
+ if (!overflowed) {
+ *flags = 0;
+ return value;
+ }
+ *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+ if (result)
+ *result = value_nv;
+ return UV_MAX;
+}
+#endif
+#endif
+
+#if !defined(my_snprintf)
+#if defined(NEED_my_snprintf)
+static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
+static
+#else
+extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
+#endif
+
+#define my_snprintf DPPP_(my_my_snprintf)
+#define Perl_my_snprintf DPPP_(my_my_snprintf)
+
+#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL)
+
+int
+DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...)
+{
+ dTHX;
+ int retval;
+ va_list ap;
+ va_start(ap, format);
+#ifdef HAS_VSNPRINTF
+ retval = vsnprintf(buffer, len, format, ap);
+#else
+ retval = vsprintf(buffer, format, ap);
+#endif
+ va_end(ap);
+ if (retval < 0 || (len > 0 && (Size_t)retval >= len))
+ Perl_croak(aTHX_ "panic: my_snprintf buffer overflow");
+ return retval;
+}
+
+#endif
+#endif
+
+#if !defined(my_sprintf)
+#if defined(NEED_my_sprintf)
+static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...);
+static
+#else
+extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...);
+#endif
+
+#define my_sprintf DPPP_(my_my_sprintf)
+#define Perl_my_sprintf DPPP_(my_my_sprintf)
+
+#if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL)
+
+int
+DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ vsprintf(buffer, pat, args);
+ va_end(args);
+ return strlen(buffer);
+}
+
+#endif
+#endif
+
+#ifdef NO_XSLOCKS
+# ifdef dJMPENV
+# define dXCPT dJMPENV; int rEtV = 0
+# define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0)
+# define XCPT_TRY_END JMPENV_POP;
+# define XCPT_CATCH if (rEtV != 0)
+# define XCPT_RETHROW JMPENV_JUMP(rEtV)
+# else
+# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0
+# define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0)
+# define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf);
+# define XCPT_CATCH if (rEtV != 0)
+# define XCPT_RETHROW Siglongjmp(top_env, rEtV)
+# endif
+#endif
+
+#if !defined(my_strlcat)
+#if defined(NEED_my_strlcat)
+static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
+static
+#else
+extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
+#endif
+
+#define my_strlcat DPPP_(my_my_strlcat)
+#define Perl_my_strlcat DPPP_(my_my_strlcat)
+
+#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL)
+
+Size_t
+DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size)
+{
+ Size_t used, length, copy;
+
+ used = strlen(dst);
+ length = strlen(src);
+ if (size > 0 && used < size - 1) {
+ copy = (length >= size - used) ? size - used - 1 : length;
+ memcpy(dst + used, src, copy);
+ dst[used + copy] = '\0';
+ }
+ return used + length;
+}
+#endif
+#endif
+
+#if !defined(my_strlcpy)
+#if defined(NEED_my_strlcpy)
+static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
+static
+#else
+extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
+#endif
+
+#define my_strlcpy DPPP_(my_my_strlcpy)
+#define Perl_my_strlcpy DPPP_(my_my_strlcpy)
+
+#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL)
+
+Size_t
+DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size)
+{
+ Size_t length, copy;
+
+ length = strlen(src);
+ if (size > 0) {
+ copy = (length >= size) ? size - 1 : length;
+ memcpy(dst, src, copy);
+ dst[copy] = '\0';
+ }
+ return length;
+}
+
+#endif
+#endif
+#ifndef PERL_PV_ESCAPE_QUOTE
+# define PERL_PV_ESCAPE_QUOTE 0x0001
+#endif
+
+#ifndef PERL_PV_PRETTY_QUOTE
+# define PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE
+#endif
+
+#ifndef PERL_PV_PRETTY_ELLIPSES
+# define PERL_PV_PRETTY_ELLIPSES 0x0002
+#endif
+
+#ifndef PERL_PV_PRETTY_LTGT
+# define PERL_PV_PRETTY_LTGT 0x0004
+#endif
+
+#ifndef PERL_PV_ESCAPE_FIRSTCHAR
+# define PERL_PV_ESCAPE_FIRSTCHAR 0x0008
+#endif
+
+#ifndef PERL_PV_ESCAPE_UNI
+# define PERL_PV_ESCAPE_UNI 0x0100
+#endif
+
+#ifndef PERL_PV_ESCAPE_UNI_DETECT
+# define PERL_PV_ESCAPE_UNI_DETECT 0x0200
+#endif
+
+#ifndef PERL_PV_ESCAPE_ALL
+# define PERL_PV_ESCAPE_ALL 0x1000
+#endif
+
+#ifndef PERL_PV_ESCAPE_NOBACKSLASH
+# define PERL_PV_ESCAPE_NOBACKSLASH 0x2000
+#endif
+
+#ifndef PERL_PV_ESCAPE_NOCLEAR
+# define PERL_PV_ESCAPE_NOCLEAR 0x4000
+#endif
+
+#ifndef PERL_PV_ESCAPE_RE
+# define PERL_PV_ESCAPE_RE 0x8000
+#endif
+
+#ifndef PERL_PV_PRETTY_NOCLEAR
+# define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR
+#endif
+#ifndef PERL_PV_PRETTY_DUMP
+# define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE
+#endif
+
+#ifndef PERL_PV_PRETTY_REGPROP
+# define PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE
+#endif
+
+/* Hint: pv_escape
+ * Note that unicode functionality is only backported to
+ * those perl versions that support it. For older perl
+ * versions, the implementation will fall back to bytes.
+ */
+
+#ifndef pv_escape
+#if defined(NEED_pv_escape)
+static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
+static
+#else
+extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
+#endif
+
+#ifdef pv_escape
+# undef pv_escape
+#endif
+#define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f)
+#define Perl_pv_escape DPPP_(my_pv_escape)
+
+#if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL)
+
+char *
+DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str,
+ const STRLEN count, const STRLEN max,
+ STRLEN * const escaped, const U32 flags)
+{
+ const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\';
+ const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc;
+ char octbuf[32] = "%123456789ABCDF";
+ STRLEN wrote = 0;
+ STRLEN chsize = 0;
+ STRLEN readsize = 1;
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+ bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0;
+#endif
+ const char *pv = str;
+ const char * const end = pv + count;
+ octbuf[0] = esc;
+
+ if (!(flags & PERL_PV_ESCAPE_NOCLEAR))
+ sv_setpvs(dsv, "");
+
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+ if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
+ isuni = 1;
+#endif
+
+ for (; pv < end && (!max || wrote < max) ; pv += readsize) {
+ const UV u =
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+ isuni ? utf8_to_uvchr((U8*)pv, &readsize) :
+#endif
+ (U8)*pv;
+ const U8 c = (U8)u & 0xFF;
+
+ if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) {
+ if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
+ chsize = my_snprintf(octbuf, sizeof octbuf,
+ "%"UVxf, u);
+ else
+ chsize = my_snprintf(octbuf, sizeof octbuf,
+ "%cx{%"UVxf"}", esc, u);
+ } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
+ chsize = 1;
+ } else {
+ if (c == dq || c == esc || !isPRINT(c)) {
+ chsize = 2;
+ switch (c) {
+ case '\\' : /* fallthrough */
+ case '%' : if (c == esc)
+ octbuf[1] = esc;
+ else
+ chsize = 1;
+ break;
+ case '\v' : octbuf[1] = 'v'; break;
+ case '\t' : octbuf[1] = 't'; break;
+ case '\r' : octbuf[1] = 'r'; break;
+ case '\n' : octbuf[1] = 'n'; break;
+ case '\f' : octbuf[1] = 'f'; break;
+ case '"' : if (dq == '"')
+ octbuf[1] = '"';
+ else
+ chsize = 1;
+ break;
+ default: chsize = my_snprintf(octbuf, sizeof octbuf,
+ pv < end && isDIGIT((U8)*(pv+readsize))
+ ? "%c%03o" : "%c%o", esc, c);
+ }
+ } else {
+ chsize = 1;
+ }
+ }
+ if (max && wrote + chsize > max) {
+ break;
+ } else if (chsize > 1) {
+ sv_catpvn(dsv, octbuf, chsize);
+ wrote += chsize;
+ } else {
+ char tmp[2];
+ my_snprintf(tmp, sizeof tmp, "%c", c);
+ sv_catpvn(dsv, tmp, 1);
+ wrote++;
+ }
+ if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
+ break;
+ }
+ if (escaped != NULL)
+ *escaped= pv - str;
+ return SvPVX(dsv);
+}
+
+#endif
+#endif
+
+#ifndef pv_pretty
+#if defined(NEED_pv_pretty)
+static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
+static
+#else
+extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
+#endif
+
+#ifdef pv_pretty
+# undef pv_pretty
+#endif
+#define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g)
+#define Perl_pv_pretty DPPP_(my_pv_pretty)
+
+#if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL)
+
+char *
+DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count,
+ const STRLEN max, char const * const start_color, char const * const end_color,
+ const U32 flags)
+{
+ const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
+ STRLEN escaped;
+
+ if (!(flags & PERL_PV_PRETTY_NOCLEAR))
+ sv_setpvs(dsv, "");
+
+ if (dq == '"')
+ sv_catpvs(dsv, "\"");
+ else if (flags & PERL_PV_PRETTY_LTGT)
+ sv_catpvs(dsv, "<");
+
+ if (start_color != NULL)
+ sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color));
+
+ pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR);
+
+ if (end_color != NULL)
+ sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color));
+
+ if (dq == '"')
+ sv_catpvs(dsv, "\"");
+ else if (flags & PERL_PV_PRETTY_LTGT)
+ sv_catpvs(dsv, ">");
+
+ if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count)
+ sv_catpvs(dsv, "...");
+
+ return SvPVX(dsv);
+}
+
+#endif
+#endif
+
+#ifndef pv_display
+#if defined(NEED_pv_display)
+static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim);
+static
+#else
+extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim);
+#endif
+
+#ifdef pv_display
+# undef pv_display
+#endif
+#define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e)
+#define Perl_pv_display DPPP_(my_pv_display)
+
+#if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL)
+
+char *
+DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
+{
+ pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
+ if (len > cur && pv[cur] == '\0')
+ sv_catpvs(dsv, "\\0");
+ return SvPVX(dsv);
+}
+
+#endif
+#endif
+
+#endif /* _P_P_PORTABILITY_H_ */
+
+/* End of File ppport.h */
diff --git a/Master/tlpkg/tlperl.straw/lib/Devel/Peek.pm b/Master/tlpkg/tlperl.straw/lib/Devel/Peek.pm
new file mode 100755
index 00000000000..2fced312f2e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Devel/Peek.pm
@@ -0,0 +1,570 @@
+# Devel::Peek - A data debugging tool for the XS programmer
+# The documentation is after the __END__
+
+package Devel::Peek;
+
+$VERSION = '1.04';
+$XS_VERSION = $VERSION;
+$VERSION = eval $VERSION;
+
+require Exporter;
+use XSLoader ();
+
+@ISA = qw(Exporter);
+@EXPORT = qw(Dump mstat DeadCode DumpArray DumpWithOP DumpProg
+ fill_mstats mstats_fillhash mstats2hash runops_debug debug_flags);
+@EXPORT_OK = qw(SvREFCNT SvREFCNT_inc SvREFCNT_dec CvGV);
+%EXPORT_TAGS = ('ALL' => [@EXPORT, @EXPORT_OK]);
+
+XSLoader::load 'Devel::Peek';
+
+sub import {
+ my $c = shift;
+ my $ops_rx = qr/^:opd(=[stP]*)?\b/;
+ my @db = grep m/$ops_rx/, @_;
+ @_ = grep !m/$ops_rx/, @_;
+ if (@db) {
+ die "Too many :opd options" if @db > 1;
+ runops_debug(1);
+ my $flags = ($db[0] =~ m/$ops_rx/ and $1);
+ $flags = 'st' unless defined $flags;
+ my $f = 0;
+ $f |= 2 if $flags =~ /s/;
+ $f |= 8 if $flags =~ /t/;
+ $f |= 64 if $flags =~ /P/;
+ $^D |= $f if $f;
+ }
+ unshift @_, $c;
+ goto &Exporter::import;
+}
+
+sub DumpWithOP ($;$) {
+ local($Devel::Peek::dump_ops)=1;
+ my $depth = @_ > 1 ? $_[1] : 4 ;
+ Dump($_[0],$depth);
+}
+
+$D_flags = 'psltocPmfrxuLHXDSTR';
+
+sub debug_flags (;$) {
+ my $out = "";
+ for my $i (0 .. length($D_flags)-1) {
+ $out .= substr $D_flags, $i, 1 if $^D & (1<<$i);
+ }
+ my $arg = shift;
+ my $num = $arg;
+ if (defined $arg and $arg =~ /\D/) {
+ die "unknown flags in debug_flags()" if $arg =~ /[^-$D_flags]/;
+ my ($on,$off) = split /-/, "$arg-";
+ $num = $^D;
+ $num |= (1<<index($D_flags, $_)) for split //, $on;
+ $num &= ~(1<<index($D_flags, $_)) for split //, $off;
+ }
+ $^D = $num if defined $arg;
+ $out
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Devel::Peek - A data debugging tool for the XS programmer
+
+=head1 SYNOPSIS
+
+ use Devel::Peek;
+ Dump( $a );
+ Dump( $a, 5 );
+ DumpArray( 5, $a, $b, ... );
+ mstat "Point 5";
+
+ use Devel::Peek ':opd=st';
+
+=head1 DESCRIPTION
+
+Devel::Peek contains functions which allows raw Perl datatypes to be
+manipulated from a Perl script. This is used by those who do XS programming
+to check that the data they are sending from C to Perl looks as they think
+it should look. The trick, then, is to know what the raw datatype is
+supposed to look like when it gets to Perl. This document offers some tips
+and hints to describe good and bad raw data.
+
+It is very possible that this document will fall far short of being useful
+to the casual reader. The reader is expected to understand the material in
+the first few sections of L<perlguts>.
+
+Devel::Peek supplies a C<Dump()> function which can dump a raw Perl
+datatype, and C<mstat("marker")> function to report on memory usage
+(if perl is compiled with corresponding option). The function
+DeadCode() provides statistics on the data "frozen" into inactive
+C<CV>. Devel::Peek also supplies C<SvREFCNT()>, C<SvREFCNT_inc()>, and
+C<SvREFCNT_dec()> which can query, increment, and decrement reference
+counts on SVs. This document will take a passive, and safe, approach
+to data debugging and for that it will describe only the C<Dump()>
+function.
+
+Function C<DumpArray()> allows dumping of multiple values (useful when you
+need to analyze returns of functions).
+
+The global variable $Devel::Peek::pv_limit can be set to limit the
+number of character printed in various string values. Setting it to 0
+means no limit.
+
+If C<use Devel::Peek> directive has a C<:opd=FLAGS> argument,
+this switches on debugging of opcode dispatch. C<FLAGS> should be a
+combination of C<s>, C<t>, and C<P> (see B<-D> flags in L<perlrun>).
+C<:opd> is a shortcut for C<:opd=st>.
+
+=head2 Runtime debugging
+
+C<CvGV($cv)> return one of the globs associated to a subroutine reference $cv.
+
+debug_flags() returns a string representation of C<$^D> (similar to
+what is allowed for B<-D> flag). When called with a numeric argument,
+sets $^D to the corresponding value. When called with an argument of
+the form C<"flags-flags">, set on/off bits of C<$^D> corresponding to
+letters before/after C<->. (The returned value is for C<$^D> before
+the modification.)
+
+runops_debug() returns true if the current I<opcode dispatcher> is the
+debugging one. When called with an argument, switches to debugging or
+non-debugging dispatcher depending on the argument (active for
+newly-entered subs/etc only). (The returned value is for the dispatcher before the modification.)
+
+=head2 Memory footprint debugging
+
+When perl is compiled with support for memory footprint debugging
+(default with Perl's malloc()), Devel::Peek provides an access to this API.
+
+Use mstat() function to emit a memory state statistic to the terminal.
+For more information on the format of output of mstat() see
+L<perldebguts/Using C<$ENV{PERL_DEBUG_MSTATS}>>.
+
+Three additional functions allow access to this statistic from Perl.
+First, use C<mstats_fillhash(%hash)> to get the information contained
+in the output of mstat() into %hash. The field of this hash are
+
+ minbucket nbuckets sbrk_good sbrk_slack sbrked_remains sbrks start_slack
+ topbucket topbucket_ev topbucket_odd total total_chain total_sbrk totfree
+
+Two additional fields C<free>, C<used> contain array references which
+provide per-bucket count of free and used chunks. Two other fields
+C<mem_size>, C<available_size> contain array references which provide
+the information about the allocated size and usable size of chunks in
+each bucket. Again, see L<perldebguts/Using C<$ENV{PERL_DEBUG_MSTATS}>>
+for details.
+
+Keep in mind that only the first several "odd-numbered" buckets are
+used, so the information on size of the "odd-numbered" buckets which are
+not used is probably meaningless.
+
+The information in
+
+ mem_size available_size minbucket nbuckets
+
+is the property of a particular build of perl, and does not depend on
+the current process. If you do not provide the optional argument to
+the functions mstats_fillhash(), fill_mstats(), mstats2hash(), then
+the information in fields C<mem_size>, C<available_size> is not
+updated.
+
+C<fill_mstats($buf)> is a much cheaper call (both speedwise and
+memory-wise) which collects the statistic into $buf in
+machine-readable form. At a later moment you may need to call
+C<mstats2hash($buf, %hash)> to use this information to fill %hash.
+
+All three APIs C<fill_mstats($buf)>, C<mstats_fillhash(%hash)>, and
+C<mstats2hash($buf, %hash)> are designed to allocate no memory if used
+I<the second time> on the same $buf and/or %hash.
+
+So, if you want to collect memory info in a cycle, you may call
+
+ $#buf = 999;
+ fill_mstats($_) for @buf;
+ mstats_fillhash(%report, 1); # Static info too
+
+ foreach (@buf) {
+ # Do something...
+ fill_mstats $_; # Collect statistic
+ }
+ foreach (@buf) {
+ mstats2hash($_, %report); # Preserve static info
+ # Do something with %report
+ }
+
+=head1 EXAMPLES
+
+The following examples don't attempt to show everything as that would be a
+monumental task, and, frankly, we don't want this manpage to be an internals
+document for Perl. The examples do demonstrate some basics of the raw Perl
+datatypes, and should suffice to get most determined people on their way.
+There are no guidewires or safety nets, nor blazed trails, so be prepared to
+travel alone from this point and on and, if at all possible, don't fall into
+the quicksand (it's bad for business).
+
+Oh, one final bit of advice: take L<perlguts> with you. When you return we
+expect to see it well-thumbed.
+
+=head2 A simple scalar string
+
+Let's begin by looking a simple scalar which is holding a string.
+
+ use Devel::Peek;
+ $a = "hello";
+ Dump $a;
+
+The output:
+
+ SV = PVIV(0xbc288)
+ REFCNT = 1
+ FLAGS = (POK,pPOK)
+ IV = 0
+ PV = 0xb2048 "hello"\0
+ CUR = 5
+ LEN = 6
+
+This says C<$a> is an SV, a scalar. The scalar is a PVIV, a string.
+Its reference count is 1. It has the C<POK> flag set, meaning its
+current PV field is valid. Because POK is set we look at the PV item
+to see what is in the scalar. The \0 at the end indicate that this
+PV is properly NUL-terminated.
+If the FLAGS had been IOK we would look
+at the IV item. CUR indicates the number of characters in the PV.
+LEN indicates the number of bytes requested for the PV (one more than
+CUR, in this case, because LEN includes an extra byte for the
+end-of-string marker).
+
+=head2 A simple scalar number
+
+If the scalar contains a number the raw SV will be leaner.
+
+ use Devel::Peek;
+ $a = 42;
+ Dump $a;
+
+The output:
+
+ SV = IV(0xbc818)
+ REFCNT = 1
+ FLAGS = (IOK,pIOK)
+ IV = 42
+
+This says C<$a> is an SV, a scalar. The scalar is an IV, a number. Its
+reference count is 1. It has the C<IOK> flag set, meaning it is currently
+being evaluated as a number. Because IOK is set we look at the IV item to
+see what is in the scalar.
+
+=head2 A simple scalar with an extra reference
+
+If the scalar from the previous example had an extra reference:
+
+ use Devel::Peek;
+ $a = 42;
+ $b = \$a;
+ Dump $a;
+
+The output:
+
+ SV = IV(0xbe860)
+ REFCNT = 2
+ FLAGS = (IOK,pIOK)
+ IV = 42
+
+Notice that this example differs from the previous example only in its
+reference count. Compare this to the next example, where we dump C<$b>
+instead of C<$a>.
+
+=head2 A reference to a simple scalar
+
+This shows what a reference looks like when it references a simple scalar.
+
+ use Devel::Peek;
+ $a = 42;
+ $b = \$a;
+ Dump $b;
+
+The output:
+
+ SV = RV(0xf041c)
+ REFCNT = 1
+ FLAGS = (ROK)
+ RV = 0xbab08
+ SV = IV(0xbe860)
+ REFCNT = 2
+ FLAGS = (IOK,pIOK)
+ IV = 42
+
+Starting from the top, this says C<$b> is an SV. The scalar is an RV, a
+reference. It has the C<ROK> flag set, meaning it is a reference. Because
+ROK is set we have an RV item rather than an IV or PV. Notice that Dump
+follows the reference and shows us what C<$b> was referencing. We see the
+same C<$a> that we found in the previous example.
+
+Note that the value of C<RV> coincides with the numbers we see when we
+stringify $b. The addresses inside RV() and IV() are addresses of
+C<X***> structure which holds the current state of an C<SV>. This
+address may change during lifetime of an SV.
+
+=head2 A reference to an array
+
+This shows what a reference to an array looks like.
+
+ use Devel::Peek;
+ $a = [42];
+ Dump $a;
+
+The output:
+
+ SV = RV(0xf041c)
+ REFCNT = 1
+ FLAGS = (ROK)
+ RV = 0xb2850
+ SV = PVAV(0xbd448)
+ REFCNT = 1
+ FLAGS = ()
+ IV = 0
+ NV = 0
+ ARRAY = 0xb2048
+ ALLOC = 0xb2048
+ FILL = 0
+ MAX = 0
+ ARYLEN = 0x0
+ FLAGS = (REAL)
+ Elt No. 0 0xb5658
+ SV = IV(0xbe860)
+ REFCNT = 1
+ FLAGS = (IOK,pIOK)
+ IV = 42
+
+This says C<$a> is an SV and that it is an RV. That RV points to
+another SV which is a PVAV, an array. The array has one element,
+element zero, which is another SV. The field C<FILL> above indicates
+the last element in the array, similar to C<$#$a>.
+
+If C<$a> pointed to an array of two elements then we would see the
+following.
+
+ use Devel::Peek 'Dump';
+ $a = [42,24];
+ Dump $a;
+
+The output:
+
+ SV = RV(0xf041c)
+ REFCNT = 1
+ FLAGS = (ROK)
+ RV = 0xb2850
+ SV = PVAV(0xbd448)
+ REFCNT = 1
+ FLAGS = ()
+ IV = 0
+ NV = 0
+ ARRAY = 0xb2048
+ ALLOC = 0xb2048
+ FILL = 0
+ MAX = 0
+ ARYLEN = 0x0
+ FLAGS = (REAL)
+ Elt No. 0 0xb5658
+ SV = IV(0xbe860)
+ REFCNT = 1
+ FLAGS = (IOK,pIOK)
+ IV = 42
+ Elt No. 1 0xb5680
+ SV = IV(0xbe818)
+ REFCNT = 1
+ FLAGS = (IOK,pIOK)
+ IV = 24
+
+Note that C<Dump> will not report I<all> the elements in the array,
+only several first (depending on how deep it already went into the
+report tree).
+
+=head2 A reference to a hash
+
+The following shows the raw form of a reference to a hash.
+
+ use Devel::Peek;
+ $a = {hello=>42};
+ Dump $a;
+
+The output:
+
+ SV = RV(0x8177858) at 0x816a618
+ REFCNT = 1
+ FLAGS = (ROK)
+ RV = 0x814fc10
+ SV = PVHV(0x8167768) at 0x814fc10
+ REFCNT = 1
+ FLAGS = (SHAREKEYS)
+ IV = 1
+ NV = 0
+ ARRAY = 0x816c5b8 (0:7, 1:1)
+ hash quality = 100.0%
+ KEYS = 1
+ FILL = 1
+ MAX = 7
+ RITER = -1
+ EITER = 0x0
+ Elt "hello" HASH = 0xc8fd181b
+ SV = IV(0x816c030) at 0x814fcf4
+ REFCNT = 1
+ FLAGS = (IOK,pIOK)
+ IV = 42
+
+This shows C<$a> is a reference pointing to an SV. That SV is a PVHV, a
+hash. Fields RITER and EITER are used by C<L<each>>.
+
+The "quality" of a hash is defined as the total number of comparisons needed
+to access every element once, relative to the expected number needed for a
+random hash. The value can go over 100%.
+
+The total number of comparisons is equal to the sum of the squares of the
+number of entries in each bucket. For a random hash of C<<n>> keys into
+C<<k>> buckets, the expected value is:
+
+ n + n(n-1)/2k
+
+=head2 Dumping a large array or hash
+
+The C<Dump()> function, by default, dumps up to 4 elements from a
+toplevel array or hash. This number can be increased by supplying a
+second argument to the function.
+
+ use Devel::Peek;
+ $a = [10,11,12,13,14];
+ Dump $a;
+
+Notice that C<Dump()> prints only elements 10 through 13 in the above code.
+The following code will print all of the elements.
+
+ use Devel::Peek 'Dump';
+ $a = [10,11,12,13,14];
+ Dump $a, 5;
+
+=head2 A reference to an SV which holds a C pointer
+
+This is what you really need to know as an XS programmer, of course. When
+an XSUB returns a pointer to a C structure that pointer is stored in an SV
+and a reference to that SV is placed on the XSUB stack. So the output from
+an XSUB which uses something like the T_PTROBJ map might look something like
+this:
+
+ SV = RV(0xf381c)
+ REFCNT = 1
+ FLAGS = (ROK)
+ RV = 0xb8ad8
+ SV = PVMG(0xbb3c8)
+ REFCNT = 1
+ FLAGS = (OBJECT,IOK,pIOK)
+ IV = 729160
+ NV = 0
+ PV = 0
+ STASH = 0xc1d10 "CookBookB::Opaque"
+
+This shows that we have an SV which is an RV. That RV points at another
+SV. In this case that second SV is a PVMG, a blessed scalar. Because it is
+blessed it has the C<OBJECT> flag set. Note that an SV which holds a C
+pointer also has the C<IOK> flag set. The C<STASH> is set to the package
+name which this SV was blessed into.
+
+The output from an XSUB which uses something like the T_PTRREF map, which
+doesn't bless the object, might look something like this:
+
+ SV = RV(0xf381c)
+ REFCNT = 1
+ FLAGS = (ROK)
+ RV = 0xb8ad8
+ SV = PVMG(0xbb3c8)
+ REFCNT = 1
+ FLAGS = (IOK,pIOK)
+ IV = 729160
+ NV = 0
+ PV = 0
+
+=head2 A reference to a subroutine
+
+Looks like this:
+
+ SV = RV(0x798ec)
+ REFCNT = 1
+ FLAGS = (TEMP,ROK)
+ RV = 0x1d453c
+ SV = PVCV(0x1c768c)
+ REFCNT = 2
+ FLAGS = ()
+ IV = 0
+ NV = 0
+ COMP_STASH = 0x31068 "main"
+ START = 0xb20e0
+ ROOT = 0xbece0
+ XSUB = 0x0
+ XSUBANY = 0
+ GVGV::GV = 0x1d44e8 "MY" :: "top_targets"
+ FILE = "(eval 5)"
+ DEPTH = 0
+ PADLIST = 0x1c9338
+
+This shows that
+
+=over 4
+
+=item *
+
+the subroutine is not an XSUB (since C<START> and C<ROOT> are
+non-zero, and C<XSUB> is zero);
+
+=item *
+
+that it was compiled in the package C<main>;
+
+=item *
+
+under the name C<MY::top_targets>;
+
+=item *
+
+inside a 5th eval in the program;
+
+=item *
+
+it is not currently executed (see C<DEPTH>);
+
+=item *
+
+it has no prototype (C<PROTOTYPE> field is missing).
+
+=back
+
+=head1 EXPORTS
+
+C<Dump>, C<mstat>, C<DeadCode>, C<DumpArray>, C<DumpWithOP> and
+C<DumpProg>, C<fill_mstats>, C<mstats_fillhash>, C<mstats2hash> by
+default. Additionally available C<SvREFCNT>, C<SvREFCNT_inc> and
+C<SvREFCNT_dec>.
+
+=head1 BUGS
+
+Readers have been known to skip important parts of L<perlguts>, causing much
+frustration for all.
+
+=head1 AUTHOR
+
+Ilya Zakharevich ilya@math.ohio-state.edu
+
+Copyright (c) 1995-98 Ilya Zakharevich. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+Author of this software makes no claim whatsoever about suitability,
+reliability, edability, editability or usability of this product, and
+should not be kept liable for any damage resulting from the use of
+it. If you can use it, you are in luck, if not, I should not be kept
+responsible. Keep a handy copy of your backup tape at hand.
+
+=head1 SEE ALSO
+
+L<perlguts>, and L<perlguts>, again.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Devel/SelfStubber.pm b/Master/tlpkg/tlperl.straw/lib/Devel/SelfStubber.pm
new file mode 100755
index 00000000000..bfdb4430d00
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Devel/SelfStubber.pm
@@ -0,0 +1,152 @@
+package Devel::SelfStubber;
+use File::Spec;
+require SelfLoader;
+@ISA = qw(SelfLoader);
+@EXPORT = 'AUTOLOAD';
+$JUST_STUBS = 1;
+$VERSION = 1.03;
+sub Version {$VERSION}
+
+# Use as
+# perl -e 'use Devel::SelfStubber;Devel::SelfStubber->stub(MODULE_NAME,LIB)'
+# (LIB defaults to '.') e.g.
+# perl -e 'use Devel::SelfStubber;Devel::SelfStubber->stub('Math::BigInt')'
+# would print out stubs needed if you added a __DATA__ before the subs.
+# Setting $Devel::SelfStubber::JUST_STUBS to 0 will print out the whole
+# module with the stubs entered just before the __DATA__
+
+sub _add_to_cache {
+ my($self,$fullname,$pack,$lines, $prototype) = @_;
+ push(@DATA,@{$lines});
+ if($fullname){push(@STUBS,"sub $fullname $prototype;\n")}; # stubs
+ '1;';
+}
+
+sub _package_defined {
+ my($self,$line) = @_;
+ push(@DATA,$line);
+}
+
+sub stub {
+ my($self,$module,$lib) = @_;
+ my($line,$end_data,$fh,$mod_file,$found_selfloader);
+ $lib ||= File::Spec->curdir();
+ ($mod_file = $module) =~ s,::,/,g;
+ $mod_file =~ tr|/|:| if $^O eq 'MacOS';
+
+ $mod_file = File::Spec->catfile($lib, "$mod_file.pm");
+ $fh = "${module}::DATA";
+ my (@BEFORE_DATA, @AFTER_DATA, @AFTER_END);
+ @DATA = @STUBS = ();
+
+ open($fh,$mod_file) || die "Unable to open $mod_file";
+ local $/ = "\n";
+ while(defined ($line = <$fh>) and $line !~ m/^__DATA__/) {
+ push(@BEFORE_DATA,$line);
+ $line =~ /use\s+SelfLoader/ && $found_selfloader++;
+ }
+ (defined ($line) && $line =~ m/^__DATA__/)
+ || die "$mod_file doesn't contain a __DATA__ token";
+ $found_selfloader ||
+ print 'die "\'use SelfLoader;\' statement NOT FOUND!!\n"',"\n";
+ if ($JUST_STUBS) {
+ $self->_load_stubs($module);
+ } else {
+ $self->_load_stubs($module, \@AFTER_END);
+ }
+ if ( fileno($fh) ) {
+ $end_data = 1;
+ while(defined($line = <$fh>)) {
+ push(@AFTER_DATA,$line);
+ }
+ }
+ close($fh);
+ unless ($JUST_STUBS) {
+ print @BEFORE_DATA;
+ }
+ print @STUBS;
+ unless ($JUST_STUBS) {
+ print "1;\n__DATA__\n",@DATA;
+ if($end_data) { print "__END__ DATA\n",@AFTER_DATA; }
+ if(@AFTER_END) { print "__END__\n",@AFTER_END; }
+ }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Devel::SelfStubber - generate stubs for a SelfLoading module
+
+=head1 SYNOPSIS
+
+To generate just the stubs:
+
+ use Devel::SelfStubber;
+ Devel::SelfStubber->stub('MODULENAME','MY_LIB_DIR');
+
+or to generate the whole module with stubs inserted correctly
+
+ use Devel::SelfStubber;
+ $Devel::SelfStubber::JUST_STUBS=0;
+ Devel::SelfStubber->stub('MODULENAME','MY_LIB_DIR');
+
+MODULENAME is the Perl module name, e.g. Devel::SelfStubber,
+NOT 'Devel/SelfStubber' or 'Devel/SelfStubber.pm'.
+
+MY_LIB_DIR defaults to '.' if not present.
+
+=head1 DESCRIPTION
+
+Devel::SelfStubber prints the stubs you need to put in the module
+before the __DATA__ token (or you can get it to print the entire
+module with stubs correctly placed). The stubs ensure that if
+a method is called, it will get loaded. They are needed specifically
+for inherited autoloaded methods.
+
+This is best explained using the following example:
+
+Assume four classes, A,B,C & D.
+
+A is the root class, B is a subclass of A, C is a subclass of B,
+and D is another subclass of A.
+
+ A
+ / \
+ B D
+ /
+ C
+
+If D calls an autoloaded method 'foo' which is defined in class A,
+then the method is loaded into class A, then executed. If C then
+calls method 'foo', and that method was reimplemented in class
+B, but set to be autoloaded, then the lookup mechanism never gets to
+the AUTOLOAD mechanism in B because it first finds the method
+already loaded in A, and so erroneously uses that. If the method
+foo had been stubbed in B, then the lookup mechanism would have
+found the stub, and correctly loaded and used the sub from B.
+
+So, for classes and subclasses to have inheritance correctly
+work with autoloading, you need to ensure stubs are loaded.
+
+The SelfLoader can load stubs automatically at module initialization
+with the statement 'SelfLoader-E<gt>load_stubs()';, but you may wish to
+avoid having the stub loading overhead associated with your
+initialization (though note that the SelfLoader::load_stubs method
+will be called sooner or later - at latest when the first sub
+is being autoloaded). In this case, you can put the sub stubs
+before the __DATA__ token. This can be done manually, but this
+module allows automatic generation of the stubs.
+
+By default it just prints the stubs, but you can set the
+global $Devel::SelfStubber::JUST_STUBS to 0 and it will
+print out the entire module with the stubs positioned correctly.
+
+At the very least, this is useful to see what the SelfLoader
+thinks are stubs - in order to ensure future versions of the
+SelfStubber remain in step with the SelfLoader, the
+SelfStubber actually uses the SelfLoader to determine which
+stubs are needed.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Dumpvalue.pm b/Master/tlpkg/tlperl.straw/lib/Dumpvalue.pm
new file mode 100755
index 00000000000..88e1493d3db
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Dumpvalue.pm
@@ -0,0 +1,648 @@
+use 5.006_001; # for (defined ref) and $#$v and our
+package Dumpvalue;
+use strict;
+our $VERSION = '1.13';
+our(%address, $stab, @stab, %stab, %subs);
+
+# documentation nits, handle complex data structures better by chromatic
+# translate control chars to ^X - Randal Schwartz
+# Modifications to print types by Peter Gordon v1.0
+
+# Ilya Zakharevich -- patches after 5.001 (and some before ;-)
+
+# Won't dump symbol tables and contents of debugged files by default
+
+# (IZ) changes for objectification:
+# c) quote() renamed to method set_quote();
+# d) unctrlSet() renamed to method set_unctrl();
+# f) Compiles with `use strict', but in two places no strict refs is needed:
+# maybe more problems are waiting...
+
+my %defaults = (
+ globPrint => 0,
+ printUndef => 1,
+ tick => "auto",
+ unctrl => 'quote',
+ subdump => 1,
+ dumpReused => 0,
+ bareStringify => 1,
+ hashDepth => '',
+ arrayDepth => '',
+ dumpDBFiles => '',
+ dumpPackages => '',
+ quoteHighBit => '',
+ usageOnly => '',
+ compactDump => '',
+ veryCompact => '',
+ stopDbSignal => '',
+ );
+
+sub new {
+ my $class = shift;
+ my %opt = (%defaults, @_);
+ bless \%opt, $class;
+}
+
+sub set {
+ my $self = shift;
+ my %opt = @_;
+ @$self{keys %opt} = values %opt;
+}
+
+sub get {
+ my $self = shift;
+ wantarray ? @$self{@_} : $$self{pop @_};
+}
+
+sub dumpValue {
+ my $self = shift;
+ die "usage: \$dumper->dumpValue(value)" unless @_ == 1;
+ local %address;
+ local $^W=0;
+ (print "undef\n"), return unless defined $_[0];
+ (print $self->stringify($_[0]), "\n"), return unless ref $_[0];
+ $self->unwrap($_[0],0);
+}
+
+sub dumpValues {
+ my $self = shift;
+ local %address;
+ local $^W=0;
+ (print "undef\n"), return unless defined $_[0];
+ $self->unwrap(\@_,0);
+}
+
+# This one is good for variable names:
+
+sub unctrl {
+ local($_) = @_;
+
+ return \$_ if ref \$_ eq "GLOB";
+ s/([\001-\037\177])/'^'.pack('c',ord($1)^64)/eg;
+ $_;
+}
+
+sub stringify {
+ my $self = shift;
+ local $_ = shift;
+ my $noticks = shift;
+ my $tick = $self->{tick};
+
+ return 'undef' unless defined $_ or not $self->{printUndef};
+ return $_ . "" if ref \$_ eq 'GLOB';
+ { no strict 'refs';
+ $_ = &{'overload::StrVal'}($_)
+ if $self->{bareStringify} and ref $_
+ and %overload:: and defined &{'overload::StrVal'};
+ }
+
+ if ($tick eq 'auto') {
+ if (/[\000-\011\013-\037\177]/) {
+ $tick = '"';
+ } else {
+ $tick = "'";
+ }
+ }
+ if ($tick eq "'") {
+ s/([\'\\])/\\$1/g;
+ } elsif ($self->{unctrl} eq 'unctrl') {
+ s/([\"\\])/\\$1/g ;
+ s/([\000-\037\177])/'^'.pack('c',ord($1)^64)/eg;
+ s/([\200-\377])/'\\0x'.sprintf('%2X',ord($1))/eg
+ if $self->{quoteHighBit};
+ } elsif ($self->{unctrl} eq 'quote') {
+ s/([\"\\\$\@])/\\$1/g if $tick eq '"';
+ s/\033/\\e/g;
+ s/([\000-\037\177])/'\\c'.chr(ord($1)^64)/eg;
+ }
+ s/([\200-\377])/'\\'.sprintf('%3o',ord($1))/eg if $self->{quoteHighBit};
+ ($noticks || /^\d+(\.\d*)?\Z/)
+ ? $_
+ : $tick . $_ . $tick;
+}
+
+sub DumpElem {
+ my ($self, $v) = (shift, shift);
+ my $short = $self->stringify($v, ref $v);
+ my $shortmore = '';
+ if ($self->{veryCompact} && ref $v
+ && (ref $v eq 'ARRAY' and !grep(ref $_, @$v) )) {
+ my $depth = $#$v;
+ ($shortmore, $depth) = (' ...', $self->{arrayDepth} - 1)
+ if $self->{arrayDepth} and $depth >= $self->{arrayDepth};
+ my @a = map $self->stringify($_), @$v[0..$depth];
+ print "0..$#{$v} @a$shortmore\n";
+ } elsif ($self->{veryCompact} && ref $v
+ && (ref $v eq 'HASH') and !grep(ref $_, values %$v)) {
+ my @a = sort keys %$v;
+ my $depth = $#a;
+ ($shortmore, $depth) = (' ...', $self->{hashDepth} - 1)
+ if $self->{hashDepth} and $depth >= $self->{hashDepth};
+ my @b = map {$self->stringify($_) . " => " . $self->stringify($$v{$_})}
+ @a[0..$depth];
+ local $" = ', ';
+ print "@b$shortmore\n";
+ } else {
+ print "$short\n";
+ $self->unwrap($v,shift);
+ }
+}
+
+sub unwrap {
+ my $self = shift;
+ return if $DB::signal and $self->{stopDbSignal};
+ my ($v) = shift ;
+ my ($s) = shift ; # extra no of spaces
+ my $sp;
+ my (%v,@v,$address,$short,$fileno);
+
+ $sp = " " x $s ;
+ $s += 3 ;
+
+ # Check for reused addresses
+ if (ref $v) {
+ my $val = $v;
+ { no strict 'refs';
+ $val = &{'overload::StrVal'}($v)
+ if %overload:: and defined &{'overload::StrVal'};
+ }
+ ($address) = $val =~ /(0x[0-9a-f]+)\)$/ ;
+ if (!$self->{dumpReused} && defined $address) {
+ $address{$address}++ ;
+ if ( $address{$address} > 1 ) {
+ print "${sp}-> REUSED_ADDRESS\n" ;
+ return ;
+ }
+ }
+ } elsif (ref \$v eq 'GLOB') {
+ $address = "$v" . ""; # To avoid a bug with globs
+ $address{$address}++ ;
+ if ( $address{$address} > 1 ) {
+ print "${sp}*DUMPED_GLOB*\n" ;
+ return ;
+ }
+ }
+
+ if (ref $v eq 'Regexp') {
+ my $re = "$v";
+ $re =~ s,/,\\/,g;
+ print "$sp-> qr/$re/\n";
+ return;
+ }
+
+ if ( UNIVERSAL::isa($v, 'HASH') ) {
+ my @sortKeys = sort keys(%$v) ;
+ my $more;
+ my $tHashDepth = $#sortKeys ;
+ $tHashDepth = $#sortKeys < $self->{hashDepth}-1 ? $#sortKeys : $self->{hashDepth}-1
+ unless $self->{hashDepth} eq '' ;
+ $more = "....\n" if $tHashDepth < $#sortKeys ;
+ my $shortmore = "";
+ $shortmore = ", ..." if $tHashDepth < $#sortKeys ;
+ $#sortKeys = $tHashDepth ;
+ if ($self->{compactDump} && !grep(ref $_, values %{$v})) {
+ $short = $sp;
+ my @keys;
+ for (@sortKeys) {
+ push @keys, $self->stringify($_) . " => " . $self->stringify($v->{$_});
+ }
+ $short .= join ', ', @keys;
+ $short .= $shortmore;
+ (print "$short\n"), return if length $short <= $self->{compactDump};
+ }
+ for my $key (@sortKeys) {
+ return if $DB::signal and $self->{stopDbSignal};
+ my $value = $ {$v}{$key} ;
+ print $sp, $self->stringify($key), " => ";
+ $self->DumpElem($value, $s);
+ }
+ print "$sp empty hash\n" unless @sortKeys;
+ print "$sp$more" if defined $more ;
+ } elsif ( UNIVERSAL::isa($v, 'ARRAY') ) {
+ my $tArrayDepth = $#{$v} ;
+ my $more ;
+ $tArrayDepth = $#$v < $self->{arrayDepth}-1 ? $#$v : $self->{arrayDepth}-1
+ unless $self->{arrayDepth} eq '' ;
+ $more = "....\n" if $tArrayDepth < $#{$v} ;
+ my $shortmore = "";
+ $shortmore = " ..." if $tArrayDepth < $#{$v} ;
+ if ($self->{compactDump} && !grep(ref $_, @{$v})) {
+ if ($#$v >= 0) {
+ $short = $sp . "0..$#{$v} " .
+ join(" ",
+ map {exists $v->[$_] ? $self->stringify($v->[$_]) : "empty"} ($[..$tArrayDepth)
+ ) . "$shortmore";
+ } else {
+ $short = $sp . "empty array";
+ }
+ (print "$short\n"), return if length $short <= $self->{compactDump};
+ }
+ for my $num ($[ .. $tArrayDepth) {
+ return if $DB::signal and $self->{stopDbSignal};
+ print "$sp$num ";
+ if (exists $v->[$num]) {
+ $self->DumpElem($v->[$num], $s);
+ } else {
+ print "empty slot\n";
+ }
+ }
+ print "$sp empty array\n" unless @$v;
+ print "$sp$more" if defined $more ;
+ } elsif ( UNIVERSAL::isa($v, 'SCALAR') or ref $v eq 'REF' ) {
+ print "$sp-> ";
+ $self->DumpElem($$v, $s);
+ } elsif ( UNIVERSAL::isa($v, 'CODE') ) {
+ print "$sp-> ";
+ $self->dumpsub(0, $v);
+ } elsif ( UNIVERSAL::isa($v, 'GLOB') ) {
+ print "$sp-> ",$self->stringify($$v,1),"\n";
+ if ($self->{globPrint}) {
+ $s += 3;
+ $self->dumpglob('', $s, "{$$v}", $$v, 1);
+ } elsif (defined ($fileno = fileno($v))) {
+ print( (' ' x ($s+3)) . "FileHandle({$$v}) => fileno($fileno)\n" );
+ }
+ } elsif (ref \$v eq 'GLOB') {
+ if ($self->{globPrint}) {
+ $self->dumpglob('', $s, "{$v}", $v, 1);
+ } elsif (defined ($fileno = fileno(\$v))) {
+ print( (' ' x $s) . "FileHandle({$v}) => fileno($fileno)\n" );
+ }
+ }
+}
+
+sub matchvar {
+ $_[0] eq $_[1] or
+ ($_[1] =~ /^([!~])(.)([\x00-\xff]*)/) and
+ ($1 eq '!') ^ (eval {($_[2] . "::" . $_[0]) =~ /$2$3/});
+}
+
+sub compactDump {
+ my $self = shift;
+ $self->{compactDump} = shift if @_;
+ $self->{compactDump} = 6*80-1
+ if $self->{compactDump} and $self->{compactDump} < 2;
+ $self->{compactDump};
+}
+
+sub veryCompact {
+ my $self = shift;
+ $self->{veryCompact} = shift if @_;
+ $self->compactDump(1) if !$self->{compactDump} and $self->{veryCompact};
+ $self->{veryCompact};
+}
+
+sub set_unctrl {
+ my $self = shift;
+ if (@_) {
+ my $in = shift;
+ if ($in eq 'unctrl' or $in eq 'quote') {
+ $self->{unctrl} = $in;
+ } else {
+ print "Unknown value for `unctrl'.\n";
+ }
+ }
+ $self->{unctrl};
+}
+
+sub set_quote {
+ my $self = shift;
+ if (@_ and $_[0] eq '"') {
+ $self->{tick} = '"';
+ $self->{unctrl} = 'quote';
+ } elsif (@_ and $_[0] eq 'auto') {
+ $self->{tick} = 'auto';
+ $self->{unctrl} = 'quote';
+ } elsif (@_) { # Need to set
+ $self->{tick} = "'";
+ $self->{unctrl} = 'unctrl';
+ }
+ $self->{tick};
+}
+
+sub dumpglob {
+ my $self = shift;
+ return if $DB::signal and $self->{stopDbSignal};
+ my ($package, $off, $key, $val, $all) = @_;
+ local(*stab) = $val;
+ my $fileno;
+ if (($key !~ /^_</ or $self->{dumpDBFiles}) and defined $stab) {
+ print( (' ' x $off) . "\$", &unctrl($key), " = " );
+ $self->DumpElem($stab, 3+$off);
+ }
+ if (($key !~ /^_</ or $self->{dumpDBFiles}) and @stab) {
+ print( (' ' x $off) . "\@$key = (\n" );
+ $self->unwrap(\@stab,3+$off) ;
+ print( (' ' x $off) . ")\n" );
+ }
+ if ($key ne "main::" && $key ne "DB::" && %stab
+ && ($self->{dumpPackages} or $key !~ /::$/)
+ && ($key !~ /^_</ or $self->{dumpDBFiles})
+ && !($package eq "Dumpvalue" and $key eq "stab")) {
+ print( (' ' x $off) . "\%$key = (\n" );
+ $self->unwrap(\%stab,3+$off) ;
+ print( (' ' x $off) . ")\n" );
+ }
+ if (defined ($fileno = fileno(*stab))) {
+ print( (' ' x $off) . "FileHandle($key) => fileno($fileno)\n" );
+ }
+ if ($all) {
+ if (defined &stab) {
+ $self->dumpsub($off, $key);
+ }
+ }
+}
+
+sub CvGV_name {
+ my $self = shift;
+ my $in = shift;
+ return if $self->{skipCvGV}; # Backdoor to avoid problems if XS broken...
+ $in = \&$in; # Hard reference...
+ eval {require Devel::Peek; 1} or return;
+ my $gv = Devel::Peek::CvGV($in) or return;
+ *$gv{PACKAGE} . '::' . *$gv{NAME};
+}
+
+sub dumpsub {
+ my $self = shift;
+ my ($off,$sub) = @_;
+ my $ini = $sub;
+ my $s;
+ $sub = $1 if $sub =~ /^\{\*(.*)\}$/;
+ my $subref = defined $1 ? \&$sub : \&$ini;
+ my $place = $DB::sub{$sub} || (($s = $subs{"$subref"}) && $DB::sub{$s})
+ || (($s = $self->CvGV_name($subref)) && $DB::sub{$s})
+ || ($self->{subdump} && ($s = $self->findsubs("$subref"))
+ && $DB::sub{$s});
+ $s = $sub unless defined $s;
+ $place = '???' unless defined $place;
+ print( (' ' x $off) . "&$s in $place\n" );
+}
+
+sub findsubs {
+ my $self = shift;
+ return undef unless %DB::sub;
+ my ($addr, $name, $loc);
+ while (($name, $loc) = each %DB::sub) {
+ $addr = \&$name;
+ $subs{"$addr"} = $name;
+ }
+ $self->{subdump} = 0;
+ $subs{ shift() };
+}
+
+sub dumpvars {
+ my $self = shift;
+ my ($package,@vars) = @_;
+ local(%address,$^W);
+ my ($key,$val);
+ $package .= "::" unless $package =~ /::$/;
+ *stab = *main::;
+
+ while ($package =~ /(\w+?::)/g) {
+ *stab = $ {stab}{$1};
+ }
+ $self->{TotalStrings} = 0;
+ $self->{Strings} = 0;
+ $self->{CompleteTotal} = 0;
+ while (($key,$val) = each(%stab)) {
+ return if $DB::signal and $self->{stopDbSignal};
+ next if @vars && !grep( matchvar($key, $_), @vars );
+ if ($self->{usageOnly}) {
+ $self->globUsage(\$val, $key)
+ if ($package ne 'Dumpvalue' or $key ne 'stab')
+ and ref(\$val) eq 'GLOB';
+ } else {
+ $self->dumpglob($package, 0,$key, $val);
+ }
+ }
+ if ($self->{usageOnly}) {
+ print <<EOP;
+String space: $self->{TotalStrings} bytes in $self->{Strings} strings.
+EOP
+ $self->{CompleteTotal} += $self->{TotalStrings};
+ print <<EOP;
+Grand total = $self->{CompleteTotal} bytes (1 level deep) + overhead.
+EOP
+ }
+}
+
+sub scalarUsage {
+ my $self = shift;
+ my $size;
+ if (UNIVERSAL::isa($_[0], 'ARRAY')) {
+ $size = $self->arrayUsage($_[0]);
+ } elsif (UNIVERSAL::isa($_[0], 'HASH')) {
+ $size = $self->hashUsage($_[0]);
+ } elsif (!ref($_[0])) {
+ $size = length($_[0]);
+ }
+ $self->{TotalStrings} += $size;
+ $self->{Strings}++;
+ $size;
+}
+
+sub arrayUsage { # array ref, name
+ my $self = shift;
+ my $size = 0;
+ map {$size += $self->scalarUsage($_)} @{$_[0]};
+ my $len = @{$_[0]};
+ print "\@$_[1] = $len item", ($len > 1 ? "s" : ""), " (data: $size bytes)\n"
+ if defined $_[1];
+ $self->{CompleteTotal} += $size;
+ $size;
+}
+
+sub hashUsage { # hash ref, name
+ my $self = shift;
+ my @keys = keys %{$_[0]};
+ my @values = values %{$_[0]};
+ my $keys = $self->arrayUsage(\@keys);
+ my $values = $self->arrayUsage(\@values);
+ my $len = @keys;
+ my $total = $keys + $values;
+ print "\%$_[1] = $len item", ($len > 1 ? "s" : ""),
+ " (keys: $keys; values: $values; total: $total bytes)\n"
+ if defined $_[1];
+ $total;
+}
+
+sub globUsage { # glob ref, name
+ my $self = shift;
+ local *stab = *{$_[0]};
+ my $total = 0;
+ $total += $self->scalarUsage($stab) if defined $stab;
+ $total += $self->arrayUsage(\@stab, $_[1]) if @stab;
+ $total += $self->hashUsage(\%stab, $_[1])
+ if %stab and $_[1] ne "main::" and $_[1] ne "DB::";
+ #and !($package eq "Dumpvalue" and $key eq "stab"));
+ $total;
+}
+
+1;
+
+=head1 NAME
+
+Dumpvalue - provides screen dump of Perl data.
+
+=head1 SYNOPSIS
+
+ use Dumpvalue;
+ my $dumper = Dumpvalue->new;
+ $dumper->set(globPrint => 1);
+ $dumper->dumpValue(\*::);
+ $dumper->dumpvars('main');
+ my $dump = $dumper->stringify($some_value);
+
+=head1 DESCRIPTION
+
+=head2 Creation
+
+A new dumper is created by a call
+
+ $d = Dumpvalue->new(option1 => value1, option2 => value2)
+
+Recognized options:
+
+=over 4
+
+=item C<arrayDepth>, C<hashDepth>
+
+Print only first N elements of arrays and hashes. If false, prints all the
+elements.
+
+=item C<compactDump>, C<veryCompact>
+
+Change style of array and hash dump. If true, short array
+may be printed on one line.
+
+=item C<globPrint>
+
+Whether to print contents of globs.
+
+=item C<dumpDBFiles>
+
+Dump arrays holding contents of debugged files.
+
+=item C<dumpPackages>
+
+Dump symbol tables of packages.
+
+=item C<dumpReused>
+
+Dump contents of "reused" addresses.
+
+=item C<tick>, C<quoteHighBit>, C<printUndef>
+
+Change style of string dump. Default value of C<tick> is C<auto>, one
+can enable either double-quotish dump, or single-quotish by setting it
+to C<"> or C<'>. By default, characters with high bit set are printed
+I<as is>. If C<quoteHighBit> is set, they will be quoted.
+
+=item C<usageOnly>
+
+rudimentally per-package memory usage dump. If set,
+C<dumpvars> calculates total size of strings in variables in the package.
+
+=item unctrl
+
+Changes the style of printout of strings. Possible values are
+C<unctrl> and C<quote>.
+
+=item subdump
+
+Whether to try to find the subroutine name given the reference.
+
+=item bareStringify
+
+Whether to write the non-overloaded form of the stringify-overloaded objects.
+
+=item quoteHighBit
+
+Whether to print chars with high bit set in binary or "as is".
+
+=item stopDbSignal
+
+Whether to abort printing if debugger signal flag is raised.
+
+=back
+
+Later in the life of the object the methods may be queries with get()
+method and set() method (which accept multiple arguments).
+
+=head2 Methods
+
+=over 4
+
+=item dumpValue
+
+ $dumper->dumpValue($value);
+ $dumper->dumpValue([$value1, $value2]);
+
+Prints a dump to the currently selected filehandle.
+
+=item dumpValues
+
+ $dumper->dumpValues($value1, $value2);
+
+Same as C< $dumper->dumpValue([$value1, $value2]); >.
+
+=item stringify
+
+ my $dump = $dumper->stringify($value [,$noticks] );
+
+Returns the dump of a single scalar without printing. If the second
+argument is true, the return value does not contain enclosing ticks.
+Does not handle data structures.
+
+=item dumpvars
+
+ $dumper->dumpvars('my_package');
+ $dumper->dumpvars('my_package', 'foo', '~bar$', '!......');
+
+The optional arguments are considered as literal strings unless they
+start with C<~> or C<!>, in which case they are interpreted as regular
+expressions (possibly negated).
+
+The second example prints entries with names C<foo>, and also entries
+with names which ends on C<bar>, or are shorter than 5 chars.
+
+=item set_quote
+
+ $d->set_quote('"');
+
+Sets C<tick> and C<unctrl> options to suitable values for printout with the
+given quote char. Possible values are C<auto>, C<'> and C<">.
+
+=item set_unctrl
+
+ $d->set_unctrl('unctrl');
+
+Sets C<unctrl> option with checking for an invalid argument.
+Possible values are C<unctrl> and C<quote>.
+
+=item compactDump
+
+ $d->compactDump(1);
+
+Sets C<compactDump> option. If the value is 1, sets to a reasonable
+big number.
+
+=item veryCompact
+
+ $d->veryCompact(1);
+
+Sets C<compactDump> and C<veryCompact> options simultaneously.
+
+=item set
+
+ $d->set(option1 => value1, option2 => value2);
+
+=item get
+
+ @values = $d->get('option1', 'option2');
+
+=back
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/DynaLoader.pm b/Master/tlpkg/tlperl.straw/lib/DynaLoader.pm
new file mode 100755
index 00000000000..8ffc9b7672c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/DynaLoader.pm
@@ -0,0 +1,771 @@
+
+# Generated from DynaLoader_pm.PL
+
+package DynaLoader;
+
+# And Gandalf said: 'Many folk like to know beforehand what is to
+# be set on the table; but those who have laboured to prepare the
+# feast like to keep their secret; for wonder makes the words of
+# praise louder.'
+
+# (Quote from Tolkien suggested by Anno Siegel.)
+#
+# See pod text at end of file for documentation.
+# See also ext/DynaLoader/README in source tree for other information.
+#
+# Tim.Bunce@ig.co.uk, August 1994
+
+BEGIN {
+ $VERSION = '1.10';
+}
+
+require AutoLoader;
+*AUTOLOAD = \&AutoLoader::AUTOLOAD;
+
+use Config;
+
+# enable debug/trace messages from DynaLoader perl code
+$dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug;
+
+#
+# Flags to alter dl_load_file behaviour. Assigned bits:
+# 0x01 make symbols available for linking later dl_load_file's.
+# (only known to work on Solaris 2 using dlopen(RTLD_GLOBAL))
+# (ignored under VMS; effect is built-in to image linking)
+#
+# This is called as a class method $module->dl_load_flags. The
+# definition here will be inherited and result on "default" loading
+# behaviour unless a sub-class of DynaLoader defines its own version.
+#
+
+sub dl_load_flags { 0x00 }
+
+($dl_dlext, $dl_so, $dlsrc) = @Config::Config{qw(dlext so dlsrc)};
+
+
+$do_expand = 0;
+
+
+
+@dl_require_symbols = (); # names of symbols we need
+@dl_resolve_using = (); # names of files to link with
+@dl_library_path = (); # path to look for files
+
+#XSLoader.pm may have added elements before we were required
+#@dl_shared_objects = (); # shared objects for symbols we have
+#@dl_librefs = (); # things we have loaded
+#@dl_modules = (); # Modules we have loaded
+
+# This is a fix to support DLD's unfortunate desire to relink -lc
+@dl_resolve_using = dl_findfile('-lc') if $dlsrc eq "dl_dld.xs";
+
+# Initialise @dl_library_path with the 'standard' library path
+# for this platform as determined by Configure.
+
+push(@dl_library_path, split(' ', $Config::Config{libpth}));
+
+
+my $ldlibpthname = $Config::Config{ldlibpthname};
+my $ldlibpthname_defined = defined $Config::Config{ldlibpthname};
+my $pthsep = $Config::Config{path_sep};
+
+# Add to @dl_library_path any extra directories we can gather from environment
+# during runtime.
+
+if ($ldlibpthname_defined &&
+ exists $ENV{$ldlibpthname}) {
+ push(@dl_library_path, split(/$pthsep/, $ENV{$ldlibpthname}));
+}
+
+# E.g. HP-UX supports both its native SHLIB_PATH *and* LD_LIBRARY_PATH.
+
+if ($ldlibpthname_defined &&
+ $ldlibpthname ne 'LD_LIBRARY_PATH' &&
+ exists $ENV{LD_LIBRARY_PATH}) {
+ push(@dl_library_path, split(/$pthsep/, $ENV{LD_LIBRARY_PATH}));
+}
+
+
+# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here.
+# NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB
+boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) &&
+ !defined(&dl_error);
+
+if ($dl_debug) {
+ print STDERR "DynaLoader.pm loaded (@INC, @dl_library_path)\n";
+ print STDERR "DynaLoader not linked into this perl\n"
+ unless defined(&boot_DynaLoader);
+}
+
+1; # End of main code
+
+
+sub croak { require Carp; Carp::croak(@_) }
+
+sub bootstrap_inherit {
+ my $module = $_[0];
+ local *isa = *{"$module\::ISA"};
+ local @isa = (@isa, 'DynaLoader');
+ # Cannot goto due to delocalization. Will report errors on a wrong line?
+ bootstrap(@_);
+}
+
+# The bootstrap function cannot be autoloaded (without complications)
+# so we define it here:
+
+sub bootstrap {
+ # use local vars to enable $module.bs script to edit values
+ local(@args) = @_;
+ local($module) = $args[0];
+ local(@dirs, $file);
+
+ unless ($module) {
+ require Carp;
+ Carp::confess("Usage: DynaLoader::bootstrap(module)");
+ }
+
+ # A common error on platforms which don't support dynamic loading.
+ # Since it's fatal and potentially confusing we give a detailed message.
+ croak("Can't load module $module, dynamic loading not available in this perl.\n".
+ " (You may need to build a new perl executable which either supports\n".
+ " dynamic loading or has the $module module statically linked into it.)\n")
+ unless defined(&dl_load_file);
+
+
+
+ my @modparts = split(/::/,$module);
+ my $modfname = $modparts[-1];
+
+ # Some systems have restrictions on files names for DLL's etc.
+ # mod2fname returns appropriate file base name (typically truncated)
+ # It may also edit @modparts if required.
+ $modfname = &mod2fname(\@modparts) if defined &mod2fname;
+
+
+
+ my $modpname = join('/',@modparts);
+
+ print STDERR "DynaLoader::bootstrap for $module ",
+ "(auto/$modpname/$modfname.$dl_dlext)\n"
+ if $dl_debug;
+
+ foreach (@INC) {
+
+
+ my $dir = "$_/auto/$modpname";
+
+
+ next unless -d $dir; # skip over uninteresting directories
+
+ # check for common cases to avoid autoload of dl_findfile
+ my $try = "$dir/$modfname.$dl_dlext";
+ last if $file = ($do_expand) ? dl_expandspec($try) : ((-f $try) && $try);
+
+ # no luck here, save dir for possible later dl_findfile search
+ push @dirs, $dir;
+ }
+ # last resort, let dl_findfile have a go in all known locations
+ $file = dl_findfile(map("-L$_",@dirs,@INC), $modfname) unless $file;
+
+ croak("Can't locate loadable object for module $module in \@INC (\@INC contains: @INC)")
+ unless $file; # wording similar to error from 'require'
+
+
+ my $bootname = "boot_$module";
+ $bootname =~ s/\W/_/g;
+ @dl_require_symbols = ($bootname);
+
+ # Execute optional '.bootstrap' perl script for this module.
+ # The .bs file can be used to configure @dl_resolve_using etc to
+ # match the needs of the individual module on this architecture.
+ my $bs = $file;
+ $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library
+ if (-s $bs) { # only read file if it's not empty
+ print STDERR "BS: $bs ($^O, $dlsrc)\n" if $dl_debug;
+ eval { do $bs; };
+ warn "$bs: $@\n" if $@;
+ }
+
+ my $boot_symbol_ref;
+
+
+
+ # Many dynamic extension loading problems will appear to come from
+ # this section of code: XYZ failed at line 123 of DynaLoader.pm.
+ # Often these errors are actually occurring in the initialisation
+ # C code of the extension XS file. Perl reports the error as being
+ # in this perl code simply because this was the last perl code
+ # it executed.
+
+ my $libref = dl_load_file($file, $module->dl_load_flags) or
+ croak("Can't load '$file' for module $module: ".dl_error());
+
+ push(@dl_librefs,$libref); # record loaded object
+
+ my @unresolved = dl_undef_symbols();
+ if (@unresolved) {
+ require Carp;
+ Carp::carp("Undefined symbols present after loading $file: @unresolved\n");
+ }
+
+ $boot_symbol_ref = dl_find_symbol($libref, $bootname) or
+ croak("Can't find '$bootname' symbol in $file\n");
+
+ push(@dl_modules, $module); # record loaded module
+
+ boot:
+ my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file);
+
+ # See comment block above
+
+ push(@dl_shared_objects, $file); # record files loaded
+
+ &$xs(@args);
+}
+
+
+#sub _check_file { # private utility to handle dl_expandspec vs -f tests
+# my($file) = @_;
+# return $file if (!$do_expand && -f $file); # the common case
+# return $file if ( $do_expand && ($file=dl_expandspec($file)));
+# return undef;
+#}
+
+
+# Let autosplit and the autoloader deal with these functions:
+__END__
+
+
+sub dl_findfile {
+ # Read ext/DynaLoader/DynaLoader.doc for detailed information.
+ # This function does not automatically consider the architecture
+ # or the perl library auto directories.
+ my (@args) = @_;
+ my (@dirs, $dir); # which directories to search
+ my (@found); # full paths to real files we have found
+ #my $dl_ext= 'dll'; # $Config::Config{'dlext'} suffix for perl extensions
+ #my $dl_so = 'dll'; # $Config::Config{'so'} suffix for shared libraries
+
+ print STDERR "dl_findfile(@args)\n" if $dl_debug;
+
+ # accumulate directories but process files as they appear
+ arg: foreach(@args) {
+ # Special fast case: full filepath requires no search
+
+
+
+ if (m:/: && -f $_) {
+ push(@found,$_);
+ last arg unless wantarray;
+ next;
+ }
+
+
+ # Deal with directories first:
+ # Using a -L prefix is the preferred option (faster and more robust)
+ if (m:^-L:) { s/^-L//; push(@dirs, $_); next; }
+
+
+
+ # Otherwise we try to try to spot directories by a heuristic
+ # (this is a more complicated issue than it first appears)
+ if (m:/: && -d $_) { push(@dirs, $_); next; }
+
+
+
+ # Only files should get this far...
+ my(@names, $name); # what filenames to look for
+ if (m:-l: ) { # convert -lname to appropriate library name
+ s/-l//;
+ push(@names,"lib$_.$dl_so");
+ push(@names,"lib$_.a");
+ } else { # Umm, a bare name. Try various alternatives:
+ # these should be ordered with the most likely first
+ push(@names,"$_.$dl_dlext") unless m/\.$dl_dlext$/o;
+ push(@names,"$_.$dl_so") unless m/\.$dl_so$/o;
+ push(@names,"lib$_.$dl_so") unless m:/:;
+ push(@names,"$_.a") if !m/\.a$/ and $dlsrc eq "dl_dld.xs";
+ push(@names, $_);
+ }
+ my $dirsep = '/';
+
+ foreach $dir (@dirs, @dl_library_path) {
+ next unless -d $dir;
+
+ foreach $name (@names) {
+ my($file) = "$dir$dirsep$name";
+ print STDERR " checking in $dir for $name\n" if $dl_debug;
+ $file = ($do_expand) ? dl_expandspec($file) : (-f $file && $file);
+ #$file = _check_file($file);
+ if ($file) {
+ push(@found, $file);
+ next arg; # no need to look any further
+ }
+ }
+ }
+ }
+ if ($dl_debug) {
+ foreach(@dirs) {
+ print STDERR " dl_findfile ignored non-existent directory: $_\n" unless -d $_;
+ }
+ print STDERR "dl_findfile found: @found\n";
+ }
+ return $found[0] unless wantarray;
+ @found;
+}
+
+
+sub dl_expandspec {
+ my($spec) = @_;
+ # Optional function invoked if DynaLoader.pm sets $do_expand.
+ # Most systems do not require or use this function.
+ # Some systems may implement it in the dl_*.xs file in which case
+ # this autoload version will not be called but is harmless.
+
+ # This function is designed to deal with systems which treat some
+ # 'filenames' in a special way. For example VMS 'Logical Names'
+ # (something like unix environment variables - but different).
+ # This function should recognise such names and expand them into
+ # full file paths.
+ # Must return undef if $spec is invalid or file does not exist.
+
+ my $file = $spec; # default output to input
+
+
+ return undef unless -f $file;
+
+ print STDERR "dl_expandspec($spec) => $file\n" if $dl_debug;
+ $file;
+}
+
+sub dl_find_symbol_anywhere
+{
+ my $sym = shift;
+ my $libref;
+ foreach $libref (@dl_librefs) {
+ my $symref = dl_find_symbol($libref,$sym);
+ return $symref if $symref;
+ }
+ return undef;
+}
+
+=head1 NAME
+
+DynaLoader - Dynamically load C libraries into Perl code
+
+=head1 SYNOPSIS
+
+ package YourPackage;
+ require DynaLoader;
+ @ISA = qw(... DynaLoader ...);
+ bootstrap YourPackage;
+
+ # optional method for 'global' loading
+ sub dl_load_flags { 0x01 }
+
+
+=head1 DESCRIPTION
+
+This document defines a standard generic interface to the dynamic
+linking mechanisms available on many platforms. Its primary purpose is
+to implement automatic dynamic loading of Perl modules.
+
+This document serves as both a specification for anyone wishing to
+implement the DynaLoader for a new platform and as a guide for
+anyone wishing to use the DynaLoader directly in an application.
+
+The DynaLoader is designed to be a very simple high-level
+interface that is sufficiently general to cover the requirements
+of SunOS, HP-UX, NeXT, Linux, VMS and other platforms.
+
+It is also hoped that the interface will cover the needs of OS/2, NT
+etc and also allow pseudo-dynamic linking (using C<ld -A> at runtime).
+
+It must be stressed that the DynaLoader, by itself, is practically
+useless for accessing non-Perl libraries because it provides almost no
+Perl-to-C 'glue'. There is, for example, no mechanism for calling a C
+library function or supplying arguments. A C::DynaLib module
+is available from CPAN sites which performs that function for some
+common system types. And since the year 2000, there's also Inline::C,
+a module that allows you to write Perl subroutines in C. Also available
+from your local CPAN site.
+
+DynaLoader Interface Summary
+
+ @dl_library_path
+ @dl_resolve_using
+ @dl_require_symbols
+ $dl_debug
+ @dl_librefs
+ @dl_modules
+ @dl_shared_objects
+ Implemented in:
+ bootstrap($modulename) Perl
+ @filepaths = dl_findfile(@names) Perl
+ $flags = $modulename->dl_load_flags Perl
+ $symref = dl_find_symbol_anywhere($symbol) Perl
+
+ $libref = dl_load_file($filename, $flags) C
+ $status = dl_unload_file($libref) C
+ $symref = dl_find_symbol($libref, $symbol) C
+ @symbols = dl_undef_symbols() C
+ dl_install_xsub($name, $symref [, $filename]) C
+ $message = dl_error C
+
+=over 4
+
+=item @dl_library_path
+
+The standard/default list of directories in which dl_findfile() will
+search for libraries etc. Directories are searched in order:
+$dl_library_path[0], [1], ... etc
+
+@dl_library_path is initialised to hold the list of 'normal' directories
+(F</usr/lib>, etc) determined by B<Configure> (C<$Config{'libpth'}>). This should
+ensure portability across a wide range of platforms.
+
+@dl_library_path should also be initialised with any other directories
+that can be determined from the environment at runtime (such as
+LD_LIBRARY_PATH for SunOS).
+
+After initialisation @dl_library_path can be manipulated by an
+application using push and unshift before calling dl_findfile().
+Unshift can be used to add directories to the front of the search order
+either to save search time or to override libraries with the same name
+in the 'normal' directories.
+
+The load function that dl_load_file() calls may require an absolute
+pathname. The dl_findfile() function and @dl_library_path can be
+used to search for and return the absolute pathname for the
+library/object that you wish to load.
+
+=item @dl_resolve_using
+
+A list of additional libraries or other shared objects which can be
+used to resolve any undefined symbols that might be generated by a
+later call to load_file().
+
+This is only required on some platforms which do not handle dependent
+libraries automatically. For example the Socket Perl extension
+library (F<auto/Socket/Socket.so>) contains references to many socket
+functions which need to be resolved when it's loaded. Most platforms
+will automatically know where to find the 'dependent' library (e.g.,
+F</usr/lib/libsocket.so>). A few platforms need to be told the
+location of the dependent library explicitly. Use @dl_resolve_using
+for this.
+
+Example usage:
+
+ @dl_resolve_using = dl_findfile('-lsocket');
+
+=item @dl_require_symbols
+
+A list of one or more symbol names that are in the library/object file
+to be dynamically loaded. This is only required on some platforms.
+
+=item @dl_librefs
+
+An array of the handles returned by successful calls to dl_load_file(),
+made by bootstrap, in the order in which they were loaded.
+Can be used with dl_find_symbol() to look for a symbol in any of
+the loaded files.
+
+=item @dl_modules
+
+An array of module (package) names that have been bootstrap'ed.
+
+=item @dl_shared_objects
+
+An array of file names for the shared objects that were loaded.
+
+=item dl_error()
+
+Syntax:
+
+ $message = dl_error();
+
+Error message text from the last failed DynaLoader function. Note
+that, similar to errno in unix, a successful function call does not
+reset this message.
+
+Implementations should detect the error as soon as it occurs in any of
+the other functions and save the corresponding message for later
+retrieval. This will avoid problems on some platforms (such as SunOS)
+where the error message is very temporary (e.g., dlerror()).
+
+=item $dl_debug
+
+Internal debugging messages are enabled when $dl_debug is set true.
+Currently setting $dl_debug only affects the Perl side of the
+DynaLoader. These messages should help an application developer to
+resolve any DynaLoader usage problems.
+
+$dl_debug is set to C<$ENV{'PERL_DL_DEBUG'}> if defined.
+
+For the DynaLoader developer/porter there is a similar debugging
+variable added to the C code (see dlutils.c) and enabled if Perl was
+built with the B<-DDEBUGGING> flag. This can also be set via the
+PERL_DL_DEBUG environment variable. Set to 1 for minimal information or
+higher for more.
+
+=item dl_findfile()
+
+Syntax:
+
+ @filepaths = dl_findfile(@names)
+
+Determine the full paths (including file suffix) of one or more
+loadable files given their generic names and optionally one or more
+directories. Searches directories in @dl_library_path by default and
+returns an empty list if no files were found.
+
+Names can be specified in a variety of platform independent forms. Any
+names in the form B<-lname> are converted into F<libname.*>, where F<.*> is
+an appropriate suffix for the platform.
+
+If a name does not already have a suitable prefix and/or suffix then
+the corresponding file will be searched for by trying combinations of
+prefix and suffix appropriate to the platform: "$name.o", "lib$name.*"
+and "$name".
+
+If any directories are included in @names they are searched before
+@dl_library_path. Directories may be specified as B<-Ldir>. Any other
+names are treated as filenames to be searched for.
+
+Using arguments of the form C<-Ldir> and C<-lname> is recommended.
+
+Example:
+
+ @dl_resolve_using = dl_findfile(qw(-L/usr/5lib -lposix));
+
+
+=item dl_expandspec()
+
+Syntax:
+
+ $filepath = dl_expandspec($spec)
+
+Some unusual systems, such as VMS, require special filename handling in
+order to deal with symbolic names for files (i.e., VMS's Logical Names).
+
+To support these systems a dl_expandspec() function can be implemented
+either in the F<dl_*.xs> file or code can be added to the autoloadable
+dl_expandspec() function in F<DynaLoader.pm>. See F<DynaLoader.pm> for
+more information.
+
+=item dl_load_file()
+
+Syntax:
+
+ $libref = dl_load_file($filename, $flags)
+
+Dynamically load $filename, which must be the path to a shared object
+or library. An opaque 'library reference' is returned as a handle for
+the loaded object. Returns undef on error.
+
+The $flags argument to alters dl_load_file behaviour.
+Assigned bits:
+
+ 0x01 make symbols available for linking later dl_load_file's.
+ (only known to work on Solaris 2 using dlopen(RTLD_GLOBAL))
+ (ignored under VMS; this is a normal part of image linking)
+
+(On systems that provide a handle for the loaded object such as SunOS
+and HPUX, $libref will be that handle. On other systems $libref will
+typically be $filename or a pointer to a buffer containing $filename.
+The application should not examine or alter $libref in any way.)
+
+This is the function that does the real work. It should use the
+current values of @dl_require_symbols and @dl_resolve_using if required.
+
+ SunOS: dlopen($filename)
+ HP-UX: shl_load($filename)
+ Linux: dld_create_reference(@dl_require_symbols); dld_link($filename)
+ NeXT: rld_load($filename, @dl_resolve_using)
+ VMS: lib$find_image_symbol($filename,$dl_require_symbols[0])
+
+(The dlopen() function is also used by Solaris and some versions of
+Linux, and is a common choice when providing a "wrapper" on other
+mechanisms as is done in the OS/2 port.)
+
+=item dl_unload_file()
+
+Syntax:
+
+ $status = dl_unload_file($libref)
+
+Dynamically unload $libref, which must be an opaque 'library reference' as
+returned from dl_load_file. Returns one on success and zero on failure.
+
+This function is optional and may not necessarily be provided on all platforms.
+If it is defined, it is called automatically when the interpreter exits for
+every shared object or library loaded by DynaLoader::bootstrap. All such
+library references are stored in @dl_librefs by DynaLoader::Bootstrap as it
+loads the libraries. The files are unloaded in last-in, first-out order.
+
+This unloading is usually necessary when embedding a shared-object perl (e.g.
+one configured with -Duseshrplib) within a larger application, and the perl
+interpreter is created and destroyed several times within the lifetime of the
+application. In this case it is possible that the system dynamic linker will
+unload and then subsequently reload the shared libperl without relocating any
+references to it from any files DynaLoaded by the previous incarnation of the
+interpreter. As a result, any shared objects opened by DynaLoader may point to
+a now invalid 'ghost' of the libperl shared object, causing apparently random
+memory corruption and crashes. This behaviour is most commonly seen when using
+Apache and mod_perl built with the APXS mechanism.
+
+ SunOS: dlclose($libref)
+ HP-UX: ???
+ Linux: ???
+ NeXT: ???
+ VMS: ???
+
+(The dlclose() function is also used by Solaris and some versions of
+Linux, and is a common choice when providing a "wrapper" on other
+mechanisms as is done in the OS/2 port.)
+
+=item dl_load_flags()
+
+Syntax:
+
+ $flags = dl_load_flags $modulename;
+
+Designed to be a method call, and to be overridden by a derived class
+(i.e. a class which has DynaLoader in its @ISA). The definition in
+DynaLoader itself returns 0, which produces standard behavior from
+dl_load_file().
+
+=item dl_find_symbol()
+
+Syntax:
+
+ $symref = dl_find_symbol($libref, $symbol)
+
+Return the address of the symbol $symbol or C<undef> if not found. If the
+target system has separate functions to search for symbols of different
+types then dl_find_symbol() should search for function symbols first and
+then other types.
+
+The exact manner in which the address is returned in $symref is not
+currently defined. The only initial requirement is that $symref can
+be passed to, and understood by, dl_install_xsub().
+
+ SunOS: dlsym($libref, $symbol)
+ HP-UX: shl_findsym($libref, $symbol)
+ Linux: dld_get_func($symbol) and/or dld_get_symbol($symbol)
+ NeXT: rld_lookup("_$symbol")
+ VMS: lib$find_image_symbol($libref,$symbol)
+
+
+=item dl_find_symbol_anywhere()
+
+Syntax:
+
+ $symref = dl_find_symbol_anywhere($symbol)
+
+Applies dl_find_symbol() to the members of @dl_librefs and returns
+the first match found.
+
+=item dl_undef_symbols()
+
+Example
+
+ @symbols = dl_undef_symbols()
+
+Return a list of symbol names which remain undefined after load_file().
+Returns C<()> if not known. Don't worry if your platform does not provide
+a mechanism for this. Most do not need it and hence do not provide it,
+they just return an empty list.
+
+
+=item dl_install_xsub()
+
+Syntax:
+
+ dl_install_xsub($perl_name, $symref [, $filename])
+
+Create a new Perl external subroutine named $perl_name using $symref as
+a pointer to the function which implements the routine. This is simply
+a direct call to newXSUB(). Returns a reference to the installed
+function.
+
+The $filename parameter is used by Perl to identify the source file for
+the function if required by die(), caller() or the debugger. If
+$filename is not defined then "DynaLoader" will be used.
+
+
+=item bootstrap()
+
+Syntax:
+
+bootstrap($module)
+
+This is the normal entry point for automatic dynamic loading in Perl.
+
+It performs the following actions:
+
+=over 8
+
+=item *
+
+locates an auto/$module directory by searching @INC
+
+=item *
+
+uses dl_findfile() to determine the filename to load
+
+=item *
+
+sets @dl_require_symbols to C<("boot_$module")>
+
+=item *
+
+executes an F<auto/$module/$module.bs> file if it exists
+(typically used to add to @dl_resolve_using any files which
+are required to load the module on the current platform)
+
+=item *
+
+calls dl_load_flags() to determine how to load the file.
+
+=item *
+
+calls dl_load_file() to load the file
+
+=item *
+
+calls dl_undef_symbols() and warns if any symbols are undefined
+
+=item *
+
+calls dl_find_symbol() for "boot_$module"
+
+=item *
+
+calls dl_install_xsub() to install it as "${module}::bootstrap"
+
+=item *
+
+calls &{"${module}::bootstrap"} to bootstrap the module (actually
+it uses the function reference returned by dl_install_xsub for speed)
+
+=back
+
+=back
+
+
+=head1 AUTHOR
+
+Tim Bunce, 11 August 1994.
+
+This interface is based on the work and comments of (in no particular
+order): Larry Wall, Robert Sanders, Dean Roehrich, Jeff Okamoto, Anno
+Siegel, Thomas Neumann, Paul Marquess, Charles Bailey, myself and others.
+
+Larry Wall designed the elegant inherited bootstrap mechanism and
+implemented the first Perl 5 dynamic loader using it.
+
+Solaris global loading added by Nick Ing-Simmons with design/coding
+assistance from Tim Bunce, January 1996.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode.pm b/Master/tlpkg/tlperl.straw/lib/Encode.pm
new file mode 100755
index 00000000000..f1dff7820c2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode.pm
@@ -0,0 +1,963 @@
+#
+# $Id: Encode.pm,v 2.39 2009/11/26 09:23:48 dankogai Exp $
+#
+package Encode;
+use strict;
+use warnings;
+our $VERSION = sprintf "%d.%02d", q$Revision: 2.39 $ =~ /(\d+)/g;
+sub DEBUG () { 0 }
+use XSLoader ();
+XSLoader::load( __PACKAGE__, $VERSION );
+
+require Exporter;
+use base qw/Exporter/;
+
+# Public, encouraged API is exported by default
+
+our @EXPORT = qw(
+ decode decode_utf8 encode encode_utf8 str2bytes bytes2str
+ encodings find_encoding clone_encoding
+);
+our @FB_FLAGS = qw(
+ DIE_ON_ERR WARN_ON_ERR RETURN_ON_ERR LEAVE_SRC
+ PERLQQ HTMLCREF XMLCREF STOP_AT_PARTIAL
+);
+our @FB_CONSTS = qw(
+ FB_DEFAULT FB_CROAK FB_QUIET FB_WARN
+ FB_PERLQQ FB_HTMLCREF FB_XMLCREF
+);
+our @EXPORT_OK = (
+ qw(
+ _utf8_off _utf8_on define_encoding from_to is_16bit is_8bit
+ is_utf8 perlio_ok resolve_alias utf8_downgrade utf8_upgrade
+ ),
+ @FB_FLAGS, @FB_CONSTS,
+);
+
+our %EXPORT_TAGS = (
+ all => [ @EXPORT, @EXPORT_OK ],
+ default => [ @EXPORT ],
+ fallbacks => [ @FB_CONSTS ],
+ fallback_all => [ @FB_CONSTS, @FB_FLAGS ],
+);
+
+# Documentation moved after __END__ for speed - NI-S
+
+our $ON_EBCDIC = ( ord("A") == 193 );
+
+use Encode::Alias;
+
+# Make a %Encoding package variable to allow a certain amount of cheating
+our %Encoding;
+our %ExtModule;
+require Encode::Config;
+# See
+# https://bugzilla.redhat.com/show_bug.cgi?id=435505#c2
+# to find why sig handers inside eval{} are disabled.
+eval {
+ local $SIG{__DIE__};
+ local $SIG{__WARN__};
+ require Encode::ConfigLocal;
+};
+
+sub encodings {
+ my $class = shift;
+ my %enc;
+ if ( @_ and $_[0] eq ":all" ) {
+ %enc = ( %Encoding, %ExtModule );
+ }
+ else {
+ %enc = %Encoding;
+ for my $mod ( map { m/::/o ? $_ : "Encode::$_" } @_ ) {
+ DEBUG and warn $mod;
+ for my $enc ( keys %ExtModule ) {
+ $ExtModule{$enc} eq $mod and $enc{$enc} = $mod;
+ }
+ }
+ }
+ return sort { lc $a cmp lc $b }
+ grep { !/^(?:Internal|Unicode|Guess)$/o } keys %enc;
+}
+
+sub perlio_ok {
+ my $obj = ref( $_[0] ) ? $_[0] : find_encoding( $_[0] );
+ $obj->can("perlio_ok") and return $obj->perlio_ok();
+ return 0; # safety net
+}
+
+sub define_encoding {
+ my $obj = shift;
+ my $name = shift;
+ $Encoding{$name} = $obj;
+ my $lc = lc($name);
+ define_alias( $lc => $obj ) unless $lc eq $name;
+ while (@_) {
+ my $alias = shift;
+ define_alias( $alias, $obj );
+ }
+ return $obj;
+}
+
+sub getEncoding {
+ my ( $class, $name, $skip_external ) = @_;
+
+ ref($name) && $name->can('renew') and return $name;
+ exists $Encoding{$name} and return $Encoding{$name};
+ my $lc = lc $name;
+ exists $Encoding{$lc} and return $Encoding{$lc};
+
+ my $oc = $class->find_alias($name);
+ defined($oc) and return $oc;
+ $lc ne $name and $oc = $class->find_alias($lc);
+ defined($oc) and return $oc;
+
+ unless ($skip_external) {
+ if ( my $mod = $ExtModule{$name} || $ExtModule{$lc} ) {
+ $mod =~ s,::,/,g;
+ $mod .= '.pm';
+ eval { require $mod; };
+ exists $Encoding{$name} and return $Encoding{$name};
+ }
+ }
+ return;
+}
+
+sub find_encoding($;$) {
+ my ( $name, $skip_external ) = @_;
+ return __PACKAGE__->getEncoding( $name, $skip_external );
+}
+
+sub resolve_alias($) {
+ my $obj = find_encoding(shift);
+ defined $obj and return $obj->name;
+ return;
+}
+
+sub clone_encoding($) {
+ my $obj = find_encoding(shift);
+ ref $obj or return;
+ eval { require Storable };
+ $@ and return;
+ return Storable::dclone($obj);
+}
+
+sub encode($$;$) {
+ my ( $name, $string, $check ) = @_;
+ return undef unless defined $string;
+ $string .= '' if ref $string; # stringify;
+ $check ||= 0;
+ unless ( defined $name ) {
+ require Carp;
+ Carp::croak("Encoding name should not be undef");
+ }
+ my $enc = find_encoding($name);
+ unless ( defined $enc ) {
+ require Carp;
+ Carp::croak("Unknown encoding '$name'");
+ }
+ my $octets = $enc->encode( $string, $check );
+ $_[1] = $string if $check and !ref $check and !( $check & LEAVE_SRC() );
+ return $octets;
+}
+*str2bytes = \&encode;
+
+sub decode($$;$) {
+ my ( $name, $octets, $check ) = @_;
+ return undef unless defined $octets;
+ $octets .= '' if ref $octets;
+ $check ||= 0;
+ my $enc = find_encoding($name);
+ unless ( defined $enc ) {
+ require Carp;
+ Carp::croak("Unknown encoding '$name'");
+ }
+ my $string = $enc->decode( $octets, $check );
+ $_[1] = $octets if $check and !ref $check and !( $check & LEAVE_SRC() );
+ return $string;
+}
+*bytes2str = \&decode;
+
+sub from_to($$$;$) {
+ my ( $string, $from, $to, $check ) = @_;
+ return undef unless defined $string;
+ $check ||= 0;
+ my $f = find_encoding($from);
+ unless ( defined $f ) {
+ require Carp;
+ Carp::croak("Unknown encoding '$from'");
+ }
+ my $t = find_encoding($to);
+ unless ( defined $t ) {
+ require Carp;
+ Carp::croak("Unknown encoding '$to'");
+ }
+ my $uni = $f->decode($string);
+ $_[0] = $string = $t->encode( $uni, $check );
+ return undef if ( $check && length($uni) );
+ return defined( $_[0] ) ? length($string) : undef;
+}
+
+sub encode_utf8($) {
+ my ($str) = @_;
+ utf8::encode($str);
+ return $str;
+}
+
+sub decode_utf8($;$) {
+ my ( $str, $check ) = @_;
+ return $str if is_utf8($str);
+ if ($check) {
+ return decode( "utf8", $str, $check );
+ }
+ else {
+ return decode( "utf8", $str );
+ return $str;
+ }
+}
+
+predefine_encodings(1);
+
+#
+# This is to restore %Encoding if really needed;
+#
+
+sub predefine_encodings {
+ require Encode::Encoding;
+ no warnings 'redefine';
+ my $use_xs = shift;
+ if ($ON_EBCDIC) {
+
+ # was in Encode::UTF_EBCDIC
+ package Encode::UTF_EBCDIC;
+ push @Encode::UTF_EBCDIC::ISA, 'Encode::Encoding';
+ *decode = sub {
+ my ( $obj, $str, $chk ) = @_;
+ my $res = '';
+ for ( my $i = 0 ; $i < length($str) ; $i++ ) {
+ $res .=
+ chr(
+ utf8::unicode_to_native( ord( substr( $str, $i, 1 ) ) )
+ );
+ }
+ $_[1] = '' if $chk;
+ return $res;
+ };
+ *encode = sub {
+ my ( $obj, $str, $chk ) = @_;
+ my $res = '';
+ for ( my $i = 0 ; $i < length($str) ; $i++ ) {
+ $res .=
+ chr(
+ utf8::native_to_unicode( ord( substr( $str, $i, 1 ) ) )
+ );
+ }
+ $_[1] = '' if $chk;
+ return $res;
+ };
+ $Encode::Encoding{Unicode} =
+ bless { Name => "UTF_EBCDIC" } => "Encode::UTF_EBCDIC";
+ }
+ else {
+
+ package Encode::Internal;
+ push @Encode::Internal::ISA, 'Encode::Encoding';
+ *decode = sub {
+ my ( $obj, $str, $chk ) = @_;
+ utf8::upgrade($str);
+ $_[1] = '' if $chk;
+ return $str;
+ };
+ *encode = \&decode;
+ $Encode::Encoding{Unicode} =
+ bless { Name => "Internal" } => "Encode::Internal";
+ }
+
+ {
+
+ # was in Encode::utf8
+ package Encode::utf8;
+ push @Encode::utf8::ISA, 'Encode::Encoding';
+
+ #
+ if ($use_xs) {
+ Encode::DEBUG and warn __PACKAGE__, " XS on";
+ *decode = \&decode_xs;
+ *encode = \&encode_xs;
+ }
+ else {
+ Encode::DEBUG and warn __PACKAGE__, " XS off";
+ *decode = sub {
+ my ( $obj, $octets, $chk ) = @_;
+ my $str = Encode::decode_utf8($octets);
+ if ( defined $str ) {
+ $_[1] = '' if $chk;
+ return $str;
+ }
+ return undef;
+ };
+ *encode = sub {
+ my ( $obj, $string, $chk ) = @_;
+ my $octets = Encode::encode_utf8($string);
+ $_[1] = '' if $chk;
+ return $octets;
+ };
+ }
+ *cat_decode = sub { # ($obj, $dst, $src, $pos, $trm, $chk)
+ # currently ignores $chk
+ my ( $obj, undef, undef, $pos, $trm ) = @_;
+ my ( $rdst, $rsrc, $rpos ) = \@_[ 1, 2, 3 ];
+ use bytes;
+ if ( ( my $npos = index( $$rsrc, $trm, $pos ) ) >= 0 ) {
+ $$rdst .=
+ substr( $$rsrc, $pos, $npos - $pos + length($trm) );
+ $$rpos = $npos + length($trm);
+ return 1;
+ }
+ $$rdst .= substr( $$rsrc, $pos );
+ $$rpos = length($$rsrc);
+ return '';
+ };
+ $Encode::Encoding{utf8} =
+ bless { Name => "utf8" } => "Encode::utf8";
+ $Encode::Encoding{"utf-8-strict"} =
+ bless { Name => "utf-8-strict", strict_utf8 => 1 } =>
+ "Encode::utf8";
+ }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Encode - character encodings
+
+=head1 SYNOPSIS
+
+ use Encode;
+
+=head2 Table of Contents
+
+Encode consists of a collection of modules whose details are too big
+to fit in one document. This POD itself explains the top-level APIs
+and general topics at a glance. For other topics and more details,
+see the PODs below:
+
+ Name Description
+ --------------------------------------------------------
+ Encode::Alias Alias definitions to encodings
+ Encode::Encoding Encode Implementation Base Class
+ Encode::Supported List of Supported Encodings
+ Encode::CN Simplified Chinese Encodings
+ Encode::JP Japanese Encodings
+ Encode::KR Korean Encodings
+ Encode::TW Traditional Chinese Encodings
+ --------------------------------------------------------
+
+=head1 DESCRIPTION
+
+The C<Encode> module provides the interfaces between Perl's strings
+and the rest of the system. Perl strings are sequences of
+B<characters>.
+
+The repertoire of characters that Perl can represent is at least that
+defined by the Unicode Consortium. On most platforms the ordinal
+values of the characters (as returned by C<ord(ch)>) is the "Unicode
+codepoint" for the character (the exceptions are those platforms where
+the legacy encoding is some variant of EBCDIC rather than a super-set
+of ASCII - see L<perlebcdic>).
+
+Traditionally, computer data has been moved around in 8-bit chunks
+often called "bytes". These chunks are also known as "octets" in
+networking standards. Perl is widely used to manipulate data of many
+types - not only strings of characters representing human or computer
+languages but also "binary" data being the machine's representation of
+numbers, pixels in an image - or just about anything.
+
+When Perl is processing "binary data", the programmer wants Perl to
+process "sequences of bytes". This is not a problem for Perl - as a
+byte has 256 possible values, it easily fits in Perl's much larger
+"logical character".
+
+=head2 TERMINOLOGY
+
+=over 2
+
+=item *
+
+I<character>: a character in the range 0..(2**32-1) (or more).
+(What Perl's strings are made of.)
+
+=item *
+
+I<byte>: a character in the range 0..255
+(A special case of a Perl character.)
+
+=item *
+
+I<octet>: 8 bits of data, with ordinal values 0..255
+(Term for bytes passed to or from a non-Perl context, e.g. a disk file.)
+
+=back
+
+=head1 PERL ENCODING API
+
+=over 2
+
+=item $octets = encode(ENCODING, $string [, CHECK])
+
+Encodes a string from Perl's internal form into I<ENCODING> and returns
+a sequence of octets. ENCODING can be either a canonical name or
+an alias. For encoding names and aliases, see L</"Defining Aliases">.
+For CHECK, see L</"Handling Malformed Data">.
+
+For example, to convert a string from Perl's internal format to
+iso-8859-1 (also known as Latin1),
+
+ $octets = encode("iso-8859-1", $string);
+
+B<CAVEAT>: When you run C<$octets = encode("utf8", $string)>, then
+$octets B<may not be equal to> $string. Though they both contain the
+same data, the UTF8 flag for $octets is B<always> off. When you
+encode anything, UTF8 flag of the result is always off, even when it
+contains completely valid utf8 string. See L</"The UTF8 flag"> below.
+
+If the $string is C<undef> then C<undef> is returned.
+
+=item $string = decode(ENCODING, $octets [, CHECK])
+
+Decodes a sequence of octets assumed to be in I<ENCODING> into Perl's
+internal form and returns the resulting string. As in encode(),
+ENCODING can be either a canonical name or an alias. For encoding names
+and aliases, see L</"Defining Aliases">. For CHECK, see
+L</"Handling Malformed Data">.
+
+For example, to convert ISO-8859-1 data to a string in Perl's internal format:
+
+ $string = decode("iso-8859-1", $octets);
+
+B<CAVEAT>: When you run C<$string = decode("utf8", $octets)>, then $string
+B<may not be equal to> $octets. Though they both contain the same data,
+the UTF8 flag for $string is on unless $octets entirely consists of
+ASCII data (or EBCDIC on EBCDIC machines). See L</"The UTF8 flag">
+below.
+
+If the $string is C<undef> then C<undef> is returned.
+
+=item [$obj =] find_encoding(ENCODING)
+
+Returns the I<encoding object> corresponding to ENCODING. Returns
+undef if no matching ENCODING is find.
+
+This object is what actually does the actual (en|de)coding.
+
+ $utf8 = decode($name, $bytes);
+
+is in fact
+
+ $utf8 = do{
+ $obj = find_encoding($name);
+ croak qq(encoding "$name" not found) unless ref $obj;
+ $obj->decode($bytes)
+ };
+
+with more error checking.
+
+Therefore you can save time by reusing this object as follows;
+
+ my $enc = find_encoding("iso-8859-1");
+ while(<>){
+ my $utf8 = $enc->decode($_);
+ # and do someting with $utf8;
+ }
+
+Besides C<< ->decode >> and C<< ->encode >>, other methods are
+available as well. For instance, C<< -> name >> returns the canonical
+name of the encoding object.
+
+ find_encoding("latin1")->name; # iso-8859-1
+
+See L<Encode::Encoding> for details.
+
+=item [$length =] from_to($octets, FROM_ENC, TO_ENC [, CHECK])
+
+Converts B<in-place> data between two encodings. The data in $octets
+must be encoded as octets and not as characters in Perl's internal
+format. For example, to convert ISO-8859-1 data to Microsoft's CP1250
+encoding:
+
+ from_to($octets, "iso-8859-1", "cp1250");
+
+and to convert it back:
+
+ from_to($octets, "cp1250", "iso-8859-1");
+
+Note that because the conversion happens in place, the data to be
+converted cannot be a string constant; it must be a scalar variable.
+
+from_to() returns the length of the converted string in octets on
+success, I<undef> on error.
+
+B<CAVEAT>: The following operations look the same but are not quite so;
+
+ from_to($data, "iso-8859-1", "utf8"); #1
+ $data = decode("iso-8859-1", $data); #2
+
+Both #1 and #2 make $data consist of a completely valid UTF-8 string
+but only #2 turns UTF8 flag on. #1 is equivalent to
+
+ $data = encode("utf8", decode("iso-8859-1", $data));
+
+See L</"The UTF8 flag"> below.
+
+Also note that
+
+ from_to($octets, $from, $to, $check);
+
+is equivalent to
+
+ $octets = encode($to, decode($from, $octets), $check);
+
+Yes, it does not respect the $check during decoding. It is
+deliberately done that way. If you need minute control, C<decode>
+then C<encode> as follows;
+
+ $octets = encode($to, decode($from, $octets, $check_from), $check_to);
+
+=item $octets = encode_utf8($string);
+
+Equivalent to C<$octets = encode("utf8", $string);> The characters
+that comprise $string are encoded in Perl's internal format and the
+result is returned as a sequence of octets. All possible
+characters have a UTF-8 representation so this function cannot fail.
+
+
+=item $string = decode_utf8($octets [, CHECK]);
+
+equivalent to C<$string = decode("utf8", $octets [, CHECK])>.
+The sequence of octets represented by
+$octets is decoded from UTF-8 into a sequence of logical
+characters. Not all sequences of octets form valid UTF-8 encodings, so
+it is possible for this call to fail. For CHECK, see
+L</"Handling Malformed Data">.
+
+=back
+
+=head2 Listing available encodings
+
+ use Encode;
+ @list = Encode->encodings();
+
+Returns a list of the canonical names of the available encodings that
+are loaded. To get a list of all available encodings including the
+ones that are not loaded yet, say
+
+ @all_encodings = Encode->encodings(":all");
+
+Or you can give the name of a specific module.
+
+ @with_jp = Encode->encodings("Encode::JP");
+
+When "::" is not in the name, "Encode::" is assumed.
+
+ @ebcdic = Encode->encodings("EBCDIC");
+
+To find out in detail which encodings are supported by this package,
+see L<Encode::Supported>.
+
+=head2 Defining Aliases
+
+To add a new alias to a given encoding, use:
+
+ use Encode;
+ use Encode::Alias;
+ define_alias(newName => ENCODING);
+
+After that, newName can be used as an alias for ENCODING.
+ENCODING may be either the name of an encoding or an
+I<encoding object>
+
+But before you do so, make sure the alias is nonexistent with
+C<resolve_alias()>, which returns the canonical name thereof.
+i.e.
+
+ Encode::resolve_alias("latin1") eq "iso-8859-1" # true
+ Encode::resolve_alias("iso-8859-12") # false; nonexistent
+ Encode::resolve_alias($name) eq $name # true if $name is canonical
+
+resolve_alias() does not need C<use Encode::Alias>; it can be
+exported via C<use Encode qw(resolve_alias)>.
+
+See L<Encode::Alias> for details.
+
+=head2 Finding IANA Character Set Registry names
+
+The canonical name of a given encoding does not necessarily agree with
+IANA IANA Character Set Registry, commonly seen as C<< Content-Type:
+text/plain; charset=I<whatever> >>. For most cases canonical names
+work but sometimes it does not (notably 'utf-8-strict').
+
+Therefore as of Encode version 2.21, a new method C<mime_name()> is added.
+
+ use Encode;
+ my $enc = find_encoding('UTF-8');
+ warn $enc->name; # utf-8-strict
+ warn $enc->mime_name; # UTF-8
+
+See also: L<Encode::Encoding>
+
+=head1 Encoding via PerlIO
+
+If your perl supports I<PerlIO> (which is the default), you can use a
+PerlIO layer to decode and encode directly via a filehandle. The
+following two examples are totally identical in their functionality.
+
+ # via PerlIO
+ open my $in, "<:encoding(shiftjis)", $infile or die;
+ open my $out, ">:encoding(euc-jp)", $outfile or die;
+ while(<$in>){ print $out $_; }
+
+ # via from_to
+ open my $in, "<", $infile or die;
+ open my $out, ">", $outfile or die;
+ while(<$in>){
+ from_to($_, "shiftjis", "euc-jp", 1);
+ print $out $_;
+ }
+
+Unfortunately, it may be that encodings are PerlIO-savvy. You can check
+if your encoding is supported by PerlIO by calling the C<perlio_ok>
+method.
+
+ Encode::perlio_ok("hz"); # False
+ find_encoding("euc-cn")->perlio_ok; # True where PerlIO is available
+
+ use Encode qw(perlio_ok); # exported upon request
+ perlio_ok("euc-jp")
+
+Fortunately, all encodings that come with Encode core are PerlIO-savvy
+except for hz and ISO-2022-kr. For gory details, see
+L<Encode::Encoding> and L<Encode::PerlIO>.
+
+=head1 Handling Malformed Data
+
+The optional I<CHECK> argument tells Encode what to do when it
+encounters malformed data. Without CHECK, Encode::FB_DEFAULT ( == 0 )
+is assumed.
+
+As of version 2.12 Encode supports coderef values for CHECK. See below.
+
+=over 2
+
+=item B<NOTE:> Not all encoding support this feature
+
+Some encodings ignore I<CHECK> argument. For example,
+L<Encode::Unicode> ignores I<CHECK> and it always croaks on error.
+
+=back
+
+Now here is the list of I<CHECK> values available
+
+=over 2
+
+=item I<CHECK> = Encode::FB_DEFAULT ( == 0)
+
+If I<CHECK> is 0, (en|de)code will put a I<substitution character> in
+place of a malformed character. When you encode, E<lt>subcharE<gt>
+will be used. When you decode the code point C<0xFFFD> is used. If
+the data is supposed to be UTF-8, an optional lexical warning
+(category utf8) is given.
+
+=item I<CHECK> = Encode::FB_CROAK ( == 1)
+
+If I<CHECK> is 1, methods will die on error immediately with an error
+message. Therefore, when I<CHECK> is set to 1, you should trap the
+error with eval{} unless you really want to let it die.
+
+=item I<CHECK> = Encode::FB_QUIET
+
+If I<CHECK> is set to Encode::FB_QUIET, (en|de)code will immediately
+return the portion of the data that has been processed so far when an
+error occurs. The data argument will be overwritten with everything
+after that point (that is, the unprocessed part of data). This is
+handy when you have to call decode repeatedly in the case where your
+source data may contain partial multi-byte character sequences,
+(i.e. you are reading with a fixed-width buffer). Here is a sample
+code that does exactly this:
+
+ my $buffer = ''; my $string = '';
+ while(read $fh, $buffer, 256, length($buffer)){
+ $string .= decode($encoding, $buffer, Encode::FB_QUIET);
+ # $buffer now contains the unprocessed partial character
+ }
+
+=item I<CHECK> = Encode::FB_WARN
+
+This is the same as above, except that it warns on error. Handy when
+you are debugging the mode above.
+
+=item perlqq mode (I<CHECK> = Encode::FB_PERLQQ)
+
+=item HTML charref mode (I<CHECK> = Encode::FB_HTMLCREF)
+
+=item XML charref mode (I<CHECK> = Encode::FB_XMLCREF)
+
+For encodings that are implemented by Encode::XS, CHECK ==
+Encode::FB_PERLQQ turns (en|de)code into C<perlqq> fallback mode.
+
+When you decode, C<\xI<HH>> will be inserted for a malformed character,
+where I<HH> is the hex representation of the octet that could not be
+decoded to utf8. And when you encode, C<\x{I<HHHH>}> will be inserted,
+where I<HHHH> is the Unicode ID of the character that cannot be found
+in the character repertoire of the encoding.
+
+HTML/XML character reference modes are about the same, in place of
+C<\x{I<HHHH>}>, HTML uses C<&#I<NNN>;> where I<NNN> is a decimal number and
+XML uses C<&#xI<HHHH>;> where I<HHHH> is the hexadecimal number.
+
+In Encode 2.10 or later, C<LEAVE_SRC> is also implied.
+
+=item The bitmask
+
+These modes are actually set via a bitmask. Here is how the FB_XX
+constants are laid out. You can import the FB_XX constants via
+C<use Encode qw(:fallbacks)>; you can import the generic bitmask
+constants via C<use Encode qw(:fallback_all)>.
+
+ FB_DEFAULT FB_CROAK FB_QUIET FB_WARN FB_PERLQQ
+ DIE_ON_ERR 0x0001 X
+ WARN_ON_ERR 0x0002 X
+ RETURN_ON_ERR 0x0004 X X
+ LEAVE_SRC 0x0008 X
+ PERLQQ 0x0100 X
+ HTMLCREF 0x0200
+ XMLCREF 0x0400
+
+=back
+
+=over 2
+
+=item Encode::LEAVE_SRC
+
+If the C<Encode::LEAVE_SRC> bit is not set, but I<CHECK> is, then the second
+argument to C<encode()> or C<decode()> may be assigned to by the functions. If
+you're not interested in this, then bitwise-or the bitmask with it.
+
+=back
+
+=head2 coderef for CHECK
+
+As of Encode 2.12 CHECK can also be a code reference which takes the
+ord value of unmapped caharacter as an argument and returns a string
+that represents the fallback character. For instance,
+
+ $ascii = encode("ascii", $utf8, sub{ sprintf "<U+%04X>", shift });
+
+Acts like FB_PERLQQ but E<lt>U+I<XXXX>E<gt> is used instead of
+\x{I<XXXX>}.
+
+=head1 Defining Encodings
+
+To define a new encoding, use:
+
+ use Encode qw(define_encoding);
+ define_encoding($object, 'canonicalName' [, alias...]);
+
+I<canonicalName> will be associated with I<$object>. The object
+should provide the interface described in L<Encode::Encoding>.
+If more than two arguments are provided then additional
+arguments are taken as aliases for I<$object>.
+
+See L<Encode::Encoding> for more details.
+
+=head1 The UTF8 flag
+
+Before the introduction of Unicode support in perl, The C<eq> operator
+just compared the strings represented by two scalars. Beginning with
+perl 5.8, C<eq> compares two strings with simultaneous consideration of
+I<the UTF8 flag>. To explain why we made it so, I will quote page 402 of
+C<Programming Perl, 3rd ed.>
+
+=over 2
+
+=item Goal #1:
+
+Old byte-oriented programs should not spontaneously break on the old
+byte-oriented data they used to work on.
+
+=item Goal #2:
+
+Old byte-oriented programs should magically start working on the new
+character-oriented data when appropriate.
+
+=item Goal #3:
+
+Programs should run just as fast in the new character-oriented mode
+as in the old byte-oriented mode.
+
+=item Goal #4:
+
+Perl should remain one language, rather than forking into a
+byte-oriented Perl and a character-oriented Perl.
+
+=back
+
+Back when C<Programming Perl, 3rd ed.> was written, not even Perl 5.6.0
+was born and many features documented in the book remained
+unimplemented for a long time. Perl 5.8 corrected this and the introduction
+of the UTF8 flag is one of them. You can think of this perl notion as of a
+byte-oriented mode (UTF8 flag off) and a character-oriented mode (UTF8
+flag on).
+
+Here is how Encode takes care of the UTF8 flag.
+
+=over 2
+
+=item *
+
+When you encode, the resulting UTF8 flag is always off.
+
+=item *
+
+When you decode, the resulting UTF8 flag is on unless you can
+unambiguously represent data. Here is the definition of
+dis-ambiguity.
+
+After C<$utf8 = decode('foo', $octet);>,
+
+ When $octet is... The UTF8 flag in $utf8 is
+ ---------------------------------------------
+ In ASCII only (or EBCDIC only) OFF
+ In ISO-8859-1 ON
+ In any other Encoding ON
+ ---------------------------------------------
+
+As you see, there is one exception, In ASCII. That way you can assume
+Goal #1. And with Encode Goal #2 is assumed but you still have to be
+careful in such cases mentioned in B<CAVEAT> paragraphs.
+
+This UTF8 flag is not visible in perl scripts, exactly for the same
+reason you cannot (or you I<don't have to>) see if a scalar contains a
+string, integer, or floating point number. But you can still peek
+and poke these if you will. See the section below.
+
+=back
+
+=head2 Messing with Perl's Internals
+
+The following API uses parts of Perl's internals in the current
+implementation. As such, they are efficient but may change.
+
+=over 2
+
+=item is_utf8(STRING [, CHECK])
+
+[INTERNAL] Tests whether the UTF8 flag is turned on in the STRING.
+If CHECK is true, also checks the data in STRING for being well-formed
+UTF-8. Returns true if successful, false otherwise.
+
+As of perl 5.8.1, L<utf8> also has utf8::is_utf8().
+
+=item _utf8_on(STRING)
+
+[INTERNAL] Turns on the UTF8 flag in STRING. The data in STRING is
+B<not> checked for being well-formed UTF-8. Do not use unless you
+B<know> that the STRING is well-formed UTF-8. Returns the previous
+state of the UTF8 flag (so please don't treat the return value as
+indicating success or failure), or C<undef> if STRING is not a string.
+
+This function does not work on tainted values.
+
+=item _utf8_off(STRING)
+
+[INTERNAL] Turns off the UTF8 flag in STRING. Do not use frivolously.
+Returns the previous state of the UTF8 flag (so please don't treat the
+return value as indicating success or failure), or C<undef> if STRING is
+not a string.
+
+This function does not work on tainted values.
+
+=back
+
+=head1 UTF-8 vs. utf8 vs. UTF8
+
+ ....We now view strings not as sequences of bytes, but as sequences
+ of numbers in the range 0 .. 2**32-1 (or in the case of 64-bit
+ computers, 0 .. 2**64-1) -- Programming Perl, 3rd ed.
+
+That has been the perl's notion of UTF-8 but official UTF-8 is more
+strict; Its ranges is much narrower (0 .. 10FFFF), some sequences are
+not allowed (i.e. Those used in the surrogate pair, 0xFFFE, et al).
+
+Now that is overruled by Larry Wall himself.
+
+ From: Larry Wall <larry@wall.org>
+ Date: December 04, 2004 11:51:58 JST
+ To: perl-unicode@perl.org
+ Subject: Re: Make Encode.pm support the real UTF-8
+ Message-Id: <20041204025158.GA28754@wall.org>
+
+ On Fri, Dec 03, 2004 at 10:12:12PM +0000, Tim Bunce wrote:
+ : I've no problem with 'utf8' being perl's unrestricted uft8 encoding,
+ : but "UTF-8" is the name of the standard and should give the
+ : corresponding behaviour.
+
+ For what it's worth, that's how I've always kept them straight in my
+ head.
+
+ Also for what it's worth, Perl 6 will mostly default to strict but
+ make it easy to switch back to lax.
+
+ Larry
+
+Do you copy? As of Perl 5.8.7, B<UTF-8> means strict, official UTF-8
+while B<utf8> means liberal, lax, version thereof. And Encode version
+2.10 or later thus groks the difference between C<UTF-8> and C"utf8".
+
+ encode("utf8", "\x{FFFF_FFFF}", 1); # okay
+ encode("UTF-8", "\x{FFFF_FFFF}", 1); # croaks
+
+C<UTF-8> in Encode is actually a canonical name for C<utf-8-strict>.
+Yes, the hyphen between "UTF" and "8" is important. Without it Encode
+goes "liberal"
+
+ find_encoding("UTF-8")->name # is 'utf-8-strict'
+ find_encoding("utf-8")->name # ditto. names are case insensitive
+ find_encoding("utf_8")->name # ditto. "_" are treated as "-"
+ find_encoding("UTF8")->name # is 'utf8'.
+
+The UTF8 flag is internally called UTF8, without a hyphen. It indicates
+whether a string is internally encoded as utf8, also without a hypen.
+
+=head1 SEE ALSO
+
+L<Encode::Encoding>,
+L<Encode::Supported>,
+L<Encode::PerlIO>,
+L<encoding>,
+L<perlebcdic>,
+L<perlfunc/open>,
+L<perlunicode>, L<perluniintro>, L<perlunifaq>, L<perlunitut>
+L<utf8>,
+the Perl Unicode Mailing List E<lt>perl-unicode@perl.orgE<gt>
+
+=head1 MAINTAINER
+
+This project was originated by Nick Ing-Simmons and later maintained
+by Dan Kogai E<lt>dankogai@dan.co.jpE<gt>. See AUTHORS for a full
+list of people involved. For any questions, use
+E<lt>perl-unicode@perl.orgE<gt> so we can all share.
+
+While Dan Kogai retains the copyright as a maintainer, the credit
+should go to all those involoved. See AUTHORS for those submitted
+codes.
+
+=head1 COPYRIGHT
+
+Copyright 2002-2006 Dan Kogai E<lt>dankogai@dan.co.jpE<gt>
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/Alias.pm b/Master/tlpkg/tlperl.straw/lib/Encode/Alias.pm
new file mode 100755
index 00000000000..f142403ca9c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/Alias.pm
@@ -0,0 +1,377 @@
+package Encode::Alias;
+use strict;
+use warnings;
+no warnings 'redefine';
+our $VERSION = do { my @r = ( q$Revision: 2.12 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+sub DEBUG () { 0 }
+
+use base qw(Exporter);
+
+# Public, encouraged API is exported by default
+
+our @EXPORT =
+ qw (
+ define_alias
+ find_alias
+);
+
+our @Alias; # ordered matching list
+our %Alias; # cached known aliases
+
+sub find_alias {
+ require Encode;
+ my $class = shift;
+ my $find = shift;
+ unless ( exists $Alias{$find} ) {
+ $Alias{$find} = undef; # Recursion guard
+ for ( my $i = 0 ; $i < @Alias ; $i += 2 ) {
+ my $alias = $Alias[$i];
+ my $val = $Alias[ $i + 1 ];
+ my $new;
+ if ( ref($alias) eq 'Regexp' && $find =~ $alias ) {
+ DEBUG and warn "eval $val";
+ $new = eval $val;
+ DEBUG and $@ and warn "$val, $@";
+ }
+ elsif ( ref($alias) eq 'CODE' ) {
+ DEBUG and warn "$alias", "->", "($find)";
+ $new = $alias->($find);
+ }
+ elsif ( lc($find) eq lc($alias) ) {
+ $new = $val;
+ }
+ if ( defined($new) ) {
+ next if $new eq $find; # avoid (direct) recursion on bugs
+ DEBUG and warn "$alias, $new";
+ my $enc =
+ ( ref($new) ) ? $new : Encode::find_encoding($new);
+ if ($enc) {
+ $Alias{$find} = $enc;
+ last;
+ }
+ }
+ }
+
+ # case insensitive search when canonical is not in all lowercase
+ # RT ticket #7835
+ unless ( $Alias{$find} ) {
+ my $lcfind = lc($find);
+ for my $name ( keys %Encode::Encoding, keys %Encode::ExtModule )
+ {
+ $lcfind eq lc($name) or next;
+ $Alias{$find} = Encode::find_encoding($name);
+ DEBUG and warn "$find => $name";
+ }
+ }
+ }
+ if (DEBUG) {
+ my $name;
+ if ( my $e = $Alias{$find} ) {
+ $name = $e->name;
+ }
+ else {
+ $name = "";
+ }
+ warn "find_alias($class, $find)->name = $name";
+ }
+ return $Alias{$find};
+}
+
+sub define_alias {
+ while (@_) {
+ my ( $alias, $name ) = splice( @_, 0, 2 );
+ unshift( @Alias, $alias => $name ); # newer one has precedence
+ if ( ref($alias) ) {
+
+ # clear %Alias cache to allow overrides
+ my @a = keys %Alias;
+ for my $k (@a) {
+ if ( ref($alias) eq 'Regexp' && $k =~ $alias ) {
+ DEBUG and warn "delete \$Alias\{$k\}";
+ delete $Alias{$k};
+ }
+ elsif ( ref($alias) eq 'CODE' ) {
+ DEBUG and warn "delete \$Alias\{$k\}";
+ delete $Alias{ $alias->($name) };
+ }
+ }
+ }
+ else {
+ DEBUG and warn "delete \$Alias\{$alias\}";
+ delete $Alias{$alias};
+ }
+ }
+}
+
+# Allow latin-1 style names as well
+# 0 1 2 3 4 5 6 7 8 9 10
+our @Latin2iso = ( 0, 1, 2, 3, 4, 9, 10, 13, 14, 15, 16 );
+
+# Allow winlatin1 style names as well
+our %Winlatin2cp = (
+ 'latin1' => 1252,
+ 'latin2' => 1250,
+ 'cyrillic' => 1251,
+ 'greek' => 1253,
+ 'turkish' => 1254,
+ 'hebrew' => 1255,
+ 'arabic' => 1256,
+ 'baltic' => 1257,
+ 'vietnamese' => 1258,
+);
+
+init_aliases();
+
+sub undef_aliases {
+ @Alias = ();
+ %Alias = ();
+}
+
+sub init_aliases {
+ require Encode;
+ undef_aliases();
+
+ # Try all-lower-case version should all else fails
+ define_alias( qr/^(.*)$/ => '"\L$1"' );
+
+ # UTF/UCS stuff
+ define_alias( qr/^(unicode-1-1-)?UTF-?7$/i => '"UTF-7"' );
+ define_alias( qr/^UCS-?2-?LE$/i => '"UCS-2LE"' );
+ define_alias(
+ qr/^UCS-?2-?(BE)?$/i => '"UCS-2BE"',
+ qr/^UCS-?4-?(BE|LE)?$/i => 'uc("UTF-32$1")',
+ qr/^iso-10646-1$/i => '"UCS-2BE"'
+ );
+ define_alias(
+ qr/^UTF-?(16|32)-?BE$/i => '"UTF-$1BE"',
+ qr/^UTF-?(16|32)-?LE$/i => '"UTF-$1LE"',
+ qr/^UTF-?(16|32)$/i => '"UTF-$1"',
+ );
+
+ # ASCII
+ define_alias( qr/^(?:US-?)ascii$/i => '"ascii"' );
+ define_alias( 'C' => 'ascii' );
+ define_alias( qr/\b(?:ISO[-_]?)?646(?:[-_]?US)?$/i => '"ascii"' );
+
+ # Allow variants of iso-8859-1 etc.
+ define_alias( qr/\biso[-_]?(\d+)[-_](\d+)$/i => '"iso-$1-$2"' );
+
+ # At least HP-UX has these.
+ define_alias( qr/\biso8859(\d+)$/i => '"iso-8859-$1"' );
+
+ # More HP stuff.
+ define_alias(
+ qr/\b(?:hp-)?(arabic|greek|hebrew|kana|roman|thai|turkish)8$/i =>
+ '"${1}8"' );
+
+ # The Official name of ASCII.
+ define_alias( qr/\bANSI[-_]?X3\.4[-_]?1968$/i => '"ascii"' );
+
+ # This is a font issue, not an encoding issue.
+ # (The currency symbol of the Latin 1 upper half
+ # has been redefined as the euro symbol.)
+ define_alias( qr/^(.+)\@euro$/i => '"$1"' );
+
+ define_alias( qr/\b(?:iso[-_]?)?latin[-_]?(\d+)$/i =>
+'defined $Encode::Alias::Latin2iso[$1] ? "iso-8859-$Encode::Alias::Latin2iso[$1]" : undef'
+ );
+
+ define_alias(
+ qr/\bwin(latin[12]|cyrillic|baltic|greek|turkish|
+ hebrew|arabic|baltic|vietnamese)$/ix =>
+ '"cp" . $Encode::Alias::Winlatin2cp{lc($1)}'
+ );
+
+ # Common names for non-latin preferred MIME names
+ define_alias(
+ 'ascii' => 'US-ascii',
+ 'cyrillic' => 'iso-8859-5',
+ 'arabic' => 'iso-8859-6',
+ 'greek' => 'iso-8859-7',
+ 'hebrew' => 'iso-8859-8',
+ 'thai' => 'iso-8859-11',
+ );
+ # RT #20781
+ define_alias(qr/\btis-?620\b/i => '"iso-8859-11"');
+
+ # At least AIX has IBM-NNN (surprisingly...) instead of cpNNN.
+ # And Microsoft has their own naming (again, surprisingly).
+ # And windows-* is registered in IANA!
+ define_alias(
+ qr/\b(?:cp|ibm|ms|windows)[-_ ]?(\d{2,4})$/i => '"cp$1"' );
+
+ # Sometimes seen with a leading zero.
+ # define_alias( qr/\bcp037\b/i => '"cp37"');
+
+ # Mac Mappings
+ # predefined in *.ucm; unneeded
+ # define_alias( qr/\bmacIcelandic$/i => '"macIceland"');
+ define_alias( qr/^mac_(.*)$/i => '"mac$1"' );
+ # http://rt.cpan.org/Ticket/Display.html?id=36326
+ define_alias( qr/^macintosh$/i => '"MacRoman"' );
+
+ # Ououououou. gone. They are differente!
+ # define_alias( qr/\bmacRomanian$/i => '"macRumanian"');
+
+ # Standardize on the dashed versions.
+ define_alias( qr/\bkoi8[\s\-_]*([ru])$/i => '"koi8-$1"' );
+
+ unless ($Encode::ON_EBCDIC) {
+
+ # for Encode::CN
+ define_alias( qr/\beuc.*cn$/i => '"euc-cn"' );
+ define_alias( qr/\bcn.*euc$/i => '"euc-cn"' );
+
+ # define_alias( qr/\bGB[- ]?(\d+)$/i => '"euc-cn"' )
+ # CP936 doesn't have vendor-addon for GBK, so they're identical.
+ define_alias( qr/^gbk$/i => '"cp936"' );
+
+ # This fixes gb2312 vs. euc-cn confusion, practically
+ define_alias( qr/\bGB[-_ ]?2312(?!-?raw)/i => '"euc-cn"' );
+
+ # for Encode::JP
+ define_alias( qr/\bjis$/i => '"7bit-jis"' );
+ define_alias( qr/\beuc.*jp$/i => '"euc-jp"' );
+ define_alias( qr/\bjp.*euc$/i => '"euc-jp"' );
+ define_alias( qr/\bujis$/i => '"euc-jp"' );
+ define_alias( qr/\bshift.*jis$/i => '"shiftjis"' );
+ define_alias( qr/\bsjis$/i => '"shiftjis"' );
+ define_alias( qr/\bwindows-31j$/i => '"cp932"' );
+
+ # for Encode::KR
+ define_alias( qr/\beuc.*kr$/i => '"euc-kr"' );
+ define_alias( qr/\bkr.*euc$/i => '"euc-kr"' );
+
+ # This fixes ksc5601 vs. euc-kr confusion, practically
+ define_alias( qr/(?:x-)?uhc$/i => '"cp949"' );
+ define_alias( qr/(?:x-)?windows-949$/i => '"cp949"' );
+ define_alias( qr/\bks_c_5601-1987$/i => '"cp949"' );
+
+ # for Encode::TW
+ define_alias( qr/\bbig-?5$/i => '"big5-eten"' );
+ define_alias( qr/\bbig5-?et(?:en)?$/i => '"big5-eten"' );
+ define_alias( qr/\btca[-_]?big5$/i => '"big5-eten"' );
+ define_alias( qr/\bbig5-?hk(?:scs)?$/i => '"big5-hkscs"' );
+ define_alias( qr/\bhk(?:scs)?[-_]?big5$/i => '"big5-hkscs"' );
+ }
+
+ # utf8 is blessed :)
+ define_alias( qr/\bUTF-8$/i => '"utf-8-strict"' );
+
+ # At last, Map white space and _ to '-'
+ define_alias( qr/^(\S+)[\s_]+(.*)$/i => '"$1-$2"' );
+}
+
+1;
+__END__
+
+# TODO: HP-UX '8' encodings arabic8 greek8 hebrew8 kana8 thai8 turkish8
+# TODO: HP-UX '15' encodings japanese15 korean15 roi15
+# TODO: Cyrillic encoding ISO-IR-111 (useful?)
+# TODO: Armenian encoding ARMSCII-8
+# TODO: Hebrew encoding ISO-8859-8-1
+# TODO: Thai encoding TCVN
+# TODO: Vietnamese encodings VPS
+# TODO: Mac Asian+African encodings: Arabic Armenian Bengali Burmese
+# ChineseSimp ChineseTrad Devanagari Ethiopic ExtArabic
+# Farsi Georgian Gujarati Gurmukhi Hebrew Japanese
+# Kannada Khmer Korean Laotian Malayalam Mongolian
+# Oriya Sinhalese Symbol Tamil Telugu Tibetan Vietnamese
+
+=head1 NAME
+
+Encode::Alias - alias definitions to encodings
+
+=head1 SYNOPSIS
+
+ use Encode;
+ use Encode::Alias;
+ define_alias( newName => ENCODING);
+
+=head1 DESCRIPTION
+
+Allows newName to be used as an alias for ENCODING. ENCODING may be
+either the name of an encoding or an encoding object (as described
+in L<Encode>).
+
+Currently I<newName> can be specified in the following ways:
+
+=over 4
+
+=item As a simple string.
+
+=item As a qr// compiled regular expression, e.g.:
+
+ define_alias( qr/^iso8859-(\d+)$/i => '"iso-8859-$1"' );
+
+In this case, if I<ENCODING> is not a reference, it is C<eval>-ed
+in order to allow C<$1> etc. to be substituted. The example is one
+way to alias names as used in X11 fonts to the MIME names for the
+iso-8859-* family. Note the double quotes inside the single quotes.
+
+(or, you don't have to do this yourself because this example is predefined)
+
+If you are using a regex here, you have to use the quotes as shown or
+it won't work. Also note that regex handling is tricky even for the
+experienced. Use this feature with caution.
+
+=item As a code reference, e.g.:
+
+ define_alias( sub {shift =~ /^iso8859-(\d+)$/i ? "iso-8859-$1" : undef } );
+
+The same effect as the example above in a different way. The coderef
+takes the alias name as an argument and returns a canonical name on
+success or undef if not. Note the second argument is not required.
+Use this with even more caution than the regex version.
+
+=back
+
+=head3 Changes in code reference aliasing
+
+As of Encode 1.87, the older form
+
+ define_alias( sub { return /^iso8859-(\d+)$/i ? "iso-8859-$1" : undef } );
+
+no longer works.
+
+Encode up to 1.86 internally used "local $_" to implement ths older
+form. But consider the code below;
+
+ use Encode;
+ $_ = "eeeee" ;
+ while (/(e)/g) {
+ my $utf = decode('aliased-encoding-name', $1);
+ print "position:",pos,"\n";
+ }
+
+Prior to Encode 1.86 this fails because of "local $_".
+
+=head2 Alias overloading
+
+You can override predefined aliases by simply applying define_alias().
+The new alias is always evaluated first, and when necessary,
+define_alias() flushes the internal cache to make the new definition
+available.
+
+ # redirect SHIFT_JIS to MS/IBM Code Page 932, which is a
+ # superset of SHIFT_JIS
+
+ define_alias( qr/shift.*jis$/i => '"cp932"' );
+ define_alias( qr/sjis$/i => '"cp932"' );
+
+If you want to zap all predefined aliases, you can use
+
+ Encode::Alias->undef_aliases;
+
+to do so. And
+
+ Encode::Alias->init_aliases;
+
+gets the factory settings back.
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::Supported>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/Byte.pm b/Master/tlpkg/tlperl.straw/lib/Encode/Byte.pm
new file mode 100755
index 00000000000..d105aa27cc8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/Byte.pm
@@ -0,0 +1,120 @@
+package Encode::Byte;
+use strict;
+use warnings;
+use Encode;
+our $VERSION = do { my @r = ( q$Revision: 2.4 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+use XSLoader;
+XSLoader::load( __PACKAGE__, $VERSION );
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Byte - Single Byte Encodings
+
+=head1 SYNOPSIS
+
+ use Encode qw/encode decode/;
+ $greek = encode("iso-8859-7", $utf8); # loads Encode::Byte implicitly
+ $utf8 = decode("iso-8859-7", $greek); # ditto
+
+=head1 ABSTRACT
+
+This module implements various single byte encodings. For most cases it uses
+\x80-\xff (upper half) to map non-ASCII characters. Encodings
+supported are as follows.
+
+ Canonical Alias Description
+ --------------------------------------------------------------------
+ # ISO 8859 series
+ (iso-8859-1 is in built-in)
+ iso-8859-2 latin2 [ISO]
+ iso-8859-3 latin3 [ISO]
+ iso-8859-4 latin4 [ISO]
+ iso-8859-5 [ISO]
+ iso-8859-6 [ISO]
+ iso-8859-7 [ISO]
+ iso-8859-8 [ISO]
+ iso-8859-9 latin5 [ISO]
+ iso-8859-10 latin6 [ISO]
+ iso-8859-11
+ (iso-8859-12 is nonexistent)
+ iso-8859-13 latin7 [ISO]
+ iso-8859-14 latin8 [ISO]
+ iso-8859-15 latin9 [ISO]
+ iso-8859-16 latin10 [ISO]
+
+ # Cyrillic
+ koi8-f
+ koi8-r cp878 [RFC1489]
+ koi8-u [RFC2319]
+
+ # Vietnamese
+ viscii
+
+ # all cp* are also available as ibm-*, ms-*, and windows-*
+ # also see L<http://msdn.microsoft.com/en-us/library/aa752010%28VS.85%29.aspx>
+
+ cp424
+ cp437
+ cp737
+ cp775
+ cp850
+ cp852
+ cp855
+ cp856
+ cp857
+ cp860
+ cp861
+ cp862
+ cp863
+ cp864
+ cp865
+ cp866
+ cp869
+ cp874
+ cp1006
+ cp1250 WinLatin2
+ cp1251 WinCyrillic
+ cp1252 WinLatin1
+ cp1253 WinGreek
+ cp1254 WinTurkish
+ cp1255 WinHebrew
+ cp1256 WinArabic
+ cp1257 WinBaltic
+ cp1258 WinVietnamese
+
+ # Macintosh
+ # Also see L<http://developer.apple.com/technotes/tn/tn1150.html>
+ MacArabic
+ MacCentralEurRoman
+ MacCroatian
+ MacCyrillic
+ MacFarsi
+ MacGreek
+ MacHebrew
+ MacIcelandic
+ MacRoman
+ MacRomanian
+ MacRumanian
+ MacSami
+ MacThai
+ MacTurkish
+ MacUkrainian
+
+ # More vendor encodings
+ AdobeStandardEncoding
+ nextstep
+ hp-roman8
+
+=head1 DESCRIPTION
+
+To find how to use this module in detail, see L<Encode>.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/CJKConstants.pm b/Master/tlpkg/tlperl.straw/lib/Encode/CJKConstants.pm
new file mode 100755
index 00000000000..43d20337544
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/CJKConstants.pm
@@ -0,0 +1,66 @@
+#
+# $Id: CJKConstants.pm,v 2.2 2006/06/03 20:28:48 dankogai Exp $
+#
+
+package Encode::CJKConstants;
+
+use strict;
+use warnings;
+our $RCSID = q$Id: CJKConstants.pm,v 2.2 2006/06/03 20:28:48 dankogai Exp $;
+our $VERSION = do { my @r = ( q$Revision: 2.2 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+use Carp;
+
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT = qw();
+our @EXPORT_OK = qw(%CHARCODE %ESC %RE);
+our %EXPORT_TAGS = ( 'all' => [ @EXPORT_OK, @EXPORT ] );
+
+my %_0208 = (
+ 1978 => '\e\$\@',
+ 1983 => '\e\$B',
+ 1990 => '\e&\@\e\$B',
+);
+
+our %CHARCODE = (
+ UNDEF_EUC => "\xa2\xae", # ¢® in EUC
+ UNDEF_SJIS => "\x81\xac", # ¢® in SJIS
+ UNDEF_JIS => "\xa2\xf7", # ¢÷ -- used in unicode
+ UNDEF_UNICODE => "\x20\x20", # ¢÷ -- used in unicode
+);
+
+our %ESC = (
+ GB_2312 => "\e\$A",
+ JIS_0208 => "\e\$B",
+ JIS_0212 => "\e\$(D",
+ KSC_5601 => "\e\$(C",
+ ASC => "\e\(B",
+ KANA => "\e\(I",
+ '2022_KR' => "\e\$)C",
+);
+
+our %RE = (
+ ASCII => '[\x00-\x7f]',
+ BIN => '[\x00-\x06\x7f\xff]',
+ EUC_0212 => '\x8f[\xa1-\xfe][\xa1-\xfe]',
+ EUC_C => '[\xa1-\xfe][\xa1-\xfe]',
+ EUC_KANA => '\x8e[\xa1-\xdf]',
+ JIS_0208 => "$_0208{1978}|$_0208{1983}|$_0208{1990}",
+ JIS_0212 => "\e" . '\$\(D',
+ ISO_ASC => "\e" . '\([BJ]',
+ JIS_KANA => "\e" . '\(I',
+ '2022_KR' => "\e" . '\$\)C',
+ SJIS_C => '[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]',
+ SJIS_KANA => '[\xa1-\xdf]',
+ UTF8 => '[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf][\x80-\xbf]'
+);
+
+1;
+
+=head1 NAME
+
+Encode::CJKConstants.pm -- Internally used by Encode::??::ISO_2022_*
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/CN.pm b/Master/tlpkg/tlperl.straw/lib/Encode/CN.pm
new file mode 100755
index 00000000000..830f34507da
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/CN.pm
@@ -0,0 +1,74 @@
+package Encode::CN;
+BEGIN {
+ if ( ord("A") == 193 ) {
+ die "Encode::CN not supported on EBCDIC\n";
+ }
+}
+use strict;
+use warnings;
+use Encode;
+our $VERSION = do { my @r = ( q$Revision: 2.3 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+use XSLoader;
+XSLoader::load( __PACKAGE__, $VERSION );
+
+# Relocated from Encode.pm
+
+use Encode::CN::HZ;
+
+# use Encode::CN::2022_CN;
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::CN - China-based Chinese Encodings
+
+=head1 SYNOPSIS
+
+ use Encode qw/encode decode/;
+ $euc_cn = encode("euc-cn", $utf8); # loads Encode::CN implicitly
+ $utf8 = decode("euc-cn", $euc_cn); # ditto
+
+=head1 DESCRIPTION
+
+This module implements China-based Chinese charset encodings.
+Encodings supported are as follows.
+
+ Canonical Alias Description
+ --------------------------------------------------------------------
+ euc-cn /\beuc.*cn$/i EUC (Extended Unix Character)
+ /\bcn.*euc$/i
+ /\bGB[-_ ]?2312(?:\D.*$|$)/i (see below)
+ gb2312-raw The raw (low-bit) GB2312 character map
+ gb12345-raw Traditional chinese counterpart to
+ GB2312 (raw)
+ iso-ir-165 GB2312 + GB6345 + GB8565 + additions
+ MacChineseSimp GB2312 + Apple Additions
+ cp936 Code Page 936, also known as GBK
+ (Extended GuoBiao)
+ hz 7-bit escaped GB2312 encoding
+ --------------------------------------------------------------------
+
+To find how to use this module in detail, see L<Encode>.
+
+=head1 NOTES
+
+Due to size concerns, C<GB 18030> (an extension to C<GBK>) is distributed
+separately on CPAN, under the name L<Encode::HanExtra>. That module
+also contains extra Taiwan-based encodings.
+
+=head1 BUGS
+
+When you see C<charset=gb2312> on mails and web pages, they really
+mean C<euc-cn> encodings. To fix that, C<gb2312> is aliased to C<euc-cn>.
+Use C<gb2312-raw> when you really mean it.
+
+The ASCII region (0x00-0x7f) is preserved for all encodings, even though
+this conflicts with mappings by the Unicode Consortium.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/CN/HZ.pm b/Master/tlpkg/tlperl.straw/lib/Encode/CN/HZ.pm
new file mode 100755
index 00000000000..98c16a9053a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/CN/HZ.pm
@@ -0,0 +1,198 @@
+package Encode::CN::HZ;
+
+use strict;
+use warnings;
+use utf8 ();
+
+use vars qw($VERSION);
+$VERSION = do { my @r = ( q$Revision: 2.5 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+use Encode qw(:fallbacks);
+
+use base qw(Encode::Encoding);
+__PACKAGE__->Define('hz');
+
+# HZ is a combination of ASCII and escaped GB, so we implement it
+# with the GB2312(raw) encoding here. Cf. RFCs 1842 & 1843.
+
+# not ported for EBCDIC. Which should be used, "~" or "\x7E"?
+
+sub needs_lines { 1 }
+
+sub decode ($$;$) {
+ my ( $obj, $str, $chk ) = @_;
+
+ my $GB = Encode::find_encoding('gb2312-raw');
+ my $ret = '';
+ my $in_ascii = 1; # default mode is ASCII.
+
+ while ( length $str ) {
+ if ($in_ascii) { # ASCII mode
+ if ( $str =~ s/^([\x00-\x7D\x7F]+)// ) { # no '~' => ASCII
+ $ret .= $1;
+
+ # EBCDIC should need ascii2native, but not ported.
+ }
+ elsif ( $str =~ s/^\x7E\x7E// ) { # escaped tilde
+ $ret .= '~';
+ }
+ elsif ( $str =~ s/^\x7E\cJ// ) { # '\cJ' == LF in ASCII
+ 1; # no-op
+ }
+ elsif ( $str =~ s/^\x7E\x7B// ) { # '~{'
+ $in_ascii = 0; # to GB
+ }
+ else { # encounters an invalid escape, \x80 or greater
+ last;
+ }
+ }
+ else { # GB mode; the byte ranges are as in RFC 1843.
+ no warnings 'uninitialized';
+ if ( $str =~ s/^((?:[\x21-\x77][\x21-\x7E])+)// ) {
+ $ret .= $GB->decode( $1, $chk );
+ }
+ elsif ( $str =~ s/^\x7E\x7D// ) { # '~}'
+ $in_ascii = 1;
+ }
+ else { # invalid
+ last;
+ }
+ }
+ }
+ $_[1] = '' if $chk; # needs_lines guarantees no partial character
+ return $ret;
+}
+
+sub cat_decode {
+ my ( $obj, undef, $src, $pos, $trm, $chk ) = @_;
+ my ( $rdst, $rsrc, $rpos ) = \@_[ 1 .. 3 ];
+
+ my $GB = Encode::find_encoding('gb2312-raw');
+ my $ret = '';
+ my $in_ascii = 1; # default mode is ASCII.
+
+ my $ini_pos = pos($$rsrc);
+
+ substr( $src, 0, $pos ) = '';
+
+ my $ini_len = bytes::length($src);
+
+ # $trm is the first of the pair '~~', then 2nd tilde is to be removed.
+ # XXX: Is better C<$src =~ s/^\x7E// or die if ...>?
+ $src =~ s/^\x7E// if $trm eq "\x7E";
+
+ while ( length $src ) {
+ my $now;
+ if ($in_ascii) { # ASCII mode
+ if ( $src =~ s/^([\x00-\x7D\x7F])// ) { # no '~' => ASCII
+ $now = $1;
+ }
+ elsif ( $src =~ s/^\x7E\x7E// ) { # escaped tilde
+ $now = '~';
+ }
+ elsif ( $src =~ s/^\x7E\cJ// ) { # '\cJ' == LF in ASCII
+ next;
+ }
+ elsif ( $src =~ s/^\x7E\x7B// ) { # '~{'
+ $in_ascii = 0; # to GB
+ next;
+ }
+ else { # encounters an invalid escape, \x80 or greater
+ last;
+ }
+ }
+ else { # GB mode; the byte ranges are as in RFC 1843.
+ if ( $src =~ s/^((?:[\x21-\x77][\x21-\x7F])+)// ) {
+ $now = $GB->decode( $1, $chk );
+ }
+ elsif ( $src =~ s/^\x7E\x7D// ) { # '~}'
+ $in_ascii = 1;
+ next;
+ }
+ else { # invalid
+ last;
+ }
+ }
+
+ next if !defined $now;
+
+ $ret .= $now;
+
+ if ( $now eq $trm ) {
+ $$rdst .= $ret;
+ $$rpos = $ini_pos + $pos + $ini_len - bytes::length($src);
+ pos($$rsrc) = $ini_pos;
+ return 1;
+ }
+ }
+
+ $$rdst .= $ret;
+ $$rpos = $ini_pos + $pos + $ini_len - bytes::length($src);
+ pos($$rsrc) = $ini_pos;
+ return ''; # terminator not found
+}
+
+sub encode($$;$) {
+ my ( $obj, $str, $chk ) = @_;
+
+ my $GB = Encode::find_encoding('gb2312-raw');
+ my $ret = '';
+ my $in_ascii = 1; # default mode is ASCII.
+
+ no warnings 'utf8'; # $str may be malformed UTF8 at the end of a chunk.
+
+ while ( length $str ) {
+ if ( $str =~ s/^([[:ascii:]]+)// ) {
+ my $tmp = $1;
+ $tmp =~ s/~/~~/g; # escapes tildes
+ if ( !$in_ascii ) {
+ $ret .= "\x7E\x7D"; # '~}'
+ $in_ascii = 1;
+ }
+ $ret .= pack 'a*', $tmp; # remove UTF8 flag.
+ }
+ elsif ( $str =~ s/(.)// ) {
+ my $s = $1;
+ my $tmp = $GB->encode( $s, $chk );
+ last if !defined $tmp;
+ if ( length $tmp == 2 ) { # maybe a valid GB char (XXX)
+ if ($in_ascii) {
+ $ret .= "\x7E\x7B"; # '~{'
+ $in_ascii = 0;
+ }
+ $ret .= $tmp;
+ }
+ elsif ( length $tmp ) { # maybe FALLBACK in ASCII (XXX)
+ if ( !$in_ascii ) {
+ $ret .= "\x7E\x7D"; # '~}'
+ $in_ascii = 1;
+ }
+ $ret .= $tmp;
+ }
+ }
+ else { # if $str is malformed UTF8 *and* if length $str != 0.
+ last;
+ }
+ }
+ $_[1] = $str if $chk;
+
+ # The state at the end of the chunk is discarded, even if in GB mode.
+ # That results in the combination of GB-OUT and GB-IN, i.e. "~}~{".
+ # Parhaps it is harmless, but further investigations may be required...
+
+ if ( !$in_ascii ) {
+ $ret .= "\x7E\x7D"; # '~}'
+ $in_ascii = 1;
+ }
+ utf8::encode($ret); # https://rt.cpan.org/Ticket/Display.html?id=35120
+ return $ret;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::CN::HZ -- internally used by Encode::CN
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/Changes.e2x b/Master/tlpkg/tlperl.straw/lib/Encode/Changes.e2x
new file mode 100755
index 00000000000..5c67c55cb93
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/Changes.e2x
@@ -0,0 +1,7 @@
+#
+# $Id: Changes.e2x,v 2.0 2004/05/16 20:55:15 dankogai Exp $
+# Revision history for Perl extension Encode::$_Name_.
+#
+
+0.01 $_Now_
+ Autogenerated by enc2xs version $_Version_.
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/Config.pm b/Master/tlpkg/tlperl.straw/lib/Encode/Config.pm
new file mode 100755
index 00000000000..1286a479998
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/Config.pm
@@ -0,0 +1,170 @@
+#
+# Demand-load module list
+#
+package Encode::Config;
+our $VERSION = do { my @r = ( q$Revision: 2.5 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+use strict;
+use warnings;
+
+our %ExtModule = (
+
+ # Encode::Byte
+ #iso-8859-1 is in Encode.pm itself
+ 'iso-8859-2' => 'Encode::Byte',
+ 'iso-8859-3' => 'Encode::Byte',
+ 'iso-8859-4' => 'Encode::Byte',
+ 'iso-8859-5' => 'Encode::Byte',
+ 'iso-8859-6' => 'Encode::Byte',
+ 'iso-8859-7' => 'Encode::Byte',
+ 'iso-8859-8' => 'Encode::Byte',
+ 'iso-8859-9' => 'Encode::Byte',
+ 'iso-8859-10' => 'Encode::Byte',
+ 'iso-8859-11' => 'Encode::Byte',
+ 'iso-8859-13' => 'Encode::Byte',
+ 'iso-8859-14' => 'Encode::Byte',
+ 'iso-8859-15' => 'Encode::Byte',
+ 'iso-8859-16' => 'Encode::Byte',
+ 'koi8-f' => 'Encode::Byte',
+ 'koi8-r' => 'Encode::Byte',
+ 'koi8-u' => 'Encode::Byte',
+ 'viscii' => 'Encode::Byte',
+ 'cp424' => 'Encode::Byte',
+ 'cp437' => 'Encode::Byte',
+ 'cp737' => 'Encode::Byte',
+ 'cp775' => 'Encode::Byte',
+ 'cp850' => 'Encode::Byte',
+ 'cp852' => 'Encode::Byte',
+ 'cp855' => 'Encode::Byte',
+ 'cp856' => 'Encode::Byte',
+ 'cp857' => 'Encode::Byte',
+ 'cp858' => 'Encode::Byte',
+ 'cp860' => 'Encode::Byte',
+ 'cp861' => 'Encode::Byte',
+ 'cp862' => 'Encode::Byte',
+ 'cp863' => 'Encode::Byte',
+ 'cp864' => 'Encode::Byte',
+ 'cp865' => 'Encode::Byte',
+ 'cp866' => 'Encode::Byte',
+ 'cp869' => 'Encode::Byte',
+ 'cp874' => 'Encode::Byte',
+ 'cp1006' => 'Encode::Byte',
+ 'cp1250' => 'Encode::Byte',
+ 'cp1251' => 'Encode::Byte',
+ 'cp1252' => 'Encode::Byte',
+ 'cp1253' => 'Encode::Byte',
+ 'cp1254' => 'Encode::Byte',
+ 'cp1255' => 'Encode::Byte',
+ 'cp1256' => 'Encode::Byte',
+ 'cp1257' => 'Encode::Byte',
+ 'cp1258' => 'Encode::Byte',
+ 'AdobeStandardEncoding' => 'Encode::Byte',
+ 'MacArabic' => 'Encode::Byte',
+ 'MacCentralEurRoman' => 'Encode::Byte',
+ 'MacCroatian' => 'Encode::Byte',
+ 'MacCyrillic' => 'Encode::Byte',
+ 'MacFarsi' => 'Encode::Byte',
+ 'MacGreek' => 'Encode::Byte',
+ 'MacHebrew' => 'Encode::Byte',
+ 'MacIcelandic' => 'Encode::Byte',
+ 'MacRoman' => 'Encode::Byte',
+ 'MacRomanian' => 'Encode::Byte',
+ 'MacRumanian' => 'Encode::Byte',
+ 'MacSami' => 'Encode::Byte',
+ 'MacThai' => 'Encode::Byte',
+ 'MacTurkish' => 'Encode::Byte',
+ 'MacUkrainian' => 'Encode::Byte',
+ 'nextstep' => 'Encode::Byte',
+ 'hp-roman8' => 'Encode::Byte',
+ #'gsm0338' => 'Encode::Byte',
+ 'gsm0338' => 'Encode::GSM0338',
+
+ # Encode::EBCDIC
+ 'cp37' => 'Encode::EBCDIC',
+ 'cp500' => 'Encode::EBCDIC',
+ 'cp875' => 'Encode::EBCDIC',
+ 'cp1026' => 'Encode::EBCDIC',
+ 'cp1047' => 'Encode::EBCDIC',
+ 'posix-bc' => 'Encode::EBCDIC',
+
+ # Encode::Symbol
+ 'dingbats' => 'Encode::Symbol',
+ 'symbol' => 'Encode::Symbol',
+ 'AdobeSymbol' => 'Encode::Symbol',
+ 'AdobeZdingbat' => 'Encode::Symbol',
+ 'MacDingbats' => 'Encode::Symbol',
+ 'MacSymbol' => 'Encode::Symbol',
+
+ # Encode::Unicode
+ 'UCS-2BE' => 'Encode::Unicode',
+ 'UCS-2LE' => 'Encode::Unicode',
+ 'UTF-16' => 'Encode::Unicode',
+ 'UTF-16BE' => 'Encode::Unicode',
+ 'UTF-16LE' => 'Encode::Unicode',
+ 'UTF-32' => 'Encode::Unicode',
+ 'UTF-32BE' => 'Encode::Unicode',
+ 'UTF-32LE' => 'Encode::Unicode',
+ 'UTF-7' => 'Encode::Unicode::UTF7',
+);
+
+unless ( ord("A") == 193 ) {
+ %ExtModule = (
+ %ExtModule,
+ 'euc-cn' => 'Encode::CN',
+ 'gb12345-raw' => 'Encode::CN',
+ 'gb2312-raw' => 'Encode::CN',
+ 'hz' => 'Encode::CN',
+ 'iso-ir-165' => 'Encode::CN',
+ 'cp936' => 'Encode::CN',
+ 'MacChineseSimp' => 'Encode::CN',
+
+ '7bit-jis' => 'Encode::JP',
+ 'euc-jp' => 'Encode::JP',
+ 'iso-2022-jp' => 'Encode::JP',
+ 'iso-2022-jp-1' => 'Encode::JP',
+ 'jis0201-raw' => 'Encode::JP',
+ 'jis0208-raw' => 'Encode::JP',
+ 'jis0212-raw' => 'Encode::JP',
+ 'cp932' => 'Encode::JP',
+ 'MacJapanese' => 'Encode::JP',
+ 'shiftjis' => 'Encode::JP',
+
+ 'euc-kr' => 'Encode::KR',
+ 'iso-2022-kr' => 'Encode::KR',
+ 'johab' => 'Encode::KR',
+ 'ksc5601-raw' => 'Encode::KR',
+ 'cp949' => 'Encode::KR',
+ 'MacKorean' => 'Encode::KR',
+
+ 'big5-eten' => 'Encode::TW',
+ 'big5-hkscs' => 'Encode::TW',
+ 'cp950' => 'Encode::TW',
+ 'MacChineseTrad' => 'Encode::TW',
+
+ #'big5plus' => 'Encode::HanExtra',
+ #'euc-tw' => 'Encode::HanExtra',
+ #'gb18030' => 'Encode::HanExtra',
+
+ 'MIME-Header' => 'Encode::MIME::Header',
+ 'MIME-B' => 'Encode::MIME::Header',
+ 'MIME-Q' => 'Encode::MIME::Header',
+
+ 'MIME-Header-ISO_2022_JP' => 'Encode::MIME::Header::ISO_2022_JP',
+ );
+}
+
+#
+# Why not export ? to keep ConfigLocal Happy!
+#
+while ( my ( $enc, $mod ) = each %ExtModule ) {
+ $Encode::ExtModule{$enc} = $mod;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Config -- internally used by Encode
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/ConfigLocal_PM.e2x b/Master/tlpkg/tlperl.straw/lib/Encode/ConfigLocal_PM.e2x
new file mode 100755
index 00000000000..e203dfded50
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/ConfigLocal_PM.e2x
@@ -0,0 +1,13 @@
+#
+# Local demand-load module list
+#
+# You should not edit this file by hand! use "enc2xs -C"
+#
+package Encode::ConfigLocal;
+our $VERSION = $_LocalVer_;
+
+use strict;
+
+$_ModLines_
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/EBCDIC.pm b/Master/tlpkg/tlperl.straw/lib/Encode/EBCDIC.pm
new file mode 100755
index 00000000000..8024c130da1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/EBCDIC.pm
@@ -0,0 +1,45 @@
+package Encode::EBCDIC;
+use strict;
+use warnings;
+use Encode;
+our $VERSION = do { my @r = ( q$Revision: 2.2 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+use XSLoader;
+XSLoader::load( __PACKAGE__, $VERSION );
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::EBCDIC - EBCDIC Encodings
+
+=head1 SYNOPSIS
+
+ use Encode qw/encode decode/;
+ $posix_bc = encode("posix-bc", $utf8); # loads Encode::EBCDIC implicitly
+ $utf8 = decode("", $posix_bc); # ditto
+
+=head1 ABSTRACT
+
+This module implements various EBCDIC-Based encodings. Encodings
+supported are as follows.
+
+ Canonical Alias Description
+ --------------------------------------------------------------------
+ cp37
+ cp500
+ cp875
+ cp1026
+ cp1047
+ posix-bc
+
+=head1 DESCRIPTION
+
+To find how to use this module in detail, see L<Encode>.
+
+=head1 SEE ALSO
+
+L<Encode>, L<perlebcdic>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/Encoder.pm b/Master/tlpkg/tlperl.straw/lib/Encode/Encoder.pm
new file mode 100755
index 00000000000..f7194f81ac4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/Encoder.pm
@@ -0,0 +1,253 @@
+#
+# $Id: Encoder.pm,v 2.1 2006/05/03 18:24:10 dankogai Exp $
+#
+package Encode::Encoder;
+use strict;
+use warnings;
+our $VERSION = do { my @r = ( q$Revision: 2.1 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT_OK = qw ( encoder );
+
+our $AUTOLOAD;
+sub DEBUG () { 0 }
+use Encode qw(encode decode find_encoding from_to);
+use Carp;
+
+sub new {
+ my ( $class, $data, $encname ) = @_;
+ unless ($encname) {
+ $encname = Encode::is_utf8($data) ? 'utf8' : '';
+ }
+ else {
+ my $obj = find_encoding($encname)
+ or croak __PACKAGE__, ": unknown encoding: $encname";
+ $encname = $obj->name;
+ }
+ my $self = {
+ data => $data,
+ encoding => $encname,
+ };
+ bless $self => $class;
+}
+
+sub encoder { __PACKAGE__->new(@_) }
+
+sub data {
+ my ( $self, $data ) = @_;
+ if ( defined $data ) {
+ $self->{data} = $data;
+ return $data;
+ }
+ else {
+ return $self->{data};
+ }
+}
+
+sub encoding {
+ my ( $self, $encname ) = @_;
+ if ($encname) {
+ my $obj = find_encoding($encname)
+ or confess __PACKAGE__, ": unknown encoding: $encname";
+ $self->{encoding} = $obj->name;
+ return $self;
+ }
+ else {
+ return $self->{encoding};
+ }
+}
+
+sub bytes {
+ my ( $self, $encname ) = @_;
+ $encname ||= $self->{encoding};
+ my $obj = find_encoding($encname)
+ or confess __PACKAGE__, ": unknown encoding: $encname";
+ $self->{data} = $obj->decode( $self->{data}, 1 );
+ $self->{encoding} = '';
+ return $self;
+}
+
+sub DESTROY { # defined so it won't autoload.
+ DEBUG and warn shift;
+}
+
+sub AUTOLOAD {
+ my $self = shift;
+ my $type = ref($self)
+ or confess "$self is not an object";
+ my $myname = $AUTOLOAD;
+ $myname =~ s/.*://; # strip fully-qualified portion
+ my $obj = find_encoding($myname)
+ or confess __PACKAGE__, ": unknown encoding: $myname";
+ DEBUG and warn $self->{encoding}, " => ", $obj->name;
+ if ( $self->{encoding} ) {
+ from_to( $self->{data}, $self->{encoding}, $obj->name, 1 );
+ }
+ else {
+ $self->{data} = $obj->encode( $self->{data}, 1 );
+ }
+ $self->{encoding} = $obj->name;
+ return $self;
+}
+
+use overload
+ q("") => sub { $_[0]->{data} },
+ q(0+) => sub { use bytes(); bytes::length( $_[0]->{data} ) },
+ fallback => 1,
+ ;
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Encoder -- Object Oriented Encoder
+
+=head1 SYNOPSIS
+
+ use Encode::Encoder;
+ # Encode::encode("ISO-8859-1", $data);
+ Encode::Encoder->new($data)->iso_8859_1; # OOP way
+ # shortcut
+ use Encode::Encoder qw(encoder);
+ encoder($data)->iso_8859_1;
+ # you can stack them!
+ encoder($data)->iso_8859_1->base64; # provided base64() is defined
+ # you can use it as a decoder as well
+ encoder($base64)->bytes('base64')->latin1;
+ # stringified
+ print encoder($data)->utf8->latin1; # prints the string in latin1
+ # numified
+ encoder("\x{abcd}\x{ef}g")->utf8 == 6; # true. bytes::length($data)
+
+=head1 ABSTRACT
+
+B<Encode::Encoder> allows you to use Encode in an object-oriented
+style. This is not only more intuitive than a functional approach,
+but also handier when you want to stack encodings. Suppose you want
+your UTF-8 string converted to Latin1 then Base64: you can simply say
+
+ my $base64 = encoder($utf8)->latin1->base64;
+
+instead of
+
+ my $latin1 = encode("latin1", $utf8);
+ my $base64 = encode_base64($utf8);
+
+or the lazier and more convoluted
+
+ my $base64 = encode_base64(encode("latin1", $utf8));
+
+=head1 Description
+
+Here is how to use this module.
+
+=over 4
+
+=item *
+
+There are at least two instance variables stored in a hash reference,
+{data} and {encoding}.
+
+=item *
+
+When there is no method, it takes the method name as the name of the
+encoding and encodes the instance I<data> with I<encoding>. If successful,
+the instance I<encoding> is set accordingly.
+
+=item *
+
+You can retrieve the result via -E<gt>data but usually you don't have to
+because the stringify operator ("") is overridden to do exactly that.
+
+=back
+
+=head2 Predefined Methods
+
+This module predefines the methods below:
+
+=over 4
+
+=item $e = Encode::Encoder-E<gt>new([$data, $encoding]);
+
+returns an encoder object. Its data is initialized with $data if
+present, and its encoding is set to $encoding if present.
+
+When $encoding is omitted, it defaults to utf8 if $data is already in
+utf8 or "" (empty string) otherwise.
+
+=item encoder()
+
+is an alias of Encode::Encoder-E<gt>new(). This one is exported on demand.
+
+=item $e-E<gt>data([$data])
+
+When $data is present, sets the instance data to $data and returns the
+object itself. Otherwise, the current instance data is returned.
+
+=item $e-E<gt>encoding([$encoding])
+
+When $encoding is present, sets the instance encoding to $encoding and
+returns the object itself. Otherwise, the current instance encoding is
+returned.
+
+=item $e-E<gt>bytes([$encoding])
+
+decodes instance data from $encoding, or the instance encoding if
+omitted. If the conversion is successful, the instance encoding
+will be set to "".
+
+The name I<bytes> was deliberately picked to avoid namespace tainting
+-- this module may be used as a base class so method names that appear
+in Encode::Encoding are avoided.
+
+=back
+
+=head2 Example: base64 transcoder
+
+This module is designed to work with L<Encode::Encoding>.
+To make the Base64 transcoder example above really work, you could
+write a module like this:
+
+ package Encode::Base64;
+ use base 'Encode::Encoding';
+ __PACKAGE__->Define('base64');
+ use MIME::Base64;
+ sub encode{
+ my ($obj, $data) = @_;
+ return encode_base64($data);
+ }
+ sub decode{
+ my ($obj, $data) = @_;
+ return decode_base64($data);
+ }
+ 1;
+ __END__
+
+And your caller module would be something like this:
+
+ use Encode::Encoder;
+ use Encode::Base64;
+
+ # now you can really do the following
+
+ encoder($data)->iso_8859_1->base64;
+ encoder($base64)->bytes('base64')->latin1;
+
+=head2 Operator Overloading
+
+This module overloads two operators, stringify ("") and numify (0+).
+
+Stringify dumps the data inside the object.
+
+Numify returns the number of bytes in the instance data.
+
+They come in handy when you want to print or find the size of data.
+
+=head1 SEE ALSO
+
+L<Encode>,
+L<Encode::Encoding>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/Encoding.pm b/Master/tlpkg/tlperl.straw/lib/Encode/Encoding.pm
new file mode 100755
index 00000000000..768d6d126ac
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/Encoding.pm
@@ -0,0 +1,360 @@
+package Encode::Encoding;
+
+# Base class for classes which implement encodings
+use strict;
+use warnings;
+our $VERSION = do { my @r = ( q$Revision: 2.5 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+require Encode;
+
+sub DEBUG { 0 }
+
+sub Define {
+ my $obj = shift;
+ my $canonical = shift;
+ $obj = bless { Name => $canonical }, $obj unless ref $obj;
+
+ # warn "$canonical => $obj\n";
+ Encode::define_encoding( $obj, $canonical, @_ );
+}
+
+sub name { return shift->{'Name'} }
+
+sub mime_name{
+ require Encode::MIME::Name;
+ return Encode::MIME::Name::get_mime_name(shift->name);
+}
+
+# sub renew { return $_[0] }
+
+sub renew {
+ my $self = shift;
+ my $clone = bless {%$self} => ref($self);
+ $clone->{renewed}++; # so the caller can see it
+ DEBUG and warn $clone->{renewed};
+ return $clone;
+}
+
+sub renewed { return $_[0]->{renewed} || 0 }
+
+*new_sequence = \&renew;
+
+sub needs_lines { 0 }
+
+sub perlio_ok {
+ eval { require PerlIO::encoding };
+ return $@ ? 0 : 1;
+}
+
+# (Temporary|legacy) methods
+
+sub toUnicode { shift->decode(@_) }
+sub fromUnicode { shift->encode(@_) }
+
+#
+# Needs to be overloaded or just croak
+#
+
+sub encode {
+ require Carp;
+ my $obj = shift;
+ my $class = ref($obj) ? ref($obj) : $obj;
+ Carp::croak( $class . "->encode() not defined!" );
+}
+
+sub decode {
+ require Carp;
+ my $obj = shift;
+ my $class = ref($obj) ? ref($obj) : $obj;
+ Carp::croak( $class . "->encode() not defined!" );
+}
+
+sub DESTROY { }
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Encoding - Encode Implementation Base Class
+
+=head1 SYNOPSIS
+
+ package Encode::MyEncoding;
+ use base qw(Encode::Encoding);
+
+ __PACKAGE__->Define(qw(myCanonical myAlias));
+
+=head1 DESCRIPTION
+
+As mentioned in L<Encode>, encodings are (in the current
+implementation at least) defined as objects. The mapping of encoding
+name to object is via the C<%Encode::Encoding> hash. Though you can
+directly manipulate this hash, it is strongly encouraged to use this
+base class module and add encode() and decode() methods.
+
+=head2 Methods you should implement
+
+You are strongly encouraged to implement methods below, at least
+either encode() or decode().
+
+=over 4
+
+=item -E<gt>encode($string [,$check])
+
+MUST return the octet sequence representing I<$string>.
+
+=over 2
+
+=item *
+
+If I<$check> is true, it SHOULD modify I<$string> in place to remove
+the converted part (i.e. the whole string unless there is an error).
+If perlio_ok() is true, SHOULD becomes MUST.
+
+=item *
+
+If an error occurs, it SHOULD return the octet sequence for the
+fragment of string that has been converted and modify $string in-place
+to remove the converted part leaving it starting with the problem
+fragment. If perlio_ok() is true, SHOULD becomes MUST.
+
+=item *
+
+If I<$check> is is false then C<encode> MUST make a "best effort" to
+convert the string - for example, by using a replacement character.
+
+=back
+
+=item -E<gt>decode($octets [,$check])
+
+MUST return the string that I<$octets> represents.
+
+=over 2
+
+=item *
+
+If I<$check> is true, it SHOULD modify I<$octets> in place to remove
+the converted part (i.e. the whole sequence unless there is an
+error). If perlio_ok() is true, SHOULD becomes MUST.
+
+=item *
+
+If an error occurs, it SHOULD return the fragment of string that has
+been converted and modify $octets in-place to remove the converted
+part leaving it starting with the problem fragment. If perlio_ok() is
+true, SHOULD becomes MUST.
+
+=item *
+
+If I<$check> is false then C<decode> should make a "best effort" to
+convert the string - for example by using Unicode's "\x{FFFD}" as a
+replacement character.
+
+=back
+
+=back
+
+If you want your encoding to work with L<encoding> pragma, you should
+also implement the method below.
+
+=over 4
+
+=item -E<gt>cat_decode($destination, $octets, $offset, $terminator [,$check])
+
+MUST decode I<$octets> with I<$offset> and concatenate it to I<$destination>.
+Decoding will terminate when $terminator (a string) appears in output.
+I<$offset> will be modified to the last $octets position at end of decode.
+Returns true if $terminator appears output, else returns false.
+
+=back
+
+=head2 Other methods defined in Encode::Encodings
+
+You do not have to override methods shown below unless you have to.
+
+=over 4
+
+=item -E<gt>name
+
+Predefined As:
+
+ sub name { return shift->{'Name'} }
+
+MUST return the string representing the canonical name of the encoding.
+
+=item -E<gt>mime_name
+
+Predefined As:
+
+ sub mime_name{
+ require Encode::MIME::Name;
+ return Encode::MIME::Name::get_mime_name(shift->name);
+ }
+
+MUST return the string representing the IANA charset name of the encoding.
+
+=item -E<gt>renew
+
+Predefined As:
+
+ sub renew {
+ my $self = shift;
+ my $clone = bless { %$self } => ref($self);
+ $clone->{renewed}++;
+ return $clone;
+ }
+
+This method reconstructs the encoding object if necessary. If you need
+to store the state during encoding, this is where you clone your object.
+
+PerlIO ALWAYS calls this method to make sure it has its own private
+encoding object.
+
+=item -E<gt>renewed
+
+Predefined As:
+
+ sub renewed { $_[0]->{renewed} || 0 }
+
+Tells whether the object is renewed (and how many times). Some
+modules emit C<Use of uninitialized value in null operation> warning
+unless the value is numeric so return 0 for false.
+
+=item -E<gt>perlio_ok()
+
+Predefined As:
+
+ sub perlio_ok {
+ eval{ require PerlIO::encoding };
+ return $@ ? 0 : 1;
+ }
+
+If your encoding does not support PerlIO for some reasons, just;
+
+ sub perlio_ok { 0 }
+
+=item -E<gt>needs_lines()
+
+Predefined As:
+
+ sub needs_lines { 0 };
+
+If your encoding can work with PerlIO but needs line buffering, you
+MUST define this method so it returns true. 7bit ISO-2022 encodings
+are one example that needs this. When this method is missing, false
+is assumed.
+
+=back
+
+=head2 Example: Encode::ROT13
+
+ package Encode::ROT13;
+ use strict;
+ use base qw(Encode::Encoding);
+
+ __PACKAGE__->Define('rot13');
+
+ sub encode($$;$){
+ my ($obj, $str, $chk) = @_;
+ $str =~ tr/A-Za-z/N-ZA-Mn-za-m/;
+ $_[1] = '' if $chk; # this is what in-place edit means
+ return $str;
+ }
+
+ # Jr pna or ynml yvxr guvf;
+ *decode = \&encode;
+
+ 1;
+
+=head1 Why the heck Encode API is different?
+
+It should be noted that the I<$check> behaviour is different from the
+outer public API. The logic is that the "unchecked" case is useful
+when the encoding is part of a stream which may be reporting errors
+(e.g. STDERR). In such cases, it is desirable to get everything
+through somehow without causing additional errors which obscure the
+original one. Also, the encoding is best placed to know what the
+correct replacement character is, so if that is the desired behaviour
+then letting low level code do it is the most efficient.
+
+By contrast, if I<$check> is true, the scheme above allows the
+encoding to do as much as it can and tell the layer above how much
+that was. What is lacking at present is a mechanism to report what
+went wrong. The most likely interface will be an additional method
+call to the object, or perhaps (to avoid forcing per-stream objects
+on otherwise stateless encodings) an additional parameter.
+
+It is also highly desirable that encoding classes inherit from
+C<Encode::Encoding> as a base class. This allows that class to define
+additional behaviour for all encoding objects.
+
+ package Encode::MyEncoding;
+ use base qw(Encode::Encoding);
+
+ __PACKAGE__->Define(qw(myCanonical myAlias));
+
+to create an object with C<< bless {Name => ...}, $class >>, and call
+define_encoding. They inherit their C<name> method from
+C<Encode::Encoding>.
+
+=head2 Compiled Encodings
+
+For the sake of speed and efficiency, most of the encodings are now
+supported via a I<compiled form>: XS modules generated from UCM
+files. Encode provides the enc2xs tool to achieve that. Please see
+L<enc2xs> for more details.
+
+=head1 SEE ALSO
+
+L<perlmod>, L<enc2xs>
+
+=begin future
+
+=over 4
+
+=item Scheme 1
+
+The fixup routine gets passed the remaining fragment of string being
+processed. It modifies it in place to remove bytes/characters it can
+understand and returns a string used to represent them. For example:
+
+ sub fixup {
+ my $ch = substr($_[0],0,1,'');
+ return sprintf("\x{%02X}",ord($ch);
+ }
+
+This scheme is close to how the underlying C code for Encode works,
+but gives the fixup routine very little context.
+
+=item Scheme 2
+
+The fixup routine gets passed the original string, an index into
+it of the problem area, and the output string so far. It appends
+what it wants to the output string and returns a new index into the
+original string. For example:
+
+ sub fixup {
+ # my ($s,$i,$d) = @_;
+ my $ch = substr($_[0],$_[1],1);
+ $_[2] .= sprintf("\x{%02X}",ord($ch);
+ return $_[1]+1;
+ }
+
+This scheme gives maximal control to the fixup routine but is more
+complicated to code, and may require that the internals of Encode be tweaked to
+keep the original string intact.
+
+=item Other Schemes
+
+Hybrids of the above.
+
+Multiple return values rather than in-place modifications.
+
+Index into the string could be C<pos($str)> allowing C<s/\G...//>.
+
+=back
+
+=end future
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/GSM0338.pm b/Master/tlpkg/tlperl.straw/lib/Encode/GSM0338.pm
new file mode 100755
index 00000000000..2ea71f2f77e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/GSM0338.pm
@@ -0,0 +1,292 @@
+#
+# $Id: GSM0338.pm,v 2.1 2008/05/07 20:56:05 dankogai Exp $
+#
+package Encode::GSM0338;
+
+use strict;
+use warnings;
+use Carp;
+
+use vars qw($VERSION);
+$VERSION = do { my @r = ( q$Revision: 2.1 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+use Encode qw(:fallbacks);
+
+use base qw(Encode::Encoding);
+__PACKAGE__->Define('gsm0338');
+
+sub needs_lines { 1 }
+sub perlio_ok { 0 }
+
+use utf8;
+our %UNI2GSM = (
+ "\x{0040}" => "\x00", # COMMERCIAL AT
+ "\x{000A}" => "\x0A", # LINE FEED
+ "\x{000C}" => "\x1B\x0A", # FORM FEED
+ "\x{000D}" => "\x0D", # CARRIAGE RETURN
+ "\x{0020}" => "\x20", # SPACE
+ "\x{0021}" => "\x21", # EXCLAMATION MARK
+ "\x{0022}" => "\x22", # QUOTATION MARK
+ "\x{0023}" => "\x23", # NUMBER SIGN
+ "\x{0024}" => "\x02", # DOLLAR SIGN
+ "\x{0025}" => "\x25", # PERCENT SIGN
+ "\x{0026}" => "\x26", # AMPERSAND
+ "\x{0027}" => "\x27", # APOSTROPHE
+ "\x{0028}" => "\x28", # LEFT PARENTHESIS
+ "\x{0029}" => "\x29", # RIGHT PARENTHESIS
+ "\x{002A}" => "\x2A", # ASTERISK
+ "\x{002B}" => "\x2B", # PLUS SIGN
+ "\x{002C}" => "\x2C", # COMMA
+ "\x{002D}" => "\x2D", # HYPHEN-MINUS
+ "\x{002E}" => "\x2E", # FULL STOP
+ "\x{002F}" => "\x2F", # SOLIDUS
+ "\x{0030}" => "\x30", # DIGIT ZERO
+ "\x{0031}" => "\x31", # DIGIT ONE
+ "\x{0032}" => "\x32", # DIGIT TWO
+ "\x{0033}" => "\x33", # DIGIT THREE
+ "\x{0034}" => "\x34", # DIGIT FOUR
+ "\x{0035}" => "\x35", # DIGIT FIVE
+ "\x{0036}" => "\x36", # DIGIT SIX
+ "\x{0037}" => "\x37", # DIGIT SEVEN
+ "\x{0038}" => "\x38", # DIGIT EIGHT
+ "\x{0039}" => "\x39", # DIGIT NINE
+ "\x{003A}" => "\x3A", # COLON
+ "\x{003B}" => "\x3B", # SEMICOLON
+ "\x{003C}" => "\x3C", # LESS-THAN SIGN
+ "\x{003D}" => "\x3D", # EQUALS SIGN
+ "\x{003E}" => "\x3E", # GREATER-THAN SIGN
+ "\x{003F}" => "\x3F", # QUESTION MARK
+ "\x{0041}" => "\x41", # LATIN CAPITAL LETTER A
+ "\x{0042}" => "\x42", # LATIN CAPITAL LETTER B
+ "\x{0043}" => "\x43", # LATIN CAPITAL LETTER C
+ "\x{0044}" => "\x44", # LATIN CAPITAL LETTER D
+ "\x{0045}" => "\x45", # LATIN CAPITAL LETTER E
+ "\x{0046}" => "\x46", # LATIN CAPITAL LETTER F
+ "\x{0047}" => "\x47", # LATIN CAPITAL LETTER G
+ "\x{0048}" => "\x48", # LATIN CAPITAL LETTER H
+ "\x{0049}" => "\x49", # LATIN CAPITAL LETTER I
+ "\x{004A}" => "\x4A", # LATIN CAPITAL LETTER J
+ "\x{004B}" => "\x4B", # LATIN CAPITAL LETTER K
+ "\x{004C}" => "\x4C", # LATIN CAPITAL LETTER L
+ "\x{004D}" => "\x4D", # LATIN CAPITAL LETTER M
+ "\x{004E}" => "\x4E", # LATIN CAPITAL LETTER N
+ "\x{004F}" => "\x4F", # LATIN CAPITAL LETTER O
+ "\x{0050}" => "\x50", # LATIN CAPITAL LETTER P
+ "\x{0051}" => "\x51", # LATIN CAPITAL LETTER Q
+ "\x{0052}" => "\x52", # LATIN CAPITAL LETTER R
+ "\x{0053}" => "\x53", # LATIN CAPITAL LETTER S
+ "\x{0054}" => "\x54", # LATIN CAPITAL LETTER T
+ "\x{0055}" => "\x55", # LATIN CAPITAL LETTER U
+ "\x{0056}" => "\x56", # LATIN CAPITAL LETTER V
+ "\x{0057}" => "\x57", # LATIN CAPITAL LETTER W
+ "\x{0058}" => "\x58", # LATIN CAPITAL LETTER X
+ "\x{0059}" => "\x59", # LATIN CAPITAL LETTER Y
+ "\x{005A}" => "\x5A", # LATIN CAPITAL LETTER Z
+ "\x{005F}" => "\x11", # LOW LINE
+ "\x{0061}" => "\x61", # LATIN SMALL LETTER A
+ "\x{0062}" => "\x62", # LATIN SMALL LETTER B
+ "\x{0063}" => "\x63", # LATIN SMALL LETTER C
+ "\x{0064}" => "\x64", # LATIN SMALL LETTER D
+ "\x{0065}" => "\x65", # LATIN SMALL LETTER E
+ "\x{0066}" => "\x66", # LATIN SMALL LETTER F
+ "\x{0067}" => "\x67", # LATIN SMALL LETTER G
+ "\x{0068}" => "\x68", # LATIN SMALL LETTER H
+ "\x{0069}" => "\x69", # LATIN SMALL LETTER I
+ "\x{006A}" => "\x6A", # LATIN SMALL LETTER J
+ "\x{006B}" => "\x6B", # LATIN SMALL LETTER K
+ "\x{006C}" => "\x6C", # LATIN SMALL LETTER L
+ "\x{006D}" => "\x6D", # LATIN SMALL LETTER M
+ "\x{006E}" => "\x6E", # LATIN SMALL LETTER N
+ "\x{006F}" => "\x6F", # LATIN SMALL LETTER O
+ "\x{0070}" => "\x70", # LATIN SMALL LETTER P
+ "\x{0071}" => "\x71", # LATIN SMALL LETTER Q
+ "\x{0072}" => "\x72", # LATIN SMALL LETTER R
+ "\x{0073}" => "\x73", # LATIN SMALL LETTER S
+ "\x{0074}" => "\x74", # LATIN SMALL LETTER T
+ "\x{0075}" => "\x75", # LATIN SMALL LETTER U
+ "\x{0076}" => "\x76", # LATIN SMALL LETTER V
+ "\x{0077}" => "\x77", # LATIN SMALL LETTER W
+ "\x{0078}" => "\x78", # LATIN SMALL LETTER X
+ "\x{0079}" => "\x79", # LATIN SMALL LETTER Y
+ "\x{007A}" => "\x7A", # LATIN SMALL LETTER Z
+ "\x{000C}" => "\x1B\x0A", # FORM FEED
+ "\x{005B}" => "\x1B\x3C", # LEFT SQUARE BRACKET
+ "\x{005C}" => "\x1B\x2F", # REVERSE SOLIDUS
+ "\x{005D}" => "\x1B\x3E", # RIGHT SQUARE BRACKET
+ "\x{005E}" => "\x1B\x14", # CIRCUMFLEX ACCENT
+ "\x{007B}" => "\x1B\x28", # LEFT CURLY BRACKET
+ "\x{007C}" => "\x1B\x40", # VERTICAL LINE
+ "\x{007D}" => "\x1B\x29", # RIGHT CURLY BRACKET
+ "\x{007E}" => "\x1B\x3D", # TILDE
+ "\x{00A0}" => "\x1B", # NO-BREAK SPACE
+ "\x{00A1}" => "\x40", # INVERTED EXCLAMATION MARK
+ "\x{00A3}" => "\x01", # POUND SIGN
+ "\x{00A4}" => "\x24", # CURRENCY SIGN
+ "\x{00A5}" => "\x03", # YEN SIGN
+ "\x{00A7}" => "\x5F", # SECTION SIGN
+ "\x{00BF}" => "\x60", # INVERTED QUESTION MARK
+ "\x{00C4}" => "\x5B", # LATIN CAPITAL LETTER A WITH DIAERESIS
+ "\x{00C5}" => "\x0E", # LATIN CAPITAL LETTER A WITH RING ABOVE
+ "\x{00C6}" => "\x1C", # LATIN CAPITAL LETTER AE
+ "\x{00C9}" => "\x1F", # LATIN CAPITAL LETTER E WITH ACUTE
+ "\x{00D1}" => "\x5D", # LATIN CAPITAL LETTER N WITH TILDE
+ "\x{00D6}" => "\x5C", # LATIN CAPITAL LETTER O WITH DIAERESIS
+ "\x{00D8}" => "\x0B", # LATIN CAPITAL LETTER O WITH STROKE
+ "\x{00DC}" => "\x5E", # LATIN CAPITAL LETTER U WITH DIAERESIS
+ "\x{00DF}" => "\x1E", # LATIN SMALL LETTER SHARP S
+ "\x{00E0}" => "\x7F", # LATIN SMALL LETTER A WITH GRAVE
+ "\x{00E4}" => "\x7B", # LATIN SMALL LETTER A WITH DIAERESIS
+ "\x{00E5}" => "\x0F", # LATIN SMALL LETTER A WITH RING ABOVE
+ "\x{00E6}" => "\x1D", # LATIN SMALL LETTER AE
+ "\x{00E7}" => "\x09", # LATIN SMALL LETTER C WITH CEDILLA
+ "\x{00E8}" => "\x04", # LATIN SMALL LETTER E WITH GRAVE
+ "\x{00E9}" => "\x05", # LATIN SMALL LETTER E WITH ACUTE
+ "\x{00EC}" => "\x07", # LATIN SMALL LETTER I WITH GRAVE
+ "\x{00F1}" => "\x7D", # LATIN SMALL LETTER N WITH TILDE
+ "\x{00F2}" => "\x08", # LATIN SMALL LETTER O WITH GRAVE
+ "\x{00F6}" => "\x7C", # LATIN SMALL LETTER O WITH DIAERESIS
+ "\x{00F8}" => "\x0C", # LATIN SMALL LETTER O WITH STROKE
+ "\x{00F9}" => "\x06", # LATIN SMALL LETTER U WITH GRAVE
+ "\x{00FC}" => "\x7E", # LATIN SMALL LETTER U WITH DIAERESIS
+ "\x{0393}" => "\x13", # GREEK CAPITAL LETTER GAMMA
+ "\x{0394}" => "\x10", # GREEK CAPITAL LETTER DELTA
+ "\x{0398}" => "\x19", # GREEK CAPITAL LETTER THETA
+ "\x{039B}" => "\x14", # GREEK CAPITAL LETTER LAMDA
+ "\x{039E}" => "\x1A", # GREEK CAPITAL LETTER XI
+ "\x{03A0}" => "\x16", # GREEK CAPITAL LETTER PI
+ "\x{03A3}" => "\x18", # GREEK CAPITAL LETTER SIGMA
+ "\x{03A6}" => "\x12", # GREEK CAPITAL LETTER PHI
+ "\x{03A8}" => "\x17", # GREEK CAPITAL LETTER PSI
+ "\x{03A9}" => "\x15", # GREEK CAPITAL LETTER OMEGA
+ "\x{20AC}" => "\x1B\x65", # EURO SIGN
+);
+our %GSM2UNI = reverse %UNI2GSM;
+our $ESC = "\x1b";
+our $ATMARK = "\x40";
+our $FBCHAR = "\x3F";
+our $NBSP = "\x{00A0}";
+
+#define ERR_DECODE_NOMAP "%s \"\\x%02" UVXf "\" does not map to Unicode"
+
+sub decode ($$;$) {
+ my ( $obj, $bytes, $chk ) = @_;
+ my $str;
+ while ( length $bytes ) {
+ my $c = substr( $bytes, 0, 1, '' );
+ my $u;
+ if ( $c eq "\x00" ) {
+ my $c2 = substr( $bytes, 0, 1, '' );
+ $u =
+ !length $c2 ? $ATMARK
+ : $c2 eq "\x00" ? "\x{0000}"
+ : exists $GSM2UNI{$c2} ? $ATMARK . $GSM2UNI{$c2}
+ : $chk
+ ? croak sprintf( "\\x%02X\\x%02X does not map to Unicode",
+ ord($c), ord($c2) )
+ : $ATMARK . $FBCHAR;
+
+ }
+ elsif ( $c eq $ESC ) {
+ my $c2 = substr( $bytes, 0, 1, '' );
+ $u =
+ exists $GSM2UNI{ $c . $c2 } ? $GSM2UNI{ $c . $c2 }
+ : exists $GSM2UNI{$c2} ? $NBSP . $GSM2UNI{$c2}
+ : $chk
+ ? croak sprintf( "\\x%02X\\x%02X does not map to Unicode",
+ ord($c), ord($c2) )
+ : $NBSP . $FBCHAR;
+ }
+ else {
+ $u =
+ exists $GSM2UNI{$c}
+ ? $GSM2UNI{$c}
+ : $chk ? ref $chk eq 'CODE'
+ ? $chk->( ord $c )
+ : croak sprintf( "\\x%02X does not map to Unicode", ord($c) )
+ : $FBCHAR;
+ }
+ $str .= $u;
+ }
+ $_[1] = $bytes if $chk;
+ return $str;
+}
+
+#define ERR_ENCODE_NOMAP "\"\\x{%04" UVxf "}\" does not map to %s"
+
+sub encode($$;$) {
+ my ( $obj, $str, $chk ) = @_;
+ my $bytes;
+ while ( length $str ) {
+ my $u = substr( $str, 0, 1, '' );
+ my $c;
+ $bytes .=
+ exists $UNI2GSM{$u}
+ ? $UNI2GSM{$u}
+ : $chk ? ref $chk eq 'CODE'
+ ? $chk->( ord($u) )
+ : croak sprintf( "\\x{%04x} does not map to %s",
+ ord($u), $obj->name )
+ : $FBCHAR;
+ }
+ $_[1] = $str if $chk;
+ return $bytes;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::GSM0338 -- ESTI GSM 03.38 Encoding
+
+=head1 SYNOPSIS
+
+ use Encode qw/encode decode/;
+ $gsm0338 = encode("gsm0338", $utf8); # loads Encode::GSM0338 implicitly
+ $utf8 = decode("gsm0338", $gsm0338); # ditto
+
+=head1 DESCRIPTION
+
+GSM0338 is for GSM handsets. Though it shares alphanumerals with ASCII,
+control character ranges and other parts are mapped very differently,
+mainly to store Greek characters. There are also escape sequences
+(starting with 0x1B) to cover e.g. the Euro sign.
+
+This was once handled by L<Encode::Bytes> but because of all those
+unusual specifications, Encode 2.20 has relocated the support to
+this module.
+
+=head1 NOTES
+
+Unlike most other encodings, the following aways croaks on error
+for any $chk that evaluates to true.
+
+ $gsm0338 = encode("gsm0338", $utf8 $chk);
+ $utf8 = decode("gsm0338", $gsm0338, $chk);
+
+So if you want to check the validity of the encoding, surround the
+expression with C<eval {}> block as follows;
+
+ eval {
+ $utf8 = decode("gsm0338", $gsm0338, $chk);
+ };
+ if ($@){
+ # handle exception here
+ }
+
+=head1 BUGS
+
+ESTI GSM 03.38 Encoding itself.
+
+Mapping \x00 to '@' causes too much pain everywhere.
+
+Its use of \x1b (escape) is also very questionable.
+
+Because of those two, the code paging approach used use in ucm-based
+Encoding SOMETIMES fails so this module was written.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/Guess.pm b/Master/tlpkg/tlperl.straw/lib/Encode/Guess.pm
new file mode 100755
index 00000000000..1ad7147e7f5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/Guess.pm
@@ -0,0 +1,355 @@
+package Encode::Guess;
+use strict;
+use warnings;
+use Encode qw(:fallbacks find_encoding);
+our $VERSION = do { my @r = ( q$Revision: 2.3 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+my $Canon = 'Guess';
+sub DEBUG () { 0 }
+our %DEF_SUSPECTS = map { $_ => find_encoding($_) } qw(ascii utf8);
+$Encode::Encoding{$Canon} = bless {
+ Name => $Canon,
+ Suspects => {%DEF_SUSPECTS},
+} => __PACKAGE__;
+
+use base qw(Encode::Encoding);
+sub needs_lines { 1 }
+sub perlio_ok { 0 }
+
+our @EXPORT = qw(guess_encoding);
+our $NoUTFAutoGuess = 0;
+our $UTF8_BOM = pack( "C3", 0xef, 0xbb, 0xbf );
+
+sub import { # Exporter not used so we do it on our own
+ my $callpkg = caller;
+ for my $item (@EXPORT) {
+ no strict 'refs';
+ *{"$callpkg\::$item"} = \&{"$item"};
+ }
+ set_suspects(@_);
+}
+
+sub set_suspects {
+ my $class = shift;
+ my $self = ref($class) ? $class : $Encode::Encoding{$Canon};
+ $self->{Suspects} = {%DEF_SUSPECTS};
+ $self->add_suspects(@_);
+}
+
+sub add_suspects {
+ my $class = shift;
+ my $self = ref($class) ? $class : $Encode::Encoding{$Canon};
+ for my $c (@_) {
+ my $e = find_encoding($c) or die "Unknown encoding: $c";
+ $self->{Suspects}{ $e->name } = $e;
+ DEBUG and warn "Added: ", $e->name;
+ }
+}
+
+sub decode($$;$) {
+ my ( $obj, $octet, $chk ) = @_;
+ my $guessed = guess( $obj, $octet );
+ unless ( ref($guessed) ) {
+ require Carp;
+ Carp::croak($guessed);
+ }
+ my $utf8 = $guessed->decode( $octet, $chk );
+ $_[1] = $octet if $chk;
+ return $utf8;
+}
+
+sub guess_encoding {
+ guess( $Encode::Encoding{$Canon}, @_ );
+}
+
+sub guess {
+ my $class = shift;
+ my $obj = ref($class) ? $class : $Encode::Encoding{$Canon};
+ my $octet = shift;
+
+ # sanity check
+ return "Empty string, empty guess" unless defined $octet and length $octet;
+
+ # cheat 0: utf8 flag;
+ if ( Encode::is_utf8($octet) ) {
+ return find_encoding('utf8') unless $NoUTFAutoGuess;
+ Encode::_utf8_off($octet);
+ }
+
+ # cheat 1: BOM
+ use Encode::Unicode;
+ unless ($NoUTFAutoGuess) {
+ my $BOM = pack( 'C3', unpack( "C3", $octet ) );
+ return find_encoding('utf8')
+ if ( defined $BOM and $BOM eq $UTF8_BOM );
+ $BOM = unpack( 'N', $octet );
+ return find_encoding('UTF-32')
+ if ( defined $BOM and ( $BOM == 0xFeFF or $BOM == 0xFFFe0000 ) );
+ $BOM = unpack( 'n', $octet );
+ return find_encoding('UTF-16')
+ if ( defined $BOM and ( $BOM == 0xFeFF or $BOM == 0xFFFe ) );
+ if ( $octet =~ /\x00/o )
+ { # if \x00 found, we assume UTF-(16|32)(BE|LE)
+ my $utf;
+ my ( $be, $le ) = ( 0, 0 );
+ if ( $octet =~ /\x00\x00/o ) { # UTF-32(BE|LE) assumed
+ $utf = "UTF-32";
+ for my $char ( unpack( 'N*', $octet ) ) {
+ $char & 0x0000ffff and $be++;
+ $char & 0xffff0000 and $le++;
+ }
+ }
+ else { # UTF-16(BE|LE) assumed
+ $utf = "UTF-16";
+ for my $char ( unpack( 'n*', $octet ) ) {
+ $char & 0x00ff and $be++;
+ $char & 0xff00 and $le++;
+ }
+ }
+ DEBUG and warn "$utf, be == $be, le == $le";
+ $be == $le
+ and return
+ "Encodings ambiguous between $utf BE and LE ($be, $le)";
+ $utf .= ( $be > $le ) ? 'BE' : 'LE';
+ return find_encoding($utf);
+ }
+ }
+ my %try = %{ $obj->{Suspects} };
+ for my $c (@_) {
+ my $e = find_encoding($c) or die "Unknown encoding: $c";
+ $try{ $e->name } = $e;
+ DEBUG and warn "Added: ", $e->name;
+ }
+ my $nline = 1;
+ for my $line ( split /\r\n?|\n/, $octet ) {
+
+ # cheat 2 -- \e in the string
+ if ( $line =~ /\e/o ) {
+ my @keys = keys %try;
+ delete @try{qw/utf8 ascii/};
+ for my $k (@keys) {
+ ref( $try{$k} ) eq 'Encode::XS' and delete $try{$k};
+ }
+ }
+ my %ok = %try;
+
+ # warn join(",", keys %try);
+ for my $k ( keys %try ) {
+ my $scratch = $line;
+ $try{$k}->decode( $scratch, FB_QUIET );
+ if ( $scratch eq '' ) {
+ DEBUG and warn sprintf( "%4d:%-24s ok\n", $nline, $k );
+ }
+ else {
+ use bytes ();
+ DEBUG
+ and warn sprintf( "%4d:%-24s not ok; %d bytes left\n",
+ $nline, $k, bytes::length($scratch) );
+ delete $ok{$k};
+ }
+ }
+ %ok or return "No appropriate encodings found!";
+ if ( scalar( keys(%ok) ) == 1 ) {
+ my ($retval) = values(%ok);
+ return $retval;
+ }
+ %try = %ok;
+ $nline++;
+ }
+ $try{ascii}
+ or return "Encodings too ambiguous: ", join( " or ", keys %try );
+ return $try{ascii};
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Guess -- Guesses encoding from data
+
+=head1 SYNOPSIS
+
+ # if you are sure $data won't contain anything bogus
+
+ use Encode;
+ use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
+ my $utf8 = decode("Guess", $data);
+ my $data = encode("Guess", $utf8); # this doesn't work!
+
+ # more elaborate way
+ use Encode::Guess;
+ my $enc = guess_encoding($data, qw/euc-jp shiftjis 7bit-jis/);
+ ref($enc) or die "Can't guess: $enc"; # trap error this way
+ $utf8 = $enc->decode($data);
+ # or
+ $utf8 = decode($enc->name, $data)
+
+=head1 ABSTRACT
+
+Encode::Guess enables you to guess in what encoding a given data is
+encoded, or at least tries to.
+
+=head1 DESCRIPTION
+
+By default, it checks only ascii, utf8 and UTF-16/32 with BOM.
+
+ use Encode::Guess; # ascii/utf8/BOMed UTF
+
+To use it more practically, you have to give the names of encodings to
+check (I<suspects> as follows). The name of suspects can either be
+canonical names or aliases.
+
+CAVEAT: Unlike UTF-(16|32), BOM in utf8 is NOT AUTOMATICALLY STRIPPED.
+
+ # tries all major Japanese Encodings as well
+ use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
+
+If the C<$Encode::Guess::NoUTFAutoGuess> variable is set to a true
+value, no heuristics will be applied to UTF8/16/32, and the result
+will be limited to the suspects and C<ascii>.
+
+=over 4
+
+=item Encode::Guess->set_suspects
+
+You can also change the internal suspects list via C<set_suspects>
+method.
+
+ use Encode::Guess;
+ Encode::Guess->set_suspects(qw/euc-jp shiftjis 7bit-jis/);
+
+=item Encode::Guess->add_suspects
+
+Or you can use C<add_suspects> method. The difference is that
+C<set_suspects> flushes the current suspects list while
+C<add_suspects> adds.
+
+ use Encode::Guess;
+ Encode::Guess->add_suspects(qw/euc-jp shiftjis 7bit-jis/);
+ # now the suspects are euc-jp,shiftjis,7bit-jis, AND
+ # euc-kr,euc-cn, and big5-eten
+ Encode::Guess->add_suspects(qw/euc-kr euc-cn big5-eten/);
+
+=item Encode::decode("Guess" ...)
+
+When you are content with suspects list, you can now
+
+ my $utf8 = Encode::decode("Guess", $data);
+
+=item Encode::Guess->guess($data)
+
+But it will croak if:
+
+=over
+
+=item *
+
+Two or more suspects remain
+
+=item *
+
+No suspects left
+
+=back
+
+So you should instead try this;
+
+ my $decoder = Encode::Guess->guess($data);
+
+On success, $decoder is an object that is documented in
+L<Encode::Encoding>. So you can now do this;
+
+ my $utf8 = $decoder->decode($data);
+
+On failure, $decoder now contains an error message so the whole thing
+would be as follows;
+
+ my $decoder = Encode::Guess->guess($data);
+ die $decoder unless ref($decoder);
+ my $utf8 = $decoder->decode($data);
+
+=item guess_encoding($data, [, I<list of suspects>])
+
+You can also try C<guess_encoding> function which is exported by
+default. It takes $data to check and it also takes the list of
+suspects by option. The optional suspect list is I<not reflected> to
+the internal suspects list.
+
+ my $decoder = guess_encoding($data, qw/euc-jp euc-kr euc-cn/);
+ die $decoder unless ref($decoder);
+ my $utf8 = $decoder->decode($data);
+ # check only ascii and utf8
+ my $decoder = guess_encoding($data);
+
+=back
+
+=head1 CAVEATS
+
+=over 4
+
+=item *
+
+Because of the algorithm used, ISO-8859 series and other single-byte
+encodings do not work well unless either one of ISO-8859 is the only
+one suspect (besides ascii and utf8).
+
+ use Encode::Guess;
+ # perhaps ok
+ my $decoder = guess_encoding($data, 'latin1');
+ # definitely NOT ok
+ my $decoder = guess_encoding($data, qw/latin1 greek/);
+
+The reason is that Encode::Guess guesses encoding by trial and error.
+It first splits $data into lines and tries to decode the line for each
+suspect. It keeps it going until all but one encoding is eliminated
+out of suspects list. ISO-8859 series is just too successful for most
+cases (because it fills almost all code points in \x00-\xff).
+
+=item *
+
+Do not mix national standard encodings and the corresponding vendor
+encodings.
+
+ # a very bad idea
+ my $decoder
+ = guess_encoding($data, qw/shiftjis MacJapanese cp932/);
+
+The reason is that vendor encoding is usually a superset of national
+standard so it becomes too ambiguous for most cases.
+
+=item *
+
+On the other hand, mixing various national standard encodings
+automagically works unless $data is too short to allow for guessing.
+
+ # This is ok if $data is long enough
+ my $decoder =
+ guess_encoding($data, qw/euc-cn
+ euc-jp shiftjis 7bit-jis
+ euc-kr
+ big5-eten/);
+
+=item *
+
+DO NOT PUT TOO MANY SUSPECTS! Don't you try something like this!
+
+ my $decoder = guess_encoding($data,
+ Encode->encodings(":all"));
+
+=back
+
+It is, after all, just a guess. You should alway be explicit when it
+comes to encodings. But there are some, especially Japanese,
+environment that guess-coding is a must. Use this module with care.
+
+=head1 TO DO
+
+Encode::Guess does not work on EBCDIC platforms.
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::Encoding>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/JP.pm b/Master/tlpkg/tlperl.straw/lib/Encode/JP.pm
new file mode 100755
index 00000000000..4251170c561
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/JP.pm
@@ -0,0 +1,95 @@
+package Encode::JP;
+BEGIN {
+ if ( ord("A") == 193 ) {
+ die "Encode::JP not supported on EBCDIC\n";
+ }
+}
+use strict;
+use warnings;
+use Encode;
+our $VERSION = do { my @r = ( q$Revision: 2.4 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+use XSLoader;
+XSLoader::load( __PACKAGE__, $VERSION );
+
+use Encode::JP::JIS7;
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::JP - Japanese Encodings
+
+=head1 SYNOPSIS
+
+ use Encode qw/encode decode/;
+ $euc_jp = encode("euc-jp", $utf8); # loads Encode::JP implicitly
+ $utf8 = decode("euc-jp", $euc_jp); # ditto
+
+=head1 ABSTRACT
+
+This module implements Japanese charset encodings. Encodings
+supported are as follows.
+
+ Canonical Alias Description
+ --------------------------------------------------------------------
+ euc-jp /\beuc.*jp$/i EUC (Extended Unix Character)
+ /\bjp.*euc/i
+ /\bujis$/i
+ shiftjis /\bshift.*jis$/i Shift JIS (aka MS Kanji)
+ /\bsjis$/i
+ 7bit-jis /\bjis$/i 7bit JIS
+ iso-2022-jp ISO-2022-JP [RFC1468]
+ = 7bit JIS with all Halfwidth Kana
+ converted to Fullwidth
+ iso-2022-jp-1 ISO-2022-JP-1 [RFC2237]
+ = ISO-2022-JP with JIS X 0212-1990
+ support. See below
+ MacJapanese Shift JIS + Apple vendor mappings
+ cp932 /\bwindows-31j$/i Code Page 932
+ = Shift JIS + MS/IBM vendor mappings
+ jis0201-raw JIS0201, raw format
+ jis0208-raw JIS0201, raw format
+ jis0212-raw JIS0201, raw format
+ --------------------------------------------------------------------
+
+=head1 DESCRIPTION
+
+To find out how to use this module in detail, see L<Encode>.
+
+=head1 Note on ISO-2022-JP(-1)?
+
+ISO-2022-JP-1 (RFC2237) is a superset of ISO-2022-JP (RFC1468) which
+adds support for JIS X 0212-1990. That means you can use the same
+code to decode to utf8 but not vice versa.
+
+ $utf8 = decode('iso-2022-jp-1', $stream);
+
+and
+
+ $utf8 = decode('iso-2022-jp', $stream);
+
+yield the same result but
+
+ $with_0212 = encode('iso-2022-jp-1', $utf8);
+
+is now different from
+
+ $without_0212 = encode('iso-2022-jp', $utf8 );
+
+In the latter case, characters that map to 0212 are first converted
+to U+3013 (0xA2AE in EUC-JP; a white square also known as 'Tofu' or
+'geta mark') then fed to the decoding engine. U+FFFD is not used,
+in order to preserve text layout as much as possible.
+
+=head1 BUGS
+
+The ASCII region (0x00-0x7f) is preserved for all encodings, even
+though this conflicts with mappings by the Unicode Consortium.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/JP/H2Z.pm b/Master/tlpkg/tlperl.straw/lib/Encode/JP/H2Z.pm
new file mode 100755
index 00000000000..f8e2230da11
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/JP/H2Z.pm
@@ -0,0 +1,176 @@
+#
+# $Id: H2Z.pm,v 2.2 2006/06/03 20:28:48 dankogai Exp $
+#
+
+package Encode::JP::H2Z;
+
+use strict;
+use warnings;
+
+our $RCSID = q$Id: H2Z.pm,v 2.2 2006/06/03 20:28:48 dankogai Exp $;
+our $VERSION = do { my @r = ( q$Revision: 2.2 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+use Encode::CJKConstants qw(:all);
+
+use vars qw(%_D2Z $_PAT_D2Z
+ %_Z2D $_PAT_Z2D
+ %_H2Z $_PAT_H2Z
+ %_Z2H $_PAT_Z2H);
+
+%_H2Z = (
+ "\x8e\xa1" => "\xa1\xa3", #¡£
+ "\x8e\xa2" => "\xa1\xd6", #¡Ö
+ "\x8e\xa3" => "\xa1\xd7", #¡×
+ "\x8e\xa4" => "\xa1\xa2", #¡¢
+ "\x8e\xa5" => "\xa1\xa6", #¡¦
+ "\x8e\xa6" => "\xa5\xf2", #¥ò
+ "\x8e\xa7" => "\xa5\xa1", #¥¡
+ "\x8e\xa8" => "\xa5\xa3", #¥£
+ "\x8e\xa9" => "\xa5\xa5", #¥¥
+ "\x8e\xaa" => "\xa5\xa7", #¥§
+ "\x8e\xab" => "\xa5\xa9", #¥©
+ "\x8e\xac" => "\xa5\xe3", #¥ã
+ "\x8e\xad" => "\xa5\xe5", #¥å
+ "\x8e\xae" => "\xa5\xe7", #¥ç
+ "\x8e\xaf" => "\xa5\xc3", #¥Ã
+ "\x8e\xb0" => "\xa1\xbc", #¡¼
+ "\x8e\xb1" => "\xa5\xa2", #¥¢
+ "\x8e\xb2" => "\xa5\xa4", #¥¤
+ "\x8e\xb3" => "\xa5\xa6", #¥¦
+ "\x8e\xb4" => "\xa5\xa8", #¥¨
+ "\x8e\xb5" => "\xa5\xaa", #¥ª
+ "\x8e\xb6" => "\xa5\xab", #¥«
+ "\x8e\xb7" => "\xa5\xad", #¥­
+ "\x8e\xb8" => "\xa5\xaf", #¥¯
+ "\x8e\xb9" => "\xa5\xb1", #¥±
+ "\x8e\xba" => "\xa5\xb3", #¥³
+ "\x8e\xbb" => "\xa5\xb5", #¥µ
+ "\x8e\xbc" => "\xa5\xb7", #¥·
+ "\x8e\xbd" => "\xa5\xb9", #¥¹
+ "\x8e\xbe" => "\xa5\xbb", #¥»
+ "\x8e\xbf" => "\xa5\xbd", #¥½
+ "\x8e\xc0" => "\xa5\xbf", #¥¿
+ "\x8e\xc1" => "\xa5\xc1", #¥Á
+ "\x8e\xc2" => "\xa5\xc4", #¥Ä
+ "\x8e\xc3" => "\xa5\xc6", #¥Æ
+ "\x8e\xc4" => "\xa5\xc8", #¥È
+ "\x8e\xc5" => "\xa5\xca", #¥Ê
+ "\x8e\xc6" => "\xa5\xcb", #¥Ë
+ "\x8e\xc7" => "\xa5\xcc", #¥Ì
+ "\x8e\xc8" => "\xa5\xcd", #¥Í
+ "\x8e\xc9" => "\xa5\xce", #¥Î
+ "\x8e\xca" => "\xa5\xcf", #¥Ï
+ "\x8e\xcb" => "\xa5\xd2", #¥Ò
+ "\x8e\xcc" => "\xa5\xd5", #¥Õ
+ "\x8e\xcd" => "\xa5\xd8", #¥Ø
+ "\x8e\xce" => "\xa5\xdb", #¥Û
+ "\x8e\xcf" => "\xa5\xde", #¥Þ
+ "\x8e\xd0" => "\xa5\xdf", #¥ß
+ "\x8e\xd1" => "\xa5\xe0", #¥à
+ "\x8e\xd2" => "\xa5\xe1", #¥á
+ "\x8e\xd3" => "\xa5\xe2", #¥â
+ "\x8e\xd4" => "\xa5\xe4", #¥ä
+ "\x8e\xd5" => "\xa5\xe6", #¥æ
+ "\x8e\xd6" => "\xa5\xe8", #¥è
+ "\x8e\xd7" => "\xa5\xe9", #¥é
+ "\x8e\xd8" => "\xa5\xea", #¥ê
+ "\x8e\xd9" => "\xa5\xeb", #¥ë
+ "\x8e\xda" => "\xa5\xec", #¥ì
+ "\x8e\xdb" => "\xa5\xed", #¥í
+ "\x8e\xdc" => "\xa5\xef", #¥ï
+ "\x8e\xdd" => "\xa5\xf3", #¥ó
+ "\x8e\xde" => "\xa1\xab", #¡«
+ "\x8e\xdf" => "\xa1\xac", #¡¬
+);
+
+%_D2Z = (
+ "\x8e\xb6\x8e\xde" => "\xa5\xac", #¥¬
+ "\x8e\xb7\x8e\xde" => "\xa5\xae", #¥®
+ "\x8e\xb8\x8e\xde" => "\xa5\xb0", #¥°
+ "\x8e\xb9\x8e\xde" => "\xa5\xb2", #¥²
+ "\x8e\xba\x8e\xde" => "\xa5\xb4", #¥´
+ "\x8e\xbb\x8e\xde" => "\xa5\xb6", #¥¶
+ "\x8e\xbc\x8e\xde" => "\xa5\xb8", #¥¸
+ "\x8e\xbd\x8e\xde" => "\xa5\xba", #¥º
+ "\x8e\xbe\x8e\xde" => "\xa5\xbc", #¥¼
+ "\x8e\xbf\x8e\xde" => "\xa5\xbe", #¥¾
+ "\x8e\xc0\x8e\xde" => "\xa5\xc0", #¥À
+ "\x8e\xc1\x8e\xde" => "\xa5\xc2", #¥Â
+ "\x8e\xc2\x8e\xde" => "\xa5\xc5", #¥Å
+ "\x8e\xc3\x8e\xde" => "\xa5\xc7", #¥Ç
+ "\x8e\xc4\x8e\xde" => "\xa5\xc9", #¥É
+ "\x8e\xca\x8e\xde" => "\xa5\xd0", #¥Ð
+ "\x8e\xcb\x8e\xde" => "\xa5\xd3", #¥Ó
+ "\x8e\xcc\x8e\xde" => "\xa5\xd6", #¥Ö
+ "\x8e\xcd\x8e\xde" => "\xa5\xd9", #¥Ù
+ "\x8e\xce\x8e\xde" => "\xa5\xdc", #¥Ü
+ "\x8e\xca\x8e\xdf" => "\xa5\xd1", #¥Ñ
+ "\x8e\xcb\x8e\xdf" => "\xa5\xd4", #¥Ô
+ "\x8e\xcc\x8e\xdf" => "\xa5\xd7", #¥×
+ "\x8e\xcd\x8e\xdf" => "\xa5\xda", #¥Ú
+ "\x8e\xce\x8e\xdf" => "\xa5\xdd", #¥Ý
+ "\x8e\xb3\x8e\xde" => "\xa5\xf4", #¥ô
+);
+
+# init only once;
+
+#$_PAT_D2Z = join("|", keys %_D2Z);
+#$_PAT_H2Z = join("|", keys %_H2Z);
+
+%_Z2H = reverse %_H2Z;
+%_Z2D = reverse %_D2Z;
+
+#$_PAT_Z2H = join("|", keys %_Z2H);
+#$_PAT_Z2D = join("|", keys %_Z2D);
+
+sub h2z {
+ no warnings qw(uninitialized);
+ my $r_str = shift;
+ my ($keep_dakuten) = @_;
+ my $n = 0;
+ unless ($keep_dakuten) {
+ $n = (
+ $$r_str =~ s(
+ ($RE{EUC_KANA}
+ (?:\x8e[\xde\xdf])?)
+ ){
+ my $str = $1;
+ $_D2Z{$str} || $_H2Z{$str} ||
+ # in case dakuten and handakuten are side-by-side!
+ $_H2Z{substr($str,0,2)} . $_H2Z{substr($str,2,2)};
+ }eogx
+ );
+ }
+ else {
+ $n = (
+ $$r_str =~ s(
+ ($RE{EUC_KANA})
+ ){
+ $_H2Z{$1};
+ }eogx
+ );
+ }
+ $n;
+}
+
+sub z2h {
+ my $r_str = shift;
+ my $n = (
+ $$r_str =~ s(
+ ($RE{EUC_C}|$RE{EUC_0212}|$RE{EUC_KANA})
+ ){
+ $_Z2D{$1} || $_Z2H{$1} || $1;
+ }eogx
+ );
+ $n;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Encode::JP::H2Z -- internally used by Encode::JP::2022_JP*
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/JP/JIS7.pm b/Master/tlpkg/tlperl.straw/lib/Encode/JP/JIS7.pm
new file mode 100755
index 00000000000..3b5699c7fd0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/JP/JIS7.pm
@@ -0,0 +1,165 @@
+package Encode::JP::JIS7;
+use strict;
+use warnings;
+our $VERSION = do { my @r = ( q$Revision: 2.4 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+use Encode qw(:fallbacks);
+
+for my $name ( '7bit-jis', 'iso-2022-jp', 'iso-2022-jp-1' ) {
+ my $h2z = ( $name eq '7bit-jis' ) ? 0 : 1;
+ my $jis0212 = ( $name eq 'iso-2022-jp' ) ? 0 : 1;
+
+ $Encode::Encoding{$name} = bless {
+ Name => $name,
+ h2z => $h2z,
+ jis0212 => $jis0212,
+ } => __PACKAGE__;
+}
+
+use base qw(Encode::Encoding);
+
+# we override this to 1 so PerlIO works
+sub needs_lines { 1 }
+
+use Encode::CJKConstants qw(:all);
+
+#
+# decode is identical for all 2022 variants
+#
+
+sub decode($$;$) {
+ my ( $obj, $str, $chk ) = @_;
+ my $residue = '';
+ if ($chk) {
+ $str =~ s/([^\x00-\x7f].*)$//so and $residue = $1;
+ }
+ $residue .= jis_euc( \$str );
+ $_[1] = $residue if $chk;
+ return Encode::decode( 'euc-jp', $str, FB_PERLQQ );
+}
+
+#
+# encode is different
+#
+
+sub encode($$;$) {
+ require Encode::JP::H2Z;
+ my ( $obj, $utf8, $chk ) = @_;
+
+ # empty the input string in the stack so perlio is ok
+ $_[1] = '' if $chk;
+ my ( $h2z, $jis0212 ) = @$obj{qw(h2z jis0212)};
+ my $octet = Encode::encode( 'euc-jp', $utf8, $chk );
+ $h2z and &Encode::JP::H2Z::h2z( \$octet );
+ euc_jis( \$octet, $jis0212 );
+ return $octet;
+}
+
+#
+# cat_decode
+#
+my $re_scan_jis_g = qr{
+ \G ( ($RE{JIS_0212}) | $RE{JIS_0208} |
+ ($RE{ISO_ASC}) | ($RE{JIS_KANA}) | )
+ ([^\e]*)
+}x;
+
+sub cat_decode { # ($obj, $dst, $src, $pos, $trm, $chk)
+ my ( $obj, undef, undef, $pos, $trm ) = @_; # currently ignores $chk
+ my ( $rdst, $rsrc, $rpos ) = \@_[ 1, 2, 3 ];
+ local ${^ENCODING};
+ use bytes;
+ my $opos = pos($$rsrc);
+ pos($$rsrc) = $pos;
+ while ( $$rsrc =~ /$re_scan_jis_g/gc ) {
+ my ( $esc, $esc_0212, $esc_asc, $esc_kana, $chunk ) =
+ ( $1, $2, $3, $4, $5 );
+
+ unless ($chunk) { $esc or last; next; }
+
+ if ( $esc && !$esc_asc ) {
+ $chunk =~ tr/\x21-\x7e/\xa1-\xfe/;
+ if ($esc_kana) {
+ $chunk =~ s/([\xa1-\xdf])/\x8e$1/og;
+ }
+ elsif ($esc_0212) {
+ $chunk =~ s/([\xa1-\xfe][\xa1-\xfe])/\x8f$1/og;
+ }
+ $chunk = Encode::decode( 'euc-jp', $chunk, 0 );
+ }
+ elsif ( ( my $npos = index( $chunk, $trm ) ) >= 0 ) {
+ $$rdst .= substr( $chunk, 0, $npos + length($trm) );
+ $$rpos += length($esc) + $npos + length($trm);
+ pos($$rsrc) = $opos;
+ return 1;
+ }
+ $$rdst .= $chunk;
+ $$rpos = pos($$rsrc);
+ }
+ $$rpos = pos($$rsrc);
+ pos($$rsrc) = $opos;
+ return '';
+}
+
+# JIS<->EUC
+my $re_scan_jis = qr{
+ (?:($RE{JIS_0212})|$RE{JIS_0208}|($RE{ISO_ASC})|($RE{JIS_KANA}))([^\e]*)
+}x;
+
+sub jis_euc {
+ local ${^ENCODING};
+ my $r_str = shift;
+ $$r_str =~ s($re_scan_jis)
+ {
+ my ($esc_0212, $esc_asc, $esc_kana, $chunk) =
+ ($1, $2, $3, $4);
+ if (!$esc_asc) {
+ $chunk =~ tr/\x21-\x7e/\xa1-\xfe/;
+ if ($esc_kana) {
+ $chunk =~ s/([\xa1-\xdf])/\x8e$1/og;
+ }
+ elsif ($esc_0212) {
+ $chunk =~ s/([\xa1-\xfe][\xa1-\xfe])/\x8f$1/og;
+ }
+ }
+ $chunk;
+ }geox;
+ my ($residue) = ( $$r_str =~ s/(\e.*)$//so );
+ return $residue;
+}
+
+sub euc_jis {
+ no warnings qw(uninitialized);
+ local ${^ENCODING};
+ my $r_str = shift;
+ my $jis0212 = shift;
+ $$r_str =~ s{
+ ((?:$RE{EUC_C})+|(?:$RE{EUC_KANA})+|(?:$RE{EUC_0212})+)
+ }{
+ my $chunk = $1;
+ my $esc =
+ ( $chunk =~ tr/\x8E//d ) ? $ESC{KANA} :
+ ( $chunk =~ tr/\x8F//d ) ? $ESC{JIS_0212} :
+ $ESC{JIS_0208};
+ if ($esc eq $ESC{JIS_0212} && !$jis0212){
+ # fallback to '?'
+ $chunk =~ tr/\xA1-\xFE/\x3F/;
+ }else{
+ $chunk =~ tr/\xA1-\xFE/\x21-\x7E/;
+ }
+ $esc . $chunk . $ESC{ASC};
+ }geox;
+ $$r_str =~ s/\Q$ESC{ASC}\E
+ (\Q$ESC{KANA}\E|\Q$ESC{JIS_0212}\E|\Q$ESC{JIS_0208}\E)/$1/gox;
+ $$r_str;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Encode::JP::JIS7 -- internally used by Encode::JP
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/KR.pm b/Master/tlpkg/tlperl.straw/lib/Encode/KR.pm
new file mode 100755
index 00000000000..cf2c1174e4b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/KR.pm
@@ -0,0 +1,69 @@
+package Encode::KR;
+BEGIN {
+ if ( ord("A") == 193 ) {
+ die "Encode::KR not supported on EBCDIC\n";
+ }
+}
+use strict;
+use warnings;
+use Encode;
+our $VERSION = do { my @r = ( q$Revision: 2.3 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+use XSLoader;
+XSLoader::load( __PACKAGE__, $VERSION );
+
+use Encode::KR::2022_KR;
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::KR - Korean Encodings
+
+=head1 SYNOPSIS
+
+ use Encode qw/encode decode/;
+ $euc_kr = encode("euc-kr", $utf8); # loads Encode::KR implicitly
+ $utf8 = decode("euc-kr", $euc_kr); # ditto
+
+=head1 DESCRIPTION
+
+This module implements Korean charset encodings. Encodings supported
+are as follows.
+
+
+ Canonical Alias Description
+ --------------------------------------------------------------------
+ euc-kr /\beuc.*kr$/i EUC (Extended Unix Character)
+ /\bkr.*euc$/i
+ ksc5601-raw Korean standard code set (as is)
+ cp949 /(?:x-)?uhc$/i
+ /(?:x-)?windows-949$/i
+ /\bks_c_5601-1987$/i
+ Code Page 949 (EUC-KR + 8,822
+ (additional Hangul syllables)
+ MacKorean EUC-KR + Apple Vendor Mappings
+ johab JOHAB A supplementary encoding defined in
+ Annex 3 of KS X 1001:1998
+ iso-2022-kr iso-2022-kr [RFC1557]
+ --------------------------------------------------------------------
+
+To find how to use this module in detail, see L<Encode>.
+
+=head1 BUGS
+
+When you see C<charset=ks_c_5601-1987> on mails and web pages, they really
+mean "cp949" encodings. To fix that, the following aliases are set;
+
+ qr/(?:x-)?uhc$/i => '"cp949"'
+ qr/(?:x-)?windows-949$/i => '"cp949"'
+ qr/ks_c_5601-1987$/i => '"cp949"'
+
+The ASCII region (0x00-0x7f) is preserved for all encodings, even
+though this conflicts with mappings by the Unicode Consortium.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/KR/2022_KR.pm b/Master/tlpkg/tlperl.straw/lib/Encode/KR/2022_KR.pm
new file mode 100755
index 00000000000..0218d971ee2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/KR/2022_KR.pm
@@ -0,0 +1,81 @@
+package Encode::KR::2022_KR;
+use strict;
+use warnings;
+our $VERSION = do { my @r = ( q$Revision: 2.2 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+use Encode qw(:fallbacks);
+
+use base qw(Encode::Encoding);
+__PACKAGE__->Define('iso-2022-kr');
+
+sub needs_lines { 1 }
+
+sub perlio_ok {
+ return 0; # for the time being
+}
+
+sub decode {
+ my ( $obj, $str, $chk ) = @_;
+ my $res = $str;
+ my $residue = iso_euc( \$res );
+
+ # This is for PerlIO
+ $_[1] = $residue if $chk;
+ return Encode::decode( 'euc-kr', $res, FB_PERLQQ );
+}
+
+sub encode {
+ my ( $obj, $utf8, $chk ) = @_;
+
+ # empty the input string in the stack so perlio is ok
+ $_[1] = '' if $chk;
+ my $octet = Encode::encode( 'euc-kr', $utf8, FB_PERLQQ );
+ euc_iso( \$octet );
+ return $octet;
+}
+
+use Encode::CJKConstants qw(:all);
+
+# ISO<->EUC
+
+sub iso_euc {
+ my $r_str = shift;
+ $$r_str =~ s/$RE{'2022_KR'}//gox; # remove the designator
+ $$r_str =~ s{ # replace characters in GL
+ \x0e # between SO(\x0e) and SI(\x0f)
+ ([^\x0f]*) # with characters in GR
+ \x0f
+ }
+ {
+ my $out= $1;
+ $out =~ tr/\x21-\x7e/\xa1-\xfe/;
+ $out;
+ }geox;
+ my ($residue) = ( $$r_str =~ s/(\e.*)$//so );
+ return $residue;
+}
+
+sub euc_iso {
+ no warnings qw(uninitialized);
+ my $r_str = shift;
+ substr( $$r_str, 0, 0 ) =
+ $ESC{'2022_KR'}; # put the designator at the beg.
+ $$r_str =~
+ s{ # move KS X 1001 characters in GR to GL
+ ($RE{EUC_C}+) # and enclose them with SO and SI
+ }{
+ my $str = $1;
+ $str =~ tr/\xA1-\xFE/\x21-\x7E/;
+ "\x0e" . $str . "\x0f";
+ }geox;
+ $$r_str;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::KR::2022_KR -- internally used by Encode::KR
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/MIME/Header.pm b/Master/tlpkg/tlperl.straw/lib/Encode/MIME/Header.pm
new file mode 100755
index 00000000000..9728dc32d89
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/MIME/Header.pm
@@ -0,0 +1,241 @@
+package Encode::MIME::Header;
+use strict;
+use warnings;
+no warnings 'redefine';
+
+our $VERSION = do { my @r = ( q$Revision: 2.11 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+use Encode qw(find_encoding encode_utf8 decode_utf8);
+use MIME::Base64;
+use Carp;
+
+my %seed = (
+ decode_b => '1', # decodes 'B' encoding ?
+ decode_q => '1', # decodes 'Q' encoding ?
+ encode => 'B', # encode with 'B' or 'Q' ?
+ bpl => 75, # bytes per line
+);
+
+$Encode::Encoding{'MIME-Header'} =
+ bless { %seed, Name => 'MIME-Header', } => __PACKAGE__;
+
+$Encode::Encoding{'MIME-B'} = bless {
+ %seed,
+ decode_q => 0,
+ Name => 'MIME-B',
+} => __PACKAGE__;
+
+$Encode::Encoding{'MIME-Q'} = bless {
+ %seed,
+ decode_q => 1,
+ encode => 'Q',
+ Name => 'MIME-Q',
+} => __PACKAGE__;
+
+use base qw(Encode::Encoding);
+
+sub needs_lines { 1 }
+sub perlio_ok { 0 }
+
+sub decode($$;$) {
+ use utf8;
+ my ( $obj, $str, $chk ) = @_;
+
+ # zap spaces between encoded words
+ $str =~ s/\?=\s+=\?/\?==\?/gos;
+
+ # multi-line header to single line
+ $str =~ s/(?:\r\n|[\r\n])[ \t]//gos;
+
+ 1 while ( $str =~
+ s/(=\?[-0-9A-Za-z_]+\?[Qq]\?)(.*?)\?=\1(.*?\?=)/$1$2$3/ )
+ ; # Concat consecutive QP encoded mime headers
+ # Fixes breaking inside multi-byte characters
+
+ $str =~ s{
+ =\? # begin encoded word
+ ([-0-9A-Za-z_]+) # charset (encoding)
+ (?:\*[A-Za-z]{1,8}(?:-[A-Za-z]{1,8})*)? # language (RFC 2231)
+ \?([QqBb])\? # delimiter
+ (.*?) # Base64-encodede contents
+ \?= # end encoded word
+ }{
+ if (uc($2) eq 'B'){
+ $obj->{decode_b} or croak qq(MIME "B" unsupported);
+ decode_b($1, $3, $chk);
+ } elsif (uc($2) eq 'Q'){
+ $obj->{decode_q} or croak qq(MIME "Q" unsupported);
+ decode_q($1, $3, $chk);
+ } else {
+ croak qq(MIME "$2" encoding is nonexistent!);
+ }
+ }egox;
+ $_[1] = $str if $chk;
+ return $str;
+}
+
+sub decode_b {
+ my $enc = shift;
+ my $d = find_encoding($enc) or croak qq(Unknown encoding "$enc");
+ my $db64 = decode_base64(shift);
+ my $chk = shift;
+ return $d->name eq 'utf8'
+ ? Encode::decode_utf8($db64)
+ : $d->decode( $db64, $chk || Encode::FB_PERLQQ );
+}
+
+sub decode_q {
+ my ( $enc, $q, $chk ) = @_;
+ my $d = find_encoding($enc) or croak qq(Unknown encoding "$enc");
+ $q =~ s/_/ /go;
+ $q =~ s/=([0-9A-Fa-f]{2})/pack("C", hex($1))/ego;
+ return $d->name eq 'utf8'
+ ? Encode::decode_utf8($q)
+ : $d->decode( $q, $chk || Encode::FB_PERLQQ );
+}
+
+my $especials =
+ join( '|' => map { quotemeta( chr($_) ) }
+ unpack( "C*", qq{()<>@,;:"'/[]?.=} ) );
+
+my $re_encoded_word = qr{
+ =\? # begin encoded word
+ (?:[-0-9A-Za-z_]+) # charset (encoding)
+ (?:\*[A-Za-z]{1,8}(?:-[A-Za-z]{1,8})*)? # language (RFC 2231)
+ \?(?:[QqBb])\? # delimiter
+ (?:.*?) # Base64-encodede contents
+ \?= # end encoded word
+}xo;
+
+my $re_especials = qr{$re_encoded_word|$especials}xo;
+
+sub encode($$;$) {
+ my ( $obj, $str, $chk ) = @_;
+ my @line = ();
+ for my $line ( split /\r\n|[\r\n]/o, $str ) {
+ my ( @word, @subline );
+ for my $word ( split /($re_especials)/o, $line ) {
+ if ( $word =~ /[^\x00-\x7f]/o
+ or $word =~ /^$re_encoded_word$/o )
+ {
+ push @word, $obj->_encode($word);
+ }
+ else {
+ push @word, $word;
+ }
+ }
+ my $subline = '';
+ for my $word (@word) {
+ use bytes ();
+ if ( bytes::length($subline) + bytes::length($word) >
+ $obj->{bpl} )
+ {
+ push @subline, $subline;
+ $subline = '';
+ }
+ $subline .= $word;
+ }
+ $subline and push @subline, $subline;
+ push @line, join( "\n " => @subline );
+ }
+ $_[1] = '' if $chk;
+ return join( "\n", @line );
+}
+
+use constant HEAD => '=?UTF-8?';
+use constant TAIL => '?=';
+use constant SINGLE => { B => \&_encode_b, Q => \&_encode_q, };
+
+sub _encode {
+ my ( $o, $str ) = @_;
+ my $enc = $o->{encode};
+ my $llen = ( $o->{bpl} - length(HEAD) - 2 - length(TAIL) );
+
+ # to coerce a floating-point arithmetics, the following contains
+ # .0 in numbers -- dankogai
+ $llen *= $enc eq 'B' ? 3.0 / 4.0 : 1.0 / 3.0;
+ my @result = ();
+ my $chunk = '';
+ while ( length( my $chr = substr( $str, 0, 1, '' ) ) ) {
+ use bytes ();
+ if ( bytes::length($chunk) + bytes::length($chr) > $llen ) {
+ push @result, SINGLE->{$enc}($chunk);
+ $chunk = '';
+ }
+ $chunk .= $chr;
+ }
+ length($chunk) and push @result, SINGLE->{$enc}($chunk);
+ return @result;
+}
+
+sub _encode_b {
+ HEAD . 'B?' . encode_base64( encode_utf8(shift), '' ) . TAIL;
+}
+
+sub _encode_q {
+ my $chunk = shift;
+ $chunk = encode_utf8($chunk);
+ $chunk =~ s{
+ ([^0-9A-Za-z])
+ }{
+ join("" => map {sprintf "=%02X", $_} unpack("C*", $1))
+ }egox;
+ return HEAD . 'Q?' . $chunk . TAIL;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::MIME::Header -- MIME 'B' and 'Q' header encoding
+
+=head1 SYNOPSIS
+
+ use Encode qw/encode decode/;
+ $utf8 = decode('MIME-Header', $header);
+ $header = encode('MIME-Header', $utf8);
+
+=head1 ABSTRACT
+
+This module implements RFC 2047 Mime Header Encoding. There are 3
+variant encoding names; C<MIME-Header>, C<MIME-B> and C<MIME-Q>. The
+difference is described below
+
+ decode() encode()
+ ----------------------------------------------
+ MIME-Header Both B and Q =?UTF-8?B?....?=
+ MIME-B B only; Q croaks =?UTF-8?B?....?=
+ MIME-Q Q only; B croaks =?UTF-8?Q?....?=
+
+=head1 DESCRIPTION
+
+When you decode(=?I<encoding>?I<X>?I<ENCODED WORD>?=), I<ENCODED WORD>
+is extracted and decoded for I<X> encoding (B for Base64, Q for
+Quoted-Printable). Then the decoded chunk is fed to
+decode(I<encoding>). So long as I<encoding> is supported by Encode,
+any source encoding is fine.
+
+When you encode, it just encodes UTF-8 string with I<X> encoding then
+quoted with =?UTF-8?I<X>?....?= . The parts that RFC 2047 forbids to
+encode are left as is and long lines are folded within 76 bytes per
+line.
+
+=head1 BUGS
+
+It would be nice to support encoding to non-UTF8, such as =?ISO-2022-JP?
+and =?ISO-8859-1?= but that makes the implementation too complicated.
+These days major mail agents all support =?UTF-8? so I think it is
+just good enough.
+
+Due to popular demand, 'MIME-Header-ISO_2022_JP' was introduced by
+Makamaka. Thre are still too many MUAs especially cellular phone
+handsets which does not grok UTF-8.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+RFC 2047, L<http://www.faqs.org/rfcs/rfc2047.html> and many other
+locations.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/MIME/Header/ISO_2022_JP.pm b/Master/tlpkg/tlperl.straw/lib/Encode/MIME/Header/ISO_2022_JP.pm
new file mode 100755
index 00000000000..4abfbd05ef8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/MIME/Header/ISO_2022_JP.pm
@@ -0,0 +1,131 @@
+package Encode::MIME::Header::ISO_2022_JP;
+
+use strict;
+use warnings;
+
+use base qw(Encode::MIME::Header);
+
+$Encode::Encoding{'MIME-Header-ISO_2022_JP'} =
+ bless { encode => 'B', bpl => 76, Name => 'MIME-Header-ISO_2022_JP' } =>
+ __PACKAGE__;
+
+use constant HEAD => '=?ISO-2022-JP?B?';
+use constant TAIL => '?=';
+
+use Encode::CJKConstants qw(%RE);
+
+our $VERSION = do { my @r = ( q$Revision: 1.3 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+# I owe the below codes totally to
+# Jcode by Dan Kogai & http://www.din.or.jp/~ohzaki/perl.htm#JP_Base64
+
+sub encode {
+ my $self = shift;
+ my $str = shift;
+
+ utf8::encode($str) if ( Encode::is_utf8($str) );
+ Encode::from_to( $str, 'utf8', 'euc-jp' );
+
+ my ($trailing_crlf) = ( $str =~ /(\n|\r|\x0d\x0a)$/o );
+
+ $str = _mime_unstructured_header( $str, $self->{bpl} );
+
+ not $trailing_crlf and $str =~ s/(\n|\r|\x0d\x0a)$//o;
+
+ return $str;
+}
+
+sub _mime_unstructured_header {
+ my ( $oldheader, $bpl ) = @_;
+ my $crlf = $oldheader =~ /\n$/;
+ my ( $header, @words, @wordstmp, $i ) = ('');
+
+ $oldheader =~ s/\s+$//;
+
+ @wordstmp = split /\s+/, $oldheader;
+
+ for ( $i = 0 ; $i < $#wordstmp ; $i++ ) {
+ if ( $wordstmp[$i] !~ /^[\x21-\x7E]+$/
+ and $wordstmp[ $i + 1 ] !~ /^[\x21-\x7E]+$/ )
+ {
+ $wordstmp[ $i + 1 ] = "$wordstmp[$i] $wordstmp[$i + 1]";
+ }
+ else {
+ push( @words, $wordstmp[$i] );
+ }
+ }
+
+ push( @words, $wordstmp[-1] );
+
+ for my $word (@words) {
+ if ( $word =~ /^[\x21-\x7E]+$/ ) {
+ $header =~ /(?:.*\n)*(.*)/;
+ if ( length($1) + length($word) > $bpl ) {
+ $header .= "\n $word";
+ }
+ else {
+ $header .= $word;
+ }
+ }
+ else {
+ $header = _add_encoded_word( $word, $header, $bpl );
+ }
+
+ $header =~ /(?:.*\n)*(.*)/;
+
+ if ( length($1) == $bpl ) {
+ $header .= "\n ";
+ }
+ else {
+ $header .= ' ';
+ }
+ }
+
+ $header =~ s/\n? $//mg;
+
+ $crlf ? "$header\n" : $header;
+}
+
+sub _add_encoded_word {
+ my ( $str, $line, $bpl ) = @_;
+ my $result = '';
+
+ while ( length($str) ) {
+ my $target = $str;
+ $str = '';
+
+ if (
+ length($line) + 22 +
+ ( $target =~ /^(?:$RE{EUC_0212}|$RE{EUC_C})/o ) * 8 > $bpl )
+ {
+ $line =~ s/[ \t\n\r]*$/\n/;
+ $result .= $line;
+ $line = ' ';
+ }
+
+ while (1) {
+ my $iso_2022_jp = $target;
+ Encode::from_to( $iso_2022_jp, 'euc-jp', 'iso-2022-jp' );
+
+ my $encoded =
+ HEAD . MIME::Base64::encode_base64( $iso_2022_jp, '' ) . TAIL;
+
+ if ( length($encoded) + length($line) > $bpl ) {
+ $target =~
+ s/($RE{EUC_0212}|$RE{EUC_KANA}|$RE{EUC_C}|$RE{ASCII})$//o;
+ $str = $1 . $str;
+ }
+ else {
+ $line .= $encoded;
+ last;
+ }
+ }
+
+ }
+
+ $result . $line;
+}
+
+1;
+__END__
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/MIME/Name.pm b/Master/tlpkg/tlperl.straw/lib/Encode/MIME/Name.pm
new file mode 100755
index 00000000000..10d86a746dc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/MIME/Name.pm
@@ -0,0 +1,94 @@
+package Encode::MIME::Name;
+use strict;
+use warnings;
+our $VERSION = do { my @r = ( q$Revision: 1.1 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+our %MIME_NAME_OF = (
+ 'AdobeStandardEncoding' => 'Adobe-Standard-Encoding',
+ 'AdobeSymbol' => 'Adobe-Symbol-Encoding',
+ 'ascii' => 'US-ASCII',
+ 'big5-hkscs' => 'Big5-HKSCS',
+ 'cp1026' => 'IBM1026',
+ 'cp1047' => 'IBM1047',
+ 'cp1250' => 'windows-1250',
+ 'cp1251' => 'windows-1251',
+ 'cp1252' => 'windows-1252',
+ 'cp1253' => 'windows-1253',
+ 'cp1254' => 'windows-1254',
+ 'cp1255' => 'windows-1255',
+ 'cp1256' => 'windows-1256',
+ 'cp1257' => 'windows-1257',
+ 'cp1258' => 'windows-1258',
+ 'cp37' => 'IBM037',
+ 'cp424' => 'IBM424',
+ 'cp437' => 'IBM437',
+ 'cp500' => 'IBM500',
+ 'cp775' => 'IBM775',
+ 'cp850' => 'IBM850',
+ 'cp852' => 'IBM852',
+ 'cp855' => 'IBM855',
+ 'cp857' => 'IBM857',
+ 'cp860' => 'IBM860',
+ 'cp861' => 'IBM861',
+ 'cp862' => 'IBM862',
+ 'cp863' => 'IBM863',
+ 'cp864' => 'IBM864',
+ 'cp865' => 'IBM865',
+ 'cp866' => 'IBM866',
+ 'cp869' => 'IBM869',
+ 'cp936' => 'GBK',
+ 'euc-jp' => 'EUC-JP',
+ 'euc-kr' => 'EUC-KR',
+ #'gb2312-raw' => 'GB2312', # no, you're wrong, I18N::Charset
+ 'hp-roman8' => 'hp-roman8',
+ 'hz' => 'HZ-GB-2312',
+ 'iso-2022-jp' => 'ISO-2022-JP',
+ 'iso-2022-jp-1' => 'ISO-2022-JP',
+ 'iso-2022-kr' => 'ISO-2022-KR',
+ 'iso-8859-1' => 'ISO-8859-1',
+ 'iso-8859-10' => 'ISO-8859-10',
+ 'iso-8859-13' => 'ISO-8859-13',
+ 'iso-8859-14' => 'ISO-8859-14',
+ 'iso-8859-15' => 'ISO-8859-15',
+ 'iso-8859-16' => 'ISO-8859-16',
+ 'iso-8859-2' => 'ISO-8859-2',
+ 'iso-8859-3' => 'ISO-8859-3',
+ 'iso-8859-4' => 'ISO-8859-4',
+ 'iso-8859-5' => 'ISO-8859-5',
+ 'iso-8859-6' => 'ISO-8859-6',
+ 'iso-8859-7' => 'ISO-8859-7',
+ 'iso-8859-8' => 'ISO-8859-8',
+ 'iso-8859-9' => 'ISO-8859-9',
+ #'jis0201-raw' => 'JIS_X0201',
+ #'jis0208-raw' => 'JIS_C6226-1983',
+ #'jis0212-raw' => 'JIS_X0212-1990',
+ 'koi8-r' => 'KOI8-R',
+ 'koi8-u' => 'KOI8-U',
+ #'ksc5601-raw' => 'KS_C_5601-1987',
+ 'shiftjis' => 'Shift_JIS',
+ 'UTF-16' => 'UTF-16',
+ 'UTF-16BE' => 'UTF-16BE',
+ 'UTF-16LE' => 'UTF-16LE',
+ 'UTF-32' => 'UTF-32',
+ 'UTF-32BE' => 'UTF-32BE',
+ 'UTF-32LE' => 'UTF-32LE',
+ 'UTF-7' => 'UTF-7',
+ 'utf8' => 'UTF-8',
+ 'utf-8-strict' => 'UTF-8',
+ 'viscii' => 'VISCII',
+);
+
+sub get_mime_name($) { $MIME_NAME_OF{$_[0]} };
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::MIME::NAME -- internally used by Encode
+
+=head1 SEE ALSO
+
+L<I18N::Charset>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/Makefile_PL.e2x b/Master/tlpkg/tlperl.straw/lib/Encode/Makefile_PL.e2x
new file mode 100755
index 00000000000..1d83a2fbda2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/Makefile_PL.e2x
@@ -0,0 +1,180 @@
+#
+# This file is auto-generated by:
+# enc2xs version $_Version_
+# $_Now_
+#
+use 5.7.2;
+use strict;
+use ExtUtils::MakeMaker;
+use Config;
+
+# Please edit the following to the taste!
+my $name = '$_Name_';
+my %tables = (
+ $_Name__t => [ $_TableFiles_ ],
+ );
+
+#### DO NOT EDIT BEYOND THIS POINT!
+require File::Spec;
+my ($enc2xs, $encode_h) = ();
+PATHLOOP:
+for my $d (@Config{qw/bin sitebin vendorbin/},
+ (split /$Config{path_sep}/o, $ENV{PATH})){
+ for my $f (qw/enc2xs enc2xs5.7.3/){
+ my $path = File::Spec->catfile($d, $f);
+ -r $path and $enc2xs = $path and last PATHLOOP;
+ }
+}
+$enc2xs or die "enc2xs not found!";
+print "enc2xs is $enc2xs\n";
+my %encode_h = ();
+for my $d (@INC){
+ my $dir = File::Spec->catfile($d, "Encode");
+ my $file = File::Spec->catfile($dir, "encode.h");
+ -f $file and $encode_h{$dir} = -M $file;
+}
+%encode_h or die "encode.h not found!";
+# find the latest one
+($encode_h) = sort {$encode_h{$b} <=> $encode_h{$a}} keys %encode_h;
+print "encode.h is at $encode_h\n";
+
+WriteMakefile(
+ INC => "-I$encode_h",
+#### END_OF_HEADER -- DO NOT EDIT THIS LINE BY HAND! ####
+ NAME => 'Encode::'.$name,
+ VERSION_FROM => "$name.pm",
+ OBJECT => '$(O_FILES)',
+ 'dist' => {
+ COMPRESS => 'gzip -9f',
+ SUFFIX => 'gz',
+ DIST_DEFAULT => 'all tardist',
+ },
+ MAN3PODS => {},
+ PREREQ_PM => {
+ 'Encode' => "1.41",
+ },
+ # OS 390 winges about line numbers > 64K ???
+ XSOPT => '-nolinenumbers',
+ );
+
+package MY;
+
+sub post_initialize
+{
+ my ($self) = @_;
+ my %o;
+ my $x = $self->{'OBJ_EXT'};
+ # Add the table O_FILES
+ foreach my $e (keys %tables)
+ {
+ $o{$e.$x} = 1;
+ }
+ $o{"$name$x"} = 1;
+ $self->{'O_FILES'} = [sort keys %o];
+ my @files = ("$name.xs");
+ $self->{'C'} = ["$name.c"];
+ # The next two lines to make MacPerl Happy -- dankogai via pudge
+ $self->{SOURCE} .= " $name.c"
+ if $^O eq 'MacOS' && $self->{SOURCE} !~ /\b$name\.c\b/;
+ # $self->{'H'} = [$self->catfile($self->updir,'encode.h')];
+ my %xs;
+ foreach my $table (keys %tables) {
+ push (@{$self->{'C'}},"$table.c");
+ # Do NOT add $table.h etc. to H_FILES unless we own up as to how they
+ # get built.
+ foreach my $ext (qw($(OBJ_EXT) .c .h .exh .fnm)) {
+ push (@files,$table.$ext);
+ }
+ }
+ $self->{'XS'} = { "$name.xs" => "$name.c" };
+ $self->{'clean'}{'FILES'} .= join(' ',@files);
+ open(XS,">$name.xs") || die "Cannot open $name.xs:$!";
+ print XS <<'END';
+#include <EXTERN.h>
+#include <perl.h>
+#include <XSUB.h>
+#define U8 U8
+#include "encode.h"
+END
+ foreach my $table (keys %tables) {
+ print XS qq[#include "${table}.h"\n];
+ }
+ print XS <<"END";
+
+static void
+Encode_XSEncoding(pTHX_ encode_t *enc)
+{
+ dSP;
+ HV *stash = gv_stashpv("Encode::XS", TRUE);
+ SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(enc))),stash);
+ int i = 0;
+ PUSHMARK(sp);
+ XPUSHs(sv);
+ while (enc->name[i])
+ {
+ const char *name = enc->name[i++];
+ XPUSHs(sv_2mortal(newSVpvn(name,strlen(name))));
+ }
+ PUTBACK;
+ call_pv("Encode::define_encoding",G_DISCARD);
+ SvREFCNT_dec(sv);
+}
+
+MODULE = Encode::$name PACKAGE = Encode::$name
+PROTOTYPES: DISABLE
+BOOT:
+{
+END
+ foreach my $table (keys %tables) {
+ print XS qq[#include "${table}.exh"\n];
+ }
+ print XS "}\n";
+ close(XS);
+ return "# Built $name.xs\n\n";
+}
+
+sub postamble
+{
+ my $self = shift;
+ my $dir = "."; # $self->catdir('Encode');
+ my $str = "# $name\$(OBJ_EXT) depends on .h and .exh files not .c files - but all written by enc2xs\n";
+ $str .= "$name.c : $name.xs ";
+ foreach my $table (keys %tables)
+ {
+ $str .= " $table.c";
+ }
+ $str .= "\n\n";
+ $str .= "$name\$(OBJ_EXT) : $name.c\n\n";
+
+ foreach my $table (keys %tables)
+ {
+ my $numlines = 1;
+ my $lengthsofar = length($str);
+ my $continuator = '';
+ $str .= "$table.c : Makefile.PL";
+ foreach my $file (@{$tables{$table}})
+ {
+ $str .= $continuator.' '.$self->catfile($dir,$file);
+ if ( length($str)-$lengthsofar > 128*$numlines )
+ {
+ $continuator .= " \\\n\t";
+ $numlines++;
+ } else {
+ $continuator = '';
+ }
+ }
+ my $plib = $self->{PERL_CORE} ? '"-I$(PERL_LIB)"' : '';
+ my $ucopts = '-"Q"';
+ $str .=
+ qq{\n\t\$(PERL) $plib $enc2xs $ucopts -o \$\@ -f $table.fnm\n\n};
+ open (FILELIST, ">$table.fnm")
+ || die "Could not open $table.fnm: $!";
+ foreach my $file (@{$tables{$table}})
+ {
+ print FILELIST $self->catfile($dir,$file) . "\n";
+ }
+ close(FILELIST);
+ }
+ return $str;
+}
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/PerlIO.pod b/Master/tlpkg/tlperl.straw/lib/Encode/PerlIO.pod
new file mode 100755
index 00000000000..1a9269a9b0c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/PerlIO.pod
@@ -0,0 +1,167 @@
+=head1 NAME
+
+Encode::PerlIO -- a detailed document on Encode and PerlIO
+
+=head1 Overview
+
+It is very common to want to do encoding transformations when
+reading or writing files, network connections, pipes etc.
+If Perl is configured to use the new 'perlio' IO system then
+C<Encode> provides a "layer" (see L<PerlIO>) which can transform
+data as it is read or written.
+
+Here is how the blind poet would modernise the encoding:
+
+ use Encode;
+ open(my $iliad,'<:encoding(iso-8859-7)','iliad.greek');
+ open(my $utf8,'>:utf8','iliad.utf8');
+ my @epic = <$iliad>;
+ print $utf8 @epic;
+ close($utf8);
+ close($illiad);
+
+In addition, the new IO system can also be configured to read/write
+UTF-8 encoded characters (as noted above, this is efficient):
+
+ open(my $fh,'>:utf8','anything');
+ print $fh "Any \x{0021} string \N{SMILEY FACE}\n";
+
+Either of the above forms of "layer" specifications can be made the default
+for a lexical scope with the C<use open ...> pragma. See L<open>.
+
+Once a handle is open, its layers can be altered using C<binmode>.
+
+Without any such configuration, or if Perl itself is built using the
+system's own IO, then write operations assume that the file handle
+accepts only I<bytes> and will C<die> if a character larger than 255 is
+written to the handle. When reading, each octet from the handle becomes
+a byte-in-a-character. Note that this default is the same behaviour
+as bytes-only languages (including Perl before v5.6) would have,
+and is sufficient to handle native 8-bit encodings e.g. iso-8859-1,
+EBCDIC etc. and any legacy mechanisms for handling other encodings
+and binary data.
+
+In other cases, it is the program's responsibility to transform
+characters into bytes using the API above before doing writes, and to
+transform the bytes read from a handle into characters before doing
+"character operations" (e.g. C<lc>, C</\W+/>, ...).
+
+You can also use PerlIO to convert larger amounts of data you don't
+want to bring into memory. For example, to convert between ISO-8859-1
+(Latin 1) and UTF-8 (or UTF-EBCDIC in EBCDIC machines):
+
+ open(F, "<:encoding(iso-8859-1)", "data.txt") or die $!;
+ open(G, ">:utf8", "data.utf") or die $!;
+ while (<F>) { print G }
+
+ # Could also do "print G <F>" but that would pull
+ # the whole file into memory just to write it out again.
+
+More examples:
+
+ open(my $f, "<:encoding(cp1252)")
+ open(my $g, ">:encoding(iso-8859-2)")
+ open(my $h, ">:encoding(latin9)") # iso-8859-15
+
+See also L<encoding> for how to change the default encoding of the
+data in your script.
+
+=head1 How does it work?
+
+Here is a crude diagram of how filehandle, PerlIO, and Encode
+interact.
+
+ filehandle <-> PerlIO PerlIO <-> scalar (read/printed)
+ \ /
+ Encode
+
+When PerlIO receives data from either direction, it fills a buffer
+(currently with 1024 bytes) and passes the buffer to Encode.
+Encode tries to convert the valid part and passes it back to PerlIO,
+leaving invalid parts (usually a partial character) in the buffer.
+PerlIO then appends more data to the buffer, calls Encode again,
+and so on until the data stream ends.
+
+To do so, PerlIO always calls (de|en)code methods with CHECK set to 1.
+This ensures that the method stops at the right place when it
+encounters partial character. The following is what happens when
+PerlIO and Encode tries to encode (from utf8) more than 1024 bytes
+and the buffer boundary happens to be in the middle of a character.
+
+ A B C .... ~ \x{3000} ....
+ 41 42 43 .... 7E e3 80 80 ....
+ <- buffer --------------->
+ << encoded >>>>>>>>>>
+ <- next buffer ------
+
+Encode converts from the beginning to \x7E, leaving \xe3 in the buffer
+because it is invalid (partial character).
+
+Unfortunately, this scheme does not work well with escape-based
+encodings such as ISO-2022-JP.
+
+=head1 Line Buffering
+
+Now let's see what happens when you try to decode from ISO-2022-JP and
+the buffer ends in the middle of a character.
+
+ JIS208-ESC \x{5f3e}
+ A B C .... ~ \e $ B |DAN | ....
+ 41 42 43 .... 7E 1b 24 41 43 46 ....
+ <- buffer --------------------------->
+ << encoded >>>>>>>>>>>>>>>>>>>>>>>
+
+As you see, the next buffer begins with \x43. But \x43 is 'C' in
+ASCII, which is wrong in this case because we are now in JISX 0208
+area so it has to convert \x43\x46, not \x43. Unlike utf8 and EUC,
+in escape-based encodings you can't tell if a given octet is a whole
+character or just part of it.
+
+Fortunately PerlIO also supports line buffer if you tell PerlIO to use
+one instead of fixed buffer. Since ISO-2022-JP is guaranteed to revert to ASCII at the end of the line, partial
+character will never happen when line buffer is used.
+
+To tell PerlIO to use line buffer, implement -E<gt>needs_lines method
+for your encoding object. See L<Encode::Encoding> for details.
+
+Thanks to these efforts most encodings that come with Encode support
+PerlIO but that still leaves following encodings.
+
+ iso-2022-kr
+ MIME-B
+ MIME-Header
+ MIME-Q
+
+Fortunately iso-2022-kr is hardly used (according to Jungshik) and
+MIME-* are very unlikely to be fed to PerlIO because they are for mail
+headers. See L<Encode::MIME::Header> for details.
+
+=head2 How can I tell whether my encoding fully supports PerlIO ?
+
+As of this writing, any encoding whose class belongs to Encode::XS and
+Encode::Unicode works. The Encode module has a C<perlio_ok> method
+which you can use before applying PerlIO encoding to the filehandle.
+Here is an example:
+
+ my $use_perlio = perlio_ok($enc);
+ my $layer = $use_perlio ? "<:raw" : "<:encoding($enc)";
+ open my $fh, $layer, $file or die "$file : $!";
+ while(<$fh>){
+ $_ = decode($enc, $_) unless $use_perlio;
+ # ....
+ }
+
+=head1 SEE ALSO
+
+L<Encode::Encoding>,
+L<Encode::Supported>,
+L<Encode::PerlIO>,
+L<encoding>,
+L<perlebcdic>,
+L<perlfunc/open>,
+L<perlunicode>,
+L<utf8>,
+the Perl Unicode Mailing List E<lt>perl-unicode@perl.orgE<gt>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/README.e2x b/Master/tlpkg/tlperl.straw/lib/Encode/README.e2x
new file mode 100755
index 00000000000..28a31a655c2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/README.e2x
@@ -0,0 +1,31 @@
+Encode::$_Name_ version 0.1
+========
+
+NAME
+ Encode::$_Name_ - <describe encoding>
+
+SYNOPSIS
+ use Encode::$_Name_;
+ #<put more words here>
+ABSTRACT
+ <fill this in>
+INSTALLATION
+
+To install this module type the following:
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+DEPENDENCIES
+
+This module requires perl version 5.7.3 or later.
+
+COPYRIGHT AND LICENCE
+
+Copyright (C) 2002 Your Name <your@address.domain>
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/Supported.pod b/Master/tlpkg/tlperl.straw/lib/Encode/Supported.pod
new file mode 100755
index 00000000000..e84faafd9e2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/Supported.pod
@@ -0,0 +1,901 @@
+=head1 NAME
+
+Encode::Supported -- Encodings supported by Encode
+
+=head1 DESCRIPTION
+
+=head2 Encoding Names
+
+Encoding names are case insensitive. White space in names
+is ignored. In addition, an encoding may have aliases.
+Each encoding has one "canonical" name. The "canonical"
+name is chosen from the names of the encoding by picking
+the first in the following sequence (with a few exceptions).
+
+=over 2
+
+=item *
+
+The name used by the Perl community. That includes 'utf8' and 'ascii'.
+Unlike aliases, canonical names directly reach the method so such
+frequently used words like 'utf8' don't need to do alias lookups.
+
+=item *
+
+The MIME name as defined in IETF RFCs. This includes all "iso-"s.
+
+=item *
+
+The name in the IANA registry.
+
+=item *
+
+The name used by the organization that defined it.
+
+=back
+
+In case I<de jure> canonical names differ from that of the Encode
+module, they are always aliased if it ever be implemented. So you can
+safely tell if a given encoding is implemented or not just by passing
+the canonical name.
+
+Because of all the alias issues, and because in the general case
+encodings have state, "Encode" uses an encoding object internally
+once an operation is in progress.
+
+=head1 Supported Encodings
+
+As of Perl 5.8.0, at least the following encodings are recognized.
+Note that unless otherwise specified, they are all case insensitive
+(via alias) and all occurrence of spaces are replaced with '-'.
+In other words, "ISO 8859 1" and "iso-8859-1" are identical.
+
+Encodings are categorized and implemented in several different modules
+but you don't have to C<use Encode::XX> to make them available for
+most cases. Encode.pm will automatically load those modules on demand.
+
+=head2 Built-in Encodings
+
+The following encodings are always available.
+
+ Canonical Aliases Comments & References
+ ----------------------------------------------------------------
+ ascii US-ascii ISO-646-US [ECMA]
+ ascii-ctrl Special Encoding
+ iso-8859-1 latin1 [ISO]
+ null Special Encoding
+ utf8 UTF-8 [RFC2279]
+ ----------------------------------------------------------------
+
+I<null> and I<ascii-ctrl> are special. "null" fails for all character
+so when you set fallback mode to PERLQQ, HTMLCREF or XMLCREF, ALL
+CHARACTERS will fall back to character references. Ditto for
+"ascii-ctrl" except for control characters. For fallback modes, see
+L<Encode>.
+
+=head2 Encode::Unicode -- other Unicode encodings
+
+Unicode coding schemes other than native utf8 are supported by
+Encode::Unicode, which will be autoloaded on demand.
+
+ ----------------------------------------------------------------
+ UCS-2BE UCS-2, iso-10646-1 [IANA, UC]
+ UCS-2LE [UC]
+ UTF-16 [UC]
+ UTF-16BE [UC]
+ UTF-16LE [UC]
+ UTF-32 [UC]
+ UTF-32BE UCS-4 [UC]
+ UTF-32LE [UC]
+ UTF-7 [RFC2152]
+ ----------------------------------------------------------------
+
+To find how (UCS-2|UTF-(16|32))(LE|BE)? differ from one another,
+see L<Encode::Unicode>.
+
+UTF-7 is a special encoding which "re-encodes" UTF-16BE into a 7-bit
+encoding. It is implemented seperately by Encode::Unicode::UTF7.
+
+=head2 Encode::Byte -- Extended ASCII
+
+Encode::Byte implements most single-byte encodings except for
+Symbols and EBCDIC. The following encodings are based on single-byte
+encodings implemented as extended ASCII. Most of them map
+\x80-\xff (upper half) to non-ASCII characters.
+
+=over 2
+
+=item ISO-8859 and corresponding vendor mappings
+
+Since there are so many, they are presented in table format with
+languages and corresponding encoding names by vendors. Note that
+the table is sorted in order of ISO-8859 and the corresponding vendor
+mappings are slightly different from that of ISO. See
+L<http://czyborra.com/charsets/iso8859.html> for details.
+
+ Lang/Regions ISO/Other Std. DOS Windows Macintosh Others
+ ----------------------------------------------------------------
+ N. America (ASCII) cp437 AdobeStandardEncoding
+ cp863 (DOSCanadaF)
+ W. Europe iso-8859-1 cp850 cp1252 MacRoman nextstep
+ hp-roman8
+ cp860 (DOSPortuguese)
+ Cntrl. Europe iso-8859-2 cp852 cp1250 MacCentralEurRoman
+ MacCroatian
+ MacRomanian
+ MacRumanian
+ Latin3[1] iso-8859-3
+ Latin4[2] iso-8859-4
+ Cyrillics iso-8859-5 cp855 cp1251 MacCyrillic
+ (See also next section) cp866 MacUkrainian
+ Arabic iso-8859-6 cp864 cp1256 MacArabic
+ cp1006 MacFarsi
+ Greek iso-8859-7 cp737 cp1253 MacGreek
+ cp869 (DOSGreek2)
+ Hebrew iso-8859-8 cp862 cp1255 MacHebrew
+ Turkish iso-8859-9 cp857 cp1254 MacTurkish
+ Nordics iso-8859-10 cp865
+ cp861 MacIcelandic
+ MacSami
+ Thai iso-8859-11[3] cp874 MacThai
+ (iso-8859-12 is nonexistent. Reserved for Indics?)
+ Baltics iso-8859-13 cp775 cp1257
+ Celtics iso-8859-14
+ Latin9 [4] iso-8859-15
+ Latin10 iso-8859-16
+ Vietnamese viscii cp1258 MacVietnamese
+ ----------------------------------------------------------------
+
+ [1] Esperanto, Maltese, and Turkish. Turkish is now on 8859-9.
+ [2] Baltics. Now on 8859-10, except for Latvian.
+ [3] TIS 620 + Non-Breaking Space (0xA0 / U+00A0)
+ [4] Nicknamed Latin0; the Euro sign as well as French and Finnish
+ letters that are missing from 8859-1 were added.
+
+All cp* are also available as ibm-*, ms-*, and windows-* . See also
+L<http://czyborra.com/charsets/codepages.html>.
+
+Macintosh encodings don't seem to be registered in such entities as
+IANA. "Canonical" names in Encode are based upon Apple's Tech Note
+1150. See L<http://developer.apple.com/technotes/tn/tn1150.html>
+for details.
+
+=item KOI8 - De Facto Standard for the Cyrillic world
+
+Though ISO-8859 does have ISO-8859-5, the KOI8 series is far more
+popular in the Net. L<Encode> comes with the following KOI charsets.
+For gory details, see L<http://czyborra.com/charsets/cyrillic.html>
+
+ ----------------------------------------------------------------
+ koi8-f
+ koi8-r cp878 [RFC1489]
+ koi8-u [RFC2319]
+ ----------------------------------------------------------------
+
+=back
+
+=head2 gsm0338 - Hentai Latin 1
+
+GSM0338 is for GSM handsets. Though it shares alphanumerals with
+ASCII, control character ranges and other parts are mapped very
+differently, mainly to store Greek characters. There are also escape
+sequences (starting with 0x1B) to cover e.g. the Euro sign.
+
+This was once handled by L<Encode::Bytes> but because of all those
+unusual specifications, Encode 2.20 has relocated the support to
+L<Encode::GSM0338>. See L<Encode::GSM0338> for details.
+
+=over 2
+
+=item gsm0338 support before 2.19
+
+Some special cases like a trailing 0x00 byte or a lone 0x1B byte are not
+well-defined and decode() will return an empty string for them.
+One possible workaround is
+
+ $gsm =~ s/\x00\z/\x00\x00/;
+ $uni = decode("gsm0338", $gsm);
+ $uni .= "\xA0" if $gsm =~ /\x1B\z/;
+
+Note that the Encode implementation of GSM0338 does not implement the
+reuse of Latin capital letters as Greek capital letters (for example,
+the 0x5A is U+005A (LATIN CAPITAL LETTER Z), not U+0396 (GREEK CAPITAL
+LETTER ZETA).
+
+The GSM0338 is also covered in Encode::Byte even though it is not
+an "extended ASCII" encoding.
+
+=back
+
+=head2 CJK: Chinese, Japanese, Korean (Multibyte)
+
+Note that Vietnamese is listed above. Also read "Encoding vs Charset"
+below. Also note that these are implemented in distinct modules by
+countries, due to the size concerns (simplified Chinese is mapped
+to 'CN', continental China, while traditional Chinese is mapped to
+'TW', Taiwan). Please refer to their respective documentation pages.
+
+=over 2
+
+=item Encode::CN -- Continental China
+
+ Standard DOS/Win Macintosh Comment/Reference
+ ----------------------------------------------------------------
+ euc-cn [1] MacChineseSimp
+ (gbk) cp936 [2]
+ gb12345-raw { GB12345 without CES }
+ gb2312-raw { GB2312 without CES }
+ hz
+ iso-ir-165
+ ----------------------------------------------------------------
+
+ [1] GB2312 is aliased to this. See L<Microsoft-related naming mess>
+ [2] gbk is aliased to this. See L<Microsoft-related naming mess>
+
+=item Encode::JP -- Japan
+
+ Standard DOS/Win Macintosh Comment/Reference
+ ----------------------------------------------------------------
+ euc-jp
+ shiftjis cp932 macJapanese
+ 7bit-jis
+ iso-2022-jp [RFC1468]
+ iso-2022-jp-1 [RFC2237]
+ jis0201-raw { JIS X 0201 (roman + halfwidth kana) without CES }
+ jis0208-raw { JIS X 0208 (Kanji + fullwidth kana) without CES }
+ jis0212-raw { JIS X 0212 (Extended Kanji) without CES }
+ ----------------------------------------------------------------
+
+=item Encode::KR -- Korea
+
+ Standard DOS/Win Macintosh Comment/Reference
+ ----------------------------------------------------------------
+ euc-kr MacKorean [RFC1557]
+ cp949 [1]
+ iso-2022-kr [RFC1557]
+ johab [KS X 1001:1998, Annex 3]
+ ksc5601-raw { KSC5601 without CES }
+ ----------------------------------------------------------------
+
+ [1] ks_c_5601-1987, (x-)?windows-949, and uhc are aliased to this.
+ See below.
+
+=item Encode::TW -- Taiwan
+
+ Standard DOS/Win Macintosh Comment/Reference
+ ----------------------------------------------------------------
+ big5-eten cp950 MacChineseTrad {big5 aliased to big5-eten}
+ big5-hkscs
+ ----------------------------------------------------------------
+
+=item Encode::HanExtra -- More Chinese via CPAN
+
+Due to the size concerns, additional Chinese encodings below are
+distributed separately on CPAN, under the name Encode::HanExtra.
+
+ Standard DOS/Win Macintosh Comment/Reference
+ ----------------------------------------------------------------
+ big5ext CMEX's Big5e Extension
+ big5plus CMEX's Big5+ Extension
+ cccii Chinese Character Code for Information Interchange
+ euc-tw EUC (Extended Unix Character)
+ gb18030 GBK with Traditional Characters
+ ----------------------------------------------------------------
+
+=item Encode::JIS2K -- JIS X 0213 encodings via CPAN
+
+Due to size concerns, additional Japanese encodings below are
+distributed separately on CPAN, under the name Encode::JIS2K.
+
+ Standard DOS/Win Macintosh Comment/Reference
+ ----------------------------------------------------------------
+ euc-jisx0213
+ shiftjisx0123
+ iso-2022-jp-3
+ jis0213-1-raw
+ jis0213-2-raw
+ ----------------------------------------------------------------
+
+=back
+
+=head2 Miscellaneous encodings
+
+=over 2
+
+=item Encode::EBCDIC
+
+See L<perlebcdic> for details.
+
+ ----------------------------------------------------------------
+ cp37
+ cp500
+ cp875
+ cp1026
+ cp1047
+ posix-bc
+ ----------------------------------------------------------------
+
+=item Encode::Symbols
+
+For symbols and dingbats.
+
+ ----------------------------------------------------------------
+ symbol
+ dingbats
+ MacDingbats
+ AdobeZdingbat
+ AdobeSymbol
+ ----------------------------------------------------------------
+
+=item Encode::MIME::Header
+
+Strictly speaking, MIME header encoding documented in RFC 2047 is more
+of encapsulation than encoding. However, their support in modern
+world is imperative so they are supported.
+
+ ----------------------------------------------------------------
+ MIME-Header [RFC2047]
+ MIME-B [RFC2047]
+ MIME-Q [RFC2047]
+ ----------------------------------------------------------------
+
+=item Encode::Guess
+
+This one is not a name of encoding but a utility that lets you pick up
+the most appropriate encoding for a data out of given I<suspects>. See
+L<Encode::Guess> for details.
+
+=back
+
+=head1 Unsupported encodings
+
+The following encodings are not supported as yet; some because they
+are rarely used, some because of technical difficulties. They may
+be supported by external modules via CPAN in the future, however.
+
+=over 2
+
+=item ISO-2022-JP-2 [RFC1554]
+
+Not very popular yet. Needs Unicode Database or equivalent to
+implement encode() (because it includes JIS X 0208/0212, KSC5601, and
+GB2312 simultaneously, whose code points in Unicode overlap. So you
+need to lookup the database to determine to what character set a given
+Unicode character should belong).
+
+=item ISO-2022-CN [RFC1922]
+
+Not very popular. Needs CNS 11643-1 and -2 which are not available in
+this module. CNS 11643 is supported (via euc-tw) in Encode::HanExtra.
+Autrijus Tang may add support for this encoding in his module in future.
+
+=item Various HP-UX encodings
+
+The following are unsupported due to the lack of mapping data.
+
+ '8' - arabic8, greek8, hebrew8, kana8, thai8, and turkish8
+ '15' - japanese15, korean15, and roi15
+
+=item Cyrillic encoding ISO-IR-111
+
+Anton Tagunov doubts its usefulness.
+
+=item ISO-8859-8-1 [Hebrew]
+
+None of the Encode team knows Hebrew enough (ISO-8859-8, cp1255 and
+MacHebrew are supported because and just because there were mappings
+available at L<http://www.unicode.org/>). Contributions welcome.
+
+=item ISIRI 3342, Iran System, ISIRI 2900 [Farsi]
+
+Ditto.
+
+=item Thai encoding TCVN
+
+Ditto.
+
+=item Vietnamese encodings VPS
+
+Though Jungshik Shin has reported that Mozilla supports this encoding,
+it was too late before 5.8.0 for us to add it. In the future, it
+may be available via a separate module. See
+L<http://lxr.mozilla.org/seamonkey/source/intl/uconv/ucvlatin/vps.uf>
+and
+L<http://lxr.mozilla.org/seamonkey/source/intl/uconv/ucvlatin/vps.ut>
+if you are interested in helping us.
+
+=item Various Mac encodings
+
+The following are unsupported due to the lack of mapping data.
+
+ MacArmenian, MacBengali, MacBurmese, MacEthiopic
+ MacExtArabic, MacGeorgian, MacKannada, MacKhmer
+ MacLaotian, MacMalayalam, MacMongolian, MacOriya
+ MacSinhalese, MacTamil, MacTelugu, MacTibetan
+ MacVietnamese
+
+The rest which are already available are based upon the vendor mappings
+at L<http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/> .
+
+=item (Mac) Indic encodings
+
+The maps for the following are available at L<http://www.unicode.org/>
+but remain unsupport because those encodings need algorithmical
+approach, currently unsupported by F<enc2xs>:
+
+ MacDevanagari
+ MacGurmukhi
+ MacGujarati
+
+For details, please see C<Unicode mapping issues and notes:> at
+L<http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/DEVANAGA.TXT> .
+
+I believe this issue is prevalent not only for Mac Indics but also in
+other Indic encodings, but the above were the only Indic encodings
+maps that I could find at L<http://www.unicode.org/> .
+
+=back
+
+=head1 Encoding vs. Charset -- terminology
+
+We are used to using the term (character) I<encoding> and I<character
+set> interchangeably. But just as confusing the terms byte and
+character is dangerous and the terms should be differentiated when
+needed, we need to differentiate I<encoding> and I<character set>.
+
+To understand that, here is a description of how we make computers
+grok our characters.
+
+=over 2
+
+=item *
+
+First we start with which characters to include. We call this
+collection of characters I<character repertoire>.
+
+=item *
+
+Then we have to give each character a unique ID so your computer can
+tell the difference between 'a' and 'A'. This itemized character
+repertoire is now a I<character set>.
+
+=item *
+
+If your computer can grow the character set without further
+processing, you can go ahead and use it. This is called a I<coded
+character set> (CCS) or I<raw character encoding>. ASCII is used this
+way for most cases.
+
+=item *
+
+But in many cases, especially multi-byte CJK encodings, you have to
+tweak a little more. Your network connection may not accept any data
+with the Most Significant Bit set, and your computer may not be able to
+tell if a given byte is a whole character or just half of it. So you
+have to I<encode> the character set to use it.
+
+A I<character encoding scheme> (CES) determines how to encode a given
+character set, or a set of multiple character sets. 7bit ISO-2022 is
+an example of a CES. You switch between character sets via I<escape
+sequences>.
+
+=back
+
+Technically, or mathematically, speaking, a character set encoded in
+such a CES that maps character by character may form a CCS. EUC is such
+an example. The CES of EUC is as follows:
+
+=over 2
+
+=item *
+
+Map ASCII unchanged.
+
+=item *
+
+Map such a character set that consists of 94 or 96 powered by N
+members by adding 0x80 to each byte.
+
+=item *
+
+You can also use 0x8e and 0x8f to indicate that the following sequence of
+characters belongs to yet another character set. To each following byte
+is added the value 0x80.
+
+=back
+
+By carefully looking at the encoded byte sequence, you can find that the
+byte sequence conforms a unique number. In that sense, EUC is a CCS
+generated by a CES above from up to four CCS (complicated?). UTF-8
+falls into this category. See L<perlUnicode/"UTF-8"> to find out how
+UTF-8 maps Unicode to a byte sequence.
+
+You may also have found out by now why 7bit ISO-2022 cannot comprise
+a CCS. If you look at a byte sequence \x21\x21, you can't tell if
+it is two !'s or IDEOGRAPHIC SPACE. EUC maps the latter to \xA1\xA1
+so you have no trouble differentiating between "!!". and S<" ">.
+
+=head1 Encoding Classification (by Anton Tagunov and Dan Kogai)
+
+This section tries to classify the supported encodings by their
+applicability for information exchange over the Internet and to
+choose the most suitable aliases to name them in the context of
+such communication.
+
+=over 2
+
+=item *
+
+To (en|de)code encodings marked by C<(**)>, you need
+C<Encode::HanExtra>, available from CPAN.
+
+=back
+
+Encoding names
+
+ US-ASCII UTF-8 ISO-8859-* KOI8-R
+ Shift_JIS EUC-JP ISO-2022-JP ISO-2022-JP-1
+ EUC-KR Big5 GB2312
+
+are registered with IANA as preferred MIME names and may
+be used over the Internet.
+
+C<Shift_JIS> has been officialized by JIS X 0208:1997.
+L<Microsoft-related naming mess> gives details.
+
+C<GB2312> is the IANA name for C<EUC-CN>.
+See L<Microsoft-related naming mess> for details.
+
+C<GB_2312-80> I<raw> encoding is available as C<gb2312-raw>
+with Encode. See L<Encode::CN> for details.
+
+ EUC-CN
+ KOI8-U [RFC2319]
+
+have not been registered with IANA (as of March 2002) but
+seem to be supported by major web browsers.
+The IANA name for C<EUC-CN> is C<GB2312>.
+
+ KS_C_5601-1987
+
+is heavily misused.
+See L<Microsoft-related naming mess> for details.
+
+C<KS_C_5601-1987> I<raw> encoding is available as C<kcs5601-raw>
+with Encode. See L<Encode::KR> for details.
+
+ UTF-16 UTF-16BE UTF-16LE
+
+are IANA-registered C<charset>s. See [RFC 2781] for details.
+Jungshik Shin reports that UTF-16 with a BOM is well accepted
+by MS IE 5/6 and NS 4/6. Beware however that
+
+=over 2
+
+=item *
+
+C<UTF-16> support in any software you're going to be
+using/interoperating with has probably been less tested
+then C<UTF-8> support
+
+=item *
+
+C<UTF-8> coded data seamlessly passes traditional
+command piping (C<cat>, C<more>, etc.) while C<UTF-16> coded
+data is likely to cause confusion (with its zero bytes,
+for example)
+
+=item *
+
+it is beyond the power of words to describe the way HTML browsers
+encode non-C<ASCII> form data. To get a general impression, visit
+L<http://www.alanflavell.org.uk/charset/form-i18n.html>.
+While encoding of form data has stabilized for C<UTF-8> encoded pages
+(at least IE 5/6, NS 6, and Opera 6 behave consistently), be sure to
+expect fun (and cross-browser discrepancies) with C<UTF-16> encoded
+pages!
+
+=back
+
+The rule of thumb is to use C<UTF-8> unless you know what
+you're doing and unless you really benefit from using C<UTF-16>.
+
+ ISO-IR-165 [RFC1345]
+ VISCII
+ GB 12345
+ GB 18030 (**) (see links bellow)
+ EUC-TW (**)
+
+are totally valid encodings but not registered at IANA.
+The names under which they are listed here are probably the
+most widely-known names for these encodings and are recommended
+names.
+
+ BIG5PLUS (**)
+
+is a proprietary name.
+
+=head2 Microsoft-related naming mess
+
+Microsoft products misuse the following names:
+
+=over 2
+
+=item KS_C_5601-1987
+
+Microsoft extension to C<EUC-KR>.
+
+Proper names: C<CP949>, C<UHC>, C<x-windows-949> (as used by Mozilla).
+
+See L<http://lists.w3.org/Archives/Public/ietf-charsets/2001AprJun/0033.html>
+for details.
+
+Encode aliases C<KS_C_5601-1987> to C<cp949> to reflect this common
+misusage. I<Raw> C<KS_C_5601-1987> encoding is available as
+C<kcs5601-raw>.
+
+See L<Encode::KR> for details.
+
+=item GB2312
+
+Microsoft extension to C<EUC-CN>.
+
+Proper names: C<CP936>, C<GBK>.
+
+C<GB2312> has been registered in the C<EUC-CN> meaning at
+IANA. This has partially repaired the situation: Microsoft's
+C<GB2312> has become a superset of the official C<GB2312>.
+
+Encode aliases C<GB2312> to C<euc-cn> in full agreement with
+IANA registration. C<cp936> is supported separately.
+I<Raw> C<GB_2312-80> encoding is available as C<gb2312-raw>.
+
+See L<Encode::CN> for details.
+
+=item Big5
+
+Microsoft extension to C<Big5>.
+
+Proper name: C<CP950>.
+
+Encode separately supports C<Big5> and C<cp950>.
+
+=item Shift_JIS
+
+Microsoft's understanding of C<Shift_JIS>.
+
+JIS has not endorsed the full Microsoft standard however.
+The official C<Shift_JIS> includes only JIS X 0201 and JIS X 0208
+character sets, while Microsoft has always used C<Shift_JIS>
+to encode a wider character repertoire. See C<IANA> registration for
+C<Windows-31J>.
+
+As a historical predecessor, Microsoft's variant
+probably has more rights for the name, though it may be objected
+that Microsoft shouldn't have used JIS as part of the name
+in the first place.
+
+Unambiguous name: C<CP932>. C<IANA> name (also used by Mozilla, and
+provided as an alias by Encode): C<Windows-31J>.
+
+Encode separately supports C<Shift_JIS> and C<cp932>.
+
+=back
+
+=head1 Glossary
+
+=over 2
+
+=item character repertoire
+
+A collection of unique characters. A I<character> set in the strictest
+sense. At this stage, characters are not numbered.
+
+=item coded character set (CCS)
+
+A character set that is mapped in a way computers can use directly.
+Many character encodings, including EUC, fall in this category.
+
+=item character encoding scheme (CES)
+
+An algorithm to map a character set to a byte sequence. You don't
+have to be able to tell which character set a given byte sequence
+belongs. 7-bit ISO-2022 is a CES but it cannot be a CCS. EUC is an
+example of being both a CCS and CES.
+
+=item charset (in MIME context)
+
+has long been used in the meaning of C<encoding>, CES.
+
+While the word combination C<character set> has lost this meaning
+in MIME context since [RFC 2130], the C<charset> abbreviation has
+retained it. This is how [RFC 2277] and [RFC 2278] bless C<charset>:
+
+ This document uses the term "charset" to mean a set of rules for
+ mapping from a sequence of octets to a sequence of characters, such
+ as the combination of a coded character set and a character encoding
+ scheme; this is also what is used as an identifier in MIME "charset="
+ parameters, and registered in the IANA charset registry ... (Note
+ that this is NOT a term used by other standards bodies, such as ISO).
+ [RFC 2277]
+
+=item EUC
+
+Extended Unix Character. See ISO-2022.
+
+=item ISO-2022
+
+A CES that was carefully designed to coexist with ASCII. There are a 7
+bit version and an 8 bit version.
+
+The 7 bit version switches character set via escape sequence so it
+cannot form a CCS. Since this is more difficult to handle in programs
+than the 8 bit version, the 7 bit version is not very popular except for
+iso-2022-jp, the I<de facto> standard CES for e-mails.
+
+The 8 bit version can form a CCS. EUC and ISO-8859 are two examples
+thereof. Pre-5.6 perl could use them as string literals.
+
+=item UCS
+
+Short for I<Universal Character Set>. When you say just UCS, it means
+I<Unicode>.
+
+=item UCS-2
+
+ISO/IEC 10646 encoding form: Universal Character Set coded in two
+octets.
+
+=item Unicode
+
+A character set that aims to include all character repertoires of the
+world. Many character sets in various national as well as industrial
+standards have become, in a way, just subsets of Unicode.
+
+=item UTF
+
+Short for I<Unicode Transformation Format>. Determines how to map a
+Unicode character into a byte sequence.
+
+=item UTF-16
+
+A UTF in 16-bit encoding. Can either be in big endian or little
+endian. The big endian version is called UTF-16BE (equal to UCS-2 +
+surrogate support) and the little endian version is called UTF-16LE.
+
+=back
+
+=head1 See Also
+
+L<Encode>,
+L<Encode::Byte>,
+L<Encode::CN>, L<Encode::JP>, L<Encode::KR>, L<Encode::TW>,
+L<Encode::EBCDIC>, L<Encode::Symbol>
+L<Encode::MIME::Header>, L<Encode::Guess>
+
+=head1 References
+
+=over 2
+
+=item ECMA
+
+European Computer Manufacturers Association
+L<http://www.ecma.ch>
+
+=over 2
+
+=item ECMA-035 (eq C<ISO-2022>)
+
+L<http://www.ecma.ch/ecma1/STAND/ECMA-035.HTM>
+
+The specification of ISO-2022 is available from the link above.
+
+=back
+
+=item IANA
+
+Internet Assigned Numbers Authority
+L<http://www.iana.org/>
+
+=over 2
+
+=item Assigned Charset Names by IANA
+
+L<http://www.iana.org/assignments/character-sets>
+
+Most of the C<canonical names> in Encode derive from this list
+so you can directly apply the string you have extracted from MIME
+header of mails and web pages.
+
+=back
+
+=item ISO
+
+International Organization for Standardization
+L<http://www.iso.ch/>
+
+=item RFC
+
+Request For Comments -- need I say more?
+L<http://www.rfc-editor.org/>, L<http://www.ietf.org/rfc.html>,
+L<http://www.faqs.org/rfcs/>
+
+=item UC
+
+Unicode Consortium
+L<http://www.unicode.org/>
+
+=over 2
+
+=item Unicode Glossary
+
+L<http://www.unicode.org/glossary/>
+
+The glossary of this document is based upon this site.
+
+=back
+
+=back
+
+=head2 Other Notable Sites
+
+=over 2
+
+=item czyborra.com
+
+L<http://czyborra.com/>
+
+Contains a lot of useful information, especially gory details of ISO
+vs. vendor mappings.
+
+=item CJK.inf
+
+L<http://examples.oreilly.com/cjkvinfo/doc/cjk.inf>
+
+Somewhat obsolete (last update in 1996), but still useful. Also try
+
+L<ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/pdf/GB18030_Summary.pdf>
+
+You will find brief info on C<EUC-CN>, C<GBK> and mostly on C<GB 18030>.
+
+=item Jungshik Shin's Hangul FAQ
+
+L<http://jshin.net/faq>
+
+And especially its subject 8.
+
+L<http://jshin.net/faq/qa8.html>
+
+A comprehensive overview of the Korean (C<KS *>) standards.
+
+=item debian.org: "Introduction to i18n"
+
+A brief description for most of the mentioned CJK encodings is
+contained in
+L<http://www.debian.org/doc/manuals/intro-i18n/ch-codes.en.html>
+
+=back
+
+=head2 Offline sources
+
+=over 2
+
+=item C<CJKV Information Processing> by Ken Lunde
+
+CJKV Information Processing
+1999 O'Reilly & Associates, ISBN : 1-56592-224-7
+
+The modern successor of C<CJK.inf>.
+
+Features a comprehensive coverage of CJKV character sets and
+encodings along with many other issues faced by anyone trying
+to better support CJKV languages/scripts in all the areas of
+information processing.
+
+To purchase this book, visit
+L<http://oreilly.com/catalog/9780596514471/>
+or your favourite bookstore.
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/Symbol.pm b/Master/tlpkg/tlperl.straw/lib/Encode/Symbol.pm
new file mode 100755
index 00000000000..77031aad75c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/Symbol.pm
@@ -0,0 +1,44 @@
+package Encode::Symbol;
+use strict;
+use warnings;
+use Encode;
+our $VERSION = do { my @r = ( q$Revision: 2.2 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+use XSLoader;
+XSLoader::load( __PACKAGE__, $VERSION );
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Symbol - Symbol Encodings
+
+=head1 SYNOPSIS
+
+ use Encode qw/encode decode/;
+ $symbol = encode("symbol", $utf8); # loads Encode::Symbol implicitly
+ $utf8 = decode("", $symbol); # ditto
+
+=head1 ABSTRACT
+
+This module implements symbol and dingbats encodings. Encodings
+supported are as follows.
+
+ Canonical Alias Description
+ --------------------------------------------------------------------
+ symbol
+ dingbats
+ AdobeZDingbat
+ AdobeSymbol
+ MacDingbats
+
+=head1 DESCRIPTION
+
+To find out how to use this module in detail, see L<Encode>.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/TW.pm b/Master/tlpkg/tlperl.straw/lib/Encode/TW.pm
new file mode 100755
index 00000000000..c30499bee1e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/TW.pm
@@ -0,0 +1,75 @@
+package Encode::TW;
+BEGIN {
+ if ( ord("A") == 193 ) {
+ die "Encode::TW not supported on EBCDIC\n";
+ }
+}
+use strict;
+use warnings;
+use Encode;
+our $VERSION = do { my @r = ( q$Revision: 2.3 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+use XSLoader;
+XSLoader::load( __PACKAGE__, $VERSION );
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::TW - Taiwan-based Chinese Encodings
+
+=head1 SYNOPSIS
+
+ use Encode qw/encode decode/;
+ $big5 = encode("big5", $utf8); # loads Encode::TW implicitly
+ $utf8 = decode("big5", $big5); # ditto
+
+=head1 DESCRIPTION
+
+This module implements tradition Chinese charset encodings as used
+in Taiwan and Hong Kong.
+Encodings supported are as follows.
+
+ Canonical Alias Description
+ --------------------------------------------------------------------
+ big5-eten /\bbig-?5$/i Big5 encoding (with ETen extensions)
+ /\bbig5-?et(en)?$/i
+ /\btca-?big5$/i
+ big5-hkscs /\bbig5-?hk(scs)?$/i
+ /\bhk(scs)?-?big5$/i
+ Big5 + Cantonese characters in Hong Kong
+ MacChineseTrad Big5 + Apple Vendor Mappings
+ cp950 Code Page 950
+ = Big5 + Microsoft vendor mappings
+ --------------------------------------------------------------------
+
+To find out how to use this module in detail, see L<Encode>.
+
+=head1 NOTES
+
+Due to size concerns, C<EUC-TW> (Extended Unix Character), C<CCCII>
+(Chinese Character Code for Information Interchange), C<BIG5PLUS>
+(CMEX's Big5+) and C<BIG5EXT> (CMEX's Big5e) are distributed separately
+on CPAN, under the name L<Encode::HanExtra>. That module also contains
+extra China-based encodings.
+
+=head1 BUGS
+
+Since the original C<big5> encoding (1984) is not supported anywhere
+(glibc and DOS-based systems uses C<big5> to mean C<big5-eten>; Microsoft
+uses C<big5> to mean C<cp950>), a conscious decision was made to alias
+C<big5> to C<big5-eten>, which is the de facto superset of the original
+big5.
+
+The C<CNS11643> encoding files are not complete. For common C<CNS11643>
+manipulation, please use C<EUC-TW> in L<Encode::HanExtra>, which contains
+planes 1-7.
+
+The ASCII region (0x00-0x7f) is preserved for all encodings, even
+though this conflicts with mappings by the Unicode Consortium.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/Unicode.pm b/Master/tlpkg/tlperl.straw/lib/Encode/Unicode.pm
new file mode 100755
index 00000000000..f71567c6196
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/Unicode.pm
@@ -0,0 +1,270 @@
+package Encode::Unicode;
+
+use strict;
+use warnings;
+no warnings 'redefine';
+
+our $VERSION = do { my @r = ( q$Revision: 2.7 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+
+use XSLoader;
+XSLoader::load( __PACKAGE__, $VERSION );
+
+#
+# Object Generator 8 transcoders all at once!
+#
+
+require Encode;
+
+our %BOM_Unknown = map { $_ => 1 } qw(UTF-16 UTF-32);
+
+for my $name (
+ qw(UTF-16 UTF-16BE UTF-16LE
+ UTF-32 UTF-32BE UTF-32LE
+ UCS-2BE UCS-2LE)
+ )
+{
+ my ( $size, $endian, $ucs2, $mask );
+ $name =~ /^(\w+)-(\d+)(\w*)$/o;
+ if ( $ucs2 = ( $1 eq 'UCS' ) ) {
+ $size = 2;
+ }
+ else {
+ $size = $2 / 8;
+ }
+ $endian = ( $3 eq 'BE' ) ? 'n' : ( $3 eq 'LE' ) ? 'v' : '';
+ $size == 4 and $endian = uc($endian);
+
+ $Encode::Encoding{$name} = bless {
+ Name => $name,
+ size => $size,
+ endian => $endian,
+ ucs2 => $ucs2,
+ } => __PACKAGE__;
+}
+
+use base qw(Encode::Encoding);
+
+sub renew {
+ my $self = shift;
+ $BOM_Unknown{ $self->name } or return $self;
+ my $clone = bless {%$self} => ref($self);
+ $clone->{renewed}++; # so the caller knows it is renewed.
+ return $clone;
+}
+
+# There used to be a perl implemntation of (en|de)code but with
+# XS version is ripe, perl version is zapped for optimal speed
+
+*decode = \&decode_xs;
+*encode = \&encode_xs;
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Unicode -- Various Unicode Transformation Formats
+
+=cut
+
+=head1 SYNOPSIS
+
+ use Encode qw/encode decode/;
+ $ucs2 = encode("UCS-2BE", $utf8);
+ $utf8 = decode("UCS-2BE", $ucs2);
+
+=head1 ABSTRACT
+
+This module implements all Character Encoding Schemes of Unicode that
+are officially documented by Unicode Consortium (except, of course,
+for UTF-8, which is a native format in perl).
+
+=over 4
+
+=item L<http://www.unicode.org/glossary/> says:
+
+I<Character Encoding Scheme> A character encoding form plus byte
+serialization. There are Seven character encoding schemes in Unicode:
+UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32 (UCS-4), UTF-32BE (UCS-4BE) and
+UTF-32LE (UCS-4LE), and UTF-7.
+
+Since UTF-7 is a 7-bit (re)encoded version of UTF-16BE, It is not part of
+Unicode's Character Encoding Scheme. It is separately implemented in
+Encode::Unicode::UTF7. For details see L<Encode::Unicode::UTF7>.
+
+=item Quick Reference
+
+ Decodes from ord(N) Encodes chr(N) to...
+ octet/char BOM S.P d800-dfff ord > 0xffff \x{1abcd} ==
+ ---------------+-----------------+------------------------------
+ UCS-2BE 2 N N is bogus Not Available
+ UCS-2LE 2 N N bogus Not Available
+ UTF-16 2/4 Y Y is S.P S.P BE/LE
+ UTF-16BE 2/4 N Y S.P S.P 0xd82a,0xdfcd
+ UTF-16LE 2/4 N Y S.P S.P 0x2ad8,0xcddf
+ UTF-32 4 Y - is bogus As is BE/LE
+ UTF-32BE 4 N - bogus As is 0x0001abcd
+ UTF-32LE 4 N - bogus As is 0xcdab0100
+ UTF-8 1-4 - - bogus >= 4 octets \xf0\x9a\af\8d
+ ---------------+-----------------+------------------------------
+
+=back
+
+=head1 Size, Endianness, and BOM
+
+You can categorize these CES by 3 criteria: size of each character,
+endianness, and Byte Order Mark.
+
+=head2 by size
+
+UCS-2 is a fixed-length encoding with each character taking 16 bits.
+It B<does not> support I<surrogate pairs>. When a surrogate pair
+is encountered during decode(), its place is filled with \x{FFFD}
+if I<CHECK> is 0, or the routine croaks if I<CHECK> is 1. When a
+character whose ord value is larger than 0xFFFF is encountered,
+its place is filled with \x{FFFD} if I<CHECK> is 0, or the routine
+croaks if I<CHECK> is 1.
+
+UTF-16 is almost the same as UCS-2 but it supports I<surrogate pairs>.
+When it encounters a high surrogate (0xD800-0xDBFF), it fetches the
+following low surrogate (0xDC00-0xDFFF) and C<desurrogate>s them to
+form a character. Bogus surrogates result in death. When \x{10000}
+or above is encountered during encode(), it C<ensurrogate>s them and
+pushes the surrogate pair to the output stream.
+
+UTF-32 (UCS-4) is a fixed-length encoding with each character taking 32 bits.
+Since it is 32-bit, there is no need for I<surrogate pairs>.
+
+=head2 by endianness
+
+The first (and now failed) goal of Unicode was to map all character
+repertoires into a fixed-length integer so that programmers are happy.
+Since each character is either a I<short> or I<long> in C, you have to
+pay attention to the endianness of each platform when you pass data
+to one another.
+
+Anything marked as BE is Big Endian (or network byte order) and LE is
+Little Endian (aka VAX byte order). For anything not marked either
+BE or LE, a character called Byte Order Mark (BOM) indicating the
+endianness is prepended to the string.
+
+CAVEAT: Though BOM in utf8 (\xEF\xBB\xBF) is valid, it is meaningless
+and as of this writing Encode suite just leave it as is (\x{FeFF}).
+
+=over 4
+
+=item BOM as integer when fetched in network byte order
+
+ 16 32 bits/char
+ -------------------------
+ BE 0xFeFF 0x0000FeFF
+ LE 0xFFFe 0xFFFe0000
+ -------------------------
+
+=back
+
+This modules handles the BOM as follows.
+
+=over 4
+
+=item *
+
+When BE or LE is explicitly stated as the name of encoding, BOM is
+simply treated as a normal character (ZERO WIDTH NO-BREAK SPACE).
+
+=item *
+
+When BE or LE is omitted during decode(), it checks if BOM is at the
+beginning of the string; if one is found, the endianness is set to
+what the BOM says. If no BOM is found, the routine dies.
+
+=item *
+
+When BE or LE is omitted during encode(), it returns a BE-encoded
+string with BOM prepended. So when you want to encode a whole text
+file, make sure you encode() the whole text at once, not line by line
+or each line, not file, will have a BOM prepended.
+
+=item *
+
+C<UCS-2> is an exception. Unlike others, this is an alias of UCS-2BE.
+UCS-2 is already registered by IANA and others that way.
+
+=back
+
+=head1 Surrogate Pairs
+
+To say the least, surrogate pairs were the biggest mistake of the
+Unicode Consortium. But according to the late Douglas Adams in I<The
+Hitchhiker's Guide to the Galaxy> Trilogy, C<In the beginning the
+Universe was created. This has made a lot of people very angry and
+been widely regarded as a bad move>. Their mistake was not of this
+magnitude so let's forgive them.
+
+(I don't dare make any comparison with Unicode Consortium and the
+Vogons here ;) Or, comparing Encode to Babel Fish is completely
+appropriate -- if you can only stick this into your ear :)
+
+Surrogate pairs were born when the Unicode Consortium finally
+admitted that 16 bits were not big enough to hold all the world's
+character repertoires. But they already made UCS-2 16-bit. What
+do we do?
+
+Back then, the range 0xD800-0xDFFF was not allocated. Let's split
+that range in half and use the first half to represent the C<upper
+half of a character> and the second half to represent the C<lower
+half of a character>. That way, you can represent 1024 * 1024 =
+1048576 more characters. Now we can store character ranges up to
+\x{10ffff} even with 16-bit encodings. This pair of half-character is
+now called a I<surrogate pair> and UTF-16 is the name of the encoding
+that embraces them.
+
+Here is a formula to ensurrogate a Unicode character \x{10000} and
+above;
+
+ $hi = ($uni - 0x10000) / 0x400 + 0xD800;
+ $lo = ($uni - 0x10000) % 0x400 + 0xDC00;
+
+And to desurrogate;
+
+ $uni = 0x10000 + ($hi - 0xD800) * 0x400 + ($lo - 0xDC00);
+
+Note this move has made \x{D800}-\x{DFFF} into a forbidden zone but
+perl does not prohibit the use of characters within this range. To perl,
+every one of \x{0000_0000} up to \x{ffff_ffff} (*) is I<a character>.
+
+ (*) or \x{ffff_ffff_ffff_ffff} if your perl is compiled with 64-bit
+ integer support!
+
+=head1 Error Checking
+
+Unlike most encodings which accept various ways to handle errors,
+Unicode encodings simply croaks.
+
+ % perl -MEncode -e'$_ = "\xfe\xff\xd8\xd9\xda\xdb\0\n"' \
+ -e'Encode::from_to($_, "utf16","shift_jis", 0); print'
+ UTF-16:Malformed LO surrogate d8d9 at /path/to/Encode.pm line 184.
+ % perl -MEncode -e'$a = "BOM missing"' \
+ -e' Encode::from_to($a, "utf16", "shift_jis", 0); print'
+ UTF-16:Unrecognised BOM 424f at /path/to/Encode.pm line 184.
+
+Unlike other encodings where mappings are not one-to-one against
+Unicode, UTFs are supposed to map 100% against one another. So Encode
+is more strict on UTFs.
+
+Consider that "division by zero" of Encode :)
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::Unicode::UTF7>, L<http://www.unicode.org/glossary/>,
+L<http://www.unicode.org/unicode/faq/utf_bom.html>,
+
+RFC 2781 L<http://www.ietf.org/rfc/rfc2781.txt>,
+
+The whole Unicode standard L<http://www.unicode.org/unicode/uni2book/u2.html>
+
+Ch. 15, pp. 403 of C<Programming Perl (3rd Edition)>
+by Larry Wall, Tom Christiansen, Jon Orwant;
+O'Reilly & Associates; ISBN 0-596-00027-8
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/Unicode/UTF7.pm b/Master/tlpkg/tlperl.straw/lib/Encode/Unicode/UTF7.pm
new file mode 100755
index 00000000000..6ee46195854
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/Unicode/UTF7.pm
@@ -0,0 +1,128 @@
+#
+# $Id: UTF7.pm,v 2.4 2006/06/03 20:28:48 dankogai Exp $
+#
+package Encode::Unicode::UTF7;
+use strict;
+use warnings;
+no warnings 'redefine';
+use base qw(Encode::Encoding);
+__PACKAGE__->Define('UTF-7');
+our $VERSION = do { my @r = ( q$Revision: 2.4 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+use MIME::Base64;
+use Encode;
+
+#
+# Algorithms taken from Unicode::String by Gisle Aas
+#
+
+our $OPTIONAL_DIRECT_CHARS = 1;
+my $specials = quotemeta "\'(),-./:?";
+$OPTIONAL_DIRECT_CHARS
+ and $specials .= quotemeta "!\"#$%&*;<=>@[]^_`{|}";
+
+# \s will not work because it matches U+3000 DEOGRAPHIC SPACE
+# We use qr/[\n\r\t\ ] instead
+my $re_asis = qr/(?:[\n\r\t\ A-Za-z0-9$specials])/;
+my $re_encoded = qr/(?:[^\n\r\t\ A-Za-z0-9$specials])/;
+my $e_utf16 = find_encoding("UTF-16BE");
+
+sub needs_lines { 1 }
+
+sub encode($$;$) {
+ my ( $obj, $str, $chk ) = @_;
+ my $len = length($str);
+ pos($str) = 0;
+ my $bytes = '';
+ while ( pos($str) < $len ) {
+ if ( $str =~ /\G($re_asis+)/ogc ) {
+ $bytes .= $1;
+ }
+ elsif ( $str =~ /\G($re_encoded+)/ogsc ) {
+ if ( $1 eq "+" ) {
+ $bytes .= "+-";
+ }
+ else {
+ my $s = $1;
+ my $base64 = encode_base64( $e_utf16->encode($s), '' );
+ $base64 =~ s/=+$//;
+ $bytes .= "+$base64-";
+ }
+ }
+ else {
+ die "This should not happen! (pos=" . pos($str) . ")";
+ }
+ }
+ $_[1] = '' if $chk;
+ return $bytes;
+}
+
+sub decode($$;$) {
+ my ( $obj, $bytes, $chk ) = @_;
+ my $len = length($bytes);
+ my $str = "";
+ no warnings 'uninitialized';
+ while ( pos($bytes) < $len ) {
+ if ( $bytes =~ /\G([^+]+)/ogc ) {
+ $str .= $1;
+ }
+ elsif ( $bytes =~ /\G\+-/ogc ) {
+ $str .= "+";
+ }
+ elsif ( $bytes =~ /\G\+([A-Za-z0-9+\/]+)-?/ogsc ) {
+ my $base64 = $1;
+ my $pad = length($base64) % 4;
+ $base64 .= "=" x ( 4 - $pad ) if $pad;
+ $str .= $e_utf16->decode( decode_base64($base64) );
+ }
+ elsif ( $bytes =~ /\G\+/ogc ) {
+ $^W and warn "Bad UTF7 data escape";
+ $str .= "+";
+ }
+ else {
+ die "This should not happen " . pos($bytes);
+ }
+ }
+ $_[1] = '' if $chk;
+ return $str;
+}
+1;
+__END__
+
+=head1 NAME
+
+Encode::Unicode::UTF7 -- UTF-7 encoding
+
+=head1 SYNOPSIS
+
+ use Encode qw/encode decode/;
+ $utf7 = encode("UTF-7", $utf8);
+ $utf8 = decode("UTF-7", $ucs2);
+
+=head1 ABSTRACT
+
+This module implements UTF-7 encoding documented in RFC 2152. UTF-7,
+as its name suggests, is a 7-bit re-encoded version of UTF-16BE. It
+is designed to be MTA-safe and expected to be a standard way to
+exchange Unicoded mails via mails. But with the advent of UTF-8 and
+8-bit compliant MTAs, UTF-7 is hardly ever used.
+
+UTF-7 was not supported by Encode until version 1.95 because of that.
+But Unicode::String, a module by Gisle Aas which adds Unicode supports
+to non-utf8-savvy perl did support UTF-7, the UTF-7 support was added
+so Encode can supersede Unicode::String 100%.
+
+=head1 In Practice
+
+When you want to encode Unicode for mails and web pages, however, do
+not use UTF-7 unless you are sure your recipients and readers can
+handle it. Very few MUAs and WWW Browsers support these days (only
+Mozilla seems to support one). For general cases, use UTF-8 for
+message body and MIME-Header for header instead.
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::Unicode>, L<Unicode::String>
+
+RFC 2781 L<http://www.ietf.org/rfc/rfc2152.txt>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/_PM.e2x b/Master/tlpkg/tlperl.straw/lib/Encode/_PM.e2x
new file mode 100755
index 00000000000..eb59cd1b520
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/_PM.e2x
@@ -0,0 +1,23 @@
+package Encode::$_Name_;
+our $VERSION = "0.01";
+
+use Encode;
+use XSLoader;
+XSLoader::load(__PACKAGE__,$VERSION);
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::$_Name_ - New Encoding
+
+=head1 SYNOPSIS
+
+You got to fill this in!
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/_T.e2x b/Master/tlpkg/tlperl.straw/lib/Encode/_T.e2x
new file mode 100755
index 00000000000..6cf5f293d54
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/_T.e2x
@@ -0,0 +1,7 @@
+use strict;
+# Adjust the number here!
+use Test::More tests => 2;
+
+use_ok('Encode');
+use_ok('Encode::$_Name_');
+# Add more test here!
diff --git a/Master/tlpkg/tlperl.straw/lib/Encode/encode.h b/Master/tlpkg/tlperl.straw/lib/Encode/encode.h
new file mode 100755
index 00000000000..0dcf83d32bc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Encode/encode.h
@@ -0,0 +1,113 @@
+#ifndef ENCODE_H
+#define ENCODE_H
+
+#ifndef U8
+/*
+ A tad devious this:
+ perl normally has a #define for U8 - if that isn't present then we
+ typedef it - leaving it #ifndef so we can do data parts without
+ getting extern references to the code parts
+*/
+typedef unsigned char U8;
+#endif
+
+typedef struct encpage_s encpage_t;
+
+struct encpage_s
+{
+ /* fields ordered to pack nicely on 32-bit machines */
+ const U8 *const seq; /* Packed output sequences we generate
+ if we match */
+ const encpage_t *const next; /* Page to go to if we match */
+ const U8 min; /* Min value of octet to match this entry */
+ const U8 max; /* Max value of octet to match this entry */
+ const U8 dlen; /* destination length -
+ size of entries in seq */
+ const U8 slen; /* source length -
+ number of source octets needed */
+};
+
+/*
+ At any point in a translation there is a page pointer which points
+ at an array of the above structures.
+
+ Basic operation :
+ get octet from source stream.
+ if (octet >= min && octet < max) {
+ if slen is 0 then we cannot represent this character.
+ if we have less than slen octets (including this one) then
+ we have a partial character.
+ otherwise
+ copy dlen octets from seq + dlen*(octet-min) to output
+ (dlen may be zero if we don't know yet.)
+ load page pointer with next to continue.
+ (is slen is one this is end of a character)
+ get next octet.
+ }
+ else {
+ increment the page pointer to look at next slot in the array
+ }
+
+ arrays SHALL be constructed so there is an entry which matches
+ ..0xFF at the end, and either maps it or indicates no
+ representation.
+
+ if MSB of slen is set then mapping is an approximate "FALLBACK" entry.
+
+*/
+
+
+typedef struct encode_s encode_t;
+struct encode_s
+{
+ const encpage_t *const t_utf8; /* Starting table for translation from
+ the encoding to UTF-8 form */
+ const encpage_t *const f_utf8; /* Starting table for translation
+ from UTF-8 to the encoding */
+ const U8 *const rep; /* Replacement character in this
+ encoding e.g. "?" */
+ int replen; /* Number of octets in rep */
+ U8 min_el; /* Minimum octets to represent a
+ character */
+ U8 max_el; /* Maximum octets to represent a
+ character */
+ const char *const name[2]; /* name(s) of this encoding */
+};
+
+#ifdef U8
+/* See comment at top of file for deviousness */
+
+extern int do_encode(const encpage_t *enc, const U8 *src, STRLEN *slen,
+ U8 *dst, STRLEN dlen, STRLEN *dout, int approx,
+ const U8 *term, STRLEN tlen);
+
+extern void Encode_DefineEncoding(encode_t *enc);
+
+#endif /* U8 */
+
+#define ENCODE_NOSPACE 1
+#define ENCODE_PARTIAL 2
+#define ENCODE_NOREP 3
+#define ENCODE_FALLBACK 4
+#define ENCODE_FOUND_TERM 5
+
+#define FBCHAR_UTF8 "\xEF\xBF\xBD"
+
+#define ENCODE_DIE_ON_ERR 0x0001 /* croaks immediately */
+#define ENCODE_WARN_ON_ERR 0x0002 /* warn on error; may proceed */
+#define ENCODE_RETURN_ON_ERR 0x0004 /* immediately returns on NOREP */
+#define ENCODE_LEAVE_SRC 0x0008 /* $src updated unless set */
+#define ENCODE_PERLQQ 0x0100 /* perlqq fallback string */
+#define ENCODE_HTMLCREF 0x0200 /* HTML character ref. fb mode */
+#define ENCODE_XMLCREF 0x0400 /* XML character ref. fb mode */
+#define ENCODE_STOP_AT_PARTIAL 0x0800 /* stop at partial explicitly */
+
+#define ENCODE_FB_DEFAULT 0x0000
+#define ENCODE_FB_CROAK 0x0001
+#define ENCODE_FB_QUIET ENCODE_RETURN_ON_ERR
+#define ENCODE_FB_WARN (ENCODE_RETURN_ON_ERR|ENCODE_WARN_ON_ERR)
+#define ENCODE_FB_PERLQQ (ENCODE_PERLQQ|ENCODE_LEAVE_SRC)
+#define ENCODE_FB_HTMLCREF (ENCODE_HTMLCREF|ENCODE_LEAVE_SRC)
+#define ENCODE_FB_XMLCREF (ENCODE_XMLCREF|ENCODE_LEAVE_SRC)
+
+#endif /* ENCODE_H */
diff --git a/Master/tlpkg/tlperl.straw/lib/Env.pm b/Master/tlpkg/tlperl.straw/lib/Env.pm
new file mode 100755
index 00000000000..eb9187fc901
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Env.pm
@@ -0,0 +1,235 @@
+package Env;
+
+our $VERSION = '1.00';
+
+=head1 NAME
+
+Env - perl module that imports environment variables as scalars or arrays
+
+=head1 SYNOPSIS
+
+ use Env;
+ use Env qw(PATH HOME TERM);
+ use Env qw($SHELL @LD_LIBRARY_PATH);
+
+=head1 DESCRIPTION
+
+Perl maintains environment variables in a special hash named C<%ENV>. For
+when this access method is inconvenient, the Perl module C<Env> allows
+environment variables to be treated as scalar or array variables.
+
+The C<Env::import()> function ties environment variables with suitable
+names to global Perl variables with the same names. By default it
+ties all existing environment variables (C<keys %ENV>) to scalars. If
+the C<import> function receives arguments, it takes them to be a list of
+variables to tie; it's okay if they don't yet exist. The scalar type
+prefix '$' is inferred for any element of this list not prefixed by '$'
+or '@'. Arrays are implemented in terms of C<split> and C<join>, using
+C<$Config::Config{path_sep}> as the delimiter.
+
+After an environment variable is tied, merely use it like a normal variable.
+You may access its value
+
+ @path = split(/:/, $PATH);
+ print join("\n", @LD_LIBRARY_PATH), "\n";
+
+or modify it
+
+ $PATH .= ":.";
+ push @LD_LIBRARY_PATH, $dir;
+
+however you'd like. Bear in mind, however, that each access to a tied array
+variable requires splitting the environment variable's string anew.
+
+The code:
+
+ use Env qw(@PATH);
+ push @PATH, '.';
+
+is equivalent to:
+
+ use Env qw(PATH);
+ $PATH .= ":.";
+
+except that if C<$ENV{PATH}> started out empty, the second approach leaves
+it with the (odd) value "C<:.>", but the first approach leaves it with "C<.>".
+
+To remove a tied environment variable from
+the environment, assign it the undefined value
+
+ undef $PATH;
+ undef @LD_LIBRARY_PATH;
+
+=head1 LIMITATIONS
+
+On VMS systems, arrays tied to environment variables are read-only. Attempting
+to change anything will cause a warning.
+
+=head1 AUTHOR
+
+Chip Salzenberg E<lt>F<chip@fin.uucp>E<gt>
+and
+Gregor N. Purdy E<lt>F<gregor@focusresearch.com>E<gt>
+
+=cut
+
+sub import {
+ my ($callpack) = caller(0);
+ my $pack = shift;
+ my @vars = grep /^[\$\@]?[A-Za-z_]\w*$/, (@_ ? @_ : keys(%ENV));
+ return unless @vars;
+
+ @vars = map { m/^[\$\@]/ ? $_ : '$'.$_ } @vars;
+
+ eval "package $callpack; use vars qw(" . join(' ', @vars) . ")";
+ die $@ if $@;
+ foreach (@vars) {
+ my ($type, $name) = m/^([\$\@])(.*)$/;
+ if ($type eq '$') {
+ tie ${"${callpack}::$name"}, Env, $name;
+ } else {
+ if ($^O eq 'VMS') {
+ tie @{"${callpack}::$name"}, Env::Array::VMS, $name;
+ } else {
+ tie @{"${callpack}::$name"}, Env::Array, $name;
+ }
+ }
+ }
+}
+
+sub TIESCALAR {
+ bless \($_[1]);
+}
+
+sub FETCH {
+ my ($self) = @_;
+ $ENV{$$self};
+}
+
+sub STORE {
+ my ($self, $value) = @_;
+ if (defined($value)) {
+ $ENV{$$self} = $value;
+ } else {
+ delete $ENV{$$self};
+ }
+}
+
+######################################################################
+
+package Env::Array;
+
+use Config;
+use Tie::Array;
+
+@ISA = qw(Tie::Array);
+
+my $sep = $Config::Config{path_sep};
+
+sub TIEARRAY {
+ bless \($_[1]);
+}
+
+sub FETCHSIZE {
+ my ($self) = @_;
+ my @temp = split($sep, $ENV{$$self});
+ return scalar(@temp);
+}
+
+sub STORESIZE {
+ my ($self, $size) = @_;
+ my @temp = split($sep, $ENV{$$self});
+ $#temp = $size - 1;
+ $ENV{$$self} = join($sep, @temp);
+}
+
+sub CLEAR {
+ my ($self) = @_;
+ $ENV{$$self} = '';
+}
+
+sub FETCH {
+ my ($self, $index) = @_;
+ return (split($sep, $ENV{$$self}))[$index];
+}
+
+sub STORE {
+ my ($self, $index, $value) = @_;
+ my @temp = split($sep, $ENV{$$self});
+ $temp[$index] = $value;
+ $ENV{$$self} = join($sep, @temp);
+ return $value;
+}
+
+sub PUSH {
+ my $self = shift;
+ my @temp = split($sep, $ENV{$$self});
+ push @temp, @_;
+ $ENV{$$self} = join($sep, @temp);
+ return scalar(@temp);
+}
+
+sub POP {
+ my ($self) = @_;
+ my @temp = split($sep, $ENV{$$self});
+ my $result = pop @temp;
+ $ENV{$$self} = join($sep, @temp);
+ return $result;
+}
+
+sub UNSHIFT {
+ my $self = shift;
+ my @temp = split($sep, $ENV{$$self});
+ my $result = unshift @temp, @_;
+ $ENV{$$self} = join($sep, @temp);
+ return $result;
+}
+
+sub SHIFT {
+ my ($self) = @_;
+ my @temp = split($sep, $ENV{$$self});
+ my $result = shift @temp;
+ $ENV{$$self} = join($sep, @temp);
+ return $result;
+}
+
+sub SPLICE {
+ my $self = shift;
+ my $offset = shift;
+ my $length = shift;
+ my @temp = split($sep, $ENV{$$self});
+ if (wantarray) {
+ my @result = splice @temp, $self, $offset, $length, @_;
+ $ENV{$$self} = join($sep, @temp);
+ return @result;
+ } else {
+ my $result = scalar splice @temp, $offset, $length, @_;
+ $ENV{$$self} = join($sep, @temp);
+ return $result;
+ }
+}
+
+######################################################################
+
+package Env::Array::VMS;
+use Tie::Array;
+
+@ISA = qw(Tie::Array);
+
+sub TIEARRAY {
+ bless \($_[1]);
+}
+
+sub FETCHSIZE {
+ my ($self) = @_;
+ my $i = 0;
+ while ($i < 127 and defined $ENV{$$self . ';' . $i}) { $i++; };
+ return $i;
+}
+
+sub FETCH {
+ my ($self, $index) = @_;
+ return $ENV{$$self . ';' . $index};
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Exporter.pm b/Master/tlpkg/tlperl.straw/lib/Exporter.pm
new file mode 100755
index 00000000000..9e1c1ead7f6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Exporter.pm
@@ -0,0 +1,587 @@
+package Exporter;
+
+require 5.006;
+
+# Be lean.
+#use strict;
+#no strict 'refs';
+
+our $Debug = 0;
+our $ExportLevel = 0;
+our $Verbose ||= 0;
+our $VERSION = '5.63';
+our (%Cache);
+
+# Carp 1.05+ does this now for us, but we may be running with an old Carp
+$Carp::Internal{Exporter}++;
+
+sub as_heavy {
+ require Exporter::Heavy;
+ # Unfortunately, this does not work if the caller is aliased as *name = \&foo
+ # Thus the need to create a lot of identical subroutines
+ my $c = (caller(1))[3];
+ $c =~ s/.*:://;
+ \&{"Exporter::Heavy::heavy_$c"};
+}
+
+sub export {
+ goto &{as_heavy()};
+}
+
+sub import {
+ my $pkg = shift;
+ my $callpkg = caller($ExportLevel);
+
+ if ($pkg eq "Exporter" and @_ and $_[0] eq "import") {
+ *{$callpkg."::import"} = \&import;
+ return;
+ }
+
+ # We *need* to treat @{"$pkg\::EXPORT_FAIL"} since Carp uses it :-(
+ my($exports, $fail) = (\@{"$pkg\::EXPORT"}, \@{"$pkg\::EXPORT_FAIL"});
+ return export $pkg, $callpkg, @_
+ if $Verbose or $Debug or @$fail > 1;
+ my $export_cache = ($Cache{$pkg} ||= {});
+ my $args = @_ or @_ = @$exports;
+
+ local $_;
+ if ($args and not %$export_cache) {
+ s/^&//, $export_cache->{$_} = 1
+ foreach (@$exports, @{"$pkg\::EXPORT_OK"});
+ }
+ my $heavy;
+ # Try very hard not to use {} and hence have to enter scope on the foreach
+ # We bomb out of the loop with last as soon as heavy is set.
+ if ($args or $fail) {
+ ($heavy = (/\W/ or $args and not exists $export_cache->{$_}
+ or @$fail and $_ eq $fail->[0])) and last
+ foreach (@_);
+ } else {
+ ($heavy = /\W/) and last
+ foreach (@_);
+ }
+ return export $pkg, $callpkg, ($args ? @_ : ()) if $heavy;
+ local $SIG{__WARN__} =
+ sub {require Carp; &Carp::carp};
+ # shortcut for the common case of no type character
+ *{"$callpkg\::$_"} = \&{"$pkg\::$_"} foreach @_;
+}
+
+# Default methods
+
+sub export_fail {
+ my $self = shift;
+ @_;
+}
+
+# Unfortunately, caller(1)[3] "does not work" if the caller is aliased as
+# *name = \&foo. Thus the need to create a lot of identical subroutines
+# Otherwise we could have aliased them to export().
+
+sub export_to_level {
+ goto &{as_heavy()};
+}
+
+sub export_tags {
+ goto &{as_heavy()};
+}
+
+sub export_ok_tags {
+ goto &{as_heavy()};
+}
+
+sub require_version {
+ goto &{as_heavy()};
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Exporter - Implements default import method for modules
+
+=head1 SYNOPSIS
+
+In module F<YourModule.pm>:
+
+ package YourModule;
+ require Exporter;
+ @ISA = qw(Exporter);
+ @EXPORT_OK = qw(munge frobnicate); # symbols to export on request
+
+or
+
+ package YourModule;
+ use Exporter 'import'; # gives you Exporter's import() method directly
+ @EXPORT_OK = qw(munge frobnicate); # symbols to export on request
+
+In other files which wish to use C<YourModule>:
+
+ use YourModule qw(frobnicate); # import listed symbols
+ frobnicate ($left, $right) # calls YourModule::frobnicate
+
+Take a look at L</Good Practices> for some variants
+you will like to use in modern Perl code.
+
+=head1 DESCRIPTION
+
+The Exporter module implements an C<import> method which allows a module
+to export functions and variables to its users' namespaces. Many modules
+use Exporter rather than implementing their own C<import> method because
+Exporter provides a highly flexible interface, with an implementation optimised
+for the common case.
+
+Perl automatically calls the C<import> method when processing a
+C<use> statement for a module. Modules and C<use> are documented
+in L<perlfunc> and L<perlmod>. Understanding the concept of
+modules and how the C<use> statement operates is important to
+understanding the Exporter.
+
+=head2 How to Export
+
+The arrays C<@EXPORT> and C<@EXPORT_OK> in a module hold lists of
+symbols that are going to be exported into the users name space by
+default, or which they can request to be exported, respectively. The
+symbols can represent functions, scalars, arrays, hashes, or typeglobs.
+The symbols must be given by full name with the exception that the
+ampersand in front of a function is optional, e.g.
+
+ @EXPORT = qw(afunc $scalar @array); # afunc is a function
+ @EXPORT_OK = qw(&bfunc %hash *typeglob); # explicit prefix on &bfunc
+
+If you are only exporting function names it is recommended to omit the
+ampersand, as the implementation is faster this way.
+
+=head2 Selecting What To Export
+
+Do B<not> export method names!
+
+Do B<not> export anything else by default without a good reason!
+
+Exports pollute the namespace of the module user. If you must export
+try to use C<@EXPORT_OK> in preference to C<@EXPORT> and avoid short or
+common symbol names to reduce the risk of name clashes.
+
+Generally anything not exported is still accessible from outside the
+module using the C<YourModule::item_name> (or C<< $blessed_ref->method >>)
+syntax. By convention you can use a leading underscore on names to
+informally indicate that they are 'internal' and not for public use.
+
+(It is actually possible to get private functions by saying:
+
+ my $subref = sub { ... };
+ $subref->(@args); # Call it as a function
+ $obj->$subref(@args); # Use it as a method
+
+However if you use them for methods it is up to you to figure out
+how to make inheritance work.)
+
+As a general rule, if the module is trying to be object oriented
+then export nothing. If it's just a collection of functions then
+C<@EXPORT_OK> anything but use C<@EXPORT> with caution. For function and
+method names use barewords in preference to names prefixed with
+ampersands for the export lists.
+
+Other module design guidelines can be found in L<perlmod>.
+
+=head2 How to Import
+
+In other files which wish to use your module there are three basic ways for
+them to load your module and import its symbols:
+
+=over 4
+
+=item C<use YourModule;>
+
+This imports all the symbols from YourModule's C<@EXPORT> into the namespace
+of the C<use> statement.
+
+=item C<use YourModule ();>
+
+This causes perl to load your module but does not import any symbols.
+
+=item C<use YourModule qw(...);>
+
+This imports only the symbols listed by the caller into their namespace.
+All listed symbols must be in your C<@EXPORT> or C<@EXPORT_OK>, else an error
+occurs. The advanced export features of Exporter are accessed like this,
+but with list entries that are syntactically distinct from symbol names.
+
+=back
+
+Unless you want to use its advanced features, this is probably all you
+need to know to use Exporter.
+
+=head1 Advanced features
+
+=head2 Specialised Import Lists
+
+If any of the entries in an import list begins with !, : or / then
+the list is treated as a series of specifications which either add to
+or delete from the list of names to import. They are processed left to
+right. Specifications are in the form:
+
+ [!]name This name only
+ [!]:DEFAULT All names in @EXPORT
+ [!]:tag All names in $EXPORT_TAGS{tag} anonymous list
+ [!]/pattern/ All names in @EXPORT and @EXPORT_OK which match
+
+A leading ! indicates that matching names should be deleted from the
+list of names to import. If the first specification is a deletion it
+is treated as though preceded by :DEFAULT. If you just want to import
+extra names in addition to the default set you will still need to
+include :DEFAULT explicitly.
+
+e.g., F<Module.pm> defines:
+
+ @EXPORT = qw(A1 A2 A3 A4 A5);
+ @EXPORT_OK = qw(B1 B2 B3 B4 B5);
+ %EXPORT_TAGS = (T1 => [qw(A1 A2 B1 B2)], T2 => [qw(A1 A2 B3 B4)]);
+
+ Note that you cannot use tags in @EXPORT or @EXPORT_OK.
+ Names in EXPORT_TAGS must also appear in @EXPORT or @EXPORT_OK.
+
+An application using Module can say something like:
+
+ use Module qw(:DEFAULT :T2 !B3 A3);
+
+Other examples include:
+
+ use Socket qw(!/^[AP]F_/ !SOMAXCONN !SOL_SOCKET);
+ use POSIX qw(:errno_h :termios_h !TCSADRAIN !/^EXIT/);
+
+Remember that most patterns (using //) will need to be anchored
+with a leading ^, e.g., C</^EXIT/> rather than C</EXIT/>.
+
+You can say C<BEGIN { $Exporter::Verbose=1 }> to see how the
+specifications are being processed and what is actually being imported
+into modules.
+
+=head2 Exporting without using Exporter's import method
+
+Exporter has a special method, 'export_to_level' which is used in situations
+where you can't directly call Exporter's import method. The export_to_level
+method looks like:
+
+ MyPackage->export_to_level($where_to_export, $package, @what_to_export);
+
+where C<$where_to_export> is an integer telling how far up the calling stack
+to export your symbols, and C<@what_to_export> is an array telling what
+symbols *to* export (usually this is C<@_>). The C<$package> argument is
+currently unused.
+
+For example, suppose that you have a module, A, which already has an
+import function:
+
+ package A;
+
+ @ISA = qw(Exporter);
+ @EXPORT_OK = qw ($b);
+
+ sub import
+ {
+ $A::b = 1; # not a very useful import method
+ }
+
+and you want to Export symbol C<$A::b> back to the module that called
+package A. Since Exporter relies on the import method to work, via
+inheritance, as it stands Exporter::import() will never get called.
+Instead, say the following:
+
+ package A;
+ @ISA = qw(Exporter);
+ @EXPORT_OK = qw ($b);
+
+ sub import
+ {
+ $A::b = 1;
+ A->export_to_level(1, @_);
+ }
+
+This will export the symbols one level 'above' the current package - ie: to
+the program or module that used package A.
+
+Note: Be careful not to modify C<@_> at all before you call export_to_level
+- or people using your package will get very unexplained results!
+
+=head2 Exporting without inheriting from Exporter
+
+By including Exporter in your C<@ISA> you inherit an Exporter's import() method
+but you also inherit several other helper methods which you probably don't
+want. To avoid this you can do
+
+ package YourModule;
+ use Exporter qw( import );
+
+which will export Exporter's own import() method into YourModule.
+Everything will work as before but you won't need to include Exporter in
+C<@YourModule::ISA>.
+
+Note: This feature was introduced in version 5.57
+of Exporter, released with perl 5.8.3.
+
+=head2 Module Version Checking
+
+The Exporter module will convert an attempt to import a number from a
+module into a call to C<< $module_name->require_version($value) >>. This can
+be used to validate that the version of the module being used is
+greater than or equal to the required version.
+
+The Exporter module supplies a default C<require_version> method which
+checks the value of C<$VERSION> in the exporting module.
+
+Since the default C<require_version> method treats the C<$VERSION> number as
+a simple numeric value it will regard version 1.10 as lower than
+1.9. For this reason it is strongly recommended that you use numbers
+with at least two decimal places, e.g., 1.09.
+
+=head2 Managing Unknown Symbols
+
+In some situations you may want to prevent certain symbols from being
+exported. Typically this applies to extensions which have functions
+or constants that may not exist on some systems.
+
+The names of any symbols that cannot be exported should be listed
+in the C<@EXPORT_FAIL> array.
+
+If a module attempts to import any of these symbols the Exporter
+will give the module an opportunity to handle the situation before
+generating an error. The Exporter will call an export_fail method
+with a list of the failed symbols:
+
+ @failed_symbols = $module_name->export_fail(@failed_symbols);
+
+If the C<export_fail> method returns an empty list then no error is
+recorded and all the requested symbols are exported. If the returned
+list is not empty then an error is generated for each symbol and the
+export fails. The Exporter provides a default C<export_fail> method which
+simply returns the list unchanged.
+
+Uses for the C<export_fail> method include giving better error messages
+for some symbols and performing lazy architectural checks (put more
+symbols into C<@EXPORT_FAIL> by default and then take them out if someone
+actually tries to use them and an expensive check shows that they are
+usable on that platform).
+
+=head2 Tag Handling Utility Functions
+
+Since the symbols listed within C<%EXPORT_TAGS> must also appear in either
+C<@EXPORT> or C<@EXPORT_OK>, two utility functions are provided which allow
+you to easily add tagged sets of symbols to C<@EXPORT> or C<@EXPORT_OK>:
+
+ %EXPORT_TAGS = (foo => [qw(aa bb cc)], bar => [qw(aa cc dd)]);
+
+ Exporter::export_tags('foo'); # add aa, bb and cc to @EXPORT
+ Exporter::export_ok_tags('bar'); # add aa, cc and dd to @EXPORT_OK
+
+Any names which are not tags are added to C<@EXPORT> or C<@EXPORT_OK>
+unchanged but will trigger a warning (with C<-w>) to avoid misspelt tags
+names being silently added to C<@EXPORT> or C<@EXPORT_OK>. Future versions
+may make this a fatal error.
+
+=head2 Generating combined tags
+
+If several symbol categories exist in C<%EXPORT_TAGS>, it's usually
+useful to create the utility ":all" to simplify "use" statements.
+
+The simplest way to do this is:
+
+ %EXPORT_TAGS = (foo => [qw(aa bb cc)], bar => [qw(aa cc dd)]);
+
+ # add all the other ":class" tags to the ":all" class,
+ # deleting duplicates
+ {
+ my %seen;
+
+ push @{$EXPORT_TAGS{all}},
+ grep {!$seen{$_}++} @{$EXPORT_TAGS{$_}} foreach keys %EXPORT_TAGS;
+ }
+
+F<CGI.pm> creates an ":all" tag which contains some (but not really
+all) of its categories. That could be done with one small
+change:
+
+ # add some of the other ":class" tags to the ":all" class,
+ # deleting duplicates
+ {
+ my %seen;
+
+ push @{$EXPORT_TAGS{all}},
+ grep {!$seen{$_}++} @{$EXPORT_TAGS{$_}}
+ foreach qw/html2 html3 netscape form cgi internal/;
+ }
+
+Note that the tag names in C<%EXPORT_TAGS> don't have the leading ':'.
+
+=head2 C<AUTOLOAD>ed Constants
+
+Many modules make use of C<AUTOLOAD>ing for constant subroutines to
+avoid having to compile and waste memory on rarely used values (see
+L<perlsub> for details on constant subroutines). Calls to such
+constant subroutines are not optimized away at compile time because
+they can't be checked at compile time for constancy.
+
+Even if a prototype is available at compile time, the body of the
+subroutine is not (it hasn't been C<AUTOLOAD>ed yet). perl needs to
+examine both the C<()> prototype and the body of a subroutine at
+compile time to detect that it can safely replace calls to that
+subroutine with the constant value.
+
+A workaround for this is to call the constants once in a C<BEGIN> block:
+
+ package My ;
+
+ use Socket ;
+
+ foo( SO_LINGER ); ## SO_LINGER NOT optimized away; called at runtime
+ BEGIN { SO_LINGER }
+ foo( SO_LINGER ); ## SO_LINGER optimized away at compile time.
+
+This forces the C<AUTOLOAD> for C<SO_LINGER> to take place before
+SO_LINGER is encountered later in C<My> package.
+
+If you are writing a package that C<AUTOLOAD>s, consider forcing
+an C<AUTOLOAD> for any constants explicitly imported by other packages
+or which are usually used when your package is C<use>d.
+
+=head1 Good Practices
+
+=head2 Declaring C<@EXPORT_OK> and Friends
+
+When using C<Exporter> with the standard C<strict> and C<warnings>
+pragmas, the C<our> keyword is needed to declare the package
+variables C<@EXPORT_OK>, C<@EXPORT>, C<@ISA>, etc.
+
+ our @ISA = qw(Exporter);
+ our @EXPORT_OK = qw(munge frobnicate);
+
+If backward compatibility for Perls under 5.6 is important,
+one must write instead a C<use vars> statement.
+
+ use vars qw(@ISA @EXPORT_OK);
+ @ISA = qw(Exporter);
+ @EXPORT_OK = qw(munge frobnicate);
+
+=head2 Playing Safe
+
+There are some caveats with the use of runtime statements
+like C<require Exporter> and the assignment to package
+variables, which can very subtle for the unaware programmer.
+This may happen for instance with mutually recursive
+modules, which are affected by the time the relevant
+constructions are executed.
+
+The ideal (but a bit ugly) way to never have to think
+about that is to use C<BEGIN> blocks. So the first part
+of the L</SYNOPSIS> code could be rewritten as:
+
+ package YourModule;
+
+ use strict;
+ use warnings;
+
+ our (@ISA, @EXPORT_OK);
+ BEGIN {
+ require Exporter;
+ @ISA = qw(Exporter);
+ @EXPORT_OK = qw(munge frobnicate); # symbols to export on request
+ }
+
+The C<BEGIN> will assure that the loading of F<Exporter.pm>
+and the assignments to C<@ISA> and C<@EXPORT_OK> happen
+immediately, leaving no room for something to get awry
+or just plain wrong.
+
+With respect to loading C<Exporter> and inheriting, there
+are alternatives with the use of modules like C<base> and C<parent>.
+
+ use base qw( Exporter );
+ # or
+ use parent qw( Exporter );
+
+Any of these statements are nice replacements for
+C<BEGIN { require Exporter; @ISA = qw(Exporter); }>
+with the same compile-time effect. The basic difference
+is that C<base> code interacts with declared C<fields>
+while C<parent> is a streamlined version of the older
+C<base> code to just establish the IS-A relationship.
+
+For more details, see the documentation and code of
+L<base> and L<parent>.
+
+Another thorough remedy to that runtime vs.
+compile-time trap is to use L<Exporter::Easy>,
+which is a wrapper of Exporter that allows all
+boilerplate code at a single gulp in the
+use statement.
+
+ use Exporter::Easy (
+ OK => [ qw(munge frobnicate) ],
+ );
+ # @ISA setup is automatic
+ # all assignments happen at compile time
+
+=head2 What not to Export
+
+You have been warned already in L</Selecting What To Export>
+to not export:
+
+=over 4
+
+=item *
+
+method names (because you don't need to
+and that's likely to not do what you want),
+
+=item *
+
+anything by default (because you don't want to surprise your users...
+badly)
+
+=item *
+
+anything you don't need to (because less is more)
+
+=back
+
+There's one more item to add to this list. Do B<not>
+export variable names. Just because C<Exporter> lets you
+do that, it does not mean you should.
+
+ @EXPORT_OK = qw( $svar @avar %hvar ); # DON'T!
+
+Exporting variables is not a good idea. They can
+change under the hood, provoking horrible
+effects at-a-distance, that are too hard to track
+and to fix. Trust me: they are not worth it.
+
+To provide the capability to set/get class-wide
+settings, it is best instead to provide accessors
+as subroutines or class methods instead.
+
+=head1 SEE ALSO
+
+C<Exporter> is definitely not the only module with
+symbol exporter capabilities. At CPAN, you may find
+a bunch of them. Some are lighter. Some
+provide improved APIs and features. Peek the one
+that fits your needs. The following is
+a sample list of such modules.
+
+ Exporter::Easy
+ Exporter::Lite
+ Exporter::Renaming
+ Exporter::Tidy
+ Sub::Exporter / Sub::Installer
+ Perl6::Export / Perl6::Export::Attrs
+
+=head1 LICENSE
+
+This library is free software. You can redistribute it
+and/or modify it under the same terms as Perl itself.
+
+=cut
+
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder.pm
new file mode 100755
index 00000000000..7854e88dc94
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder.pm
@@ -0,0 +1,331 @@
+package ExtUtils::CBuilder;
+
+use File::Spec ();
+use File::Path ();
+use File::Basename ();
+
+use vars qw($VERSION @ISA);
+$VERSION = '0.27';
+$VERSION = eval $VERSION;
+
+# Okay, this is the brute-force method of finding out what kind of
+# platform we're on. I don't know of a systematic way. These values
+# came from the latest (bleadperl) perlport.pod.
+
+my %OSTYPES = qw(
+ aix Unix
+ bsdos Unix
+ dgux Unix
+ dynixptx Unix
+ freebsd Unix
+ linux Unix
+ hpux Unix
+ irix Unix
+ darwin Unix
+ machten Unix
+ next Unix
+ openbsd Unix
+ netbsd Unix
+ dec_osf Unix
+ svr4 Unix
+ svr5 Unix
+ sco_sv Unix
+ unicos Unix
+ unicosmk Unix
+ solaris Unix
+ sunos Unix
+ cygwin Unix
+ os2 Unix
+ gnu Unix
+ gnukfreebsd Unix
+ haiku Unix
+
+ dos Windows
+ MSWin32 Windows
+
+ os390 EBCDIC
+ os400 EBCDIC
+ posix-bc EBCDIC
+ vmesa EBCDIC
+
+ MacOS MacOS
+ VMS VMS
+ VOS VOS
+ riscos RiscOS
+ amigaos Amiga
+ mpeix MPEiX
+ );
+
+# We only use this once - don't waste a symbol table entry on it.
+# More importantly, don't make it an inheritable method.
+my $load = sub {
+ my $mod = shift;
+ eval "use $mod";
+ die $@ if $@;
+ @ISA = ($mod);
+};
+
+{
+ my @package = split /::/, __PACKAGE__;
+
+ if (grep {-e File::Spec->catfile($_, @package, 'Platform', $^O) . '.pm'} @INC) {
+ $load->(__PACKAGE__ . "::Platform::$^O");
+
+ } elsif (exists $OSTYPES{$^O} and
+ grep {-e File::Spec->catfile($_, @package, 'Platform', $OSTYPES{$^O}) . '.pm'} @INC) {
+ $load->(__PACKAGE__ . "::Platform::$OSTYPES{$^O}");
+
+ } else {
+ $load->(__PACKAGE__ . "::Base");
+ }
+}
+
+sub os_type { $OSTYPES{$^O} }
+
+1;
+__END__
+
+=head1 NAME
+
+ExtUtils::CBuilder - Compile and link C code for Perl modules
+
+=head1 SYNOPSIS
+
+ use ExtUtils::CBuilder;
+
+ my $b = ExtUtils::CBuilder->new(%options);
+ $obj_file = $b->compile(source => 'MyModule.c');
+ $lib_file = $b->link(objects => $obj_file);
+
+=head1 DESCRIPTION
+
+This module can build the C portions of Perl modules by invoking the
+appropriate compilers and linkers in a cross-platform manner. It was
+motivated by the C<Module::Build> project, but may be useful for other
+purposes as well. However, it is I<not> intended as a general
+cross-platform interface to all your C building needs. That would
+have been a much more ambitious goal!
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+Returns a new C<ExtUtils::CBuilder> object. A C<config> parameter
+lets you override C<Config.pm> settings for all operations performed
+by the object, as in the following example:
+
+ # Use a different compiler than Config.pm says
+ my $b = ExtUtils::CBuilder->new( config =>
+ { ld => 'gcc' } );
+
+A C<quiet> parameter tells C<CBuilder> to not print its C<system()>
+commands before executing them:
+
+ # Be quieter than normal
+ my $b = ExtUtils::CBuilder->new( quiet => 1 );
+
+=item have_compiler
+
+Returns true if the current system has a working C compiler and
+linker, false otherwise. To determine this, we actually compile and
+link a sample C library. The sample will be compiled in the system
+tempdir or, if that fails for some reason, in the current directory.
+
+=item have_cplusplus
+
+Just like have_compiler but for C++ instead of C.
+
+=item compile
+
+Compiles a C source file and produces an object file. The name of the
+object file is returned. The source file is specified in a C<source>
+parameter, which is required; the other parameters listed below are
+optional.
+
+=over 4
+
+=item C<object_file>
+
+Specifies the name of the output file to create. Otherwise the
+C<object_file()> method will be consulted, passing it the name of the
+C<source> file.
+
+=item C<include_dirs>
+
+Specifies any additional directories in which to search for header
+files. May be given as a string indicating a single directory, or as
+a list reference indicating multiple directories.
+
+=item C<extra_compiler_flags>
+
+Specifies any additional arguments to pass to the compiler. Should be
+given as a list reference containing the arguments individually, or if
+this is not possible, as a string containing all the arguments
+together.
+
+=item C<C++>
+
+Specifies that the source file is a C++ source file and sets appropriate
+compiler flags
+
+=back
+
+The operation of this method is also affected by the
+C<archlibexp>, C<cccdlflags>, C<ccflags>, C<optimize>, and C<cc>
+entries in C<Config.pm>.
+
+=item link
+
+Invokes the linker to produce a library file from object files. In
+scalar context, the name of the library file is returned. In list
+context, the library file and any temporary files created are
+returned. A required C<objects> parameter contains the name of the
+object files to process, either in a string (for one object file) or
+list reference (for one or more files). The following parameters are
+optional:
+
+
+=over 4
+
+=item lib_file
+
+Specifies the name of the output library file to create. Otherwise
+the C<lib_file()> method will be consulted, passing it the name of
+the first entry in C<objects>.
+
+=item module_name
+
+Specifies the name of the Perl module that will be created by linking.
+On platforms that need to do prelinking (Win32, OS/2, etc.) this is a
+required parameter.
+
+=item extra_linker_flags
+
+Any additional flags you wish to pass to the linker.
+
+=back
+
+On platforms where C<need_prelink()> returns true, C<prelink()>
+will be called automatically.
+
+The operation of this method is also affected by the C<lddlflags>,
+C<shrpenv>, and C<ld> entries in C<Config.pm>.
+
+=item link_executable
+
+Invokes the linker to produce an executable file from object files. In
+scalar context, the name of the executable file is returned. In list
+context, the executable file and any temporary files created are
+returned. A required C<objects> parameter contains the name of the
+object files to process, either in a string (for one object file) or
+list reference (for one or more files). The optional parameters are
+the same as C<link> with exception for
+
+
+=over 4
+
+=item exe_file
+
+Specifies the name of the output executable file to create. Otherwise
+the C<exe_file()> method will be consulted, passing it the name of the
+first entry in C<objects>.
+
+=back
+
+=item object_file
+
+ my $object_file = $b->object_file($source_file);
+
+Converts the name of a C source file to the most natural name of an
+output object file to create from it. For instance, on Unix the
+source file F<foo.c> would result in the object file F<foo.o>.
+
+=item lib_file
+
+ my $lib_file = $b->lib_file($object_file);
+
+Converts the name of an object file to the most natural name of a
+output library file to create from it. For instance, on Mac OS X the
+object file F<foo.o> would result in the library file F<foo.bundle>.
+
+=item exe_file
+
+ my $exe_file = $b->exe_file($object_file);
+
+Converts the name of an object file to the most natural name of an
+executable file to create from it. For instance, on Mac OS X the
+object file F<foo.o> would result in the executable file F<foo>, and
+on Windows it would result in F<foo.exe>.
+
+
+=item prelink
+
+On certain platforms like Win32, OS/2, VMS, and AIX, it is necessary
+to perform some actions before invoking the linker. The
+C<ExtUtils::Mksymlists> module does this, writing files used by the
+linker during the creation of shared libraries for dynamic extensions.
+The names of any files written will be returned as a list.
+
+Several parameters correspond to C<ExtUtils::Mksymlists::Mksymlists()>
+options, as follows:
+
+ Mksymlists() prelink() type
+ -------------|-------------------|-------------------
+ NAME | dl_name | string (required)
+ DLBASE | dl_base | string
+ FILE | dl_file | string
+ DL_VARS | dl_vars | array reference
+ DL_FUNCS | dl_funcs | hash reference
+ FUNCLIST | dl_func_list | array reference
+ IMPORTS | dl_imports | hash reference
+ VERSION | dl_version | string
+
+Please see the documentation for C<ExtUtils::Mksymlists> for the
+details of what these parameters do.
+
+=item need_prelink
+
+Returns true on platforms where C<prelink()> should be called
+during linking, and false otherwise.
+
+=item extra_link_args_after_prelink
+
+Returns list of extra arguments to give to the link command; the arguments
+are the same as for prelink(), with addition of array reference to the
+results of prelink(); this reference is indexed by key C<prelink_res>.
+
+=back
+
+=head1 TO DO
+
+Currently this has only been tested on Unix and doesn't contain any of
+the Windows-specific code from the C<Module::Build> project. I'll do
+that next.
+
+=head1 HISTORY
+
+This module is an outgrowth of the C<Module::Build> project, to which
+there have been many contributors. Notably, Randy W. Sims submitted
+lots of code to support 3 compilers on Windows and helped with various
+other platform-specific issues. Ilya Zakharevich has contributed
+fixes for OS/2; John E. Malmberg and Peter Prymmer have done likewise
+for VMS.
+
+=head1 AUTHOR
+
+Ken Williams, kwilliams@cpan.org
+
+=head1 COPYRIGHT
+
+Copyright (c) 2003-2005 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Base.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Base.pm
new file mode 100755
index 00000000000..28036c61bdc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Base.pm
@@ -0,0 +1,307 @@
+package ExtUtils::CBuilder::Base;
+
+use strict;
+use File::Spec;
+use File::Basename;
+use Cwd ();
+use Config;
+use Text::ParseWords;
+use IO::File;
+
+use vars qw($VERSION);
+$VERSION = '0.27';
+
+sub new {
+ my $class = shift;
+ my $self = bless {@_}, $class;
+
+ $self->{properties}{perl} = $class->find_perl_interpreter
+ or warn "Warning: Can't locate your perl binary";
+
+ while (my ($k,$v) = each %Config) {
+ $self->{config}{$k} = $v unless exists $self->{config}{$k};
+ }
+ $self->{config}{cc} = $ENV{CC} if exists $ENV{CC};
+ return $self;
+}
+
+sub find_perl_interpreter {
+ my $perl;
+ File::Spec->file_name_is_absolute($perl = $^X)
+ or -f ($perl = $Config::Config{perlpath})
+ or ($perl = $^X);
+ return $perl;
+}
+
+sub add_to_cleanup {
+ my $self = shift;
+ foreach (@_) {
+ $self->{files_to_clean}{$_} = 1;
+ }
+}
+
+sub cleanup {
+ my $self = shift;
+ foreach my $file (keys %{$self->{files_to_clean}}) {
+ unlink $file;
+ }
+}
+
+sub object_file {
+ my ($self, $filename) = @_;
+
+ # File name, minus the suffix
+ (my $file_base = $filename) =~ s/\.[^.]+$//;
+ return "$file_base$self->{config}{obj_ext}";
+}
+
+sub arg_include_dirs {
+ my $self = shift;
+ return map {"-I$_"} @_;
+}
+
+sub arg_nolink { '-c' }
+
+sub arg_object_file {
+ my ($self, $file) = @_;
+ return ('-o', $file);
+}
+
+sub arg_share_object_file {
+ my ($self, $file) = @_;
+ return ($self->split_like_shell($self->{config}{lddlflags}), '-o', $file);
+}
+
+sub arg_exec_file {
+ my ($self, $file) = @_;
+ return ('-o', $file);
+}
+
+sub arg_defines {
+ my ($self, %args) = @_;
+ return map "-D$_=$args{$_}", keys %args;
+}
+
+sub compile {
+ my ($self, %args) = @_;
+ die "Missing 'source' argument to compile()" unless defined $args{source};
+
+ my $cf = $self->{config}; # For convenience
+
+ $args{object_file} ||= $self->object_file($args{source});
+
+ my @include_dirs = $self->arg_include_dirs
+ (@{$args{include_dirs} || []},
+ $self->perl_inc());
+
+ my @defines = $self->arg_defines( %{$args{defines} || {}} );
+
+ my @extra_compiler_flags = $self->split_like_shell($args{extra_compiler_flags});
+ my @cccdlflags = $self->split_like_shell($cf->{cccdlflags});
+ my @ccflags = $self->split_like_shell($cf->{ccflags});
+ push @ccflags, qw/-x c++/ if $args{'C++'};
+ my @optimize = $self->split_like_shell($cf->{optimize});
+ my @flags = (@include_dirs, @defines, @cccdlflags, @extra_compiler_flags,
+ $self->arg_nolink,
+ @ccflags, @optimize,
+ $self->arg_object_file($args{object_file}),
+ );
+
+ my @cc = $self->split_like_shell($cf->{cc});
+
+ $self->do_system(@cc, @flags, $args{source})
+ or die "error building $args{object_file} from '$args{source}'";
+
+ return $args{object_file};
+}
+
+sub have_compiler {
+ my ($self, $is_cplusplus) = @_;
+ return $self->{have_compiler} if defined $self->{have_compiler};
+
+ my $result;
+ my $attempts = 3;
+ # tmpdir has issues for some people so fall back to current dir
+ DIR: for my $dir ( File::Spec->tmpdir, '.' ) {
+
+ # don't clobber existing files (rare, but possible)
+ my $rand = int(rand(2**31));
+ my $tmpfile = File::Spec->catfile($dir, "compilet-$rand.c");
+ $tmpfile .= "c" if $is_cplusplus;
+ if ( -e $tmpfile ) {
+ redo DIR if $attempts--;
+ next DIR;
+ }
+
+ {
+ my $FH = IO::File->new("> $tmpfile") or die "Can't create $tmpfile: $!";
+ if ( $is_cplusplus ) {
+ print $FH "class Bogus { public: int boot_compilet() { return 1; } };\n";
+ }
+ else {
+ print $FH "int boot_compilet() { return 1; }\n";
+ }
+ }
+
+ my ($obj_file, @lib_files);
+ eval {
+ local $^W = 0;
+ local $self->{quiet} = 1;
+ $obj_file = $self->compile('C++' => $is_cplusplus, source => $tmpfile);
+ @lib_files = $self->link(objects => $obj_file, module_name => 'compilet');
+ };
+ $result = $@ ? 0 : 1;
+
+ foreach (grep defined, $tmpfile, $obj_file, @lib_files) {
+ 1 while unlink;
+ }
+ last DIR if $result;
+ }
+
+ return $self->{have_compiler} = $result;
+}
+
+sub have_cplusplus {
+ push @_, 1;
+ goto &have_compiler;
+}
+
+sub lib_file {
+ my ($self, $dl_file) = @_;
+ $dl_file =~ s/\.[^.]+$//;
+ $dl_file =~ tr/"//d;
+ return "$dl_file.$self->{config}{dlext}";
+}
+
+
+sub exe_file {
+ my ($self, $dl_file) = @_;
+ $dl_file =~ s/\.[^.]+$//;
+ $dl_file =~ tr/"//d;
+ return "$dl_file$self->{config}{_exe}";
+}
+
+sub need_prelink { 0 }
+
+sub extra_link_args_after_prelink { return }
+
+sub prelink {
+ my ($self, %args) = @_;
+
+ ($args{dl_file} = $args{dl_name}) =~ s/.*::// unless $args{dl_file};
+
+ require ExtUtils::Mksymlists;
+ ExtUtils::Mksymlists::Mksymlists( # dl. abbrev for dynamic library
+ DL_VARS => $args{dl_vars} || [],
+ DL_FUNCS => $args{dl_funcs} || {},
+ FUNCLIST => $args{dl_func_list} || [],
+ IMPORTS => $args{dl_imports} || {},
+ NAME => $args{dl_name}, # Name of the Perl module
+ DLBASE => $args{dl_base}, # Basename of DLL file
+ FILE => $args{dl_file}, # Dir + Basename of symlist file
+ VERSION => (defined $args{dl_version} ? $args{dl_version} : '0.0'),
+ );
+
+ # Mksymlists will create one of these files
+ return grep -e, map "$args{dl_file}.$_", qw(ext def opt);
+}
+
+sub link {
+ my ($self, %args) = @_;
+ return $self->_do_link('lib_file', lddl => 1, %args);
+}
+
+sub link_executable {
+ my ($self, %args) = @_;
+ return $self->_do_link('exe_file', lddl => 0, %args);
+}
+
+sub _do_link {
+ my ($self, $type, %args) = @_;
+
+ my $cf = $self->{config}; # For convenience
+
+ my $objects = delete $args{objects};
+ $objects = [$objects] unless ref $objects;
+ my $out = $args{$type} || $self->$type($objects->[0]);
+
+ my @temp_files;
+ @temp_files =
+ $self->prelink(%args,
+ dl_name => $args{module_name}) if $args{lddl} && $self->need_prelink;
+
+ my @linker_flags = ($self->split_like_shell($args{extra_linker_flags}),
+ $self->extra_link_args_after_prelink(%args, dl_name => $args{module_name},
+ prelink_res => \@temp_files));
+
+ my @output = $args{lddl} ? $self->arg_share_object_file($out) : $self->arg_exec_file($out);
+ my @shrp = $self->split_like_shell($cf->{shrpenv});
+ my @ld = $self->split_like_shell($cf->{ld});
+
+ $self->do_system(@shrp, @ld, @output, @$objects, @linker_flags)
+ or die "error building $out from @$objects";
+
+ return wantarray ? ($out, @temp_files) : $out;
+}
+
+
+sub do_system {
+ my ($self, @cmd) = @_;
+ print "@cmd\n" if !$self->{quiet};
+ return !system(@cmd);
+}
+
+sub split_like_shell {
+ my ($self, $string) = @_;
+
+ return () unless defined($string);
+ return @$string if UNIVERSAL::isa($string, 'ARRAY');
+ $string =~ s/^\s+|\s+$//g;
+ return () unless length($string);
+
+ return Text::ParseWords::shellwords($string);
+}
+
+# if building perl, perl's main source directory
+sub perl_src {
+ # N.B. makemaker actually searches regardless of PERL_CORE, but
+ # only squawks at not finding it if PERL_CORE is set
+
+ return unless $ENV{PERL_CORE};
+
+ my $Updir = File::Spec->updir;
+ my $dir = File::Spec->curdir;
+
+ # Try up to 5 levels upwards
+ for (0..10) {
+ if (
+ -f File::Spec->catfile($dir,"config_h.SH")
+ &&
+ -f File::Spec->catfile($dir,"perl.h")
+ &&
+ -f File::Spec->catfile($dir,"lib","Exporter.pm")
+ ) {
+ return Cwd::realpath( $dir );
+ }
+
+ $dir = File::Spec->catdir($dir, $Updir);
+ }
+
+ warn "PERL_CORE is set but I can't find your perl source!\n";
+ return ''; # return empty string if $ENV{PERL_CORE} but can't find dir ???
+}
+
+# directory of perl's include files
+sub perl_inc {
+ my $self = shift;
+
+ $self->perl_src() || File::Spec->catdir($self->{config}{archlibexp},"CORE");
+}
+
+sub DESTROY {
+ my $self = shift;
+ local($., $@, $!, $^E, $?);
+ $self->cleanup();
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Unix.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Unix.pm
new file mode 100755
index 00000000000..78ff244b5ba
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Unix.pm
@@ -0,0 +1,40 @@
+package ExtUtils::CBuilder::Platform::Unix;
+
+use strict;
+use ExtUtils::CBuilder::Base;
+
+use vars qw($VERSION @ISA);
+$VERSION = '0.27';
+@ISA = qw(ExtUtils::CBuilder::Base);
+
+sub link_executable {
+ my $self = shift;
+
+ # On some platforms (which ones??) $Config{cc} seems to be a better
+ # bet for linking executables than $Config{ld}. Cygwin is a notable
+ # exception.
+ local $self->{config}{ld} =
+ $self->{config}{cc} . " " . $self->{config}{ldflags};
+ return $self->SUPER::link_executable(@_);
+}
+
+sub link {
+ my $self = shift;
+ my $cf = $self->{config};
+
+ # Some platforms (notably Mac OS X 10.3, but some others too) expect
+ # the syntax "FOO=BAR /bin/command arg arg" to work in %Config
+ # (notably $Config{ld}). It usually works in system(SCALAR), but we
+ # use system(LIST). We fix it up here with 'env'.
+
+ local $cf->{ld} = $cf->{ld};
+ if (ref $cf->{ld}) {
+ unshift @{$cf->{ld}}, 'env' if $cf->{ld}[0] =~ /^\s*\w+=/;
+ } else {
+ $cf->{ld} =~ s/^(\s*\w+=)/env $1/;
+ }
+
+ return $self->SUPER::link(@_);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/VMS.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/VMS.pm
new file mode 100755
index 00000000000..35a2eba550b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/VMS.pm
@@ -0,0 +1,294 @@
+package ExtUtils::CBuilder::Platform::VMS;
+
+use strict;
+use ExtUtils::CBuilder::Base;
+
+use vars qw($VERSION @ISA);
+$VERSION = '0.27';
+@ISA = qw(ExtUtils::CBuilder::Base);
+
+use File::Spec::Functions qw(catfile catdir);
+
+# We do prelink, but don't want the parent to redo it.
+
+sub need_prelink { 0 }
+
+sub arg_defines {
+ my ($self, %args) = @_;
+
+ s/"/""/g foreach values %args;
+
+ my @config_defines;
+
+ # VMS can only have one define qualifier; add the one from config, if any.
+ if ($self->{config}{ccflags} =~ s{/ def[^=]+ =+ \(? ([^\/\)]*) } {}ix) {
+ push @config_defines, $1;
+ }
+
+ return '' unless keys(%args) || @config_defines;
+
+ return ('/define=('
+ . join(',',
+ @config_defines,
+ map "\"$_" . ( length($args{$_}) ? "=$args{$_}" : '') . "\"",
+ keys %args)
+ . ')');
+}
+
+sub arg_include_dirs {
+ my ($self, @dirs) = @_;
+
+ # VMS can only have one include list, add the one from config.
+ if ($self->{config}{ccflags} =~ s{/inc[^=]+(?:=)+(?:\()?([^\/\)]*)} {}i) {
+ unshift @dirs, $1;
+ }
+ return unless @dirs;
+
+ return ('/include=(' . join(',', @dirs) . ')');
+}
+
+sub _do_link {
+ my ($self, $type, %args) = @_;
+
+ my $objects = delete $args{objects};
+ $objects = [$objects] unless ref $objects;
+
+ if ($args{lddl}) {
+
+ # prelink will call Mksymlists, which creates the extension-specific
+ # linker options file and populates it with the boot symbol.
+
+ my @temp_files = $self->prelink(%args, dl_name => $args{module_name});
+
+ # We now add the rest of what we need to the linker options file. We
+ # should replicate the functionality of C<ExtUtils::MM_VMS::dlsyms>,
+ # but there is as yet no infrastructure for handling object libraries,
+ # so for now we depend on object files being listed individually on the
+ # command line, which should work for simple cases. We do bring in our
+ # own version of C<ExtUtils::Liblist::Kid::ext> so that any additional
+ # libraries (including PERLSHR) can be added to the options file.
+
+ my @optlibs = $self->_liblist_ext( $args{'libs'} );
+
+ my $optfile = 'sys$disk:[]' . $temp_files[0];
+ open my $opt_fh, '>>', $optfile
+ or die "_do_link: Unable to open $optfile: $!";
+ for my $lib (@optlibs) {print $opt_fh "$lib\n" if length $lib }
+ close $opt_fh;
+
+ $objects->[-1] .= ',';
+ push @$objects, $optfile . '/OPTIONS,';
+
+ # This one not needed for DEC C, but leave for completeness.
+ push @$objects, $self->perl_inc() . 'perlshr_attr.opt/OPTIONS';
+ }
+
+ return $self->SUPER::_do_link($type, %args, objects => $objects);
+}
+
+sub arg_nolink { return; }
+
+sub arg_object_file {
+ my ($self, $file) = @_;
+ return "/obj=$file";
+}
+
+sub arg_exec_file {
+ my ($self, $file) = @_;
+ return ("/exe=$file");
+}
+
+sub arg_share_object_file {
+ my ($self, $file) = @_;
+ return ("$self->{config}{lddlflags}=$file");
+}
+
+
+sub lib_file {
+ my ($self, $dl_file) = @_;
+ $dl_file =~ s/\.[^.]+$//;
+ $dl_file =~ tr/"//d;
+ $dl_file = $dl_file .= '.' . $self->{config}{dlext};
+
+ # Need to create with the same name as DynaLoader will load with.
+ if (defined &DynaLoader::mod2fname) {
+ my ($dev,$dir,$file) = File::Spec->splitpath($dl_file);
+ $file = DynaLoader::mod2fname([$file]);
+ $dl_file = File::Spec->catpath($dev,$dir,$file);
+ }
+ return $dl_file;
+}
+
+# The following is reproduced almost verbatim from ExtUtils::Liblist::Kid::_vms_ext.
+# We can't just call that because it's tied up with the MakeMaker object hierarchy.
+
+sub _liblist_ext {
+ my($self, $potential_libs,$verbose,$give_libs) = @_;
+ $verbose ||= 0;
+
+ my(@crtls,$crtlstr);
+ @crtls = ( ($self->{'config'}{'ldflags'} =~ m-/Debug-i ? $self->{'config'}{'dbgprefix'} : '')
+ . 'PerlShr/Share' );
+ push(@crtls, grep { not /\(/ } split /\s+/, $self->{'config'}{'perllibs'});
+ push(@crtls, grep { not /\(/ } split /\s+/, $self->{'config'}{'libc'});
+ # In general, we pass through the basic libraries from %Config unchanged.
+ # The one exception is that if we're building in the Perl source tree, and
+ # a library spec could be resolved via a logical name, we go to some trouble
+ # to ensure that the copy in the local tree is used, rather than one to
+ # which a system-wide logical may point.
+ if ($self->perl_src) {
+ my($lib,$locspec,$type);
+ foreach $lib (@crtls) {
+ if (($locspec,$type) = $lib =~ m{^([\w\$-]+)(/\w+)?} and $locspec =~ /perl/i) {
+ if (lc $type eq '/share') { $locspec .= $self->{'config'}{'exe_ext'}; }
+ elsif (lc $type eq '/library') { $locspec .= $self->{'config'}{'lib_ext'}; }
+ else { $locspec .= $self->{'config'}{'obj_ext'}; }
+ $locspec = catfile($self->perl_src, $locspec);
+ $lib = "$locspec$type" if -e $locspec;
+ }
+ }
+ }
+ $crtlstr = @crtls ? join(' ',@crtls) : '';
+
+ unless ($potential_libs) {
+ warn "Result:\n\tEXTRALIBS: \n\tLDLOADLIBS: $crtlstr\n" if $verbose;
+ return ('', '', $crtlstr, '', ($give_libs ? [] : ()));
+ }
+
+ my(@dirs,@libs,$dir,$lib,%found,@fndlibs,$ldlib);
+ my $cwd = cwd();
+ my($so,$lib_ext,$obj_ext) = @{$self->{'config'}}{'so','lib_ext','obj_ext'};
+ # List of common Unix library names and their VMS equivalents
+ # (VMS equivalent of '' indicates that the library is automatically
+ # searched by the linker, and should be skipped here.)
+ my(@flibs, %libs_seen);
+ my %libmap = ( 'm' => '', 'f77' => '', 'F77' => '', 'V77' => '', 'c' => '',
+ 'malloc' => '', 'crypt' => '', 'resolv' => '', 'c_s' => '',
+ 'socket' => '', 'X11' => 'DECW$XLIBSHR',
+ 'Xt' => 'DECW$XTSHR', 'Xm' => 'DECW$XMLIBSHR',
+ 'Xmu' => 'DECW$XMULIBSHR');
+ if ($self->{'config'}{'vms_cc_type'} ne 'decc') { $libmap{'curses'} = 'VAXCCURSE'; }
+
+ warn "Potential libraries are '$potential_libs'\n" if $verbose;
+
+ # First, sort out directories and library names in the input
+ foreach $lib (split ' ',$potential_libs) {
+ push(@dirs,$1), next if $lib =~ /^-L(.*)/;
+ push(@dirs,$lib), next if $lib =~ /[:>\]]$/;
+ push(@dirs,$lib), next if -d $lib;
+ push(@libs,$1), next if $lib =~ /^-l(.*)/;
+ push(@libs,$lib);
+ }
+ push(@dirs,split(' ',$self->{'config'}{'libpth'}));
+
+ # Now make sure we've got VMS-syntax absolute directory specs
+ # (We don't, however, check whether someone's hidden a relative
+ # path in a logical name.)
+ foreach $dir (@dirs) {
+ unless (-d $dir) {
+ warn "Skipping nonexistent Directory $dir\n" if $verbose > 1;
+ $dir = '';
+ next;
+ }
+ warn "Resolving directory $dir\n" if $verbose;
+ if (!File::Spec->file_name_is_absolute($dir)) {
+ $dir = catdir($cwd,$dir);
+ }
+ }
+ @dirs = grep { length($_) } @dirs;
+ unshift(@dirs,''); # Check each $lib without additions first
+
+ LIB: foreach $lib (@libs) {
+ if (exists $libmap{$lib}) {
+ next unless length $libmap{$lib};
+ $lib = $libmap{$lib};
+ }
+
+ my(@variants,$variant,$cand);
+ my($ctype) = '';
+
+ # If we don't have a file type, consider it a possibly abbreviated name and
+ # check for common variants. We try these first to grab libraries before
+ # a like-named executable image (e.g. -lperl resolves to perlshr.exe
+ # before perl.exe).
+ if ($lib !~ /\.[^:>\]]*$/) {
+ push(@variants,"${lib}shr","${lib}rtl","${lib}lib");
+ push(@variants,"lib$lib") if $lib !~ /[:>\]]/;
+ }
+ push(@variants,$lib);
+ warn "Looking for $lib\n" if $verbose;
+ foreach $variant (@variants) {
+ my($fullname, $name);
+
+ foreach $dir (@dirs) {
+ my($type);
+
+ $name = "$dir$variant";
+ warn "\tChecking $name\n" if $verbose > 2;
+ $fullname = VMS::Filespec::rmsexpand($name);
+ if (defined $fullname and -f $fullname) {
+ # It's got its own suffix, so we'll have to figure out the type
+ if ($fullname =~ /(?:$so|exe)$/i) { $type = 'SHR'; }
+ elsif ($fullname =~ /(?:$lib_ext|olb)$/i) { $type = 'OLB'; }
+ elsif ($fullname =~ /(?:$obj_ext|obj)$/i) {
+ warn "Note (probably harmless): "
+ ."Plain object file $fullname found in library list\n";
+ $type = 'OBJ';
+ }
+ else {
+ warn "Note (probably harmless): "
+ ."Unknown library type for $fullname; assuming shared\n";
+ $type = 'SHR';
+ }
+ }
+ elsif (-f ($fullname = VMS::Filespec::rmsexpand($name,$so)) or
+ -f ($fullname = VMS::Filespec::rmsexpand($name,'.exe'))) {
+ $type = 'SHR';
+ $name = $fullname unless $fullname =~ /exe;?\d*$/i;
+ }
+ elsif (not length($ctype) and # If we've got a lib already,
+ # don't bother
+ ( -f ($fullname = VMS::Filespec::rmsexpand($name,$lib_ext)) or
+ -f ($fullname = VMS::Filespec::rmsexpand($name,'.olb')))) {
+ $type = 'OLB';
+ $name = $fullname unless $fullname =~ /olb;?\d*$/i;
+ }
+ elsif (not length($ctype) and # If we've got a lib already,
+ # don't bother
+ ( -f ($fullname = VMS::Filespec::rmsexpand($name,$obj_ext)) or
+ -f ($fullname = VMS::Filespec::rmsexpand($name,'.obj')))) {
+ warn "Note (probably harmless): "
+ ."Plain object file $fullname found in library list\n";
+ $type = 'OBJ';
+ $name = $fullname unless $fullname =~ /obj;?\d*$/i;
+ }
+ if (defined $type) {
+ $ctype = $type; $cand = $name;
+ last if $ctype eq 'SHR';
+ }
+ }
+ if ($ctype) {
+ # This has to precede any other CRTLs, so just make it first
+ if ($cand eq 'VAXCCURSE') { unshift @{$found{$ctype}}, $cand; }
+ else { push @{$found{$ctype}}, $cand; }
+ warn "\tFound as $cand (really $fullname), type $ctype\n"
+ if $verbose > 1;
+ push @flibs, $name unless $libs_seen{$fullname}++;
+ next LIB;
+ }
+ }
+ warn "Note (probably harmless): "
+ ."No library found for $lib\n";
+ }
+
+ push @fndlibs, @{$found{OBJ}} if exists $found{OBJ};
+ push @fndlibs, map { "$_/Library" } @{$found{OLB}} if exists $found{OLB};
+ push @fndlibs, map { "$_/Share" } @{$found{SHR}} if exists $found{SHR};
+ $lib = join(' ',@fndlibs);
+
+ $ldlib = $crtlstr ? "$lib $crtlstr" : $lib;
+ warn "Result:\n\tEXTRALIBS: $lib\n\tLDLOADLIBS: $ldlib\n" if $verbose;
+ wantarray ? ($lib, '', $ldlib, '', ($give_libs ? \@flibs : ())) : $lib;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows.pm
new file mode 100755
index 00000000000..f0b98dbaa30
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows.pm
@@ -0,0 +1,288 @@
+package ExtUtils::CBuilder::Platform::Windows;
+
+use strict;
+use warnings;
+
+use File::Basename;
+use File::Spec;
+
+use ExtUtils::CBuilder::Base;
+use IO::File;
+
+use vars qw($VERSION @ISA);
+$VERSION = '0.27';
+@ISA = qw(ExtUtils::CBuilder::Base);
+
+=begin comment
+
+The compiler-specific packages implement functions for generating properly
+formatted commandlines for the compiler being used. Each package
+defines two primary functions 'format_linker_cmd()' &
+'format_compiler_cmd()' that accepts a list of named arguments (a
+hash) and returns a list of formatted options suitable for invoking the
+compiler. By default, if the compiler supports scripting of its
+operation then a script file is built containing the options while
+those options are removed from the commandline, and a reference to the
+script is pushed onto the commandline in their place. Scripting the
+compiler in this way helps to avoid the problems associated with long
+commandlines under some shells.
+
+=end comment
+
+=cut
+
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new(@_);
+ my $cf = $self->{config};
+
+ # Inherit from an appropriate compiler driver class
+ my $driver = "ExtUtils::CBuilder::Platform::Windows::" . $self->_compiler_type;
+ eval "require $driver" or die "Could not load compiler driver: $@";
+ unshift @ISA, $driver;
+
+ return $self;
+}
+
+sub _compiler_type {
+ my $self = shift;
+ my $cc = $self->{config}{cc};
+
+ return ( $cc =~ /cl(\.exe)?$/ ? 'MSVC'
+ : $cc =~ /bcc32(\.exe)?$/ ? 'BCC'
+ : 'GCC');
+}
+
+sub split_like_shell {
+ # Since Windows will pass the whole command string (not an argument
+ # array) to the target program and make the program parse it itself,
+ # we don't actually need to do any processing here.
+ (my $self, local $_) = @_;
+
+ return @$_ if defined() && UNIVERSAL::isa($_, 'ARRAY');
+ return unless defined() && length();
+ return ($_);
+}
+
+sub do_system {
+ # See above
+ my $self = shift;
+ my $cmd = join(" ",
+ grep length,
+ map {$a=$_;$a=~s/\t/ /g;$a=~s/^\s+|\s+$//;$a}
+ grep defined, @_);
+ return $self->SUPER::do_system($cmd);
+}
+
+sub arg_defines {
+ my ($self, %args) = @_;
+ s/"/\\"/g foreach values %args;
+ return map qq{"-D$_=$args{$_}"}, keys %args;
+}
+
+sub compile {
+ my ($self, %args) = @_;
+ my $cf = $self->{config};
+
+ die "Missing 'source' argument to compile()" unless defined $args{source};
+
+ my ($basename, $srcdir) =
+ ( File::Basename::fileparse($args{source}, '\.[^.]+$') )[0,1];
+
+ $srcdir ||= File::Spec->curdir();
+
+ my @defines = $self->arg_defines( %{ $args{defines} || {} } );
+
+ my %spec = (
+ srcdir => $srcdir,
+ builddir => $srcdir,
+ basename => $basename,
+ source => $args{source},
+ output => File::Spec->catfile($srcdir, $basename) . $cf->{obj_ext},
+ cc => $cf->{cc},
+ cflags => [
+ $self->split_like_shell($cf->{ccflags}),
+ $self->split_like_shell($cf->{cccdlflags}),
+ $self->split_like_shell($args{extra_compiler_flags}),
+ ],
+ optimize => [ $self->split_like_shell($cf->{optimize}) ],
+ defines => \@defines,
+ includes => [ @{$args{include_dirs} || []} ],
+ perlinc => [
+ $self->perl_inc(),
+ $self->split_like_shell($cf->{incpath}),
+ ],
+ use_scripts => 1, # XXX provide user option to change this???
+ );
+
+ $self->normalize_filespecs(
+ \$spec{source},
+ \$spec{output},
+ $spec{includes},
+ $spec{perlinc},
+ );
+
+ my @cmds = $self->format_compiler_cmd(%spec);
+ while ( my $cmd = shift @cmds ) {
+ $self->do_system( @$cmd )
+ or die "error building $cf->{dlext} file from '$args{source}'";
+ }
+
+ (my $out = $spec{output}) =~ tr/'"//d;
+ return $out;
+}
+
+sub need_prelink { 1 }
+
+sub link {
+ my ($self, %args) = @_;
+ my $cf = $self->{config};
+
+ my @objects = ( ref $args{objects} eq 'ARRAY' ? @{$args{objects}} : $args{objects} );
+ my $to = join '', (File::Spec->splitpath($objects[0]))[0,1];
+ $to ||= File::Spec->curdir();
+
+ (my $file_base = $args{module_name}) =~ s/.*:://;
+ my $output = $args{lib_file} ||
+ File::Spec->catfile($to, "$file_base.$cf->{dlext}");
+
+ # if running in perl source tree, look for libs there, not installed
+ my $lddlflags = $cf->{lddlflags};
+ my $perl_src = $self->perl_src();
+ $lddlflags =~ s/\Q$cf->{archlibexp}\E[\\\/]CORE/$perl_src/ if $perl_src;
+
+ my %spec = (
+ srcdir => $to,
+ builddir => $to,
+ startup => [ ],
+ objects => \@objects,
+ libs => [ ],
+ output => $output,
+ ld => $cf->{ld},
+ libperl => $cf->{libperl},
+ perllibs => [ $self->split_like_shell($cf->{perllibs}) ],
+ libpath => [ $self->split_like_shell($cf->{libpth}) ],
+ lddlflags => [ $self->split_like_shell($lddlflags) ],
+ other_ldflags => [ $self->split_like_shell($args{extra_linker_flags} || '') ],
+ use_scripts => 1, # XXX provide user option to change this???
+ );
+
+ unless ( $spec{basename} ) {
+ ($spec{basename} = $args{module_name}) =~ s/.*:://;
+ }
+
+ $spec{srcdir} = File::Spec->canonpath( $spec{srcdir} );
+ $spec{builddir} = File::Spec->canonpath( $spec{builddir} );
+
+ $spec{output} ||= File::Spec->catfile( $spec{builddir},
+ $spec{basename} . '.'.$cf->{dlext} );
+ $spec{manifest} ||= File::Spec->catfile( $spec{builddir},
+ $spec{basename} . '.'.$cf->{dlext}.'.manifest');
+ $spec{implib} ||= File::Spec->catfile( $spec{builddir},
+ $spec{basename} . $cf->{lib_ext} );
+ $spec{explib} ||= File::Spec->catfile( $spec{builddir},
+ $spec{basename} . '.exp' );
+ if ($cf->{cc} eq 'cl') {
+ $spec{dbg_file} ||= File::Spec->catfile( $spec{builddir},
+ $spec{basename} . '.pdb' );
+ }
+ elsif ($cf->{cc} eq 'bcc32') {
+ $spec{dbg_file} ||= File::Spec->catfile( $spec{builddir},
+ $spec{basename} . '.tds' );
+ }
+ $spec{def_file} ||= File::Spec->catfile( $spec{srcdir} ,
+ $spec{basename} . '.def' );
+ $spec{base_file} ||= File::Spec->catfile( $spec{srcdir} ,
+ $spec{basename} . '.base' );
+
+ $self->add_to_cleanup(
+ grep defined,
+ @{[ @spec{qw(manifest implib explib dbg_file def_file base_file map_file)} ]}
+ );
+
+ foreach my $opt ( qw(output manifest implib explib dbg_file def_file map_file base_file) ) {
+ $self->normalize_filespecs( \$spec{$opt} );
+ }
+
+ foreach my $opt ( qw(libpath startup objects) ) {
+ $self->normalize_filespecs( $spec{$opt} );
+ }
+
+ (my $def_base = $spec{def_file}) =~ tr/'"//d;
+ $def_base =~ s/\.def$//;
+ $self->prelink( dl_name => $args{module_name},
+ dl_file => $def_base,
+ dl_base => $spec{basename} );
+
+ my @cmds = $self->format_linker_cmd(%spec);
+ while ( my $cmd = shift @cmds ) {
+ $self->do_system( @$cmd );
+ }
+
+ $spec{output} =~ tr/'"//d;
+ return wantarray
+ ? grep defined, @spec{qw[output manifest implib explib dbg_file def_file map_file base_file]}
+ : $spec{output};
+}
+
+# canonize & quote paths
+sub normalize_filespecs {
+ my ($self, @specs) = @_;
+ foreach my $spec ( grep defined, @specs ) {
+ if ( ref $spec eq 'ARRAY') {
+ $self->normalize_filespecs( map {\$_} grep defined, @$spec )
+ } elsif ( ref $spec eq 'SCALAR' ) {
+ $$spec =~ tr/"//d if $$spec;
+ next unless $$spec;
+ $$spec = '"' . File::Spec->canonpath($$spec) . '"';
+ } elsif ( ref $spec eq '' ) {
+ $spec = '"' . File::Spec->canonpath($spec) . '"';
+ } else {
+ die "Don't know how to normalize " . (ref $spec || $spec) . "\n";
+ }
+ }
+}
+
+# directory of perl's include files
+sub perl_inc {
+ my $self = shift;
+
+ my $perl_src = $self->perl_src();
+
+ if ($perl_src) {
+ File::Spec->catdir($perl_src, "lib", "CORE");
+ } else {
+ File::Spec->catdir($self->{config}{archlibexp},"CORE");
+ }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExtUtils::CBuilder::Platform::Windows - Builder class for Windows platforms
+
+=head1 DESCRIPTION
+
+This module implements the Windows-specific parts of ExtUtils::CBuilder.
+Most of the Windows-specific stuff has to do with compiling and
+linking C code. Currently we support the 3 compilers perl itself
+supports: MSVC, BCC, and GCC.
+
+This module inherits from C<ExtUtils::CBuilder::Base>, so any functionality
+not implemented here will be implemented there. The interfaces are
+defined by the L<ExtUtils::CBuilder> documentation.
+
+=head1 AUTHOR
+
+Ken Williams <ken@mathforum.org>
+
+Most of the code here was written by Randy W. Sims <RandyS@ThePierianSpring.org>.
+
+=head1 SEE ALSO
+
+perl(1), ExtUtils::CBuilder(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows/BCC.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows/BCC.pm
new file mode 100755
index 00000000000..ee65c91a159
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows/BCC.pm
@@ -0,0 +1,130 @@
+package ExtUtils::CBuilder::Platform::Windows::BCC;
+
+use vars qw($VERSION);
+$VERSION = '0.27';
+
+sub format_compiler_cmd {
+ my ($self, %spec) = @_;
+
+ foreach my $path ( @{ $spec{includes} || [] },
+ @{ $spec{perlinc} || [] } ) {
+ $path = '-I' . $path;
+ }
+
+ %spec = $self->write_compiler_script(%spec)
+ if $spec{use_scripts};
+
+ return [ grep {defined && length} (
+ $spec{cc}, '-c' ,
+ @{$spec{includes}} ,
+ @{$spec{cflags}} ,
+ @{$spec{optimize}} ,
+ @{$spec{defines}} ,
+ @{$spec{perlinc}} ,
+ "-o$spec{output}" ,
+ $spec{source} ,
+ ) ];
+}
+
+sub write_compiler_script {
+ my ($self, %spec) = @_;
+
+ my $script = File::Spec->catfile( $spec{srcdir},
+ $spec{basename} . '.ccs' );
+
+ $self->add_to_cleanup($script);
+
+ print "Generating script '$script'\n" if !$self->{quiet};
+
+ my $SCRIPT = IO::File->new( ">$script" )
+ or die( "Could not create script '$script': $!" );
+
+ # XXX Borland "response files" seem to be unable to accept macro
+ # definitions containing quoted strings. Escaping strings with
+ # backslash doesn't work, and any level of quotes are stripped. The
+ # result is is a floating point number in the source file where a
+ # string is expected. So we leave the macros on the command line.
+ print $SCRIPT join( "\n",
+ map { ref $_ ? @{$_} : $_ }
+ grep defined,
+ delete(
+ @spec{ qw(includes cflags optimize perlinc) } )
+ );
+
+ push @{$spec{includes}}, '@"' . $script . '"';
+
+ return %spec;
+}
+
+sub format_linker_cmd {
+ my ($self, %spec) = @_;
+
+ foreach my $path ( @{$spec{libpath}} ) {
+ $path = "-L$path";
+ }
+
+ push( @{$spec{startup}}, 'c0d32.obj' )
+ unless ( $spec{starup} && @{$spec{startup}} );
+
+ %spec = $self->write_linker_script(%spec)
+ if $spec{use_scripts};
+
+ return [ grep {defined && length} (
+ $spec{ld} ,
+ @{$spec{lddlflags}} ,
+ @{$spec{libpath}} ,
+ @{$spec{other_ldflags}} ,
+ @{$spec{startup}} ,
+ @{$spec{objects}} , ',',
+ $spec{output} , ',',
+ $spec{map_file} , ',',
+ $spec{libperl} ,
+ @{$spec{perllibs}} , ',',
+ $spec{def_file}
+ ) ];
+}
+
+sub write_linker_script {
+ my ($self, %spec) = @_;
+
+ # To work around Borlands "unique" commandline syntax,
+ # two scripts are used:
+
+ my $ld_script = File::Spec->catfile( $spec{srcdir},
+ $spec{basename} . '.lds' );
+ my $ld_libs = File::Spec->catfile( $spec{srcdir},
+ $spec{basename} . '.lbs' );
+
+ $self->add_to_cleanup($ld_script, $ld_libs);
+
+ print "Generating scripts '$ld_script' and '$ld_libs'.\n" if !$self->{quiet};
+
+ # Script 1: contains options & names of object files.
+ my $LD_SCRIPT = IO::File->new( ">$ld_script" )
+ or die( "Could not create linker script '$ld_script': $!" );
+
+ print $LD_SCRIPT join( " +\n",
+ map { @{$_} }
+ grep defined,
+ delete(
+ @spec{ qw(lddlflags libpath other_ldflags startup objects) } )
+ );
+
+ # Script 2: contains name of libs to link against.
+ my $LD_LIBS = IO::File->new( ">$ld_libs" )
+ or die( "Could not create linker script '$ld_libs': $!" );
+
+ print $LD_LIBS join( " +\n",
+ (delete $spec{libperl} || ''),
+ @{delete $spec{perllibs} || []},
+ );
+
+ push @{$spec{lddlflags}}, '@"' . $ld_script . '"';
+ push @{$spec{perllibs}}, '@"' . $ld_libs . '"';
+
+ return %spec;
+}
+
+1;
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows/GCC.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows/GCC.pm
new file mode 100755
index 00000000000..132bf842bdb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows/GCC.pm
@@ -0,0 +1,151 @@
+package ExtUtils::CBuilder::Platform::Windows::GCC;
+
+use vars qw($VERSION);
+$VERSION = '0.27';
+
+sub format_compiler_cmd {
+ my ($self, %spec) = @_;
+
+ foreach my $path ( @{ $spec{includes} || [] },
+ @{ $spec{perlinc} || [] } ) {
+ $path = '-I' . $path;
+ }
+
+ # split off any -arguments included in cc
+ my @cc = split / (?=-)/, $spec{cc};
+
+ return [ grep {defined && length} (
+ @cc, '-c' ,
+ @{$spec{includes}} ,
+ @{$spec{cflags}} ,
+ @{$spec{optimize}} ,
+ @{$spec{defines}} ,
+ @{$spec{perlinc}} ,
+ '-o', $spec{output} ,
+ $spec{source} ,
+ ) ];
+}
+
+sub format_linker_cmd {
+ my ($self, %spec) = @_;
+ my $cf = $self->{config};
+
+ # The Config.pm variable 'libperl' is hardcoded to the full name
+ # of the perl import library (i.e. 'libperl56.a'). GCC will not
+ # find it unless the 'lib' prefix & the extension are stripped.
+ $spec{libperl} =~ s/^(?:lib)?([^.]+).*$/-l$1/;
+
+ unshift( @{$spec{other_ldflags}}, '-nostartfiles' )
+ if ( $spec{startup} && @{$spec{startup}} );
+
+ # From ExtUtils::MM_Win32:
+ #
+ ## one thing for GCC/Mingw32:
+ ## we try to overcome non-relocateable-DLL problems by generating
+ ## a (hopefully unique) image-base from the dll's name
+ ## -- BKS, 10-19-1999
+ File::Basename::basename( $spec{output} ) =~ /(....)(.{0,4})/;
+ $spec{image_base} = sprintf( "0x%x0000", unpack('n', $1 ^ $2) );
+
+ %spec = $self->write_linker_script(%spec)
+ if $spec{use_scripts};
+
+ foreach my $path ( @{$spec{libpath}} ) {
+ $path = "-L$path";
+ }
+
+ my @cmds; # Stores the series of commands needed to build the module.
+
+ my $DLLTOOL = $cf->{dlltool} || 'dlltool';
+
+ push @cmds, [
+ $DLLTOOL, '--def' , $spec{def_file},
+ '--output-exp' , $spec{explib}
+ ];
+
+ # split off any -arguments included in ld
+ my @ld = split / (?=-)/, $spec{ld};
+
+ push @cmds, [ grep {defined && length} (
+ @ld ,
+ '-o', $spec{output} ,
+ "-Wl,--base-file,$spec{base_file}" ,
+ "-Wl,--image-base,$spec{image_base}" ,
+ @{$spec{lddlflags}} ,
+ @{$spec{libpath}} ,
+ @{$spec{startup}} ,
+ @{$spec{objects}} ,
+ @{$spec{other_ldflags}} ,
+ $spec{libperl} ,
+ @{$spec{perllibs}} ,
+ $spec{explib} ,
+ $spec{map_file} ? ('-Map', $spec{map_file}) : ''
+ ) ];
+
+ push @cmds, [
+ $DLLTOOL, '--def' , $spec{def_file},
+ '--output-exp' , $spec{explib},
+ '--base-file' , $spec{base_file}
+ ];
+
+ push @cmds, [ grep {defined && length} (
+ @ld ,
+ '-o', $spec{output} ,
+ "-Wl,--image-base,$spec{image_base}" ,
+ @{$spec{lddlflags}} ,
+ @{$spec{libpath}} ,
+ @{$spec{startup}} ,
+ @{$spec{objects}} ,
+ @{$spec{other_ldflags}} ,
+ $spec{libperl} ,
+ @{$spec{perllibs}} ,
+ $spec{explib} ,
+ $spec{map_file} ? ('-Map', $spec{map_file}) : ''
+ ) ];
+
+ return @cmds;
+}
+
+sub write_linker_script {
+ my ($self, %spec) = @_;
+
+ my $script = File::Spec->catfile( $spec{srcdir},
+ $spec{basename} . '.lds' );
+
+ $self->add_to_cleanup($script);
+
+ print "Generating script '$script'\n" if !$self->{quiet};
+
+ my $SCRIPT = IO::File->new( ">$script" )
+ or die( "Could not create script '$script': $!" );
+
+ print $SCRIPT ( 'SEARCH_DIR(' . $_ . ")\n" )
+ for @{delete $spec{libpath} || []};
+
+ # gcc takes only one startup file, so the first object in startup is
+ # specified as the startup file and any others are shifted into the
+ # beginning of the list of objects.
+ if ( $spec{startup} && @{$spec{startup}} ) {
+ print $SCRIPT 'STARTUP(' . shift( @{$spec{startup}} ) . ")\n";
+ unshift @{$spec{objects}},
+ @{delete $spec{startup} || []};
+ }
+
+ print $SCRIPT 'INPUT(' . join( ',',
+ @{delete $spec{objects} || []}
+ ) . ")\n";
+
+ print $SCRIPT 'INPUT(' . join( ' ',
+ (delete $spec{libperl} || ''),
+ @{delete $spec{perllibs} || []},
+ ) . ")\n";
+
+ #it is important to keep the order 1.linker_script - 2.other_ldflags
+ unshift @{$spec{other_ldflags}}, '"' . $script . '"';
+
+ return %spec;
+}
+
+1;
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows/MSVC.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows/MSVC.pm
new file mode 100755
index 00000000000..7da1c9b4c12
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/Windows/MSVC.pm
@@ -0,0 +1,131 @@
+package ExtUtils::CBuilder::Platform::Windows::MSVC;
+
+use vars qw($VERSION);
+$VERSION = '0.27';
+
+sub arg_exec_file {
+ my ($self, $file) = @_;
+ return "/OUT:$file";
+}
+
+sub format_compiler_cmd {
+ my ($self, %spec) = @_;
+
+ foreach my $path ( @{ $spec{includes} || [] },
+ @{ $spec{perlinc} || [] } ) {
+ $path = '-I' . $path;
+ }
+
+ %spec = $self->write_compiler_script(%spec)
+ if $spec{use_scripts};
+
+ return [ grep {defined && length} (
+ $spec{cc},'-nologo','-c',
+ @{$spec{includes}} ,
+ @{$spec{cflags}} ,
+ @{$spec{optimize}} ,
+ @{$spec{defines}} ,
+ @{$spec{perlinc}} ,
+ "-Fo$spec{output}" ,
+ $spec{source} ,
+ ) ];
+}
+
+sub write_compiler_script {
+ my ($self, %spec) = @_;
+
+ my $script = File::Spec->catfile( $spec{srcdir},
+ $spec{basename} . '.ccs' );
+
+ $self->add_to_cleanup($script);
+ print "Generating script '$script'\n" if !$self->{quiet};
+
+ my $SCRIPT = IO::File->new( ">$script" )
+ or die( "Could not create script '$script': $!" );
+
+ print $SCRIPT join( "\n",
+ map { ref $_ ? @{$_} : $_ }
+ grep defined,
+ delete(
+ @spec{ qw(includes cflags optimize defines perlinc) } )
+ );
+
+ push @{$spec{includes}}, '@"' . $script . '"';
+
+ return %spec;
+}
+
+sub format_linker_cmd {
+ my ($self, %spec) = @_;
+ my $cf = $self->{config};
+
+ foreach my $path ( @{$spec{libpath}} ) {
+ $path = "-libpath:$path";
+ }
+
+ my $output = $spec{output};
+
+ $spec{def_file} &&= '-def:' . $spec{def_file};
+ $spec{output} &&= '-out:' . $spec{output};
+ $spec{manifest} &&= '-manifest ' . $spec{manifest};
+ $spec{implib} &&= '-implib:' . $spec{implib};
+ $spec{map_file} &&= '-map:' . $spec{map_file};
+
+ %spec = $self->write_linker_script(%spec)
+ if $spec{use_scripts};
+
+ my @cmds; # Stores the series of commands needed to build the module.
+
+ push @cmds, [ grep {defined && length} (
+ $spec{ld} ,
+ @{$spec{lddlflags}} ,
+ @{$spec{libpath}} ,
+ @{$spec{other_ldflags}} ,
+ @{$spec{startup}} ,
+ @{$spec{objects}} ,
+ $spec{map_file} ,
+ $spec{libperl} ,
+ @{$spec{perllibs}} ,
+ $spec{def_file} ,
+ $spec{implib} ,
+ $spec{output} ,
+ ) ];
+
+ # Embed the manifest file if it exists
+ push @cmds, [
+ 'if', 'exist', $spec{manifest}, 'mt', '-nologo', $spec{manifest}, '-outputresource:' . "$output;2"
+ ];
+
+ return @cmds;
+}
+
+sub write_linker_script {
+ my ($self, %spec) = @_;
+
+ my $script = File::Spec->catfile( $spec{srcdir},
+ $spec{basename} . '.lds' );
+
+ $self->add_to_cleanup($script);
+
+ print "Generating script '$script'\n" if !$self->{quiet};
+
+ my $SCRIPT = IO::File->new( ">$script" )
+ or die( "Could not create script '$script': $!" );
+
+ print $SCRIPT join( "\n",
+ map { ref $_ ? @{$_} : $_ }
+ grep defined,
+ delete(
+ @spec{ qw(lddlflags libpath other_ldflags
+ startup objects libperl perllibs
+ def_file implib map_file) } )
+ );
+
+ push @{$spec{lddlflags}}, '@"' . $script . '"';
+
+ return %spec;
+}
+
+1;
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/aix.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/aix.pm
new file mode 100755
index 00000000000..656e0dc67ff
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/aix.pm
@@ -0,0 +1,31 @@
+package ExtUtils::CBuilder::Platform::aix;
+
+use strict;
+use ExtUtils::CBuilder::Platform::Unix;
+use File::Spec;
+
+use vars qw($VERSION @ISA);
+$VERSION = '0.27';
+@ISA = qw(ExtUtils::CBuilder::Platform::Unix);
+
+sub need_prelink { 1 }
+
+sub link {
+ my ($self, %args) = @_;
+ my $cf = $self->{config};
+
+ (my $baseext = $args{module_name}) =~ s/.*:://;
+ my $perl_inc = $self->perl_inc();
+
+ # Massage some very naughty bits in %Config
+ local $cf->{lddlflags} = $cf->{lddlflags};
+ for ($cf->{lddlflags}) {
+ s/\Q$(BASEEXT)\E/$baseext/;
+ s/\Q$(PERL_INC)\E/$perl_inc/;
+ }
+
+ return $self->SUPER::link(%args);
+}
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/cygwin.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/cygwin.pm
new file mode 100755
index 00000000000..f8650978ec4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/cygwin.pm
@@ -0,0 +1,33 @@
+package ExtUtils::CBuilder::Platform::cygwin;
+
+use strict;
+use File::Spec;
+use ExtUtils::CBuilder::Platform::Unix;
+
+use vars qw($VERSION @ISA);
+$VERSION = '0.27';
+@ISA = qw(ExtUtils::CBuilder::Platform::Unix);
+
+# TODO: If a specific exe_file name is requested, if the exe created
+# doesn't have that name, we might want to rename it. Apparently asking
+# for an exe of "foo" might result in "foo.exe". Alternatively, we should
+# make sure the return value is correctly "foo.exe".
+# C.f http://rt.cpan.org/Public/Bug/Display.html?id=41003
+sub link_executable {
+ my $self = shift;
+ return $self->SUPER::link_executable(@_);
+}
+
+sub link {
+ my ($self, %args) = @_;
+
+ my $lib = $self->{config}{useshrplib} ? 'libperl.dll.a' : 'libperl.a';
+ $args{extra_linker_flags} = [
+ File::Spec->catfile($self->perl_inc(), $lib),
+ $self->split_like_shell($args{extra_linker_flags})
+ ];
+
+ return $self->SUPER::link(%args);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/darwin.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/darwin.pm
new file mode 100755
index 00000000000..efc79347708
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/darwin.pm
@@ -0,0 +1,22 @@
+package ExtUtils::CBuilder::Platform::darwin;
+
+use strict;
+use ExtUtils::CBuilder::Platform::Unix;
+
+use vars qw($VERSION @ISA);
+$VERSION = '0.27';
+@ISA = qw(ExtUtils::CBuilder::Platform::Unix);
+
+sub compile {
+ my $self = shift;
+ my $cf = $self->{config};
+
+ # -flat_namespace isn't a compile flag, it's a linker flag. But
+ # it's mistakenly in Config.pm as both. Make the correction here.
+ local $cf->{ccflags} = $cf->{ccflags};
+ $cf->{ccflags} =~ s/-flat_namespace//;
+ $self->SUPER::compile(@_);
+}
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/dec_osf.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/dec_osf.pm
new file mode 100755
index 00000000000..d07b71f6d65
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/dec_osf.pm
@@ -0,0 +1,18 @@
+package ExtUtils::CBuilder::Platform::dec_osf;
+
+use strict;
+use ExtUtils::CBuilder::Platform::Unix;
+use File::Spec;
+
+use vars qw($VERSION @ISA);
+@ISA = qw(ExtUtils::CBuilder::Platform::Unix);
+$VERSION = '0.27';
+
+sub link_executable {
+ my $self = shift;
+ # $Config{ld} is 'ld' but that won't work: use the cc instead.
+ local $self->{config}{ld} = $self->{config}{cc};
+ return $self->SUPER::link_executable(@_);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/os2.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/os2.pm
new file mode 100755
index 00000000000..2815d587d7f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/CBuilder/Platform/os2.pm
@@ -0,0 +1,80 @@
+package ExtUtils::CBuilder::Platform::os2;
+
+use strict;
+use ExtUtils::CBuilder::Platform::Unix;
+
+use vars qw($VERSION @ISA);
+$VERSION = '0.27';
+@ISA = qw(ExtUtils::CBuilder::Platform::Unix);
+
+sub need_prelink { 1 }
+
+sub prelink {
+ # Generate import libraries (XXXX currently near .DEF; should be near DLL!)
+ my $self = shift;
+ my %args = @_;
+
+ my @res = $self->SUPER::prelink(%args);
+ die "Unexpected number of DEF files" unless @res == 1;
+ die "Can't find DEF file in the output"
+ unless $res[0] =~ m,^(.*)\.def$,si;
+ my $libname = "$1$self->{config}{lib_ext}"; # Put .LIB file near .DEF file
+ $self->do_system('emximp', '-o', $libname, $res[0]) or die "emxexp: res=$?";
+ return (@res, $libname);
+}
+
+sub _do_link {
+ my $self = shift;
+ my ($how, %args) = @_;
+ if ($how eq 'lib_file'
+ and (defined $args{module_name} and length $args{module_name})) {
+
+ # DynaLoader::mod2fname() is a builtin func
+ my $lib = DynaLoader::mod2fname([split /::/, $args{module_name}]);
+
+ # Now know the basename, find directory parts via lib_file, or objects
+ my $objs = ( (ref $args{objects}) ? $args{objects} : [$args{objects}] );
+ my $near_obj = $self->lib_file(@$objs);
+ my $ref_file = ( defined $args{lib_file} ? $args{lib_file} : $near_obj );
+ my $lib_dir = ($ref_file =~ m,(.*)[/\\],s ? "$1/" : '' );
+ my $exp_dir = ($near_obj =~ m,(.*)[/\\],s ? "$1/" : '' );
+
+ $args{dl_file} = $1 if $near_obj =~ m,(.*)\.,s; # put ExportList near OBJ
+ $args{lib_file} = "$lib_dir$lib.$self->{config}{dlext}"; # DLL file
+
+ # XXX _do_link does not have place to put libraries?
+ push @$objs, $self->perl_inc() . "/libperl$self->{config}{lib_ext}";
+ $args{objects} = $objs;
+ }
+ # Some 'env' do exec(), thus return too early when run from ksh;
+ # To avoid 'env', remove (useless) shrpenv
+ local $self->{config}{shrpenv} = '';
+ return $self->SUPER::_do_link($how, %args);
+}
+
+sub extra_link_args_after_prelink {
+ # Add .DEF file to the link line
+ my ($self, %args) = @_;
+
+ my @DEF = grep /\.def$/i, @{$args{prelink_res}};
+ die "More than one .def files created by `prelink' stage" if @DEF > 1;
+ # XXXX No "$how" argument here, so how to test for dynamic link?
+ die "No .def file created by `prelink' stage"
+ unless @DEF or not @{$args{prelink_res}};
+
+ my @after_libs = ($OS2::is_aout ? ()
+ : $self->perl_inc() . "/libperl_override$self->{config}{lib_ext}");
+ # , "-L", "-lperl"
+ (@after_libs, @DEF);
+}
+
+sub link_executable {
+ # ldflags is not expecting .exe extension given on command line; remove -Zexe
+ my $self = shift;
+ local $self->{config}{ldflags} = $self->{config}{ldflags};
+ $self->{config}{ldflags} =~ s/(?<!\S)-Zexe(?!\S)//;
+ return $self->SUPER::link_executable(@_);
+}
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Changes_EU-Install b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Changes_EU-Install
new file mode 100755
index 00000000000..55c60134f64
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Changes_EU-Install
@@ -0,0 +1,327 @@
+Revision history for ExtUtils-Install
+
+1.54
+
+This is a "no-change" version bump because I pushed the v1.53 change
+and then realized that MakeMaker.t was a bad name for a file that would
+end up in core where the EUMM tests and the EUI tests are in the same
+directory. This renames it to InstallWithMM.t.
+
+1.53
+
+Final stage of the divorce from EUMM. Now the EUMM related tests are no
+longer shared. Build.pl and Build.t go, and there shall be peace on earth.
+At least until somebody patches EUMM/t/basic.t for something EUI related...
+
+Thanks to M. Schwern for helping me work this one out. Cheers man.
+
+1.52_03
+
+Missed the t/Installed.t test from core. Bumped version number to allow
+a new distro to be released.
+
+1.52_02
+
+Make _chmod verbose message use octal modes, thanks to BDFOY
+
+Further changes from core, including lastest test file infrastructure
+from EUMM.
+
+Fixed a number of problems in ExtUtils::Installed, for various reasons
+this includes a version bump to 1.999_001, which will eventually become
+version 2.0. These problems related to finding modules that were installed
+with either INSTALL_BASE or PREFIX. Hopefully this resolves these issues.
+
+1.52_01 (core only release)
+
+Changes from Core:
+
+commit 3d55b451d9544fbd4c27c33287b76bee30328830
+Author: John Malmberg
+Date: Sun Feb 15 09:25:10 2009 -0600
+
+ ExtUtils::Install VMS extended character set support
+
+ Preview from https://rt.cpan.org/Ticket/Display.html?id=42149
+
+
+1.52
+
+Production rerelease of 1.51 to make the CPAN indexer happy about permissions
+(hopefully).
+
+SVN Revision 44.
+
+1.51
+
+Production release of 1.50_05. No other changes.
+
+SVN revision 43.
+
+1.50_05
+
+SVN revision 42.
+
+Fix broken test as reported by Craig Berry.
+
+1.50_04
+
+SVN revision 41.
+
+Restructure tests to make it easier to maintain given it is distributed in various
+ways in three different packages.
+
+1.50_03
+
+SVN revision 40.
+
+Sigh, just after i released 1.50_02 I noticed that a test modified in it will fail
+under VMS. So this is a fixup release for that alone.
+
+1.50_02
+
+SVN revision 39.
+
+Synchronize with the changes that were made in blead perl
+patch #33567. VMS changes by Craig Berry. See
+
+http://public.activestate.com/cgi-bin/perlbrowse/p/33567
+
+This was marked in the pod as 1.51 but not actually version bumped.
+
+So I've marked it as 1.50_02 as a test release prior to putting it out
+as the real 1.51
+
+This release also restores the missing installed.t which was accidentally
+missed by the MANIFEST having a duplicate entry for install.t instead.
+Probably something should have warned about this, but I haven't worked out
+what.
+
+Includes changes from Activestate/ActivePerl:
+
+- To make installation less chatty when not under verbose mode. See
+
+http://rt.cpan.org/Public/Bug/Display.html?id=5903
+
+- To install HTML documentation files under builds that set $Config{installhtmldir}
+(and presumably also create HTML versions of the pod -- which is quite nice actually :-)
+
+http://rt.cpan.org/Ticket/Display.html?id=37727
+
+1.50_01
+
+Version only released as part of bleadperl added in revision #33566.
+Cygwin related changes by Steve Hay, and others, see
+
+http://public.activestate.com/cgi-bin/perlbrowse/p/33566
+
+and discussion at
+
+http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2008-03/msg00056.html
+
+1.50
+
+Previous patches to _have_write_access() were causing problems
+on Cygwin. So now we skip using POSIX::access under cygwin.
+Also added some =pod directives to make my favorite editor
+highlight the pod properly.
+
+1.49
+
+Turns out that the new can_write_dir.t doesnt work properly under root
+as root can read the files regardless as to their mode. So we skip those
+tests when the effective UID is 0 indicating root.
+
+1.48
+
+We were getting N/A test results from CPAN testers due to the
+presence of Config in the prequisities list. This has been corrected.
+
+Also it was pointed out that EU_ALWAYS_COPY did not follow the naming
+convention of other ExtUtils::Install environment variables. It has
+been renamed EU_INSTALL_ALWAYS_COPY. Support remains for the original
+deprecated environment variable but it will be removed in 1.50.
+
+1.47
+
+Fix build process so a new META.YML is produced each time. Also
+add support for a new argument syntax to install() as well as
+support for always copying installed files even when the old
+file was identical. This is needed for some bundling mechanisms
+and can be activated by setting the environment variable EU_ALWAYS_COPY
+before the install process starts.
+
+Add a newer cleaner interface to install() to allow named parameters
+and easier external monitoring of what transpired.
+
+1.46 2008-03-01 12:42:35
+
+Apply patches from Michael G. Schwern (rt #33688, rt #31429, rt #31248)
+and from Slaven Rezic (rt #33290). Also implemented the suggestion from
+Schwern about not dieing when failing to remove a shadow file that is
+later on in INC than the installed version. (rt #2928)
+
+1.45 2008-02-27 13:55:27
+
+Fix rt.cpan.org #32813, use catpath() to attach volume name
+to dirs in _can_write_dir() when necessary to avoid cygwin
+builds doing a hostname lookup.
+
+1.44 2007-09-09 23:12:25
+
+by Schwern
+
+*** MAJOR BUG FIX ***
+
+install() would always try to uninstall different versions of the
+installed files when $uninstall_shadows was given whether it was true or false.
+This meant "make install" and "Build install" would both always try to uninstall
+differing versions of the modules. [rt.cpan.org 28672]
+
+1.43 2007-07-21 00:09:24
+
+Turns out some recent version, I haven't figured out which, causes
+ExtUtils::MakeMaker to fail test. The failure is actually bogus, EUMM
+is testing for output that we stopped producing except under verbose,
+however it is a pain, so this release fixes the problem. It also adds
+a new test file, a stripped down version of ExtUtils::MakeMakers
+t/basic.t.
+
+1.42 2007-07-20 22:43:04
+
+This is just 1.41_04 as a production release.
+
+1.41_04 2007-07-07 16:52:40
+
+Reorganize how things work in Install so that we don't try to create
+directories which exist but are not writable to us when they contain
+files which we want to install which are writable by us.
+http://rt.cpan.org/Public/Bug/Display.html?id=25627
+
+Also fix a VMS issue as recommended by Craig Berry.
+http://rt.cpan.org/Public/Bug/Display.html?id=22157
+
+1.41_03 2007-02-11 15:13
+
+Add an extra_libs parameter to ExtUtils::Installed->new() which allows
+one to specify additional libs to search for installed modules.
+
+Additional code cleanup and tweaks.
+
+1.41_02 2007-02-03 21:10
+
+Fix bug in _can_write_file().
+
+1.41_01 2007-02-02 21:03
+
+Integrated changes from
+
+1. Steffen Mueller: make ExtUtils::Installed respect PERL5LIB and allow
+overriding the current config and inc with something else.
+
+2. Michael Schwern (RT#21949, RT#21948): Fix use lib and installdirs
+and other EU::MakeMaker related changes.
+
+3. ActiveState (RT#5903): Reduce install verbosity.
+
+4. Craig Berry (RT#22157): Fix VMS related install failure.
+
+5. Ken Williams (RT#16225): Make fake uninstall actually fake.
+
+
+1.41 2006-07-02 16:09
+
+Integrated ExtUtils::Packlist changes from Nicholas Clark to allow for
+relocatable perls. Bumped version numbers on all files.
+
+1.40 2006-04-30 15:04
+
+Enhanced errorcatching and reporting. Fixed a problem with the INSTALL.SKIP
+file. Changed the Makefile.PL so that when installing it would not use the same
+stuff it was replacing. This doesn't affect building with Module::Build
+currently.
+
+Removed META.yml from distribution.
+
+1.39 2006-04-14 18:53
+
+- Fixed problem with the META.yml file being produced from a Win32 point of view.
+IMO this is an error/failing in the design of the META.yml process. META.yml should
+be created on the client side not on the distributor side. Now produces a
+platform agnostic (ie UNIXy) META.yml.
+
+- Reversed order of change file so newest entries go on top.
+
+
+1.38 2006-04-02 17:31
+
+- Removed MANIFEST.SKIP support (INSTALL.SKIP still supported), and
+added support for providing a fallback skip file by using
+ENV{EU_INSTALL_SITE_SKIP} as a fallback if there is not a distribution
+specific skip file.
+
+- Released under the ExtUtils-Install-1.38 Name
+
+
+1.3702 2006-03-19 16:54
+
+- Added support for skipping files during install based on a set of filter
+rules. If there is an INSTALL.SKIP in the current directory when doing an
+install then it is loaded, otherwise if there is a MANIFEST.SKIP then it is
+loaded. If neither exists then no filtration occurs. The env variable
+EU_INSTALL_IGNORE_SKIP may be set to a true value to override this behaviour.
+This means that you can make .svn directories be ignored on install.
+
+1.3701 2006-03-13 20:00
+
+- Integrated patch from Randy Sims.
+
+ 1. Fixes error during `perl Makefile.PL` because it MakeMaker can't
+ find the NAME section describing DISTNAME (which has the 'ex-'
+ prefix).
+
+ 2. Win32API::File is recommended on MSWin32 && cygwin.
+
+ 3. Under Perl5.005, ExtUtils::MM is not present in the version of
+ MakeMaker included. I don't know what version first includes it.
+ Needs research or better: eliminate need for it.
+
+ 4. Test::More is bundled with the distro for its test suite. This
+ would be needed on Perl5.005, for example. It was listed as a
+ requirement, but the directory it's bundled in is not in @INC when
+ prereqs are checked. I removed the prereq from Build.PL &
+ Makefile.PL. Other options: 1) fixup @INC to include t/lib; or 2)
+ unbundle and add back to prereqs.
+
+ 4. Update t/pod.t t/pod-coverage fixup of @INC so it can find
+ bundled Test::More.
+
+- Fixed pod/coverage related issues.
+
+- When trying to schedule a delete at reboot after renaming a dll out of
+the way no error occurs if Win32API::File isn't available. Instead it
+merely warns that the file should be hand deleted.
+
+- Fixed install at reboot behaviour by making sure the temporar file is
+writable after install (normally files installed are readonly)
+
+1.37 2006-03-12 23:20
+
+- Refactored reboot support. Integrated changes from Randy Sims
+in p5p message 4413F4E9.7090802@thepierianspring.org
+
+
+1.36 2006-03-11 12:42
+
+- Extended Win32 support. Added ExtUtils::Install::MUST_REBOOT to
+handle such scenario when rebooting.
+
+- Released as ex-ExtUtils-Install by demerphq
+
+1.35 Wed Feb 1 23:00:00 CST 2006
+
+ - First independent release; Extracted ExtUtils::Install,
+ ExtUtils::Installed, & ExtUtils::Packlist from MakeMaker.
+
+ - Changed the $VERSION of all modules to the same version number, a
+ number higher than all $VERSIONs.
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Command.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Command.pm
new file mode 100755
index 00000000000..b5632ff06d6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Command.pm
@@ -0,0 +1,369 @@
+package ExtUtils::Command;
+
+use 5.00503;
+use strict;
+use Carp;
+use File::Copy;
+use File::Compare;
+use File::Basename;
+use File::Path qw(rmtree);
+require Exporter;
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+@ISA = qw(Exporter);
+@EXPORT = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f test_d chmod
+ dos2unix);
+$VERSION = '1.16';
+
+my $Is_VMS = $^O eq 'VMS';
+my $Is_VMS_mode = $Is_VMS;
+my $Is_VMS_noefs = $Is_VMS;
+my $Is_Win32 = $^O eq 'MSWin32';
+
+if( $Is_VMS ) {
+ my $vms_unix_rpt;
+ my $vms_efs;
+ my $vms_case;
+
+ if (eval { local $SIG{__DIE__}; require VMS::Feature; }) {
+ $vms_unix_rpt = VMS::Feature::current("filename_unix_report");
+ $vms_efs = VMS::Feature::current("efs_charset");
+ $vms_case = VMS::Feature::current("efs_case_preserve");
+ } else {
+ my $unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
+ my $efs_charset = $ENV{'DECC$EFS_CHARSET'} || '';
+ my $efs_case = $ENV{'DECC$EFS_CASE_PRESERVE'} || '';
+ $vms_unix_rpt = $unix_rpt =~ /^[ET1]/i;
+ $vms_efs = $efs_charset =~ /^[ET1]/i;
+ $vms_case = $efs_case =~ /^[ET1]/i;
+ }
+ $Is_VMS_mode = 0 if $vms_unix_rpt;
+ $Is_VMS_noefs = 0 if ($vms_efs);
+}
+
+
+=head1 NAME
+
+ExtUtils::Command - utilities to replace common UNIX commands in Makefiles etc.
+
+=head1 SYNOPSIS
+
+ perl -MExtUtils::Command -e cat files... > destination
+ perl -MExtUtils::Command -e mv source... destination
+ perl -MExtUtils::Command -e cp source... destination
+ perl -MExtUtils::Command -e touch files...
+ perl -MExtUtils::Command -e rm_f files...
+ perl -MExtUtils::Command -e rm_rf directories...
+ perl -MExtUtils::Command -e mkpath directories...
+ perl -MExtUtils::Command -e eqtime source destination
+ perl -MExtUtils::Command -e test_f file
+ perl -MExtUtils::Command -e test_d directory
+ perl -MExtUtils::Command -e chmod mode files...
+ ...
+
+=head1 DESCRIPTION
+
+The module is used to replace common UNIX commands. In all cases the
+functions work from @ARGV rather than taking arguments. This makes
+them easier to deal with in Makefiles. Call them like this:
+
+ perl -MExtUtils::Command -e some_command some files to work on
+
+and I<NOT> like this:
+
+ perl -MExtUtils::Command -e 'some_command qw(some files to work on)'
+
+For that use L<Shell::Command>.
+
+Filenames with * and ? will be glob expanded.
+
+
+=head2 FUNCTIONS
+
+=over 4
+
+=cut
+
+# VMS uses % instead of ? to mean "one character"
+my $wild_regex = $Is_VMS ? '*%' : '*?';
+sub expand_wildcards
+{
+ @ARGV = map(/[$wild_regex]/o ? glob($_) : $_,@ARGV);
+}
+
+
+=item cat
+
+ cat file ...
+
+Concatenates all files mentioned on command line to STDOUT.
+
+=cut
+
+sub cat ()
+{
+ expand_wildcards();
+ print while (<>);
+}
+
+=item eqtime
+
+ eqtime source destination
+
+Sets modified time of destination to that of source.
+
+=cut
+
+sub eqtime
+{
+ my ($src,$dst) = @ARGV;
+ local @ARGV = ($dst); touch(); # in case $dst doesn't exist
+ utime((stat($src))[8,9],$dst);
+}
+
+=item rm_rf
+
+ rm_rf files or directories ...
+
+Removes files and directories - recursively (even if readonly)
+
+=cut
+
+sub rm_rf
+{
+ expand_wildcards();
+ rmtree([grep -e $_,@ARGV],0,0);
+}
+
+=item rm_f
+
+ rm_f file ...
+
+Removes files (even if readonly)
+
+=cut
+
+sub rm_f {
+ expand_wildcards();
+
+ foreach my $file (@ARGV) {
+ next unless -f $file;
+
+ next if _unlink($file);
+
+ chmod(0777, $file);
+
+ next if _unlink($file);
+
+ carp "Cannot delete $file: $!";
+ }
+}
+
+sub _unlink {
+ my $files_unlinked = 0;
+ foreach my $file (@_) {
+ my $delete_count = 0;
+ $delete_count++ while unlink $file;
+ $files_unlinked++ if $delete_count;
+ }
+ return $files_unlinked;
+}
+
+
+=item touch
+
+ touch file ...
+
+Makes files exist, with current timestamp
+
+=cut
+
+sub touch {
+ my $t = time;
+ expand_wildcards();
+ foreach my $file (@ARGV) {
+ open(FILE,">>$file") || die "Cannot write $file:$!";
+ close(FILE);
+ utime($t,$t,$file);
+ }
+}
+
+=item mv
+
+ mv source_file destination_file
+ mv source_file source_file destination_dir
+
+Moves source to destination. Multiple sources are allowed if
+destination is an existing directory.
+
+Returns true if all moves succeeded, false otherwise.
+
+=cut
+
+sub mv {
+ expand_wildcards();
+ my @src = @ARGV;
+ my $dst = pop @src;
+
+ croak("Too many arguments") if (@src > 1 && ! -d $dst);
+
+ my $nok = 0;
+ foreach my $src (@src) {
+ $nok ||= !move($src,$dst);
+ }
+ return !$nok;
+}
+
+=item cp
+
+ cp source_file destination_file
+ cp source_file source_file destination_dir
+
+Copies sources to the destination. Multiple sources are allowed if
+destination is an existing directory.
+
+Returns true if all copies succeeded, false otherwise.
+
+=cut
+
+sub cp {
+ expand_wildcards();
+ my @src = @ARGV;
+ my $dst = pop @src;
+
+ croak("Too many arguments") if (@src > 1 && ! -d $dst);
+
+ my $nok = 0;
+ foreach my $src (@src) {
+ $nok ||= !copy($src,$dst);
+
+ # Win32 does not update the mod time of a copied file, just the
+ # created time which make does not look at.
+ utime(time, time, $dst) if $Is_Win32;
+ }
+ return $nok;
+}
+
+=item chmod
+
+ chmod mode files ...
+
+Sets UNIX like permissions 'mode' on all the files. e.g. 0666
+
+=cut
+
+sub chmod {
+ local @ARGV = @ARGV;
+ my $mode = shift(@ARGV);
+ expand_wildcards();
+
+ if( $Is_VMS_mode && $Is_VMS_noefs) {
+ foreach my $idx (0..$#ARGV) {
+ my $path = $ARGV[$idx];
+ next unless -d $path;
+
+ # chmod 0777, [.foo.bar] doesn't work on VMS, you have to do
+ # chmod 0777, [.foo]bar.dir
+ my @dirs = File::Spec->splitdir( $path );
+ $dirs[-1] .= '.dir';
+ $path = File::Spec->catfile(@dirs);
+
+ $ARGV[$idx] = $path;
+ }
+ }
+
+ chmod(oct $mode,@ARGV) || die "Cannot chmod ".join(' ',$mode,@ARGV).":$!";
+}
+
+=item mkpath
+
+ mkpath directory ...
+
+Creates directories, including any parent directories.
+
+=cut
+
+sub mkpath
+{
+ expand_wildcards();
+ File::Path::mkpath([@ARGV],0,0777);
+}
+
+=item test_f
+
+ test_f file
+
+Tests if a file exists. I<Exits> with 0 if it does, 1 if it does not (ie.
+shell's idea of true and false).
+
+=cut
+
+sub test_f
+{
+ exit(-f $ARGV[0] ? 0 : 1);
+}
+
+=item test_d
+
+ test_d directory
+
+Tests if a directory exists. I<Exits> with 0 if it does, 1 if it does
+not (ie. shell's idea of true and false).
+
+=cut
+
+sub test_d
+{
+ exit(-d $ARGV[0] ? 0 : 1);
+}
+
+=item dos2unix
+
+ dos2unix files or dirs ...
+
+Converts DOS and OS/2 linefeeds to Unix style recursively.
+
+=cut
+
+sub dos2unix {
+ require File::Find;
+ File::Find::find(sub {
+ return if -d;
+ return unless -w _;
+ return unless -r _;
+ return if -B _;
+
+ local $\;
+
+ my $orig = $_;
+ my $temp = '.dos2unix_tmp';
+ open ORIG, $_ or do { warn "dos2unix can't open $_: $!"; return };
+ open TEMP, ">$temp" or
+ do { warn "dos2unix can't create .dos2unix_tmp: $!"; return };
+ while (my $line = <ORIG>) {
+ $line =~ s/\015\012/\012/g;
+ print TEMP $line;
+ }
+ close ORIG;
+ close TEMP;
+ rename $temp, $orig;
+
+ }, @ARGV);
+}
+
+=back
+
+=head1 SEE ALSO
+
+Shell::Command which is these same functions but take arguments normally.
+
+
+=head1 AUTHOR
+
+Nick Ing-Simmons C<ni-s@cpan.org>
+
+Maintained by Michael G Schwern C<schwern@pobox.com> within the
+ExtUtils-MakeMaker package and, as a separate CPAN package, by
+Randy Kobes C<r.kobes@uwinnipeg.ca>.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Command/MM.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Command/MM.pm
new file mode 100755
index 00000000000..f9b474de16f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Command/MM.pm
@@ -0,0 +1,275 @@
+package ExtUtils::Command::MM;
+
+require 5.006;
+
+use strict;
+use warnings;
+
+require Exporter;
+our @ISA = qw(Exporter);
+
+our @EXPORT = qw(test_harness pod2man perllocal_install uninstall
+ warn_if_old_packlist);
+our $VERSION = '6.56';
+
+my $Is_VMS = $^O eq 'VMS';
+
+
+=head1 NAME
+
+ExtUtils::Command::MM - Commands for the MM's to use in Makefiles
+
+=head1 SYNOPSIS
+
+ perl "-MExtUtils::Command::MM" -e "function" "--" arguments...
+
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY!> The interface is not stable.
+
+ExtUtils::Command::MM encapsulates code which would otherwise have to
+be done with large "one" liners.
+
+Any $(FOO) used in the examples are make variables, not Perl.
+
+=over 4
+
+=item B<test_harness>
+
+ test_harness($verbose, @test_libs);
+
+Runs the tests on @ARGV via Test::Harness passing through the $verbose
+flag. Any @test_libs will be unshifted onto the test's @INC.
+
+@test_libs are run in alphabetical order.
+
+=cut
+
+sub test_harness {
+ require Test::Harness;
+ require File::Spec;
+
+ $Test::Harness::verbose = shift;
+
+ # Because Windows doesn't do this for us and listing all the *.t files
+ # out on the command line can blow over its exec limit.
+ require ExtUtils::Command;
+ my @argv = ExtUtils::Command::expand_wildcards(@ARGV);
+
+ local @INC = @INC;
+ unshift @INC, map { File::Spec->rel2abs($_) } @_;
+ Test::Harness::runtests(sort { lc $a cmp lc $b } @argv);
+}
+
+
+
+=item B<pod2man>
+
+ pod2man( '--option=value',
+ $podfile1 => $manpage1,
+ $podfile2 => $manpage2,
+ ...
+ );
+
+ # or args on @ARGV
+
+pod2man() is a function performing most of the duties of the pod2man
+program. Its arguments are exactly the same as pod2man as of 5.8.0
+with the addition of:
+
+ --perm_rw octal permission to set the resulting manpage to
+
+And the removal of:
+
+ --verbose/-v
+ --help/-h
+
+If no arguments are given to pod2man it will read from @ARGV.
+
+If Pod::Man is unavailable, this function will warn and return undef.
+
+=cut
+
+sub pod2man {
+ local @ARGV = @_ ? @_ : @ARGV;
+
+ {
+ local $@;
+ if( !eval { require Pod::Man } ) {
+ warn "Pod::Man is not available: $@".
+ "Man pages will not be generated during this install.\n";
+ return undef;
+ }
+ }
+ require Getopt::Long;
+
+ # We will cheat and just use Getopt::Long. We fool it by putting
+ # our arguments into @ARGV. Should be safe.
+ my %options = ();
+ Getopt::Long::config ('bundling_override');
+ Getopt::Long::GetOptions (\%options,
+ 'section|s=s', 'release|r=s', 'center|c=s',
+ 'date|d=s', 'fixed=s', 'fixedbold=s', 'fixeditalic=s',
+ 'fixedbolditalic=s', 'official|o', 'quotes|q=s', 'lax|l',
+ 'name|n=s', 'perm_rw=i'
+ );
+
+ # If there's no files, don't bother going further.
+ return 0 unless @ARGV;
+
+ # Official sets --center, but don't override things explicitly set.
+ if ($options{official} && !defined $options{center}) {
+ $options{center} = q[Perl Programmer's Reference Guide];
+ }
+
+ # This isn't a valid Pod::Man option and is only accepted for backwards
+ # compatibility.
+ delete $options{lax};
+
+ do {{ # so 'next' works
+ my ($pod, $man) = splice(@ARGV, 0, 2);
+
+ next if ((-e $man) &&
+ (-M $man < -M $pod) &&
+ (-M $man < -M "Makefile"));
+
+ print "Manifying $man\n";
+
+ my $parser = Pod::Man->new(%options);
+ $parser->parse_from_file($pod, $man)
+ or do { warn("Could not install $man\n"); next };
+
+ if (exists $options{perm_rw}) {
+ chmod(oct($options{perm_rw}), $man)
+ or do { warn("chmod $options{perm_rw} $man: $!\n"); next };
+ }
+ }} while @ARGV;
+
+ return 1;
+}
+
+
+=item B<warn_if_old_packlist>
+
+ perl "-MExtUtils::Command::MM" -e warn_if_old_packlist <somefile>
+
+Displays a warning that an old packlist file was found. Reads the
+filename from @ARGV.
+
+=cut
+
+sub warn_if_old_packlist {
+ my $packlist = $ARGV[0];
+
+ return unless -f $packlist;
+ print <<"PACKLIST_WARNING";
+WARNING: I have found an old package in
+ $packlist.
+Please make sure the two installations are not conflicting
+PACKLIST_WARNING
+
+}
+
+
+=item B<perllocal_install>
+
+ perl "-MExtUtils::Command::MM" -e perllocal_install
+ <type> <module name> <key> <value> ...
+
+ # VMS only, key|value pairs come on STDIN
+ perl "-MExtUtils::Command::MM" -e perllocal_install
+ <type> <module name> < <key>|<value> ...
+
+Prints a fragment of POD suitable for appending to perllocal.pod.
+Arguments are read from @ARGV.
+
+'type' is the type of what you're installing. Usually 'Module'.
+
+'module name' is simply the name of your module. (Foo::Bar)
+
+Key/value pairs are extra information about the module. Fields include:
+
+ installed into which directory your module was out into
+ LINKTYPE dynamic or static linking
+ VERSION module version number
+ EXE_FILES any executables installed in a space seperated
+ list
+
+=cut
+
+sub perllocal_install {
+ my($type, $name) = splice(@ARGV, 0, 2);
+
+ # VMS feeds args as a piped file on STDIN since it usually can't
+ # fit all the args on a single command line.
+ my @mod_info = $Is_VMS ? split /\|/, <STDIN>
+ : @ARGV;
+
+ my $pod;
+ $pod = sprintf <<POD, scalar localtime;
+ =head2 %s: C<$type> L<$name|$name>
+
+ =over 4
+
+POD
+
+ do {
+ my($key, $val) = splice(@mod_info, 0, 2);
+
+ $pod .= <<POD
+ =item *
+
+ C<$key: $val>
+
+POD
+
+ } while(@mod_info);
+
+ $pod .= "=back\n\n";
+ $pod =~ s/^ //mg;
+ print $pod;
+
+ return 1;
+}
+
+=item B<uninstall>
+
+ perl "-MExtUtils::Command::MM" -e uninstall <packlist>
+
+A wrapper around ExtUtils::Install::uninstall(). Warns that
+uninstallation is deprecated and doesn't actually perform the
+uninstallation.
+
+=cut
+
+sub uninstall {
+ my($packlist) = shift @ARGV;
+
+ require ExtUtils::Install;
+
+ print <<'WARNING';
+
+Uninstall is unsafe and deprecated, the uninstallation was not performed.
+We will show what would have been done.
+
+WARNING
+
+ ExtUtils::Install::uninstall($packlist, 1, 1);
+
+ print <<'WARNING';
+
+Uninstall is unsafe and deprecated, the uninstallation was not performed.
+Please check the list above carefully, there may be errors.
+Remove the appropriate files manually.
+Sorry for the inconvenience.
+
+WARNING
+
+}
+
+=back
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant.pm
new file mode 100755
index 00000000000..0a20b89b792
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant.pm
@@ -0,0 +1,565 @@
+package ExtUtils::Constant;
+use vars qw (@ISA $VERSION @EXPORT_OK %EXPORT_TAGS);
+$VERSION = 0.22;
+
+=head1 NAME
+
+ExtUtils::Constant - generate XS code to import C header constants
+
+=head1 SYNOPSIS
+
+ use ExtUtils::Constant qw (WriteConstants);
+ WriteConstants(
+ NAME => 'Foo',
+ NAMES => [qw(FOO BAR BAZ)],
+ );
+ # Generates wrapper code to make the values of the constants FOO BAR BAZ
+ # available to perl
+
+=head1 DESCRIPTION
+
+ExtUtils::Constant facilitates generating C and XS wrapper code to allow
+perl modules to AUTOLOAD constants defined in C library header files.
+It is principally used by the C<h2xs> utility, on which this code is based.
+It doesn't contain the routines to scan header files to extract these
+constants.
+
+=head1 USAGE
+
+Generally one only needs to call the C<WriteConstants> function, and then
+
+ #include "const-c.inc"
+
+in the C section of C<Foo.xs>
+
+ INCLUDE: const-xs.inc
+
+in the XS section of C<Foo.xs>.
+
+For greater flexibility use C<constant_types()>, C<C_constant> and
+C<XS_constant>, with which C<WriteConstants> is implemented.
+
+Currently this module understands the following types. h2xs may only know
+a subset. The sizes of the numeric types are chosen by the C<Configure>
+script at compile time.
+
+=over 4
+
+=item IV
+
+signed integer, at least 32 bits.
+
+=item UV
+
+unsigned integer, the same size as I<IV>
+
+=item NV
+
+floating point type, probably C<double>, possibly C<long double>
+
+=item PV
+
+NUL terminated string, length will be determined with C<strlen>
+
+=item PVN
+
+A fixed length thing, given as a [pointer, length] pair. If you know the
+length of a string at compile time you may use this instead of I<PV>
+
+=item SV
+
+A B<mortal> SV.
+
+=item YES
+
+Truth. (C<PL_sv_yes>) The value is not needed (and ignored).
+
+=item NO
+
+Defined Falsehood. (C<PL_sv_no>) The value is not needed (and ignored).
+
+=item UNDEF
+
+C<undef>. The value of the macro is not needed.
+
+=back
+
+=head1 FUNCTIONS
+
+=over 4
+
+=cut
+
+if ($] >= 5.006) {
+ eval "use warnings; 1" or die $@;
+}
+use strict;
+use Carp qw(croak cluck);
+
+use Exporter;
+use ExtUtils::Constant::Utils qw(C_stringify);
+use ExtUtils::Constant::XS qw(%XS_Constant %XS_TypeSet);
+
+@ISA = 'Exporter';
+
+%EXPORT_TAGS = ( 'all' => [ qw(
+ XS_constant constant_types return_clause memEQ_clause C_stringify
+ C_constant autoload WriteConstants WriteMakefileSnippet
+) ] );
+
+@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
+
+=item constant_types
+
+A function returning a single scalar with C<#define> definitions for the
+constants used internally between the generated C and XS functions.
+
+=cut
+
+sub constant_types {
+ ExtUtils::Constant::XS->header();
+}
+
+sub memEQ_clause {
+ cluck "ExtUtils::Constant::memEQ_clause is deprecated";
+ ExtUtils::Constant::XS->memEQ_clause({name=>$_[0], checked_at=>$_[1],
+ indent=>$_[2]});
+}
+
+sub return_clause ($$) {
+ cluck "ExtUtils::Constant::return_clause is deprecated";
+ my $indent = shift;
+ ExtUtils::Constant::XS->return_clause({indent=>$indent}, @_);
+}
+
+sub switch_clause {
+ cluck "ExtUtils::Constant::switch_clause is deprecated";
+ my $indent = shift;
+ my $comment = shift;
+ ExtUtils::Constant::XS->switch_clause({indent=>$indent, comment=>$comment},
+ @_);
+}
+
+sub C_constant {
+ my ($package, $subname, $default_type, $what, $indent, $breakout, @items)
+ = @_;
+ ExtUtils::Constant::XS->C_constant({package => $package, subname => $subname,
+ default_type => $default_type,
+ types => $what, indent => $indent,
+ breakout => $breakout}, @items);
+}
+
+=item XS_constant PACKAGE, TYPES, XS_SUBNAME, C_SUBNAME
+
+A function to generate the XS code to implement the perl subroutine
+I<PACKAGE>::constant used by I<PACKAGE>::AUTOLOAD to load constants.
+This XS code is a wrapper around a C subroutine usually generated by
+C<C_constant>, and usually named C<constant>.
+
+I<TYPES> should be given either as a comma separated list of types that the
+C subroutine C<constant> will generate or as a reference to a hash. It should
+be the same list of types as C<C_constant> was given.
+[Otherwise C<XS_constant> and C<C_constant> may have different ideas about
+the number of parameters passed to the C function C<constant>]
+
+You can call the perl visible subroutine something other than C<constant> if
+you give the parameter I<XS_SUBNAME>. The C subroutine it calls defaults to
+the name of the perl visible subroutine, unless you give the parameter
+I<C_SUBNAME>.
+
+=cut
+
+sub XS_constant {
+ my $package = shift;
+ my $what = shift;
+ my $XS_subname = shift;
+ my $C_subname = shift;
+ $XS_subname ||= 'constant';
+ $C_subname ||= $XS_subname;
+
+ if (!ref $what) {
+ # Convert line of the form IV,UV,NV to hash
+ $what = {map {$_ => 1} split /,\s*/, ($what)};
+ }
+ my $params = ExtUtils::Constant::XS->params ($what);
+ my $type;
+
+ my $xs = <<"EOT";
+void
+$XS_subname(sv)
+ PREINIT:
+#ifdef dXSTARG
+ dXSTARG; /* Faster if we have it. */
+#else
+ dTARGET;
+#endif
+ STRLEN len;
+ int type;
+EOT
+
+ if ($params->{IV}) {
+ $xs .= " IV iv;\n";
+ } else {
+ $xs .= " /* IV\t\tiv;\tUncomment this if you need to return IVs */\n";
+ }
+ if ($params->{NV}) {
+ $xs .= " NV nv;\n";
+ } else {
+ $xs .= " /* NV\t\tnv;\tUncomment this if you need to return NVs */\n";
+ }
+ if ($params->{PV}) {
+ $xs .= " const char *pv;\n";
+ } else {
+ $xs .=
+ " /* const char\t*pv;\tUncomment this if you need to return PVs */\n";
+ }
+
+ $xs .= << 'EOT';
+ INPUT:
+ SV * sv;
+ const char * s = SvPV(sv, len);
+EOT
+ if ($params->{''}) {
+ $xs .= << 'EOT';
+ INPUT:
+ int utf8 = SvUTF8(sv);
+EOT
+ }
+ $xs .= << 'EOT';
+ PPCODE:
+EOT
+
+ if ($params->{IV} xor $params->{NV}) {
+ $xs .= << "EOT";
+ /* Change this to $C_subname(aTHX_ s, len, &iv, &nv);
+ if you need to return both NVs and IVs */
+EOT
+ }
+ $xs .= " type = $C_subname(aTHX_ s, len";
+ $xs .= ', utf8' if $params->{''};
+ $xs .= ', &iv' if $params->{IV};
+ $xs .= ', &nv' if $params->{NV};
+ $xs .= ', &pv' if $params->{PV};
+ $xs .= ', &sv' if $params->{SV};
+ $xs .= ");\n";
+
+ # If anyone is insane enough to suggest a package name containing %
+ my $package_sprintf_safe = $package;
+ $package_sprintf_safe =~ s/%/%%/g;
+
+ $xs .= << "EOT";
+ /* Return 1 or 2 items. First is error message, or undef if no error.
+ Second, if present, is found value */
+ switch (type) {
+ case PERL_constant_NOTFOUND:
+ sv =
+ sv_2mortal(newSVpvf("%s is not a valid $package_sprintf_safe macro", s));
+ PUSHs(sv);
+ break;
+ case PERL_constant_NOTDEF:
+ sv = sv_2mortal(newSVpvf(
+ "Your vendor has not defined $package_sprintf_safe macro %s, used",
+ s));
+ PUSHs(sv);
+ break;
+EOT
+
+ foreach $type (sort keys %XS_Constant) {
+ # '' marks utf8 flag needed.
+ next if $type eq '';
+ $xs .= "\t/* Uncomment this if you need to return ${type}s\n"
+ unless $what->{$type};
+ $xs .= " case PERL_constant_IS$type:\n";
+ if (length $XS_Constant{$type}) {
+ $xs .= << "EOT";
+ EXTEND(SP, 1);
+ PUSHs(&PL_sv_undef);
+ $XS_Constant{$type};
+EOT
+ } else {
+ # Do nothing. return (), which will be correctly interpreted as
+ # (undef, undef)
+ }
+ $xs .= " break;\n";
+ unless ($what->{$type}) {
+ chop $xs; # Yes, another need for chop not chomp.
+ $xs .= " */\n";
+ }
+ }
+ $xs .= << "EOT";
+ default:
+ sv = sv_2mortal(newSVpvf(
+ "Unexpected return type %d while processing $package_sprintf_safe macro %s, used",
+ type, s));
+ PUSHs(sv);
+ }
+EOT
+
+ return $xs;
+}
+
+
+=item autoload PACKAGE, VERSION, AUTOLOADER
+
+A function to generate the AUTOLOAD subroutine for the module I<PACKAGE>
+I<VERSION> is the perl version the code should be backwards compatible with.
+It defaults to the version of perl running the subroutine. If I<AUTOLOADER>
+is true, the AUTOLOAD subroutine falls back on AutoLoader::AUTOLOAD for all
+names that the constant() routine doesn't recognise.
+
+=cut
+
+# ' # Grr. syntax highlighters that don't grok pod.
+
+sub autoload {
+ my ($module, $compat_version, $autoloader) = @_;
+ $compat_version ||= $];
+ croak "Can't maintain compatibility back as far as version $compat_version"
+ if $compat_version < 5;
+ my $func = "sub AUTOLOAD {\n"
+ . " # This AUTOLOAD is used to 'autoload' constants from the constant()\n"
+ . " # XS function.";
+ $func .= " If a constant is not found then control is passed\n"
+ . " # to the AUTOLOAD in AutoLoader." if $autoloader;
+
+
+ $func .= "\n\n"
+ . " my \$constname;\n";
+ $func .=
+ " our \$AUTOLOAD;\n" if ($compat_version >= 5.006);
+
+ $func .= <<"EOT";
+ (\$constname = \$AUTOLOAD) =~ s/.*:://;
+ croak "&${module}::constant not defined" if \$constname eq 'constant';
+ my (\$error, \$val) = constant(\$constname);
+EOT
+
+ if ($autoloader) {
+ $func .= <<'EOT';
+ if ($error) {
+ if ($error =~ /is not a valid/) {
+ $AutoLoader::AUTOLOAD = $AUTOLOAD;
+ goto &AutoLoader::AUTOLOAD;
+ } else {
+ croak $error;
+ }
+ }
+EOT
+ } else {
+ $func .=
+ " if (\$error) { croak \$error; }\n";
+ }
+
+ $func .= <<'END';
+ {
+ no strict 'refs';
+ # Fixed between 5.005_53 and 5.005_61
+#XXX if ($] >= 5.00561) {
+#XXX *$AUTOLOAD = sub () { $val };
+#XXX }
+#XXX else {
+ *$AUTOLOAD = sub { $val };
+#XXX }
+ }
+ goto &$AUTOLOAD;
+}
+
+END
+
+ return $func;
+}
+
+
+=item WriteMakefileSnippet
+
+WriteMakefileSnippet ATTRIBUTE =E<gt> VALUE [, ...]
+
+A function to generate perl code for Makefile.PL that will regenerate
+the constant subroutines. Parameters are named as passed to C<WriteConstants>,
+with the addition of C<INDENT> to specify the number of leading spaces
+(default 2).
+
+Currently only C<INDENT>, C<NAME>, C<DEFAULT_TYPE>, C<NAMES>, C<C_FILE> and
+C<XS_FILE> are recognised.
+
+=cut
+
+sub WriteMakefileSnippet {
+ my %args = @_;
+ my $indent = $args{INDENT} || 2;
+
+ my $result = <<"EOT";
+ExtUtils::Constant::WriteConstants(
+ NAME => '$args{NAME}',
+ NAMES => \\\@names,
+ DEFAULT_TYPE => '$args{DEFAULT_TYPE}',
+EOT
+ foreach (qw (C_FILE XS_FILE)) {
+ next unless exists $args{$_};
+ $result .= sprintf " %-12s => '%s',\n",
+ $_, $args{$_};
+ }
+ $result .= <<'EOT';
+ );
+EOT
+
+ $result =~ s/^/' 'x$indent/gem;
+ return ExtUtils::Constant::XS->dump_names({default_type=>$args{DEFAULT_TYPE},
+ indent=>$indent,},
+ @{$args{NAMES}})
+ . $result;
+}
+
+=item WriteConstants ATTRIBUTE =E<gt> VALUE [, ...]
+
+Writes a file of C code and a file of XS code which you should C<#include>
+and C<INCLUDE> in the C and XS sections respectively of your module's XS
+code. You probably want to do this in your C<Makefile.PL>, so that you can
+easily edit the list of constants without touching the rest of your module.
+The attributes supported are
+
+=over 4
+
+=item NAME
+
+Name of the module. This must be specified
+
+=item DEFAULT_TYPE
+
+The default type for the constants. If not specified C<IV> is assumed.
+
+=item BREAKOUT_AT
+
+The names of the constants are grouped by length. Generate child subroutines
+for each group with this number or more names in.
+
+=item NAMES
+
+An array of constants' names, either scalars containing names, or hashrefs
+as detailed in L<"C_constant">.
+
+=item PROXYSUBS
+
+If true, uses proxy subs. See L<ExtUtils::Constant::ProxySubs>.
+
+=item C_FH
+
+A filehandle to write the C code to. If not given, then I<C_FILE> is opened
+for writing.
+
+=item C_FILE
+
+The name of the file to write containing the C code. The default is
+C<const-c.inc>. The C<-> in the name ensures that the file can't be
+mistaken for anything related to a legitimate perl package name, and
+not naming the file C<.c> avoids having to override Makefile.PL's
+C<.xs> to C<.c> rules.
+
+=item XS_FH
+
+A filehandle to write the XS code to. If not given, then I<XS_FILE> is opened
+for writing.
+
+=item XS_FILE
+
+The name of the file to write containing the XS code. The default is
+C<const-xs.inc>.
+
+=item XS_SUBNAME
+
+The perl visible name of the XS subroutine generated which will return the
+constants. The default is C<constant>.
+
+=item C_SUBNAME
+
+The name of the C subroutine generated which will return the constants.
+The default is I<XS_SUBNAME>. Child subroutines have C<_> and the name
+length appended, so constants with 10 character names would be in
+C<constant_10> with the default I<XS_SUBNAME>.
+
+=back
+
+=cut
+
+sub WriteConstants {
+ my %ARGS =
+ ( # defaults
+ C_FILE => 'const-c.inc',
+ XS_FILE => 'const-xs.inc',
+ XS_SUBNAME => 'constant',
+ DEFAULT_TYPE => 'IV',
+ @_);
+
+ $ARGS{C_SUBNAME} ||= $ARGS{XS_SUBNAME}; # No-one sane will have C_SUBNAME eq '0'
+
+ croak "Module name not specified" unless length $ARGS{NAME};
+
+ my $c_fh = $ARGS{C_FH};
+ if (!$c_fh) {
+ if ($] <= 5.008) {
+ # We need these little games, rather than doing things
+ # unconditionally, because we're used in core Makefile.PLs before
+ # IO is available (needed by filehandle), but also we want to work on
+ # older perls where undefined scalars do not automatically turn into
+ # anonymous file handles.
+ require FileHandle;
+ $c_fh = FileHandle->new();
+ }
+ open $c_fh, ">$ARGS{C_FILE}" or die "Can't open $ARGS{C_FILE}: $!";
+ }
+
+ my $xs_fh = $ARGS{XS_FH};
+ if (!$xs_fh) {
+ if ($] <= 5.008) {
+ require FileHandle;
+ $xs_fh = FileHandle->new();
+ }
+ open $xs_fh, ">$ARGS{XS_FILE}" or die "Can't open $ARGS{XS_FILE}: $!";
+ }
+
+ # As this subroutine is intended to make code that isn't edited, there's no
+ # need for the user to specify any types that aren't found in the list of
+ # names.
+
+ if ($ARGS{PROXYSUBS}) {
+ require ExtUtils::Constant::ProxySubs;
+ $ARGS{C_FH} = $c_fh;
+ $ARGS{XS_FH} = $xs_fh;
+ ExtUtils::Constant::ProxySubs->WriteConstants(%ARGS);
+ } else {
+ my $types = {};
+
+ print $c_fh constant_types(); # macro defs
+ print $c_fh "\n";
+
+ # indent is still undef. Until anyone implements indent style rules with
+ # it.
+ foreach (ExtUtils::Constant::XS->C_constant({package => $ARGS{NAME},
+ subname => $ARGS{C_SUBNAME},
+ default_type =>
+ $ARGS{DEFAULT_TYPE},
+ types => $types,
+ breakout =>
+ $ARGS{BREAKOUT_AT}},
+ @{$ARGS{NAMES}})) {
+ print $c_fh $_, "\n"; # C constant subs
+ }
+ print $xs_fh XS_constant ($ARGS{NAME}, $types, $ARGS{XS_SUBNAME},
+ $ARGS{C_SUBNAME});
+ }
+
+ close $c_fh or warn "Error closing $ARGS{C_FILE}: $!" unless $ARGS{C_FH};
+ close $xs_fh or warn "Error closing $ARGS{XS_FILE}: $!" unless $ARGS{XS_FH};
+}
+
+1;
+__END__
+
+=back
+
+=head1 AUTHOR
+
+Nicholas Clark <nick@ccl4.org> based on the code in C<h2xs> by Larry Wall and
+others
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant/Base.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant/Base.pm
new file mode 100755
index 00000000000..b5b79af1ea7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant/Base.pm
@@ -0,0 +1,1006 @@
+package ExtUtils::Constant::Base;
+
+use strict;
+use vars qw($VERSION);
+use Carp;
+use Text::Wrap;
+use ExtUtils::Constant::Utils qw(C_stringify perl_stringify);
+$VERSION = '0.04';
+
+use constant is_perl56 => ($] < 5.007 && $] > 5.005_50);
+
+
+=head1 NAME
+
+ExtUtils::Constant::Base - base class for ExtUtils::Constant objects
+
+=head1 SYNOPSIS
+
+ require ExtUtils::Constant::Base;
+ @ISA = 'ExtUtils::Constant::Base';
+
+=head1 DESCRIPTION
+
+ExtUtils::Constant::Base provides a base implementation of methods to
+generate C code to give fast constant value lookup by named string. Currently
+it's mostly used ExtUtils::Constant::XS, which generates the lookup code
+for the constant() subroutine found in many XS modules.
+
+=head1 USAGE
+
+ExtUtils::Constant::Base exports no subroutines. The following methods are
+available
+
+=over 4
+
+=cut
+
+sub valid_type {
+ # Default to assuming that you don't need different types of return data.
+ 1;
+}
+sub default_type {
+ '';
+}
+
+=item header
+
+A method returning a scalar containing definitions needed, typically for a
+C header file.
+
+=cut
+
+sub header {
+ ''
+}
+
+# This might actually be a return statement. Note that you are responsible
+# for any space you might need before your value, as it lets to perform
+# "tricks" such as "return KEY_" and have strings appended.
+sub assignment_clause_for_type;
+# In which case this might be an empty string
+sub return_statement_for_type {undef};
+sub return_statement_for_notdef;
+sub return_statement_for_notfound;
+
+# "#if 1" is true to a C pre-processor
+sub macro_from_name {
+ 1;
+}
+
+sub macro_from_item {
+ 1;
+}
+
+sub macro_to_ifdef {
+ my ($self, $macro) = @_;
+ if (ref $macro) {
+ return $macro->[0];
+ }
+ if (defined $macro && $macro ne "" && $macro ne "1") {
+ return $macro ? "#ifdef $macro\n" : "#if 0\n";
+ }
+ return "";
+}
+
+sub macro_to_endif {
+ my ($self, $macro) = @_;
+
+ if (ref $macro) {
+ return $macro->[1];
+ }
+ if (defined $macro && $macro ne "" && $macro ne "1") {
+ return "#endif\n";
+ }
+ return "";
+}
+
+sub name_param {
+ 'name';
+}
+
+# This is possibly buggy, in that it's not mandatory (below, in the main
+# C_constant parameters, but is expected to exist here, if it's needed)
+# Buggy because if you're definitely pure 8 bit only, and will never be
+# presented with your constants in utf8, the default form of C_constant can't
+# be told not to do the utf8 version.
+
+sub is_utf8_param {
+ 'utf8';
+}
+
+sub memEQ {
+ "!memcmp";
+}
+
+=item memEQ_clause args_hashref
+
+A method to return a suitable C C<if> statement to check whether I<name>
+is equal to the C variable C<name>. If I<checked_at> is defined, then it
+is used to avoid C<memEQ> for short names, or to generate a comment to
+highlight the position of the character in the C<switch> statement.
+
+If i<checked_at> is a reference to a scalar, then instead it gives
+the characters pre-checked at the beginning, (and the number of chars by
+which the C variable name has been advanced. These need to be chopped from
+the front of I<name>).
+
+=cut
+
+sub memEQ_clause {
+# if (memEQ(name, "thingy", 6)) {
+ # Which could actually be a character comparison or even ""
+ my ($self, $args) = @_;
+ my ($name, $checked_at, $indent) = @{$args}{qw(name checked_at indent)};
+ $indent = ' ' x ($indent || 4);
+ my $front_chop;
+ if (ref $checked_at) {
+ # regexp won't work on 5.6.1 without use utf8; in turn that won't work
+ # on 5.005_03.
+ substr ($name, 0, length $$checked_at,) = '';
+ $front_chop = C_stringify ($$checked_at);
+ undef $checked_at;
+ }
+ my $len = length $name;
+
+ if ($len < 2) {
+ return $indent . "{\n"
+ if (defined $checked_at and $checked_at == 0) or $len == 0;
+ # We didn't switch, drop through to the code for the 2 character string
+ $checked_at = 1;
+ }
+
+ my $name_param = $self->name_param;
+
+ if ($len < 3 and defined $checked_at) {
+ my $check;
+ if ($checked_at == 1) {
+ $check = 0;
+ } elsif ($checked_at == 0) {
+ $check = 1;
+ }
+ if (defined $check) {
+ my $char = C_stringify (substr $name, $check, 1);
+ # Placate 5.005 with a break in the string. I can't see a good way of
+ # getting it to not take [ as introducing an array lookup, even with
+ # ${name_param}[$check]
+ return $indent . "if ($name_param" . "[$check] == '$char') {\n";
+ }
+ }
+ if (($len == 2 and !defined $checked_at)
+ or ($len == 3 and defined ($checked_at) and $checked_at == 2)) {
+ my $char1 = C_stringify (substr $name, 0, 1);
+ my $char2 = C_stringify (substr $name, 1, 1);
+ return $indent .
+ "if ($name_param" . "[0] == '$char1' && $name_param" . "[1] == '$char2') {\n";
+ }
+ if (($len == 3 and defined ($checked_at) and $checked_at == 1)) {
+ my $char1 = C_stringify (substr $name, 0, 1);
+ my $char2 = C_stringify (substr $name, 2, 1);
+ return $indent .
+ "if ($name_param" . "[0] == '$char1' && $name_param" . "[2] == '$char2') {\n";
+ }
+
+ my $pointer = '^';
+ my $have_checked_last = defined ($checked_at) && $len == $checked_at + 1;
+ if ($have_checked_last) {
+ # Checked at the last character, so no need to memEQ it.
+ $pointer = C_stringify (chop $name);
+ $len--;
+ }
+
+ $name = C_stringify ($name);
+ my $memEQ = $self->memEQ();
+ my $body = $indent . "if ($memEQ($name_param, \"$name\", $len)) {\n";
+ # Put a little ^ under the letter we checked at
+ # Screws up for non printable and non-7 bit stuff, but that's too hard to
+ # get right.
+ if (defined $checked_at) {
+ $body .= $indent . "/* " . (' ' x length $memEQ)
+ . (' ' x length $name_param)
+ . (' ' x $checked_at) . $pointer
+ . (' ' x ($len - $checked_at + length $len)) . " */\n";
+ } elsif (defined $front_chop) {
+ $body .= $indent . "/* $front_chop"
+ . (' ' x ($len + 1 + length $len)) . " */\n";
+ }
+ return $body;
+}
+
+=item dump_names arg_hashref, ITEM...
+
+An internal function to generate the embedded perl code that will regenerate
+the constant subroutines. I<default_type>, I<types> and I<ITEM>s are the
+same as for C_constant. I<indent> is treated as number of spaces to indent
+by. If C<declare_types> is true a C<$types> is always declared in the perl
+code generated, if defined and false never declared, and if undefined C<$types>
+is only declared if the values in I<types> as passed in cannot be inferred from
+I<default_types> and the I<ITEM>s.
+
+=cut
+
+sub dump_names {
+ my ($self, $args, @items) = @_;
+ my ($default_type, $what, $indent, $declare_types)
+ = @{$args}{qw(default_type what indent declare_types)};
+ $indent = ' ' x ($indent || 0);
+
+ my $result;
+ my (@simple, @complex, %used_types);
+ foreach (@items) {
+ my $type;
+ if (ref $_) {
+ $type = $_->{type} || $default_type;
+ if ($_->{utf8}) {
+ # For simplicity always skip the bytes case, and reconstitute this entry
+ # from its utf8 twin.
+ next if $_->{utf8} eq 'no';
+ # Copy the hashref, as we don't want to mess with the caller's hashref.
+ $_ = {%$_};
+ unless (is_perl56) {
+ utf8::decode ($_->{name});
+ } else {
+ $_->{name} = pack 'U*', unpack 'U0U*', $_->{name};
+ }
+ delete $_->{utf8};
+ }
+ } else {
+ $_ = {name=>$_};
+ $type = $default_type;
+ }
+ $used_types{$type}++;
+ if ($type eq $default_type
+ # grr 5.6.1
+ and length $_->{name}
+ and length $_->{name} == ($_->{name} =~ tr/A-Za-z0-9_//)
+ and !defined ($_->{macro}) and !defined ($_->{value})
+ and !defined ($_->{default}) and !defined ($_->{pre})
+ and !defined ($_->{post}) and !defined ($_->{def_pre})
+ and !defined ($_->{def_post}) and !defined ($_->{weight})) {
+ # It's the default type, and the name consists only of A-Za-z0-9_
+ push @simple, $_->{name};
+ } else {
+ push @complex, $_;
+ }
+ }
+
+ if (!defined $declare_types) {
+ # Do they pass in any types we weren't already using?
+ foreach (keys %$what) {
+ next if $used_types{$_};
+ $declare_types++; # Found one in $what that wasn't used.
+ last; # And one is enough to terminate this loop
+ }
+ }
+ if ($declare_types) {
+ $result = $indent . 'my $types = {map {($_, 1)} qw('
+ . join (" ", sort keys %$what) . ")};\n";
+ }
+ local $Text::Wrap::huge = 'overflow';
+ local $Text::Wrap::columns = 80;
+ $result .= wrap ($indent . "my \@names = (qw(",
+ $indent . " ", join (" ", sort @simple) . ")");
+ if (@complex) {
+ foreach my $item (sort {$a->{name} cmp $b->{name}} @complex) {
+ my $name = perl_stringify $item->{name};
+ my $line = ",\n$indent {name=>\"$name\"";
+ $line .= ", type=>\"$item->{type}\"" if defined $item->{type};
+ foreach my $thing (qw (macro value default pre post def_pre def_post)) {
+ my $value = $item->{$thing};
+ if (defined $value) {
+ if (ref $value) {
+ $line .= ", $thing=>[\""
+ . join ('", "', map {perl_stringify $_} @$value) . '"]';
+ } else {
+ $line .= ", $thing=>\"" . perl_stringify($value) . "\"";
+ }
+ }
+ }
+ $line .= "}";
+ # Ensure that the enclosing C comment doesn't end
+ # by turning */ into *" . "/
+ $line =~ s!\*\/!\*" . "/!gs;
+ # gcc -Wall doesn't like finding /* inside a comment
+ $line =~ s!\/\*!/" . "\*!gs;
+ $result .= $line;
+ }
+ }
+ $result .= ");\n";
+
+ $result;
+}
+
+=item assign arg_hashref, VALUE...
+
+A method to return a suitable assignment clause. If I<type> is aggregate
+(eg I<PVN> expects both pointer and length) then there should be multiple
+I<VALUE>s for the components. I<pre> and I<post> if defined give snippets
+of C code to proceed and follow the assignment. I<pre> will be at the start
+of a block, so variables may be defined in it.
+
+=cut
+# Hmm. value undef to to NOTDEF? value () to do NOTFOUND?
+
+sub assign {
+ my $self = shift;
+ my $args = shift;
+ my ($indent, $type, $pre, $post, $item)
+ = @{$args}{qw(indent type pre post item)};
+ $post ||= '';
+ my $clause;
+ my $close;
+ if ($pre) {
+ chomp $pre;
+ $close = "$indent}\n";
+ $clause = $indent . "{\n";
+ $indent .= " ";
+ $clause .= "$indent$pre";
+ $clause .= ";" unless $pre =~ /;$/;
+ $clause .= "\n";
+ }
+ confess "undef \$type" unless defined $type;
+ confess "Can't generate code for type $type"
+ unless $self->valid_type($type);
+
+ $clause .= join '', map {"$indent$_\n"}
+ $self->assignment_clause_for_type({type=>$type,item=>$item}, @_);
+ chomp $post;
+ if (length $post) {
+ $clause .= "$post";
+ $clause .= ";" unless $post =~ /;$/;
+ $clause .= "\n";
+ }
+ my $return = $self->return_statement_for_type($type);
+ $clause .= "$indent$return\n" if defined $return;
+ $clause .= $close if $close;
+ return $clause;
+}
+
+=item return_clause arg_hashref, ITEM
+
+A method to return a suitable C<#ifdef> clause. I<ITEM> is a hashref
+(as passed to C<C_constant> and C<match_clause>. I<indent> is the number
+of spaces to indent, defaulting to 6.
+
+=cut
+
+sub return_clause {
+
+##ifdef thingy
+# *iv_return = thingy;
+# return PERL_constant_ISIV;
+##else
+# return PERL_constant_NOTDEF;
+##endif
+ my ($self, $args, $item) = @_;
+ my $indent = $args->{indent};
+
+ my ($name, $value, $default, $pre, $post, $def_pre, $def_post, $type)
+ = @$item{qw (name value default pre post def_pre def_post type)};
+ $value = $name unless defined $value;
+ my $macro = $self->macro_from_item($item);
+ $indent = ' ' x ($indent || 6);
+ unless (defined $type) {
+ # use Data::Dumper; print STDERR Dumper ($item);
+ confess "undef \$type";
+ }
+
+ ##ifdef thingy
+ my $clause = $self->macro_to_ifdef($macro);
+
+ # *iv_return = thingy;
+ # return PERL_constant_ISIV;
+ $clause
+ .= $self->assign ({indent=>$indent, type=>$type, pre=>$pre, post=>$post,
+ item=>$item}, ref $value ? @$value : $value);
+
+ if (defined $macro && $macro ne "" && $macro ne "1") {
+ ##else
+ $clause .= "#else\n";
+
+ # return PERL_constant_NOTDEF;
+ if (!defined $default) {
+ my $notdef = $self->return_statement_for_notdef();
+ $clause .= "$indent$notdef\n" if defined $notdef;
+ } else {
+ my @default = ref $default ? @$default : $default;
+ $type = shift @default;
+ $clause .= $self->assign ({indent=>$indent, type=>$type, pre=>$pre,
+ post=>$post, item=>$item}, @default);
+ }
+ }
+ ##endif
+ $clause .= $self->macro_to_endif($macro);
+
+ return $clause;
+}
+
+sub match_clause {
+ # $offset defined if we have checked an offset.
+ my ($self, $args, $item) = @_;
+ my ($offset, $indent) = @{$args}{qw(checked_at indent)};
+ $indent = ' ' x ($indent || 4);
+ my $body = '';
+ my ($no, $yes, $either, $name, $inner_indent);
+ if (ref $item eq 'ARRAY') {
+ ($yes, $no) = @$item;
+ $either = $yes || $no;
+ confess "$item is $either expecting hashref in [0] || [1]"
+ unless ref $either eq 'HASH';
+ $name = $either->{name};
+ } else {
+ confess "$item->{name} has utf8 flag '$item->{utf8}', should be false"
+ if $item->{utf8};
+ $name = $item->{name};
+ $inner_indent = $indent;
+ }
+
+ $body .= $self->memEQ_clause ({name => $name, checked_at => $offset,
+ indent => length $indent});
+ # If we've been presented with an arrayref for $item, then the user string
+ # contains in the range 128-255, and we need to check whether it was utf8
+ # (or not).
+ # In the worst case we have two named constants, where one's name happens
+ # encoded in UTF8 happens to be the same byte sequence as the second's
+ # encoded in (say) ISO-8859-1.
+ # In this case, $yes and $no both have item hashrefs.
+ if ($yes) {
+ $body .= $indent . " if (" . $self->is_utf8_param . ") {\n";
+ } elsif ($no) {
+ $body .= $indent . " if (!" . $self->is_utf8_param . ") {\n";
+ }
+ if ($either) {
+ $body .= $self->return_clause ({indent=>4 + length $indent}, $either);
+ if ($yes and $no) {
+ $body .= $indent . " } else {\n";
+ $body .= $self->return_clause ({indent=>4 + length $indent}, $no);
+ }
+ $body .= $indent . " }\n";
+ } else {
+ $body .= $self->return_clause ({indent=>2 + length $indent}, $item);
+ }
+ $body .= $indent . "}\n";
+}
+
+
+=item switch_clause arg_hashref, NAMELEN, ITEMHASH, ITEM...
+
+An internal method to generate a suitable C<switch> clause, called by
+C<C_constant> I<ITEM>s are in the hash ref format as given in the description
+of C<C_constant>, and must all have the names of the same length, given by
+I<NAMELEN>. I<ITEMHASH> is a reference to a hash, keyed by name, values being
+the hashrefs in the I<ITEM> list. (No parameters are modified, and there can
+be keys in the I<ITEMHASH> that are not in the list of I<ITEM>s without
+causing problems - the hash is passed in to save generating it afresh for
+each call).
+
+=cut
+
+sub switch_clause {
+ my ($self, $args, $namelen, $items, @items) = @_;
+ my ($indent, $comment) = @{$args}{qw(indent comment)};
+ $indent = ' ' x ($indent || 2);
+
+ local $Text::Wrap::huge = 'overflow';
+ local $Text::Wrap::columns = 80;
+
+ my @names = sort map {$_->{name}} @items;
+ my $leader = $indent . '/* ';
+ my $follower = ' ' x length $leader;
+ my $body = $indent . "/* Names all of length $namelen. */\n";
+ if (defined $comment) {
+ $body = wrap ($leader, $follower, $comment) . "\n";
+ $leader = $follower;
+ }
+ my @safe_names = @names;
+ foreach (@safe_names) {
+ confess sprintf "Name '$_' is length %d, not $namelen", length
+ unless length == $namelen;
+ # Argh. 5.6.1
+ # next unless tr/A-Za-z0-9_//c;
+ next if tr/A-Za-z0-9_// == length;
+ $_ = '"' . perl_stringify ($_) . '"';
+ # Ensure that the enclosing C comment doesn't end
+ # by turning */ into *" . "/
+ s!\*\/!\*"."/!gs;
+ # gcc -Wall doesn't like finding /* inside a comment
+ s!\/\*!/"."\*!gs;
+ }
+ $body .= wrap ($leader, $follower, join (" ", @safe_names) . " */") . "\n";
+ # Figure out what to switch on.
+ # (RMS, Spread of jump table, Position, Hashref)
+ my @best = (1e38, ~0);
+ # Prefer the last character over the others. (As it lets us shorten the
+ # memEQ clause at no cost).
+ foreach my $i ($namelen - 1, 0 .. ($namelen - 2)) {
+ my ($min, $max) = (~0, 0);
+ my %spread;
+ if (is_perl56) {
+ # Need proper Unicode preserving hash keys for bytes in range 128-255
+ # here too, for some reason. grr 5.6.1 yet again.
+ tie %spread, 'ExtUtils::Constant::Aaargh56Hash';
+ }
+ foreach (@names) {
+ my $char = substr $_, $i, 1;
+ my $ord = ord $char;
+ confess "char $ord is out of range" if $ord > 255;
+ $max = $ord if $ord > $max;
+ $min = $ord if $ord < $min;
+ push @{$spread{$char}}, $_;
+ # warn "$_ $char";
+ }
+ # I'm going to pick the character to split on that minimises the root
+ # mean square of the number of names in each case. Normally this should
+ # be the one with the most keys, but it may pick a 7 where the 8 has
+ # one long linear search. I'm not sure if RMS or just sum of squares is
+ # actually better.
+ # $max and $min are for the tie-breaker if the root mean squares match.
+ # Assuming that the compiler may be building a jump table for the
+ # switch() then try to minimise the size of that jump table.
+ # Finally use < not <= so that if it still ties the earliest part of
+ # the string wins. Because if that passes but the memEQ fails, it may
+ # only need the start of the string to bin the choice.
+ # I think. But I'm micro-optimising. :-)
+ # OK. Trump that. Now favour the last character of the string, before the
+ # rest.
+ my $ss;
+ $ss += @$_ * @$_ foreach values %spread;
+ my $rms = sqrt ($ss / keys %spread);
+ if ($rms < $best[0] || ($rms == $best[0] && ($max - $min) < $best[1])) {
+ @best = ($rms, $max - $min, $i, \%spread);
+ }
+ }
+ confess "Internal error. Failed to pick a switch point for @names"
+ unless defined $best[2];
+ # use Data::Dumper; print Dumper (@best);
+ my ($offset, $best) = @best[2,3];
+ $body .= $indent . "/* Offset $offset gives the best switch position. */\n";
+
+ my $do_front_chop = $offset == 0 && $namelen > 2;
+ if ($do_front_chop) {
+ $body .= $indent . "switch (*" . $self->name_param() . "++) {\n";
+ } else {
+ $body .= $indent . "switch (" . $self->name_param() . "[$offset]) {\n";
+ }
+ foreach my $char (sort keys %$best) {
+ confess sprintf "'$char' is %d bytes long, not 1", length $char
+ if length ($char) != 1;
+ confess sprintf "char %#X is out of range", ord $char if ord ($char) > 255;
+ $body .= $indent . "case '" . C_stringify ($char) . "':\n";
+ foreach my $thisone (sort {
+ # Deal with the case of an item actually being an array ref to 1 or 2
+ # hashrefs. Don't assign to $a or $b, as they're aliases to the orignal
+ my $l = ref $a eq 'ARRAY' ? ($a->[0] || $->[1]) : $a;
+ my $r = ref $b eq 'ARRAY' ? ($b->[0] || $->[1]) : $b;
+ # Sort by weight first
+ ($r->{weight} || 0) <=> ($l->{weight} || 0)
+ # Sort equal weights by name
+ or $l->{name} cmp $r->{name}}
+ # If this looks evil, maybe it is. $items is a
+ # hashref, and we're doing a hash slice on it
+ @{$items}{@{$best->{$char}}}) {
+ # warn "You are here";
+ if ($do_front_chop) {
+ $body .= $self->match_clause ({indent => 2 + length $indent,
+ checked_at => \$char}, $thisone);
+ } else {
+ $body .= $self->match_clause ({indent => 2 + length $indent,
+ checked_at => $offset}, $thisone);
+ }
+ }
+ $body .= $indent . " break;\n";
+ }
+ $body .= $indent . "}\n";
+ return $body;
+}
+
+sub C_constant_return_type {
+ "static int";
+}
+
+sub C_constant_prefix_param {
+ '';
+}
+
+sub C_constant_prefix_param_defintion {
+ '';
+}
+
+sub name_param_definition {
+ "const char *" . $_[0]->name_param;
+}
+
+sub namelen_param {
+ 'len';
+}
+
+sub namelen_param_definition {
+ 'size_t ' . $_[0]->namelen_param;
+}
+
+sub C_constant_other_params {
+ '';
+}
+
+sub C_constant_other_params_defintion {
+ '';
+}
+
+=item params WHAT
+
+An "internal" method, subject to change, currently called to allow an
+overriding class to cache information that will then be passed into all
+the C<*param*> calls. (Yes, having to read the source to make sense of this is
+considered a known bug). I<WHAT> is be a hashref of types the constant
+function will return. In ExtUtils::Constant::XS this method is used to
+returns a hashref keyed IV NV PV SV to show which combination of pointers will
+be needed in the C argument list generated by
+C_constant_other_params_definition and C_constant_other_params
+
+=cut
+
+sub params {
+ '';
+}
+
+
+=item dogfood arg_hashref, ITEM...
+
+An internal function to generate the embedded perl code that will regenerate
+the constant subroutines. Parameters are the same as for C_constant.
+
+Currently the base class does nothing and returns an empty string.
+
+=cut
+
+sub dogfood {
+ ''
+}
+
+=item normalise_items args, default_type, seen_types, seen_items, ITEM...
+
+Convert the items to a normalised form. For 8 bit and Unicode values converts
+the item to an array of 1 or 2 items, both 8 bit and UTF-8 encoded.
+
+=cut
+
+sub normalise_items
+{
+ my $self = shift;
+ my $args = shift;
+ my $default_type = shift;
+ my $what = shift;
+ my $items = shift;
+ my @new_items;
+ foreach my $orig (@_) {
+ my ($name, $item);
+ if (ref $orig) {
+ # Make a copy which is a normalised version of the ref passed in.
+ $name = $orig->{name};
+ my ($type, $macro, $value) = @$orig{qw (type macro value)};
+ $type ||= $default_type;
+ $what->{$type} = 1;
+ $item = {name=>$name, type=>$type};
+
+ undef $macro if defined $macro and $macro eq $name;
+ $item->{macro} = $macro if defined $macro;
+ undef $value if defined $value and $value eq $name;
+ $item->{value} = $value if defined $value;
+ foreach my $key (qw(default pre post def_pre def_post weight
+ not_constant)) {
+ my $value = $orig->{$key};
+ $item->{$key} = $value if defined $value;
+ # warn "$key $value";
+ }
+ } else {
+ $name = $orig;
+ $item = {name=>$name, type=>$default_type};
+ $what->{$default_type} = 1;
+ }
+ warn +(ref ($self) || $self)
+ . "doesn't know how to handle values of type $_ used in macro $name"
+ unless $self->valid_type ($item->{type});
+ # tr///c is broken on 5.6.1 for utf8, so my original tr/\0-\177//c
+ # doesn't work. Upgrade to 5.8
+ # if ($name !~ tr/\0-\177//c || $] < 5.005_50) {
+ if ($name =~ tr/\0-\177// == length $name || $] < 5.005_50
+ || $args->{disable_utf8_duplication}) {
+ # No characters outside 7 bit ASCII.
+ if (exists $items->{$name}) {
+ die "Multiple definitions for macro $name";
+ }
+ $items->{$name} = $item;
+ } else {
+ # No characters outside 8 bit. This is hardest.
+ if (exists $items->{$name} and ref $items->{$name} ne 'ARRAY') {
+ confess "Unexpected ASCII definition for macro $name";
+ }
+ # Again, 5.6.1 tr broken, so s/5\.6.*/5\.8\.0/;
+ # if ($name !~ tr/\0-\377//c) {
+ if ($name =~ tr/\0-\377// == length $name) {
+# if ($] < 5.007) {
+# $name = pack "C*", unpack "U*", $name;
+# }
+ $item->{utf8} = 'no';
+ $items->{$name}[1] = $item;
+ push @new_items, $item;
+ # Copy item, to create the utf8 variant.
+ $item = {%$item};
+ }
+ # Encode the name as utf8 bytes.
+ unless (is_perl56) {
+ utf8::encode($name);
+ } else {
+# warn "Was >$name< " . length ${name};
+ $name = pack 'C*', unpack 'C*', $name . pack 'U*';
+# warn "Now '${name}' " . length ${name};
+ }
+ if ($items->{$name}[0]) {
+ die "Multiple definitions for macro $name";
+ }
+ $item->{utf8} = 'yes';
+ $item->{name} = $name;
+ $items->{$name}[0] = $item;
+ # We have need for the utf8 flag.
+ $what->{''} = 1;
+ }
+ push @new_items, $item;
+ }
+ @new_items;
+}
+
+=item C_constant arg_hashref, ITEM...
+
+A function that returns a B<list> of C subroutine definitions that return
+the value and type of constants when passed the name by the XS wrapper.
+I<ITEM...> gives a list of constant names. Each can either be a string,
+which is taken as a C macro name, or a reference to a hash with the following
+keys
+
+=over 8
+
+=item name
+
+The name of the constant, as seen by the perl code.
+
+=item type
+
+The type of the constant (I<IV>, I<NV> etc)
+
+=item value
+
+A C expression for the value of the constant, or a list of C expressions if
+the type is aggregate. This defaults to the I<name> if not given.
+
+=item macro
+
+The C pre-processor macro to use in the C<#ifdef>. This defaults to the
+I<name>, and is mainly used if I<value> is an C<enum>. If a reference an
+array is passed then the first element is used in place of the C<#ifdef>
+line, and the second element in place of the C<#endif>. This allows
+pre-processor constructions such as
+
+ #if defined (foo)
+ #if !defined (bar)
+ ...
+ #endif
+ #endif
+
+to be used to determine if a constant is to be defined.
+
+A "macro" 1 signals that the constant is always defined, so the C<#if>/C<#endif>
+test is omitted.
+
+=item default
+
+Default value to use (instead of C<croak>ing with "your vendor has not
+defined...") to return if the macro isn't defined. Specify a reference to
+an array with type followed by value(s).
+
+=item pre
+
+C code to use before the assignment of the value of the constant. This allows
+you to use temporary variables to extract a value from part of a C<struct>
+and return this as I<value>. This C code is places at the start of a block,
+so you can declare variables in it.
+
+=item post
+
+C code to place between the assignment of value (to a temporary) and the
+return from the function. This allows you to clear up anything in I<pre>.
+Rarely needed.
+
+=item def_pre
+
+=item def_post
+
+Equivalents of I<pre> and I<post> for the default value.
+
+=item utf8
+
+Generated internally. Is zero or undefined if name is 7 bit ASCII,
+"no" if the name is 8 bit (and so should only match if SvUTF8() is false),
+"yes" if the name is utf8 encoded.
+
+The internals automatically clone any name with characters 128-255 but none
+256+ (ie one that could be either in bytes or utf8) into a second entry
+which is utf8 encoded.
+
+=item weight
+
+Optional sorting weight for names, to determine the order of
+linear testing when multiple names fall in the same case of a switch clause.
+Higher comes earlier, undefined defaults to zero.
+
+=back
+
+In the argument hashref, I<package> is the name of the package, and is only
+used in comments inside the generated C code. I<subname> defaults to
+C<constant> if undefined.
+
+I<default_type> is the type returned by C<ITEM>s that don't specify their
+type. It defaults to the value of C<default_type()>. I<types> should be given
+either as a comma separated list of types that the C subroutine I<subname>
+will generate or as a reference to a hash. I<default_type> will be added to
+the list if not present, as will any types given in the list of I<ITEM>s. The
+resultant list should be the same list of types that C<XS_constant> is
+given. [Otherwise C<XS_constant> and C<C_constant> may differ in the number of
+parameters to the constant function. I<indent> is currently unused and
+ignored. In future it may be used to pass in information used to change the C
+indentation style used.] The best way to maintain consistency is to pass in a
+hash reference and let this function update it.
+
+I<breakout> governs when child functions of I<subname> are generated. If there
+are I<breakout> or more I<ITEM>s with the same length of name, then the code
+to switch between them is placed into a function named I<subname>_I<len>, for
+example C<constant_5> for names 5 characters long. The default I<breakout> is
+3. A single C<ITEM> is always inlined.
+
+=cut
+
+# The parameter now BREAKOUT was previously documented as:
+#
+# I<NAMELEN> if defined signals that all the I<name>s of the I<ITEM>s are of
+# this length, and that the constant name passed in by perl is checked and
+# also of this length. It is used during recursion, and should be C<undef>
+# unless the caller has checked all the lengths during code generation, and
+# the generated subroutine is only to be called with a name of this length.
+#
+# As you can see it now performs this function during recursion by being a
+# scalar reference.
+
+sub C_constant {
+ my ($self, $args, @items) = @_;
+ my ($package, $subname, $default_type, $what, $indent, $breakout) =
+ @{$args}{qw(package subname default_type types indent breakout)};
+ $package ||= 'Foo';
+ $subname ||= 'constant';
+ # I'm not using this. But a hashref could be used for full formatting without
+ # breaking this API
+ # $indent ||= 0;
+
+ my ($namelen, $items);
+ if (ref $breakout) {
+ # We are called recursively. We trust @items to be normalised, $what to
+ # be a hashref, and pinch %$items from our parent to save recalculation.
+ ($namelen, $items) = @$breakout;
+ } else {
+ $items = {};
+ if (is_perl56) {
+ # Need proper Unicode preserving hash keys.
+ require ExtUtils::Constant::Aaargh56Hash;
+ tie %$items, 'ExtUtils::Constant::Aaargh56Hash';
+ }
+ $breakout ||= 3;
+ $default_type ||= $self->default_type();
+ if (!ref $what) {
+ # Convert line of the form IV,UV,NV to hash
+ $what = {map {$_ => 1} split /,\s*/, ($what || '')};
+ # Figure out what types we're dealing with, and assign all unknowns to the
+ # default type
+ }
+ @items = $self->normalise_items ({}, $default_type, $what, $items, @items);
+ # use Data::Dumper; print Dumper @items;
+ }
+ my $params = $self->params ($what);
+
+ # Probably "static int"
+ my ($body, @subs);
+ $body = $self->C_constant_return_type($params) . "\n$subname ("
+ # Eg "pTHX_ "
+ . $self->C_constant_prefix_param_defintion($params)
+ # Probably "const char *name"
+ . $self->name_param_definition($params);
+ # Something like ", STRLEN len"
+ $body .= ", " . $self->namelen_param_definition($params)
+ unless defined $namelen;
+ $body .= $self->C_constant_other_params_defintion($params);
+ $body .= ") {\n";
+
+ if (defined $namelen) {
+ # We are a child subroutine. Print the simple description
+ my $comment = 'When generated this function returned values for the list'
+ . ' of names given here. However, subsequent manual editing may have'
+ . ' added or removed some.';
+ $body .= $self->switch_clause ({indent=>2, comment=>$comment},
+ $namelen, $items, @items);
+ } else {
+ # We are the top level.
+ $body .= " /* Initially switch on the length of the name. */\n";
+ $body .= $self->dogfood ({package => $package, subname => $subname,
+ default_type => $default_type, what => $what,
+ indent => $indent, breakout => $breakout},
+ @items);
+ $body .= ' switch ('.$self->namelen_param().") {\n";
+ # Need to group names of the same length
+ my @by_length;
+ foreach (@items) {
+ push @{$by_length[length $_->{name}]}, $_;
+ }
+ foreach my $i (0 .. $#by_length) {
+ next unless $by_length[$i]; # None of this length
+ $body .= " case $i:\n";
+ if (@{$by_length[$i]} == 1) {
+ my $only_thing = $by_length[$i]->[0];
+ if ($only_thing->{utf8}) {
+ if ($only_thing->{utf8} eq 'yes') {
+ # With utf8 on flag item is passed in element 0
+ $body .= $self->match_clause (undef, [$only_thing]);
+ } else {
+ # With utf8 off flag item is passed in element 1
+ $body .= $self->match_clause (undef, [undef, $only_thing]);
+ }
+ } else {
+ $body .= $self->match_clause (undef, $only_thing);
+ }
+ } elsif (@{$by_length[$i]} < $breakout) {
+ $body .= $self->switch_clause ({indent=>4},
+ $i, $items, @{$by_length[$i]});
+ } else {
+ # Only use the minimal set of parameters actually needed by the types
+ # of the names of this length.
+ my $what = {};
+ foreach (@{$by_length[$i]}) {
+ $what->{$_->{type}} = 1;
+ $what->{''} = 1 if $_->{utf8};
+ }
+ $params = $self->params ($what);
+ push @subs, $self->C_constant ({package=>$package,
+ subname=>"${subname}_$i",
+ default_type => $default_type,
+ types => $what, indent => $indent,
+ breakout => [$i, $items]},
+ @{$by_length[$i]});
+ $body .= " return ${subname}_$i ("
+ # Eg "aTHX_ "
+ . $self->C_constant_prefix_param($params)
+ # Probably "name"
+ . $self->name_param($params);
+ $body .= $self->C_constant_other_params($params);
+ $body .= ");\n";
+ }
+ $body .= " break;\n";
+ }
+ $body .= " }\n";
+ }
+ my $notfound = $self->return_statement_for_notfound();
+ $body .= " $notfound\n" if $notfound;
+ $body .= "}\n";
+ return (@subs, $body);
+}
+
+1;
+__END__
+
+=back
+
+=head1 BUGS
+
+Not everything is documented yet.
+
+Probably others.
+
+=head1 AUTHOR
+
+Nicholas Clark <nick@ccl4.org> based on the code in C<h2xs> by Larry Wall and
+others
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant/ProxySubs.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant/ProxySubs.pm
new file mode 100755
index 00000000000..c3fe8ed3c56
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant/ProxySubs.pm
@@ -0,0 +1,549 @@
+package ExtUtils::Constant::ProxySubs;
+
+use strict;
+use vars qw($VERSION @ISA %type_to_struct %type_from_struct %type_to_sv
+ %type_to_C_value %type_is_a_problem %type_num_args
+ %type_temporary);
+use Carp;
+require ExtUtils::Constant::XS;
+use ExtUtils::Constant::Utils qw(C_stringify);
+use ExtUtils::Constant::XS qw(%XS_TypeSet);
+
+$VERSION = '0.06';
+@ISA = 'ExtUtils::Constant::XS';
+
+%type_to_struct =
+ (
+ IV => '{const char *name; I32 namelen; IV value;}',
+ NV => '{const char *name; I32 namelen; NV value;}',
+ UV => '{const char *name; I32 namelen; UV value;}',
+ PV => '{const char *name; I32 namelen; const char *value;}',
+ PVN => '{const char *name; I32 namelen; const char *value; STRLEN len;}',
+ YES => '{const char *name; I32 namelen;}',
+ NO => '{const char *name; I32 namelen;}',
+ UNDEF => '{const char *name; I32 namelen;}',
+ '' => '{const char *name; I32 namelen;} ',
+ );
+
+%type_from_struct =
+ (
+ IV => sub { $_[0] . '->value' },
+ NV => sub { $_[0] . '->value' },
+ UV => sub { $_[0] . '->value' },
+ PV => sub { $_[0] . '->value' },
+ PVN => sub { $_[0] . '->value', $_[0] . '->len' },
+ YES => sub {},
+ NO => sub {},
+ UNDEF => sub {},
+ '' => sub {},
+ );
+
+%type_to_sv =
+ (
+ IV => sub { "newSViv($_[0])" },
+ NV => sub { "newSVnv($_[0])" },
+ UV => sub { "newSVuv($_[0])" },
+ PV => sub { "newSVpv($_[0], 0)" },
+ PVN => sub { "newSVpvn($_[0], $_[1])" },
+ YES => sub { '&PL_sv_yes' },
+ NO => sub { '&PL_sv_no' },
+ UNDEF => sub { '&PL_sv_undef' },
+ '' => sub { '&PL_sv_yes' },
+ SV => sub {"SvREFCNT_inc($_[0])"},
+ );
+
+%type_to_C_value =
+ (
+ YES => sub {},
+ NO => sub {},
+ UNDEF => sub {},
+ '' => sub {},
+ );
+
+sub type_to_C_value {
+ my ($self, $type) = @_;
+ return $type_to_C_value{$type} || sub {return map {ref $_ ? @$_ : $_} @_};
+}
+
+# TODO - figure out if there is a clean way for the type_to_sv code to
+# attempt s/sv_2mortal// and if it succeeds tell type_to_sv not to add
+# SvREFCNT_inc
+%type_is_a_problem =
+ (
+ # The documentation says *mortal SV*, but we now need a non-mortal copy.
+ SV => 1,
+ );
+
+%type_temporary =
+ (
+ SV => ['SV *'],
+ PV => ['const char *'],
+ PVN => ['const char *', 'STRLEN'],
+ );
+$type_temporary{$_} = [$_] foreach qw(IV UV NV);
+
+while (my ($type, $value) = each %XS_TypeSet) {
+ $type_num_args{$type}
+ = defined $value ? ref $value ? scalar @$value : 1 : 0;
+}
+$type_num_args{''} = 0;
+
+sub partition_names {
+ my ($self, $default_type, @items) = @_;
+ my (%found, @notfound, @trouble);
+
+ while (my $item = shift @items) {
+ my $default = delete $item->{default};
+ if ($default) {
+ # If we find a default value, convert it into a regular item and
+ # append it to the queue of items to process
+ my $default_item = {%$item};
+ $default_item->{invert_macro} = 1;
+ $default_item->{pre} = delete $item->{def_pre};
+ $default_item->{post} = delete $item->{def_post};
+ $default_item->{type} = shift @$default;
+ $default_item->{value} = $default;
+ push @items, $default_item;
+ } else {
+ # It can be "not found" unless it's the default (invert the macro)
+ # or the "macro" is an empty string (ie no macro)
+ push @notfound, $item unless $item->{invert_macro}
+ or !$self->macro_to_ifdef($self->macro_from_item($item));
+ }
+
+ if ($item->{pre} or $item->{post} or $item->{not_constant}
+ or $type_is_a_problem{$item->{type}}) {
+ push @trouble, $item;
+ } else {
+ push @{$found{$item->{type}}}, $item;
+ }
+ }
+ # use Data::Dumper; print Dumper \%found;
+ (\%found, \@notfound, \@trouble);
+}
+
+sub boottime_iterator {
+ my ($self, $type, $iterator, $hash, $subname) = @_;
+ my $extractor = $type_from_struct{$type};
+ die "Can't find extractor code for type $type"
+ unless defined $extractor;
+ my $generator = $type_to_sv{$type};
+ die "Can't find generator code for type $type"
+ unless defined $generator;
+
+ my $athx = $self->C_constant_prefix_param();
+
+ return sprintf <<"EOBOOT", &$generator(&$extractor($iterator));
+ while ($iterator->name) {
+ $subname($athx $hash, $iterator->name,
+ $iterator->namelen, %s);
+ ++$iterator;
+ }
+EOBOOT
+}
+
+sub name_len_value_macro {
+ my ($self, $item) = @_;
+ my $name = $item->{name};
+ my $value = $item->{value};
+ $value = $item->{name} unless defined $value;
+
+ my $namelen = length $name;
+ if ($name =~ tr/\0-\377// != $namelen) {
+ # the hash API signals UTF-8 by passing the length negated.
+ utf8::encode($name);
+ $namelen = -length $name;
+ }
+ $name = C_stringify($name);
+
+ my $macro = $self->macro_from_item($item);
+ ($name, $namelen, $value, $macro);
+}
+
+sub WriteConstants {
+ my $self = shift;
+ my $ARGS = {@_};
+
+ my ($c_fh, $xs_fh, $c_subname, $xs_subname, $default_type, $package)
+ = @{$ARGS}{qw(C_FH XS_FH C_SUBNAME XS_SUBNAME DEFAULT_TYPE NAME)};
+
+ my $options = $ARGS->{PROXYSUBS};
+ $options = {} unless ref $options;
+ my $explosives = $options->{croak_on_read};
+
+ $xs_subname ||= 'constant';
+
+ # If anyone is insane enough to suggest a package name containing %
+ my $package_sprintf_safe = $package;
+ $package_sprintf_safe =~ s/%/%%/g;
+
+ # All the types we see
+ my $what = {};
+ # A hash to lookup items with.
+ my $items = {};
+
+ my @items = $self->normalise_items ({disable_utf8_duplication => 1},
+ $default_type, $what, $items,
+ @{$ARGS->{NAMES}});
+
+ # Partition the values by type. Also include any defaults in here
+ # Everything that doesn't have a default needs alternative code for
+ # "I'm missing"
+ # And everything that has pre or post code ends up in a private block
+ my ($found, $notfound, $trouble)
+ = $self->partition_names($default_type, @items);
+
+ my $pthx = $self->C_constant_prefix_param_defintion();
+ my $athx = $self->C_constant_prefix_param();
+ my $symbol_table = C_stringify($package) . '::';
+
+ my $can_do_pcs = $] >= 5.009;
+ my $cast_CONSTSUB = $] < 5.010 ? '(char *)' : '';
+
+ print $c_fh $self->header(), <<"EOADD";
+static void
+${c_subname}_add_symbol($pthx HV *hash, const char *name, I32 namelen, SV *value) {
+EOADD
+ if (!$can_do_pcs) {
+ print $c_fh <<'EO_NOPCS';
+ if (namelen == namelen) {
+EO_NOPCS
+ } else {
+ print $c_fh <<"EO_PCS";
+ SV **sv = hv_fetch(hash, name, namelen, TRUE);
+ if (!sv) {
+ Perl_croak($athx "Couldn't add key '%s' to %%$package_sprintf_safe\::",
+ name);
+ }
+ if (SvOK(*sv) || SvTYPE(*sv) == SVt_PVGV) {
+ /* Someone has been here before us - have to make a real sub. */
+EO_PCS
+ }
+ # This piece of code is common to both
+ print $c_fh <<"EOADD";
+ newCONSTSUB(hash, ${cast_CONSTSUB}name, value);
+EOADD
+ if ($can_do_pcs) {
+ print $c_fh <<'EO_PCS';
+ } else {
+ SvUPGRADE(*sv, SVt_RV);
+ SvRV_set(*sv, value);
+ SvROK_on(*sv);
+ SvREADONLY_on(value);
+ }
+EO_PCS
+ } else {
+ print $c_fh <<'EO_NOPCS';
+ }
+EO_NOPCS
+ }
+ print $c_fh <<'EOADD';
+}
+
+EOADD
+
+ print $c_fh $explosives ? <<"EXPLODE" : "\n";
+
+static int
+Im_sorry_Dave(pTHX_ SV *sv, MAGIC *mg)
+{
+ PERL_UNUSED_ARG(mg);
+ Perl_croak(aTHX_
+ "Your vendor has not defined $package_sprintf_safe macro %"SVf
+ " used", sv);
+ NORETURN_FUNCTION_END;
+}
+
+static MGVTBL not_defined_vtbl = {
+ Im_sorry_Dave, /* get - I'm afraid I can't do that */
+ Im_sorry_Dave, /* set */
+ 0, /* len */
+ 0, /* clear */
+ 0, /* free */
+ 0, /* copy */
+ 0, /* dup */
+};
+
+EXPLODE
+
+{
+ my $key = $symbol_table;
+ # Just seems tidier (and slightly more space efficient) not to have keys
+ # such as Fcntl::
+ $key =~ s/::$//;
+ my $key_len = length $key;
+
+ print $c_fh <<"MISSING";
+
+#ifndef SYMBIAN
+
+/* Store a hash of all symbols missing from the package. To avoid trampling on
+ the package namespace (uninvited) put each package's hash in our namespace.
+ To avoid creating lots of typeblogs and symbol tables for sub-packages, put
+ each package's hash into one hash in our namespace. */
+
+static HV *
+get_missing_hash(pTHX) {
+ HV *const parent
+ = get_hv("ExtUtils::Constant::ProxySubs::Missing", GVf_MULTI);
+ /* We could make a hash of hashes directly, but this would confuse anything
+ at Perl space that looks at us, and as we're visible in Perl space,
+ best to play nice. */
+ SV *const *const ref
+ = hv_fetch(parent, "$key", $key_len, TRUE);
+ HV *new_hv;
+
+ if (!ref)
+ return NULL;
+
+ if (SvROK(*ref))
+ return (HV*) SvRV(*ref);
+
+ new_hv = newHV();
+ SvUPGRADE(*ref, SVt_RV);
+ SvRV_set(*ref, (SV *)new_hv);
+ SvROK_on(*ref);
+ return new_hv;
+}
+
+#endif
+
+MISSING
+
+}
+
+ print $xs_fh <<"EOBOOT";
+BOOT:
+ {
+#ifdef dTHX
+ dTHX;
+#endif
+ HV *symbol_table = get_hv("$symbol_table", GV_ADD);
+#ifndef SYMBIAN
+ HV *${c_subname}_missing;
+#endif
+EOBOOT
+
+ my %iterator;
+
+ $found->{''}
+ = [map {{%$_, type=>'', invert_macro => 1}} @$notfound];
+
+ foreach my $type (sort keys %$found) {
+ my $struct = $type_to_struct{$type};
+ my $type_to_value = $self->type_to_C_value($type);
+ my $number_of_args = $type_num_args{$type};
+ die "Can't find structure definition for type $type"
+ unless defined $struct;
+
+ my $struct_type = $type ? lc($type) . '_s' : 'notfound_s';
+ print $c_fh "struct $struct_type $struct;\n";
+
+ my $array_name = 'values_for_' . ($type ? lc $type : 'notfound');
+ print $xs_fh <<"EOBOOT";
+
+ static const struct $struct_type $array_name\[] =
+ {
+EOBOOT
+
+
+ foreach my $item (@{$found->{$type}}) {
+ my ($name, $namelen, $value, $macro)
+ = $self->name_len_value_macro($item);
+
+ my $ifdef = $self->macro_to_ifdef($macro);
+ if (!$ifdef && $item->{invert_macro}) {
+ carp("Attempting to supply a default for '$name' which has no conditional macro");
+ next;
+ }
+ print $xs_fh $ifdef;
+ if ($item->{invert_macro}) {
+ print $xs_fh
+ " /* This is the default value: */\n" if $type;
+ print $xs_fh "#else\n";
+ }
+ print $xs_fh " { ", join (', ', "\"$name\"", $namelen,
+ &$type_to_value($value)), " },\n",
+ $self->macro_to_endif($macro);
+ }
+
+
+ # Terminate the list with a NULL
+ print $xs_fh " { NULL, 0", (", 0" x $number_of_args), " } };\n";
+
+ $iterator{$type} = "value_for_" . ($type ? lc $type : 'notfound');
+
+ print $xs_fh <<"EOBOOT";
+ const struct $struct_type *$iterator{$type} = $array_name;
+EOBOOT
+ }
+
+ delete $found->{''};
+
+ print $xs_fh <<"EOBOOT";
+#ifndef SYMBIAN
+ ${c_subname}_missing = get_missing_hash(aTHX);
+#endif
+EOBOOT
+
+ my $add_symbol_subname = $c_subname . '_add_symbol';
+ foreach my $type (sort keys %$found) {
+ print $xs_fh $self->boottime_iterator($type, $iterator{$type},
+ 'symbol_table',
+ $add_symbol_subname);
+ }
+
+ print $xs_fh <<"EOBOOT";
+ while (value_for_notfound->name) {
+EOBOOT
+
+ print $xs_fh $explosives ? <<"EXPLODE" : << "DONT";
+ SV *tripwire = newSV(0);
+
+ sv_magicext(tripwire, 0, PERL_MAGIC_ext, &not_defined_vtbl, 0, 0);
+ SvPV_set(tripwire, (char *)value_for_notfound->name);
+ if(value_for_notfound->namelen >= 0) {
+ SvCUR_set(tripwire, value_for_notfound->namelen);
+ } else {
+ SvCUR_set(tripwire, -value_for_notfound->namelen);
+ SvUTF8_on(tripwire);
+ }
+ SvPOKp_on(tripwire);
+ SvREADONLY_on(tripwire);
+ assert(SvLEN(tripwire) == 0);
+
+ $add_symbol_subname($athx symbol_table, value_for_notfound->name,
+ value_for_notfound->namelen, tripwire);
+EXPLODE
+
+ /* Need to add prototypes, else parsing will vary by platform. */
+ SV **sv = hv_fetch(symbol_table, value_for_notfound->name,
+ value_for_notfound->namelen, TRUE);
+ if (!sv) {
+ Perl_croak($athx
+ "Couldn't add key '%s' to %%$package_sprintf_safe\::",
+ value_for_notfound->name);
+ }
+ if (!SvOK(*sv) && SvTYPE(*sv) != SVt_PVGV) {
+ /* Nothing was here before, so mark a prototype of "" */
+ sv_setpvn(*sv, "", 0);
+ } else if (SvPOK(*sv) && SvCUR(*sv) == 0) {
+ /* There is already a prototype of "" - do nothing */
+ } else {
+ /* Someone has been here before us - have to make a real
+ typeglob. */
+ /* It turns out to be incredibly hard to deal with all the
+ corner cases of sub foo (); and reporting errors correctly,
+ so lets cheat a bit. Start with a constant subroutine */
+ CV *cv = newCONSTSUB(symbol_table,
+ ${cast_CONSTSUB}value_for_notfound->name,
+ &PL_sv_yes);
+ /* and then turn it into a non constant declaration only. */
+ SvREFCNT_dec(CvXSUBANY(cv).any_ptr);
+ CvCONST_off(cv);
+ CvXSUB(cv) = NULL;
+ CvXSUBANY(cv).any_ptr = NULL;
+ }
+#ifndef SYMBIAN
+ if (!hv_store(${c_subname}_missing, value_for_notfound->name,
+ value_for_notfound->namelen, &PL_sv_yes, 0))
+ Perl_croak($athx "Couldn't add key '%s' to missing_hash",
+ value_for_notfound->name);
+#endif
+DONT
+
+ print $xs_fh <<"EOBOOT";
+
+ ++value_for_notfound;
+ }
+EOBOOT
+
+ foreach my $item (@$trouble) {
+ my ($name, $namelen, $value, $macro)
+ = $self->name_len_value_macro($item);
+ my $ifdef = $self->macro_to_ifdef($macro);
+ my $type = $item->{type};
+ my $type_to_value = $self->type_to_C_value($type);
+
+ print $xs_fh $ifdef;
+ if ($item->{invert_macro}) {
+ print $xs_fh
+ " /* This is the default value: */\n" if $type;
+ print $xs_fh "#else\n";
+ }
+ my $generator = $type_to_sv{$type};
+ die "Can't find generator code for type $type"
+ unless defined $generator;
+
+ print $xs_fh " {\n";
+ # We need to use a temporary value because some really troublesome
+ # items use C pre processor directives in their values, and in turn
+ # these don't fit nicely in the macro-ised generator functions
+ my $counter = 0;
+ printf $xs_fh " %s temp%d;\n", $_, $counter++
+ foreach @{$type_temporary{$type}};
+
+ print $xs_fh " $item->{pre}\n" if $item->{pre};
+
+ # And because the code in pre might be both declarations and
+ # statements, we can't declare and assign to the temporaries in one.
+ $counter = 0;
+ printf $xs_fh " temp%d = %s;\n", $counter++, $_
+ foreach &$type_to_value($value);
+
+ my @tempvarnames = map {sprintf 'temp%d', $_} 0 .. $counter - 1;
+ printf $xs_fh <<"EOBOOT", $name, &$generator(@tempvarnames);
+ ${c_subname}_add_symbol($athx symbol_table, "%s",
+ $namelen, %s);
+EOBOOT
+ print $xs_fh " $item->{post}\n" if $item->{post};
+ print $xs_fh " }\n";
+
+ print $xs_fh $self->macro_to_endif($macro);
+ }
+
+ print $xs_fh <<EOBOOT;
+ /* As we've been creating subroutines, we better invalidate any cached
+ methods */
+ ++PL_sub_generation;
+ }
+EOBOOT
+
+ print $xs_fh $explosives ? <<"EXPLODE" : <<"DONT";
+
+void
+$xs_subname(sv)
+ INPUT:
+ SV * sv;
+ PPCODE:
+ sv = newSVpvf("Your vendor has not defined $package_sprintf_safe macro %" SVf
+ ", used", sv);
+ PUSHs(sv_2mortal(sv));
+EXPLODE
+
+void
+$xs_subname(sv)
+ PREINIT:
+ STRLEN len;
+ INPUT:
+ SV * sv;
+ const char * s = SvPV(sv, len);
+ PPCODE:
+#ifdef SYMBIAN
+ sv = newSVpvf("%"SVf" is not a valid $package_sprintf_safe macro", sv);
+#else
+ HV *${c_subname}_missing = get_missing_hash(aTHX);
+ if (hv_exists(${c_subname}_missing, s, SvUTF8(sv) ? -(I32)len : (I32)len)) {
+ sv = newSVpvf("Your vendor has not defined $package_sprintf_safe macro %" SVf
+ ", used", sv);
+ } else {
+ sv = newSVpvf("%"SVf" is not a valid $package_sprintf_safe macro",
+ sv);
+ }
+#endif
+ PUSHs(sv_2mortal(sv));
+DONT
+
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant/Utils.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant/Utils.pm
new file mode 100755
index 00000000000..016507c72a6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant/Utils.pm
@@ -0,0 +1,131 @@
+package ExtUtils::Constant::Utils;
+
+use strict;
+use vars qw($VERSION @EXPORT_OK @ISA $is_perl56);
+use Carp;
+
+@ISA = 'Exporter';
+@EXPORT_OK = qw(C_stringify perl_stringify);
+$VERSION = '0.02';
+
+$is_perl56 = ($] < 5.007 && $] > 5.005_50);
+
+=head1 NAME
+
+ExtUtils::Constant::Utils - helper functions for ExtUtils::Constant
+
+=head1 SYNOPSIS
+
+ use ExtUtils::Constant::Utils qw (C_stringify);
+ $C_code = C_stringify $stuff;
+
+=head1 DESCRIPTION
+
+ExtUtils::Constant::Utils packages up utility subroutines used by
+ExtUtils::Constant, ExtUtils::Constant::Base and derived classes. All its
+functions are explicitly exportable.
+
+=head1 USAGE
+
+=over 4
+
+=item C_stringify NAME
+
+A function which returns a 7 bit ASCII correctly \ escaped version of the
+string passed suitable for C's "" or ''. It will die if passed Unicode
+characters.
+
+=cut
+
+# Hopefully make a happy C identifier.
+sub C_stringify {
+ local $_ = shift;
+ return unless defined $_;
+ # grr 5.6.1
+ confess "Wide character in '$_' intended as a C identifier"
+ if tr/\0-\377// != length;
+ # grr 5.6.1 moreso because its regexps will break on data that happens to
+ # be utf8, which includes my 8 bit test cases.
+ $_ = pack 'C*', unpack 'U*', $_ . pack 'U*' if $is_perl56;
+ s/\\/\\\\/g;
+ s/([\"\'])/\\$1/g; # Grr. fix perl mode.
+ s/\n/\\n/g; # Ensure newlines don't end up in octal
+ s/\r/\\r/g;
+ s/\t/\\t/g;
+ s/\f/\\f/g;
+ s/\a/\\a/g;
+ if (ord('A') == 193) { # EBCDIC has no ^\0-\177 workalike.
+ s/([[:^print:]])/sprintf "\\%03o", ord $1/ge;
+ } else {
+ s/([^\0-\177])/sprintf "\\%03o", ord $1/ge;
+ }
+ unless ($] < 5.006) {
+ # This will elicit a warning on 5.005_03 about [: :] being reserved unless
+ # I cheat
+ my $cheat = '([[:^print:]])';
+ s/$cheat/sprintf "\\%03o", ord $1/ge;
+ } else {
+ require POSIX;
+ s/([^A-Za-z0-9_])/POSIX::isprint($1) ? $1 : sprintf "\\%03o", ord $1/ge;
+ }
+ $_;
+}
+
+=item perl_stringify NAME
+
+A function which returns a 7 bit ASCII correctly \ escaped version of the
+string passed suitable for a perl "" string.
+
+=cut
+
+# Hopefully make a happy perl identifier.
+sub perl_stringify {
+ local $_ = shift;
+ return unless defined $_;
+ s/\\/\\\\/g;
+ s/([\"\'])/\\$1/g; # Grr. fix perl mode.
+ s/\n/\\n/g; # Ensure newlines don't end up in octal
+ s/\r/\\r/g;
+ s/\t/\\t/g;
+ s/\f/\\f/g;
+ s/\a/\\a/g;
+ unless ($] < 5.006) {
+ if ($] > 5.007) {
+ if (ord('A') == 193) { # EBCDIC has no ^\0-\177 workalike.
+ s/([[:^print:]])/sprintf "\\x{%X}", ord $1/ge;
+ } else {
+ s/([^\0-\177])/sprintf "\\x{%X}", ord $1/ge;
+ }
+ } else {
+ # Grr 5.6.1. And I don't think I can use utf8; to force the regexp
+ # because 5.005_03 will fail.
+ # This is grim, but I also can't split on //
+ my $copy;
+ foreach my $index (0 .. length ($_) - 1) {
+ my $char = substr ($_, $index, 1);
+ $copy .= ($char le "\177") ? $char : sprintf "\\x{%X}", ord $char;
+ }
+ $_ = $copy;
+ }
+ # This will elicit a warning on 5.005_03 about [: :] being reserved unless
+ # I cheat
+ my $cheat = '([[:^print:]])';
+ s/$cheat/sprintf "\\%03o", ord $1/ge;
+ } else {
+ # Turns out "\x{}" notation only arrived with 5.6
+ s/([^\0-\177])/sprintf "\\x%02X", ord $1/ge;
+ require POSIX;
+ s/([^A-Za-z0-9_])/POSIX::isprint($1) ? $1 : sprintf "\\%03o", ord $1/ge;
+ }
+ $_;
+}
+
+1;
+__END__
+
+=back
+
+=head1 AUTHOR
+
+Nicholas Clark <nick@ccl4.org> based on the code in C<h2xs> by Larry Wall and
+others
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant/XS.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant/XS.pm
new file mode 100755
index 00000000000..14eb8097146
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Constant/XS.pm
@@ -0,0 +1,259 @@
+package ExtUtils::Constant::XS;
+
+use strict;
+use vars qw($VERSION %XS_Constant %XS_TypeSet @ISA @EXPORT_OK $is_perl56);
+use Carp;
+use ExtUtils::Constant::Utils 'perl_stringify';
+require ExtUtils::Constant::Base;
+
+
+@ISA = qw(ExtUtils::Constant::Base Exporter);
+@EXPORT_OK = qw(%XS_Constant %XS_TypeSet);
+
+$VERSION = '0.03';
+
+$is_perl56 = ($] < 5.007 && $] > 5.005_50);
+
+=head1 NAME
+
+ExtUtils::Constant::XS - generate C code for XS modules' constants.
+
+=head1 SYNOPSIS
+
+ require ExtUtils::Constant::XS;
+
+=head1 DESCRIPTION
+
+ExtUtils::Constant::XS overrides ExtUtils::Constant::Base to generate C
+code for XS modules' constants.
+
+=head1 BUGS
+
+Nothing is documented.
+
+Probably others.
+
+=head1 AUTHOR
+
+Nicholas Clark <nick@ccl4.org> based on the code in C<h2xs> by Larry Wall and
+others
+
+=cut
+
+# '' is used as a flag to indicate non-ascii macro names, and hence the need
+# to pass in the utf8 on/off flag.
+%XS_Constant = (
+ '' => '',
+ IV => 'PUSHi(iv)',
+ UV => 'PUSHu((UV)iv)',
+ NV => 'PUSHn(nv)',
+ PV => 'PUSHp(pv, strlen(pv))',
+ PVN => 'PUSHp(pv, iv)',
+ SV => 'PUSHs(sv)',
+ YES => 'PUSHs(&PL_sv_yes)',
+ NO => 'PUSHs(&PL_sv_no)',
+ UNDEF => '', # implicit undef
+);
+
+%XS_TypeSet = (
+ IV => '*iv_return = ',
+ UV => '*iv_return = (IV)',
+ NV => '*nv_return = ',
+ PV => '*pv_return = ',
+ PVN => ['*pv_return = ', '*iv_return = (IV)'],
+ SV => '*sv_return = ',
+ YES => undef,
+ NO => undef,
+ UNDEF => undef,
+);
+
+sub header {
+ my $start = 1;
+ my @lines;
+ push @lines, "#define PERL_constant_NOTFOUND\t$start\n"; $start++;
+ push @lines, "#define PERL_constant_NOTDEF\t$start\n"; $start++;
+ foreach (sort keys %XS_Constant) {
+ next if $_ eq '';
+ push @lines, "#define PERL_constant_IS$_\t$start\n"; $start++;
+ }
+ push @lines, << 'EOT';
+
+#ifndef NVTYPE
+typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it. */
+#endif
+#ifndef aTHX_
+#define aTHX_ /* 5.6 or later define this for threading support. */
+#endif
+#ifndef pTHX_
+#define pTHX_ /* 5.6 or later define this for threading support. */
+#endif
+EOT
+
+ return join '', @lines;
+}
+
+sub valid_type {
+ my ($self, $type) = @_;
+ return exists $XS_TypeSet{$type};
+}
+
+# This might actually be a return statement
+sub assignment_clause_for_type {
+ my $self = shift;
+ my $args = shift;
+ my $type = $args->{type};
+ my $typeset = $XS_TypeSet{$type};
+ if (ref $typeset) {
+ die "Type $type is aggregate, but only single value given"
+ if @_ == 1;
+ return map {"$typeset->[$_]$_[$_];"} 0 .. $#$typeset;
+ } elsif (defined $typeset) {
+ confess "Aggregate value given for type $type"
+ if @_ > 1;
+ return "$typeset$_[0];";
+ }
+ return ();
+}
+
+sub return_statement_for_type {
+ my ($self, $type) = @_;
+ # In the future may pass in an options hash
+ $type = $type->{type} if ref $type;
+ "return PERL_constant_IS$type;";
+}
+
+sub return_statement_for_notdef {
+ # my ($self) = @_;
+ "return PERL_constant_NOTDEF;";
+}
+
+sub return_statement_for_notfound {
+ # my ($self) = @_;
+ "return PERL_constant_NOTFOUND;";
+}
+
+sub default_type {
+ 'IV';
+}
+
+sub macro_from_name {
+ my ($self, $item) = @_;
+ my $macro = $item->{name};
+ $macro = $item->{value} unless defined $macro;
+ $macro;
+}
+
+sub macro_from_item {
+ my ($self, $item) = @_;
+ my $macro = $item->{macro};
+ $macro = $self->macro_from_name($item) unless defined $macro;
+ $macro;
+}
+
+# Keep to the traditional perl source macro
+sub memEQ {
+ "memEQ";
+}
+
+sub params {
+ my ($self, $what) = @_;
+ foreach (sort keys %$what) {
+ warn "ExtUtils::Constant doesn't know how to handle values of type $_" unless defined $XS_Constant{$_};
+ }
+ my $params = {};
+ $params->{''} = 1 if $what->{''};
+ $params->{IV} = 1 if $what->{IV} || $what->{UV} || $what->{PVN};
+ $params->{NV} = 1 if $what->{NV};
+ $params->{PV} = 1 if $what->{PV} || $what->{PVN};
+ $params->{SV} = 1 if $what->{SV};
+ return $params;
+}
+
+
+sub C_constant_prefix_param {
+ "aTHX_ ";
+}
+
+sub C_constant_prefix_param_defintion {
+ "pTHX_ ";
+}
+
+sub namelen_param_definition {
+ 'STRLEN ' . $_[0] -> namelen_param;
+}
+
+sub C_constant_other_params_defintion {
+ my ($self, $params) = @_;
+ my $body = '';
+ $body .= ", int utf8" if $params->{''};
+ $body .= ", IV *iv_return" if $params->{IV};
+ $body .= ", NV *nv_return" if $params->{NV};
+ $body .= ", const char **pv_return" if $params->{PV};
+ $body .= ", SV **sv_return" if $params->{SV};
+ $body;
+}
+
+sub C_constant_other_params {
+ my ($self, $params) = @_;
+ my $body = '';
+ $body .= ", utf8" if $params->{''};
+ $body .= ", iv_return" if $params->{IV};
+ $body .= ", nv_return" if $params->{NV};
+ $body .= ", pv_return" if $params->{PV};
+ $body .= ", sv_return" if $params->{SV};
+ $body;
+}
+
+sub dogfood {
+ my ($self, $args, @items) = @_;
+ my ($package, $subname, $default_type, $what, $indent, $breakout) =
+ @{$args}{qw(package subname default_type what indent breakout)};
+ my $result = <<"EOT";
+ /* When generated this function returned values for the list of names given
+ in this section of perl code. Rather than manually editing these functions
+ to add or remove constants, which would result in this comment and section
+ of code becoming inaccurate, we recommend that you edit this section of
+ code, and use it to regenerate a new set of constant functions which you
+ then use to replace the originals.
+
+ Regenerate these constant functions by feeding this entire source file to
+ perl -x
+
+#!$^X -w
+use ExtUtils::Constant qw (constant_types C_constant XS_constant);
+
+EOT
+ $result .= $self->dump_names ({default_type=>$default_type, what=>$what,
+ indent=>0, declare_types=>1},
+ @items);
+ $result .= <<'EOT';
+
+print constant_types(), "\n"; # macro defs
+EOT
+ $package = perl_stringify($package);
+ $result .=
+ "foreach (C_constant (\"$package\", '$subname', '$default_type', \$types, ";
+ # The form of the indent parameter isn't defined. (Yet)
+ if (defined $indent) {
+ require Data::Dumper;
+ $Data::Dumper::Terse=1;
+ $Data::Dumper::Terse=1; # Not used once. :-)
+ chomp ($indent = Data::Dumper::Dumper ($indent));
+ $result .= $indent;
+ } else {
+ $result .= 'undef';
+ }
+ $result .= ", $breakout" . ', @names) ) {
+ print $_, "\n"; # C constant subs
+}
+print "\n#### XS Section:\n";
+print XS_constant ("' . $package . '", $types);
+__END__
+ */
+
+';
+
+ $result;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Embed.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Embed.pm
new file mode 100755
index 00000000000..24ae9092f52
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Embed.pm
@@ -0,0 +1,511 @@
+# $Id: Embed.pm,v 1.1.1.1 2002/01/16 19:27:19 schwern Exp $
+require 5.002;
+
+package ExtUtils::Embed;
+require Exporter;
+require FileHandle;
+use Config;
+use Getopt::Std;
+use File::Spec;
+
+#Only when we need them
+#require ExtUtils::MakeMaker;
+#require ExtUtils::Liblist;
+
+use vars qw(@ISA @EXPORT $VERSION
+ @Extensions $Verbose $lib_ext
+ $opt_o $opt_s
+ );
+use strict;
+
+# This is not a dual-life module, so no need for development version numbers
+$VERSION = '1.28';
+
+@ISA = qw(Exporter);
+@EXPORT = qw(&xsinit &ldopts
+ &ccopts &ccflags &ccdlflags &perl_inc
+ &xsi_header &xsi_protos &xsi_body);
+
+#let's have Miniperl borrow from us instead
+#require ExtUtils::Miniperl;
+#*canon = \&ExtUtils::Miniperl::canon;
+
+$Verbose = 0;
+$lib_ext = $Config{lib_ext} || '.a';
+
+sub is_cmd { $0 eq '-e' }
+
+sub my_return {
+ my $val = shift;
+ if(is_cmd) {
+ print $val;
+ }
+ else {
+ return $val;
+ }
+}
+
+sub xsinit {
+ my($file, $std, $mods) = @_;
+ my($fh,@mods,%seen);
+ $file ||= "perlxsi.c";
+ my $xsinit_proto = "pTHX";
+
+ if (@_) {
+ @mods = @$mods if $mods;
+ }
+ else {
+ getopts('o:s:');
+ $file = $opt_o if defined $opt_o;
+ $std = $opt_s if defined $opt_s;
+ @mods = @ARGV;
+ }
+ $std = 1 unless scalar @mods;
+
+ if ($file eq "STDOUT") {
+ $fh = \*STDOUT;
+ }
+ else {
+ $fh = new FileHandle "> $file";
+ }
+
+ push(@mods, static_ext()) if defined $std;
+ @mods = grep(!$seen{$_}++, @mods);
+
+ print $fh &xsi_header();
+ print $fh "EXTERN_C void xs_init ($xsinit_proto);\n\n";
+ print $fh &xsi_protos(@mods);
+
+ print $fh "\nEXTERN_C void\nxs_init($xsinit_proto)\n{\n";
+ print $fh &xsi_body(@mods);
+ print $fh "}\n";
+
+}
+
+sub xsi_header {
+ return <<EOF;
+#include <EXTERN.h>
+#include <perl.h>
+
+EOF
+}
+
+sub xsi_protos {
+ my(@exts) = @_;
+ my(@retval,%seen);
+ my $boot_proto = "pTHX_ CV* cv";
+ foreach $_ (@exts){
+ my($pname) = canon('/', $_);
+ my($mname, $cname);
+ ($mname = $pname) =~ s!/!::!g;
+ ($cname = $pname) =~ s!/!__!g;
+ my($ccode) = "EXTERN_C void boot_${cname} ($boot_proto);\n";
+ next if $seen{$ccode}++;
+ push(@retval, $ccode);
+ }
+ return join '', @retval;
+}
+
+sub xsi_body {
+ my(@exts) = @_;
+ my($pname,@retval,%seen);
+ my($dl) = canon('/','DynaLoader');
+ push(@retval, "\tchar *file = __FILE__;\n");
+ push(@retval, "\tdXSUB_SYS;\n") if $] > 5.002;
+ push(@retval, "\n");
+
+ foreach $_ (@exts){
+ my($pname) = canon('/', $_);
+ my($mname, $cname, $ccode);
+ ($mname = $pname) =~ s!/!::!g;
+ ($cname = $pname) =~ s!/!__!g;
+ if ($pname eq $dl){
+ # Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'!
+ # boot_DynaLoader is called directly in DynaLoader.pm
+ $ccode = "\t/* DynaLoader is a special case */\n\tnewXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n";
+ push(@retval, $ccode) unless $seen{$ccode}++;
+ } else {
+ $ccode = "\tnewXS(\"${mname}::bootstrap\", boot_${cname}, file);\n";
+ push(@retval, $ccode) unless $seen{$ccode}++;
+ }
+ }
+ return join '', @retval;
+}
+
+sub static_ext {
+ unless (scalar @Extensions) {
+ my $static_ext = $Config{static_ext};
+ $static_ext =~ s/^\s+//;
+ @Extensions = sort split /\s+/, $static_ext;
+ unshift @Extensions, qw(DynaLoader);
+ }
+ @Extensions;
+}
+
+sub _escape {
+ my $arg = shift;
+ $$arg =~ s/([\(\)])/\\$1/g;
+}
+
+sub _ldflags {
+ my $ldflags = $Config{ldflags};
+ _escape(\$ldflags);
+ return $ldflags;
+}
+
+sub _ccflags {
+ my $ccflags = $Config{ccflags};
+ _escape(\$ccflags);
+ return $ccflags;
+}
+
+sub _ccdlflags {
+ my $ccdlflags = $Config{ccdlflags};
+ _escape(\$ccdlflags);
+ return $ccdlflags;
+}
+
+sub ldopts {
+ require ExtUtils::MakeMaker;
+ require ExtUtils::Liblist;
+ my($std,$mods,$link_args,$path) = @_;
+ my(@mods,@link_args,@argv);
+ my($dllib,$config_libs,@potential_libs,@path);
+ local($") = ' ' unless $" eq ' ';
+ if (scalar @_) {
+ @link_args = @$link_args if $link_args;
+ @mods = @$mods if $mods;
+ }
+ else {
+ @argv = @ARGV;
+ #hmm
+ while($_ = shift @argv) {
+ /^-std$/ && do { $std = 1; next; };
+ /^--$/ && do { @link_args = @argv; last; };
+ /^-I(.*)/ && do { $path = $1 || shift @argv; next; };
+ push(@mods, $_);
+ }
+ }
+ $std = 1 unless scalar @link_args;
+ my $sep = $Config{path_sep} || ':';
+ @path = $path ? split(/\Q$sep/, $path) : @INC;
+
+ push(@potential_libs, @link_args) if scalar @link_args;
+ # makemaker includes std libs on windows by default
+ if ($^O ne 'MSWin32' and defined($std)) {
+ push(@potential_libs, $Config{perllibs});
+ }
+
+ push(@mods, static_ext()) if $std;
+
+ my($mod,@ns,$root,$sub,$extra,$archive,@archives);
+ print STDERR "Searching (@path) for archives\n" if $Verbose;
+ foreach $mod (@mods) {
+ @ns = split(/::|\/|\\/, $mod);
+ $sub = $ns[-1];
+ $root = File::Spec->catdir(@ns);
+
+ print STDERR "searching for '$sub${lib_ext}'\n" if $Verbose;
+ foreach (@path) {
+ next unless -e ($archive = File::Spec->catdir($_,"auto",$root,"$sub$lib_ext"));
+ push @archives, $archive;
+ if(-e ($extra = File::Spec->catdir($_,"auto",$root,"extralibs.ld"))) {
+ local(*FH);
+ if(open(FH, $extra)) {
+ my($libs) = <FH>; chomp $libs;
+ push @potential_libs, split /\s+/, $libs;
+ }
+ else {
+ warn "Couldn't open '$extra'";
+ }
+ }
+ last;
+ }
+ }
+ #print STDERR "\@potential_libs = @potential_libs\n";
+
+ my $libperl;
+ if ($^O eq 'MSWin32') {
+ $libperl = $Config{libperl};
+ }
+ elsif ($^O eq 'os390' && $Config{usedl}) {
+ # Nothing for OS/390 (z/OS) dynamic.
+ } else {
+ $libperl = (grep(/^-l\w*perl\w*$/, @link_args))[0]
+ || ($Config{libperl} =~ /^lib(\w+)(\Q$lib_ext\E|\.\Q$Config{dlext}\E)$/
+ ? "-l$1" : '')
+ || "-lperl";
+ }
+
+ my $lpath = File::Spec->catdir($Config{archlibexp}, 'CORE');
+ $lpath = qq["$lpath"] if $^O eq 'MSWin32';
+ my($extralibs, $bsloadlibs, $ldloadlibs, $ld_run_path) =
+ MM->ext(join ' ', "-L$lpath", $libperl, @potential_libs);
+
+ my $ld_or_bs = $bsloadlibs || $ldloadlibs;
+ print STDERR "bs: $bsloadlibs ** ld: $ldloadlibs" if $Verbose;
+ my $ccdlflags = _ccdlflags();
+ my $ldflags = _ldflags();
+ my $linkage = "$ccdlflags $ldflags @archives $ld_or_bs";
+ print STDERR "ldopts: '$linkage'\n" if $Verbose;
+
+ return $linkage if scalar @_;
+ my_return("$linkage\n");
+}
+
+sub ccflags {
+ my $ccflags = _ccflags();
+ my_return(" $ccflags ");
+}
+
+sub ccdlflags {
+ my $ccdlflags = _ccdlflags();
+ my_return(" $ccdlflags ");
+}
+
+sub perl_inc {
+ my $dir = File::Spec->catdir($Config{archlibexp}, 'CORE');
+ $dir = qq["$dir"] if $^O eq 'MSWin32';
+ my_return(" -I$dir ");
+}
+
+sub ccopts {
+ ccflags . perl_inc;
+}
+
+sub canon {
+ my($as, @ext) = @_;
+ foreach(@ext) {
+ # might be X::Y or lib/auto/X/Y/Y.a
+ next if s!::!/!g;
+ s:^(lib|ext)/(auto/)?::;
+ s:/\w+\.\w+$::;
+ }
+ map(s:/:$as:, @ext) if ($as ne '/');
+ @ext;
+}
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Embed - Utilities for embedding Perl in C/C++ applications
+
+=head1 SYNOPSIS
+
+
+ perl -MExtUtils::Embed -e xsinit
+ perl -MExtUtils::Embed -e ccopts
+ perl -MExtUtils::Embed -e ldopts
+
+=head1 DESCRIPTION
+
+ExtUtils::Embed provides utility functions for embedding a Perl interpreter
+and extensions in your C/C++ applications.
+Typically, an application B<Makefile> will invoke ExtUtils::Embed
+functions while building your application.
+
+=head1 @EXPORT
+
+ExtUtils::Embed exports the following functions:
+
+xsinit(), ldopts(), ccopts(), perl_inc(), ccflags(),
+ccdlflags(), xsi_header(), xsi_protos(), xsi_body()
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item xsinit()
+
+Generate C/C++ code for the XS initializer function.
+
+When invoked as C<`perl -MExtUtils::Embed -e xsinit --`>
+the following options are recognized:
+
+B<-o> E<lt>output filenameE<gt> (Defaults to B<perlxsi.c>)
+
+B<-o STDOUT> will print to STDOUT.
+
+B<-std> (Write code for extensions that are linked with the current Perl.)
+
+Any additional arguments are expected to be names of modules
+to generate code for.
+
+When invoked with parameters the following are accepted and optional:
+
+C<xsinit($filename,$std,[@modules])>
+
+Where,
+
+B<$filename> is equivalent to the B<-o> option.
+
+B<$std> is boolean, equivalent to the B<-std> option.
+
+B<[@modules]> is an array ref, same as additional arguments mentioned above.
+
+=item Examples
+
+
+ perl -MExtUtils::Embed -e xsinit -- -o xsinit.c Socket
+
+
+This will generate code with an B<xs_init> function that glues the perl B<Socket::bootstrap> function
+to the C B<boot_Socket> function and writes it to a file named F<xsinit.c>.
+
+Note that B<DynaLoader> is a special case where it must call B<boot_DynaLoader> directly.
+
+ perl -MExtUtils::Embed -e xsinit
+
+
+This will generate code for linking with B<DynaLoader> and
+each static extension found in B<$Config{static_ext}>.
+The code is written to the default file name B<perlxsi.c>.
+
+
+ perl -MExtUtils::Embed -e xsinit -- -o xsinit.c -std DBI DBD::Oracle
+
+
+Here, code is written for all the currently linked extensions along with code
+for B<DBI> and B<DBD::Oracle>.
+
+If you have a working B<DynaLoader> then there is rarely any need to statically link in any
+other extensions.
+
+=item ldopts()
+
+Output arguments for linking the Perl library and extensions to your
+application.
+
+When invoked as C<`perl -MExtUtils::Embed -e ldopts --`>
+the following options are recognized:
+
+B<-std>
+
+Output arguments for linking the Perl library and any extensions linked
+with the current Perl.
+
+B<-I> E<lt>path1:path2E<gt>
+
+Search path for ModuleName.a archives.
+Default path is B<@INC>.
+Library archives are expected to be found as
+B</some/path/auto/ModuleName/ModuleName.a>
+For example, when looking for B<Socket.a> relative to a search path,
+we should find B<auto/Socket/Socket.a>
+
+When looking for B<DBD::Oracle> relative to a search path,
+we should find B<auto/DBD/Oracle/Oracle.a>
+
+Keep in mind that you can always supply B</my/own/path/ModuleName.a>
+as an additional linker argument.
+
+B<--> E<lt>list of linker argsE<gt>
+
+Additional linker arguments to be considered.
+
+Any additional arguments found before the B<--> token
+are expected to be names of modules to generate code for.
+
+When invoked with parameters the following are accepted and optional:
+
+C<ldopts($std,[@modules],[@link_args],$path)>
+
+Where:
+
+B<$std> is boolean, equivalent to the B<-std> option.
+
+B<[@modules]> is equivalent to additional arguments found before the B<--> token.
+
+B<[@link_args]> is equivalent to arguments found after the B<--> token.
+
+B<$path> is equivalent to the B<-I> option.
+
+In addition, when ldopts is called with parameters, it will return the argument string
+rather than print it to STDOUT.
+
+=item Examples
+
+
+ perl -MExtUtils::Embed -e ldopts
+
+
+This will print arguments for linking with B<libperl> and
+extensions found in B<$Config{static_ext}>. This includes libraries
+found in B<$Config{libs}> and the first ModuleName.a library
+for each extension that is found by searching B<@INC> or the path
+specified by the B<-I> option.
+In addition, when ModuleName.a is found, additional linker arguments
+are picked up from the B<extralibs.ld> file in the same directory.
+
+
+ perl -MExtUtils::Embed -e ldopts -- -std Socket
+
+
+This will do the same as the above example, along with printing additional arguments for linking with the B<Socket> extension.
+
+ perl -MExtUtils::Embed -e ldopts -- -std Msql -- -L/usr/msql/lib -lmsql
+
+Any arguments after the second '--' token are additional linker
+arguments that will be examined for potential conflict. If there is no
+conflict, the additional arguments will be part of the output.
+
+
+=item perl_inc()
+
+For including perl header files this function simply prints:
+
+ -I$Config{archlibexp}/CORE
+
+So, rather than having to say:
+
+ perl -MConfig -e 'print "-I$Config{archlibexp}/CORE"'
+
+Just say:
+
+ perl -MExtUtils::Embed -e perl_inc
+
+=item ccflags(), ccdlflags()
+
+These functions simply print $Config{ccflags} and $Config{ccdlflags}
+
+=item ccopts()
+
+This function combines perl_inc(), ccflags() and ccdlflags() into one.
+
+=item xsi_header()
+
+This function simply returns a string defining the same B<EXTERN_C> macro as
+B<perlmain.c> along with #including B<perl.h> and B<EXTERN.h>.
+
+=item xsi_protos(@modules)
+
+This function returns a string of B<boot_$ModuleName> prototypes for each @modules.
+
+=item xsi_body(@modules)
+
+This function returns a string of calls to B<newXS()> that glue the module B<bootstrap>
+function to B<boot_ModuleName> for each @modules.
+
+B<xsinit()> uses the xsi_* functions to generate most of its code.
+
+=back
+
+=head1 EXAMPLES
+
+For examples on how to use B<ExtUtils::Embed> for building C/C++ applications
+with embedded perl, see L<perlembed>.
+
+=head1 SEE ALSO
+
+L<perlembed>
+
+=head1 AUTHOR
+
+Doug MacEachern E<lt>F<dougm@osf.org>E<gt>
+
+Based on ideas from Tim Bunce E<lt>F<Tim.Bunce@ig.co.uk>E<gt> and
+B<minimod.pl> by Andreas Koenig E<lt>F<k@anna.in-berlin.de>E<gt> and Tim Bunce.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Install.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Install.pm
new file mode 100755
index 00000000000..c886c69bf2e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Install.pm
@@ -0,0 +1,1356 @@
+package ExtUtils::Install;
+use strict;
+
+use vars qw(@ISA @EXPORT $VERSION $MUST_REBOOT %Config);
+
+use AutoSplit;
+use Carp ();
+use Config qw(%Config);
+use Cwd qw(cwd);
+use Exporter;
+use ExtUtils::Packlist;
+use File::Basename qw(dirname);
+use File::Compare qw(compare);
+use File::Copy;
+use File::Find qw(find);
+use File::Path;
+use File::Spec;
+
+
+@ISA = ('Exporter');
+@EXPORT = ('install','uninstall','pm_to_blib', 'install_default');
+
+=pod
+
+=head1 NAME
+
+ExtUtils::Install - install files from here to there
+
+=head1 SYNOPSIS
+
+ use ExtUtils::Install;
+
+ install({ 'blib/lib' => 'some/install/dir' } );
+
+ uninstall($packlist);
+
+ pm_to_blib({ 'lib/Foo/Bar.pm' => 'blib/lib/Foo/Bar.pm' });
+
+=head1 VERSION
+
+1.54
+
+=cut
+
+$VERSION = '1.54'; # <---- dont forget to update the POD section just above this line!
+$VERSION = eval $VERSION;
+
+=pod
+
+=head1 DESCRIPTION
+
+Handles the installing and uninstalling of perl modules, scripts, man
+pages, etc...
+
+Both install() and uninstall() are specific to the way
+ExtUtils::MakeMaker handles the installation and deinstallation of
+perl modules. They are not designed as general purpose tools.
+
+On some operating systems such as Win32 installation may not be possible
+until after a reboot has occured. This can have varying consequences:
+removing an old DLL does not impact programs using the new one, but if
+a new DLL cannot be installed properly until reboot then anything
+depending on it must wait. The package variable
+
+ $ExtUtils::Install::MUST_REBOOT
+
+is used to store this status.
+
+If this variable is true then such an operation has occured and
+anything depending on this module cannot proceed until a reboot
+has occured.
+
+If this value is defined but false then such an operation has
+ocurred, but should not impact later operations.
+
+=begin _private
+
+=item _chmod($$;$)
+
+Wrapper to chmod() for debugging and error trapping.
+
+=item _warnonce(@)
+
+Warns about something only once.
+
+=item _choke(@)
+
+Dies with a special message.
+
+=end _private
+
+=cut
+
+my $Is_VMS = $^O eq 'VMS';
+my $Is_VMS_noefs = $Is_VMS;
+my $Is_MacPerl = $^O eq 'MacOS';
+my $Is_Win32 = $^O eq 'MSWin32';
+my $Is_cygwin = $^O eq 'cygwin';
+my $CanMoveAtBoot = ($Is_Win32 || $Is_cygwin);
+
+ if( $Is_VMS ) {
+ my $vms_unix_rpt;
+ my $vms_efs;
+ my $vms_case;
+
+ if (eval { local $SIG{__DIE__}; require VMS::Feature; }) {
+ $vms_unix_rpt = VMS::Feature::current("filename_unix_report");
+ $vms_efs = VMS::Feature::current("efs_charset");
+ $vms_case = VMS::Feature::current("efs_case_preserve");
+ } else {
+ my $unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
+ my $efs_charset = $ENV{'DECC$EFS_CHARSET'} || '';
+ my $efs_case = $ENV{'DECC$EFS_CASE_PRESERVE'} || '';
+ $vms_unix_rpt = $unix_rpt =~ /^[ET1]/i;
+ $vms_efs = $efs_charset =~ /^[ET1]/i;
+ $vms_case = $efs_case =~ /^[ET1]/i;
+ }
+ $Is_VMS_noefs = 0 if ($vms_efs);
+ }
+
+
+
+# *note* CanMoveAtBoot is only incidentally the same condition as below
+# this needs not hold true in the future.
+my $Has_Win32API_File = ($Is_Win32 || $Is_cygwin)
+ ? (eval {require Win32API::File; 1} || 0)
+ : 0;
+
+
+my $Inc_uninstall_warn_handler;
+
+# install relative to here
+
+my $INSTALL_ROOT = $ENV{PERL_INSTALL_ROOT};
+
+my $Curdir = File::Spec->curdir;
+my $Updir = File::Spec->updir;
+
+sub _estr(@) {
+ return join "\n",'!' x 72,@_,'!' x 72,'';
+}
+
+{my %warned;
+sub _warnonce(@) {
+ my $first=shift;
+ my $msg=_estr "WARNING: $first",@_;
+ warn $msg unless $warned{$msg}++;
+}}
+
+sub _choke(@) {
+ my $first=shift;
+ my $msg=_estr "ERROR: $first",@_;
+ Carp::croak($msg);
+}
+
+
+sub _chmod($$;$) {
+ my ( $mode, $item, $verbose )=@_;
+ $verbose ||= 0;
+ if (chmod $mode, $item) {
+ printf "chmod(0%o, %s)\n",$mode, $item if $verbose > 1;
+ } else {
+ my $err="$!";
+ _warnonce sprintf "WARNING: Failed chmod(0%o, %s): %s\n",
+ $mode, $item, $err
+ if -e $item;
+ }
+}
+
+=begin _private
+
+=item _move_file_at_boot( $file, $target, $moan )
+
+OS-Specific, Win32/Cygwin
+
+Schedules a file to be moved/renamed/deleted at next boot.
+$file should be a filespec of an existing file
+$target should be a ref to an array if the file is to be deleted
+otherwise it should be a filespec for a rename. If the file is existing
+it will be replaced.
+
+Sets $MUST_REBOOT to 0 to indicate a deletion operation has occured
+and sets it to 1 to indicate that a move operation has been requested.
+
+returns 1 on success, on failure if $moan is false errors are fatal.
+If $moan is true then returns 0 on error and warns instead of dies.
+
+=end _private
+
+=cut
+
+
+
+sub _move_file_at_boot { #XXX OS-SPECIFIC
+ my ( $file, $target, $moan )= @_;
+ Carp::confess("Panic: Can't _move_file_at_boot on this platform!")
+ unless $CanMoveAtBoot;
+
+ my $descr= ref $target
+ ? "'$file' for deletion"
+ : "'$file' for installation as '$target'";
+
+ if ( ! $Has_Win32API_File ) {
+
+ my @msg=(
+ "Cannot schedule $descr at reboot.",
+ "Try installing Win32API::File to allow operations on locked files",
+ "to be scheduled during reboot. Or try to perform the operation by",
+ "hand yourself. (You may need to close other perl processes first)"
+ );
+ if ( $moan ) { _warnonce(@msg) } else { _choke(@msg) }
+ return 0;
+ }
+ my $opts= Win32API::File::MOVEFILE_DELAY_UNTIL_REBOOT();
+ $opts= $opts | Win32API::File::MOVEFILE_REPLACE_EXISTING()
+ unless ref $target;
+
+ _chmod( 0666, $file );
+ _chmod( 0666, $target ) unless ref $target;
+
+ if (Win32API::File::MoveFileEx( $file, $target, $opts )) {
+ $MUST_REBOOT ||= ref $target ? 0 : 1;
+ return 1;
+ } else {
+ my @msg=(
+ "MoveFileEx $descr at reboot failed: $^E",
+ "You may try to perform the operation by hand yourself. ",
+ "(You may need to close other perl processes first).",
+ );
+ if ( $moan ) { _warnonce(@msg) } else { _choke(@msg) }
+ }
+ return 0;
+}
+
+
+=begin _private
+
+=item _unlink_or_rename( $file, $tryhard, $installing )
+
+OS-Specific, Win32/Cygwin
+
+Tries to get a file out of the way by unlinking it or renaming it. On
+some OS'es (Win32 based) DLL files can end up locked such that they can
+be renamed but not deleted. Likewise sometimes a file can be locked such
+that it cant even be renamed or changed except at reboot. To handle
+these cases this routine finds a tempfile name that it can either rename
+the file out of the way or use as a proxy for the install so that the
+rename can happen later (at reboot).
+
+ $file : the file to remove.
+ $tryhard : should advanced tricks be used for deletion
+ $installing : we are not merely deleting but we want to overwrite
+
+When $tryhard is not true if the unlink fails its fatal. When $tryhard
+is true then the file is attempted to be renamed. The renamed file is
+then scheduled for deletion. If the rename fails then $installing
+governs what happens. If it is false the failure is fatal. If it is true
+then an attempt is made to schedule installation at boot using a
+temporary file to hold the new file. If this fails then a fatal error is
+thrown, if it succeeds it returns the temporary file name (which will be
+a derivative of the original in the same directory) so that the caller can
+use it to install under. In all other cases of success returns $file.
+On failure throws a fatal error.
+
+=end _private
+
+=cut
+
+
+
+sub _unlink_or_rename { #XXX OS-SPECIFIC
+ my ( $file, $tryhard, $installing )= @_;
+
+ _chmod( 0666, $file );
+ my $unlink_count = 0;
+ while (unlink $file) { $unlink_count++; }
+ return $file if $unlink_count > 0;
+ my $error="$!";
+
+ _choke("Cannot unlink '$file': $!")
+ unless $CanMoveAtBoot && $tryhard;
+
+ my $tmp= "AAA";
+ ++$tmp while -e "$file.$tmp";
+ $tmp= "$file.$tmp";
+
+ warn "WARNING: Unable to unlink '$file': $error\n",
+ "Going to try to rename it to '$tmp'.\n";
+
+ if ( rename $file, $tmp ) {
+ warn "Rename succesful. Scheduling '$tmp'\nfor deletion at reboot.\n";
+ # when $installing we can set $moan to true.
+ # IOW, if we cant delete the renamed file at reboot its
+ # not the end of the world. The other cases are more serious
+ # and need to be fatal.
+ _move_file_at_boot( $tmp, [], $installing );
+ return $file;
+ } elsif ( $installing ) {
+ _warnonce("Rename failed: $!. Scheduling '$tmp'\nfor".
+ " installation as '$file' at reboot.\n");
+ _move_file_at_boot( $tmp, $file );
+ return $tmp;
+ } else {
+ _choke("Rename failed:$!", "Cannot procede.");
+ }
+
+}
+
+
+=pod
+
+=head2 Functions
+
+=begin _private
+
+=item _get_install_skip
+
+Handles loading the INSTALL.SKIP file. Returns an array of patterns to use.
+
+=cut
+
+
+
+sub _get_install_skip {
+ my ( $skip, $verbose )= @_;
+ if ($ENV{EU_INSTALL_IGNORE_SKIP}) {
+ print "EU_INSTALL_IGNORE_SKIP is set, ignore skipfile settings\n"
+ if $verbose>2;
+ return [];
+ }
+ if ( ! defined $skip ) {
+ print "Looking for install skip list\n"
+ if $verbose>2;
+ for my $file ( 'INSTALL.SKIP', $ENV{EU_INSTALL_SITE_SKIPFILE} ) {
+ next unless $file;
+ print "\tChecking for $file\n"
+ if $verbose>2;
+ if (-e $file) {
+ $skip= $file;
+ last;
+ }
+ }
+ }
+ if ($skip && !ref $skip) {
+ print "Reading skip patterns from '$skip'.\n"
+ if $verbose;
+ if (open my $fh,$skip ) {
+ my @patterns;
+ while (<$fh>) {
+ chomp;
+ next if /^\s*(?:#|$)/;
+ print "\tSkip pattern: $_\n" if $verbose>3;
+ push @patterns, $_;
+ }
+ $skip= \@patterns;
+ } else {
+ warn "Can't read skip file:'$skip':$!\n";
+ $skip=[];
+ }
+ } elsif ( UNIVERSAL::isa($skip,'ARRAY') ) {
+ print "Using array for skip list\n"
+ if $verbose>2;
+ } elsif ($verbose) {
+ print "No skip list found.\n"
+ if $verbose>1;
+ $skip= [];
+ }
+ warn "Got @{[0+@$skip]} skip patterns.\n"
+ if $verbose>3;
+ return $skip
+}
+
+=pod
+
+=item _have_write_access
+
+Abstract a -w check that tries to use POSIX::access() if possible.
+
+=cut
+
+{
+ my $has_posix;
+ sub _have_write_access {
+ my $dir=shift;
+ unless (defined $has_posix) {
+ $has_posix= (!$Is_cygwin && !$Is_Win32
+ && eval 'local $^W; require POSIX; 1') || 0;
+ }
+ if ($has_posix) {
+ return POSIX::access($dir, POSIX::W_OK());
+ } else {
+ return -w $dir;
+ }
+ }
+}
+
+=pod
+
+=item _can_write_dir(C<$dir>)
+
+Checks whether a given directory is writable, taking account
+the possibility that the directory might not exist and would have to
+be created first.
+
+Returns a list, containing: C<($writable, $determined_by, @create)>
+
+C<$writable> says whether whether the directory is (hypothetically) writable
+
+C<$determined_by> is the directory the status was determined from. It will be
+either the C<$dir>, or one of its parents.
+
+C<@create> is a list of directories that would probably have to be created
+to make the requested directory. It may not actually be correct on
+relative paths with C<..> in them. But for our purposes it should work ok
+
+=cut
+
+
+sub _can_write_dir {
+ my $dir=shift;
+ return
+ unless defined $dir and length $dir;
+
+ my ($vol, $dirs, $file) = File::Spec->splitpath($dir,1);
+ my @dirs = File::Spec->splitdir($dirs);
+ unshift @dirs, File::Spec->curdir
+ unless File::Spec->file_name_is_absolute($dir);
+
+ my $path='';
+ my @make;
+ while (@dirs) {
+ if ($Is_VMS_noefs) {
+ # There is a bug in catdir that is fixed when the EFS character
+ # set is enabled, which requires this VMS specific code.
+ $dir = File::Spec->catdir($vol,@dirs);
+ }
+ else {
+ $dir = File::Spec->catdir(@dirs);
+ $dir = File::Spec->catpath($vol,$dir,'')
+ if defined $vol and length $vol;
+ }
+ next if ( $dir eq $path );
+ if ( ! -e $dir ) {
+ unshift @make,$dir;
+ next;
+ }
+ if ( _have_write_access($dir) ) {
+ return 1,$dir,@make
+ } else {
+ return 0,$dir,@make
+ }
+ } continue {
+ pop @dirs;
+ }
+ return 0;
+}
+
+=pod
+
+=item _mkpath($dir,$show,$mode,$verbose,$dry_run)
+
+Wrapper around File::Path::mkpath() to handle errors.
+
+If $verbose is true and >1 then additional diagnostics will be produced, also
+this will force $show to true.
+
+If $dry_run is true then the directory will not be created but a check will be
+made to see whether it would be possible to write to the directory, or that
+it would be possible to create the directory.
+
+If $dry_run is not true dies if the directory can not be created or is not
+writable.
+
+=cut
+
+sub _mkpath {
+ my ($dir,$show,$mode,$verbose,$dry_run)=@_;
+ if ( $verbose && $verbose > 1 && ! -d $dir) {
+ $show= 1;
+ printf "mkpath(%s,%d,%#o)\n", $dir, $show, $mode;
+ }
+ if (!$dry_run) {
+ if ( ! eval { File::Path::mkpath($dir,$show,$mode); 1 } ) {
+ _choke("Can't create '$dir'","$@");
+ }
+
+ }
+ my ($can,$root,@make)=_can_write_dir($dir);
+ if (!$can) {
+ my @msg=(
+ "Can't create '$dir'",
+ $root ? "Do not have write permissions on '$root'"
+ : "Unknown Error"
+ );
+ if ($dry_run) {
+ _warnonce @msg;
+ } else {
+ _choke @msg;
+ }
+ } elsif ($show and $dry_run) {
+ print "$_\n" for @make;
+ }
+
+}
+
+=pod
+
+=item _copy($from,$to,$verbose,$dry_run)
+
+Wrapper around File::Copy::copy to handle errors.
+
+If $verbose is true and >1 then additional dignostics will be emitted.
+
+If $dry_run is true then the copy will not actually occur.
+
+Dies if the copy fails.
+
+=cut
+
+
+sub _copy {
+ my ( $from, $to, $verbose, $dry_run)=@_;
+ if ($verbose && $verbose>1) {
+ printf "copy(%s,%s)\n", $from, $to;
+ }
+ if (!$dry_run) {
+ File::Copy::copy($from,$to)
+ or Carp::croak( _estr "ERROR: Cannot copy '$from' to '$to': $!" );
+ }
+}
+
+=pod
+
+=item _chdir($from)
+
+Wrapper around chdir to catch errors.
+
+If not called in void context returns the cwd from before the chdir.
+
+dies on error.
+
+=cut
+
+sub _chdir {
+ my ($dir)= @_;
+ my $ret;
+ if (defined wantarray) {
+ $ret= cwd;
+ }
+ chdir $dir
+ or _choke("Couldn't chdir to '$dir': $!");
+ return $ret;
+}
+
+=pod
+
+=end _private
+
+=over 4
+
+=item B<install>
+
+ # deprecated forms
+ install(\%from_to);
+ install(\%from_to, $verbose, $dry_run, $uninstall_shadows,
+ $skip, $always_copy, \%result);
+
+ # recommended form as of 1.47
+ install([
+ from_to => \%from_to,
+ verbose => 1,
+ dry_run => 0,
+ uninstall_shadows => 1,
+ skip => undef,
+ always_copy => 1,
+ result => \%install_results,
+ ]);
+
+
+Copies each directory tree of %from_to to its corresponding value
+preserving timestamps and permissions.
+
+There are two keys with a special meaning in the hash: "read" and
+"write". These contain packlist files. After the copying is done,
+install() will write the list of target files to $from_to{write}. If
+$from_to{read} is given the contents of this file will be merged into
+the written file. The read and the written file may be identical, but
+on AFS it is quite likely that people are installing to a different
+directory than the one where the files later appear.
+
+If $verbose is true, will print out each file removed. Default is
+false. This is "make install VERBINST=1". $verbose values going
+up to 5 show increasingly more diagnostics output.
+
+If $dry_run is true it will only print what it was going to do
+without actually doing it. Default is false.
+
+If $uninstall_shadows is true any differing versions throughout @INC
+will be uninstalled. This is "make install UNINST=1"
+
+As of 1.37_02 install() supports the use of a list of patterns to filter out
+files that shouldn't be installed. If $skip is omitted or undefined then
+install will try to read the list from INSTALL.SKIP in the CWD. This file is
+a list of regular expressions and is just like the MANIFEST.SKIP file used
+by L<ExtUtils::Manifest>.
+
+A default site INSTALL.SKIP may be provided by setting then environment
+variable EU_INSTALL_SITE_SKIPFILE, this will only be used when there isn't a
+distribution specific INSTALL.SKIP. If the environment variable
+EU_INSTALL_IGNORE_SKIP is true then no install file filtering will be
+performed.
+
+If $skip is undefined then the skip file will be autodetected and used if it
+is found. If $skip is a reference to an array then it is assumed the array
+contains the list of patterns, if $skip is a true non reference it is
+assumed to be the filename holding the list of patterns, any other value of
+$skip is taken to mean that no install filtering should occur.
+
+B<Changes As of Version 1.47>
+
+As of version 1.47 the following additions were made to the install interface.
+Note that the new argument style and use of the %result hash is recommended.
+
+The $always_copy parameter which when true causes files to be updated
+regardles as to whether they have changed, if it is defined but false then
+copies are made only if the files have changed, if it is undefined then the
+value of the environment variable EU_INSTALL_ALWAYS_COPY is used as default.
+
+The %result hash will be populated with the various keys/subhashes reflecting
+the install. Currently these keys and their structure are:
+
+ install => { $target => $source },
+ install_fail => { $target => $source },
+ install_unchanged => { $target => $source },
+
+ install_filtered => { $source => $pattern },
+
+ uninstall => { $uninstalled => $source },
+ uninstall_fail => { $uninstalled => $source },
+
+where C<$source> is the filespec of the file being installed. C<$target> is where
+it is being installed to, and C<$uninstalled> is any shadow file that is in C<@INC>
+or C<$ENV{PERL5LIB}> or other standard locations, and C<$pattern> is the pattern that
+caused a source file to be skipped. In future more keys will be added, such as to
+show created directories, however this requires changes in other modules and must
+therefore wait.
+
+These keys will be populated before any exceptions are thrown should there be an
+error.
+
+Note that all updates of the %result are additive, the hash will not be
+cleared before use, thus allowing status results of many installs to be easily
+aggregated.
+
+B<NEW ARGUMENT STYLE>
+
+If there is only one argument and it is a reference to an array then
+the array is assumed to contain a list of key-value pairs specifying
+the options. In this case the option "from_to" is mandatory. This style
+means that you dont have to supply a cryptic list of arguments and can
+use a self documenting argument list that is easier to understand.
+
+This is now the recommended interface to install().
+
+B<RETURN>
+
+If all actions were successful install will return a hashref of the results
+as described above for the $result parameter. If any action is a failure
+then install will die, therefore it is recommended to pass in the $result
+parameter instead of using the return value. If the result parameter is
+provided then the returned hashref will be the passed in hashref.
+
+=cut
+
+sub install { #XXX OS-SPECIFIC
+ my($from_to,$verbose,$dry_run,$uninstall_shadows,$skip,$always_copy,$result) = @_;
+ if (@_==1 and eval { 1+@$from_to }) {
+ my %opts = @$from_to;
+ $from_to = $opts{from_to}
+ or Carp::confess("from_to is a mandatory parameter");
+ $verbose = $opts{verbose};
+ $dry_run = $opts{dry_run};
+ $uninstall_shadows = $opts{uninstall_shadows};
+ $skip = $opts{skip};
+ $always_copy = $opts{always_copy};
+ $result = $opts{result};
+ }
+
+ $result ||= {};
+ $verbose ||= 0;
+ $dry_run ||= 0;
+
+ $skip= _get_install_skip($skip,$verbose);
+ $always_copy = $ENV{EU_INSTALL_ALWAYS_COPY}
+ || $ENV{EU_ALWAYS_COPY}
+ || 0
+ unless defined $always_copy;
+
+ my(%from_to) = %$from_to;
+ my(%pack, $dir, %warned);
+ my($packlist) = ExtUtils::Packlist->new();
+
+ local(*DIR);
+ for (qw/read write/) {
+ $pack{$_}=$from_to{$_};
+ delete $from_to{$_};
+ }
+ my $tmpfile = install_rooted_file($pack{"read"});
+ $packlist->read($tmpfile) if (-f $tmpfile);
+ my $cwd = cwd();
+ my @found_files;
+ my %check_dirs;
+
+ MOD_INSTALL: foreach my $source (sort keys %from_to) {
+ #copy the tree to the target directory without altering
+ #timestamp and permission and remember for the .packlist
+ #file. The packlist file contains the absolute paths of the
+ #install locations. AFS users may call this a bug. We'll have
+ #to reconsider how to add the means to satisfy AFS users also.
+
+ #October 1997: we want to install .pm files into archlib if
+ #there are any files in arch. So we depend on having ./blib/arch
+ #hardcoded here.
+
+ my $targetroot = install_rooted_dir($from_to{$source});
+
+ my $blib_lib = File::Spec->catdir('blib', 'lib');
+ my $blib_arch = File::Spec->catdir('blib', 'arch');
+ if ($source eq $blib_lib and
+ exists $from_to{$blib_arch} and
+ directory_not_empty($blib_arch)
+ ){
+ $targetroot = install_rooted_dir($from_to{$blib_arch});
+ print "Files found in $blib_arch: installing files in $blib_lib into architecture dependent library tree\n";
+ }
+
+ next unless -d $source;
+ _chdir($source);
+ # 5.5.3's File::Find missing no_chdir option
+ # XXX OS-SPECIFIC
+ # File::Find seems to always be Unixy except on MacPerl :(
+ my $current_directory= $Is_MacPerl ? $Curdir : '.';
+ find(sub {
+ my ($mode,$size,$atime,$mtime) = (stat)[2,7,8,9];
+
+ return if !-f _;
+ my $origfile = $_;
+
+ return if $origfile eq ".exists";
+ my $targetdir = File::Spec->catdir($targetroot, $File::Find::dir);
+ my $targetfile = File::Spec->catfile($targetdir, $origfile);
+ my $sourcedir = File::Spec->catdir($source, $File::Find::dir);
+ my $sourcefile = File::Spec->catfile($sourcedir, $origfile);
+
+ for my $pat (@$skip) {
+ if ( $sourcefile=~/$pat/ ) {
+ print "Skipping $targetfile (filtered)\n"
+ if $verbose>1;
+ $result->{install_filtered}{$sourcefile} = $pat;
+ return;
+ }
+ }
+ # we have to do this for back compat with old File::Finds
+ # and because the target is relative
+ my $save_cwd = _chdir($cwd);
+ my $diff = 0;
+ # XXX: I wonder how useful this logic is actually -- demerphq
+ if ( $always_copy or !-f $targetfile or -s $targetfile != $size) {
+ $diff++;
+ } else {
+ # we might not need to copy this file
+ $diff = compare($sourcefile, $targetfile);
+ }
+ $check_dirs{$targetdir}++
+ unless -w $targetfile;
+
+ push @found_files,
+ [ $diff, $File::Find::dir, $origfile,
+ $mode, $size, $atime, $mtime,
+ $targetdir, $targetfile, $sourcedir, $sourcefile,
+
+ ];
+ #restore the original directory we were in when File::Find
+ #called us so that it doesnt get horribly confused.
+ _chdir($save_cwd);
+ }, $current_directory );
+ _chdir($cwd);
+ }
+ foreach my $targetdir (sort keys %check_dirs) {
+ _mkpath( $targetdir, 0, 0755, $verbose, $dry_run );
+ }
+ foreach my $found (@found_files) {
+ my ($diff, $ffd, $origfile, $mode, $size, $atime, $mtime,
+ $targetdir, $targetfile, $sourcedir, $sourcefile)= @$found;
+
+ my $realtarget= $targetfile;
+ if ($diff) {
+ eval {
+ if (-f $targetfile) {
+ print "_unlink_or_rename($targetfile)\n" if $verbose>1;
+ $targetfile= _unlink_or_rename( $targetfile, 'tryhard', 'install' )
+ unless $dry_run;
+ } elsif ( ! -d $targetdir ) {
+ _mkpath( $targetdir, 0, 0755, $verbose, $dry_run );
+ }
+ print "Installing $targetfile\n";
+
+ _copy( $sourcefile, $targetfile, $verbose, $dry_run, );
+
+
+ #XXX OS-SPECIFIC
+ print "utime($atime,$mtime,$targetfile)\n" if $verbose>1;
+ utime($atime,$mtime + $Is_VMS,$targetfile) unless $dry_run>1;
+
+
+ $mode = 0444 | ( $mode & 0111 ? 0111 : 0 );
+ $mode = $mode | 0222
+ if $realtarget ne $targetfile;
+ _chmod( $mode, $targetfile, $verbose );
+ $result->{install}{$targetfile} = $sourcefile;
+ 1
+ } or do {
+ $result->{install_fail}{$targetfile} = $sourcefile;
+ die $@;
+ };
+ } else {
+ $result->{install_unchanged}{$targetfile} = $sourcefile;
+ print "Skipping $targetfile (unchanged)\n" if $verbose;
+ }
+
+ if ( $uninstall_shadows ) {
+ inc_uninstall($sourcefile,$ffd, $verbose,
+ $dry_run,
+ $realtarget ne $targetfile ? $realtarget : "",
+ $result);
+ }
+
+ # Record the full pathname.
+ $packlist->{$targetfile}++;
+ }
+
+ if ($pack{'write'}) {
+ $dir = install_rooted_dir(dirname($pack{'write'}));
+ _mkpath( $dir, 0, 0755, $verbose, $dry_run );
+ print "Writing $pack{'write'}\n" if $verbose;
+ $packlist->write(install_rooted_file($pack{'write'})) unless $dry_run;
+ }
+
+ _do_cleanup($verbose);
+ return $result;
+}
+
+=begin _private
+
+=item _do_cleanup
+
+Standardize finish event for after another instruction has occured.
+Handles converting $MUST_REBOOT to a die for instance.
+
+=end _private
+
+=cut
+
+sub _do_cleanup {
+ my ($verbose) = @_;
+ if ($MUST_REBOOT) {
+ die _estr "Operation not completed! ",
+ "You must reboot to complete the installation.",
+ "Sorry.";
+ } elsif (defined $MUST_REBOOT & $verbose) {
+ warn _estr "Installation will be completed at the next reboot.\n",
+ "However it is not necessary to reboot immediately.\n";
+ }
+}
+
+=begin _undocumented
+
+=item install_rooted_file( $file )
+
+Returns $file, or catfile($INSTALL_ROOT,$file) if $INSTALL_ROOT
+is defined.
+
+=item install_rooted_dir( $dir )
+
+Returns $dir, or catdir($INSTALL_ROOT,$dir) if $INSTALL_ROOT
+is defined.
+
+=end _undocumented
+
+=cut
+
+
+sub install_rooted_file {
+ if (defined $INSTALL_ROOT) {
+ File::Spec->catfile($INSTALL_ROOT, $_[0]);
+ } else {
+ $_[0];
+ }
+}
+
+
+sub install_rooted_dir {
+ if (defined $INSTALL_ROOT) {
+ File::Spec->catdir($INSTALL_ROOT, $_[0]);
+ } else {
+ $_[0];
+ }
+}
+
+=begin _undocumented
+
+=item forceunlink( $file, $tryhard )
+
+Tries to delete a file. If $tryhard is true then we will use whatever
+devious tricks we can to delete the file. Currently this only applies to
+Win32 in that it will try to use Win32API::File to schedule a delete at
+reboot. A wrapper for _unlink_or_rename().
+
+=end _undocumented
+
+=cut
+
+
+sub forceunlink {
+ my ( $file, $tryhard )= @_; #XXX OS-SPECIFIC
+ _unlink_or_rename( $file, $tryhard, not("installing") );
+}
+
+=begin _undocumented
+
+=item directory_not_empty( $dir )
+
+Returns 1 if there is an .exists file somewhere in a directory tree.
+Returns 0 if there is not.
+
+=end _undocumented
+
+=cut
+
+sub directory_not_empty ($) {
+ my($dir) = @_;
+ my $files = 0;
+ find(sub {
+ return if $_ eq ".exists";
+ if (-f) {
+ $File::Find::prune++;
+ $files = 1;
+ }
+ }, $dir);
+ return $files;
+}
+
+=pod
+
+=item B<install_default> I<DISCOURAGED>
+
+ install_default();
+ install_default($fullext);
+
+Calls install() with arguments to copy a module from blib/ to the
+default site installation location.
+
+$fullext is the name of the module converted to a directory
+(ie. Foo::Bar would be Foo/Bar). If $fullext is not specified, it
+will attempt to read it from @ARGV.
+
+This is primarily useful for install scripts.
+
+B<NOTE> This function is not really useful because of the hard-coded
+install location with no way to control site vs core vs vendor
+directories and the strange way in which the module name is given.
+Consider its use discouraged.
+
+=cut
+
+sub install_default {
+ @_ < 2 or Carp::croak("install_default should be called with 0 or 1 argument");
+ my $FULLEXT = @_ ? shift : $ARGV[0];
+ defined $FULLEXT or die "Do not know to where to write install log";
+ my $INST_LIB = File::Spec->catdir($Curdir,"blib","lib");
+ my $INST_ARCHLIB = File::Spec->catdir($Curdir,"blib","arch");
+ my $INST_BIN = File::Spec->catdir($Curdir,'blib','bin');
+ my $INST_SCRIPT = File::Spec->catdir($Curdir,'blib','script');
+ my $INST_MAN1DIR = File::Spec->catdir($Curdir,'blib','man1');
+ my $INST_MAN3DIR = File::Spec->catdir($Curdir,'blib','man3');
+
+ my @INST_HTML;
+ if($Config{installhtmldir}) {
+ my $INST_HTMLDIR = File::Spec->catdir($Curdir,'blib','html');
+ @INST_HTML = ($INST_HTMLDIR => $Config{installhtmldir});
+ }
+
+ install({
+ read => "$Config{sitearchexp}/auto/$FULLEXT/.packlist",
+ write => "$Config{installsitearch}/auto/$FULLEXT/.packlist",
+ $INST_LIB => (directory_not_empty($INST_ARCHLIB)) ?
+ $Config{installsitearch} :
+ $Config{installsitelib},
+ $INST_ARCHLIB => $Config{installsitearch},
+ $INST_BIN => $Config{installbin} ,
+ $INST_SCRIPT => $Config{installscript},
+ $INST_MAN1DIR => $Config{installman1dir},
+ $INST_MAN3DIR => $Config{installman3dir},
+ @INST_HTML,
+ },1,0,0);
+}
+
+
+=item B<uninstall>
+
+ uninstall($packlist_file);
+ uninstall($packlist_file, $verbose, $dont_execute);
+
+Removes the files listed in a $packlist_file.
+
+If $verbose is true, will print out each file removed. Default is
+false.
+
+If $dont_execute is true it will only print what it was going to do
+without actually doing it. Default is false.
+
+=cut
+
+sub uninstall {
+ my($fil,$verbose,$dry_run) = @_;
+ $verbose ||= 0;
+ $dry_run ||= 0;
+
+ die _estr "ERROR: no packlist file found: '$fil'"
+ unless -f $fil;
+ # my $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al));
+ # require $my_req; # Hairy, but for the first
+ my ($packlist) = ExtUtils::Packlist->new($fil);
+ foreach (sort(keys(%$packlist))) {
+ chomp;
+ print "unlink $_\n" if $verbose;
+ forceunlink($_,'tryhard') unless $dry_run;
+ }
+ print "unlink $fil\n" if $verbose;
+ forceunlink($fil, 'tryhard') unless $dry_run;
+ _do_cleanup($verbose);
+}
+
+=begin _undocumented
+
+=item inc_uninstall($filepath,$libdir,$verbose,$dry_run,$ignore,$results)
+
+Remove shadowed files. If $ignore is true then it is assumed to hold
+a filename to ignore. This is used to prevent spurious warnings from
+occuring when doing an install at reboot.
+
+We now only die when failing to remove a file that has precedence over
+our own, when our install has precedence we only warn.
+
+$results is assumed to contain a hashref which will have the keys
+'uninstall' and 'uninstall_fail' populated with keys for the files
+removed and values of the source files they would shadow.
+
+=end _undocumented
+
+=cut
+
+sub inc_uninstall {
+ my($filepath,$libdir,$verbose,$dry_run,$ignore,$results) = @_;
+ my($dir);
+ $ignore||="";
+ my $file = (File::Spec->splitpath($filepath))[2];
+ my %seen_dir = ();
+
+ my @PERL_ENV_LIB = split $Config{path_sep}, defined $ENV{'PERL5LIB'}
+ ? $ENV{'PERL5LIB'} : $ENV{'PERLLIB'} || '';
+
+ my @dirs=( @PERL_ENV_LIB,
+ @INC,
+ @Config{qw(archlibexp
+ privlibexp
+ sitearchexp
+ sitelibexp)});
+
+ #warn join "\n","---",@dirs,"---";
+ my $seen_ours;
+ foreach $dir ( @dirs ) {
+ my $canonpath = $Is_VMS ? $dir : File::Spec->canonpath($dir);
+ next if $canonpath eq $Curdir;
+ next if $seen_dir{$canonpath}++;
+ my $targetfile = File::Spec->catfile($canonpath,$libdir,$file);
+ next unless -f $targetfile;
+
+ # The reason why we compare file's contents is, that we cannot
+ # know, which is the file we just installed (AFS). So we leave
+ # an identical file in place
+ my $diff = 0;
+ if ( -f $targetfile && -s _ == -s $filepath) {
+ # We have a good chance, we can skip this one
+ $diff = compare($filepath,$targetfile);
+ } else {
+ $diff++;
+ }
+ print "#$file and $targetfile differ\n" if $diff && $verbose > 1;
+
+ if (!$diff or $targetfile eq $ignore) {
+ $seen_ours = 1;
+ next;
+ }
+ if ($dry_run) {
+ $results->{uninstall}{$targetfile} = $filepath;
+ if ($verbose) {
+ $Inc_uninstall_warn_handler ||= ExtUtils::Install::Warn->new();
+ $libdir =~ s|^\./||s ; # That's just cosmetics, no need to port. It looks prettier.
+ $Inc_uninstall_warn_handler->add(
+ File::Spec->catfile($libdir, $file),
+ $targetfile
+ );
+ }
+ # if not verbose, we just say nothing
+ } else {
+ print "Unlinking $targetfile (shadowing?)\n" if $verbose;
+ eval {
+ die "Fake die for testing"
+ if $ExtUtils::Install::Testing and
+ ucase(File::Spec->canonpath($ExtUtils::Install::Testing)) eq ucase($targetfile);
+ forceunlink($targetfile,'tryhard');
+ $results->{uninstall}{$targetfile} = $filepath;
+ 1;
+ } or do {
+ $results->{fail_uninstall}{$targetfile} = $filepath;
+ if ($seen_ours) {
+ warn "Failed to remove probably harmless shadow file '$targetfile'\n";
+ } else {
+ die "$@\n";
+ }
+ };
+ }
+ }
+}
+
+=begin _undocumented
+
+=item run_filter($cmd,$src,$dest)
+
+Filter $src using $cmd into $dest.
+
+=end _undocumented
+
+=cut
+
+sub run_filter {
+ my ($cmd, $src, $dest) = @_;
+ local(*CMD, *SRC);
+ open(CMD, "|$cmd >$dest") || die "Cannot fork: $!";
+ open(SRC, $src) || die "Cannot open $src: $!";
+ my $buf;
+ my $sz = 1024;
+ while (my $len = sysread(SRC, $buf, $sz)) {
+ syswrite(CMD, $buf, $len);
+ }
+ close SRC;
+ close CMD or die "Filter command '$cmd' failed for $src";
+}
+
+=pod
+
+=item B<pm_to_blib>
+
+ pm_to_blib(\%from_to, $autosplit_dir);
+ pm_to_blib(\%from_to, $autosplit_dir, $filter_cmd);
+
+Copies each key of %from_to to its corresponding value efficiently.
+Filenames with the extension .pm are autosplit into the $autosplit_dir.
+Any destination directories are created.
+
+$filter_cmd is an optional shell command to run each .pm file through
+prior to splitting and copying. Input is the contents of the module,
+output the new module contents.
+
+You can have an environment variable PERL_INSTALL_ROOT set which will
+be prepended as a directory to each installed file (and directory).
+
+=cut
+
+sub pm_to_blib {
+ my($fromto,$autodir,$pm_filter) = @_;
+
+ _mkpath($autodir,0,0755);
+ while(my($from, $to) = each %$fromto) {
+ if( -f $to && -s $from == -s $to && -M $to < -M $from ) {
+ print "Skip $to (unchanged)\n";
+ next;
+ }
+
+ # When a pm_filter is defined, we need to pre-process the source first
+ # to determine whether it has changed or not. Therefore, only perform
+ # the comparison check when there's no filter to be ran.
+ # -- RAM, 03/01/2001
+
+ my $need_filtering = defined $pm_filter && length $pm_filter &&
+ $from =~ /\.pm$/;
+
+ if (!$need_filtering && 0 == compare($from,$to)) {
+ print "Skip $to (unchanged)\n";
+ next;
+ }
+ if (-f $to){
+ # we wont try hard here. its too likely to mess things up.
+ forceunlink($to);
+ } else {
+ _mkpath(dirname($to),0,0755);
+ }
+ if ($need_filtering) {
+ run_filter($pm_filter, $from, $to);
+ print "$pm_filter <$from >$to\n";
+ } else {
+ _copy( $from, $to );
+ print "cp $from $to\n";
+ }
+ my($mode,$atime,$mtime) = (stat $from)[2,8,9];
+ utime($atime,$mtime+$Is_VMS,$to);
+ _chmod(0444 | ( $mode & 0111 ? 0111 : 0 ),$to);
+ next unless $from =~ /\.pm$/;
+ _autosplit($to,$autodir);
+ }
+}
+
+
+=begin _private
+
+=item _autosplit
+
+From 1.0307 back, AutoSplit will sometimes leave an open filehandle to
+the file being split. This causes problems on systems with mandatory
+locking (ie. Windows). So we wrap it and close the filehandle.
+
+=end _private
+
+=cut
+
+sub _autosplit { #XXX OS-SPECIFIC
+ my $retval = autosplit(@_);
+ close *AutoSplit::IN if defined *AutoSplit::IN{IO};
+
+ return $retval;
+}
+
+
+package ExtUtils::Install::Warn;
+
+sub new { bless {}, shift }
+
+sub add {
+ my($self,$file,$targetfile) = @_;
+ push @{$self->{$file}}, $targetfile;
+}
+
+sub DESTROY {
+ unless(defined $INSTALL_ROOT) {
+ my $self = shift;
+ my($file,$i,$plural);
+ foreach $file (sort keys %$self) {
+ $plural = @{$self->{$file}} > 1 ? "s" : "";
+ print "## Differing version$plural of $file found. You might like to\n";
+ for (0..$#{$self->{$file}}) {
+ print "rm ", $self->{$file}[$_], "\n";
+ $i++;
+ }
+ }
+ $plural = $i>1 ? "all those files" : "this file";
+ my $inst = (_invokant() eq 'ExtUtils::MakeMaker')
+ ? ( $Config::Config{make} || 'make' ).' install'
+ . ( $Is_VMS ? '/MACRO="UNINST"=1' : ' UNINST=1' )
+ : './Build install uninst=1';
+ print "## Running '$inst' will unlink $plural for you.\n";
+ }
+}
+
+=begin _private
+
+=item _invokant
+
+Does a heuristic on the stack to see who called us for more intelligent
+error messages. Currently assumes we will be called only by Module::Build
+or by ExtUtils::MakeMaker.
+
+=end _private
+
+=cut
+
+sub _invokant {
+ my @stack;
+ my $frame = 0;
+ while (my $file = (caller($frame++))[1]) {
+ push @stack, (File::Spec->splitpath($file))[2];
+ }
+
+ my $builder;
+ my $top = pop @stack;
+ if ($top =~ /^Build/i || exists($INC{'Module/Build.pm'})) {
+ $builder = 'Module::Build';
+ } else {
+ $builder = 'ExtUtils::MakeMaker';
+ }
+ return $builder;
+}
+
+=pod
+
+=back
+
+=head1 ENVIRONMENT
+
+=over 4
+
+=item B<PERL_INSTALL_ROOT>
+
+Will be prepended to each install path.
+
+=item B<EU_INSTALL_IGNORE_SKIP>
+
+Will prevent the automatic use of INSTALL.SKIP as the install skip file.
+
+=item B<EU_INSTALL_SITE_SKIPFILE>
+
+If there is no INSTALL.SKIP file in the make directory then this value
+can be used to provide a default.
+
+=item B<EU_INSTALL_ALWAYS_COPY>
+
+If this environment variable is true then normal install processes will
+always overwrite older identical files during the install process.
+
+Note that the alias EU_ALWAYS_COPY will be supported if EU_INSTALL_ALWAYS_COPY
+is not defined until at least the 1.50 release. Please ensure you use the
+correct EU_INSTALL_ALWAYS_COPY.
+
+=back
+
+=head1 AUTHOR
+
+Original author lost in the mists of time. Probably the same as Makemaker.
+
+Production release currently maintained by demerphq C<yves at cpan.org>,
+extensive changes by Michael G. Schwern.
+
+Send bug reports via http://rt.cpan.org/. Please send your
+generated Makefile along with your report.
+
+=head1 LICENSE
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Installed.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Installed.pm
new file mode 100755
index 00000000000..9cb1fc10d75
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Installed.pm
@@ -0,0 +1,462 @@
+package ExtUtils::Installed;
+
+use 5.00503;
+use strict;
+#use warnings; # XXX requires 5.6
+use Carp qw();
+use ExtUtils::Packlist;
+use ExtUtils::MakeMaker;
+use Config;
+use File::Find;
+use File::Basename;
+use File::Spec;
+
+my $Is_VMS = $^O eq 'VMS';
+my $DOSISH = ($^O =~ /^(MSWin\d\d|os2|dos|mint)$/);
+
+require VMS::Filespec if $Is_VMS;
+
+use vars qw($VERSION);
+$VERSION = '1.999_001';
+$VERSION = eval $VERSION;
+
+sub _is_prefix {
+ my ($self, $path, $prefix) = @_;
+ return unless defined $prefix && defined $path;
+
+ if( $Is_VMS ) {
+ $prefix = VMS::Filespec::unixify($prefix);
+ $path = VMS::Filespec::unixify($path);
+ }
+
+ # Unix path normalization.
+ $prefix = File::Spec->canonpath($prefix);
+
+ return 1 if substr($path, 0, length($prefix)) eq $prefix;
+
+ if ($DOSISH) {
+ $path =~ s|\\|/|g;
+ $prefix =~ s|\\|/|g;
+ return 1 if $path =~ m{^\Q$prefix\E}i;
+ }
+ return(0);
+}
+
+sub _is_doc {
+ my ($self, $path) = @_;
+
+ my $man1dir = $self->{':private:'}{Config}{man1direxp};
+ my $man3dir = $self->{':private:'}{Config}{man3direxp};
+ return(($man1dir && $self->_is_prefix($path, $man1dir))
+ ||
+ ($man3dir && $self->_is_prefix($path, $man3dir))
+ ? 1 : 0)
+}
+
+sub _is_type {
+ my ($self, $path, $type) = @_;
+ return 1 if $type eq "all";
+
+ return($self->_is_doc($path)) if $type eq "doc";
+ my $conf= $self->{':private:'}{Config};
+ if ($type eq "prog") {
+ return($self->_is_prefix($path, $conf->{prefix} || $conf->{prefixexp})
+ && !($self->_is_doc($path)) ? 1 : 0);
+ }
+ return(0);
+}
+
+sub _is_under {
+ my ($self, $path, @under) = @_;
+ $under[0] = "" if (! @under);
+ foreach my $dir (@under) {
+ return(1) if ($self->_is_prefix($path, $dir));
+ }
+
+ return(0);
+}
+
+sub _fix_dirs {
+ my ($self, @dirs)= @_;
+ # File::Find does not know how to deal with VMS filepaths.
+ if( $Is_VMS ) {
+ $_ = VMS::Filespec::unixify($_)
+ for @dirs;
+ }
+
+ if ($DOSISH) {
+ s|\\|/|g for @dirs;
+ }
+ return wantarray ? @dirs : $dirs[0];
+}
+
+sub _make_entry {
+ my ($self, $module, $packlist_file, $modfile)= @_;
+
+ my $data= {
+ module => $module,
+ packlist => scalar(ExtUtils::Packlist->new($packlist_file)),
+ packlist_file => $packlist_file,
+ };
+
+ if (!$modfile) {
+ $data->{version} = $self->{':private:'}{Config}{version};
+ } else {
+ $data->{modfile} = $modfile;
+ # Find the top-level module file in @INC
+ $data->{version} = '';
+ foreach my $dir (@{$self->{':private:'}{INC}}) {
+ my $p = File::Spec->catfile($dir, $modfile);
+ if (-r $p) {
+ $module = _module_name($p, $module) if $Is_VMS;
+
+ $data->{version} = MM->parse_version($p);
+ $data->{version_from} = $p;
+ $data->{packlist_valid} = exists $data->{packlist}{$p};
+ last;
+ }
+ }
+ }
+ $self->{$module}= $data;
+}
+
+our $INSTALLED;
+sub new {
+ my ($class) = shift(@_);
+ $class = ref($class) || $class;
+
+ my %args = @_;
+
+ return $INSTALLED if $INSTALLED and ($args{default_get} || $args{default});
+
+ my $self = bless {}, $class;
+
+ $INSTALLED= $self if $args{default_set} || $args{default};
+
+
+ if ($args{config_override}) {
+ eval {
+ $self->{':private:'}{Config} = { %{$args{config_override}} };
+ } or Carp::croak(
+ "The 'config_override' parameter must be a hash reference."
+ );
+ }
+ else {
+ $self->{':private:'}{Config} = \%Config;
+ }
+
+ for my $tuple ([inc_override => INC => [ @INC ] ],
+ [ extra_libs => EXTRA => [] ])
+ {
+ my ($arg,$key,$val)=@$tuple;
+ if ( $args{$arg} ) {
+ eval {
+ $self->{':private:'}{$key} = [ @{$args{$arg}} ];
+ } or Carp::croak(
+ "The '$arg' parameter must be an array reference."
+ );
+ }
+ elsif ($val) {
+ $self->{':private:'}{$key} = $val;
+ }
+ }
+ {
+ my %dupe;
+ @{$self->{':private:'}{LIBDIRS}} = grep { -e $_ && !$dupe{$_}++ }
+ @{$self->{':private:'}{EXTRA}}, @{$self->{':private:'}{INC}};
+ }
+
+ my @dirs= $self->_fix_dirs(@{$self->{':private:'}{LIBDIRS}});
+
+ # Read the core packlist
+ my $archlib = $self->_fix_dirs($self->{':private:'}{Config}{archlibexp});
+ $self->_make_entry("Perl",File::Spec->catfile($archlib, '.packlist'));
+
+ my $root;
+ # Read the module packlists
+ my $sub = sub {
+ # Only process module .packlists
+ return if $_ ne ".packlist" || $File::Find::dir eq $archlib;
+
+ # Hack of the leading bits of the paths & convert to a module name
+ my $module = $File::Find::name;
+ my $found = $module =~ s!^.*?/auto/(.*)/.packlist!$1!s
+ or do {
+ # warn "Woah! \$_=$_\n\$module=$module\n\$File::Find::dir=$File::Find::dir\n",
+ # join ("\n",@dirs);
+ return;
+ };
+
+ my $modfile = "$module.pm";
+ $module =~ s!/!::!g;
+
+ return if $self->{$module}; #shadowing?
+ $self->_make_entry($module,$File::Find::name,$modfile);
+ };
+ while (@dirs) {
+ $root= shift @dirs;
+ next if !-d $root;
+ find($sub,$root);
+ }
+
+ return $self;
+}
+
+# VMS's non-case preserving file-system means the package name can't
+# be reconstructed from the filename.
+sub _module_name {
+ my($file, $orig_module) = @_;
+
+ my $module = '';
+ if (open PACKFH, $file) {
+ while (<PACKFH>) {
+ if (/package\s+(\S+)\s*;/) {
+ my $pack = $1;
+ # Make a sanity check, that lower case $module
+ # is identical to lowercase $pack before
+ # accepting it
+ if (lc($pack) eq lc($orig_module)) {
+ $module = $pack;
+ last;
+ }
+ }
+ }
+ close PACKFH;
+ }
+
+ print STDERR "Couldn't figure out the package name for $file\n"
+ unless $module;
+
+ return $module;
+}
+
+sub modules {
+ my ($self) = @_;
+ $self= $self->new(default=>1) if !ref $self;
+
+ # Bug/feature of sort in scalar context requires this.
+ return wantarray
+ ? sort grep { not /^:private:$/ } keys %$self
+ : grep { not /^:private:$/ } keys %$self;
+}
+
+sub files {
+ my ($self, $module, $type, @under) = @_;
+ $self= $self->new(default=>1) if !ref $self;
+
+ # Validate arguments
+ Carp::croak("$module is not installed") if (! exists($self->{$module}));
+ $type = "all" if (! defined($type));
+ Carp::croak('type must be "all", "prog" or "doc"')
+ if ($type ne "all" && $type ne "prog" && $type ne "doc");
+
+ my (@files);
+ foreach my $file (keys(%{$self->{$module}{packlist}})) {
+ push(@files, $file)
+ if ($self->_is_type($file, $type) &&
+ $self->_is_under($file, @under));
+ }
+ return(@files);
+}
+
+sub directories {
+ my ($self, $module, $type, @under) = @_;
+ $self= $self->new(default=>1) if !ref $self;
+ my (%dirs);
+ foreach my $file ($self->files($module, $type, @under)) {
+ $dirs{dirname($file)}++;
+ }
+ return sort keys %dirs;
+}
+
+sub directory_tree {
+ my ($self, $module, $type, @under) = @_;
+ $self= $self->new(default=>1) if !ref $self;
+ my (%dirs);
+ foreach my $dir ($self->directories($module, $type, @under)) {
+ $dirs{$dir}++;
+ my ($last) = ("");
+ while ($last ne $dir) {
+ $last = $dir;
+ $dir = dirname($dir);
+ last if !$self->_is_under($dir, @under);
+ $dirs{$dir}++;
+ }
+ }
+ return(sort(keys(%dirs)));
+}
+
+sub validate {
+ my ($self, $module, $remove) = @_;
+ $self= $self->new(default=>1) if !ref $self;
+ Carp::croak("$module is not installed") if (! exists($self->{$module}));
+ return($self->{$module}{packlist}->validate($remove));
+}
+
+sub packlist {
+ my ($self, $module) = @_;
+ $self= $self->new(default=>1) if !ref $self;
+ Carp::croak("$module is not installed") if (! exists($self->{$module}));
+ return($self->{$module}{packlist});
+}
+
+sub version {
+ my ($self, $module) = @_;
+ $self= $self->new(default=>1) if !ref $self;
+ Carp::croak("$module is not installed") if (! exists($self->{$module}));
+ return($self->{$module}{version});
+}
+
+sub debug_dump {
+ my ($self, $module) = @_;
+ $self= $self->new(default=>1) if !ref $self;
+ local $self->{":private:"}{Config};
+ require Data::Dumper;
+ print Data::Dumper->new([$self])->Sortkeys(1)->Indent(1)->Dump();
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Installed - Inventory management of installed modules
+
+=head1 SYNOPSIS
+
+ use ExtUtils::Installed;
+ my ($inst) = ExtUtils::Installed->new();
+ my (@modules) = $inst->modules();
+ my (@missing) = $inst->validate("DBI");
+ my $all_files = $inst->files("DBI");
+ my $files_below_usr_local = $inst->files("DBI", "all", "/usr/local");
+ my $all_dirs = $inst->directories("DBI");
+ my $dirs_below_usr_local = $inst->directory_tree("DBI", "prog");
+ my $packlist = $inst->packlist("DBI");
+
+=head1 DESCRIPTION
+
+ExtUtils::Installed provides a standard way to find out what core and module
+files have been installed. It uses the information stored in .packlist files
+created during installation to provide this information. In addition it
+provides facilities to classify the installed files and to extract directory
+information from the .packlist files.
+
+=head1 USAGE
+
+The new() function searches for all the installed .packlists on the system, and
+stores their contents. The .packlists can be queried with the functions
+described below. Where it searches by default is determined by the settings found
+in C<%Config::Config>, and what the value is of the PERL5LIB environment variable.
+
+=head1 METHODS
+
+Unless specified otherwise all method can be called as class methods, or as object
+methods. If called as class methods then the "default" object will be used, and if
+necessary created using the current processes %Config and @INC. See the
+'default' option to new() for details.
+
+
+=over 4
+
+=item new()
+
+This takes optional named parameters. Without parameters, this
+searches for all the installed .packlists on the system using
+information from C<%Config::Config> and the default module search
+paths C<@INC>. The packlists are read using the
+L<ExtUtils::Packlist> module.
+
+If the named parameter C<config_override> is specified,
+it should be a reference to a hash which contains all information
+usually found in C<%Config::Config>. For example, you can obtain
+the configuration information for a separate perl installation and
+pass that in.
+
+ my $yoda_cfg = get_fake_config('yoda');
+ my $yoda_inst = ExtUtils::Installed->new(config_override=>$yoda_cfg);
+
+Similarly, the parameter C<inc_override> may be a reference to an
+array which is used in place of the default module search paths
+from C<@INC>.
+
+ use Config;
+ my @dirs = split(/\Q$Config{path_sep}\E/, $ENV{PERL5LIB});
+ my $p5libs = ExtUtils::Installed->new(inc_override=>\@dirs);
+
+B<Note>: You probably do not want to use these options alone, almost always
+you will want to set both together.
+
+The parameter c<extra_libs> can be used to specify B<additional> paths to
+search for installed modules. For instance
+
+ my $installed = ExtUtils::Installed->new(extra_libs=>["/my/lib/path"]);
+
+This should only be necessary if C</my/lib/path> is not in PERL5LIB.
+
+Finally there is the 'default', and the related 'default_get' and 'default_set'
+options. These options control the "default" object which is provided by the
+class interface to the methods. Setting C<default_get> to true tells the constructor
+to return the default object if it is defined. Setting C<default_set> to true tells
+the constructor to make the default object the constructed object. Setting the
+C<default> option is like setting both to true. This is used primarily internally
+and probably isn't interesting to any real user.
+
+=item modules()
+
+This returns a list of the names of all the installed modules. The perl 'core'
+is given the special name 'Perl'.
+
+=item files()
+
+This takes one mandatory parameter, the name of a module. It returns a list of
+all the filenames from the package. To obtain a list of core perl files, use
+the module name 'Perl'. Additional parameters are allowed. The first is one
+of the strings "prog", "doc" or "all", to select either just program files,
+just manual files or all files. The remaining parameters are a list of
+directories. The filenames returned will be restricted to those under the
+specified directories.
+
+=item directories()
+
+This takes one mandatory parameter, the name of a module. It returns a list of
+all the directories from the package. Additional parameters are allowed. The
+first is one of the strings "prog", "doc" or "all", to select either just
+program directories, just manual directories or all directories. The remaining
+parameters are a list of directories. The directories returned will be
+restricted to those under the specified directories. This method returns only
+the leaf directories that contain files from the specified module.
+
+=item directory_tree()
+
+This is identical in operation to directories(), except that it includes all the
+intermediate directories back up to the specified directories.
+
+=item validate()
+
+This takes one mandatory parameter, the name of a module. It checks that all
+the files listed in the modules .packlist actually exist, and returns a list of
+any missing files. If an optional second argument which evaluates to true is
+given any missing files will be removed from the .packlist
+
+=item packlist()
+
+This returns the ExtUtils::Packlist object for the specified module.
+
+=item version()
+
+This returns the version number for the specified module.
+
+=back
+
+=head1 EXAMPLE
+
+See the example in L<ExtUtils::Packlist>.
+
+=head1 AUTHOR
+
+Alan Burlison <Alan.Burlison@uk.sun.com>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Liblist.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Liblist.pm
new file mode 100755
index 00000000000..ea4dac4ae7c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Liblist.pm
@@ -0,0 +1,286 @@
+package ExtUtils::Liblist;
+
+use strict;
+
+our $VERSION = '6.56';
+
+use File::Spec;
+require ExtUtils::Liblist::Kid;
+our @ISA = qw(ExtUtils::Liblist::Kid File::Spec);
+
+# Backwards compatibility with old interface.
+sub ext {
+ goto &ExtUtils::Liblist::Kid::ext;
+}
+
+sub lsdir {
+ shift;
+ my $rex = qr/$_[1]/;
+ opendir DIR, $_[0];
+ my @out = grep /$rex/, readdir DIR;
+ closedir DIR;
+ return @out;
+}
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Liblist - determine libraries to use and how to use them
+
+=head1 SYNOPSIS
+
+ require ExtUtils::Liblist;
+
+ $MM->ext($potential_libs, $verbose, $need_names);
+
+ # Usually you can get away with:
+ ExtUtils::Liblist->ext($potential_libs, $verbose, $need_names)
+
+=head1 DESCRIPTION
+
+This utility takes a list of libraries in the form C<-llib1 -llib2
+-llib3> and returns lines suitable for inclusion in an extension
+Makefile. Extra library paths may be included with the form
+C<-L/another/path> this will affect the searches for all subsequent
+libraries.
+
+It returns an array of four or five scalar values: EXTRALIBS,
+BSLOADLIBS, LDLOADLIBS, LD_RUN_PATH, and, optionally, a reference to
+the array of the filenames of actual libraries. Some of these don't
+mean anything unless on Unix. See the details about those platform
+specifics below. The list of the filenames is returned only if
+$need_names argument is true.
+
+Dependent libraries can be linked in one of three ways:
+
+=over 2
+
+=item * For static extensions
+
+by the ld command when the perl binary is linked with the extension
+library. See EXTRALIBS below.
+
+=item * For dynamic extensions at build/link time
+
+by the ld command when the shared object is built/linked. See
+LDLOADLIBS below.
+
+=item * For dynamic extensions at load time
+
+by the DynaLoader when the shared object is loaded. See BSLOADLIBS
+below.
+
+=back
+
+=head2 EXTRALIBS
+
+List of libraries that need to be linked with when linking a perl
+binary which includes this extension. Only those libraries that
+actually exist are included. These are written to a file and used
+when linking perl.
+
+=head2 LDLOADLIBS and LD_RUN_PATH
+
+List of those libraries which can or must be linked into the shared
+library when created using ld. These may be static or dynamic
+libraries. LD_RUN_PATH is a colon separated list of the directories
+in LDLOADLIBS. It is passed as an environment variable to the process
+that links the shared library.
+
+=head2 BSLOADLIBS
+
+List of those libraries that are needed but can be linked in
+dynamically at run time on this platform. SunOS/Solaris does not need
+this because ld records the information (from LDLOADLIBS) into the
+object file. This list is used to create a .bs (bootstrap) file.
+
+=head1 PORTABILITY
+
+This module deals with a lot of system dependencies and has quite a
+few architecture specific C<if>s in the code.
+
+=head2 VMS implementation
+
+The version of ext() which is executed under VMS differs from the
+Unix-OS/2 version in several respects:
+
+=over 2
+
+=item *
+
+Input library and path specifications are accepted with or without the
+C<-l> and C<-L> prefixes used by Unix linkers. If neither prefix is
+present, a token is considered a directory to search if it is in fact
+a directory, and a library to search for otherwise. Authors who wish
+their extensions to be portable to Unix or OS/2 should use the Unix
+prefixes, since the Unix-OS/2 version of ext() requires them.
+
+=item *
+
+Wherever possible, shareable images are preferred to object libraries,
+and object libraries to plain object files. In accordance with VMS
+naming conventions, ext() looks for files named I<lib>shr and I<lib>rtl;
+it also looks for I<lib>lib and libI<lib> to accommodate Unix conventions
+used in some ported software.
+
+=item *
+
+For each library that is found, an appropriate directive for a linker options
+file is generated. The return values are space-separated strings of
+these directives, rather than elements used on the linker command line.
+
+=item *
+
+LDLOADLIBS contains both the libraries found based on C<$potential_libs> and
+the CRTLs, if any, specified in Config.pm. EXTRALIBS contains just those
+libraries found based on C<$potential_libs>. BSLOADLIBS and LD_RUN_PATH
+are always empty.
+
+=back
+
+In addition, an attempt is made to recognize several common Unix library
+names, and filter them out or convert them to their VMS equivalents, as
+appropriate.
+
+In general, the VMS version of ext() should properly handle input from
+extensions originally designed for a Unix or VMS environment. If you
+encounter problems, or discover cases where the search could be improved,
+please let us know.
+
+=head2 Win32 implementation
+
+The version of ext() which is executed under Win32 differs from the
+Unix-OS/2 version in several respects:
+
+=over 2
+
+=item *
+
+If C<$potential_libs> is empty, the return value will be empty.
+Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm)
+will be appended to the list of C<$potential_libs>. The libraries
+will be searched for in the directories specified in C<$potential_libs>,
+C<$Config{libpth}>, and in C<$Config{installarchlib}/CORE>.
+For each library that is found, a space-separated list of fully qualified
+library pathnames is generated.
+
+=item *
+
+Input library and path specifications are accepted with or without the
+C<-l> and C<-L> prefixes used by Unix linkers.
+
+An entry of the form C<-La:\foo> specifies the C<a:\foo> directory to look
+for the libraries that follow.
+
+An entry of the form C<-lfoo> specifies the library C<foo>, which may be
+spelled differently depending on what kind of compiler you are using. If
+you are using GCC, it gets translated to C<libfoo.a>, but for other win32
+compilers, it becomes C<foo.lib>. If no files are found by those translated
+names, one more attempt is made to find them using either C<foo.a> or
+C<libfoo.lib>, depending on whether GCC or some other win32 compiler is
+being used, respectively.
+
+If neither the C<-L> or C<-l> prefix is present in an entry, the entry is
+considered a directory to search if it is in fact a directory, and a
+library to search for otherwise. The C<$Config{lib_ext}> suffix will
+be appended to any entries that are not directories and don't already have
+the suffix.
+
+Note that the C<-L> and C<-l> prefixes are B<not required>, but authors
+who wish their extensions to be portable to Unix or OS/2 should use the
+prefixes, since the Unix-OS/2 version of ext() requires them.
+
+=item *
+
+Entries cannot be plain object files, as many Win32 compilers will
+not handle object files in the place of libraries.
+
+=item *
+
+Entries in C<$potential_libs> beginning with a colon and followed by
+alphanumeric characters are treated as flags. Unknown flags will be ignored.
+
+An entry that matches C</:nodefault/i> disables the appending of default
+libraries found in C<$Config{perllibs}> (this should be only needed very rarely).
+
+An entry that matches C</:nosearch/i> disables all searching for
+the libraries specified after it. Translation of C<-Lfoo> and
+C<-lfoo> still happens as appropriate (depending on compiler being used,
+as reflected by C<$Config{cc}>), but the entries are not verified to be
+valid files or directories.
+
+An entry that matches C</:search/i> reenables searching for
+the libraries specified after it. You can put it at the end to
+enable searching for default libraries specified by C<$Config{perllibs}>.
+
+=item *
+
+The libraries specified may be a mixture of static libraries and
+import libraries (to link with DLLs). Since both kinds are used
+pretty transparently on the Win32 platform, we do not attempt to
+distinguish between them.
+
+=item *
+
+LDLOADLIBS and EXTRALIBS are always identical under Win32, and BSLOADLIBS
+and LD_RUN_PATH are always empty (this may change in future).
+
+=item *
+
+You must make sure that any paths and path components are properly
+surrounded with double-quotes if they contain spaces. For example,
+C<$potential_libs> could be (literally):
+
+ "-Lc:\Program Files\vc\lib" msvcrt.lib "la test\foo bar.lib"
+
+Note how the first and last entries are protected by quotes in order
+to protect the spaces.
+
+=item *
+
+Since this module is most often used only indirectly from extension
+C<Makefile.PL> files, here is an example C<Makefile.PL> entry to add
+a library to the build process for an extension:
+
+ LIBS => ['-lgl']
+
+When using GCC, that entry specifies that MakeMaker should first look
+for C<libgl.a> (followed by C<gl.a>) in all the locations specified by
+C<$Config{libpth}>.
+
+When using a compiler other than GCC, the above entry will search for
+C<gl.lib> (followed by C<libgl.lib>).
+
+If the library happens to be in a location not in C<$Config{libpth}>,
+you need:
+
+ LIBS => ['-Lc:\gllibs -lgl']
+
+Here is a less often used example:
+
+ LIBS => ['-lgl', ':nosearch -Ld:\mesalibs -lmesa -luser32']
+
+This specifies a search for library C<gl> as before. If that search
+fails to find the library, it looks at the next item in the list. The
+C<:nosearch> flag will prevent searching for the libraries that follow,
+so it simply returns the value as C<-Ld:\mesalibs -lmesa -luser32>,
+since GCC can use that value as is with its linker.
+
+When using the Visual C compiler, the second item is returned as
+C<-libpath:d:\mesalibs mesa.lib user32.lib>.
+
+When using the Borland compiler, the second item is returned as
+C<-Ld:\mesalibs mesa.lib user32.lib>, and MakeMaker takes care of
+moving the C<-Ld:\mesalibs> to the correct place in the linker
+command line.
+
+=back
+
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Liblist/Kid.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Liblist/Kid.pm
new file mode 100755
index 00000000000..b807e97cc86
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Liblist/Kid.pm
@@ -0,0 +1,546 @@
+package ExtUtils::Liblist::Kid;
+
+# XXX Splitting this out into its own .pm is a temporary solution.
+
+# This kid package is to be used by MakeMaker. It will not work if
+# $self is not a Makemaker.
+
+use 5.006;
+# Broken out of MakeMaker from version 4.11
+
+use strict;
+our $VERSION = 6.56;
+
+use Config;
+use Cwd 'cwd';
+use File::Basename;
+use File::Spec;
+
+sub ext {
+ if ($^O eq 'VMS') { return &_vms_ext; }
+ elsif($^O eq 'MSWin32') { return &_win32_ext; }
+ else { return &_unix_os2_ext; }
+}
+
+sub _unix_os2_ext {
+ my($self,$potential_libs, $verbose, $give_libs) = @_;
+ $verbose ||= 0;
+
+ if ($^O =~ 'os2' and $Config{perllibs}) {
+ # Dynamic libraries are not transitive, so we may need including
+ # the libraries linked against perl.dll again.
+
+ $potential_libs .= " " if $potential_libs;
+ $potential_libs .= $Config{perllibs};
+ }
+ return ("", "", "", "", ($give_libs ? [] : ())) unless $potential_libs;
+ warn "Potential libraries are '$potential_libs':\n" if $verbose;
+
+ my($so) = $Config{so};
+ my($libs) = defined $Config{perllibs} ? $Config{perllibs} : $Config{libs};
+ my $Config_libext = $Config{lib_ext} || ".a";
+
+
+ # compute $extralibs, $bsloadlibs and $ldloadlibs from
+ # $potential_libs
+ # this is a rewrite of Andy Dougherty's extliblist in perl
+
+ my(@searchpath); # from "-L/path" entries in $potential_libs
+ my(@libpath) = split " ", $Config{'libpth'};
+ my(@ldloadlibs, @bsloadlibs, @extralibs, @ld_run_path, %ld_run_path_seen);
+ my(@libs, %libs_seen);
+ my($fullname, @fullname);
+ my($pwd) = cwd(); # from Cwd.pm
+ my($found) = 0;
+
+ foreach my $thislib (split ' ', $potential_libs) {
+
+ # Handle possible linker path arguments.
+ if ($thislib =~ s/^(-[LR]|-Wl,-R)//){ # save path flag type
+ my($ptype) = $1;
+ unless (-d $thislib){
+ warn "$ptype$thislib ignored, directory does not exist\n"
+ if $verbose;
+ next;
+ }
+ my($rtype) = $ptype;
+ if (($ptype eq '-R') or ($ptype eq '-Wl,-R')) {
+ if ($Config{'lddlflags'} =~ /-Wl,-R/) {
+ $rtype = '-Wl,-R';
+ } elsif ($Config{'lddlflags'} =~ /-R/) {
+ $rtype = '-R';
+ }
+ }
+ unless (File::Spec->file_name_is_absolute($thislib)) {
+ warn "Warning: $ptype$thislib changed to $ptype$pwd/$thislib\n";
+ $thislib = $self->catdir($pwd,$thislib);
+ }
+ push(@searchpath, $thislib);
+ push(@extralibs, "$ptype$thislib");
+ push(@ldloadlibs, "$rtype$thislib");
+ next;
+ }
+
+ # Handle possible library arguments.
+ unless ($thislib =~ s/^-l//){
+ warn "Unrecognized argument in LIBS ignored: '$thislib'\n";
+ next;
+ }
+
+ my($found_lib)=0;
+ foreach my $thispth (@searchpath, @libpath) {
+
+ # Try to find the full name of the library. We need this to
+ # determine whether it's a dynamically-loadable library or not.
+ # This tends to be subject to various os-specific quirks.
+ # For gcc-2.6.2 on linux (March 1995), DLD can not load
+ # .sa libraries, with the exception of libm.sa, so we
+ # deliberately skip them.
+ if (@fullname =
+ $self->lsdir($thispth,"^\Qlib$thislib.$so.\E[0-9]+")){
+ # Take care that libfoo.so.10 wins against libfoo.so.9.
+ # Compare two libraries to find the most recent version
+ # number. E.g. if you have libfoo.so.9.0.7 and
+ # libfoo.so.10.1, first convert all digits into two
+ # decimal places. Then we'll add ".00" to the shorter
+ # strings so that we're comparing strings of equal length
+ # Thus we'll compare libfoo.so.09.07.00 with
+ # libfoo.so.10.01.00. Some libraries might have letters
+ # in the version. We don't know what they mean, but will
+ # try to skip them gracefully -- we'll set any letter to
+ # '0'. Finally, sort in reverse so we can take the
+ # first element.
+
+ #TODO: iterate through the directory instead of sorting
+
+ $fullname = "$thispth/" .
+ (sort { my($ma) = $a;
+ my($mb) = $b;
+ $ma =~ tr/A-Za-z/0/s;
+ $ma =~ s/\b(\d)\b/0$1/g;
+ $mb =~ tr/A-Za-z/0/s;
+ $mb =~ s/\b(\d)\b/0$1/g;
+ while (length($ma) < length($mb)) { $ma .= ".00"; }
+ while (length($mb) < length($ma)) { $mb .= ".00"; }
+ # Comparison deliberately backwards
+ $mb cmp $ma;} @fullname)[0];
+ } elsif (-f ($fullname="$thispth/lib$thislib.$so")
+ && (($Config{'dlsrc'} ne "dl_dld.xs") || ($thislib eq "m"))){
+ } elsif (-f ($fullname="$thispth/lib${thislib}_s$Config_libext")
+ && ($Config{'archname'} !~ /RM\d\d\d-svr4/)
+ && ($thislib .= "_s") ){ # we must explicitly use _s version
+ } elsif (-f ($fullname="$thispth/lib$thislib$Config_libext")){
+ } elsif (-f ($fullname="$thispth/$thislib$Config_libext")){
+ } elsif (-f ($fullname="$thispth/lib$thislib.dll$Config_libext")){
+ } elsif (-f ($fullname="$thispth/Slib$thislib$Config_libext")){
+ } elsif ($^O eq 'dgux'
+ && -l ($fullname="$thispth/lib$thislib$Config_libext")
+ && readlink($fullname) =~ /^elink:/s) {
+ # Some of DG's libraries look like misconnected symbolic
+ # links, but development tools can follow them. (They
+ # look like this:
+ #
+ # libm.a -> elink:${SDE_PATH:-/usr}/sde/\
+ # ${TARGET_BINARY_INTERFACE:-m88kdgux}/usr/lib/libm.a
+ #
+ # , the compilation tools expand the environment variables.)
+ } else {
+ warn "$thislib not found in $thispth\n" if $verbose;
+ next;
+ }
+ warn "'-l$thislib' found at $fullname\n" if $verbose;
+ push @libs, $fullname unless $libs_seen{$fullname}++;
+ $found++;
+ $found_lib++;
+
+ # Now update library lists
+
+ # what do we know about this library...
+ my $is_dyna = ($fullname !~ /\Q$Config_libext\E\z/);
+ my $in_perl = ($libs =~ /\B-l\Q${thislib}\E\b/s);
+
+ # include the path to the lib once in the dynamic linker path
+ # but only if it is a dynamic lib and not in Perl itself
+ my($fullnamedir) = dirname($fullname);
+ push @ld_run_path, $fullnamedir
+ if $is_dyna && !$in_perl &&
+ !$ld_run_path_seen{$fullnamedir}++;
+
+ # Do not add it into the list if it is already linked in
+ # with the main perl executable.
+ # We have to special-case the NeXT, because math and ndbm
+ # are both in libsys_s
+ unless ($in_perl ||
+ ($Config{'osname'} eq 'next' &&
+ ($thislib eq 'm' || $thislib eq 'ndbm')) ){
+ push(@extralibs, "-l$thislib");
+ }
+
+ # We might be able to load this archive file dynamically
+ if ( ($Config{'dlsrc'} =~ /dl_next/ && $Config{'osvers'} lt '4_0')
+ || ($Config{'dlsrc'} =~ /dl_dld/) )
+ {
+ # We push -l$thislib instead of $fullname because
+ # it avoids hardwiring a fixed path into the .bs file.
+ # Mkbootstrap will automatically add dl_findfile() to
+ # the .bs file if it sees a name in the -l format.
+ # USE THIS, when dl_findfile() is fixed:
+ # push(@bsloadlibs, "-l$thislib");
+ # OLD USE WAS while checking results against old_extliblist
+ push(@bsloadlibs, "$fullname");
+ } else {
+ if ($is_dyna){
+ # For SunOS4, do not add in this shared library if
+ # it is already linked in the main perl executable
+ push(@ldloadlibs, "-l$thislib")
+ unless ($in_perl and $^O eq 'sunos');
+ } else {
+ push(@ldloadlibs, "-l$thislib");
+ }
+ }
+ last; # found one here so don't bother looking further
+ }
+ warn "Note (probably harmless): "
+ ."No library found for -l$thislib\n"
+ unless $found_lib>0;
+ }
+
+ unless( $found ) {
+ return ('','','','', ($give_libs ? \@libs : ()));
+ }
+ else {
+ return ("@extralibs", "@bsloadlibs", "@ldloadlibs",
+ join(":",@ld_run_path), ($give_libs ? \@libs : ()));
+ }
+}
+
+sub _win32_ext {
+
+ require Text::ParseWords;
+
+ my($self, $potential_libs, $verbose, $give_libs) = @_;
+ $verbose ||= 0;
+
+ # If user did not supply a list, we punt.
+ # (caller should probably use the list in $Config{libs})
+ return ("", "", "", "", ($give_libs ? [] : ())) unless $potential_libs;
+
+ my $cc = $Config{cc};
+ my $VC = $cc =~ /^cl/i;
+ my $BC = $cc =~ /^bcc/i;
+ my $GC = $cc =~ /^gcc/i;
+ my $so = $Config{'so'};
+ my $libs = $Config{'perllibs'};
+ my $libpth = $Config{'libpth'};
+ my $libext = $Config{'lib_ext'} || ".lib";
+ my(@libs, %libs_seen);
+
+ if ($libs and $potential_libs !~ /:nodefault/i) {
+ # If Config.pm defines a set of default libs, we always
+ # tack them on to the user-supplied list, unless the user
+ # specified :nodefault
+
+ $potential_libs .= " " if $potential_libs;
+ $potential_libs .= $libs;
+ }
+ warn "Potential libraries are '$potential_libs':\n" if $verbose;
+
+ # normalize to forward slashes
+ $libpth =~ s,\\,/,g;
+ $potential_libs =~ s,\\,/,g;
+
+ # compute $extralibs from $potential_libs
+
+ my @searchpath; # from "-L/path" in $potential_libs
+ my @libpath = Text::ParseWords::quotewords('\s+', 0, $libpth);
+ my @extralibs;
+ my $pwd = cwd(); # from Cwd.pm
+ my $lib = '';
+ my $found = 0;
+ my $search = 1;
+ my($fullname);
+
+ # add "$Config{installarchlib}/CORE" to default search path
+ push @libpath, "$Config{installarchlib}/CORE";
+
+ if ($VC and exists $ENV{LIB} and $ENV{LIB}) {
+ push @libpath, split /;/, $ENV{LIB};
+ }
+
+ foreach (Text::ParseWords::quotewords('\s+', 0, $potential_libs)){
+
+ my $thislib = $_;
+
+ # see if entry is a flag
+ if (/^:\w+$/) {
+ $search = 0 if lc eq ':nosearch';
+ $search = 1 if lc eq ':search';
+ warn "Ignoring unknown flag '$thislib'\n"
+ if $verbose and !/^:(no)?(search|default)$/i;
+ next;
+ }
+
+ # if searching is disabled, do compiler-specific translations
+ unless ($search) {
+ s/^-l(.+)$/$1.lib/ unless $GC;
+ s/^-L/-libpath:/ if $VC;
+ push(@extralibs, $_);
+ $found++;
+ next;
+ }
+
+ # handle possible linker path arguments
+ if (s/^-L// and not -d) {
+ warn "$thislib ignored, directory does not exist\n"
+ if $verbose;
+ next;
+ }
+ elsif (-d) {
+ unless (File::Spec->file_name_is_absolute($_)) {
+ warn "Warning: '$thislib' changed to '-L$pwd/$_'\n";
+ $_ = $self->catdir($pwd,$_);
+ }
+ push(@searchpath, $_);
+ next;
+ }
+
+ # handle possible library arguments
+ if (s/^-l// and $GC and !/^lib/i) {
+ $_ = "lib$_";
+ }
+ $_ .= $libext if !/\Q$libext\E$/i;
+
+ my $secondpass = 0;
+ LOOKAGAIN:
+
+ # look for the file itself
+ if (-f) {
+ warn "'$thislib' found as '$_'\n" if $verbose;
+ $found++;
+ push(@extralibs, $_);
+ next;
+ }
+
+ my $found_lib = 0;
+ foreach my $thispth (@searchpath, @libpath){
+ unless (-f ($fullname="$thispth\\$_")) {
+ warn "'$thislib' not found as '$fullname'\n" if $verbose;
+ next;
+ }
+ warn "'$thislib' found as '$fullname'\n" if $verbose;
+ $found++;
+ $found_lib++;
+ push(@extralibs, $fullname);
+ push @libs, $fullname unless $libs_seen{$fullname}++;
+ last;
+ }
+
+ # do another pass with (or without) leading 'lib' if they used -l
+ if (!$found_lib and $thislib =~ /^-l/ and !$secondpass++) {
+ if ($GC) {
+ goto LOOKAGAIN if s/^lib//i;
+ }
+ elsif (!/^lib/i) {
+ $_ = "lib$_";
+ goto LOOKAGAIN;
+ }
+ }
+
+ # give up
+ warn "Note (probably harmless): "
+ ."No library found for $thislib\n"
+ unless $found_lib>0;
+
+ }
+
+ return ('','','','', ($give_libs ? \@libs : ())) unless $found;
+
+ # make sure paths with spaces are properly quoted
+ @extralibs = map { (/\s/ && !/^".*"$/) ? qq["$_"] : $_ } @extralibs;
+ @libs = map { (/\s/ && !/^".*"$/) ? qq["$_"] : $_ } @libs;
+ $lib = join(' ',@extralibs);
+
+ # normalize back to backward slashes (to help braindead tools)
+ # XXX this may break equally braindead GNU tools that don't understand
+ # backslashes, either. Seems like one can't win here. Cursed be CP/M.
+ $lib =~ s,/,\\,g;
+
+ warn "Result: $lib\n" if $verbose;
+ wantarray ? ($lib, '', $lib, '', ($give_libs ? \@libs : ())) : $lib;
+}
+
+
+sub _vms_ext {
+ my($self, $potential_libs, $verbose, $give_libs) = @_;
+ $verbose ||= 0;
+
+ my(@crtls,$crtlstr);
+ @crtls = ( ($Config{'ldflags'} =~ m-/Debug-i ? $Config{'dbgprefix'} : '')
+ . 'PerlShr/Share' );
+ push(@crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'});
+ push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'});
+ # In general, we pass through the basic libraries from %Config unchanged.
+ # The one exception is that if we're building in the Perl source tree, and
+ # a library spec could be resolved via a logical name, we go to some trouble
+ # to insure that the copy in the local tree is used, rather than one to
+ # which a system-wide logical may point.
+ if ($self->{PERL_SRC}) {
+ my($locspec,$type);
+ foreach my $lib (@crtls) {
+ if (($locspec,$type) = $lib =~ m{^([\w\$-]+)(/\w+)?} and $locspec =~ /perl/i) {
+ if (lc $type eq '/share') { $locspec .= $Config{'exe_ext'}; }
+ elsif (lc $type eq '/library') { $locspec .= $Config{'lib_ext'}; }
+ else { $locspec .= $Config{'obj_ext'}; }
+ $locspec = $self->catfile($self->{PERL_SRC},$locspec);
+ $lib = "$locspec$type" if -e $locspec;
+ }
+ }
+ }
+ $crtlstr = @crtls ? join(' ',@crtls) : '';
+
+ unless ($potential_libs) {
+ warn "Result:\n\tEXTRALIBS: \n\tLDLOADLIBS: $crtlstr\n" if $verbose;
+ return ('', '', $crtlstr, '', ($give_libs ? [] : ()));
+ }
+
+ my(%found,@fndlibs,$ldlib);
+ my $cwd = cwd();
+ my($so,$lib_ext,$obj_ext) = @Config{'so','lib_ext','obj_ext'};
+ # List of common Unix library names and their VMS equivalents
+ # (VMS equivalent of '' indicates that the library is automatically
+ # searched by the linker, and should be skipped here.)
+ my(@flibs, %libs_seen);
+ my %libmap = ( 'm' => '', 'f77' => '', 'F77' => '', 'V77' => '', 'c' => '',
+ 'malloc' => '', 'crypt' => '', 'resolv' => '', 'c_s' => '',
+ 'socket' => '', 'X11' => 'DECW$XLIBSHR',
+ 'Xt' => 'DECW$XTSHR', 'Xm' => 'DECW$XMLIBSHR',
+ 'Xmu' => 'DECW$XMULIBSHR');
+ if ($Config{'vms_cc_type'} ne 'decc') { $libmap{'curses'} = 'VAXCCURSE'; }
+
+ warn "Potential libraries are '$potential_libs'\n" if $verbose;
+
+ # First, sort out directories and library names in the input
+ my(@dirs, @libs);
+ foreach my $lib (split ' ',$potential_libs) {
+ push(@dirs,$1), next if $lib =~ /^-L(.*)/;
+ push(@dirs,$lib), next if $lib =~ /[:>\]]$/;
+ push(@dirs,$lib), next if -d $lib;
+ push(@libs,$1), next if $lib =~ /^-l(.*)/;
+ push(@libs,$lib);
+ }
+ push(@dirs,split(' ',$Config{'libpth'}));
+
+ # Now make sure we've got VMS-syntax absolute directory specs
+ # (We don't, however, check whether someone's hidden a relative
+ # path in a logical name.)
+ foreach my $dir (@dirs) {
+ unless (-d $dir) {
+ warn "Skipping nonexistent Directory $dir\n" if $verbose > 1;
+ $dir = '';
+ next;
+ }
+ warn "Resolving directory $dir\n" if $verbose;
+ if (File::Spec->file_name_is_absolute($dir)) {
+ $dir = $self->fixpath($dir,1);
+ }
+ else {
+ $dir = $self->catdir($cwd,$dir);
+ }
+ }
+ @dirs = grep { length($_) } @dirs;
+ unshift(@dirs,''); # Check each $lib without additions first
+
+ LIB: foreach my $lib (@libs) {
+ if (exists $libmap{$lib}) {
+ next unless length $libmap{$lib};
+ $lib = $libmap{$lib};
+ }
+
+ my(@variants,$cand);
+ my($ctype) = '';
+
+ # If we don't have a file type, consider it a possibly abbreviated name and
+ # check for common variants. We try these first to grab libraries before
+ # a like-named executable image (e.g. -lperl resolves to perlshr.exe
+ # before perl.exe).
+ if ($lib !~ /\.[^:>\]]*$/) {
+ push(@variants,"${lib}shr","${lib}rtl","${lib}lib");
+ push(@variants,"lib$lib") if $lib !~ /[:>\]]/;
+ }
+ push(@variants,$lib);
+ warn "Looking for $lib\n" if $verbose;
+ foreach my $variant (@variants) {
+ my($fullname, $name);
+
+ foreach my $dir (@dirs) {
+ my($type);
+
+ $name = "$dir$variant";
+ warn "\tChecking $name\n" if $verbose > 2;
+ $fullname = VMS::Filespec::rmsexpand($name);
+ if (defined $fullname and -f $fullname) {
+ # It's got its own suffix, so we'll have to figure out the type
+ if ($fullname =~ /(?:$so|exe)$/i) { $type = 'SHR'; }
+ elsif ($fullname =~ /(?:$lib_ext|olb)$/i) { $type = 'OLB'; }
+ elsif ($fullname =~ /(?:$obj_ext|obj)$/i) {
+ warn "Note (probably harmless): "
+ ."Plain object file $fullname found in library list\n";
+ $type = 'OBJ';
+ }
+ else {
+ warn "Note (probably harmless): "
+ ."Unknown library type for $fullname; assuming shared\n";
+ $type = 'SHR';
+ }
+ }
+ elsif (-f ($fullname = VMS::Filespec::rmsexpand($name,$so)) or
+ -f ($fullname = VMS::Filespec::rmsexpand($name,'.exe'))) {
+ $type = 'SHR';
+ $name = $fullname unless $fullname =~ /exe;?\d*$/i;
+ }
+ elsif (not length($ctype) and # If we've got a lib already,
+ # don't bother
+ ( -f ($fullname = VMS::Filespec::rmsexpand($name,$lib_ext)) or
+ -f ($fullname = VMS::Filespec::rmsexpand($name,'.olb')))) {
+ $type = 'OLB';
+ $name = $fullname unless $fullname =~ /olb;?\d*$/i;
+ }
+ elsif (not length($ctype) and # If we've got a lib already,
+ # don't bother
+ ( -f ($fullname = VMS::Filespec::rmsexpand($name,$obj_ext)) or
+ -f ($fullname = VMS::Filespec::rmsexpand($name,'.obj')))) {
+ warn "Note (probably harmless): "
+ ."Plain object file $fullname found in library list\n";
+ $type = 'OBJ';
+ $name = $fullname unless $fullname =~ /obj;?\d*$/i;
+ }
+ if (defined $type) {
+ $ctype = $type; $cand = $name;
+ last if $ctype eq 'SHR';
+ }
+ }
+ if ($ctype) {
+ # This has to precede any other CRTLs, so just make it first
+ if ($cand eq 'VAXCCURSE') { unshift @{$found{$ctype}}, $cand; }
+ else { push @{$found{$ctype}}, $cand; }
+ warn "\tFound as $cand (really $fullname), type $ctype\n"
+ if $verbose > 1;
+ push @flibs, $name unless $libs_seen{$fullname}++;
+ next LIB;
+ }
+ }
+ warn "Note (probably harmless): "
+ ."No library found for $lib\n";
+ }
+
+ push @fndlibs, @{$found{OBJ}} if exists $found{OBJ};
+ push @fndlibs, map { "$_/Library" } @{$found{OLB}} if exists $found{OLB};
+ push @fndlibs, map { "$_/Share" } @{$found{SHR}} if exists $found{SHR};
+ my $lib = join(' ',@fndlibs);
+
+ $ldlib = $crtlstr ? "$lib $crtlstr" : $lib;
+ warn "Result:\n\tEXTRALIBS: $lib\n\tLDLOADLIBS: $ldlib\n" if $verbose;
+ wantarray ? ($lib, '', $ldlib, '', ($give_libs ? \@flibs : ())) : $lib;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MANIFEST.SKIP b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MANIFEST.SKIP
new file mode 100755
index 00000000000..85a5c19347e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MANIFEST.SKIP
@@ -0,0 +1,55 @@
+# Avoid version control files.
+\bRCS\b
+\bCVS\b
+\bSCCS\b
+,v$
+\B\.svn\b
+\B\.git\b
+\B\.gitignore\b
+\b_darcs\b
+\B\.cvsignore$
+
+# Avoid VMS specific MakeMaker generated files
+\bDescrip.MMS$
+\bDESCRIP.MMS$
+\bdescrip.mms$
+
+# Avoid Makemaker generated and utility files.
+\bMANIFEST\.bak
+\bMakefile$
+\bblib/
+\bMakeMaker-\d
+\bpm_to_blib\.ts$
+\bpm_to_blib$
+\bblibdirs\.ts$ # 6.18 through 6.25 generated this
+
+# Avoid Module::Build generated and utility files.
+\bBuild$
+\b_build/
+\bBuild.bat$
+\bBuild.COM$
+\bBUILD.COM$
+\bbuild.com$
+
+# Avoid temp and backup files.
+~$
+\.old$
+\#$
+\b\.#
+\.bak$
+\.tmp$
+\.#
+\.rej$
+
+# Avoid OS-specific files/dirs
+# Mac OSX metadata
+\B\.DS_Store
+# Mac OSX SMB mount metadata files
+\B\._
+
+# Avoid Devel::Cover and Devel::CoverX::Covered files.
+\bcover_db\b
+\bcovered\b
+
+# Avoid MYMETA files
+^MYMETA\.
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM.pm
new file mode 100755
index 00000000000..eac5f483494
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM.pm
@@ -0,0 +1,90 @@
+package ExtUtils::MM;
+
+use strict;
+use ExtUtils::MakeMaker::Config;
+
+our $VERSION = '6.56';
+
+require ExtUtils::Liblist;
+require ExtUtils::MakeMaker;
+our @ISA = qw(ExtUtils::Liblist ExtUtils::MakeMaker);
+
+=head1 NAME
+
+ExtUtils::MM - OS adjusted ExtUtils::MakeMaker subclass
+
+=head1 SYNOPSIS
+
+ require ExtUtils::MM;
+ my $mm = MM->new(...);
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY>
+
+ExtUtils::MM is a subclass of ExtUtils::MakeMaker which automatically
+chooses the appropriate OS specific subclass for you
+(ie. ExtUils::MM_Unix, etc...).
+
+It also provides a convenient alias via the MM class (I didn't want
+MakeMaker modules outside of ExtUtils/).
+
+This class might turn out to be a temporary solution, but MM won't go
+away.
+
+=cut
+
+{
+ # Convenient alias.
+ package MM;
+ our @ISA = qw(ExtUtils::MM);
+ sub DESTROY {}
+}
+
+sub _is_win95 {
+ # miniperl might not have the Win32 functions available and we need
+ # to run in miniperl.
+ my $have_win32 = eval { require Win32 };
+ return $have_win32 && defined &Win32::IsWin95 ? Win32::IsWin95()
+ : ! defined $ENV{SYSTEMROOT};
+}
+
+my %Is = ();
+$Is{VMS} = $^O eq 'VMS';
+$Is{OS2} = $^O eq 'os2';
+$Is{MacOS} = $^O eq 'MacOS';
+if( $^O eq 'MSWin32' ) {
+ _is_win95() ? $Is{Win95} = 1 : $Is{Win32} = 1;
+}
+$Is{UWIN} = $^O =~ /^uwin(-nt)?$/;
+$Is{Cygwin} = $^O eq 'cygwin';
+$Is{NW5} = $Config{osname} eq 'NetWare'; # intentional
+$Is{BeOS} = ($^O =~ /beos/i or $^O eq 'haiku');
+$Is{DOS} = $^O eq 'dos';
+if( $Is{NW5} ) {
+ $^O = 'NetWare';
+ delete $Is{Win32};
+}
+$Is{VOS} = $^O eq 'vos';
+$Is{QNX} = $^O eq 'qnx';
+$Is{AIX} = $^O eq 'aix';
+$Is{Darwin} = $^O eq 'darwin';
+
+$Is{Unix} = !grep { $_ } values %Is;
+
+map { delete $Is{$_} unless $Is{$_} } keys %Is;
+_assert( keys %Is == 1 );
+my($OS) = keys %Is;
+
+
+my $class = "ExtUtils::MM_$OS";
+eval "require $class" unless $INC{"ExtUtils/MM_$OS.pm"}; ## no critic
+die $@ if $@;
+unshift @ISA, $class;
+
+
+sub _assert {
+ my $sanity = shift;
+ die sprintf "Assert failed at %s line %d\n", (caller)[1,2] unless $sanity;
+ return;
+}
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_AIX.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_AIX.pm
new file mode 100755
index 00000000000..5179be4bc2a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_AIX.pm
@@ -0,0 +1,79 @@
+package ExtUtils::MM_AIX;
+
+use strict;
+our $VERSION = '6.56';
+
+require ExtUtils::MM_Unix;
+our @ISA = qw(ExtUtils::MM_Unix);
+
+use ExtUtils::MakeMaker qw(neatvalue);
+
+
+=head1 NAME
+
+ExtUtils::MM_AIX - AIX specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+ Don't use this module directly.
+ Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality for
+AIX.
+
+Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=head3 dlsyms
+
+Define DL_FUNCS and DL_VARS and write the *.exp files.
+
+=cut
+
+sub dlsyms {
+ my($self,%attribs) = @_;
+
+ return '' unless $self->needs_linking();
+
+ my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
+ my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
+ my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
+ my(@m);
+
+ push(@m,"
+dynamic :: $self->{BASEEXT}.exp
+
+") unless $self->{SKIPHASH}{'dynamic'}; # dynamic and static are subs, so...
+
+ push(@m,"
+static :: $self->{BASEEXT}.exp
+
+") unless $self->{SKIPHASH}{'static'}; # we avoid a warning if we tick them
+
+ push(@m,"
+$self->{BASEEXT}.exp: Makefile.PL
+",' $(PERLRUN) -e \'use ExtUtils::Mksymlists; \\
+ Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ',
+ neatvalue($funcs), ', "FUNCLIST" => ', neatvalue($funclist),
+ ', "DL_VARS" => ', neatvalue($vars), ');\'
+');
+
+ join('',@m);
+}
+
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Any.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Any.pm
new file mode 100755
index 00000000000..4905aebc642
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Any.pm
@@ -0,0 +1,2334 @@
+package ExtUtils::MM_Any;
+
+use strict;
+our $VERSION = '6.56';
+
+use Carp;
+use File::Spec;
+use File::Basename;
+BEGIN { our @ISA = qw(File::Spec); }
+
+# We need $Verbose
+use ExtUtils::MakeMaker qw($Verbose);
+
+use ExtUtils::MakeMaker::Config;
+
+
+# So we don't have to keep calling the methods over and over again,
+# we have these globals to cache the values. Faster and shrtr.
+my $Curdir = __PACKAGE__->curdir;
+my $Rootdir = __PACKAGE__->rootdir;
+my $Updir = __PACKAGE__->updir;
+
+
+=head1 NAME
+
+ExtUtils::MM_Any - Platform-agnostic MM methods
+
+=head1 SYNOPSIS
+
+ FOR INTERNAL USE ONLY!
+
+ package ExtUtils::MM_SomeOS;
+
+ # Temporarily, you have to subclass both. Put MM_Any first.
+ require ExtUtils::MM_Any;
+ require ExtUtils::MM_Unix;
+ @ISA = qw(ExtUtils::MM_Any ExtUtils::Unix);
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY!>
+
+ExtUtils::MM_Any is a superclass for the ExtUtils::MM_* set of
+modules. It contains methods which are either inherently
+cross-platform or are written in a cross-platform manner.
+
+Subclass off of ExtUtils::MM_Any I<and> ExtUtils::MM_Unix. This is a
+temporary solution.
+
+B<THIS MAY BE TEMPORARY!>
+
+
+=head1 METHODS
+
+Any methods marked I<Abstract> must be implemented by subclasses.
+
+
+=head2 Cross-platform helper methods
+
+These are methods which help writing cross-platform code.
+
+
+
+=head3 os_flavor I<Abstract>
+
+ my @os_flavor = $mm->os_flavor;
+
+@os_flavor is the style of operating system this is, usually
+corresponding to the MM_*.pm file we're using.
+
+The first element of @os_flavor is the major family (ie. Unix,
+Windows, VMS, OS/2, etc...) and the rest are sub families.
+
+Some examples:
+
+ Cygwin98 ('Unix', 'Cygwin', 'Cygwin9x')
+ Windows ('Win32')
+ Win98 ('Win32', 'Win9x')
+ Linux ('Unix', 'Linux')
+ MacOS X ('Unix', 'Darwin', 'MacOS', 'MacOS X')
+ OS/2 ('OS/2')
+
+This is used to write code for styles of operating system.
+See os_flavor_is() for use.
+
+
+=head3 os_flavor_is
+
+ my $is_this_flavor = $mm->os_flavor_is($this_flavor);
+ my $is_this_flavor = $mm->os_flavor_is(@one_of_these_flavors);
+
+Checks to see if the current operating system is one of the given flavors.
+
+This is useful for code like:
+
+ if( $mm->os_flavor_is('Unix') ) {
+ $out = `foo 2>&1`;
+ }
+ else {
+ $out = `foo`;
+ }
+
+=cut
+
+sub os_flavor_is {
+ my $self = shift;
+ my %flavors = map { ($_ => 1) } $self->os_flavor;
+ return (grep { $flavors{$_} } @_) ? 1 : 0;
+}
+
+
+=head3 can_load_xs
+
+ my $can_load_xs = $self->can_load_xs;
+
+Returns true if we have the ability to load XS.
+
+This is important because miniperl, used to build XS modules in the
+core, can not load XS.
+
+=cut
+
+sub can_load_xs {
+ return defined &DynaLoader::boot_DynaLoader ? 1 : 0;
+}
+
+
+=head3 split_command
+
+ my @cmds = $MM->split_command($cmd, @args);
+
+Most OS have a maximum command length they can execute at once. Large
+modules can easily generate commands well past that limit. Its
+necessary to split long commands up into a series of shorter commands.
+
+C<split_command> will return a series of @cmds each processing part of
+the args. Collectively they will process all the arguments. Each
+individual line in @cmds will not be longer than the
+$self->max_exec_len being careful to take into account macro expansion.
+
+$cmd should include any switches and repeated initial arguments.
+
+If no @args are given, no @cmds will be returned.
+
+Pairs of arguments will always be preserved in a single command, this
+is a heuristic for things like pm_to_blib and pod2man which work on
+pairs of arguments. This makes things like this safe:
+
+ $self->split_command($cmd, %pod2man);
+
+
+=cut
+
+sub split_command {
+ my($self, $cmd, @args) = @_;
+
+ my @cmds = ();
+ return(@cmds) unless @args;
+
+ # If the command was given as a here-doc, there's probably a trailing
+ # newline.
+ chomp $cmd;
+
+ # set aside 30% for macro expansion.
+ my $len_left = int($self->max_exec_len * 0.70);
+ $len_left -= length $self->_expand_macros($cmd);
+
+ do {
+ my $arg_str = '';
+ my @next_args;
+ while( @next_args = splice(@args, 0, 2) ) {
+ # Two at a time to preserve pairs.
+ my $next_arg_str = "\t ". join ' ', @next_args, "\n";
+
+ if( !length $arg_str ) {
+ $arg_str .= $next_arg_str
+ }
+ elsif( length($arg_str) + length($next_arg_str) > $len_left ) {
+ unshift @args, @next_args;
+ last;
+ }
+ else {
+ $arg_str .= $next_arg_str;
+ }
+ }
+ chop $arg_str;
+
+ push @cmds, $self->escape_newlines("$cmd \n$arg_str");
+ } while @args;
+
+ return @cmds;
+}
+
+
+sub _expand_macros {
+ my($self, $cmd) = @_;
+
+ $cmd =~ s{\$\((\w+)\)}{
+ defined $self->{$1} ? $self->{$1} : "\$($1)"
+ }e;
+ return $cmd;
+}
+
+
+=head3 echo
+
+ my @commands = $MM->echo($text);
+ my @commands = $MM->echo($text, $file);
+ my @commands = $MM->echo($text, $file, $appending);
+
+Generates a set of @commands which print the $text to a $file.
+
+If $file is not given, output goes to STDOUT.
+
+If $appending is true the $file will be appended to rather than
+overwritten.
+
+=cut
+
+sub echo {
+ my($self, $text, $file, $appending) = @_;
+ $appending ||= 0;
+
+ my @cmds = map { '$(NOECHO) $(ECHO) '.$self->quote_literal($_) }
+ split /\n/, $text;
+ if( $file ) {
+ my $redirect = $appending ? '>>' : '>';
+ $cmds[0] .= " $redirect $file";
+ $_ .= " >> $file" foreach @cmds[1..$#cmds];
+ }
+
+ return @cmds;
+}
+
+
+=head3 wraplist
+
+ my $args = $mm->wraplist(@list);
+
+Takes an array of items and turns them into a well-formatted list of
+arguments. In most cases this is simply something like:
+
+ FOO \
+ BAR \
+ BAZ
+
+=cut
+
+sub wraplist {
+ my $self = shift;
+ return join " \\\n\t", @_;
+}
+
+
+=head3 maketext_filter
+
+ my $filter_make_text = $mm->maketext_filter($make_text);
+
+The text of the Makefile is run through this method before writing to
+disk. It allows systems a chance to make portability fixes to the
+Makefile.
+
+By default it does nothing.
+
+This method is protected and not intended to be called outside of
+MakeMaker.
+
+=cut
+
+sub maketext_filter { return $_[1] }
+
+
+=head3 cd I<Abstract>
+
+ my $subdir_cmd = $MM->cd($subdir, @cmds);
+
+This will generate a make fragment which runs the @cmds in the given
+$dir. The rough equivalent to this, except cross platform.
+
+ cd $subdir && $cmd
+
+Currently $dir can only go down one level. "foo" is fine. "foo/bar" is
+not. "../foo" is right out.
+
+The resulting $subdir_cmd has no leading tab nor trailing newline. This
+makes it easier to embed in a make string. For example.
+
+ my $make = sprintf <<'CODE', $subdir_cmd;
+ foo :
+ $(ECHO) what
+ %s
+ $(ECHO) mouche
+ CODE
+
+
+=head3 oneliner I<Abstract>
+
+ my $oneliner = $MM->oneliner($perl_code);
+ my $oneliner = $MM->oneliner($perl_code, \@switches);
+
+This will generate a perl one-liner safe for the particular platform
+you're on based on the given $perl_code and @switches (a -e is
+assumed) suitable for using in a make target. It will use the proper
+shell quoting and escapes.
+
+$(PERLRUN) will be used as perl.
+
+Any newlines in $perl_code will be escaped. Leading and trailing
+newlines will be stripped. Makes this idiom much easier:
+
+ my $code = $MM->oneliner(<<'CODE', [...switches...]);
+some code here
+another line here
+CODE
+
+Usage might be something like:
+
+ # an echo emulation
+ $oneliner = $MM->oneliner('print "Foo\n"');
+ $make = '$oneliner > somefile';
+
+All dollar signs must be doubled in the $perl_code if you expect them
+to be interpreted normally, otherwise it will be considered a make
+macro. Also remember to quote make macros else it might be used as a
+bareword. For example:
+
+ # Assign the value of the $(VERSION_FROM) make macro to $vf.
+ $oneliner = $MM->oneliner('$$vf = "$(VERSION_FROM)"');
+
+Its currently very simple and may be expanded sometime in the figure
+to include more flexible code and switches.
+
+
+=head3 quote_literal I<Abstract>
+
+ my $safe_text = $MM->quote_literal($text);
+
+This will quote $text so it is interpreted literally in the shell.
+
+For example, on Unix this would escape any single-quotes in $text and
+put single-quotes around the whole thing.
+
+
+=head3 escape_newlines I<Abstract>
+
+ my $escaped_text = $MM->escape_newlines($text);
+
+Shell escapes newlines in $text.
+
+
+=head3 max_exec_len I<Abstract>
+
+ my $max_exec_len = $MM->max_exec_len;
+
+Calculates the maximum command size the OS can exec. Effectively,
+this is the max size of a shell command line.
+
+=for _private
+$self->{_MAX_EXEC_LEN} is set by this method, but only for testing purposes.
+
+
+=head3 make
+
+ my $make = $MM->make;
+
+Returns the make variant we're generating the Makefile for. This attempts
+to do some normalization on the information from %Config or the user.
+
+=cut
+
+sub make {
+ my $self = shift;
+
+ my $make = lc $self->{MAKE};
+
+ # Truncate anything like foomake6 to just foomake.
+ $make =~ s/^(\w+make).*/$1/;
+
+ # Turn gnumake into gmake.
+ $make =~ s/^gnu/g/;
+
+ return $make;
+}
+
+
+=head2 Targets
+
+These are methods which produce make targets.
+
+
+=head3 all_target
+
+Generate the default target 'all'.
+
+=cut
+
+sub all_target {
+ my $self = shift;
+
+ return <<'MAKE_EXT';
+all :: pure_all
+ $(NOECHO) $(NOOP)
+MAKE_EXT
+
+}
+
+
+=head3 blibdirs_target
+
+ my $make_frag = $mm->blibdirs_target;
+
+Creates the blibdirs target which creates all the directories we use
+in blib/.
+
+The blibdirs.ts target is deprecated. Depend on blibdirs instead.
+
+
+=cut
+
+sub blibdirs_target {
+ my $self = shift;
+
+ my @dirs = map { uc "\$(INST_$_)" } qw(libdir archlib
+ autodir archautodir
+ bin script
+ man1dir man3dir
+ );
+
+ my @exists = map { $_.'$(DFSEP).exists' } @dirs;
+
+ my $make = sprintf <<'MAKE', join(' ', @exists);
+blibdirs : %s
+ $(NOECHO) $(NOOP)
+
+# Backwards compat with 6.18 through 6.25
+blibdirs.ts : blibdirs
+ $(NOECHO) $(NOOP)
+
+MAKE
+
+ $make .= $self->dir_target(@dirs);
+
+ return $make;
+}
+
+
+=head3 clean (o)
+
+Defines the clean target.
+
+=cut
+
+sub clean {
+# --- Cleanup and Distribution Sections ---
+
+ my($self, %attribs) = @_;
+ my @m;
+ push(@m, '
+# Delete temporary files but do not touch installed files. We don\'t delete
+# the Makefile here so a later make realclean still has a makefile to use.
+
+clean :: clean_subdirs
+');
+
+ my @files = values %{$self->{XS}}; # .c files from *.xs files
+ my @dirs = qw(blib);
+
+ # Normally these are all under blib but they might have been
+ # redefined.
+ # XXX normally this would be a good idea, but the Perl core sets
+ # INST_LIB = ../../lib rather than actually installing the files.
+ # So a "make clean" in an ext/ directory would blow away lib.
+ # Until the core is adjusted let's leave this out.
+# push @dirs, qw($(INST_ARCHLIB) $(INST_LIB)
+# $(INST_BIN) $(INST_SCRIPT)
+# $(INST_MAN1DIR) $(INST_MAN3DIR)
+# $(INST_LIBDIR) $(INST_ARCHLIBDIR) $(INST_AUTODIR)
+# $(INST_STATIC) $(INST_DYNAMIC) $(INST_BOOT)
+# );
+
+
+ if( $attribs{FILES} ) {
+ # Use @dirs because we don't know what's in here.
+ push @dirs, ref $attribs{FILES} ?
+ @{$attribs{FILES}} :
+ split /\s+/, $attribs{FILES} ;
+ }
+
+ push(@files, qw[$(MAKE_APERL_FILE)
+ perlmain.c tmon.out mon.out so_locations
+ blibdirs.ts pm_to_blib pm_to_blib.ts
+ *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT)
+ $(BOOTSTRAP) $(BASEEXT).bso
+ $(BASEEXT).def lib$(BASEEXT).def
+ $(BASEEXT).exp $(BASEEXT).x
+ ]);
+
+ push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
+ push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.ld'));
+
+ # core files
+ push(@files, qw[core core.*perl.*.? *perl.core]);
+ push(@files, map { "core." . "[0-9]"x$_ } (1..5));
+
+ # OS specific things to clean up. Use @dirs since we don't know
+ # what might be in here.
+ push @dirs, $self->extra_clean_files;
+
+ # Occasionally files are repeated several times from different sources
+ { my(%f) = map { ($_ => 1) } @files; @files = keys %f; }
+ { my(%d) = map { ($_ => 1) } @dirs; @dirs = keys %d; }
+
+ push @m, map "\t$_\n", $self->split_command('- $(RM_F)', @files);
+ push @m, map "\t$_\n", $self->split_command('- $(RM_RF)', @dirs);
+
+ # Leave Makefile.old around for realclean
+ push @m, <<'MAKE';
+ - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
+MAKE
+
+ push(@m, "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
+
+ join("", @m);
+}
+
+
+=head3 clean_subdirs_target
+
+ my $make_frag = $MM->clean_subdirs_target;
+
+Returns the clean_subdirs target. This is used by the clean target to
+call clean on any subdirectories which contain Makefiles.
+
+=cut
+
+sub clean_subdirs_target {
+ my($self) = shift;
+
+ # No subdirectories, no cleaning.
+ return <<'NOOP_FRAG' unless @{$self->{DIR}};
+clean_subdirs :
+ $(NOECHO) $(NOOP)
+NOOP_FRAG
+
+
+ my $clean = "clean_subdirs :\n";
+
+ for my $dir (@{$self->{DIR}}) {
+ my $subclean = $self->oneliner(sprintf <<'CODE', $dir);
+chdir '%s'; system '$(MAKE) clean' if -f '$(FIRST_MAKEFILE)';
+CODE
+
+ $clean .= "\t$subclean\n";
+ }
+
+ return $clean;
+}
+
+
+=head3 dir_target
+
+ my $make_frag = $mm->dir_target(@directories);
+
+Generates targets to create the specified directories and set its
+permission to PERM_DIR.
+
+Because depending on a directory to just ensure it exists doesn't work
+too well (the modified time changes too often) dir_target() creates a
+.exists file in the created directory. It is this you should depend on.
+For portability purposes you should use the $(DIRFILESEP) macro rather
+than a '/' to seperate the directory from the file.
+
+ yourdirectory$(DIRFILESEP).exists
+
+=cut
+
+sub dir_target {
+ my($self, @dirs) = @_;
+
+ my $make = '';
+ foreach my $dir (@dirs) {
+ $make .= sprintf <<'MAKE', ($dir) x 7;
+%s$(DFSEP).exists :: Makefile.PL
+ $(NOECHO) $(MKPATH) %s
+ $(NOECHO) $(CHMOD) $(PERM_DIR) %s
+ $(NOECHO) $(TOUCH) %s$(DFSEP).exists
+
+MAKE
+
+ }
+
+ return $make;
+}
+
+
+=head3 distdir
+
+Defines the scratch directory target that will hold the distribution
+before tar-ing (or shar-ing).
+
+=cut
+
+# For backwards compatibility.
+*dist_dir = *distdir;
+
+sub distdir {
+ my($self) = shift;
+
+ my $meta_target = $self->{NO_META} ? '' : 'distmeta';
+ my $sign_target = !$self->{SIGN} ? '' : 'distsignature';
+
+ return sprintf <<'MAKE_FRAG', $meta_target, $sign_target;
+create_distdir :
+ $(RM_RF) $(DISTVNAME)
+ $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \
+ -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
+
+distdir : create_distdir %s %s
+ $(NOECHO) $(NOOP)
+
+MAKE_FRAG
+
+}
+
+
+=head3 dist_test
+
+Defines a target that produces the distribution in the
+scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
+subdirectory.
+
+=cut
+
+sub dist_test {
+ my($self) = shift;
+
+ my $mpl_args = join " ", map qq["$_"], @ARGV;
+
+ my $test = $self->cd('$(DISTVNAME)',
+ '$(ABSPERLRUN) Makefile.PL '.$mpl_args,
+ '$(MAKE) $(PASTHRU)',
+ '$(MAKE) test $(PASTHRU)'
+ );
+
+ return sprintf <<'MAKE_FRAG', $test;
+disttest : distdir
+ %s
+
+MAKE_FRAG
+
+
+}
+
+
+=head3 dynamic (o)
+
+Defines the dynamic target.
+
+=cut
+
+sub dynamic {
+# --- Dynamic Loading Sections ---
+
+ my($self) = shift;
+ '
+dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT)
+ $(NOECHO) $(NOOP)
+';
+}
+
+
+=head3 makemakerdflt_target
+
+ my $make_frag = $mm->makemakerdflt_target
+
+Returns a make fragment with the makemakerdeflt_target specified.
+This target is the first target in the Makefile, is the default target
+and simply points off to 'all' just in case any make variant gets
+confused or something gets snuck in before the real 'all' target.
+
+=cut
+
+sub makemakerdflt_target {
+ return <<'MAKE_FRAG';
+makemakerdflt : all
+ $(NOECHO) $(NOOP)
+MAKE_FRAG
+
+}
+
+
+=head3 manifypods_target
+
+ my $manifypods_target = $self->manifypods_target;
+
+Generates the manifypods target. This target generates man pages from
+all POD files in MAN1PODS and MAN3PODS.
+
+=cut
+
+sub manifypods_target {
+ my($self) = shift;
+
+ my $man1pods = '';
+ my $man3pods = '';
+ my $dependencies = '';
+
+ # populate manXpods & dependencies:
+ foreach my $name (keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}}) {
+ $dependencies .= " \\\n\t$name";
+ }
+
+ my $manify = <<END;
+manifypods : pure_all $dependencies
+END
+
+ my @man_cmds;
+ foreach my $section (qw(1 3)) {
+ my $pods = $self->{"MAN${section}PODS"};
+ push @man_cmds, $self->split_command(<<CMD, %$pods);
+ \$(NOECHO) \$(POD2MAN) --section=$section --perm_rw=\$(PERM_RW)
+CMD
+ }
+
+ $manify .= "\t\$(NOECHO) \$(NOOP)\n" unless @man_cmds;
+ $manify .= join '', map { "$_\n" } @man_cmds;
+
+ return $manify;
+}
+
+
+=head3 metafile_target
+
+ my $target = $mm->metafile_target;
+
+Generate the metafile target.
+
+Writes the file META.yml YAML encoded meta-data about the module in
+the distdir. The format follows Module::Build's as closely as
+possible.
+
+=cut
+
+sub metafile_target {
+ my $self = shift;
+
+ return <<'MAKE_FRAG' if $self->{NO_META};
+metafile :
+ $(NOECHO) $(NOOP)
+MAKE_FRAG
+
+ my @metadata = $self->metafile_data(
+ $self->{META_ADD} || {},
+ $self->{META_MERGE} || {},
+ );
+ my $meta = $self->metafile_file(@metadata);
+ my @write_meta = $self->echo($meta, 'META_new.yml');
+
+ return sprintf <<'MAKE_FRAG', join("\n\t", @write_meta);
+metafile : create_distdir
+ $(NOECHO) $(ECHO) Generating META.yml
+ %s
+ -$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml
+MAKE_FRAG
+
+}
+
+
+=begin private
+
+=head3 _sort_pairs
+
+ my @pairs = _sort_pairs($sort_sub, \%hash);
+
+Sorts the pairs of a hash based on keys ordered according
+to C<$sort_sub>.
+
+=end private
+
+=cut
+
+sub _sort_pairs {
+ my $sort = shift;
+ my $pairs = shift;
+ return map { $_ => $pairs->{$_} }
+ sort $sort
+ keys %$pairs;
+}
+
+
+# Taken from Module::Build::Base
+sub _hash_merge {
+ my ($self, $h, $k, $v) = @_;
+ if (ref $h->{$k} eq 'ARRAY') {
+ push @{$h->{$k}}, ref $v ? @$v : $v;
+ } elsif (ref $h->{$k} eq 'HASH') {
+ $self->_hash_merge($h->{$k}, $_, $v->{$_}) foreach keys %$v;
+ } else {
+ $h->{$k} = $v;
+ }
+}
+
+
+=head3 metafile_data
+
+ my @metadata_pairs = $mm->metafile_data(\%meta_add, \%meta_merge);
+
+Returns the data which MakeMaker turns into the META.yml file.
+
+Values of %meta_add will overwrite any existing metadata in those
+keys. %meta_merge will be merged with them.
+
+=cut
+
+sub metafile_data {
+ my $self = shift;
+ my($meta_add, $meta_merge) = @_;
+
+ # The order in which standard meta keys should be written.
+ my @meta_order = qw(
+ name
+ version
+ abstract
+ author
+ license
+ distribution_type
+
+ configure_requires
+ build_requires
+ requires
+
+ resources
+
+ provides
+ no_index
+
+ generated_by
+ meta-spec
+ );
+
+ # Check the original args so we can tell between the user setting it
+ # to an empty hash and it just being initialized.
+ my $configure_requires;
+ if( $self->{ARGS}{CONFIGURE_REQUIRES} ) {
+ $configure_requires = $self->{CONFIGURE_REQUIRES};
+ } else {
+ $configure_requires = {
+ 'ExtUtils::MakeMaker' => 0,
+ };
+ }
+ my $build_requires;
+ if( $self->{ARGS}{BUILD_REQUIRES} ) {
+ $build_requires = $self->{BUILD_REQUIRES};
+ } else {
+ $build_requires = {
+ 'ExtUtils::MakeMaker' => 0,
+ };
+ }
+
+ my %meta = (
+ name => $self->{DISTNAME},
+ version => $self->{VERSION},
+ abstract => $self->{ABSTRACT},
+ license => $self->{LICENSE} || 'unknown',
+ distribution_type => $self->{PM} ? 'module' : 'script',
+
+ configure_requires => $configure_requires,
+
+ build_requires => $build_requires,
+
+ no_index => {
+ directory => [qw(t inc)]
+ },
+
+ generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
+ 'meta-spec' => {
+ url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
+ version => 1.4
+ },
+ );
+
+ # The author key is required and it takes a list.
+ $meta{author} = defined $self->{AUTHOR} ? [$self->{AUTHOR}] : [];
+
+ $meta{requires} = $self->{PREREQ_PM} if defined $self->{PREREQ_PM};
+ $meta{requires}{perl} = $self->{MIN_PERL_VERSION} if $self->{MIN_PERL_VERSION};
+
+ while( my($key, $val) = each %$meta_add ) {
+ $meta{$key} = $val;
+ }
+
+ while( my($key, $val) = each %$meta_merge ) {
+ $self->_hash_merge(\%meta, $key, $val);
+ }
+
+ my @meta_pairs;
+
+ # Put the standard keys first in the proper order.
+ for my $key (@meta_order) {
+ next unless exists $meta{$key};
+
+ push @meta_pairs, $key, delete $meta{$key};
+ }
+
+ # Then tack everything else onto the end, alpha sorted.
+ for my $key (sort {lc $a cmp lc $b} keys %meta) {
+ push @meta_pairs, $key, $meta{$key};
+ }
+
+ return @meta_pairs
+}
+
+=begin private
+
+=head3 _dump_hash
+
+ $yaml = _dump_hash(\%options, %hash);
+
+Implements a fake YAML dumper for a hash given
+as a list of pairs. No quoting/escaping is done. Keys
+are supposed to be strings. Values are undef, strings,
+hash refs or array refs of strings.
+
+Supported options are:
+
+ delta => STR - indentation delta
+ use_header => BOOL - whether to include a YAML header
+ indent => STR - a string of spaces
+ default: ''
+
+ max_key_length => INT - maximum key length used to align
+ keys and values of the same hash
+ default: 20
+ key_sort => CODE - a sort sub
+ It may be undef, which means no sorting by keys
+ default: sub { lc $a cmp lc $b }
+
+ customs => HASH - special options for certain keys
+ (whose values are hashes themselves)
+ may contain: max_key_length, key_sort, customs
+
+=end private
+
+=cut
+
+sub _dump_hash {
+ croak "first argument should be a hash ref" unless ref $_[0] eq 'HASH';
+ my $options = shift;
+ my %hash = @_;
+
+ # Use a list to preserve order.
+ my @pairs;
+
+ my $k_sort
+ = exists $options->{key_sort} ? $options->{key_sort}
+ : sub { lc $a cmp lc $b };
+ if ($k_sort) {
+ croak "'key_sort' should be a coderef" unless ref $k_sort eq 'CODE';
+ @pairs = _sort_pairs($k_sort, \%hash);
+ } else { # list of pairs, no sorting
+ @pairs = @_;
+ }
+
+ my $yaml = $options->{use_header} ? "--- #YAML:1.0\n" : '';
+ my $indent = $options->{indent} || '';
+ my $k_length = min(
+ ($options->{max_key_length} || 20),
+ max(map { length($_) + 1 } grep { !ref $hash{$_} } keys %hash)
+ );
+ my $customs = $options->{customs} || {};
+
+ # printf format for key
+ my $k_format = "%-${k_length}s";
+
+ while( @pairs ) {
+ my($key, $val) = splice @pairs, 0, 2;
+ $val = '~' unless defined $val;
+ if(ref $val eq 'HASH') {
+ if ( keys %$val ) {
+ my %k_options = ( # options for recursive call
+ delta => $options->{delta},
+ use_header => 0,
+ indent => $indent . $options->{delta},
+ );
+ if (exists $customs->{$key}) {
+ my %k_custom = %{$customs->{$key}};
+ foreach my $k qw(key_sort max_key_length customs) {
+ $k_options{$k} = $k_custom{$k} if exists $k_custom{$k};
+ }
+ }
+ $yaml .= $indent . "$key:\n"
+ . _dump_hash(\%k_options, %$val);
+ }
+ else {
+ $yaml .= $indent . "$key: {}\n";
+ }
+ }
+ elsif (ref $val eq 'ARRAY') {
+ if( @$val ) {
+ $yaml .= $indent . "$key:\n";
+
+ for (@$val) {
+ croak "only nested arrays of non-refs are supported" if ref $_;
+ $yaml .= $indent . $options->{delta} . "- $_\n";
+ }
+ }
+ else {
+ $yaml .= $indent . "$key: []\n";
+ }
+ }
+ elsif( ref $val and !blessed($val) ) {
+ croak "only nested hashes, arrays and objects are supported";
+ }
+ else { # if it's an object, just stringify it
+ $yaml .= $indent . sprintf "$k_format %s\n", "$key:", $val;
+ }
+ };
+
+ return $yaml;
+
+}
+
+sub blessed {
+ return eval { $_[0]->isa("UNIVERSAL"); };
+}
+
+sub max {
+ return (sort { $b <=> $a } @_)[0];
+}
+
+sub min {
+ return (sort { $a <=> $b } @_)[0];
+}
+
+=head3 metafile_file
+
+ my $meta_yml = $mm->metafile_file(@metadata_pairs);
+
+Turns the @metadata_pairs into YAML.
+
+This method does not implement a complete YAML dumper, being limited
+to dump a hash with values which are strings, undef's or nested hashes
+and arrays of strings. No quoting/escaping is done.
+
+=cut
+
+sub metafile_file {
+ my $self = shift;
+
+ my %dump_options = (
+ use_header => 1,
+ delta => ' ' x 4,
+ key_sort => undef,
+ );
+ return _dump_hash(\%dump_options, @_);
+
+}
+
+
+=head3 distmeta_target
+
+ my $make_frag = $mm->distmeta_target;
+
+Generates the distmeta target to add META.yml to the MANIFEST in the
+distdir.
+
+=cut
+
+sub distmeta_target {
+ my $self = shift;
+
+ my $add_meta = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
+eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) }
+ or print "Could not add META.yml to MANIFEST: $${'@'}\n"
+CODE
+
+ my $add_meta_to_distdir = $self->cd('$(DISTVNAME)', $add_meta);
+
+ return sprintf <<'MAKE', $add_meta_to_distdir;
+distmeta : create_distdir metafile
+ $(NOECHO) %s
+
+MAKE
+
+}
+
+
+=head3 realclean (o)
+
+Defines the realclean target.
+
+=cut
+
+sub realclean {
+ my($self, %attribs) = @_;
+
+ my @dirs = qw($(DISTVNAME));
+ my @files = qw($(FIRST_MAKEFILE) $(MAKEFILE_OLD));
+
+ # Special exception for the perl core where INST_* is not in blib.
+ # This cleans up the files built from the ext/ directory (all XS).
+ if( $self->{PERL_CORE} ) {
+ push @dirs, qw($(INST_AUTODIR) $(INST_ARCHAUTODIR));
+ push @files, values %{$self->{PM}};
+ }
+
+ if( $self->has_link_code ){
+ push @files, qw($(OBJECT));
+ }
+
+ if( $attribs{FILES} ) {
+ if( ref $attribs{FILES} ) {
+ push @dirs, @{ $attribs{FILES} };
+ }
+ else {
+ push @dirs, split /\s+/, $attribs{FILES};
+ }
+ }
+
+ # Occasionally files are repeated several times from different sources
+ { my(%f) = map { ($_ => 1) } @files; @files = keys %f; }
+ { my(%d) = map { ($_ => 1) } @dirs; @dirs = keys %d; }
+
+ my $rm_cmd = join "\n\t", map { "$_" }
+ $self->split_command('- $(RM_F)', @files);
+ my $rmf_cmd = join "\n\t", map { "$_" }
+ $self->split_command('- $(RM_RF)', @dirs);
+
+ my $m = sprintf <<'MAKE', $rm_cmd, $rmf_cmd;
+# Delete temporary files (via clean) and also delete dist files
+realclean purge :: clean realclean_subdirs
+ %s
+ %s
+MAKE
+
+ $m .= "\t$attribs{POSTOP}\n" if $attribs{POSTOP};
+
+ return $m;
+}
+
+
+=head3 realclean_subdirs_target
+
+ my $make_frag = $MM->realclean_subdirs_target;
+
+Returns the realclean_subdirs target. This is used by the realclean
+target to call realclean on any subdirectories which contain Makefiles.
+
+=cut
+
+sub realclean_subdirs_target {
+ my $self = shift;
+
+ return <<'NOOP_FRAG' unless @{$self->{DIR}};
+realclean_subdirs :
+ $(NOECHO) $(NOOP)
+NOOP_FRAG
+
+ my $rclean = "realclean_subdirs :\n";
+
+ foreach my $dir (@{$self->{DIR}}) {
+ foreach my $makefile ('$(MAKEFILE_OLD)', '$(FIRST_MAKEFILE)' ) {
+ my $subrclean .= $self->oneliner(sprintf <<'CODE', $dir, ($makefile) x 2);
+chdir '%s'; system '$(MAKE) $(USEMAKEFILE) %s realclean' if -f '%s';
+CODE
+
+ $rclean .= sprintf <<'RCLEAN', $subrclean;
+ - %s
+RCLEAN
+
+ }
+ }
+
+ return $rclean;
+}
+
+
+=head3 signature_target
+
+ my $target = $mm->signature_target;
+
+Generate the signature target.
+
+Writes the file SIGNATURE with "cpansign -s".
+
+=cut
+
+sub signature_target {
+ my $self = shift;
+
+ return <<'MAKE_FRAG';
+signature :
+ cpansign -s
+MAKE_FRAG
+
+}
+
+
+=head3 distsignature_target
+
+ my $make_frag = $mm->distsignature_target;
+
+Generates the distsignature target to add SIGNATURE to the MANIFEST in the
+distdir.
+
+=cut
+
+sub distsignature_target {
+ my $self = shift;
+
+ my $add_sign = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
+eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) }
+ or print "Could not add SIGNATURE to MANIFEST: $${'@'}\n"
+CODE
+
+ my $sign_dist = $self->cd('$(DISTVNAME)' => 'cpansign -s');
+
+ # cpansign -s complains if SIGNATURE is in the MANIFEST yet does not
+ # exist
+ my $touch_sig = $self->cd('$(DISTVNAME)' => '$(TOUCH) SIGNATURE');
+ my $add_sign_to_dist = $self->cd('$(DISTVNAME)' => $add_sign );
+
+ return sprintf <<'MAKE', $add_sign_to_dist, $touch_sig, $sign_dist
+distsignature : create_distdir
+ $(NOECHO) %s
+ $(NOECHO) %s
+ %s
+
+MAKE
+
+}
+
+
+=head3 special_targets
+
+ my $make_frag = $mm->special_targets
+
+Returns a make fragment containing any targets which have special
+meaning to make. For example, .SUFFIXES and .PHONY.
+
+=cut
+
+sub special_targets {
+ my $make_frag = <<'MAKE_FRAG';
+.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
+
+.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir
+
+MAKE_FRAG
+
+ $make_frag .= <<'MAKE_FRAG' if $ENV{CLEARCASE_ROOT};
+.NO_CONFIG_REC: Makefile
+
+MAKE_FRAG
+
+ return $make_frag;
+}
+
+
+
+
+=head2 Init methods
+
+Methods which help initialize the MakeMaker object and macros.
+
+
+=head3 init_ABSTRACT
+
+ $mm->init_ABSTRACT
+
+=cut
+
+sub init_ABSTRACT {
+ my $self = shift;
+
+ if( $self->{ABSTRACT_FROM} and $self->{ABSTRACT} ) {
+ warn "Both ABSTRACT_FROM and ABSTRACT are set. ".
+ "Ignoring ABSTRACT_FROM.\n";
+ return;
+ }
+
+ if ($self->{ABSTRACT_FROM}){
+ $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
+ carp "WARNING: Setting ABSTRACT via file ".
+ "'$self->{ABSTRACT_FROM}' failed\n";
+ }
+}
+
+=head3 init_INST
+
+ $mm->init_INST;
+
+Called by init_main. Sets up all INST_* variables except those related
+to XS code. Those are handled in init_xs.
+
+=cut
+
+sub init_INST {
+ my($self) = shift;
+
+ $self->{INST_ARCHLIB} ||= $self->catdir($Curdir,"blib","arch");
+ $self->{INST_BIN} ||= $self->catdir($Curdir,'blib','bin');
+
+ # INST_LIB typically pre-set if building an extension after
+ # perl has been built and installed. Setting INST_LIB allows
+ # you to build directly into, say $Config{privlibexp}.
+ unless ($self->{INST_LIB}){
+ if ($self->{PERL_CORE}) {
+ if (defined $Cross::platform) {
+ $self->{INST_LIB} = $self->{INST_ARCHLIB} =
+ $self->catdir($self->{PERL_LIB},"..","xlib",
+ $Cross::platform);
+ }
+ else {
+ $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
+ }
+ } else {
+ $self->{INST_LIB} = $self->catdir($Curdir,"blib","lib");
+ }
+ }
+
+ my @parentdir = split(/::/, $self->{PARENT_NAME});
+ $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)', @parentdir);
+ $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)', @parentdir);
+ $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)', 'auto',
+ '$(FULLEXT)');
+ $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)', 'auto',
+ '$(FULLEXT)');
+
+ $self->{INST_SCRIPT} ||= $self->catdir($Curdir,'blib','script');
+
+ $self->{INST_MAN1DIR} ||= $self->catdir($Curdir,'blib','man1');
+ $self->{INST_MAN3DIR} ||= $self->catdir($Curdir,'blib','man3');
+
+ return 1;
+}
+
+
+=head3 init_INSTALL
+
+ $mm->init_INSTALL;
+
+Called by init_main. Sets up all INSTALL_* variables (except
+INSTALLDIRS) and *PREFIX.
+
+=cut
+
+sub init_INSTALL {
+ my($self) = shift;
+
+ if( $self->{ARGS}{INSTALL_BASE} and $self->{ARGS}{PREFIX} ) {
+ die "Only one of PREFIX or INSTALL_BASE can be given. Not both.\n";
+ }
+
+ if( $self->{ARGS}{INSTALL_BASE} ) {
+ $self->init_INSTALL_from_INSTALL_BASE;
+ }
+ else {
+ $self->init_INSTALL_from_PREFIX;
+ }
+}
+
+
+=head3 init_INSTALL_from_PREFIX
+
+ $mm->init_INSTALL_from_PREFIX;
+
+=cut
+
+sub init_INSTALL_from_PREFIX {
+ my $self = shift;
+
+ $self->init_lib2arch;
+
+ # There are often no Config.pm defaults for these new man variables so
+ # we fall back to the old behavior which is to use installman*dir
+ foreach my $num (1, 3) {
+ my $k = 'installsiteman'.$num.'dir';
+
+ $self->{uc $k} ||= uc "\$(installman${num}dir)"
+ unless $Config{$k};
+ }
+
+ foreach my $num (1, 3) {
+ my $k = 'installvendorman'.$num.'dir';
+
+ unless( $Config{$k} ) {
+ $self->{uc $k} ||= $Config{usevendorprefix}
+ ? uc "\$(installman${num}dir)"
+ : '';
+ }
+ }
+
+ $self->{INSTALLSITEBIN} ||= '$(INSTALLBIN)'
+ unless $Config{installsitebin};
+ $self->{INSTALLSITESCRIPT} ||= '$(INSTALLSCRIPT)'
+ unless $Config{installsitescript};
+
+ unless( $Config{installvendorbin} ) {
+ $self->{INSTALLVENDORBIN} ||= $Config{usevendorprefix}
+ ? $Config{installbin}
+ : '';
+ }
+ unless( $Config{installvendorscript} ) {
+ $self->{INSTALLVENDORSCRIPT} ||= $Config{usevendorprefix}
+ ? $Config{installscript}
+ : '';
+ }
+
+
+ my $iprefix = $Config{installprefixexp} || $Config{installprefix} ||
+ $Config{prefixexp} || $Config{prefix} || '';
+ my $vprefix = $Config{usevendorprefix} ? $Config{vendorprefixexp} : '';
+ my $sprefix = $Config{siteprefixexp} || '';
+
+ # 5.005_03 doesn't have a siteprefix.
+ $sprefix = $iprefix unless $sprefix;
+
+
+ $self->{PREFIX} ||= '';
+
+ if( $self->{PREFIX} ) {
+ @{$self}{qw(PERLPREFIX SITEPREFIX VENDORPREFIX)} =
+ ('$(PREFIX)') x 3;
+ }
+ else {
+ $self->{PERLPREFIX} ||= $iprefix;
+ $self->{SITEPREFIX} ||= $sprefix;
+ $self->{VENDORPREFIX} ||= $vprefix;
+
+ # Lots of MM extension authors like to use $(PREFIX) so we
+ # put something sensible in there no matter what.
+ $self->{PREFIX} = '$('.uc $self->{INSTALLDIRS}.'PREFIX)';
+ }
+
+ my $arch = $Config{archname};
+ my $version = $Config{version};
+
+ # default style
+ my $libstyle = $Config{installstyle} || 'lib/perl5';
+ my $manstyle = '';
+
+ if( $self->{LIBSTYLE} ) {
+ $libstyle = $self->{LIBSTYLE};
+ $manstyle = $self->{LIBSTYLE} eq 'lib/perl5' ? 'lib/perl5' : '';
+ }
+
+ # Some systems, like VOS, set installman*dir to '' if they can't
+ # read man pages.
+ for my $num (1, 3) {
+ $self->{'INSTALLMAN'.$num.'DIR'} ||= 'none'
+ unless $Config{'installman'.$num.'dir'};
+ }
+
+ my %bin_layouts =
+ (
+ bin => { s => $iprefix,
+ t => 'perl',
+ d => 'bin' },
+ vendorbin => { s => $vprefix,
+ t => 'vendor',
+ d => 'bin' },
+ sitebin => { s => $sprefix,
+ t => 'site',
+ d => 'bin' },
+ script => { s => $iprefix,
+ t => 'perl',
+ d => 'bin' },
+ vendorscript=> { s => $vprefix,
+ t => 'vendor',
+ d => 'bin' },
+ sitescript => { s => $sprefix,
+ t => 'site',
+ d => 'bin' },
+ );
+
+ my %man_layouts =
+ (
+ man1dir => { s => $iprefix,
+ t => 'perl',
+ d => 'man/man1',
+ style => $manstyle, },
+ siteman1dir => { s => $sprefix,
+ t => 'site',
+ d => 'man/man1',
+ style => $manstyle, },
+ vendorman1dir => { s => $vprefix,
+ t => 'vendor',
+ d => 'man/man1',
+ style => $manstyle, },
+
+ man3dir => { s => $iprefix,
+ t => 'perl',
+ d => 'man/man3',
+ style => $manstyle, },
+ siteman3dir => { s => $sprefix,
+ t => 'site',
+ d => 'man/man3',
+ style => $manstyle, },
+ vendorman3dir => { s => $vprefix,
+ t => 'vendor',
+ d => 'man/man3',
+ style => $manstyle, },
+ );
+
+ my %lib_layouts =
+ (
+ privlib => { s => $iprefix,
+ t => 'perl',
+ d => '',
+ style => $libstyle, },
+ vendorlib => { s => $vprefix,
+ t => 'vendor',
+ d => '',
+ style => $libstyle, },
+ sitelib => { s => $sprefix,
+ t => 'site',
+ d => 'site_perl',
+ style => $libstyle, },
+
+ archlib => { s => $iprefix,
+ t => 'perl',
+ d => "$version/$arch",
+ style => $libstyle },
+ vendorarch => { s => $vprefix,
+ t => 'vendor',
+ d => "$version/$arch",
+ style => $libstyle },
+ sitearch => { s => $sprefix,
+ t => 'site',
+ d => "site_perl/$version/$arch",
+ style => $libstyle },
+ );
+
+
+ # Special case for LIB.
+ if( $self->{LIB} ) {
+ foreach my $var (keys %lib_layouts) {
+ my $Installvar = uc "install$var";
+
+ if( $var =~ /arch/ ) {
+ $self->{$Installvar} ||=
+ $self->catdir($self->{LIB}, $Config{archname});
+ }
+ else {
+ $self->{$Installvar} ||= $self->{LIB};
+ }
+ }
+ }
+
+ my %type2prefix = ( perl => 'PERLPREFIX',
+ site => 'SITEPREFIX',
+ vendor => 'VENDORPREFIX'
+ );
+
+ my %layouts = (%bin_layouts, %man_layouts, %lib_layouts);
+ while( my($var, $layout) = each(%layouts) ) {
+ my($s, $t, $d, $style) = @{$layout}{qw(s t d style)};
+ my $r = '$('.$type2prefix{$t}.')';
+
+ print STDERR "Prefixing $var\n" if $Verbose >= 2;
+
+ my $installvar = "install$var";
+ my $Installvar = uc $installvar;
+ next if $self->{$Installvar};
+
+ $d = "$style/$d" if $style;
+ $self->prefixify($installvar, $s, $r, $d);
+
+ print STDERR " $Installvar == $self->{$Installvar}\n"
+ if $Verbose >= 2;
+ }
+
+ # Generate these if they weren't figured out.
+ $self->{VENDORARCHEXP} ||= $self->{INSTALLVENDORARCH};
+ $self->{VENDORLIBEXP} ||= $self->{INSTALLVENDORLIB};
+
+ return 1;
+}
+
+
+=head3 init_from_INSTALL_BASE
+
+ $mm->init_from_INSTALL_BASE
+
+=cut
+
+my %map = (
+ lib => [qw(lib perl5)],
+ arch => [('lib', 'perl5', $Config{archname})],
+ bin => [qw(bin)],
+ man1dir => [qw(man man1)],
+ man3dir => [qw(man man3)]
+ );
+$map{script} = $map{bin};
+
+sub init_INSTALL_from_INSTALL_BASE {
+ my $self = shift;
+
+ @{$self}{qw(PREFIX VENDORPREFIX SITEPREFIX PERLPREFIX)} =
+ '$(INSTALL_BASE)';
+
+ my %install;
+ foreach my $thing (keys %map) {
+ foreach my $dir (('', 'SITE', 'VENDOR')) {
+ my $uc_thing = uc $thing;
+ my $key = "INSTALL".$dir.$uc_thing;
+
+ $install{$key} ||=
+ $self->catdir('$(INSTALL_BASE)', @{$map{$thing}});
+ }
+ }
+
+ # Adjust for variable quirks.
+ $install{INSTALLARCHLIB} ||= delete $install{INSTALLARCH};
+ $install{INSTALLPRIVLIB} ||= delete $install{INSTALLLIB};
+
+ foreach my $key (keys %install) {
+ $self->{$key} ||= $install{$key};
+ }
+
+ return 1;
+}
+
+
+=head3 init_VERSION I<Abstract>
+
+ $mm->init_VERSION
+
+Initialize macros representing versions of MakeMaker and other tools
+
+MAKEMAKER: path to the MakeMaker module.
+
+MM_VERSION: ExtUtils::MakeMaker Version
+
+MM_REVISION: ExtUtils::MakeMaker version control revision (for backwards
+ compat)
+
+VERSION: version of your module
+
+VERSION_MACRO: which macro represents the version (usually 'VERSION')
+
+VERSION_SYM: like version but safe for use as an RCS revision number
+
+DEFINE_VERSION: -D line to set the module version when compiling
+
+XS_VERSION: version in your .xs file. Defaults to $(VERSION)
+
+XS_VERSION_MACRO: which macro represents the XS version.
+
+XS_DEFINE_VERSION: -D line to set the xs version when compiling.
+
+Called by init_main.
+
+=cut
+
+sub init_VERSION {
+ my($self) = shift;
+
+ $self->{MAKEMAKER} = $ExtUtils::MakeMaker::Filename;
+ $self->{MM_VERSION} = $ExtUtils::MakeMaker::VERSION;
+ $self->{MM_REVISION}= $ExtUtils::MakeMaker::Revision;
+ $self->{VERSION_FROM} ||= '';
+
+ if ($self->{VERSION_FROM}){
+ $self->{VERSION} = $self->parse_version($self->{VERSION_FROM});
+ if( $self->{VERSION} eq 'undef' ) {
+ carp("WARNING: Setting VERSION via file ".
+ "'$self->{VERSION_FROM}' failed\n");
+ }
+ }
+
+ # strip blanks
+ if (defined $self->{VERSION}) {
+ $self->{VERSION} =~ s/^\s+//;
+ $self->{VERSION} =~ s/\s+$//;
+ }
+ else {
+ $self->{VERSION} = '';
+ }
+
+
+ $self->{VERSION_MACRO} = 'VERSION';
+ ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
+ $self->{DEFINE_VERSION} = '-D$(VERSION_MACRO)=\"$(VERSION)\"';
+
+
+ # Graham Barr and Paul Marquess had some ideas how to ensure
+ # version compatibility between the *.pm file and the
+ # corresponding *.xs file. The bottomline was, that we need an
+ # XS_VERSION macro that defaults to VERSION:
+ $self->{XS_VERSION} ||= $self->{VERSION};
+
+ $self->{XS_VERSION_MACRO} = 'XS_VERSION';
+ $self->{XS_DEFINE_VERSION} = '-D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"';
+
+}
+
+
+=head3 init_others
+
+ $MM->init_others();
+
+Initializes the macro definitions used by tools_other() and places them
+in the $MM object.
+
+If there is no description, its the same as the parameter to
+WriteMakefile() documented in ExtUtils::MakeMaker.
+
+Defines at least these macros.
+
+ Macro Description
+
+ NOOP Do nothing
+ NOECHO Tell make not to display the command itself
+
+ MAKEFILE
+ FIRST_MAKEFILE
+ MAKEFILE_OLD
+ MAKE_APERL_FILE File used by MAKE_APERL
+
+ SHELL Program used to run shell commands
+
+ ECHO Print text adding a newline on the end
+ RM_F Remove a file
+ RM_RF Remove a directory
+ TOUCH Update a file's timestamp
+ TEST_F Test for a file's existence
+ CP Copy a file
+ MV Move a file
+ CHMOD Change permissions on a file
+ FALSE Exit with non-zero
+ TRUE Exit with zero
+
+ UMASK_NULL Nullify umask
+ DEV_NULL Suppress all command output
+
+=cut
+
+sub init_others {
+ my $self = shift;
+
+ $self->{ECHO} ||= $self->oneliner('print qq{@ARGV}', ['-l']);
+ $self->{ECHO_N} ||= $self->oneliner('print qq{@ARGV}');
+
+ $self->{TOUCH} ||= $self->oneliner('touch', ["-MExtUtils::Command"]);
+ $self->{CHMOD} ||= $self->oneliner('chmod', ["-MExtUtils::Command"]);
+ $self->{RM_F} ||= $self->oneliner('rm_f', ["-MExtUtils::Command"]);
+ $self->{RM_RF} ||= $self->oneliner('rm_rf', ["-MExtUtils::Command"]);
+ $self->{TEST_F} ||= $self->oneliner('test_f', ["-MExtUtils::Command"]);
+ $self->{FALSE} ||= $self->oneliner('exit 1');
+ $self->{TRUE} ||= $self->oneliner('exit 0');
+
+ $self->{MKPATH} ||= $self->oneliner('mkpath', ["-MExtUtils::Command"]);
+
+ $self->{CP} ||= $self->oneliner('cp', ["-MExtUtils::Command"]);
+ $self->{MV} ||= $self->oneliner('mv', ["-MExtUtils::Command"]);
+
+ $self->{MOD_INSTALL} ||=
+ $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
+install([ from_to => {@ARGV}, verbose => '$(VERBINST)', uninstall_shadows => '$(UNINST)', dir_mode => '$(PERM_DIR)' ]);
+CODE
+ $self->{DOC_INSTALL} ||= $self->oneliner('perllocal_install', ["-MExtUtils::Command::MM"]);
+ $self->{UNINSTALL} ||= $self->oneliner('uninstall', ["-MExtUtils::Command::MM"]);
+ $self->{WARN_IF_OLD_PACKLIST} ||=
+ $self->oneliner('warn_if_old_packlist', ["-MExtUtils::Command::MM"]);
+ $self->{FIXIN} ||= $self->oneliner('MY->fixin(shift)', ["-MExtUtils::MY"]);
+ $self->{EQUALIZE_TIMESTAMP} ||= $self->oneliner('eqtime', ["-MExtUtils::Command"]);
+
+ $self->{UNINST} ||= 0;
+ $self->{VERBINST} ||= 0;
+
+ $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE} || 'Makefile';
+ $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
+ $self->{MAKEFILE_OLD} ||= $self->{MAKEFILE}.'.old';
+ $self->{MAKE_APERL_FILE} ||= $self->{MAKEFILE}.'.aperl';
+
+ # Not everybody uses -f to indicate "use this Makefile instead"
+ $self->{USEMAKEFILE} ||= '-f';
+
+ # Some makes require a wrapper around macros passed in on the command
+ # line.
+ $self->{MACROSTART} ||= '';
+ $self->{MACROEND} ||= '';
+
+ $self->{SHELL} ||= $Config{sh};
+
+ # UMASK_NULL is not used by MakeMaker but some CPAN modules
+ # make use of it.
+ $self->{UMASK_NULL} ||= "umask 0";
+
+ # Not the greatest default, but its something.
+ $self->{DEV_NULL} ||= "> /dev/null 2>&1";
+
+ $self->{NOOP} ||= '$(TRUE)';
+ $self->{NOECHO} = '@' unless defined $self->{NOECHO};
+
+ $self->{LD_RUN_PATH} = "";
+
+ $self->{LIBS} = $self->_fix_libs($self->{LIBS});
+
+ # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
+ foreach my $libs ( @{$self->{LIBS}} ){
+ $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
+ my(@libs) = $self->extliblist($libs);
+ if ($libs[0] or $libs[1] or $libs[2]){
+ # LD_RUN_PATH now computed by ExtUtils::Liblist
+ ($self->{EXTRALIBS}, $self->{BSLOADLIBS},
+ $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
+ last;
+ }
+ }
+
+ if ( $self->{OBJECT} ) {
+ $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
+ } else {
+ # init_dirscan should have found out, if we have C files
+ $self->{OBJECT} = "";
+ $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
+ }
+ $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
+
+ $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
+ $self->{PERLMAINCC} ||= '$(CC)';
+ $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
+
+ # Sanity check: don't define LINKTYPE = dynamic if we're skipping
+ # the 'dynamic' section of MM. We don't have this problem with
+ # 'static', since we either must use it (%Config says we can't
+ # use dynamic loading) or the caller asked for it explicitly.
+ if (!$self->{LINKTYPE}) {
+ $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
+ ? 'static'
+ : ($Config{usedl} ? 'dynamic' : 'static');
+ }
+
+ return 1;
+}
+
+
+# Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
+# undefined. In any case we turn it into an anon array
+sub _fix_libs {
+ my($self, $libs) = @_;
+
+ return !defined $libs ? [''] :
+ !ref $libs ? [$libs] :
+ !defined $libs->[0] ? [''] :
+ $libs ;
+}
+
+
+=head3 tools_other
+
+ my $make_frag = $MM->tools_other;
+
+Returns a make fragment containing definitions for the macros init_others()
+initializes.
+
+=cut
+
+sub tools_other {
+ my($self) = shift;
+ my @m;
+
+ # We set PM_FILTER as late as possible so it can see all the earlier
+ # on macro-order sensitive makes such as nmake.
+ for my $tool (qw{ SHELL CHMOD CP MV NOOP NOECHO RM_F RM_RF TEST_F TOUCH
+ UMASK_NULL DEV_NULL MKPATH EQUALIZE_TIMESTAMP
+ FALSE TRUE
+ ECHO ECHO_N
+ UNINST VERBINST
+ MOD_INSTALL DOC_INSTALL UNINSTALL
+ WARN_IF_OLD_PACKLIST
+ MACROSTART MACROEND
+ USEMAKEFILE
+ PM_FILTER
+ FIXIN
+ } )
+ {
+ next unless defined $self->{$tool};
+ push @m, "$tool = $self->{$tool}\n";
+ }
+
+ return join "", @m;
+}
+
+
+=head3 init_DIRFILESEP I<Abstract>
+
+ $MM->init_DIRFILESEP;
+ my $dirfilesep = $MM->{DIRFILESEP};
+
+Initializes the DIRFILESEP macro which is the seperator between the
+directory and filename in a filepath. ie. / on Unix, \ on Win32 and
+nothing on VMS.
+
+For example:
+
+ # instead of $(INST_ARCHAUTODIR)/extralibs.ld
+ $(INST_ARCHAUTODIR)$(DIRFILESEP)extralibs.ld
+
+Something of a hack but it prevents a lot of code duplication between
+MM_* variants.
+
+Do not use this as a seperator between directories. Some operating
+systems use different seperators between subdirectories as between
+directories and filenames (for example: VOLUME:[dir1.dir2]file on VMS).
+
+=head3 init_linker I<Abstract>
+
+ $mm->init_linker;
+
+Initialize macros which have to do with linking.
+
+PERL_ARCHIVE: path to libperl.a equivalent to be linked to dynamic
+extensions.
+
+PERL_ARCHIVE_AFTER: path to a library which should be put on the
+linker command line I<after> the external libraries to be linked to
+dynamic extensions. This may be needed if the linker is one-pass, and
+Perl includes some overrides for C RTL functions, such as malloc().
+
+EXPORT_LIST: name of a file that is passed to linker to define symbols
+to be exported.
+
+Some OSes do not need these in which case leave it blank.
+
+
+=head3 init_platform
+
+ $mm->init_platform
+
+Initialize any macros which are for platform specific use only.
+
+A typical one is the version number of your OS specific mocule.
+(ie. MM_Unix_VERSION or MM_VMS_VERSION).
+
+=cut
+
+sub init_platform {
+ return '';
+}
+
+
+=head3 init_MAKE
+
+ $mm->init_MAKE
+
+Initialize MAKE from either a MAKE environment variable or $Config{make}.
+
+=cut
+
+sub init_MAKE {
+ my $self = shift;
+
+ $self->{MAKE} ||= $ENV{MAKE} || $Config{make};
+}
+
+
+=head2 Tools
+
+A grab bag of methods to generate specific macros and commands.
+
+
+
+=head3 manifypods
+
+Defines targets and routines to translate the pods into manpages and
+put them into the INST_* directories.
+
+=cut
+
+sub manifypods {
+ my $self = shift;
+
+ my $POD2MAN_macro = $self->POD2MAN_macro();
+ my $manifypods_target = $self->manifypods_target();
+
+ return <<END_OF_TARGET;
+
+$POD2MAN_macro
+
+$manifypods_target
+
+END_OF_TARGET
+
+}
+
+
+=head3 POD2MAN_macro
+
+ my $pod2man_macro = $self->POD2MAN_macro
+
+Returns a definition for the POD2MAN macro. This is a program
+which emulates the pod2man utility. You can add more switches to the
+command by simply appending them on the macro.
+
+Typical usage:
+
+ $(POD2MAN) --section=3 --perm_rw=$(PERM_RW) podfile1 man_page1 ...
+
+=cut
+
+sub POD2MAN_macro {
+ my $self = shift;
+
+# Need the trailing '--' so perl stops gobbling arguments and - happens
+# to be an alternative end of line seperator on VMS so we quote it
+ return <<'END_OF_DEF';
+POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
+POD2MAN = $(POD2MAN_EXE)
+END_OF_DEF
+}
+
+
+=head3 test_via_harness
+
+ my $command = $mm->test_via_harness($perl, $tests);
+
+Returns a $command line which runs the given set of $tests with
+Test::Harness and the given $perl.
+
+Used on the t/*.t files.
+
+=cut
+
+sub test_via_harness {
+ my($self, $perl, $tests) = @_;
+
+ return qq{\t$perl "-MExtUtils::Command::MM" }.
+ qq{"-e" "test_harness(\$(TEST_VERBOSE), '\$(INST_LIB)', '\$(INST_ARCHLIB)')" $tests\n};
+}
+
+=head3 test_via_script
+
+ my $command = $mm->test_via_script($perl, $script);
+
+Returns a $command line which just runs a single test without
+Test::Harness. No checks are done on the results, they're just
+printed.
+
+Used for test.pl, since they don't always follow Test::Harness
+formatting.
+
+=cut
+
+sub test_via_script {
+ my($self, $perl, $script) = @_;
+ return qq{\t$perl "-I\$(INST_LIB)" "-I\$(INST_ARCHLIB)" $script\n};
+}
+
+
+=head3 tool_autosplit
+
+Defines a simple perl call that runs autosplit. May be deprecated by
+pm_to_blib soon.
+
+=cut
+
+sub tool_autosplit {
+ my($self, %attribs) = @_;
+
+ my $maxlen = $attribs{MAXLEN} ? '$$AutoSplit::Maxlen=$attribs{MAXLEN};'
+ : '';
+
+ my $asplit = $self->oneliner(sprintf <<'PERL_CODE', $maxlen);
+use AutoSplit; %s autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)
+PERL_CODE
+
+ return sprintf <<'MAKE_FRAG', $asplit;
+# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
+AUTOSPLITFILE = %s
+
+MAKE_FRAG
+
+}
+
+
+=head3 arch_check
+
+ my $arch_ok = $mm->arch_check(
+ $INC{"Config.pm"},
+ File::Spec->catfile($Config{archlibexp}, "Config.pm")
+ );
+
+A sanity check that what Perl thinks the architecture is and what
+Config thinks the architecture is are the same. If they're not it
+will return false and show a diagnostic message.
+
+When building Perl it will always return true, as nothing is installed
+yet.
+
+The interface is a bit odd because this is the result of a
+quick refactoring. Don't rely on it.
+
+=cut
+
+sub arch_check {
+ my $self = shift;
+ my($pconfig, $cconfig) = @_;
+
+ return 1 if $self->{PERL_SRC};
+
+ my($pvol, $pthinks) = $self->splitpath($pconfig);
+ my($cvol, $cthinks) = $self->splitpath($cconfig);
+
+ $pthinks = $self->canonpath($pthinks);
+ $cthinks = $self->canonpath($cthinks);
+
+ my $ret = 1;
+ if ($pthinks ne $cthinks) {
+ print "Have $pthinks\n";
+ print "Want $cthinks\n";
+
+ $ret = 0;
+
+ my $arch = (grep length, $self->splitdir($pthinks))[-1];
+
+ print STDOUT <<END unless $self->{UNINSTALLED_PERL};
+Your perl and your Config.pm seem to have different ideas about the
+architecture they are running on.
+Perl thinks: [$arch]
+Config says: [$Config{archname}]
+This may or may not cause problems. Please check your installation of perl
+if you have problems building this extension.
+END
+ }
+
+ return $ret;
+}
+
+
+
+=head2 File::Spec wrappers
+
+ExtUtils::MM_Any is a subclass of File::Spec. The methods noted here
+override File::Spec.
+
+
+
+=head3 catfile
+
+File::Spec <= 0.83 has a bug where the file part of catfile is not
+canonicalized. This override fixes that bug.
+
+=cut
+
+sub catfile {
+ my $self = shift;
+ return $self->canonpath($self->SUPER::catfile(@_));
+}
+
+
+
+=head2 Misc
+
+Methods I can't really figure out where they should go yet.
+
+
+=head3 find_tests
+
+ my $test = $mm->find_tests;
+
+Returns a string suitable for feeding to the shell to return all
+tests in t/*.t.
+
+=cut
+
+sub find_tests {
+ my($self) = shift;
+ return -d 't' ? 't/*.t' : '';
+}
+
+
+=head3 extra_clean_files
+
+ my @files_to_clean = $MM->extra_clean_files;
+
+Returns a list of OS specific files to be removed in the clean target in
+addition to the usual set.
+
+=cut
+
+# An empty method here tickled a perl 5.8.1 bug and would return its object.
+sub extra_clean_files {
+ return;
+}
+
+
+=head3 installvars
+
+ my @installvars = $mm->installvars;
+
+A list of all the INSTALL* variables without the INSTALL prefix. Useful
+for iteration or building related variable sets.
+
+=cut
+
+sub installvars {
+ return qw(PRIVLIB SITELIB VENDORLIB
+ ARCHLIB SITEARCH VENDORARCH
+ BIN SITEBIN VENDORBIN
+ SCRIPT SITESCRIPT VENDORSCRIPT
+ MAN1DIR SITEMAN1DIR VENDORMAN1DIR
+ MAN3DIR SITEMAN3DIR VENDORMAN3DIR
+ );
+}
+
+
+=head3 libscan
+
+ my $wanted = $self->libscan($path);
+
+Takes a path to a file or dir and returns an empty string if we don't
+want to include this file in the library. Otherwise it returns the
+the $path unchanged.
+
+Mainly used to exclude version control administrative directories from
+installation.
+
+=cut
+
+sub libscan {
+ my($self,$path) = @_;
+ my($dirs,$file) = ($self->splitpath($path))[1,2];
+ return '' if grep /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/,
+ $self->splitdir($dirs), $file;
+
+ return $path;
+}
+
+
+=head3 platform_constants
+
+ my $make_frag = $mm->platform_constants
+
+Returns a make fragment defining all the macros initialized in
+init_platform() rather than put them in constants().
+
+=cut
+
+sub platform_constants {
+ return '';
+}
+
+=begin private
+
+=head3 _PREREQ_PRINT
+
+ $self->_PREREQ_PRINT;
+
+Implements PREREQ_PRINT.
+
+Refactored out of MakeMaker->new().
+
+=end private
+
+=cut
+
+sub _PREREQ_PRINT {
+ my $self = shift;
+
+ require Data::Dumper;
+ my @what = ('PREREQ_PM');
+ push @what, 'MIN_PERL_VERSION' if $self->{MIN_PERL_VERSION};
+ push @what, 'BUILD_REQUIRES' if $self->{BUILD_REQUIRES};
+ print Data::Dumper->Dump([@{$self}{@what}], \@what);
+ exit 0;
+}
+
+
+=begin private
+
+=head3 _PRINT_PREREQ
+
+ $mm->_PRINT_PREREQ;
+
+Implements PRINT_PREREQ, a slightly different version of PREREQ_PRINT
+added by Redhat to, I think, support generating RPMs from Perl modules.
+
+Should not include BUILD_REQUIRES as RPMs do not incluide them.
+
+Refactored out of MakeMaker->new().
+
+=end private
+
+=cut
+
+sub _PRINT_PREREQ {
+ my $self = shift;
+
+ my $prereqs= $self->{PREREQ_PM};
+ my @prereq = map { [$_, $prereqs->{$_}] } keys %$prereqs;
+
+ if ( $self->{MIN_PERL_VERSION} ) {
+ push @prereq, ['perl' => $self->{MIN_PERL_VERSION}];
+ }
+
+ print join(" ", map { "perl($_->[0])>=$_->[1] " }
+ sort { $a->[0] cmp $b->[0] } @prereq), "\n";
+ exit 0;
+}
+
+
+=begin private
+
+=head3 _all_prereqs
+
+ my $prereqs = $self->_all_prereqs;
+
+Returns a hash ref of both PREREQ_PM and BUILD_REQUIRES.
+
+=end private
+
+=cut
+
+sub _all_prereqs {
+ my $self = shift;
+
+ return { %{$self->{PREREQ_PM}}, %{$self->{BUILD_REQUIRES}} };
+}
+
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> and the denizens of
+makemaker@perl.org with code from ExtUtils::MM_Unix and
+ExtUtils::MM_Win32.
+
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_BeOS.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_BeOS.pm
new file mode 100755
index 00000000000..0b7c8db9225
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_BeOS.pm
@@ -0,0 +1,61 @@
+package ExtUtils::MM_BeOS;
+
+use strict;
+
+=head1 NAME
+
+ExtUtils::MM_BeOS - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_BeOS; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=over 4
+
+=cut
+
+use ExtUtils::MakeMaker::Config;
+use File::Spec;
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+
+our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+our $VERSION = '6.56';
+
+
+=item os_flavor
+
+BeOS is BeOS.
+
+=cut
+
+sub os_flavor {
+ return('BeOS');
+}
+
+=item init_linker
+
+libperl.a equivalent to be linked to dynamic extensions.
+
+=cut
+
+sub init_linker {
+ my($self) = shift;
+
+ $self->{PERL_ARCHIVE} ||=
+ File::Spec->catdir('$(PERL_INC)',$Config{libperl});
+ $self->{PERL_ARCHIVE_AFTER} ||= '';
+ $self->{EXPORT_LIST} ||= '';
+}
+
+=back
+
+1;
+__END__
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Cygwin.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Cygwin.pm
new file mode 100755
index 00000000000..394fbc68a75
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Cygwin.pm
@@ -0,0 +1,123 @@
+package ExtUtils::MM_Cygwin;
+
+use strict;
+
+use ExtUtils::MakeMaker::Config;
+use File::Spec;
+
+require ExtUtils::MM_Unix;
+require ExtUtils::MM_Win32;
+our @ISA = qw( ExtUtils::MM_Unix );
+
+our $VERSION = '6.56';
+
+
+=head1 NAME
+
+ExtUtils::MM_Cygwin - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_Cygwin; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided there.
+
+=over 4
+
+=item os_flavor
+
+We're Unix and Cygwin.
+
+=cut
+
+sub os_flavor {
+ return('Unix', 'Cygwin');
+}
+
+=item cflags
+
+if configured for dynamic loading, triggers #define EXT in EXTERN.h
+
+=cut
+
+sub cflags {
+ my($self,$libperl)=@_;
+ return $self->{CFLAGS} if $self->{CFLAGS};
+ return '' unless $self->needs_linking();
+
+ my $base = $self->SUPER::cflags($libperl);
+ foreach (split /\n/, $base) {
+ /^(\S*)\s*=\s*(\S*)$/ and $self->{$1} = $2;
+ };
+ $self->{CCFLAGS} .= " -DUSEIMPORTLIB" if ($Config{useshrplib} eq 'true');
+
+ return $self->{CFLAGS} = qq{
+CCFLAGS = $self->{CCFLAGS}
+OPTIMIZE = $self->{OPTIMIZE}
+PERLTYPE = $self->{PERLTYPE}
+};
+
+}
+
+
+=item replace_manpage_separator
+
+replaces strings '::' with '.' in MAN*POD man page names
+
+=cut
+
+sub replace_manpage_separator {
+ my($self, $man) = @_;
+ $man =~ s{/+}{.}g;
+ return $man;
+}
+
+=item init_linker
+
+points to libperl.a
+
+=cut
+
+sub init_linker {
+ my $self = shift;
+
+ if ($Config{useshrplib} eq 'true') {
+ my $libperl = '$(PERL_INC)' .'/'. "$Config{libperl}";
+ if( $] >= 5.006002 ) {
+ $libperl =~ s/a$/dll.a/;
+ }
+ $self->{PERL_ARCHIVE} = $libperl;
+ } else {
+ $self->{PERL_ARCHIVE} =
+ '$(PERL_INC)' .'/'. ("$Config{libperl}" or "libperl.a");
+ }
+
+ $self->{PERL_ARCHIVE_AFTER} ||= '';
+ $self->{EXPORT_LIST} ||= '';
+}
+
+=item maybe_command
+
+If our path begins with F</cygdrive/> then we use C<ExtUtils::MM_Win32>
+to determine if it may be a command. Otherwise we use the tests
+from C<ExtUtils::MM_Unix>.
+
+=cut
+
+sub maybe_command {
+ my ($self, $file) = @_;
+
+ if ($file =~ m{^/cygdrive/}i) {
+ return ExtUtils::MM_Win32->maybe_command($file);
+ }
+
+ return $self->SUPER::maybe_command($file);
+}
+
+=back
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_DOS.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_DOS.pm
new file mode 100755
index 00000000000..fc0a7947235
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_DOS.pm
@@ -0,0 +1,65 @@
+package ExtUtils::MM_DOS;
+
+use strict;
+
+our $VERSION = 6.56;
+
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+
+
+=head1 NAME
+
+ExtUtils::MM_DOS - DOS specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+ Don't use this module directly.
+ Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality
+for DOS.
+
+Unless otherwise stated, it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=over 4
+
+=item os_flavor
+
+=cut
+
+sub os_flavor {
+ return('DOS');
+}
+
+=item B<replace_manpage_separator>
+
+Generates Foo__Bar.3 style man page names
+
+=cut
+
+sub replace_manpage_separator {
+ my($self, $man) = @_;
+
+ $man =~ s,/+,__,g;
+ return $man;
+}
+
+=back
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MM_Unix>, L<ExtUtils::MakeMaker>
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Darwin.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Darwin.pm
new file mode 100755
index 00000000000..1cb87c78815
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Darwin.pm
@@ -0,0 +1,47 @@
+package ExtUtils::MM_Darwin;
+
+use strict;
+
+BEGIN {
+ require ExtUtils::MM_Unix;
+ our @ISA = qw( ExtUtils::MM_Unix );
+}
+
+our $VERSION = '6.56';
+
+
+=head1 NAME
+
+ExtUtils::MM_Darwin - special behaviors for OS X
+
+=head1 SYNOPSIS
+
+ For internal MakeMaker use only
+
+=head1 DESCRIPTION
+
+See L<ExtUtils::MM_Unix> for L<ExtUtils::MM_Any> for documention on the
+methods overridden here.
+
+=head2 Overriden Methods
+
+=head3 init_dist
+
+Turn off Apple tar's tendency to copy resource forks as "._foo" files.
+
+=cut
+
+sub init_dist {
+ my $self = shift;
+
+ # Thank you, Apple, for breaking tar and then breaking the work around.
+ # 10.4 wants COPY_EXTENDED_ATTRIBUTES_DISABLE while 10.5 wants
+ # COPYFILE_DISABLE. I'm not going to push my luck and instead just
+ # set both.
+ $self->{TAR} ||=
+ 'COPY_EXTENDED_ATTRIBUTES_DISABLE=1 COPYFILE_DISABLE=1 tar';
+
+ $self->SUPER::init_dist(@_);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_MacOS.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_MacOS.pm
new file mode 100755
index 00000000000..cfc82051e1b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_MacOS.pm
@@ -0,0 +1,40 @@
+package ExtUtils::MM_MacOS;
+
+use strict;
+
+our $VERSION = 6.56;
+
+sub new {
+ die <<'UNSUPPORTED';
+MacOS Classic (MacPerl) is no longer supported by MakeMaker.
+Please use Module::Build instead.
+UNSUPPORTED
+}
+
+=head1 NAME
+
+ExtUtils::MM_MacOS - once produced Makefiles for MacOS Classic
+
+=head1 SYNOPSIS
+
+ # MM_MacOS no longer contains any code. This is just a stub.
+
+=head1 DESCRIPTION
+
+Once upon a time, MakeMaker could produce an approximation of a correct
+Makefile on MacOS Classic (MacPerl). Due to a lack of maintainers, this
+fell out of sync with the rest of MakeMaker and hadn't worked in years.
+Since there's little chance of it being repaired, MacOS Classic is fading
+away, and the code was icky to begin with, the code has been deleted to
+make maintenance easier.
+
+Those interested in writing modules for MacPerl should use Module::Build
+which works better than MakeMaker ever did.
+
+Anyone interested in resurrecting this file should pull the old version
+from the MakeMaker CVS repository and contact makemaker@perl.org, but we
+really encourage you to work on Module::Build instead.
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_NW5.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_NW5.pm
new file mode 100755
index 00000000000..0c8f6c0affb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_NW5.pm
@@ -0,0 +1,269 @@
+package ExtUtils::MM_NW5;
+
+=head1 NAME
+
+ExtUtils::MM_NW5 - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_NW5; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=over
+
+=cut
+
+use strict;
+use ExtUtils::MakeMaker::Config;
+use File::Basename;
+
+our $VERSION = '6.56';
+
+require ExtUtils::MM_Win32;
+our @ISA = qw(ExtUtils::MM_Win32);
+
+use ExtUtils::MakeMaker qw( &neatvalue );
+
+$ENV{EMXSHELL} = 'sh'; # to run `commands`
+
+my $BORLAND = $Config{'cc'} =~ /^bcc/i;
+my $GCC = $Config{'cc'} =~ /^gcc/i;
+
+
+=item os_flavor
+
+We're Netware in addition to being Windows.
+
+=cut
+
+sub os_flavor {
+ my $self = shift;
+ return ($self->SUPER::os_flavor, 'Netware');
+}
+
+=item init_platform
+
+Add Netware macros.
+
+LIBPTH, BASE_IMPORT, NLM_VERSION, MPKTOOL, TOOLPATH, BOOT_SYMBOL,
+NLM_SHORT_NAME, INCLUDE, PATH, MM_NW5_REVISION
+
+
+=item platform_constants
+
+Add Netware macros initialized above to the Makefile.
+
+=cut
+
+sub init_platform {
+ my($self) = shift;
+
+ # To get Win32's setup.
+ $self->SUPER::init_platform;
+
+ # incpath is copied to makefile var INCLUDE in constants sub, here just
+ # make it empty
+ my $libpth = $Config{'libpth'};
+ $libpth =~ s( )(;);
+ $self->{'LIBPTH'} = $libpth;
+
+ $self->{'BASE_IMPORT'} = $Config{'base_import'};
+
+ # Additional import file specified from Makefile.pl
+ if($self->{'base_import'}) {
+ $self->{'BASE_IMPORT'} .= ', ' . $self->{'base_import'};
+ }
+
+ $self->{'NLM_VERSION'} = $Config{'nlm_version'};
+ $self->{'MPKTOOL'} = $Config{'mpktool'};
+ $self->{'TOOLPATH'} = $Config{'toolpath'};
+
+ (my $boot = $self->{'NAME'}) =~ s/:/_/g;
+ $self->{'BOOT_SYMBOL'}=$boot;
+
+ # If the final binary name is greater than 8 chars,
+ # truncate it here.
+ if(length($self->{'BASEEXT'}) > 8) {
+ $self->{'NLM_SHORT_NAME'} = substr($self->{'BASEEXT'},0,8);
+ }
+
+ # Get the include path and replace the spaces with ;
+ # Copy this to makefile as INCLUDE = d:\...;d:\;
+ ($self->{INCLUDE} = $Config{'incpath'}) =~ s/([ ]*)-I/;/g;
+
+ # Set the path to CodeWarrior binaries which might not have been set in
+ # any other place
+ $self->{PATH} = '$(PATH);$(TOOLPATH)';
+
+ $self->{MM_NW5_VERSION} = $VERSION;
+}
+
+sub platform_constants {
+ my($self) = shift;
+ my $make_frag = '';
+
+ # Setup Win32's constants.
+ $make_frag .= $self->SUPER::platform_constants;
+
+ foreach my $macro (qw(LIBPTH BASE_IMPORT NLM_VERSION MPKTOOL
+ TOOLPATH BOOT_SYMBOL NLM_SHORT_NAME INCLUDE PATH
+ MM_NW5_VERSION
+ ))
+ {
+ next unless defined $self->{$macro};
+ $make_frag .= "$macro = $self->{$macro}\n";
+ }
+
+ return $make_frag;
+}
+
+
+=item const_cccmd
+
+=cut
+
+sub const_cccmd {
+ my($self,$libperl)=@_;
+ return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
+ return '' unless $self->needs_linking();
+ return $self->{CONST_CCCMD} = <<'MAKE_FRAG';
+CCCMD = $(CC) $(CCFLAGS) $(INC) $(OPTIMIZE) \
+ $(PERLTYPE) $(MPOLLUTE) -o $@ \
+ -DVERSION=\"$(VERSION)\" -DXS_VERSION=\"$(XS_VERSION)\"
+MAKE_FRAG
+
+}
+
+
+=item static_lib
+
+=cut
+
+sub static_lib {
+ my($self) = @_;
+
+ return '' unless $self->has_link_code;
+
+ my $m = <<'END';
+$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists
+ $(RM_RF) $@
+END
+
+ # If this extension has it's own library (eg SDBM_File)
+ # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
+ $m .= <<'END' if $self->{MYEXTLIB};
+ $self->{CP} $(MYEXTLIB) $@
+END
+
+ my $ar_arg;
+ if( $BORLAND ) {
+ $ar_arg = '$@ $(OBJECT:^"+")';
+ }
+ elsif( $GCC ) {
+ $ar_arg = '-ru $@ $(OBJECT)';
+ }
+ else {
+ $ar_arg = '-type library -o $@ $(OBJECT)';
+ }
+
+ $m .= sprintf <<'END', $ar_arg;
+ $(AR) %s
+ $(NOECHO) $(ECHO) "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
+ $(CHMOD) 755 $@
+END
+
+ $m .= <<'END' if $self->{PERL_SRC};
+ $(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs
+
+
+END
+ return $m;
+}
+
+=item dynamic_lib
+
+Defines how to produce the *.so (or equivalent) files.
+
+=cut
+
+sub dynamic_lib {
+ my($self, %attribs) = @_;
+ return '' unless $self->needs_linking(); #might be because of a subdir
+
+ return '' unless $self->has_link_code;
+
+ my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
+ my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
+ my($ldfrom) = '$(LDFROM)';
+
+ (my $boot = $self->{NAME}) =~ s/:/_/g;
+
+ my $m = <<'MAKE_FRAG';
+# This section creates the dynamically loadable $(INST_DYNAMIC)
+# from $(OBJECT) and possibly $(MYEXTLIB).
+OTHERLDFLAGS = '.$otherldflags.'
+INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
+
+# Create xdc data for an MT safe NLM in case of mpk build
+$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists
+ $(NOECHO) $(ECHO) Export boot_$(BOOT_SYMBOL) > $(BASEEXT).def
+ $(NOECHO) $(ECHO) $(BASE_IMPORT) >> $(BASEEXT).def
+ $(NOECHO) $(ECHO) Import @$(PERL_INC)\perl.imp >> $(BASEEXT).def
+MAKE_FRAG
+
+
+ if ( $self->{CCFLAGS} =~ m/ -DMPK_ON /) {
+ $m .= <<'MAKE_FRAG';
+ $(MPKTOOL) $(XDCFLAGS) $(BASEEXT).xdc
+ $(NOECHO) $(ECHO) xdcdata $(BASEEXT).xdc >> $(BASEEXT).def
+MAKE_FRAG
+ }
+
+ # Reconstruct the X.Y.Z version.
+ my $version = join '.', map { sprintf "%d", $_ }
+ $] =~ /(\d)\.(\d{3})(\d{2})/;
+ $m .= sprintf ' $(LD) $(LDFLAGS) $(OBJECT:.obj=.obj) -desc "Perl %s Extension ($(BASEEXT)) XS_VERSION: $(XS_VERSION)" -nlmversion $(NLM_VERSION)', $version;
+
+ # Taking care of long names like FileHandle, ByteLoader, SDBM_File etc
+ if($self->{NLM_SHORT_NAME}) {
+ # In case of nlms with names exceeding 8 chars, build nlm in the
+ # current dir, rename and move to auto\lib.
+ $m .= q{ -o $(NLM_SHORT_NAME).$(DLEXT)}
+ } else {
+ $m .= q{ -o $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT)}
+ }
+
+ # Add additional lib files if any (SDBM_File)
+ $m .= q{ $(MYEXTLIB) } if $self->{MYEXTLIB};
+
+ $m .= q{ $(PERL_INC)\Main.lib -commandfile $(BASEEXT).def}."\n";
+
+ if($self->{NLM_SHORT_NAME}) {
+ $m .= <<'MAKE_FRAG';
+ if exist $(INST_AUTODIR)\$(NLM_SHORT_NAME).$(DLEXT) del $(INST_AUTODIR)\$(NLM_SHORT_NAME).$(DLEXT)
+ move $(NLM_SHORT_NAME).$(DLEXT) $(INST_AUTODIR)
+MAKE_FRAG
+ }
+
+ $m .= <<'MAKE_FRAG';
+
+ $(CHMOD) 755 $@
+MAKE_FRAG
+
+ return $m;
+}
+
+
+1;
+__END__
+
+=back
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_OS2.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_OS2.pm
new file mode 100755
index 00000000000..680502baf24
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_OS2.pm
@@ -0,0 +1,152 @@
+package ExtUtils::MM_OS2;
+
+use strict;
+
+use ExtUtils::MakeMaker qw(neatvalue);
+use File::Spec;
+
+our $VERSION = '6.56';
+
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+our @ISA = qw(ExtUtils::MM_Any ExtUtils::MM_Unix);
+
+=pod
+
+=head1 NAME
+
+ExtUtils::MM_OS2 - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_OS2; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=head1 METHODS
+
+=over 4
+
+=item init_dist
+
+Define TO_UNIX to convert OS2 linefeeds to Unix style.
+
+=cut
+
+sub init_dist {
+ my($self) = @_;
+
+ $self->{TO_UNIX} ||= <<'MAKE_TEXT';
+$(NOECHO) $(TEST_F) tmp.zip && $(RM_F) tmp.zip; $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM_F) tmp.zip
+MAKE_TEXT
+
+ $self->SUPER::init_dist;
+}
+
+sub dlsyms {
+ my($self,%attribs) = @_;
+
+ my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
+ my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
+ my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
+ my($imports) = $attribs{IMPORTS} || $self->{IMPORTS} || {};
+ my(@m);
+ (my $boot = $self->{NAME}) =~ s/:/_/g;
+
+ if (not $self->{SKIPHASH}{'dynamic'}) {
+ push(@m,"
+$self->{BASEEXT}.def: Makefile.PL
+",
+ ' $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\
+ Mksymlists("NAME" => "$(NAME)", "DLBASE" => "$(DLBASE)", ',
+ '"VERSION" => "$(VERSION)", "DISTNAME" => "$(DISTNAME)", ',
+ '"INSTALLDIRS" => "$(INSTALLDIRS)", ',
+ '"DL_FUNCS" => ',neatvalue($funcs),
+ ', "FUNCLIST" => ',neatvalue($funclist),
+ ', "IMPORTS" => ',neatvalue($imports),
+ ', "DL_VARS" => ', neatvalue($vars), ');\'
+');
+ }
+ if ($self->{IMPORTS} && %{$self->{IMPORTS}}) {
+ # Make import files (needed for static build)
+ -d 'tmp_imp' or mkdir 'tmp_imp', 0777 or die "Can't mkdir tmp_imp";
+ open my $imp, '>', 'tmpimp.imp' or die "Can't open tmpimp.imp";
+ while (my($name, $exp) = each %{$self->{IMPORTS}}) {
+ my ($lib, $id) = ($exp =~ /(.*)\.(.*)/) or die "Malformed IMPORT `$exp'";
+ print $imp "$name $lib $id ?\n";
+ }
+ close $imp or die "Can't close tmpimp.imp";
+ # print "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp\n";
+ system "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp"
+ and die "Cannot make import library: $!, \$?=$?";
+ # May be running under miniperl, so have no glob...
+ eval "unlink <tmp_imp/*>; 1" or system "rm tmp_imp/*";
+ system "cd tmp_imp; $Config::Config{ar} x ../tmpimp$Config::Config{lib_ext}"
+ and die "Cannot extract import objects: $!, \$?=$?";
+ }
+ join('',@m);
+}
+
+sub static_lib {
+ my($self) = @_;
+ my $old = $self->ExtUtils::MM_Unix::static_lib();
+ return $old unless $self->{IMPORTS} && %{$self->{IMPORTS}};
+
+ my @chunks = split /\n{2,}/, $old;
+ shift @chunks unless length $chunks[0]; # Empty lines at the start
+ $chunks[0] .= <<'EOC';
+
+ $(AR) $(AR_STATIC_ARGS) $@ tmp_imp/* && $(RANLIB) $@
+EOC
+ return join "\n\n". '', @chunks;
+}
+
+sub replace_manpage_separator {
+ my($self,$man) = @_;
+ $man =~ s,/+,.,g;
+ $man;
+}
+
+sub maybe_command {
+ my($self,$file) = @_;
+ $file =~ s,[/\\]+,/,g;
+ return $file if -x $file && ! -d _;
+ return "$file.exe" if -x "$file.exe" && ! -d _;
+ return "$file.cmd" if -x "$file.cmd" && ! -d _;
+ return;
+}
+
+=item init_linker
+
+=cut
+
+sub init_linker {
+ my $self = shift;
+
+ $self->{PERL_ARCHIVE} = "\$(PERL_INC)/libperl\$(LIB_EXT)";
+
+ $self->{PERL_ARCHIVE_AFTER} = $OS2::is_aout
+ ? ''
+ : '$(PERL_INC)/libperl_override$(LIB_EXT)';
+ $self->{EXPORT_LIST} = '$(BASEEXT).def';
+}
+
+=item os_flavor
+
+OS/2 is OS/2
+
+=cut
+
+sub os_flavor {
+ return('OS/2');
+}
+
+=back
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_QNX.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_QNX.pm
new file mode 100755
index 00000000000..f78d5e8a9ee
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_QNX.pm
@@ -0,0 +1,57 @@
+package ExtUtils::MM_QNX;
+
+use strict;
+our $VERSION = '6.56';
+
+require ExtUtils::MM_Unix;
+our @ISA = qw(ExtUtils::MM_Unix);
+
+
+=head1 NAME
+
+ExtUtils::MM_QNX - QNX specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+ Don't use this module directly.
+ Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality for
+QNX.
+
+Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=head3 extra_clean_files
+
+Add .err files corresponding to each .c file.
+
+=cut
+
+sub extra_clean_files {
+ my $self = shift;
+
+ my @errfiles = @{$self->{C}};
+ for ( @errfiles ) {
+ s/.c$/.err/;
+ }
+
+ return( @errfiles, 'perlmain.err' );
+}
+
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_UWIN.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_UWIN.pm
new file mode 100755
index 00000000000..5adc46ea8d2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_UWIN.pm
@@ -0,0 +1,64 @@
+package ExtUtils::MM_UWIN;
+
+use strict;
+our $VERSION = 6.56;
+
+require ExtUtils::MM_Unix;
+our @ISA = qw(ExtUtils::MM_Unix);
+
+
+=head1 NAME
+
+ExtUtils::MM_UWIN - U/WIN specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+ Don't use this module directly.
+ Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality for
+the AT&T U/WIN UNIX on Windows environment.
+
+Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=over 4
+
+=item os_flavor
+
+In addition to being Unix, we're U/WIN.
+
+=cut
+
+sub os_flavor {
+ return('Unix', 'U/WIN');
+}
+
+
+=item B<replace_manpage_separator>
+
+=cut
+
+sub replace_manpage_separator {
+ my($self, $man) = @_;
+
+ $man =~ s,/+,.,g;
+ return $man;
+}
+
+=back
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MM_Win32>, L<ExtUtils::MakeMaker>
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Unix.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Unix.pm
new file mode 100755
index 00000000000..239d6df826c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Unix.pm
@@ -0,0 +1,3634 @@
+package ExtUtils::MM_Unix;
+
+require 5.006;
+
+use strict;
+
+use Carp;
+use ExtUtils::MakeMaker::Config;
+use File::Basename qw(basename dirname);
+use DirHandle;
+
+our %Config_Override;
+
+use ExtUtils::MakeMaker qw($Verbose neatvalue);
+
+# If we make $VERSION an our variable parse_version() breaks
+use vars qw($VERSION);
+$VERSION = '6.56';
+
+require ExtUtils::MM_Any;
+our @ISA = qw(ExtUtils::MM_Any);
+
+my %Is;
+BEGIN {
+ $Is{OS2} = $^O eq 'os2';
+ $Is{Win32} = $^O eq 'MSWin32' || $Config{osname} eq 'NetWare';
+ $Is{Dos} = $^O eq 'dos';
+ $Is{VMS} = $^O eq 'VMS';
+ $Is{OSF} = $^O eq 'dec_osf';
+ $Is{IRIX} = $^O eq 'irix';
+ $Is{NetBSD} = $^O eq 'netbsd';
+ $Is{Interix} = $^O eq 'interix';
+ $Is{SunOS4} = $^O eq 'sunos';
+ $Is{Solaris} = $^O eq 'solaris';
+ $Is{SunOS} = $Is{SunOS4} || $Is{Solaris};
+ $Is{BSD} = ($^O =~ /^(?:free|net|open)bsd$/ or
+ grep( $^O eq $_, qw(bsdos interix dragonfly) )
+ );
+}
+
+BEGIN {
+ if( $Is{VMS} ) {
+ # For things like vmsify()
+ require VMS::Filespec;
+ VMS::Filespec->import;
+ }
+}
+
+
+=head1 NAME
+
+ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+C<require ExtUtils::MM_Unix;>
+
+=head1 DESCRIPTION
+
+The methods provided by this package are designed to be used in
+conjunction with ExtUtils::MakeMaker. When MakeMaker writes a
+Makefile, it creates one or more objects that inherit their methods
+from a package C<MM>. MM itself doesn't provide any methods, but it
+ISA ExtUtils::MM_Unix class. The inheritance tree of MM lets operating
+specific packages take the responsibility for all the methods provided
+by MM_Unix. We are trying to reduce the number of the necessary
+overrides by defining rather primitive operations within
+ExtUtils::MM_Unix.
+
+If you are going to write a platform specific MM package, please try
+to limit the necessary overrides to primitive methods, and if it is not
+possible to do so, let's work out how to achieve that gain.
+
+If you are overriding any of these methods in your Makefile.PL (in the
+MY class), please report that to the makemaker mailing list. We are
+trying to minimize the necessary method overrides and switch to data
+driven Makefile.PLs wherever possible. In the long run less methods
+will be overridable via the MY class.
+
+=head1 METHODS
+
+The following description of methods is still under
+development. Please refer to the code for not suitably documented
+sections and complain loudly to the makemaker@perl.org mailing list.
+Better yet, provide a patch.
+
+Not all of the methods below are overridable in a
+Makefile.PL. Overridable methods are marked as (o). All methods are
+overridable by a platform specific MM_*.pm file.
+
+Cross-platform methods are being moved into MM_Any. If you can't find
+something that used to be in here, look in MM_Any.
+
+=cut
+
+# So we don't have to keep calling the methods over and over again,
+# we have these globals to cache the values. Faster and shrtr.
+my $Curdir = __PACKAGE__->curdir;
+my $Rootdir = __PACKAGE__->rootdir;
+my $Updir = __PACKAGE__->updir;
+
+
+=head2 Methods
+
+=over 4
+
+=item os_flavor
+
+Simply says that we're Unix.
+
+=cut
+
+sub os_flavor {
+ return('Unix');
+}
+
+
+=item c_o (o)
+
+Defines the suffix rules to compile different flavors of C files to
+object files.
+
+=cut
+
+sub c_o {
+# --- Translation Sections ---
+
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ my(@m);
+
+ my $command = '$(CCCMD)';
+ my $flags = '$(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE)';
+
+ if (my $cpp = $Config{cpprun}) {
+ my $cpp_cmd = $self->const_cccmd;
+ $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/;
+ push @m, qq{
+.c.i:
+ $cpp_cmd $flags \$*.c > \$*.i
+};
+ }
+
+ push @m, qq{
+.c.s:
+ $command -S $flags \$*.c
+
+.c\$(OBJ_EXT):
+ $command $flags \$*.c
+
+.cpp\$(OBJ_EXT):
+ $command $flags \$*.cpp
+
+.cxx\$(OBJ_EXT):
+ $command $flags \$*.cxx
+
+.cc\$(OBJ_EXT):
+ $command $flags \$*.cc
+};
+
+ push @m, qq{
+.C\$(OBJ_EXT):
+ $command $flags \$*.C
+} if !$Is{OS2} and !$Is{Win32} and !$Is{Dos}; #Case-specific
+
+ return join "", @m;
+}
+
+=item cflags (o)
+
+Does very much the same as the cflags script in the perl
+distribution. It doesn't return the whole compiler command line, but
+initializes all of its parts. The const_cccmd method then actually
+returns the definition of the CCCMD macro which uses these parts.
+
+=cut
+
+#'
+
+sub cflags {
+ my($self,$libperl)=@_;
+ return $self->{CFLAGS} if $self->{CFLAGS};
+ return '' unless $self->needs_linking();
+
+ my($prog, $uc, $perltype, %cflags);
+ $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
+ $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
+
+ @cflags{qw(cc ccflags optimize shellflags)}
+ = @Config{qw(cc ccflags optimize shellflags)};
+ my($optdebug) = "";
+
+ $cflags{shellflags} ||= '';
+
+ my(%map) = (
+ D => '-DDEBUGGING',
+ E => '-DEMBED',
+ DE => '-DDEBUGGING -DEMBED',
+ M => '-DEMBED -DMULTIPLICITY',
+ DM => '-DDEBUGGING -DEMBED -DMULTIPLICITY',
+ );
+
+ if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){
+ $uc = uc($1);
+ } else {
+ $uc = ""; # avoid warning
+ }
+ $perltype = $map{$uc} ? $map{$uc} : "";
+
+ if ($uc =~ /^D/) {
+ $optdebug = "-g";
+ }
+
+
+ my($name);
+ ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
+ if ($prog = $Config{$name}) {
+ # Expand hints for this extension via the shell
+ print STDOUT "Processing $name hint:\n" if $Verbose;
+ my(@o)=`cc=\"$cflags{cc}\"
+ ccflags=\"$cflags{ccflags}\"
+ optimize=\"$cflags{optimize}\"
+ perltype=\"$cflags{perltype}\"
+ optdebug=\"$cflags{optdebug}\"
+ eval '$prog'
+ echo cc=\$cc
+ echo ccflags=\$ccflags
+ echo optimize=\$optimize
+ echo perltype=\$perltype
+ echo optdebug=\$optdebug
+ `;
+ foreach my $line (@o){
+ chomp $line;
+ if ($line =~ /(.*?)=\s*(.*)\s*$/){
+ $cflags{$1} = $2;
+ print STDOUT " $1 = $2\n" if $Verbose;
+ } else {
+ print STDOUT "Unrecognised result from hint: '$line'\n";
+ }
+ }
+ }
+
+ if ($optdebug) {
+ $cflags{optimize} = $optdebug;
+ }
+
+ for (qw(ccflags optimize perltype)) {
+ $cflags{$_} ||= '';
+ $cflags{$_} =~ s/^\s+//;
+ $cflags{$_} =~ s/\s+/ /g;
+ $cflags{$_} =~ s/\s+$//;
+ $self->{uc $_} ||= $cflags{$_};
+ }
+
+ if ($self->{POLLUTE}) {
+ $self->{CCFLAGS} .= ' -DPERL_POLLUTE ';
+ }
+
+ my $pollute = '';
+ if ($Config{usemymalloc} and not $Config{bincompat5005}
+ and not $Config{ccflags} =~ /-DPERL_POLLUTE_MALLOC\b/
+ and $self->{PERL_MALLOC_OK}) {
+ $pollute = '$(PERL_MALLOC_DEF)';
+ }
+
+ $self->{CCFLAGS} = quote_paren($self->{CCFLAGS});
+ $self->{OPTIMIZE} = quote_paren($self->{OPTIMIZE});
+
+ return $self->{CFLAGS} = qq{
+CCFLAGS = $self->{CCFLAGS}
+OPTIMIZE = $self->{OPTIMIZE}
+PERLTYPE = $self->{PERLTYPE}
+MPOLLUTE = $pollute
+};
+
+}
+
+
+=item const_cccmd (o)
+
+Returns the full compiler call for C programs and stores the
+definition in CONST_CCCMD.
+
+=cut
+
+sub const_cccmd {
+ my($self,$libperl)=@_;
+ return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
+ return '' unless $self->needs_linking();
+ return $self->{CONST_CCCMD} =
+ q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\
+ $(CCFLAGS) $(OPTIMIZE) \\
+ $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\
+ $(XS_DEFINE_VERSION)};
+}
+
+=item const_config (o)
+
+Defines a couple of constants in the Makefile that are imported from
+%Config.
+
+=cut
+
+sub const_config {
+# --- Constants Sections ---
+
+ my($self) = shift;
+ my @m = <<"END";
+
+# These definitions are from config.sh (via $INC{'Config.pm'}).
+# They may have been overridden via Makefile.PL or on the command line.
+END
+
+ my(%once_only);
+ foreach my $key (@{$self->{CONFIG}}){
+ # SITE*EXP macros are defined in &constants; avoid duplicates here
+ next if $once_only{$key};
+ $self->{uc $key} = quote_paren($self->{uc $key});
+ push @m, uc($key) , ' = ' , $self->{uc $key}, "\n";
+ $once_only{$key} = 1;
+ }
+ join('', @m);
+}
+
+=item const_loadlibs (o)
+
+Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See
+L<ExtUtils::Liblist> for details.
+
+=cut
+
+sub const_loadlibs {
+ my($self) = shift;
+ return "" unless $self->needs_linking;
+ my @m;
+ push @m, qq{
+# $self->{NAME} might depend on some other libraries:
+# See ExtUtils::Liblist for details
+#
+};
+ for my $tmp (qw/
+ EXTRALIBS LDLOADLIBS BSLOADLIBS
+ /) {
+ next unless defined $self->{$tmp};
+ push @m, "$tmp = $self->{$tmp}\n";
+ }
+ # don't set LD_RUN_PATH if empty
+ for my $tmp (qw/
+ LD_RUN_PATH
+ /) {
+ next unless $self->{$tmp};
+ push @m, "$tmp = $self->{$tmp}\n";
+ }
+ return join "", @m;
+}
+
+=item constants (o)
+
+ my $make_frag = $mm->constants;
+
+Prints out macros for lots of constants.
+
+=cut
+
+sub constants {
+ my($self) = @_;
+ my @m = ();
+
+ $self->{DFSEP} = '$(DIRFILESEP)'; # alias for internal use
+
+ for my $macro (qw(
+
+ AR_STATIC_ARGS DIRFILESEP DFSEP
+ NAME NAME_SYM
+ VERSION VERSION_MACRO VERSION_SYM DEFINE_VERSION
+ XS_VERSION XS_VERSION_MACRO XS_DEFINE_VERSION
+ INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB
+ INST_MAN1DIR INST_MAN3DIR
+ MAN1EXT MAN3EXT
+ INSTALLDIRS INSTALL_BASE DESTDIR PREFIX
+ PERLPREFIX SITEPREFIX VENDORPREFIX
+ ),
+ (map { ("INSTALL".$_,
+ "DESTINSTALL".$_)
+ } $self->installvars),
+ qw(
+ PERL_LIB
+ PERL_ARCHLIB
+ LIBPERL_A MYEXTLIB
+ FIRST_MAKEFILE MAKEFILE_OLD MAKE_APERL_FILE
+ PERLMAINCC PERL_SRC PERL_INC
+ PERL FULLPERL ABSPERL
+ PERLRUN FULLPERLRUN ABSPERLRUN
+ PERLRUNINST FULLPERLRUNINST ABSPERLRUNINST
+ PERL_CORE
+ PERM_DIR PERM_RW PERM_RWX
+
+ ) )
+ {
+ next unless defined $self->{$macro};
+
+ # pathnames can have sharp signs in them; escape them so
+ # make doesn't think it is a comment-start character.
+ $self->{$macro} =~ s/#/\\#/g;
+ push @m, "$macro = $self->{$macro}\n";
+ }
+
+ push @m, qq{
+MAKEMAKER = $self->{MAKEMAKER}
+MM_VERSION = $self->{MM_VERSION}
+MM_REVISION = $self->{MM_REVISION}
+};
+
+ push @m, q{
+# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
+# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
+# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
+# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
+};
+
+ for my $macro (qw/
+ MAKE
+ FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
+ LDFROM LINKTYPE BOOTDEP
+ / )
+ {
+ next unless defined $self->{$macro};
+ push @m, "$macro = $self->{$macro}\n";
+ }
+
+ push @m, "
+# Handy lists of source code files:
+XS_FILES = ".$self->wraplist(sort keys %{$self->{XS}})."
+C_FILES = ".$self->wraplist(@{$self->{C}})."
+O_FILES = ".$self->wraplist(@{$self->{O_FILES}})."
+H_FILES = ".$self->wraplist(@{$self->{H}})."
+MAN1PODS = ".$self->wraplist(sort keys %{$self->{MAN1PODS}})."
+MAN3PODS = ".$self->wraplist(sort keys %{$self->{MAN3PODS}})."
+";
+
+
+ push @m, q{
+# Where is the Config information that we are using/depend on
+CONFIGDEP = $(PERL_ARCHLIB)$(DFSEP)Config.pm $(PERL_INC)$(DFSEP)config.h
+};
+
+
+ push @m, qq{
+# Where to build things
+INST_LIBDIR = $self->{INST_LIBDIR}
+INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
+
+INST_AUTODIR = $self->{INST_AUTODIR}
+INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
+
+INST_STATIC = $self->{INST_STATIC}
+INST_DYNAMIC = $self->{INST_DYNAMIC}
+INST_BOOT = $self->{INST_BOOT}
+};
+
+
+ push @m, qq{
+# Extra linker info
+EXPORT_LIST = $self->{EXPORT_LIST}
+PERL_ARCHIVE = $self->{PERL_ARCHIVE}
+PERL_ARCHIVE_AFTER = $self->{PERL_ARCHIVE_AFTER}
+};
+
+ push @m, "
+
+TO_INST_PM = ".$self->wraplist(sort keys %{$self->{PM}})."
+
+PM_TO_BLIB = ".$self->wraplist(%{$self->{PM}})."
+";
+
+ join('',@m);
+}
+
+
+=item depend (o)
+
+Same as macro for the depend attribute.
+
+=cut
+
+sub depend {
+ my($self,%attribs) = @_;
+ my(@m,$key,$val);
+ while (($key,$val) = each %attribs){
+ last unless defined $key;
+ push @m, "$key : $val\n";
+ }
+ join "", @m;
+}
+
+
+=item init_DEST
+
+ $mm->init_DEST
+
+Defines the DESTDIR and DEST* variables paralleling the INSTALL*.
+
+=cut
+
+sub init_DEST {
+ my $self = shift;
+
+ # Initialize DESTDIR
+ $self->{DESTDIR} ||= '';
+
+ # Make DEST variables.
+ foreach my $var ($self->installvars) {
+ my $destvar = 'DESTINSTALL'.$var;
+ $self->{$destvar} ||= '$(DESTDIR)$(INSTALL'.$var.')';
+ }
+}
+
+
+=item init_dist
+
+ $mm->init_dist;
+
+Defines a lot of macros for distribution support.
+
+ macro description default
+
+ TAR tar command to use tar
+ TARFLAGS flags to pass to TAR cvf
+
+ ZIP zip command to use zip
+ ZIPFLAGS flags to pass to ZIP -r
+
+ COMPRESS compression command to gzip --best
+ use for tarfiles
+ SUFFIX suffix to put on .gz
+ compressed files
+
+ SHAR shar command to use shar
+
+ PREOP extra commands to run before
+ making the archive
+ POSTOP extra commands to run after
+ making the archive
+
+ TO_UNIX a command to convert linefeeds
+ to Unix style in your archive
+
+ CI command to checkin your ci -u
+ sources to version control
+ RCS_LABEL command to label your sources rcs -Nv$(VERSION_SYM): -q
+ just after CI is run
+
+ DIST_CP $how argument to manicopy() best
+ when the distdir is created
+
+ DIST_DEFAULT default target to use to tardist
+ create a distribution
+
+ DISTVNAME name of the resulting archive $(DISTNAME)-$(VERSION)
+ (minus suffixes)
+
+=cut
+
+sub init_dist {
+ my $self = shift;
+
+ $self->{TAR} ||= 'tar';
+ $self->{TARFLAGS} ||= 'cvf';
+ $self->{ZIP} ||= 'zip';
+ $self->{ZIPFLAGS} ||= '-r';
+ $self->{COMPRESS} ||= 'gzip --best';
+ $self->{SUFFIX} ||= '.gz';
+ $self->{SHAR} ||= 'shar';
+ $self->{PREOP} ||= '$(NOECHO) $(NOOP)'; # eg update MANIFEST
+ $self->{POSTOP} ||= '$(NOECHO) $(NOOP)'; # eg remove the distdir
+ $self->{TO_UNIX} ||= '$(NOECHO) $(NOOP)';
+
+ $self->{CI} ||= 'ci -u';
+ $self->{RCS_LABEL}||= 'rcs -Nv$(VERSION_SYM): -q';
+ $self->{DIST_CP} ||= 'best';
+ $self->{DIST_DEFAULT} ||= 'tardist';
+
+ ($self->{DISTNAME} = $self->{NAME}) =~ s{::}{-}g unless $self->{DISTNAME};
+ $self->{DISTVNAME} ||= $self->{DISTNAME}.'-'.$self->{VERSION};
+
+}
+
+=item dist (o)
+
+ my $dist_macros = $mm->dist(%overrides);
+
+Generates a make fragment defining all the macros initialized in
+init_dist.
+
+%overrides can be used to override any of the above.
+
+=cut
+
+sub dist {
+ my($self, %attribs) = @_;
+
+ my $make = '';
+ foreach my $key (qw(
+ TAR TARFLAGS ZIP ZIPFLAGS COMPRESS SUFFIX SHAR
+ PREOP POSTOP TO_UNIX
+ CI RCS_LABEL DIST_CP DIST_DEFAULT
+ DISTNAME DISTVNAME
+ ))
+ {
+ my $value = $attribs{$key} || $self->{$key};
+ $make .= "$key = $value\n";
+ }
+
+ return $make;
+}
+
+=item dist_basics (o)
+
+Defines the targets distclean, distcheck, skipcheck, manifest, veryclean.
+
+=cut
+
+sub dist_basics {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+distclean :: realclean distcheck
+ $(NOECHO) $(NOOP)
+
+distcheck :
+ $(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck
+
+skipcheck :
+ $(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck
+
+manifest :
+ $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest
+
+veryclean : realclean
+ $(RM_F) *~ */*~ *.orig */*.orig *.bak */*.bak *.old */*.old
+
+MAKE_FRAG
+
+}
+
+=item dist_ci (o)
+
+Defines a check in target for RCS.
+
+=cut
+
+sub dist_ci {
+ my($self) = shift;
+ return q{
+ci :
+ $(PERLRUN) "-MExtUtils::Manifest=maniread" \\
+ -e "@all = keys %{ maniread() };" \\
+ -e "print(qq{Executing $(CI) @all\n}); system(qq{$(CI) @all});" \\
+ -e "print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});"
+};
+}
+
+=item dist_core (o)
+
+ my $dist_make_fragment = $MM->dist_core;
+
+Puts the targets necessary for 'make dist' together into one make
+fragment.
+
+=cut
+
+sub dist_core {
+ my($self) = shift;
+
+ my $make_frag = '';
+ foreach my $target (qw(dist tardist uutardist tarfile zipdist zipfile
+ shdist))
+ {
+ my $method = $target.'_target';
+ $make_frag .= "\n";
+ $make_frag .= $self->$method();
+ }
+
+ return $make_frag;
+}
+
+
+=item B<dist_target>
+
+ my $make_frag = $MM->dist_target;
+
+Returns the 'dist' target to make an archive for distribution. This
+target simply checks to make sure the Makefile is up-to-date and
+depends on $(DIST_DEFAULT).
+
+=cut
+
+sub dist_target {
+ my($self) = shift;
+
+ my $date_check = $self->oneliner(<<'CODE', ['-l']);
+print 'Warning: Makefile possibly out of date with $(VERSION_FROM)'
+ if -e '$(VERSION_FROM)' and -M '$(VERSION_FROM)' < -M '$(FIRST_MAKEFILE)';
+CODE
+
+ return sprintf <<'MAKE_FRAG', $date_check;
+dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE)
+ $(NOECHO) %s
+MAKE_FRAG
+}
+
+=item B<tardist_target>
+
+ my $make_frag = $MM->tardist_target;
+
+Returns the 'tardist' target which is simply so 'make tardist' works.
+The real work is done by the dynamically named tardistfile_target()
+method, tardist should have that as a dependency.
+
+=cut
+
+sub tardist_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+tardist : $(DISTVNAME).tar$(SUFFIX)
+ $(NOECHO) $(NOOP)
+MAKE_FRAG
+}
+
+=item B<zipdist_target>
+
+ my $make_frag = $MM->zipdist_target;
+
+Returns the 'zipdist' target which is simply so 'make zipdist' works.
+The real work is done by the dynamically named zipdistfile_target()
+method, zipdist should have that as a dependency.
+
+=cut
+
+sub zipdist_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+zipdist : $(DISTVNAME).zip
+ $(NOECHO) $(NOOP)
+MAKE_FRAG
+}
+
+=item B<tarfile_target>
+
+ my $make_frag = $MM->tarfile_target;
+
+The name of this target is the name of the tarball generated by
+tardist. This target does the actual work of turning the distdir into
+a tarball.
+
+=cut
+
+sub tarfile_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+$(DISTVNAME).tar$(SUFFIX) : distdir
+ $(PREOP)
+ $(TO_UNIX)
+ $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
+ $(RM_RF) $(DISTVNAME)
+ $(COMPRESS) $(DISTVNAME).tar
+ $(POSTOP)
+MAKE_FRAG
+}
+
+=item zipfile_target
+
+ my $make_frag = $MM->zipfile_target;
+
+The name of this target is the name of the zip file generated by
+zipdist. This target does the actual work of turning the distdir into
+a zip file.
+
+=cut
+
+sub zipfile_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+$(DISTVNAME).zip : distdir
+ $(PREOP)
+ $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
+ $(RM_RF) $(DISTVNAME)
+ $(POSTOP)
+MAKE_FRAG
+}
+
+=item uutardist_target
+
+ my $make_frag = $MM->uutardist_target;
+
+Converts the tarfile into a uuencoded file
+
+=cut
+
+sub uutardist_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+uutardist : $(DISTVNAME).tar$(SUFFIX)
+ uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu
+MAKE_FRAG
+}
+
+
+=item shdist_target
+
+ my $make_frag = $MM->shdist_target;
+
+Converts the distdir into a shell archive.
+
+=cut
+
+sub shdist_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+shdist : distdir
+ $(PREOP)
+ $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
+ $(RM_RF) $(DISTVNAME)
+ $(POSTOP)
+MAKE_FRAG
+}
+
+
+=item dlsyms (o)
+
+Used by some OS' to define DL_FUNCS and DL_VARS and write the *.exp files.
+
+Normally just returns an empty string.
+
+=cut
+
+sub dlsyms {
+ return '';
+}
+
+
+=item dynamic_bs (o)
+
+Defines targets for bootstrap files.
+
+=cut
+
+sub dynamic_bs {
+ my($self, %attribs) = @_;
+ return '
+BOOTSTRAP =
+' unless $self->has_link_code();
+
+ my $target = $Is{VMS} ? '$(MMS$TARGET)' : '$@';
+
+ return sprintf <<'MAKE_FRAG', ($target) x 5;
+BOOTSTRAP = $(BASEEXT).bs
+
+# As Mkbootstrap might not write a file (if none is required)
+# we use touch to prevent make continually trying to remake it.
+# The DynaLoader only reads a non-empty file.
+$(BOOTSTRAP) : $(FIRST_MAKEFILE) $(BOOTDEP) $(INST_ARCHAUTODIR)$(DFSEP).exists
+ $(NOECHO) $(ECHO) "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
+ $(NOECHO) $(PERLRUN) \
+ "-MExtUtils::Mkbootstrap" \
+ -e "Mkbootstrap('$(BASEEXT)','$(BSLOADLIBS)');"
+ $(NOECHO) $(TOUCH) %s
+ $(CHMOD) $(PERM_RW) %s
+
+$(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists
+ $(NOECHO) $(RM_RF) %s
+ - $(CP) $(BOOTSTRAP) %s
+ $(CHMOD) $(PERM_RW) %s
+MAKE_FRAG
+}
+
+=item dynamic_lib (o)
+
+Defines how to produce the *.so (or equivalent) files.
+
+=cut
+
+sub dynamic_lib {
+ my($self, %attribs) = @_;
+ return '' unless $self->needs_linking(); #might be because of a subdir
+
+ return '' unless $self->has_link_code;
+
+ my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
+ my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
+ my($armaybe) = $attribs{ARMAYBE} || $self->{ARMAYBE} || ":";
+ my($ldfrom) = '$(LDFROM)';
+ $armaybe = 'ar' if ($Is{OSF} and $armaybe eq ':');
+ my(@m);
+ my $ld_opt = $Is{OS2} ? '$(OPTIMIZE) ' : ''; # Useful on other systems too?
+ my $ld_fix = $Is{OS2} ? '|| ( $(RM_F) $@ && sh -c false )' : '';
+ push(@m,'
+# This section creates the dynamically loadable $(INST_DYNAMIC)
+# from $(OBJECT) and possibly $(MYEXTLIB).
+ARMAYBE = '.$armaybe.'
+OTHERLDFLAGS = '.$ld_opt.$otherldflags.'
+INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
+INST_DYNAMIC_FIX = '.$ld_fix.'
+
+$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP)
+');
+ if ($armaybe ne ':'){
+ $ldfrom = 'tmp$(LIB_EXT)';
+ push(@m,' $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
+ push(@m,' $(RANLIB) '."$ldfrom\n");
+ }
+ $ldfrom = "-all $ldfrom -none" if $Is{OSF};
+
+ # The IRIX linker doesn't use LD_RUN_PATH
+ my $ldrun = $Is{IRIX} && $self->{LD_RUN_PATH} ?
+ qq{-rpath "$self->{LD_RUN_PATH}"} : '';
+
+ # For example in AIX the shared objects/libraries from previous builds
+ # linger quite a while in the shared dynalinker cache even when nobody
+ # is using them. This is painful if one for instance tries to restart
+ # a failed build because the link command will fail unnecessarily 'cos
+ # the shared object/library is 'busy'.
+ push(@m,' $(RM_F) $@
+');
+
+ my $libs = '$(LDLOADLIBS)';
+
+ if (($Is{NetBSD} || $Is{Interix}) && $Config{'useshrplib'} eq 'true') {
+ # Use nothing on static perl platforms, and to the flags needed
+ # to link against the shared libperl library on shared perl
+ # platforms. We peek at lddlflags to see if we need -Wl,-R
+ # or -R to add paths to the run-time library search path.
+ if ($Config{'lddlflags'} =~ /-Wl,-R/) {
+ $libs .= ' -L$(PERL_INC) -Wl,-R$(INSTALLARCHLIB)/CORE -Wl,-R$(PERL_ARCHLIB)/CORE -lperl';
+ } elsif ($Config{'lddlflags'} =~ /-R/) {
+ $libs .= ' -L$(PERL_INC) -R$(INSTALLARCHLIB)/CORE -R$(PERL_ARCHLIB)/CORE -lperl';
+ }
+ }
+
+ my $ld_run_path_shell = "";
+ if ($self->{LD_RUN_PATH} ne "") {
+ $ld_run_path_shell = 'LD_RUN_PATH="$(LD_RUN_PATH)" ';
+ }
+
+ push @m, sprintf <<'MAKE', $ld_run_path_shell, $ldrun, $ldfrom, $libs;
+ %s$(LD) %s $(LDDLFLAGS) %s $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) \
+ $(PERL_ARCHIVE) %s $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST) \
+ $(INST_DYNAMIC_FIX)
+MAKE
+
+ push @m, <<'MAKE';
+ $(CHMOD) $(PERM_RWX) $@
+MAKE
+
+ return join('',@m);
+}
+
+=item exescan
+
+Deprecated method. Use libscan instead.
+
+=cut
+
+sub exescan {
+ my($self,$path) = @_;
+ $path;
+}
+
+=item extliblist
+
+Called by init_others, and calls ext ExtUtils::Liblist. See
+L<ExtUtils::Liblist> for details.
+
+=cut
+
+sub extliblist {
+ my($self,$libs) = @_;
+ require ExtUtils::Liblist;
+ $self->ext($libs, $Verbose);
+}
+
+=item find_perl
+
+Finds the executables PERL and FULLPERL
+
+=cut
+
+sub find_perl {
+ my($self, $ver, $names, $dirs, $trace) = @_;
+
+ if ($trace >= 2){
+ print "Looking for perl $ver by these names:
+@$names
+in these dirs:
+@$dirs
+";
+ }
+
+ my $stderr_duped = 0;
+ local *STDERR_COPY;
+
+ unless ($Is{BSD}) {
+ # >& and lexical filehandles together give 5.6.2 indigestion
+ if( open(STDERR_COPY, '>&STDERR') ) { ## no critic
+ $stderr_duped = 1;
+ }
+ else {
+ warn <<WARNING;
+find_perl() can't dup STDERR: $!
+You might see some garbage while we search for Perl
+WARNING
+ }
+ }
+
+ foreach my $name (@$names){
+ foreach my $dir (@$dirs){
+ next unless defined $dir; # $self->{PERL_SRC} may be undefined
+ my ($abs, $val);
+ if ($self->file_name_is_absolute($name)) { # /foo/bar
+ $abs = $name;
+ } elsif ($self->canonpath($name) eq
+ $self->canonpath(basename($name))) { # foo
+ $abs = $self->catfile($dir, $name);
+ } else { # foo/bar
+ $abs = $self->catfile($Curdir, $name);
+ }
+ print "Checking $abs\n" if ($trace >= 2);
+ next unless $self->maybe_command($abs);
+ print "Executing $abs\n" if ($trace >= 2);
+
+ my $version_check = qq{$abs -le "require $ver; print qq{VER_OK}"};
+ $version_check = "$Config{run} $version_check"
+ if defined $Config{run} and length $Config{run};
+
+ # To avoid using the unportable 2>&1 to suppress STDERR,
+ # we close it before running the command.
+ # However, thanks to a thread library bug in many BSDs
+ # ( http://www.freebsd.org/cgi/query-pr.cgi?pr=51535 )
+ # we cannot use the fancier more portable way in here
+ # but instead need to use the traditional 2>&1 construct.
+ if ($Is{BSD}) {
+ $val = `$version_check 2>&1`;
+ } else {
+ close STDERR if $stderr_duped;
+ $val = `$version_check`;
+
+ # 5.6.2's 3-arg open doesn't work with >&
+ open STDERR, ">&STDERR_COPY" ## no critic
+ if $stderr_duped;
+ }
+
+ if ($val =~ /^VER_OK/m) {
+ print "Using PERL=$abs\n" if $trace;
+ return $abs;
+ } elsif ($trace >= 2) {
+ print "Result: '$val' ".($? >> 8)."\n";
+ }
+ }
+ }
+ print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
+ 0; # false and not empty
+}
+
+
+=item fixin
+
+ $mm->fixin(@files);
+
+Inserts the sharpbang or equivalent magic number to a set of @files.
+
+=cut
+
+sub fixin { # stolen from the pink Camel book, more or less
+ my ( $self, @files ) = @_;
+
+ my ($does_shbang) = $Config{'sharpbang'} =~ /^\s*\#\!/;
+ for my $file (@files) {
+ my $file_new = "$file.new";
+ my $file_bak = "$file.bak";
+
+ open( my $fixin, '<', $file ) or croak "Can't process '$file': $!";
+ local $/ = "\n";
+ chomp( my $line = <$fixin> );
+ next unless $line =~ s/^\s*\#!\s*//; # Not a shbang file.
+ # Now figure out the interpreter name.
+ my ( $cmd, $arg ) = split ' ', $line, 2;
+ $cmd =~ s!^.*/!!;
+
+ # Now look (in reverse) for interpreter in absolute PATH (unless perl).
+ my $interpreter;
+ if ( $cmd =~ m{^perl(?:\z|[^a-z])} ) {
+ if ( $Config{startperl} =~ m,^\#!.*/perl, ) {
+ $interpreter = $Config{startperl};
+ $interpreter =~ s,^\#!,,;
+ }
+ else {
+ $interpreter = $Config{perlpath};
+ }
+ }
+ else {
+ my (@absdirs)
+ = reverse grep { $self->file_name_is_absolute($_) } $self->path;
+ $interpreter = '';
+
+ foreach my $dir (@absdirs) {
+ if ( $self->maybe_command($cmd) ) {
+ warn "Ignoring $interpreter in $file\n"
+ if $Verbose && $interpreter;
+ $interpreter = $self->catfile( $dir, $cmd );
+ }
+ }
+ }
+
+ # Figure out how to invoke interpreter on this machine.
+
+ my ($shb) = "";
+ if ($interpreter) {
+ print STDOUT "Changing sharpbang in $file to $interpreter"
+ if $Verbose;
+
+ # this is probably value-free on DOSISH platforms
+ if ($does_shbang) {
+ $shb .= "$Config{'sharpbang'}$interpreter";
+ $shb .= ' ' . $arg if defined $arg;
+ $shb .= "\n";
+ }
+ $shb .= qq{
+eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
+ if 0; # not running under some shell
+} unless $Is{Win32}; # this won't work on win32, so don't
+ }
+ else {
+ warn "Can't find $cmd in PATH, $file unchanged"
+ if $Verbose;
+ next;
+ }
+
+ open( my $fixout, ">", "$file_new" ) or do {
+ warn "Can't create new $file: $!\n";
+ next;
+ };
+
+ # Print out the new #! line (or equivalent).
+ local $\;
+ local $/;
+ print $fixout $shb, <$fixin>;
+ close $fixin;
+ close $fixout;
+
+ chmod 0666, $file_bak;
+ unlink $file_bak;
+ unless ( _rename( $file, $file_bak ) ) {
+ warn "Can't rename $file to $file_bak: $!";
+ next;
+ }
+ unless ( _rename( $file_new, $file ) ) {
+ warn "Can't rename $file_new to $file: $!";
+ unless ( _rename( $file_bak, $file ) ) {
+ warn "Can't rename $file_bak back to $file either: $!";
+ warn "Leaving $file renamed as $file_bak\n";
+ }
+ next;
+ }
+ unlink $file_bak;
+ }
+ continue {
+ system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
+ }
+}
+
+
+sub _rename {
+ my($old, $new) = @_;
+
+ foreach my $file ($old, $new) {
+ if( $Is{VMS} and basename($file) !~ /\./ ) {
+ # rename() in 5.8.0 on VMS will not rename a file if it
+ # does not contain a dot yet it returns success.
+ $file = "$file.";
+ }
+ }
+
+ return rename($old, $new);
+}
+
+
+=item force (o)
+
+Writes an empty FORCE: target.
+
+=cut
+
+sub force {
+ my($self) = shift;
+ '# Phony target to force checking subdirectories.
+FORCE :
+ $(NOECHO) $(NOOP)
+';
+}
+
+=item guess_name
+
+Guess the name of this package by examining the working directory's
+name. MakeMaker calls this only if the developer has not supplied a
+NAME attribute.
+
+=cut
+
+# ';
+
+sub guess_name {
+ my($self) = @_;
+ use Cwd 'cwd';
+ my $name = basename(cwd());
+ $name =~ s|[\-_][\d\.\-]+\z||; # this is new with MM 5.00, we
+ # strip minus or underline
+ # followed by a float or some such
+ print "Warning: Guessing NAME [$name] from current directory name.\n";
+ $name;
+}
+
+=item has_link_code
+
+Returns true if C, XS, MYEXTLIB or similar objects exist within this
+object that need a compiler. Does not descend into subdirectories as
+needs_linking() does.
+
+=cut
+
+sub has_link_code {
+ my($self) = shift;
+ return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
+ if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
+ $self->{HAS_LINK_CODE} = 1;
+ return 1;
+ }
+ return $self->{HAS_LINK_CODE} = 0;
+}
+
+
+=item init_dirscan
+
+Scans the directory structure and initializes DIR, XS, XS_FILES,
+C, C_FILES, O_FILES, H, H_FILES, PL_FILES, EXE_FILES.
+
+Called by init_main.
+
+=cut
+
+sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
+ my($self) = @_;
+ my(%dir, %xs, %c, %h, %pl_files, %pm);
+
+ my %ignore = map {( $_ => 1 )} qw(Makefile.PL Build.PL test.pl t);
+
+ # ignore the distdir
+ $Is{VMS} ? $ignore{"$self->{DISTVNAME}.dir"} = 1
+ : $ignore{$self->{DISTVNAME}} = 1;
+
+ @ignore{map lc, keys %ignore} = values %ignore if $Is{VMS};
+
+ foreach my $name ($self->lsdir($Curdir)){
+ next if $name =~ /\#/;
+ next if $name eq $Curdir or $name eq $Updir or $ignore{$name};
+ next unless $self->libscan($name);
+ if (-d $name){
+ next if -l $name; # We do not support symlinks at all
+ next if $self->{NORECURS};
+ $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
+ } elsif ($name =~ /\.xs\z/){
+ my($c); ($c = $name) =~ s/\.xs\z/.c/;
+ $xs{$name} = $c;
+ $c{$c} = 1;
+ } elsif ($name =~ /\.c(pp|xx|c)?\z/i){ # .c .C .cpp .cxx .cc
+ $c{$name} = 1
+ unless $name =~ m/perlmain\.c/; # See MAP_TARGET
+ } elsif ($name =~ /\.h\z/i){
+ $h{$name} = 1;
+ } elsif ($name =~ /\.PL\z/) {
+ ($pl_files{$name} = $name) =~ s/\.PL\z// ;
+ } elsif (($Is{VMS} || $Is{Dos}) && $name =~ /[._]pl$/i) {
+ # case-insensitive filesystem, one dot per name, so foo.h.PL
+ # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos
+ local($/); open(my $pl, '<', $name); my $txt = <$pl>; close $pl;
+ if ($txt =~ /Extracting \S+ \(with variable substitutions/) {
+ ($pl_files{$name} = $name) =~ s/[._]pl\z//i ;
+ }
+ else {
+ $pm{$name} = $self->catfile($self->{INST_LIBDIR},$name);
+ }
+ } elsif ($name =~ /\.(p[ml]|pod)\z/){
+ $pm{$name} = $self->catfile($self->{INST_LIBDIR},$name);
+ }
+ }
+
+ $self->{PL_FILES} ||= \%pl_files;
+ $self->{DIR} ||= [sort keys %dir];
+ $self->{XS} ||= \%xs;
+ $self->{C} ||= [sort keys %c];
+ $self->{H} ||= [sort keys %h];
+ $self->{PM} ||= \%pm;
+
+ my @o_files = @{$self->{C}};
+ $self->{O_FILES} = [grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files];
+}
+
+
+=item init_MANPODS
+
+Determines if man pages should be generated and initializes MAN1PODS
+and MAN3PODS as appropriate.
+
+=cut
+
+sub init_MANPODS {
+ my $self = shift;
+
+ # Set up names of manual pages to generate from pods
+ foreach my $man (qw(MAN1 MAN3)) {
+ if ( $self->{"${man}PODS"}
+ or $self->{"INSTALL${man}DIR"} =~ /^(none|\s*)$/
+ ) {
+ $self->{"${man}PODS"} ||= {};
+ }
+ else {
+ my $init_method = "init_${man}PODS";
+ $self->$init_method();
+ }
+ }
+}
+
+
+sub _has_pod {
+ my($self, $file) = @_;
+
+ my($ispod)=0;
+ if (open( my $fh, '<', $file )) {
+ while (<$fh>) {
+ if (/^=(?:head\d+|item|pod)\b/) {
+ $ispod=1;
+ last;
+ }
+ }
+ close $fh;
+ } else {
+ # If it doesn't exist yet, we assume, it has pods in it
+ $ispod = 1;
+ }
+
+ return $ispod;
+}
+
+
+=item init_MAN1PODS
+
+Initializes MAN1PODS from the list of EXE_FILES.
+
+=cut
+
+sub init_MAN1PODS {
+ my($self) = @_;
+
+ if ( exists $self->{EXE_FILES} ) {
+ foreach my $name (@{$self->{EXE_FILES}}) {
+ next unless $self->_has_pod($name);
+
+ $self->{MAN1PODS}->{$name} =
+ $self->catfile("\$(INST_MAN1DIR)",
+ basename($name).".\$(MAN1EXT)");
+ }
+ }
+}
+
+
+=item init_MAN3PODS
+
+Initializes MAN3PODS from the list of PM files.
+
+=cut
+
+sub init_MAN3PODS {
+ my $self = shift;
+
+ my %manifypods = (); # we collect the keys first, i.e. the files
+ # we have to convert to pod
+
+ foreach my $name (keys %{$self->{PM}}) {
+ if ($name =~ /\.pod\z/ ) {
+ $manifypods{$name} = $self->{PM}{$name};
+ } elsif ($name =~ /\.p[ml]\z/ ) {
+ if( $self->_has_pod($name) ) {
+ $manifypods{$name} = $self->{PM}{$name};
+ }
+ }
+ }
+
+ my $parentlibs_re = join '|', @{$self->{PMLIBPARENTDIRS}};
+
+ # Remove "Configure.pm" and similar, if it's not the only pod listed
+ # To force inclusion, just name it "Configure.pod", or override
+ # MAN3PODS
+ foreach my $name (keys %manifypods) {
+ if ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) {
+ delete $manifypods{$name};
+ next;
+ }
+ my($manpagename) = $name;
+ $manpagename =~ s/\.p(od|m|l)\z//;
+ # everything below lib is ok
+ unless($manpagename =~ s!^\W*($parentlibs_re)\W+!!s) {
+ $manpagename = $self->catfile(
+ split(/::/,$self->{PARENT_NAME}),$manpagename
+ );
+ }
+ $manpagename = $self->replace_manpage_separator($manpagename);
+ $self->{MAN3PODS}->{$name} =
+ $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
+ }
+}
+
+
+=item init_PM
+
+Initializes PMLIBDIRS and PM from PMLIBDIRS.
+
+=cut
+
+sub init_PM {
+ my $self = shift;
+
+ # Some larger extensions often wish to install a number of *.pm/pl
+ # files into the library in various locations.
+
+ # The attribute PMLIBDIRS holds an array reference which lists
+ # subdirectories which we should search for library files to
+ # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We
+ # recursively search through the named directories (skipping any
+ # which don't exist or contain Makefile.PL files).
+
+ # For each *.pm or *.pl file found $self->libscan() is called with
+ # the default installation path in $_[1]. The return value of
+ # libscan defines the actual installation location. The default
+ # libscan function simply returns the path. The file is skipped
+ # if libscan returns false.
+
+ # The default installation location passed to libscan in $_[1] is:
+ #
+ # ./*.pm => $(INST_LIBDIR)/*.pm
+ # ./xyz/... => $(INST_LIBDIR)/xyz/...
+ # ./lib/... => $(INST_LIB)/...
+ #
+ # In this way the 'lib' directory is seen as the root of the actual
+ # perl library whereas the others are relative to INST_LIBDIR
+ # (which includes PARENT_NAME). This is a subtle distinction but one
+ # that's important for nested modules.
+
+ unless( $self->{PMLIBDIRS} ) {
+ if( $Is{VMS} ) {
+ # Avoid logical name vs directory collisions
+ $self->{PMLIBDIRS} = ['./lib', "./$self->{BASEEXT}"];
+ }
+ else {
+ $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}];
+ }
+ }
+
+ #only existing directories that aren't in $dir are allowed
+
+ # Avoid $_ wherever possible:
+ # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
+ my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
+ @{$self->{PMLIBDIRS}} = ();
+ my %dir = map { ($_ => $_) } @{$self->{DIR}};
+ foreach my $pmlibdir (@pmlibdirs) {
+ -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
+ }
+
+ unless( $self->{PMLIBPARENTDIRS} ) {
+ @{$self->{PMLIBPARENTDIRS}} = ('lib');
+ }
+
+ return if $self->{PM} and $self->{ARGS}{PM};
+
+ if (@{$self->{PMLIBDIRS}}){
+ print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
+ if ($Verbose >= 2);
+ require File::Find;
+ File::Find::find(sub {
+ if (-d $_){
+ unless ($self->libscan($_)){
+ $File::Find::prune = 1;
+ }
+ return;
+ }
+ return if /\#/;
+ return if /~$/; # emacs temp files
+ return if /,v$/; # RCS files
+ return if m{\.swp$}; # vim swap files
+
+ my $path = $File::Find::name;
+ my $prefix = $self->{INST_LIBDIR};
+ my $striplibpath;
+
+ my $parentlibs_re = join '|', @{$self->{PMLIBPARENTDIRS}};
+ $prefix = $self->{INST_LIB}
+ if ($striplibpath = $path) =~ s{^(\W*)($parentlibs_re)\W}
+ {$1}i;
+
+ my($inst) = $self->catfile($prefix,$striplibpath);
+ local($_) = $inst; # for backwards compatibility
+ $inst = $self->libscan($inst);
+ print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
+ return unless $inst;
+ $self->{PM}{$path} = $inst;
+ }, @{$self->{PMLIBDIRS}});
+ }
+}
+
+
+=item init_DIRFILESEP
+
+Using / for Unix. Called by init_main.
+
+=cut
+
+sub init_DIRFILESEP {
+ my($self) = shift;
+
+ $self->{DIRFILESEP} = '/';
+}
+
+
+=item init_main
+
+Initializes AR, AR_STATIC_ARGS, BASEEXT, CONFIG, DISTNAME, DLBASE,
+EXE_EXT, FULLEXT, FULLPERL, FULLPERLRUN, FULLPERLRUNINST, INST_*,
+INSTALL*, INSTALLDIRS, LIB_EXT, LIBPERL_A, MAP_TARGET, NAME,
+OBJ_EXT, PARENT_NAME, PERL, PERL_ARCHLIB, PERL_INC, PERL_LIB,
+PERL_SRC, PERLRUN, PERLRUNINST, PREFIX, VERSION,
+VERSION_SYM, XS_VERSION.
+
+=cut
+
+sub init_main {
+ my($self) = @_;
+
+ # --- Initialize Module Name and Paths
+
+ # NAME = Foo::Bar::Oracle
+ # FULLEXT = Foo/Bar/Oracle
+ # BASEEXT = Oracle
+ # PARENT_NAME = Foo::Bar
+### Only UNIX:
+### ($self->{FULLEXT} =
+### $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
+ $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
+
+
+ # Copied from DynaLoader:
+
+ my(@modparts) = split(/::/,$self->{NAME});
+ my($modfname) = $modparts[-1];
+
+ # Some systems have restrictions on files names for DLL's etc.
+ # mod2fname returns appropriate file base name (typically truncated)
+ # It may also edit @modparts if required.
+ if (defined &DynaLoader::mod2fname) {
+ $modfname = &DynaLoader::mod2fname(\@modparts);
+ }
+
+ ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ;
+ $self->{PARENT_NAME} ||= '';
+
+ if (defined &DynaLoader::mod2fname) {
+ # As of 5.001m, dl_os2 appends '_'
+ $self->{DLBASE} = $modfname;
+ } else {
+ $self->{DLBASE} = '$(BASEEXT)';
+ }
+
+
+ # --- Initialize PERL_LIB, PERL_SRC
+
+ # *Real* information: where did we get these two from? ...
+ my $inc_config_dir = dirname($INC{'Config.pm'});
+ my $inc_carp_dir = dirname($INC{'Carp.pm'});
+
+ unless ($self->{PERL_SRC}){
+ foreach my $dir_count (1..8) { # 8 is the VMS limit for nesting
+ my $dir = $self->catdir(($Updir) x $dir_count);
+
+ if (-f $self->catfile($dir,"config_h.SH") &&
+ -f $self->catfile($dir,"perl.h") &&
+ -f $self->catfile($dir,"lib","strict.pm")
+ ) {
+ $self->{PERL_SRC}=$dir ;
+ last;
+ }
+ }
+ }
+
+ warn "PERL_CORE is set but I can't find your PERL_SRC!\n" if
+ $self->{PERL_CORE} and !$self->{PERL_SRC};
+
+ if ($self->{PERL_SRC}){
+ $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib");
+
+ if (defined $Cross::platform) {
+ $self->{PERL_ARCHLIB} =
+ $self->catdir("$self->{PERL_SRC}","xlib",$Cross::platform);
+ $self->{PERL_INC} =
+ $self->catdir("$self->{PERL_SRC}","xlib",$Cross::platform,
+ $Is{Win32}?("CORE"):());
+ }
+ else {
+ $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
+ $self->{PERL_INC} = ($Is{Win32}) ?
+ $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
+ }
+
+ # catch a situation that has occurred a few times in the past:
+ unless (
+ -s $self->catfile($self->{PERL_SRC},'cflags')
+ or
+ $Is{VMS}
+ &&
+ -s $self->catfile($self->{PERL_SRC},'vmsish.h')
+ or
+ $Is{Win32}
+ ){
+ warn qq{
+You cannot build extensions below the perl source tree after executing
+a 'make clean' in the perl source tree.
+
+To rebuild extensions distributed with the perl source you should
+simply Configure (to include those extensions) and then build perl as
+normal. After installing perl the source tree can be deleted. It is
+not needed for building extensions by running 'perl Makefile.PL'
+usually without extra arguments.
+
+It is recommended that you unpack and build additional extensions away
+from the perl source tree.
+};
+ }
+ } else {
+ # we should also consider $ENV{PERL5LIB} here
+ my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC};
+ $self->{PERL_LIB} ||= $Config{privlibexp};
+ $self->{PERL_ARCHLIB} ||= $Config{archlibexp};
+ $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
+ my $perl_h;
+
+ if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
+ and not $old){
+ # Maybe somebody tries to build an extension with an
+ # uninstalled Perl outside of Perl build tree
+ my $lib;
+ for my $dir (@INC) {
+ $lib = $dir, last if -e $self->catfile($dir, "Config.pm");
+ }
+ if ($lib) {
+ # Win32 puts its header files in /perl/src/lib/CORE.
+ # Unix leaves them in /perl/src.
+ my $inc = $Is{Win32} ? $self->catdir($lib, "CORE" )
+ : dirname $lib;
+ if (-e $self->catfile($inc, "perl.h")) {
+ $self->{PERL_LIB} = $lib;
+ $self->{PERL_ARCHLIB} = $lib;
+ $self->{PERL_INC} = $inc;
+ $self->{UNINSTALLED_PERL} = 1;
+ print STDOUT <<EOP;
+... Detected uninstalled Perl. Trying to continue.
+EOP
+ }
+ }
+ }
+ }
+
+ # We get SITELIBEXP and SITEARCHEXP directly via
+ # Get_from_Config. When we are running standard modules, these
+ # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
+ # set it to "site". I prefer that INSTALLDIRS be set from outside
+ # MakeMaker.
+ $self->{INSTALLDIRS} ||= "site";
+
+ $self->{MAN1EXT} ||= $Config{man1ext};
+ $self->{MAN3EXT} ||= $Config{man3ext};
+
+ # Get some stuff out of %Config if we haven't yet done so
+ print STDOUT "CONFIG must be an array ref\n"
+ if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
+ $self->{CONFIG} = [] unless (ref $self->{CONFIG});
+ push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
+ push(@{$self->{CONFIG}}, 'shellflags') if $Config{shellflags};
+ my(%once_only);
+ foreach my $m (@{$self->{CONFIG}}){
+ next if $once_only{$m};
+ print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
+ unless exists $Config{$m};
+ $self->{uc $m} ||= $Config{$m};
+ $once_only{$m} = 1;
+ }
+
+# This is too dangerous:
+# if ($^O eq "next") {
+# $self->{AR} = "libtool";
+# $self->{AR_STATIC_ARGS} = "-o";
+# }
+# But I leave it as a placeholder
+
+ $self->{AR_STATIC_ARGS} ||= "cr";
+
+ # These should never be needed
+ $self->{OBJ_EXT} ||= '.o';
+ $self->{LIB_EXT} ||= '.a';
+
+ $self->{MAP_TARGET} ||= "perl";
+
+ $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
+
+ # make a simple check if we find strict
+ warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
+ (strict.pm not found)"
+ unless -f $self->catfile("$self->{PERL_LIB}","strict.pm") ||
+ $self->{NAME} eq "ExtUtils::MakeMaker";
+}
+
+=item init_others
+
+Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH, LD,
+OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, SHELL, NOOP,
+FIRST_MAKEFILE, MAKEFILE_OLD, NOECHO, RM_F, RM_RF, TEST_F,
+TOUCH, CP, MV, CHMOD, UMASK_NULL, ECHO, ECHO_N
+
+=cut
+
+sub init_others { # --- Initialize Other Attributes
+ my($self) = shift;
+
+ $self->{ECHO} ||= 'echo';
+ $self->{ECHO_N} ||= 'echo -n';
+ $self->{RM_F} ||= "rm -f";
+ $self->{RM_RF} ||= "rm -rf";
+ $self->{TOUCH} ||= "touch";
+ $self->{TEST_F} ||= "test -f";
+ $self->{CP} ||= "cp";
+ $self->{MV} ||= "mv";
+ $self->{CHMOD} ||= "chmod";
+ $self->{FALSE} ||= 'false';
+ $self->{TRUE} ||= 'true';
+
+ $self->{LD} ||= 'ld';
+
+ $self->SUPER::init_others(@_);
+
+ # After SUPER::init_others so $Config{shell} has a
+ # chance to get set.
+ $self->{SHELL} ||= '/bin/sh';
+
+ return 1;
+}
+
+
+=item init_linker
+
+Unix has no need of special linker flags.
+
+=cut
+
+sub init_linker {
+ my($self) = shift;
+ $self->{PERL_ARCHIVE} ||= '';
+ $self->{PERL_ARCHIVE_AFTER} ||= '';
+ $self->{EXPORT_LIST} ||= '';
+}
+
+
+=begin _protected
+
+=item init_lib2arch
+
+ $mm->init_lib2arch
+
+=end _protected
+
+=cut
+
+sub init_lib2arch {
+ my($self) = shift;
+
+ # The user who requests an installation directory explicitly
+ # should not have to tell us an architecture installation directory
+ # as well. We look if a directory exists that is named after the
+ # architecture. If not we take it as a sign that it should be the
+ # same as the requested installation directory. Otherwise we take
+ # the found one.
+ for my $libpair ({l=>"privlib", a=>"archlib"},
+ {l=>"sitelib", a=>"sitearch"},
+ {l=>"vendorlib", a=>"vendorarch"},
+ )
+ {
+ my $lib = "install$libpair->{l}";
+ my $Lib = uc $lib;
+ my $Arch = uc "install$libpair->{a}";
+ if( $self->{$Lib} && ! $self->{$Arch} ){
+ my($ilib) = $Config{$lib};
+
+ $self->prefixify($Arch,$ilib,$self->{$Lib});
+
+ unless (-d $self->{$Arch}) {
+ print STDOUT "Directory $self->{$Arch} not found\n"
+ if $Verbose;
+ $self->{$Arch} = $self->{$Lib};
+ }
+ print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
+ }
+ }
+}
+
+
+=item init_PERL
+
+ $mm->init_PERL;
+
+Called by init_main. Sets up ABSPERL, PERL, FULLPERL and all the
+*PERLRUN* permutations.
+
+ PERL is allowed to be miniperl
+ FULLPERL must be a complete perl
+
+ ABSPERL is PERL converted to an absolute path
+
+ *PERLRUN contains everything necessary to run perl, find it's
+ libraries, etc...
+
+ *PERLRUNINST is *PERLRUN + everything necessary to find the
+ modules being built.
+
+=cut
+
+sub init_PERL {
+ my($self) = shift;
+
+ my @defpath = ();
+ foreach my $component ($self->{PERL_SRC}, $self->path(),
+ $Config{binexp})
+ {
+ push @defpath, $component if defined $component;
+ }
+
+ # Build up a set of file names (not command names).
+ my $thisperl = $self->canonpath($^X);
+ $thisperl .= $Config{exe_ext} unless
+ # VMS might have a file version # at the end
+ $Is{VMS} ? $thisperl =~ m/$Config{exe_ext}(;\d+)?$/i
+ : $thisperl =~ m/$Config{exe_ext}$/i;
+
+ # We need a relative path to perl when in the core.
+ $thisperl = $self->abs2rel($thisperl) if $self->{PERL_CORE};
+
+ my @perls = ($thisperl);
+ push @perls, map { "$_$Config{exe_ext}" }
+ ('perl', 'perl5', "perl$Config{version}");
+
+ # miniperl has priority over all but the cannonical perl when in the
+ # core. Otherwise its a last resort.
+ my $miniperl = "miniperl$Config{exe_ext}";
+ if( $self->{PERL_CORE} ) {
+ splice @perls, 1, 0, $miniperl;
+ }
+ else {
+ push @perls, $miniperl;
+ }
+
+ $self->{PERL} ||=
+ $self->find_perl(5.0, \@perls, \@defpath, $Verbose );
+ # don't check if perl is executable, maybe they have decided to
+ # supply switches with perl
+
+ # When built for debugging, VMS doesn't create perl.exe but ndbgperl.exe.
+ my $perl_name = 'perl';
+ $perl_name = 'ndbgperl' if $Is{VMS} &&
+ defined $Config{usevmsdebug} && $Config{usevmsdebug} eq 'define';
+
+ # XXX This logic is flawed. If "miniperl" is anywhere in the path
+ # it will get confused. It should be fixed to work only on the filename.
+ # Define 'FULLPERL' to be a non-miniperl (used in test: target)
+ ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/$perl_name/i
+ unless $self->{FULLPERL};
+
+ # Little hack to get around VMS's find_perl putting "MCR" in front
+ # sometimes.
+ $self->{ABSPERL} = $self->{PERL};
+ my $has_mcr = $self->{ABSPERL} =~ s/^MCR\s*//;
+ if( $self->file_name_is_absolute($self->{ABSPERL}) ) {
+ $self->{ABSPERL} = '$(PERL)';
+ }
+ else {
+ $self->{ABSPERL} = $self->rel2abs($self->{ABSPERL});
+
+ # Quote the perl command if it contains whitespace
+ $self->{ABSPERL} = $self->quote_literal($self->{ABSPERL})
+ if $self->{ABSPERL} =~ /\s/;
+
+ $self->{ABSPERL} = 'MCR '.$self->{ABSPERL} if $has_mcr;
+ }
+
+ # Are we building the core?
+ $self->{PERL_CORE} = $ENV{PERL_CORE} unless exists $self->{PERL_CORE};
+ $self->{PERL_CORE} = 0 unless defined $self->{PERL_CORE};
+
+ # How do we run perl?
+ foreach my $perl (qw(PERL FULLPERL ABSPERL)) {
+ my $run = $perl.'RUN';
+
+ $self->{$run} = "\$($perl)";
+
+ # Make sure perl can find itself before it's installed.
+ $self->{$run} .= q{ "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)"}
+ if $self->{UNINSTALLED_PERL} || $self->{PERL_CORE};
+
+ $self->{$perl.'RUNINST'} =
+ sprintf q{$(%sRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"}, $perl;
+ }
+
+ return 1;
+}
+
+
+=item init_platform
+
+=item platform_constants
+
+Add MM_Unix_VERSION.
+
+=cut
+
+sub init_platform {
+ my($self) = shift;
+
+ $self->{MM_Unix_VERSION} = $VERSION;
+ $self->{PERL_MALLOC_DEF} = '-DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc '.
+ '-Dfree=Perl_mfree -Drealloc=Perl_realloc '.
+ '-Dcalloc=Perl_calloc';
+
+}
+
+sub platform_constants {
+ my($self) = shift;
+ my $make_frag = '';
+
+ foreach my $macro (qw(MM_Unix_VERSION PERL_MALLOC_DEF))
+ {
+ next unless defined $self->{$macro};
+ $make_frag .= "$macro = $self->{$macro}\n";
+ }
+
+ return $make_frag;
+}
+
+
+=item init_PERM
+
+ $mm->init_PERM
+
+Called by init_main. Initializes PERL_*
+
+=cut
+
+sub init_PERM {
+ my($self) = shift;
+
+ $self->{PERM_DIR} = 755 unless defined $self->{PERM_DIR};
+ $self->{PERM_RW} = 644 unless defined $self->{PERM_RW};
+ $self->{PERM_RWX} = 755 unless defined $self->{PERM_RWX};
+
+ return 1;
+}
+
+
+=item init_xs
+
+ $mm->init_xs
+
+Sets up macros having to do with XS code. Currently just INST_STATIC,
+INST_DYNAMIC and INST_BOOT.
+
+=cut
+
+sub init_xs {
+ my $self = shift;
+
+ if ($self->has_link_code()) {
+ $self->{INST_STATIC} =
+ $self->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT)$(LIB_EXT)');
+ $self->{INST_DYNAMIC} =
+ $self->catfile('$(INST_ARCHAUTODIR)', '$(DLBASE).$(DLEXT)');
+ $self->{INST_BOOT} =
+ $self->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT).bs');
+ } else {
+ $self->{INST_STATIC} = '';
+ $self->{INST_DYNAMIC} = '';
+ $self->{INST_BOOT} = '';
+ }
+}
+
+=item install (o)
+
+Defines the install target.
+
+=cut
+
+sub install {
+ my($self, %attribs) = @_;
+ my(@m);
+
+ push @m, q{
+install :: pure_install doc_install
+ $(NOECHO) $(NOOP)
+
+install_perl :: pure_perl_install doc_perl_install
+ $(NOECHO) $(NOOP)
+
+install_site :: pure_site_install doc_site_install
+ $(NOECHO) $(NOOP)
+
+install_vendor :: pure_vendor_install doc_vendor_install
+ $(NOECHO) $(NOOP)
+
+pure_install :: pure_$(INSTALLDIRS)_install
+ $(NOECHO) $(NOOP)
+
+doc_install :: doc_$(INSTALLDIRS)_install
+ $(NOECHO) $(NOOP)
+
+pure__install : pure_site_install
+ $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+
+doc__install : doc_site_install
+ $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+
+pure_perl_install :: all
+ $(NOECHO) $(MOD_INSTALL) \
+ read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
+ write }.$self->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
+ $(INST_LIB) $(DESTINSTALLPRIVLIB) \
+ $(INST_ARCHLIB) $(DESTINSTALLARCHLIB) \
+ $(INST_BIN) $(DESTINSTALLBIN) \
+ $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+ $(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) \
+ $(INST_MAN3DIR) $(DESTINSTALLMAN3DIR)
+ $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
+ }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
+
+
+pure_site_install :: all
+ $(NOECHO) $(MOD_INSTALL) \
+ read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
+ write }.$self->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
+ $(INST_LIB) $(DESTINSTALLSITELIB) \
+ $(INST_ARCHLIB) $(DESTINSTALLSITEARCH) \
+ $(INST_BIN) $(DESTINSTALLSITEBIN) \
+ $(INST_SCRIPT) $(DESTINSTALLSITESCRIPT) \
+ $(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) \
+ $(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR)
+ $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
+ }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
+
+pure_vendor_install :: all
+ $(NOECHO) $(MOD_INSTALL) \
+ read }.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
+ write }.$self->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').q{ \
+ $(INST_LIB) $(DESTINSTALLVENDORLIB) \
+ $(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) \
+ $(INST_BIN) $(DESTINSTALLVENDORBIN) \
+ $(INST_SCRIPT) $(DESTINSTALLVENDORSCRIPT) \
+ $(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) \
+ $(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR)
+
+doc_perl_install :: all
+ $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
+ -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+ -$(NOECHO) $(DOC_INSTALL) \
+ "Module" "$(NAME)" \
+ "installed into" "$(INSTALLPRIVLIB)" \
+ LINKTYPE "$(LINKTYPE)" \
+ VERSION "$(VERSION)" \
+ EXE_FILES "$(EXE_FILES)" \
+ >> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
+
+doc_site_install :: all
+ $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
+ -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+ -$(NOECHO) $(DOC_INSTALL) \
+ "Module" "$(NAME)" \
+ "installed into" "$(INSTALLSITELIB)" \
+ LINKTYPE "$(LINKTYPE)" \
+ VERSION "$(VERSION)" \
+ EXE_FILES "$(EXE_FILES)" \
+ >> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
+
+doc_vendor_install :: all
+ $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
+ -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+ -$(NOECHO) $(DOC_INSTALL) \
+ "Module" "$(NAME)" \
+ "installed into" "$(INSTALLVENDORLIB)" \
+ LINKTYPE "$(LINKTYPE)" \
+ VERSION "$(VERSION)" \
+ EXE_FILES "$(EXE_FILES)" \
+ >> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
+
+};
+
+ push @m, q{
+uninstall :: uninstall_from_$(INSTALLDIRS)dirs
+ $(NOECHO) $(NOOP)
+
+uninstall_from_perldirs ::
+ $(NOECHO) $(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
+
+uninstall_from_sitedirs ::
+ $(NOECHO) $(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
+
+uninstall_from_vendordirs ::
+ $(NOECHO) $(UNINSTALL) }.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{
+};
+
+ join("",@m);
+}
+
+=item installbin (o)
+
+Defines targets to make and to install EXE_FILES.
+
+=cut
+
+sub installbin {
+ my($self) = shift;
+
+ return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
+ my @exefiles = @{$self->{EXE_FILES}};
+ return "" unless @exefiles;
+
+ @exefiles = map vmsify($_), @exefiles if $Is{VMS};
+
+ my %fromto;
+ for my $from (@exefiles) {
+ my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
+
+ local($_) = $path; # for backwards compatibility
+ my $to = $self->libscan($path);
+ print "libscan($from) => '$to'\n" if ($Verbose >=2);
+
+ $to = vmsify($to) if $Is{VMS};
+ $fromto{$from} = $to;
+ }
+ my @to = values %fromto;
+
+ my @m;
+ push(@m, qq{
+EXE_FILES = @exefiles
+
+pure_all :: @to
+ \$(NOECHO) \$(NOOP)
+
+realclean ::
+});
+
+ # realclean can get rather large.
+ push @m, map "\t$_\n", $self->split_command('$(RM_F)', @to);
+ push @m, "\n";
+
+
+ # A target for each exe file.
+ while (my($from,$to) = each %fromto) {
+ last unless defined $from;
+
+ push @m, sprintf <<'MAKE', $to, $from, $to, $from, $to, $to, $to;
+%s : %s $(FIRST_MAKEFILE) $(INST_SCRIPT)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists
+ $(NOECHO) $(RM_F) %s
+ $(CP) %s %s
+ $(FIXIN) %s
+ -$(NOECHO) $(CHMOD) $(PERM_RWX) %s
+
+MAKE
+
+ }
+
+ join "", @m;
+}
+
+
+=item linkext (o)
+
+Defines the linkext target which in turn defines the LINKTYPE.
+
+=cut
+
+sub linkext {
+ my($self, %attribs) = @_;
+ # LINKTYPE => static or dynamic or ''
+ my($linktype) = defined $attribs{LINKTYPE} ?
+ $attribs{LINKTYPE} : '$(LINKTYPE)';
+ "
+linkext :: $linktype
+ \$(NOECHO) \$(NOOP)
+";
+}
+
+=item lsdir
+
+Takes as arguments a directory name and a regular expression. Returns
+all entries in the directory that match the regular expression.
+
+=cut
+
+sub lsdir {
+ my($self) = shift;
+ my($dir, $regex) = @_;
+ my(@ls);
+ my $dh = new DirHandle;
+ $dh->open($dir || ".") or return ();
+ @ls = $dh->read;
+ $dh->close;
+ @ls = grep(/$regex/, @ls) if $regex;
+ @ls;
+}
+
+=item macro (o)
+
+Simple subroutine to insert the macros defined by the macro attribute
+into the Makefile.
+
+=cut
+
+sub macro {
+ my($self,%attribs) = @_;
+ my(@m,$key,$val);
+ while (($key,$val) = each %attribs){
+ last unless defined $key;
+ push @m, "$key = $val\n";
+ }
+ join "", @m;
+}
+
+=item makeaperl (o)
+
+Called by staticmake. Defines how to write the Makefile to produce a
+static new perl.
+
+By default the Makefile produced includes all the static extensions in
+the perl library. (Purified versions of library files, e.g.,
+DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
+
+=cut
+
+sub makeaperl {
+ my($self, %attribs) = @_;
+ my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
+ @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
+ my(@m);
+ push @m, "
+# --- MakeMaker makeaperl section ---
+MAP_TARGET = $target
+FULLPERL = $self->{FULLPERL}
+";
+ return join '', @m if $self->{PARENT};
+
+ my($dir) = join ":", @{$self->{DIR}};
+
+ unless ($self->{MAKEAPERL}) {
+ push @m, q{
+$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
+ $(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@
+
+$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) pm_to_blib
+ $(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
+ $(NOECHO) $(PERLRUNINST) \
+ Makefile.PL DIR=}, $dir, q{ \
+ MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
+ MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
+
+ foreach (@ARGV){
+ if( /\s/ ){
+ s/=(.*)/='$1'/;
+ }
+ push @m, " \\\n\t\t$_";
+ }
+# push @m, map( " \\\n\t\t$_", @ARGV );
+ push @m, "\n";
+
+ return join '', @m;
+ }
+
+
+
+ my($cccmd, $linkcmd, $lperl);
+
+
+ $cccmd = $self->const_cccmd($libperl);
+ $cccmd =~ s/^CCCMD\s*=\s*//;
+ $cccmd =~ s/\$\(INC\)/ "-I$self->{PERL_INC}" /;
+ $cccmd .= " $Config{cccdlflags}"
+ if ($Config{useshrplib} eq 'true');
+ $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
+
+ # The front matter of the linkcommand...
+ $linkcmd = join ' ', "\$(CC)",
+ grep($_, @Config{qw(ldflags ccdlflags)});
+ $linkcmd =~ s/\s+/ /g;
+ $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
+
+ # Which *.a files could we make use of...
+ my %static;
+ require File::Find;
+ File::Find::find(sub {
+ return unless m/\Q$self->{LIB_EXT}\E$/;
+
+ # Skip perl's libraries.
+ return if m/^libperl/ or m/^perl\Q$self->{LIB_EXT}\E$/;
+
+ # Skip purified versions of libraries
+ # (e.g., DynaLoader_pure_p1_c0_032.a)
+ return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
+
+ if( exists $self->{INCLUDE_EXT} ){
+ my $found = 0;
+
+ (my $xx = $File::Find::name) =~ s,.*?/auto/,,s;
+ $xx =~ s,/?$_,,;
+ $xx =~ s,/,::,g;
+
+ # Throw away anything not explicitly marked for inclusion.
+ # DynaLoader is implied.
+ foreach my $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
+ if( $xx eq $incl ){
+ $found++;
+ last;
+ }
+ }
+ return unless $found;
+ }
+ elsif( exists $self->{EXCLUDE_EXT} ){
+ (my $xx = $File::Find::name) =~ s,.*?/auto/,,s;
+ $xx =~ s,/?$_,,;
+ $xx =~ s,/,::,g;
+
+ # Throw away anything explicitly marked for exclusion
+ foreach my $excl (@{$self->{EXCLUDE_EXT}}){
+ return if( $xx eq $excl );
+ }
+ }
+
+ # don't include the installed version of this extension. I
+ # leave this line here, although it is not necessary anymore:
+ # I patched minimod.PL instead, so that Miniperl.pm won't
+ # enclude duplicates
+
+ # Once the patch to minimod.PL is in the distribution, I can
+ # drop it
+ return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}\z:;
+ use Cwd 'cwd';
+ $static{cwd() . "/" . $_}++;
+ }, grep( -d $_, @{$searchdirs || []}) );
+
+ # We trust that what has been handed in as argument, will be buildable
+ $static = [] unless $static;
+ @static{@{$static}} = (1) x @{$static};
+
+ $extra = [] unless $extra && ref $extra eq 'ARRAY';
+ for (sort keys %static) {
+ next unless /\Q$self->{LIB_EXT}\E\z/;
+ $_ = dirname($_) . "/extralibs.ld";
+ push @$extra, $_;
+ }
+
+ s/^(.*)/"-I$1"/ for @{$perlinc || []};
+
+ $target ||= "perl";
+ $tmp ||= ".";
+
+# MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
+# regenerate the Makefiles, MAP_STATIC and the dependencies for
+# extralibs.all are computed correctly
+ push @m, "
+MAP_LINKCMD = $linkcmd
+MAP_PERLINC = @{$perlinc || []}
+MAP_STATIC = ",
+join(" \\\n\t", reverse sort keys %static), "
+
+MAP_PRELIBS = $Config{perllibs} $Config{cryptlib}
+";
+
+ if (defined $libperl) {
+ ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
+ }
+ unless ($libperl && -f $lperl) { # Ilya's code...
+ my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
+ $dir = "$self->{PERL_ARCHLIB}/.." if $self->{UNINSTALLED_PERL};
+ $libperl ||= "libperl$self->{LIB_EXT}";
+ $libperl = "$dir/$libperl";
+ $lperl ||= "libperl$self->{LIB_EXT}";
+ $lperl = "$dir/$lperl";
+
+ if (! -f $libperl and ! -f $lperl) {
+ # We did not find a static libperl. Maybe there is a shared one?
+ if ($Is{SunOS}) {
+ $lperl = $libperl = "$dir/$Config{libperl}";
+ # SUNOS ld does not take the full path to a shared library
+ $libperl = '' if $Is{SunOS4};
+ }
+ }
+
+ print STDOUT "Warning: $libperl not found
+ If you're going to build a static perl binary, make sure perl is installed
+ otherwise ignore this warning\n"
+ unless (-f $lperl || defined($self->{PERL_SRC}));
+ }
+
+ # SUNOS ld does not take the full path to a shared library
+ my $llibperl = $libperl ? '$(MAP_LIBPERL)' : '-lperl';
+
+ push @m, "
+MAP_LIBPERL = $libperl
+LLIBPERL = $llibperl
+";
+
+ push @m, '
+$(INST_ARCHAUTODIR)/extralibs.all : $(INST_ARCHAUTODIR)$(DFSEP).exists '.join(" \\\n\t", @$extra).'
+ $(NOECHO) $(RM_F) $@
+ $(NOECHO) $(TOUCH) $@
+';
+
+ foreach my $catfile (@$extra){
+ push @m, "\tcat $catfile >> \$\@\n";
+ }
+
+push @m, "
+\$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
+ \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(LDFROM) \$(MAP_STATIC) \$(LLIBPERL) `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
+ \$(NOECHO) \$(ECHO) 'To install the new \"\$(MAP_TARGET)\" binary, call'
+ \$(NOECHO) \$(ECHO) ' \$(MAKE) \$(USEMAKEFILE) $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
+ \$(NOECHO) \$(ECHO) 'To remove the intermediate files say'
+ \$(NOECHO) \$(ECHO) ' \$(MAKE) \$(USEMAKEFILE) $makefilename map_clean'
+
+$tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
+";
+ push @m, "\t".$self->cd($tmp, qq[$cccmd "-I\$(PERL_INC)" perlmain.c])."\n";
+
+ push @m, qq{
+$tmp/perlmain.c: $makefilename}, q{
+ $(NOECHO) $(ECHO) Writing $@
+ $(NOECHO) $(PERL) $(MAP_PERLINC) "-MExtUtils::Miniperl" \\
+ -e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
+
+};
+ push @m, "\t", q{$(NOECHO) $(PERL) $(INSTALLSCRIPT)/fixpmain
+} if (defined (&Dos::UseLFN) && Dos::UseLFN()==0);
+
+
+ push @m, q{
+doc_inst_perl :
+ $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
+ -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+ -$(NOECHO) $(DOC_INSTALL) \
+ "Perl binary" "$(MAP_TARGET)" \
+ MAP_STATIC "$(MAP_STATIC)" \
+ MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
+ MAP_LIBPERL "$(MAP_LIBPERL)" \
+ >> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
+
+};
+
+ push @m, q{
+inst_perl : pure_inst_perl doc_inst_perl
+
+pure_inst_perl : $(MAP_TARGET)
+ }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(DESTINSTALLBIN)','$(MAP_TARGET)').q{
+
+clean :: map_clean
+
+map_clean :
+ }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
+};
+
+ join '', @m;
+}
+
+=item makefile (o)
+
+Defines how to rewrite the Makefile.
+
+=cut
+
+sub makefile {
+ my($self) = shift;
+ my $m;
+ # We do not know what target was originally specified so we
+ # must force a manual rerun to be sure. But as it should only
+ # happen very rarely it is not a significant problem.
+ $m = '
+$(OBJECT) : $(FIRST_MAKEFILE)
+
+' if $self->{OBJECT};
+
+ my $newer_than_target = $Is{VMS} ? '$(MMS$SOURCE_LIST)' : '$?';
+ my $mpl_args = join " ", map qq["$_"], @ARGV;
+
+ $m .= sprintf <<'MAKE_FRAG', $newer_than_target, $mpl_args;
+# We take a very conservative approach here, but it's worth it.
+# We move Makefile to Makefile.old here to avoid gnu make looping.
+$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
+ $(NOECHO) $(ECHO) "Makefile out-of-date with respect to %s"
+ $(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
+ -$(NOECHO) $(RM_F) $(MAKEFILE_OLD)
+ -$(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
+ - $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL)
+ $(PERLRUN) Makefile.PL %s
+ $(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <=="
+ $(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command. <=="
+ $(FALSE)
+
+MAKE_FRAG
+
+ return $m;
+}
+
+
+=item maybe_command
+
+Returns true, if the argument is likely to be a command.
+
+=cut
+
+sub maybe_command {
+ my($self,$file) = @_;
+ return $file if -x $file && ! -d $file;
+ return;
+}
+
+
+=item needs_linking (o)
+
+Does this module need linking? Looks into subdirectory objects (see
+also has_link_code())
+
+=cut
+
+sub needs_linking {
+ my($self) = shift;
+
+ my $caller = (caller(0))[3];
+ confess("needs_linking called too early") if
+ $caller =~ /^ExtUtils::MakeMaker::/;
+ return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
+ if ($self->has_link_code or $self->{MAKEAPERL}){
+ $self->{NEEDS_LINKING} = 1;
+ return 1;
+ }
+ foreach my $child (keys %{$self->{CHILDREN}}) {
+ if ($self->{CHILDREN}->{$child}->needs_linking) {
+ $self->{NEEDS_LINKING} = 1;
+ return 1;
+ }
+ }
+ return $self->{NEEDS_LINKING} = 0;
+}
+
+
+=item parse_abstract
+
+parse a file and return what you think is the ABSTRACT
+
+=cut
+
+sub parse_abstract {
+ my($self,$parsefile) = @_;
+ my $result;
+
+ local $/ = "\n";
+ open(my $fh, '<', $parsefile) or die "Could not open '$parsefile': $!";
+ my $inpod = 0;
+ my $package = $self->{DISTNAME};
+ $package =~ s/-/::/g;
+ while (<$fh>) {
+ $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
+ next if !$inpod;
+ chop;
+ next unless /^($package\s-\s)(.*)/;
+ $result = $2;
+ last;
+ }
+ close $fh;
+
+ return $result;
+}
+
+=item parse_version
+
+ my $version = MM->parse_version($file);
+
+Parse a $file and return what $VERSION is set to by the first assignment.
+It will return the string "undef" if it can't figure out what $VERSION
+is. $VERSION should be for all to see, so C<our $VERSION> or plain $VERSION
+are okay, but C<my $VERSION> is not.
+
+C<<package Foo VERSION>> is also checked for. The first version
+declaration found is used, but this may change as it differs from how
+Perl does it.
+
+parse_version() will try to C<use version> before checking for
+C<$VERSION> so the following will work.
+
+ $VERSION = qv(1.2.3);
+
+=cut
+
+sub parse_version {
+ my($self,$parsefile) = @_;
+ my $result;
+
+ local $/ = "\n";
+ local $_;
+ open(my $fh, '<', $parsefile) or die "Could not open '$parsefile': $!";
+ my $inpod = 0;
+ while (<$fh>) {
+ $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
+ next if $inpod || /^\s*#/;
+ chop;
+ next if /^\s*(if|unless)/;
+ if ( m{^ \s* package \s+ \w[\w\:\']* \s+ (v?[0-9._]+) \s* ; }x ) {
+ local $^W = 0;
+ $result = $1;
+ }
+ elsif ( m{(?<!\\) ([\$*]) (([\w\:\']*) \bVERSION)\b .* =}x ) {
+ my $eval = qq{
+ package ExtUtils::MakeMaker::_version;
+ no strict;
+ BEGIN { eval {
+ # Ensure any version() routine which might have leaked
+ # into this package has been deleted. Interferes with
+ # version->import()
+ undef *version;
+ require version;
+ "version"->import;
+ } }
+
+ local $1$2;
+ \$$2=undef;
+ do {
+ $_
+ };
+ \$$2;
+ };
+ local $^W = 0;
+ $result = eval($eval); ## no critic
+ warn "Could not eval '$eval' in $parsefile: $@" if $@;
+ }
+ else {
+ next;
+ }
+ last if defined $result;
+ }
+ close $fh;
+
+ $result = "undef" unless defined $result;
+ return $result;
+}
+
+
+=item pasthru (o)
+
+Defines the string that is passed to recursive make calls in
+subdirectories.
+
+=cut
+
+sub pasthru {
+ my($self) = shift;
+ my(@m);
+
+ my(@pasthru);
+ my($sep) = $Is{VMS} ? ',' : '';
+ $sep .= "\\\n\t";
+
+ foreach my $key (qw(LIB LIBPERL_A LINKTYPE OPTIMIZE
+ PREFIX INSTALL_BASE)
+ )
+ {
+ next unless defined $self->{$key};
+ push @pasthru, "$key=\"\$($key)\"";
+ }
+
+ foreach my $key (qw(DEFINE INC)) {
+ next unless defined $self->{$key};
+ push @pasthru, "PASTHRU_$key=\"\$(PASTHRU_$key)\"";
+ }
+
+ push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
+ join "", @m;
+}
+
+=item perl_script
+
+Takes one argument, a file name, and returns the file name, if the
+argument is likely to be a perl script. On MM_Unix this is true for
+any ordinary, readable file.
+
+=cut
+
+sub perl_script {
+ my($self,$file) = @_;
+ return $file if -r $file && -f _;
+ return;
+}
+
+=item perldepend (o)
+
+Defines the dependency from all *.h files that come with the perl
+distribution.
+
+=cut
+
+sub perldepend {
+ my($self) = shift;
+ my(@m);
+
+ my $make_config = $self->cd('$(PERL_SRC)', '$(MAKE) lib/Config.pm');
+
+ push @m, sprintf <<'MAKE_FRAG', $make_config if $self->{PERL_SRC};
+# Check for unpropogated config.sh changes. Should never happen.
+# We do NOT just update config.h because that is not sufficient.
+# An out of date config.h is not fatal but complains loudly!
+$(PERL_INC)/config.h: $(PERL_SRC)/config.sh
+ -$(NOECHO) $(ECHO) "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; $(FALSE)
+
+$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
+ $(NOECHO) $(ECHO) "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
+ %s
+MAKE_FRAG
+
+ return join "", @m unless $self->needs_linking;
+
+ push @m, q{
+PERL_HDRS = \
+ $(PERL_INC)/EXTERN.h \
+ $(PERL_INC)/INTERN.h \
+ $(PERL_INC)/XSUB.h \
+ $(PERL_INC)/av.h \
+ $(PERL_INC)/cc_runtime.h \
+ $(PERL_INC)/config.h \
+ $(PERL_INC)/cop.h \
+ $(PERL_INC)/cv.h \
+ $(PERL_INC)/dosish.h \
+ $(PERL_INC)/embed.h \
+ $(PERL_INC)/embedvar.h \
+ $(PERL_INC)/fakethr.h \
+ $(PERL_INC)/form.h \
+ $(PERL_INC)/gv.h \
+ $(PERL_INC)/handy.h \
+ $(PERL_INC)/hv.h \
+ $(PERL_INC)/intrpvar.h \
+ $(PERL_INC)/iperlsys.h \
+ $(PERL_INC)/keywords.h \
+ $(PERL_INC)/mg.h \
+ $(PERL_INC)/nostdio.h \
+ $(PERL_INC)/op.h \
+ $(PERL_INC)/opcode.h \
+ $(PERL_INC)/patchlevel.h \
+ $(PERL_INC)/perl.h \
+ $(PERL_INC)/perlio.h \
+ $(PERL_INC)/perlsdio.h \
+ $(PERL_INC)/perlsfio.h \
+ $(PERL_INC)/perlvars.h \
+ $(PERL_INC)/perly.h \
+ $(PERL_INC)/pp.h \
+ $(PERL_INC)/pp_proto.h \
+ $(PERL_INC)/proto.h \
+ $(PERL_INC)/regcomp.h \
+ $(PERL_INC)/regexp.h \
+ $(PERL_INC)/regnodes.h \
+ $(PERL_INC)/scope.h \
+ $(PERL_INC)/sv.h \
+ $(PERL_INC)/thread.h \
+ $(PERL_INC)/unixish.h \
+ $(PERL_INC)/util.h
+
+$(OBJECT) : $(PERL_HDRS)
+} if $self->{OBJECT};
+
+ push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n" if %{$self->{XS}};
+
+ join "\n", @m;
+}
+
+
+=item pm_to_blib
+
+Defines target that copies all files in the hash PM to their
+destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
+
+=cut
+
+sub pm_to_blib {
+ my $self = shift;
+ my($autodir) = $self->catdir('$(INST_LIB)','auto');
+ my $r = q{
+pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM)
+};
+
+ # VMS will swallow '' and PM_FILTER is often empty. So use q[]
+ my $pm_to_blib = $self->oneliner(<<CODE, ['-MExtUtils::Install']);
+pm_to_blib({\@ARGV}, '$autodir', q[\$(PM_FILTER)], '\$(PERM_DIR)')
+CODE
+
+ my @cmds = $self->split_command($pm_to_blib, %{$self->{PM}});
+
+ $r .= join '', map { "\t\$(NOECHO) $_\n" } @cmds;
+ $r .= qq{\t\$(NOECHO) \$(TOUCH) pm_to_blib\n};
+
+ return $r;
+}
+
+=item post_constants (o)
+
+Returns an empty string per default. Dedicated to overrides from
+within Makefile.PL after all constants have been defined.
+
+=cut
+
+sub post_constants{
+ "";
+}
+
+=item post_initialize (o)
+
+Returns an empty string per default. Used in Makefile.PLs to add some
+chunk of text to the Makefile after the object is initialized.
+
+=cut
+
+sub post_initialize {
+ "";
+}
+
+=item postamble (o)
+
+Returns an empty string. Can be used in Makefile.PLs to write some
+text to the Makefile at the end.
+
+=cut
+
+sub postamble {
+ "";
+}
+
+# transform dot-separated version string into comma-separated quadruple
+# examples: '1.2.3.4.5' => '1,2,3,4'
+# '1.2.3' => '1,2,3,0'
+sub _ppd_version {
+ my ($self, $string) = @_;
+ return join ',', ((split /\./, $string), (0) x 4)[0..3];
+}
+
+=item ppd
+
+Defines target that creates a PPD (Perl Package Description) file
+for a binary distribution.
+
+=cut
+
+sub ppd {
+ my($self) = @_;
+
+ my $abstract = $self->{ABSTRACT} || '';
+ $abstract =~ s/\n/\\n/sg;
+ $abstract =~ s/</&lt;/g;
+ $abstract =~ s/>/&gt;/g;
+
+ my $author = $self->{AUTHOR} || '';
+ $author =~ s/</&lt;/g;
+ $author =~ s/>/&gt;/g;
+
+ my $ppd_xml = sprintf <<'PPD_HTML', $self->{VERSION}, $abstract, $author;
+<SOFTPKG NAME="$(DISTNAME)" VERSION="%s">
+ <ABSTRACT>%s</ABSTRACT>
+ <AUTHOR>%s</AUTHOR>
+PPD_HTML
+
+ $ppd_xml .= " <IMPLEMENTATION>\n";
+ if ( $self->{MIN_PERL_VERSION} ) {
+ my $min_perl_version = $self->_ppd_version($self->{MIN_PERL_VERSION});
+ $ppd_xml .= sprintf <<'PPD_PERLVERS', $min_perl_version;
+ <PERLCORE VERSION="%s" />
+PPD_PERLVERS
+
+ }
+
+ # Don't add "perl" to requires. perl dependencies are
+ # handles by ARCHITECTURE.
+ my %prereqs = %{$self->{PREREQ_PM}};
+ delete $prereqs{perl};
+
+ # Build up REQUIRE
+ foreach my $prereq (sort keys %prereqs) {
+ my $name = $prereq;
+ $name .= '::' unless $name =~ /::/;
+ my $version = $prereqs{$prereq}+0; # force numification
+
+ my %attrs = ( NAME => $name );
+ $attrs{VERSION} = $version if $version;
+ my $attrs = join " ", map { qq[$_="$attrs{$_}"] } keys %attrs;
+ $ppd_xml .= qq( <REQUIRE $attrs />\n);
+ }
+
+ my $archname = $Config{archname};
+ if ($] >= 5.008) {
+ # archname did not change from 5.6 to 5.8, but those versions may
+ # not be not binary compatible so now we append the part of the
+ # version that changes when binary compatibility may change
+ $archname .= "-$Config{PERL_REVISION}.$Config{PERL_VERSION}";
+ }
+ $ppd_xml .= sprintf <<'PPD_OUT', $archname;
+ <ARCHITECTURE NAME="%s" />
+PPD_OUT
+
+ if ($self->{PPM_INSTALL_SCRIPT}) {
+ if ($self->{PPM_INSTALL_EXEC}) {
+ $ppd_xml .= sprintf qq{ <INSTALL EXEC="%s">%s</INSTALL>\n},
+ $self->{PPM_INSTALL_EXEC}, $self->{PPM_INSTALL_SCRIPT};
+ }
+ else {
+ $ppd_xml .= sprintf qq{ <INSTALL>%s</INSTALL>\n},
+ $self->{PPM_INSTALL_SCRIPT};
+ }
+ }
+
+ my ($bin_location) = $self->{BINARY_LOCATION} || '';
+ $bin_location =~ s/\\/\\\\/g;
+
+ $ppd_xml .= sprintf <<'PPD_XML', $bin_location;
+ <CODEBASE HREF="%s" />
+ </IMPLEMENTATION>
+</SOFTPKG>
+PPD_XML
+
+ my @ppd_cmds = $self->echo($ppd_xml, '$(DISTNAME).ppd');
+
+ return sprintf <<'PPD_OUT', join "\n\t", @ppd_cmds;
+# Creates a PPD (Perl Package Description) for a binary distribution.
+ppd :
+ %s
+PPD_OUT
+
+}
+
+=item prefixify
+
+ $MM->prefixify($var, $prefix, $new_prefix, $default);
+
+Using either $MM->{uc $var} || $Config{lc $var}, it will attempt to
+replace it's $prefix with a $new_prefix.
+
+Should the $prefix fail to match I<AND> a PREFIX was given as an
+argument to WriteMakefile() it will set it to the $new_prefix +
+$default. This is for systems whose file layouts don't neatly fit into
+our ideas of prefixes.
+
+This is for heuristics which attempt to create directory structures
+that mirror those of the installed perl.
+
+For example:
+
+ $MM->prefixify('installman1dir', '/usr', '/home/foo', 'man/man1');
+
+this will attempt to remove '/usr' from the front of the
+$MM->{INSTALLMAN1DIR} path (initializing it to $Config{installman1dir}
+if necessary) and replace it with '/home/foo'. If this fails it will
+simply use '/home/foo/man/man1'.
+
+=cut
+
+sub prefixify {
+ my($self,$var,$sprefix,$rprefix,$default) = @_;
+
+ my $path = $self->{uc $var} ||
+ $Config_Override{lc $var} || $Config{lc $var} || '';
+
+ $rprefix .= '/' if $sprefix =~ m|/$|;
+
+ print STDERR " prefixify $var => $path\n" if $Verbose >= 2;
+ print STDERR " from $sprefix to $rprefix\n" if $Verbose >= 2;
+
+ if( $self->{ARGS}{PREFIX} &&
+ $path !~ s{^\Q$sprefix\E\b}{$rprefix}s )
+ {
+
+ print STDERR " cannot prefix, using default.\n" if $Verbose >= 2;
+ print STDERR " no default!\n" if !$default && $Verbose >= 2;
+
+ $path = $self->catdir($rprefix, $default) if $default;
+ }
+
+ print " now $path\n" if $Verbose >= 2;
+ return $self->{uc $var} = $path;
+}
+
+
+=item processPL (o)
+
+Defines targets to run *.PL files.
+
+=cut
+
+sub processPL {
+ my $self = shift;
+ my $pl_files = $self->{PL_FILES};
+
+ return "" unless $pl_files;
+
+ my $m = '';
+ foreach my $plfile (sort keys %$pl_files) {
+ my $list = ref($pl_files->{$plfile})
+ ? $pl_files->{$plfile}
+ : [$pl_files->{$plfile}];
+
+ foreach my $target (@$list) {
+ if( $Is{VMS} ) {
+ $plfile = vmsify($self->eliminate_macros($plfile));
+ $target = vmsify($self->eliminate_macros($target));
+ }
+
+ # Normally a .PL file runs AFTER pm_to_blib so it can have
+ # blib in its @INC and load the just built modules. BUT if
+ # the generated module is something in $(TO_INST_PM) which
+ # pm_to_blib depends on then it can't depend on pm_to_blib
+ # else we have a dependency loop.
+ my $pm_dep;
+ my $perlrun;
+ if( defined $self->{PM}{$target} ) {
+ $pm_dep = '';
+ $perlrun = 'PERLRUN';
+ }
+ else {
+ $pm_dep = 'pm_to_blib';
+ $perlrun = 'PERLRUNINST';
+ }
+
+ $m .= <<MAKE_FRAG;
+
+all :: $target
+ \$(NOECHO) \$(NOOP)
+
+$target :: $plfile $pm_dep
+ \$($perlrun) $plfile $target
+MAKE_FRAG
+
+ }
+ }
+
+ return $m;
+}
+
+=item quote_paren
+
+Backslashes parentheses C<()> in command line arguments.
+Doesn't handle recursive Makefile C<$(...)> constructs,
+but handles simple ones.
+
+=cut
+
+sub quote_paren {
+ my $arg = shift;
+ $arg =~ s{\$\((.+?)\)}{\$\\\\($1\\\\)}g; # protect $(...)
+ $arg =~ s{(?<!\\)([()])}{\\$1}g; # quote unprotected
+ $arg =~ s{\$\\\\\((.+?)\\\\\)}{\$($1)}g; # unprotect $(...)
+ return $arg;
+}
+
+=item replace_manpage_separator
+
+ my $man_name = $MM->replace_manpage_separator($file_path);
+
+Takes the name of a package, which may be a nested package, in the
+form 'Foo/Bar.pm' and replaces the slash with C<::> or something else
+safe for a man page file name. Returns the replacement.
+
+=cut
+
+sub replace_manpage_separator {
+ my($self,$man) = @_;
+
+ $man =~ s,/+,::,g;
+ return $man;
+}
+
+
+=item cd
+
+=cut
+
+sub cd {
+ my($self, $dir, @cmds) = @_;
+
+ # No leading tab and no trailing newline makes for easier embedding
+ my $make_frag = join "\n\t", map { "cd $dir && $_" } @cmds;
+
+ return $make_frag;
+}
+
+=item oneliner
+
+=cut
+
+sub oneliner {
+ my($self, $cmd, $switches) = @_;
+ $switches = [] unless defined $switches;
+
+ # Strip leading and trailing newlines
+ $cmd =~ s{^\n+}{};
+ $cmd =~ s{\n+$}{};
+
+ my @cmds = split /\n/, $cmd;
+ $cmd = join " \n\t -e ", map $self->quote_literal($_), @cmds;
+ $cmd = $self->escape_newlines($cmd);
+
+ $switches = join ' ', @$switches;
+
+ return qq{\$(ABSPERLRUN) $switches -e $cmd --};
+}
+
+
+=item quote_literal
+
+=cut
+
+sub quote_literal {
+ my($self, $text) = @_;
+
+ # I think all we have to quote is single quotes and I think
+ # this is a safe way to do it.
+ $text =~ s{'}{'\\''}g;
+
+ return "'$text'";
+}
+
+
+=item escape_newlines
+
+=cut
+
+sub escape_newlines {
+ my($self, $text) = @_;
+
+ $text =~ s{\n}{\\\n}g;
+
+ return $text;
+}
+
+
+=item max_exec_len
+
+Using POSIX::ARG_MAX. Otherwise falling back to 4096.
+
+=cut
+
+sub max_exec_len {
+ my $self = shift;
+
+ if (!defined $self->{_MAX_EXEC_LEN}) {
+ if (my $arg_max = eval { require POSIX; &POSIX::ARG_MAX }) {
+ $self->{_MAX_EXEC_LEN} = $arg_max;
+ }
+ else { # POSIX minimum exec size
+ $self->{_MAX_EXEC_LEN} = 4096;
+ }
+ }
+
+ return $self->{_MAX_EXEC_LEN};
+}
+
+
+=item static (o)
+
+Defines the static target.
+
+=cut
+
+sub static {
+# --- Static Loading Sections ---
+
+ my($self) = shift;
+ '
+## $(INST_PM) has been moved to the all: target.
+## It remains here for awhile to allow for old usage: "make static"
+static :: $(FIRST_MAKEFILE) $(INST_STATIC)
+ $(NOECHO) $(NOOP)
+';
+}
+
+=item static_lib (o)
+
+Defines how to produce the *.a (or equivalent) files.
+
+=cut
+
+sub static_lib {
+ my($self) = @_;
+ return '' unless $self->has_link_code;
+
+ my(@m);
+ push(@m, <<'END');
+
+$(INST_STATIC) : $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists
+ $(RM_RF) $@
+END
+
+ # If this extension has its own library (eg SDBM_File)
+ # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
+ push(@m, <<'MAKE_FRAG') if $self->{MYEXTLIB};
+ $(CP) $(MYEXTLIB) $@
+MAKE_FRAG
+
+ my $ar;
+ if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) {
+ # Prefer the absolute pathed ar if available so that PATH
+ # doesn't confuse us. Perl itself is built with the full_ar.
+ $ar = 'FULL_AR';
+ } else {
+ $ar = 'AR';
+ }
+ push @m, sprintf <<'MAKE_FRAG', $ar;
+ $(%s) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
+ $(CHMOD) $(PERM_RWX) $@
+ $(NOECHO) $(ECHO) "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
+MAKE_FRAG
+
+ # Old mechanism - still available:
+ push @m, <<'MAKE_FRAG' if $self->{PERL_SRC} && $self->{EXTRALIBS};
+ $(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
+MAKE_FRAG
+
+ join('', @m);
+}
+
+=item staticmake (o)
+
+Calls makeaperl.
+
+=cut
+
+sub staticmake {
+ my($self, %attribs) = @_;
+ my(@static);
+
+ my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP}, $self->{INST_ARCHLIB});
+
+ # And as it's not yet built, we add the current extension
+ # but only if it has some C code (or XS code, which implies C code)
+ if (@{$self->{C}}) {
+ @static = $self->catfile($self->{INST_ARCHLIB},
+ "auto",
+ $self->{FULLEXT},
+ "$self->{BASEEXT}$self->{LIB_EXT}"
+ );
+ }
+
+ # Either we determine now, which libraries we will produce in the
+ # subdirectories or we do it at runtime of the make.
+
+ # We could ask all subdir objects, but I cannot imagine, why it
+ # would be necessary.
+
+ # Instead we determine all libraries for the new perl at
+ # runtime.
+ my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB});
+
+ $self->makeaperl(MAKE => $self->{MAKEFILE},
+ DIRS => \@searchdirs,
+ STAT => \@static,
+ INCL => \@perlinc,
+ TARGET => $self->{MAP_TARGET},
+ TMP => "",
+ LIBPERL => $self->{LIBPERL_A}
+ );
+}
+
+=item subdir_x (o)
+
+Helper subroutine for subdirs
+
+=cut
+
+sub subdir_x {
+ my($self, $subdir) = @_;
+
+ my $subdir_cmd = $self->cd($subdir,
+ '$(MAKE) $(USEMAKEFILE) $(FIRST_MAKEFILE) all $(PASTHRU)'
+ );
+ return sprintf <<'EOT', $subdir_cmd;
+
+subdirs ::
+ $(NOECHO) %s
+EOT
+
+}
+
+=item subdirs (o)
+
+Defines targets to process subdirectories.
+
+=cut
+
+sub subdirs {
+# --- Sub-directory Sections ---
+ my($self) = shift;
+ my(@m);
+ # This method provides a mechanism to automatically deal with
+ # subdirectories containing further Makefile.PL scripts.
+ # It calls the subdir_x() method for each subdirectory.
+ foreach my $dir (@{$self->{DIR}}){
+ push(@m, $self->subdir_x($dir));
+#### print "Including $dir subdirectory\n";
+ }
+ if (@m){
+ unshift(@m, "
+# The default clean, realclean and test targets in this Makefile
+# have automatically been given entries for each subdir.
+
+");
+ } else {
+ push(@m, "\n# none")
+ }
+ join('',@m);
+}
+
+=item test (o)
+
+Defines the test targets.
+
+=cut
+
+sub test {
+# --- Test and Installation Sections ---
+
+ my($self, %attribs) = @_;
+ my $tests = $attribs{TESTS} || '';
+ if (!$tests && -d 't') {
+ $tests = $self->find_tests;
+ }
+ # note: 'test.pl' name is also hardcoded in init_dirscan()
+ my(@m);
+ push(@m,"
+TEST_VERBOSE=0
+TEST_TYPE=test_\$(LINKTYPE)
+TEST_FILE = test.pl
+TEST_FILES = $tests
+TESTDB_SW = -d
+
+testdb :: testdb_\$(LINKTYPE)
+
+test :: \$(TEST_TYPE) subdirs-test
+
+subdirs-test ::
+ \$(NOECHO) \$(NOOP)
+
+");
+
+ foreach my $dir (@{ $self->{DIR} }) {
+ my $test = $self->cd($dir, '$(MAKE) test $(PASTHRU)');
+
+ push @m, <<END
+subdirs-test ::
+ \$(NOECHO) $test
+
+END
+ }
+
+ push(@m, "\t\$(NOECHO) \$(ECHO) 'No tests defined for \$(NAME) extension.'\n")
+ unless $tests or -f "test.pl" or @{$self->{DIR}};
+ push(@m, "\n");
+
+ push(@m, "test_dynamic :: pure_all\n");
+ push(@m, $self->test_via_harness('$(FULLPERLRUN)', '$(TEST_FILES)'))
+ if $tests;
+ push(@m, $self->test_via_script('$(FULLPERLRUN)', '$(TEST_FILE)'))
+ if -f "test.pl";
+ push(@m, "\n");
+
+ push(@m, "testdb_dynamic :: pure_all\n");
+ push(@m, $self->test_via_script('$(FULLPERLRUN) $(TESTDB_SW)',
+ '$(TEST_FILE)'));
+ push(@m, "\n");
+
+ # Occasionally we may face this degenerate target:
+ push @m, "test_ : test_dynamic\n\n";
+
+ if ($self->needs_linking()) {
+ push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
+ push(@m, $self->test_via_harness('./$(MAP_TARGET)', '$(TEST_FILES)')) if $tests;
+ push(@m, $self->test_via_script('./$(MAP_TARGET)', '$(TEST_FILE)')) if -f "test.pl";
+ push(@m, "\n");
+ push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
+ push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
+ push(@m, "\n");
+ } else {
+ push @m, "test_static :: test_dynamic\n";
+ push @m, "testdb_static :: testdb_dynamic\n";
+ }
+ join("", @m);
+}
+
+=item test_via_harness (override)
+
+For some reason which I forget, Unix machines like to have
+PERL_DL_NONLAZY set for tests.
+
+=cut
+
+sub test_via_harness {
+ my($self, $perl, $tests) = @_;
+ return $self->SUPER::test_via_harness("PERL_DL_NONLAZY=1 $perl", $tests);
+}
+
+=item test_via_script (override)
+
+Again, the PERL_DL_NONLAZY thing.
+
+=cut
+
+sub test_via_script {
+ my($self, $perl, $script) = @_;
+ return $self->SUPER::test_via_script("PERL_DL_NONLAZY=1 $perl", $script);
+}
+
+
+=item tool_xsubpp (o)
+
+Determines typemaps, xsubpp version, prototype behaviour.
+
+=cut
+
+sub tool_xsubpp {
+ my($self) = shift;
+ return "" unless $self->needs_linking;
+
+ my $xsdir;
+ my @xsubpp_dirs = @INC;
+
+ # Make sure we pick up the new xsubpp if we're building perl.
+ unshift @xsubpp_dirs, $self->{PERL_LIB} if $self->{PERL_CORE};
+
+ foreach my $dir (@xsubpp_dirs) {
+ $xsdir = $self->catdir($dir, 'ExtUtils');
+ if( -r $self->catfile($xsdir, "xsubpp") ) {
+ last;
+ }
+ }
+
+ my $tmdir = File::Spec->catdir($self->{PERL_LIB},"ExtUtils");
+ my(@tmdeps) = $self->catfile($tmdir,'typemap');
+ if( $self->{TYPEMAPS} ){
+ foreach my $typemap (@{$self->{TYPEMAPS}}){
+ if( ! -f $typemap ) {
+ warn "Typemap $typemap not found.\n";
+ }
+ else {
+ push(@tmdeps, $typemap);
+ }
+ }
+ }
+ push(@tmdeps, "typemap") if -f "typemap";
+ my(@tmargs) = map("-typemap $_", @tmdeps);
+ if( exists $self->{XSOPT} ){
+ unshift( @tmargs, $self->{XSOPT} );
+ }
+
+ if ($Is{VMS} &&
+ $Config{'ldflags'} &&
+ $Config{'ldflags'} =~ m!/Debug!i &&
+ (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)
+ )
+ {
+ unshift(@tmargs,'-nolinenumbers');
+ }
+
+
+ $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
+
+ return qq{
+XSUBPPDIR = $xsdir
+XSUBPP = \$(XSUBPPDIR)\$(DFSEP)xsubpp
+XSUBPPRUN = \$(PERLRUN) \$(XSUBPP)
+XSPROTOARG = $self->{XSPROTOARG}
+XSUBPPDEPS = @tmdeps \$(XSUBPP)
+XSUBPPARGS = @tmargs
+XSUBPP_EXTRA_ARGS =
+};
+};
+
+
+=item all_target
+
+Build man pages, too
+
+=cut
+
+sub all_target {
+ my $self = shift;
+
+ return <<'MAKE_EXT';
+all :: pure_all manifypods
+ $(NOECHO) $(NOOP)
+MAKE_EXT
+}
+
+=item top_targets (o)
+
+Defines the targets all, subdirs, config, and O_FILES
+
+=cut
+
+sub top_targets {
+# --- Target Sections ---
+
+ my($self) = shift;
+ my(@m);
+
+ push @m, $self->all_target, "\n" unless $self->{SKIPHASH}{'all'};
+
+ push @m, '
+pure_all :: config pm_to_blib subdirs linkext
+ $(NOECHO) $(NOOP)
+
+subdirs :: $(MYEXTLIB)
+ $(NOECHO) $(NOOP)
+
+config :: $(FIRST_MAKEFILE) blibdirs
+ $(NOECHO) $(NOOP)
+';
+
+ push @m, '
+$(O_FILES): $(H_FILES)
+' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
+
+ push @m, q{
+help :
+ perldoc ExtUtils::MakeMaker
+};
+
+ join('',@m);
+}
+
+=item writedoc
+
+Obsolete, deprecated method. Not used since Version 5.21.
+
+=cut
+
+sub writedoc {
+# --- perllocal.pod section ---
+ my($self,$what,$name,@attribs)=@_;
+ my $time = localtime;
+ print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
+ print join "\n\n=item *\n\n", map("C<$_>",@attribs);
+ print "\n\n=back\n\n";
+}
+
+=item xs_c (o)
+
+Defines the suffix rules to compile XS files to C.
+
+=cut
+
+sub xs_c {
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+.xs.c:
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(XSUBPP_EXTRA_ARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
+';
+}
+
+=item xs_cpp (o)
+
+Defines the suffix rules to compile XS files to C++.
+
+=cut
+
+sub xs_cpp {
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+.xs.cpp:
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp
+';
+}
+
+=item xs_o (o)
+
+Defines suffix rules to go from XS to object files directly. This is
+only intended for broken make implementations.
+
+=cut
+
+sub xs_o { # many makes are too dumb to use xs_c then c_o
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+.xs$(OBJ_EXT):
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
+ $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c
+';
+}
+
+
+1;
+
+=back
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_VMS.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_VMS.pm
new file mode 100755
index 00000000000..2066d035976
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_VMS.pm
@@ -0,0 +1,1994 @@
+package ExtUtils::MM_VMS;
+
+use strict;
+
+use ExtUtils::MakeMaker::Config;
+require Exporter;
+
+BEGIN {
+ # so we can compile the thing on non-VMS platforms.
+ if( $^O eq 'VMS' ) {
+ require VMS::Filespec;
+ VMS::Filespec->import;
+ }
+}
+
+use File::Basename;
+
+our $VERSION = '6.56';
+
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+
+use ExtUtils::MakeMaker qw($Verbose neatvalue);
+our $Revision = $ExtUtils::MakeMaker::Revision;
+
+
+=head1 NAME
+
+ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ Do not use this directly.
+ Instead, use ExtUtils::MM and it will figure out which MM_*
+ class to use for you.
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=head2 Methods always loaded
+
+=over 4
+
+=item wraplist
+
+Converts a list into a string wrapped at approximately 80 columns.
+
+=cut
+
+sub wraplist {
+ my($self) = shift;
+ my($line,$hlen) = ('',0);
+
+ foreach my $word (@_) {
+ # Perl bug -- seems to occasionally insert extra elements when
+ # traversing array (scalar(@array) doesn't show them, but
+ # foreach(@array) does) (5.00307)
+ next unless $word =~ /\w/;
+ $line .= ' ' if length($line);
+ if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
+ $line .= $word;
+ $hlen += length($word) + 2;
+ }
+ $line;
+}
+
+
+# This isn't really an override. It's just here because ExtUtils::MM_VMS
+# appears in @MM::ISA before ExtUtils::Liblist::Kid, so if there isn't an ext()
+# in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just
+# mimic inheritance here and hand off to ExtUtils::Liblist::Kid.
+# XXX This hackery will die soon. --Schwern
+sub ext {
+ require ExtUtils::Liblist::Kid;
+ goto &ExtUtils::Liblist::Kid::ext;
+}
+
+=back
+
+=head2 Methods
+
+Those methods which override default MM_Unix methods are marked
+"(override)", while methods unique to MM_VMS are marked "(specific)".
+For overridden methods, documentation is limited to an explanation
+of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
+documentation for more details.
+
+=over 4
+
+=item guess_name (override)
+
+Try to determine name of extension being built. We begin with the name
+of the current directory. Since VMS filenames are case-insensitive,
+however, we look for a F<.pm> file whose name matches that of the current
+directory (presumably the 'main' F<.pm> file for this extension), and try
+to find a C<package> statement from which to obtain the Mixed::Case
+package name.
+
+=cut
+
+sub guess_name {
+ my($self) = @_;
+ my($defname,$defpm,@pm,%xs);
+ local *PM;
+
+ $defname = basename(fileify($ENV{'DEFAULT'}));
+ $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
+ $defpm = $defname;
+ # Fallback in case for some reason a user has copied the files for an
+ # extension into a working directory whose name doesn't reflect the
+ # extension's name. We'll use the name of a unique .pm file, or the
+ # first .pm file with a matching .xs file.
+ if (not -e "${defpm}.pm") {
+ @pm = glob('*.pm');
+ s/.pm$// for @pm;
+ if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
+ elsif (@pm) {
+ %xs = map { s/.xs$//; ($_,1) } glob('*.xs'); ## no critic
+ if (keys %xs) {
+ foreach my $pm (@pm) {
+ $defpm = $pm, last if exists $xs{$pm};
+ }
+ }
+ }
+ }
+ if (open(my $pm, '<', "${defpm}.pm")){
+ while (<$pm>) {
+ if (/^\s*package\s+([^;]+)/i) {
+ $defname = $1;
+ last;
+ }
+ }
+ print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
+ "defaulting package name to $defname\n"
+ if eof($pm);
+ close $pm;
+ }
+ else {
+ print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
+ "defaulting package name to $defname\n";
+ }
+ $defname =~ s#[\d.\-_]+$##;
+ $defname;
+}
+
+=item find_perl (override)
+
+Use VMS file specification syntax and CLI commands to find and
+invoke Perl images.
+
+=cut
+
+sub find_perl {
+ my($self, $ver, $names, $dirs, $trace) = @_;
+ my($vmsfile,@sdirs,@snames,@cand);
+ my($rslt);
+ my($inabs) = 0;
+ local *TCF;
+
+ if( $self->{PERL_CORE} ) {
+ # Check in relative directories first, so we pick up the current
+ # version of Perl if we're running MakeMaker as part of the main build.
+ @sdirs = sort { my($absa) = $self->file_name_is_absolute($a);
+ my($absb) = $self->file_name_is_absolute($b);
+ if ($absa && $absb) { return $a cmp $b }
+ else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
+ } @$dirs;
+ # Check miniperl before perl, and check names likely to contain
+ # version numbers before "generic" names, so we pick up an
+ # executable that's less likely to be from an old installation.
+ @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
+ my($bb) = $b =~ m!([^:>\]/]+)$!;
+ my($ahasdir) = (length($a) - length($ba) > 0);
+ my($bhasdir) = (length($b) - length($bb) > 0);
+ if ($ahasdir and not $bhasdir) { return 1; }
+ elsif ($bhasdir and not $ahasdir) { return -1; }
+ else { $bb =~ /\d/ <=> $ba =~ /\d/
+ or substr($ba,0,1) cmp substr($bb,0,1)
+ or length($bb) <=> length($ba) } } @$names;
+ }
+ else {
+ @sdirs = @$dirs;
+ @snames = @$names;
+ }
+
+ # Image names containing Perl version use '_' instead of '.' under VMS
+ s/\.(\d+)$/_$1/ for @snames;
+ if ($trace >= 2){
+ print "Looking for perl $ver by these names:\n";
+ print "\t@snames,\n";
+ print "in these dirs:\n";
+ print "\t@sdirs\n";
+ }
+ foreach my $dir (@sdirs){
+ next unless defined $dir; # $self->{PERL_SRC} may be undefined
+ $inabs++ if $self->file_name_is_absolute($dir);
+ if ($inabs == 1) {
+ # We've covered relative dirs; everything else is an absolute
+ # dir (probably an installed location). First, we'll try
+ # potential command names, to see whether we can avoid a long
+ # MCR expression.
+ foreach my $name (@snames) {
+ push(@cand,$name) if $name =~ /^[\w\-\$]+$/;
+ }
+ $inabs++; # Should happen above in next $dir, but just in case...
+ }
+ foreach my $name (@snames){
+ push @cand, ($name !~ m![/:>\]]!) ? $self->catfile($dir,$name)
+ : $self->fixpath($name,0);
+ }
+ }
+ foreach my $name (@cand) {
+ print "Checking $name\n" if $trace >= 2;
+ # If it looks like a potential command, try it without the MCR
+ if ($name =~ /^[\w\-\$]+$/) {
+ open(my $tcf, ">", "temp_mmvms.com")
+ or die('unable to open temp file');
+ print $tcf "\$ set message/nofacil/nosever/noident/notext\n";
+ print $tcf "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n";
+ close $tcf;
+ $rslt = `\@temp_mmvms.com` ;
+ unlink('temp_mmvms.com');
+ if ($rslt =~ /VER_OK/) {
+ print "Using PERL=$name\n" if $trace;
+ return $name;
+ }
+ }
+ next unless $vmsfile = $self->maybe_command($name);
+ $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
+ print "Executing $vmsfile\n" if ($trace >= 2);
+ open(my $tcf, '>', "temp_mmvms.com")
+ or die('unable to open temp file');
+ print $tcf "\$ set message/nofacil/nosever/noident/notext\n";
+ print $tcf "\$ mcr $vmsfile -e \"require $ver; print \"\"VER_OK\\n\"\"\" \n";
+ close $tcf;
+ $rslt = `\@temp_mmvms.com`;
+ unlink('temp_mmvms.com');
+ if ($rslt =~ /VER_OK/) {
+ print "Using PERL=MCR $vmsfile\n" if $trace;
+ return "MCR $vmsfile";
+ }
+ }
+ print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
+ 0; # false and not empty
+}
+
+=item maybe_command (override)
+
+Follows VMS naming conventions for executable files.
+If the name passed in doesn't exactly match an executable file,
+appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
+to check for DCL procedure. If this fails, checks directories in DCL$PATH
+and finally F<Sys$System:> for an executable file having the name specified,
+with or without the F<.Exe>-equivalent suffix.
+
+=cut
+
+sub maybe_command {
+ my($self,$file) = @_;
+ return $file if -x $file && ! -d _;
+ my(@dirs) = ('');
+ my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
+
+ if ($file !~ m![/:>\]]!) {
+ for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
+ my $dir = $ENV{"DCL\$PATH;$i"};
+ $dir .= ':' unless $dir =~ m%[\]:]$%;
+ push(@dirs,$dir);
+ }
+ push(@dirs,'Sys$System:');
+ foreach my $dir (@dirs) {
+ my $sysfile = "$dir$file";
+ foreach my $ext (@exts) {
+ return $file if -x "$sysfile$ext" && ! -d _;
+ }
+ }
+ }
+ return 0;
+}
+
+
+=item pasthru (override)
+
+VMS has $(MMSQUALIFIERS) which is a listing of all the original command line
+options. This is used in every invocation of make in the VMS Makefile so
+PASTHRU should not be necessary. Using PASTHRU tends to blow commands past
+the 256 character limit.
+
+=cut
+
+sub pasthru {
+ return "PASTHRU=\n";
+}
+
+
+=item pm_to_blib (override)
+
+VMS wants a dot in every file so we can't have one called 'pm_to_blib',
+it becomes 'pm_to_blib.' and MMS/K isn't smart enough to know that when
+you have a target called 'pm_to_blib' it should look for 'pm_to_blib.'.
+
+So in VMS its pm_to_blib.ts.
+
+=cut
+
+sub pm_to_blib {
+ my $self = shift;
+
+ my $make = $self->SUPER::pm_to_blib;
+
+ $make =~ s{^pm_to_blib :}{pm_to_blib.ts :}m;
+ $make =~ s{\$\(TOUCH\) pm_to_blib}{\$(TOUCH) pm_to_blib.ts};
+
+ $make = <<'MAKE' . $make;
+# Dummy target to match Unix target name; we use pm_to_blib.ts as
+# timestamp file to avoid repeated invocations under VMS
+pm_to_blib : pm_to_blib.ts
+ $(NOECHO) $(NOOP)
+
+MAKE
+
+ return $make;
+}
+
+
+=item perl_script (override)
+
+If name passed in doesn't specify a readable file, appends F<.com> or
+F<.pl> and tries again, since it's customary to have file types on all files
+under VMS.
+
+=cut
+
+sub perl_script {
+ my($self,$file) = @_;
+ return $file if -r $file && ! -d _;
+ return "$file.com" if -r "$file.com";
+ return "$file.pl" if -r "$file.pl";
+ return '';
+}
+
+
+=item replace_manpage_separator
+
+Use as separator a character which is legal in a VMS-syntax file name.
+
+=cut
+
+sub replace_manpage_separator {
+ my($self,$man) = @_;
+ $man = unixify($man);
+ $man =~ s#/+#__#g;
+ $man;
+}
+
+=item init_DEST
+
+(override) Because of the difficulty concatenating VMS filepaths we
+must pre-expand the DEST* variables.
+
+=cut
+
+sub init_DEST {
+ my $self = shift;
+
+ $self->SUPER::init_DEST;
+
+ # Expand DEST variables.
+ foreach my $var ($self->installvars) {
+ my $destvar = 'DESTINSTALL'.$var;
+ $self->{$destvar} = $self->eliminate_macros($self->{$destvar});
+ }
+}
+
+
+=item init_DIRFILESEP
+
+No seperator between a directory path and a filename on VMS.
+
+=cut
+
+sub init_DIRFILESEP {
+ my($self) = shift;
+
+ $self->{DIRFILESEP} = '';
+ return 1;
+}
+
+
+=item init_main (override)
+
+
+=cut
+
+sub init_main {
+ my($self) = shift;
+
+ $self->SUPER::init_main;
+
+ $self->{DEFINE} ||= '';
+ if ($self->{DEFINE} ne '') {
+ my(@terms) = split(/\s+/,$self->{DEFINE});
+ my(@defs,@udefs);
+ foreach my $def (@terms) {
+ next unless $def;
+ my $targ = \@defs;
+ if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
+ $targ = \@udefs if $1 eq 'U';
+ $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
+ $def =~ s/^'(.*)'$/$1/; # from entire term or argument
+ }
+ if ($def =~ /=/) {
+ $def =~ s/"/""/g; # Protect existing " from DCL
+ $def = qq["$def"]; # and quote to prevent parsing of =
+ }
+ push @$targ, $def;
+ }
+
+ $self->{DEFINE} = '';
+ if (@defs) {
+ $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')';
+ }
+ if (@udefs) {
+ $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')';
+ }
+ }
+}
+
+=item init_others (override)
+
+Provide VMS-specific forms of various utility commands, then hand
+off to the default MM_Unix method.
+
+DEV_NULL should probably be overriden with something.
+
+Also changes EQUALIZE_TIMESTAMP to set revision date of target file to
+one second later than source file, since MMK interprets precisely
+equal revision dates for a source and target file as a sign that the
+target needs to be updated.
+
+=cut
+
+sub init_others {
+ my($self) = @_;
+
+ $self->{NOOP} = 'Continue';
+ $self->{NOECHO} ||= '@ ';
+
+ $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE} || 'Descrip.MMS';
+ $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE};
+ $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
+ $self->{MAKEFILE_OLD} ||= $self->eliminate_macros('$(FIRST_MAKEFILE)_old');
+#
+# If an extension is not specified, then MMS/MMK assumes an
+# an extension of .MMS. If there really is no extension,
+# then a trailing "." needs to be appended to specify a
+# a null extension.
+#
+ $self->{MAKEFILE} .= '.' unless $self->{MAKEFILE} =~ m/\./;
+ $self->{FIRST_MAKEFILE} .= '.' unless $self->{FIRST_MAKEFILE} =~ m/\./;
+ $self->{MAKE_APERL_FILE} .= '.' unless $self->{MAKE_APERL_FILE} =~ m/\./;
+ $self->{MAKEFILE_OLD} .= '.' unless $self->{MAKEFILE_OLD} =~ m/\./;
+
+ $self->{MACROSTART} ||= '/Macro=(';
+ $self->{MACROEND} ||= ')';
+ $self->{USEMAKEFILE} ||= '/Descrip=';
+
+ $self->{EQUALIZE_TIMESTAMP} ||= '$(ABSPERLRUN) -we "open F,qq{>>$ARGV[1]};close F;utime(0,(stat($ARGV[0]))[9]+1,$ARGV[1])"';
+
+ $self->{MOD_INSTALL} ||=
+ $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
+install([ from_to => {split(' ', <STDIN>)}, verbose => '$(VERBINST)', uninstall_shadows => '$(UNINST)', dir_mode => '$(PERM_DIR)' ]);
+CODE
+
+ $self->SUPER::init_others;
+
+ $self->{SHELL} ||= 'Posix';
+
+ $self->{UMASK_NULL} = '! ';
+
+ # Redirection on VMS goes before the command, not after as on Unix.
+ # $(DEV_NULL) is used once and its not worth going nuts over making
+ # it work. However, Unix's DEV_NULL is quite wrong for VMS.
+ $self->{DEV_NULL} = '';
+
+ if ($self->{OBJECT} =~ /\s/) {
+ $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
+ $self->{OBJECT} = $self->wraplist(
+ map $self->fixpath($_,0), split /,?\s+/, $self->{OBJECT}
+ );
+ }
+
+ $self->{LDFROM} = $self->wraplist(
+ map $self->fixpath($_,0), split /,?\s+/, $self->{LDFROM}
+ );
+}
+
+
+=item init_platform (override)
+
+Add PERL_VMS, MM_VMS_REVISION and MM_VMS_VERSION.
+
+MM_VMS_REVISION is for backwards compatibility before MM_VMS had a
+$VERSION.
+
+=cut
+
+sub init_platform {
+ my($self) = shift;
+
+ $self->{MM_VMS_REVISION} = $Revision;
+ $self->{MM_VMS_VERSION} = $VERSION;
+ $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC}, 'VMS')
+ if $self->{PERL_SRC};
+}
+
+
+=item platform_constants
+
+=cut
+
+sub platform_constants {
+ my($self) = shift;
+ my $make_frag = '';
+
+ foreach my $macro (qw(PERL_VMS MM_VMS_REVISION MM_VMS_VERSION))
+ {
+ next unless defined $self->{$macro};
+ $make_frag .= "$macro = $self->{$macro}\n";
+ }
+
+ return $make_frag;
+}
+
+
+=item init_VERSION (override)
+
+Override the *DEFINE_VERSION macros with VMS semantics. Translate the
+MAKEMAKER filepath to VMS style.
+
+=cut
+
+sub init_VERSION {
+ my $self = shift;
+
+ $self->SUPER::init_VERSION;
+
+ $self->{DEFINE_VERSION} = '"$(VERSION_MACRO)=""$(VERSION)"""';
+ $self->{XS_DEFINE_VERSION} = '"$(XS_VERSION_MACRO)=""$(XS_VERSION)"""';
+ $self->{MAKEMAKER} = vmsify($INC{'ExtUtils/MakeMaker.pm'});
+}
+
+
+=item constants (override)
+
+Fixes up numerous file and directory macros to insure VMS syntax
+regardless of input syntax. Also makes lists of files
+comma-separated.
+
+=cut
+
+sub constants {
+ my($self) = @_;
+
+ # Be kind about case for pollution
+ for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
+
+ # Cleanup paths for directories in MMS macros.
+ foreach my $macro ( qw [
+ INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB
+ PERL_LIB PERL_ARCHLIB
+ PERL_INC PERL_SRC ],
+ (map { 'INSTALL'.$_ } $self->installvars)
+ )
+ {
+ next unless defined $self->{$macro};
+ next if $macro =~ /MAN/ && $self->{$macro} eq 'none';
+ $self->{$macro} = $self->fixpath($self->{$macro},1);
+ }
+
+ # Cleanup paths for files in MMS macros.
+ foreach my $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKEFILE_OLD
+ MAKE_APERL_FILE MYEXTLIB] )
+ {
+ next unless defined $self->{$macro};
+ $self->{$macro} = $self->fixpath($self->{$macro},0);
+ }
+
+ # Fixup files for MMS macros
+ # XXX is this list complete?
+ for my $macro (qw/
+ FULLEXT VERSION_FROM OBJECT LDFROM
+ / ) {
+ next unless defined $self->{$macro};
+ $self->{$macro} = $self->fixpath($self->{$macro},0);
+ }
+
+
+ for my $macro (qw/ XS MAN1PODS MAN3PODS PM /) {
+ # Where is the space coming from? --jhi
+ next unless $self ne " " && defined $self->{$macro};
+ my %tmp = ();
+ for my $key (keys %{$self->{$macro}}) {
+ $tmp{$self->fixpath($key,0)} =
+ $self->fixpath($self->{$macro}{$key},0);
+ }
+ $self->{$macro} = \%tmp;
+ }
+
+ for my $macro (qw/ C O_FILES H /) {
+ next unless defined $self->{$macro};
+ my @tmp = ();
+ for my $val (@{$self->{$macro}}) {
+ push(@tmp,$self->fixpath($val,0));
+ }
+ $self->{$macro} = \@tmp;
+ }
+
+ # mms/k does not define a $(MAKE) macro.
+ $self->{MAKE} = '$(MMS)$(MMSQUALIFIERS)';
+
+ return $self->SUPER::constants;
+}
+
+
+=item special_targets
+
+Clear the default .SUFFIXES and put in our own list.
+
+=cut
+
+sub special_targets {
+ my $self = shift;
+
+ my $make_frag .= <<'MAKE_FRAG';
+.SUFFIXES :
+.SUFFIXES : $(OBJ_EXT) .c .cpp .cxx .xs
+
+MAKE_FRAG
+
+ return $make_frag;
+}
+
+=item cflags (override)
+
+Bypass shell script and produce qualifiers for CC directly (but warn
+user if a shell script for this extension exists). Fold multiple
+/Defines into one, since some C compilers pay attention to only one
+instance of this qualifier on the command line.
+
+=cut
+
+sub cflags {
+ my($self,$libperl) = @_;
+ my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
+ my($definestr,$undefstr,$flagoptstr) = ('','','');
+ my($incstr) = '/Include=($(PERL_INC)';
+ my($name,$sys,@m);
+
+ ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
+ print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
+ " required to modify CC command for $self->{'BASEEXT'}\n"
+ if ($Config{$name});
+
+ if ($quals =~ / -[DIUOg]/) {
+ while ($quals =~ / -([Og])(\d*)\b/) {
+ my($type,$lvl) = ($1,$2);
+ $quals =~ s/ -$type$lvl\b\s*//;
+ if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
+ else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
+ }
+ while ($quals =~ / -([DIU])(\S+)/) {
+ my($type,$def) = ($1,$2);
+ $quals =~ s/ -$type$def\s*//;
+ $def =~ s/"/""/g;
+ if ($type eq 'D') { $definestr .= qq["$def",]; }
+ elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
+ else { $undefstr .= qq["$def",]; }
+ }
+ }
+ if (length $quals and $quals !~ m!/!) {
+ warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
+ $quals = '';
+ }
+ $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
+ if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
+ if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
+ # Deal with $self->{DEFINE} here since some C compilers pay attention
+ # to only one /Define clause on command line, so we have to
+ # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
+ # ($self->{DEFINE} has already been VMSified in constants() above)
+ if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
+ for my $type (qw(Def Undef)) {
+ my(@terms);
+ while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
+ my $term = $1;
+ $term =~ s:^\((.+)\)$:$1:;
+ push @terms, $term;
+ }
+ if ($type eq 'Def') {
+ push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
+ }
+ if (@terms) {
+ $quals =~ s:/${type}i?n?e?=[^/]+::ig;
+ $quals .= "/${type}ine=(" . join(',',@terms) . ')';
+ }
+ }
+
+ $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
+
+ # Likewise with $self->{INC} and /Include
+ if ($self->{'INC'}) {
+ my(@includes) = split(/\s+/,$self->{INC});
+ foreach (@includes) {
+ s/^-I//;
+ $incstr .= ','.$self->fixpath($_,1);
+ }
+ }
+ $quals .= "$incstr)";
+# $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
+ $self->{CCFLAGS} = $quals;
+
+ $self->{PERLTYPE} ||= '';
+
+ $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
+ if ($self->{OPTIMIZE} !~ m!/!) {
+ if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
+ elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
+ $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
+ }
+ else {
+ warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
+ $self->{OPTIMIZE} = '/Optimize';
+ }
+ }
+
+ return $self->{CFLAGS} = qq{
+CCFLAGS = $self->{CCFLAGS}
+OPTIMIZE = $self->{OPTIMIZE}
+PERLTYPE = $self->{PERLTYPE}
+};
+}
+
+=item const_cccmd (override)
+
+Adds directives to point C preprocessor to the right place when
+handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
+command line a bit differently than MM_Unix method.
+
+=cut
+
+sub const_cccmd {
+ my($self,$libperl) = @_;
+ my(@m);
+
+ return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
+ return '' unless $self->needs_linking();
+ if ($Config{'vms_cc_type'} eq 'gcc') {
+ push @m,'
+.FIRST
+ ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
+ }
+ elsif ($Config{'vms_cc_type'} eq 'vaxc') {
+ push @m,'
+.FIRST
+ ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
+ ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
+ }
+ else {
+ push @m,'
+.FIRST
+ ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
+ ($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
+ ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
+ }
+
+ push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
+
+ $self->{CONST_CCCMD} = join('',@m);
+}
+
+
+=item tools_other (override)
+
+Throw in some dubious extra macros for Makefile args.
+
+Also keep around the old $(SAY) macro in case somebody's using it.
+
+=cut
+
+sub tools_other {
+ my($self) = @_;
+
+ # XXX Are these necessary? Does anyone override them? They're longer
+ # than just typing the literal string.
+ my $extra_tools = <<'EXTRA_TOOLS';
+
+# Just in case anyone is using the old macro.
+USEMACROS = $(MACROSTART)
+SAY = $(ECHO)
+
+EXTRA_TOOLS
+
+ return $self->SUPER::tools_other . $extra_tools;
+}
+
+=item init_dist (override)
+
+VMSish defaults for some values.
+
+ macro description default
+
+ ZIPFLAGS flags to pass to ZIP -Vu
+
+ COMPRESS compression command to gzip
+ use for tarfiles
+ SUFFIX suffix to put on -gz
+ compressed files
+
+ SHAR shar command to use vms_share
+
+ DIST_DEFAULT default target to use to tardist
+ create a distribution
+
+ DISTVNAME Use VERSION_SYM instead of $(DISTNAME)-$(VERSION_SYM)
+ VERSION for the name
+
+=cut
+
+sub init_dist {
+ my($self) = @_;
+ $self->{ZIPFLAGS} ||= '-Vu';
+ $self->{COMPRESS} ||= 'gzip';
+ $self->{SUFFIX} ||= '-gz';
+ $self->{SHAR} ||= 'vms_share';
+ $self->{DIST_DEFAULT} ||= 'zipdist';
+
+ $self->SUPER::init_dist;
+
+ $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION_SYM}"
+ unless $self->{ARGS}{DISTVNAME};
+
+ return;
+}
+
+=item c_o (override)
+
+Use VMS syntax on command line. In particular, $(DEFINE) and
+$(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
+
+=cut
+
+sub c_o {
+ my($self) = @_;
+ return '' unless $self->needs_linking();
+ '
+.c$(OBJ_EXT) :
+ $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
+
+.cpp$(OBJ_EXT) :
+ $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
+
+.cxx$(OBJ_EXT) :
+ $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
+
+';
+}
+
+=item xs_c (override)
+
+Use MM[SK] macros.
+
+=cut
+
+sub xs_c {
+ my($self) = @_;
+ return '' unless $self->needs_linking();
+ '
+.xs.c :
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
+';
+}
+
+=item xs_o (override)
+
+Use MM[SK] macros, and VMS command line for C compiler.
+
+=cut
+
+sub xs_o { # many makes are too dumb to use xs_c then c_o
+ my($self) = @_;
+ return '' unless $self->needs_linking();
+ '
+.xs$(OBJ_EXT) :
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
+ $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
+';
+}
+
+
+=item dlsyms (override)
+
+Create VMS linker options files specifying universal symbols for this
+extension's shareable image, and listing other shareable images or
+libraries to which it should be linked.
+
+=cut
+
+sub dlsyms {
+ my($self,%attribs) = @_;
+
+ return '' unless $self->needs_linking();
+
+ my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
+ my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
+ my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
+ my(@m);
+
+ unless ($self->{SKIPHASH}{'dynamic'}) {
+ push(@m,'
+dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
+ $(NOECHO) $(NOOP)
+');
+ }
+
+ push(@m,'
+static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
+ $(NOECHO) $(NOOP)
+') unless $self->{SKIPHASH}{'static'};
+
+ push @m,'
+$(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
+ $(CP) $(MMS$SOURCE) $(MMS$TARGET)
+
+$(BASEEXT).opt : Makefile.PL
+ $(PERLRUN) -e "use ExtUtils::Mksymlists;" -
+ ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
+ neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
+ q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
+
+ push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
+ if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
+ $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
+ push @m, ($Config{d_vms_case_sensitive_symbols}
+ ? uc($self->{BASEEXT}) :'$(BASEEXT)');
+ }
+ else { # We don't have a "main" object file, so pull 'em all in
+ # Upcase module names if linker is being case-sensitive
+ my($upcase) = $Config{d_vms_case_sensitive_symbols};
+ my(@omods) = split ' ', $self->eliminate_macros($self->{OBJECT});
+ for (@omods) {
+ s/\.[^.]*$//; # Trim off file type
+ s[\$\(\w+_EXT\)][]; # even as a macro
+ s/.*[:>\/\]]//; # Trim off dir spec
+ $_ = uc if $upcase;
+ };
+
+ my(@lines);
+ my $tmp = shift @omods;
+ foreach my $elt (@omods) {
+ $tmp .= ",$elt";
+ if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
+ }
+ push @lines, $tmp;
+ push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
+ }
+ push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
+
+ if (length $self->{LDLOADLIBS}) {
+ my($line) = '';
+ foreach my $lib (split ' ', $self->{LDLOADLIBS}) {
+ $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
+ if (length($line) + length($lib) > 160) {
+ push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
+ $line = $lib . '\n';
+ }
+ else { $line .= $lib . '\n'; }
+ }
+ push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
+ }
+
+ join('',@m);
+
+}
+
+=item dynamic_lib (override)
+
+Use VMS Link command.
+
+=cut
+
+sub dynamic_lib {
+ my($self, %attribs) = @_;
+ return '' unless $self->needs_linking(); #might be because of a subdir
+
+ return '' unless $self->has_link_code();
+
+ my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
+ my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
+ my $shr = $Config{'dbgprefix'} . 'PerlShr';
+ my(@m);
+ push @m,"
+
+OTHERLDFLAGS = $otherldflags
+INST_DYNAMIC_DEP = $inst_dynamic_dep
+
+";
+ push @m, '
+$(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
+ If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
+ Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
+';
+
+ join('',@m);
+}
+
+
+=item static_lib (override)
+
+Use VMS commands to manipulate object library.
+
+=cut
+
+sub static_lib {
+ my($self) = @_;
+ return '' unless $self->needs_linking();
+
+ return '
+$(INST_STATIC) :
+ $(NOECHO) $(NOOP)
+' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
+
+ my(@m);
+ push @m,'
+# Rely on suffix rule for update action
+$(OBJECT) : $(INST_ARCHAUTODIR)$(DFSEP).exists
+
+$(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
+';
+ # If this extension has its own library (eg SDBM_File)
+ # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
+ push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
+
+ push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
+
+ # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
+ # 'cause it's a library and you can't stick them in other libraries.
+ # In that case, we use $OBJECT instead and hope for the best
+ if ($self->{MYEXTLIB}) {
+ push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
+ } else {
+ push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
+ }
+
+ push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
+ foreach my $lib (split ' ', $self->{EXTRALIBS}) {
+ push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
+ }
+ join('',@m);
+}
+
+
+=item extra_clean_files
+
+Clean up some OS specific files. Plus the temp file used to shorten
+a lot of commands.
+
+=cut
+
+sub extra_clean_files {
+ return qw(
+ *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *.Opt $(BASEEXT).bso
+ .MM_Tmp
+ );
+}
+
+
+=item zipfile_target
+
+=item tarfile_target
+
+=item shdist_target
+
+Syntax for invoking shar, tar and zip differs from that for Unix.
+
+=cut
+
+sub zipfile_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+$(DISTVNAME).zip : distdir
+ $(PREOP)
+ $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
+ $(RM_RF) $(DISTVNAME)
+ $(POSTOP)
+MAKE_FRAG
+}
+
+sub tarfile_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+$(DISTVNAME).tar$(SUFFIX) : distdir
+ $(PREOP)
+ $(TO_UNIX)
+ $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
+ $(RM_RF) $(DISTVNAME)
+ $(COMPRESS) $(DISTVNAME).tar
+ $(POSTOP)
+MAKE_FRAG
+}
+
+sub shdist_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+shdist : distdir
+ $(PREOP)
+ $(SHAR) [.$(DISTVNAME)...]*.*; $(DISTVNAME).share
+ $(RM_RF) $(DISTVNAME)
+ $(POSTOP)
+MAKE_FRAG
+}
+
+
+# --- Test and Installation Sections ---
+
+=item install (override)
+
+Work around DCL's 255 character limit several times,and use
+VMS-style command line quoting in a few cases.
+
+=cut
+
+sub install {
+ my($self, %attribs) = @_;
+ my(@m);
+
+ push @m, q[
+install :: all pure_install doc_install
+ $(NOECHO) $(NOOP)
+
+install_perl :: all pure_perl_install doc_perl_install
+ $(NOECHO) $(NOOP)
+
+install_site :: all pure_site_install doc_site_install
+ $(NOECHO) $(NOOP)
+
+pure_install :: pure_$(INSTALLDIRS)_install
+ $(NOECHO) $(NOOP)
+
+doc_install :: doc_$(INSTALLDIRS)_install
+ $(NOECHO) $(NOOP)
+
+pure__install : pure_site_install
+ $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
+
+doc__install : doc_site_install
+ $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
+
+# This hack brought to you by DCL's 255-character command line limit
+pure_perl_install ::
+ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
+ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLPRIVLIB) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLARCHLIB) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLBIN) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLMAN3DIR) " >>.MM_tmp
+ $(NOECHO) $(MOD_INSTALL) <.MM_tmp
+ $(NOECHO) $(RM_F) .MM_tmp
+ $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
+
+# Likewise
+pure_site_install ::
+ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
+ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLSITELIB) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLSITEARCH) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLSITEBIN) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR) " >>.MM_tmp
+ $(NOECHO) $(MOD_INSTALL) <.MM_tmp
+ $(NOECHO) $(RM_F) .MM_tmp
+ $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
+
+pure_vendor_install ::
+ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
+ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLVENDORLIB) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLVENDORBIN) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR) " >>.MM_tmp
+ $(NOECHO) $(MOD_INSTALL) <.MM_tmp
+ $(NOECHO) $(RM_F) .MM_tmp
+
+# Ditto
+doc_perl_install ::
+ $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
+ $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+ $(NOECHO) $(ECHO_N) "installed into|$(INSTALLPRIVLIB)|" >.MM_tmp
+ $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
+ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
+ $(NOECHO) $(RM_F) .MM_tmp
+
+# And again
+doc_site_install ::
+ $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
+ $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+ $(NOECHO) $(ECHO_N) "installed into|$(INSTALLSITELIB)|" >.MM_tmp
+ $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
+ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
+ $(NOECHO) $(RM_F) .MM_tmp
+
+doc_vendor_install ::
+ $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
+ $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+ $(NOECHO) $(ECHO_N) "installed into|$(INSTALLVENDORLIB)|" >.MM_tmp
+ $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
+ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
+ $(NOECHO) $(RM_F) .MM_tmp
+
+];
+
+ push @m, q[
+uninstall :: uninstall_from_$(INSTALLDIRS)dirs
+ $(NOECHO) $(NOOP)
+
+uninstall_from_perldirs ::
+ $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
+ $(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
+ $(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
+ $(NOECHO) $(ECHO) "the appropriate files. Sorry for the inconvenience."
+
+uninstall_from_sitedirs ::
+ $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
+ $(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
+ $(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
+ $(NOECHO) $(ECHO) "the appropriate files. Sorry for the inconvenience."
+];
+
+ join('',@m);
+}
+
+=item perldepend (override)
+
+Use VMS-style syntax for files; it's cheaper to just do it directly here
+than to have the MM_Unix method call C<catfile> repeatedly. Also, if
+we have to rebuild Config.pm, use MM[SK] to do it.
+
+=cut
+
+sub perldepend {
+ my($self) = @_;
+ my(@m);
+
+ push @m, '
+$(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h
+$(OBJECT) : $(PERL_INC)av.h, $(PERL_INC)cc_runtime.h, $(PERL_INC)config.h
+$(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h
+$(OBJECT) : $(PERL_INC)embedvar.h, $(PERL_INC)form.h
+$(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h
+$(OBJECT) : $(PERL_INC)intrpvar.h, $(PERL_INC)iperlsys.h, $(PERL_INC)keywords.h
+$(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)nostdio.h, $(PERL_INC)op.h
+$(OBJECT) : $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
+$(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perlio.h
+$(OBJECT) : $(PERL_INC)perlsdio.h, $(PERL_INC)perlvars.h
+$(OBJECT) : $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)pp_proto.h
+$(OBJECT) : $(PERL_INC)proto.h, $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h
+$(OBJECT) : $(PERL_INC)regnodes.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
+$(OBJECT) : $(PERL_INC)thread.h, $(PERL_INC)util.h, $(PERL_INC)vmsish.h
+
+' if $self->{OBJECT};
+
+ if ($self->{PERL_SRC}) {
+ my(@macros);
+ my($mmsquals) = '$(USEMAKEFILE)[.vms]$(FIRST_MAKEFILE)';
+ push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP';
+ push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
+ push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
+ push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
+ push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
+ $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
+ push(@m,q[
+# Check for unpropagated config.sh changes. Should never happen.
+# We do NOT just update config.h because that is not sufficient.
+# An out of date config.h is not fatal but complains loudly!
+$(PERL_INC)config.h : $(PERL_SRC)config.sh
+ $(NOOP)
+
+$(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
+ $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
+ olddef = F$Environment("Default")
+ Set Default $(PERL_SRC)
+ $(MMS)],$mmsquals,);
+ if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
+ my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
+ $target =~ s/\Q$prefix/[/;
+ push(@m," $target");
+ }
+ else { push(@m,' $(MMS$TARGET)'); }
+ push(@m,q[
+ Set Default 'olddef'
+]);
+ }
+
+ push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
+ if %{$self->{XS}};
+
+ join('',@m);
+}
+
+
+=item makeaperl (override)
+
+Undertake to build a new set of Perl images using VMS commands. Since
+VMS does dynamic loading, it's not necessary to statically link each
+extension into the Perl image, so this isn't the normal build path.
+Consequently, it hasn't really been tested, and may well be incomplete.
+
+=cut
+
+our %olbs; # needs to be localized
+
+sub makeaperl {
+ my($self, %attribs) = @_;
+ my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmpdir, $libperl) =
+ @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
+ my(@m);
+ push @m, "
+# --- MakeMaker makeaperl section ---
+MAP_TARGET = $target
+";
+ return join '', @m if $self->{PARENT};
+
+ my($dir) = join ":", @{$self->{DIR}};
+
+ unless ($self->{MAKEAPERL}) {
+ push @m, q{
+$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
+ $(NOECHO) $(ECHO) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
+ $(NOECHO) $(PERLRUNINST) \
+ Makefile.PL DIR=}, $dir, q{ \
+ FIRST_MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
+ MAKEAPERL=1 NORECURS=1 };
+
+ push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
+
+$(MAP_TARGET) :: $(MAKE_APERL_FILE)
+ $(MAKE)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
+};
+ push @m, "\n";
+
+ return join '', @m;
+ }
+
+
+ my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
+ local($_);
+
+ # The front matter of the linkcommand...
+ $linkcmd = join ' ', $Config{'ld'},
+ grep($_, @Config{qw(large split ldflags ccdlflags)});
+ $linkcmd =~ s/\s+/ /g;
+
+ # Which *.olb files could we make use of...
+ local(%olbs); # XXX can this be lexical?
+ $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
+ require File::Find;
+ File::Find::find(sub {
+ return unless m/\Q$self->{LIB_EXT}\E$/;
+ return if m/^libperl/;
+
+ if( exists $self->{INCLUDE_EXT} ){
+ my $found = 0;
+
+ (my $xx = $File::Find::name) =~ s,.*?/auto/,,;
+ $xx =~ s,/?$_,,;
+ $xx =~ s,/,::,g;
+
+ # Throw away anything not explicitly marked for inclusion.
+ # DynaLoader is implied.
+ foreach my $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
+ if( $xx eq $incl ){
+ $found++;
+ last;
+ }
+ }
+ return unless $found;
+ }
+ elsif( exists $self->{EXCLUDE_EXT} ){
+ (my $xx = $File::Find::name) =~ s,.*?/auto/,,;
+ $xx =~ s,/?$_,,;
+ $xx =~ s,/,::,g;
+
+ # Throw away anything explicitly marked for exclusion
+ foreach my $excl (@{$self->{EXCLUDE_EXT}}){
+ return if( $xx eq $excl );
+ }
+ }
+
+ $olbs{$ENV{DEFAULT}} = $_;
+ }, grep( -d $_, @{$searchdirs || []}));
+
+ # We trust that what has been handed in as argument will be buildable
+ $static = [] unless $static;
+ @olbs{@{$static}} = (1) x @{$static};
+
+ $extra = [] unless $extra && ref $extra eq 'ARRAY';
+ # Sort the object libraries in inverse order of
+ # filespec length to try to insure that dependent extensions
+ # will appear before their parents, so the linker will
+ # search the parent library to resolve references.
+ # (e.g. Intuit::DWIM will precede Intuit, so unresolved
+ # references from [.intuit.dwim]dwim.obj can be found
+ # in [.intuit]intuit.olb).
+ for (sort { length($a) <=> length($b) } keys %olbs) {
+ next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
+ my($dir) = $self->fixpath($_,1);
+ my($extralibs) = $dir . "extralibs.ld";
+ my($extopt) = $dir . $olbs{$_};
+ $extopt =~ s/$self->{LIB_EXT}$/.opt/;
+ push @optlibs, "$dir$olbs{$_}";
+ # Get external libraries this extension will need
+ if (-f $extralibs ) {
+ my %seenthis;
+ open my $list, "<", $extralibs or warn $!,next;
+ while (<$list>) {
+ chomp;
+ # Include a library in the link only once, unless it's mentioned
+ # multiple times within a single extension's options file, in which
+ # case we assume the builder needed to search it again later in the
+ # link.
+ my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
+ $libseen{$_}++; $seenthis{$_}++;
+ next if $skip;
+ push @$extra,$_;
+ }
+ }
+ # Get full name of extension for ExtUtils::Miniperl
+ if (-f $extopt) {
+ open my $opt, '<', $extopt or die $!;
+ while (<$opt>) {
+ next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
+ my $pkg = $1;
+ $pkg =~ s#__*#::#g;
+ push @staticpkgs,$pkg;
+ }
+ }
+ }
+ # Place all of the external libraries after all of the Perl extension
+ # libraries in the final link, in order to maximize the opportunity
+ # for XS code from multiple extensions to resolve symbols against the
+ # same external library while only including that library once.
+ push @optlibs, @$extra;
+
+ $target = "Perl$Config{'exe_ext'}" unless $target;
+ my $shrtarget;
+ ($shrtarget,$targdir) = fileparse($target);
+ $shrtarget =~ s/^([^.]*)/$1Shr/;
+ $shrtarget = $targdir . $shrtarget;
+ $target = "Perlshr.$Config{'dlext'}" unless $target;
+ $tmpdir = "[]" unless $tmpdir;
+ $tmpdir = $self->fixpath($tmpdir,1);
+ if (@optlibs) { $extralist = join(' ',@optlibs); }
+ else { $extralist = ''; }
+ # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
+ # that's what we're building here).
+ push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
+ if ($libperl) {
+ unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
+ print STDOUT "Warning: $libperl not found\n";
+ undef $libperl;
+ }
+ }
+ unless ($libperl) {
+ if (defined $self->{PERL_SRC}) {
+ $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
+ } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
+ } else {
+ print STDOUT "Warning: $libperl not found
+ If you're going to build a static perl binary, make sure perl is installed
+ otherwise ignore this warning\n";
+ }
+ }
+ $libperldir = $self->fixpath((fileparse($libperl))[1],1);
+
+ push @m, '
+# Fill in the target you want to produce if it\'s not perl
+MAP_TARGET = ',$self->fixpath($target,0),'
+MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
+MAP_LINKCMD = $linkcmd
+MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
+MAP_EXTRA = $extralist
+MAP_LIBPERL = ",$self->fixpath($libperl,0),'
+';
+
+
+ push @m,"\n${tmpdir}Makeaperl.Opt : \$(MAP_EXTRA)\n";
+ foreach (@optlibs) {
+ push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
+ }
+ push @m,"\n${tmpdir}PerlShr.Opt :\n\t";
+ push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
+
+ push @m,'
+$(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
+ $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
+$(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}PerlShr.Opt",'
+ $(MAP_LINKCMD) ',"${tmpdir}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
+ $(NOECHO) $(ECHO) "To install the new ""$(MAP_TARGET)"" binary, say"
+ $(NOECHO) $(ECHO) " $(MAKE)$(USEMAKEFILE)$(FIRST_MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
+ $(NOECHO) $(ECHO) "To remove the intermediate files, say
+ $(NOECHO) $(ECHO) " $(MAKE)$(USEMAKEFILE)$(FIRST_MAKEFILE) map_clean"
+';
+ push @m,"\n${tmpdir}perlmain.c : \$(FIRST_MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmpdir}Writemain.tmp\n";
+ push @m, "# More from the 255-char line length limit\n";
+ foreach (@staticpkgs) {
+ push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmpdir}Writemain.tmp\n];
+ }
+
+ push @m, sprintf <<'MAKE_FRAG', $tmpdir, $tmpdir;
+ $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" %sWritemain.tmp >$(MMS$TARGET)
+ $(NOECHO) $(RM_F) %sWritemain.tmp
+MAKE_FRAG
+
+ push @m, q[
+# Still more from the 255-char line length limit
+doc_inst_perl :
+ $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+ $(NOECHO) $(ECHO) "Perl binary $(MAP_TARGET)|" >.MM_tmp
+ $(NOECHO) $(ECHO) "MAP_STATIC|$(MAP_STATIC)|" >>.MM_tmp
+ $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
+ $(NOECHO) $(ECHO) -e "MAP_LIBPERL|$(MAP_LIBPERL)|" >>.MM_tmp
+ $(NOECHO) $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q[
+ $(NOECHO) $(RM_F) .MM_tmp
+];
+
+ push @m, "
+inst_perl : pure_inst_perl doc_inst_perl
+ \$(NOECHO) \$(NOOP)
+
+pure_inst_perl : \$(MAP_TARGET)
+ $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
+ $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
+
+clean :: map_clean
+ \$(NOECHO) \$(NOOP)
+
+map_clean :
+ \$(RM_F) ${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}perlmain.c \$(FIRST_MAKEFILE)
+ \$(RM_F) ${tmpdir}Makeaperl.Opt ${tmpdir}PerlShr.Opt \$(MAP_TARGET)
+";
+
+ join '', @m;
+}
+
+
+# --- Output postprocessing section ---
+
+=item maketext_filter (override)
+
+Insure that colons marking targets are preceded by space, in order
+to distinguish the target delimiter from a colon appearing as
+part of a filespec.
+
+=cut
+
+sub maketext_filter {
+ my($self, $text) = @_;
+
+ $text =~ s/^([^\s:=]+)(:+\s)/$1 $2/mg;
+ return $text;
+}
+
+=item prefixify (override)
+
+prefixifying on VMS is simple. Each should simply be:
+
+ perl_root:[some.dir]
+
+which can just be converted to:
+
+ volume:[your.prefix.some.dir]
+
+otherwise you get the default layout.
+
+In effect, your search prefix is ignored and $Config{vms_prefix} is
+used instead.
+
+=cut
+
+sub prefixify {
+ my($self, $var, $sprefix, $rprefix, $default) = @_;
+
+ # Translate $(PERLPREFIX) to a real path.
+ $rprefix = $self->eliminate_macros($rprefix);
+ $rprefix = vmspath($rprefix) if $rprefix;
+ $sprefix = vmspath($sprefix) if $sprefix;
+
+ $default = vmsify($default)
+ unless $default =~ /\[.*\]/;
+
+ (my $var_no_install = $var) =~ s/^install//;
+ my $path = $self->{uc $var} ||
+ $ExtUtils::MM_Unix::Config_Override{lc $var} ||
+ $Config{lc $var} || $Config{lc $var_no_install};
+
+ if( !$path ) {
+ print STDERR " no Config found for $var.\n" if $Verbose >= 2;
+ $path = $self->_prefixify_default($rprefix, $default);
+ }
+ elsif( !$self->{ARGS}{PREFIX} || !$self->file_name_is_absolute($path) ) {
+ # do nothing if there's no prefix or if its relative
+ }
+ elsif( $sprefix eq $rprefix ) {
+ print STDERR " no new prefix.\n" if $Verbose >= 2;
+ }
+ else {
+
+ print STDERR " prefixify $var => $path\n" if $Verbose >= 2;
+ print STDERR " from $sprefix to $rprefix\n" if $Verbose >= 2;
+
+ my($path_vol, $path_dirs) = $self->splitpath( $path );
+ if( $path_vol eq $Config{vms_prefix}.':' ) {
+ print STDERR " $Config{vms_prefix}: seen\n" if $Verbose >= 2;
+
+ $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
+ $path = $self->_catprefix($rprefix, $path_dirs);
+ }
+ else {
+ $path = $self->_prefixify_default($rprefix, $default);
+ }
+ }
+
+ print " now $path\n" if $Verbose >= 2;
+ return $self->{uc $var} = $path;
+}
+
+
+sub _prefixify_default {
+ my($self, $rprefix, $default) = @_;
+
+ print STDERR " cannot prefix, using default.\n" if $Verbose >= 2;
+
+ if( !$default ) {
+ print STDERR "No default!\n" if $Verbose >= 1;
+ return;
+ }
+ if( !$rprefix ) {
+ print STDERR "No replacement prefix!\n" if $Verbose >= 1;
+ return '';
+ }
+
+ return $self->_catprefix($rprefix, $default);
+}
+
+sub _catprefix {
+ my($self, $rprefix, $default) = @_;
+
+ my($rvol, $rdirs) = $self->splitpath($rprefix);
+ if( $rvol ) {
+ return $self->catpath($rvol,
+ $self->catdir($rdirs, $default),
+ ''
+ )
+ }
+ else {
+ return $self->catdir($rdirs, $default);
+ }
+}
+
+
+=item cd
+
+=cut
+
+sub cd {
+ my($self, $dir, @cmds) = @_;
+
+ $dir = vmspath($dir);
+
+ my $cmd = join "\n\t", map "$_", @cmds;
+
+ # No leading tab makes it look right when embedded
+ my $make_frag = sprintf <<'MAKE_FRAG', $dir, $cmd;
+startdir = F$Environment("Default")
+ Set Default %s
+ %s
+ Set Default 'startdir'
+MAKE_FRAG
+
+ # No trailing newline makes this easier to embed
+ chomp $make_frag;
+
+ return $make_frag;
+}
+
+
+=item oneliner
+
+=cut
+
+sub oneliner {
+ my($self, $cmd, $switches) = @_;
+ $switches = [] unless defined $switches;
+
+ # Strip leading and trailing newlines
+ $cmd =~ s{^\n+}{};
+ $cmd =~ s{\n+$}{};
+
+ $cmd = $self->quote_literal($cmd);
+ $cmd = $self->escape_newlines($cmd);
+
+ # Switches must be quoted else they will be lowercased.
+ $switches = join ' ', map { qq{"$_"} } @$switches;
+
+ return qq{\$(ABSPERLRUN) $switches -e $cmd "--"};
+}
+
+
+=item B<echo>
+
+perl trips up on "<foo>" thinking it's an input redirect. So we use the
+native Write command instead. Besides, its faster.
+
+=cut
+
+sub echo {
+ my($self, $text, $file, $appending) = @_;
+ $appending ||= 0;
+
+ my $opencmd = $appending ? 'Open/Append' : 'Open/Write';
+
+ my @cmds = ("\$(NOECHO) $opencmd MMECHOFILE $file ");
+ push @cmds, map { '$(NOECHO) Write MMECHOFILE '.$self->quote_literal($_) }
+ split /\n/, $text;
+ push @cmds, '$(NOECHO) Close MMECHOFILE';
+ return @cmds;
+}
+
+
+=item quote_literal
+
+=cut
+
+sub quote_literal {
+ my($self, $text) = @_;
+
+ # I believe this is all we should need.
+ $text =~ s{"}{""}g;
+
+ return qq{"$text"};
+}
+
+=item escape_newlines
+
+=cut
+
+sub escape_newlines {
+ my($self, $text) = @_;
+
+ $text =~ s{\n}{-\n}g;
+
+ return $text;
+}
+
+=item max_exec_len
+
+256 characters.
+
+=cut
+
+sub max_exec_len {
+ my $self = shift;
+
+ return $self->{_MAX_EXEC_LEN} ||= 256;
+}
+
+=item init_linker
+
+=cut
+
+sub init_linker {
+ my $self = shift;
+ $self->{EXPORT_LIST} ||= '$(BASEEXT).opt';
+
+ my $shr = $Config{dbgprefix} . 'PERLSHR';
+ if ($self->{PERL_SRC}) {
+ $self->{PERL_ARCHIVE} ||=
+ $self->catfile($self->{PERL_SRC}, "$shr.$Config{'dlext'}");
+ }
+ else {
+ $self->{PERL_ARCHIVE} ||=
+ $ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}";
+ }
+
+ $self->{PERL_ARCHIVE_AFTER} ||= '';
+}
+
+
+=item catdir (override)
+
+=item catfile (override)
+
+Eliminate the macros in the output to the MMS/MMK file.
+
+(File::Spec::VMS used to do this for us, but it's being removed)
+
+=cut
+
+sub catdir {
+ my $self = shift;
+
+ # Process the macros on VMS MMS/MMK
+ my @args = map { m{\$\(} ? $self->eliminate_macros($_) : $_ } @_;
+
+ my $dir = $self->SUPER::catdir(@args);
+
+ # Fix up the directory and force it to VMS format.
+ $dir = $self->fixpath($dir, 1);
+
+ return $dir;
+}
+
+sub catfile {
+ my $self = shift;
+
+ # Process the macros on VMS MMS/MMK
+ my @args = map { m{\$\(} ? $self->eliminate_macros($_) : $_ } @_;
+
+ my $file = $self->SUPER::catfile(@args);
+
+ $file = vmsify($file);
+
+ return $file
+}
+
+
+=item eliminate_macros
+
+Expands MM[KS]/Make macros in a text string, using the contents of
+identically named elements of C<%$self>, and returns the result
+as a file specification in Unix syntax.
+
+NOTE: This is the canonical version of the method. The version in
+File::Spec::VMS is deprecated.
+
+=cut
+
+sub eliminate_macros {
+ my($self,$path) = @_;
+ return '' unless $path;
+ $self = {} unless ref $self;
+
+ if ($path =~ /\s/) {
+ return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path;
+ }
+
+ my($npath) = unixify($path);
+ # sometimes unixify will return a string with an off-by-one trailing null
+ $npath =~ s{\0$}{};
+
+ my($complex) = 0;
+ my($head,$macro,$tail);
+
+ # perform m##g in scalar context so it acts as an iterator
+ while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) {
+ if (defined $self->{$2}) {
+ ($head,$macro,$tail) = ($1,$2,$3);
+ if (ref $self->{$macro}) {
+ if (ref $self->{$macro} eq 'ARRAY') {
+ $macro = join ' ', @{$self->{$macro}};
+ }
+ else {
+ print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
+ "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
+ $macro = "\cB$macro\cB";
+ $complex = 1;
+ }
+ }
+ else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
+ $npath = "$head$macro$tail";
+ }
+ }
+ if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
+ $npath;
+}
+
+=item fixpath
+
+ my $path = $mm->fixpath($path);
+ my $path = $mm->fixpath($path, $is_dir);
+
+Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
+in any directory specification, in order to avoid juxtaposing two
+VMS-syntax directories when MM[SK] is run. Also expands expressions which
+are all macro, so that we can tell how long the expansion is, and avoid
+overrunning DCL's command buffer when MM[KS] is running.
+
+fixpath() checks to see whether the result matches the name of a
+directory in the current default directory and returns a directory or
+file specification accordingly. C<$is_dir> can be set to true to
+force fixpath() to consider the path to be a directory or false to force
+it to be a file.
+
+NOTE: This is the canonical version of the method. The version in
+File::Spec::VMS is deprecated.
+
+=cut
+
+sub fixpath {
+ my($self,$path,$force_path) = @_;
+ return '' unless $path;
+ $self = bless {}, $self unless ref $self;
+ my($fixedpath,$prefix,$name);
+
+ if ($path =~ /[ \t]/) {
+ return join ' ',
+ map { $self->fixpath($_,$force_path) }
+ split /[ \t]+/, $path;
+ }
+
+ if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) {
+ if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
+ $fixedpath = vmspath($self->eliminate_macros($path));
+ }
+ else {
+ $fixedpath = vmsify($self->eliminate_macros($path));
+ }
+ }
+ elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
+ my($vmspre) = $self->eliminate_macros("\$($prefix)");
+ # is it a dir or just a name?
+ $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
+ $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
+ $fixedpath = vmspath($fixedpath) if $force_path;
+ }
+ else {
+ $fixedpath = $path;
+ $fixedpath = vmspath($fixedpath) if $force_path;
+ }
+ # No hints, so we try to guess
+ if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
+ $fixedpath = vmspath($fixedpath) if -d $fixedpath;
+ }
+
+ # Trim off root dirname if it's had other dirs inserted in front of it.
+ $fixedpath =~ s/\.000000([\]>])/$1/;
+ # Special case for VMS absolute directory specs: these will have had device
+ # prepended during trip through Unix syntax in eliminate_macros(), since
+ # Unix syntax has no way to express "absolute from the top of this device's
+ # directory tree".
+ if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }
+
+ return $fixedpath;
+}
+
+
+=item os_flavor
+
+VMS is VMS.
+
+=cut
+
+sub os_flavor {
+ return('VMS');
+}
+
+=back
+
+
+=head1 AUTHOR
+
+Original author Charles Bailey F<bailey@newman.upenn.edu>
+
+Maintained by Michael G Schwern F<schwern@pobox.com>
+
+See L<ExtUtils::MakeMaker> for patching and contact information.
+
+
+=cut
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_VOS.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_VOS.pm
new file mode 100755
index 00000000000..1814a1dae4c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_VOS.pm
@@ -0,0 +1,50 @@
+package ExtUtils::MM_VOS;
+
+use strict;
+our $VERSION = '6.56';
+
+require ExtUtils::MM_Unix;
+our @ISA = qw(ExtUtils::MM_Unix);
+
+
+=head1 NAME
+
+ExtUtils::MM_VOS - VOS specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+ Don't use this module directly.
+ Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality for
+VOS.
+
+Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=head3 extra_clean_files
+
+Cleanup VOS core files
+
+=cut
+
+sub extra_clean_files {
+ return qw(*.kp);
+}
+
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Win32.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Win32.pm
new file mode 100755
index 00000000000..19e462de593
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Win32.pm
@@ -0,0 +1,585 @@
+package ExtUtils::MM_Win32;
+
+use strict;
+
+
+=head1 NAME
+
+ExtUtils::MM_Win32 - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_Win32; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=cut
+
+use ExtUtils::MakeMaker::Config;
+use File::Basename;
+use File::Spec;
+use ExtUtils::MakeMaker qw( neatvalue );
+
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+our $VERSION = '6.56';
+
+$ENV{EMXSHELL} = 'sh'; # to run `commands`
+
+my $BORLAND = $Config{'cc'} =~ /^bcc/i ? 1 : 0;
+my $GCC = $Config{'cc'} =~ /\bgcc$/i ? 1 : 0;
+my $DLLTOOL = $Config{'dlltool'} || 'dlltool';
+
+
+=head2 Overridden methods
+
+=over 4
+
+=item B<dlsyms>
+
+=cut
+
+sub dlsyms {
+ my($self,%attribs) = @_;
+
+ my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
+ my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
+ my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
+ my($imports) = $attribs{IMPORTS} || $self->{IMPORTS} || {};
+ my(@m);
+
+ if (not $self->{SKIPHASH}{'dynamic'}) {
+ push(@m,"
+$self->{BASEEXT}.def: Makefile.PL
+",
+ q! $(PERLRUN) -MExtUtils::Mksymlists \\
+ -e "Mksymlists('NAME'=>\"!, $self->{NAME},
+ q!\", 'DLBASE' => '!,$self->{DLBASE},
+ # The above two lines quoted differently to work around
+ # a bug in the 4DOS/4NT command line interpreter. The visible
+ # result of the bug was files named q('extension_name',) *with the
+ # single quotes and the comma* in the extension build directories.
+ q!', 'DL_FUNCS' => !,neatvalue($funcs),
+ q!, 'FUNCLIST' => !,neatvalue($funclist),
+ q!, 'IMPORTS' => !,neatvalue($imports),
+ q!, 'DL_VARS' => !, neatvalue($vars), q!);"
+!);
+ }
+ join('',@m);
+}
+
+=item replace_manpage_separator
+
+Changes the path separator with .
+
+=cut
+
+sub replace_manpage_separator {
+ my($self,$man) = @_;
+ $man =~ s,/+,.,g;
+ $man;
+}
+
+
+=item B<maybe_command>
+
+Since Windows has nothing as simple as an executable bit, we check the
+file extension.
+
+The PATHEXT env variable will be used to get a list of extensions that
+might indicate a command, otherwise .com, .exe, .bat and .cmd will be
+used by default.
+
+=cut
+
+sub maybe_command {
+ my($self,$file) = @_;
+ my @e = exists($ENV{'PATHEXT'})
+ ? split(/;/, $ENV{PATHEXT})
+ : qw(.com .exe .bat .cmd);
+ my $e = '';
+ for (@e) { $e .= "\Q$_\E|" }
+ chop $e;
+ # see if file ends in one of the known extensions
+ if ($file =~ /($e)$/i) {
+ return $file if -e $file;
+ }
+ else {
+ for (@e) {
+ return "$file$_" if -e "$file$_";
+ }
+ }
+ return;
+}
+
+
+=item B<init_DIRFILESEP>
+
+Using \ for Windows.
+
+=cut
+
+sub init_DIRFILESEP {
+ my($self) = shift;
+
+ # The ^ makes sure its not interpreted as an escape in nmake
+ $self->{DIRFILESEP} = $self->is_make_type('nmake') ? '^\\' :
+ $self->is_make_type('dmake') ? '\\\\'
+ : '\\';
+}
+
+=item B<init_others>
+
+Override some of the Unix specific commands with portable
+ExtUtils::Command ones.
+
+Also provide defaults for LD and AR in case the %Config values aren't
+set.
+
+LDLOADLIBS's default is changed to $Config{libs}.
+
+Adjustments are made for Borland's quirks needing -L to come first.
+
+=cut
+
+sub init_others {
+ my ($self) = @_;
+
+ $self->{NOOP} ||= 'rem';
+ $self->{DEV_NULL} ||= '> NUL';
+
+ $self->{FIXIN} ||= $self->{PERL_CORE} ?
+ "\$(PERLRUN) $self->{PERL_SRC}/win32/bin/pl2bat.pl" :
+ 'pl2bat.bat';
+
+ $self->{LD} ||= 'link';
+ $self->{AR} ||= 'lib';
+
+ $self->SUPER::init_others;
+
+ # Setting SHELL from $Config{sh} can break dmake. Its ok without it.
+ delete $self->{SHELL};
+
+ $self->{LDLOADLIBS} ||= $Config{libs};
+ # -Lfoo must come first for Borland, so we put it in LDDLFLAGS
+ if ($BORLAND) {
+ my $libs = $self->{LDLOADLIBS};
+ my $libpath = '';
+ while ($libs =~ s/(?:^|\s)(("?)-L.+?\2)(?:\s|$)/ /) {
+ $libpath .= ' ' if length $libpath;
+ $libpath .= $1;
+ }
+ $self->{LDLOADLIBS} = $libs;
+ $self->{LDDLFLAGS} ||= $Config{lddlflags};
+ $self->{LDDLFLAGS} .= " $libpath";
+ }
+
+ return 1;
+}
+
+
+=item init_platform
+
+Add MM_Win32_VERSION.
+
+=item platform_constants
+
+=cut
+
+sub init_platform {
+ my($self) = shift;
+
+ $self->{MM_Win32_VERSION} = $VERSION;
+}
+
+sub platform_constants {
+ my($self) = shift;
+ my $make_frag = '';
+
+ foreach my $macro (qw(MM_Win32_VERSION))
+ {
+ next unless defined $self->{$macro};
+ $make_frag .= "$macro = $self->{$macro}\n";
+ }
+
+ return $make_frag;
+}
+
+
+=item special_targets
+
+Add .USESHELL target for dmake.
+
+=cut
+
+sub special_targets {
+ my($self) = @_;
+
+ my $make_frag = $self->SUPER::special_targets;
+
+ $make_frag .= <<'MAKE_FRAG' if $self->is_make_type('dmake');
+.USESHELL :
+MAKE_FRAG
+
+ return $make_frag;
+}
+
+
+=item static_lib
+
+Changes how to run the linker.
+
+The rest is duplicate code from MM_Unix. Should move the linker code
+to its own method.
+
+=cut
+
+sub static_lib {
+ my($self) = @_;
+ return '' unless $self->has_link_code;
+
+ my(@m);
+ push(@m, <<'END');
+$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists
+ $(RM_RF) $@
+END
+
+ # If this extension has its own library (eg SDBM_File)
+ # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
+ push @m, <<'MAKE_FRAG' if $self->{MYEXTLIB};
+ $(CP) $(MYEXTLIB) $@
+MAKE_FRAG
+
+ push @m,
+q{ $(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")'
+ : ($GCC ? '-ru $@ $(OBJECT)'
+ : '-out:$@ $(OBJECT)')).q{
+ $(CHMOD) $(PERM_RWX) $@
+ $(NOECHO) $(ECHO) "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
+};
+
+ # Old mechanism - still available:
+ push @m, <<'MAKE_FRAG' if $self->{PERL_SRC} && $self->{EXTRALIBS};
+ $(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs
+MAKE_FRAG
+
+ join('', @m);
+}
+
+
+=item dynamic_lib
+
+Complicated stuff for Win32 that I don't understand. :(
+
+=cut
+
+sub dynamic_lib {
+ my($self, %attribs) = @_;
+ return '' unless $self->needs_linking(); #might be because of a subdir
+
+ return '' unless $self->has_link_code;
+
+ my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
+ my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
+ my($ldfrom) = '$(LDFROM)';
+ my(@m);
+
+# one thing for GCC/Mingw32:
+# we try to overcome non-relocateable-DLL problems by generating
+# a (hopefully unique) image-base from the dll's name
+# -- BKS, 10-19-1999
+ if ($GCC) {
+ my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
+ $dllname =~ /(....)(.{0,4})/;
+ my $baseaddr = unpack("n", $1 ^ $2);
+ $otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
+ }
+
+ push(@m,'
+# This section creates the dynamically loadable $(INST_DYNAMIC)
+# from $(OBJECT) and possibly $(MYEXTLIB).
+OTHERLDFLAGS = '.$otherldflags.'
+INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
+
+$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
+');
+ if ($GCC) {
+ push(@m,
+ q{ }.$DLLTOOL.q{ --def $(EXPORT_LIST) --output-exp dll.exp
+ $(LD) -o $@ -Wl,--base-file -Wl,dll.base $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp
+ }.$DLLTOOL.q{ --def $(EXPORT_LIST) --base-file dll.base --output-exp dll.exp
+ $(LD) -o $@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp });
+ } elsif ($BORLAND) {
+ push(@m,
+ q{ $(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) }.$ldfrom.q{,$@,,}
+ .($self->is_make_type('dmake')
+ ? q{$(PERL_ARCHIVE:s,/,\,) $(LDLOADLIBS:s,/,\,) }
+ .q{$(MYEXTLIB:s,/,\,),$(EXPORT_LIST:s,/,\,)}
+ : q{$(subst /,\,$(PERL_ARCHIVE)) $(subst /,\,$(LDLOADLIBS)) }
+ .q{$(subst /,\,$(MYEXTLIB)),$(subst /,\,$(EXPORT_LIST))})
+ .q{,$(RESFILES)});
+ } else { # VC
+ push(@m,
+ q{ $(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) }
+ .q{$(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)});
+
+ # Embed the manifest file if it exists
+ push(@m, q{
+ if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;2
+ if exist $@.manifest del $@.manifest});
+ }
+ push @m, '
+ $(CHMOD) $(PERM_RWX) $@
+';
+
+ join('',@m);
+}
+
+=item extra_clean_files
+
+Clean out some extra dll.{base,exp} files which might be generated by
+gcc. Otherwise, take out all *.pdb files.
+
+=cut
+
+sub extra_clean_files {
+ my $self = shift;
+
+ return $GCC ? (qw(dll.base dll.exp)) : ('*.pdb');
+}
+
+=item init_linker
+
+=cut
+
+sub init_linker {
+ my $self = shift;
+
+ $self->{PERL_ARCHIVE} = "\$(PERL_INC)\\$Config{libperl}";
+ $self->{PERL_ARCHIVE_AFTER} = '';
+ $self->{EXPORT_LIST} = '$(BASEEXT).def';
+}
+
+
+=item perl_script
+
+Checks for the perl program under several common perl extensions.
+
+=cut
+
+sub perl_script {
+ my($self,$file) = @_;
+ return $file if -r $file && -f _;
+ return "$file.pl" if -r "$file.pl" && -f _;
+ return "$file.plx" if -r "$file.plx" && -f _;
+ return "$file.bat" if -r "$file.bat" && -f _;
+ return;
+}
+
+
+=item xs_o
+
+This target is stubbed out. Not sure why.
+
+=cut
+
+sub xs_o {
+ return ''
+}
+
+
+=item pasthru
+
+All we send is -nologo to nmake to prevent it from printing its damned
+banner.
+
+=cut
+
+sub pasthru {
+ my($self) = shift;
+ return "PASTHRU = " . ($self->is_make_type('nmake') ? "-nologo" : "");
+}
+
+
+=item arch_check (override)
+
+Normalize all arguments for consistency of comparison.
+
+=cut
+
+sub arch_check {
+ my $self = shift;
+
+ # Win32 is an XS module, minperl won't have it.
+ # arch_check() is not critical, so just fake it.
+ return 1 unless $self->can_load_xs;
+ return $self->SUPER::arch_check( map { $self->_normalize_path_name($_) } @_);
+}
+
+sub _normalize_path_name {
+ my $self = shift;
+ my $file = shift;
+
+ require Win32;
+ my $short = Win32::GetShortPathName($file);
+ return defined $short ? lc $short : lc $file;
+}
+
+
+=item oneliner
+
+These are based on what command.com does on Win98. They may be wrong
+for other Windows shells, I don't know.
+
+=cut
+
+sub oneliner {
+ my($self, $cmd, $switches) = @_;
+ $switches = [] unless defined $switches;
+
+ # Strip leading and trailing newlines
+ $cmd =~ s{^\n+}{};
+ $cmd =~ s{\n+$}{};
+
+ $cmd = $self->quote_literal($cmd);
+ $cmd = $self->escape_newlines($cmd);
+
+ $switches = join ' ', @$switches;
+
+ return qq{\$(ABSPERLRUN) $switches -e $cmd --};
+}
+
+
+sub quote_literal {
+ my($self, $text) = @_;
+
+ # I don't know if this is correct, but it seems to work on
+ # Win98's command.com
+ $text =~ s{"}{\\"}g;
+
+ # dmake eats '{' inside double quotes and leaves alone { outside double
+ # quotes; however it transforms {{ into { either inside and outside double
+ # quotes. It also translates }} into }. The escaping below is not
+ # 100% correct.
+ if( $self->is_make_type('dmake') ) {
+ $text =~ s/{/{{/g;
+ $text =~ s/}}/}}}/g;
+ }
+
+ return qq{"$text"};
+}
+
+
+sub escape_newlines {
+ my($self, $text) = @_;
+
+ # Escape newlines
+ $text =~ s{\n}{\\\n}g;
+
+ return $text;
+}
+
+
+=item cd
+
+dmake can handle Unix style cd'ing but nmake (at least 1.5) cannot. It
+wants:
+
+ cd dir1\dir2
+ command
+ another_command
+ cd ..\..
+
+=cut
+
+sub cd {
+ my($self, $dir, @cmds) = @_;
+
+ return $self->SUPER::cd($dir, @cmds) unless $self->is_make_type('nmake');
+
+ my $cmd = join "\n\t", map "$_", @cmds;
+
+ my $updirs = $self->catdir(map { $self->updir } $self->splitdir($dir));
+
+ # No leading tab and no trailing newline makes for easier embedding.
+ my $make_frag = sprintf <<'MAKE_FRAG', $dir, $cmd, $updirs;
+cd %s
+ %s
+ cd %s
+MAKE_FRAG
+
+ chomp $make_frag;
+
+ return $make_frag;
+}
+
+
+=item max_exec_len
+
+nmake 1.50 limits command length to 2048 characters.
+
+=cut
+
+sub max_exec_len {
+ my $self = shift;
+
+ return $self->{_MAX_EXEC_LEN} ||= 2 * 1024;
+}
+
+
+=item os_flavor
+
+Windows is Win32.
+
+=cut
+
+sub os_flavor {
+ return('Win32');
+}
+
+
+=item cflags
+
+Defines the PERLDLL symbol if we are configured for static building since all
+code destined for the perl5xx.dll must be compiled with the PERLDLL symbol
+defined.
+
+=cut
+
+sub cflags {
+ my($self,$libperl)=@_;
+ return $self->{CFLAGS} if $self->{CFLAGS};
+ return '' unless $self->needs_linking();
+
+ my $base = $self->SUPER::cflags($libperl);
+ foreach (split /\n/, $base) {
+ /^(\S*)\s*=\s*(\S*)$/ and $self->{$1} = $2;
+ };
+ $self->{CCFLAGS} .= " -DPERLDLL" if ($self->{LINKTYPE} eq 'static');
+
+ return $self->{CFLAGS} = qq{
+CCFLAGS = $self->{CCFLAGS}
+OPTIMIZE = $self->{OPTIMIZE}
+PERLTYPE = $self->{PERLTYPE}
+};
+
+}
+
+sub is_make_type {
+ my($self, $type) = @_;
+ return !! ($self->make =~ /\b$type(?:\.exe)?$/);
+}
+
+1;
+__END__
+
+=back
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Win95.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Win95.pm
new file mode 100755
index 00000000000..c47147695e8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MM_Win95.pm
@@ -0,0 +1,124 @@
+package ExtUtils::MM_Win95;
+
+use strict;
+
+our $VERSION = '6.56';
+
+require ExtUtils::MM_Win32;
+our @ISA = qw(ExtUtils::MM_Win32);
+
+use ExtUtils::MakeMaker::Config;
+
+
+=head1 NAME
+
+ExtUtils::MM_Win95 - method to customize MakeMaker for Win9X
+
+=head1 SYNOPSIS
+
+ You should not be using this module directly.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Win32 containing changes necessary
+to get MakeMaker playing nice with command.com and other Win9Xisms.
+
+=head2 Overridden methods
+
+Most of these make up for limitations in the Win9x/nmake command shell.
+Mostly its lack of &&.
+
+=over 4
+
+
+=item xs_c
+
+The && problem.
+
+=cut
+
+sub xs_c {
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+.xs.c:
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
+ '
+}
+
+
+=item xs_cpp
+
+The && problem
+
+=cut
+
+sub xs_cpp {
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+.xs.cpp:
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.cpp
+ ';
+}
+
+=item xs_o
+
+The && problem.
+
+=cut
+
+sub xs_o {
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+.xs$(OBJ_EXT):
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
+ $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
+ ';
+}
+
+
+=item max_exec_len
+
+Win98 chokes on things like Encode if we set the max length to nmake's max
+of 2K. So we go for a more conservative value of 1K.
+
+=cut
+
+sub max_exec_len {
+ my $self = shift;
+
+ return $self->{_MAX_EXEC_LEN} ||= 1024;
+}
+
+
+=item os_flavor
+
+Win95 and Win98 and WinME are collectively Win9x and Win32
+
+=cut
+
+sub os_flavor {
+ my $self = shift;
+ return ($self->SUPER::os_flavor, 'Win9x');
+}
+
+
+=back
+
+
+=head1 AUTHOR
+
+Code originally inside MM_Win32. Original author unknown.
+
+Currently maintained by Michael G Schwern C<schwern@pobox.com>.
+
+Send patches and ideas to C<makemaker@perl.org>.
+
+See http://www.makemaker.org.
+
+=cut
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MY.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MY.pm
new file mode 100755
index 00000000000..bed177d210a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MY.pm
@@ -0,0 +1,40 @@
+package ExtUtils::MY;
+
+use strict;
+require ExtUtils::MM;
+
+our $VERSION = 6.56;
+our @ISA = qw(ExtUtils::MM);
+
+{
+ package MY;
+ our @ISA = qw(ExtUtils::MY);
+}
+
+sub DESTROY {}
+
+
+=head1 NAME
+
+ExtUtils::MY - ExtUtils::MakeMaker subclass for customization
+
+=head1 SYNOPSIS
+
+ # in your Makefile.PL
+ sub MY::whatever {
+ ...
+ }
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY>
+
+ExtUtils::MY is a subclass of ExtUtils::MM. Its provided in your
+Makefile.PL for you to add and override MakeMaker functionality.
+
+It also provides a convenient alias via the MY class.
+
+ExtUtils::MY might turn out to be a temporary solution, but MY won't
+go away.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker.pm
new file mode 100755
index 00000000000..4422b686ce7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker.pm
@@ -0,0 +1,2807 @@
+# $Id$
+package ExtUtils::MakeMaker;
+
+use strict;
+
+BEGIN {require 5.006;}
+
+require Exporter;
+use ExtUtils::MakeMaker::Config;
+use Carp ();
+use File::Path;
+
+our $Verbose = 0; # exported
+our @Parent; # needs to be localized
+our @Get_from_Config; # referenced by MM_Unix
+our @MM_Sections;
+our @Overridable;
+my @Prepend_parent;
+my %Recognized_Att_Keys;
+
+our $VERSION = '6.56';
+
+# Emulate something resembling CVS $Revision$
+(our $Revision = $VERSION) =~ s{_}{};
+$Revision = int $Revision * 10000;
+
+our $Filename = __FILE__; # referenced outside MakeMaker
+
+our @ISA = qw(Exporter);
+our @EXPORT = qw(&WriteMakefile &writeMakefile $Verbose &prompt);
+our @EXPORT_OK = qw($VERSION &neatvalue &mkbootstrap &mksymlists
+ &WriteEmptyMakefile);
+
+# These will go away once the last of the Win32 & VMS specific code is
+# purged.
+my $Is_VMS = $^O eq 'VMS';
+my $Is_Win32 = $^O eq 'MSWin32';
+
+full_setup();
+
+require ExtUtils::MM; # Things like CPAN assume loading ExtUtils::MakeMaker
+ # will give them MM.
+
+require ExtUtils::MY; # XXX pre-5.8 versions of ExtUtils::Embed expect
+ # loading ExtUtils::MakeMaker will give them MY.
+ # This will go when Embed is its own CPAN module.
+
+
+sub WriteMakefile {
+ Carp::croak "WriteMakefile: Need even number of args" if @_ % 2;
+
+ require ExtUtils::MY;
+ my %att = @_;
+
+ _verify_att(\%att);
+
+ my $mm = MM->new(\%att);
+ $mm->flush;
+
+ return $mm;
+}
+
+
+# Basic signatures of the attributes WriteMakefile takes. Each is the
+# reference type. Empty value indicate it takes a non-reference
+# scalar.
+my %Att_Sigs;
+my %Special_Sigs = (
+ C => 'ARRAY',
+ CONFIG => 'ARRAY',
+ CONFIGURE => 'CODE',
+ DIR => 'ARRAY',
+ DL_FUNCS => 'HASH',
+ DL_VARS => 'ARRAY',
+ EXCLUDE_EXT => 'ARRAY',
+ EXE_FILES => 'ARRAY',
+ FUNCLIST => 'ARRAY',
+ H => 'ARRAY',
+ IMPORTS => 'HASH',
+ INCLUDE_EXT => 'ARRAY',
+ LIBS => ['ARRAY',''],
+ MAN1PODS => 'HASH',
+ MAN3PODS => 'HASH',
+ META_ADD => 'HASH',
+ META_MERGE => 'HASH',
+ PL_FILES => 'HASH',
+ PM => 'HASH',
+ PMLIBDIRS => 'ARRAY',
+ PMLIBPARENTDIRS => 'ARRAY',
+ PREREQ_PM => 'HASH',
+ BUILD_REQUIRES => 'HASH',
+ CONFIGURE_REQUIRES => 'HASH',
+ SKIP => 'ARRAY',
+ TYPEMAPS => 'ARRAY',
+ XS => 'HASH',
+ VERSION => ['version',''],
+ _KEEP_AFTER_FLUSH => '',
+
+ clean => 'HASH',
+ depend => 'HASH',
+ dist => 'HASH',
+ dynamic_lib=> 'HASH',
+ linkext => 'HASH',
+ macro => 'HASH',
+ postamble => 'HASH',
+ realclean => 'HASH',
+ test => 'HASH',
+ tool_autosplit => 'HASH',
+);
+
+@Att_Sigs{keys %Recognized_Att_Keys} = ('') x keys %Recognized_Att_Keys;
+@Att_Sigs{keys %Special_Sigs} = values %Special_Sigs;
+
+
+sub _verify_att {
+ my($att) = @_;
+
+ while( my($key, $val) = each %$att ) {
+ my $sig = $Att_Sigs{$key};
+ unless( defined $sig ) {
+ warn "WARNING: $key is not a known parameter.\n";
+ next;
+ }
+
+ my @sigs = ref $sig ? @$sig : $sig;
+ my $given = ref $val;
+ unless( grep { _is_of_type($val, $_) } @sigs ) {
+ my $takes = join " or ", map { _format_att($_) } @sigs;
+
+ my $has = _format_att($given);
+ warn "WARNING: $key takes a $takes not a $has.\n".
+ " Please inform the author.\n";
+ }
+ }
+}
+
+
+# Check if a given thing is a reference or instance of $type
+sub _is_of_type {
+ my($thing, $type) = @_;
+
+ return 1 if ref $thing eq $type;
+
+ local $SIG{__DIE__};
+ return 1 if eval{ $thing->isa($type) };
+
+ return 0;
+}
+
+
+sub _format_att {
+ my $given = shift;
+
+ return $given eq '' ? "string/number"
+ : uc $given eq $given ? "$given reference"
+ : "$given object"
+ ;
+}
+
+
+sub prompt ($;$) { ## no critic
+ my($mess, $def) = @_;
+ Carp::confess("prompt function called without an argument")
+ unless defined $mess;
+
+ my $isa_tty = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ;
+
+ my $dispdef = defined $def ? "[$def] " : " ";
+ $def = defined $def ? $def : "";
+
+ local $|=1;
+ local $\;
+ print "$mess $dispdef";
+
+ my $ans;
+ if ($ENV{PERL_MM_USE_DEFAULT} || (!$isa_tty && eof STDIN)) {
+ print "$def\n";
+ }
+ else {
+ $ans = <STDIN>;
+ if( defined $ans ) {
+ chomp $ans;
+ }
+ else { # user hit ctrl-D
+ print "\n";
+ }
+ }
+
+ return (!defined $ans || $ans eq '') ? $def : $ans;
+}
+
+sub eval_in_subdirs {
+ my($self) = @_;
+ use Cwd qw(cwd abs_path);
+ my $pwd = cwd() || die "Can't figure out your cwd!";
+
+ local @INC = map eval {abs_path($_) if -e} || $_, @INC;
+ push @INC, '.'; # '.' has to always be at the end of @INC
+
+ foreach my $dir (@{$self->{DIR}}){
+ my($abs) = $self->catdir($pwd,$dir);
+ eval { $self->eval_in_x($abs); };
+ last if $@;
+ }
+ chdir $pwd;
+ die $@ if $@;
+}
+
+sub eval_in_x {
+ my($self,$dir) = @_;
+ chdir $dir or Carp::carp("Couldn't change to directory $dir: $!");
+
+ {
+ package main;
+ do './Makefile.PL';
+ };
+ if ($@) {
+# if ($@ =~ /prerequisites/) {
+# die "MakeMaker WARNING: $@";
+# } else {
+# warn "WARNING from evaluation of $dir/Makefile.PL: $@";
+# }
+ die "ERROR from evaluation of $dir/Makefile.PL: $@";
+ }
+}
+
+
+# package name for the classes into which the first object will be blessed
+my $PACKNAME = 'PACK000';
+
+sub full_setup {
+ $Verbose ||= 0;
+
+ my @attrib_help = qw/
+
+ AUTHOR ABSTRACT ABSTRACT_FROM BINARY_LOCATION
+ C CAPI CCFLAGS CONFIG CONFIGURE DEFINE DIR DISTNAME DISTVNAME
+ DL_FUNCS DL_VARS
+ EXCLUDE_EXT EXE_FILES FIRST_MAKEFILE
+ FULLPERL FULLPERLRUN FULLPERLRUNINST
+ FUNCLIST H IMPORTS
+
+ INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB INST_MAN1DIR INST_MAN3DIR
+ INSTALLDIRS
+ DESTDIR PREFIX INSTALL_BASE
+ PERLPREFIX SITEPREFIX VENDORPREFIX
+ INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB
+ INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH
+ INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN
+ INSTALLMAN1DIR INSTALLMAN3DIR
+ INSTALLSITEMAN1DIR INSTALLSITEMAN3DIR
+ INSTALLVENDORMAN1DIR INSTALLVENDORMAN3DIR
+ INSTALLSCRIPT INSTALLSITESCRIPT INSTALLVENDORSCRIPT
+ PERL_LIB PERL_ARCHLIB
+ SITELIBEXP SITEARCHEXP
+
+ INC INCLUDE_EXT LDFROM LIB LIBPERL_A LIBS LICENSE
+ LINKTYPE MAKE MAKEAPERL MAKEFILE MAKEFILE_OLD MAN1PODS MAN3PODS MAP_TARGET
+ META_ADD META_MERGE MIN_PERL_VERSION BUILD_REQUIRES CONFIGURE_REQUIRES
+ MYEXTLIB NAME NEEDS_LINKING NOECHO NO_META NORECURS NO_VC OBJECT OPTIMIZE
+ PERL_MALLOC_OK PERL PERLMAINCC PERLRUN PERLRUNINST PERL_CORE
+ PERL_SRC PERM_DIR PERM_RW PERM_RWX
+ PL_FILES PM PM_FILTER PMLIBDIRS PMLIBPARENTDIRS POLLUTE PPM_INSTALL_EXEC
+ PPM_INSTALL_SCRIPT PREREQ_FATAL PREREQ_PM PREREQ_PRINT PRINT_PREREQ
+ SIGN SKIP TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG
+ XS_VERSION clean depend dist dynamic_lib linkext macro realclean
+ tool_autosplit
+
+ MACPERL_SRC MACPERL_LIB MACLIBS_68K MACLIBS_PPC MACLIBS_SC MACLIBS_MRC
+ MACLIBS_ALL_68K MACLIBS_ALL_PPC MACLIBS_SHARED
+ /;
+
+ # IMPORTS is used under OS/2 and Win32
+
+ # @Overridable is close to @MM_Sections but not identical. The
+ # order is important. Many subroutines declare macros. These
+ # depend on each other. Let's try to collect the macros up front,
+ # then pasthru, then the rules.
+
+ # MM_Sections are the sections we have to call explicitly
+ # in Overridable we have subroutines that are used indirectly
+
+
+ @MM_Sections =
+ qw(
+
+ post_initialize const_config constants platform_constants
+ tool_autosplit tool_xsubpp tools_other
+
+ makemakerdflt
+
+ dist macro depend cflags const_loadlibs const_cccmd
+ post_constants
+
+ pasthru
+
+ special_targets
+ c_o xs_c xs_o
+ top_targets blibdirs linkext dlsyms dynamic dynamic_bs
+ dynamic_lib static static_lib manifypods processPL
+ installbin subdirs
+ clean_subdirs clean realclean_subdirs realclean
+ metafile signature
+ dist_basics dist_core distdir dist_test dist_ci distmeta distsignature
+ install force perldepend makefile staticmake test ppd
+
+ ); # loses section ordering
+
+ @Overridable = @MM_Sections;
+ push @Overridable, qw[
+
+ libscan makeaperl needs_linking
+ subdir_x test_via_harness test_via_script
+
+ init_VERSION init_dist init_INST init_INSTALL init_DEST init_dirscan
+ init_PM init_MANPODS init_xs init_PERL init_DIRFILESEP init_linker
+ ];
+
+ push @MM_Sections, qw[
+
+ pm_to_blib selfdocument
+
+ ];
+
+ # Postamble needs to be the last that was always the case
+ push @MM_Sections, "postamble";
+ push @Overridable, "postamble";
+
+ # All sections are valid keys.
+ @Recognized_Att_Keys{@MM_Sections} = (1) x @MM_Sections;
+
+ # we will use all these variables in the Makefile
+ @Get_from_Config =
+ qw(
+ ar cc cccdlflags ccdlflags dlext dlsrc exe_ext full_ar ld
+ lddlflags ldflags libc lib_ext obj_ext osname osvers ranlib
+ sitelibexp sitearchexp so
+ );
+
+ # 5.5.3 doesn't have any concept of vendor libs
+ push @Get_from_Config, qw( vendorarchexp vendorlibexp ) if $] >= 5.006;
+
+ foreach my $item (@attrib_help){
+ $Recognized_Att_Keys{$item} = 1;
+ }
+ foreach my $item (@Get_from_Config) {
+ $Recognized_Att_Keys{uc $item} = $Config{$item};
+ print "Attribute '\U$item\E' => '$Config{$item}'\n"
+ if ($Verbose >= 2);
+ }
+
+ #
+ # When we eval a Makefile.PL in a subdirectory, that one will ask
+ # us (the parent) for the values and will prepend "..", so that
+ # all files to be installed end up below OUR ./blib
+ #
+ @Prepend_parent = qw(
+ INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT
+ MAP_TARGET INST_MAN1DIR INST_MAN3DIR PERL_SRC
+ PERL FULLPERL
+ );
+}
+
+sub writeMakefile {
+ die <<END;
+
+The extension you are trying to build apparently is rather old and
+most probably outdated. We detect that from the fact, that a
+subroutine "writeMakefile" is called, and this subroutine is not
+supported anymore since about October 1994.
+
+Please contact the author or look into CPAN (details about CPAN can be
+found in the FAQ and at http:/www.perl.com) for a more recent version
+of the extension. If you're really desperate, you can try to change
+the subroutine name from writeMakefile to WriteMakefile and rerun
+'perl Makefile.PL', but you're most probably left alone, when you do
+so.
+
+The MakeMaker team
+
+END
+}
+
+sub new {
+ my($class,$self) = @_;
+ my($key);
+
+ # Store the original args passed to WriteMakefile()
+ foreach my $k (keys %$self) {
+ $self->{ARGS}{$k} = $self->{$k};
+ }
+
+ $self = {} unless defined $self;
+
+ $self->{PREREQ_PM} ||= {};
+ $self->{BUILD_REQUIRES} ||= {};
+
+ # Temporarily bless it into MM so it can be used as an
+ # object. It will be blessed into a temp package later.
+ bless $self, "MM";
+
+ if ("@ARGV" =~ /\bPREREQ_PRINT\b/) {
+ $self->_PREREQ_PRINT;
+ }
+
+ # PRINT_PREREQ is RedHatism.
+ if ("@ARGV" =~ /\bPRINT_PREREQ\b/) {
+ $self->_PRINT_PREREQ;
+ }
+
+ print STDOUT "MakeMaker (v$VERSION)\n" if $Verbose;
+ if (-f "MANIFEST" && ! -f "Makefile"){
+ check_manifest();
+ }
+
+ check_hints($self);
+
+ # Translate X.Y.Z to X.00Y00Z
+ if( defined $self->{MIN_PERL_VERSION} ) {
+ $self->{MIN_PERL_VERSION} =~ s{ ^ (\d+) \. (\d+) \. (\d+) $ }
+ {sprintf "%d.%03d%03d", $1, $2, $3}ex;
+ }
+
+ my $perl_version_ok = eval {
+ local $SIG{__WARN__} = sub {
+ # simulate "use warnings FATAL => 'all'" for vintage perls
+ die @_;
+ };
+ !$self->{MIN_PERL_VERSION} or $self->{MIN_PERL_VERSION} <= $]
+ };
+ if (!$perl_version_ok) {
+ if (!defined $perl_version_ok) {
+ warn <<'END';
+Warning: MIN_PERL_VERSION is not in a recognized format.
+Recommended is a quoted numerical value like '5.005' or '5.008001'.
+END
+ }
+ elsif ($self->{PREREQ_FATAL}) {
+ die sprintf <<"END", $self->{MIN_PERL_VERSION}, $];
+MakeMaker FATAL: perl version too low for this distribution.
+Required is %s. We run %s.
+END
+ }
+ else {
+ warn sprintf
+ "Warning: Perl version %s or higher required. We run %s.\n",
+ $self->{MIN_PERL_VERSION}, $];
+ }
+ }
+
+ my %configure_att; # record &{$self->{CONFIGURE}} attributes
+ my(%initial_att) = %$self; # record initial attributes
+
+ my(%unsatisfied) = ();
+ my $prereqs = $self->_all_prereqs;
+ foreach my $prereq (sort keys %$prereqs) {
+ my $required_version = $prereqs->{$prereq};
+
+ my $installed_file = MM->_installed_file_for_module($prereq);
+ my $pr_version = 0;
+ $pr_version = MM->parse_version($installed_file) if $installed_file;
+ $pr_version = 0 if $pr_version eq 'undef';
+
+ # convert X.Y_Z alpha version #s to X.YZ for easier comparisons
+ $pr_version =~ s/(\d+)\.(\d+)_(\d+)/$1.$2$3/;
+
+ if (!$installed_file) {
+ warn sprintf "Warning: prerequisite %s %s not found.\n",
+ $prereq, $required_version
+ unless $self->{PREREQ_FATAL};
+
+ $unsatisfied{$prereq} = 'not installed';
+ }
+ elsif ($pr_version < $required_version ){
+ warn sprintf "Warning: prerequisite %s %s not found. We have %s.\n",
+ $prereq, $required_version, ($pr_version || 'unknown version')
+ unless $self->{PREREQ_FATAL};
+
+ $unsatisfied{$prereq} = $required_version ? $required_version : 'unknown version' ;
+ }
+ }
+
+ if (%unsatisfied && $self->{PREREQ_FATAL}){
+ my $failedprereqs = join "\n", map {" $_ $unsatisfied{$_}"}
+ sort { $a cmp $b } keys %unsatisfied;
+ die <<"END";
+MakeMaker FATAL: prerequisites not found.
+$failedprereqs
+
+Please install these modules first and rerun 'perl Makefile.PL'.
+END
+ }
+
+ if (defined $self->{CONFIGURE}) {
+ if (ref $self->{CONFIGURE} eq 'CODE') {
+ %configure_att = %{&{$self->{CONFIGURE}}};
+ $self = { %$self, %configure_att };
+ } else {
+ Carp::croak "Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n";
+ }
+ }
+
+ # This is for old Makefiles written pre 5.00, will go away
+ if ( Carp::longmess("") =~ /runsubdirpl/s ){
+ Carp::carp("WARNING: Please rerun 'perl Makefile.PL' to regenerate your Makefiles\n");
+ }
+
+ my $newclass = ++$PACKNAME;
+ local @Parent = @Parent; # Protect against non-local exits
+ {
+ print "Blessing Object into class [$newclass]\n" if $Verbose>=2;
+ mv_all_methods("MY",$newclass);
+ bless $self, $newclass;
+ push @Parent, $self;
+ require ExtUtils::MY;
+
+ no strict 'refs'; ## no critic;
+ @{"$newclass\:\:ISA"} = 'MM';
+ }
+
+ if (defined $Parent[-2]){
+ $self->{PARENT} = $Parent[-2];
+ for my $key (@Prepend_parent) {
+ next unless defined $self->{PARENT}{$key};
+
+ # Don't stomp on WriteMakefile() args.
+ next if defined $self->{ARGS}{$key} and
+ $self->{ARGS}{$key} eq $self->{$key};
+
+ $self->{$key} = $self->{PARENT}{$key};
+
+ unless ($Is_VMS && $key =~ /PERL$/) {
+ $self->{$key} = $self->catdir("..",$self->{$key})
+ unless $self->file_name_is_absolute($self->{$key});
+ } else {
+ # PERL or FULLPERL will be a command verb or even a
+ # command with an argument instead of a full file
+ # specification under VMS. So, don't turn the command
+ # into a filespec, but do add a level to the path of
+ # the argument if not already absolute.
+ my @cmd = split /\s+/, $self->{$key};
+ $cmd[1] = $self->catfile('[-]',$cmd[1])
+ unless (@cmd < 2) || $self->file_name_is_absolute($cmd[1]);
+ $self->{$key} = join(' ', @cmd);
+ }
+ }
+ if ($self->{PARENT}) {
+ $self->{PARENT}->{CHILDREN}->{$newclass} = $self;
+ foreach my $opt (qw(POLLUTE PERL_CORE LINKTYPE)) {
+ if (exists $self->{PARENT}->{$opt}
+ and not exists $self->{$opt})
+ {
+ # inherit, but only if already unspecified
+ $self->{$opt} = $self->{PARENT}->{$opt};
+ }
+ }
+ }
+ my @fm = grep /^FIRST_MAKEFILE=/, @ARGV;
+ parse_args($self,@fm) if @fm;
+ } else {
+ parse_args($self,split(' ', $ENV{PERL_MM_OPT} || ''),@ARGV);
+ }
+
+
+ $self->{NAME} ||= $self->guess_name;
+
+ ($self->{NAME_SYM} = $self->{NAME}) =~ s/\W+/_/g;
+
+ $self->init_MAKE;
+ $self->init_main;
+ $self->init_VERSION;
+ $self->init_dist;
+ $self->init_INST;
+ $self->init_INSTALL;
+ $self->init_DEST;
+ $self->init_dirscan;
+ $self->init_PM;
+ $self->init_MANPODS;
+ $self->init_xs;
+ $self->init_PERL;
+ $self->init_DIRFILESEP;
+ $self->init_linker;
+ $self->init_ABSTRACT;
+
+ $self->arch_check(
+ $INC{'Config.pm'},
+ $self->catfile($Config{'archlibexp'}, "Config.pm")
+ );
+
+ $self->init_others();
+ $self->init_platform();
+ $self->init_PERM();
+ my($argv) = neatvalue(\@ARGV);
+ $argv =~ s/^\[/(/;
+ $argv =~ s/\]$/)/;
+
+ push @{$self->{RESULT}}, <<END;
+# This Makefile is for the $self->{NAME} extension to perl.
+#
+# It was generated automatically by MakeMaker version
+# $VERSION (Revision: $Revision) from the contents of
+# Makefile.PL. Don't edit this file, edit Makefile.PL instead.
+#
+# ANY CHANGES MADE HERE WILL BE LOST!
+#
+# MakeMaker ARGV: $argv
+#
+END
+
+ push @{$self->{RESULT}}, $self->_MakeMaker_Parameters_section(\%initial_att);
+
+ if (defined $self->{CONFIGURE}) {
+ push @{$self->{RESULT}}, <<END;
+
+# MakeMaker 'CONFIGURE' Parameters:
+END
+ if (scalar(keys %configure_att) > 0) {
+ foreach my $key (sort keys %configure_att){
+ next if $key eq 'ARGS';
+ my($v) = neatvalue($configure_att{$key});
+ $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
+ $v =~ tr/\n/ /s;
+ push @{$self->{RESULT}}, "# $key => $v";
+ }
+ }
+ else
+ {
+ push @{$self->{RESULT}}, "# no values returned";
+ }
+ undef %configure_att; # free memory
+ }
+
+ # turn the SKIP array into a SKIPHASH hash
+ for my $skip (@{$self->{SKIP} || []}) {
+ $self->{SKIPHASH}{$skip} = 1;
+ }
+ delete $self->{SKIP}; # free memory
+
+ if ($self->{PARENT}) {
+ for (qw/install dist dist_basics dist_core distdir dist_test dist_ci/) {
+ $self->{SKIPHASH}{$_} = 1;
+ }
+ }
+
+ # We run all the subdirectories now. They don't have much to query
+ # from the parent, but the parent has to query them: if they need linking!
+ unless ($self->{NORECURS}) {
+ $self->eval_in_subdirs if @{$self->{DIR}};
+ }
+
+ foreach my $section ( @MM_Sections ){
+ # Support for new foo_target() methods.
+ my $method = $section;
+ $method .= '_target' unless $self->can($method);
+
+ print "Processing Makefile '$section' section\n" if ($Verbose >= 2);
+ my($skipit) = $self->skipcheck($section);
+ if ($skipit){
+ push @{$self->{RESULT}}, "\n# --- MakeMaker $section section $skipit.";
+ } else {
+ my(%a) = %{$self->{$section} || {}};
+ push @{$self->{RESULT}}, "\n# --- MakeMaker $section section:";
+ push @{$self->{RESULT}}, "# " . join ", ", %a if $Verbose && %a;
+ push @{$self->{RESULT}}, $self->maketext_filter(
+ $self->$method( %a )
+ );
+ }
+ }
+
+ push @{$self->{RESULT}}, "\n# End.";
+
+ $self;
+}
+
+sub WriteEmptyMakefile {
+ Carp::croak "WriteEmptyMakefile: Need an even number of args" if @_ % 2;
+
+ my %att = @_;
+ my $self = MM->new(\%att);
+
+ my $new = $self->{MAKEFILE};
+ my $old = $self->{MAKEFILE_OLD};
+ if (-f $old) {
+ _unlink($old) or warn "unlink $old: $!";
+ }
+ if ( -f $new ) {
+ _rename($new, $old) or warn "rename $new => $old: $!"
+ }
+ open my $mfh, '>', $new or die "open $new for write: $!";
+ print $mfh <<'EOP';
+all :
+
+clean :
+
+install :
+
+makemakerdflt :
+
+test :
+
+EOP
+ close $mfh or die "close $new for write: $!";
+}
+
+
+=begin private
+
+=head3 _installed_file_for_module
+
+ my $file = MM->_installed_file_for_module($module);
+
+Return the first installed .pm $file associated with the $module. The
+one which will show up when you C<use $module>.
+
+$module is something like "strict" or "Test::More".
+
+=end private
+
+=cut
+
+sub _installed_file_for_module {
+ my $class = shift;
+ my $prereq = shift;
+
+ my $file = "$prereq.pm";
+ $file =~ s{::}{/}g;
+
+ my $path;
+ for my $dir (@INC) {
+ my $tmp = File::Spec->catfile($dir, $file);
+ if ( -r $tmp ) {
+ $path = $tmp;
+ last;
+ }
+ }
+
+ return $path;
+}
+
+
+# Extracted from MakeMaker->new so we can test it
+sub _MakeMaker_Parameters_section {
+ my $self = shift;
+ my $att = shift;
+
+ my @result = <<'END';
+# MakeMaker Parameters:
+END
+
+ foreach my $key (sort keys %$att){
+ next if $key eq 'ARGS';
+ my ($v) = neatvalue($att->{$key});
+ if ($key eq 'PREREQ_PM') {
+ # CPAN.pm takes prereqs from this field in 'Makefile'
+ # and does not know about BUILD_REQUIRES
+ $v = neatvalue({ %{ $att->{PREREQ_PM} || {} }, %{ $att->{BUILD_REQUIRES} || {} } });
+ } else {
+ $v = neatvalue($att->{$key});
+ }
+
+ $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
+ $v =~ tr/\n/ /s;
+ push @result, "# $key => $v";
+ }
+
+ return @result;
+}
+
+
+sub check_manifest {
+ print STDOUT "Checking if your kit is complete...\n";
+ require ExtUtils::Manifest;
+ # avoid warning
+ $ExtUtils::Manifest::Quiet = $ExtUtils::Manifest::Quiet = 1;
+ my(@missed) = ExtUtils::Manifest::manicheck();
+ if (@missed) {
+ print STDOUT "Warning: the following files are missing in your kit:\n";
+ print "\t", join "\n\t", @missed;
+ print STDOUT "\n";
+ print STDOUT "Please inform the author.\n";
+ } else {
+ print STDOUT "Looks good\n";
+ }
+}
+
+sub parse_args{
+ my($self, @args) = @_;
+ foreach (@args) {
+ unless (m/(.*?)=(.*)/) {
+ ++$Verbose if m/^verb/;
+ next;
+ }
+ my($name, $value) = ($1, $2);
+ if ($value =~ m/^~(\w+)?/) { # tilde with optional username
+ $value =~ s [^~(\w*)]
+ [$1 ?
+ ((getpwnam($1))[7] || "~$1") :
+ (getpwuid($>))[7]
+ ]ex;
+ }
+
+ # Remember the original args passed it. It will be useful later.
+ $self->{ARGS}{uc $name} = $self->{uc $name} = $value;
+ }
+
+ # catch old-style 'potential_libs' and inform user how to 'upgrade'
+ if (defined $self->{potential_libs}){
+ my($msg)="'potential_libs' => '$self->{potential_libs}' should be";
+ if ($self->{potential_libs}){
+ print STDOUT "$msg changed to:\n\t'LIBS' => ['$self->{potential_libs}']\n";
+ } else {
+ print STDOUT "$msg deleted.\n";
+ }
+ $self->{LIBS} = [$self->{potential_libs}];
+ delete $self->{potential_libs};
+ }
+ # catch old-style 'ARMAYBE' and inform user how to 'upgrade'
+ if (defined $self->{ARMAYBE}){
+ my($armaybe) = $self->{ARMAYBE};
+ print STDOUT "ARMAYBE => '$armaybe' should be changed to:\n",
+ "\t'dynamic_lib' => {ARMAYBE => '$armaybe'}\n";
+ my(%dl) = %{$self->{dynamic_lib} || {}};
+ $self->{dynamic_lib} = { %dl, ARMAYBE => $armaybe};
+ delete $self->{ARMAYBE};
+ }
+ if (defined $self->{LDTARGET}){
+ print STDOUT "LDTARGET should be changed to LDFROM\n";
+ $self->{LDFROM} = $self->{LDTARGET};
+ delete $self->{LDTARGET};
+ }
+ # Turn a DIR argument on the command line into an array
+ if (defined $self->{DIR} && ref \$self->{DIR} eq 'SCALAR') {
+ # So they can choose from the command line, which extensions they want
+ # the grep enables them to have some colons too much in case they
+ # have to build a list with the shell
+ $self->{DIR} = [grep $_, split ":", $self->{DIR}];
+ }
+ # Turn a INCLUDE_EXT argument on the command line into an array
+ if (defined $self->{INCLUDE_EXT} && ref \$self->{INCLUDE_EXT} eq 'SCALAR') {
+ $self->{INCLUDE_EXT} = [grep $_, split '\s+', $self->{INCLUDE_EXT}];
+ }
+ # Turn a EXCLUDE_EXT argument on the command line into an array
+ if (defined $self->{EXCLUDE_EXT} && ref \$self->{EXCLUDE_EXT} eq 'SCALAR') {
+ $self->{EXCLUDE_EXT} = [grep $_, split '\s+', $self->{EXCLUDE_EXT}];
+ }
+
+ foreach my $mmkey (sort keys %$self){
+ next if $mmkey eq 'ARGS';
+ print STDOUT " $mmkey => ", neatvalue($self->{$mmkey}), "\n" if $Verbose;
+ print STDOUT "'$mmkey' is not a known MakeMaker parameter name.\n"
+ unless exists $Recognized_Att_Keys{$mmkey};
+ }
+ $| = 1 if $Verbose;
+}
+
+sub check_hints {
+ my($self) = @_;
+ # We allow extension-specific hints files.
+
+ require File::Spec;
+ my $curdir = File::Spec->curdir;
+
+ my $hint_dir = File::Spec->catdir($curdir, "hints");
+ return unless -d $hint_dir;
+
+ # First we look for the best hintsfile we have
+ my($hint)="${^O}_$Config{osvers}";
+ $hint =~ s/\./_/g;
+ $hint =~ s/_$//;
+ return unless $hint;
+
+ # Also try without trailing minor version numbers.
+ while (1) {
+ last if -f File::Spec->catfile($hint_dir, "$hint.pl"); # found
+ } continue {
+ last unless $hint =~ s/_[^_]*$//; # nothing to cut off
+ }
+ my $hint_file = File::Spec->catfile($hint_dir, "$hint.pl");
+
+ return unless -f $hint_file; # really there
+
+ _run_hintfile($self, $hint_file);
+}
+
+sub _run_hintfile {
+ our $self;
+ local($self) = shift; # make $self available to the hint file.
+ my($hint_file) = shift;
+
+ local($@, $!);
+ print STDERR "Processing hints file $hint_file\n";
+
+ # Just in case the ./ isn't on the hint file, which File::Spec can
+ # often strip off, we bung the curdir into @INC
+ local @INC = (File::Spec->curdir, @INC);
+ my $ret = do $hint_file;
+ if( !defined $ret ) {
+ my $error = $@ || $!;
+ print STDERR $error;
+ }
+}
+
+sub mv_all_methods {
+ my($from,$to) = @_;
+
+ # Here you see the *current* list of methods that are overridable
+ # from Makefile.PL via MY:: subroutines. As of VERSION 5.07 I'm
+ # still trying to reduce the list to some reasonable minimum --
+ # because I want to make it easier for the user. A.K.
+
+ local $SIG{__WARN__} = sub {
+ # can't use 'no warnings redefined', 5.6 only
+ warn @_ unless $_[0] =~ /^Subroutine .* redefined/
+ };
+ foreach my $method (@Overridable) {
+
+ # We cannot say "next" here. Nick might call MY->makeaperl
+ # which isn't defined right now
+
+ # Above statement was written at 4.23 time when Tk-b8 was
+ # around. As Tk-b9 only builds with 5.002something and MM 5 is
+ # standard, we try to enable the next line again. It was
+ # commented out until MM 5.23
+
+ next unless defined &{"${from}::$method"};
+
+ {
+ no strict 'refs'; ## no critic
+ *{"${to}::$method"} = \&{"${from}::$method"};
+
+ # If we delete a method, then it will be undefined and cannot
+ # be called. But as long as we have Makefile.PLs that rely on
+ # %MY:: being intact, we have to fill the hole with an
+ # inheriting method:
+
+ {
+ package MY;
+ my $super = "SUPER::".$method;
+ *{$method} = sub {
+ shift->$super(@_);
+ };
+ }
+ }
+ }
+
+ # We have to clean out %INC also, because the current directory is
+ # changed frequently and Graham Barr prefers to get his version
+ # out of a History.pl file which is "required" so woudn't get
+ # loaded again in another extension requiring a History.pl
+
+ # With perl5.002_01 the deletion of entries in %INC caused Tk-b11
+ # to core dump in the middle of a require statement. The required
+ # file was Tk/MMutil.pm. The consequence is, we have to be
+ # extremely careful when we try to give perl a reason to reload a
+ # library with same name. The workaround prefers to drop nothing
+ # from %INC and teach the writers not to use such libraries.
+
+# my $inc;
+# foreach $inc (keys %INC) {
+# #warn "***$inc*** deleted";
+# delete $INC{$inc};
+# }
+}
+
+sub skipcheck {
+ my($self) = shift;
+ my($section) = @_;
+ if ($section eq 'dynamic') {
+ print STDOUT "Warning (non-fatal): Target 'dynamic' depends on targets ",
+ "in skipped section 'dynamic_bs'\n"
+ if $self->{SKIPHASH}{dynamic_bs} && $Verbose;
+ print STDOUT "Warning (non-fatal): Target 'dynamic' depends on targets ",
+ "in skipped section 'dynamic_lib'\n"
+ if $self->{SKIPHASH}{dynamic_lib} && $Verbose;
+ }
+ if ($section eq 'dynamic_lib') {
+ print STDOUT "Warning (non-fatal): Target '\$(INST_DYNAMIC)' depends on ",
+ "targets in skipped section 'dynamic_bs'\n"
+ if $self->{SKIPHASH}{dynamic_bs} && $Verbose;
+ }
+ if ($section eq 'static') {
+ print STDOUT "Warning (non-fatal): Target 'static' depends on targets ",
+ "in skipped section 'static_lib'\n"
+ if $self->{SKIPHASH}{static_lib} && $Verbose;
+ }
+ return 'skipped' if $self->{SKIPHASH}{$section};
+ return '';
+}
+
+sub flush {
+ my $self = shift;
+
+ my $finalname = $self->{MAKEFILE};
+ print STDOUT "Writing $finalname for $self->{NAME}\n";
+
+ unlink($finalname, "MakeMaker.tmp", $Is_VMS ? 'Descrip.MMS' : ());
+ open(my $fh,">", "MakeMaker.tmp")
+ or die "Unable to open MakeMaker.tmp: $!";
+
+ for my $chunk (@{$self->{RESULT}}) {
+ print $fh "$chunk\n";
+ }
+
+ close $fh;
+ _rename("MakeMaker.tmp", $finalname) or
+ warn "rename MakeMaker.tmp => $finalname: $!";
+ chmod 0644, $finalname unless $Is_VMS;
+
+ my %keep = map { ($_ => 1) } qw(NEEDS_LINKING HAS_LINK_CODE);
+
+ if ($self->{PARENT} && !$self->{_KEEP_AFTER_FLUSH}) {
+ foreach (keys %$self) { # safe memory
+ delete $self->{$_} unless $keep{$_};
+ }
+ }
+
+ system("$Config::Config{eunicefix} $finalname") unless $Config::Config{eunicefix} eq ":";
+}
+
+
+# This is a rename for OS's where the target must be unlinked first.
+sub _rename {
+ my($src, $dest) = @_;
+ chmod 0666, $dest;
+ unlink $dest;
+ return rename $src, $dest;
+}
+
+# This is an unlink for OS's where the target must be writable first.
+sub _unlink {
+ my @files = @_;
+ chmod 0666, @files;
+ return unlink @files;
+}
+
+
+# The following mkbootstrap() is only for installations that are calling
+# the pre-4.1 mkbootstrap() from their old Makefiles. This MakeMaker
+# writes Makefiles, that use ExtUtils::Mkbootstrap directly.
+sub mkbootstrap {
+ die <<END;
+!!! Your Makefile has been built such a long time ago, !!!
+!!! that is unlikely to work with current MakeMaker. !!!
+!!! Please rebuild your Makefile !!!
+END
+}
+
+# Ditto for mksymlists() as of MakeMaker 5.17
+sub mksymlists {
+ die <<END;
+!!! Your Makefile has been built such a long time ago, !!!
+!!! that is unlikely to work with current MakeMaker. !!!
+!!! Please rebuild your Makefile !!!
+END
+}
+
+sub neatvalue {
+ my($v) = @_;
+ return "undef" unless defined $v;
+ my($t) = ref $v;
+ return "q[$v]" unless $t;
+ if ($t eq 'ARRAY') {
+ my(@m, @neat);
+ push @m, "[";
+ foreach my $elem (@$v) {
+ push @neat, "q[$elem]";
+ }
+ push @m, join ", ", @neat;
+ push @m, "]";
+ return join "", @m;
+ }
+ return "$v" unless $t eq 'HASH';
+ my(@m, $key, $val);
+ while (($key,$val) = each %$v){
+ last unless defined $key; # cautious programming in case (undef,undef) is true
+ push(@m,"$key=>".neatvalue($val)) ;
+ }
+ return "{ ".join(', ',@m)." }";
+}
+
+sub selfdocument {
+ my($self) = @_;
+ my(@m);
+ if ($Verbose){
+ push @m, "\n# Full list of MakeMaker attribute values:";
+ foreach my $key (sort keys %$self){
+ next if $key eq 'RESULT' || $key =~ /^[A-Z][a-z]/;
+ my($v) = neatvalue($self->{$key});
+ $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
+ $v =~ tr/\n/ /s;
+ push @m, "# $key => $v";
+ }
+ }
+ join "\n", @m;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExtUtils::MakeMaker - Create a module Makefile
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MakeMaker;
+
+ WriteMakefile( ATTRIBUTE => VALUE [, ...] );
+
+=head1 DESCRIPTION
+
+This utility is designed to write a Makefile for an extension module
+from a Makefile.PL. It is based on the Makefile.SH model provided by
+Andy Dougherty and the perl5-porters.
+
+It splits the task of generating the Makefile into several subroutines
+that can be individually overridden. Each subroutine returns the text
+it wishes to have written to the Makefile.
+
+MakeMaker is object oriented. Each directory below the current
+directory that contains a Makefile.PL is treated as a separate
+object. This makes it possible to write an unlimited number of
+Makefiles with a single invocation of WriteMakefile().
+
+=head2 How To Write A Makefile.PL
+
+See ExtUtils::MakeMaker::Tutorial.
+
+The long answer is the rest of the manpage :-)
+
+=head2 Default Makefile Behaviour
+
+The generated Makefile enables the user of the extension to invoke
+
+ perl Makefile.PL # optionally "perl Makefile.PL verbose"
+ make
+ make test # optionally set TEST_VERBOSE=1
+ make install # See below
+
+The Makefile to be produced may be altered by adding arguments of the
+form C<KEY=VALUE>. E.g.
+
+ perl Makefile.PL INSTALL_BASE=~
+
+Other interesting targets in the generated Makefile are
+
+ make config # to check if the Makefile is up-to-date
+ make clean # delete local temp files (Makefile gets renamed)
+ make realclean # delete derived files (including ./blib)
+ make ci # check in all the files in the MANIFEST file
+ make dist # see below the Distribution Support section
+
+=head2 make test
+
+MakeMaker checks for the existence of a file named F<test.pl> in the
+current directory and if it exists it execute the script with the
+proper set of perl C<-I> options.
+
+MakeMaker also checks for any files matching glob("t/*.t"). It will
+execute all matching files in alphabetical order via the
+L<Test::Harness> module with the C<-I> switches set correctly.
+
+If you'd like to see the raw output of your tests, set the
+C<TEST_VERBOSE> variable to true.
+
+ make test TEST_VERBOSE=1
+
+=head2 make testdb
+
+A useful variation of the above is the target C<testdb>. It runs the
+test under the Perl debugger (see L<perldebug>). If the file
+F<test.pl> exists in the current directory, it is used for the test.
+
+If you want to debug some other testfile, set the C<TEST_FILE> variable
+thusly:
+
+ make testdb TEST_FILE=t/mytest.t
+
+By default the debugger is called using C<-d> option to perl. If you
+want to specify some other option, set the C<TESTDB_SW> variable:
+
+ make testdb TESTDB_SW=-Dx
+
+=head2 make install
+
+make alone puts all relevant files into directories that are named by
+the macros INST_LIB, INST_ARCHLIB, INST_SCRIPT, INST_MAN1DIR and
+INST_MAN3DIR. All these default to something below ./blib if you are
+I<not> building below the perl source directory. If you I<are>
+building below the perl source, INST_LIB and INST_ARCHLIB default to
+../../lib, and INST_SCRIPT is not defined.
+
+The I<install> target of the generated Makefile copies the files found
+below each of the INST_* directories to their INSTALL*
+counterparts. Which counterparts are chosen depends on the setting of
+INSTALLDIRS according to the following table:
+
+ INSTALLDIRS set to
+ perl site vendor
+
+ PERLPREFIX SITEPREFIX VENDORPREFIX
+ INST_ARCHLIB INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH
+ INST_LIB INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB
+ INST_BIN INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN
+ INST_SCRIPT INSTALLSCRIPT INSTALLSITESCRIPT INSTALLVENDORSCRIPT
+ INST_MAN1DIR INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR
+ INST_MAN3DIR INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR
+
+The INSTALL... macros in turn default to their %Config
+($Config{installprivlib}, $Config{installarchlib}, etc.) counterparts.
+
+You can check the values of these variables on your system with
+
+ perl '-V:install.*'
+
+And to check the sequence in which the library directories are
+searched by perl, run
+
+ perl -le 'print join $/, @INC'
+
+Sometimes older versions of the module you're installing live in other
+directories in @INC. Because Perl loads the first version of a module it
+finds, not the newest, you might accidentally get one of these older
+versions even after installing a brand new version. To delete I<all other
+versions of the module you're installing> (not simply older ones) set the
+C<UNINST> variable.
+
+ make install UNINST=1
+
+
+=head2 INSTALL_BASE
+
+INSTALL_BASE can be passed into Makefile.PL to change where your
+module will be installed. INSTALL_BASE is more like what everyone
+else calls "prefix" than PREFIX is.
+
+To have everything installed in your home directory, do the following.
+
+ # Unix users, INSTALL_BASE=~ works fine
+ perl Makefile.PL INSTALL_BASE=/path/to/your/home/dir
+
+Like PREFIX, it sets several INSTALL* attributes at once. Unlike
+PREFIX it is easy to predict where the module will end up. The
+installation pattern looks like this:
+
+ INSTALLARCHLIB INSTALL_BASE/lib/perl5/$Config{archname}
+ INSTALLPRIVLIB INSTALL_BASE/lib/perl5
+ INSTALLBIN INSTALL_BASE/bin
+ INSTALLSCRIPT INSTALL_BASE/bin
+ INSTALLMAN1DIR INSTALL_BASE/man/man1
+ INSTALLMAN3DIR INSTALL_BASE/man/man3
+
+INSTALL_BASE in MakeMaker and C<--install_base> in Module::Build (as
+of 0.28) install to the same location. If you want MakeMaker and
+Module::Build to install to the same location simply set INSTALL_BASE
+and C<--install_base> to the same location.
+
+INSTALL_BASE was added in 6.31.
+
+
+=head2 PREFIX and LIB attribute
+
+PREFIX and LIB can be used to set several INSTALL* attributes in one
+go. Here's an example for installing into your home directory.
+
+ # Unix users, PREFIX=~ works fine
+ perl Makefile.PL PREFIX=/path/to/your/home/dir
+
+This will install all files in the module under your home directory,
+with man pages and libraries going into an appropriate place (usually
+~/man and ~/lib). How the exact location is determined is complicated
+and depends on how your Perl was configured. INSTALL_BASE works more
+like what other build systems call "prefix" than PREFIX and we
+recommend you use that instead.
+
+Another way to specify many INSTALL directories with a single
+parameter is LIB.
+
+ perl Makefile.PL LIB=~/lib
+
+This will install the module's architecture-independent files into
+~/lib, the architecture-dependent files into ~/lib/$archname.
+
+Note, that in both cases the tilde expansion is done by MakeMaker, not
+by perl by default, nor by make.
+
+Conflicts between parameters LIB, PREFIX and the various INSTALL*
+arguments are resolved so that:
+
+=over 4
+
+=item *
+
+setting LIB overrides any setting of INSTALLPRIVLIB, INSTALLARCHLIB,
+INSTALLSITELIB, INSTALLSITEARCH (and they are not affected by PREFIX);
+
+=item *
+
+without LIB, setting PREFIX replaces the initial C<$Config{prefix}>
+part of those INSTALL* arguments, even if the latter are explicitly
+set (but are set to still start with C<$Config{prefix}>).
+
+=back
+
+If the user has superuser privileges, and is not working on AFS or
+relatives, then the defaults for INSTALLPRIVLIB, INSTALLARCHLIB,
+INSTALLSCRIPT, etc. will be appropriate, and this incantation will be
+the best:
+
+ perl Makefile.PL;
+ make;
+ make test
+ make install
+
+make install per default writes some documentation of what has been
+done into the file C<$(INSTALLARCHLIB)/perllocal.pod>. This feature
+can be bypassed by calling make pure_install.
+
+=head2 AFS users
+
+will have to specify the installation directories as these most
+probably have changed since perl itself has been installed. They will
+have to do this by calling
+
+ perl Makefile.PL INSTALLSITELIB=/afs/here/today \
+ INSTALLSCRIPT=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages
+ make
+
+Be careful to repeat this procedure every time you recompile an
+extension, unless you are sure the AFS installation directories are
+still valid.
+
+=head2 Static Linking of a new Perl Binary
+
+An extension that is built with the above steps is ready to use on
+systems supporting dynamic loading. On systems that do not support
+dynamic loading, any newly created extension has to be linked together
+with the available resources. MakeMaker supports the linking process
+by creating appropriate targets in the Makefile whenever an extension
+is built. You can invoke the corresponding section of the makefile with
+
+ make perl
+
+That produces a new perl binary in the current directory with all
+extensions linked in that can be found in INST_ARCHLIB, SITELIBEXP,
+and PERL_ARCHLIB. To do that, MakeMaker writes a new Makefile, on
+UNIX, this is called Makefile.aperl (may be system dependent). If you
+want to force the creation of a new perl, it is recommended, that you
+delete this Makefile.aperl, so the directories are searched-through
+for linkable libraries again.
+
+The binary can be installed into the directory where perl normally
+resides on your machine with
+
+ make inst_perl
+
+To produce a perl binary with a different name than C<perl>, either say
+
+ perl Makefile.PL MAP_TARGET=myperl
+ make myperl
+ make inst_perl
+
+or say
+
+ perl Makefile.PL
+ make myperl MAP_TARGET=myperl
+ make inst_perl MAP_TARGET=myperl
+
+In any case you will be prompted with the correct invocation of the
+C<inst_perl> target that installs the new binary into INSTALLBIN.
+
+make inst_perl per default writes some documentation of what has been
+done into the file C<$(INSTALLARCHLIB)/perllocal.pod>. This
+can be bypassed by calling make pure_inst_perl.
+
+Warning: the inst_perl: target will most probably overwrite your
+existing perl binary. Use with care!
+
+Sometimes you might want to build a statically linked perl although
+your system supports dynamic loading. In this case you may explicitly
+set the linktype with the invocation of the Makefile.PL or make:
+
+ perl Makefile.PL LINKTYPE=static # recommended
+
+or
+
+ make LINKTYPE=static # works on most systems
+
+=head2 Determination of Perl Library and Installation Locations
+
+MakeMaker needs to know, or to guess, where certain things are
+located. Especially INST_LIB and INST_ARCHLIB (where to put the files
+during the make(1) run), PERL_LIB and PERL_ARCHLIB (where to read
+existing modules from), and PERL_INC (header files and C<libperl*.*>).
+
+Extensions may be built either using the contents of the perl source
+directory tree or from the installed perl library. The recommended way
+is to build extensions after you have run 'make install' on perl
+itself. You can do that in any directory on your hard disk that is not
+below the perl source tree. The support for extensions below the ext
+directory of the perl distribution is only good for the standard
+extensions that come with perl.
+
+If an extension is being built below the C<ext/> directory of the perl
+source then MakeMaker will set PERL_SRC automatically (e.g.,
+C<../..>). If PERL_SRC is defined and the extension is recognized as
+a standard extension, then other variables default to the following:
+
+ PERL_INC = PERL_SRC
+ PERL_LIB = PERL_SRC/lib
+ PERL_ARCHLIB = PERL_SRC/lib
+ INST_LIB = PERL_LIB
+ INST_ARCHLIB = PERL_ARCHLIB
+
+If an extension is being built away from the perl source then MakeMaker
+will leave PERL_SRC undefined and default to using the installed copy
+of the perl library. The other variables default to the following:
+
+ PERL_INC = $archlibexp/CORE
+ PERL_LIB = $privlibexp
+ PERL_ARCHLIB = $archlibexp
+ INST_LIB = ./blib/lib
+ INST_ARCHLIB = ./blib/arch
+
+If perl has not yet been installed then PERL_SRC can be defined on the
+command line as shown in the previous section.
+
+
+=head2 Which architecture dependent directory?
+
+If you don't want to keep the defaults for the INSTALL* macros,
+MakeMaker helps you to minimize the typing needed: the usual
+relationship between INSTALLPRIVLIB and INSTALLARCHLIB is determined
+by Configure at perl compilation time. MakeMaker supports the user who
+sets INSTALLPRIVLIB. If INSTALLPRIVLIB is set, but INSTALLARCHLIB not,
+then MakeMaker defaults the latter to be the same subdirectory of
+INSTALLPRIVLIB as Configure decided for the counterparts in %Config ,
+otherwise it defaults to INSTALLPRIVLIB. The same relationship holds
+for INSTALLSITELIB and INSTALLSITEARCH.
+
+MakeMaker gives you much more freedom than needed to configure
+internal variables and get different results. It is worth to mention,
+that make(1) also lets you configure most of the variables that are
+used in the Makefile. But in the majority of situations this will not
+be necessary, and should only be done if the author of a package
+recommends it (or you know what you're doing).
+
+=head2 Using Attributes and Parameters
+
+The following attributes may be specified as arguments to WriteMakefile()
+or as NAME=VALUE pairs on the command line.
+
+=over 2
+
+=item ABSTRACT
+
+One line description of the module. Will be included in PPD file.
+
+=item ABSTRACT_FROM
+
+Name of the file that contains the package description. MakeMaker looks
+for a line in the POD matching /^($package\s-\s)(.*)/. This is typically
+the first line in the "=head1 NAME" section. $2 becomes the abstract.
+
+=item AUTHOR
+
+String containing name (and email address) of package author(s). Is used
+in PPD (Perl Package Description) files for PPM (Perl Package Manager).
+
+=item BINARY_LOCATION
+
+Used when creating PPD files for binary packages. It can be set to a
+full or relative path or URL to the binary archive for a particular
+architecture. For example:
+
+ perl Makefile.PL BINARY_LOCATION=x86/Agent.tar.gz
+
+builds a PPD package that references a binary of the C<Agent> package,
+located in the C<x86> directory relative to the PPD itself.
+
+=item BUILD_REQUIRES
+
+A hash of modules that are needed to build your module but not run it.
+
+This will go into the C<build_requires> field of your F<META.yml>.
+
+The format is the same as PREREQ_PM.
+
+=item C
+
+Ref to array of *.c file names. Initialised from a directory scan
+and the values portion of the XS attribute hash. This is not
+currently used by MakeMaker but may be handy in Makefile.PLs.
+
+=item CCFLAGS
+
+String that will be included in the compiler call command line between
+the arguments INC and OPTIMIZE.
+
+=item CONFIG
+
+Arrayref. E.g. [qw(archname manext)] defines ARCHNAME & MANEXT from
+config.sh. MakeMaker will add to CONFIG the following values anyway:
+ar
+cc
+cccdlflags
+ccdlflags
+dlext
+dlsrc
+ld
+lddlflags
+ldflags
+libc
+lib_ext
+obj_ext
+ranlib
+sitelibexp
+sitearchexp
+so
+
+=item CONFIGURE
+
+CODE reference. The subroutine should return a hash reference. The
+hash may contain further attributes, e.g. {LIBS =E<gt> ...}, that have to
+be determined by some evaluation method.
+
+=item CONFIGURE_REQUIRES
+
+A hash of modules that are required to run Makefile.PL itself, but not
+to run your distribution.
+
+This will go into the C<configure_requires> field of your F<META.yml>.
+
+Defaults to C<<< { "ExtUtils::MakeMaker" => 0 } >>>
+
+The format is the same as PREREQ_PM.
+
+=item DEFINE
+
+Something like C<"-DHAVE_UNISTD_H">
+
+=item DESTDIR
+
+This is the root directory into which the code will be installed. It
+I<prepends itself to the normal prefix>. For example, if your code
+would normally go into F</usr/local/lib/perl> you could set DESTDIR=~/tmp/
+and installation would go into F<~/tmp/usr/local/lib/perl>.
+
+This is primarily of use for people who repackage Perl modules.
+
+NOTE: Due to the nature of make, it is important that you put the trailing
+slash on your DESTDIR. F<~/tmp/> not F<~/tmp>.
+
+=item DIR
+
+Ref to array of subdirectories containing Makefile.PLs e.g. ['sdbm']
+in ext/SDBM_File
+
+=item DISTNAME
+
+A safe filename for the package.
+
+Defaults to NAME above but with :: replaced with -.
+
+For example, Foo::Bar becomes Foo-Bar.
+
+=item DISTVNAME
+
+Your name for distributing the package with the version number
+included. This is used by 'make dist' to name the resulting archive
+file.
+
+Defaults to DISTNAME-VERSION.
+
+For example, version 1.04 of Foo::Bar becomes Foo-Bar-1.04.
+
+On some OS's where . has special meaning VERSION_SYM may be used in
+place of VERSION.
+
+=item DL_FUNCS
+
+Hashref of symbol names for routines to be made available as universal
+symbols. Each key/value pair consists of the package name and an
+array of routine names in that package. Used only under AIX, OS/2,
+VMS and Win32 at present. The routine names supplied will be expanded
+in the same way as XSUB names are expanded by the XS() macro.
+Defaults to
+
+ {"$(NAME)" => ["boot_$(NAME)" ] }
+
+e.g.
+
+ {"RPC" => [qw( boot_rpcb rpcb_gettime getnetconfigent )],
+ "NetconfigPtr" => [ 'DESTROY'] }
+
+Please see the L<ExtUtils::Mksymlists> documentation for more information
+about the DL_FUNCS, DL_VARS and FUNCLIST attributes.
+
+=item DL_VARS
+
+Array of symbol names for variables to be made available as universal symbols.
+Used only under AIX, OS/2, VMS and Win32 at present. Defaults to [].
+(e.g. [ qw(Foo_version Foo_numstreams Foo_tree ) ])
+
+=item EXCLUDE_EXT
+
+Array of extension names to exclude when doing a static build. This
+is ignored if INCLUDE_EXT is present. Consult INCLUDE_EXT for more
+details. (e.g. [ qw( Socket POSIX ) ] )
+
+This attribute may be most useful when specified as a string on the
+command line: perl Makefile.PL EXCLUDE_EXT='Socket Safe'
+
+=item EXE_FILES
+
+Ref to array of executable files. The files will be copied to the
+INST_SCRIPT directory. Make realclean will delete them from there
+again.
+
+If your executables start with something like #!perl or
+#!/usr/bin/perl MakeMaker will change this to the path of the perl
+'Makefile.PL' was invoked with so the programs will be sure to run
+properly even if perl is not in /usr/bin/perl.
+
+=item FIRST_MAKEFILE
+
+The name of the Makefile to be produced. This is used for the second
+Makefile that will be produced for the MAP_TARGET.
+
+Defaults to 'Makefile' or 'Descrip.MMS' on VMS.
+
+(Note: we couldn't use MAKEFILE because dmake uses this for something
+else).
+
+=item FULLPERL
+
+Perl binary able to run this extension, load XS modules, etc...
+
+=item FULLPERLRUN
+
+Like PERLRUN, except it uses FULLPERL.
+
+=item FULLPERLRUNINST
+
+Like PERLRUNINST, except it uses FULLPERL.
+
+=item FUNCLIST
+
+This provides an alternate means to specify function names to be
+exported from the extension. Its value is a reference to an
+array of function names to be exported by the extension. These
+names are passed through unaltered to the linker options file.
+
+=item H
+
+Ref to array of *.h file names. Similar to C.
+
+=item IMPORTS
+
+This attribute is used to specify names to be imported into the
+extension. Takes a hash ref.
+
+It is only used on OS/2 and Win32.
+
+=item INC
+
+Include file dirs eg: C<"-I/usr/5include -I/path/to/inc">
+
+=item INCLUDE_EXT
+
+Array of extension names to be included when doing a static build.
+MakeMaker will normally build with all of the installed extensions when
+doing a static build, and that is usually the desired behavior. If
+INCLUDE_EXT is present then MakeMaker will build only with those extensions
+which are explicitly mentioned. (e.g. [ qw( Socket POSIX ) ])
+
+It is not necessary to mention DynaLoader or the current extension when
+filling in INCLUDE_EXT. If the INCLUDE_EXT is mentioned but is empty then
+only DynaLoader and the current extension will be included in the build.
+
+This attribute may be most useful when specified as a string on the
+command line: perl Makefile.PL INCLUDE_EXT='POSIX Socket Devel::Peek'
+
+=item INSTALLARCHLIB
+
+Used by 'make install', which copies files from INST_ARCHLIB to this
+directory if INSTALLDIRS is set to perl.
+
+=item INSTALLBIN
+
+Directory to install binary files (e.g. tkperl) into if
+INSTALLDIRS=perl.
+
+=item INSTALLDIRS
+
+Determines which of the sets of installation directories to choose:
+perl, site or vendor. Defaults to site.
+
+=item INSTALLMAN1DIR
+
+=item INSTALLMAN3DIR
+
+These directories get the man pages at 'make install' time if
+INSTALLDIRS=perl. Defaults to $Config{installman*dir}.
+
+If set to 'none', no man pages will be installed.
+
+=item INSTALLPRIVLIB
+
+Used by 'make install', which copies files from INST_LIB to this
+directory if INSTALLDIRS is set to perl.
+
+Defaults to $Config{installprivlib}.
+
+=item INSTALLSCRIPT
+
+Used by 'make install' which copies files from INST_SCRIPT to this
+directory if INSTALLDIRS=perl.
+
+=item INSTALLSITEARCH
+
+Used by 'make install', which copies files from INST_ARCHLIB to this
+directory if INSTALLDIRS is set to site (default).
+
+=item INSTALLSITEBIN
+
+Used by 'make install', which copies files from INST_BIN to this
+directory if INSTALLDIRS is set to site (default).
+
+=item INSTALLSITELIB
+
+Used by 'make install', which copies files from INST_LIB to this
+directory if INSTALLDIRS is set to site (default).
+
+=item INSTALLSITEMAN1DIR
+
+=item INSTALLSITEMAN3DIR
+
+These directories get the man pages at 'make install' time if
+INSTALLDIRS=site (default). Defaults to
+$(SITEPREFIX)/man/man$(MAN*EXT).
+
+If set to 'none', no man pages will be installed.
+
+=item INSTALLSITESCRIPT
+
+Used by 'make install' which copies files from INST_SCRIPT to this
+directory if INSTALLDIRS is set to site (default).
+
+=item INSTALLVENDORARCH
+
+Used by 'make install', which copies files from INST_ARCHLIB to this
+directory if INSTALLDIRS is set to vendor.
+
+=item INSTALLVENDORBIN
+
+Used by 'make install', which copies files from INST_BIN to this
+directory if INSTALLDIRS is set to vendor.
+
+=item INSTALLVENDORLIB
+
+Used by 'make install', which copies files from INST_LIB to this
+directory if INSTALLDIRS is set to vendor.
+
+=item INSTALLVENDORMAN1DIR
+
+=item INSTALLVENDORMAN3DIR
+
+These directories get the man pages at 'make install' time if
+INSTALLDIRS=vendor. Defaults to $(VENDORPREFIX)/man/man$(MAN*EXT).
+
+If set to 'none', no man pages will be installed.
+
+=item INSTALLVENDORSCRIPT
+
+Used by 'make install' which copies files from INST_SCRIPT to this
+directory if INSTALLDIRS is set to vendor.
+
+=item INST_ARCHLIB
+
+Same as INST_LIB for architecture dependent files.
+
+=item INST_BIN
+
+Directory to put real binary files during 'make'. These will be copied
+to INSTALLBIN during 'make install'
+
+=item INST_LIB
+
+Directory where we put library files of this extension while building
+it.
+
+=item INST_MAN1DIR
+
+Directory to hold the man pages at 'make' time
+
+=item INST_MAN3DIR
+
+Directory to hold the man pages at 'make' time
+
+=item INST_SCRIPT
+
+Directory, where executable files should be installed during
+'make'. Defaults to "./blib/script", just to have a dummy location during
+testing. make install will copy the files in INST_SCRIPT to
+INSTALLSCRIPT.
+
+=item LD
+
+Program to be used to link libraries for dynamic loading.
+
+Defaults to $Config{ld}.
+
+=item LDDLFLAGS
+
+Any special flags that might need to be passed to ld to create a
+shared library suitable for dynamic loading. It is up to the makefile
+to use it. (See L<Config/lddlflags>)
+
+Defaults to $Config{lddlflags}.
+
+=item LDFROM
+
+Defaults to "$(OBJECT)" and is used in the ld command to specify
+what files to link/load from (also see dynamic_lib below for how to
+specify ld flags)
+
+=item LIB
+
+LIB should only be set at C<perl Makefile.PL> time but is allowed as a
+MakeMaker argument. It has the effect of setting both INSTALLPRIVLIB
+and INSTALLSITELIB to that value regardless any explicit setting of
+those arguments (or of PREFIX). INSTALLARCHLIB and INSTALLSITEARCH
+are set to the corresponding architecture subdirectory.
+
+=item LIBPERL_A
+
+The filename of the perllibrary that will be used together with this
+extension. Defaults to libperl.a.
+
+=item LIBS
+
+An anonymous array of alternative library
+specifications to be searched for (in order) until
+at least one library is found. E.g.
+
+ 'LIBS' => ["-lgdbm", "-ldbm -lfoo", "-L/path -ldbm.nfs"]
+
+Mind, that any element of the array
+contains a complete set of arguments for the ld
+command. So do not specify
+
+ 'LIBS' => ["-ltcl", "-ltk", "-lX11"]
+
+See ODBM_File/Makefile.PL for an example, where an array is needed. If
+you specify a scalar as in
+
+ 'LIBS' => "-ltcl -ltk -lX11"
+
+MakeMaker will turn it into an array with one element.
+
+=item LICENSE
+
+The licensing terms of your distribution. Generally its "perl" for the
+same license as Perl itself.
+
+See L<Module::Build::API> for the list of options.
+
+Defaults to "unknown".
+
+=item LINKTYPE
+
+'static' or 'dynamic' (default unless usedl=undef in
+config.sh). Should only be used to force static linking (also see
+linkext below).
+
+=item MAKE
+
+Variant of make you intend to run the generated Makefile with. This
+parameter lets Makefile.PL know what make quirks to account for when
+generating the Makefile.
+
+MakeMaker also honors the MAKE environment variable. This parameter
+takes precedent.
+
+Currently the only significant values are 'dmake' and 'nmake' for Windows
+users.
+
+Defaults to $Config{make}.
+
+=item MAKEAPERL
+
+Boolean which tells MakeMaker, that it should include the rules to
+make a perl. This is handled automatically as a switch by
+MakeMaker. The user normally does not need it.
+
+=item MAKEFILE_OLD
+
+When 'make clean' or similar is run, the $(FIRST_MAKEFILE) will be
+backed up at this location.
+
+Defaults to $(FIRST_MAKEFILE).old or $(FIRST_MAKEFILE)_old on VMS.
+
+=item MAN1PODS
+
+Hashref of pod-containing files. MakeMaker will default this to all
+EXE_FILES files that include POD directives. The files listed
+here will be converted to man pages and installed as was requested
+at Configure time.
+
+This hash should map POD files (or scripts containing POD) to the
+man file names under the C<blib/man1/> directory, as in the following
+example:
+
+ MAN1PODS => {
+ 'doc/command.pod' => 'blib/man1/command.1',
+ 'scripts/script.pl' => 'blib/man1/script.1',
+ }
+
+=item MAN3PODS
+
+Hashref that assigns to *.pm and *.pod files the files into which the
+manpages are to be written. MakeMaker parses all *.pod and *.pm files
+for POD directives. Files that contain POD will be the default keys of
+the MAN3PODS hashref. These will then be converted to man pages during
+C<make> and will be installed during C<make install>.
+
+Example similar to MAN1PODS.
+
+=item MAP_TARGET
+
+If it is intended, that a new perl binary be produced, this variable
+may hold a name for that binary. Defaults to perl
+
+=item META_ADD
+
+=item META_MERGE
+
+A hashrefs of items to add to the F<META.yml>.
+
+They differ in how they behave if they have the same key as the
+default metadata. META_ADD will override the default value with it's
+own. META_MERGE will merge its value with the default.
+
+Unless you want to override the defaults, prefer META_MERGE so as to
+get the advantage of any future defaults.
+
+=item MIN_PERL_VERSION
+
+The minimum required version of Perl for this distribution.
+
+Either 5.006001 or 5.6.1 format is acceptable.
+
+=item MYEXTLIB
+
+If the extension links to a library that it builds set this to the
+name of the library (see SDBM_File)
+
+=item NAME
+
+Perl module name for this extension (DBD::Oracle). This will default
+to the directory name but should be explicitly defined in the
+Makefile.PL.
+
+=item NEEDS_LINKING
+
+MakeMaker will figure out if an extension contains linkable code
+anywhere down the directory tree, and will set this variable
+accordingly, but you can speed it up a very little bit if you define
+this boolean variable yourself.
+
+=item NOECHO
+
+Command so make does not print the literal commands its running.
+
+By setting it to an empty string you can generate a Makefile that
+prints all commands. Mainly used in debugging MakeMaker itself.
+
+Defaults to C<@>.
+
+=item NORECURS
+
+Boolean. Attribute to inhibit descending into subdirectories.
+
+=item NO_META
+
+When true, suppresses the generation and addition to the MANIFEST of
+the META.yml module meta-data file during 'make distdir'.
+
+Defaults to false.
+
+=item NO_VC
+
+In general, any generated Makefile checks for the current version of
+MakeMaker and the version the Makefile was built under. If NO_VC is
+set, the version check is neglected. Do not write this into your
+Makefile.PL, use it interactively instead.
+
+=item OBJECT
+
+List of object files, defaults to '$(BASEEXT)$(OBJ_EXT)', but can be a long
+string containing all object files, e.g. "tkpBind.o
+tkpButton.o tkpCanvas.o"
+
+(Where BASEEXT is the last component of NAME, and OBJ_EXT is $Config{obj_ext}.)
+
+=item OPTIMIZE
+
+Defaults to C<-O>. Set it to C<-g> to turn debugging on. The flag is
+passed to subdirectory makes.
+
+=item PERL
+
+Perl binary for tasks that can be done by miniperl
+
+=item PERL_CORE
+
+Set only when MakeMaker is building the extensions of the Perl core
+distribution.
+
+=item PERLMAINCC
+
+The call to the program that is able to compile perlmain.c. Defaults
+to $(CC).
+
+=item PERL_ARCHLIB
+
+Same as for PERL_LIB, but for architecture dependent files.
+
+Used only when MakeMaker is building the extensions of the Perl core
+distribution (because normally $(PERL_ARCHLIB) is automatically in @INC,
+and adding it would get in the way of PERL5LIB).
+
+=item PERL_LIB
+
+Directory containing the Perl library to use.
+
+Used only when MakeMaker is building the extensions of the Perl core
+distribution (because normally $(PERL_LIB) is automatically in @INC,
+and adding it would get in the way of PERL5LIB).
+
+=item PERL_MALLOC_OK
+
+defaults to 0. Should be set to TRUE if the extension can work with
+the memory allocation routines substituted by the Perl malloc() subsystem.
+This should be applicable to most extensions with exceptions of those
+
+=over 4
+
+=item *
+
+with bugs in memory allocations which are caught by Perl's malloc();
+
+=item *
+
+which interact with the memory allocator in other ways than via
+malloc(), realloc(), free(), calloc(), sbrk() and brk();
+
+=item *
+
+which rely on special alignment which is not provided by Perl's malloc().
+
+=back
+
+B<NOTE.> Negligence to set this flag in I<any one> of loaded extension
+nullifies many advantages of Perl's malloc(), such as better usage of
+system resources, error detection, memory usage reporting, catchable failure
+of memory allocations, etc.
+
+=item PERLPREFIX
+
+Directory under which core modules are to be installed.
+
+Defaults to $Config{installprefixexp} falling back to
+$Config{installprefix}, $Config{prefixexp} or $Config{prefix} should
+$Config{installprefixexp} not exist.
+
+Overridden by PREFIX.
+
+=item PERLRUN
+
+Use this instead of $(PERL) when you wish to run perl. It will set up
+extra necessary flags for you.
+
+=item PERLRUNINST
+
+Use this instead of $(PERL) when you wish to run perl to work with
+modules. It will add things like -I$(INST_ARCH) and other necessary
+flags so perl can see the modules you're about to install.
+
+=item PERL_SRC
+
+Directory containing the Perl source code (use of this should be
+avoided, it may be undefined)
+
+=item PERM_DIR
+
+Desired permission for directories. Defaults to C<755>.
+
+=item PERM_RW
+
+Desired permission for read/writable files. Defaults to C<644>.
+
+=item PERM_RWX
+
+Desired permission for executable files. Defaults to C<755>.
+
+=item PL_FILES
+
+MakeMaker can run programs to generate files for you at build time.
+By default any file named *.PL (except Makefile.PL and Build.PL) in
+the top level directory will be assumed to be a Perl program and run
+passing its own basename in as an argument. For example...
+
+ perl foo.PL foo
+
+This behavior can be overridden by supplying your own set of files to
+search. PL_FILES accepts a hash ref, the key being the file to run
+and the value is passed in as the first argument when the PL file is run.
+
+ PL_FILES => {'bin/foobar.PL' => 'bin/foobar'}
+
+Would run bin/foobar.PL like this:
+
+ perl bin/foobar.PL bin/foobar
+
+If multiple files from one program are desired an array ref can be used.
+
+ PL_FILES => {'bin/foobar.PL' => [qw(bin/foobar1 bin/foobar2)]}
+
+In this case the program will be run multiple times using each target file.
+
+ perl bin/foobar.PL bin/foobar1
+ perl bin/foobar.PL bin/foobar2
+
+PL files are normally run B<after> pm_to_blib and include INST_LIB and
+INST_ARCH in its C<@INC> so the just built modules can be
+accessed... unless the PL file is making a module (or anything else in
+PM) in which case it is run B<before> pm_to_blib and does not include
+INST_LIB and INST_ARCH in its C<@INC>. This apparently odd behavior
+is there for backwards compatibility (and its somewhat DWIM).
+
+
+=item PM
+
+Hashref of .pm files and *.pl files to be installed. e.g.
+
+ {'name_of_file.pm' => '$(INST_LIBDIR)/install_as.pm'}
+
+By default this will include *.pm and *.pl and the files found in
+the PMLIBDIRS directories. Defining PM in the
+Makefile.PL will override PMLIBDIRS.
+
+=item PMLIBDIRS
+
+Ref to array of subdirectories containing library files. Defaults to
+[ 'lib', $(BASEEXT) ]. The directories will be scanned and I<any> files
+they contain will be installed in the corresponding location in the
+library. A libscan() method can be used to alter the behaviour.
+Defining PM in the Makefile.PL will override PMLIBDIRS.
+
+(Where BASEEXT is the last component of NAME.)
+
+=item PM_FILTER
+
+A filter program, in the traditional Unix sense (input from stdin, output
+to stdout) that is passed on each .pm file during the build (in the
+pm_to_blib() phase). It is empty by default, meaning no filtering is done.
+
+Great care is necessary when defining the command if quoting needs to be
+done. For instance, you would need to say:
+
+ {'PM_FILTER' => 'grep -v \\"^\\#\\"'}
+
+to remove all the leading comments on the fly during the build. The
+extra \\ are necessary, unfortunately, because this variable is interpolated
+within the context of a Perl program built on the command line, and double
+quotes are what is used with the -e switch to build that command line. The
+# is escaped for the Makefile, since what is going to be generated will then
+be:
+
+ PM_FILTER = grep -v \"^\#\"
+
+Without the \\ before the #, we'd have the start of a Makefile comment,
+and the macro would be incorrectly defined.
+
+=item POLLUTE
+
+Release 5.005 grandfathered old global symbol names by providing preprocessor
+macros for extension source compatibility. As of release 5.6, these
+preprocessor definitions are not available by default. The POLLUTE flag
+specifies that the old names should still be defined:
+
+ perl Makefile.PL POLLUTE=1
+
+Please inform the module author if this is necessary to successfully install
+a module under 5.6 or later.
+
+=item PPM_INSTALL_EXEC
+
+Name of the executable used to run C<PPM_INSTALL_SCRIPT> below. (e.g. perl)
+
+=item PPM_INSTALL_SCRIPT
+
+Name of the script that gets executed by the Perl Package Manager after
+the installation of a package.
+
+=item PREFIX
+
+This overrides all the default install locations. Man pages,
+libraries, scripts, etc... MakeMaker will try to make an educated
+guess about where to place things under the new PREFIX based on your
+Config defaults. Failing that, it will fall back to a structure
+which should be sensible for your platform.
+
+If you specify LIB or any INSTALL* variables they will not be effected
+by the PREFIX.
+
+=item PREREQ_FATAL
+
+Bool. If this parameter is true, failing to have the required modules
+(or the right versions thereof) will be fatal. C<perl Makefile.PL>
+will C<die> instead of simply informing the user of the missing dependencies.
+
+It is I<extremely> rare to have to use C<PREREQ_FATAL>. Its use by module
+authors is I<strongly discouraged> and should never be used lightly.
+Module installation tools have ways of resolving umet dependencies but
+to do that they need a F<Makefile>. Using C<PREREQ_FATAL> breaks this.
+That's bad.
+
+The only situation where it is appropriate is when you have
+dependencies that are indispensible to actually I<write> a
+F<Makefile>. For example, MakeMaker's F<Makefile.PL> needs L<File::Spec>.
+If its not available it cannot write the F<Makefile>.
+
+Note: see L<Test::Harness> for a shortcut for stopping tests early
+if you are missing dependencies and are afraid that users might
+use your module with an incomplete environment.
+
+=item PREREQ_PM
+
+A hash of modules that are needed to run your module. The keys are
+the module names ie. Test::More, and the minimum version is the
+value. If the required version number is 0 any version will do.
+
+This will go into the C<requires> field of your F<META.yml>.
+
+ PREREQ_PM => {
+ # Require Test::More at least 0.47
+ "Test::More" => "0.47",
+
+ # Require any version of Acme::Buffy
+ "Acme::Buffy" => 0,
+ }
+
+=item PREREQ_PRINT
+
+Bool. If this parameter is true, the prerequisites will be printed to
+stdout and MakeMaker will exit. The output format is an evalable hash
+ref.
+
+ $PREREQ_PM = {
+ 'A::B' => Vers1,
+ 'C::D' => Vers2,
+ ...
+ };
+
+If a distribution defines a minimal required perl version, this is
+added to the output as an additional line of the form:
+
+ $MIN_PERL_VERSION = '5.008001';
+
+If BUILD_REQUIRES is not empty, it will be dumped as $BUILD_REQUIRES hasref.
+
+=item PRINT_PREREQ
+
+RedHatism for C<PREREQ_PRINT>. The output format is different, though:
+
+ perl(A::B)>=Vers1 perl(C::D)>=Vers2 ...
+
+A minimal required perl version, if present, will look like this:
+
+ perl(perl)>=5.008001
+
+=item SITEPREFIX
+
+Like PERLPREFIX, but only for the site install locations.
+
+Defaults to $Config{siteprefixexp}. Perls prior to 5.6.0 didn't have
+an explicit siteprefix in the Config. In those cases
+$Config{installprefix} will be used.
+
+Overridable by PREFIX
+
+=item SIGN
+
+When true, perform the generation and addition to the MANIFEST of the
+SIGNATURE file in the distdir during 'make distdir', via 'cpansign
+-s'.
+
+Note that you need to install the Module::Signature module to
+perform this operation.
+
+Defaults to false.
+
+=item SKIP
+
+Arrayref. E.g. [qw(name1 name2)] skip (do not write) sections of the
+Makefile. Caution! Do not use the SKIP attribute for the negligible
+speedup. It may seriously damage the resulting Makefile. Only use it
+if you really need it.
+
+=item TYPEMAPS
+
+Ref to array of typemap file names. Use this when the typemaps are
+in some directory other than the current directory or when they are
+not named B<typemap>. The last typemap in the list takes
+precedence. A typemap in the current directory has highest
+precedence, even if it isn't listed in TYPEMAPS. The default system
+typemap has lowest precedence.
+
+=item VENDORPREFIX
+
+Like PERLPREFIX, but only for the vendor install locations.
+
+Defaults to $Config{vendorprefixexp}.
+
+Overridable by PREFIX
+
+=item VERBINST
+
+If true, make install will be verbose
+
+=item VERSION
+
+Your version number for distributing the package. This defaults to
+0.1.
+
+=item VERSION_FROM
+
+Instead of specifying the VERSION in the Makefile.PL you can let
+MakeMaker parse a file to determine the version number. The parsing
+routine requires that the file named by VERSION_FROM contains one
+single line to compute the version number. The first line in the file
+that contains something like a $VERSION assignment or C<package Name
+VERSION> will be used. The following lines will be parsed o.k.:
+
+ # Good
+ package Foo::Bar 1.23; # 1.23
+ $VERSION = '1.00'; # 1.00
+ *VERSION = \'1.01'; # 1.01
+ ($VERSION) = q$Revision$ =~ /(\d+)/g; # The digits in $Revision$
+ $FOO::VERSION = '1.10'; # 1.10
+ *FOO::VERSION = \'1.11'; # 1.11
+
+but these will fail:
+
+ # Bad
+ my $VERSION = '1.01';
+ local $VERSION = '1.02';
+ local $FOO::VERSION = '1.30';
+
+"Version strings" are incompatible should not be used.
+
+ # Bad
+ $VERSION = 1.2.3;
+ $VERSION = v1.2.3;
+
+L<version> objects are fine. As of MakeMaker 6.35 version.pm will be
+automatically loaded, but you must declare the dependency on version.pm.
+For compatibility with older MakeMaker you should load on the same line
+as $VERSION is declared.
+
+ # All on one line
+ use version; our $VERSION = qv(1.2.3);
+
+(Putting C<my> or C<local> on the preceding line will work o.k.)
+
+The file named in VERSION_FROM is not added as a dependency to
+Makefile. This is not really correct, but it would be a major pain
+during development to have to rewrite the Makefile for any smallish
+change in that file. If you want to make sure that the Makefile
+contains the correct VERSION macro after any change of the file, you
+would have to do something like
+
+ depend => { Makefile => '$(VERSION_FROM)' }
+
+See attribute C<depend> below.
+
+=item VERSION_SYM
+
+A sanitized VERSION with . replaced by _. For places where . has
+special meaning (some filesystems, RCS labels, etc...)
+
+=item XS
+
+Hashref of .xs files. MakeMaker will default this. e.g.
+
+ {'name_of_file.xs' => 'name_of_file.c'}
+
+The .c files will automatically be included in the list of files
+deleted by a make clean.
+
+=item XSOPT
+
+String of options to pass to xsubpp. This might include C<-C++> or
+C<-extern>. Do not include typemaps here; the TYPEMAP parameter exists for
+that purpose.
+
+=item XSPROTOARG
+
+May be set to an empty string, which is identical to C<-prototypes>, or
+C<-noprototypes>. See the xsubpp documentation for details. MakeMaker
+defaults to the empty string.
+
+=item XS_VERSION
+
+Your version number for the .xs file of this package. This defaults
+to the value of the VERSION attribute.
+
+=back
+
+=head2 Additional lowercase attributes
+
+can be used to pass parameters to the methods which implement that
+part of the Makefile. Parameters are specified as a hash ref but are
+passed to the method as a hash.
+
+=over 2
+
+=item clean
+
+ {FILES => "*.xyz foo"}
+
+=item depend
+
+ {ANY_TARGET => ANY_DEPENDENCY, ...}
+
+(ANY_TARGET must not be given a double-colon rule by MakeMaker.)
+
+=item dist
+
+ {TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => '.gz',
+ SHAR => 'shar -m', DIST_CP => 'ln', ZIP => '/bin/zip',
+ ZIPFLAGS => '-rl', DIST_DEFAULT => 'private tardist' }
+
+If you specify COMPRESS, then SUFFIX should also be altered, as it is
+needed to tell make the target file of the compression. Setting
+DIST_CP to ln can be useful, if you need to preserve the timestamps on
+your files. DIST_CP can take the values 'cp', which copies the file,
+'ln', which links the file, and 'best' which copies symbolic links and
+links the rest. Default is 'best'.
+
+=item dynamic_lib
+
+ {ARMAYBE => 'ar', OTHERLDFLAGS => '...', INST_DYNAMIC_DEP => '...'}
+
+=item linkext
+
+ {LINKTYPE => 'static', 'dynamic' or ''}
+
+NB: Extensions that have nothing but *.pm files had to say
+
+ {LINKTYPE => ''}
+
+with Pre-5.0 MakeMakers. Since version 5.00 of MakeMaker such a line
+can be deleted safely. MakeMaker recognizes when there's nothing to
+be linked.
+
+=item macro
+
+ {ANY_MACRO => ANY_VALUE, ...}
+
+=item postamble
+
+Anything put here will be passed to MY::postamble() if you have one.
+
+=item realclean
+
+ {FILES => '$(INST_ARCHAUTODIR)/*.xyz'}
+
+=item test
+
+ {TESTS => 't/*.t'}
+
+=item tool_autosplit
+
+ {MAXLEN => 8}
+
+=back
+
+=head2 Overriding MakeMaker Methods
+
+If you cannot achieve the desired Makefile behaviour by specifying
+attributes you may define private subroutines in the Makefile.PL.
+Each subroutine returns the text it wishes to have written to
+the Makefile. To override a section of the Makefile you can
+either say:
+
+ sub MY::c_o { "new literal text" }
+
+or you can edit the default by saying something like:
+
+ package MY; # so that "SUPER" works right
+ sub c_o {
+ my $inherited = shift->SUPER::c_o(@_);
+ $inherited =~ s/old text/new text/;
+ $inherited;
+ }
+
+If you are running experiments with embedding perl as a library into
+other applications, you might find MakeMaker is not sufficient. You'd
+better have a look at ExtUtils::Embed which is a collection of utilities
+for embedding.
+
+If you still need a different solution, try to develop another
+subroutine that fits your needs and submit the diffs to
+C<makemaker@perl.org>
+
+For a complete description of all MakeMaker methods see
+L<ExtUtils::MM_Unix>.
+
+Here is a simple example of how to add a new target to the generated
+Makefile:
+
+ sub MY::postamble {
+ return <<'MAKE_FRAG';
+ $(MYEXTLIB): sdbm/Makefile
+ cd sdbm && $(MAKE) all
+
+ MAKE_FRAG
+ }
+
+=head2 The End Of Cargo Cult Programming
+
+WriteMakefile() now does some basic sanity checks on its parameters to
+protect against typos and malformatted values. This means some things
+which happened to work in the past will now throw warnings and
+possibly produce internal errors.
+
+Some of the most common mistakes:
+
+=over 2
+
+=item C<< MAN3PODS => ' ' >>
+
+This is commonly used to suppress the creation of man pages. MAN3PODS
+takes a hash ref not a string, but the above worked by accident in old
+versions of MakeMaker.
+
+The correct code is C<< MAN3PODS => { } >>.
+
+=back
+
+
+=head2 Hintsfile support
+
+MakeMaker.pm uses the architecture specific information from
+Config.pm. In addition it evaluates architecture specific hints files
+in a C<hints/> directory. The hints files are expected to be named
+like their counterparts in C<PERL_SRC/hints>, but with an C<.pl> file
+name extension (eg. C<next_3_2.pl>). They are simply C<eval>ed by
+MakeMaker within the WriteMakefile() subroutine, and can be used to
+execute commands as well as to include special variables. The rules
+which hintsfile is chosen are the same as in Configure.
+
+The hintsfile is eval()ed immediately after the arguments given to
+WriteMakefile are stuffed into a hash reference $self but before this
+reference becomes blessed. So if you want to do the equivalent to
+override or create an attribute you would say something like
+
+ $self->{LIBS} = ['-ldbm -lucb -lc'];
+
+=head2 Distribution Support
+
+For authors of extensions MakeMaker provides several Makefile
+targets. Most of the support comes from the ExtUtils::Manifest module,
+where additional documentation can be found.
+
+=over 4
+
+=item make distcheck
+
+reports which files are below the build directory but not in the
+MANIFEST file and vice versa. (See ExtUtils::Manifest::fullcheck() for
+details)
+
+=item make skipcheck
+
+reports which files are skipped due to the entries in the
+C<MANIFEST.SKIP> file (See ExtUtils::Manifest::skipcheck() for
+details)
+
+=item make distclean
+
+does a realclean first and then the distcheck. Note that this is not
+needed to build a new distribution as long as you are sure that the
+MANIFEST file is ok.
+
+=item make manifest
+
+rewrites the MANIFEST file, adding all remaining files found (See
+ExtUtils::Manifest::mkmanifest() for details)
+
+=item make distdir
+
+Copies all the files that are in the MANIFEST file to a newly created
+directory with the name C<$(DISTNAME)-$(VERSION)>. If that directory
+exists, it will be removed first.
+
+Additionally, it will create a META.yml module meta-data file in the
+distdir and add this to the distdir's MANIFEST. You can shut this
+behavior off with the NO_META flag.
+
+=item make disttest
+
+Makes a distdir first, and runs a C<perl Makefile.PL>, a make, and
+a make test in that directory.
+
+=item make tardist
+
+First does a distdir. Then a command $(PREOP) which defaults to a null
+command, followed by $(TO_UNIX), which defaults to a null command under
+UNIX, and will convert files in distribution directory to UNIX format
+otherwise. Next it runs C<tar> on that directory into a tarfile and
+deletes the directory. Finishes with a command $(POSTOP) which
+defaults to a null command.
+
+=item make dist
+
+Defaults to $(DIST_DEFAULT) which in turn defaults to tardist.
+
+=item make uutardist
+
+Runs a tardist first and uuencodes the tarfile.
+
+=item make shdist
+
+First does a distdir. Then a command $(PREOP) which defaults to a null
+command. Next it runs C<shar> on that directory into a sharfile and
+deletes the intermediate directory again. Finishes with a command
+$(POSTOP) which defaults to a null command. Note: For shdist to work
+properly a C<shar> program that can handle directories is mandatory.
+
+=item make zipdist
+
+First does a distdir. Then a command $(PREOP) which defaults to a null
+command. Runs C<$(ZIP) $(ZIPFLAGS)> on that directory into a
+zipfile. Then deletes that directory. Finishes with a command
+$(POSTOP) which defaults to a null command.
+
+=item make ci
+
+Does a $(CI) and a $(RCS_LABEL) on all files in the MANIFEST file.
+
+=back
+
+Customization of the dist targets can be done by specifying a hash
+reference to the dist attribute of the WriteMakefile call. The
+following parameters are recognized:
+
+ CI ('ci -u')
+ COMPRESS ('gzip --best')
+ POSTOP ('@ :')
+ PREOP ('@ :')
+ TO_UNIX (depends on the system)
+ RCS_LABEL ('rcs -q -Nv$(VERSION_SYM):')
+ SHAR ('shar')
+ SUFFIX ('.gz')
+ TAR ('tar')
+ TARFLAGS ('cvf')
+ ZIP ('zip')
+ ZIPFLAGS ('-r')
+
+An example:
+
+ WriteMakefile(
+ ...other options...
+ dist => {
+ COMPRESS => "bzip2",
+ SUFFIX => ".bz2"
+ }
+ );
+
+
+=head2 Module Meta-Data
+
+Long plaguing users of MakeMaker based modules has been the problem of
+getting basic information about the module out of the sources
+I<without> running the F<Makefile.PL> and doing a bunch of messy
+heuristics on the resulting F<Makefile>. To this end a simple module
+meta-data file has been introduced, F<META.yml>.
+
+F<META.yml> is a YAML document (see http://www.yaml.org) containing
+basic information about the module (name, version, prerequisites...)
+in an easy to read format. The format is developed and defined by the
+Module::Build developers (see
+http://module-build.sourceforge.net/META-spec.html)
+
+MakeMaker will automatically generate a F<META.yml> file for you and
+add it to your F<MANIFEST> as part of the 'distdir' target (and thus
+the 'dist' target). This is intended to seamlessly and rapidly
+populate CPAN with module meta-data. If you wish to shut this feature
+off, set the C<NO_META> C<WriteMakefile()> flag to true.
+
+
+=head2 Disabling an extension
+
+If some events detected in F<Makefile.PL> imply that there is no way
+to create the Module, but this is a normal state of things, then you
+can create a F<Makefile> which does nothing, but succeeds on all the
+"usual" build targets. To do so, use
+
+ use ExtUtils::MakeMaker qw(WriteEmptyMakefile);
+ WriteEmptyMakefile();
+
+instead of WriteMakefile().
+
+This may be useful if other modules expect this module to be I<built>
+OK, as opposed to I<work> OK (say, this system-dependent module builds
+in a subdirectory of some other distribution, or is listed as a
+dependency in a CPAN::Bundle, but the functionality is supported by
+different means on the current architecture).
+
+=head2 Other Handy Functions
+
+=over 4
+
+=item prompt
+
+ my $value = prompt($message);
+ my $value = prompt($message, $default);
+
+The C<prompt()> function provides an easy way to request user input
+used to write a makefile. It displays the $message as a prompt for
+input. If a $default is provided it will be used as a default. The
+function returns the $value selected by the user.
+
+If C<prompt()> detects that it is not running interactively and there
+is nothing on STDIN or if the PERL_MM_USE_DEFAULT environment variable
+is set to true, the $default will be used without prompting. This
+prevents automated processes from blocking on user input.
+
+If no $default is provided an empty string will be used instead.
+
+=back
+
+
+=head1 ENVIRONMENT
+
+=over 4
+
+=item PERL_MM_OPT
+
+Command line options used by C<MakeMaker-E<gt>new()>, and thus by
+C<WriteMakefile()>. The string is split on whitespace, and the result
+is processed before any actual command line arguments are processed.
+
+=item PERL_MM_USE_DEFAULT
+
+If set to a true value then MakeMaker's prompt function will
+always return the default without waiting for user input.
+
+=item PERL_CORE
+
+Same as the PERL_CORE parameter. The parameter overrides this.
+
+=back
+
+=head1 SEE ALSO
+
+L<Module::Build> is a pure-Perl alternative to MakeMaker which does
+not rely on make or any other external utility. It is easier to
+extend to suit your needs.
+
+L<Module::Install> is a wrapper around MakeMaker which adds features
+not normally available.
+
+L<ExtUtils::ModuleMaker> and L<Module::Starter> are both modules to
+help you setup your distribution.
+
+=head1 AUTHORS
+
+Andy Dougherty C<doughera@lafayette.edu>, Andreas KE<ouml>nig
+C<andreas.koenig@mind.de>, Tim Bunce C<timb@cpan.org>. VMS
+support by Charles Bailey C<bailey@newman.upenn.edu>. OS/2 support
+by Ilya Zakharevich C<ilya@math.ohio-state.edu>.
+
+Currently maintained by Michael G Schwern C<schwern@pobox.com>
+
+Send patches and ideas to C<makemaker@perl.org>.
+
+Send bug reports via http://rt.cpan.org/. Please send your
+generated Makefile along with your report.
+
+For more up-to-date information, see L<http://www.makemaker.org>.
+
+=head1 LICENSE
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker/Config.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker/Config.pm
new file mode 100755
index 00000000000..38b60affdda
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker/Config.pm
@@ -0,0 +1,39 @@
+package ExtUtils::MakeMaker::Config;
+
+use strict;
+
+our $VERSION = '6.56';
+
+use Config ();
+
+# Give us an overridable config.
+our %Config = %Config::Config;
+
+sub import {
+ my $caller = caller;
+
+ no strict 'refs'; ## no critic
+ *{$caller.'::Config'} = \%Config;
+}
+
+1;
+
+
+=head1 NAME
+
+ExtUtils::MakeMaker::Config - Wrapper around Config.pm
+
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MakeMaker::Config;
+ print $Config{installbin}; # or whatever
+
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY>
+
+A very thin wrapper around Config.pm so MakeMaker is easier to test.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker/FAQ.pod b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker/FAQ.pod
new file mode 100755
index 00000000000..d33f82e53b9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker/FAQ.pod
@@ -0,0 +1,431 @@
+package ExtUtils::MakeMaker::FAQ;
+
+our $VERSION = '1.12';
+
+1;
+__END__
+
+=head1 NAME
+
+ExtUtils::MakeMaker::FAQ - Frequently Asked Questions About MakeMaker
+
+=head1 DESCRIPTION
+
+FAQs, tricks and tips for C<ExtUtils::MakeMaker>.
+
+
+=head2 Module Installation
+
+=over 4
+
+=item How do I install a module into my home directory?
+
+If you're not the Perl administrator you probably don't have
+permission to install a module to its default location. Then you
+should install it for your own use into your home directory like so:
+
+ # Non-unix folks, replace ~ with /path/to/your/home/dir
+ perl Makefile.PL INSTALL_BASE=~
+
+This will put modules into F<~/lib/perl5>, man pages into F<~/man> and
+programs into F<~/bin>.
+
+To ensure your Perl programs can see these newly installed modules,
+set your C<PERL5LIB> environment variable to F<~/lib/perl5> or tell
+each of your programs to look in that directory with the following:
+
+ use lib "$ENV{HOME}/lib/perl5";
+
+or if $ENV{HOME} isn't set and you don't want to set it for some
+reason, do it the long way.
+
+ use lib "/path/to/your/home/dir/lib/perl5";
+
+
+=item How do I get MakeMaker and Module::Build to install to the same place?
+
+Module::Build, as of 0.28, supports two ways to install to the same
+location as MakeMaker.
+
+1) Use INSTALL_BASE / C<--install_base>
+
+MakeMaker (as of 6.31) and Module::Build (as of 0.28) both can install
+to the same locations using the "install_base" concept. See
+L<ExtUtils::MakeMaker/INSTALL_BASE> for details. To get MM and MB to
+install to the same location simply set INSTALL_BASE in MM and
+C<--install_base> in MB to the same location.
+
+ perl Makefile.PL INSTALL_BASE=/whatever
+ perl Build.PL --install_base /whatever
+
+2) Use PREFIX / C<--prefix>
+
+Module::Build 0.28 added support for C<--prefix> which works like
+MakeMaker's PREFIX.
+
+ perl Makefile.PL PREFIX=/whatever
+ perl Build.PL --prefix /whatever
+
+
+=item How do I keep from installing man pages?
+
+Recent versions of MakeMaker will only install man pages on Unix like
+operating systems.
+
+For an individual module:
+
+ perl Makefile.PL INSTALLMAN1DIR=none INSTALLMAN3DIR=none
+
+If you want to suppress man page installation for all modules you have
+to reconfigure Perl and tell it 'none' when it asks where to install
+man pages.
+
+
+=item How do I use a module without installing it?
+
+Two ways. One is to build the module normally...
+
+ perl Makefile.PL
+ make
+ make test
+
+...and then set the PERL5LIB environment variable to point at the
+blib/lib and blib/arch directories.
+
+The other is to install the module in a temporary location.
+
+ perl Makefile.PL INSTALL_BASE=~/tmp
+ make
+ make test
+ make install
+
+And then set PERL5LIB to F<~/tmp/lib/perl5>. This works well when you
+have multiple modules to work with. It also ensures that the module
+goes through its full installation process which may modify it.
+
+=item PREFIX vs INSTALL_BASE from Module::Build::Cookbook
+
+The behavior of PREFIX is complicated and depends closely on how your
+Perl is configured. The resulting installation locations will vary from
+machine to machine and even different installations of Perl on the same machine.
+Because of this, its difficult to document where prefix will place your modules.
+
+In contrast, INSTALL_BASE has predictable, easy to explain installation locations.
+Now that Module::Build and MakeMaker both have INSTALL_BASE there is little reason
+to use PREFIX other than to preserve your existing installation locations. If you
+are starting a fresh Perl installation we encourage you to use INSTALL_BASE. If
+you have an existing installation installed via PREFIX, consider moving it to an
+installation structure matching INSTALL_BASE and using that instead.
+
+=back
+
+
+=head2 Philosophy and History
+
+=over 4
+
+=item Why not just use <insert other build config tool here>?
+
+Why did MakeMaker reinvent the build configuration wheel? Why not
+just use autoconf or automake or ppm or Ant or ...
+
+There are many reasons, but the major one is cross-platform
+compatibility.
+
+Perl is one of the most ported pieces of software ever. It works on
+operating systems I've never even heard of (see perlport for details).
+It needs a build tool that can work on all those platforms and with
+any wacky C compilers and linkers they might have.
+
+No such build tool exists. Even make itself has wildly different
+dialects. So we have to build our own.
+
+
+=item What is Module::Build and how does it relate to MakeMaker?
+
+Module::Build is a project by Ken Williams to supplant MakeMaker.
+Its primary advantages are:
+
+=over 8
+
+=item * pure perl. no make, no shell commands
+
+=item * easier to customize
+
+=item * cleaner internals
+
+=item * less cruft
+
+=back
+
+Module::Build is the official heir apparent to MakeMaker and we
+encourage people to work on M::B rather than spending time adding features
+to MakeMaker.
+
+=back
+
+
+=head2 Module Writing
+
+=over 4
+
+=item How do I keep my $VERSION up to date without resetting it manually?
+
+Often you want to manually set the $VERSION in the main module
+distribution because this is the version that everybody sees on CPAN
+and maybe you want to customize it a bit. But for all the other
+modules in your dist, $VERSION is really just bookkeeping and all that's
+important is it goes up every time the module is changed. Doing this
+by hand is a pain and you often forget.
+
+Simplest way to do it automatically is to use your version control
+system's revision number (you are using version control, right?).
+
+In CVS, RCS and SVN you use $Revision$ (see the documentation of your
+version control system for details). Every time the file is checked
+in the $Revision$ will be updated, updating your $VERSION.
+
+SVN uses a simple integer for $Revision$ so you can adapt it for your
+$VERSION like so:
+
+ ($VERSION) = q$Revision$ =~ /(\d+)/;
+
+In CVS and RCS version 1.9 is followed by 1.10. Since CPAN compares
+version numbers numerically we use a sprintf() to convert 1.9 to 1.009
+and 1.10 to 1.010 which compare properly.
+
+ $VERSION = sprintf "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/g;
+
+If branches are involved (ie. $Revision: 1.5.3.4$) its a little more
+complicated.
+
+ # must be all on one line or MakeMaker will get confused.
+ $VERSION = do { my @r = (q$Revision$ =~ /\d+/g); sprintf "%d."."%03d" x $#r, @r };
+
+In SVN, $Revision$ should be the same for every file in the project so
+they would all have the same $VERSION. CVS and RCS have a different
+$Revision$ per file so each file will have a differnt $VERSION.
+Distributed version control systems, such as SVK, may have a different
+$Revision$ based on who checks out the file leading to a different $VERSION
+on each machine! Finally, some distributed version control systems, such
+as darcs, have no concept of revision number at all.
+
+
+=item What's this F<META.yml> thing and how did it get in my F<MANIFEST>?!
+
+F<META.yml> is a module meta-data file pioneered by Module::Build and
+automatically generated as part of the 'distdir' target (and thus
+'dist'). See L<ExtUtils::MakeMaker/"Module Meta-Data">.
+
+To shut off its generation, pass the C<NO_META> flag to C<WriteMakefile()>.
+
+
+=item How do I delete everything not in my F<MANIFEST>?
+
+Some folks are surpried that C<make distclean> does not delete
+everything not listed in their MANIFEST (thus making a clean
+distribution) but only tells them what they need to delete. This is
+done because it is considered too dangerous. While developing your
+module you might write a new file, not add it to the MANIFEST, then
+run a C<distclean> and be sad because your new work was deleted.
+
+If you really want to do this, you can use
+C<ExtUtils::Manifest::manifind()> to read the MANIFEST and File::Find
+to delete the files. But you have to be careful. Here's a script to
+do that. Use at your own risk. Have fun blowing holes in your foot.
+
+ #!/usr/bin/perl -w
+
+ use strict;
+
+ use File::Spec;
+ use File::Find;
+ use ExtUtils::Manifest qw(maniread);
+
+ my %manifest = map {( $_ => 1 )}
+ grep { File::Spec->canonpath($_) }
+ keys %{ maniread() };
+
+ if( !keys %manifest ) {
+ print "No files found in MANIFEST. Stopping.\n";
+ exit;
+ }
+
+ find({
+ wanted => sub {
+ my $path = File::Spec->canonpath($_);
+
+ return unless -f $path;
+ return if exists $manifest{ $path };
+
+ print "unlink $path\n";
+ unlink $path;
+ },
+ no_chdir => 1
+ },
+ "."
+ );
+
+
+=item Which zip should I use on Windows for '[nd]make zipdist'?
+
+We recommend InfoZIP: L<http://www.info-zip.org/Zip.html>
+
+
+=back
+
+=head2 XS
+
+=over 4
+
+=item How to I prevent "object version X.XX does not match bootstrap parameter Y.YY" errors?
+
+XS code is very sensitive to the module version number and will
+complain if the version number in your Perl module doesn't match. If
+you change your module's version # without rerunning Makefile.PL the old
+version number will remain in the Makefile causing the XS code to be built
+with the wrong number.
+
+To avoid this, you can force the Makefile to be rebuilt whenever you
+change the module containing the version number by adding this to your
+WriteMakefile() arguments.
+
+ depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' }
+
+
+=item How do I make two or more XS files coexist in the same directory?
+
+Sometimes you need to have two and more XS files in the same package.
+One way to go is to put them into separate directories, but sometimes
+this is not the most suitable solution. The following technique allows
+you to put two (and more) XS files in the same directory.
+
+Let's assume that we have a package C<Cool::Foo>, which includes
+C<Cool::Foo> and C<Cool::Bar> modules each having a separate XS
+file. First we use the following I<Makefile.PL>:
+
+ use ExtUtils::MakeMaker;
+
+ WriteMakefile(
+ NAME => 'Cool::Foo',
+ VERSION_FROM => 'Foo.pm',
+ OBJECT => q/$(O_FILES)/,
+ # ... other attrs ...
+ );
+
+Notice the C<OBJECT> attribute. MakeMaker generates the following
+variables in I<Makefile>:
+
+ # Handy lists of source code files:
+ XS_FILES= Bar.xs \
+ Foo.xs
+ C_FILES = Bar.c \
+ Foo.c
+ O_FILES = Bar.o \
+ Foo.o
+
+Therefore we can use the C<O_FILES> variable to tell MakeMaker to use
+these objects into the shared library.
+
+That's pretty much it. Now write I<Foo.pm> and I<Foo.xs>, I<Bar.pm>
+and I<Bar.xs>, where I<Foo.pm> bootstraps the shared library and
+I<Bar.pm> simply loading I<Foo.pm>.
+
+The only issue left is to how to bootstrap I<Bar.xs>. This is done
+from I<Foo.xs>:
+
+ MODULE = Cool::Foo PACKAGE = Cool::Foo
+
+ BOOT:
+ # boot the second XS file
+ boot_Cool__Bar(aTHX_ cv);
+
+If you have more than two files, this is the place where you should
+boot extra XS files from.
+
+The following four files sum up all the details discussed so far.
+
+ Foo.pm:
+ -------
+ package Cool::Foo;
+
+ require DynaLoader;
+
+ our @ISA = qw(DynaLoader);
+ our $VERSION = '0.01';
+ bootstrap Cool::Foo $VERSION;
+
+ 1;
+
+ Bar.pm:
+ -------
+ package Cool::Bar;
+
+ use Cool::Foo; # bootstraps Bar.xs
+
+ 1;
+
+ Foo.xs:
+ -------
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
+
+ MODULE = Cool::Foo PACKAGE = Cool::Foo
+
+ BOOT:
+ # boot the second XS file
+ boot_Cool__Bar(aTHX_ cv);
+
+ MODULE = Cool::Foo PACKAGE = Cool::Foo PREFIX = cool_foo_
+
+ void
+ cool_foo_perl_rules()
+
+ CODE:
+ fprintf(stderr, "Cool::Foo says: Perl Rules\n");
+
+ Bar.xs:
+ -------
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
+
+ MODULE = Cool::Bar PACKAGE = Cool::Bar PREFIX = cool_bar_
+
+ void
+ cool_bar_perl_rules()
+
+ CODE:
+ fprintf(stderr, "Cool::Bar says: Perl Rules\n");
+
+And of course a very basic test:
+
+ t/cool.t:
+ --------
+ use Test;
+ BEGIN { plan tests => 1 };
+ use Cool::Foo;
+ use Cool::Bar;
+ Cool::Foo::perl_rules();
+ Cool::Bar::perl_rules();
+ ok 1;
+
+This tip has been brought to you by Nick Ing-Simmons and Stas Bekman.
+
+=back
+
+=head1 PATCHING
+
+If you have a question you'd like to see added to the FAQ (whether or
+not you have the answer) please send it to makemaker@perl.org.
+
+=head1 AUTHOR
+
+The denizens of makemaker@perl.org.
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker/Tutorial.pod b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker/Tutorial.pod
new file mode 100755
index 00000000000..8ad72649b1a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/MakeMaker/Tutorial.pod
@@ -0,0 +1,180 @@
+package ExtUtils::MakeMaker::Tutorial;
+
+our $VERSION = 0.02;
+
+
+=head1 NAME
+
+ExtUtils::MakeMaker::Tutorial - Writing a module with MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MakeMaker;
+
+ WriteMakefile(
+ NAME => 'Your::Module',
+ VERSION_FROM => 'lib/Your/Module.pm'
+ );
+
+=head1 DESCRIPTION
+
+This is a short tutorial on writing a simple module with MakeMaker.
+Its really not that hard.
+
+
+=head2 The Mantra
+
+MakeMaker modules are installed using this simple mantra
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+There are lots more commands and options, but the above will do it.
+
+
+=head2 The Layout
+
+The basic files in a module look something like this.
+
+ Makefile.PL
+ MANIFEST
+ lib/Your/Module.pm
+
+That's all that's strictly necessary. There's additional files you might
+want:
+
+ lib/Your/Other/Module.pm
+ t/some_test.t
+ t/some_other_test.t
+ Changes
+ README
+ INSTALL
+ MANIFEST.SKIP
+ bin/some_program
+
+=over 4
+
+=item Makefile.PL
+
+When you run Makefile.PL, it makes a Makefile. That's the whole point of
+MakeMaker. The Makefile.PL is a simple program which loads
+ExtUtils::MakeMaker and runs the WriteMakefile() function to generate a
+Makefile.
+
+Here's an example of what you need for a simple module:
+
+ use ExtUtils::MakeMaker;
+
+ WriteMakefile(
+ NAME => 'Your::Module',
+ VERSION_FROM => 'lib/Your/Module.pm'
+ );
+
+NAME is the top-level namespace of your module. VERSION_FROM is the file
+which contains the $VERSION variable for the entire distribution. Typically
+this is the same as your top-level module.
+
+
+=item MANIFEST
+
+A simple listing of all the files in your distribution.
+
+ Makefile.PL
+ MANIFEST
+ lib/Your/Module.pm
+
+File paths in a MANIFEST always use Unix conventions (ie. /) even if you're
+not on Unix.
+
+You can write this by hand or generate it with 'make manifest'.
+
+See L<ExtUtils::Manifest> for more details.
+
+
+=item lib/
+
+This is the directory where your .pm and .pod files you wish to have
+installed go. They are layed out according to namespace. So Foo::Bar
+is F<lib/Foo/Bar.pm>.
+
+
+=item t/
+
+Tests for your modules go here. Each test filename ends with a .t.
+So F<t/foo.t>/ 'make test' will run these tests. The directory is flat,
+you cannot, for example, have t/foo/bar.t run by 'make test'.
+
+Tests are run from the top level of your distribution. So inside a test
+you would refer to ./lib to enter the lib directory, for example.
+
+
+=item Changes
+
+A log of changes you've made to this module. The layout is free-form.
+Here's an example:
+
+ 1.01 Fri Apr 11 00:21:25 PDT 2003
+ - thing() does some stuff now
+ - fixed the wiggy bug in withit()
+
+ 1.00 Mon Apr 7 00:57:15 PDT 2003
+ - "Rain of Frogs" now supported
+
+
+=item README
+
+A short description of your module, what it does, why someone would use it
+and its limitations. CPAN automatically pulls your README file out of
+the archive and makes it available to CPAN users, it is the first thing
+they will read to decide if your module is right for them.
+
+
+=item INSTALL
+
+Instructions on how to install your module along with any dependencies.
+Suggested information to include here:
+
+ any extra modules required for use
+ the minimum version of Perl required
+ if only works on certain operating systems
+
+
+=item MANIFEST.SKIP
+
+A file full of regular expressions to exclude when using 'make
+manifest' to generate the MANIFEST. These regular expressions
+are checked against each file path found in the distribution (so
+you're matching against "t/foo.t" not "foo.t").
+
+Here's a sample:
+
+ ~$ # ignore emacs and vim backup files
+ .bak$ # ignore manual backups
+ \# # ignore CVS old revision files and emacs temp files
+
+Since # can be used for comments, # must be escaped.
+
+MakeMaker comes with a default MANIFEST.SKIP to avoid things like
+version control directories and backup files. Specifying your own
+will override this default.
+
+
+=item bin/
+
+
+=back
+
+=head1 SEE ALSO
+
+L<perlmodstyle> gives stylistic help writing a module.
+
+L<perlnewmod> gives more information about how to write a module.
+
+There are modules to help you through the process of writing a module:
+L<ExtUtils::ModuleMaker>, L<Module::Install>, L<PAR>
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Manifest.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Manifest.pm
new file mode 100755
index 00000000000..ed8007fd97e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Manifest.pm
@@ -0,0 +1,881 @@
+package ExtUtils::Manifest;
+
+require Exporter;
+use Config;
+use File::Basename;
+use File::Copy 'copy';
+use File::Find;
+use File::Spec;
+use Carp;
+use strict;
+
+use vars qw($VERSION @ISA @EXPORT_OK
+ $Is_MacOS $Is_VMS $Is_VMS_mode $Is_VMS_lc $Is_VMS_nodot
+ $Debug $Verbose $Quiet $MANIFEST $DEFAULT_MSKIP);
+
+$VERSION = '1.58';
+@ISA=('Exporter');
+@EXPORT_OK = qw(mkmanifest
+ manicheck filecheck fullcheck skipcheck
+ manifind maniread manicopy maniadd
+ maniskip
+ );
+
+$Is_MacOS = $^O eq 'MacOS';
+$Is_VMS = $^O eq 'VMS';
+$Is_VMS_mode = 0;
+$Is_VMS_lc = 0;
+$Is_VMS_nodot = 0; # No dots in dir names or double dots in files
+
+if ($Is_VMS) {
+ require VMS::Filespec if $Is_VMS;
+ my $vms_unix_rpt;
+ my $vms_efs;
+ my $vms_case;
+
+ $Is_VMS_mode = 1;
+ $Is_VMS_lc = 1;
+ $Is_VMS_nodot = 1;
+ if (eval { local $SIG{__DIE__}; require VMS::Feature; }) {
+ $vms_unix_rpt = VMS::Feature::current("filename_unix_report");
+ $vms_efs = VMS::Feature::current("efs_charset");
+ $vms_case = VMS::Feature::current("efs_case_preserve");
+ } else {
+ my $unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
+ my $efs_charset = $ENV{'DECC$EFS_CHARSET'} || '';
+ my $efs_case = $ENV{'DECC$EFS_CASE_PRESERVE'} || '';
+ $vms_unix_rpt = $unix_rpt =~ /^[ET1]/i;
+ $vms_efs = $efs_charset =~ /^[ET1]/i;
+ $vms_case = $efs_case =~ /^[ET1]/i;
+ }
+ $Is_VMS_lc = 0 if ($vms_case);
+ $Is_VMS_mode = 0 if ($vms_unix_rpt);
+ $Is_VMS_nodot = 0 if ($vms_efs);
+}
+
+$Debug = $ENV{PERL_MM_MANIFEST_DEBUG} || 0;
+$Verbose = defined $ENV{PERL_MM_MANIFEST_VERBOSE} ?
+ $ENV{PERL_MM_MANIFEST_VERBOSE} : 1;
+$Quiet = 0;
+$MANIFEST = 'MANIFEST';
+
+$DEFAULT_MSKIP = File::Spec->catfile( dirname(__FILE__), "$MANIFEST.SKIP" );
+
+
+=head1 NAME
+
+ExtUtils::Manifest - utilities to write and check a MANIFEST file
+
+=head1 SYNOPSIS
+
+ use ExtUtils::Manifest qw(...funcs to import...);
+
+ mkmanifest();
+
+ my @missing_files = manicheck;
+ my @skipped = skipcheck;
+ my @extra_files = filecheck;
+ my($missing, $extra) = fullcheck;
+
+ my $found = manifind();
+
+ my $manifest = maniread();
+
+ manicopy($read,$target);
+
+ maniadd({$file => $comment, ...});
+
+
+=head1 DESCRIPTION
+
+=head2 Functions
+
+ExtUtils::Manifest exports no functions by default. The following are
+exported on request
+
+=over 4
+
+=item mkmanifest
+
+ mkmanifest();
+
+Writes all files in and below the current directory to your F<MANIFEST>.
+It works similar to the result of the Unix command
+
+ find . > MANIFEST
+
+All files that match any regular expression in a file F<MANIFEST.SKIP>
+(if it exists) are ignored.
+
+Any existing F<MANIFEST> file will be saved as F<MANIFEST.bak>.
+
+=cut
+
+sub _sort {
+ return sort { lc $a cmp lc $b } @_;
+}
+
+sub mkmanifest {
+ my $manimiss = 0;
+ my $read = (-r 'MANIFEST' && maniread()) or $manimiss++;
+ $read = {} if $manimiss;
+ local *M;
+ my $bakbase = $MANIFEST;
+ $bakbase =~ s/\./_/g if $Is_VMS_nodot; # avoid double dots
+ rename $MANIFEST, "$bakbase.bak" unless $manimiss;
+ open M, "> $MANIFEST" or die "Could not open $MANIFEST: $!";
+ my $skip = maniskip();
+ my $found = manifind();
+ my($key,$val,$file,%all);
+ %all = (%$found, %$read);
+ $all{$MANIFEST} = ($Is_VMS_mode ? "$MANIFEST\t\t" : '') .
+ 'This list of files'
+ if $manimiss; # add new MANIFEST to known file list
+ foreach $file (_sort keys %all) {
+ if ($skip->($file)) {
+ # Policy: only remove files if they're listed in MANIFEST.SKIP.
+ # Don't remove files just because they don't exist.
+ warn "Removed from $MANIFEST: $file\n" if $Verbose and exists $read->{$file};
+ next;
+ }
+ if ($Verbose){
+ warn "Added to $MANIFEST: $file\n" unless exists $read->{$file};
+ }
+ my $text = $all{$file};
+ $file = _unmacify($file);
+ my $tabs = (5 - (length($file)+1)/8);
+ $tabs = 1 if $tabs < 1;
+ $tabs = 0 unless $text;
+ if ($file =~ /\s/) {
+ $file =~ s/([\\'])/\\$1/g;
+ $file = "'$file'";
+ }
+ print M $file, "\t" x $tabs, $text, "\n";
+ }
+ close M;
+}
+
+# Geez, shouldn't this use File::Spec or File::Basename or something?
+# Why so careful about dependencies?
+sub clean_up_filename {
+ my $filename = shift;
+ $filename =~ s|^\./||;
+ $filename =~ s/^:([^:]+)$/$1/ if $Is_MacOS;
+ return $filename;
+}
+
+
+=item manifind
+
+ my $found = manifind();
+
+returns a hash reference. The keys of the hash are the files found
+below the current directory.
+
+=cut
+
+sub manifind {
+ my $p = shift || {};
+ my $found = {};
+
+ my $wanted = sub {
+ my $name = clean_up_filename($File::Find::name);
+ warn "Debug: diskfile $name\n" if $Debug;
+ return if -d $_;
+
+ if( $Is_VMS_lc ) {
+ $name =~ s#(.*)\.$#\L$1#;
+ $name = uc($name) if $name =~ /^MANIFEST(\.SKIP)?$/i;
+ }
+ $found->{$name} = "";
+ };
+
+ # We have to use "$File::Find::dir/$_" in preprocess, because
+ # $File::Find::name is unavailable.
+ # Also, it's okay to use / here, because MANIFEST files use Unix-style
+ # paths.
+ find({wanted => $wanted},
+ $Is_MacOS ? ":" : ".");
+
+ return $found;
+}
+
+
+=item manicheck
+
+ my @missing_files = manicheck();
+
+checks if all the files within a C<MANIFEST> in the current directory
+really do exist. If C<MANIFEST> and the tree below the current
+directory are in sync it silently returns an empty list.
+Otherwise it returns a list of files which are listed in the
+C<MANIFEST> but missing from the directory, and by default also
+outputs these names to STDERR.
+
+=cut
+
+sub manicheck {
+ return _check_files();
+}
+
+
+=item filecheck
+
+ my @extra_files = filecheck();
+
+finds files below the current directory that are not mentioned in the
+C<MANIFEST> file. An optional file C<MANIFEST.SKIP> will be
+consulted. Any file matching a regular expression in such a file will
+not be reported as missing in the C<MANIFEST> file. The list of any
+extraneous files found is returned, and by default also reported to
+STDERR.
+
+=cut
+
+sub filecheck {
+ return _check_manifest();
+}
+
+
+=item fullcheck
+
+ my($missing, $extra) = fullcheck();
+
+does both a manicheck() and a filecheck(), returning then as two array
+refs.
+
+=cut
+
+sub fullcheck {
+ return [_check_files()], [_check_manifest()];
+}
+
+
+=item skipcheck
+
+ my @skipped = skipcheck();
+
+lists all the files that are skipped due to your C<MANIFEST.SKIP>
+file.
+
+=cut
+
+sub skipcheck {
+ my($p) = @_;
+ my $found = manifind();
+ my $matches = maniskip();
+
+ my @skipped = ();
+ foreach my $file (_sort keys %$found){
+ if (&$matches($file)){
+ warn "Skipping $file\n" unless $Quiet;
+ push @skipped, $file;
+ next;
+ }
+ }
+
+ return @skipped;
+}
+
+
+sub _check_files {
+ my $p = shift;
+ my $dosnames=(defined(&Dos::UseLFN) && Dos::UseLFN()==0);
+ my $read = maniread() || {};
+ my $found = manifind($p);
+
+ my(@missfile) = ();
+ foreach my $file (_sort keys %$read){
+ warn "Debug: manicheck checking from $MANIFEST $file\n" if $Debug;
+ if ($dosnames){
+ $file = lc $file;
+ $file =~ s=(\.(\w|-)+)=substr ($1,0,4)=ge;
+ $file =~ s=((\w|-)+)=substr ($1,0,8)=ge;
+ }
+ unless ( exists $found->{$file} ) {
+ warn "No such file: $file\n" unless $Quiet;
+ push @missfile, $file;
+ }
+ }
+
+ return @missfile;
+}
+
+
+sub _check_manifest {
+ my($p) = @_;
+ my $read = maniread() || {};
+ my $found = manifind($p);
+ my $skip = maniskip();
+
+ my @missentry = ();
+ foreach my $file (_sort keys %$found){
+ next if $skip->($file);
+ warn "Debug: manicheck checking from disk $file\n" if $Debug;
+ unless ( exists $read->{$file} ) {
+ my $canon = $Is_MacOS ? "\t" . _unmacify($file) : '';
+ warn "Not in $MANIFEST: $file$canon\n" unless $Quiet;
+ push @missentry, $file;
+ }
+ }
+
+ return @missentry;
+}
+
+
+=item maniread
+
+ my $manifest = maniread();
+ my $manifest = maniread($manifest_file);
+
+reads a named C<MANIFEST> file (defaults to C<MANIFEST> in the current
+directory) and returns a HASH reference with files being the keys and
+comments being the values of the HASH. Blank lines and lines which
+start with C<#> in the C<MANIFEST> file are discarded.
+
+=cut
+
+sub maniread {
+ my ($mfile) = @_;
+ $mfile ||= $MANIFEST;
+ my $read = {};
+ local *M;
+ unless (open M, "< $mfile"){
+ warn "Problem opening $mfile: $!";
+ return $read;
+ }
+ local $_;
+ while (<M>){
+ chomp;
+ next if /^\s*#/;
+
+ my($file, $comment);
+
+ # filename may contain spaces if enclosed in ''
+ # (in which case, \\ and \' are escapes)
+ if (($file, $comment) = /^'(\\[\\']|.+)+'\s*(.*)/) {
+ $file =~ s/\\([\\'])/$1/g;
+ }
+ else {
+ ($file, $comment) = /^(\S+)\s*(.*)/;
+ }
+ next unless $file;
+
+ if ($Is_MacOS) {
+ $file = _macify($file);
+ $file =~ s/\\([0-3][0-7][0-7])/sprintf("%c", oct($1))/ge;
+ }
+ elsif ($Is_VMS_mode) {
+ require File::Basename;
+ my($base,$dir) = File::Basename::fileparse($file);
+ # Resolve illegal file specifications in the same way as tar
+ if ($Is_VMS_nodot) {
+ $dir =~ tr/./_/;
+ my(@pieces) = split(/\./,$base);
+ if (@pieces > 2)
+ { $base = shift(@pieces) . '.' . join('_',@pieces); }
+ my $okfile = "$dir$base";
+ warn "Debug: Illegal name $file changed to $okfile\n" if $Debug;
+ $file = $okfile;
+ }
+ $file = lc($file)
+ unless $Is_VMS_lc &&($file =~ /^MANIFEST(\.SKIP)?$/);
+ }
+
+ $read->{$file} = $comment;
+ }
+ close M;
+ $read;
+}
+
+=item maniskip
+
+ my $skipchk = maniskip();
+ my $skipchk = maniskip($manifest_skip_file);
+
+ if ($skipchk->($file)) { .. }
+
+reads a named C<MANIFEST.SKIP> file (defaults to C<MANIFEST.SKIP> in
+the current directory) and returns a CODE reference that tests whether
+a given filename should be skipped.
+
+=cut
+
+# returns an anonymous sub that decides if an argument matches
+sub maniskip {
+ my @skip ;
+ my $mfile = shift || "$MANIFEST.SKIP";
+ _check_mskip_directives($mfile) if -f $mfile;
+ local(*M, $_);
+ open M, "< $mfile" or open M, "< $DEFAULT_MSKIP" or return sub {0};
+ while (<M>){
+ chomp;
+ s/\r//;
+ $_ =~ qr{^\s*(?:(?:'([^\\']*(?:\\.[^\\']*)*)')|([^#\s]\S*))?(?:(?:\s*)|(?:\s+(.*?)\s*))$};
+ #my $comment = $3;
+ my $filename = $2;
+ if ( defined($1) ) {
+ $filename = $1;
+ $filename =~ s/\\(['\\])/$1/g;
+ }
+ next if (not defined($filename) or not $filename);
+ push @skip, _macify($filename);
+ }
+ close M;
+ return sub {0} unless (scalar @skip > 0);
+
+ my $opts = $Is_VMS_mode ? '(?i)' : '';
+
+ # Make sure each entry is isolated in its own parentheses, in case
+ # any of them contain alternations
+ my $regex = join '|', map "(?:$_)", @skip;
+
+ return sub { $_[0] =~ qr{$opts$regex} };
+}
+
+# checks for the special directives
+# #!include_default
+# #!include /path/to/some/manifest.skip
+# in a custom MANIFEST.SKIP for, for including
+# the content of, respectively, the default MANIFEST.SKIP
+# and an external manifest.skip file
+sub _check_mskip_directives {
+ my $mfile = shift;
+ local (*M, $_);
+ my @lines = ();
+ my $flag = 0;
+ unless (open M, "< $mfile") {
+ warn "Problem opening $mfile: $!";
+ return;
+ }
+ while (<M>) {
+ if (/^#!include_default\s*$/) {
+ if (my @default = _include_mskip_file()) {
+ push @lines, @default;
+ warn "Debug: Including default MANIFEST.SKIP\n" if $Debug;
+ $flag++;
+ }
+ next;
+ }
+ if (/^#!include\s+(.*)\s*$/) {
+ my $external_file = $1;
+ if (my @external = _include_mskip_file($external_file)) {
+ push @lines, @external;
+ warn "Debug: Including external $external_file\n" if $Debug;
+ $flag++;
+ }
+ next;
+ }
+ push @lines, $_;
+ }
+ close M;
+ return unless $flag;
+ my $bakbase = $mfile;
+ $bakbase =~ s/\./_/g if $Is_VMS_nodot; # avoid double dots
+ rename $mfile, "$bakbase.bak";
+ warn "Debug: Saving original $mfile as $bakbase.bak\n" if $Debug;
+ unless (open M, "> $mfile") {
+ warn "Problem opening $mfile: $!";
+ return;
+ }
+ print M $_ for (@lines);
+ close M;
+ return;
+}
+
+# returns an array containing the lines of an external
+# manifest.skip file, if given, or $DEFAULT_MSKIP
+sub _include_mskip_file {
+ my $mskip = shift || $DEFAULT_MSKIP;
+ unless (-f $mskip) {
+ warn qq{Included file "$mskip" not found - skipping};
+ return;
+ }
+ local (*M, $_);
+ unless (open M, "< $mskip") {
+ warn "Problem opening $mskip: $!";
+ return;
+ }
+ my @lines = ();
+ push @lines, "\n#!start included $mskip\n";
+ push @lines, $_ while <M>;
+ close M;
+ push @lines, "#!end included $mskip\n\n";
+ return @lines;
+}
+
+=item manicopy
+
+ manicopy(\%src, $dest_dir);
+ manicopy(\%src, $dest_dir, $how);
+
+Copies the files that are the keys in %src to the $dest_dir. %src is
+typically returned by the maniread() function.
+
+ manicopy( maniread(), $dest_dir );
+
+This function is useful for producing a directory tree identical to the
+intended distribution tree.
+
+$how can be used to specify a different methods of "copying". Valid
+values are C<cp>, which actually copies the files, C<ln> which creates
+hard links, and C<best> which mostly links the files but copies any
+symbolic link to make a tree without any symbolic link. C<cp> is the
+default.
+
+=cut
+
+sub manicopy {
+ my($read,$target,$how)=@_;
+ croak "manicopy() called without target argument" unless defined $target;
+ $how ||= 'cp';
+ require File::Path;
+ require File::Basename;
+
+ $target = VMS::Filespec::unixify($target) if $Is_VMS_mode;
+ File::Path::mkpath([ $target ],! $Quiet,$Is_VMS ? undef : 0755);
+ foreach my $file (keys %$read){
+ if ($Is_MacOS) {
+ if ($file =~ m!:!) {
+ my $dir = _maccat($target, $file);
+ $dir =~ s/[^:]+$//;
+ File::Path::mkpath($dir,1,0755);
+ }
+ cp_if_diff($file, _maccat($target, $file), $how);
+ } else {
+ $file = VMS::Filespec::unixify($file) if $Is_VMS_mode;
+ if ($file =~ m!/!) { # Ilya, that hurts, I fear, or maybe not?
+ my $dir = File::Basename::dirname($file);
+ $dir = VMS::Filespec::unixify($dir) if $Is_VMS_mode;
+ File::Path::mkpath(["$target/$dir"],! $Quiet,$Is_VMS ? undef : 0755);
+ }
+ cp_if_diff($file, "$target/$file", $how);
+ }
+ }
+}
+
+sub cp_if_diff {
+ my($from, $to, $how)=@_;
+ if (! -f $from) {
+ carp "$from not found";
+ return;
+ }
+ my($diff) = 0;
+ local(*F,*T);
+ open(F,"< $from\0") or die "Can't read $from: $!\n";
+ if (open(T,"< $to\0")) {
+ local $_;
+ while (<F>) { $diff++,last if $_ ne <T>; }
+ $diff++ unless eof(T);
+ close T;
+ }
+ else { $diff++; }
+ close F;
+ if ($diff) {
+ if (-e $to) {
+ unlink($to) or confess "unlink $to: $!";
+ }
+ STRICT_SWITCH: {
+ best($from,$to), last STRICT_SWITCH if $how eq 'best';
+ cp($from,$to), last STRICT_SWITCH if $how eq 'cp';
+ ln($from,$to), last STRICT_SWITCH if $how eq 'ln';
+ croak("ExtUtils::Manifest::cp_if_diff " .
+ "called with illegal how argument [$how]. " .
+ "Legal values are 'best', 'cp', and 'ln'.");
+ }
+ }
+}
+
+sub cp {
+ my ($srcFile, $dstFile) = @_;
+ my ($access,$mod) = (stat $srcFile)[8,9];
+
+ copy($srcFile,$dstFile);
+ utime $access, $mod + ($Is_VMS ? 1 : 0), $dstFile;
+ _manicopy_chmod($srcFile, $dstFile);
+}
+
+
+sub ln {
+ my ($srcFile, $dstFile) = @_;
+ # Fix-me - VMS can support links.
+ return &cp if $Is_VMS or ($^O eq 'MSWin32' and Win32::IsWin95());
+ link($srcFile, $dstFile);
+
+ unless( _manicopy_chmod($srcFile, $dstFile) ) {
+ unlink $dstFile;
+ return;
+ }
+ 1;
+}
+
+# 1) Strip off all group and world permissions.
+# 2) Let everyone read it.
+# 3) If the owner can execute it, everyone can.
+sub _manicopy_chmod {
+ my($srcFile, $dstFile) = @_;
+
+ my $perm = 0444 | (stat $srcFile)[2] & 0700;
+ chmod( $perm | ( $perm & 0100 ? 0111 : 0 ), $dstFile );
+}
+
+# Files that are often modified in the distdir. Don't hard link them.
+my @Exceptions = qw(MANIFEST META.yml SIGNATURE);
+sub best {
+ my ($srcFile, $dstFile) = @_;
+
+ my $is_exception = grep $srcFile =~ /$_/, @Exceptions;
+ if ($is_exception or !$Config{d_link} or -l $srcFile) {
+ cp($srcFile, $dstFile);
+ } else {
+ ln($srcFile, $dstFile) or cp($srcFile, $dstFile);
+ }
+}
+
+sub _macify {
+ my($file) = @_;
+
+ return $file unless $Is_MacOS;
+
+ $file =~ s|^\./||;
+ if ($file =~ m|/|) {
+ $file =~ s|/+|:|g;
+ $file = ":$file";
+ }
+
+ $file;
+}
+
+sub _maccat {
+ my($f1, $f2) = @_;
+
+ return "$f1/$f2" unless $Is_MacOS;
+
+ $f1 .= ":$f2";
+ $f1 =~ s/([^:]:):/$1/g;
+ return $f1;
+}
+
+sub _unmacify {
+ my($file) = @_;
+
+ return $file unless $Is_MacOS;
+
+ $file =~ s|^:||;
+ $file =~ s|([/ \n])|sprintf("\\%03o", unpack("c", $1))|ge;
+ $file =~ y|:|/|;
+
+ $file;
+}
+
+
+=item maniadd
+
+ maniadd({ $file => $comment, ...});
+
+Adds an entry to an existing F<MANIFEST> unless its already there.
+
+$file will be normalized (ie. Unixified). B<UNIMPLEMENTED>
+
+=cut
+
+sub maniadd {
+ my($additions) = shift;
+
+ _normalize($additions);
+ _fix_manifest($MANIFEST);
+
+ my $manifest = maniread();
+ my @needed = grep { !exists $manifest->{$_} } keys %$additions;
+ return 1 unless @needed;
+
+ open(MANIFEST, ">>$MANIFEST") or
+ die "maniadd() could not open $MANIFEST: $!";
+
+ foreach my $file (_sort @needed) {
+ my $comment = $additions->{$file} || '';
+ if ($file =~ /\s/) {
+ $file =~ s/([\\'])/\\$1/g;
+ $file = "'$file'";
+ }
+ printf MANIFEST "%-40s %s\n", $file, $comment;
+ }
+ close MANIFEST or die "Error closing $MANIFEST: $!";
+
+ return 1;
+}
+
+
+# Sometimes MANIFESTs are missing a trailing newline. Fix this.
+sub _fix_manifest {
+ my $manifest_file = shift;
+
+ open MANIFEST, $MANIFEST or die "Could not open $MANIFEST: $!";
+
+ # Yes, we should be using seek(), but I'd like to avoid loading POSIX
+ # to get SEEK_*
+ my @manifest = <MANIFEST>;
+ close MANIFEST;
+
+ unless( $manifest[-1] =~ /\n\z/ ) {
+ open MANIFEST, ">>$MANIFEST" or die "Could not open $MANIFEST: $!";
+ print MANIFEST "\n";
+ close MANIFEST;
+ }
+}
+
+
+# UNIMPLEMENTED
+sub _normalize {
+ return;
+}
+
+
+=back
+
+=head2 MANIFEST
+
+A list of files in the distribution, one file per line. The MANIFEST
+always uses Unix filepath conventions even if you're not on Unix. This
+means F<foo/bar> style not F<foo\bar>.
+
+Anything between white space and an end of line within a C<MANIFEST>
+file is considered to be a comment. Any line beginning with # is also
+a comment. Beginning with ExtUtils::Manifest 1.52, a filename may
+contain whitespace characters if it is enclosed in single quotes; single
+quotes or backslashes in that filename must be backslash-escaped.
+
+ # this a comment
+ some/file
+ some/other/file comment about some/file
+ 'some/third file' comment
+
+
+=head2 MANIFEST.SKIP
+
+The file MANIFEST.SKIP may contain regular expressions of files that
+should be ignored by mkmanifest() and filecheck(). The regular
+expressions should appear one on each line. Blank lines and lines
+which start with C<#> are skipped. Use C<\#> if you need a regular
+expression to start with a C<#>.
+
+For example:
+
+ # Version control files and dirs.
+ \bRCS\b
+ \bCVS\b
+ ,v$
+ \B\.svn\b
+
+ # Makemaker generated files and dirs.
+ ^MANIFEST\.
+ ^Makefile$
+ ^blib/
+ ^MakeMaker-\d
+
+ # Temp, old and emacs backup files.
+ ~$
+ \.old$
+ ^#.*#$
+ ^\.#
+
+If no MANIFEST.SKIP file is found, a default set of skips will be
+used, similar to the example above. If you want nothing skipped,
+simply make an empty MANIFEST.SKIP file.
+
+In one's own MANIFEST.SKIP file, certain directives
+can be used to include the contents of other MANIFEST.SKIP
+files. At present two such directives are recognized.
+
+=over 4
+
+=item #!include_default
+
+This inserts the contents of the default MANIFEST.SKIP file
+
+=item #!include /Path/to/another/manifest.skip
+
+This inserts the contents of the specified external file
+
+=back
+
+The included contents will be inserted into the MANIFEST.SKIP
+file in between I<#!start included /path/to/manifest.skip>
+and I<#!end included /path/to/manifest.skip> markers.
+The original MANIFEST.SKIP is saved as MANIFEST.SKIP.bak.
+
+=head2 EXPORT_OK
+
+C<&mkmanifest>, C<&manicheck>, C<&filecheck>, C<&fullcheck>,
+C<&maniread>, and C<&manicopy> are exportable.
+
+=head2 GLOBAL VARIABLES
+
+C<$ExtUtils::Manifest::MANIFEST> defaults to C<MANIFEST>. Changing it
+results in both a different C<MANIFEST> and a different
+C<MANIFEST.SKIP> file. This is useful if you want to maintain
+different distributions for different audiences (say a user version
+and a developer version including RCS).
+
+C<$ExtUtils::Manifest::Quiet> defaults to 0. If set to a true value,
+all functions act silently.
+
+C<$ExtUtils::Manifest::Debug> defaults to 0. If set to a true value,
+or if PERL_MM_MANIFEST_DEBUG is true, debugging output will be
+produced.
+
+=head1 DIAGNOSTICS
+
+All diagnostic output is sent to C<STDERR>.
+
+=over 4
+
+=item C<Not in MANIFEST:> I<file>
+
+is reported if a file is found which is not in C<MANIFEST>.
+
+=item C<Skipping> I<file>
+
+is reported if a file is skipped due to an entry in C<MANIFEST.SKIP>.
+
+=item C<No such file:> I<file>
+
+is reported if a file mentioned in a C<MANIFEST> file does not
+exist.
+
+=item C<MANIFEST:> I<$!>
+
+is reported if C<MANIFEST> could not be opened.
+
+=item C<Added to MANIFEST:> I<file>
+
+is reported by mkmanifest() if $Verbose is set and a file is added
+to MANIFEST. $Verbose is set to 1 by default.
+
+=back
+
+=head1 ENVIRONMENT
+
+=over 4
+
+=item B<PERL_MM_MANIFEST_DEBUG>
+
+Turns on debugging
+
+=back
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker> which has handy targets for most of the functionality.
+
+=head1 AUTHOR
+
+Andreas Koenig C<andreas.koenig@anima.de>
+
+Maintained by Michael G Schwern C<schwern@pobox.com> within the
+ExtUtils-MakeMaker package and, as a separate CPAN package, by
+Randy Kobes C<r.kobes@uwinnipeg.ca>.
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Miniperl.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Miniperl.pm
new file mode 100755
index 00000000000..0a44f676d05
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Miniperl.pm
@@ -0,0 +1,273 @@
+# This File keeps the contents of miniperlmain.c.
+#
+# It was generated automatically by minimod.PL from the contents
+# of miniperlmain.c. Don't edit this file!
+#
+# ANY CHANGES MADE HERE WILL BE LOST!
+#
+
+
+package ExtUtils::Miniperl;
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(&writemain);
+
+$head= <<'EOF!HEAD';
+/* miniperlmain.c
+ *
+ * Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003,
+ * 2004, 2005, 2006, 2007, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * The Road goes ever on and on
+ * Down from the door where it began.
+ *
+ * [Bilbo on p.35 of _The Lord of the Rings_, I/i: "A Long-Expected Party"]
+ * [Frodo on p.73 of _The Lord of the Rings_, I/iii: "Three Is Company"]
+ */
+
+/* This file contains the main() function for the perl interpreter.
+ * Note that miniperlmain.c contains main() for the 'miniperl' binary,
+ * while perlmain.c contains main() for the 'perl' binary.
+ *
+ * Miniperl is like perl except that it does not support dynamic loading,
+ * and in fact is used to build the dynamic modules needed for the 'real'
+ * perl executable.
+ */
+
+#ifdef OEMVS
+#ifdef MYMALLOC
+/* sbrk is limited to first heap segment so make it big */
+#pragma runopts(HEAP(8M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON))
+#else
+#pragma runopts(HEAP(2M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON))
+#endif
+#endif
+
+
+#include "EXTERN.h"
+#define PERL_IN_MINIPERLMAIN_C
+#include "perl.h"
+#include "XSUB.h"
+
+static void xs_init (pTHX);
+static PerlInterpreter *my_perl;
+
+#if defined (__MINT__) || defined (atarist)
+/* The Atari operating system doesn't have a dynamic stack. The
+ stack size is determined from this value. */
+long _stksize = 64 * 1024;
+#endif
+
+#if defined(PERL_GLOBAL_STRUCT_PRIVATE)
+/* The static struct perl_vars* may seem counterproductive since the
+ * whole idea PERL_GLOBAL_STRUCT_PRIVATE was to avoid statics, but note
+ * that this static is not in the shared perl library, the globals PL_Vars
+ * and PL_VarsPtr will stay away. */
+static struct perl_vars* my_plvarsp;
+struct perl_vars* Perl_GetVarsPrivate(void) { return my_plvarsp; }
+#endif
+
+#ifdef NO_ENV_ARRAY_IN_MAIN
+extern char **environ;
+int
+main(int argc, char **argv)
+#else
+int
+main(int argc, char **argv, char **env)
+#endif
+{
+ dVAR;
+ int exitstatus;
+#ifdef PERL_GLOBAL_STRUCT
+ struct perl_vars *plvarsp = init_global_struct();
+# ifdef PERL_GLOBAL_STRUCT_PRIVATE
+ my_vars = my_plvarsp = plvarsp;
+# endif
+#endif /* PERL_GLOBAL_STRUCT */
+ (void)env;
+#ifndef PERL_USE_SAFE_PUTENV
+ PL_use_safe_putenv = 0;
+#endif /* PERL_USE_SAFE_PUTENV */
+
+ /* if user wants control of gprof profiling off by default */
+ /* noop unless Configure is given -Accflags=-DPERL_GPROF_CONTROL */
+ PERL_GPROF_MONCONTROL(0);
+
+#ifdef NO_ENV_ARRAY_IN_MAIN
+ PERL_SYS_INIT3(&argc,&argv,&environ);
+#else
+ PERL_SYS_INIT3(&argc,&argv,&env);
+#endif
+
+#if defined(USE_ITHREADS)
+ /* XXX Ideally, this should really be happening in perl_alloc() or
+ * perl_construct() to keep libperl.a transparently fork()-safe.
+ * It is currently done here only because Apache/mod_perl have
+ * problems due to lack of a call to cancel pthread_atfork()
+ * handlers when shared objects that contain the handlers may
+ * be dlclose()d. This forces applications that embed perl to
+ * call PTHREAD_ATFORK() explicitly, but if and only if it hasn't
+ * been called at least once before in the current process.
+ * --GSAR 2001-07-20 */
+ PTHREAD_ATFORK(Perl_atfork_lock,
+ Perl_atfork_unlock,
+ Perl_atfork_unlock);
+#endif
+
+ if (!PL_do_undump) {
+ my_perl = perl_alloc();
+ if (!my_perl)
+ exit(1);
+ perl_construct(my_perl);
+ PL_perl_destruct_level = 0;
+ }
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+ exitstatus = perl_parse(my_perl, xs_init, argc, argv, (char **)NULL);
+ if (!exitstatus)
+ perl_run(my_perl);
+
+ exitstatus = perl_destruct(my_perl);
+
+ perl_free(my_perl);
+
+#if defined(USE_ENVIRON_ARRAY) && defined(PERL_TRACK_MEMPOOL) && !defined(NO_ENV_ARRAY_IN_MAIN)
+ /*
+ * The old environment may have been freed by perl_free()
+ * when PERL_TRACK_MEMPOOL is defined, but without having
+ * been restored by perl_destruct() before (this is only
+ * done if destruct_level > 0).
+ *
+ * It is important to have a valid environment for atexit()
+ * routines that are eventually called.
+ */
+ environ = env;
+#endif
+
+#ifdef PERL_GLOBAL_STRUCT
+ free_global_struct(plvarsp);
+#endif /* PERL_GLOBAL_STRUCT */
+
+ PERL_SYS_TERM();
+
+ exit(exitstatus);
+ return exitstatus;
+}
+
+/* Register any extra external extensions */
+
+EOF!HEAD
+$tail=<<'EOF!TAIL';
+
+static void
+xs_init(pTHX)
+{
+ PERL_UNUSED_CONTEXT;
+}
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
+EOF!TAIL
+
+sub writemain{
+ my(@exts) = @_;
+
+ my($pname);
+ my($dl) = canon('/','DynaLoader');
+ print $head;
+
+ foreach $_ (@exts){
+ my($pname) = canon('/', $_);
+ my($mname, $cname);
+ ($mname = $pname) =~ s!/!::!g;
+ ($cname = $pname) =~ s!/!__!g;
+ print "EXTERN_C void boot_${cname} (pTHX_ CV* cv);\n";
+ }
+
+ my ($tail1,$tail2,$tail3) = ( $tail =~ /\A(.*{\s*\n)(.*\n)(\s*\}.*)\Z/s );
+
+ print $tail1;
+ print "\tconst char file[] = __FILE__;\n";
+ print "\tdXSUB_SYS;\n" if $] > 5.002;
+ print $tail2;
+
+ foreach $_ (@exts){
+ my($pname) = canon('/', $_);
+ my($mname, $cname, $ccode);
+ ($mname = $pname) =~ s!/!::!g;
+ ($cname = $pname) =~ s!/!__!g;
+ print "\t{\n";
+ if ($pname eq $dl){
+ # Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'!
+ # boot_DynaLoader is called directly in DynaLoader.pm
+ $ccode = "\t/* DynaLoader is a special case */\n
+\tnewXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n";
+ print $ccode unless $SEEN{$ccode}++;
+ } else {
+ $ccode = "\tnewXS(\"${mname}::bootstrap\", boot_${cname}, file);\n";
+ print $ccode unless $SEEN{$ccode}++;
+ }
+ print "\t}\n";
+ }
+ print $tail3;
+}
+
+sub canon{
+ my($as, @ext) = @_;
+ foreach(@ext){
+ # might be X::Y or lib/auto/X/Y/Y.a
+ next if s!::!/!g;
+ s:^(lib|ext)/(auto/)?::;
+ s:/\w+\.\w+$::;
+ }
+ grep(s:/:$as:, @ext) if ($as ne '/');
+ @ext;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+ExtUtils::Miniperl, writemain - write the C code for perlmain.c
+
+=head1 SYNOPSIS
+
+C<use ExtUtils::Miniperl;>
+
+C<writemain(@directories);>
+
+=head1 DESCRIPTION
+
+This whole module is written when perl itself is built from a script
+called minimod.PL. In case you want to patch it, please patch
+minimod.PL in the perl distribution instead.
+
+writemain() takes an argument list of directories containing archive
+libraries that relate to perl modules and should be linked into a new
+perl binary. It writes to STDOUT a corresponding perlmain.c file that
+is a plain C file containing all the bootstrap code to make the
+modules associated with the libraries available from within perl.
+
+The typical usage is from within a Makefile generated by
+ExtUtils::MakeMaker. So under normal circumstances you won't have to
+deal with this module directly.
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Mkbootstrap.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Mkbootstrap.pm
new file mode 100755
index 00000000000..707466a98dd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Mkbootstrap.pm
@@ -0,0 +1,109 @@
+package ExtUtils::Mkbootstrap;
+
+# There's just too much Dynaloader incest here to turn on strict vars.
+use strict 'refs';
+
+our $VERSION = '6.56';
+
+require Exporter;
+our @ISA = ('Exporter');
+our @EXPORT = ('&Mkbootstrap');
+
+use Config;
+
+our $Verbose = 0;
+
+
+sub Mkbootstrap {
+ my($baseext, @bsloadlibs)=@_;
+ @bsloadlibs = grep($_, @bsloadlibs); # strip empty libs
+
+ print STDOUT " bsloadlibs=@bsloadlibs\n" if $Verbose;
+
+ # We need DynaLoader here because we and/or the *_BS file may
+ # call dl_findfile(). We don't say `use' here because when
+ # first building perl extensions the DynaLoader will not have
+ # been built when MakeMaker gets first used.
+ require DynaLoader;
+
+ rename "$baseext.bs", "$baseext.bso"
+ if -s "$baseext.bs";
+
+ if (-f "${baseext}_BS"){
+ $_ = "${baseext}_BS";
+ package DynaLoader; # execute code as if in DynaLoader
+ local($osname, $dlsrc) = (); # avoid warnings
+ ($osname, $dlsrc) = @Config::Config{qw(osname dlsrc)};
+ $bscode = "";
+ unshift @INC, ".";
+ require $_;
+ shift @INC;
+ }
+
+ if ($Config{'dlsrc'} =~ /^dl_dld/){
+ package DynaLoader;
+ push(@dl_resolve_using, dl_findfile('-lc'));
+ }
+
+ my(@all) = (@bsloadlibs, @DynaLoader::dl_resolve_using);
+ my($method) = '';
+ if (@all){
+ open my $bs, ">", "$baseext.bs"
+ or die "Unable to open $baseext.bs: $!";
+ print STDOUT "Writing $baseext.bs\n";
+ print STDOUT " containing: @all" if $Verbose;
+ print $bs "# $baseext DynaLoader bootstrap file for $^O architecture.\n";
+ print $bs "# Do not edit this file, changes will be lost.\n";
+ print $bs "# This file was automatically generated by the\n";
+ print $bs "# Mkbootstrap routine in ExtUtils::Mkbootstrap (v$VERSION).\n";
+ print $bs "\@DynaLoader::dl_resolve_using = ";
+ # If @all contains names in the form -lxxx or -Lxxx then it's asking for
+ # runtime library location so we automatically add a call to dl_findfile()
+ if (" @all" =~ m/ -[lLR]/){
+ print $bs " dl_findfile(qw(\n @all\n ));\n";
+ }else{
+ print $bs " qw(@all);\n";
+ }
+ # write extra code if *_BS says so
+ print $bs $DynaLoader::bscode if $DynaLoader::bscode;
+ print $bs "\n1;\n";
+ close $bs;
+ }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Mkbootstrap - make a bootstrap file for use by DynaLoader
+
+=head1 SYNOPSIS
+
+C<Mkbootstrap>
+
+=head1 DESCRIPTION
+
+Mkbootstrap typically gets called from an extension Makefile.
+
+There is no C<*.bs> file supplied with the extension. Instead, there may
+be a C<*_BS> file which has code for the special cases, like posix for
+berkeley db on the NeXT.
+
+This file will get parsed, and produce a maybe empty
+C<@DynaLoader::dl_resolve_using> array for the current architecture.
+That will be extended by $BSLOADLIBS, which was computed by
+ExtUtils::Liblist::ext(). If this array still is empty, we do nothing,
+else we write a .bs file with an C<@DynaLoader::dl_resolve_using>
+array.
+
+The C<*_BS> file can put some code into the generated C<*.bs> file by
+placing it in C<$bscode>. This is a handy 'escape' mechanism that may
+prove useful in complex situations.
+
+If @DynaLoader::dl_resolve_using contains C<-L*> or C<-l*> entries then
+Mkbootstrap will automatically add a dl_findfile() call to the
+generated C<*.bs> file.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Mksymlists.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Mksymlists.pm
new file mode 100755
index 00000000000..962c67fd57f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Mksymlists.pm
@@ -0,0 +1,312 @@
+package ExtUtils::Mksymlists;
+
+use 5.006;
+use strict qw[ subs refs ];
+# no strict 'vars'; # until filehandles are exempted
+
+use Carp;
+use Exporter;
+use Config;
+
+our @ISA = qw(Exporter);
+our @EXPORT = qw(&Mksymlists);
+our $VERSION = '6.56';
+
+sub Mksymlists {
+ my(%spec) = @_;
+ my($osname) = $^O;
+
+ croak("Insufficient information specified to Mksymlists")
+ unless ( $spec{NAME} or
+ ($spec{FILE} and ($spec{DL_FUNCS} or $spec{FUNCLIST})) );
+
+ $spec{DL_VARS} = [] unless $spec{DL_VARS};
+ ($spec{FILE} = $spec{NAME}) =~ s/.*::// unless $spec{FILE};
+ $spec{FUNCLIST} = [] unless $spec{FUNCLIST};
+ $spec{DL_FUNCS} = { $spec{NAME} => [] }
+ unless ( ($spec{DL_FUNCS} and keys %{$spec{DL_FUNCS}}) or
+ @{$spec{FUNCLIST}});
+ if (defined $spec{DL_FUNCS}) {
+ foreach my $package (keys %{$spec{DL_FUNCS}}) {
+ my($packprefix,$bootseen);
+ ($packprefix = $package) =~ s/\W/_/g;
+ foreach my $sym (@{$spec{DL_FUNCS}->{$package}}) {
+ if ($sym =~ /^boot_/) {
+ push(@{$spec{FUNCLIST}},$sym);
+ $bootseen++;
+ }
+ else {
+ push(@{$spec{FUNCLIST}},"XS_${packprefix}_$sym");
+ }
+ }
+ push(@{$spec{FUNCLIST}},"boot_$packprefix") unless $bootseen;
+ }
+ }
+
+# We'll need this if we ever add any OS which uses mod2fname
+# not as pseudo-builtin.
+# require DynaLoader;
+ if (defined &DynaLoader::mod2fname and not $spec{DLBASE}) {
+ $spec{DLBASE} = DynaLoader::mod2fname([ split(/::/,$spec{NAME}) ]);
+ }
+
+ if ($osname eq 'aix') { _write_aix(\%spec); }
+ elsif ($osname eq 'MacOS'){ _write_aix(\%spec) }
+ elsif ($osname eq 'VMS') { _write_vms(\%spec) }
+ elsif ($osname eq 'os2') { _write_os2(\%spec) }
+ elsif ($osname eq 'MSWin32') { _write_win32(\%spec) }
+ else {
+ croak("Don't know how to create linker option file for $osname\n");
+ }
+}
+
+
+sub _write_aix {
+ my($data) = @_;
+
+ rename "$data->{FILE}.exp", "$data->{FILE}.exp_old";
+
+ open( my $exp, ">", "$data->{FILE}.exp")
+ or croak("Can't create $data->{FILE}.exp: $!\n");
+ print $exp join("\n",@{$data->{DL_VARS}}, "\n") if @{$data->{DL_VARS}};
+ print $exp join("\n",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}};
+ close $exp;
+}
+
+
+sub _write_os2 {
+ my($data) = @_;
+ require Config;
+ my $threaded = ($Config::Config{archname} =~ /-thread/ ? " threaded" : "");
+
+ if (not $data->{DLBASE}) {
+ ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://;
+ $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_';
+ }
+ my $distname = $data->{DISTNAME} || $data->{NAME};
+ $distname = "Distribution $distname";
+ my $patchlevel = " pl$Config{perl_patchlevel}" || '';
+ my $comment = sprintf "Perl (v%s%s%s) module %s",
+ $Config::Config{version}, $threaded, $patchlevel, $data->{NAME};
+ chomp $comment;
+ if ($data->{INSTALLDIRS} and $data->{INSTALLDIRS} eq 'perl') {
+ $distname = 'perl5-porters@perl.org';
+ $comment = "Core $comment";
+ }
+ $comment = "$comment (Perl-config: $Config{config_args})";
+ $comment = substr($comment, 0, 200) . "...)" if length $comment > 203;
+ rename "$data->{FILE}.def", "$data->{FILE}_def.old";
+
+ open(my $def, ">", "$data->{FILE}.def")
+ or croak("Can't create $data->{FILE}.def: $!\n");
+ print $def "LIBRARY '$data->{DLBASE}' INITINSTANCE TERMINSTANCE\n";
+ print $def "DESCRIPTION '\@#$distname:$data->{VERSION}#\@ $comment'\n";
+ print $def "CODE LOADONCALL\n";
+ print $def "DATA LOADONCALL NONSHARED MULTIPLE\n";
+ print $def "EXPORTS\n ";
+ print $def join("\n ",@{$data->{DL_VARS}}, "\n") if @{$data->{DL_VARS}};
+ print $def join("\n ",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}};
+ if (%{$data->{IMPORTS}}) {
+ print $def "IMPORTS\n";
+ my ($name, $exp);
+ while (($name, $exp)= each %{$data->{IMPORTS}}) {
+ print $def " $name=$exp\n";
+ }
+ }
+ close $def;
+}
+
+sub _write_win32 {
+ my($data) = @_;
+
+ require Config;
+ if (not $data->{DLBASE}) {
+ ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://;
+ $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_';
+ }
+ rename "$data->{FILE}.def", "$data->{FILE}_def.old";
+
+ open( my $def, ">", "$data->{FILE}.def" )
+ or croak("Can't create $data->{FILE}.def: $!\n");
+ # put library name in quotes (it could be a keyword, like 'Alias')
+ if ($Config::Config{'cc'} !~ /^gcc/i) {
+ print $def "LIBRARY \"$data->{DLBASE}\"\n";
+ }
+ print $def "EXPORTS\n ";
+ my @syms;
+ # Export public symbols both with and without underscores to
+ # ensure compatibility between DLLs from different compilers
+ # NOTE: DynaLoader itself only uses the names without underscores,
+ # so this is only to cover the case when the extension DLL may be
+ # linked to directly from C. GSAR 97-07-10
+ if ($Config::Config{'cc'} =~ /^bcc/i) {
+ for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}) {
+ push @syms, "_$_", "$_ = _$_";
+ }
+ }
+ else {
+ for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}) {
+ push @syms, "$_", "_$_ = $_";
+ }
+ }
+ print $def join("\n ",@syms, "\n") if @syms;
+ if (%{$data->{IMPORTS}}) {
+ print $def "IMPORTS\n";
+ my ($name, $exp);
+ while (($name, $exp)= each %{$data->{IMPORTS}}) {
+ print $def " $name=$exp\n";
+ }
+ }
+ close $def;
+}
+
+
+sub _write_vms {
+ my($data) = @_;
+
+ require Config; # a reminder for once we do $^O
+ require ExtUtils::XSSymSet;
+
+ my($isvax) = $Config::Config{'archname'} =~ /VAX/i;
+ my($set) = new ExtUtils::XSSymSet;
+
+ rename "$data->{FILE}.opt", "$data->{FILE}.opt_old";
+
+ open(my $opt,">", "$data->{FILE}.opt")
+ or croak("Can't create $data->{FILE}.opt: $!\n");
+
+ # Options file declaring universal symbols
+ # Used when linking shareable image for dynamic extension,
+ # or when linking PerlShr into which we've added this package
+ # as a static extension
+ # We don't do anything to preserve order, so we won't relax
+ # the GSMATCH criteria for a dynamic extension
+
+ print $opt "case_sensitive=yes\n"
+ if $Config::Config{d_vms_case_sensitive_symbols};
+
+ foreach my $sym (@{$data->{FUNCLIST}}) {
+ my $safe = $set->addsym($sym);
+ if ($isvax) { print $opt "UNIVERSAL=$safe\n" }
+ else { print $opt "SYMBOL_VECTOR=($safe=PROCEDURE)\n"; }
+ }
+
+ foreach my $sym (@{$data->{DL_VARS}}) {
+ my $safe = $set->addsym($sym);
+ print $opt "PSECT_ATTR=${sym},PIC,OVR,RD,NOEXE,WRT,NOSHR\n";
+ if ($isvax) { print $opt "UNIVERSAL=$safe\n" }
+ else { print $opt "SYMBOL_VECTOR=($safe=DATA)\n"; }
+ }
+
+ close $opt;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Mksymlists - write linker options files for dynamic extension
+
+=head1 SYNOPSIS
+
+ use ExtUtils::Mksymlists;
+ Mksymlists({ NAME => $name ,
+ DL_VARS => [ $var1, $var2, $var3 ],
+ DL_FUNCS => { $pkg1 => [ $func1, $func2 ],
+ $pkg2 => [ $func3 ] });
+
+=head1 DESCRIPTION
+
+C<ExtUtils::Mksymlists> produces files used by the linker under some OSs
+during the creation of shared libraries for dynamic extensions. It is
+normally called from a MakeMaker-generated Makefile when the extension
+is built. The linker option file is generated by calling the function
+C<Mksymlists>, which is exported by default from C<ExtUtils::Mksymlists>.
+It takes one argument, a list of key-value pairs, in which the following
+keys are recognized:
+
+=over 4
+
+=item DLBASE
+
+This item specifies the name by which the linker knows the
+extension, which may be different from the name of the
+extension itself (for instance, some linkers add an '_' to the
+name of the extension). If it is not specified, it is derived
+from the NAME attribute. It is presently used only by OS2 and Win32.
+
+=item DL_FUNCS
+
+This is identical to the DL_FUNCS attribute available via MakeMaker,
+from which it is usually taken. Its value is a reference to an
+associative array, in which each key is the name of a package, and
+each value is an a reference to an array of function names which
+should be exported by the extension. For instance, one might say
+C<DL_FUNCS =E<gt> { Homer::Iliad =E<gt> [ qw(trojans greeks) ],
+Homer::Odyssey =E<gt> [ qw(travellers family suitors) ] }>. The
+function names should be identical to those in the XSUB code;
+C<Mksymlists> will alter the names written to the linker option
+file to match the changes made by F<xsubpp>. In addition, if
+none of the functions in a list begin with the string B<boot_>,
+C<Mksymlists> will add a bootstrap function for that package,
+just as xsubpp does. (If a B<boot_E<lt>pkgE<gt>> function is
+present in the list, it is passed through unchanged.) If
+DL_FUNCS is not specified, it defaults to the bootstrap
+function for the extension specified in NAME.
+
+=item DL_VARS
+
+This is identical to the DL_VARS attribute available via MakeMaker,
+and, like DL_FUNCS, it is usually specified via MakeMaker. Its
+value is a reference to an array of variable names which should
+be exported by the extension.
+
+=item FILE
+
+This key can be used to specify the name of the linker option file
+(minus the OS-specific extension), if for some reason you do not
+want to use the default value, which is the last word of the NAME
+attribute (I<e.g.> for C<Tk::Canvas>, FILE defaults to C<Canvas>).
+
+=item FUNCLIST
+
+This provides an alternate means to specify function names to be
+exported from the extension. Its value is a reference to an
+array of function names to be exported by the extension. These
+names are passed through unaltered to the linker options file.
+Specifying a value for the FUNCLIST attribute suppresses automatic
+generation of the bootstrap function for the package. To still create
+the bootstrap name you have to specify the package name in the
+DL_FUNCS hash:
+
+ Mksymlists({ NAME => $name ,
+ FUNCLIST => [ $func1, $func2 ],
+ DL_FUNCS => { $pkg => [] } });
+
+
+=item IMPORTS
+
+This attribute is used to specify names to be imported into the
+extension. It is currently only used by OS/2 and Win32.
+
+=item NAME
+
+This gives the name of the extension (I<e.g.> C<Tk::Canvas>) for which
+the linker option file will be produced.
+
+=back
+
+When calling C<Mksymlists>, one should always specify the NAME
+attribute. In most cases, this is all that's necessary. In
+the case of unusual extensions, however, the other attributes
+can be used to provide additional information to the linker.
+
+=head1 AUTHOR
+
+Charles Bailey I<E<lt>bailey@newman.upenn.eduE<gt>>
+
+=head1 REVISION
+
+Last revised 14-Feb-1996, for Perl 5.002.
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/Packlist.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Packlist.pm
new file mode 100755
index 00000000000..04f267a0a3d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/Packlist.pm
@@ -0,0 +1,348 @@
+package ExtUtils::Packlist;
+
+use 5.00503;
+use strict;
+use Carp qw();
+use Config;
+use vars qw($VERSION $Relocations);
+$VERSION = '1.43';
+$VERSION = eval $VERSION;
+
+# Used for generating filehandle globs. IO::File might not be available!
+my $fhname = "FH1";
+
+=begin _undocumented
+
+=item mkfh()
+
+Make a filehandle. Same kind of idea as Symbol::gensym().
+
+=cut
+
+sub mkfh()
+{
+no strict;
+my $fh = \*{$fhname++};
+use strict;
+return($fh);
+}
+
+=item __find_relocations
+
+Works out what absolute paths in the configuration have been located at run
+time relative to $^X, and generates a regexp that matches them
+
+=end _undocumented
+
+=cut
+
+sub __find_relocations
+{
+ my %paths;
+ while (my ($raw_key, $raw_val) = each %Config) {
+ my $exp_key = $raw_key . "exp";
+ next unless exists $Config{$exp_key};
+ next unless $raw_val =~ m!\.\.\./!;
+ $paths{$Config{$exp_key}}++;
+ }
+ # Longest prefixes go first in the alternatives
+ my $alternations = join "|", map {quotemeta $_}
+ sort {length $b <=> length $a} keys %paths;
+ qr/^($alternations)/o;
+}
+
+sub new($$)
+{
+my ($class, $packfile) = @_;
+$class = ref($class) || $class;
+my %self;
+tie(%self, $class, $packfile);
+return(bless(\%self, $class));
+}
+
+sub TIEHASH
+{
+my ($class, $packfile) = @_;
+my $self = { packfile => $packfile };
+bless($self, $class);
+$self->read($packfile) if (defined($packfile) && -f $packfile);
+return($self);
+}
+
+sub STORE
+{
+$_[0]->{data}->{$_[1]} = $_[2];
+}
+
+sub FETCH
+{
+return($_[0]->{data}->{$_[1]});
+}
+
+sub FIRSTKEY
+{
+my $reset = scalar(keys(%{$_[0]->{data}}));
+return(each(%{$_[0]->{data}}));
+}
+
+sub NEXTKEY
+{
+return(each(%{$_[0]->{data}}));
+}
+
+sub EXISTS
+{
+return(exists($_[0]->{data}->{$_[1]}));
+}
+
+sub DELETE
+{
+return(delete($_[0]->{data}->{$_[1]}));
+}
+
+sub CLEAR
+{
+%{$_[0]->{data}} = ();
+}
+
+sub DESTROY
+{
+}
+
+sub read($;$)
+{
+my ($self, $packfile) = @_;
+$self = tied(%$self) || $self;
+
+if (defined($packfile)) { $self->{packfile} = $packfile; }
+else { $packfile = $self->{packfile}; }
+Carp::croak("No packlist filename specified") if (! defined($packfile));
+my $fh = mkfh();
+open($fh, "<$packfile") || Carp::croak("Can't open file $packfile: $!");
+$self->{data} = {};
+my ($line);
+while (defined($line = <$fh>))
+ {
+ chomp $line;
+ my ($key, $data) = $line;
+ if ($key =~ /^(.*?)( \w+=.*)$/)
+ {
+ $key = $1;
+ $data = { map { split('=', $_) } split(' ', $2)};
+
+ if ($Config{userelocatableinc} && $data->{relocate_as})
+ {
+ require File::Spec;
+ require Cwd;
+ my ($vol, $dir) = File::Spec->splitpath($packfile);
+ my $newpath = File::Spec->catpath($vol, $dir, $data->{relocate_as});
+ $key = Cwd::realpath($newpath);
+ }
+ }
+ $key =~ s!/\./!/!g; # Some .packlists have spurious '/./' bits in the paths
+ $self->{data}->{$key} = $data;
+ }
+close($fh);
+}
+
+sub write($;$)
+{
+my ($self, $packfile) = @_;
+$self = tied(%$self) || $self;
+if (defined($packfile)) { $self->{packfile} = $packfile; }
+else { $packfile = $self->{packfile}; }
+Carp::croak("No packlist filename specified") if (! defined($packfile));
+my $fh = mkfh();
+open($fh, ">$packfile") || Carp::croak("Can't open file $packfile: $!");
+foreach my $key (sort(keys(%{$self->{data}})))
+ {
+ my $data = $self->{data}->{$key};
+ if ($Config{userelocatableinc}) {
+ $Relocations ||= __find_relocations();
+ if ($packfile =~ $Relocations) {
+ # We are writing into a subdirectory of a run-time relocated
+ # path. Figure out if the this file is also within a subdir.
+ my $prefix = $1;
+ if (File::Spec->no_upwards(File::Spec->abs2rel($key, $prefix)))
+ {
+ # The relocated path is within the found prefix
+ my $packfile_prefix;
+ (undef, $packfile_prefix)
+ = File::Spec->splitpath($packfile);
+
+ my $relocate_as
+ = File::Spec->abs2rel($key, $packfile_prefix);
+
+ if (!ref $data) {
+ $data = {};
+ }
+ $data->{relocate_as} = $relocate_as;
+ }
+ }
+ }
+ print $fh ("$key");
+ if (ref($data))
+ {
+ foreach my $k (sort(keys(%$data)))
+ {
+ print $fh (" $k=$data->{$k}");
+ }
+ }
+ print $fh ("\n");
+ }
+close($fh);
+}
+
+sub validate($;$)
+{
+my ($self, $remove) = @_;
+$self = tied(%$self) || $self;
+my @missing;
+foreach my $key (sort(keys(%{$self->{data}})))
+ {
+ if (! -e $key)
+ {
+ push(@missing, $key);
+ delete($self->{data}{$key}) if ($remove);
+ }
+ }
+return(@missing);
+}
+
+sub packlist_file($)
+{
+my ($self) = @_;
+$self = tied(%$self) || $self;
+return($self->{packfile});
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Packlist - manage .packlist files
+
+=head1 SYNOPSIS
+
+ use ExtUtils::Packlist;
+ my ($pl) = ExtUtils::Packlist->new('.packlist');
+ $pl->read('/an/old/.packlist');
+ my @missing_files = $pl->validate();
+ $pl->write('/a/new/.packlist');
+
+ $pl->{'/some/file/name'}++;
+ or
+ $pl->{'/some/other/file/name'} = { type => 'file',
+ from => '/some/file' };
+
+=head1 DESCRIPTION
+
+ExtUtils::Packlist provides a standard way to manage .packlist files.
+Functions are provided to read and write .packlist files. The original
+.packlist format is a simple list of absolute pathnames, one per line. In
+addition, this package supports an extended format, where as well as a filename
+each line may contain a list of attributes in the form of a space separated
+list of key=value pairs. This is used by the installperl script to
+differentiate between files and links, for example.
+
+=head1 USAGE
+
+The hash reference returned by the new() function can be used to examine and
+modify the contents of the .packlist. Items may be added/deleted from the
+.packlist by modifying the hash. If the value associated with a hash key is a
+scalar, the entry written to the .packlist by any subsequent write() will be a
+simple filename. If the value is a hash, the entry written will be the
+filename followed by the key=value pairs from the hash. Reading back the
+.packlist will recreate the original entries.
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item new()
+
+This takes an optional parameter, the name of a .packlist. If the file exists,
+it will be opened and the contents of the file will be read. The new() method
+returns a reference to a hash. This hash holds an entry for each line in the
+.packlist. In the case of old-style .packlists, the value associated with each
+key is undef. In the case of new-style .packlists, the value associated with
+each key is a hash containing the key=value pairs following the filename in the
+.packlist.
+
+=item read()
+
+This takes an optional parameter, the name of the .packlist to be read. If
+no file is specified, the .packlist specified to new() will be read. If the
+.packlist does not exist, Carp::croak will be called.
+
+=item write()
+
+This takes an optional parameter, the name of the .packlist to be written. If
+no file is specified, the .packlist specified to new() will be overwritten.
+
+=item validate()
+
+This checks that every file listed in the .packlist actually exists. If an
+argument which evaluates to true is given, any missing files will be removed
+from the internal hash. The return value is a list of the missing files, which
+will be empty if they all exist.
+
+=item packlist_file()
+
+This returns the name of the associated .packlist file
+
+=back
+
+=head1 EXAMPLE
+
+Here's C<modrm>, a little utility to cleanly remove an installed module.
+
+ #!/usr/local/bin/perl -w
+
+ use strict;
+ use IO::Dir;
+ use ExtUtils::Packlist;
+ use ExtUtils::Installed;
+
+ sub emptydir($) {
+ my ($dir) = @_;
+ my $dh = IO::Dir->new($dir) || return(0);
+ my @count = $dh->read();
+ $dh->close();
+ return(@count == 2 ? 1 : 0);
+ }
+
+ # Find all the installed packages
+ print("Finding all installed modules...\n");
+ my $installed = ExtUtils::Installed->new();
+
+ foreach my $module (grep(!/^Perl$/, $installed->modules())) {
+ my $version = $installed->version($module) || "???";
+ print("Found module $module Version $version\n");
+ print("Do you want to delete $module? [n] ");
+ my $r = <STDIN>; chomp($r);
+ if ($r && $r =~ /^y/i) {
+ # Remove all the files
+ foreach my $file (sort($installed->files($module))) {
+ print("rm $file\n");
+ unlink($file);
+ }
+ my $pf = $installed->packlist($module)->packlist_file();
+ print("rm $pf\n");
+ unlink($pf);
+ foreach my $dir (sort($installed->directory_tree($module))) {
+ if (emptydir($dir)) {
+ print("rmdir $dir\n");
+ rmdir($dir);
+ }
+ }
+ }
+ }
+
+=head1 AUTHOR
+
+Alan Burlison <Alan.Burlison@uk.sun.com>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/ParseXS.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/ParseXS.pm
new file mode 100755
index 00000000000..1bc3f22f8f3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/ParseXS.pm
@@ -0,0 +1,2170 @@
+package ExtUtils::ParseXS;
+
+use 5.006; # We use /??{}/ in regexes
+use Cwd;
+use Config;
+use File::Basename;
+use File::Spec;
+use Symbol;
+
+require Exporter;
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(process_file);
+
+# use strict; # One of these days...
+
+my(@XSStack); # Stack of conditionals and INCLUDEs
+my($XSS_work_idx, $cpp_next_tmp);
+
+use vars qw($VERSION);
+$VERSION = '2.2202';
+$VERSION = eval $VERSION if $VERSION =~ /_/;
+
+use vars qw(%input_expr %output_expr $ProtoUsed @InitFileCode $FH $proto_re $Overload $errors $Fallback
+ $cplusplus $hiertype $WantPrototypes $WantVersionChk $except $WantLineNumbers
+ $WantOptimize $process_inout $process_argtypes @tm
+ $dir $filename $filepathname %IncludedFiles
+ %type_kind %proto_letter
+ %targetable $BLOCK_re $lastline $lastline_no
+ $Package $Prefix @line @BootCode %args_match %defaults %var_types %arg_list @proto_arg
+ $processing_arg_with_types %argtype_seen @outlist %in_out %lengthof
+ $proto_in_this_xsub $scope_in_this_xsub $interface $prepush_done $interface_macro $interface_macro_set
+ $ProtoThisXSUB $ScopeThisXSUB $xsreturn
+ @line_no $ret_type $func_header $orig_args
+ ); # Add these just to get compilation to happen.
+
+
+sub process_file {
+
+ # Allow for $package->process_file(%hash) in the future
+ my ($pkg, %args) = @_ % 2 ? @_ : (__PACKAGE__, @_);
+
+ $ProtoUsed = exists $args{prototypes};
+
+ # Set defaults.
+ %args = (
+ # 'C++' => 0, # Doesn't seem to *do* anything...
+ hiertype => 0,
+ except => 0,
+ prototypes => 0,
+ versioncheck => 1,
+ linenumbers => 1,
+ optimize => 1,
+ prototypes => 0,
+ inout => 1,
+ argtypes => 1,
+ typemap => [],
+ output => \*STDOUT,
+ csuffix => '.c',
+ %args,
+ );
+
+ # Global Constants
+
+ my ($Is_VMS, $SymSet);
+ if ($^O eq 'VMS') {
+ $Is_VMS = 1;
+ # Establish set of global symbols with max length 28, since xsubpp
+ # will later add the 'XS_' prefix.
+ require ExtUtils::XSSymSet;
+ $SymSet = new ExtUtils::XSSymSet 28;
+ }
+ @XSStack = ({type => 'none'});
+ ($XSS_work_idx, $cpp_next_tmp) = (0, "XSubPPtmpAAAA");
+ @InitFileCode = ();
+ $FH = Symbol::gensym();
+ $proto_re = "[" . quotemeta('\$%&*@;[]') . "]" ;
+ $Overload = 0;
+ $errors = 0;
+ $Fallback = '&PL_sv_undef';
+
+ # Most of the 1500 lines below uses these globals. We'll have to
+ # clean this up sometime, probably. For now, we just pull them out
+ # of %args. -Ken
+
+ $cplusplus = $args{'C++'};
+ $hiertype = $args{hiertype};
+ $WantPrototypes = $args{prototypes};
+ $WantVersionChk = $args{versioncheck};
+ $except = $args{except} ? ' TRY' : '';
+ $WantLineNumbers = $args{linenumbers};
+ $WantOptimize = $args{optimize};
+ $process_inout = $args{inout};
+ $process_argtypes = $args{argtypes};
+ @tm = ref $args{typemap} ? @{$args{typemap}} : ($args{typemap});
+
+ for ($args{filename}) {
+ die "Missing required parameter 'filename'" unless $_;
+ $filepathname = $_;
+ ($dir, $filename) = (dirname($_), basename($_));
+ $filepathname =~ s/\\/\\\\/g;
+ $IncludedFiles{$_}++;
+ }
+
+ # Open the input file
+ open($FH, $args{filename}) or die "cannot open $args{filename}: $!\n";
+
+ # Open the output file if given as a string. If they provide some
+ # other kind of reference, trust them that we can print to it.
+ if (not ref $args{output}) {
+ open my($fh), "> $args{output}" or die "Can't create $args{output}: $!";
+ $args{outfile} = $args{output};
+ $args{output} = $fh;
+ }
+
+ # Really, we shouldn't have to chdir() or select() in the first
+ # place. For now, just save & restore.
+ my $orig_cwd = cwd();
+ my $orig_fh = select();
+
+ chdir($dir);
+ my $pwd = cwd();
+ my $csuffix = $args{csuffix};
+
+ if ($WantLineNumbers) {
+ my $cfile;
+ if ( $args{outfile} ) {
+ $cfile = $args{outfile};
+ } else {
+ $cfile = $args{filename};
+ $cfile =~ s/\.xs$/$csuffix/i or $cfile .= $csuffix;
+ }
+ tie(*PSEUDO_STDOUT, 'ExtUtils::ParseXS::CountLines', $cfile, $args{output});
+ select PSEUDO_STDOUT;
+ } else {
+ select $args{output};
+ }
+
+ foreach my $typemap (@tm) {
+ die "Can't find $typemap in $pwd\n" unless -r $typemap;
+ }
+
+ push @tm, standard_typemap_locations();
+
+ foreach my $typemap (@tm) {
+ next unless -f $typemap ;
+ # skip directories, binary files etc.
+ warn("Warning: ignoring non-text typemap file '$typemap'\n"), next
+ unless -T $typemap ;
+ open(TYPEMAP, $typemap)
+ or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
+ my $mode = 'Typemap';
+ my $junk = "" ;
+ my $current = \$junk;
+ while (<TYPEMAP>) {
+ next if /^\s* #/;
+ my $line_no = $. + 1;
+ if (/^INPUT\s*$/) {
+ $mode = 'Input'; $current = \$junk; next;
+ }
+ if (/^OUTPUT\s*$/) {
+ $mode = 'Output'; $current = \$junk; next;
+ }
+ if (/^TYPEMAP\s*$/) {
+ $mode = 'Typemap'; $current = \$junk; next;
+ }
+ if ($mode eq 'Typemap') {
+ chomp;
+ my $line = $_ ;
+ TrimWhitespace($_) ;
+ # skip blank lines and comment lines
+ next if /^$/ or /^#/ ;
+ my($type,$kind, $proto) = /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/ or
+ warn("Warning: File '$typemap' Line $. '$line' TYPEMAP entry needs 2 or 3 columns\n"), next;
+ $type = TidyType($type) ;
+ $type_kind{$type} = $kind ;
+ # prototype defaults to '$'
+ $proto = "\$" unless $proto ;
+ warn("Warning: File '$typemap' Line $. '$line' Invalid prototype '$proto'\n")
+ unless ValidProtoString($proto) ;
+ $proto_letter{$type} = C_string($proto) ;
+ } elsif (/^\s/) {
+ $$current .= $_;
+ } elsif ($mode eq 'Input') {
+ s/\s+$//;
+ $input_expr{$_} = '';
+ $current = \$input_expr{$_};
+ } else {
+ s/\s+$//;
+ $output_expr{$_} = '';
+ $current = \$output_expr{$_};
+ }
+ }
+ close(TYPEMAP);
+ }
+
+ foreach my $value (values %input_expr) {
+ $value =~ s/;*\s+\z//;
+ # Move C pre-processor instructions to column 1 to be strictly ANSI
+ # conformant. Some pre-processors are fussy about this.
+ $value =~ s/^\s+#/#/mg;
+ }
+ foreach my $value (values %output_expr) {
+ # And again.
+ $value =~ s/^\s+#/#/mg;
+ }
+
+ my ($cast, $size);
+ our $bal = qr[(?:(?>[^()]+)|\((??{ $bal })\))*]; # ()-balanced
+ $cast = qr[(?:\(\s*SV\s*\*\s*\)\s*)?]; # Optional (SV*) cast
+ $size = qr[,\s* (??{ $bal }) ]x; # Third arg (to setpvn)
+
+ foreach my $key (keys %output_expr) {
+ # We can still bootstrap compile 're', because in code re.pm is
+ # available to miniperl, and does not attempt to load the XS code.
+ use re 'eval';
+
+ my ($t, $with_size, $arg, $sarg) =
+ ($output_expr{$key} =~
+ m[^ \s+ sv_set ( [iunp] ) v (n)? # Type, is_setpvn
+ \s* \( \s* $cast \$arg \s* ,
+ \s* ( (??{ $bal }) ) # Set from
+ ( (??{ $size }) )? # Possible sizeof set-from
+ \) \s* ; \s* $
+ ]x);
+ $targetable{$key} = [$t, $with_size, $arg, $sarg] if $t;
+ }
+
+ my $END = "!End!\n\n"; # "impossible" keyword (multiple newline)
+
+ # Match an XS keyword
+ $BLOCK_re= '\s*(' . join('|', qw(
+ REQUIRE BOOT CASE PREINIT INPUT INIT CODE PPCODE
+ OUTPUT CLEANUP ALIAS ATTRS PROTOTYPES PROTOTYPE
+ VERSIONCHECK INCLUDE INCLUDE_COMMAND SCOPE INTERFACE
+ INTERFACE_MACRO C_ARGS POSTCALL OVERLOAD FALLBACK
+ )) . "|$END)\\s*:";
+
+
+ our ($C_group_rex, $C_arg);
+ # Group in C (no support for comments or literals)
+ $C_group_rex = qr/ [({\[]
+ (?: (?> [^()\[\]{}]+ ) | (??{ $C_group_rex }) )*
+ [)}\]] /x ;
+ # Chunk in C without comma at toplevel (no comments):
+ $C_arg = qr/ (?: (?> [^()\[\]{},"']+ )
+ | (??{ $C_group_rex })
+ | " (?: (?> [^\\"]+ )
+ | \\.
+ )* " # String literal
+ | ' (?: (?> [^\\']+ ) | \\. )* ' # Char literal
+ )* /xs;
+
+ # Identify the version of xsubpp used
+ print <<EOM ;
+/*
+ * This file was generated automatically by ExtUtils::ParseXS version $VERSION from the
+ * contents of $filename. Do not edit this file, edit $filename instead.
+ *
+ * ANY CHANGES MADE HERE WILL BE LOST!
+ *
+ */
+
+EOM
+
+
+ print("#line 1 \"$filepathname\"\n")
+ if $WantLineNumbers;
+
+ firstmodule:
+ while (<$FH>) {
+ if (/^=/) {
+ my $podstartline = $.;
+ do {
+ if (/^=cut\s*$/) {
+ # We can't just write out a /* */ comment, as our embedded
+ # POD might itself be in a comment. We can't put a /**/
+ # comment inside #if 0, as the C standard says that the source
+ # file is decomposed into preprocessing characters in the stage
+ # before preprocessing commands are executed.
+ # I don't want to leave the text as barewords, because the spec
+ # isn't clear whether macros are expanded before or after
+ # preprocessing commands are executed, and someone pathological
+ # may just have defined one of the 3 words as a macro that does
+ # something strange. Multiline strings are illegal in C, so
+ # the "" we write must be a string literal. And they aren't
+ # concatenated until 2 steps later, so we are safe.
+ # - Nicholas Clark
+ print("#if 0\n \"Skipped embedded POD.\"\n#endif\n");
+ printf("#line %d \"$filepathname\"\n", $. + 1)
+ if $WantLineNumbers;
+ next firstmodule
+ }
+
+ } while (<$FH>);
+ # At this point $. is at end of file so die won't state the start
+ # of the problem, and as we haven't yet read any lines &death won't
+ # show the correct line in the message either.
+ die ("Error: Unterminated pod in $filename, line $podstartline\n")
+ unless $lastline;
+ }
+ last if ($Package, $Prefix) =
+ /^MODULE\s*=\s*[\w:]+(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/;
+
+ print $_;
+ }
+ unless (defined $_) {
+ warn "Didn't find a 'MODULE ... PACKAGE ... PREFIX' line\n";
+ exit 0; # Not a fatal error for the caller process
+ }
+
+ print 'ExtUtils::ParseXS::CountLines'->end_marker, "\n" if $WantLineNumbers;
+
+ print <<"EOF";
+#ifndef PERL_UNUSED_VAR
+# define PERL_UNUSED_VAR(var) if (0) var = var
+#endif
+
+EOF
+
+ print <<"EOF";
+#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE
+#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params)
+
+/* prototype to pass -Wmissing-prototypes */
+STATIC void
+S_croak_xs_usage(pTHX_ const CV *const cv, const char *const params);
+
+STATIC void
+S_croak_xs_usage(pTHX_ const CV *const cv, const char *const params)
+{
+ const GV *const gv = CvGV(cv);
+
+ PERL_ARGS_ASSERT_CROAK_XS_USAGE;
+
+ if (gv) {
+ const char *const gvname = GvNAME(gv);
+ const HV *const stash = GvSTASH(gv);
+ const char *const hvname = stash ? HvNAME(stash) : NULL;
+
+ if (hvname)
+ Perl_croak(aTHX_ "Usage: %s::%s(%s)", hvname, gvname, params);
+ else
+ Perl_croak(aTHX_ "Usage: %s(%s)", gvname, params);
+ } else {
+ /* Pants. I don't think that it should be possible to get here. */
+ Perl_croak(aTHX_ "Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params);
+ }
+}
+#undef PERL_ARGS_ASSERT_CROAK_XS_USAGE
+
+#ifdef PERL_IMPLICIT_CONTEXT
+#define croak_xs_usage(a,b) S_croak_xs_usage(aTHX_ a,b)
+#else
+#define croak_xs_usage S_croak_xs_usage
+#endif
+
+#endif
+
+/* NOTE: the prototype of newXSproto() is different in versions of perls,
+ * so we define a portable version of newXSproto()
+ */
+#ifdef newXS_flags
+#define newXSproto_portable(name, c_impl, file, proto) newXS_flags(name, c_impl, file, proto, 0)
+#else
+#define newXSproto_portable(name, c_impl, file, proto) (PL_Sv=(SV*)newXS(name, c_impl, file), sv_setpv(PL_Sv, proto), (CV*)PL_Sv)
+#endif /* !defined(newXS_flags) */
+
+EOF
+
+ print 'ExtUtils::ParseXS::CountLines'->end_marker, "\n" if $WantLineNumbers;
+
+ $lastline = $_;
+ $lastline_no = $.;
+
+ PARAGRAPH:
+ while (fetch_para()) {
+ # Print initial preprocessor statements and blank lines
+ while (@line && $line[0] !~ /^[^\#]/) {
+ my $line = shift(@line);
+ print $line, "\n";
+ next unless $line =~ /^\#\s*((if)(?:n?def)?|elsif|else|endif)\b/;
+ my $statement = $+;
+ if ($statement eq 'if') {
+ $XSS_work_idx = @XSStack;
+ push(@XSStack, {type => 'if'});
+ } else {
+ death ("Error: `$statement' with no matching `if'")
+ if $XSStack[-1]{type} ne 'if';
+ if ($XSStack[-1]{varname}) {
+ push(@InitFileCode, "#endif\n");
+ push(@BootCode, "#endif");
+ }
+
+ my(@fns) = keys %{$XSStack[-1]{functions}};
+ if ($statement ne 'endif') {
+ # Hide the functions defined in other #if branches, and reset.
+ @{$XSStack[-1]{other_functions}}{@fns} = (1) x @fns;
+ @{$XSStack[-1]}{qw(varname functions)} = ('', {});
+ } else {
+ my($tmp) = pop(@XSStack);
+ 0 while (--$XSS_work_idx
+ && $XSStack[$XSS_work_idx]{type} ne 'if');
+ # Keep all new defined functions
+ push(@fns, keys %{$tmp->{other_functions}});
+ @{$XSStack[$XSS_work_idx]{functions}}{@fns} = (1) x @fns;
+ }
+ }
+ }
+
+ next PARAGRAPH unless @line;
+
+ if ($XSS_work_idx && !$XSStack[$XSS_work_idx]{varname}) {
+ # We are inside an #if, but have not yet #defined its xsubpp variable.
+ print "#define $cpp_next_tmp 1\n\n";
+ push(@InitFileCode, "#if $cpp_next_tmp\n");
+ push(@BootCode, "#if $cpp_next_tmp");
+ $XSStack[$XSS_work_idx]{varname} = $cpp_next_tmp++;
+ }
+
+ death ("Code is not inside a function"
+ ." (maybe last function was ended by a blank line "
+ ." followed by a statement on column one?)")
+ if $line[0] =~ /^\s/;
+
+ my ($class, $externC, $static, $ellipsis, $wantRETVAL, $RETVAL_no_return);
+ my (@fake_INPUT_pre); # For length(s) generated variables
+ my (@fake_INPUT);
+
+ # initialize info arrays
+ undef(%args_match);
+ undef(%var_types);
+ undef(%defaults);
+ undef(%arg_list) ;
+ undef(@proto_arg) ;
+ undef($processing_arg_with_types) ;
+ undef(%argtype_seen) ;
+ undef(@outlist) ;
+ undef(%in_out) ;
+ undef(%lengthof) ;
+ undef($proto_in_this_xsub) ;
+ undef($scope_in_this_xsub) ;
+ undef($interface);
+ undef($prepush_done);
+ $interface_macro = 'XSINTERFACE_FUNC' ;
+ $interface_macro_set = 'XSINTERFACE_FUNC_SET' ;
+ $ProtoThisXSUB = $WantPrototypes ;
+ $ScopeThisXSUB = 0;
+ $xsreturn = 0;
+
+ $_ = shift(@line);
+ while (my $kwd = check_keyword("REQUIRE|PROTOTYPES|FALLBACK|VERSIONCHECK|INCLUDE(?:_COMMAND)?|SCOPE")) {
+ &{"${kwd}_handler"}() ;
+ next PARAGRAPH unless @line ;
+ $_ = shift(@line);
+ }
+
+ if (check_keyword("BOOT")) {
+ &check_cpp;
+ push (@BootCode, "#line $line_no[@line_no - @line] \"$filepathname\"")
+ if $WantLineNumbers && $line[0] !~ /^\s*#\s*line\b/;
+ push (@BootCode, @line, "") ;
+ next PARAGRAPH ;
+ }
+
+
+ # extract return type, function name and arguments
+ ($ret_type) = TidyType($_);
+ $RETVAL_no_return = 1 if $ret_type =~ s/^NO_OUTPUT\s+//;
+
+ # Allow one-line ANSI-like declaration
+ unshift @line, $2
+ if $process_argtypes
+ and $ret_type =~ s/^(.*?\w.*?)\s*\b(\w+\s*\(.*)/$1/s;
+
+ # a function definition needs at least 2 lines
+ blurt ("Error: Function definition too short '$ret_type'"), next PARAGRAPH
+ unless @line ;
+
+ $externC = 1 if $ret_type =~ s/^extern "C"\s+//;
+ $static = 1 if $ret_type =~ s/^static\s+//;
+
+ $func_header = shift(@line);
+ blurt ("Error: Cannot parse function definition from '$func_header'"), next PARAGRAPH
+ unless $func_header =~ /^(?:([\w:]*)::)?(\w+)\s*\(\s*(.*?)\s*\)\s*(const)?\s*(;\s*)?$/s;
+
+ ($class, $func_name, $orig_args) = ($1, $2, $3) ;
+ $class = "$4 $class" if $4;
+ ($pname = $func_name) =~ s/^($Prefix)?/$Packprefix/;
+ ($clean_func_name = $func_name) =~ s/^$Prefix//;
+ $Full_func_name = "${Packid}_$clean_func_name";
+ if ($Is_VMS) {
+ $Full_func_name = $SymSet->addsym($Full_func_name);
+ }
+
+ # Check for duplicate function definition
+ for my $tmp (@XSStack) {
+ next unless defined $tmp->{functions}{$Full_func_name};
+ Warn("Warning: duplicate function definition '$clean_func_name' detected");
+ last;
+ }
+ $XSStack[$XSS_work_idx]{functions}{$Full_func_name} ++ ;
+ %XsubAliases = %XsubAliasValues = %Interfaces = @Attributes = ();
+ $DoSetMagic = 1;
+
+ $orig_args =~ s/\\\s*/ /g; # process line continuations
+ my @args;
+
+ my %only_C_inlist; # Not in the signature of Perl function
+ if ($process_argtypes and $orig_args =~ /\S/) {
+ my $args = "$orig_args ,";
+ if ($args =~ /^( (??{ $C_arg }) , )* $ /x) {
+ @args = ($args =~ /\G ( (??{ $C_arg }) ) , /xg);
+ for ( @args ) {
+ s/^\s+//;
+ s/\s+$//;
+ my ($arg, $default) = / ( [^=]* ) ( (?: = .* )? ) /x;
+ my ($pre, $name) = ($arg =~ /(.*?) \s*
+ \b ( \w+ | length\( \s*\w+\s* \) )
+ \s* $ /x);
+ next unless defined($pre) && length($pre);
+ my $out_type = '';
+ my $inout_var;
+ if ($process_inout and s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\b\s*//) {
+ my $type = $1;
+ $out_type = $type if $type ne 'IN';
+ $arg =~ s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\b\s*//;
+ $pre =~ s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\b\s*//;
+ }
+ my $islength;
+ if ($name =~ /^length\( \s* (\w+) \s* \)\z/x) {
+ $name = "XSauto_length_of_$1";
+ $islength = 1;
+ die "Default value on length() argument: `$_'"
+ if length $default;
+ }
+ if (length $pre or $islength) { # Has a type
+ if ($islength) {
+ push @fake_INPUT_pre, $arg;
+ } else {
+ push @fake_INPUT, $arg;
+ }
+ # warn "pushing '$arg'\n";
+ $argtype_seen{$name}++;
+ $_ = "$name$default"; # Assigns to @args
+ }
+ $only_C_inlist{$_} = 1 if $out_type eq "OUTLIST" or $islength;
+ push @outlist, $name if $out_type =~ /OUTLIST$/;
+ $in_out{$name} = $out_type if $out_type;
+ }
+ } else {
+ @args = split(/\s*,\s*/, $orig_args);
+ Warn("Warning: cannot parse argument list '$orig_args', fallback to split");
+ }
+ } else {
+ @args = split(/\s*,\s*/, $orig_args);
+ for (@args) {
+ if ($process_inout and s/^(IN|IN_OUTLIST|OUTLIST|IN_OUT|OUT)\b\s*//) {
+ my $out_type = $1;
+ next if $out_type eq 'IN';
+ $only_C_inlist{$_} = 1 if $out_type eq "OUTLIST";
+ push @outlist, $name if $out_type =~ /OUTLIST$/;
+ $in_out{$_} = $out_type;
+ }
+ }
+ }
+ if (defined($class)) {
+ my $arg0 = ((defined($static) or $func_name eq 'new')
+ ? "CLASS" : "THIS");
+ unshift(@args, $arg0);
+ }
+ my $extra_args = 0;
+ @args_num = ();
+ $num_args = 0;
+ my $report_args = '';
+ foreach my $i (0 .. $#args) {
+ if ($args[$i] =~ s/\.\.\.//) {
+ $ellipsis = 1;
+ if ($args[$i] eq '' && $i == $#args) {
+ $report_args .= ", ...";
+ pop(@args);
+ last;
+ }
+ }
+ if ($only_C_inlist{$args[$i]}) {
+ push @args_num, undef;
+ } else {
+ push @args_num, ++$num_args;
+ $report_args .= ", $args[$i]";
+ }
+ if ($args[$i] =~ /^([^=]*[^\s=])\s*=\s*(.*)/s) {
+ $extra_args++;
+ $args[$i] = $1;
+ $defaults{$args[$i]} = $2;
+ $defaults{$args[$i]} =~ s/"/\\"/g;
+ }
+ $proto_arg[$i+1] = '$' ;
+ }
+ $min_args = $num_args - $extra_args;
+ $report_args =~ s/"/\\"/g;
+ $report_args =~ s/^,\s+//;
+ my @func_args = @args;
+ shift @func_args if defined($class);
+
+ for (@func_args) {
+ s/^/&/ if $in_out{$_};
+ }
+ $func_args = join(", ", @func_args);
+ @args_match{@args} = @args_num;
+
+ $PPCODE = grep(/^\s*PPCODE\s*:/, @line);
+ $CODE = grep(/^\s*CODE\s*:/, @line);
+ # Detect CODE: blocks which use ST(n)= or XST_m*(n,v)
+ # to set explicit return values.
+ $EXPLICIT_RETURN = ($CODE &&
+ ("@line" =~ /(\bST\s*\([^;]*=) | (\bXST_m\w+\s*\()/x ));
+ $ALIAS = grep(/^\s*ALIAS\s*:/, @line);
+ $INTERFACE = grep(/^\s*INTERFACE\s*:/, @line);
+
+ $xsreturn = 1 if $EXPLICIT_RETURN;
+
+ $externC = $externC ? qq[extern "C"] : "";
+
+ # print function header
+ print Q(<<"EOF");
+#$externC
+#XS(XS_${Full_func_name}); /* prototype to pass -Wmissing-prototypes */
+#XS(XS_${Full_func_name})
+#[[
+##ifdef dVAR
+# dVAR; dXSARGS;
+##else
+# dXSARGS;
+##endif
+EOF
+ print Q(<<"EOF") if $ALIAS ;
+# dXSI32;
+EOF
+ print Q(<<"EOF") if $INTERFACE ;
+# dXSFUNCTION($ret_type);
+EOF
+ if ($ellipsis) {
+ $cond = ($min_args ? qq(items < $min_args) : 0);
+ } elsif ($min_args == $num_args) {
+ $cond = qq(items != $min_args);
+ } else {
+ $cond = qq(items < $min_args || items > $num_args);
+ }
+
+ print Q(<<"EOF") if $except;
+# char errbuf[1024];
+# *errbuf = '\0';
+EOF
+
+ if($cond) {
+ print Q(<<"EOF");
+# if ($cond)
+# croak_xs_usage(cv, "$report_args");
+EOF
+ } else {
+ # cv likely to be unused
+ print Q(<<"EOF");
+# PERL_UNUSED_VAR(cv); /* -W */
+EOF
+ }
+
+ #gcc -Wall: if an xsub has PPCODE is used
+ #it is possible none of ST, XSRETURN or XSprePUSH macros are used
+ #hence `ax' (setup by dXSARGS) is unused
+ #XXX: could breakup the dXSARGS; into dSP;dMARK;dITEMS
+ #but such a move could break third-party extensions
+ print Q(<<"EOF") if $PPCODE;
+# PERL_UNUSED_VAR(ax); /* -Wall */
+EOF
+
+ print Q(<<"EOF") if $PPCODE;
+# SP -= items;
+EOF
+
+ # Now do a block of some sort.
+
+ $condnum = 0;
+ $cond = ''; # last CASE: condidional
+ push(@line, "$END:");
+ push(@line_no, $line_no[-1]);
+ $_ = '';
+ &check_cpp;
+ while (@line) {
+ &CASE_handler if check_keyword("CASE");
+ print Q(<<"EOF");
+# $except [[
+EOF
+
+ # do initialization of input variables
+ $thisdone = 0;
+ $retvaldone = 0;
+ $deferred = "";
+ %arg_list = () ;
+ $gotRETVAL = 0;
+
+ INPUT_handler() ;
+ process_keyword("INPUT|PREINIT|INTERFACE_MACRO|C_ARGS|ALIAS|ATTRS|PROTOTYPE|SCOPE|OVERLOAD") ;
+
+ print Q(<<"EOF") if $ScopeThisXSUB;
+# ENTER;
+# [[
+EOF
+
+ if (!$thisdone && defined($class)) {
+ if (defined($static) or $func_name eq 'new') {
+ print "\tchar *";
+ $var_types{"CLASS"} = "char *";
+ &generate_init("char *", 1, "CLASS");
+ }
+ else {
+ print "\t$class *";
+ $var_types{"THIS"} = "$class *";
+ &generate_init("$class *", 1, "THIS");
+ }
+ }
+
+ # do code
+ if (/^\s*NOT_IMPLEMENTED_YET/) {
+ print "\n\tPerl_croak(aTHX_ \"$pname: not implemented yet\");\n";
+ $_ = '' ;
+ } else {
+ if ($ret_type ne "void") {
+ print "\t" . &map_type($ret_type, 'RETVAL') . ";\n"
+ if !$retvaldone;
+ $args_match{"RETVAL"} = 0;
+ $var_types{"RETVAL"} = $ret_type;
+ print "\tdXSTARG;\n"
+ if $WantOptimize and $targetable{$type_kind{$ret_type}};
+ }
+
+ if (@fake_INPUT or @fake_INPUT_pre) {
+ unshift @line, @fake_INPUT_pre, @fake_INPUT, $_;
+ $_ = "";
+ $processing_arg_with_types = 1;
+ INPUT_handler() ;
+ }
+ print $deferred;
+
+ process_keyword("INIT|ALIAS|ATTRS|PROTOTYPE|INTERFACE_MACRO|INTERFACE|C_ARGS|OVERLOAD") ;
+
+ if (check_keyword("PPCODE")) {
+ print_section();
+ death ("PPCODE must be last thing") if @line;
+ print "\tLEAVE;\n" if $ScopeThisXSUB;
+ print "\tPUTBACK;\n\treturn;\n";
+ } elsif (check_keyword("CODE")) {
+ print_section() ;
+ } elsif (defined($class) and $func_name eq "DESTROY") {
+ print "\n\t";
+ print "delete THIS;\n";
+ } else {
+ print "\n\t";
+ if ($ret_type ne "void") {
+ print "RETVAL = ";
+ $wantRETVAL = 1;
+ }
+ if (defined($static)) {
+ if ($func_name eq 'new') {
+ $func_name = "$class";
+ } else {
+ print "${class}::";
+ }
+ } elsif (defined($class)) {
+ if ($func_name eq 'new') {
+ $func_name .= " $class";
+ } else {
+ print "THIS->";
+ }
+ }
+ $func_name =~ s/^\Q$args{'s'}//
+ if exists $args{'s'};
+ $func_name = 'XSFUNCTION' if $interface;
+ print "$func_name($func_args);\n";
+ }
+ }
+
+ # do output variables
+ $gotRETVAL = 0; # 1 if RETVAL seen in OUTPUT section;
+ undef $RETVAL_code ; # code to set RETVAL (from OUTPUT section);
+ # $wantRETVAL set if 'RETVAL =' autogenerated
+ ($wantRETVAL, $ret_type) = (0, 'void') if $RETVAL_no_return;
+ undef %outargs ;
+ process_keyword("POSTCALL|OUTPUT|ALIAS|ATTRS|PROTOTYPE|OVERLOAD");
+
+ &generate_output($var_types{$_}, $args_match{$_}, $_, $DoSetMagic)
+ for grep $in_out{$_} =~ /OUT$/, keys %in_out;
+
+ # all OUTPUT done, so now push the return value on the stack
+ if ($gotRETVAL && $RETVAL_code) {
+ print "\t$RETVAL_code\n";
+ } elsif ($gotRETVAL || $wantRETVAL) {
+ my $t = $WantOptimize && $targetable{$type_kind{$ret_type}};
+ my $var = 'RETVAL';
+ my $type = $ret_type;
+
+ # 0: type, 1: with_size, 2: how, 3: how_size
+ if ($t and not $t->[1] and $t->[0] eq 'p') {
+ # PUSHp corresponds to setpvn. Treate setpv directly
+ my $what = eval qq("$t->[2]");
+ warn $@ if $@;
+
+ print "\tsv_setpv(TARG, $what); XSprePUSH; PUSHTARG;\n";
+ $prepush_done = 1;
+ }
+ elsif ($t) {
+ my $what = eval qq("$t->[2]");
+ warn $@ if $@;
+
+ my $size = $t->[3];
+ $size = '' unless defined $size;
+ $size = eval qq("$size");
+ warn $@ if $@;
+ print "\tXSprePUSH; PUSH$t->[0]($what$size);\n";
+ $prepush_done = 1;
+ }
+ else {
+ # RETVAL almost never needs SvSETMAGIC()
+ &generate_output($ret_type, 0, 'RETVAL', 0);
+ }
+ }
+
+ $xsreturn = 1 if $ret_type ne "void";
+ my $num = $xsreturn;
+ my $c = @outlist;
+ print "\tXSprePUSH;" if $c and not $prepush_done;
+ print "\tEXTEND(SP,$c);\n" if $c;
+ $xsreturn += $c;
+ generate_output($var_types{$_}, $num++, $_, 0, 1) for @outlist;
+
+ # do cleanup
+ process_keyword("CLEANUP|ALIAS|ATTRS|PROTOTYPE|OVERLOAD") ;
+
+ print Q(<<"EOF") if $ScopeThisXSUB;
+# ]]
+EOF
+ print Q(<<"EOF") if $ScopeThisXSUB and not $PPCODE;
+# LEAVE;
+EOF
+
+ # print function trailer
+ print Q(<<"EOF");
+# ]]
+EOF
+ print Q(<<"EOF") if $except;
+# BEGHANDLERS
+# CATCHALL
+# sprintf(errbuf, "%s: %s\\tpropagated", Xname, Xreason);
+# ENDHANDLERS
+EOF
+ if (check_keyword("CASE")) {
+ blurt ("Error: No `CASE:' at top of function")
+ unless $condnum;
+ $_ = "CASE: $_"; # Restore CASE: label
+ next;
+ }
+ last if $_ eq "$END:";
+ death(/^$BLOCK_re/o ? "Misplaced `$1:'" : "Junk at end of function ($_)");
+ }
+
+ print Q(<<"EOF") if $except;
+# if (errbuf[0])
+# Perl_croak(aTHX_ errbuf);
+EOF
+
+ if ($xsreturn) {
+ print Q(<<"EOF") unless $PPCODE;
+# XSRETURN($xsreturn);
+EOF
+ } else {
+ print Q(<<"EOF") unless $PPCODE;
+# XSRETURN_EMPTY;
+EOF
+ }
+
+ print Q(<<"EOF");
+#]]
+#
+EOF
+
+ our $newXS = "newXS" ;
+ our $proto = "" ;
+
+ # Build the prototype string for the xsub
+ if ($ProtoThisXSUB) {
+ $newXS = "newXSproto_portable";
+
+ if ($ProtoThisXSUB eq 2) {
+ # User has specified empty prototype
+ }
+ elsif ($ProtoThisXSUB eq 1) {
+ my $s = ';';
+ if ($min_args < $num_args) {
+ $s = '';
+ $proto_arg[$min_args] .= ";" ;
+ }
+ push @proto_arg, "$s\@"
+ if $ellipsis ;
+
+ $proto = join ("", grep defined, @proto_arg);
+ }
+ else {
+ # User has specified a prototype
+ $proto = $ProtoThisXSUB;
+ }
+ $proto = qq{, "$proto"};
+ }
+
+ if (%XsubAliases) {
+ $XsubAliases{$pname} = 0
+ unless defined $XsubAliases{$pname} ;
+ while ( ($name, $value) = each %XsubAliases) {
+ push(@InitFileCode, Q(<<"EOF"));
+# cv = ${newXS}(\"$name\", XS_$Full_func_name, file$proto);
+# XSANY.any_i32 = $value ;
+EOF
+ }
+ }
+ elsif (@Attributes) {
+ push(@InitFileCode, Q(<<"EOF"));
+# cv = ${newXS}(\"$pname\", XS_$Full_func_name, file$proto);
+# apply_attrs_string("$Package", cv, "@Attributes", 0);
+EOF
+ }
+ elsif ($interface) {
+ while ( ($name, $value) = each %Interfaces) {
+ $name = "$Package\::$name" unless $name =~ /::/;
+ push(@InitFileCode, Q(<<"EOF"));
+# cv = ${newXS}(\"$name\", XS_$Full_func_name, file$proto);
+# $interface_macro_set(cv,$value) ;
+EOF
+ }
+ }
+ elsif($newXS eq 'newXS'){ # work around P5NCI's empty newXS macro
+ push(@InitFileCode,
+ " ${newXS}(\"$pname\", XS_$Full_func_name, file$proto);\n");
+ }
+ else {
+ push(@InitFileCode,
+ " (void)${newXS}(\"$pname\", XS_$Full_func_name, file$proto);\n");
+ }
+ }
+
+ if ($Overload) # make it findable with fetchmethod
+ {
+ print Q(<<"EOF");
+#XS(XS_${Packid}_nil); /* prototype to pass -Wmissing-prototypes */
+#XS(XS_${Packid}_nil)
+#{
+# dXSARGS;
+# XSRETURN_EMPTY;
+#}
+#
+EOF
+ unshift(@InitFileCode, <<"MAKE_FETCHMETHOD_WORK");
+ /* Making a sub named "${Package}::()" allows the package */
+ /* to be findable via fetchmethod(), and causes */
+ /* overload::Overloaded("${Package}") to return true. */
+ (void)${newXS}("${Package}::()", XS_${Packid}_nil, file$proto);
+MAKE_FETCHMETHOD_WORK
+ }
+
+ # print initialization routine
+
+ print Q(<<"EOF");
+##ifdef __cplusplus
+#extern "C"
+##endif
+EOF
+
+ print Q(<<"EOF");
+#XS(boot_$Module_cname); /* prototype to pass -Wmissing-prototypes */
+#XS(boot_$Module_cname)
+EOF
+
+ print Q(<<"EOF");
+#[[
+##ifdef dVAR
+# dVAR; dXSARGS;
+##else
+# dXSARGS;
+##endif
+EOF
+
+ #Under 5.8.x and lower, newXS is declared in proto.h as expecting a non-const
+ #file name argument. If the wrong qualifier is used, it causes breakage with
+ #C++ compilers and warnings with recent gcc.
+ #-Wall: if there is no $Full_func_name there are no xsubs in this .xs
+ #so `file' is unused
+ print Q(<<"EOF") if $Full_func_name;
+##if (PERL_REVISION == 5 && PERL_VERSION < 9)
+# char* file = __FILE__;
+##else
+# const char* file = __FILE__;
+##endif
+EOF
+
+ print Q("#\n");
+
+ print Q(<<"EOF");
+# PERL_UNUSED_VAR(cv); /* -W */
+# PERL_UNUSED_VAR(items); /* -W */
+EOF
+
+ print Q(<<"EOF") if $WantVersionChk ;
+# XS_VERSION_BOOTCHECK ;
+#
+EOF
+
+ print Q(<<"EOF") if defined $XsubAliases or defined $Interfaces ;
+# {
+# CV * cv ;
+#
+EOF
+
+ print Q(<<"EOF") if ($Overload);
+# /* register the overloading (type 'A') magic */
+# PL_amagic_generation++;
+# /* The magic for overload gets a GV* via gv_fetchmeth as */
+# /* mentioned above, and looks in the SV* slot of it for */
+# /* the "fallback" status. */
+# sv_setsv(
+# get_sv( "${Package}::()", TRUE ),
+# $Fallback
+# );
+EOF
+
+ print @InitFileCode;
+
+ print Q(<<"EOF") if defined $XsubAliases or defined $Interfaces ;
+# }
+EOF
+
+ if (@BootCode)
+ {
+ print "\n /* Initialisation Section */\n\n" ;
+ @line = @BootCode;
+ print_section();
+ print "\n /* End of Initialisation Section */\n\n" ;
+ }
+
+ print Q(<<'EOF');
+##if (PERL_REVISION == 5 && PERL_VERSION >= 9)
+# if (PL_unitcheckav)
+# call_list(PL_scopestack_ix, PL_unitcheckav);
+##endif
+EOF
+
+ print Q(<<"EOF");
+# XSRETURN_YES;
+#]]
+#
+EOF
+
+ warn("Please specify prototyping behavior for $filename (see perlxs manual)\n")
+ unless $ProtoUsed ;
+
+ chdir($orig_cwd);
+ select($orig_fh);
+ untie *PSEUDO_STDOUT if tied *PSEUDO_STDOUT;
+ close $FH;
+
+ return 1;
+}
+
+sub errors { $errors }
+
+sub standard_typemap_locations {
+ # Add all the default typemap locations to the search path
+ my @tm = qw(typemap);
+
+ my $updir = File::Spec->updir;
+ foreach my $dir (File::Spec->catdir(($updir) x 1), File::Spec->catdir(($updir) x 2),
+ File::Spec->catdir(($updir) x 3), File::Spec->catdir(($updir) x 4)) {
+
+ unshift @tm, File::Spec->catfile($dir, 'typemap');
+ unshift @tm, File::Spec->catfile($dir, lib => ExtUtils => 'typemap');
+ }
+ foreach my $dir (@INC) {
+ my $file = File::Spec->catfile($dir, ExtUtils => 'typemap');
+ unshift @tm, $file if -e $file;
+ }
+ return @tm;
+}
+
+sub TrimWhitespace
+{
+ $_[0] =~ s/^\s+|\s+$//go ;
+}
+
+sub TidyType
+ {
+ local ($_) = @_ ;
+
+ # rationalise any '*' by joining them into bunches and removing whitespace
+ s#\s*(\*+)\s*#$1#g;
+ s#(\*+)# $1 #g ;
+
+ # change multiple whitespace into a single space
+ s/\s+/ /g ;
+
+ # trim leading & trailing whitespace
+ TrimWhitespace($_) ;
+
+ $_ ;
+}
+
+# Input: ($_, @line) == unparsed input.
+# Output: ($_, @line) == (rest of line, following lines).
+# Return: the matched keyword if found, otherwise 0
+sub check_keyword {
+ $_ = shift(@line) while !/\S/ && @line;
+ s/^(\s*)($_[0])\s*:\s*(?:#.*)?/$1/s && $2;
+}
+
+sub print_section {
+ # the "do" is required for right semantics
+ do { $_ = shift(@line) } while !/\S/ && @line;
+
+ print("#line ", $line_no[@line_no - @line -1], " \"$filepathname\"\n")
+ if $WantLineNumbers && !/^\s*#\s*line\b/ && !/^#if XSubPPtmp/;
+ for (; defined($_) && !/^$BLOCK_re/o; $_ = shift(@line)) {
+ print "$_\n";
+ }
+ print 'ExtUtils::ParseXS::CountLines'->end_marker, "\n" if $WantLineNumbers;
+}
+
+sub merge_section {
+ my $in = '';
+
+ while (!/\S/ && @line) {
+ $_ = shift(@line);
+ }
+
+ for (; defined($_) && !/^$BLOCK_re/o; $_ = shift(@line)) {
+ $in .= "$_\n";
+ }
+ chomp $in;
+ return $in;
+ }
+
+sub process_keyword($)
+ {
+ my($pattern) = @_ ;
+ my $kwd ;
+
+ &{"${kwd}_handler"}()
+ while $kwd = check_keyword($pattern) ;
+ }
+
+sub CASE_handler {
+ blurt ("Error: `CASE:' after unconditional `CASE:'")
+ if $condnum && $cond eq '';
+ $cond = $_;
+ TrimWhitespace($cond);
+ print " ", ($condnum++ ? " else" : ""), ($cond ? " if ($cond)\n" : "\n");
+ $_ = '' ;
+}
+
+sub INPUT_handler {
+ for (; !/^$BLOCK_re/o; $_ = shift(@line)) {
+ last if /^\s*NOT_IMPLEMENTED_YET/;
+ next unless /\S/; # skip blank lines
+
+ TrimWhitespace($_) ;
+ my $line = $_ ;
+
+ # remove trailing semicolon if no initialisation
+ s/\s*;$//g unless /[=;+].*\S/ ;
+
+ # Process the length(foo) declarations
+ if (s/^([^=]*)\blength\(\s*(\w+)\s*\)\s*$/$1 XSauto_length_of_$2=NO_INIT/x) {
+ print "\tSTRLEN\tSTRLEN_length_of_$2;\n";
+ $lengthof{$2} = $name;
+ # $islengthof{$name} = $1;
+ $deferred .= "\n\tXSauto_length_of_$2 = STRLEN_length_of_$2;\n";
+ }
+
+ # check for optional initialisation code
+ my $var_init = '' ;
+ $var_init = $1 if s/\s*([=;+].*)$//s ;
+ $var_init =~ s/"/\\"/g;
+
+ s/\s+/ /g;
+ my ($var_type, $var_addr, $var_name) = /^(.*?[^&\s])\s*(\&?)\s*\b(\w+)$/s
+ or blurt("Error: invalid argument declaration '$line'"), next;
+
+ # Check for duplicate definitions
+ blurt ("Error: duplicate definition of argument '$var_name' ignored"), next
+ if $arg_list{$var_name}++
+ or defined $argtype_seen{$var_name} and not $processing_arg_with_types;
+
+ $thisdone |= $var_name eq "THIS";
+ $retvaldone |= $var_name eq "RETVAL";
+ $var_types{$var_name} = $var_type;
+ # XXXX This check is a safeguard against the unfinished conversion of
+ # generate_init(). When generate_init() is fixed,
+ # one can use 2-args map_type() unconditionally.
+ if ($var_type =~ / \( \s* \* \s* \) /x) {
+ # Function pointers are not yet supported with &output_init!
+ print "\t" . &map_type($var_type, $var_name);
+ $name_printed = 1;
+ } else {
+ print "\t" . &map_type($var_type);
+ $name_printed = 0;
+ }
+ $var_num = $args_match{$var_name};
+
+ $proto_arg[$var_num] = ProtoString($var_type)
+ if $var_num ;
+ $func_args =~ s/\b($var_name)\b/&$1/ if $var_addr;
+ if ($var_init =~ /^[=;]\s*NO_INIT\s*;?\s*$/
+ or $in_out{$var_name} and $in_out{$var_name} =~ /^OUT/
+ and $var_init !~ /\S/) {
+ if ($name_printed) {
+ print ";\n";
+ } else {
+ print "\t$var_name;\n";
+ }
+ } elsif ($var_init =~ /\S/) {
+ &output_init($var_type, $var_num, $var_name, $var_init, $name_printed);
+ } elsif ($var_num) {
+ # generate initialization code
+ &generate_init($var_type, $var_num, $var_name, $name_printed);
+ } else {
+ print ";\n";
+ }
+ }
+}
+
+sub OUTPUT_handler {
+ for (; !/^$BLOCK_re/o; $_ = shift(@line)) {
+ next unless /\S/;
+ if (/^\s*SETMAGIC\s*:\s*(ENABLE|DISABLE)\s*/) {
+ $DoSetMagic = ($1 eq "ENABLE" ? 1 : 0);
+ next;
+ }
+ my ($outarg, $outcode) = /^\s*(\S+)\s*(.*?)\s*$/s ;
+ blurt ("Error: duplicate OUTPUT argument '$outarg' ignored"), next
+ if $outargs{$outarg} ++ ;
+ if (!$gotRETVAL and $outarg eq 'RETVAL') {
+ # deal with RETVAL last
+ $RETVAL_code = $outcode ;
+ $gotRETVAL = 1 ;
+ next ;
+ }
+ blurt ("Error: OUTPUT $outarg not an argument"), next
+ unless defined($args_match{$outarg});
+ blurt("Error: No input definition for OUTPUT argument '$outarg' - ignored"), next
+ unless defined $var_types{$outarg} ;
+ $var_num = $args_match{$outarg};
+ if ($outcode) {
+ print "\t$outcode\n";
+ print "\tSvSETMAGIC(ST(" , $var_num-1 , "));\n" if $DoSetMagic;
+ } else {
+ &generate_output($var_types{$outarg}, $var_num, $outarg, $DoSetMagic);
+ }
+ delete $in_out{$outarg} # No need to auto-OUTPUT
+ if exists $in_out{$outarg} and $in_out{$outarg} =~ /OUT$/;
+ }
+}
+
+sub C_ARGS_handler() {
+ my $in = merge_section();
+
+ TrimWhitespace($in);
+ $func_args = $in;
+}
+
+sub INTERFACE_MACRO_handler() {
+ my $in = merge_section();
+
+ TrimWhitespace($in);
+ if ($in =~ /\s/) { # two
+ ($interface_macro, $interface_macro_set) = split ' ', $in;
+ } else {
+ $interface_macro = $in;
+ $interface_macro_set = 'UNKNOWN_CVT'; # catch later
+ }
+ $interface = 1; # local
+ $Interfaces = 1; # global
+}
+
+sub INTERFACE_handler() {
+ my $in = merge_section();
+
+ TrimWhitespace($in);
+
+ foreach (split /[\s,]+/, $in) {
+ my $name = $_;
+ $name =~ s/^$Prefix//;
+ $Interfaces{$name} = $_;
+ }
+ print Q(<<"EOF");
+# XSFUNCTION = $interface_macro($ret_type,cv,XSANY.any_dptr);
+EOF
+ $interface = 1; # local
+ $Interfaces = 1; # global
+}
+
+sub CLEANUP_handler() { print_section() }
+sub PREINIT_handler() { print_section() }
+sub POSTCALL_handler() { print_section() }
+sub INIT_handler() { print_section() }
+
+sub GetAliases
+ {
+ my ($line) = @_ ;
+ my ($orig) = $line ;
+ my ($alias) ;
+ my ($value) ;
+
+ # Parse alias definitions
+ # format is
+ # alias = value alias = value ...
+
+ while ($line =~ s/^\s*([\w:]+)\s*=\s*(\w+)\s*//) {
+ $alias = $1 ;
+ $orig_alias = $alias ;
+ $value = $2 ;
+
+ # check for optional package definition in the alias
+ $alias = $Packprefix . $alias if $alias !~ /::/ ;
+
+ # check for duplicate alias name & duplicate value
+ Warn("Warning: Ignoring duplicate alias '$orig_alias'")
+ if defined $XsubAliases{$alias} ;
+
+ Warn("Warning: Aliases '$orig_alias' and '$XsubAliasValues{$value}' have identical values")
+ if $XsubAliasValues{$value} ;
+
+ $XsubAliases = 1;
+ $XsubAliases{$alias} = $value ;
+ $XsubAliasValues{$value} = $orig_alias ;
+ }
+
+ blurt("Error: Cannot parse ALIAS definitions from '$orig'")
+ if $line ;
+ }
+
+sub ATTRS_handler ()
+ {
+ for (; !/^$BLOCK_re/o; $_ = shift(@line)) {
+ next unless /\S/;
+ TrimWhitespace($_) ;
+ push @Attributes, $_;
+ }
+ }
+
+sub ALIAS_handler ()
+ {
+ for (; !/^$BLOCK_re/o; $_ = shift(@line)) {
+ next unless /\S/;
+ TrimWhitespace($_) ;
+ GetAliases($_) if $_ ;
+ }
+ }
+
+sub OVERLOAD_handler()
+{
+ for (; !/^$BLOCK_re/o; $_ = shift(@line)) {
+ next unless /\S/;
+ TrimWhitespace($_) ;
+ while ( s/^\s*([\w:"\\)\+\-\*\/\%\<\>\.\&\|\^\!\~\{\}\=]+)\s*//) {
+ $Overload = 1 unless $Overload;
+ my $overload = "$Package\::(".$1 ;
+ push(@InitFileCode,
+ " (void)${newXS}(\"$overload\", XS_$Full_func_name, file$proto);\n");
+ }
+ }
+}
+
+sub FALLBACK_handler()
+{
+ # the rest of the current line should contain either TRUE,
+ # FALSE or UNDEF
+
+ TrimWhitespace($_) ;
+ my %map = (
+ TRUE => "&PL_sv_yes", 1 => "&PL_sv_yes",
+ FALSE => "&PL_sv_no", 0 => "&PL_sv_no",
+ UNDEF => "&PL_sv_undef",
+ ) ;
+
+ # check for valid FALLBACK value
+ death ("Error: FALLBACK: TRUE/FALSE/UNDEF") unless exists $map{uc $_} ;
+
+ $Fallback = $map{uc $_} ;
+}
+
+
+sub REQUIRE_handler ()
+ {
+ # the rest of the current line should contain a version number
+ my ($Ver) = $_ ;
+
+ TrimWhitespace($Ver) ;
+
+ death ("Error: REQUIRE expects a version number")
+ unless $Ver ;
+
+ # check that the version number is of the form n.n
+ death ("Error: REQUIRE: expected a number, got '$Ver'")
+ unless $Ver =~ /^\d+(\.\d*)?/ ;
+
+ death ("Error: xsubpp $Ver (or better) required--this is only $VERSION.")
+ unless $VERSION >= $Ver ;
+ }
+
+sub VERSIONCHECK_handler ()
+ {
+ # the rest of the current line should contain either ENABLE or
+ # DISABLE
+
+ TrimWhitespace($_) ;
+
+ # check for ENABLE/DISABLE
+ death ("Error: VERSIONCHECK: ENABLE/DISABLE")
+ unless /^(ENABLE|DISABLE)/i ;
+
+ $WantVersionChk = 1 if $1 eq 'ENABLE' ;
+ $WantVersionChk = 0 if $1 eq 'DISABLE' ;
+
+ }
+
+sub PROTOTYPE_handler ()
+ {
+ my $specified ;
+
+ death("Error: Only 1 PROTOTYPE definition allowed per xsub")
+ if $proto_in_this_xsub ++ ;
+
+ for (; !/^$BLOCK_re/o; $_ = shift(@line)) {
+ next unless /\S/;
+ $specified = 1 ;
+ TrimWhitespace($_) ;
+ if ($_ eq 'DISABLE') {
+ $ProtoThisXSUB = 0
+ } elsif ($_ eq 'ENABLE') {
+ $ProtoThisXSUB = 1
+ } else {
+ # remove any whitespace
+ s/\s+//g ;
+ death("Error: Invalid prototype '$_'")
+ unless ValidProtoString($_) ;
+ $ProtoThisXSUB = C_string($_) ;
+ }
+ }
+
+ # If no prototype specified, then assume empty prototype ""
+ $ProtoThisXSUB = 2 unless $specified ;
+
+ $ProtoUsed = 1 ;
+
+ }
+
+sub SCOPE_handler ()
+ {
+ death("Error: Only 1 SCOPE declaration allowed per xsub")
+ if $scope_in_this_xsub ++ ;
+
+ TrimWhitespace($_);
+ death ("Error: SCOPE: ENABLE/DISABLE")
+ unless /^(ENABLE|DISABLE)\b/i;
+ $ScopeThisXSUB = ( uc($1) eq 'ENABLE' );
+ }
+
+sub PROTOTYPES_handler ()
+ {
+ # the rest of the current line should contain either ENABLE or
+ # DISABLE
+
+ TrimWhitespace($_) ;
+
+ # check for ENABLE/DISABLE
+ death ("Error: PROTOTYPES: ENABLE/DISABLE")
+ unless /^(ENABLE|DISABLE)/i ;
+
+ $WantPrototypes = 1 if $1 eq 'ENABLE' ;
+ $WantPrototypes = 0 if $1 eq 'DISABLE' ;
+ $ProtoUsed = 1 ;
+
+ }
+
+sub PushXSStack
+ {
+ # Save the current file context.
+ push(@XSStack, {
+ type => 'file',
+ LastLine => $lastline,
+ LastLineNo => $lastline_no,
+ Line => \@line,
+ LineNo => \@line_no,
+ Filename => $filename,
+ Filepathname => $filepathname,
+ Handle => $FH,
+ }) ;
+
+ }
+
+sub INCLUDE_handler ()
+ {
+ # the rest of the current line should contain a valid filename
+
+ TrimWhitespace($_) ;
+
+ death("INCLUDE: filename missing")
+ unless $_ ;
+
+ death("INCLUDE: output pipe is illegal")
+ if /^\s*\|/ ;
+
+ # simple minded recursion detector
+ death("INCLUDE loop detected")
+ if $IncludedFiles{$_} ;
+
+ ++ $IncludedFiles{$_} unless /\|\s*$/ ;
+
+ Warn("The INCLUDE directive with a command is deprecated." .
+ " Use INCLUDE_COMMAND instead!")
+ if /\|\s*$/ ;
+
+ PushXSStack();
+
+ $FH = Symbol::gensym();
+
+ # open the new file
+ open ($FH, "$_") or death("Cannot open '$_': $!") ;
+
+ print Q(<<"EOF");
+#
+#/* INCLUDE: Including '$_' from '$filename' */
+#
+EOF
+
+ $filename = $_ ;
+ $filepathname = "$dir/$filename";
+
+ # Prime the pump by reading the first
+ # non-blank line
+
+ # skip leading blank lines
+ while (<$FH>) {
+ last unless /^\s*$/ ;
+ }
+
+ $lastline = $_ ;
+ $lastline_no = $. ;
+ }
+
+sub INCLUDE_COMMAND_handler ()
+ {
+ # the rest of the current line should contain a valid command
+
+ TrimWhitespace($_) ;
+
+ death("INCLUDE_COMMAND: command missing")
+ unless $_ ;
+
+ death("INCLUDE_COMMAND: pipes are illegal")
+ if /^\s*\|/ or /\|\s*$/ ;
+
+ PushXSStack();
+
+ $FH = Symbol::gensym();
+
+ # If $^X is used in INCLUDE_COMMAND, we know it's supposed to be
+ # the same perl interpreter as we're currently running
+ s/^\s*\$\^X/$^X/;
+
+ # open the new file
+ open ($FH, "-|", "$_")
+ or death("Cannot run command '$_' to include its output: $!") ;
+
+ print Q(<<"EOF");
+#
+#/* INCLUDE_COMMAND: Including output of '$_' from '$filename' */
+#
+EOF
+
+ $filename = $_ ;
+ $filepathname = "$dir/$filename";
+
+ # Prime the pump by reading the first
+ # non-blank line
+
+ # skip leading blank lines
+ while (<$FH>) {
+ last unless /^\s*$/ ;
+ }
+
+ $lastline = $_ ;
+ $lastline_no = $. ;
+ }
+
+sub PopFile()
+ {
+ return 0 unless $XSStack[-1]{type} eq 'file' ;
+
+ my $data = pop @XSStack ;
+ my $ThisFile = $filename ;
+ my $isPipe = ($filename =~ /\|\s*$/) ;
+
+ -- $IncludedFiles{$filename}
+ unless $isPipe ;
+
+ close $FH ;
+
+ $FH = $data->{Handle} ;
+ # $filename is the leafname, which for some reason isused for diagnostic
+ # messages, whereas $filepathname is the full pathname, and is used for
+ # #line directives.
+ $filename = $data->{Filename} ;
+ $filepathname = $data->{Filepathname} ;
+ $lastline = $data->{LastLine} ;
+ $lastline_no = $data->{LastLineNo} ;
+ @line = @{ $data->{Line} } ;
+ @line_no = @{ $data->{LineNo} } ;
+
+ if ($isPipe and $? ) {
+ -- $lastline_no ;
+ print STDERR "Error reading from pipe '$ThisFile': $! in $filename, line $lastline_no\n" ;
+ exit 1 ;
+ }
+
+ print Q(<<"EOF");
+#
+#/* INCLUDE: Returning to '$filename' from '$ThisFile' */
+#
+EOF
+
+ return 1 ;
+ }
+
+sub ValidProtoString ($)
+ {
+ my($string) = @_ ;
+
+ if ( $string =~ /^$proto_re+$/ ) {
+ return $string ;
+ }
+
+ return 0 ;
+ }
+
+sub C_string ($)
+ {
+ my($string) = @_ ;
+
+ $string =~ s[\\][\\\\]g ;
+ $string ;
+ }
+
+sub ProtoString ($)
+ {
+ my ($type) = @_ ;
+
+ $proto_letter{$type} or "\$" ;
+ }
+
+sub check_cpp {
+ my @cpp = grep(/^\#\s*(?:if|e\w+)/, @line);
+ if (@cpp) {
+ my ($cpp, $cpplevel);
+ for $cpp (@cpp) {
+ if ($cpp =~ /^\#\s*if/) {
+ $cpplevel++;
+ } elsif (!$cpplevel) {
+ Warn("Warning: #else/elif/endif without #if in this function");
+ print STDERR " (precede it with a blank line if the matching #if is outside the function)\n"
+ if $XSStack[-1]{type} eq 'if';
+ return;
+ } elsif ($cpp =~ /^\#\s*endif/) {
+ $cpplevel--;
+ }
+ }
+ Warn("Warning: #if without #endif in this function") if $cpplevel;
+ }
+}
+
+
+sub Q {
+ my($text) = @_;
+ $text =~ s/^#//gm;
+ $text =~ s/\[\[/{/g;
+ $text =~ s/\]\]/}/g;
+ $text;
+}
+
+# Read next xsub into @line from ($lastline, <$FH>).
+sub fetch_para {
+ # parse paragraph
+ death ("Error: Unterminated `#if/#ifdef/#ifndef'")
+ if !defined $lastline && $XSStack[-1]{type} eq 'if';
+ @line = ();
+ @line_no = () ;
+ return PopFile() if !defined $lastline;
+
+ if ($lastline =~
+ /^MODULE\s*=\s*([\w:]+)(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/) {
+ $Module = $1;
+ $Package = defined($2) ? $2 : ''; # keep -w happy
+ $Prefix = defined($3) ? $3 : ''; # keep -w happy
+ $Prefix = quotemeta $Prefix ;
+ ($Module_cname = $Module) =~ s/\W/_/g;
+ ($Packid = $Package) =~ tr/:/_/;
+ $Packprefix = $Package;
+ $Packprefix .= "::" if $Packprefix ne "";
+ $lastline = "";
+ }
+
+ for (;;) {
+ # Skip embedded PODs
+ while ($lastline =~ /^=/) {
+ while ($lastline = <$FH>) {
+ last if ($lastline =~ /^=cut\s*$/);
+ }
+ death ("Error: Unterminated pod") unless $lastline;
+ $lastline = <$FH>;
+ chomp $lastline;
+ $lastline =~ s/^\s+$//;
+ }
+ if ($lastline !~ /^\s*#/ ||
+ # CPP directives:
+ # ANSI: if ifdef ifndef elif else endif define undef
+ # line error pragma
+ # gcc: warning include_next
+ # obj-c: import
+ # others: ident (gcc notes that some cpps have this one)
+ $lastline =~ /^#[ \t]*(?:(?:if|ifn?def|elif|else|endif|define|undef|pragma|error|warning|line\s+\d+|ident)\b|(?:include(?:_next)?|import)\s*["<].*[>"])/) {
+ last if $lastline =~ /^\S/ && @line && $line[-1] eq "";
+ push(@line, $lastline);
+ push(@line_no, $lastline_no) ;
+ }
+
+ # Read next line and continuation lines
+ last unless defined($lastline = <$FH>);
+ $lastline_no = $.;
+ my $tmp_line;
+ $lastline .= $tmp_line
+ while ($lastline =~ /\\$/ && defined($tmp_line = <$FH>));
+
+ chomp $lastline;
+ $lastline =~ s/^\s+$//;
+ }
+ pop(@line), pop(@line_no) while @line && $line[-1] eq "";
+ 1;
+}
+
+sub output_init {
+ local($type, $num, $var, $init, $name_printed) = @_;
+ local($arg) = "ST(" . ($num - 1) . ")";
+
+ if ( $init =~ /^=/ ) {
+ if ($name_printed) {
+ eval qq/print " $init\\n"/;
+ } else {
+ eval qq/print "\\t$var $init\\n"/;
+ }
+ warn $@ if $@;
+ } else {
+ if ( $init =~ s/^\+// && $num ) {
+ &generate_init($type, $num, $var, $name_printed);
+ } elsif ($name_printed) {
+ print ";\n";
+ $init =~ s/^;//;
+ } else {
+ eval qq/print "\\t$var;\\n"/;
+ warn $@ if $@;
+ $init =~ s/^;//;
+ }
+ $deferred .= eval qq/"\\n\\t$init\\n"/;
+ warn $@ if $@;
+ }
+}
+
+sub Warn
+ {
+ # work out the line number
+ my $line_no = $line_no[@line_no - @line -1] ;
+
+ print STDERR "@_ in $filename, line $line_no\n" ;
+ }
+
+sub blurt
+ {
+ Warn @_ ;
+ $errors ++
+ }
+
+sub death
+ {
+ Warn @_ ;
+ exit 1 ;
+ }
+
+sub generate_init {
+ local($type, $num, $var) = @_;
+ local($arg) = "ST(" . ($num - 1) . ")";
+ local($argoff) = $num - 1;
+ local($ntype);
+ local($tk);
+
+ $type = TidyType($type) ;
+ blurt("Error: '$type' not in typemap"), return
+ unless defined($type_kind{$type});
+
+ ($ntype = $type) =~ s/\s*\*/Ptr/g;
+ ($subtype = $ntype) =~ s/(?:Array)?(?:Ptr)?$//;
+ $tk = $type_kind{$type};
+ $tk =~ s/OBJ$/REF/ if $func_name =~ /DESTROY$/;
+ if ($tk eq 'T_PV' and exists $lengthof{$var}) {
+ print "\t$var" unless $name_printed;
+ print " = ($type)SvPV($arg, STRLEN_length_of_$var);\n";
+ die "default value not supported with length(NAME) supplied"
+ if defined $defaults{$var};
+ return;
+ }
+ $type =~ tr/:/_/ unless $hiertype;
+ blurt("Error: No INPUT definition for type '$type', typekind '$type_kind{$type}' found"), return
+ unless defined $input_expr{$tk} ;
+ $expr = $input_expr{$tk};
+ if ($expr =~ /DO_ARRAY_ELEM/) {
+ blurt("Error: '$subtype' not in typemap"), return
+ unless defined($type_kind{$subtype});
+ blurt("Error: No INPUT definition for type '$subtype', typekind '$type_kind{$subtype}' found"), return
+ unless defined $input_expr{$type_kind{$subtype}} ;
+ $subexpr = $input_expr{$type_kind{$subtype}};
+ $subexpr =~ s/\$type/\$subtype/g;
+ $subexpr =~ s/ntype/subtype/g;
+ $subexpr =~ s/\$arg/ST(ix_$var)/g;
+ $subexpr =~ s/\n\t/\n\t\t/g;
+ $subexpr =~ s/is not of (.*\")/[arg %d] is not of $1, ix_$var + 1/g;
+ $subexpr =~ s/\$var/${var}[ix_$var - $argoff]/;
+ $expr =~ s/DO_ARRAY_ELEM/$subexpr/;
+ }
+ if ($expr =~ m#/\*.*scope.*\*/#i) { # "scope" in C comments
+ $ScopeThisXSUB = 1;
+ }
+ if (defined($defaults{$var})) {
+ $expr =~ s/(\t+)/$1 /g;
+ $expr =~ s/ /\t/g;
+ if ($name_printed) {
+ print ";\n";
+ } else {
+ eval qq/print "\\t$var;\\n"/;
+ warn $@ if $@;
+ }
+ if ($defaults{$var} eq 'NO_INIT') {
+ $deferred .= eval qq/"\\n\\tif (items >= $num) {\\n$expr;\\n\\t}\\n"/;
+ } else {
+ $deferred .= eval qq/"\\n\\tif (items < $num)\\n\\t $var = $defaults{$var};\\n\\telse {\\n$expr;\\n\\t}\\n"/;
+ }
+ warn $@ if $@;
+ } elsif ($ScopeThisXSUB or $expr !~ /^\s*\$var =/) {
+ if ($name_printed) {
+ print ";\n";
+ } else {
+ eval qq/print "\\t$var;\\n"/;
+ warn $@ if $@;
+ }
+ $deferred .= eval qq/"\\n$expr;\\n"/;
+ warn $@ if $@;
+ } else {
+ die "panic: do not know how to handle this branch for function pointers"
+ if $name_printed;
+ eval qq/print "$expr;\\n"/;
+ warn $@ if $@;
+ }
+}
+
+sub generate_output {
+ local($type, $num, $var, $do_setmagic, $do_push) = @_;
+ local($arg) = "ST(" . ($num - ($num != 0)) . ")";
+ local($argoff) = $num - 1;
+ local($ntype);
+
+ $type = TidyType($type) ;
+ if ($type =~ /^array\(([^,]*),(.*)\)/) {
+ print "\t$arg = sv_newmortal();\n";
+ print "\tsv_setpvn($arg, (char *)$var, $2 * sizeof($1));\n";
+ print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
+ } else {
+ blurt("Error: '$type' not in typemap"), return
+ unless defined($type_kind{$type});
+ blurt("Error: No OUTPUT definition for type '$type', typekind '$type_kind{$type}' found"), return
+ unless defined $output_expr{$type_kind{$type}} ;
+ ($ntype = $type) =~ s/\s*\*/Ptr/g;
+ $ntype =~ s/\(\)//g;
+ ($subtype = $ntype) =~ s/(?:Array)?(?:Ptr)?$//;
+ $expr = $output_expr{$type_kind{$type}};
+ if ($expr =~ /DO_ARRAY_ELEM/) {
+ blurt("Error: '$subtype' not in typemap"), return
+ unless defined($type_kind{$subtype});
+ blurt("Error: No OUTPUT definition for type '$subtype', typekind '$type_kind{$subtype}' found"), return
+ unless defined $output_expr{$type_kind{$subtype}} ;
+ $subexpr = $output_expr{$type_kind{$subtype}};
+ $subexpr =~ s/ntype/subtype/g;
+ $subexpr =~ s/\$arg/ST(ix_$var)/g;
+ $subexpr =~ s/\$var/${var}[ix_$var]/g;
+ $subexpr =~ s/\n\t/\n\t\t/g;
+ $expr =~ s/DO_ARRAY_ELEM\n/$subexpr/;
+ eval "print qq\a$expr\a";
+ warn $@ if $@;
+ print "\t\tSvSETMAGIC(ST(ix_$var));\n" if $do_setmagic;
+ } elsif ($var eq 'RETVAL') {
+ if ($expr =~ /^\t\$arg = new/) {
+ # We expect that $arg has refcnt 1, so we need to
+ # mortalize it.
+ eval "print qq\a$expr\a";
+ warn $@ if $@;
+ print "\tsv_2mortal(ST($num));\n";
+ print "\tSvSETMAGIC(ST($num));\n" if $do_setmagic;
+ } elsif ($expr =~ /^\s*\$arg\s*=/) {
+ # We expect that $arg has refcnt >=1, so we need
+ # to mortalize it!
+ eval "print qq\a$expr\a";
+ warn $@ if $@;
+ print "\tsv_2mortal(ST(0));\n";
+ print "\tSvSETMAGIC(ST(0));\n" if $do_setmagic;
+ } else {
+ # Just hope that the entry would safely write it
+ # over an already mortalized value. By
+ # coincidence, something like $arg = &sv_undef
+ # works too.
+ print "\tST(0) = sv_newmortal();\n";
+ eval "print qq\a$expr\a";
+ warn $@ if $@;
+ # new mortals don't have set magic
+ }
+ } elsif ($do_push) {
+ print "\tPUSHs(sv_newmortal());\n";
+ $arg = "ST($num)";
+ eval "print qq\a$expr\a";
+ warn $@ if $@;
+ print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
+ } elsif ($arg =~ /^ST\(\d+\)$/) {
+ eval "print qq\a$expr\a";
+ warn $@ if $@;
+ print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
+ }
+ }
+}
+
+sub map_type {
+ my($type, $varname) = @_;
+
+ # C++ has :: in types too so skip this
+ $type =~ tr/:/_/ unless $hiertype;
+ $type =~ s/^array\(([^,]*),(.*)\).*/$1 */s;
+ if ($varname) {
+ if ($varname && $type =~ / \( \s* \* (?= \s* \) ) /xg) {
+ (substr $type, pos $type, 0) = " $varname ";
+ } else {
+ $type .= "\t$varname";
+ }
+ }
+ $type;
+}
+
+
+#########################################################
+package
+ ExtUtils::ParseXS::CountLines;
+use strict;
+use vars qw($SECTION_END_MARKER);
+
+sub TIEHANDLE {
+ my ($class, $cfile, $fh) = @_;
+ $cfile =~ s/\\/\\\\/g;
+ $SECTION_END_MARKER = qq{#line --- "$cfile"};
+
+ return bless {buffer => '',
+ fh => $fh,
+ line_no => 1,
+ }, $class;
+}
+
+sub PRINT {
+ my $self = shift;
+ for (@_) {
+ $self->{buffer} .= $_;
+ while ($self->{buffer} =~ s/^([^\n]*\n)//) {
+ my $line = $1;
+ ++ $self->{line_no};
+ $line =~ s|^\#line\s+---(?=\s)|#line $self->{line_no}|;
+ print {$self->{fh}} $line;
+ }
+ }
+}
+
+sub PRINTF {
+ my $self = shift;
+ my $fmt = shift;
+ $self->PRINT(sprintf($fmt, @_));
+}
+
+sub DESTROY {
+ # Not necessary if we're careful to end with a "\n"
+ my $self = shift;
+ print {$self->{fh}} $self->{buffer};
+}
+
+sub UNTIE {
+ # This sub does nothing, but is neccessary for references to be released.
+}
+
+sub end_marker {
+ return $SECTION_END_MARKER;
+}
+
+
+1;
+__END__
+
+=head1 NAME
+
+ExtUtils::ParseXS - converts Perl XS code into C code
+
+=head1 SYNOPSIS
+
+ use ExtUtils::ParseXS qw(process_file);
+
+ process_file( filename => 'foo.xs' );
+
+ process_file( filename => 'foo.xs',
+ output => 'bar.c',
+ 'C++' => 1,
+ typemap => 'path/to/typemap',
+ hiertype => 1,
+ except => 1,
+ prototypes => 1,
+ versioncheck => 1,
+ linenumbers => 1,
+ optimize => 1,
+ prototypes => 1,
+ );
+=head1 DESCRIPTION
+
+C<ExtUtils::ParseXS> will compile XS code into C code by embedding the constructs
+necessary to let C functions manipulate Perl values and creates the glue
+necessary to let Perl access those functions. The compiler uses typemaps to
+determine how to map C function parameters and variables to Perl values.
+
+The compiler will search for typemap files called I<typemap>. It will use
+the following search path to find default typemaps, with the rightmost
+typemap taking precedence.
+
+ ../../../typemap:../../typemap:../typemap:typemap
+
+=head1 EXPORT
+
+None by default. C<process_file()> may be exported upon request.
+
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item process_xs()
+
+This function processes an XS file and sends output to a C file.
+Named parameters control how the processing is done. The following
+parameters are accepted:
+
+=over 4
+
+=item B<C++>
+
+Adds C<extern "C"> to the C code. Default is false.
+
+=item B<hiertype>
+
+Retains C<::> in type names so that C++ hierachical types can be
+mapped. Default is false.
+
+=item B<except>
+
+Adds exception handling stubs to the C code. Default is false.
+
+=item B<typemap>
+
+Indicates that a user-supplied typemap should take precedence over the
+default typemaps. A single typemap may be specified as a string, or
+multiple typemaps can be specified in an array reference, with the
+last typemap having the highest precedence.
+
+=item B<prototypes>
+
+Generates prototype code for all xsubs. Default is false.
+
+=item B<versioncheck>
+
+Makes sure at run time that the object file (derived from the C<.xs>
+file) and the C<.pm> files have the same version number. Default is
+true.
+
+=item B<linenumbers>
+
+Adds C<#line> directives to the C output so error messages will look
+like they came from the original XS file. Default is true.
+
+=item B<optimize>
+
+Enables certain optimizations. The only optimization that is currently
+affected is the use of I<target>s by the output C code (see L<perlguts>).
+Not optimizing may significantly slow down the generated code, but this is the way
+B<xsubpp> of 5.005 and earlier operated. Default is to optimize.
+
+=item B<inout>
+
+Enable recognition of C<IN>, C<OUT_LIST> and C<INOUT_LIST>
+declarations. Default is true.
+
+=item B<argtypes>
+
+Enable recognition of ANSI-like descriptions of function signature.
+Default is true.
+
+=item B<s>
+
+I have no clue what this does. Strips function prefixes?
+
+=back
+
+=item errors()
+
+This function returns the number of [a certain kind of] errors
+encountered during processing of the XS file.
+
+=back
+
+=head1 AUTHOR
+
+Based on xsubpp code, written by Larry Wall.
+
+Maintained by:
+
+=over 4
+
+=item *
+
+Ken Williams, <ken@mathforum.org>
+
+=item *
+
+David Golden, <dagolden@cpan.org>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2002-2009 by Ken Williams, David Golden and other contributors. All
+rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+Based on the ExtUtils::xsubpp code by Larry Wall and the Perl 5
+Porters, which was released under the same license terms.
+
+=head1 SEE ALSO
+
+L<perl>, ExtUtils::xsubpp, ExtUtils::MakeMaker, L<perlxs>, L<perlxstut>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/testlib.pm b/Master/tlpkg/tlperl.straw/lib/ExtUtils/testlib.pm
new file mode 100755
index 00000000000..fe01beb0e1e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/testlib.pm
@@ -0,0 +1,41 @@
+package ExtUtils::testlib;
+
+use strict;
+use warnings;
+
+our $VERSION = 6.56;
+
+use Cwd;
+use File::Spec;
+
+# So the tests can chdir around and not break @INC.
+# We use getcwd() because otherwise rel2abs will blow up under taint
+# mode pre-5.8. We detaint is so @INC won't be tainted. This is
+# no worse, and probably better, than just shoving an untainted,
+# relative "blib/lib" onto @INC.
+my $cwd;
+BEGIN {
+ ($cwd) = getcwd() =~ /(.*)/;
+}
+use lib map { File::Spec->rel2abs($_, $cwd) } qw(blib/arch blib/lib);
+1;
+__END__
+
+=head1 NAME
+
+ExtUtils::testlib - add blib/* directories to @INC
+
+=head1 SYNOPSIS
+
+ use ExtUtils::testlib;
+
+=head1 DESCRIPTION
+
+After an extension has been built and before it is installed it may be
+desirable to test it bypassing C<make test>. By adding
+
+ use ExtUtils::testlib;
+
+to a test program the intermediate directories used by C<make> are
+added to @INC.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/typemap b/Master/tlpkg/tlperl.straw/lib/ExtUtils/typemap
new file mode 100755
index 00000000000..2c35437e34c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/typemap
@@ -0,0 +1,336 @@
+# basic C types
+int T_IV
+unsigned T_UV
+unsigned int T_UV
+long T_IV
+unsigned long T_UV
+short T_IV
+unsigned short T_UV
+char T_CHAR
+unsigned char T_U_CHAR
+char * T_PV
+unsigned char * T_PV
+const char * T_PV
+caddr_t T_PV
+wchar_t * T_PV
+wchar_t T_IV
+# bool_t is defined in <rpc/rpc.h>
+bool_t T_IV
+size_t T_UV
+ssize_t T_IV
+time_t T_NV
+unsigned long * T_OPAQUEPTR
+char ** T_PACKEDARRAY
+void * T_PTR
+Time_t * T_PV
+SV * T_SV
+SVREF T_SVREF
+AV * T_AVREF
+HV * T_HVREF
+CV * T_CVREF
+
+IV T_IV
+UV T_UV
+NV T_NV
+I32 T_IV
+I16 T_IV
+I8 T_IV
+STRLEN T_UV
+U32 T_U_LONG
+U16 T_U_SHORT
+U8 T_UV
+Result T_U_CHAR
+Boolean T_BOOL
+float T_FLOAT
+double T_DOUBLE
+SysRet T_SYSRET
+SysRetLong T_SYSRET
+FILE * T_STDIO
+PerlIO * T_INOUT
+FileHandle T_PTROBJ
+InputStream T_IN
+InOutStream T_INOUT
+OutputStream T_OUT
+bool T_BOOL
+
+#############################################################################
+INPUT
+T_SV
+ $var = $arg
+T_SVREF
+ if (SvROK($arg))
+ $var = (SV*)SvRV($arg);
+ else
+ Perl_croak(aTHX_ \"%s: %s is not a reference\",
+ ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
+ \"$var\")
+T_AVREF
+ if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV)
+ $var = (AV*)SvRV($arg);
+ else
+ Perl_croak(aTHX_ \"%s: %s is not an array reference\",
+ ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
+ \"$var\")
+T_HVREF
+ if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVHV)
+ $var = (HV*)SvRV($arg);
+ else
+ Perl_croak(aTHX_ \"%s: %s is not a hash reference\",
+ ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
+ \"$var\")
+T_CVREF
+ if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVCV)
+ $var = (CV*)SvRV($arg);
+ else
+ Perl_croak(aTHX_ \"%s: %s is not a code reference\",
+ ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
+ \"$var\")
+T_SYSRET
+ $var NOT IMPLEMENTED
+T_UV
+ $var = ($type)SvUV($arg)
+T_IV
+ $var = ($type)SvIV($arg)
+T_INT
+ $var = (int)SvIV($arg)
+T_ENUM
+ $var = ($type)SvIV($arg)
+T_BOOL
+ $var = (bool)SvTRUE($arg)
+T_U_INT
+ $var = (unsigned int)SvUV($arg)
+T_SHORT
+ $var = (short)SvIV($arg)
+T_U_SHORT
+ $var = (unsigned short)SvUV($arg)
+T_LONG
+ $var = (long)SvIV($arg)
+T_U_LONG
+ $var = (unsigned long)SvUV($arg)
+T_CHAR
+ $var = (char)*SvPV_nolen($arg)
+T_U_CHAR
+ $var = (unsigned char)SvUV($arg)
+T_FLOAT
+ $var = (float)SvNV($arg)
+T_NV
+ $var = ($type)SvNV($arg)
+T_DOUBLE
+ $var = (double)SvNV($arg)
+T_PV
+ $var = ($type)SvPV_nolen($arg)
+T_PTR
+ $var = INT2PTR($type,SvIV($arg))
+T_PTRREF
+ if (SvROK($arg)) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = INT2PTR($type,tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"%s: %s is not a reference\",
+ ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
+ \"$var\")
+T_REF_IV_REF
+ if (sv_isa($arg, \"${ntype}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = *INT2PTR($type *, tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"%s: %s is not of type %s\",
+ ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
+ \"$var\", \"$ntype\")
+T_REF_IV_PTR
+ if (sv_isa($arg, \"${ntype}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = INT2PTR($type, tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"%s: %s is not of type %s\",
+ ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
+ \"$var\", \"$ntype\")
+T_PTROBJ
+ if (sv_derived_from($arg, \"${ntype}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = INT2PTR($type,tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"%s: %s is not of type %s\",
+ ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
+ \"$var\", \"$ntype\")
+T_PTRDESC
+ if (sv_isa($arg, \"${ntype}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ ${type}_desc = (\U${type}_DESC\E*) tmp;
+ $var = ${type}_desc->ptr;
+ }
+ else
+ Perl_croak(aTHX_ \"%s: %s is not of type %s\",
+ ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
+ \"$var\", \"$ntype\")
+T_REFREF
+ if (SvROK($arg)) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = *INT2PTR($type,tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"%s: %s is not a reference\",
+ ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
+ \"$var\")
+T_REFOBJ
+ if (sv_isa($arg, \"${ntype}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = *INT2PTR($type,tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"%s: %s is not of type %s\",
+ ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
+ \"$var\", \"$ntype\")
+T_OPAQUE
+ $var = *($type *)SvPV_nolen($arg)
+T_OPAQUEPTR
+ $var = ($type)SvPV_nolen($arg)
+T_PACKED
+ $var = XS_unpack_$ntype($arg)
+T_PACKEDARRAY
+ $var = XS_unpack_$ntype($arg)
+T_CALLBACK
+ $var = make_perl_cb_$type($arg)
+T_ARRAY
+ U32 ix_$var = $argoff;
+ $var = $ntype(items -= $argoff);
+ while (items--) {
+ DO_ARRAY_ELEM;
+ ix_$var++;
+ }
+ /* this is the number of elements in the array */
+ ix_$var -= $argoff
+T_STDIO
+ $var = PerlIO_findFILE(IoIFP(sv_2io($arg)))
+T_IN
+ $var = IoIFP(sv_2io($arg))
+T_INOUT
+ $var = IoIFP(sv_2io($arg))
+T_OUT
+ $var = IoOFP(sv_2io($arg))
+#############################################################################
+OUTPUT
+T_SV
+ $arg = $var;
+T_SVREF
+ $arg = newRV((SV*)$var);
+T_AVREF
+ $arg = newRV((SV*)$var);
+T_HVREF
+ $arg = newRV((SV*)$var);
+T_CVREF
+ $arg = newRV((SV*)$var);
+T_IV
+ sv_setiv($arg, (IV)$var);
+T_UV
+ sv_setuv($arg, (UV)$var);
+T_INT
+ sv_setiv($arg, (IV)$var);
+T_SYSRET
+ if ($var != -1) {
+ if ($var == 0)
+ sv_setpvn($arg, "0 but true", 10);
+ else
+ sv_setiv($arg, (IV)$var);
+ }
+T_ENUM
+ sv_setiv($arg, (IV)$var);
+T_BOOL
+ $arg = boolSV($var);
+T_U_INT
+ sv_setuv($arg, (UV)$var);
+T_SHORT
+ sv_setiv($arg, (IV)$var);
+T_U_SHORT
+ sv_setuv($arg, (UV)$var);
+T_LONG
+ sv_setiv($arg, (IV)$var);
+T_U_LONG
+ sv_setuv($arg, (UV)$var);
+T_CHAR
+ sv_setpvn($arg, (char *)&$var, 1);
+T_U_CHAR
+ sv_setuv($arg, (UV)$var);
+T_FLOAT
+ sv_setnv($arg, (double)$var);
+T_NV
+ sv_setnv($arg, (NV)$var);
+T_DOUBLE
+ sv_setnv($arg, (double)$var);
+T_PV
+ sv_setpv((SV*)$arg, $var);
+T_PTR
+ sv_setiv($arg, PTR2IV($var));
+T_PTRREF
+ sv_setref_pv($arg, Nullch, (void*)$var);
+T_REF_IV_REF
+ sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var));
+T_REF_IV_PTR
+ sv_setref_pv($arg, \"${ntype}\", (void*)$var);
+T_PTROBJ
+ sv_setref_pv($arg, \"${ntype}\", (void*)$var);
+T_PTRDESC
+ sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var));
+T_REFREF
+ NOT_IMPLEMENTED
+T_REFOBJ
+ NOT IMPLEMENTED
+T_OPAQUE
+ sv_setpvn($arg, (char *)&$var, sizeof($var));
+T_OPAQUEPTR
+ sv_setpvn($arg, (char *)$var, sizeof(*$var));
+T_PACKED
+ XS_pack_$ntype($arg, $var);
+T_PACKEDARRAY
+ XS_pack_$ntype($arg, $var, count_$ntype);
+T_DATAUNIT
+ sv_setpvn($arg, $var.chp(), $var.size());
+T_CALLBACK
+ sv_setpvn($arg, $var.context.value().chp(),
+ $var.context.value().size());
+T_ARRAY
+ {
+ U32 ix_$var;
+ EXTEND(SP,size_$var);
+ for (ix_$var = 0; ix_$var < size_$var; ix_$var++) {
+ ST(ix_$var) = sv_newmortal();
+ DO_ARRAY_ELEM
+ }
+ }
+T_STDIO
+ {
+ GV *gv = newGVgen("$Package");
+ PerlIO *fp = PerlIO_importFILE($var,0);
+ if ( fp && do_open(gv, "+<&", 3, FALSE, 0, 0, fp) )
+ sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+ else
+ $arg = &PL_sv_undef;
+ }
+T_IN
+ {
+ GV *gv = newGVgen("$Package");
+ if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) )
+ sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+ else
+ $arg = &PL_sv_undef;
+ }
+T_INOUT
+ {
+ GV *gv = newGVgen("$Package");
+ if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) )
+ sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+ else
+ $arg = &PL_sv_undef;
+ }
+T_OUT
+ {
+ GV *gv = newGVgen("$Package");
+ if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) )
+ sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+ else
+ $arg = &PL_sv_undef;
+ }
diff --git a/Master/tlpkg/tlperl.straw/lib/ExtUtils/xsubpp b/Master/tlpkg/tlperl.straw/lib/ExtUtils/xsubpp
new file mode 100755
index 00000000000..e4e5b774d82
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/ExtUtils/xsubpp
@@ -0,0 +1,156 @@
+#!./miniperl
+
+require 5.002;
+use ExtUtils::ParseXS qw(process_file);
+use Getopt::Long;
+
+my %args = ();
+
+my $usage = "Usage: xsubpp [-v] [-csuffix csuffix] [-except] [-prototypes] [-noversioncheck] [-nolinenumbers] [-nooptimize] [-noinout] [-noargtypes] [-s pattern] [-typemap typemap]... file.xs\n";
+
+Getopt::Long::Configure qw(no_auto_abbrev no_ignore_case);
+
+@ARGV = grep {$_ ne '-C++'} @ARGV; # Allow -C++ for backward compatibility
+GetOptions(\%args, qw(hiertype!
+ prototypes!
+ versioncheck!
+ linenumbers!
+ optimize!
+ inout!
+ argtypes!
+ object_capi!
+ except!
+ v
+ typemap=s@
+ output=s
+ s=s
+ csuffix=s
+ ))
+ or die $usage;
+
+if ($args{v}) {
+ print "xsubpp version $ExtUtils::ParseXS::VERSION\n";
+ exit;
+}
+
+@ARGV == 1 or die $usage;
+
+$args{filename} = shift @ARGV;
+
+process_file(%args);
+exit( ExtUtils::ParseXS::errors() ? 1 : 0 );
+
+__END__
+
+=head1 NAME
+
+xsubpp - compiler to convert Perl XS code into C code
+
+=head1 SYNOPSIS
+
+B<xsubpp> [B<-v>] [B<-except>] [B<-s pattern>] [B<-prototypes>] [B<-noversioncheck>] [B<-nolinenumbers>] [B<-nooptimize>] [B<-typemap typemap>] [B<-output filename>]... file.xs
+
+=head1 DESCRIPTION
+
+This compiler is typically run by the makefiles created by L<ExtUtils::MakeMaker>.
+
+I<xsubpp> will compile XS code into C code by embedding the constructs
+necessary to let C functions manipulate Perl values and creates the glue
+necessary to let Perl access those functions. The compiler uses typemaps to
+determine how to map C function parameters and variables to Perl values.
+
+The compiler will search for typemap files called I<typemap>. It will use
+the following search path to find default typemaps, with the rightmost
+typemap taking precedence.
+
+ ../../../typemap:../../typemap:../typemap:typemap
+
+It will also use a default typemap installed as C<ExtUtils::typemap>.
+
+=head1 OPTIONS
+
+Note that the C<XSOPT> MakeMaker option may be used to add these options to
+any makefiles generated by MakeMaker.
+
+=over 5
+
+=item B<-hiertype>
+
+Retains '::' in type names so that C++ hierarchical types can be mapped.
+
+=item B<-except>
+
+Adds exception handling stubs to the C code.
+
+=item B<-typemap typemap>
+
+Indicates that a user-supplied typemap should take precedence over the
+default typemaps. This option may be used multiple times, with the last
+typemap having the highest precedence.
+
+=item B<-output filename>
+
+Specifies the name of the output file to generate. If no file is
+specified, output will be written to standard output.
+
+=item B<-v>
+
+Prints the I<xsubpp> version number to standard output, then exits.
+
+=item B<-prototypes>
+
+By default I<xsubpp> will not automatically generate prototype code for
+all xsubs. This flag will enable prototypes.
+
+=item B<-noversioncheck>
+
+Disables the run time test that determines if the object file (derived
+from the C<.xs> file) and the C<.pm> files have the same version
+number.
+
+=item B<-nolinenumbers>
+
+Prevents the inclusion of `#line' directives in the output.
+
+=item B<-nooptimize>
+
+Disables certain optimizations. The only optimization that is currently
+affected is the use of I<target>s by the output C code (see L<perlguts>).
+This may significantly slow down the generated code, but this is the way
+B<xsubpp> of 5.005 and earlier operated.
+
+=item B<-noinout>
+
+Disable recognition of C<IN>, C<OUT_LIST> and C<INOUT_LIST> declarations.
+
+=item B<-noargtypes>
+
+Disable recognition of ANSI-like descriptions of function signature.
+
+=item B<-C++>
+
+Currently doesn't do anything at all. This flag has been a no-op for
+many versions of perl, at least as far back as perl5.003_07. It's
+allowed here for backwards compatibility.
+
+=back
+
+=head1 ENVIRONMENT
+
+No environment variables are used.
+
+=head1 AUTHOR
+
+Originally by Larry Wall. Turned into the C<ExtUtils::ParseXS> module
+by Ken Williams.
+
+=head1 MODIFICATION HISTORY
+
+See the file F<Changes>.
+
+=head1 SEE ALSO
+
+perl(1), perlxs(1), perlxstut(1), ExtUtils::ParseXS
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/FCGI.pm b/Master/tlpkg/tlperl.straw/lib/FCGI.pm
new file mode 100755
index 00000000000..b51386b020d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/FCGI.pm
@@ -0,0 +1,312 @@
+# $Id: FCGI.PL,v 1.37 2002/12/15 20:02:48 skimo Exp $
+
+package FCGI;
+
+require Exporter;
+require DynaLoader;
+
+@ISA = qw(Exporter DynaLoader);
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+@EXPORT = qw(
+
+);
+
+$VERSION = q{0.68};
+
+bootstrap FCGI;
+$VERSION = eval $VERSION;
+# Preloaded methods go here.
+
+# Autoload methods go after __END__, and are processed by the autosplit program.
+
+*FAIL_ACCEPT_ON_INTR = sub() { 1 };
+
+sub Request(;***$*$) {
+ my @defaults = (\*STDIN, \*STDOUT, \*STDERR, \%ENV, 0, 0);
+ $_[4] = fileno($_[4]) if defined($_[4]) && defined(fileno($_[4]));
+ splice @defaults,0,@_,@_;
+ RequestX(@defaults);
+}
+
+sub accept() {
+ warn "accept called as a method; you probably wanted to call Accept" if @_;
+ if (defined %FCGI::ENV) {
+ %ENV = %FCGI::ENV;
+ } else {
+ %FCGI::ENV = %ENV;
+ }
+ my $rc = Accept($global_request);
+ for (keys %FCGI::ENV) {
+ $ENV{$_} = $FCGI::ENV{$_} unless exists $ENV{$_};
+ }
+
+ # not SFIO
+ $SIG{__WARN__} = $warn_handler if (tied (*STDIN));
+ $SIG{__DIE__} = $die_handler if (tied (*STDIN));
+
+ return $rc;
+}
+
+sub finish() {
+ warn "finish called as a method; you probably wanted to call Finish" if @_;
+ %ENV = %FCGI::ENV if (defined %FCGI::ENV);
+
+ # not SFIO
+ if (tied (*STDIN)) {
+ delete $SIG{__WARN__} if ($SIG{__WARN__} == $warn_handler);
+ delete $SIG{__DIE__} if ($SIG{__DIE__} == $die_handler);
+ }
+
+ Finish ($global_request);
+}
+
+sub flush() {
+ warn "flush called as a method; you probably wanted to call Flush" if @_;
+ Flush($global_request);
+}
+
+sub detach() {
+ warn "detach called as a method; you probably wanted to call Detach" if @_;
+ Detach($global_request);
+}
+
+sub attach() {
+ warn "attach called as a method; you probably wanted to call Attach" if @_;
+ Attach($global_request);
+}
+
+# deprecated
+sub set_exit_status {
+}
+
+sub start_filter_data() {
+ StartFilterData($global_request);
+}
+
+$global_request = Request();
+$warn_handler = sub { print STDERR @_ };
+$die_handler = sub { print STDERR @_ unless $^S };
+
+package FCGI::Stream;
+
+sub PRINTF {
+ shift->PRINT(sprintf(shift, @_));
+}
+
+sub BINMODE {
+}
+
+sub READLINE {
+ my $stream = shift;
+ my ($s, $c);
+ my $rs = $/ eq '' ? "\n\n" : $/;
+ my $l = substr $rs, -1;
+ my $len = length $rs;
+
+ $c = $stream->GETC();
+ if ($/ eq '') {
+ while ($c eq "\n") {
+ $c = $stream->GETC();
+ }
+ }
+ while (defined $c) {
+ $s .= $c;
+ last if $c eq $l and substr($s, -$len) eq $rs;
+ $c = $stream->GETC();
+ }
+ $s;
+}
+
+sub OPEN {
+ $_[0]->CLOSE;
+ if (@_ == 2) {
+ return open($_[0], $_[1]);
+ } else {
+ my $rc;
+ eval("$rc = open($_[0], $_[1], $_[2])");
+ die $@ if $@;
+ return $rc;
+ }
+}
+
+# Some things (e.g. IPC::Run) use fileno to determine if a filehandle is open,
+# so we return a defined, but meaningless value. (-1 being the error return
+# value from the syscall in c, meaning it can never be a valid fd no)
+# Probably a better alternative would be to return the fcgi stream fd.
+sub FILENO { -1 }
+
+1;
+
+=pod
+
+=head1 NAME
+
+FCGI - Fast CGI module
+
+=head1 SYNOPSIS
+
+ use FCGI;
+
+ my $count = 0;
+ my $request = FCGI::Request();
+
+ while($request->Accept() >= 0) {
+ print("Content-type: text/html\r\n\r\n", ++$count);
+ }
+
+=head1 DESCRIPTION
+
+Functions:
+
+=over 4
+
+=item FCGI::Request
+
+Creates a request handle. It has the following optional parameters:
+
+=over 8
+
+=item input perl file handle (default: \*STDIN)
+
+=item output perl file handle (default: \*STDOUT)
+
+=item error perl file handle (default: \*STDERR)
+
+These filehandles will be setup to act as input/output/error
+on succesful Accept.
+
+=item environment hash reference (default: \%ENV)
+
+The hash will be populated with the environment.
+
+=item socket (default: 0)
+
+Socket to communicate with the server.
+Can be the result of the OpenSocket function.
+For the moment, it's the file descriptor of the socket
+that should be passed. This may change in the future.
+
+You should only use your own socket if your program
+is not started by a process manager such as mod_fastcgi
+(except for the FastCgiExternalServer case) or cgi-fcgi.
+If you use the option, you have to let your FastCGI
+server know which port (and possibly server) your program
+is listening on.
+See remote.pl for an example.
+
+=item flags (default: 0)
+
+Possible values:
+
+=over 12
+
+=item FCGI::FAIL_ACCEPT_ON_INTR
+
+If set, Accept will fail if interrupted.
+It not set, it will just keep on waiting.
+
+=back
+
+=back
+
+Example usage:
+ my $req = FCGI::Request;
+
+or:
+ my %env;
+ my $in = new IO::Handle;
+ my $out = new IO::Handle;
+ my $err = new IO::Handle;
+ my $req = FCGI::Request($in, $out, $err, \%env);
+
+=item FCGI::OpenSocket(path, backlog)
+
+Creates a socket suitable to use as an argument to Request.
+
+=over 8
+
+=item path
+
+Pathname of socket or colon followed by local tcp port.
+Note that some systems take file permissions into account
+on Unix domain sockets, so you'll have to make sure that
+the server can write to the created file, by changing
+the umask before the call and/or changing permissions and/or
+group of the file afterwards.
+
+=item backlog
+
+Maximum length of the queue of pending connections.
+If a connection
+request arrives with the queue full the client may receive
+an error with an indication of ECONNREFUSED.
+
+=back
+
+=item FCGI::CloseSocket(socket)
+
+Close a socket opened with OpenSocket.
+
+=item $req->Accept()
+
+Accepts a connection on $req, attaching the filehandles and
+populating the environment hash.
+Returns 0 on success.
+If a connection has been accepted before, the old
+one will be finished first.
+
+Note that unlike with the old interface, no die and warn
+handlers are installed by default. This means that if
+you are not running an sfio enabled perl, any warn or
+die message will not end up in the server's log by default.
+It is advised you set up die and warn handlers yourself.
+FCGI.pm contains an example of die and warn handlers.
+
+=item $req->Finish()
+
+Finishes accepted connection.
+Also detaches filehandles.
+
+=item $req->Flush()
+
+Flushes accepted connection.
+
+=item $req->Detach()
+
+Temporarily detaches filehandles on an accepted connection.
+
+=item $req->Attach()
+
+Re-attaches filehandles on an accepted connection.
+
+=item $req->LastCall()
+
+Tells the library not to accept any more requests on this handle.
+It should be safe to call this method from signal handlers.
+
+Note that this method is still experimental and everything
+about it, including its name, is subject to change.
+
+=item $env = $req->GetEnvironment()
+
+Returns the environment parameter passed to FCGI::Request.
+
+=item ($in, $out, $err) = $req->GetHandles()
+
+Returns the file handle parameters passed to FCGI::Request.
+
+=item $isfcgi = $req->IsFastCGI()
+
+Returns whether or not the program was run as a FastCGI.
+
+=back
+
+=head1 AUTHOR
+
+Sven Verdoolaege <skimo@kotnet.org>
+
+=cut
+
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/Fcntl.pm b/Master/tlpkg/tlperl.straw/lib/Fcntl.pm
new file mode 100755
index 00000000000..83edeb60d85
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Fcntl.pm
@@ -0,0 +1,244 @@
+package Fcntl;
+
+=head1 NAME
+
+Fcntl - load the C Fcntl.h defines
+
+=head1 SYNOPSIS
+
+ use Fcntl;
+ use Fcntl qw(:DEFAULT :flock);
+
+=head1 DESCRIPTION
+
+This module is just a translation of the C F<fcntl.h> file.
+Unlike the old mechanism of requiring a translated F<fcntl.ph>
+file, this uses the B<h2xs> program (see the Perl source distribution)
+and your native C compiler. This means that it has a
+far more likely chance of getting the numbers right.
+
+=head1 NOTE
+
+Only C<#define> symbols get translated; you must still correctly
+pack up your own arguments to pass as args for locking functions, etc.
+
+=head1 EXPORTED SYMBOLS
+
+By default your system's F_* and O_* constants (eg, F_DUPFD and
+O_CREAT) and the FD_CLOEXEC constant are exported into your namespace.
+
+You can request that the flock() constants (LOCK_SH, LOCK_EX, LOCK_NB
+and LOCK_UN) be provided by using the tag C<:flock>. See L<Exporter>.
+
+You can request that the old constants (FAPPEND, FASYNC, FCREAT,
+FDEFER, FEXCL, FNDELAY, FNONBLOCK, FSYNC, FTRUNC) be provided for
+compatibility reasons by using the tag C<:Fcompat>. For new
+applications the newer versions of these constants are suggested
+(O_APPEND, O_ASYNC, O_CREAT, O_DEFER, O_EXCL, O_NDELAY, O_NONBLOCK,
+O_SYNC, O_TRUNC).
+
+For ease of use also the SEEK_* constants (for seek() and sysseek(),
+e.g. SEEK_END) and the S_I* constants (for chmod() and stat()) are
+available for import. They can be imported either separately or using
+the tags C<:seek> and C<:mode>.
+
+Please refer to your native fcntl(2), open(2), fseek(3), lseek(2)
+(equal to Perl's seek() and sysseek(), respectively), and chmod(2)
+documentation to see what constants are implemented in your system.
+
+See L<perlopentut> to learn about the uses of the O_* constants
+with sysopen().
+
+See L<perlfunc/seek> and L<perlfunc/sysseek> about the SEEK_* constants.
+
+See L<perlfunc/stat> about the S_I* constants.
+
+=cut
+
+use strict;
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $AUTOLOAD);
+
+require Exporter;
+use XSLoader ();
+@ISA = qw(Exporter);
+BEGIN {
+ $VERSION = "1.06";
+}
+
+# Items to export into callers namespace by default
+# (move infrequently used names to @EXPORT_OK below)
+@EXPORT =
+ qw(
+ FD_CLOEXEC
+ F_ALLOCSP
+ F_ALLOCSP64
+ F_COMPAT
+ F_DUP2FD
+ F_DUPFD
+ F_EXLCK
+ F_FREESP
+ F_FREESP64
+ F_FSYNC
+ F_FSYNC64
+ F_GETFD
+ F_GETFL
+ F_GETLK
+ F_GETLK64
+ F_GETOWN
+ F_NODNY
+ F_POSIX
+ F_RDACC
+ F_RDDNY
+ F_RDLCK
+ F_RWACC
+ F_RWDNY
+ F_SETFD
+ F_SETFL
+ F_SETLK
+ F_SETLK64
+ F_SETLKW
+ F_SETLKW64
+ F_SETOWN
+ F_SHARE
+ F_SHLCK
+ F_UNLCK
+ F_UNSHARE
+ F_WRACC
+ F_WRDNY
+ F_WRLCK
+ O_ACCMODE
+ O_ALIAS
+ O_APPEND
+ O_ASYNC
+ O_BINARY
+ O_CREAT
+ O_DEFER
+ O_DIRECT
+ O_DIRECTORY
+ O_DSYNC
+ O_EXCL
+ O_EXLOCK
+ O_LARGEFILE
+ O_NDELAY
+ O_NOCTTY
+ O_NOFOLLOW
+ O_NOINHERIT
+ O_NONBLOCK
+ O_RANDOM
+ O_RAW
+ O_RDONLY
+ O_RDWR
+ O_RSRC
+ O_RSYNC
+ O_SEQUENTIAL
+ O_SHLOCK
+ O_SYNC
+ O_TEMPORARY
+ O_TEXT
+ O_TRUNC
+ O_WRONLY
+ );
+
+# Other items we are prepared to export if requested
+@EXPORT_OK = qw(
+ DN_ACCESS
+ DN_ATTRIB
+ DN_CREATE
+ DN_DELETE
+ DN_MODIFY
+ DN_MULTISHOT
+ DN_RENAME
+ FAPPEND
+ FASYNC
+ FCREAT
+ FDEFER
+ FDSYNC
+ FEXCL
+ FLARGEFILE
+ FNDELAY
+ FNONBLOCK
+ FRSYNC
+ FSYNC
+ FTRUNC
+ F_GETLEASE
+ F_GETSIG
+ F_NOTIFY
+ F_SETLEASE
+ F_SETSIG
+ LOCK_EX
+ LOCK_MAND
+ LOCK_NB
+ LOCK_READ
+ LOCK_RW
+ LOCK_SH
+ LOCK_UN
+ LOCK_WRITE
+ O_IGNORE_CTTY
+ O_NOATIME
+ O_NOLINK
+ O_NOTRANS
+ SEEK_CUR
+ SEEK_END
+ SEEK_SET
+ S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
+ S_IREAD S_IWRITE S_IEXEC
+ S_IRGRP S_IWGRP S_IXGRP S_IRWXG
+ S_IROTH S_IWOTH S_IXOTH S_IRWXO
+ S_IRUSR S_IWUSR S_IXUSR S_IRWXU
+ S_ISUID S_ISGID S_ISVTX S_ISTXT
+ _S_IFMT S_IFREG S_IFDIR S_IFLNK
+ &S_ISREG &S_ISDIR &S_ISLNK &S_ISSOCK &S_ISBLK &S_ISCHR &S_ISFIFO
+ &S_ISWHT &S_ISENFMT &S_IFMT &S_IMODE
+);
+# Named groups of exports
+%EXPORT_TAGS = (
+ 'flock' => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)],
+ 'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE
+ FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)],
+ 'seek' => [qw(SEEK_SET SEEK_CUR SEEK_END)],
+ 'mode' => [qw(S_ISUID S_ISGID S_ISVTX S_ISTXT
+ _S_IFMT S_IFREG S_IFDIR S_IFLNK
+ S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
+ S_IRUSR S_IWUSR S_IXUSR S_IRWXU
+ S_IRGRP S_IWGRP S_IXGRP S_IRWXG
+ S_IROTH S_IWOTH S_IXOTH S_IRWXO
+ S_IREAD S_IWRITE S_IEXEC
+ S_ISREG S_ISDIR S_ISLNK S_ISSOCK
+ S_ISBLK S_ISCHR S_ISFIFO
+ S_ISWHT S_ISENFMT
+ S_IFMT S_IMODE
+ )],
+);
+
+# Force the constants to become inlined
+BEGIN {
+ XSLoader::load 'Fcntl', $VERSION;
+}
+
+sub S_IFMT { @_ ? ( $_[0] & _S_IFMT() ) : _S_IFMT() }
+sub S_IMODE { $_[0] & 07777 }
+
+sub S_ISREG { ( $_[0] & _S_IFMT() ) == S_IFREG() }
+sub S_ISDIR { ( $_[0] & _S_IFMT() ) == S_IFDIR() }
+sub S_ISLNK { ( $_[0] & _S_IFMT() ) == S_IFLNK() }
+sub S_ISSOCK { ( $_[0] & _S_IFMT() ) == S_IFSOCK() }
+sub S_ISBLK { ( $_[0] & _S_IFMT() ) == S_IFBLK() }
+sub S_ISCHR { ( $_[0] & _S_IFMT() ) == S_IFCHR() }
+sub S_ISFIFO { ( $_[0] & _S_IFMT() ) == S_IFIFO() }
+sub S_ISWHT { ( $_[0] & _S_IFMT() ) == S_IFWHT() }
+sub S_ISENFMT { ( $_[0] & _S_IFMT() ) == S_IFENFMT() }
+
+sub AUTOLOAD {
+ (my $constname = $AUTOLOAD) =~ s/.*:://;
+ die "&Fcntl::constant not defined" if $constname eq 'constant';
+ my ($error, $val) = constant($constname);
+ if ($error) {
+ my (undef,$file,$line) = caller;
+ die "$error at $file line $line.\n";
+ }
+ no strict 'refs';
+ *$AUTOLOAD = sub { $val };
+ goto &$AUTOLOAD;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Basename.pm b/Master/tlpkg/tlperl.straw/lib/File/Basename.pm
new file mode 100755
index 00000000000..b3fe0ac6e59
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Basename.pm
@@ -0,0 +1,402 @@
+=head1 NAME
+
+File::Basename - Parse file paths into directory, filename and suffix.
+
+=head1 SYNOPSIS
+
+ use File::Basename;
+
+ ($name,$path,$suffix) = fileparse($fullname,@suffixlist);
+ $name = fileparse($fullname,@suffixlist);
+
+ $basename = basename($fullname,@suffixlist);
+ $dirname = dirname($fullname);
+
+
+=head1 DESCRIPTION
+
+These routines allow you to parse file paths into their directory, filename
+and suffix.
+
+B<NOTE>: C<dirname()> and C<basename()> emulate the behaviours, and
+quirks, of the shell and C functions of the same name. See each
+function's documentation for details. If your concern is just parsing
+paths it is safer to use L<File::Spec>'s C<splitpath()> and
+C<splitdir()> methods.
+
+It is guaranteed that
+
+ # Where $path_separator is / for Unix, \ for Windows, etc...
+ dirname($path) . $path_separator . basename($path);
+
+is equivalent to the original path for all systems but VMS.
+
+
+=cut
+
+
+package File::Basename;
+
+# A bit of juggling to insure that C<use re 'taint';> always works, since
+# File::Basename is used during the Perl build, when the re extension may
+# not be available.
+BEGIN {
+ unless (eval { require re; })
+ { eval ' sub re::import { $^H |= 0x00100000; } ' } # HINT_RE_TAINT
+ import re 'taint';
+}
+
+
+use strict;
+use 5.006;
+use warnings;
+our(@ISA, @EXPORT, $VERSION, $Fileparse_fstype, $Fileparse_igncase);
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(fileparse fileparse_set_fstype basename dirname);
+$VERSION = "2.77";
+
+fileparse_set_fstype($^O);
+
+
+=over 4
+
+=item C<fileparse>
+X<fileparse>
+
+ my($filename, $directories, $suffix) = fileparse($path);
+ my($filename, $directories, $suffix) = fileparse($path, @suffixes);
+ my $filename = fileparse($path, @suffixes);
+
+The C<fileparse()> routine divides a file path into its $directories, $filename
+and (optionally) the filename $suffix.
+
+$directories contains everything up to and including the last
+directory separator in the $path including the volume (if applicable).
+The remainder of the $path is the $filename.
+
+ # On Unix returns ("baz", "/foo/bar/", "")
+ fileparse("/foo/bar/baz");
+
+ # On Windows returns ("baz", "C:\foo\bar\", "")
+ fileparse("C:\foo\bar\baz");
+
+ # On Unix returns ("", "/foo/bar/baz/", "")
+ fileparse("/foo/bar/baz/");
+
+If @suffixes are given each element is a pattern (either a string or a
+C<qr//>) matched against the end of the $filename. The matching
+portion is removed and becomes the $suffix.
+
+ # On Unix returns ("baz", "/foo/bar/", ".txt")
+ fileparse("/foo/bar/baz.txt", qr/\.[^.]*/);
+
+If type is non-Unix (see C<fileparse_set_fstype()>) then the pattern
+matching for suffix removal is performed case-insensitively, since
+those systems are not case-sensitive when opening existing files.
+
+You are guaranteed that C<$directories . $filename . $suffix> will
+denote the same location as the original $path.
+
+=cut
+
+
+sub fileparse {
+ my($fullname,@suffices) = @_;
+
+ unless (defined $fullname) {
+ require Carp;
+ Carp::croak("fileparse(): need a valid pathname");
+ }
+
+ my $orig_type = '';
+ my($type,$igncase) = ($Fileparse_fstype, $Fileparse_igncase);
+
+ my($taint) = substr($fullname,0,0); # Is $fullname tainted?
+
+ if ($type eq "VMS" and $fullname =~ m{/} ) {
+ # We're doing Unix emulation
+ $orig_type = $type;
+ $type = 'Unix';
+ }
+
+ my($dirpath, $basename);
+
+ if (grep { $type eq $_ } qw(MSDOS DOS MSWin32 Epoc)) {
+ ($dirpath,$basename) = ($fullname =~ /^((?:.*[:\\\/])?)(.*)/s);
+ $dirpath .= '.\\' unless $dirpath =~ /[\\\/]\z/;
+ }
+ elsif ($type eq "OS2") {
+ ($dirpath,$basename) = ($fullname =~ m#^((?:.*[:\\/])?)(.*)#s);
+ $dirpath = './' unless $dirpath; # Can't be 0
+ $dirpath .= '/' unless $dirpath =~ m#[\\/]\z#;
+ }
+ elsif ($type eq "MacOS") {
+ ($dirpath,$basename) = ($fullname =~ /^(.*:)?(.*)/s);
+ $dirpath = ':' unless $dirpath;
+ }
+ elsif ($type eq "AmigaOS") {
+ ($dirpath,$basename) = ($fullname =~ /(.*[:\/])?(.*)/s);
+ $dirpath = './' unless $dirpath;
+ }
+ elsif ($type eq 'VMS' ) {
+ ($dirpath,$basename) = ($fullname =~ /^(.*[:>\]])?(.*)/s);
+ $dirpath ||= ''; # should always be defined
+ }
+ else { # Default to Unix semantics.
+ ($dirpath,$basename) = ($fullname =~ m{^(.*/)?(.*)}s);
+ if ($orig_type eq 'VMS' and $fullname =~ m{^(/[^/]+/000000(/|$))(.*)}) {
+ # dev:[000000] is top of VMS tree, similar to Unix '/'
+ # so strip it off and treat the rest as "normal"
+ my $devspec = $1;
+ my $remainder = $3;
+ ($dirpath,$basename) = ($remainder =~ m{^(.*/)?(.*)}s);
+ $dirpath ||= ''; # should always be defined
+ $dirpath = $devspec.$dirpath;
+ }
+ $dirpath = './' unless $dirpath;
+ }
+
+
+ my $tail = '';
+ my $suffix = '';
+ if (@suffices) {
+ foreach $suffix (@suffices) {
+ my $pat = ($igncase ? '(?i)' : '') . "($suffix)\$";
+ if ($basename =~ s/$pat//s) {
+ $taint .= substr($suffix,0,0);
+ $tail = $1 . $tail;
+ }
+ }
+ }
+
+ # Ensure taint is propgated from the path to its pieces.
+ $tail .= $taint;
+ wantarray ? ($basename .= $taint, $dirpath .= $taint, $tail)
+ : ($basename .= $taint);
+}
+
+
+
+=item C<basename>
+X<basename> X<filename>
+
+ my $filename = basename($path);
+ my $filename = basename($path, @suffixes);
+
+This function is provided for compatibility with the Unix shell command
+C<basename(1)>. It does B<NOT> always return the file name portion of a
+path as you might expect. To be safe, if you want the file name portion of
+a path use C<fileparse()>.
+
+C<basename()> returns the last level of a filepath even if the last
+level is clearly directory. In effect, it is acting like C<pop()> for
+paths. This differs from C<fileparse()>'s behaviour.
+
+ # Both return "bar"
+ basename("/foo/bar");
+ basename("/foo/bar/");
+
+@suffixes work as in C<fileparse()> except all regex metacharacters are
+quoted.
+
+ # These two function calls are equivalent.
+ my $filename = basename("/foo/bar/baz.txt", ".txt");
+ my $filename = fileparse("/foo/bar/baz.txt", qr/\Q.txt\E/);
+
+Also note that in order to be compatible with the shell command,
+C<basename()> does not strip off a suffix if it is identical to the
+remaining characters in the filename.
+
+=cut
+
+
+sub basename {
+ my($path) = shift;
+
+ # From BSD basename(1)
+ # The basename utility deletes any prefix ending with the last slash `/'
+ # character present in string (after first stripping trailing slashes)
+ _strip_trailing_sep($path);
+
+ my($basename, $dirname, $suffix) = fileparse( $path, map("\Q$_\E",@_) );
+
+ # From BSD basename(1)
+ # The suffix is not stripped if it is identical to the remaining
+ # characters in string.
+ if( length $suffix and !length $basename ) {
+ $basename = $suffix;
+ }
+
+ # Ensure that basename '/' == '/'
+ if( !length $basename ) {
+ $basename = $dirname;
+ }
+
+ return $basename;
+}
+
+
+
+=item C<dirname>
+X<dirname>
+
+This function is provided for compatibility with the Unix shell
+command C<dirname(1)> and has inherited some of its quirks. In spite of
+its name it does B<NOT> always return the directory name as you might
+expect. To be safe, if you want the directory name of a path use
+C<fileparse()>.
+
+Only on VMS (where there is no ambiguity between the file and directory
+portions of a path) and AmigaOS (possibly due to an implementation quirk in
+this module) does C<dirname()> work like C<fileparse($path)>, returning just the
+$directories.
+
+ # On VMS and AmigaOS
+ my $directories = dirname($path);
+
+When using Unix or MSDOS syntax this emulates the C<dirname(1)> shell function
+which is subtly different from how C<fileparse()> works. It returns all but
+the last level of a file path even if the last level is clearly a directory.
+In effect, it is not returning the directory portion but simply the path one
+level up acting like C<chop()> for file paths.
+
+Also unlike C<fileparse()>, C<dirname()> does not include a trailing slash on
+its returned path.
+
+ # returns /foo/bar. fileparse() would return /foo/bar/
+ dirname("/foo/bar/baz");
+
+ # also returns /foo/bar despite the fact that baz is clearly a
+ # directory. fileparse() would return /foo/bar/baz/
+ dirname("/foo/bar/baz/");
+
+ # returns '.'. fileparse() would return 'foo/'
+ dirname("foo/");
+
+Under VMS, if there is no directory information in the $path, then the
+current default device and directory is used.
+
+=cut
+
+
+sub dirname {
+ my $path = shift;
+
+ my($type) = $Fileparse_fstype;
+
+ if( $type eq 'VMS' and $path =~ m{/} ) {
+ # Parse as Unix
+ local($File::Basename::Fileparse_fstype) = '';
+ return dirname($path);
+ }
+
+ my($basename, $dirname) = fileparse($path);
+
+ if ($type eq 'VMS') {
+ $dirname ||= $ENV{DEFAULT};
+ }
+ elsif ($type eq 'MacOS') {
+ if( !length($basename) && $dirname !~ /^[^:]+:\z/) {
+ _strip_trailing_sep($dirname);
+ ($basename,$dirname) = fileparse $dirname;
+ }
+ $dirname .= ":" unless $dirname =~ /:\z/;
+ }
+ elsif (grep { $type eq $_ } qw(MSDOS DOS MSWin32 OS2)) {
+ _strip_trailing_sep($dirname);
+ unless( length($basename) ) {
+ ($basename,$dirname) = fileparse $dirname;
+ _strip_trailing_sep($dirname);
+ }
+ }
+ elsif ($type eq 'AmigaOS') {
+ if ( $dirname =~ /:\z/) { return $dirname }
+ chop $dirname;
+ $dirname =~ s{[^:/]+\z}{} unless length($basename);
+ }
+ else {
+ _strip_trailing_sep($dirname);
+ unless( length($basename) ) {
+ ($basename,$dirname) = fileparse $dirname;
+ _strip_trailing_sep($dirname);
+ }
+ }
+
+ $dirname;
+}
+
+
+# Strip the trailing path separator.
+sub _strip_trailing_sep {
+ my $type = $Fileparse_fstype;
+
+ if ($type eq 'MacOS') {
+ $_[0] =~ s/([^:]):\z/$1/s;
+ }
+ elsif (grep { $type eq $_ } qw(MSDOS DOS MSWin32 OS2)) {
+ $_[0] =~ s/([^:])[\\\/]*\z/$1/;
+ }
+ else {
+ $_[0] =~ s{(.)/*\z}{$1}s;
+ }
+}
+
+
+=item C<fileparse_set_fstype>
+X<filesystem>
+
+ my $type = fileparse_set_fstype();
+ my $previous_type = fileparse_set_fstype($type);
+
+Normally File::Basename will assume a file path type native to your current
+operating system (ie. /foo/bar style on Unix, \foo\bar on Windows, etc...).
+With this function you can override that assumption.
+
+Valid $types are "MacOS", "VMS", "AmigaOS", "OS2", "RISCOS",
+"MSWin32", "DOS" (also "MSDOS" for backwards bug compatibility),
+"Epoc" and "Unix" (all case-insensitive). If an unrecognized $type is
+given "Unix" will be assumed.
+
+If you've selected VMS syntax, and the file specification you pass to
+one of these routines contains a "/", they assume you are using Unix
+emulation and apply the Unix syntax rules instead, for that function
+call only.
+
+=back
+
+=cut
+
+
+BEGIN {
+
+my @Ignore_Case = qw(MacOS VMS AmigaOS OS2 RISCOS MSWin32 MSDOS DOS Epoc);
+my @Types = (@Ignore_Case, qw(Unix));
+
+sub fileparse_set_fstype {
+ my $old = $Fileparse_fstype;
+
+ if (@_) {
+ my $new_type = shift;
+
+ $Fileparse_fstype = 'Unix'; # default
+ foreach my $type (@Types) {
+ $Fileparse_fstype = $type if $new_type =~ /^$type/i;
+ }
+
+ $Fileparse_igncase =
+ (grep $Fileparse_fstype eq $_, @Ignore_Case) ? 1 : 0;
+ }
+
+ return $old;
+}
+
+}
+
+
+1;
+
+
+=head1 SEE ALSO
+
+L<dirname(1)>, L<basename(1)>, L<File::Spec>
diff --git a/Master/tlpkg/tlperl.straw/lib/File/CheckTree.pm b/Master/tlpkg/tlperl.straw/lib/File/CheckTree.pm
new file mode 100755
index 00000000000..d7948f2385f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/CheckTree.pm
@@ -0,0 +1,238 @@
+package File::CheckTree;
+
+use 5.006;
+use Cwd;
+use Exporter;
+use File::Spec;
+use warnings;
+use strict;
+
+our $VERSION = '4.4';
+our @ISA = qw(Exporter);
+our @EXPORT = qw(validate);
+
+=head1 NAME
+
+File::CheckTree - run many filetest checks on a tree
+
+=head1 SYNOPSIS
+
+ use File::CheckTree;
+
+ $num_warnings = validate( q{
+ /vmunix -e || die
+ /boot -e || die
+ /bin cd
+ csh -ex
+ csh !-ug
+ sh -ex
+ sh !-ug
+ /usr -d || warn "What happened to $file?\n"
+ });
+
+=head1 DESCRIPTION
+
+The validate() routine takes a single multiline string consisting of
+directives, each containing a filename plus a file test to try on it.
+(The file test may also be a "cd", causing subsequent relative filenames
+to be interpreted relative to that directory.) After the file test
+you may put C<|| die> to make it a fatal error if the file test fails.
+The default is C<|| warn>. The file test may optionally have a "!' prepended
+to test for the opposite condition. If you do a cd and then list some
+relative filenames, you may want to indent them slightly for readability.
+If you supply your own die() or warn() message, you can use $file to
+interpolate the filename.
+
+Filetests may be bunched: "-rwx" tests for all of C<-r>, C<-w>, and C<-x>.
+Only the first failed test of the bunch will produce a warning.
+
+The routine returns the number of warnings issued.
+
+=head1 AUTHOR
+
+File::CheckTree was derived from lib/validate.pl which was
+written by Larry Wall.
+Revised by Paul Grassie <F<grassie@perl.com>> in 2002.
+
+=head1 HISTORY
+
+File::CheckTree used to not display fatal error messages.
+It used to count only those warnings produced by a generic C<|| warn>
+(and not those in which the user supplied the message). In addition,
+the validate() routine would leave the user program in whatever
+directory was last entered through the use of "cd" directives.
+These bugs were fixed during the development of perl 5.8.
+The first fixed version of File::CheckTree was 4.2.
+
+=cut
+
+my $Warnings;
+
+sub validate {
+ my ($starting_dir, $file, $test, $cwd, $oldwarnings);
+
+ $starting_dir = cwd;
+
+ $cwd = "";
+ $Warnings = 0;
+
+ foreach my $check (split /\n/, $_[0]) {
+ my ($testlist, @testlist);
+
+ # skip blanks/comments
+ next if $check =~ /^\s*#/ || $check =~ /^\s*$/;
+
+ # Todo:
+ # should probably check for invalid directives and die
+ # but earlier versions of File::CheckTree did not do this either
+
+ # split a line like "/foo -r || die"
+ # so that $file is "/foo", $test is "-r || die"
+ # (making special allowance for quoted filenames).
+ if ($check =~ m/^\s*"([^"]+)"\s+(.*?)\s*$/ or
+ $check =~ m/^\s*'([^']+)'\s+(.*?)\s*$/ or
+ $check =~ m/^\s*(\S+?)\s+(\S.*?)\s*$/)
+ {
+ ($file, $test) = ($1,$2);
+ }
+ else {
+ die "Malformed line: '$check'";
+ };
+
+ # change a $test like "!-ug || die" to "!-Z || die",
+ # capturing the bundled tests (e.g. "ug") in $2
+ if ($test =~ s/ ^ (!?-) (\w{2,}) \b /$1Z/x) {
+ $testlist = $2;
+ # split bundled tests, e.g. "ug" to 'u', 'g'
+ @testlist = split(//, $testlist);
+ }
+ else {
+ # put in placeholder Z for stand-alone test
+ @testlist = ('Z');
+ }
+
+ # will compare these two later to stop on 1st warning w/in a bundle
+ $oldwarnings = $Warnings;
+
+ foreach my $one (@testlist) {
+ # examples of $test: "!-Z || die" or "-w || warn"
+ my $this = $test;
+
+ # expand relative $file to full pathname if preceded by cd directive
+ $file = File::Spec->catfile($cwd, $file)
+ if $cwd && !File::Spec->file_name_is_absolute($file);
+
+ # put filename in after the test operator
+ $this =~ s/(-\w\b)/$1 "\$file"/g;
+
+ # change the "-Z" representing a bundle with the $one test
+ $this =~ s/-Z/-$one/;
+
+ # if it's a "cd" directive...
+ if ($this =~ /^cd\b/) {
+ # add "|| die ..."
+ $this .= ' || die "cannot cd to $file\n"';
+ # expand "cd" directive with directory name
+ $this =~ s/\bcd\b/chdir(\$cwd = '$file')/;
+ }
+ else {
+ # add "|| warn" as a default disposition
+ $this .= ' || warn' unless $this =~ /\|\|/;
+
+ # change a generic ".. || die" or ".. || warn"
+ # to call valmess instead of die/warn directly
+ # valmess will look up the error message from %Val_Message
+ $this =~ s/ ^ ( (\S+) \s+ \S+ ) \s* \|\| \s* (die|warn) \s* $
+ /$1 || valmess('$3', '$2', \$file)/x;
+ }
+
+ {
+ # count warnings, either from valmess or '-r || warn "my msg"'
+ # also, call any pre-existing signal handler for __WARN__
+ my $orig_sigwarn = $SIG{__WARN__};
+ local $SIG{__WARN__} = sub {
+ ++$Warnings;
+ if ( $orig_sigwarn ) {
+ $orig_sigwarn->(@_);
+ }
+ else {
+ warn "@_";
+ }
+ };
+
+ # do the test
+ eval $this;
+
+ # re-raise an exception caused by a "... || die" test
+ if (my $err = $@) {
+ # in case of any cd directives, return from whence we came
+ if ($starting_dir ne cwd) {
+ chdir($starting_dir) || die "$starting_dir: $!";
+ }
+ die $err;
+ }
+ }
+
+ # stop on 1st warning within a bundle of tests
+ last if $Warnings > $oldwarnings;
+ }
+ }
+
+ # in case of any cd directives, return from whence we came
+ if ($starting_dir ne cwd) {
+ chdir($starting_dir) || die "chdir $starting_dir: $!";
+ }
+
+ return $Warnings;
+}
+
+my %Val_Message = (
+ 'r' => "is not readable by uid $>.",
+ 'w' => "is not writable by uid $>.",
+ 'x' => "is not executable by uid $>.",
+ 'o' => "is not owned by uid $>.",
+ 'R' => "is not readable by you.",
+ 'W' => "is not writable by you.",
+ 'X' => "is not executable by you.",
+ 'O' => "is not owned by you.",
+ 'e' => "does not exist.",
+ 'z' => "does not have zero size.",
+ 's' => "does not have non-zero size.",
+ 'f' => "is not a plain file.",
+ 'd' => "is not a directory.",
+ 'l' => "is not a symbolic link.",
+ 'p' => "is not a named pipe (FIFO).",
+ 'S' => "is not a socket.",
+ 'b' => "is not a block special file.",
+ 'c' => "is not a character special file.",
+ 'u' => "does not have the setuid bit set.",
+ 'g' => "does not have the setgid bit set.",
+ 'k' => "does not have the sticky bit set.",
+ 'T' => "is not a text file.",
+ 'B' => "is not a binary file."
+);
+
+sub valmess {
+ my ($disposition, $test, $file) = @_;
+ my $ferror;
+
+ if ($test =~ / ^ (!?) -(\w) \s* $ /x) {
+ my ($neg, $ftype) = ($1, $2);
+
+ $ferror = "$file $Val_Message{$ftype}";
+
+ if ($neg eq '!') {
+ $ferror =~ s/ is not / should not be / ||
+ $ferror =~ s/ does not / should not / ||
+ $ferror =~ s/ not / /;
+ }
+ }
+ else {
+ $ferror = "Can't do $test $file.\n";
+ }
+
+ die "$ferror\n" if $disposition eq 'die';
+ warn "$ferror\n";
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Compare.pm b/Master/tlpkg/tlperl.straw/lib/File/Compare.pm
new file mode 100755
index 00000000000..05e1c41d211
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Compare.pm
@@ -0,0 +1,182 @@
+package File::Compare;
+
+use 5.006;
+use strict;
+use warnings;
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, $Too_Big);
+
+require Exporter;
+
+$VERSION = '1.1006';
+@ISA = qw(Exporter);
+@EXPORT = qw(compare);
+@EXPORT_OK = qw(cmp compare_text);
+
+$Too_Big = 1024 * 1024 * 2;
+
+sub croak {
+ require Carp;
+ goto &Carp::croak;
+}
+
+sub compare {
+ croak("Usage: compare( file1, file2 [, buffersize]) ")
+ unless(@_ == 2 || @_ == 3);
+
+ my ($from,$to,$size) = @_;
+ my $text_mode = defined($size) && (ref($size) eq 'CODE' || $size < 0);
+
+ my ($fromsize,$closefrom,$closeto);
+ local (*FROM, *TO);
+
+ croak("from undefined") unless (defined $from);
+ croak("to undefined") unless (defined $to);
+
+ if (ref($from) &&
+ (UNIVERSAL::isa($from,'GLOB') || UNIVERSAL::isa($from,'IO::Handle'))) {
+ *FROM = *$from;
+ } elsif (ref(\$from) eq 'GLOB') {
+ *FROM = $from;
+ } else {
+ open(FROM,"<",$from) or goto fail_open1;
+ unless ($text_mode) {
+ binmode FROM;
+ $fromsize = -s FROM;
+ }
+ $closefrom = 1;
+ }
+
+ if (ref($to) &&
+ (UNIVERSAL::isa($to,'GLOB') || UNIVERSAL::isa($to,'IO::Handle'))) {
+ *TO = *$to;
+ } elsif (ref(\$to) eq 'GLOB') {
+ *TO = $to;
+ } else {
+ open(TO,"<",$to) or goto fail_open2;
+ binmode TO unless $text_mode;
+ $closeto = 1;
+ }
+
+ if (!$text_mode && $closefrom && $closeto) {
+ # If both are opened files we know they differ if their size differ
+ goto fail_inner if $fromsize != -s TO;
+ }
+
+ if ($text_mode) {
+ local $/ = "\n";
+ my ($fline,$tline);
+ while (defined($fline = <FROM>)) {
+ goto fail_inner unless defined($tline = <TO>);
+ if (ref $size) {
+ # $size contains ref to comparison function
+ goto fail_inner if &$size($fline, $tline);
+ } else {
+ goto fail_inner if $fline ne $tline;
+ }
+ }
+ goto fail_inner if defined($tline = <TO>);
+ }
+ else {
+ unless (defined($size) && $size > 0) {
+ $size = $fromsize || -s TO || 0;
+ $size = 1024 if $size < 512;
+ $size = $Too_Big if $size > $Too_Big;
+ }
+
+ my ($fr,$tr,$fbuf,$tbuf);
+ $fbuf = $tbuf = '';
+ while(defined($fr = read(FROM,$fbuf,$size)) && $fr > 0) {
+ unless (defined($tr = read(TO,$tbuf,$fr)) && $tbuf eq $fbuf) {
+ goto fail_inner;
+ }
+ }
+ goto fail_inner if defined($tr = read(TO,$tbuf,$size)) && $tr > 0;
+ }
+
+ close(TO) || goto fail_open2 if $closeto;
+ close(FROM) || goto fail_open1 if $closefrom;
+
+ return 0;
+
+ # All of these contortions try to preserve error messages...
+ fail_inner:
+ close(TO) || goto fail_open2 if $closeto;
+ close(FROM) || goto fail_open1 if $closefrom;
+
+ return 1;
+
+ fail_open2:
+ if ($closefrom) {
+ my $status = $!;
+ $! = 0;
+ close FROM;
+ $! = $status unless $!;
+ }
+ fail_open1:
+ return -1;
+}
+
+sub cmp;
+*cmp = \&compare;
+
+sub compare_text {
+ my ($from,$to,$cmp) = @_;
+ croak("Usage: compare_text( file1, file2 [, cmp-function])")
+ unless @_ == 2 || @_ == 3;
+ croak("Third arg to compare_text() function must be a code reference")
+ if @_ == 3 && ref($cmp) ne 'CODE';
+
+ # Using a negative buffer size puts compare into text_mode too
+ $cmp = -1 unless defined $cmp;
+ compare($from, $to, $cmp);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+File::Compare - Compare files or filehandles
+
+=head1 SYNOPSIS
+
+ use File::Compare;
+
+ if (compare("file1","file2") == 0) {
+ print "They're equal\n";
+ }
+
+=head1 DESCRIPTION
+
+The File::Compare::compare function compares the contents of two
+sources, each of which can be a file or a file handle. It is exported
+from File::Compare by default.
+
+File::Compare::cmp is a synonym for File::Compare::compare. It is
+exported from File::Compare only by request.
+
+File::Compare::compare_text does a line by line comparison of the two
+files. It stops as soon as a difference is detected. compare_text()
+accepts an optional third argument: This must be a CODE reference to
+a line comparison function, which returns 0 when both lines are considered
+equal. For example:
+
+ compare_text($file1, $file2)
+
+is basically equivalent to
+
+ compare_text($file1, $file2, sub {$_[0] ne $_[1]} )
+
+=head1 RETURN
+
+File::Compare::compare and its sibling functions return 0 if the files
+are equal, 1 if the files are unequal, or -1 if an error was encountered.
+
+=head1 AUTHOR
+
+File::Compare was written by Nick Ing-Simmons.
+Its original documentation was written by Chip Salzenberg.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Copy.pm b/Master/tlpkg/tlperl.straw/lib/File/Copy.pm
new file mode 100755
index 00000000000..e1d77244b9b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Copy.pm
@@ -0,0 +1,533 @@
+# File/Copy.pm. Written in 1994 by Aaron Sherman <ajs@ajs.com>. This
+# source code has been placed in the public domain by the author.
+# Please be kind and preserve the documentation.
+#
+# Additions copyright 1996 by Charles Bailey. Permission is granted
+# to distribute the revised code under the same terms as Perl itself.
+
+package File::Copy;
+
+use 5.006;
+use strict;
+use warnings;
+use File::Spec;
+use Config;
+# During perl build, we need File::Copy but Fcntl might not be built yet
+# *** not needed for 2.14, only 2.15
+# *** my $Fcntl_loaded = eval q{ use Fcntl qw [O_CREAT O_WRONLY O_TRUNC]; 1 };
+# Similarly Scalar::Util
+# And then we need these games to avoid loading overload, as that will
+# confuse miniperl during the bootstrap of perl.
+my $Scalar_Util_loaded = eval q{ require Scalar::Util; require overload; 1 };
+our(@ISA, @EXPORT, @EXPORT_OK, $VERSION, $Too_Big, $Syscopy_is_copy);
+sub copy;
+sub syscopy;
+sub cp;
+sub mv;
+
+$VERSION = '2.14';
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(copy move);
+@EXPORT_OK = qw(cp mv);
+
+$Too_Big = 1024 * 1024 * 2;
+
+sub croak {
+ require Carp;
+ goto &Carp::croak;
+}
+
+sub carp {
+ require Carp;
+ goto &Carp::carp;
+}
+
+my $macfiles;
+if ($^O eq 'MacOS') {
+ $macfiles = eval { require Mac::MoreFiles };
+ warn 'Mac::MoreFiles could not be loaded; using non-native syscopy'
+ if $@ && $^W;
+}
+
+sub _catname {
+ my($from, $to) = @_;
+ if (not defined &basename) {
+ require File::Basename;
+ import File::Basename 'basename';
+ }
+
+ if ($^O eq 'MacOS') {
+ # a partial dir name that's valid only in the cwd (e.g. 'tmp')
+ $to = ':' . $to if $to !~ /:/;
+ }
+
+ return File::Spec->catfile($to, basename($from));
+}
+
+# _eq($from, $to) tells whether $from and $to are identical
+sub _eq {
+ my ($from, $to) = map {
+ $Scalar_Util_loaded && Scalar::Util::blessed($_)
+ && overload::Method($_, q{""})
+ ? "$_"
+ : $_
+ } (@_);
+ return '' if ( (ref $from) xor (ref $to) );
+ return $from == $to if ref $from;
+ return $from eq $to;
+}
+
+sub copy {
+ croak("Usage: copy(FROM, TO [, BUFFERSIZE]) ")
+ unless(@_ == 2 || @_ == 3);
+
+ my $from = shift;
+ my $to = shift;
+
+ my $size;
+ if (@_) {
+ $size = shift(@_) + 0;
+ croak("Bad buffer size for copy: $size\n") unless ($size > 0);
+ }
+
+ my $from_a_handle = (ref($from)
+ ? (ref($from) eq 'GLOB'
+ || UNIVERSAL::isa($from, 'GLOB')
+ || UNIVERSAL::isa($from, 'IO::Handle'))
+ : (ref(\$from) eq 'GLOB'));
+ my $to_a_handle = (ref($to)
+ ? (ref($to) eq 'GLOB'
+ || UNIVERSAL::isa($to, 'GLOB')
+ || UNIVERSAL::isa($to, 'IO::Handle'))
+ : (ref(\$to) eq 'GLOB'));
+
+ if (_eq($from, $to)) { # works for references, too
+ carp("'$from' and '$to' are identical (not copied)");
+ # The "copy" was a success as the source and destination contain
+ # the same data.
+ return 1;
+ }
+
+ if ((($Config{d_symlink} && $Config{d_readlink}) || $Config{d_link}) &&
+ !($^O eq 'MSWin32' || $^O eq 'os2')) {
+ my @fs = stat($from);
+ if (@fs) {
+ my @ts = stat($to);
+ if (@ts && $fs[0] == $ts[0] && $fs[1] == $ts[1]) {
+ carp("'$from' and '$to' are identical (not copied)");
+ return 0;
+ }
+ }
+ }
+
+ if (!$from_a_handle && !$to_a_handle && -d $to && ! -d $from) {
+ $to = _catname($from, $to);
+ }
+
+ if (defined &syscopy && !$Syscopy_is_copy
+ && !$to_a_handle
+ && !($from_a_handle && $^O eq 'os2' ) # OS/2 cannot handle handles
+ && !($from_a_handle && $^O eq 'mpeix') # and neither can MPE/iX.
+ && !($from_a_handle && $^O eq 'MSWin32')
+ && !($from_a_handle && $^O eq 'MacOS')
+ && !($from_a_handle && $^O eq 'NetWare')
+ )
+ {
+ my $copy_to = $to;
+
+ if ($^O eq 'VMS' && -e $from) {
+
+ if (! -d $to && ! -d $from) {
+
+ # VMS has sticky defaults on extensions, which means that
+ # if there is a null extension on the destination file, it
+ # will inherit the extension of the source file
+ # So add a '.' for a null extension.
+
+ $copy_to = VMS::Filespec::vmsify($to);
+ my ($vol, $dirs, $file) = File::Spec->splitpath($copy_to);
+ $file = $file . '.' unless ($file =~ /(?<!\^)\./);
+ $copy_to = File::Spec->catpath($vol, $dirs, $file);
+
+ # Get rid of the old versions to be like UNIX
+ 1 while unlink $copy_to;
+ }
+ }
+
+ return syscopy($from, $copy_to);
+ }
+
+ my $closefrom = 0;
+ my $closeto = 0;
+ my ($status, $r, $buf);
+ local($\) = '';
+
+ my $from_h;
+ if ($from_a_handle) {
+ $from_h = $from;
+ } else {
+ $from = _protect($from) if $from =~ /^\s/s;
+ $from_h = \do { local *FH };
+ open $from_h, "<", $from or goto fail_open1;
+ binmode $from_h or die "($!,$^E)";
+ $closefrom = 1;
+ }
+
+ # Seems most logical to do this here, in case future changes would want to
+ # make this croak for some reason.
+ unless (defined $size) {
+ $size = tied(*$from_h) ? 0 : -s $from_h || 0;
+ $size = 1024 if ($size < 512);
+ $size = $Too_Big if ($size > $Too_Big);
+ }
+
+ my $to_h;
+ if ($to_a_handle) {
+ $to_h = $to;
+ } else {
+ $to = _protect($to) if $to =~ /^\s/s;
+ $to_h = \do { local *FH };
+ open $to_h, ">", $to or goto fail_open2;
+ binmode $to_h or die "($!,$^E)";
+ $closeto = 1;
+ }
+
+ $! = 0;
+ for (;;) {
+ my ($r, $w, $t);
+ defined($r = sysread($from_h, $buf, $size))
+ or goto fail_inner;
+ last unless $r;
+ for ($w = 0; $w < $r; $w += $t) {
+ $t = syswrite($to_h, $buf, $r - $w, $w)
+ or goto fail_inner;
+ }
+ }
+
+ close($to_h) || goto fail_open2 if $closeto;
+ close($from_h) || goto fail_open1 if $closefrom;
+
+ # Use this idiom to avoid uninitialized value warning.
+ return 1;
+
+ # All of these contortions try to preserve error messages...
+ fail_inner:
+ if ($closeto) {
+ $status = $!;
+ $! = 0;
+ close $to_h;
+ $! = $status unless $!;
+ }
+ fail_open2:
+ if ($closefrom) {
+ $status = $!;
+ $! = 0;
+ close $from_h;
+ $! = $status unless $!;
+ }
+ fail_open1:
+ return 0;
+}
+
+sub move {
+ croak("Usage: move(FROM, TO) ") unless @_ == 2;
+
+ my($from,$to) = @_;
+
+ my($fromsz,$tosz1,$tomt1,$tosz2,$tomt2,$sts,$ossts);
+
+ if (-d $to && ! -d $from) {
+ $to = _catname($from, $to);
+ }
+
+ ($tosz1,$tomt1) = (stat($to))[7,9];
+ $fromsz = -s $from;
+ if ($^O eq 'os2' and defined $tosz1 and defined $fromsz) {
+ # will not rename with overwrite
+ unlink $to;
+ }
+
+ my $rename_to = $to;
+ if (-$^O eq 'VMS' && -e $from) {
+
+ if (! -d $to && ! -d $from) {
+ # VMS has sticky defaults on extensions, which means that
+ # if there is a null extension on the destination file, it
+ # will inherit the extension of the source file
+ # So add a '.' for a null extension.
+
+ $rename_to = VMS::Filespec::vmsify($to);
+ my ($vol, $dirs, $file) = File::Spec->splitpath($rename_to);
+ $file = $file . '.' unless ($file =~ /(?<!\^)\./);
+ $rename_to = File::Spec->catpath($vol, $dirs, $file);
+
+ # Get rid of the old versions to be like UNIX
+ 1 while unlink $rename_to;
+ }
+ }
+
+ return 1 if rename $from, $rename_to;
+
+ # Did rename return an error even though it succeeded, because $to
+ # is on a remote NFS file system, and NFS lost the server's ack?
+ return 1 if defined($fromsz) && !-e $from && # $from disappeared
+ (($tosz2,$tomt2) = (stat($to))[7,9]) && # $to's there
+ ((!defined $tosz1) || # not before or
+ ($tosz1 != $tosz2 or $tomt1 != $tomt2)) && # was changed
+ $tosz2 == $fromsz; # it's all there
+
+ ($tosz1,$tomt1) = (stat($to))[7,9]; # just in case rename did something
+
+ {
+ local $@;
+ eval {
+ local $SIG{__DIE__};
+ copy($from,$to) or die;
+ my($atime, $mtime) = (stat($from))[8,9];
+ utime($atime, $mtime, $to);
+ unlink($from) or die;
+ };
+ return 1 unless $@;
+ }
+ ($sts,$ossts) = ($! + 0, $^E + 0);
+
+ ($tosz2,$tomt2) = ((stat($to))[7,9],0,0) if defined $tomt1;
+ unlink($to) if !defined($tomt1) or $tomt1 != $tomt2 or $tosz1 != $tosz2;
+ ($!,$^E) = ($sts,$ossts);
+ return 0;
+}
+
+*cp = \&copy;
+*mv = \&move;
+
+
+if ($^O eq 'MacOS') {
+ *_protect = sub { MacPerl::MakeFSSpec($_[0]) };
+} else {
+ *_protect = sub { "./$_[0]" };
+}
+
+# &syscopy is an XSUB under OS/2
+unless (defined &syscopy) {
+ if ($^O eq 'VMS') {
+ *syscopy = \&rmscopy;
+ } elsif ($^O eq 'mpeix') {
+ *syscopy = sub {
+ return 0 unless @_ == 2;
+ # Use the MPE cp program in order to
+ # preserve MPE file attributes.
+ return system('/bin/cp', '-f', $_[0], $_[1]) == 0;
+ };
+ } elsif ($^O eq 'MSWin32' && defined &DynaLoader::boot_DynaLoader) {
+ # Win32::CopyFile() fill only work if we can load Win32.xs
+ *syscopy = sub {
+ return 0 unless @_ == 2;
+ return Win32::CopyFile(@_, 1);
+ };
+ } elsif ($macfiles) {
+ *syscopy = sub {
+ my($from, $to) = @_;
+ my($dir, $toname);
+
+ return 0 unless -e $from;
+
+ if ($to =~ /(.*:)([^:]+):?$/) {
+ ($dir, $toname) = ($1, $2);
+ } else {
+ ($dir, $toname) = (":", $to);
+ }
+
+ unlink($to);
+ Mac::MoreFiles::FSpFileCopy($from, $dir, $toname, 1);
+ };
+ } else {
+ $Syscopy_is_copy = 1;
+ *syscopy = \&copy;
+ }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+File::Copy - Copy files or filehandles
+
+=head1 SYNOPSIS
+
+ use File::Copy;
+
+ copy("file1","file2") or die "Copy failed: $!";
+ copy("Copy.pm",\*STDOUT);
+ move("/dev1/fileA","/dev2/fileB");
+
+ use File::Copy "cp";
+
+ $n = FileHandle->new("/a/file","r");
+ cp($n,"x");
+
+=head1 DESCRIPTION
+
+The File::Copy module provides two basic functions, C<copy> and
+C<move>, which are useful for getting the contents of a file from
+one place to another.
+
+=over 4
+
+=item copy
+X<copy> X<cp>
+
+The C<copy> function takes two
+parameters: a file to copy from and a file to copy to. Either
+argument may be a string, a FileHandle reference or a FileHandle
+glob. Obviously, if the first argument is a filehandle of some
+sort, it will be read from, and if it is a file I<name> it will
+be opened for reading. Likewise, the second argument will be
+written to (and created if need be). Trying to copy a file on top
+of itself is a fatal error.
+
+B<Note that passing in
+files as handles instead of names may lead to loss of information
+on some operating systems; it is recommended that you use file
+names whenever possible.> Files are opened in binary mode where
+applicable. To get a consistent behaviour when copying from a
+filehandle to a file, use C<binmode> on the filehandle.
+
+An optional third parameter can be used to specify the buffer
+size used for copying. This is the number of bytes from the
+first file, that will be held in memory at any given time, before
+being written to the second file. The default buffer size depends
+upon the file, but will generally be the whole file (up to 2MB), or
+1k for filehandles that do not reference files (eg. sockets).
+
+You may use the syntax C<use File::Copy "cp"> to get at the
+"cp" alias for this function. The syntax is I<exactly> the same.
+
+=item move
+X<move> X<mv> X<rename>
+
+The C<move> function also takes two parameters: the current name
+and the intended name of the file to be moved. If the destination
+already exists and is a directory, and the source is not a
+directory, then the source file will be renamed into the directory
+specified by the destination.
+
+If possible, move() will simply rename the file. Otherwise, it copies
+the file to the new location and deletes the original. If an error occurs
+during this copy-and-delete process, you may be left with a (possibly partial)
+copy of the file under the destination name.
+
+You may use the "mv" alias for this function in the same way that
+you may use the "cp" alias for C<copy>.
+
+=item syscopy
+X<syscopy>
+
+File::Copy also provides the C<syscopy> routine, which copies the
+file specified in the first parameter to the file specified in the
+second parameter, preserving OS-specific attributes and file
+structure. For Unix systems, this is equivalent to the simple
+C<copy> routine, which doesn't preserve OS-specific attributes. For
+VMS systems, this calls the C<rmscopy> routine (see below). For OS/2
+systems, this calls the C<syscopy> XSUB directly. For Win32 systems,
+this calls C<Win32::CopyFile>.
+
+On Mac OS (Classic), C<syscopy> calls C<Mac::MoreFiles::FSpFileCopy>,
+if available.
+
+B<Special behaviour if C<syscopy> is defined (OS/2, VMS and Win32)>:
+
+If both arguments to C<copy> are not file handles,
+then C<copy> will perform a "system copy" of
+the input file to a new output file, in order to preserve file
+attributes, indexed file structure, I<etc.> The buffer size
+parameter is ignored. If either argument to C<copy> is a
+handle to an opened file, then data is copied using Perl
+operators, and no effort is made to preserve file attributes
+or record structure.
+
+The system copy routine may also be called directly under VMS and OS/2
+as C<File::Copy::syscopy> (or under VMS as C<File::Copy::rmscopy>, which
+is the routine that does the actual work for syscopy).
+
+=item rmscopy($from,$to[,$date_flag])
+X<rmscopy>
+
+The first and second arguments may be strings, typeglobs, typeglob
+references, or objects inheriting from IO::Handle;
+they are used in all cases to obtain the
+I<filespec> of the input and output files, respectively. The
+name and type of the input file are used as defaults for the
+output file, if necessary.
+
+A new version of the output file is always created, which
+inherits the structure and RMS attributes of the input file,
+except for owner and protections (and possibly timestamps;
+see below). All data from the input file is copied to the
+output file; if either of the first two parameters to C<rmscopy>
+is a file handle, its position is unchanged. (Note that this
+means a file handle pointing to the output file will be
+associated with an old version of that file after C<rmscopy>
+returns, not the newly created version.)
+
+The third parameter is an integer flag, which tells C<rmscopy>
+how to handle timestamps. If it is E<lt> 0, none of the input file's
+timestamps are propagated to the output file. If it is E<gt> 0, then
+it is interpreted as a bitmask: if bit 0 (the LSB) is set, then
+timestamps other than the revision date are propagated; if bit 1
+is set, the revision date is propagated. If the third parameter
+to C<rmscopy> is 0, then it behaves much like the DCL COPY command:
+if the name or type of the output file was explicitly specified,
+then no timestamps are propagated, but if they were taken implicitly
+from the input filespec, then all timestamps other than the
+revision date are propagated. If this parameter is not supplied,
+it defaults to 0.
+
+Like C<copy>, C<rmscopy> returns 1 on success. If an error occurs,
+it sets C<$!>, deletes the output file, and returns 0.
+
+=back
+
+=head1 RETURN
+
+All functions return 1 on success, 0 on failure.
+$! will be set if an error was encountered.
+
+=head1 NOTES
+
+=over 4
+
+=item *
+
+On Mac OS (Classic), the path separator is ':', not '/', and the
+current directory is denoted as ':', not '.'. You should be careful
+about specifying relative pathnames. While a full path always begins
+with a volume name, a relative pathname should always begin with a
+':'. If specifying a volume name only, a trailing ':' is required.
+
+E.g.
+
+ copy("file1", "tmp"); # creates the file 'tmp' in the current directory
+ copy("file1", ":tmp:"); # creates :tmp:file1
+ copy("file1", ":tmp"); # same as above
+ copy("file1", "tmp"); # same as above, if 'tmp' is a directory (but don't do
+ # that, since it may cause confusion, see example #1)
+ copy("file1", "tmp:file1"); # error, since 'tmp:' is not a volume
+ copy("file1", ":tmp:file1"); # ok, partial path
+ copy("file1", "DataHD:"); # creates DataHD:file1
+
+ move("MacintoshHD:fileA", "DataHD:fileB"); # moves (doesn't copy) files from one
+ # volume to another
+
+=back
+
+=head1 AUTHOR
+
+File::Copy was written by Aaron Sherman I<E<lt>ajs@ajs.comE<gt>> in 1995,
+and updated by Charles Bailey I<E<lt>bailey@newman.upenn.eduE<gt>> in 1996.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/File/DosGlob.pm b/Master/tlpkg/tlperl.straw/lib/File/DosGlob.pm
new file mode 100755
index 00000000000..496a14c1379
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/DosGlob.pm
@@ -0,0 +1,571 @@
+#!perl -w
+
+# use strict fails
+#Can't use string ("main::glob") as a symbol ref while "strict refs" in use at /usr/lib/perl5/5.005/File/DosGlob.pm line 191.
+
+#
+# Documentation at the __END__
+#
+
+package File::DosGlob;
+
+our $VERSION = '1.01';
+use strict;
+use warnings;
+
+sub doglob {
+ my $cond = shift;
+ my @retval = ();
+ #print "doglob: ", join('|', @_), "\n";
+ OUTER:
+ for my $pat (@_) {
+ my @matched = ();
+ my @globdirs = ();
+ my $head = '.';
+ my $sepchr = '/';
+ my $tail;
+ next OUTER unless defined $pat and $pat ne '';
+ # if arg is within quotes strip em and do no globbing
+ if ($pat =~ /^"(.*)"\z/s) {
+ $pat = $1;
+ if ($cond eq 'd') { push(@retval, $pat) if -d $pat }
+ else { push(@retval, $pat) if -e $pat }
+ next OUTER;
+ }
+ # wildcards with a drive prefix such as h:*.pm must be changed
+ # to h:./*.pm to expand correctly
+ if ($pat =~ m|^([A-Za-z]:)[^/\\]|s) {
+ substr($pat,0,2) = $1 . "./";
+ }
+ if ($pat =~ m|^(.*)([\\/])([^\\/]*)\z|s) {
+ ($head, $sepchr, $tail) = ($1,$2,$3);
+ #print "div: |$head|$sepchr|$tail|\n";
+ push (@retval, $pat), next OUTER if $tail eq '';
+ if ($head =~ /[*?]/) {
+ @globdirs = doglob('d', $head);
+ push(@retval, doglob($cond, map {"$_$sepchr$tail"} @globdirs)),
+ next OUTER if @globdirs;
+ }
+ $head .= $sepchr if $head eq '' or $head =~ /^[A-Za-z]:\z/s;
+ $pat = $tail;
+ }
+ #
+ # If file component has no wildcards, we can avoid opendir
+ unless ($pat =~ /[*?]/) {
+ $head = '' if $head eq '.';
+ $head .= $sepchr unless $head eq '' or substr($head,-1) eq $sepchr;
+ $head .= $pat;
+ if ($cond eq 'd') { push(@retval,$head) if -d $head }
+ else { push(@retval,$head) if -e $head }
+ next OUTER;
+ }
+ opendir(D, $head) or next OUTER;
+ my @leaves = readdir D;
+ closedir D;
+ $head = '' if $head eq '.';
+ $head .= $sepchr unless $head eq '' or substr($head,-1) eq $sepchr;
+
+ # escape regex metachars but not glob chars
+ $pat =~ s:([].+^\-\${}[|]):\\$1:g;
+ # and convert DOS-style wildcards to regex
+ $pat =~ s/\*/.*/g;
+ $pat =~ s/\?/.?/g;
+
+ #print "regex: '$pat', head: '$head'\n";
+ my $matchsub = sub { $_[0] =~ m|^$pat\z|is };
+ INNER:
+ for my $e (@leaves) {
+ next INNER if $e eq '.' or $e eq '..';
+ next INNER if $cond eq 'd' and ! -d "$head$e";
+ push(@matched, "$head$e"), next INNER if &$matchsub($e);
+ #
+ # [DOS compatibility special case]
+ # Failed, add a trailing dot and try again, but only
+ # if name does not have a dot in it *and* pattern
+ # has a dot *and* name is shorter than 9 chars.
+ #
+ if (index($e,'.') == -1 and length($e) < 9
+ and index($pat,'\\.') != -1) {
+ push(@matched, "$head$e"), next INNER if &$matchsub("$e.");
+ }
+ }
+ push @retval, @matched if @matched;
+ }
+ return @retval;
+}
+
+
+#
+# Do DOS-like globbing on Mac OS
+#
+sub doglob_Mac {
+ my $cond = shift;
+ my @retval = ();
+
+ #print "doglob_Mac: ", join('|', @_), "\n";
+ OUTER:
+ for my $arg (@_) {
+ local $_ = $arg;
+ my @matched = ();
+ my @globdirs = ();
+ my $head = ':';
+ my $not_esc_head = $head;
+ my $sepchr = ':';
+ next OUTER unless defined $_ and $_ ne '';
+ # if arg is within quotes strip em and do no globbing
+ if (/^"(.*)"\z/s) {
+ $_ = $1;
+ # $_ may contain escaped metachars '\*', '\?' and '\'
+ my $not_esc_arg = $_;
+ $not_esc_arg =~ s/\\([*?\\])/$1/g;
+ if ($cond eq 'd') { push(@retval, $not_esc_arg) if -d $not_esc_arg }
+ else { push(@retval, $not_esc_arg) if -e $not_esc_arg }
+ next OUTER;
+ }
+
+ if (m|^(.*?)(:+)([^:]*)\z|s) { # note: $1 is not greedy
+ my $tail;
+ ($head, $sepchr, $tail) = ($1,$2,$3);
+ #print "div: |$head|$sepchr|$tail|\n";
+ push (@retval, $_), next OUTER if $tail eq '';
+ #
+ # $head may contain escaped metachars '\*' and '\?'
+
+ my $tmp_head = $head;
+ # if a '*' or '?' is preceded by an odd count of '\', temporary delete
+ # it (and its preceding backslashes), i.e. don't treat '\*' and '\?' as
+ # wildcards
+ $tmp_head =~ s/(\\*)([*?])/$2 x ((length($1) + 1) % 2)/eg;
+
+ if ($tmp_head =~ /[*?]/) { # if there are wildcards ...
+ @globdirs = doglob_Mac('d', $head);
+ push(@retval, doglob_Mac($cond, map {"$_$sepchr$tail"} @globdirs)),
+ next OUTER if @globdirs;
+ }
+
+ $head .= $sepchr;
+ $not_esc_head = $head;
+ # unescape $head for file operations
+ $not_esc_head =~ s/\\([*?\\])/$1/g;
+ $_ = $tail;
+ }
+ #
+ # If file component has no wildcards, we can avoid opendir
+
+ my $tmp_tail = $_;
+ # if a '*' or '?' is preceded by an odd count of '\', temporary delete
+ # it (and its preceding backslashes), i.e. don't treat '\*' and '\?' as
+ # wildcards
+ $tmp_tail =~ s/(\\*)([*?])/$2 x ((length($1) + 1) % 2)/eg;
+
+ unless ($tmp_tail =~ /[*?]/) { # if there are wildcards ...
+ $not_esc_head = $head = '' if $head eq ':';
+ my $not_esc_tail = $_;
+ # unescape $head and $tail for file operations
+ $not_esc_tail =~ s/\\([*?\\])/$1/g;
+ $head .= $_;
+ $not_esc_head .= $not_esc_tail;
+ if ($cond eq 'd') { push(@retval,$head) if -d $not_esc_head }
+ else { push(@retval,$head) if -e $not_esc_head }
+ next OUTER;
+ }
+ #print "opendir($not_esc_head)\n";
+ opendir(D, $not_esc_head) or next OUTER;
+ my @leaves = readdir D;
+ closedir D;
+
+ # escape regex metachars but not '\' and glob chars '*', '?'
+ $_ =~ s:([].+^\-\${}[|]):\\$1:g;
+ # and convert DOS-style wildcards to regex,
+ # but only if they are not escaped
+ $_ =~ s/(\\*)([*?])/$1 . ('.' x ((length($1) + 1) % 2)) . $2/eg;
+
+ #print "regex: '$_', head: '$head', unescaped head: '$not_esc_head'\n";
+ my $matchsub = eval 'sub { $_[0] =~ m|^' . $_ . '\\z|ios }';
+ warn($@), next OUTER if $@;
+ INNER:
+ for my $e (@leaves) {
+ next INNER if $e eq '.' or $e eq '..';
+ next INNER if $cond eq 'd' and ! -d "$not_esc_head$e";
+
+ if (&$matchsub($e)) {
+ my $leave = (($not_esc_head eq ':') && (-f "$not_esc_head$e")) ?
+ "$e" : "$not_esc_head$e";
+ #
+ # On Mac OS, the two glob metachars '*' and '?' and the escape
+ # char '\' are valid characters for file and directory names.
+ # We have to escape and treat them specially.
+ $leave =~ s|([*?\\])|\\$1|g;
+ push(@matched, $leave);
+ next INNER;
+ }
+ }
+ push @retval, @matched if @matched;
+ }
+ return @retval;
+}
+
+#
+# _expand_volume() will only be used on Mac OS (Classic):
+# Takes an array of original patterns as argument and returns an array of
+# possibly modified patterns. Each original pattern is processed like
+# that:
+# + If there's a volume name in the pattern, we push a separate pattern
+# for each mounted volume that matches (with '*', '?' and '\' escaped).
+# + If there's no volume name in the original pattern, it is pushed
+# unchanged.
+# Note that the returned array of patterns may be empty.
+#
+sub _expand_volume {
+
+ require MacPerl; # to be verbose
+
+ my @pat = @_;
+ my @new_pat = ();
+ my @FSSpec_Vols = MacPerl::Volumes();
+ my @mounted_volumes = ();
+
+ foreach my $spec_vol (@FSSpec_Vols) {
+ # push all mounted volumes into array
+ push @mounted_volumes, MacPerl::MakePath($spec_vol);
+ }
+ #print "mounted volumes: |@mounted_volumes|\n";
+
+ while (@pat) {
+ my $pat = shift @pat;
+ if ($pat =~ /^([^:]+:)(.*)\z/) { # match a volume name?
+ my $vol_pat = $1;
+ my $tail = $2;
+ #
+ # escape regex metachars but not '\' and glob chars '*', '?'
+ $vol_pat =~ s:([].+^\-\${}[|]):\\$1:g;
+ # and convert DOS-style wildcards to regex,
+ # but only if they are not escaped
+ $vol_pat =~ s/(\\*)([*?])/$1 . ('.' x ((length($1) + 1) % 2)) . $2/eg;
+ #print "volume regex: '$vol_pat' \n";
+
+ foreach my $volume (@mounted_volumes) {
+ if ($volume =~ m|^$vol_pat\z|ios) {
+ #
+ # On Mac OS, the two glob metachars '*' and '?' and the
+ # escape char '\' are valid characters for volume names.
+ # We have to escape and treat them specially.
+ $volume =~ s|([*?\\])|\\$1|g;
+ push @new_pat, $volume . $tail;
+ }
+ }
+ } else { # no volume name in pattern, push original pattern
+ push @new_pat, $pat;
+ }
+ }
+ return @new_pat;
+}
+
+
+#
+# _preprocess_pattern() will only be used on Mac OS (Classic):
+# Resolves any updirs in the pattern. Removes a single trailing colon
+# from the pattern, unless it's a volume name pattern like "*HD:"
+#
+sub _preprocess_pattern {
+ my @pat = @_;
+
+ foreach my $p (@pat) {
+ my $proceed;
+ # resolve any updirs, e.g. "*HD:t?p::a*" -> "*HD:a*"
+ do {
+ $proceed = ($p =~ s/^(.*):[^:]+::(.*?)\z/$1:$2/);
+ } while ($proceed);
+ # remove a single trailing colon, e.g. ":*:" -> ":*"
+ $p =~ s/:([^:]+):\z/:$1/;
+ }
+ return @pat;
+}
+
+
+#
+# _un_escape() will only be used on Mac OS (Classic):
+# Unescapes a list of arguments which may contain escaped
+# metachars '*', '?' and '\'.
+#
+sub _un_escape {
+ foreach (@_) {
+ s/\\([*?\\])/$1/g;
+ }
+ return @_;
+}
+
+#
+# this can be used to override CORE::glob in a specific
+# package by saying C<use File::DosGlob 'glob';> in that
+# namespace.
+#
+
+# context (keyed by second cxix arg provided by core)
+my %iter;
+my %entries;
+
+sub glob {
+ my($pat,$cxix) = @_;
+ my @pat;
+
+ # glob without args defaults to $_
+ $pat = $_ unless defined $pat;
+
+ # extract patterns
+ if ($pat =~ /\s/) {
+ require Text::ParseWords;
+ @pat = Text::ParseWords::parse_line('\s+',0,$pat);
+ }
+ else {
+ push @pat, $pat;
+ }
+
+ # Mike Mestnik: made to do abc{1,2,3} == abc1 abc2 abc3.
+ # abc3 will be the original {3} (and drop the {}).
+ # abc1 abc2 will be put in @appendpat.
+ # This was just the esiest way, not nearly the best.
+ REHASH: {
+ my @appendpat = ();
+ for (@pat) {
+ # There must be a "," I.E. abc{efg} is not what we want.
+ while ( /^(.*)(?<!\\)\{(.*?)(?<!\\)\,.*?(?<!\\)\}(.*)$/ ) {
+ my ($start, $match, $end) = ($1, $2, $3);
+ #print "Got: \n\t$start\n\t$match\n\t$end\n";
+ my $tmp = "$start$match$end";
+ while ( $tmp =~ s/^(.*?)(?<!\\)\{(?:.*(?<!\\)\,)?(.*\Q$match\E.*?)(?:(?<!\\)\,.*)?(?<!\\)\}(.*)$/$1$2$3/ ) {
+ #print "Striped: $tmp\n";
+ # these expanshions will be preformed by the original,
+ # when we call REHASH.
+ }
+ push @appendpat, ("$tmp");
+ s/^\Q$start\E(?<!\\)\{\Q$match\E(?<!\\)\,/$start\{/;
+ if ( /^\Q$start\E(?<!\\)\{(?!.*?(?<!\\)\,.*?\Q$end\E$)(.*)(?<!\\)\}\Q$end\E$/ ) {
+ $match = $1;
+ #print "GOT: \n\t$start\n\t$match\n\t$end\n\n";
+ $_ = "$start$match$end";
+ }
+ }
+ #print "Sould have "GOT" vs "Got"!\n";
+ #FIXME: There should be checking for this.
+ # How or what should be done about failure is beond me.
+ }
+ if ( $#appendpat != -1
+ ) {
+ #print "LOOP\n";
+ #FIXME: Max loop, no way! :")
+ for ( @appendpat ) {
+ push @pat, $_;
+ }
+ goto REHASH;
+ }
+ }
+ for ( @pat ) {
+ s/\\{/{/g;
+ s/\\}/}/g;
+ s/\\,/,/g;
+ }
+ #print join ("\n", @pat). "\n";
+
+ # assume global context if not provided one
+ $cxix = '_G_' unless defined $cxix;
+ $iter{$cxix} = 0 unless exists $iter{$cxix};
+
+ # if we're just beginning, do it all first
+ if ($iter{$cxix} == 0) {
+ if ($^O eq 'MacOS') {
+ # first, take care of updirs and trailing colons
+ @pat = _preprocess_pattern(@pat);
+ # expand volume names
+ @pat = _expand_volume(@pat);
+ $entries{$cxix} = (@pat) ? [_un_escape( doglob_Mac(1,@pat) )] : [()];
+ } else {
+ $entries{$cxix} = [doglob(1,@pat)];
+ }
+ }
+
+ # chuck it all out, quick or slow
+ if (wantarray) {
+ delete $iter{$cxix};
+ return @{delete $entries{$cxix}};
+ }
+ else {
+ if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
+ return shift @{$entries{$cxix}};
+ }
+ else {
+ # return undef for EOL
+ delete $iter{$cxix};
+ delete $entries{$cxix};
+ return undef;
+ }
+ }
+}
+
+{
+ no strict 'refs';
+
+ sub import {
+ my $pkg = shift;
+ return unless @_;
+ my $sym = shift;
+ my $callpkg = ($sym =~ s/^GLOBAL_//s ? 'CORE::GLOBAL' : caller(0));
+ *{$callpkg.'::'.$sym} = \&{$pkg.'::'.$sym} if $sym eq 'glob';
+ }
+}
+1;
+
+__END__
+
+=head1 NAME
+
+File::DosGlob - DOS like globbing and then some
+
+=head1 SYNOPSIS
+
+ require 5.004;
+
+ # override CORE::glob in current package
+ use File::DosGlob 'glob';
+
+ # override CORE::glob in ALL packages (use with extreme caution!)
+ use File::DosGlob 'GLOBAL_glob';
+
+ @perlfiles = glob "..\\pe?l/*.p?";
+ print <..\\pe?l/*.p?>;
+
+ # from the command line (overrides only in main::)
+ > perl -MFile::DosGlob=glob -e "print <../pe*/*p?>"
+
+=head1 DESCRIPTION
+
+A module that implements DOS-like globbing with a few enhancements.
+It is largely compatible with perlglob.exe (the M$ setargv.obj
+version) in all but one respect--it understands wildcards in
+directory components.
+
+For example, C<<..\\l*b\\file/*glob.p?>> will work as expected (in
+that it will find something like '..\lib\File/DosGlob.pm' alright).
+Note that all path components are case-insensitive, and that
+backslashes and forward slashes are both accepted, and preserved.
+You may have to double the backslashes if you are putting them in
+literally, due to double-quotish parsing of the pattern by perl.
+
+Spaces in the argument delimit distinct patterns, so
+C<glob('*.exe *.dll')> globs all filenames that end in C<.exe>
+or C<.dll>. If you want to put in literal spaces in the glob
+pattern, you can escape them with either double quotes, or backslashes.
+e.g. C<glob('c:/"Program Files"/*/*.dll')>, or
+C<glob('c:/Program\ Files/*/*.dll')>. The argument is tokenized using
+C<Text::ParseWords::parse_line()>, so see L<Text::ParseWords> for details
+of the quoting rules used.
+
+Extending it to csh patterns is left as an exercise to the reader.
+
+=head1 NOTES
+
+=over 4
+
+=item *
+
+Mac OS (Classic) users should note a few differences. The specification
+of pathnames in glob patterns adheres to the usual Mac OS conventions:
+The path separator is a colon ':', not a slash '/' or backslash '\'. A
+full path always begins with a volume name. A relative pathname on Mac
+OS must always begin with a ':', except when specifying a file or
+directory name in the current working directory, where the leading colon
+is optional. If specifying a volume name only, a trailing ':' is
+required. Due to these rules, a glob like E<lt>*:E<gt> will find all
+mounted volumes, while a glob like E<lt>*E<gt> or E<lt>:*E<gt> will find
+all files and directories in the current directory.
+
+Note that updirs in the glob pattern are resolved before the matching begins,
+i.e. a pattern like "*HD:t?p::a*" will be matched as "*HD:a*". Note also,
+that a single trailing ':' in the pattern is ignored (unless it's a volume
+name pattern like "*HD:"), i.e. a glob like <:*:> will find both directories
+I<and> files (and not, as one might expect, only directories).
+
+The metachars '*', '?' and the escape char '\' are valid characters in
+volume, directory and file names on Mac OS. Hence, if you want to match
+a '*', '?' or '\' literally, you have to escape these characters. Due to
+perl's quoting rules, things may get a bit complicated, when you want to
+match a string like '\*' literally, or when you want to match '\' literally,
+but treat the immediately following character '*' as metachar. So, here's a
+rule of thumb (applies to both single- and double-quoted strings): escape
+each '*' or '?' or '\' with a backslash, if you want to treat them literally,
+and then double each backslash and your are done. E.g.
+
+- Match '\*' literally
+
+ escape both '\' and '*' : '\\\*'
+ double the backslashes : '\\\\\\*'
+
+(Internally, the glob routine sees a '\\\*', which means that both '\' and
+'*' are escaped.)
+
+
+- Match '\' literally, treat '*' as metachar
+
+ escape '\' but not '*' : '\\*'
+ double the backslashes : '\\\\*'
+
+(Internally, the glob routine sees a '\\*', which means that '\' is escaped and
+'*' is not.)
+
+Note that you also have to quote literal spaces in the glob pattern, as described
+above.
+
+=back
+
+=head1 EXPORTS (by request only)
+
+glob()
+
+=head1 BUGS
+
+Should probably be built into the core, and needs to stop
+pandering to DOS habits. Needs a dose of optimizium too.
+
+=head1 AUTHOR
+
+Gurusamy Sarathy <gsar@activestate.com>
+
+=head1 HISTORY
+
+=over 4
+
+=item *
+
+Support for globally overriding glob() (GSAR 3-JUN-98)
+
+=item *
+
+Scalar context, independent iterator context fixes (GSAR 15-SEP-97)
+
+=item *
+
+A few dir-vs-file optimizations result in glob importation being
+10 times faster than using perlglob.exe, and using perlglob.bat is
+only twice as slow as perlglob.exe (GSAR 28-MAY-97)
+
+=item *
+
+Several cleanups prompted by lack of compatible perlglob.exe
+under Borland (GSAR 27-MAY-97)
+
+=item *
+
+Initial version (GSAR 20-FEB-97)
+
+=back
+
+=head1 SEE ALSO
+
+perl
+
+perlglob.bat
+
+Text::ParseWords
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Fetch.pm b/Master/tlpkg/tlperl.straw/lib/File/Fetch.pm
new file mode 100755
index 00000000000..4aabc29be55
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Fetch.pm
@@ -0,0 +1,1466 @@
+package File::Fetch;
+
+use strict;
+use FileHandle;
+use File::Temp;
+use File::Copy;
+use File::Spec;
+use File::Spec::Unix;
+use File::Basename qw[dirname];
+
+use Cwd qw[cwd];
+use Carp qw[carp];
+use IPC::Cmd qw[can_run run QUOTE];
+use File::Path qw[mkpath];
+use File::Temp qw[tempdir];
+use Params::Check qw[check];
+use Module::Load::Conditional qw[can_load];
+use Locale::Maketext::Simple Style => 'gettext';
+
+use vars qw[ $VERBOSE $PREFER_BIN $FROM_EMAIL $USER_AGENT
+ $BLACKLIST $METHOD_FAIL $VERSION $METHODS
+ $FTP_PASSIVE $TIMEOUT $DEBUG $WARN
+ ];
+
+$VERSION = '0.24';
+$VERSION = eval $VERSION; # avoid warnings with development releases
+$PREFER_BIN = 0; # XXX TODO implement
+$FROM_EMAIL = 'File-Fetch@example.com';
+$USER_AGENT = "File::Fetch/$VERSION";
+$BLACKLIST = [qw|ftp|];
+$METHOD_FAIL = { };
+$FTP_PASSIVE = 1;
+$TIMEOUT = 0;
+$DEBUG = 0;
+$WARN = 1;
+
+### methods available to fetch the file depending on the scheme
+$METHODS = {
+ http => [ qw|lwp wget curl lftp lynx iosock| ],
+ ftp => [ qw|lwp netftp wget curl lftp ncftp ftp| ],
+ file => [ qw|lwp lftp file| ],
+ rsync => [ qw|rsync| ]
+};
+
+### silly warnings ###
+local $Params::Check::VERBOSE = 1;
+local $Params::Check::VERBOSE = 1;
+local $Module::Load::Conditional::VERBOSE = 0;
+local $Module::Load::Conditional::VERBOSE = 0;
+
+### see what OS we are on, important for file:// uris ###
+use constant ON_WIN => ($^O eq 'MSWin32');
+use constant ON_VMS => ($^O eq 'VMS');
+use constant ON_UNIX => (!ON_WIN);
+use constant HAS_VOL => (ON_WIN);
+use constant HAS_SHARE => (ON_WIN);
+
+
+=pod
+
+=head1 NAME
+
+File::Fetch - A generic file fetching mechanism
+
+=head1 SYNOPSIS
+
+ use File::Fetch;
+
+ ### build a File::Fetch object ###
+ my $ff = File::Fetch->new(uri => 'http://some.where.com/dir/a.txt');
+
+ ### fetch the uri to cwd() ###
+ my $where = $ff->fetch() or die $ff->error;
+
+ ### fetch the uri to /tmp ###
+ my $where = $ff->fetch( to => '/tmp' );
+
+ ### parsed bits from the uri ###
+ $ff->uri;
+ $ff->scheme;
+ $ff->host;
+ $ff->path;
+ $ff->file;
+
+=head1 DESCRIPTION
+
+File::Fetch is a generic file fetching mechanism.
+
+It allows you to fetch any file pointed to by a C<ftp>, C<http>,
+C<file>, or C<rsync> uri by a number of different means.
+
+See the C<HOW IT WORKS> section further down for details.
+
+=head1 ACCESSORS
+
+A C<File::Fetch> object has the following accessors
+
+=over 4
+
+=item $ff->uri
+
+The uri you passed to the constructor
+
+=item $ff->scheme
+
+The scheme from the uri (like 'file', 'http', etc)
+
+=item $ff->host
+
+The hostname in the uri. Will be empty if host was originally
+'localhost' for a 'file://' url.
+
+=item $ff->vol
+
+On operating systems with the concept of a volume the second element
+of a file:// is considered to the be volume specification for the file.
+Thus on Win32 this routine returns the volume, on other operating
+systems this returns nothing.
+
+On Windows this value may be empty if the uri is to a network share, in
+which case the 'share' property will be defined. Additionally, volume
+specifications that use '|' as ':' will be converted on read to use ':'.
+
+On VMS, which has a volume concept, this field will be empty because VMS
+file specifications are converted to absolute UNIX format and the volume
+information is transparently included.
+
+=item $ff->share
+
+On systems with the concept of a network share (currently only Windows) returns
+the sharename from a file://// url. On other operating systems returns empty.
+
+=item $ff->path
+
+The path from the uri, will be at least a single '/'.
+
+=item $ff->file
+
+The name of the remote file. For the local file name, the
+result of $ff->output_file will be used.
+
+=cut
+
+
+##########################
+### Object & Accessors ###
+##########################
+
+{
+ ### template for autogenerated accessors ###
+ my $Tmpl = {
+ scheme => { default => 'http' },
+ host => { default => 'localhost' },
+ path => { default => '/' },
+ file => { required => 1 },
+ uri => { required => 1 },
+ vol => { default => '' }, # windows for file:// uris
+ share => { default => '' }, # windows for file:// uris
+ _error_msg => { no_override => 1 },
+ _error_msg_long => { no_override => 1 },
+ };
+
+ for my $method ( keys %$Tmpl ) {
+ no strict 'refs';
+ *$method = sub {
+ my $self = shift;
+ $self->{$method} = $_[0] if @_;
+ return $self->{$method};
+ }
+ }
+
+ sub _create {
+ my $class = shift;
+ my %hash = @_;
+
+ my $args = check( $Tmpl, \%hash ) or return;
+
+ bless $args, $class;
+
+ if( lc($args->scheme) ne 'file' and not $args->host ) {
+ return $class->_error(loc(
+ "Hostname required when fetching from '%1'",$args->scheme));
+ }
+
+ for (qw[path file]) {
+ unless( $args->$_() ) { # 5.5.x needs the ()
+ return $class->_error(loc("No '%1' specified",$_));
+ }
+ }
+
+ return $args;
+ }
+}
+
+=item $ff->output_file
+
+The name of the output file. This is the same as $ff->file,
+but any query parameters are stripped off. For example:
+
+ http://example.com/index.html?x=y
+
+would make the output file be C<index.html> rather than
+C<index.html?x=y>.
+
+=back
+
+=cut
+
+sub output_file {
+ my $self = shift;
+ my $file = $self->file;
+
+ $file =~ s/\?.*$//g;
+
+ return $file;
+}
+
+### XXX do this or just point to URI::Escape?
+# =head2 $esc_uri = $ff->escaped_uri
+#
+# =cut
+#
+# ### most of this is stolen straight from URI::escape
+# { ### Build a char->hex map
+# my %escapes = map { chr($_) => sprintf("%%%02X", $_) } 0..255;
+#
+# sub escaped_uri {
+# my $self = shift;
+# my $uri = $self->uri;
+#
+# ### Default unsafe characters. RFC 2732 ^(uric - reserved)
+# $uri =~ s/([^A-Za-z0-9\-_.!~*'()])/
+# $escapes{$1} || $self->_fail_hi($1)/ge;
+#
+# return $uri;
+# }
+#
+# sub _fail_hi {
+# my $self = shift;
+# my $char = shift;
+#
+# $self->_error(loc(
+# "Can't escape '%1', try using the '%2' module instead",
+# sprintf("\\x{%04X}", ord($char)), 'URI::Escape'
+# ));
+# }
+#
+# sub output_file {
+#
+# }
+#
+#
+# }
+
+=head1 METHODS
+
+=head2 $ff = File::Fetch->new( uri => 'http://some.where.com/dir/file.txt' );
+
+Parses the uri and creates a corresponding File::Fetch::Item object,
+that is ready to be C<fetch>ed and returns it.
+
+Returns false on failure.
+
+=cut
+
+sub new {
+ my $class = shift;
+ my %hash = @_;
+
+ my ($uri);
+ my $tmpl = {
+ uri => { required => 1, store => \$uri },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ ### parse the uri to usable parts ###
+ my $href = $class->_parse_uri( $uri ) or return;
+
+ ### make it into a FFI object ###
+ my $ff = $class->_create( %$href ) or return;
+
+
+ ### return the object ###
+ return $ff;
+}
+
+### parses an uri to a hash structure:
+###
+### $class->_parse_uri( 'ftp://ftp.cpan.org/pub/mirror/index.txt' )
+###
+### becomes:
+###
+### $href = {
+### scheme => 'ftp',
+### host => 'ftp.cpan.org',
+### path => '/pub/mirror',
+### file => 'index.html'
+### };
+###
+### In the case of file:// urls there maybe be additional fields
+###
+### For systems with volume specifications such as Win32 there will be
+### a volume specifier provided in the 'vol' field.
+###
+### 'vol' => 'volumename'
+###
+### For windows file shares there may be a 'share' key specified
+###
+### 'share' => 'sharename'
+###
+### Note that the rules of what a file:// url means vary by the operating system
+### of the host being addressed. Thus file:///d|/foo/bar.txt means the obvious
+### 'D:\foo\bar.txt' on windows, but on unix it means '/d|/foo/bar.txt' and
+### not '/foo/bar.txt'
+###
+### Similarly if the host interpreting the url is VMS then
+### file:///disk$user/my/notes/note12345.txt' means
+### 'DISK$USER:[MY.NOTES]NOTE123456.TXT' but will be returned the same as
+### if it is unix where it means /disk$user/my/notes/note12345.txt'.
+### Except for some cases in the File::Spec methods, Perl on VMS will generally
+### handle UNIX format file specifications.
+###
+### This means it is impossible to serve certain file:// urls on certain systems.
+###
+### Thus are the problems with a protocol-less specification. :-(
+###
+
+sub _parse_uri {
+ my $self = shift;
+ my $uri = shift or return;
+
+ my $href = { uri => $uri };
+
+ ### find the scheme ###
+ $uri =~ s|^(\w+)://||;
+ $href->{scheme} = $1;
+
+ ### See rfc 1738 section 3.10
+ ### http://www.faqs.org/rfcs/rfc1738.html
+ ### And wikipedia for more on windows file:// urls
+ ### http://en.wikipedia.org/wiki/File://
+ if( $href->{scheme} eq 'file' ) {
+
+ my @parts = split '/',$uri;
+
+ ### file://hostname/...
+ ### file://hostname/...
+ ### normalize file://localhost with file:///
+ $href->{host} = $parts[0] || '';
+
+ ### index in @parts where the path components begin;
+ my $index = 1;
+
+ ### file:////hostname/sharename/blah.txt
+ if ( HAS_SHARE and not length $parts[0] and not length $parts[1] ) {
+
+ $href->{host} = $parts[2] || ''; # avoid warnings
+ $href->{share} = $parts[3] || ''; # avoid warnings
+
+ $index = 4 # index after the share
+
+ ### file:///D|/blah.txt
+ ### file:///D:/blah.txt
+ } elsif (HAS_VOL) {
+
+ ### this code comes from dmq's patch, but:
+ ### XXX if volume is empty, wouldn't that be an error? --kane
+ ### if so, our file://localhost test needs to be fixed as wel
+ $href->{vol} = $parts[1] || '';
+
+ ### correct D| style colume descriptors
+ $href->{vol} =~ s/\A([A-Z])\|\z/$1:/i if ON_WIN;
+
+ $index = 2; # index after the volume
+ }
+
+ ### rebuild the path from the leftover parts;
+ $href->{path} = join '/', '', splice( @parts, $index, $#parts );
+
+ } else {
+ ### using anything but qw() in hash slices may produce warnings
+ ### in older perls :-(
+ @{$href}{ qw(host path) } = $uri =~ m|([^/]*)(/.*)$|s;
+ }
+
+ ### split the path into file + dir ###
+ { my @parts = File::Spec::Unix->splitpath( delete $href->{path} );
+ $href->{path} = $parts[1];
+ $href->{file} = $parts[2];
+ }
+
+ ### host will be empty if the target was 'localhost' and the
+ ### scheme was 'file'
+ $href->{host} = '' if ($href->{host} eq 'localhost') and
+ ($href->{scheme} eq 'file');
+
+ return $href;
+}
+
+=head2 $where = $ff->fetch( [to => /my/output/dir/ | \$scalar] )
+
+Fetches the file you requested and returns the full path to the file.
+
+By default it writes to C<cwd()>, but you can override that by specifying
+the C<to> argument:
+
+ ### file fetch to /tmp, full path to the file in $where
+ $where = $ff->fetch( to => '/tmp' );
+
+ ### file slurped into $scalar, full path to the file in $where
+ ### file is downloaded to a temp directory and cleaned up at exit time
+ $where = $ff->fetch( to => \$scalar );
+
+Returns the full path to the downloaded file on success, and false
+on failure.
+
+=cut
+
+sub fetch {
+ my $self = shift or return;
+ my %hash = @_;
+
+ my $target;
+ my $tmpl = {
+ to => { default => cwd(), store => \$target },
+ };
+
+ check( $tmpl, \%hash ) or return;
+
+ my ($to, $fh);
+ ### you want us to slurp the contents
+ if( ref $target and UNIVERSAL::isa( $target, 'SCALAR' ) ) {
+ $to = tempdir( 'FileFetch.XXXXXX', CLEANUP => 1 );
+
+ ### plain old fetch
+ } else {
+ $to = $target;
+
+ ### On VMS force to VMS format so File::Spec will work.
+ $to = VMS::Filespec::vmspath($to) if ON_VMS;
+
+ ### create the path if it doesn't exist yet ###
+ unless( -d $to ) {
+ eval { mkpath( $to ) };
+
+ return $self->_error(loc("Could not create path '%1'",$to)) if $@;
+ }
+ }
+
+ ### set passive ftp if required ###
+ local $ENV{FTP_PASSIVE} = $FTP_PASSIVE;
+
+ ### we dont use catfile on win32 because if we are using a cygwin tool
+ ### under cmd.exe they wont understand windows style separators.
+ my $out_to = ON_WIN ? $to.'/'.$self->output_file
+ : File::Spec->catfile( $to, $self->output_file );
+
+ for my $method ( @{ $METHODS->{$self->scheme} } ) {
+ my $sub = '_'.$method.'_fetch';
+
+ unless( __PACKAGE__->can($sub) ) {
+ $self->_error(loc("Cannot call method for '%1' -- WEIRD!",
+ $method));
+ next;
+ }
+
+ ### method is blacklisted ###
+ next if grep { lc $_ eq $method } @$BLACKLIST;
+
+ ### method is known to fail ###
+ next if $METHOD_FAIL->{$method};
+
+ ### there's serious issues with IPC::Run and quoting of command
+ ### line arguments. using quotes in the wrong place breaks things,
+ ### and in the case of say,
+ ### C:\cygwin\bin\wget.EXE --quiet --passive-ftp --output-document
+ ### "index.html" "http://www.cpan.org/index.html?q=1&y=2"
+ ### it doesn't matter how you quote, it always fails.
+ local $IPC::Cmd::USE_IPC_RUN = 0;
+
+ if( my $file = $self->$sub(
+ to => $out_to
+ )){
+
+ unless( -e $file && -s _ ) {
+ $self->_error(loc("'%1' said it fetched '%2', ".
+ "but it was not created",$method,$file));
+
+ ### mark the failure ###
+ $METHOD_FAIL->{$method} = 1;
+
+ next;
+
+ } else {
+
+ ### slurp mode?
+ if( ref $target and UNIVERSAL::isa( $target, 'SCALAR' ) ) {
+
+ ### open the file
+ open my $fh, $file or do {
+ $self->_error(
+ loc("Could not open '%1': %2", $file, $!));
+ return;
+ };
+
+ ### slurp
+ $$target = do { local $/; <$fh> };
+
+ }
+
+ my $abs = File::Spec->rel2abs( $file );
+ return $abs;
+
+ }
+ }
+ }
+
+
+ ### if we got here, we looped over all methods, but we weren't able
+ ### to fetch it.
+ return;
+}
+
+########################
+### _*_fetch methods ###
+########################
+
+### LWP fetching ###
+sub _lwp_fetch {
+ my $self = shift;
+ my %hash = @_;
+
+ my ($to);
+ my $tmpl = {
+ to => { required => 1, store => \$to }
+ };
+ check( $tmpl, \%hash ) or return;
+
+ ### modules required to download with lwp ###
+ my $use_list = {
+ LWP => '0.0',
+ 'LWP::UserAgent' => '0.0',
+ 'HTTP::Request' => '0.0',
+ 'HTTP::Status' => '0.0',
+ URI => '0.0',
+
+ };
+
+ if( can_load(modules => $use_list) ) {
+
+ ### setup the uri object
+ my $uri = URI->new( File::Spec::Unix->catfile(
+ $self->path, $self->file
+ ) );
+
+ ### special rules apply for file:// uris ###
+ $uri->scheme( $self->scheme );
+ $uri->host( $self->scheme eq 'file' ? '' : $self->host );
+ $uri->userinfo("anonymous:$FROM_EMAIL") if $self->scheme ne 'file';
+
+ ### set up the useragent object
+ my $ua = LWP::UserAgent->new();
+ $ua->timeout( $TIMEOUT ) if $TIMEOUT;
+ $ua->agent( $USER_AGENT );
+ $ua->from( $FROM_EMAIL );
+ $ua->env_proxy;
+
+ my $res = $ua->mirror($uri, $to) or return;
+
+ ### uptodate or fetched ok ###
+ if ( $res->code == 304 or $res->code == 200 ) {
+ return $to;
+
+ } else {
+ return $self->_error(loc("Fetch failed! HTTP response: %1 %2 [%3]",
+ $res->code, HTTP::Status::status_message($res->code),
+ $res->status_line));
+ }
+
+ } else {
+ $METHOD_FAIL->{'lwp'} = 1;
+ return;
+ }
+}
+
+### Simple IO::Socket::INET fetching ###
+sub _iosock_fetch {
+ my $self = shift;
+ my %hash = @_;
+
+ my ($to);
+ my $tmpl = {
+ to => { required => 1, store => \$to }
+ };
+ check( $tmpl, \%hash ) or return;
+
+ my $use_list = {
+ 'IO::Socket::INET' => '0.0',
+ 'IO::Select' => '0.0',
+ };
+
+ if( can_load(modules => $use_list) ) {
+ my $sock = IO::Socket::INET->new(
+ PeerHost => $self->host,
+ ( $self->host =~ /:/ ? () : ( PeerPort => 80 ) ),
+ );
+
+ unless ( $sock ) {
+ return $self->_error(loc("Could not open socket to '%1', '%2'",$self->host,$!));
+ }
+
+ my $fh = FileHandle->new;
+
+ # Check open()
+
+ unless ( $fh->open($to,'>') ) {
+ return $self->_error(loc(
+ "Could not open '%1' for writing: %2",$to,$!));
+ }
+
+ my $path = File::Spec::Unix->catfile( $self->path, $self->file );
+ my $req = "GET $path HTTP/1.0\x0d\x0aHost: " . $self->host . "\x0d\x0a\x0d\x0a";
+ $sock->send( $req );
+
+ my $select = IO::Select->new( $sock );
+
+ my $resp = '';
+ my $normal = 0;
+ while ( $select->can_read( $TIMEOUT || 60 ) ) {
+ my $ret = $sock->sysread( $resp, 4096, length($resp) );
+ if ( !defined $ret or $ret == 0 ) {
+ $select->remove( $sock );
+ $normal++;
+ }
+ }
+ close $sock;
+
+ unless ( $normal ) {
+ return $self->_error(loc("Socket timed out after '%1' seconds", ( $TIMEOUT || 60 )));
+ }
+
+ # Check the "response"
+ # Strip preceeding blank lines apparently they are allowed (RFC 2616 4.1)
+ $resp =~ s/^(\x0d?\x0a)+//;
+ # Check it is an HTTP response
+ unless ( $resp =~ m!^HTTP/(\d+)\.(\d+)!i ) {
+ return $self->_error(loc("Did not get a HTTP response from '%1'",$self->host));
+ }
+
+ # Check for OK
+ my ($code) = $resp =~ m!^HTTP/\d+\.\d+\s+(\d+)!i;
+ unless ( $code eq '200' ) {
+ return $self->_error(loc("Got a '%1' from '%2' expected '200'",$code,$self->host));
+ }
+
+ print $fh +($resp =~ m/\x0d\x0a\x0d\x0a(.*)$/s )[0];
+ close $fh;
+ return $to;
+
+ } else {
+ $METHOD_FAIL->{'iosock'} = 1;
+ return;
+ }
+}
+
+### Net::FTP fetching
+sub _netftp_fetch {
+ my $self = shift;
+ my %hash = @_;
+
+ my ($to);
+ my $tmpl = {
+ to => { required => 1, store => \$to }
+ };
+ check( $tmpl, \%hash ) or return;
+
+ ### required modules ###
+ my $use_list = { 'Net::FTP' => 0 };
+
+ if( can_load( modules => $use_list ) ) {
+
+ ### make connection ###
+ my $ftp;
+ my @options = ($self->host);
+ push(@options, Timeout => $TIMEOUT) if $TIMEOUT;
+ unless( $ftp = Net::FTP->new( @options ) ) {
+ return $self->_error(loc("Ftp creation failed: %1",$@));
+ }
+
+ ### login ###
+ unless( $ftp->login( anonymous => $FROM_EMAIL ) ) {
+ return $self->_error(loc("Could not login to '%1'",$self->host));
+ }
+
+ ### set binary mode, just in case ###
+ $ftp->binary;
+
+ ### create the remote path
+ ### remember remote paths are unix paths! [#11483]
+ my $remote = File::Spec::Unix->catfile( $self->path, $self->file );
+
+ ### fetch the file ###
+ my $target;
+ unless( $target = $ftp->get( $remote, $to ) ) {
+ return $self->_error(loc("Could not fetch '%1' from '%2'",
+ $remote, $self->host));
+ }
+
+ ### log out ###
+ $ftp->quit;
+
+ return $target;
+
+ } else {
+ $METHOD_FAIL->{'netftp'} = 1;
+ return;
+ }
+}
+
+### /bin/wget fetch ###
+sub _wget_fetch {
+ my $self = shift;
+ my %hash = @_;
+
+ my ($to);
+ my $tmpl = {
+ to => { required => 1, store => \$to }
+ };
+ check( $tmpl, \%hash ) or return;
+
+ ### see if we have a wget binary ###
+ if( my $wget = can_run('wget') ) {
+
+ ### no verboseness, thanks ###
+ my $cmd = [ $wget, '--quiet' ];
+
+ ### if a timeout is set, add it ###
+ push(@$cmd, '--timeout=' . $TIMEOUT) if $TIMEOUT;
+
+ ### run passive if specified ###
+ push @$cmd, '--passive-ftp' if $FTP_PASSIVE;
+
+ ### set the output document, add the uri ###
+ push @$cmd, '--output-document', $to, $self->uri;
+
+ ### with IPC::Cmd > 0.41, this is fixed in teh library,
+ ### and there's no need for special casing any more.
+ ### DO NOT quote things for IPC::Run, it breaks stuff.
+ # $IPC::Cmd::USE_IPC_RUN
+ # ? ($to, $self->uri)
+ # : (QUOTE. $to .QUOTE, QUOTE. $self->uri .QUOTE);
+
+ ### shell out ###
+ my $captured;
+ unless(run( command => $cmd,
+ buffer => \$captured,
+ verbose => $DEBUG
+ )) {
+ ### wget creates the output document always, even if the fetch
+ ### fails.. so unlink it in that case
+ 1 while unlink $to;
+
+ return $self->_error(loc( "Command failed: %1", $captured || '' ));
+ }
+
+ return $to;
+
+ } else {
+ $METHOD_FAIL->{'wget'} = 1;
+ return;
+ }
+}
+
+### /bin/lftp fetch ###
+sub _lftp_fetch {
+ my $self = shift;
+ my %hash = @_;
+
+ my ($to);
+ my $tmpl = {
+ to => { required => 1, store => \$to }
+ };
+ check( $tmpl, \%hash ) or return;
+
+ ### see if we have a wget binary ###
+ if( my $lftp = can_run('lftp') ) {
+
+ ### no verboseness, thanks ###
+ my $cmd = [ $lftp, '-f' ];
+
+ my $fh = File::Temp->new;
+
+ my $str;
+
+ ### if a timeout is set, add it ###
+ $str .= "set net:timeout $TIMEOUT;\n" if $TIMEOUT;
+
+ ### run passive if specified ###
+ $str .= "set ftp:passive-mode 1;\n" if $FTP_PASSIVE;
+
+ ### set the output document, add the uri ###
+ ### quote the URI, because lftp supports certain shell
+ ### expansions, most notably & for backgrounding.
+ ### ' quote does nto work, must be "
+ $str .= q[get ']. $self->uri .q[' -o ]. $to . $/;
+
+ if( $DEBUG ) {
+ my $pp_str = join ' ', split $/, $str;
+ print "# lftp command: $pp_str\n";
+ }
+
+ ### write straight to the file.
+ $fh->autoflush(1);
+ print $fh $str;
+
+ ### the command needs to be 1 string to be executed
+ push @$cmd, $fh->filename;
+
+ ### with IPC::Cmd > 0.41, this is fixed in teh library,
+ ### and there's no need for special casing any more.
+ ### DO NOT quote things for IPC::Run, it breaks stuff.
+ # $IPC::Cmd::USE_IPC_RUN
+ # ? ($to, $self->uri)
+ # : (QUOTE. $to .QUOTE, QUOTE. $self->uri .QUOTE);
+
+
+ ### shell out ###
+ my $captured;
+ unless(run( command => $cmd,
+ buffer => \$captured,
+ verbose => $DEBUG
+ )) {
+ ### wget creates the output document always, even if the fetch
+ ### fails.. so unlink it in that case
+ 1 while unlink $to;
+
+ return $self->_error(loc( "Command failed: %1", $captured || '' ));
+ }
+
+ return $to;
+
+ } else {
+ $METHOD_FAIL->{'lftp'} = 1;
+ return;
+ }
+}
+
+
+
+### /bin/ftp fetch ###
+sub _ftp_fetch {
+ my $self = shift;
+ my %hash = @_;
+
+ my ($to);
+ my $tmpl = {
+ to => { required => 1, store => \$to }
+ };
+ check( $tmpl, \%hash ) or return;
+
+ ### see if we have a ftp binary ###
+ if( my $ftp = can_run('ftp') ) {
+
+ my $fh = FileHandle->new;
+
+ local $SIG{CHLD} = 'IGNORE';
+
+ unless ($fh->open("|$ftp -n")) {
+ return $self->_error(loc("%1 creation failed: %2", $ftp, $!));
+ }
+
+ my @dialog = (
+ "lcd " . dirname($to),
+ "open " . $self->host,
+ "user anonymous $FROM_EMAIL",
+ "cd /",
+ "cd " . $self->path,
+ "binary",
+ "get " . $self->file . " " . $self->output_file,
+ "quit",
+ );
+
+ foreach (@dialog) { $fh->print($_, "\n") }
+ $fh->close or return;
+
+ return $to;
+ }
+}
+
+### lynx is stupid - it decompresses any .gz file it finds to be text
+### use /bin/lynx to fetch files
+sub _lynx_fetch {
+ my $self = shift;
+ my %hash = @_;
+
+ my ($to);
+ my $tmpl = {
+ to => { required => 1, store => \$to }
+ };
+ check( $tmpl, \%hash ) or return;
+
+ ### see if we have a lynx binary ###
+ if( my $lynx = can_run('lynx') ) {
+
+ unless( IPC::Cmd->can_capture_buffer ) {
+ $METHOD_FAIL->{'lynx'} = 1;
+
+ return $self->_error(loc(
+ "Can not capture buffers. Can not use '%1' to fetch files",
+ 'lynx' ));
+ }
+
+ ### check if the HTTP resource exists ###
+ if ($self->uri =~ /^https?:\/\//i) {
+ my $cmd = [
+ $lynx,
+ '-head',
+ '-source',
+ "-auth=anonymous:$FROM_EMAIL",
+ ];
+
+ push @$cmd, "-connect_timeout=$TIMEOUT" if $TIMEOUT;
+
+ push @$cmd, $self->uri;
+
+ ### shell out ###
+ my $head;
+ unless(run( command => $cmd,
+ buffer => \$head,
+ verbose => $DEBUG )
+ ) {
+ return $self->_error(loc("Command failed: %1", $head || ''));
+ }
+
+ unless($head =~ /^HTTP\/\d+\.\d+ 200\b/) {
+ return $self->_error(loc("Command failed: %1", $head || ''));
+ }
+ }
+
+ ### write to the output file ourselves, since lynx ass_u_mes to much
+ my $local = FileHandle->new(">$to")
+ or return $self->_error(loc(
+ "Could not open '%1' for writing: %2",$to,$!));
+
+ ### dump to stdout ###
+ my $cmd = [
+ $lynx,
+ '-source',
+ "-auth=anonymous:$FROM_EMAIL",
+ ];
+
+ push @$cmd, "-connect_timeout=$TIMEOUT" if $TIMEOUT;
+
+ ### DO NOT quote things for IPC::Run, it breaks stuff.
+ push @$cmd, $self->uri;
+
+ ### with IPC::Cmd > 0.41, this is fixed in teh library,
+ ### and there's no need for special casing any more.
+ ### DO NOT quote things for IPC::Run, it breaks stuff.
+ # $IPC::Cmd::USE_IPC_RUN
+ # ? $self->uri
+ # : QUOTE. $self->uri .QUOTE;
+
+
+ ### shell out ###
+ my $captured;
+ unless(run( command => $cmd,
+ buffer => \$captured,
+ verbose => $DEBUG )
+ ) {
+ return $self->_error(loc("Command failed: %1", $captured || ''));
+ }
+
+ ### print to local file ###
+ ### XXX on a 404 with a special error page, $captured will actually
+ ### hold the contents of that page, and make it *appear* like the
+ ### request was a success, when really it wasn't :(
+ ### there doesn't seem to be an option for lynx to change the exit
+ ### code based on a 4XX status or so.
+ ### the closest we can come is using --error_file and parsing that,
+ ### which is very unreliable ;(
+ $local->print( $captured );
+ $local->close or return;
+
+ return $to;
+
+ } else {
+ $METHOD_FAIL->{'lynx'} = 1;
+ return;
+ }
+}
+
+### use /bin/ncftp to fetch files
+sub _ncftp_fetch {
+ my $self = shift;
+ my %hash = @_;
+
+ my ($to);
+ my $tmpl = {
+ to => { required => 1, store => \$to }
+ };
+ check( $tmpl, \%hash ) or return;
+
+ ### we can only set passive mode in interactive sesssions, so bail out
+ ### if $FTP_PASSIVE is set
+ return if $FTP_PASSIVE;
+
+ ### see if we have a ncftp binary ###
+ if( my $ncftp = can_run('ncftp') ) {
+
+ my $cmd = [
+ $ncftp,
+ '-V', # do not be verbose
+ '-p', $FROM_EMAIL, # email as password
+ $self->host, # hostname
+ dirname($to), # local dir for the file
+ # remote path to the file
+ ### DO NOT quote things for IPC::Run, it breaks stuff.
+ $IPC::Cmd::USE_IPC_RUN
+ ? File::Spec::Unix->catdir( $self->path, $self->file )
+ : QUOTE. File::Spec::Unix->catdir(
+ $self->path, $self->file ) .QUOTE
+
+ ];
+
+ ### shell out ###
+ my $captured;
+ unless(run( command => $cmd,
+ buffer => \$captured,
+ verbose => $DEBUG )
+ ) {
+ return $self->_error(loc("Command failed: %1", $captured || ''));
+ }
+
+ return $to;
+
+ } else {
+ $METHOD_FAIL->{'ncftp'} = 1;
+ return;
+ }
+}
+
+### use /bin/curl to fetch files
+sub _curl_fetch {
+ my $self = shift;
+ my %hash = @_;
+
+ my ($to);
+ my $tmpl = {
+ to => { required => 1, store => \$to }
+ };
+ check( $tmpl, \%hash ) or return;
+
+ if (my $curl = can_run('curl')) {
+
+ ### these long opts are self explanatory - I like that -jmb
+ my $cmd = [ $curl, '-q' ];
+
+ push(@$cmd, '--connect-timeout', $TIMEOUT) if $TIMEOUT;
+
+ push(@$cmd, '--silent') unless $DEBUG;
+
+ ### curl does the right thing with passive, regardless ###
+ if ($self->scheme eq 'ftp') {
+ push(@$cmd, '--user', "anonymous:$FROM_EMAIL");
+ }
+
+ ### curl doesn't follow 302 (temporarily moved) etc automatically
+ ### so we add --location to enable that.
+ push @$cmd, '--fail', '--location', '--output', $to, $self->uri;
+
+ ### with IPC::Cmd > 0.41, this is fixed in teh library,
+ ### and there's no need for special casing any more.
+ ### DO NOT quote things for IPC::Run, it breaks stuff.
+ # $IPC::Cmd::USE_IPC_RUN
+ # ? ($to, $self->uri)
+ # : (QUOTE. $to .QUOTE, QUOTE. $self->uri .QUOTE);
+
+
+ my $captured;
+ unless(run( command => $cmd,
+ buffer => \$captured,
+ verbose => $DEBUG )
+ ) {
+
+ return $self->_error(loc("Command failed: %1", $captured || ''));
+ }
+
+ return $to;
+
+ } else {
+ $METHOD_FAIL->{'curl'} = 1;
+ return;
+ }
+}
+
+
+### use File::Copy for fetching file:// urls ###
+###
+### See section 3.10 of RFC 1738 (http://www.faqs.org/rfcs/rfc1738.html)
+### Also see wikipedia on file:// (http://en.wikipedia.org/wiki/File://)
+###
+
+sub _file_fetch {
+ my $self = shift;
+ my %hash = @_;
+
+ my ($to);
+ my $tmpl = {
+ to => { required => 1, store => \$to }
+ };
+ check( $tmpl, \%hash ) or return;
+
+
+
+ ### prefix a / on unix systems with a file uri, since it would
+ ### look somewhat like this:
+ ### file:///home/kane/file
+ ### wheras windows file uris for 'c:\some\dir\file' might look like:
+ ### file:///C:/some/dir/file
+ ### file:///C|/some/dir/file
+ ### or for a network share '\\host\share\some\dir\file':
+ ### file:////host/share/some/dir/file
+ ###
+ ### VMS file uri's for 'DISK$USER:[MY.NOTES]NOTE123456.TXT' might look like:
+ ### file://vms.host.edu/disk$user/my/notes/note12345.txt
+ ###
+
+ my $path = $self->path;
+ my $vol = $self->vol;
+ my $share = $self->share;
+
+ my $remote;
+ if (!$share and $self->host) {
+ return $self->_error(loc(
+ "Currently %1 cannot handle hosts in %2 urls",
+ 'File::Fetch', 'file://'
+ ));
+ }
+
+ if( $vol ) {
+ $path = File::Spec->catdir( split /\//, $path );
+ $remote = File::Spec->catpath( $vol, $path, $self->file);
+
+ } elsif( $share ) {
+ ### win32 specific, and a share name, so we wont bother with File::Spec
+ $path =~ s|/+|\\|g;
+ $remote = "\\\\".$self->host."\\$share\\$path";
+
+ } else {
+ ### File::Spec on VMS can not currently handle UNIX syntax.
+ my $file_class = ON_VMS
+ ? 'File::Spec::Unix'
+ : 'File::Spec';
+
+ $remote = $file_class->catfile( $path, $self->file );
+ }
+
+ ### File::Copy is littered with 'die' statements :( ###
+ my $rv = eval { File::Copy::copy( $remote, $to ) };
+
+ ### something went wrong ###
+ if( !$rv or $@ ) {
+ return $self->_error(loc("Could not copy '%1' to '%2': %3 %4",
+ $remote, $to, $!, $@));
+ }
+
+ return $to;
+}
+
+### use /usr/bin/rsync to fetch files
+sub _rsync_fetch {
+ my $self = shift;
+ my %hash = @_;
+
+ my ($to);
+ my $tmpl = {
+ to => { required => 1, store => \$to }
+ };
+ check( $tmpl, \%hash ) or return;
+
+ if (my $rsync = can_run('rsync')) {
+
+ my $cmd = [ $rsync ];
+
+ ### XXX: rsync has no I/O timeouts at all, by default
+ push(@$cmd, '--timeout=' . $TIMEOUT) if $TIMEOUT;
+
+ push(@$cmd, '--quiet') unless $DEBUG;
+
+ ### DO NOT quote things for IPC::Run, it breaks stuff.
+ push @$cmd, $self->uri, $to;
+
+ ### with IPC::Cmd > 0.41, this is fixed in teh library,
+ ### and there's no need for special casing any more.
+ ### DO NOT quote things for IPC::Run, it breaks stuff.
+ # $IPC::Cmd::USE_IPC_RUN
+ # ? ($to, $self->uri)
+ # : (QUOTE. $to .QUOTE, QUOTE. $self->uri .QUOTE);
+
+ my $captured;
+ unless(run( command => $cmd,
+ buffer => \$captured,
+ verbose => $DEBUG )
+ ) {
+
+ return $self->_error(loc("Command %1 failed: %2",
+ "@$cmd" || '', $captured || ''));
+ }
+
+ return $to;
+
+ } else {
+ $METHOD_FAIL->{'rsync'} = 1;
+ return;
+ }
+}
+
+#################################
+#
+# Error code
+#
+#################################
+
+=pod
+
+=head2 $ff->error([BOOL])
+
+Returns the last encountered error as string.
+Pass it a true value to get the C<Carp::longmess()> output instead.
+
+=cut
+
+### error handling the way Archive::Extract does it
+sub _error {
+ my $self = shift;
+ my $error = shift;
+
+ $self->_error_msg( $error );
+ $self->_error_msg_long( Carp::longmess($error) );
+
+ if( $WARN ) {
+ carp $DEBUG ? $self->_error_msg_long : $self->_error_msg;
+ }
+
+ return;
+}
+
+sub error {
+ my $self = shift;
+ return shift() ? $self->_error_msg_long : $self->_error_msg;
+}
+
+
+1;
+
+=pod
+
+=head1 HOW IT WORKS
+
+File::Fetch is able to fetch a variety of uris, by using several
+external programs and modules.
+
+Below is a mapping of what utilities will be used in what order
+for what schemes, if available:
+
+ file => LWP, lftp, file
+ http => LWP, wget, curl, lftp, lynx, iosock
+ ftp => LWP, Net::FTP, wget, curl, lftp, ncftp, ftp
+ rsync => rsync
+
+If you'd like to disable the use of one or more of these utilities
+and/or modules, see the C<$BLACKLIST> variable further down.
+
+If a utility or module isn't available, it will be marked in a cache
+(see the C<$METHOD_FAIL> variable further down), so it will not be
+tried again. The C<fetch> method will only fail when all options are
+exhausted, and it was not able to retrieve the file.
+
+C<iosock> is a very limited L<IO::Socket::INET> based mechanism for
+retrieving C<http> schemed urls. It doesn't follow redirects for instance.
+
+A special note about fetching files from an ftp uri:
+
+By default, all ftp connections are done in passive mode. To change
+that, see the C<$FTP_PASSIVE> variable further down.
+
+Furthermore, ftp uris only support anonymous connections, so no
+named user/password pair can be passed along.
+
+C</bin/ftp> is blacklisted by default; see the C<$BLACKLIST> variable
+further down.
+
+=head1 GLOBAL VARIABLES
+
+The behaviour of File::Fetch can be altered by changing the following
+global variables:
+
+=head2 $File::Fetch::FROM_EMAIL
+
+This is the email address that will be sent as your anonymous ftp
+password.
+
+Default is C<File-Fetch@example.com>.
+
+=head2 $File::Fetch::USER_AGENT
+
+This is the useragent as C<LWP> will report it.
+
+Default is C<File::Fetch/$VERSION>.
+
+=head2 $File::Fetch::FTP_PASSIVE
+
+This variable controls whether the environment variable C<FTP_PASSIVE>
+and any passive switches to commandline tools will be set to true.
+
+Default value is 1.
+
+Note: When $FTP_PASSIVE is true, C<ncftp> will not be used to fetch
+files, since passive mode can only be set interactively for this binary
+
+=head2 $File::Fetch::TIMEOUT
+
+When set, controls the network timeout (counted in seconds).
+
+Default value is 0.
+
+=head2 $File::Fetch::WARN
+
+This variable controls whether errors encountered internally by
+C<File::Fetch> should be C<carp>'d or not.
+
+Set to false to silence warnings. Inspect the output of the C<error()>
+method manually to see what went wrong.
+
+Defaults to C<true>.
+
+=head2 $File::Fetch::DEBUG
+
+This enables debugging output when calling commandline utilities to
+fetch files.
+This also enables C<Carp::longmess> errors, instead of the regular
+C<carp> errors.
+
+Good for tracking down why things don't work with your particular
+setup.
+
+Default is 0.
+
+=head2 $File::Fetch::BLACKLIST
+
+This is an array ref holding blacklisted modules/utilities for fetching
+files with.
+
+To disallow the use of, for example, C<LWP> and C<Net::FTP>, you could
+set $File::Fetch::BLACKLIST to:
+
+ $File::Fetch::BLACKLIST = [qw|lwp netftp|]
+
+The default blacklist is [qw|ftp|], as C</bin/ftp> is rather unreliable.
+
+See the note on C<MAPPING> below.
+
+=head2 $File::Fetch::METHOD_FAIL
+
+This is a hashref registering what modules/utilities were known to fail
+for fetching files (mostly because they weren't installed).
+
+You can reset this cache by assigning an empty hashref to it, or
+individually remove keys.
+
+See the note on C<MAPPING> below.
+
+=head1 MAPPING
+
+
+Here's a quick mapping for the utilities/modules, and their names for
+the $BLACKLIST, $METHOD_FAIL and other internal functions.
+
+ LWP => lwp
+ Net::FTP => netftp
+ wget => wget
+ lynx => lynx
+ ncftp => ncftp
+ ftp => ftp
+ curl => curl
+ rsync => rsync
+ lftp => lftp
+ IO::Socket => iosock
+
+=head1 FREQUENTLY ASKED QUESTIONS
+
+=head2 So how do I use a proxy with File::Fetch?
+
+C<File::Fetch> currently only supports proxies with LWP::UserAgent.
+You will need to set your environment variables accordingly. For
+example, to use an ftp proxy:
+
+ $ENV{ftp_proxy} = 'foo.com';
+
+Refer to the LWP::UserAgent manpage for more details.
+
+=head2 I used 'lynx' to fetch a file, but its contents is all wrong!
+
+C<lynx> can only fetch remote files by dumping its contents to C<STDOUT>,
+which we in turn capture. If that content is a 'custom' error file
+(like, say, a C<404 handler>), you will get that contents instead.
+
+Sadly, C<lynx> doesn't support any options to return a different exit
+code on non-C<200 OK> status, giving us no way to tell the difference
+between a 'successfull' fetch and a custom error page.
+
+Therefor, we recommend to only use C<lynx> as a last resort. This is
+why it is at the back of our list of methods to try as well.
+
+=head2 Files I'm trying to fetch have reserved characters or non-ASCII characters in them. What do I do?
+
+C<File::Fetch> is relatively smart about things. When trying to write
+a file to disk, it removes the C<query parameters> (see the
+C<output_file> method for details) from the file name before creating
+it. In most cases this suffices.
+
+If you have any other characters you need to escape, please install
+the C<URI::Escape> module from CPAN, and pre-encode your URI before
+passing it to C<File::Fetch>. You can read about the details of URIs
+and URI encoding here:
+
+ http://www.faqs.org/rfcs/rfc2396.html
+
+=head1 TODO
+
+=over 4
+
+=item Implement $PREFER_BIN
+
+To indicate to rather use commandline tools than modules
+
+=back
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-file-fetch@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
+
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Find.pm b/Master/tlpkg/tlperl.straw/lib/File/Find.pm
new file mode 100755
index 00000000000..eddedbd354a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Find.pm
@@ -0,0 +1,1349 @@
+package File::Find;
+use 5.006;
+use strict;
+use warnings;
+use warnings::register;
+our $VERSION = '1.14';
+require Exporter;
+require Cwd;
+
+#
+# Modified to ensure sub-directory traversal order is not inverded by stack
+# push and pops. That is remains in the same order as in the directory file,
+# or user pre-processing (EG:sorted).
+#
+
+=head1 NAME
+
+File::Find - Traverse a directory tree.
+
+=head1 SYNOPSIS
+
+ use File::Find;
+ find(\&wanted, @directories_to_search);
+ sub wanted { ... }
+
+ use File::Find;
+ finddepth(\&wanted, @directories_to_search);
+ sub wanted { ... }
+
+ use File::Find;
+ find({ wanted => \&process, follow => 1 }, '.');
+
+=head1 DESCRIPTION
+
+These are functions for searching through directory trees doing work
+on each file found similar to the Unix I<find> command. File::Find
+exports two functions, C<find> and C<finddepth>. They work similarly
+but have subtle differences.
+
+=over 4
+
+=item B<find>
+
+ find(\&wanted, @directories);
+ find(\%options, @directories);
+
+C<find()> does a depth-first search over the given C<@directories> in
+the order they are given. For each file or directory found, it calls
+the C<&wanted> subroutine. (See below for details on how to use the
+C<&wanted> function). Additionally, for each directory found, it will
+C<chdir()> into that directory and continue the search, invoking the
+C<&wanted> function on each file or subdirectory in the directory.
+
+=item B<finddepth>
+
+ finddepth(\&wanted, @directories);
+ finddepth(\%options, @directories);
+
+C<finddepth()> works just like C<find()> except that it invokes the
+C<&wanted> function for a directory I<after> invoking it for the
+directory's contents. It does a postorder traversal instead of a
+preorder traversal, working from the bottom of the directory tree up
+where C<find()> works from the top of the tree down.
+
+=back
+
+=head2 %options
+
+The first argument to C<find()> is either a code reference to your
+C<&wanted> function, or a hash reference describing the operations
+to be performed for each file. The
+code reference is described in L<The wanted function> below.
+
+Here are the possible keys for the hash:
+
+=over 3
+
+=item C<wanted>
+
+The value should be a code reference. This code reference is
+described in L<The wanted function> below. The C<&wanted> subroutine is
+mandatory.
+
+=item C<bydepth>
+
+Reports the name of a directory only AFTER all its entries
+have been reported. Entry point C<finddepth()> is a shortcut for
+specifying C<< { bydepth => 1 } >> in the first argument of C<find()>.
+
+=item C<preprocess>
+
+The value should be a code reference. This code reference is used to
+preprocess the current directory. The name of the currently processed
+directory is in C<$File::Find::dir>. Your preprocessing function is
+called after C<readdir()>, but before the loop that calls the C<wanted()>
+function. It is called with a list of strings (actually file/directory
+names) and is expected to return a list of strings. The code can be
+used to sort the file/directory names alphabetically, numerically,
+or to filter out directory entries based on their name alone. When
+I<follow> or I<follow_fast> are in effect, C<preprocess> is a no-op.
+
+=item C<postprocess>
+
+The value should be a code reference. It is invoked just before leaving
+the currently processed directory. It is called in void context with no
+arguments. The name of the current directory is in C<$File::Find::dir>. This
+hook is handy for summarizing a directory, such as calculating its disk
+usage. When I<follow> or I<follow_fast> are in effect, C<postprocess> is a
+no-op.
+
+=item C<follow>
+
+Causes symbolic links to be followed. Since directory trees with symbolic
+links (followed) may contain files more than once and may even have
+cycles, a hash has to be built up with an entry for each file.
+This might be expensive both in space and time for a large
+directory tree. See I<follow_fast> and I<follow_skip> below.
+If either I<follow> or I<follow_fast> is in effect:
+
+=over 6
+
+=item *
+
+It is guaranteed that an I<lstat> has been called before the user's
+C<wanted()> function is called. This enables fast file checks involving S<_>.
+Note that this guarantee no longer holds if I<follow> or I<follow_fast>
+are not set.
+
+=item *
+
+There is a variable C<$File::Find::fullname> which holds the absolute
+pathname of the file with all symbolic links resolved. If the link is
+a dangling symbolic link, then fullname will be set to C<undef>.
+
+=back
+
+This is a no-op on Win32.
+
+=item C<follow_fast>
+
+This is similar to I<follow> except that it may report some files more
+than once. It does detect cycles, however. Since only symbolic links
+have to be hashed, this is much cheaper both in space and time. If
+processing a file more than once (by the user's C<wanted()> function)
+is worse than just taking time, the option I<follow> should be used.
+
+This is also a no-op on Win32.
+
+=item C<follow_skip>
+
+C<follow_skip==1>, which is the default, causes all files which are
+neither directories nor symbolic links to be ignored if they are about
+to be processed a second time. If a directory or a symbolic link
+are about to be processed a second time, File::Find dies.
+
+C<follow_skip==0> causes File::Find to die if any file is about to be
+processed a second time.
+
+C<follow_skip==2> causes File::Find to ignore any duplicate files and
+directories but to proceed normally otherwise.
+
+=item C<dangling_symlinks>
+
+If true and a code reference, will be called with the symbolic link
+name and the directory it lives in as arguments. Otherwise, if true
+and warnings are on, warning "symbolic_link_name is a dangling
+symbolic link\n" will be issued. If false, the dangling symbolic link
+will be silently ignored.
+
+=item C<no_chdir>
+
+Does not C<chdir()> to each directory as it recurses. The C<wanted()>
+function will need to be aware of this, of course. In this case,
+C<$_> will be the same as C<$File::Find::name>.
+
+=item C<untaint>
+
+If find is used in taint-mode (-T command line switch or if EUID != UID
+or if EGID != GID) then internally directory names have to be untainted
+before they can be chdir'ed to. Therefore they are checked against a regular
+expression I<untaint_pattern>. Note that all names passed to the user's
+I<wanted()> function are still tainted. If this option is used while
+not in taint-mode, C<untaint> is a no-op.
+
+=item C<untaint_pattern>
+
+See above. This should be set using the C<qr> quoting operator.
+The default is set to C<qr|^([-+@\w./]+)$|>.
+Note that the parentheses are vital.
+
+=item C<untaint_skip>
+
+If set, a directory which fails the I<untaint_pattern> is skipped,
+including all its sub-directories. The default is to 'die' in such a case.
+
+=back
+
+=head2 The wanted function
+
+The C<wanted()> function does whatever verifications you want on
+each file and directory. Note that despite its name, the C<wanted()>
+function is a generic callback function, and does B<not> tell
+File::Find if a file is "wanted" or not. In fact, its return value
+is ignored.
+
+The wanted function takes no arguments but rather does its work
+through a collection of variables.
+
+=over 4
+
+=item C<$File::Find::dir> is the current directory name,
+
+=item C<$_> is the current filename within that directory
+
+=item C<$File::Find::name> is the complete pathname to the file.
+
+=back
+
+The above variables have all been localized and may be changed without
+effecting data outside of the wanted function.
+
+For example, when examining the file F</some/path/foo.ext> you will have:
+
+ $File::Find::dir = /some/path/
+ $_ = foo.ext
+ $File::Find::name = /some/path/foo.ext
+
+You are chdir()'d to C<$File::Find::dir> when the function is called,
+unless C<no_chdir> was specified. Note that when changing to
+directories is in effect the root directory (F</>) is a somewhat
+special case inasmuch as the concatenation of C<$File::Find::dir>,
+C<'/'> and C<$_> is not literally equal to C<$File::Find::name>. The
+table below summarizes all variants:
+
+ $File::Find::name $File::Find::dir $_
+ default / / .
+ no_chdir=>0 /etc / etc
+ /etc/x /etc x
+
+ no_chdir=>1 / / /
+ /etc / /etc
+ /etc/x /etc /etc/x
+
+
+When C<follow> or C<follow_fast> are in effect, there is
+also a C<$File::Find::fullname>. The function may set
+C<$File::Find::prune> to prune the tree unless C<bydepth> was
+specified. Unless C<follow> or C<follow_fast> is specified, for
+compatibility reasons (find.pl, find2perl) there are in addition the
+following globals available: C<$File::Find::topdir>,
+C<$File::Find::topdev>, C<$File::Find::topino>,
+C<$File::Find::topmode> and C<$File::Find::topnlink>.
+
+This library is useful for the C<find2perl> tool, which when fed,
+
+ find2perl / -name .nfs\* -mtime +7 \
+ -exec rm -f {} \; -o -fstype nfs -prune
+
+produces something like:
+
+ sub wanted {
+ /^\.nfs.*\z/s &&
+ (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_)) &&
+ int(-M _) > 7 &&
+ unlink($_)
+ ||
+ ($nlink || (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_))) &&
+ $dev < 0 &&
+ ($File::Find::prune = 1);
+ }
+
+Notice the C<_> in the above C<int(-M _)>: the C<_> is a magical
+filehandle that caches the information from the preceding
+C<stat()>, C<lstat()>, or filetest.
+
+Here's another interesting wanted function. It will find all symbolic
+links that don't resolve:
+
+ sub wanted {
+ -l && !-e && print "bogus link: $File::Find::name\n";
+ }
+
+See also the script C<pfind> on CPAN for a nice application of this
+module.
+
+=head1 WARNINGS
+
+If you run your program with the C<-w> switch, or if you use the
+C<warnings> pragma, File::Find will report warnings for several weird
+situations. You can disable these warnings by putting the statement
+
+ no warnings 'File::Find';
+
+in the appropriate scope. See L<perllexwarn> for more info about lexical
+warnings.
+
+=head1 CAVEAT
+
+=over 2
+
+=item $dont_use_nlink
+
+You can set the variable C<$File::Find::dont_use_nlink> to 1, if you want to
+force File::Find to always stat directories. This was used for file systems
+that do not have an C<nlink> count matching the number of sub-directories.
+Examples are ISO-9660 (CD-ROM), AFS, HPFS (OS/2 file system), FAT (DOS file
+system) and a couple of others.
+
+You shouldn't need to set this variable, since File::Find should now detect
+such file systems on-the-fly and switch itself to using stat. This works even
+for parts of your file system, like a mounted CD-ROM.
+
+If you do set C<$File::Find::dont_use_nlink> to 1, you will notice slow-downs.
+
+=item symlinks
+
+Be aware that the option to follow symbolic links can be dangerous.
+Depending on the structure of the directory tree (including symbolic
+links to directories) you might traverse a given (physical) directory
+more than once (only if C<follow_fast> is in effect).
+Furthermore, deleting or changing files in a symbolically linked directory
+might cause very unpleasant surprises, since you delete or change files
+in an unknown directory.
+
+=back
+
+=head1 NOTES
+
+=over 4
+
+=item *
+
+Mac OS (Classic) users should note a few differences:
+
+=over 4
+
+=item *
+
+The path separator is ':', not '/', and the current directory is denoted
+as ':', not '.'. You should be careful about specifying relative pathnames.
+While a full path always begins with a volume name, a relative pathname
+should always begin with a ':'. If specifying a volume name only, a
+trailing ':' is required.
+
+=item *
+
+C<$File::Find::dir> is guaranteed to end with a ':'. If C<$_>
+contains the name of a directory, that name may or may not end with a
+':'. Likewise, C<$File::Find::name>, which contains the complete
+pathname to that directory, and C<$File::Find::fullname>, which holds
+the absolute pathname of that directory with all symbolic links resolved,
+may or may not end with a ':'.
+
+=item *
+
+The default C<untaint_pattern> (see above) on Mac OS is set to
+C<qr|^(.+)$|>. Note that the parentheses are vital.
+
+=item *
+
+The invisible system file "Icon\015" is ignored. While this file may
+appear in every directory, there are some more invisible system files
+on every volume, which are all located at the volume root level (i.e.
+"MacintoshHD:"). These system files are B<not> excluded automatically.
+Your filter may use the following code to recognize invisible files or
+directories (requires Mac::Files):
+
+ use Mac::Files;
+
+ # invisible() -- returns 1 if file/directory is invisible,
+ # 0 if it's visible or undef if an error occurred
+
+ sub invisible($) {
+ my $file = shift;
+ my ($fileCat, $fileInfo);
+ my $invisible_flag = 1 << 14;
+
+ if ( $fileCat = FSpGetCatInfo($file) ) {
+ if ($fileInfo = $fileCat->ioFlFndrInfo() ) {
+ return (($fileInfo->fdFlags & $invisible_flag) && 1);
+ }
+ }
+ return undef;
+ }
+
+Generally, invisible files are system files, unless an odd application
+decides to use invisible files for its own purposes. To distinguish
+such files from system files, you have to look at the B<type> and B<creator>
+file attributes. The MacPerl built-in functions C<GetFileInfo(FILE)> and
+C<SetFileInfo(CREATOR, TYPE, FILES)> offer access to these attributes
+(see MacPerl.pm for details).
+
+Files that appear on the desktop actually reside in an (hidden) directory
+named "Desktop Folder" on the particular disk volume. Note that, although
+all desktop files appear to be on the same "virtual" desktop, each disk
+volume actually maintains its own "Desktop Folder" directory.
+
+=back
+
+=back
+
+=head1 BUGS AND CAVEATS
+
+Despite the name of the C<finddepth()> function, both C<find()> and
+C<finddepth()> perform a depth-first search of the directory
+hierarchy.
+
+=head1 HISTORY
+
+File::Find used to produce incorrect results if called recursively.
+During the development of perl 5.8 this bug was fixed.
+The first fixed version of File::Find was 1.01.
+
+=head1 SEE ALSO
+
+find, find2perl.
+
+=cut
+
+our @ISA = qw(Exporter);
+our @EXPORT = qw(find finddepth);
+
+
+use strict;
+my $Is_VMS;
+my $Is_MacOS;
+
+require File::Basename;
+require File::Spec;
+
+# Should ideally be my() not our() but local() currently
+# refuses to operate on lexicals
+
+our %SLnkSeen;
+our ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow,
+ $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat,
+ $pre_process, $post_process, $dangling_symlinks);
+
+sub contract_name {
+ my ($cdir,$fn) = @_;
+
+ return substr($cdir,0,rindex($cdir,'/')) if $fn eq $File::Find::current_dir;
+
+ $cdir = substr($cdir,0,rindex($cdir,'/')+1);
+
+ $fn =~ s|^\./||;
+
+ my $abs_name= $cdir . $fn;
+
+ if (substr($fn,0,3) eq '../') {
+ 1 while $abs_name =~ s!/[^/]*/\.\./!/!;
+ }
+
+ return $abs_name;
+}
+
+# return the absolute name of a directory or file
+sub contract_name_Mac {
+ my ($cdir,$fn) = @_;
+ my $abs_name;
+
+ if ($fn =~ /^(:+)(.*)$/) { # valid pathname starting with a ':'
+
+ my $colon_count = length ($1);
+ if ($colon_count == 1) {
+ $abs_name = $cdir . $2;
+ return $abs_name;
+ }
+ else {
+ # need to move up the tree, but
+ # only if it's not a volume name
+ for (my $i=1; $i<$colon_count; $i++) {
+ unless ($cdir =~ /^[^:]+:$/) { # volume name
+ $cdir =~ s/[^:]+:$//;
+ }
+ else {
+ return undef;
+ }
+ }
+ $abs_name = $cdir . $2;
+ return $abs_name;
+ }
+
+ }
+ else {
+
+ # $fn may be a valid path to a directory or file or (dangling)
+ # symlink, without a leading ':'
+ if ( (-e $fn) || (-l $fn) ) {
+ if ($fn =~ /^[^:]+:/) { # a volume name like DataHD:*
+ return $fn; # $fn is already an absolute path
+ }
+ else {
+ $abs_name = $cdir . $fn;
+ return $abs_name;
+ }
+ }
+ else { # argh!, $fn is not a valid directory/file
+ return undef;
+ }
+ }
+}
+
+sub PathCombine($$) {
+ my ($Base,$Name) = @_;
+ my $AbsName;
+
+ if ($Is_MacOS) {
+ # $Name is the resolved symlink (always a full path on MacOS),
+ # i.e. there's no need to call contract_name_Mac()
+ $AbsName = $Name;
+
+ # (simple) check for recursion
+ if ( ( $Base =~ /^$AbsName/) && (-d $AbsName) ) { # recursion
+ return undef;
+ }
+ }
+ else {
+ if (substr($Name,0,1) eq '/') {
+ $AbsName= $Name;
+ }
+ else {
+ $AbsName= contract_name($Base,$Name);
+ }
+
+ # (simple) check for recursion
+ my $newlen= length($AbsName);
+ if ($newlen <= length($Base)) {
+ if (($newlen == length($Base) || substr($Base,$newlen,1) eq '/')
+ && $AbsName eq substr($Base,0,$newlen))
+ {
+ return undef;
+ }
+ }
+ }
+ return $AbsName;
+}
+
+sub Follow_SymLink($) {
+ my ($AbsName) = @_;
+
+ my ($NewName,$DEV, $INO);
+ ($DEV, $INO)= lstat $AbsName;
+
+ while (-l _) {
+ if ($SLnkSeen{$DEV, $INO}++) {
+ if ($follow_skip < 2) {
+ die "$AbsName is encountered a second time";
+ }
+ else {
+ return undef;
+ }
+ }
+ $NewName= PathCombine($AbsName, readlink($AbsName));
+ unless(defined $NewName) {
+ if ($follow_skip < 2) {
+ die "$AbsName is a recursive symbolic link";
+ }
+ else {
+ return undef;
+ }
+ }
+ else {
+ $AbsName= $NewName;
+ }
+ ($DEV, $INO) = lstat($AbsName);
+ return undef unless defined $DEV; # dangling symbolic link
+ }
+
+ if ($full_check && defined $DEV && $SLnkSeen{$DEV, $INO}++) {
+ if ( ($follow_skip < 1) || ((-d _) && ($follow_skip < 2)) ) {
+ die "$AbsName encountered a second time";
+ }
+ else {
+ return undef;
+ }
+ }
+
+ return $AbsName;
+}
+
+our($dir, $name, $fullname, $prune);
+sub _find_dir_symlnk($$$);
+sub _find_dir($$$);
+
+# check whether or not a scalar variable is tainted
+# (code straight from the Camel, 3rd ed., page 561)
+sub is_tainted_pp {
+ my $arg = shift;
+ my $nada = substr($arg, 0, 0); # zero-length
+ local $@;
+ eval { eval "# $nada" };
+ return length($@) != 0;
+}
+
+sub _find_opt {
+ my $wanted = shift;
+ die "invalid top directory" unless defined $_[0];
+
+ # This function must local()ize everything because callbacks may
+ # call find() or finddepth()
+
+ local %SLnkSeen;
+ local ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow,
+ $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat,
+ $pre_process, $post_process, $dangling_symlinks);
+ local($dir, $name, $fullname, $prune);
+ local *_ = \my $a;
+
+ my $cwd = $wanted->{bydepth} ? Cwd::fastcwd() : Cwd::getcwd();
+ if ($Is_VMS) {
+ # VMS returns this by default in VMS format which just doesn't
+ # work for the rest of this module.
+ $cwd = VMS::Filespec::unixpath($cwd);
+
+ # Apparently this is not expected to have a trailing space.
+ # To attempt to make VMS/UNIX conversions mostly reversable,
+ # a trailing slash is needed. The run-time functions ignore the
+ # resulting double slash, but it causes the perl tests to fail.
+ $cwd =~ s#/\z##;
+
+ # This comes up in upper case now, but should be lower.
+ # In the future this could be exact case, no need to change.
+ }
+ my $cwd_untainted = $cwd;
+ my $check_t_cwd = 1;
+ $wanted_callback = $wanted->{wanted};
+ $bydepth = $wanted->{bydepth};
+ $pre_process = $wanted->{preprocess};
+ $post_process = $wanted->{postprocess};
+ $no_chdir = $wanted->{no_chdir};
+ $full_check = $^O eq 'MSWin32' ? 0 : $wanted->{follow};
+ $follow = $^O eq 'MSWin32' ? 0 :
+ $full_check || $wanted->{follow_fast};
+ $follow_skip = $wanted->{follow_skip};
+ $untaint = $wanted->{untaint};
+ $untaint_pat = $wanted->{untaint_pattern};
+ $untaint_skip = $wanted->{untaint_skip};
+ $dangling_symlinks = $wanted->{dangling_symlinks};
+
+ # for compatibility reasons (find.pl, find2perl)
+ local our ($topdir, $topdev, $topino, $topmode, $topnlink);
+
+ # a symbolic link to a directory doesn't increase the link count
+ $avoid_nlink = $follow || $File::Find::dont_use_nlink;
+
+ my ($abs_dir, $Is_Dir);
+
+ Proc_Top_Item:
+ foreach my $TOP (@_) {
+ my $top_item = $TOP;
+
+ ($topdev,$topino,$topmode,$topnlink) = $follow ? stat $top_item : lstat $top_item;
+
+ if ($Is_MacOS) {
+ $top_item = ":$top_item"
+ if ( (-d _) && ( $top_item !~ /:/ ) );
+ } elsif ($^O eq 'MSWin32') {
+ $top_item =~ s|/\z|| unless $top_item =~ m|\w:/$|;
+ }
+ else {
+ $top_item =~ s|/\z|| unless $top_item eq '/';
+ }
+
+ $Is_Dir= 0;
+
+ if ($follow) {
+
+ if ($Is_MacOS) {
+ $cwd = "$cwd:" unless ($cwd =~ /:$/); # for safety
+
+ if ($top_item eq $File::Find::current_dir) {
+ $abs_dir = $cwd;
+ }
+ else {
+ $abs_dir = contract_name_Mac($cwd, $top_item);
+ unless (defined $abs_dir) {
+ warnings::warnif "Can't determine absolute path for $top_item (No such file or directory)\n";
+ next Proc_Top_Item;
+ }
+ }
+
+ }
+ else {
+ if (substr($top_item,0,1) eq '/') {
+ $abs_dir = $top_item;
+ }
+ elsif ($top_item eq $File::Find::current_dir) {
+ $abs_dir = $cwd;
+ }
+ else { # care about any ../
+ $top_item =~ s/\.dir\z//i if $Is_VMS;
+ $abs_dir = contract_name("$cwd/",$top_item);
+ }
+ }
+ $abs_dir= Follow_SymLink($abs_dir);
+ unless (defined $abs_dir) {
+ if ($dangling_symlinks) {
+ if (ref $dangling_symlinks eq 'CODE') {
+ $dangling_symlinks->($top_item, $cwd);
+ } else {
+ warnings::warnif "$top_item is a dangling symbolic link\n";
+ }
+ }
+ next Proc_Top_Item;
+ }
+
+ if (-d _) {
+ $top_item =~ s/\.dir\z//i if $Is_VMS;
+ _find_dir_symlnk($wanted, $abs_dir, $top_item);
+ $Is_Dir= 1;
+ }
+ }
+ else { # no follow
+ $topdir = $top_item;
+ unless (defined $topnlink) {
+ warnings::warnif "Can't stat $top_item: $!\n";
+ next Proc_Top_Item;
+ }
+ if (-d _) {
+ $top_item =~ s/\.dir\z//i if $Is_VMS;
+ _find_dir($wanted, $top_item, $topnlink);
+ $Is_Dir= 1;
+ }
+ else {
+ $abs_dir= $top_item;
+ }
+ }
+
+ unless ($Is_Dir) {
+ unless (($_,$dir) = File::Basename::fileparse($abs_dir)) {
+ if ($Is_MacOS) {
+ ($dir,$_) = (':', $top_item); # $File::Find::dir, $_
+ }
+ else {
+ ($dir,$_) = ('./', $top_item);
+ }
+ }
+
+ $abs_dir = $dir;
+ if (( $untaint ) && (is_tainted($dir) )) {
+ ( $abs_dir ) = $dir =~ m|$untaint_pat|;
+ unless (defined $abs_dir) {
+ if ($untaint_skip == 0) {
+ die "directory $dir is still tainted";
+ }
+ else {
+ next Proc_Top_Item;
+ }
+ }
+ }
+
+ unless ($no_chdir || chdir $abs_dir) {
+ warnings::warnif "Couldn't chdir $abs_dir: $!\n";
+ next Proc_Top_Item;
+ }
+
+ $name = $abs_dir . $_; # $File::Find::name
+ $_ = $name if $no_chdir;
+
+ { $wanted_callback->() }; # protect against wild "next"
+
+ }
+
+ unless ( $no_chdir ) {
+ if ( ($check_t_cwd) && (($untaint) && (is_tainted($cwd) )) ) {
+ ( $cwd_untainted ) = $cwd =~ m|$untaint_pat|;
+ unless (defined $cwd_untainted) {
+ die "insecure cwd in find(depth)";
+ }
+ $check_t_cwd = 0;
+ }
+ unless (chdir $cwd_untainted) {
+ die "Can't cd to $cwd: $!\n";
+ }
+ }
+ }
+}
+
+# API:
+# $wanted
+# $p_dir : "parent directory"
+# $nlink : what came back from the stat
+# preconditions:
+# chdir (if not no_chdir) to dir
+
+sub _find_dir($$$) {
+ my ($wanted, $p_dir, $nlink) = @_;
+ my ($CdLvl,$Level) = (0,0);
+ my @Stack;
+ my @filenames;
+ my ($subcount,$sub_nlink);
+ my $SE= [];
+ my $dir_name= $p_dir;
+ my $dir_pref;
+ my $dir_rel = $File::Find::current_dir;
+ my $tainted = 0;
+ my $no_nlink;
+
+ if ($Is_MacOS) {
+ $dir_pref= ($p_dir =~ /:$/) ? $p_dir : "$p_dir:"; # preface
+ } elsif ($^O eq 'MSWin32') {
+ $dir_pref = ($p_dir =~ m|\w:/?$| ? $p_dir : "$p_dir/" );
+ } elsif ($^O eq 'VMS') {
+
+ # VMS is returning trailing .dir on directories
+ # and trailing . on files and symbolic links
+ # in UNIX syntax.
+ #
+
+ $p_dir =~ s/\.(dir)?$//i unless $p_dir eq '.';
+
+ $dir_pref = ($p_dir =~ m/[\]>]+$/ ? $p_dir : "$p_dir/" );
+ }
+ else {
+ $dir_pref= ( $p_dir eq '/' ? '/' : "$p_dir/" );
+ }
+
+ local ($dir, $name, $prune, *DIR);
+
+ unless ( $no_chdir || ($p_dir eq $File::Find::current_dir)) {
+ my $udir = $p_dir;
+ if (( $untaint ) && (is_tainted($p_dir) )) {
+ ( $udir ) = $p_dir =~ m|$untaint_pat|;
+ unless (defined $udir) {
+ if ($untaint_skip == 0) {
+ die "directory $p_dir is still tainted";
+ }
+ else {
+ return;
+ }
+ }
+ }
+ unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) {
+ warnings::warnif "Can't cd to $udir: $!\n";
+ return;
+ }
+ }
+
+ # push the starting directory
+ push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth;
+
+ if ($Is_MacOS) {
+ $p_dir = $dir_pref; # ensure trailing ':'
+ }
+
+ while (defined $SE) {
+ unless ($bydepth) {
+ $dir= $p_dir; # $File::Find::dir
+ $name= $dir_name; # $File::Find::name
+ $_= ($no_chdir ? $dir_name : $dir_rel ); # $_
+ # prune may happen here
+ $prune= 0;
+ { $wanted_callback->() }; # protect against wild "next"
+ next if $prune;
+ }
+
+ # change to that directory
+ unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) {
+ my $udir= $dir_rel;
+ if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_rel) )) ) {
+ ( $udir ) = $dir_rel =~ m|$untaint_pat|;
+ unless (defined $udir) {
+ if ($untaint_skip == 0) {
+ if ($Is_MacOS) {
+ die "directory ($p_dir) $dir_rel is still tainted";
+ }
+ else {
+ die "directory (" . ($p_dir ne '/' ? $p_dir : '') . "/) $dir_rel is still tainted";
+ }
+ } else { # $untaint_skip == 1
+ next;
+ }
+ }
+ }
+ unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) {
+ if ($Is_MacOS) {
+ warnings::warnif "Can't cd to ($p_dir) $udir: $!\n";
+ }
+ else {
+ warnings::warnif "Can't cd to (" .
+ ($p_dir ne '/' ? $p_dir : '') . "/) $udir: $!\n";
+ }
+ next;
+ }
+ $CdLvl++;
+ }
+
+ if ($Is_MacOS) {
+ $dir_name = "$dir_name:" unless ($dir_name =~ /:$/);
+ }
+
+ $dir= $dir_name; # $File::Find::dir
+
+ # Get the list of files in the current directory.
+ unless (opendir DIR, ($no_chdir ? $dir_name : $File::Find::current_dir)) {
+ warnings::warnif "Can't opendir($dir_name): $!\n";
+ next;
+ }
+ @filenames = readdir DIR;
+ closedir(DIR);
+ @filenames = $pre_process->(@filenames) if $pre_process;
+ push @Stack,[$CdLvl,$dir_name,"",-2] if $post_process;
+
+ # default: use whatever was specifid
+ # (if $nlink >= 2, and $avoid_nlink == 0, this will switch back)
+ $no_nlink = $avoid_nlink;
+ # if dir has wrong nlink count, force switch to slower stat method
+ $no_nlink = 1 if ($nlink < 2);
+
+ if ($nlink == 2 && !$no_nlink) {
+ # This dir has no subdirectories.
+ for my $FN (@filenames) {
+ if ($Is_VMS) {
+ # Big hammer here - Compensate for VMS trailing . and .dir
+ # No win situation until this is changed, but this
+ # will handle the majority of the cases with breaking the fewest
+
+ $FN =~ s/\.dir\z//i;
+ $FN =~ s#\.$## if ($FN ne '.');
+ }
+ next if $FN =~ $File::Find::skip_pattern;
+
+ $name = $dir_pref . $FN; # $File::Find::name
+ $_ = ($no_chdir ? $name : $FN); # $_
+ { $wanted_callback->() }; # protect against wild "next"
+ }
+
+ }
+ else {
+ # This dir has subdirectories.
+ $subcount = $nlink - 2;
+
+ # HACK: insert directories at this position. so as to preserve
+ # the user pre-processed ordering of files.
+ # EG: directory traversal is in user sorted order, not at random.
+ my $stack_top = @Stack;
+
+ for my $FN (@filenames) {
+ next if $FN =~ $File::Find::skip_pattern;
+ if ($subcount > 0 || $no_nlink) {
+ # Seen all the subdirs?
+ # check for directoriness.
+ # stat is faster for a file in the current directory
+ $sub_nlink = (lstat ($no_chdir ? $dir_pref . $FN : $FN))[3];
+
+ if (-d _) {
+ --$subcount;
+ $FN =~ s/\.dir\z//i if $Is_VMS;
+ # HACK: replace push to preserve dir traversal order
+ #push @Stack,[$CdLvl,$dir_name,$FN,$sub_nlink];
+ splice @Stack, $stack_top, 0,
+ [$CdLvl,$dir_name,$FN,$sub_nlink];
+ }
+ else {
+ $name = $dir_pref . $FN; # $File::Find::name
+ $_= ($no_chdir ? $name : $FN); # $_
+ { $wanted_callback->() }; # protect against wild "next"
+ }
+ }
+ else {
+ $name = $dir_pref . $FN; # $File::Find::name
+ $_= ($no_chdir ? $name : $FN); # $_
+ { $wanted_callback->() }; # protect against wild "next"
+ }
+ }
+ }
+ }
+ continue {
+ while ( defined ($SE = pop @Stack) ) {
+ ($Level, $p_dir, $dir_rel, $nlink) = @$SE;
+ if ($CdLvl > $Level && !$no_chdir) {
+ my $tmp;
+ if ($Is_MacOS) {
+ $tmp = (':' x ($CdLvl-$Level)) . ':';
+ }
+ elsif ($Is_VMS) {
+ $tmp = '[' . ('-' x ($CdLvl-$Level)) . ']';
+ }
+ else {
+ $tmp = join('/',('..') x ($CdLvl-$Level));
+ }
+ die "Can't cd to $tmp from $dir_name"
+ unless chdir ($tmp);
+ $CdLvl = $Level;
+ }
+
+ if ($Is_MacOS) {
+ # $pdir always has a trailing ':', except for the starting dir,
+ # where $dir_rel eq ':'
+ $dir_name = "$p_dir$dir_rel";
+ $dir_pref = "$dir_name:";
+ }
+ elsif ($^O eq 'MSWin32') {
+ $dir_name = ($p_dir =~ m|\w:/?$| ? "$p_dir$dir_rel" : "$p_dir/$dir_rel");
+ $dir_pref = "$dir_name/";
+ }
+ elsif ($^O eq 'VMS') {
+ if ($p_dir =~ m/[\]>]+$/) {
+ $dir_name = $p_dir;
+ $dir_name =~ s/([\]>]+)$/.$dir_rel$1/;
+ $dir_pref = $dir_name;
+ }
+ else {
+ $dir_name = "$p_dir/$dir_rel";
+ $dir_pref = "$dir_name/";
+ }
+ }
+ else {
+ $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel");
+ $dir_pref = "$dir_name/";
+ }
+
+ if ( $nlink == -2 ) {
+ $name = $dir = $p_dir; # $File::Find::name / dir
+ $_ = $File::Find::current_dir;
+ $post_process->(); # End-of-directory processing
+ }
+ elsif ( $nlink < 0 ) { # must be finddepth, report dirname now
+ $name = $dir_name;
+ if ($Is_MacOS) {
+ if ($dir_rel eq ':') { # must be the top dir, where we started
+ $name =~ s|:$||; # $File::Find::name
+ $p_dir = "$p_dir:" unless ($p_dir =~ /:$/);
+ }
+ $dir = $p_dir; # $File::Find::dir
+ $_ = ($no_chdir ? $name : $dir_rel); # $_
+ }
+ else {
+ if ( substr($name,-2) eq '/.' ) {
+ substr($name, length($name) == 2 ? -1 : -2) = '';
+ }
+ $dir = $p_dir;
+ $_ = ($no_chdir ? $dir_name : $dir_rel );
+ if ( substr($_,-2) eq '/.' ) {
+ substr($_, length($_) == 2 ? -1 : -2) = '';
+ }
+ }
+ { $wanted_callback->() }; # protect against wild "next"
+ }
+ else {
+ push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth;
+ last;
+ }
+ }
+ }
+}
+
+
+# API:
+# $wanted
+# $dir_loc : absolute location of a dir
+# $p_dir : "parent directory"
+# preconditions:
+# chdir (if not no_chdir) to dir
+
+sub _find_dir_symlnk($$$) {
+ my ($wanted, $dir_loc, $p_dir) = @_; # $dir_loc is the absolute directory
+ my @Stack;
+ my @filenames;
+ my $new_loc;
+ my $updir_loc = $dir_loc; # untainted parent directory
+ my $SE = [];
+ my $dir_name = $p_dir;
+ my $dir_pref;
+ my $loc_pref;
+ my $dir_rel = $File::Find::current_dir;
+ my $byd_flag; # flag for pending stack entry if $bydepth
+ my $tainted = 0;
+ my $ok = 1;
+
+ if ($Is_MacOS) {
+ $dir_pref = ($p_dir =~ /:$/) ? "$p_dir" : "$p_dir:";
+ $loc_pref = ($dir_loc =~ /:$/) ? "$dir_loc" : "$dir_loc:";
+ } else {
+ $dir_pref = ( $p_dir eq '/' ? '/' : "$p_dir/" );
+ $loc_pref = ( $dir_loc eq '/' ? '/' : "$dir_loc/" );
+ }
+
+ local ($dir, $name, $fullname, $prune, *DIR);
+
+ unless ($no_chdir) {
+ # untaint the topdir
+ if (( $untaint ) && (is_tainted($dir_loc) )) {
+ ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; # parent dir, now untainted
+ # once untainted, $updir_loc is pushed on the stack (as parent directory);
+ # hence, we don't need to untaint the parent directory every time we chdir
+ # to it later
+ unless (defined $updir_loc) {
+ if ($untaint_skip == 0) {
+ die "directory $dir_loc is still tainted";
+ }
+ else {
+ return;
+ }
+ }
+ }
+ $ok = chdir($updir_loc) unless ($p_dir eq $File::Find::current_dir);
+ unless ($ok) {
+ warnings::warnif "Can't cd to $updir_loc: $!\n";
+ return;
+ }
+ }
+
+ push @Stack,[$dir_loc,$updir_loc,$p_dir,$dir_rel,-1] if $bydepth;
+
+ if ($Is_MacOS) {
+ $p_dir = $dir_pref; # ensure trailing ':'
+ }
+
+ while (defined $SE) {
+
+ unless ($bydepth) {
+ # change (back) to parent directory (always untainted)
+ unless ($no_chdir) {
+ unless (chdir $updir_loc) {
+ warnings::warnif "Can't cd to $updir_loc: $!\n";
+ next;
+ }
+ }
+ $dir= $p_dir; # $File::Find::dir
+ $name= $dir_name; # $File::Find::name
+ $_= ($no_chdir ? $dir_name : $dir_rel ); # $_
+ $fullname= $dir_loc; # $File::Find::fullname
+ # prune may happen here
+ $prune= 0;
+ lstat($_); # make sure file tests with '_' work
+ { $wanted_callback->() }; # protect against wild "next"
+ next if $prune;
+ }
+
+ # change to that directory
+ unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) {
+ $updir_loc = $dir_loc;
+ if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_loc) )) ) {
+ # untaint $dir_loc, what will be pushed on the stack as (untainted) parent dir
+ ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|;
+ unless (defined $updir_loc) {
+ if ($untaint_skip == 0) {
+ die "directory $dir_loc is still tainted";
+ }
+ else {
+ next;
+ }
+ }
+ }
+ unless (chdir $updir_loc) {
+ warnings::warnif "Can't cd to $updir_loc: $!\n";
+ next;
+ }
+ }
+
+ if ($Is_MacOS) {
+ $dir_name = "$dir_name:" unless ($dir_name =~ /:$/);
+ }
+
+ $dir = $dir_name; # $File::Find::dir
+
+ # Get the list of files in the current directory.
+ unless (opendir DIR, ($no_chdir ? $dir_loc : $File::Find::current_dir)) {
+ warnings::warnif "Can't opendir($dir_loc): $!\n";
+ next;
+ }
+ @filenames = readdir DIR;
+ closedir(DIR);
+
+ for my $FN (@filenames) {
+ if ($Is_VMS) {
+ # Big hammer here - Compensate for VMS trailing . and .dir
+ # No win situation until this is changed, but this
+ # will handle the majority of the cases with breaking the fewest.
+
+ $FN =~ s/\.dir\z//i;
+ $FN =~ s#\.$## if ($FN ne '.');
+ }
+ next if $FN =~ $File::Find::skip_pattern;
+
+ # follow symbolic links / do an lstat
+ $new_loc = Follow_SymLink($loc_pref.$FN);
+
+ # ignore if invalid symlink
+ unless (defined $new_loc) {
+ if (!defined -l _ && $dangling_symlinks) {
+ if (ref $dangling_symlinks eq 'CODE') {
+ $dangling_symlinks->($FN, $dir_pref);
+ } else {
+ warnings::warnif "$dir_pref$FN is a dangling symbolic link\n";
+ }
+ }
+
+ $fullname = undef;
+ $name = $dir_pref . $FN;
+ $_ = ($no_chdir ? $name : $FN);
+ { $wanted_callback->() };
+ next;
+ }
+
+ if (-d _) {
+ if ($Is_VMS) {
+ $FN =~ s/\.dir\z//i;
+ $FN =~ s#\.$## if ($FN ne '.');
+ $new_loc =~ s/\.dir\z//i;
+ $new_loc =~ s#\.$## if ($new_loc ne '.');
+ }
+ push @Stack,[$new_loc,$updir_loc,$dir_name,$FN,1];
+ }
+ else {
+ $fullname = $new_loc; # $File::Find::fullname
+ $name = $dir_pref . $FN; # $File::Find::name
+ $_ = ($no_chdir ? $name : $FN); # $_
+ { $wanted_callback->() }; # protect against wild "next"
+ }
+ }
+
+ }
+ continue {
+ while (defined($SE = pop @Stack)) {
+ ($dir_loc, $updir_loc, $p_dir, $dir_rel, $byd_flag) = @$SE;
+ if ($Is_MacOS) {
+ # $p_dir always has a trailing ':', except for the starting dir,
+ # where $dir_rel eq ':'
+ $dir_name = "$p_dir$dir_rel";
+ $dir_pref = "$dir_name:";
+ $loc_pref = ($dir_loc =~ /:$/) ? $dir_loc : "$dir_loc:";
+ }
+ else {
+ $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel");
+ $dir_pref = "$dir_name/";
+ $loc_pref = "$dir_loc/";
+ }
+ if ( $byd_flag < 0 ) { # must be finddepth, report dirname now
+ unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) {
+ unless (chdir $updir_loc) { # $updir_loc (parent dir) is always untainted
+ warnings::warnif "Can't cd to $updir_loc: $!\n";
+ next;
+ }
+ }
+ $fullname = $dir_loc; # $File::Find::fullname
+ $name = $dir_name; # $File::Find::name
+ if ($Is_MacOS) {
+ if ($dir_rel eq ':') { # must be the top dir, where we started
+ $name =~ s|:$||; # $File::Find::name
+ $p_dir = "$p_dir:" unless ($p_dir =~ /:$/);
+ }
+ $dir = $p_dir; # $File::Find::dir
+ $_ = ($no_chdir ? $name : $dir_rel); # $_
+ }
+ else {
+ if ( substr($name,-2) eq '/.' ) {
+ substr($name, length($name) == 2 ? -1 : -2) = ''; # $File::Find::name
+ }
+ $dir = $p_dir; # $File::Find::dir
+ $_ = ($no_chdir ? $dir_name : $dir_rel); # $_
+ if ( substr($_,-2) eq '/.' ) {
+ substr($_, length($_) == 2 ? -1 : -2) = '';
+ }
+ }
+
+ lstat($_); # make sure file tests with '_' work
+ { $wanted_callback->() }; # protect against wild "next"
+ }
+ else {
+ push @Stack,[$dir_loc, $updir_loc, $p_dir, $dir_rel,-1] if $bydepth;
+ last;
+ }
+ }
+ }
+}
+
+
+sub wrap_wanted {
+ my $wanted = shift;
+ if ( ref($wanted) eq 'HASH' ) {
+ unless( exists $wanted->{wanted} and ref( $wanted->{wanted} ) eq 'CODE' ) {
+ die 'no &wanted subroutine given';
+ }
+ if ( $wanted->{follow} || $wanted->{follow_fast}) {
+ $wanted->{follow_skip} = 1 unless defined $wanted->{follow_skip};
+ }
+ if ( $wanted->{untaint} ) {
+ $wanted->{untaint_pattern} = $File::Find::untaint_pattern
+ unless defined $wanted->{untaint_pattern};
+ $wanted->{untaint_skip} = 0 unless defined $wanted->{untaint_skip};
+ }
+ return $wanted;
+ }
+ elsif( ref( $wanted ) eq 'CODE' ) {
+ return { wanted => $wanted };
+ }
+ else {
+ die 'no &wanted subroutine given';
+ }
+}
+
+sub find {
+ my $wanted = shift;
+ _find_opt(wrap_wanted($wanted), @_);
+}
+
+sub finddepth {
+ my $wanted = wrap_wanted(shift);
+ $wanted->{bydepth} = 1;
+ _find_opt($wanted, @_);
+}
+
+# default
+$File::Find::skip_pattern = qr/^\.{1,2}\z/;
+$File::Find::untaint_pattern = qr|^([-+@\w./]+)$|;
+
+# These are hard-coded for now, but may move to hint files.
+if ($^O eq 'VMS') {
+ $Is_VMS = 1;
+ $File::Find::dont_use_nlink = 1;
+}
+elsif ($^O eq 'MacOS') {
+ $Is_MacOS = 1;
+ $File::Find::dont_use_nlink = 1;
+ $File::Find::skip_pattern = qr/^Icon\015\z/;
+ $File::Find::untaint_pattern = qr|^(.+)$|;
+}
+
+# this _should_ work properly on all platforms
+# where File::Find can be expected to work
+$File::Find::current_dir = File::Spec->curdir || '.';
+
+$File::Find::dont_use_nlink = 1
+ if $^O eq 'os2' || $^O eq 'dos' || $^O eq 'amigaos' || $^O eq 'MSWin32' ||
+ $^O eq 'interix' || $^O eq 'cygwin' || $^O eq 'epoc' || $^O eq 'qnx' ||
+ $^O eq 'nto';
+
+# Set dont_use_nlink in your hint file if your system's stat doesn't
+# report the number of links in a directory as an indication
+# of the number of files.
+# See, e.g. hints/machten.sh for MachTen 2.2.
+unless ($File::Find::dont_use_nlink) {
+ require Config;
+ $File::Find::dont_use_nlink = 1 if ($Config::Config{'dont_use_nlink'});
+}
+
+# We need a function that checks if a scalar is tainted. Either use the
+# Scalar::Util module's tainted() function or our (slower) pure Perl
+# fallback is_tainted_pp()
+{
+ local $@;
+ eval { require Scalar::Util };
+ *is_tainted = $@ ? \&is_tainted_pp : \&Scalar::Util::tainted;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Find/Rule.pm b/Master/tlpkg/tlperl.straw/lib/File/Find/Rule.pm
new file mode 100755
index 00000000000..8f6e254f704
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Find/Rule.pm
@@ -0,0 +1,797 @@
+# $Id$
+
+package File::Find::Rule;
+use strict;
+use File::Spec;
+use Text::Glob 'glob_to_regex';
+use Number::Compare;
+use Carp qw/croak/;
+use File::Find (); # we're only wrapping for now
+
+our $VERSION = '0.32';
+
+# we'd just inherit from Exporter, but I want the colon
+sub import {
+ my $pkg = shift;
+ my $to = caller;
+ for my $sym ( qw( find rule ) ) {
+ no strict 'refs';
+ *{"$to\::$sym"} = \&{$sym};
+ }
+ for (grep /^:/, @_) {
+ my ($extension) = /^:(.*)/;
+ eval "require File::Find::Rule::$extension";
+ croak "couldn't bootstrap File::Find::Rule::$extension: $@" if $@;
+ }
+}
+
+=head1 NAME
+
+File::Find::Rule - Alternative interface to File::Find
+
+=head1 SYNOPSIS
+
+ use File::Find::Rule;
+ # find all the subdirectories of a given directory
+ my @subdirs = File::Find::Rule->directory->in( $directory );
+
+ # find all the .pm files in @INC
+ my @files = File::Find::Rule->file()
+ ->name( '*.pm' )
+ ->in( @INC );
+
+ # as above, but without method chaining
+ my $rule = File::Find::Rule->new;
+ $rule->file;
+ $rule->name( '*.pm' );
+ my @files = $rule->in( @INC );
+
+=head1 DESCRIPTION
+
+File::Find::Rule is a friendlier interface to File::Find. It allows
+you to build rules which specify the desired files and directories.
+
+=cut
+
+# the procedural shim
+
+*rule = \&find;
+sub find {
+ my $object = __PACKAGE__->new();
+ my $not = 0;
+
+ while (@_) {
+ my $method = shift;
+ my @args;
+
+ if ($method =~ s/^\!//) {
+ # jinkies, we're really negating this
+ unshift @_, $method;
+ $not = 1;
+ next;
+ }
+ unless (defined prototype $method) {
+ my $args = shift;
+ @args = ref $args eq 'ARRAY' ? @$args : $args;
+ }
+ if ($not) {
+ $not = 0;
+ @args = $object->new->$method(@args);
+ $method = "not";
+ }
+
+ my @return = $object->$method(@args);
+ return @return if $method eq 'in';
+ }
+ $object;
+}
+
+
+=head1 METHODS
+
+=over
+
+=item C<new>
+
+A constructor. You need not invoke C<new> manually unless you wish
+to, as each of the rule-making methods will auto-create a suitable
+object if called as class methods.
+
+=cut
+
+sub new {
+ my $referent = shift;
+ my $class = ref $referent || $referent;
+ bless {
+ rules => [],
+ subs => {},
+ iterator => [],
+ extras => {},
+ maxdepth => undef,
+ mindepth => undef,
+ }, $class;
+}
+
+sub _force_object {
+ my $object = shift;
+ $object = $object->new()
+ unless ref $object;
+ $object;
+}
+
+=back
+
+=head2 Matching Rules
+
+=over
+
+=item C<name( @patterns )>
+
+Specifies names that should match. May be globs or regular
+expressions.
+
+ $set->name( '*.mp3', '*.ogg' ); # mp3s or oggs
+ $set->name( qr/\.(mp3|ogg)$/ ); # the same as a regex
+ $set->name( 'foo.bar' ); # just things named foo.bar
+
+=cut
+
+sub _flatten {
+ my @flat;
+ while (@_) {
+ my $item = shift;
+ ref $item eq 'ARRAY' ? push @_, @{ $item } : push @flat, $item;
+ }
+ return @flat;
+}
+
+sub name {
+ my $self = _force_object shift;
+ my @names = map { ref $_ eq "Regexp" ? $_ : glob_to_regex $_ } _flatten( @_ );
+
+ push @{ $self->{rules} }, {
+ rule => 'name',
+ code => join( ' || ', map { "m($_)" } @names ),
+ args => \@_,
+ };
+
+ $self;
+}
+
+=item -X tests
+
+Synonyms are provided for each of the -X tests. See L<perlfunc/-X> for
+details. None of these methods take arguments.
+
+ Test | Method Test | Method
+ ------|------------- ------|----------------
+ -r | readable -R | r_readable
+ -w | writeable -W | r_writeable
+ -w | writable -W | r_writable
+ -x | executable -X | r_executable
+ -o | owned -O | r_owned
+ | |
+ -e | exists -f | file
+ -z | empty -d | directory
+ -s | nonempty -l | symlink
+ | -p | fifo
+ -u | setuid -S | socket
+ -g | setgid -b | block
+ -k | sticky -c | character
+ | -t | tty
+ -M | modified |
+ -A | accessed -T | ascii
+ -C | changed -B | binary
+
+Though some tests are fairly meaningless as binary flags (C<modified>,
+C<accessed>, C<changed>), they have been included for completeness.
+
+ # find nonempty files
+ $rule->file,
+ ->nonempty;
+
+=cut
+
+use vars qw( %X_tests );
+%X_tests = (
+ -r => readable => -R => r_readable =>
+ -w => writeable => -W => r_writeable =>
+ -w => writable => -W => r_writable =>
+ -x => executable => -X => r_executable =>
+ -o => owned => -O => r_owned =>
+
+ -e => exists => -f => file =>
+ -z => empty => -d => directory =>
+ -s => nonempty => -l => symlink =>
+ => -p => fifo =>
+ -u => setuid => -S => socket =>
+ -g => setgid => -b => block =>
+ -k => sticky => -c => character =>
+ => -t => tty =>
+ -M => modified =>
+ -A => accessed => -T => ascii =>
+ -C => changed => -B => binary =>
+ );
+
+for my $test (keys %X_tests) {
+ my $sub = eval 'sub () {
+ my $self = _force_object shift;
+ push @{ $self->{rules} }, {
+ code => "' . $test . ' \$_",
+ rule => "'.$X_tests{$test}.'",
+ };
+ $self;
+ } ';
+ no strict 'refs';
+ *{ $X_tests{$test} } = $sub;
+}
+
+
+=item stat tests
+
+The following C<stat> based methods are provided: C<dev>, C<ino>,
+C<mode>, C<nlink>, C<uid>, C<gid>, C<rdev>, C<size>, C<atime>,
+C<mtime>, C<ctime>, C<blksize>, and C<blocks>. See L<perlfunc/stat>
+for details.
+
+Each of these can take a number of targets, which will follow
+L<Number::Compare> semantics.
+
+ $rule->size( 7 ); # exactly 7
+ $rule->size( ">7Ki" ); # larger than 7 * 1024 * 1024 bytes
+ $rule->size( ">=7" )
+ ->size( "<=90" ); # between 7 and 90, inclusive
+ $rule->size( 7, 9, 42 ); # 7, 9 or 42
+
+=cut
+
+use vars qw( @stat_tests );
+@stat_tests = qw( dev ino mode nlink uid gid rdev
+ size atime mtime ctime blksize blocks );
+{
+ my $i = 0;
+ for my $test (@stat_tests) {
+ my $index = $i++; # to close over
+ my $sub = sub {
+ my $self = _force_object shift;
+
+ my @tests = map { Number::Compare->parse_to_perl($_) } @_;
+
+ push @{ $self->{rules} }, {
+ rule => $test,
+ args => \@_,
+ code => 'do { my $val = (stat $_)['.$index.'] || 0;'.
+ join ('||', map { "(\$val $_)" } @tests ).' }',
+ };
+ $self;
+ };
+ no strict 'refs';
+ *$test = $sub;
+ }
+}
+
+=item C<any( @rules )>
+
+=item C<or( @rules )>
+
+Allows shortcircuiting boolean evaluation as an alternative to the
+default and-like nature of combined rules. C<any> and C<or> are
+interchangeable.
+
+ # find avis, movs, things over 200M and empty files
+ $rule->any( File::Find::Rule->name( '*.avi', '*.mov' ),
+ File::Find::Rule->size( '>200M' ),
+ File::Find::Rule->file->empty,
+ );
+
+=cut
+
+sub any {
+ my $self = _force_object shift;
+ # compile all the subrules to code fragments
+ push @{ $self->{rules} }, {
+ rule => "any",
+ code => '(' . join( ' || ', map '( ' . $_->_compile . ' )', @_ ). ')',
+ args => \@_,
+ };
+
+ # merge all the subs hashes of the kids into ourself
+ %{ $self->{subs} } = map { %{ $_->{subs} } } $self, @_;
+ $self;
+}
+
+*or = \&any;
+
+=item C<none( @rules )>
+
+=item C<not( @rules )>
+
+Negates a rule. (The inverse of C<any>.) C<none> and C<not> are
+interchangeable.
+
+ # files that aren't 8.3 safe
+ $rule->file
+ ->not( $rule->new->name( qr/^[^.]{1,8}(\.[^.]{0,3})?$/ ) );
+
+=cut
+
+sub not {
+ my $self = _force_object shift;
+
+ push @{ $self->{rules} }, {
+ rule => 'not',
+ args => \@_,
+ code => '(' . join ( ' && ', map { "!(". $_->_compile . ")" } @_ ) . ")",
+ };
+
+ # merge all the subs hashes into us
+ %{ $self->{subs} } = map { %{ $_->{subs} } } $self, @_;
+ $self;
+}
+
+*none = \&not;
+
+=item C<prune>
+
+Traverse no further. This rule always matches.
+
+=cut
+
+sub prune () {
+ my $self = _force_object shift;
+
+ push @{ $self->{rules} },
+ {
+ rule => 'prune',
+ code => '$File::Find::prune = 1'
+ };
+ $self;
+}
+
+=item C<discard>
+
+Don't keep this file. This rule always matches.
+
+=cut
+
+sub discard () {
+ my $self = _force_object shift;
+
+ push @{ $self->{rules} }, {
+ rule => 'discard',
+ code => '$discarded = 1',
+ };
+ $self;
+}
+
+=item C<exec( \&subroutine( $shortname, $path, $fullname ) )>
+
+Allows user-defined rules. Your subroutine will be invoked with C<$_>
+set to the current short name, and with parameters of the name, the
+path you're in, and the full relative filename.
+
+Return a true value if your rule matched.
+
+ # get things with long names
+ $rules->exec( sub { length > 20 } );
+
+=cut
+
+sub exec {
+ my $self = _force_object shift;
+ my $code = shift;
+
+ push @{ $self->{rules} }, {
+ rule => 'exec',
+ code => $code,
+ };
+ $self;
+}
+
+=item C<grep( @specifiers )>
+
+Opens a file and tests it each line at a time.
+
+For each line it evaluates each of the specifiers, stopping at the
+first successful match. A specifier may be a regular expression or a
+subroutine. The subroutine will be invoked with the same parameters
+as an ->exec subroutine.
+
+It is possible to provide a set of negative specifiers by enclosing
+them in anonymous arrays. Should a negative specifier match the
+iteration is aborted and the clause is failed. For example:
+
+ $rule->grep( qr/^#!.*\bperl/, [ sub { 1 } ] );
+
+Is a passing clause if the first line of a file looks like a perl
+shebang line.
+
+=cut
+
+sub grep {
+ my $self = _force_object shift;
+ my @pattern = map {
+ ref $_
+ ? ref $_ eq 'ARRAY'
+ ? map { [ ( ref $_ ? $_ : qr/$_/ ) => 0 ] } @$_
+ : [ $_ => 1 ]
+ : [ qr/$_/ => 1 ]
+ } @_;
+
+ $self->exec( sub {
+ local *FILE;
+ open FILE, $_ or return;
+ local ($_, $.);
+ while (<FILE>) {
+ for my $p (@pattern) {
+ my ($rule, $ret) = @$p;
+ return $ret
+ if ref $rule eq 'Regexp'
+ ? /$rule/
+ : $rule->(@_);
+ }
+ }
+ return;
+ } );
+}
+
+=item C<maxdepth( $level )>
+
+Descend at most C<$level> (a non-negative integer) levels of directories
+below the starting point.
+
+May be invoked many times per rule, but only the most recent value is
+used.
+
+=item C<mindepth( $level )>
+
+Do not apply any tests at levels less than C<$level> (a non-negative
+integer).
+
+=item C<extras( \%extras )>
+
+Specifies extra values to pass through to C<File::File::find> as part
+of the options hash.
+
+For example this allows you to specify following of symlinks like so:
+
+ my $rule = File::Find::Rule->extras({ follow => 1 });
+
+May be invoked many times per rule, but only the most recent value is
+used.
+
+=cut
+
+for my $setter (qw( maxdepth mindepth extras )) {
+ my $sub = sub {
+ my $self = _force_object shift;
+ $self->{$setter} = shift;
+ $self;
+ };
+ no strict 'refs';
+ *$setter = $sub;
+}
+
+
+=item C<relative>
+
+Trim the leading portion of any path found
+
+=cut
+
+sub relative () {
+ my $self = _force_object shift;
+ $self->{relative} = 1;
+ $self;
+}
+
+=item C<not_*>
+
+Negated version of the rule. An effective shortand related to ! in
+the procedural interface.
+
+ $foo->not_name('*.pl');
+
+ $foo->not( $foo->new->name('*.pl' ) );
+
+=cut
+
+sub DESTROY {}
+sub AUTOLOAD {
+ our $AUTOLOAD;
+ $AUTOLOAD =~ /::not_([^:]*)$/
+ or croak "Can't locate method $AUTOLOAD";
+ my $method = $1;
+
+ my $sub = sub {
+ my $self = _force_object shift;
+ $self->not( $self->new->$method(@_) );
+ };
+ {
+ no strict 'refs';
+ *$AUTOLOAD = $sub;
+ }
+ &$sub;
+}
+
+=back
+
+=head2 Query Methods
+
+=over
+
+=item C<in( @directories )>
+
+Evaluates the rule, returns a list of paths to matching files and
+directories.
+
+=cut
+
+sub in {
+ my $self = _force_object shift;
+
+ my @found;
+ my $fragment = $self->_compile;
+ my %subs = %{ $self->{subs} };
+
+ warn "relative mode handed multiple paths - that's a bit silly\n"
+ if $self->{relative} && @_ > 1;
+
+ my $topdir;
+ my $code = 'sub {
+ (my $path = $File::Find::name) =~ s#^(?:\./+)+##;
+ my @args = ($_, $File::Find::dir, $path);
+ my $maxdepth = $self->{maxdepth};
+ my $mindepth = $self->{mindepth};
+ my $relative = $self->{relative};
+
+ # figure out the relative path and depth
+ my $relpath = $File::Find::name;
+ $relpath =~ s{^\Q$topdir\E/?}{};
+ my $depth = scalar File::Spec->splitdir($relpath);
+ #print "name: \'$File::Find::name\' ";
+ #print "relpath: \'$relpath\' depth: $depth relative: $relative\n";
+
+ defined $maxdepth && $depth >= $maxdepth
+ and $File::Find::prune = 1;
+
+ defined $mindepth && $depth < $mindepth
+ and return;
+
+ #print "Testing \'$_\'\n";
+
+ my $discarded;
+ return unless ' . $fragment . ';
+ return if $discarded;
+ if ($relative) {
+ push @found, $relpath if $relpath ne "";
+ }
+ else {
+ push @found, $path;
+ }
+ }';
+
+ #use Data::Dumper;
+ #print Dumper \%subs;
+ #warn "Compiled sub: '$code'\n";
+
+ my $sub = eval "$code" or die "compile error '$code' $@";
+ for my $path (@_) {
+ # $topdir is used for relative and maxdepth
+ $topdir = $path;
+ # slice off the trailing slash if there is one (the
+ # maxdepth/mindepth code is fussy)
+ $topdir =~ s{/?$}{}
+ unless $topdir eq '/';
+ $self->_call_find( { %{ $self->{extras} }, wanted => $sub }, $path );
+ }
+
+ return @found;
+}
+
+sub _call_find {
+ my $self = shift;
+ File::Find::find( @_ );
+}
+
+sub _compile {
+ my $self = shift;
+
+ return '1' unless @{ $self->{rules} };
+ my $code = join " && ", map {
+ if (ref $_->{code}) {
+ my $key = "$_->{code}";
+ $self->{subs}{$key} = $_->{code};
+ "\$subs{'$key'}->(\@args) # $_->{rule}\n";
+ }
+ else {
+ "( $_->{code} ) # $_->{rule}\n";
+ }
+ } @{ $self->{rules} };
+
+ #warn $code;
+ return $code;
+}
+
+=item C<start( @directories )>
+
+Starts a find across the specified directories. Matching items may
+then be queried using L</match>. This allows you to use a rule as an
+iterator.
+
+ my $rule = File::Find::Rule->file->name("*.jpeg")->start( "/web" );
+ while ( defined ( my $image = $rule->match ) ) {
+ ...
+ }
+
+=cut
+
+sub start {
+ my $self = _force_object shift;
+
+ $self->{iterator} = [ $self->in( @_ ) ];
+ $self;
+}
+
+=item C<match>
+
+Returns the next file which matches, false if there are no more.
+
+=cut
+
+sub match {
+ my $self = _force_object shift;
+
+ return shift @{ $self->{iterator} };
+}
+
+1;
+
+__END__
+
+=back
+
+=head2 Extensions
+
+Extension modules are available from CPAN in the File::Find::Rule
+namespace. In order to use these extensions either use them directly:
+
+ use File::Find::Rule::ImageSize;
+ use File::Find::Rule::MMagic;
+
+ # now your rules can use the clauses supplied by the ImageSize and
+ # MMagic extension
+
+or, specify that File::Find::Rule should load them for you:
+
+ use File::Find::Rule qw( :ImageSize :MMagic );
+
+For notes on implementing your own extensions, consult
+L<File::Find::Rule::Extending>
+
+=head2 Further examples
+
+=over
+
+=item Finding perl scripts
+
+ my $finder = File::Find::Rule->or
+ (
+ File::Find::Rule->name( '*.pl' ),
+ File::Find::Rule->exec(
+ sub {
+ if (open my $fh, $_) {
+ my $shebang = <$fh>;
+ close $fh;
+ return $shebang =~ /^#!.*\bperl/;
+ }
+ return 0;
+ } ),
+ );
+
+Based upon this message http://use.perl.org/comments.pl?sid=7052&cid=10842
+
+=item ignore CVS directories
+
+ my $rule = File::Find::Rule->new;
+ $rule->or($rule->new
+ ->directory
+ ->name('CVS')
+ ->prune
+ ->discard,
+ $rule->new);
+
+Note here the use of a null rule. Null rules match anything they see,
+so the effect is to match (and discard) directories called 'CVS' or to
+match anything.
+
+=back
+
+=head1 TWO FOR THE PRICE OF ONE
+
+File::Find::Rule also gives you a procedural interface. This is
+documented in L<File::Find::Rule::Procedural>
+
+=head1 EXPORTS
+
+L</find>, L</rule>
+
+=head1 TAINT MODE INTERACTION
+
+As of 0.32 File::Find::Rule doesn't capture the current working directory in
+a taint-unsafe manner. File::Find itself still does operations that the taint
+system will flag as insecure but you can use the L</extras> feature to ask
+L<File::Find> to internally C<untaint> file paths with a regex like so:
+
+ my $rule = File::Find::Rule->extras({ untaint => 1 });
+
+Please consult L<File::Find>'s documentation for C<untaint>,
+C<untaint_pattern>, and C<untaint_skip> for more information.
+
+=head1 BUGS
+
+The code makes use of the C<our> keyword and as such requires perl version
+5.6.0 or newer.
+
+Currently it isn't possible to remove a clause from a rule object. If
+this becomes a significant issue it will be addressed.
+
+=head1 AUTHOR
+
+Richard Clamp <richardc@unixbeard.net> with input gained from this
+use.perl discussion: http://use.perl.org/~richardc/journal/6467
+
+Additional proofreading and input provided by Kake, Greg McCarroll,
+and Andy Lester andy@petdance.com.
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002, 2003, 2004, 2006, 2009 Richard Clamp. All Rights Reserved.
+
+This module is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<File::Find>, L<Text::Glob>, L<Number::Compare>, find(1)
+
+If you want to know about the procedural interface, see
+L<File::Find::Rule::Procedural>, and if you have an idea for a neat
+extension L<File::Find::Rule::Extending>
+
+=cut
+
+Implementation notes:
+
+$self->rules is an array of hashrefs. it may be a code fragment or a call
+to a subroutine.
+
+Anonymous subroutines are stored in the $self->subs hashref keyed on the
+stringfied version of the coderef.
+
+When one File::Find::Rule object is combined with another, such as in the any
+and not operations, this entire hash is merged.
+
+The _compile method walks the rules element and simply glues the code
+fragments together so they can be compiled into an anyonymous File::Find
+match sub for speed
+
+
+[*] There's probably a win to be made with the current model in making
+stat calls use C<_>. For
+
+ find( file => size => "> 20M" => size => "< 400M" );
+
+up to 3 stats will happen for each candidate. Adding a priming _
+would be a bit blind if the first operation was C< name => 'foo' >,
+since that can be tested by a single regex. Simply checking what the
+next type of operation doesn't work since any arbritary exec sub may
+or may not stat. Potentially worse, they could stat something else
+like so:
+
+ # extract from the worlds stupidest make(1)
+ find( exec => sub { my $f = $_; $f =~ s/\.c$/.o/ && !-e $f } );
+
+Maybe the best way is to treat C<_> as invalid after calling an exec,
+and doc that C<_> will only be meaningful after stat and -X tests if
+they're wanted in exec blocks.
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Find/Rule/Extending.pod b/Master/tlpkg/tlperl.straw/lib/File/Find/Rule/Extending.pod
new file mode 100755
index 00000000000..71378593b0d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Find/Rule/Extending.pod
@@ -0,0 +1,91 @@
+=head1 NAME
+
+File::Find::Rule::Extending - the mini-guide to extending File::Find::Rule
+
+=head1 SYNOPSIS
+
+ package File::Find::Rule::Random;
+ use strict;
+
+ # take useful things from File::Find::Rule
+ use base 'File::Find::Rule';
+
+ # and force our crack into the main namespace
+ sub File::Find::Rule::random () {
+ my $self = shift()->_force_object;
+ $self->exec( sub { rand > 0.5 } );
+ }
+
+ 1;
+
+=head1 DESCRIPTION
+
+File::Find::Rule went down so well with the buying public that
+everyone wanted to add extra features. With the 0.07 release this
+became a possibility, using the following conventions.
+
+=head2 Declare your package
+
+ package File::Find::Rule::Random;
+ use strict;
+
+=head2 Inherit methods from File::Find::Rule
+
+ # take useful things from File::Find::Rule
+ use base 'File::Find::Rule';
+
+=head3 Force your madness into the main package
+
+ # and force our crack into the main namespace
+ sub File::Find::Rule::random () {
+ my $self = shift()->_force_object;
+ $self->exec( sub { rand > 0.5 } );
+ }
+
+
+Yes, we're being very cavalier here and defining things into the main
+File::Find::Rule namespace. This is due to lack of imaginiation on my
+part - I simply can't find a way for the functional and oo interface
+to work without doing this or some kind of inheritance, and
+inheritance stops you using two File::Find::Rule::Foo modules
+together.
+
+For this reason try and pick distinct names for your extensions. If
+this becomes a problem then I may institute a semi-official registry
+of taken names.
+
+=head2 Taking no arguments.
+
+Note the null prototype on random. This is a cheat for the procedural
+interface to know that your sub takes no arguments, and so allows this
+to happen:
+
+ find( random => in => '.' );
+
+If you hadn't declared C<random> with a null prototype it would have
+consumed C<in> as a parameter to it, then got all confused as it
+doesn't know about a C<'.'> rule.
+
+=head1 AUTHOR
+
+Richard Clamp <richardc@unixbeard.net>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002 Richard Clamp. All Rights Reserved.
+
+This module is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<File::Find::Rule>
+
+L<File::Find::Rule::MMagic> was the first extension module, so maybe
+check that out.
+
+=cut
+
+
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Find/Rule/Procedural.pod b/Master/tlpkg/tlperl.straw/lib/File/Find/Rule/Procedural.pod
new file mode 100755
index 00000000000..09eeadd01b2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Find/Rule/Procedural.pod
@@ -0,0 +1,72 @@
+=head1 NAME
+
+File::Find::Rule::Procedural - File::Find::Rule's procedural interface
+
+=head1 SYNOPSIS
+
+ use File::Find::Rule;
+
+ # find all .pm files, procedurally
+ my @files = find(file => name => '*.pm', in => \@INC);
+
+=head1 DESCRIPTION
+
+In addition to the regular object-oriented interface,
+L<File::Find::Rule> provides two subroutines for you to use.
+
+=over
+
+=item C<find( @clauses )>
+
+=item C<rule( @clauses )>
+
+C<find> and C<rule> can be used to invoke any methods available to the
+OO version. C<rule> is a synonym for C<find>
+
+=back
+
+Passing more than one value to a clause is done with an anonymous
+array:
+
+ my $finder = find( name => [ '*.mp3', '*.ogg' ] );
+
+C<find> and C<rule> both return a File::Find::Rule instance, unless
+one of the arguments is C<in>, in which case it returns a list of
+things that match the rule.
+
+ my @files = find( name => [ '*.mp3', '*.ogg' ], in => $ENV{HOME} );
+
+Please note that C<in> will be the last clause evaluated, and so this
+code will search for mp3s regardless of size.
+
+ my @files = find( name => '*.mp3', in => $ENV{HOME}, size => '<2k' );
+ ^
+ |
+ Clause processing stopped here ------/
+
+It is also possible to invert a single rule by prefixing it with C<!>
+like so:
+
+ # large files that aren't videos
+ my @files = find( file =>
+ '!name' => [ '*.avi', '*.mov' ],
+ size => '>20M',
+ in => $ENV{HOME} );
+
+
+=head1 AUTHOR
+
+Richard Clamp <richardc@unixbeard.net>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2003 Richard Clamp. All Rights Reserved.
+
+This module is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<File::Find::Rule>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Glob.pm b/Master/tlpkg/tlperl.straw/lib/File/Glob.pm
new file mode 100755
index 00000000000..15d4adb6bbe
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Glob.pm
@@ -0,0 +1,496 @@
+package File::Glob;
+
+use strict;
+our($VERSION, @ISA, @EXPORT_OK, @EXPORT_FAIL, %EXPORT_TAGS,
+ $AUTOLOAD, $DEFAULT_FLAGS);
+
+use XSLoader ();
+
+@ISA = qw(Exporter);
+
+# NOTE: The glob() export is only here for compatibility with 5.6.0.
+# csh_glob() should not be used directly, unless you know what you're doing.
+
+@EXPORT_OK = qw(
+ csh_glob
+ bsd_glob
+ glob
+ GLOB_ABEND
+ GLOB_ALPHASORT
+ GLOB_ALTDIRFUNC
+ GLOB_BRACE
+ GLOB_CSH
+ GLOB_ERR
+ GLOB_ERROR
+ GLOB_LIMIT
+ GLOB_MARK
+ GLOB_NOCASE
+ GLOB_NOCHECK
+ GLOB_NOMAGIC
+ GLOB_NOSORT
+ GLOB_NOSPACE
+ GLOB_QUOTE
+ GLOB_TILDE
+);
+
+%EXPORT_TAGS = (
+ 'glob' => [ qw(
+ GLOB_ABEND
+ GLOB_ALPHASORT
+ GLOB_ALTDIRFUNC
+ GLOB_BRACE
+ GLOB_CSH
+ GLOB_ERR
+ GLOB_ERROR
+ GLOB_LIMIT
+ GLOB_MARK
+ GLOB_NOCASE
+ GLOB_NOCHECK
+ GLOB_NOMAGIC
+ GLOB_NOSORT
+ GLOB_NOSPACE
+ GLOB_QUOTE
+ GLOB_TILDE
+ glob
+ bsd_glob
+ ) ],
+);
+
+$VERSION = '1.06';
+
+sub import {
+ require Exporter;
+ my $i = 1;
+ while ($i < @_) {
+ if ($_[$i] =~ /^:(case|nocase|globally)$/) {
+ splice(@_, $i, 1);
+ $DEFAULT_FLAGS &= ~GLOB_NOCASE() if $1 eq 'case';
+ $DEFAULT_FLAGS |= GLOB_NOCASE() if $1 eq 'nocase';
+ if ($1 eq 'globally') {
+ local $^W;
+ *CORE::GLOBAL::glob = \&File::Glob::csh_glob;
+ }
+ next;
+ }
+ ++$i;
+ }
+ goto &Exporter::import;
+}
+
+sub AUTOLOAD {
+ # This AUTOLOAD is used to 'autoload' constants from the constant()
+ # XS function. If a constant is not found then control is passed
+ # to the AUTOLOAD in AutoLoader.
+
+ my $constname;
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ my ($error, $val) = constant($constname);
+ if ($error) {
+ require Carp;
+ Carp::croak($error);
+ }
+ eval "sub $AUTOLOAD { $val }";
+ goto &$AUTOLOAD;
+}
+
+XSLoader::load 'File::Glob', $VERSION;
+
+# Preloaded methods go here.
+
+sub GLOB_ERROR {
+ return (constant('GLOB_ERROR'))[1];
+}
+
+sub GLOB_CSH () {
+ GLOB_BRACE()
+ | GLOB_NOMAGIC()
+ | GLOB_QUOTE()
+ | GLOB_TILDE()
+ | GLOB_ALPHASORT()
+}
+
+$DEFAULT_FLAGS = GLOB_CSH();
+if ($^O =~ /^(?:MSWin32|VMS|os2|dos|riscos|MacOS)$/) {
+ $DEFAULT_FLAGS |= GLOB_NOCASE();
+}
+
+# Autoload methods go after =cut, and are processed by the autosplit program.
+
+sub bsd_glob {
+ my ($pat,$flags) = @_;
+ $flags = $DEFAULT_FLAGS if @_ < 2;
+ return doglob($pat,$flags);
+}
+
+# File::Glob::glob() is deprecated because its prototype is different from
+# CORE::glob() (use bsd_glob() instead)
+sub glob {
+ splice @_, 1; # don't pass PL_glob_index as flags!
+ goto &bsd_glob;
+}
+
+## borrowed heavily from gsar's File::DosGlob
+my %iter;
+my %entries;
+
+sub csh_glob {
+ my $pat = shift;
+ my $cxix = shift;
+ my @pat;
+
+ # glob without args defaults to $_
+ $pat = $_ unless defined $pat;
+
+ # extract patterns
+ $pat =~ s/^\s+//; # Protect against empty elements in
+ $pat =~ s/\s+$//; # things like < *.c> and <*.c >.
+ # These alone shouldn't trigger ParseWords.
+ if ($pat =~ /\s/) {
+ # XXX this is needed for compatibility with the csh
+ # implementation in Perl. Need to support a flag
+ # to disable this behavior.
+ require Text::ParseWords;
+ @pat = Text::ParseWords::parse_line('\s+',0,$pat);
+ }
+
+ # assume global context if not provided one
+ $cxix = '_G_' unless defined $cxix;
+ $iter{$cxix} = 0 unless exists $iter{$cxix};
+
+ # if we're just beginning, do it all first
+ if ($iter{$cxix} == 0) {
+ if (@pat) {
+ $entries{$cxix} = [ map { doglob($_, $DEFAULT_FLAGS) } @pat ];
+ }
+ else {
+ $entries{$cxix} = [ doglob($pat, $DEFAULT_FLAGS) ];
+ }
+ }
+
+ # chuck it all out, quick or slow
+ if (wantarray) {
+ delete $iter{$cxix};
+ return @{delete $entries{$cxix}};
+ }
+ else {
+ if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
+ return shift @{$entries{$cxix}};
+ }
+ else {
+ # return undef for EOL
+ delete $iter{$cxix};
+ delete $entries{$cxix};
+ return undef;
+ }
+ }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+File::Glob - Perl extension for BSD glob routine
+
+=head1 SYNOPSIS
+
+ use File::Glob ':glob';
+
+ @list = bsd_glob('*.[ch]');
+ $homedir = bsd_glob('~gnat', GLOB_TILDE | GLOB_ERR);
+
+ if (GLOB_ERROR) {
+ # an error occurred reading $homedir
+ }
+
+ ## override the core glob (CORE::glob() does this automatically
+ ## by default anyway, since v5.6.0)
+ use File::Glob ':globally';
+ my @sources = <*.{c,h,y}>;
+
+ ## override the core glob, forcing case sensitivity
+ use File::Glob qw(:globally :case);
+ my @sources = <*.{c,h,y}>;
+
+ ## override the core glob forcing case insensitivity
+ use File::Glob qw(:globally :nocase);
+ my @sources = <*.{c,h,y}>;
+
+ ## glob on all files in home directory
+ use File::Glob ':globally';
+ my @sources = <~gnat/*>;
+
+=head1 DESCRIPTION
+
+The glob angle-bracket operator C<< <> >> is a pathname generator that
+implements the rules for file name pattern matching used by Unix-like shells
+such as the Bourne shell or C shell.
+
+File::Glob::bsd_glob() implements the FreeBSD glob(3) routine, which is
+a superset of the POSIX glob() (described in IEEE Std 1003.2 "POSIX.2").
+bsd_glob() takes a mandatory C<pattern> argument, and an optional
+C<flags> argument, and returns a list of filenames matching the
+pattern, with interpretation of the pattern modified by the C<flags>
+variable.
+
+Since v5.6.0, Perl's CORE::glob() is implemented in terms of bsd_glob().
+Note that they don't share the same prototype--CORE::glob() only accepts
+a single argument. Due to historical reasons, CORE::glob() will also
+split its argument on whitespace, treating it as multiple patterns,
+whereas bsd_glob() considers them as one pattern.
+
+=head2 META CHARACTERS
+
+ \ Quote the next metacharacter
+ [] Character class
+ {} Multiple pattern
+ * Match any string of characters
+ ? Match any single character
+ ~ User name home directory
+
+The metanotation C<a{b,c,d}e> is a shorthand for C<abe ace ade>. Left to
+right order is preserved, with results of matches being sorted separately
+at a low level to preserve this order. As a special case C<{>, C<}>, and
+C<{}> are passed undisturbed.
+
+=head2 POSIX FLAGS
+
+The POSIX defined flags for bsd_glob() are:
+
+=over 4
+
+=item C<GLOB_ERR>
+
+Force bsd_glob() to return an error when it encounters a directory it
+cannot open or read. Ordinarily bsd_glob() continues to find matches.
+
+=item C<GLOB_LIMIT>
+
+Make bsd_glob() return an error (GLOB_NOSPACE) when the pattern expands
+to a size bigger than the system constant C<ARG_MAX> (usually found in
+limits.h). If your system does not define this constant, bsd_glob() uses
+C<sysconf(_SC_ARG_MAX)> or C<_POSIX_ARG_MAX> where available (in that
+order). You can inspect these values using the standard C<POSIX>
+extension.
+
+=item C<GLOB_MARK>
+
+Each pathname that is a directory that matches the pattern has a slash
+appended.
+
+=item C<GLOB_NOCASE>
+
+By default, file names are assumed to be case sensitive; this flag
+makes bsd_glob() treat case differences as not significant.
+
+=item C<GLOB_NOCHECK>
+
+If the pattern does not match any pathname, then bsd_glob() returns a list
+consisting of only the pattern. If C<GLOB_QUOTE> is set, its effect
+is present in the pattern returned.
+
+=item C<GLOB_NOSORT>
+
+By default, the pathnames are sorted in ascending ASCII order; this
+flag prevents that sorting (speeding up bsd_glob()).
+
+=back
+
+The FreeBSD extensions to the POSIX standard are the following flags:
+
+=over 4
+
+=item C<GLOB_BRACE>
+
+Pre-process the string to expand C<{pat,pat,...}> strings like csh(1).
+The pattern '{}' is left unexpanded for historical reasons (and csh(1)
+does the same thing to ease typing of find(1) patterns).
+
+=item C<GLOB_NOMAGIC>
+
+Same as C<GLOB_NOCHECK> but it only returns the pattern if it does not
+contain any of the special characters "*", "?" or "[". C<NOMAGIC> is
+provided to simplify implementing the historic csh(1) globbing
+behaviour and should probably not be used anywhere else.
+
+=item C<GLOB_QUOTE>
+
+Use the backslash ('\') character for quoting: every occurrence of a
+backslash followed by a character in the pattern is replaced by that
+character, avoiding any special interpretation of the character.
+(But see below for exceptions on DOSISH systems).
+
+=item C<GLOB_TILDE>
+
+Expand patterns that start with '~' to user name home directories.
+
+=item C<GLOB_CSH>
+
+For convenience, C<GLOB_CSH> is a synonym for
+C<GLOB_BRACE | GLOB_NOMAGIC | GLOB_QUOTE | GLOB_TILDE | GLOB_ALPHASORT>.
+
+=back
+
+The POSIX provided C<GLOB_APPEND>, C<GLOB_DOOFFS>, and the FreeBSD
+extensions C<GLOB_ALTDIRFUNC>, and C<GLOB_MAGCHAR> flags have not been
+implemented in the Perl version because they involve more complex
+interaction with the underlying C structures.
+
+The following flag has been added in the Perl implementation for
+csh compatibility:
+
+=over 4
+
+=item C<GLOB_ALPHASORT>
+
+If C<GLOB_NOSORT> is not in effect, sort filenames is alphabetical
+order (case does not matter) rather than in ASCII order.
+
+=back
+
+=head1 DIAGNOSTICS
+
+bsd_glob() returns a list of matching paths, possibly zero length. If an
+error occurred, &File::Glob::GLOB_ERROR will be non-zero and C<$!> will be
+set. &File::Glob::GLOB_ERROR is guaranteed to be zero if no error occurred,
+or one of the following values otherwise:
+
+=over 4
+
+=item C<GLOB_NOSPACE>
+
+An attempt to allocate memory failed.
+
+=item C<GLOB_ABEND>
+
+The glob was stopped because an error was encountered.
+
+=back
+
+In the case where bsd_glob() has found some matching paths, but is
+interrupted by an error, it will return a list of filenames B<and>
+set &File::Glob::ERROR.
+
+Note that bsd_glob() deviates from POSIX and FreeBSD glob(3) behaviour
+by not considering C<ENOENT> and C<ENOTDIR> as errors - bsd_glob() will
+continue processing despite those errors, unless the C<GLOB_ERR> flag is
+set.
+
+Be aware that all filenames returned from File::Glob are tainted.
+
+=head1 NOTES
+
+=over 4
+
+=item *
+
+If you want to use multiple patterns, e.g. C<bsd_glob("a* b*")>, you should
+probably throw them in a set as in C<bsd_glob("{a*,b*}")>. This is because
+the argument to bsd_glob() isn't subjected to parsing by the C shell.
+Remember that you can use a backslash to escape things.
+
+=item *
+
+On DOSISH systems, backslash is a valid directory separator character.
+In this case, use of backslash as a quoting character (via GLOB_QUOTE)
+interferes with the use of backslash as a directory separator. The
+best (simplest, most portable) solution is to use forward slashes for
+directory separators, and backslashes for quoting. However, this does
+not match "normal practice" on these systems. As a concession to user
+expectation, therefore, backslashes (under GLOB_QUOTE) only quote the
+glob metacharacters '[', ']', '{', '}', '-', '~', and backslash itself.
+All other backslashes are passed through unchanged.
+
+=item *
+
+Win32 users should use the real slash. If you really want to use
+backslashes, consider using Sarathy's File::DosGlob, which comes with
+the standard Perl distribution.
+
+=item *
+
+Mac OS (Classic) users should note a few differences. Since
+Mac OS is not Unix, when the glob code encounters a tilde glob (e.g.
+~user) and the C<GLOB_TILDE> flag is used, it simply returns that
+pattern without doing any expansion.
+
+Glob on Mac OS is case-insensitive by default (if you don't use any
+flags). If you specify any flags at all and still want glob
+to be case-insensitive, you must include C<GLOB_NOCASE> in the flags.
+
+The path separator is ':' (aka colon), not '/' (aka slash). Mac OS users
+should be careful about specifying relative pathnames. While a full path
+always begins with a volume name, a relative pathname should always
+begin with a ':'. If specifying a volume name only, a trailing ':' is
+required.
+
+The specification of pathnames in glob patterns adheres to the usual Mac
+OS conventions: The path separator is a colon ':', not a slash '/'. A
+full path always begins with a volume name. A relative pathname on Mac
+OS must always begin with a ':', except when specifying a file or
+directory name in the current working directory, where the leading colon
+is optional. If specifying a volume name only, a trailing ':' is
+required. Due to these rules, a glob like E<lt>*:E<gt> will find all
+mounted volumes, while a glob like E<lt>*E<gt> or E<lt>:*E<gt> will find
+all files and directories in the current directory.
+
+Note that updirs in the glob pattern are resolved before the matching begins,
+i.e. a pattern like "*HD:t?p::a*" will be matched as "*HD:a*". Note also,
+that a single trailing ':' in the pattern is ignored (unless it's a volume
+name pattern like "*HD:"), i.e. a glob like E<lt>:*:E<gt> will find both
+directories I<and> files (and not, as one might expect, only directories).
+You can, however, use the C<GLOB_MARK> flag to distinguish (without a file
+test) directory names from file names.
+
+If the C<GLOB_MARK> flag is set, all directory paths will have a ':' appended.
+Since a directory like 'lib:' is I<not> a valid I<relative> path on Mac OS,
+both a leading and a trailing colon will be added, when the directory name in
+question doesn't contain any colons (e.g. 'lib' becomes ':lib:').
+
+=back
+
+=head1 SEE ALSO
+
+L<perlfunc/glob>, glob(3)
+
+=head1 AUTHOR
+
+The Perl interface was written by Nathan Torkington E<lt>gnat@frii.comE<gt>,
+and is released under the artistic license. Further modifications were
+made by Greg Bacon E<lt>gbacon@cs.uah.eduE<gt>, Gurusamy Sarathy
+E<lt>gsar@activestate.comE<gt>, and Thomas Wegner
+E<lt>wegner_thomas@yahoo.comE<gt>. The C glob code has the
+following copyright:
+
+ Copyright (c) 1989, 1993 The Regents of the University of California.
+ All rights reserved.
+
+ This code is derived from software contributed to Berkeley by
+ Guido van Rossum.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/GlobMapper.pm b/Master/tlpkg/tlperl.straw/lib/File/GlobMapper.pm
new file mode 100755
index 00000000000..40a606309e0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/GlobMapper.pm
@@ -0,0 +1,679 @@
+package File::GlobMapper;
+
+use strict;
+use warnings;
+use Carp;
+
+our ($CSH_GLOB);
+
+BEGIN
+{
+ if ($] < 5.006)
+ {
+ require File::BSDGlob; import File::BSDGlob qw(:glob) ;
+ $CSH_GLOB = File::BSDGlob::GLOB_CSH() ;
+ *globber = \&File::BSDGlob::csh_glob;
+ }
+ else
+ {
+ require File::Glob; import File::Glob qw(:glob) ;
+ $CSH_GLOB = File::Glob::GLOB_CSH() ;
+ #*globber = \&File::Glob::bsd_glob;
+ *globber = \&File::Glob::csh_glob;
+ }
+}
+
+our ($Error);
+
+our ($VERSION, @EXPORT_OK);
+$VERSION = '1.000';
+@EXPORT_OK = qw( globmap );
+
+
+our ($noPreBS, $metachars, $matchMetaRE, %mapping, %wildCount);
+$noPreBS = '(?<!\\\)' ; # no preceeding backslash
+$metachars = '.*?[](){}';
+$matchMetaRE = '[' . quotemeta($metachars) . ']';
+
+%mapping = (
+ '*' => '([^/]*)',
+ '?' => '([^/])',
+ '.' => '\.',
+ '[' => '([',
+ '(' => '(',
+ ')' => ')',
+ );
+
+%wildCount = map { $_ => 1 } qw/ * ? . { ( [ /;
+
+sub globmap ($$;)
+{
+ my $inputGlob = shift ;
+ my $outputGlob = shift ;
+
+ my $obj = new File::GlobMapper($inputGlob, $outputGlob, @_)
+ or croak "globmap: $Error" ;
+ return $obj->getFileMap();
+}
+
+sub new
+{
+ my $class = shift ;
+ my $inputGlob = shift ;
+ my $outputGlob = shift ;
+ # TODO -- flags needs to default to whatever File::Glob does
+ my $flags = shift || $CSH_GLOB ;
+ #my $flags = shift ;
+
+ $inputGlob =~ s/^\s*\<\s*//;
+ $inputGlob =~ s/\s*\>\s*$//;
+
+ $outputGlob =~ s/^\s*\<\s*//;
+ $outputGlob =~ s/\s*\>\s*$//;
+
+ my %object =
+ ( InputGlob => $inputGlob,
+ OutputGlob => $outputGlob,
+ GlobFlags => $flags,
+ Braces => 0,
+ WildCount => 0,
+ Pairs => [],
+ Sigil => '#',
+ );
+
+ my $self = bless \%object, ref($class) || $class ;
+
+ $self->_parseInputGlob()
+ or return undef ;
+
+ $self->_parseOutputGlob()
+ or return undef ;
+
+ my @inputFiles = globber($self->{InputGlob}, $flags) ;
+
+ if (GLOB_ERROR)
+ {
+ $Error = $!;
+ return undef ;
+ }
+
+ #if (whatever)
+ {
+ my $missing = grep { ! -e $_ } @inputFiles ;
+
+ if ($missing)
+ {
+ $Error = "$missing input files do not exist";
+ return undef ;
+ }
+ }
+
+ $self->{InputFiles} = \@inputFiles ;
+
+ $self->_getFiles()
+ or return undef ;
+
+ return $self;
+}
+
+sub _retError
+{
+ my $string = shift ;
+ $Error = "$string in input fileglob" ;
+ return undef ;
+}
+
+sub _unmatched
+{
+ my $delimeter = shift ;
+
+ _retError("Unmatched $delimeter");
+ return undef ;
+}
+
+sub _parseBit
+{
+ my $self = shift ;
+
+ my $string = shift ;
+
+ my $out = '';
+ my $depth = 0 ;
+
+ while ($string =~ s/(.*?)$noPreBS(,|$matchMetaRE)//)
+ {
+ $out .= quotemeta($1) ;
+ $out .= $mapping{$2} if defined $mapping{$2};
+
+ ++ $self->{WildCount} if $wildCount{$2} ;
+
+ if ($2 eq ',')
+ {
+ return _unmatched "("
+ if $depth ;
+
+ $out .= '|';
+ }
+ elsif ($2 eq '(')
+ {
+ ++ $depth ;
+ }
+ elsif ($2 eq ')')
+ {
+ return _unmatched ")"
+ if ! $depth ;
+
+ -- $depth ;
+ }
+ elsif ($2 eq '[')
+ {
+ # TODO -- quotemeta & check no '/'
+ # TODO -- check for \] & other \ within the []
+ $string =~ s#(.*?\])##
+ or return _unmatched "[" ;
+ $out .= "$1)" ;
+ }
+ elsif ($2 eq ']')
+ {
+ return _unmatched "]" ;
+ }
+ elsif ($2 eq '{' || $2 eq '}')
+ {
+ return _retError "Nested {} not allowed" ;
+ }
+ }
+
+ $out .= quotemeta $string;
+
+ return _unmatched "("
+ if $depth ;
+
+ return $out ;
+}
+
+sub _parseInputGlob
+{
+ my $self = shift ;
+
+ my $string = $self->{InputGlob} ;
+ my $inGlob = '';
+
+ # Multiple concatenated *'s don't make sense
+ #$string =~ s#\*\*+#*# ;
+
+ # TODO -- Allow space to delimit patterns?
+ #my @strings = split /\s+/, $string ;
+ #for my $str (@strings)
+ my $out = '';
+ my $depth = 0 ;
+
+ while ($string =~ s/(.*?)$noPreBS($matchMetaRE)//)
+ {
+ $out .= quotemeta($1) ;
+ $out .= $mapping{$2} if defined $mapping{$2};
+ ++ $self->{WildCount} if $wildCount{$2} ;
+
+ if ($2 eq '(')
+ {
+ ++ $depth ;
+ }
+ elsif ($2 eq ')')
+ {
+ return _unmatched ")"
+ if ! $depth ;
+
+ -- $depth ;
+ }
+ elsif ($2 eq '[')
+ {
+ # TODO -- quotemeta & check no '/' or '(' or ')'
+ # TODO -- check for \] & other \ within the []
+ $string =~ s#(.*?\])##
+ or return _unmatched "[";
+ $out .= "$1)" ;
+ }
+ elsif ($2 eq ']')
+ {
+ return _unmatched "]" ;
+ }
+ elsif ($2 eq '}')
+ {
+ return _unmatched "}" ;
+ }
+ elsif ($2 eq '{')
+ {
+ # TODO -- check no '/' within the {}
+ # TODO -- check for \} & other \ within the {}
+
+ my $tmp ;
+ unless ( $string =~ s/(.*?)$noPreBS\}//)
+ {
+ return _unmatched "{";
+ }
+ #$string =~ s#(.*?)\}##;
+
+ #my $alt = join '|',
+ # map { quotemeta $_ }
+ # split "$noPreBS,", $1 ;
+ my $alt = $self->_parseBit($1);
+ defined $alt or return 0 ;
+ $out .= "($alt)" ;
+
+ ++ $self->{Braces} ;
+ }
+ }
+
+ return _unmatched "("
+ if $depth ;
+
+ $out .= quotemeta $string ;
+
+
+ $self->{InputGlob} =~ s/$noPreBS[\(\)]//g;
+ $self->{InputPattern} = $out ;
+
+ #print "# INPUT '$self->{InputGlob}' => '$out'\n";
+
+ return 1 ;
+
+}
+
+sub _parseOutputGlob
+{
+ my $self = shift ;
+
+ my $string = $self->{OutputGlob} ;
+ my $maxwild = $self->{WildCount};
+
+ if ($self->{GlobFlags} & GLOB_TILDE)
+ #if (1)
+ {
+ $string =~ s{
+ ^ ~ # find a leading tilde
+ ( # save this in $1
+ [^/] # a non-slash character
+ * # repeated 0 or more times (0 means me)
+ )
+ }{
+ $1
+ ? (getpwnam($1))[7]
+ : ( $ENV{HOME} || $ENV{LOGDIR} )
+ }ex;
+
+ }
+
+ # max #1 must be == to max no of '*' in input
+ while ( $string =~ m/#(\d)/g )
+ {
+ croak "Max wild is #$maxwild, you tried #$1"
+ if $1 > $maxwild ;
+ }
+
+ my $noPreBS = '(?<!\\\)' ; # no preceeding backslash
+ #warn "noPreBS = '$noPreBS'\n";
+
+ #$string =~ s/${noPreBS}\$(\d)/\${$1}/g;
+ $string =~ s/${noPreBS}#(\d)/\${$1}/g;
+ $string =~ s#${noPreBS}\*#\${inFile}#g;
+ $string = '"' . $string . '"';
+
+ #print "OUTPUT '$self->{OutputGlob}' => '$string'\n";
+ $self->{OutputPattern} = $string ;
+
+ return 1 ;
+}
+
+sub _getFiles
+{
+ my $self = shift ;
+
+ my %outInMapping = ();
+ my %inFiles = () ;
+
+ foreach my $inFile (@{ $self->{InputFiles} })
+ {
+ next if $inFiles{$inFile} ++ ;
+
+ my $outFile = $inFile ;
+
+ if ( $inFile =~ m/$self->{InputPattern}/ )
+ {
+ no warnings 'uninitialized';
+ eval "\$outFile = $self->{OutputPattern};" ;
+
+ if (defined $outInMapping{$outFile})
+ {
+ $Error = "multiple input files map to one output file";
+ return undef ;
+ }
+ $outInMapping{$outFile} = $inFile;
+ push @{ $self->{Pairs} }, [$inFile, $outFile];
+ }
+ }
+
+ return 1 ;
+}
+
+sub getFileMap
+{
+ my $self = shift ;
+
+ return $self->{Pairs} ;
+}
+
+sub getHash
+{
+ my $self = shift ;
+
+ return { map { $_->[0] => $_->[1] } @{ $self->{Pairs} } } ;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+File::GlobMapper - Extend File Glob to Allow Input and Output Files
+
+=head1 SYNOPSIS
+
+ use File::GlobMapper qw( globmap );
+
+ my $aref = globmap $input => $output
+ or die $File::GlobMapper::Error ;
+
+ my $gm = new File::GlobMapper $input => $output
+ or die $File::GlobMapper::Error ;
+
+
+=head1 DESCRIPTION
+
+This module needs Perl5.005 or better.
+
+This module takes the existing C<File::Glob> module as a starting point and
+extends it to allow new filenames to be derived from the files matched by
+C<File::Glob>.
+
+This can be useful when carrying out batch operations on multiple files that
+have both an input filename and output filename and the output file can be
+derived from the input filename. Examples of operations where this can be
+useful include, file renaming, file copying and file compression.
+
+
+=head2 Behind The Scenes
+
+To help explain what C<File::GlobMapper> does, consider what code you
+would write if you wanted to rename all files in the current directory
+that ended in C<.tar.gz> to C<.tgz>. So say these files are in the
+current directory
+
+ alpha.tar.gz
+ beta.tar.gz
+ gamma.tar.gz
+
+and they need renamed to this
+
+ alpha.tgz
+ beta.tgz
+ gamma.tgz
+
+Below is a possible implementation of a script to carry out the rename
+(error cases have been omitted)
+
+ foreach my $old ( glob "*.tar.gz" )
+ {
+ my $new = $old;
+ $new =~ s#(.*)\.tar\.gz$#$1.tgz# ;
+
+ rename $old => $new
+ or die "Cannot rename '$old' to '$new': $!\n;
+ }
+
+Notice that a file glob pattern C<*.tar.gz> was used to match the
+C<.tar.gz> files, then a fairly similar regular expression was used in
+the substitute to allow the new filename to be created.
+
+Given that the file glob is just a cut-down regular expression and that it
+has already done a lot of the hard work in pattern matching the filenames,
+wouldn't it be handy to be able to use the patterns in the fileglob to
+drive the new filename?
+
+Well, that's I<exactly> what C<File::GlobMapper> does.
+
+Here is same snippet of code rewritten using C<globmap>
+
+ for my $pair (globmap '<*.tar.gz>' => '<#1.tgz>' )
+ {
+ my ($from, $to) = @$pair;
+ rename $from => $to
+ or die "Cannot rename '$old' to '$new': $!\n;
+ }
+
+So how does it work?
+
+Behind the scenes the C<globmap> function does a combination of a
+file glob to match existing filenames followed by a substitute
+to create the new filenames.
+
+Notice how both parameters to C<globmap> are strings that are delimited by <>.
+This is done to make them look more like file globs - it is just syntactic
+sugar, but it can be handy when you want the strings to be visually
+distinctive. The enclosing <> are optional, so you don't have to use them - in
+fact the first thing globmap will do is remove these delimiters if they are
+present.
+
+The first parameter to C<globmap>, C<*.tar.gz>, is an I<Input File Glob>.
+Once the enclosing "< ... >" is removed, this is passed (more or
+less) unchanged to C<File::Glob> to carry out a file match.
+
+Next the fileglob C<*.tar.gz> is transformed behind the scenes into a
+full Perl regular expression, with the additional step of wrapping each
+transformed wildcard metacharacter sequence in parenthesis.
+
+In this case the input fileglob C<*.tar.gz> will be transformed into
+this Perl regular expression
+
+ ([^/]*)\.tar\.gz
+
+Wrapping with parenthesis allows the wildcard parts of the Input File
+Glob to be referenced by the second parameter to C<globmap>, C<#1.tgz>,
+the I<Output File Glob>. This parameter operates just like the replacement
+part of a substitute command. The difference is that the C<#1> syntax
+is used to reference sub-patterns matched in the input fileglob, rather
+than the C<$1> syntax that is used with perl regular expressions. In
+this case C<#1> is used to refer to the text matched by the C<*> in the
+Input File Glob. This makes it easier to use this module where the
+parameters to C<globmap> are typed at the command line.
+
+The final step involves passing each filename matched by the C<*.tar.gz>
+file glob through the derived Perl regular expression in turn and
+expanding the output fileglob using it.
+
+The end result of all this is a list of pairs of filenames. By default
+that is what is returned by C<globmap>. In this example the data structure
+returned will look like this
+
+ ( ['alpha.tar.gz' => 'alpha.tgz'],
+ ['beta.tar.gz' => 'beta.tgz' ],
+ ['gamma.tar.gz' => 'gamma.tgz']
+ )
+
+
+Each pair is an array reference with two elements - namely the I<from>
+filename, that C<File::Glob> has matched, and a I<to> filename that is
+derived from the I<from> filename.
+
+
+
+=head2 Limitations
+
+C<File::GlobMapper> has been kept simple deliberately, so it isn't intended to
+solve all filename mapping operations. Under the hood C<File::Glob> (or for
+older versions of Perl, C<File::BSDGlob>) is used to match the files, so you
+will never have the flexibility of full Perl regular expression.
+
+=head2 Input File Glob
+
+The syntax for an Input FileGlob is identical to C<File::Glob>, except
+for the following
+
+=over 5
+
+=item 1.
+
+No nested {}
+
+=item 2.
+
+Whitespace does not delimit fileglobs.
+
+=item 3.
+
+The use of parenthesis can be used to capture parts of the input filename.
+
+=item 4.
+
+If an Input glob matches the same file more than once, only the first
+will be used.
+
+=back
+
+The syntax
+
+=over 5
+
+=item B<~>
+
+=item B<~user>
+
+
+=item B<.>
+
+Matches a literal '.'.
+Equivalent to the Perl regular expression
+
+ \.
+
+=item B<*>
+
+Matches zero or more characters, except '/'. Equivalent to the Perl
+regular expression
+
+ [^/]*
+
+=item B<?>
+
+Matches zero or one character, except '/'. Equivalent to the Perl
+regular expression
+
+ [^/]?
+
+=item B<\>
+
+Backslash is used, as usual, to escape the next character.
+
+=item B<[]>
+
+Character class.
+
+=item B<{,}>
+
+Alternation
+
+=item B<()>
+
+Capturing parenthesis that work just like perl
+
+=back
+
+Any other character it taken literally.
+
+=head2 Output File Glob
+
+The Output File Glob is a normal string, with 2 glob-like features.
+
+The first is the '*' metacharacter. This will be replaced by the complete
+filename matched by the input file glob. So
+
+ *.c *.Z
+
+The second is
+
+Output FileGlobs take the
+
+=over 5
+
+=item "*"
+
+The "*" character will be replaced with the complete input filename.
+
+=item #1
+
+Patterns of the form /#\d/ will be replaced with the
+
+=back
+
+=head2 Returned Data
+
+
+=head1 EXAMPLES
+
+=head2 A Rename script
+
+Below is a simple "rename" script that uses C<globmap> to determine the
+source and destination filenames.
+
+ use File::GlobMapper qw(globmap) ;
+ use File::Copy;
+
+ die "rename: Usage rename 'from' 'to'\n"
+ unless @ARGV == 2 ;
+
+ my $fromGlob = shift @ARGV;
+ my $toGlob = shift @ARGV;
+
+ my $pairs = globmap($fromGlob, $toGlob)
+ or die $File::GlobMapper::Error;
+
+ for my $pair (@$pairs)
+ {
+ my ($from, $to) = @$pair;
+ move $from => $to ;
+ }
+
+
+
+Here is an example that renames all c files to cpp.
+
+ $ rename '*.c' '#1.cpp'
+
+=head2 A few example globmaps
+
+Below are a few examples of globmaps
+
+To copy all your .c file to a backup directory
+
+ '</my/home/*.c>' '</my/backup/#1.c>'
+
+If you want to compress all
+
+ '</my/home/*.[ch]>' '<*.gz>'
+
+To uncompress
+
+ '</my/home/*.[ch].gz>' '</my/home/#1.#2>'
+
+=head1 SEE ALSO
+
+L<File::Glob|File::Glob>
+
+=head1 AUTHOR
+
+The I<File::GlobMapper> module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005 Paul Marquess. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir.pm
new file mode 100755
index 00000000000..d63618d2308
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir.pm
@@ -0,0 +1,633 @@
+package File::HomeDir;
+
+# See POD at end for documentation
+
+use 5.00503;
+use strict;
+use Carp ();
+use Config ();
+use File::Spec ();
+
+# Globals
+use vars qw{$VERSION @ISA @EXPORT @EXPORT_OK $IMPLEMENTED_BY};
+BEGIN {
+ $VERSION = '0.89';
+
+ # Inherit manually
+ require Exporter;
+ @ISA = qw{ Exporter };
+ @EXPORT = qw{ home };
+ @EXPORT_OK = qw{
+ home
+ my_home
+ my_desktop
+ my_documents
+ my_music
+ my_pictures
+ my_videos
+ my_data
+ users_home
+ users_desktop
+ users_documents
+ users_music
+ users_pictures
+ users_videos
+ users_data
+ };
+
+ # %~ doesn't need (and won't take) exporting, as it's a magic
+ # symbol name that's always looked for in package 'main'.
+}
+
+# Inlined Params::Util functions
+sub _CLASS ($) {
+ (defined $_[0] and ! ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s) ? $_[0] : undef;
+}
+sub _DRIVER ($$) {
+ (defined _CLASS($_[0]) and eval "require $_[0];" and ! $@ and $_[0]->isa($_[1]) and $_[0] ne $_[1]) ? $_[0] : undef;
+}
+
+# Platform detection
+if ( $IMPLEMENTED_BY ) {
+ # Allow for custom HomeDir classes
+ # Leave it as the existing value
+} elsif ( $^O eq 'MSWin32' ) {
+ # All versions of Windows
+ $IMPLEMENTED_BY = 'File::HomeDir::Windows';
+} elsif ( $^O eq 'darwin') {
+ TRY: {
+ if ( $Config::Config{ptrsize} == 8 ) {
+ # 64bit: try Mac::SystemDirectory by chansen
+ if ( eval { require Mac::SystemDirectory; 1 } ) {
+ $IMPLEMENTED_BY = 'File::HomeDir::Darwin::Cocoa';
+ last TRY;
+ }
+
+ } elsif (eval { require Mac::Files; 1 }) {
+ # 32bit and has Mac::Files: Carbon
+ $IMPLEMENTED_BY = 'File::HomeDir::Darwin::Carbon';
+ last TRY;
+ }
+
+ # fallback: pure perl
+ $IMPLEMENTED_BY = 'File::HomeDir::Darwin';
+ }
+} elsif ( $^O eq 'MacOS' ) {
+ # Legacy Mac OS
+ $IMPLEMENTED_BY = 'File::HomeDir::MacOS9';
+} else {
+ # Default to Unix semantics
+ $IMPLEMENTED_BY = 'File::HomeDir::Unix';
+}
+unless ( _DRIVER($IMPLEMENTED_BY, 'File::HomeDir::Driver') ) {
+ Carp::croak("Missing or invalid File::HomeDir driver $IMPLEMENTED_BY");
+}
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ $IMPLEMENTED_BY->my_home;
+}
+
+sub my_desktop {
+ $IMPLEMENTED_BY->can('my_desktop')
+ ? $IMPLEMENTED_BY->my_desktop
+ : Carp::croak("The my_desktop method is not implemented on this platform");
+}
+
+sub my_documents {
+ $IMPLEMENTED_BY->can('my_documents')
+ ? $IMPLEMENTED_BY->my_documents
+ : Carp::croak("The my_documents method is not implemented on this platform");
+}
+
+sub my_music {
+ $IMPLEMENTED_BY->can('my_music')
+ ? $IMPLEMENTED_BY->my_music
+ : Carp::croak("The my_music method is not implemented on this platform");
+}
+
+sub my_pictures {
+ $IMPLEMENTED_BY->can('my_pictures')
+ ? $IMPLEMENTED_BY->my_pictures
+ : Carp::croak("The my_pictures method is not implemented on this platform");
+}
+
+sub my_videos {
+ $IMPLEMENTED_BY->can('my_videos')
+ ? $IMPLEMENTED_BY->my_videos
+ : Carp::croak("The my_videos method is not implemented on this platform");
+}
+
+sub my_data {
+ $IMPLEMENTED_BY->can('my_data')
+ ? $IMPLEMENTED_BY->my_data
+ : Carp::croak("The my_data method is not implemented on this platform");
+}
+
+
+
+
+
+#####################################################################
+# General User Methods
+
+sub users_home {
+ $IMPLEMENTED_BY->can('users_home')
+ ? $IMPLEMENTED_BY->users_home( $_[-1] )
+ : Carp::croak("The users_home method is not implemented on this platform");
+}
+
+sub users_desktop {
+ $IMPLEMENTED_BY->can('users_desktop')
+ ? $IMPLEMENTED_BY->users_desktop( $_[-1] )
+ : Carp::croak("The users_desktop method is not implemented on this platform");
+}
+
+sub users_documents {
+ $IMPLEMENTED_BY->can('users_documents')
+ ? $IMPLEMENTED_BY->users_documents( $_[-1] )
+ : Carp::croak("The users_documents method is not implemented on this platform");
+}
+
+sub users_music {
+ $IMPLEMENTED_BY->can('users_music')
+ ? $IMPLEMENTED_BY->users_music( $_[-1] )
+ : Carp::croak("The users_music method is not implemented on this platform");
+}
+
+sub users_pictures {
+ $IMPLEMENTED_BY->can('users_pictures')
+ ? $IMPLEMENTED_BY->users_pictures( $_[-1] )
+ : Carp::croak("The users_pictures method is not implemented on this platform");
+}
+
+sub users_videos {
+ $IMPLEMENTED_BY->can('users_videos')
+ ? $IMPLEMENTED_BY->users_videos( $_[-1] )
+ : Carp::croak("The users_videos method is not implemented on this platform");
+}
+
+sub users_data {
+ $IMPLEMENTED_BY->can('users_data')
+ ? $IMPLEMENTED_BY->users_data( $_[-1] )
+ : Carp::croak("The users_data method is not implemented on this platform");
+}
+
+
+
+
+
+
+#####################################################################
+# Legacy Methods
+
+# Find the home directory of an arbitrary user
+sub home (;$) {
+ # Allow to be called as a method
+ if ( $_[0] and $_[0] eq 'File::HomeDir' ) {
+ shift();
+ }
+
+ # No params means my home
+ return my_home() unless @_;
+
+ # Check the param
+ my $name = shift;
+ if ( ! defined $name ) {
+ Carp::croak("Can't use undef as a username");
+ }
+ if ( ! length $name ) {
+ Carp::croak("Can't use empty-string (\"\") as a username");
+ }
+
+ # A dot also means my home
+ ### Is this meant to mean File::Spec->curdir?
+ if ( $name eq '.' ) {
+ return my_home();
+ }
+
+ # Now hand off to the implementor
+ $IMPLEMENTED_BY->users_home($name);
+}
+
+
+
+
+
+#####################################################################
+# Tie-Based Interface
+
+# Okay, things below this point get scary
+
+CLASS: {
+ # Make the class for the %~ tied hash:
+ package File::HomeDir::TIE;
+
+ # Make the singleton object.
+ # (We don't use the hash for anything, though)
+ ### THEN WHY MAKE IT???
+ my $SINGLETON = bless {};
+
+ sub TIEHASH { $SINGLETON }
+
+ sub FETCH {
+ # Catch a bad username
+ unless ( defined $_[1] ) {
+ Carp::croak("Can't use undef as a username");
+ }
+
+ # Get our homedir
+ unless ( length $_[1] ) {
+ return File::HomeDir::my_home();
+ }
+
+ # Get a named user's homedir
+ return File::HomeDir::home($_[1]);
+ }
+
+ sub STORE { _bad('STORE') }
+ sub EXISTS { _bad('EXISTS') }
+ sub DELETE { _bad('DELETE') }
+ sub CLEAR { _bad('CLEAR') }
+ sub FIRSTKEY { _bad('FIRSTKEY') }
+ sub NEXTKEY { _bad('NEXTKEY') }
+
+ sub _bad ($) {
+ Carp::croak("You can't $_[0] with the %~ hash")
+ }
+}
+
+# Do the actual tie of the global %~ variable
+tie %~, 'File::HomeDir::TIE';
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+File::HomeDir - Find your home and other directories, on any platform
+
+=head1 SYNOPSIS
+
+ use File::HomeDir;
+
+ # Modern Interface (Current User)
+ $home = File::HomeDir->my_home;
+ $desktop = File::HomeDir->my_desktop;
+ $docs = File::HomeDir->my_documents;
+ $music = File::HomeDir->my_music;
+ $pics = File::HomeDir->my_pictures;
+ $videos = File::HomeDir->my_videos;
+ $data = File::HomeDir->my_data;
+
+ # Modern Interface (Other Users)
+ $home = File::HomeDir->users_home('foo');
+ $desktop = File::HomeDir->users_desktop('foo');
+ $docs = File::HomeDir->users_documents('foo');
+ $music = File::HomeDir->users_music('foo');
+ $pics = File::HomeDir->users_pictures('foo');
+ $video = File::HomeDir->users_videos('foo');
+ $data = File::HomeDir->users_data('foo');
+
+ # Legacy Interfaces
+ print "My dir is ", home(), " and root's is ", home('root'), "\n";
+ print "My dir is $~{''} and root's is $~{root}\n";
+ # These both print the same thing, something like:
+ # "My dir is /home/user/mojo and root's is /"
+
+=head1 DESCRIPTION
+
+B<File::HomeDir> is a module for dealing with issues relating to the
+location of directories that are "owned" by a user, primarily your user,
+and to solve these issues consistently across a wide variety of
+platforms.
+
+Thus, a single API is presented that can find your resources on any
+platform.
+
+This module provides two main interfaces.
+
+The first is a modern L<File::Spec>-style interface with a consistent
+OO API and different implementation modules to support various
+platforms. You are B<strongly> recommended to use this interface.
+
+The second interface is for legacy support of the original 0.07 interface
+that exported a C<home()> function by default and tied the C<%~> variable.
+
+It is generally not recommended that you use this interface, but due to
+back-compatibility reasons they will remain supported until at least 2010.
+
+After this date, the home() function will remain, but we will consider
+deprecating the (namespace-polluting) C<%~> tied hash, to be removed by
+2015 (maintaining the general Perl convention of a 10 year support period
+for legacy APIs potentially or actually in common use).
+
+=head2 Platform Neutrality
+
+In the Unix world, many different types of data can be mixed together
+in your home directory (although on some Unix platforms this is no longer
+the case, particularly for "desktop"-oriented platforms).
+
+On some non-Unix platforms, seperate directories are allocated for
+different types of data and have been for a long time.
+
+When writing applications on top of B<File::HomeDir>, you should thus
+always try to use the most specific method you can. User documents should
+be saved in C<my_documents>, data that supports an application but isn't
+normally editing by the user directory should go into C<my_data>.
+
+On platforms that do not make any distinction, all these different
+methods will harmlessly degrade to the main home directory, but on
+platforms that care B<File::HomeDir> will always try to Do The Right
+Thing(tm).
+
+=head1 METHODS
+
+Two types of methods are provided. The C<my_method> series of methods for
+finding resources for the current user, and the C<users_method> (read as
+"user's method") series for finding resources for arbitrary users.
+
+This split is necesary, as on most platforms it is B<much> easier to find
+information about the current user compared to other users, and indeed
+on a number you cannot find out information such as C<users_desktop> at
+all, due to security restrictions.
+
+All methods will double check (using a C<-d> test) that a directory
+actually exists before returning it, so you may trust in the values
+that are returned (subject to the usual caveats of race conditions of
+directories being deleted at the moment between a directory being returned
+and you using it).
+
+However, because in some cases platforms may not support the concept of home
+directories at all, any method may return C<undef> (both in scalar and list
+context) to indicate that there is no matching directory on the system.
+
+For example, most untrusted 'nobody'-type users do not have a home
+directory. So any modules that are used in a CGI application that
+at some level of recursion use your code, will result in calls to
+File::HomeDir returning undef, even for a basic home() call.
+
+=head2 my_home
+
+The C<my_home> method takes no arguments and returns the main home/profile
+directory for the current user.
+
+If the distinction is important to you, the term "current" refers to the
+real user, and not the effective user.
+
+This is also the case for all of the other "my" methods.
+
+Returns the directory path as a string, C<undef> if the current user
+does not have a home directory, or dies on error.
+
+=head2 my_desktop
+
+The C<my_desktop> method takes no arguments and returns the "desktop"
+directory for the current user.
+
+Due to the diversity and complexity of implementions required to deal with
+implementing the required functionality fully and completely, for the moment
+C<my_desktop> is B<not> going to be implemented.
+
+That said, I am extremely interested in code to implement C<my_desktop> on
+Unix, as long as it is capable of dealing (as the Windows implementation
+does) with internationalisation. It should also avoid false positive
+results by making sure it only returns the appropriate directories for the
+appropriate platforms.
+
+Returns the directory path as a string, C<undef> if the current user
+does not have a desktop directory, or dies on error.
+
+=head2 my_documents
+
+The C<my_documents> method takes no arguments and returns the directory (for
+the current user) where the user's documents are stored.
+
+Returns the directory path as a string, C<undef> if the current user
+does not have a documents directory, or dies on error.
+
+=head2 my_music
+
+The C<my_music> method takes no arguments and returns the directory
+where the current user's music is stored.
+
+No bias is made to any particular music type or music program, rather the
+concept of a directory to hold the user's music is made at the level of the
+underlying operating system or (at least) desktop environment.
+
+Returns the directory path as a string, C<undef> if the current user
+does not have a suitable directory, or dies on error.
+
+=head2 my_pictures
+
+The C<my_pictures> method takes no arguments and returns the directory
+where the current user's pictures are stored.
+
+No bias is made to any particular picture type or picture program, rather the
+concept of a directory to hold the user's pictures is made at the level of the
+underlying operating system or (at least) desktop environment.
+
+Returns the directory path as a string, C<undef> if the current user
+does not have a suitable directory, or dies on error.
+
+=head2 my_videos
+
+The C<my_videos> method takes no arguments and returns the directory
+where the current user's videos are stored.
+
+No bias is made to any particular video type or video program, rather the
+concept of a directory to hold the user's videos is made at the level of the
+underlying operating system or (at least) desktop environment.
+
+Returns the directory path as a string, C<undef> if the current user
+does not have a suitable directory, or dies on error.
+
+=head2 my_data
+
+The C<my_data> method takes no arguments and returns the directory where
+local applications should stored their internal data for the current
+user.
+
+Generally an application would create a subdirectory such as C<.foo>,
+beneath this directory, and store its data there. By creating your
+directory this way, you get an accurate result on the maximum number
+of platforms.
+
+For example, on Unix you get C<~/.foo> and on Win32 you get
+C<~/Local Settings/Application Data/.foo>
+
+Returns the directory path as a string, C<undef> if the current user
+does not have a data directory, or dies on error.
+
+=head2 users_home
+
+ $home = File::HomeDir->users_home('foo');
+
+The C<users_home> method takes a single param and is used to locate the
+parent home/profile directory for an identified user on the system.
+
+While most of the time this identifier would be some form of user name,
+it is permitted to vary per-platform to support user ids or UUIDs as
+applicable for that platform.
+
+Returns the directory path as a string, C<undef> if that user
+does not have a home directory, or dies on error.
+
+=head2 users_documents
+
+ $docs = File::HomeDir->users_documents('foo');
+
+Returns the directory path as a string, C<undef> if that user
+does not have a documents directory, or dies on error.
+
+=head2 users_data
+
+ $data = File::HomeDir->users_data('foo');
+
+Returns the directory path as a string, C<undef> if that user
+does not have a data directory, or dies on error.
+
+=head1 FUNCTIONS
+
+=head2 home
+
+ use File::HomeDir;
+ $home = home();
+ $home = home('foo');
+ $home = File::HomeDir::home();
+ $home = File::HomeDir::home('foo');
+
+The C<home> function is exported by default and is provided for
+compatibility with legacy applications. In new applications, you should
+use the newer method-based interface above.
+
+Returns the directory path to a named user's home/profile directory.
+
+If provided no param, returns the directory path to the current user's
+home/profile directory.
+
+=head1 TIED INTERFACE
+
+=head2 %~
+
+ $home = $~{""};
+ $home = $~{undef};
+ $home = $~{$user};
+ $home = $~{username};
+ print "... $~{''} ...";
+ print "... $~{$user} ...";
+ print "... $~{username} ...";
+
+This calls C<home($user)> or C<home('username')> -- except that if you
+ask for C<$~{some_user}> and there is no such user, it will die.
+
+Note that this is especially useful in double-quotish strings, like:
+
+ print "Jojo's .newsrc is ", -s "$~{jojo}/.newsrc", "b long!\n";
+ # (helpfully dies if there is no user 'jojo')
+
+If you want to avoid the fatal errors, first test the value of
+C<home('jojo')>, which will return undef (instead of dying) in case of
+there being no such user.
+
+Note, however, that if the hash key is "" or undef (whether thru being
+a literal "", or a scalar whose value is empty-string or undef), then
+this returns zero-argument C<home()>, i.e., your home directory:
+
+Further, please note that because the C<%~> hash compulsorily modifies
+a hash outside of it's namespace, and presents an overly simplistic
+approach to home directories, it is likely to ultimately be removed.
+
+The interface is currently expected to be formally deprecated from 2010
+(but no earlier) and removed from 2015 (but no earlier). If very heavy
+use is found in the wild, these plans may be pushed back.
+
+=head1 TO DO
+
+=over 4
+
+=item * Become generally clearer on situations in which a user might not
+have a particular resource.
+
+=item * Add more granularity to Unix, and add support to VMS and other
+esoteric platforms, so we can consider going core.
+
+=item * Add consistent support for users_* methods
+
+=back
+
+=head1 SUPPORT
+
+This module is stored in an Open Repository at the following address.
+
+L<http://svn.ali.as/cpan/trunk/File-HomeDir>
+
+Write access to the repository is made available automatically to any
+published CPAN author, and to most other volunteers on request.
+
+If you are able to submit your bug report in the form of new (failing)
+unit tests, or can apply your fix directly instead of submitting a patch,
+you are B<strongly> encouraged to do so as the author currently maintains
+over 100 modules and it can take some time to deal with non-Critical bug
+reports or patches.
+
+This will guarantee that your issue will be addressed in the next
+release of the module.
+
+If you cannot provide a direct test or fix, or don't have time to do so,
+then regular bug reports are still accepted and appreciated via the CPAN
+bug tracker.
+
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=File-HomeDir>
+
+For other issues, for commercial enhancement or support, or to have your
+write access enabled for the repository, contact the author at the email
+address above.
+
+=head1 ACKNOWLEDGEMENTS
+
+The biggest acknowledgement must go to Chris Nandor, who wielded his
+legendary Mac-fu and turned my initial fairly ordinary Darwin
+implementation into something that actually worked properly everywhere,
+and then donated a Mac OS X license to allow it to be maintained properly.
+
+=head1 AUTHORS
+
+Adam Kennedy E<lt>adamk@cpan.orgE<gt>
+
+Sean M. Burke E<lt>sburke@cpan.orgE<gt>
+
+Chris Nandor E<lt>cnandor@cpan.orgE<gt>
+
+Stephen Steneker E<lt>stennie@cpan.orgE<gt>
+
+=head1 SEE ALSO
+
+L<File::ShareDir>, L<File::HomeDir::Win32> (legacy)
+
+=head1 COPYRIGHT
+
+Copyright 2005 - 2010 Adam Kennedy.
+
+Some parts copyright 2000 Sean M. Burke.
+
+Some parts copyright 2006 Chris Nandor.
+
+Some parts copyright 2006 Stephen Steneker.
+
+This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+The full text of the license can be found in the
+LICENSE file included with this module.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin.pm
new file mode 100755
index 00000000000..fbe7847edda
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin.pm
@@ -0,0 +1,152 @@
+package File::HomeDir::Darwin;
+
+use 5.00503;
+use strict;
+use Cwd ();
+use Carp ();
+use File::HomeDir::Unix ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '0.89';
+ @ISA = 'File::HomeDir::Unix';
+}
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ my $class = shift;
+
+ if ( exists $ENV{HOME} and defined $ENV{HOME} ) {
+ return $ENV{HOME};
+ }
+
+ my $home = (getpwuid($<))[7];
+ return $home if $home && -d $home;
+
+ return undef;
+}
+
+sub _my_home {
+ my($class, $path) = @_;
+ my $home = $class->my_home;
+ return undef unless defined $home;
+
+ my $folder = "$home/$path";
+ unless ( -d $folder ) {
+ # Make sure that symlinks resolve to directories.
+ return unless -l $folder;
+ my $dir = readlink $folder or return;
+ return unless -d $dir;
+ }
+
+ return Cwd::abs_path($folder);
+}
+
+sub my_desktop {
+ my $class = shift;
+ $class->_my_home('Desktop');
+}
+
+sub my_documents {
+ my $class = shift;
+ $class->_my_home('Documents');
+}
+
+sub my_data {
+ my $class = shift;
+ $class->_my_home('Library/Application Support');
+}
+
+sub my_music {
+ my $class = shift;
+ $class->_my_home('Music');
+}
+
+sub my_pictures {
+ my $class = shift;
+ $class->_my_home('Pictures');
+}
+
+sub my_videos {
+ my $class = shift;
+ $class->_my_home('Movies');
+}
+
+
+
+
+
+#####################################################################
+# Arbitrary User Methods
+
+sub users_home {
+ my $class = shift;
+ my $home = $class->SUPER::users_home(@_);
+ return defined $home ? Cwd::abs_path($home) : undef;
+}
+
+sub users_desktop {
+ my ($class, $name) = @_;
+ return undef if $name eq 'root';
+ $class->_to_user( $class->my_desktop, $name );
+}
+
+sub users_documents {
+ my ($class, $name) = @_;
+ return undef if $name eq 'root';
+ $class->_to_user( $class->my_documents, $name );
+}
+
+sub users_data {
+ my ($class, $name) = @_;
+ $class->_to_user( $class->my_data, $name )
+ ||
+ $class->users_home($name);
+}
+
+# cheap hack ... not entirely reliable, perhaps, but ... c'est la vie, since
+# there's really no other good way to do it at this time, that i know of -- pudge
+sub _to_user {
+ my ($class, $path, $name) = @_;
+ my $my_home = $class->my_home;
+ my $users_home = $class->users_home($name);
+ defined $users_home or return undef;
+ $path =~ s/^\Q$my_home/$users_home/;
+ return $path;
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+File::HomeDir::Darwin - Find your home and other directories, on Darwin (OS X) without Carbon/Cocoa
+
+=head1 DESCRIPTION
+
+This module provides Mac OS X specific file path for determining
+common user directories in pure perl, by just using C<$ENV{HOME}>
+without Carbon nor Cocoa API calls. In normal usage this module will
+always be used via L<File::HomeDir>.
+
+=head1 SYNOPSIS
+
+ use File::HomeDir;
+
+ # Find directories for the current user
+ $home = File::HomeDir->my_home; # /Users/mylogin
+ $desktop = File::HomeDir->my_desktop; # /Users/mylogin/Desktop
+ $docs = File::HomeDir->my_documents; # /Users/mylogin/Documents
+ $music = File::HomeDir->my_music; # /Users/mylogin/Music
+ $pics = File::HomeDir->my_pictures; # /Users/mylogin/Pictures
+ $videos = File::HomeDir->my_videos; # /Users/mylogin/Movies
+ $data = File::HomeDir->my_data; # /Users/mylogin/Library/Application Support
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Carbon.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Carbon.pm
new file mode 100755
index 00000000000..3234156b0eb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Carbon.pm
@@ -0,0 +1,210 @@
+package File::HomeDir::Darwin::Carbon;
+
+# Basic implementation for the Dawin family of operating systems.
+# This includes (most prominently) Mac OS X.
+
+use 5.00503;
+use strict;
+use Cwd ();
+use Carp ();
+use File::HomeDir::Darwin ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '0.89';
+
+ # This is only a child class of the pure Perl darwin
+ # class so that we can do homedir detection of all three
+ # drivers at one via ->isa.
+ @ISA = 'File::HomeDir::Darwin';
+
+ # Load early if in a forking environment and we have
+ # prefork, or at run-time if not.
+ local $@;
+ eval "use prefork 'Mac::Files'";
+}
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ my $class = shift;
+
+ # A lot of unix people and unix-derived tools rely on
+ # the ability to overload HOME. We will support it too
+ # so that they can replace raw HOME calls with File::HomeDir.
+ if ( exists $ENV{HOME} and defined $ENV{HOME} ) {
+ return $ENV{HOME};
+ }
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kCurrentUserFolderType(),
+ );
+}
+
+sub my_desktop {
+ my $class = shift;
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kDesktopFolderType(),
+ );
+}
+
+sub my_documents {
+ my $class = shift;
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kDocumentsFolderType(),
+ );
+}
+
+sub my_data {
+ my $class = shift;
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kApplicationSupportFolderType(),
+ );
+}
+
+sub my_music {
+ my $class = shift;
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kMusicDocumentsFolderType(),
+ );
+}
+
+sub my_pictures {
+ my $class = shift;
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kPictureDocumentsFolderType(),
+ );
+}
+
+sub my_videos {
+ my $class = shift;
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kMovieDocumentsFolderType(),
+ );
+}
+
+sub _find_folder {
+ my $class = shift;
+ my $name = shift;
+
+ require Mac::Files;
+ my $folder = Mac::Files::FindFolder(
+ Mac::Files::kUserDomain(),
+ $name,
+ );
+ return unless defined $folder;
+
+ unless ( -d $folder ) {
+ # Make sure that symlinks resolve to directories.
+ return unless -l $folder;
+ my $dir = readlink $folder or return;
+ return unless -d $dir;
+ }
+
+ return Cwd::abs_path($folder);
+}
+
+
+
+
+
+#####################################################################
+# Arbitrary User Methods
+
+sub users_home {
+ my $class = shift;
+ my $home = $class->SUPER::users_home(@_);
+ return defined $home ? Cwd::abs_path($home) : undef;
+}
+
+# in theory this can be done, but for now, let's cheat, since the
+# rest is Hard
+sub users_desktop {
+ my ($class, $name) = @_;
+ return undef if $name eq 'root';
+ $class->_to_user( $class->my_desktop, $name );
+}
+
+sub users_documents {
+ my ($class, $name) = @_;
+ return undef if $name eq 'root';
+ $class->_to_user( $class->my_documents, $name );
+}
+
+sub users_data {
+ my ($class, $name) = @_;
+ $class->_to_user( $class->my_data, $name )
+ ||
+ $class->users_home($name);
+}
+
+# cheap hack ... not entirely reliable, perhaps, but ... c'est la vie, since
+# there's really no other good way to do it at this time, that i know of -- pudge
+sub _to_user {
+ my ($class, $path, $name) = @_;
+ my $my_home = $class->my_home;
+ my $users_home = $class->users_home($name);
+ defined $users_home or return undef;
+ $path =~ s/^\Q$my_home/$users_home/;
+ return $path;
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+File::HomeDir::Darwin - Find your home and other directories, on Darwin (OS X)
+
+=head1 DESCRIPTION
+
+This module provides Darwin-specific implementations for determining
+common user directories. In normal usage this module will always be
+used via L<File::HomeDir>.
+
+Note -- since this module requires Mac::Carbon and Mac::Carbon does
+not work with 64-bit perls, on such systems, File::HomeDir will try
+L<File::HomeDir::Darwin::Cocoa> and then fall back to the (pure Perl)
+L<File::HomeDir::Darwin>.
+
+=head1 SYNOPSIS
+
+ use File::HomeDir;
+
+ # Find directories for the current user
+ $home = File::HomeDir->my_home; # /Users/mylogin
+ $desktop = File::HomeDir->my_desktop; # /Users/mylogin/Desktop
+ $docs = File::HomeDir->my_documents; # /Users/mylogin/Documents
+ $music = File::HomeDir->my_music; # /Users/mylogin/Music
+ $pics = File::HomeDir->my_pictures; # /Users/mylogin/Pictures
+ $videos = File::HomeDir->my_videos; # /Users/mylogin/Movies
+ $data = File::HomeDir->my_data; # /Users/mylogin/Library/Application Support
+
+=head1 TODO
+
+=over 4
+
+=item * Test with Mac OS (versions 7, 8, 9)
+
+=item * Some better way for users_* ?
+
+=back
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Cocoa.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Cocoa.pm
new file mode 100755
index 00000000000..e82dd9d449c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Cocoa.pm
@@ -0,0 +1,165 @@
+package File::HomeDir::Darwin::Cocoa;
+
+use 5.00503;
+use strict;
+use Cwd ();
+use Carp ();
+use File::HomeDir::Darwin ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '0.89';
+ @ISA = 'File::HomeDir::Darwin';
+
+ # Load early if in a forking environment and we have
+ # prefork, or at run-time if not.
+ local $@;
+ eval "use prefork 'Mac::SystemDirectory'";
+}
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ my $class = shift;
+
+ # A lot of unix people and unix-derived tools rely on
+ # the ability to overload HOME. We will support it too
+ # so that they can replace raw HOME calls with File::HomeDir.
+ if ( exists $ENV{HOME} and defined $ENV{HOME} ) {
+ return $ENV{HOME};
+ }
+
+ require Mac::SystemDirectory;
+ return Mac::SystemDirectory::HomeDirectory();
+}
+
+# from 10.4
+sub my_desktop {
+ my $class = shift;
+
+ require Mac::SystemDirectory;
+ eval {
+ $class->_find_folder(Mac::SystemDirectory::NSDesktopDirectory())
+ }
+ ||
+ $class->SUPER::my_desktop;
+}
+
+# from 10.2
+sub my_documents {
+ my $class = shift;
+
+ require Mac::SystemDirectory;
+ eval {
+ $class->_find_folder(Mac::SystemDirectory::NSDocumentDirectory())
+ }
+ ||
+ $class->SUPER::my_documents;
+}
+
+# from 10.4
+sub my_data {
+ my $class = shift;
+
+ require Mac::SystemDirectory;
+ eval {
+ $class->_find_folder(Mac::SystemDirectory::NSApplicationSupportDirectory())
+ }
+ ||
+ $class->SUPER::my_data;
+}
+
+# from 10.6
+sub my_music {
+ my $class = shift;
+
+ require Mac::SystemDirectory;
+ eval {
+ $class->_find_folder(Mac::SystemDirectory::NSMusicDirectory())
+ }
+ ||
+ $class->SUPER::my_music;
+}
+
+# from 10.6
+sub my_pictures {
+ my $class = shift;
+
+ require Mac::SystemDirectory;
+ eval {
+ $class->_find_folder(Mac::SystemDirectory::NSPicturesDirectory())
+ }
+ ||
+ $class->SUPER::my_pictures;
+}
+
+# from 10.6
+sub my_videos {
+ my $class = shift;
+
+ require Mac::SystemDirectory;
+ eval {
+ $class->_find_folder(Mac::SystemDirectory::NSMoviesDirectory())
+ }
+ ||
+ $class->SUPER::my_videos;
+}
+
+sub _find_folder {
+ my $class = shift;
+ my $name = shift;
+
+ require Mac::SystemDirectory;
+ my $folder = Mac::SystemDirectory::FindDirectory($name);
+ return unless defined $folder;
+
+ unless ( -d $folder ) {
+ # Make sure that symlinks resolve to directories.
+ return unless -l $folder;
+ my $dir = readlink $folder or return;
+ return unless -d $dir;
+ }
+
+ return Cwd::abs_path($folder);
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+File::HomeDir::Darwin::Cocoa - Find your home and other directories, on Darwin (OS X)
+
+=head1 DESCRIPTION
+
+This module provides Darwin-specific implementations for determining
+common user directories using Cocoa API through
+L<Mac::SystemDirectory>. In normal usage this module will always be
+used via L<File::HomeDir>.
+
+Theoretically, this should return the same paths as both of the other
+Darwin drivers.
+
+Because this module requires L<Mac::SystemDirectory>, if the module
+is not installed, L<File::HomeDir> will fall back to L<File::HomeDir::Darwin>.
+
+=head1 SYNOPSIS
+
+ use File::HomeDir;
+
+ # Find directories for the current user
+ $home = File::HomeDir->my_home; # /Users/mylogin
+ $desktop = File::HomeDir->my_desktop; # /Users/mylogin/Desktop
+ $docs = File::HomeDir->my_documents; # /Users/mylogin/Documents
+ $music = File::HomeDir->my_music; # /Users/mylogin/Music
+ $pics = File::HomeDir->my_pictures; # /Users/mylogin/Pictures
+ $videos = File::HomeDir->my_videos; # /Users/mylogin/Movies
+ $data = File::HomeDir->my_data; # /Users/mylogin/Library/Application Support
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Driver.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Driver.pm
new file mode 100755
index 00000000000..c47a7caaad1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Driver.pm
@@ -0,0 +1,19 @@
+package File::HomeDir::Driver;
+
+# Abstract base class that provides no functionality,
+# but confirms the class is a File::HomeDir driver class.
+
+use 5.00503;
+use strict;
+use Carp ();
+
+use vars qw{$VERSION};
+BEGIN {
+ $VERSION = '0.89';
+}
+
+sub my_home {
+ Carp::croak("$_[0] does not implement compulsory method $_[1]");
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/MacOS9.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/MacOS9.pm
new file mode 100755
index 00000000000..f9fe9e0fbe6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/MacOS9.pm
@@ -0,0 +1,97 @@
+package File::HomeDir::MacOS9;
+
+# Half-assed implementation for the legacy Mac OS9 operating system.
+# Provided mainly to provide legacy compatibility. May be removed at
+# a later date.
+
+use 5.00503;
+use strict;
+use Carp ();
+use File::HomeDir::Driver ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '0.89';
+ @ISA = 'File::HomeDir::Driver';
+}
+
+# Load early if in a forking environment and we have
+# prefork, or at run-time if not.
+SCOPE: {
+ local $@;
+ eval "use prefork 'Mac::Files'";
+}
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ my $class = shift;
+
+ # Try for $ENV{HOME} if we have it
+ if ( defined $ENV{HOME} ) {
+ return $ENV{HOME};
+ }
+
+ ### DESPERATION SETS IN
+
+ # We could use the desktop
+ SCOPE: {
+ local $@;
+ eval {
+ my $home = $class->my_desktop;
+ return $home if $home and -d $home;
+ };
+ }
+
+ # Desperation on any platform
+ SCOPE: {
+ # On some platforms getpwuid dies if called at all
+ local $SIG{'__DIE__'} = '';
+ my $home = (getpwuid($<))[7];
+ return $home if $home and -d $home;
+ }
+
+ Carp::croak("Could not locate current user's home directory");
+}
+
+sub my_desktop {
+ my $class = shift;
+
+ # Find the desktop via Mac::Files
+ local $SIG{'__DIE__'} = '';
+ require Mac::Files;
+ my $home = Mac::Files::FindFolder(
+ Mac::Files::kOnSystemDisk(),
+ Mac::Files::kDesktopFolderType(),
+ );
+ return $home if $home and -d $home;
+
+ Carp::croak("Could not locate current user's desktop");
+}
+
+
+
+
+
+#####################################################################
+# General User Methods
+
+sub users_home {
+ my ($class, $name) = @_;
+
+ SCOPE: {
+ # On some platforms getpwnam dies if called at all
+ local $SIG{'__DIE__'} = '';
+ my $home = (getpwnam($name))[7];
+ return $home if defined $home and -d $home;
+ }
+
+ Carp::croak("Failed to find home directory for user '$name'");
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Unix.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Unix.pm
new file mode 100755
index 00000000000..640f64e7b26
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Unix.pm
@@ -0,0 +1,167 @@
+package File::HomeDir::Unix;
+
+# Unix-specific functionality
+
+use 5.00503;
+use strict;
+use Carp ();
+use File::HomeDir::Driver ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '0.89';
+ @ISA = 'File::HomeDir::Driver';
+}
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ my $class = shift;
+ my $home = $class->_my_home(@_);
+
+ # On Unix in general, a non-existant home means "no home"
+ # For example, "nobody"-like users might use /nonexistant
+ if ( defined $home and ! -d $home ) {
+ $home = undef;
+ }
+
+ return $home;
+}
+
+sub _my_home {
+ my $class = shift;
+ if ( exists $ENV{HOME} and defined $ENV{HOME} ) {
+ return $ENV{HOME};
+ }
+
+ # This is from the original code, but I'm guessing
+ # it means "login directory" and exists on some Unixes.
+ if ( exists $ENV{LOGDIR} and $ENV{LOGDIR} ) {
+ return $ENV{LOGDIR};
+ }
+
+ ### More-desperate methods
+
+ # Light desperation on any (Unixish) platform
+ SCOPE: {
+ my $home = (getpwuid($<))[7];
+ return $home if $home and -d $home;
+ }
+
+ return undef;
+}
+
+# On unix by default, everything is under the same folder
+sub my_desktop {
+ shift->my_home;
+}
+
+sub my_documents {
+ shift->my_home;
+}
+
+sub my_data {
+ shift->my_home;
+}
+
+sub my_music {
+ shift->my_home;
+}
+
+sub my_pictures {
+ shift->my_home;
+}
+
+sub my_videos {
+ shift->my_home;
+}
+
+
+
+
+
+#####################################################################
+# General User Methods
+
+sub users_home {
+ my ($class, $name) = @_;
+
+ # IF and only if we have getpwuid support, and the
+ # name of the user is our own, shortcut to my_home.
+ # This is needed to handle HOME environment settings.
+ if ( $name eq getpwuid($<) ) {
+ return $class->my_home;
+ }
+
+ SCOPE: {
+ my $home = (getpwnam($name))[7];
+ return $home if $home and -d $home;
+ }
+
+ return undef;
+}
+
+sub users_desktop {
+ shift->users_home(@_);
+}
+
+sub users_documents {
+ shift->users_home(@_);
+}
+
+sub users_data {
+ shift->users_home(@_);
+}
+
+sub users_music {
+ shift->users_home(@_);
+}
+
+sub users_pictures {
+ shift->users_home(@_);
+}
+
+sub users_videos {
+ shift->users_home(@_);
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+File::HomeDir::Unix - find your home and other directories, on Unix
+
+=head1 DESCRIPTION
+
+This module provides implementations for determining common user
+directories. In normal usage this module will always be
+used via L<File::HomeDir>.
+
+=head1 SYNOPSIS
+
+ use File::HomeDir;
+
+ # Find directories for the current user
+ $home = File::HomeDir->my_home; # /home/mylogin
+
+ $desktop = File::HomeDir->my_desktop; # All of these will...
+ $docs = File::HomeDir->my_documents; # ...default to home...
+ $music = File::HomeDir->my_music; # ...directory at the...
+ $pics = File::HomeDir->my_pictures; # ...moment.
+ $videos = File::HomeDir->my_videos; #
+ $data = File::HomeDir->my_data; #
+
+=head1 TODO
+
+=over 4
+
+=item * Add support for common unix desktop and data directories when using KDE / Gnome / ...
+
+=back
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Windows.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Windows.pm
new file mode 100755
index 00000000000..888ccc8b819
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Windows.pm
@@ -0,0 +1,176 @@
+package File::HomeDir::Windows;
+
+# Generalised implementation for the entire Windows family of operating
+# systems.
+
+use 5.00503;
+use strict;
+use Carp ();
+use File::Spec ();
+use File::HomeDir::Driver ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '0.89';
+ @ISA = 'File::HomeDir::Driver';
+}
+
+sub CREATE () { 1 }
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ my $class = shift;
+
+ # A lot of unix people and unix-derived tools rely on
+ # the ability to overload HOME. We will support it too
+ # so that they can replace raw HOME calls with File::HomeDir.
+ if ( exists $ENV{HOME} and $ENV{HOME} ) {
+ return $ENV{HOME};
+ }
+
+ # Do we have a user profile?
+ if ( exists $ENV{USERPROFILE} and $ENV{USERPROFILE} ) {
+ return $ENV{USERPROFILE};
+ }
+
+ # Some Windows use something like $ENV{HOME}
+ if ( exists $ENV{HOMEDRIVE} and exists $ENV{HOMEPATH} and $ENV{HOMEDRIVE} and $ENV{HOMEPATH} ) {
+ return File::Spec->catpath(
+ $ENV{HOMEDRIVE}, $ENV{HOMEPATH}, '',
+ );
+ }
+
+ return undef;
+}
+
+sub my_desktop {
+ my $class = shift;
+
+ # The most correct way to find the desktop
+ SCOPE: {
+ require Win32;
+ my $dir = Win32::GetFolderPath(Win32::CSIDL_DESKTOP(), CREATE);
+ return $dir if $dir and -d $dir;
+ }
+
+ # MSWindows sets WINDIR, MS WinNT sets USERPROFILE.
+ foreach my $e ( 'USERPROFILE', 'WINDIR' ) {
+ next unless $ENV{$e};
+ my $desktop = File::Spec->catdir($ENV{$e}, 'Desktop');
+ return $desktop if $desktop and -d $desktop;
+ }
+
+ # As a last resort, try some hard-wired values
+ foreach my $fixed (
+ # The reason there are both types of slash here is because
+ # this set of paths has been kept from thethe original version
+ # of File::HomeDir::Win32 (before it was rewritten).
+ # I can only assume this is Cygwin-related stuff.
+ "C:\\windows\\desktop",
+ "C:\\win95\\desktop",
+ "C:/win95/desktop",
+ "C:/windows/desktop",
+ ) {
+ return $fixed if -d $fixed;
+ }
+
+ return undef;
+}
+
+sub my_documents {
+ my $class = shift;
+
+ # The most correct way to find my documents
+ SCOPE: {
+ require Win32;
+ my $dir = Win32::GetFolderPath(Win32::CSIDL_PERSONAL(), CREATE);
+ return $dir if $dir and -d $dir;
+ }
+
+ return undef;
+}
+
+sub my_data {
+ my $class = shift;
+
+ # The most correct way to find my documents
+ SCOPE: {
+ require Win32;
+ my $dir = Win32::GetFolderPath(Win32::CSIDL_LOCAL_APPDATA(), CREATE);
+ return $dir if $dir and -d $dir;
+ }
+
+ return undef;
+}
+
+sub my_music {
+ my $class = shift;
+
+ # The most correct way to find my music
+ SCOPE: {
+ require Win32;
+ my $dir = Win32::GetFolderPath(Win32::CSIDL_MYMUSIC(), CREATE);
+ return $dir if $dir and -d $dir;
+ }
+
+ return undef;
+}
+
+sub my_pictures {
+ my $class = shift;
+
+ # The most correct way to find my pictures
+ SCOPE: {
+ require Win32;
+ my $dir = Win32::GetFolderPath(Win32::CSIDL_MYPICTURES(), CREATE);
+ return $dir if $dir and -d $dir;
+ }
+
+ return undef;
+}
+
+sub my_videos {
+ my $class = shift;
+
+ # The most correct way to find my videos
+ SCOPE: {
+ require Win32;
+ my $dir = Win32::GetFolderPath(Win32::CSIDL_MYVIDEO(), CREATE);
+ return $dir if $dir and -d $dir;
+ }
+
+ return undef;
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+File::HomeDir::Windows - find your home and other directories, on Windows
+
+=head1 DESCRIPTION
+
+This module provides Windows-specific implementations for determining
+common user directories. In normal usage this module will always be
+used via L<File::HomeDir>.
+
+=head1 SYNOPSIS
+
+ use File::HomeDir;
+
+ # Find directories for the current user (eg. using Windows XP Professional)
+ $home = File::HomeDir->my_home; # C:\Documents and Settings\mylogin
+ $desktop = File::HomeDir->my_desktop; # C:\Documents and Settings\mylogin\Desktop
+ $docs = File::HomeDir->my_documents; # C:\Documents and Settings\mylogin\My Documents
+ $music = File::HomeDir->my_music; # C:\Documents and Settings\mylogin\My Documents\My Music
+ $pics = File::HomeDir->my_pictures; # C:\Documents and Settings\mylogin\My Documents\My Pictures
+ $videos = File::HomeDir->my_videos; # C:\Documents and Settings\mylogin\My Documents\My Video
+ $data = File::HomeDir->my_data; # C:\Documents and Settings\mylogin\Local Settings\Application Data
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Listing.pm b/Master/tlpkg/tlperl.straw/lib/File/Listing.pm
new file mode 100755
index 00000000000..85d44ac8827
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Listing.pm
@@ -0,0 +1,406 @@
+package File::Listing;
+
+sub Version { $VERSION; }
+$VERSION = "5.814";
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(parse_dir);
+
+use strict;
+
+use Carp ();
+use HTTP::Date qw(str2time);
+
+
+
+sub parse_dir ($;$$$)
+{
+ my($dir, $tz, $fstype, $error) = @_;
+
+ $fstype ||= 'unix';
+ $fstype = "File::Listing::" . lc $fstype;
+
+ my @args = $_[0];
+ push(@args, $tz) if(@_ >= 2);
+ push(@args, $error) if(@_ >= 4);
+
+ $fstype->parse(@args);
+}
+
+
+sub line { Carp::croak("Not implemented yet"); }
+sub init { } # Dummy sub
+
+
+sub file_mode ($)
+{
+ # This routine was originally borrowed from Graham Barr's
+ # Net::FTP package.
+
+ local $_ = shift;
+ my $mode = 0;
+ my($type,$ch);
+
+ s/^(.)// and $type = $1;
+
+ while (/(.)/g) {
+ $mode <<= 1;
+ $mode |= 1 if $1 ne "-" &&
+ $1 ne 'S' &&
+ $1 ne 't' &&
+ $1 ne 'T';
+ }
+
+ $type eq "d" and $mode |= 0040000 or # Directory
+ $type eq "l" and $mode |= 0120000 or # Symbolic Link
+ $mode |= 0100000; # Regular File
+
+ $mode |= 0004000 if /^...s....../i;
+ $mode |= 0002000 if /^......s.../i;
+ $mode |= 0001000 if /^.........t/i;
+
+ $mode;
+}
+
+
+sub parse
+{
+ my($pkg, $dir, $tz, $error) = @_;
+
+ # First let's try to determine what kind of dir parameter we have
+ # received. We allow both listings, reference to arrays and
+ # file handles to read from.
+
+ if (ref($dir) eq 'ARRAY') {
+ # Already splitted up
+ }
+ elsif (ref($dir) eq 'GLOB') {
+ # A file handle
+ }
+ elsif (ref($dir)) {
+ Carp::croak("Illegal argument to parse_dir()");
+ }
+ elsif ($dir =~ /^\*\w+(::\w+)+$/) {
+ # This scalar looks like a file handle, so we assume it is
+ }
+ else {
+ # A normal scalar listing
+ $dir = [ split(/\n/, $dir) ];
+ }
+
+ $pkg->init();
+
+ my @files = ();
+ if (ref($dir) eq 'ARRAY') {
+ for (@$dir) {
+ push(@files, $pkg->line($_, $tz, $error));
+ }
+ }
+ else {
+ local($_);
+ while (<$dir>) {
+ chomp;
+ push(@files, $pkg->line($_, $tz, $error));
+ }
+ }
+ wantarray ? @files : \@files;
+}
+
+
+
+package File::Listing::unix;
+
+use HTTP::Date qw(str2time);
+
+# A place to remember current directory from last line parsed.
+use vars qw($curdir @ISA);
+
+@ISA = qw(File::Listing);
+
+
+
+sub init
+{
+ $curdir = '';
+}
+
+
+sub line
+{
+ shift; # package name
+ local($_) = shift;
+ my($tz, $error) = @_;
+
+ s/\015//g;
+ #study;
+
+ my ($kind, $size, $date, $name);
+ if (($kind, $size, $date, $name) =
+ /^([\-FlrwxsStTdD]{10}) # Type and permission bits
+ .* # Graps
+ \D(\d+) # File size
+ \s+ # Some space
+ (\w{3}\s+\d+\s+(?:\d{1,2}:\d{2}|\d{4})|\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}) # Date
+ \s+ # Some more space
+ (.*)$ # File name
+ /x )
+
+ {
+ return if $name eq '.' || $name eq '..';
+ $name = "$curdir/$name" if length $curdir;
+ my $type = '?';
+ if ($kind =~ /^l/ && $name =~ /(.*) -> (.*)/ ) {
+ $name = $1;
+ $type = "l $2";
+ }
+ elsif ($kind =~ /^[\-F]/) { # (hopefully) a regular file
+ $type = 'f';
+ }
+ elsif ($kind =~ /^[dD]/) {
+ $type = 'd';
+ $size = undef; # Don't believe the reported size
+ }
+ return [$name, $type, $size, str2time($date, $tz),
+ File::Listing::file_mode($kind)];
+
+ }
+ elsif (/^(.+):$/ && !/^[dcbsp].*\s.*\s.*:$/ ) {
+ my $dir = $1;
+ return () if $dir eq '.';
+ $curdir = $dir;
+ return ();
+ }
+ elsif (/^[Tt]otal\s+(\d+)$/ || /^\s*$/) {
+ return ();
+ }
+ elsif (/not found/ || # OSF1, HPUX, and SunOS return
+ # "$file not found"
+ /No such file/ || # IRIX returns
+ # "UX:ls: ERROR: Cannot access $file: No such file or directory"
+ # Solaris returns
+ # "$file: No such file or directory"
+ /cannot find/ # Windows NT returns
+ # "The system cannot find the path specified."
+ ) {
+ return () unless defined $error;
+ &$error($_) if ref($error) eq 'CODE';
+ warn "Error: $_\n" if $error eq 'warn';
+ return ();
+ }
+ elsif ($_ eq '') { # AIX, and Linux return nothing
+ return () unless defined $error;
+ &$error("No such file or directory") if ref($error) eq 'CODE';
+ warn "Warning: No such file or directory\n" if $error eq 'warn';
+ return ();
+ }
+ else {
+ # parse failed, check if the dosftp parse understands it
+ File::Listing::dosftp->init();
+ return(File::Listing::dosftp->line($_,$tz,$error));
+ }
+
+}
+
+
+
+package File::Listing::dosftp;
+
+use HTTP::Date qw(str2time);
+
+# A place to remember current directory from last line parsed.
+use vars qw($curdir @ISA);
+
+@ISA = qw(File::Listing);
+
+
+
+sub init
+{
+ $curdir = '';
+}
+
+
+sub line
+{
+ shift; # package name
+ local($_) = shift;
+ my($tz, $error) = @_;
+
+ s/\015//g;
+
+ my ($date, $size_or_dir, $name, $size);
+
+ # 02-05-96 10:48AM 1415 src.slf
+ # 09-10-96 09:18AM <DIR> sl_util
+ if (($date, $size_or_dir, $name) =
+ /^(\d\d-\d\d-\d\d\s+\d\d:\d\d\wM) # Date and time info
+ \s+ # Some space
+ (<\w{3}>|\d+) # Dir or Size
+ \s+ # Some more space
+ (.+)$ # File name
+ /x )
+ {
+ return if $name eq '.' || $name eq '..';
+ $name = "$curdir/$name" if length $curdir;
+ my $type = '?';
+ if ($size_or_dir eq '<DIR>') {
+ $type = "d";
+ $size = ""; # directories have no size in the pc listing
+ }
+ else {
+ $type = 'f';
+ $size = $size_or_dir;
+ }
+ return [$name, $type, $size, str2time($date, $tz), undef];
+ }
+ else {
+ return () unless defined $error;
+ &$error($_) if ref($error) eq 'CODE';
+ warn "Can't parse: $_\n" if $error eq 'warn';
+ return ();
+ }
+
+}
+
+
+
+package File::Listing::vms;
+@File::Listing::vms::ISA = qw(File::Listing);
+
+package File::Listing::netware;
+@File::Listing::netware::ISA = qw(File::Listing);
+
+
+
+package File::Listing::apache;
+
+use vars qw(@ISA);
+
+@ISA = qw(File::Listing);
+
+
+sub init { }
+
+
+sub line {
+ shift; # package name
+ local($_) = shift;
+ my($tz, $error) = @_; # ignored for now...
+
+ if (m!<A\s+HREF=\"([^\"]+)\">.*</A>.*?(\d+)-([a-zA-Z]+)-(\d+)\s+(\d+):(\d+)\s+(?:([\d\.]+[kM]?|-))!i) {
+ my($filename, $filesize) = ($1, $7);
+ my($d,$m,$y, $H,$M) = ($2,$3,$4,$5,$6);
+
+ $filesize = 0 if $filesize eq '-';
+ if ($filesize =~ s/k$//i) {
+ $filesize *= 1024;
+ }
+ elsif ($filesize =~ s/M$//) {
+ $filesize *= 1024*1024;
+ }
+ elsif ($filesize =~ s/G$//) {
+ $filesize *= 1024*1024*1024;
+ }
+ $filesize = int $filesize;
+
+ require Time::Local;
+ my $filetime = Time::Local::timelocal(0,$M,$H,$d,_monthabbrev_number($m)-1,_guess_year($y)-1900);
+ my $filetype = ($filename =~ s|/$|| ? "d" : "f");
+ return [$filename, $filetype, $filesize, $filetime, undef];
+ }
+
+ return ();
+}
+
+
+sub _guess_year {
+ my $y = shift;
+ if ($y >= 90) {
+ $y = 1900+$y;
+ }
+ elsif ($y < 100) {
+ $y = 2000+$y;
+ }
+ $y;
+}
+
+
+sub _monthabbrev_number {
+ my $mon = shift;
+ +{'Jan' => 1,
+ 'Feb' => 2,
+ 'Mar' => 3,
+ 'Apr' => 4,
+ 'May' => 5,
+ 'Jun' => 6,
+ 'Jul' => 7,
+ 'Aug' => 8,
+ 'Sep' => 9,
+ 'Oct' => 10,
+ 'Nov' => 11,
+ 'Dec' => 12,
+ }->{$mon};
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+File::Listing - parse directory listing
+
+=head1 SYNOPSIS
+
+ use File::Listing qw(parse_dir);
+ $ENV{LANG} = "C"; # dates in non-English locales not supported
+ for (parse_dir(`ls -l`)) {
+ ($name, $type, $size, $mtime, $mode) = @$_;
+ next if $type ne 'f'; # plain file
+ #...
+ }
+
+ # directory listing can also be read from a file
+ open(LISTING, "zcat ls-lR.gz|");
+ $dir = parse_dir(\*LISTING, '+0000');
+
+=head1 DESCRIPTION
+
+This module exports a single function called parse_dir(), which can be
+used to parse directory listings.
+
+The first parameter to parse_dir() is the directory listing to parse.
+It can be a scalar, a reference to an array of directory lines or a
+glob representing a filehandle to read the directory listing from.
+
+The second parameter is the time zone to use when parsing time stamps
+in the listing. If this value is undefined, then the local time zone is
+assumed.
+
+The third parameter is the type of listing to assume. Currently
+supported formats are 'unix', 'apache' and 'dosftp'. The default
+value 'unix'. Ideally, the listing type should be determined
+automatically.
+
+The fourth parameter specifies how unparseable lines should be treated.
+Values can be 'ignore', 'warn' or a code reference. Warn means that
+the perl warn() function will be called. If a code reference is
+passed, then this routine will be called and the return value from it
+will be incorporated in the listing. The default is 'ignore'.
+
+Only the first parameter is mandatory.
+
+The return value from parse_dir() is a list of directory entries. In
+a scalar context the return value is a reference to the list. The
+directory entries are represented by an array consisting of [
+$filename, $filetype, $filesize, $filetime, $filemode ]. The
+$filetype value is one of the letters 'f', 'd', 'l' or '?'. The
+$filetime value is the seconds since Jan 1, 1970. The
+$filemode is a bitmask like the mode returned by stat().
+
+=head1 CREDITS
+
+Based on lsparse.pl (from Lee McLoughlin's ftp mirror package) and
+Net::FTP's parse_dir (Graham Barr).
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Path.pm b/Master/tlpkg/tlperl.straw/lib/File/Path.pm
new file mode 100755
index 00000000000..387cdb19cb1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Path.pm
@@ -0,0 +1,982 @@
+package File::Path;
+
+use 5.005_04;
+use strict;
+
+use Cwd 'getcwd';
+use File::Basename ();
+use File::Spec ();
+
+BEGIN {
+ if ($] < 5.006) {
+ # can't say 'opendir my $dh, $dirname'
+ # need to initialise $dh
+ eval "use Symbol";
+ }
+}
+
+use Exporter ();
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+$VERSION = '2.08';
+@ISA = qw(Exporter);
+@EXPORT = qw(mkpath rmtree);
+@EXPORT_OK = qw(make_path remove_tree);
+
+my $Is_VMS = $^O eq 'VMS';
+my $Is_MacOS = $^O eq 'MacOS';
+
+# These OSes complain if you want to remove a file that you have no
+# write permission to:
+my $Force_Writeable = grep {$^O eq $_} qw(amigaos dos epoc MSWin32 MacOS os2);
+
+# Unix-like systems need to stat each directory in order to detect
+# race condition. MS-Windows is immune to this particular attack.
+my $Need_Stat_Check = !($^O eq 'MSWin32');
+
+sub _carp {
+ require Carp;
+ goto &Carp::carp;
+}
+
+sub _croak {
+ require Carp;
+ goto &Carp::croak;
+}
+
+sub _error {
+ my $arg = shift;
+ my $message = shift;
+ my $object = shift;
+
+ if ($arg->{error}) {
+ $object = '' unless defined $object;
+ $message .= ": $!" if $!;
+ push @{${$arg->{error}}}, {$object => $message};
+ }
+ else {
+ _carp(defined($object) ? "$message for $object: $!" : "$message: $!");
+ }
+}
+
+sub make_path {
+ push @_, {} unless @_ and UNIVERSAL::isa($_[-1],'HASH');
+ goto &mkpath;
+}
+
+sub mkpath {
+ my $old_style = !(@_ and UNIVERSAL::isa($_[-1],'HASH'));
+
+ my $arg;
+ my $paths;
+
+ if ($old_style) {
+ my ($verbose, $mode);
+ ($paths, $verbose, $mode) = @_;
+ $paths = [$paths] unless UNIVERSAL::isa($paths,'ARRAY');
+ $arg->{verbose} = $verbose;
+ $arg->{mode} = defined $mode ? $mode : 0777;
+ }
+ else {
+ $arg = pop @_;
+ $arg->{mode} = delete $arg->{mask} if exists $arg->{mask};
+ $arg->{mode} = 0777 unless exists $arg->{mode};
+ ${$arg->{error}} = [] if exists $arg->{error};
+ $arg->{owner} = delete $arg->{user} if exists $arg->{user};
+ $arg->{owner} = delete $arg->{uid} if exists $arg->{uid};
+ if (exists $arg->{owner} and $arg->{owner} =~ /\D/) {
+ my $uid = (getpwnam $arg->{owner})[2];
+ if (defined $uid) {
+ $arg->{owner} = $uid;
+ }
+ else {
+ _error($arg, "unable to map $arg->{owner} to a uid, ownership not changed");
+ delete $arg->{owner};
+ }
+ }
+ if (exists $arg->{group} and $arg->{group} =~ /\D/) {
+ my $gid = (getgrnam $arg->{group})[2];
+ if (defined $gid) {
+ $arg->{group} = $gid;
+ }
+ else {
+ _error($arg, "unable to map $arg->{group} to a gid, group ownership not changed");
+ delete $arg->{group};
+ }
+ }
+ if (exists $arg->{owner} and not exists $arg->{group}) {
+ $arg->{group} = -1; # chown will leave group unchanged
+ }
+ if (exists $arg->{group} and not exists $arg->{owner}) {
+ $arg->{owner} = -1; # chown will leave owner unchanged
+ }
+ $paths = [@_];
+ }
+ return _mkpath($arg, $paths);
+}
+
+sub _mkpath {
+ my $arg = shift;
+ my $paths = shift;
+
+ my(@created,$path);
+ foreach $path (@$paths) {
+ next unless defined($path) and length($path);
+ $path .= '/' if $^O eq 'os2' and $path =~ /^\w:\z/s; # feature of CRT
+ # Logic wants Unix paths, so go with the flow.
+ if ($Is_VMS) {
+ next if $path eq '/';
+ $path = VMS::Filespec::unixify($path);
+ }
+ next if -d $path;
+ my $parent = File::Basename::dirname($path);
+ unless (-d $parent or $path eq $parent) {
+ push(@created,_mkpath($arg, [$parent]));
+ }
+ print "mkdir $path\n" if $arg->{verbose};
+ if (mkdir($path,$arg->{mode})) {
+ push(@created, $path);
+ if (exists $arg->{owner}) {
+ # NB: $arg->{group} guaranteed to be set during initialisation
+ if (!chown $arg->{owner}, $arg->{group}, $path) {
+ _error($arg, "Cannot change ownership of $path to $arg->{owner}:$arg->{group}");
+ }
+ }
+ }
+ else {
+ my $save_bang = $!;
+ my ($e, $e1) = ($save_bang, $^E);
+ $e .= "; $e1" if $e ne $e1;
+ # allow for another process to have created it meanwhile
+ if (!-d $path) {
+ $! = $save_bang;
+ if ($arg->{error}) {
+ push @{${$arg->{error}}}, {$path => $e};
+ }
+ else {
+ _croak("mkdir $path: $e");
+ }
+ }
+ }
+ }
+ return @created;
+}
+
+sub remove_tree {
+ push @_, {} unless @_ and UNIVERSAL::isa($_[-1],'HASH');
+ goto &rmtree;
+}
+
+sub _is_subdir {
+ my($dir, $test) = @_;
+
+ my($dv, $dd) = File::Spec->splitpath($dir, 1);
+ my($tv, $td) = File::Spec->splitpath($test, 1);
+
+ # not on same volume
+ return 0 if $dv ne $tv;
+
+ my @d = File::Spec->splitdir($dd);
+ my @t = File::Spec->splitdir($td);
+
+ # @t can't be a subdir if it's shorter than @d
+ return 0 if @t < @d;
+
+ return join('/', @d) eq join('/', splice @t, 0, +@d);
+}
+
+sub rmtree {
+ my $old_style = !(@_ and UNIVERSAL::isa($_[-1],'HASH'));
+
+ my $arg;
+ my $paths;
+
+ if ($old_style) {
+ my ($verbose, $safe);
+ ($paths, $verbose, $safe) = @_;
+ $arg->{verbose} = $verbose;
+ $arg->{safe} = defined $safe ? $safe : 0;
+
+ if (defined($paths) and length($paths)) {
+ $paths = [$paths] unless UNIVERSAL::isa($paths,'ARRAY');
+ }
+ else {
+ _carp ("No root path(s) specified\n");
+ return 0;
+ }
+ }
+ else {
+ $arg = pop @_;
+ ${$arg->{error}} = [] if exists $arg->{error};
+ ${$arg->{result}} = [] if exists $arg->{result};
+ $paths = [@_];
+ }
+
+ $arg->{prefix} = '';
+ $arg->{depth} = 0;
+
+ my @clean_path;
+ $arg->{cwd} = getcwd() or do {
+ _error($arg, "cannot fetch initial working directory");
+ return 0;
+ };
+ for ($arg->{cwd}) { /\A(.*)\Z/; $_ = $1 } # untaint
+
+ for my $p (@$paths) {
+ # need to fixup case and map \ to / on Windows
+ my $ortho_root = $^O eq 'MSWin32' ? _slash_lc($p) : $p;
+ my $ortho_cwd = $^O eq 'MSWin32' ? _slash_lc($arg->{cwd}) : $arg->{cwd};
+ my $ortho_root_length = length($ortho_root);
+ $ortho_root_length-- if $^O eq 'VMS'; # don't compare '.' with ']'
+ if ($ortho_root_length && _is_subdir($ortho_root, $ortho_cwd)) {
+ local $! = 0;
+ _error($arg, "cannot remove path when cwd is $arg->{cwd}", $p);
+ next;
+ }
+
+ if ($Is_MacOS) {
+ $p = ":$p" unless $p =~ /:/;
+ $p .= ":" unless $p =~ /:\z/;
+ }
+ elsif ($^O eq 'MSWin32') {
+ $p =~ s{[/\\]\z}{};
+ }
+ else {
+ $p =~ s{/\z}{};
+ }
+ push @clean_path, $p;
+ }
+
+ @{$arg}{qw(device inode perm)} = (lstat $arg->{cwd})[0,1] or do {
+ _error($arg, "cannot stat initial working directory", $arg->{cwd});
+ return 0;
+ };
+
+ return _rmtree($arg, \@clean_path);
+}
+
+sub _rmtree {
+ my $arg = shift;
+ my $paths = shift;
+
+ my $count = 0;
+ my $curdir = File::Spec->curdir();
+ my $updir = File::Spec->updir();
+
+ my (@files, $root);
+ ROOT_DIR:
+ foreach $root (@$paths) {
+ # since we chdir into each directory, it may not be obvious
+ # to figure out where we are if we generate a message about
+ # a file name. We therefore construct a semi-canonical
+ # filename, anchored from the directory being unlinked (as
+ # opposed to being truly canonical, anchored from the root (/).
+
+ my $canon = $arg->{prefix}
+ ? File::Spec->catfile($arg->{prefix}, $root)
+ : $root
+ ;
+
+ my ($ldev, $lino, $perm) = (lstat $root)[0,1,2] or next ROOT_DIR;
+
+ if ( -d _ ) {
+ $root = VMS::Filespec::pathify($root) if $Is_VMS;
+
+ if (!chdir($root)) {
+ # see if we can escalate privileges to get in
+ # (e.g. funny protection mask such as -w- instead of rwx)
+ $perm &= 07777;
+ my $nperm = $perm | 0700;
+ if (!($arg->{safe} or $nperm == $perm or chmod($nperm, $root))) {
+ _error($arg, "cannot make child directory read-write-exec", $canon);
+ next ROOT_DIR;
+ }
+ elsif (!chdir($root)) {
+ _error($arg, "cannot chdir to child", $canon);
+ next ROOT_DIR;
+ }
+ }
+
+ my ($cur_dev, $cur_inode, $perm) = (stat $curdir)[0,1,2] or do {
+ _error($arg, "cannot stat current working directory", $canon);
+ next ROOT_DIR;
+ };
+
+ if ($Need_Stat_Check) {
+ ($ldev eq $cur_dev and $lino eq $cur_inode)
+ or _croak("directory $canon changed before chdir, expected dev=$ldev ino=$lino, actual dev=$cur_dev ino=$cur_inode, aborting.");
+ }
+
+ $perm &= 07777; # don't forget setuid, setgid, sticky bits
+ my $nperm = $perm | 0700;
+
+ # notabene: 0700 is for making readable in the first place,
+ # it's also intended to change it to writable in case we have
+ # to recurse in which case we are better than rm -rf for
+ # subtrees with strange permissions
+
+ if (!($arg->{safe} or $nperm == $perm or chmod($nperm, $curdir))) {
+ _error($arg, "cannot make directory read+writeable", $canon);
+ $nperm = $perm;
+ }
+
+ my $d;
+ $d = gensym() if $] < 5.006;
+ if (!opendir $d, $curdir) {
+ _error($arg, "cannot opendir", $canon);
+ @files = ();
+ }
+ else {
+ no strict 'refs';
+ if (!defined ${"\cTAINT"} or ${"\cTAINT"}) {
+ # Blindly untaint dir names if taint mode is
+ # active, or any perl < 5.006
+ @files = map { /\A(.*)\z/s; $1 } readdir $d;
+ }
+ else {
+ @files = readdir $d;
+ }
+ closedir $d;
+ }
+
+ if ($Is_VMS) {
+ # Deleting large numbers of files from VMS Files-11
+ # filesystems is faster if done in reverse ASCIIbetical order.
+ # include '.' to '.;' from blead patch #31775
+ @files = map {$_ eq '.' ? '.;' : $_} reverse @files;
+ ($root = VMS::Filespec::unixify($root)) =~ s/\.dir\z//;
+ }
+
+ @files = grep {$_ ne $updir and $_ ne $curdir} @files;
+
+ if (@files) {
+ # remove the contained files before the directory itself
+ my $narg = {%$arg};
+ @{$narg}{qw(device inode cwd prefix depth)}
+ = ($cur_dev, $cur_inode, $updir, $canon, $arg->{depth}+1);
+ $count += _rmtree($narg, \@files);
+ }
+
+ # restore directory permissions of required now (in case the rmdir
+ # below fails), while we are still in the directory and may do so
+ # without a race via '.'
+ if ($nperm != $perm and not chmod($perm, $curdir)) {
+ _error($arg, "cannot reset chmod", $canon);
+ }
+
+ # don't leave the client code in an unexpected directory
+ chdir($arg->{cwd})
+ or _croak("cannot chdir to $arg->{cwd} from $canon: $!, aborting.");
+
+ # ensure that a chdir upwards didn't take us somewhere other
+ # than we expected (see CVE-2002-0435)
+ ($cur_dev, $cur_inode) = (stat $curdir)[0,1]
+ or _croak("cannot stat prior working directory $arg->{cwd}: $!, aborting.");
+
+ if ($Need_Stat_Check) {
+ ($arg->{device} eq $cur_dev and $arg->{inode} eq $cur_inode)
+ or _croak("previous directory $arg->{cwd} changed before entering $canon, expected dev=$ldev ino=$lino, actual dev=$cur_dev ino=$cur_inode, aborting.");
+ }
+
+ if ($arg->{depth} or !$arg->{keep_root}) {
+ if ($arg->{safe} &&
+ ($Is_VMS ? !&VMS::Filespec::candelete($root) : !-w $root)) {
+ print "skipped $root\n" if $arg->{verbose};
+ next ROOT_DIR;
+ }
+ if ($Force_Writeable and !chmod $perm | 0700, $root) {
+ _error($arg, "cannot make directory writeable", $canon);
+ }
+ print "rmdir $root\n" if $arg->{verbose};
+ if (rmdir $root) {
+ push @{${$arg->{result}}}, $root if $arg->{result};
+ ++$count;
+ }
+ else {
+ _error($arg, "cannot remove directory", $canon);
+ if ($Force_Writeable && !chmod($perm, ($Is_VMS ? VMS::Filespec::fileify($root) : $root))
+ ) {
+ _error($arg, sprintf("cannot restore permissions to 0%o",$perm), $canon);
+ }
+ }
+ }
+ }
+ else {
+ # not a directory
+ $root = VMS::Filespec::vmsify("./$root")
+ if $Is_VMS
+ && !File::Spec->file_name_is_absolute($root)
+ && ($root !~ m/(?<!\^)[\]>]+/); # not already in VMS syntax
+
+ if ($arg->{safe} &&
+ ($Is_VMS ? !&VMS::Filespec::candelete($root)
+ : !(-l $root || -w $root)))
+ {
+ print "skipped $root\n" if $arg->{verbose};
+ next ROOT_DIR;
+ }
+
+ my $nperm = $perm & 07777 | 0600;
+ if ($Force_Writeable and $nperm != $perm and not chmod $nperm, $root) {
+ _error($arg, "cannot make file writeable", $canon);
+ }
+ print "unlink $canon\n" if $arg->{verbose};
+ # delete all versions under VMS
+ for (;;) {
+ if (unlink $root) {
+ push @{${$arg->{result}}}, $root if $arg->{result};
+ }
+ else {
+ _error($arg, "cannot unlink file", $canon);
+ $Force_Writeable and chmod($perm, $root) or
+ _error($arg, sprintf("cannot restore permissions to 0%o",$perm), $canon);
+ last;
+ }
+ ++$count;
+ last unless $Is_VMS && lstat $root;
+ }
+ }
+ }
+ return $count;
+}
+
+sub _slash_lc {
+ # fix up slashes and case on MSWin32 so that we can determine that
+ # c:\path\to\dir is underneath C:/Path/To
+ my $path = shift;
+ $path =~ tr{\\}{/};
+ return lc($path);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+File::Path - Create or remove directory trees
+
+=head1 VERSION
+
+This document describes version 2.08 of File::Path, released
+2009-10-04.
+
+=head1 SYNOPSIS
+
+ use File::Path qw(make_path remove_tree);
+
+ make_path('foo/bar/baz', '/zug/zwang');
+ make_path('foo/bar/baz', '/zug/zwang', {
+ verbose => 1,
+ mode => 0711,
+ });
+
+ remove_tree('foo/bar/baz', '/zug/zwang');
+ remove_tree('foo/bar/baz', '/zug/zwang', {
+ verbose => 1,
+ error => \my $err_list,
+ });
+
+ # legacy (interface promoted before v2.00)
+ mkpath('/foo/bar/baz');
+ mkpath('/foo/bar/baz', 1, 0711);
+ mkpath(['/foo/bar/baz', 'blurfl/quux'], 1, 0711);
+ rmtree('foo/bar/baz', 1, 1);
+ rmtree(['foo/bar/baz', 'blurfl/quux'], 1, 1);
+
+ # legacy (interface promoted before v2.06)
+ mkpath('foo/bar/baz', '/zug/zwang', { verbose => 1, mode => 0711 });
+ rmtree('foo/bar/baz', '/zug/zwang', { verbose => 1, mode => 0711 });
+
+=head1 DESCRIPTION
+
+This module provide a convenient way to create directories of
+arbitrary depth and to delete an entire directory subtree from the
+filesystem.
+
+The following functions are provided:
+
+=over
+
+=item make_path( $dir1, $dir2, .... )
+
+=item make_path( $dir1, $dir2, ...., \%opts )
+
+The C<make_path> function creates the given directories if they don't
+exists before, much like the Unix command C<mkdir -p>.
+
+The function accepts a list of directories to be created. Its
+behaviour may be tuned by an optional hashref appearing as the last
+parameter on the call.
+
+The function returns the list of directories actually created during
+the call; in scalar context the number of directories created.
+
+The following keys are recognised in the option hash:
+
+=over
+
+=item mode => $num
+
+The numeric permissions mode to apply to each created directory
+(defaults to 0777), to be modified by the current C<umask>. If the
+directory already exists (and thus does not need to be created),
+the permissions will not be modified.
+
+C<mask> is recognised as an alias for this parameter.
+
+=item verbose => $bool
+
+If present, will cause C<make_path> to print the name of each directory
+as it is created. By default nothing is printed.
+
+=item error => \$err
+
+If present, it should be a reference to a scalar.
+This scalar will be made to reference an array, which will
+be used to store any errors that are encountered. See the L</"ERROR
+HANDLING"> section for more information.
+
+If this parameter is not used, certain error conditions may raise
+a fatal error that will cause the program will halt, unless trapped
+in an C<eval> block.
+
+=item owner => $owner
+
+=item user => $owner
+
+=item uid => $owner
+
+If present, will cause any created directory to be owned by C<$owner>.
+If the value is numeric, it will be interpreted as a uid, otherwise
+as username is assumed. An error will be issued if the username cannot be
+mapped to a uid, or the uid does not exist, or the process lacks the
+privileges to change ownership.
+
+Ownwership of directories that already exist will not be changed.
+
+C<user> and C<uid> are aliases of C<owner>.
+
+=item group => $group
+
+If present, will cause any created directory to be owned by the group C<$group>.
+If the value is numeric, it will be interpreted as a gid, otherwise
+as group name is assumed. An error will be issued if the group name cannot be
+mapped to a gid, or the gid does not exist, or the process lacks the
+privileges to change group ownership.
+
+Group ownwership of directories that already exist will not be changed.
+
+ make_path '/var/tmp/webcache', {owner=>'nobody', group=>'nogroup'};
+
+=back
+
+=item mkpath( $dir )
+
+=item mkpath( $dir, $verbose, $mode )
+
+=item mkpath( [$dir1, $dir2,...], $verbose, $mode )
+
+=item mkpath( $dir1, $dir2,..., \%opt )
+
+The mkpath() function provide the legacy interface of make_path() with
+a different interpretation of the arguments passed. The behaviour and
+return value of the function is otherwise identical to make_path().
+
+=item remove_tree( $dir1, $dir2, .... )
+
+=item remove_tree( $dir1, $dir2, ...., \%opts )
+
+The C<remove_tree> function deletes the given directories and any
+files and subdirectories they might contain, much like the Unix
+command C<rm -r> or C<del /s> on Windows.
+
+The function accepts a list of directories to be
+removed. Its behaviour may be tuned by an optional hashref
+appearing as the last parameter on the call.
+
+The functions returns the number of files successfully deleted.
+
+The following keys are recognised in the option hash:
+
+=over
+
+=item verbose => $bool
+
+If present, will cause C<remove_tree> to print the name of each file as
+it is unlinked. By default nothing is printed.
+
+=item safe => $bool
+
+When set to a true value, will cause C<remove_tree> to skip the files
+for which the process lacks the required privileges needed to delete
+files, such as delete privileges on VMS. In other words, the code
+will make no attempt to alter file permissions. Thus, if the process
+is interrupted, no filesystem object will be left in a more
+permissive mode.
+
+=item keep_root => $bool
+
+When set to a true value, will cause all files and subdirectories
+to be removed, except the initially specified directories. This comes
+in handy when cleaning out an application's scratch directory.
+
+ remove_tree( '/tmp', {keep_root => 1} );
+
+=item result => \$res
+
+If present, it should be a reference to a scalar.
+This scalar will be made to reference an array, which will
+be used to store all files and directories unlinked
+during the call. If nothing is unlinked, the array will be empty.
+
+ remove_tree( '/tmp', {result => \my $list} );
+ print "unlinked $_\n" for @$list;
+
+This is a useful alternative to the C<verbose> key.
+
+=item error => \$err
+
+If present, it should be a reference to a scalar.
+This scalar will be made to reference an array, which will
+be used to store any errors that are encountered. See the L</"ERROR
+HANDLING"> section for more information.
+
+Removing things is a much more dangerous proposition than
+creating things. As such, there are certain conditions that
+C<remove_tree> may encounter that are so dangerous that the only
+sane action left is to kill the program.
+
+Use C<error> to trap all that is reasonable (problems with
+permissions and the like), and let it die if things get out
+of hand. This is the safest course of action.
+
+=back
+
+=item rmtree( $dir )
+
+=item rmtree( $dir, $verbose, $safe )
+
+=item rmtree( [$dir1, $dir2,...], $verbose, $safe )
+
+=item rmtree( $dir1, $dir2,..., \%opt )
+
+The rmtree() function provide the legacy interface of remove_tree()
+with a different interpretation of the arguments passed. The behaviour
+and return value of the function is otherwise identical to
+remove_tree().
+
+=back
+
+=head2 ERROR HANDLING
+
+=over 4
+
+=item B<NOTE:>
+
+The following error handling mechanism is considered
+experimental and is subject to change pending feedback from
+users.
+
+=back
+
+If C<make_path> or C<remove_tree> encounter an error, a diagnostic
+message will be printed to C<STDERR> via C<carp> (for non-fatal
+errors), or via C<croak> (for fatal errors).
+
+If this behaviour is not desirable, the C<error> attribute may be
+used to hold a reference to a variable, which will be used to store
+the diagnostics. The variable is made a reference to an array of hash
+references. Each hash contain a single key/value pair where the key
+is the name of the file, and the value is the error message (including
+the contents of C<$!> when appropriate). If a general error is
+encountered the diagnostic key will be empty.
+
+An example usage looks like:
+
+ remove_tree( 'foo/bar', 'bar/rat', {error => \my $err} );
+ if (@$err) {
+ for my $diag (@$err) {
+ my ($file, $message) = %$diag;
+ if ($file eq '') {
+ print "general error: $message\n";
+ }
+ else {
+ print "problem unlinking $file: $message\n";
+ }
+ }
+ }
+ else {
+ print "No error encountered\n";
+ }
+
+Note that if no errors are encountered, C<$err> will reference an
+empty array. This means that C<$err> will always end up TRUE; so you
+need to test C<@$err> to determine if errors occured.
+
+=head2 NOTES
+
+C<File::Path> blindly exports C<mkpath> and C<rmtree> into the
+current namespace. These days, this is considered bad style, but
+to change it now would break too much code. Nonetheless, you are
+invited to specify what it is you are expecting to use:
+
+ use File::Path 'rmtree';
+
+The routines C<make_path> and C<remove_tree> are B<not> exported
+by default. You must specify which ones you want to use.
+
+ use File::Path 'remove_tree';
+
+Note that a side-effect of the above is that C<mkpath> and C<rmtree>
+are no longer exported at all. This is due to the way the C<Exporter>
+module works. If you are migrating a codebase to use the new
+interface, you will have to list everything explicitly. But that's
+just good practice anyway.
+
+ use File::Path qw(remove_tree rmtree);
+
+=head3 API CHANGES
+
+The API was changed in the 2.0 branch. For a time, C<mkpath> and
+C<rmtree> tried, unsuccessfully, to deal with the two different
+calling mechanisms. This approach was considered a failure.
+
+The new semantics are now only available with C<make_path> and
+C<remove_tree>. The old semantics are only available through
+C<mkpath> and C<rmtree>. Users are strongly encouraged to upgrade
+to at least 2.08 in order to avoid surprises.
+
+=head3 SECURITY CONSIDERATIONS
+
+There were race conditions 1.x implementations of File::Path's
+C<rmtree> function (although sometimes patched depending on the OS
+distribution or platform). The 2.0 version contains code to avoid the
+problem mentioned in CVE-2002-0435.
+
+See the following pages for more information:
+
+ http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=286905
+ http://www.nntp.perl.org/group/perl.perl5.porters/2005/01/msg97623.html
+ http://www.debian.org/security/2005/dsa-696
+
+Additionally, unless the C<safe> parameter is set (or the
+third parameter in the traditional interface is TRUE), should a
+C<remove_tree> be interrupted, files that were originally in read-only
+mode may now have their permissions set to a read-write (or "delete
+OK") mode.
+
+=head1 DIAGNOSTICS
+
+FATAL errors will cause the program to halt (C<croak>), since the
+problem is so severe that it would be dangerous to continue. (This
+can always be trapped with C<eval>, but it's not a good idea. Under
+the circumstances, dying is the best thing to do).
+
+SEVERE errors may be trapped using the modern interface. If the
+they are not trapped, or the old interface is used, such an error
+will cause the program will halt.
+
+All other errors may be trapped using the modern interface, otherwise
+they will be C<carp>ed about. Program execution will not be halted.
+
+=over 4
+
+=item mkdir [path]: [errmsg] (SEVERE)
+
+C<make_path> was unable to create the path. Probably some sort of
+permissions error at the point of departure, or insufficient resources
+(such as free inodes on Unix).
+
+=item No root path(s) specified
+
+C<make_path> was not given any paths to create. This message is only
+emitted if the routine is called with the traditional interface.
+The modern interface will remain silent if given nothing to do.
+
+=item No such file or directory
+
+On Windows, if C<make_path> gives you this warning, it may mean that
+you have exceeded your filesystem's maximum path length.
+
+=item cannot fetch initial working directory: [errmsg]
+
+C<remove_tree> attempted to determine the initial directory by calling
+C<Cwd::getcwd>, but the call failed for some reason. No attempt
+will be made to delete anything.
+
+=item cannot stat initial working directory: [errmsg]
+
+C<remove_tree> attempted to stat the initial directory (after having
+successfully obtained its name via C<getcwd>), however, the call
+failed for some reason. No attempt will be made to delete anything.
+
+=item cannot chdir to [dir]: [errmsg]
+
+C<remove_tree> attempted to set the working directory in order to
+begin deleting the objects therein, but was unsuccessful. This is
+usually a permissions issue. The routine will continue to delete
+other things, but this directory will be left intact.
+
+=item directory [dir] changed before chdir, expected dev=[n] ino=[n], actual dev=[n] ino=[n], aborting. (FATAL)
+
+C<remove_tree> recorded the device and inode of a directory, and then
+moved into it. It then performed a C<stat> on the current directory
+and detected that the device and inode were no longer the same. As
+this is at the heart of the race condition problem, the program
+will die at this point.
+
+=item cannot make directory [dir] read+writeable: [errmsg]
+
+C<remove_tree> attempted to change the permissions on the current directory
+to ensure that subsequent unlinkings would not run into problems,
+but was unable to do so. The permissions remain as they were, and
+the program will carry on, doing the best it can.
+
+=item cannot read [dir]: [errmsg]
+
+C<remove_tree> tried to read the contents of the directory in order
+to acquire the names of the directory entries to be unlinked, but
+was unsuccessful. This is usually a permissions issue. The
+program will continue, but the files in this directory will remain
+after the call.
+
+=item cannot reset chmod [dir]: [errmsg]
+
+C<remove_tree>, after having deleted everything in a directory, attempted
+to restore its permissions to the original state but failed. The
+directory may wind up being left behind.
+
+=item cannot remove [dir] when cwd is [dir]
+
+The current working directory of the program is F</some/path/to/here>
+and you are attempting to remove an ancestor, such as F</some/path>.
+The directory tree is left untouched.
+
+The solution is to C<chdir> out of the child directory to a place
+outside the directory tree to be removed.
+
+=item cannot chdir to [parent-dir] from [child-dir]: [errmsg], aborting. (FATAL)
+
+C<remove_tree>, after having deleted everything and restored the permissions
+of a directory, was unable to chdir back to the parent. The program
+halts to avoid a race condition from occurring.
+
+=item cannot stat prior working directory [dir]: [errmsg], aborting. (FATAL)
+
+C<remove_tree> was unable to stat the parent directory after have returned
+from the child. Since there is no way of knowing if we returned to
+where we think we should be (by comparing device and inode) the only
+way out is to C<croak>.
+
+=item previous directory [parent-dir] changed before entering [child-dir], expected dev=[n] ino=[n], actual dev=[n] ino=[n], aborting. (FATAL)
+
+When C<remove_tree> returned from deleting files in a child directory, a
+check revealed that the parent directory it returned to wasn't the one
+it started out from. This is considered a sign of malicious activity.
+
+=item cannot make directory [dir] writeable: [errmsg]
+
+Just before removing a directory (after having successfully removed
+everything it contained), C<remove_tree> attempted to set the permissions
+on the directory to ensure it could be removed and failed. Program
+execution continues, but the directory may possibly not be deleted.
+
+=item cannot remove directory [dir]: [errmsg]
+
+C<remove_tree> attempted to remove a directory, but failed. This may because
+some objects that were unable to be removed remain in the directory, or
+a permissions issue. The directory will be left behind.
+
+=item cannot restore permissions of [dir] to [0nnn]: [errmsg]
+
+After having failed to remove a directory, C<remove_tree> was unable to
+restore its permissions from a permissive state back to a possibly
+more restrictive setting. (Permissions given in octal).
+
+=item cannot make file [file] writeable: [errmsg]
+
+C<remove_tree> attempted to force the permissions of a file to ensure it
+could be deleted, but failed to do so. It will, however, still attempt
+to unlink the file.
+
+=item cannot unlink file [file]: [errmsg]
+
+C<remove_tree> failed to remove a file. Probably a permissions issue.
+
+=item cannot restore permissions of [file] to [0nnn]: [errmsg]
+
+After having failed to remove a file, C<remove_tree> was also unable
+to restore the permissions on the file to a possibly less permissive
+setting. (Permissions given in octal).
+
+=item unable to map [owner] to a uid, ownership not changed");
+
+C<make_path> was instructed to give the ownership of created
+directories to the symbolic name [owner], but C<getpwnam> did
+not return the corresponding numeric uid. The directory will
+be created, but ownership will not be changed.
+
+=item unable to map [group] to a gid, group ownership not changed
+
+C<make_path> was instructed to give the group ownership of created
+directories to the symbolic name [group], but C<getgrnam> did
+not return the corresponding numeric gid. The directory will
+be created, but group ownership will not be changed.
+
+=back
+
+=head1 SEE ALSO
+
+=over 4
+
+=item *
+
+L<File::Remove>
+
+Allows files and directories to be moved to the Trashcan/Recycle
+Bin (where they may later be restored if necessary) if the operating
+system supports such functionality. This feature may one day be
+made available directly in C<File::Path>.
+
+=item *
+
+L<File::Find::Rule>
+
+When removing directory trees, if you want to examine each file to
+decide whether to delete it (and possibly leaving large swathes
+alone), F<File::Find::Rule> offers a convenient and flexible approach
+to examining directory trees.
+
+=back
+
+=head1 BUGS
+
+Please report all bugs on the RT queue:
+
+L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=File-Path>
+
+=head1 ACKNOWLEDGEMENTS
+
+Paul Szabo identified the race condition originally, and Brendan
+O'Dea wrote an implementation for Debian that addressed the problem.
+That code was used as a basis for the current code. Their efforts
+are greatly appreciated.
+
+Gisle Aas made a number of improvements to the documentation for
+2.07 and his advice and assistance is also greatly appreciated.
+
+=head1 AUTHORS
+
+Tim Bunce and Charles Bailey. Currently maintained by David Landgren
+<F<david@landgren.net>>.
+
+=head1 COPYRIGHT
+
+This module is copyright (C) Charles Bailey, Tim Bunce and
+David Landgren 1995-2009. All rights reserved.
+
+=head1 LICENSE
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Remove.pm b/Master/tlpkg/tlperl.straw/lib/File/Remove.pm
new file mode 100755
index 00000000000..15df470cf47
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Remove.pm
@@ -0,0 +1,329 @@
+package File::Remove;
+
+use 5.005;
+use strict;
+
+use vars qw{$VERSION @ISA @EXPORT_OK};
+use vars qw{$debug $unlink $rmdir};
+BEGIN {
+ $VERSION = '1.42';
+ @ISA = qw{ Exporter};
+ @EXPORT_OK = qw{ remove rm clear trash };
+}
+
+# If we ever need a Mac::Glue object we will want to cache it.
+my $glue;
+
+use File::Spec ();
+use File::Path ();
+use File::Glob ();
+
+sub expand (@) {
+ map { -e $_ ? $_ : File::Glob::bsd_glob($_) } @_;
+}
+
+# $debug variable must be set before loading File::Remove.
+# Convert to a constant to allow debugging code to be pruned out.
+use constant DEBUG => !! $debug;
+
+# Are we on VMS?
+# If so copy File::Path and assume VMS::Filespec is loaded
+use constant IS_VMS => !! ( $^O eq 'VMS' );
+
+# Are we on Mac?
+# If so we'll need to do some special trash work
+use constant IS_MAC => !! ( $^O eq 'darwin' );
+
+# Are we on Win32?
+# If so write permissions does not imply deletion permissions
+use constant IS_WIN32 => !! ( $^O =~ /^MSWin/ or $^O eq 'cygwin' );
+
+
+
+
+
+#####################################################################
+# Main Functions
+
+my @END_DELETE = ();
+
+sub clear (@) {
+ my @files = expand( @_ );
+
+ # Do the initial deletion
+ foreach my $file ( @files ) {
+ next unless -e $file;
+ remove( \1, $file );
+ }
+
+ # Delete again at END-time
+ push @END_DELETE, @files;
+}
+
+END {
+ foreach my $file ( @END_DELETE ) {
+ next unless -e $file;
+ remove( \1, $file );
+ }
+}
+
+# acts like unlink would until given a directory as an argument, then
+# it acts like rm -rf ;) unless the recursive arg is zero which it is by
+# default
+sub remove (@) {
+ my $recursive = (ref $_[0] eq 'SCALAR') ? shift : \0;
+ my @files = expand(@_);
+
+ # Iterate over the files
+ my @removes;
+ foreach my $path ( @files ) {
+ # need to check for symlink first
+ # could be pointing to nonexisting/non-readable destination
+ if ( -l $path ) {
+ print "link: $path\n" if DEBUG;
+ if ( $unlink ? $unlink->($path) : unlink($path) ) {
+ push @removes, $path;
+ }
+ next;
+ }
+ unless ( -e $path ) {
+ print "missing: $path\n" if DEBUG;
+ push @removes, $path; # Say we deleted it
+ next;
+ }
+ my $can_delete;
+ if ( IS_VMS ) {
+ $can_delete = VMS::Filespec::candelete($path);
+ } elsif ( IS_WIN32 ) {
+ # Assume we can delete it for the moment
+ $can_delete = 1;
+ } elsif ( -w $path ) {
+ # We have write permissions already
+ $can_delete = 1;
+ } elsif ( $< == 0 ) {
+ # Unixy and root
+ $can_delete = 1;
+ } elsif ( (lstat($path))[4] == $< ) {
+ # I own the file
+ $can_delete = 1;
+ } else {
+ # I don't think we can delete it
+ $can_delete = 0;
+ }
+ unless ( $can_delete ) {
+ print "nowrite: $path\n" if DEBUG;
+ next;
+ }
+
+ if ( -f $path ) {
+ print "file: $path\n" if DEBUG;
+ unless ( -w $path ) {
+ # Make the file writable (implementation from File::Path)
+ (undef, undef, my $rp) = lstat $path or next;
+ $rp &= 07777; # Don't forget setuid, setgid, sticky bits
+ $rp |= 0600; # Turn on user read/write
+ chmod $rp, $path;
+ }
+ if ( $unlink ? $unlink->($path) : unlink($path) ) {
+ # Failed to delete the file
+ next if -e $path;
+ push @removes, $path;
+ }
+
+ } elsif ( -d $path ) {
+ print "dir: $path\n" if DEBUG;
+ my $dir = File::Spec->canonpath( $path );
+ if ( $$recursive ) {
+ if ( File::Path::rmtree( [ $dir ], DEBUG, 0 ) ) {
+ # Failed to delete the directory
+ next if -e $path;
+ push @removes, $path;
+ }
+
+ } else {
+ my ($save_mode) = (stat $dir)[2];
+ chmod $save_mode & 0777, $dir; # just in case we cannot remove it.
+ if ( $rmdir ? $rmdir->($dir) : rmdir($dir) ) {
+ # Failed to delete the directory
+ next if -e $path;
+ push @removes, $path;
+ }
+ }
+
+ } else {
+ print "???: $path\n" if DEBUG;
+ }
+ }
+
+ return @removes;
+}
+
+sub rm (@) {
+ goto &remove;
+}
+
+sub trash (@) {
+ local $unlink = $unlink;
+ local $rmdir = $rmdir;
+
+ if ( ref $_[0] eq 'HASH' ) {
+ my %options = %{+shift @_};
+ $unlink = $options{unlink};
+ $rmdir = $options{rmdir};
+
+ } elsif ( IS_WIN32 ) {
+ local $@;
+ eval 'use Win32::FileOp ();';
+ die "Can't load Win32::FileOp to support the Recycle Bin: \$@ = $@" if length $@;
+ $unlink = \&Win32::FileOp::Recycle;
+ $rmdir = \&Win32::FileOp::Recycle;
+
+ } elsif ( IS_MAC ) {
+ unless ( $glue ) {
+ local $@;
+ eval 'use Mac::Glue ();';
+ die "Can't load Mac::Glue::Finder to support the Trash Can: \$@ = $@" if length $@;
+ $glue = Mac::Glue->new('Finder');
+ }
+ my $code = sub {
+ my @files = map {
+ Mac::Glue::param_type(
+ Mac::Glue::typeAlias() => $_
+ )
+ } @_;
+ $glue->delete(\@files);
+ };
+ $unlink = $code;
+ $rmdir = $code;
+ } else {
+ die "Support for trash() on platform '$^O' not available at this time.\n";
+ }
+
+ goto &remove;
+}
+
+sub undelete (@) {
+ goto &trash;
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+File::Remove - Remove files and directories
+
+=head1 SYNOPSIS
+
+ use File::Remove 'remove';
+
+ # removes (without recursion) several files
+ remove( '*.c', '*.pl' );
+
+ # removes (with recursion) several directories
+ remove( \1, qw{directory1 directory2} );
+
+ # removes (with recursion) several files and directories
+ remove( \1, qw{file1 file2 directory1 *~} );
+
+ # trashes (with support for undeleting later) several files
+ trash( '*~' );
+
+=head1 DESCRIPTION
+
+B<File::Remove::remove> removes files and directories. It acts like
+B</bin/rm>, for the most part. Although C<unlink> can be given a list
+of files, it will not remove directories; this module remedies that.
+It also accepts wildcards, * and ?, as arguments for filenames.
+
+B<File::Remove::trash> accepts the same arguments as B<remove>, with
+the addition of an optional, infrequently used "other platforms"
+hashref.
+
+=head1 SUBROUTINES
+
+=head2 remove
+
+Removes files and directories. Directories are removed recursively like
+in B<rm -rf> if the first argument is a reference to a scalar that
+evaluates to true. If the first arguemnt is a reference to a scalar
+then it is used as the value of the recursive flag. By default it's
+false so only pass \1 to it.
+
+In list context it returns a list of files/directories removed, in
+scalar context it returns the number of files/directories removed. The
+list/number should match what was passed in if everything went well.
+
+=head2 rm
+
+Just calls B<remove>. It's there for people who get tired of typing
+B<remove>.
+
+=head2 clear
+
+The C<clear> function is a version of C<remove> designed for
+use in test scripts. It takes a list of paths that it will both
+initially delete during the current test run, and then further
+flag for deletion at END-time as a convenience for the next test
+run.
+
+=head2 trash
+
+Removes files and directories, with support for undeleting later.
+Accepts an optional "other platforms" hashref, passing the remaining
+arguments to B<remove>.
+
+=over 4
+
+=item Win32
+
+Requires L<Win32::FileOp>.
+
+Installation not actually enforced on Win32 yet, since L<Win32::FileOp>
+has badly failing dependencies at time of writing.
+
+=item OS X
+
+Requires L<Mac::Glue>.
+
+=item Other platforms
+
+The first argument to trash() must be a hashref with two keys,
+'rmdir' and 'unlink', each referencing a coderef. The coderefs
+will be called with the filenames that are to be deleted.
+
+=back
+
+=head1 SUPPORT
+
+Bugs should always be submitted via the CPAN bug tracker
+
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=File-Remove>
+
+For other issues, contact the maintainer.
+
+=head1 AUTHOR
+
+Adam Kennedy E<lt>adamk@cpan.orgE<gt>
+
+=head1 COPYRIGHT
+
+Some parts copyright 2006 - 2008 Adam Kennedy.
+
+Taken over by Adam Kennedy E<lt>adamk@cpan.orgE<gt>, to fix the
+"deep readonly files" bug, and do some more cleaning up.
+
+Some parts copyright 2004 - 2005 Richard Soderberg.
+
+Taken over by Richard Soderberg E<lt>perl@crystalflame.netE<gt>, so as
+to port it to L<File::Spec> and add tests.
+
+Original copyright: 1998 by Gabor Egressy, E<lt>gabor@vmunix.comE<gt>.
+
+This program is free software; you can redistribute and/or modify it under
+the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Spec.pm b/Master/tlpkg/tlperl.straw/lib/File/Spec.pm
new file mode 100755
index 00000000000..40c731649ac
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Spec.pm
@@ -0,0 +1,336 @@
+package File::Spec;
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+$VERSION = '3.31';
+$VERSION = eval $VERSION;
+
+my %module = (MacOS => 'Mac',
+ MSWin32 => 'Win32',
+ os2 => 'OS2',
+ VMS => 'VMS',
+ epoc => 'Epoc',
+ NetWare => 'Win32', # Yes, File::Spec::Win32 works on NetWare.
+ symbian => 'Win32', # Yes, File::Spec::Win32 works on symbian.
+ dos => 'OS2', # Yes, File::Spec::OS2 works on DJGPP.
+ cygwin => 'Cygwin');
+
+
+my $module = $module{$^O} || 'Unix';
+
+require "File/Spec/$module.pm";
+@ISA = ("File::Spec::$module");
+
+1;
+
+__END__
+
+=head1 NAME
+
+File::Spec - portably perform operations on file names
+
+=head1 SYNOPSIS
+
+ use File::Spec;
+
+ $x=File::Spec->catfile('a', 'b', 'c');
+
+which returns 'a/b/c' under Unix. Or:
+
+ use File::Spec::Functions;
+
+ $x = catfile('a', 'b', 'c');
+
+=head1 DESCRIPTION
+
+This module is designed to support operations commonly performed on file
+specifications (usually called "file names", but not to be confused with the
+contents of a file, or Perl's file handles), such as concatenating several
+directory and file names into a single path, or determining whether a path
+is rooted. It is based on code directly taken from MakeMaker 5.17, code
+written by Andreas KE<ouml>nig, Andy Dougherty, Charles Bailey, Ilya
+Zakharevich, Paul Schinder, and others.
+
+Since these functions are different for most operating systems, each set of
+OS specific routines is available in a separate module, including:
+
+ File::Spec::Unix
+ File::Spec::Mac
+ File::Spec::OS2
+ File::Spec::Win32
+ File::Spec::VMS
+
+The module appropriate for the current OS is automatically loaded by
+File::Spec. Since some modules (like VMS) make use of facilities available
+only under that OS, it may not be possible to load all modules under all
+operating systems.
+
+Since File::Spec is object oriented, subroutines should not be called directly,
+as in:
+
+ File::Spec::catfile('a','b');
+
+but rather as class methods:
+
+ File::Spec->catfile('a','b');
+
+For simple uses, L<File::Spec::Functions> provides convenient functional
+forms of these methods.
+
+=head1 METHODS
+
+=over 2
+
+=item canonpath
+X<canonpath>
+
+No physical check on the filesystem, but a logical cleanup of a
+path.
+
+ $cpath = File::Spec->canonpath( $path ) ;
+
+Note that this does *not* collapse F<x/../y> sections into F<y>. This
+is by design. If F</foo> on your system is a symlink to F</bar/baz>,
+then F</foo/../quux> is actually F</bar/quux>, not F</quux> as a naive
+F<../>-removal would give you. If you want to do this kind of
+processing, you probably want C<Cwd>'s C<realpath()> function to
+actually traverse the filesystem cleaning up paths like this.
+
+=item catdir
+X<catdir>
+
+Concatenate two or more directory names to form a complete path ending
+with a directory. But remove the trailing slash from the resulting
+string, because it doesn't look good, isn't necessary and confuses
+OS/2. Of course, if this is the root directory, don't cut off the
+trailing slash :-)
+
+ $path = File::Spec->catdir( @directories );
+
+=item catfile
+X<catfile>
+
+Concatenate one or more directory names and a filename to form a
+complete path ending with a filename
+
+ $path = File::Spec->catfile( @directories, $filename );
+
+=item curdir
+X<curdir>
+
+Returns a string representation of the current directory.
+
+ $curdir = File::Spec->curdir();
+
+=item devnull
+X<devnull>
+
+Returns a string representation of the null device.
+
+ $devnull = File::Spec->devnull();
+
+=item rootdir
+X<rootdir>
+
+Returns a string representation of the root directory.
+
+ $rootdir = File::Spec->rootdir();
+
+=item tmpdir
+X<tmpdir>
+
+Returns a string representation of the first writable directory from a
+list of possible temporary directories. Returns the current directory
+if no writable temporary directories are found. The list of directories
+checked depends on the platform; e.g. File::Spec::Unix checks C<$ENV{TMPDIR}>
+(unless taint is on) and F</tmp>.
+
+ $tmpdir = File::Spec->tmpdir();
+
+=item updir
+X<updir>
+
+Returns a string representation of the parent directory.
+
+ $updir = File::Spec->updir();
+
+=item no_upwards
+
+Given a list of file names, strip out those that refer to a parent
+directory. (Does not strip symlinks, only '.', '..', and equivalents.)
+
+ @paths = File::Spec->no_upwards( @paths );
+
+=item case_tolerant
+
+Returns a true or false value indicating, respectively, that alphabetic
+case is not or is significant when comparing file specifications.
+
+ $is_case_tolerant = File::Spec->case_tolerant();
+
+=item file_name_is_absolute
+
+Takes as its argument a path, and returns true if it is an absolute path.
+
+ $is_absolute = File::Spec->file_name_is_absolute( $path );
+
+This does not consult the local filesystem on Unix, Win32, OS/2, or
+Mac OS (Classic). It does consult the working environment for VMS
+(see L<File::Spec::VMS/file_name_is_absolute>).
+
+=item path
+X<path>
+
+Takes no argument. Returns the environment variable C<PATH> (or the local
+platform's equivalent) as a list.
+
+ @PATH = File::Spec->path();
+
+=item join
+X<join, path>
+
+join is the same as catfile.
+
+=item splitpath
+X<splitpath> X<split, path>
+
+Splits a path in to volume, directory, and filename portions. On systems
+with no concept of volume, returns '' for volume.
+
+ ($volume,$directories,$file) = File::Spec->splitpath( $path );
+ ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
+
+For systems with no syntax differentiating filenames from directories,
+assumes that the last file is a path unless C<$no_file> is true or a
+trailing separator or F</.> or F</..> is present. On Unix, this means that C<$no_file>
+true makes this return ( '', $path, '' ).
+
+The directory portion may or may not be returned with a trailing '/'.
+
+The results can be passed to L</catpath()> to get back a path equivalent to
+(usually identical to) the original path.
+
+=item splitdir
+X<splitdir> X<split, dir>
+
+The opposite of L</catdir()>.
+
+ @dirs = File::Spec->splitdir( $directories );
+
+C<$directories> must be only the directory portion of the path on systems
+that have the concept of a volume or that have path syntax that differentiates
+files from directories.
+
+Unlike just splitting the directories on the separator, empty
+directory names (C<''>) can be returned, because these are significant
+on some OSes.
+
+=item catpath()
+
+Takes volume, directory and file portions and returns an entire path. Under
+Unix, C<$volume> is ignored, and directory and file are concatenated. A '/' is
+inserted if need be. On other OSes, C<$volume> is significant.
+
+ $full_path = File::Spec->catpath( $volume, $directory, $file );
+
+=item abs2rel
+X<abs2rel> X<absolute, path> X<relative, path>
+
+Takes a destination path and an optional base path returns a relative path
+from the base path to the destination path:
+
+ $rel_path = File::Spec->abs2rel( $path ) ;
+ $rel_path = File::Spec->abs2rel( $path, $base ) ;
+
+If C<$base> is not present or '', then L<Cwd::cwd()|Cwd> is used. If C<$base> is
+relative, then it is converted to absolute form using
+L</rel2abs()>. This means that it is taken to be relative to
+L<Cwd::cwd()|Cwd>.
+
+On systems with the concept of volume, if C<$path> and C<$base> appear to be
+on two different volumes, we will not attempt to resolve the two
+paths, and we will instead simply return C<$path>. Note that previous
+versions of this module ignored the volume of C<$base>, which resulted in
+garbage results part of the time.
+
+On systems that have a grammar that indicates filenames, this ignores the
+C<$base> filename as well. Otherwise all path components are assumed to be
+directories.
+
+If C<$path> is relative, it is converted to absolute form using L</rel2abs()>.
+This means that it is taken to be relative to L<Cwd::cwd()|Cwd>.
+
+No checks against the filesystem are made. On VMS, there is
+interaction with the working environment, as logicals and
+macros are expanded.
+
+Based on code written by Shigio Yamaguchi.
+
+=item rel2abs()
+X<rel2abs> X<absolute, path> X<relative, path>
+
+Converts a relative path to an absolute path.
+
+ $abs_path = File::Spec->rel2abs( $path ) ;
+ $abs_path = File::Spec->rel2abs( $path, $base ) ;
+
+If C<$base> is not present or '', then L<Cwd::cwd()|Cwd> is used. If C<$base> is relative,
+then it is converted to absolute form using L</rel2abs()>. This means that it
+is taken to be relative to L<Cwd::cwd()|Cwd>.
+
+On systems with the concept of volume, if C<$path> and C<$base> appear to be
+on two different volumes, we will not attempt to resolve the two
+paths, and we will instead simply return C<$path>. Note that previous
+versions of this module ignored the volume of C<$base>, which resulted in
+garbage results part of the time.
+
+On systems that have a grammar that indicates filenames, this ignores the
+C<$base> filename as well. Otherwise all path components are assumed to be
+directories.
+
+If C<$path> is absolute, it is cleaned up and returned using L</canonpath()>.
+
+No checks against the filesystem are made. On VMS, there is
+interaction with the working environment, as logicals and
+macros are expanded.
+
+Based on code written by Shigio Yamaguchi.
+
+=back
+
+For further information, please see L<File::Spec::Unix>,
+L<File::Spec::Mac>, L<File::Spec::OS2>, L<File::Spec::Win32>, or
+L<File::Spec::VMS>.
+
+=head1 SEE ALSO
+
+L<File::Spec::Unix>, L<File::Spec::Mac>, L<File::Spec::OS2>,
+L<File::Spec::Win32>, L<File::Spec::VMS>, L<File::Spec::Functions>,
+L<ExtUtils::MakeMaker>
+
+=head1 AUTHOR
+
+Currently maintained by Ken Williams C<< <KWILLIAMS@cpan.org> >>.
+
+The vast majority of the code was written by
+Kenneth Albanowski C<< <kjahds@kjahds.com> >>,
+Andy Dougherty C<< <doughera@lafayette.edu> >>,
+Andreas KE<ouml>nig C<< <A.Koenig@franz.ww.TU-Berlin.DE> >>,
+Tim Bunce C<< <Tim.Bunce@ig.co.uk> >>.
+VMS support by Charles Bailey C<< <bailey@newman.upenn.edu> >>.
+OS/2 support by Ilya Zakharevich C<< <ilya@math.ohio-state.edu> >>.
+Mac support by Paul Schinder C<< <schinder@pobox.com> >>, and
+Thomas Wegner C<< <wegner_thomas@yahoo.com> >>.
+abs2rel() and rel2abs() written by Shigio Yamaguchi C<< <shigio@tamacom.com> >>,
+modified by Barrie Slaymaker C<< <barries@slaysys.com> >>.
+splitpath(), splitdir(), catpath() and catdir() by Barrie Slaymaker.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Spec/Cygwin.pm b/Master/tlpkg/tlperl.straw/lib/File/Spec/Cygwin.pm
new file mode 100755
index 00000000000..050a1bb2b77
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Spec/Cygwin.pm
@@ -0,0 +1,155 @@
+package File::Spec::Cygwin;
+
+use strict;
+use vars qw(@ISA $VERSION);
+require File::Spec::Unix;
+
+$VERSION = '3.30';
+$VERSION = eval $VERSION;
+
+@ISA = qw(File::Spec::Unix);
+
+=head1 NAME
+
+File::Spec::Cygwin - methods for Cygwin file specs
+
+=head1 SYNOPSIS
+
+ require File::Spec::Cygwin; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+implementation of these methods, not the semantics.
+
+This module is still in beta. Cygwin-knowledgeable folks are invited
+to offer patches and suggestions.
+
+=cut
+
+=pod
+
+=over 4
+
+=item canonpath
+
+Any C<\> (backslashes) are converted to C</> (forward slashes),
+and then File::Spec::Unix canonpath() is called on the result.
+
+=cut
+
+sub canonpath {
+ my($self,$path) = @_;
+ return unless defined $path;
+
+ $path =~ s|\\|/|g;
+
+ # Handle network path names beginning with double slash
+ my $node = '';
+ if ( $path =~ s@^(//[^/]+)(?:/|\z)@/@s ) {
+ $node = $1;
+ }
+ return $node . $self->SUPER::canonpath($path);
+}
+
+sub catdir {
+ my $self = shift;
+ return unless @_;
+
+ # Don't create something that looks like a //network/path
+ if ($_[0] and ($_[0] eq '/' or $_[0] eq '\\')) {
+ shift;
+ return $self->SUPER::catdir('', @_);
+ }
+
+ $self->SUPER::catdir(@_);
+}
+
+=pod
+
+=item file_name_is_absolute
+
+True is returned if the file name begins with C<drive_letter:>,
+and if not, File::Spec::Unix file_name_is_absolute() is called.
+
+=cut
+
+
+sub file_name_is_absolute {
+ my ($self,$file) = @_;
+ return 1 if $file =~ m{^([a-z]:)?[\\/]}is; # C:/test
+ return $self->SUPER::file_name_is_absolute($file);
+}
+
+=item tmpdir (override)
+
+Returns a string representation of the first existing directory
+from the following list:
+
+ $ENV{TMPDIR}
+ /tmp
+ $ENV{'TMP'}
+ $ENV{'TEMP'}
+ C:/temp
+
+Since Perl 5.8.0, if running under taint mode, and if the environment
+variables are tainted, they are not used.
+
+=cut
+
+my $tmpdir;
+sub tmpdir {
+ return $tmpdir if defined $tmpdir;
+ $tmpdir = $_[0]->_tmpdir( $ENV{TMPDIR}, "/tmp", $ENV{'TMP'}, $ENV{'TEMP'}, 'C:/temp' );
+}
+
+=item case_tolerant
+
+Override Unix. Cygwin case-tolerance depends on managed mount settings and
+as with MsWin32 on GetVolumeInformation() $ouFsFlags == FS_CASE_SENSITIVE,
+indicating the case significance when comparing file specifications.
+Default: 1
+
+=cut
+
+sub case_tolerant {
+ return 1 unless $^O eq 'cygwin'
+ and defined &Cygwin::mount_flags;
+
+ my $drive = shift;
+ if (! $drive) {
+ my @flags = split(/,/, Cygwin::mount_flags('/cygwin'));
+ my $prefix = pop(@flags);
+ if (! $prefix || $prefix eq 'cygdrive') {
+ $drive = '/cygdrive/c';
+ } elsif ($prefix eq '/') {
+ $drive = '/c';
+ } else {
+ $drive = "$prefix/c";
+ }
+ }
+ my $mntopts = Cygwin::mount_flags($drive);
+ if ($mntopts and ($mntopts =~ /,managed/)) {
+ return 0;
+ }
+ eval { require Win32API::File; } or return 1;
+ my $osFsType = "\0"x256;
+ my $osVolName = "\0"x256;
+ my $ouFsFlags = 0;
+ Win32API::File::GetVolumeInformation($drive, $osVolName, 256, [], [], $ouFsFlags, $osFsType, 256 );
+ if ($ouFsFlags & Win32API::File::FS_CASE_SENSITIVE()) { return 0; }
+ else { return 1; }
+}
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004,2007 by the Perl 5 Porters. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Spec/Epoc.pm b/Master/tlpkg/tlperl.straw/lib/File/Spec/Epoc.pm
new file mode 100755
index 00000000000..54ff667c52f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Spec/Epoc.pm
@@ -0,0 +1,79 @@
+package File::Spec::Epoc;
+
+use strict;
+use vars qw($VERSION @ISA);
+
+$VERSION = '3.30';
+$VERSION = eval $VERSION;
+
+require File::Spec::Unix;
+@ISA = qw(File::Spec::Unix);
+
+=head1 NAME
+
+File::Spec::Epoc - methods for Epoc file specs
+
+=head1 SYNOPSIS
+
+ require File::Spec::Epoc; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+See File::Spec::Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+This package is still work in progress ;-)
+
+=cut
+
+sub case_tolerant {
+ return 1;
+}
+
+=pod
+
+=over 4
+
+=item canonpath()
+
+No physical check on the filesystem, but a logical cleanup of a
+path. On UNIX eliminated successive slashes and successive "/.".
+
+=back
+
+=cut
+
+sub canonpath {
+ my ($self,$path) = @_;
+ return unless defined $path;
+
+ $path =~ s|/+|/|g; # xx////xx -> xx/xx
+ $path =~ s|(/\.)+/|/|g; # xx/././xx -> xx/xx
+ $path =~ s|^(\./)+||s unless $path eq "./"; # ./xx -> xx
+ $path =~ s|^/(\.\./)+|/|s; # /../../xx -> xx
+ $path =~ s|/\Z(?!\n)|| unless $path eq "/"; # xx/ -> xx
+ return $path;
+}
+
+=pod
+
+=head1 AUTHOR
+
+o.flebbe@gmx.de
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+implementation of these methods, not the semantics.
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Spec/Functions.pm b/Master/tlpkg/tlperl.straw/lib/File/Spec/Functions.pm
new file mode 100755
index 00000000000..e7becc7cfae
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Spec/Functions.pm
@@ -0,0 +1,110 @@
+package File::Spec::Functions;
+
+use File::Spec;
+use strict;
+
+use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
+
+$VERSION = '3.30';
+$VERSION = eval $VERSION;
+
+require Exporter;
+
+@ISA = qw(Exporter);
+
+@EXPORT = qw(
+ canonpath
+ catdir
+ catfile
+ curdir
+ rootdir
+ updir
+ no_upwards
+ file_name_is_absolute
+ path
+);
+
+@EXPORT_OK = qw(
+ devnull
+ tmpdir
+ splitpath
+ splitdir
+ catpath
+ abs2rel
+ rel2abs
+ case_tolerant
+);
+
+%EXPORT_TAGS = ( ALL => [ @EXPORT_OK, @EXPORT ] );
+
+foreach my $meth (@EXPORT, @EXPORT_OK) {
+ my $sub = File::Spec->can($meth);
+ no strict 'refs';
+ *{$meth} = sub {&$sub('File::Spec', @_)};
+}
+
+
+1;
+__END__
+
+=head1 NAME
+
+File::Spec::Functions - portably perform operations on file names
+
+=head1 SYNOPSIS
+
+ use File::Spec::Functions;
+ $x = catfile('a','b');
+
+=head1 DESCRIPTION
+
+This module exports convenience functions for all of the class methods
+provided by File::Spec.
+
+For a reference of available functions, please consult L<File::Spec::Unix>,
+which contains the entire set, and which is inherited by the modules for
+other platforms. For further information, please see L<File::Spec::Mac>,
+L<File::Spec::OS2>, L<File::Spec::Win32>, or L<File::Spec::VMS>.
+
+=head2 Exports
+
+The following functions are exported by default.
+
+ canonpath
+ catdir
+ catfile
+ curdir
+ rootdir
+ updir
+ no_upwards
+ file_name_is_absolute
+ path
+
+
+The following functions are exported only by request.
+
+ devnull
+ tmpdir
+ splitpath
+ splitdir
+ catpath
+ abs2rel
+ rel2abs
+ case_tolerant
+
+All the functions may be imported using the C<:ALL> tag.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+File::Spec, File::Spec::Unix, File::Spec::Mac, File::Spec::OS2,
+File::Spec::Win32, File::Spec::VMS, ExtUtils::MakeMaker
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Spec/Mac.pm b/Master/tlpkg/tlperl.straw/lib/File/Spec/Mac.pm
new file mode 100755
index 00000000000..8b47470d6b3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Spec/Mac.pm
@@ -0,0 +1,781 @@
+package File::Spec::Mac;
+
+use strict;
+use vars qw(@ISA $VERSION);
+require File::Spec::Unix;
+
+$VERSION = '3.30';
+$VERSION = eval $VERSION;
+
+@ISA = qw(File::Spec::Unix);
+
+my $macfiles;
+if ($^O eq 'MacOS') {
+ $macfiles = eval { require Mac::Files };
+}
+
+sub case_tolerant { 1 }
+
+
+=head1 NAME
+
+File::Spec::Mac - File::Spec for Mac OS (Classic)
+
+=head1 SYNOPSIS
+
+ require File::Spec::Mac; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+Methods for manipulating file specifications.
+
+=head1 METHODS
+
+=over 2
+
+=item canonpath
+
+On Mac OS, there's nothing to be done. Returns what it's given.
+
+=cut
+
+sub canonpath {
+ my ($self,$path) = @_;
+ return $path;
+}
+
+=item catdir()
+
+Concatenate two or more directory names to form a path separated by colons
+(":") ending with a directory. Resulting paths are B<relative> by default,
+but can be forced to be absolute (but avoid this, see below). Automatically
+puts a trailing ":" on the end of the complete path, because that's what's
+done in MacPerl's environment and helps to distinguish a file path from a
+directory path.
+
+B<IMPORTANT NOTE:> Beginning with version 1.3 of this module, the resulting
+path is relative by default and I<not> absolute. This decision was made due
+to portability reasons. Since C<File::Spec-E<gt>catdir()> returns relative paths
+on all other operating systems, it will now also follow this convention on Mac
+OS. Note that this may break some existing scripts.
+
+The intended purpose of this routine is to concatenate I<directory names>.
+But because of the nature of Macintosh paths, some additional possibilities
+are allowed to make using this routine give reasonable results for some
+common situations. In other words, you are also allowed to concatenate
+I<paths> instead of directory names (strictly speaking, a string like ":a"
+is a path, but not a name, since it contains a punctuation character ":").
+
+So, beside calls like
+
+ catdir("a") = ":a:"
+ catdir("a","b") = ":a:b:"
+ catdir() = "" (special case)
+
+calls like the following
+
+ catdir(":a:") = ":a:"
+ catdir(":a","b") = ":a:b:"
+ catdir(":a:","b") = ":a:b:"
+ catdir(":a:",":b:") = ":a:b:"
+ catdir(":") = ":"
+
+are allowed.
+
+Here are the rules that are used in C<catdir()>; note that we try to be as
+compatible as possible to Unix:
+
+=over 2
+
+=item 1.
+
+The resulting path is relative by default, i.e. the resulting path will have a
+leading colon.
+
+=item 2.
+
+A trailing colon is added automatically to the resulting path, to denote a
+directory.
+
+=item 3.
+
+Generally, each argument has one leading ":" and one trailing ":"
+removed (if any). They are then joined together by a ":". Special
+treatment applies for arguments denoting updir paths like "::lib:",
+see (4), or arguments consisting solely of colons ("colon paths"),
+see (5).
+
+=item 4.
+
+When an updir path like ":::lib::" is passed as argument, the number
+of directories to climb up is handled correctly, not removing leading
+or trailing colons when necessary. E.g.
+
+ catdir(":::a","::b","c") = ":::a::b:c:"
+ catdir(":::a::","::b","c") = ":::a:::b:c:"
+
+=item 5.
+
+Adding a colon ":" or empty string "" to a path at I<any> position
+doesn't alter the path, i.e. these arguments are ignored. (When a ""
+is passed as the first argument, it has a special meaning, see
+(6)). This way, a colon ":" is handled like a "." (curdir) on Unix,
+while an empty string "" is generally ignored (see
+C<Unix-E<gt>canonpath()> ). Likewise, a "::" is handled like a ".."
+(updir), and a ":::" is handled like a "../.." etc. E.g.
+
+ catdir("a",":",":","b") = ":a:b:"
+ catdir("a",":","::",":b") = ":a::b:"
+
+=item 6.
+
+If the first argument is an empty string "" or is a volume name, i.e. matches
+the pattern /^[^:]+:/, the resulting path is B<absolute>.
+
+=item 7.
+
+Passing an empty string "" as the first argument to C<catdir()> is
+like passingC<File::Spec-E<gt>rootdir()> as the first argument, i.e.
+
+ catdir("","a","b") is the same as
+
+ catdir(rootdir(),"a","b").
+
+This is true on Unix, where C<catdir("","a","b")> yields "/a/b" and
+C<rootdir()> is "/". Note that C<rootdir()> on Mac OS is the startup
+volume, which is the closest in concept to Unix' "/". This should help
+to run existing scripts originally written for Unix.
+
+=item 8.
+
+For absolute paths, some cleanup is done, to ensure that the volume
+name isn't immediately followed by updirs. This is invalid, because
+this would go beyond "root". Generally, these cases are handled like
+their Unix counterparts:
+
+ Unix:
+ Unix->catdir("","") = "/"
+ Unix->catdir("",".") = "/"
+ Unix->catdir("","..") = "/" # can't go beyond root
+ Unix->catdir("",".","..","..","a") = "/a"
+ Mac:
+ Mac->catdir("","") = rootdir() # (e.g. "HD:")
+ Mac->catdir("",":") = rootdir()
+ Mac->catdir("","::") = rootdir() # can't go beyond root
+ Mac->catdir("",":","::","::","a") = rootdir() . "a:" # (e.g. "HD:a:")
+
+However, this approach is limited to the first arguments following
+"root" (again, see C<Unix-E<gt>canonpath()> ). If there are more
+arguments that move up the directory tree, an invalid path going
+beyond root can be created.
+
+=back
+
+As you've seen, you can force C<catdir()> to create an absolute path
+by passing either an empty string or a path that begins with a volume
+name as the first argument. However, you are strongly encouraged not
+to do so, since this is done only for backward compatibility. Newer
+versions of File::Spec come with a method called C<catpath()> (see
+below), that is designed to offer a portable solution for the creation
+of absolute paths. It takes volume, directory and file portions and
+returns an entire path. While C<catdir()> is still suitable for the
+concatenation of I<directory names>, you are encouraged to use
+C<catpath()> to concatenate I<volume names> and I<directory
+paths>. E.g.
+
+ $dir = File::Spec->catdir("tmp","sources");
+ $abs_path = File::Spec->catpath("MacintoshHD:", $dir,"");
+
+yields
+
+ "MacintoshHD:tmp:sources:" .
+
+=cut
+
+sub catdir {
+ my $self = shift;
+ return '' unless @_;
+ my @args = @_;
+ my $first_arg;
+ my $relative;
+
+ # take care of the first argument
+
+ if ($args[0] eq '') { # absolute path, rootdir
+ shift @args;
+ $relative = 0;
+ $first_arg = $self->rootdir;
+
+ } elsif ($args[0] =~ /^[^:]+:/) { # absolute path, volume name
+ $relative = 0;
+ $first_arg = shift @args;
+ # add a trailing ':' if need be (may be it's a path like HD:dir)
+ $first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/);
+
+ } else { # relative path
+ $relative = 1;
+ if ( $args[0] =~ /^::+\Z(?!\n)/ ) {
+ # updir colon path ('::', ':::' etc.), don't shift
+ $first_arg = ':';
+ } elsif ($args[0] eq ':') {
+ $first_arg = shift @args;
+ } else {
+ # add a trailing ':' if need be
+ $first_arg = shift @args;
+ $first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/);
+ }
+ }
+
+ # For all other arguments,
+ # (a) ignore arguments that equal ':' or '',
+ # (b) handle updir paths specially:
+ # '::' -> concatenate '::'
+ # '::' . '::' -> concatenate ':::' etc.
+ # (c) add a trailing ':' if need be
+
+ my $result = $first_arg;
+ while (@args) {
+ my $arg = shift @args;
+ unless (($arg eq '') || ($arg eq ':')) {
+ if ($arg =~ /^::+\Z(?!\n)/ ) { # updir colon path like ':::'
+ my $updir_count = length($arg) - 1;
+ while ((@args) && ($args[0] =~ /^::+\Z(?!\n)/) ) { # while updir colon path
+ $arg = shift @args;
+ $updir_count += (length($arg) - 1);
+ }
+ $arg = (':' x $updir_count);
+ } else {
+ $arg =~ s/^://s; # remove a leading ':' if any
+ $arg = "$arg:" unless ($arg =~ /:\Z(?!\n)/); # ensure trailing ':'
+ }
+ $result .= $arg;
+ }#unless
+ }
+
+ if ( ($relative) && ($result !~ /^:/) ) {
+ # add a leading colon if need be
+ $result = ":$result";
+ }
+
+ unless ($relative) {
+ # remove updirs immediately following the volume name
+ $result =~ s/([^:]+:)(:*)(.*)\Z(?!\n)/$1$3/;
+ }
+
+ return $result;
+}
+
+=item catfile
+
+Concatenate one or more directory names and a filename to form a
+complete path ending with a filename. Resulting paths are B<relative>
+by default, but can be forced to be absolute (but avoid this).
+
+B<IMPORTANT NOTE:> Beginning with version 1.3 of this module, the
+resulting path is relative by default and I<not> absolute. This
+decision was made due to portability reasons. Since
+C<File::Spec-E<gt>catfile()> returns relative paths on all other
+operating systems, it will now also follow this convention on Mac OS.
+Note that this may break some existing scripts.
+
+The last argument is always considered to be the file portion. Since
+C<catfile()> uses C<catdir()> (see above) for the concatenation of the
+directory portions (if any), the following with regard to relative and
+absolute paths is true:
+
+ catfile("") = ""
+ catfile("file") = "file"
+
+but
+
+ catfile("","") = rootdir() # (e.g. "HD:")
+ catfile("","file") = rootdir() . file # (e.g. "HD:file")
+ catfile("HD:","file") = "HD:file"
+
+This means that C<catdir()> is called only when there are two or more
+arguments, as one might expect.
+
+Note that the leading ":" is removed from the filename, so that
+
+ catfile("a","b","file") = ":a:b:file" and
+
+ catfile("a","b",":file") = ":a:b:file"
+
+give the same answer.
+
+To concatenate I<volume names>, I<directory paths> and I<filenames>,
+you are encouraged to use C<catpath()> (see below).
+
+=cut
+
+sub catfile {
+ my $self = shift;
+ return '' unless @_;
+ my $file = pop @_;
+ return $file unless @_;
+ my $dir = $self->catdir(@_);
+ $file =~ s/^://s;
+ return $dir.$file;
+}
+
+=item curdir
+
+Returns a string representing the current directory. On Mac OS, this is ":".
+
+=cut
+
+sub curdir {
+ return ":";
+}
+
+=item devnull
+
+Returns a string representing the null device. On Mac OS, this is "Dev:Null".
+
+=cut
+
+sub devnull {
+ return "Dev:Null";
+}
+
+=item rootdir
+
+Returns a string representing the root directory. Under MacPerl,
+returns the name of the startup volume, since that's the closest in
+concept, although other volumes aren't rooted there. The name has a
+trailing ":", because that's the correct specification for a volume
+name on Mac OS.
+
+If Mac::Files could not be loaded, the empty string is returned.
+
+=cut
+
+sub rootdir {
+#
+# There's no real root directory on Mac OS. The name of the startup
+# volume is returned, since that's the closest in concept.
+#
+ return '' unless $macfiles;
+ my $system = Mac::Files::FindFolder(&Mac::Files::kOnSystemDisk,
+ &Mac::Files::kSystemFolderType);
+ $system =~ s/:.*\Z(?!\n)/:/s;
+ return $system;
+}
+
+=item tmpdir
+
+Returns the contents of $ENV{TMPDIR}, if that directory exits or the
+current working directory otherwise. Under MacPerl, $ENV{TMPDIR} will
+contain a path like "MacintoshHD:Temporary Items:", which is a hidden
+directory on your startup volume.
+
+=cut
+
+my $tmpdir;
+sub tmpdir {
+ return $tmpdir if defined $tmpdir;
+ $tmpdir = $_[0]->_tmpdir( $ENV{TMPDIR} );
+}
+
+=item updir
+
+Returns a string representing the parent directory. On Mac OS, this is "::".
+
+=cut
+
+sub updir {
+ return "::";
+}
+
+=item file_name_is_absolute
+
+Takes as argument a path and returns true, if it is an absolute path.
+If the path has a leading ":", it's a relative path. Otherwise, it's an
+absolute path, unless the path doesn't contain any colons, i.e. it's a name
+like "a". In this particular case, the path is considered to be relative
+(i.e. it is considered to be a filename). Use ":" in the appropriate place
+in the path if you want to distinguish unambiguously. As a special case,
+the filename '' is always considered to be absolute. Note that with version
+1.2 of File::Spec::Mac, this does no longer consult the local filesystem.
+
+E.g.
+
+ File::Spec->file_name_is_absolute("a"); # false (relative)
+ File::Spec->file_name_is_absolute(":a:b:"); # false (relative)
+ File::Spec->file_name_is_absolute("MacintoshHD:"); # true (absolute)
+ File::Spec->file_name_is_absolute(""); # true (absolute)
+
+
+=cut
+
+sub file_name_is_absolute {
+ my ($self,$file) = @_;
+ if ($file =~ /:/) {
+ return (! ($file =~ m/^:/s) );
+ } elsif ( $file eq '' ) {
+ return 1 ;
+ } else {
+ return 0; # i.e. a file like "a"
+ }
+}
+
+=item path
+
+Returns the null list for the MacPerl application, since the concept is
+usually meaningless under Mac OS. But if you're using the MacPerl tool under
+MPW, it gives back $ENV{Commands} suitably split, as is done in
+:lib:ExtUtils:MM_Mac.pm.
+
+=cut
+
+sub path {
+#
+# The concept is meaningless under the MacPerl application.
+# Under MPW, it has a meaning.
+#
+ return unless exists $ENV{Commands};
+ return split(/,/, $ENV{Commands});
+}
+
+=item splitpath
+
+ ($volume,$directories,$file) = File::Spec->splitpath( $path );
+ ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
+
+Splits a path into volume, directory, and filename portions.
+
+On Mac OS, assumes that the last part of the path is a filename unless
+$no_file is true or a trailing separator ":" is present.
+
+The volume portion is always returned with a trailing ":". The directory portion
+is always returned with a leading (to denote a relative path) and a trailing ":"
+(to denote a directory). The file portion is always returned I<without> a leading ":".
+Empty portions are returned as empty string ''.
+
+The results can be passed to C<catpath()> to get back a path equivalent to
+(usually identical to) the original path.
+
+
+=cut
+
+sub splitpath {
+ my ($self,$path, $nofile) = @_;
+ my ($volume,$directory,$file);
+
+ if ( $nofile ) {
+ ( $volume, $directory ) = $path =~ m|^((?:[^:]+:)?)(.*)|s;
+ }
+ else {
+ $path =~
+ m|^( (?: [^:]+: )? )
+ ( (?: .*: )? )
+ ( .* )
+ |xs;
+ $volume = $1;
+ $directory = $2;
+ $file = $3;
+ }
+
+ $volume = '' unless defined($volume);
+ $directory = ":$directory" if ( $volume && $directory ); # take care of "HD::dir"
+ if ($directory) {
+ # Make sure non-empty directories begin and end in ':'
+ $directory .= ':' unless (substr($directory,-1) eq ':');
+ $directory = ":$directory" unless (substr($directory,0,1) eq ':');
+ } else {
+ $directory = '';
+ }
+ $file = '' unless defined($file);
+
+ return ($volume,$directory,$file);
+}
+
+
+=item splitdir
+
+The opposite of C<catdir()>.
+
+ @dirs = File::Spec->splitdir( $directories );
+
+$directories should be only the directory portion of the path on systems
+that have the concept of a volume or that have path syntax that differentiates
+files from directories. Consider using C<splitpath()> otherwise.
+
+Unlike just splitting the directories on the separator, empty directory names
+(C<"">) can be returned. Since C<catdir()> on Mac OS always appends a trailing
+colon to distinguish a directory path from a file path, a single trailing colon
+will be ignored, i.e. there's no empty directory name after it.
+
+Hence, on Mac OS, both
+
+ File::Spec->splitdir( ":a:b::c:" ); and
+ File::Spec->splitdir( ":a:b::c" );
+
+yield:
+
+ ( "a", "b", "::", "c")
+
+while
+
+ File::Spec->splitdir( ":a:b::c::" );
+
+yields:
+
+ ( "a", "b", "::", "c", "::")
+
+
+=cut
+
+sub splitdir {
+ my ($self, $path) = @_;
+ my @result = ();
+ my ($head, $sep, $tail, $volume, $directories);
+
+ return @result if ( (!defined($path)) || ($path eq '') );
+ return (':') if ($path eq ':');
+
+ ( $volume, $sep, $directories ) = $path =~ m|^((?:[^:]+:)?)(:*)(.*)|s;
+
+ # deprecated, but handle it correctly
+ if ($volume) {
+ push (@result, $volume);
+ $sep .= ':';
+ }
+
+ while ($sep || $directories) {
+ if (length($sep) > 1) {
+ my $updir_count = length($sep) - 1;
+ for (my $i=0; $i<$updir_count; $i++) {
+ # push '::' updir_count times;
+ # simulate Unix '..' updirs
+ push (@result, '::');
+ }
+ }
+ $sep = '';
+ if ($directories) {
+ ( $head, $sep, $tail ) = $directories =~ m|^((?:[^:]+)?)(:*)(.*)|s;
+ push (@result, $head);
+ $directories = $tail;
+ }
+ }
+ return @result;
+}
+
+
+=item catpath
+
+ $path = File::Spec->catpath($volume,$directory,$file);
+
+Takes volume, directory and file portions and returns an entire path. On Mac OS,
+$volume, $directory and $file are concatenated. A ':' is inserted if need be. You
+may pass an empty string for each portion. If all portions are empty, the empty
+string is returned. If $volume is empty, the result will be a relative path,
+beginning with a ':'. If $volume and $directory are empty, a leading ":" (if any)
+is removed form $file and the remainder is returned. If $file is empty, the
+resulting path will have a trailing ':'.
+
+
+=cut
+
+sub catpath {
+ my ($self,$volume,$directory,$file) = @_;
+
+ if ( (! $volume) && (! $directory) ) {
+ $file =~ s/^:// if $file;
+ return $file ;
+ }
+
+ # We look for a volume in $volume, then in $directory, but not both
+
+ my ($dir_volume, $dir_dirs) = $self->splitpath($directory, 1);
+
+ $volume = $dir_volume unless length $volume;
+ my $path = $volume; # may be ''
+ $path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':'
+
+ if ($directory) {
+ $directory = $dir_dirs if $volume;
+ $directory =~ s/^://; # remove leading ':' if any
+ $path .= $directory;
+ $path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':'
+ }
+
+ if ($file) {
+ $file =~ s/^://; # remove leading ':' if any
+ $path .= $file;
+ }
+
+ return $path;
+}
+
+=item abs2rel
+
+Takes a destination path and an optional base path and returns a relative path
+from the base path to the destination path:
+
+ $rel_path = File::Spec->abs2rel( $path ) ;
+ $rel_path = File::Spec->abs2rel( $path, $base ) ;
+
+Note that both paths are assumed to have a notation that distinguishes a
+directory path (with trailing ':') from a file path (without trailing ':').
+
+If $base is not present or '', then the current working directory is used.
+If $base is relative, then it is converted to absolute form using C<rel2abs()>.
+This means that it is taken to be relative to the current working directory.
+
+If $path and $base appear to be on two different volumes, we will not
+attempt to resolve the two paths, and we will instead simply return
+$path. Note that previous versions of this module ignored the volume
+of $base, which resulted in garbage results part of the time.
+
+If $base doesn't have a trailing colon, the last element of $base is
+assumed to be a filename. This filename is ignored. Otherwise all path
+components are assumed to be directories.
+
+If $path is relative, it is converted to absolute form using C<rel2abs()>.
+This means that it is taken to be relative to the current working directory.
+
+Based on code written by Shigio Yamaguchi.
+
+
+=cut
+
+# maybe this should be done in canonpath() ?
+sub _resolve_updirs {
+ my $path = shift @_;
+ my $proceed;
+
+ # resolve any updirs, e.g. "HD:tmp::file" -> "HD:file"
+ do {
+ $proceed = ($path =~ s/^(.*):[^:]+::(.*?)\z/$1:$2/);
+ } while ($proceed);
+
+ return $path;
+}
+
+
+sub abs2rel {
+ my($self,$path,$base) = @_;
+
+ # Clean up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ $path = $self->rel2abs( $path ) ;
+ }
+
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = $self->_cwd();
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ $base = _resolve_updirs( $base ); # resolve updirs in $base
+ }
+ else {
+ $base = _resolve_updirs( $base );
+ }
+
+ # Split up paths - ignore $base's file
+ my ( $path_vol, $path_dirs, $path_file ) = $self->splitpath( $path );
+ my ( $base_vol, $base_dirs ) = $self->splitpath( $base );
+
+ return $path unless lc( $path_vol ) eq lc( $base_vol );
+
+ # Now, remove all leading components that are the same
+ my @pathchunks = $self->splitdir( $path_dirs );
+ my @basechunks = $self->splitdir( $base_dirs );
+
+ while ( @pathchunks &&
+ @basechunks &&
+ lc( $pathchunks[0] ) eq lc( $basechunks[0] ) ) {
+ shift @pathchunks ;
+ shift @basechunks ;
+ }
+
+ # @pathchunks now has the directories to descend in to.
+ # ensure relative path, even if @pathchunks is empty
+ $path_dirs = $self->catdir( ':', @pathchunks );
+
+ # @basechunks now contains the number of directories to climb out of.
+ $base_dirs = (':' x @basechunks) . ':' ;
+
+ return $self->catpath( '', $self->catdir( $base_dirs, $path_dirs ), $path_file ) ;
+}
+
+=item rel2abs
+
+Converts a relative path to an absolute path:
+
+ $abs_path = File::Spec->rel2abs( $path ) ;
+ $abs_path = File::Spec->rel2abs( $path, $base ) ;
+
+Note that both paths are assumed to have a notation that distinguishes a
+directory path (with trailing ':') from a file path (without trailing ':').
+
+If $base is not present or '', then $base is set to the current working
+directory. If $base is relative, then it is converted to absolute form
+using C<rel2abs()>. This means that it is taken to be relative to the
+current working directory.
+
+If $base doesn't have a trailing colon, the last element of $base is
+assumed to be a filename. This filename is ignored. Otherwise all path
+components are assumed to be directories.
+
+If $path is already absolute, it is returned and $base is ignored.
+
+Based on code written by Shigio Yamaguchi.
+
+=cut
+
+sub rel2abs {
+ my ($self,$path,$base) = @_;
+
+ if ( ! $self->file_name_is_absolute($path) ) {
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = $self->_cwd();
+ }
+ elsif ( ! $self->file_name_is_absolute($base) ) {
+ $base = $self->rel2abs($base) ;
+ }
+
+ # Split up paths
+
+ # igonore $path's volume
+ my ( $path_dirs, $path_file ) = ($self->splitpath($path))[1,2] ;
+
+ # ignore $base's file part
+ my ( $base_vol, $base_dirs ) = $self->splitpath($base) ;
+
+ # Glom them together
+ $path_dirs = ':' if ($path_dirs eq '');
+ $base_dirs =~ s/:$//; # remove trailing ':', if any
+ $base_dirs = $base_dirs . $path_dirs;
+
+ $path = $self->catpath( $base_vol, $base_dirs, $path_file );
+ }
+ return $path;
+}
+
+
+=back
+
+=head1 AUTHORS
+
+See the authors list in I<File::Spec>. Mac OS support by Paul Schinder
+<schinder@pobox.com> and Thomas Wegner <wegner_thomas@yahoo.com>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+implementation of these methods, not the semantics.
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Spec/OS2.pm b/Master/tlpkg/tlperl.straw/lib/File/Spec/OS2.pm
new file mode 100755
index 00000000000..a8fa63e3c16
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Spec/OS2.pm
@@ -0,0 +1,274 @@
+package File::Spec::OS2;
+
+use strict;
+use vars qw(@ISA $VERSION);
+require File::Spec::Unix;
+
+$VERSION = '3.30';
+$VERSION = eval $VERSION;
+
+@ISA = qw(File::Spec::Unix);
+
+sub devnull {
+ return "/dev/nul";
+}
+
+sub case_tolerant {
+ return 1;
+}
+
+sub file_name_is_absolute {
+ my ($self,$file) = @_;
+ return scalar($file =~ m{^([a-z]:)?[\\/]}is);
+}
+
+sub path {
+ my $path = $ENV{PATH};
+ $path =~ s:\\:/:g;
+ my @path = split(';',$path);
+ foreach (@path) { $_ = '.' if $_ eq '' }
+ return @path;
+}
+
+sub _cwd {
+ # In OS/2 the "require Cwd" is unnecessary bloat.
+ return Cwd::sys_cwd();
+}
+
+my $tmpdir;
+sub tmpdir {
+ return $tmpdir if defined $tmpdir;
+ my @d = @ENV{qw(TMPDIR TEMP TMP)}; # function call could autovivivy
+ $tmpdir = $_[0]->_tmpdir( @d, '/tmp', '/' );
+}
+
+sub catdir {
+ my $self = shift;
+ my @args = @_;
+ foreach (@args) {
+ tr[\\][/];
+ # append a backslash to each argument unless it has one there
+ $_ .= "/" unless m{/$};
+ }
+ return $self->canonpath(join('', @args));
+}
+
+sub canonpath {
+ my ($self,$path) = @_;
+ return unless defined $path;
+
+ $path =~ s/^([a-z]:)/\l$1/s;
+ $path =~ s|\\|/|g;
+ $path =~ s|([^/])/+|$1/|g; # xx////xx -> xx/xx
+ $path =~ s|(/\.)+/|/|g; # xx/././xx -> xx/xx
+ $path =~ s|^(\./)+(?=[^/])||s; # ./xx -> xx
+ $path =~ s|/\Z(?!\n)||
+ unless $path =~ m#^([a-z]:)?/\Z(?!\n)#si;# xx/ -> xx
+ $path =~ s{^/\.\.$}{/}; # /.. -> /
+ 1 while $path =~ s{^/\.\.}{}; # /../xx -> /xx
+ return $path;
+}
+
+
+sub splitpath {
+ my ($self,$path, $nofile) = @_;
+ my ($volume,$directory,$file) = ('','','');
+ if ( $nofile ) {
+ $path =~
+ m{^( (?:[a-zA-Z]:|(?:\\\\|//)[^\\/]+[\\/][^\\/]+)? )
+ (.*)
+ }xs;
+ $volume = $1;
+ $directory = $2;
+ }
+ else {
+ $path =~
+ m{^ ( (?: [a-zA-Z]: |
+ (?:\\\\|//)[^\\/]+[\\/][^\\/]+
+ )?
+ )
+ ( (?:.*[\\\\/](?:\.\.?\Z(?!\n))?)? )
+ (.*)
+ }xs;
+ $volume = $1;
+ $directory = $2;
+ $file = $3;
+ }
+
+ return ($volume,$directory,$file);
+}
+
+
+sub splitdir {
+ my ($self,$directories) = @_ ;
+ split m|[\\/]|, $directories, -1;
+}
+
+
+sub catpath {
+ my ($self,$volume,$directory,$file) = @_;
+
+ # If it's UNC, make sure the glue separator is there, reusing
+ # whatever separator is first in the $volume
+ $volume .= $1
+ if ( $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s &&
+ $directory =~ m@^[^\\/]@s
+ ) ;
+
+ $volume .= $directory ;
+
+ # If the volume is not just A:, make sure the glue separator is
+ # there, reusing whatever separator is first in the $volume if possible.
+ if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s &&
+ $volume =~ m@[^\\/]\Z(?!\n)@ &&
+ $file =~ m@[^\\/]@
+ ) {
+ $volume =~ m@([\\/])@ ;
+ my $sep = $1 ? $1 : '/' ;
+ $volume .= $sep ;
+ }
+
+ $volume .= $file ;
+
+ return $volume ;
+}
+
+
+sub abs2rel {
+ my($self,$path,$base) = @_;
+
+ # Clean up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ $path = $self->rel2abs( $path ) ;
+ } else {
+ $path = $self->canonpath( $path ) ;
+ }
+
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = $self->_cwd();
+ } elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ } else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ # Split up paths
+ my ( $path_volume, $path_directories, $path_file ) = $self->splitpath( $path, 1 ) ;
+ my ( $base_volume, $base_directories ) = $self->splitpath( $base, 1 ) ;
+ return $path unless $path_volume eq $base_volume;
+
+ # Now, remove all leading components that are the same
+ my @pathchunks = $self->splitdir( $path_directories );
+ my @basechunks = $self->splitdir( $base_directories );
+
+ while ( @pathchunks &&
+ @basechunks &&
+ lc( $pathchunks[0] ) eq lc( $basechunks[0] )
+ ) {
+ shift @pathchunks ;
+ shift @basechunks ;
+ }
+
+ # No need to catdir, we know these are well formed.
+ $path_directories = CORE::join( '/', @pathchunks );
+ $base_directories = CORE::join( '/', @basechunks );
+
+ # $base_directories now contains the directories the resulting relative
+ # path must ascend out of before it can descend to $path_directory. So,
+ # replace all names with $parentDir
+
+ #FA Need to replace between backslashes...
+ $base_directories =~ s|[^\\/]+|..|g ;
+
+ # Glue the two together, using a separator if necessary, and preventing an
+ # empty result.
+
+ #FA Must check that new directories are not empty.
+ if ( $path_directories ne '' && $base_directories ne '' ) {
+ $path_directories = "$base_directories/$path_directories" ;
+ } else {
+ $path_directories = "$base_directories$path_directories" ;
+ }
+
+ return $self->canonpath(
+ $self->catpath( "", $path_directories, $path_file )
+ ) ;
+}
+
+
+sub rel2abs {
+ my ($self,$path,$base ) = @_;
+
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = $self->_cwd();
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ my ( $path_directories, $path_file ) =
+ ($self->splitpath( $path, 1 ))[1,2] ;
+
+ my ( $base_volume, $base_directories ) =
+ $self->splitpath( $base, 1 ) ;
+
+ $path = $self->catpath(
+ $base_volume,
+ $self->catdir( $base_directories, $path_directories ),
+ $path_file
+ ) ;
+ }
+
+ return $self->canonpath( $path ) ;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+File::Spec::OS2 - methods for OS/2 file specs
+
+=head1 SYNOPSIS
+
+ require File::Spec::OS2; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+implementation of these methods, not the semantics.
+
+Amongst the changes made for OS/2 are...
+
+=over 4
+
+=item tmpdir
+
+Modifies the list of places temp directory information is looked for.
+
+ $ENV{TMPDIR}
+ $ENV{TEMP}
+ $ENV{TMP}
+ /tmp
+ /
+
+=item splitpath
+
+Volumes can be drive letters or UNC sharenames (\\server\share).
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Spec/Unix.pm b/Master/tlpkg/tlperl.straw/lib/File/Spec/Unix.pm
new file mode 100755
index 00000000000..8fd2320a392
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Spec/Unix.pm
@@ -0,0 +1,521 @@
+package File::Spec::Unix;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '3.30';
+$VERSION = eval $VERSION;
+
+=head1 NAME
+
+File::Spec::Unix - File::Spec for Unix, base for other File::Spec modules
+
+=head1 SYNOPSIS
+
+ require File::Spec::Unix; # Done automatically by File::Spec
+
+=head1 DESCRIPTION
+
+Methods for manipulating file specifications. Other File::Spec
+modules, such as File::Spec::Mac, inherit from File::Spec::Unix and
+override specific methods.
+
+=head1 METHODS
+
+=over 2
+
+=item canonpath()
+
+No physical check on the filesystem, but a logical cleanup of a
+path. On UNIX eliminates successive slashes and successive "/.".
+
+ $cpath = File::Spec->canonpath( $path ) ;
+
+Note that this does *not* collapse F<x/../y> sections into F<y>. This
+is by design. If F</foo> on your system is a symlink to F</bar/baz>,
+then F</foo/../quux> is actually F</bar/quux>, not F</quux> as a naive
+F<../>-removal would give you. If you want to do this kind of
+processing, you probably want C<Cwd>'s C<realpath()> function to
+actually traverse the filesystem cleaning up paths like this.
+
+=cut
+
+sub canonpath {
+ my ($self,$path) = @_;
+ return unless defined $path;
+
+ # Handle POSIX-style node names beginning with double slash (qnx, nto)
+ # (POSIX says: "a pathname that begins with two successive slashes
+ # may be interpreted in an implementation-defined manner, although
+ # more than two leading slashes shall be treated as a single slash.")
+ my $node = '';
+ my $double_slashes_special = $^O eq 'qnx' || $^O eq 'nto';
+
+
+ if ( $double_slashes_special
+ && ( $path =~ s{^(//[^/]+)/?\z}{}s || $path =~ s{^(//[^/]+)/}{/}s ) ) {
+ $node = $1;
+ }
+ # This used to be
+ # $path =~ s|/+|/|g unless ($^O eq 'cygwin');
+ # but that made tests 29, 30, 35, 46, and 213 (as of #13272) to fail
+ # (Mainly because trailing "" directories didn't get stripped).
+ # Why would cygwin avoid collapsing multiple slashes into one? --jhi
+ $path =~ s|/{2,}|/|g; # xx////xx -> xx/xx
+ $path =~ s{(?:/\.)+(?:/|\z)}{/}g; # xx/././xx -> xx/xx
+ $path =~ s|^(?:\./)+||s unless $path eq "./"; # ./xx -> xx
+ $path =~ s|^/(?:\.\./)+|/|; # /../../xx -> xx
+ $path =~ s|^/\.\.$|/|; # /.. -> /
+ $path =~ s|/\z|| unless $path eq "/"; # xx/ -> xx
+ return "$node$path";
+}
+
+=item catdir()
+
+Concatenate two or more directory names to form a complete path ending
+with a directory. But remove the trailing slash from the resulting
+string, because it doesn't look good, isn't necessary and confuses
+OS2. Of course, if this is the root directory, don't cut off the
+trailing slash :-)
+
+=cut
+
+sub catdir {
+ my $self = shift;
+
+ $self->canonpath(join('/', @_, '')); # '' because need a trailing '/'
+}
+
+=item catfile
+
+Concatenate one or more directory names and a filename to form a
+complete path ending with a filename
+
+=cut
+
+sub catfile {
+ my $self = shift;
+ my $file = $self->canonpath(pop @_);
+ return $file unless @_;
+ my $dir = $self->catdir(@_);
+ $dir .= "/" unless substr($dir,-1) eq "/";
+ return $dir.$file;
+}
+
+=item curdir
+
+Returns a string representation of the current directory. "." on UNIX.
+
+=cut
+
+sub curdir { '.' }
+
+=item devnull
+
+Returns a string representation of the null device. "/dev/null" on UNIX.
+
+=cut
+
+sub devnull { '/dev/null' }
+
+=item rootdir
+
+Returns a string representation of the root directory. "/" on UNIX.
+
+=cut
+
+sub rootdir { '/' }
+
+=item tmpdir
+
+Returns a string representation of the first writable directory from
+the following list or the current directory if none from the list are
+writable:
+
+ $ENV{TMPDIR}
+ /tmp
+
+Since perl 5.8.0, if running under taint mode, and if $ENV{TMPDIR}
+is tainted, it is not used.
+
+=cut
+
+my $tmpdir;
+sub _tmpdir {
+ return $tmpdir if defined $tmpdir;
+ my $self = shift;
+ my @dirlist = @_;
+ {
+ no strict 'refs';
+ if (${"\cTAINT"}) { # Check for taint mode on perl >= 5.8.0
+ require Scalar::Util;
+ @dirlist = grep { ! Scalar::Util::tainted($_) } @dirlist;
+ }
+ }
+ foreach (@dirlist) {
+ next unless defined && -d && -w _;
+ $tmpdir = $_;
+ last;
+ }
+ $tmpdir = $self->curdir unless defined $tmpdir;
+ $tmpdir = defined $tmpdir && $self->canonpath($tmpdir);
+ return $tmpdir;
+}
+
+sub tmpdir {
+ return $tmpdir if defined $tmpdir;
+ $tmpdir = $_[0]->_tmpdir( $ENV{TMPDIR}, "/tmp" );
+}
+
+=item updir
+
+Returns a string representation of the parent directory. ".." on UNIX.
+
+=cut
+
+sub updir { '..' }
+
+=item no_upwards
+
+Given a list of file names, strip out those that refer to a parent
+directory. (Does not strip symlinks, only '.', '..', and equivalents.)
+
+=cut
+
+sub no_upwards {
+ my $self = shift;
+ return grep(!/^\.{1,2}\z/s, @_);
+}
+
+=item case_tolerant
+
+Returns a true or false value indicating, respectively, that alphabetic
+is not or is significant when comparing file specifications.
+
+=cut
+
+sub case_tolerant { 0 }
+
+=item file_name_is_absolute
+
+Takes as argument a path and returns true if it is an absolute path.
+
+This does not consult the local filesystem on Unix, Win32, OS/2 or Mac
+OS (Classic). It does consult the working environment for VMS (see
+L<File::Spec::VMS/file_name_is_absolute>).
+
+=cut
+
+sub file_name_is_absolute {
+ my ($self,$file) = @_;
+ return scalar($file =~ m:^/:s);
+}
+
+=item path
+
+Takes no argument, returns the environment variable PATH as an array.
+
+=cut
+
+sub path {
+ return () unless exists $ENV{PATH};
+ my @path = split(':', $ENV{PATH});
+ foreach (@path) { $_ = '.' if $_ eq '' }
+ return @path;
+}
+
+=item join
+
+join is the same as catfile.
+
+=cut
+
+sub join {
+ my $self = shift;
+ return $self->catfile(@_);
+}
+
+=item splitpath
+
+ ($volume,$directories,$file) = File::Spec->splitpath( $path );
+ ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
+
+Splits a path into volume, directory, and filename portions. On systems
+with no concept of volume, returns '' for volume.
+
+For systems with no syntax differentiating filenames from directories,
+assumes that the last file is a path unless $no_file is true or a
+trailing separator or /. or /.. is present. On Unix this means that $no_file
+true makes this return ( '', $path, '' ).
+
+The directory portion may or may not be returned with a trailing '/'.
+
+The results can be passed to L</catpath()> to get back a path equivalent to
+(usually identical to) the original path.
+
+=cut
+
+sub splitpath {
+ my ($self,$path, $nofile) = @_;
+
+ my ($volume,$directory,$file) = ('','','');
+
+ if ( $nofile ) {
+ $directory = $path;
+ }
+ else {
+ $path =~ m|^ ( (?: .* / (?: \.\.?\z )? )? ) ([^/]*) |xs;
+ $directory = $1;
+ $file = $2;
+ }
+
+ return ($volume,$directory,$file);
+}
+
+
+=item splitdir
+
+The opposite of L</catdir()>.
+
+ @dirs = File::Spec->splitdir( $directories );
+
+$directories must be only the directory portion of the path on systems
+that have the concept of a volume or that have path syntax that differentiates
+files from directories.
+
+Unlike just splitting the directories on the separator, empty
+directory names (C<''>) can be returned, because these are significant
+on some OSs.
+
+On Unix,
+
+ File::Spec->splitdir( "/a/b//c/" );
+
+Yields:
+
+ ( '', 'a', 'b', '', 'c', '' )
+
+=cut
+
+sub splitdir {
+ return split m|/|, $_[1], -1; # Preserve trailing fields
+}
+
+
+=item catpath()
+
+Takes volume, directory and file portions and returns an entire path. Under
+Unix, $volume is ignored, and directory and file are concatenated. A '/' is
+inserted if needed (though if the directory portion doesn't start with
+'/' it is not added). On other OSs, $volume is significant.
+
+=cut
+
+sub catpath {
+ my ($self,$volume,$directory,$file) = @_;
+
+ if ( $directory ne '' &&
+ $file ne '' &&
+ substr( $directory, -1 ) ne '/' &&
+ substr( $file, 0, 1 ) ne '/'
+ ) {
+ $directory .= "/$file" ;
+ }
+ else {
+ $directory .= $file ;
+ }
+
+ return $directory ;
+}
+
+=item abs2rel
+
+Takes a destination path and an optional base path returns a relative path
+from the base path to the destination path:
+
+ $rel_path = File::Spec->abs2rel( $path ) ;
+ $rel_path = File::Spec->abs2rel( $path, $base ) ;
+
+If $base is not present or '', then L<cwd()|Cwd> is used. If $base is
+relative, then it is converted to absolute form using
+L</rel2abs()>. This means that it is taken to be relative to
+L<cwd()|Cwd>.
+
+On systems that have a grammar that indicates filenames, this ignores the
+$base filename. Otherwise all path components are assumed to be
+directories.
+
+If $path is relative, it is converted to absolute form using L</rel2abs()>.
+This means that it is taken to be relative to L<cwd()|Cwd>.
+
+No checks against the filesystem are made. On VMS, there is
+interaction with the working environment, as logicals and
+macros are expanded.
+
+Based on code written by Shigio Yamaguchi.
+
+=cut
+
+sub abs2rel {
+ my($self,$path,$base) = @_;
+ $base = $self->_cwd() unless defined $base and length $base;
+
+ ($path, $base) = map $self->canonpath($_), $path, $base;
+
+ if (grep $self->file_name_is_absolute($_), $path, $base) {
+ ($path, $base) = map $self->rel2abs($_), $path, $base;
+ }
+ else {
+ # save a couple of cwd()s if both paths are relative
+ ($path, $base) = map $self->catdir('/', $_), $path, $base;
+ }
+
+ my ($path_volume) = $self->splitpath($path, 1);
+ my ($base_volume) = $self->splitpath($base, 1);
+
+ # Can't relativize across volumes
+ return $path unless $path_volume eq $base_volume;
+
+ my $path_directories = ($self->splitpath($path, 1))[1];
+ my $base_directories = ($self->splitpath($base, 1))[1];
+
+ # For UNC paths, the user might give a volume like //foo/bar that
+ # strictly speaking has no directory portion. Treat it as if it
+ # had the root directory for that volume.
+ if (!length($base_directories) and $self->file_name_is_absolute($base)) {
+ $base_directories = $self->rootdir;
+ }
+
+ # Now, remove all leading components that are the same
+ my @pathchunks = $self->splitdir( $path_directories );
+ my @basechunks = $self->splitdir( $base_directories );
+
+ if ($base_directories eq $self->rootdir) {
+ shift @pathchunks;
+ return $self->canonpath( $self->catpath('', $self->catdir( @pathchunks ), '') );
+ }
+
+ while (@pathchunks && @basechunks && $self->_same($pathchunks[0], $basechunks[0])) {
+ shift @pathchunks ;
+ shift @basechunks ;
+ }
+ return $self->curdir unless @pathchunks || @basechunks;
+
+ # $base now contains the directories the resulting relative path
+ # must ascend out of before it can descend to $path_directory.
+ my $result_dirs = $self->catdir( ($self->updir) x @basechunks, @pathchunks );
+ return $self->canonpath( $self->catpath('', $result_dirs, '') );
+}
+
+sub _same {
+ $_[1] eq $_[2];
+}
+
+=item rel2abs()
+
+Converts a relative path to an absolute path.
+
+ $abs_path = File::Spec->rel2abs( $path ) ;
+ $abs_path = File::Spec->rel2abs( $path, $base ) ;
+
+If $base is not present or '', then L<cwd()|Cwd> is used. If $base is
+relative, then it is converted to absolute form using
+L</rel2abs()>. This means that it is taken to be relative to
+L<cwd()|Cwd>.
+
+On systems that have a grammar that indicates filenames, this ignores
+the $base filename. Otherwise all path components are assumed to be
+directories.
+
+If $path is absolute, it is cleaned up and returned using L</canonpath()>.
+
+No checks against the filesystem are made. On VMS, there is
+interaction with the working environment, as logicals and
+macros are expanded.
+
+Based on code written by Shigio Yamaguchi.
+
+=cut
+
+sub rel2abs {
+ my ($self,$path,$base ) = @_;
+
+ # Clean up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = $self->_cwd();
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ # Glom them together
+ $path = $self->catdir( $base, $path ) ;
+ }
+
+ return $self->canonpath( $path ) ;
+}
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<File::Spec>
+
+=cut
+
+# Internal routine to File::Spec, no point in making this public since
+# it is the standard Cwd interface. Most of the platform-specific
+# File::Spec subclasses use this.
+sub _cwd {
+ require Cwd;
+ Cwd::getcwd();
+}
+
+
+# Internal method to reduce xx\..\yy -> yy
+sub _collapse {
+ my($fs, $path) = @_;
+
+ my $updir = $fs->updir;
+ my $curdir = $fs->curdir;
+
+ my($vol, $dirs, $file) = $fs->splitpath($path);
+ my @dirs = $fs->splitdir($dirs);
+ pop @dirs if @dirs && $dirs[-1] eq '';
+
+ my @collapsed;
+ foreach my $dir (@dirs) {
+ if( $dir eq $updir and # if we have an updir
+ @collapsed and # and something to collapse
+ length $collapsed[-1] and # and its not the rootdir
+ $collapsed[-1] ne $updir and # nor another updir
+ $collapsed[-1] ne $curdir # nor the curdir
+ )
+ { # then
+ pop @collapsed; # collapse
+ }
+ else { # else
+ push @collapsed, $dir; # just hang onto it
+ }
+ }
+
+ return $fs->catpath($vol,
+ $fs->catdir(@collapsed),
+ $file
+ );
+}
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Spec/VMS.pm b/Master/tlpkg/tlperl.straw/lib/File/Spec/VMS.pm
new file mode 100755
index 00000000000..34b592abbfe
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Spec/VMS.pm
@@ -0,0 +1,1165 @@
+package File::Spec::VMS;
+
+use strict;
+use vars qw(@ISA $VERSION);
+require File::Spec::Unix;
+
+$VERSION = '3.30';
+$VERSION = eval $VERSION;
+
+@ISA = qw(File::Spec::Unix);
+
+use File::Basename;
+use VMS::Filespec;
+
+=head1 NAME
+
+File::Spec::VMS - methods for VMS file specs
+
+=head1 SYNOPSIS
+
+ require File::Spec::VMS; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+See File::Spec::Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+The mode of operation of these routines depend on the VMS features that
+are controlled by the DECC features C<DECC$FILENAME_REPORT_UNIX> and
+C<DECC$EFS_CHARSET>.
+
+Perl needs to be at least at 5.10 for these feature settings to work.
+Use of them on older perl versions on VMS will result in unpredictable
+operations.
+
+The default and traditional mode of these routines have been to expect VMS
+syntax on input and to return VMS syntax on output, even when Unix syntax was
+given on input.
+
+The default and traditional mode is also incompatible with the VMS
+C<EFS>, Extended File system character set, and with running Perl scripts
+under <GNV>, Gnu is not VMS, an optional Unix like runtime environment on VMS.
+
+If the C<DECC$EFS_CHARSET> feature is enabled, These routines will now accept
+either VMS or UNIX syntax. If the input parameters are clearly VMS syntax,
+the return value will be in VMS syntax. If the input parameters are clearly
+in Unix syntax, the output will be in Unix syntax.
+
+This corresponds to the way that the VMS C library routines have always
+handled filenames, and what a programmer who has not specifically read this
+pod before would also expect.
+
+If the C<DECC$FILENAME_REPORT_UNIX> feature is enabled, then if the output
+syntax can not be determined from the input syntax, the output syntax will be
+UNIX. If the feature is not enabled, VMS output will be the default.
+
+=over 4
+
+=cut
+
+# Need to look up the feature settings. The preferred way is to use the
+# VMS::Feature module, but that may not be available to dual life modules.
+
+my $use_feature;
+BEGIN {
+ if (eval { local $SIG{__DIE__}; require VMS::Feature; }) {
+ $use_feature = 1;
+ }
+}
+
+# Need to look up the UNIX report mode. This may become a dynamic mode
+# in the future.
+sub _unix_rpt {
+ my $unix_rpt;
+ if ($use_feature) {
+ $unix_rpt = VMS::Feature::current("filename_unix_report");
+ } else {
+ my $env_unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
+ $unix_rpt = $env_unix_rpt =~ /^[ET1]/i;
+ }
+ return $unix_rpt;
+}
+
+# Need to look up the EFS character set mode. This may become a dynamic
+# mode in the future.
+sub _efs {
+ my $efs;
+ if ($use_feature) {
+ $efs = VMS::Feature::current("efs_charset");
+ } else {
+ my $env_efs = $ENV{'DECC$EFS_CHARSET'} || '';
+ $efs = $env_efs =~ /^[ET1]/i;
+ }
+ return $efs;
+}
+
+=item canonpath (override)
+
+Removes redundant portions of file specifications according to the syntax
+detected.
+
+=cut
+
+
+sub canonpath {
+ my($self,$path) = @_;
+
+ return undef unless defined $path;
+
+ my $efs = $self->_efs;
+
+ if ($path =~ m|/|) { # Fake Unix
+ my $pathify = $path =~ m|/\Z(?!\n)|;
+ $path = $self->SUPER::canonpath($path);
+
+ # Do not convert to VMS when EFS character sets are in use
+ return $path if $efs;
+
+ if ($pathify) { return vmspath($path); }
+ else { return vmsify($path); }
+ }
+ else {
+
+#FIXME - efs parsing has different rules. Characters in a VMS filespec
+# are only delimiters if not preceded by '^';
+
+ $path =~ tr/<>/[]/; # < and > ==> [ and ]
+ $path =~ s/\]\[\./\.\]\[/g; # ][. ==> .][
+ $path =~ s/\[000000\.\]\[/\[/g; # [000000.][ ==> [
+ $path =~ s/\[000000\./\[/g; # [000000. ==> [
+ $path =~ s/\.\]\[000000\]/\]/g; # .][000000] ==> ]
+ $path =~ s/\.\]\[/\./g; # foo.][bar ==> foo.bar
+ 1 while ($path =~ s/([\[\.])(-+)\.(-+)([\.\]])/$1$2$3$4/);
+ # That loop does the following
+ # with any amount of dashes:
+ # .-.-. ==> .--.
+ # [-.-. ==> [--.
+ # .-.-] ==> .--]
+ # [-.-] ==> [--]
+ 1 while ($path =~ s/([\[\.])[^\]\.]+\.-(-+)([\]\.])/$1$2$3/);
+ # That loop does the following
+ # with any amount (minimum 2)
+ # of dashes:
+ # .foo.--. ==> .-.
+ # .foo.--] ==> .-]
+ # [foo.--. ==> [-.
+ # [foo.--] ==> [-]
+ #
+ # And then, the remaining cases
+ $path =~ s/\[\.-/[-/; # [.- ==> [-
+ $path =~ s/\.[^\]\.]+\.-\./\./g; # .foo.-. ==> .
+ $path =~ s/\[[^\]\.]+\.-\./\[/g; # [foo.-. ==> [
+ $path =~ s/\.[^\]\.]+\.-\]/\]/g; # .foo.-] ==> ]
+ $path =~ s/\[[^\]\.]+\.-\]/\[000000\]/g;# [foo.-] ==> [000000]
+ $path =~ s/\[\]// unless $path eq '[]'; # [] ==>
+ return $path;
+ }
+}
+
+=item catdir (override)
+
+Concatenates a list of file specifications, and returns the result as a
+directory specification. No check is made for "impossible"
+cases (e.g. elements other than the first being absolute filespecs).
+
+=cut
+
+sub catdir {
+ my $self = shift;
+ my $dir = pop;
+
+ my $efs = $self->_efs;
+ my $unix_rpt = $self->_unix_rpt;
+
+
+ my @dirs = grep {defined() && length()} @_;
+ if ($efs) {
+ # Legacy mode removes blank entries.
+ # But that breaks existing generic perl code that
+ # uses a blank path at the beginning of the array
+ # to indicate an absolute path.
+ # So put it back if found.
+ if (@_) {
+ if ($_[0] eq '') {
+ unshift @dirs, '';
+ }
+ }
+ }
+
+ my $rslt;
+ if (@dirs) {
+ my $path = (@dirs == 1 ? $dirs[0] : $self->catdir(@dirs));
+ my ($spath,$sdir) = ($path,$dir);
+
+ if ($efs) {
+ # Extended character set in use, go into DWIM mode.
+
+ # Now we need to identify what the directory is in
+ # of the specification in order to merge them.
+ my $path_unix = 0;
+ $path_unix = 1 if ($path =~ m#/#);
+ $path_unix = 1 if ($path =~ /^\.\.?$/);
+ my $path_vms = 0;
+ $path_vms = 1 if ($path =~ m#[\[<\]]#);
+ $path_vms = 1 if ($path =~ /^--?$/);
+ my $dir_unix = 0;
+ $dir_unix = 1 if ($dir =~ m#/#);
+ $dir_unix = 1 if ($dir =~ /^\.\.?$/);
+ my $dir_vms = 0;
+ $dir_vms = 1 if ($dir =~ m#[\[<\]]#);
+ $dir_vms = 1 if ($dir =~ /^--?$/);
+
+ my $unix_mode = 0;
+ if (($path_unix != $dir_unix) && ($path_vms != $dir_vms)) {
+ # Ambiguous, so if in $unix_rpt mode then assume UNIX.
+ $unix_mode = 1 if $unix_rpt;
+ } else {
+ $unix_mode = 1 if (!$path_vms && !$dir_vms && $unix_rpt);
+ $unix_mode = 1 if ($path_unix || $dir_unix);
+ }
+
+ if ($unix_mode) {
+
+ # Fix up mixed syntax imput as good as possible - GIGO
+ $path = unixify($path) if $path_vms;
+ $dir = unixify($dir) if $dir_vms;
+
+ $rslt = $path;
+ # Append a path delimiter
+ $rslt .= '/' unless ($rslt =~ m#/$#);
+
+ $rslt .= $dir;
+ return $self->SUPER::canonpath($rslt);
+ } else {
+
+ #with <> posible instead of [.
+ # Normalize the brackets
+ # Fixme - need to not switch when preceded by ^.
+ $path =~ s/</\[/g;
+ $path =~ s/>/\]/g;
+ $dir =~ s/</\[/g;
+ $dir =~ s/>/\]/g;
+
+ # Fix up mixed syntax imput as good as possible - GIGO
+ $path = vmsify($path) if $path_unix;
+ $dir = vmsify($dir) if $dir_unix;
+
+ #Possible path values: foo: [.foo] [foo] foo, and $(foo)
+ #or starting with '-', or foo.dir
+ #If path is foo, it needs to be converted to [.foo]
+
+ # Fix up a bare path name.
+ unless ($path_vms) {
+ $path =~ s/\.dir\Z(?!\n)//i;
+ if (($path ne '') && ($path !~ /^-/)) {
+ # Non blank and not prefixed with '-', add a dot
+ $path = '[.' . $path;
+ } else {
+ # Just start a directory.
+ $path = '[' . $path;
+ }
+ } else {
+ $path =~ s/\]$//;
+ }
+
+ #Possible dir values: [.dir] dir and $(foo)
+
+ # No punctuation may have a trailing .dir
+ unless ($dir_vms) {
+ $dir =~ s/\.dir\Z(?!\n)//i;
+ } else {
+
+ #strip off the brackets
+ $dir =~ s/^\[//;
+ $dir =~ s/\]$//;
+ }
+
+ #strip off the leading dot if present.
+ $dir =~ s/^\.//;
+
+ # Now put the specifications together.
+ if ($dir ne '') {
+ # Add a separator unless this is an absolute path
+ $path .= '.' if ($path ne '[');
+ $rslt = $path . $dir . ']';
+ } else {
+ $rslt = $path . ']';
+ }
+ }
+
+ } else {
+ # Traditional ODS-2 mode.
+ $spath =~ s/\.dir\Z(?!\n)//i; $sdir =~ s/\.dir\Z(?!\n)//i;
+
+ $sdir = $self->eliminate_macros($sdir)
+ unless $sdir =~ /^[\w\-]+\Z(?!\n)/s;
+ $rslt = $self->fixpath($self->eliminate_macros($spath)."/$sdir",1);
+
+ # Special case for VMS absolute directory specs: these will have
+ # had device prepended during trip through Unix syntax in
+ # eliminate_macros(), since Unix syntax has no way to express
+ # "absolute from the top of this device's directory tree".
+ if ($spath =~ /^[\[<][^.\-]/s) { $rslt =~ s/^[^\[<]+//s; }
+ }
+ } else {
+ # Single directory, just make sure it is in directory format
+ # Return an empty string on null input, and pass through macros.
+
+ if (not defined $dir or not length $dir) { $rslt = ''; }
+ elsif ($dir =~ /^\$\([^\)]+\)\Z(?!\n)/s) {
+ $rslt = $dir;
+ } else {
+ my $unix_mode = 0;
+
+ if ($efs) {
+ my $dir_unix = 0;
+ $dir_unix = 1 if ($dir =~ m#/#);
+ $dir_unix = 1 if ($dir =~ /^\.\.?$/);
+ my $dir_vms = 0;
+ $dir_vms = 1 if ($dir =~ m#[\[<\]]#);
+ $dir_vms = 1 if ($dir =~ /^--?$/);
+
+ if ($dir_vms == $dir_unix) {
+ # Ambiguous, so if in $unix_rpt mode then assume UNIX.
+ $unix_mode = 1 if $unix_rpt;
+ } else {
+ $unix_mode = 1 if $dir_unix;
+ }
+ }
+
+ if ($unix_mode) {
+ return $dir;
+ } else {
+ # For VMS, force it to be in directory format
+ $rslt = vmspath($dir);
+ }
+ }
+ }
+ return $self->canonpath($rslt);
+}
+
+=item catfile (override)
+
+Concatenates a list of directory specifications with a filename specification
+to build a path.
+
+=cut
+
+sub catfile {
+ my $self = shift;
+ my $tfile = pop();
+ my $file = $self->canonpath($tfile);
+ my @files = grep {defined() && length()} @_;
+
+ my $efs = $self->_efs;
+ my $unix_rpt = $self->_unix_rpt;
+
+ # Assume VMS mode
+ my $unix_mode = 0;
+ my $file_unix = 0;
+ my $file_vms = 0;
+ if ($efs) {
+
+ # Now we need to identify format the file is in
+ # of the specification in order to merge them.
+ $file_unix = 1 if ($tfile =~ m#/#);
+ $file_unix = 1 if ($tfile =~ /^\.\.?$/);
+ $file_vms = 1 if ($tfile =~ m#[\[<\]]#);
+ $file_vms = 1 if ($tfile =~ /^--?$/);
+
+ # We may know for sure what the format is.
+ if (($file_unix != $file_vms)) {
+ $unix_mode = 1 if ($file_unix && $unix_rpt);
+ }
+ }
+
+ my $rslt;
+ if (@files) {
+ # concatenate the directories.
+ my $path;
+ if (@files == 1) {
+ $path = $files[0];
+ } else {
+ if ($file_vms) {
+ # We need to make sure this is in VMS mode to avoid doing
+ # both a vmsify and unixfy on the same path, as that may
+ # lose significant data.
+ my $i = @files - 1;
+ my $tdir = $files[$i];
+ my $tdir_vms = 0;
+ my $tdir_unix = 0;
+ $tdir_vms = 1 if ($tdir =~ m#[\[<\]]#);
+ $tdir_unix = 1 if ($tdir =~ m#/#);
+ $tdir_unix = 1 if ($tdir =~ /^\.\.?$/);
+
+ if (!$tdir_vms) {
+ if ($tdir_unix) {
+ $tdir = vmspath($tdir);
+ } else {
+ $tdir =~ s/\.dir\Z(?!\n)//i;
+ $tdir = '[.' . $tdir . ']';
+ }
+ $files[$i] = $tdir;
+ }
+ }
+ $path = $self->catdir(@files);
+ }
+ my $spath = $path;
+
+ # Some thing building a VMS path in pieces may try to pass a
+ # directory name in filename format, so normalize it.
+ $spath =~ s/\.dir\Z(?!\n)//i;
+
+ # if the spath ends with a directory delimiter and the file is bare,
+ # then just concat them.
+ # FIX-ME: In VMS format "[]<>:" are not delimiters if preceded by '^'
+ # Quite a bit of Perl does not know that yet.
+ if ($spath =~ /^[^\)\]\/:>]+\)\Z(?!\n)/s && basename($file) eq $file) {
+ $rslt = "$spath$file";
+ } else {
+ if ($efs) {
+
+ # Now we need to identify what the directory is in
+ # of the specification in order to merge them.
+ my $spath_unix = 0;
+ $spath_unix = 1 if ($spath =~ m#/#);
+ $spath_unix = 1 if ($spath =~ /^\.\.?$/);
+ my $spath_vms = 0;
+ $spath_vms = 1 if ($spath =~ m#[\[<\]]#);
+ $spath_vms = 1 if ($spath =~ /^--?$/);
+
+ # Assume VMS mode
+ if (($spath_unix == $spath_vms) &&
+ ($file_unix == $file_vms)) {
+ # Ambigous, so if in $unix_rpt mode then assume UNIX.
+ $unix_mode = 1 if $unix_rpt;
+ } else {
+ $unix_mode = 1
+ if (($spath_unix || $file_unix) && $unix_rpt);
+ }
+
+ if (!$unix_mode) {
+ if ($spath_vms) {
+ $spath = '[' . $spath . ']' if $spath =~ /^-/;
+ $rslt = vmspath($spath);
+ } else {
+ $rslt = '[.' . $spath . ']';
+ }
+ $file = vmsify($file) if ($file_unix);
+ } else {
+ $spath = unixify($spath) if ($spath_vms);
+ $rslt = $spath;
+ $file = unixify($file) if ($file_vms);
+
+ # Unix merge may need a directory delimitor.
+ # A null path indicates root on Unix.
+ $rslt .= '/' unless ($rslt =~ m#/$#);
+ }
+
+ $rslt .= $file;
+ $rslt =~ s/\]\[//;
+
+ } else {
+ # Traditional VMS Perl mode expects that this is done.
+ # Note for future maintainers:
+ # This is left here for compatibility with perl scripts
+ # that have come to expect this behavior, even though
+ # usually the Perl scripts ported to VMS have to be
+ # patched because of it changing Unix syntax file
+ # to VMS format.
+
+ $rslt = $self->eliminate_macros($spath);
+
+
+ $rslt = vmsify($rslt.((defined $rslt) &&
+ ($rslt ne '') ? '/' : '').unixify($file));
+ }
+ }
+ }
+ else {
+ # Only passed a single file?
+ my $xfile = $file;
+
+ # Traditional VMS perl expects this conversion.
+ $xfile = vmsify($file) unless ($efs);
+
+ $rslt = (defined($file) && length($file)) ? $xfile : '';
+ }
+ return $self->canonpath($rslt) unless $unix_rpt;
+
+ # In Unix report mode, do not strip off redundent path information.
+ return $rslt;
+}
+
+
+=item curdir (override)
+
+Returns a string representation of the current directory: '[]' or '.'
+
+=cut
+
+sub curdir {
+ my $self = shift @_;
+ return '.' if ($self->_unix_rpt);
+ return '[]';
+}
+
+=item devnull (override)
+
+Returns a string representation of the null device: '_NLA0:' or '/dev/null'
+
+=cut
+
+sub devnull {
+ my $self = shift @_;
+ return '/dev/null' if ($self->_unix_rpt);
+ return "_NLA0:";
+}
+
+=item rootdir (override)
+
+Returns a string representation of the root directory: 'SYS$DISK:[000000]'
+or '/'
+
+=cut
+
+sub rootdir {
+ my $self = shift @_;
+ if ($self->_unix_rpt) {
+ # Root may exist, try it first.
+ my $try = '/';
+ my ($dev1, $ino1) = stat('/');
+ my ($dev2, $ino2) = stat('.');
+
+ # Perl falls back to '.' if it can not determine '/'
+ if (($dev1 != $dev2) || ($ino1 != $ino2)) {
+ return $try;
+ }
+ # Fall back to UNIX format sys$disk.
+ return '/sys$disk/';
+ }
+ return 'SYS$DISK:[000000]';
+}
+
+=item tmpdir (override)
+
+Returns a string representation of the first writable directory
+from the following list or '' if none are writable:
+
+ /tmp if C<DECC$FILENAME_REPORT_UNIX> is enabled.
+ sys$scratch:
+ $ENV{TMPDIR}
+
+Since perl 5.8.0, if running under taint mode, and if $ENV{TMPDIR}
+is tainted, it is not used.
+
+=cut
+
+my $tmpdir;
+sub tmpdir {
+ my $self = shift @_;
+ return $tmpdir if defined $tmpdir;
+ if ($self->_unix_rpt) {
+ $tmpdir = $self->_tmpdir('/tmp', '/sys$scratch', $ENV{TMPDIR});
+ return $tmpdir;
+ }
+
+ $tmpdir = $self->_tmpdir( 'sys$scratch:', $ENV{TMPDIR} );
+}
+
+=item updir (override)
+
+Returns a string representation of the parent directory: '[-]' or '..'
+
+=cut
+
+sub updir {
+ my $self = shift @_;
+ return '..' if ($self->_unix_rpt);
+ return '[-]';
+}
+
+=item case_tolerant (override)
+
+VMS file specification syntax is case-tolerant.
+
+=cut
+
+sub case_tolerant {
+ return 1;
+}
+
+=item path (override)
+
+Translate logical name DCL$PATH as a searchlist, rather than trying
+to C<split> string value of C<$ENV{'PATH'}>.
+
+=cut
+
+sub path {
+ my (@dirs,$dir,$i);
+ while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); }
+ return @dirs;
+}
+
+=item file_name_is_absolute (override)
+
+Checks for VMS directory spec as well as Unix separators.
+
+=cut
+
+sub file_name_is_absolute {
+ my ($self,$file) = @_;
+ # If it's a logical name, expand it.
+ $file = $ENV{$file} while $file =~ /^[\w\$\-]+\Z(?!\n)/s && $ENV{$file};
+ return scalar($file =~ m!^/!s ||
+ $file =~ m![<\[][^.\-\]>]! ||
+ $file =~ /:[^<\[]/);
+}
+
+=item splitpath (override)
+
+ ($volume,$directories,$file) = File::Spec->splitpath( $path );
+ ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
+
+Passing a true value for C<$no_file> indicates that the path being
+split only contains directory components, even on systems where you
+can usually (when not supporting a foreign syntax) tell the difference
+between directories and files at a glance.
+
+=cut
+
+sub splitpath {
+ my($self,$path, $nofile) = @_;
+ my($dev,$dir,$file) = ('','','');
+ my $efs = $self->_efs;
+ my $vmsify_path = vmsify($path);
+ if ($efs) {
+ my $path_vms = 0;
+ $path_vms = 1 if ($path =~ m#[\[<\]]#);
+ $path_vms = 1 if ($path =~ /^--?$/);
+ if (!$path_vms) {
+ return $self->SUPER::splitpath($path, $nofile);
+ }
+ $vmsify_path = $path;
+ }
+
+ if ( $nofile ) {
+ #vmsify('d1/d2/d3') returns '[.d1.d2]d3'
+ #vmsify('/d1/d2/d3') returns 'd1:[d2]d3'
+ if( $vmsify_path =~ /(.*)\](.+)/ ){
+ $vmsify_path = $1.'.'.$2.']';
+ }
+ $vmsify_path =~ /(.+:)?(.*)/s;
+ $dir = defined $2 ? $2 : ''; # dir can be '0'
+ return ($1 || '',$dir,$file);
+ }
+ else {
+ $vmsify_path =~ /(.+:)?([\[<].*[\]>])?(.*)/s;
+ return ($1 || '',$2 || '',$3);
+ }
+}
+
+=item splitdir (override)
+
+Split a directory specification into the components.
+
+=cut
+
+sub splitdir {
+ my($self,$dirspec) = @_;
+ my @dirs = ();
+ return @dirs if ( (!defined $dirspec) || ('' eq $dirspec) );
+
+ my $efs = $self->_efs;
+
+ my $dir_unix = 0;
+ $dir_unix = 1 if ($dirspec =~ m#/#);
+ $dir_unix = 1 if ($dirspec =~ /^\.\.?$/);
+
+ # Unix filespecs in EFS mode handled by Unix routines.
+ if ($efs && $dir_unix) {
+ return $self->SUPER::splitdir($dirspec);
+ }
+
+ # FIX ME, only split for VMS delimiters not prefixed with '^'.
+
+ $dirspec =~ tr/<>/[]/; # < and > ==> [ and ]
+ $dirspec =~ s/\]\[\./\.\]\[/g; # ][. ==> .][
+ $dirspec =~ s/\[000000\.\]\[/\[/g; # [000000.][ ==> [
+ $dirspec =~ s/\[000000\./\[/g; # [000000. ==> [
+ $dirspec =~ s/\.\]\[000000\]/\]/g; # .][000000] ==> ]
+ $dirspec =~ s/\.\]\[/\./g; # foo.][bar ==> foo.bar
+ while ($dirspec =~ s/(^|[\[\<\.])\-(\-+)($|[\]\>\.])/$1-.$2$3/g) {}
+ # That loop does the following
+ # with any amount of dashes:
+ # .--. ==> .-.-.
+ # [--. ==> [-.-.
+ # .--] ==> .-.-]
+ # [--] ==> [-.-]
+ $dirspec = "[$dirspec]" unless $dirspec =~ /[\[<]/; # make legal
+ $dirspec =~ s/^(\[|<)\./$1/;
+ @dirs = split /(?<!\^)\./, vmspath($dirspec);
+ $dirs[0] =~ s/^[\[<]//s; $dirs[-1] =~ s/[\]>]\Z(?!\n)//s;
+ @dirs;
+}
+
+
+=item catpath (override)
+
+Construct a complete filespec.
+
+=cut
+
+sub catpath {
+ my($self,$dev,$dir,$file) = @_;
+
+ my $efs = $self->_efs;
+ my $unix_rpt = $self->_unix_rpt;
+
+ my $unix_mode = 0;
+ my $dir_unix = 0;
+ $dir_unix = 1 if ($dir =~ m#/#);
+ $dir_unix = 1 if ($dir =~ /^\.\.?$/);
+ my $dir_vms = 0;
+ $dir_vms = 1 if ($dir =~ m#[\[<\]]#);
+ $dir_vms = 1 if ($dir =~ /^--?$/);
+
+ if ($efs && (length($dev) == 0)) {
+ if ($dir_unix == $dir_vms) {
+ $unix_mode = $unix_rpt;
+ } else {
+ $unix_mode = $dir_unix;
+ }
+ }
+
+ # We look for a volume in $dev, then in $dir, but not both
+ # but only if using VMS syntax.
+ if (!$unix_mode) {
+ $dir = vmspath($dir) if $dir_unix;
+ my ($dir_volume, $dir_dir, $dir_file) = $self->splitpath($dir);
+ $dev = $dir_volume unless length $dev;
+ $dir = length $dir_file ? $self->catfile($dir_dir, $dir_file) :
+ $dir_dir;
+ }
+ if ($dev =~ m|^/+([^/]+)|) { $dev = "$1:"; }
+ else { $dev .= ':' unless $dev eq '' or $dev =~ /:\Z(?!\n)/; }
+ if (length($dev) or length($dir)) {
+ if ($efs) {
+ if ($unix_mode) {
+ $dir .= '/' unless ($dir =~ m#/$#);
+ } else {
+ $dir = vmspath($dir) if (($dir =~ m#/#) || ($dir =~ /^\.\.?$/));
+ $dir = "[$dir]" unless $dir =~ /^[\[<]/;
+ }
+ } else {
+ $dir = "[$dir]" unless $dir =~ /[\[<\/]/;
+ $dir = vmspath($dir);
+ }
+ }
+ "$dev$dir$file";
+}
+
+=item abs2rel (override)
+
+Attempt to convert a file specification to a relative specification.
+On a system with volumes, like VMS, this may not be possible.
+
+=cut
+
+sub abs2rel {
+ my $self = shift;
+ my($path,$base) = @_;
+
+ my $efs = $self->_efs;
+ my $unix_rpt = $self->_unix_rpt;
+
+ if (!$efs) {
+ return vmspath(File::Spec::Unix::abs2rel( $self, @_ ))
+ if grep m{/}, @_;
+ }
+
+ # We need to identify what the directory is in
+ # of the specification in order to process them
+ my $path_unix = 0;
+ $path_unix = 1 if ($path =~ m#/#);
+ $path_unix = 1 if ($path =~ /^\.\.?$/);
+ my $path_vms = 0;
+ $path_vms = 1 if ($path =~ m#[\[<\]]#);
+ $path_vms = 1 if ($path =~ /^--?$/);
+
+ my $unix_mode = 0;
+ if ($path_vms == $path_unix) {
+ $unix_mode = $unix_rpt;
+ } else {
+ $unix_mode = $path_unix;
+ }
+
+ my $base_unix = 0;
+ my $base_vms = 0;
+
+ if (defined $base) {
+ $base_unix = 1 if ($base =~ m#/#);
+ $base_unix = 1 if ($base =~ /^\.\.?$/);
+ $base_vms = 1 if ($base =~ m#[\[<\]]#);
+ $base_vms = 1 if ($base =~ /^--?$/);
+
+ if ($path_vms == $path_unix) {
+ if ($base_vms == $base_unix) {
+ $unix_mode = $unix_rpt;
+ } else {
+ $unix_mode = $base_unix;
+ }
+ } else {
+ $unix_mode = 0 if $base_vms;
+ }
+ }
+
+ if ($efs) {
+ if ($unix_mode) {
+ # We are UNIX mode.
+ $base = unixpath($base) if $base_vms;
+ $base = unixify($path) if $path_vms;
+
+ # Here VMS is different, and in order to do this right
+ # we have to take the realpath for both the path and the base
+ # so that we can remove the common components.
+
+ if ($path =~ m#^/#) {
+ if (defined $base) {
+
+ # For the shorterm, if the starting directories are
+ # common, remove them.
+ my $bq = qq($base);
+ $bq =~ s/\$/\\\$/;
+ $path =~ s/^$bq//i;
+ }
+ return $path;
+ }
+
+ return File::Spec::Unix::abs2rel( $self, $path, $base );
+
+ } else {
+ $base = vmspath($base) if $base_unix;
+ $path = vmsify($path) if $path_unix;
+ }
+ }
+
+ unless (defined $base and length $base) {
+ $base = $self->_cwd();
+ if ($efs) {
+ $base_unix = 1 if ($base =~ m#/#);
+ $base_unix = 1 if ($base =~ /^\.\.?$/);
+ $base = vmspath($base) if $base_unix;
+ }
+ }
+
+ for ($path, $base) { $_ = $self->canonpath($_) }
+
+ # Are we even starting $path on the same (node::)device as $base? Note that
+ # logical paths or nodename differences may be on the "same device"
+ # but the comparison that ignores device differences so as to concatenate
+ # [---] up directory specs is not even a good idea in cases where there is
+ # a logical path difference between $path and $base nodename and/or device.
+ # Hence we fall back to returning the absolute $path spec
+ # if there is a case blind device (or node) difference of any sort
+ # and we do not even try to call $parse() or consult %ENV for $trnlnm()
+ # (this module needs to run on non VMS platforms after all).
+
+ my ($path_volume, $path_directories, $path_file) = $self->splitpath($path);
+ my ($base_volume, $base_directories, $base_file) = $self->splitpath($base);
+ return $path unless lc($path_volume) eq lc($base_volume);
+
+ for ($path, $base) { $_ = $self->rel2abs($_) }
+
+ # Now, remove all leading components that are the same
+ my @pathchunks = $self->splitdir( $path_directories );
+ my $pathchunks = @pathchunks;
+ unshift(@pathchunks,'000000') unless $pathchunks[0] eq '000000';
+ my @basechunks = $self->splitdir( $base_directories );
+ my $basechunks = @basechunks;
+ unshift(@basechunks,'000000') unless $basechunks[0] eq '000000';
+
+ while ( @pathchunks &&
+ @basechunks &&
+ lc( $pathchunks[0] ) eq lc( $basechunks[0] )
+ ) {
+ shift @pathchunks ;
+ shift @basechunks ;
+ }
+
+ # @basechunks now contains the directories to climb out of,
+ # @pathchunks now has the directories to descend in to.
+ if ((@basechunks > 0) || ($basechunks != $pathchunks)) {
+ $path_directories = join '.', ('-' x @basechunks, @pathchunks) ;
+ }
+ else {
+ $path_directories = join '.', @pathchunks;
+ }
+ $path_directories = '['.$path_directories.']';
+ return $self->canonpath( $self->catpath( '', $path_directories, $path_file ) ) ;
+}
+
+
+=item rel2abs (override)
+
+Return an absolute file specification from a relative one.
+
+=cut
+
+sub rel2abs {
+ my $self = shift ;
+ my ($path,$base ) = @_;
+ return undef unless defined $path;
+
+ my $efs = $self->_efs;
+ my $unix_rpt = $self->_unix_rpt;
+
+ # We need to identify what the directory is in
+ # of the specification in order to process them
+ my $path_unix = 0;
+ $path_unix = 1 if ($path =~ m#/#);
+ $path_unix = 1 if ($path =~ /^\.\.?$/);
+ my $path_vms = 0;
+ $path_vms = 1 if ($path =~ m#[\[<\]]#);
+ $path_vms = 1 if ($path =~ /^--?$/);
+
+ my $unix_mode = 0;
+ if ($path_vms == $path_unix) {
+ $unix_mode = $unix_rpt;
+ } else {
+ $unix_mode = $path_unix;
+ }
+
+ my $base_unix = 0;
+ my $base_vms = 0;
+
+ if (defined $base) {
+ $base_unix = 1 if ($base =~ m#/#);
+ $base_unix = 1 if ($base =~ /^\.\.?$/);
+ $base_vms = 1 if ($base =~ m#[\[<\]]#);
+ $base_vms = 1 if ($base =~ /^--?$/);
+
+ # If we could not determine the path mode, see if we can find out
+ # from the base.
+ if ($path_vms == $path_unix) {
+ if ($base_vms != $base_unix) {
+ $unix_mode = $base_unix;
+ }
+ }
+ }
+
+ if (!$efs) {
+ # Legacy behavior, convert to VMS syntax.
+ $unix_mode = 0;
+ if (defined $base) {
+ $base = vmspath($base) if $base =~ m/\//;
+ }
+
+ if ($path =~ m/\//) {
+ $path = ( -d $path || $path =~ m/\/\z/ # educated guessing about
+ ? vmspath($path) # whether it's a directory
+ : vmsify($path) );
+ }
+ }
+
+ # Clean up and split up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = $self->_cwd;
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ if ($efs) {
+ # base may have changed, so need to look up format again.
+ if ($unix_mode) {
+ $base_vms = 1 if ($base =~ m#[\[<\]]#);
+ $base_vms = 1 if ($base =~ /^--?$/);
+ $base = unixpath($base) if $base_vms;
+ $base .= '/' unless ($base =~ m#/$#);
+ } else {
+ $base_unix = 1 if ($base =~ m#/#);
+ $base_unix = 1 if ($base =~ /^\.\.?$/);
+ $base = vmspath($base) if $base_unix;
+ }
+ }
+
+ # Split up paths
+ my ( $path_directories, $path_file ) =
+ ($self->splitpath( $path ))[1,2] ;
+
+ my ( $base_volume, $base_directories ) =
+ $self->splitpath( $base ) ;
+
+ $path_directories = '' if $path_directories eq '[]' ||
+ $path_directories eq '<>';
+ my $sep = '' ;
+
+ if ($efs) {
+ # Merge the paths assuming that the base is absolute.
+ $base_directories = $self->catdir('',
+ $base_directories,
+ $path_directories);
+ } else {
+ # Legacy behavior assumes VMS only paths
+ $sep = '.'
+ if ( $base_directories =~ m{[^.\]>]\Z(?!\n)} &&
+ $path_directories =~ m{^[^.\[<]}s
+ ) ;
+ $base_directories = "$base_directories$sep$path_directories";
+ $base_directories =~ s{\.?[\]>][\[<]\.?}{.};
+ }
+
+ $path_file = '' if ($path_file eq '.') && $unix_mode;
+
+ $path = $self->catpath( $base_volume, $base_directories, $path_file );
+ }
+
+ return $self->canonpath( $path ) ;
+}
+
+
+# eliminate_macros() and fixpath() are MakeMaker-specific methods
+# which are used inside catfile() and catdir(). MakeMaker has its own
+# copies as of 6.06_03 which are the canonical ones. We leave these
+# here, in peace, so that File::Spec continues to work with MakeMakers
+# prior to 6.06_03.
+#
+# Please consider these two methods deprecated. Do not patch them,
+# patch the ones in ExtUtils::MM_VMS instead.
+#
+# Update: MakeMaker 6.48 is still using these routines on VMS.
+# so they need to be kept up to date with ExtUtils::MM_VMS.
+#
+# The traditional VMS mode using ODS-2 disks depends on these routines
+# being here. These routines should not be called in when the
+# C<DECC$EFS_CHARSET> or C<DECC$FILENAME_REPORT_UNIX> modes are enabled.
+
+sub eliminate_macros {
+ my($self,$path) = @_;
+ return '' unless (defined $path) && ($path ne '');
+ $self = {} unless ref $self;
+
+ if ($path =~ /\s/) {
+ return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path;
+ }
+
+ my $npath = unixify($path);
+ # sometimes unixify will return a string with an off-by-one trailing null
+ $npath =~ s{\0$}{};
+
+ my($complex) = 0;
+ my($head,$macro,$tail);
+
+ # perform m##g in scalar context so it acts as an iterator
+ while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) {
+ if (defined $self->{$2}) {
+ ($head,$macro,$tail) = ($1,$2,$3);
+ if (ref $self->{$macro}) {
+ if (ref $self->{$macro} eq 'ARRAY') {
+ $macro = join ' ', @{$self->{$macro}};
+ }
+ else {
+ print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
+ "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
+ $macro = "\cB$macro\cB";
+ $complex = 1;
+ }
+ }
+ else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
+ $npath = "$head$macro$tail";
+ }
+ }
+ if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
+ $npath;
+}
+
+# Deprecated. See the note above for eliminate_macros().
+
+# Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
+# in any directory specification, in order to avoid juxtaposing two
+# VMS-syntax directories when MM[SK] is run. Also expands expressions which
+# are all macro, so that we can tell how long the expansion is, and avoid
+# overrunning DCL's command buffer when MM[KS] is running.
+
+# fixpath() checks to see whether the result matches the name of a
+# directory in the current default directory and returns a directory or
+# file specification accordingly. C<$is_dir> can be set to true to
+# force fixpath() to consider the path to be a directory or false to force
+# it to be a file.
+
+sub fixpath {
+ my($self,$path,$force_path) = @_;
+ return '' unless $path;
+ $self = bless {}, $self unless ref $self;
+ my($fixedpath,$prefix,$name);
+
+ if ($path =~ /\s/) {
+ return join ' ',
+ map { $self->fixpath($_,$force_path) }
+ split /\s+/, $path;
+ }
+
+ if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) {
+ if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
+ $fixedpath = vmspath($self->eliminate_macros($path));
+ }
+ else {
+ $fixedpath = vmsify($self->eliminate_macros($path));
+ }
+ }
+ elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
+ my($vmspre) = $self->eliminate_macros("\$($prefix)");
+ # is it a dir or just a name?
+ $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
+ $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
+ $fixedpath = vmspath($fixedpath) if $force_path;
+ }
+ else {
+ $fixedpath = $path;
+ $fixedpath = vmspath($fixedpath) if $force_path;
+ }
+ # No hints, so we try to guess
+ if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
+ $fixedpath = vmspath($fixedpath) if -d $fixedpath;
+ }
+
+ # Trim off root dirname if it's had other dirs inserted in front of it.
+ $fixedpath =~ s/\.000000([\]>])/$1/;
+ # Special case for VMS absolute directory specs: these will have had device
+ # prepended during trip through Unix syntax in eliminate_macros(), since
+ # Unix syntax has no way to express "absolute from the top of this device's
+ # directory tree".
+ if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }
+ $fixedpath;
+}
+
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+implementation of these methods, not the semantics.
+
+An explanation of VMS file specs can be found at
+L<"http://h71000.www7.hp.com/doc/731FINAL/4506/4506pro_014.html#apps_locating_naming_files">.
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Spec/Win32.pm b/Master/tlpkg/tlperl.straw/lib/File/Spec/Win32.pm
new file mode 100755
index 00000000000..93301ac7357
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Spec/Win32.pm
@@ -0,0 +1,444 @@
+package File::Spec::Win32;
+
+use strict;
+
+use vars qw(@ISA $VERSION);
+require File::Spec::Unix;
+
+$VERSION = '3.30';
+$VERSION = eval $VERSION;
+
+@ISA = qw(File::Spec::Unix);
+
+# Some regexes we use for path splitting
+my $DRIVE_RX = '[a-zA-Z]:';
+my $UNC_RX = '(?:\\\\\\\\|//)[^\\\\/]+[\\\\/][^\\\\/]+';
+my $VOL_RX = "(?:$DRIVE_RX|$UNC_RX)";
+
+
+=head1 NAME
+
+File::Spec::Win32 - methods for Win32 file specs
+
+=head1 SYNOPSIS
+
+ require File::Spec::Win32; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+See File::Spec::Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=over 4
+
+=item devnull
+
+Returns a string representation of the null device.
+
+=cut
+
+sub devnull {
+ return "nul";
+}
+
+sub rootdir { '\\' }
+
+
+=item tmpdir
+
+Returns a string representation of the first existing directory
+from the following list:
+
+ $ENV{TMPDIR}
+ $ENV{TEMP}
+ $ENV{TMP}
+ SYS:/temp
+ C:\system\temp
+ C:/temp
+ /tmp
+ /
+
+The SYS:/temp is preferred in Novell NetWare and the C:\system\temp
+for Symbian (the File::Spec::Win32 is used also for those platforms).
+
+Since Perl 5.8.0, if running under taint mode, and if the environment
+variables are tainted, they are not used.
+
+=cut
+
+my $tmpdir;
+sub tmpdir {
+ return $tmpdir if defined $tmpdir;
+ $tmpdir = $_[0]->_tmpdir( map( $ENV{$_}, qw(TMPDIR TEMP TMP) ),
+ 'SYS:/temp',
+ 'C:\system\temp',
+ 'C:/temp',
+ '/tmp',
+ '/' );
+}
+
+=item case_tolerant
+
+MSWin32 case-tolerance depends on GetVolumeInformation() $ouFsFlags == FS_CASE_SENSITIVE,
+indicating the case significance when comparing file specifications.
+Since XP FS_CASE_SENSITIVE is effectively disabled for the NT subsubsystem.
+See http://cygwin.com/ml/cygwin/2007-07/msg00891.html
+Default: 1
+
+=cut
+
+sub case_tolerant {
+ eval { require Win32API::File; } or return 1;
+ my $drive = shift || "C:";
+ my $osFsType = "\0"x256;
+ my $osVolName = "\0"x256;
+ my $ouFsFlags = 0;
+ Win32API::File::GetVolumeInformation($drive, $osVolName, 256, [], [], $ouFsFlags, $osFsType, 256 );
+ if ($ouFsFlags & Win32API::File::FS_CASE_SENSITIVE()) { return 0; }
+ else { return 1; }
+}
+
+=item file_name_is_absolute
+
+As of right now, this returns 2 if the path is absolute with a
+volume, 1 if it's absolute with no volume, 0 otherwise.
+
+=cut
+
+sub file_name_is_absolute {
+
+ my ($self,$file) = @_;
+
+ if ($file =~ m{^($VOL_RX)}o) {
+ my $vol = $1;
+ return ($vol =~ m{^$UNC_RX}o ? 2
+ : $file =~ m{^$DRIVE_RX[\\/]}o ? 2
+ : 0);
+ }
+ return $file =~ m{^[\\/]} ? 1 : 0;
+}
+
+=item catfile
+
+Concatenate one or more directory names and a filename to form a
+complete path ending with a filename
+
+=cut
+
+sub catfile {
+ shift;
+
+ # Legacy / compatibility support
+ #
+ shift, return _canon_cat( "/", @_ )
+ if $_[0] eq "";
+
+ # Compatibility with File::Spec <= 3.26:
+ # catfile('A:', 'foo') should return 'A:\foo'.
+ return _canon_cat( ($_[0].'\\'), @_[1..$#_] )
+ if $_[0] =~ m{^$DRIVE_RX\z}o;
+
+ return _canon_cat( @_ );
+}
+
+sub catdir {
+ shift;
+
+ # Legacy / compatibility support
+ #
+ return ""
+ unless @_;
+ shift, return _canon_cat( "/", @_ )
+ if $_[0] eq "";
+
+ # Compatibility with File::Spec <= 3.26:
+ # catdir('A:', 'foo') should return 'A:\foo'.
+ return _canon_cat( ($_[0].'\\'), @_[1..$#_] )
+ if $_[0] =~ m{^$DRIVE_RX\z}o;
+
+ return _canon_cat( @_ );
+}
+
+sub path {
+ my @path = split(';', $ENV{PATH});
+ s/"//g for @path;
+ @path = grep length, @path;
+ unshift(@path, ".");
+ return @path;
+}
+
+=item canonpath
+
+No physical check on the filesystem, but a logical cleanup of a
+path. On UNIX eliminated successive slashes and successive "/.".
+On Win32 makes
+
+ dir1\dir2\dir3\..\..\dir4 -> \dir\dir4 and even
+ dir1\dir2\dir3\...\dir4 -> \dir\dir4
+
+=cut
+
+sub canonpath {
+ # Legacy / compatibility support
+ #
+ return $_[1] if !defined($_[1]) or $_[1] eq '';
+ return _canon_cat( $_[1] );
+}
+
+=item splitpath
+
+ ($volume,$directories,$file) = File::Spec->splitpath( $path );
+ ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
+
+Splits a path into volume, directory, and filename portions. Assumes that
+the last file is a path unless the path ends in '\\', '\\.', '\\..'
+or $no_file is true. On Win32 this means that $no_file true makes this return
+( $volume, $path, '' ).
+
+Separators accepted are \ and /.
+
+Volumes can be drive letters or UNC sharenames (\\server\share).
+
+The results can be passed to L</catpath> to get back a path equivalent to
+(usually identical to) the original path.
+
+=cut
+
+sub splitpath {
+ my ($self,$path, $nofile) = @_;
+ my ($volume,$directory,$file) = ('','','');
+ if ( $nofile ) {
+ $path =~
+ m{^ ( $VOL_RX ? ) (.*) }sox;
+ $volume = $1;
+ $directory = $2;
+ }
+ else {
+ $path =~
+ m{^ ( $VOL_RX ? )
+ ( (?:.*[\\/](?:\.\.?\Z(?!\n))?)? )
+ (.*)
+ }sox;
+ $volume = $1;
+ $directory = $2;
+ $file = $3;
+ }
+
+ return ($volume,$directory,$file);
+}
+
+
+=item splitdir
+
+The opposite of L<catdir()|File::Spec/catdir()>.
+
+ @dirs = File::Spec->splitdir( $directories );
+
+$directories must be only the directory portion of the path on systems
+that have the concept of a volume or that have path syntax that differentiates
+files from directories.
+
+Unlike just splitting the directories on the separator, leading empty and
+trailing directory entries can be returned, because these are significant
+on some OSs. So,
+
+ File::Spec->splitdir( "/a/b/c" );
+
+Yields:
+
+ ( '', 'a', 'b', '', 'c', '' )
+
+=cut
+
+sub splitdir {
+ my ($self,$directories) = @_ ;
+ #
+ # split() likes to forget about trailing null fields, so here we
+ # check to be sure that there will not be any before handling the
+ # simple case.
+ #
+ if ( $directories !~ m|[\\/]\Z(?!\n)| ) {
+ return split( m|[\\/]|, $directories );
+ }
+ else {
+ #
+ # since there was a trailing separator, add a file name to the end,
+ # then do the split, then replace it with ''.
+ #
+ my( @directories )= split( m|[\\/]|, "${directories}dummy" ) ;
+ $directories[ $#directories ]= '' ;
+ return @directories ;
+ }
+}
+
+
+=item catpath
+
+Takes volume, directory and file portions and returns an entire path. Under
+Unix, $volume is ignored, and this is just like catfile(). On other OSs,
+the $volume become significant.
+
+=cut
+
+sub catpath {
+ my ($self,$volume,$directory,$file) = @_;
+
+ # If it's UNC, make sure the glue separator is there, reusing
+ # whatever separator is first in the $volume
+ my $v;
+ $volume .= $v
+ if ( (($v) = $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s) &&
+ $directory =~ m@^[^\\/]@s
+ ) ;
+
+ $volume .= $directory ;
+
+ # If the volume is not just A:, make sure the glue separator is
+ # there, reusing whatever separator is first in the $volume if possible.
+ if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s &&
+ $volume =~ m@[^\\/]\Z(?!\n)@ &&
+ $file =~ m@[^\\/]@
+ ) {
+ $volume =~ m@([\\/])@ ;
+ my $sep = $1 ? $1 : '\\' ;
+ $volume .= $sep ;
+ }
+
+ $volume .= $file ;
+
+ return $volume ;
+}
+
+sub _same {
+ lc($_[1]) eq lc($_[2]);
+}
+
+sub rel2abs {
+ my ($self,$path,$base ) = @_;
+
+ my $is_abs = $self->file_name_is_absolute($path);
+
+ # Check for volume (should probably document the '2' thing...)
+ return $self->canonpath( $path ) if $is_abs == 2;
+
+ if ($is_abs) {
+ # It's missing a volume, add one
+ my $vol = ($self->splitpath( $self->_cwd() ))[0];
+ return $self->canonpath( $vol . $path );
+ }
+
+ if ( !defined( $base ) || $base eq '' ) {
+ require Cwd ;
+ $base = Cwd::getdcwd( ($self->splitpath( $path ))[0] ) if defined &Cwd::getdcwd ;
+ $base = $self->_cwd() unless defined $base ;
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ my ( $path_directories, $path_file ) =
+ ($self->splitpath( $path, 1 ))[1,2] ;
+
+ my ( $base_volume, $base_directories ) =
+ $self->splitpath( $base, 1 ) ;
+
+ $path = $self->catpath(
+ $base_volume,
+ $self->catdir( $base_directories, $path_directories ),
+ $path_file
+ ) ;
+
+ return $self->canonpath( $path ) ;
+}
+
+=back
+
+=head2 Note For File::Spec::Win32 Maintainers
+
+Novell NetWare inherits its File::Spec behaviour from File::Spec::Win32.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004,2007 by the Perl 5 Porters. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+implementation of these methods, not the semantics.
+
+=cut
+
+
+sub _canon_cat # @path -> path
+{
+ my ($first, @rest) = @_;
+
+ my $volume = $first =~ s{ \A ([A-Za-z]:) ([\\/]?) }{}x # drive letter
+ ? ucfirst( $1 ).( $2 ? "\\" : "" )
+ : $first =~ s{ \A (?:\\\\|//) ([^\\/]+)
+ (?: [\\/] ([^\\/]+) )?
+ [\\/]? }{}xs # UNC volume
+ ? "\\\\$1".( defined $2 ? "\\$2" : "" )."\\"
+ : $first =~ s{ \A [\\/] }{}x # root dir
+ ? "\\"
+ : "";
+ my $path = join "\\", $first, @rest;
+
+ $path =~ tr#\\/#\\\\#s; # xx/yy --> xx\yy & xx\\yy --> xx\yy
+
+ # xx/././yy --> xx/yy
+ $path =~ s{(?:
+ (?:\A|\\) # at begin or after a slash
+ \.
+ (?:\\\.)* # and more
+ (?:\\|\z) # at end or followed by slash
+ )+ # performance boost -- I do not know why
+ }{\\}gx;
+
+ # XXX I do not know whether more dots are supported by the OS supporting
+ # this ... annotation (NetWare or symbian but not MSWin32).
+ # Then .... could easily become ../../.. etc:
+ # Replace \.\.\. by (\.\.\.+) and substitute with
+ # { $1 . ".." . "\\.." x (length($2)-2) }gex
+ # ... --> ../..
+ $path =~ s{ (\A|\\) # at begin or after a slash
+ \.\.\.
+ (?=\\|\z) # at end or followed by slash
+ }{$1..\\..}gx;
+ # xx\yy\..\zz --> xx\zz
+ while ( $path =~ s{(?:
+ (?:\A|\\) # at begin or after a slash
+ [^\\]+ # rip this 'yy' off
+ \\\.\.
+ (?<!\A\.\.\\\.\.) # do *not* replace ^..\..
+ (?<!\\\.\.\\\.\.) # do *not* replace \..\..
+ (?:\\|\z) # at end or followed by slash
+ )+ # performance boost -- I do not know why
+ }{\\}sx ) {}
+
+ $path =~ s#\A\\##; # \xx --> xx NOTE: this is *not* root
+ $path =~ s#\\\z##; # xx\ --> xx
+
+ if ( $volume =~ m#\\\z# )
+ { # <vol>\.. --> <vol>\
+ $path =~ s{ \A # at begin
+ \.\.
+ (?:\\\.\.)* # and more
+ (?:\\|\z) # at end or followed by slash
+ }{}x;
+
+ return $1 # \\HOST\SHARE\ --> \\HOST\SHARE
+ if $path eq ""
+ and $volume =~ m#\A(\\\\.*)\\\z#s;
+ }
+ return $path ne "" || $volume ? $volume.$path : ".";
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Temp.pm b/Master/tlpkg/tlperl.straw/lib/File/Temp.pm
new file mode 100755
index 00000000000..a2d4ae0759f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Temp.pm
@@ -0,0 +1,2452 @@
+package File::Temp;
+
+=head1 NAME
+
+File::Temp - return name and handle of a temporary file safely
+
+=begin __INTERNALS
+
+=head1 PORTABILITY
+
+This section is at the top in order to provide easier access to
+porters. It is not expected to be rendered by a standard pod
+formatting tool. Please skip straight to the SYNOPSIS section if you
+are not trying to port this module to a new platform.
+
+This module is designed to be portable across operating systems and it
+currently supports Unix, VMS, DOS, OS/2, Windows and Mac OS
+(Classic). When porting to a new OS there are generally three main
+issues that have to be solved:
+
+=over 4
+
+=item *
+
+Can the OS unlink an open file? If it can not then the
+C<_can_unlink_opened_file> method should be modified.
+
+=item *
+
+Are the return values from C<stat> reliable? By default all the
+return values from C<stat> are compared when unlinking a temporary
+file using the filename and the handle. Operating systems other than
+unix do not always have valid entries in all fields. If C<unlink0> fails
+then the C<stat> comparison should be modified accordingly.
+
+=item *
+
+Security. Systems that can not support a test for the sticky bit
+on a directory can not use the MEDIUM and HIGH security tests.
+The C<_can_do_level> method should be modified accordingly.
+
+=back
+
+=end __INTERNALS
+
+=head1 SYNOPSIS
+
+ use File::Temp qw/ tempfile tempdir /;
+
+ $fh = tempfile();
+ ($fh, $filename) = tempfile();
+
+ ($fh, $filename) = tempfile( $template, DIR => $dir);
+ ($fh, $filename) = tempfile( $template, SUFFIX => '.dat');
+ ($fh, $filename) = tempfile( $template, TMPDIR => 1 );
+
+ binmode( $fh, ":utf8" );
+
+ $dir = tempdir( CLEANUP => 1 );
+ ($fh, $filename) = tempfile( DIR => $dir );
+
+Object interface:
+
+ require File::Temp;
+ use File::Temp ();
+ use File::Temp qw/ :seekable /;
+
+ $fh = File::Temp->new();
+ $fname = $fh->filename;
+
+ $fh = File::Temp->new(TEMPLATE => $template);
+ $fname = $fh->filename;
+
+ $tmp = File::Temp->new( UNLINK => 0, SUFFIX => '.dat' );
+ print $tmp "Some data\n";
+ print "Filename is $tmp\n";
+ $tmp->seek( 0, SEEK_END );
+
+The following interfaces are provided for compatibility with
+existing APIs. They should not be used in new code.
+
+MkTemp family:
+
+ use File::Temp qw/ :mktemp /;
+
+ ($fh, $file) = mkstemp( "tmpfileXXXXX" );
+ ($fh, $file) = mkstemps( "tmpfileXXXXXX", $suffix);
+
+ $tmpdir = mkdtemp( $template );
+
+ $unopened_file = mktemp( $template );
+
+POSIX functions:
+
+ use File::Temp qw/ :POSIX /;
+
+ $file = tmpnam();
+ $fh = tmpfile();
+
+ ($fh, $file) = tmpnam();
+
+Compatibility functions:
+
+ $unopened_file = File::Temp::tempnam( $dir, $pfx );
+
+=head1 DESCRIPTION
+
+C<File::Temp> can be used to create and open temporary files in a safe
+way. There is both a function interface and an object-oriented
+interface. The File::Temp constructor or the tempfile() function can
+be used to return the name and the open filehandle of a temporary
+file. The tempdir() function can be used to create a temporary
+directory.
+
+The security aspect of temporary file creation is emphasized such that
+a filehandle and filename are returned together. This helps guarantee
+that a race condition can not occur where the temporary file is
+created by another process between checking for the existence of the
+file and its opening. Additional security levels are provided to
+check, for example, that the sticky bit is set on world writable
+directories. See L<"safe_level"> for more information.
+
+For compatibility with popular C library functions, Perl implementations of
+the mkstemp() family of functions are provided. These are, mkstemp(),
+mkstemps(), mkdtemp() and mktemp().
+
+Additionally, implementations of the standard L<POSIX|POSIX>
+tmpnam() and tmpfile() functions are provided if required.
+
+Implementations of mktemp(), tmpnam(), and tempnam() are provided,
+but should be used with caution since they return only a filename
+that was valid when function was called, so cannot guarantee
+that the file will not exist by the time the caller opens the filename.
+
+Filehandles returned by these functions support the seekable methods.
+
+=cut
+
+# 5.6.0 gives us S_IWOTH, S_IWGRP, our and auto-vivifying filehandls
+# People would like a version on 5.004 so give them what they want :-)
+use 5.004;
+use strict;
+use Carp;
+use File::Spec 0.8;
+use File::Path qw/ rmtree /;
+use Fcntl 1.03;
+use IO::Seekable; # For SEEK_*
+use Errno;
+require VMS::Stdio if $^O eq 'VMS';
+
+# pre-emptively load Carp::Heavy. If we don't when we run out of file
+# handles and attempt to call croak() we get an error message telling
+# us that Carp::Heavy won't load rather than an error telling us we
+# have run out of file handles. We either preload croak() or we
+# switch the calls to croak from _gettemp() to use die.
+eval { require Carp::Heavy; };
+
+# Need the Symbol package if we are running older perl
+require Symbol if $] < 5.006;
+
+### For the OO interface
+use base qw/ IO::Handle IO::Seekable /;
+use overload '""' => "STRINGIFY", fallback => 1;
+
+# use 'our' on v5.6.0
+use vars qw($VERSION @EXPORT_OK %EXPORT_TAGS $DEBUG $KEEP_ALL);
+
+$DEBUG = 0;
+$KEEP_ALL = 0;
+
+# We are exporting functions
+
+use base qw/Exporter/;
+
+# Export list - to allow fine tuning of export table
+
+@EXPORT_OK = qw{
+ tempfile
+ tempdir
+ tmpnam
+ tmpfile
+ mktemp
+ mkstemp
+ mkstemps
+ mkdtemp
+ unlink0
+ cleanup
+ SEEK_SET
+ SEEK_CUR
+ SEEK_END
+ };
+
+# Groups of functions for export
+
+%EXPORT_TAGS = (
+ 'POSIX' => [qw/ tmpnam tmpfile /],
+ 'mktemp' => [qw/ mktemp mkstemp mkstemps mkdtemp/],
+ 'seekable' => [qw/ SEEK_SET SEEK_CUR SEEK_END /],
+ );
+
+# add contents of these tags to @EXPORT
+Exporter::export_tags('POSIX','mktemp','seekable');
+
+# Version number
+
+$VERSION = '0.22';
+
+# This is a list of characters that can be used in random filenames
+
+my @CHARS = (qw/ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
+ a b c d e f g h i j k l m n o p q r s t u v w x y z
+ 0 1 2 3 4 5 6 7 8 9 _
+ /);
+
+# Maximum number of tries to make a temp file before failing
+
+use constant MAX_TRIES => 1000;
+
+# Minimum number of X characters that should be in a template
+use constant MINX => 4;
+
+# Default template when no template supplied
+
+use constant TEMPXXX => 'X' x 10;
+
+# Constants for the security level
+
+use constant STANDARD => 0;
+use constant MEDIUM => 1;
+use constant HIGH => 2;
+
+# OPENFLAGS. If we defined the flag to use with Sysopen here this gives
+# us an optimisation when many temporary files are requested
+
+my $OPENFLAGS = O_CREAT | O_EXCL | O_RDWR;
+my $LOCKFLAG;
+
+unless ($^O eq 'MacOS') {
+ for my $oflag (qw/ NOFOLLOW BINARY LARGEFILE NOINHERIT /) {
+ my ($bit, $func) = (0, "Fcntl::O_" . $oflag);
+ no strict 'refs';
+ $OPENFLAGS |= $bit if eval {
+ # Make sure that redefined die handlers do not cause problems
+ # e.g. CGI::Carp
+ local $SIG{__DIE__} = sub {};
+ local $SIG{__WARN__} = sub {};
+ $bit = &$func();
+ 1;
+ };
+ }
+ # Special case O_EXLOCK
+ $LOCKFLAG = eval {
+ local $SIG{__DIE__} = sub {};
+ local $SIG{__WARN__} = sub {};
+ &Fcntl::O_EXLOCK();
+ };
+}
+
+# On some systems the O_TEMPORARY flag can be used to tell the OS
+# to automatically remove the file when it is closed. This is fine
+# in most cases but not if tempfile is called with UNLINK=>0 and
+# the filename is requested -- in the case where the filename is to
+# be passed to another routine. This happens on windows. We overcome
+# this by using a second open flags variable
+
+my $OPENTEMPFLAGS = $OPENFLAGS;
+unless ($^O eq 'MacOS') {
+ for my $oflag (qw/ TEMPORARY /) {
+ my ($bit, $func) = (0, "Fcntl::O_" . $oflag);
+ local($@);
+ no strict 'refs';
+ $OPENTEMPFLAGS |= $bit if eval {
+ # Make sure that redefined die handlers do not cause problems
+ # e.g. CGI::Carp
+ local $SIG{__DIE__} = sub {};
+ local $SIG{__WARN__} = sub {};
+ $bit = &$func();
+ 1;
+ };
+ }
+}
+
+# Private hash tracking which files have been created by each process id via the OO interface
+my %FILES_CREATED_BY_OBJECT;
+
+# INTERNAL ROUTINES - not to be used outside of package
+
+# Generic routine for getting a temporary filename
+# modelled on OpenBSD _gettemp() in mktemp.c
+
+# The template must contain X's that are to be replaced
+# with the random values
+
+# Arguments:
+
+# TEMPLATE - string containing the XXXXX's that is converted
+# to a random filename and opened if required
+
+# Optionally, a hash can also be supplied containing specific options
+# "open" => if true open the temp file, else just return the name
+# default is 0
+# "mkdir"=> if true, we are creating a temp directory rather than tempfile
+# default is 0
+# "suffixlen" => number of characters at end of PATH to be ignored.
+# default is 0.
+# "unlink_on_close" => indicates that, if possible, the OS should remove
+# the file as soon as it is closed. Usually indicates
+# use of the O_TEMPORARY flag to sysopen.
+# Usually irrelevant on unix
+# "use_exlock" => Indicates that O_EXLOCK should be used. Default is true.
+
+# Optionally a reference to a scalar can be passed into the function
+# On error this will be used to store the reason for the error
+# "ErrStr" => \$errstr
+
+# "open" and "mkdir" can not both be true
+# "unlink_on_close" is not used when "mkdir" is true.
+
+# The default options are equivalent to mktemp().
+
+# Returns:
+# filehandle - open file handle (if called with doopen=1, else undef)
+# temp name - name of the temp file or directory
+
+# For example:
+# ($fh, $name) = _gettemp($template, "open" => 1);
+
+# for the current version, failures are associated with
+# stored in an error string and returned to give the reason whilst debugging
+# This routine is not called by any external function
+sub _gettemp {
+
+ croak 'Usage: ($fh, $name) = _gettemp($template, OPTIONS);'
+ unless scalar(@_) >= 1;
+
+ # the internal error string - expect it to be overridden
+ # Need this in case the caller decides not to supply us a value
+ # need an anonymous scalar
+ my $tempErrStr;
+
+ # Default options
+ my %options = (
+ "open" => 0,
+ "mkdir" => 0,
+ "suffixlen" => 0,
+ "unlink_on_close" => 0,
+ "use_exlock" => 1,
+ "ErrStr" => \$tempErrStr,
+ );
+
+ # Read the template
+ my $template = shift;
+ if (ref($template)) {
+ # Use a warning here since we have not yet merged ErrStr
+ carp "File::Temp::_gettemp: template must not be a reference";
+ return ();
+ }
+
+ # Check that the number of entries on stack are even
+ if (scalar(@_) % 2 != 0) {
+ # Use a warning here since we have not yet merged ErrStr
+ carp "File::Temp::_gettemp: Must have even number of options";
+ return ();
+ }
+
+ # Read the options and merge with defaults
+ %options = (%options, @_) if @_;
+
+ # Make sure the error string is set to undef
+ ${$options{ErrStr}} = undef;
+
+ # Can not open the file and make a directory in a single call
+ if ($options{"open"} && $options{"mkdir"}) {
+ ${$options{ErrStr}} = "doopen and domkdir can not both be true\n";
+ return ();
+ }
+
+ # Find the start of the end of the Xs (position of last X)
+ # Substr starts from 0
+ my $start = length($template) - 1 - $options{"suffixlen"};
+
+ # Check that we have at least MINX x X (e.g. 'XXXX") at the end of the string
+ # (taking suffixlen into account). Any fewer is insecure.
+
+ # Do it using substr - no reason to use a pattern match since
+ # we know where we are looking and what we are looking for
+
+ if (substr($template, $start - MINX + 1, MINX) ne 'X' x MINX) {
+ ${$options{ErrStr}} = "The template must end with at least ".
+ MINX . " 'X' characters\n";
+ return ();
+ }
+
+ # Replace all the X at the end of the substring with a
+ # random character or just all the XX at the end of a full string.
+ # Do it as an if, since the suffix adjusts which section to replace
+ # and suffixlen=0 returns nothing if used in the substr directly
+ # and generate a full path from the template
+
+ my $path = _replace_XX($template, $options{"suffixlen"});
+
+
+ # Split the path into constituent parts - eventually we need to check
+ # whether the directory exists
+ # We need to know whether we are making a temp directory
+ # or a tempfile
+
+ my ($volume, $directories, $file);
+ my $parent; # parent directory
+ if ($options{"mkdir"}) {
+ # There is no filename at the end
+ ($volume, $directories, $file) = File::Spec->splitpath( $path, 1);
+
+ # The parent is then $directories without the last directory
+ # Split the directory and put it back together again
+ my @dirs = File::Spec->splitdir($directories);
+
+ # If @dirs only has one entry (i.e. the directory template) that means
+ # we are in the current directory
+ if ($#dirs == 0) {
+ $parent = File::Spec->curdir;
+ } else {
+
+ if ($^O eq 'VMS') { # need volume to avoid relative dir spec
+ $parent = File::Spec->catdir($volume, @dirs[0..$#dirs-1]);
+ $parent = 'sys$disk:[]' if $parent eq '';
+ } else {
+
+ # Put it back together without the last one
+ $parent = File::Spec->catdir(@dirs[0..$#dirs-1]);
+
+ # ...and attach the volume (no filename)
+ $parent = File::Spec->catpath($volume, $parent, '');
+ }
+
+ }
+
+ } else {
+
+ # Get rid of the last filename (use File::Basename for this?)
+ ($volume, $directories, $file) = File::Spec->splitpath( $path );
+
+ # Join up without the file part
+ $parent = File::Spec->catpath($volume,$directories,'');
+
+ # If $parent is empty replace with curdir
+ $parent = File::Spec->curdir
+ unless $directories ne '';
+
+ }
+
+ # Check that the parent directories exist
+ # Do this even for the case where we are simply returning a name
+ # not a file -- no point returning a name that includes a directory
+ # that does not exist or is not writable
+
+ unless (-e $parent) {
+ ${$options{ErrStr}} = "Parent directory ($parent) does not exist";
+ return ();
+ }
+ unless (-d $parent) {
+ ${$options{ErrStr}} = "Parent directory ($parent) is not a directory";
+ return ();
+ }
+
+ # Check the stickiness of the directory and chown giveaway if required
+ # If the directory is world writable the sticky bit
+ # must be set
+
+ if (File::Temp->safe_level == MEDIUM) {
+ my $safeerr;
+ unless (_is_safe($parent,\$safeerr)) {
+ ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)";
+ return ();
+ }
+ } elsif (File::Temp->safe_level == HIGH) {
+ my $safeerr;
+ unless (_is_verysafe($parent, \$safeerr)) {
+ ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)";
+ return ();
+ }
+ }
+
+
+ # Now try MAX_TRIES time to open the file
+ for (my $i = 0; $i < MAX_TRIES; $i++) {
+
+ # Try to open the file if requested
+ if ($options{"open"}) {
+ my $fh;
+
+ # If we are running before perl5.6.0 we can not auto-vivify
+ if ($] < 5.006) {
+ $fh = &Symbol::gensym;
+ }
+
+ # Try to make sure this will be marked close-on-exec
+ # XXX: Win32 doesn't respect this, nor the proper fcntl,
+ # but may have O_NOINHERIT. This may or may not be in Fcntl.
+ local $^F = 2;
+
+ # Attempt to open the file
+ my $open_success = undef;
+ if ( $^O eq 'VMS' and $options{"unlink_on_close"} && !$KEEP_ALL) {
+ # make it auto delete on close by setting FAB$V_DLT bit
+ $fh = VMS::Stdio::vmssysopen($path, $OPENFLAGS, 0600, 'fop=dlt');
+ $open_success = $fh;
+ } else {
+ my $flags = ( ($options{"unlink_on_close"} && !$KEEP_ALL) ?
+ $OPENTEMPFLAGS :
+ $OPENFLAGS );
+ $flags |= $LOCKFLAG if (defined $LOCKFLAG && $options{use_exlock});
+ $open_success = sysopen($fh, $path, $flags, 0600);
+ }
+ if ( $open_success ) {
+
+ # in case of odd umask force rw
+ chmod(0600, $path);
+
+ # Opened successfully - return file handle and name
+ return ($fh, $path);
+
+ } else {
+
+ # Error opening file - abort with error
+ # if the reason was anything but EEXIST
+ unless ($!{EEXIST}) {
+ ${$options{ErrStr}} = "Could not create temp file $path: $!";
+ return ();
+ }
+
+ # Loop round for another try
+
+ }
+ } elsif ($options{"mkdir"}) {
+
+ # Open the temp directory
+ if (mkdir( $path, 0700)) {
+ # in case of odd umask
+ chmod(0700, $path);
+
+ return undef, $path;
+ } else {
+
+ # Abort with error if the reason for failure was anything
+ # except EEXIST
+ unless ($!{EEXIST}) {
+ ${$options{ErrStr}} = "Could not create directory $path: $!";
+ return ();
+ }
+
+ # Loop round for another try
+
+ }
+
+ } else {
+
+ # Return true if the file can not be found
+ # Directory has been checked previously
+
+ return (undef, $path) unless -e $path;
+
+ # Try again until MAX_TRIES
+
+ }
+
+ # Did not successfully open the tempfile/dir
+ # so try again with a different set of random letters
+ # No point in trying to increment unless we have only
+ # 1 X say and the randomness could come up with the same
+ # file MAX_TRIES in a row.
+
+ # Store current attempt - in principal this implies that the
+ # 3rd time around the open attempt that the first temp file
+ # name could be generated again. Probably should store each
+ # attempt and make sure that none are repeated
+
+ my $original = $path;
+ my $counter = 0; # Stop infinite loop
+ my $MAX_GUESS = 50;
+
+ do {
+
+ # Generate new name from original template
+ $path = _replace_XX($template, $options{"suffixlen"});
+
+ $counter++;
+
+ } until ($path ne $original || $counter > $MAX_GUESS);
+
+ # Check for out of control looping
+ if ($counter > $MAX_GUESS) {
+ ${$options{ErrStr}} = "Tried to get a new temp name different to the previous value $MAX_GUESS times.\nSomething wrong with template?? ($template)";
+ return ();
+ }
+
+ }
+
+ # If we get here, we have run out of tries
+ ${ $options{ErrStr} } = "Have exceeded the maximum number of attempts ("
+ . MAX_TRIES . ") to open temp file/dir";
+
+ return ();
+
+}
+
+# Internal routine to replace the XXXX... with random characters
+# This has to be done by _gettemp() every time it fails to
+# open a temp file/dir
+
+# Arguments: $template (the template with XXX),
+# $ignore (number of characters at end to ignore)
+
+# Returns: modified template
+
+sub _replace_XX {
+
+ croak 'Usage: _replace_XX($template, $ignore)'
+ unless scalar(@_) == 2;
+
+ my ($path, $ignore) = @_;
+
+ # Do it as an if, since the suffix adjusts which section to replace
+ # and suffixlen=0 returns nothing if used in the substr directly
+ # Alternatively, could simply set $ignore to length($path)-1
+ # Don't want to always use substr when not required though.
+ my $end = ( $] >= 5.006 ? "\\z" : "\\Z" );
+
+ if ($ignore) {
+ substr($path, 0, - $ignore) =~ s/X(?=X*$end)/$CHARS[ int( rand( @CHARS ) ) ]/ge;
+ } else {
+ $path =~ s/X(?=X*$end)/$CHARS[ int( rand( @CHARS ) ) ]/ge;
+ }
+ return $path;
+}
+
+# Internal routine to force a temp file to be writable after
+# it is created so that we can unlink it. Windows seems to occassionally
+# force a file to be readonly when written to certain temp locations
+sub _force_writable {
+ my $file = shift;
+ chmod 0600, $file;
+}
+
+
+# internal routine to check to see if the directory is safe
+# First checks to see if the directory is not owned by the
+# current user or root. Then checks to see if anyone else
+# can write to the directory and if so, checks to see if
+# it has the sticky bit set
+
+# Will not work on systems that do not support sticky bit
+
+#Args: directory path to check
+# Optionally: reference to scalar to contain error message
+# Returns true if the path is safe and false otherwise.
+# Returns undef if can not even run stat() on the path
+
+# This routine based on version written by Tom Christiansen
+
+# Presumably, by the time we actually attempt to create the
+# file or directory in this directory, it may not be safe
+# anymore... Have to run _is_safe directly after the open.
+
+sub _is_safe {
+
+ my $path = shift;
+ my $err_ref = shift;
+
+ # Stat path
+ my @info = stat($path);
+ unless (scalar(@info)) {
+ $$err_ref = "stat(path) returned no values";
+ return 0;
+ }
+ ;
+ return 1 if $^O eq 'VMS'; # owner delete control at file level
+
+ # Check to see whether owner is neither superuser (or a system uid) nor me
+ # Use the effective uid from the $> variable
+ # UID is in [4]
+ if ($info[4] > File::Temp->top_system_uid() && $info[4] != $>) {
+
+ Carp::cluck(sprintf "uid=$info[4] topuid=%s euid=$> path='$path'",
+ File::Temp->top_system_uid());
+
+ $$err_ref = "Directory owned neither by root nor the current user"
+ if ref($err_ref);
+ return 0;
+ }
+
+ # check whether group or other can write file
+ # use 066 to detect either reading or writing
+ # use 022 to check writability
+ # Do it with S_IWOTH and S_IWGRP for portability (maybe)
+ # mode is in info[2]
+ if (($info[2] & &Fcntl::S_IWGRP) || # Is group writable?
+ ($info[2] & &Fcntl::S_IWOTH) ) { # Is world writable?
+ # Must be a directory
+ unless (-d $path) {
+ $$err_ref = "Path ($path) is not a directory"
+ if ref($err_ref);
+ return 0;
+ }
+ # Must have sticky bit set
+ unless (-k $path) {
+ $$err_ref = "Sticky bit not set on $path when dir is group|world writable"
+ if ref($err_ref);
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+# Internal routine to check whether a directory is safe
+# for temp files. Safer than _is_safe since it checks for
+# the possibility of chown giveaway and if that is a possibility
+# checks each directory in the path to see if it is safe (with _is_safe)
+
+# If _PC_CHOWN_RESTRICTED is not set, does the full test of each
+# directory anyway.
+
+# Takes optional second arg as scalar ref to error reason
+
+sub _is_verysafe {
+
+ # Need POSIX - but only want to bother if really necessary due to overhead
+ require POSIX;
+
+ my $path = shift;
+ print "_is_verysafe testing $path\n" if $DEBUG;
+ return 1 if $^O eq 'VMS'; # owner delete control at file level
+
+ my $err_ref = shift;
+
+ # Should Get the value of _PC_CHOWN_RESTRICTED if it is defined
+ # and If it is not there do the extensive test
+ local($@);
+ my $chown_restricted;
+ $chown_restricted = &POSIX::_PC_CHOWN_RESTRICTED()
+ if eval { &POSIX::_PC_CHOWN_RESTRICTED(); 1};
+
+ # If chown_resticted is set to some value we should test it
+ if (defined $chown_restricted) {
+
+ # Return if the current directory is safe
+ return _is_safe($path,$err_ref) if POSIX::sysconf( $chown_restricted );
+
+ }
+
+ # To reach this point either, the _PC_CHOWN_RESTRICTED symbol
+ # was not avialable or the symbol was there but chown giveaway
+ # is allowed. Either way, we now have to test the entire tree for
+ # safety.
+
+ # Convert path to an absolute directory if required
+ unless (File::Spec->file_name_is_absolute($path)) {
+ $path = File::Spec->rel2abs($path);
+ }
+
+ # Split directory into components - assume no file
+ my ($volume, $directories, undef) = File::Spec->splitpath( $path, 1);
+
+ # Slightly less efficient than having a function in File::Spec
+ # to chop off the end of a directory or even a function that
+ # can handle ../ in a directory tree
+ # Sometimes splitdir() returns a blank at the end
+ # so we will probably check the bottom directory twice in some cases
+ my @dirs = File::Spec->splitdir($directories);
+
+ # Concatenate one less directory each time around
+ foreach my $pos (0.. $#dirs) {
+ # Get a directory name
+ my $dir = File::Spec->catpath($volume,
+ File::Spec->catdir(@dirs[0.. $#dirs - $pos]),
+ ''
+ );
+
+ print "TESTING DIR $dir\n" if $DEBUG;
+
+ # Check the directory
+ return 0 unless _is_safe($dir,$err_ref);
+
+ }
+
+ return 1;
+}
+
+
+
+# internal routine to determine whether unlink works on this
+# platform for files that are currently open.
+# Returns true if we can, false otherwise.
+
+# Currently WinNT, OS/2 and VMS can not unlink an opened file
+# On VMS this is because the O_EXCL flag is used to open the
+# temporary file. Currently I do not know enough about the issues
+# on VMS to decide whether O_EXCL is a requirement.
+
+sub _can_unlink_opened_file {
+
+ if ($^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'VMS' || $^O eq 'dos' || $^O eq 'MacOS') {
+ return 0;
+ } else {
+ return 1;
+ }
+
+}
+
+# internal routine to decide which security levels are allowed
+# see safe_level() for more information on this
+
+# Controls whether the supplied security level is allowed
+
+# $cando = _can_do_level( $level )
+
+sub _can_do_level {
+
+ # Get security level
+ my $level = shift;
+
+ # Always have to be able to do STANDARD
+ return 1 if $level == STANDARD;
+
+ # Currently, the systems that can do HIGH or MEDIUM are identical
+ if ( $^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'cygwin' || $^O eq 'dos' || $^O eq 'MacOS' || $^O eq 'mpeix') {
+ return 0;
+ } else {
+ return 1;
+ }
+
+}
+
+# This routine sets up a deferred unlinking of a specified
+# filename and filehandle. It is used in the following cases:
+# - Called by unlink0 if an opened file can not be unlinked
+# - Called by tempfile() if files are to be removed on shutdown
+# - Called by tempdir() if directories are to be removed on shutdown
+
+# Arguments:
+# _deferred_unlink( $fh, $fname, $isdir );
+#
+# - filehandle (so that it can be expclicitly closed if open
+# - filename (the thing we want to remove)
+# - isdir (flag to indicate that we are being given a directory)
+# [and hence no filehandle]
+
+# Status is not referred to since all the magic is done with an END block
+
+{
+ # Will set up two lexical variables to contain all the files to be
+ # removed. One array for files, another for directories They will
+ # only exist in this block.
+
+ # This means we only have to set up a single END block to remove
+ # all files.
+
+ # in order to prevent child processes inadvertently deleting the parent
+ # temp files we use a hash to store the temp files and directories
+ # created by a particular process id.
+
+ # %files_to_unlink contains values that are references to an array of
+ # array references containing the filehandle and filename associated with
+ # the temp file.
+ my (%files_to_unlink, %dirs_to_unlink);
+
+ # Set up an end block to use these arrays
+ END {
+ local($., $@, $!, $^E, $?);
+ cleanup();
+ }
+
+ # Cleanup function. Always triggered on END but can be invoked
+ # manually.
+ sub cleanup {
+ if (!$KEEP_ALL) {
+ # Files
+ my @files = (exists $files_to_unlink{$$} ?
+ @{ $files_to_unlink{$$} } : () );
+ foreach my $file (@files) {
+ # close the filehandle without checking its state
+ # in order to make real sure that this is closed
+ # if its already closed then I dont care about the answer
+ # probably a better way to do this
+ close($file->[0]); # file handle is [0]
+
+ if (-f $file->[1]) { # file name is [1]
+ _force_writable( $file->[1] ); # for windows
+ unlink $file->[1] or warn "Error removing ".$file->[1];
+ }
+ }
+ # Dirs
+ my @dirs = (exists $dirs_to_unlink{$$} ?
+ @{ $dirs_to_unlink{$$} } : () );
+ foreach my $dir (@dirs) {
+ if (-d $dir) {
+ # Some versions of rmtree will abort if you attempt to remove
+ # the directory you are sitting in. We protect that and turn it
+ # into a warning. We do this because this occurs during
+ # cleanup and so can not be caught by the user.
+ eval { rmtree($dir, $DEBUG, 0); };
+ warn $@ if ($@ && $^W);
+ }
+ }
+
+ # clear the arrays
+ @{ $files_to_unlink{$$} } = ()
+ if exists $files_to_unlink{$$};
+ @{ $dirs_to_unlink{$$} } = ()
+ if exists $dirs_to_unlink{$$};
+ }
+ }
+
+
+ # This is the sub called to register a file for deferred unlinking
+ # This could simply store the input parameters and defer everything
+ # until the END block. For now we do a bit of checking at this
+ # point in order to make sure that (1) we have a file/dir to delete
+ # and (2) we have been called with the correct arguments.
+ sub _deferred_unlink {
+
+ croak 'Usage: _deferred_unlink($fh, $fname, $isdir)'
+ unless scalar(@_) == 3;
+
+ my ($fh, $fname, $isdir) = @_;
+
+ warn "Setting up deferred removal of $fname\n"
+ if $DEBUG;
+
+ # If we have a directory, check that it is a directory
+ if ($isdir) {
+
+ if (-d $fname) {
+
+ # Directory exists so store it
+ # first on VMS turn []foo into [.foo] for rmtree
+ $fname = VMS::Filespec::vmspath($fname) if $^O eq 'VMS';
+ $dirs_to_unlink{$$} = []
+ unless exists $dirs_to_unlink{$$};
+ push (@{ $dirs_to_unlink{$$} }, $fname);
+
+ } else {
+ carp "Request to remove directory $fname could not be completed since it does not exist!\n" if $^W;
+ }
+
+ } else {
+
+ if (-f $fname) {
+
+ # file exists so store handle and name for later removal
+ $files_to_unlink{$$} = []
+ unless exists $files_to_unlink{$$};
+ push(@{ $files_to_unlink{$$} }, [$fh, $fname]);
+
+ } else {
+ carp "Request to remove file $fname could not be completed since it is not there!\n" if $^W;
+ }
+
+ }
+
+ }
+
+
+}
+
+=head1 OBJECT-ORIENTED INTERFACE
+
+This is the primary interface for interacting with
+C<File::Temp>. Using the OO interface a temporary file can be created
+when the object is constructed and the file can be removed when the
+object is no longer required.
+
+Note that there is no method to obtain the filehandle from the
+C<File::Temp> object. The object itself acts as a filehandle. Also,
+the object is configured such that it stringifies to the name of the
+temporary file, and can be compared to a filename directly. The object
+isa C<IO::Handle> and isa C<IO::Seekable> so all those methods are
+available.
+
+=over 4
+
+=item B<new>
+
+Create a temporary file object.
+
+ my $tmp = File::Temp->new();
+
+by default the object is constructed as if C<tempfile>
+was called without options, but with the additional behaviour
+that the temporary file is removed by the object destructor
+if UNLINK is set to true (the default).
+
+Supported arguments are the same as for C<tempfile>: UNLINK
+(defaulting to true), DIR, EXLOCK and SUFFIX. Additionally, the filename
+template is specified using the TEMPLATE option. The OPEN option
+is not supported (the file is always opened).
+
+ $tmp = File::Temp->new( TEMPLATE => 'tempXXXXX',
+ DIR => 'mydir',
+ SUFFIX => '.dat');
+
+Arguments are case insensitive.
+
+Can call croak() if an error occurs.
+
+=cut
+
+sub new {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+
+ # read arguments and convert keys to upper case
+ my %args = @_;
+ %args = map { uc($_), $args{$_} } keys %args;
+
+ # see if they are unlinking (defaulting to yes)
+ my $unlink = (exists $args{UNLINK} ? $args{UNLINK} : 1 );
+ delete $args{UNLINK};
+
+ # template (store it in an array so that it will
+ # disappear from the arg list of tempfile)
+ my @template = ( exists $args{TEMPLATE} ? $args{TEMPLATE} : () );
+ delete $args{TEMPLATE};
+
+ # Protect OPEN
+ delete $args{OPEN};
+
+ # Open the file and retain file handle and file name
+ my ($fh, $path) = tempfile( @template, %args );
+
+ print "Tmp: $fh - $path\n" if $DEBUG;
+
+ # Store the filename in the scalar slot
+ ${*$fh} = $path;
+
+ # Cache the filename by pid so that the destructor can decide whether to remove it
+ $FILES_CREATED_BY_OBJECT{$$}{$path} = 1;
+
+ # Store unlink information in hash slot (plus other constructor info)
+ %{*$fh} = %args;
+
+ # create the object
+ bless $fh, $class;
+
+ # final method-based configuration
+ $fh->unlink_on_destroy( $unlink );
+
+ return $fh;
+}
+
+=item B<newdir>
+
+Create a temporary directory using an object oriented interface.
+
+ $dir = File::Temp->newdir();
+
+By default the directory is deleted when the object goes out of scope.
+
+Supports the same options as the C<tempdir> function. Note that directories
+created with this method default to CLEANUP => 1.
+
+ $dir = File::Temp->newdir( $template, %options );
+
+=cut
+
+sub newdir {
+ my $self = shift;
+
+ # need to handle args as in tempdir because we have to force CLEANUP
+ # default without passing CLEANUP to tempdir
+ my $template = (scalar(@_) % 2 == 1 ? shift(@_) : undef );
+ my %options = @_;
+ my $cleanup = (exists $options{CLEANUP} ? $options{CLEANUP} : 1 );
+
+ delete $options{CLEANUP};
+
+ my $tempdir;
+ if (defined $template) {
+ $tempdir = tempdir( $template, %options );
+ } else {
+ $tempdir = tempdir( %options );
+ }
+ return bless { DIRNAME => $tempdir,
+ CLEANUP => $cleanup,
+ LAUNCHPID => $$,
+ }, "File::Temp::Dir";
+}
+
+=item B<filename>
+
+Return the name of the temporary file associated with this object
+(if the object was created using the "new" constructor).
+
+ $filename = $tmp->filename;
+
+This method is called automatically when the object is used as
+a string.
+
+=cut
+
+sub filename {
+ my $self = shift;
+ return ${*$self};
+}
+
+sub STRINGIFY {
+ my $self = shift;
+ return $self->filename;
+}
+
+=item B<dirname>
+
+Return the name of the temporary directory associated with this
+object (if the object was created using the "newdir" constructor).
+
+ $dirname = $tmpdir->dirname;
+
+This method is called automatically when the object is used in string context.
+
+=item B<unlink_on_destroy>
+
+Control whether the file is unlinked when the object goes out of scope.
+The file is removed if this value is true and $KEEP_ALL is not.
+
+ $fh->unlink_on_destroy( 1 );
+
+Default is for the file to be removed.
+
+=cut
+
+sub unlink_on_destroy {
+ my $self = shift;
+ if (@_) {
+ ${*$self}{UNLINK} = shift;
+ }
+ return ${*$self}{UNLINK};
+}
+
+=item B<DESTROY>
+
+When the object goes out of scope, the destructor is called. This
+destructor will attempt to unlink the file (using C<unlink1>)
+if the constructor was called with UNLINK set to 1 (the default state
+if UNLINK is not specified).
+
+No error is given if the unlink fails.
+
+If the object has been passed to a child process during a fork, the
+file will be deleted when the object goes out of scope in the parent.
+
+For a temporary directory object the directory will be removed
+unless the CLEANUP argument was used in the constructor (and set to
+false) or C<unlink_on_destroy> was modified after creation.
+
+If the global variable $KEEP_ALL is true, the file or directory
+will not be removed.
+
+=cut
+
+sub DESTROY {
+ local($., $@, $!, $^E, $?);
+ my $self = shift;
+
+ # Make sure we always remove the file from the global hash
+ # on destruction. This prevents the hash from growing uncontrollably
+ # and post-destruction there is no reason to know about the file.
+ my $file = $self->filename;
+ my $was_created_by_proc;
+ if (exists $FILES_CREATED_BY_OBJECT{$$}{$file}) {
+ $was_created_by_proc = 1;
+ delete $FILES_CREATED_BY_OBJECT{$$}{$file};
+ }
+
+ if (${*$self}{UNLINK} && !$KEEP_ALL) {
+ print "# ---------> Unlinking $self\n" if $DEBUG;
+
+ # only delete if this process created it
+ return unless $was_created_by_proc;
+
+ # The unlink1 may fail if the file has been closed
+ # by the caller. This leaves us with the decision
+ # of whether to refuse to remove the file or simply
+ # do an unlink without test. Seems to be silly
+ # to do this when we are trying to be careful
+ # about security
+ _force_writable( $file ); # for windows
+ unlink1( $self, $file )
+ or unlink($file);
+ }
+}
+
+=back
+
+=head1 FUNCTIONS
+
+This section describes the recommended interface for generating
+temporary files and directories.
+
+=over 4
+
+=item B<tempfile>
+
+This is the basic function to generate temporary files.
+The behaviour of the file can be changed using various options:
+
+ $fh = tempfile();
+ ($fh, $filename) = tempfile();
+
+Create a temporary file in the directory specified for temporary
+files, as specified by the tmpdir() function in L<File::Spec>.
+
+ ($fh, $filename) = tempfile($template);
+
+Create a temporary file in the current directory using the supplied
+template. Trailing `X' characters are replaced with random letters to
+generate the filename. At least four `X' characters must be present
+at the end of the template.
+
+ ($fh, $filename) = tempfile($template, SUFFIX => $suffix)
+
+Same as previously, except that a suffix is added to the template
+after the `X' translation. Useful for ensuring that a temporary
+filename has a particular extension when needed by other applications.
+But see the WARNING at the end.
+
+ ($fh, $filename) = tempfile($template, DIR => $dir);
+
+Translates the template as before except that a directory name
+is specified.
+
+ ($fh, $filename) = tempfile($template, TMPDIR => 1);
+
+Equivalent to specifying a DIR of "File::Spec->tmpdir", writing the file
+into the same temporary directory as would be used if no template was
+specified at all.
+
+ ($fh, $filename) = tempfile($template, UNLINK => 1);
+
+Return the filename and filehandle as before except that the file is
+automatically removed when the program exits (dependent on
+$KEEP_ALL). Default is for the file to be removed if a file handle is
+requested and to be kept if the filename is requested. In a scalar
+context (where no filename is returned) the file is always deleted
+either (depending on the operating system) on exit or when it is
+closed (unless $KEEP_ALL is true when the temp file is created).
+
+Use the object-oriented interface if fine-grained control of when
+a file is removed is required.
+
+If the template is not specified, a template is always
+automatically generated. This temporary file is placed in tmpdir()
+(L<File::Spec>) unless a directory is specified explicitly with the
+DIR option.
+
+ $fh = tempfile( DIR => $dir );
+
+If called in scalar context, only the filehandle is returned and the
+file will automatically be deleted when closed on operating systems
+that support this (see the description of tmpfile() elsewhere in this
+document). This is the preferred mode of operation, as if you only
+have a filehandle, you can never create a race condition by fumbling
+with the filename. On systems that can not unlink an open file or can
+not mark a file as temporary when it is opened (for example, Windows
+NT uses the C<O_TEMPORARY> flag) the file is marked for deletion when
+the program ends (equivalent to setting UNLINK to 1). The C<UNLINK>
+flag is ignored if present.
+
+ (undef, $filename) = tempfile($template, OPEN => 0);
+
+This will return the filename based on the template but
+will not open this file. Cannot be used in conjunction with
+UNLINK set to true. Default is to always open the file
+to protect from possible race conditions. A warning is issued
+if warnings are turned on. Consider using the tmpnam()
+and mktemp() functions described elsewhere in this document
+if opening the file is not required.
+
+If the operating system supports it (for example BSD derived systems), the
+filehandle will be opened with O_EXLOCK (open with exclusive file lock).
+This can sometimes cause problems if the intention is to pass the filename
+to another system that expects to take an exclusive lock itself (such as
+DBD::SQLite) whilst ensuring that the tempfile is not reused. In this
+situation the "EXLOCK" option can be passed to tempfile. By default EXLOCK
+will be true (this retains compatibility with earlier releases).
+
+ ($fh, $filename) = tempfile($template, EXLOCK => 0);
+
+Options can be combined as required.
+
+Will croak() if there is an error.
+
+=cut
+
+sub tempfile {
+
+ # Can not check for argument count since we can have any
+ # number of args
+
+ # Default options
+ my %options = (
+ "DIR" => undef, # Directory prefix
+ "SUFFIX" => '', # Template suffix
+ "UNLINK" => 0, # Do not unlink file on exit
+ "OPEN" => 1, # Open file
+ "TMPDIR" => 0, # Place tempfile in tempdir if template specified
+ "EXLOCK" => 1, # Open file with O_EXLOCK
+ );
+
+ # Check to see whether we have an odd or even number of arguments
+ my $template = (scalar(@_) % 2 == 1 ? shift(@_) : undef);
+
+ # Read the options and merge with defaults
+ %options = (%options, @_) if @_;
+
+ # First decision is whether or not to open the file
+ if (! $options{"OPEN"}) {
+
+ warn "tempfile(): temporary filename requested but not opened.\nPossibly unsafe, consider using tempfile() with OPEN set to true\n"
+ if $^W;
+
+ }
+
+ if ($options{"DIR"} and $^O eq 'VMS') {
+
+ # on VMS turn []foo into [.foo] for concatenation
+ $options{"DIR"} = VMS::Filespec::vmspath($options{"DIR"});
+ }
+
+ # Construct the template
+
+ # Have a choice of trying to work around the mkstemp/mktemp/tmpnam etc
+ # functions or simply constructing a template and using _gettemp()
+ # explicitly. Go for the latter
+
+ # First generate a template if not defined and prefix the directory
+ # If no template must prefix the temp directory
+ if (defined $template) {
+ # End up with current directory if neither DIR not TMPDIR are set
+ if ($options{"DIR"}) {
+
+ $template = File::Spec->catfile($options{"DIR"}, $template);
+
+ } elsif ($options{TMPDIR}) {
+
+ $template = File::Spec->catfile(File::Spec->tmpdir, $template );
+
+ }
+
+ } else {
+
+ if ($options{"DIR"}) {
+
+ $template = File::Spec->catfile($options{"DIR"}, TEMPXXX);
+
+ } else {
+
+ $template = File::Spec->catfile(File::Spec->tmpdir, TEMPXXX);
+
+ }
+
+ }
+
+ # Now add a suffix
+ $template .= $options{"SUFFIX"};
+
+ # Determine whether we should tell _gettemp to unlink the file
+ # On unix this is irrelevant and can be worked out after the file is
+ # opened (simply by unlinking the open filehandle). On Windows or VMS
+ # we have to indicate temporary-ness when we open the file. In general
+ # we only want a true temporary file if we are returning just the
+ # filehandle - if the user wants the filename they probably do not
+ # want the file to disappear as soon as they close it (which may be
+ # important if they want a child process to use the file)
+ # For this reason, tie unlink_on_close to the return context regardless
+ # of OS.
+ my $unlink_on_close = ( wantarray ? 0 : 1);
+
+ # Create the file
+ my ($fh, $path, $errstr);
+ croak "Error in tempfile() using $template: $errstr"
+ unless (($fh, $path) = _gettemp($template,
+ "open" => $options{'OPEN'},
+ "mkdir"=> 0 ,
+ "unlink_on_close" => $unlink_on_close,
+ "suffixlen" => length($options{'SUFFIX'}),
+ "ErrStr" => \$errstr,
+ "use_exlock" => $options{EXLOCK},
+ ) );
+
+ # Set up an exit handler that can do whatever is right for the
+ # system. This removes files at exit when requested explicitly or when
+ # system is asked to unlink_on_close but is unable to do so because
+ # of OS limitations.
+ # The latter should be achieved by using a tied filehandle.
+ # Do not check return status since this is all done with END blocks.
+ _deferred_unlink($fh, $path, 0) if $options{"UNLINK"};
+
+ # Return
+ if (wantarray()) {
+
+ if ($options{'OPEN'}) {
+ return ($fh, $path);
+ } else {
+ return (undef, $path);
+ }
+
+ } else {
+
+ # Unlink the file. It is up to unlink0 to decide what to do with
+ # this (whether to unlink now or to defer until later)
+ unlink0($fh, $path) or croak "Error unlinking file $path using unlink0";
+
+ # Return just the filehandle.
+ return $fh;
+ }
+
+
+}
+
+=item B<tempdir>
+
+This is the recommended interface for creation of temporary
+directories. By default the directory will not be removed on exit
+(that is, it won't be temporary; this behaviour can not be changed
+because of issues with backwards compatibility). To enable removal
+either use the CLEANUP option which will trigger removal on program
+exit, or consider using the "newdir" method in the object interface which
+will allow the directory to be cleaned up when the object goes out of
+scope.
+
+The behaviour of the function depends on the arguments:
+
+ $tempdir = tempdir();
+
+Create a directory in tmpdir() (see L<File::Spec|File::Spec>).
+
+ $tempdir = tempdir( $template );
+
+Create a directory from the supplied template. This template is
+similar to that described for tempfile(). `X' characters at the end
+of the template are replaced with random letters to construct the
+directory name. At least four `X' characters must be in the template.
+
+ $tempdir = tempdir ( DIR => $dir );
+
+Specifies the directory to use for the temporary directory.
+The temporary directory name is derived from an internal template.
+
+ $tempdir = tempdir ( $template, DIR => $dir );
+
+Prepend the supplied directory name to the template. The template
+should not include parent directory specifications itself. Any parent
+directory specifications are removed from the template before
+prepending the supplied directory.
+
+ $tempdir = tempdir ( $template, TMPDIR => 1 );
+
+Using the supplied template, create the temporary directory in
+a standard location for temporary files. Equivalent to doing
+
+ $tempdir = tempdir ( $template, DIR => File::Spec->tmpdir);
+
+but shorter. Parent directory specifications are stripped from the
+template itself. The C<TMPDIR> option is ignored if C<DIR> is set
+explicitly. Additionally, C<TMPDIR> is implied if neither a template
+nor a directory are supplied.
+
+ $tempdir = tempdir( $template, CLEANUP => 1);
+
+Create a temporary directory using the supplied template, but
+attempt to remove it (and all files inside it) when the program
+exits. Note that an attempt will be made to remove all files from
+the directory even if they were not created by this module (otherwise
+why ask to clean it up?). The directory removal is made with
+the rmtree() function from the L<File::Path|File::Path> module.
+Of course, if the template is not specified, the temporary directory
+will be created in tmpdir() and will also be removed at program exit.
+
+Will croak() if there is an error.
+
+=cut
+
+# '
+
+sub tempdir {
+
+ # Can not check for argument count since we can have any
+ # number of args
+
+ # Default options
+ my %options = (
+ "CLEANUP" => 0, # Remove directory on exit
+ "DIR" => '', # Root directory
+ "TMPDIR" => 0, # Use tempdir with template
+ );
+
+ # Check to see whether we have an odd or even number of arguments
+ my $template = (scalar(@_) % 2 == 1 ? shift(@_) : undef );
+
+ # Read the options and merge with defaults
+ %options = (%options, @_) if @_;
+
+ # Modify or generate the template
+
+ # Deal with the DIR and TMPDIR options
+ if (defined $template) {
+
+ # Need to strip directory path if using DIR or TMPDIR
+ if ($options{'TMPDIR'} || $options{'DIR'}) {
+
+ # Strip parent directory from the filename
+ #
+ # There is no filename at the end
+ $template = VMS::Filespec::vmspath($template) if $^O eq 'VMS';
+ my ($volume, $directories, undef) = File::Spec->splitpath( $template, 1);
+
+ # Last directory is then our template
+ $template = (File::Spec->splitdir($directories))[-1];
+
+ # Prepend the supplied directory or temp dir
+ if ($options{"DIR"}) {
+
+ $template = File::Spec->catdir($options{"DIR"}, $template);
+
+ } elsif ($options{TMPDIR}) {
+
+ # Prepend tmpdir
+ $template = File::Spec->catdir(File::Spec->tmpdir, $template);
+
+ }
+
+ }
+
+ } else {
+
+ if ($options{"DIR"}) {
+
+ $template = File::Spec->catdir($options{"DIR"}, TEMPXXX);
+
+ } else {
+
+ $template = File::Spec->catdir(File::Spec->tmpdir, TEMPXXX);
+
+ }
+
+ }
+
+ # Create the directory
+ my $tempdir;
+ my $suffixlen = 0;
+ if ($^O eq 'VMS') { # dir names can end in delimiters
+ $template =~ m/([\.\]:>]+)$/;
+ $suffixlen = length($1);
+ }
+ if ( ($^O eq 'MacOS') && (substr($template, -1) eq ':') ) {
+ # dir name has a trailing ':'
+ ++$suffixlen;
+ }
+
+ my $errstr;
+ croak "Error in tempdir() using $template: $errstr"
+ unless ((undef, $tempdir) = _gettemp($template,
+ "open" => 0,
+ "mkdir"=> 1 ,
+ "suffixlen" => $suffixlen,
+ "ErrStr" => \$errstr,
+ ) );
+
+ # Install exit handler; must be dynamic to get lexical
+ if ( $options{'CLEANUP'} && -d $tempdir) {
+ _deferred_unlink(undef, $tempdir, 1);
+ }
+
+ # Return the dir name
+ return $tempdir;
+
+}
+
+=back
+
+=head1 MKTEMP FUNCTIONS
+
+The following functions are Perl implementations of the
+mktemp() family of temp file generation system calls.
+
+=over 4
+
+=item B<mkstemp>
+
+Given a template, returns a filehandle to the temporary file and the name
+of the file.
+
+ ($fh, $name) = mkstemp( $template );
+
+In scalar context, just the filehandle is returned.
+
+The template may be any filename with some number of X's appended
+to it, for example F</tmp/temp.XXXX>. The trailing X's are replaced
+with unique alphanumeric combinations.
+
+Will croak() if there is an error.
+
+=cut
+
+
+
+sub mkstemp {
+
+ croak "Usage: mkstemp(template)"
+ if scalar(@_) != 1;
+
+ my $template = shift;
+
+ my ($fh, $path, $errstr);
+ croak "Error in mkstemp using $template: $errstr"
+ unless (($fh, $path) = _gettemp($template,
+ "open" => 1,
+ "mkdir"=> 0 ,
+ "suffixlen" => 0,
+ "ErrStr" => \$errstr,
+ ) );
+
+ if (wantarray()) {
+ return ($fh, $path);
+ } else {
+ return $fh;
+ }
+
+}
+
+
+=item B<mkstemps>
+
+Similar to mkstemp(), except that an extra argument can be supplied
+with a suffix to be appended to the template.
+
+ ($fh, $name) = mkstemps( $template, $suffix );
+
+For example a template of C<testXXXXXX> and suffix of C<.dat>
+would generate a file similar to F<testhGji_w.dat>.
+
+Returns just the filehandle alone when called in scalar context.
+
+Will croak() if there is an error.
+
+=cut
+
+sub mkstemps {
+
+ croak "Usage: mkstemps(template, suffix)"
+ if scalar(@_) != 2;
+
+
+ my $template = shift;
+ my $suffix = shift;
+
+ $template .= $suffix;
+
+ my ($fh, $path, $errstr);
+ croak "Error in mkstemps using $template: $errstr"
+ unless (($fh, $path) = _gettemp($template,
+ "open" => 1,
+ "mkdir"=> 0 ,
+ "suffixlen" => length($suffix),
+ "ErrStr" => \$errstr,
+ ) );
+
+ if (wantarray()) {
+ return ($fh, $path);
+ } else {
+ return $fh;
+ }
+
+}
+
+=item B<mkdtemp>
+
+Create a directory from a template. The template must end in
+X's that are replaced by the routine.
+
+ $tmpdir_name = mkdtemp($template);
+
+Returns the name of the temporary directory created.
+
+Directory must be removed by the caller.
+
+Will croak() if there is an error.
+
+=cut
+
+#' # for emacs
+
+sub mkdtemp {
+
+ croak "Usage: mkdtemp(template)"
+ if scalar(@_) != 1;
+
+ my $template = shift;
+ my $suffixlen = 0;
+ if ($^O eq 'VMS') { # dir names can end in delimiters
+ $template =~ m/([\.\]:>]+)$/;
+ $suffixlen = length($1);
+ }
+ if ( ($^O eq 'MacOS') && (substr($template, -1) eq ':') ) {
+ # dir name has a trailing ':'
+ ++$suffixlen;
+ }
+ my ($junk, $tmpdir, $errstr);
+ croak "Error creating temp directory from template $template\: $errstr"
+ unless (($junk, $tmpdir) = _gettemp($template,
+ "open" => 0,
+ "mkdir"=> 1 ,
+ "suffixlen" => $suffixlen,
+ "ErrStr" => \$errstr,
+ ) );
+
+ return $tmpdir;
+
+}
+
+=item B<mktemp>
+
+Returns a valid temporary filename but does not guarantee
+that the file will not be opened by someone else.
+
+ $unopened_file = mktemp($template);
+
+Template is the same as that required by mkstemp().
+
+Will croak() if there is an error.
+
+=cut
+
+sub mktemp {
+
+ croak "Usage: mktemp(template)"
+ if scalar(@_) != 1;
+
+ my $template = shift;
+
+ my ($tmpname, $junk, $errstr);
+ croak "Error getting name to temp file from template $template: $errstr"
+ unless (($junk, $tmpname) = _gettemp($template,
+ "open" => 0,
+ "mkdir"=> 0 ,
+ "suffixlen" => 0,
+ "ErrStr" => \$errstr,
+ ) );
+
+ return $tmpname;
+}
+
+=back
+
+=head1 POSIX FUNCTIONS
+
+This section describes the re-implementation of the tmpnam()
+and tmpfile() functions described in L<POSIX>
+using the mkstemp() from this module.
+
+Unlike the L<POSIX|POSIX> implementations, the directory used
+for the temporary file is not specified in a system include
+file (C<P_tmpdir>) but simply depends on the choice of tmpdir()
+returned by L<File::Spec|File::Spec>. On some implementations this
+location can be set using the C<TMPDIR> environment variable, which
+may not be secure.
+If this is a problem, simply use mkstemp() and specify a template.
+
+=over 4
+
+=item B<tmpnam>
+
+When called in scalar context, returns the full name (including path)
+of a temporary file (uses mktemp()). The only check is that the file does
+not already exist, but there is no guarantee that that condition will
+continue to apply.
+
+ $file = tmpnam();
+
+When called in list context, a filehandle to the open file and
+a filename are returned. This is achieved by calling mkstemp()
+after constructing a suitable template.
+
+ ($fh, $file) = tmpnam();
+
+If possible, this form should be used to prevent possible
+race conditions.
+
+See L<File::Spec/tmpdir> for information on the choice of temporary
+directory for a particular operating system.
+
+Will croak() if there is an error.
+
+=cut
+
+sub tmpnam {
+
+ # Retrieve the temporary directory name
+ my $tmpdir = File::Spec->tmpdir;
+
+ croak "Error temporary directory is not writable"
+ if $tmpdir eq '';
+
+ # Use a ten character template and append to tmpdir
+ my $template = File::Spec->catfile($tmpdir, TEMPXXX);
+
+ if (wantarray() ) {
+ return mkstemp($template);
+ } else {
+ return mktemp($template);
+ }
+
+}
+
+=item B<tmpfile>
+
+Returns the filehandle of a temporary file.
+
+ $fh = tmpfile();
+
+The file is removed when the filehandle is closed or when the program
+exits. No access to the filename is provided.
+
+If the temporary file can not be created undef is returned.
+Currently this command will probably not work when the temporary
+directory is on an NFS file system.
+
+Will croak() if there is an error.
+
+=cut
+
+sub tmpfile {
+
+ # Simply call tmpnam() in a list context
+ my ($fh, $file) = tmpnam();
+
+ # Make sure file is removed when filehandle is closed
+ # This will fail on NFS
+ unlink0($fh, $file)
+ or return undef;
+
+ return $fh;
+
+}
+
+=back
+
+=head1 ADDITIONAL FUNCTIONS
+
+These functions are provided for backwards compatibility
+with common tempfile generation C library functions.
+
+They are not exported and must be addressed using the full package
+name.
+
+=over 4
+
+=item B<tempnam>
+
+Return the name of a temporary file in the specified directory
+using a prefix. The file is guaranteed not to exist at the time
+the function was called, but such guarantees are good for one
+clock tick only. Always use the proper form of C<sysopen>
+with C<O_CREAT | O_EXCL> if you must open such a filename.
+
+ $filename = File::Temp::tempnam( $dir, $prefix );
+
+Equivalent to running mktemp() with $dir/$prefixXXXXXXXX
+(using unix file convention as an example)
+
+Because this function uses mktemp(), it can suffer from race conditions.
+
+Will croak() if there is an error.
+
+=cut
+
+sub tempnam {
+
+ croak 'Usage tempnam($dir, $prefix)' unless scalar(@_) == 2;
+
+ my ($dir, $prefix) = @_;
+
+ # Add a string to the prefix
+ $prefix .= 'XXXXXXXX';
+
+ # Concatenate the directory to the file
+ my $template = File::Spec->catfile($dir, $prefix);
+
+ return mktemp($template);
+
+}
+
+=back
+
+=head1 UTILITY FUNCTIONS
+
+Useful functions for dealing with the filehandle and filename.
+
+=over 4
+
+=item B<unlink0>
+
+Given an open filehandle and the associated filename, make a safe
+unlink. This is achieved by first checking that the filename and
+filehandle initially point to the same file and that the number of
+links to the file is 1 (all fields returned by stat() are compared).
+Then the filename is unlinked and the filehandle checked once again to
+verify that the number of links on that file is now 0. This is the
+closest you can come to making sure that the filename unlinked was the
+same as the file whose descriptor you hold.
+
+ unlink0($fh, $path)
+ or die "Error unlinking file $path safely";
+
+Returns false on error but croaks() if there is a security
+anomaly. The filehandle is not closed since on some occasions this is
+not required.
+
+On some platforms, for example Windows NT, it is not possible to
+unlink an open file (the file must be closed first). On those
+platforms, the actual unlinking is deferred until the program ends and
+good status is returned. A check is still performed to make sure that
+the filehandle and filename are pointing to the same thing (but not at
+the time the end block is executed since the deferred removal may not
+have access to the filehandle).
+
+Additionally, on Windows NT not all the fields returned by stat() can
+be compared. For example, the C<dev> and C<rdev> fields seem to be
+different. Also, it seems that the size of the file returned by stat()
+does not always agree, with C<stat(FH)> being more accurate than
+C<stat(filename)>, presumably because of caching issues even when
+using autoflush (this is usually overcome by waiting a while after
+writing to the tempfile before attempting to C<unlink0> it).
+
+Finally, on NFS file systems the link count of the file handle does
+not always go to zero immediately after unlinking. Currently, this
+command is expected to fail on NFS disks.
+
+This function is disabled if the global variable $KEEP_ALL is true
+and an unlink on open file is supported. If the unlink is to be deferred
+to the END block, the file is still registered for removal.
+
+This function should not be called if you are using the object oriented
+interface since the it will interfere with the object destructor deleting
+the file.
+
+=cut
+
+sub unlink0 {
+
+ croak 'Usage: unlink0(filehandle, filename)'
+ unless scalar(@_) == 2;
+
+ # Read args
+ my ($fh, $path) = @_;
+
+ cmpstat($fh, $path) or return 0;
+
+ # attempt remove the file (does not work on some platforms)
+ if (_can_unlink_opened_file()) {
+
+ # return early (Without unlink) if we have been instructed to retain files.
+ return 1 if $KEEP_ALL;
+
+ # XXX: do *not* call this on a directory; possible race
+ # resulting in recursive removal
+ croak "unlink0: $path has become a directory!" if -d $path;
+ unlink($path) or return 0;
+
+ # Stat the filehandle
+ my @fh = stat $fh;
+
+ print "Link count = $fh[3] \n" if $DEBUG;
+
+ # Make sure that the link count is zero
+ # - Cygwin provides deferred unlinking, however,
+ # on Win9x the link count remains 1
+ # On NFS the link count may still be 1 but we cant know that
+ # we are on NFS
+ return ( $fh[3] == 0 or $^O eq 'cygwin' ? 1 : 0);
+
+ } else {
+ _deferred_unlink($fh, $path, 0);
+ return 1;
+ }
+
+}
+
+=item B<cmpstat>
+
+Compare C<stat> of filehandle with C<stat> of provided filename. This
+can be used to check that the filename and filehandle initially point
+to the same file and that the number of links to the file is 1 (all
+fields returned by stat() are compared).
+
+ cmpstat($fh, $path)
+ or die "Error comparing handle with file";
+
+Returns false if the stat information differs or if the link count is
+greater than 1. Calls croak if there is a security anomaly.
+
+On certain platforms, for example Windows, not all the fields returned by stat()
+can be compared. For example, the C<dev> and C<rdev> fields seem to be
+different in Windows. Also, it seems that the size of the file
+returned by stat() does not always agree, with C<stat(FH)> being more
+accurate than C<stat(filename)>, presumably because of caching issues
+even when using autoflush (this is usually overcome by waiting a while
+after writing to the tempfile before attempting to C<unlink0> it).
+
+Not exported by default.
+
+=cut
+
+sub cmpstat {
+
+ croak 'Usage: cmpstat(filehandle, filename)'
+ unless scalar(@_) == 2;
+
+ # Read args
+ my ($fh, $path) = @_;
+
+ warn "Comparing stat\n"
+ if $DEBUG;
+
+ # Stat the filehandle - which may be closed if someone has manually
+ # closed the file. Can not turn off warnings without using $^W
+ # unless we upgrade to 5.006 minimum requirement
+ my @fh;
+ {
+ local ($^W) = 0;
+ @fh = stat $fh;
+ }
+ return unless @fh;
+
+ if ($fh[3] > 1 && $^W) {
+ carp "unlink0: fstat found too many links; SB=@fh" if $^W;
+ }
+
+ # Stat the path
+ my @path = stat $path;
+
+ unless (@path) {
+ carp "unlink0: $path is gone already" if $^W;
+ return;
+ }
+
+ # this is no longer a file, but may be a directory, or worse
+ unless (-f $path) {
+ confess "panic: $path is no longer a file: SB=@fh";
+ }
+
+ # Do comparison of each member of the array
+ # On WinNT dev and rdev seem to be different
+ # depending on whether it is a file or a handle.
+ # Cannot simply compare all members of the stat return
+ # Select the ones we can use
+ my @okstat = (0..$#fh); # Use all by default
+ if ($^O eq 'MSWin32') {
+ @okstat = (1,2,3,4,5,7,8,9,10);
+ } elsif ($^O eq 'os2') {
+ @okstat = (0, 2..$#fh);
+ } elsif ($^O eq 'VMS') { # device and file ID are sufficient
+ @okstat = (0, 1);
+ } elsif ($^O eq 'dos') {
+ @okstat = (0,2..7,11..$#fh);
+ } elsif ($^O eq 'mpeix') {
+ @okstat = (0..4,8..10);
+ }
+
+ # Now compare each entry explicitly by number
+ for (@okstat) {
+ print "Comparing: $_ : $fh[$_] and $path[$_]\n" if $DEBUG;
+ # Use eq rather than == since rdev, blksize, and blocks (6, 11,
+ # and 12) will be '' on platforms that do not support them. This
+ # is fine since we are only comparing integers.
+ unless ($fh[$_] eq $path[$_]) {
+ warn "Did not match $_ element of stat\n" if $DEBUG;
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+=item B<unlink1>
+
+Similar to C<unlink0> except after file comparison using cmpstat, the
+filehandle is closed prior to attempting to unlink the file. This
+allows the file to be removed without using an END block, but does
+mean that the post-unlink comparison of the filehandle state provided
+by C<unlink0> is not available.
+
+ unlink1($fh, $path)
+ or die "Error closing and unlinking file";
+
+Usually called from the object destructor when using the OO interface.
+
+Not exported by default.
+
+This function is disabled if the global variable $KEEP_ALL is true.
+
+Can call croak() if there is a security anomaly during the stat()
+comparison.
+
+=cut
+
+sub unlink1 {
+ croak 'Usage: unlink1(filehandle, filename)'
+ unless scalar(@_) == 2;
+
+ # Read args
+ my ($fh, $path) = @_;
+
+ cmpstat($fh, $path) or return 0;
+
+ # Close the file
+ close( $fh ) or return 0;
+
+ # Make sure the file is writable (for windows)
+ _force_writable( $path );
+
+ # return early (without unlink) if we have been instructed to retain files.
+ return 1 if $KEEP_ALL;
+
+ # remove the file
+ return unlink($path);
+}
+
+=item B<cleanup>
+
+Calling this function will cause any temp files or temp directories
+that are registered for removal to be removed. This happens automatically
+when the process exits but can be triggered manually if the caller is sure
+that none of the temp files are required. This method can be registered as
+an Apache callback.
+
+On OSes where temp files are automatically removed when the temp file
+is closed, calling this function will have no effect other than to remove
+temporary directories (which may include temporary files).
+
+ File::Temp::cleanup();
+
+Not exported by default.
+
+=back
+
+=head1 PACKAGE VARIABLES
+
+These functions control the global state of the package.
+
+=over 4
+
+=item B<safe_level>
+
+Controls the lengths to which the module will go to check the safety of the
+temporary file or directory before proceeding.
+Options are:
+
+=over 8
+
+=item STANDARD
+
+Do the basic security measures to ensure the directory exists and is
+writable, that temporary files are opened only if they do not already
+exist, and that possible race conditions are avoided. Finally the
+L<unlink0|"unlink0"> function is used to remove files safely.
+
+=item MEDIUM
+
+In addition to the STANDARD security, the output directory is checked
+to make sure that it is owned either by root or the user running the
+program. If the directory is writable by group or by other, it is then
+checked to make sure that the sticky bit is set.
+
+Will not work on platforms that do not support the C<-k> test
+for sticky bit.
+
+=item HIGH
+
+In addition to the MEDIUM security checks, also check for the
+possibility of ``chown() giveaway'' using the L<POSIX|POSIX>
+sysconf() function. If this is a possibility, each directory in the
+path is checked in turn for safeness, recursively walking back to the
+root directory.
+
+For platforms that do not support the L<POSIX|POSIX>
+C<_PC_CHOWN_RESTRICTED> symbol (for example, Windows NT) it is
+assumed that ``chown() giveaway'' is possible and the recursive test
+is performed.
+
+=back
+
+The level can be changed as follows:
+
+ File::Temp->safe_level( File::Temp::HIGH );
+
+The level constants are not exported by the module.
+
+Currently, you must be running at least perl v5.6.0 in order to
+run with MEDIUM or HIGH security. This is simply because the
+safety tests use functions from L<Fcntl|Fcntl> that are not
+available in older versions of perl. The problem is that the version
+number for Fcntl is the same in perl 5.6.0 and in 5.005_03 even though
+they are different versions.
+
+On systems that do not support the HIGH or MEDIUM safety levels
+(for example Win NT or OS/2) any attempt to change the level will
+be ignored. The decision to ignore rather than raise an exception
+allows portable programs to be written with high security in mind
+for the systems that can support this without those programs failing
+on systems where the extra tests are irrelevant.
+
+If you really need to see whether the change has been accepted
+simply examine the return value of C<safe_level>.
+
+ $newlevel = File::Temp->safe_level( File::Temp::HIGH );
+ die "Could not change to high security"
+ if $newlevel != File::Temp::HIGH;
+
+=cut
+
+{
+ # protect from using the variable itself
+ my $LEVEL = STANDARD;
+ sub safe_level {
+ my $self = shift;
+ if (@_) {
+ my $level = shift;
+ if (($level != STANDARD) && ($level != MEDIUM) && ($level != HIGH)) {
+ carp "safe_level: Specified level ($level) not STANDARD, MEDIUM or HIGH - ignoring\n" if $^W;
+ } else {
+ # Dont allow this on perl 5.005 or earlier
+ if ($] < 5.006 && $level != STANDARD) {
+ # Cant do MEDIUM or HIGH checks
+ croak "Currently requires perl 5.006 or newer to do the safe checks";
+ }
+ # Check that we are allowed to change level
+ # Silently ignore if we can not.
+ $LEVEL = $level if _can_do_level($level);
+ }
+ }
+ return $LEVEL;
+ }
+}
+
+=item TopSystemUID
+
+This is the highest UID on the current system that refers to a root
+UID. This is used to make sure that the temporary directory is
+owned by a system UID (C<root>, C<bin>, C<sys> etc) rather than
+simply by root.
+
+This is required since on many unix systems C</tmp> is not owned
+by root.
+
+Default is to assume that any UID less than or equal to 10 is a root
+UID.
+
+ File::Temp->top_system_uid(10);
+ my $topid = File::Temp->top_system_uid;
+
+This value can be adjusted to reduce security checking if required.
+The value is only relevant when C<safe_level> is set to MEDIUM or higher.
+
+=cut
+
+{
+ my $TopSystemUID = 10;
+ $TopSystemUID = 197108 if $^O eq 'interix'; # "Administrator"
+ sub top_system_uid {
+ my $self = shift;
+ if (@_) {
+ my $newuid = shift;
+ croak "top_system_uid: UIDs should be numeric"
+ unless $newuid =~ /^\d+$/s;
+ $TopSystemUID = $newuid;
+ }
+ return $TopSystemUID;
+ }
+}
+
+=item B<$KEEP_ALL>
+
+Controls whether temporary files and directories should be retained
+regardless of any instructions in the program to remove them
+automatically. This is useful for debugging but should not be used in
+production code.
+
+ $File::Temp::KEEP_ALL = 1;
+
+Default is for files to be removed as requested by the caller.
+
+In some cases, files will only be retained if this variable is true
+when the file is created. This means that you can not create a temporary
+file, set this variable and expect the temp file to still be around
+when the program exits.
+
+=item B<$DEBUG>
+
+Controls whether debugging messages should be enabled.
+
+ $File::Temp::DEBUG = 1;
+
+Default is for debugging mode to be disabled.
+
+=back
+
+=head1 WARNING
+
+For maximum security, endeavour always to avoid ever looking at,
+touching, or even imputing the existence of the filename. You do not
+know that that filename is connected to the same file as the handle
+you have, and attempts to check this can only trigger more race
+conditions. It's far more secure to use the filehandle alone and
+dispense with the filename altogether.
+
+If you need to pass the handle to something that expects a filename
+then, on a unix system, use C<"/dev/fd/" . fileno($fh)> for arbitrary
+programs, or more generally C<< "+<=&" . fileno($fh) >> for Perl
+programs. You will have to clear the close-on-exec bit on that file
+descriptor before passing it to another process.
+
+ use Fcntl qw/F_SETFD F_GETFD/;
+ fcntl($tmpfh, F_SETFD, 0)
+ or die "Can't clear close-on-exec flag on temp fh: $!\n";
+
+=head2 Temporary files and NFS
+
+Some problems are associated with using temporary files that reside
+on NFS file systems and it is recommended that a local filesystem
+is used whenever possible. Some of the security tests will most probably
+fail when the temp file is not local. Additionally, be aware that
+the performance of I/O operations over NFS will not be as good as for
+a local disk.
+
+=head2 Forking
+
+In some cases files created by File::Temp are removed from within an
+END block. Since END blocks are triggered when a child process exits
+(unless C<POSIX::_exit()> is used by the child) File::Temp takes care
+to only remove those temp files created by a particular process ID. This
+means that a child will not attempt to remove temp files created by the
+parent process.
+
+If you are forking many processes in parallel that are all creating
+temporary files, you may need to reset the random number seed using
+srand(EXPR) in each child else all the children will attempt to walk
+through the same set of random file names and may well cause
+themselves to give up if they exceed the number of retry attempts.
+
+=head2 Directory removal
+
+Note that if you have chdir'ed into the temporary directory and it is
+subsequently cleaned up (either in the END block or as part of object
+destruction), then you will get a warning from File::Path::rmtree().
+
+=head2 BINMODE
+
+The file returned by File::Temp will have been opened in binary mode
+if such a mode is available. If that is not correct, use the C<binmode()>
+function to change the mode of the filehandle.
+
+Note that you can modify the encoding of a file opened by File::Temp
+also by using C<binmode()>.
+
+=head1 HISTORY
+
+Originally began life in May 1999 as an XS interface to the system
+mkstemp() function. In March 2000, the OpenBSD mkstemp() code was
+translated to Perl for total control of the code's
+security checking, to ensure the presence of the function regardless of
+operating system and to help with portability. The module was shipped
+as a standard part of perl from v5.6.1.
+
+=head1 SEE ALSO
+
+L<POSIX/tmpnam>, L<POSIX/tmpfile>, L<File::Spec>, L<File::Path>
+
+See L<IO::File> and L<File::MkTemp>, L<Apache::TempFile> for
+different implementations of temporary file handling.
+
+See L<File::Tempdir> for an alternative object-oriented wrapper for
+the C<tempdir> function.
+
+=head1 AUTHOR
+
+Tim Jenness E<lt>tjenness@cpan.orgE<gt>
+
+Copyright (C) 2007-2009 Tim Jenness.
+Copyright (C) 1999-2007 Tim Jenness and the UK Particle Physics and
+Astronomy Research Council. All Rights Reserved. This program is free
+software; you can redistribute it and/or modify it under the same
+terms as Perl itself.
+
+Original Perl implementation loosely based on the OpenBSD C code for
+mkstemp(). Thanks to Tom Christiansen for suggesting that this module
+should be written and providing ideas for code improvements and
+security enhancements.
+
+=cut
+
+package File::Temp::Dir;
+
+use File::Path qw/ rmtree /;
+use strict;
+use overload '""' => "STRINGIFY", fallback => 1;
+
+# private class specifically to support tempdir objects
+# created by File::Temp->newdir
+
+# ostensibly the same method interface as File::Temp but without
+# inheriting all the IO::Seekable methods and other cruft
+
+# Read-only - returns the name of the temp directory
+
+sub dirname {
+ my $self = shift;
+ return $self->{DIRNAME};
+}
+
+sub STRINGIFY {
+ my $self = shift;
+ return $self->dirname;
+}
+
+sub unlink_on_destroy {
+ my $self = shift;
+ if (@_) {
+ $self->{CLEANUP} = shift;
+ }
+ return $self->{CLEANUP};
+}
+
+sub DESTROY {
+ my $self = shift;
+ local($., $@, $!, $^E, $?);
+ if ($self->unlink_on_destroy &&
+ $$ == $self->{LAUNCHPID} && !$File::Temp::KEEP_ALL) {
+ if (-d $self->{DIRNAME}) {
+ # Some versions of rmtree will abort if you attempt to remove
+ # the directory you are sitting in. We protect that and turn it
+ # into a warning. We do this because this occurs during object
+ # destruction and so can not be caught by the user.
+ eval { rmtree($self->{DIRNAME}, $File::Temp::DEBUG, 0); };
+ warn $@ if ($@ && $^W);
+ }
+ }
+}
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/Which.pm b/Master/tlpkg/tlperl.straw/lib/File/Which.pm
new file mode 100755
index 00000000000..69e336b03bd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/Which.pm
@@ -0,0 +1,254 @@
+package File::Which;
+
+use 5.004;
+use strict;
+use Exporter ();
+use File::Spec ();
+
+use vars qw{$VERSION @ISA @EXPORT @EXPORT_OK};
+BEGIN {
+ $VERSION = '1.09';
+ @ISA = 'Exporter';
+ @EXPORT = 'which';
+ @EXPORT_OK = 'where';
+}
+
+use constant IS_VMS => ($^O eq 'VMS');
+use constant IS_MAC => ($^O eq 'MacOS');
+use constant IS_DOS => ($^O eq 'MSWin32' or $^O eq 'dos' or $^O eq 'os2');
+
+# For Win32 systems, stores the extensions used for
+# executable files
+# For others, the empty string is used
+# because 'perl' . '' eq 'perl' => easier
+my @PATHEXT = ('');
+if ( IS_DOS ) {
+ # WinNT. PATHEXT might be set on Cygwin, but not used.
+ if ( $ENV{PATHEXT} ) {
+ push @PATHEXT, split ';', $ENV{PATHEXT};
+ } else {
+ # Win9X or other: doesn't have PATHEXT, so needs hardcoded.
+ push @PATHEXT, qw{.com .exe .bat};
+ }
+} elsif ( IS_VMS ) {
+ push @PATHEXT, qw{.exe .com};
+}
+
+sub which {
+ my ($exec) = @_;
+
+ return undef unless $exec;
+
+ my $all = wantarray;
+ my @results = ();
+
+ # check for aliases first
+ if ( IS_VMS ) {
+ my $symbol = `SHOW SYMBOL $exec`;
+ chomp($symbol);
+ unless ( $? ) {
+ return $symbol unless $all;
+ push @results, $symbol;
+ }
+ }
+ if ( IS_MAC ) {
+ my @aliases = split /\,/, $ENV{Aliases};
+ foreach my $alias ( @aliases ) {
+ # This has not been tested!!
+ # PPT which says MPW-Perl cannot resolve `Alias $alias`,
+ # let's just hope it's fixed
+ if ( lc($alias) eq lc($exec) ) {
+ chomp(my $file = `Alias $alias`);
+ last unless $file; # if it failed, just go on the normal way
+ return $file unless $all;
+ push @results, $file;
+ # we can stop this loop as if it finds more aliases matching,
+ # it'll just be the same result anyway
+ last;
+ }
+ }
+ }
+
+ my @path = File::Spec->path;
+ if ( IS_DOS or IS_VMS or IS_MAC ) {
+ unshift @path, File::Spec->curdir;
+ }
+
+ foreach my $base ( map { File::Spec->catfile($_, $exec) } @path ) {
+ for my $ext ( @PATHEXT ) {
+ my $file = $base.$ext;
+
+ # We don't want dirs (as they are -x)
+ next if -d $file;
+
+ if (
+ # Executable, normal case
+ -x _
+ or (
+ # MacOS doesn't mark as executable so we check -e
+ IS_MAC
+ ||
+ (
+ IS_DOS
+ and
+ grep {
+ $file =~ /$_\z/i
+ } @PATHEXT[1..$#PATHEXT]
+ )
+ # DOSish systems don't pass -x on
+ # non-exe/bat/com files. so we check -e.
+ # However, we don't want to pass -e on files
+ # that aren't in PATHEXT, like README.
+ and -e _
+ )
+ ) {
+ return $file unless $all;
+ push @results, $file;
+ }
+ }
+ }
+
+ if ( $all ) {
+ return @results;
+ } else {
+ return undef;
+ }
+}
+
+sub where {
+ # force wantarray
+ my @res = which($_[0]);
+ return @res;
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+File::Which - Portable implementation of the `which' utility
+
+=head1 SYNOPSIS
+
+ use File::Which; # exports which()
+ use File::Which qw(which where); # exports which() and where()
+
+ my $exe_path = which('perldoc');
+
+ my @paths = where('perl');
+ - Or -
+ my @paths = which('perl'); # an array forces search for all of them
+
+=head1 DESCRIPTION
+
+C<File::Which> was created to be able to get the paths to executable programs
+on systems under which the `which' program wasn't implemented in the shell.
+
+C<File::Which> searches the directories of the user's C<PATH> (as returned by
+C<File::Spec-E<gt>path()>), looking for executable files having the name
+specified as a parameter to C<which()>. Under Win32 systems, which do not have a
+notion of directly executable files, but uses special extensions such as C<.exe>
+and C<.bat> to identify them, C<File::Which> takes extra steps to assure that
+you will find the correct file (so for example, you might be searching for
+C<perl>, it'll try F<perl.exe>, F<perl.bat>, etc.)
+
+=head1 Steps Used on Win32, DOS, OS2 and VMS
+
+=head2 Windows NT
+
+Windows NT has a special environment variable called C<PATHEXT>, which is used
+by the shell to look for executable files. Usually, it will contain a list in
+the form C<.EXE;.BAT;.COM;.JS;.VBS> etc. If C<File::Which> finds such an
+environment variable, it parses the list and uses it as the different
+extensions.
+
+=head2 Windows 9x and other ancient Win/DOS/OS2
+
+This set of operating systems don't have the C<PATHEXT> variable, and usually
+you will find executable files there with the extensions C<.exe>, C<.bat> and
+(less likely) C<.com>. C<File::Which> uses this hardcoded list if it's running
+under Win32 but does not find a C<PATHEXT> variable.
+
+=head2 VMS
+
+Same case as Windows 9x: uses C<.exe> and C<.com> (in that order).
+
+=head1 Functions
+
+=head2 which($short_exe_name)
+
+Exported by default.
+
+C<$short_exe_name> is the name used in the shell to call the program (for
+example, C<perl>).
+
+If it finds an executable with the name you specified, C<which()> will return
+the absolute path leading to this executable (for example, F</usr/bin/perl> or
+F<C:\Perl\Bin\perl.exe>).
+
+If it does I<not> find the executable, it returns C<undef>.
+
+If C<which()> is called in list context, it will return I<all> the
+matches.
+
+=head2 where($short_exe_name)
+
+Not exported by default.
+
+Same as C<which($short_exe_name)> in array context. Same as the
+C<`where'> utility, will return an array containing all the path names
+matching C<$short_exe_name>.
+
+=head1 BUGS AND CAVEATS
+
+Not tested on VMS or MacOS, although there is platform specific code
+for those. Anyone who haves a second would be very kind to send me a
+report of how it went.
+
+File::Spec adds the current directory to the front of PATH if on
+Win32, VMS or MacOS. I have no knowledge of those so don't know if the
+current directory is searced first or not. Could someone please tell
+me?
+
+=head1 SUPPORT
+
+Bugs should be reported via the CPAN bug tracker at
+
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=File-Which>
+
+For other issues, contact the maintainer.
+
+=head1 AUTHOR
+
+Adam Kennedy E<lt>adamk@cpan.orgE<gt>
+
+Per Einar Ellefsen E<lt>pereinar@cpan.orgE<gt>
+
+Originated in F<modperl-2.0/lib/Apache/Build.pm>. Changed for use in DocSet
+(for the mod_perl site) and Win32-awareness by me, with slight modifications
+by Stas Bekman, then extracted to create C<File::Which>.
+
+Version 0.04 had some significant platform-related changes, taken from
+the Perl Power Tools C<`which'> implementation by Abigail with
+enhancements from Peter Prymmer. See
+L<http://www.perl.com/language/ppt/src/which/index.html> for more
+information.
+
+=head1 COPYRIGHT
+
+Copyright 2002 Per Einar Ellefsen.
+
+Some parts copyright 2009 Adam Kennedy.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<File::Spec>, L<which(1)>, Perl Power Tools:
+L<http://www.perl.com/language/ppt/index.html>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/chmod.pm b/Master/tlpkg/tlperl.straw/lib/File/chmod.pm
new file mode 100755
index 00000000000..ed49239b265
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/chmod.pm
@@ -0,0 +1,647 @@
+package File::chmod;
+
+use Carp;
+use strict;
+use vars qw(
+ $VERSION @ISA @EXPORT @EXPORT_OK $DEBUG
+ $UMASK $MASK $VAL $W $MODE
+);
+
+require Exporter;
+
+@ISA = qw( Exporter );
+@EXPORT = qw( chmod getchmod );
+@EXPORT_OK = qw( symchmod lschmod getsymchmod getlschmod getmod );
+
+$VERSION = '0.32';
+$DEBUG = 1;
+$UMASK = 1;
+$MASK = umask;
+
+my ($SYM,$LS) = (1,2);
+my %ERROR = (
+ EDETMOD => "use of determine_mode is deprecated",
+ ENEXLOC => "cannot set group execute on locked file",
+ ENLOCEX => "cannot set file locking on group executable file",
+ ENSGLOC => "cannot set-gid on locked file",
+ ENLOCSG => "cannot set file locking on set-gid file",
+ ENEXUID => "execute bit must be on for set-uid",
+ ENEXGID => "execute bit must be on for set-gid",
+ ENULSID => "set-id has no effect for 'others'",
+ ENULSBG => "sticky bit has no effect for 'group'",
+ ENULSBO => "sticky bit has no effect for 'others'",
+);
+
+
+sub getmod {
+ my @return = map { (stat)[2] & 07777 } @_;
+ return wantarray ? @return : $return[0];
+}
+
+
+sub chmod {
+ my $mode = shift;
+ my $how = mode($mode);
+
+ return symchmod($mode,@_) if $how == $SYM;
+ return lschmod($mode,@_) if $how == $LS;
+ return CORE::chmod($mode,@_);
+}
+
+
+sub getchmod {
+ my $mode = shift;
+ my $how = mode($mode);
+
+ return getsymchmod($mode,@_) if $how == $SYM;
+ return getlschmod($mode,@_) if $how == $LS;
+ return wantarray ? (($mode) x @_) : $mode;
+}
+
+
+sub symchmod {
+ my $mode = shift;
+ my @return = getsymchmod($mode,@_);
+ my $ret = 0;
+ for (@_){ $ret++ if CORE::chmod(shift(@return),$_) }
+ return $ret;
+}
+
+
+sub getsymchmod {
+ my $mode = shift;
+ my @return;
+
+ croak "symchmod received non-symbolic mode: $mode" if mode($mode) != $SYM;
+
+ for (@_){
+ local $VAL = getmod($_);
+
+ for my $this (split /,/, $mode){
+ local $W = 0;
+ my $or;
+
+ for (split //, $this){
+ if (not defined $or and /[augo]/){
+ /a/ and $W |= 7, next;
+ /u/ and $W |= 1, next;
+ /g/ and $W |= 2, next;
+ /o/ and $W |= 4, next;
+ }
+
+ if (/[-+=]/){
+ $W ||= 7;
+ $or = (/[=+]/ ? 1 : 0);
+ clear() if /=/;
+ next;
+ }
+
+ croak "Bad mode $this" if not defined $or;
+ croak "Unknown mode: $mode" if !/[ugorwxslt]/;
+
+ /u/ and $or ? u_or() : u_not();
+ /g/ and $or ? g_or() : g_not();
+ /o/ and $or ? o_or() : o_not();
+ /r/ and $or ? r_or() : r_not();
+ /w/ and $or ? w_or() : w_not();
+ /x/ and $or ? x_or() : x_not();
+ /s/ and $or ? s_or() : s_not();
+ /l/ and $or ? l_or() : l_not();
+ /t/ and $or ? t_or() : t_not();
+ }
+ }
+ $VAL &= ~$MASK if $UMASK;
+ push @return, $VAL;
+ }
+ return wantarray ? @return : $return[0];
+}
+
+
+sub lschmod {
+ my $mode = shift;
+ return CORE::chmod(getlschmod($mode,@_),@_);
+}
+
+
+sub getlschmod {
+ my $mode = shift;
+ my $VAL = 0;
+
+ croak "lschmod received non-ls mode: $mode" if mode($mode) != $LS;
+
+ my ($u,$g,$o) = ($mode =~ /^.(...)(...)(...)$/);
+
+ for ($u){
+ $VAL |= 0400 if /r/;
+ $VAL |= 0200 if /w/;
+ $VAL |= 0100 if /[xs]/;
+ $VAL |= 04000 if /[sS]/;
+ }
+
+ for ($g){
+ $VAL |= 0040 if /r/;
+ $VAL |= 0020 if /w/;
+ $VAL |= 0010 if /[xs]/;
+ $VAL |= 02000 if /[sS]/;
+ }
+
+ for ($o){
+ $VAL |= 0004 if /r/;
+ $VAL |= 0002 if /w/;
+ $VAL |= 0001 if /[xt]/;
+ $VAL |= 01000 if /[Tt]/;
+ }
+
+ return wantarray ? (($VAL) x @_) : $VAL;
+}
+
+
+sub mode {
+ my $mode = shift;
+ return 0 if $mode !~ /\D/;
+ return $SYM if $mode =~ /[augo=+,]/;
+ return $LS if $mode =~ /^.([r-][w-][xSs-]){2}[r-][w-][xTt-]$/;
+ return $SYM;
+}
+
+
+sub determine_mode {
+ warn $ERROR{EDECMOD};
+ mode(@_);
+}
+
+
+sub clear {
+ $W & 1 and $VAL &= 02077;
+ $W & 2 and $VAL &= 05707;
+ $W & 4 and $VAL &= 07770;
+}
+
+
+sub u_or {
+ my $val = $VAL;
+ $W & 2 and ($VAL |= (($val & 0700)>>3 | ($val & 04000)>>1));
+ $W & 4 and ($VAL |= (($val & 0700)>>6));
+}
+
+
+sub u_not {
+ my $val = $VAL;
+ $W & 1 and $VAL &= ~(($val & 0700) | ($val & 05000));
+ $W & 2 and $VAL &= ~(($val & 0700)>>3 | ($val & 04000)>>1);
+ $W & 4 and $VAL &= ~(($val & 0700)>>6);
+}
+
+
+sub g_or {
+ my $val = $VAL;
+ $W & 1 and $VAL |= (($val & 070)<<3 | ($val & 02000)<<1);
+ $W & 4 and $VAL |= ($val & 070)>>3;
+}
+
+
+sub g_not {
+ my $val = $VAL;
+ $W & 1 and $VAL &= ~(($val & 070)<<3 | ($val & 02000)<<1);
+ $W & 2 and $VAL &= ~(($val & 070) | ($val & 02000));
+ $W & 4 and $VAL &= ~(($val & 070)>>3);
+}
+
+
+sub o_or {
+ my $val = $VAL;
+ $W & 1 and $VAL |= (($val & 07)<<6);
+ $W & 2 and $VAL |= (($val & 07)<<3);
+}
+
+
+sub o_not {
+ my $val = $VAL;
+ $W & 1 and $VAL &= ~(($val & 07)<<6);
+ $W & 2 and $VAL &= ~(($val & 07)<<3);
+ $W & 4 and $VAL &= ~($val & 07);
+}
+
+
+sub r_or {
+ $W & 1 and $VAL |= 0400;
+ $W & 2 and $VAL |= 0040;
+ $W & 4 and $VAL |= 0004;
+}
+
+
+sub r_not {
+ $W & 1 and $VAL &= ~0400;
+ $W & 2 and $VAL &= ~0040;
+ $W & 4 and $VAL &= ~0004;
+}
+
+
+sub w_or {
+ $W & 1 and $VAL |= 0200;
+ $W & 2 and $VAL |= 0020;
+ $W & 4 and $VAL |= 0002;
+}
+
+
+sub w_not {
+ $W & 1 and $VAL &= ~0200;
+ $W & 2 and $VAL &= ~0020;
+ $W & 4 and $VAL &= ~0002;
+}
+
+
+sub x_or {
+ if ($VAL & 02000){ $DEBUG and warn($ERROR{ENEXLOC}), return }
+ $W & 1 and $VAL |= 0100;
+ $W & 2 and $VAL |= 0010;
+ $W & 4 and $VAL |= 0001;
+}
+
+
+sub x_not {
+ $W & 1 and $VAL &= ~0100;
+ $W & 2 and $VAL &= ~0010;
+ $W & 4 and $VAL &= ~0001;
+}
+
+
+sub s_or {
+ if ($VAL & 02000){ $DEBUG and warn($ERROR{ENSGLOC}), return }
+ if (not $VAL & 00100){ $DEBUG and warn($ERROR{ENEXUID}), return }
+ if (not $VAL & 00010){ $DEBUG and warn($ERROR{ENEXGID}), return }
+ $W & 1 and $VAL |= 04000;
+ $W & 2 and $VAL |= 02000;
+ $W & 4 and $DEBUG and warn $ERROR{ENULSID};
+}
+
+
+sub s_not {
+ $W & 1 and $VAL &= ~04000;
+ $W & 2 and $VAL &= ~02000;
+ $W & 4 and $DEBUG and warn $ERROR{ENULSID};
+}
+
+
+sub l_or {
+ if ($VAL & 02010){ $DEBUG and warn($ERROR{ENLOCSG}), return }
+ if ($VAL & 00010){ $DEBUG and warn($ERROR{ENLOCEX}), return }
+ $VAL |= 02000;
+}
+
+
+sub l_not {
+ $VAL &= ~02000 if not $VAL & 00010;
+}
+
+
+sub t_or {
+ $W & 1 and $VAL |= 01000;
+ $W & 2 and $DEBUG and warn $ERROR{ENULSBG};
+ $W & 4 and $DEBUG and warn $ERROR{ENULSBO};
+}
+
+
+sub t_not {
+ $W & 1 and $VAL &= ~01000;
+ $W & 2 and $DEBUG and warn $ERROR{ENULSBG};
+ $W & 4 and $DEBUG and warn $ERROR{ENULSBO};
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+File::chmod - Implements symbolic and ls chmod modes
+
+=head1 VERSION
+
+This is File::chmod v0.32.
+
+=head1 SYNOPSIS
+
+ use File::chmod;
+
+ # chmod takes all three types
+ # these all do the same thing
+ chmod(0666,@files);
+ chmod("=rw",@files);
+ chmod("-rw-rw-rw-",@files);
+
+ # or
+
+ use File::chmod qw( symchmod lschmod );
+
+ chmod(0666,@files); # this is the normal chmod
+ symchmod("=rw",@files); # takes symbolic modes only
+ lschmod("-rw-rw-rw-",@files); # takes "ls" modes only
+
+ # more functions, read on to understand
+
+=head1 DESCRIPTION
+
+File::chmod is a utility that allows you to bypass system calls or bit
+processing of a file's permissions. It overloads the chmod() function
+with its own that gets an octal mode, a symbolic mode (see below), or
+an "ls" mode (see below). If you wish not to overload chmod(), you can
+export symchmod() and lschmod(), which take, respectively, a symbolic
+mode and an "ls" mode.
+
+Symbolic modes are thoroughly described in your chmod(1) man page, but
+here are a few examples.
+
+ # NEW: if $UMASK is true, symchmod() applies a bit-mask found in $MASK
+
+ chmod("+x","file1","file2"); # overloaded chmod(), that is...
+ # turns on the execute bit for all users on those two files
+
+ chmod("o=,g-w","file1","file2");
+ # removes 'other' permissions, and the write bit for 'group'
+
+ chmod("=u","file1","file2");
+ # sets all bits to those in 'user'
+
+"ls" modes are the type produced on the left-hand side of an C<ls -l> on a
+directory. Examples are:
+
+ chmod("-rwxr-xr-x","file1","file2");
+ # the 0755 setting; user has read-write-execute, group and others
+ # have read-execute priveleges
+
+ chmod("-rwsrws---","file1","file2");
+ # sets read-write-execute for user and group, none for others
+ # also sets set-uid and set-gid bits
+
+The regular chmod() and lschmod() are absolute; that is, they are not
+appending to or subtracting from the current file mode. They set it,
+regardless of what it had been before. symchmod() is useful for allowing
+the modifying of a file's permissions without having to run a system call
+or determining the file's permissions, and then combining that with whatever
+bits are appropriate. It also operates separately on each file.
+
+An added feature to version 0.30 is the $UMASK variable, explained below; if
+symchmod() is called and this variable is true, then the function uses the
+(also new) $MASK variable (which defaults to umask()) as a mask against the
+new mode. This is documented below more clearly.
+
+=head2 Functions
+
+Exported by default:
+
+=over 4
+
+=item chmod(MODE,FILES)
+
+Takes an octal, symbolic, or "ls" mode, and then chmods each file
+appropriately.
+
+=item getchmod(MODE,FILES)
+
+Returns a list of modified permissions, without chmodding files.
+Accepts any of the three kinds of modes.
+
+ @newmodes = getchmod("+x","file1","file2");
+ # @newmodes holds the octal permissons of the files'
+ # modes, if they were to be sent through chmod("+x"...)
+
+=back
+
+Exported by request:
+
+=over 4
+
+=item symchmod(MODE,FILES)
+
+Takes a symbolic permissions mode, and chmods each file.
+
+=item lschmod(MODE,FILES)
+
+Takes an "ls" permissions mode, and chmods each file.
+
+=item getsymchmod(MODE,FILES)
+
+Returns a list of modified permissions, without chmodding files.
+Accepts only symbolic permisson modes.
+
+=item getlschmod(MODE,FILES)
+
+Returns a list of modified permissions, without chmodding files.
+Accepts only "ls" permisson modes.
+
+=item getmod(FILES)
+
+Returns a list of the current mode of each file.
+
+=back
+
+=head2 Variables
+
+=over 4
+
+=item $File::chmod::DEBUG
+
+If set to a true value, it will report warnings, similar to those produced
+by chmod() on your system. Otherwise, the functions will not report errors.
+Example: a file can not have file-locking and the set-gid bits on at the
+same time. If $File::chmod::DEBUG is true, the function will report an
+error. If not, you are not warned of the conflict. It is set to 1 as
+default.
+
+=item $File::chmod::MASK
+
+Contains the umask to apply to new file modes when using getsymchmod(). This
+defaults to the return value of umask() at compile time. Is only applied if
+$UMASK is true.
+
+=item $File::chmod::UMASK
+
+This is a boolean which tells getsymchmod() whether or not to apply the umask
+found in $MASK. It defaults to true.
+
+=back
+
+=head1 REVISIONS
+
+I<Note: this section was started with version 0.30.>
+
+This is an in-depth look at the changes being made from version to version.
+
+=head2 0.31 to 0.32
+
+=over 4
+
+=item B<license added>
+
+I added a license to this module so that it can be used places without asking
+my permission. Sorry, Adam.
+
+=back
+
+=head2 0.30 to 0.31
+
+=over 4
+
+=item B<fixed getsymchmod() bug>
+
+Whoa. getsymchmod() was doing some crazy ish. That's about all I can say.
+I did a great deal of debugging, and fixed it up. It ALL had to do with two
+things:
+
+ $or = (/+=/ ? 1 : 0); # should have been /[+=]/
+
+ /u/ && $ok ? u_or() : u_not(); # should have been /u/ and $ok
+
+=item B<fixed getmod() bug>
+
+I was using map() incorrectly in getmod(). Fixed that.
+
+=item B<condensed lschmod()>
+
+I shorted it up, getting rid a variable.
+
+=back
+
+=head2 0.21 to 0.30
+
+=over 4
+
+=item B<added umask() honoring for symchmod()>
+
+The symchmod() function now honors the $UMASK and $MASK variables. $UMASK is
+a boolean which indicates whether or not to honor the $MASK variable. $MASK
+holds a umask, and it defaults to umask(). $UMASK defaults to true. These
+variables are NOT exported. They must explictly set (i.e. $File::chmod::UMASK
+= 0).
+
+=item B<function name changes>
+
+Renamed internal function determine_mode() to mode(). However, if you happen
+to be using determine_mode() somewhere, mode() will be called, but you'll also
+get a warning about deprecation.
+
+Renamed internal functions {or,not}_{l,s,t} to {l,s,t}_{or,not}. This is to
+keep in standard with the OTHER 6 pairs of bitwise functions, such as r_or()
+and g_not(). I don't know WHY the others had 'not' or 'or' in the front.
+
+=item B<fixed debugging bugs>
+
+Certain calls to warn() were not guarded by the $DEBUG variable, and now they
+are. Also, for some reason, I left a debugging check (that didn't check to
+see if $DEBUG was true) in getsymchmod(), line 118. It printed "ENTERING /g/".
+It's gone now.
+
+=item B<fixed set-uid and set-gid bug>
+
+Heh, it seems that in the previous version of File::chmod, the following code
+went along broken:
+
+ # or_s sub, File/chmod.pm, v0.21, line 330
+ ($VAL & 00100) && do {
+ $DEBUG && warn("execute bit must be on for set-uid"); 1;
+ } && next;
+
+Aside from me using '&&' more than enough (changed in the new code), this is
+broken. This is now fixed.
+
+=item B<fixed file lock/set-gid bug>
+
+The not_l() function (now renamed to l_not()) used to take the file mode and
+bit-wise NOT it with ~02000. However, it did not check if the file was locked
+vs. set-gid. Now, the function is C<$VAL &= ~02000 if not $VAL & 00010;>.
+
+=item B<removed useless data structures>
+
+I do not know why I had the $S variable, or %r, %w, and %x hashes. In fact,
+$S was declared in C<use vars qw( ... );>, but never given a value, and the
+%r, %w, and %x hashes had a 'full' key which never got used. And the hashes
+themselves weren't really needed anyway. Here is a list of the variables no
+longer in use, and what they have been replaced with (if any):
+
+ $S nothing
+ $U, $G, $O $W
+ %r, %w, %x octal numbers
+ @files @_ (I had @files = @_; in nearly EVERY sub)
+ $c $_
+
+=item B<compacted code>
+
+The first version of File::chmod that was published was 0.13, and it was
+written in approximately 10 days, being given the off-and-on treatment I end
+up having to give several projects, due to more pressing matters. Well, since
+then, most of the code has stayed the same, although bugs were worked out.
+Well, I got rid of a lot of slow, clunky, and redundant sections of code in
+this version. Sections include the processing of each character of the mode
+in getsymchmod(), the getmod() subroutine, um, nearly ALL of the getsymchmod()
+function, now that I look at it.
+
+Here's part of the getsymchmod() rewrite:
+
+ for ($c){
+ if (/u/){
+ u_or() if $MODE eq "+" or $MODE eq "=";
+ u_not() if $MODE eq "-";
+ }
+ ...
+ }
+
+ # changed to
+
+ /u/ && $or ? u_or() : u_and();
+ # note: operating on $_, $c isn't used anymore
+ # note: $or holds 1 if the $MODE was + or =, 0 if $MODE was -
+ # note: previous was redundant. didn't need $MODE eq "-" check
+ # because u_or() and u_not() both go to the next character
+
+=back
+
+=head1 PORTING
+
+This is only good on Unix-like boxes. I would like people to help me work on
+File::chmod for any OS that deserves it. If you would like to help, please
+email me (address below) with the OS and any information you might have on how
+chmod() should work on it; if you don't have any specific information, but
+would still like to help, hey, that's good too. I have the following
+information (from L</perlport>):
+
+=over 4
+
+=item Win32
+
+Only good for changing "owner" read-write access, "group", and "other" bits
+are meaningless. I<NOTE: Win32::File and Win32::FileSecurity already do
+this. I do not currently see a need to port File::chmod.>
+
+=item MacOS
+
+Only limited meaning. Disabling/enabling write permission is mapped to
+locking/unlocking the file.
+
+=item RISC OS
+
+Only good for changing "owner" and "other" read-write access.
+
+=back
+
+=head1 AUTHOR
+
+Jeff C<japhy> Pinyan, F<japhy.734+CPAN@gmail.com>, CPAN ID: PINYAN
+
+=head1 SEE ALSO
+
+ Stat::lsMode (by Mark-James Dominus, CPAN ID: MJD)
+ chmod(1) manpage
+ perldoc -f chmod
+ perldoc -f stat
+
+=head1 COPYRIGHT AND LICENCE
+
+Copyright (C) 2007 by Jeff Pinyan
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.8.8 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/pushd.pm b/Master/tlpkg/tlperl.straw/lib/File/pushd.pm
new file mode 100755
index 00000000000..0c3666d3d9d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/pushd.pm
@@ -0,0 +1,229 @@
+package File::pushd;
+
+$VERSION = '1.00';
+@EXPORT = qw( pushd tempd );
+@ISA = qw( Exporter );
+
+use 5.004;
+use strict;
+#use warnings;
+use Exporter;
+use Carp;
+use Cwd qw( cwd abs_path );
+use File::Path qw( rmtree );
+use File::Temp qw();
+use File::Spec;
+
+use overload
+ q{""} => sub { File::Spec->canonpath( $_[0]->{_pushd} ) },
+ fallback => 1;
+
+#--------------------------------------------------------------------------#
+# pushd()
+#--------------------------------------------------------------------------#
+
+sub pushd {
+ my ($target_dir) = @_;
+
+ my $orig = cwd;
+
+ my $dest;
+ eval { $dest = $target_dir ? abs_path( $target_dir ) : $orig };
+
+ croak "Can't locate directory $target_dir: $@" if $@;
+
+ if ($dest ne $orig) {
+ chdir $dest or croak "Can't chdir to $dest\: $!";
+ }
+
+ my $self = bless {
+ _pushd => $dest,
+ _original => $orig
+ }, __PACKAGE__;
+
+ return $self;
+}
+
+#--------------------------------------------------------------------------#
+# tempd()
+#--------------------------------------------------------------------------#
+
+sub tempd {
+ my $dir = pushd( File::Temp::tempdir( CLEANUP => 0 ) );
+ $dir->{_tempd} = 1;
+ return $dir;
+}
+
+#--------------------------------------------------------------------------#
+# preserve()
+#--------------------------------------------------------------------------#
+
+sub preserve {
+ my $self = shift;
+ return 1 if ! $self->{"_tempd"};
+ if ( @_ == 0 ) {
+ return $self->{_preserve} = 1;
+ }
+ else {
+ return $self->{_preserve} = $_[0] ? 1 : 0;
+ }
+}
+
+#--------------------------------------------------------------------------#
+# DESTROY()
+# Revert to original directory as object is destroyed and cleanup
+# if necessary
+#--------------------------------------------------------------------------#
+
+sub DESTROY {
+ my ($self) = @_;
+ my $orig = $self->{_original};
+ chdir $orig if $orig; # should always be so, but just in case...
+ if ( $self->{_tempd} &&
+ !$self->{_preserve} ) {
+ eval { rmtree( $self->{_pushd} ) };
+ carp $@ if $@;
+ }
+}
+
+1; #this line is important and will help the module return a true value
+__END__
+
+=begin wikidoc
+
+= NAME
+
+File::pushd - change directory temporarily for a limited scope
+
+= VERSION
+
+This documentation describes version %%VERSION%%.
+
+= SYNOPSIS
+
+ use File::pushd;
+
+ chdir $ENV{HOME};
+
+ # change directory again for a limited scope
+ {
+ my $dir = pushd( '/tmp' );
+ # working directory changed to /tmp
+ }
+ # working directory has reverted to $ENV{HOME}
+
+ # tempd() is equivalent to pushd( File::Temp::tempdir )
+ {
+ my $dir = tempd();
+ }
+
+ # object stringifies naturally as an absolute path
+ {
+ my $dir = pushd( '/tmp' );
+ my $filename = File::Spec->catfile( $dir, "somefile.txt" );
+ # gives /tmp/somefile.txt
+ }
+
+= DESCRIPTION
+
+File::pushd does a temporary {chdir} that is easily and automatically
+reverted, similar to {pushd} in some Unix command shells. It works by
+creating an object that caches the original working directory. When the object
+is destroyed, the destructor calls {chdir} to revert to the original working
+directory. By storing the object in a lexical variable with a limited scope,
+this happens automatically at the end of the scope.
+
+This is very handy when working with temporary directories for tasks like
+testing; a function is provided to streamline getting a temporary
+directory from [File::Temp].
+
+For convenience, the object stringifies as the canonical form of the absolute
+pathname of the directory entered.
+
+= USAGE
+
+ use File::pushd;
+
+Using File::pushd automatically imports the {pushd} and {tempd} functions.
+
+== pushd
+
+ {
+ my $dir = pushd( $target_directory );
+ }
+
+Caches the current working directory, calls {chdir} to change to the target
+directory, and returns a File::pushd object. When the object is
+destroyed, the working directory reverts to the original directory.
+
+The provided target directory can be a relative or absolute path. If
+called with no arguments, it uses the current directory as its target and
+returns to the current directory when the object is destroyed.
+
+== tempd
+
+ {
+ my $dir = tempd();
+ }
+
+This function is like {pushd} but automatically creates and calls {chdir} to
+a temporary directory created by [File::Temp]. Unlike normal [File::Temp]
+cleanup which happens at the end of the program, this temporary directory is
+removed when the object is destroyed. (But also see {preserve}.) A warning
+will be issued if the directory cannot be removed.
+
+== preserve
+
+ {
+ my $dir = tempd();
+ $dir->preserve; # mark to preserve at end of scope
+ $dir->preserve(0); # mark to delete at end of scope
+ }
+
+Controls whether a temporary directory will be cleaned up when the object is
+destroyed. With no arguments, {preserve} sets the directory to be preserved.
+With an argument, the directory will be preserved if the argument is true, or
+marked for cleanup if the argument is false. Only {tempd} objects may be
+marked for cleanup. (Target directories to {pushd} are always preserved.)
+{preserve} returns true if the directory will be preserved, and false
+otherwise.
+
+= SEE ALSO
+
+* [File::chdir]
+
+= BUGS
+
+Please report any bugs or feature using the CPAN Request Tracker.
+Bugs can be submitted through the web interface at
+[http://rt.cpan.org/Dist/Display.html?Queue=File-pushd]
+
+When submitting a bug or request, please include a test-file or a patch to an
+existing test-file that illustrates the bug or desired feature.
+
+= AUTHOR
+
+David A. Golden (DAGOLDEN)
+
+= COPYRIGHT AND LICENSE
+
+Copyright (c) 2005, 2006, 2007 by David A. Golden
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+[http://www.apache.org/licenses/LICENSE-2.0]
+
+Files produced as output though the use of this software, including
+generated copies of boilerplate templates provided with this software,
+shall not be considered Derivative Works, but shall be considered the
+original work of the Licensor.
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+=end wikidoc
+
diff --git a/Master/tlpkg/tlperl.straw/lib/File/pushd.pod b/Master/tlpkg/tlperl.straw/lib/File/pushd.pod
new file mode 100755
index 00000000000..068fa4b1e77
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/pushd.pod
@@ -0,0 +1,145 @@
+# Generated by Pod::WikiDoc version 0.17
+
+=pod
+
+=head1 NAME
+
+File::pushd - change directory temporarily for a limited scope
+
+=head1 VERSION
+
+This documentation describes version 1.00.
+
+=head1 SYNOPSIS
+
+ use File::pushd;
+
+ chdir $ENV{HOME};
+
+ # change directory again for a limited scope
+ {
+ my $dir = pushd( '/tmp' );
+ # working directory changed to /tmp
+ }
+ # working directory has reverted to $ENV{HOME}
+
+ # tempd() is equivalent to pushd( File::Temp::tempdir )
+ {
+ my $dir = tempd();
+ }
+
+ # object stringifies naturally as an absolute path
+ {
+ my $dir = pushd( '/tmp' );
+ my $filename = File::Spec->catfile( $dir, "somefile.txt" );
+ # gives /tmp/somefile.txt
+ }
+
+=head1 DESCRIPTION
+
+File::pushd does a temporary C<<< chdir >>> that is easily and automatically
+reverted, similar to C<<< pushd >>> in some Unix command shells. It works by
+creating an object that caches the original working directory. When the object
+is destroyed, the destructor calls C<<< chdir >>> to revert to the original working
+directory. By storing the object in a lexical variable with a limited scope,
+this happens automatically at the end of the scope.
+
+This is very handy when working with temporary directories for tasks like
+testing; a function is provided to streamline getting a temporary
+directory from L<File::Temp>.
+
+For convenience, the object stringifies as the canonical form of the absolute
+pathname of the directory entered.
+
+=head1 USAGE
+
+ use File::pushd;
+
+Using File::pushd automatically imports the C<<< pushd >>> and C<<< tempd >>> functions.
+
+=head2 pushd
+
+ {
+ my $dir = pushd( $target_directory );
+ }
+
+Caches the current working directory, calls C<<< chdir >>> to change to the target
+directory, and returns a File::pushd object. When the object is
+destroyed, the working directory reverts to the original directory.
+
+The provided target directory can be a relative or absolute path. If
+called with no arguments, it uses the current directory as its target and
+returns to the current directory when the object is destroyed.
+
+=head2 tempd
+
+ {
+ my $dir = tempd();
+ }
+
+This function is like C<<< pushd >>> but automatically creates and calls C<<< chdir >>> to
+a temporary directory created by L<File::Temp>. Unlike normal L<File::Temp>
+cleanup which happens at the end of the program, this temporary directory is
+removed when the object is destroyed. (But also see C<<< preserve >>>.) A warning
+will be issued if the directory cannot be removed.
+
+=head2 preserve
+
+ {
+ my $dir = tempd();
+ $dir->preserve; # mark to preserve at end of scope
+ $dir->preserve(0); # mark to delete at end of scope
+ }
+
+Controls whether a temporary directory will be cleaned up when the object is
+destroyed. With no arguments, C<<< preserve >>> sets the directory to be preserved.
+With an argument, the directory will be preserved if the argument is true, or
+marked for cleanup if the argument is false. Only C<<< tempd >>> objects may be
+marked for cleanup. (Target directories to C<<< pushd >>> are always preserved.)
+C<<< preserve >>> returns true if the directory will be preserved, and false
+otherwise.
+
+=head1 SEE ALSO
+
+=over
+
+=item *
+
+L<File::chdir>
+
+=back
+
+=head1 BUGS
+
+Please report any bugs or feature using the CPAN Request Tracker.
+Bugs can be submitted through the web interface at
+L<http://rt.cpan.org/Dist/Display.html?Queue=File-pushd>
+
+When submitting a bug or request, please include a test-file or a patch to an
+existing test-file that illustrates the bug or desired feature.
+
+=head1 AUTHOR
+
+David A. Golden (DAGOLDEN)
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005, 2006, 2007 by David A. Golden
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+L<http://www.apache.org/licenses/LICENSE-2.0>
+
+Files produced as output though the use of this software, including
+generated copies of boilerplate templates provided with this software,
+shall not be considered Derivative Works, but shall be considered the
+original work of the Licensor.
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/File/stat.pm b/Master/tlpkg/tlperl.straw/lib/File/stat.pm
new file mode 100755
index 00000000000..d84500c1ace
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/stat.pm
@@ -0,0 +1,139 @@
+package File::stat;
+use 5.006;
+
+use strict;
+use warnings;
+
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+our $VERSION = '1.01';
+
+BEGIN {
+ use Exporter ();
+ @EXPORT = qw(stat lstat);
+ @EXPORT_OK = qw( $st_dev $st_ino $st_mode
+ $st_nlink $st_uid $st_gid
+ $st_rdev $st_size
+ $st_atime $st_mtime $st_ctime
+ $st_blksize $st_blocks
+ );
+ %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars @EXPORT_OK;
+
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
+struct 'File::stat' => [
+ map { $_ => '$' } qw{
+ dev ino mode nlink uid gid rdev size
+ atime mtime ctime blksize blocks
+ }
+];
+
+sub populate (@) {
+ return unless @_;
+ my $stob = new();
+ @$stob = (
+ $st_dev, $st_ino, $st_mode, $st_nlink, $st_uid, $st_gid, $st_rdev,
+ $st_size, $st_atime, $st_mtime, $st_ctime, $st_blksize, $st_blocks )
+ = @_;
+ return $stob;
+}
+
+sub lstat ($) { populate(CORE::lstat(shift)) }
+
+sub stat ($) {
+ my $arg = shift;
+ my $st = populate(CORE::stat $arg);
+ return $st if $st;
+ my $fh;
+ {
+ local $!;
+ no strict 'refs';
+ require Symbol;
+ $fh = \*{ Symbol::qualify( $arg, caller() )};
+ return unless defined fileno $fh;
+ }
+ return populate(CORE::stat $fh);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+File::stat - by-name interface to Perl's built-in stat() functions
+
+=head1 SYNOPSIS
+
+ use File::stat;
+ $st = stat($file) or die "No $file: $!";
+ if ( ($st->mode & 0111) && $st->nlink > 1) ) {
+ print "$file is executable with lotsa links\n";
+ }
+
+ use File::stat qw(:FIELDS);
+ stat($file) or die "No $file: $!";
+ if ( ($st_mode & 0111) && ($st_nlink > 1) ) {
+ print "$file is executable with lotsa links\n";
+ }
+
+=head1 DESCRIPTION
+
+This module's default exports override the core stat()
+and lstat() functions, replacing them with versions that return
+"File::stat" objects. This object has methods that
+return the similarly named structure field name from the
+stat(2) function; namely,
+dev,
+ino,
+mode,
+nlink,
+uid,
+gid,
+rdev,
+size,
+atime,
+mtime,
+ctime,
+blksize,
+and
+blocks.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag. (Note that this still
+overrides your stat() and lstat() functions.) Access these fields as
+variables named with a preceding C<st_> in front their method names.
+Thus, C<$stat_obj-E<gt>dev()> corresponds to $st_dev if you import
+the fields.
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 BUGS
+
+As of Perl 5.8.0 after using this module you cannot use the implicit
+C<$_> or the special filehandle C<_> with stat() or lstat(), trying
+to do so leads into strange errors. The workaround is for C<$_> to
+be explicit
+
+ my $stat_obj = stat $_;
+
+and for C<_> to explicitly populate the object using the unexported
+and undocumented populate() function with CORE::stat():
+
+ my $stat_obj = File::stat::populate(CORE::stat(_));
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/Master/tlpkg/tlperl.straw/lib/FileCache.pm b/Master/tlpkg/tlperl.straw/lib/FileCache.pm
new file mode 100755
index 00000000000..09583b04afa
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/FileCache.pm
@@ -0,0 +1,188 @@
+package FileCache;
+
+our $VERSION = '1.08';
+
+=head1 NAME
+
+FileCache - keep more files open than the system permits
+
+=head1 SYNOPSIS
+
+ no strict 'refs';
+
+ use FileCache;
+ # or
+ use FileCache maxopen => 16;
+
+ cacheout $mode, $path;
+ # or
+ cacheout $path;
+ print $path @data;
+
+ $fh = cacheout $mode, $path;
+ # or
+ $fh = cacheout $path;
+ print $fh @data;
+
+=head1 DESCRIPTION
+
+The C<cacheout> function will make sure that there's a filehandle open
+for reading or writing available as the pathname you give it. It
+automatically closes and re-opens files if you exceed your system's
+maximum number of file descriptors, or the suggested maximum I<maxopen>.
+
+=over
+
+=item cacheout EXPR
+
+The 1-argument form of cacheout will open a file for writing (C<< '>' >>)
+on it's first use, and appending (C<<< '>>' >>>) thereafter.
+
+Returns EXPR on success for convenience. You may neglect the
+return value and manipulate EXPR as the filehandle directly if you prefer.
+
+=item cacheout MODE, EXPR
+
+The 2-argument form of cacheout will use the supplied mode for the initial
+and subsequent openings. Most valid modes for 3-argument C<open> are supported
+namely; C<< '>' >>, C<< '+>' >>, C<< '<' >>, C<< '<+' >>, C<<< '>>' >>>,
+C< '|-' > and C< '-|' >
+
+To pass supplemental arguments to a program opened with C< '|-' > or C< '-|' >
+append them to the command string as you would system EXPR.
+
+Returns EXPR on success for convenience. You may neglect the
+return value and manipulate EXPR as the filehandle directly if you prefer.
+
+=back
+
+=head1 CAVEATS
+
+While it is permissible to C<close> a FileCache managed file,
+do not do so if you are calling C<FileCache::cacheout> from a package other
+than which it was imported, or with another module which overrides C<close>.
+If you must, use C<FileCache::cacheout_close>.
+
+Although FileCache can be used with piped opens ('-|' or '|-') doing so is
+strongly discouraged. If FileCache finds it necessary to close and then reopen
+a pipe, the command at the far end of the pipe will be reexecuted - the results
+of performing IO on FileCache'd pipes is unlikely to be what you expect. The
+ability to use FileCache on pipes may be removed in a future release.
+
+FileCache does not store the current file offset if it finds it necessary to
+close a file. When the file is reopened, the offset will be as specified by the
+original C<open> file mode. This could be construed to be a bug.
+
+The module functionality relies on symbolic references, so things will break
+under 'use strict' unless 'no strict "refs"' is also specified.
+
+=head1 BUGS
+
+F<sys/param.h> lies with its C<NOFILE> define on some systems,
+so you may have to set I<maxopen> yourself.
+
+=cut
+
+require 5.006;
+use Carp;
+use strict;
+no strict 'refs';
+
+# These are not C<my> for legacy reasons.
+# Previous versions requested the user set $cacheout_maxopen by hand.
+# Some authors fiddled with %saw to overcome the clobber on initial open.
+use vars qw(%saw $cacheout_maxopen);
+$cacheout_maxopen = 16;
+
+use base 'Exporter';
+our @EXPORT = qw[cacheout cacheout_close];
+
+
+my %isopen;
+my $cacheout_seq = 0;
+
+sub import {
+ my ($pkg,%args) = @_;
+
+ # Use Exporter. %args are for us, not Exporter.
+ # Make sure to up export_to_level, or we will import into ourselves,
+ # rather than our calling package;
+
+ __PACKAGE__->export_to_level(1);
+ Exporter::import( $pkg );
+
+ # Truth is okay here because setting maxopen to 0 would be bad
+ return $cacheout_maxopen = $args{maxopen} if $args{maxopen};
+
+ # XXX This code is crazy. Why is it a one element foreach loop?
+ # Why is it using $param both as a filename and filehandle?
+ foreach my $param ( '/usr/include/sys/param.h' ){
+ if (open($param, '<', $param)) {
+ local ($_, $.);
+ while (<$param>) {
+ if( /^\s*#\s*define\s+NOFILE\s+(\d+)/ ){
+ $cacheout_maxopen = $1 - 4;
+ close($param);
+ last;
+ }
+ }
+ close $param;
+ }
+ }
+ $cacheout_maxopen ||= 16;
+}
+
+# Open in their package.
+sub cacheout_open {
+ return open(*{caller(1) . '::' . $_[1]}, $_[0], $_[1]) && $_[1];
+}
+
+# Close in their package.
+sub cacheout_close {
+ # Short-circuit in case the filehandle disappeared
+ my $pkg = caller($_[1]||0);
+ defined fileno(*{$pkg . '::' . $_[0]}) &&
+ CORE::close(*{$pkg . '::' . $_[0]});
+ delete $isopen{$_[0]};
+}
+
+# But only this sub name is visible to them.
+sub cacheout {
+ my($mode, $file, $class, $ret, $ref, $narg);
+ croak "Not enough arguments for cacheout" unless $narg = scalar @_;
+ croak "Too many arguments for cacheout" if $narg > 2;
+
+ ($mode, $file) = @_;
+ ($file, $mode) = ($mode, $file) if $narg == 1;
+ croak "Invalid mode for cacheout" if $mode &&
+ ( $mode !~ /^\s*(?:>>|\+?>|\+?<|\|\-|)|\-\|\s*$/ );
+
+ # Mode changed?
+ if( $isopen{$file} && ($mode||'>') ne $isopen{$file}->[1] ){
+ &cacheout_close($file, 1);
+ }
+
+ if( $isopen{$file}) {
+ $ret = $file;
+ $isopen{$file}->[0]++;
+ }
+ else{
+ if( scalar keys(%isopen) > $cacheout_maxopen -1 ) {
+ my @lru = sort{ $isopen{$a}->[0] <=> $isopen{$b}->[0] } keys(%isopen);
+ $cacheout_seq = 0;
+ $isopen{$_}->[0] = $cacheout_seq++ for
+ splice(@lru, int($cacheout_maxopen / 3)||$cacheout_maxopen);
+ &cacheout_close($_, 1) for @lru;
+ }
+
+ unless( $ref ){
+ $mode ||= $saw{$file} ? '>>' : ($saw{$file}=1, '>');
+ }
+ #XXX should we just return the value from cacheout_open, no croak?
+ $ret = cacheout_open($mode, $file) or croak("Can't create $file: $!");
+
+ $isopen{$file} = [++$cacheout_seq, $mode];
+ }
+ return $ret;
+}
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/FileHandle.pm b/Master/tlpkg/tlperl.straw/lib/FileHandle.pm
new file mode 100755
index 00000000000..6b3636a089d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/FileHandle.pm
@@ -0,0 +1,262 @@
+package FileHandle;
+
+use 5.006;
+use strict;
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK);
+
+$VERSION = "2.02";
+
+require IO::File;
+@ISA = qw(IO::File);
+
+@EXPORT = qw(_IOFBF _IOLBF _IONBF);
+
+@EXPORT_OK = qw(
+ pipe
+
+ autoflush
+ output_field_separator
+ output_record_separator
+ input_record_separator
+ input_line_number
+ format_page_number
+ format_lines_per_page
+ format_lines_left
+ format_name
+ format_top_name
+ format_line_break_characters
+ format_formfeed
+
+ print
+ printf
+ getline
+ getlines
+);
+
+#
+# Everything we're willing to export, we must first import.
+#
+import IO::Handle grep { !defined(&$_) } @EXPORT, @EXPORT_OK;
+
+#
+# Some people call "FileHandle::function", so all the functions
+# that were in the old FileHandle class must be imported, too.
+#
+{
+ no strict 'refs';
+
+ my %import = (
+ 'IO::Handle' =>
+ [qw(DESTROY new_from_fd fdopen close fileno getc ungetc gets
+ eof flush error clearerr setbuf setvbuf _open_mode_string)],
+ 'IO::Seekable' =>
+ [qw(seek tell getpos setpos)],
+ 'IO::File' =>
+ [qw(new new_tmpfile open)]
+ );
+ for my $pkg (keys %import) {
+ for my $func (@{$import{$pkg}}) {
+ my $c = *{"${pkg}::$func"}{CODE}
+ or die "${pkg}::$func missing";
+ *$func = $c;
+ }
+ }
+}
+
+#
+# Specialized importer for Fcntl magic.
+#
+sub import {
+ my $pkg = shift;
+ my $callpkg = caller;
+ require Exporter;
+ Exporter::export($pkg, $callpkg, @_);
+
+ #
+ # If the Fcntl extension is available,
+ # export its constants.
+ #
+ eval {
+ require Fcntl;
+ Exporter::export('Fcntl', $callpkg);
+ };
+}
+
+################################################
+# This is the only exported function we define;
+# the rest come from other classes.
+#
+
+sub pipe {
+ my $r = new IO::Handle;
+ my $w = new IO::Handle;
+ CORE::pipe($r, $w) or return undef;
+ ($r, $w);
+}
+
+# Rebless standard file handles
+bless *STDIN{IO}, "FileHandle" if ref *STDIN{IO} eq "IO::Handle";
+bless *STDOUT{IO}, "FileHandle" if ref *STDOUT{IO} eq "IO::Handle";
+bless *STDERR{IO}, "FileHandle" if ref *STDERR{IO} eq "IO::Handle";
+
+1;
+
+__END__
+
+=head1 NAME
+
+FileHandle - supply object methods for filehandles
+
+=head1 SYNOPSIS
+
+ use FileHandle;
+
+ $fh = FileHandle->new;
+ if ($fh->open("< file")) {
+ print <$fh>;
+ $fh->close;
+ }
+
+ $fh = FileHandle->new("> FOO");
+ if (defined $fh) {
+ print $fh "bar\n";
+ $fh->close;
+ }
+
+ $fh = FileHandle->new("file", "r");
+ if (defined $fh) {
+ print <$fh>;
+ undef $fh; # automatically closes the file
+ }
+
+ $fh = FileHandle->new("file", O_WRONLY|O_APPEND);
+ if (defined $fh) {
+ print $fh "corge\n";
+ undef $fh; # automatically closes the file
+ }
+
+ $pos = $fh->getpos;
+ $fh->setpos($pos);
+
+ $fh->setvbuf($buffer_var, _IOLBF, 1024);
+
+ ($readfh, $writefh) = FileHandle::pipe;
+
+ autoflush STDOUT 1;
+
+=head1 DESCRIPTION
+
+NOTE: This class is now a front-end to the IO::* classes.
+
+C<FileHandle::new> creates a C<FileHandle>, which is a reference to a
+newly created symbol (see the C<Symbol> package). If it receives any
+parameters, they are passed to C<FileHandle::open>; if the open fails,
+the C<FileHandle> object is destroyed. Otherwise, it is returned to
+the caller.
+
+C<FileHandle::new_from_fd> creates a C<FileHandle> like C<new> does.
+It requires two parameters, which are passed to C<FileHandle::fdopen>;
+if the fdopen fails, the C<FileHandle> object is destroyed.
+Otherwise, it is returned to the caller.
+
+C<FileHandle::open> accepts one parameter or two. With one parameter,
+it is just a front end for the built-in C<open> function. With two
+parameters, the first parameter is a filename that may include
+whitespace or other special characters, and the second parameter is
+the open mode, optionally followed by a file permission value.
+
+If C<FileHandle::open> receives a Perl mode string (">", "+<", etc.)
+or a POSIX fopen() mode string ("w", "r+", etc.), it uses the basic
+Perl C<open> operator.
+
+If C<FileHandle::open> is given a numeric mode, it passes that mode
+and the optional permissions value to the Perl C<sysopen> operator.
+For convenience, C<FileHandle::import> tries to import the O_XXX
+constants from the Fcntl module. If dynamic loading is not available,
+this may fail, but the rest of FileHandle will still work.
+
+C<FileHandle::fdopen> is like C<open> except that its first parameter
+is not a filename but rather a file handle name, a FileHandle object,
+or a file descriptor number.
+
+If the C functions fgetpos() and fsetpos() are available, then
+C<FileHandle::getpos> returns an opaque value that represents the
+current position of the FileHandle, and C<FileHandle::setpos> uses
+that value to return to a previously visited position.
+
+If the C function setvbuf() is available, then C<FileHandle::setvbuf>
+sets the buffering policy for the FileHandle. The calling sequence
+for the Perl function is the same as its C counterpart, including the
+macros C<_IOFBF>, C<_IOLBF>, and C<_IONBF>, except that the buffer
+parameter specifies a scalar variable to use as a buffer. WARNING: A
+variable used as a buffer by C<FileHandle::setvbuf> must not be
+modified in any way until the FileHandle is closed or until
+C<FileHandle::setvbuf> is called again, or memory corruption may
+result!
+
+See L<perlfunc> for complete descriptions of each of the following
+supported C<FileHandle> methods, which are just front ends for the
+corresponding built-in functions:
+
+ close
+ fileno
+ getc
+ gets
+ eof
+ clearerr
+ seek
+ tell
+
+See L<perlvar> for complete descriptions of each of the following
+supported C<FileHandle> methods:
+
+ autoflush
+ output_field_separator
+ output_record_separator
+ input_record_separator
+ input_line_number
+ format_page_number
+ format_lines_per_page
+ format_lines_left
+ format_name
+ format_top_name
+ format_line_break_characters
+ format_formfeed
+
+Furthermore, for doing normal I/O you might need these:
+
+=over 4
+
+=item $fh->print
+
+See L<perlfunc/print>.
+
+=item $fh->printf
+
+See L<perlfunc/printf>.
+
+=item $fh->getline
+
+This works like <$fh> described in L<perlop/"I/O Operators">
+except that it's more readable and can be safely called in a
+list context but still returns just one line.
+
+=item $fh->getlines
+
+This works like <$fh> when called in a list context to
+read all the remaining lines in a file, except that it's more readable.
+It will also croak() if accidentally called in a scalar context.
+
+=back
+
+There are many other functions available since FileHandle is descended
+from IO::File, IO::Seekable, and IO::Handle. Please see those
+respective pages for documentation on more functions.
+
+=head1 SEE ALSO
+
+The B<IO> extension,
+L<perlfunc>,
+L<perlop/"I/O Operators">.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/FindBin.pm b/Master/tlpkg/tlperl.straw/lib/FindBin.pm
new file mode 100755
index 00000000000..892d6e5d93a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/FindBin.pm
@@ -0,0 +1,209 @@
+# FindBin.pm
+#
+# Copyright (c) 1995 Graham Barr & Nick Ing-Simmons. All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+=head1 NAME
+
+FindBin - Locate directory of original perl script
+
+=head1 SYNOPSIS
+
+ use FindBin;
+ use lib "$FindBin::Bin/../lib";
+
+ or
+
+ use FindBin qw($Bin);
+ use lib "$Bin/../lib";
+
+=head1 DESCRIPTION
+
+Locates the full path to the script bin directory to allow the use
+of paths relative to the bin directory.
+
+This allows a user to setup a directory tree for some software with
+directories C<< <root>/bin >> and C<< <root>/lib >>, and then the above
+example will allow the use of modules in the lib directory without knowing
+where the software tree is installed.
+
+If perl is invoked using the B<-e> option or the perl script is read from
+C<STDIN> then FindBin sets both C<$Bin> and C<$RealBin> to the current
+directory.
+
+=head1 EXPORTABLE VARIABLES
+
+ $Bin - path to bin directory from where script was invoked
+ $Script - basename of script from which perl was invoked
+ $RealBin - $Bin with all links resolved
+ $RealScript - $Script with all links resolved
+
+=head1 KNOWN ISSUES
+
+If there are two modules using C<FindBin> from different directories
+under the same interpreter, this won't work. Since C<FindBin> uses a
+C<BEGIN> block, it'll be executed only once, and only the first caller
+will get it right. This is a problem under mod_perl and other persistent
+Perl environments, where you shouldn't use this module. Which also means
+that you should avoid using C<FindBin> in modules that you plan to put
+on CPAN. To make sure that C<FindBin> will work is to call the C<again>
+function:
+
+ use FindBin;
+ FindBin::again(); # or FindBin->again;
+
+In former versions of FindBin there was no C<again> function. The
+workaround was to force the C<BEGIN> block to be executed again:
+
+ delete $INC{'FindBin.pm'};
+ require FindBin;
+
+=head1 KNOWN BUGS
+
+If perl is invoked as
+
+ perl filename
+
+and I<filename> does not have executable rights and a program called
+I<filename> exists in the users C<$ENV{PATH}> which satisfies both B<-x>
+and B<-T> then FindBin assumes that it was invoked via the
+C<$ENV{PATH}>.
+
+Workaround is to invoke perl as
+
+ perl ./filename
+
+=head1 AUTHORS
+
+FindBin is supported as part of the core perl distribution. Please send bug
+reports to E<lt>F<perlbug@perl.org>E<gt> using the perlbug program
+included with perl.
+
+Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+Nick Ing-Simmons E<lt>F<nik@tiuk.ti.com>E<gt>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995 Graham Barr & Nick Ing-Simmons. All rights reserved.
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+package FindBin;
+use Carp;
+require 5.000;
+require Exporter;
+use Cwd qw(getcwd cwd abs_path);
+use File::Basename;
+use File::Spec;
+
+@EXPORT_OK = qw($Bin $Script $RealBin $RealScript $Dir $RealDir);
+%EXPORT_TAGS = (ALL => [qw($Bin $Script $RealBin $RealScript $Dir $RealDir)]);
+@ISA = qw(Exporter);
+
+$VERSION = "1.50";
+
+
+# needed for VMS-specific filename translation
+if( $^O eq 'VMS' ) {
+ require VMS::Filespec;
+ VMS::Filespec->import;
+}
+
+sub cwd2 {
+ my $cwd = getcwd();
+ # getcwd might fail if it hasn't access to the current directory.
+ # try harder.
+ defined $cwd or $cwd = cwd();
+ $cwd;
+}
+
+sub init
+{
+ *Dir = \$Bin;
+ *RealDir = \$RealBin;
+
+ if($0 eq '-e' || $0 eq '-')
+ {
+ # perl invoked with -e or script is on C<STDIN>
+ $Script = $RealScript = $0;
+ $Bin = $RealBin = cwd2();
+ $Bin = VMS::Filespec::unixify($Bin) if $^O eq 'VMS';
+ }
+ else
+ {
+ my $script = $0;
+
+ if ($^O eq 'VMS')
+ {
+ ($Bin,$Script) = VMS::Filespec::rmsexpand($0) =~ /(.*[\]>\/]+)(.*)/s;
+ # C<use disk:[dev]/lib> isn't going to work, so unixify first
+ ($Bin = VMS::Filespec::unixify($Bin)) =~ s/\/\z//;
+ ($RealBin,$RealScript) = ($Bin,$Script);
+ }
+ else
+ {
+ my $dosish = ($^O eq 'MSWin32' or $^O eq 'os2');
+ unless(($script =~ m#/# || ($dosish && $script =~ m#\\#))
+ && -f $script)
+ {
+ my $dir;
+ foreach $dir (File::Spec->path)
+ {
+ my $scr = File::Spec->catfile($dir, $script);
+
+ # $script can been found via PATH but perl could have
+ # been invoked as 'perl file'. Do a dumb check to see
+ # if $script is a perl program, if not then keep $script = $0
+ #
+ # well we actually only check that it is an ASCII file
+ # we know its executable so it is probably a script
+ # of some sort.
+ if(-f $scr && -r _ && ($dosish || -x _) && -s _ && -T _)
+ {
+ $script = $scr;
+ last;
+ }
+ }
+ }
+
+ croak("Cannot find current script '$0'") unless(-f $script);
+
+ # Ensure $script contains the complete path in case we C<chdir>
+
+ $script = File::Spec->catfile(cwd2(), $script)
+ unless File::Spec->file_name_is_absolute($script);
+
+ ($Script,$Bin) = fileparse($script);
+
+ # Resolve $script if it is a link
+ while(1)
+ {
+ my $linktext = readlink($script);
+
+ ($RealScript,$RealBin) = fileparse($script);
+ last unless defined $linktext;
+
+ $script = (File::Spec->file_name_is_absolute($linktext))
+ ? $linktext
+ : File::Spec->catfile($RealBin, $linktext);
+ }
+
+ # Get absolute paths to directories
+ if ($Bin) {
+ my $BinOld = $Bin;
+ $Bin = abs_path($Bin);
+ defined $Bin or $Bin = File::Spec->canonpath($BinOld);
+ }
+ $RealBin = abs_path($RealBin) if($RealBin);
+ }
+ }
+}
+
+BEGIN { init }
+
+*again = \&init;
+
+1; # Keep require happy
diff --git a/Master/tlpkg/tlperl.straw/lib/GD.pm b/Master/tlpkg/tlperl.straw/lib/GD.pm
new file mode 100755
index 00000000000..7d5f4206736
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/GD.pm
@@ -0,0 +1,1784 @@
+package GD;
+
+# Copyright 1995 Lincoln D. Stein. See accompanying README file for
+# usage information
+
+use strict;
+require 5.004;
+require FileHandle;
+require Exporter;
+require DynaLoader;
+require AutoLoader;
+use Carp 'croak','carp';
+
+use GD::Image;
+use GD::Polygon;
+
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD);
+
+$VERSION = '2.44';
+
+@ISA = qw(Exporter DynaLoader);
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+@EXPORT = qw(
+ gdBrushed
+ gdDashSize
+ gdMaxColors
+ gdStyled
+ gdStyledBrushed
+ gdTiled
+ gdTransparent
+ gdAntiAliased
+ gdArc
+ gdChord
+ gdPie
+ gdNoFill
+ gdEdged
+ gdTinyFont
+ gdSmallFont
+ gdMediumBoldFont
+ gdLargeFont
+ gdGiantFont
+ gdAlphaMax
+ gdAlphaOpaque
+ gdAlphaTransparent
+);
+
+@EXPORT_OK = qw (
+ GD_CMP_IMAGE
+ GD_CMP_NUM_COLORS
+ GD_CMP_COLOR
+ GD_CMP_SIZE_X
+ GD_CMP_SIZE_Y
+ GD_CMP_TRANSPARENT
+ GD_CMP_BACKGROUND
+ GD_CMP_INTERLACE
+ GD_CMP_TRUECOLOR
+);
+
+%EXPORT_TAGS = ('cmp' => [qw(GD_CMP_IMAGE
+ GD_CMP_NUM_COLORS
+ GD_CMP_COLOR
+ GD_CMP_SIZE_X
+ GD_CMP_SIZE_Y
+ GD_CMP_TRANSPARENT
+ GD_CMP_BACKGROUND
+ GD_CMP_INTERLACE
+ GD_CMP_TRUECOLOR
+ )
+ ]
+ );
+
+# documentation error
+*GD::Polygon::delete = \&GD::Polygon::deletePt;
+
+sub AUTOLOAD {
+ # This AUTOLOAD is used to 'autoload' constants from the constant()
+ # XS function. If a constant is not found then control is passed
+ # to the AUTOLOAD in AutoLoader.
+
+ my($constname);
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ my $val = constant($constname);
+ if ($! != 0) {
+ if ($! =~ /Invalid/) {
+ $AutoLoader::AUTOLOAD = $AUTOLOAD;
+ goto &AutoLoader::AUTOLOAD;
+ }
+ else {
+ my($pack,$file,$line) = caller;
+ die "Your vendor has not defined GD macro $pack\:\:$constname, used at $file line $line.\n";
+ }
+ }
+ eval "sub $AUTOLOAD { $val }";
+ goto &$AUTOLOAD;
+}
+
+bootstrap GD;
+
+
+# Preloaded methods go here.
+sub GD::gdSmallFont {
+ return GD::Font->Small;
+}
+
+sub GD::gdLargeFont {
+ return GD::Font->Large;
+}
+
+sub GD::gdMediumBoldFont {
+ return GD::Font->MediumBold;
+}
+
+sub GD::gdTinyFont {
+ return GD::Font->Tiny;
+}
+
+sub GD::gdGiantFont {
+ return GD::Font->Giant;
+}
+
+sub GD::Image::startGroup { } # does nothing - used by GD::SVG
+sub GD::Image::endGroup { } # does nothing - used by GD::SVG
+sub GD::Image::newGroup {
+ my $self = shift;
+ GD::Group->new($self,$self->startGroup);
+}
+
+=head1 NAME
+
+GD.pm - Interface to Gd Graphics Library
+
+=head1 SYNOPSIS
+
+ use GD;
+
+ # create a new image
+ $im = new GD::Image(100,100);
+
+ # allocate some colors
+ $white = $im->colorAllocate(255,255,255);
+ $black = $im->colorAllocate(0,0,0);
+ $red = $im->colorAllocate(255,0,0);
+ $blue = $im->colorAllocate(0,0,255);
+
+ # make the background transparent and interlaced
+ $im->transparent($white);
+ $im->interlaced('true');
+
+ # Put a black frame around the picture
+ $im->rectangle(0,0,99,99,$black);
+
+ # Draw a blue oval
+ $im->arc(50,50,95,75,0,360,$blue);
+
+ # And fill it with red
+ $im->fill(50,50,$red);
+
+ # make sure we are writing to a binary stream
+ binmode STDOUT;
+
+ # Convert the image to PNG and print it on standard output
+ print $im->png;
+
+=head1 DESCRIPTION
+
+B<GD.pm> is a Perl interface to Thomas Boutell's gd graphics library
+(version 2.01 or higher; see below). GD allows you to create color
+drawings using a large number of graphics primitives, and emit the
+drawings as PNG files.
+
+GD defines the following four classes:
+
+=over 5
+
+
+=item C<GD::Image>
+
+An image class, which holds the image data and accepts graphic
+primitive method calls.
+
+=item C<GD::Font>
+
+A font class, which holds static font information and used for text
+rendering.
+
+=item C<GD::Polygon>
+
+A simple polygon object, used for storing lists of vertices prior to
+rendering a polygon into an image.
+
+=item C<GD::Simple>
+
+A "simple" class that simplifies the GD::Image API and then adds a set
+of object-oriented drawing methods using turtle graphics, simplified
+font handling, ability to work in polar coordinates, HSV color spaces,
+and human-readable color names like "lightblue". Please see
+L<GD::Simple> for a description of these methods.
+
+=back
+
+A Simple Example:
+
+ #!/usr/local/bin/perl
+
+ use GD;
+
+ # create a new image
+ $im = new GD::Image(100,100);
+
+ # allocate some colors
+ $white = $im->colorAllocate(255,255,255);
+ $black = $im->colorAllocate(0,0,0);
+ $red = $im->colorAllocate(255,0,0);
+ $blue = $im->colorAllocate(0,0,255);
+
+ # make the background transparent and interlaced
+ $im->transparent($white);
+ $im->interlaced('true');
+
+ # Put a black frame around the picture
+ $im->rectangle(0,0,99,99,$black);
+
+ # Draw a blue oval
+ $im->arc(50,50,95,75,0,360,$blue);
+
+ # And fill it with red
+ $im->fill(50,50,$red);
+
+ # make sure we are writing to a binary stream
+ binmode STDOUT;
+
+ # Convert the image to PNG and print it on standard output
+ print $im->png;
+
+Notes:
+
+=over 5
+
+=item 1.
+To create a new, empty image, send a new() message to GD::Image, passing
+it the width and height of the image you want to create. An image
+object will be returned. Other class methods allow you to initialize
+an image from a preexisting JPG, PNG, GD, GD2 or XBM file.
+
+=item 2.
+Next you will ordinarily add colors to the image's color table.
+colors are added using a colorAllocate() method call. The three
+parameters in each call are the red, green and blue (rgb) triples for
+the desired color. The method returns the index of that color in the
+image's color table. You should store these indexes for later use.
+
+=item 3.
+Now you can do some drawing! The various graphics primitives are
+described below. In this example, we do some text drawing, create an
+oval, and create and draw a polygon.
+
+=item 4.
+Polygons are created with a new() message to GD::Polygon. You can add
+points to the returned polygon one at a time using the addPt() method.
+The polygon can then be passed to an image for rendering.
+
+=item 5.
+When you're done drawing, you can convert the image into PNG format by
+sending it a png() message. It will return a (potentially large)
+scalar value containing the binary data for the image. Ordinarily you
+will print it out at this point or write it to a file. To ensure
+portability to platforms that differentiate between text and binary
+files, be sure to call C<binmode()> on the file you are writing
+the image to.
+
+=back
+
+=head1 Object Constructors: Creating Images
+
+The following class methods allow you to create new GD::Image objects.
+
+=over 4
+
+=item B<$image = GD::Image-E<gt>new([$width,$height],[$truecolor])>
+
+=item B<$image = GD::Image-E<gt>new(*FILEHANDLE)>
+
+=item B<$image = GD::Image-E<gt>new($filename)>
+
+=item B<$image = GD::Image-E<gt>new($data)>
+
+The new() method is the main constructor for the GD::Image class.
+Called with two integer arguments, it creates a new blank image of the
+specified width and height. For example:
+
+ $myImage = new GD::Image(100,100) || die;
+
+This will create an image that is 100 x 100 pixels wide. If you don't
+specify the dimensions, a default of 64 x 64 will be chosen.
+
+The optional third argument, $truecolor, tells new() to create a
+truecolor GD::Image object. Truecolor images have 24 bits of color
+data (eight bits each in the red, green and blue channels
+respectively), allowing for precise photograph-quality color usage.
+If not specified, the image will use an 8-bit palette for
+compatibility with older versions of libgd.
+
+Alternatively, you may create a GD::Image object based on an existing
+image by providing an open filehandle, a filename, or the image data
+itself. The image formats automatically recognized and accepted are:
+PNG, JPEG, XPM and GD2. Other formats, including WBMP, and GD
+version 1, cannot be recognized automatically at this time.
+
+If something goes wrong (e.g. insufficient memory), this call will
+return undef.
+
+=item B<$image = GD::Image-E<gt>trueColor([0,1])>
+
+For backwards compatibility with scripts previous versions of GD,
+new images created from scratch (width, height) are palette based
+by default. To change this default to create true color images use:
+
+ GD::Image->trueColor(1);
+
+somewhere before creating new images. To switch back to palette
+based by default, use:
+
+ GD::Image->trueColor(0);
+
+=item B<$image = GD::Image-E<gt>newPalette([$width,$height])>
+
+=item B<$image = GD::Image-E<gt>newTrueColor([$width,$height])>
+
+The newPalette() and newTrueColor() methods can be used to explicitly
+create an palette based or true color image regardless of the
+current setting of trueColor().
+
+=item B<$image = GD::Image-E<gt>newFromPng($file, [$truecolor])>
+
+=item B<$image = GD::Image-E<gt>newFromPngData($data, [$truecolor])>
+
+The newFromPng() method will create an image from a PNG file read in
+through the provided filehandle or file path. The filehandle must
+previously have been opened on a valid PNG file or pipe. If
+successful, this call will return an initialized image which you can
+then manipulate as you please. If it fails, which usually happens if
+the thing at the other end of the filehandle is not a valid PNG file,
+the call returns undef. Notice that the call doesn't automatically
+close the filehandle for you. But it does call C<binmode(FILEHANDLE)>
+for you, on platforms where this matters.
+
+You may use any of the following as the argument:
+
+ 1) a simple filehandle, such as STDIN
+ 2) a filehandle glob, such as *PNG
+ 3) a reference to a glob, such as \*PNG
+ 4) an IO::Handle object
+ 5) the pathname of a file
+
+In the latter case, newFromPng() will attempt to open the file for you
+and read the PNG information from it.
+
+ Example1:
+
+ open (PNG,"barnswallow.png") || die;
+ $myImage = newFromPng GD::Image(\*PNG) || die;
+ close PNG;
+
+ Example2:
+ $myImage = newFromPng GD::Image('barnswallow.png');
+
+To get information about the size and color usage of the information,
+you can call the image query methods described below. Images created
+by reading PNG images will be truecolor if the image file itself is
+truecolor. To force the image to be palette-based, pass a value of 0
+in the optional $truecolor argument.
+
+The newFromPngData() method will create a new GD::Image initialized
+with the PNG format B<data> contained in C<$data>.
+
+=item B<$image = GD::Image-E<gt>newFromJpeg($file, [$truecolor])>
+
+=item B<$image = GD::Image-E<gt>newFromJpegData($data, [$truecolor])>
+
+These methods will create an image from a JPEG file. They work just
+like newFromPng() and newFromPngData(), and will accept the same
+filehandle and pathname arguments.
+
+Images created by reading JPEG images will always be truecolor. To
+force the image to be palette-based, pass a value of 0 in the optional
+$truecolor argument.
+
+=item B<$image = GD::Image-E<gt>newFromGif($file)>
+
+=item B<$image = GD::Image-E<gt>newFromGifData($data)>
+
+These methods will create an image from a GIF file. They work just
+like newFromPng() and newFromPngData(), and will accept the same
+filehandle and pathname arguments.
+
+Images created from GIFs are always 8-bit palette images. To convert
+to truecolor, you must create a truecolor image and then perform a
+copy.
+
+=item B<$image = GD::Image-E<gt>newFromXbm($file)>
+
+This works in exactly the same way as C<newFromPng>, but reads the
+contents of an X Bitmap (black & white) file:
+
+ open (XBM,"coredump.xbm") || die;
+ $myImage = newFromXbm GD::Image(\*XBM) || die;
+ close XBM;
+
+There is no newFromXbmData() function, because there is no
+corresponding function in the gd library.
+
+=item B<$image = GD::Image-E<gt>newFromGd($file)>
+
+=item B<$image = GD::Image-E<gt>newFromGdData($data)>
+
+These methods initialize a GD::Image from a Gd file, filehandle, or
+data. Gd is Tom Boutell's disk-based storage format, intended for the
+rare case when you need to read and write the image to disk quickly.
+It's not intended for regular use, because, unlike PNG or JPEG, no
+image compression is performed and these files can become B<BIG>.
+
+ $myImage = newFromGd GD::Image("godzilla.gd") || die;
+ close GDF;
+
+=item B<$image = GD::Image-E<gt>newFromGd2($file)>
+
+=item B<$image = GD::Image-E<gt>newFromGd2Data($data)>
+
+This works in exactly the same way as C<newFromGd()> and
+newFromGdData, but use the new compressed GD2 image format.
+
+=item B<$image = GD::Image-E<gt>newFromGd2Part($file,srcX,srcY,width,height)>
+
+This class method allows you to read in just a portion of a GD2 image
+file. In addition to a filehandle, it accepts the top-left corner and
+dimensions (width,height) of the region of the image to read. For
+example:
+
+ open (GDF,"godzilla.gd2") || die;
+ $myImage = GD::Image->newFromGd2Part(\*GDF,10,20,100,100) || die;
+ close GDF;
+
+This reads a 100x100 square portion of the image starting from
+position (10,20).
+
+=item B<$image = GD::Image-E<gt>newFromXpm($filename)>
+
+This creates a new GD::Image object starting from a B<filename>. This
+is unlike the other newFrom() functions because it does not take a
+filehandle. This difference comes from an inconsistency in the
+underlying gd library.
+
+ $myImage = newFromXpm GD::Image('earth.xpm') || die;
+
+This function is only available if libgd was compiled with XPM
+support.
+
+NOTE: The libgd library is unable to read certain XPM files, returning
+an all-black image instead.
+
+=head1 GD::Image Methods
+
+Once a GD::Image object is created, you can draw with it, copy it, and
+merge two images. When you are finished manipulating the object, you
+can convert it into a standard image file format to output or save to
+a file.
+
+=head2 Image Data Output Methods
+
+The following methods convert the internal drawing format into
+standard output file formats.
+
+=item B<$pngdata = $image-E<gt>png([$compression_level])>
+
+This returns the image data in PNG format. You can then print it,
+pipe it to a display program, or write it to a file. Example:
+
+ $png_data = $myImage->png;
+ open (DISPLAY,"| display -") || die;
+ binmode DISPLAY;
+ print DISPLAY $png_data;
+ close DISPLAY;
+
+Note the use of C<binmode()>. This is crucial for portability to
+DOSish platforms.
+
+The optional $compression_level argument controls the amount of
+compression to apply to the output PNG image. Values range from 0-9,
+where 0 means no compression (largest files, highest quality) and 9
+means maximum compression (smallest files, worst quality). A
+compression level of -1 uses the default compression level selected
+when zlib was compiled on your system, and is the same as calling
+png() with no argument. Be careful not to confuse this argument with
+the jpeg() quality argument, which ranges from 0-100 and has the
+opposite meaning from compression (higher numbers give higher
+quality).
+
+=item B<$gifdata = $image-E<gt>gifanimbegin([$GlobalCM [, $Loops]])>
+
+For libgd version 2.0.33 and higher, this call begins an animated GIF
+by returning the data that comprises animated gif image file header.
+After you call this method, call gifanimadd() one or more times to add
+the frames of the image. Then call gifanimend(). Each frame must be
+the same width and height.
+
+A typical sequence will look like this:
+
+ my $gifdata = $image->gifanimbegin;
+ $gifdata .= $image->gifanimadd; # first frame
+ for (1..100) {
+ # make a frame of right size
+ my $frame = GD::Image->new($image->getBounds);
+ add_frame_data($frame); # add the data for this frame
+ $gifdata .= $frame->gifanimadd; # add frame
+ }
+ $gifdata .= $image->gifanimend; # finish the animated GIF
+ print $gifdata; # write animated gif to STDOUT
+
+If you do not wish to store the data in memory, you can print it to
+stdout or a file.
+
+The image that you call gifanimbegin on is used to set the image size,
+color resolution and color map. If argument $GlobalCM is 1, the image
+color map becomes the GIF89a global color map. If $Loops is given and
+>= 0, the NETSCAPE2.0 application extension is created, with looping
+count. Looping count 0 means forever.
+
+=item B<$gifdata = $image-E<gt>gifanimadd([$LocalCM [, $LeftOfs [, $TopOfs [, $Delay [, $Disposal [, $previm]]]]]])>
+
+Returns the data that comprises one animated gif image frame. You can
+then print it, pipe it to a display program, or write it to a file.
+With $LeftOfs and $TopOfs you can place this frame in different offset
+than (0,0) inside the image screen. Delay between the previous frame
+and this frame is in 1/100s units. Disposal is usually and by default
+1. Compression is activated by giving the previous image as a
+parameter. This function then compares the images and only writes the
+changed pixels to the new frame in animation. The Disposal parameter
+for optimized animations must be set to 1, also for the first frame.
+$LeftOfs and $TopOfs parameters are ignored for optimized frames.
+
+=item B<$gifdata = $image-E<gt>gifanimend()>
+
+Returns the data for end segment of animated gif file. It always
+returns string ';'. This string must be printed to an animated gif
+file after all image frames to properly terminate it according to GIF
+file syntax. Image object is not used at all in this method.
+
+=item B<$jpegdata = $image-E<gt>jpeg([$quality])>
+
+This returns the image data in JPEG format. You can then print it,
+pipe it to a display program, or write it to a file. You may pass an
+optional quality score to jpeg() in order to control the JPEG quality.
+This should be an integer between 0 and 100. Higher quality scores
+give larger files and better image quality. If you don't specify the
+quality, jpeg() will choose a good default.
+
+=item B<$gifdata = $image-E<gt>gif()>.
+
+This returns the image data in GIF format. You can then print it,
+pipe it to a display program, or write it to a file.
+
+=item B<$gddata = $image-E<gt>gd>
+
+This returns the image data in GD format. You can then print it,
+pipe it to a display program, or write it to a file. Example:
+
+ binmode MYOUTFILE;
+ print MYOUTFILE $myImage->gd;
+
+=item B<$gd2data = $image-E<gt>gd2>
+
+Same as gd(), except that it returns the data in compressed GD2
+format.
+
+=item B<$wbmpdata = $image-E<gt>wbmp([$foreground])>
+
+This returns the image data in WBMP format, which is a black-and-white
+image format. Provide the index of the color to become the foreground
+color. All other pixels will be considered background.
+
+=back
+
+=head2 Color Control
+
+These methods allow you to control and manipulate the GD::Image color
+table.
+
+=over 4
+
+=item B<$index = $image-E<gt>colorAllocate(red,green,blue)>
+
+This allocates a color with the specified red, green and blue
+components and returns its index in the color table, if specified.
+The first color allocated in this way becomes the image's background
+color. (255,255,255) is white (all pixels on). (0,0,0) is black (all
+pixels off). (255,0,0) is fully saturated red. (127,127,127) is 50%
+gray. You can find plenty of examples in /usr/X11/lib/X11/rgb.txt.
+
+If no colors are allocated, then this function returns -1.
+
+Example:
+
+ $white = $myImage->colorAllocate(0,0,0); #background color
+ $black = $myImage->colorAllocate(255,255,255);
+ $peachpuff = $myImage->colorAllocate(255,218,185);
+
+=item B<$index = $image-E<gt>colorAllocateAlpha(reg,green,blue,alpha)>
+
+This allocates a color with the specified red, green, and blue components,
+plus the specified alpha channel. The alpha value may range from 0 (opaque)
+to 127 (transparent). The C<alphaBlending> function changes the way this
+alpha channel affects the resulting image.
+
+=item B<$image-E<gt>colorDeallocate(colorIndex)>
+
+This marks the color at the specified index as being ripe for
+reallocation. The next time colorAllocate is used, this entry will be
+replaced. You can call this method several times to deallocate
+multiple colors. There's no function result from this call.
+
+Example:
+
+ $myImage->colorDeallocate($peachpuff);
+ $peachy = $myImage->colorAllocate(255,210,185);
+
+=item B<$index = $image-E<gt>colorClosest(red,green,blue)>
+
+This returns the index of the color closest in the color table to the
+red green and blue components specified. If no colors have yet been
+allocated, then this call returns -1.
+
+Example:
+
+ $apricot = $myImage->colorClosest(255,200,180);
+
+=item B<$index = $image-E<gt>colorClosestHWB(red,green,blue)>
+
+This also attempts to return the color closest in the color table to the
+red green and blue components specified. It uses a Hue/White/Black
+color representation to make the selected color more likely to match
+human perceptions of similar colors.
+
+If no colors have yet been
+allocated, then this call returns -1.
+
+Example:
+
+ $mostred = $myImage->colorClosestHWB(255,0,0);
+
+=item B<$index = $image-E<gt>colorExact(red,green,blue)>
+
+This returns the index of a color that exactly matches the specified
+red green and blue components. If such a color is not in the color
+table, this call returns -1.
+
+ $rosey = $myImage->colorExact(255,100,80);
+ warn "Everything's coming up roses.\n" if $rosey >= 0;
+
+=item B<$index = $image-E<gt>colorResolve(red,green,blue)>
+
+This returns the index of a color that exactly matches the specified
+red green and blue components. If such a color is not in the color
+table and there is room, then this method allocates the color in the
+color table and returns its index.
+
+ $rosey = $myImage->colorResolve(255,100,80);
+ warn "Everything's coming up roses.\n" if $rosey >= 0;
+
+=item B<$colorsTotal = $image-E<gt>colorsTotal> I<object method>
+
+This returns the total number of colors allocated in the object.
+
+ $maxColors = $myImage->colorsTotal;
+
+In the case of a TrueColor image, this call will return undef.
+
+=item B<$index = $image-E<gt>getPixel(x,y)> I<object method>
+
+This returns the color table index underneath the specified
+point. It can be combined with rgb()
+to obtain the rgb color underneath the pixel.
+
+Example:
+
+ $index = $myImage->getPixel(20,100);
+ ($r,$g,$b) = $myImage->rgb($index);
+
+=item B<($red,$green,$blue) = $image-E<gt>rgb($index)>
+
+This returns a list containing the red, green and blue components of
+the specified color index.
+
+Example:
+
+ @RGB = $myImage->rgb($peachy);
+
+=item B<$image-E<gt>transparent($colorIndex)>
+
+This marks the color at the specified index as being transparent.
+Portions of the image drawn in this color will be invisible. This is
+useful for creating paintbrushes of odd shapes, as well as for
+making PNG backgrounds transparent for displaying on the Web. Only
+one color can be transparent at any time. To disable transparency,
+specify -1 for the index.
+
+If you call this method without any parameters, it will return the
+current index of the transparent color, or -1 if none.
+
+Example:
+
+ open(PNG,"test.png");
+ $im = newFromPng GD::Image(PNG);
+ $white = $im->colorClosest(255,255,255); # find white
+ $im->transparent($white);
+ binmode STDOUT;
+ print $im->png;
+
+=back
+
+=head2 Special Colors
+
+GD implements a number of special colors that can be used to achieve
+special effects. They are constants defined in the GD::
+namespace, but automatically exported into your namespace when the GD
+module is loaded.
+
+=over 4
+
+=item B<$image-E<gt>setBrush($image)>
+
+You can draw lines and shapes using a brush pattern. Brushes are just
+images that you can create and manipulate in the usual way. When you
+draw with them, their contents are used for the color and shape of the
+lines.
+
+To make a brushed line, you must create or load the brush first, then
+assign it to the image using setBrush(). You can then draw in that
+with that brush using the B<gdBrushed> special color. It's often
+useful to set the background of the brush to transparent so that the
+non-colored parts don't overwrite other parts of your image.
+
+Example:
+
+ # Create a brush at an angle
+ $diagonal_brush = new GD::Image(5,5);
+ $white = $diagonal_brush->colorAllocate(255,255,255);
+ $black = $diagonal_brush->colorAllocate(0,0,0);
+ $diagonal_brush->transparent($white);
+ $diagonal_brush->line(0,4,4,0,$black); # NE diagonal
+
+ # Set the brush
+ $myImage->setBrush($diagonal_brush);
+
+ # Draw a circle using the brush
+ $myImage->arc(50,50,25,25,0,360,gdBrushed);
+
+=item B<$image-E<gt>setThickness($thickness)>
+
+Lines drawn with line(), rectangle(), arc(), and so forth are 1 pixel
+thick by default. Call setThickness() to change the line drawing
+width.
+
+=item B<$image-E<gt>setStyle(@colors)>
+
+Styled lines consist of an arbitrary series of repeated colors and are
+useful for generating dotted and dashed lines. To create a styled
+line, use setStyle() to specify a repeating series of colors. It
+accepts an array consisting of one or more color indexes. Then draw
+using the B<gdStyled> special color. Another special color,
+B<gdTransparent> can be used to introduce holes in the line, as the
+example shows.
+
+Example:
+
+ # Set a style consisting of 4 pixels of yellow,
+ # 4 pixels of blue, and a 2 pixel gap
+ $myImage->setStyle($yellow,$yellow,$yellow,$yellow,
+ $blue,$blue,$blue,$blue,
+ gdTransparent,gdTransparent);
+ $myImage->arc(50,50,25,25,0,360,gdStyled);
+
+To combine the C<gdStyled> and C<gdBrushed> behaviors, you can specify
+C<gdStyledBrushed>. In this case, a pixel from the current brush
+pattern is rendered wherever the color specified in setStyle() is
+neither gdTransparent nor 0.
+
+=item B<gdTiled>
+
+Draw filled shapes and flood fills using a pattern. The pattern is
+just another image. The image will be tiled multiple times in order
+to fill the required space, creating wallpaper effects. You must call
+C<setTile> in order to define the particular tile pattern you'll use
+for drawing when you specify the gdTiled color.
+details.
+
+=item B<gdStyled>
+
+The gdStyled color is used for creating dashed and dotted lines. A
+styled line can contain any series of colors and is created using the
+setStyled() command.
+
+=item B<gdAntiAliased>
+
+The C<gdAntiAliased> color is used for drawing lines with antialiasing
+turned on. Antialiasing will blend the jagged edges of lines with the
+background, creating a smoother look. The actual color drawn is set
+with setAntiAliased().
+
+=item B<$image-E<gt>setAntiAliased($color)>
+
+"Antialiasing" is a process by which jagged edges associated with line
+drawing can be reduced by blending the foreground color with an
+appropriate percentage of the background, depending on how much of the
+pixel in question is actually within the boundaries of the line being
+drawn. All line-drawing methods, such as line() and polygon, will draw
+antialiased lines if the special "color" B<gdAntiAliased> is used when
+calling them.
+
+setAntiAliased() is used to specify the actual foreground color to be
+used when drawing antialiased lines. You may set any color to be the
+foreground, however as of libgd version 2.0.12 an alpha channel
+component is not supported.
+
+Antialiased lines can be drawn on both truecolor and palette-based
+images. However, attempts to draw antialiased lines on highly complex
+palette-based backgrounds may not give satisfactory results, due to
+the limited number of colors available in the palette. Antialiased
+line-drawing on simple backgrounds should work well with palette-based
+images; otherwise create or fetch a truecolor image instead. When
+using palette-based images, be sure to allocate a broad spectrum of
+colors in order to have sufficient colors for the antialiasing to use.
+
+=item B<$image-E<gt>setAntiAliasedDontBlend($color,[$flag])>
+
+Normally, when drawing lines with the special B<gdAntiAliased>
+"color," blending with the background to reduce jagged edges is the
+desired behavior. However, when it is desired that lines not be
+blended with one particular color when it is encountered in the
+background, the setAntiAliasedDontBlend() method can be used to
+indicate the special color that the foreground should stand out more
+clearly against.
+
+Once turned on, you can turn this feature off by calling
+setAntiAliasedDontBlend() with a second argument of 0:
+
+ $image->setAntiAliasedDontBlend($color,0);
+
+=back
+
+=head2 Drawing Commands
+
+These methods allow you to draw lines, rectangles, and ellipses, as
+well as to perform various special operations like flood-fill.
+
+=over 4
+
+=item B<$image-E<gt>setPixel($x,$y,$color)>
+
+This sets the pixel at (x,y) to the specified color index. No value
+is returned from this method. The coordinate system starts at the
+upper left at (0,0) and gets larger as you go down and to the right.
+You can use a real color, or one of the special colors gdBrushed,
+gdStyled and gdStyledBrushed can be specified.
+
+Example:
+
+ # This assumes $peach already allocated
+ $myImage->setPixel(50,50,$peach);
+
+=item B<$image-E<gt>line($x1,$y1,$x2,$y2,$color)>
+
+This draws a line from (x1,y1) to (x2,y2) of the specified color. You
+can use a real color, or one of the special colors gdBrushed,
+gdStyled and gdStyledBrushed.
+
+Example:
+
+ # Draw a diagonal line using the currently defined
+ # paintbrush pattern.
+ $myImage->line(0,0,150,150,gdBrushed);
+
+=item B<$image-E<gt>dashedLine($x1,$y1,$x2,$y2,$color)>
+
+DEPRECATED: The libgd library provides this method solely for backward
+compatibility with libgd version 1.0, and there have been reports that
+it no longer works as expected. Please use the setStyle() and gdStyled
+methods as described below.
+
+This draws a dashed line from (x1,y1) to (x2,y2) in the specified
+color. A more powerful way to generate arbitrary dashed and dotted
+lines is to use the setStyle() method described below and to draw with
+the special color gdStyled.
+
+Example:
+
+ $myImage->dashedLine(0,0,150,150,$blue);
+
+=item B<$image-E<gt>rectangle($x1,$y1,$x2,$y2,$color)>
+
+This draws a rectangle with the specified color. (x1,y1) and (x2,y2)
+are the upper left and lower right corners respectively. Both real
+color indexes and the special colors gdBrushed, gdStyled and
+gdStyledBrushed are accepted.
+
+Example:
+
+ $myImage->rectangle(10,10,100,100,$rose);
+
+=item B<$image-E<gt>filledRectangle($x1,$y1,$x2,$y2,$color)>
+
+This draws a rectangle filed with the specified color. You can use a
+real color, or the special fill color gdTiled to fill the polygon
+with a pattern.
+
+Example:
+
+ # read in a fill pattern and set it
+ $tile = newFromPng GD::Image('happyface.png');
+ $myImage->setTile($tile);
+
+ # draw the rectangle, filling it with the pattern
+ $myImage->filledRectangle(10,10,150,200,gdTiled);
+
+=item B<$image-E<gt>openPolygon($polygon,$color)>
+
+This draws a polygon with the specified color. The polygon must be
+created first (see below). The polygon must have at least three
+vertices. If the last vertex doesn't close the polygon, the method
+will close it for you. Both real color indexes and the special
+colors gdBrushed, gdStyled and gdStyledBrushed can be specified.
+
+Example:
+
+ $poly = new GD::Polygon;
+ $poly->addPt(50,0);
+ $poly->addPt(99,99);
+ $poly->addPt(0,99);
+ $myImage->openPolygon($poly,$blue);
+
+=item B<$image-E<gt>unclosedPolygon($polygon,$color)>
+
+This draws a sequence of connected lines with the specified color,
+without connecting the first and last point to a closed polygon. The
+polygon must be created first (see below). The polygon must have at
+least three vertices. Both real color indexes and the special colors
+gdBrushed, gdStyled and gdStyledBrushed can be specified.
+
+You need libgd 2.0.33 or higher to use this feature.
+
+Example:
+
+ $poly = new GD::Polygon;
+ $poly->addPt(50,0);
+ $poly->addPt(99,99);
+ $poly->addPt(0,99);
+ $myImage->unclosedPolygon($poly,$blue);
+
+=item B<$image-E<gt>filledPolygon($poly,$color)>
+
+This draws a polygon filled with the specified color. You can use a
+real color, or the special fill color gdTiled to fill the polygon
+with a pattern.
+
+Example:
+
+ # make a polygon
+ $poly = new GD::Polygon;
+ $poly->addPt(50,0);
+ $poly->addPt(99,99);
+ $poly->addPt(0,99);
+
+ # draw the polygon, filling it with a color
+ $myImage->filledPolygon($poly,$peachpuff);
+
+=item B<$image-E<gt>ellipse($cx,$cy,$width,$height,$color)>
+
+=item B<$image-E<gt>filledEllipse($cx,$cy,$width,$height,$color)>
+
+These methods() draw ellipses. ($cx,$cy) is the center of the arc, and
+($width,$height) specify the ellipse width and height, respectively.
+filledEllipse() is like Ellipse() except that the former produces
+filled versions of the ellipse.
+
+=item B<$image-E<gt>arc($cx,$cy,$width,$height,$start,$end,$color)>
+
+This draws arcs and ellipses. (cx,cy) are the center of the arc, and
+(width,height) specify the width and height, respectively. The
+portion of the ellipse covered by the arc are controlled by start and
+end, both of which are given in degrees from 0 to 360. Zero is at the
+top of the ellipse, and angles increase clockwise. To specify a
+complete ellipse, use 0 and 360 as the starting and ending angles. To
+draw a circle, use the same value for width and height.
+
+You can specify a normal color or one of the special colors
+B<gdBrushed>, B<gdStyled>, or B<gdStyledBrushed>.
+
+Example:
+
+ # draw a semicircle centered at 100,100
+ $myImage->arc(100,100,50,50,0,180,$blue);
+
+=item B<$image-E<gt>filledArc($cx,$cy,$width,$height,$start,$end,$color [,$arc_style])>
+
+This method is like arc() except that it colors in the pie wedge with
+the selected color. $arc_style is optional. If present it is a
+bitwise OR of the following constants:
+
+ gdArc connect start & end points of arc with a rounded edge
+ gdChord connect start & end points of arc with a straight line
+ gdPie synonym for gdChord
+ gdNoFill outline the arc or chord
+ gdEdged connect beginning and ending of the arc to the center
+
+gdArc and gdChord are mutually exclusive. gdChord just connects the
+starting and ending angles with a straight line, while gdArc produces
+a rounded edge. gdPie is a synonym for gdArc. gdNoFill indicates that
+the arc or chord should be outlined, not filled. gdEdged, used
+together with gdNoFill, indicates that the beginning and ending angles
+should be connected to the center; this is a good way to outline
+(rather than fill) a "pie slice."
+
+Example:
+
+ $image->filledArc(100,100,50,50,0,90,$blue,gdEdged|gdNoFill);
+
+=item B<$image-E<gt>fill($x,$y,$color)>
+
+This method flood-fills regions with the specified color. The color
+will spread through the image, starting at point (x,y), until it is
+stopped by a pixel of a different color from the starting pixel (this
+is similar to the "paintbucket" in many popular drawing toys). You
+can specify a normal color, or the special color gdTiled, to flood-fill
+with patterns.
+
+Example:
+
+ # Draw a rectangle, and then make its interior blue
+ $myImage->rectangle(10,10,100,100,$black);
+ $myImage->fill(50,50,$blue);
+
+=item B<$image-E<gt>fillToBorder($x,$y,$bordercolor,$color)>
+
+Like C<fill>, this method flood-fills regions with the specified
+color, starting at position (x,y). However, instead of stopping when
+it hits a pixel of a different color than the starting pixel, flooding
+will only stop when it hits the color specified by bordercolor. You
+must specify a normal indexed color for the bordercolor. However, you
+are free to use the gdTiled color for the fill.
+
+Example:
+
+ # This has the same effect as the previous example
+ $myImage->rectangle(10,10,100,100,$black);
+ $myImage->fillToBorder(50,50,$black,$blue);
+
+=back
+
+
+
+=head2 Image Copying Commands
+
+Two methods are provided for copying a rectangular region from one
+image to another. One method copies a region without resizing it.
+The other allows you to stretch the region during the copy operation.
+
+With either of these methods it is important to know that the routines
+will attempt to flesh out the destination image's color table to match
+the colors that are being copied from the source. If the
+destination's color table is already full, then the routines will
+attempt to find the best match, with varying results.
+
+=over 4
+
+=item B<$image-E<gt>copy($sourceImage,$dstX,$dstY,>
+
+B< $srcX,$srcY,$width,$height)>
+
+This is the simplest of the several copy operations, copying the
+specified region from the source image to the destination image (the
+one performing the method call). (srcX,srcY) specify the upper left
+corner of a rectangle in the source image, and (width,height) give the
+width and height of the region to copy. (dstX,dstY) control where in
+the destination image to stamp the copy. You can use the same image
+for both the source and the destination, but the source and
+destination regions must not overlap or strange things will happen.
+
+Example:
+
+ $myImage = new GD::Image(100,100);
+ ... various drawing stuff ...
+ $srcImage = new GD::Image(50,50);
+ ... more drawing stuff ...
+ # copy a 25x25 pixel region from $srcImage to
+ # the rectangle starting at (10,10) in $myImage
+ $myImage->copy($srcImage,10,10,0,0,25,25);
+
+=item B<$image-E<gt>clone()>
+
+Make a copy of the image and return it as a new object. The new image
+will look identical. However, it may differ in the size of the color
+palette and other nonessential details.
+
+Example:
+
+ $myImage = new GD::Image(100,100);
+ ... various drawing stuff ...
+ $copy = $myImage->clone;
+
+=item B<$image-E<gt>copyMerge($sourceImage,$dstX,$dstY,>
+
+B< $srcX,$srcY,$width,$height,$percent)>
+
+This copies the indicated rectangle from the source image to the
+destination image, merging the colors to the extent specified by
+percent (an integer between 0 and 100). Specifying 100% has the same
+effect as copy() -- replacing the destination pixels with the source
+image. This is most useful for highlighting an area by merging in a
+solid rectangle.
+
+Example:
+
+ $myImage = new GD::Image(100,100);
+ ... various drawing stuff ...
+ $redImage = new GD::Image(50,50);
+ ... more drawing stuff ...
+ # copy a 25x25 pixel region from $srcImage to
+ # the rectangle starting at (10,10) in $myImage, merging 50%
+ $myImage->copyMerge($srcImage,10,10,0,0,25,25,50);
+
+=item B<$image-E<gt>copyMergeGray($sourceImage,$dstX,$dstY,>
+
+B< $srcX,$srcY,$width,$height,$percent)>
+
+This is identical to copyMerge() except that it preserves the hue of
+the source by converting all the pixels of the destination rectangle
+to grayscale before merging.
+
+=item B<$image-E<gt>copyResized($sourceImage,$dstX,$dstY,>
+
+B< $srcX,$srcY,$destW,$destH,$srcW,$srcH)>
+
+This method is similar to copy() but allows you to choose different
+sizes for the source and destination rectangles. The source and
+destination rectangle's are specified independently by (srcW,srcH) and
+(destW,destH) respectively. copyResized() will stretch or shrink the
+image to accommodate the size requirements.
+
+Example:
+
+ $myImage = new GD::Image(100,100);
+ ... various drawing stuff ...
+ $srcImage = new GD::Image(50,50);
+ ... more drawing stuff ...
+ # copy a 25x25 pixel region from $srcImage to
+ # a larger rectangle starting at (10,10) in $myImage
+ $myImage->copyResized($srcImage,10,10,0,0,50,50,25,25);
+
+=item B<$image-E<gt>copyResampled($sourceImage,$dstX,$dstY,>
+
+B< $srcX,$srcY,$destW,$destH,$srcW,$srcH)>
+
+This method is similar to copyResized() but provides "smooth" copying
+from a large image to a smaller one, using a weighted average of the
+pixels of the source area rather than selecting one representative
+pixel. This method is identical to copyResized() when the destination
+image is a palette image.
+
+=item B<$image-E<gt>copyRotated($sourceImage,$dstX,$dstY,>
+
+B< $srcX,$srcY,$width,$height,$angle)>
+
+Like copyResized() but the $angle argument specifies an arbitrary
+amount to rotate the image clockwise (in degrees). In addition, $dstX
+and $dstY species the B<center> of the destination image, and not the
+top left corner.
+
+=item B<$image-E<gt>trueColorToPalette([$dither], [$colors])>
+
+This method converts a truecolor image to a palette image. The code for
+this function was originally drawn from the Independent JPEG Group library
+code, which is excellent. The code has been modified to preserve as much
+alpha channel information as possible in the resulting palette, in addition
+to preserving colors as well as possible. This does not work as well as
+might be hoped. It is usually best to simply produce a truecolor
+output image instead, which guarantees the highest output quality.
+Both the dithering (0/1, default=0) and maximum number of colors used
+(<=256, default = gdMaxColors) can be specified.
+
+=back
+
+=head2 Image Transformation Commands
+
+Gd also provides some common image transformations:
+
+=over 4
+
+=item B<$image = $sourceImage-E<gt>copyRotate90()>
+
+=item B<$image = $sourceImage-E<gt>copyRotate180()>
+
+=item B<$image = $sourceImage-E<gt>copyRotate270()>
+
+=item B<$image = $sourceImage-E<gt>copyFlipHorizontal()>
+
+=item B<$image = $sourceImage-E<gt>copyFlipVertical()>
+
+=item B<$image = $sourceImage-E<gt>copyTranspose()>
+
+=item B<$image = $sourceImage-E<gt>copyReverseTranspose()>
+
+These methods can be used to rotate, flip, or transpose an image.
+The result of the method is a copy of the image.
+
+=item B<$image-E<gt>rotate180()>
+
+=item B<$image-E<gt>flipHorizontal()>
+
+=item B<$image-E<gt>flipVertical()>
+
+These methods are similar to the copy* versions, but instead
+modify the image in place.
+
+=back
+
+=head2 Character and String Drawing
+
+GD allows you to draw characters and strings, either in normal
+horizontal orientation or rotated 90 degrees. These routines use a
+GD::Font object, described in more detail below. There are four
+built-in monospaced fonts, available in the global variables
+B<gdGiantFont>, B<gdLargeFont>, B<gdMediumBoldFont>, B<gdSmallFont>
+and B<gdTinyFont>.
+
+In addition, you can use the load() method to load GD-formatted bitmap
+font files at runtime. You can create these bitmap files from X11
+BDF-format files using the bdf2gd.pl script, which should have been
+installed with GD (see the bdf_scripts directory if it wasn't). The
+format happens to be identical to the old-style MSDOS bitmap ".fnt"
+files, so you can use one of those directly if you happen to have one.
+
+For writing proportional scaleable fonts, GD offers the stringFT()
+method, which allows you to load and render any TrueType font on your
+system.
+
+=over 4
+
+=item B<$image-E<gt>string($font,$x,$y,$string,$color)>
+
+This method draws a string starting at position (x,y) in the specified
+font and color. Your choices of fonts are gdSmallFont, gdMediumBoldFont,
+gdTinyFont, gdLargeFont and gdGiantFont.
+
+Example:
+
+ $myImage->string(gdSmallFont,2,10,"Peachy Keen",$peach);
+
+=item B<$image-E<gt>stringUp($font,$x,$y,$string,$color)>
+
+Just like the previous call, but draws the text rotated
+counterclockwise 90 degrees.
+
+=item B<$image-E<gt>char($font,$x,$y,$char,$color)>
+
+=item B<$image-E<gt>charUp($font,$x,$y,$char,$color)>
+
+These methods draw single characters at position (x,y) in the
+specified font and color. They're carry-overs from the C interface,
+where there is a distinction between characters and strings. Perl is
+insensible to such subtle distinctions.
+
+=item $font = B<GD::Font-E<gt>load($fontfilepath)>
+
+This method dynamically loads a font file, returning a font that you
+can use in subsequent calls to drawing methods. For example:
+
+ my $courier = GD::Font->load('./courierR12.fnt') or die "Can't load font";
+ $image->string($courier,2,10,"Peachy Keen",$peach);
+
+Font files must be in GD binary format, as described above.
+
+=item B<@bounds = $image-E<gt>stringFT($fgcolor,$fontname,$ptsize,$angle,$x,$y,$string)>
+
+=item B<@bounds = GD::Image-E<gt>stringFT($fgcolor,$fontname,$ptsize,$angle,$x,$y,$string)>
+
+=item B<@bounds = $image-E<gt>stringFT($fgcolor,$fontname,$ptsize,$angle,$x,$y,$string,\%options)>
+
+This method uses TrueType to draw a scaled, antialiased string using
+the TrueType vector font of your choice. It requires that libgd to
+have been compiled with TrueType support, and for the appropriate
+TrueType font to be installed on your system.
+
+The arguments are as follows:
+
+ fgcolor Color index to draw the string in
+ fontname A path to the TrueType (.ttf) font file or a font pattern.
+ ptsize The desired point size (may be fractional)
+ angle The rotation angle, in radians (positive values rotate counter clockwise)
+ x,y X and Y coordinates to start drawing the string
+ string The string itself
+
+If successful, the method returns an eight-element list giving the
+boundaries of the rendered string:
+
+ @bounds[0,1] Lower left corner (x,y)
+ @bounds[2,3] Lower right corner (x,y)
+ @bounds[4,5] Upper right corner (x,y)
+ @bounds[6,7] Upper left corner (x,y)
+
+In case of an error (such as the font not being available, or FT
+support not being available), the method returns an empty list and
+sets $@ to the error message.
+
+The string may contain UTF-8 sequences like: "&#192;"
+
+You may also call this method from the GD::Image class name, in which
+case it doesn't do any actual drawing, but returns the bounding box
+using an inexpensive operation. You can use this to perform layout
+operations prior to drawing.
+
+Using a negative color index will disable antialiasing, as described
+in the libgd manual page at
+L<http://www.boutell.com/gd/manual2.0.9.html#gdImageStringFT>.
+
+An optional 8th argument allows you to pass a hashref of options to
+stringFT(). Several hashkeys are recognized: B<linespacing>,
+B<charmap>, B<resolution>, and B<kerning>.
+
+The value of B<linespacing> is supposed to be a multiple of the
+character height, so setting linespacing to 2.0 will result in
+double-spaced lines of text. However the current version of libgd
+(2.0.12) does not do this. Instead the linespacing seems to be double
+what is provided in this argument. So use a spacing of 0.5 to get
+separation of exactly one line of text. In practice, a spacing of 0.6
+seems to give nice results. Another thing to watch out for is that
+successive lines of text should be separated by the "\r\n" characters,
+not just "\n".
+
+The value of B<charmap> is one of "Unicode", "Shift_JIS" and "Big5".
+The interaction between Perl, Unicode and libgd is not clear to me,
+and you should experiment a bit if you want to use this feature.
+
+The value of B<resolution> is the vertical and horizontal resolution,
+in DPI, in the format "hdpi,vdpi". If present, the resolution will be
+passed to the Freetype rendering engine as a hint to improve the
+appearance of the rendered font.
+
+The value of B<kerning> is a flag. Set it to false to turn off the
+default kerning of text.
+
+Example:
+
+ $gd->stringFT($black,'/dosc/windows/Fonts/pala.ttf',40,0,20,90,
+ "hi there\r\nbye now",
+ {linespacing=>0.6,
+ charmap => 'Unicode',
+ });
+
+If GD was compiled with fontconfig support, and the fontconfig library
+is available on your system, then you can use a font name pattern
+instead of a path. Patterns are described in L<fontconfig> and will
+look something like this "Times:italic". For backward
+compatibility, this feature is disabled by default. You must enable
+it by calling useFontConfig(1) prior to the stringFT() call.
+
+ $image->useFontConfig(1);
+
+For backward compatibility with older versions of the FreeType
+library, the alias stringTTF() is also recognized.
+
+=item B<$hasfontconfig = $image-E<gt>useFontConfig($flag)>
+
+Call useFontConfig() with a value of 1 in order to enable support for
+fontconfig font patterns (see stringFT). Regardless of the value of
+$flag, this method will return a true value if the fontconfig library
+is present, or false otherwise.
+
+=item B<$result = $image->stringFTCircle($cx,$cy,$radius,$textRadius,$fillPortion,$font,$points,$top,$bottom,$fgcolor)>
+
+This draws text in a circle. Currently (libgd 2.0.33) this function
+does not work for me, but the interface is provided for completeness.
+The call signature is somewhat complex. Here is an excerpt from the
+libgd manual page:
+
+Draws the text strings specified by top and bottom on the image, curved along
+the edge of a circle of radius radius, with its center at cx and
+cy. top is written clockwise along the top; bottom is written
+counterclockwise along the bottom. textRadius determines the "height"
+of each character; if textRadius is 1/2 of radius, characters extend
+halfway from the edge to the center. fillPortion varies from 0 to 1.0,
+with useful values from about 0.4 to 0.9, and determines how much of
+the 180 degrees of arc assigned to each section of text is actually
+occupied by text; 0.9 looks better than 1.0 which is rather
+crowded. font is a freetype font; see gdImageStringFT. points is
+passed to the freetype engine and has an effect on hinting; although
+the size of the text is determined by radius, textRadius, and
+fillPortion, you should pass a point size that "hints" appropriately
+-- if you know the text will be large, pass a large point size such as
+24.0 to get the best results. fgcolor can be any color, and may have
+an alpha component, do blending, etc.
+
+Returns a true value on success.
+
+=back
+
+=head2 Alpha channels
+
+The alpha channel methods allow you to control the way drawings are
+processed according to the alpha channel. When true color is turned
+on, colors are encoded as four bytes, in which the last three bytes
+are the RGB color values, and the first byte is the alpha channel.
+Therefore the hexadecimal representation of a non transparent RGB
+color will be: C=0x00(rr)(bb)(bb)
+
+When alpha blending is turned on, you can use the first byte of the
+color to control the transparency, meaning that a rectangle painted
+with color 0x00(rr)(bb)(bb) will be opaque, and another one painted
+with 0x7f(rr)(gg)(bb) will be transparent. The Alpha value must be >=
+0 and <= 0x7f.
+
+=over 4
+
+=item B<$image-E<gt>alphaBlending($integer)>
+
+The alphaBlending() method allows for two different modes of drawing
+on truecolor images. In blending mode, which is on by default (libgd
+2.0.2 and above), the alpha channel component of the color supplied to
+all drawing functions, such as C<setPixel>, determines how much of the
+underlying color should be allowed to shine through. As a result, GD
+automatically blends the existing color at that point with the drawing
+color, and stores the result in the image. The resulting pixel is
+opaque. In non-blending mode, the drawing color is copied literally
+with its alpha channel information, replacing the destination
+pixel. Blending mode is not available when drawing on palette images.
+
+Pass a value of 1 for blending mode, and 0 for non-blending mode.
+
+=item B<$image-E<gt>saveAlpha($saveAlpha)>
+
+By default, GD (libgd 2.0.2 and above) does not attempt to save full
+alpha channel information (as opposed to single-color transparency)
+when saving PNG images. (PNG is currently the only output format
+supported by gd which can accommodate alpha channel information.) This
+saves space in the output file. If you wish to create an image with
+alpha channel information for use with tools that support it, call
+C<saveAlpha(1)> to turn on saving of such information, and call
+C<alphaBlending(0)> to turn off alpha blending within the library so
+that alpha channel information is actually stored in the image rather
+than being composited immediately at the time that drawing functions
+are invoked.
+
+=back
+
+
+=head2 Miscellaneous Image Methods
+
+These are various utility methods that are useful in some
+circumstances.
+
+=over 4
+
+=item B<$image-E<gt>interlaced([$flag])>
+
+This method sets or queries the image's interlaced setting. Interlace
+produces a cool venetian blinds effect on certain viewers. Provide a
+true parameter to set the interlace attribute. Provide undef to
+disable it. Call the method without parameters to find out the
+current setting.
+
+=item B<($width,$height) = $image-E<gt>getBounds()>
+
+This method will return a two-member list containing the width and
+height of the image. You query but not change the size of the
+image once it's created.
+
+=item B<$width = $image-E<gt>width>
+
+=item B<$height = $image-E<gt>height>
+
+Return the width and height of the image, respectively.
+
+=item B<$is_truecolor = $image-E<gt>isTrueColor()>
+
+This method will return a Boolean representing whether the image
+is true color or not.
+
+=item B<$flag = $image1-E<gt>compare($image2)>
+
+Compare two images and return a bitmap describing the differences
+found, if any. The return value must be logically ANDed with one or
+more constants in order to determine the differences. The following
+constants are available:
+
+ GD_CMP_IMAGE The two images look different
+ GD_CMP_NUM_COLORS The two images have different numbers of colors
+ GD_CMP_COLOR The two images' palettes differ
+ GD_CMP_SIZE_X The two images differ in the horizontal dimension
+ GD_CMP_SIZE_Y The two images differ in the vertical dimension
+ GD_CMP_TRANSPARENT The two images have different transparency
+ GD_CMP_BACKGROUND The two images have different background colors
+ GD_CMP_INTERLACE The two images differ in their interlace
+ GD_CMP_TRUECOLOR The two images are not both true color
+
+The most important of these is GD_CMP_IMAGE, which will tell you
+whether the two images will look different, ignoring differences in the
+order of colors in the color palette and other invisible changes. The
+constants are not imported by default, but must be imported individually
+or by importing the :cmp tag. Example:
+
+ use GD qw(:DEFAULT :cmp);
+ # get $image1 from somewhere
+ # get $image2 from somewhere
+ if ($image1->compare($image2) & GD_CMP_IMAGE) {
+ warn "images differ!";
+ }
+
+=item B<$image-E<gt>clip($x1,$y1,$x2,$y2)>
+
+=item B<($x1,$y1,$x2,$y2) = $image-E<gt>clip>
+
+Set or get the clipping rectangle. When the clipping rectangle is
+set, all drawing will be clipped to occur within this rectangle. The
+clipping rectangle is initially set to be equal to the boundaries of
+the whole image. Change it by calling clip() with the coordinates of
+the new clipping rectangle. Calling clip() without any arguments will
+return the current clipping rectangle.
+
+=item B<$flag = $image-E<gt>boundsSafe($x,$y)>
+
+The boundsSafe() method will return true if the point indicated by
+($x,$y) is within the clipping rectangle, or false if it is not. If
+the clipping rectangle has not been set, then it will return true if
+the point lies within the image boundaries.
+
+=back
+
+=head2 Grouping Methods
+
+GD does not support grouping of objects, but GD::SVG does. In that
+subclass, the following methods declare new groups of graphical
+objects:
+
+=over 4
+
+=item $image->startGroup([$id,\%style])
+
+=item $image->endGroup()
+
+=item $group = $image->newGroup
+
+See L<GD::SVG> for information.
+
+=back
+
+=head1 Polygons
+
+A few primitive polygon creation and manipulation methods are
+provided. They aren't part of the Gd library, but I thought they
+might be handy to have around (they're borrowed from my qd.pl
+Quickdraw library). Also see L<GD::Polyline>.
+
+=over 3
+
+=item B<$poly = GD::Polygon-E<gt>new>
+
+Create an empty polygon with no vertices.
+
+ $poly = new GD::Polygon;
+
+=item B<$poly-E<gt>addPt($x,$y)>
+
+Add point (x,y) to the polygon.
+
+ $poly->addPt(0,0);
+ $poly->addPt(0,50);
+ $poly->addPt(25,25);
+ $myImage->fillPoly($poly,$blue);
+
+=item B<($x,$y) = $poly-E<gt>getPt($index)>
+
+Retrieve the point at the specified vertex.
+
+ ($x,$y) = $poly->getPt(2);
+
+=item B<$poly-E<gt>setPt($index,$x,$y)>
+
+Change the value of an already existing vertex. It is an error to set
+a vertex that isn't already defined.
+
+ $poly->setPt(2,100,100);
+
+=item B<($x,$y) = $poly-E<gt>deletePt($index)>
+
+Delete the specified vertex, returning its value.
+
+ ($x,$y) = $poly->deletePt(1);
+
+
+=item B<$poly-E<gt>clear()>
+
+Delete all vertices, restoring the polygon to its initial empty state.
+
+=item B<$poly-E<gt>toPt($dx,$dy)>
+
+Draw from current vertex to a new vertex, using relative (dx,dy)
+coordinates. If this is the first point, act like addPt().
+
+ $poly->addPt(0,0);
+ $poly->toPt(0,50);
+ $poly->toPt(25,-25);
+ $myImage->fillPoly($poly,$blue);
+
+=item B<$vertex_count = $poly-E<gt>length>
+
+Return the number of vertices in the polygon.
+
+ $points = $poly->length;
+
+=item B<@vertices = $poly-E<gt>vertices>
+
+Return a list of all the vertices in the polygon object. Each member
+of the list is a reference to an (x,y) array.
+
+ @vertices = $poly->vertices;
+ foreach $v (@vertices)
+ print join(",",@$v),"\n";
+ }
+
+=item B<@rect = $poly-E<gt>bounds>
+
+Return the smallest rectangle that completely encloses the polygon.
+The return value is an array containing the (left,top,right,bottom) of
+the rectangle.
+
+ ($left,$top,$right,$bottom) = $poly->bounds;
+
+=item B<$poly-E<gt>offset($dx,$dy)>
+
+Offset all the vertices of the polygon by the specified horizontal
+(dh) and vertical (dy) amounts. Positive numbers move the polygon
+down and to the right.
+
+ $poly->offset(10,30);
+
+=item B<$poly-E<gt>map($srcL,$srcT,$srcR,$srcB,$destL,$dstT,$dstR,$dstB)>
+
+Map the polygon from a source rectangle to an equivalent position in a
+destination rectangle, moving it and resizing it as necessary. See
+polys.pl for an example of how this works. Both the source and
+destination rectangles are given in (left,top,right,bottom)
+coordinates. For convenience, you can use the polygon's own bounding
+box as the source rectangle.
+
+ # Make the polygon really tall
+ $poly->map($poly->bounds,0,0,50,200);
+
+=item B<$poly-E<gt>scale($sx,$sy)>
+
+Scale each vertex of the polygon by the X and Y factors indicated by
+sx and sy. For example scale(2,2) will make the polygon twice as
+large. For best results, move the center of the polygon to position
+(0,0) before you scale, then move it back to its previous position.
+
+=item B<$poly-E<gt>transform($sx,$rx,$sy,$ry,$tx,$ty)>
+
+Run each vertex of the polygon through a transformation matrix, where
+sx and sy are the X and Y scaling factors, rx and ry are the X and Y
+rotation factors, and tx and ty are X and Y offsets. See the Adobe
+PostScript Reference, page 154 for a full explanation, or experiment.
+
+=back
+
+=head2 GD::Polyline
+
+Please see L<GD::Polyline> for information on creating open polygons
+and splines.
+
+=head1 Font Utilities
+
+The libgd library (used by the Perl GD library) has built-in support
+for about half a dozen fonts, which were converted from public-domain
+X Windows fonts. For more fonts, compile libgd with TrueType support
+and use the stringFT() call.
+
+If you wish to add more built-in fonts, the directory bdf_scripts
+contains two contributed utilities that may help you convert X-Windows
+BDF-format fonts into the format that libgd uses internally. However
+these scripts were written for earlier versions of GD which included
+its own mini-gd library. These scripts will have to be adapted for
+use with libgd, and the libgd library itself will have to be
+recompiled and linked! Please do not contact me for help with these
+scripts: they are unsupported.
+
+Each of these fonts is available both as an imported global
+(e.g. B<gdSmallFont>) and as a package method
+(e.g. B<GD::Font-E<gt>Small>).
+
+=over 5
+
+=item B<gdSmallFont>
+
+=item B<GD::Font-E<gt>Small>
+
+This is the basic small font, "borrowed" from a well known public
+domain 6x12 font.
+
+=item B<gdLargeFont>
+
+=item B<GD::Font-E<gt>Large>
+
+This is the basic large font, "borrowed" from a well known public
+domain 8x16 font.
+
+=item B<gdMediumBoldFont>
+
+=item B<GD::Font-E<gt>MediumBold>
+
+This is a bold font intermediate in size between the small and large
+fonts, borrowed from a public domain 7x13 font;
+
+=item B<gdTinyFont>
+
+=item B<GD::Font-E<gt>Tiny>
+
+This is a tiny, almost unreadable font, 5x8 pixels wide.
+
+=item B<gdGiantFont>
+
+=item B<GD::Font-E<gt>Giant>
+
+This is a 9x15 bold font converted by Jan Pazdziora from a sans serif
+X11 font.
+
+=item B<$font-E<gt>nchars>
+
+This returns the number of characters in the font.
+
+ print "The large font contains ",gdLargeFont->nchars," characters\n";
+
+=item B<$font-E<gt>offset>
+
+This returns the ASCII value of the first character in the font
+
+=item B<$width = $font-E<gt>width>
+
+=item B<$height = $font-E<gt>height>
+
+=item C<height>
+
+These return the width and height of the font.
+
+ ($w,$h) = (gdLargeFont->width,gdLargeFont->height);
+
+=back
+
+=head1 Obtaining the C-language version of gd
+
+libgd, the C-language version of gd, can be obtained at URL
+http://www.boutell.com/gd/. Directions for installing and using it
+can be found at that site. Please do not contact me for help with
+libgd.
+
+=head1 AUTHOR
+
+The GD.pm interface is copyright 1995-2007, Lincoln D. Stein. It is
+distributed under GPL and the Artistic License 2.0.
+
+The latest versions of GD.pm are available at
+
+ http://stein.cshl.org/WWW/software/GD
+
+=head1 SEE ALSO
+
+L<GD::Polyline>,
+L<GD::SVG>,
+L<GD::Simple>,
+L<Image::Magick>
+
+=cut
+
+1;
+
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/GD/Group.pm b/Master/tlpkg/tlperl.straw/lib/GD/Group.pm
new file mode 100755
index 00000000000..93506bb3bc1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/GD/Group.pm
@@ -0,0 +1,33 @@
+package GD::Group;
+
+# Simple object for recursive grouping. Does absolutely nothing with GD,
+# but works nicely with GD::SVG.
+
+use strict;
+
+our $AUTOLOAD;
+our $VERSION = 1.00;
+
+sub AUTOLOAD {
+ my ($pack,$func_name) = $AUTOLOAD =~ /(.+)::([^:]+)$/;
+ my $this = shift;
+ $this->{gd}->currentGroup($this->{group});
+ $this->{gd}->$func_name(@_);
+}
+
+sub new {
+ my $this = shift;
+ my ($gd,$group) = @_;
+ return bless {gd => $gd,
+ group => $group},ref $this || $this;
+}
+
+sub DESTROY {
+ my $this = shift;
+ my $gd = $this->{gd};
+ my $grp = $this->{group};
+ $gd->endGroup($grp);
+}
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/GD/Image.pm b/Master/tlpkg/tlperl.straw/lib/GD/Image.pm
new file mode 100755
index 00000000000..bbeaadc6a87
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/GD/Image.pm
@@ -0,0 +1,200 @@
+# DO NOT EDIT! THIS FILE IS AUTOGENERATED BY GD/Image.pm.PLS
+package GD::Image;
+
+use strict;
+use GD;
+use Symbol 'gensym','qualify_to_ref';
+use vars '$VERSION';
+$VERSION = '2.38';
+
+=head1 NAME
+
+GD::Image - Image class for the GD image library
+
+=head1 SYNOPSIS
+
+See L<GD>
+
+=head1 DESCRIPTION
+
+See L<GD>
+
+=head1 AUTHOR
+
+The GD.pm interface is copyright 1995-2005, Lincoln D. Stein. It is
+distributed under the same terms as Perl itself. See the "Artistic
+License" in the Perl source code distribution for licensing terms.
+
+The latest versions of GD.pm are available on CPAN:
+
+ http://www.cpan.org
+
+=head1 SEE ALSO
+
+L<GD>
+L<GD::Polyline>,
+L<GD::SVG>,
+L<GD::Simple>,
+L<Image::Magick>
+
+=cut
+
+# Copyright 1995 Lincoln D. Stein. See accompanying README file for
+# usage information
+
+*stringTTF = \&GD::Image::stringFT;
+
+sub _make_filehandle {
+ shift; # get rid of class
+ no strict 'refs';
+ my $thing = shift;
+ return $thing if defined(fileno $thing);
+
+ # otherwise try qualifying it into caller's package
+ my $fh;
+ {
+ local $^W = 0; # to avoid uninitialized variable warning from Symbol.pm
+ $fh = qualify_to_ref($thing,caller(2));
+ }
+ return $fh if defined(fileno $fh);
+
+ # otherwise treat it as a file to open
+ $fh = gensym;
+ open($fh,$thing) || return;
+ return $fh;
+}
+
+sub new {
+ my $pack = shift;
+ if (@_ == 1) {
+ if (my $type = _image_type($_[0])) {
+ my $method = "newFrom${type}Data";
+ return unless $pack->can($method);
+ return $pack->$method($_[0]);
+ }
+ return unless my $fh = $pack->_make_filehandle($_[0]);
+ my $magic;
+ return unless read($fh,$magic,4);
+ return unless my $type = _image_type($magic);
+ seek($fh,0,0);
+ my $method = "newFrom${type}";
+ return $pack->$method($fh);
+ }
+ return $pack->_new(@_);
+}
+
+sub newTrueColor {
+ my $pack = shift;
+ return $pack->_new(@_, 1);
+}
+
+sub newPalette {
+ my $pack = shift;
+ return $pack->_new(@_, 0);
+}
+
+sub newFromGd {
+ croak("Usage: newFromGd(class,filehandle)") unless @_==2;
+ my($class,$f) = @_;
+ my $fh = $class->_make_filehandle($f);
+ binmode($fh);
+ $class->_newFromGd($fh);
+}
+
+sub newFromGd2 {
+ croak("Usage: newFromGd2(class,filehandle)") unless @_==2;
+ my($class,$f) = @_;
+ my $fh = $class->_make_filehandle($f);
+ binmode($fh);
+ $class->_newFromGd2($fh);
+}
+
+sub newFromGd2Part {
+ croak("Usage: newFromGd2(class,filehandle,srcX,srcY,width,height)") unless @_==6;
+ my($class,$f) = splice(@_,0,2);
+ my $fh = $class->_make_filehandle($f);
+ binmode($fh);
+ $class->_newFromGd2Part($fh,@_);
+}
+
+sub ellipse ($$$$$) {
+ my ($self,$cx,$cy,$width,$height,$color) = @_;
+ $self->arc($cx,$cy,$width,$height,0,360,$color);
+}
+
+# draws closed polygon with the specified color
+sub polygon {
+ my $self = shift;
+ my($p,$c) = @_;
+ $self->openPolygon($p, $c);
+ $self->line( @{$p->{'points'}->[0]},
+ @{$p->{'points'}->[$p->{'length'}-1]}, $c);
+}
+
+sub width {
+ my $self = shift;
+ my @bounds = $self->getBounds;
+ $bounds[0];
+}
+
+sub height {
+ my $self = shift;
+ my @bounds = $self->getBounds;
+ $bounds[1];
+}
+
+sub _image_type {
+ my $data = shift;
+ my $magic = substr($data,0,4);
+ return 'Png' if $magic eq "\x89PNG";
+ return 'Jpeg' if $magic eq "\377\330\377\340";
+ return 'Jpeg' if $magic eq "\377\330\377\341";
+ return 'Jpeg' if $magic eq "\377\330\377\355";
+ return 'Jpeg' if $magic eq "\377\330\377\356";
+ return 'Gif' if $magic eq "GIF8";
+ return 'Gd2' if $magic eq "gd2\000";
+ return 'Xpm' if substr($data,0,9) eq "/* XPM */";
+ return;
+}
+
+
+sub clone {
+ croak("Usage: clone(\$image)") unless @_ == 1;
+ my $self = shift;
+ my ($x,$y) = $self->getBounds;
+ my $new = $self->new($x,$y);
+ return unless $new;
+ $new->copy($self,0,0,0,0,$x,$y);
+ return $new;
+}
+
+sub newFromPng {
+ croak("Usage: newFromPng(class,filehandle,[truecolor])") unless @_>=2;
+ my($class) = shift;
+ my($f) = shift;
+ my $fh = $class->_make_filehandle($f);
+ binmode($fh);
+ $class->_newFromPng($fh,@_);
+}
+
+sub newFromJpeg {
+ croak("Usage: newFromJpeg(class,filehandle,[truecolor])") unless @_>=2;
+ my($class) = shift;
+ my($f) = shift;
+ my $fh = $class->_make_filehandle($f);
+ binmode($fh);
+ $class->_newFromJpeg($fh,@_);
+}
+
+sub newFromGif {
+ croak("Usage: newFromGif(class,filehandle,[truecolor])") unless @_>=2;
+ my($class) = shift;
+ my($f) = shift;
+ my $fh = $class->_make_filehandle($f);
+ binmode($fh);
+ $class->_newFromGif($fh,@_);
+}
+
+# Autoload methods go after __END__, and are processed by the autosplit program.
+1;
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/GD/Polygon.pm b/Master/tlpkg/tlperl.straw/lib/GD/Polygon.pm
new file mode 100755
index 00000000000..42319b266fe
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/GD/Polygon.pm
@@ -0,0 +1,183 @@
+package GD::Polygon;
+
+use strict;
+use Carp 'carp';
+use GD;
+
+# old documentation error
+*GD::Polygon::delete = \&deletePt;
+
+=head1 NAME
+
+GD::Polygon - Polygon class for the GD image library
+
+=head1 SYNOPSIS
+
+See L<GD>
+
+=head1 DESCRIPTION
+
+See L<GD>
+
+=head1 AUTHOR
+
+The GD.pm interface is copyright 1995-2005, Lincoln D. Stein. It is
+distributed under the same terms as Perl itself. See the "Artistic
+License" in the Perl source code distribution for licensing terms.
+
+The latest versions of GD.pm are available on CPAN:
+
+ http://www.cpan.org
+
+=head1 SEE ALSO
+
+L<GD>
+L<GD::Polyline>,
+L<GD::SVG>,
+L<GD::Simple>,
+L<Image::Magick>
+
+=cut
+
+### The polygon object ###
+# create a new polygon
+sub new {
+ my $class = shift;
+ return bless { 'length'=>0,'points'=>[] },$class;
+}
+
+# automatic destruction of the polygon
+sub DESTROY {
+ my $self = shift;
+ undef $self->{'points'};
+}
+
+sub clear {
+ my $self = shift;
+ $self->{'points'} = [];
+}
+
+# add an x,y vertex to the polygon
+sub addPt {
+ my($self,$x,$y) = @_;
+ push(@{$self->{'points'}},[$x,$y]);
+ $self->{'length'}++;
+}
+
+# get a vertex
+sub getPt {
+ my($self,$index) = @_;
+ return () unless ($index>=0) && ($index<$self->{'length'});
+ return @{$self->{'points'}->[$index]};
+}
+
+# change the value of a vertex
+sub setPt {
+ my($self,$index,$x,$y) = @_;
+ unless (($index>=0) && ($index<$self->{'length'})) {
+ carp "Attempt to set an undefined polygon vertex";
+ return undef;
+ }
+ @{$self->{'points'}->[$index]} = ($x,$y);
+ 1;
+}
+
+# return the total number of vertices
+sub length {
+ my $self = shift;
+ return $self->{'length'};
+}
+
+# return the array of vertices.
+# each vertex is an two-member (x,y) array
+sub vertices {
+ my $self = shift;
+ return @{$self->{'points'}};
+}
+
+# return the bounding box of the polygon
+# (smallest rectangle that contains it)
+sub bounds {
+ my $self = shift;
+ my($top,$bottom,$left,$right) = @_;
+ $top = 99999999;
+ $bottom =-99999999;
+ $left = 99999999;
+ $right = -99999999;
+ my $v;
+ foreach $v ($self->vertices) {
+ $left = $v->[0] if $left > $v->[0];
+ $right = $v->[0] if $right < $v->[0];
+ $top = $v->[1] if $top > $v->[1];
+ $bottom = $v->[1] if $bottom < $v->[1];
+ }
+ return ($left,$top,$right,$bottom);
+}
+
+# delete a vertex, returning it, just for fun
+sub deletePt {
+ my($self,$index) = @_;
+ unless (($index>=0) && ($index<@{$self->{'points'}})) {
+ carp "Attempt to delete an undefined polygon vertex";
+ return undef;
+ }
+ my($vertex) = splice(@{$self->{'points'}},$index,1);
+ $self->{'length'}--;
+ return @$vertex;
+ }
+
+# translate the polygon in space by deltaX and deltaY
+sub offset {
+ my($self,$dh,$dv) = @_;
+ my $size = $self->length;
+ my($i);
+ for ($i=0;$i<$size;$i++) {
+ my($x,$y)=$self->getPt($i);
+ $self->setPt($i,$x+$dh,$y+$dv);
+ }
+}
+
+# map the polygon from sourceRect to destRect,
+# translating and resizing it if necessary
+sub map {
+ my($self,$srcL,$srcT,$srcR,$srcB,$destL,$destT,$destR,$destB) = @_;
+ my($factorV) = ($destB-$destT)/($srcB-$srcT);
+ my($factorH) = ($destR-$destL)/($srcR-$srcL);
+ my($vertices) = $self->length;
+ my($i);
+ for ($i=0;$i<$vertices;$i++) {
+ my($x,$y) = $self->getPt($i);
+ $x = int($destL + ($x - $srcL) * $factorH);
+ $y = int($destT + ($y - $srcT) * $factorV);
+ $self->setPt($i,$x,$y);
+ }
+}
+
+# These routines added by Winfriend Koenig.
+sub toPt {
+ my($self, $dx, $dy) = @_;
+ unless ($self->length > 0) {
+ $self->addPt($dx,$dy);
+ return;
+ }
+ my ($x, $y) = $self->getPt($self->length-1);
+ $self->addPt($x+$dx,$y+$dy);
+}
+
+sub transform($$$$$$$) {
+ # see PostScript Ref. page 154
+ my($self, $a, $b, $c, $d, $tx, $ty) = @_;
+ my $size = $self->length;
+ for (my $i=0;$i<$size;$i++) {
+ my($x,$y)=$self->getPt($i);
+ $self->setPt($i, $a*$x+$c*$y+$tx, $b*$x+$d*$y+$ty);
+ }
+}
+
+sub scale {
+ my($self, $sx, $sy, $cx, $cy) = @_;
+ $self->offset(-$cx,-$cy) if defined $cx or defined $cy;
+ $self->transform($sx,0,0,$sy,$cx,$cy);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/GD/Polyline.pm b/Master/tlpkg/tlperl.straw/lib/GD/Polyline.pm
new file mode 100755
index 00000000000..3b5dcb7ce71
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/GD/Polyline.pm
@@ -0,0 +1,792 @@
+############################################################################
+#
+# Polyline.pm
+#
+# Author: Dan Harasty
+# Email: harasty@cpan.org
+# Version: 0.2
+# Date: 2002/08/06
+#
+# For usage documentation: see POD at end of file
+#
+# For changes: see "Changes" file included with distribution
+#
+
+use strict;
+
+package GD::Polyline;
+
+############################################################################
+#
+# GD::Polyline
+#
+############################################################################
+#
+# What's this? A class with nothing but a $VERSION and and @ISA?
+# Below, this module overrides and adds several modules to
+# the parent class, GD::Polygon. Those updated/new methods
+# act on polygons and polylines, and sometimes those behaviours
+# vary slightly based on whether the object is a polygon or polyine.
+#
+
+use vars qw($VERSION @ISA);
+$VERSION = "0.2";
+@ISA = qw(GD::Polygon);
+
+
+package GD::Polygon;
+
+############################################################################
+#
+# new methods on GD::Polygon
+#
+############################################################################
+
+use GD;
+use Carp 'croak','carp';
+
+use vars qw($bezSegs $csr);
+$bezSegs = 20; # number of bezier segs -- number of segments in each portion of the spline produces by toSpline()
+$csr = 1/3; # control seg ratio -- the one possibly user-tunable parameter in the addControlPoints() algorithm
+
+
+sub rotate {
+ my ($self, $angle, $cx, $cy) = @_;
+ $self->offset(-$cx,-$cy) if $cx or $cy;
+ $self->transform(cos($angle),sin($angle),-sin($angle),cos($angle),$cx,$cy);
+}
+
+sub centroid {
+ my ($self, $scale) = @_;
+ my ($cx,$cy);
+ $scale = 1 unless defined $scale;
+
+ map {$cx += $_->[0]; $cy += $_->[1]} $self->vertices();
+
+ $cx *= $scale / $self->length();
+ $cy *= $scale / $self->length();
+
+ return ($cx, $cy);
+}
+
+
+sub segLength {
+ my $self = shift;
+ my @points = $self->vertices();
+
+ my ($p1, $p2, @segLengths);
+
+ $p1 = shift @points;
+
+ # put the first vertex on the end to "close" a polygon, but not a polyline
+ push @points, $p1 unless $self->isa('GD::Polyline');
+
+ while ($p2 = shift @points) {
+ push @segLengths, _len($p1, $p2);
+ $p1 = $p2;
+ }
+
+ return @segLengths if wantarray;
+
+ my $sum;
+ map {$sum += $_} @segLengths;
+ return $sum;
+}
+
+sub segAngle {
+ my $self = shift;
+ my @points = $self->vertices();
+
+ my ($p1, $p2, @segAngles);
+
+ $p1 = shift @points;
+
+ # put the first vertex on the end to "close" a polygon, but not a polyline
+ push @points, $p1 unless $self->isa('GD::Polyline');
+
+ while ($p2 = shift @points) {
+ push @segAngles, _angle_reduce2(_angle($p1, $p2));
+ $p1 = $p2;
+ }
+
+ return @segAngles;
+}
+
+sub vertexAngle {
+ my $self = shift;
+ my @points = $self->vertices();
+
+ my ($p1, $p2, $p3, @vertexAngle);
+
+ $p1 = $points[$#points]; # last vertex
+ $p2 = shift @points; # current point -- the first vertex
+
+ # put the first vertex on the end to "close" a polygon, but not a polyline
+ push @points, $p2 unless $self->isa('GD::Polyline');
+
+ while ($p3 = shift @points) {
+ push @vertexAngle, _angle_reduce2(_angle($p1, $p2, $p3));
+ ($p1, $p2) = ($p2, $p3);
+ }
+
+ $vertexAngle[0] = undef if defined $vertexAngle[0] and $self->isa("GD::Polyline");
+
+ return @vertexAngle if wantarray;
+
+}
+
+
+
+sub toSpline {
+ my $self = shift;
+ my @points = $self->vertices();
+
+ # put the first vertex on the end to "close" a polygon, but not a polyline
+ push @points, [$self->getPt(0)] unless $self->isa('GD::Polyline');
+
+ unless (@points > 1 and @points % 3 == 1) {
+ carp "Attempt to call toSpline() with invalid set of control points";
+ return undef;
+ }
+
+ my ($ap1, $dp1, $dp2, $ap2); # ap = anchor point, dp = director point
+ $ap1 = shift @points;
+
+ my $bez = new ref($self);
+
+ $bez->addPt(@$ap1);
+
+ while (@points) {
+ ($dp1, $dp2, $ap2) = splice(@points, 0, 3);
+
+ for (1..$bezSegs) {
+ my ($t0, $t1, $c1, $c2, $c3, $c4, $x, $y);
+
+ $t1 = $_/$bezSegs;
+ $t0 = (1 - $t1);
+
+ # possible optimization:
+ # these coefficient could be calculated just once and
+ # cached in an array for a given value of $bezSegs
+
+ $c1 = $t0 * $t0 * $t0;
+ $c2 = 3 * $t0 * $t0 * $t1;
+ $c3 = 3 * $t0 * $t1 * $t1;
+ $c4 = $t1 * $t1 * $t1;
+
+ $x = $c1 * $ap1->[0] + $c2 * $dp1->[0] + $c3 * $dp2->[0] + $c4 * $ap2->[0];
+ $y = $c1 * $ap1->[1] + $c2 * $dp1->[1] + $c3 * $dp2->[1] + $c4 * $ap2->[1];
+
+ $bez->addPt($x, $y);
+ }
+
+ $ap1 = $ap2;
+ }
+
+ # remove the last anchor point if this is a polygon -- since it will autoclose without it
+ $bez->deletePt($bez->length()-1) unless $self->isa('GD::Polyline');
+
+ return $bez;
+}
+
+sub addControlPoints {
+ my $self = shift;
+ my @points = $self->vertices();
+
+ unless (@points > 1) {
+ carp "Attempt to call addControlPoints() with too few vertices in polyline";
+ return undef;
+ }
+
+ my $points = scalar(@points);
+ my @segAngles = $self->segAngle();
+ my @segLengths = $self->segLength();
+
+ my ($prevLen, $nextLen, $prevAngle, $thisAngle, $nextAngle);
+ my ($controlSeg, $pt, $ptX, $ptY, @controlSegs);
+
+ # this loop goes about creating polylines -- here called control segments --
+ # that hold the control points for the final set of control points
+
+ # each control segment has three points, and these are colinear
+
+ # the first and last will ultimately be "director points", and
+ # the middle point will ultimately be an "anchor point"
+
+ for my $i (0..$#points) {
+
+ $controlSeg = new GD::Polyline;
+
+ $pt = $points[$i];
+ ($ptX, $ptY) = @$pt;
+
+ if ($self->isa('GD::Polyline') and ($i == 0 or $i == $#points)) {
+ $controlSeg->addPt($ptX, $ptY); # director point
+ $controlSeg->addPt($ptX, $ptY); # anchor point
+ $controlSeg->addPt($ptX, $ptY); # director point
+ next;
+ }
+
+ $prevLen = $segLengths[$i-1];
+ $nextLen = $segLengths[$i];
+ $prevAngle = $segAngles[$i-1];
+ $nextAngle = $segAngles[$i];
+
+ # make a control segment with control points (director points)
+ # before and after the point from the polyline (anchor point)
+
+ $controlSeg->addPt($ptX - $csr * $prevLen, $ptY); # director point
+ $controlSeg->addPt($ptX , $ptY); # anchor point
+ $controlSeg->addPt($ptX + $csr * $nextLen, $ptY); # director point
+
+ # note that:
+ # - the line is parallel to the x-axis, as the points have a common $ptY
+ # - the points are thus clearly colinear
+ # - the director point is a distance away from the anchor point in proportion to the length of the segment it faces
+
+ # now, we must come up with a reasonable angle for the control seg
+ # first, "unwrap" $nextAngle w.r.t. $prevAngle
+ $nextAngle -= 2*pi() until $nextAngle < $prevAngle + pi();
+ $nextAngle += 2*pi() until $nextAngle > $prevAngle - pi();
+ # next, use seg lengths as an inverse weighted average
+ # to "tip" the control segment toward the *shorter* segment
+ $thisAngle = ($nextAngle * $prevLen + $prevAngle * $nextLen) / ($prevLen + $nextLen);
+
+ # rotate the control segment to $thisAngle about it's anchor point
+ $controlSeg->rotate($thisAngle, $ptX, $ptY);
+
+ } continue {
+ # save the control segment for later
+ push @controlSegs, $controlSeg;
+
+ }
+
+ # post process
+
+ my $controlPoly = new ref($self);
+
+ # collect all the control segments' points in to a single control poly
+
+ foreach my $cs (@controlSegs) {
+ foreach my $pt ($cs->vertices()) {
+ $controlPoly->addPt(@$pt);
+ }
+ }
+
+ # final clean up based on poly type
+
+ if ($controlPoly->isa('GD::Polyline')) {
+ # remove the first and last control point
+ # since they are director points ...
+ $controlPoly->deletePt(0);
+ $controlPoly->deletePt($controlPoly->length()-1);
+ } else {
+ # move the first control point to the last control point
+ # since it is supposed to end with two director points ...
+ $controlPoly->addPt($controlPoly->getPt(0));
+ $controlPoly->deletePt(0);
+ }
+
+ return $controlPoly;
+}
+
+
+# The following helper functions are for internal
+# use of this module. Input arguments of "points"
+# refer to an array ref of two numbers, [$x, $y]
+# as is used internally in the GD::Polygon
+#
+# _len()
+# Find the length of a segment, passing in two points.
+# Internal function; NOT a class or object method.
+#
+sub _len {
+# my ($p1, $p2) = @_;
+# return sqrt(($p2->[0]-$p1->[0])**2 + ($p2->[1]-$p1->[1])**2);
+ my $pt = _subtract(@_);
+ return sqrt($pt->[0] ** 2 + $pt->[1] **2);
+}
+
+use Math::Trig;
+
+# _angle()
+# Find the angle of... well, depends on the number of arguments:
+# - one point: the angle from x-axis to the point (origin is the center)
+# - two points: the angle of the vector defined from point1 to point2
+# - three points:
+# Internal function; NOT a class or object method.
+#
+sub _angle {
+ my ($p1, $p2, $p3) = @_;
+ my $angle = undef;
+ if (@_ == 1) {
+ return atan2($p1->[1], $p1->[0]);
+ }
+ if (@_ == 2) {
+ return _angle(_subtract($p1, $p2));
+ }
+ if (@_ == 3) {
+ return _angle(_subtract($p2, $p3)) - _angle(_subtract($p2, $p1));
+ }
+}
+
+# _subtract()
+# Find the difference of two points; returns a point.
+# Internal function; NOT a class or object method.
+#
+sub _subtract {
+ my ($p1, $p2) = @_;
+# print(_print_point($p2), "-", _print_point($p1), "\n");
+ return [$p2->[0]-$p1->[0], $p2->[1]-$p1->[1]];
+}
+
+# _print_point()
+# Returns a string suitable for displaying the value of a point.
+# Internal function; NOT a class or object method.
+#
+sub _print_point {
+ my ($p1) = @_;
+ return "[" . join(", ", @$p1) . "]";
+}
+
+# _angle_reduce1()
+# "unwraps" angle to interval -pi < angle <= +pi
+# Internal function; NOT a class or object method.
+#
+sub _angle_reduce1 {
+ my ($angle) = @_;
+ $angle += 2 * pi() while $angle <= -pi();
+ $angle -= 2 * pi() while $angle > pi();
+ return $angle;
+}
+
+# _angle_reduce2()
+# "unwraps" angle to interval 0 <= angle < 2 * pi
+# Internal function; NOT a class or object method.
+#
+sub _angle_reduce2 {
+ my ($angle) = @_;
+ $angle += 2 * pi() while $angle < 0;
+ $angle -= 2 * pi() while $angle >= 2 * pi();
+ return $angle;
+}
+
+############################################################################
+#
+# new methods on GD::Image
+#
+############################################################################
+
+sub GD::Image::polyline {
+ my $self = shift; # the GD::Image
+ my $p = shift; # the GD::Polyline (or GD::Polygon)
+ my $c = shift; # the color
+
+ my @points = $p->vertices();
+ my $p1 = shift @points;
+ my $p2;
+ while ($p2 = shift @points) {
+ $self->line(@$p1, @$p2, $c);
+ $p1 = $p2;
+ }
+}
+
+sub GD::Image::polydraw {
+ my $self = shift; # the GD::Image
+ my $p = shift; # the GD::Polyline or GD::Polygon
+ my $c = shift; # the color
+
+ return $self->polyline($p, $c) if $p->isa('GD::Polyline');
+ return $self->polygon($p, $c);
+}
+
+
+1;
+__END__
+
+=pod
+
+=head1 NAME
+
+GD::Polyline - Polyline object and Polygon utilities (including splines) for use with GD
+
+=head1 SYNOPSIS
+
+ use GD;
+ use GD::Polyline;
+
+ # create an image
+ $image = new GD::Image (500,300);
+ $white = $image->colorAllocate(255,255,255);
+ $black = $image->colorAllocate( 0, 0, 0);
+ $red = $image->colorAllocate(255, 0, 0);
+
+ # create a new polyline
+ $polyline = new GD::Polyline;
+
+ # add some points
+ $polyline->addPt( 0, 0);
+ $polyline->addPt( 0,100);
+ $polyline->addPt( 50,125);
+ $polyline->addPt(100, 0);
+
+ # polylines can use polygon methods (and vice versa)
+ $polyline->offset(200,100);
+
+ # rotate 60 degrees, about the centroid
+ $polyline->rotate(3.14159/3, $polyline->centroid());
+
+ # scale about the centroid
+ $polyline->scale(1.5, 2, $polyline->centroid());
+
+ # draw the polyline
+ $image->polydraw($polyline,$black);
+
+ # create a spline, which is also a polyine
+ $spline = $polyline->addControlPoints->toSpline;
+ $image->polydraw($spline,$red);
+
+ # output the png
+ binmode STDOUT;
+ print $image->png;
+
+=head1 DESCRIPTION
+
+B<Polyline.pm> extends the GD module by allowing you to create polylines. Think
+of a polyline as "an open polygon", that is, the last vertex is not connected
+to the first vertex (unless you expressly add the same value as both points).
+
+For the remainder of this doc, "polyline" will refer to a GD::Polyline,
+"polygon" will refer to a GD::Polygon that is not a polyline, and
+"polything" and "$poly" may be either.
+
+The big feature added to GD by this module is the means
+to create splines, which are approximations to curves.
+
+=head1 The Polyline Object
+
+GD::Polyline defines the following class:
+
+=over 5
+
+=item C<GD::Polyline>
+
+A polyline object, used for storing lists of vertices prior to
+rendering a polyline into an image.
+
+=item C<new>
+
+C<GD::Polyline-E<gt>new> I<class method>
+
+Create an empty polyline with no vertices.
+
+ $polyline = new GD::Polyline;
+
+ $polyline->addPt( 0, 0);
+ $polyline->addPt( 0,100);
+ $polyline->addPt( 50,100);
+ $polyline->addPt(100, 0);
+
+ $image->polydraw($polyline,$black);
+
+In fact GD::Polyline is a subclass of GD::Polygon,
+so all polygon methods (such as B<offset> and B<transform>)
+may be used on polylines.
+Some new methods have thus been added to GD::Polygon (such as B<rotate>)
+and a few updated/modified/enhanced (such as B<scale>) I<in this module>.
+See section "New or Updated GD::Polygon Methods" for more info.
+
+=back
+
+Note that this module is very "young" and should be
+considered subject to change in future releases, and/or
+possibly folded in to the existing polygon object and/or GD module.
+
+=head1 Updated Polygon Methods
+
+The following methods (defined in GD.pm) are OVERRIDDEN if you use this module.
+
+All effort has been made to provide 100% backward compatibility, but if you
+can confirm that has not been achieved, please consider that a bug and let the
+the author of Polyline.pm know.
+
+=over 5
+
+=item C<scale>
+
+C<$poly-E<gt>scale($sx, $sy, $cx, $cy)> I<object method -- UPDATE to GD::Polygon::scale>
+
+Scale a polything in along x-axis by $sx and along the y-axis by $sy,
+about centery point ($cx, $cy).
+
+Center point ($cx, $cy) is optional -- if these are omitted, the function
+will scale about the origin.
+
+To flip a polything, use a scale factor of -1. For example, to
+flip the polything top to bottom about line y = 100, use:
+
+ $poly->scale(1, -1, 0, 100);
+
+=back
+
+=head1 New Polygon Methods
+
+The following methods are added to GD::Polygon, and thus can be used
+by polygons and polylines.
+
+Don't forget: a polyline is a GD::Polygon, so GD::Polygon methods
+like offset() can be used, and they can be used in
+GD::Image methods like filledPolygon().
+
+=over 5
+
+=item C<rotate>
+
+C<$poly-E<gt>rotate($angle, $cx, $cy)> I<object method>
+
+Rotate a polything through $angle (clockwise, in radians) about center point ($cx, $cy).
+
+Center point ($cx, $cy) is optional -- if these are omitted, the function
+will rotate about the origin
+
+In this function and other angle-oriented functions in GD::Polyline,
+positive $angle corrensponds to clockwise rotation. This is opposite
+of the usual Cartesian sense, but that is because the raster is opposite
+of the usual Cartesian sense in that the y-axis goes "down".
+
+=item C<centroid>
+
+C<($cx, $cy) = $poly-E<gt>centroid($scale)> I<object method>
+
+Calculate and return ($cx, $cy), the centroid of the vertices of the polything.
+For example, to rotate something 180 degrees about it's centroid:
+
+ $poly->rotate(3.14159, $poly->centroid());
+
+$scale is optional; if supplied, $cx and $cy are multiplied by $scale
+before returning. The main use of this is to shift an polything to the
+origin like this:
+
+ $poly->offset($poly->centroid(-1));
+
+=item C<segLength>
+
+C<@segLengths = $poly-E<gt>segLength()> I<object method>
+
+In array context, returns an array the lengths of the segments in the polything.
+Segment n is the segment from vertex n to vertex n+1.
+Polygons have as many segments as vertices; polylines have one fewer.
+
+In a scalar context, returns the sum of the array that would have been returned
+in the array context.
+
+=item C<segAngle>
+
+C<@segAngles = $poly-E<gt>segAngle()> I<object method>
+
+Returns an array the angles of each segment from the x-axis.
+Segment n is the segment from vertex n to vertex n+1.
+Polygons have as many segments as vertices; polylines have one fewer.
+
+Returned angles will be on the interval 0 <= $angle < 2 * pi and
+angles increase in a clockwise direction.
+
+=item C<vertexAngle>
+
+C<@vertexAngles = $poly-E<gt>vertexAngle()> I<object method>
+
+Returns an array of the angles between the segment into and out of each vertex.
+For polylines, the vertex angle at vertex 0 and the last vertex are not defined;
+however $vertexAngle[0] will be undef so that $vertexAngle[1] will correspond to
+vertex 1.
+
+Returned angles will be on the interval 0 <= $angle < 2 * pi and
+angles increase in a clockwise direction.
+
+Note that this calculation does not attempt to figure out the "interior" angle
+with respect to "inside" or "outside" the polygon, but rather,
+just the angle between the adjacent segments
+in a clockwise sense. Thus a polygon with all right angles will have vertex
+angles of either pi/2 or 3*pi/2, depending on the way the polygon was "wound".
+
+=item C<toSpline>
+
+C<$poly-E<gt>toSpline()> I<object method & factory method>
+
+Create a new polything which is a reasonably smooth curve
+using cubic spline algorithms, often referred to as Bezier
+curves. The "source" polything is called the "control polything".
+If it is a polyline, the control polyline must
+have 4, 7, 10, or some number of vertices of equal to 3n+1.
+If it is a polygon, the control polygon must
+have 3, 6, 9, or some number of vertices of equal to 3n.
+
+ $spline = $poly->toSpline();
+ $image->polydraw($spline,$red);
+
+In brief, groups of four points from the control polyline
+are considered "control
+points" for a given portion of the spline: the first and
+fourth are "anchor points", and the spline passes through
+them; the second and third are "director points". The
+spline does not pass through director points, however the
+spline is tangent to the line segment from anchor point to
+adjacent director point.
+
+The next portion of the spline reuses the previous portion's
+last anchor point. The spline will have a cusp
+(non-continuous slope) at an anchor point, unless the anchor
+points and its adjacent director point are colinear.
+
+In the current implementation, toSpline() return a fixed
+number of segments in the returned polyline per set-of-four
+control points. In the future, this and other parameters of
+the algorithm may be configurable.
+
+=item C<addControlPoints>
+
+C<$polyline-E<gt>addControlPoints()> I<object method & factory method>
+
+So you say: "OK. Splines sound cool. But how can I
+get my anchor points and its adjacent director point to be
+colinear so that I have a nice smooth curves from my
+polyline?" Relax! For The Lazy: addControlPoints() to the
+rescue.
+
+addControlPoints() returns a polyline that can serve
+as the control polyline for toSpline(), which returns
+another polyline which is the spline. Is your head spinning
+yet? Think of it this way:
+
+=over 5
+
+=item +
+
+If you have a polyline, and you have already put your
+control points where you want them, call toSpline() directly.
+Remember, only every third vertex will be "on" the spline.
+
+You get something that looks like the spline "inscribed"
+inside the control polyline.
+
+=item +
+
+If you have a polyline, and you want all of its vertices on
+the resulting spline, call addControlPoints() and then
+toSpline():
+
+ $control = $polyline->addControlPoints();
+ $spline = $control->toSpline();
+ $image->polyline($spline,$red);
+
+You get something that looks like the control polyline "inscribed"
+inside the spline.
+
+=back
+
+Adding "good" control points is subjective; this particular
+algorithm reveals its author's tastes.
+In the future, you may be able to alter the taste slightly
+via parameters to the algorithm. For The Hubristic: please
+build a better one!
+
+And for The Impatient: note that addControlPoints() returns a
+polyline, so you can pile up the the call like this,
+if you'd like:
+
+ $image->polyline($polyline->addControlPoints()->toSpline(),$mauve);
+
+=back
+
+=head1 New GD::Image Methods
+
+=over 5
+
+=item C<polyline>
+
+C<$image-E<gt>polyline(polyline,color)> I<object method>
+
+ $image->polyline($polyline,$black)
+
+This draws a polyline with the specified color.
+Both real color indexes and the special
+colors gdBrushed, gdStyled and gdStyledBrushed can be specified.
+
+Neither the polyline() method or the polygon() method are very
+picky: you can call either method with either a GD::Polygon or a GD::Polyline.
+The I<method> determines if the shape is "closed" or "open" as drawn, I<not>
+the object type.
+
+=item C<polydraw>
+
+C<$image-E<gt>polydraw(polything,color)> I<object method>
+
+ $image->polydraw($poly,$black)
+
+This method draws the polything as expected (polygons are closed,
+polylines are open) by simply checking the object type and calling
+either $image->polygon() or $image->polyline().
+
+=back
+
+=head1 Examples
+
+Please see file "polyline-examples.pl" that is included with the distribution.
+
+=head1 See Also
+
+For more info on Bezier splines, see http://www.webreference.com/dlab/9902/bezier.html.
+
+=head1 Future Features
+
+On the drawing board are additional features such as:
+
+ - polygon winding algorithms (to determine if a point is "inside" or "outside" the polygon)
+
+ - new polygon from bounding box
+
+ - find bounding polygon (tightest fitting simple convex polygon for a given set of vertices)
+
+ - addPts() method to add many points at once
+
+ - clone() method for polygon
+
+ - functions to interwork GD with SVG
+
+Please provide input on other possible features you'd like to see.
+
+=head1 Author
+
+This module has been written by Daniel J. Harasty.
+Please send questions, comments, complaints, and kudos to him
+at harasty@cpan.org.
+
+Thanks to Lincoln Stein for input and patience with me and this,
+my first CPAN contribution.
+
+=head1 Copyright Information
+
+The Polyline.pm module is copyright 2002, Daniel J. Harasty. It is
+distributed under the same terms as Perl itself. See the "Artistic
+License" in the Perl source code distribution for licensing terms.
+
+The latest version of Polyline.pm is available at
+your favorite CPAN repository and/or
+along with GD.pm by Lincoln D. Stein at http://stein.cshl.org/WWW/software/GD.
+
+=cut
+
+# future:
+# addPts
+# boundingPolygon
+# addControlPoints('method' => 'fitToSegments', 'numSegs' => 10)
+# toSpline('csr' => 1/4);
+
+# GD::Color
+# colorMap('x11' | 'svg' | <filename> )
+# colorByName($image, 'orange');
+# setImage($image);
+# cbn('orange');
+#
+#
+#
diff --git a/Master/tlpkg/tlperl.straw/lib/GD/Simple.pm b/Master/tlpkg/tlperl.straw/lib/GD/Simple.pm
new file mode 100755
index 00000000000..ed0c3e9aa11
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/GD/Simple.pm
@@ -0,0 +1,1236 @@
+package GD::Simple;
+
+=head1 NAME
+
+GD::Simple - Simplified interface to GD library
+
+=head1 SYNOPSIS
+
+ use GD::Simple;
+
+ # create a new image
+ $img = GD::Simple->new(400,250);
+
+ # draw a red rectangle with blue borders
+ $img->bgcolor('red');
+ $img->fgcolor('blue');
+ $img->rectangle(10,10,50,50);
+
+ # draw an empty rectangle with green borders
+ $img->bgcolor(undef);
+ $img->fgcolor('green');
+ $img->rectangle(30,30,100,100);
+
+ # move to (80,80) and draw a green line to (100,190)
+ $img->moveTo(80,80);
+ $img->lineTo(100,190);
+
+ # draw a solid orange ellipse
+ $img->moveTo(110,100);
+ $img->bgcolor('orange');
+ $img->fgcolor('orange');
+ $img->ellipse(40,40);
+
+ # draw a black filled arc
+ $img->moveTo(150,150);
+ $img->fgcolor('black');
+ $img->arc(50,50,0,100,gdNoFill|gdEdged);
+
+ # draw a string at (10,180) using the default
+ # built-in font
+ $img->moveTo(10,180);
+ $img->string('This is very simple');
+
+ # draw a string at (280,210) using 20 point
+ # times italic, angled upward 90 degrees
+ $img->moveTo(280,210);
+ $img->font('Times:italic');
+ $img->fontsize(20);
+ $img->angle(-90);
+ $img->string('This is very fancy');
+
+ # some turtle graphics
+ $img->moveTo(300,100);
+ $img->penSize(3,3);
+ $img->angle(0);
+ $img->line(20); # 20 pixels going to the right
+ $img->turn(30); # set turning angle to 30 degrees
+ $img->line(20); # 20 pixel line
+ $img->line(20);
+ $img->line(20);
+ $img->turn(-90); # set turning angle to -90 degrees
+ $img->line(50); # 50 pixel line
+
+ # draw a cyan polygon edged in blue
+ my $poly = new GD::Polygon;
+ $poly->addPt(150,100);
+ $poly->addPt(199,199);
+ $poly->addPt(100,199);
+ $img->bgcolor('cyan');
+ $img->fgcolor('blue');
+ $img->penSize(1,1);
+ $img->polygon($poly);
+
+ # convert into png data
+ print $img->png;
+
+=head1 DESCRIPTION
+
+GD::Simple is a subclass of the GD library that shortens many of the
+long GD method calls by storing information about the pen color, size
+and position in the GD object itself. It also adds a small number of
+"turtle graphics" style calls for those who prefer to work in polar
+coordinates. In addition, the library allows you to use symbolic
+names for colors, such as "chartreuse", and will manage the colors for
+you.
+
+=head2 The Pen
+
+GD::Simple maintains a "pen" whose settings are used for line- and
+shape-drawing operations. The pen has the following properties:
+
+=over 4
+
+=item fgcolor
+
+The pen foreground color is the color of lines and the borders of
+filled and unfilled shapes.
+
+=item bgcolor
+
+The pen background color is the color of the contents of filled
+shapes.
+
+=item pensize
+
+The pen size is the width of the pen. Larger sizes draw thicker
+lines.
+
+=item position
+
+The pen position is its current position on the canvas in (X,Y)
+coordinates.
+
+=item angle
+
+When drawing in turtle mode, the pen angle determines the current
+direction of lines of relative length.
+
+=item turn
+
+When drawing in turtle mode, the turn determines the clockwise or
+counterclockwise angle that the pen will turn before drawing the next
+line.
+
+=item font
+
+The font to use when drawing text. Both built-in bitmapped fonts and
+TrueType fonts are supported.
+
+=item fontsize
+
+The size of the font to use when drawing with TrueType fonts.
+
+=back
+
+One sets the position and properties of the pen and then draws. As
+the drawing progresses, the position of the pen is updated.
+
+=head2 Methods
+
+GD::Simple introduces a number of new methods, a few of which have the
+same name as GD::Image methods, and hence change their behavior. In
+addition to these new methods, GD::Simple objects support all of the
+GD::Image methods. If you make a method call that isn't directly
+supported by GD::Simple, it refers the request to the underlying
+GD::Image object. Hence one can load a JPEG image into GD::Simple and
+declare it to be TrueColor by using this call, which is effectively
+inherited from GD::Image:
+
+ my $img = GD::Simple->newFromJpeg('./myimage.jpg',1);
+
+The rest of this section describes GD::Simple-specific methods.
+
+=cut
+
+use strict;
+use GD;
+use GD::Group;
+use Math::Trig;
+use Carp 'croak';
+
+our @ISA = 'Exporter';
+our @EXPORT = @GD::EXPORT;
+our @EXPORT_OK = @GD::EXPORT_OK;
+our $AUTOLOAD;
+
+my %COLORS;
+my $IMAGECLASS = 'GD::Image';
+my $TRANSPARENT;
+
+sub AUTOLOAD {
+ my $self = shift;
+ my($pack,$func_name) = $AUTOLOAD=~/(.+)::([^:]+)$/;
+ return if $func_name eq 'DESTROY';
+
+ if (ref $self && exists $self->{gd}) {
+ $self->{gd}->$func_name(@_);
+ } else {
+ my @result = $IMAGECLASS->$func_name(@_);
+ if (UNIVERSAL::isa($result[0],'GD::Image')) {
+ return $self->new($result[0]);
+ } else {
+ return @result;
+ }
+ }
+}
+
+=over 4
+
+=item $img = GD::Simple->new($x,$y [,$truecolor])
+
+=item $img = GD::Simple->new($gd)
+
+Create a new GD::Simple object. There are two forms of new(). In the
+first form, pass the width and height of the desired canvas, and
+optionally a boolean flag to request a truecolor image. In the second
+form, pass a previously-created GD::Image object.
+
+=cut
+
+# dual-purpose code - beware
+sub new {
+ my $pack = shift;
+
+ unshift @_,(100,100) if @_ == 0;
+
+ if (@_ >= 2) { # traditional GD::Image->new() call
+ my $gd = $IMAGECLASS->new(@_);
+ my $self = $pack->new($gd);
+ $self->clear;
+ return $self;
+ }
+
+ if (@_ == 1) { # initialize from existing image
+ my $gd = shift;
+ my $self = bless {
+ gd => $gd,
+ xy => [0,0],
+ font => gdSmallFont,
+ fontsize => 9,
+ turningangle => 0,
+ angle => 0,
+ pensize => 1,
+ },$pack;
+ $self->{bgcolor} = $self->translate_color(255,255,255);
+ $self->{fgcolor} = $self->translate_color(0,0,0);
+ return $self;
+ }
+}
+
+=item GD::Simple->class('GD');
+
+=item GD::Simple->class('GD::SVG');
+
+Select whether new() should use GD or GD::SVG internally. Call
+GD::Simple->class('GD::SVG') before calling new() if you wish to
+generate SVG images.
+
+If future GD subclasses are created, this method will subport them.
+
+=cut
+
+sub class {
+ my $pack = shift;
+ if (@_) {
+ $IMAGECLASS = shift;
+ eval "require $IMAGECLASS; 1" or die $@;
+ $IMAGECLASS = "$IMAGECLASS\:\:Image"
+ if $IMAGECLASS eq 'GD::SVG';
+ }
+ $IMAGECLASS;
+}
+
+=item $img->moveTo($x,$y)
+
+This call changes the position of the pen without drawing. It moves
+the pen to position ($x,$y) on the drawing canvas.
+
+=cut
+
+sub moveTo {
+ my $self = shift;
+ croak 'Usage GD::Simple->moveTo($x,$y)' unless @_ == 2;
+ my ($x,$y) = @_;
+ $self->{xy} = [$x,$y];
+}
+
+=item $img->move($dx,$dy)
+
+=item $img->move($dr)
+
+This call changes the position of the pen without drawing. When called
+with two arguments it moves the pen $dx pixels to the right and $dy
+pixels downward. When called with one argument it moves the pen $dr
+pixels along the vector described by the current pen angle.
+
+=cut
+
+sub move {
+ my $self = shift;
+ if (@_ == 1) { # polar coordinates -- this is r
+ $self->{angle} += $self->{turningangle};
+ my $angle = deg2rad($self->{angle});
+ $self->{xy}[0] += $_[0] * cos($angle);
+ $self->{xy}[1] += $_[0] * sin($angle);
+ }
+ elsif (@_ == 2) { # cartesian coordinates
+ $self->{xy}[0] += $_[0];
+ $self->{xy}[1] += $_[1];
+ } else {
+ croak 'Usage GD::Simple->move($dx,$dy) or move($r)';
+ }
+}
+
+=item $img->lineTo($x,$y)
+
+The lineTo() call simultaneously draws and moves the pen. It draws a
+line from the current pen position to the position defined by ($x,$y)
+using the current pen size and color. After drawing, the position of
+the pen is updated to the new position.
+
+=cut
+
+sub lineTo {
+ my $self = shift;
+ croak 'Usage GD::Simple->lineTo($x,$y)' unless @_ == 2;
+ $self->gd->line($self->curPos,@_,$self->fgcolor);
+ $self->moveTo(@_);
+}
+
+=item $img->line($dx,$dy)
+
+=item $img->line($dr)
+
+The line() call simultaneously draws and moves the pen. When called
+with two arguments it draws a line from the current position of the
+pen to the position $dx pixels to the right and $dy pixels down. When
+called with one argument, it draws a line $dr pixels long along the
+angle defined by the current pen angle.
+
+=cut
+
+sub line {
+ my $self = shift;
+ croak 'Usage GD::Simple->line($dx,$dy) or line($r)' unless @_ >= 1;
+ my @curPos = $self->curPos;
+ $self->move(@_);
+ my @newPos = $self->curPos;
+ $self->gd->line(@curPos,@newPos,$self->fgcolor);
+}
+
+=item $img->clear
+
+This method clears the canvas by painting over it with the current
+background color.
+
+=cut
+
+sub clear {
+ my $self = shift;
+ $self->gd->filledRectangle(0,0,$self->getBounds,$self->bgcolor);
+}
+
+=item $img->rectangle($x1,$y1,$x2,$y2)
+
+This method draws the rectangle defined by corners ($x1,$y1),
+($x2,$y2). The rectangle's edges are drawn in the foreground color and
+its contents are filled with the background color. To draw a solid
+rectangle set bgcolor equal to fgcolor. To draw an unfilled rectangle
+(transparent inside), set bgcolor to undef.
+
+=cut
+
+sub rectangle {
+ my $self = shift;
+ croak 'Usage GD::Simple->rectangle($x1,$y1,$x2,$y2)' unless @_ == 4;
+ my $gd = $self->gd;
+ my ($bg,$fg) = ($self->bgcolor,$self->fgcolor);
+ $gd->filledRectangle(@_,$bg) if defined $bg;
+ $gd->rectangle(@_,$fg) if defined $fg && (!defined $bg || $bg != $fg);
+}
+
+=item $img->ellipse($width,$height)
+
+This method draws the ellipse centered at the current location with
+width $width and height $height. The ellipse's border is drawn in the
+foreground color and its contents are filled with the background
+color. To draw a solid ellipse set bgcolor equal to fgcolor. To draw
+an unfilled ellipse (transparent inside), set bgcolor to undef.
+
+=cut
+
+sub ellipse {
+ my $self = shift;
+ croak 'Usage GD::Simple->ellipse($width,$height)' unless @_ == 2;
+ my $gd = $self->gd;
+ my ($bg,$fg) = ($self->bgcolor,$self->fgcolor);
+ $gd->filledEllipse($self->curPos,@_,$bg) if defined $bg;
+ $gd->ellipse($self->curPos,@_,$fg) if defined $fg && (!defined $bg || $bg != $fg);
+}
+
+=item $img->arc($cx,$cy,$width,$height,$start,$end [,$style])
+
+This method draws filled and unfilled arcs. See L<GD> for a
+description of the arguments. To draw a solid arc (such as a pie
+wedge) set bgcolor equal to fgcolor. To draw an unfilled arc, set
+bgcolor to undef.
+
+=cut
+
+sub arc {
+ my $self = shift;
+ croak 'Usage GD::Simple->arc($width,$height,$start,$end,$style)' unless @_ >= 4;
+ my ($width,$height,$start,$end,$style) = @_;
+ my $gd = $self->gd;
+ my ($bg,$fg) = ($self->bgcolor,$self->fgcolor);
+ my ($cx,$cy) = $self->curPos;
+
+ if ($bg) {
+ my @args = ($cx,$cy,$width,$height,$start,$end,$bg);
+ push @args,$style if defined $style;
+ $gd->filledArc(@args);
+ } else {
+ my @args = ($cx,$cy,$width,$height,$start,$end,$fg);
+ $gd->arc(@args);
+ }
+}
+
+=item $img->polygon($poly)
+
+This method draws filled and unfilled polygon using the current
+settings of fgcolor for the polygon border and bgcolor for the polygon
+fill color. See L<GD> for a description of creating polygons. To draw
+a solid polygon set bgcolor equal to fgcolor. To draw an unfilled
+polygon, set bgcolor to undef.
+
+=cut
+
+sub polygon {
+ my $self = shift;
+ croak 'Usage GD::Simple->polygon($poly)' unless @_ == 1;
+ my $gd = $self->gd;
+ my ($bg,$fg) = ($self->bgcolor,$self->fgcolor);
+ $gd->filledPolygon(@_,$bg) if defined $bg;
+ $gd->openPolygon(@_,$fg) if defined $fg && (!defined $bg || $bg != $fg);
+}
+
+=item $img->polyline($poly)
+
+This method draws polygons without closing the first and last vertices
+(similar to GD::Image->unclosedPolygon()). It uses the fgcolor to draw
+the line.
+
+=cut
+
+sub polyline {
+ my $self = shift;
+ croak 'Usage GD::Simple->polyline($poly)' unless @_ == 1;
+ my $gd = $self->gd;
+ my $fg = $self->fgcolor;
+ $gd->unclosedPolygon(@_,$fg);
+}
+
+=item $img->string($string)
+
+This method draws the indicated string starting at the current
+position of the pen. The pen is moved to the end of the drawn string.
+Depending on the font selected with the font() method, this will use
+either a bitmapped GD font or a TrueType font. The angle of the pen
+will be consulted when drawing the text. For TrueType fonts, any angle
+is accepted. For GD bitmapped fonts, the angle can be either 0 (draw
+horizontal) or -90 (draw upwards).
+
+For consistency between the TrueType and GD font behavior, the string
+is always drawn so that the current position of the pen corresponds to
+the bottom left of the first character of the text. This is different
+from the GD behavior, in which the first character of bitmapped fonts
+hangs down from the pen point.
+
+This method returns a polygon indicating the bounding box of the
+rendered text. If an error occurred (such as invalid font
+specification) it returns undef and an error message in $@.
+
+=cut
+
+sub string {
+ my $self = shift;
+ my $string = shift;
+ my $font = $self->font;
+ my @bounds;
+ if (ref $font && $font->isa('GD::Font')) {
+ my ($x,$y) = $self->curPos;
+ if ($self->angle == -90) {
+ $x -= $font->height;
+ $y -= $font->width;
+ $self->gd->stringUp($font,$x,$y,$string,$self->fgcolor);
+ $self->{xy}[1] -= length($string) * $font->width;
+ @bounds = ( ($self->{xy}[0],$y), ($x,$y), ($x,$self->{xy}[1]-$font->width), ($self->{xy}[0],$self->{xy}[1]-$font->width) );
+ } else {
+ $y -= $font->height;
+ $self->gd->string($font,$x,$y,$string,$self->fgcolor);
+ $self->{xy}[0] += length($string) * $font->width;
+ @bounds = ( ($x,$self->{xy}[1]), ($self->{xy}[0],$self->{xy}[1]), ($self->{xy}[0],$y), ($x,$y) );
+ }
+ }
+ else {
+ $self->useFontConfig(1);
+ @bounds = $self->stringFT($self->fgcolor,$font,
+ $self->fontsize,-deg2rad($self->angle), # -pi * $self->angle/180,
+ $self->curPos,$string);
+ return unless @bounds;
+ my ($delta_x,$delta_y) = $self->_string_width(@bounds);
+ $self->{xy}[0] += $delta_x;
+ $self->{xy}[1] += $delta_y;
+ }
+ my $poly = GD::Polygon->new;
+ while (@bounds) {
+ $poly->addPt(splice(@bounds,0,2));
+ }
+ return $poly;
+}
+
+=item $metrics = $img->fontMetrics
+
+=item ($metrics,$width,$height) = GD::Simple->fontMetrics($font,$fontsize,$string)
+
+This method returns information about the current font, most commonly
+a TrueType font. It can be invoked as an instance method (on a
+previously-created GD::Simple object) or as a class method (on the
+'GD::Simple' class).
+
+When called as an instance method, fontMetrics() takes no arguments
+and returns a single hash reference containing the metrics that
+describe the currently selected font and size. The hash reference
+contains the following information:
+
+ xheight the base height of the font from the bottom to the top of
+ a lowercase 'm'
+
+ ascent the length of the upper stem of the lowercase 'd'
+
+ descent the length of the lower step of the lowercase 'j'
+
+ lineheight the distance from the bottom of the 'j' to the top of
+ the 'd'
+
+ leading the distance between two adjacent lines
+
+=cut
+
+# return %$fontmetrics
+# keys: 'ascent', 'descent', 'lineheight', 'xheight', 'leading'
+sub fontMetrics {
+ my $self = shift;
+
+ unless (ref $self) { #class invocation -- create a scratch
+ $self = $self->new;
+ $self->font(shift) if defined $_[0];
+ $self->fontsize(shift) if defined $_[0];
+ }
+
+ my $font = $self->font;
+ my $metrics;
+
+ if (ref $font && $font->isa('GD::Font')) {
+ my $height = $font->height;
+ $metrics = {ascent => 0,
+ descent => 0,
+ lineheight => $height,
+ xheight => $height,
+ leading => 0};
+ }
+ else {
+ $self->useFontConfig(1);
+ my @mbounds = GD::Image->stringFT($self->fgcolor,$font,
+ $self->fontsize,0,
+ 0,0,'m');
+ my $xheight = $mbounds[3]-$mbounds[5];
+ my @jbounds = GD::Image->stringFT($self->fgcolor,$font,
+ $self->fontsize,0,
+ 0,0,'j');
+ my $ascent = $mbounds[7]-$jbounds[7];
+ my $descent = $jbounds[3]-$mbounds[3];
+
+ my @mmbounds = GD::Image->stringFT($self->fgcolor,$font,
+ $self->fontsize,0,
+ 0,0,"m\nm");
+ my $twolines = $mmbounds[3]-$mmbounds[5];
+ my $lineheight = $twolines - 2*$xheight;
+ my $leading = $lineheight - $ascent - $descent;
+ $metrics = {ascent => $ascent,
+ descent => $descent,
+ lineheight => $lineheight,
+ xheight => $xheight,
+ leading => $leading};
+ }
+
+ if ((my $string = shift) && wantarray) {
+ my ($width,$height) = $self->stringBounds($string);
+ return ($metrics,abs($width),abs($height));
+ }
+ return $metrics;
+}
+
+=item ($delta_x,$delta_y)= $img->stringBounds($string)
+
+This method indicates the X and Y offsets (which may be negative) that
+will occur when the given string is drawn using the current font,
+fontsize and angle. When the string is drawn horizontally, it gives
+the width and height of the string's bounding box.
+
+=cut
+
+sub stringBounds {
+ my $self = shift;
+ my $string = shift;
+ my $font = $self->font;
+ if (ref $font && $font->isa('GD::Font')) {
+ if ($self->angle == -90) {
+ return ($font->height,-length($string) * $font->width);
+ } else {
+ return (length($string) * $font->width,$font->height);
+ }
+ }
+ else {
+ $self->useFontConfig(1);
+ my @bounds = GD::Image->stringFT($self->fgcolor,$font,
+ $self->fontsize,-deg2rad($self->angle),
+ $self->curPos,$string);
+ return $self->_string_width(@bounds);
+ }
+}
+
+=item $delta_x = $img->stringWidth($string)
+
+This method indicates the width of the string given the current font,
+fontsize and angle. It is the same as ($img->stringBounds($string))[0]
+
+=cut
+
+sub stringWidth {
+ return ((shift->stringBounds(@_))[0]);
+}
+
+
+sub _string_width {
+ my $self = shift;
+ my @bounds = @_;
+ my $delta_x = abs($bounds[2]-$bounds[0]);
+ my $delta_y = abs($bounds[5]-$bounds[3]);
+ my $angle = $self->angle % 360;
+ if ($angle >= 0 && $angle < 90) {
+ return ($delta_x,$delta_y);
+
+ } elsif ($angle >= 90 && $angle < 180) {
+ return (-$delta_x,$delta_y);
+
+ } elsif ($angle >= 180 && $angle < 270) {
+ return (-$delta_x,-$delta_y);
+
+ } elsif ($angle >= 270 && $angle < 360) {
+ return ($delta_x,-$delta_y);
+ }
+}
+
+=item ($x,$y) = $img->curPos
+
+Return the current position of the pen. Set the current position
+using moveTo().
+
+=cut
+
+sub curPos { @{shift->{xy}}; }
+
+=item $font = $img->font([$newfont] [,$newsize])
+
+Get or set the current font. Fonts can be GD::Font objects, TrueType
+font file paths, or fontconfig font patterns like "Times:italic" (see
+L<fontconfig>). The latter feature requires that you have the
+fontconfig library installed and are using libgd version 2.0.33 or
+higher.
+
+As a shortcut, you may pass two arguments to set the font and the
+fontsize simultaneously. The fontsize is only valid when drawing with
+TrueType fonts.
+
+=cut
+
+sub font {
+ my $self = shift;
+ $self->{font} = shift if @_;
+ $self->{fontsize} = shift if @_;
+ $self->{font};
+}
+
+=item $size = $img->fontsize([$newfontsize])
+
+Get or set the current font size. This is only valid for TrueType
+fonts.
+
+=cut
+
+sub fontsize {
+ my $self = shift;
+ $self->{fontsize} = shift if @_;
+ $self->{fontsize};
+}
+
+=item $size = $img->penSize([$newpensize])
+
+Get or set the current pen width for use during line drawing
+operations.
+
+=cut
+
+sub penSize {
+ my $self = shift;
+ if (@_) {
+ $self->{pensize} = shift;
+ $self->gd->setThickness($self->{pensize});
+ }
+ $self->{pensize};
+}
+
+=item $angle = $img->angle([$newangle])
+
+Set the current angle for use when calling line() or move() with a
+single argument.
+
+Here is an example of using turn() and angle() together to draw an
+octagon. The first line drawn is the downward-slanting top right
+edge. The last line drawn is the horizontal top of the octagon.
+
+ $img->moveTo(200,50);
+ $img->angle(0);
+ $img->turn(360/8);
+ for (1..8) { $img->line(50) }
+
+=cut
+
+sub angle {
+ my $self = shift;
+ $self->{angle} = shift if @_;
+ $self->{angle};
+}
+
+=item $angle = $img->turn([$newangle])
+
+Get or set the current angle to turn prior to drawing lines. This
+value is only used when calling line() or move() with a single
+argument. The turning angle will be applied to each call to line() or
+move() just before the actual drawing occurs.
+
+Angles are in degrees. Positive values turn the angle clockwise.
+
+=cut
+
+# degrees, not radians
+sub turn {
+ my $self = shift;
+ $self->{turningangle} = shift if @_;
+ $self->{turningangle};
+}
+
+=item $color = $img->fgcolor([$newcolor])
+
+Get or set the pen's foreground color. The current pen color can be
+set by (1) using an (r,g,b) triple; (2) using a previously-allocated
+color from the GD palette; or (3) by using a symbolic color name such
+as "chartreuse." The list of color names can be obtained using
+color_names(). The special color name 'transparent' will create a
+completely transparent color.
+
+=cut
+
+sub fgcolor {
+ my $self = shift;
+ $self->{fgcolor} = $self->translate_color(@_) if @_;
+ $self->{fgcolor};
+}
+
+=item $color = $img->bgcolor([$newcolor])
+
+Get or set the pen's background color. The current pen color can be
+set by (1) using an (r,g,b) triple; (2) using a previously-allocated
+color from the GD palette; or (3) by using a symbolic color name such
+as "chartreuse." The list of color names can be obtained using
+color_names(). The special color name 'transparent' will create a
+completely transparent color.
+
+=cut
+
+sub bgcolor {
+ my $self = shift;
+ $self->{bgcolor} = $self->translate_color(@_) if @_;
+ $self->{bgcolor};
+}
+
+=item $index = $img->translate_color(@args)
+
+Translates a color into a GD palette or TrueColor index. You may pass
+either an (r,g,b) triple or a symbolic color name. If you pass a
+previously-allocated index, the method will return it unchanged.
+
+=cut
+
+sub translate_color {
+ my $self = shift;
+ return unless defined $_[0];
+ my ($r,$g,$b);
+ if (@_ == 1 && $_[0] =~ /^-?\d+/) { # previously allocated index
+ return $_[0];
+ }
+ elsif (@_ == 3) { # (rgb triplet)
+ ($r,$g,$b) = @_;
+ }
+ elsif (lc $_[0] eq 'transparent') {
+ return $TRANSPARENT ||= $self->alphaColor('white',127);
+ }
+ else {
+ $self->read_color_table unless %COLORS;
+ die "unknown color" unless exists $COLORS{lc $_[0]};
+ ($r,$g,$b) = @{$COLORS{lc $_[0]}};
+ }
+ return $self->colorResolve($r,$g,$b);
+}
+
+sub transparent {
+ my $self = shift;
+ my $index = $self->translate_color(@_);
+ $self->gd->transparent($index);
+}
+
+=item $index = $img->alphaColor(@args,$alpha)
+
+Creates an alpha color. You may pass either an (r,g,b) triple or a
+symbolic color name, followed by an integer indicating its
+opacity. The opacity value ranges from 0 (fully opaque) to 127 (fully
+transparent).
+
+=cut
+
+sub alphaColor {
+ my $self = shift;
+ return unless defined $_[0];
+ my ($r,$g,$b,$a);
+ if (@_ == 4) { # (rgb triplet)
+ ($r,$g,$b,$a) = @_;
+ } else {
+ $self->read_color_table unless %COLORS;
+ die "unknown color" unless exists $COLORS{lc $_[0]};
+ ($r,$g,$b) = @{$COLORS{lc $_[0]}};
+ $a = $_[1];
+ }
+ return $self->colorAllocateAlpha($r,$g,$b,$a);
+}
+
+=item @names = GD::Simple->color_names
+
+=item $translate_table = GD::Simple->color_names
+
+Called in a list context, color_names() returns the list of symbolic
+color names recognized by this module. Called in a scalar context,
+the method returns a hash reference in which the keys are the color
+names and the values are array references containing [r,g,b] triples.
+
+=cut
+
+sub color_names {
+ my $self = shift;
+ $self->read_color_table unless %COLORS;
+ return wantarray ? sort keys %COLORS : \%COLORS;
+}
+
+=item $gd = $img->gd
+
+Return the internal GD::Image object. Usually you will not need to
+call this since all GD methods are automatically referred to this object.
+
+=cut
+
+sub gd { shift->{gd} }
+
+sub read_color_table {
+ my $class = shift;
+ while (<DATA>) {
+ chomp;
+ last if /^__END__/;
+ my ($name,$r,$g,$b) = split /\s+/;
+ $COLORS{$name} = [hex $r,hex $g,hex $b];
+ }
+}
+
+sub setBrush {
+ my $self = shift;
+ my $brush = shift;
+ if ($brush->isa('GD::Simple')) {
+ $self->gd->setBrush($brush->gd);
+ } else {
+ $self->gd->setBrush($brush);
+ }
+}
+
+=item ($red,$green,$blue) = GD::Simple->HSVtoRGB($hue,$saturation,$value)
+
+Convert a Hue/Saturation/Value (HSV) color into an RGB triple. The
+hue, saturation and value are integers from 0 to 255.
+
+=cut
+
+sub HSVtoRGB {
+ my $self = shift;
+ @_ == 3 or croak "Usage: GD::Simple->HSVtoRGB(\$hue,\$saturation,\$value)";
+
+ my ($h,$s,$v)=@_;
+ my ($r,$g,$b,$i,$f,$p,$q,$t);
+
+ if( $s == 0 ) {
+ ## achromatic (grey)
+ return ($v,$v,$v);
+ }
+ $h %= 255;
+ $s /= 255; ## scale saturation from 0.0-1.0
+ $h /= 255; ## scale hue from 0 to 1.0
+ $h *= 360; ## and now scale it to 0 to 360
+
+ $h /= 60; ## sector 0 to 5
+ $i = $h % 6;
+ $f = $h - $i; ## factorial part of h
+ $p = $v * ( 1 - $s );
+ $q = $v * ( 1 - $s * $f );
+ $t = $v * ( 1 - $s * ( 1 - $f ) );
+
+ if($i<1) {
+ $r = $v;
+ $g = $t;
+ $b = $p;
+ } elsif($i<2){
+ $r = $q;
+ $g = $v;
+ $b = $p;
+ } elsif($i<3){
+ $r = $p;
+ $g = $v;
+ $b = $t;
+ } elsif($i<4){
+ $r = $p;
+ $g = $q;
+ $b = $v;
+ } elsif($i<5){
+ $r = $t;
+ $g = $p;
+ $b = $v;
+ } else {
+ $r = $v;
+ $g = $p;
+ $b = $q;
+ }
+ return (int($r+0.5),int($g+0.5),int($b+0.5));
+}
+
+=item ($hue,$saturation,$value) = GD::Simple->RGBtoHSV($hue,$saturation,$value)
+
+Convert a Red/Green/Blue (RGB) value into a Hue/Saturation/Value (HSV)
+triple. The hue, saturation and value are integers from 0 to 255.
+
+=back
+
+=cut
+
+sub RGBtoHSV {
+ my $self = shift;
+ my ($r, $g ,$bl) = @_;
+ my ($min,undef,$max) = sort {$a<=>$b} ($r,$g,$bl);
+ return (0,0,0) unless $max > 0;
+
+ my $v = $max;
+ my $s = 255 * ($max - $min)/$max;
+ my $h;
+ my $range = $max - $min;
+
+ if ($range == 0) { # all colors are equal, so monochrome
+ return (0,0,$max);
+ }
+
+ if ($max == $r) {
+ $h = 60 * ($g-$bl)/$range;
+ }
+ elsif ($max == $g) {
+ $h = 60 * ($bl-$r)/$range + 120;
+ }
+ else {
+ $h = 60 * ($r-$g)/$range + 240;
+ }
+
+ $h = int($h*255/360 + 0.5);
+
+ return ($h, $s, $v);
+}
+
+sub newGroup {
+ my $self = shift;
+ return $self->GD::newGroup(@_);
+}
+
+1;
+
+__DATA__
+white FF FF FF
+black 00 00 00
+aliceblue F0 F8 FF
+antiquewhite FA EB D7
+aqua 00 FF FF
+aquamarine 7F FF D4
+azure F0 FF FF
+beige F5 F5 DC
+bisque FF E4 C4
+blanchedalmond FF EB CD
+blue 00 00 FF
+blueviolet 8A 2B E2
+brown A5 2A 2A
+burlywood DE B8 87
+cadetblue 5F 9E A0
+chartreuse 7F FF 00
+chocolate D2 69 1E
+coral FF 7F 50
+cornflowerblue 64 95 ED
+cornsilk FF F8 DC
+crimson DC 14 3C
+cyan 00 FF FF
+darkblue 00 00 8B
+darkcyan 00 8B 8B
+darkgoldenrod B8 86 0B
+darkgray A9 A9 A9
+darkgreen 00 64 00
+darkkhaki BD B7 6B
+darkmagenta 8B 00 8B
+darkolivegreen 55 6B 2F
+darkorange FF 8C 00
+darkorchid 99 32 CC
+darkred 8B 00 00
+darksalmon E9 96 7A
+darkseagreen 8F BC 8F
+darkslateblue 48 3D 8B
+darkslategray 2F 4F 4F
+darkturquoise 00 CE D1
+darkviolet 94 00 D3
+deeppink FF 14 100
+deepskyblue 00 BF FF
+dimgray 69 69 69
+dodgerblue 1E 90 FF
+firebrick B2 22 22
+floralwhite FF FA F0
+forestgreen 22 8B 22
+fuchsia FF 00 FF
+gainsboro DC DC DC
+ghostwhite F8 F8 FF
+gold FF D7 00
+goldenrod DA A5 20
+gray 80 80 80
+green 00 80 00
+greenyellow AD FF 2F
+honeydew F0 FF F0
+hotpink FF 69 B4
+indianred CD 5C 5C
+indigo 4B 00 82
+ivory FF FF F0
+khaki F0 E6 8C
+lavender E6 E6 FA
+lavenderblush FF F0 F5
+lawngreen 7C FC 00
+lemonchiffon FF FA CD
+lightblue AD D8 E6
+lightcoral F0 80 80
+lightcyan E0 FF FF
+lightgoldenrodyellow FA FA D2
+lightgreen 90 EE 90
+lightgrey D3 D3 D3
+lightpink FF B6 C1
+lightsalmon FF A0 7A
+lightseagreen 20 B2 AA
+lightskyblue 87 CE FA
+lightslategray 77 88 99
+lightsteelblue B0 C4 DE
+lightyellow FF FF E0
+lime 00 FF 00
+limegreen 32 CD 32
+linen FA F0 E6
+magenta FF 00 FF
+maroon 80 00 00
+mediumaquamarine 66 CD AA
+mediumblue 00 00 CD
+mediumorchid BA 55 D3
+mediumpurple 100 70 DB
+mediumseagreen 3C B3 71
+mediumslateblue 7B 68 EE
+mediumspringgreen 00 FA 9A
+mediumturquoise 48 D1 CC
+mediumvioletred C7 15 85
+midnightblue 19 19 70
+mintcream F5 FF FA
+mistyrose FF E4 E1
+moccasin FF E4 B5
+navajowhite FF DE AD
+navy 00 00 80
+oldlace FD F5 E6
+olive 80 80 00
+olivedrab 6B 8E 23
+orange FF A5 00
+orangered FF 45 00
+orchid DA 70 D6
+palegoldenrod EE E8 AA
+palegreen 98 FB 98
+paleturquoise AF EE EE
+palevioletred DB 70 100
+papayawhip FF EF D5
+peachpuff FF DA B9
+peru CD 85 3F
+pink FF C0 CB
+plum DD A0 DD
+powderblue B0 E0 E6
+purple 80 00 80
+red FF 00 00
+rosybrown BC 8F 8F
+royalblue 41 69 E1
+saddlebrown 8B 45 13
+salmon FA 80 72
+sandybrown F4 A4 60
+seagreen 2E 8B 57
+seashell FF F5 EE
+sienna A0 52 2D
+silver C0 C0 C0
+skyblue 87 CE EB
+slateblue 6A 5A CD
+slategray 70 80 90
+snow FF FA FA
+springgreen 00 FF 7F
+steelblue 46 82 B4
+tan D2 B4 8C
+teal 00 80 80
+thistle D8 BF D8
+tomato FF 63 47
+turquoise 40 E0 D0
+violet EE 82 EE
+wheat F5 DE B3
+whitesmoke F5 F5 F5
+yellow FF FF 00
+yellowgreen 9A CD 32
+gradient1 00 ff 00
+gradient2 0a ff 00
+gradient3 14 ff 00
+gradient4 1e ff 00
+gradient5 28 ff 00
+gradient6 32 ff 00
+gradient7 3d ff 00
+gradient8 47 ff 00
+gradient9 51 ff 00
+gradient10 5b ff 00
+gradient11 65 ff 00
+gradient12 70 ff 00
+gradient13 7a ff 00
+gradient14 84 ff 00
+gradient15 8e ff 00
+gradient16 99 ff 00
+gradient17 a3 ff 00
+gradient18 ad ff 00
+gradient19 b7 ff 00
+gradient20 c1 ff 00
+gradient21 cc ff 00
+gradient22 d6 ff 00
+gradient23 e0 ff 00
+gradient24 ea ff 00
+gradient25 f4 ff 00
+gradient26 ff ff 00
+gradient27 ff f4 00
+gradient28 ff ea 00
+gradient29 ff e0 00
+gradient30 ff d6 00
+gradient31 ff cc 00
+gradient32 ff c1 00
+gradient33 ff b7 00
+gradient34 ff ad 00
+gradient35 ff a3 00
+gradient36 ff 99 00
+gradient37 ff 8e 00
+gradient38 ff 84 00
+gradient39 ff 7a 00
+gradient40 ff 70 00
+gradient41 ff 65 00
+gradient42 ff 5b 00
+gradient43 ff 51 00
+gradient44 ff 47 00
+gradient45 ff 3d 00
+gradient46 ff 32 00
+gradient47 ff 28 00
+gradient48 ff 1e 00
+gradient49 ff 14 00
+gradient50 ff 0a 00
+__END__
+
+=head1 COLORS
+
+This script will create an image showing all the symbolic colors.
+
+ #!/usr/bin/perl
+
+ use strict;
+ use GD::Simple;
+
+ my @color_names = GD::Simple->color_names;
+ my $cols = int(sqrt(@color_names));
+ my $rows = int(@color_names/$cols)+1;
+
+ my $cell_width = 100;
+ my $cell_height = 50;
+ my $legend_height = 16;
+ my $width = $cols * $cell_width;
+ my $height = $rows * $cell_height;
+
+ my $img = GD::Simple->new($width,$height);
+ $img->font(gdSmallFont);
+
+ for (my $c=0; $c<$cols; $c++) {
+ for (my $r=0; $r<$rows; $r++) {
+ my $color = $color_names[$c*$rows + $r] or next;
+ my @topleft = ($c*$cell_width,$r*$cell_height);
+ my @botright = ($topleft[0]+$cell_width,$topleft[1]+$cell_height-$legend_height);
+ $img->bgcolor($color);
+ $img->fgcolor($color);
+ $img->rectangle(@topleft,@botright);
+ $img->moveTo($topleft[0]+2,$botright[1]+$legend_height-2);
+ $img->fgcolor('black');
+ $img->string($color);
+ }
+ }
+
+ print $img->png;
+
+=head1 AUTHOR
+
+The GD::Simple module is copyright 2004, Lincoln D. Stein. It is
+distributed under the same terms as Perl itself. See the "Artistic
+License" in the Perl source code distribution for licensing terms.
+
+The latest versions of GD.pm are available at
+
+ http://stein.cshl.org/WWW/software/GD
+
+=head1 SEE ALSO
+
+L<GD>,
+L<GD::Polyline>,
+L<GD::SVG>,
+L<Image::Magick>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/AtomicFile.pm b/Master/tlpkg/tlperl.straw/lib/IO/AtomicFile.pm
new file mode 100755
index 00000000000..89ad6f0e8f5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/AtomicFile.pm
@@ -0,0 +1,196 @@
+package IO::AtomicFile;
+
+### DOCUMENTATION AT BOTTOM OF FILE
+
+# Be strict:
+use strict;
+
+# External modules:
+use IO::File;
+
+
+#------------------------------
+#
+# GLOBALS...
+#
+#------------------------------
+use vars qw($VERSION @ISA);
+
+# The package version, both in 1.23 style *and* usable by MakeMaker:
+$VERSION = "2.110";
+
+# Inheritance:
+@ISA = qw(IO::File);
+
+
+#------------------------------
+# new ARGS...
+#------------------------------
+# Class method, constructor.
+# Any arguments are sent to open().
+#
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new();
+ ${*$self}{'io_atomicfile_suffix'} = '';
+ $self->open(@_) if @_;
+ $self;
+}
+
+#------------------------------
+# DESTROY
+#------------------------------
+# Destructor.
+#
+sub DESTROY {
+ shift->close(1); ### like close, but raises fatal exception on failure
+}
+
+#------------------------------
+# open PATH, MODE
+#------------------------------
+# Class/instance method.
+#
+sub open {
+ my ($self, $path, $mode) = @_;
+ ref($self) or $self = $self->new; ### now we have an instance!
+
+ ### Create tmp path, and remember this info:
+ my $temp = "${path}..TMP" . ${*$self}{'io_atomicfile_suffix'};
+ ${*$self}{'io_atomicfile_temp'} = $temp;
+ ${*$self}{'io_atomicfile_path'} = $path;
+
+ ### Open the file! Returns filehandle on success, for use as a constructor:
+ $self->SUPER::open($temp, $mode) ? $self : undef;
+}
+
+#------------------------------
+# _closed [YESNO]
+#------------------------------
+# Instance method, private.
+# Are we already closed? Argument sets new value, returns previous one.
+#
+sub _closed {
+ my $self = shift;
+ my $oldval = ${*$self}{'io_atomicfile_closed'};
+ ${*$self}{'io_atomicfile_closed'} = shift if @_;
+ $oldval;
+}
+
+#------------------------------
+# close
+#------------------------------
+# Instance method.
+# Close the handle, and rename the temp file to its final name.
+#
+sub close {
+ my ($self, $die) = @_;
+ unless ($self->_closed(1)) { ### sentinel...
+ $self->SUPER::close();
+ rename(${*$self}{'io_atomicfile_temp'},
+ ${*$self}{'io_atomicfile_path'})
+ or ($die ? die "close atomic file: $!\n" : return undef);
+ }
+ 1;
+}
+
+#------------------------------
+# delete
+#------------------------------
+# Instance method.
+# Close the handle, and delete the temp file.
+#
+sub delete {
+ my $self = shift;
+ unless ($self->_closed(1)) { ### sentinel...
+ $self->SUPER::close();
+ return unlink(${*$self}{'io_atomicfile_temp'});
+ }
+ 1;
+}
+
+#------------------------------
+# detach
+#------------------------------
+# Instance method.
+# Close the handle, but DO NOT delete the temp file.
+#
+sub detach {
+ my $self = shift;
+ $self->SUPER::close() unless ($self->_closed(1));
+ 1;
+}
+
+#------------------------------
+1;
+__END__
+
+
+=head1 NAME
+
+IO::AtomicFile - write a file which is updated atomically
+
+
+=head1 SYNOPSIS
+
+ use IO::AtomicFile;
+
+ ### Write a temp file, and have it install itself when closed:
+ my $FH = IO::AtomicFile->open("bar.dat", "w");
+ print $FH "Hello!\n";
+ $FH->close || die "couldn't install atomic file: $!";
+
+ ### Write a temp file, but delete it before it gets installed:
+ my $FH = IO::AtomicFile->open("bar.dat", "w");
+ print $FH "Hello!\n";
+ $FH->delete;
+
+ ### Write a temp file, but neither install it nor delete it:
+ my $FH = IO::AtomicFile->open("bar.dat", "w");
+ print $FH "Hello!\n";
+ $FH->detach;
+
+
+=head1 DESCRIPTION
+
+This module is intended for people who need to update files
+reliably in the face of unexpected program termination.
+
+For example, you generally don't want to be halfway in the middle of
+writing I</etc/passwd> and have your program terminate! Even
+the act of writing a single scalar to a filehandle is I<not> atomic.
+
+But this module gives you true atomic updates, via rename().
+When you open a file I</foo/bar.dat> via this module, you are I<actually>
+opening a temporary file I</foo/bar.dat..TMP>, and writing your
+output there. The act of closing this file (either explicitly
+via close(), or implicitly via the destruction of the object)
+will cause rename() to be called... therefore, from the point
+of view of the outside world, the file's contents are updated
+in a single time quantum.
+
+To ensure that problems do not go undetected, the "close" method
+done by the destructor will raise a fatal exception if the rename()
+fails. The explicit close() just returns undef.
+
+You can also decide at any point to trash the file you've been
+building.
+
+
+=head1 AUTHOR
+
+=head2 Primary Maintainer
+
+David F. Skoll (F<dfs@roaringpenguin.com>).
+
+=head2 Original Author
+
+Eryq (F<eryq@zeegee.com>).
+President, ZeeGee Software Inc (F<http://www.zeegee.com>).
+
+
+=head1 REVISION
+
+$Revision: 1.2 $
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Adapter/Bzip2.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Adapter/Bzip2.pm
new file mode 100755
index 00000000000..3e2e89f8e12
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Adapter/Bzip2.pm
@@ -0,0 +1,162 @@
+package IO::Compress::Adapter::Bzip2 ;
+
+use strict;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.024 qw(:Status);
+
+#use Compress::Bzip2 ;
+use Compress::Raw::Bzip2 2.024 ;
+
+our ($VERSION);
+$VERSION = '2.024';
+
+sub mkCompObject
+{
+ my $BlockSize100K = shift ;
+ my $WorkFactor = shift ;
+ my $Verbosity = shift ;
+
+ my ($def, $status) = new Compress::Raw::Bzip2(1, $BlockSize100K,
+ $WorkFactor, $Verbosity);
+ #my ($def, $status) = bzdeflateInit();
+ #-BlockSize100K => $params->value('BlockSize100K'),
+ #-WorkFactor => $params->value('WorkFactor');
+
+ return (undef, "Could not create Deflate object: $status", $status)
+ if $status != BZ_OK ;
+
+ return bless {'Def' => $def,
+ 'Error' => '',
+ 'ErrorNo' => 0,
+ } ;
+}
+
+sub compr
+{
+ my $self = shift ;
+
+ my $def = $self->{Def};
+
+ #my ($out, $status) = $def->bzdeflate(defined ${$_[0]} ? ${$_[0]} : "") ;
+ my $status = $def->bzdeflate($_[0], $_[1]) ;
+ $self->{ErrorNo} = $status;
+
+ if ($status != BZ_RUN_OK)
+ {
+ $self->{Error} = "Deflate Error: $status";
+ return STATUS_ERROR;
+ }
+
+ #${ $_[1] } .= $out if defined $out;
+
+ return STATUS_OK;
+}
+
+sub flush
+{
+ my $self = shift ;
+
+ my $def = $self->{Def};
+
+ #my ($out, $status) = $def->bzflush($opt);
+ #my $status = $def->bzflush($_[0], $opt);
+ my $status = $def->bzflush($_[0]);
+ $self->{ErrorNo} = $status;
+
+ if ($status != BZ_RUN_OK)
+ {
+ $self->{Error} = "Deflate Error: $status";
+ return STATUS_ERROR;
+ }
+
+ #${ $_[0] } .= $out if defined $out ;
+ return STATUS_OK;
+
+}
+
+sub close
+{
+ my $self = shift ;
+
+ my $def = $self->{Def};
+
+ #my ($out, $status) = $def->bzclose();
+ my $status = $def->bzclose($_[0]);
+ $self->{ErrorNo} = $status;
+
+ if ($status != BZ_STREAM_END)
+ {
+ $self->{Error} = "Deflate Error: $status";
+ return STATUS_ERROR;
+ }
+
+ #${ $_[0] } .= $out if defined $out ;
+ return STATUS_OK;
+
+}
+
+
+sub reset
+{
+ my $self = shift ;
+
+ my $outer = $self->{Outer};
+
+ my ($def, $status) = new Compress::Raw::Bzip2();
+ $self->{ErrorNo} = ($status == BZ_OK) ? 0 : $status ;
+
+ if ($status != BZ_OK)
+ {
+ $self->{Error} = "Cannot create Deflate object: $status";
+ return STATUS_ERROR;
+ }
+
+ $self->{Def} = $def;
+
+ return STATUS_OK;
+}
+
+sub compressedBytes
+{
+ my $self = shift ;
+ $self->{Def}->compressedBytes();
+}
+
+sub uncompressedBytes
+{
+ my $self = shift ;
+ $self->{Def}->uncompressedBytes();
+}
+
+#sub total_out
+#{
+# my $self = shift ;
+# 0;
+#}
+#
+
+#sub total_in
+#{
+# my $self = shift ;
+# $self->{Def}->total_in();
+#}
+#
+#sub crc32
+#{
+# my $self = shift ;
+# $self->{Def}->crc32();
+#}
+#
+#sub adler32
+#{
+# my $self = shift ;
+# $self->{Def}->adler32();
+#}
+
+
+1;
+
+__END__
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Adapter/Deflate.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Adapter/Deflate.pm
new file mode 100755
index 00000000000..f23a9819c67
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Adapter/Deflate.pm
@@ -0,0 +1,165 @@
+package IO::Compress::Adapter::Deflate ;
+
+use strict;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.024 qw(:Status);
+
+use Compress::Raw::Zlib 2.024 qw(Z_OK Z_FINISH MAX_WBITS) ;
+our ($VERSION);
+
+$VERSION = '2.024';
+
+sub mkCompObject
+{
+ my $crc32 = shift ;
+ my $adler32 = shift ;
+ my $level = shift ;
+ my $strategy = shift ;
+
+ my ($def, $status) = new Compress::Raw::Zlib::Deflate
+ -AppendOutput => 1,
+ -CRC32 => $crc32,
+ -ADLER32 => $adler32,
+ -Level => $level,
+ -Strategy => $strategy,
+ -WindowBits => - MAX_WBITS;
+
+ return (undef, "Cannot create Deflate object: $status", $status)
+ if $status != Z_OK;
+
+ return bless {'Def' => $def,
+ 'Error' => '',
+ } ;
+}
+
+sub compr
+{
+ my $self = shift ;
+
+ my $def = $self->{Def};
+
+ my $status = $def->deflate($_[0], $_[1]) ;
+ $self->{ErrorNo} = $status;
+
+ if ($status != Z_OK)
+ {
+ $self->{Error} = "Deflate Error: $status";
+ return STATUS_ERROR;
+ }
+
+ return STATUS_OK;
+}
+
+sub flush
+{
+ my $self = shift ;
+
+ my $def = $self->{Def};
+
+ my $opt = $_[1] || Z_FINISH;
+ my $status = $def->flush($_[0], $opt);
+ $self->{ErrorNo} = $status;
+
+ if ($status != Z_OK)
+ {
+ $self->{Error} = "Deflate Error: $status";
+ return STATUS_ERROR;
+ }
+
+ return STATUS_OK;
+
+}
+
+sub close
+{
+ my $self = shift ;
+
+ my $def = $self->{Def};
+
+ $def->flush($_[0], Z_FINISH)
+ if defined $def ;
+}
+
+sub reset
+{
+ my $self = shift ;
+
+ my $def = $self->{Def};
+
+ my $status = $def->deflateReset() ;
+ $self->{ErrorNo} = $status;
+ if ($status != Z_OK)
+ {
+ $self->{Error} = "Deflate Error: $status";
+ return STATUS_ERROR;
+ }
+
+ return STATUS_OK;
+}
+
+sub deflateParams
+{
+ my $self = shift ;
+
+ my $def = $self->{Def};
+
+ my $status = $def->deflateParams(@_);
+ $self->{ErrorNo} = $status;
+ if ($status != Z_OK)
+ {
+ $self->{Error} = "deflateParams Error: $status";
+ return STATUS_ERROR;
+ }
+
+ return STATUS_OK;
+}
+
+
+
+#sub total_out
+#{
+# my $self = shift ;
+# $self->{Def}->total_out();
+#}
+#
+#sub total_in
+#{
+# my $self = shift ;
+# $self->{Def}->total_in();
+#}
+
+sub compressedBytes
+{
+ my $self = shift ;
+
+ $self->{Def}->compressedBytes();
+}
+
+sub uncompressedBytes
+{
+ my $self = shift ;
+ $self->{Def}->uncompressedBytes();
+}
+
+
+
+
+sub crc32
+{
+ my $self = shift ;
+ $self->{Def}->crc32();
+}
+
+sub adler32
+{
+ my $self = shift ;
+ $self->{Def}->adler32();
+}
+
+
+1;
+
+__END__
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Adapter/Identity.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Adapter/Identity.pm
new file mode 100755
index 00000000000..16f14d8e7f3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Adapter/Identity.pm
@@ -0,0 +1,101 @@
+package IO::Compress::Adapter::Identity ;
+
+use strict;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.024 qw(:Status);
+our ($VERSION);
+
+$VERSION = '2.024';
+
+sub mkCompObject
+{
+ my $level = shift ;
+ my $strategy = shift ;
+
+ return bless {
+ 'CompSize' => 0,
+ 'UnCompSize' => 0,
+ 'Error' => '',
+ 'ErrorNo' => 0,
+ } ;
+}
+
+sub compr
+{
+ my $self = shift ;
+
+ if (defined ${ $_[0] } && length ${ $_[0] }) {
+ $self->{CompSize} += length ${ $_[0] } ;
+ $self->{UnCompSize} = $self->{CompSize} ;
+
+ if ( ref $_[1] )
+ { ${ $_[1] } .= ${ $_[0] } }
+ else
+ { $_[1] .= ${ $_[0] } }
+ }
+
+ return STATUS_OK ;
+}
+
+sub flush
+{
+ my $self = shift ;
+
+ return STATUS_OK;
+}
+
+sub close
+{
+ my $self = shift ;
+
+ return STATUS_OK;
+}
+
+sub reset
+{
+ my $self = shift ;
+
+ $self->{CompSize} = 0;
+ $self->{UnCompSize} = 0;
+
+ return STATUS_OK;
+}
+
+sub deflateParams
+{
+ my $self = shift ;
+
+ return STATUS_OK;
+}
+
+#sub total_out
+#{
+# my $self = shift ;
+# return $self->{UnCompSize} ;
+#}
+#
+#sub total_in
+#{
+# my $self = shift ;
+# return $self->{UnCompSize} ;
+#}
+
+sub compressedBytes
+{
+ my $self = shift ;
+ return $self->{UnCompSize} ;
+}
+
+sub uncompressedBytes
+{
+ my $self = shift ;
+ return $self->{UnCompSize} ;
+}
+
+1;
+
+
+__END__
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Base.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Base.pm
new file mode 100755
index 00000000000..5a20f60007b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Base.pm
@@ -0,0 +1,981 @@
+
+package IO::Compress::Base ;
+
+require 5.004 ;
+
+use strict ;
+use warnings;
+
+use IO::Compress::Base::Common 2.024 ;
+
+use IO::File ;
+use Scalar::Util qw(blessed readonly);
+
+#use File::Glob;
+#require Exporter ;
+use Carp ;
+use Symbol;
+use bytes;
+
+our (@ISA, $VERSION);
+@ISA = qw(Exporter IO::File);
+
+$VERSION = '2.024';
+
+#Can't locate object method "SWASHNEW" via package "utf8" (perhaps you forgot to load "utf8"?) at .../ext/Compress-Zlib/Gzip/blib/lib/Compress/Zlib/Common.pm line 16.
+
+sub saveStatus
+{
+ my $self = shift ;
+ ${ *$self->{ErrorNo} } = shift() + 0 ;
+ ${ *$self->{Error} } = '' ;
+
+ return ${ *$self->{ErrorNo} } ;
+}
+
+
+sub saveErrorString
+{
+ my $self = shift ;
+ my $retval = shift ;
+ ${ *$self->{Error} } = shift ;
+ ${ *$self->{ErrorNo} } = shift() + 0 if @_ ;
+
+ return $retval;
+}
+
+sub croakError
+{
+ my $self = shift ;
+ $self->saveErrorString(0, $_[0]);
+ croak $_[0];
+}
+
+sub closeError
+{
+ my $self = shift ;
+ my $retval = shift ;
+
+ my $errno = *$self->{ErrorNo};
+ my $error = ${ *$self->{Error} };
+
+ $self->close();
+
+ *$self->{ErrorNo} = $errno ;
+ ${ *$self->{Error} } = $error ;
+
+ return $retval;
+}
+
+
+
+sub error
+{
+ my $self = shift ;
+ return ${ *$self->{Error} } ;
+}
+
+sub errorNo
+{
+ my $self = shift ;
+ return ${ *$self->{ErrorNo} } ;
+}
+
+
+sub writeAt
+{
+ my $self = shift ;
+ my $offset = shift;
+ my $data = shift;
+
+ if (defined *$self->{FH}) {
+ my $here = tell(*$self->{FH});
+ return $self->saveErrorString(undef, "Cannot seek to end of output filehandle: $!", $!)
+ if $here < 0 ;
+ seek(*$self->{FH}, $offset, SEEK_SET)
+ or return $self->saveErrorString(undef, "Cannot seek to end of output filehandle: $!", $!) ;
+ defined *$self->{FH}->write($data, length $data)
+ or return $self->saveErrorString(undef, $!, $!) ;
+ seek(*$self->{FH}, $here, SEEK_SET)
+ or return $self->saveErrorString(undef, "Cannot seek to end of output filehandle: $!", $!) ;
+ }
+ else {
+ substr(${ *$self->{Buffer} }, $offset, length($data)) = $data ;
+ }
+
+ return 1;
+}
+
+sub output
+{
+ my $self = shift ;
+ my $data = shift ;
+ my $last = shift ;
+
+ return 1
+ if length $data == 0 && ! $last ;
+
+ if ( *$self->{FilterEnvelope} ) {
+ *_ = \$data;
+ &{ *$self->{FilterEnvelope} }();
+ }
+
+ if (length $data) {
+ if ( defined *$self->{FH} ) {
+ defined *$self->{FH}->write( $data, length $data )
+ or return $self->saveErrorString(0, $!, $!);
+ }
+ else {
+ ${ *$self->{Buffer} } .= $data ;
+ }
+ }
+
+ return 1;
+}
+
+sub getOneShotParams
+{
+ return ( 'MultiStream' => [1, 1, Parse_boolean, 1],
+ );
+}
+
+sub checkParams
+{
+ my $self = shift ;
+ my $class = shift ;
+
+ my $got = shift || IO::Compress::Base::Parameters::new();
+
+ $got->parse(
+ {
+ # Generic Parameters
+ 'AutoClose' => [1, 1, Parse_boolean, 0],
+ #'Encode' => [1, 1, Parse_any, undef],
+ 'Strict' => [0, 1, Parse_boolean, 1],
+ 'Append' => [1, 1, Parse_boolean, 0],
+ 'BinModeIn' => [1, 1, Parse_boolean, 0],
+
+ 'FilterEnvelope' => [1, 1, Parse_any, undef],
+
+ $self->getExtraParams(),
+ *$self->{OneShot} ? $self->getOneShotParams()
+ : (),
+ },
+ @_) or $self->croakError("${class}: $got->{Error}") ;
+
+ return $got ;
+}
+
+sub _create
+{
+ my $obj = shift;
+ my $got = shift;
+
+ *$obj->{Closed} = 1 ;
+
+ my $class = ref $obj;
+ $obj->croakError("$class: Missing Output parameter")
+ if ! @_ && ! $got ;
+
+ my $outValue = shift ;
+ my $oneShot = 1 ;
+
+ if (! $got)
+ {
+ $oneShot = 0 ;
+ $got = $obj->checkParams($class, undef, @_)
+ or return undef ;
+ }
+
+ my $lax = ! $got->value('Strict') ;
+
+ my $outType = whatIsOutput($outValue);
+
+ $obj->ckOutputParam($class, $outValue)
+ or return undef ;
+
+ if ($outType eq 'buffer') {
+ *$obj->{Buffer} = $outValue;
+ }
+ else {
+ my $buff = "" ;
+ *$obj->{Buffer} = \$buff ;
+ }
+
+ # Merge implies Append
+ my $merge = $got->value('Merge') ;
+ my $appendOutput = $got->value('Append') || $merge ;
+ *$obj->{Append} = $appendOutput;
+ *$obj->{FilterEnvelope} = $got->value('FilterEnvelope') ;
+
+ if ($merge)
+ {
+ # Switch off Merge mode if output file/buffer is empty/doesn't exist
+ if (($outType eq 'buffer' && length $$outValue == 0 ) ||
+ ($outType ne 'buffer' && (! -e $outValue || (-w _ && -z _))) )
+ { $merge = 0 }
+ }
+
+ # If output is a file, check that it is writable
+ #no warnings;
+ #if ($outType eq 'filename' && -e $outValue && ! -w _)
+ # { return $obj->saveErrorString(undef, "Output file '$outValue' is not writable" ) }
+
+
+
+ if ($got->parsed('Encode')) {
+ my $want_encoding = $got->value('Encode');
+ *$obj->{Encoding} = getEncoding($obj, $class, $want_encoding);
+ }
+
+ $obj->ckParams($got)
+ or $obj->croakError("${class}: " . $obj->error());
+
+
+ $obj->saveStatus(STATUS_OK) ;
+
+ my $status ;
+ if (! $merge)
+ {
+ *$obj->{Compress} = $obj->mkComp($got)
+ or return undef;
+
+ *$obj->{UnCompSize} = new U64 ;
+ *$obj->{CompSize} = new U64 ;
+
+ if ( $outType eq 'buffer') {
+ ${ *$obj->{Buffer} } = ''
+ unless $appendOutput ;
+ }
+ else {
+ if ($outType eq 'handle') {
+ *$obj->{FH} = $outValue ;
+ setBinModeOutput(*$obj->{FH}) ;
+ $outValue->flush() ;
+ *$obj->{Handle} = 1 ;
+ if ($appendOutput)
+ {
+ seek(*$obj->{FH}, 0, SEEK_END)
+ or return $obj->saveErrorString(undef, "Cannot seek to end of output filehandle: $!", $!) ;
+
+ }
+ }
+ elsif ($outType eq 'filename') {
+ no warnings;
+ my $mode = '>' ;
+ $mode = '>>'
+ if $appendOutput;
+ *$obj->{FH} = new IO::File "$mode $outValue"
+ or return $obj->saveErrorString(undef, "cannot open file '$outValue': $!", $!) ;
+ *$obj->{StdIO} = ($outValue eq '-');
+ setBinModeOutput(*$obj->{FH}) ;
+ }
+ }
+
+ *$obj->{Header} = $obj->mkHeader($got) ;
+ $obj->output( *$obj->{Header} )
+ or return undef;
+ }
+ else
+ {
+ *$obj->{Compress} = $obj->createMerge($outValue, $outType)
+ or return undef;
+ }
+
+ *$obj->{Closed} = 0 ;
+ *$obj->{AutoClose} = $got->value('AutoClose') ;
+ *$obj->{Output} = $outValue;
+ *$obj->{ClassName} = $class;
+ *$obj->{Got} = $got;
+ *$obj->{OneShot} = 0 ;
+
+ return $obj ;
+}
+
+sub ckOutputParam
+{
+ my $self = shift ;
+ my $from = shift ;
+ my $outType = whatIsOutput($_[0]);
+
+ $self->croakError("$from: output parameter not a filename, filehandle or scalar ref")
+ if ! $outType ;
+
+ #$self->croakError("$from: output filename is undef or null string")
+ #if $outType eq 'filename' && (! defined $_[0] || $_[0] eq '') ;
+
+ $self->croakError("$from: output buffer is read-only")
+ if $outType eq 'buffer' && readonly(${ $_[0] });
+
+ return 1;
+}
+
+
+sub _def
+{
+ my $obj = shift ;
+
+ my $class= (caller)[0] ;
+ my $name = (caller(1))[3] ;
+
+ $obj->croakError("$name: expected at least 1 parameters\n")
+ unless @_ >= 1 ;
+
+ my $input = shift ;
+ my $haveOut = @_ ;
+ my $output = shift ;
+
+ my $x = new IO::Compress::Base::Validator($class, *$obj->{Error}, $name, $input, $output)
+ or return undef ;
+
+ push @_, $output if $haveOut && $x->{Hash};
+
+ *$obj->{OneShot} = 1 ;
+
+ my $got = $obj->checkParams($name, undef, @_)
+ or return undef ;
+
+ $x->{Got} = $got ;
+
+# if ($x->{Hash})
+# {
+# while (my($k, $v) = each %$input)
+# {
+# $v = \$input->{$k}
+# unless defined $v ;
+#
+# $obj->_singleTarget($x, 1, $k, $v, @_)
+# or return undef ;
+# }
+#
+# return keys %$input ;
+# }
+
+ if ($x->{GlobMap})
+ {
+ $x->{oneInput} = 1 ;
+ foreach my $pair (@{ $x->{Pairs} })
+ {
+ my ($from, $to) = @$pair ;
+ $obj->_singleTarget($x, 1, $from, $to, @_)
+ or return undef ;
+ }
+
+ return scalar @{ $x->{Pairs} } ;
+ }
+
+ if (! $x->{oneOutput} )
+ {
+ my $inFile = ($x->{inType} eq 'filenames'
+ || $x->{inType} eq 'filename');
+
+ $x->{inType} = $inFile ? 'filename' : 'buffer';
+
+ foreach my $in ($x->{oneInput} ? $input : @$input)
+ {
+ my $out ;
+ $x->{oneInput} = 1 ;
+
+ $obj->_singleTarget($x, $inFile, $in, \$out, @_)
+ or return undef ;
+
+ push @$output, \$out ;
+ #if ($x->{outType} eq 'array')
+ # { push @$output, \$out }
+ #else
+ # { $output->{$in} = \$out }
+ }
+
+ return 1 ;
+ }
+
+ # finally the 1 to 1 and n to 1
+ return $obj->_singleTarget($x, 1, $input, $output, @_);
+
+ croak "should not be here" ;
+}
+
+sub _singleTarget
+{
+ my $obj = shift ;
+ my $x = shift ;
+ my $inputIsFilename = shift;
+ my $input = shift;
+
+ if ($x->{oneInput})
+ {
+ $obj->getFileInfo($x->{Got}, $input)
+ if isaFilename($input) and $inputIsFilename ;
+
+ my $z = $obj->_create($x->{Got}, @_)
+ or return undef ;
+
+
+ defined $z->_wr2($input, $inputIsFilename)
+ or return $z->closeError(undef) ;
+
+ return $z->close() ;
+ }
+ else
+ {
+ my $afterFirst = 0 ;
+ my $inputIsFilename = ($x->{inType} ne 'array');
+ my $keep = $x->{Got}->clone();
+
+ #for my $element ( ($x->{inType} eq 'hash') ? keys %$input : @$input)
+ for my $element ( @$input)
+ {
+ my $isFilename = isaFilename($element);
+
+ if ( $afterFirst ++ )
+ {
+ defined addInterStream($obj, $element, $isFilename)
+ or return $obj->closeError(undef) ;
+ }
+ else
+ {
+ $obj->getFileInfo($x->{Got}, $element)
+ if $isFilename;
+
+ $obj->_create($x->{Got}, @_)
+ or return undef ;
+ }
+
+ defined $obj->_wr2($element, $isFilename)
+ or return $obj->closeError(undef) ;
+
+ *$obj->{Got} = $keep->clone();
+ }
+ return $obj->close() ;
+ }
+
+}
+
+sub _wr2
+{
+ my $self = shift ;
+
+ my $source = shift ;
+ my $inputIsFilename = shift;
+
+ my $input = $source ;
+ if (! $inputIsFilename)
+ {
+ $input = \$source
+ if ! ref $source;
+ }
+
+ if ( ref $input && ref $input eq 'SCALAR' )
+ {
+ return $self->syswrite($input, @_) ;
+ }
+
+ if ( ! ref $input || isaFilehandle($input))
+ {
+ my $isFilehandle = isaFilehandle($input) ;
+
+ my $fh = $input ;
+
+ if ( ! $isFilehandle )
+ {
+ $fh = new IO::File "<$input"
+ or return $self->saveErrorString(undef, "cannot open file '$input': $!", $!) ;
+ }
+ binmode $fh if *$self->{Got}->valueOrDefault('BinModeIn') ;
+
+ my $status ;
+ my $buff ;
+ my $count = 0 ;
+ while ($status = read($fh, $buff, 16 * 1024)) {
+ $count += length $buff;
+ defined $self->syswrite($buff, @_)
+ or return undef ;
+ }
+
+ return $self->saveErrorString(undef, $!, $!)
+ if ! defined $status ;
+
+ if ( (!$isFilehandle || *$self->{AutoClose}) && $input ne '-')
+ {
+ $fh->close()
+ or return undef ;
+ }
+
+ return $count ;
+ }
+
+ croak "Should not be here";
+ return undef;
+}
+
+sub addInterStream
+{
+ my $self = shift ;
+ my $input = shift ;
+ my $inputIsFilename = shift ;
+
+ if (*$self->{Got}->value('MultiStream'))
+ {
+ $self->getFileInfo(*$self->{Got}, $input)
+ #if isaFilename($input) and $inputIsFilename ;
+ if isaFilename($input) ;
+
+ # TODO -- newStream needs to allow gzip/zip header to be modified
+ return $self->newStream();
+ }
+ elsif (*$self->{Got}->value('AutoFlush'))
+ {
+ #return $self->flush(Z_FULL_FLUSH);
+ }
+
+ return 1 ;
+}
+
+sub getFileInfo
+{
+}
+
+sub TIEHANDLE
+{
+ return $_[0] if ref($_[0]);
+ die "OOPS\n" ;
+}
+
+sub UNTIE
+{
+ my $self = shift ;
+}
+
+sub DESTROY
+{
+ my $self = shift ;
+ local ($., $@, $!, $^E, $?);
+
+ $self->close() ;
+
+ # TODO - memory leak with 5.8.0 - this isn't called until
+ # global destruction
+ #
+ %{ *$self } = () ;
+ undef $self ;
+}
+
+
+
+sub filterUncompressed
+{
+}
+
+sub syswrite
+{
+ my $self = shift ;
+
+ my $buffer ;
+ if (ref $_[0] ) {
+ $self->croakError( *$self->{ClassName} . "::write: not a scalar reference" )
+ unless ref $_[0] eq 'SCALAR' ;
+ $buffer = $_[0] ;
+ }
+ else {
+ $buffer = \$_[0] ;
+ }
+
+ $] >= 5.008 and ( utf8::downgrade($$buffer, 1)
+ or croak "Wide character in " . *$self->{ClassName} . "::write:");
+
+
+ if (@_ > 1) {
+ my $slen = defined $$buffer ? length($$buffer) : 0;
+ my $len = $slen;
+ my $offset = 0;
+ $len = $_[1] if $_[1] < $len;
+
+ if (@_ > 2) {
+ $offset = $_[2] || 0;
+ $self->croakError(*$self->{ClassName} . "::write: offset outside string")
+ if $offset > $slen;
+ if ($offset < 0) {
+ $offset += $slen;
+ $self->croakError( *$self->{ClassName} . "::write: offset outside string") if $offset < 0;
+ }
+ my $rem = $slen - $offset;
+ $len = $rem if $rem < $len;
+ }
+
+ $buffer = \substr($$buffer, $offset, $len) ;
+ }
+
+ return 0 if ! defined $$buffer || length $$buffer == 0 ;
+
+ if (*$self->{Encoding}) {
+ $$buffer = *$self->{Encoding}->encode($$buffer);
+ }
+
+ $self->filterUncompressed($buffer);
+
+ my $buffer_length = defined $$buffer ? length($$buffer) : 0 ;
+ *$self->{UnCompSize}->add($buffer_length) ;
+
+ my $outBuffer='';
+ my $status = *$self->{Compress}->compr($buffer, $outBuffer) ;
+
+ return $self->saveErrorString(undef, *$self->{Compress}{Error},
+ *$self->{Compress}{ErrorNo})
+ if $status == STATUS_ERROR;
+
+ *$self->{CompSize}->add(length $outBuffer) ;
+
+ $self->output($outBuffer)
+ or return undef;
+
+ return $buffer_length;
+}
+
+sub print
+{
+ my $self = shift;
+
+ #if (ref $self) {
+ # $self = *$self{GLOB} ;
+ #}
+
+ if (defined $\) {
+ if (defined $,) {
+ defined $self->syswrite(join($,, @_) . $\);
+ } else {
+ defined $self->syswrite(join("", @_) . $\);
+ }
+ } else {
+ if (defined $,) {
+ defined $self->syswrite(join($,, @_));
+ } else {
+ defined $self->syswrite(join("", @_));
+ }
+ }
+}
+
+sub printf
+{
+ my $self = shift;
+ my $fmt = shift;
+ defined $self->syswrite(sprintf($fmt, @_));
+}
+
+
+
+sub flush
+{
+ my $self = shift ;
+
+ my $outBuffer='';
+ my $status = *$self->{Compress}->flush($outBuffer, @_) ;
+ return $self->saveErrorString(0, *$self->{Compress}{Error},
+ *$self->{Compress}{ErrorNo})
+ if $status == STATUS_ERROR;
+
+ if ( defined *$self->{FH} ) {
+ *$self->{FH}->clearerr();
+ }
+
+ *$self->{CompSize}->add(length $outBuffer) ;
+
+ $self->output($outBuffer)
+ or return 0;
+
+ if ( defined *$self->{FH} ) {
+ defined *$self->{FH}->flush()
+ or return $self->saveErrorString(0, $!, $!);
+ }
+
+ return 1;
+}
+
+sub newStream
+{
+ my $self = shift ;
+
+ $self->_writeTrailer()
+ or return 0 ;
+
+ my $got = $self->checkParams('newStream', *$self->{Got}, @_)
+ or return 0 ;
+
+ $self->ckParams($got)
+ or $self->croakError("newStream: $self->{Error}");
+
+ *$self->{Compress} = $self->mkComp($got)
+ or return 0;
+
+ *$self->{Header} = $self->mkHeader($got) ;
+ $self->output(*$self->{Header} )
+ or return 0;
+
+ *$self->{UnCompSize}->reset();
+ *$self->{CompSize}->reset();
+
+ return 1 ;
+}
+
+sub reset
+{
+ my $self = shift ;
+ return *$self->{Compress}->reset() ;
+}
+
+sub _writeTrailer
+{
+ my $self = shift ;
+
+ my $trailer = '';
+
+ my $status = *$self->{Compress}->close($trailer) ;
+ return $self->saveErrorString(0, *$self->{Compress}{Error}, *$self->{Compress}{ErrorNo})
+ if $status == STATUS_ERROR;
+
+ *$self->{CompSize}->add(length $trailer) ;
+
+ $trailer .= $self->mkTrailer();
+ defined $trailer
+ or return 0;
+
+ return $self->output($trailer);
+}
+
+sub _writeFinalTrailer
+{
+ my $self = shift ;
+
+ return $self->output($self->mkFinalTrailer());
+}
+
+sub close
+{
+ my $self = shift ;
+
+ return 1 if *$self->{Closed} || ! *$self->{Compress} ;
+ *$self->{Closed} = 1 ;
+
+ untie *$self
+ if $] >= 5.008 ;
+
+ $self->_writeTrailer()
+ or return 0 ;
+
+ $self->_writeFinalTrailer()
+ or return 0 ;
+
+ $self->output( "", 1 )
+ or return 0;
+
+ if (defined *$self->{FH}) {
+
+ #if (! *$self->{Handle} || *$self->{AutoClose}) {
+ if ((! *$self->{Handle} || *$self->{AutoClose}) && ! *$self->{StdIO}) {
+ $! = 0 ;
+ *$self->{FH}->close()
+ or return $self->saveErrorString(0, $!, $!);
+ }
+ delete *$self->{FH} ;
+ # This delete can set $! in older Perls, so reset the errno
+ $! = 0 ;
+ }
+
+ return 1;
+}
+
+
+#sub total_in
+#sub total_out
+#sub msg
+#
+#sub crc
+#{
+# my $self = shift ;
+# return *$self->{Compress}->crc32() ;
+#}
+#
+#sub msg
+#{
+# my $self = shift ;
+# return *$self->{Compress}->msg() ;
+#}
+#
+#sub dict_adler
+#{
+# my $self = shift ;
+# return *$self->{Compress}->dict_adler() ;
+#}
+#
+#sub get_Level
+#{
+# my $self = shift ;
+# return *$self->{Compress}->get_Level() ;
+#}
+#
+#sub get_Strategy
+#{
+# my $self = shift ;
+# return *$self->{Compress}->get_Strategy() ;
+#}
+
+
+sub tell
+{
+ my $self = shift ;
+
+ return *$self->{UnCompSize}->get32bit() ;
+}
+
+sub eof
+{
+ my $self = shift ;
+
+ return *$self->{Closed} ;
+}
+
+
+sub seek
+{
+ my $self = shift ;
+ my $position = shift;
+ my $whence = shift ;
+
+ my $here = $self->tell() ;
+ my $target = 0 ;
+
+ #use IO::Handle qw(SEEK_SET SEEK_CUR SEEK_END);
+ use IO::Handle ;
+
+ if ($whence == IO::Handle::SEEK_SET) {
+ $target = $position ;
+ }
+ elsif ($whence == IO::Handle::SEEK_CUR || $whence == IO::Handle::SEEK_END) {
+ $target = $here + $position ;
+ }
+ else {
+ $self->croakError(*$self->{ClassName} . "::seek: unknown value, $whence, for whence parameter");
+ }
+
+ # short circuit if seeking to current offset
+ return 1 if $target == $here ;
+
+ # Outlaw any attempt to seek backwards
+ $self->croakError(*$self->{ClassName} . "::seek: cannot seek backwards")
+ if $target < $here ;
+
+ # Walk the file to the new offset
+ my $offset = $target - $here ;
+
+ my $buffer ;
+ defined $self->syswrite("\x00" x $offset)
+ or return 0;
+
+ return 1 ;
+}
+
+sub binmode
+{
+ 1;
+# my $self = shift ;
+# return defined *$self->{FH}
+# ? binmode *$self->{FH}
+# : 1 ;
+}
+
+sub fileno
+{
+ my $self = shift ;
+ return defined *$self->{FH}
+ ? *$self->{FH}->fileno()
+ : undef ;
+}
+
+sub opened
+{
+ my $self = shift ;
+ return ! *$self->{Closed} ;
+}
+
+sub autoflush
+{
+ my $self = shift ;
+ return defined *$self->{FH}
+ ? *$self->{FH}->autoflush(@_)
+ : undef ;
+}
+
+sub input_line_number
+{
+ return undef ;
+}
+
+
+sub _notAvailable
+{
+ my $name = shift ;
+ return sub { croak "$name Not Available: File opened only for output" ; } ;
+}
+
+*read = _notAvailable('read');
+*READ = _notAvailable('read');
+*readline = _notAvailable('readline');
+*READLINE = _notAvailable('readline');
+*getc = _notAvailable('getc');
+*GETC = _notAvailable('getc');
+
+*FILENO = \&fileno;
+*PRINT = \&print;
+*PRINTF = \&printf;
+*WRITE = \&syswrite;
+*write = \&syswrite;
+*SEEK = \&seek;
+*TELL = \&tell;
+*EOF = \&eof;
+*CLOSE = \&close;
+*BINMODE = \&binmode;
+
+#*sysread = \&_notAvailable;
+#*syswrite = \&_write;
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Compress::Base - Base Class for IO::Compress modules
+
+=head1 SYNOPSIS
+
+ use IO::Compress::Base ;
+
+=head1 DESCRIPTION
+
+This module is not intended for direct use in application code. Its sole
+purpose if to to be sub-classed by IO::Compress modules.
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Base/Common.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Base/Common.pm
new file mode 100755
index 00000000000..4f8b4dadc36
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Base/Common.pm
@@ -0,0 +1,956 @@
+package IO::Compress::Base::Common;
+
+use strict ;
+use warnings;
+use bytes;
+
+use Carp;
+use Scalar::Util qw(blessed readonly);
+use File::GlobMapper;
+
+require Exporter;
+our ($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $HAS_ENCODE);
+@ISA = qw(Exporter);
+$VERSION = '2.024';
+
+@EXPORT = qw( isaFilehandle isaFilename whatIsInput whatIsOutput
+ isaFileGlobString cleanFileGlobString oneTarget
+ setBinModeInput setBinModeOutput
+ ckInOutParams
+ createSelfTiedObject
+ getEncoding
+
+ WANT_CODE
+ WANT_EXT
+ WANT_UNDEF
+ WANT_HASH
+
+ STATUS_OK
+ STATUS_ENDSTREAM
+ STATUS_EOF
+ STATUS_ERROR
+ );
+
+%EXPORT_TAGS = ( Status => [qw( STATUS_OK
+ STATUS_ENDSTREAM
+ STATUS_EOF
+ STATUS_ERROR
+ )]);
+
+
+use constant STATUS_OK => 0;
+use constant STATUS_ENDSTREAM => 1;
+use constant STATUS_EOF => 2;
+use constant STATUS_ERROR => -1;
+
+sub hasEncode()
+{
+ if (! defined $HAS_ENCODE) {
+ eval
+ {
+ require Encode;
+ Encode->import();
+ };
+
+ $HAS_ENCODE = $@ ? 0 : 1 ;
+ }
+
+ return $HAS_ENCODE;
+}
+
+sub getEncoding($$$)
+{
+ my $obj = shift;
+ my $class = shift ;
+ my $want_encoding = shift ;
+
+ $obj->croakError("$class: Encode module needed to use -Encode")
+ if ! hasEncode();
+
+ my $encoding = Encode::find_encoding($want_encoding);
+
+ $obj->croakError("$class: Encoding '$want_encoding' is not available")
+ if ! $encoding;
+
+ return $encoding;
+}
+
+our ($needBinmode);
+$needBinmode = ($^O eq 'MSWin32' ||
+ ($] >= 5.006 && eval ' ${^UNICODE} || ${^UTF8LOCALE} '))
+ ? 1 : 1 ;
+
+sub setBinModeInput($)
+{
+ my $handle = shift ;
+
+ binmode $handle
+ if $needBinmode;
+}
+
+sub setBinModeOutput($)
+{
+ my $handle = shift ;
+
+ binmode $handle
+ if $needBinmode;
+}
+
+sub isaFilehandle($)
+{
+ use utf8; # Pragma needed to keep Perl 5.6.0 happy
+ return (defined $_[0] and
+ (UNIVERSAL::isa($_[0],'GLOB') or
+ UNIVERSAL::isa($_[0],'IO::Handle') or
+ UNIVERSAL::isa(\$_[0],'GLOB'))
+ )
+}
+
+sub isaFilename($)
+{
+ return (defined $_[0] and
+ ! ref $_[0] and
+ UNIVERSAL::isa(\$_[0], 'SCALAR'));
+}
+
+sub isaFileGlobString
+{
+ return defined $_[0] && $_[0] =~ /^<.*>$/;
+}
+
+sub cleanFileGlobString
+{
+ my $string = shift ;
+
+ $string =~ s/^\s*<\s*(.*)\s*>\s*$/$1/;
+
+ return $string;
+}
+
+use constant WANT_CODE => 1 ;
+use constant WANT_EXT => 2 ;
+use constant WANT_UNDEF => 4 ;
+#use constant WANT_HASH => 8 ;
+use constant WANT_HASH => 0 ;
+
+sub whatIsInput($;$)
+{
+ my $got = whatIs(@_);
+
+ if (defined $got && $got eq 'filename' && defined $_[0] && $_[0] eq '-')
+ {
+ #use IO::File;
+ $got = 'handle';
+ $_[0] = *STDIN;
+ #$_[0] = new IO::File("<-");
+ }
+
+ return $got;
+}
+
+sub whatIsOutput($;$)
+{
+ my $got = whatIs(@_);
+
+ if (defined $got && $got eq 'filename' && defined $_[0] && $_[0] eq '-')
+ {
+ $got = 'handle';
+ $_[0] = *STDOUT;
+ #$_[0] = new IO::File(">-");
+ }
+
+ return $got;
+}
+
+sub whatIs ($;$)
+{
+ return 'handle' if isaFilehandle($_[0]);
+
+ my $wantCode = defined $_[1] && $_[1] & WANT_CODE ;
+ my $extended = defined $_[1] && $_[1] & WANT_EXT ;
+ my $undef = defined $_[1] && $_[1] & WANT_UNDEF ;
+ my $hash = defined $_[1] && $_[1] & WANT_HASH ;
+
+ return 'undef' if ! defined $_[0] && $undef ;
+
+ if (ref $_[0]) {
+ return '' if blessed($_[0]); # is an object
+ #return '' if UNIVERSAL::isa($_[0], 'UNIVERSAL'); # is an object
+ return 'buffer' if UNIVERSAL::isa($_[0], 'SCALAR');
+ return 'array' if UNIVERSAL::isa($_[0], 'ARRAY') && $extended ;
+ return 'hash' if UNIVERSAL::isa($_[0], 'HASH') && $hash ;
+ return 'code' if UNIVERSAL::isa($_[0], 'CODE') && $wantCode ;
+ return '';
+ }
+
+ return 'fileglob' if $extended && isaFileGlobString($_[0]);
+ return 'filename';
+}
+
+sub oneTarget
+{
+ return $_[0] =~ /^(code|handle|buffer|filename)$/;
+}
+
+sub IO::Compress::Base::Validator::new
+{
+ my $class = shift ;
+
+ my $Class = shift ;
+ my $error_ref = shift ;
+ my $reportClass = shift ;
+
+ my %data = (Class => $Class,
+ Error => $error_ref,
+ reportClass => $reportClass,
+ ) ;
+
+ my $obj = bless \%data, $class ;
+
+ local $Carp::CarpLevel = 1;
+
+ my $inType = $data{inType} = whatIsInput($_[0], WANT_EXT|WANT_HASH);
+ my $outType = $data{outType} = whatIsOutput($_[1], WANT_EXT|WANT_HASH);
+
+ my $oneInput = $data{oneInput} = oneTarget($inType);
+ my $oneOutput = $data{oneOutput} = oneTarget($outType);
+
+ if (! $inType)
+ {
+ $obj->croakError("$reportClass: illegal input parameter") ;
+ #return undef ;
+ }
+
+# if ($inType eq 'hash')
+# {
+# $obj->{Hash} = 1 ;
+# $obj->{oneInput} = 1 ;
+# return $obj->validateHash($_[0]);
+# }
+
+ if (! $outType)
+ {
+ $obj->croakError("$reportClass: illegal output parameter") ;
+ #return undef ;
+ }
+
+
+ if ($inType ne 'fileglob' && $outType eq 'fileglob')
+ {
+ $obj->croakError("Need input fileglob for outout fileglob");
+ }
+
+# if ($inType ne 'fileglob' && $outType eq 'hash' && $inType ne 'filename' )
+# {
+# $obj->croakError("input must ne filename or fileglob when output is a hash");
+# }
+
+ if ($inType eq 'fileglob' && $outType eq 'fileglob')
+ {
+ $data{GlobMap} = 1 ;
+ $data{inType} = $data{outType} = 'filename';
+ my $mapper = new File::GlobMapper($_[0], $_[1]);
+ if ( ! $mapper )
+ {
+ return $obj->saveErrorString($File::GlobMapper::Error) ;
+ }
+ $data{Pairs} = $mapper->getFileMap();
+
+ return $obj;
+ }
+
+ $obj->croakError("$reportClass: input and output $inType are identical")
+ if $inType eq $outType && $_[0] eq $_[1] && $_[0] ne '-' ;
+
+ if ($inType eq 'fileglob') # && $outType ne 'fileglob'
+ {
+ my $glob = cleanFileGlobString($_[0]);
+ my @inputs = glob($glob);
+
+ if (@inputs == 0)
+ {
+ # TODO -- legal or die?
+ die "globmap matched zero file -- legal or die???" ;
+ }
+ elsif (@inputs == 1)
+ {
+ $obj->validateInputFilenames($inputs[0])
+ or return undef;
+ $_[0] = $inputs[0] ;
+ $data{inType} = 'filename' ;
+ $data{oneInput} = 1;
+ }
+ else
+ {
+ $obj->validateInputFilenames(@inputs)
+ or return undef;
+ $_[0] = [ @inputs ] ;
+ $data{inType} = 'filenames' ;
+ }
+ }
+ elsif ($inType eq 'filename')
+ {
+ $obj->validateInputFilenames($_[0])
+ or return undef;
+ }
+ elsif ($inType eq 'array')
+ {
+ $data{inType} = 'filenames' ;
+ $obj->validateInputArray($_[0])
+ or return undef ;
+ }
+
+ return $obj->saveErrorString("$reportClass: output buffer is read-only")
+ if $outType eq 'buffer' && readonly(${ $_[1] });
+
+ if ($outType eq 'filename' )
+ {
+ $obj->croakError("$reportClass: output filename is undef or null string")
+ if ! defined $_[1] || $_[1] eq '' ;
+
+ if (-e $_[1])
+ {
+ if (-d _ )
+ {
+ return $obj->saveErrorString("output file '$_[1]' is a directory");
+ }
+ }
+ }
+
+ return $obj ;
+}
+
+sub IO::Compress::Base::Validator::saveErrorString
+{
+ my $self = shift ;
+ ${ $self->{Error} } = shift ;
+ return undef;
+
+}
+
+sub IO::Compress::Base::Validator::croakError
+{
+ my $self = shift ;
+ $self->saveErrorString($_[0]);
+ croak $_[0];
+}
+
+
+
+sub IO::Compress::Base::Validator::validateInputFilenames
+{
+ my $self = shift ;
+
+ foreach my $filename (@_)
+ {
+ $self->croakError("$self->{reportClass}: input filename is undef or null string")
+ if ! defined $filename || $filename eq '' ;
+
+ next if $filename eq '-';
+
+ if (! -e $filename )
+ {
+ return $self->saveErrorString("input file '$filename' does not exist");
+ }
+
+ if (-d _ )
+ {
+ return $self->saveErrorString("input file '$filename' is a directory");
+ }
+
+ if (! -r _ )
+ {
+ return $self->saveErrorString("cannot open file '$filename': $!");
+ }
+ }
+
+ return 1 ;
+}
+
+sub IO::Compress::Base::Validator::validateInputArray
+{
+ my $self = shift ;
+
+ if ( @{ $_[0] } == 0 )
+ {
+ return $self->saveErrorString("empty array reference") ;
+ }
+
+ foreach my $element ( @{ $_[0] } )
+ {
+ my $inType = whatIsInput($element);
+
+ if (! $inType)
+ {
+ $self->croakError("unknown input parameter") ;
+ }
+ elsif($inType eq 'filename')
+ {
+ $self->validateInputFilenames($element)
+ or return undef ;
+ }
+ else
+ {
+ $self->croakError("not a filename") ;
+ }
+ }
+
+ return 1 ;
+}
+
+#sub IO::Compress::Base::Validator::validateHash
+#{
+# my $self = shift ;
+# my $href = shift ;
+#
+# while (my($k, $v) = each %$href)
+# {
+# my $ktype = whatIsInput($k);
+# my $vtype = whatIsOutput($v, WANT_EXT|WANT_UNDEF) ;
+#
+# if ($ktype ne 'filename')
+# {
+# return $self->saveErrorString("hash key not filename") ;
+# }
+#
+# my %valid = map { $_ => 1 } qw(filename buffer array undef handle) ;
+# if (! $valid{$vtype})
+# {
+# return $self->saveErrorString("hash value not ok") ;
+# }
+# }
+#
+# return $self ;
+#}
+
+sub createSelfTiedObject
+{
+ my $class = shift || (caller)[0] ;
+ my $error_ref = shift ;
+
+ my $obj = bless Symbol::gensym(), ref($class) || $class;
+ tie *$obj, $obj if $] >= 5.005;
+ *$obj->{Closed} = 1 ;
+ $$error_ref = '';
+ *$obj->{Error} = $error_ref ;
+ my $errno = 0 ;
+ *$obj->{ErrorNo} = \$errno ;
+
+ return $obj;
+}
+
+
+
+#package Parse::Parameters ;
+#
+#
+#require Exporter;
+#our ($VERSION, @ISA, @EXPORT);
+#$VERSION = '2.000_08';
+#@ISA = qw(Exporter);
+
+$EXPORT_TAGS{Parse} = [qw( ParseParameters
+ Parse_any Parse_unsigned Parse_signed
+ Parse_boolean Parse_custom Parse_string
+ Parse_multiple Parse_writable_scalar
+ )
+ ];
+
+push @EXPORT, @{ $EXPORT_TAGS{Parse} } ;
+
+use constant Parse_any => 0x01;
+use constant Parse_unsigned => 0x02;
+use constant Parse_signed => 0x04;
+use constant Parse_boolean => 0x08;
+use constant Parse_string => 0x10;
+use constant Parse_custom => 0x12;
+
+#use constant Parse_store_ref => 0x100 ;
+use constant Parse_multiple => 0x100 ;
+use constant Parse_writable => 0x200 ;
+use constant Parse_writable_scalar => 0x400 | Parse_writable ;
+
+use constant OFF_PARSED => 0 ;
+use constant OFF_TYPE => 1 ;
+use constant OFF_DEFAULT => 2 ;
+use constant OFF_FIXED => 3 ;
+use constant OFF_FIRST_ONLY => 4 ;
+use constant OFF_STICKY => 5 ;
+
+
+
+sub ParseParameters
+{
+ my $level = shift || 0 ;
+
+ my $sub = (caller($level + 1))[3] ;
+ local $Carp::CarpLevel = 1 ;
+
+ return $_[1]
+ if @_ == 2 && defined $_[1] && UNIVERSAL::isa($_[1], "IO::Compress::Base::Parameters");
+
+ my $p = new IO::Compress::Base::Parameters() ;
+ $p->parse(@_)
+ or croak "$sub: $p->{Error}" ;
+
+ return $p;
+}
+
+#package IO::Compress::Base::Parameters;
+
+use strict;
+use warnings;
+use Carp;
+
+sub IO::Compress::Base::Parameters::new
+{
+ my $class = shift ;
+
+ my $obj = { Error => '',
+ Got => {},
+ } ;
+
+ #return bless $obj, ref($class) || $class || __PACKAGE__ ;
+ return bless $obj, 'IO::Compress::Base::Parameters' ;
+}
+
+sub IO::Compress::Base::Parameters::setError
+{
+ my $self = shift ;
+ my $error = shift ;
+ my $retval = @_ ? shift : undef ;
+
+ $self->{Error} = $error ;
+ return $retval;
+}
+
+#sub getError
+#{
+# my $self = shift ;
+# return $self->{Error} ;
+#}
+
+sub IO::Compress::Base::Parameters::parse
+{
+ my $self = shift ;
+
+ my $default = shift ;
+
+ my $got = $self->{Got} ;
+ my $firstTime = keys %{ $got } == 0 ;
+ my $other;
+
+ my (@Bad) ;
+ my @entered = () ;
+
+ # Allow the options to be passed as a hash reference or
+ # as the complete hash.
+ if (@_ == 0) {
+ @entered = () ;
+ }
+ elsif (@_ == 1) {
+ my $href = $_[0] ;
+
+ return $self->setError("Expected even number of parameters, got 1")
+ if ! defined $href or ! ref $href or ref $href ne "HASH" ;
+
+ foreach my $key (keys %$href) {
+ push @entered, $key ;
+ push @entered, \$href->{$key} ;
+ }
+ }
+ else {
+ my $count = @_;
+ return $self->setError("Expected even number of parameters, got $count")
+ if $count % 2 != 0 ;
+
+ for my $i (0.. $count / 2 - 1) {
+ if ($_[2 * $i] eq '__xxx__') {
+ $other = $_[2 * $i + 1] ;
+ }
+ else {
+ push @entered, $_[2 * $i] ;
+ push @entered, \$_[2 * $i + 1] ;
+ }
+ }
+ }
+
+
+ while (my ($key, $v) = each %$default)
+ {
+ croak "need 4 params [@$v]"
+ if @$v != 4 ;
+
+ my ($first_only, $sticky, $type, $value) = @$v ;
+ my $x ;
+ $self->_checkType($key, \$value, $type, 0, \$x)
+ or return undef ;
+
+ $key = lc $key;
+
+ if ($firstTime || ! $sticky) {
+ $x = []
+ if $type & Parse_multiple;
+
+ $got->{$key} = [0, $type, $value, $x, $first_only, $sticky] ;
+ }
+
+ $got->{$key}[OFF_PARSED] = 0 ;
+ }
+
+ my %parsed = ();
+
+ if ($other)
+ {
+ for my $key (keys %$default)
+ {
+ my $canonkey = lc $key;
+ if ($other->parsed($canonkey))
+ {
+ my $value = $other->value($canonkey);
+#print "SET '$canonkey' to $value [$$value]\n";
+ ++ $parsed{$canonkey};
+ $got->{$canonkey}[OFF_PARSED] = 1;
+ $got->{$canonkey}[OFF_DEFAULT] = $value;
+ $got->{$canonkey}[OFF_FIXED] = $value;
+ }
+ }
+ }
+
+ for my $i (0.. @entered / 2 - 1) {
+ my $key = $entered[2* $i] ;
+ my $value = $entered[2* $i+1] ;
+
+ #print "Key [$key] Value [$value]" ;
+ #print defined $$value ? "[$$value]\n" : "[undef]\n";
+
+ $key =~ s/^-// ;
+ my $canonkey = lc $key;
+
+ if ($got->{$canonkey} && ($firstTime ||
+ ! $got->{$canonkey}[OFF_FIRST_ONLY] ))
+ {
+ my $type = $got->{$canonkey}[OFF_TYPE] ;
+ my $parsed = $parsed{$canonkey};
+ ++ $parsed{$canonkey};
+
+ return $self->setError("Muliple instances of '$key' found")
+ if $parsed && $type & Parse_multiple == 0 ;
+
+ my $s ;
+ $self->_checkType($key, $value, $type, 1, \$s)
+ or return undef ;
+
+ $value = $$value ;
+ if ($type & Parse_multiple) {
+ $got->{$canonkey}[OFF_PARSED] = 1;
+ push @{ $got->{$canonkey}[OFF_FIXED] }, $s ;
+ }
+ else {
+ $got->{$canonkey} = [1, $type, $value, $s] ;
+ }
+ }
+ else
+ { push (@Bad, $key) }
+ }
+
+ if (@Bad) {
+ my ($bad) = join(", ", @Bad) ;
+ return $self->setError("unknown key value(s) $bad") ;
+ }
+
+ return 1;
+}
+
+sub IO::Compress::Base::Parameters::_checkType
+{
+ my $self = shift ;
+
+ my $key = shift ;
+ my $value = shift ;
+ my $type = shift ;
+ my $validate = shift ;
+ my $output = shift;
+
+ #local $Carp::CarpLevel = $level ;
+ #print "PARSE $type $key $value $validate $sub\n" ;
+
+ if ($type & Parse_writable_scalar)
+ {
+ return $self->setError("Parameter '$key' not writable")
+ if $validate && readonly $$value ;
+
+ if (ref $$value)
+ {
+ return $self->setError("Parameter '$key' not a scalar reference")
+ if $validate && ref $$value ne 'SCALAR' ;
+
+ $$output = $$value ;
+ }
+ else
+ {
+ return $self->setError("Parameter '$key' not a scalar")
+ if $validate && ref $value ne 'SCALAR' ;
+
+ $$output = $value ;
+ }
+
+ return 1;
+ }
+
+# if ($type & Parse_store_ref)
+# {
+# #$value = $$value
+# # if ref ${ $value } ;
+#
+# $$output = $value ;
+# return 1;
+# }
+
+ $value = $$value ;
+
+ if ($type & Parse_any)
+ {
+ $$output = $value ;
+ return 1;
+ }
+ elsif ($type & Parse_unsigned)
+ {
+ return $self->setError("Parameter '$key' must be an unsigned int, got 'undef'")
+ if $validate && ! defined $value ;
+ return $self->setError("Parameter '$key' must be an unsigned int, got '$value'")
+ if $validate && $value !~ /^\d+$/;
+
+ $$output = defined $value ? $value : 0 ;
+ return 1;
+ }
+ elsif ($type & Parse_signed)
+ {
+ return $self->setError("Parameter '$key' must be a signed int, got 'undef'")
+ if $validate && ! defined $value ;
+ return $self->setError("Parameter '$key' must be a signed int, got '$value'")
+ if $validate && $value !~ /^-?\d+$/;
+
+ $$output = defined $value ? $value : 0 ;
+ return 1 ;
+ }
+ elsif ($type & Parse_boolean)
+ {
+ return $self->setError("Parameter '$key' must be an int, got '$value'")
+ if $validate && defined $value && $value !~ /^\d*$/;
+ $$output = defined $value ? $value != 0 : 0 ;
+ return 1;
+ }
+ elsif ($type & Parse_string)
+ {
+ $$output = defined $value ? $value : "" ;
+ return 1;
+ }
+
+ $$output = $value ;
+ return 1;
+}
+
+
+
+sub IO::Compress::Base::Parameters::parsed
+{
+ my $self = shift ;
+ my $name = shift ;
+
+ return $self->{Got}{lc $name}[OFF_PARSED] ;
+}
+
+sub IO::Compress::Base::Parameters::value
+{
+ my $self = shift ;
+ my $name = shift ;
+
+ if (@_)
+ {
+ $self->{Got}{lc $name}[OFF_PARSED] = 1;
+ $self->{Got}{lc $name}[OFF_DEFAULT] = $_[0] ;
+ $self->{Got}{lc $name}[OFF_FIXED] = $_[0] ;
+ }
+
+ return $self->{Got}{lc $name}[OFF_FIXED] ;
+}
+
+sub IO::Compress::Base::Parameters::valueOrDefault
+{
+ my $self = shift ;
+ my $name = shift ;
+ my $default = shift ;
+
+ my $value = $self->{Got}{lc $name}[OFF_DEFAULT] ;
+
+ return $value if defined $value ;
+ return $default ;
+}
+
+sub IO::Compress::Base::Parameters::wantValue
+{
+ my $self = shift ;
+ my $name = shift ;
+
+ return defined $self->{Got}{lc $name}[OFF_DEFAULT] ;
+
+}
+
+sub IO::Compress::Base::Parameters::clone
+{
+ my $self = shift ;
+ my $obj = { };
+ my %got ;
+
+ while (my ($k, $v) = each %{ $self->{Got} }) {
+ $got{$k} = [ @$v ];
+ }
+
+ $obj->{Error} = $self->{Error};
+ $obj->{Got} = \%got ;
+
+ return bless $obj, 'IO::Compress::Base::Parameters' ;
+}
+
+package U64;
+
+use constant MAX32 => 0xFFFFFFFF ;
+use constant HI_1 => MAX32 + 1 ;
+use constant LOW => 0 ;
+use constant HIGH => 1;
+
+sub new
+{
+ my $class = shift ;
+
+ my $high = 0 ;
+ my $low = 0 ;
+
+ if (@_ == 2) {
+ $high = shift ;
+ $low = shift ;
+ }
+ elsif (@_ == 1) {
+ $low = shift ;
+ }
+
+ bless [$low, $high], $class;
+}
+
+sub newUnpack_V64
+{
+ my $string = shift;
+
+ my ($low, $hi) = unpack "V V", $string ;
+ bless [ $low, $hi ], "U64";
+}
+
+sub newUnpack_V32
+{
+ my $string = shift;
+
+ my $low = unpack "V", $string ;
+ bless [ $low, 0 ], "U64";
+}
+
+sub reset
+{
+ my $self = shift;
+ $self->[HIGH] = $self->[LOW] = 0;
+}
+
+sub clone
+{
+ my $self = shift;
+ bless [ @$self ], ref $self ;
+}
+
+sub getHigh
+{
+ my $self = shift;
+ return $self->[HIGH];
+}
+
+sub getLow
+{
+ my $self = shift;
+ return $self->[LOW];
+}
+
+sub get32bit
+{
+ my $self = shift;
+ return $self->[LOW];
+}
+
+sub get64bit
+{
+ my $self = shift;
+ # Not using << here because the result will still be
+ # a 32-bit value on systems where int size is 32-bits
+ return $self->[HIGH] * HI_1 + $self->[LOW];
+}
+
+sub add
+{
+ my $self = shift;
+ my $value = shift;
+
+ if (ref $value eq 'U64') {
+ $self->[HIGH] += $value->[HIGH] ;
+ $value = $value->[LOW];
+ }
+
+ my $available = MAX32 - $self->[LOW] ;
+
+ if ($value > $available) {
+ ++ $self->[HIGH] ;
+ $self->[LOW] = $value - $available - 1;
+ }
+ else {
+ $self->[LOW] += $value ;
+ }
+
+}
+
+sub equal
+{
+ my $self = shift;
+ my $other = shift;
+
+ return $self->[LOW] == $other->[LOW] &&
+ $self->[HIGH] == $other->[HIGH] ;
+}
+
+sub is64bit
+{
+ my $self = shift;
+ return $self->[HIGH] > 0 ;
+}
+
+sub getPacked_V64
+{
+ my $self = shift;
+
+ return pack "V V", @$self ;
+}
+
+sub getPacked_V32
+{
+ my $self = shift;
+
+ return pack "V", $self->[LOW] ;
+}
+
+sub pack_V64
+{
+ my $low = shift;
+
+ return pack "V V", $low, 0;
+}
+
+
+package IO::Compress::Base::Common;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Bzip2.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Bzip2.pm
new file mode 100755
index 00000000000..2a85ef55b19
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Bzip2.pm
@@ -0,0 +1,758 @@
+package IO::Compress::Bzip2 ;
+
+use strict ;
+use warnings;
+use bytes;
+require Exporter ;
+
+use IO::Compress::Base 2.024 ;
+
+use IO::Compress::Base::Common 2.024 qw(createSelfTiedObject);
+use IO::Compress::Adapter::Bzip2 2.024 ;
+
+
+
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bzip2Error);
+
+$VERSION = '2.024';
+$Bzip2Error = '';
+
+@ISA = qw(Exporter IO::Compress::Base);
+@EXPORT_OK = qw( $Bzip2Error bzip2 ) ;
+%EXPORT_TAGS = %IO::Compress::Base::EXPORT_TAGS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+Exporter::export_ok_tags('all');
+
+
+
+sub new
+{
+ my $class = shift ;
+
+ my $obj = createSelfTiedObject($class, \$Bzip2Error);
+ return $obj->_create(undef, @_);
+}
+
+sub bzip2
+{
+ my $obj = createSelfTiedObject(undef, \$Bzip2Error);
+ $obj->_def(@_);
+}
+
+
+sub mkHeader
+{
+ my $self = shift ;
+ return '';
+
+}
+
+sub getExtraParams
+{
+ my $self = shift ;
+
+ use IO::Compress::Base::Common 2.024 qw(:Parse);
+
+ return (
+ 'BlockSize100K' => [0, 1, Parse_unsigned, 1],
+ 'WorkFactor' => [0, 1, Parse_unsigned, 0],
+ 'Verbosity' => [0, 1, Parse_boolean, 0],
+ );
+}
+
+
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift;
+
+ # check that BlockSize100K is a number between 1 & 9
+ if ($got->parsed('BlockSize100K')) {
+ my $value = $got->value('BlockSize100K');
+ return $self->saveErrorString(undef, "Parameter 'BlockSize100K' not between 1 and 9, got $value")
+ unless defined $value && $value >= 1 && $value <= 9;
+
+ }
+
+ # check that WorkFactor between 0 & 250
+ if ($got->parsed('WorkFactor')) {
+ my $value = $got->value('WorkFactor');
+ return $self->saveErrorString(undef, "Parameter 'WorkFactor' not between 0 and 250, got $value")
+ unless $value >= 0 && $value <= 250;
+ }
+
+ return 1 ;
+}
+
+
+sub mkComp
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ my $BlockSize100K = $got->value('BlockSize100K');
+ my $WorkFactor = $got->value('WorkFactor');
+ my $Verbosity = $got->value('Verbosity');
+
+ my ($obj, $errstr, $errno) = IO::Compress::Adapter::Bzip2::mkCompObject(
+ $BlockSize100K, $WorkFactor,
+ $Verbosity);
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ return $obj;
+}
+
+
+sub mkTrailer
+{
+ my $self = shift ;
+ return '';
+}
+
+sub mkFinalTrailer
+{
+ return '';
+}
+
+#sub newHeader
+#{
+# my $self = shift ;
+# return '';
+#}
+
+sub getInverseClass
+{
+ return ('IO::Uncompress::Bunzip2');
+}
+
+sub getFileInfo
+{
+ my $self = shift ;
+ my $params = shift;
+ my $file = shift ;
+
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Compress::Bzip2 - Write bzip2 files/buffers
+
+
+
+=head1 SYNOPSIS
+
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+
+ my $status = bzip2 $input => $output [,OPTS]
+ or die "bzip2 failed: $Bzip2Error\n";
+
+ my $z = new IO::Compress::Bzip2 $output [,OPTS]
+ or die "bzip2 failed: $Bzip2Error\n";
+
+ $z->print($string);
+ $z->printf($format, $string);
+ $z->write($string);
+ $z->syswrite($string [, $length, $offset]);
+ $z->flush();
+ $z->tell();
+ $z->eof();
+ $z->seek($position, $whence);
+ $z->binmode();
+ $z->fileno();
+ $z->opened();
+ $z->autoflush();
+ $z->input_line_number();
+ $z->newStream( [OPTS] );
+
+ $z->close() ;
+
+ $Bzip2Error ;
+
+ # IO::File mode
+
+ print $z $string;
+ printf $z $format, $string;
+ tell $z
+ eof $z
+ seek $z, $position, $whence
+ binmode $z
+ fileno $z
+ close $z ;
+
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows writing bzip2
+compressed data to files or buffer.
+
+For reading bzip2 files/buffers, see the companion module
+L<IO::Uncompress::Bunzip2|IO::Uncompress::Bunzip2>.
+
+=head1 Functional Interface
+
+A top-level function, C<bzip2>, is provided to carry out
+"one-shot" compression between buffers and/or files. For finer
+control over the compression process, see the L</"OO Interface">
+section.
+
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+
+ bzip2 $input => $output [,OPTS]
+ or die "bzip2 failed: $Bzip2Error\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 bzip2 $input => $output [, OPTS]
+
+C<bzip2> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the uncompressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is compressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<bzip2> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+compressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the compressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the compressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the compressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the compressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<bzip2> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple files/buffers and C<$output> is a single
+file/buffer the input files/buffers will be stored
+in C<$output> as a concatenated series of compressed data streams.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<bzip2>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<bzip2> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<bzip2> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeIn => 0|1 >>
+
+When reading from a file or filehandle, set C<binmode> before reading.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+TODO
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt> and write the compressed
+data to the file C<file1.txt.bz2>.
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+
+ my $input = "file1.txt";
+ bzip2 $input => "$input.bz2"
+ or die "bzip2 failed: $Bzip2Error\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+compressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt"
+ or die "Cannot open 'file1.txt': $!\n" ;
+ my $buffer ;
+ bzip2 $input => \$buffer
+ or die "bzip2 failed: $Bzip2Error\n";
+
+To compress all files in the directory "/my/home" that match "*.txt"
+and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+
+ bzip2 '</my/home/*.txt>' => '<*.bz2>'
+ or die "bzip2 failed: $Bzip2Error\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+
+ for my $input ( glob "/my/home/*.txt" )
+ {
+ my $output = "$input.bz2" ;
+ bzip2 $input => $output
+ or die "Error compressing '$input': $Bzip2Error\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for C<IO::Compress::Bzip2> is shown below
+
+ my $z = new IO::Compress::Bzip2 $output [,OPTS]
+ or die "IO::Compress::Bzip2 failed: $Bzip2Error\n";
+
+It returns an C<IO::Compress::Bzip2> object on success and undef on failure.
+The variable C<$Bzip2Error> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Compress::Bzip2 can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal output file operations can be carried out
+with C<$z>.
+For example, to write to a compressed file/buffer you can use either of
+these forms
+
+ $z->print("hello world\n");
+ print $z "hello world\n";
+
+The mandatory parameter C<$output> is used to control the destination
+of the compressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the compressed data
+will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the compressed data will be
+written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the compressed data will be stored
+in C<$$output>.
+
+=back
+
+If the C<$output> parameter is any other type, C<IO::Compress::Bzip2>::new will
+return undef.
+
+=head2 Constructor Options
+
+C<OPTS> is any combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$output> parameter is a filehandle. If
+specified, and the value is true, it will result in the C<$output> being
+closed once either the C<close> method is called or the C<IO::Compress::Bzip2>
+object is destroyed.
+
+This parameter defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+Opens C<$output> in append mode.
+
+The behaviour of this option is dependent on the type of C<$output>.
+
+=over 5
+
+=item * A Buffer
+
+If C<$output> is a buffer and C<Append> is enabled, all compressed data
+will be append to the end if C<$output>. Otherwise C<$output> will be
+cleared before any data is written to it.
+
+=item * A Filename
+
+If C<$output> is a filename and C<Append> is enabled, the file will be
+opened in append mode. Otherwise the contents of the file, if any, will be
+truncated before any compressed data is written to it.
+
+=item * A Filehandle
+
+If C<$output> is a filehandle, the file pointer will be positioned to the
+end of the file via a call to C<seek> before any compressed data is written
+to it. Otherwise the file pointer will not be moved.
+
+=back
+
+This parameter defaults to 0.
+
+=item C<< BlockSize100K => number >>
+
+Specify the number of 100K blocks bzip2 uses during compression.
+
+Valid values are from 1 to 9, where 9 is best compression.
+
+The default is 1.
+
+=item C<< WorkFactor => number >>
+
+Specifies how much effort bzip2 should take before resorting to a slower
+fallback compression algorithm.
+
+Valid values range from 0 to 250, where 0 means use the default value 30.
+
+The default is 0.
+
+=item C<< Strict => 0|1 >>
+
+This is a placeholder option.
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 print
+
+Usage is
+
+ $z->print($data)
+ print $z $data
+
+Compresses and outputs the contents of the C<$data> parameter. This
+has the same behaviour as the C<print> built-in.
+
+Returns true if successful.
+
+=head2 printf
+
+Usage is
+
+ $z->printf($format, $data)
+ printf $z $format, $data
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns true if successful.
+
+=head2 syswrite
+
+Usage is
+
+ $z->syswrite $data
+ $z->syswrite $data, $length
+ $z->syswrite $data, $length, $offset
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns the number of uncompressed bytes written, or C<undef> if
+unsuccessful.
+
+=head2 write
+
+Usage is
+
+ $z->write $data
+ $z->write $data, $length
+ $z->write $data, $length, $offset
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns the number of uncompressed bytes written, or C<undef> if
+unsuccessful.
+
+=head2 flush
+
+Usage is
+
+ $z->flush;
+
+Flushes any pending compressed data to the output file/buffer.
+
+TODO
+
+Returns true on success.
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the C<close> method has been called.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the output file/buffer.
+It is a fatal error to attempt to seek backward.
+
+Empty parts of the file/buffer will have NULL (0x00) bytes written to them.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+This method always returns C<undef> when compressing.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Flushes any pending compressed data and then closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Compress::Bzip2 object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Compress::Bzip2
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 newStream([OPTS])
+
+Usage is
+
+ $z->newStream( [OPTS] )
+
+Closes the current compressed data stream and starts a new one.
+
+OPTS consists of any of the the options that are available when creating
+the C<$z> object.
+
+See the L</"Constructor Options"> section for more details.
+
+=head1 Importing
+
+No symbolic constants are required by this IO::Compress::Bzip2 at present.
+
+=over 5
+
+=item :all
+
+Imports C<bzip2> and C<$Bzip2Error>.
+Same as doing this
+
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+
+
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Apache::GZip Revisited
+
+See L<IO::Compress::Bzip2::FAQ|IO::Compress::Bzip2::FAQ/"Apache::GZip Revisited">
+
+
+
+=head2 Working with Net::FTP
+
+See L<IO::Compress::Bzip2::FAQ|IO::Compress::Bzip2::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+The primary site for the bzip2 program is F<http://www.bzip.org>.
+
+See the module L<Compress::Bzip2|Compress::Bzip2>
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Deflate.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Deflate.pm
new file mode 100755
index 00000000000..0f46e59d3a4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Deflate.pm
@@ -0,0 +1,930 @@
+package IO::Compress::Deflate ;
+
+use strict ;
+use warnings;
+use bytes;
+
+require Exporter ;
+
+use IO::Compress::RawDeflate 2.024 ;
+
+use Compress::Raw::Zlib 2.024 ;
+use IO::Compress::Zlib::Constants 2.024 ;
+use IO::Compress::Base::Common 2.024 qw(createSelfTiedObject);
+
+
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $DeflateError);
+
+$VERSION = '2.024';
+$DeflateError = '';
+
+@ISA = qw(Exporter IO::Compress::RawDeflate);
+@EXPORT_OK = qw( $DeflateError deflate ) ;
+%EXPORT_TAGS = %IO::Compress::RawDeflate::DEFLATE_CONSTANTS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+Exporter::export_ok_tags('all');
+
+
+sub new
+{
+ my $class = shift ;
+
+ my $obj = createSelfTiedObject($class, \$DeflateError);
+ return $obj->_create(undef, @_);
+}
+
+sub deflate
+{
+ my $obj = createSelfTiedObject(undef, \$DeflateError);
+ return $obj->_def(@_);
+}
+
+
+sub bitmask($$$$)
+{
+ my $into = shift ;
+ my $value = shift ;
+ my $offset = shift ;
+ my $mask = shift ;
+
+ return $into | (($value & $mask) << $offset ) ;
+}
+
+sub mkDeflateHdr($$$;$)
+{
+ my $method = shift ;
+ my $cinfo = shift;
+ my $level = shift;
+ my $fdict_adler = shift ;
+
+ my $cmf = 0;
+ my $flg = 0;
+ my $fdict = 0;
+ $fdict = 1 if defined $fdict_adler;
+
+ $cmf = bitmask($cmf, $method, ZLIB_CMF_CM_OFFSET, ZLIB_CMF_CM_BITS);
+ $cmf = bitmask($cmf, $cinfo, ZLIB_CMF_CINFO_OFFSET, ZLIB_CMF_CINFO_BITS);
+
+ $flg = bitmask($flg, $fdict, ZLIB_FLG_FDICT_OFFSET, ZLIB_FLG_FDICT_BITS);
+ $flg = bitmask($flg, $level, ZLIB_FLG_LEVEL_OFFSET, ZLIB_FLG_LEVEL_BITS);
+
+ my $fcheck = 31 - ($cmf * 256 + $flg) % 31 ;
+ $flg = bitmask($flg, $fcheck, ZLIB_FLG_FCHECK_OFFSET, ZLIB_FLG_FCHECK_BITS);
+
+ my $hdr = pack("CC", $cmf, $flg) ;
+ $hdr .= pack("N", $fdict_adler) if $fdict ;
+
+ return $hdr;
+}
+
+sub mkHeader
+{
+ my $self = shift ;
+ my $param = shift ;
+
+ my $level = $param->value('Level');
+ my $strategy = $param->value('Strategy');
+
+ my $lflag ;
+ $level = 6
+ if $level == Z_DEFAULT_COMPRESSION ;
+
+ if (ZLIB_VERNUM >= 0x1210)
+ {
+ if ($strategy >= Z_HUFFMAN_ONLY || $level < 2)
+ { $lflag = ZLIB_FLG_LEVEL_FASTEST }
+ elsif ($level < 6)
+ { $lflag = ZLIB_FLG_LEVEL_FAST }
+ elsif ($level == 6)
+ { $lflag = ZLIB_FLG_LEVEL_DEFAULT }
+ else
+ { $lflag = ZLIB_FLG_LEVEL_SLOWEST }
+ }
+ else
+ {
+ $lflag = ($level - 1) >> 1 ;
+ $lflag = 3 if $lflag > 3 ;
+ }
+
+ #my $wbits = (MAX_WBITS - 8) << 4 ;
+ my $wbits = 7;
+ mkDeflateHdr(ZLIB_CMF_CM_DEFLATED, $wbits, $lflag);
+}
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift;
+
+ $got->value('ADLER32' => 1);
+ return 1 ;
+}
+
+
+sub mkTrailer
+{
+ my $self = shift ;
+ return pack("N", *$self->{Compress}->adler32()) ;
+}
+
+sub mkFinalTrailer
+{
+ return '';
+}
+
+#sub newHeader
+#{
+# my $self = shift ;
+# return *$self->{Header};
+#}
+
+sub getExtraParams
+{
+ my $self = shift ;
+ return $self->getZlibParams(),
+}
+
+sub getInverseClass
+{
+ return ('IO::Uncompress::Inflate',
+ \$IO::Uncompress::Inflate::InflateError);
+}
+
+sub getFileInfo
+{
+ my $self = shift ;
+ my $params = shift;
+ my $file = shift ;
+
+}
+
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Compress::Deflate - Write RFC 1950 files/buffers
+
+
+
+=head1 SYNOPSIS
+
+ use IO::Compress::Deflate qw(deflate $DeflateError) ;
+
+ my $status = deflate $input => $output [,OPTS]
+ or die "deflate failed: $DeflateError\n";
+
+ my $z = new IO::Compress::Deflate $output [,OPTS]
+ or die "deflate failed: $DeflateError\n";
+
+ $z->print($string);
+ $z->printf($format, $string);
+ $z->write($string);
+ $z->syswrite($string [, $length, $offset]);
+ $z->flush();
+ $z->tell();
+ $z->eof();
+ $z->seek($position, $whence);
+ $z->binmode();
+ $z->fileno();
+ $z->opened();
+ $z->autoflush();
+ $z->input_line_number();
+ $z->newStream( [OPTS] );
+
+ $z->deflateParams();
+
+ $z->close() ;
+
+ $DeflateError ;
+
+ # IO::File mode
+
+ print $z $string;
+ printf $z $format, $string;
+ tell $z
+ eof $z
+ seek $z, $position, $whence
+ binmode $z
+ fileno $z
+ close $z ;
+
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows writing compressed
+data to files or buffer as defined in RFC 1950.
+
+For reading RFC 1950 files/buffers, see the companion module
+L<IO::Uncompress::Inflate|IO::Uncompress::Inflate>.
+
+=head1 Functional Interface
+
+A top-level function, C<deflate>, is provided to carry out
+"one-shot" compression between buffers and/or files. For finer
+control over the compression process, see the L</"OO Interface">
+section.
+
+ use IO::Compress::Deflate qw(deflate $DeflateError) ;
+
+ deflate $input => $output [,OPTS]
+ or die "deflate failed: $DeflateError\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 deflate $input => $output [, OPTS]
+
+C<deflate> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the uncompressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is compressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<deflate> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+compressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the compressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the compressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the compressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the compressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<deflate> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple files/buffers and C<$output> is a single
+file/buffer the input files/buffers will be stored
+in C<$output> as a concatenated series of compressed data streams.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<deflate>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<deflate> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<deflate> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeIn => 0|1 >>
+
+When reading from a file or filehandle, set C<binmode> before reading.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+The behaviour of this option is dependent on the type of output data
+stream.
+
+=over 5
+
+=item * A Buffer
+
+If C<Append> is enabled, all compressed data will be append to the end of
+the output buffer. Otherwise the output buffer will be cleared before any
+compressed data is written to it.
+
+=item * A Filename
+
+If C<Append> is enabled, the file will be opened in append mode. Otherwise
+the contents of the file, if any, will be truncated before any compressed
+data is written to it.
+
+=item * A Filehandle
+
+If C<Append> is enabled, the filehandle will be positioned to the end of
+the file via a call to C<seek> before any compressed data is
+written to it. Otherwise the file pointer will not be moved.
+
+=back
+
+When C<Append> is specified, and set to true, it will I<append> all compressed
+data to the output data stream.
+
+So when the output is a filehandle it will carry out a seek to the eof
+before writing any compressed data. If the output is a filename, it will be opened for
+appending. If the output is a buffer, all compressed data will be appened to
+the existing buffer.
+
+Conversely when C<Append> is not specified, or it is present and is set to
+false, it will operate as follows.
+
+When the output is a filename, it will truncate the contents of the file
+before writing any compressed data. If the output is a filehandle
+its position will not be changed. If the output is a buffer, it will be
+wiped before any compressed data is output.
+
+Defaults to 0.
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt> and write the compressed
+data to the file C<file1.txt.1950>.
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Deflate qw(deflate $DeflateError) ;
+
+ my $input = "file1.txt";
+ deflate $input => "$input.1950"
+ or die "deflate failed: $DeflateError\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+compressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Deflate qw(deflate $DeflateError) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt"
+ or die "Cannot open 'file1.txt': $!\n" ;
+ my $buffer ;
+ deflate $input => \$buffer
+ or die "deflate failed: $DeflateError\n";
+
+To compress all files in the directory "/my/home" that match "*.txt"
+and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Deflate qw(deflate $DeflateError) ;
+
+ deflate '</my/home/*.txt>' => '<*.1950>'
+ or die "deflate failed: $DeflateError\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Deflate qw(deflate $DeflateError) ;
+
+ for my $input ( glob "/my/home/*.txt" )
+ {
+ my $output = "$input.1950" ;
+ deflate $input => $output
+ or die "Error compressing '$input': $DeflateError\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for C<IO::Compress::Deflate> is shown below
+
+ my $z = new IO::Compress::Deflate $output [,OPTS]
+ or die "IO::Compress::Deflate failed: $DeflateError\n";
+
+It returns an C<IO::Compress::Deflate> object on success and undef on failure.
+The variable C<$DeflateError> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Compress::Deflate can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal output file operations can be carried out
+with C<$z>.
+For example, to write to a compressed file/buffer you can use either of
+these forms
+
+ $z->print("hello world\n");
+ print $z "hello world\n";
+
+The mandatory parameter C<$output> is used to control the destination
+of the compressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the compressed data
+will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the compressed data will be
+written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the compressed data will be stored
+in C<$$output>.
+
+=back
+
+If the C<$output> parameter is any other type, C<IO::Compress::Deflate>::new will
+return undef.
+
+=head2 Constructor Options
+
+C<OPTS> is any combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$output> parameter is a filehandle. If
+specified, and the value is true, it will result in the C<$output> being
+closed once either the C<close> method is called or the C<IO::Compress::Deflate>
+object is destroyed.
+
+This parameter defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+Opens C<$output> in append mode.
+
+The behaviour of this option is dependent on the type of C<$output>.
+
+=over 5
+
+=item * A Buffer
+
+If C<$output> is a buffer and C<Append> is enabled, all compressed data
+will be append to the end of C<$output>. Otherwise C<$output> will be
+cleared before any data is written to it.
+
+=item * A Filename
+
+If C<$output> is a filename and C<Append> is enabled, the file will be
+opened in append mode. Otherwise the contents of the file, if any, will be
+truncated before any compressed data is written to it.
+
+=item * A Filehandle
+
+If C<$output> is a filehandle, the file pointer will be positioned to the
+end of the file via a call to C<seek> before any compressed data is written
+to it. Otherwise the file pointer will not be moved.
+
+=back
+
+This parameter defaults to 0.
+
+=item C<< Merge => 0|1 >>
+
+This option is used to compress input data and append it to an existing
+compressed data stream in C<$output>. The end result is a single compressed
+data stream stored in C<$output>.
+
+It is a fatal error to attempt to use this option when C<$output> is not an
+RFC 1950 data stream.
+
+There are a number of other limitations with the C<Merge> option:
+
+=over 5
+
+=item 1
+
+This module needs to have been built with zlib 1.2.1 or better to work. A
+fatal error will be thrown if C<Merge> is used with an older version of
+zlib.
+
+=item 2
+
+If C<$output> is a file or a filehandle, it must be seekable.
+
+=back
+
+This parameter defaults to 0.
+
+=item -Level
+
+Defines the compression level used by zlib. The value should either be
+a number between 0 and 9 (0 means no compression and 9 is maximum
+compression), or one of the symbolic constants defined below.
+
+ Z_NO_COMPRESSION
+ Z_BEST_SPEED
+ Z_BEST_COMPRESSION
+ Z_DEFAULT_COMPRESSION
+
+The default is Z_DEFAULT_COMPRESSION.
+
+Note, these constants are not imported by C<IO::Compress::Deflate> by default.
+
+ use IO::Compress::Deflate qw(:strategy);
+ use IO::Compress::Deflate qw(:constants);
+ use IO::Compress::Deflate qw(:all);
+
+=item -Strategy
+
+Defines the strategy used to tune the compression. Use one of the symbolic
+constants defined below.
+
+ Z_FILTERED
+ Z_HUFFMAN_ONLY
+ Z_RLE
+ Z_FIXED
+ Z_DEFAULT_STRATEGY
+
+The default is Z_DEFAULT_STRATEGY.
+
+=item C<< Strict => 0|1 >>
+
+This is a placeholder option.
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 print
+
+Usage is
+
+ $z->print($data)
+ print $z $data
+
+Compresses and outputs the contents of the C<$data> parameter. This
+has the same behaviour as the C<print> built-in.
+
+Returns true if successful.
+
+=head2 printf
+
+Usage is
+
+ $z->printf($format, $data)
+ printf $z $format, $data
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns true if successful.
+
+=head2 syswrite
+
+Usage is
+
+ $z->syswrite $data
+ $z->syswrite $data, $length
+ $z->syswrite $data, $length, $offset
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns the number of uncompressed bytes written, or C<undef> if
+unsuccessful.
+
+=head2 write
+
+Usage is
+
+ $z->write $data
+ $z->write $data, $length
+ $z->write $data, $length, $offset
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns the number of uncompressed bytes written, or C<undef> if
+unsuccessful.
+
+=head2 flush
+
+Usage is
+
+ $z->flush;
+ $z->flush($flush_type);
+
+Flushes any pending compressed data to the output file/buffer.
+
+This method takes an optional parameter, C<$flush_type>, that controls
+how the flushing will be carried out. By default the C<$flush_type>
+used is C<Z_FINISH>. Other valid values for C<$flush_type> are
+C<Z_NO_FLUSH>, C<Z_SYNC_FLUSH>, C<Z_FULL_FLUSH> and C<Z_BLOCK>. It is
+strongly recommended that you only set the C<flush_type> parameter if
+you fully understand the implications of what it does - overuse of C<flush>
+can seriously degrade the level of compression achieved. See the C<zlib>
+documentation for details.
+
+Returns true on success.
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the C<close> method has been called.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the output file/buffer.
+It is a fatal error to attempt to seek backward.
+
+Empty parts of the file/buffer will have NULL (0x00) bytes written to them.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+This method always returns C<undef> when compressing.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Flushes any pending compressed data and then closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Compress::Deflate object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Compress::Deflate
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 newStream([OPTS])
+
+Usage is
+
+ $z->newStream( [OPTS] )
+
+Closes the current compressed data stream and starts a new one.
+
+OPTS consists of any of the the options that are available when creating
+the C<$z> object.
+
+See the L</"Constructor Options"> section for more details.
+
+=head2 deflateParams
+
+Usage is
+
+ $z->deflateParams
+
+TODO
+
+=head1 Importing
+
+A number of symbolic constants are required by some methods in
+C<IO::Compress::Deflate>. None are imported by default.
+
+=over 5
+
+=item :all
+
+Imports C<deflate>, C<$DeflateError> and all symbolic
+constants that can be used by C<IO::Compress::Deflate>. Same as doing this
+
+ use IO::Compress::Deflate qw(deflate $DeflateError :constants) ;
+
+=item :constants
+
+Import all symbolic constants. Same as doing this
+
+ use IO::Compress::Deflate qw(:flush :level :strategy) ;
+
+=item :flush
+
+These symbolic constants are used by the C<flush> method.
+
+ Z_NO_FLUSH
+ Z_PARTIAL_FLUSH
+ Z_SYNC_FLUSH
+ Z_FULL_FLUSH
+ Z_FINISH
+ Z_BLOCK
+
+=item :level
+
+These symbolic constants are used by the C<Level> option in the constructor.
+
+ Z_NO_COMPRESSION
+ Z_BEST_SPEED
+ Z_BEST_COMPRESSION
+ Z_DEFAULT_COMPRESSION
+
+=item :strategy
+
+These symbolic constants are used by the C<Strategy> option in the constructor.
+
+ Z_FILTERED
+ Z_HUFFMAN_ONLY
+ Z_RLE
+ Z_FIXED
+ Z_DEFAULT_STRATEGY
+
+
+
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Apache::GZip Revisited
+
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
+
+
+
+=head2 Working with Net::FTP
+
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+For RFC 1950, 1951 and 1952 see
+F<http://www.faqs.org/rfcs/rfc1950.html>,
+F<http://www.faqs.org/rfcs/rfc1951.html> and
+F<http://www.faqs.org/rfcs/rfc1952.html>
+
+The I<zlib> compression library was written by Jean-loup Gailly
+F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
+
+The primary site for the I<zlib> compression library is
+F<http://www.zlib.org>.
+
+The primary site for gzip is F<http://www.gzip.org>.
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Gzip.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Gzip.pm
new file mode 100755
index 00000000000..1978b91b283
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Gzip.pm
@@ -0,0 +1,1242 @@
+
+package IO::Compress::Gzip ;
+
+require 5.004 ;
+
+use strict ;
+use warnings;
+use bytes;
+
+
+use IO::Compress::RawDeflate 2.024 ;
+
+use Compress::Raw::Zlib 2.024 ;
+use IO::Compress::Base::Common 2.024 qw(:Status :Parse createSelfTiedObject);
+use IO::Compress::Gzip::Constants 2.024 ;
+use IO::Compress::Zlib::Extra 2.024 ;
+
+BEGIN
+{
+ if (defined &utf8::downgrade )
+ { *noUTF8 = \&utf8::downgrade }
+ else
+ { *noUTF8 = sub {} }
+}
+
+require Exporter ;
+
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $GzipError);
+
+$VERSION = '2.024';
+$GzipError = '' ;
+
+@ISA = qw(Exporter IO::Compress::RawDeflate);
+@EXPORT_OK = qw( $GzipError gzip ) ;
+%EXPORT_TAGS = %IO::Compress::RawDeflate::DEFLATE_CONSTANTS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+Exporter::export_ok_tags('all');
+
+sub new
+{
+ my $class = shift ;
+
+ my $obj = createSelfTiedObject($class, \$GzipError);
+
+ $obj->_create(undef, @_);
+}
+
+
+sub gzip
+{
+ my $obj = createSelfTiedObject(undef, \$GzipError);
+ return $obj->_def(@_);
+}
+
+#sub newHeader
+#{
+# my $self = shift ;
+# #return GZIP_MINIMUM_HEADER ;
+# return $self->mkHeader(*$self->{Got});
+#}
+
+sub getExtraParams
+{
+ my $self = shift ;
+
+ return (
+ # zlib behaviour
+ $self->getZlibParams(),
+
+ # Gzip header fields
+ 'Minimal' => [0, 1, Parse_boolean, 0],
+ 'Comment' => [0, 1, Parse_any, undef],
+ 'Name' => [0, 1, Parse_any, undef],
+ 'Time' => [0, 1, Parse_any, undef],
+ 'TextFlag' => [0, 1, Parse_boolean, 0],
+ 'HeaderCRC' => [0, 1, Parse_boolean, 0],
+ 'OS_Code' => [0, 1, Parse_unsigned, $Compress::Raw::Zlib::gzip_os_code],
+ 'ExtraField'=> [0, 1, Parse_any, undef],
+ 'ExtraFlags'=> [0, 1, Parse_any, undef],
+
+ );
+}
+
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ # gzip always needs crc32
+ $got->value('CRC32' => 1);
+
+ return 1
+ if $got->value('Merge') ;
+
+ my $strict = $got->value('Strict') ;
+
+
+ {
+ if (! $got->parsed('Time') ) {
+ # Modification time defaults to now.
+ $got->value('Time' => time) ;
+ }
+
+ # Check that the Name & Comment don't have embedded NULLs
+ # Also check that they only contain ISO 8859-1 chars.
+ if ($got->parsed('Name') && defined $got->value('Name')) {
+ my $name = $got->value('Name');
+
+ return $self->saveErrorString(undef, "Null Character found in Name",
+ Z_DATA_ERROR)
+ if $strict && $name =~ /\x00/ ;
+
+ return $self->saveErrorString(undef, "Non ISO 8859-1 Character found in Name",
+ Z_DATA_ERROR)
+ if $strict && $name =~ /$GZIP_FNAME_INVALID_CHAR_RE/o ;
+ }
+
+ if ($got->parsed('Comment') && defined $got->value('Comment')) {
+ my $comment = $got->value('Comment');
+
+ return $self->saveErrorString(undef, "Null Character found in Comment",
+ Z_DATA_ERROR)
+ if $strict && $comment =~ /\x00/ ;
+
+ return $self->saveErrorString(undef, "Non ISO 8859-1 Character found in Comment",
+ Z_DATA_ERROR)
+ if $strict && $comment =~ /$GZIP_FCOMMENT_INVALID_CHAR_RE/o;
+ }
+
+ if ($got->parsed('OS_Code') ) {
+ my $value = $got->value('OS_Code');
+
+ return $self->saveErrorString(undef, "OS_Code must be between 0 and 255, got '$value'")
+ if $value < 0 || $value > 255 ;
+
+ }
+
+ # gzip only supports Deflate at present
+ $got->value('Method' => Z_DEFLATED) ;
+
+ if ( ! $got->parsed('ExtraFlags')) {
+ $got->value('ExtraFlags' => 2)
+ if $got->value('Level') == Z_BEST_SPEED ;
+ $got->value('ExtraFlags' => 4)
+ if $got->value('Level') == Z_BEST_COMPRESSION ;
+ }
+
+ my $data = $got->value('ExtraField') ;
+ if (defined $data) {
+ my $bad = IO::Compress::Zlib::Extra::parseExtraField($data, $strict, 1) ;
+ return $self->saveErrorString(undef, "Error with ExtraField Parameter: $bad", Z_DATA_ERROR)
+ if $bad ;
+
+ $got->value('ExtraField', $data) ;
+ }
+ }
+
+ return 1;
+}
+
+sub mkTrailer
+{
+ my $self = shift ;
+ return pack("V V", *$self->{Compress}->crc32(),
+ *$self->{UnCompSize}->get32bit());
+}
+
+sub getInverseClass
+{
+ return ('IO::Uncompress::Gunzip',
+ \$IO::Uncompress::Gunzip::GunzipError);
+}
+
+sub getFileInfo
+{
+ my $self = shift ;
+ my $params = shift;
+ my $filename = shift ;
+
+ my $defaultTime = (stat($filename))[9] ;
+
+ $params->value('Name' => $filename)
+ if ! $params->parsed('Name') ;
+
+ $params->value('Time' => $defaultTime)
+ if ! $params->parsed('Time') ;
+}
+
+
+sub mkHeader
+{
+ my $self = shift ;
+ my $param = shift ;
+
+ # stort-circuit if a minimal header is requested.
+ return GZIP_MINIMUM_HEADER if $param->value('Minimal') ;
+
+ # METHOD
+ my $method = $param->valueOrDefault('Method', GZIP_CM_DEFLATED) ;
+
+ # FLAGS
+ my $flags = GZIP_FLG_DEFAULT ;
+ $flags |= GZIP_FLG_FTEXT if $param->value('TextFlag') ;
+ $flags |= GZIP_FLG_FHCRC if $param->value('HeaderCRC') ;
+ $flags |= GZIP_FLG_FEXTRA if $param->wantValue('ExtraField') ;
+ $flags |= GZIP_FLG_FNAME if $param->wantValue('Name') ;
+ $flags |= GZIP_FLG_FCOMMENT if $param->wantValue('Comment') ;
+
+ # MTIME
+ my $time = $param->valueOrDefault('Time', GZIP_MTIME_DEFAULT) ;
+
+ # EXTRA FLAGS
+ my $extra_flags = $param->valueOrDefault('ExtraFlags', GZIP_XFL_DEFAULT);
+
+ # OS CODE
+ my $os_code = $param->valueOrDefault('OS_Code', GZIP_OS_DEFAULT) ;
+
+
+ my $out = pack("C4 V C C",
+ GZIP_ID1, # ID1
+ GZIP_ID2, # ID2
+ $method, # Compression Method
+ $flags, # Flags
+ $time, # Modification Time
+ $extra_flags, # Extra Flags
+ $os_code, # Operating System Code
+ ) ;
+
+ # EXTRA
+ if ($flags & GZIP_FLG_FEXTRA) {
+ my $extra = $param->value('ExtraField') ;
+ $out .= pack("v", length $extra) . $extra ;
+ }
+
+ # NAME
+ if ($flags & GZIP_FLG_FNAME) {
+ my $name .= $param->value('Name') ;
+ $name =~ s/\x00.*$//;
+ $out .= $name ;
+ # Terminate the filename with NULL unless it already is
+ $out .= GZIP_NULL_BYTE
+ if !length $name or
+ substr($name, 1, -1) ne GZIP_NULL_BYTE ;
+ }
+
+ # COMMENT
+ if ($flags & GZIP_FLG_FCOMMENT) {
+ my $comment .= $param->value('Comment') ;
+ $comment =~ s/\x00.*$//;
+ $out .= $comment ;
+ # Terminate the comment with NULL unless it already is
+ $out .= GZIP_NULL_BYTE
+ if ! length $comment or
+ substr($comment, 1, -1) ne GZIP_NULL_BYTE;
+ }
+
+ # HEADER CRC
+ $out .= pack("v", crc32($out) & 0x00FF ) if $param->value('HeaderCRC') ;
+
+ noUTF8($out);
+
+ return $out ;
+}
+
+sub mkFinalTrailer
+{
+ return '';
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Compress::Gzip - Write RFC 1952 files/buffers
+
+
+
+=head1 SYNOPSIS
+
+ use IO::Compress::Gzip qw(gzip $GzipError) ;
+
+ my $status = gzip $input => $output [,OPTS]
+ or die "gzip failed: $GzipError\n";
+
+ my $z = new IO::Compress::Gzip $output [,OPTS]
+ or die "gzip failed: $GzipError\n";
+
+ $z->print($string);
+ $z->printf($format, $string);
+ $z->write($string);
+ $z->syswrite($string [, $length, $offset]);
+ $z->flush();
+ $z->tell();
+ $z->eof();
+ $z->seek($position, $whence);
+ $z->binmode();
+ $z->fileno();
+ $z->opened();
+ $z->autoflush();
+ $z->input_line_number();
+ $z->newStream( [OPTS] );
+
+ $z->deflateParams();
+
+ $z->close() ;
+
+ $GzipError ;
+
+ # IO::File mode
+
+ print $z $string;
+ printf $z $format, $string;
+ tell $z
+ eof $z
+ seek $z, $position, $whence
+ binmode $z
+ fileno $z
+ close $z ;
+
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows writing compressed
+data to files or buffer as defined in RFC 1952.
+
+All the gzip headers defined in RFC 1952 can be created using
+this module.
+
+For reading RFC 1952 files/buffers, see the companion module
+L<IO::Uncompress::Gunzip|IO::Uncompress::Gunzip>.
+
+=head1 Functional Interface
+
+A top-level function, C<gzip>, is provided to carry out
+"one-shot" compression between buffers and/or files. For finer
+control over the compression process, see the L</"OO Interface">
+section.
+
+ use IO::Compress::Gzip qw(gzip $GzipError) ;
+
+ gzip $input => $output [,OPTS]
+ or die "gzip failed: $GzipError\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 gzip $input => $output [, OPTS]
+
+C<gzip> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the uncompressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is compressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<gzip> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+In addition, if C<$input> is a simple filename, the default values for
+the C<Name> and C<Time> options will be sourced from that file.
+
+If you do not want to use these defaults they can be overridden by
+explicitly setting the C<Name> and C<Time> options or by setting the
+C<Minimal> parameter.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+compressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the compressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the compressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the compressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the compressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<gzip> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple files/buffers and C<$output> is a single
+file/buffer the input files/buffers will be stored
+in C<$output> as a concatenated series of compressed data streams.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<gzip>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<gzip> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<gzip> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeIn => 0|1 >>
+
+When reading from a file or filehandle, set C<binmode> before reading.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+The behaviour of this option is dependent on the type of output data
+stream.
+
+=over 5
+
+=item * A Buffer
+
+If C<Append> is enabled, all compressed data will be append to the end of
+the output buffer. Otherwise the output buffer will be cleared before any
+compressed data is written to it.
+
+=item * A Filename
+
+If C<Append> is enabled, the file will be opened in append mode. Otherwise
+the contents of the file, if any, will be truncated before any compressed
+data is written to it.
+
+=item * A Filehandle
+
+If C<Append> is enabled, the filehandle will be positioned to the end of
+the file via a call to C<seek> before any compressed data is
+written to it. Otherwise the file pointer will not be moved.
+
+=back
+
+When C<Append> is specified, and set to true, it will I<append> all compressed
+data to the output data stream.
+
+So when the output is a filehandle it will carry out a seek to the eof
+before writing any compressed data. If the output is a filename, it will be opened for
+appending. If the output is a buffer, all compressed data will be appened to
+the existing buffer.
+
+Conversely when C<Append> is not specified, or it is present and is set to
+false, it will operate as follows.
+
+When the output is a filename, it will truncate the contents of the file
+before writing any compressed data. If the output is a filehandle
+its position will not be changed. If the output is a buffer, it will be
+wiped before any compressed data is output.
+
+Defaults to 0.
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt> and write the compressed
+data to the file C<file1.txt.gz>.
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Gzip qw(gzip $GzipError) ;
+
+ my $input = "file1.txt";
+ gzip $input => "$input.gz"
+ or die "gzip failed: $GzipError\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+compressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Gzip qw(gzip $GzipError) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt"
+ or die "Cannot open 'file1.txt': $!\n" ;
+ my $buffer ;
+ gzip $input => \$buffer
+ or die "gzip failed: $GzipError\n";
+
+To compress all files in the directory "/my/home" that match "*.txt"
+and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Gzip qw(gzip $GzipError) ;
+
+ gzip '</my/home/*.txt>' => '<*.gz>'
+ or die "gzip failed: $GzipError\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Gzip qw(gzip $GzipError) ;
+
+ for my $input ( glob "/my/home/*.txt" )
+ {
+ my $output = "$input.gz" ;
+ gzip $input => $output
+ or die "Error compressing '$input': $GzipError\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for C<IO::Compress::Gzip> is shown below
+
+ my $z = new IO::Compress::Gzip $output [,OPTS]
+ or die "IO::Compress::Gzip failed: $GzipError\n";
+
+It returns an C<IO::Compress::Gzip> object on success and undef on failure.
+The variable C<$GzipError> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Compress::Gzip can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal output file operations can be carried out
+with C<$z>.
+For example, to write to a compressed file/buffer you can use either of
+these forms
+
+ $z->print("hello world\n");
+ print $z "hello world\n";
+
+The mandatory parameter C<$output> is used to control the destination
+of the compressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the compressed data
+will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the compressed data will be
+written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the compressed data will be stored
+in C<$$output>.
+
+=back
+
+If the C<$output> parameter is any other type, C<IO::Compress::Gzip>::new will
+return undef.
+
+=head2 Constructor Options
+
+C<OPTS> is any combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$output> parameter is a filehandle. If
+specified, and the value is true, it will result in the C<$output> being
+closed once either the C<close> method is called or the C<IO::Compress::Gzip>
+object is destroyed.
+
+This parameter defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+Opens C<$output> in append mode.
+
+The behaviour of this option is dependent on the type of C<$output>.
+
+=over 5
+
+=item * A Buffer
+
+If C<$output> is a buffer and C<Append> is enabled, all compressed data
+will be append to the end of C<$output>. Otherwise C<$output> will be
+cleared before any data is written to it.
+
+=item * A Filename
+
+If C<$output> is a filename and C<Append> is enabled, the file will be
+opened in append mode. Otherwise the contents of the file, if any, will be
+truncated before any compressed data is written to it.
+
+=item * A Filehandle
+
+If C<$output> is a filehandle, the file pointer will be positioned to the
+end of the file via a call to C<seek> before any compressed data is written
+to it. Otherwise the file pointer will not be moved.
+
+=back
+
+This parameter defaults to 0.
+
+=item C<< Merge => 0|1 >>
+
+This option is used to compress input data and append it to an existing
+compressed data stream in C<$output>. The end result is a single compressed
+data stream stored in C<$output>.
+
+It is a fatal error to attempt to use this option when C<$output> is not an
+RFC 1952 data stream.
+
+There are a number of other limitations with the C<Merge> option:
+
+=over 5
+
+=item 1
+
+This module needs to have been built with zlib 1.2.1 or better to work. A
+fatal error will be thrown if C<Merge> is used with an older version of
+zlib.
+
+=item 2
+
+If C<$output> is a file or a filehandle, it must be seekable.
+
+=back
+
+This parameter defaults to 0.
+
+=item -Level
+
+Defines the compression level used by zlib. The value should either be
+a number between 0 and 9 (0 means no compression and 9 is maximum
+compression), or one of the symbolic constants defined below.
+
+ Z_NO_COMPRESSION
+ Z_BEST_SPEED
+ Z_BEST_COMPRESSION
+ Z_DEFAULT_COMPRESSION
+
+The default is Z_DEFAULT_COMPRESSION.
+
+Note, these constants are not imported by C<IO::Compress::Gzip> by default.
+
+ use IO::Compress::Gzip qw(:strategy);
+ use IO::Compress::Gzip qw(:constants);
+ use IO::Compress::Gzip qw(:all);
+
+=item -Strategy
+
+Defines the strategy used to tune the compression. Use one of the symbolic
+constants defined below.
+
+ Z_FILTERED
+ Z_HUFFMAN_ONLY
+ Z_RLE
+ Z_FIXED
+ Z_DEFAULT_STRATEGY
+
+The default is Z_DEFAULT_STRATEGY.
+
+=item C<< Minimal => 0|1 >>
+
+If specified, this option will force the creation of the smallest possible
+compliant gzip header (which is exactly 10 bytes long) as defined in
+RFC 1952.
+
+See the section titled "Compliance" in RFC 1952 for a definition
+of the values used for the fields in the gzip header.
+
+All other parameters that control the content of the gzip header will
+be ignored if this parameter is set to 1.
+
+This parameter defaults to 0.
+
+=item C<< Comment => $comment >>
+
+Stores the contents of C<$comment> in the COMMENT field in
+the gzip header.
+By default, no comment field is written to the gzip file.
+
+If the C<-Strict> option is enabled, the comment can only consist of ISO
+8859-1 characters plus line feed.
+
+If the C<-Strict> option is disabled, the comment field can contain any
+character except NULL. If any null characters are present, the field
+will be truncated at the first NULL.
+
+=item C<< Name => $string >>
+
+Stores the contents of C<$string> in the gzip NAME header field. If
+C<Name> is not specified, no gzip NAME field will be created.
+
+If the C<-Strict> option is enabled, C<$string> can only consist of ISO
+8859-1 characters.
+
+If C<-Strict> is disabled, then C<$string> can contain any character
+except NULL. If any null characters are present, the field will be
+truncated at the first NULL.
+
+=item C<< Time => $number >>
+
+Sets the MTIME field in the gzip header to $number.
+
+This field defaults to the time the C<IO::Compress::Gzip> object was created
+if this option is not specified.
+
+=item C<< TextFlag => 0|1 >>
+
+This parameter controls the setting of the FLG.FTEXT bit in the gzip
+header. It is used to signal that the data stored in the gzip file/buffer
+is probably text.
+
+The default is 0.
+
+=item C<< HeaderCRC => 0|1 >>
+
+When true this parameter will set the FLG.FHCRC bit to 1 in the gzip header
+and set the CRC16 header field to the CRC of the complete gzip header
+except the CRC16 field itself.
+
+B<Note> that gzip files created with the C<HeaderCRC> flag set to 1 cannot
+be read by most, if not all, of the the standard gunzip utilities, most
+notably gzip version 1.2.4. You should therefore avoid using this option if
+you want to maximize the portability of your gzip files.
+
+This parameter defaults to 0.
+
+=item C<< OS_Code => $value >>
+
+Stores C<$value> in the gzip OS header field. A number between 0 and 255 is
+valid.
+
+If not specified, this parameter defaults to the OS code of the Operating
+System this module was built on. The value 3 is used as a catch-all for all
+Unix variants and unknown Operating Systems.
+
+=item C<< ExtraField => $data >>
+
+This parameter allows additional metadata to be stored in the ExtraField in
+the gzip header. An RFC 1952 compliant ExtraField consists of zero or more
+subfields. Each subfield consists of a two byte header followed by the
+subfield data.
+
+The list of subfields can be supplied in any of the following formats
+
+ -ExtraField => [$id1, $data1,
+ $id2, $data2,
+ ...
+ ]
+ -ExtraField => [ [$id1 => $data1],
+ [$id2 => $data2],
+ ...
+ ]
+ -ExtraField => { $id1 => $data1,
+ $id2 => $data2,
+ ...
+ }
+
+Where C<$id1>, C<$id2> are two byte subfield ID's. The second byte of
+the ID cannot be 0, unless the C<Strict> option has been disabled.
+
+If you use the hash syntax, you have no control over the order in which
+the ExtraSubFields are stored, plus you cannot have SubFields with
+duplicate ID.
+
+Alternatively the list of subfields can by supplied as a scalar, thus
+
+ -ExtraField => $rawdata
+
+If you use the raw format, and the C<Strict> option is enabled,
+C<IO::Compress::Gzip> will check that C<$rawdata> consists of zero or more
+conformant sub-fields. When C<Strict> is disabled, C<$rawdata> can
+consist of any arbitrary byte stream.
+
+The maximum size of the Extra Field 65535 bytes.
+
+=item C<< ExtraFlags => $value >>
+
+Sets the XFL byte in the gzip header to C<$value>.
+
+If this option is not present, the value stored in XFL field will be
+determined by the setting of the C<Level> option.
+
+If C<< Level => Z_BEST_SPEED >> has been specified then XFL is set to 2.
+If C<< Level => Z_BEST_COMPRESSION >> has been specified then XFL is set to 4.
+Otherwise XFL is set to 0.
+
+=item C<< Strict => 0|1 >>
+
+C<Strict> will optionally police the values supplied with other options
+to ensure they are compliant with RFC1952.
+
+This option is enabled by default.
+
+If C<Strict> is enabled the following behaviour will be policed:
+
+=over 5
+
+=item *
+
+The value supplied with the C<Name> option can only contain ISO 8859-1
+characters.
+
+=item *
+
+The value supplied with the C<Comment> option can only contain ISO 8859-1
+characters plus line-feed.
+
+=item *
+
+The values supplied with the C<-Name> and C<-Comment> options cannot
+contain multiple embedded nulls.
+
+=item *
+
+If an C<ExtraField> option is specified and it is a simple scalar,
+it must conform to the sub-field structure as defined in RFC 1952.
+
+=item *
+
+If an C<ExtraField> option is specified the second byte of the ID will be
+checked in each subfield to ensure that it does not contain the reserved
+value 0x00.
+
+=back
+
+When C<Strict> is disabled the following behaviour will be policed:
+
+=over 5
+
+=item *
+
+The value supplied with C<-Name> option can contain
+any character except NULL.
+
+=item *
+
+The value supplied with C<-Comment> option can contain any character
+except NULL.
+
+=item *
+
+The values supplied with the C<-Name> and C<-Comment> options can contain
+multiple embedded nulls. The string written to the gzip header will
+consist of the characters up to, but not including, the first embedded
+NULL.
+
+=item *
+
+If an C<ExtraField> option is specified and it is a simple scalar, the
+structure will not be checked. The only error is if the length is too big.
+
+=item *
+
+The ID header in an C<ExtraField> sub-field can consist of any two bytes.
+
+=back
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 print
+
+Usage is
+
+ $z->print($data)
+ print $z $data
+
+Compresses and outputs the contents of the C<$data> parameter. This
+has the same behaviour as the C<print> built-in.
+
+Returns true if successful.
+
+=head2 printf
+
+Usage is
+
+ $z->printf($format, $data)
+ printf $z $format, $data
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns true if successful.
+
+=head2 syswrite
+
+Usage is
+
+ $z->syswrite $data
+ $z->syswrite $data, $length
+ $z->syswrite $data, $length, $offset
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns the number of uncompressed bytes written, or C<undef> if
+unsuccessful.
+
+=head2 write
+
+Usage is
+
+ $z->write $data
+ $z->write $data, $length
+ $z->write $data, $length, $offset
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns the number of uncompressed bytes written, or C<undef> if
+unsuccessful.
+
+=head2 flush
+
+Usage is
+
+ $z->flush;
+ $z->flush($flush_type);
+
+Flushes any pending compressed data to the output file/buffer.
+
+This method takes an optional parameter, C<$flush_type>, that controls
+how the flushing will be carried out. By default the C<$flush_type>
+used is C<Z_FINISH>. Other valid values for C<$flush_type> are
+C<Z_NO_FLUSH>, C<Z_SYNC_FLUSH>, C<Z_FULL_FLUSH> and C<Z_BLOCK>. It is
+strongly recommended that you only set the C<flush_type> parameter if
+you fully understand the implications of what it does - overuse of C<flush>
+can seriously degrade the level of compression achieved. See the C<zlib>
+documentation for details.
+
+Returns true on success.
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the C<close> method has been called.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the output file/buffer.
+It is a fatal error to attempt to seek backward.
+
+Empty parts of the file/buffer will have NULL (0x00) bytes written to them.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+This method always returns C<undef> when compressing.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Flushes any pending compressed data and then closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Compress::Gzip object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Compress::Gzip
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 newStream([OPTS])
+
+Usage is
+
+ $z->newStream( [OPTS] )
+
+Closes the current compressed data stream and starts a new one.
+
+OPTS consists of any of the the options that are available when creating
+the C<$z> object.
+
+See the L</"Constructor Options"> section for more details.
+
+=head2 deflateParams
+
+Usage is
+
+ $z->deflateParams
+
+TODO
+
+=head1 Importing
+
+A number of symbolic constants are required by some methods in
+C<IO::Compress::Gzip>. None are imported by default.
+
+=over 5
+
+=item :all
+
+Imports C<gzip>, C<$GzipError> and all symbolic
+constants that can be used by C<IO::Compress::Gzip>. Same as doing this
+
+ use IO::Compress::Gzip qw(gzip $GzipError :constants) ;
+
+=item :constants
+
+Import all symbolic constants. Same as doing this
+
+ use IO::Compress::Gzip qw(:flush :level :strategy) ;
+
+=item :flush
+
+These symbolic constants are used by the C<flush> method.
+
+ Z_NO_FLUSH
+ Z_PARTIAL_FLUSH
+ Z_SYNC_FLUSH
+ Z_FULL_FLUSH
+ Z_FINISH
+ Z_BLOCK
+
+=item :level
+
+These symbolic constants are used by the C<Level> option in the constructor.
+
+ Z_NO_COMPRESSION
+ Z_BEST_SPEED
+ Z_BEST_COMPRESSION
+ Z_DEFAULT_COMPRESSION
+
+=item :strategy
+
+These symbolic constants are used by the C<Strategy> option in the constructor.
+
+ Z_FILTERED
+ Z_HUFFMAN_ONLY
+ Z_RLE
+ Z_FIXED
+ Z_DEFAULT_STRATEGY
+
+
+
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Apache::GZip Revisited
+
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
+
+
+
+=head2 Working with Net::FTP
+
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+For RFC 1950, 1951 and 1952 see
+F<http://www.faqs.org/rfcs/rfc1950.html>,
+F<http://www.faqs.org/rfcs/rfc1951.html> and
+F<http://www.faqs.org/rfcs/rfc1952.html>
+
+The I<zlib> compression library was written by Jean-loup Gailly
+F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
+
+The primary site for the I<zlib> compression library is
+F<http://www.zlib.org>.
+
+The primary site for gzip is F<http://www.gzip.org>.
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Gzip/Constants.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Gzip/Constants.pm
new file mode 100755
index 00000000000..8504330d188
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Gzip/Constants.pm
@@ -0,0 +1,148 @@
+package IO::Compress::Gzip::Constants;
+
+use strict ;
+use warnings;
+use bytes;
+
+require Exporter;
+
+our ($VERSION, @ISA, @EXPORT, %GZIP_OS_Names);
+our ($GZIP_FNAME_INVALID_CHAR_RE, $GZIP_FCOMMENT_INVALID_CHAR_RE);
+
+$VERSION = '2.024';
+
+@ISA = qw(Exporter);
+
+@EXPORT= qw(
+
+ GZIP_ID_SIZE
+ GZIP_ID1
+ GZIP_ID2
+
+ GZIP_FLG_DEFAULT
+ GZIP_FLG_FTEXT
+ GZIP_FLG_FHCRC
+ GZIP_FLG_FEXTRA
+ GZIP_FLG_FNAME
+ GZIP_FLG_FCOMMENT
+ GZIP_FLG_RESERVED
+
+ GZIP_CM_DEFLATED
+
+ GZIP_MIN_HEADER_SIZE
+ GZIP_TRAILER_SIZE
+
+ GZIP_MTIME_DEFAULT
+ GZIP_XFL_DEFAULT
+ GZIP_FEXTRA_HEADER_SIZE
+ GZIP_FEXTRA_MAX_SIZE
+ GZIP_FEXTRA_SUBFIELD_HEADER_SIZE
+ GZIP_FEXTRA_SUBFIELD_ID_SIZE
+ GZIP_FEXTRA_SUBFIELD_LEN_SIZE
+ GZIP_FEXTRA_SUBFIELD_MAX_SIZE
+
+ $GZIP_FNAME_INVALID_CHAR_RE
+ $GZIP_FCOMMENT_INVALID_CHAR_RE
+
+ GZIP_FHCRC_SIZE
+
+ GZIP_ISIZE_MAX
+ GZIP_ISIZE_MOD_VALUE
+
+
+ GZIP_NULL_BYTE
+
+ GZIP_OS_DEFAULT
+
+ %GZIP_OS_Names
+
+ GZIP_MINIMUM_HEADER
+
+ );
+
+# Constant names derived from RFC 1952
+
+use constant GZIP_ID_SIZE => 2 ;
+use constant GZIP_ID1 => 0x1F;
+use constant GZIP_ID2 => 0x8B;
+
+use constant GZIP_MIN_HEADER_SIZE => 10 ;# minimum gzip header size
+use constant GZIP_TRAILER_SIZE => 8 ;
+
+
+use constant GZIP_FLG_DEFAULT => 0x00 ;
+use constant GZIP_FLG_FTEXT => 0x01 ;
+use constant GZIP_FLG_FHCRC => 0x02 ; # called CONTINUATION in gzip
+use constant GZIP_FLG_FEXTRA => 0x04 ;
+use constant GZIP_FLG_FNAME => 0x08 ;
+use constant GZIP_FLG_FCOMMENT => 0x10 ;
+#use constant GZIP_FLG_ENCRYPTED => 0x20 ; # documented in gzip sources
+use constant GZIP_FLG_RESERVED => (0x20 | 0x40 | 0x80) ;
+
+use constant GZIP_XFL_DEFAULT => 0x00 ;
+
+use constant GZIP_MTIME_DEFAULT => 0x00 ;
+
+use constant GZIP_FEXTRA_HEADER_SIZE => 2 ;
+use constant GZIP_FEXTRA_MAX_SIZE => 0xFFFF ;
+use constant GZIP_FEXTRA_SUBFIELD_ID_SIZE => 2 ;
+use constant GZIP_FEXTRA_SUBFIELD_LEN_SIZE => 2 ;
+use constant GZIP_FEXTRA_SUBFIELD_HEADER_SIZE => GZIP_FEXTRA_SUBFIELD_ID_SIZE +
+ GZIP_FEXTRA_SUBFIELD_LEN_SIZE;
+use constant GZIP_FEXTRA_SUBFIELD_MAX_SIZE => GZIP_FEXTRA_MAX_SIZE -
+ GZIP_FEXTRA_SUBFIELD_HEADER_SIZE ;
+
+
+if (ord('A') == 193)
+{
+ # EBCDIC
+ $GZIP_FNAME_INVALID_CHAR_RE = '[\x00-\x3f\xff]';
+ $GZIP_FCOMMENT_INVALID_CHAR_RE = '[\x00-\x0a\x11-\x14\x16-\x3f\xff]';
+
+}
+else
+{
+ $GZIP_FNAME_INVALID_CHAR_RE = '[\x00-\x1F\x7F-\x9F]';
+ $GZIP_FCOMMENT_INVALID_CHAR_RE = '[\x00-\x09\x11-\x1F\x7F-\x9F]';
+}
+
+use constant GZIP_FHCRC_SIZE => 2 ; # aka CONTINUATION in gzip
+
+use constant GZIP_CM_DEFLATED => 8 ;
+
+use constant GZIP_NULL_BYTE => "\x00";
+use constant GZIP_ISIZE_MAX => 0xFFFFFFFF ;
+use constant GZIP_ISIZE_MOD_VALUE => GZIP_ISIZE_MAX + 1 ;
+
+# OS Names sourced from http://www.gzip.org/format.txt
+
+use constant GZIP_OS_DEFAULT=> 0xFF ;
+%GZIP_OS_Names = (
+ 0 => 'MS-DOS',
+ 1 => 'Amiga',
+ 2 => 'VMS',
+ 3 => 'Unix',
+ 4 => 'VM/CMS',
+ 5 => 'Atari TOS',
+ 6 => 'HPFS (OS/2, NT)',
+ 7 => 'Macintosh',
+ 8 => 'Z-System',
+ 9 => 'CP/M',
+ 10 => 'TOPS-20',
+ 11 => 'NTFS (NT)',
+ 12 => 'SMS QDOS',
+ 13 => 'Acorn RISCOS',
+ 14 => 'VFAT file system (Win95, NT)',
+ 15 => 'MVS',
+ 16 => 'BeOS',
+ 17 => 'Tandem/NSK',
+ 18 => 'THEOS',
+ GZIP_OS_DEFAULT() => 'Unknown',
+ ) ;
+
+use constant GZIP_MINIMUM_HEADER => pack("C4 V C C",
+ GZIP_ID1, GZIP_ID2, GZIP_CM_DEFLATED, GZIP_FLG_DEFAULT,
+ GZIP_MTIME_DEFAULT, GZIP_XFL_DEFAULT, GZIP_OS_DEFAULT) ;
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/RawDeflate.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/RawDeflate.pm
new file mode 100755
index 00000000000..b97b51c0509
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/RawDeflate.pm
@@ -0,0 +1,1017 @@
+package IO::Compress::RawDeflate ;
+
+# create RFC1951
+#
+use strict ;
+use warnings;
+use bytes;
+
+
+use IO::Compress::Base 2.024 ;
+use IO::Compress::Base::Common 2.024 qw(:Status createSelfTiedObject);
+use IO::Compress::Adapter::Deflate 2.024 ;
+
+require Exporter ;
+
+
+our ($VERSION, @ISA, @EXPORT_OK, %DEFLATE_CONSTANTS, %EXPORT_TAGS, $RawDeflateError);
+
+$VERSION = '2.024';
+$RawDeflateError = '';
+
+@ISA = qw(Exporter IO::Compress::Base);
+@EXPORT_OK = qw( $RawDeflateError rawdeflate ) ;
+
+%EXPORT_TAGS = ( flush => [qw{
+ Z_NO_FLUSH
+ Z_PARTIAL_FLUSH
+ Z_SYNC_FLUSH
+ Z_FULL_FLUSH
+ Z_FINISH
+ Z_BLOCK
+ }],
+ level => [qw{
+ Z_NO_COMPRESSION
+ Z_BEST_SPEED
+ Z_BEST_COMPRESSION
+ Z_DEFAULT_COMPRESSION
+ }],
+ strategy => [qw{
+ Z_FILTERED
+ Z_HUFFMAN_ONLY
+ Z_RLE
+ Z_FIXED
+ Z_DEFAULT_STRATEGY
+ }],
+
+ );
+
+{
+ my %seen;
+ foreach (keys %EXPORT_TAGS )
+ {
+ push @{$EXPORT_TAGS{constants}},
+ grep { !$seen{$_}++ }
+ @{ $EXPORT_TAGS{$_} }
+ }
+ $EXPORT_TAGS{all} = $EXPORT_TAGS{constants} ;
+}
+
+
+%DEFLATE_CONSTANTS = %EXPORT_TAGS;
+
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+
+Exporter::export_ok_tags('all');
+
+
+
+sub new
+{
+ my $class = shift ;
+
+ my $obj = createSelfTiedObject($class, \$RawDeflateError);
+
+ return $obj->_create(undef, @_);
+}
+
+sub rawdeflate
+{
+ my $obj = createSelfTiedObject(undef, \$RawDeflateError);
+ return $obj->_def(@_);
+}
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift;
+
+ return 1 ;
+}
+
+sub mkComp
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ my ($obj, $errstr, $errno) = IO::Compress::Adapter::Deflate::mkCompObject(
+ $got->value('CRC32'),
+ $got->value('Adler32'),
+ $got->value('Level'),
+ $got->value('Strategy')
+ );
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ return $obj;
+}
+
+
+sub mkHeader
+{
+ my $self = shift ;
+ return '';
+}
+
+sub mkTrailer
+{
+ my $self = shift ;
+ return '';
+}
+
+sub mkFinalTrailer
+{
+ return '';
+}
+
+
+#sub newHeader
+#{
+# my $self = shift ;
+# return '';
+#}
+
+sub getExtraParams
+{
+ my $self = shift ;
+ return $self->getZlibParams();
+}
+
+sub getZlibParams
+{
+ my $self = shift ;
+
+ use IO::Compress::Base::Common 2.024 qw(:Parse);
+ use Compress::Raw::Zlib 2.024 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
+
+
+ return (
+
+ # zlib behaviour
+ #'Method' => [0, 1, Parse_unsigned, Z_DEFLATED],
+ 'Level' => [0, 1, Parse_signed, Z_DEFAULT_COMPRESSION],
+ 'Strategy' => [0, 1, Parse_signed, Z_DEFAULT_STRATEGY],
+
+ 'CRC32' => [0, 1, Parse_boolean, 0],
+ 'ADLER32' => [0, 1, Parse_boolean, 0],
+ 'Merge' => [1, 1, Parse_boolean, 0],
+ );
+
+
+}
+
+sub getInverseClass
+{
+ return ('IO::Uncompress::RawInflate',
+ \$IO::Uncompress::RawInflate::RawInflateError);
+}
+
+sub getFileInfo
+{
+ my $self = shift ;
+ my $params = shift;
+ my $file = shift ;
+
+}
+
+use IO::Seekable qw(SEEK_SET);
+
+sub createMerge
+{
+ my $self = shift ;
+ my $outValue = shift ;
+ my $outType = shift ;
+
+ my ($invClass, $error_ref) = $self->getInverseClass();
+ eval "require $invClass"
+ or die "aaaahhhh" ;
+
+ my $inf = $invClass->new( $outValue,
+ Transparent => 0,
+ #Strict => 1,
+ AutoClose => 0,
+ Scan => 1)
+ or return $self->saveErrorString(undef, "Cannot create InflateScan object: $$error_ref" ) ;
+
+ my $end_offset = 0;
+ $inf->scan()
+ or return $self->saveErrorString(undef, "Error Scanning: $$error_ref", $inf->errorNo) ;
+ $inf->zap($end_offset)
+ or return $self->saveErrorString(undef, "Error Zapping: $$error_ref", $inf->errorNo) ;
+
+ my $def = *$self->{Compress} = $inf->createDeflate();
+
+ *$self->{Header} = *$inf->{Info}{Header};
+ *$self->{UnCompSize} = *$inf->{UnCompSize}->clone();
+ *$self->{CompSize} = *$inf->{CompSize}->clone();
+ # TODO -- fix this
+ #*$self->{CompSize} = new U64(0, *$self->{UnCompSize_32bit});
+
+
+ if ( $outType eq 'buffer')
+ { substr( ${ *$self->{Buffer} }, $end_offset) = '' }
+ elsif ($outType eq 'handle' || $outType eq 'filename') {
+ *$self->{FH} = *$inf->{FH} ;
+ delete *$inf->{FH};
+ *$self->{FH}->flush() ;
+ *$self->{Handle} = 1 if $outType eq 'handle';
+
+ #seek(*$self->{FH}, $end_offset, SEEK_SET)
+ *$self->{FH}->seek($end_offset, SEEK_SET)
+ or return $self->saveErrorString(undef, $!, $!) ;
+ }
+
+ return $def ;
+}
+
+#### zlib specific methods
+
+sub deflateParams
+{
+ my $self = shift ;
+
+ my $level = shift ;
+ my $strategy = shift ;
+
+ my $status = *$self->{Compress}->deflateParams(Level => $level, Strategy => $strategy) ;
+ return $self->saveErrorString(0, *$self->{Compress}{Error}, *$self->{Compress}{ErrorNo})
+ if $status == STATUS_ERROR;
+
+ return 1;
+}
+
+
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Compress::RawDeflate - Write RFC 1951 files/buffers
+
+
+
+=head1 SYNOPSIS
+
+ use IO::Compress::RawDeflate qw(rawdeflate $RawDeflateError) ;
+
+ my $status = rawdeflate $input => $output [,OPTS]
+ or die "rawdeflate failed: $RawDeflateError\n";
+
+ my $z = new IO::Compress::RawDeflate $output [,OPTS]
+ or die "rawdeflate failed: $RawDeflateError\n";
+
+ $z->print($string);
+ $z->printf($format, $string);
+ $z->write($string);
+ $z->syswrite($string [, $length, $offset]);
+ $z->flush();
+ $z->tell();
+ $z->eof();
+ $z->seek($position, $whence);
+ $z->binmode();
+ $z->fileno();
+ $z->opened();
+ $z->autoflush();
+ $z->input_line_number();
+ $z->newStream( [OPTS] );
+
+ $z->deflateParams();
+
+ $z->close() ;
+
+ $RawDeflateError ;
+
+ # IO::File mode
+
+ print $z $string;
+ printf $z $format, $string;
+ tell $z
+ eof $z
+ seek $z, $position, $whence
+ binmode $z
+ fileno $z
+ close $z ;
+
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows writing compressed
+data to files or buffer as defined in RFC 1951.
+
+Note that RFC 1951 data is not a good choice of compression format
+to use in isolation, especially if you want to auto-detect it.
+
+For reading RFC 1951 files/buffers, see the companion module
+L<IO::Uncompress::RawInflate|IO::Uncompress::RawInflate>.
+
+=head1 Functional Interface
+
+A top-level function, C<rawdeflate>, is provided to carry out
+"one-shot" compression between buffers and/or files. For finer
+control over the compression process, see the L</"OO Interface">
+section.
+
+ use IO::Compress::RawDeflate qw(rawdeflate $RawDeflateError) ;
+
+ rawdeflate $input => $output [,OPTS]
+ or die "rawdeflate failed: $RawDeflateError\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 rawdeflate $input => $output [, OPTS]
+
+C<rawdeflate> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the uncompressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is compressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<rawdeflate> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+compressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the compressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the compressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the compressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the compressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<rawdeflate> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple files/buffers and C<$output> is a single
+file/buffer the input files/buffers will be stored
+in C<$output> as a concatenated series of compressed data streams.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<rawdeflate>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<rawdeflate> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<rawdeflate> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeIn => 0|1 >>
+
+When reading from a file or filehandle, set C<binmode> before reading.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+The behaviour of this option is dependent on the type of output data
+stream.
+
+=over 5
+
+=item * A Buffer
+
+If C<Append> is enabled, all compressed data will be append to the end of
+the output buffer. Otherwise the output buffer will be cleared before any
+compressed data is written to it.
+
+=item * A Filename
+
+If C<Append> is enabled, the file will be opened in append mode. Otherwise
+the contents of the file, if any, will be truncated before any compressed
+data is written to it.
+
+=item * A Filehandle
+
+If C<Append> is enabled, the filehandle will be positioned to the end of
+the file via a call to C<seek> before any compressed data is
+written to it. Otherwise the file pointer will not be moved.
+
+=back
+
+When C<Append> is specified, and set to true, it will I<append> all compressed
+data to the output data stream.
+
+So when the output is a filehandle it will carry out a seek to the eof
+before writing any compressed data. If the output is a filename, it will be opened for
+appending. If the output is a buffer, all compressed data will be appened to
+the existing buffer.
+
+Conversely when C<Append> is not specified, or it is present and is set to
+false, it will operate as follows.
+
+When the output is a filename, it will truncate the contents of the file
+before writing any compressed data. If the output is a filehandle
+its position will not be changed. If the output is a buffer, it will be
+wiped before any compressed data is output.
+
+Defaults to 0.
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt> and write the compressed
+data to the file C<file1.txt.1951>.
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::RawDeflate qw(rawdeflate $RawDeflateError) ;
+
+ my $input = "file1.txt";
+ rawdeflate $input => "$input.1951"
+ or die "rawdeflate failed: $RawDeflateError\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+compressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::RawDeflate qw(rawdeflate $RawDeflateError) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt"
+ or die "Cannot open 'file1.txt': $!\n" ;
+ my $buffer ;
+ rawdeflate $input => \$buffer
+ or die "rawdeflate failed: $RawDeflateError\n";
+
+To compress all files in the directory "/my/home" that match "*.txt"
+and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::RawDeflate qw(rawdeflate $RawDeflateError) ;
+
+ rawdeflate '</my/home/*.txt>' => '<*.1951>'
+ or die "rawdeflate failed: $RawDeflateError\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::RawDeflate qw(rawdeflate $RawDeflateError) ;
+
+ for my $input ( glob "/my/home/*.txt" )
+ {
+ my $output = "$input.1951" ;
+ rawdeflate $input => $output
+ or die "Error compressing '$input': $RawDeflateError\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for C<IO::Compress::RawDeflate> is shown below
+
+ my $z = new IO::Compress::RawDeflate $output [,OPTS]
+ or die "IO::Compress::RawDeflate failed: $RawDeflateError\n";
+
+It returns an C<IO::Compress::RawDeflate> object on success and undef on failure.
+The variable C<$RawDeflateError> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Compress::RawDeflate can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal output file operations can be carried out
+with C<$z>.
+For example, to write to a compressed file/buffer you can use either of
+these forms
+
+ $z->print("hello world\n");
+ print $z "hello world\n";
+
+The mandatory parameter C<$output> is used to control the destination
+of the compressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the compressed data
+will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the compressed data will be
+written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the compressed data will be stored
+in C<$$output>.
+
+=back
+
+If the C<$output> parameter is any other type, C<IO::Compress::RawDeflate>::new will
+return undef.
+
+=head2 Constructor Options
+
+C<OPTS> is any combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$output> parameter is a filehandle. If
+specified, and the value is true, it will result in the C<$output> being
+closed once either the C<close> method is called or the C<IO::Compress::RawDeflate>
+object is destroyed.
+
+This parameter defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+Opens C<$output> in append mode.
+
+The behaviour of this option is dependent on the type of C<$output>.
+
+=over 5
+
+=item * A Buffer
+
+If C<$output> is a buffer and C<Append> is enabled, all compressed data
+will be append to the end of C<$output>. Otherwise C<$output> will be
+cleared before any data is written to it.
+
+=item * A Filename
+
+If C<$output> is a filename and C<Append> is enabled, the file will be
+opened in append mode. Otherwise the contents of the file, if any, will be
+truncated before any compressed data is written to it.
+
+=item * A Filehandle
+
+If C<$output> is a filehandle, the file pointer will be positioned to the
+end of the file via a call to C<seek> before any compressed data is written
+to it. Otherwise the file pointer will not be moved.
+
+=back
+
+This parameter defaults to 0.
+
+=item C<< Merge => 0|1 >>
+
+This option is used to compress input data and append it to an existing
+compressed data stream in C<$output>. The end result is a single compressed
+data stream stored in C<$output>.
+
+It is a fatal error to attempt to use this option when C<$output> is not an
+RFC 1951 data stream.
+
+There are a number of other limitations with the C<Merge> option:
+
+=over 5
+
+=item 1
+
+This module needs to have been built with zlib 1.2.1 or better to work. A
+fatal error will be thrown if C<Merge> is used with an older version of
+zlib.
+
+=item 2
+
+If C<$output> is a file or a filehandle, it must be seekable.
+
+=back
+
+This parameter defaults to 0.
+
+=item -Level
+
+Defines the compression level used by zlib. The value should either be
+a number between 0 and 9 (0 means no compression and 9 is maximum
+compression), or one of the symbolic constants defined below.
+
+ Z_NO_COMPRESSION
+ Z_BEST_SPEED
+ Z_BEST_COMPRESSION
+ Z_DEFAULT_COMPRESSION
+
+The default is Z_DEFAULT_COMPRESSION.
+
+Note, these constants are not imported by C<IO::Compress::RawDeflate> by default.
+
+ use IO::Compress::RawDeflate qw(:strategy);
+ use IO::Compress::RawDeflate qw(:constants);
+ use IO::Compress::RawDeflate qw(:all);
+
+=item -Strategy
+
+Defines the strategy used to tune the compression. Use one of the symbolic
+constants defined below.
+
+ Z_FILTERED
+ Z_HUFFMAN_ONLY
+ Z_RLE
+ Z_FIXED
+ Z_DEFAULT_STRATEGY
+
+The default is Z_DEFAULT_STRATEGY.
+
+=item C<< Strict => 0|1 >>
+
+This is a placeholder option.
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 print
+
+Usage is
+
+ $z->print($data)
+ print $z $data
+
+Compresses and outputs the contents of the C<$data> parameter. This
+has the same behaviour as the C<print> built-in.
+
+Returns true if successful.
+
+=head2 printf
+
+Usage is
+
+ $z->printf($format, $data)
+ printf $z $format, $data
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns true if successful.
+
+=head2 syswrite
+
+Usage is
+
+ $z->syswrite $data
+ $z->syswrite $data, $length
+ $z->syswrite $data, $length, $offset
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns the number of uncompressed bytes written, or C<undef> if
+unsuccessful.
+
+=head2 write
+
+Usage is
+
+ $z->write $data
+ $z->write $data, $length
+ $z->write $data, $length, $offset
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns the number of uncompressed bytes written, or C<undef> if
+unsuccessful.
+
+=head2 flush
+
+Usage is
+
+ $z->flush;
+ $z->flush($flush_type);
+
+Flushes any pending compressed data to the output file/buffer.
+
+This method takes an optional parameter, C<$flush_type>, that controls
+how the flushing will be carried out. By default the C<$flush_type>
+used is C<Z_FINISH>. Other valid values for C<$flush_type> are
+C<Z_NO_FLUSH>, C<Z_SYNC_FLUSH>, C<Z_FULL_FLUSH> and C<Z_BLOCK>. It is
+strongly recommended that you only set the C<flush_type> parameter if
+you fully understand the implications of what it does - overuse of C<flush>
+can seriously degrade the level of compression achieved. See the C<zlib>
+documentation for details.
+
+Returns true on success.
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the C<close> method has been called.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the output file/buffer.
+It is a fatal error to attempt to seek backward.
+
+Empty parts of the file/buffer will have NULL (0x00) bytes written to them.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+This method always returns C<undef> when compressing.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Flushes any pending compressed data and then closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Compress::RawDeflate object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Compress::RawDeflate
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 newStream([OPTS])
+
+Usage is
+
+ $z->newStream( [OPTS] )
+
+Closes the current compressed data stream and starts a new one.
+
+OPTS consists of any of the the options that are available when creating
+the C<$z> object.
+
+See the L</"Constructor Options"> section for more details.
+
+=head2 deflateParams
+
+Usage is
+
+ $z->deflateParams
+
+TODO
+
+=head1 Importing
+
+A number of symbolic constants are required by some methods in
+C<IO::Compress::RawDeflate>. None are imported by default.
+
+=over 5
+
+=item :all
+
+Imports C<rawdeflate>, C<$RawDeflateError> and all symbolic
+constants that can be used by C<IO::Compress::RawDeflate>. Same as doing this
+
+ use IO::Compress::RawDeflate qw(rawdeflate $RawDeflateError :constants) ;
+
+=item :constants
+
+Import all symbolic constants. Same as doing this
+
+ use IO::Compress::RawDeflate qw(:flush :level :strategy) ;
+
+=item :flush
+
+These symbolic constants are used by the C<flush> method.
+
+ Z_NO_FLUSH
+ Z_PARTIAL_FLUSH
+ Z_SYNC_FLUSH
+ Z_FULL_FLUSH
+ Z_FINISH
+ Z_BLOCK
+
+=item :level
+
+These symbolic constants are used by the C<Level> option in the constructor.
+
+ Z_NO_COMPRESSION
+ Z_BEST_SPEED
+ Z_BEST_COMPRESSION
+ Z_DEFAULT_COMPRESSION
+
+=item :strategy
+
+These symbolic constants are used by the C<Strategy> option in the constructor.
+
+ Z_FILTERED
+ Z_HUFFMAN_ONLY
+ Z_RLE
+ Z_FIXED
+ Z_DEFAULT_STRATEGY
+
+
+
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Apache::GZip Revisited
+
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
+
+
+
+=head2 Working with Net::FTP
+
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+For RFC 1950, 1951 and 1952 see
+F<http://www.faqs.org/rfcs/rfc1950.html>,
+F<http://www.faqs.org/rfcs/rfc1951.html> and
+F<http://www.faqs.org/rfcs/rfc1952.html>
+
+The I<zlib> compression library was written by Jean-loup Gailly
+F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
+
+The primary site for the I<zlib> compression library is
+F<http://www.zlib.org>.
+
+The primary site for gzip is F<http://www.gzip.org>.
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Zip.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Zip.pm
new file mode 100755
index 00000000000..5e37d78f97d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Zip.pm
@@ -0,0 +1,1612 @@
+package IO::Compress::Zip ;
+
+use strict ;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.024 qw(:Status createSelfTiedObject);
+use IO::Compress::RawDeflate 2.024 ;
+use IO::Compress::Adapter::Deflate 2.024 ;
+use IO::Compress::Adapter::Identity 2.024 ;
+use IO::Compress::Zlib::Extra 2.024 ;
+use IO::Compress::Zip::Constants 2.024 ;
+
+
+use Compress::Raw::Zlib 2.024 qw(crc32) ;
+BEGIN
+{
+ eval { require IO::Compress::Adapter::Bzip2 ;
+ import IO::Compress::Adapter::Bzip2 2.024 ;
+ require IO::Compress::Bzip2 ;
+ import IO::Compress::Bzip2 2.024 ;
+ } ;
+# eval { require IO::Compress::Adapter::Lzma ;
+# import IO::Compress::Adapter::Lzma 2.020 ;
+# require IO::Compress::Lzma ;
+# import IO::Compress::Lzma 2.024 ;
+# } ;
+}
+
+
+require Exporter ;
+
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $ZipError);
+
+$VERSION = '2.024';
+$ZipError = '';
+
+@ISA = qw(Exporter IO::Compress::RawDeflate);
+@EXPORT_OK = qw( $ZipError zip ) ;
+%EXPORT_TAGS = %IO::Compress::RawDeflate::DEFLATE_CONSTANTS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+
+$EXPORT_TAGS{zip_method} = [qw( ZIP_CM_STORE ZIP_CM_DEFLATE ZIP_CM_BZIP2 ZIP_CM_LZMA)];
+push @{ $EXPORT_TAGS{all} }, @{ $EXPORT_TAGS{zip_method} };
+
+Exporter::export_ok_tags('all');
+
+sub new
+{
+ my $class = shift ;
+
+ my $obj = createSelfTiedObject($class, \$ZipError);
+ $obj->_create(undef, @_);
+}
+
+sub zip
+{
+ my $obj = createSelfTiedObject(undef, \$ZipError);
+ return $obj->_def(@_);
+}
+
+sub mkComp
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ my ($obj, $errstr, $errno) ;
+
+ if (*$self->{ZipData}{Method} == ZIP_CM_STORE) {
+ ($obj, $errstr, $errno) = IO::Compress::Adapter::Identity::mkCompObject(
+ $got->value('Level'),
+ $got->value('Strategy')
+ );
+ *$self->{ZipData}{CRC32} = crc32(undef);
+ }
+ elsif (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) {
+ ($obj, $errstr, $errno) = IO::Compress::Adapter::Deflate::mkCompObject(
+ $got->value('CRC32'),
+ $got->value('Adler32'),
+ $got->value('Level'),
+ $got->value('Strategy')
+ );
+ }
+ elsif (*$self->{ZipData}{Method} == ZIP_CM_BZIP2) {
+ ($obj, $errstr, $errno) = IO::Compress::Adapter::Bzip2::mkCompObject(
+ $got->value('BlockSize100K'),
+ $got->value('WorkFactor'),
+ $got->value('Verbosity')
+ );
+ *$self->{ZipData}{CRC32} = crc32(undef);
+ }
+# elsif (*$self->{ZipData}{Method} == ZIP_CM_LZMA) {
+# ($obj, $errstr, $errno) = IO::Compress::Adapter::Lzma::mkCompObject();
+# *$self->{ZipData}{CRC32} = crc32(undef);
+# }
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ if (! defined *$self->{ZipData}{SizesOffset}) {
+ *$self->{ZipData}{SizesOffset} = 0;
+ *$self->{ZipData}{Offset} = new U64 ;
+ }
+
+ *$self->{ZipData}{AnyZip64} = 0
+ if ! defined *$self->{ZipData}{AnyZip64} ;
+
+ return $obj;
+}
+
+sub reset
+{
+ my $self = shift ;
+
+ *$self->{Compress}->reset();
+ *$self->{ZipData}{CRC32} = Compress::Raw::Zlib::crc32('');
+
+ return STATUS_OK;
+}
+
+sub filterUncompressed
+{
+ my $self = shift ;
+
+ if (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) {
+ *$self->{ZipData}{CRC32} = *$self->{Compress}->crc32();
+ }
+ else {
+ *$self->{ZipData}{CRC32} = crc32(${$_[0]}, *$self->{ZipData}{CRC32});
+
+ }
+}
+
+sub mkHeader
+{
+ my $self = shift;
+ my $param = shift ;
+
+
+ *$self->{ZipData}{LocalHdrOffset} = U64::clone(*$self->{ZipData}{Offset});
+
+ my $filename = '';
+ $filename = $param->value('Name') || '';
+
+ my $comment = '';
+ $comment = $param->value('Comment') || '';
+
+ my $hdr = '';
+
+ my $time = _unixToDosTime($param->value('Time'));
+
+ my $extra = '';
+ my $ctlExtra = '';
+ my $empty = 0;
+ my $osCode = $param->value('OS_Code') ;
+ my $extFileAttr = 0 ;
+
+ # This code assumes Unix.
+ $extFileAttr = 0666 << 16
+ if $osCode == ZIP_OS_CODE_UNIX ;
+
+ if (*$self->{ZipData}{Zip64}) {
+ $empty = 0xFFFFFFFF;
+
+ my $x = '';
+ $x .= pack "V V", 0, 0 ; # uncompressedLength
+ $x .= pack "V V", 0, 0 ; # compressedLength
+ $extra .= IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_ZIP64, $x);
+ }
+
+ if (! $param->value('Minimal')) {
+ if (defined $param->value('exTime'))
+ {
+ $extra .= mkExtendedTime($param->value('MTime'),
+ $param->value('ATime'),
+ $param->value('CTime'));
+
+ $ctlExtra .= mkExtendedTime($param->value('MTime'));
+ }
+
+ if ( $param->value('UID') && $osCode == ZIP_OS_CODE_UNIX)
+ {
+ $extra .= mkUnix2Extra( $param->value('UID'), $param->value('GID'));
+ $ctlExtra .= mkUnix2Extra();
+ }
+
+ $extFileAttr = $param->value('ExtAttr')
+ if defined $param->value('ExtAttr') ;
+
+ $extra .= $param->value('ExtraFieldLocal')
+ if defined $param->value('ExtraFieldLocal');
+
+ $ctlExtra .= $param->value('ExtraFieldCentral')
+ if defined $param->value('ExtraFieldCentral');
+ }
+
+ my $gpFlag = 0 ;
+ $gpFlag |= ZIP_GP_FLAG_STREAMING_MASK
+ if *$self->{ZipData}{Stream} ;
+
+ my $method = *$self->{ZipData}{Method} ;
+
+ my $version = $ZIP_CM_MIN_VERSIONS{$method};
+ $version = ZIP64_MIN_VERSION
+ if ZIP64_MIN_VERSION > $version && *$self->{ZipData}{Zip64};
+ my $madeBy = ($param->value('OS_Code') << 8) + $version;
+ my $extract = $version;
+
+ *$self->{ZipData}{Version} = $version;
+ *$self->{ZipData}{MadeBy} = $madeBy;
+
+ my $ifa = 0;
+ $ifa |= ZIP_IFA_TEXT_MASK
+ if $param->value('TextFlag');
+
+ $hdr .= pack "V", ZIP_LOCAL_HDR_SIG ; # signature
+ $hdr .= pack 'v', $extract ; # extract Version & OS
+ $hdr .= pack 'v', $gpFlag ; # general purpose flag (set streaming mode)
+ $hdr .= pack 'v', $method ; # compression method (deflate)
+ $hdr .= pack 'V', $time ; # last mod date/time
+ $hdr .= pack 'V', 0 ; # crc32 - 0 when streaming
+ $hdr .= pack 'V', $empty ; # compressed length - 0 when streaming
+ $hdr .= pack 'V', $empty ; # uncompressed length - 0 when streaming
+ $hdr .= pack 'v', length $filename ; # filename length
+ $hdr .= pack 'v', length $extra ; # extra length
+
+ $hdr .= $filename ;
+
+ # Remember the offset for the compressed & uncompressed lengths in the
+ # local header.
+ if (*$self->{ZipData}{Zip64}) {
+ *$self->{ZipData}{SizesOffset} = *$self->{ZipData}{Offset}->get64bit()
+ + length($hdr) + 4 ;
+ }
+ else {
+ *$self->{ZipData}{SizesOffset} = *$self->{ZipData}{Offset}->get64bit()
+ + 18;
+ }
+
+ $hdr .= $extra ;
+
+
+ my $ctl = '';
+
+ $ctl .= pack "V", ZIP_CENTRAL_HDR_SIG ; # signature
+ $ctl .= pack 'v', $madeBy ; # version made by
+ $ctl .= pack 'v', $extract ; # extract Version
+ $ctl .= pack 'v', $gpFlag ; # general purpose flag (streaming mode)
+ $ctl .= pack 'v', $method ; # compression method (deflate)
+ $ctl .= pack 'V', $time ; # last mod date/time
+ $ctl .= pack 'V', 0 ; # crc32
+ $ctl .= pack 'V', $empty ; # compressed length
+ $ctl .= pack 'V', $empty ; # uncompressed length
+ $ctl .= pack 'v', length $filename ; # filename length
+
+ *$self->{ZipData}{ExtraOffset} = length $ctl;
+ *$self->{ZipData}{ExtraSize} = length $ctlExtra ;
+
+ $ctl .= pack 'v', length $ctlExtra ; # extra length
+ $ctl .= pack 'v', length $comment ; # file comment length
+ $ctl .= pack 'v', 0 ; # disk number start
+ $ctl .= pack 'v', $ifa ; # internal file attributes
+ $ctl .= pack 'V', $extFileAttr ; # external file attributes
+
+ # offset to local hdr
+ if (*$self->{ZipData}{LocalHdrOffset}->is64bit() ) {
+ $ctl .= pack 'V', 0xFFFFFFFF ;
+ }
+ else {
+ $ctl .= *$self->{ZipData}{LocalHdrOffset}->getPacked_V32() ;
+ }
+
+ $ctl .= $filename ;
+ $ctl .= $ctlExtra ;
+ $ctl .= $comment ;
+
+ *$self->{ZipData}{Offset}->add(length $hdr) ;
+
+ *$self->{ZipData}{CentralHeader} = $ctl;
+
+ return $hdr;
+}
+
+sub mkTrailer
+{
+ my $self = shift ;
+
+ my $crc32 ;
+ if (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) {
+ $crc32 = pack "V", *$self->{Compress}->crc32();
+ }
+ else {
+ $crc32 = pack "V", *$self->{ZipData}{CRC32};
+ }
+
+ my $ctl = *$self->{ZipData}{CentralHeader} ;
+
+ my $sizes ;
+ if (! *$self->{ZipData}{Zip64}) {
+ $sizes .= *$self->{CompSize}->getPacked_V32() ; # Compressed size
+ $sizes .= *$self->{UnCompSize}->getPacked_V32() ; # Uncompressed size
+ }
+ else {
+ $sizes .= *$self->{CompSize}->getPacked_V64() ; # Compressed size
+ $sizes .= *$self->{UnCompSize}->getPacked_V64() ; # Uncompressed size
+ }
+
+ my $data = $crc32 . $sizes ;
+
+ my $xtrasize = *$self->{UnCompSize}->getPacked_V64() ; # Uncompressed size
+ $xtrasize .= *$self->{CompSize}->getPacked_V64() ; # Compressed size
+
+ my $hdr = '';
+
+ if (*$self->{ZipData}{Stream}) {
+ $hdr = pack "V", ZIP_DATA_HDR_SIG ; # signature
+ $hdr .= $data ;
+ }
+ else {
+ $self->writeAt(*$self->{ZipData}{LocalHdrOffset}->get64bit() + 14, $crc32)
+ or return undef;
+ $self->writeAt(*$self->{ZipData}{SizesOffset},
+ *$self->{ZipData}{Zip64} ? $xtrasize : $sizes)
+ or return undef;
+ }
+
+ # Central Header Record/Zip64 extended field
+
+ substr($ctl, 16, length $crc32) = $crc32 ;
+
+ my $x = '';
+
+ # uncompressed length
+ if (*$self->{UnCompSize}->is64bit() ) {
+ $x .= *$self->{UnCompSize}->getPacked_V64() ;
+ } else {
+ substr($ctl, 24, 4) = *$self->{UnCompSize}->getPacked_V32() ;
+ }
+
+ # compressed length
+ if (*$self->{CompSize}->is64bit() ) {
+ $x .= *$self->{CompSize}->getPacked_V64() ;
+ } else {
+ substr($ctl, 20, 4) = *$self->{CompSize}->getPacked_V32() ;
+ }
+
+ # Local Header offset
+ $x .= *$self->{ZipData}{LocalHdrOffset}->getPacked_V64()
+ if *$self->{ZipData}{LocalHdrOffset}->is64bit() ;
+
+ # disk no - always zero, so don't need it
+ #$x .= pack "V", 0 ;
+
+ if (length $x) {
+ my $xtra = IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_ZIP64, $x);
+ $ctl .= $xtra ;
+ substr($ctl, *$self->{ZipData}{ExtraOffset}, 2) =
+ pack 'v', *$self->{ZipData}{ExtraSize} + length $xtra;
+
+ *$self->{ZipData}{AnyZip64} = 1;
+ }
+
+ *$self->{ZipData}{Offset}->add(length($hdr));
+ *$self->{ZipData}{Offset}->add( *$self->{CompSize} );
+ push @{ *$self->{ZipData}{CentralDir} }, $ctl ;
+
+ return $hdr;
+}
+
+sub mkFinalTrailer
+{
+ my $self = shift ;
+
+ my $comment = '';
+ $comment = *$self->{ZipData}{ZipComment} ;
+
+ my $cd_offset = *$self->{ZipData}{Offset}->get32bit() ; # offset to start central dir
+
+ my $entries = @{ *$self->{ZipData}{CentralDir} };
+ my $cd = join '', @{ *$self->{ZipData}{CentralDir} };
+ my $cd_len = length $cd ;
+
+ my $z64e = '';
+
+ if ( *$self->{ZipData}{AnyZip64} ) {
+
+ my $v = *$self->{ZipData}{Version} ;
+ my $mb = *$self->{ZipData}{MadeBy} ;
+ $z64e .= pack 'v', $mb ; # Version made by
+ $z64e .= pack 'v', $v ; # Version to extract
+ $z64e .= pack 'V', 0 ; # number of disk
+ $z64e .= pack 'V', 0 ; # number of disk with central dir
+ $z64e .= U64::pack_V64 $entries ; # entries in central dir on this disk
+ $z64e .= U64::pack_V64 $entries ; # entries in central dir
+ $z64e .= U64::pack_V64 $cd_len ; # size of central dir
+ $z64e .= *$self->{ZipData}{Offset}->getPacked_V64() ; # offset to start central dir
+
+ $z64e = pack("V", ZIP64_END_CENTRAL_REC_HDR_SIG) # signature
+ . U64::pack_V64(length $z64e)
+ . $z64e ;
+
+ *$self->{ZipData}{Offset}->add(length $cd) ;
+
+ $z64e .= pack "V", ZIP64_END_CENTRAL_LOC_HDR_SIG; # signature
+ $z64e .= pack 'V', 0 ; # number of disk with central dir
+ $z64e .= *$self->{ZipData}{Offset}->getPacked_V64() ; # offset to end zip64 central dir
+ $z64e .= pack 'V', 1 ; # Total number of disks
+
+ $cd_offset = 0xFFFFFFFF ;
+ $cd_len = 0xFFFFFFFF if $cd_len >= 0xFFFFFFFF ;
+ $entries = 0xFFFF if $entries >= 0xFFFF ;
+ }
+
+ my $ecd = '';
+ $ecd .= pack "V", ZIP_END_CENTRAL_HDR_SIG ; # signature
+ $ecd .= pack 'v', 0 ; # number of disk
+ $ecd .= pack 'v', 0 ; # number of disk with central dir
+ $ecd .= pack 'v', $entries ; # entries in central dir on this disk
+ $ecd .= pack 'v', $entries ; # entries in central dir
+ $ecd .= pack 'V', $cd_len ; # size of central dir
+ $ecd .= pack 'V', $cd_offset ; # offset to start central dir
+ $ecd .= pack 'v', length $comment ; # zipfile comment length
+ $ecd .= $comment;
+
+ return $cd . $z64e . $ecd ;
+}
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift;
+
+ $got->value('CRC32' => 1);
+
+ if (! $got->parsed('Time') ) {
+ # Modification time defaults to now.
+ $got->value('Time' => time) ;
+ }
+
+ if ($got->parsed('exTime') ) {
+ my $timeRef = $got->value('exTime');
+ if ( defined $timeRef) {
+ return $self->saveErrorString(undef, "exTime not a 3-element array ref")
+ if ref $timeRef ne 'ARRAY' || @$timeRef != 3;
+ }
+
+ $got->value("MTime", $timeRef->[1]);
+ $got->value("ATime", $timeRef->[0]);
+ $got->value("CTime", $timeRef->[2]);
+ }
+
+ # Unix2 Extended Attribute
+ if ($got->parsed('exUnix2') ) {
+ my $timeRef = $got->value('exUnix2');
+ if ( defined $timeRef) {
+ return $self->saveErrorString(undef, "exUnix2 not a 2-element array ref")
+ if ref $timeRef ne 'ARRAY' || @$timeRef != 2;
+ }
+
+ $got->value("UID", $timeRef->[0]);
+ $got->value("GID", $timeRef->[1]);
+ }
+
+ *$self->{ZipData}{AnyZip64} = 1
+ if $got->value('Zip64');
+ *$self->{ZipData}{Zip64} = $got->value('Zip64');
+ *$self->{ZipData}{Stream} = $got->value('Stream');
+
+ my $method = $got->value('Method');
+ return $self->saveErrorString(undef, "Unknown Method '$method'")
+ if ! defined $ZIP_CM_MIN_VERSIONS{$method};
+
+ return $self->saveErrorString(undef, "Bzip2 not available")
+ if $method == ZIP_CM_BZIP2 and
+ ! defined $IO::Compress::Adapter::Bzip2::VERSION;
+
+ return $self->saveErrorString(undef, "Lzma not available")
+ if $method == ZIP_CM_LZMA ;
+ #and
+ #! defined $IO::Compress::Adapter::Lzma::VERSION;
+
+ *$self->{ZipData}{Method} = $method;
+
+ *$self->{ZipData}{ZipComment} = $got->value('ZipComment') ;
+
+ for my $name (qw( ExtraFieldLocal ExtraFieldCentral ))
+ {
+ my $data = $got->value($name) ;
+ if (defined $data) {
+ my $bad = IO::Compress::Zlib::Extra::parseExtraField($data, 1, 0) ;
+ return $self->saveErrorString(undef, "Error with $name Parameter: $bad")
+ if $bad ;
+
+ $got->value($name, $data) ;
+ }
+ }
+
+ return undef
+ if defined $IO::Compress::Bzip2::VERSION
+ and ! IO::Compress::Bzip2::ckParams($self, $got);
+
+ return 1 ;
+}
+
+#sub newHeader
+#{
+# my $self = shift ;
+#
+# return $self->mkHeader(*$self->{Got});
+#}
+
+sub getExtraParams
+{
+ my $self = shift ;
+
+ use IO::Compress::Base::Common 2.024 qw(:Parse);
+ use Compress::Raw::Zlib 2.024 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
+
+ my @Bzip2 = ();
+
+ @Bzip2 = IO::Compress::Bzip2::getExtraParams($self)
+ if defined $IO::Compress::Bzip2::VERSION;
+
+ return (
+ # zlib behaviour
+ $self->getZlibParams(),
+
+ 'Stream' => [1, 1, Parse_boolean, 1],
+ #'Store' => [0, 1, Parse_boolean, 0],
+ 'Method' => [0, 1, Parse_unsigned, ZIP_CM_DEFLATE],
+
+# # Zip header fields
+ 'Minimal' => [0, 1, Parse_boolean, 0],
+ 'Zip64' => [0, 1, Parse_boolean, 0],
+ 'Comment' => [0, 1, Parse_any, ''],
+ 'ZipComment'=> [0, 1, Parse_any, ''],
+ 'Name' => [0, 1, Parse_any, ''],
+ 'Time' => [0, 1, Parse_any, undef],
+ 'exTime' => [0, 1, Parse_any, undef],
+ 'exUnix2' => [0, 1, Parse_any, undef],
+ 'ExtAttr' => [0, 1, Parse_any, 0],
+ 'OS_Code' => [0, 1, Parse_unsigned, $Compress::Raw::Zlib::gzip_os_code],
+
+ 'TextFlag' => [0, 1, Parse_boolean, 0],
+ 'ExtraFieldLocal' => [0, 1, Parse_any, undef],
+ 'ExtraFieldCentral'=> [0, 1, Parse_any, undef],
+
+ @Bzip2,
+ );
+}
+
+sub getInverseClass
+{
+ return ('IO::Uncompress::Unzip',
+ \$IO::Uncompress::Unzip::UnzipError);
+}
+
+sub getFileInfo
+{
+ my $self = shift ;
+ my $params = shift;
+ my $filename = shift ;
+
+ my ($mode, $uid, $gid, $atime, $mtime, $ctime)
+ = (stat($filename))[2, 4,5, 8,9,10] ;
+
+ $params->value('Name' => $filename)
+ if ! $params->parsed('Name') ;
+
+ $params->value('Time' => $mtime)
+ if ! $params->parsed('Time') ;
+
+ if ( ! $params->parsed('exTime'))
+ {
+ $params->value('MTime' => $mtime) ;
+ $params->value('ATime' => $atime) ;
+ $params->value('CTime' => undef) ; # No Creation time
+ $params->value("exTime", [$mtime, $atime, undef]);
+ }
+
+ # NOTE - Unix specific code alert
+ $params->value('ExtAttr' => $mode << 16)
+ if ! $params->parsed('ExtAttr');
+
+ $params->value('UID' => $uid) ;
+ $params->value('GID' => $gid) ;
+
+}
+
+sub mkExtendedTime
+{
+ # order expected is m, a, c
+
+ my $times = '';
+ my $bit = 1 ;
+ my $flags = 0;
+
+ for my $time (@_)
+ {
+ if (defined $time)
+ {
+ $flags |= $bit;
+ $times .= pack("V", $time);
+ }
+
+ $bit <<= 1 ;
+ }
+
+ return IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_EXT_TIMESTAMP,
+ pack("C", $flags) . $times);
+}
+
+sub mkUnix2Extra
+{
+ my $ids = '';
+ for my $id (@_)
+ {
+ $ids .= pack("v", $id);
+ }
+
+ return IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_INFO_ZIP_UNIX2,
+ $ids);
+}
+
+
+# from Archive::Zip
+sub _unixToDosTime # Archive::Zip::Member
+{
+ my $time_t = shift;
+ # TODO - add something to cope with unix time < 1980
+ my ( $sec, $min, $hour, $mday, $mon, $year ) = localtime($time_t);
+ my $dt = 0;
+ $dt += ( $sec >> 1 );
+ $dt += ( $min << 5 );
+ $dt += ( $hour << 11 );
+ $dt += ( $mday << 16 );
+ $dt += ( ( $mon + 1 ) << 21 );
+ $dt += ( ( $year - 80 ) << 25 );
+ return $dt;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Compress::Zip - Write zip files/buffers
+
+
+
+=head1 SYNOPSIS
+
+ use IO::Compress::Zip qw(zip $ZipError) ;
+
+ my $status = zip $input => $output [,OPTS]
+ or die "zip failed: $ZipError\n";
+
+ my $z = new IO::Compress::Zip $output [,OPTS]
+ or die "zip failed: $ZipError\n";
+
+ $z->print($string);
+ $z->printf($format, $string);
+ $z->write($string);
+ $z->syswrite($string [, $length, $offset]);
+ $z->flush();
+ $z->tell();
+ $z->eof();
+ $z->seek($position, $whence);
+ $z->binmode();
+ $z->fileno();
+ $z->opened();
+ $z->autoflush();
+ $z->input_line_number();
+ $z->newStream( [OPTS] );
+
+ $z->deflateParams();
+
+ $z->close() ;
+
+ $ZipError ;
+
+ # IO::File mode
+
+ print $z $string;
+ printf $z $format, $string;
+ tell $z
+ eof $z
+ seek $z, $position, $whence
+ binmode $z
+ fileno $z
+ close $z ;
+
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows writing zip
+compressed data to files or buffer.
+
+The primary purpose of this module is to provide streaming write access to
+zip files and buffers. It is not a general-purpose file archiver. If that
+is what you want, check out C<Archive::Zip>.
+
+At present three compression methods are supported by IO::Compress::Zip,
+namely Store (no compression at all), Deflate and Bzip2.
+
+Note that to create Bzip2 content, the module C<IO::Compress::Bzip2> must
+be installed.
+
+For reading zip files/buffers, see the companion module
+L<IO::Uncompress::Unzip|IO::Uncompress::Unzip>.
+
+=head1 Functional Interface
+
+A top-level function, C<zip>, is provided to carry out
+"one-shot" compression between buffers and/or files. For finer
+control over the compression process, see the L</"OO Interface">
+section.
+
+ use IO::Compress::Zip qw(zip $ZipError) ;
+
+ zip $input => $output [,OPTS]
+ or die "zip failed: $ZipError\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 zip $input => $output [, OPTS]
+
+C<zip> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the uncompressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is compressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<zip> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+In addition, if C<$input> is a simple filename, the default values for
+the C<Name>, C<Time>, C<ExtAttr> and C<exTime> options will be sourced from that file.
+
+If you do not want to use these defaults they can be overridden by
+explicitly setting the C<Name>, C<Time>, C<ExtAttr> and C<exTime> options or by setting the
+C<Minimal> parameter.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+compressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the compressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the compressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the compressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the compressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<zip> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple files/buffers and C<$output> is a single
+file/buffer the input files/buffers will each be stored
+in C<$output> as a distinct entry.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<zip>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<zip> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<zip> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeIn => 0|1 >>
+
+When reading from a file or filehandle, set C<binmode> before reading.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+The behaviour of this option is dependent on the type of output data
+stream.
+
+=over 5
+
+=item * A Buffer
+
+If C<Append> is enabled, all compressed data will be append to the end of
+the output buffer. Otherwise the output buffer will be cleared before any
+compressed data is written to it.
+
+=item * A Filename
+
+If C<Append> is enabled, the file will be opened in append mode. Otherwise
+the contents of the file, if any, will be truncated before any compressed
+data is written to it.
+
+=item * A Filehandle
+
+If C<Append> is enabled, the filehandle will be positioned to the end of
+the file via a call to C<seek> before any compressed data is
+written to it. Otherwise the file pointer will not be moved.
+
+=back
+
+When C<Append> is specified, and set to true, it will I<append> all compressed
+data to the output data stream.
+
+So when the output is a filehandle it will carry out a seek to the eof
+before writing any compressed data. If the output is a filename, it will be opened for
+appending. If the output is a buffer, all compressed data will be appened to
+the existing buffer.
+
+Conversely when C<Append> is not specified, or it is present and is set to
+false, it will operate as follows.
+
+When the output is a filename, it will truncate the contents of the file
+before writing any compressed data. If the output is a filehandle
+its position will not be changed. If the output is a buffer, it will be
+wiped before any compressed data is output.
+
+Defaults to 0.
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt> and write the compressed
+data to the file C<file1.txt.zip>.
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Zip qw(zip $ZipError) ;
+
+ my $input = "file1.txt";
+ zip $input => "$input.zip"
+ or die "zip failed: $ZipError\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+compressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Zip qw(zip $ZipError) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt"
+ or die "Cannot open 'file1.txt': $!\n" ;
+ my $buffer ;
+ zip $input => \$buffer
+ or die "zip failed: $ZipError\n";
+
+To compress all files in the directory "/my/home" that match "*.txt"
+and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Zip qw(zip $ZipError) ;
+
+ zip '</my/home/*.txt>' => '<*.zip>'
+ or die "zip failed: $ZipError\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Zip qw(zip $ZipError) ;
+
+ for my $input ( glob "/my/home/*.txt" )
+ {
+ my $output = "$input.zip" ;
+ zip $input => $output
+ or die "Error compressing '$input': $ZipError\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for C<IO::Compress::Zip> is shown below
+
+ my $z = new IO::Compress::Zip $output [,OPTS]
+ or die "IO::Compress::Zip failed: $ZipError\n";
+
+It returns an C<IO::Compress::Zip> object on success and undef on failure.
+The variable C<$ZipError> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Compress::Zip can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal output file operations can be carried out
+with C<$z>.
+For example, to write to a compressed file/buffer you can use either of
+these forms
+
+ $z->print("hello world\n");
+ print $z "hello world\n";
+
+The mandatory parameter C<$output> is used to control the destination
+of the compressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the compressed data
+will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the compressed data will be
+written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the compressed data will be stored
+in C<$$output>.
+
+=back
+
+If the C<$output> parameter is any other type, C<IO::Compress::Zip>::new will
+return undef.
+
+=head2 Constructor Options
+
+C<OPTS> is any combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$output> parameter is a filehandle. If
+specified, and the value is true, it will result in the C<$output> being
+closed once either the C<close> method is called or the C<IO::Compress::Zip>
+object is destroyed.
+
+This parameter defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+Opens C<$output> in append mode.
+
+The behaviour of this option is dependent on the type of C<$output>.
+
+=over 5
+
+=item * A Buffer
+
+If C<$output> is a buffer and C<Append> is enabled, all compressed data
+will be append to the end of C<$output>. Otherwise C<$output> will be
+cleared before any data is written to it.
+
+=item * A Filename
+
+If C<$output> is a filename and C<Append> is enabled, the file will be
+opened in append mode. Otherwise the contents of the file, if any, will be
+truncated before any compressed data is written to it.
+
+=item * A Filehandle
+
+If C<$output> is a filehandle, the file pointer will be positioned to the
+end of the file via a call to C<seek> before any compressed data is written
+to it. Otherwise the file pointer will not be moved.
+
+=back
+
+This parameter defaults to 0.
+
+=item C<< Name => $string >>
+
+Stores the contents of C<$string> in the zip filename header field. If
+C<Name> is not specified, no zip filename field will be created.
+
+=item C<< Time => $number >>
+
+Sets the last modified time field in the zip header to $number.
+
+This field defaults to the time the C<IO::Compress::Zip> object was created
+if this option is not specified.
+
+=item C<< ExtAttr => $attr >>
+
+This option controls the "external file attributes" field in the central
+header of the zip file. This is a 4 byte field.
+
+If you are running a Unix derivative this value defaults to
+
+ 0666 << 16
+
+This should allow read/write access to any files that are extracted from
+the zip file/buffer.
+
+For all other systems it defaults to 0.
+
+=item C<< exTime => [$atime, $mtime, $ctime] >>
+
+This option expects an array reference with exactly three elements:
+C<$atime>, C<mtime> and C<$ctime>. These correspond to the last access
+time, last modification time and creation time respectively.
+
+It uses these values to set the extended timestamp field (ID is "UT") in
+the local zip header using the three values, $atime, $mtime, $ctime. In
+addition it sets the extended timestamp field in the central zip header
+using C<$mtime>.
+
+If any of the three values is C<undef> that time value will not be used.
+So, for example, to set only the C<$mtime> you would use this
+
+ exTime => [undef, $mtime, undef]
+
+If the C<Minimal> option is set to true, this option will be ignored.
+
+By default no extended time field is created.
+
+=item C<< exUnix2 => [$uid, $gid] >>
+
+This option expects an array reference with exactly two elements: C<$uid>
+and C<$gid>. These values correspond to the numeric user ID and group ID
+of the owner of the files respectively.
+
+When the C<exUnix2> option is present it will trigger the creation of a
+Unix2 extra field (ID is "Ux") in the local zip. This will be populated
+with C<$uid> and C<$gid>. In addition an empty Unix2 extra field will also
+be created in the central zip header
+
+If the C<Minimal> option is set to true, this option will be ignored.
+
+By default no Unix2 extra field is created.
+
+=item C<< Comment => $comment >>
+
+Stores the contents of C<$comment> in the Central File Header of
+the zip file.
+
+By default, no comment field is written to the zip file.
+
+=item C<< ZipComment => $comment >>
+
+Stores the contents of C<$comment> in the End of Central Directory record
+of the zip file.
+
+By default, no comment field is written to the zip file.
+
+=item C<< Method => $method >>
+
+Controls which compression method is used. At present three compression
+methods are supported, namely Store (no compression at all), Deflate and
+Bzip2.
+
+The symbols, ZIP_CM_STORE, ZIP_CM_DEFLATE and ZIP_CM_BZIP2 are used to
+select the compression method.
+
+These constants are not imported by C<IO::Compress::Zip> by default.
+
+ use IO::Compress::Zip qw(:zip_method);
+ use IO::Compress::Zip qw(:constants);
+ use IO::Compress::Zip qw(:all);
+
+Note that to create Bzip2 content, the module C<IO::Compress::Bzip2> must
+be installed. A fatal error will be thrown if you attempt to create Bzip2
+content when C<IO::Compress::Bzip2> is not available.
+
+The default method is ZIP_CM_DEFLATE.
+
+=item C<< Stream => 0|1 >>
+
+This option controls whether the zip file/buffer output is created in
+streaming mode.
+
+Note that when outputting to a file with streaming mode disabled (C<Stream>
+is 0), the output file must be seekable.
+
+The default is 1.
+
+=item C<< Zip64 => 0|1 >>
+
+Create a Zip64 zip file/buffer. This option should only be used if you want
+to store files larger than 4 Gig.
+
+If you intend to manipulate the Zip64 zip files created with this module
+using an external zip/unzip make sure that it supports Zip64.
+
+In particular, if you are using Info-Zip you need to have zip version 3.x
+or better to update a Zip64 archive and unzip version 6.x to read a zip64
+archive.
+
+The default is 0.
+
+=item C<< TextFlag => 0|1 >>
+
+This parameter controls the setting of a bit in the zip central header. It
+is used to signal that the data stored in the zip file/buffer is probably
+text.
+
+The default is 0.
+
+=item C<< ExtraFieldLocal => $data >>
+=item C<< ExtraFieldCentral => $data >>
+
+The C<ExtraFieldLocal> option is used to store additional metadata in the
+local header for the zip file/buffer. The C<ExtraFieldCentral> does the
+same for the matching central header.
+
+An extra field consists of zero or more subfields. Each subfield consists
+of a two byte header followed by the subfield data.
+
+The list of subfields can be supplied in any of the following formats
+
+ ExtraFieldLocal => [$id1, $data1,
+ $id2, $data2,
+ ...
+ ]
+
+ ExtraFieldLocal => [ [$id1 => $data1],
+ [$id2 => $data2],
+ ...
+ ]
+
+ ExtraFieldLocal => { $id1 => $data1,
+ $id2 => $data2,
+ ...
+ }
+
+Where C<$id1>, C<$id2> are two byte subfield ID's.
+
+If you use the hash syntax, you have no control over the order in which
+the ExtraSubFields are stored, plus you cannot have SubFields with
+duplicate ID.
+
+Alternatively the list of subfields can by supplied as a scalar, thus
+
+ ExtraField => $rawdata
+
+The Extended Time field (ID "UT"), set using the C<exTime> option, and the
+Unix2 extra field (ID "Ux), set using the C<exUnix2> option, are examples
+of extra fields.
+
+If the C<Minimal> option is set to true, this option will be ignored.
+
+The maximum size of an extra field 65535 bytes.
+
+=item C<< Minimal => 1|0 >>
+
+If specified, this option will disable the creation of all extra fields
+in the zip local and central headers. So the C<exTime>, C<exUnix2>,
+C<ExtraFieldLocal> and C<ExtraFieldCentral> options will be ignored.
+
+This parameter defaults to 0.
+
+=item C<< BlockSize100K => number >>
+
+Specify the number of 100K blocks bzip2 uses during compression.
+
+Valid values are from 1 to 9, where 9 is best compression.
+
+This option is only valid if the C<Method> is ZIP_CM_BZIP2. It is ignored
+otherwise.
+
+The default is 1.
+
+=item C<< WorkFactor => number >>
+
+Specifies how much effort bzip2 should take before resorting to a slower
+fallback compression algorithm.
+
+Valid values range from 0 to 250, where 0 means use the default value 30.
+
+This option is only valid if the C<Method> is ZIP_CM_BZIP2. It is ignored
+otherwise.
+
+The default is 0.
+
+=item -Level
+
+Defines the compression level used by zlib. The value should either be
+a number between 0 and 9 (0 means no compression and 9 is maximum
+compression), or one of the symbolic constants defined below.
+
+ Z_NO_COMPRESSION
+ Z_BEST_SPEED
+ Z_BEST_COMPRESSION
+ Z_DEFAULT_COMPRESSION
+
+The default is Z_DEFAULT_COMPRESSION.
+
+Note, these constants are not imported by C<IO::Compress::Zip> by default.
+
+ use IO::Compress::Zip qw(:strategy);
+ use IO::Compress::Zip qw(:constants);
+ use IO::Compress::Zip qw(:all);
+
+=item -Strategy
+
+Defines the strategy used to tune the compression. Use one of the symbolic
+constants defined below.
+
+ Z_FILTERED
+ Z_HUFFMAN_ONLY
+ Z_RLE
+ Z_FIXED
+ Z_DEFAULT_STRATEGY
+
+The default is Z_DEFAULT_STRATEGY.
+
+=item C<< Strict => 0|1 >>
+
+This is a placeholder option.
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 print
+
+Usage is
+
+ $z->print($data)
+ print $z $data
+
+Compresses and outputs the contents of the C<$data> parameter. This
+has the same behaviour as the C<print> built-in.
+
+Returns true if successful.
+
+=head2 printf
+
+Usage is
+
+ $z->printf($format, $data)
+ printf $z $format, $data
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns true if successful.
+
+=head2 syswrite
+
+Usage is
+
+ $z->syswrite $data
+ $z->syswrite $data, $length
+ $z->syswrite $data, $length, $offset
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns the number of uncompressed bytes written, or C<undef> if
+unsuccessful.
+
+=head2 write
+
+Usage is
+
+ $z->write $data
+ $z->write $data, $length
+ $z->write $data, $length, $offset
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns the number of uncompressed bytes written, or C<undef> if
+unsuccessful.
+
+=head2 flush
+
+Usage is
+
+ $z->flush;
+ $z->flush($flush_type);
+
+Flushes any pending compressed data to the output file/buffer.
+
+This method takes an optional parameter, C<$flush_type>, that controls
+how the flushing will be carried out. By default the C<$flush_type>
+used is C<Z_FINISH>. Other valid values for C<$flush_type> are
+C<Z_NO_FLUSH>, C<Z_SYNC_FLUSH>, C<Z_FULL_FLUSH> and C<Z_BLOCK>. It is
+strongly recommended that you only set the C<flush_type> parameter if
+you fully understand the implications of what it does - overuse of C<flush>
+can seriously degrade the level of compression achieved. See the C<zlib>
+documentation for details.
+
+Returns true on success.
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the C<close> method has been called.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the output file/buffer.
+It is a fatal error to attempt to seek backward.
+
+Empty parts of the file/buffer will have NULL (0x00) bytes written to them.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+This method always returns C<undef> when compressing.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Flushes any pending compressed data and then closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Compress::Zip object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Compress::Zip
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 newStream([OPTS])
+
+Usage is
+
+ $z->newStream( [OPTS] )
+
+Closes the current compressed data stream and starts a new one.
+
+OPTS consists of any of the the options that are available when creating
+the C<$z> object.
+
+See the L</"Constructor Options"> section for more details.
+
+=head2 deflateParams
+
+Usage is
+
+ $z->deflateParams
+
+TODO
+
+=head1 Importing
+
+A number of symbolic constants are required by some methods in
+C<IO::Compress::Zip>. None are imported by default.
+
+=over 5
+
+=item :all
+
+Imports C<zip>, C<$ZipError> and all symbolic
+constants that can be used by C<IO::Compress::Zip>. Same as doing this
+
+ use IO::Compress::Zip qw(zip $ZipError :constants) ;
+
+=item :constants
+
+Import all symbolic constants. Same as doing this
+
+ use IO::Compress::Zip qw(:flush :level :strategy :zip_method) ;
+
+=item :flush
+
+These symbolic constants are used by the C<flush> method.
+
+ Z_NO_FLUSH
+ Z_PARTIAL_FLUSH
+ Z_SYNC_FLUSH
+ Z_FULL_FLUSH
+ Z_FINISH
+ Z_BLOCK
+
+=item :level
+
+These symbolic constants are used by the C<Level> option in the constructor.
+
+ Z_NO_COMPRESSION
+ Z_BEST_SPEED
+ Z_BEST_COMPRESSION
+ Z_DEFAULT_COMPRESSION
+
+=item :strategy
+
+These symbolic constants are used by the C<Strategy> option in the constructor.
+
+ Z_FILTERED
+ Z_HUFFMAN_ONLY
+ Z_RLE
+ Z_FIXED
+ Z_DEFAULT_STRATEGY
+
+=item :zip_method
+
+These symbolic constants are used by the C<Method> option in the
+constructor.
+
+ ZIP_CM_STORE
+ ZIP_CM_DEFLATE
+ ZIP_CM_BZIP2
+
+
+
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Apache::GZip Revisited
+
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
+
+
+
+=head2 Working with Net::FTP
+
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+For RFC 1950, 1951 and 1952 see
+F<http://www.faqs.org/rfcs/rfc1950.html>,
+F<http://www.faqs.org/rfcs/rfc1951.html> and
+F<http://www.faqs.org/rfcs/rfc1952.html>
+
+The I<zlib> compression library was written by Jean-loup Gailly
+F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
+
+The primary site for the I<zlib> compression library is
+F<http://www.zlib.org>.
+
+The primary site for gzip is F<http://www.gzip.org>.
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Zip/Constants.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Zip/Constants.pm
new file mode 100755
index 00000000000..c8cb95342a2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Zip/Constants.pm
@@ -0,0 +1,105 @@
+package IO::Compress::Zip::Constants;
+
+use strict ;
+use warnings;
+
+require Exporter;
+
+our ($VERSION, @ISA, @EXPORT, %ZIP_CM_MIN_VERSIONS);
+
+$VERSION = '2.024';
+
+@ISA = qw(Exporter);
+
+@EXPORT= qw(
+
+ ZIP_CM_STORE
+ ZIP_CM_DEFLATE
+ ZIP_CM_BZIP2
+ ZIP_CM_LZMA
+ ZIP_CM_PPMD
+
+ ZIP_LOCAL_HDR_SIG
+ ZIP_DATA_HDR_SIG
+ ZIP_CENTRAL_HDR_SIG
+ ZIP_END_CENTRAL_HDR_SIG
+ ZIP64_END_CENTRAL_REC_HDR_SIG
+ ZIP64_END_CENTRAL_LOC_HDR_SIG
+ ZIP64_ARCHIVE_EXTRA_SIG
+ ZIP64_DIGITAL_SIGNATURE_SIG
+
+ ZIP_GP_FLAG_ENCRYPTED_MASK
+ ZIP_GP_FLAG_STREAMING_MASK
+ ZIP_GP_FLAG_PATCHED_MASK
+ ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK
+ ZIP_GP_FLAG_LZMA_EOS_PRESENT
+ ZIP_GP_FLAG_LANGUAGE_ENCODING
+
+ ZIP_EXTRA_ID_ZIP64
+ ZIP_EXTRA_ID_EXT_TIMESTAMP
+ ZIP_EXTRA_ID_INFO_ZIP_UNIX2
+ ZIP_EXTRA_ID_INFO_ZIP_UNIXn
+ ZIP_EXTRA_ID_JAVA_EXE
+
+ ZIP_OS_CODE_UNIX
+ ZIP_OS_CODE_DEFAULT
+
+ ZIP_IFA_TEXT_MASK
+
+ %ZIP_CM_MIN_VERSIONS
+ ZIP64_MIN_VERSION
+
+ );
+
+# Compression types supported
+use constant ZIP_CM_STORE => 0 ;
+use constant ZIP_CM_DEFLATE => 8 ;
+use constant ZIP_CM_BZIP2 => 12 ;
+use constant ZIP_CM_LZMA => 14 ; # Not Supported yet
+use constant ZIP_CM_PPMD => 98 ; # Not Supported yet
+
+# General Purpose Flag
+use constant ZIP_GP_FLAG_ENCRYPTED_MASK => (1 << 0) ;
+use constant ZIP_GP_FLAG_STREAMING_MASK => (1 << 3) ;
+use constant ZIP_GP_FLAG_PATCHED_MASK => (1 << 5) ;
+use constant ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK => (1 << 6) ;
+use constant ZIP_GP_FLAG_LZMA_EOS_PRESENT => (1 << 1) ;
+use constant ZIP_GP_FLAG_LANGUAGE_ENCODING => (1 << 11) ;
+
+# Internal File Attributes
+use constant ZIP_IFA_TEXT_MASK => 1;
+
+# Signatures for each of the headers
+use constant ZIP_LOCAL_HDR_SIG => 0x04034b50;
+use constant ZIP_DATA_HDR_SIG => 0x08074b50;
+use constant ZIP_CENTRAL_HDR_SIG => 0x02014b50;
+use constant ZIP_END_CENTRAL_HDR_SIG => 0x06054b50;
+use constant ZIP64_END_CENTRAL_REC_HDR_SIG => 0x06064b50;
+use constant ZIP64_END_CENTRAL_LOC_HDR_SIG => 0x07064b50;
+use constant ZIP64_ARCHIVE_EXTRA_SIG => 0x08064b50;
+use constant ZIP64_DIGITAL_SIGNATURE_SIG => 0x05054b50;
+
+use constant ZIP_OS_CODE_UNIX => 3;
+use constant ZIP_OS_CODE_DEFAULT => 3;
+
+# Extra Field ID's
+use constant ZIP_EXTRA_ID_ZIP64 => pack "v", 1;
+use constant ZIP_EXTRA_ID_EXT_TIMESTAMP => "UT";
+use constant ZIP_EXTRA_ID_INFO_ZIP_UNIX2 => "Ux";
+use constant ZIP_EXTRA_ID_INFO_ZIP_UNIXn => "ux";
+use constant ZIP_EXTRA_ID_JAVA_EXE => pack "v", 0xCAFE;
+
+use constant ZIP64_MIN_VERSION => 45;
+
+%ZIP_CM_MIN_VERSIONS = (
+ ZIP_CM_STORE() => 20,
+ ZIP_CM_DEFLATE() => 20,
+ ZIP_CM_BZIP2() => 46,
+ ZIP_CM_LZMA() => 63,
+ );
+
+
+1;
+
+__END__
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Zlib/Constants.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Zlib/Constants.pm
new file mode 100755
index 00000000000..10fcf345f63
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Zlib/Constants.pm
@@ -0,0 +1,77 @@
+
+package IO::Compress::Zlib::Constants ;
+
+use strict ;
+use warnings;
+use bytes;
+
+require Exporter;
+
+our ($VERSION, @ISA, @EXPORT);
+
+$VERSION = '2.024';
+
+@ISA = qw(Exporter);
+
+@EXPORT= qw(
+
+ ZLIB_HEADER_SIZE
+ ZLIB_TRAILER_SIZE
+
+ ZLIB_CMF_CM_OFFSET
+ ZLIB_CMF_CM_BITS
+ ZLIB_CMF_CM_DEFLATED
+
+ ZLIB_CMF_CINFO_OFFSET
+ ZLIB_CMF_CINFO_BITS
+ ZLIB_CMF_CINFO_MAX
+
+ ZLIB_FLG_FCHECK_OFFSET
+ ZLIB_FLG_FCHECK_BITS
+
+ ZLIB_FLG_FDICT_OFFSET
+ ZLIB_FLG_FDICT_BITS
+
+ ZLIB_FLG_LEVEL_OFFSET
+ ZLIB_FLG_LEVEL_BITS
+
+ ZLIB_FLG_LEVEL_FASTEST
+ ZLIB_FLG_LEVEL_FAST
+ ZLIB_FLG_LEVEL_DEFAULT
+ ZLIB_FLG_LEVEL_SLOWEST
+
+ ZLIB_FDICT_SIZE
+
+ );
+
+# Constant names derived from RFC1950
+
+use constant ZLIB_HEADER_SIZE => 2;
+use constant ZLIB_TRAILER_SIZE => 4;
+
+use constant ZLIB_CMF_CM_OFFSET => 0;
+use constant ZLIB_CMF_CM_BITS => 0xF ; # 0b1111
+use constant ZLIB_CMF_CM_DEFLATED => 8;
+
+use constant ZLIB_CMF_CINFO_OFFSET => 4;
+use constant ZLIB_CMF_CINFO_BITS => 0xF ; # 0b1111;
+use constant ZLIB_CMF_CINFO_MAX => 7;
+
+use constant ZLIB_FLG_FCHECK_OFFSET => 0;
+use constant ZLIB_FLG_FCHECK_BITS => 0x1F ; # 0b11111;
+
+use constant ZLIB_FLG_FDICT_OFFSET => 5;
+use constant ZLIB_FLG_FDICT_BITS => 0x1 ; # 0b1;
+
+use constant ZLIB_FLG_LEVEL_OFFSET => 6;
+use constant ZLIB_FLG_LEVEL_BITS => 0x3 ; # 0b11;
+
+use constant ZLIB_FLG_LEVEL_FASTEST => 0;
+use constant ZLIB_FLG_LEVEL_FAST => 1;
+use constant ZLIB_FLG_LEVEL_DEFAULT => 2;
+use constant ZLIB_FLG_LEVEL_SLOWEST => 3;
+
+use constant ZLIB_FDICT_SIZE => 4;
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Compress/Zlib/Extra.pm b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Zlib/Extra.pm
new file mode 100755
index 00000000000..6812bb409dc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Compress/Zlib/Extra.pm
@@ -0,0 +1,198 @@
+package IO::Compress::Zlib::Extra;
+
+require 5.004 ;
+
+use strict ;
+use warnings;
+use bytes;
+
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS);
+
+$VERSION = '2.024';
+
+use IO::Compress::Gzip::Constants 2.024 ;
+
+sub ExtraFieldError
+{
+ return $_[0];
+ return "Error with ExtraField Parameter: $_[0]" ;
+}
+
+sub validateExtraFieldPair
+{
+ my $pair = shift ;
+ my $strict = shift;
+ my $gzipMode = shift ;
+
+ return ExtraFieldError("Not an array ref")
+ unless ref $pair && ref $pair eq 'ARRAY';
+
+ return ExtraFieldError("SubField must have two parts")
+ unless @$pair == 2 ;
+
+ return ExtraFieldError("SubField ID is a reference")
+ if ref $pair->[0] ;
+
+ return ExtraFieldError("SubField Data is a reference")
+ if ref $pair->[1] ;
+
+ # ID is exactly two chars
+ return ExtraFieldError("SubField ID not two chars long")
+ unless length $pair->[0] == GZIP_FEXTRA_SUBFIELD_ID_SIZE ;
+
+ # Check that the 2nd byte of the ID isn't 0
+ return ExtraFieldError("SubField ID 2nd byte is 0x00")
+ if $strict && $gzipMode && substr($pair->[0], 1, 1) eq "\x00" ;
+
+ return ExtraFieldError("SubField Data too long")
+ if length $pair->[1] > GZIP_FEXTRA_SUBFIELD_MAX_SIZE ;
+
+
+ return undef ;
+}
+
+sub parseRawExtra
+{
+ my $data = shift ;
+ my $extraRef = shift;
+ my $strict = shift;
+ my $gzipMode = shift ;
+
+ #my $lax = shift ;
+
+ #return undef
+ # if $lax ;
+
+ my $XLEN = length $data ;
+
+ return ExtraFieldError("Too Large")
+ if $XLEN > GZIP_FEXTRA_MAX_SIZE;
+
+ my $offset = 0 ;
+ while ($offset < $XLEN) {
+
+ return ExtraFieldError("Truncated in FEXTRA Body Section")
+ if $offset + GZIP_FEXTRA_SUBFIELD_HEADER_SIZE > $XLEN ;
+
+ my $id = substr($data, $offset, GZIP_FEXTRA_SUBFIELD_ID_SIZE);
+ $offset += GZIP_FEXTRA_SUBFIELD_ID_SIZE;
+
+ my $subLen = unpack("v", substr($data, $offset,
+ GZIP_FEXTRA_SUBFIELD_LEN_SIZE));
+ $offset += GZIP_FEXTRA_SUBFIELD_LEN_SIZE ;
+
+ return ExtraFieldError("Truncated in FEXTRA Body Section")
+ if $offset + $subLen > $XLEN ;
+
+ my $bad = validateExtraFieldPair( [$id,
+ substr($data, $offset, $subLen)],
+ $strict, $gzipMode );
+ return $bad if $bad ;
+ push @$extraRef, [$id => substr($data, $offset, $subLen)]
+ if defined $extraRef;;
+
+ $offset += $subLen ;
+ }
+
+
+ return undef ;
+}
+
+
+sub mkSubField
+{
+ my $id = shift ;
+ my $data = shift ;
+
+ return $id . pack("v", length $data) . $data ;
+}
+
+sub parseExtraField
+{
+ my $dataRef = $_[0];
+ my $strict = $_[1];
+ my $gzipMode = $_[2];
+ #my $lax = @_ == 2 ? $_[1] : 1;
+
+
+ # ExtraField can be any of
+ #
+ # -ExtraField => $data
+ #
+ # -ExtraField => [$id1, $data1,
+ # $id2, $data2]
+ # ...
+ # ]
+ #
+ # -ExtraField => [ [$id1 => $data1],
+ # [$id2 => $data2],
+ # ...
+ # ]
+ #
+ # -ExtraField => { $id1 => $data1,
+ # $id2 => $data2,
+ # ...
+ # }
+
+ if ( ! ref $dataRef ) {
+
+ return undef
+ if ! $strict;
+
+ return parseRawExtra($dataRef, undef, 1, $gzipMode);
+ }
+
+ #my $data = $$dataRef;
+ my $data = $dataRef;
+ my $out = '' ;
+
+ if (ref $data eq 'ARRAY') {
+ if (ref $data->[0]) {
+
+ foreach my $pair (@$data) {
+ return ExtraFieldError("Not list of lists")
+ unless ref $pair eq 'ARRAY' ;
+
+ my $bad = validateExtraFieldPair($pair, $strict, $gzipMode) ;
+ return $bad if $bad ;
+
+ $out .= mkSubField(@$pair);
+ }
+ }
+ else {
+ return ExtraFieldError("Not even number of elements")
+ unless @$data % 2 == 0;
+
+ for (my $ix = 0; $ix <= length(@$data) -1 ; $ix += 2) {
+ my $bad = validateExtraFieldPair([$data->[$ix],
+ $data->[$ix+1]],
+ $strict, $gzipMode) ;
+ return $bad if $bad ;
+
+ $out .= mkSubField($data->[$ix], $data->[$ix+1]);
+ }
+ }
+ }
+ elsif (ref $data eq 'HASH') {
+ while (my ($id, $info) = each %$data) {
+ my $bad = validateExtraFieldPair([$id, $info], $strict, $gzipMode);
+ return $bad if $bad ;
+
+ $out .= mkSubField($id, $info);
+ }
+ }
+ else {
+ return ExtraFieldError("Not a scalar, array ref or hash ref") ;
+ }
+
+ return ExtraFieldError("Too Large")
+ if length $out > GZIP_FEXTRA_MAX_SIZE;
+
+ $_[0] = $out ;
+
+ return undef;
+}
+
+1;
+
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Dir.pm b/Master/tlpkg/tlperl.straw/lib/IO/Dir.pm
new file mode 100755
index 00000000000..cce392c2ce3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Dir.pm
@@ -0,0 +1,248 @@
+# IO::Dir.pm
+#
+# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package IO::Dir;
+
+use 5.006;
+
+use strict;
+use Carp;
+use Symbol;
+use Exporter;
+use IO::File;
+our(@ISA, $VERSION, @EXPORT_OK);
+use Tie::Hash;
+use File::stat;
+use File::Spec;
+
+@ISA = qw(Tie::Hash Exporter);
+$VERSION = "1.07";
+$VERSION = eval $VERSION;
+@EXPORT_OK = qw(DIR_UNLINK);
+
+sub DIR_UNLINK () { 1 }
+
+sub new {
+ @_ >= 1 && @_ <= 2 or croak 'usage: new IO::Dir [DIRNAME]';
+ my $class = shift;
+ my $dh = gensym;
+ if (@_) {
+ IO::Dir::open($dh, $_[0])
+ or return undef;
+ }
+ bless $dh, $class;
+}
+
+sub DESTROY {
+ my ($dh) = @_;
+ local($., $@, $!, $^E, $?);
+ no warnings 'io';
+ closedir($dh);
+}
+
+sub open {
+ @_ == 2 or croak 'usage: $dh->open(DIRNAME)';
+ my ($dh, $dirname) = @_;
+ return undef
+ unless opendir($dh, $dirname);
+ # a dir name should always have a ":" in it; assume dirname is
+ # in current directory
+ $dirname = ':' . $dirname if ( ($^O eq 'MacOS') && ($dirname !~ /:/) );
+ ${*$dh}{io_dir_path} = $dirname;
+ 1;
+}
+
+sub close {
+ @_ == 1 or croak 'usage: $dh->close()';
+ my ($dh) = @_;
+ closedir($dh);
+}
+
+sub read {
+ @_ == 1 or croak 'usage: $dh->read()';
+ my ($dh) = @_;
+ readdir($dh);
+}
+
+sub seek {
+ @_ == 2 or croak 'usage: $dh->seek(POS)';
+ my ($dh,$pos) = @_;
+ seekdir($dh,$pos);
+}
+
+sub tell {
+ @_ == 1 or croak 'usage: $dh->tell()';
+ my ($dh) = @_;
+ telldir($dh);
+}
+
+sub rewind {
+ @_ == 1 or croak 'usage: $dh->rewind()';
+ my ($dh) = @_;
+ rewinddir($dh);
+}
+
+sub TIEHASH {
+ my($class,$dir,$options) = @_;
+
+ my $dh = $class->new($dir)
+ or return undef;
+
+ $options ||= 0;
+
+ ${*$dh}{io_dir_unlink} = $options & DIR_UNLINK;
+ $dh;
+}
+
+sub FIRSTKEY {
+ my($dh) = @_;
+ $dh->rewind;
+ scalar $dh->read;
+}
+
+sub NEXTKEY {
+ my($dh) = @_;
+ scalar $dh->read;
+}
+
+sub EXISTS {
+ my($dh,$key) = @_;
+ -e File::Spec->catfile(${*$dh}{io_dir_path}, $key);
+}
+
+sub FETCH {
+ my($dh,$key) = @_;
+ &lstat(File::Spec->catfile(${*$dh}{io_dir_path}, $key));
+}
+
+sub STORE {
+ my($dh,$key,$data) = @_;
+ my($atime,$mtime) = ref($data) ? @$data : ($data,$data);
+ my $file = File::Spec->catfile(${*$dh}{io_dir_path}, $key);
+ unless(-e $file) {
+ my $io = IO::File->new($file,O_CREAT | O_RDWR);
+ $io->close if $io;
+ }
+ utime($atime,$mtime, $file);
+}
+
+sub DELETE {
+ my($dh,$key) = @_;
+
+ # Only unlink if unlink-ing is enabled
+ return 0
+ unless ${*$dh}{io_dir_unlink};
+
+ my $file = File::Spec->catfile(${*$dh}{io_dir_path}, $key);
+
+ -d $file
+ ? rmdir($file)
+ : unlink($file);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Dir - supply object methods for directory handles
+
+=head1 SYNOPSIS
+
+ use IO::Dir;
+ $d = IO::Dir->new(".");
+ if (defined $d) {
+ while (defined($_ = $d->read)) { something($_); }
+ $d->rewind;
+ while (defined($_ = $d->read)) { something_else($_); }
+ undef $d;
+ }
+
+ tie %dir, 'IO::Dir', ".";
+ foreach (keys %dir) {
+ print $_, " " , $dir{$_}->size,"\n";
+ }
+
+=head1 DESCRIPTION
+
+The C<IO::Dir> package provides two interfaces to perl's directory reading
+routines.
+
+The first interface is an object approach. C<IO::Dir> provides an object
+constructor and methods, which are just wrappers around perl's built in
+directory reading routines.
+
+=over 4
+
+=item new ( [ DIRNAME ] )
+
+C<new> is the constructor for C<IO::Dir> objects. It accepts one optional
+argument which, if given, C<new> will pass to C<open>
+
+=back
+
+The following methods are wrappers for the directory related functions built
+into perl (the trailing `dir' has been removed from the names). See L<perlfunc>
+for details of these functions.
+
+=over 4
+
+=item open ( DIRNAME )
+
+=item read ()
+
+=item seek ( POS )
+
+=item tell ()
+
+=item rewind ()
+
+=item close ()
+
+=back
+
+C<IO::Dir> also provides an interface to reading directories via a tied
+hash. The tied hash extends the interface beyond just the directory
+reading routines by the use of C<lstat>, from the C<File::stat> package,
+C<unlink>, C<rmdir> and C<utime>.
+
+=over 4
+
+=item tie %hash, 'IO::Dir', DIRNAME [, OPTIONS ]
+
+=back
+
+The keys of the hash will be the names of the entries in the directory.
+Reading a value from the hash will be the result of calling
+C<File::stat::lstat>. Deleting an element from the hash will
+delete the corresponding file or subdirectory,
+provided that C<DIR_UNLINK> is included in the C<OPTIONS>.
+
+Assigning to an entry in the hash will cause the time stamps of the file
+to be modified. If the file does not exist then it will be created. Assigning
+a single integer to a hash element will cause both the access and
+modification times to be changed to that value. Alternatively a reference to
+an array of two values can be passed. The first array element will be used to
+set the access time and the second element will be used to set the modification
+time.
+
+=head1 SEE ALSO
+
+L<File::stat>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-2003 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/File.pm b/Master/tlpkg/tlperl.straw/lib/IO/File.pm
new file mode 100755
index 00000000000..d33d090d0b2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/File.pm
@@ -0,0 +1,204 @@
+#
+
+package IO::File;
+
+=head1 NAME
+
+IO::File - supply object methods for filehandles
+
+=head1 SYNOPSIS
+
+ use IO::File;
+
+ $fh = new IO::File;
+ if ($fh->open("< file")) {
+ print <$fh>;
+ $fh->close;
+ }
+
+ $fh = new IO::File "> file";
+ if (defined $fh) {
+ print $fh "bar\n";
+ $fh->close;
+ }
+
+ $fh = new IO::File "file", "r";
+ if (defined $fh) {
+ print <$fh>;
+ undef $fh; # automatically closes the file
+ }
+
+ $fh = new IO::File "file", O_WRONLY|O_APPEND;
+ if (defined $fh) {
+ print $fh "corge\n";
+
+ $pos = $fh->getpos;
+ $fh->setpos($pos);
+
+ undef $fh; # automatically closes the file
+ }
+
+ autoflush STDOUT 1;
+
+=head1 DESCRIPTION
+
+C<IO::File> inherits from C<IO::Handle> and C<IO::Seekable>. It extends
+these classes with methods that are specific to file handles.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( FILENAME [,MODE [,PERMS]] )
+
+Creates an C<IO::File>. If it receives any parameters, they are passed to
+the method C<open>; if the open fails, the object is destroyed. Otherwise,
+it is returned to the caller.
+
+=item new_tmpfile
+
+Creates an C<IO::File> opened for read/write on a newly created temporary
+file. On systems where this is possible, the temporary file is anonymous
+(i.e. it is unlinked after creation, but held open). If the temporary
+file cannot be created or opened, the C<IO::File> object is destroyed.
+Otherwise, it is returned to the caller.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item open( FILENAME [,MODE [,PERMS]] )
+
+=item open( FILENAME, IOLAYERS )
+
+C<open> accepts one, two or three parameters. With one parameter,
+it is just a front end for the built-in C<open> function. With two or three
+parameters, the first parameter is a filename that may include
+whitespace or other special characters, and the second parameter is
+the open mode, optionally followed by a file permission value.
+
+If C<IO::File::open> receives a Perl mode string ("E<gt>", "+E<lt>", etc.)
+or an ANSI C fopen() mode string ("w", "r+", etc.), it uses the basic
+Perl C<open> operator (but protects any special characters).
+
+If C<IO::File::open> is given a numeric mode, it passes that mode
+and the optional permissions value to the Perl C<sysopen> operator.
+The permissions default to 0666.
+
+If C<IO::File::open> is given a mode that includes the C<:> character,
+it passes all the three arguments to the three-argument C<open> operator.
+
+For convenience, C<IO::File> exports the O_XXX constants from the
+Fcntl module, if this module is available.
+
+=item binmode( [LAYER] )
+
+C<binmode> sets C<binmode> on the underlying C<IO> object, as documented
+in C<perldoc -f binmode>.
+
+C<binmode> accepts one optional parameter, which is the layer to be
+passed on to the C<binmode> call.
+
+=back
+
+=head1 NOTE
+
+Some operating systems may perform C<IO::File::new()> or C<IO::File::open()>
+on a directory without errors. This behavior is not portable and not
+suggested for use. Using C<opendir()> and C<readdir()> or C<IO::Dir> are
+suggested instead.
+
+=head1 SEE ALSO
+
+L<perlfunc>,
+L<perlop/"I/O Operators">,
+L<IO::Handle>,
+L<IO::Seekable>,
+L<IO::Dir>
+
+=head1 HISTORY
+
+Derived from FileHandle.pm by Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
+
+=cut
+
+use 5.006_001;
+use strict;
+our($VERSION, @EXPORT, @EXPORT_OK, @ISA);
+use Carp;
+use Symbol;
+use SelectSaver;
+use IO::Seekable;
+use File::Spec;
+
+require Exporter;
+
+@ISA = qw(IO::Handle IO::Seekable Exporter);
+
+$VERSION = "1.14";
+
+@EXPORT = @IO::Seekable::EXPORT;
+
+eval {
+ # Make all Fcntl O_XXX constants available for importing
+ require Fcntl;
+ my @O = grep /^O_/, @Fcntl::EXPORT;
+ Fcntl->import(@O); # first we import what we want to export
+ push(@EXPORT, @O);
+};
+
+################################################
+## Constructor
+##
+
+sub new {
+ my $type = shift;
+ my $class = ref($type) || $type || "IO::File";
+ @_ >= 0 && @_ <= 3
+ or croak "usage: new $class [FILENAME [,MODE [,PERMS]]]";
+ my $fh = $class->SUPER::new();
+ if (@_) {
+ $fh->open(@_)
+ or return undef;
+ }
+ $fh;
+}
+
+################################################
+## Open
+##
+
+sub open {
+ @_ >= 2 && @_ <= 4 or croak 'usage: $fh->open(FILENAME [,MODE [,PERMS]])';
+ my ($fh, $file) = @_;
+ if (@_ > 2) {
+ my ($mode, $perms) = @_[2, 3];
+ if ($mode =~ /^\d+$/) {
+ defined $perms or $perms = 0666;
+ return sysopen($fh, $file, $mode, $perms);
+ } elsif ($mode =~ /:/) {
+ return open($fh, $mode, $file) if @_ == 3;
+ croak 'usage: $fh->open(FILENAME, IOLAYERS)';
+ } else {
+ return open($fh, IO::Handle::_open_mode_string($mode), $file);
+ }
+ }
+ open($fh, $file);
+}
+
+################################################
+## Binmode
+##
+
+sub binmode {
+ ( @_ == 1 or @_ == 2 ) or croak 'usage $fh->binmode([LAYER])';
+
+ my($fh, $layer) = @_;
+
+ return binmode $$fh unless $layer;
+ return binmode $$fh, $layer;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Handle.pm b/Master/tlpkg/tlperl.straw/lib/IO/Handle.pm
new file mode 100755
index 00000000000..2f1f1b423bc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Handle.pm
@@ -0,0 +1,635 @@
+package IO::Handle;
+
+=head1 NAME
+
+IO::Handle - supply object methods for I/O handles
+
+=head1 SYNOPSIS
+
+ use IO::Handle;
+
+ $io = new IO::Handle;
+ if ($io->fdopen(fileno(STDIN),"r")) {
+ print $io->getline;
+ $io->close;
+ }
+
+ $io = new IO::Handle;
+ if ($io->fdopen(fileno(STDOUT),"w")) {
+ $io->print("Some text\n");
+ }
+
+ # setvbuf is not available by default on Perls 5.8.0 and later.
+ use IO::Handle '_IOLBF';
+ $io->setvbuf($buffer_var, _IOLBF, 1024);
+
+ undef $io; # automatically closes the file if it's open
+
+ autoflush STDOUT 1;
+
+=head1 DESCRIPTION
+
+C<IO::Handle> is the base class for all other IO handle classes. It is
+not intended that objects of C<IO::Handle> would be created directly,
+but instead C<IO::Handle> is inherited from by several other classes
+in the IO hierarchy.
+
+If you are reading this documentation, looking for a replacement for
+the C<FileHandle> package, then I suggest you read the documentation
+for C<IO::File> too.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ()
+
+Creates a new C<IO::Handle> object.
+
+=item new_from_fd ( FD, MODE )
+
+Creates an C<IO::Handle> like C<new> does.
+It requires two parameters, which are passed to the method C<fdopen>;
+if the fdopen fails, the object is destroyed. Otherwise, it is returned
+to the caller.
+
+=back
+
+=head1 METHODS
+
+See L<perlfunc> for complete descriptions of each of the following
+supported C<IO::Handle> methods, which are just front ends for the
+corresponding built-in functions:
+
+ $io->close
+ $io->eof
+ $io->fcntl( FUNCTION, SCALAR )
+ $io->fileno
+ $io->format_write( [FORMAT_NAME] )
+ $io->getc
+ $io->ioctl( FUNCTION, SCALAR )
+ $io->read ( BUF, LEN, [OFFSET] )
+ $io->print ( ARGS )
+ $io->printf ( FMT, [ARGS] )
+ $io->say ( ARGS )
+ $io->stat
+ $io->sysread ( BUF, LEN, [OFFSET] )
+ $io->syswrite ( BUF, [LEN, [OFFSET]] )
+ $io->truncate ( LEN )
+
+See L<perlvar> for complete descriptions of each of the following
+supported C<IO::Handle> methods. All of them return the previous
+value of the attribute and takes an optional single argument that when
+given will set the value. If no argument is given the previous value
+is unchanged (except for $io->autoflush will actually turn ON
+autoflush by default).
+
+ $io->autoflush ( [BOOL] ) $|
+ $io->format_page_number( [NUM] ) $%
+ $io->format_lines_per_page( [NUM] ) $=
+ $io->format_lines_left( [NUM] ) $-
+ $io->format_name( [STR] ) $~
+ $io->format_top_name( [STR] ) $^
+ $io->input_line_number( [NUM]) $.
+
+The following methods are not supported on a per-filehandle basis.
+
+ IO::Handle->format_line_break_characters( [STR] ) $:
+ IO::Handle->format_formfeed( [STR]) $^L
+ IO::Handle->output_field_separator( [STR] ) $,
+ IO::Handle->output_record_separator( [STR] ) $\
+
+ IO::Handle->input_record_separator( [STR] ) $/
+
+Furthermore, for doing normal I/O you might need these:
+
+=over 4
+
+=item $io->fdopen ( FD, MODE )
+
+C<fdopen> is like an ordinary C<open> except that its first parameter
+is not a filename but rather a file handle name, an IO::Handle object,
+or a file descriptor number. (For the documentation of the C<open>
+method, see L<IO::File>.)
+
+=item $io->opened
+
+Returns true if the object is currently a valid file descriptor, false
+otherwise.
+
+=item $io->getline
+
+This works like <$io> described in L<perlop/"I/O Operators">
+except that it's more readable and can be safely called in a
+list context but still returns just one line. If used as the conditional
++within a C<while> or C-style C<for> loop, however, you will need to
++emulate the functionality of <$io> with C<< defined($_ = $io->getline) >>.
+
+=item $io->getlines
+
+This works like <$io> when called in a list context to read all
+the remaining lines in a file, except that it's more readable.
+It will also croak() if accidentally called in a scalar context.
+
+=item $io->ungetc ( ORD )
+
+Pushes a character with the given ordinal value back onto the given
+handle's input stream. Only one character of pushback per handle is
+guaranteed.
+
+=item $io->write ( BUF, LEN [, OFFSET ] )
+
+This C<write> is like C<write> found in C, that is it is the
+opposite of read. The wrapper for the perl C<write> function is
+called C<format_write>.
+
+=item $io->error
+
+Returns a true value if the given handle has experienced any errors
+since it was opened or since the last call to C<clearerr>, or if the
+handle is invalid. It only returns false for a valid handle with no
+outstanding errors.
+
+=item $io->clearerr
+
+Clear the given handle's error indicator. Returns -1 if the handle is
+invalid, 0 otherwise.
+
+=item $io->sync
+
+C<sync> synchronizes a file's in-memory state with that on the
+physical medium. C<sync> does not operate at the perlio api level, but
+operates on the file descriptor (similar to sysread, sysseek and
+systell). This means that any data held at the perlio api level will not
+be synchronized. To synchronize data that is buffered at the perlio api
+level you must use the flush method. C<sync> is not implemented on all
+platforms. Returns "0 but true" on success, C<undef> on error, C<undef>
+for an invalid handle. See L<fsync(3c)>.
+
+=item $io->flush
+
+C<flush> causes perl to flush any buffered data at the perlio api level.
+Any unread data in the buffer will be discarded, and any unwritten data
+will be written to the underlying file descriptor. Returns "0 but true"
+on success, C<undef> on error.
+
+=item $io->printflush ( ARGS )
+
+Turns on autoflush, print ARGS and then restores the autoflush status of the
+C<IO::Handle> object. Returns the return value from print.
+
+=item $io->blocking ( [ BOOL ] )
+
+If called with an argument C<blocking> will turn on non-blocking IO if
+C<BOOL> is false, and turn it off if C<BOOL> is true.
+
+C<blocking> will return the value of the previous setting, or the
+current setting if C<BOOL> is not given.
+
+If an error occurs C<blocking> will return undef and C<$!> will be set.
+
+=back
+
+
+If the C functions setbuf() and/or setvbuf() are available, then
+C<IO::Handle::setbuf> and C<IO::Handle::setvbuf> set the buffering
+policy for an IO::Handle. The calling sequences for the Perl functions
+are the same as their C counterparts--including the constants C<_IOFBF>,
+C<_IOLBF>, and C<_IONBF> for setvbuf()--except that the buffer parameter
+specifies a scalar variable to use as a buffer. You should only
+change the buffer before any I/O, or immediately after calling flush.
+
+WARNING: The IO::Handle::setvbuf() is not available by default on
+Perls 5.8.0 and later because setvbuf() is rather specific to using
+the stdio library, while Perl prefers the new perlio subsystem instead.
+
+WARNING: A variable used as a buffer by C<setbuf> or C<setvbuf> B<must not
+be modified> in any way until the IO::Handle is closed or C<setbuf> or
+C<setvbuf> is called again, or memory corruption may result! Remember that
+the order of global destruction is undefined, so even if your buffer
+variable remains in scope until program termination, it may be undefined
+before the file IO::Handle is closed. Note that you need to import the
+constants C<_IOFBF>, C<_IOLBF>, and C<_IONBF> explicitly. Like C, setbuf
+returns nothing. setvbuf returns "0 but true", on success, C<undef> on
+failure.
+
+Lastly, there is a special method for working under B<-T> and setuid/gid
+scripts:
+
+=over 4
+
+=item $io->untaint
+
+Marks the object as taint-clean, and as such data read from it will also
+be considered taint-clean. Note that this is a very trusting action to
+take, and appropriate consideration for the data source and potential
+vulnerability should be kept in mind. Returns 0 on success, -1 if setting
+the taint-clean flag failed. (eg invalid handle)
+
+=back
+
+=head1 NOTE
+
+An C<IO::Handle> object is a reference to a symbol/GLOB reference (see
+the C<Symbol> package). Some modules that
+inherit from C<IO::Handle> may want to keep object related variables
+in the hash table part of the GLOB. In an attempt to prevent modules
+trampling on each other I propose the that any such module should prefix
+its variables with its own name separated by _'s. For example the IO::Socket
+module keeps a C<timeout> variable in 'io_socket_timeout'.
+
+=head1 SEE ALSO
+
+L<perlfunc>,
+L<perlop/"I/O Operators">,
+L<IO::File>
+
+=head1 BUGS
+
+Due to backwards compatibility, all filehandles resemble objects
+of class C<IO::Handle>, or actually classes derived from that class.
+They actually aren't. Which means you can't derive your own
+class from C<IO::Handle> and inherit those methods.
+
+=head1 HISTORY
+
+Derived from FileHandle.pm by Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+
+=cut
+
+use 5.006_001;
+use strict;
+our($VERSION, @EXPORT_OK, @ISA);
+use Carp;
+use Symbol;
+use SelectSaver;
+use IO (); # Load the XS module
+
+require Exporter;
+@ISA = qw(Exporter);
+
+$VERSION = "1.28";
+$VERSION = eval $VERSION;
+
+@EXPORT_OK = qw(
+ autoflush
+ output_field_separator
+ output_record_separator
+ input_record_separator
+ input_line_number
+ format_page_number
+ format_lines_per_page
+ format_lines_left
+ format_name
+ format_top_name
+ format_line_break_characters
+ format_formfeed
+ format_write
+
+ print
+ printf
+ say
+ getline
+ getlines
+
+ printflush
+ flush
+
+ SEEK_SET
+ SEEK_CUR
+ SEEK_END
+ _IOFBF
+ _IOLBF
+ _IONBF
+);
+
+################################################
+## Constructors, destructors.
+##
+
+sub new {
+ my $class = ref($_[0]) || $_[0] || "IO::Handle";
+ @_ == 1 or croak "usage: new $class";
+ my $io = gensym;
+ bless $io, $class;
+}
+
+sub new_from_fd {
+ my $class = ref($_[0]) || $_[0] || "IO::Handle";
+ @_ == 3 or croak "usage: new_from_fd $class FD, MODE";
+ my $io = gensym;
+ shift;
+ IO::Handle::fdopen($io, @_)
+ or return undef;
+ bless $io, $class;
+}
+
+#
+# There is no need for DESTROY to do anything, because when the
+# last reference to an IO object is gone, Perl automatically
+# closes its associated files (if any). However, to avoid any
+# attempts to autoload DESTROY, we here define it to do nothing.
+#
+sub DESTROY {}
+
+
+################################################
+## Open and close.
+##
+
+sub _open_mode_string {
+ my ($mode) = @_;
+ $mode =~ /^\+?(<|>>?)$/
+ or $mode =~ s/^r(\+?)$/$1</
+ or $mode =~ s/^w(\+?)$/$1>/
+ or $mode =~ s/^a(\+?)$/$1>>/
+ or croak "IO::Handle: bad open mode: $mode";
+ $mode;
+}
+
+sub fdopen {
+ @_ == 3 or croak 'usage: $io->fdopen(FD, MODE)';
+ my ($io, $fd, $mode) = @_;
+ local(*GLOB);
+
+ if (ref($fd) && "".$fd =~ /GLOB\(/o) {
+ # It's a glob reference; Alias it as we cannot get name of anon GLOBs
+ my $n = qualify(*GLOB);
+ *GLOB = *{*$fd};
+ $fd = $n;
+ } elsif ($fd =~ m#^\d+$#) {
+ # It's an FD number; prefix with "=".
+ $fd = "=$fd";
+ }
+
+ open($io, _open_mode_string($mode) . '&' . $fd)
+ ? $io : undef;
+}
+
+sub close {
+ @_ == 1 or croak 'usage: $io->close()';
+ my($io) = @_;
+
+ close($io);
+}
+
+################################################
+## Normal I/O functions.
+##
+
+# flock
+# select
+
+sub opened {
+ @_ == 1 or croak 'usage: $io->opened()';
+ defined fileno($_[0]);
+}
+
+sub fileno {
+ @_ == 1 or croak 'usage: $io->fileno()';
+ fileno($_[0]);
+}
+
+sub getc {
+ @_ == 1 or croak 'usage: $io->getc()';
+ getc($_[0]);
+}
+
+sub eof {
+ @_ == 1 or croak 'usage: $io->eof()';
+ eof($_[0]);
+}
+
+sub print {
+ @_ or croak 'usage: $io->print(ARGS)';
+ my $this = shift;
+ print $this @_;
+}
+
+sub printf {
+ @_ >= 2 or croak 'usage: $io->printf(FMT,[ARGS])';
+ my $this = shift;
+ printf $this @_;
+}
+
+sub say {
+ @_ or croak 'usage: $io->say(ARGS)';
+ my $this = shift;
+ local $\ = "\n";
+ print $this @_;
+}
+
+sub getline {
+ @_ == 1 or croak 'usage: $io->getline()';
+ my $this = shift;
+ return scalar <$this>;
+}
+
+*gets = \&getline; # deprecated
+
+sub getlines {
+ @_ == 1 or croak 'usage: $io->getlines()';
+ wantarray or
+ croak 'Can\'t call $io->getlines in a scalar context, use $io->getline';
+ my $this = shift;
+ return <$this>;
+}
+
+sub truncate {
+ @_ == 2 or croak 'usage: $io->truncate(LEN)';
+ truncate($_[0], $_[1]);
+}
+
+sub read {
+ @_ == 3 || @_ == 4 or croak 'usage: $io->read(BUF, LEN [, OFFSET])';
+ read($_[0], $_[1], $_[2], $_[3] || 0);
+}
+
+sub sysread {
+ @_ == 3 || @_ == 4 or croak 'usage: $io->sysread(BUF, LEN [, OFFSET])';
+ sysread($_[0], $_[1], $_[2], $_[3] || 0);
+}
+
+sub write {
+ @_ >= 2 && @_ <= 4 or croak 'usage: $io->write(BUF [, LEN [, OFFSET]])';
+ local($\) = "";
+ $_[2] = length($_[1]) unless defined $_[2];
+ print { $_[0] } substr($_[1], $_[3] || 0, $_[2]);
+}
+
+sub syswrite {
+ @_ >= 2 && @_ <= 4 or croak 'usage: $io->syswrite(BUF [, LEN [, OFFSET]])';
+ if (defined($_[2])) {
+ syswrite($_[0], $_[1], $_[2], $_[3] || 0);
+ } else {
+ syswrite($_[0], $_[1]);
+ }
+}
+
+sub stat {
+ @_ == 1 or croak 'usage: $io->stat()';
+ stat($_[0]);
+}
+
+################################################
+## State modification functions.
+##
+
+sub autoflush {
+ my $old = new SelectSaver qualify($_[0], caller);
+ my $prev = $|;
+ $| = @_ > 1 ? $_[1] : 1;
+ $prev;
+}
+
+sub output_field_separator {
+ carp "output_field_separator is not supported on a per-handle basis"
+ if ref($_[0]);
+ my $prev = $,;
+ $, = $_[1] if @_ > 1;
+ $prev;
+}
+
+sub output_record_separator {
+ carp "output_record_separator is not supported on a per-handle basis"
+ if ref($_[0]);
+ my $prev = $\;
+ $\ = $_[1] if @_ > 1;
+ $prev;
+}
+
+sub input_record_separator {
+ carp "input_record_separator is not supported on a per-handle basis"
+ if ref($_[0]);
+ my $prev = $/;
+ $/ = $_[1] if @_ > 1;
+ $prev;
+}
+
+sub input_line_number {
+ local $.;
+ () = tell qualify($_[0], caller) if ref($_[0]);
+ my $prev = $.;
+ $. = $_[1] if @_ > 1;
+ $prev;
+}
+
+sub format_page_number {
+ my $old;
+ $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
+ my $prev = $%;
+ $% = $_[1] if @_ > 1;
+ $prev;
+}
+
+sub format_lines_per_page {
+ my $old;
+ $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
+ my $prev = $=;
+ $= = $_[1] if @_ > 1;
+ $prev;
+}
+
+sub format_lines_left {
+ my $old;
+ $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
+ my $prev = $-;
+ $- = $_[1] if @_ > 1;
+ $prev;
+}
+
+sub format_name {
+ my $old;
+ $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
+ my $prev = $~;
+ $~ = qualify($_[1], caller) if @_ > 1;
+ $prev;
+}
+
+sub format_top_name {
+ my $old;
+ $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
+ my $prev = $^;
+ $^ = qualify($_[1], caller) if @_ > 1;
+ $prev;
+}
+
+sub format_line_break_characters {
+ carp "format_line_break_characters is not supported on a per-handle basis"
+ if ref($_[0]);
+ my $prev = $:;
+ $: = $_[1] if @_ > 1;
+ $prev;
+}
+
+sub format_formfeed {
+ carp "format_formfeed is not supported on a per-handle basis"
+ if ref($_[0]);
+ my $prev = $^L;
+ $^L = $_[1] if @_ > 1;
+ $prev;
+}
+
+sub formline {
+ my $io = shift;
+ my $picture = shift;
+ local($^A) = $^A;
+ local($\) = "";
+ formline($picture, @_);
+ print $io $^A;
+}
+
+sub format_write {
+ @_ < 3 || croak 'usage: $io->write( [FORMAT_NAME] )';
+ if (@_ == 2) {
+ my ($io, $fmt) = @_;
+ my $oldfmt = $io->format_name(qualify($fmt,caller));
+ CORE::write($io);
+ $io->format_name($oldfmt);
+ } else {
+ CORE::write($_[0]);
+ }
+}
+
+sub fcntl {
+ @_ == 3 || croak 'usage: $io->fcntl( OP, VALUE );';
+ my ($io, $op) = @_;
+ return fcntl($io, $op, $_[2]);
+}
+
+sub ioctl {
+ @_ == 3 || croak 'usage: $io->ioctl( OP, VALUE );';
+ my ($io, $op) = @_;
+ return ioctl($io, $op, $_[2]);
+}
+
+# this sub is for compatability with older releases of IO that used
+# a sub called constant to detemine if a constant existed -- GMB
+#
+# The SEEK_* and _IO?BF constants were the only constants at that time
+# any new code should just chech defined(&CONSTANT_NAME)
+
+sub constant {
+ no strict 'refs';
+ my $name = shift;
+ (($name =~ /^(SEEK_(SET|CUR|END)|_IO[FLN]BF)$/) && defined &{$name})
+ ? &{$name}() : undef;
+}
+
+
+# so that flush.pl can be deprecated
+
+sub printflush {
+ my $io = shift;
+ my $old;
+ $old = new SelectSaver qualify($io, caller) if ref($io);
+ local $| = 1;
+ if(ref($io)) {
+ print $io @_;
+ }
+ else {
+ print @_;
+ }
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/InnerFile.pm b/Master/tlpkg/tlperl.straw/lib/IO/InnerFile.pm
new file mode 100755
index 00000000000..2023e42b8aa
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/InnerFile.pm
@@ -0,0 +1,282 @@
+package IO::InnerFile;
+
+=head1 NAME
+
+IO::InnerFile - define a file inside another file
+
+
+=head1 SYNOPSIS
+
+
+ ### Read a subset of a file:
+ $inner = IO::InnerFile->new($fh, $start, $length);
+ while (<$inner>) {
+ ...
+ }
+
+
+=head1 DESCRIPTION
+
+If you have a filehandle that can seek() and tell(), then you
+can open an IO::InnerFile on a range of the underlying file.
+
+
+=head1 PUBLIC INTERFACE
+
+=over
+
+=cut
+
+use Symbol;
+
+# The package version, both in 1.23 style *and* usable by MakeMaker:
+$VERSION = "2.110";
+
+#------------------------------
+
+=item new FILEHANDLE, [START, [LENGTH]]
+
+I<Class method, constructor.>
+Create a new inner-file opened on the given FILEHANDLE,
+from bytes START to START+LENGTH. Both START and LENGTH
+default to 0; negative values are silently coerced to zero.
+
+Note that FILEHANDLE must be able to seek() and tell(), in addition
+to whatever other methods you may desire for reading it.
+
+=cut
+
+sub new {
+ my ($class, $fh, $start, $lg) = @_;
+ $start = 0 if (!$start or ($start < 0));
+ $lg = 0 if (!$lg or ($lg < 0));
+
+ ### Create the underlying "object":
+ my $a = {
+ FH => $fh,
+ CRPOS => 0,
+ START => $start,
+ LG => $lg,
+ };
+
+ ### Create a new filehandle tied to this object:
+ $fh = gensym;
+ tie(*$fh, $class, $a);
+ return bless($fh, $class);
+}
+
+sub TIEHANDLE {
+ my ($class, $data) = @_;
+ return bless($data, $class);
+}
+
+sub DESTROY {
+ my ($self) = @_;
+ $self->close() if (ref($self) eq 'SCALAR');
+}
+
+#------------------------------
+
+=item set_length LENGTH
+
+=item get_length
+
+=item add_length NBYTES
+
+I<Instance methods.>
+Get/set the virtual length of the inner file.
+
+=cut
+
+sub set_length { tied(${$_[0]})->{LG} = $_[1]; }
+sub get_length { tied(${$_[0]})->{LG}; }
+sub add_length { tied(${$_[0]})->{LG} += $_[1]; }
+
+#------------------------------
+
+=item set_start START
+
+=item get_start
+
+=item add_start NBYTES
+
+I<Instance methods.>
+Get/set the virtual start position of the inner file.
+
+=cut
+
+sub set_start { tied(${$_[0]})->{START} = $_[1]; }
+sub get_start { tied(${$_[0]})->{START}; }
+sub set_end { tied(${$_[0]})->{LG} = $_[1] - tied(${$_[0]})->{START}; }
+sub get_end { tied(${$_[0]})->{LG} + tied(${$_[0]})->{START}; }
+
+
+#------------------------------
+
+=item binmode
+
+=item close
+
+=item flush
+
+=item getc
+
+=item getline
+
+=item print LIST
+
+=item printf LIST
+
+=item read BUF, NBYTES
+
+=item readline
+
+=item seek OFFFSET, WHENCE
+
+=item tell
+
+=item write ARGS...
+
+I<Instance methods.>
+Standard filehandle methods.
+
+=cut
+
+sub write { shift->WRITE(@_) }
+sub print { shift->PRINT(@_) }
+sub printf { shift->PRINTF(@_) }
+sub flush { "0 but true"; }
+sub binmode { 1; }
+sub getc { return GETC(tied(${$_[0]}) ); }
+sub read { return READ( tied(${$_[0]}), @_[1,2,3] ); }
+sub readline { return READLINE( tied(${$_[0]}) ); }
+sub getline { return READLINE( tied(${$_[0]}) ); }
+sub close { return CLOSE(tied(${$_[0]}) ); }
+
+sub seek {
+ my ($self, $ofs, $whence) = @_;
+ $self = tied( $$self );
+
+ $self->{CRPOS} = $ofs if ($whence == 0);
+ $self->{CRPOS}+= $ofs if ($whence == 1);
+ $self->{CRPOS} = $self->{LG} + $ofs if ($whence == 2);
+
+ $self->{CRPOS} = 0 if ($self->{CRPOS} < 0);
+ $self->{CRPOS} = $self->{LG} if ($self->{CRPOS} > $self->{LG});
+ return 1;
+}
+
+sub tell {
+ return tied(${$_[0]})->{CRPOS};
+}
+
+sub WRITE {
+ die "inner files can only open for reading\n";
+}
+
+sub PRINT {
+ die "inner files can only open for reading\n";
+}
+
+sub PRINTF {
+ die "inner files can only open for reading\n";
+}
+
+sub GETC {
+ my ($self) = @_;
+ return 0 if ($self->{CRPOS} >= $self->{LG});
+
+ my $data;
+
+ ### Save and seek...
+ my $old_pos = $self->{FH}->tell;
+ $self->{FH}->seek($self->{CRPOS}+$self->{START}, 0);
+
+ ### ...read...
+ my $lg = $self->{FH}->read($data, 1);
+ $self->{CRPOS} += $lg;
+
+ ### ...and restore:
+ $self->{FH}->seek($old_pos, 0);
+
+ $self->{LG} = $self->{CRPOS} unless ($lg);
+ return ($lg ? $data : undef);
+}
+
+sub READ {
+ my ($self, $undefined, $lg, $ofs) = @_;
+ $undefined = undef;
+
+ return 0 if ($self->{CRPOS} >= $self->{LG});
+ $lg = $self->{LG} - $self->{CRPOS} if ($self->{CRPOS} + $lg > $self->{LG});
+ return 0 unless ($lg);
+
+ ### Save and seek...
+ my $old_pos = $self->{FH}->tell;
+ $self->{FH}->seek($self->{CRPOS}+$self->{START}, 0);
+
+ ### ...read...
+ $lg = $self->{FH}->read($_[1], $lg, $_[3] );
+ $self->{CRPOS} += $lg;
+
+ ### ...and restore:
+ $self->{FH}->seek($old_pos, 0);
+
+ $self->{LG} = $self->{CRPOS} unless ($lg);
+ return $lg;
+}
+
+sub READLINE {
+ my ($self) = @_;
+ return undef if ($self->{CRPOS} >= $self->{LG});
+
+ ### Save and seek...
+ my $old_pos = $self->{FH}->tell;
+ $self->{FH}->seek($self->{CRPOS}+$self->{START}, 0);
+
+ ### ...read...
+ my $text = $self->{FH}->getline;
+
+ ### ...and restore:
+ $self->{FH}->seek($old_pos, 0);
+
+ #### If we detected a new EOF ...
+ unless (defined $text) {
+ $self->{LG} = $self->{CRPOS};
+ return undef;
+ }
+
+ my $lg=length($text);
+
+ $lg = $self->{LG} - $self->{CRPOS} if ($self->{CRPOS} + $lg > $self->{LG});
+ $self->{CRPOS} += $lg;
+
+ return substr($text, 0,$lg);
+}
+
+sub CLOSE { %{$_[0]}=(); }
+
+
+
+1;
+__END__
+
+=back
+
+
+=head1 VERSION
+
+$Id: InnerFile.pm,v 1.4 2005/02/10 21:21:53 dfs Exp $
+
+
+=head1 AUTHOR
+
+Original version by Doru Petrescu (pdoru@kappa.ro).
+
+Documentation and by Eryq (eryq@zeegee.com).
+
+Currently maintained by David F. Skoll (dfs@roaringpenguin.com).
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Lines.pm b/Master/tlpkg/tlperl.straw/lib/IO/Lines.pm
new file mode 100755
index 00000000000..46c40a5492b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Lines.pm
@@ -0,0 +1,184 @@
+package IO::Lines;
+
+
+=head1 NAME
+
+IO::Lines - IO:: interface for reading/writing an array of lines
+
+
+=head1 SYNOPSIS
+
+ use IO::Lines;
+
+ ### See IO::ScalarArray for details
+
+
+=head1 DESCRIPTION
+
+This class implements objects which behave just like FileHandle
+(or IO::Handle) objects, except that you may use them to write to
+(or read from) an array of lines. They can be tiehandle'd as well.
+
+This is a subclass of L<IO::ScalarArray|IO::ScalarArray>
+in which the underlying
+array has its data stored in a line-oriented-format: that is,
+every element ends in a C<"\n">, with the possible exception of the
+final element. This makes C<getline()> I<much> more efficient;
+if you plan to do line-oriented reading/printing, you want this class.
+
+The C<print()> method will enforce this rule, so you can print
+arbitrary data to the line-array: it will break the data at
+newlines appropriately.
+
+See L<IO::ScalarArray> for full usage and warnings.
+
+=cut
+
+use Carp;
+use strict;
+use IO::ScalarArray;
+use vars qw($VERSION @ISA);
+
+# The package version, both in 1.23 style *and* usable by MakeMaker:
+$VERSION = "2.110";
+
+# Inheritance:
+@ISA = qw(IO::ScalarArray); ### also gets us new_tie :-)
+
+
+#------------------------------
+#
+# getline
+#
+# Instance method, override.
+# Return the next line, or undef on end of data.
+# Can safely be called in an array context.
+# Currently, lines are delimited by "\n".
+#
+sub getline {
+ my $self = shift;
+
+ if (!defined $/) {
+ return join( '', $self->_getlines_for_newlines );
+ }
+ elsif ($/ eq "\n") {
+ if (!*$self->{Pos}) { ### full line...
+ return *$self->{AR}[*$self->{Str}++];
+ }
+ else { ### partial line...
+ my $partial = substr(*$self->{AR}[*$self->{Str}++], *$self->{Pos});
+ *$self->{Pos} = 0;
+ return $partial;
+ }
+ }
+ else {
+ croak 'unsupported $/: must be "\n" or undef';
+ }
+}
+
+#------------------------------
+#
+# getlines
+#
+# Instance method, override.
+# Return an array comprised of the remaining lines, or () on end of data.
+# Must be called in an array context.
+# Currently, lines are delimited by "\n".
+#
+sub getlines {
+ my $self = shift;
+ wantarray or croak("can't call getlines in scalar context!");
+
+ if ((defined $/) and ($/ eq "\n")) {
+ return $self->_getlines_for_newlines(@_);
+ }
+ else { ### slow but steady
+ return $self->SUPER::getlines(@_);
+ }
+}
+
+#------------------------------
+#
+# _getlines_for_newlines
+#
+# Instance method, private.
+# If $/ is newline, do fast getlines.
+# This CAN NOT invoke getline!
+#
+sub _getlines_for_newlines {
+ my $self = shift;
+ my ($rArray, $Str, $Pos) = @{*$self}{ qw( AR Str Pos ) };
+ my @partial = ();
+
+ if ($Pos) { ### partial line...
+ @partial = (substr( $rArray->[ $Str++ ], $Pos ));
+ *$self->{Pos} = 0;
+ }
+ *$self->{Str} = scalar @$rArray; ### about to exhaust @$rArray
+ return (@partial,
+ @$rArray[ $Str .. $#$rArray ]); ### remaining full lines...
+}
+
+#------------------------------
+#
+# print ARGS...
+#
+# Instance method, override.
+# Print ARGS to the underlying line array.
+#
+sub print {
+ if (defined $\ && $\ ne "\n") {
+ croak 'unsupported $\: must be "\n" or undef';
+ }
+
+ my $self = shift;
+ ### print STDERR "\n[[ARRAY WAS...\n", @{*$self->{AR}}, "<<EOF>>\n";
+ my @lines = split /^/, join('', @_); @lines or return 1;
+
+ ### Did the previous print not end with a newline?
+ ### If so, append first line:
+ if (@{*$self->{AR}} and (*$self->{AR}[-1] !~ /\n\Z/)) {
+ *$self->{AR}[-1] .= shift @lines;
+ }
+ push @{*$self->{AR}}, @lines; ### add the remainder
+ ### print STDERR "\n[[ARRAY IS NOW...\n", @{*$self->{AR}}, "<<EOF>>\n";
+ 1;
+}
+
+#------------------------------
+1;
+
+__END__
+
+
+=head1 VERSION
+
+$Id: Lines.pm,v 1.3 2005/02/10 21:21:53 dfs Exp $
+
+
+=head1 AUTHORS
+
+
+=head2 Primary Maintainer
+
+David F. Skoll (F<dfs@roaringpenguin.com>).
+
+=head2 Principal author
+
+Eryq (F<eryq@zeegee.com>).
+President, ZeeGee Software Inc (F<http://www.zeegee.com>).
+
+
+=head2 Other contributors
+
+Thanks to the following individuals for their invaluable contributions
+(if I've forgotten or misspelled your name, please email me!):
+
+I<Morris M. Siegel,>
+for his $/ patch and the new C<getlines()>.
+
+I<Doug Wilson,>
+for the IO::Handle inheritance and automatic tie-ing.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Pipe.pm b/Master/tlpkg/tlperl.straw/lib/IO/Pipe.pm
new file mode 100755
index 00000000000..827cc48bfcd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Pipe.pm
@@ -0,0 +1,257 @@
+# IO::Pipe.pm
+#
+# Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package IO::Pipe;
+
+use 5.006_001;
+
+use IO::Handle;
+use strict;
+our($VERSION);
+use Carp;
+use Symbol;
+
+$VERSION = "1.13";
+
+sub new {
+ my $type = shift;
+ my $class = ref($type) || $type || "IO::Pipe";
+ @_ == 0 || @_ == 2 or croak "usage: new $class [READFH, WRITEFH]";
+
+ my $me = bless gensym(), $class;
+
+ my($readfh,$writefh) = @_ ? @_ : $me->handles;
+
+ pipe($readfh, $writefh)
+ or return undef;
+
+ @{*$me} = ($readfh, $writefh);
+
+ $me;
+}
+
+sub handles {
+ @_ == 1 or croak 'usage: $pipe->handles()';
+ (IO::Pipe::End->new(), IO::Pipe::End->new());
+}
+
+my $do_spawn = $^O eq 'os2' || $^O eq 'MSWin32';
+
+sub _doit {
+ my $me = shift;
+ my $rw = shift;
+
+ my $pid = $do_spawn ? 0 : fork();
+
+ if($pid) { # Parent
+ return $pid;
+ }
+ elsif(defined $pid) { # Child or spawn
+ my $fh;
+ my $io = $rw ? \*STDIN : \*STDOUT;
+ my ($mode, $save) = $rw ? "r" : "w";
+ if ($do_spawn) {
+ require Fcntl;
+ $save = IO::Handle->new_from_fd($io, $mode);
+ my $handle = shift;
+ # Close in child:
+ unless ($^O eq 'MSWin32') {
+ fcntl($handle, Fcntl::F_SETFD(), 1) or croak "fcntl: $!";
+ }
+ $fh = $rw ? ${*$me}[0] : ${*$me}[1];
+ } else {
+ shift;
+ $fh = $rw ? $me->reader() : $me->writer(); # close the other end
+ }
+ bless $io, "IO::Handle";
+ $io->fdopen($fh, $mode);
+ $fh->close;
+
+ if ($do_spawn) {
+ $pid = eval { system 1, @_ }; # 1 == P_NOWAIT
+ my $err = $!;
+
+ $io->fdopen($save, $mode);
+ $save->close or croak "Cannot close $!";
+ croak "IO::Pipe: Cannot spawn-NOWAIT: $err" if not $pid or $pid < 0;
+ return $pid;
+ } else {
+ exec @_ or
+ croak "IO::Pipe: Cannot exec: $!";
+ }
+ }
+ else {
+ croak "IO::Pipe: Cannot fork: $!";
+ }
+
+ # NOT Reached
+}
+
+sub reader {
+ @_ >= 1 or croak 'usage: $pipe->reader( [SUB_COMMAND_ARGS] )';
+ my $me = shift;
+
+ return undef
+ unless(ref($me) || ref($me = $me->new));
+
+ my $fh = ${*$me}[0];
+ my $pid;
+ $pid = $me->_doit(0, $fh, @_)
+ if(@_);
+
+ close ${*$me}[1];
+ bless $me, ref($fh);
+ *$me = *$fh; # Alias self to handle
+ $me->fdopen($fh->fileno,"r")
+ unless defined($me->fileno);
+ bless $fh; # Really wan't un-bless here
+ ${*$me}{'io_pipe_pid'} = $pid
+ if defined $pid;
+
+ $me;
+}
+
+sub writer {
+ @_ >= 1 or croak 'usage: $pipe->writer( [SUB_COMMAND_ARGS] )';
+ my $me = shift;
+
+ return undef
+ unless(ref($me) || ref($me = $me->new));
+
+ my $fh = ${*$me}[1];
+ my $pid;
+ $pid = $me->_doit(1, $fh, @_)
+ if(@_);
+
+ close ${*$me}[0];
+ bless $me, ref($fh);
+ *$me = *$fh; # Alias self to handle
+ $me->fdopen($fh->fileno,"w")
+ unless defined($me->fileno);
+ bless $fh; # Really wan't un-bless here
+ ${*$me}{'io_pipe_pid'} = $pid
+ if defined $pid;
+
+ $me;
+}
+
+package IO::Pipe::End;
+
+our(@ISA);
+
+@ISA = qw(IO::Handle);
+
+sub close {
+ my $fh = shift;
+ my $r = $fh->SUPER::close(@_);
+
+ waitpid(${*$fh}{'io_pipe_pid'},0)
+ if(defined ${*$fh}{'io_pipe_pid'});
+
+ $r;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Pipe - supply object methods for pipes
+
+=head1 SYNOPSIS
+
+ use IO::Pipe;
+
+ $pipe = new IO::Pipe;
+
+ if($pid = fork()) { # Parent
+ $pipe->reader();
+
+ while(<$pipe>) {
+ ...
+ }
+
+ }
+ elsif(defined $pid) { # Child
+ $pipe->writer();
+
+ print $pipe ...
+ }
+
+ or
+
+ $pipe = new IO::Pipe;
+
+ $pipe->reader(qw(ls -l));
+
+ while(<$pipe>) {
+ ...
+ }
+
+=head1 DESCRIPTION
+
+C<IO::Pipe> provides an interface to creating pipes between
+processes.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [READER, WRITER] )
+
+Creates an C<IO::Pipe>, which is a reference to a newly created symbol
+(see the C<Symbol> package). C<IO::Pipe::new> optionally takes two
+arguments, which should be objects blessed into C<IO::Handle>, or a
+subclass thereof. These two objects will be used for the system call
+to C<pipe>. If no arguments are given then method C<handles> is called
+on the new C<IO::Pipe> object.
+
+These two handles are held in the array part of the GLOB until either
+C<reader> or C<writer> is called.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item reader ([ARGS])
+
+The object is re-blessed into a sub-class of C<IO::Handle>, and becomes a
+handle at the reading end of the pipe. If C<ARGS> are given then C<fork>
+is called and C<ARGS> are passed to exec.
+
+=item writer ([ARGS])
+
+The object is re-blessed into a sub-class of C<IO::Handle>, and becomes a
+handle at the writing end of the pipe. If C<ARGS> are given then C<fork>
+is called and C<ARGS> are passed to exec.
+
+=item handles ()
+
+This method is called during construction by C<IO::Pipe::new>
+on the newly created C<IO::Pipe> object. It returns an array of two objects
+blessed into C<IO::Pipe::End>, or a subclass thereof.
+
+=back
+
+=head1 SEE ALSO
+
+L<IO::Handle>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Poll.pm b/Master/tlpkg/tlperl.straw/lib/IO/Poll.pm
new file mode 100755
index 00000000000..e7fb0135069
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Poll.pm
@@ -0,0 +1,209 @@
+
+# IO::Poll.pm
+#
+# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package IO::Poll;
+
+use strict;
+use IO::Handle;
+use Exporter ();
+our(@ISA, @EXPORT_OK, @EXPORT, $VERSION);
+
+@ISA = qw(Exporter);
+$VERSION = "0.07";
+
+@EXPORT = qw( POLLIN
+ POLLOUT
+ POLLERR
+ POLLHUP
+ POLLNVAL
+ );
+
+@EXPORT_OK = qw(
+ POLLPRI
+ POLLRDNORM
+ POLLWRNORM
+ POLLRDBAND
+ POLLWRBAND
+ POLLNORM
+ );
+
+# [0] maps fd's to requested masks
+# [1] maps fd's to returned masks
+# [2] maps fd's to handles
+sub new {
+ my $class = shift;
+
+ my $self = bless [{},{},{}], $class;
+
+ $self;
+}
+
+sub mask {
+ my $self = shift;
+ my $io = shift;
+ my $fd = fileno($io);
+ return unless defined $fd;
+ if (@_) {
+ my $mask = shift;
+ if($mask) {
+ $self->[0]{$fd}{$io} = $mask; # the error events are always returned
+ $self->[1]{$fd} = 0; # output mask
+ $self->[2]{$io} = $io; # remember handle
+ } else {
+ delete $self->[0]{$fd}{$io};
+ unless(%{$self->[0]{$fd}}) {
+ # We no longer have any handles for this FD
+ delete $self->[1]{$fd};
+ delete $self->[0]{$fd};
+ }
+ delete $self->[2]{$io};
+ }
+ }
+
+ return unless exists $self->[0]{$fd} and exists $self->[0]{$fd}{$io};
+ return $self->[0]{$fd}{$io};
+}
+
+
+sub poll {
+ my($self,$timeout) = @_;
+
+ $self->[1] = {};
+
+ my($fd,$mask,$iom);
+ my @poll = ();
+
+ while(($fd,$iom) = each %{$self->[0]}) {
+ $mask = 0;
+ $mask |= $_ for values(%$iom);
+ push(@poll,$fd => $mask);
+ }
+
+ my $ret = @poll ? _poll(defined($timeout) ? $timeout * 1000 : -1,@poll) : 0;
+
+ return $ret
+ unless $ret > 0;
+
+ while(@poll) {
+ my($fd,$got) = splice(@poll,0,2);
+ $self->[1]{$fd} = $got if $got;
+ }
+
+ return $ret;
+}
+
+sub events {
+ my $self = shift;
+ my $io = shift;
+ my $fd = fileno($io);
+ exists $self->[1]{$fd} and exists $self->[0]{$fd}{$io}
+ ? $self->[1]{$fd} & ($self->[0]{$fd}{$io}|POLLHUP|POLLERR|POLLNVAL)
+ : 0;
+}
+
+sub remove {
+ my $self = shift;
+ my $io = shift;
+ $self->mask($io,0);
+}
+
+sub handles {
+ my $self = shift;
+ return values %{$self->[2]} unless @_;
+
+ my $events = shift || 0;
+ my($fd,$ev,$io,$mask);
+ my @handles = ();
+
+ while(($fd,$ev) = each %{$self->[1]}) {
+ while (($io,$mask) = each %{$self->[0]{$fd}}) {
+ $mask |= POLLHUP|POLLERR|POLLNVAL; # must allow these
+ push @handles,$self->[2]{$io} if ($ev & $mask) & $events;
+ }
+ }
+ return @handles;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Poll - Object interface to system poll call
+
+=head1 SYNOPSIS
+
+ use IO::Poll qw(POLLRDNORM POLLWRNORM POLLIN POLLHUP);
+
+ $poll = new IO::Poll;
+
+ $poll->mask($input_handle => POLLIN);
+ $poll->mask($output_handle => POLLOUT);
+
+ $poll->poll($timeout);
+
+ $ev = $poll->events($input);
+
+=head1 DESCRIPTION
+
+C<IO::Poll> is a simple interface to the system level poll routine.
+
+=head1 METHODS
+
+=over 4
+
+=item mask ( IO [, EVENT_MASK ] )
+
+If EVENT_MASK is given, then, if EVENT_MASK is non-zero, IO is added to the
+list of file descriptors and the next call to poll will check for
+any event specified in EVENT_MASK. If EVENT_MASK is zero then IO will be
+removed from the list of file descriptors.
+
+If EVENT_MASK is not given then the return value will be the current
+event mask value for IO.
+
+=item poll ( [ TIMEOUT ] )
+
+Call the system level poll routine. If TIMEOUT is not specified then the
+call will block. Returns the number of handles which had events
+happen, or -1 on error.
+
+=item events ( IO )
+
+Returns the event mask which represents the events that happened on IO
+during the last call to C<poll>.
+
+=item remove ( IO )
+
+Remove IO from the list of file descriptors for the next poll.
+
+=item handles( [ EVENT_MASK ] )
+
+Returns a list of handles. If EVENT_MASK is not given then a list of all
+handles known will be returned. If EVENT_MASK is given then a list
+of handles will be returned which had one of the events specified by
+EVENT_MASK happen during the last call ti C<poll>
+
+=back
+
+=head1 SEE ALSO
+
+L<poll(2)>, L<IO::Handle>, L<IO::Select>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Scalar.pm b/Master/tlpkg/tlperl.straw/lib/IO/Scalar.pm
new file mode 100755
index 00000000000..7a522821343
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Scalar.pm
@@ -0,0 +1,778 @@
+package IO::Scalar;
+
+
+=head1 NAME
+
+IO::Scalar - IO:: interface for reading/writing a scalar
+
+
+=head1 SYNOPSIS
+
+Perform I/O on strings, using the basic OO interface...
+
+ use 5.005;
+ use IO::Scalar;
+ $data = "My message:\n";
+
+ ### Open a handle on a string, and append to it:
+ $SH = new IO::Scalar \$data;
+ $SH->print("Hello");
+ $SH->print(", world!\nBye now!\n");
+ print "The string is now: ", $data, "\n";
+
+ ### Open a handle on a string, read it line-by-line, then close it:
+ $SH = new IO::Scalar \$data;
+ while (defined($_ = $SH->getline)) {
+ print "Got line: $_";
+ }
+ $SH->close;
+
+ ### Open a handle on a string, and slurp in all the lines:
+ $SH = new IO::Scalar \$data;
+ print "All lines:\n", $SH->getlines;
+
+ ### Get the current position (either of two ways):
+ $pos = $SH->getpos;
+ $offset = $SH->tell;
+
+ ### Set the current position (either of two ways):
+ $SH->setpos($pos);
+ $SH->seek($offset, 0);
+
+ ### Open an anonymous temporary scalar:
+ $SH = new IO::Scalar;
+ $SH->print("Hi there!");
+ print "I printed: ", ${$SH->sref}, "\n"; ### get at value
+
+
+Don't like OO for your I/O? No problem.
+Thanks to the magic of an invisible tie(), the following now
+works out of the box, just as it does with IO::Handle:
+
+ use 5.005;
+ use IO::Scalar;
+ $data = "My message:\n";
+
+ ### Open a handle on a string, and append to it:
+ $SH = new IO::Scalar \$data;
+ print $SH "Hello";
+ print $SH ", world!\nBye now!\n";
+ print "The string is now: ", $data, "\n";
+
+ ### Open a handle on a string, read it line-by-line, then close it:
+ $SH = new IO::Scalar \$data;
+ while (<$SH>) {
+ print "Got line: $_";
+ }
+ close $SH;
+
+ ### Open a handle on a string, and slurp in all the lines:
+ $SH = new IO::Scalar \$data;
+ print "All lines:\n", <$SH>;
+
+ ### Get the current position (WARNING: requires 5.6):
+ $offset = tell $SH;
+
+ ### Set the current position (WARNING: requires 5.6):
+ seek $SH, $offset, 0;
+
+ ### Open an anonymous temporary scalar:
+ $SH = new IO::Scalar;
+ print $SH "Hi there!";
+ print "I printed: ", ${$SH->sref}, "\n"; ### get at value
+
+
+And for you folks with 1.x code out there: the old tie() style still works,
+though this is I<unnecessary and deprecated>:
+
+ use IO::Scalar;
+
+ ### Writing to a scalar...
+ my $s;
+ tie *OUT, 'IO::Scalar', \$s;
+ print OUT "line 1\nline 2\n", "line 3\n";
+ print "String is now: $s\n"
+
+ ### Reading and writing an anonymous scalar...
+ tie *OUT, 'IO::Scalar';
+ print OUT "line 1\nline 2\n", "line 3\n";
+ tied(OUT)->seek(0,0);
+ while (<OUT>) {
+ print "Got line: ", $_;
+ }
+
+
+Stringification works, too!
+
+ my $SH = new IO::Scalar \$data;
+ print $SH "Hello, ";
+ print $SH "world!";
+ print "I printed: $SH\n";
+
+
+
+=head1 DESCRIPTION
+
+This class is part of the IO::Stringy distribution;
+see L<IO::Stringy> for change log and general information.
+
+The IO::Scalar class implements objects which behave just like
+IO::Handle (or FileHandle) objects, except that you may use them
+to write to (or read from) scalars. These handles are
+automatically tiehandle'd (though please see L<"WARNINGS">
+for information relevant to your Perl version).
+
+
+Basically, this:
+
+ my $s;
+ $SH = new IO::Scalar \$s;
+ $SH->print("Hel", "lo, "); ### OO style
+ $SH->print("world!\n"); ### ditto
+
+Or this:
+
+ my $s;
+ $SH = tie *OUT, 'IO::Scalar', \$s;
+ print OUT "Hel", "lo, "; ### non-OO style
+ print OUT "world!\n"; ### ditto
+
+Causes $s to be set to:
+
+ "Hello, world!\n"
+
+
+=head1 PUBLIC INTERFACE
+
+=cut
+
+use Carp;
+use strict;
+use vars qw($VERSION @ISA);
+use IO::Handle;
+
+use 5.005;
+
+### Stringification, courtesy of B. K. Oxley (binkley): :-)
+use overload '""' => sub { ${*{$_[0]}->{SR}} };
+use overload 'bool' => sub { 1 }; ### have to do this, so object is true!
+
+### The package version, both in 1.23 style *and* usable by MakeMaker:
+$VERSION = "2.110";
+
+### Inheritance:
+@ISA = qw(IO::Handle);
+
+### This stuff should be got rid of ASAP.
+require IO::WrapTie and push @ISA, 'IO::WrapTie::Slave' if ($] >= 5.004);
+
+#==============================
+
+=head2 Construction
+
+=over 4
+
+=cut
+
+#------------------------------
+
+=item new [ARGS...]
+
+I<Class method.>
+Return a new, unattached scalar handle.
+If any arguments are given, they're sent to open().
+
+=cut
+
+sub new {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = bless \do { local *FH }, $class;
+ tie *$self, $class, $self;
+ $self->open(@_); ### open on anonymous by default
+ $self;
+}
+sub DESTROY {
+ shift->close;
+}
+
+#------------------------------
+
+=item open [SCALARREF]
+
+I<Instance method.>
+Open the scalar handle on a new scalar, pointed to by SCALARREF.
+If no SCALARREF is given, a "private" scalar is created to hold
+the file data.
+
+Returns the self object on success, undefined on error.
+
+=cut
+
+sub open {
+ my ($self, $sref) = @_;
+
+ ### Sanity:
+ defined($sref) or do {my $s = ''; $sref = \$s};
+ (ref($sref) eq "SCALAR") or croak "open() needs a ref to a scalar";
+
+ ### Setup:
+ *$self->{Pos} = 0; ### seek position
+ *$self->{SR} = $sref; ### scalar reference
+ $self;
+}
+
+#------------------------------
+
+=item opened
+
+I<Instance method.>
+Is the scalar handle opened on something?
+
+=cut
+
+sub opened {
+ *{shift()}->{SR};
+}
+
+#------------------------------
+
+=item close
+
+I<Instance method.>
+Disassociate the scalar handle from its underlying scalar.
+Done automatically on destroy.
+
+=cut
+
+sub close {
+ my $self = shift;
+ %{*$self} = ();
+ 1;
+}
+
+=back
+
+=cut
+
+
+
+#==============================
+
+=head2 Input and output
+
+=over 4
+
+=cut
+
+
+#------------------------------
+
+=item flush
+
+I<Instance method.>
+No-op, provided for OO compatibility.
+
+=cut
+
+sub flush { "0 but true" }
+
+#------------------------------
+
+=item getc
+
+I<Instance method.>
+Return the next character, or undef if none remain.
+
+=cut
+
+sub getc {
+ my $self = shift;
+
+ ### Return undef right away if at EOF; else, move pos forward:
+ return undef if $self->eof;
+ substr(${*$self->{SR}}, *$self->{Pos}++, 1);
+}
+
+#------------------------------
+
+=item getline
+
+I<Instance method.>
+Return the next line, or undef on end of string.
+Can safely be called in an array context.
+Currently, lines are delimited by "\n".
+
+=cut
+
+sub getline {
+ my $self = shift;
+
+ ### Return undef right away if at EOF:
+ return undef if $self->eof;
+
+ ### Get next line:
+ my $sr = *$self->{SR};
+ my $i = *$self->{Pos}; ### Start matching at this point.
+
+ ### Minimal impact implementation!
+ ### We do the fast fast thing (no regexps) if using the
+ ### classic input record separator.
+
+ ### Case 1: $/ is undef: slurp all...
+ if (!defined($/)) {
+ *$self->{Pos} = length $$sr;
+ return substr($$sr, $i);
+ }
+
+ ### Case 2: $/ is "\n": zoom zoom zoom...
+ elsif ($/ eq "\012") {
+
+ ### Seek ahead for "\n"... yes, this really is faster than regexps.
+ my $len = length($$sr);
+ for (; $i < $len; ++$i) {
+ last if ord (substr ($$sr, $i, 1)) == 10;
+ }
+
+ ### Extract the line:
+ my $line;
+ if ($i < $len) { ### We found a "\n":
+ $line = substr ($$sr, *$self->{Pos}, $i - *$self->{Pos} + 1);
+ *$self->{Pos} = $i+1; ### Remember where we finished up.
+ }
+ else { ### No "\n"; slurp the remainder:
+ $line = substr ($$sr, *$self->{Pos}, $i - *$self->{Pos});
+ *$self->{Pos} = $len;
+ }
+ return $line;
+ }
+
+ ### Case 3: $/ is ref to int. Do fixed-size records.
+ ### (Thanks to Dominique Quatravaux.)
+ elsif (ref($/)) {
+ my $len = length($$sr);
+ my $i = ${$/} + 0;
+ my $line = substr ($$sr, *$self->{Pos}, $i);
+ *$self->{Pos} += $i;
+ *$self->{Pos} = $len if (*$self->{Pos} > $len);
+ return $line;
+ }
+
+ ### Case 4: $/ is either "" (paragraphs) or something weird...
+ ### This is Graham's general-purpose stuff, which might be
+ ### a tad slower than Case 2 for typical data, because
+ ### of the regexps.
+ else {
+ pos($$sr) = $i;
+
+ ### If in paragraph mode, skip leading lines (and update i!):
+ length($/) or
+ (($$sr =~ m/\G\n*/g) and ($i = pos($$sr)));
+
+ ### If we see the separator in the buffer ahead...
+ if (length($/)
+ ? $$sr =~ m,\Q$/\E,g ### (ordinary sep) TBD: precomp!
+ : $$sr =~ m,\n\n,g ### (a paragraph)
+ ) {
+ *$self->{Pos} = pos $$sr;
+ return substr($$sr, $i, *$self->{Pos}-$i);
+ }
+ ### Else if no separator remains, just slurp the rest:
+ else {
+ *$self->{Pos} = length $$sr;
+ return substr($$sr, $i);
+ }
+ }
+}
+
+#------------------------------
+
+=item getlines
+
+I<Instance method.>
+Get all remaining lines.
+It will croak() if accidentally called in a scalar context.
+
+=cut
+
+sub getlines {
+ my $self = shift;
+ wantarray or croak("can't call getlines in scalar context!");
+ my ($line, @lines);
+ push @lines, $line while (defined($line = $self->getline));
+ @lines;
+}
+
+#------------------------------
+
+=item print ARGS...
+
+I<Instance method.>
+Print ARGS to the underlying scalar.
+
+B<Warning:> this continues to always cause a seek to the end
+of the string, but if you perform seek()s and tell()s, it is
+still safer to explicitly seek-to-end before subsequent print()s.
+
+=cut
+
+sub print {
+ my $self = shift;
+ *$self->{Pos} = length(${*$self->{SR}} .= join('', @_) . (defined($\) ? $\ : ""));
+ 1;
+}
+sub _unsafe_print {
+ my $self = shift;
+ my $append = join('', @_) . $\;
+ ${*$self->{SR}} .= $append;
+ *$self->{Pos} += length($append);
+ 1;
+}
+sub _old_print {
+ my $self = shift;
+ ${*$self->{SR}} .= join('', @_) . $\;
+ *$self->{Pos} = length(${*$self->{SR}});
+ 1;
+}
+
+
+#------------------------------
+
+=item read BUF, NBYTES, [OFFSET]
+
+I<Instance method.>
+Read some bytes from the scalar.
+Returns the number of bytes actually read, 0 on end-of-file, undef on error.
+
+=cut
+
+sub read {
+ my $self = $_[0];
+ my $n = $_[2];
+ my $off = $_[3] || 0;
+
+ my $read = substr(${*$self->{SR}}, *$self->{Pos}, $n);
+ $n = length($read);
+ *$self->{Pos} += $n;
+ ($off ? substr($_[1], $off) : $_[1]) = $read;
+ return $n;
+}
+
+#------------------------------
+
+=item write BUF, NBYTES, [OFFSET]
+
+I<Instance method.>
+Write some bytes to the scalar.
+
+=cut
+
+sub write {
+ my $self = $_[0];
+ my $n = $_[2];
+ my $off = $_[3] || 0;
+
+ my $data = substr($_[1], $off, $n);
+ $n = length($data);
+ $self->print($data);
+ return $n;
+}
+
+#------------------------------
+
+=item sysread BUF, LEN, [OFFSET]
+
+I<Instance method.>
+Read some bytes from the scalar.
+Returns the number of bytes actually read, 0 on end-of-file, undef on error.
+
+=cut
+
+sub sysread {
+ my $self = shift;
+ $self->read(@_);
+}
+
+#------------------------------
+
+=item syswrite BUF, NBYTES, [OFFSET]
+
+I<Instance method.>
+Write some bytes to the scalar.
+
+=cut
+
+sub syswrite {
+ my $self = shift;
+ $self->write(@_);
+}
+
+=back
+
+=cut
+
+
+#==============================
+
+=head2 Seeking/telling and other attributes
+
+=over 4
+
+=cut
+
+
+#------------------------------
+
+=item autoflush
+
+I<Instance method.>
+No-op, provided for OO compatibility.
+
+=cut
+
+sub autoflush {}
+
+#------------------------------
+
+=item binmode
+
+I<Instance method.>
+No-op, provided for OO compatibility.
+
+=cut
+
+sub binmode {}
+
+#------------------------------
+
+=item clearerr
+
+I<Instance method.> Clear the error and EOF flags. A no-op.
+
+=cut
+
+sub clearerr { 1 }
+
+#------------------------------
+
+=item eof
+
+I<Instance method.> Are we at end of file?
+
+=cut
+
+sub eof {
+ my $self = shift;
+ (*$self->{Pos} >= length(${*$self->{SR}}));
+}
+
+#------------------------------
+
+=item seek OFFSET, WHENCE
+
+I<Instance method.> Seek to a given position in the stream.
+
+=cut
+
+sub seek {
+ my ($self, $pos, $whence) = @_;
+ my $eofpos = length(${*$self->{SR}});
+
+ ### Seek:
+ if ($whence == 0) { *$self->{Pos} = $pos } ### SEEK_SET
+ elsif ($whence == 1) { *$self->{Pos} += $pos } ### SEEK_CUR
+ elsif ($whence == 2) { *$self->{Pos} = $eofpos + $pos} ### SEEK_END
+ else { croak "bad seek whence ($whence)" }
+
+ ### Fixup:
+ if (*$self->{Pos} < 0) { *$self->{Pos} = 0 }
+ if (*$self->{Pos} > $eofpos) { *$self->{Pos} = $eofpos }
+ return 1;
+}
+
+#------------------------------
+
+=item sysseek OFFSET, WHENCE
+
+I<Instance method.> Identical to C<seek OFFSET, WHENCE>, I<q.v.>
+
+=cut
+
+sub sysseek {
+ my $self = shift;
+ $self->seek (@_);
+}
+
+#------------------------------
+
+=item tell
+
+I<Instance method.>
+Return the current position in the stream, as a numeric offset.
+
+=cut
+
+sub tell { *{shift()}->{Pos} }
+
+#------------------------------
+#
+# use_RS [YESNO]
+#
+# I<Instance method.>
+# Obey the curent setting of $/, like IO::Handle does?
+# Default is false in 1.x, but cold-welded true in 2.x and later.
+#
+sub use_RS {
+ my ($self, $yesno) = @_;
+ carp "use_RS is deprecated and ignored; \$/ is always consulted\n";
+ }
+
+#------------------------------
+
+=item setpos POS
+
+I<Instance method.>
+Set the current position, using the opaque value returned by C<getpos()>.
+
+=cut
+
+sub setpos { shift->seek($_[0],0) }
+
+#------------------------------
+
+=item getpos
+
+I<Instance method.>
+Return the current position in the string, as an opaque object.
+
+=cut
+
+*getpos = \&tell;
+
+
+#------------------------------
+
+=item sref
+
+I<Instance method.>
+Return a reference to the underlying scalar.
+
+=cut
+
+sub sref { *{shift()}->{SR} }
+
+
+#------------------------------
+# Tied handle methods...
+#------------------------------
+
+# Conventional tiehandle interface:
+sub TIEHANDLE {
+ ((defined($_[1]) && UNIVERSAL::isa($_[1], "IO::Scalar"))
+ ? $_[1]
+ : shift->new(@_));
+}
+sub GETC { shift->getc(@_) }
+sub PRINT { shift->print(@_) }
+sub PRINTF { shift->print(sprintf(shift, @_)) }
+sub READ { shift->read(@_) }
+sub READLINE { wantarray ? shift->getlines(@_) : shift->getline(@_) }
+sub WRITE { shift->write(@_); }
+sub CLOSE { shift->close(@_); }
+sub SEEK { shift->seek(@_); }
+sub TELL { shift->tell(@_); }
+sub EOF { shift->eof(@_); }
+
+#------------------------------------------------------------
+
+1;
+
+__END__
+
+
+
+=back
+
+=cut
+
+
+=head1 WARNINGS
+
+Perl's TIEHANDLE spec was incomplete prior to 5.005_57;
+it was missing support for C<seek()>, C<tell()>, and C<eof()>.
+Attempting to use these functions with an IO::Scalar will not work
+prior to 5.005_57. IO::Scalar will not have the relevant methods
+invoked; and even worse, this kind of bug can lie dormant for a while.
+If you turn warnings on (via C<$^W> or C<perl -w>),
+and you see something like this...
+
+ attempt to seek on unopened filehandle
+
+...then you are probably trying to use one of these functions
+on an IO::Scalar with an old Perl. The remedy is to simply
+use the OO version; e.g.:
+
+ $SH->seek(0,0); ### GOOD: will work on any 5.005
+ seek($SH,0,0); ### WARNING: will only work on 5.005_57 and beyond
+
+
+=head1 VERSION
+
+$Id: Scalar.pm,v 1.6 2005/02/10 21:21:53 dfs Exp $
+
+
+=head1 AUTHORS
+
+=head2 Primary Maintainer
+
+David F. Skoll (F<dfs@roaringpenguin.com>).
+
+=head2 Principal author
+
+Eryq (F<eryq@zeegee.com>).
+President, ZeeGee Software Inc (F<http://www.zeegee.com>).
+
+
+=head2 Other contributors
+
+The full set of contributors always includes the folks mentioned
+in L<IO::Stringy/"CHANGE LOG">. But just the same, special
+thanks to the following individuals for their invaluable contributions
+(if I've forgotten or misspelled your name, please email me!):
+
+I<Andy Glew,>
+for contributing C<getc()>.
+
+I<Brandon Browning,>
+for suggesting C<opened()>.
+
+I<David Richter,>
+for finding and fixing the bug in C<PRINTF()>.
+
+I<Eric L. Brine,>
+for his offset-using read() and write() implementations.
+
+I<Richard Jones,>
+for his patches to massively improve the performance of C<getline()>
+and add C<sysread> and C<syswrite>.
+
+I<B. K. Oxley (binkley),>
+for stringification and inheritance improvements,
+and sundry good ideas.
+
+I<Doug Wilson,>
+for the IO::Handle inheritance and automatic tie-ing.
+
+
+=head1 SEE ALSO
+
+L<IO::String>, which is quite similar but which was designed
+more-recently and with an IO::Handle-like interface in mind,
+so you could mix OO- and native-filehandle usage without using tied().
+
+I<Note:> as of version 2.x, these classes all work like
+their IO::Handle counterparts, so we have comparable
+functionality to IO::String.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/ScalarArray.pm b/Master/tlpkg/tlperl.straw/lib/IO/ScalarArray.pm
new file mode 100755
index 00000000000..8877ce60472
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/ScalarArray.pm
@@ -0,0 +1,791 @@
+package IO::ScalarArray;
+
+
+=head1 NAME
+
+IO::ScalarArray - IO:: interface for reading/writing an array of scalars
+
+
+=head1 SYNOPSIS
+
+Perform I/O on strings, using the basic OO interface...
+
+ use IO::ScalarArray;
+ @data = ("My mes", "sage:\n");
+
+ ### Open a handle on an array, and append to it:
+ $AH = new IO::ScalarArray \@data;
+ $AH->print("Hello");
+ $AH->print(", world!\nBye now!\n");
+ print "The array is now: ", @data, "\n";
+
+ ### Open a handle on an array, read it line-by-line, then close it:
+ $AH = new IO::ScalarArray \@data;
+ while (defined($_ = $AH->getline)) {
+ print "Got line: $_";
+ }
+ $AH->close;
+
+ ### Open a handle on an array, and slurp in all the lines:
+ $AH = new IO::ScalarArray \@data;
+ print "All lines:\n", $AH->getlines;
+
+ ### Get the current position (either of two ways):
+ $pos = $AH->getpos;
+ $offset = $AH->tell;
+
+ ### Set the current position (either of two ways):
+ $AH->setpos($pos);
+ $AH->seek($offset, 0);
+
+ ### Open an anonymous temporary array:
+ $AH = new IO::ScalarArray;
+ $AH->print("Hi there!");
+ print "I printed: ", @{$AH->aref}, "\n"; ### get at value
+
+
+Don't like OO for your I/O? No problem.
+Thanks to the magic of an invisible tie(), the following now
+works out of the box, just as it does with IO::Handle:
+
+ use IO::ScalarArray;
+ @data = ("My mes", "sage:\n");
+
+ ### Open a handle on an array, and append to it:
+ $AH = new IO::ScalarArray \@data;
+ print $AH "Hello";
+ print $AH ", world!\nBye now!\n";
+ print "The array is now: ", @data, "\n";
+
+ ### Open a handle on a string, read it line-by-line, then close it:
+ $AH = new IO::ScalarArray \@data;
+ while (<$AH>) {
+ print "Got line: $_";
+ }
+ close $AH;
+
+ ### Open a handle on a string, and slurp in all the lines:
+ $AH = new IO::ScalarArray \@data;
+ print "All lines:\n", <$AH>;
+
+ ### Get the current position (WARNING: requires 5.6):
+ $offset = tell $AH;
+
+ ### Set the current position (WARNING: requires 5.6):
+ seek $AH, $offset, 0;
+
+ ### Open an anonymous temporary scalar:
+ $AH = new IO::ScalarArray;
+ print $AH "Hi there!";
+ print "I printed: ", @{$AH->aref}, "\n"; ### get at value
+
+
+And for you folks with 1.x code out there: the old tie() style still works,
+though this is I<unnecessary and deprecated>:
+
+ use IO::ScalarArray;
+
+ ### Writing to a scalar...
+ my @a;
+ tie *OUT, 'IO::ScalarArray', \@a;
+ print OUT "line 1\nline 2\n", "line 3\n";
+ print "Array is now: ", @a, "\n"
+
+ ### Reading and writing an anonymous scalar...
+ tie *OUT, 'IO::ScalarArray';
+ print OUT "line 1\nline 2\n", "line 3\n";
+ tied(OUT)->seek(0,0);
+ while (<OUT>) {
+ print "Got line: ", $_;
+ }
+
+
+
+=head1 DESCRIPTION
+
+This class is part of the IO::Stringy distribution;
+see L<IO::Stringy> for change log and general information.
+
+The IO::ScalarArray class implements objects which behave just like
+IO::Handle (or FileHandle) objects, except that you may use them
+to write to (or read from) arrays of scalars. Logically, an
+array of scalars defines an in-core "file" whose contents are
+the concatenation of the scalars in the array. The handles created by
+this class are automatically tiehandle'd (though please see L<"WARNINGS">
+for information relevant to your Perl version).
+
+For writing large amounts of data with individual print() statements,
+this class is likely to be more efficient than IO::Scalar.
+
+Basically, this:
+
+ my @a;
+ $AH = new IO::ScalarArray \@a;
+ $AH->print("Hel", "lo, "); ### OO style
+ $AH->print("world!\n"); ### ditto
+
+Or this:
+
+ my @a;
+ $AH = new IO::ScalarArray \@a;
+ print $AH "Hel", "lo, "; ### non-OO style
+ print $AH "world!\n"; ### ditto
+
+Causes @a to be set to the following array of 3 strings:
+
+ ( "Hel" ,
+ "lo, " ,
+ "world!\n" )
+
+See L<IO::Scalar> and compare with this class.
+
+
+=head1 PUBLIC INTERFACE
+
+=cut
+
+use Carp;
+use strict;
+use vars qw($VERSION @ISA);
+use IO::Handle;
+
+# The package version, both in 1.23 style *and* usable by MakeMaker:
+$VERSION = "2.110";
+
+# Inheritance:
+@ISA = qw(IO::Handle);
+require IO::WrapTie and push @ISA, 'IO::WrapTie::Slave' if ($] >= 5.004);
+
+
+#==============================
+
+=head2 Construction
+
+=over 4
+
+=cut
+
+#------------------------------
+
+=item new [ARGS...]
+
+I<Class method.>
+Return a new, unattached array handle.
+If any arguments are given, they're sent to open().
+
+=cut
+
+sub new {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = bless \do { local *FH }, $class;
+ tie *$self, $class, $self;
+ $self->open(@_); ### open on anonymous by default
+ $self;
+}
+sub DESTROY {
+ shift->close;
+}
+
+
+#------------------------------
+
+=item open [ARRAYREF]
+
+I<Instance method.>
+Open the array handle on a new array, pointed to by ARRAYREF.
+If no ARRAYREF is given, a "private" array is created to hold
+the file data.
+
+Returns the self object on success, undefined on error.
+
+=cut
+
+sub open {
+ my ($self, $aref) = @_;
+
+ ### Sanity:
+ defined($aref) or do {my @a; $aref = \@a};
+ (ref($aref) eq "ARRAY") or croak "open needs a ref to a array";
+
+ ### Setup:
+ $self->setpos([0,0]);
+ *$self->{AR} = $aref;
+ $self;
+}
+
+#------------------------------
+
+=item opened
+
+I<Instance method.>
+Is the array handle opened on something?
+
+=cut
+
+sub opened {
+ *{shift()}->{AR};
+}
+
+#------------------------------
+
+=item close
+
+I<Instance method.>
+Disassociate the array handle from its underlying array.
+Done automatically on destroy.
+
+=cut
+
+sub close {
+ my $self = shift;
+ %{*$self} = ();
+ 1;
+}
+
+=back
+
+=cut
+
+
+
+#==============================
+
+=head2 Input and output
+
+=over 4
+
+=cut
+
+#------------------------------
+
+=item flush
+
+I<Instance method.>
+No-op, provided for OO compatibility.
+
+=cut
+
+sub flush { "0 but true" }
+
+#------------------------------
+
+=item getc
+
+I<Instance method.>
+Return the next character, or undef if none remain.
+This does a read(1), which is somewhat costly.
+
+=cut
+
+sub getc {
+ my $buf = '';
+ ($_[0]->read($buf, 1) ? $buf : undef);
+}
+
+#------------------------------
+
+=item getline
+
+I<Instance method.>
+Return the next line, or undef on end of data.
+Can safely be called in an array context.
+Currently, lines are delimited by "\n".
+
+=cut
+
+sub getline {
+ my $self = shift;
+ my ($str, $line) = (undef, '');
+
+
+ ### Minimal impact implementation!
+ ### We do the fast fast thing (no regexps) if using the
+ ### classic input record separator.
+
+ ### Case 1: $/ is undef: slurp all...
+ if (!defined($/)) {
+
+ return undef if ($self->eof);
+
+ ### Get the rest of the current string, followed by remaining strings:
+ my $ar = *$self->{AR};
+ my @slurp = (
+ substr($ar->[*$self->{Str}], *$self->{Pos}),
+ @$ar[(1 + *$self->{Str}) .. $#$ar ]
+ );
+
+ ### Seek to end:
+ $self->_setpos_to_eof;
+ return join('', @slurp);
+ }
+
+ ### Case 2: $/ is "\n":
+ elsif ($/ eq "\012") {
+
+ ### Until we hit EOF (or exitted because of a found line):
+ until ($self->eof) {
+ ### If at end of current string, go fwd to next one (won't be EOF):
+ if ($self->_eos) {++*$self->{Str}, *$self->{Pos}=0};
+
+ ### Get ref to current string in array, and set internal pos mark:
+ $str = \(*$self->{AR}[*$self->{Str}]); ### get current string
+ pos($$str) = *$self->{Pos}; ### start matching from here
+
+ ### Get from here to either \n or end of string, and add to line:
+ $$str =~ m/\G(.*?)((\n)|\Z)/g; ### match to 1st \n or EOS
+ $line .= $1.$2; ### add it
+ *$self->{Pos} += length($1.$2); ### move fwd by len matched
+ return $line if $3; ### done, got line with "\n"
+ }
+ return ($line eq '') ? undef : $line; ### return undef if EOF
+ }
+
+ ### Case 3: $/ is ref to int. Bail out.
+ elsif (ref($/)) {
+ croak '$/ given as a ref to int; currently unsupported';
+ }
+
+ ### Case 4: $/ is either "" (paragraphs) or something weird...
+ ### Bail for now.
+ else {
+ croak '$/ as given is currently unsupported';
+ }
+}
+
+#------------------------------
+
+=item getlines
+
+I<Instance method.>
+Get all remaining lines.
+It will croak() if accidentally called in a scalar context.
+
+=cut
+
+sub getlines {
+ my $self = shift;
+ wantarray or croak("can't call getlines in scalar context!");
+ my ($line, @lines);
+ push @lines, $line while (defined($line = $self->getline));
+ @lines;
+}
+
+#------------------------------
+
+=item print ARGS...
+
+I<Instance method.>
+Print ARGS to the underlying array.
+
+Currently, this always causes a "seek to the end of the array"
+and generates a new array entry. This may change in the future.
+
+=cut
+
+sub print {
+ my $self = shift;
+ push @{*$self->{AR}}, join('', @_) . (defined($\) ? $\ : ""); ### add the data
+ $self->_setpos_to_eof;
+ 1;
+}
+
+#------------------------------
+
+=item read BUF, NBYTES, [OFFSET];
+
+I<Instance method.>
+Read some bytes from the array.
+Returns the number of bytes actually read, 0 on end-of-file, undef on error.
+
+=cut
+
+sub read {
+ my $self = $_[0];
+ ### we must use $_[1] as a ref
+ my $n = $_[2];
+ my $off = $_[3] || 0;
+
+ ### print "getline\n";
+ my $justread;
+ my $len;
+ ($off ? substr($_[1], $off) : $_[1]) = '';
+
+ ### Stop when we have zero bytes to go, or when we hit EOF:
+ my @got;
+ until (!$n or $self->eof) {
+ ### If at end of current string, go forward to next one (won't be EOF):
+ if ($self->_eos) {
+ ++*$self->{Str};
+ *$self->{Pos} = 0;
+ }
+
+ ### Get longest possible desired substring of current string:
+ $justread = substr(*$self->{AR}[*$self->{Str}], *$self->{Pos}, $n);
+ $len = length($justread);
+ push @got, $justread;
+ $n -= $len;
+ *$self->{Pos} += $len;
+ }
+ $_[1] .= join('', @got);
+ return length($_[1])-$off;
+}
+
+#------------------------------
+
+=item write BUF, NBYTES, [OFFSET];
+
+I<Instance method.>
+Write some bytes into the array.
+
+=cut
+
+sub write {
+ my $self = $_[0];
+ my $n = $_[2];
+ my $off = $_[3] || 0;
+
+ my $data = substr($_[1], $n, $off);
+ $n = length($data);
+ $self->print($data);
+ return $n;
+}
+
+
+=back
+
+=cut
+
+
+
+#==============================
+
+=head2 Seeking/telling and other attributes
+
+=over 4
+
+=cut
+
+#------------------------------
+
+=item autoflush
+
+I<Instance method.>
+No-op, provided for OO compatibility.
+
+=cut
+
+sub autoflush {}
+
+#------------------------------
+
+=item binmode
+
+I<Instance method.>
+No-op, provided for OO compatibility.
+
+=cut
+
+sub binmode {}
+
+#------------------------------
+
+=item clearerr
+
+I<Instance method.> Clear the error and EOF flags. A no-op.
+
+=cut
+
+sub clearerr { 1 }
+
+#------------------------------
+
+=item eof
+
+I<Instance method.> Are we at end of file?
+
+=cut
+
+sub eof {
+ ### print "checking EOF [*$self->{Str}, *$self->{Pos}]\n";
+ ### print "SR = ", $#{*$self->{AR}}, "\n";
+
+ return 0 if (*{$_[0]}->{Str} < $#{*{$_[0]}->{AR}}); ### before EOA
+ return 1 if (*{$_[0]}->{Str} > $#{*{$_[0]}->{AR}}); ### after EOA
+ ### ### at EOA, past EOS:
+ ((*{$_[0]}->{Str} == $#{*{$_[0]}->{AR}}) && ($_[0]->_eos));
+}
+
+#------------------------------
+#
+# _eos
+#
+# I<Instance method, private.> Are we at end of the CURRENT string?
+#
+sub _eos {
+ (*{$_[0]}->{Pos} >= length(*{$_[0]}->{AR}[*{$_[0]}->{Str}])); ### past last char
+}
+
+#------------------------------
+
+=item seek POS,WHENCE
+
+I<Instance method.>
+Seek to a given position in the stream.
+Only a WHENCE of 0 (SEEK_SET) is supported.
+
+=cut
+
+sub seek {
+ my ($self, $pos, $whence) = @_;
+
+ ### Seek:
+ if ($whence == 0) { $self->_seek_set($pos); }
+ elsif ($whence == 1) { $self->_seek_cur($pos); }
+ elsif ($whence == 2) { $self->_seek_end($pos); }
+ else { croak "bad seek whence ($whence)" }
+ return 1;
+}
+
+#------------------------------
+#
+# _seek_set POS
+#
+# Instance method, private.
+# Seek to $pos relative to start:
+#
+sub _seek_set {
+ my ($self, $pos) = @_;
+
+ ### Advance through array until done:
+ my $istr = 0;
+ while (($pos >= 0) && ($istr < scalar(@{*$self->{AR}}))) {
+ if (length(*$self->{AR}[$istr]) > $pos) { ### it's in this string!
+ return $self->setpos([$istr, $pos]);
+ }
+ else { ### it's in next string
+ $pos -= length(*$self->{AR}[$istr++]); ### move forward one string
+ }
+ }
+ ### If we reached this point, pos is at or past end; zoom to EOF:
+ return $self->_setpos_to_eof;
+}
+
+#------------------------------
+#
+# _seek_cur POS
+#
+# Instance method, private.
+# Seek to $pos relative to current position.
+#
+sub _seek_cur {
+ my ($self, $pos) = @_;
+ $self->_seek_set($self->tell + $pos);
+}
+
+#------------------------------
+#
+# _seek_end POS
+#
+# Instance method, private.
+# Seek to $pos relative to end.
+# We actually seek relative to beginning, which is simple.
+#
+sub _seek_end {
+ my ($self, $pos) = @_;
+ $self->_seek_set($self->_tell_eof + $pos);
+}
+
+#------------------------------
+
+=item tell
+
+I<Instance method.>
+Return the current position in the stream, as a numeric offset.
+
+=cut
+
+sub tell {
+ my $self = shift;
+ my $off = 0;
+ my ($s, $str_s);
+ for ($s = 0; $s < *$self->{Str}; $s++) { ### count all "whole" scalars
+ defined($str_s = *$self->{AR}[$s]) or $str_s = '';
+ ###print STDERR "COUNTING STRING $s (". length($str_s) . ")\n";
+ $off += length($str_s);
+ }
+ ###print STDERR "COUNTING POS ($self->{Pos})\n";
+ return ($off += *$self->{Pos}); ### plus the final, partial one
+}
+
+#------------------------------
+#
+# _tell_eof
+#
+# Instance method, private.
+# Get position of EOF, as a numeric offset.
+# This is identical to the size of the stream - 1.
+#
+sub _tell_eof {
+ my $self = shift;
+ my $len = 0;
+ foreach (@{*$self->{AR}}) { $len += length($_) }
+ $len;
+}
+
+#------------------------------
+
+=item setpos POS
+
+I<Instance method.>
+Seek to a given position in the array, using the opaque getpos() value.
+Don't expect this to be a number.
+
+=cut
+
+sub setpos {
+ my ($self, $pos) = @_;
+ (ref($pos) eq 'ARRAY') or
+ die "setpos: only use a value returned by getpos!\n";
+ (*$self->{Str}, *$self->{Pos}) = @$pos;
+}
+
+#------------------------------
+#
+# _setpos_to_eof
+#
+# Fast-forward to EOF.
+#
+sub _setpos_to_eof {
+ my $self = shift;
+ $self->setpos([scalar(@{*$self->{AR}}), 0]);
+}
+
+#------------------------------
+
+=item getpos
+
+I<Instance method.>
+Return the current position in the array, as an opaque value.
+Don't expect this to be a number.
+
+=cut
+
+sub getpos {
+ [*{$_[0]}->{Str}, *{$_[0]}->{Pos}];
+}
+
+#------------------------------
+
+=item aref
+
+I<Instance method.>
+Return a reference to the underlying array.
+
+=cut
+
+sub aref {
+ *{shift()}->{AR};
+}
+
+=back
+
+=cut
+
+#------------------------------
+# Tied handle methods...
+#------------------------------
+
+### Conventional tiehandle interface:
+sub TIEHANDLE { (defined($_[1]) && UNIVERSAL::isa($_[1],"IO::ScalarArray"))
+ ? $_[1]
+ : shift->new(@_) }
+sub GETC { shift->getc(@_) }
+sub PRINT { shift->print(@_) }
+sub PRINTF { shift->print(sprintf(shift, @_)) }
+sub READ { shift->read(@_) }
+sub READLINE { wantarray ? shift->getlines(@_) : shift->getline(@_) }
+sub WRITE { shift->write(@_); }
+sub CLOSE { shift->close(@_); }
+sub SEEK { shift->seek(@_); }
+sub TELL { shift->tell(@_); }
+sub EOF { shift->eof(@_); }
+
+#------------------------------------------------------------
+
+1;
+__END__
+
+# SOME PRIVATE NOTES:
+#
+# * The "current position" is the position before the next
+# character to be read/written.
+#
+# * Str gives the string index of the current position, 0-based
+#
+# * Pos gives the offset within AR[Str], 0-based.
+#
+# * Inital pos is [0,0]. After print("Hello"), it is [1,0].
+
+
+
+=head1 WARNINGS
+
+Perl's TIEHANDLE spec was incomplete prior to 5.005_57;
+it was missing support for C<seek()>, C<tell()>, and C<eof()>.
+Attempting to use these functions with an IO::ScalarArray will not work
+prior to 5.005_57. IO::ScalarArray will not have the relevant methods
+invoked; and even worse, this kind of bug can lie dormant for a while.
+If you turn warnings on (via C<$^W> or C<perl -w>),
+and you see something like this...
+
+ attempt to seek on unopened filehandle
+
+...then you are probably trying to use one of these functions
+on an IO::ScalarArray with an old Perl. The remedy is to simply
+use the OO version; e.g.:
+
+ $AH->seek(0,0); ### GOOD: will work on any 5.005
+ seek($AH,0,0); ### WARNING: will only work on 5.005_57 and beyond
+
+
+
+=head1 VERSION
+
+$Id: ScalarArray.pm,v 1.7 2005/02/10 21:21:53 dfs Exp $
+
+
+=head1 AUTHOR
+
+=head2 Primary Maintainer
+
+David F. Skoll (F<dfs@roaringpenguin.com>).
+
+=head2 Principal author
+
+Eryq (F<eryq@zeegee.com>).
+President, ZeeGee Software Inc (F<http://www.zeegee.com>).
+
+
+=head2 Other contributors
+
+Thanks to the following individuals for their invaluable contributions
+(if I've forgotten or misspelled your name, please email me!):
+
+I<Andy Glew,>
+for suggesting C<getc()>.
+
+I<Brandon Browning,>
+for suggesting C<opened()>.
+
+I<Eric L. Brine,>
+for his offset-using read() and write() implementations.
+
+I<Doug Wilson,>
+for the IO::Handle inheritance and automatic tie-ing.
+
+=cut
+
+#------------------------------
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Seekable.pm b/Master/tlpkg/tlperl.straw/lib/IO/Seekable.pm
new file mode 100755
index 00000000000..db1effda287
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Seekable.pm
@@ -0,0 +1,128 @@
+#
+
+package IO::Seekable;
+
+=head1 NAME
+
+IO::Seekable - supply seek based methods for I/O objects
+
+=head1 SYNOPSIS
+
+ use IO::Seekable;
+ package IO::Something;
+ @ISA = qw(IO::Seekable);
+
+=head1 DESCRIPTION
+
+C<IO::Seekable> does not have a constructor of its own as it is intended to
+be inherited by other C<IO::Handle> based objects. It provides methods
+which allow seeking of the file descriptors.
+
+=over 4
+
+=item $io->getpos
+
+Returns an opaque value that represents the current position of the
+IO::File, or C<undef> if this is not possible (eg an unseekable stream such
+as a terminal, pipe or socket). If the fgetpos() function is available in
+your C library it is used to implements getpos, else perl emulates getpos
+using C's ftell() function.
+
+=item $io->setpos
+
+Uses the value of a previous getpos call to return to a previously visited
+position. Returns "0 but true" on success, C<undef> on failure.
+
+=back
+
+See L<perlfunc> for complete descriptions of each of the following
+supported C<IO::Seekable> methods, which are just front ends for the
+corresponding built-in functions:
+
+=over 4
+
+=item $io->seek ( POS, WHENCE )
+
+Seek the IO::File to position POS, relative to WHENCE:
+
+=over 8
+
+=item WHENCE=0 (SEEK_SET)
+
+POS is absolute position. (Seek relative to the start of the file)
+
+=item WHENCE=1 (SEEK_CUR)
+
+POS is an offset from the current position. (Seek relative to current)
+
+=item WHENCE=2 (SEEK_END)
+
+POS is an offset from the end of the file. (Seek relative to end)
+
+=back
+
+The SEEK_* constants can be imported from the C<Fcntl> module if you
+don't wish to use the numbers C<0> C<1> or C<2> in your code.
+
+Returns C<1> upon success, C<0> otherwise.
+
+=item $io->sysseek( POS, WHENCE )
+
+Similar to $io->seek, but sets the IO::File's position using the system
+call lseek(2) directly, so will confuse most perl IO operators except
+sysread and syswrite (see L<perlfunc> for full details)
+
+Returns the new position, or C<undef> on failure. A position
+of zero is returned as the string C<"0 but true">
+
+=item $io->tell
+
+Returns the IO::File's current position, or -1 on error.
+
+=back
+
+=head1 SEE ALSO
+
+L<perlfunc>,
+L<perlop/"I/O Operators">,
+L<IO::Handle>
+L<IO::File>
+
+=head1 HISTORY
+
+Derived from FileHandle.pm by Graham Barr E<lt>gbarr@pobox.comE<gt>
+
+=cut
+
+use 5.006_001;
+use Carp;
+use strict;
+our($VERSION, @EXPORT, @ISA);
+use IO::Handle ();
+# XXX we can't get these from IO::Handle or we'll get prototype
+# mismatch warnings on C<use POSIX; use IO::File;> :-(
+use Fcntl qw(SEEK_SET SEEK_CUR SEEK_END);
+require Exporter;
+
+@EXPORT = qw(SEEK_SET SEEK_CUR SEEK_END);
+@ISA = qw(Exporter);
+
+$VERSION = "1.10";
+$VERSION = eval $VERSION;
+
+sub seek {
+ @_ == 3 or croak 'usage: $io->seek(POS, WHENCE)';
+ seek($_[0], $_[1], $_[2]);
+}
+
+sub sysseek {
+ @_ == 3 or croak 'usage: $io->sysseek(POS, WHENCE)';
+ sysseek($_[0], $_[1], $_[2]);
+}
+
+sub tell {
+ @_ == 1 or croak 'usage: $io->tell()';
+ tell($_[0]);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Select.pm b/Master/tlpkg/tlperl.straw/lib/IO/Select.pm
new file mode 100755
index 00000000000..fc05fe70e9c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Select.pm
@@ -0,0 +1,381 @@
+# IO::Select.pm
+#
+# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package IO::Select;
+
+use strict;
+use warnings::register;
+use vars qw($VERSION @ISA);
+require Exporter;
+
+$VERSION = "1.17";
+
+@ISA = qw(Exporter); # This is only so we can do version checking
+
+sub VEC_BITS () {0}
+sub FD_COUNT () {1}
+sub FIRST_FD () {2}
+
+sub new
+{
+ my $self = shift;
+ my $type = ref($self) || $self;
+
+ my $vec = bless [undef,0], $type;
+
+ $vec->add(@_)
+ if @_;
+
+ $vec;
+}
+
+sub add
+{
+ shift->_update('add', @_);
+}
+
+
+sub remove
+{
+ shift->_update('remove', @_);
+}
+
+
+sub exists
+{
+ my $vec = shift;
+ my $fno = $vec->_fileno(shift);
+ return undef unless defined $fno;
+ $vec->[$fno + FIRST_FD];
+}
+
+
+sub _fileno
+{
+ my($self, $f) = @_;
+ return unless defined $f;
+ $f = $f->[0] if ref($f) eq 'ARRAY';
+ ($f =~ /^\d+$/) ? $f : fileno($f);
+}
+
+sub _update
+{
+ my $vec = shift;
+ my $add = shift eq 'add';
+
+ my $bits = $vec->[VEC_BITS];
+ $bits = '' unless defined $bits;
+
+ my $count = 0;
+ my $f;
+ foreach $f (@_)
+ {
+ my $fn = $vec->_fileno($f);
+ next unless defined $fn;
+ my $i = $fn + FIRST_FD;
+ if ($add) {
+ if (defined $vec->[$i]) {
+ $vec->[$i] = $f; # if array rest might be different, so we update
+ next;
+ }
+ $vec->[FD_COUNT]++;
+ vec($bits, $fn, 1) = 1;
+ $vec->[$i] = $f;
+ } else { # remove
+ next unless defined $vec->[$i];
+ $vec->[FD_COUNT]--;
+ vec($bits, $fn, 1) = 0;
+ $vec->[$i] = undef;
+ }
+ $count++;
+ }
+ $vec->[VEC_BITS] = $vec->[FD_COUNT] ? $bits : undef;
+ $count;
+}
+
+sub can_read
+{
+ my $vec = shift;
+ my $timeout = shift;
+ my $r = $vec->[VEC_BITS];
+
+ defined($r) && (select($r,undef,undef,$timeout) > 0)
+ ? handles($vec, $r)
+ : ();
+}
+
+sub can_write
+{
+ my $vec = shift;
+ my $timeout = shift;
+ my $w = $vec->[VEC_BITS];
+
+ defined($w) && (select(undef,$w,undef,$timeout) > 0)
+ ? handles($vec, $w)
+ : ();
+}
+
+sub has_exception
+{
+ my $vec = shift;
+ my $timeout = shift;
+ my $e = $vec->[VEC_BITS];
+
+ defined($e) && (select(undef,undef,$e,$timeout) > 0)
+ ? handles($vec, $e)
+ : ();
+}
+
+sub has_error
+{
+ warnings::warn("Call to deprecated method 'has_error', use 'has_exception'")
+ if warnings::enabled();
+ goto &has_exception;
+}
+
+sub count
+{
+ my $vec = shift;
+ $vec->[FD_COUNT];
+}
+
+sub bits
+{
+ my $vec = shift;
+ $vec->[VEC_BITS];
+}
+
+sub as_string # for debugging
+{
+ my $vec = shift;
+ my $str = ref($vec) . ": ";
+ my $bits = $vec->bits;
+ my $count = $vec->count;
+ $str .= defined($bits) ? unpack("b*", $bits) : "undef";
+ $str .= " $count";
+ my @handles = @$vec;
+ splice(@handles, 0, FIRST_FD);
+ for (@handles) {
+ $str .= " " . (defined($_) ? "$_" : "-");
+ }
+ $str;
+}
+
+sub _max
+{
+ my($a,$b,$c) = @_;
+ $a > $b
+ ? $a > $c
+ ? $a
+ : $c
+ : $b > $c
+ ? $b
+ : $c;
+}
+
+sub select
+{
+ shift
+ if defined $_[0] && !ref($_[0]);
+
+ my($r,$w,$e,$t) = @_;
+ my @result = ();
+
+ my $rb = defined $r ? $r->[VEC_BITS] : undef;
+ my $wb = defined $w ? $w->[VEC_BITS] : undef;
+ my $eb = defined $e ? $e->[VEC_BITS] : undef;
+
+ if(select($rb,$wb,$eb,$t) > 0)
+ {
+ my @r = ();
+ my @w = ();
+ my @e = ();
+ my $i = _max(defined $r ? scalar(@$r)-1 : 0,
+ defined $w ? scalar(@$w)-1 : 0,
+ defined $e ? scalar(@$e)-1 : 0);
+
+ for( ; $i >= FIRST_FD ; $i--)
+ {
+ my $j = $i - FIRST_FD;
+ push(@r, $r->[$i])
+ if defined $rb && defined $r->[$i] && vec($rb, $j, 1);
+ push(@w, $w->[$i])
+ if defined $wb && defined $w->[$i] && vec($wb, $j, 1);
+ push(@e, $e->[$i])
+ if defined $eb && defined $e->[$i] && vec($eb, $j, 1);
+ }
+
+ @result = (\@r, \@w, \@e);
+ }
+ @result;
+}
+
+
+sub handles
+{
+ my $vec = shift;
+ my $bits = shift;
+ my @h = ();
+ my $i;
+ my $max = scalar(@$vec) - 1;
+
+ for ($i = FIRST_FD; $i <= $max; $i++)
+ {
+ next unless defined $vec->[$i];
+ push(@h, $vec->[$i])
+ if !defined($bits) || vec($bits, $i - FIRST_FD, 1);
+ }
+
+ @h;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+IO::Select - OO interface to the select system call
+
+=head1 SYNOPSIS
+
+ use IO::Select;
+
+ $s = IO::Select->new();
+
+ $s->add(\*STDIN);
+ $s->add($some_handle);
+
+ @ready = $s->can_read($timeout);
+
+ @ready = IO::Select->new(@handles)->can_read(0);
+
+=head1 DESCRIPTION
+
+The C<IO::Select> package implements an object approach to the system C<select>
+function call. It allows the user to see what IO handles, see L<IO::Handle>,
+are ready for reading, writing or have an exception pending.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ HANDLES ] )
+
+The constructor creates a new object and optionally initialises it with a set
+of handles.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item add ( HANDLES )
+
+Add the list of handles to the C<IO::Select> object. It is these values that
+will be returned when an event occurs. C<IO::Select> keeps these values in a
+cache which is indexed by the C<fileno> of the handle, so if more than one
+handle with the same C<fileno> is specified then only the last one is cached.
+
+Each handle can be an C<IO::Handle> object, an integer or an array
+reference where the first element is an C<IO::Handle> or an integer.
+
+=item remove ( HANDLES )
+
+Remove all the given handles from the object. This method also works
+by the C<fileno> of the handles. So the exact handles that were added
+need not be passed, just handles that have an equivalent C<fileno>
+
+=item exists ( HANDLE )
+
+Returns a true value (actually the handle itself) if it is present.
+Returns undef otherwise.
+
+=item handles
+
+Return an array of all registered handles.
+
+=item can_read ( [ TIMEOUT ] )
+
+Return an array of handles that are ready for reading. C<TIMEOUT> is
+the maximum amount of time to wait before returning an empty list, in
+seconds, possibly fractional. If C<TIMEOUT> is not given and any
+handles are registered then the call will block.
+
+=item can_write ( [ TIMEOUT ] )
+
+Same as C<can_read> except check for handles that can be written to.
+
+=item has_exception ( [ TIMEOUT ] )
+
+Same as C<can_read> except check for handles that have an exception
+condition, for example pending out-of-band data.
+
+=item count ()
+
+Returns the number of handles that the object will check for when
+one of the C<can_> methods is called or the object is passed to
+the C<select> static method.
+
+=item bits()
+
+Return the bit string suitable as argument to the core select() call.
+
+=item select ( READ, WRITE, EXCEPTION [, TIMEOUT ] )
+
+C<select> is a static method, that is you call it with the package name
+like C<new>. C<READ>, C<WRITE> and C<EXCEPTION> are either C<undef> or
+C<IO::Select> objects. C<TIMEOUT> is optional and has the same effect as
+for the core select call.
+
+The result will be an array of 3 elements, each a reference to an array
+which will hold the handles that are ready for reading, writing and have
+exceptions respectively. Upon error an empty list is returned.
+
+=back
+
+=head1 EXAMPLE
+
+Here is a short example which shows how C<IO::Select> could be used
+to write a server which communicates with several sockets while also
+listening for more connections on a listen socket
+
+ use IO::Select;
+ use IO::Socket;
+
+ $lsn = new IO::Socket::INET(Listen => 1, LocalPort => 8080);
+ $sel = new IO::Select( $lsn );
+
+ while(@ready = $sel->can_read) {
+ foreach $fh (@ready) {
+ if($fh == $lsn) {
+ # Create a new socket
+ $new = $lsn->accept;
+ $sel->add($new);
+ }
+ else {
+ # Process socket
+
+ # Maybe we have finished with the socket
+ $sel->remove($fh);
+ $fh->close;
+ }
+ }
+ }
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Socket.pm b/Master/tlpkg/tlperl.straw/lib/IO/Socket.pm
new file mode 100755
index 00000000000..2ef05a72fa7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Socket.pm
@@ -0,0 +1,529 @@
+# IO::Socket.pm
+#
+# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package IO::Socket;
+
+require 5.006;
+
+use IO::Handle;
+use Socket 1.3;
+use Carp;
+use strict;
+our(@ISA, $VERSION, @EXPORT_OK);
+use Exporter;
+use Errno;
+
+# legacy
+
+require IO::Socket::INET;
+require IO::Socket::UNIX if ($^O ne 'epoc' && $^O ne 'symbian');
+
+@ISA = qw(IO::Handle);
+
+$VERSION = "1.31";
+
+@EXPORT_OK = qw(sockatmark);
+
+sub import {
+ my $pkg = shift;
+ if (@_ && $_[0] eq 'sockatmark') { # not very extensible but for now, fast
+ Exporter::export_to_level('IO::Socket', 1, $pkg, 'sockatmark');
+ } else {
+ my $callpkg = caller;
+ Exporter::export 'Socket', $callpkg, @_;
+ }
+}
+
+sub new {
+ my($class,%arg) = @_;
+ my $sock = $class->SUPER::new();
+
+ $sock->autoflush(1);
+
+ ${*$sock}{'io_socket_timeout'} = delete $arg{Timeout};
+
+ return scalar(%arg) ? $sock->configure(\%arg)
+ : $sock;
+}
+
+my @domain2pkg;
+
+sub register_domain {
+ my($p,$d) = @_;
+ $domain2pkg[$d] = $p;
+}
+
+sub configure {
+ my($sock,$arg) = @_;
+ my $domain = delete $arg->{Domain};
+
+ croak 'IO::Socket: Cannot configure a generic socket'
+ unless defined $domain;
+
+ croak "IO::Socket: Unsupported socket domain"
+ unless defined $domain2pkg[$domain];
+
+ croak "IO::Socket: Cannot configure socket in domain '$domain'"
+ unless ref($sock) eq "IO::Socket";
+
+ bless($sock, $domain2pkg[$domain]);
+ $sock->configure($arg);
+}
+
+sub socket {
+ @_ == 4 or croak 'usage: $sock->socket(DOMAIN, TYPE, PROTOCOL)';
+ my($sock,$domain,$type,$protocol) = @_;
+
+ socket($sock,$domain,$type,$protocol) or
+ return undef;
+
+ ${*$sock}{'io_socket_domain'} = $domain;
+ ${*$sock}{'io_socket_type'} = $type;
+ ${*$sock}{'io_socket_proto'} = $protocol;
+
+ $sock;
+}
+
+sub socketpair {
+ @_ == 4 || croak 'usage: IO::Socket->socketpair(DOMAIN, TYPE, PROTOCOL)';
+ my($class,$domain,$type,$protocol) = @_;
+ my $sock1 = $class->new();
+ my $sock2 = $class->new();
+
+ socketpair($sock1,$sock2,$domain,$type,$protocol) or
+ return ();
+
+ ${*$sock1}{'io_socket_type'} = ${*$sock2}{'io_socket_type'} = $type;
+ ${*$sock1}{'io_socket_proto'} = ${*$sock2}{'io_socket_proto'} = $protocol;
+
+ ($sock1,$sock2);
+}
+
+sub connect {
+ @_ == 2 or croak 'usage: $sock->connect(NAME)';
+ my $sock = shift;
+ my $addr = shift;
+ my $timeout = ${*$sock}{'io_socket_timeout'};
+ my $err;
+ my $blocking;
+
+ $blocking = $sock->blocking(0) if $timeout;
+ if (!connect($sock, $addr)) {
+ if (defined $timeout && ($!{EINPROGRESS} || $!{EWOULDBLOCK})) {
+ require IO::Select;
+
+ my $sel = new IO::Select $sock;
+
+ undef $!;
+ if (!$sel->can_write($timeout)) {
+ $err = $! || (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1);
+ $@ = "connect: timeout";
+ }
+ elsif (!connect($sock,$addr) &&
+ not ($!{EISCONN} || ($! == 10022 && $^O eq 'MSWin32'))
+ ) {
+ # Some systems refuse to re-connect() to
+ # an already open socket and set errno to EISCONN.
+ # Windows sets errno to WSAEINVAL (10022)
+ $err = $!;
+ $@ = "connect: $!";
+ }
+ }
+ elsif ($blocking || !($!{EINPROGRESS} || $!{EWOULDBLOCK})) {
+ $err = $!;
+ $@ = "connect: $!";
+ }
+ }
+
+ $sock->blocking(1) if $blocking;
+
+ $! = $err if $err;
+
+ $err ? undef : $sock;
+}
+
+# Enable/disable blocking IO on sockets.
+# Without args return the current status of blocking,
+# with args change the mode as appropriate, returning the
+# old setting, or in case of error during the mode change
+# undef.
+
+sub blocking {
+ my $sock = shift;
+
+ return $sock->SUPER::blocking(@_)
+ if $^O ne 'MSWin32';
+
+ # Windows handles blocking differently
+ #
+ # http://groups.google.co.uk/group/perl.perl5.porters/browse_thread/thread/b4e2b1d88280ddff/630b667a66e3509f?#630b667a66e3509f
+ # http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/ioctlsocket_2.asp
+ #
+ # 0x8004667e is FIONBIO
+ #
+ # which is used to set blocking behaviour.
+
+ # NOTE:
+ # This is a little confusing, the perl keyword for this is
+ # 'blocking' but the OS level behaviour is 'non-blocking', probably
+ # because sockets are blocking by default.
+ # Therefore internally we have to reverse the semantics.
+
+ my $orig= !${*$sock}{io_sock_nonblocking};
+
+ return $orig unless @_;
+
+ my $block = shift;
+
+ if ( !$block != !$orig ) {
+ ${*$sock}{io_sock_nonblocking} = $block ? 0 : 1;
+ ioctl($sock, 0x8004667e, pack("L!",${*$sock}{io_sock_nonblocking}))
+ or return undef;
+ }
+
+ return $orig;
+}
+
+
+sub close {
+ @_ == 1 or croak 'usage: $sock->close()';
+ my $sock = shift;
+ ${*$sock}{'io_socket_peername'} = undef;
+ $sock->SUPER::close();
+}
+
+sub bind {
+ @_ == 2 or croak 'usage: $sock->bind(NAME)';
+ my $sock = shift;
+ my $addr = shift;
+
+ return bind($sock, $addr) ? $sock
+ : undef;
+}
+
+sub listen {
+ @_ >= 1 && @_ <= 2 or croak 'usage: $sock->listen([QUEUE])';
+ my($sock,$queue) = @_;
+ $queue = 5
+ unless $queue && $queue > 0;
+
+ return listen($sock, $queue) ? $sock
+ : undef;
+}
+
+sub accept {
+ @_ == 1 || @_ == 2 or croak 'usage $sock->accept([PKG])';
+ my $sock = shift;
+ my $pkg = shift || $sock;
+ my $timeout = ${*$sock}{'io_socket_timeout'};
+ my $new = $pkg->new(Timeout => $timeout);
+ my $peer = undef;
+
+ if(defined $timeout) {
+ require IO::Select;
+
+ my $sel = new IO::Select $sock;
+
+ unless ($sel->can_read($timeout)) {
+ $@ = 'accept: timeout';
+ $! = (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1);
+ return;
+ }
+ }
+
+ $peer = accept($new,$sock)
+ or return;
+
+ return wantarray ? ($new, $peer)
+ : $new;
+}
+
+sub sockname {
+ @_ == 1 or croak 'usage: $sock->sockname()';
+ getsockname($_[0]);
+}
+
+sub peername {
+ @_ == 1 or croak 'usage: $sock->peername()';
+ my($sock) = @_;
+ ${*$sock}{'io_socket_peername'} ||= getpeername($sock);
+}
+
+sub connected {
+ @_ == 1 or croak 'usage: $sock->connected()';
+ my($sock) = @_;
+ getpeername($sock);
+}
+
+sub send {
+ @_ >= 2 && @_ <= 4 or croak 'usage: $sock->send(BUF, [FLAGS, [TO]])';
+ my $sock = $_[0];
+ my $flags = $_[2] || 0;
+ my $peer = $_[3] || $sock->peername;
+
+ croak 'send: Cannot determine peer address'
+ unless(defined $peer);
+
+ my $r = defined(getpeername($sock))
+ ? send($sock, $_[1], $flags)
+ : send($sock, $_[1], $flags, $peer);
+
+ # remember who we send to, if it was successful
+ ${*$sock}{'io_socket_peername'} = $peer
+ if(@_ == 4 && defined $r);
+
+ $r;
+}
+
+sub recv {
+ @_ == 3 || @_ == 4 or croak 'usage: $sock->recv(BUF, LEN [, FLAGS])';
+ my $sock = $_[0];
+ my $len = $_[2];
+ my $flags = $_[3] || 0;
+
+ # remember who we recv'd from
+ ${*$sock}{'io_socket_peername'} = recv($sock, $_[1]='', $len, $flags);
+}
+
+sub shutdown {
+ @_ == 2 or croak 'usage: $sock->shutdown(HOW)';
+ my($sock, $how) = @_;
+ ${*$sock}{'io_socket_peername'} = undef;
+ shutdown($sock, $how);
+}
+
+sub setsockopt {
+ @_ == 4 or croak '$sock->setsockopt(LEVEL, OPTNAME, OPTVAL)';
+ setsockopt($_[0],$_[1],$_[2],$_[3]);
+}
+
+my $intsize = length(pack("i",0));
+
+sub getsockopt {
+ @_ == 3 or croak '$sock->getsockopt(LEVEL, OPTNAME)';
+ my $r = getsockopt($_[0],$_[1],$_[2]);
+ # Just a guess
+ $r = unpack("i", $r)
+ if(defined $r && length($r) == $intsize);
+ $r;
+}
+
+sub sockopt {
+ my $sock = shift;
+ @_ == 1 ? $sock->getsockopt(SOL_SOCKET,@_)
+ : $sock->setsockopt(SOL_SOCKET,@_);
+}
+
+sub atmark {
+ @_ == 1 or croak 'usage: $sock->atmark()';
+ my($sock) = @_;
+ sockatmark($sock);
+}
+
+sub timeout {
+ @_ == 1 || @_ == 2 or croak 'usage: $sock->timeout([VALUE])';
+ my($sock,$val) = @_;
+ my $r = ${*$sock}{'io_socket_timeout'};
+
+ ${*$sock}{'io_socket_timeout'} = defined $val ? 0 + $val : $val
+ if(@_ == 2);
+
+ $r;
+}
+
+sub sockdomain {
+ @_ == 1 or croak 'usage: $sock->sockdomain()';
+ my $sock = shift;
+ ${*$sock}{'io_socket_domain'};
+}
+
+sub socktype {
+ @_ == 1 or croak 'usage: $sock->socktype()';
+ my $sock = shift;
+ ${*$sock}{'io_socket_type'}
+}
+
+sub protocol {
+ @_ == 1 or croak 'usage: $sock->protocol()';
+ my($sock) = @_;
+ ${*$sock}{'io_socket_proto'};
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Socket - Object interface to socket communications
+
+=head1 SYNOPSIS
+
+ use IO::Socket;
+
+=head1 DESCRIPTION
+
+C<IO::Socket> provides an object interface to creating and using sockets. It
+is built upon the L<IO::Handle> interface and inherits all the methods defined
+by L<IO::Handle>.
+
+C<IO::Socket> only defines methods for those operations which are common to all
+types of socket. Operations which are specified to a socket in a particular
+domain have methods defined in sub classes of C<IO::Socket>
+
+C<IO::Socket> will export all functions (and constants) defined by L<Socket>.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ARGS] )
+
+Creates an C<IO::Socket>, which is a reference to a
+newly created symbol (see the C<Symbol> package). C<new>
+optionally takes arguments, these arguments are in key-value pairs.
+C<new> only looks for one key C<Domain> which tells new which domain
+the socket will be in. All other arguments will be passed to the
+configuration method of the package for that domain, See below.
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+As of VERSION 1.18 all IO::Socket objects have autoflush turned on
+by default. This was not the case with earlier releases.
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+=back
+
+=head1 METHODS
+
+See L<perlfunc> for complete descriptions of each of the following
+supported C<IO::Socket> methods, which are just front ends for the
+corresponding built-in functions:
+
+ socket
+ socketpair
+ bind
+ listen
+ accept
+ send
+ recv
+ peername (getpeername)
+ sockname (getsockname)
+ shutdown
+
+Some methods take slightly different arguments to those defined in L<perlfunc>
+in attempt to make the interface more flexible. These are
+
+=over 4
+
+=item accept([PKG])
+
+perform the system call C<accept> on the socket and return a new
+object. The new object will be created in the same class as the listen
+socket, unless C<PKG> is specified. This object can be used to
+communicate with the client that was trying to connect.
+
+In a scalar context the new socket is returned, or undef upon
+failure. In a list context a two-element array is returned containing
+the new socket and the peer address; the list will be empty upon
+failure.
+
+The timeout in the [PKG] can be specified as zero to effect a "poll",
+but you shouldn't do that because a new IO::Select object will be
+created behind the scenes just to do the single poll. This is
+horrendously inefficient. Use rather true select() with a zero
+timeout on the handle, or non-blocking IO.
+
+=item socketpair(DOMAIN, TYPE, PROTOCOL)
+
+Call C<socketpair> and return a list of two sockets created, or an
+empty list on failure.
+
+=back
+
+Additional methods that are provided are:
+
+=over 4
+
+=item atmark
+
+True if the socket is currently positioned at the urgent data mark,
+false otherwise.
+
+ use IO::Socket;
+
+ my $sock = IO::Socket::INET->new('some_server');
+ $sock->read($data, 1024) until $sock->atmark;
+
+Note: this is a reasonably new addition to the family of socket
+functions, so all systems may not support this yet. If it is
+unsupported by the system, an attempt to use this method will
+abort the program.
+
+The atmark() functionality is also exportable as sockatmark() function:
+
+ use IO::Socket 'sockatmark';
+
+This allows for a more traditional use of sockatmark() as a procedural
+socket function. If your system does not support sockatmark(), the
+C<use> declaration will fail at compile time.
+
+=item connected
+
+If the socket is in a connected state the peer address is returned.
+If the socket is not in a connected state then undef will be returned.
+
+=item protocol
+
+Returns the numerical number for the protocol being used on the socket, if
+known. If the protocol is unknown, as with an AF_UNIX socket, zero
+is returned.
+
+=item sockdomain
+
+Returns the numerical number for the socket domain type. For example, for
+an AF_INET socket the value of &AF_INET will be returned.
+
+=item sockopt(OPT [, VAL])
+
+Unified method to both set and get options in the SOL_SOCKET level. If called
+with one argument then getsockopt is called, otherwise setsockopt is called.
+
+=item socktype
+
+Returns the numerical number for the socket type. For example, for
+a SOCK_STREAM socket the value of &SOCK_STREAM will be returned.
+
+=item timeout([VAL])
+
+Set or get the timeout value associated with this socket. If called without
+any arguments then the current setting is returned. If called with an argument
+the current setting is changed and the previous value returned.
+
+=back
+
+=head1 SEE ALSO
+
+L<Socket>, L<IO::Handle>, L<IO::Socket::INET>, L<IO::Socket::UNIX>
+
+=head1 AUTHOR
+
+Graham Barr. atmark() by Lincoln Stein. Currently maintained by the
+Perl Porters. Please report all bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+The atmark() implementation: Copyright 2001, Lincoln Stein <lstein@cshl.org>.
+This module is distributed under the same terms as Perl itself.
+Feel free to use, modify and redistribute it as long as you retain
+the correct attribution.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Socket/INET.pm b/Master/tlpkg/tlperl.straw/lib/IO/Socket/INET.pm
new file mode 100755
index 00000000000..2f0e5d1d7a6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Socket/INET.pm
@@ -0,0 +1,464 @@
+# IO::Socket::INET.pm
+#
+# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package IO::Socket::INET;
+
+use strict;
+our(@ISA, $VERSION);
+use IO::Socket;
+use Socket;
+use Carp;
+use Exporter;
+use Errno;
+
+@ISA = qw(IO::Socket);
+$VERSION = "1.31";
+
+my $EINVAL = exists(&Errno::EINVAL) ? Errno::EINVAL() : 1;
+
+IO::Socket::INET->register_domain( AF_INET );
+
+my %socket_type = ( tcp => SOCK_STREAM,
+ udp => SOCK_DGRAM,
+ icmp => SOCK_RAW
+ );
+my %proto_number;
+$proto_number{tcp} = Socket::IPPROTO_TCP() if defined &Socket::IPPROTO_TCP;
+$proto_number{udp} = Socket::IPPROTO_UDP() if defined &Socket::IPPROTO_UDP;
+$proto_number{icmp} = Socket::IPPROTO_ICMP() if defined &Socket::IPPROTO_ICMP;
+my %proto_name = reverse %proto_number;
+
+sub new {
+ my $class = shift;
+ unshift(@_, "PeerAddr") if @_ == 1;
+ return $class->SUPER::new(@_);
+}
+
+sub _cache_proto {
+ my @proto = @_;
+ for (map lc($_), $proto[0], split(' ', $proto[1])) {
+ $proto_number{$_} = $proto[2];
+ }
+ $proto_name{$proto[2]} = $proto[0];
+}
+
+sub _get_proto_number {
+ my $name = lc(shift);
+ return undef unless defined $name;
+ return $proto_number{$name} if exists $proto_number{$name};
+
+ my @proto = getprotobyname($name);
+ return undef unless @proto;
+ _cache_proto(@proto);
+
+ return $proto[2];
+}
+
+sub _get_proto_name {
+ my $num = shift;
+ return undef unless defined $num;
+ return $proto_name{$num} if exists $proto_name{$num};
+
+ my @proto = getprotobynumber($num);
+ return undef unless @proto;
+ _cache_proto(@proto);
+
+ return $proto[0];
+}
+
+sub _sock_info {
+ my($addr,$port,$proto) = @_;
+ my $origport = $port;
+ my @serv = ();
+
+ $port = $1
+ if(defined $addr && $addr =~ s,:([\w\(\)/]+)$,,);
+
+ if(defined $proto && $proto =~ /\D/) {
+ my $num = _get_proto_number($proto);
+ unless (defined $num) {
+ $@ = "Bad protocol '$proto'";
+ return;
+ }
+ $proto = $num;
+ }
+
+ if(defined $port) {
+ my $defport = ($port =~ s,\((\d+)\)$,,) ? $1 : undef;
+ my $pnum = ($port =~ m,^(\d+)$,)[0];
+
+ @serv = getservbyname($port, _get_proto_name($proto) || "")
+ if ($port =~ m,\D,);
+
+ $port = $serv[2] || $defport || $pnum;
+ unless (defined $port) {
+ $@ = "Bad service '$origport'";
+ return;
+ }
+
+ $proto = _get_proto_number($serv[3]) if @serv && !$proto;
+ }
+
+ return ($addr || undef,
+ $port || undef,
+ $proto || undef
+ );
+}
+
+sub _error {
+ my $sock = shift;
+ my $err = shift;
+ {
+ local($!);
+ my $title = ref($sock).": ";
+ $@ = join("", $_[0] =~ /^$title/ ? "" : $title, @_);
+ $sock->close()
+ if(defined fileno($sock));
+ }
+ $! = $err;
+ return undef;
+}
+
+sub _get_addr {
+ my($sock,$addr_str, $multi) = @_;
+ my @addr;
+ if ($multi && $addr_str !~ /^\d+(?:\.\d+){3}$/) {
+ (undef, undef, undef, undef, @addr) = gethostbyname($addr_str);
+ } else {
+ my $h = inet_aton($addr_str);
+ push(@addr, $h) if defined $h;
+ }
+ @addr;
+}
+
+sub configure {
+ my($sock,$arg) = @_;
+ my($lport,$rport,$laddr,$raddr,$proto,$type);
+
+
+ $arg->{LocalAddr} = $arg->{LocalHost}
+ if exists $arg->{LocalHost} && !exists $arg->{LocalAddr};
+
+ ($laddr,$lport,$proto) = _sock_info($arg->{LocalAddr},
+ $arg->{LocalPort},
+ $arg->{Proto})
+ or return _error($sock, $!, $@);
+
+ $laddr = defined $laddr ? inet_aton($laddr)
+ : INADDR_ANY;
+
+ return _error($sock, $EINVAL, "Bad hostname '",$arg->{LocalAddr},"'")
+ unless(defined $laddr);
+
+ $arg->{PeerAddr} = $arg->{PeerHost}
+ if exists $arg->{PeerHost} && !exists $arg->{PeerAddr};
+
+ unless(exists $arg->{Listen}) {
+ ($raddr,$rport,$proto) = _sock_info($arg->{PeerAddr},
+ $arg->{PeerPort},
+ $proto)
+ or return _error($sock, $!, $@);
+ }
+
+ $proto ||= _get_proto_number('tcp');
+
+ $type = $arg->{Type} || $socket_type{lc _get_proto_name($proto)};
+
+ my @raddr = ();
+
+ if(defined $raddr) {
+ @raddr = $sock->_get_addr($raddr, $arg->{MultiHomed});
+ return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'")
+ unless @raddr;
+ }
+
+ while(1) {
+
+ $sock->socket(AF_INET, $type, $proto) or
+ return _error($sock, $!, "$!");
+
+ if (defined $arg->{Blocking}) {
+ defined $sock->blocking($arg->{Blocking})
+ or return _error($sock, $!, "$!");
+ }
+
+ if ($arg->{Reuse} || $arg->{ReuseAddr}) {
+ $sock->sockopt(SO_REUSEADDR,1) or
+ return _error($sock, $!, "$!");
+ }
+
+ if ($arg->{ReusePort}) {
+ $sock->sockopt(SO_REUSEPORT,1) or
+ return _error($sock, $!, "$!");
+ }
+
+ if ($arg->{Broadcast}) {
+ $sock->sockopt(SO_BROADCAST,1) or
+ return _error($sock, $!, "$!");
+ }
+
+ if($lport || ($laddr ne INADDR_ANY) || exists $arg->{Listen}) {
+ $sock->bind($lport || 0, $laddr) or
+ return _error($sock, $!, "$!");
+ }
+
+ if(exists $arg->{Listen}) {
+ $sock->listen($arg->{Listen} || 5) or
+ return _error($sock, $!, "$!");
+ last;
+ }
+
+ # don't try to connect unless we're given a PeerAddr
+ last unless exists($arg->{PeerAddr});
+
+ $raddr = shift @raddr;
+
+ return _error($sock, $EINVAL, 'Cannot determine remote port')
+ unless($rport || $type == SOCK_DGRAM || $type == SOCK_RAW);
+
+ last
+ unless($type == SOCK_STREAM || defined $raddr);
+
+ return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'")
+ unless defined $raddr;
+
+# my $timeout = ${*$sock}{'io_socket_timeout'};
+# my $before = time() if $timeout;
+
+ undef $@;
+ if ($sock->connect(pack_sockaddr_in($rport, $raddr))) {
+# ${*$sock}{'io_socket_timeout'} = $timeout;
+ return $sock;
+ }
+
+ return _error($sock, $!, $@ || "Timeout")
+ unless @raddr;
+
+# if ($timeout) {
+# my $new_timeout = $timeout - (time() - $before);
+# return _error($sock,
+# (exists(&Errno::ETIMEDOUT) ? Errno::ETIMEDOUT() : $EINVAL),
+# "Timeout") if $new_timeout <= 0;
+# ${*$sock}{'io_socket_timeout'} = $new_timeout;
+# }
+
+ }
+
+ $sock;
+}
+
+sub connect {
+ @_ == 2 || @_ == 3 or
+ croak 'usage: $sock->connect(NAME) or $sock->connect(PORT, ADDR)';
+ my $sock = shift;
+ return $sock->SUPER::connect(@_ == 1 ? shift : pack_sockaddr_in(@_));
+}
+
+sub bind {
+ @_ == 2 || @_ == 3 or
+ croak 'usage: $sock->bind(NAME) or $sock->bind(PORT, ADDR)';
+ my $sock = shift;
+ return $sock->SUPER::bind(@_ == 1 ? shift : pack_sockaddr_in(@_))
+}
+
+sub sockaddr {
+ @_ == 1 or croak 'usage: $sock->sockaddr()';
+ my($sock) = @_;
+ my $name = $sock->sockname;
+ $name ? (sockaddr_in($name))[1] : undef;
+}
+
+sub sockport {
+ @_ == 1 or croak 'usage: $sock->sockport()';
+ my($sock) = @_;
+ my $name = $sock->sockname;
+ $name ? (sockaddr_in($name))[0] : undef;
+}
+
+sub sockhost {
+ @_ == 1 or croak 'usage: $sock->sockhost()';
+ my($sock) = @_;
+ my $addr = $sock->sockaddr;
+ $addr ? inet_ntoa($addr) : undef;
+}
+
+sub peeraddr {
+ @_ == 1 or croak 'usage: $sock->peeraddr()';
+ my($sock) = @_;
+ my $name = $sock->peername;
+ $name ? (sockaddr_in($name))[1] : undef;
+}
+
+sub peerport {
+ @_ == 1 or croak 'usage: $sock->peerport()';
+ my($sock) = @_;
+ my $name = $sock->peername;
+ $name ? (sockaddr_in($name))[0] : undef;
+}
+
+sub peerhost {
+ @_ == 1 or croak 'usage: $sock->peerhost()';
+ my($sock) = @_;
+ my $addr = $sock->peeraddr;
+ $addr ? inet_ntoa($addr) : undef;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Socket::INET - Object interface for AF_INET domain sockets
+
+=head1 SYNOPSIS
+
+ use IO::Socket::INET;
+
+=head1 DESCRIPTION
+
+C<IO::Socket::INET> provides an object interface to creating and using sockets
+in the AF_INET domain. It is built upon the L<IO::Socket> interface and
+inherits all the methods defined by L<IO::Socket>.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ARGS] )
+
+Creates an C<IO::Socket::INET> object, which is a reference to a
+newly created symbol (see the C<Symbol> package). C<new>
+optionally takes arguments, these arguments are in key-value pairs.
+
+In addition to the key-value pairs accepted by L<IO::Socket>,
+C<IO::Socket::INET> provides.
+
+
+ PeerAddr Remote host address <hostname>[:<port>]
+ PeerHost Synonym for PeerAddr
+ PeerPort Remote port or service <service>[(<no>)] | <no>
+ LocalAddr Local host bind address hostname[:port]
+ LocalHost Synonym for LocalAddr
+ LocalPort Local host bind port <service>[(<no>)] | <no>
+ Proto Protocol name (or number) "tcp" | "udp" | ...
+ Type Socket type SOCK_STREAM | SOCK_DGRAM | ...
+ Listen Queue size for listen
+ ReuseAddr Set SO_REUSEADDR before binding
+ Reuse Set SO_REUSEADDR before binding (deprecated, prefer ReuseAddr)
+ ReusePort Set SO_REUSEPORT before binding
+ Broadcast Set SO_BROADCAST before binding
+ Timeout Timeout value for various operations
+ MultiHomed Try all addresses for multi-homed hosts
+ Blocking Determine if connection will be blocking mode
+
+If C<Listen> is defined then a listen socket is created, else if the
+socket type, which is derived from the protocol, is SOCK_STREAM then
+connect() is called.
+
+Although it is not illegal, the use of C<MultiHomed> on a socket
+which is in non-blocking mode is of little use. This is because the
+first connect will never fail with a timeout as the connect call
+will not block.
+
+The C<PeerAddr> can be a hostname or the IP-address on the
+"xx.xx.xx.xx" form. The C<PeerPort> can be a number or a symbolic
+service name. The service name might be followed by a number in
+parenthesis which is used if the service is not known by the system.
+The C<PeerPort> specification can also be embedded in the C<PeerAddr>
+by preceding it with a ":".
+
+If C<Proto> is not given and you specify a symbolic C<PeerPort> port,
+then the constructor will try to derive C<Proto> from the service
+name. As a last resort C<Proto> "tcp" is assumed. The C<Type>
+parameter will be deduced from C<Proto> if not specified.
+
+If the constructor is only passed a single argument, it is assumed to
+be a C<PeerAddr> specification.
+
+If C<Blocking> is set to 0, the connection will be in nonblocking mode.
+If not specified it defaults to 1 (blocking mode).
+
+Examples:
+
+ $sock = IO::Socket::INET->new(PeerAddr => 'www.perl.org',
+ PeerPort => 'http(80)',
+ Proto => 'tcp');
+
+ $sock = IO::Socket::INET->new(PeerAddr => 'localhost:smtp(25)');
+
+ $sock = IO::Socket::INET->new(Listen => 5,
+ LocalAddr => 'localhost',
+ LocalPort => 9000,
+ Proto => 'tcp');
+
+ $sock = IO::Socket::INET->new('127.0.0.1:25');
+
+ $sock = IO::Socket::INET->new(PeerPort => 9999,
+ PeerAddr => inet_ntoa(INADDR_BROADCAST),
+ Proto => udp,
+ LocalAddr => 'localhost',
+ Broadcast => 1 )
+ or die "Can't bind : $@\n";
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+As of VERSION 1.18 all IO::Socket objects have autoflush turned on
+by default. This was not the case with earlier releases.
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+=back
+
+=head2 METHODS
+
+=over 4
+
+=item sockaddr ()
+
+Return the address part of the sockaddr structure for the socket
+
+=item sockport ()
+
+Return the port number that the socket is using on the local host
+
+=item sockhost ()
+
+Return the address part of the sockaddr structure for the socket in a
+text form xx.xx.xx.xx
+
+=item peeraddr ()
+
+Return the address part of the sockaddr structure for the socket on
+the peer host
+
+=item peerport ()
+
+Return the port number for the socket on the peer host.
+
+=item peerhost ()
+
+Return the address part of the sockaddr structure for the socket on the
+peer host in a text form xx.xx.xx.xx
+
+=back
+
+=head1 SEE ALSO
+
+L<Socket>, L<IO::Socket>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Socket/SSL.pm b/Master/tlpkg/tlperl.straw/lib/IO/Socket/SSL.pm
new file mode 100755
index 00000000000..bcf098f58f3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Socket/SSL.pm
@@ -0,0 +1,2303 @@
+#!/usr/bin/perl -w
+#
+# IO::Socket::SSL:
+# a drop-in replacement for IO::Socket::INET that encapsulates
+# data passed over a network with SSL.
+#
+# Current Code Shepherd: Steffen Ullrich <steffen at genua.de>
+# Code Shepherd before: Peter Behroozi, <behrooz at fas.harvard.edu>
+#
+# The original version of this module was written by
+# Marko Asplund, <marko.asplund at kronodoc.fi>, who drew from
+# Crypt::SSLeay (Net::SSL) by Gisle Aas.
+#
+
+package IO::Socket::SSL;
+
+use IO::Socket;
+use Net::SSLeay 1.21;
+use Exporter ();
+use Errno qw( EAGAIN ETIMEDOUT );
+use Carp;
+use strict;
+
+use constant {
+ SSL_VERIFY_NONE => Net::SSLeay::VERIFY_NONE(),
+ SSL_VERIFY_PEER => Net::SSLeay::VERIFY_PEER(),
+ SSL_VERIFY_FAIL_IF_NO_PEER_CERT => Net::SSLeay::VERIFY_FAIL_IF_NO_PEER_CERT(),
+ SSL_VERIFY_CLIENT_ONCE => Net::SSLeay::VERIFY_CLIENT_ONCE(),
+ # from openssl/ssl.h, should be better in Net::SSLeay
+ SSL_SENT_SHUTDOWN => 1,
+ SSL_RECEIVED_SHUTDOWN => 2,
+};
+
+
+
+# non-XS Versions of Scalar::Util will fail
+BEGIN{
+ eval { use Scalar::Util 'dualvar'; dualvar(0,'') };
+ die "You need the XS Version of Scalar::Util for dualvar() support"
+ if $@;
+}
+
+use vars qw(@ISA $VERSION $DEBUG $SSL_ERROR $GLOBAL_CONTEXT_ARGS @EXPORT );
+
+{
+ # These constants will be used in $! at return from SSL_connect,
+ # SSL_accept, generic_read and write, thus notifying the caller
+ # the usual way of problems. Like with EAGAIN, EINPROGRESS..
+ # these are especially important for non-blocking sockets
+
+ my $x = Net::SSLeay::ERROR_WANT_READ();
+ use constant SSL_WANT_READ => dualvar( \$x, 'SSL wants a read first' );
+ my $y = Net::SSLeay::ERROR_WANT_WRITE();
+ use constant SSL_WANT_WRITE => dualvar( \$y, 'SSL wants a write first' );
+
+ @EXPORT = qw(
+ SSL_WANT_READ SSL_WANT_WRITE SSL_VERIFY_NONE SSL_VERIFY_PEER
+ SSL_VERIFY_FAIL_IF_NO_PEER_CERT SSL_VERIFY_CLIENT_ONCE
+ $SSL_ERROR GEN_DNS GEN_IPADD
+ );
+}
+
+my @caller_force_inet4; # in case inet4 gets forced we store here who forced it
+my $can_ipv6; # true if we successfully enabled ipv6 while loading
+
+BEGIN {
+ # Declare @ISA, $VERSION, $GLOBAL_CONTEXT_ARGS
+
+ # if we have IO::Socket::INET6 we will use this not IO::Socket::INET, because
+ # it can handle both IPv4 and IPv6. If we don't have INET6 available fall back
+ # to INET
+ if ( ! eval {
+ require Socket6;
+ Socket6->import( 'inet_pton' );
+ require IO::Socket::INET6;
+ @ISA = qw(IO::Socket::INET6);
+ $can_ipv6 = 1;
+ }) {
+ @ISA = qw(IO::Socket::INET);
+ }
+ $VERSION = '1.31';
+ $GLOBAL_CONTEXT_ARGS = {};
+
+ #Make $DEBUG another name for $Net::SSLeay::trace
+ *DEBUG = \$Net::SSLeay::trace;
+
+ #Compability
+ *ERROR = \$SSL_ERROR;
+
+ # Do Net::SSLeay initialization
+ Net::SSLeay::load_error_strings();
+ Net::SSLeay::SSLeay_add_ssl_algorithms();
+ Net::SSLeay::randomize();
+}
+
+sub DEBUG {
+ $DEBUG>=shift or return; # check against debug level
+ my (undef,$file,$line) = caller;
+ my $msg = shift;
+ $file = '...'.substr( $file,-17 ) if length($file)>20;
+ $msg = sprintf $msg,@_ if @_;
+ print STDERR "DEBUG: $file:$line: $msg\n";
+}
+
+BEGIN {
+ # import some constants from Net::SSLeay or use hard-coded defaults
+ # if Net::SSLeay isn't recent enough to provide the constants
+ my %const = (
+ NID_CommonName => 13,
+ GEN_DNS => 2,
+ GEN_IPADD => 7,
+ );
+ while ( my ($name,$value) = each %const ) {
+ no strict 'refs';
+ *{$name} = UNIVERSAL::can( 'Net::SSLeay', $name ) || sub { $value };
+ }
+
+ # check if we have something to handle IDN
+ local $SIG{__DIE__}; local $SIG{__WARN__}; # be silent
+ if ( eval { require Net::IDN::Encode }) {
+ *{idn_to_ascii} = \&Net::IDN::Encode::domain_to_ascii;
+ } elsif ( eval { require Net::LibIDN }) {
+ *{idn_to_ascii} = \&Net::LibIDN::idn_to_ascii;
+ } else {
+ # default: croak if we really got an unencoded international domain
+ *{idn_to_ascii} = sub {
+ my $domain = shift;
+ return $domain if $domain =~m{^[a-zA-Z0-9-_\.]+$};
+ croak "cannot handle international domains, please install Net::LibIDN or Net::IDN::Encode"
+ }
+ }
+}
+
+# Export some stuff
+# inet4|inet6|debug will be handeled by myself, everything
+# else will be handeld the Exporter way
+sub import {
+ my $class = shift;
+
+ my @export;
+ foreach (@_) {
+ if ( /^inet4$/i ) {
+ # explicitly fall back to inet4
+ @ISA = 'IO::Socket::INET';
+ @caller_force_inet4 = caller(); # save for warnings for 'inet6' case
+ } elsif ( /^inet6$/i ) {
+ # check if we have already ipv6 as base
+ if ( ! UNIVERSAL::isa( $class, 'IO::Socket::INET6' )) {
+ # either we don't support it or we disabled it by explicitly
+ # loading it with 'inet4'. In this case re-enable but warn
+ # because this is probably an error
+ if ( $can_ipv6 ) {
+ @ISA = 'IO::Socket::INET6';
+ warn "IPv6 support re-enabled in __PACKAGE__, got disabled in file $caller_force_inet4[1] line $caller_force_inet4[2]";
+ } else {
+ die "INET6 is not supported, missing Socket6 or IO::Socket::INET6";
+ }
+ }
+ } elsif ( /^:?debug(\d+)/ ) {
+ $DEBUG=$1;
+ } else {
+ push @export,$_
+ }
+ }
+
+ @_ = ( $class,@export );
+ goto &Exporter::import;
+}
+
+# You might be expecting to find a new() subroutine here, but that is
+# not how IO::Socket::INET works. All configuration gets performed in
+# the calls to configure() and either connect() or accept().
+
+#Call to configure occurs when a new socket is made using
+#IO::Socket::INET. Returns false (empty list) on failure.
+sub configure {
+ my ($self, $arg_hash) = @_;
+ return _invalid_object() unless($self);
+
+ # work around Bug in IO::Socket::INET6 where it doesn't use the
+ # right family for the socket on BSD systems:
+ # http://rt.cpan.org/Ticket/Display.html?id=39550
+ if ( $can_ipv6 && ! $arg_hash->{Domain} &&
+ ! ( $arg_hash->{LocalAddr} || $arg_hash->{LocalHost} ) &&
+ (my $peer = $arg_hash->{PeerAddr} || $arg_hash->{PeerHost})) {
+ # set Domain to AF_INET/AF_INET6 if there is only one choice
+ ($peer, my $port) = IO::Socket::INET6::_sock_info( $peer,$arg_hash->{PeerPort},6 );
+ my @res = Socket6::getaddrinfo( $peer,$port,AF_UNSPEC,SOCK_STREAM );
+ if (@res == 5) {
+ $arg_hash->{Domain} = $res[0];
+ DEBUG(2,'set domain to '.$res[0] );
+ }
+ }
+
+ # force initial blocking
+ # otherwise IO::Socket::SSL->new might return undef if the
+ # socket is nonblocking and it fails to connect immediatly
+ # for real nonblocking behavior one should create a nonblocking
+ # socket and later call connect explicitly
+ my $blocking = delete $arg_hash->{Blocking};
+
+ # because Net::HTTPS simple redefines blocking() to {} (e.g
+ # return undef) and IO::Socket::INET does not like this we
+
+ # set Blocking only explicitly if it was set
+ $arg_hash->{Blocking} = 1 if defined ($blocking);
+
+ $self->configure_SSL($arg_hash) || return;
+
+ $self->SUPER::configure($arg_hash)
+ || return $self->error("@ISA configuration failed");
+
+ $self->blocking(0) if defined $blocking && !$blocking;
+ return $self;
+}
+
+sub configure_SSL {
+ my ($self, $arg_hash) = @_;
+
+ my $is_server = $arg_hash->{'SSL_server'} || $arg_hash->{'Listen'} || 0;
+
+ my %default_args = (
+ Proto => 'tcp',
+ SSL_server => $is_server,
+ SSL_use_cert => $is_server,
+ SSL_check_crl => 0,
+ SSL_version => 'sslv23',
+ SSL_verify_mode => SSL_VERIFY_NONE,
+ SSL_verify_callback => undef,
+ SSL_verifycn_scheme => undef, # don't verify cn
+ SSL_verifycn_name => undef, # use from PeerAddr/PeerHost
+ );
+
+ # common problem forgetting SSL_use_cert
+ # if client cert is given but SSL_use_cert undef assume that it
+ # should be set
+ if ( ! $is_server && ! defined $arg_hash->{SSL_use_cert}
+ && ( grep { $arg_hash->{$_} } qw(SSL_cert SSL_cert_file))
+ && ( grep { $arg_hash->{$_} } qw(SSL_key SSL_key_file)) ) {
+ $arg_hash->{SSL_use_cert} = 1
+ }
+
+ # SSL_key_file and SSL_cert_file will only be set in defaults if
+ # SSL_key|SSL_key_file resp SSL_cert|SSL_cert_file are not set in
+ # $args_hash
+ foreach my $k (qw( key cert )) {
+ next if exists $arg_hash->{ "SSL_${k}" };
+ next if exists $arg_hash->{ "SSL_${k}_file" };
+ $default_args{ "SSL_${k}_file" } = $is_server
+ ? "certs/server-${k}.pem"
+ : "certs/client-${k}.pem";
+ }
+
+ # add only SSL_ca_* if not in args
+ if ( ! exists $arg_hash->{SSL_ca_file} && ! exists $arg_hash->{SSL_ca_path} ) {
+ if ( -f 'certs/my-ca.pem' ) {
+ $default_args{SSL_ca_file} = 'certs/my-ca.pem'
+ } elsif ( -d 'ca/' ) {
+ $default_args{SSL_ca_path} = 'ca/'
+ }
+ }
+
+ #Replace nonexistent entries with defaults
+ %$arg_hash = ( %default_args, %$GLOBAL_CONTEXT_ARGS, %$arg_hash );
+
+ #Avoid passing undef arguments to Net::SSLeay
+ defined($arg_hash->{$_}) or delete($arg_hash->{$_}) foreach (keys %$arg_hash);
+
+ my $vcn_scheme = delete $arg_hash->{SSL_verifycn_scheme};
+ if ( $vcn_scheme && $vcn_scheme ne 'none' ) {
+ # don't access ${*self} inside callback - this seems to create
+ # circular references from the ssl object to the context and back
+
+ # use SSL_verifycn_name or determine from PeerAddr
+ my $host = $arg_hash->{SSL_verifycn_name};
+ if (not defined($host)) {
+ if ( $host = $arg_hash->{PeerAddr} || $arg_hash->{PeerHost} ) {
+ $host =~s{:[a-zA-Z0-9_\-]+$}{};
+ }
+ }
+ $host ||= ref($vcn_scheme) && $vcn_scheme->{callback} && 'unknown';
+ $host or return $self->error( "Cannot determine peer hostname for verification" );
+
+ my $vcb = $arg_hash->{SSL_verify_callback};
+ $arg_hash->{SSL_verify_callback} = sub {
+ my ($ok,$ctx_store,$certname,$error,$cert) = @_;
+ $ok = $vcb->($ok,$ctx_store,$certname,$error,$cert) if $vcb;
+ $ok or return;
+ my $depth = Net::SSLeay::X509_STORE_CTX_get_error_depth($ctx_store);
+ return $ok if $depth != 0;
+
+ # verify name
+ my $rv = verify_hostname_of_cert( $host,$cert,$vcn_scheme );
+ # just do some code here against optimization because x509 has no
+ # increased reference and CRYPTO_add is not available from Net::SSLeay
+ return $rv;
+ };
+ }
+
+ ${*$self}{'_SSL_arguments'} = $arg_hash;
+ ${*$self}{'_SSL_ctx'} = IO::Socket::SSL::SSL_Context->new($arg_hash) || return;
+ ${*$self}{'_SSL_opened'} = 1 if $is_server;
+
+ return $self;
+}
+
+
+sub _set_rw_error {
+ my ($self,$ssl,$rv) = @_;
+ my $err = Net::SSLeay::get_error($ssl,$rv);
+ $SSL_ERROR =
+ $err == Net::SSLeay::ERROR_WANT_READ() ? SSL_WANT_READ :
+ $err == Net::SSLeay::ERROR_WANT_WRITE() ? SSL_WANT_WRITE :
+ return;
+ $! ||= EAGAIN;
+ ${*$self}{'_SSL_last_err'} = $SSL_ERROR if ref($self);
+ return 1;
+}
+
+
+#Call to connect occurs when a new client socket is made using
+#IO::Socket::INET
+sub connect {
+ my $self = shift || return _invalid_object();
+ return $self if ${*$self}{'_SSL_opened'}; # already connected
+
+ if ( ! ${*$self}{'_SSL_opening'} ) {
+ # call SUPER::connect if the underlying socket is not connected
+ # if this fails this might not be an error (e.g. if $! = EINPROGRESS
+ # and socket is nonblocking this is normal), so keep any error
+ # handling to the client
+ DEBUG(2, 'socket not yet connected' );
+ $self->SUPER::connect(@_) || return;
+ DEBUG(2,'socket connected' );
+ }
+ return $self->connect_SSL;
+}
+
+
+sub connect_SSL {
+ my $self = shift;
+ my $args = @_>1 ? {@_}: $_[0]||{};
+
+ my ($ssl,$ctx);
+ if ( ! ${*$self}{'_SSL_opening'} ) {
+ # start ssl connection
+ DEBUG(2,'ssl handshake not started' );
+ ${*$self}{'_SSL_opening'} = 1;
+ my $arg_hash = ${*$self}{'_SSL_arguments'};
+
+ my $fileno = ${*$self}{'_SSL_fileno'} = fileno($self);
+ return $self->error("Socket has no fileno") unless (defined $fileno);
+
+ $ctx = ${*$self}{'_SSL_ctx'}; # Reference to real context
+ $ssl = ${*$self}{'_SSL_object'} = Net::SSLeay::new($ctx->{context})
+ || return $self->error("SSL structure creation failed");
+
+ Net::SSLeay::set_fd($ssl, $fileno)
+ || return $self->error("SSL filehandle association failed");
+
+ if ( my $cl = $arg_hash->{SSL_cipher_list} ) {
+ Net::SSLeay::set_cipher_list($ssl, $cl )
+ || return $self->error("Failed to set SSL cipher list");
+ }
+
+ $arg_hash->{PeerAddr} || $self->_update_peer;
+ my $session = $ctx->session_cache( $arg_hash->{PeerAddr}, $arg_hash->{PeerPort} );
+ Net::SSLeay::set_session($ssl, $session) if ($session);
+ }
+
+ $ssl ||= ${*$self}{'_SSL_object'};
+
+ $SSL_ERROR = undef;
+ my $timeout = exists $args->{Timeout}
+ ? $args->{Timeout}
+ : ${*$self}{io_socket_timeout}; # from IO::Socket
+ if ( defined($timeout) && $timeout>0 && $self->blocking(0) ) {
+ DEBUG(2, "set socket to non-blocking to enforce timeout=$timeout" );
+ # timeout was given and socket was blocking
+ # enforce timeout with now non-blocking socket
+ } else {
+ # timeout does not apply because invalid or socket non-blocking
+ $timeout = undef;
+ }
+
+ my $start = defined($timeout) && time();
+ for my $dummy (1) {
+ #DEBUG( 'calling ssleay::connect' );
+ my $rv = Net::SSLeay::connect($ssl);
+ DEBUG( 3,"Net::SSLeay::connect -> $rv" );
+ if ( $rv < 0 ) {
+ unless ( $self->_set_rw_error( $ssl,$rv )) {
+ $self->error("SSL connect attempt failed with unknown error");
+ delete ${*$self}{'_SSL_opening'};
+ ${*$self}{'_SSL_opened'} = -1;
+ DEBUG(1, "fatal SSL error: $SSL_ERROR" );
+ return $self->fatal_ssl_error();
+ }
+
+ DEBUG(2,'ssl handshake in progress' );
+ # connect failed because handshake needs to be completed
+ # if socket was non-blocking or no timeout was given return with this error
+ return if ! defined($timeout);
+
+ # wait until socket is readable or writable
+ my $rv;
+ if ( $timeout>0 ) {
+ my $vec = '';
+ vec($vec,$self->fileno,1) = 1;
+ DEBUG(2, "waiting for fd to become ready: $SSL_ERROR" );
+ $rv =
+ $SSL_ERROR == SSL_WANT_READ ? select( $vec,undef,undef,$timeout) :
+ $SSL_ERROR == SSL_WANT_WRITE ? select( undef,$vec,undef,$timeout) :
+ undef;
+ } else {
+ DEBUG(2,"handshake failed because no more time" );
+ $! = ETIMEDOUT
+ }
+ if ( ! $rv ) {
+ DEBUG(2,"handshake failed because socket did not became ready" );
+ # failed because of timeout, return
+ $! ||= ETIMEDOUT;
+ delete ${*$self}{'_SSL_opening'};
+ ${*$self}{'_SSL_opened'} = -1;
+ $self->blocking(1); # was blocking before
+ return
+ }
+
+ # socket is ready, try non-blocking connect again after recomputing timeout
+ DEBUG(2,"socket ready, retrying connect" );
+ my $now = time();
+ $timeout -= $now - $start;
+ $start = $now;
+ redo;
+
+ } elsif ( $rv == 0 ) {
+ delete ${*$self}{'_SSL_opening'};
+ DEBUG(2,"connection failed - connect returned 0" );
+ $self->error("SSL connect attempt failed because of handshake problems" );
+ ${*$self}{'_SSL_opened'} = -1;
+ return $self->fatal_ssl_error();
+ }
+ }
+
+ DEBUG(2,'ssl handshake done' );
+ # ssl connect successful
+ delete ${*$self}{'_SSL_opening'};
+ ${*$self}{'_SSL_opened'}=1;
+ $self->blocking(1) if defined($timeout); # was blocking before
+
+ $ctx ||= ${*$self}{'_SSL_ctx'};
+ if ( $ctx->has_session_cache ) {
+ my $arg_hash = ${*$self}{'_SSL_arguments'};
+ $arg_hash->{PeerAddr} || $self->_update_peer;
+ my ($addr,$port) = ( $arg_hash->{PeerAddr}, $arg_hash->{PeerPort} );
+ my $session = $ctx->session_cache( $addr,$port );
+ $ctx->session_cache( $addr,$port, Net::SSLeay::get1_session($ssl) ) if !$session;
+ }
+
+ tie *{$self}, "IO::Socket::SSL::SSL_HANDLE", $self;
+
+ return $self;
+}
+
+# called if PeerAddr is not set in ${*$self}{'_SSL_arguments'}
+# this can be the case if start_SSL is called with a normal IO::Socket::INET
+# so that PeerAddr|PeerPort are not set from args
+sub _update_peer {
+ my $self = shift;
+ my $arg_hash = ${*$self}{'_SSL_arguments'};
+ eval {
+ my ($port,$addr) = sockaddr_in( getpeername( $self ));
+ $arg_hash->{PeerAddr} = inet_ntoa( $addr );
+ $arg_hash->{PeerPort} = $port;
+ }
+}
+
+#Call to accept occurs when a new client connects to a server using
+#IO::Socket::SSL
+sub accept {
+ my $self = shift || return _invalid_object();
+ my $class = shift || 'IO::Socket::SSL';
+
+ my $socket = ${*$self}{'_SSL_opening'};
+ if ( ! $socket ) {
+ # underlying socket not done
+ DEBUG(2,'no socket yet' );
+ $socket = $self->SUPER::accept($class) || return;
+ DEBUG(2,'accept created normal socket '.$socket );
+ }
+
+ $self->accept_SSL($socket) || return;
+ DEBUG(2,'accept_SSL ok' );
+
+ return wantarray ? ($socket, getpeername($socket) ) : $socket;
+}
+
+sub accept_SSL {
+ my $self = shift;
+ my $socket = ( @_ && UNIVERSAL::isa( $_[0], 'IO::Handle' )) ? shift : $self;
+ my $args = @_>1 ? {@_}: $_[0]||{};
+
+ my $ssl;
+ if ( ! ${*$self}{'_SSL_opening'} ) {
+ DEBUG(2,'starting sslifying' );
+ ${*$self}{'_SSL_opening'} = $socket;
+ my $arg_hash = ${*$self}{'_SSL_arguments'};
+ ${*$socket}{'_SSL_arguments'} = { %$arg_hash, SSL_server => 0 };
+ my $ctx = ${*$socket}{'_SSL_ctx'} = ${*$self}{'_SSL_ctx'};
+
+ my $fileno = ${*$socket}{'_SSL_fileno'} = fileno($socket);
+ return $socket->error("Socket has no fileno") unless (defined $fileno);
+
+ $ssl = ${*$socket}{'_SSL_object'} = Net::SSLeay::new($ctx->{context})
+ || return $socket->error("SSL structure creation failed");
+
+ Net::SSLeay::set_fd($ssl, $fileno)
+ || return $socket->error("SSL filehandle association failed");
+
+ if ( my $cl = $arg_hash->{SSL_cipher_list} ) {
+ Net::SSLeay::set_cipher_list($ssl, $cl )
+ || return $socket->error("Failed to set SSL cipher list");
+ }
+ }
+
+ $ssl ||= ${*$socket}{'_SSL_object'};
+
+ $SSL_ERROR = undef;
+ #DEBUG(2,'calling ssleay::accept' );
+
+ my $timeout = exists $args->{Timeout}
+ ? $args->{Timeout}
+ : ${*$self}{io_socket_timeout}; # from IO::Socket
+ if ( defined($timeout) && $timeout>0 && $socket->blocking(0) ) {
+ # timeout was given and socket was blocking
+ # enforce timeout with now non-blocking socket
+ } else {
+ # timeout does not apply because invalid or socket non-blocking
+ $timeout = undef;
+ }
+
+ my $start = defined($timeout) && time();
+ for my $dummy (1) {
+ my $rv = Net::SSLeay::accept($ssl);
+ DEBUG(3, "Net::SSLeay::accept -> $rv" );
+ if ( $rv < 0 ) {
+ unless ( $socket->_set_rw_error( $ssl,$rv )) {
+ $socket->error("SSL accept attempt failed with unknown error");
+ delete ${*$self}{'_SSL_opening'};
+ ${*$socket}{'_SSL_opened'} = -1;
+ return $socket->fatal_ssl_error();
+ }
+
+ # accept failed because handshake needs to be completed
+ # if socket was non-blocking or no timeout was given return with this error
+ return if ! defined($timeout);
+
+ # wait until socket is readable or writable
+ my $rv;
+ if ( $timeout>0 ) {
+ my $vec = '';
+ vec($vec,$socket->fileno,1) = 1;
+ $rv =
+ $SSL_ERROR == SSL_WANT_READ ? select( $vec,undef,undef,$timeout) :
+ $SSL_ERROR == SSL_WANT_WRITE ? select( undef,$vec,undef,$timeout) :
+ undef;
+ } else {
+ $! = ETIMEDOUT
+ }
+ if ( ! $rv ) {
+ # failed because of timeout, return
+ $! ||= ETIMEDOUT;
+ delete ${*$self}{'_SSL_opening'};
+ ${*$socket}{'_SSL_opened'} = -1;
+ $socket->blocking(1); # was blocking before
+ return
+ }
+
+ # socket is ready, try non-blocking accept again after recomputing timeout
+ my $now = time();
+ $timeout -= $now - $start;
+ $start = $now;
+ redo;
+
+ } elsif ( $rv == 0 ) {
+ $socket->error("SSL connect accept failed because of handshake problems" );
+ delete ${*$self}{'_SSL_opening'};
+ ${*$socket}{'_SSL_opened'} = -1;
+ return $socket->fatal_ssl_error();
+ }
+ }
+
+ DEBUG(2,'handshake done, socket ready' );
+ # socket opened
+ delete ${*$self}{'_SSL_opening'};
+ ${*$socket}{'_SSL_opened'} = 1;
+ $socket->blocking(1) if defined($timeout); # was blocking before
+
+ tie *{$socket}, "IO::Socket::SSL::SSL_HANDLE", $socket;
+
+ return $socket;
+}
+
+
+####### I/O subroutines ########################
+
+sub generic_read {
+ my ($self, $read_func, undef, $length, $offset) = @_;
+ my $ssl = $self->_get_ssl_object || return;
+ my $buffer=\$_[2];
+
+ $SSL_ERROR = undef;
+ my $data = $read_func->($ssl, $length);
+ if ( !defined($data)) {
+ $self->_set_rw_error( $ssl,-1 ) || $self->error("SSL read error");
+ return;
+ }
+
+ $length = length($data);
+ $$buffer = '' if !defined $$buffer;
+ $offset ||= 0;
+ if ($offset>length($$buffer)) {
+ $$buffer.="\0" x ($offset-length($$buffer)); #mimic behavior of read
+ }
+
+ substr($$buffer, $offset, length($$buffer), $data);
+ return $length;
+}
+
+sub read {
+ my $self = shift;
+ return $self->generic_read(
+ $self->blocking ? \&Net::SSLeay::ssl_read_all : \&Net::SSLeay::read,
+ @_
+ );
+}
+
+# contrary to the behavior of read sysread can read partial data
+sub sysread {
+ my $self = shift;
+ return $self->generic_read( \&Net::SSLeay::read, @_ );
+}
+
+sub peek {
+ my $self = shift;
+ if (Net::SSLeay::OPENSSL_VERSION_NUMBER() >= 0x0090601f) {
+ return $self->generic_read(\&Net::SSLeay::peek, @_);
+ } else {
+ return $self->error("SSL_peek not supported for OpenSSL < v0.9.6a");
+ }
+}
+
+
+sub generic_write {
+ my ($self, $write_all, undef, $length, $offset) = @_;
+
+ my $ssl = $self->_get_ssl_object || return;
+ my $buffer = \$_[2];
+
+ my $buf_len = length($$buffer);
+ $length ||= $buf_len;
+ $offset ||= 0;
+ return $self->error("Invalid offset for SSL write") if ($offset>$buf_len);
+ return 0 if ($offset == $buf_len);
+
+ $SSL_ERROR = undef;
+ my $written;
+ if ( $write_all ) {
+ my $data = $length < $buf_len-$offset ? substr($$buffer, $offset, $length) : $$buffer;
+ ($written, my $errs) = Net::SSLeay::ssl_write_all($ssl, $data);
+ # ssl_write_all returns number of bytes written
+ $written = undef if ! $written && $errs;
+ } else {
+ $written = Net::SSLeay::write_partial( $ssl,$offset,$length,$$buffer );
+ # write_partial does SSL_write which returns -1 on error
+ $written = undef if $written < 0;
+ }
+ if ( !defined($written) ) {
+ $self->_set_rw_error( $ssl,-1 )
+ || $self->error("SSL write error");
+ return;
+ }
+
+ return $written;
+}
+
+# if socket is blocking write() should return only on error or
+# if all data are written
+sub write {
+ my $self = shift;
+ return $self->generic_write( scalar($self->blocking),@_ );
+}
+
+# contrary to write syswrite() returns already if only
+# a part of the data is written
+sub syswrite {
+ my $self = shift;
+ return $self->generic_write( 0,@_ );
+}
+
+sub print {
+ my $self = shift;
+ my $string = join(($, or ''), @_, ($\ or ''));
+ return $self->write( $string );
+}
+
+sub printf {
+ my ($self,$format) = (shift,shift);
+ return $self->write(sprintf($format, @_));
+}
+
+sub getc {
+ my ($self, $buffer) = (shift, undef);
+ return $buffer if $self->read($buffer, 1, 0);
+}
+
+sub readline {
+ my $self = shift;
+ my $ssl = $self->_get_ssl_object || return;
+
+ if (wantarray) {
+ my ($buf,$err) = Net::SSLeay::ssl_read_all($ssl);
+ return $self->error( "SSL read error" ) if $err;
+ if ( !defined($/) ) {
+ return $buf;
+ } elsif ( ref($/) ) {
+ my $size = ${$/};
+ die "bad value in ref \$/: $size" unless $size>0;
+ return $buf=~m{\G(.{1,$size})}g;
+ } elsif ( $/ eq '' ) {
+ return $buf =~m{\G(.*\n\n+|.+)}g;
+ } else {
+ return $buf =~m{\G(.*$/|.+)}g;
+ }
+ }
+
+ if ( !defined($/) ) {
+ my ($buf,$err) = Net::SSLeay::ssl_read_all($ssl);
+ return $self->error( "SSL read error" ) if $err;
+ return $buf;
+ } elsif ( ref($/) ) {
+ my $size = ${$/};
+ die "bad value in ref \$/: $size" unless $size>0;
+ my ($buf,$err) = Net::SSLeay::ssl_read_all($ssl,$size);
+ return $self->error( "SSL read error" ) if $err;
+ return $buf;
+ } elsif ( $/ ne '' ) {
+ my $line = Net::SSLeay::ssl_read_until($ssl,$/);
+ return $self->error( "SSL read error" ) if $line eq '';
+ return $line;
+ } else {
+ # $/ is ''
+ # ^.*?\n\n+, need peek to find all \n at the end
+ die "empty \$/ is not supported if I don't have peek"
+ if Net::SSLeay::OPENSSL_VERSION_NUMBER() < 0x0090601f;
+
+ # find first occurence of \n\n
+ my $buf = '';
+ my $eon = 0;
+ while (1) {
+ defined( Net::SSLeay::peek($ssl,1)) || last; # peek more, can block
+ my $pending = Net::SSLeay::pending($ssl);
+ $buf .= Net::SSLeay::peek( $ssl,$pending ); # will not block
+ if ( !$eon ) {
+ my $pos = index( $buf,"\n\n");
+ next if $pos<0; # newlines not found
+ $eon = $pos+2; # pos after second newline
+ }
+ # $eon >= 2 == bytes incl last known \n
+ while ( index( $buf,"\n",$eon ) == $eon ) {
+ # the next char ist \n too
+ $eon++;
+ }
+ last if $eon < length($buf); # found last \n before end of buf
+ }
+ if ( $eon > 0 ) {
+ # found something
+ # readed peeked data until $eon from $ssl
+ return Net::SSLeay::ssl_read_all( $ssl,$eon );
+ } else {
+ # found nothing
+ # return all what we have
+ if ( my $l = length($buf)) {
+ return Net::SSLeay::ssl_read_all( $ssl,$l );
+ } else {
+ return $self->error( "SSL read error" );
+ }
+ }
+ }
+}
+
+sub close {
+ my $self = shift || return _invalid_object();
+ my $close_args = (ref($_[0]) eq 'HASH') ? $_[0] : {@_};
+
+ return if ! $self->stop_SSL(
+ SSL_fast_shutdown => 1,
+ %$close_args,
+ _SSL_ioclass_downgrade => 0,
+ );
+
+ if ( ! $close_args->{_SSL_in_DESTROY} ) {
+ untie( *$self );
+ return $self->SUPER::close;
+ }
+ return 1;
+}
+
+sub stop_SSL {
+ my $self = shift || return _invalid_object();
+ my $stop_args = (ref($_[0]) eq 'HASH') ? $_[0] : {@_};
+ return $self->error("SSL object not open")
+ if ! ${*$self}{'_SSL_opened'};
+
+ if (my $ssl = ${*$self}{'_SSL_object'}) {
+ my $shutdown_done;
+ if ( $stop_args->{SSL_no_shutdown} ) {
+ $shutdown_done = 1;
+ } else {
+ my $fast = $stop_args->{SSL_fast_shutdown};
+ my $status = Net::SSLeay::get_shutdown($ssl);
+ if ( $status == SSL_RECEIVED_SHUTDOWN
+ || ( $status != 0 && $fast )) {
+ # shutdown done
+ $shutdown_done = 1;
+ } else {
+ # need to initiate/continue shutdown
+ local $SIG{PIPE} = sub{};
+ for my $try (1,2 ) {
+ my $rv = Net::SSLeay::shutdown($ssl);
+ if ( $rv < 0 ) {
+ # non-blocking socket?
+ $self->_set_rw_error( $ssl,$rv );
+ # need to try again
+ return;
+ } elsif ( $rv
+ || ( $rv == 0 && $fast )) {
+ # shutdown finished
+ $shutdown_done = 1;
+ last;
+ } else {
+ # shutdown partly finished (e.g. one direction)
+ # call again
+ }
+ }
+ }
+ }
+
+ return if ! $shutdown_done;
+ Net::SSLeay::free($ssl);
+ delete ${*$self}{_SSL_object};
+ }
+
+ if ($stop_args->{'SSL_ctx_free'}) {
+ my $ctx = delete ${*$self}{'_SSL_ctx'};
+ $ctx && $ctx->DESTROY();
+ }
+
+ if (my $cert = delete ${*$self}{'_SSL_certificate'}) {
+ Net::SSLeay::X509_free($cert);
+ }
+
+ ${*$self}{'_SSL_opened'} = 0;
+
+ if ( ! $stop_args->{_SSL_in_DESTROY} ) {
+
+ my $downgrade = $stop_args->{_SSL_ioclass_downgrade};
+ if ( $downgrade || ! defined $downgrade ) {
+ # rebless to original class from start_SSL
+ if ( my $orig_class = delete ${*$self}{'_SSL_ioclass_upgraded'} ) {
+ bless $self,$orig_class;
+ untie(*$self);
+ # FIXME: if original class was tied too we need to restore the tie
+ }
+ # remove all _SSL related from *$self
+ my @sslkeys = grep { m{^_?SSL_} } keys %{*$self};
+ delete @{*$self}{@sslkeys} if @sslkeys;
+ }
+ }
+ return 1;
+}
+
+
+sub kill_socket {
+ my $self = shift;
+ shutdown($self, 2);
+ $self->close(SSL_no_shutdown => 1) if ${*$self}{'_SSL_opened'};
+ delete(${*$self}{'_SSL_ctx'});
+ return;
+}
+
+sub fileno {
+ my $self = shift;
+ my $fn = ${*$self}{'_SSL_fileno'};
+ return defined($fn) ? $fn : $self->SUPER::fileno();
+}
+
+
+####### IO::Socket::SSL specific functions #######
+# _get_ssl_object is for internal use ONLY!
+sub _get_ssl_object {
+ my $self = shift;
+ my $ssl = ${*$self}{'_SSL_object'};
+ return IO::Socket::SSL->error("Undefined SSL object") unless($ssl);
+ return $ssl;
+}
+
+# default error for undefined arguments
+sub _invalid_object {
+ return IO::Socket::SSL->error("Undefined IO::Socket::SSL object");
+}
+
+
+sub pending {
+ my $ssl = shift()->_get_ssl_object || return;
+ return Net::SSLeay::pending($ssl);
+}
+
+sub start_SSL {
+ my ($class,$socket) = (shift,shift);
+ return $class->error("Not a socket") unless(ref($socket));
+ my $arg_hash = (ref($_[0]) eq 'HASH') ? $_[0] : {@_};
+ my %to = exists $arg_hash->{Timeout} ? ( Timeout => delete $arg_hash->{Timeout} ) :();
+ my $original_class = ref($socket);
+ my $original_fileno = (UNIVERSAL::can($socket, "fileno"))
+ ? $socket->fileno : CORE::fileno($socket);
+ return $class->error("Socket has no fileno") unless defined $original_fileno;
+
+ bless $socket, $class;
+ $socket->configure_SSL($arg_hash) or bless($socket, $original_class) && return;
+
+ ${*$socket}{'_SSL_fileno'} = $original_fileno;
+ ${*$socket}{'_SSL_ioclass_upgraded'} = $original_class;
+
+ my $start_handshake = $arg_hash->{SSL_startHandshake};
+ if ( ! defined($start_handshake) || $start_handshake ) {
+ # if we have no callback force blocking mode
+ DEBUG(2, "start handshake" );
+ my $blocking = $socket->blocking(1);
+ my $result = ${*$socket}{'_SSL_arguments'}{SSL_server}
+ ? $socket->accept_SSL(%to)
+ : $socket->connect_SSL(%to);
+ $socket->blocking(0) if !$blocking;
+ return $result ? $socket : (bless($socket, $original_class) && ());
+ } else {
+ DEBUG(2, "dont start handshake: $socket" );
+ return $socket; # just return upgraded socket
+ }
+
+}
+
+sub new_from_fd {
+ my ($class, $fd) = (shift,shift);
+ # Check for accidental inclusion of MODE in the argument list
+ if (length($_[0]) < 4) {
+ (my $mode = $_[0]) =~ tr/+<>//d;
+ shift unless length($mode);
+ }
+ my $handle = $ISA[0]->new_from_fd($fd, '+<')
+ || return($class->error("Could not create socket from file descriptor."));
+
+ # Annoying workaround for Perl 5.6.1 and below:
+ $handle = $ISA[0]->new_from_fd($handle, '+<');
+
+ return $class->start_SSL($handle, @_);
+}
+
+
+sub dump_peer_certificate {
+ my $ssl = shift()->_get_ssl_object || return;
+ return Net::SSLeay::dump_peer_certificate($ssl);
+}
+
+{
+ my %dispatcher = (
+ issuer => sub { Net::SSLeay::X509_NAME_oneline( Net::SSLeay::X509_get_issuer_name( shift )) },
+ subject => sub { Net::SSLeay::X509_NAME_oneline( Net::SSLeay::X509_get_subject_name( shift )) },
+ );
+ if ( $Net::SSLeay::VERSION >= 1.30 ) {
+ # I think X509_NAME_get_text_by_NID got added in 1.30
+ $dispatcher{commonName} = sub {
+ my $cn = Net::SSLeay::X509_NAME_get_text_by_NID(
+ Net::SSLeay::X509_get_subject_name( shift ), NID_CommonName);
+ $cn =~s{\0$}{}; # work around Bug in Net::SSLeay <1.33
+ $cn;
+ }
+ } else {
+ $dispatcher{commonName} = sub {
+ croak "you need at least Net::SSLeay version 1.30 for getting commonName"
+ }
+ }
+
+ if ( $Net::SSLeay::VERSION >= 1.33 ) {
+ # X509_get_subjectAltNames did not really work before
+ $dispatcher{subjectAltNames} = sub { Net::SSLeay::X509_get_subjectAltNames( shift ) };
+ } else {
+ $dispatcher{subjectAltNames} = sub {
+ croak "you need at least Net::SSLeay version 1.33 for getting subjectAltNames"
+ };
+ }
+
+ # alternative names
+ $dispatcher{authority} = $dispatcher{issuer};
+ $dispatcher{owner} = $dispatcher{subject};
+ $dispatcher{cn} = $dispatcher{commonName};
+
+ sub peer_certificate {
+ my ($self, $field) = @_;
+ my $ssl = $self->_get_ssl_object or return;
+
+ my $cert = ${*$self}{_SSL_certificate}
+ ||= Net::SSLeay::get_peer_certificate($ssl)
+ or return $self->error("Could not retrieve peer certificate");
+
+ if ($field) {
+ my $sub = $dispatcher{$field} or croak
+ "invalid argument for peer_certificate, valid are: ".join( " ",keys %dispatcher ).
+ "\nMaybe you need to upgrade your Net::SSLeay";
+ return $sub->($cert);
+ } else {
+ return $cert
+ }
+ }
+
+ # known schemes, possible attributes are:
+ # - wildcards_in_alt (0, 'leftmost', 'anywhere')
+ # - wildcards_in_cn (0, 'leftmost', 'anywhere')
+ # - check_cn (0, 'always', 'when_only')
+
+ my %scheme = (
+ # rfc 4513
+ ldap => {
+ wildcards_in_cn => 0,
+ wildcards_in_alt => 'leftmost',
+ check_cn => 'always',
+ },
+ # rfc 2818
+ http => {
+ wildcards_in_cn => 0,
+ wildcards_in_alt => 'anywhere',
+ check_cn => 'when_only',
+ },
+ # rfc 3207
+ # This is just a dumb guess
+ # RFC3207 itself just says, that the client should expect the
+ # domain name of the server in the certificate. It doesn't say
+ # anything about wildcards, so I forbid them. It doesn't say
+ # anything about alt names, but other documents show, that alt
+ # names should be possible. The check_cn value again is a guess.
+ # Fix the spec!
+ smtp => {
+ wildcards_in_cn => 0,
+ wildcards_in_alt => 0,
+ check_cn => 'always'
+ },
+ none => {}, # do not check
+ );
+
+ $scheme{www} = $scheme{http}; # alias
+ $scheme{xmpp} = $scheme{http}; # rfc 3920
+ $scheme{pop3} = $scheme{ldap}; # rfc 2595
+ $scheme{imap} = $scheme{ldap}; # rfc 2595
+ $scheme{acap} = $scheme{ldap}; # rfc 2595
+ $scheme{nntp} = $scheme{ldap}; # rfc 4642
+ $scheme{ftp} = $scheme{http}; # rfc 4217
+
+ # function to verify the hostname
+ #
+ # as every application protocol has its own rules to do this
+ # we provide some default rules as well as a user-defined
+ # callback
+
+ sub verify_hostname_of_cert {
+ my $identity = shift;
+ my $cert = shift;
+ my $scheme = shift || 'none';
+ if ( ! ref($scheme) ) {
+ DEBUG(3, "scheme=$scheme cert=$cert" );
+ $scheme = $scheme{$scheme} or croak "scheme $scheme not defined";
+ }
+
+ # get data from certificate
+ my $commonName = $dispatcher{cn}->($cert);
+ my @altNames = $dispatcher{subjectAltNames}->($cert);
+ DEBUG(3,"identity=$identity cn=$commonName alt=@altNames" );
+
+ if ( my $sub = $scheme->{callback} ) {
+ # use custom callback
+ return $sub->($identity,$commonName,@altNames);
+ }
+
+ # is the given hostname an IP address? Then we have to convert to network byte order [RFC791][RFC2460]
+
+ my ($ip4,$ip6);
+ if ( $identity =~m{:} ) {
+ # no IPv4 or hostname have ':' in it, try IPv6.
+ # make sure that Socket6 was loaded properly
+ UNIVERSAL::can( __PACKAGE__, 'inet_pton' ) or croak
+ q[Looks like IPv6 address, make sure that Socket6 is loaded or make "use IO::Socket::SSL 'inet6'];
+ $ip6 = inet_pton( $identity ) or croak "'$identity' is not IPv6, but neither IPv4 nor hostname";
+ } elsif ( $identity =~m{^\d+\.\d+\.\d+\.\d+$} ) {
+ # definitly no hostname, try IPv4
+ $ip4 = inet_aton( $identity ) or croak "'$identity' is not IPv4, but neither IPv6 nor hostname";
+ } else {
+ # assume hostname, check for umlauts etc
+ if ( $identity =~m{[^a-zA-Z0-9_.\-]} ) {
+ $identity =~m{\0} and croak("name '$identity' has \\0 byte");
+ $identity = idn_to_ascii($identity) or
+ croak "Warning: Given name '$identity' could not be converted to IDNA!";
+ }
+ }
+
+ # do the actual verification
+ my $check_name = sub {
+ my ($name,$identity,$wtyp) = @_;
+ $wtyp ||= '';
+ my $pattern;
+ ### IMPORTANT!
+ # we accept only a single wildcard and only for a single part of the FQDN
+ # e.g *.example.org does match www.example.org but not bla.www.example.org
+ # The RFCs are in this regard unspecific but we don't want to have to
+ # deal with certificates like *.com, *.co.uk or even *
+ # see also http://nils.toedtmann.net/pub/subjectAltName.txt
+ if ( $wtyp eq 'anywhere' and $name =~m{^([a-zA-Z0-9_\-]*)\*(.+)} ) {
+ $pattern = qr{^\Q$1\E[a-zA-Z0-9_\-]*\Q$2\E$}i;
+ } elsif ( $wtyp eq 'leftmost' and $name =~m{^\*(\..+)$} ) {
+ $pattern = qr{^[a-zA-Z0-9_\-]*\Q$1\E$}i;
+ } else {
+ $pattern = qr{^\Q$name\E$}i;
+ }
+ return $identity =~ $pattern;
+ };
+
+ my $alt_dnsNames = 0;
+ while (@altNames) {
+ my ($type, $name) = splice (@altNames, 0, 2);
+ if ( $type == GEN_IPADD ) {
+ # exakt match needed for IP
+ # $name is already packed format (inet_xton)
+ return 1 if
+ $ip6 ? $ip6 eq $name :
+ $ip4 ? $ip4 eq $name :
+ 0;
+
+ } elsif ( $type == GEN_DNS ) {
+ $name =~s/\s+$//; $name =~s/^\s+//;
+ $alt_dnsNames++;
+ $check_name->($name,$identity,$scheme->{wildcards_in_alt})
+ and return 1;
+ }
+ }
+
+ if ( $scheme->{check_cn} eq 'always' or
+ $scheme->{check_cn} eq 'when_only' and !$alt_dnsNames) {
+ $check_name->($commonName,$identity,$scheme->{wildcards_in_cn})
+ and return 1;
+ }
+
+ return 0; # no match
+ }
+}
+
+sub verify_hostname {
+ my $self = shift;
+ my $host = shift;
+ my $cert = $self->peer_certificate;
+ return verify_hostname_of_cert( $host,$cert,@_ );
+}
+
+
+sub get_cipher {
+ my $ssl = shift()->_get_ssl_object || return;
+ return Net::SSLeay::get_cipher($ssl);
+}
+
+sub errstr {
+ my $self = shift;
+ return ((ref($self) ? ${*$self}{'_SSL_last_err'} : $SSL_ERROR) or '');
+}
+
+sub fatal_ssl_error {
+ my $self = shift;
+ my $error_trap = ${*$self}{'_SSL_arguments'}->{'SSL_error_trap'};
+ $@ = $self->errstr;
+ if (defined $error_trap and ref($error_trap) eq 'CODE') {
+ $error_trap->($self, $self->errstr()."\n".$self->get_ssleay_error());
+ } else {
+ $self->kill_socket;
+ }
+ return;
+}
+
+sub get_ssleay_error {
+ #Net::SSLeay will print out the errors itself unless we explicitly
+ #undefine $Net::SSLeay::trace while running print_errs()
+ local $Net::SSLeay::trace;
+ return Net::SSLeay::print_errs('SSL error: ') || '';
+}
+
+sub error {
+ my ($self, $error, $destroy_socket) = @_;
+ $error .= Net::SSLeay::ERR_error_string(Net::SSLeay::ERR_get_error());
+ DEBUG(2, $error."\n".$self->get_ssleay_error());
+ $SSL_ERROR = dualvar( -1, $error );
+ ${*$self}{'_SSL_last_err'} = $SSL_ERROR if (ref($self));
+ return;
+}
+
+
+sub DESTROY {
+ my $self = shift || return;
+ $self->close(_SSL_in_DESTROY => 1, SSL_no_shutdown => 1)
+ if ${*$self}{'_SSL_opened'};
+ delete(${*$self}{'_SSL_ctx'});
+}
+
+
+#######Extra Backwards Compatibility Functionality#######
+sub socket_to_SSL { IO::Socket::SSL->start_SSL(@_); }
+sub socketToSSL { IO::Socket::SSL->start_SSL(@_); }
+
+sub issuer_name { return(shift()->peer_certificate("issuer")) }
+sub subject_name { return(shift()->peer_certificate("subject")) }
+sub get_peer_certificate { return shift() }
+
+sub context_init {
+ return($GLOBAL_CONTEXT_ARGS = (ref($_[0]) eq 'HASH') ? $_[0] : {@_});
+}
+
+sub set_default_context {
+ $GLOBAL_CONTEXT_ARGS->{'SSL_reuse_ctx'} = shift;
+}
+
+sub set_default_session_cache {
+ $GLOBAL_CONTEXT_ARGS->{SSL_session_cache} = shift;
+}
+
+sub set_ctx_defaults {
+ my %args = @_;
+ while ( my ($k,$v) = each %args ) {
+ $k =~s{^(SSL_)?}{SSL_};
+ $GLOBAL_CONTEXT_ARGS->{$k} = $v;
+ }
+}
+
+
+sub opened {
+ my $self = shift;
+ return IO::Handle::opened($self) && ${*$self}{'_SSL_opened'};
+}
+
+sub opening {
+ my $self = shift;
+ return ${*$self}{'_SSL_opening'};
+}
+
+sub want_read { shift->errstr == SSL_WANT_READ }
+sub want_write { shift->errstr == SSL_WANT_WRITE }
+
+
+#Redundant IO::Handle functionality
+sub getline { return(scalar shift->readline()) }
+sub getlines {
+ return(shift->readline()) if wantarray();
+ croak("Use of getlines() not allowed in scalar context");
+}
+
+#Useless IO::Handle functionality
+sub truncate { croak("Use of truncate() not allowed with SSL") }
+sub stat { croak("Use of stat() not allowed with SSL" ) }
+sub setbuf { croak("Use of setbuf() not allowed with SSL" ) }
+sub setvbuf { croak("Use of setvbuf() not allowed with SSL" ) }
+sub fdopen { croak("Use of fdopen() not allowed with SSL" ) }
+
+#Unsupported socket functionality
+sub ungetc { croak("Use of ungetc() not implemented in IO::Socket::SSL") }
+sub send { croak("Use of send() not implemented in IO::Socket::SSL; use print/printf/syswrite instead") }
+sub recv { croak("Use of recv() not implemented in IO::Socket::SSL; use read/sysread instead") }
+
+package IO::Socket::SSL::SSL_HANDLE;
+use strict;
+use vars qw($HAVE_WEAKREF);
+use Errno 'EBADF';
+
+BEGIN {
+ local ($@, $SIG{__DIE__});
+
+ #Use Scalar::Util or WeakRef if possible:
+ eval "use Scalar::Util qw(weaken isweak); 1" or
+ eval "use WeakRef";
+ $HAVE_WEAKREF = $@ ? 0 : 1;
+}
+
+
+sub TIEHANDLE {
+ my ($class, $handle) = @_;
+ weaken($handle) if $HAVE_WEAKREF;
+ bless \$handle, $class;
+}
+
+sub READ { ${shift()}->sysread(@_) }
+sub READLINE { ${shift()}->readline(@_) }
+sub GETC { ${shift()}->getc(@_) }
+
+sub PRINT { ${shift()}->print(@_) }
+sub PRINTF { ${shift()}->printf(@_) }
+sub WRITE { ${shift()}->syswrite(@_) }
+
+sub FILENO { ${shift()}->fileno(@_) }
+
+sub TELL { $! = EBADF; return -1 }
+sub BINMODE { return 0 } # not perfect, but better than not implementing the method
+
+sub CLOSE { #<---- Do not change this function!
+ my $ssl = ${$_[0]};
+ local @_;
+ $ssl->close();
+}
+
+
+package IO::Socket::SSL::SSL_Context;
+use Carp;
+use strict;
+
+my %CTX_CREATED_IN_THIS_THREAD;
+*DEBUG = *IO::Socket::SSL::DEBUG;
+
+# should be better taken from Net::SSLeay, but they are not (yet) defined there
+use constant SSL_MODE_ENABLE_PARTIAL_WRITE => 1;
+use constant SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER => 2;
+
+
+# Note that the final object will actually be a reference to the scalar
+# (C-style pointer) returned by Net::SSLeay::CTX_*_new() so that
+# it can be blessed.
+sub new {
+ my $class = shift;
+ #DEBUG( "$class @_" );
+ my $arg_hash = (ref($_[0]) eq 'HASH') ? $_[0] : {@_};
+
+ my $ctx_object = $arg_hash->{'SSL_reuse_ctx'};
+ if ($ctx_object) {
+ return $ctx_object if ($ctx_object->isa('IO::Socket::SSL::SSL_Context') and
+ $ctx_object->{context});
+
+ # The following "double entendre" applies only if someone passed
+ # in an IO::Socket::SSL object instead of an actual context.
+ return $ctx_object if ($ctx_object = ${*$ctx_object}{'_SSL_ctx'});
+ }
+
+ my $ctx;
+ foreach ($arg_hash->{'SSL_version'}) {
+ $ctx = /^sslv2$/i ? Net::SSLeay::CTX_v2_new() :
+ /^sslv3$/i ? Net::SSLeay::CTX_v3_new() :
+ /^tlsv1$/i ? Net::SSLeay::CTX_tlsv1_new() :
+ Net::SSLeay::CTX_new();
+ }
+
+ $ctx || return IO::Socket::SSL->error("SSL Context init failed");
+
+ Net::SSLeay::CTX_set_options($ctx, Net::SSLeay::OP_ALL());
+
+ # SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER makes syswrite return if at least one
+ # buffer was written and not block for the rest
+ # SSL_MODE_ENABLE_PARTIAL_WRITE can be necessary for non-blocking because we
+ # cannot guarantee, that the location of the buffer stays constant
+ Net::SSLeay::CTX_set_mode( $ctx,
+ SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER|SSL_MODE_ENABLE_PARTIAL_WRITE);
+
+
+ my $verify_mode = $arg_hash->{SSL_verify_mode};
+ if ( $verify_mode != Net::SSLeay::VERIFY_NONE() and
+ ! Net::SSLeay::CTX_load_verify_locations(
+ $ctx, $arg_hash->{SSL_ca_file} || '',$arg_hash->{SSL_ca_path} || '') ) {
+ if ( ! $arg_hash->{SSL_ca_file} && ! $arg_hash->{SSL_ca_path} ) {
+ carp("No certificate verification because neither SSL_ca_file nor SSL_ca_path known");
+ $verify_mode = Net::SSLeay::VERIFY_NONE();
+ } else {
+ return IO::Socket::SSL->error("Invalid certificate authority locations");
+ }
+ }
+
+ if ($arg_hash->{'SSL_check_crl'}) {
+ if (Net::SSLeay::OPENSSL_VERSION_NUMBER() >= 0x0090702f) {
+ Net::SSLeay::X509_STORE_set_flags(
+ Net::SSLeay::CTX_get_cert_store($ctx),
+ Net::SSLeay::X509_V_FLAG_CRL_CHECK()
+ );
+ if ($arg_hash->{'SSL_crl_file'}) {
+ my $bio = Net::SSLeay::BIO_new_file($arg_hash->{'SSL_crl_file'}, 'r');
+ my $crl = Net::SSLeay::PEM_read_bio_X509_CRL($bio);
+ if ( $crl ) {
+ Net::SSLeay::X509_STORE_add_crl(Net::SSLeay::CTX_get_cert_store($ctx), $crl);
+ } else {
+ return IO::Socket::SSL->error("Invalid certificate revocation list");
+ }
+ }
+ } else {
+ return IO::Socket::SSL->error("CRL not supported for OpenSSL < v0.9.7b");
+ }
+ }
+
+ if ($arg_hash->{'SSL_server'} || $arg_hash->{'SSL_use_cert'}) {
+ my $filetype = Net::SSLeay::FILETYPE_PEM();
+
+ if ($arg_hash->{'SSL_passwd_cb'}) {
+ Net::SSLeay::CTX_set_default_passwd_cb($ctx, $arg_hash->{'SSL_passwd_cb'});
+ }
+
+ if ( my $pkey= $arg_hash->{SSL_key} ) {
+ # binary, e.g. EVP_PKEY*
+ Net::SSLeay::CTX_use_PrivateKey($ctx, $pkey)
+ || return IO::Socket::SSL->error("Failed to use Private Key");
+ } elsif ( my $f = $arg_hash->{SSL_key_file} ) {
+ Net::SSLeay::CTX_use_PrivateKey_file($ctx, $f, $filetype)
+ || return IO::Socket::SSL->error("Failed to open Private Key");
+ }
+
+ if ( my $x509 = $arg_hash->{SSL_cert} ) {
+ # binary, e.g. X509*
+ # we habe either a single certificate or a list with
+ # a chain of certificates
+ my @x509 = ref($x509) eq 'ARRAY' ? @$x509: ($x509);
+ my $cert = shift @x509;
+ Net::SSLeay::CTX_use_certificate( $ctx,$cert )
+ || return IO::Socket::SSL->error("Failed to use Certificate");
+ foreach my $ca (@x509) {
+ Net::SSLeay::CTX_add_extra_chain_cert( $ctx,$ca )
+ || return IO::Socket::SSL->error("Failed to use Certificate");
+ }
+ } elsif ( my $f = $arg_hash->{SSL_cert_file} ) {
+ Net::SSLeay::CTX_use_certificate_chain_file($ctx, $f)
+ || return IO::Socket::SSL->error("Failed to open Certificate");
+ }
+
+ if ( my $dh = $arg_hash->{SSL_dh} ) {
+ # binary, e.g. DH*
+ Net::SSLeay::CTX_set_tmp_dh( $ctx,$dh )
+ || return IO::Socket::SSL->error( "Failed to set DH from SSL_dh" );
+ } elsif ( my $f = $arg_hash->{SSL_dh_file} ) {
+ my $bio = Net::SSLeay::BIO_new_file( $f,'r' )
+ || return IO::Socket::SSL->error( "Failed to open DH file $f" );
+ my $dh = Net::SSLeay::PEM_read_bio_DHparams($bio);
+ Net::SSLeay::BIO_free($bio);
+ $dh || return IO::Socket::SSL->error( "Failed to read PEM for DH from $f - wrong format?" );
+ my $rv = Net::SSLeay::CTX_set_tmp_dh( $ctx,$dh );
+ Net::SSLeay::DH_free( $dh );
+ $rv || return IO::Socket::SSL->error( "Failed to set DH from $f" );
+ }
+ }
+
+ my $verify_cb = $arg_hash->{SSL_verify_callback};
+ my $verify_callback = $verify_cb && sub {
+ my ($ok, $ctx_store) = @_;
+ my ($certname,$cert,$error);
+ if ($ctx_store) {
+ $cert = Net::SSLeay::X509_STORE_CTX_get_current_cert($ctx_store);
+ $error = Net::SSLeay::X509_STORE_CTX_get_error($ctx_store);
+ $certname = Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_issuer_name($cert)).
+ Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_subject_name($cert));
+ $error &&= Net::SSLeay::ERR_error_string($error);
+ }
+ DEBUG(3, "ok=$ok cert=$cert" );
+ return $verify_cb->($ok,$ctx_store,$certname,$error,$cert);
+ };
+
+ Net::SSLeay::CTX_set_verify($ctx, $verify_mode, $verify_callback);
+
+ $ctx_object = { context => $ctx };
+ $ctx_object->{has_verifycb} = 1 if $verify_callback;
+ DEBUG(3, "new ctx $ctx" );
+ $CTX_CREATED_IN_THIS_THREAD{$ctx} = 1;
+
+ if ( my $cache = $arg_hash->{SSL_session_cache} ) {
+ # use predefined cache
+ $ctx_object->{session_cache} = $cache
+ } elsif ( my $size = $arg_hash->{SSL_session_cache_size}) {
+ return IO::Socket::SSL->error("Session caches not supported for Net::SSLeay < v1.26")
+ if $Net::SSLeay::VERSION < 1.26;
+ $ctx_object->{session_cache} = IO::Socket::SSL::Session_Cache->new( $size );
+ }
+
+ return bless $ctx_object, $class;
+}
+
+
+sub session_cache {
+ my $ctx = shift;
+ my $cache = $ctx->{'session_cache'} || return;
+ my ($addr,$port,$session) = @_;
+ $port ||= $addr =~s{:(\w+)$}{} && $1; # host:port
+ my $key = "$addr:$port";
+ return defined($session)
+ ? $cache->add_session($key, $session)
+ : $cache->get_session($key);
+}
+
+sub has_session_cache {
+ return defined shift->{session_cache};
+}
+
+
+sub CLONE { %CTX_CREATED_IN_THIS_THREAD = (); }
+sub DESTROY {
+ my $self = shift;
+ if ( my $ctx = $self->{context} ) {
+ DEBUG( 3,"free ctx $ctx open=".join( " ",keys %CTX_CREATED_IN_THIS_THREAD ));
+ if ( %CTX_CREATED_IN_THIS_THREAD and
+ delete $CTX_CREATED_IN_THIS_THREAD{$ctx} ) {
+ # remove any verify callback for this context
+ if ( $self->{has_verifycb}) {
+ DEBUG( 3,"free ctx $ctx callback" );
+ Net::SSLeay::CTX_set_verify($ctx, 0,undef);
+ }
+ DEBUG( 3,"OK free ctx $ctx" );
+ Net::SSLeay::CTX_free($ctx);
+ }
+ }
+ delete(@{$self}{'context','session_cache'});
+}
+
+package IO::Socket::SSL::Session_Cache;
+use strict;
+
+sub new {
+ my ($class, $size) = @_;
+ $size>0 or return;
+ return bless { _maxsize => $size }, $class;
+}
+
+
+sub get_session {
+ my ($self, $key) = @_;
+ my $session = $self->{$key} || return;
+ return $session->{session} if ($self->{'_head'} eq $session);
+ $session->{prev}->{next} = $session->{next};
+ $session->{next}->{prev} = $session->{prev};
+ $session->{next} = $self->{'_head'};
+ $session->{prev} = $self->{'_head'}->{prev};
+ $self->{'_head'}->{prev} = $self->{'_head'}->{prev}->{next} = $session;
+ $self->{'_head'} = $session;
+ return $session->{session};
+}
+
+sub add_session {
+ my ($self, $key, $val) = @_;
+ return if ($key eq '_maxsize' or $key eq '_head');
+
+ if ((keys %$self) > $self->{'_maxsize'} + 1) {
+ my $last = $self->{'_head'}->{prev};
+ Net::SSLeay::SESSION_free($last->{session});
+ delete($self->{$last->{key}});
+ $self->{'_head'}->{prev} = $self->{'_head'}->{prev}->{prev};
+ delete($self->{'_head'}) if ($self->{'_maxsize'} == 1);
+ }
+
+ my $session = $self->{$key} = { session => $val, key => $key };
+
+ if ($self->{'_head'}) {
+ $session->{next} = $self->{'_head'};
+ $session->{prev} = $self->{'_head'}->{prev};
+ $self->{'_head'}->{prev}->{next} = $session;
+ $self->{'_head'}->{prev} = $session;
+ } else {
+ $session->{next} = $session->{prev} = $session;
+ }
+ $self->{'_head'} = $session;
+ return $session;
+}
+
+sub DESTROY {
+ my $self = shift;
+ delete(@{$self}{'_head','_maxsize'});
+ foreach my $key (keys %$self) {
+ Net::SSLeay::SESSION_free($self->{$key}->{session});
+ }
+}
+
+
+1;
+
+
+=head1 NAME
+
+IO::Socket::SSL -- Nearly transparent SSL encapsulation for IO::Socket::INET.
+
+=head1 SYNOPSIS
+
+ use strict;
+ use IO::Socket::SSL;
+
+ my $client = IO::Socket::SSL->new("www.example.com:https")
+ || warn "I encountered a problem: ".IO::Socket::SSL::errstr();
+ $client->verify_hostname( 'www.example.com','http' )
+ || die "hostname verification failed";
+
+ print $client "GET / HTTP/1.0\r\n\r\n";
+ print <$client>;
+
+
+=head1 DESCRIPTION
+
+This module is a true drop-in replacement for IO::Socket::INET that uses
+SSL to encrypt data before it is transferred to a remote server or
+client. IO::Socket::SSL supports all the extra features that one needs
+to write a full-featured SSL client or server application: multiple SSL contexts,
+cipher selection, certificate verification, and SSL version selection. As an
+extra bonus, it works perfectly with mod_perl.
+
+If you have never used SSL before, you should read the appendix labelled 'Using SSL'
+before attempting to use this module.
+
+If you have used this module before, read on, as versions 0.93 and above
+have several changes from the previous IO::Socket::SSL versions (especially
+see the note about return values).
+
+If you are using non-blocking sockets read on, as version 0.98 added better
+support for non-blocking.
+
+If you are trying to use it with threads see the BUGS section.
+
+=head1 METHODS
+
+IO::Socket::SSL inherits its methods from IO::Socket::INET, overriding them
+as necessary. If there is an SSL error, the method or operation will return an
+empty list (false in all contexts). The methods that have changed from the
+perspective of the user are re-documented here:
+
+=over 4
+
+=item B<new(...)>
+
+Creates a new IO::Socket::SSL object. You may use all the friendly options
+that came bundled with IO::Socket::INET, plus (optionally) the ones that follow:
+
+=over 2
+
+=item SSL_version
+
+Sets the version of the SSL protocol used to transmit data. The default is SSLv2/3,
+which auto-negotiates between SSLv2 and SSLv3. You may specify 'SSLv2', 'SSLv3', or
+'TLSv1' (case-insensitive) if you do not want this behavior.
+
+=item SSL_cipher_list
+
+If this option is set the cipher list for the connection will be set to the
+given value, e.g. something like 'ALL:!LOW:!EXP:!ADH'. Look into the OpenSSL
+documentation (L<http://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS>)
+for more details.
+If this option is not used the openssl builtin default is used which is suitable
+for most cases.
+
+=item SSL_use_cert
+
+If this is set, it forces IO::Socket::SSL to use a certificate and key, even if
+you are setting up an SSL client. If this is set to 0 (the default), then you will
+only need a certificate and key if you are setting up a server.
+
+SSL_use_cert will implicitly be set if SSL_server is set.
+For convinience it is also set if it was not given but a cert was given for use
+(SSL_cert_file or similar).
+
+=item SSL_server
+
+Use this, if the socket should be used as a server.
+If this is not explicitly set it is assumed, if Listen with given when creating
+the socket.
+
+=item SSL_key_file
+
+If your RSA private key is not in default place (F<certs/server-key.pem> for servers,
+F<certs/client-key.pem> for clients), then this is the option that you would use to
+specify a different location. Keys should be PEM formatted, and if they are
+encrypted, you will be prompted to enter a password before the socket is formed
+(unless you specified the SSL_passwd_cb option).
+
+=item SSL_key
+
+This is an EVP_PKEY* and can be used instead of SSL_key_file.
+Useful if you don't have your key in a file but create it dynamically or get it from
+a string (see openssl PEM_read_bio_PrivateKey etc for getting a EVP_PKEY* from
+a string).
+
+=item SSL_cert_file
+
+If your SSL certificate is not in the default place (F<certs/server-cert.pem> for servers,
+F<certs/client-cert.pem> for clients), then you should use this option to specify the
+location of your certificate. Note that a key and certificate are only required for an
+SSL server, so you do not need to bother with these trifling options should you be
+setting up an unauthenticated client.
+
+=item SSL_cert
+
+This is an X509* or an array of X509*.
+The first X509* is the internal representation of the certificate while the following
+ones are extra certificates. Useful if you create your certificate dynamically (like
+in a SSL intercepting proxy) or get it from a string (see openssl PEM_read_bio_X509 etc
+for getting a X509* from a string).
+
+=item SSL_dh_file
+
+If you want Diffie-Hellman key exchange you need to supply a suitable file here
+or use the SSL_dh parameter. See dhparam command in openssl for more information.
+
+=item SSL_dh
+
+Like SSL_dh_file, but instead of giving a file you use a preloaded or generated DH*.
+
+=item SSL_passwd_cb
+
+If your private key is encrypted, you might not want the default password prompt from
+Net::SSLeay. This option takes a reference to a subroutine that should return the
+password required to decrypt your private key.
+
+=item SSL_ca_file
+
+If you want to verify that the peer certificate has been signed by a reputable
+certificate authority, then you should use this option to locate the file
+containing the certificateZ<>(s) of the reputable certificate authorities if it is
+not already in the file F<certs/my-ca.pem>.
+
+=item SSL_ca_path
+
+If you are unusually friendly with the OpenSSL documentation, you might have set
+yourself up a directory containing several trusted certificates as separate files
+as well as an index of the certificates. If you want to use that directory for
+validation purposes, and that directory is not F<ca/>, then use this option to
+point IO::Socket::SSL to the right place to look.
+
+=item SSL_verify_mode
+
+This option sets the verification mode for the peer certificate. The default
+(0x00) does no authentication. You may combine 0x01 (verify peer), 0x02 (fail
+verification if no peer certificate exists; ignored for clients), and 0x04
+(verify client once) to change the default.
+See OpenSSL man page for SSL_CTX_set_verify for more information.
+
+=item SSL_verify_callback
+
+If you want to verify certificates yourself, you can pass a sub reference along
+with this parameter to do so. When the callback is called, it will be passed:
+1) a true/false value that indicates what OpenSSL thinks of the certificate,
+2) a C-style memory address of the certificate store,
+3) a string containing the certificate's issuer attributes and owner attributes, and
+4) a string containing any errors encountered (0 if no errors).
+The function should return 1 or 0, depending on whether it thinks the certificate
+is valid or invalid. The default is to let OpenSSL do all of the busy work.
+
+=item SSL_verifycn_scheme
+
+Set the scheme used to automatically verify the hostname of the peer.
+See the information about the verification schemes in B<verify_hostname>.
+The default is undef, e.g. to not automatically verify the hostname.
+
+=item SSL_verifycn_name
+
+Set the name which is used in verification of hostname. If SSL_verifycn_scheme
+is set and no SSL_verifycn_name is given it will try to use the PeerHost and
+PeerAddr settings and fail if no name caan be determined.
+
+Using PeerHost or PeerAddr works only if you create the connection directly
+with C<< IO::Socket::SSL->new >>, if an IO::Socket::INET object is upgraded
+with B<start_SSL> the name has to be given in B<SSL_verifycn_name>.
+
+=item SSL_check_crl
+
+If you want to verify that the peer certificate has not been revoked
+by the signing authority, set this value to true. OpenSSL will search
+for the CRL in your SSL_ca_path, or use the file specified by
+SSL_crl_file. See the Net::SSLeay documentation for more details.
+Note that this functionality appears to be broken with OpenSSL <
+v0.9.7b, so its use with lower versions will result in an error.
+
+=item SSL_crl_file
+
+If you want to specify the CRL file to be used, set this value to the
+pathname to be used. This must be used in addition to setting
+SSL_check_crl.
+
+=item SSL_reuse_ctx
+
+If you have already set the above options (SSL_version through SSL_check_crl;
+this does not include SSL_cipher_list yet) for a previous instance of
+IO::Socket::SSL, then you can reuse the SSL context of that instance by passing
+it as the value for the SSL_reuse_ctx parameter. You may also create a
+new instance of the IO::Socket::SSL::SSL_Context class, using any context options
+that you desire without specifying connection options, and pass that here instead.
+
+If you use this option, all other context-related options that you pass
+in the same call to new() will be ignored unless the context supplied was invalid.
+Note that, contrary to versions of IO::Socket::SSL below v0.90, a global SSL context
+will not be implicitly used unless you use the set_default_context() function.
+
+=item SSL_session_cache_size
+
+If you make repeated connections to the same host/port and the SSL renegotiation time
+is an issue, you can turn on client-side session caching with this option by specifying a
+positive cache size. For successive connections, pass the SSL_reuse_ctx option to
+the new() calls (or use set_default_context()) to make use of the cached sessions.
+The session cache size refers to the number of unique host/port pairs that can be
+stored at one time; the oldest sessions in the cache will be removed if new ones are
+added.
+
+=item SSL_session_cache
+
+Specifies session cache object which should be used instead of creating a new.
+Overrules SSL_session_cache_size.
+This option is useful if you want to reuse the cache, but not the rest of
+the context.
+
+A session cache object can be created using
+C<< IO::Socket::SSL::Session_Cache->new( cachesize ) >>.
+
+Use set_default_session_cache() to set a global cache object.
+
+=item SSL_error_trap
+
+When using the accept() or connect() methods, it may be the case that the
+actual socket connection works but the SSL negotiation fails, as in the case of
+an HTTP client connecting to an HTTPS server. Passing a subroutine ref attached
+to this parameter allows you to gain control of the orphaned socket instead of having it
+be closed forcibly. The subroutine, if called, will be passed two parameters:
+a reference to the socket on which the SSL negotiation failed and and the full
+text of the error message.
+
+=back
+
+=item B<close(...)>
+
+There are a number of nasty traps that lie in wait if you are not careful about using
+close(). The first of these will bite you if you have been using shutdown() on your
+sockets. Since the SSL protocol mandates that a SSL "close notify" message be
+sent before the socket is closed, a shutdown() that closes the socket's write channel
+will cause the close() call to hang. For a similar reason, if you try to close a
+copy of a socket (as in a forking server) you will affect the original socket as well.
+To get around these problems, call close with an object-oriented syntax
+(e.g. $socket->close(SSL_no_shutdown => 1))
+and one or more of the following parameters:
+
+=over 2
+
+=item SSL_no_shutdown
+
+If set to a true value, this option will make close() not use the SSL_shutdown() call
+on the socket in question so that the close operation can complete without problems
+if you have used shutdown() or are working on a copy of a socket.
+
+=item SSL_fast_shutdown
+
+If set to true only a unidirectional shutdown will be done, e.g. only the
+close_notify (see SSL_shutdown(3)) will be called. Otherwise a bidrectional
+shutdown will be done. If used within close() it defaults to true, if used
+within stop_SSL() it defaults to false.
+
+=item SSL_ctx_free
+
+If you want to make sure that the SSL context of the socket is destroyed when
+you close it, set this option to a true value.
+
+=back
+
+=item B<peek(...)>
+
+This function has exactly the same syntax as sysread(), and performs nearly the same
+task (reading data from the socket) but will not advance the read position so
+that successive calls to peek() with the same arguments will return the same results.
+This function requires OpenSSL 0.9.6a or later to work.
+
+
+=item B<pending()>
+
+This function will let you know how many bytes of data are immediately ready for reading
+from the socket. This is especially handy if you are doing reads on a blocking socket
+or just want to know if new data has been sent over the socket.
+
+
+=item B<get_cipher()>
+
+Returns the string form of the cipher that the IO::Socket::SSL object is using.
+
+=item B<dump_peer_certificate()>
+
+Returns a parsable string with select fields from the peer SSL certificate. This
+method directly returns the result of the dump_peer_certificate() method of Net::SSLeay.
+
+=item B<peer_certificate($field)>
+
+If a peer certificate exists, this function can retrieve values from it.
+If no field is given the internal representation of certificate from Net::SSLeay is
+returned.
+The following fields can be queried:
+
+=over 8
+
+=item authority (alias issuer)
+
+The certificate authority which signed the certificate.
+
+=item owner (alias subject)
+
+The owner of the certificate.
+
+=item commonName (alias cn) - only for Net::SSLeay version >=1.30
+
+The common name, usually the server name for SSL certificates.
+
+=item subjectAltNames - only for Net::SSLeay version >=1.33
+
+Alternative names for the subject, usually different names for the same
+server, like example.org, example.com, *.example.com.
+
+It returns a list of (typ,value) with typ GEN_DNS, GEN_IPADD etc (these
+constants are exported from IO::Socket::SSL).
+See Net::SSLeay::X509_get_subjectAltNames.
+
+=back
+
+=item B<verify_hostname($hostname,$scheme)>
+
+This verifies the given hostname against the peer certificate using the
+given scheme. Hostname is usually what you specify within the PeerAddr.
+
+Verification of hostname against a certificate is different between various
+applications and RFCs. Some scheme allow wildcards for hostnames, some only
+in subjectAltNames, and even their different wildcard schemes are possible.
+
+To ease the verification the following schemes are predefined:
+
+=over 8
+
+=item ldap (rfc4513), pop3,imap,acap (rfc2995), nntp (rfc4642)
+
+Simple wildcards in subjectAltNames are possible, e.g. *.example.org matches
+www.example.org but not lala.www.example.org. If nothing from subjectAltNames
+match it checks against the common name, but there are no wildcards allowed.
+
+=item http (rfc2818), alias is www
+
+Extended wildcards in subjectAltNames are possible, e.g. *.example.org or
+even www*.example.org. Wildcards in the common name are not allowed. The common
+name will be only checked if no names are given in subjectAltNames.
+
+=item smtp (rfc3207)
+
+This RFC doesn't say much useful about the verification so it just assumes
+that subjectAltNames are possible, but no wildcards are possible anywhere.
+
+=back
+
+The scheme can be given either by specifying the name for one of the above predefined
+schemes, by using a callback (see below) or by using a hash which can have the
+following keys and values:
+
+=over 8
+
+=item check_cn: 0|'always'|'when_only'
+
+Determines if the common name gets checked. If 'always' it will always be checked
+(like in ldap), if 'when_only' it will only be checked if no names are given in
+subjectAltNames (like in http), for any other values the common name will not be checked.
+
+=item wildcards_in_alt: 0|'leftmost'|'anywhere'
+
+Determines if and where wildcards in subjectAltNames are possible. If 'leftmost'
+only cases like *.example.org will be possible (like in ldap), for 'anywhere'
+www*.example.org is possible too (like http), dangerous things like but www.*.org
+or even '*' will not be allowed.
+
+=item wildcards_in_cn: 0|'leftmost'|'anywhere'
+
+Similar to wildcards_in_alt, but checks the common name. There is no predefined
+scheme which allows wildcards in common names.
+
+=back
+
+If you give a subroutine for verification it will be called with the arguments
+($hostname,$commonName,@subjectAltNames), where hostname is the name given for
+verification, commonName is the result from peer_certificate('cn') and
+subjectAltNames is the result from peer_certificate('subjectAltNames').
+
+=item B<errstr()>
+
+Returns the last error (in string form) that occurred. If you do not have a real
+object to perform this method on, call IO::Socket::SSL::errstr() instead.
+
+For read and write errors on non-blocking sockets, this method may include the string
+C<SSL wants a read first!> or C<SSL wants a write first!> meaning that the other side
+is expecting to read from or write to the socket and wants to be satisfied before you
+get to do anything. But with version 0.98 you are better comparing the global exported
+variable $SSL_ERROR against the exported symbols SSL_WANT_READ and SSL_WANT_WRITE.
+
+=item B<opened()>
+
+This returns false if the socket could not be opened, 1 if the socket could be opened
+and the SSL handshake was successful done and -1 if the underlying IO::Handle is open,
+but the SSL handshake failed.
+
+=item B<< IO::Socket::SSL->start_SSL($socket, ... ) >>
+
+This will convert a glob reference or a socket that you provide to an IO::Socket::SSL
+object. You may also pass parameters to specify context or connection options as with
+a call to new(). If you are using this function on an accept()ed socket, you must
+set the parameter "SSL_server" to 1, i.e. IO::Socket::SSL->start_SSL($socket, SSL_server => 1).
+If you have a class that inherits from IO::Socket::SSL and you want the $socket to be blessed
+into your own class instead, use MyClass->start_SSL($socket) to achieve the desired effect.
+
+Note that if start_SSL() fails in SSL negotiation, $socket will remain blessed in its
+original class. For non-blocking sockets you better just upgrade the socket to
+IO::Socket::SSL and call accept_SSL or connect_SSL and the upgraded object. To
+just upgrade the socket set B<SSL_startHandshake> explicitly to 0. If you call start_SSL
+w/o this parameter it will revert to blocking behavior for accept_SSL and connect_SSL.
+
+If given the parameter "Timeout" it will stop if after the timeout no SSL connection
+was established. This parameter is only used for blocking sockets, if it is not given the
+default Timeout from the underlying IO::Socket will be used.
+
+=item B<stop_SSL(...)>
+
+This is the opposite of start_SSL(), e.g. it will shutdown the SSL connection
+and return to the class before start_SSL(). It gets the same arguments as close(),
+in fact close() calls stop_SSL() (but without downgrading the class).
+
+Will return true if it suceeded and undef if failed. This might be the case for
+non-blocking sockets. In this case $! is set to EAGAIN and the ssl error to
+SSL_WANT_READ or SSL_WANT_WRITE. In this case the call should be retried again with
+the same arguments once the socket is ready is until it succeeds.
+
+=item B<< IO::Socket::SSL->new_from_fd($fd, ...) >>
+
+This will convert a socket identified via a file descriptor into an SSL socket.
+Note that the argument list does not include a "MODE" argument; if you supply one,
+it will be thoughtfully ignored (for compatibility with IO::Socket::INET). Instead,
+a mode of '+<' is assumed, and the file descriptor passed must be able to handle such
+I/O because the initial SSL handshake requires bidirectional communication.
+
+=item B<IO::Socket::SSL::set_default_context(...)>
+
+You may use this to make IO::Socket::SSL automatically re-use a given context (unless
+specifically overridden in a call to new()). It accepts one argument, which should
+be either an IO::Socket::SSL object or an IO::Socket::SSL::SSL_Context object. See
+the SSL_reuse_ctx option of new() for more details. Note that this sets the default
+context globally, so use with caution (esp. in mod_perl scripts).
+
+=item B<IO::Socket::SSL::set_default_session_cache(...)>
+
+You may use this to make IO::Socket::SSL automatically re-use a given session cache
+(unless specifically overridden in a call to new()). It accepts one argument, which should
+be an IO::Socket::SSL::Session_Cache object or similar (e.g something which implements
+get_session and add_session like IO::Socket::SSL::Session_Cache does).
+See the SSL_session_cache option of new() for more details. Note that this sets the default
+cache globally, so use with caution.
+
+=item B<IO::Socket::SSL::set_ctx_defaults(%args)>
+
+With this function one can set defaults for all SSL_* parameter used for creation of
+the context, like the SSL_verify* parameter.
+
+=over 8
+
+=item mode - set default SSL_verify_mode
+
+=item callback - set default SSL_verify_callback
+
+=item scheme - set default SSL_verifycn_scheme
+
+=item name - set default SSL_verifycn_name
+
+If not given and scheme is hash reference with key callback it will be set to 'unknown'
+
+=back
+
+=back
+
+The following methods are unsupported (not to mention futile!) and IO::Socket::SSL
+will emit a large CROAK() if you are silly enough to use them:
+
+=over 4
+
+=item truncate
+
+=item stat
+
+=item ungetc
+
+=item setbuf
+
+=item setvbuf
+
+=item fdopen
+
+=item send/recv
+
+Note that send() and recv() cannot be reliably trapped by a tied filehandle (such as
+that used by IO::Socket::SSL) and so may send unencrypted data over the socket. Object-oriented
+calls to these functions will fail, telling you to use the print/printf/syswrite
+and read/sysread families instead.
+
+=back
+
+=head1 IPv6
+
+Support for IPv6 with IO::Socket::SSL is expected to work and basic testing is done.
+If IO::Socket::INET6 is available it will automatically use it instead of
+IO::Socket::INET4.
+
+Please be aware of the associated problems: If you give a name as a host and the
+host resolves to both IPv6 and IPv4 it will try IPv6 first and if there is no IPv6
+connectivity it will fail.
+
+To avoid these problems you can either force IPv4 by specifying and AF_INET as the
+Domain (this is per socket) or load IO::Socket::SSL with the option 'inet4'
+(This is a global setting, e.g. affects all IO::Socket::SSL objects in the program).
+
+=head1 RETURN VALUES
+
+A few changes have gone into IO::Socket::SSL v0.93 and later with respect to
+return values. The behavior on success remains unchanged, but for I<all> functions,
+the return value on error is now an empty list. Therefore, the return value will be
+false in all contexts, but those who have been using the return values as arguments
+to subroutines (like C<mysub(IO::Socket::SSL(...)->new, ...)>) may run into problems.
+The moral of the story: I<always> check the return values of these functions before
+using them in any way that you consider meaningful.
+
+
+=head1 DEBUGGING
+
+If you are having problems using IO::Socket::SSL despite the fact that can recite backwards
+the section of this documentation labelled 'Using SSL', you should try enabling debugging. To
+specify the debug level, pass 'debug#' (where # is a number from 0 to 3) to IO::Socket::SSL
+when calling it.
+The debug level will also be propagated to Net::SSLeay::trace, see also L<Net::SSLeay>:
+
+=over 4
+
+=item use IO::Socket::SSL qw(debug0);
+
+No debugging (default).
+
+=item use IO::Socket::SSL qw(debug1);
+
+Print out errors from IO::Socket::SSL and ciphers from Net::SSLeay.
+
+=item use IO::Socket::SSL qw(debug2);
+
+Print also information about call flow from IO::Socket::SSL and progress
+information from Net::SSLeay.
+
+=item use IO::Socket::SSL qw(debug3);
+
+Print also some data dumps from IO::Socket::SSL and from Net::SSLeay.
+
+=back
+
+=head1 EXAMPLES
+
+See the 'example' directory.
+
+=head1 BUGS
+
+IO::Socket::SSL is not threadsafe.
+This is because IO::Socket::SSL is based on Net::SSLeay which
+uses a global object to access some of the API of openssl
+and is therefore not threadsafe.
+It might probably work if you don't use SSL_verify_callback and
+SSL_password_cb.
+
+IO::Socket::SSL does not work together with Storable::fd_retrieve/fd_store.
+See BUGS file for more information and how to work around the problem.
+
+Non-blocking and timeouts (which are based on non-blocking) are not
+supported on Win32, because the underlying IO::Socket::INET does not support
+non-blocking on this platform.
+
+=head1 LIMITATIONS
+
+IO::Socket::SSL uses Net::SSLeay as the shiny interface to OpenSSL, which is
+the shiny interface to the ugliness of SSL. As a result, you will need both Net::SSLeay
+and OpenSSL on your computer before using this module.
+
+If you have Scalar::Util (standard with Perl 5.8.0 and above) or WeakRef, IO::Socket::SSL
+sockets will auto-close when they go out of scope, just like IO::Socket::INET sockets. If
+you do not have one of these modules, then IO::Socket::SSL sockets will stay open until the
+program ends or you explicitly close them. This is due to the fact that a circular reference
+is required to make IO::Socket::SSL sockets act simultaneously like objects and glob references.
+
+=head1 DEPRECATIONS
+
+The following functions are deprecated and are only retained for compatibility:
+
+=over 2
+
+=item context_init()
+
+use the SSL_reuse_ctx option if you want to re-use a context
+
+
+=item socketToSSL() and socket_to_SSL()
+
+use IO::Socket::SSL->start_SSL() instead
+
+
+=item get_peer_certificate()
+
+use the peer_certificate() function instead.
+Used to return X509_Certificate with methods subject_name and issuer_name.
+Now simply returns $self which has these methods (although depreceated).
+
+=item issuer_name()
+
+use peer_certificate( 'issuer' ) instead
+
+=item subject_name()
+
+use peer_certificate( 'subject' ) instead
+
+=back
+
+The following classes have been removed:
+
+=over 2
+
+=item SSL_SSL
+
+(not that you should have been directly accessing this anyway):
+
+=item X509_Certificate
+
+(but get_peer_certificate() will still Do The Right Thing)
+
+=back
+
+=head1 SEE ALSO
+
+IO::Socket::INET, IO::Socket::INET6, Net::SSLeay.
+
+=head1 AUTHORS
+
+Steffen Ullrich, <steffen at genua.de> is the current maintainer.
+
+Peter Behroozi, <behrooz at fas.harvard.edu> (Note the lack of an "i" at the end of "behrooz")
+
+Marko Asplund, <marko.asplund at kronodoc.fi>, was the original author of IO::Socket::SSL.
+
+Patches incorporated from various people, see file Changes.
+
+=head1 COPYRIGHT
+
+Working support for non-blocking was added by Steffen Ullrich.
+
+The rewrite of this module is Copyright (C) 2002-2005 Peter Behroozi.
+
+The original versions of this module are Copyright (C) 1999-2002 Marko Asplund.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 Appendix: Using SSL
+
+If you are unfamiliar with the way OpenSSL works, good references may be found in
+both the book "Network Security with OpenSSL" (Oreilly & Assoc.) and the web site
+L<http://www.tldp.org/HOWTO/SSL-Certificates-HOWTO/>. Read on for a quick overview.
+
+=head2 The Long of It (Detail)
+
+The usual reason for using SSL is to keep your data safe. This means that not only
+do you have to encrypt the data while it is being transported over a network, but
+you also have to make sure that the right person gets the data. To accomplish this
+with SSL, you have to use certificates. A certificate closely resembles a
+Government-issued ID (at least in places where you can trust them). The ID contains some sort of
+identifying information such as a name and address, and is usually stamped with a seal
+of Government Approval. Theoretically, this means that you may trust the information on
+the card and do business with the owner of the card. The same ideas apply to SSL certificates,
+which have some identifying information and are "stamped" [most people refer to this as
+I<signing> instead] by someone (a Certificate Authority) who you trust will adequately
+verify the identifying information. In this case, because of some clever number theory,
+it is extremely difficult to falsify the stamping process. Another useful consequence
+of number theory is that the certificate is linked to the encryption process, so you may
+encrypt data (using information on the certificate) that only the certificate owner can
+decrypt.
+
+What does this mean for you? It means that at least one person in the party has to
+have an ID to get drinks :-). Seriously, it means that one of the people communicating
+has to have a certificate to ensure that your data is safe. For client/server
+interactions, the server must B<always> have a certificate. If the server wants to
+verify that the client is safe, then the client must also have a personal certificate.
+To verify that a certificate is safe, one compares the stamped "seal" [commonly called
+an I<encrypted digest/hash/signature>] on the certificate with the official "seal" of
+the Certificate Authority to make sure that they are the same. To do this, you will
+need the [unfortunately named] certificate of the Certificate Authority. With all these
+in hand, you can set up a SSL connection and be reasonably confident that no-one is
+reading your data.
+
+=head2 The Short of It (Summary)
+
+For servers, you will need to generate a cryptographic private key and a certificate
+request. You will need to send the certificate request to a Certificate Authority to
+get a real certificate back, after which you can start serving people. For clients,
+you will not need anything unless the server wants validation, in which case you will
+also need a private key and a real certificate. For more information about how to
+get these, see L<http://www.modssl.org/docs/2.8/ssl_faq.html#ToC24>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Socket/UNIX.pm b/Master/tlpkg/tlperl.straw/lib/IO/Socket/UNIX.pm
new file mode 100755
index 00000000000..baa092ba1fb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Socket/UNIX.pm
@@ -0,0 +1,143 @@
+# IO::Socket::UNIX.pm
+#
+# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package IO::Socket::UNIX;
+
+use strict;
+our(@ISA, $VERSION);
+use IO::Socket;
+use Carp;
+
+@ISA = qw(IO::Socket);
+$VERSION = "1.23";
+$VERSION = eval $VERSION;
+
+IO::Socket::UNIX->register_domain( AF_UNIX );
+
+sub new {
+ my $class = shift;
+ unshift(@_, "Peer") if @_ == 1;
+ return $class->SUPER::new(@_);
+}
+
+sub configure {
+ my($sock,$arg) = @_;
+ my($bport,$cport);
+
+ my $type = $arg->{Type} || SOCK_STREAM;
+
+ $sock->socket(AF_UNIX, $type, 0) or
+ return undef;
+
+ if(exists $arg->{Local}) {
+ my $addr = sockaddr_un($arg->{Local});
+ $sock->bind($addr) or
+ return undef;
+ }
+ if(exists $arg->{Listen} && $type != SOCK_DGRAM) {
+ $sock->listen($arg->{Listen} || 5) or
+ return undef;
+ }
+ elsif(exists $arg->{Peer}) {
+ my $addr = sockaddr_un($arg->{Peer});
+ $sock->connect($addr) or
+ return undef;
+ }
+
+ $sock;
+}
+
+sub hostpath {
+ @_ == 1 or croak 'usage: $sock->hostpath()';
+ my $n = $_[0]->sockname || return undef;
+ (sockaddr_un($n))[0];
+}
+
+sub peerpath {
+ @_ == 1 or croak 'usage: $sock->peerpath()';
+ my $n = $_[0]->peername || return undef;
+ (sockaddr_un($n))[0];
+}
+
+1; # Keep require happy
+
+__END__
+
+=head1 NAME
+
+IO::Socket::UNIX - Object interface for AF_UNIX domain sockets
+
+=head1 SYNOPSIS
+
+ use IO::Socket::UNIX;
+
+=head1 DESCRIPTION
+
+C<IO::Socket::UNIX> provides an object interface to creating and using sockets
+in the AF_UNIX domain. It is built upon the L<IO::Socket> interface and
+inherits all the methods defined by L<IO::Socket>.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ARGS] )
+
+Creates an C<IO::Socket::UNIX> object, which is a reference to a
+newly created symbol (see the C<Symbol> package). C<new>
+optionally takes arguments, these arguments are in key-value pairs.
+
+In addition to the key-value pairs accepted by L<IO::Socket>,
+C<IO::Socket::UNIX> provides.
+
+ Type Type of socket (eg SOCK_STREAM or SOCK_DGRAM)
+ Local Path to local fifo
+ Peer Path to peer fifo
+ Listen Create a listen socket
+
+If the constructor is only passed a single argument, it is assumed to
+be a C<Peer> specification.
+
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+As of VERSION 1.18 all IO::Socket objects have autoflush turned on
+by default. This was not the case with earlier releases.
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item hostpath()
+
+Returns the pathname to the fifo at the local end
+
+=item peerpath()
+
+Returns the pathanme to the fifo at the peer end
+
+=back
+
+=head1 SEE ALSO
+
+L<Socket>, L<IO::Socket>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/String.pm b/Master/tlpkg/tlperl.straw/lib/IO/String.pm
new file mode 100755
index 00000000000..4bc8e719601
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/String.pm
@@ -0,0 +1,551 @@
+package IO::String;
+
+# Copyright 1998-2005 Gisle Aas.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+require 5.005_03;
+use strict;
+use vars qw($VERSION $DEBUG $IO_CONSTANTS);
+$VERSION = "1.08"; # $Date: 2005/12/05 12:00:47 $
+
+use Symbol ();
+
+sub new
+{
+ my $class = shift;
+ my $self = bless Symbol::gensym(), ref($class) || $class;
+ tie *$self, $self;
+ $self->open(@_);
+ return $self;
+}
+
+sub open
+{
+ my $self = shift;
+ return $self->new(@_) unless ref($self);
+
+ if (@_) {
+ my $bufref = ref($_[0]) ? $_[0] : \$_[0];
+ $$bufref = "" unless defined $$bufref;
+ *$self->{buf} = $bufref;
+ }
+ else {
+ my $buf = "";
+ *$self->{buf} = \$buf;
+ }
+ *$self->{pos} = 0;
+ *$self->{lno} = 0;
+ return $self;
+}
+
+sub pad
+{
+ my $self = shift;
+ my $old = *$self->{pad};
+ *$self->{pad} = substr($_[0], 0, 1) if @_;
+ return "\0" unless defined($old) && length($old);
+ return $old;
+}
+
+sub dump
+{
+ require Data::Dumper;
+ my $self = shift;
+ print Data::Dumper->Dump([$self], ['*self']);
+ print Data::Dumper->Dump([*$self{HASH}], ['$self{HASH}']);
+ return;
+}
+
+sub TIEHANDLE
+{
+ print "TIEHANDLE @_\n" if $DEBUG;
+ return $_[0] if ref($_[0]);
+ my $class = shift;
+ my $self = bless Symbol::gensym(), $class;
+ $self->open(@_);
+ return $self;
+}
+
+sub DESTROY
+{
+ print "DESTROY @_\n" if $DEBUG;
+}
+
+sub close
+{
+ my $self = shift;
+ delete *$self->{buf};
+ delete *$self->{pos};
+ delete *$self->{lno};
+ undef *$self if $] eq "5.008"; # workaround for some bug
+ return 1;
+}
+
+sub opened
+{
+ my $self = shift;
+ return defined *$self->{buf};
+}
+
+sub binmode
+{
+ my $self = shift;
+ return 1 unless @_;
+ # XXX don't know much about layers yet :-(
+ return 0;
+}
+
+sub getc
+{
+ my $self = shift;
+ my $buf;
+ return $buf if $self->read($buf, 1);
+ return undef;
+}
+
+sub ungetc
+{
+ my $self = shift;
+ $self->setpos($self->getpos() - 1);
+ return 1;
+}
+
+sub eof
+{
+ my $self = shift;
+ return length(${*$self->{buf}}) <= *$self->{pos};
+}
+
+sub print
+{
+ my $self = shift;
+ if (defined $\) {
+ if (defined $,) {
+ $self->write(join($,, @_).$\);
+ }
+ else {
+ $self->write(join("",@_).$\);
+ }
+ }
+ else {
+ if (defined $,) {
+ $self->write(join($,, @_));
+ }
+ else {
+ $self->write(join("",@_));
+ }
+ }
+ return 1;
+}
+*printflush = \*print;
+
+sub printf
+{
+ my $self = shift;
+ print "PRINTF(@_)\n" if $DEBUG;
+ my $fmt = shift;
+ $self->write(sprintf($fmt, @_));
+ return 1;
+}
+
+
+my($SEEK_SET, $SEEK_CUR, $SEEK_END);
+
+sub _init_seek_constants
+{
+ if ($IO_CONSTANTS) {
+ require IO::Handle;
+ $SEEK_SET = &IO::Handle::SEEK_SET;
+ $SEEK_CUR = &IO::Handle::SEEK_CUR;
+ $SEEK_END = &IO::Handle::SEEK_END;
+ }
+ else {
+ $SEEK_SET = 0;
+ $SEEK_CUR = 1;
+ $SEEK_END = 2;
+ }
+}
+
+
+sub seek
+{
+ my($self,$off,$whence) = @_;
+ my $buf = *$self->{buf} || return 0;
+ my $len = length($$buf);
+ my $pos = *$self->{pos};
+
+ _init_seek_constants() unless defined $SEEK_SET;
+
+ if ($whence == $SEEK_SET) { $pos = $off }
+ elsif ($whence == $SEEK_CUR) { $pos += $off }
+ elsif ($whence == $SEEK_END) { $pos = $len + $off }
+ else { die "Bad whence ($whence)" }
+ print "SEEK(POS=$pos,OFF=$off,LEN=$len)\n" if $DEBUG;
+
+ $pos = 0 if $pos < 0;
+ $self->truncate($pos) if $pos > $len; # extend file
+ *$self->{pos} = $pos;
+ return 1;
+}
+
+sub pos
+{
+ my $self = shift;
+ my $old = *$self->{pos};
+ if (@_) {
+ my $pos = shift || 0;
+ my $buf = *$self->{buf};
+ my $len = $buf ? length($$buf) : 0;
+ $pos = $len if $pos > $len;
+ *$self->{pos} = $pos;
+ }
+ return $old;
+}
+
+sub getpos { shift->pos; }
+
+*sysseek = \&seek;
+*setpos = \&pos;
+*tell = \&getpos;
+
+
+
+sub getline
+{
+ my $self = shift;
+ my $buf = *$self->{buf} || return;
+ my $len = length($$buf);
+ my $pos = *$self->{pos};
+ return if $pos >= $len;
+
+ unless (defined $/) { # slurp
+ *$self->{pos} = $len;
+ return substr($$buf, $pos);
+ }
+
+ unless (length $/) { # paragraph mode
+ # XXX slow&lazy implementation using getc()
+ my $para = "";
+ my $eol = 0;
+ my $c;
+ while (defined($c = $self->getc)) {
+ if ($c eq "\n") {
+ $eol++;
+ next if $eol > 2;
+ }
+ elsif ($eol > 1) {
+ $self->ungetc($c);
+ last;
+ }
+ else {
+ $eol = 0;
+ }
+ $para .= $c;
+ }
+ return $para; # XXX wantarray
+ }
+
+ my $idx = index($$buf,$/,$pos);
+ if ($idx < 0) {
+ # return rest of it
+ *$self->{pos} = $len;
+ $. = ++ *$self->{lno};
+ return substr($$buf, $pos);
+ }
+ $len = $idx - $pos + length($/);
+ *$self->{pos} += $len;
+ $. = ++ *$self->{lno};
+ return substr($$buf, $pos, $len);
+}
+
+sub getlines
+{
+ die "getlines() called in scalar context\n" unless wantarray;
+ my $self = shift;
+ my($line, @lines);
+ push(@lines, $line) while defined($line = $self->getline);
+ return @lines;
+}
+
+sub READLINE
+{
+ goto &getlines if wantarray;
+ goto &getline;
+}
+
+sub input_line_number
+{
+ my $self = shift;
+ my $old = *$self->{lno};
+ *$self->{lno} = shift if @_;
+ return $old;
+}
+
+sub truncate
+{
+ my $self = shift;
+ my $len = shift || 0;
+ my $buf = *$self->{buf};
+ if (length($$buf) >= $len) {
+ substr($$buf, $len) = '';
+ *$self->{pos} = $len if $len < *$self->{pos};
+ }
+ else {
+ $$buf .= ($self->pad x ($len - length($$buf)));
+ }
+ return 1;
+}
+
+sub read
+{
+ my $self = shift;
+ my $buf = *$self->{buf};
+ return undef unless $buf;
+
+ my $pos = *$self->{pos};
+ my $rem = length($$buf) - $pos;
+ my $len = $_[1];
+ $len = $rem if $len > $rem;
+ return undef if $len < 0;
+ if (@_ > 2) { # read offset
+ substr($_[0],$_[2]) = substr($$buf, $pos, $len);
+ }
+ else {
+ $_[0] = substr($$buf, $pos, $len);
+ }
+ *$self->{pos} += $len;
+ return $len;
+}
+
+sub write
+{
+ my $self = shift;
+ my $buf = *$self->{buf};
+ return unless $buf;
+
+ my $pos = *$self->{pos};
+ my $slen = length($_[0]);
+ my $len = $slen;
+ my $off = 0;
+ if (@_ > 1) {
+ $len = $_[1] if $_[1] < $len;
+ if (@_ > 2) {
+ $off = $_[2] || 0;
+ die "Offset outside string" if $off > $slen;
+ if ($off < 0) {
+ $off += $slen;
+ die "Offset outside string" if $off < 0;
+ }
+ my $rem = $slen - $off;
+ $len = $rem if $rem < $len;
+ }
+ }
+ substr($$buf, $pos, $len) = substr($_[0], $off, $len);
+ *$self->{pos} += $len;
+ return $len;
+}
+
+*sysread = \&read;
+*syswrite = \&write;
+
+sub stat
+{
+ my $self = shift;
+ return unless $self->opened;
+ return 1 unless wantarray;
+ my $len = length ${*$self->{buf}};
+
+ return (
+ undef, undef, # dev, ino
+ 0666, # filemode
+ 1, # links
+ $>, # user id
+ $), # group id
+ undef, # device id
+ $len, # size
+ undef, # atime
+ undef, # mtime
+ undef, # ctime
+ 512, # blksize
+ int(($len+511)/512) # blocks
+ );
+}
+
+sub FILENO {
+ return undef; # XXX perlfunc says this means the file is closed
+}
+
+sub blocking {
+ my $self = shift;
+ my $old = *$self->{blocking} || 0;
+ *$self->{blocking} = shift if @_;
+ return $old;
+}
+
+my $notmuch = sub { return };
+
+*fileno = $notmuch;
+*error = $notmuch;
+*clearerr = $notmuch;
+*sync = $notmuch;
+*flush = $notmuch;
+*setbuf = $notmuch;
+*setvbuf = $notmuch;
+
+*untaint = $notmuch;
+*autoflush = $notmuch;
+*fcntl = $notmuch;
+*ioctl = $notmuch;
+
+*GETC = \&getc;
+*PRINT = \&print;
+*PRINTF = \&printf;
+*READ = \&read;
+*WRITE = \&write;
+*SEEK = \&seek;
+*TELL = \&getpos;
+*EOF = \&eof;
+*CLOSE = \&close;
+*BINMODE = \&binmode;
+
+
+sub string_ref
+{
+ my $self = shift;
+ return *$self->{buf};
+}
+*sref = \&string_ref;
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::String - Emulate file interface for in-core strings
+
+=head1 SYNOPSIS
+
+ use IO::String;
+ $io = IO::String->new;
+ $io = IO::String->new($var);
+ tie *IO, 'IO::String';
+
+ # read data
+ <$io>;
+ $io->getline;
+ read($io, $buf, 100);
+
+ # write data
+ print $io "string\n";
+ $io->print(@data);
+ syswrite($io, $buf, 100);
+
+ select $io;
+ printf "Some text %s\n", $str;
+
+ # seek
+ $pos = $io->getpos;
+ $io->setpos(0); # rewind
+ $io->seek(-30, -1);
+ seek($io, 0, 0);
+
+=head1 DESCRIPTION
+
+The C<IO::String> module provides the C<IO::File> interface for in-core
+strings. An C<IO::String> object can be attached to a string, and
+makes it possible to use the normal file operations for reading or
+writing data, as well as for seeking to various locations of the string.
+This is useful when you want to use a library module that only
+provides an interface to file handles on data that you have in a string
+variable.
+
+Note that perl-5.8 and better has built-in support for "in memory"
+files, which are set up by passing a reference instead of a filename
+to the open() call. The reason for using this module is that it
+makes the code backwards compatible with older versions of Perl.
+
+The C<IO::String> module provides an interface compatible with
+C<IO::File> as distributed with F<IO-1.20>, but the following methods
+are not available: new_from_fd, fdopen, format_write,
+format_page_number, format_lines_per_page, format_lines_left,
+format_name, format_top_name.
+
+The following methods are specific to the C<IO::String> class:
+
+=over 4
+
+=item $io = IO::String->new
+
+=item $io = IO::String->new( $string )
+
+The constructor returns a newly-created C<IO::String> object. It
+takes an optional argument, which is the string to read from or write
+into. If no $string argument is given, then an internal buffer
+(initially empty) is allocated.
+
+The C<IO::String> object returned is tied to itself. This means
+that you can use most Perl I/O built-ins on it too: readline, <>, getc,
+print, printf, syswrite, sysread, close.
+
+=item $io->open
+
+=item $io->open( $string )
+
+Attaches an existing IO::String object to some other $string, or
+allocates a new internal buffer (if no argument is given). The
+position is reset to 0.
+
+=item $io->string_ref
+
+Returns a reference to the string that is attached to
+the C<IO::String> object. Most useful when you let the C<IO::String>
+create an internal buffer to write into.
+
+=item $io->pad
+
+=item $io->pad( $char )
+
+Specifies the padding to use if
+the string is extended by either the seek() or truncate() methods. It
+is a single character and defaults to "\0".
+
+=item $io->pos
+
+=item $io->pos( $newpos )
+
+Yet another interface for reading and setting the current read/write
+position within the string (the normal getpos/setpos/tell/seek
+methods are also available). The pos() method always returns the
+old position, and if you pass it an argument it sets the new
+position.
+
+There is (deliberately) a difference between the setpos() and seek()
+methods in that seek() extends the string (with the specified
+padding) if you go to a location past the end, whereas setpos()
+just snaps back to the end. If truncate() is used to extend the string,
+then it works as seek().
+
+=back
+
+=head1 BUGS
+
+In Perl versions < 5.6, the TIEHANDLE interface was incomplete.
+If you use such a Perl, then seek(), tell(), eof(), fileno(), binmode() will
+not do anything on an C<IO::String> handle. See L<perltie> for
+details.
+
+=head1 SEE ALSO
+
+L<IO::File>, L<IO::Stringy>, L<perlfunc/open>
+
+=head1 COPYRIGHT
+
+Copyright 1998-2005 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Stringy.pm b/Master/tlpkg/tlperl.straw/lib/IO/Stringy.pm
new file mode 100755
index 00000000000..978e53caf3f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Stringy.pm
@@ -0,0 +1,446 @@
+package IO::Stringy;
+
+use vars qw($VERSION);
+$VERSION = "2.110";
+
+1;
+__END__
+
+
+=head1 NAME
+
+IO-stringy - I/O on in-core objects like strings and arrays
+
+
+=head1 SYNOPSIS
+
+ IO::
+ ::AtomicFile adpO Write a file which is updated atomically ERYQ
+ ::Lines bdpO I/O handle to read/write to array of lines ERYQ
+ ::Scalar RdpO I/O handle to read/write to a string ERYQ
+ ::ScalarArray RdpO I/O handle to read/write to array of scalars ERYQ
+ ::Wrap RdpO Wrap old-style FHs in standard OO interface ERYQ
+ ::WrapTie adpO Tie your handles & retain full OO interface ERYQ
+
+
+=head1 DESCRIPTION
+
+This toolkit primarily provides modules for performing both traditional
+and object-oriented i/o) on things I<other> than normal filehandles;
+in particular, L<IO::Scalar|IO::Scalar>, L<IO::ScalarArray|IO::ScalarArray>,
+and L<IO::Lines|IO::Lines>.
+
+In the more-traditional IO::Handle front, we
+have L<IO::AtomicFile|IO::AtomicFile>
+which may be used to painlessly create files which are updated
+atomically.
+
+And in the "this-may-prove-useful" corner, we have L<IO::Wrap|IO::Wrap>,
+whose exported wraphandle() function will clothe anything that's not
+a blessed object in an IO::Handle-like wrapper... so you can just
+use OO syntax and stop worrying about whether your function's caller
+handed you a string, a globref, or a FileHandle.
+
+
+=head1 WARNINGS
+
+Perl's TIEHANDLE spec was incomplete prior to 5.005_57;
+it was missing support for C<seek()>, C<tell()>, and C<eof()>.
+Attempting to use these functions with an IO::Scalar, IO::ScalarArray,
+IO::Lines, etc. B<will not work> prior to 5.005_57.
+None of the relevant methods will be invoked by Perl;
+and even worse, this kind of bug can lie dormant for a while.
+If you turn warnings on (via C<$^W> or C<perl -w>), and you see
+something like this...
+
+ seek() on unopened file
+
+...then you are probably trying to use one of these functions
+on one of our IO:: classes with an old Perl. The remedy is to simply
+use the OO version; e.g.:
+
+ $SH->seek(0,0); ### GOOD: will work on any 5.005
+ seek($SH,0,0); ### WARNING: will only work on 5.005_57 and beyond
+
+
+
+=head1 INSTALLATION
+
+
+=head2 Requirements
+
+As of version 2.x, this toolkit requires Perl 5.005 for
+the IO::Handle subclasses, and 5.005_57 or better is
+B<strongly> recommended. See L<"WARNINGS"> for details.
+
+
+=head2 Directions
+
+Most of you already know the drill...
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+For everyone else out there...
+if you've never installed Perl code before, or you're trying to use
+this in an environment where your sysadmin or ISP won't let you do
+interesting things, B<relax:> since this module contains no binary
+extensions, you can cheat. That means copying the directory tree
+under my "./lib" directory into someplace where your script can "see"
+it. For example, under Linux:
+
+ cp -r IO-stringy-1.234/lib/* /path/to/my/perl/
+
+Now, in your Perl code, do this:
+
+ use lib "/path/to/my/perl";
+ use IO::Scalar; ### or whatever
+
+Ok, now you've been told. At this point, anyone who whines about
+not being given enough information gets an unflattering haiku
+written about them in the next change log. I'll do it.
+Don't think I won't.
+
+
+
+=head1 VERSION
+
+$Id: Stringy.pm,v 1.3 2005/02/10 21:24:05 dfs Exp $
+
+
+
+=head1 TO DO
+
+=over 4
+
+=item (2000/08/02) Finalize $/ support
+
+Graham Barr submitted this patch half a I<year> ago;
+Like a moron, I lost his message under a ton of others,
+and only now have the experimental implementation done.
+
+Will the sudden sensitivity to $/ hose anyone out there?
+I'm worried, so you have to enable it explicitly in 1.x.
+It will be on by default in 2.x, though only IO::Scalar
+has been implemented.
+
+=item (2001/08/08) Remove IO::WrapTie from new IO:: classes
+
+It's not needed. Backwards compatibility could be maintained
+by having new_tie() be identical to new(). Heck, I'll bet
+that IO::WrapTie should be reimplemented so the returned
+object is just like an IO::Scalar in its use of globrefs.
+
+
+=back
+
+
+
+=head1 CHANGE LOG
+
+=over 4
+
+
+=item Version 2.110 (2005/02/10)
+
+Maintainership taken over by DSKOLL <dfs@roaringpenguin.com>
+
+Closed the following bugs at
+https://rt.cpan.org/NoAuth/Bugs.html?Dist=IO-stringy:
+
+=item
+
+2208 IO::ScalarArray->getline does not return undef for EOF if undef($/)
+
+=item
+
+7132 IO-stringy/Makefile.PL bug - name should be module name
+
+=item
+
+11249 IO::Scalar flush shouldn't return undef
+
+=item
+
+2172 $\ (output record separator) not respected
+
+=item
+
+8605 IO::InnerFile::seek() should return 1 on success
+
+=item
+
+4798 *.html in lib/
+
+=item
+
+4369 Improvement: handling of fixed-size reads in IO::Scalar
+
+(Actually, bug 4369 was closed in Version 2.109)
+
+=item Version 2.109 (2003/12/21)
+
+IO::Scalar::getline now works with ref to int.
+I<Thanks to Dominique Quatravaux for this patch.>
+
+
+=item Version 2.108 (2001/08/20)
+
+The terms-of-use have been placed in the distribution file "COPYING".
+Also, small documentation tweaks were made.
+
+
+=item Version 2.105 (2001/08/09)
+
+Added support for various seek() whences to IO::ScalarArray.
+
+Added support for consulting $/ in IO::Scalar and IO::ScalarArray.
+The old C<use_RS()> is not even an option.
+Unsupported record separators will cause a croak().
+
+Added a lot of regression tests to supoprt the above.
+
+Better on-line docs (hyperlinks to individual functions).
+
+
+=item Version 2.103 (2001/08/08)
+
+After sober consideration I have reimplemented IO::Scalar::print()
+so that it once again always seeks to the end of the string.
+Benchmarks show the new implementation to be just as fast as
+Juergen's contributed patch; until someone can convince me otherwise,
+the current, safer implementation stays.
+
+I thought more about giving IO::Scalar two separate handles,
+one for reading and one for writing, as suggested by Binkley.
+His points about what tell() and eof() return are, I think,
+show-stoppers for this feature. Even the manpages for stdio's fseek()
+seem to imply a I<single> file position indicator, not two.
+So I think I will take this off the TO DO list.
+B<Remedy:> you can always have two handles open on the same
+scalar, one which you only write to, and one which you only read from.
+That should give the same effect.
+
+
+=item Version 2.101 (2001/08/07)
+
+B<Alpha release.>
+This is the initial release of the "IO::Scalar and friends are
+now subclasses of IO::Handle". I'm flinging it against the wall.
+Please tell me if the banana sticks. When it does, the banana
+will be called 2.2x.
+
+First off, I<many many thanks to Doug Wilson>, who
+has provided an I<invaluable> service by patching IO::Scalar
+and friends so that they (1) inherit from IO::Handle, (2) automatically
+tie themselves so that the C<new()> objects can be used in native i/o
+constructs, and (3) doing it so that the whole damn thing passes
+its regression tests. As Doug knows, my globref Kung-Fu was not
+up to the task; he graciously provided the patches. This has earned
+him a seat at the L<Co-Authors|"AUTHOR"> table, and the
+right to have me address him as I<sensei>.
+
+Performance of IO::Scalar::print() has been improved by as much as 2x
+for lots of little prints, with the cost of forcing those
+who print-then-seek-then-print to explicitly seek to end-of-string
+before printing again.
+I<Thanks to Juergen Zeller for this patch.>
+
+Added the COPYING file, which had been missing from prior versions.
+I<Thanks to Albert Chin-A-Young for pointing this out.>
+
+IO::Scalar consults $/ by default (1.x ignored it by default).
+Yes, I still need to support IO::ScalarArray.
+
+
+=item Version 1.221 (2001/08/07)
+
+I threatened in L<"INSTALLATION"> to write an unflattering haiku
+about anyone who whined that I gave them insufficient information...
+but it turns out that I left out a crucial direction. D'OH!
+I<Thanks to David Beroff for the "patch" and the haiku...>
+
+ Enough info there?
+ Here's unflattering haiku:
+ Forgot the line, "make"! ;-)
+
+
+
+=item Version 1.220 (2001/04/03)
+
+Added untested SEEK, TELL, and EOF methods to IO::Scalar
+and IO::ScalarArray to support corresponding functions for
+tied filehandles: untested, because I'm still running 5.00556
+and Perl is complaining about "tell() on unopened file".
+I<Thanks to Graham Barr for the suggestion.>
+
+Removed not-fully-blank lines from modules; these were causing
+lots of POD-related warnings.
+I<Thanks to Nicolas Joly for the suggestion.>
+
+
+=item Version 1.219 (2001/02/23)
+
+IO::Scalar objects can now be made sensitive to $/ .
+Pains were taken to keep the fast code fast while adding this feature.
+I<Cheers to Graham Barr for submitting his patch;
+jeers to me for losing his email for 6 months.>
+
+
+=item Version 1.218 (2001/02/23)
+
+IO::Scalar has a new sysseek() method.
+I<Thanks again to Richard Jones.>
+
+New "TO DO" section, because people who submit patches/ideas should
+at least know that they're in the system... and that I won't lose
+their stuff. Please read it.
+
+New entries in L<"AUTHOR">.
+Please read those too.
+
+
+
+=item Version 1.216 (2000/09/28)
+
+B<IO::Scalar and IO::ScalarArray now inherit from IO::Handle.>
+I thought I'd remembered a problem with this ages ago, related to
+the fact that these IO:: modules don't have "real" filehandles,
+but the problem apparently isn't surfacing now.
+If you suddenly encounter Perl warnings during global destruction
+(especially if you're using tied filehandles), then please let me know!
+I<Thanks to B. K. Oxley (binkley) for this.>
+
+B<Nasty bug fixed in IO::Scalar::write().>
+Apparently, the offset and the number-of-bytes arguments were,
+for all practical purposes, I<reversed.> You were okay if
+you did all your writing with print(), but boy was I<this> a stupid bug!
+I<Thanks to Richard Jones for finding this one.
+For you, Rich, a double-length haiku:>
+
+ Newspaper headline
+ typeset by dyslexic man
+ loses urgency
+
+ BABY EATS FISH is
+ simply not equivalent
+ to FISH EATS BABY
+
+B<New sysread and syswrite methods for IO::Scalar.>
+I<Thanks again to Richard Jones for this.>
+
+
+=item Version 1.215 (2000/09/05)
+
+Added 'bool' overload to '""' overload, so object always evaluates
+to true. (Whew. Glad I caught this before it went to CPAN.)
+
+
+=item Version 1.214 (2000/09/03)
+
+Evaluating an IO::Scalar in a string context now yields
+the underlying string.
+I<Thanks to B. K. Oxley (binkley) for this.>
+
+
+=item Version 1.213 (2000/08/16)
+
+Minor documentation fixes.
+
+
+=item Version 1.212 (2000/06/02)
+
+Fixed IO::InnerFile incompatibility with Perl5.004.
+I<Thanks to many folks for reporting this.>
+
+
+=item Version 1.210 (2000/04/17)
+
+Added flush() and other no-op methods.
+I<Thanks to Doru Petrescu for suggesting this.>
+
+
+=item Version 1.209 (2000/03/17)
+
+Small bug fixes.
+
+
+=item Version 1.208 (2000/03/14)
+
+Incorporated a number of contributed patches and extensions,
+mostly related to speed hacks, support for "offset", and
+WRITE/CLOSE methods.
+I<Thanks to Richard Jones, Doru Petrescu, and many others.>
+
+
+
+=item Version 1.206 (1999/04/18)
+
+Added creation of ./testout when Makefile.PL is run.
+
+
+=item Version 1.205 (1999/01/15)
+
+Verified for Perl5.005.
+
+
+=item Version 1.202 (1998/04/18)
+
+New IO::WrapTie and IO::AtomicFile added.
+
+
+=item Version 1.110
+
+Added IO::WrapTie.
+
+
+=item Version 1.107
+
+Added IO::Lines, and made some bug fixes to IO::ScalarArray.
+Also, added getc().
+
+
+=item Version 1.105
+
+No real changes; just upgraded IO::Wrap to have a $VERSION string.
+
+=back
+
+
+
+
+=head1 AUTHOR
+
+=over 4
+
+=item Primary Maintainer
+
+David F. Skoll (F<dfs@roaringpenguin.com>).
+
+=item Original Author
+
+Eryq (F<eryq@zeegee.com>).
+President, ZeeGee Software Inc (F<http://www.zeegee.com>).
+
+=item Co-Authors
+
+For all their bug reports and patch submissions, the following
+are officially recognized:
+
+ Richard Jones
+ B. K. Oxley (binkley)
+ Doru Petrescu
+ Doug Wilson (for picking up the ball I dropped, and doing tie() right)
+
+
+=back
+
+Go to F<http://www.zeegee.com> for the latest downloads
+and on-line documentation for this module.
+
+Enjoy. Yell if it breaks.
+
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Adapter/Bunzip2.pm b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Adapter/Bunzip2.pm
new file mode 100755
index 00000000000..98677e3c09f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Adapter/Bunzip2.pm
@@ -0,0 +1,112 @@
+package IO::Uncompress::Adapter::Bunzip2;
+
+use strict;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.024 qw(:Status);
+
+use Compress::Raw::Bzip2 2.024 ;
+
+our ($VERSION, @ISA);
+$VERSION = '2.024';
+
+sub mkUncompObject
+{
+ my $small = shift || 0;
+ my $verbosity = shift || 0;
+
+ my ($inflate, $status) = new Compress::Raw::Bunzip2(1, 1, $small, $verbosity, 1);
+
+ return (undef, "Could not create Inflation object: $status", $status)
+ if $status != BZ_OK ;
+
+ return bless {'Inf' => $inflate,
+ 'CompSize' => 0,
+ 'UnCompSize' => 0,
+ 'Error' => '',
+ 'ConsumesInput' => 1,
+ } ;
+
+}
+
+sub uncompr
+{
+ my $self = shift ;
+ my $from = shift ;
+ my $to = shift ;
+ my $eof = shift ;
+
+ my $inf = $self->{Inf};
+
+ my $status = $inf->bzinflate($from, $to);
+ $self->{ErrorNo} = $status;
+
+ if ($status != BZ_OK && $status != BZ_STREAM_END )
+ {
+ $self->{Error} = "Inflation Error: $status";
+ return STATUS_ERROR;
+ }
+
+
+ return STATUS_OK if $status == BZ_OK ;
+ return STATUS_ENDSTREAM if $status == BZ_STREAM_END ;
+ return STATUS_ERROR ;
+}
+
+
+sub reset
+{
+ my $self = shift ;
+
+ my ($inf, $status) = new Compress::Raw::Bunzip2();
+ $self->{ErrorNo} = ($status == BZ_OK) ? 0 : $status ;
+
+ if ($status != BZ_OK)
+ {
+ $self->{Error} = "Cannot create Inflate object: $status";
+ return STATUS_ERROR;
+ }
+
+ $self->{Inf} = $inf;
+
+ return STATUS_OK ;
+}
+
+sub compressedBytes
+{
+ my $self = shift ;
+ $self->{Inf}->compressedBytes();
+}
+
+sub uncompressedBytes
+{
+ my $self = shift ;
+ $self->{Inf}->uncompressedBytes();
+}
+
+sub crc32
+{
+ my $self = shift ;
+ #$self->{Inf}->crc32();
+}
+
+sub adler32
+{
+ my $self = shift ;
+ #$self->{Inf}->adler32();
+}
+
+sub sync
+{
+ my $self = shift ;
+ #( $self->{Inf}->inflateSync(@_) == BZ_OK)
+ # ? STATUS_OK
+ # : STATUS_ERROR ;
+}
+
+
+1;
+
+__END__
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Adapter/Identity.pm b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Adapter/Identity.pm
new file mode 100755
index 00000000000..27de6e0f36b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Adapter/Identity.pm
@@ -0,0 +1,105 @@
+package IO::Uncompress::Adapter::Identity;
+
+use warnings;
+use strict;
+use bytes;
+
+use IO::Compress::Base::Common 2.024 qw(:Status);
+
+our ($VERSION);
+
+$VERSION = '2.024';
+
+use Compress::Raw::Zlib 2.024 ();
+
+sub mkUncompObject
+{
+ my $crc32 = 1; #shift ;
+ my $adler32 = shift;
+
+ bless { 'CompSize' => 0,
+ 'UnCompSize' => 0,
+ 'wantCRC32' => $crc32,
+ 'CRC32' => Compress::Raw::Zlib::crc32(''),
+ 'wantADLER32'=> $adler32,
+ 'ADLER32' => Compress::Raw::Zlib::adler32(''),
+ 'ConsumesInput' => 1,
+
+ } ;
+}
+
+sub uncompr
+{
+ my $self = shift;
+ my $eof = $_[2];
+
+ if (defined ${ $_[0] } && length ${ $_[0] }) {
+ $self->{CompSize} += length ${ $_[0] } ;
+ $self->{UnCompSize} = $self->{CompSize} ;
+
+ $self->{CRC32} = Compress::Raw::Zlib::crc32($_[0], $self->{CRC32})
+ if $self->{wantCRC32};
+
+ $self->{ADLER32} = Compress::Zlib::adler32($_[0], $self->{ADLER32})
+ if $self->{wantADLER32};
+
+ ${ $_[1] } .= ${ $_[0] };
+ ${ $_[0] } = "";
+ }
+
+ return STATUS_ENDSTREAM if $eof;
+ return STATUS_OK ;
+}
+
+sub reset
+{
+ my $self = shift;
+
+ $self->{CompSize} = 0;
+ $self->{UnCompSize} = 0;
+ $self->{CRC32} = Compress::Raw::Zlib::crc32('');
+ $self->{ADLER32} = Compress::Raw::Zlib::adler32('');
+
+ return STATUS_OK ;
+}
+
+
+#sub count
+#{
+# my $self = shift ;
+# return $self->{UnCompSize} ;
+#}
+
+sub compressedBytes
+{
+ my $self = shift ;
+ return $self->{UnCompSize} ;
+}
+
+sub uncompressedBytes
+{
+ my $self = shift ;
+ return $self->{UnCompSize} ;
+}
+
+sub sync
+{
+ return STATUS_OK ;
+}
+
+sub crc32
+{
+ my $self = shift ;
+ return $self->{CRC32};
+}
+
+sub adler32
+{
+ my $self = shift ;
+ return $self->{ADLER32};
+}
+
+
+1;
+
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Adapter/Inflate.pm b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Adapter/Inflate.pm
new file mode 100755
index 00000000000..aac1e413ffe
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Adapter/Inflate.pm
@@ -0,0 +1,158 @@
+package IO::Uncompress::Adapter::Inflate;
+
+use strict;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.024 qw(:Status);
+use Compress::Raw::Zlib 2.024 qw(Z_OK Z_BUF_ERROR Z_STREAM_END Z_FINISH MAX_WBITS);
+
+our ($VERSION);
+$VERSION = '2.024';
+
+
+
+sub mkUncompObject
+{
+ my $crc32 = shift || 1;
+ my $adler32 = shift || 1;
+ my $scan = shift || 0;
+
+ my $inflate ;
+ my $status ;
+
+ if ($scan)
+ {
+ ($inflate, $status) = new Compress::Raw::Zlib::InflateScan
+ #LimitOutput => 1,
+ CRC32 => $crc32,
+ ADLER32 => $adler32,
+ WindowBits => - MAX_WBITS ;
+ }
+ else
+ {
+ ($inflate, $status) = new Compress::Raw::Zlib::Inflate
+ AppendOutput => 1,
+ LimitOutput => 1,
+ CRC32 => $crc32,
+ ADLER32 => $adler32,
+ WindowBits => - MAX_WBITS ;
+ }
+
+ return (undef, "Could not create Inflation object: $status", $status)
+ if $status != Z_OK ;
+
+ return bless {'Inf' => $inflate,
+ 'CompSize' => 0,
+ 'UnCompSize' => 0,
+ 'Error' => '',
+ 'ConsumesInput' => 1,
+ } ;
+
+}
+
+sub uncompr
+{
+ my $self = shift ;
+ my $from = shift ;
+ my $to = shift ;
+ my $eof = shift ;
+
+ my $inf = $self->{Inf};
+
+ my $status = $inf->inflate($from, $to, $eof);
+ $self->{ErrorNo} = $status;
+
+ if ($status != Z_OK && $status != Z_STREAM_END && $status != Z_BUF_ERROR)
+ {
+ $self->{Error} = "Inflation Error: $status";
+ return STATUS_ERROR;
+ }
+
+ return STATUS_OK if $status == Z_BUF_ERROR ; # ???
+ return STATUS_OK if $status == Z_OK ;
+ return STATUS_ENDSTREAM if $status == Z_STREAM_END ;
+ return STATUS_ERROR ;
+}
+
+sub reset
+{
+ my $self = shift ;
+ $self->{Inf}->inflateReset();
+
+ return STATUS_OK ;
+}
+
+#sub count
+#{
+# my $self = shift ;
+# $self->{Inf}->inflateCount();
+#}
+
+sub crc32
+{
+ my $self = shift ;
+ $self->{Inf}->crc32();
+}
+
+sub compressedBytes
+{
+ my $self = shift ;
+ $self->{Inf}->compressedBytes();
+}
+
+sub uncompressedBytes
+{
+ my $self = shift ;
+ $self->{Inf}->uncompressedBytes();
+}
+
+sub adler32
+{
+ my $self = shift ;
+ $self->{Inf}->adler32();
+}
+
+sub sync
+{
+ my $self = shift ;
+ ( $self->{Inf}->inflateSync(@_) == Z_OK)
+ ? STATUS_OK
+ : STATUS_ERROR ;
+}
+
+
+sub getLastBlockOffset
+{
+ my $self = shift ;
+ $self->{Inf}->getLastBlockOffset();
+}
+
+sub getEndOffset
+{
+ my $self = shift ;
+ $self->{Inf}->getEndOffset();
+}
+
+sub resetLastBlockByte
+{
+ my $self = shift ;
+ $self->{Inf}->resetLastBlockByte(@_);
+}
+
+sub createDeflateStream
+{
+ my $self = shift ;
+ my $deflate = $self->{Inf}->createDeflateStream(@_);
+ return bless {'Def' => $deflate,
+ 'CompSize' => 0,
+ 'UnCompSize' => 0,
+ 'Error' => '',
+ }, 'IO::Compress::Adapter::Deflate';
+}
+
+1;
+
+
+__END__
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/AnyInflate.pm b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/AnyInflate.pm
new file mode 100755
index 00000000000..68038f5d374
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/AnyInflate.pm
@@ -0,0 +1,987 @@
+package IO::Uncompress::AnyInflate ;
+
+# for RFC1950, RFC1951 or RFC1952
+
+use strict;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.024 qw(createSelfTiedObject);
+
+use IO::Uncompress::Adapter::Inflate 2.024 ();
+
+
+use IO::Uncompress::Base 2.024 ;
+use IO::Uncompress::Gunzip 2.024 ;
+use IO::Uncompress::Inflate 2.024 ;
+use IO::Uncompress::RawInflate 2.024 ;
+use IO::Uncompress::Unzip 2.024 ;
+
+require Exporter ;
+
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyInflateError);
+
+$VERSION = '2.024';
+$AnyInflateError = '';
+
+@ISA = qw( Exporter IO::Uncompress::Base );
+@EXPORT_OK = qw( $AnyInflateError anyinflate ) ;
+%EXPORT_TAGS = %IO::Uncompress::Base::DEFLATE_CONSTANTS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+Exporter::export_ok_tags('all');
+
+# TODO - allow the user to pick a set of the three formats to allow
+# or just assume want to auto-detect any of the three formats.
+
+sub new
+{
+ my $class = shift ;
+ my $obj = createSelfTiedObject($class, \$AnyInflateError);
+ $obj->_create(undef, 0, @_);
+}
+
+sub anyinflate
+{
+ my $obj = createSelfTiedObject(undef, \$AnyInflateError);
+ return $obj->_inf(@_) ;
+}
+
+sub getExtraParams
+{
+ use IO::Compress::Base::Common 2.024 qw(:Parse);
+ return ( 'RawInflate' => [1, 1, Parse_boolean, 0] ) ;
+}
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ # any always needs both crc32 and adler32
+ $got->value('CRC32' => 1);
+ $got->value('ADLER32' => 1);
+
+ return 1;
+}
+
+sub mkUncomp
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Inflate::mkUncompObject();
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ *$self->{Uncomp} = $obj;
+
+ my @possible = qw( Inflate Gunzip Unzip );
+ unshift @possible, 'RawInflate'
+ if 1 || $got->value('RawInflate');
+
+ my $magic = $self->ckMagic( @possible );
+
+ if ($magic) {
+ *$self->{Info} = $self->readHeader($magic)
+ or return undef ;
+
+ return 1;
+ }
+
+ return 0 ;
+}
+
+
+
+sub ckMagic
+{
+ my $self = shift;
+ my @names = @_ ;
+
+ my $keep = ref $self ;
+ for my $class ( map { "IO::Uncompress::$_" } @names)
+ {
+ bless $self => $class;
+ my $magic = $self->ckMagic();
+
+ if ($magic)
+ {
+ #bless $self => $class;
+ return $magic ;
+ }
+
+ $self->pushBack(*$self->{HeaderPending}) ;
+ *$self->{HeaderPending} = '' ;
+ }
+
+ bless $self => $keep;
+ return undef;
+}
+
+1 ;
+
+__END__
+
+
+=head1 NAME
+
+IO::Uncompress::AnyInflate - Uncompress zlib-based (zip, gzip) file/buffer
+
+=head1 SYNOPSIS
+
+ use IO::Uncompress::AnyInflate qw(anyinflate $AnyInflateError) ;
+
+ my $status = anyinflate $input => $output [,OPTS]
+ or die "anyinflate failed: $AnyInflateError\n";
+
+ my $z = new IO::Uncompress::AnyInflate $input [OPTS]
+ or die "anyinflate failed: $AnyInflateError\n";
+
+ $status = $z->read($buffer)
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+ $line = $z->getline()
+ $char = $z->getc()
+ $char = $z->ungetc()
+ $char = $z->opened()
+
+ $status = $z->inflateSync()
+
+ $data = $z->trailingData()
+ $status = $z->nextStream()
+ $data = $z->getHeaderInfo()
+ $z->tell()
+ $z->seek($position, $whence)
+ $z->binmode()
+ $z->fileno()
+ $z->eof()
+ $z->close()
+
+ $AnyInflateError ;
+
+ # IO::File mode
+
+ <$z>
+ read($z, $buffer);
+ read($z, $buffer, $length);
+ read($z, $buffer, $length, $offset);
+ tell($z)
+ seek($z, $position, $whence)
+ binmode($z)
+ fileno($z)
+ eof($z)
+ close($z)
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows the reading of
+files/buffers that have been compressed in a number of formats that use the
+zlib compression library.
+
+The formats supported are
+
+=over 5
+
+=item RFC 1950
+
+=item RFC 1951 (optionally)
+
+=item gzip (RFC 1952)
+
+=item zip
+
+=back
+
+The module will auto-detect which, if any, of the supported
+compression formats is being used.
+
+=head1 Functional Interface
+
+A top-level function, C<anyinflate>, is provided to carry out
+"one-shot" uncompression between buffers and/or files. For finer
+control over the uncompression process, see the L</"OO Interface">
+section.
+
+ use IO::Uncompress::AnyInflate qw(anyinflate $AnyInflateError) ;
+
+ anyinflate $input => $output [,OPTS]
+ or die "anyinflate failed: $AnyInflateError\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 anyinflate $input => $output [, OPTS]
+
+C<anyinflate> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the compressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is uncompressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<anyinflate> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+uncompressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the uncompressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the uncompressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the uncompressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the uncompressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<anyinflate> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple compressed files/buffers and C<$output> is
+a single file/buffer, after uncompression C<$output> will contain a
+concatenation of all the uncompressed data from each of the input
+files/buffers.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<anyinflate>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<anyinflate> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<anyinflate> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeOut => 0|1 >>
+
+When writing to a file or filehandle, set C<binmode> before writing to the
+file.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+The behaviour of this option is dependent on the type of output data
+stream.
+
+=over 5
+
+=item * A Buffer
+
+If C<Append> is enabled, all uncompressed data will be append to the end of
+the output buffer. Otherwise the output buffer will be cleared before any
+uncompressed data is written to it.
+
+=item * A Filename
+
+If C<Append> is enabled, the file will be opened in append mode. Otherwise
+the contents of the file, if any, will be truncated before any uncompressed
+data is written to it.
+
+=item * A Filehandle
+
+If C<Append> is enabled, the filehandle will be positioned to the end of
+the file via a call to C<seek> before any uncompressed data is
+written to it. Otherwise the file pointer will not be moved.
+
+=back
+
+When C<Append> is specified, and set to true, it will I<append> all uncompressed
+data to the output data stream.
+
+So when the output is a filehandle it will carry out a seek to the eof
+before writing any uncompressed data. If the output is a filename, it will be opened for
+appending. If the output is a buffer, all uncompressed data will be appened to
+the existing buffer.
+
+Conversely when C<Append> is not specified, or it is present and is set to
+false, it will operate as follows.
+
+When the output is a filename, it will truncate the contents of the file
+before writing any uncompressed data. If the output is a filehandle
+its position will not be changed. If the output is a buffer, it will be
+wiped before any uncompressed data is output.
+
+Defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+If the input file/buffer contains multiple compressed data streams, this
+option will uncompress the whole lot as a single data stream.
+
+Defaults to 0.
+
+=item C<< TrailingData => $scalar >>
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option.
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt.Compressed> and write the
+uncompressed data to the file C<file1.txt>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::AnyInflate qw(anyinflate $AnyInflateError) ;
+
+ my $input = "file1.txt.Compressed";
+ my $output = "file1.txt";
+ anyinflate $input => $output
+ or die "anyinflate failed: $AnyInflateError\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+uncompressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::AnyInflate qw(anyinflate $AnyInflateError) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt.Compressed"
+ or die "Cannot open 'file1.txt.Compressed': $!\n" ;
+ my $buffer ;
+ anyinflate $input => \$buffer
+ or die "anyinflate failed: $AnyInflateError\n";
+
+To uncompress all files in the directory "/my/home" that match "*.txt.Compressed" and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::AnyInflate qw(anyinflate $AnyInflateError) ;
+
+ anyinflate '</my/home/*.txt.Compressed>' => '</my/home/#1.txt>'
+ or die "anyinflate failed: $AnyInflateError\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::AnyInflate qw(anyinflate $AnyInflateError) ;
+
+ for my $input ( glob "/my/home/*.txt.Compressed" )
+ {
+ my $output = $input;
+ $output =~ s/.Compressed// ;
+ anyinflate $input => $output
+ or die "Error compressing '$input': $AnyInflateError\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for IO::Uncompress::AnyInflate is shown below
+
+ my $z = new IO::Uncompress::AnyInflate $input [OPTS]
+ or die "IO::Uncompress::AnyInflate failed: $AnyInflateError\n";
+
+Returns an C<IO::Uncompress::AnyInflate> object on success and undef on failure.
+The variable C<$AnyInflateError> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Uncompress::AnyInflate can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal input file operations can be carried out with
+C<$z>. For example, to read a line from a compressed file/buffer you can
+use either of these forms
+
+ $line = $z->getline();
+ $line = <$z>;
+
+The mandatory parameter C<$input> is used to determine the source of the
+compressed data. This parameter can take one of three forms.
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a scalar, it is assumed to be a filename. This
+file will be opened for reading and the compressed data will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the compressed data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the compressed data will be read from
+C<$$output>.
+
+=back
+
+=head2 Constructor Options
+
+The option names defined below are case insensitive and can be optionally
+prefixed by a '-'. So all of the following are valid
+
+ -AutoClose
+ -autoclose
+ AUTOCLOSE
+ autoclose
+
+OPTS is a combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$input> parameter is a filehandle. If
+specified, and the value is true, it will result in the file being closed once
+either the C<close> method is called or the IO::Uncompress::AnyInflate object is
+destroyed.
+
+This parameter defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+Allows multiple concatenated compressed streams to be treated as a single
+compressed stream. Decompression will stop once either the end of the
+file/buffer is reached, an error is encountered (premature eof, corrupt
+compressed data) or the end of a stream is not immediately followed by the
+start of another stream.
+
+This parameter defaults to 0.
+
+=item C<< Prime => $string >>
+
+This option will uncompress the contents of C<$string> before processing the
+input file/buffer.
+
+This option can be useful when the compressed data is embedded in another
+file/data structure and it is not possible to work out where the compressed
+data begins without having to read the first few bytes. If this is the
+case, the uncompression can be I<primed> with these bytes using this
+option.
+
+=item C<< Transparent => 0|1 >>
+
+If this option is set and the input file/buffer is not compressed data,
+the module will allow reading of it anyway.
+
+In addition, if the input file/buffer does contain compressed data and
+there is non-compressed data immediately following it, setting this option
+will make this module treat the whole file/bufffer as a single data stream.
+
+This option defaults to 1.
+
+=item C<< BlockSize => $num >>
+
+When reading the compressed input data, IO::Uncompress::AnyInflate will read it in
+blocks of C<$num> bytes.
+
+This option defaults to 4096.
+
+=item C<< InputLength => $size >>
+
+When present this option will limit the number of compressed bytes read
+from the input file/buffer to C<$size>. This option can be used in the
+situation where there is useful data directly after the compressed data
+stream and you know beforehand the exact length of the compressed data
+stream.
+
+This option is mostly used when reading from a filehandle, in which case
+the file pointer will be left pointing to the first byte directly after the
+compressed data stream.
+
+This option defaults to off.
+
+=item C<< Append => 0|1 >>
+
+This option controls what the C<read> method does with uncompressed data.
+
+If set to 1, all uncompressed data will be appended to the output parameter
+of the C<read> method.
+
+If set to 0, the contents of the output parameter of the C<read> method
+will be overwritten by the uncompressed data.
+
+Defaults to 0.
+
+=item C<< Strict => 0|1 >>
+
+This option controls whether the extra checks defined below are used when
+carrying out the decompression. When Strict is on, the extra tests are
+carried out, when Strict is off they are not.
+
+The default for this option is off.
+
+If the input is an RFC 1950 data stream, the following will be checked:
+
+=over 5
+
+=item 1
+
+The ADLER32 checksum field must be present.
+
+=item 2
+
+The value of the ADLER32 field read must match the adler32 value of the
+uncompressed data actually contained in the file.
+
+=back
+
+If the input is a gzip (RFC 1952) data stream, the following will be checked:
+
+=over 5
+
+=item 1
+
+If the FHCRC bit is set in the gzip FLG header byte, the CRC16 bytes in the
+header must match the crc16 value of the gzip header actually read.
+
+=item 2
+
+If the gzip header contains a name field (FNAME) it consists solely of ISO
+8859-1 characters.
+
+=item 3
+
+If the gzip header contains a comment field (FCOMMENT) it consists solely
+of ISO 8859-1 characters plus line-feed.
+
+=item 4
+
+If the gzip FEXTRA header field is present it must conform to the sub-field
+structure as defined in RFC 1952.
+
+=item 5
+
+The CRC32 and ISIZE trailer fields must be present.
+
+=item 6
+
+The value of the CRC32 field read must match the crc32 value of the
+uncompressed data actually contained in the gzip file.
+
+=item 7
+
+The value of the ISIZE fields read must match the length of the
+uncompressed data actually read from the file.
+
+=back
+
+=item C<< RawInflate => 0|1 >>
+
+When auto-detecting the compressed format, try to test for raw-deflate (RFC
+1951) content using the C<IO::Uncompress::RawInflate> module.
+
+The reason this is not default behaviour is because RFC 1951 content can
+only be detected by attempting to uncompress it. This process is error
+prone and can result is false positives.
+
+Defaults to 0.
+
+=item C<< ParseExtra => 0|1 >>
+If the gzip FEXTRA header field is present and this option is set, it will
+force the module to check that it conforms to the sub-field structure as
+defined in RFC 1952.
+
+If the C<Strict> is on it will automatically enable this option.
+
+Defaults to 0.
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer)
+
+Reads a block of compressed data (the size the the compressed block is
+determined by the C<Buffer> option in the constructor), uncompresses it and
+writes any uncompressed data into C<$buffer>. If the C<Append> parameter is
+set in the constructor, the uncompressed data will be appended to the
+C<$buffer> parameter. Otherwise C<$buffer> will be overwritten.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+
+ $status = read($z, $buffer, $length)
+ $status = read($z, $buffer, $length, $offset)
+
+Attempt to read C<$length> bytes of uncompressed data into C<$buffer>.
+
+The main difference between this form of the C<read> method and the
+previous one, is that this one will attempt to return I<exactly> C<$length>
+bytes. The only circumstances that this function will not is if end-of-file
+or an IO error is encountered.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 getline
+
+Usage is
+
+ $line = $z->getline()
+ $line = <$z>
+
+Reads a single line.
+
+This method fully supports the use of of the variable C<$/> (or
+C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to
+determine what constitutes an end of line. Paragraph mode, record mode and
+file slurp mode are all supported.
+
+=head2 getc
+
+Usage is
+
+ $char = $z->getc()
+
+Read a single character.
+
+=head2 ungetc
+
+Usage is
+
+ $char = $z->ungetc($string)
+
+=head2 inflateSync
+
+Usage is
+
+ $status = $z->inflateSync()
+
+TODO
+
+=head2 getHeaderInfo
+
+Usage is
+
+ $hdr = $z->getHeaderInfo();
+ @hdrs = $z->getHeaderInfo();
+
+This method returns either a hash reference (in scalar context) or a list
+or hash references (in array context) that contains information about each
+of the header fields in the compressed data stream(s).
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the end of the compressed input stream has been reached.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the input file/buffer.
+It is a fatal error to attempt to seek backward.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+Returns the current uncompressed line number. If C<EXPR> is present it has
+the effect of setting the line number. Note that setting the line number
+does not change the current position within the file/buffer being read.
+
+The contents of C<$/> are used to to determine what constitutes a line
+terminator.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Uncompress::AnyInflate object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Uncompress::AnyInflate
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 nextStream
+
+Usage is
+
+ my $status = $z->nextStream();
+
+Skips to the next compressed data stream in the input file/buffer. If a new
+compressed data stream is found, the eof marker will be cleared and C<$.>
+will be reset to 0.
+
+Returns 1 if a new stream was found, 0 if none was found, and -1 if an
+error was encountered.
+
+=head2 trailingData
+
+Usage is
+
+ my $data = $z->trailingData();
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete. It only makes sense to call
+this method once the end of the compressed data stream has been
+encountered.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option in the constructor.
+
+=head1 Importing
+
+No symbolic constants are required by this IO::Uncompress::AnyInflate at present.
+
+=over 5
+
+=item :all
+
+Imports C<anyinflate> and C<$AnyInflateError>.
+Same as doing this
+
+ use IO::Uncompress::AnyInflate qw(anyinflate $AnyInflateError) ;
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Working with Net::FTP
+
+See L<IO::Uncompress::AnyInflate::FAQ|IO::Uncompress::AnyInflate::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+For RFC 1950, 1951 and 1952 see
+F<http://www.faqs.org/rfcs/rfc1950.html>,
+F<http://www.faqs.org/rfcs/rfc1951.html> and
+F<http://www.faqs.org/rfcs/rfc1952.html>
+
+The I<zlib> compression library was written by Jean-loup Gailly
+F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
+
+The primary site for the I<zlib> compression library is
+F<http://www.zlib.org>.
+
+The primary site for gzip is F<http://www.gzip.org>.
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/AnyUncompress.pm b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/AnyUncompress.pm
new file mode 100755
index 00000000000..5984921e25b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/AnyUncompress.pm
@@ -0,0 +1,1018 @@
+package IO::Uncompress::AnyUncompress ;
+
+use strict;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.024 qw(createSelfTiedObject);
+
+use IO::Uncompress::Base 2.024 ;
+
+
+require Exporter ;
+
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyUncompressError);
+
+$VERSION = '2.024';
+$AnyUncompressError = '';
+
+@ISA = qw( Exporter IO::Uncompress::Base );
+@EXPORT_OK = qw( $AnyUncompressError anyuncompress ) ;
+%EXPORT_TAGS = %IO::Uncompress::Base::DEFLATE_CONSTANTS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+Exporter::export_ok_tags('all');
+
+# TODO - allow the user to pick a set of the three formats to allow
+# or just assume want to auto-detect any of the three formats.
+
+BEGIN
+{
+ eval ' use IO::Uncompress::Adapter::Inflate 2.024 ;';
+ eval ' use IO::Uncompress::Adapter::Bunzip2 2.024 ;';
+ eval ' use IO::Uncompress::Adapter::LZO 2.024 ;';
+ eval ' use IO::Uncompress::Adapter::Lzf 2.024 ;';
+ eval ' use IO::Uncompress::Adapter::UnLzma 2.020 ;';
+ eval ' use IO::Uncompress::Adapter::UnXz 2.020 ;';
+
+ eval ' use IO::Uncompress::Bunzip2 2.024 ;';
+ eval ' use IO::Uncompress::UnLzop 2.024 ;';
+ eval ' use IO::Uncompress::Gunzip 2.024 ;';
+ eval ' use IO::Uncompress::Inflate 2.024 ;';
+ eval ' use IO::Uncompress::RawInflate 2.024 ;';
+ eval ' use IO::Uncompress::Unzip 2.024 ;';
+ eval ' use IO::Uncompress::UnLzf 2.024 ;';
+ eval ' use IO::Uncompress::UnLzma 2.024 ;';
+ eval ' use IO::Uncompress::UnXz 2.024 ;';
+}
+
+sub new
+{
+ my $class = shift ;
+ my $obj = createSelfTiedObject($class, \$AnyUncompressError);
+ $obj->_create(undef, 0, @_);
+}
+
+sub anyuncompress
+{
+ my $obj = createSelfTiedObject(undef, \$AnyUncompressError);
+ return $obj->_inf(@_) ;
+}
+
+sub getExtraParams
+{
+ use IO::Compress::Base::Common 2.024 qw(:Parse);
+ return ( 'RawInflate' => [1, 1, Parse_boolean, 0] ,
+ 'UnLzma' => [1, 1, Parse_boolean, 0] ) ;
+}
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ # any always needs both crc32 and adler32
+ $got->value('CRC32' => 1);
+ $got->value('ADLER32' => 1);
+
+ return 1;
+}
+
+sub mkUncomp
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ my $magic ;
+
+ # try zlib first
+ if (defined $IO::Uncompress::RawInflate::VERSION )
+ {
+ my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Inflate::mkUncompObject();
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ *$self->{Uncomp} = $obj;
+
+ my @possible = qw( Inflate Gunzip Unzip );
+ unshift @possible, 'RawInflate'
+ if $got->value('RawInflate');
+
+ $magic = $self->ckMagic( @possible );
+
+ if ($magic) {
+ *$self->{Info} = $self->readHeader($magic)
+ or return undef ;
+
+ return 1;
+ }
+ }
+
+ if (defined $IO::Uncompress::UnLzma::VERSION && $got->value('UnLzma'))
+ {
+ my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::UnLzma::mkUncompObject();
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ *$self->{Uncomp} = $obj;
+
+ my @possible = qw( UnLzma );
+ #unshift @possible, 'RawInflate'
+ # if $got->value('RawInflate');
+
+ if ( *$self->{Info} = $self->ckMagic( @possible ))
+ {
+ return 1;
+ }
+ }
+
+ if (defined $IO::Uncompress::UnXz::VERSION and
+ $magic = $self->ckMagic('UnXz')) {
+ *$self->{Info} = $self->readHeader($magic)
+ or return undef ;
+
+ my ($obj, $errstr, $errno) =
+ IO::Uncompress::Adapter::UnXz::mkUncompObject();
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ *$self->{Uncomp} = $obj;
+
+ return 1;
+ }
+
+ if (defined $IO::Uncompress::Bunzip2::VERSION and
+ $magic = $self->ckMagic('Bunzip2')) {
+ *$self->{Info} = $self->readHeader($magic)
+ or return undef ;
+
+ my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Bunzip2::mkUncompObject();
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ *$self->{Uncomp} = $obj;
+
+ return 1;
+ }
+
+ if (defined $IO::Uncompress::UnLzop::VERSION and
+ $magic = $self->ckMagic('UnLzop')) {
+
+ *$self->{Info} = $self->readHeader($magic)
+ or return undef ;
+
+ my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::LZO::mkUncompObject();
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ *$self->{Uncomp} = $obj;
+
+ return 1;
+ }
+
+ if (defined $IO::Uncompress::UnLzf::VERSION and
+ $magic = $self->ckMagic('UnLzf')) {
+
+ *$self->{Info} = $self->readHeader($magic)
+ or return undef ;
+
+ my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Lzf::mkUncompObject();
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ *$self->{Uncomp} = $obj;
+
+ return 1;
+ }
+
+ return 0 ;
+}
+
+
+
+sub ckMagic
+{
+ my $self = shift;
+ my @names = @_ ;
+
+ my $keep = ref $self ;
+ for my $class ( map { "IO::Uncompress::$_" } @names)
+ {
+ bless $self => $class;
+ my $magic = $self->ckMagic();
+
+ if ($magic)
+ {
+ #bless $self => $class;
+ return $magic ;
+ }
+
+ $self->pushBack(*$self->{HeaderPending}) ;
+ *$self->{HeaderPending} = '' ;
+ }
+
+ bless $self => $keep;
+ return undef;
+}
+
+1 ;
+
+__END__
+
+
+=head1 NAME
+
+IO::Uncompress::AnyUncompress - Uncompress gzip, zip, bzip2 or lzop file/buffer
+
+=head1 SYNOPSIS
+
+ use IO::Uncompress::AnyUncompress qw(anyuncompress $AnyUncompressError) ;
+
+ my $status = anyuncompress $input => $output [,OPTS]
+ or die "anyuncompress failed: $AnyUncompressError\n";
+
+ my $z = new IO::Uncompress::AnyUncompress $input [OPTS]
+ or die "anyuncompress failed: $AnyUncompressError\n";
+
+ $status = $z->read($buffer)
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+ $line = $z->getline()
+ $char = $z->getc()
+ $char = $z->ungetc()
+ $char = $z->opened()
+
+ $data = $z->trailingData()
+ $status = $z->nextStream()
+ $data = $z->getHeaderInfo()
+ $z->tell()
+ $z->seek($position, $whence)
+ $z->binmode()
+ $z->fileno()
+ $z->eof()
+ $z->close()
+
+ $AnyUncompressError ;
+
+ # IO::File mode
+
+ <$z>
+ read($z, $buffer);
+ read($z, $buffer, $length);
+ read($z, $buffer, $length, $offset);
+ tell($z)
+ seek($z, $position, $whence)
+ binmode($z)
+ fileno($z)
+ eof($z)
+ close($z)
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows the reading of
+files/buffers that have been compressed with a variety of compression
+libraries.
+
+The formats supported are:
+
+=over 5
+
+=item RFC 1950
+
+=item RFC 1951 (optionally)
+
+=item gzip (RFC 1952)
+
+=item zip
+
+=item bzip2
+
+=item lzop
+
+=item lzf
+
+=item lzma
+
+=item xz
+
+=back
+
+The module will auto-detect which, if any, of the supported
+compression formats is being used.
+
+=head1 Functional Interface
+
+A top-level function, C<anyuncompress>, is provided to carry out
+"one-shot" uncompression between buffers and/or files. For finer
+control over the uncompression process, see the L</"OO Interface">
+section.
+
+ use IO::Uncompress::AnyUncompress qw(anyuncompress $AnyUncompressError) ;
+
+ anyuncompress $input => $output [,OPTS]
+ or die "anyuncompress failed: $AnyUncompressError\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 anyuncompress $input => $output [, OPTS]
+
+C<anyuncompress> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the compressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is uncompressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<anyuncompress> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+uncompressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the uncompressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the uncompressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the uncompressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the uncompressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<anyuncompress> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple compressed files/buffers and C<$output> is
+a single file/buffer, after uncompression C<$output> will contain a
+concatenation of all the uncompressed data from each of the input
+files/buffers.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<anyuncompress>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<anyuncompress> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<anyuncompress> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeOut => 0|1 >>
+
+When writing to a file or filehandle, set C<binmode> before writing to the
+file.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+The behaviour of this option is dependent on the type of output data
+stream.
+
+=over 5
+
+=item * A Buffer
+
+If C<Append> is enabled, all uncompressed data will be append to the end of
+the output buffer. Otherwise the output buffer will be cleared before any
+uncompressed data is written to it.
+
+=item * A Filename
+
+If C<Append> is enabled, the file will be opened in append mode. Otherwise
+the contents of the file, if any, will be truncated before any uncompressed
+data is written to it.
+
+=item * A Filehandle
+
+If C<Append> is enabled, the filehandle will be positioned to the end of
+the file via a call to C<seek> before any uncompressed data is
+written to it. Otherwise the file pointer will not be moved.
+
+=back
+
+When C<Append> is specified, and set to true, it will I<append> all uncompressed
+data to the output data stream.
+
+So when the output is a filehandle it will carry out a seek to the eof
+before writing any uncompressed data. If the output is a filename, it will be opened for
+appending. If the output is a buffer, all uncompressed data will be appened to
+the existing buffer.
+
+Conversely when C<Append> is not specified, or it is present and is set to
+false, it will operate as follows.
+
+When the output is a filename, it will truncate the contents of the file
+before writing any uncompressed data. If the output is a filehandle
+its position will not be changed. If the output is a buffer, it will be
+wiped before any uncompressed data is output.
+
+Defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+If the input file/buffer contains multiple compressed data streams, this
+option will uncompress the whole lot as a single data stream.
+
+Defaults to 0.
+
+=item C<< TrailingData => $scalar >>
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option.
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt.Compressed> and write the
+uncompressed data to the file C<file1.txt>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::AnyUncompress qw(anyuncompress $AnyUncompressError) ;
+
+ my $input = "file1.txt.Compressed";
+ my $output = "file1.txt";
+ anyuncompress $input => $output
+ or die "anyuncompress failed: $AnyUncompressError\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+uncompressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::AnyUncompress qw(anyuncompress $AnyUncompressError) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt.Compressed"
+ or die "Cannot open 'file1.txt.Compressed': $!\n" ;
+ my $buffer ;
+ anyuncompress $input => \$buffer
+ or die "anyuncompress failed: $AnyUncompressError\n";
+
+To uncompress all files in the directory "/my/home" that match "*.txt.Compressed" and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::AnyUncompress qw(anyuncompress $AnyUncompressError) ;
+
+ anyuncompress '</my/home/*.txt.Compressed>' => '</my/home/#1.txt>'
+ or die "anyuncompress failed: $AnyUncompressError\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::AnyUncompress qw(anyuncompress $AnyUncompressError) ;
+
+ for my $input ( glob "/my/home/*.txt.Compressed" )
+ {
+ my $output = $input;
+ $output =~ s/.Compressed// ;
+ anyuncompress $input => $output
+ or die "Error compressing '$input': $AnyUncompressError\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for IO::Uncompress::AnyUncompress is shown below
+
+ my $z = new IO::Uncompress::AnyUncompress $input [OPTS]
+ or die "IO::Uncompress::AnyUncompress failed: $AnyUncompressError\n";
+
+Returns an C<IO::Uncompress::AnyUncompress> object on success and undef on failure.
+The variable C<$AnyUncompressError> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Uncompress::AnyUncompress can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal input file operations can be carried out with
+C<$z>. For example, to read a line from a compressed file/buffer you can
+use either of these forms
+
+ $line = $z->getline();
+ $line = <$z>;
+
+The mandatory parameter C<$input> is used to determine the source of the
+compressed data. This parameter can take one of three forms.
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a scalar, it is assumed to be a filename. This
+file will be opened for reading and the compressed data will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the compressed data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the compressed data will be read from
+C<$$output>.
+
+=back
+
+=head2 Constructor Options
+
+The option names defined below are case insensitive and can be optionally
+prefixed by a '-'. So all of the following are valid
+
+ -AutoClose
+ -autoclose
+ AUTOCLOSE
+ autoclose
+
+OPTS is a combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$input> parameter is a filehandle. If
+specified, and the value is true, it will result in the file being closed once
+either the C<close> method is called or the IO::Uncompress::AnyUncompress object is
+destroyed.
+
+This parameter defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+Allows multiple concatenated compressed streams to be treated as a single
+compressed stream. Decompression will stop once either the end of the
+file/buffer is reached, an error is encountered (premature eof, corrupt
+compressed data) or the end of a stream is not immediately followed by the
+start of another stream.
+
+This parameter defaults to 0.
+
+=item C<< Prime => $string >>
+
+This option will uncompress the contents of C<$string> before processing the
+input file/buffer.
+
+This option can be useful when the compressed data is embedded in another
+file/data structure and it is not possible to work out where the compressed
+data begins without having to read the first few bytes. If this is the
+case, the uncompression can be I<primed> with these bytes using this
+option.
+
+=item C<< Transparent => 0|1 >>
+
+If this option is set and the input file/buffer is not compressed data,
+the module will allow reading of it anyway.
+
+In addition, if the input file/buffer does contain compressed data and
+there is non-compressed data immediately following it, setting this option
+will make this module treat the whole file/bufffer as a single data stream.
+
+This option defaults to 1.
+
+=item C<< BlockSize => $num >>
+
+When reading the compressed input data, IO::Uncompress::AnyUncompress will read it in
+blocks of C<$num> bytes.
+
+This option defaults to 4096.
+
+=item C<< InputLength => $size >>
+
+When present this option will limit the number of compressed bytes read
+from the input file/buffer to C<$size>. This option can be used in the
+situation where there is useful data directly after the compressed data
+stream and you know beforehand the exact length of the compressed data
+stream.
+
+This option is mostly used when reading from a filehandle, in which case
+the file pointer will be left pointing to the first byte directly after the
+compressed data stream.
+
+This option defaults to off.
+
+=item C<< Append => 0|1 >>
+
+This option controls what the C<read> method does with uncompressed data.
+
+If set to 1, all uncompressed data will be appended to the output parameter
+of the C<read> method.
+
+If set to 0, the contents of the output parameter of the C<read> method
+will be overwritten by the uncompressed data.
+
+Defaults to 0.
+
+=item C<< Strict => 0|1 >>
+
+This option controls whether the extra checks defined below are used when
+carrying out the decompression. When Strict is on, the extra tests are
+carried out, when Strict is off they are not.
+
+The default for this option is off.
+
+=item C<< RawInflate => 0|1 >>
+
+When auto-detecting the compressed format, try to test for raw-deflate (RFC
+1951) content using the C<IO::Uncompress::RawInflate> module.
+
+The reason this is not default behaviour is because RFC 1951 content can
+only be detected by attempting to uncompress it. This process is error
+prone and can result is false positives.
+
+Defaults to 0.
+
+=item C<< UnLzma => 0|1 >>
+
+When auto-detecting the compressed format, try to test for lzma_alone
+content using the C<IO::Uncompress::UnLzma> module.
+
+The reason this is not default behaviour is because lzma_alone content can
+only be detected by attempting to uncompress it. This process is error
+prone and can result is false positives.
+
+Defaults to 0.
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer)
+
+Reads a block of compressed data (the size the the compressed block is
+determined by the C<Buffer> option in the constructor), uncompresses it and
+writes any uncompressed data into C<$buffer>. If the C<Append> parameter is
+set in the constructor, the uncompressed data will be appended to the
+C<$buffer> parameter. Otherwise C<$buffer> will be overwritten.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+
+ $status = read($z, $buffer, $length)
+ $status = read($z, $buffer, $length, $offset)
+
+Attempt to read C<$length> bytes of uncompressed data into C<$buffer>.
+
+The main difference between this form of the C<read> method and the
+previous one, is that this one will attempt to return I<exactly> C<$length>
+bytes. The only circumstances that this function will not is if end-of-file
+or an IO error is encountered.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 getline
+
+Usage is
+
+ $line = $z->getline()
+ $line = <$z>
+
+Reads a single line.
+
+This method fully supports the use of of the variable C<$/> (or
+C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to
+determine what constitutes an end of line. Paragraph mode, record mode and
+file slurp mode are all supported.
+
+=head2 getc
+
+Usage is
+
+ $char = $z->getc()
+
+Read a single character.
+
+=head2 ungetc
+
+Usage is
+
+ $char = $z->ungetc($string)
+
+=head2 getHeaderInfo
+
+Usage is
+
+ $hdr = $z->getHeaderInfo();
+ @hdrs = $z->getHeaderInfo();
+
+This method returns either a hash reference (in scalar context) or a list
+or hash references (in array context) that contains information about each
+of the header fields in the compressed data stream(s).
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the end of the compressed input stream has been reached.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the input file/buffer.
+It is a fatal error to attempt to seek backward.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+Returns the current uncompressed line number. If C<EXPR> is present it has
+the effect of setting the line number. Note that setting the line number
+does not change the current position within the file/buffer being read.
+
+The contents of C<$/> are used to to determine what constitutes a line
+terminator.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Uncompress::AnyUncompress object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Uncompress::AnyUncompress
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 nextStream
+
+Usage is
+
+ my $status = $z->nextStream();
+
+Skips to the next compressed data stream in the input file/buffer. If a new
+compressed data stream is found, the eof marker will be cleared and C<$.>
+will be reset to 0.
+
+Returns 1 if a new stream was found, 0 if none was found, and -1 if an
+error was encountered.
+
+=head2 trailingData
+
+Usage is
+
+ my $data = $z->trailingData();
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete. It only makes sense to call
+this method once the end of the compressed data stream has been
+encountered.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option in the constructor.
+
+=head1 Importing
+
+No symbolic constants are required by this IO::Uncompress::AnyUncompress at present.
+
+=over 5
+
+=item :all
+
+Imports C<anyuncompress> and C<$AnyUncompressError>.
+Same as doing this
+
+ use IO::Uncompress::AnyUncompress qw(anyuncompress $AnyUncompressError) ;
+
+=back
+
+=head1 EXAMPLES
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Base.pm b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Base.pm
new file mode 100755
index 00000000000..33f2ac23758
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Base.pm
@@ -0,0 +1,1474 @@
+
+package IO::Uncompress::Base ;
+
+use strict ;
+use warnings;
+use bytes;
+
+our (@ISA, $VERSION, @EXPORT_OK, %EXPORT_TAGS);
+@ISA = qw(Exporter IO::File);
+
+
+$VERSION = '2.024';
+
+use constant G_EOF => 0 ;
+use constant G_ERR => -1 ;
+
+use IO::Compress::Base::Common 2.024 ;
+#use Parse::Parameters ;
+
+use IO::File ;
+use Symbol;
+use Scalar::Util qw(readonly);
+use List::Util qw(min);
+use Carp ;
+
+%EXPORT_TAGS = ( );
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+#Exporter::export_ok_tags('all') ;
+
+
+
+sub smartRead
+{
+ my $self = $_[0];
+ my $out = $_[1];
+ my $size = $_[2];
+ $$out = "" ;
+
+ my $offset = 0 ;
+
+
+ if (defined *$self->{InputLength}) {
+ return 0
+ if *$self->{InputLengthRemaining} <= 0 ;
+ $size = min($size, *$self->{InputLengthRemaining});
+ }
+
+ if ( length *$self->{Prime} ) {
+ #$$out = substr(*$self->{Prime}, 0, $size, '') ;
+ $$out = substr(*$self->{Prime}, 0, $size) ;
+ substr(*$self->{Prime}, 0, $size) = '' ;
+ if (length $$out == $size) {
+ *$self->{InputLengthRemaining} -= length $$out
+ if defined *$self->{InputLength};
+
+ return length $$out ;
+ }
+ $offset = length $$out ;
+ }
+
+ my $get_size = $size - $offset ;
+
+ if (defined *$self->{FH}) {
+ if ($offset) {
+ # Not using this
+ #
+ # *$self->{FH}->read($$out, $get_size, $offset);
+ #
+ # because the filehandle may not support the offset parameter
+ # An example is Net::FTP
+ my $tmp = '';
+ *$self->{FH}->read($tmp, $get_size) &&
+ (substr($$out, $offset) = $tmp);
+ }
+ else
+ { *$self->{FH}->read($$out, $get_size) }
+ }
+ elsif (defined *$self->{InputEvent}) {
+ my $got = 1 ;
+ while (length $$out < $size) {
+ last
+ if ($got = *$self->{InputEvent}->($$out, $get_size)) <= 0;
+ }
+
+ if (length $$out > $size ) {
+ #*$self->{Prime} = substr($$out, $size, length($$out), '');
+ *$self->{Prime} = substr($$out, $size, length($$out));
+ substr($$out, $size, length($$out)) = '';
+ }
+
+ *$self->{EventEof} = 1 if $got <= 0 ;
+ }
+ else {
+ no warnings 'uninitialized';
+ my $buf = *$self->{Buffer} ;
+ $$buf = '' unless defined $$buf ;
+ #$$out = '' unless defined $$out ;
+ substr($$out, $offset) = substr($$buf, *$self->{BufferOffset}, $get_size);
+ if (*$self->{ConsumeInput})
+ { substr($$buf, 0, $get_size) = '' }
+ else
+ { *$self->{BufferOffset} += length($$out) - $offset }
+ }
+
+ *$self->{InputLengthRemaining} -= length($$out) #- $offset
+ if defined *$self->{InputLength};
+
+ $self->saveStatus(length $$out < 0 ? STATUS_ERROR : STATUS_OK) ;
+
+ return length $$out;
+}
+
+sub pushBack
+{
+ my $self = shift ;
+
+ return if ! defined $_[0] || length $_[0] == 0 ;
+
+ if (defined *$self->{FH} || defined *$self->{InputEvent} ) {
+ *$self->{Prime} = $_[0] . *$self->{Prime} ;
+ *$self->{InputLengthRemaining} += length($_[0]);
+ }
+ else {
+ my $len = length $_[0];
+
+ if($len > *$self->{BufferOffset}) {
+ *$self->{Prime} = substr($_[0], 0, $len - *$self->{BufferOffset}) . *$self->{Prime} ;
+ *$self->{InputLengthRemaining} = *$self->{InputLength};
+ *$self->{BufferOffset} = 0
+ }
+ else {
+ *$self->{InputLengthRemaining} += length($_[0]);
+ *$self->{BufferOffset} -= length($_[0]) ;
+ }
+ }
+}
+
+sub smartSeek
+{
+ my $self = shift ;
+ my $offset = shift ;
+ my $truncate = shift;
+ #print "smartSeek to $offset\n";
+
+ # TODO -- need to take prime into account
+ if (defined *$self->{FH})
+ { *$self->{FH}->seek($offset, SEEK_SET) }
+ else {
+ *$self->{BufferOffset} = $offset ;
+ substr(${ *$self->{Buffer} }, *$self->{BufferOffset}) = ''
+ if $truncate;
+ return 1;
+ }
+}
+
+sub smartWrite
+{
+ my $self = shift ;
+ my $out_data = shift ;
+
+ if (defined *$self->{FH}) {
+ # flush needed for 5.8.0
+ defined *$self->{FH}->write($out_data, length $out_data) &&
+ defined *$self->{FH}->flush() ;
+ }
+ else {
+ my $buf = *$self->{Buffer} ;
+ substr($$buf, *$self->{BufferOffset}, length $out_data) = $out_data ;
+ *$self->{BufferOffset} += length($out_data) ;
+ return 1;
+ }
+}
+
+sub smartReadExact
+{
+ return $_[0]->smartRead($_[1], $_[2]) == $_[2];
+}
+
+sub smartEof
+{
+ my ($self) = $_[0];
+ local $.;
+
+ return 0 if length *$self->{Prime} || *$self->{PushMode};
+
+ if (defined *$self->{FH})
+ {
+ # Could use
+ #
+ # *$self->{FH}->eof()
+ #
+ # here, but this can cause trouble if
+ # the filehandle is itself a tied handle, but it uses sysread.
+ # Then we get into mixing buffered & non-buffered IO, which will cause trouble
+
+ my $info = $self->getErrInfo();
+
+ my $buffer = '';
+ my $status = $self->smartRead(\$buffer, 1);
+ $self->pushBack($buffer) if length $buffer;
+ $self->setErrInfo($info);
+
+ return $status == 0 ;
+ }
+ elsif (defined *$self->{InputEvent})
+ { *$self->{EventEof} }
+ else
+ { *$self->{BufferOffset} >= length(${ *$self->{Buffer} }) }
+}
+
+sub clearError
+{
+ my $self = shift ;
+
+ *$self->{ErrorNo} = 0 ;
+ ${ *$self->{Error} } = '' ;
+}
+
+sub getErrInfo
+{
+ my $self = shift ;
+
+ return [ *$self->{ErrorNo}, ${ *$self->{Error} } ] ;
+}
+
+sub setErrInfo
+{
+ my $self = shift ;
+ my $ref = shift;
+
+ *$self->{ErrorNo} = $ref->[0] ;
+ ${ *$self->{Error} } = $ref->[1] ;
+}
+
+sub saveStatus
+{
+ my $self = shift ;
+ my $errno = shift() + 0 ;
+ #return $errno unless $errno || ! defined *$self->{ErrorNo};
+ #return $errno unless $errno ;
+
+ *$self->{ErrorNo} = $errno;
+ ${ *$self->{Error} } = '' ;
+
+ return *$self->{ErrorNo} ;
+}
+
+
+sub saveErrorString
+{
+ my $self = shift ;
+ my $retval = shift ;
+
+ #return $retval if ${ *$self->{Error} };
+
+ ${ *$self->{Error} } = shift ;
+ *$self->{ErrorNo} = shift() + 0 if @_ ;
+
+ #warn "saveErrorString: " . ${ *$self->{Error} } . " " . *$self->{Error} . "\n" ;
+ return $retval;
+}
+
+sub croakError
+{
+ my $self = shift ;
+ $self->saveErrorString(0, $_[0]);
+ croak $_[0];
+}
+
+
+sub closeError
+{
+ my $self = shift ;
+ my $retval = shift ;
+
+ my $errno = *$self->{ErrorNo};
+ my $error = ${ *$self->{Error} };
+
+ $self->close();
+
+ *$self->{ErrorNo} = $errno ;
+ ${ *$self->{Error} } = $error ;
+
+ return $retval;
+}
+
+sub error
+{
+ my $self = shift ;
+ return ${ *$self->{Error} } ;
+}
+
+sub errorNo
+{
+ my $self = shift ;
+ return *$self->{ErrorNo};
+}
+
+sub HeaderError
+{
+ my ($self) = shift;
+ return $self->saveErrorString(undef, "Header Error: $_[0]", STATUS_ERROR);
+}
+
+sub TrailerError
+{
+ my ($self) = shift;
+ return $self->saveErrorString(G_ERR, "Trailer Error: $_[0]", STATUS_ERROR);
+}
+
+sub TruncatedHeader
+{
+ my ($self) = shift;
+ return $self->HeaderError("Truncated in $_[0] Section");
+}
+
+sub TruncatedTrailer
+{
+ my ($self) = shift;
+ return $self->TrailerError("Truncated in $_[0] Section");
+}
+
+sub postCheckParams
+{
+ return 1;
+}
+
+sub checkParams
+{
+ my $self = shift ;
+ my $class = shift ;
+
+ my $got = shift || IO::Compress::Base::Parameters::new();
+
+ my $Valid = {
+ 'BlockSize' => [1, 1, Parse_unsigned, 16 * 1024],
+ 'AutoClose' => [1, 1, Parse_boolean, 0],
+ 'Strict' => [1, 1, Parse_boolean, 0],
+ 'Append' => [1, 1, Parse_boolean, 0],
+ 'Prime' => [1, 1, Parse_any, undef],
+ 'MultiStream' => [1, 1, Parse_boolean, 0],
+ 'Transparent' => [1, 1, Parse_any, 1],
+ 'Scan' => [1, 1, Parse_boolean, 0],
+ 'InputLength' => [1, 1, Parse_unsigned, undef],
+ 'BinModeOut' => [1, 1, Parse_boolean, 0],
+ #'Encode' => [1, 1, Parse_any, undef],
+
+ #'ConsumeInput' => [1, 1, Parse_boolean, 0],
+
+ $self->getExtraParams(),
+
+ #'Todo - Revert to ordinary file on end Z_STREAM_END'=> 0,
+ # ContinueAfterEof
+ } ;
+
+ $Valid->{TrailingData} = [1, 1, Parse_writable_scalar, undef]
+ if *$self->{OneShot} ;
+
+ $got->parse($Valid, @_ )
+ or $self->croakError("${class}: $got->{Error}") ;
+
+ $self->postCheckParams($got)
+ or $self->croakError("${class}: " . $self->error()) ;
+
+ return $got;
+}
+
+sub _create
+{
+ my $obj = shift;
+ my $got = shift;
+ my $append_mode = shift ;
+
+ my $class = ref $obj;
+ $obj->croakError("$class: Missing Input parameter")
+ if ! @_ && ! $got ;
+
+ my $inValue = shift ;
+
+ *$obj->{OneShot} = 0 ;
+
+ if (! $got)
+ {
+ $got = $obj->checkParams($class, undef, @_)
+ or return undef ;
+ }
+
+ my $inType = whatIsInput($inValue, 1);
+
+ $obj->ckInputParam($class, $inValue, 1)
+ or return undef ;
+
+ *$obj->{InNew} = 1;
+
+ $obj->ckParams($got)
+ or $obj->croakError("${class}: " . *$obj->{Error});
+
+ if ($inType eq 'buffer' || $inType eq 'code') {
+ *$obj->{Buffer} = $inValue ;
+ *$obj->{InputEvent} = $inValue
+ if $inType eq 'code' ;
+ }
+ else {
+ if ($inType eq 'handle') {
+ *$obj->{FH} = $inValue ;
+ *$obj->{Handle} = 1 ;
+
+ # Need to rewind for Scan
+ *$obj->{FH}->seek(0, SEEK_SET)
+ if $got->value('Scan');
+ }
+ else {
+ no warnings ;
+ my $mode = '<';
+ $mode = '+<' if $got->value('Scan');
+ *$obj->{StdIO} = ($inValue eq '-');
+ *$obj->{FH} = new IO::File "$mode $inValue"
+ or return $obj->saveErrorString(undef, "cannot open file '$inValue': $!", $!) ;
+ }
+
+ *$obj->{LineNo} = $. = 0;
+ setBinModeInput(*$obj->{FH}) ;
+
+ my $buff = "" ;
+ *$obj->{Buffer} = \$buff ;
+ }
+
+ if ($got->parsed('Encode')) {
+ my $want_encoding = $got->value('Encode');
+ *$obj->{Encoding} = getEncoding($obj, $class, $want_encoding);
+ }
+
+
+ *$obj->{InputLength} = $got->parsed('InputLength')
+ ? $got->value('InputLength')
+ : undef ;
+ *$obj->{InputLengthRemaining} = $got->value('InputLength');
+ *$obj->{BufferOffset} = 0 ;
+ *$obj->{AutoClose} = $got->value('AutoClose');
+ *$obj->{Strict} = $got->value('Strict');
+ *$obj->{BlockSize} = $got->value('BlockSize');
+ *$obj->{Append} = $got->value('Append');
+ *$obj->{AppendOutput} = $append_mode || $got->value('Append');
+ *$obj->{ConsumeInput} = $got->value('ConsumeInput');
+ *$obj->{Transparent} = $got->value('Transparent');
+ *$obj->{MultiStream} = $got->value('MultiStream');
+
+ # TODO - move these two into RawDeflate
+ *$obj->{Scan} = $got->value('Scan');
+ *$obj->{ParseExtra} = $got->value('ParseExtra')
+ || $got->value('Strict') ;
+ *$obj->{Type} = '';
+ *$obj->{Prime} = $got->value('Prime') || '' ;
+ *$obj->{Pending} = '';
+ *$obj->{Plain} = 0;
+ *$obj->{PlainBytesRead} = 0;
+ *$obj->{InflatedBytesRead} = 0;
+ *$obj->{UnCompSize} = new U64;
+ *$obj->{CompSize} = new U64;
+ *$obj->{TotalInflatedBytesRead} = 0;
+ *$obj->{NewStream} = 0 ;
+ *$obj->{EventEof} = 0 ;
+ *$obj->{ClassName} = $class ;
+ *$obj->{Params} = $got ;
+
+ if (*$obj->{ConsumeInput}) {
+ *$obj->{InNew} = 0;
+ *$obj->{Closed} = 0;
+ return $obj
+ }
+
+ my $status = $obj->mkUncomp($got);
+
+ return undef
+ unless defined $status;
+
+ if ( ! $status) {
+ return undef
+ unless *$obj->{Transparent};
+
+ $obj->clearError();
+ *$obj->{Type} = 'plain';
+ *$obj->{Plain} = 1;
+ #$status = $obj->mkIdentityUncomp($class, $got);
+ $obj->pushBack(*$obj->{HeaderPending}) ;
+ }
+
+ push @{ *$obj->{InfoList} }, *$obj->{Info} ;
+
+ $obj->saveStatus(STATUS_OK) ;
+ *$obj->{InNew} = 0;
+ *$obj->{Closed} = 0;
+
+ return $obj;
+}
+
+sub ckInputParam
+{
+ my $self = shift ;
+ my $from = shift ;
+ my $inType = whatIsInput($_[0], $_[1]);
+
+ $self->croakError("$from: input parameter not a filename, filehandle, array ref or scalar ref")
+ if ! $inType ;
+
+# if ($inType eq 'filename' )
+# {
+# return $self->saveErrorString(1, "$from: input filename is undef or null string", STATUS_ERROR)
+# if ! defined $_[0] || $_[0] eq '' ;
+#
+# if ($_[0] ne '-' && ! -e $_[0] )
+# {
+# return $self->saveErrorString(1,
+# "input file '$_[0]' does not exist", STATUS_ERROR);
+# }
+# }
+
+ return 1;
+}
+
+
+sub _inf
+{
+ my $obj = shift ;
+
+ my $class = (caller)[0] ;
+ my $name = (caller(1))[3] ;
+
+ $obj->croakError("$name: expected at least 1 parameters\n")
+ unless @_ >= 1 ;
+
+ my $input = shift ;
+ my $haveOut = @_ ;
+ my $output = shift ;
+
+
+ my $x = new IO::Compress::Base::Validator($class, *$obj->{Error}, $name, $input, $output)
+ or return undef ;
+
+ push @_, $output if $haveOut && $x->{Hash};
+
+ *$obj->{OneShot} = 1 ;
+
+ my $got = $obj->checkParams($name, undef, @_)
+ or return undef ;
+
+ if ($got->parsed('TrailingData'))
+ {
+ *$obj->{TrailingData} = $got->value('TrailingData');
+ }
+
+ *$obj->{MultiStream} = $got->value('MultiStream');
+ $got->value('MultiStream', 0);
+
+ $x->{Got} = $got ;
+
+# if ($x->{Hash})
+# {
+# while (my($k, $v) = each %$input)
+# {
+# $v = \$input->{$k}
+# unless defined $v ;
+#
+# $obj->_singleTarget($x, $k, $v, @_)
+# or return undef ;
+# }
+#
+# return keys %$input ;
+# }
+
+ if ($x->{GlobMap})
+ {
+ $x->{oneInput} = 1 ;
+ foreach my $pair (@{ $x->{Pairs} })
+ {
+ my ($from, $to) = @$pair ;
+ $obj->_singleTarget($x, $from, $to, @_)
+ or return undef ;
+ }
+
+ return scalar @{ $x->{Pairs} } ;
+ }
+
+ if (! $x->{oneOutput} )
+ {
+ my $inFile = ($x->{inType} eq 'filenames'
+ || $x->{inType} eq 'filename');
+
+ $x->{inType} = $inFile ? 'filename' : 'buffer';
+
+ foreach my $in ($x->{oneInput} ? $input : @$input)
+ {
+ my $out ;
+ $x->{oneInput} = 1 ;
+
+ $obj->_singleTarget($x, $in, $output, @_)
+ or return undef ;
+ }
+
+ return 1 ;
+ }
+
+ # finally the 1 to 1 and n to 1
+ return $obj->_singleTarget($x, $input, $output, @_);
+
+ croak "should not be here" ;
+}
+
+sub retErr
+{
+ my $x = shift ;
+ my $string = shift ;
+
+ ${ $x->{Error} } = $string ;
+
+ return undef ;
+}
+
+sub _singleTarget
+{
+ my $self = shift ;
+ my $x = shift ;
+ my $input = shift;
+ my $output = shift;
+
+ my $buff = '';
+ $x->{buff} = \$buff ;
+
+ my $fh ;
+ if ($x->{outType} eq 'filename') {
+ my $mode = '>' ;
+ $mode = '>>'
+ if $x->{Got}->value('Append') ;
+ $x->{fh} = new IO::File "$mode $output"
+ or return retErr($x, "cannot open file '$output': $!") ;
+ binmode $x->{fh} if $x->{Got}->valueOrDefault('BinModeOut');
+
+ }
+
+ elsif ($x->{outType} eq 'handle') {
+ $x->{fh} = $output;
+ binmode $x->{fh} if $x->{Got}->valueOrDefault('BinModeOut');
+ if ($x->{Got}->value('Append')) {
+ seek($x->{fh}, 0, SEEK_END)
+ or return retErr($x, "Cannot seek to end of output filehandle: $!") ;
+ }
+ }
+
+
+ elsif ($x->{outType} eq 'buffer' )
+ {
+ $$output = ''
+ unless $x->{Got}->value('Append');
+ $x->{buff} = $output ;
+ }
+
+ if ($x->{oneInput})
+ {
+ defined $self->_rd2($x, $input, $output)
+ or return undef;
+ }
+ else
+ {
+ for my $element ( ($x->{inType} eq 'hash') ? keys %$input : @$input)
+ {
+ defined $self->_rd2($x, $element, $output)
+ or return undef ;
+ }
+ }
+
+
+ if ( ($x->{outType} eq 'filename' && $output ne '-') ||
+ ($x->{outType} eq 'handle' && $x->{Got}->value('AutoClose'))) {
+ $x->{fh}->close()
+ or return retErr($x, $!);
+ delete $x->{fh};
+ }
+
+ return 1 ;
+}
+
+sub _rd2
+{
+ my $self = shift ;
+ my $x = shift ;
+ my $input = shift;
+ my $output = shift;
+
+ my $z = createSelfTiedObject($x->{Class}, *$self->{Error});
+
+ $z->_create($x->{Got}, 1, $input, @_)
+ or return undef ;
+
+ my $status ;
+ my $fh = $x->{fh};
+
+ while (1) {
+
+ while (($status = $z->read($x->{buff})) > 0) {
+ if ($fh) {
+ print $fh ${ $x->{buff} }
+ or return $z->saveErrorString(undef, "Error writing to output file: $!", $!);
+ ${ $x->{buff} } = '' ;
+ }
+ }
+
+ if (! $x->{oneOutput} ) {
+ my $ot = $x->{outType} ;
+
+ if ($ot eq 'array')
+ { push @$output, $x->{buff} }
+ elsif ($ot eq 'hash')
+ { $output->{$input} = $x->{buff} }
+
+ my $buff = '';
+ $x->{buff} = \$buff;
+ }
+
+ last if $status < 0 || $z->smartEof();
+ #last if $status < 0 ;
+
+ last
+ unless *$self->{MultiStream};
+
+ $status = $z->nextStream();
+
+ last
+ unless $status == 1 ;
+ }
+
+ return $z->closeError(undef)
+ if $status < 0 ;
+
+ ${ *$self->{TrailingData} } = $z->trailingData()
+ if defined *$self->{TrailingData} ;
+
+ $z->close()
+ or return undef ;
+
+ return 1 ;
+}
+
+sub TIEHANDLE
+{
+ return $_[0] if ref($_[0]);
+ die "OOPS\n" ;
+
+}
+
+sub UNTIE
+{
+ my $self = shift ;
+}
+
+
+sub getHeaderInfo
+{
+ my $self = shift ;
+ wantarray ? @{ *$self->{InfoList} } : *$self->{Info};
+}
+
+sub readBlock
+{
+ my $self = shift ;
+ my $buff = shift ;
+ my $size = shift ;
+
+ if (defined *$self->{CompressedInputLength}) {
+ if (*$self->{CompressedInputLengthRemaining} == 0) {
+ delete *$self->{CompressedInputLength};
+ *$self->{CompressedInputLengthDone} = 1;
+ return STATUS_OK ;
+ }
+ $size = min($size, *$self->{CompressedInputLengthRemaining} );
+ *$self->{CompressedInputLengthRemaining} -= $size ;
+ }
+
+ my $status = $self->smartRead($buff, $size) ;
+ return $self->saveErrorString(STATUS_ERROR, "Error Reading Data")
+ if $status < 0 ;
+
+ if ($status == 0 ) {
+ *$self->{Closed} = 1 ;
+ *$self->{EndStream} = 1 ;
+ return $self->saveErrorString(STATUS_ERROR, "unexpected end of file", STATUS_ERROR);
+ }
+
+ return STATUS_OK;
+}
+
+sub postBlockChk
+{
+ return STATUS_OK;
+}
+
+sub _raw_read
+{
+ # return codes
+ # >0 - ok, number of bytes read
+ # =0 - ok, eof
+ # <0 - not ok
+
+ my $self = shift ;
+
+ return G_EOF if *$self->{Closed} ;
+ #return G_EOF if !length *$self->{Pending} && *$self->{EndStream} ;
+ return G_EOF if *$self->{EndStream} ;
+
+ my $buffer = shift ;
+ my $scan_mode = shift ;
+
+ if (*$self->{Plain}) {
+ my $tmp_buff ;
+ my $len = $self->smartRead(\$tmp_buff, *$self->{BlockSize}) ;
+
+ return $self->saveErrorString(G_ERR, "Error reading data: $!", $!)
+ if $len < 0 ;
+
+ if ($len == 0 ) {
+ *$self->{EndStream} = 1 ;
+ }
+ else {
+ *$self->{PlainBytesRead} += $len ;
+ $$buffer .= $tmp_buff;
+ }
+
+ return $len ;
+ }
+
+ if (*$self->{NewStream}) {
+
+ $self->gotoNextStream() > 0
+ or return G_ERR;
+
+ # For the headers that actually uncompressed data, put the
+ # uncompressed data into the output buffer.
+ $$buffer .= *$self->{Pending} ;
+ my $len = length *$self->{Pending} ;
+ *$self->{Pending} = '';
+ return $len;
+ }
+
+ my $temp_buf = '';
+ my $outSize = 0;
+ my $status = $self->readBlock(\$temp_buf, *$self->{BlockSize}, $outSize) ;
+ return G_ERR
+ if $status == STATUS_ERROR ;
+
+ my $buf_len = 0;
+ if ($status == STATUS_OK) {
+ my $beforeC_len = length $temp_buf;
+ my $before_len = defined $$buffer ? length $$buffer : 0 ;
+ $status = *$self->{Uncomp}->uncompr(\$temp_buf, $buffer,
+ defined *$self->{CompressedInputLengthDone} ||
+ $self->smartEof(), $outSize);
+
+ # Remember the input buffer if it wasn't consumed completely
+ $self->pushBack($temp_buf) if *$self->{Uncomp}{ConsumesInput};
+
+ return $self->saveErrorString(G_ERR, *$self->{Uncomp}{Error}, *$self->{Uncomp}{ErrorNo})
+ if $self->saveStatus($status) == STATUS_ERROR;
+
+ $self->postBlockChk($buffer, $before_len) == STATUS_OK
+ or return G_ERR;
+
+ $buf_len = defined $$buffer ? length($$buffer) - $before_len : 0;
+
+ *$self->{CompSize}->add($beforeC_len - length $temp_buf) ;
+
+ *$self->{InflatedBytesRead} += $buf_len ;
+ *$self->{TotalInflatedBytesRead} += $buf_len ;
+ *$self->{UnCompSize}->add($buf_len) ;
+
+ $self->filterUncompressed($buffer);
+
+ if (*$self->{Encoding}) {
+ $$buffer = *$self->{Encoding}->decode($$buffer);
+ }
+ }
+
+ if ($status == STATUS_ENDSTREAM) {
+
+ *$self->{EndStream} = 1 ;
+#$self->pushBack($temp_buf) ;
+#$temp_buf = '';
+
+ my $trailer;
+ my $trailer_size = *$self->{Info}{TrailerLength} ;
+ my $got = 0;
+ if (*$self->{Info}{TrailerLength})
+ {
+ $got = $self->smartRead(\$trailer, $trailer_size) ;
+ }
+
+ if ($got == $trailer_size) {
+ $self->chkTrailer($trailer) == STATUS_OK
+ or return G_ERR;
+ }
+ else {
+ return $self->TrailerError("trailer truncated. Expected " .
+ "$trailer_size bytes, got $got")
+ if *$self->{Strict};
+ $self->pushBack($trailer) ;
+ }
+
+ # TODO - if want to file file pointer, do it here
+
+ if (! $self->smartEof()) {
+ *$self->{NewStream} = 1 ;
+
+ if (*$self->{MultiStream}) {
+ *$self->{EndStream} = 0 ;
+ return $buf_len ;
+ }
+ }
+
+ }
+
+
+ # return the number of uncompressed bytes read
+ return $buf_len ;
+}
+
+sub reset
+{
+ my $self = shift ;
+
+ return *$self->{Uncomp}->reset();
+}
+
+sub filterUncompressed
+{
+}
+
+#sub isEndStream
+#{
+# my $self = shift ;
+# return *$self->{NewStream} ||
+# *$self->{EndStream} ;
+#}
+
+sub nextStream
+{
+ my $self = shift ;
+
+ my $status = $self->gotoNextStream();
+ $status == 1
+ or return $status ;
+
+ *$self->{TotalInflatedBytesRead} = 0 ;
+ *$self->{LineNo} = $. = 0;
+
+ return 1;
+}
+
+sub gotoNextStream
+{
+ my $self = shift ;
+
+ if (! *$self->{NewStream}) {
+ my $status = 1;
+ my $buffer ;
+
+ # TODO - make this more efficient if know the offset for the end of
+ # the stream and seekable
+ $status = $self->read($buffer)
+ while $status > 0 ;
+
+ return $status
+ if $status < 0;
+ }
+
+ *$self->{NewStream} = 0 ;
+ *$self->{EndStream} = 0 ;
+ $self->reset();
+ *$self->{UnCompSize}->reset();
+ *$self->{CompSize}->reset();
+
+ my $magic = $self->ckMagic();
+ #*$self->{EndStream} = 0 ;
+
+ if ( ! defined $magic) {
+ if (! *$self->{Transparent} )
+ {
+ *$self->{EndStream} = 1 ;
+ return 0;
+ }
+
+ $self->clearError();
+ *$self->{Type} = 'plain';
+ *$self->{Plain} = 1;
+ $self->pushBack(*$self->{HeaderPending}) ;
+ }
+ else
+ {
+ *$self->{Info} = $self->readHeader($magic);
+
+ if ( ! defined *$self->{Info} ) {
+ *$self->{EndStream} = 1 ;
+ return -1;
+ }
+ }
+
+ push @{ *$self->{InfoList} }, *$self->{Info} ;
+
+ return 1;
+}
+
+sub streamCount
+{
+ my $self = shift ;
+ return 1 if ! defined *$self->{InfoList};
+ return scalar @{ *$self->{InfoList} } ;
+}
+
+sub read
+{
+ # return codes
+ # >0 - ok, number of bytes read
+ # =0 - ok, eof
+ # <0 - not ok
+
+ my $self = shift ;
+
+ return G_EOF if *$self->{Closed} ;
+
+ my $buffer ;
+
+ if (ref $_[0] ) {
+ $self->croakError(*$self->{ClassName} . "::read: buffer parameter is read-only")
+ if readonly(${ $_[0] });
+
+ $self->croakError(*$self->{ClassName} . "::read: not a scalar reference $_[0]" )
+ unless ref $_[0] eq 'SCALAR' ;
+ $buffer = $_[0] ;
+ }
+ else {
+ $self->croakError(*$self->{ClassName} . "::read: buffer parameter is read-only")
+ if readonly($_[0]);
+
+ $buffer = \$_[0] ;
+ }
+
+ my $length = $_[1] ;
+ my $offset = $_[2] || 0;
+
+ if (! *$self->{AppendOutput}) {
+ if (! $offset) {
+ $$buffer = '' ;
+ }
+ else {
+ if ($offset > length($$buffer)) {
+ $$buffer .= "\x00" x ($offset - length($$buffer));
+ }
+ else {
+ substr($$buffer, $offset) = '';
+ }
+ }
+ }
+
+ return G_EOF if !length *$self->{Pending} && *$self->{EndStream} ;
+
+ # the core read will return 0 if asked for 0 bytes
+ return 0 if defined $length && $length == 0 ;
+
+ $length = $length || 0;
+
+ $self->croakError(*$self->{ClassName} . "::read: length parameter is negative")
+ if $length < 0 ;
+
+ # Short-circuit if this is a simple read, with no length
+ # or offset specified.
+ unless ( $length || $offset) {
+ if (length *$self->{Pending}) {
+ $$buffer .= *$self->{Pending} ;
+ my $len = length *$self->{Pending};
+ *$self->{Pending} = '' ;
+ return $len ;
+ }
+ else {
+ my $len = 0;
+ $len = $self->_raw_read($buffer)
+ while ! *$self->{EndStream} && $len == 0 ;
+ return $len ;
+ }
+ }
+
+ # Need to jump through more hoops - either length or offset
+ # or both are specified.
+ my $out_buffer = *$self->{Pending} ;
+ *$self->{Pending} = '';
+
+
+ while (! *$self->{EndStream} && length($out_buffer) < $length)
+ {
+ my $buf_len = $self->_raw_read(\$out_buffer);
+ return $buf_len
+ if $buf_len < 0 ;
+ }
+
+ $length = length $out_buffer
+ if length($out_buffer) < $length ;
+
+ return 0
+ if $length == 0 ;
+
+ $$buffer = ''
+ if ! defined $$buffer;
+
+ $offset = length $$buffer
+ if *$self->{AppendOutput} ;
+
+ *$self->{Pending} = $out_buffer;
+ $out_buffer = \*$self->{Pending} ;
+
+ #substr($$buffer, $offset) = substr($$out_buffer, 0, $length, '') ;
+ substr($$buffer, $offset) = substr($$out_buffer, 0, $length) ;
+ substr($$out_buffer, 0, $length) = '' ;
+
+ return $length ;
+}
+
+sub _getline
+{
+ my $self = shift ;
+
+ # Slurp Mode
+ if ( ! defined $/ ) {
+ my $data ;
+ 1 while $self->read($data) > 0 ;
+ return \$data ;
+ }
+
+ # Record Mode
+ if ( ref $/ eq 'SCALAR' && ${$/} =~ /^\d+$/ && ${$/} > 0) {
+ my $reclen = ${$/} ;
+ my $data ;
+ $self->read($data, $reclen) ;
+ return \$data ;
+ }
+
+ # Paragraph Mode
+ if ( ! length $/ ) {
+ my $paragraph ;
+ while ($self->read($paragraph) > 0 ) {
+ if ($paragraph =~ s/^(.*?\n\n+)//s) {
+ *$self->{Pending} = $paragraph ;
+ my $par = $1 ;
+ return \$par ;
+ }
+ }
+ return \$paragraph;
+ }
+
+ # $/ isn't empty, or a reference, so it's Line Mode.
+ {
+ my $line ;
+ my $offset;
+ my $p = \*$self->{Pending} ;
+
+ if (length(*$self->{Pending}) &&
+ ($offset = index(*$self->{Pending}, $/)) >=0) {
+ my $l = substr(*$self->{Pending}, 0, $offset + length $/ );
+ substr(*$self->{Pending}, 0, $offset + length $/) = '';
+ return \$l;
+ }
+
+ while ($self->read($line) > 0 ) {
+ my $offset = index($line, $/);
+ if ($offset >= 0) {
+ my $l = substr($line, 0, $offset + length $/ );
+ substr($line, 0, $offset + length $/) = '';
+ $$p = $line;
+ return \$l;
+ }
+ }
+
+ return \$line;
+ }
+}
+
+sub getline
+{
+ my $self = shift;
+ my $current_append = *$self->{AppendOutput} ;
+ *$self->{AppendOutput} = 1;
+ my $lineref = $self->_getline();
+ $. = ++ *$self->{LineNo} if defined $$lineref ;
+ *$self->{AppendOutput} = $current_append;
+ return $$lineref ;
+}
+
+sub getlines
+{
+ my $self = shift;
+ $self->croakError(*$self->{ClassName} .
+ "::getlines: called in scalar context\n") unless wantarray;
+ my($line, @lines);
+ push(@lines, $line)
+ while defined($line = $self->getline);
+ return @lines;
+}
+
+sub READLINE
+{
+ goto &getlines if wantarray;
+ goto &getline;
+}
+
+sub getc
+{
+ my $self = shift;
+ my $buf;
+ return $buf if $self->read($buf, 1);
+ return undef;
+}
+
+sub ungetc
+{
+ my $self = shift;
+ *$self->{Pending} = "" unless defined *$self->{Pending} ;
+ *$self->{Pending} = $_[0] . *$self->{Pending} ;
+}
+
+
+sub trailingData
+{
+ my $self = shift ;
+
+ if (defined *$self->{FH} || defined *$self->{InputEvent} ) {
+ return *$self->{Prime} ;
+ }
+ else {
+ my $buf = *$self->{Buffer} ;
+ my $offset = *$self->{BufferOffset} ;
+ return substr($$buf, $offset) ;
+ }
+}
+
+
+sub eof
+{
+ my $self = shift ;
+
+ return (*$self->{Closed} ||
+ (!length *$self->{Pending}
+ && ( $self->smartEof() || *$self->{EndStream}))) ;
+}
+
+sub tell
+{
+ my $self = shift ;
+
+ my $in ;
+ if (*$self->{Plain}) {
+ $in = *$self->{PlainBytesRead} ;
+ }
+ else {
+ $in = *$self->{TotalInflatedBytesRead} ;
+ }
+
+ my $pending = length *$self->{Pending} ;
+
+ return 0 if $pending > $in ;
+ return $in - $pending ;
+}
+
+sub close
+{
+ # todo - what to do if close is called before the end of the gzip file
+ # do we remember any trailing data?
+ my $self = shift ;
+
+ return 1 if *$self->{Closed} ;
+
+ untie *$self
+ if $] >= 5.008 ;
+
+ my $status = 1 ;
+
+ if (defined *$self->{FH}) {
+ if ((! *$self->{Handle} || *$self->{AutoClose}) && ! *$self->{StdIO}) {
+ #if ( *$self->{AutoClose}) {
+ local $.;
+ $! = 0 ;
+ $status = *$self->{FH}->close();
+ return $self->saveErrorString(0, $!, $!)
+ if !*$self->{InNew} && $self->saveStatus($!) != 0 ;
+ }
+ delete *$self->{FH} ;
+ $! = 0 ;
+ }
+ *$self->{Closed} = 1 ;
+
+ return 1;
+}
+
+sub DESTROY
+{
+ my $self = shift ;
+ local ($., $@, $!, $^E, $?);
+
+ $self->close() ;
+}
+
+sub seek
+{
+ my $self = shift ;
+ my $position = shift;
+ my $whence = shift ;
+
+ my $here = $self->tell() ;
+ my $target = 0 ;
+
+
+ if ($whence == SEEK_SET) {
+ $target = $position ;
+ }
+ elsif ($whence == SEEK_CUR) {
+ $target = $here + $position ;
+ }
+ elsif ($whence == SEEK_END) {
+ $target = $position ;
+ $self->croakError(*$self->{ClassName} . "::seek: SEEK_END not allowed") ;
+ }
+ else {
+ $self->croakError(*$self->{ClassName} ."::seek: unknown value, $whence, for whence parameter");
+ }
+
+ # short circuit if seeking to current offset
+ if ($target == $here) {
+ # On ordinary filehandles, seeking to the current
+ # position also clears the EOF condition, so we
+ # emulate this behavior locally while simultaneously
+ # cascading it to the underlying filehandle
+ if (*$self->{Plain}) {
+ *$self->{EndStream} = 0;
+ seek(*$self->{FH},0,1) if *$self->{FH};
+ }
+ return 1;
+ }
+
+ # Outlaw any attempt to seek backwards
+ $self->croakError( *$self->{ClassName} ."::seek: cannot seek backwards")
+ if $target < $here ;
+
+ # Walk the file to the new offset
+ my $offset = $target - $here ;
+
+ my $got;
+ while (($got = $self->read(my $buffer, min($offset, *$self->{BlockSize})) ) > 0)
+ {
+ $offset -= $got;
+ last if $offset == 0 ;
+ }
+
+ $here = $self->tell() ;
+ return $offset == 0 ? 1 : 0 ;
+}
+
+sub fileno
+{
+ my $self = shift ;
+ return defined *$self->{FH}
+ ? fileno *$self->{FH}
+ : undef ;
+}
+
+sub binmode
+{
+ 1;
+# my $self = shift ;
+# return defined *$self->{FH}
+# ? binmode *$self->{FH}
+# : 1 ;
+}
+
+sub opened
+{
+ my $self = shift ;
+ return ! *$self->{Closed} ;
+}
+
+sub autoflush
+{
+ my $self = shift ;
+ return defined *$self->{FH}
+ ? *$self->{FH}->autoflush(@_)
+ : undef ;
+}
+
+sub input_line_number
+{
+ my $self = shift ;
+ my $last = *$self->{LineNo};
+ $. = *$self->{LineNo} = $_[1] if @_ ;
+ return $last;
+}
+
+
+*BINMODE = \&binmode;
+*SEEK = \&seek;
+*READ = \&read;
+*sysread = \&read;
+*TELL = \&tell;
+*EOF = \&eof;
+
+*FILENO = \&fileno;
+*CLOSE = \&close;
+
+sub _notAvailable
+{
+ my $name = shift ;
+ #return sub { croak "$name Not Available" ; } ;
+ return sub { croak "$name Not Available: File opened only for intput" ; } ;
+}
+
+
+*print = _notAvailable('print');
+*PRINT = _notAvailable('print');
+*printf = _notAvailable('printf');
+*PRINTF = _notAvailable('printf');
+*write = _notAvailable('write');
+*WRITE = _notAvailable('write');
+
+#*sysread = \&read;
+#*syswrite = \&_notAvailable;
+
+
+
+package IO::Uncompress::Base ;
+
+
+1 ;
+__END__
+
+=head1 NAME
+
+IO::Uncompress::Base - Base Class for IO::Uncompress modules
+
+=head1 SYNOPSIS
+
+ use IO::Uncompress::Base ;
+
+=head1 DESCRIPTION
+
+This module is not intended for direct use in application code. Its sole
+purpose if to to be sub-classed by IO::Unompress modules.
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Bunzip2.pm b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Bunzip2.pm
new file mode 100755
index 00000000000..b3988c41851
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Bunzip2.pm
@@ -0,0 +1,858 @@
+package IO::Uncompress::Bunzip2 ;
+
+use strict ;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.024 qw(:Status createSelfTiedObject);
+
+use IO::Uncompress::Base 2.024 ;
+use IO::Uncompress::Adapter::Bunzip2 2.024 ;
+
+require Exporter ;
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bunzip2Error);
+
+$VERSION = '2.024';
+$Bunzip2Error = '';
+
+@ISA = qw( Exporter IO::Uncompress::Base );
+@EXPORT_OK = qw( $Bunzip2Error bunzip2 ) ;
+#%EXPORT_TAGS = %IO::Uncompress::Base::EXPORT_TAGS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+#Exporter::export_ok_tags('all');
+
+
+sub new
+{
+ my $class = shift ;
+ my $obj = createSelfTiedObject($class, \$Bunzip2Error);
+
+ $obj->_create(undef, 0, @_);
+}
+
+sub bunzip2
+{
+ my $obj = createSelfTiedObject(undef, \$Bunzip2Error);
+ return $obj->_inf(@_);
+}
+
+sub getExtraParams
+{
+ my $self = shift ;
+
+ use IO::Compress::Base::Common 2.024 qw(:Parse);
+
+ return (
+ 'Verbosity' => [1, 1, Parse_boolean, 0],
+ 'Small' => [1, 1, Parse_boolean, 0],
+ );
+}
+
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ return 1;
+}
+
+sub mkUncomp
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ my $magic = $self->ckMagic()
+ or return 0;
+
+ *$self->{Info} = $self->readHeader($magic)
+ or return undef ;
+
+ my $Small = $got->value('Small');
+ my $Verbosity = $got->value('Verbosity');
+
+ my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Bunzip2::mkUncompObject(
+ $Small, $Verbosity);
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ *$self->{Uncomp} = $obj;
+
+ return 1;
+
+}
+
+
+sub ckMagic
+{
+ my $self = shift;
+
+ my $magic ;
+ $self->smartReadExact(\$magic, 4);
+
+ *$self->{HeaderPending} = $magic ;
+
+ return $self->HeaderError("Header size is " .
+ 4 . " bytes")
+ if length $magic != 4;
+
+ return $self->HeaderError("Bad Magic.")
+ if ! isBzip2Magic($magic) ;
+
+
+ *$self->{Type} = 'bzip2';
+ return $magic;
+}
+
+sub readHeader
+{
+ my $self = shift;
+ my $magic = shift ;
+
+ $self->pushBack($magic);
+ *$self->{HeaderPending} = '';
+
+
+ return {
+ 'Type' => 'bzip2',
+ 'FingerprintLength' => 4,
+ 'HeaderLength' => 4,
+ 'TrailerLength' => 0,
+ 'Header' => '$magic'
+ };
+
+}
+
+sub chkTrailer
+{
+ return STATUS_OK;
+}
+
+
+
+sub isBzip2Magic
+{
+ my $buffer = shift ;
+ return $buffer =~ /^BZh\d$/;
+}
+
+1 ;
+
+__END__
+
+
+=head1 NAME
+
+IO::Uncompress::Bunzip2 - Read bzip2 files/buffers
+
+=head1 SYNOPSIS
+
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+
+ my $status = bunzip2 $input => $output [,OPTS]
+ or die "bunzip2 failed: $Bunzip2Error\n";
+
+ my $z = new IO::Uncompress::Bunzip2 $input [OPTS]
+ or die "bunzip2 failed: $Bunzip2Error\n";
+
+ $status = $z->read($buffer)
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+ $line = $z->getline()
+ $char = $z->getc()
+ $char = $z->ungetc()
+ $char = $z->opened()
+
+ $data = $z->trailingData()
+ $status = $z->nextStream()
+ $data = $z->getHeaderInfo()
+ $z->tell()
+ $z->seek($position, $whence)
+ $z->binmode()
+ $z->fileno()
+ $z->eof()
+ $z->close()
+
+ $Bunzip2Error ;
+
+ # IO::File mode
+
+ <$z>
+ read($z, $buffer);
+ read($z, $buffer, $length);
+ read($z, $buffer, $length, $offset);
+ tell($z)
+ seek($z, $position, $whence)
+ binmode($z)
+ fileno($z)
+ eof($z)
+ close($z)
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows the reading of
+bzip2 files/buffers.
+
+For writing bzip2 files/buffers, see the companion module IO::Compress::Bzip2.
+
+=head1 Functional Interface
+
+A top-level function, C<bunzip2>, is provided to carry out
+"one-shot" uncompression between buffers and/or files. For finer
+control over the uncompression process, see the L</"OO Interface">
+section.
+
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+
+ bunzip2 $input => $output [,OPTS]
+ or die "bunzip2 failed: $Bunzip2Error\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 bunzip2 $input => $output [, OPTS]
+
+C<bunzip2> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the compressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is uncompressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<bunzip2> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+uncompressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the uncompressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the uncompressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the uncompressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the uncompressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<bunzip2> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple compressed files/buffers and C<$output> is
+a single file/buffer, after uncompression C<$output> will contain a
+concatenation of all the uncompressed data from each of the input
+files/buffers.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<bunzip2>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<bunzip2> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<bunzip2> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeOut => 0|1 >>
+
+When writing to a file or filehandle, set C<binmode> before writing to the
+file.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+TODO
+
+=item C<< MultiStream => 0|1 >>
+
+If the input file/buffer contains multiple compressed data streams, this
+option will uncompress the whole lot as a single data stream.
+
+Defaults to 0.
+
+=item C<< TrailingData => $scalar >>
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option.
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt.bz2> and write the
+compressed data to the file C<file1.txt>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+
+ my $input = "file1.txt.bz2";
+ my $output = "file1.txt";
+ bunzip2 $input => $output
+ or die "bunzip2 failed: $Bunzip2Error\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+uncompressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt.bz2"
+ or die "Cannot open 'file1.txt.bz2': $!\n" ;
+ my $buffer ;
+ bunzip2 $input => \$buffer
+ or die "bunzip2 failed: $Bunzip2Error\n";
+
+To uncompress all files in the directory "/my/home" that match "*.txt.bz2" and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+
+ bunzip2 '</my/home/*.txt.bz2>' => '</my/home/#1.txt>'
+ or die "bunzip2 failed: $Bunzip2Error\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+
+ for my $input ( glob "/my/home/*.txt.bz2" )
+ {
+ my $output = $input;
+ $output =~ s/.bz2// ;
+ bunzip2 $input => $output
+ or die "Error compressing '$input': $Bunzip2Error\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for IO::Uncompress::Bunzip2 is shown below
+
+ my $z = new IO::Uncompress::Bunzip2 $input [OPTS]
+ or die "IO::Uncompress::Bunzip2 failed: $Bunzip2Error\n";
+
+Returns an C<IO::Uncompress::Bunzip2> object on success and undef on failure.
+The variable C<$Bunzip2Error> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Uncompress::Bunzip2 can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal input file operations can be carried out with
+C<$z>. For example, to read a line from a compressed file/buffer you can
+use either of these forms
+
+ $line = $z->getline();
+ $line = <$z>;
+
+The mandatory parameter C<$input> is used to determine the source of the
+compressed data. This parameter can take one of three forms.
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a scalar, it is assumed to be a filename. This
+file will be opened for reading and the compressed data will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the compressed data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the compressed data will be read from
+C<$$output>.
+
+=back
+
+=head2 Constructor Options
+
+The option names defined below are case insensitive and can be optionally
+prefixed by a '-'. So all of the following are valid
+
+ -AutoClose
+ -autoclose
+ AUTOCLOSE
+ autoclose
+
+OPTS is a combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$input> parameter is a filehandle. If
+specified, and the value is true, it will result in the file being closed once
+either the C<close> method is called or the IO::Uncompress::Bunzip2 object is
+destroyed.
+
+This parameter defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+Allows multiple concatenated compressed streams to be treated as a single
+compressed stream. Decompression will stop once either the end of the
+file/buffer is reached, an error is encountered (premature eof, corrupt
+compressed data) or the end of a stream is not immediately followed by the
+start of another stream.
+
+This parameter defaults to 0.
+
+=item C<< Prime => $string >>
+
+This option will uncompress the contents of C<$string> before processing the
+input file/buffer.
+
+This option can be useful when the compressed data is embedded in another
+file/data structure and it is not possible to work out where the compressed
+data begins without having to read the first few bytes. If this is the
+case, the uncompression can be I<primed> with these bytes using this
+option.
+
+=item C<< Transparent => 0|1 >>
+
+If this option is set and the input file/buffer is not compressed data,
+the module will allow reading of it anyway.
+
+In addition, if the input file/buffer does contain compressed data and
+there is non-compressed data immediately following it, setting this option
+will make this module treat the whole file/bufffer as a single data stream.
+
+This option defaults to 1.
+
+=item C<< BlockSize => $num >>
+
+When reading the compressed input data, IO::Uncompress::Bunzip2 will read it in
+blocks of C<$num> bytes.
+
+This option defaults to 4096.
+
+=item C<< InputLength => $size >>
+
+When present this option will limit the number of compressed bytes read
+from the input file/buffer to C<$size>. This option can be used in the
+situation where there is useful data directly after the compressed data
+stream and you know beforehand the exact length of the compressed data
+stream.
+
+This option is mostly used when reading from a filehandle, in which case
+the file pointer will be left pointing to the first byte directly after the
+compressed data stream.
+
+This option defaults to off.
+
+=item C<< Append => 0|1 >>
+
+This option controls what the C<read> method does with uncompressed data.
+
+If set to 1, all uncompressed data will be appended to the output parameter
+of the C<read> method.
+
+If set to 0, the contents of the output parameter of the C<read> method
+will be overwritten by the uncompressed data.
+
+Defaults to 0.
+
+=item C<< Strict => 0|1 >>
+
+This option is a no-op.
+
+=item C<< Small => 0|1 >>
+
+When non-zero this options will make bzip2 use a decompression algorithm
+that uses less memory at the expense of increasing the amount of time
+taken for decompression.
+
+Default is 0.
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer)
+
+Reads a block of compressed data (the size the the compressed block is
+determined by the C<Buffer> option in the constructor), uncompresses it and
+writes any uncompressed data into C<$buffer>. If the C<Append> parameter is
+set in the constructor, the uncompressed data will be appended to the
+C<$buffer> parameter. Otherwise C<$buffer> will be overwritten.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+
+ $status = read($z, $buffer, $length)
+ $status = read($z, $buffer, $length, $offset)
+
+Attempt to read C<$length> bytes of uncompressed data into C<$buffer>.
+
+The main difference between this form of the C<read> method and the
+previous one, is that this one will attempt to return I<exactly> C<$length>
+bytes. The only circumstances that this function will not is if end-of-file
+or an IO error is encountered.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 getline
+
+Usage is
+
+ $line = $z->getline()
+ $line = <$z>
+
+Reads a single line.
+
+This method fully supports the use of of the variable C<$/> (or
+C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to
+determine what constitutes an end of line. Paragraph mode, record mode and
+file slurp mode are all supported.
+
+=head2 getc
+
+Usage is
+
+ $char = $z->getc()
+
+Read a single character.
+
+=head2 ungetc
+
+Usage is
+
+ $char = $z->ungetc($string)
+
+=head2 getHeaderInfo
+
+Usage is
+
+ $hdr = $z->getHeaderInfo();
+ @hdrs = $z->getHeaderInfo();
+
+This method returns either a hash reference (in scalar context) or a list
+or hash references (in array context) that contains information about each
+of the header fields in the compressed data stream(s).
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the end of the compressed input stream has been reached.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the input file/buffer.
+It is a fatal error to attempt to seek backward.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+Returns the current uncompressed line number. If C<EXPR> is present it has
+the effect of setting the line number. Note that setting the line number
+does not change the current position within the file/buffer being read.
+
+The contents of C<$/> are used to to determine what constitutes a line
+terminator.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Uncompress::Bunzip2 object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Uncompress::Bunzip2
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 nextStream
+
+Usage is
+
+ my $status = $z->nextStream();
+
+Skips to the next compressed data stream in the input file/buffer. If a new
+compressed data stream is found, the eof marker will be cleared and C<$.>
+will be reset to 0.
+
+Returns 1 if a new stream was found, 0 if none was found, and -1 if an
+error was encountered.
+
+=head2 trailingData
+
+Usage is
+
+ my $data = $z->trailingData();
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete. It only makes sense to call
+this method once the end of the compressed data stream has been
+encountered.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option in the constructor.
+
+=head1 Importing
+
+No symbolic constants are required by this IO::Uncompress::Bunzip2 at present.
+
+=over 5
+
+=item :all
+
+Imports C<bunzip2> and C<$Bunzip2Error>.
+Same as doing this
+
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Working with Net::FTP
+
+See L<IO::Uncompress::Bunzip2::FAQ|IO::Uncompress::Bunzip2::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+The primary site for the bzip2 program is F<http://www.bzip.org>.
+
+See the module L<Compress::Bzip2|Compress::Bzip2>
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Gunzip.pm b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Gunzip.pm
new file mode 100755
index 00000000000..f3e4e6561f0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Gunzip.pm
@@ -0,0 +1,1111 @@
+
+package IO::Uncompress::Gunzip ;
+
+require 5.004 ;
+
+# for RFC1952
+
+use strict ;
+use warnings;
+use bytes;
+
+use IO::Uncompress::RawInflate 2.024 ;
+
+use Compress::Raw::Zlib 2.024 qw( crc32 ) ;
+use IO::Compress::Base::Common 2.024 qw(:Status createSelfTiedObject);
+use IO::Compress::Gzip::Constants 2.024 ;
+use IO::Compress::Zlib::Extra 2.024 ;
+
+require Exporter ;
+
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $GunzipError);
+
+@ISA = qw( Exporter IO::Uncompress::RawInflate );
+@EXPORT_OK = qw( $GunzipError gunzip );
+%EXPORT_TAGS = %IO::Uncompress::RawInflate::DEFLATE_CONSTANTS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+Exporter::export_ok_tags('all');
+
+$GunzipError = '';
+
+$VERSION = '2.024';
+
+sub new
+{
+ my $class = shift ;
+ $GunzipError = '';
+ my $obj = createSelfTiedObject($class, \$GunzipError);
+
+ $obj->_create(undef, 0, @_);
+}
+
+sub gunzip
+{
+ my $obj = createSelfTiedObject(undef, \$GunzipError);
+ return $obj->_inf(@_) ;
+}
+
+sub getExtraParams
+{
+ use IO::Compress::Base::Common 2.024 qw(:Parse);
+ return ( 'ParseExtra' => [1, 1, Parse_boolean, 0] ) ;
+}
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ # gunzip always needs crc32
+ $got->value('CRC32' => 1);
+
+ return 1;
+}
+
+sub ckMagic
+{
+ my $self = shift;
+
+ my $magic ;
+ $self->smartReadExact(\$magic, GZIP_ID_SIZE);
+
+ *$self->{HeaderPending} = $magic ;
+
+ return $self->HeaderError("Minimum header size is " .
+ GZIP_MIN_HEADER_SIZE . " bytes")
+ if length $magic != GZIP_ID_SIZE ;
+
+ return $self->HeaderError("Bad Magic")
+ if ! isGzipMagic($magic) ;
+
+ *$self->{Type} = 'rfc1952';
+
+ return $magic ;
+}
+
+sub readHeader
+{
+ my $self = shift;
+ my $magic = shift;
+
+ return $self->_readGzipHeader($magic);
+}
+
+sub chkTrailer
+{
+ my $self = shift;
+ my $trailer = shift;
+
+ # Check CRC & ISIZE
+ my ($CRC32, $ISIZE) = unpack("V V", $trailer) ;
+ *$self->{Info}{CRC32} = $CRC32;
+ *$self->{Info}{ISIZE} = $ISIZE;
+
+ if (*$self->{Strict}) {
+ return $self->TrailerError("CRC mismatch")
+ if $CRC32 != *$self->{Uncomp}->crc32() ;
+
+ my $exp_isize = *$self->{UnCompSize}->get32bit();
+ return $self->TrailerError("ISIZE mismatch. Got $ISIZE"
+ . ", expected $exp_isize")
+ if $ISIZE != $exp_isize ;
+ }
+
+ return STATUS_OK;
+}
+
+sub isGzipMagic
+{
+ my $buffer = shift ;
+ return 0 if length $buffer < GZIP_ID_SIZE ;
+ my ($id1, $id2) = unpack("C C", $buffer) ;
+ return $id1 == GZIP_ID1 && $id2 == GZIP_ID2 ;
+}
+
+sub _readFullGzipHeader($)
+{
+ my ($self) = @_ ;
+ my $magic = '' ;
+
+ $self->smartReadExact(\$magic, GZIP_ID_SIZE);
+
+ *$self->{HeaderPending} = $magic ;
+
+ return $self->HeaderError("Minimum header size is " .
+ GZIP_MIN_HEADER_SIZE . " bytes")
+ if length $magic != GZIP_ID_SIZE ;
+
+
+ return $self->HeaderError("Bad Magic")
+ if ! isGzipMagic($magic) ;
+
+ my $status = $self->_readGzipHeader($magic);
+ delete *$self->{Transparent} if ! defined $status ;
+ return $status ;
+}
+
+sub _readGzipHeader($)
+{
+ my ($self, $magic) = @_ ;
+ my ($HeaderCRC) ;
+ my ($buffer) = '' ;
+
+ $self->smartReadExact(\$buffer, GZIP_MIN_HEADER_SIZE - GZIP_ID_SIZE)
+ or return $self->HeaderError("Minimum header size is " .
+ GZIP_MIN_HEADER_SIZE . " bytes") ;
+
+ my $keep = $magic . $buffer ;
+ *$self->{HeaderPending} = $keep ;
+
+ # now split out the various parts
+ my ($cm, $flag, $mtime, $xfl, $os) = unpack("C C V C C", $buffer) ;
+
+ $cm == GZIP_CM_DEFLATED
+ or return $self->HeaderError("Not Deflate (CM is $cm)") ;
+
+ # check for use of reserved bits
+ return $self->HeaderError("Use of Reserved Bits in FLG field.")
+ if $flag & GZIP_FLG_RESERVED ;
+
+ my $EXTRA ;
+ my @EXTRA = () ;
+ if ($flag & GZIP_FLG_FEXTRA) {
+ $EXTRA = "" ;
+ $self->smartReadExact(\$buffer, GZIP_FEXTRA_HEADER_SIZE)
+ or return $self->TruncatedHeader("FEXTRA Length") ;
+
+ my ($XLEN) = unpack("v", $buffer) ;
+ $self->smartReadExact(\$EXTRA, $XLEN)
+ or return $self->TruncatedHeader("FEXTRA Body");
+ $keep .= $buffer . $EXTRA ;
+
+ if ($XLEN && *$self->{'ParseExtra'}) {
+ my $bad = IO::Compress::Zlib::Extra::parseRawExtra($EXTRA,
+ \@EXTRA, 1, 1);
+ return $self->HeaderError($bad)
+ if defined $bad;
+ }
+ }
+
+ my $origname ;
+ if ($flag & GZIP_FLG_FNAME) {
+ $origname = "" ;
+ while (1) {
+ $self->smartReadExact(\$buffer, 1)
+ or return $self->TruncatedHeader("FNAME");
+ last if $buffer eq GZIP_NULL_BYTE ;
+ $origname .= $buffer
+ }
+ $keep .= $origname . GZIP_NULL_BYTE ;
+
+ return $self->HeaderError("Non ISO 8859-1 Character found in Name")
+ if *$self->{Strict} && $origname =~ /$GZIP_FNAME_INVALID_CHAR_RE/o ;
+ }
+
+ my $comment ;
+ if ($flag & GZIP_FLG_FCOMMENT) {
+ $comment = "";
+ while (1) {
+ $self->smartReadExact(\$buffer, 1)
+ or return $self->TruncatedHeader("FCOMMENT");
+ last if $buffer eq GZIP_NULL_BYTE ;
+ $comment .= $buffer
+ }
+ $keep .= $comment . GZIP_NULL_BYTE ;
+
+ return $self->HeaderError("Non ISO 8859-1 Character found in Comment")
+ if *$self->{Strict} && $comment =~ /$GZIP_FCOMMENT_INVALID_CHAR_RE/o ;
+ }
+
+ if ($flag & GZIP_FLG_FHCRC) {
+ $self->smartReadExact(\$buffer, GZIP_FHCRC_SIZE)
+ or return $self->TruncatedHeader("FHCRC");
+
+ $HeaderCRC = unpack("v", $buffer) ;
+ my $crc16 = crc32($keep) & 0xFF ;
+
+ return $self->HeaderError("CRC16 mismatch.")
+ if *$self->{Strict} && $crc16 != $HeaderCRC;
+
+ $keep .= $buffer ;
+ }
+
+ # Assume compression method is deflated for xfl tests
+ #if ($xfl) {
+ #}
+
+ *$self->{Type} = 'rfc1952';
+
+ return {
+ 'Type' => 'rfc1952',
+ 'FingerprintLength' => 2,
+ 'HeaderLength' => length $keep,
+ 'TrailerLength' => GZIP_TRAILER_SIZE,
+ 'Header' => $keep,
+ 'isMinimalHeader' => $keep eq GZIP_MINIMUM_HEADER ? 1 : 0,
+
+ 'MethodID' => $cm,
+ 'MethodName' => $cm == GZIP_CM_DEFLATED ? "Deflated" : "Unknown" ,
+ 'TextFlag' => $flag & GZIP_FLG_FTEXT ? 1 : 0,
+ 'HeaderCRCFlag' => $flag & GZIP_FLG_FHCRC ? 1 : 0,
+ 'NameFlag' => $flag & GZIP_FLG_FNAME ? 1 : 0,
+ 'CommentFlag' => $flag & GZIP_FLG_FCOMMENT ? 1 : 0,
+ 'ExtraFlag' => $flag & GZIP_FLG_FEXTRA ? 1 : 0,
+ 'Name' => $origname,
+ 'Comment' => $comment,
+ 'Time' => $mtime,
+ 'OsID' => $os,
+ 'OsName' => defined $GZIP_OS_Names{$os}
+ ? $GZIP_OS_Names{$os} : "Unknown",
+ 'HeaderCRC' => $HeaderCRC,
+ 'Flags' => $flag,
+ 'ExtraFlags' => $xfl,
+ 'ExtraFieldRaw' => $EXTRA,
+ 'ExtraField' => [ @EXTRA ],
+
+
+ #'CompSize'=> $compsize,
+ #'CRC32'=> $CRC32,
+ #'OrigSize'=> $ISIZE,
+ }
+}
+
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+IO::Uncompress::Gunzip - Read RFC 1952 files/buffers
+
+=head1 SYNOPSIS
+
+ use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
+
+ my $status = gunzip $input => $output [,OPTS]
+ or die "gunzip failed: $GunzipError\n";
+
+ my $z = new IO::Uncompress::Gunzip $input [OPTS]
+ or die "gunzip failed: $GunzipError\n";
+
+ $status = $z->read($buffer)
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+ $line = $z->getline()
+ $char = $z->getc()
+ $char = $z->ungetc()
+ $char = $z->opened()
+
+ $status = $z->inflateSync()
+
+ $data = $z->trailingData()
+ $status = $z->nextStream()
+ $data = $z->getHeaderInfo()
+ $z->tell()
+ $z->seek($position, $whence)
+ $z->binmode()
+ $z->fileno()
+ $z->eof()
+ $z->close()
+
+ $GunzipError ;
+
+ # IO::File mode
+
+ <$z>
+ read($z, $buffer);
+ read($z, $buffer, $length);
+ read($z, $buffer, $length, $offset);
+ tell($z)
+ seek($z, $position, $whence)
+ binmode($z)
+ fileno($z)
+ eof($z)
+ close($z)
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows the reading of
+files/buffers that conform to RFC 1952.
+
+For writing RFC 1952 files/buffers, see the companion module IO::Compress::Gzip.
+
+=head1 Functional Interface
+
+A top-level function, C<gunzip>, is provided to carry out
+"one-shot" uncompression between buffers and/or files. For finer
+control over the uncompression process, see the L</"OO Interface">
+section.
+
+ use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
+
+ gunzip $input => $output [,OPTS]
+ or die "gunzip failed: $GunzipError\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 gunzip $input => $output [, OPTS]
+
+C<gunzip> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the compressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is uncompressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<gunzip> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+uncompressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the uncompressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the uncompressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the uncompressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the uncompressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<gunzip> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple compressed files/buffers and C<$output> is
+a single file/buffer, after uncompression C<$output> will contain a
+concatenation of all the uncompressed data from each of the input
+files/buffers.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<gunzip>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<gunzip> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<gunzip> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeOut => 0|1 >>
+
+When writing to a file or filehandle, set C<binmode> before writing to the
+file.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+The behaviour of this option is dependent on the type of output data
+stream.
+
+=over 5
+
+=item * A Buffer
+
+If C<Append> is enabled, all uncompressed data will be append to the end of
+the output buffer. Otherwise the output buffer will be cleared before any
+uncompressed data is written to it.
+
+=item * A Filename
+
+If C<Append> is enabled, the file will be opened in append mode. Otherwise
+the contents of the file, if any, will be truncated before any uncompressed
+data is written to it.
+
+=item * A Filehandle
+
+If C<Append> is enabled, the filehandle will be positioned to the end of
+the file via a call to C<seek> before any uncompressed data is
+written to it. Otherwise the file pointer will not be moved.
+
+=back
+
+When C<Append> is specified, and set to true, it will I<append> all uncompressed
+data to the output data stream.
+
+So when the output is a filehandle it will carry out a seek to the eof
+before writing any uncompressed data. If the output is a filename, it will be opened for
+appending. If the output is a buffer, all uncompressed data will be appened to
+the existing buffer.
+
+Conversely when C<Append> is not specified, or it is present and is set to
+false, it will operate as follows.
+
+When the output is a filename, it will truncate the contents of the file
+before writing any uncompressed data. If the output is a filehandle
+its position will not be changed. If the output is a buffer, it will be
+wiped before any uncompressed data is output.
+
+Defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+If the input file/buffer contains multiple compressed data streams, this
+option will uncompress the whole lot as a single data stream.
+
+Defaults to 0.
+
+=item C<< TrailingData => $scalar >>
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option.
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt.gz> and write the
+uncompressed data to the file C<file1.txt>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
+
+ my $input = "file1.txt.gz";
+ my $output = "file1.txt";
+ gunzip $input => $output
+ or die "gunzip failed: $GunzipError\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+uncompressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt.gz"
+ or die "Cannot open 'file1.txt.gz': $!\n" ;
+ my $buffer ;
+ gunzip $input => \$buffer
+ or die "gunzip failed: $GunzipError\n";
+
+To uncompress all files in the directory "/my/home" that match "*.txt.gz" and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
+
+ gunzip '</my/home/*.txt.gz>' => '</my/home/#1.txt>'
+ or die "gunzip failed: $GunzipError\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
+
+ for my $input ( glob "/my/home/*.txt.gz" )
+ {
+ my $output = $input;
+ $output =~ s/.gz// ;
+ gunzip $input => $output
+ or die "Error compressing '$input': $GunzipError\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for IO::Uncompress::Gunzip is shown below
+
+ my $z = new IO::Uncompress::Gunzip $input [OPTS]
+ or die "IO::Uncompress::Gunzip failed: $GunzipError\n";
+
+Returns an C<IO::Uncompress::Gunzip> object on success and undef on failure.
+The variable C<$GunzipError> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Uncompress::Gunzip can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal input file operations can be carried out with
+C<$z>. For example, to read a line from a compressed file/buffer you can
+use either of these forms
+
+ $line = $z->getline();
+ $line = <$z>;
+
+The mandatory parameter C<$input> is used to determine the source of the
+compressed data. This parameter can take one of three forms.
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a scalar, it is assumed to be a filename. This
+file will be opened for reading and the compressed data will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the compressed data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the compressed data will be read from
+C<$$output>.
+
+=back
+
+=head2 Constructor Options
+
+The option names defined below are case insensitive and can be optionally
+prefixed by a '-'. So all of the following are valid
+
+ -AutoClose
+ -autoclose
+ AUTOCLOSE
+ autoclose
+
+OPTS is a combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$input> parameter is a filehandle. If
+specified, and the value is true, it will result in the file being closed once
+either the C<close> method is called or the IO::Uncompress::Gunzip object is
+destroyed.
+
+This parameter defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+Allows multiple concatenated compressed streams to be treated as a single
+compressed stream. Decompression will stop once either the end of the
+file/buffer is reached, an error is encountered (premature eof, corrupt
+compressed data) or the end of a stream is not immediately followed by the
+start of another stream.
+
+This parameter defaults to 0.
+
+=item C<< Prime => $string >>
+
+This option will uncompress the contents of C<$string> before processing the
+input file/buffer.
+
+This option can be useful when the compressed data is embedded in another
+file/data structure and it is not possible to work out where the compressed
+data begins without having to read the first few bytes. If this is the
+case, the uncompression can be I<primed> with these bytes using this
+option.
+
+=item C<< Transparent => 0|1 >>
+
+If this option is set and the input file/buffer is not compressed data,
+the module will allow reading of it anyway.
+
+In addition, if the input file/buffer does contain compressed data and
+there is non-compressed data immediately following it, setting this option
+will make this module treat the whole file/bufffer as a single data stream.
+
+This option defaults to 1.
+
+=item C<< BlockSize => $num >>
+
+When reading the compressed input data, IO::Uncompress::Gunzip will read it in
+blocks of C<$num> bytes.
+
+This option defaults to 4096.
+
+=item C<< InputLength => $size >>
+
+When present this option will limit the number of compressed bytes read
+from the input file/buffer to C<$size>. This option can be used in the
+situation where there is useful data directly after the compressed data
+stream and you know beforehand the exact length of the compressed data
+stream.
+
+This option is mostly used when reading from a filehandle, in which case
+the file pointer will be left pointing to the first byte directly after the
+compressed data stream.
+
+This option defaults to off.
+
+=item C<< Append => 0|1 >>
+
+This option controls what the C<read> method does with uncompressed data.
+
+If set to 1, all uncompressed data will be appended to the output parameter
+of the C<read> method.
+
+If set to 0, the contents of the output parameter of the C<read> method
+will be overwritten by the uncompressed data.
+
+Defaults to 0.
+
+=item C<< Strict => 0|1 >>
+
+This option controls whether the extra checks defined below are used when
+carrying out the decompression. When Strict is on, the extra tests are
+carried out, when Strict is off they are not.
+
+The default for this option is off.
+
+=over 5
+
+=item 1
+
+If the FHCRC bit is set in the gzip FLG header byte, the CRC16 bytes in the
+header must match the crc16 value of the gzip header actually read.
+
+=item 2
+
+If the gzip header contains a name field (FNAME) it consists solely of ISO
+8859-1 characters.
+
+=item 3
+
+If the gzip header contains a comment field (FCOMMENT) it consists solely
+of ISO 8859-1 characters plus line-feed.
+
+=item 4
+
+If the gzip FEXTRA header field is present it must conform to the sub-field
+structure as defined in RFC 1952.
+
+=item 5
+
+The CRC32 and ISIZE trailer fields must be present.
+
+=item 6
+
+The value of the CRC32 field read must match the crc32 value of the
+uncompressed data actually contained in the gzip file.
+
+=item 7
+
+The value of the ISIZE fields read must match the length of the
+uncompressed data actually read from the file.
+
+=back
+
+=item C<< ParseExtra => 0|1 >>
+If the gzip FEXTRA header field is present and this option is set, it will
+force the module to check that it conforms to the sub-field structure as
+defined in RFC 1952.
+
+If the C<Strict> is on it will automatically enable this option.
+
+Defaults to 0.
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer)
+
+Reads a block of compressed data (the size the the compressed block is
+determined by the C<Buffer> option in the constructor), uncompresses it and
+writes any uncompressed data into C<$buffer>. If the C<Append> parameter is
+set in the constructor, the uncompressed data will be appended to the
+C<$buffer> parameter. Otherwise C<$buffer> will be overwritten.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+
+ $status = read($z, $buffer, $length)
+ $status = read($z, $buffer, $length, $offset)
+
+Attempt to read C<$length> bytes of uncompressed data into C<$buffer>.
+
+The main difference between this form of the C<read> method and the
+previous one, is that this one will attempt to return I<exactly> C<$length>
+bytes. The only circumstances that this function will not is if end-of-file
+or an IO error is encountered.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 getline
+
+Usage is
+
+ $line = $z->getline()
+ $line = <$z>
+
+Reads a single line.
+
+This method fully supports the use of of the variable C<$/> (or
+C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to
+determine what constitutes an end of line. Paragraph mode, record mode and
+file slurp mode are all supported.
+
+=head2 getc
+
+Usage is
+
+ $char = $z->getc()
+
+Read a single character.
+
+=head2 ungetc
+
+Usage is
+
+ $char = $z->ungetc($string)
+
+=head2 inflateSync
+
+Usage is
+
+ $status = $z->inflateSync()
+
+TODO
+
+=head2 getHeaderInfo
+
+Usage is
+
+ $hdr = $z->getHeaderInfo();
+ @hdrs = $z->getHeaderInfo();
+
+This method returns either a hash reference (in scalar context) or a list
+or hash references (in array context) that contains information about each
+of the header fields in the compressed data stream(s).
+
+=over 5
+
+=item Name
+
+The contents of the Name header field, if present. If no name is
+present, the value will be undef. Note this is different from a zero length
+name, which will return an empty string.
+
+=item Comment
+
+The contents of the Comment header field, if present. If no comment is
+present, the value will be undef. Note this is different from a zero length
+comment, which will return an empty string.
+
+=back
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the end of the compressed input stream has been reached.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the input file/buffer.
+It is a fatal error to attempt to seek backward.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+Returns the current uncompressed line number. If C<EXPR> is present it has
+the effect of setting the line number. Note that setting the line number
+does not change the current position within the file/buffer being read.
+
+The contents of C<$/> are used to to determine what constitutes a line
+terminator.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Uncompress::Gunzip object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Uncompress::Gunzip
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 nextStream
+
+Usage is
+
+ my $status = $z->nextStream();
+
+Skips to the next compressed data stream in the input file/buffer. If a new
+compressed data stream is found, the eof marker will be cleared and C<$.>
+will be reset to 0.
+
+Returns 1 if a new stream was found, 0 if none was found, and -1 if an
+error was encountered.
+
+=head2 trailingData
+
+Usage is
+
+ my $data = $z->trailingData();
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete. It only makes sense to call
+this method once the end of the compressed data stream has been
+encountered.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option in the constructor.
+
+=head1 Importing
+
+No symbolic constants are required by this IO::Uncompress::Gunzip at present.
+
+=over 5
+
+=item :all
+
+Imports C<gunzip> and C<$GunzipError>.
+Same as doing this
+
+ use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Working with Net::FTP
+
+See L<IO::Uncompress::Gunzip::FAQ|IO::Uncompress::Gunzip::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+For RFC 1950, 1951 and 1952 see
+F<http://www.faqs.org/rfcs/rfc1950.html>,
+F<http://www.faqs.org/rfcs/rfc1951.html> and
+F<http://www.faqs.org/rfcs/rfc1952.html>
+
+The I<zlib> compression library was written by Jean-loup Gailly
+F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
+
+The primary site for the I<zlib> compression library is
+F<http://www.zlib.org>.
+
+The primary site for gzip is F<http://www.gzip.org>.
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Inflate.pm b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Inflate.pm
new file mode 100755
index 00000000000..956f62e0835
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Inflate.pm
@@ -0,0 +1,982 @@
+package IO::Uncompress::Inflate ;
+# for RFC1950
+
+use strict ;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.024 qw(:Status createSelfTiedObject);
+use IO::Compress::Zlib::Constants 2.024 ;
+
+use IO::Uncompress::RawInflate 2.024 ;
+
+require Exporter ;
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $InflateError);
+
+$VERSION = '2.024';
+$InflateError = '';
+
+@ISA = qw( Exporter IO::Uncompress::RawInflate );
+@EXPORT_OK = qw( $InflateError inflate ) ;
+%EXPORT_TAGS = %IO::Uncompress::RawInflate::DEFLATE_CONSTANTS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+Exporter::export_ok_tags('all');
+
+
+sub new
+{
+ my $class = shift ;
+ my $obj = createSelfTiedObject($class, \$InflateError);
+
+ $obj->_create(undef, 0, @_);
+}
+
+sub inflate
+{
+ my $obj = createSelfTiedObject(undef, \$InflateError);
+ return $obj->_inf(@_);
+}
+
+sub getExtraParams
+{
+ return ();
+}
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ # gunzip always needs adler32
+ $got->value('ADLER32' => 1);
+
+ return 1;
+}
+
+sub ckMagic
+{
+ my $self = shift;
+
+ my $magic ;
+ $self->smartReadExact(\$magic, ZLIB_HEADER_SIZE);
+
+ *$self->{HeaderPending} = $magic ;
+
+ return $self->HeaderError("Header size is " .
+ ZLIB_HEADER_SIZE . " bytes")
+ if length $magic != ZLIB_HEADER_SIZE;
+
+ #return $self->HeaderError("CRC mismatch.")
+ return undef
+ if ! $self->isZlibMagic($magic) ;
+
+ *$self->{Type} = 'rfc1950';
+ return $magic;
+}
+
+sub readHeader
+{
+ my $self = shift;
+ my $magic = shift ;
+
+ return $self->_readDeflateHeader($magic) ;
+}
+
+sub chkTrailer
+{
+ my $self = shift;
+ my $trailer = shift;
+
+ my $ADLER32 = unpack("N", $trailer) ;
+ *$self->{Info}{ADLER32} = $ADLER32;
+ return $self->TrailerError("CRC mismatch")
+ if *$self->{Strict} && $ADLER32 != *$self->{Uncomp}->adler32() ;
+
+ return STATUS_OK;
+}
+
+
+
+sub isZlibMagic
+{
+ my $self = shift;
+ my $buffer = shift ;
+
+ return 0
+ if length $buffer < ZLIB_HEADER_SIZE ;
+
+ my $hdr = unpack("n", $buffer) ;
+ #return 0 if $hdr % 31 != 0 ;
+ return $self->HeaderError("CRC mismatch.")
+ if $hdr % 31 != 0 ;
+
+ my ($CMF, $FLG) = unpack "C C", $buffer;
+ my $cm = bits($CMF, ZLIB_CMF_CM_OFFSET, ZLIB_CMF_CM_BITS) ;
+
+ # Only Deflate supported
+ return $self->HeaderError("Not Deflate (CM is $cm)")
+ if $cm != ZLIB_CMF_CM_DEFLATED ;
+
+ # Max window value is 7 for Deflate.
+ my $cinfo = bits($CMF, ZLIB_CMF_CINFO_OFFSET, ZLIB_CMF_CINFO_BITS) ;
+ return $self->HeaderError("CINFO > " . ZLIB_CMF_CINFO_MAX .
+ " (CINFO is $cinfo)")
+ if $cinfo > ZLIB_CMF_CINFO_MAX ;
+
+ return 1;
+}
+
+sub bits
+{
+ my $data = shift ;
+ my $offset = shift ;
+ my $mask = shift ;
+
+ ($data >> $offset ) & $mask & 0xFF ;
+}
+
+
+sub _readDeflateHeader
+{
+ my ($self, $buffer) = @_ ;
+
+# if (! $buffer) {
+# $self->smartReadExact(\$buffer, ZLIB_HEADER_SIZE);
+#
+# *$self->{HeaderPending} = $buffer ;
+#
+# return $self->HeaderError("Header size is " .
+# ZLIB_HEADER_SIZE . " bytes")
+# if length $buffer != ZLIB_HEADER_SIZE;
+#
+# return $self->HeaderError("CRC mismatch.")
+# if ! isZlibMagic($buffer) ;
+# }
+
+ my ($CMF, $FLG) = unpack "C C", $buffer;
+ my $FDICT = bits($FLG, ZLIB_FLG_FDICT_OFFSET, ZLIB_FLG_FDICT_BITS ),
+
+ my $cm = bits($CMF, ZLIB_CMF_CM_OFFSET, ZLIB_CMF_CM_BITS) ;
+ $cm == ZLIB_CMF_CM_DEFLATED
+ or return $self->HeaderError("Not Deflate (CM is $cm)") ;
+
+ my $DICTID;
+ if ($FDICT) {
+ $self->smartReadExact(\$buffer, ZLIB_FDICT_SIZE)
+ or return $self->TruncatedHeader("FDICT");
+
+ $DICTID = unpack("N", $buffer) ;
+ }
+
+ *$self->{Type} = 'rfc1950';
+
+ return {
+ 'Type' => 'rfc1950',
+ 'FingerprintLength' => ZLIB_HEADER_SIZE,
+ 'HeaderLength' => ZLIB_HEADER_SIZE,
+ 'TrailerLength' => ZLIB_TRAILER_SIZE,
+ 'Header' => $buffer,
+
+ CMF => $CMF ,
+ CM => bits($CMF, ZLIB_CMF_CM_OFFSET, ZLIB_CMF_CM_BITS ),
+ CINFO => bits($CMF, ZLIB_CMF_CINFO_OFFSET, ZLIB_CMF_CINFO_BITS ),
+ FLG => $FLG ,
+ FCHECK => bits($FLG, ZLIB_FLG_FCHECK_OFFSET, ZLIB_FLG_FCHECK_BITS),
+ FDICT => bits($FLG, ZLIB_FLG_FDICT_OFFSET, ZLIB_FLG_FDICT_BITS ),
+ FLEVEL => bits($FLG, ZLIB_FLG_LEVEL_OFFSET, ZLIB_FLG_LEVEL_BITS ),
+ DICTID => $DICTID ,
+
+ };
+}
+
+
+
+
+1 ;
+
+__END__
+
+
+=head1 NAME
+
+IO::Uncompress::Inflate - Read RFC 1950 files/buffers
+
+=head1 SYNOPSIS
+
+ use IO::Uncompress::Inflate qw(inflate $InflateError) ;
+
+ my $status = inflate $input => $output [,OPTS]
+ or die "inflate failed: $InflateError\n";
+
+ my $z = new IO::Uncompress::Inflate $input [OPTS]
+ or die "inflate failed: $InflateError\n";
+
+ $status = $z->read($buffer)
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+ $line = $z->getline()
+ $char = $z->getc()
+ $char = $z->ungetc()
+ $char = $z->opened()
+
+ $status = $z->inflateSync()
+
+ $data = $z->trailingData()
+ $status = $z->nextStream()
+ $data = $z->getHeaderInfo()
+ $z->tell()
+ $z->seek($position, $whence)
+ $z->binmode()
+ $z->fileno()
+ $z->eof()
+ $z->close()
+
+ $InflateError ;
+
+ # IO::File mode
+
+ <$z>
+ read($z, $buffer);
+ read($z, $buffer, $length);
+ read($z, $buffer, $length, $offset);
+ tell($z)
+ seek($z, $position, $whence)
+ binmode($z)
+ fileno($z)
+ eof($z)
+ close($z)
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows the reading of
+files/buffers that conform to RFC 1950.
+
+For writing RFC 1950 files/buffers, see the companion module IO::Compress::Deflate.
+
+=head1 Functional Interface
+
+A top-level function, C<inflate>, is provided to carry out
+"one-shot" uncompression between buffers and/or files. For finer
+control over the uncompression process, see the L</"OO Interface">
+section.
+
+ use IO::Uncompress::Inflate qw(inflate $InflateError) ;
+
+ inflate $input => $output [,OPTS]
+ or die "inflate failed: $InflateError\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 inflate $input => $output [, OPTS]
+
+C<inflate> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the compressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is uncompressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<inflate> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+uncompressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the uncompressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the uncompressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the uncompressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the uncompressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<inflate> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple compressed files/buffers and C<$output> is
+a single file/buffer, after uncompression C<$output> will contain a
+concatenation of all the uncompressed data from each of the input
+files/buffers.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<inflate>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<inflate> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<inflate> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeOut => 0|1 >>
+
+When writing to a file or filehandle, set C<binmode> before writing to the
+file.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+The behaviour of this option is dependent on the type of output data
+stream.
+
+=over 5
+
+=item * A Buffer
+
+If C<Append> is enabled, all uncompressed data will be append to the end of
+the output buffer. Otherwise the output buffer will be cleared before any
+uncompressed data is written to it.
+
+=item * A Filename
+
+If C<Append> is enabled, the file will be opened in append mode. Otherwise
+the contents of the file, if any, will be truncated before any uncompressed
+data is written to it.
+
+=item * A Filehandle
+
+If C<Append> is enabled, the filehandle will be positioned to the end of
+the file via a call to C<seek> before any uncompressed data is
+written to it. Otherwise the file pointer will not be moved.
+
+=back
+
+When C<Append> is specified, and set to true, it will I<append> all uncompressed
+data to the output data stream.
+
+So when the output is a filehandle it will carry out a seek to the eof
+before writing any uncompressed data. If the output is a filename, it will be opened for
+appending. If the output is a buffer, all uncompressed data will be appened to
+the existing buffer.
+
+Conversely when C<Append> is not specified, or it is present and is set to
+false, it will operate as follows.
+
+When the output is a filename, it will truncate the contents of the file
+before writing any uncompressed data. If the output is a filehandle
+its position will not be changed. If the output is a buffer, it will be
+wiped before any uncompressed data is output.
+
+Defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+If the input file/buffer contains multiple compressed data streams, this
+option will uncompress the whole lot as a single data stream.
+
+Defaults to 0.
+
+=item C<< TrailingData => $scalar >>
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option.
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt.1950> and write the
+uncompressed data to the file C<file1.txt>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Inflate qw(inflate $InflateError) ;
+
+ my $input = "file1.txt.1950";
+ my $output = "file1.txt";
+ inflate $input => $output
+ or die "inflate failed: $InflateError\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+uncompressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Inflate qw(inflate $InflateError) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt.1950"
+ or die "Cannot open 'file1.txt.1950': $!\n" ;
+ my $buffer ;
+ inflate $input => \$buffer
+ or die "inflate failed: $InflateError\n";
+
+To uncompress all files in the directory "/my/home" that match "*.txt.1950" and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Inflate qw(inflate $InflateError) ;
+
+ inflate '</my/home/*.txt.1950>' => '</my/home/#1.txt>'
+ or die "inflate failed: $InflateError\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Inflate qw(inflate $InflateError) ;
+
+ for my $input ( glob "/my/home/*.txt.1950" )
+ {
+ my $output = $input;
+ $output =~ s/.1950// ;
+ inflate $input => $output
+ or die "Error compressing '$input': $InflateError\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for IO::Uncompress::Inflate is shown below
+
+ my $z = new IO::Uncompress::Inflate $input [OPTS]
+ or die "IO::Uncompress::Inflate failed: $InflateError\n";
+
+Returns an C<IO::Uncompress::Inflate> object on success and undef on failure.
+The variable C<$InflateError> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Uncompress::Inflate can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal input file operations can be carried out with
+C<$z>. For example, to read a line from a compressed file/buffer you can
+use either of these forms
+
+ $line = $z->getline();
+ $line = <$z>;
+
+The mandatory parameter C<$input> is used to determine the source of the
+compressed data. This parameter can take one of three forms.
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a scalar, it is assumed to be a filename. This
+file will be opened for reading and the compressed data will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the compressed data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the compressed data will be read from
+C<$$output>.
+
+=back
+
+=head2 Constructor Options
+
+The option names defined below are case insensitive and can be optionally
+prefixed by a '-'. So all of the following are valid
+
+ -AutoClose
+ -autoclose
+ AUTOCLOSE
+ autoclose
+
+OPTS is a combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$input> parameter is a filehandle. If
+specified, and the value is true, it will result in the file being closed once
+either the C<close> method is called or the IO::Uncompress::Inflate object is
+destroyed.
+
+This parameter defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+Allows multiple concatenated compressed streams to be treated as a single
+compressed stream. Decompression will stop once either the end of the
+file/buffer is reached, an error is encountered (premature eof, corrupt
+compressed data) or the end of a stream is not immediately followed by the
+start of another stream.
+
+This parameter defaults to 0.
+
+=item C<< Prime => $string >>
+
+This option will uncompress the contents of C<$string> before processing the
+input file/buffer.
+
+This option can be useful when the compressed data is embedded in another
+file/data structure and it is not possible to work out where the compressed
+data begins without having to read the first few bytes. If this is the
+case, the uncompression can be I<primed> with these bytes using this
+option.
+
+=item C<< Transparent => 0|1 >>
+
+If this option is set and the input file/buffer is not compressed data,
+the module will allow reading of it anyway.
+
+In addition, if the input file/buffer does contain compressed data and
+there is non-compressed data immediately following it, setting this option
+will make this module treat the whole file/bufffer as a single data stream.
+
+This option defaults to 1.
+
+=item C<< BlockSize => $num >>
+
+When reading the compressed input data, IO::Uncompress::Inflate will read it in
+blocks of C<$num> bytes.
+
+This option defaults to 4096.
+
+=item C<< InputLength => $size >>
+
+When present this option will limit the number of compressed bytes read
+from the input file/buffer to C<$size>. This option can be used in the
+situation where there is useful data directly after the compressed data
+stream and you know beforehand the exact length of the compressed data
+stream.
+
+This option is mostly used when reading from a filehandle, in which case
+the file pointer will be left pointing to the first byte directly after the
+compressed data stream.
+
+This option defaults to off.
+
+=item C<< Append => 0|1 >>
+
+This option controls what the C<read> method does with uncompressed data.
+
+If set to 1, all uncompressed data will be appended to the output parameter
+of the C<read> method.
+
+If set to 0, the contents of the output parameter of the C<read> method
+will be overwritten by the uncompressed data.
+
+Defaults to 0.
+
+=item C<< Strict => 0|1 >>
+
+This option controls whether the extra checks defined below are used when
+carrying out the decompression. When Strict is on, the extra tests are
+carried out, when Strict is off they are not.
+
+The default for this option is off.
+
+=over 5
+
+=item 1
+
+The ADLER32 checksum field must be present.
+
+=item 2
+
+The value of the ADLER32 field read must match the adler32 value of the
+uncompressed data actually contained in the file.
+
+=back
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer)
+
+Reads a block of compressed data (the size the the compressed block is
+determined by the C<Buffer> option in the constructor), uncompresses it and
+writes any uncompressed data into C<$buffer>. If the C<Append> parameter is
+set in the constructor, the uncompressed data will be appended to the
+C<$buffer> parameter. Otherwise C<$buffer> will be overwritten.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+
+ $status = read($z, $buffer, $length)
+ $status = read($z, $buffer, $length, $offset)
+
+Attempt to read C<$length> bytes of uncompressed data into C<$buffer>.
+
+The main difference between this form of the C<read> method and the
+previous one, is that this one will attempt to return I<exactly> C<$length>
+bytes. The only circumstances that this function will not is if end-of-file
+or an IO error is encountered.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 getline
+
+Usage is
+
+ $line = $z->getline()
+ $line = <$z>
+
+Reads a single line.
+
+This method fully supports the use of of the variable C<$/> (or
+C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to
+determine what constitutes an end of line. Paragraph mode, record mode and
+file slurp mode are all supported.
+
+=head2 getc
+
+Usage is
+
+ $char = $z->getc()
+
+Read a single character.
+
+=head2 ungetc
+
+Usage is
+
+ $char = $z->ungetc($string)
+
+=head2 inflateSync
+
+Usage is
+
+ $status = $z->inflateSync()
+
+TODO
+
+=head2 getHeaderInfo
+
+Usage is
+
+ $hdr = $z->getHeaderInfo();
+ @hdrs = $z->getHeaderInfo();
+
+This method returns either a hash reference (in scalar context) or a list
+or hash references (in array context) that contains information about each
+of the header fields in the compressed data stream(s).
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the end of the compressed input stream has been reached.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the input file/buffer.
+It is a fatal error to attempt to seek backward.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+Returns the current uncompressed line number. If C<EXPR> is present it has
+the effect of setting the line number. Note that setting the line number
+does not change the current position within the file/buffer being read.
+
+The contents of C<$/> are used to to determine what constitutes a line
+terminator.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Uncompress::Inflate object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Uncompress::Inflate
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 nextStream
+
+Usage is
+
+ my $status = $z->nextStream();
+
+Skips to the next compressed data stream in the input file/buffer. If a new
+compressed data stream is found, the eof marker will be cleared and C<$.>
+will be reset to 0.
+
+Returns 1 if a new stream was found, 0 if none was found, and -1 if an
+error was encountered.
+
+=head2 trailingData
+
+Usage is
+
+ my $data = $z->trailingData();
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete. It only makes sense to call
+this method once the end of the compressed data stream has been
+encountered.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option in the constructor.
+
+=head1 Importing
+
+No symbolic constants are required by this IO::Uncompress::Inflate at present.
+
+=over 5
+
+=item :all
+
+Imports C<inflate> and C<$InflateError>.
+Same as doing this
+
+ use IO::Uncompress::Inflate qw(inflate $InflateError) ;
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Working with Net::FTP
+
+See L<IO::Uncompress::Inflate::FAQ|IO::Uncompress::Inflate::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+For RFC 1950, 1951 and 1952 see
+F<http://www.faqs.org/rfcs/rfc1950.html>,
+F<http://www.faqs.org/rfcs/rfc1951.html> and
+F<http://www.faqs.org/rfcs/rfc1952.html>
+
+The I<zlib> compression library was written by Jean-loup Gailly
+F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
+
+The primary site for the I<zlib> compression library is
+F<http://www.zlib.org>.
+
+The primary site for gzip is F<http://www.gzip.org>.
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/RawInflate.pm b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/RawInflate.pm
new file mode 100755
index 00000000000..f017fa0f599
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/RawInflate.pm
@@ -0,0 +1,1110 @@
+package IO::Uncompress::RawInflate ;
+# for RFC1951
+
+use strict ;
+use warnings;
+use bytes;
+
+use Compress::Raw::Zlib 2.024 ;
+use IO::Compress::Base::Common 2.024 qw(:Status createSelfTiedObject);
+
+use IO::Uncompress::Base 2.024 ;
+use IO::Uncompress::Adapter::Inflate 2.024 ;
+
+require Exporter ;
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $RawInflateError);
+
+$VERSION = '2.024';
+$RawInflateError = '';
+
+@ISA = qw( Exporter IO::Uncompress::Base );
+@EXPORT_OK = qw( $RawInflateError rawinflate ) ;
+%DEFLATE_CONSTANTS = ();
+%EXPORT_TAGS = %IO::Uncompress::Base::EXPORT_TAGS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+Exporter::export_ok_tags('all');
+
+#{
+# # Execute at runtime
+# my %bad;
+# for my $module (qw(Compress::Raw::Zlib IO::Compress::Base::Common IO::Uncompress::Base IO::Uncompress::Adapter::Inflate))
+# {
+# my $ver = ${ $module . "::VERSION"} ;
+#
+# $bad{$module} = $ver
+# if $ver ne $VERSION;
+# }
+#
+# if (keys %bad)
+# {
+# my $string = join "\n", map { "$_ $bad{$_}" } keys %bad;
+# die caller(0)[0] . "needs version $VERSION mismatch\n$string\n";
+# }
+#}
+
+sub new
+{
+ my $class = shift ;
+ my $obj = createSelfTiedObject($class, \$RawInflateError);
+ $obj->_create(undef, 0, @_);
+}
+
+sub rawinflate
+{
+ my $obj = createSelfTiedObject(undef, \$RawInflateError);
+ return $obj->_inf(@_);
+}
+
+sub getExtraParams
+{
+ return ();
+}
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ return 1;
+}
+
+sub mkUncomp
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Inflate::mkUncompObject(
+ $got->value('CRC32'),
+ $got->value('ADLER32'),
+ $got->value('Scan'),
+ );
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ *$self->{Uncomp} = $obj;
+
+ my $magic = $self->ckMagic()
+ or return 0;
+
+ *$self->{Info} = $self->readHeader($magic)
+ or return undef ;
+
+ return 1;
+
+}
+
+
+sub ckMagic
+{
+ my $self = shift;
+
+ return $self->_isRaw() ;
+}
+
+sub readHeader
+{
+ my $self = shift;
+ my $magic = shift ;
+
+ return {
+ 'Type' => 'rfc1951',
+ 'FingerprintLength' => 0,
+ 'HeaderLength' => 0,
+ 'TrailerLength' => 0,
+ 'Header' => ''
+ };
+}
+
+sub chkTrailer
+{
+ return STATUS_OK ;
+}
+
+sub _isRaw
+{
+ my $self = shift ;
+
+ my $got = $self->_isRawx(@_);
+
+ if ($got) {
+ *$self->{Pending} = *$self->{HeaderPending} ;
+ }
+ else {
+ $self->pushBack(*$self->{HeaderPending});
+ *$self->{Uncomp}->reset();
+ }
+ *$self->{HeaderPending} = '';
+
+ return $got ;
+}
+
+sub _isRawx
+{
+ my $self = shift ;
+ my $magic = shift ;
+
+ $magic = '' unless defined $magic ;
+
+ my $buffer = '';
+
+ $self->smartRead(\$buffer, *$self->{BlockSize}) >= 0
+ or return $self->saveErrorString(undef, "No data to read");
+
+ my $temp_buf = $magic . $buffer ;
+ *$self->{HeaderPending} = $temp_buf ;
+ $buffer = '';
+ my $status = *$self->{Uncomp}->uncompr(\$temp_buf, \$buffer, $self->smartEof()) ;
+
+ return $self->saveErrorString(undef, *$self->{Uncomp}{Error}, STATUS_ERROR)
+ if $status == STATUS_ERROR;
+
+ $self->pushBack($temp_buf) ;
+
+ return $self->saveErrorString(undef, "unexpected end of file", STATUS_ERROR)
+ if $self->smartEof() && $status != STATUS_ENDSTREAM;
+
+ #my $buf_len = *$self->{Uncomp}->uncompressedBytes();
+ my $buf_len = length $buffer;
+
+ if ($status == STATUS_ENDSTREAM) {
+ if (*$self->{MultiStream}
+ && (length $temp_buf || ! $self->smartEof())){
+ *$self->{NewStream} = 1 ;
+ *$self->{EndStream} = 0 ;
+ }
+ else {
+ *$self->{EndStream} = 1 ;
+ }
+ }
+ *$self->{HeaderPending} = $buffer ;
+ *$self->{InflatedBytesRead} = $buf_len ;
+ *$self->{TotalInflatedBytesRead} += $buf_len ;
+ *$self->{Type} = 'rfc1951';
+
+ $self->saveStatus(STATUS_OK);
+
+ return {
+ 'Type' => 'rfc1951',
+ 'HeaderLength' => 0,
+ 'TrailerLength' => 0,
+ 'Header' => ''
+ };
+}
+
+
+sub inflateSync
+{
+ my $self = shift ;
+
+ # inflateSync is a no-op in Plain mode
+ return 1
+ if *$self->{Plain} ;
+
+ return 0 if *$self->{Closed} ;
+ #return G_EOF if !length *$self->{Pending} && *$self->{EndStream} ;
+ return 0 if ! length *$self->{Pending} && *$self->{EndStream} ;
+
+ # Disable CRC check
+ *$self->{Strict} = 0 ;
+
+ my $status ;
+ while (1)
+ {
+ my $temp_buf ;
+
+ if (length *$self->{Pending} )
+ {
+ $temp_buf = *$self->{Pending} ;
+ *$self->{Pending} = '';
+ }
+ else
+ {
+ $status = $self->smartRead(\$temp_buf, *$self->{BlockSize}) ;
+ return $self->saveErrorString(0, "Error Reading Data")
+ if $status < 0 ;
+
+ if ($status == 0 ) {
+ *$self->{EndStream} = 1 ;
+ return $self->saveErrorString(0, "unexpected end of file", STATUS_ERROR);
+ }
+ }
+
+ $status = *$self->{Uncomp}->sync($temp_buf) ;
+
+ if ($status == STATUS_OK)
+ {
+ *$self->{Pending} .= $temp_buf ;
+ return 1 ;
+ }
+
+ last unless $status == STATUS_ERROR ;
+ }
+
+ return 0;
+}
+
+#sub performScan
+#{
+# my $self = shift ;
+#
+# my $status ;
+# my $end_offset = 0;
+#
+# $status = $self->scan()
+# #or return $self->saveErrorString(undef, "Error Scanning: $$error_ref", $self->errorNo) ;
+# or return $self->saveErrorString(G_ERR, "Error Scanning: $status")
+#
+# $status = $self->zap($end_offset)
+# or return $self->saveErrorString(G_ERR, "Error Zapping: $status");
+# #or return $self->saveErrorString(undef, "Error Zapping: $$error_ref", $self->errorNo) ;
+#
+# #(*$obj->{Deflate}, $status) = $inf->createDeflate();
+#
+## *$obj->{Header} = *$inf->{Info}{Header};
+## *$obj->{UnCompSize_32bit} =
+## *$obj->{BytesWritten} = *$inf->{UnCompSize_32bit} ;
+## *$obj->{CompSize_32bit} = *$inf->{CompSize_32bit} ;
+#
+#
+## if ( $outType eq 'buffer')
+## { substr( ${ *$self->{Buffer} }, $end_offset) = '' }
+## elsif ($outType eq 'handle' || $outType eq 'filename') {
+## *$self->{FH} = *$inf->{FH} ;
+## delete *$inf->{FH};
+## *$obj->{FH}->flush() ;
+## *$obj->{Handle} = 1 if $outType eq 'handle';
+##
+## #seek(*$obj->{FH}, $end_offset, SEEK_SET)
+## *$obj->{FH}->seek($end_offset, SEEK_SET)
+## or return $obj->saveErrorString(undef, $!, $!) ;
+## }
+#
+#}
+
+sub scan
+{
+ my $self = shift ;
+
+ return 1 if *$self->{Closed} ;
+ return 1 if !length *$self->{Pending} && *$self->{EndStream} ;
+
+ my $buffer = '' ;
+ my $len = 0;
+
+ $len = $self->_raw_read(\$buffer, 1)
+ while ! *$self->{EndStream} && $len >= 0 ;
+
+ #return $len if $len < 0 ? $len : 0 ;
+ return $len < 0 ? 0 : 1 ;
+}
+
+sub zap
+{
+ my $self = shift ;
+
+ my $headerLength = *$self->{Info}{HeaderLength};
+ my $block_offset = $headerLength + *$self->{Uncomp}->getLastBlockOffset();
+ $_[0] = $headerLength + *$self->{Uncomp}->getEndOffset();
+ #printf "# End $_[0], headerlen $headerLength \n";;
+ #printf "# block_offset $block_offset %x\n", $block_offset;
+ my $byte ;
+ ( $self->smartSeek($block_offset) &&
+ $self->smartRead(\$byte, 1) )
+ or return $self->saveErrorString(0, $!, $!);
+
+ #printf "#byte is %x\n", unpack('C*',$byte);
+ *$self->{Uncomp}->resetLastBlockByte($byte);
+ #printf "#to byte is %x\n", unpack('C*',$byte);
+
+ ( $self->smartSeek($block_offset) &&
+ $self->smartWrite($byte) )
+ or return $self->saveErrorString(0, $!, $!);
+
+ #$self->smartSeek($end_offset, 1);
+
+ return 1 ;
+}
+
+sub createDeflate
+{
+ my $self = shift ;
+ my ($def, $status) = *$self->{Uncomp}->createDeflateStream(
+ -AppendOutput => 1,
+ -WindowBits => - MAX_WBITS,
+ -CRC32 => *$self->{Params}->value('CRC32'),
+ -ADLER32 => *$self->{Params}->value('ADLER32'),
+ );
+
+ return wantarray ? ($status, $def) : $def ;
+}
+
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+IO::Uncompress::RawInflate - Read RFC 1951 files/buffers
+
+=head1 SYNOPSIS
+
+ use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ;
+
+ my $status = rawinflate $input => $output [,OPTS]
+ or die "rawinflate failed: $RawInflateError\n";
+
+ my $z = new IO::Uncompress::RawInflate $input [OPTS]
+ or die "rawinflate failed: $RawInflateError\n";
+
+ $status = $z->read($buffer)
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+ $line = $z->getline()
+ $char = $z->getc()
+ $char = $z->ungetc()
+ $char = $z->opened()
+
+ $status = $z->inflateSync()
+
+ $data = $z->trailingData()
+ $status = $z->nextStream()
+ $data = $z->getHeaderInfo()
+ $z->tell()
+ $z->seek($position, $whence)
+ $z->binmode()
+ $z->fileno()
+ $z->eof()
+ $z->close()
+
+ $RawInflateError ;
+
+ # IO::File mode
+
+ <$z>
+ read($z, $buffer);
+ read($z, $buffer, $length);
+ read($z, $buffer, $length, $offset);
+ tell($z)
+ seek($z, $position, $whence)
+ binmode($z)
+ fileno($z)
+ eof($z)
+ close($z)
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows the reading of
+files/buffers that conform to RFC 1951.
+
+For writing RFC 1951 files/buffers, see the companion module IO::Compress::RawDeflate.
+
+=head1 Functional Interface
+
+A top-level function, C<rawinflate>, is provided to carry out
+"one-shot" uncompression between buffers and/or files. For finer
+control over the uncompression process, see the L</"OO Interface">
+section.
+
+ use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ;
+
+ rawinflate $input => $output [,OPTS]
+ or die "rawinflate failed: $RawInflateError\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 rawinflate $input => $output [, OPTS]
+
+C<rawinflate> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the compressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is uncompressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<rawinflate> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+uncompressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the uncompressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the uncompressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the uncompressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the uncompressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<rawinflate> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple compressed files/buffers and C<$output> is
+a single file/buffer, after uncompression C<$output> will contain a
+concatenation of all the uncompressed data from each of the input
+files/buffers.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<rawinflate>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<rawinflate> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<rawinflate> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeOut => 0|1 >>
+
+When writing to a file or filehandle, set C<binmode> before writing to the
+file.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+The behaviour of this option is dependent on the type of output data
+stream.
+
+=over 5
+
+=item * A Buffer
+
+If C<Append> is enabled, all uncompressed data will be append to the end of
+the output buffer. Otherwise the output buffer will be cleared before any
+uncompressed data is written to it.
+
+=item * A Filename
+
+If C<Append> is enabled, the file will be opened in append mode. Otherwise
+the contents of the file, if any, will be truncated before any uncompressed
+data is written to it.
+
+=item * A Filehandle
+
+If C<Append> is enabled, the filehandle will be positioned to the end of
+the file via a call to C<seek> before any uncompressed data is
+written to it. Otherwise the file pointer will not be moved.
+
+=back
+
+When C<Append> is specified, and set to true, it will I<append> all uncompressed
+data to the output data stream.
+
+So when the output is a filehandle it will carry out a seek to the eof
+before writing any uncompressed data. If the output is a filename, it will be opened for
+appending. If the output is a buffer, all uncompressed data will be appened to
+the existing buffer.
+
+Conversely when C<Append> is not specified, or it is present and is set to
+false, it will operate as follows.
+
+When the output is a filename, it will truncate the contents of the file
+before writing any uncompressed data. If the output is a filehandle
+its position will not be changed. If the output is a buffer, it will be
+wiped before any uncompressed data is output.
+
+Defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+This option is a no-op.
+
+=item C<< TrailingData => $scalar >>
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option.
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt.1951> and write the
+uncompressed data to the file C<file1.txt>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ;
+
+ my $input = "file1.txt.1951";
+ my $output = "file1.txt";
+ rawinflate $input => $output
+ or die "rawinflate failed: $RawInflateError\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+uncompressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt.1951"
+ or die "Cannot open 'file1.txt.1951': $!\n" ;
+ my $buffer ;
+ rawinflate $input => \$buffer
+ or die "rawinflate failed: $RawInflateError\n";
+
+To uncompress all files in the directory "/my/home" that match "*.txt.1951" and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ;
+
+ rawinflate '</my/home/*.txt.1951>' => '</my/home/#1.txt>'
+ or die "rawinflate failed: $RawInflateError\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ;
+
+ for my $input ( glob "/my/home/*.txt.1951" )
+ {
+ my $output = $input;
+ $output =~ s/.1951// ;
+ rawinflate $input => $output
+ or die "Error compressing '$input': $RawInflateError\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for IO::Uncompress::RawInflate is shown below
+
+ my $z = new IO::Uncompress::RawInflate $input [OPTS]
+ or die "IO::Uncompress::RawInflate failed: $RawInflateError\n";
+
+Returns an C<IO::Uncompress::RawInflate> object on success and undef on failure.
+The variable C<$RawInflateError> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Uncompress::RawInflate can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal input file operations can be carried out with
+C<$z>. For example, to read a line from a compressed file/buffer you can
+use either of these forms
+
+ $line = $z->getline();
+ $line = <$z>;
+
+The mandatory parameter C<$input> is used to determine the source of the
+compressed data. This parameter can take one of three forms.
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a scalar, it is assumed to be a filename. This
+file will be opened for reading and the compressed data will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the compressed data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the compressed data will be read from
+C<$$output>.
+
+=back
+
+=head2 Constructor Options
+
+The option names defined below are case insensitive and can be optionally
+prefixed by a '-'. So all of the following are valid
+
+ -AutoClose
+ -autoclose
+ AUTOCLOSE
+ autoclose
+
+OPTS is a combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$input> parameter is a filehandle. If
+specified, and the value is true, it will result in the file being closed once
+either the C<close> method is called or the IO::Uncompress::RawInflate object is
+destroyed.
+
+This parameter defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+Allows multiple concatenated compressed streams to be treated as a single
+compressed stream. Decompression will stop once either the end of the
+file/buffer is reached, an error is encountered (premature eof, corrupt
+compressed data) or the end of a stream is not immediately followed by the
+start of another stream.
+
+This parameter defaults to 0.
+
+=item C<< Prime => $string >>
+
+This option will uncompress the contents of C<$string> before processing the
+input file/buffer.
+
+This option can be useful when the compressed data is embedded in another
+file/data structure and it is not possible to work out where the compressed
+data begins without having to read the first few bytes. If this is the
+case, the uncompression can be I<primed> with these bytes using this
+option.
+
+=item C<< Transparent => 0|1 >>
+
+If this option is set and the input file/buffer is not compressed data,
+the module will allow reading of it anyway.
+
+In addition, if the input file/buffer does contain compressed data and
+there is non-compressed data immediately following it, setting this option
+will make this module treat the whole file/bufffer as a single data stream.
+
+This option defaults to 1.
+
+=item C<< BlockSize => $num >>
+
+When reading the compressed input data, IO::Uncompress::RawInflate will read it in
+blocks of C<$num> bytes.
+
+This option defaults to 4096.
+
+=item C<< InputLength => $size >>
+
+When present this option will limit the number of compressed bytes read
+from the input file/buffer to C<$size>. This option can be used in the
+situation where there is useful data directly after the compressed data
+stream and you know beforehand the exact length of the compressed data
+stream.
+
+This option is mostly used when reading from a filehandle, in which case
+the file pointer will be left pointing to the first byte directly after the
+compressed data stream.
+
+This option defaults to off.
+
+=item C<< Append => 0|1 >>
+
+This option controls what the C<read> method does with uncompressed data.
+
+If set to 1, all uncompressed data will be appended to the output parameter
+of the C<read> method.
+
+If set to 0, the contents of the output parameter of the C<read> method
+will be overwritten by the uncompressed data.
+
+Defaults to 0.
+
+=item C<< Strict => 0|1 >>
+
+This option is a no-op.
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer)
+
+Reads a block of compressed data (the size the the compressed block is
+determined by the C<Buffer> option in the constructor), uncompresses it and
+writes any uncompressed data into C<$buffer>. If the C<Append> parameter is
+set in the constructor, the uncompressed data will be appended to the
+C<$buffer> parameter. Otherwise C<$buffer> will be overwritten.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+
+ $status = read($z, $buffer, $length)
+ $status = read($z, $buffer, $length, $offset)
+
+Attempt to read C<$length> bytes of uncompressed data into C<$buffer>.
+
+The main difference between this form of the C<read> method and the
+previous one, is that this one will attempt to return I<exactly> C<$length>
+bytes. The only circumstances that this function will not is if end-of-file
+or an IO error is encountered.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 getline
+
+Usage is
+
+ $line = $z->getline()
+ $line = <$z>
+
+Reads a single line.
+
+This method fully supports the use of of the variable C<$/> (or
+C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to
+determine what constitutes an end of line. Paragraph mode, record mode and
+file slurp mode are all supported.
+
+=head2 getc
+
+Usage is
+
+ $char = $z->getc()
+
+Read a single character.
+
+=head2 ungetc
+
+Usage is
+
+ $char = $z->ungetc($string)
+
+=head2 inflateSync
+
+Usage is
+
+ $status = $z->inflateSync()
+
+TODO
+
+=head2 getHeaderInfo
+
+Usage is
+
+ $hdr = $z->getHeaderInfo();
+ @hdrs = $z->getHeaderInfo();
+
+This method returns either a hash reference (in scalar context) or a list
+or hash references (in array context) that contains information about each
+of the header fields in the compressed data stream(s).
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the end of the compressed input stream has been reached.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the input file/buffer.
+It is a fatal error to attempt to seek backward.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+Returns the current uncompressed line number. If C<EXPR> is present it has
+the effect of setting the line number. Note that setting the line number
+does not change the current position within the file/buffer being read.
+
+The contents of C<$/> are used to to determine what constitutes a line
+terminator.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Uncompress::RawInflate object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Uncompress::RawInflate
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 nextStream
+
+Usage is
+
+ my $status = $z->nextStream();
+
+Skips to the next compressed data stream in the input file/buffer. If a new
+compressed data stream is found, the eof marker will be cleared and C<$.>
+will be reset to 0.
+
+Returns 1 if a new stream was found, 0 if none was found, and -1 if an
+error was encountered.
+
+=head2 trailingData
+
+Usage is
+
+ my $data = $z->trailingData();
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete. It only makes sense to call
+this method once the end of the compressed data stream has been
+encountered.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option in the constructor.
+
+=head1 Importing
+
+No symbolic constants are required by this IO::Uncompress::RawInflate at present.
+
+=over 5
+
+=item :all
+
+Imports C<rawinflate> and C<$RawInflateError>.
+Same as doing this
+
+ use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ;
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Working with Net::FTP
+
+See L<IO::Uncompress::RawInflate::FAQ|IO::Uncompress::RawInflate::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+For RFC 1950, 1951 and 1952 see
+F<http://www.faqs.org/rfcs/rfc1950.html>,
+F<http://www.faqs.org/rfcs/rfc1951.html> and
+F<http://www.faqs.org/rfcs/rfc1952.html>
+
+The I<zlib> compression library was written by Jean-loup Gailly
+F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
+
+The primary site for the I<zlib> compression library is
+F<http://www.zlib.org>.
+
+The primary site for gzip is F<http://www.gzip.org>.
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Unzip.pm b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Unzip.pm
new file mode 100755
index 00000000000..e7d6849f66b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Uncompress/Unzip.pm
@@ -0,0 +1,1549 @@
+package IO::Uncompress::Unzip;
+
+require 5.004 ;
+
+# for RFC1952
+
+use strict ;
+use warnings;
+use bytes;
+
+use IO::Uncompress::RawInflate 2.024 ;
+use IO::Compress::Base::Common 2.024 qw(:Status createSelfTiedObject);
+use IO::Uncompress::Adapter::Inflate 2.024 ;
+use IO::Uncompress::Adapter::Identity 2.024 ;
+use IO::Compress::Zlib::Extra 2.024 ;
+use IO::Compress::Zip::Constants 2.024 ;
+
+use Compress::Raw::Zlib 2.024 qw(crc32) ;
+
+BEGIN
+{
+ eval { require IO::Uncompress::Adapter::Bunzip2 ;
+ import IO::Uncompress::Adapter::Bunzip2 } ;
+# eval { require IO::Uncompress::Adapter::UnLzma ;
+# import IO::Uncompress::Adapter::UnLzma } ;
+}
+
+
+require Exporter ;
+
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $UnzipError, %headerLookup);
+
+$VERSION = '2.024';
+$UnzipError = '';
+
+@ISA = qw(Exporter IO::Uncompress::RawInflate);
+@EXPORT_OK = qw( $UnzipError unzip );
+%EXPORT_TAGS = %IO::Uncompress::RawInflate::EXPORT_TAGS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+Exporter::export_ok_tags('all');
+
+%headerLookup = (
+ ZIP_CENTRAL_HDR_SIG, \&skipCentralDirectory,
+ ZIP_END_CENTRAL_HDR_SIG, \&skipEndCentralDirectory,
+ ZIP64_END_CENTRAL_REC_HDR_SIG, \&skipCentralDirectory64Rec,
+ ZIP64_END_CENTRAL_LOC_HDR_SIG, \&skipCentralDirectory64Loc,
+ ZIP64_ARCHIVE_EXTRA_SIG, \&skipArchiveExtra,
+ ZIP64_DIGITAL_SIGNATURE_SIG, \&skipDigitalSignature,
+ );
+
+sub new
+{
+ my $class = shift ;
+ my $obj = createSelfTiedObject($class, \$UnzipError);
+ $obj->_create(undef, 0, @_);
+}
+
+sub unzip
+{
+ my $obj = createSelfTiedObject(undef, \$UnzipError);
+ return $obj->_inf(@_) ;
+}
+
+sub getExtraParams
+{
+ use IO::Compress::Base::Common 2.024 qw(:Parse);
+
+
+ return (
+# # Zip header fields
+ 'Name' => [1, 1, Parse_any, undef],
+
+# 'Stream' => [1, 1, Parse_boolean, 1],
+ # This means reading the central directory to get
+ # 1. the local header offsets
+ # 2. The compressed data length
+ );
+}
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ # unzip always needs crc32
+ $got->value('CRC32' => 1);
+
+ *$self->{UnzipData}{Name} = $got->value('Name');
+
+ return 1;
+}
+
+sub mkUncomp
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ my $magic = $self->ckMagic()
+ or return 0;
+
+ *$self->{Info} = $self->readHeader($magic)
+ or return undef ;
+
+ return 1;
+
+}
+
+sub ckMagic
+{
+ my $self = shift;
+
+ my $magic ;
+ $self->smartReadExact(\$magic, 4);
+
+ *$self->{HeaderPending} = $magic ;
+
+ return $self->HeaderError("Minimum header size is " .
+ 4 . " bytes")
+ if length $magic != 4 ;
+
+ return $self->HeaderError("Bad Magic")
+ if ! _isZipMagic($magic) ;
+
+ *$self->{Type} = 'zip';
+
+ return $magic ;
+}
+
+
+sub fastForward
+{
+ my $self = shift;
+ my $offset = shift;
+
+ # TODO - if Stream isn't enabled & reading from file, use seek
+
+ my $buffer = '';
+ my $c = 1024 * 16;
+
+ while ($offset > 0)
+ {
+ $c = length $offset
+ if length $offset < $c ;
+
+ $offset -= $c;
+
+ $self->smartReadExact(\$buffer, $c)
+ or return 0;
+ }
+
+ return 1;
+}
+
+
+sub readHeader
+{
+ my $self = shift;
+ my $magic = shift ;
+
+ my $name = *$self->{UnzipData}{Name} ;
+ my $hdr = $self->_readZipHeader($magic) ;
+
+ while (defined $hdr)
+ {
+ if (! defined $name || $hdr->{Name} eq $name)
+ {
+ return $hdr ;
+ }
+
+ # skip the data
+ # TODO - when Stream is off, use seek
+ my $buffer;
+ if (*$self->{ZipData}{Streaming}) {
+
+ while (1) {
+
+ my $b;
+ my $status = $self->smartRead(\$b, 1024 * 16);
+ return undef
+ if $status <= 0 ;
+
+ my $temp_buf;
+ my $out;
+ $status = *$self->{Uncomp}->uncompr(\$b, \$temp_buf, 0, $out);
+
+ return $self->saveErrorString(undef, *$self->{Uncomp}{Error},
+ *$self->{Uncomp}{ErrorNo})
+ if $self->saveStatus($status) == STATUS_ERROR;
+
+ if ($status == STATUS_ENDSTREAM) {
+ *$self->{Uncomp}->reset();
+ $self->pushBack($b) ;
+ last;
+ }
+ }
+
+ # skip the trailer
+ $self->smartReadExact(\$buffer, $hdr->{TrailerLength})
+ or return $self->saveErrorString(undef, "Truncated file");
+ }
+ else {
+ my $c = $hdr->{CompressedLength}->get64bit();
+ $self->fastForward($c)
+ or return $self->saveErrorString(undef, "Truncated file");
+ $buffer = '';
+ }
+
+ $self->chkTrailer($buffer) == STATUS_OK
+ or return $self->saveErrorString(undef, "Truncated file");
+
+ $hdr = $self->_readFullZipHeader();
+
+ return $self->saveErrorString(undef, "Cannot find '$name'")
+ if $self->smartEof();
+ }
+
+ return undef;
+}
+
+sub chkTrailer
+{
+ my $self = shift;
+ my $trailer = shift;
+
+ my ($sig, $CRC32, $cSize, $uSize) ;
+ my ($cSizeHi, $uSizeHi) = (0, 0);
+ if (*$self->{ZipData}{Streaming}) {
+ $sig = unpack ("V", substr($trailer, 0, 4));
+ $CRC32 = unpack ("V", substr($trailer, 4, 4));
+
+ if (*$self->{ZipData}{Zip64} ) {
+ $cSize = U64::newUnpack_V64 substr($trailer, 8, 8);
+ $uSize = U64::newUnpack_V64 substr($trailer, 16, 8);
+ }
+ else {
+ $cSize = U64::newUnpack_V32 substr($trailer, 8, 4);
+ $uSize = U64::newUnpack_V32 substr($trailer, 12, 4);
+ }
+
+ return $self->TrailerError("Data Descriptor signature, got $sig")
+ if $sig != ZIP_DATA_HDR_SIG;
+ }
+ else {
+ ($CRC32, $cSize, $uSize) =
+ (*$self->{ZipData}{Crc32},
+ *$self->{ZipData}{CompressedLen},
+ *$self->{ZipData}{UnCompressedLen});
+ }
+
+ *$self->{Info}{CRC32} = *$self->{ZipData}{CRC32} ;
+ *$self->{Info}{CompressedLength} = $cSize->get64bit();
+ *$self->{Info}{UncompressedLength} = $uSize->get64bit();
+
+ if (*$self->{Strict}) {
+ return $self->TrailerError("CRC mismatch")
+ if $CRC32 != *$self->{ZipData}{CRC32} ;
+
+ return $self->TrailerError("CSIZE mismatch.")
+ if ! $cSize->equal(*$self->{CompSize});
+
+ return $self->TrailerError("USIZE mismatch.")
+ if ! $uSize->equal(*$self->{UnCompSize});
+ }
+
+ my $reachedEnd = STATUS_ERROR ;
+ # check for central directory or end of central directory
+ while (1)
+ {
+ my $magic ;
+ my $got = $self->smartRead(\$magic, 4);
+
+ return $self->saveErrorString(STATUS_ERROR, "Truncated file")
+ if $got != 4 && *$self->{Strict};
+
+ if ($got == 0) {
+ return STATUS_EOF ;
+ }
+ elsif ($got < 0) {
+ return STATUS_ERROR ;
+ }
+ elsif ($got < 4) {
+ $self->pushBack($magic) ;
+ return STATUS_OK ;
+ }
+
+ my $sig = unpack("V", $magic) ;
+
+ my $hdr;
+ if ($hdr = $headerLookup{$sig})
+ {
+ if (&$hdr($self, $magic) != STATUS_OK ) {
+ if (*$self->{Strict}) {
+ return STATUS_ERROR ;
+ }
+ else {
+ $self->clearError();
+ return STATUS_OK ;
+ }
+ }
+
+ if ($sig == ZIP_END_CENTRAL_HDR_SIG)
+ {
+ return STATUS_OK ;
+ last;
+ }
+ }
+ elsif ($sig == ZIP_LOCAL_HDR_SIG)
+ {
+ $self->pushBack($magic) ;
+ return STATUS_OK ;
+ }
+ else
+ {
+ # put the data back
+ $self->pushBack($magic) ;
+ last;
+ }
+ }
+
+ return $reachedEnd ;
+}
+
+sub skipCentralDirectory
+{
+ my $self = shift;
+ my $magic = shift ;
+
+ my $buffer;
+ $self->smartReadExact(\$buffer, 46 - 4)
+ or return $self->TrailerError("Minimum header size is " .
+ 46 . " bytes") ;
+
+ my $keep = $magic . $buffer ;
+ *$self->{HeaderPending} = $keep ;
+
+ #my $versionMadeBy = unpack ("v", substr($buffer, 4-4, 2));
+ #my $extractVersion = unpack ("v", substr($buffer, 6-4, 2));
+ #my $gpFlag = unpack ("v", substr($buffer, 8-4, 2));
+ #my $compressedMethod = unpack ("v", substr($buffer, 10-4, 2));
+ #my $lastModTime = unpack ("V", substr($buffer, 12-4, 4));
+ #my $crc32 = unpack ("V", substr($buffer, 16-4, 4));
+ my $compressedLength = unpack ("V", substr($buffer, 20-4, 4));
+ my $uncompressedLength = unpack ("V", substr($buffer, 24-4, 4));
+ my $filename_length = unpack ("v", substr($buffer, 28-4, 2));
+ my $extra_length = unpack ("v", substr($buffer, 30-4, 2));
+ my $comment_length = unpack ("v", substr($buffer, 32-4, 2));
+ #my $disk_start = unpack ("v", substr($buffer, 34-4, 2));
+ #my $int_file_attrib = unpack ("v", substr($buffer, 36-4, 2));
+ #my $ext_file_attrib = unpack ("V", substr($buffer, 38-4, 2));
+ #my $lcl_hdr_offset = unpack ("V", substr($buffer, 42-4, 2));
+
+
+ my $filename;
+ my $extraField;
+ my $comment ;
+ if ($filename_length)
+ {
+ $self->smartReadExact(\$filename, $filename_length)
+ or return $self->TruncatedTrailer("filename");
+ $keep .= $filename ;
+ }
+
+ if ($extra_length)
+ {
+ $self->smartReadExact(\$extraField, $extra_length)
+ or return $self->TruncatedTrailer("extra");
+ $keep .= $extraField ;
+ }
+
+ if ($comment_length)
+ {
+ $self->smartReadExact(\$comment, $comment_length)
+ or return $self->TruncatedTrailer("comment");
+ $keep .= $comment ;
+ }
+
+ return STATUS_OK ;
+}
+
+sub skipArchiveExtra
+{
+ my $self = shift;
+ my $magic = shift ;
+
+ my $buffer;
+ $self->smartReadExact(\$buffer, 4)
+ or return $self->TrailerError("Minimum header size is " .
+ 4 . " bytes") ;
+
+ my $keep = $magic . $buffer ;
+
+ my $size = unpack ("V", $buffer);
+
+ $self->smartReadExact(\$buffer, $size)
+ or return $self->TrailerError("Minimum header size is " .
+ $size . " bytes") ;
+
+ $keep .= $buffer ;
+ *$self->{HeaderPending} = $keep ;
+
+ return STATUS_OK ;
+}
+
+
+sub skipCentralDirectory64Rec
+{
+ my $self = shift;
+ my $magic = shift ;
+
+ my $buffer;
+ $self->smartReadExact(\$buffer, 8)
+ or return $self->TrailerError("Minimum header size is " .
+ 8 . " bytes") ;
+
+ my $keep = $magic . $buffer ;
+
+ my ($sizeLo, $sizeHi) = unpack ("V V", $buffer);
+ my $size = $sizeHi * 0xFFFFFFFF + $sizeLo;
+
+ $self->fastForward($size)
+ or return $self->TrailerError("Minimum header size is " .
+ $size . " bytes") ;
+
+ #$keep .= $buffer ;
+ #*$self->{HeaderPending} = $keep ;
+
+ #my $versionMadeBy = unpack ("v", substr($buffer, 0, 2));
+ #my $extractVersion = unpack ("v", substr($buffer, 2, 2));
+ #my $diskNumber = unpack ("V", substr($buffer, 4, 4));
+ #my $cntrlDirDiskNo = unpack ("V", substr($buffer, 8, 4));
+ #my $entriesInThisCD = unpack ("V V", substr($buffer, 12, 8));
+ #my $entriesInCD = unpack ("V V", substr($buffer, 20, 8));
+ #my $sizeOfCD = unpack ("V V", substr($buffer, 28, 8));
+ #my $offsetToCD = unpack ("V V", substr($buffer, 36, 8));
+
+ return STATUS_OK ;
+}
+
+sub skipCentralDirectory64Loc
+{
+ my $self = shift;
+ my $magic = shift ;
+
+ my $buffer;
+ $self->smartReadExact(\$buffer, 20 - 4)
+ or return $self->TrailerError("Minimum header size is " .
+ 20 . " bytes") ;
+
+ my $keep = $magic . $buffer ;
+ *$self->{HeaderPending} = $keep ;
+
+ #my $startCdDisk = unpack ("V", substr($buffer, 4-4, 4));
+ #my $offsetToCD = unpack ("V V", substr($buffer, 8-4, 8));
+ #my $diskCount = unpack ("V", substr($buffer, 16-4, 4));
+
+ return STATUS_OK ;
+}
+
+sub skipEndCentralDirectory
+{
+ my $self = shift;
+ my $magic = shift ;
+
+ my $buffer;
+ $self->smartReadExact(\$buffer, 22 - 4)
+ or return $self->TrailerError("Minimum header size is " .
+ 22 . " bytes") ;
+
+ my $keep = $magic . $buffer ;
+ *$self->{HeaderPending} = $keep ;
+
+ #my $diskNumber = unpack ("v", substr($buffer, 4-4, 2));
+ #my $cntrlDirDiskNo = unpack ("v", substr($buffer, 6-4, 2));
+ #my $entriesInThisCD = unpack ("v", substr($buffer, 8-4, 2));
+ #my $entriesInCD = unpack ("v", substr($buffer, 10-4, 2));
+ #my $sizeOfCD = unpack ("V", substr($buffer, 12-4, 2));
+ #my $offsetToCD = unpack ("V", substr($buffer, 16-4, 2));
+ my $comment_length = unpack ("v", substr($buffer, 20-4, 2));
+
+
+ my $comment ;
+ if ($comment_length)
+ {
+ $self->smartReadExact(\$comment, $comment_length)
+ or return $self->TruncatedTrailer("comment");
+ $keep .= $comment ;
+ }
+
+ return STATUS_OK ;
+}
+
+
+sub _isZipMagic
+{
+ my $buffer = shift ;
+ return 0 if length $buffer < 4 ;
+ my $sig = unpack("V", $buffer) ;
+ return $sig == ZIP_LOCAL_HDR_SIG ;
+}
+
+
+sub _readFullZipHeader($)
+{
+ my ($self) = @_ ;
+ my $magic = '' ;
+
+ $self->smartReadExact(\$magic, 4);
+
+ *$self->{HeaderPending} = $magic ;
+
+ return $self->HeaderError("Minimum header size is " .
+ 30 . " bytes")
+ if length $magic != 4 ;
+
+
+ return $self->HeaderError("Bad Magic")
+ if ! _isZipMagic($magic) ;
+
+ my $status = $self->_readZipHeader($magic);
+ delete *$self->{Transparent} if ! defined $status ;
+ return $status ;
+}
+
+sub _readZipHeader($)
+{
+ my ($self, $magic) = @_ ;
+ my ($HeaderCRC) ;
+ my ($buffer) = '' ;
+
+ $self->smartReadExact(\$buffer, 30 - 4)
+ or return $self->HeaderError("Minimum header size is " .
+ 30 . " bytes") ;
+
+ my $keep = $magic . $buffer ;
+ *$self->{HeaderPending} = $keep ;
+
+ my $extractVersion = unpack ("v", substr($buffer, 4-4, 2));
+ my $gpFlag = unpack ("v", substr($buffer, 6-4, 2));
+ my $compressedMethod = unpack ("v", substr($buffer, 8-4, 2));
+ my $lastModTime = unpack ("V", substr($buffer, 10-4, 4));
+ my $crc32 = unpack ("V", substr($buffer, 14-4, 4));
+ my $compressedLength = U64::newUnpack_V32 substr($buffer, 18-4, 4);
+ my $uncompressedLength = U64::newUnpack_V32 substr($buffer, 22-4, 4);
+ my $filename_length = unpack ("v", substr($buffer, 26-4, 2));
+ my $extra_length = unpack ("v", substr($buffer, 28-4, 2));
+
+ my $filename;
+ my $extraField;
+ my @EXTRA = ();
+ my $streamingMode = ($gpFlag & ZIP_GP_FLAG_STREAMING_MASK) ? 1 : 0 ;
+
+ return $self->HeaderError("Streamed Stored content not supported")
+ if $streamingMode && $compressedMethod == 0 ;
+
+ return $self->HeaderError("Encrypted content not supported")
+ if $gpFlag & (ZIP_GP_FLAG_ENCRYPTED_MASK|ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK);
+
+ return $self->HeaderError("Patch content not supported")
+ if $gpFlag & ZIP_GP_FLAG_PATCHED_MASK;
+
+ *$self->{ZipData}{Streaming} = $streamingMode;
+
+
+ if ($filename_length)
+ {
+ $self->smartReadExact(\$filename, $filename_length)
+ or return $self->TruncatedHeader("Filename");
+ $keep .= $filename ;
+ }
+
+ my $zip64 = 0 ;
+
+ if ($extra_length)
+ {
+ $self->smartReadExact(\$extraField, $extra_length)
+ or return $self->TruncatedHeader("Extra Field");
+
+ my $bad = IO::Compress::Zlib::Extra::parseRawExtra($extraField,
+ \@EXTRA, 1, 0);
+ return $self->HeaderError($bad)
+ if defined $bad;
+
+ $keep .= $extraField ;
+
+ my %Extra ;
+ for (@EXTRA)
+ {
+ $Extra{$_->[0]} = \$_->[1];
+ }
+
+ if (defined $Extra{ZIP_EXTRA_ID_ZIP64()})
+ {
+ $zip64 = 1 ;
+
+ my $buff = ${ $Extra{ZIP_EXTRA_ID_ZIP64()} };
+
+ # This code assumes that all the fields in the Zip64
+ # extra field aren't necessarily present. The spec says that
+ # they only exist if the equivalent local headers are -1.
+
+ if (! $streamingMode) {
+ my $offset = 0 ;
+
+ if ($uncompressedLength->get32bit() == 0xFFFFFFFF ) {
+ $uncompressedLength
+ = U64::newUnpack_V64 substr($buff, 0, 8);
+
+ $offset += 8 ;
+ }
+
+ if ($compressedLength->get32bit() == 0xFFFFFFFF) {
+
+ $compressedLength
+ = U64::newUnpack_V64 substr($buff, $offset, 8);
+
+ $offset += 8 ;
+ }
+ }
+ }
+ }
+
+ *$self->{ZipData}{Zip64} = $zip64;
+
+ if (! $streamingMode) {
+ *$self->{ZipData}{Streaming} = 0;
+ *$self->{ZipData}{Crc32} = $crc32;
+ *$self->{ZipData}{CompressedLen} = $compressedLength;
+ *$self->{ZipData}{UnCompressedLen} = $uncompressedLength;
+ *$self->{CompressedInputLengthRemaining} =
+ *$self->{CompressedInputLength} = $compressedLength->get64bit();
+ }
+
+ *$self->{ZipData}{CRC32} = crc32(undef);
+ *$self->{ZipData}{Method} = $compressedMethod;
+ if ($compressedMethod == ZIP_CM_DEFLATE)
+ {
+ *$self->{Type} = 'zip-deflate';
+ my $obj = IO::Uncompress::Adapter::Inflate::mkUncompObject(1,0,0);
+
+ *$self->{Uncomp} = $obj;
+ }
+ elsif ($compressedMethod == ZIP_CM_BZIP2)
+ {
+ return $self->HeaderError("Unsupported Compression format $compressedMethod")
+ if ! defined $IO::Uncompress::Adapter::Bunzip2::VERSION ;
+
+ *$self->{Type} = 'zip-bzip2';
+
+ my $obj = IO::Uncompress::Adapter::Bunzip2::mkUncompObject();
+
+ *$self->{Uncomp} = $obj;
+ }
+# elsif ($compressedMethod == ZIP_CM_LZMA)
+# {
+# return $self->HeaderError("Unsupported Compression format $compressedMethod")
+# if ! defined $IO::Uncompress::Adapter::UnLzma::VERSION ;
+#
+# *$self->{Type} = 'zip-lzma';
+# my $LzmaHeader;
+# $self->smartReadExact(\$LzmaHeader, 4)
+# or return $self->saveErrorString(undef, "Truncated file");
+# my ($verHi, $verLo) = unpack ("CC", substr($LzmaHeader, 0, 2));
+# my $LzmaPropertiesSize = unpack ("v", substr($LzmaHeader, 2, 2));
+#
+#
+# my $LzmaPropertyData;
+# $self->smartReadExact(\$LzmaPropertyData, $LzmaPropertiesSize)
+# or return $self->saveErrorString(undef, "Truncated file");
+# #my $LzmaInfo = unpack ("C", substr($LzmaPropertyData, 0, 1));
+# #my $LzmaDictSize = unpack ("V", substr($LzmaPropertyData, 1, 4));
+#
+# # Create an LZMA_Alone header
+# $self->pushBack($LzmaPropertyData .
+# $uncompressedLength->getPacked_V64());
+#
+# my $obj =
+# IO::Uncompress::Adapter::UnLzma::mkUncompObject();
+#
+# *$self->{Uncomp} = $obj;
+# }
+ elsif ($compressedMethod == ZIP_CM_STORE)
+ {
+ # TODO -- add support for reading uncompressed
+
+ *$self->{Type} = 'zip-stored';
+
+ my $obj = IO::Uncompress::Adapter::Identity::mkUncompObject();
+
+ *$self->{Uncomp} = $obj;
+ }
+ else
+ {
+ return $self->HeaderError("Unsupported Compression format $compressedMethod");
+ }
+
+ return {
+ 'Type' => 'zip',
+ 'FingerprintLength' => 4,
+ #'HeaderLength' => $compressedMethod == 8 ? length $keep : 0,
+ 'HeaderLength' => length $keep,
+ 'Zip64' => $zip64,
+ 'TrailerLength' => ! $streamingMode ? 0 : $zip64 ? 24 : 16,
+ 'Header' => $keep,
+ 'CompressedLength' => $compressedLength ,
+ 'UncompressedLength' => $uncompressedLength ,
+ 'CRC32' => $crc32 ,
+ 'Name' => $filename,
+ 'Time' => _dosToUnixTime($lastModTime),
+ 'Stream' => $streamingMode,
+
+ 'MethodID' => $compressedMethod,
+ 'MethodName' => $compressedMethod == ZIP_CM_DEFLATE
+ ? "Deflated"
+ : $compressedMethod == ZIP_CM_BZIP2
+ ? "Bzip2"
+ : $compressedMethod == ZIP_CM_LZMA
+ ? "Lzma"
+ : $compressedMethod == ZIP_CM_STORE
+ ? "Stored"
+ : "Unknown" ,
+
+# 'TextFlag' => $flag & GZIP_FLG_FTEXT ? 1 : 0,
+# 'HeaderCRCFlag' => $flag & GZIP_FLG_FHCRC ? 1 : 0,
+# 'NameFlag' => $flag & GZIP_FLG_FNAME ? 1 : 0,
+# 'CommentFlag' => $flag & GZIP_FLG_FCOMMENT ? 1 : 0,
+# 'ExtraFlag' => $flag & GZIP_FLG_FEXTRA ? 1 : 0,
+# 'Comment' => $comment,
+# 'OsID' => $os,
+# 'OsName' => defined $GZIP_OS_Names{$os}
+# ? $GZIP_OS_Names{$os} : "Unknown",
+# 'HeaderCRC' => $HeaderCRC,
+# 'Flags' => $flag,
+# 'ExtraFlags' => $xfl,
+ 'ExtraFieldRaw' => $extraField,
+ 'ExtraField' => [ @EXTRA ],
+
+
+ }
+}
+
+sub filterUncompressed
+{
+ my $self = shift ;
+
+ if (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) {
+ *$self->{ZipData}{CRC32} = *$self->{Uncomp}->crc32() ;
+ }
+ else {
+ *$self->{ZipData}{CRC32} = crc32(${$_[0]}, *$self->{ZipData}{CRC32});
+ }
+}
+
+
+# from Archive::Zip & info-zip
+sub _dosToUnixTime
+{
+ my $dt = shift;
+
+ my $year = ( ( $dt >> 25 ) & 0x7f ) + 80;
+ my $mon = ( ( $dt >> 21 ) & 0x0f ) - 1;
+ my $mday = ( ( $dt >> 16 ) & 0x1f );
+
+ my $hour = ( ( $dt >> 11 ) & 0x1f );
+ my $min = ( ( $dt >> 5 ) & 0x3f );
+ my $sec = ( ( $dt << 1 ) & 0x3e );
+
+
+ use POSIX 'mktime';
+
+ my $time_t = mktime( $sec, $min, $hour, $mday, $mon, $year, 0, 0, -1 );
+ return 0 if ! defined $time_t;
+ return $time_t;
+}
+
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+IO::Uncompress::Unzip - Read zip files/buffers
+
+=head1 SYNOPSIS
+
+ use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
+
+ my $status = unzip $input => $output [,OPTS]
+ or die "unzip failed: $UnzipError\n";
+
+ my $z = new IO::Uncompress::Unzip $input [OPTS]
+ or die "unzip failed: $UnzipError\n";
+
+ $status = $z->read($buffer)
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+ $line = $z->getline()
+ $char = $z->getc()
+ $char = $z->ungetc()
+ $char = $z->opened()
+
+ $status = $z->inflateSync()
+
+ $data = $z->trailingData()
+ $status = $z->nextStream()
+ $data = $z->getHeaderInfo()
+ $z->tell()
+ $z->seek($position, $whence)
+ $z->binmode()
+ $z->fileno()
+ $z->eof()
+ $z->close()
+
+ $UnzipError ;
+
+ # IO::File mode
+
+ <$z>
+ read($z, $buffer);
+ read($z, $buffer, $length);
+ read($z, $buffer, $length, $offset);
+ tell($z)
+ seek($z, $position, $whence)
+ binmode($z)
+ fileno($z)
+ eof($z)
+ close($z)
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows the reading of
+zlib files/buffers.
+
+For writing zip files/buffers, see the companion module IO::Compress::Zip.
+
+=head1 Functional Interface
+
+A top-level function, C<unzip>, is provided to carry out
+"one-shot" uncompression between buffers and/or files. For finer
+control over the uncompression process, see the L</"OO Interface">
+section.
+
+ use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
+
+ unzip $input => $output [,OPTS]
+ or die "unzip failed: $UnzipError\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 unzip $input => $output [, OPTS]
+
+C<unzip> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the compressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is uncompressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<unzip> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+uncompressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the uncompressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the uncompressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the uncompressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the uncompressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<unzip> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple compressed files/buffers and C<$output> is
+a single file/buffer, after uncompression C<$output> will contain a
+concatenation of all the uncompressed data from each of the input
+files/buffers.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<unzip>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<unzip> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<unzip> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeOut => 0|1 >>
+
+When writing to a file or filehandle, set C<binmode> before writing to the
+file.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+The behaviour of this option is dependent on the type of output data
+stream.
+
+=over 5
+
+=item * A Buffer
+
+If C<Append> is enabled, all uncompressed data will be append to the end of
+the output buffer. Otherwise the output buffer will be cleared before any
+uncompressed data is written to it.
+
+=item * A Filename
+
+If C<Append> is enabled, the file will be opened in append mode. Otherwise
+the contents of the file, if any, will be truncated before any uncompressed
+data is written to it.
+
+=item * A Filehandle
+
+If C<Append> is enabled, the filehandle will be positioned to the end of
+the file via a call to C<seek> before any uncompressed data is
+written to it. Otherwise the file pointer will not be moved.
+
+=back
+
+When C<Append> is specified, and set to true, it will I<append> all uncompressed
+data to the output data stream.
+
+So when the output is a filehandle it will carry out a seek to the eof
+before writing any uncompressed data. If the output is a filename, it will be opened for
+appending. If the output is a buffer, all uncompressed data will be appened to
+the existing buffer.
+
+Conversely when C<Append> is not specified, or it is present and is set to
+false, it will operate as follows.
+
+When the output is a filename, it will truncate the contents of the file
+before writing any uncompressed data. If the output is a filehandle
+its position will not be changed. If the output is a buffer, it will be
+wiped before any uncompressed data is output.
+
+Defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+If the input file/buffer contains multiple compressed data streams, this
+option will uncompress the whole lot as a single data stream.
+
+Defaults to 0.
+
+=item C<< TrailingData => $scalar >>
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option.
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt.zip> and write the
+uncompressed data to the file C<file1.txt>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
+
+ my $input = "file1.txt.zip";
+ my $output = "file1.txt";
+ unzip $input => $output
+ or die "unzip failed: $UnzipError\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+uncompressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt.zip"
+ or die "Cannot open 'file1.txt.zip': $!\n" ;
+ my $buffer ;
+ unzip $input => \$buffer
+ or die "unzip failed: $UnzipError\n";
+
+To uncompress all files in the directory "/my/home" that match "*.txt.zip" and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
+
+ unzip '</my/home/*.txt.zip>' => '</my/home/#1.txt>'
+ or die "unzip failed: $UnzipError\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
+
+ for my $input ( glob "/my/home/*.txt.zip" )
+ {
+ my $output = $input;
+ $output =~ s/.zip// ;
+ unzip $input => $output
+ or die "Error compressing '$input': $UnzipError\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for IO::Uncompress::Unzip is shown below
+
+ my $z = new IO::Uncompress::Unzip $input [OPTS]
+ or die "IO::Uncompress::Unzip failed: $UnzipError\n";
+
+Returns an C<IO::Uncompress::Unzip> object on success and undef on failure.
+The variable C<$UnzipError> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Uncompress::Unzip can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal input file operations can be carried out with
+C<$z>. For example, to read a line from a compressed file/buffer you can
+use either of these forms
+
+ $line = $z->getline();
+ $line = <$z>;
+
+The mandatory parameter C<$input> is used to determine the source of the
+compressed data. This parameter can take one of three forms.
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a scalar, it is assumed to be a filename. This
+file will be opened for reading and the compressed data will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the compressed data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the compressed data will be read from
+C<$$output>.
+
+=back
+
+=head2 Constructor Options
+
+The option names defined below are case insensitive and can be optionally
+prefixed by a '-'. So all of the following are valid
+
+ -AutoClose
+ -autoclose
+ AUTOCLOSE
+ autoclose
+
+OPTS is a combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$input> parameter is a filehandle. If
+specified, and the value is true, it will result in the file being closed once
+either the C<close> method is called or the IO::Uncompress::Unzip object is
+destroyed.
+
+This parameter defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+Treats the complete zip file/buffer as a single compressed data
+stream. When reading in multi-stream mode each member of the zip
+file/buffer will be uncompressed in turn until the end of the file/buffer
+is encountered.
+
+This parameter defaults to 0.
+
+=item C<< Prime => $string >>
+
+This option will uncompress the contents of C<$string> before processing the
+input file/buffer.
+
+This option can be useful when the compressed data is embedded in another
+file/data structure and it is not possible to work out where the compressed
+data begins without having to read the first few bytes. If this is the
+case, the uncompression can be I<primed> with these bytes using this
+option.
+
+=item C<< Transparent => 0|1 >>
+
+If this option is set and the input file/buffer is not compressed data,
+the module will allow reading of it anyway.
+
+In addition, if the input file/buffer does contain compressed data and
+there is non-compressed data immediately following it, setting this option
+will make this module treat the whole file/bufffer as a single data stream.
+
+This option defaults to 1.
+
+=item C<< BlockSize => $num >>
+
+When reading the compressed input data, IO::Uncompress::Unzip will read it in
+blocks of C<$num> bytes.
+
+This option defaults to 4096.
+
+=item C<< InputLength => $size >>
+
+When present this option will limit the number of compressed bytes read
+from the input file/buffer to C<$size>. This option can be used in the
+situation where there is useful data directly after the compressed data
+stream and you know beforehand the exact length of the compressed data
+stream.
+
+This option is mostly used when reading from a filehandle, in which case
+the file pointer will be left pointing to the first byte directly after the
+compressed data stream.
+
+This option defaults to off.
+
+=item C<< Append => 0|1 >>
+
+This option controls what the C<read> method does with uncompressed data.
+
+If set to 1, all uncompressed data will be appended to the output parameter
+of the C<read> method.
+
+If set to 0, the contents of the output parameter of the C<read> method
+will be overwritten by the uncompressed data.
+
+Defaults to 0.
+
+=item C<< Strict => 0|1 >>
+
+This option controls whether the extra checks defined below are used when
+carrying out the decompression. When Strict is on, the extra tests are
+carried out, when Strict is off they are not.
+
+The default for this option is off.
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer)
+
+Reads a block of compressed data (the size the the compressed block is
+determined by the C<Buffer> option in the constructor), uncompresses it and
+writes any uncompressed data into C<$buffer>. If the C<Append> parameter is
+set in the constructor, the uncompressed data will be appended to the
+C<$buffer> parameter. Otherwise C<$buffer> will be overwritten.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+
+ $status = read($z, $buffer, $length)
+ $status = read($z, $buffer, $length, $offset)
+
+Attempt to read C<$length> bytes of uncompressed data into C<$buffer>.
+
+The main difference between this form of the C<read> method and the
+previous one, is that this one will attempt to return I<exactly> C<$length>
+bytes. The only circumstances that this function will not is if end-of-file
+or an IO error is encountered.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 getline
+
+Usage is
+
+ $line = $z->getline()
+ $line = <$z>
+
+Reads a single line.
+
+This method fully supports the use of of the variable C<$/> (or
+C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to
+determine what constitutes an end of line. Paragraph mode, record mode and
+file slurp mode are all supported.
+
+=head2 getc
+
+Usage is
+
+ $char = $z->getc()
+
+Read a single character.
+
+=head2 ungetc
+
+Usage is
+
+ $char = $z->ungetc($string)
+
+=head2 inflateSync
+
+Usage is
+
+ $status = $z->inflateSync()
+
+TODO
+
+=head2 getHeaderInfo
+
+Usage is
+
+ $hdr = $z->getHeaderInfo();
+ @hdrs = $z->getHeaderInfo();
+
+This method returns either a hash reference (in scalar context) or a list
+or hash references (in array context) that contains information about each
+of the header fields in the compressed data stream(s).
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the end of the compressed input stream has been reached.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the input file/buffer.
+It is a fatal error to attempt to seek backward.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+Returns the current uncompressed line number. If C<EXPR> is present it has
+the effect of setting the line number. Note that setting the line number
+does not change the current position within the file/buffer being read.
+
+The contents of C<$/> are used to to determine what constitutes a line
+terminator.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Uncompress::Unzip object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Uncompress::Unzip
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 nextStream
+
+Usage is
+
+ my $status = $z->nextStream();
+
+Skips to the next compressed data stream in the input file/buffer. If a new
+compressed data stream is found, the eof marker will be cleared and C<$.>
+will be reset to 0.
+
+Returns 1 if a new stream was found, 0 if none was found, and -1 if an
+error was encountered.
+
+=head2 trailingData
+
+Usage is
+
+ my $data = $z->trailingData();
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete. It only makes sense to call
+this method once the end of the compressed data stream has been
+encountered.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option in the constructor.
+
+=head1 Importing
+
+No symbolic constants are required by this IO::Uncompress::Unzip at present.
+
+=over 5
+
+=item :all
+
+Imports C<unzip> and C<$UnzipError>.
+Same as doing this
+
+ use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Working with Net::FTP
+
+See L<IO::Uncompress::Unzip::FAQ|IO::Uncompress::Unzip::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+For RFC 1950, 1951 and 1952 see
+F<http://www.faqs.org/rfcs/rfc1950.html>,
+F<http://www.faqs.org/rfcs/rfc1951.html> and
+F<http://www.faqs.org/rfcs/rfc1952.html>
+
+The I<zlib> compression library was written by Jean-loup Gailly
+F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
+
+The primary site for the I<zlib> compression library is
+F<http://www.zlib.org>.
+
+The primary site for gzip is F<http://www.gzip.org>.
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Wrap.pm b/Master/tlpkg/tlperl.straw/lib/IO/Wrap.pm
new file mode 100755
index 00000000000..5a28392dd23
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Wrap.pm
@@ -0,0 +1,222 @@
+package IO::Wrap;
+
+# SEE DOCUMENTATION AT BOTTOM OF FILE
+
+require 5.002;
+
+use strict;
+use vars qw(@ISA @EXPORT $VERSION);
+@ISA = qw(Exporter);
+@EXPORT = qw(wraphandle);
+
+use FileHandle;
+use Carp;
+
+# The package version, both in 1.23 style *and* usable by MakeMaker:
+$VERSION = "2.110";
+
+
+#------------------------------
+# wraphandle RAW
+#------------------------------
+sub wraphandle {
+ my $raw = shift;
+ new IO::Wrap $raw;
+}
+
+#------------------------------
+# new STREAM
+#------------------------------
+sub new {
+ my ($class, $stream) = @_;
+ no strict 'refs';
+
+ ### Convert raw scalar to globref:
+ ref($stream) or $stream = \*$stream;
+
+ ### Wrap globref and incomplete objects:
+ if ((ref($stream) eq 'GLOB') or ### globref
+ (ref($stream) eq 'FileHandle') && !defined(&FileHandle::read)) {
+ return bless \$stream, $class;
+ }
+ $stream; ### already okay!
+}
+
+#------------------------------
+# I/O methods...
+#------------------------------
+sub close {
+ my $self = shift;
+ return close($$self);
+}
+sub getline {
+ my $self = shift;
+ my $fh = $$self;
+ return scalar(<$fh>);
+}
+sub getlines {
+ my $self = shift;
+ wantarray or croak("Can't call getlines in scalar context!");
+ my $fh = $$self;
+ <$fh>;
+}
+sub print {
+ my $self = shift;
+ print { $$self } @_;
+}
+sub read {
+ my $self = shift;
+ return read($$self, $_[0], $_[1]);
+}
+sub seek {
+ my $self = shift;
+ return seek($$self, $_[0], $_[1]);
+}
+sub tell {
+ my $self = shift;
+ return tell($$self);
+}
+
+#------------------------------
+1;
+__END__
+
+
+=head1 NAME
+
+IO::Wrap - wrap raw filehandles in IO::Handle interface
+
+
+=head1 SYNOPSIS
+
+ use IO::Wrap;
+
+ ### Do stuff with any kind of filehandle (including a bare globref), or
+ ### any kind of blessed object that responds to a print() message.
+ ###
+ sub do_stuff {
+ my $fh = shift;
+
+ ### At this point, we have no idea what the user gave us...
+ ### a globref? a FileHandle? a scalar filehandle name?
+
+ $fh = wraphandle($fh);
+
+ ### At this point, we know we have an IO::Handle-like object!
+
+ $fh->print("Hey there!");
+ ...
+ }
+
+
+=head1 DESCRIPTION
+
+Let's say you want to write some code which does I/O, but you don't
+want to force the caller to provide you with a FileHandle or IO::Handle
+object. You want them to be able to say:
+
+ do_stuff(\*STDOUT);
+ do_stuff('STDERR');
+ do_stuff($some_FileHandle_object);
+ do_stuff($some_IO_Handle_object);
+
+And even:
+
+ do_stuff($any_object_with_a_print_method);
+
+Sure, one way to do it is to force the caller to use tiehandle().
+But that puts the burden on them. Another way to do it is to
+use B<IO::Wrap>, which provides you with the following functions:
+
+
+=over 4
+
+=item wraphandle SCALAR
+
+This function will take a single argument, and "wrap" it based on
+what it seems to be...
+
+=over 4
+
+=item *
+
+B<A raw scalar filehandle name,> like C<"STDOUT"> or C<"Class::HANDLE">.
+In this case, the filehandle name is wrapped in an IO::Wrap object,
+which is returned.
+
+=item *
+
+B<A raw filehandle glob,> like C<\*STDOUT>.
+In this case, the filehandle glob is wrapped in an IO::Wrap object,
+which is returned.
+
+=item *
+
+B<A blessed FileHandle object.>
+In this case, the FileHandle is wrapped in an IO::Wrap object if and only
+if your FileHandle class does not support the C<read()> method.
+
+=item *
+
+B<Any other kind of blessed object,> which is assumed to be already
+conformant to the IO::Handle interface.
+In this case, you just get back that object.
+
+=back
+
+=back
+
+
+If you get back an IO::Wrap object, it will obey a basic subset of
+the IO:: interface. That is, the following methods (note: I said
+I<methods>, not named operators) should work on the thing you get back:
+
+ close
+ getline
+ getlines
+ print ARGS...
+ read BUFFER,NBYTES
+ seek POS,WHENCE
+ tell
+
+
+
+=head1 NOTES
+
+Clearly, when wrapping a raw external filehandle (like \*STDOUT),
+I didn't want to close the file descriptor when the "wrapper" object is
+destroyed... since the user might not appreciate that! Hence,
+there's no DESTROY method in this class.
+
+When wrapping a FileHandle object, however, I believe that Perl will
+invoke the FileHandle::DESTROY when the last reference goes away,
+so in that case, the filehandle is closed if the wrapped FileHandle
+really was the last reference to it.
+
+
+=head1 WARNINGS
+
+This module does not allow you to wrap filehandle names which are given
+as strings that lack the package they were opened in. That is, if a user
+opens FOO in package Foo, they must pass it to you either as C<\*FOO>
+or as C<"Foo::FOO">. However, C<"STDIN"> and friends will work just fine.
+
+
+=head1 VERSION
+
+$Id: Wrap.pm,v 1.2 2005/02/10 21:21:53 dfs Exp $
+
+
+=head1 AUTHOR
+
+=item Primary Maintainer
+
+David F. Skoll (F<dfs@roaringpenguin.com>).
+
+=item Original Author
+
+Eryq (F<eryq@zeegee.com>).
+President, ZeeGee Software Inc (F<http://www.zeegee.com>).
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/WrapTie.pm b/Master/tlpkg/tlperl.straw/lib/IO/WrapTie.pm
new file mode 100755
index 00000000000..5e22508bbd9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/WrapTie.pm
@@ -0,0 +1,491 @@
+# SEE DOCUMENTATION AT BOTTOM OF FILE
+
+
+#------------------------------------------------------------
+package IO::WrapTie;
+#------------------------------------------------------------
+require 5.004; ### for tie
+use strict;
+use vars qw(@ISA @EXPORT $VERSION);
+use Exporter;
+
+# Inheritance, exporting, and package version:
+@ISA = qw(Exporter);
+@EXPORT = qw(wraptie);
+$VERSION = "2.110";
+
+# Function, exported.
+sub wraptie {
+ IO::WrapTie::Master->new(@_);
+}
+
+# Class method; BACKWARDS-COMPATIBILITY ONLY!
+sub new {
+ shift;
+ IO::WrapTie::Master->new(@_);
+}
+
+
+
+#------------------------------------------------------------
+package IO::WrapTie::Master;
+#------------------------------------------------------------
+
+use strict;
+use vars qw(@ISA $AUTOLOAD);
+use IO::Handle;
+
+# We inherit from IO::Handle to get methods which invoke i/o operators,
+# like print(), on our tied handle:
+@ISA = qw(IO::Handle);
+
+#------------------------------
+# new SLAVE, TIEARGS...
+#------------------------------
+# Create a new subclass of IO::Handle which...
+#
+# (1) Handles i/o OPERATORS because it is tied to an instance of
+# an i/o-like class, like IO::Scalar.
+#
+# (2) Handles i/o METHODS by delegating them to that same tied object!.
+#
+# Arguments are the slave class (e.g., IO::Scalar), followed by all
+# the arguments normally sent into that class's TIEHANDLE method.
+# In other words, much like the arguments to tie(). :-)
+#
+# NOTE:
+# The thing $x we return must be a BLESSED REF, for ($x->print()).
+# The underlying symbol must be a FILEHANDLE, for (print $x "foo").
+# It has to have a way of getting to the "real" back-end object...
+#
+sub new {
+ my $master = shift;
+ my $io = IO::Handle->new; ### create a new handle
+ my $slave = shift;
+ tie *$io, $slave, @_; ### tie: will invoke slave's TIEHANDLE
+ bless $io, $master; ### return a master
+}
+
+#------------------------------
+# AUTOLOAD
+#------------------------------
+# Delegate method invocations on the master to the underlying slave.
+#
+sub AUTOLOAD {
+ my $method = $AUTOLOAD;
+ $method =~ s/.*:://;
+ my $self = shift; tied(*$self)->$method(\@_);
+}
+
+#------------------------------
+# PRELOAD
+#------------------------------
+# Utility.
+#
+# Most methods like print(), getline(), etc. which work on the tied object
+# via Perl's i/o operators (like 'print') are inherited from IO::Handle.
+#
+# Other methods, like seek() and sref(), we must delegate ourselves.
+# AUTOLOAD takes care of these.
+#
+# However, it may be necessary to preload delegators into your
+# own class. PRELOAD will do this.
+#
+sub PRELOAD {
+ my $class = shift;
+ foreach (@_) {
+ eval "sub ${class}::$_ { my \$s = shift; tied(*\$s)->$_(\@_) }";
+ }
+}
+
+# Preload delegators for some standard methods which we can't simply
+# inherit from IO::Handle... for example, some IO::Handle methods
+# assume that there is an underlying file descriptor.
+#
+PRELOAD IO::WrapTie::Master
+ qw(open opened close read clearerr eof seek tell setpos getpos);
+
+
+
+#------------------------------------------------------------
+package IO::WrapTie::Slave;
+#------------------------------------------------------------
+# Teeny private class providing a new_tie constructor...
+#
+# HOW IT ALL WORKS:
+#
+# Slaves inherit from this class.
+#
+# When you send a new_tie() message to a tie-slave class (like IO::Scalar),
+# it first determines what class should provide its master, via TIE_MASTER.
+# In this case, IO::Scalar->TIE_MASTER would return IO::Scalar::Master.
+# Then, we create a new master (an IO::Scalar::Master) with the same args
+# sent to new_tie.
+#
+# In general, the new() method of the master is inherited directly
+# from IO::WrapTie::Master.
+#
+sub new_tie {
+ my $self = shift;
+ $self->TIE_MASTER->new($self,@_); ### e.g., IO::Scalar::Master->new(@_)
+}
+
+# Default class method for new_tie().
+# All your tie-slave class (like IO::Scalar) has to do is override this
+# method with a method that returns the name of an appropriate "master"
+# class for tying that slave.
+#
+sub TIE_MASTER { 'IO::WrapTie::Master' }
+
+#------------------------------
+1;
+__END__
+
+
+package IO::WrapTie; ### for doc generator
+
+
+=head1 NAME
+
+IO::WrapTie - wrap tieable objects in IO::Handle interface
+
+I<This is currently Alpha code, released for comments.
+ Please give me your feedback!>
+
+
+=head1 SYNOPSIS
+
+First of all, you'll need tie(), so:
+
+ require 5.004;
+
+I<Function interface (experimental).>
+Use this with any existing class...
+
+ use IO::WrapTie;
+ use FooHandle; ### implements TIEHANDLE interface
+
+ ### Suppose we want a "FooHandle->new(&FOO_RDWR, 2)".
+ ### We can instead say...
+
+ $FH = wraptie('FooHandle', &FOO_RDWR, 2);
+
+ ### Now we can use...
+ print $FH "Hello, "; ### traditional operator syntax...
+ $FH->print("world!\n"); ### ...and OO syntax as well!
+
+I<OO interface (preferred).>
+You can inherit from the IO::WrapTie::Slave mixin to get a
+nifty C<new_tie()> constructor...
+
+ #------------------------------
+ package FooHandle; ### a class which can TIEHANDLE
+
+ use IO::WrapTie;
+ @ISA = qw(IO::WrapTie::Slave); ### inherit new_tie()
+ ...
+
+
+ #------------------------------
+ package main;
+
+ $FH = FooHandle->new_tie(&FOO_RDWR, 2); ### $FH is an IO::WrapTie::Master
+ print $FH "Hello, "; ### traditional operator syntax
+ $FH->print("world!\n"); ### OO syntax
+
+See IO::Scalar as an example. It also shows you how to create classes
+which work both with and without 5.004.
+
+
+=head1 DESCRIPTION
+
+Suppose you have a class C<FooHandle>, where...
+
+=over 4
+
+=item *
+
+B<FooHandle does not inherit from IO::Handle;> that is, it performs
+filehandle-like I/O, but to something other than an underlying
+file descriptor. Good examples are IO::Scalar (for printing to a
+string) and IO::Lines (for printing to an array of lines).
+
+=item *
+
+B<FooHandle implements the TIEHANDLE interface> (see L<perltie>);
+that is, it provides methods TIEHANDLE, GETC, PRINT, PRINTF,
+READ, and READLINE.
+
+=item *
+
+B<FooHandle implements the traditional OO interface> of
+FileHandle and IO::Handle; i.e., it contains methods like getline(),
+read(), print(), seek(), tell(), eof(), etc.
+
+=back
+
+
+Normally, users of your class would have two options:
+
+
+=over 4
+
+=item *
+
+B<Use only OO syntax,> and forsake named I/O operators like 'print'.
+
+=item *
+
+B<Use with tie,> and forsake treating it as a first-class object
+(i.e., class-specific methods can only be invoked through the underlying
+object via tied()... giving the object a "split personality").
+
+=back
+
+
+But now with IO::WrapTie, you can say:
+
+ $WT = wraptie('FooHandle', &FOO_RDWR, 2);
+ $WT->print("Hello, world\n"); ### OO syntax
+ print $WT "Yes!\n"; ### Named operator syntax too!
+ $WT->weird_stuff; ### Other methods!
+
+And if you're authoring a class like FooHandle, just have it inherit
+from C<IO::WrapTie::Slave> and that first line becomes even prettier:
+
+ $WT = FooHandle->new_tie(&FOO_RDWR, 2);
+
+B<The bottom line:> now, almost any class can look and work exactly like
+an IO::Handle... and be used both with OO and non-OO filehandle syntax.
+
+
+=head1 HOW IT ALL WORKS
+
+
+=head2 The data structures
+
+Consider this example code, using classes in this distribution:
+
+ use IO::Scalar;
+ use IO::WrapTie;
+
+ $WT = wraptie('IO::Scalar',\$s);
+ print $WT "Hello, ";
+ $WT->print("world!\n");
+
+In it, the wraptie() function creates a data structure as follows:
+
+ * $WT is a blessed reference to a tied filehandle
+ $WT glob; that glob is tied to the "Slave" object.
+ | * You would do all your i/o with $WT directly.
+ |
+ |
+ | ,---isa--> IO::WrapTie::Master >--isa--> IO::Handle
+ V /
+ .-------------.
+ | |
+ | | * Perl i/o operators work on the tied object,
+ | "Master" | invoking the TIEHANDLE methods.
+ | | * Method invocations are delegated to the tied
+ | | slave.
+ `-------------'
+ |
+ tied(*$WT) | .---isa--> IO::WrapTie::Slave
+ V /
+ .-------------.
+ | |
+ | "Slave" | * Instance of FileHandle-like class which doesn't
+ | | actually use file descriptors, like IO::Scalar.
+ | IO::Scalar | * The slave can be any kind of object.
+ | | * Must implement the TIEHANDLE interface.
+ `-------------'
+
+
+I<NOTE:> just as an IO::Handle is really just a blessed reference to a
+I<traditional> filehandle glob... so also, an IO::WrapTie::Master
+is really just a blessed reference to a filehandle
+glob I<which has been tied to some "slave" class.>
+
+
+=head2 How wraptie() works
+
+=over 4
+
+=item 1.
+
+The call to function C<wraptie(SLAVECLASS, TIEARGS...)> is
+passed onto C<IO::WrapTie::Master::new()>.
+Note that class IO::WrapTie::Master is a subclass of IO::Handle.
+
+=item 2.
+
+The C<IO::WrapTie::Master::new> method creates a new IO::Handle object,
+reblessed into class IO::WrapTie::Master. This object is the I<master>,
+which will be returned from the constructor. At the same time...
+
+=item 3.
+
+The C<new> method also creates the I<slave>: this is an instance
+of SLAVECLASS which is created by tying the master's IO::Handle
+to SLAVECLASS via C<tie(HANDLE, SLAVECLASS, TIEARGS...)>.
+This call to C<tie()> creates the slave in the following manner:
+
+=item 4.
+
+Class SLAVECLASS is sent the message C<TIEHANDLE(TIEARGS...)>; it
+will usually delegate this to C<SLAVECLASS::new(TIEARGS...)>, resulting
+in a new instance of SLAVECLASS being created and returned.
+
+=item 5.
+
+Once both master and slave have been created, the master is returned
+to the caller.
+
+=back
+
+
+=head2 How I/O operators work (on the master)
+
+Consider using an i/o operator on the master:
+
+ print $WT "Hello, world!\n";
+
+Since the master ($WT) is really a [blessed] reference to a glob,
+the normal Perl i/o operators like C<print> may be used on it.
+They will just operate on the symbol part of the glob.
+
+Since the glob is tied to the slave, the slave's PRINT method
+(part of the TIEHANDLE interface) will be automatically invoked.
+
+If the slave is an IO::Scalar, that means IO::Scalar::PRINT will be
+invoked, and that method happens to delegate to the C<print()> method
+of the same class. So the I<real> work is ultimately done by
+IO::Scalar::print().
+
+
+=head2 How methods work (on the master)
+
+Consider using a method on the master:
+
+ $WT->print("Hello, world!\n");
+
+Since the master ($WT) is blessed into the class IO::WrapTie::Master,
+Perl first attempts to find a C<print()> method there. Failing that,
+Perl next attempts to find a C<print()> method in the superclass,
+IO::Handle. It just so happens that there I<is> such a method;
+that method merely invokes the C<print> i/o operator on the self object...
+and for that, see above!
+
+But let's suppose we're dealing with a method which I<isn't> part
+of IO::Handle... for example:
+
+ my $sref = $WT->sref;
+
+In this case, the intuitive behavior is to have the master delegate the
+method invocation to the slave (now do you see where the designations
+come from?). This is indeed what happens: IO::WrapTie::Master contains
+an AUTOLOAD method which performs the delegation.
+
+So: when C<sref()> can't be found in IO::Handle, the AUTOLOAD method
+of IO::WrapTie::Master is invoked, and the standard behavior of
+delegating the method to the underlying slave (here, an IO::Scalar)
+is done.
+
+Sometimes, to get this to work properly, you may need to create
+a subclass of IO::WrapTie::Master which is an effective master for
+I<your> class, and do the delegation there.
+
+
+
+
+=head1 NOTES
+
+B<Why not simply use the object's OO interface?>
+ Because that means forsaking the use of named operators
+like print(), and you may need to pass the object to a subroutine
+which will attempt to use those operators:
+
+ $O = FooHandle->new(&FOO_RDWR, 2);
+ $O->print("Hello, world\n"); ### OO syntax is okay, BUT....
+
+ sub nope { print $_[0] "Nope!\n" }
+ X nope($O); ### ERROR!!! (not a glob ref)
+
+
+B<Why not simply use tie()?>
+ Because (1) you have to use tied() to invoke methods in the
+object's public interface (yuck), and (2) you may need to pass
+the tied symbol to another subroutine which will attempt to treat
+it in an OO-way... and that will break it:
+
+ tie *T, 'FooHandle', &FOO_RDWR, 2;
+ print T "Hello, world\n"; ### Operator is okay, BUT...
+
+ tied(*T)->other_stuff; ### yuck! AND...
+
+ sub nope { shift->print("Nope!\n") }
+ X nope(\*T); ### ERROR!!! (method "print" on unblessed ref)
+
+
+B<Why a master and slave?
+ Why not simply write FooHandle to inherit from IO::Handle?>
+ I tried this, with an implementation similar to that of IO::Socket.
+The problem is that I<the whole point is to use this with objects
+that don't have an underlying file/socket descriptor.>.
+Subclassing IO::Handle will work fine for the OO stuff, and fine with
+named operators I<if> you tie()... but if you just attempt to say:
+
+ $IO = FooHandle->new(&FOO_RDWR, 2);
+ print $IO "Hello!\n";
+
+you get a warning from Perl like:
+
+ Filehandle GEN001 never opened
+
+because it's trying to do system-level i/o on an (unopened) file
+descriptor. To avoid this, you apparently have to tie() the handle...
+which brings us right back to where we started! At least the
+IO::WrapTie mixin lets us say:
+
+ $IO = FooHandle->new_tie(&FOO_RDWR, 2);
+ print $IO "Hello!\n";
+
+and so is not I<too> bad. C<:-)>
+
+
+=head1 WARNINGS
+
+Remember: this stuff is for doing FileHandle-like i/o on things
+I<without underlying file descriptors>. If you have an underlying
+file descriptor, you're better off just inheriting from IO::Handle.
+
+B<Be aware that new_tie() always returns an instance of a
+kind of IO::WrapTie::Master...> it does B<not> return an instance
+of the i/o class you're tying to!
+
+Invoking some methods on the master object causes AUTOLOAD to delegate
+them to the slave object... so it I<looks> like you're manipulating a
+"FooHandle" object directly, but you're not.
+
+I have not explored all the ramifications of this use of tie().
+I<Here there be dragons>.
+
+
+=head1 VERSION
+
+$Id: WrapTie.pm,v 1.2 2005/02/10 21:21:53 dfs Exp $
+
+
+=head1 AUTHOR
+
+=item Primary Maintainer
+
+David F. Skoll (F<dfs@roaringpenguin.com>).
+
+=item Original Author
+
+Eryq (F<eryq@zeegee.com>).
+President, ZeeGee Software Inc (F<http://www.zeegee.com>).
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/IO/Zlib.pm b/Master/tlpkg/tlperl.straw/lib/IO/Zlib.pm
new file mode 100755
index 00000000000..55534b4f374
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/IO/Zlib.pm
@@ -0,0 +1,652 @@
+# IO::Zlib.pm
+#
+# Copyright (c) 1998-2004 Tom Hughes <tom@compton.nu>.
+# All rights reserved. This program is free software; you can redistribute
+# it and/or modify it under the same terms as Perl itself.
+
+package IO::Zlib;
+
+$VERSION = "1.10";
+
+=head1 NAME
+
+IO::Zlib - IO:: style interface to L<Compress::Zlib>
+
+=head1 SYNOPSIS
+
+With any version of Perl 5 you can use the basic OO interface:
+
+ use IO::Zlib;
+
+ $fh = new IO::Zlib;
+ if ($fh->open("file.gz", "rb")) {
+ print <$fh>;
+ $fh->close;
+ }
+
+ $fh = IO::Zlib->new("file.gz", "wb9");
+ if (defined $fh) {
+ print $fh "bar\n";
+ $fh->close;
+ }
+
+ $fh = IO::Zlib->new("file.gz", "rb");
+ if (defined $fh) {
+ print <$fh>;
+ undef $fh; # automatically closes the file
+ }
+
+With Perl 5.004 you can also use the TIEHANDLE interface to access
+compressed files just like ordinary files:
+
+ use IO::Zlib;
+
+ tie *FILE, 'IO::Zlib', "file.gz", "wb";
+ print FILE "line 1\nline2\n";
+
+ tie *FILE, 'IO::Zlib', "file.gz", "rb";
+ while (<FILE>) { print "LINE: ", $_ };
+
+=head1 DESCRIPTION
+
+C<IO::Zlib> provides an IO:: style interface to L<Compress::Zlib> and
+hence to gzip/zlib compressed files. It provides many of the same methods
+as the L<IO::Handle> interface.
+
+Starting from IO::Zlib version 1.02, IO::Zlib can also use an
+external F<gzip> command. The default behaviour is to try to use
+an external F<gzip> if no C<Compress::Zlib> can be loaded, unless
+explicitly disabled by
+
+ use IO::Zlib qw(:gzip_external 0);
+
+If explicitly enabled by
+
+ use IO::Zlib qw(:gzip_external 1);
+
+then the external F<gzip> is used B<instead> of C<Compress::Zlib>.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ARGS] )
+
+Creates an C<IO::Zlib> object. If it receives any parameters, they are
+passed to the method C<open>; if the open fails, the object is destroyed.
+Otherwise, it is returned to the caller.
+
+=back
+
+=head1 OBJECT METHODS
+
+=over 4
+
+=item open ( FILENAME, MODE )
+
+C<open> takes two arguments. The first is the name of the file to open
+and the second is the open mode. The mode can be anything acceptable to
+L<Compress::Zlib> and by extension anything acceptable to I<zlib> (that
+basically means POSIX fopen() style mode strings plus an optional number
+to indicate the compression level).
+
+=item opened
+
+Returns true if the object currently refers to a opened file.
+
+=item close
+
+Close the file associated with the object and disassociate
+the file from the handle.
+Done automatically on destroy.
+
+=item getc
+
+Return the next character from the file, or undef if none remain.
+
+=item getline
+
+Return the next line from the file, or undef on end of string.
+Can safely be called in an array context.
+Currently ignores $/ ($INPUT_RECORD_SEPARATOR or $RS when L<English>
+is in use) and treats lines as delimited by "\n".
+
+=item getlines
+
+Get all remaining lines from the file.
+It will croak() if accidentally called in a scalar context.
+
+=item print ( ARGS... )
+
+Print ARGS to the file.
+
+=item read ( BUF, NBYTES, [OFFSET] )
+
+Read some bytes from the file.
+Returns the number of bytes actually read, 0 on end-of-file, undef on error.
+
+=item eof
+
+Returns true if the handle is currently positioned at end of file?
+
+=item seek ( OFFSET, WHENCE )
+
+Seek to a given position in the stream.
+Not yet supported.
+
+=item tell
+
+Return the current position in the stream, as a numeric offset.
+Not yet supported.
+
+=item setpos ( POS )
+
+Set the current position, using the opaque value returned by C<getpos()>.
+Not yet supported.
+
+=item getpos ( POS )
+
+Return the current position in the string, as an opaque object.
+Not yet supported.
+
+=back
+
+=head1 USING THE EXTERNAL GZIP
+
+If the external F<gzip> is used, the following C<open>s are used:
+
+ open(FH, "gzip -dc $filename |") # for read opens
+ open(FH, " | gzip > $filename") # for write opens
+
+You can modify the 'commands' for example to hardwire
+an absolute path by e.g.
+
+ use IO::Zlib ':gzip_read_open' => '/some/where/gunzip -c %s |';
+ use IO::Zlib ':gzip_write_open' => '| /some/where/gzip.exe > %s';
+
+The C<%s> is expanded to be the filename (C<sprintf> is used, so be
+careful to escape any other C<%> signs). The 'commands' are checked
+for sanity - they must contain the C<%s>, and the read open must end
+with the pipe sign, and the write open must begin with the pipe sign.
+
+=head1 CLASS METHODS
+
+=over 4
+
+=item has_Compress_Zlib
+
+Returns true if C<Compress::Zlib> is available. Note that this does
+not mean that C<Compress::Zlib> is being used: see L</gzip_external>
+and L<gzip_used>.
+
+=item gzip_external
+
+Undef if an external F<gzip> B<can> be used if C<Compress::Zlib> is
+not available (see L</has_Compress_Zlib>), true if an external F<gzip>
+is explicitly used, false if an external F<gzip> must not be used.
+See L</gzip_used>.
+
+=item gzip_used
+
+True if an external F<gzip> is being used, false if not.
+
+=item gzip_read_open
+
+Return the 'command' being used for opening a file for reading using an
+external F<gzip>.
+
+=item gzip_write_open
+
+Return the 'command' being used for opening a file for writing using an
+external F<gzip>.
+
+=back
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item IO::Zlib::getlines: must be called in list context
+
+If you want read lines, you must read in list context.
+
+=item IO::Zlib::gzopen_external: mode '...' is illegal
+
+Use only modes 'rb' or 'wb' or /wb[1-9]/.
+
+=item IO::Zlib::import: '...' is illegal
+
+The known import symbols are the C<:gzip_external>, C<:gzip_read_open>,
+and C<:gzip_write_open>. Anything else is not recognized.
+
+=item IO::Zlib::import: ':gzip_external' requires an argument
+
+The C<:gzip_external> requires one boolean argument.
+
+=item IO::Zlib::import: 'gzip_read_open' requires an argument
+
+The C<:gzip_external> requires one string argument.
+
+=item IO::Zlib::import: 'gzip_read' '...' is illegal
+
+The C<:gzip_read_open> argument must end with the pipe sign (|)
+and have the C<%s> for the filename. See L</"USING THE EXTERNAL GZIP">.
+
+=item IO::Zlib::import: 'gzip_write_open' requires an argument
+
+The C<:gzip_external> requires one string argument.
+
+=item IO::Zlib::import: 'gzip_write_open' '...' is illegal
+
+The C<:gzip_write_open> argument must begin with the pipe sign (|)
+and have the C<%s> for the filename. An output redirect (>) is also
+often a good idea, depending on your operating system shell syntax.
+See L</"USING THE EXTERNAL GZIP">.
+
+=item IO::Zlib::import: no Compress::Zlib and no external gzip
+
+Given that we failed to load C<Compress::Zlib> and that the use of
+ an external F<gzip> was disabled, IO::Zlib has not much chance of working.
+
+=item IO::Zlib::open: needs a filename
+
+No filename, no open.
+
+=item IO::Zlib::READ: NBYTES must be specified
+
+We must know how much to read.
+
+=item IO::Zlib::WRITE: too long LENGTH
+
+The LENGTH must be less than or equal to the buffer size.
+
+=back
+
+=head1 SEE ALSO
+
+L<perlfunc>,
+L<perlop/"I/O Operators">,
+L<IO::Handle>,
+L<Compress::Zlib>
+
+=head1 HISTORY
+
+Created by Tom Hughes E<lt>F<tom@compton.nu>E<gt>.
+
+Support for external gzip added by Jarkko Hietaniemi E<lt>F<jhi@iki.fi>E<gt>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1998-2004 Tom Hughes E<lt>F<tom@compton.nu>E<gt>.
+All rights reserved. This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+=cut
+
+require 5.006;
+
+use strict;
+use vars qw($VERSION $AUTOLOAD @ISA);
+
+use Carp;
+use Fcntl qw(SEEK_SET);
+
+my $has_Compress_Zlib;
+my $aliased;
+
+sub has_Compress_Zlib {
+ $has_Compress_Zlib;
+}
+
+BEGIN {
+ eval { require Compress::Zlib };
+ $has_Compress_Zlib = $@ || $Compress::Zlib::VERSION < 2.000 ? 0 : 1;
+}
+
+use Symbol;
+use Tie::Handle;
+
+# These might use some $^O logic.
+my $gzip_read_open = "gzip -dc %s |";
+my $gzip_write_open = "| gzip > %s";
+
+my $gzip_external;
+my $gzip_used;
+
+sub gzip_read_open {
+ $gzip_read_open;
+}
+
+sub gzip_write_open {
+ $gzip_write_open;
+}
+
+sub gzip_external {
+ $gzip_external;
+}
+
+sub gzip_used {
+ $gzip_used;
+}
+
+sub can_gunzip {
+ $has_Compress_Zlib || $gzip_external;
+}
+
+sub _import {
+ my $import = shift;
+ while (@_) {
+ if ($_[0] eq ':gzip_external') {
+ shift;
+ if (@_) {
+ $gzip_external = shift;
+ } else {
+ croak "$import: ':gzip_external' requires an argument";
+ }
+ }
+ elsif ($_[0] eq ':gzip_read_open') {
+ shift;
+ if (@_) {
+ $gzip_read_open = shift;
+ croak "$import: ':gzip_read_open' '$gzip_read_open' is illegal"
+ unless $gzip_read_open =~ /^.+%s.+\|\s*$/;
+ } else {
+ croak "$import: ':gzip_read_open' requires an argument";
+ }
+ }
+ elsif ($_[0] eq ':gzip_write_open') {
+ shift;
+ if (@_) {
+ $gzip_write_open = shift;
+ croak "$import: ':gzip_write_open' '$gzip_read_open' is illegal"
+ unless $gzip_write_open =~ /^\s*\|.+%s.*$/;
+ } else {
+ croak "$import: ':gzip_write_open' requires an argument";
+ }
+ }
+ else {
+ last;
+ }
+ }
+ return @_;
+}
+
+sub _alias {
+ my $import = shift;
+ if ((!$has_Compress_Zlib && !defined $gzip_external) || $gzip_external) {
+ # The undef *gzopen is really needed only during
+ # testing where we eval several 'use IO::Zlib's.
+ undef *gzopen;
+ *gzopen = \&gzopen_external;
+ *IO::Handle::gzread = \&gzread_external;
+ *IO::Handle::gzwrite = \&gzwrite_external;
+ *IO::Handle::gzreadline = \&gzreadline_external;
+ *IO::Handle::gzeof = \&gzeof_external;
+ *IO::Handle::gzclose = \&gzclose_external;
+ $gzip_used = 1;
+ } else {
+ croak "$import: no Compress::Zlib and no external gzip"
+ unless $has_Compress_Zlib;
+ *gzopen = \&Compress::Zlib::gzopen;
+ *gzread = \&Compress::Zlib::gzread;
+ *gzwrite = \&Compress::Zlib::gzwrite;
+ *gzreadline = \&Compress::Zlib::gzreadline;
+ *gzeof = \&Compress::Zlib::gzeof;
+ }
+ $aliased = 1;
+}
+
+sub import {
+ shift;
+ my $import = "IO::Zlib::import";
+ if (@_) {
+ if (_import($import, @_)) {
+ croak "$import: '@_' is illegal";
+ }
+ }
+ _alias($import);
+}
+
+@ISA = qw(Tie::Handle);
+
+sub TIEHANDLE
+{
+ my $class = shift;
+ my @args = @_;
+
+ my $self = bless {}, $class;
+
+ return @args ? $self->OPEN(@args) : $self;
+}
+
+sub DESTROY
+{
+}
+
+sub OPEN
+{
+ my $self = shift;
+ my $filename = shift;
+ my $mode = shift;
+
+ croak "IO::Zlib::open: needs a filename" unless defined($filename);
+
+ $self->{'file'} = gzopen($filename,$mode);
+
+ return defined($self->{'file'}) ? $self : undef;
+}
+
+sub CLOSE
+{
+ my $self = shift;
+
+ return undef unless defined($self->{'file'});
+
+ my $status = $self->{'file'}->gzclose();
+
+ delete $self->{'file'};
+
+ return ($status == 0) ? 1 : undef;
+}
+
+sub READ
+{
+ my $self = shift;
+ my $bufref = \$_[0];
+ my $nbytes = $_[1];
+ my $offset = $_[2] || 0;
+
+ croak "IO::Zlib::READ: NBYTES must be specified" unless defined($nbytes);
+
+ $$bufref = "" unless defined($$bufref);
+
+ my $bytesread = $self->{'file'}->gzread(substr($$bufref,$offset),$nbytes);
+
+ return undef if $bytesread < 0;
+
+ return $bytesread;
+}
+
+sub READLINE
+{
+ my $self = shift;
+
+ my $line;
+
+ return () if $self->{'file'}->gzreadline($line) <= 0;
+
+ return $line unless wantarray;
+
+ my @lines = $line;
+
+ while ($self->{'file'}->gzreadline($line) > 0)
+ {
+ push @lines, $line;
+ }
+
+ return @lines;
+}
+
+sub WRITE
+{
+ my $self = shift;
+ my $buf = shift;
+ my $length = shift;
+ my $offset = shift;
+
+ croak "IO::Zlib::WRITE: too long LENGTH" unless $offset + $length <= length($buf);
+
+ return $self->{'file'}->gzwrite(substr($buf,$offset,$length));
+}
+
+sub EOF
+{
+ my $self = shift;
+
+ return $self->{'file'}->gzeof();
+}
+
+sub FILENO
+{
+ return undef;
+}
+
+sub new
+{
+ my $class = shift;
+ my @args = @_;
+
+ _alias("new", @_) unless $aliased; # Some call new IO::Zlib directly...
+
+ my $self = gensym();
+
+ tie *{$self}, $class, @args;
+
+ return tied(${$self}) ? bless $self, $class : undef;
+}
+
+sub getline
+{
+ my $self = shift;
+
+ return scalar tied(*{$self})->READLINE();
+}
+
+sub getlines
+{
+ my $self = shift;
+
+ croak "IO::Zlib::getlines: must be called in list context"
+ unless wantarray;
+
+ return tied(*{$self})->READLINE();
+}
+
+sub opened
+{
+ my $self = shift;
+
+ return defined tied(*{$self})->{'file'};
+}
+
+sub AUTOLOAD
+{
+ my $self = shift;
+
+ $AUTOLOAD =~ s/.*:://;
+ $AUTOLOAD =~ tr/a-z/A-Z/;
+
+ return tied(*{$self})->$AUTOLOAD(@_);
+}
+
+sub gzopen_external {
+ my ($filename, $mode) = @_;
+ require IO::Handle;
+ my $fh = IO::Handle->new();
+ if ($mode =~ /r/) {
+ # Because someone will try to read ungzipped files
+ # with this we peek and verify the signature. Yes,
+ # this means that we open the file twice (if it is
+ # gzipped).
+ # Plenty of race conditions exist in this code, but
+ # the alternative would be to capture the stderr of
+ # gzip and parse it, which would be a portability nightmare.
+ if (-e $filename && open($fh, $filename)) {
+ binmode $fh;
+ my $sig;
+ my $rdb = read($fh, $sig, 2);
+ if ($rdb == 2 && $sig eq "\x1F\x8B") {
+ my $ropen = sprintf $gzip_read_open, $filename;
+ if (open($fh, $ropen)) {
+ binmode $fh;
+ return $fh;
+ } else {
+ return undef;
+ }
+ }
+ seek($fh, 0, SEEK_SET) or
+ die "IO::Zlib: open('$filename', 'r'): seek: $!";
+ return $fh;
+ } else {
+ return undef;
+ }
+ } elsif ($mode =~ /w/) {
+ my $level = '';
+ $level = "-$1" if $mode =~ /([1-9])/;
+ # To maximize portability we would need to open
+ # two filehandles here, one for "| gzip $level"
+ # and another for "> $filename", and then when
+ # writing copy bytes from the first to the second.
+ # We are using IO::Handle objects for now, however,
+ # and they can only contain one stream at a time.
+ my $wopen = sprintf $gzip_write_open, $filename;
+ if (open($fh, $wopen)) {
+ $fh->autoflush(1);
+ binmode $fh;
+ return $fh;
+ } else {
+ return undef;
+ }
+ } else {
+ croak "IO::Zlib::gzopen_external: mode '$mode' is illegal";
+ }
+ return undef;
+}
+
+sub gzread_external {
+ # Use read() instead of syswrite() because people may
+ # mix reads and readlines, and we don't want to mess
+ # the stdio buffering. See also gzreadline_external()
+ # and gzwrite_external().
+ my $nread = read($_[0], $_[1], @_ == 3 ? $_[2] : 4096);
+ defined $nread ? $nread : -1;
+}
+
+sub gzwrite_external {
+ # Using syswrite() is okay (cf. gzread_external())
+ # since the bytes leave this process and buffering
+ # is therefore not an issue.
+ my $nwrote = syswrite($_[0], $_[1]);
+ defined $nwrote ? $nwrote : -1;
+}
+
+sub gzreadline_external {
+ # See the comment in gzread_external().
+ $_[1] = readline($_[0]);
+ return defined $_[1] ? length($_[1]) : -1;
+}
+
+sub gzeof_external {
+ return eof($_[0]);
+}
+
+sub gzclose_external {
+ close($_[0]);
+ # I am not entirely certain why this is needed but it seems
+ # the above close() always fails (as if the stream would have
+ # been already closed - something to do with using external
+ # processes via pipes?)
+ return 0;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager.pm b/Master/tlpkg/tlperl.straw/lib/Imager.pm
new file mode 100755
index 00000000000..b7d475cc4a3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager.pm
@@ -0,0 +1,4558 @@
+package Imager;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS %formats $DEBUG %filters %DSOs $ERRSTR $fontstate %OPCODES $I2P $FORMATGUESS $warn_obsolete);
+use IO::File;
+
+use Imager::Color;
+use Imager::Font;
+
+@EXPORT_OK = qw(
+ init
+ init_log
+ DSO_open
+ DSO_close
+ DSO_funclist
+ DSO_call
+
+ load_plugin
+ unload_plugin
+
+ i_list_formats
+ i_has_format
+
+ i_color_new
+ i_color_set
+ i_color_info
+
+ i_img_empty
+ i_img_empty_ch
+ i_img_exorcise
+ i_img_destroy
+
+ i_img_info
+
+ i_img_setmask
+ i_img_getmask
+
+ i_line
+ i_line_aa
+ i_box
+ i_box_filled
+ i_arc
+ i_circle_aa
+
+ i_bezier_multi
+ i_poly_aa
+ i_poly_aa_cfill
+
+ i_copyto
+ i_rubthru
+ i_scaleaxis
+ i_scale_nn
+ i_haar
+ i_count_colors
+
+ i_gaussian
+ i_conv
+
+ i_convert
+ i_map
+
+ i_img_diff
+
+ i_init_fonts
+ i_t1_new
+ i_t1_destroy
+ i_t1_set_aa
+ i_t1_cp
+ i_t1_text
+ i_t1_bbox
+
+ i_tt_set_aa
+ i_tt_cp
+ i_tt_text
+ i_tt_bbox
+
+ i_readjpeg_wiol
+ i_writejpeg_wiol
+
+ i_readtiff_wiol
+ i_writetiff_wiol
+ i_writetiff_wiol_faxable
+
+ i_readpng_wiol
+ i_writepng_wiol
+
+ i_readgif
+ i_readgif_wiol
+ i_readgif_callback
+ i_writegif
+ i_writegifmc
+ i_writegif_gen
+ i_writegif_callback
+
+ i_readpnm_wiol
+ i_writeppm_wiol
+
+ i_readraw_wiol
+ i_writeraw_wiol
+
+ i_contrast
+ i_hardinvert
+ i_noise
+ i_bumpmap
+ i_postlevels
+ i_mosaic
+ i_watermark
+
+ malloc_state
+
+ list_formats
+
+ i_gifquant
+
+ newfont
+ newcolor
+ newcolour
+ NC
+ NF
+ NCF
+);
+
+@EXPORT=qw(
+ init_log
+ i_list_formats
+ i_has_format
+ malloc_state
+ i_color_new
+
+ i_img_empty
+ i_img_empty_ch
+ );
+
+%EXPORT_TAGS=
+ (handy => [qw(
+ newfont
+ newcolor
+ NF
+ NC
+ NCF
+ )],
+ all => [@EXPORT_OK],
+ default => [qw(
+ load_plugin
+ unload_plugin
+ )]);
+
+# registered file readers
+my %readers;
+
+# registered file writers
+my %writers;
+
+# modules we attempted to autoload
+my %attempted_to_load;
+
+# library keys that are image file formats
+my %file_formats = map { $_ => 1 } qw/tiff pnm gif png jpeg raw bmp tga/;
+
+# image pixel combine types
+my @combine_types =
+ qw/none normal multiply dissolve add subtract diff lighten darken
+ hue saturation value color/;
+my %combine_types;
+@combine_types{@combine_types} = 0 .. $#combine_types;
+$combine_types{mult} = $combine_types{multiply};
+$combine_types{'sub'} = $combine_types{subtract};
+$combine_types{sat} = $combine_types{saturation};
+
+# this will be used to store global defaults at some point
+my %defaults;
+
+BEGIN {
+ require Exporter;
+ @ISA = qw(Exporter);
+ $VERSION = '0.72';
+ eval {
+ require XSLoader;
+ XSLoader::load(Imager => $VERSION);
+ 1;
+ } or do {
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ bootstrap Imager $VERSION;
+ }
+}
+
+BEGIN {
+ Imager::Font::__init();
+ for(i_list_formats()) { $formats{$_}++; }
+
+ if (!$formats{'t1'} and !$formats{'tt'}
+ && !$formats{'ft2'} && !$formats{'w32'}) {
+ $fontstate='no font support';
+ }
+
+ %OPCODES=(Add=>[0],Sub=>[1],Mult=>[2],Div=>[3],Parm=>[4],'sin'=>[5],'cos'=>[6],'x'=>[4,0],'y'=>[4,1]);
+
+ $DEBUG=0;
+
+ # the members of the subhashes under %filters are:
+ # callseq - a list of the parameters to the underlying filter in the
+ # order they are passed
+ # callsub - a code ref that takes a named parameter list and calls the
+ # underlying filter
+ # defaults - a hash of default values
+ # names - defines names for value of given parameters so if the names
+ # field is foo=> { bar=>1 }, and the user supplies "bar" as the
+ # foo parameter, the filter will receive 1 for the foo
+ # parameter
+ $filters{contrast}={
+ callseq => ['image','intensity'],
+ callsub => sub { my %hsh=@_; i_contrast($hsh{image},$hsh{intensity}); }
+ };
+
+ $filters{noise} ={
+ callseq => ['image', 'amount', 'subtype'],
+ defaults => { amount=>3,subtype=>0 },
+ callsub => sub { my %hsh=@_; i_noise($hsh{image},$hsh{amount},$hsh{subtype}); }
+ };
+
+ $filters{hardinvert} ={
+ callseq => ['image'],
+ defaults => { },
+ callsub => sub { my %hsh=@_; i_hardinvert($hsh{image}); }
+ };
+
+ $filters{autolevels} ={
+ callseq => ['image','lsat','usat','skew'],
+ defaults => { lsat=>0.1,usat=>0.1,skew=>0.0 },
+ callsub => sub { my %hsh=@_; i_autolevels($hsh{image},$hsh{lsat},$hsh{usat},$hsh{skew}); }
+ };
+
+ $filters{turbnoise} ={
+ callseq => ['image'],
+ defaults => { xo=>0.0,yo=>0.0,scale=>10.0 },
+ callsub => sub { my %hsh=@_; i_turbnoise($hsh{image},$hsh{xo},$hsh{yo},$hsh{scale}); }
+ };
+
+ $filters{radnoise} ={
+ callseq => ['image'],
+ defaults => { xo=>100,yo=>100,ascale=>17.0,rscale=>0.02 },
+ callsub => sub { my %hsh=@_; i_radnoise($hsh{image},$hsh{xo},$hsh{yo},$hsh{rscale},$hsh{ascale}); }
+ };
+
+ $filters{conv} =
+ {
+ callseq => ['image', 'coef'],
+ defaults => { },
+ callsub =>
+ sub {
+ my %hsh=@_;
+ i_conv($hsh{image},$hsh{coef})
+ or die Imager->_error_as_msg() . "\n";
+ }
+ };
+
+ $filters{gradgen} =
+ {
+ callseq => ['image', 'xo', 'yo', 'colors', 'dist'],
+ defaults => { dist => 0 },
+ callsub =>
+ sub {
+ my %hsh=@_;
+ my @colors = @{$hsh{colors}};
+ $_ = _color($_)
+ for @colors;
+ i_gradgen($hsh{image}, $hsh{xo}, $hsh{yo}, \@colors, $hsh{dist});
+ }
+ };
+
+ $filters{nearest_color} =
+ {
+ callseq => ['image', 'xo', 'yo', 'colors', 'dist'],
+ defaults => { },
+ callsub =>
+ sub {
+ my %hsh=@_;
+ # make sure the segments are specified with colors
+ my @colors;
+ for my $color (@{$hsh{colors}}) {
+ my $new_color = _color($color)
+ or die $Imager::ERRSTR."\n";
+ push @colors, $new_color;
+ }
+
+ i_nearest_color($hsh{image}, $hsh{xo}, $hsh{yo}, \@colors,
+ $hsh{dist})
+ or die Imager->_error_as_msg() . "\n";
+ },
+ };
+ $filters{gaussian} = {
+ callseq => [ 'image', 'stddev' ],
+ defaults => { },
+ callsub => sub { my %hsh = @_; i_gaussian($hsh{image}, $hsh{stddev}); },
+ };
+ $filters{mosaic} =
+ {
+ callseq => [ qw(image size) ],
+ defaults => { size => 20 },
+ callsub => sub { my %hsh = @_; i_mosaic($hsh{image}, $hsh{size}) },
+ };
+ $filters{bumpmap} =
+ {
+ callseq => [ qw(image bump elevation lightx lighty st) ],
+ defaults => { elevation=>0, st=> 2 },
+ callsub => sub {
+ my %hsh = @_;
+ i_bumpmap($hsh{image}, $hsh{bump}{IMG}, $hsh{elevation},
+ $hsh{lightx}, $hsh{lighty}, $hsh{st});
+ },
+ };
+ $filters{bumpmap_complex} =
+ {
+ callseq => [ qw(image bump channel tx ty Lx Ly Lz cd cs n Ia Il Is) ],
+ defaults => {
+ channel => 0,
+ tx => 0,
+ ty => 0,
+ Lx => 0.2,
+ Ly => 0.4,
+ Lz => -1.0,
+ cd => 1.0,
+ cs => 40,
+ n => 1.3,
+ Ia => [0,0,0],
+ Il => [255,255,255],
+ Is => [255,255,255],
+ },
+ callsub => sub {
+ my %hsh = @_;
+ for my $cname (qw/Ia Il Is/) {
+ my $old = $hsh{$cname};
+ my $new_color = _color($old)
+ or die $Imager::ERRSTR, "\n";
+ $hsh{$cname} = $new_color;
+ }
+ i_bumpmap_complex($hsh{image}, $hsh{bump}{IMG}, $hsh{channel},
+ $hsh{tx}, $hsh{ty}, $hsh{Lx}, $hsh{Ly}, $hsh{Lz},
+ $hsh{cd}, $hsh{cs}, $hsh{n}, $hsh{Ia}, $hsh{Il},
+ $hsh{Is});
+ },
+ };
+ $filters{postlevels} =
+ {
+ callseq => [ qw(image levels) ],
+ defaults => { levels => 10 },
+ callsub => sub { my %hsh = @_; i_postlevels($hsh{image}, $hsh{levels}); },
+ };
+ $filters{watermark} =
+ {
+ callseq => [ qw(image wmark tx ty pixdiff) ],
+ defaults => { pixdiff=>10, tx=>0, ty=>0 },
+ callsub =>
+ sub {
+ my %hsh = @_;
+ i_watermark($hsh{image}, $hsh{wmark}{IMG}, $hsh{tx}, $hsh{ty},
+ $hsh{pixdiff});
+ },
+ };
+ $filters{fountain} =
+ {
+ callseq => [ qw(image xa ya xb yb ftype repeat combine super_sample ssample_param segments) ],
+ names => {
+ ftype => { linear => 0,
+ bilinear => 1,
+ radial => 2,
+ radial_square => 3,
+ revolution => 4,
+ conical => 5 },
+ repeat => { none => 0,
+ sawtooth => 1,
+ triangle => 2,
+ saw_both => 3,
+ tri_both => 4,
+ },
+ super_sample => {
+ none => 0,
+ grid => 1,
+ random => 2,
+ circle => 3,
+ },
+ combine => {
+ none => 0,
+ normal => 1,
+ multiply => 2, mult => 2,
+ dissolve => 3,
+ add => 4,
+ subtract => 5, 'sub' => 5,
+ diff => 6,
+ lighten => 7,
+ darken => 8,
+ hue => 9,
+ sat => 10,
+ value => 11,
+ color => 12,
+ },
+ },
+ defaults => { ftype => 0, repeat => 0, combine => 0,
+ super_sample => 0, ssample_param => 4,
+ segments=>[
+ [ 0, 0.5, 1,
+ [0,0,0],
+ [255, 255, 255],
+ 0, 0,
+ ],
+ ],
+ },
+ callsub =>
+ sub {
+ my %hsh = @_;
+
+ # make sure the segments are specified with colors
+ my @segments;
+ for my $segment (@{$hsh{segments}}) {
+ my @new_segment = @$segment;
+
+ $_ = _color($_) or die $Imager::ERRSTR."\n" for @new_segment[3,4];
+ push @segments, \@new_segment;
+ }
+
+ i_fountain($hsh{image}, $hsh{xa}, $hsh{ya}, $hsh{xb}, $hsh{yb},
+ $hsh{ftype}, $hsh{repeat}, $hsh{combine}, $hsh{super_sample},
+ $hsh{ssample_param}, \@segments)
+ or die Imager->_error_as_msg() . "\n";
+ },
+ };
+ $filters{unsharpmask} =
+ {
+ callseq => [ qw(image stddev scale) ],
+ defaults => { stddev=>2.0, scale=>1.0 },
+ callsub =>
+ sub {
+ my %hsh = @_;
+ i_unsharp_mask($hsh{image}, $hsh{stddev}, $hsh{scale});
+ },
+ };
+
+ $FORMATGUESS=\&def_guess_type;
+
+ $warn_obsolete = 1;
+}
+
+#
+# Non methods
+#
+
+# initlize Imager
+# NOTE: this might be moved to an import override later on
+
+sub import {
+ my $i = 1;
+ while ($i < @_) {
+ if ($_[$i] eq '-log-stderr') {
+ init_log(undef, 4);
+ splice(@_, $i, 1);
+ }
+ else {
+ ++$i;
+ }
+ }
+ goto &Exporter::import;
+}
+
+sub init_log {
+ i_init_log($_[0],$_[1]);
+ i_log_entry("Imager $VERSION starting\n", 1);
+}
+
+
+sub init {
+ my %parms=(loglevel=>1,@_);
+ if ($parms{'log'}) {
+ init_log($parms{'log'},$parms{'loglevel'});
+ }
+
+ if (exists $parms{'warn_obsolete'}) {
+ $warn_obsolete = $parms{'warn_obsolete'};
+ }
+
+# if ($parms{T1LIB_CONFIG}) { $ENV{T1LIB_CONFIG}=$parms{T1LIB_CONFIG}; }
+# if ( $ENV{T1LIB_CONFIG} and ( $fontstate eq 'missing conf' )) {
+# i_init_fonts();
+# $fontstate='ok';
+# }
+ if (exists $parms{'t1log'}) {
+ i_init_fonts($parms{'t1log'});
+ }
+}
+
+END {
+ if ($DEBUG) {
+ print "shutdown code\n";
+ # for(keys %instances) { $instances{$_}->DESTROY(); }
+ malloc_state(); # how do decide if this should be used? -- store something from the import
+ print "Imager exiting\n";
+ }
+}
+
+# Load a filter plugin
+
+sub load_plugin {
+ my ($filename)=@_;
+ my $i;
+ my ($DSO_handle,$str)=DSO_open($filename);
+ if (!defined($DSO_handle)) { $Imager::ERRSTR="Couldn't load plugin '$filename'\n"; return undef; }
+ my %funcs=DSO_funclist($DSO_handle);
+ if ($DEBUG) { print "loading module $filename\n"; $i=0; for(keys %funcs) { printf(" %2d: %s\n",$i++,$_); } }
+ $i=0;
+ for(keys %funcs) { if ($filters{$_}) { $ERRSTR="filter '$_' already exists\n"; DSO_close($DSO_handle); return undef; } }
+
+ $DSOs{$filename}=[$DSO_handle,\%funcs];
+
+ for(keys %funcs) {
+ my $evstr="\$filters{'".$_."'}={".$funcs{$_}.'};';
+ $DEBUG && print "eval string:\n",$evstr,"\n";
+ eval $evstr;
+ print $@ if $@;
+ }
+ return 1;
+}
+
+# Unload a plugin
+
+sub unload_plugin {
+ my ($filename)=@_;
+
+ if (!$DSOs{$filename}) { $ERRSTR="plugin '$filename' not loaded."; return undef; }
+ my ($DSO_handle,$funcref)=@{$DSOs{$filename}};
+ for(keys %{$funcref}) {
+ delete $filters{$_};
+ $DEBUG && print "unloading: $_\n";
+ }
+ my $rc=DSO_close($DSO_handle);
+ if (!defined($rc)) { $ERRSTR="unable to unload plugin '$filename'."; return undef; }
+ return 1;
+}
+
+# take the results of i_error() and make a message out of it
+sub _error_as_msg {
+ return join(": ", map $_->[0], i_errors());
+}
+
+# this function tries to DWIM for color parameters
+# color objects are used as is
+# simple scalars are simply treated as single parameters to Imager::Color->new
+# hashrefs are treated as named argument lists to Imager::Color->new
+# arrayrefs are treated as list arguments to Imager::Color->new iff any
+# parameter is > 1
+# other arrayrefs are treated as list arguments to Imager::Color::Float
+
+sub _color {
+ my $arg = shift;
+ # perl 5.6.0 seems to do weird things to $arg if we don't make an
+ # explicitly stringified copy
+ # I vaguely remember a bug on this on p5p, but couldn't find it
+ # through bugs.perl.org (I had trouble getting it to find any bugs)
+ my $copy = $arg . "";
+ my $result;
+
+ if (ref $arg) {
+ if (UNIVERSAL::isa($arg, "Imager::Color")
+ || UNIVERSAL::isa($arg, "Imager::Color::Float")) {
+ $result = $arg;
+ }
+ else {
+ if ($copy =~ /^HASH\(/) {
+ $result = Imager::Color->new(%$arg);
+ }
+ elsif ($copy =~ /^ARRAY\(/) {
+ $result = Imager::Color->new(@$arg);
+ }
+ else {
+ $Imager::ERRSTR = "Not a color";
+ }
+ }
+ }
+ else {
+ # assume Imager::Color::new knows how to handle it
+ $result = Imager::Color->new($arg);
+ }
+
+ return $result;
+}
+
+sub _combine {
+ my ($self, $combine, $default) = @_;
+
+ if (!defined $combine && ref $self) {
+ $combine = $self->{combine};
+ }
+ defined $combine or $combine = $defaults{combine};
+ defined $combine or $combine = $default;
+
+ if (exists $combine_types{$combine}) {
+ $combine = $combine_types{$combine};
+ }
+
+ return $combine;
+}
+
+sub _valid_image {
+ my ($self) = @_;
+
+ $self->{IMG} and return 1;
+
+ $self->_set_error('empty input image');
+
+ return;
+}
+
+# returns first defined parameter
+sub _first {
+ for (@_) {
+ return $_ if defined $_;
+ }
+ return undef;
+}
+
+#
+# Methods to be called on objects.
+#
+
+# Create a new Imager object takes very few parameters.
+# usually you call this method and then call open from
+# the resulting object
+
+sub new {
+ my $class = shift;
+ my $self ={};
+ my %hsh=@_;
+ bless $self,$class;
+ $self->{IMG}=undef; # Just to indicate what exists
+ $self->{ERRSTR}=undef; #
+ $self->{DEBUG}=$DEBUG;
+ $self->{DEBUG} and print "Initialized Imager\n";
+ if (defined $hsh{xsize} || defined $hsh{ysize}) {
+ unless ($self->img_set(%hsh)) {
+ $Imager::ERRSTR = $self->{ERRSTR};
+ return;
+ }
+ }
+ elsif (defined $hsh{file} ||
+ defined $hsh{fh} ||
+ defined $hsh{fd} ||
+ defined $hsh{callback} ||
+ defined $hsh{readcb}) {
+ # allow $img = Imager->new(file => $filename)
+ my %extras;
+
+ # type is already used as a parameter to new(), rename it for the
+ # call to read()
+ if ($hsh{filetype}) {
+ $extras{type} = $hsh{filetype};
+ }
+ unless ($self->read(%hsh, %extras)) {
+ $Imager::ERRSTR = $self->{ERRSTR};
+ return;
+ }
+ }
+
+ return $self;
+}
+
+# Copy an entire image with no changes
+# - if an image has magic the copy of it will not be magical
+
+sub copy {
+ my $self = shift;
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+
+ unless (defined wantarray) {
+ my @caller = caller;
+ warn "copy() called in void context - copy() returns the copied image at $caller[1] line $caller[2]\n";
+ return;
+ }
+
+ my $newcopy=Imager->new();
+ $newcopy->{IMG} = i_copy($self->{IMG});
+ return $newcopy;
+}
+
+# Paste a region
+
+sub paste {
+ my $self = shift;
+
+ unless ($self->{IMG}) {
+ $self->_set_error('empty input image');
+ return;
+ }
+ my %input=(left=>0, top=>0, src_minx => 0, src_miny => 0, @_);
+ my $src = $input{img} || $input{src};
+ unless($src) {
+ $self->_set_error("no source image");
+ return;
+ }
+ $input{left}=0 if $input{left} <= 0;
+ $input{top}=0 if $input{top} <= 0;
+
+ my($r,$b)=i_img_info($src->{IMG});
+ my ($src_left, $src_top) = @input{qw/src_minx src_miny/};
+ my ($src_right, $src_bottom);
+ if ($input{src_coords}) {
+ ($src_left, $src_top, $src_right, $src_bottom) = @{$input{src_coords}}
+ }
+ else {
+ if (defined $input{src_maxx}) {
+ $src_right = $input{src_maxx};
+ }
+ elsif (defined $input{width}) {
+ if ($input{width} <= 0) {
+ $self->_set_error("paste: width must me positive");
+ return;
+ }
+ $src_right = $src_left + $input{width};
+ }
+ else {
+ $src_right = $r;
+ }
+ if (defined $input{src_maxy}) {
+ $src_bottom = $input{src_maxy};
+ }
+ elsif (defined $input{height}) {
+ if ($input{height} < 0) {
+ $self->_set_error("paste: height must be positive");
+ return;
+ }
+ $src_bottom = $src_top + $input{height};
+ }
+ else {
+ $src_bottom = $b;
+ }
+ }
+
+ $src_right > $r and $src_right = $r;
+ $src_bottom > $b and $src_bottom = $b;
+
+ if ($src_right <= $src_left
+ || $src_bottom < $src_top) {
+ $self->_set_error("nothing to paste");
+ return;
+ }
+
+ i_copyto($self->{IMG}, $src->{IMG},
+ $src_left, $src_top, $src_right, $src_bottom,
+ $input{left}, $input{top});
+
+ return $self; # What should go here??
+}
+
+# Crop an image - i.e. return a new image that is smaller
+
+sub crop {
+ my $self=shift;
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+
+ unless (defined wantarray) {
+ my @caller = caller;
+ warn "crop() called in void context - crop() returns the cropped image at $caller[1] line $caller[2]\n";
+ return;
+ }
+
+ my %hsh=@_;
+
+ my ($w, $h, $l, $r, $b, $t) =
+ @hsh{qw(width height left right bottom top)};
+
+ # work through the various possibilities
+ if (defined $l) {
+ if (defined $w) {
+ $r = $l + $w;
+ }
+ elsif (!defined $r) {
+ $r = $self->getwidth;
+ }
+ }
+ elsif (defined $r) {
+ if (defined $w) {
+ $l = $r - $w;
+ }
+ else {
+ $l = 0;
+ }
+ }
+ elsif (defined $w) {
+ $l = int(0.5+($self->getwidth()-$w)/2);
+ $r = $l + $w;
+ }
+ else {
+ $l = 0;
+ $r = $self->getwidth;
+ }
+ if (defined $t) {
+ if (defined $h) {
+ $b = $t + $h;
+ }
+ elsif (!defined $b) {
+ $b = $self->getheight;
+ }
+ }
+ elsif (defined $b) {
+ if (defined $h) {
+ $t = $b - $h;
+ }
+ else {
+ $t = 0;
+ }
+ }
+ elsif (defined $h) {
+ $t=int(0.5+($self->getheight()-$h)/2);
+ $b=$t+$h;
+ }
+ else {
+ $t = 0;
+ $b = $self->getheight;
+ }
+
+ ($l,$r)=($r,$l) if $l>$r;
+ ($t,$b)=($b,$t) if $t>$b;
+
+ $l < 0 and $l = 0;
+ $r > $self->getwidth and $r = $self->getwidth;
+ $t < 0 and $t = 0;
+ $b > $self->getheight and $b = $self->getheight;
+
+ if ($l == $r || $t == $b) {
+ $self->_set_error("resulting image would have no content");
+ return;
+ }
+ if( $r < $l or $b < $t ) {
+ $self->_set_error("attempting to crop outside of the image");
+ return;
+ }
+ my $dst = $self->_sametype(xsize=>$r-$l, ysize=>$b-$t);
+
+ i_copyto($dst->{IMG},$self->{IMG},$l,$t,$r,$b,0,0);
+ return $dst;
+}
+
+sub _sametype {
+ my ($self, %opts) = @_;
+
+ $self->{IMG} or return $self->_set_error("Not a valid image");
+
+ my $x = $opts{xsize} || $self->getwidth;
+ my $y = $opts{ysize} || $self->getheight;
+ my $channels = $opts{channels} || $self->getchannels;
+
+ my $out = Imager->new;
+ if ($channels == $self->getchannels) {
+ $out->{IMG} = i_sametype($self->{IMG}, $x, $y);
+ }
+ else {
+ $out->{IMG} = i_sametype_chans($self->{IMG}, $x, $y, $channels);
+ }
+ unless ($out->{IMG}) {
+ $self->{ERRSTR} = $self->_error_as_msg;
+ return;
+ }
+
+ return $out;
+}
+
+# Sets an image to a certain size and channel number
+# if there was previously data in the image it is discarded
+
+sub img_set {
+ my $self=shift;
+
+ my %hsh=(xsize=>100, ysize=>100, channels=>3, bits=>8, type=>'direct', @_);
+
+ if (defined($self->{IMG})) {
+ # let IIM_DESTROY destroy it, it's possible this image is
+ # referenced from a virtual image (like masked)
+ #i_img_destroy($self->{IMG});
+ undef($self->{IMG});
+ }
+
+ if ($hsh{type} eq 'paletted' || $hsh{type} eq 'pseudo') {
+ $self->{IMG} = i_img_pal_new($hsh{xsize}, $hsh{ysize}, $hsh{channels},
+ $hsh{maxcolors} || 256);
+ }
+ elsif ($hsh{bits} eq 'double') {
+ $self->{IMG} = i_img_double_new($hsh{xsize}, $hsh{ysize}, $hsh{channels});
+ }
+ elsif ($hsh{bits} == 16) {
+ $self->{IMG} = i_img_16_new($hsh{xsize}, $hsh{ysize}, $hsh{channels});
+ }
+ else {
+ $self->{IMG}=Imager::ImgRaw::new($hsh{'xsize'}, $hsh{'ysize'},
+ $hsh{'channels'});
+ }
+
+ unless ($self->{IMG}) {
+ $self->{ERRSTR} = Imager->_error_as_msg();
+ return;
+ }
+
+ $self;
+}
+
+# created a masked version of the current image
+sub masked {
+ my $self = shift;
+
+ $self or return undef;
+ my %opts = (left => 0,
+ top => 0,
+ right => $self->getwidth,
+ bottom => $self->getheight,
+ @_);
+ my $mask = $opts{mask} ? $opts{mask}{IMG} : undef;
+
+ my $result = Imager->new;
+ $result->{IMG} = i_img_masked_new($self->{IMG}, $mask, $opts{left},
+ $opts{top}, $opts{right} - $opts{left},
+ $opts{bottom} - $opts{top});
+ # keep references to the mask and base images so they don't
+ # disappear on us
+ $result->{DEPENDS} = [ $self->{IMG}, $mask ];
+
+ $result;
+}
+
+# convert an RGB image into a paletted image
+sub to_paletted {
+ my $self = shift;
+ my $opts;
+ if (@_ != 1 && !ref $_[0]) {
+ $opts = { @_ };
+ }
+ else {
+ $opts = shift;
+ }
+
+ unless (defined wantarray) {
+ my @caller = caller;
+ warn "to_paletted() called in void context - to_paletted() returns the converted image at $caller[1] line $caller[2]\n";
+ return;
+ }
+
+ my $result = Imager->new;
+ $result->{IMG} = i_img_to_pal($self->{IMG}, $opts);
+
+ #print "Type ", i_img_type($result->{IMG}), "\n";
+
+ if ($result->{IMG}) {
+ return $result;
+ }
+ else {
+ $self->{ERRSTR} = $self->_error_as_msg;
+ return;
+ }
+}
+
+# convert a paletted (or any image) to an 8-bit/channel RGB images
+sub to_rgb8 {
+ my $self = shift;
+ my $result;
+
+ unless (defined wantarray) {
+ my @caller = caller;
+ warn "to_rgb8() called in void context - to_rgb8() returns the converted image at $caller[1] line $caller[2]\n";
+ return;
+ }
+
+ if ($self->{IMG}) {
+ $result = Imager->new;
+ $result->{IMG} = i_img_to_rgb($self->{IMG})
+ or undef $result;
+ }
+
+ return $result;
+}
+
+# convert a paletted (or any image) to an 8-bit/channel RGB images
+sub to_rgb16 {
+ my $self = shift;
+ my $result;
+
+ unless (defined wantarray) {
+ my @caller = caller;
+ warn "to_rgb16() called in void context - to_rgb8() returns the converted image at $caller[1] line $caller[2]\n";
+ return;
+ }
+
+ if ($self->{IMG}) {
+ $result = Imager->new;
+ $result->{IMG} = i_img_to_rgb16($self->{IMG})
+ or undef $result;
+ }
+
+ return $result;
+}
+
+sub addcolors {
+ my $self = shift;
+ my %opts = (colors=>[], @_);
+
+ unless ($self->{IMG}) {
+ $self->_set_error("empty input image");
+ return;
+ }
+
+ my @colors = @{$opts{colors}}
+ or return undef;
+
+ for my $color (@colors) {
+ $color = _color($color);
+ unless ($color) {
+ $self->_set_error($Imager::ERRSTR);
+ return;
+ }
+ }
+
+ return i_addcolors($self->{IMG}, @colors);
+}
+
+sub setcolors {
+ my $self = shift;
+ my %opts = (start=>0, colors=>[], @_);
+
+ unless ($self->{IMG}) {
+ $self->_set_error("empty input image");
+ return;
+ }
+
+ my @colors = @{$opts{colors}}
+ or return undef;
+
+ for my $color (@colors) {
+ $color = _color($color);
+ unless ($color) {
+ $self->_set_error($Imager::ERRSTR);
+ return;
+ }
+ }
+
+ return i_setcolors($self->{IMG}, $opts{start}, @colors);
+}
+
+sub getcolors {
+ my $self = shift;
+ my %opts = @_;
+ if (!exists $opts{start} && !exists $opts{count}) {
+ # get them all
+ $opts{start} = 0;
+ $opts{count} = $self->colorcount;
+ }
+ elsif (!exists $opts{count}) {
+ $opts{count} = 1;
+ }
+ elsif (!exists $opts{start}) {
+ $opts{start} = 0;
+ }
+
+ $self->{IMG} and
+ return i_getcolors($self->{IMG}, $opts{start}, $opts{count});
+}
+
+sub colorcount {
+ i_colorcount($_[0]{IMG});
+}
+
+sub maxcolors {
+ i_maxcolors($_[0]{IMG});
+}
+
+sub findcolor {
+ my $self = shift;
+ my %opts = @_;
+ $opts{color} or return undef;
+
+ $self->{IMG} and i_findcolor($self->{IMG}, $opts{color});
+}
+
+sub bits {
+ my $self = shift;
+ my $bits = $self->{IMG} && i_img_bits($self->{IMG});
+ if ($bits && $bits == length(pack("d", 1)) * 8) {
+ $bits = 'double';
+ }
+ $bits;
+}
+
+sub type {
+ my $self = shift;
+ if ($self->{IMG}) {
+ return i_img_type($self->{IMG}) ? "paletted" : "direct";
+ }
+}
+
+sub virtual {
+ my $self = shift;
+ $self->{IMG} and i_img_virtual($self->{IMG});
+}
+
+sub is_bilevel {
+ my ($self) = @_;
+
+ $self->{IMG} or return;
+
+ return i_img_is_monochrome($self->{IMG});
+}
+
+sub tags {
+ my ($self, %opts) = @_;
+
+ $self->{IMG} or return;
+
+ if (defined $opts{name}) {
+ my @result;
+ my $start = 0;
+ my $found;
+ while (defined($found = i_tags_find($self->{IMG}, $opts{name}, $start))) {
+ push @result, (i_tags_get($self->{IMG}, $found))[1];
+ $start = $found+1;
+ }
+ return wantarray ? @result : $result[0];
+ }
+ elsif (defined $opts{code}) {
+ my @result;
+ my $start = 0;
+ my $found;
+ while (defined($found = i_tags_findn($self->{IMG}, $opts{code}, $start))) {
+ push @result, (i_tags_get($self->{IMG}, $found))[1];
+ $start = $found+1;
+ }
+ return @result;
+ }
+ else {
+ if (wantarray) {
+ return map { [ i_tags_get($self->{IMG}, $_) ] } 0.. i_tags_count($self->{IMG})-1;
+ }
+ else {
+ return i_tags_count($self->{IMG});
+ }
+ }
+}
+
+sub addtag {
+ my $self = shift;
+ my %opts = @_;
+
+ return -1 unless $self->{IMG};
+ if ($opts{name}) {
+ if (defined $opts{value}) {
+ if ($opts{value} =~ /^\d+$/) {
+ # add as a number
+ return i_tags_addn($self->{IMG}, $opts{name}, 0, $opts{value});
+ }
+ else {
+ return i_tags_add($self->{IMG}, $opts{name}, 0, $opts{value}, 0);
+ }
+ }
+ elsif (defined $opts{data}) {
+ # force addition as a string
+ return i_tags_add($self->{IMG}, $opts{name}, 0, $opts{data}, 0);
+ }
+ else {
+ $self->{ERRSTR} = "No value supplied";
+ return undef;
+ }
+ }
+ elsif ($opts{code}) {
+ if (defined $opts{value}) {
+ if ($opts{value} =~ /^\d+$/) {
+ # add as a number
+ return i_tags_addn($self->{IMG}, $opts{code}, 0, $opts{value});
+ }
+ else {
+ return i_tags_add($self->{IMG}, $opts{code}, 0, $opts{value}, 0);
+ }
+ }
+ elsif (defined $opts{data}) {
+ # force addition as a string
+ return i_tags_add($self->{IMG}, $opts{code}, 0, $opts{data}, 0);
+ }
+ else {
+ $self->{ERRSTR} = "No value supplied";
+ return undef;
+ }
+ }
+ else {
+ return undef;
+ }
+}
+
+sub deltag {
+ my $self = shift;
+ my %opts = @_;
+
+ return 0 unless $self->{IMG};
+
+ if (defined $opts{'index'}) {
+ return i_tags_delete($self->{IMG}, $opts{'index'});
+ }
+ elsif (defined $opts{name}) {
+ return i_tags_delbyname($self->{IMG}, $opts{name});
+ }
+ elsif (defined $opts{code}) {
+ return i_tags_delbycode($self->{IMG}, $opts{code});
+ }
+ else {
+ $self->{ERRSTR} = "Need to supply index, name, or code parameter";
+ return 0;
+ }
+}
+
+sub settag {
+ my ($self, %opts) = @_;
+
+ if ($opts{name}) {
+ $self->deltag(name=>$opts{name});
+ return $self->addtag(name=>$opts{name}, value=>$opts{value});
+ }
+ elsif (defined $opts{code}) {
+ $self->deltag(code=>$opts{code});
+ return $self->addtag(code=>$opts{code}, value=>$opts{value});
+ }
+ else {
+ return undef;
+ }
+}
+
+
+sub _get_reader_io {
+ my ($self, $input) = @_;
+
+ if ($input->{io}) {
+ return $input->{io}, undef;
+ }
+ elsif ($input->{fd}) {
+ return io_new_fd($input->{fd});
+ }
+ elsif ($input->{fh}) {
+ my $fd = fileno($input->{fh});
+ unless (defined $fd) {
+ $self->_set_error("Handle in fh option not opened");
+ return;
+ }
+ return io_new_fd($fd);
+ }
+ elsif ($input->{file}) {
+ my $file = IO::File->new($input->{file}, "r");
+ unless ($file) {
+ $self->_set_error("Could not open $input->{file}: $!");
+ return;
+ }
+ binmode $file;
+ return (io_new_fd(fileno($file)), $file);
+ }
+ elsif ($input->{data}) {
+ return io_new_buffer($input->{data});
+ }
+ elsif ($input->{callback} || $input->{readcb}) {
+ if (!$input->{seekcb}) {
+ $self->_set_error("Need a seekcb parameter");
+ }
+ if ($input->{maxbuffer}) {
+ return io_new_cb($input->{writecb},
+ $input->{callback} || $input->{readcb},
+ $input->{seekcb}, $input->{closecb},
+ $input->{maxbuffer});
+ }
+ else {
+ return io_new_cb($input->{writecb},
+ $input->{callback} || $input->{readcb},
+ $input->{seekcb}, $input->{closecb});
+ }
+ }
+ else {
+ $self->_set_error("file/fd/fh/data/callback parameter missing");
+ return;
+ }
+}
+
+sub _get_writer_io {
+ my ($self, $input, $type) = @_;
+
+ if ($input->{io}) {
+ return $input->{io};
+ }
+ elsif ($input->{fd}) {
+ return io_new_fd($input->{fd});
+ }
+ elsif ($input->{fh}) {
+ my $fd = fileno($input->{fh});
+ unless (defined $fd) {
+ $self->_set_error("Handle in fh option not opened");
+ return;
+ }
+ # flush it
+ my $oldfh = select($input->{fh});
+ # flush anything that's buffered, and make sure anything else is flushed
+ $| = 1;
+ select($oldfh);
+ return io_new_fd($fd);
+ }
+ elsif ($input->{file}) {
+ my $fh = new IO::File($input->{file},"w+");
+ unless ($fh) {
+ $self->_set_error("Could not open file $input->{file}: $!");
+ return;
+ }
+ binmode($fh) or die;
+ return (io_new_fd(fileno($fh)), $fh);
+ }
+ elsif ($input->{data}) {
+ return io_new_bufchain();
+ }
+ elsif ($input->{callback} || $input->{writecb}) {
+ if ($input->{maxbuffer}) {
+ return io_new_cb($input->{callback} || $input->{writecb},
+ $input->{readcb},
+ $input->{seekcb}, $input->{closecb},
+ $input->{maxbuffer});
+ }
+ else {
+ return io_new_cb($input->{callback} || $input->{writecb},
+ $input->{readcb},
+ $input->{seekcb}, $input->{closecb});
+ }
+ }
+ else {
+ $self->_set_error("file/fd/fh/data/callback parameter missing");
+ return;
+ }
+}
+
+# Read an image from file
+
+sub read {
+ my $self = shift;
+ my %input=@_;
+
+ if (defined($self->{IMG})) {
+ # let IIM_DESTROY do the destruction, since the image may be
+ # referenced from elsewhere
+ #i_img_destroy($self->{IMG});
+ undef($self->{IMG});
+ }
+
+ my ($IO, $fh) = $self->_get_reader_io(\%input) or return;
+
+ unless ($input{'type'}) {
+ $input{'type'} = i_test_format_probe($IO, -1);
+ }
+
+ unless ($input{'type'}) {
+ $self->_set_error('type parameter missing and not possible to guess from extension');
+ return undef;
+ }
+
+ _reader_autoload($input{type});
+
+ if ($readers{$input{type}} && $readers{$input{type}}{single}) {
+ return $readers{$input{type}}{single}->($self, $IO, %input);
+ }
+
+ unless ($formats{$input{'type'}}) {
+ my $read_types = join ', ', sort Imager->read_types();
+ $self->_set_error("format '$input{'type'}' not supported - formats $read_types available for reading");
+ return;
+ }
+
+ # Setup data source
+ if ( $input{'type'} eq 'jpeg' ) {
+ ($self->{IMG},$self->{IPTCRAW}) = i_readjpeg_wiol( $IO );
+ if ( !defined($self->{IMG}) ) {
+ $self->{ERRSTR}=$self->_error_as_msg(); return undef;
+ }
+ $self->{DEBUG} && print "loading a jpeg file\n";
+ return $self;
+ }
+
+ my $allow_incomplete = $input{allow_incomplete};
+ defined $allow_incomplete or $allow_incomplete = 0;
+
+ if ( $input{'type'} eq 'tiff' ) {
+ my $page = $input{'page'};
+ defined $page or $page = 0;
+ $self->{IMG}=i_readtiff_wiol( $IO, $allow_incomplete, $page );
+ if ( !defined($self->{IMG}) ) {
+ $self->{ERRSTR}=$self->_error_as_msg(); return undef;
+ }
+ $self->{DEBUG} && print "loading a tiff file\n";
+ return $self;
+ }
+
+ if ( $input{'type'} eq 'pnm' ) {
+ $self->{IMG}=i_readpnm_wiol( $IO, $allow_incomplete );
+ if ( !defined($self->{IMG}) ) {
+ $self->{ERRSTR}='unable to read pnm image: '._error_as_msg();
+ return undef;
+ }
+ $self->{DEBUG} && print "loading a pnm file\n";
+ return $self;
+ }
+
+ if ( $input{'type'} eq 'png' ) {
+ $self->{IMG}=i_readpng_wiol( $IO, -1 ); # Fixme, check if that length parameter is ever needed
+ if ( !defined($self->{IMG}) ) {
+ $self->{ERRSTR} = $self->_error_as_msg();
+ return undef;
+ }
+ $self->{DEBUG} && print "loading a png file\n";
+ }
+
+ if ( $input{'type'} eq 'bmp' ) {
+ $self->{IMG}=i_readbmp_wiol( $IO, $allow_incomplete );
+ if ( !defined($self->{IMG}) ) {
+ $self->{ERRSTR}=$self->_error_as_msg();
+ return undef;
+ }
+ $self->{DEBUG} && print "loading a bmp file\n";
+ }
+
+ if ( $input{'type'} eq 'gif' ) {
+ if ($input{colors} && !ref($input{colors})) {
+ # must be a reference to a scalar that accepts the colour map
+ $self->{ERRSTR} = "option 'colors' must be a scalar reference";
+ return undef;
+ }
+ if ($input{'gif_consolidate'}) {
+ if ($input{colors}) {
+ my $colors;
+ ($self->{IMG}, $colors) =i_readgif_wiol( $IO );
+ if ($colors) {
+ ${ $input{colors} } = [ map { NC(@$_) } @$colors ];
+ }
+ }
+ else {
+ $self->{IMG} =i_readgif_wiol( $IO );
+ }
+ }
+ else {
+ my $page = $input{'page'};
+ defined $page or $page = 0;
+ $self->{IMG} = i_readgif_single_wiol( $IO, $page );
+ if ($self->{IMG} && $input{colors}) {
+ ${ $input{colors} } =
+ [ i_getcolors($self->{IMG}, 0, i_colorcount($self->{IMG})) ];
+ }
+ }
+
+ if ( !defined($self->{IMG}) ) {
+ $self->{ERRSTR}=$self->_error_as_msg();
+ return undef;
+ }
+ $self->{DEBUG} && print "loading a gif file\n";
+ }
+
+ if ( $input{'type'} eq 'tga' ) {
+ $self->{IMG}=i_readtga_wiol( $IO, -1 ); # Fixme, check if that length parameter is ever needed
+ if ( !defined($self->{IMG}) ) {
+ $self->{ERRSTR}=$self->_error_as_msg();
+ return undef;
+ }
+ $self->{DEBUG} && print "loading a tga file\n";
+ }
+
+ if ( $input{'type'} eq 'raw' ) {
+ unless ( $input{xsize} && $input{ysize} ) {
+ $self->_set_error('missing xsize or ysize parameter for raw');
+ return undef;
+ }
+
+ my $interleave = _first($input{raw_interleave}, $input{interleave});
+ unless (defined $interleave) {
+ my @caller = caller;
+ warn "read(type => 'raw') $caller[2] line $caller[1]: supply interleave or raw_interleave for future compatibility\n";
+ $interleave = 1;
+ }
+ my $data_ch = _first($input{raw_datachannels}, $input{datachannels}, 3);
+ my $store_ch = _first($input{raw_storechannels}, $input{storechannels}, 3);
+
+ $self->{IMG} = i_readraw_wiol( $IO,
+ $input{xsize},
+ $input{ysize},
+ $data_ch,
+ $store_ch,
+ $interleave);
+ if ( !defined($self->{IMG}) ) {
+ $self->{ERRSTR}=$self->_error_as_msg();
+ return undef;
+ }
+ $self->{DEBUG} && print "loading a raw file\n";
+ }
+
+ return $self;
+}
+
+sub register_reader {
+ my ($class, %opts) = @_;
+
+ defined $opts{type}
+ or die "register_reader called with no type parameter\n";
+
+ my $type = $opts{type};
+
+ defined $opts{single} || defined $opts{multiple}
+ or die "register_reader called with no single or multiple parameter\n";
+
+ $readers{$type} = { };
+ if ($opts{single}) {
+ $readers{$type}{single} = $opts{single};
+ }
+ if ($opts{multiple}) {
+ $readers{$type}{multiple} = $opts{multiple};
+ }
+
+ return 1;
+}
+
+sub register_writer {
+ my ($class, %opts) = @_;
+
+ defined $opts{type}
+ or die "register_writer called with no type parameter\n";
+
+ my $type = $opts{type};
+
+ defined $opts{single} || defined $opts{multiple}
+ or die "register_writer called with no single or multiple parameter\n";
+
+ $writers{$type} = { };
+ if ($opts{single}) {
+ $writers{$type}{single} = $opts{single};
+ }
+ if ($opts{multiple}) {
+ $writers{$type}{multiple} = $opts{multiple};
+ }
+
+ return 1;
+}
+
+sub read_types {
+ my %types =
+ (
+ map { $_ => 1 }
+ keys %readers,
+ grep($file_formats{$_}, keys %formats),
+ qw(ico sgi), # formats not handled directly, but supplied with Imager
+ );
+
+ return keys %types;
+}
+
+sub write_types {
+ my %types =
+ (
+ map { $_ => 1 }
+ keys %writers,
+ grep($file_formats{$_}, keys %formats),
+ qw(ico sgi), # formats not handled directly, but supplied with Imager
+ );
+
+ return keys %types;
+}
+
+# probes for an Imager::File::whatever module
+sub _reader_autoload {
+ my $type = shift;
+
+ return if $formats{$type} || $readers{$type};
+
+ return unless $type =~ /^\w+$/;
+
+ my $file = "Imager/File/\U$type\E.pm";
+
+ unless ($attempted_to_load{$file}) {
+ eval {
+ ++$attempted_to_load{$file};
+ require $file;
+ };
+ if ($@) {
+ # try to get a reader specific module
+ my $file = "Imager/File/\U$type\EReader.pm";
+ unless ($attempted_to_load{$file}) {
+ eval {
+ ++$attempted_to_load{$file};
+ require $file;
+ };
+ }
+ }
+ }
+}
+
+# probes for an Imager::File::whatever module
+sub _writer_autoload {
+ my $type = shift;
+
+ return if $formats{$type} || $readers{$type};
+
+ return unless $type =~ /^\w+$/;
+
+ my $file = "Imager/File/\U$type\E.pm";
+
+ unless ($attempted_to_load{$file}) {
+ eval {
+ ++$attempted_to_load{$file};
+ require $file;
+ };
+ if ($@) {
+ # try to get a writer specific module
+ my $file = "Imager/File/\U$type\EWriter.pm";
+ unless ($attempted_to_load{$file}) {
+ eval {
+ ++$attempted_to_load{$file};
+ require $file;
+ };
+ }
+ }
+ }
+}
+
+sub _fix_gif_positions {
+ my ($opts, $opt, $msg, @imgs) = @_;
+
+ my $positions = $opts->{'gif_positions'};
+ my $index = 0;
+ for my $pos (@$positions) {
+ my ($x, $y) = @$pos;
+ my $img = $imgs[$index++];
+ $img->settag(name=>'gif_left', value=>$x);
+ $img->settag(name=>'gif_top', value=>$y) if defined $y;
+ }
+ $$msg .= "replaced with the gif_left and gif_top tags";
+}
+
+my %obsolete_opts =
+ (
+ gif_each_palette=>'gif_local_map',
+ interlace => 'gif_interlace',
+ gif_delays => 'gif_delay',
+ gif_positions => \&_fix_gif_positions,
+ gif_loop_count => 'gif_loop',
+ );
+
+# options that should be converted to colors
+my %color_opts = map { $_ => 1 } qw/i_background/;
+
+sub _set_opts {
+ my ($self, $opts, $prefix, @imgs) = @_;
+
+ for my $opt (keys %$opts) {
+ my $tagname = $opt;
+ if ($obsolete_opts{$opt}) {
+ my $new = $obsolete_opts{$opt};
+ my $msg = "Obsolete option $opt ";
+ if (ref $new) {
+ $new->($opts, $opt, \$msg, @imgs);
+ }
+ else {
+ $msg .= "replaced with the $new tag ";
+ $tagname = $new;
+ }
+ $msg .= "line ".(caller(2))[2]." of file ".(caller(2))[1];
+ warn $msg if $warn_obsolete && $^W;
+ }
+ next unless $tagname =~ /^\Q$prefix/;
+ my $value = $opts->{$opt};
+ if ($color_opts{$opt}) {
+ $value = _color($value);
+ unless ($value) {
+ $self->_set_error($Imager::ERRSTR);
+ return;
+ }
+ }
+ if (ref $value) {
+ if (UNIVERSAL::isa($value, "Imager::Color")) {
+ my $tag = sprintf("color(%d,%d,%d,%d)", $value->rgba);
+ for my $img (@imgs) {
+ $img->settag(name=>$tagname, value=>$tag);
+ }
+ }
+ elsif (ref($value) eq 'ARRAY') {
+ for my $i (0..$#$value) {
+ my $val = $value->[$i];
+ if (ref $val) {
+ if (UNIVERSAL::isa($val, "Imager::Color")) {
+ my $tag = sprintf("color(%d,%d,%d,%d)", $value->rgba);
+ $i < @imgs and
+ $imgs[$i]->settag(name=>$tagname, value=>$tag);
+ }
+ else {
+ $self->_set_error("Unknown reference type " . ref($value) .
+ " supplied in array for $opt");
+ return;
+ }
+ }
+ else {
+ $i < @imgs
+ and $imgs[$i]->settag(name=>$tagname, value=>$val);
+ }
+ }
+ }
+ else {
+ $self->_set_error("Unknown reference type " . ref($value) .
+ " supplied for $opt");
+ return;
+ }
+ }
+ else {
+ # set it as a tag for every image
+ for my $img (@imgs) {
+ $img->settag(name=>$tagname, value=>$value);
+ }
+ }
+ }
+
+ return 1;
+}
+
+# Write an image to file
+sub write {
+ my $self = shift;
+ my %input=(jpegquality=>75,
+ gifquant=>'mc',
+ lmdither=>6.0,
+ lmfixed=>[],
+ idstring=>"",
+ compress=>1,
+ wierdpack=>0,
+ fax_fine=>1, @_);
+ my $rc;
+
+ $self->_set_opts(\%input, "i_", $self)
+ or return undef;
+
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+
+ if (!$input{'type'} and $input{file}) {
+ $input{'type'}=$FORMATGUESS->($input{file});
+ }
+ if (!$input{'type'}) {
+ $self->{ERRSTR}='type parameter missing and not possible to guess from extension';
+ return undef;
+ }
+
+ _writer_autoload($input{type});
+
+ my ($IO, $fh);
+ if ($writers{$input{type}} && $writers{$input{type}}{single}) {
+ ($IO, $fh) = $self->_get_writer_io(\%input, $input{'type'})
+ or return undef;
+
+ $writers{$input{type}}{single}->($self, $IO, %input)
+ or return undef;
+ }
+ else {
+ if (!$formats{$input{'type'}}) {
+ my $write_types = join ', ', sort Imager->write_types();
+ $self->_set_error("format '$input{'type'}' not supported - formats $write_types available for writing");
+ return undef;
+ }
+
+ ($IO, $fh) = $self->_get_writer_io(\%input, $input{'type'})
+ or return undef;
+
+ if ($input{'type'} eq 'tiff') {
+ $self->_set_opts(\%input, "tiff_", $self)
+ or return undef;
+ $self->_set_opts(\%input, "exif_", $self)
+ or return undef;
+
+ if (defined $input{class} && $input{class} eq 'fax') {
+ if (!i_writetiff_wiol_faxable($self->{IMG}, $IO, $input{fax_fine})) {
+ $self->{ERRSTR} = $self->_error_as_msg();
+ return undef;
+ }
+ } else {
+ if (!i_writetiff_wiol($self->{IMG}, $IO)) {
+ $self->{ERRSTR} = $self->_error_as_msg();
+ return undef;
+ }
+ }
+ } elsif ( $input{'type'} eq 'pnm' ) {
+ $self->_set_opts(\%input, "pnm_", $self)
+ or return undef;
+ if ( ! i_writeppm_wiol($self->{IMG},$IO) ) {
+ $self->{ERRSTR} = $self->_error_as_msg();
+ return undef;
+ }
+ $self->{DEBUG} && print "writing a pnm file\n";
+ } elsif ( $input{'type'} eq 'raw' ) {
+ $self->_set_opts(\%input, "raw_", $self)
+ or return undef;
+ if ( !i_writeraw_wiol($self->{IMG},$IO) ) {
+ $self->{ERRSTR} = $self->_error_as_msg();
+ return undef;
+ }
+ $self->{DEBUG} && print "writing a raw file\n";
+ } elsif ( $input{'type'} eq 'png' ) {
+ $self->_set_opts(\%input, "png_", $self)
+ or return undef;
+ if ( !i_writepng_wiol($self->{IMG}, $IO) ) {
+ $self->{ERRSTR}='unable to write png image';
+ return undef;
+ }
+ $self->{DEBUG} && print "writing a png file\n";
+ } elsif ( $input{'type'} eq 'jpeg' ) {
+ $self->_set_opts(\%input, "jpeg_", $self)
+ or return undef;
+ $self->_set_opts(\%input, "exif_", $self)
+ or return undef;
+ if ( !i_writejpeg_wiol($self->{IMG}, $IO, $input{jpegquality})) {
+ $self->{ERRSTR} = $self->_error_as_msg();
+ return undef;
+ }
+ $self->{DEBUG} && print "writing a jpeg file\n";
+ } elsif ( $input{'type'} eq 'bmp' ) {
+ $self->_set_opts(\%input, "bmp_", $self)
+ or return undef;
+ if ( !i_writebmp_wiol($self->{IMG}, $IO) ) {
+ $self->{ERRSTR} = $self->_error_as_msg;
+ return undef;
+ }
+ $self->{DEBUG} && print "writing a bmp file\n";
+ } elsif ( $input{'type'} eq 'tga' ) {
+ $self->_set_opts(\%input, "tga_", $self)
+ or return undef;
+
+ if ( !i_writetga_wiol($self->{IMG}, $IO, $input{wierdpack}, $input{compress}, $input{idstring}) ) {
+ $self->{ERRSTR}=$self->_error_as_msg();
+ return undef;
+ }
+ $self->{DEBUG} && print "writing a tga file\n";
+ } elsif ( $input{'type'} eq 'gif' ) {
+ $self->_set_opts(\%input, "gif_", $self)
+ or return undef;
+ # compatibility with the old interfaces
+ if ($input{gifquant} eq 'lm') {
+ $input{make_colors} = 'addi';
+ $input{translate} = 'perturb';
+ $input{perturb} = $input{lmdither};
+ } elsif ($input{gifquant} eq 'gen') {
+ # just pass options through
+ } else {
+ $input{make_colors} = 'webmap'; # ignored
+ $input{translate} = 'giflib';
+ }
+ if (!i_writegif_wiol($IO, \%input, $self->{IMG})) {
+ $self->{ERRSTR} = $self->_error_as_msg;
+ return;
+ }
+ }
+ }
+
+ if (exists $input{'data'}) {
+ my $data = io_slurp($IO);
+ if (!$data) {
+ $self->{ERRSTR}='Could not slurp from buffer';
+ return undef;
+ }
+ ${$input{data}} = $data;
+ }
+ return $self;
+}
+
+sub write_multi {
+ my ($class, $opts, @images) = @_;
+
+ my $type = $opts->{type};
+
+ if (!$type && $opts->{'file'}) {
+ $type = $FORMATGUESS->($opts->{'file'});
+ }
+ unless ($type) {
+ $class->_set_error('type parameter missing and not possible to guess from extension');
+ return;
+ }
+ # translate to ImgRaw
+ if (grep !UNIVERSAL::isa($_, 'Imager') || !$_->{IMG}, @images) {
+ $class->_set_error('Usage: Imager->write_multi({ options }, @images)');
+ return 0;
+ }
+ $class->_set_opts($opts, "i_", @images)
+ or return;
+ my @work = map $_->{IMG}, @images;
+
+ _writer_autoload($type);
+
+ my ($IO, $file);
+ if ($writers{$type} && $writers{$type}{multiple}) {
+ ($IO, $file) = $class->_get_writer_io($opts, $type)
+ or return undef;
+
+ $writers{$type}{multiple}->($class, $IO, $opts, @images)
+ or return undef;
+ }
+ else {
+ if (!$formats{$type}) {
+ my $write_types = join ', ', sort Imager->write_types();
+ $class->_set_error("format '$type' not supported - formats $write_types available for writing");
+ return undef;
+ }
+
+ ($IO, $file) = $class->_get_writer_io($opts, $type)
+ or return undef;
+
+ if ($type eq 'gif') {
+ $class->_set_opts($opts, "gif_", @images)
+ or return;
+ my $gif_delays = $opts->{gif_delays};
+ local $opts->{gif_delays} = $gif_delays;
+ if ($opts->{gif_delays} && !ref $opts->{gif_delays}) {
+ # assume the caller wants the same delay for each frame
+ $opts->{gif_delays} = [ ($gif_delays) x @images ];
+ }
+ unless (i_writegif_wiol($IO, $opts, @work)) {
+ $class->_set_error($class->_error_as_msg());
+ return undef;
+ }
+ }
+ elsif ($type eq 'tiff') {
+ $class->_set_opts($opts, "tiff_", @images)
+ or return;
+ $class->_set_opts($opts, "exif_", @images)
+ or return;
+ my $res;
+ $opts->{fax_fine} = 1 unless exists $opts->{fax_fine};
+ if ($opts->{'class'} && $opts->{'class'} eq 'fax') {
+ $res = i_writetiff_multi_wiol_faxable($IO, $opts->{fax_fine}, @work);
+ }
+ else {
+ $res = i_writetiff_multi_wiol($IO, @work);
+ }
+ unless ($res) {
+ $class->_set_error($class->_error_as_msg());
+ return undef;
+ }
+ }
+ else {
+ if (@images == 1) {
+ unless ($images[0]->write(%$opts, io => $IO, type => $type)) {
+ return 1;
+ }
+ }
+ else {
+ $ERRSTR = "Sorry, write_multi doesn't support $type yet";
+ return 0;
+ }
+ }
+ }
+
+ if (exists $opts->{'data'}) {
+ my $data = io_slurp($IO);
+ if (!$data) {
+ Imager->_set_error('Could not slurp from buffer');
+ return undef;
+ }
+ ${$opts->{data}} = $data;
+ }
+ return 1;
+}
+
+# read multiple images from a file
+sub read_multi {
+ my ($class, %opts) = @_;
+
+ my ($IO, $file) = $class->_get_reader_io(\%opts, $opts{'type'})
+ or return;
+
+ my $type = $opts{'type'};
+ unless ($type) {
+ $type = i_test_format_probe($IO, -1);
+ }
+
+ if ($opts{file} && !$type) {
+ # guess the type
+ $type = $FORMATGUESS->($opts{file});
+ }
+
+ unless ($type) {
+ $ERRSTR = "No type parameter supplied and it couldn't be guessed";
+ return;
+ }
+
+ _reader_autoload($type);
+
+ if ($readers{$type} && $readers{$type}{multiple}) {
+ return $readers{$type}{multiple}->($IO, %opts);
+ }
+
+ if ($type eq 'gif') {
+ my @imgs;
+ @imgs = i_readgif_multi_wiol($IO);
+ if (@imgs) {
+ return map {
+ bless { IMG=>$_, DEBUG=>$DEBUG, ERRSTR=>undef }, 'Imager'
+ } @imgs;
+ }
+ else {
+ $ERRSTR = _error_as_msg();
+ return;
+ }
+ }
+ elsif ($type eq 'tiff') {
+ my @imgs = i_readtiff_multi_wiol($IO, -1);
+ if (@imgs) {
+ return map {
+ bless { IMG=>$_, DEBUG=>$DEBUG, ERRSTR=>undef }, 'Imager'
+ } @imgs;
+ }
+ else {
+ $ERRSTR = _error_as_msg();
+ return;
+ }
+ }
+ else {
+ my $img = Imager->new;
+ if ($img->read(%opts, io => $IO, type => $type)) {
+ return ( $img );
+ }
+ Imager->_set_error($img->errstr);
+ }
+
+ return;
+}
+
+# Destroy an Imager object
+
+sub DESTROY {
+ my $self=shift;
+ # delete $instances{$self};
+ if (defined($self->{IMG})) {
+ # the following is now handled by the XS DESTROY method for
+ # Imager::ImgRaw object
+ # Re-enabling this will break virtual images
+ # tested for in t/t020masked.t
+ # i_img_destroy($self->{IMG});
+ undef($self->{IMG});
+ } else {
+# print "Destroy Called on an empty image!\n"; # why did I put this here??
+ }
+}
+
+# Perform an inplace filter of an image
+# that is the image will be overwritten with the data
+
+sub filter {
+ my $self=shift;
+ my %input=@_;
+ my %hsh;
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+
+ if (!$input{'type'}) { $self->{ERRSTR}='type parameter missing'; return undef; }
+
+ if ( (grep { $_ eq $input{'type'} } keys %filters) != 1) {
+ $self->{ERRSTR}='type parameter not matching any filter'; return undef;
+ }
+
+ if ($filters{$input{'type'}}{names}) {
+ my $names = $filters{$input{'type'}}{names};
+ for my $name (keys %$names) {
+ if (defined $input{$name} && exists $names->{$name}{$input{$name}}) {
+ $input{$name} = $names->{$name}{$input{$name}};
+ }
+ }
+ }
+ if (defined($filters{$input{'type'}}{defaults})) {
+ %hsh=( image => $self->{IMG},
+ imager => $self,
+ %{$filters{$input{'type'}}{defaults}},
+ %input );
+ } else {
+ %hsh=( image => $self->{IMG},
+ imager => $self,
+ %input );
+ }
+
+ my @cs=@{$filters{$input{'type'}}{callseq}};
+
+ for(@cs) {
+ if (!defined($hsh{$_})) {
+ $self->{ERRSTR}="missing parameter '$_' for filter ".$input{'type'}; return undef;
+ }
+ }
+
+ eval {
+ local $SIG{__DIE__}; # we don't want this processed by confess, etc
+ &{$filters{$input{'type'}}{callsub}}(%hsh);
+ };
+ if ($@) {
+ chomp($self->{ERRSTR} = $@);
+ return;
+ }
+
+ my @b=keys %hsh;
+
+ $self->{DEBUG} && print "callseq is: @cs\n";
+ $self->{DEBUG} && print "matching callseq is: @b\n";
+
+ return $self;
+}
+
+sub register_filter {
+ my $class = shift;
+ my %hsh = ( defaults => {}, @_ );
+
+ defined $hsh{type}
+ or die "register_filter() with no type\n";
+ defined $hsh{callsub}
+ or die "register_filter() with no callsub\n";
+ defined $hsh{callseq}
+ or die "register_filter() with no callseq\n";
+
+ exists $filters{$hsh{type}}
+ and return;
+
+ $filters{$hsh{type}} = \%hsh;
+
+ return 1;
+}
+
+sub scale_calculate {
+ my $self = shift;
+
+ my %opts = ('type'=>'max', @_);
+
+ # none of these should be references
+ for my $name (qw/xpixels ypixels xscalefactor yscalefactor width height/) {
+ if (defined $opts{$name} && ref $opts{$name}) {
+ $self->_set_error("scale_calculate: $name parameter cannot be a reference");
+ return;
+ }
+ }
+
+ my ($x_scale, $y_scale);
+ my $width = $opts{width};
+ my $height = $opts{height};
+ if (ref $self) {
+ defined $width or $width = $self->getwidth;
+ defined $height or $height = $self->getheight;
+ }
+ else {
+ unless (defined $width && defined $height) {
+ $self->_set_error("scale_calculate: width and height parameters must be supplied when called as a class method");
+ return;
+ }
+ }
+
+ if ($opts{'xscalefactor'} && $opts{'yscalefactor'}) {
+ $x_scale = $opts{'xscalefactor'};
+ $y_scale = $opts{'yscalefactor'};
+ }
+ elsif ($opts{'xscalefactor'}) {
+ $x_scale = $opts{'xscalefactor'};
+ $y_scale = $opts{'scalefactor'} || $x_scale;
+ }
+ elsif ($opts{'yscalefactor'}) {
+ $y_scale = $opts{'yscalefactor'};
+ $x_scale = $opts{'scalefactor'} || $y_scale;
+ }
+ else {
+ $x_scale = $y_scale = $opts{'scalefactor'} || 0.5;
+ }
+
+ # work out the scaling
+ if ($opts{xpixels} and $opts{ypixels} and $opts{'type'}) {
+ my ($xpix, $ypix)=( $opts{xpixels} / $width ,
+ $opts{ypixels} / $height );
+ if ($opts{'type'} eq 'min') {
+ $x_scale = $y_scale = _min($xpix,$ypix);
+ }
+ elsif ($opts{'type'} eq 'max') {
+ $x_scale = $y_scale = _max($xpix,$ypix);
+ }
+ elsif ($opts{'type'} eq 'nonprop' || $opts{'type'} eq 'non-proportional') {
+ $x_scale = $xpix;
+ $y_scale = $ypix;
+ }
+ else {
+ $self->_set_error('invalid value for type parameter');
+ return;
+ }
+ } elsif ($opts{xpixels}) {
+ $x_scale = $y_scale = $opts{xpixels} / $width;
+ }
+ elsif ($opts{ypixels}) {
+ $x_scale = $y_scale = $opts{ypixels}/$height;
+ }
+ elsif ($opts{constrain} && ref $opts{constrain}
+ && $opts{constrain}->can('constrain')) {
+ # we've been passed an Image::Math::Constrain object or something
+ # that looks like one
+ my $scalefactor;
+ (undef, undef, $scalefactor)
+ = $opts{constrain}->constrain($self->getwidth, $self->getheight);
+ unless ($scalefactor) {
+ $self->_set_error('constrain method failed on constrain parameter');
+ return;
+ }
+ $x_scale = $y_scale = $scalefactor;
+ }
+
+ my $new_width = int($x_scale * $width + 0.5);
+ $new_width > 0 or $new_width = 1;
+ my $new_height = int($y_scale * $height + 0.5);
+ $new_height > 0 or $new_height = 1;
+
+ return ($x_scale, $y_scale, $new_width, $new_height);
+
+}
+
+# Scale an image to requested size and return the scaled version
+
+sub scale {
+ my $self=shift;
+ my %opts = (qtype=>'normal' ,@_);
+ my $img = Imager->new();
+ my $tmp = Imager->new();
+
+ unless (defined wantarray) {
+ my @caller = caller;
+ warn "scale() called in void context - scale() returns the scaled image at $caller[1] line $caller[2]\n";
+ return;
+ }
+
+ unless ($self->{IMG}) {
+ $self->_set_error('empty input image');
+ return undef;
+ }
+
+ my ($x_scale, $y_scale, $new_width, $new_height) =
+ $self->scale_calculate(%opts)
+ or return;
+
+ if ($opts{qtype} eq 'normal') {
+ $tmp->{IMG} = i_scaleaxis($self->{IMG}, $x_scale, 0);
+ if ( !defined($tmp->{IMG}) ) {
+ $self->{ERRSTR} = 'unable to scale image: ' . $self->_error_as_msg;
+ return undef;
+ }
+ $img->{IMG}=i_scaleaxis($tmp->{IMG}, $y_scale, 1);
+ if ( !defined($img->{IMG}) ) {
+ $self->{ERRSTR}='unable to scale image: ' . $self->_error_as_msg;
+ return undef;
+ }
+
+ return $img;
+ }
+ elsif ($opts{'qtype'} eq 'preview') {
+ $img->{IMG} = i_scale_nn($self->{IMG}, $x_scale, $y_scale);
+ if ( !defined($img->{IMG}) ) {
+ $self->{ERRSTR}='unable to scale image';
+ return undef;
+ }
+ return $img;
+ }
+ elsif ($opts{'qtype'} eq 'mixing') {
+ $img->{IMG} = i_scale_mixing($self->{IMG}, $new_width, $new_height);
+ unless ($img->{IMG}) {
+ $self->_set_error(Imager->_error_as_msg);
+ return;
+ }
+ return $img;
+ }
+ else {
+ $self->_set_error('invalid value for qtype parameter');
+ return undef;
+ }
+}
+
+# Scales only along the X axis
+
+sub scaleX {
+ my $self = shift;
+ my %opts = ( scalefactor=>0.5, @_ );
+
+ unless (defined wantarray) {
+ my @caller = caller;
+ warn "scaleX() called in void context - scaleX() returns the scaled image at $caller[1] line $caller[2]\n";
+ return;
+ }
+
+ unless ($self->{IMG}) {
+ $self->{ERRSTR} = 'empty input image';
+ return undef;
+ }
+
+ my $img = Imager->new();
+
+ my $scalefactor = $opts{scalefactor};
+
+ if ($opts{pixels}) {
+ $scalefactor = $opts{pixels} / $self->getwidth();
+ }
+
+ unless ($self->{IMG}) {
+ $self->{ERRSTR}='empty input image';
+ return undef;
+ }
+
+ $img->{IMG} = i_scaleaxis($self->{IMG}, $scalefactor, 0);
+
+ if ( !defined($img->{IMG}) ) {
+ $self->{ERRSTR} = 'unable to scale image';
+ return undef;
+ }
+
+ return $img;
+}
+
+# Scales only along the Y axis
+
+sub scaleY {
+ my $self = shift;
+ my %opts = ( scalefactor => 0.5, @_ );
+
+ unless (defined wantarray) {
+ my @caller = caller;
+ warn "scaleY() called in void context - scaleY() returns the scaled image at $caller[1] line $caller[2]\n";
+ return;
+ }
+
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+
+ my $img = Imager->new();
+
+ my $scalefactor = $opts{scalefactor};
+
+ if ($opts{pixels}) {
+ $scalefactor = $opts{pixels} / $self->getheight();
+ }
+
+ unless ($self->{IMG}) {
+ $self->{ERRSTR} = 'empty input image';
+ return undef;
+ }
+ $img->{IMG}=i_scaleaxis($self->{IMG}, $scalefactor, 1);
+
+ if ( !defined($img->{IMG}) ) {
+ $self->{ERRSTR} = 'unable to scale image';
+ return undef;
+ }
+
+ return $img;
+}
+
+# Transform returns a spatial transformation of the input image
+# this moves pixels to a new location in the returned image.
+# NOTE - should make a utility function to check transforms for
+# stack overruns
+
+sub transform {
+ my $self=shift;
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+ my %opts=@_;
+ my (@op,@ropx,@ropy,$iop,$or,@parm,$expr,@xt,@yt,@pt,$numre);
+
+# print Dumper(\%opts);
+# xopcopdes
+
+ if ( $opts{'xexpr'} and $opts{'yexpr'} ) {
+ if (!$I2P) {
+ eval ("use Affix::Infix2Postfix;");
+ print $@;
+ if ( $@ ) {
+ $self->{ERRSTR}='transform: expr given and Affix::Infix2Postfix is not avaliable.';
+ return undef;
+ }
+ $I2P=Affix::Infix2Postfix->new('ops'=>[{op=>'+',trans=>'Add'},
+ {op=>'-',trans=>'Sub'},
+ {op=>'*',trans=>'Mult'},
+ {op=>'/',trans=>'Div'},
+ {op=>'-','type'=>'unary',trans=>'u-'},
+ {op=>'**'},
+ {op=>'func','type'=>'unary'}],
+ 'grouping'=>[qw( \( \) )],
+ 'func'=>[qw( sin cos )],
+ 'vars'=>[qw( x y )]
+ );
+ }
+
+ @xt=$I2P->translate($opts{'xexpr'});
+ @yt=$I2P->translate($opts{'yexpr'});
+
+ $numre=$I2P->{'numre'};
+ @pt=(0,0);
+
+ for(@xt) { if (/$numre/) { push(@pt,$_); push(@{$opts{'xopcodes'}},'Parm',$#pt); } else { push(@{$opts{'xopcodes'}},$_); } }
+ for(@yt) { if (/$numre/) { push(@pt,$_); push(@{$opts{'yopcodes'}},'Parm',$#pt); } else { push(@{$opts{'yopcodes'}},$_); } }
+ @{$opts{'parm'}}=@pt;
+ }
+
+# print Dumper(\%opts);
+
+ if ( !exists $opts{'xopcodes'} or @{$opts{'xopcodes'}}==0) {
+ $self->{ERRSTR}='transform: no xopcodes given.';
+ return undef;
+ }
+
+ @op=@{$opts{'xopcodes'}};
+ for $iop (@op) {
+ if (!defined ($OPCODES{$iop}) and ($iop !~ /^\d+$/) ) {
+ $self->{ERRSTR}="transform: illegal opcode '$_'.";
+ return undef;
+ }
+ push(@ropx,(exists $OPCODES{$iop}) ? @{$OPCODES{$iop}} : $iop );
+ }
+
+
+# yopcopdes
+
+ if ( !exists $opts{'yopcodes'} or @{$opts{'yopcodes'}}==0) {
+ $self->{ERRSTR}='transform: no yopcodes given.';
+ return undef;
+ }
+
+ @op=@{$opts{'yopcodes'}};
+ for $iop (@op) {
+ if (!defined ($OPCODES{$iop}) and ($iop !~ /^\d+$/) ) {
+ $self->{ERRSTR}="transform: illegal opcode '$_'.";
+ return undef;
+ }
+ push(@ropy,(exists $OPCODES{$iop}) ? @{$OPCODES{$iop}} : $iop );
+ }
+
+#parameters
+
+ if ( !exists $opts{'parm'}) {
+ $self->{ERRSTR}='transform: no parameter arg given.';
+ return undef;
+ }
+
+# print Dumper(\@ropx);
+# print Dumper(\@ropy);
+# print Dumper(\@ropy);
+
+ my $img = Imager->new();
+ $img->{IMG}=i_transform($self->{IMG},\@ropx,\@ropy,$opts{'parm'});
+ if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='transform: failed'; return undef; }
+ return $img;
+}
+
+
+sub transform2 {
+ my ($opts, @imgs) = @_;
+
+ require "Imager/Expr.pm";
+
+ $opts->{variables} = [ qw(x y) ];
+ my ($width, $height) = @{$opts}{qw(width height)};
+ if (@imgs) {
+ $width ||= $imgs[0]->getwidth();
+ $height ||= $imgs[0]->getheight();
+ my $img_num = 1;
+ for my $img (@imgs) {
+ $opts->{constants}{"w$img_num"} = $img->getwidth();
+ $opts->{constants}{"h$img_num"} = $img->getheight();
+ $opts->{constants}{"cx$img_num"} = $img->getwidth()/2;
+ $opts->{constants}{"cy$img_num"} = $img->getheight()/2;
+ ++$img_num;
+ }
+ }
+ if ($width) {
+ $opts->{constants}{w} = $width;
+ $opts->{constants}{cx} = $width/2;
+ }
+ else {
+ $Imager::ERRSTR = "No width supplied";
+ return;
+ }
+ if ($height) {
+ $opts->{constants}{h} = $height;
+ $opts->{constants}{cy} = $height/2;
+ }
+ else {
+ $Imager::ERRSTR = "No height supplied";
+ return;
+ }
+ my $code = Imager::Expr->new($opts);
+ if (!$code) {
+ $Imager::ERRSTR = Imager::Expr::error();
+ return;
+ }
+ my $channels = $opts->{channels} || 3;
+ unless ($channels >= 1 && $channels <= 4) {
+ return Imager->_set_error("channels must be an integer between 1 and 4");
+ }
+
+ my $img = Imager->new();
+ $img->{IMG} = i_transform2($opts->{width}, $opts->{height},
+ $channels, $code->code(),
+ $code->nregs(), $code->cregs(),
+ [ map { $_->{IMG} } @imgs ]);
+ if (!defined $img->{IMG}) {
+ $Imager::ERRSTR = Imager->_error_as_msg();
+ return;
+ }
+
+ return $img;
+}
+
+sub rubthrough {
+ my $self=shift;
+ my %opts= @_;
+
+ unless ($self->{IMG}) {
+ $self->{ERRSTR}='empty input image';
+ return undef;
+ }
+ unless ($opts{src} && $opts{src}->{IMG}) {
+ $self->{ERRSTR}='empty input image for src';
+ return undef;
+ }
+
+ %opts = (src_minx => 0,
+ src_miny => 0,
+ src_maxx => $opts{src}->getwidth(),
+ src_maxy => $opts{src}->getheight(),
+ %opts);
+
+ my $tx = $opts{tx};
+ defined $tx or $tx = $opts{left};
+ defined $tx or $tx = 0;
+
+ my $ty = $opts{ty};
+ defined $ty or $ty = $opts{top};
+ defined $ty or $ty = 0;
+
+ unless (i_rubthru($self->{IMG}, $opts{src}->{IMG}, $tx, $ty,
+ $opts{src_minx}, $opts{src_miny},
+ $opts{src_maxx}, $opts{src_maxy})) {
+ $self->_set_error($self->_error_as_msg());
+ return undef;
+ }
+
+ return $self;
+}
+
+sub compose {
+ my $self = shift;
+ my %opts =
+ (
+ opacity => 1.0,
+ mask_left => 0,
+ mask_top => 0,
+ @_
+ );
+
+ unless ($self->{IMG}) {
+ $self->_set_error("compose: empty input image");
+ return;
+ }
+
+ unless ($opts{src}) {
+ $self->_set_error("compose: src parameter missing");
+ return;
+ }
+
+ unless ($opts{src}{IMG}) {
+ $self->_set_error("compose: src parameter empty image");
+ return;
+ }
+ my $src = $opts{src};
+
+ my $left = $opts{left};
+ defined $left or $left = $opts{tx};
+ defined $left or $left = 0;
+
+ my $top = $opts{top};
+ defined $top or $top = $opts{ty};
+ defined $top or $top = 0;
+
+ my $src_left = $opts{src_left};
+ defined $src_left or $src_left = $opts{src_minx};
+ defined $src_left or $src_left = 0;
+
+ my $src_top = $opts{src_top};
+ defined $src_top or $src_top = $opts{src_miny};
+ defined $src_top or $src_top = 0;
+
+ my $width = $opts{width};
+ if (!defined $width && defined $opts{src_maxx}) {
+ $width = $opts{src_maxx} - $src_left;
+ }
+ defined $width or $width = $src->getwidth() - $src_left;
+
+ my $height = $opts{height};
+ if (!defined $height && defined $opts{src_maxy}) {
+ $height = $opts{src_maxy} - $src_top;
+ }
+ defined $height or $height = $src->getheight() - $src_top;
+
+ my $combine = $self->_combine($opts{combine}, 'normal');
+
+ if ($opts{mask}) {
+ unless ($opts{mask}{IMG}) {
+ $self->_set_error("compose: mask parameter empty image");
+ return;
+ }
+
+ my $mask_left = $opts{mask_left};
+ defined $mask_left or $mask_left = $opts{mask_minx};
+ defined $mask_left or $mask_left = 0;
+
+ my $mask_top = $opts{mask_top};
+ defined $mask_top or $mask_top = $opts{mask_miny};
+ defined $mask_top or $mask_top = 0;
+
+ i_compose_mask($self->{IMG}, $src->{IMG}, $opts{mask}{IMG},
+ $left, $top, $src_left, $src_top,
+ $mask_left, $mask_top, $width, $height,
+ $combine, $opts{opacity})
+ or return;
+ }
+ else {
+ i_compose($self->{IMG}, $src->{IMG}, $left, $top, $src_left, $src_top,
+ $width, $height, $combine, $opts{opacity})
+ or return;
+ }
+
+ return $self;
+}
+
+sub flip {
+ my $self = shift;
+ my %opts = @_;
+ my %xlate = (h=>0, v=>1, hv=>2, vh=>2);
+ my $dir;
+ return () unless defined $opts{'dir'} and defined $xlate{$opts{'dir'}};
+ $dir = $xlate{$opts{'dir'}};
+ return $self if i_flipxy($self->{IMG}, $dir);
+ return ();
+}
+
+sub rotate {
+ my $self = shift;
+ my %opts = @_;
+
+ unless (defined wantarray) {
+ my @caller = caller;
+ warn "rotate() called in void context - rotate() returns the rotated image at $caller[1] line $caller[2]\n";
+ return;
+ }
+
+ if (defined $opts{right}) {
+ my $degrees = $opts{right};
+ if ($degrees < 0) {
+ $degrees += 360 * int(((-$degrees)+360)/360);
+ }
+ $degrees = $degrees % 360;
+ if ($degrees == 0) {
+ return $self->copy();
+ }
+ elsif ($degrees == 90 || $degrees == 180 || $degrees == 270) {
+ my $result = Imager->new();
+ if ($result->{IMG} = i_rotate90($self->{IMG}, $degrees)) {
+ return $result;
+ }
+ else {
+ $self->{ERRSTR} = $self->_error_as_msg();
+ return undef;
+ }
+ }
+ else {
+ $self->{ERRSTR} = "Parameter 'right' must be a multiple of 90 degrees";
+ return undef;
+ }
+ }
+ elsif (defined $opts{radians} || defined $opts{degrees}) {
+ my $amount = $opts{radians} || $opts{degrees} * 3.1415926535 / 180;
+
+ my $back = $opts{back};
+ my $result = Imager->new;
+ if ($back) {
+ $back = _color($back);
+ unless ($back) {
+ $self->_set_error(Imager->errstr);
+ return undef;
+ }
+
+ $result->{IMG} = i_rotate_exact($self->{IMG}, $amount, $back);
+ }
+ else {
+ $result->{IMG} = i_rotate_exact($self->{IMG}, $amount);
+ }
+ if ($result->{IMG}) {
+ return $result;
+ }
+ else {
+ $self->{ERRSTR} = $self->_error_as_msg();
+ return undef;
+ }
+ }
+ else {
+ $self->{ERRSTR} = "Only the 'right', 'radians' and 'degrees' parameters are available";
+ return undef;
+ }
+}
+
+sub matrix_transform {
+ my $self = shift;
+ my %opts = @_;
+
+ unless (defined wantarray) {
+ my @caller = caller;
+ warn "copy() called in void context - copy() returns the copied image at $caller[1] line $caller[2]\n";
+ return;
+ }
+
+ if ($opts{matrix}) {
+ my $xsize = $opts{xsize} || $self->getwidth;
+ my $ysize = $opts{ysize} || $self->getheight;
+
+ my $result = Imager->new;
+ if ($opts{back}) {
+ $result->{IMG} = i_matrix_transform($self->{IMG}, $xsize, $ysize,
+ $opts{matrix}, $opts{back})
+ or return undef;
+ }
+ else {
+ $result->{IMG} = i_matrix_transform($self->{IMG}, $xsize, $ysize,
+ $opts{matrix})
+ or return undef;
+ }
+
+ return $result;
+ }
+ else {
+ $self->{ERRSTR} = "matrix parameter required";
+ return undef;
+ }
+}
+
+# blame Leolo :)
+*yatf = \&matrix_transform;
+
+# These two are supported for legacy code only
+
+sub i_color_new {
+ return Imager::Color->new(@_);
+}
+
+sub i_color_set {
+ return Imager::Color::set(@_);
+}
+
+# Draws a box between the specified corner points.
+sub box {
+ my $self=shift;
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+ my $dflcl=i_color_new(255,255,255,255);
+ my %opts=(color=>$dflcl,xmin=>0,ymin=>0,xmax=>$self->getwidth()-1,ymax=>$self->getheight()-1,@_);
+
+ if (exists $opts{'box'}) {
+ $opts{'xmin'} = _min($opts{'box'}->[0],$opts{'box'}->[2]);
+ $opts{'xmax'} = _max($opts{'box'}->[0],$opts{'box'}->[2]);
+ $opts{'ymin'} = _min($opts{'box'}->[1],$opts{'box'}->[3]);
+ $opts{'ymax'} = _max($opts{'box'}->[1],$opts{'box'}->[3]);
+ }
+
+ if ($opts{filled}) {
+ my $color = _color($opts{'color'});
+ unless ($color) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ i_box_filled($self->{IMG},$opts{xmin},$opts{ymin},$opts{xmax},
+ $opts{ymax}, $color);
+ }
+ elsif ($opts{fill}) {
+ unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
+ # assume it's a hash ref
+ require 'Imager/Fill.pm';
+ unless ($opts{fill} = Imager::Fill->new(%{$opts{fill}})) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return undef;
+ }
+ }
+ i_box_cfill($self->{IMG},$opts{xmin},$opts{ymin},$opts{xmax},
+ $opts{ymax},$opts{fill}{fill});
+ }
+ else {
+ my $color = _color($opts{'color'});
+ unless ($color) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ i_box($self->{IMG},$opts{xmin},$opts{ymin},$opts{xmax},$opts{ymax},
+ $color);
+ }
+ return $self;
+}
+
+sub arc {
+ my $self=shift;
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+ my $dflcl=i_color_new(255,255,255,255);
+ my %opts=(color=>$dflcl,
+ 'r'=>_min($self->getwidth(),$self->getheight())/3,
+ 'x'=>$self->getwidth()/2,
+ 'y'=>$self->getheight()/2,
+ 'd1'=>0, 'd2'=>361, @_);
+ if ($opts{aa}) {
+ if ($opts{fill}) {
+ unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
+ # assume it's a hash ref
+ require 'Imager/Fill.pm';
+ unless ($opts{fill} = Imager::Fill->new(%{$opts{fill}})) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ }
+ i_arc_aa_cfill($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},$opts{'d1'},
+ $opts{'d2'}, $opts{fill}{fill});
+ }
+ else {
+ my $color = _color($opts{'color'});
+ unless ($color) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ if ($opts{d1} == 0 && $opts{d2} == 361 && $opts{aa}) {
+ i_circle_aa($self->{IMG}, $opts{'x'}, $opts{'y'}, $opts{'r'},
+ $color);
+ }
+ else {
+ i_arc_aa($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},
+ $opts{'d1'}, $opts{'d2'}, $color);
+ }
+ }
+ }
+ else {
+ if ($opts{fill}) {
+ unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
+ # assume it's a hash ref
+ require 'Imager/Fill.pm';
+ unless ($opts{fill} = Imager::Fill->new(%{$opts{fill}})) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ }
+ i_arc_cfill($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},$opts{'d1'},
+ $opts{'d2'}, $opts{fill}{fill});
+ }
+ else {
+ my $color = _color($opts{'color'});
+ unless ($color) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ i_arc($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},
+ $opts{'d1'}, $opts{'d2'}, $color);
+ }
+ }
+
+ return $self;
+}
+
+# Draws a line from one point to the other
+# the endpoint is set if the endp parameter is set which it is by default.
+# to turn of the endpoint being set use endp=>0 when calling line.
+
+sub line {
+ my $self=shift;
+ my $dflcl=i_color_new(0,0,0,0);
+ my %opts=(color=>$dflcl,
+ endp => 1,
+ @_);
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+
+ unless (exists $opts{x1} and exists $opts{y1}) { $self->{ERRSTR}='missing begining coord'; return undef; }
+ unless (exists $opts{x2} and exists $opts{y2}) { $self->{ERRSTR}='missing ending coord'; return undef; }
+
+ my $color = _color($opts{'color'});
+ unless ($color) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+
+ $opts{antialias} = $opts{aa} if defined $opts{aa};
+ if ($opts{antialias}) {
+ i_line_aa($self->{IMG},$opts{x1}, $opts{y1}, $opts{x2}, $opts{y2},
+ $color, $opts{endp});
+ } else {
+ i_line($self->{IMG},$opts{x1}, $opts{y1}, $opts{x2}, $opts{y2},
+ $color, $opts{endp});
+ }
+ return $self;
+}
+
+# Draws a line between an ordered set of points - It more or less just transforms this
+# into a list of lines.
+
+sub polyline {
+ my $self=shift;
+ my ($pt,$ls,@points);
+ my $dflcl=i_color_new(0,0,0,0);
+ my %opts=(color=>$dflcl,@_);
+
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+
+ if (exists($opts{points})) { @points=@{$opts{points}}; }
+ if (!exists($opts{points}) and exists($opts{'x'}) and exists($opts{'y'}) ) {
+ @points=map { [ $opts{'x'}->[$_],$opts{'y'}->[$_] ] } (0..(scalar @{$opts{'x'}}-1));
+ }
+
+# print Dumper(\@points);
+
+ my $color = _color($opts{'color'});
+ unless ($color) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ $opts{antialias} = $opts{aa} if defined $opts{aa};
+ if ($opts{antialias}) {
+ for $pt(@points) {
+ if (defined($ls)) {
+ i_line_aa($self->{IMG},$ls->[0],$ls->[1],$pt->[0],$pt->[1],$color, 1);
+ }
+ $ls=$pt;
+ }
+ } else {
+ for $pt(@points) {
+ if (defined($ls)) {
+ i_line($self->{IMG},$ls->[0],$ls->[1],$pt->[0],$pt->[1],$color,1);
+ }
+ $ls=$pt;
+ }
+ }
+ return $self;
+}
+
+sub polygon {
+ my $self = shift;
+ my ($pt,$ls,@points);
+ my $dflcl = i_color_new(0,0,0,0);
+ my %opts = (color=>$dflcl, @_);
+
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+
+ if (exists($opts{points})) {
+ $opts{'x'} = [ map { $_->[0] } @{$opts{points}} ];
+ $opts{'y'} = [ map { $_->[1] } @{$opts{points}} ];
+ }
+
+ if (!exists $opts{'x'} or !exists $opts{'y'}) {
+ $self->{ERRSTR} = 'no points array, or x and y arrays.'; return undef;
+ }
+
+ if ($opts{'fill'}) {
+ unless (UNIVERSAL::isa($opts{'fill'}, 'Imager::Fill')) {
+ # assume it's a hash ref
+ require 'Imager/Fill.pm';
+ unless ($opts{'fill'} = Imager::Fill->new(%{$opts{'fill'}})) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return undef;
+ }
+ }
+ i_poly_aa_cfill($self->{IMG}, $opts{'x'}, $opts{'y'},
+ $opts{'fill'}{'fill'});
+ }
+ else {
+ my $color = _color($opts{'color'});
+ unless ($color) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ i_poly_aa($self->{IMG}, $opts{'x'}, $opts{'y'}, $color);
+ }
+
+ return $self;
+}
+
+
+# this the multipoint bezier curve
+# this is here more for testing that actual usage since
+# this is not a good algorithm. Usually the curve would be
+# broken into smaller segments and each done individually.
+
+sub polybezier {
+ my $self=shift;
+ my ($pt,$ls,@points);
+ my $dflcl=i_color_new(0,0,0,0);
+ my %opts=(color=>$dflcl,@_);
+
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+
+ if (exists $opts{points}) {
+ $opts{'x'}=map { $_->[0]; } @{$opts{'points'}};
+ $opts{'y'}=map { $_->[1]; } @{$opts{'points'}};
+ }
+
+ unless ( @{$opts{'x'}} and @{$opts{'x'}} == @{$opts{'y'}} ) {
+ $self->{ERRSTR}='Missing or invalid points.';
+ return;
+ }
+
+ my $color = _color($opts{'color'});
+ unless ($color) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ i_bezier_multi($self->{IMG},$opts{'x'},$opts{'y'},$color);
+ return $self;
+}
+
+sub flood_fill {
+ my $self = shift;
+ my %opts = ( color=>Imager::Color->new(255, 255, 255), @_ );
+ my $rc;
+
+ unless (exists $opts{'x'} && exists $opts{'y'}) {
+ $self->{ERRSTR} = "missing seed x and y parameters";
+ return undef;
+ }
+
+ if ($opts{border}) {
+ my $border = _color($opts{border});
+ unless ($border) {
+ $self->_set_error($Imager::ERRSTR);
+ return;
+ }
+ if ($opts{fill}) {
+ unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
+ # assume it's a hash ref
+ require Imager::Fill;
+ unless ($opts{fill} = Imager::Fill->new(%{$opts{fill}})) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ }
+ $rc = i_flood_cfill_border($self->{IMG}, $opts{'x'}, $opts{'y'},
+ $opts{fill}{fill}, $border);
+ }
+ else {
+ my $color = _color($opts{'color'});
+ unless ($color) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ $rc = i_flood_fill_border($self->{IMG}, $opts{'x'}, $opts{'y'},
+ $color, $border);
+ }
+ if ($rc) {
+ return $self;
+ }
+ else {
+ $self->{ERRSTR} = $self->_error_as_msg();
+ return;
+ }
+ }
+ else {
+ if ($opts{fill}) {
+ unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
+ # assume it's a hash ref
+ require 'Imager/Fill.pm';
+ unless ($opts{fill} = Imager::Fill->new(%{$opts{fill}})) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ }
+ $rc = i_flood_cfill($self->{IMG}, $opts{'x'}, $opts{'y'}, $opts{fill}{fill});
+ }
+ else {
+ my $color = _color($opts{'color'});
+ unless ($color) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ $rc = i_flood_fill($self->{IMG}, $opts{'x'}, $opts{'y'}, $color);
+ }
+ if ($rc) {
+ return $self;
+ }
+ else {
+ $self->{ERRSTR} = $self->_error_as_msg();
+ return;
+ }
+ }
+}
+
+sub setpixel {
+ my $self = shift;
+
+ my %opts = ( color=>$self->{fg} || NC(255, 255, 255), @_);
+
+ unless (exists $opts{'x'} && exists $opts{'y'}) {
+ $self->{ERRSTR} = 'missing x and y parameters';
+ return undef;
+ }
+
+ my $x = $opts{'x'};
+ my $y = $opts{'y'};
+ my $color = _color($opts{color})
+ or return undef;
+ if (ref $x && ref $y) {
+ unless (@$x == @$y) {
+ $self->{ERRSTR} = 'length of x and y mismatch';
+ return;
+ }
+ my $set = 0;
+ if ($color->isa('Imager::Color')) {
+ for my $i (0..$#{$opts{'x'}}) {
+ i_ppix($self->{IMG}, $x->[$i], $y->[$i], $color)
+ or ++$set;
+ }
+ }
+ else {
+ for my $i (0..$#{$opts{'x'}}) {
+ i_ppixf($self->{IMG}, $x->[$i], $y->[$i], $color)
+ or ++$set;
+ }
+ }
+ $set or return;
+ return $set;
+ }
+ else {
+ if ($color->isa('Imager::Color')) {
+ i_ppix($self->{IMG}, $x, $y, $color)
+ and return;
+ }
+ else {
+ i_ppixf($self->{IMG}, $x, $y, $color)
+ and return;
+ }
+ }
+
+ $self;
+}
+
+sub getpixel {
+ my $self = shift;
+
+ my %opts = ( "type"=>'8bit', @_);
+
+ unless (exists $opts{'x'} && exists $opts{'y'}) {
+ $self->{ERRSTR} = 'missing x and y parameters';
+ return undef;
+ }
+
+ my $x = $opts{'x'};
+ my $y = $opts{'y'};
+ if (ref $x && ref $y) {
+ unless (@$x == @$y) {
+ $self->{ERRSTR} = 'length of x and y mismatch';
+ return undef;
+ }
+ my @result;
+ if ($opts{"type"} eq '8bit') {
+ for my $i (0..$#{$opts{'x'}}) {
+ push(@result, i_get_pixel($self->{IMG}, $x->[$i], $y->[$i]));
+ }
+ }
+ else {
+ for my $i (0..$#{$opts{'x'}}) {
+ push(@result, i_gpixf($self->{IMG}, $x->[$i], $y->[$i]));
+ }
+ }
+ return wantarray ? @result : \@result;
+ }
+ else {
+ if ($opts{"type"} eq '8bit') {
+ return i_get_pixel($self->{IMG}, $x, $y);
+ }
+ else {
+ return i_gpixf($self->{IMG}, $x, $y);
+ }
+ }
+
+ $self;
+}
+
+sub getscanline {
+ my $self = shift;
+ my %opts = ( type => '8bit', x=>0, @_);
+
+ $self->_valid_image or return;
+
+ defined $opts{width} or $opts{width} = $self->getwidth - $opts{x};
+
+ unless (defined $opts{'y'}) {
+ $self->_set_error("missing y parameter");
+ return;
+ }
+
+ if ($opts{type} eq '8bit') {
+ return i_glin($self->{IMG}, $opts{x}, $opts{x}+$opts{width},
+ $opts{'y'});
+ }
+ elsif ($opts{type} eq 'float') {
+ return i_glinf($self->{IMG}, $opts{x}, $opts{x}+$opts{width},
+ $opts{'y'});
+ }
+ elsif ($opts{type} eq 'index') {
+ unless (i_img_type($self->{IMG})) {
+ $self->_set_error("type => index only valid on paletted images");
+ return;
+ }
+ return i_gpal($self->{IMG}, $opts{x}, $opts{x} + $opts{width},
+ $opts{'y'});
+ }
+ else {
+ $self->_set_error("invalid type parameter - must be '8bit' or 'float'");
+ return;
+ }
+}
+
+sub setscanline {
+ my $self = shift;
+ my %opts = ( x=>0, @_);
+
+ $self->_valid_image or return;
+
+ unless (defined $opts{'y'}) {
+ $self->_set_error("missing y parameter");
+ return;
+ }
+
+ if (!$opts{type}) {
+ if (ref $opts{pixels} && @{$opts{pixels}}) {
+ # try to guess the type
+ if ($opts{pixels}[0]->isa('Imager::Color')) {
+ $opts{type} = '8bit';
+ }
+ elsif ($opts{pixels}[0]->isa('Imager::Color::Float')) {
+ $opts{type} = 'float';
+ }
+ else {
+ $self->_set_error("missing type parameter and could not guess from pixels");
+ return;
+ }
+ }
+ else {
+ # default
+ $opts{type} = '8bit';
+ }
+ }
+
+ if ($opts{type} eq '8bit') {
+ if (ref $opts{pixels}) {
+ return i_plin($self->{IMG}, $opts{x}, $opts{'y'}, @{$opts{pixels}});
+ }
+ else {
+ return i_plin($self->{IMG}, $opts{x}, $opts{'y'}, $opts{pixels});
+ }
+ }
+ elsif ($opts{type} eq 'float') {
+ if (ref $opts{pixels}) {
+ return i_plinf($self->{IMG}, $opts{x}, $opts{'y'}, @{$opts{pixels}});
+ }
+ else {
+ return i_plinf($self->{IMG}, $opts{x}, $opts{'y'}, $opts{pixels});
+ }
+ }
+ elsif ($opts{type} eq 'index') {
+ if (ref $opts{pixels}) {
+ return i_ppal($self->{IMG}, $opts{x}, $opts{'y'}, @{$opts{pixels}});
+ }
+ else {
+ return i_ppal_p($self->{IMG}, $opts{x}, $opts{'y'}, $opts{pixels});
+ }
+ }
+ else {
+ $self->_set_error("invalid type parameter - must be '8bit' or 'float'");
+ return;
+ }
+}
+
+sub getsamples {
+ my $self = shift;
+ my %opts = ( type => '8bit', x=>0, offset => 0, @_);
+
+ defined $opts{width} or $opts{width} = $self->getwidth - $opts{x};
+
+ unless (defined $opts{'y'}) {
+ $self->_set_error("missing y parameter");
+ return;
+ }
+
+ unless ($opts{channels}) {
+ $opts{channels} = [ 0 .. $self->getchannels()-1 ];
+ }
+
+ if ($opts{target}) {
+ my $target = $opts{target};
+ my $offset = $opts{offset};
+ if ($opts{type} eq '8bit') {
+ my @samples = i_gsamp($self->{IMG}, $opts{x}, $opts{x}+$opts{width},
+ $opts{y}, @{$opts{channels}})
+ or return;
+ @{$target}{$offset .. $offset + @samples - 1} = @samples;
+ return scalar(@samples);
+ }
+ elsif ($opts{type} eq 'float') {
+ my @samples = i_gsampf($self->{IMG}, $opts{x}, $opts{x}+$opts{width},
+ $opts{y}, @{$opts{channels}});
+ @{$target}{$offset .. $offset + @samples - 1} = @samples;
+ return scalar(@samples);
+ }
+ elsif ($opts{type} =~ /^(\d+)bit$/) {
+ my $bits = $1;
+
+ my @data;
+ my $count = i_gsamp_bits($self->{IMG}, $opts{x}, $opts{x}+$opts{width},
+ $opts{y}, $bits, $target,
+ $offset, @{$opts{channels}});
+ unless (defined $count) {
+ $self->_set_error(Imager->_error_as_msg);
+ return;
+ }
+
+ return $count;
+ }
+ else {
+ $self->_set_error("invalid type parameter - must be '8bit' or 'float'");
+ return;
+ }
+ }
+ else {
+ if ($opts{type} eq '8bit') {
+ return i_gsamp($self->{IMG}, $opts{x}, $opts{x}+$opts{width},
+ $opts{y}, @{$opts{channels}});
+ }
+ elsif ($opts{type} eq 'float') {
+ return i_gsampf($self->{IMG}, $opts{x}, $opts{x}+$opts{width},
+ $opts{y}, @{$opts{channels}});
+ }
+ elsif ($opts{type} =~ /^(\d+)bit$/) {
+ my $bits = $1;
+
+ my @data;
+ i_gsamp_bits($self->{IMG}, $opts{x}, $opts{x}+$opts{width},
+ $opts{y}, $bits, \@data, 0, @{$opts{channels}})
+ or return;
+ return @data;
+ }
+ else {
+ $self->_set_error("invalid type parameter - must be '8bit' or 'float'");
+ return;
+ }
+ }
+}
+
+sub setsamples {
+ my $self = shift;
+ my %opts = ( x => 0, offset => 0, @_ );
+
+ unless ($self->{IMG}) {
+ $self->_set_error('setsamples: empty input image');
+ return;
+ }
+
+ unless(defined $opts{data} && ref $opts{data}) {
+ $self->_set_error('setsamples: data parameter missing or invalid');
+ return;
+ }
+
+ unless ($opts{channels}) {
+ $opts{channels} = [ 0 .. $self->getchannels()-1 ];
+ }
+
+ unless ($opts{type} && $opts{type} =~ /^(\d+)bit$/) {
+ $self->_set_error('setsamples: type parameter missing or invalid');
+ return;
+ }
+ my $bits = $1;
+
+ unless (defined $opts{width}) {
+ $opts{width} = $self->getwidth() - $opts{x};
+ }
+
+ my $count = i_psamp_bits($self->{IMG}, $opts{x}, $opts{y}, $bits,
+ $opts{channels}, $opts{data}, $opts{offset},
+ $opts{width});
+ unless (defined $count) {
+ $self->_set_error(Imager->_error_as_msg);
+ return;
+ }
+
+ return $count;
+}
+
+# make an identity matrix of the given size
+sub _identity {
+ my ($size) = @_;
+
+ my $matrix = [ map { [ (0) x $size ] } 1..$size ];
+ for my $c (0 .. ($size-1)) {
+ $matrix->[$c][$c] = 1;
+ }
+ return $matrix;
+}
+
+# general function to convert an image
+sub convert {
+ my ($self, %opts) = @_;
+ my $matrix;
+
+ unless (defined wantarray) {
+ my @caller = caller;
+ warn "convert() called in void context - convert() returns the converted image at $caller[1] line $caller[2]\n";
+ return;
+ }
+
+ # the user can either specify a matrix or preset
+ # the matrix overrides the preset
+ if (!exists($opts{matrix})) {
+ unless (exists($opts{preset})) {
+ $self->{ERRSTR} = "convert() needs a matrix or preset";
+ return;
+ }
+ else {
+ if ($opts{preset} eq 'gray' || $opts{preset} eq 'grey') {
+ # convert to greyscale, keeping the alpha channel if any
+ if ($self->getchannels == 3) {
+ $matrix = [ [ 0.222, 0.707, 0.071 ] ];
+ }
+ elsif ($self->getchannels == 4) {
+ # preserve the alpha channel
+ $matrix = [ [ 0.222, 0.707, 0.071, 0 ],
+ [ 0, 0, 0, 1 ] ];
+ }
+ else {
+ # an identity
+ $matrix = _identity($self->getchannels);
+ }
+ }
+ elsif ($opts{preset} eq 'noalpha') {
+ # strip the alpha channel
+ if ($self->getchannels == 2 or $self->getchannels == 4) {
+ $matrix = _identity($self->getchannels);
+ pop(@$matrix); # lose the alpha entry
+ }
+ else {
+ $matrix = _identity($self->getchannels);
+ }
+ }
+ elsif ($opts{preset} eq 'red' || $opts{preset} eq 'channel0') {
+ # extract channel 0
+ $matrix = [ [ 1 ] ];
+ }
+ elsif ($opts{preset} eq 'green' || $opts{preset} eq 'channel1') {
+ $matrix = [ [ 0, 1 ] ];
+ }
+ elsif ($opts{preset} eq 'blue' || $opts{preset} eq 'channel2') {
+ $matrix = [ [ 0, 0, 1 ] ];
+ }
+ elsif ($opts{preset} eq 'alpha') {
+ if ($self->getchannels == 2 or $self->getchannels == 4) {
+ $matrix = [ [ (0) x ($self->getchannels-1), 1 ] ];
+ }
+ else {
+ # the alpha is just 1 <shrug>
+ $matrix = [ [ (0) x $self->getchannels, 1 ] ];
+ }
+ }
+ elsif ($opts{preset} eq 'rgb') {
+ if ($self->getchannels == 1) {
+ $matrix = [ [ 1 ], [ 1 ], [ 1 ] ];
+ }
+ elsif ($self->getchannels == 2) {
+ # preserve the alpha channel
+ $matrix = [ [ 1, 0 ], [ 1, 0 ], [ 1, 0 ], [ 0, 1 ] ];
+ }
+ else {
+ $matrix = _identity($self->getchannels);
+ }
+ }
+ elsif ($opts{preset} eq 'addalpha') {
+ if ($self->getchannels == 1) {
+ $matrix = _identity(2);
+ }
+ elsif ($self->getchannels == 3) {
+ $matrix = _identity(4);
+ }
+ else {
+ $matrix = _identity($self->getchannels);
+ }
+ }
+ else {
+ $self->{ERRSTR} = "Unknown convert preset $opts{preset}";
+ return undef;
+ }
+ }
+ }
+ else {
+ $matrix = $opts{matrix};
+ }
+
+ my $new = Imager->new;
+ $new->{IMG} = i_convert($self->{IMG}, $matrix);
+ unless ($new->{IMG}) {
+ # most likely a bad matrix
+ $self->{ERRSTR} = _error_as_msg();
+ return undef;
+ }
+ return $new;
+}
+
+
+# general function to map an image through lookup tables
+
+sub map {
+ my ($self, %opts) = @_;
+ my @chlist = qw( red green blue alpha );
+
+ if (!exists($opts{'maps'})) {
+ # make maps from channel maps
+ my $chnum;
+ for $chnum (0..$#chlist) {
+ if (exists $opts{$chlist[$chnum]}) {
+ $opts{'maps'}[$chnum] = $opts{$chlist[$chnum]};
+ } elsif (exists $opts{'all'}) {
+ $opts{'maps'}[$chnum] = $opts{'all'};
+ }
+ }
+ }
+ if ($opts{'maps'} and $self->{IMG}) {
+ i_map($self->{IMG}, $opts{'maps'} );
+ }
+ return $self;
+}
+
+sub difference {
+ my ($self, %opts) = @_;
+
+ defined $opts{mindist} or $opts{mindist} = 0;
+
+ defined $opts{other}
+ or return $self->_set_error("No 'other' parameter supplied");
+ defined $opts{other}{IMG}
+ or return $self->_set_error("No image data in 'other' image");
+
+ $self->{IMG}
+ or return $self->_set_error("No image data");
+
+ my $result = Imager->new;
+ $result->{IMG} = i_diff_image($self->{IMG}, $opts{other}{IMG},
+ $opts{mindist})
+ or return $self->_set_error($self->_error_as_msg());
+
+ return $result;
+}
+
+# destructive border - image is shrunk by one pixel all around
+
+sub border {
+ my ($self,%opts)=@_;
+ my($tx,$ty)=($self->getwidth()-1,$self->getheight()-1);
+ $self->polyline('x'=>[0,$tx,$tx,0,0],'y'=>[0,0,$ty,$ty,0],%opts);
+}
+
+
+# Get the width of an image
+
+sub getwidth {
+ my $self = shift;
+ if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
+ return (i_img_info($self->{IMG}))[0];
+}
+
+# Get the height of an image
+
+sub getheight {
+ my $self = shift;
+ if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
+ return (i_img_info($self->{IMG}))[1];
+}
+
+# Get number of channels in an image
+
+sub getchannels {
+ my $self = shift;
+ if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
+ return i_img_getchannels($self->{IMG});
+}
+
+# Get channel mask
+
+sub getmask {
+ my $self = shift;
+ if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
+ return i_img_getmask($self->{IMG});
+}
+
+# Set channel mask
+
+sub setmask {
+ my $self = shift;
+ my %opts = @_;
+ if (!defined($self->{IMG})) {
+ $self->{ERRSTR} = 'image is empty';
+ return undef;
+ }
+ unless (defined $opts{mask}) {
+ $self->_set_error("mask parameter required");
+ return;
+ }
+ i_img_setmask( $self->{IMG} , $opts{mask} );
+
+ 1;
+}
+
+# Get number of colors in an image
+
+sub getcolorcount {
+ my $self=shift;
+ my %opts=('maxcolors'=>2**30,@_);
+ if (!defined($self->{IMG})) { $self->{ERRSTR}='image is empty'; return undef; }
+ my $rc=i_count_colors($self->{IMG},$opts{'maxcolors'});
+ return ($rc==-1? undef : $rc);
+}
+
+# Returns a reference to a hash. The keys are colour named (packed) and the
+# values are the number of pixels in this colour.
+sub getcolorusagehash {
+ my $self = shift;
+
+ my %opts = ( maxcolors => 2**30, @_ );
+ my $max_colors = $opts{maxcolors};
+ unless (defined $max_colors && $max_colors > 0) {
+ $self->_set_error('maxcolors must be a positive integer');
+ return;
+ }
+
+ unless (defined $self->{IMG}) {
+ $self->_set_error('empty input image');
+ return;
+ }
+
+ my $channels= $self->getchannels;
+ # We don't want to look at the alpha channel, because some gifs using it
+ # doesn't define it for every colour (but only for some)
+ $channels -= 1 if $channels == 2 or $channels == 4;
+ my %color_use;
+ my $height = $self->getheight;
+ for my $y (0 .. $height - 1) {
+ my $colors = $self->getsamples('y' => $y, channels => [ 0 .. $channels - 1 ]);
+ while (length $colors) {
+ $color_use{ substr($colors, 0, $channels, '') }++;
+ }
+ keys %color_use > $max_colors
+ and return;
+ }
+ return \%color_use;
+}
+
+# This will return a ordered array of the colour usage. Kind of the sorted
+# version of the values of the hash returned by getcolorusagehash.
+# You might want to add safety checks and change the names, etc...
+sub getcolorusage {
+ my $self = shift;
+
+ my %opts = ( maxcolors => 2**30, @_ );
+ my $max_colors = $opts{maxcolors};
+ unless (defined $max_colors && $max_colors > 0) {
+ $self->_set_error('maxcolors must be a positive integer');
+ return;
+ }
+
+ unless (defined $self->{IMG}) {
+ $self->_set_error('empty input image');
+ return undef;
+ }
+
+ return i_get_anonymous_color_histo($self->{IMG}, $max_colors);
+}
+
+# draw string to an image
+
+sub string {
+ my $self = shift;
+ unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+
+ my %input=('x'=>0, 'y'=>0, @_);
+ defined($input{string}) or $input{string} = $input{text};
+
+ unless(defined $input{string}) {
+ $self->{ERRSTR}="missing required parameter 'string'";
+ return;
+ }
+
+ unless($input{font}) {
+ $self->{ERRSTR}="missing required parameter 'font'";
+ return;
+ }
+
+ unless ($input{font}->draw(image=>$self, %input)) {
+ return;
+ }
+
+ return $self;
+}
+
+sub align_string {
+ my $self = shift;
+
+ my $img;
+ if (ref $self) {
+ unless ($self->{IMG}) {
+ $self->{ERRSTR}='empty input image';
+ return;
+ }
+ $img = $self;
+ }
+ else {
+ $img = undef;
+ }
+
+ my %input=('x'=>0, 'y'=>0, @_);
+ $input{string}||=$input{text};
+
+ unless(exists $input{string}) {
+ $self->_set_error("missing required parameter 'string'");
+ return;
+ }
+
+ unless($input{font}) {
+ $self->_set_error("missing required parameter 'font'");
+ return;
+ }
+
+ my @result;
+ unless (@result = $input{font}->align(image=>$img, %input)) {
+ return;
+ }
+
+ return wantarray ? @result : $result[0];
+}
+
+my @file_limit_names = qw/width height bytes/;
+
+sub set_file_limits {
+ shift;
+
+ my %opts = @_;
+ my %values;
+
+ if ($opts{reset}) {
+ @values{@file_limit_names} = (0) x @file_limit_names;
+ }
+ else {
+ @values{@file_limit_names} = i_get_image_file_limits();
+ }
+
+ for my $key (keys %values) {
+ defined $opts{$key} and $values{$key} = $opts{$key};
+ }
+
+ i_set_image_file_limits($values{width}, $values{height}, $values{bytes});
+}
+
+sub get_file_limits {
+ i_get_image_file_limits();
+}
+
+# Shortcuts that can be exported
+
+sub newcolor { Imager::Color->new(@_); }
+sub newfont { Imager::Font->new(@_); }
+sub NCF { Imager::Color::Float->new(@_) }
+
+*NC=*newcolour=*newcolor;
+*NF=*newfont;
+
+*open=\&read;
+*circle=\&arc;
+
+
+#### Utility routines
+
+sub errstr {
+ ref $_[0] ? $_[0]->{ERRSTR} : $ERRSTR
+}
+
+sub _set_error {
+ my ($self, $msg) = @_;
+
+ if (ref $self) {
+ $self->{ERRSTR} = $msg;
+ }
+ else {
+ $ERRSTR = $msg;
+ }
+ return;
+}
+
+# Default guess for the type of an image from extension
+
+sub def_guess_type {
+ my $name=lc(shift);
+ my $ext;
+ $ext=($name =~ m/\.([^\.]+)$/)[0];
+ return 'tiff' if ($ext =~ m/^tiff?$/);
+ return 'jpeg' if ($ext =~ m/^jpe?g$/);
+ return 'pnm' if ($ext =~ m/^p[pgb]m$/);
+ return 'png' if ($ext eq "png");
+ return 'bmp' if ($ext eq "bmp" || $ext eq "dib");
+ return 'tga' if ($ext eq "tga");
+ return 'sgi' if ($ext eq "rgb" || $ext eq "bw" || $ext eq "sgi" || $ext eq "rgba");
+ return 'gif' if ($ext eq "gif");
+ return 'raw' if ($ext eq "raw");
+ return lc $ext; # best guess
+ return ();
+}
+
+sub combines {
+ return @combine_types;
+}
+
+# get the minimum of a list
+
+sub _min {
+ my $mx=shift;
+ for(@_) { if ($_<$mx) { $mx=$_; }}
+ return $mx;
+}
+
+# get the maximum of a list
+
+sub _max {
+ my $mx=shift;
+ for(@_) { if ($_>$mx) { $mx=$_; }}
+ return $mx;
+}
+
+# string stuff for iptc headers
+
+sub _clean {
+ my($str)=$_[0];
+ $str = substr($str,3);
+ $str =~ s/[\n\r]//g;
+ $str =~ s/\s+/ /g;
+ $str =~ s/^\s//;
+ $str =~ s/\s$//;
+ return $str;
+}
+
+# A little hack to parse iptc headers.
+
+sub parseiptc {
+ my $self=shift;
+ my(@sar,$item,@ar);
+ my($caption,$photogr,$headln,$credit);
+
+ my $str=$self->{IPTCRAW};
+
+ defined $str
+ or return;
+
+ @ar=split(/8BIM/,$str);
+
+ my $i=0;
+ foreach (@ar) {
+ if (/^\004\004/) {
+ @sar=split(/\034\002/);
+ foreach $item (@sar) {
+ if ($item =~ m/^x/) {
+ $caption = _clean($item);
+ $i++;
+ }
+ if ($item =~ m/^P/) {
+ $photogr = _clean($item);
+ $i++;
+ }
+ if ($item =~ m/^i/) {
+ $headln = _clean($item);
+ $i++;
+ }
+ if ($item =~ m/^n/) {
+ $credit = _clean($item);
+ $i++;
+ }
+ }
+ }
+ }
+ return (caption=>$caption,photogr=>$photogr,headln=>$headln,credit=>$credit);
+}
+
+sub Inline {
+ my ($lang) = @_;
+
+ $lang eq 'C'
+ or die "Only C language supported";
+
+ require Imager::ExtUtils;
+ return Imager::ExtUtils->inline_config;
+}
+
+# threads shouldn't try to close raw Imager objects
+sub Imager::ImgRaw::CLONE_SKIP { 1 }
+
+1;
+__END__
+# Below is the stub of documentation for your module. You better edit it!
+
+=head1 NAME
+
+Imager - Perl extension for Generating 24 bit Images
+
+=head1 SYNOPSIS
+
+ # Thumbnail example
+
+ #!/usr/bin/perl -w
+ use strict;
+ use Imager;
+
+ die "Usage: thumbmake.pl filename\n" if !-f $ARGV[0];
+ my $file = shift;
+
+ my $format;
+
+ # see Imager::Files for information on the read() method
+ my $im = Imager->new(file=>$file)
+ or die Imager->errstr();
+
+ $file =~ s/\.[^.]*$//;
+
+ # Create smaller version
+ # documented in Imager::Transformations
+ my $thumb = $img->scale(scalefactor=>.3);
+
+ # Autostretch individual channels
+ $thumb->filter(type=>'autolevels');
+
+ # try to save in one of these formats
+ SAVE:
+
+ for $format ( qw( png gif jpeg tiff ppm ) ) {
+ # Check if given format is supported
+ if ($Imager::formats{$format}) {
+ $file.="_low.$format";
+ print "Storing image as: $file\n";
+ # documented in Imager::Files
+ $thumb->write(file=>$file) or
+ die $thumb->errstr;
+ last SAVE;
+ }
+ }
+
+=head1 DESCRIPTION
+
+Imager is a module for creating and altering images. It can read and
+write various image formats, draw primitive shapes like lines,and
+polygons, blend multiple images together in various ways, scale, crop,
+render text and more.
+
+=head2 Overview of documentation
+
+=over
+
+=item *
+
+Imager - This document - Synopsis, Example, Table of Contents and
+Overview.
+
+=item *
+
+L<Imager::Tutorial> - a brief introduction to Imager.
+
+=item *
+
+L<Imager::Cookbook> - how to do various things with Imager.
+
+=item *
+
+L<Imager::ImageTypes> - Basics of constructing image objects with
+C<new()>: Direct type/virtual images, RGB(A)/paletted images,
+8/16/double bits/channel, color maps, channel masks, image tags, color
+quantization. Also discusses basic image information methods.
+
+=item *
+
+L<Imager::Files> - IO interaction, reading/writing images, format
+specific tags.
+
+=item *
+
+L<Imager::Draw> - Drawing Primitives, lines, boxes, circles, arcs,
+flood fill.
+
+=item *
+
+L<Imager::Color> - Color specification.
+
+=item *
+
+L<Imager::Fill> - Fill pattern specification.
+
+=item *
+
+L<Imager::Font> - General font rendering, bounding boxes and font
+metrics.
+
+=item *
+
+L<Imager::Transformations> - Copying, scaling, cropping, flipping,
+blending, pasting, convert and map.
+
+=item *
+
+L<Imager::Engines> - Programmable transformations through
+C<transform()>, C<transform2()> and C<matrix_transform()>.
+
+=item *
+
+L<Imager::Filters> - Filters, sharpen, blur, noise, convolve etc. and
+filter plugins.
+
+=item *
+
+L<Imager::Expr> - Expressions for evaluation engine used by
+transform2().
+
+=item *
+
+L<Imager::Matrix2d> - Helper class for affine transformations.
+
+=item *
+
+L<Imager::Fountain> - Helper for making gradient profiles.
+
+=item *
+
+L<Imager::API> - using Imager's C API
+
+=item *
+
+L<Imager::APIRef> - API function reference
+
+=item *
+
+L<Imager::Inline> - using Imager's C API from Inline::C
+
+=item *
+
+L<Imager::ExtUtils> - tools to get access to Imager's C API.
+
+=back
+
+=head2 Basic Overview
+
+An Image object is created with C<$img = Imager-E<gt>new()>.
+Examples:
+
+ $img=Imager->new(); # create empty image
+ $img->read(file=>'lena.png',type=>'png') or # read image from file
+ die $img->errstr(); # give an explanation
+ # if something failed
+
+or if you want to create an empty image:
+
+ $img=Imager->new(xsize=>400,ysize=>300,channels=>4);
+
+This example creates a completely black image of width 400 and height
+300 and 4 channels.
+
+=head1 ERROR HANDLING
+
+In general a method will return false when it fails, if it does use
+the errstr() method to find out why:
+
+=over
+
+=item errstr
+
+Returns the last error message in that context.
+
+If the last error you received was from calling an object method, such
+as read, call errstr() as an object method to find out why:
+
+ my $image = Imager->new;
+ $image->read(file => 'somefile.gif')
+ or die $image->errstr;
+
+If it was a class method then call errstr() as a class method:
+
+ my @imgs = Imager->read_multi(file => 'somefile.gif')
+ or die Imager->errstr;
+
+Note that in some cases object methods are implemented in terms of
+class methods so a failing object method may set both.
+
+=back
+
+The C<Imager-E<gt>new> method is described in detail in
+L<Imager::ImageTypes>.
+
+=head1 METHOD INDEX
+
+Where to find information on methods for Imager class objects.
+
+addcolors() - L<Imager::ImageTypes/addcolors> - add colors to a
+paletted image
+
+addtag() - L<Imager::ImageTypes/addtag> - add image tags
+
+align_string() - L<Imager::Draw/align_string> - draw text aligned on a
+point
+
+arc() - L<Imager::Draw/arc> - draw a filled arc
+
+bits() - L<Imager::ImageTypes/bits> - number of bits per sample for the
+image
+
+box() - L<Imager::Draw/box> - draw a filled or outline box.
+
+circle() - L<Imager::Draw/circle> - draw a filled circle
+
+colorcount() - L<Imager::Draw/colorcount> - the number of colors in an
+image's palette (paletted images only)
+
+combines() - L<Imager::Draw/combines> - return a list of the different
+combine type keywords
+
+compose() - L<Imager::Transformations/compose> - compose one image
+over another.
+
+convert() - L<Imager::Transformations/"Color transformations"> -
+transform the color space
+
+copy() - L<Imager::Transformations/copy> - make a duplicate of an
+image
+
+crop() - L<Imager::Transformations/crop> - extract part of an image
+
+def_guess_type() - L<Imager::Files/def_guess_type> - default function
+used to guess the output file format based on the output filename
+
+deltag() - L<Imager::ImageTypes/deltag> - delete image tags
+
+difference() - L<Imager::Filters/"Image Difference"> - produce a
+difference images from two input images.
+
+errstr() - L<"Basic Overview"> - the error from the last failed
+operation.
+
+filter() - L<Imager::Filters> - image filtering
+
+findcolor() - L<Imager::ImageTypes/findcolor> - search the image
+palette, if it has one
+
+flip() - L<Imager::Transformations/flip> - flip an image, vertically,
+horizontally
+
+flood_fill() - L<Imager::Draw/flood_fill> - fill an enclosed or same
+color area
+
+getchannels() - L<Imager::ImageTypes/getchannels> - the number of
+samples per pixel for an image
+
+getcolorcount() - L<Imager::ImageTypes/getcolorcount> - the number of
+different colors used by an image (works for direct color images)
+
+getcolors() - L<Imager::ImageTypes/getcolors> - get colors from the image
+palette, if it has one
+
+getcolorusage() - L<Imager::ImageTypes/getcolorusage>
+
+getcolorusagehash() - L<Imager::ImageTypes/getcolorusagehash>
+
+get_file_limits() - L<Imager::Files/"Limiting the sizes of images you read">
+
+getheight() - L<Imager::ImageTypes/getwidth> - height of the image in
+pixels
+
+getmask() - L<Imager::ImageTypes/getmask> - write mask for the image
+
+getpixel() - L<Imager::Draw/getpixel> - retrieve one or more pixel
+colors
+
+getsamples() - L<Imager::Draw/getsamples> - retrieve samples from a
+row or subrow of pixels.
+
+getscanline() - L<Imager::Draw/getscanline> - retrieve colors for a
+row or subrow of pixels.
+
+getwidth() - L<Imager::ImageTypes/getwidth> - width of the image in
+pixels.
+
+img_set() - L<Imager::ImageTypes/img_set> - re-use an Imager object
+for a new image.
+
+init() - L<Imager::ImageTypes/init>
+
+is_bilevel() - L<Imager::ImageTypes/is_bilevel> - returns whether
+image write functions should write the image in their bi-level (blank
+and white, no grey levels) format
+
+line() - L<Imager::Draw/line> - draw an interval
+
+load_plugin() - L<Imager::Filters/load_plugin>
+
+map() - L<Imager::Transformations/"Color Mappings"> - remap color
+channel values
+
+masked() - L<Imager::ImageTypes/masked> - make a masked image
+
+matrix_transform() - L<Imager::Engines/matrix_transform>
+
+maxcolors() - L<Imager::ImageTypes/maxcolors>
+
+NC() - L<Imager::Handy/NC>
+
+NCF() - L<Imager::Handy/NCF>
+
+new() - L<Imager::ImageTypes/new>
+
+newcolor() - L<Imager::Handy/newcolor>
+
+newcolour() - L<Imager::Handy/newcolour>
+
+newfont() - L<Imager::Handy/newfont>
+
+NF() - L<Imager::Handy/NF>
+
+open() - L<Imager::Files> - an alias for read()
+
+parseiptc() - L<Imager::Files/parseiptc> - parse IPTC data from a JPEG
+image
+
+paste() - L<Imager::Transformations/paste> - draw an image onto an image
+
+polygon() - L<Imager::Draw/polygon>
+
+polyline() - L<Imager::Draw/polyline>
+
+read() - L<Imager::Files> - read a single image from an image file
+
+read_multi() - L<Imager::Files> - read multiple images from an image
+file
+
+read_types() - L<Imager::Files/read_types> - list image types Imager
+can read.
+
+register_filter() - L<Imager::Filters/register_filter>
+
+register_reader() - L<Imager::Files/register_reader>
+
+register_writer() - L<Imager::Files/register_writer>
+
+rotate() - L<Imager::Transformations/rotate>
+
+rubthrough() - L<Imager::Transformations/rubthrough> - draw an image onto an
+image and use the alpha channel
+
+scale() - L<Imager::Transformations/scale>
+
+scale_calculate() - L<Imager::Transformations/scale_calculate>
+
+scaleX() - L<Imager::Transformations/scaleX>
+
+scaleY() - L<Imager::Transformations/scaleY>
+
+setcolors() - L<Imager::ImageTypes/setcolors> - set palette colors in
+a paletted image
+
+set_file_limits() - L<Imager::Files/"Limiting the sizes of images you read">
+
+setmask() - L<Imager::ImageTypes/setmask>
+
+setpixel() - L<Imager::Draw/setpixel>
+
+setsamples() - L<Imager::Draw/setsamples>
+
+setscanline() - L<Imager::Draw/setscanline>
+
+settag() - L<Imager::ImageTypes/settag>
+
+string() - L<Imager::Draw/string> - draw text on an image
+
+tags() - L<Imager::ImageTypes/tags> - fetch image tags
+
+to_paletted() - L<Imager::ImageTypes/to_paletted>
+
+to_rgb16() - L<Imager::ImageTypes/to_rgb16>
+
+to_rgb8() - L<Imager::ImageTypes/to_rgb8>
+
+transform() - L<Imager::Engines/"transform">
+
+transform2() - L<Imager::Engines/"transform2">
+
+type() - L<Imager::ImageTypes/type> - type of image (direct vs paletted)
+
+unload_plugin() - L<Imager::Filters/unload_plugin>
+
+virtual() - L<Imager::ImageTypes/virtual> - whether the image has it's own
+data
+
+write() - L<Imager::Files> - write an image to a file
+
+write_multi() - L<Imager::Files> - write multiple image to an image
+file.
+
+write_types() - L<Imager::Files/read_types> - list image types Imager
+can write.
+
+=head1 CONCEPT INDEX
+
+animated GIF - L<Imager::Files/"Writing an animated GIF">
+
+aspect ratio - L<Imager::ImageTypes/i_xres>,
+L<Imager::ImageTypes/i_yres>, L<Imager::ImageTypes/i_aspect_only>
+
+blend - alpha blending one image onto another
+L<Imager::Transformations/rubthrough>
+
+blur - L<Imager::Filters/guassian>, L<Imager::Filters/conv>
+
+boxes, drawing - L<Imager::Draw/box>
+
+changes between image - L<Imager::Filters/"Image Difference">
+
+color - L<Imager::Color>
+
+color names - L<Imager::Color>, L<Imager::Color::Table>
+
+combine modes - L<Imager::Draw/"Combine Types">
+
+compare images - L<Imager::Filters/"Image Difference">
+
+contrast - L<Imager::Filters/contrast>, L<Imager::Filters/autolevels>
+
+convolution - L<Imager::Filters/conv>
+
+cropping - L<Imager::Transformations/crop>
+
+CUR files - L<Imager::Files/"ICO (Microsoft Windows Icon) and CUR (Microsoft Windows Cursor)">
+
+C<diff> images - L<Imager::Filters/"Image Difference">
+
+dpi - L<Imager::ImageTypes/i_xres>,
+L<Imager::Cookbook/"Image spatial resolution">
+
+drawing boxes - L<Imager::Draw/box>
+
+drawing lines - L<Imager::Draw/line>
+
+drawing text - L<Imager::Draw/string>, L<Imager::Draw/align_string>
+
+error message - L<"ERROR HANDLING">
+
+files, font - L<Imager::Font>
+
+files, image - L<Imager::Files>
+
+filling, types of fill - L<Imager::Fill>
+
+filling, boxes - L<Imager::Draw/box>
+
+filling, flood fill - L<Imager::Draw/flood_fill>
+
+flood fill - L<Imager::Draw/flood_fill>
+
+fonts - L<Imager::Font>
+
+fonts, drawing with - L<Imager::Draw/string>,
+L<Imager::Draw/align_string>, L<Imager::Font::Wrap>
+
+fonts, metrics - L<Imager::Font/bounding_box>, L<Imager::Font::BBox>
+
+fonts, multiple master - L<Imager::Font/"MULTIPLE MASTER FONTS">
+
+fountain fill - L<Imager::Fill/"Fountain fills">,
+L<Imager::Filters/fountain>, L<Imager::Fountain>,
+L<Imager::Filters/gradgen>
+
+GIF files - L<Imager::Files/"GIF">
+
+GIF files, animated - L<Imager::File/"Writing an animated GIF">
+
+gradient fill - L<Imager::Fill/"Fountain fills">,
+L<Imager::Filters/fountain>, L<Imager::Fountain>,
+L<Imager::Filters/gradgen>
+
+grayscale, convert image to - L<Imager::Transformations/convert>
+
+guassian blur - L<Imager::Filters/guassian>
+
+hatch fills - L<Imager::Fill/"Hatched fills">
+
+ICO files - L<Imager::Files/"ICO (Microsoft Windows Icon) and CUR (Microsoft Windows Cursor)">
+
+invert image - L<Imager::Filters/hardinvert>
+
+JPEG - L<Imager::Files/"JPEG">
+
+limiting image sizes - L<Imager::Files/"Limiting the sizes of images you read">
+
+lines, drawing - L<Imager::Draw/line>
+
+matrix - L<Imager::Matrix2d>,
+L<Imager::Transformations/"Matrix Transformations">,
+L<Imager::Font/transform>
+
+metadata, image - L<Imager::ImageTypes/"Tags">
+
+mosaic - L<Imager::Filters/mosaic>
+
+noise, filter - L<Imager::Filters/noise>
+
+noise, rendered - L<Imager::Filters/turbnoise>,
+L<Imager::Filters/radnoise>
+
+paste - L<Imager::Transformations/paste>,
+L<Imager::Transformations/rubthrough>
+
+pseudo-color image - L<Imager::ImageTypes/to_paletted>,
+L<Imager::ImageTypes/new>
+
+posterize - L<Imager::Filters/postlevels>
+
+png files - L<Imager::Files>, L<Imager::Files/"PNG">
+
+pnm - L<Imager::Files/"PNM (Portable aNy Map)">
+
+rectangles, drawing - L<Imager::Draw/box>
+
+resizing an image - L<Imager::Transformations/scale>,
+L<Imager::Transformations/crop>
+
+RGB (SGI) files - L<Imager::Files/"SGI (RGB, BW)">
+
+saving an image - L<Imager::Files>
+
+scaling - L<Imager::Transformations/scale>
+
+SGI files - L<Imager::Files/"SGI (RGB, BW)">
+
+sharpen - L<Imager::Filters/unsharpmask>, L<Imager::Filters/conv>
+
+size, image - L<Imager::ImageTypes/getwidth>,
+L<Imager::ImageTypes/getheight>
+
+size, text - L<Imager::Font/bounding_box>
+
+tags, image metadata - L<Imager::ImageTypes/"Tags">
+
+text, drawing - L<Imager::Draw/string>, L<Imager::Draw/align_string>,
+L<Imager::Font::Wrap>
+
+text, wrapping text in an area - L<Imager::Font::Wrap>
+
+text, measuring - L<Imager::Font/bounding_box>, L<Imager::Font::BBox>
+
+tiles, color - L<Imager::Filters/mosaic>
+
+unsharp mask - L<Imager::Filters/unsharpmask>
+
+watermark - L<Imager::Filters/watermark>
+
+writing an image to a file - L<Imager::Files>
+
+=head1 THREADS
+
+Imager doesn't support perl threads.
+
+Imager has limited code to prevent double frees if you create images,
+colors etc, and then create a thread, but has no code to prevent two
+threads entering Imager's error handling code, and none is likely to
+be added.
+
+=head1 SUPPORT
+
+The best place to get help with Imager is the mailing list.
+
+To subscribe send a message with C<subscribe> in the body to:
+
+ imager-devel+request@molar.is
+
+or use the form at:
+
+=over
+
+L<http://www.molar.is/en/lists/imager-devel/>
+
+=back
+
+where you can also find the mailing list archive.
+
+You can report bugs by pointing your browser at:
+
+=over
+
+L<https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Imager>
+
+=back
+
+or by sending an email to:
+
+=over
+
+bug-Imager@rt.cpan.org
+
+=back
+
+Please remember to include the versions of Imager, perl, supporting
+libraries, and any relevant code. If you have specific images that
+cause the problems, please include those too.
+
+If you don't want to publish your email address on a mailing list you
+can use CPAN::Forum:
+
+ http://www.cpanforum.com/dist/Imager
+
+You will need to register to post.
+
+=head1 CONTRIBUTING TO IMAGER
+
+=head2 Feedback
+
+I like feedback.
+
+If you like or dislike Imager, you can add a public review of Imager
+at CPAN Ratings:
+
+ http://cpanratings.perl.org/dist/Imager
+
+This requires a Bitcard Account (http://www.bitcard.org).
+
+You can also send email to the maintainer below.
+
+If you send me a bug report via email, it will be copied to RT.
+
+=head2 Patches
+
+I accept patches, preferably against the main branch in subversion.
+You should include an explanation of the reason for why the patch is
+needed or useful.
+
+Your patch should include regression tests where possible, otherwise
+it will be delayed until I get a chance to write them.
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org> is the current maintainer for Imager.
+
+Arnar M. Hrafnkelsson is the original author of Imager.
+
+Many others have contributed to Imager, please see the README for a
+complete list.
+
+=head1 SEE ALSO
+
+L<perl>(1), L<Imager::ImageTypes>(3), L<Imager::Files>(3),
+L<Imager::Draw>(3), L<Imager::Color>(3), L<Imager::Fill>(3),
+L<Imager::Font>(3), L<Imager::Transformations>(3),
+L<Imager::Engines>(3), L<Imager::Filters>(3), L<Imager::Expr>(3),
+L<Imager::Matrix2d>(3), L<Imager::Fountain>(3)
+
+L<http://imager.perl.org/>
+
+L<Affix::Infix2Postfix>(3), L<Parse::RecDescent>(3)
+
+Other perl imaging modules include:
+
+L<GD>(3), L<Image::Magick>(3), L<Graphics::Magick>(3).
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/API.pod b/Master/tlpkg/tlperl.straw/lib/Imager/API.pod
new file mode 100755
index 00000000000..2f16868eb9f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/API.pod
@@ -0,0 +1,258 @@
+=head1 NAME
+
+Imager::API - Imager's C API - introduction.
+
+=head1 SYNOPSIS
+
+ #include "imext.h"
+ #include "imperl.h"
+
+ DEFINE_IMAGER_CALLBACKS;
+
+ MODULE = Your::Module PACKAGE = Your::Module
+
+ ...
+
+ BOOT:
+ PERL_INITIALIZE_IMAGER_CALLBACKS;
+
+
+=head1 DESCRIPTION
+
+The API allows you to access Imager functions at the C level from XS
+and from Inline::C.
+
+The intent is to allow users to:
+
+=over
+
+=item *
+
+write C code that does Imager operations the user might do from Perl,
+but faster, for example, the Imager::CountColor example.
+
+=item *
+
+write C code that implements an application specific version of some
+core Imager object, for example, Imager::SDL.
+
+=item *
+
+write C code that hooks into Imagers existing methods, such as filter
+or file format handlers.
+
+=back
+
+See L<Imager::Inline> for information on using Imager's Inline::C
+support.
+
+=head1 Beware
+
+=over
+
+=item *
+
+don't return an object you received as a parameter - this will cause
+the object to be freed twice.
+
+=back
+
+=head1 Types
+
+The API makes the following types visible:
+
+=over
+
+=item *
+
+i_img - used to represent an image
+
+=item *
+
+i_color - used to represent a color with up to 8 bits per sample.
+
+=item *
+
+i_fcolor - used to represent a color with a double per sample.
+
+=item *
+
+i_fill_t - an abstract fill
+
+=back
+
+At this point there is no consolidated font object type, and hence the
+font functions are not visible through Imager's API.
+
+=head2 i_img - images
+
+This contains the dimensions of the image (xsize, ysize, channels),
+image metadata (ch_mask, bits, type, virtual), potentially image data
+(idata) and the a function table, with pointers to functions to
+perform various low level image operations.
+
+The only time you should directly write to any value in this type is
+if you're implementing your own image type.
+
+The typemap includes typenames Imager and Imager::ImgRaw as typedefs
+for C<i_img *>.
+
+For incoming parameters the typemap will accept either Imager or
+Imager::ImgRaw objects.
+
+For return values the typemap will produce a full Imager object for an
+Imager return type and a raw image object for an Imager::ImgRaw return
+type.
+
+=head2 i_color - 8-bit color
+
+Represents an 8-bit per sample color. This is a union containing
+several different structs for access to components of a color:
+
+=over
+
+=item *
+
+gray - single member gray_color.
+
+=item *
+
+rgb - r, g, b members.
+
+=item *
+
+rgba - r, g, b, a members.
+
+=item *
+
+channels - array of channels.
+
+=back
+
+Use Imager::Color for parameter and return value types.
+
+=head2 i_fcolor - floating point color
+
+Similar to i_color except that each component is a double instead of
+an unsigned char.
+
+Use Imager::Color::Float for parameter and return value types.
+
+=head2 i_fill_t - fill objects
+
+Abstract type containing pointers called to perform low level fill
+operations.
+
+Unless you're defining your own fill objects you should treat this as
+an opaque type.
+
+Use Imager::FillHandle for parameter and return value types. At the
+Perl level this is stored in the C<fill> member of the Perl level
+Imager::Fill object.
+
+=head1 Create an XS module using the Imager API
+
+=head2 Foo.pm
+
+Load Imager:
+
+ use Imager 0.48;
+
+and bootstrap your XS code - see L<XSLoader> or L<DynaLoader>.
+
+=head2 Foo.xs
+
+You'll need the following in your XS source:
+
+=over
+
+=item *
+
+include the Imager external API header, and the perl interface header:
+
+ #include "imext.h"
+ #include "imperl.h"
+
+=item *
+
+create the variables used to hold the callback table:
+
+ DEFINE_IMAGER_CALLBACKS;
+
+=item *
+
+initialize the callback table in your BOOT code:
+
+ BOOT:
+ PERL_INITIALIZE_IMAGER_CALLBACKS;
+
+=back
+
+=head2 foo.c
+
+In any other source files where you want to access the Imager API,
+you'll need to:
+
+=over
+
+=item *
+
+include the Imager external API header:
+
+ #include "imext.h"
+
+=back
+
+=head2 Makefile.PL
+
+If you're creating an XS module that depends on Imager's API your
+Makefile.PL will need to do the following:
+
+=over
+
+=item *
+
+C<use Imager::ExtUtils;>
+
+=item *
+
+include Imager's include directory in INC:
+
+ INC => Imager::ExtUtils->includes
+
+=item *
+
+use Imager's typemap:
+
+ TYPEMAPS => [ Imager::ExtUtils->typemap ]
+
+=item *
+
+include Imager 0.48 as a PREREQ_PM:
+
+ PREREQ_PM =>
+ {
+ Imager => 0.48,
+ },
+
+=item *
+
+Since you use Imager::ExtUtils in Makefile.PL (or Build.PL) you should
+include Imager in your configure_requires:
+
+ META_MERGE =>
+ {
+ configure_requires => { Imager => "0.48" }
+ },
+
+=back
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=head1 SEE ALSO
+
+Imager, Imager::ExtUtils, Imager::APIRef, Imager::Inline
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/APIRef.pod b/Master/tlpkg/tlperl.straw/lib/Imager/APIRef.pod
new file mode 100755
index 00000000000..320f0648593
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/APIRef.pod
@@ -0,0 +1,1451 @@
+Do not edit this file, it is generated automatically by apidocs.perl
+from Imager's source files.
+
+Each function description has a comment listing the source file where
+you can find the documentation.
+
+=head1 NAME
+
+Imager::APIRef - Imager's C API - reference.
+
+=head1 SYNOPSIS
+
+ i_color color;
+ color.rgba.r = 255; color.rgba.g = 0; color.rgba.b = 255;
+
+
+ # Data Types
+ i_img *img;
+ i_color black;
+ black.rgba.r = black.rgba.g = black.rgba.b = black.rgba.a = 0;
+ i_fill_t *fill;
+ i_img_dim x;
+
+ # Drawing
+ i_arc(im, 50, 50, 20, 45, 135, &color);
+ i_arc_cfill(im, 50, 50, 35, 90, 135, fill);
+ i_arc_aa(im, 50, 50, 35, 90, 135, &color);
+ i_arc_aa_cfill(im, 50, 50, 35, 90, 135, fill);
+ i_circle_aa(im, 50, 50, 45, &color);
+ i_box(im, 0, 0, im->xsize-1, im->ysize-1, &color).
+ i_box_filled(im, 0, 0, im->xsize-1, im->ysize-1, &color);
+ i_box_cfill(im, 0, 0, im->xsize-1, im->ysize-1, fill);
+ i_flood_fill(im, 50, 50, &color);
+ i_flood_cfill(im, 50, 50, fill);
+ i_flood_fill_border(im, 50, 50, &color, &border);
+ i_flood_cfill_border(im, 50, 50, fill, border);
+
+ # Error handling
+ i_clear_error();
+ i_push_error(0, "Yep, it's broken");
+ i_push_error(errno, "Error writing");
+ i_push_errorf(errno, "Cannot open file %s: %d", filename, errno);
+
+ # Files
+ i_set_image_file_limits(500, 500, 1000000);
+ i_get_image_file_limits(&width, &height, &bytes)
+ i_i_int_check_image_file_limits(width, height, channels, sizeof(i_sample_t))
+
+ # Fills
+ i_fill_t *fill = i_new_fill_solidf(&fcolor, combine);
+ i_fill_t *fill = i_new_fill_solid(&color, combine);
+ i_fill_t *fill = i_new_fill_hatch(&fg_color, &bg_color, combine, hatch, custom_hatch, dx, dy);
+ i_fill_t *fill = i_new_fill_hatchf(&fg_fcolor, &bg_fcolor, combine, hatch, custom_hatch, dx, dy);
+ i_fill_t *fill = i_new_fill_image(src_img, matrix, x_offset, y_offset, combine);
+ fill = i_new_fill_fount(0, 0, 100, 100, i_ft_linear, i_ft_linear,
+ i_fr_triangle, 0, i_fts_grid, 9, 1, segs);
+ i_fill_destroy(fill);
+
+ # Image
+
+ # Image creation/destruction
+ i_img *img = i_img_8_new(width, height, channels);
+ i_img *img = i_sametype(src, width, height);
+ i_img *img = i_sametype_chans(src, width, height, channels);
+ i_img *img = i_img_pal_new(width, height, channels, max_palette_size)
+ i_img *img = i_img_double_new(width, height, channels);
+ i_img *img = i_img_16_new(width, height, channels);
+ i_img_destroy(img)
+
+ # Image Implementation
+
+ # Image Information
+ // only channel 0 writeable
+ i_img_setmask(img, 0x01);
+ int mask = i_img_getmask(img);
+ int channels = i_img_getchannels(img);
+ i_img_dim width = i_img_get_width(im);
+ i_img_dim height = i_img_get_height(im);
+
+ # Image quantization
+
+ # Logging
+
+ # Paletted images
+
+ # Tags
+ i_tags_set(&img->tags, "i_comment", -1);
+ i_tags_setn(&img->tags, "i_xres", 204);
+ i_tags_setn(&img->tags, "i_yres", 196);
+
+=head1 DESCRIPTION
+
+=head2 Data Types
+
+=over
+
+=item i_img
+
+This is Imager's image type.
+
+It contains the following members:
+
+=over
+
+=item *
+
+channels - the number of channels in the image
+
+=item *
+
+xsize, ysize - the width and height of the image in pixels
+
+=item *
+
+bytes - the number of bytes used to store the image data. Undefined
+where virtual is non-zero.
+
+=item *
+
+ch_mask - a mask of writable channels. eg. if this is 6 then only
+channels 1 and 2 are writable. There may be bits set for which there
+are no channels in the image.
+
+=item *
+
+bits - the number of bits stored per sample. Should be one of
+i_8_bits, i_16_bits, i_double_bits.
+
+=item *
+
+type - either i_direct_type for direct color images, or i_palette_type
+for paletted images.
+
+=item *
+
+virtual - if zero then this image is-self contained. If non-zero then
+this image could be an interface to some other implementation.
+
+=item *
+
+idata - the image data. This should not be directly accessed. A new
+image implementation can use this to store its image data.
+i_img_destroy() will myfree() this pointer if it's non-null.
+
+=item *
+
+tags - a structure storing the image's tags. This should only be
+accessed via the i_tags_*() functions.
+
+=item *
+
+ext_data - a pointer for use internal to an image implementation.
+This should be freed by the image's destroy handler.
+
+=item *
+
+im_data - data internal to Imager. This is initialized by
+i_img_init().
+
+=item *
+
+i_f_ppix, i_f_ppixf, i_f_plin, i_f_plinf, i_f_gpix, i_f_gpixf,
+i_f_glin, i_f_glinf, i_f_gsamp, i_f_gampf - implementations for each
+of the required image functions. An image implementation should
+initialize these between calling i_img_alloc() and i_img_init().
+
+=item *
+
+i_f_gpal, i_f_ppal, i_f_addcolors, i_f_getcolors, i_f_colorcount,
+i_f_maxcolors, i_f_findcolor, i_f_setcolors - implementations for each
+paletted image function.
+
+=item *
+
+i_f_destroy - custom image destruction function. This should be used
+to release memory if necessary.
+
+=item *
+
+i_f_gsamp_bits - implements i_gsamp_bits() for this image.
+
+=item *
+
+i_f_psamp_bits - implements i_psamp_bits() for this image.
+
+=back
+
+
+=for comment
+From: File imdatatypes.h
+
+=item i_color
+
+Type for 8-bit/sample color.
+
+Samples as per;
+
+ i_color c;
+
+i_color is a union of:
+
+=over
+
+=item *
+
+gray - contains a single element gray_color, eg. c.gray.gray_color
+
+=item *
+
+rgb - contains three elements r, g, b, eg. c.rgb.r
+
+=item *
+
+rgba - contains four elements r, g, b, a, eg. c.rgba.a
+
+=item *
+
+cmyk - contains four elements c, m, y, k, eg. C<c.cmyk.y>. Note that
+Imager never uses CMYK colors except when reading/writing files.
+
+=item *
+
+channels - an array of four channels, eg C<c.channels[2]>.
+
+=back
+
+
+=for comment
+From: File imdatatypes.h
+
+=item i_fcolor
+
+This is the double/sample color type.
+
+Its layout exactly corresponds to i_color.
+
+
+=for comment
+From: File imdatatypes.h
+
+=item i_fill_t
+
+This is the "abstract" base type for Imager's fill types.
+
+Unless you're implementing a new fill type you'll typically treat this
+as an opaque type.
+
+
+=for comment
+From: File imdatatypes.h
+
+=item i_img_dim
+
+A signed integer type that represents an image dimension or ordinate.
+
+May be larger than int on some platforms.
+
+
+=for comment
+From: File imdatatypes.h
+
+
+=back
+
+=head2 Drawing
+
+=over
+
+=item i_arc(im, x, y, rad, d1, d2, color)
+
+
+Fills an arc centered at (x,y) with radius I<rad> covering the range
+of angles in degrees from d1 to d2, with the color.
+
+
+=for comment
+From: File draw.c
+
+=item i_arc_aa(im, x, y, rad, d1, d2, color)
+
+
+Antialias fills an arc centered at (x,y) with radius I<rad> covering
+the range of angles in degrees from d1 to d2, with the color.
+
+
+=for comment
+From: File draw.c
+
+=item i_arc_aa_cfill(im, x, y, rad, d1, d2, fill)
+
+
+Antialias fills an arc centered at (x,y) with radius I<rad> covering
+the range of angles in degrees from d1 to d2, with the fill object.
+
+
+=for comment
+From: File draw.c
+
+=item i_arc_cfill(im, x, y, rad, d1, d2, fill)
+
+
+Fills an arc centered at (x,y) with radius I<rad> covering the range
+of angles in degrees from d1 to d2, with the fill object.
+
+
+=for comment
+From: File draw.c
+
+=item i_box(im, x1, y1, x2, y2, color)
+
+
+Outlines the box from (x1,y1) to (x2,y2) inclusive with I<color>.
+
+
+=for comment
+From: File draw.c
+
+=item i_box_cfill(im, x1, y1, x2, y2, fill)
+
+
+Fills the box from (x1,y1) to (x2,y2) inclusive with fill.
+
+
+=for comment
+From: File draw.c
+
+=item i_box_filled(im, x1, y1, x2, y2, color)
+
+
+Fills the box from (x1,y1) to (x2,y2) inclusive with color.
+
+
+=for comment
+From: File draw.c
+
+=item i_circle_aa(im, x, y, rad, color)
+
+
+Antialias fills a circle centered at (x,y) for radius I<rad> with
+color.
+
+
+=for comment
+From: File draw.c
+
+=item i_flood_cfill(im, seedx, seedy, fill)
+
+
+Flood fills the 4-connected region starting from the point (seedx,
+seedy) with I<fill>.
+
+Returns false if (seedx, seedy) are outside the image.
+
+
+=for comment
+From: File draw.c
+
+=item i_flood_cfill_border(im, seedx, seedy, fill, border)
+
+
+Flood fills the 4-connected region starting from the point (seedx,
+seedy) with I<fill>, the fill stops when it reaches pixels of color
+I<border>.
+
+Returns false if (seedx, seedy) are outside the image.
+
+
+=for comment
+From: File draw.c
+
+=item i_flood_fill(im, seedx, seedy, color)
+
+
+Flood fills the 4-connected region starting from the point (seedx,
+seedy) with I<color>.
+
+Returns false if (seedx, seedy) are outside the image.
+
+
+=for comment
+From: File draw.c
+
+=item i_flood_fill_border(im, seedx, seedy, color, border)
+
+
+Flood fills the 4-connected region starting from the point (seedx,
+seedy) with I<color>, fill stops when the fill reaches a pixels with
+color I<border>.
+
+Returns false if (seedx, seedy) are outside the image.
+
+
+=for comment
+From: File draw.c
+
+=item i_glin(im, l, r, y, colors)
+
+
+Retrieves (r-l) pixels starting from (l,y) into I<colors>.
+
+Returns the number of pixels retrieved.
+
+
+=for comment
+From: File imext.c
+
+=item i_glinf(im, l, r, y, colors)
+
+
+Retrieves (r-l) pixels starting from (l,y) into I<colors> as floating
+point colors.
+
+Returns the number of pixels retrieved.
+
+
+=for comment
+From: File imext.c
+
+=item i_gpal(im, x, r, y, indexes)
+
+
+Reads palette indexes for the horizontal line (x, y) to (r-1, y) into
+indexes.
+
+Returns the number of indexes read.
+
+Always returns 0 for direct color images.
+
+
+=for comment
+From: File imext.c
+
+=item i_gpix(im, x, y, color)
+
+
+Retrieves the I<color> of the pixel (x,y).
+
+Returns 0 if the pixel was retrieved, or -1 if not.
+
+
+=for comment
+From: File imext.c
+
+=item i_gpixf(im, x, y, fcolor)
+
+
+Retrieves the color of the pixel (x,y) as a floating point color into
+I<fcolor>.
+
+Returns 0 if the pixel was retrieved, or -1 if not.
+
+
+=for comment
+From: File imext.c
+
+=item i_gsamp(im, l, r, y, samp, chans, chan_count)
+
+
+Reads sample values from im for the horizontal line (l, y) to (r-1,y)
+for the channels specified by chans, an array of int with chan_count
+elements.
+
+If chans is NULL then the first chan_count channels are retrieved for
+each pixel.
+
+Returns the number of samples read (which should be (r-l) *
+chan_count)
+
+
+=for comment
+From: File imext.c
+
+=item i_gsampf(im, l, r, y, samp, chans, chan_count)
+
+
+Reads floating point sample values from im for the horizontal line (l,
+y) to (r-1,y) for the channels specified by chans, an array of int
+with chan_count elements.
+
+If chans is NULL then the first chan_count channels are retrieved for
+each pixel.
+
+Returns the number of samples read (which should be (r-l) *
+chan_count)
+
+
+=for comment
+From: File imext.c
+
+=item i_line(im, x1, y1, x2, y2, val, endp)
+
+
+Draw a line to image using bresenhams linedrawing algorithm
+
+ im - image to draw to
+ x1 - starting x coordinate
+ y1 - starting x coordinate
+ x2 - starting x coordinate
+ y2 - starting x coordinate
+ val - color to write to image
+ endp - endpoint flag (boolean)
+
+
+=for comment
+From: File draw.c
+
+=item i_line_aa(im, x1, x2, y1, y2, color, endp)
+
+
+Antialias draws a line from (x1,y1) to (x2, y2) in color.
+
+The point (x2, y2) is drawn only if endp is set.
+
+
+=for comment
+From: File draw.c
+
+=item i_plin(im, l, r, y, colors)
+
+
+Sets (r-l) pixels starting from (l,y) using (r-l) values from
+I<colors>.
+
+Returns the number of pixels set.
+
+
+=for comment
+From: File imext.c
+
+=item i_plinf(im, l, r, fcolors)
+
+
+Sets (r-l) pixels starting from (l,y) using (r-l) floating point
+colors from I<colors>.
+
+Returns the number of pixels set.
+
+
+=for comment
+From: File imext.c
+
+=item i_ppal(im, x, r, y, indexes)
+
+
+Writes palette indexes for the horizontal line (x, y) to (r-1, y) from
+indexes.
+
+Returns the number of indexes written.
+
+Always returns 0 for direct color images.
+
+
+=for comment
+From: File imext.c
+
+=item i_ppix(im, x, y, color)
+
+
+Sets the pixel at (x,y) to I<color>.
+
+Returns 0 if the pixel was drawn, or -1 if not.
+
+Does no alpha blending, just copies the channels from the supplied
+color to the image.
+
+
+=for comment
+From: File imext.c
+
+=item i_ppixf(im, x, y, fcolor)
+
+
+Sets the pixel at (x,y) to the floating point color I<fcolor>.
+
+Returns 0 if the pixel was drawn, or -1 if not.
+
+Does no alpha blending, just copies the channels from the supplied
+color to the image.
+
+
+=for comment
+From: File imext.c
+
+
+=back
+
+=head2 Error handling
+
+=over
+
+=item i_clear_error()
+
+Clears the error stack.
+
+Called by any imager function before doing any other processing.
+
+
+=for comment
+From: File error.c
+
+=item i_push_error(int code, char const *msg)
+
+Called by an Imager function to push an error message onto the stack.
+
+No message is pushed if the stack is full (since this means someone
+forgot to call i_clear_error(), or that a function that doesn't do
+error handling is calling function that does.).
+
+
+=for comment
+From: File error.c
+
+=item i_push_errorf(int code, char const *fmt, ...)
+
+A version of i_push_error() that does printf() like formating.
+
+Does not support perl specific format codes.
+
+
+=for comment
+From: File error.c
+
+=item i_push_errorvf(int code, char const *fmt, va_list ap)
+
+
+Intended for use by higher level functions, takes a varargs pointer
+and a format to produce the finally pushed error message.
+
+Does not support perl specific format codes.
+
+
+=for comment
+From: File error.c
+
+
+=back
+
+=head2 Files
+
+=over
+
+=item i_get_image_file_limits(&width, &height, &bytes)
+
+
+Retrieves the file limits set by i_set_image_file_limits().
+
+
+=for comment
+From: File limits.c
+
+=item i_int_check_image_file_limits(width, height, channels, sample_size)
+
+
+Checks the size of a file in memory against the configured image file
+limits.
+
+This also range checks the values to those permitted by Imager and
+checks for overflows in calculating the size.
+
+Returns non-zero if the file is within limits.
+
+This function is intended to be called by image file read functions.
+
+
+=for comment
+From: File limits.c
+
+=item i_set_image_file_limits(width, height, bytes)
+
+
+Set limits on the sizes of images read by Imager.
+
+Setting a limit to 0 means that limit is ignored.
+
+Negative limits result in failure.
+
+Returns non-zero on success.
+
+
+=for comment
+From: File limits.c
+
+
+=back
+
+=head2 Fills
+
+=over
+
+=item i_new_fill_fount(xa, ya, xb, yb, type, repeat, combine, super_sample, ssample_param, count, segs)
+
+
+
+Creates a new general fill which fills with a fountain fill.
+
+
+=for comment
+From: File filters.im
+
+=item i_new_fill_hatch(fg, bg, combine, hatch, cust_hatch, dx, dy)
+
+
+Creates a new hatched fill with the fg color used for the 1 bits in
+the hatch and bg for the 0 bits. If combine is non-zero alpha values
+will be combined.
+
+If cust_hatch is non-NULL it should be a pointer to 8 bytes of the
+hash definition, with the high-bits to the left.
+
+If cust_hatch is NULL then one of the standard hatches is used.
+
+(dx, dy) are an offset into the hatch which can be used to unalign adjoining areas, or to align the origin of a hatch with the the side of a filled area.
+
+
+=for comment
+From: File fills.c
+
+=item i_new_fill_hatchf(fg, bg, combine, hatch, cust_hatch, dx, dy)
+
+
+Creates a new hatched fill with the fg color used for the 1 bits in
+the hatch and bg for the 0 bits. If combine is non-zero alpha values
+will be combined.
+
+If cust_hatch is non-NULL it should be a pointer to 8 bytes of the
+hash definition, with the high-bits to the left.
+
+If cust_hatch is NULL then one of the standard hatches is used.
+
+(dx, dy) are an offset into the hatch which can be used to unalign adjoining areas, or to align the origin of a hatch with the the side of a filled area.
+
+
+=for comment
+From: File fills.c
+
+=item i_new_fill_image(im, matrix, xoff, yoff, combine)
+
+
+Create an image based fill.
+
+matrix is an array of 9 doubles representing a transformation matrix.
+
+xoff and yoff are the offset into the image to start filling from.
+
+
+=for comment
+From: File fills.c
+
+=item i_new_fill_solid(color, combine)
+
+
+Create a solid fill based on an 8-bit color.
+
+If combine is non-zero then alpha values will be combined.
+
+
+=for comment
+From: File fills.c
+
+=item i_new_fill_solidf(color, combine)
+
+
+Create a solid fill based on a float color.
+
+If combine is non-zero then alpha values will be combined.
+
+
+=for comment
+From: File fills.c
+
+=item i_fill_destroy(fill)
+
+Call to destroy any fill object.
+
+
+=for comment
+From: File fills.c
+
+
+=back
+
+=head2 Image
+
+=over
+
+=item i_copy(src)
+
+
+Creates a new image that is a copy of src.
+
+Tags are not copied, only the image data.
+
+Returns: i_img *
+
+
+=for comment
+From: File image.c
+
+=item i_copyto(dest, src, x1, y1, x2, y2, tx, ty)
+
+
+Copies image data from the area (x1,y1)-[x2,y2] in the source image to
+a rectangle the same size with it's top-left corner at (tx,ty) in the
+destination image.
+
+If x1 > x2 or y1 > y2 then the corresponding co-ordinates are swapped.
+
+
+=for comment
+From: File paste.im
+
+=item i_copyto_trans(im, src, x1, y1, x2, y2, tx, ty, trans)
+
+
+(x1,y1) (x2,y2) specifies the region to copy (in the source coordinates)
+(tx,ty) specifies the upper left corner for the target image.
+pass NULL in trans for non transparent i_colors.
+
+
+=for comment
+From: File image.c
+
+=item i_img_info(im, info)
+
+
+Return image information
+
+ im - Image pointer
+ info - pointer to array to return data
+
+info is an array of 4 integers with the following values:
+
+ info[0] - width
+ info[1] - height
+ info[2] - channels
+ info[3] - channel mask
+
+
+=for comment
+From: File image.c
+
+=item i_rubthru(im, src, tx, ty, src_minx, src_miny, src_maxx, src_maxy )
+
+
+Takes the sub image I<src[src_minx, src_maxx)[src_miny, src_maxy)> and
+overlays it at (I<tx>,I<ty>) on the image object.
+
+The alpha channel of each pixel in I<src> is used to control how much
+the existing colour in I<im> is replaced, if it is 255 then the colour
+is completely replaced, if it is 0 then the original colour is left
+unmodified.
+
+
+=for comment
+From: File rubthru.im
+
+
+=back
+
+=head2 Image creation/destruction
+
+=over
+
+=item i_img_16_new(x, y, ch)
+
+
+Create a new 16-bit/sample image.
+
+Returns the image on success, or NULL on failure.
+
+
+=for comment
+From: File img16.c
+
+=item i_img_8_new(x, y, ch)
+
+
+
+Creates a new image object I<x> pixels wide, and I<y> pixels high with
+I<ch> channels.
+
+
+=for comment
+From: File image.c
+
+=item i_img_double_new(int x, int y, int ch)
+
+Creates a new double per sample image.
+
+
+=for comment
+From: File imgdouble.c
+
+=item i_img_pal_new(x, y, channels, maxpal)
+
+
+Creates a new paletted image of the supplied dimensions.
+
+I<maxpal> is the maximum palette size and should normally be 256.
+
+Returns a new image or NULL on failure.
+
+
+=for comment
+From: File palimg.c
+
+=item i_sametype(i_img *im, int xsize, int ysize)
+
+
+Returns an image of the same type (sample size, channels, paletted/direct).
+
+For paletted images the palette is copied from the source.
+
+
+=for comment
+From: File image.c
+
+=item i_sametype_chans(i_img *im, int xsize, int ysize, int channels)
+
+
+Returns an image of the same type (sample size).
+
+For paletted images the equivalent direct type is returned.
+
+
+=for comment
+From: File image.c
+
+=item i_img_destroy(img)
+
+Destroy an image object
+
+
+=for comment
+From: File image.c
+
+
+=back
+
+=head2 Image Implementation
+
+=over
+
+=item i_img_alloc()
+
+Allocates a new i_img structure.
+
+When implementing a new image type perform the following steps in your
+image object creation function:
+
+=over
+
+=item 1.
+
+allocate the image with i_img_alloc().
+
+=item 2.
+
+initialize any function pointers or other data as needed, you can
+overwrite the whole block if you need to.
+
+=item 3.
+
+initialize Imager's internal data by calling i_img_init() on the image
+object.
+
+=back
+
+
+=for comment
+From: File image.c
+
+=item i_img_init(img)
+
+Imager interal initialization of images.
+
+Currently this does very little, in the future it may be used to
+support threads, or color profiles.
+
+
+=for comment
+From: File image.c
+
+
+=back
+
+=head2 Image Information
+
+=over
+
+=item i_img_color_channels(im)
+
+
+The number of channels holding color information.
+
+
+=for comment
+From: File immacros.h
+
+=item i_img_get_height(im)
+
+Returns the height in pixels of the image.
+
+
+=for comment
+From: File image.c
+
+=item i_img_get_width(im)
+
+Returns the width in pixels of the image.
+
+
+=for comment
+From: File image.c
+
+=item i_img_getchannels(im)
+
+Get the number of channels in I<im>.
+
+
+=for comment
+From: File image.c
+
+=item i_img_getmask(im)
+
+Get the image channel mask for I<im>.
+
+
+=for comment
+From: File image.c
+
+=item i_img_has_alpha(im)
+
+
+Return true if the image has an alpha channel.
+
+
+=for comment
+From: File immacros.h
+
+=item i_img_setmask(im, ch_mask)
+
+Set the image channel mask for I<im> to I<ch_mask>.
+
+The image channel mask gives some control over which channels can be
+written to in the image.
+
+
+=for comment
+From: File image.c
+
+
+=back
+
+=head2 Image quantization
+
+=over
+
+=item i_quant_makemap(quant, imgs, count)
+
+
+Analyzes the I<count> images in I<imgs> according to the rules in
+I<quant> to build a color map (optimal or not depending on
+quant->make_colors).
+
+
+=for comment
+From: File quant.c
+
+=item i_quant_translate(quant, img)
+
+
+Quantize the image given the palette in quant.
+
+On success returns a pointer to a memory block of img->xsize *
+img->ysize i_palidx entries.
+
+On failure returns NULL.
+
+You should call myfree() on the returned block when you're done with
+it.
+
+This function will fail if the supplied palette contains no colors.
+
+
+=for comment
+From: File quant.c
+
+=item i_quant_transparent(quant, data, img, trans_index)
+
+
+Dither the alpha channel on I<img> into the palette indexes in
+I<data>. Pixels to be transparent are replaced with I<trans_pixel>.
+
+The method used depends on the tr_* members of quant.
+
+
+=for comment
+From: File quant.c
+
+
+=back
+
+=head2 Logging
+
+=over
+
+=item i_lhead(file, line)
+
+This is an internal function called by the mm_log() macro.
+
+
+=for comment
+From: File log.c
+
+=item i_loog(level, format, ...)
+
+This is an internal function called by the mm_log() macro.
+
+
+=for comment
+From: File log.c
+
+=item mm_log((level, format, ...))
+
+This is the main entry point to logging. Note that the extra set of
+parentheses are required due to limitations in C89 macros.
+
+This will format a string with the current file and line number to the
+log file if logging is enabled.
+
+
+=for comment
+From: File log.h
+
+
+=back
+
+=head2 Paletted images
+
+=over
+
+=item i_addcolors(im, colors, count)
+
+
+Adds colors to the image's palette.
+
+On success returns the index of the lowest color added.
+
+On failure returns -1.
+
+Always fails for direct color images.
+
+
+=for comment
+From: File imext.c
+
+=item i_colorcount(im)
+
+
+Returns the number of colors in the image's palette.
+
+Returns -1 for direct images.
+
+
+=for comment
+From: File imext.c
+
+=item i_findcolor(im, color, &entry)
+
+
+Searches the images palette for the given color.
+
+On success sets *I<entry> to the index of the color, and returns true.
+
+On failure returns false.
+
+Always fails on direct color images.
+
+
+=for comment
+From: File imext.c
+
+=item i_getcolors(im, index, colors, count)
+
+
+Retrieves I<count> colors starting from I<index> in the image's
+palette.
+
+On success stores the colors into I<colors> and returns true.
+
+On failure returns false.
+
+Always fails for direct color images.
+
+Fails if there are less than I<index>+I<count> colors in the image's
+palette.
+
+
+=for comment
+From: File imext.c
+
+=item i_maxcolors(im)
+
+
+Returns the maximum number of colors the palette can hold for the
+image.
+
+Returns -1 for direct color images.
+
+
+=for comment
+From: File imext.c
+
+=item i_setcolors(im, index, colors, count)
+
+
+Sets I<count> colors starting from I<index> in the image's palette.
+
+On sucess returns true.
+
+On failure returns false.
+
+The image must have at least I<index>+I<count> colors in it's palette
+for this to succeed.
+
+Always fails on direct color images.
+
+
+=for comment
+From: File imext.c
+
+
+=back
+
+=head2 Tags
+
+=over
+
+=item i_tags_delbycode(tags, code)
+
+
+Delete any tags with the given code.
+
+Returns the number of tags deleted.
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_delbyname(tags, name)
+
+
+Delete any tags with the given name.
+
+Returns the number of tags deleted.
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_delete(tags, index)
+
+
+Delete a tag by index.
+
+Returns true on success.
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_destroy(tags)
+
+
+Destroys the given tags structure. Called by i_img_destroy().
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_find(tags, name, start, &entry)
+
+
+Searchs for a tag of the given I<name> starting from index I<start>.
+
+On success returns true and sets *I<entry>.
+
+On failure returns false.
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_findn(tags, code, start, &entry)
+
+
+Searchs for a tag of the given I<code> starting from index I<start>.
+
+On success returns true and sets *I<entry>.
+
+On failure returns false.
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_get_color(tags, name, code, &value)
+
+
+Retrieve a tag specified by name or code as color.
+
+On success sets the i_color *I<value> to the color and returns true.
+
+On failure returns false.
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_get_float(tags, name, code, value)
+
+
+Retrieves a tag as a floating point value.
+
+If the tag has a string value then that is parsed as a floating point
+number, otherwise the integer value of the tag is used.
+
+On success sets *I<value> and returns true.
+
+On failure returns false.
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_get_int(tags, name, code, &value)
+
+
+Retrieve a tag specified by name or code as an integer.
+
+On success sets the int *I<value> to the integer and returns true.
+
+On failure returns false.
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_get_string(tags, name, code, value, value_size)
+
+
+Retrieves a tag by name or code as a string.
+
+On success copies the string to value for a max of value_size and
+returns true.
+
+On failure returns false.
+
+value_size must be at least large enough for a string representation
+of an integer.
+
+The copied value is always NUL terminated.
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_new(i_img_tags *tags)
+
+
+Initialize a tags structure. Should not be used if the tags structure
+has been previously used.
+
+This should be called tags member of an i_img object on creation (in
+i_img_*_new() functions).
+
+To destroy the contents use i_tags_destroy()
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_set(tags, name, data, size)
+
+Sets the given tag to the string I<data>
+
+If size is -1 then the strlen(I<data>) bytes are stored.
+
+Even on failure, if an existing tag I<name> exists, it will be
+removed.
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_set_color(tags, name, code, &value)
+
+
+Stores the given color as a tag with the given name and code.
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_set_float(tags, name, code, value)
+
+
+Equivalent to i_tags_set_float2(tags, name, code, value, 30).
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_set_float2(tags, name, code, value, places)
+
+
+Sets the tag with the given name and code to the given floating point
+value.
+
+Since tags are strings or ints, we convert the value to a string before
+storage at the precision specified by C<places>.
+
+
+=for comment
+From: File tags.c
+
+=item i_tags_setn(tags, name, idata)
+
+Sets the given tag to the integer I<idata>
+
+Even on failure, if an existing tag I<name> exists, it will be
+removed.
+
+
+=for comment
+From: File tags.c
+
+
+=back
+
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=head1 SEE ALSO
+
+Imager, Imager::ExtUtils, Imager::Inline
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Color.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Color.pm
new file mode 100755
index 00000000000..b22f29fba30
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Color.pm
@@ -0,0 +1,605 @@
+package Imager::Color;
+
+use Imager;
+use strict;
+use vars qw($VERSION);
+
+$VERSION = "1.010";
+
+# It's just a front end to the XS creation functions.
+
+# used in converting hsv to rgb
+my @hsv_map =
+ (
+ 'vkm', 'nvm', 'mvk', 'mnv', 'kmv', 'vmn'
+ );
+
+sub _hsv_to_rgb {
+ my ($hue, $sat, $val) = @_;
+
+ # HSV conversions from pages 401-403 "Procedural Elements for Computer
+ # Graphics", 1985, ISBN 0-07-053534-5.
+
+ my @result;
+ if ($sat <= 0) {
+ return ( 255 * $val, 255 * $val, 255 * $val );
+ }
+ else {
+ $val >= 0 or $val = 0;
+ $val <= 1 or $val = 1;
+ $sat <= 1 or $sat = 1;
+ $hue >= 360 and $hue %= 360;
+ $hue < 0 and $hue += 360;
+ $hue /= 60.0;
+ my $i = int($hue);
+ my $f = $hue - $i;
+ $val *= 255;
+ my $m = $val * (1.0 - $sat);
+ my $n = $val * (1.0 - $sat * $f);
+ my $k = $val * (1.0 - $sat * (1 - $f));
+ my $v = $val;
+ my %fields = ( 'm'=>$m, 'n'=>$n, 'v'=>$v, 'k'=>$k, );
+ return @fields{split //, $hsv_map[$i]};
+ }
+}
+
+# cache of loaded gimp files
+# each key is a filename, under each key is a hashref with the following
+# keys:
+# mod_time => last mod_time of file
+# colors => hashref name to arrayref of colors
+my %gimp_cache;
+
+# palette search locations
+# this is pretty rude
+# $HOME is replaced at runtime
+my @gimp_search =
+ (
+ '$HOME/.gimp-1.2/palettes/Named_Colors',
+ '$HOME/.gimp-1.1/palettes/Named_Colors',
+ '$HOME/.gimp/palettes/Named_Colors',
+ '/usr/share/gimp/1.2/palettes/Named_Colors',
+ '/usr/share/gimp/1.1/palettes/Named_Colors',
+ '/usr/share/gimp/palettes/Named_Colors',
+ );
+
+sub _load_gimp_palette {
+ my ($filename) = @_;
+
+ if (open PAL, "< $filename") {
+ my $hdr = <PAL>;
+ chomp $hdr;
+ unless ($hdr =~ /GIMP Palette/) {
+ close PAL;
+ $Imager::ERRSTR = "$filename is not a GIMP palette file";
+ return;
+ }
+ my $line;
+ my %pal;
+ my $mod_time = (stat PAL)[9];
+ while (defined($line = <PAL>)) {
+ next if $line =~ /^#/ || $line =~ /^\s*$/;
+ chomp $line;
+ my ($r,$g, $b, $name) = split ' ', $line, 4;
+ if ($name) {
+ $name =~ s/\s*\([\d\s]+\)\s*$//;
+ $pal{lc $name} = [ $r, $g, $b ];
+ }
+ }
+ close PAL;
+
+ $gimp_cache{$filename} = { mod_time=>$mod_time, colors=>\%pal };
+
+ return 1;
+ }
+ else {
+ $Imager::ERRSTR = "Cannot open palette file $filename: $!";
+ return;
+ }
+}
+
+sub _get_gimp_color {
+ my %args = @_;
+
+ my $filename;
+ if ($args{palette}) {
+ $filename = $args{palette};
+ }
+ else {
+ # try to make one up - this is intended to die if tainting is
+ # enabled and $ENV{HOME} is tainted. To avoid that untaint $ENV{HOME}
+ # or set the palette parameter
+ for my $attempt (@gimp_search) {
+ my $work = $attempt; # don't modify the source array
+ $work =~ /\$HOME/ && !defined $ENV{HOME}
+ and next;
+ $work =~ s/\$HOME/$ENV{HOME}/;
+ if (-e $work) {
+ $filename = $work;
+ last;
+ }
+ }
+ if (!$filename) {
+ $Imager::ERRSTR = "No GIMP palette found";
+ return ();
+ }
+ }
+
+ if ((!$gimp_cache{$filename}
+ || (stat $filename)[9] != $gimp_cache{$filename})
+ && !_load_gimp_palette($filename)) {
+ return ();
+ }
+
+ if (!$gimp_cache{$filename}{colors}{lc $args{name}}) {
+ $Imager::ERRSTR = "Color '$args{name}' isn't in $filename";
+ return ();
+ }
+
+ return @{$gimp_cache{$filename}{colors}{lc $args{name}}};
+}
+
+my @x_search =
+ (
+ '/usr/share/X11/rgb.txt', # newer Xorg X11 dists use this
+ '/usr/lib/X11/rgb.txt', # seems fairly standard
+ '/usr/local/lib/X11/rgb.txt', # seems possible
+ '/usr/X11R6/lib/X11/rgb.txt', # probably the same as the first
+ '/usr/openwin/lib/rgb.txt',
+ '/usr/openwin/lib/X11/rgb.txt',
+ );
+
+# called by the test code to check if we can test this stuff
+sub _test_x_palettes {
+ @x_search;
+}
+
+# x rgb.txt cache
+# same structure as %gimp_cache
+my %x_cache;
+
+sub _load_x_rgb {
+ my ($filename) = @_;
+
+ local *RGB;
+ if (open RGB, "< $filename") {
+ my $line;
+ my %pal;
+ my $mod_time = (stat RGB)[9];
+ while (defined($line = <RGB>)) {
+ # the version of rgb.txt supplied with GNU Emacs uses # for comments
+ next if $line =~ /^[!#]/ || $line =~ /^\s*$/;
+ chomp $line;
+ my ($r,$g, $b, $name) = split ' ', $line, 4;
+ if ($name) {
+ $pal{lc $name} = [ $r, $g, $b ];
+ }
+ }
+ close RGB;
+
+ $x_cache{$filename} = { mod_time=>$mod_time, colors=>\%pal };
+
+ return 1;
+ }
+ else {
+ $Imager::ERRSTR = "Cannot open palette file $filename: $!";
+ return;
+ }
+}
+
+sub _get_x_color {
+ my %args = @_;
+
+ my $filename;
+ if ($args{palette}) {
+ $filename = $args{palette};
+ }
+ else {
+ for my $attempt (@x_search) {
+ if (-e $attempt) {
+ $filename = $attempt;
+ last;
+ }
+ }
+ if (!$filename) {
+ $Imager::ERRSTR = "No X rgb.txt palette found";
+ return ();
+ }
+ }
+
+ if ((!$x_cache{$filename}
+ || (stat $filename)[9] != $x_cache{$filename})
+ && !_load_x_rgb($filename)) {
+ return ();
+ }
+
+ if (!$x_cache{$filename}{colors}{lc $args{name}}) {
+ $Imager::ERRSTR = "Color '$args{name}' isn't in $filename";
+ return ();
+ }
+
+ return @{$x_cache{$filename}{colors}{lc $args{name}}};
+}
+
+# Parse color spec into an a set of 4 colors
+
+sub _pspec {
+ return (@_,255) if @_ == 3 && !grep /[^\d.+eE-]/, @_;
+ return (@_ ) if @_ == 4 && !grep /[^\d.+eE-]/, @_;
+ if ($_[0] =~
+ /^\#?([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])/i) {
+ return (hex($1),hex($2),hex($3),hex($4));
+ }
+ if ($_[0] =~ /^\#?([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])/i) {
+ return (hex($1),hex($2),hex($3),255);
+ }
+ if ($_[0] =~ /^\#([\da-f])([\da-f])([\da-f])$/i) {
+ return (hex($1) * 17, hex($2) * 17, hex($3) * 17, 255);
+ }
+ my %args;
+ if (@_ == 1) {
+ # a named color
+ %args = ( name => @_ );
+ }
+ else {
+ %args = @_;
+ }
+ my @result;
+ if (exists $args{gray}) {
+ @result = $args{gray};
+ }
+ elsif (exists $args{grey}) {
+ @result = $args{grey};
+ }
+ elsif ((exists $args{red} || exists $args{r})
+ && (exists $args{green} || exists $args{g})
+ && (exists $args{blue} || exists $args{b})) {
+ @result = ( exists $args{red} ? $args{red} : $args{r},
+ exists $args{green} ? $args{green} : $args{g},
+ exists $args{blue} ? $args{blue} : $args{b} );
+ }
+ elsif ((exists $args{hue} || exists $args{h})
+ && (exists $args{saturation} || exists $args{'s'})
+ && (exists $args{value} || exists $args{v})) {
+ my $hue = exists $args{hue} ? $args{hue} : $args{h};
+ my $sat = exists $args{saturation} ? $args{saturation} : $args{'s'};
+ my $val = exists $args{value} ? $args{value} : $args{v};
+
+ @result = _hsv_to_rgb($hue, $sat, $val);
+ }
+ elsif (exists $args{web}) {
+ if ($args{web} =~ /^#?([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])$/i) {
+ @result = (hex($1),hex($2),hex($3));
+ }
+ elsif ($args{web} =~ /^#?([\da-f])([\da-f])([\da-f])$/i) {
+ @result = (hex($1) * 17, hex($2) * 17, hex($3) * 17);
+ }
+ }
+ elsif ($args{name}) {
+ unless (@result = _get_gimp_color(%args)) {
+ unless (@result = _get_x_color(%args)) {
+ require Imager::Color::Table;
+ unless (@result = Imager::Color::Table->get($args{name})) {
+ $Imager::ERRSTR = "No color named $args{name} found";
+ return ();
+ }
+ }
+ }
+ }
+ elsif ($args{gimp}) {
+ @result = _get_gimp_color(name=>$args{gimp}, %args);
+ }
+ elsif ($args{xname}) {
+ @result = _get_x_color(name=>$args{xname}, %args);
+ }
+ elsif ($args{builtin}) {
+ require Imager::Color::Table;
+ @result = Imager::Color::Table->get($args{builtin});
+ }
+ elsif ($args{rgb}) {
+ @result = @{$args{rgb}};
+ }
+ elsif ($args{rgba}) {
+ @result = @{$args{rgba}};
+ return @result if @result == 4;
+ }
+ elsif ($args{hsv}) {
+ @result = _hsv_to_rgb(@{$args{hsv}});
+ }
+ elsif ($args{channels}) {
+ return @{$args{channels}};
+ }
+ elsif (exists $args{channel0} || $args{c0}) {
+ my $i = 0;
+ while (exists $args{"channel$i"} || exists $args{"c$i"}) {
+ push(@result,
+ exists $args{"channel$i"} ? $args{"channel$i"} : $args{"c$i"});
+ ++$i;
+ }
+ }
+ else {
+ $Imager::ERRSTR = "No color specification found";
+ return ();
+ }
+ if (@result) {
+ if (exists $args{alpha} || exists $args{a}) {
+ push(@result, exists $args{alpha} ? $args{alpha} : $args{a});
+ }
+ while (@result < 4) {
+ push(@result, 255);
+ }
+ return @result;
+ }
+ return ();
+}
+
+sub new {
+ shift; # get rid of class name.
+ my @arg = _pspec(@_);
+ return @arg ? new_internal($arg[0],$arg[1],$arg[2],$arg[3]) : ();
+}
+
+sub set {
+ my $self = shift;
+ my @arg = _pspec(@_);
+ return @arg ? set_internal($self, $arg[0],$arg[1],$arg[2],$arg[3]) : ();
+}
+
+sub equals {
+ my ($self, %opts) = @_;
+
+ my $other = $opts{other}
+ or return Imager->_set_error("'other' parameter required");
+ my $ignore_alpha = $opts{ignore_alpha} || 0;
+
+ my @left = $self->rgba;
+ my @right = $other->rgba;
+ my $last_chan = $ignore_alpha ? 2 : 3;
+ for my $ch (0 .. $last_chan) {
+ $left[$ch] == $right[$ch]
+ or return;
+ }
+
+ return 1;
+}
+
+sub CLONE_SKIP { 1 }
+
+1;
+
+__END__
+
+=head1 NAME
+
+Imager::Color - Color handling for Imager.
+
+=head1 SYNOPSIS
+
+ use Imager;
+
+ $color = Imager::Color->new($red, $green, $blue);
+ $color = Imager::Color->new($red, $green, $blue, $alpha);
+ $color = Imager::Color->new("#C0C0FF"); # html color specification
+
+ $color->set($red, $green, $blue);
+ $color->set($red, $green, $blue, $alpha);
+ $color->set("#C0C0FF"); # html color specification
+
+ ($red, $green, $blue, $alpha) = $color->rgba();
+ @hsv = $color->hsv(); # not implemented but proposed
+
+ $color->info();
+
+ if ($color->equals(other=>$other_color)) {
+ ...
+ }
+
+
+=head1 DESCRIPTION
+
+This module handles creating color objects used by imager. The idea is
+that in the future this module will be able to handle colorspace calculations
+as well.
+
+An Imager color consists of up to four components, each in the range 0
+to 255. Unfortunately the meaning of the components can change
+depending on the type of image you're dealing with:
+
+=over
+
+=item *
+
+for 3 or 4 channel images the color components are red, green, blue,
+alpha.
+
+=item *
+
+for 1 or 2 channel images the color components are gray, alpha, with
+the other two components ignored.
+
+=back
+
+An alpha value of zero is fully transparent, an alpha value of 255 is
+fully opaque.
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+This creates a color object to pass to functions that need a color argument.
+
+=item set
+
+This changes an already defined color. Note that this does not affect any places
+where the color has been used previously.
+
+=item rgba
+
+This returns the rgba code of the color the object contains.
+
+=item info
+
+Calling info merely dumps the relevant colorcode to the log.
+
+=item equals(other=>$other_color)
+
+=item equals(other=>$other_color, ignore_alpha=>1)
+
+Compares $self and color $other_color returning true if the color
+components are the same.
+
+Compares all four channels unless C<ignore_alpha> is set. If
+C<ignore_alpha> is set only the first three channels are compared.
+
+=back
+
+You can specify colors in several different ways, you can just supply
+simple values:
+
+=over
+
+=item *
+
+simple numeric parameters - if you supply 3 or 4 numeric arguments, you get a color made up of those RGB (and possibly A) components.
+
+=item *
+
+a six hex digit web color, either 'RRGGBB' or '#RRGGBB'
+
+=item *
+
+an eight hex digit web color, either 'RRGGBBAA' or '#RRGGBBAA'.
+
+=item *
+
+a 3 hex digit web color, '#RGB' - a value of F becomes 255.
+
+=item *
+
+a color name, from whichever of the gimp Named_Colors file or X
+rgb.txt is found first. The same as using the name keyword.
+
+=back
+
+You can supply named parameters:
+
+=over
+
+=item *
+
+'red', 'green' and 'blue', optionally shortened to 'r', 'g' and 'b'.
+The color components in the range 0 to 255.
+
+ # all of the following are equivalent
+ my $c1 = Imager::Color->new(red=>100, blue=>255, green=>0);
+ my $c2 = Imager::Color->new(r=>100, b=>255, g=>0);
+ my $c3 = Imager::Color->new(r=>100, blue=>255, g=>0);
+
+=item *
+
+'hue', 'saturation' and 'value', optionally shortened to 'h', 's' and
+'v', to specify a HSV color. 0 <= hue < 360, 0 <= s <= 1 and 0 <= v
+<= 1.
+
+ # the same as RGB(127,255,127)
+ my $c1 = Imager::Color->new(hue=>120, v=>1, s=>0.5);
+ my $c1 = Imager::Color->new(hue=>120, value=>1, saturation=>0.5);
+
+=item *
+
+'web', which can specify a 6 or 3 hex digit web color, in any of the
+forms '#RRGGBB', '#RGB', 'RRGGBB' or 'RGB'.
+
+ my $c1 = Imager::Color->new(web=>'#FFC0C0'); # pale red
+
+=item *
+
+'gray' or 'grey' which specifies a single channel, from 0 to 255.
+
+ # exactly the same
+ my $c1 = Imager::Color->new(gray=>128);
+ my $c1 = Imager::Color->new(grey=>128);
+
+=item *
+
+'rgb' which takes a 3 member arrayref, containing each of the red,
+green and blue values.
+
+ # the same
+ my $c1 = Imager::Color->new(rgb=>[255, 100, 0]);
+ my $c1 = Imager::Color->new(r=>255, g=>100, b=>0);
+
+=item *
+
+'hsv' which takes a 3 member arrayref, containting each of hue,
+saturation and value.
+
+ # the same
+ my $c1 = Imager::Color->new(hsv=>[120, 0.5, 1]);
+ my $c1 = Imager::Color->new(hue=>120, v=>1, s=>0.5);
+
+=item *
+
+'gimp' which specifies a color from a GIMP palette file. You can
+specify the filename of the palette file with the 'palette' parameter,
+or let Imager::Color look in various places, typically
+"$HOME/gimp-1.x/palettes/Named_Colors" with and without the version
+number, and in /usr/share/gimp/palettes/. The palette file must have
+color names.
+
+ my $c1 = Imager::Color->new(gimp=>'snow');
+ my $c1 = Imager::Color->new(gimp=>'snow', palette=>'testimg/test_gimp_pal);
+
+=item *
+
+'xname' which specifies a color from an X11 rgb.txt file. You can
+specify the filename of the rgb.txt file with the 'palette' parameter,
+or let Imager::Color look in various places, typically
+'/usr/lib/X11/rgb.txt'.
+
+ my $c1 = Imager::Color->new(xname=>'blue') # usually RGB(0, 0, 255)
+
+=item *
+
+'builtin' which specifies a color from the built-in color table in
+Imager::Color::Table. The colors in this module are the same as the
+default X11 rgb.txt file.
+
+ my $c1 = Imager::Color->new(builtin=>'black') # always RGB(0, 0, 0)
+
+=item *
+
+'name' which specifies a name from either a GIMP palette, an X rgb.txt
+file or the built-in color table, whichever is found first.
+
+=item *
+
+'channel0', 'channel1', etc, each of which specifies a single channel. These can be abbreviated to 'c0', 'c1' etc.
+
+=item *
+
+'channels' which takes an arrayref of the channel values.
+
+=back
+
+Optionally you can add an alpha channel to a color with the 'alpha' or
+'a' parameter.
+
+These color specifications can be used for both constructing new
+colors with the new() method and modifying existing colors with the
+set() method.
+
+=head1 AUTHOR
+
+Arnar M. Hrafnkelsson, addi@umich.edu
+And a great deal of help from others - see the README for a complete
+list.
+
+=head1 SEE ALSO
+
+Imager(3), Imager::Color
+http://imager.perl.org/
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Color/Float.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Color/Float.pm
new file mode 100755
index 00000000000..01d15bafd37
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Color/Float.pm
@@ -0,0 +1,128 @@
+package Imager::Color::Float;
+
+use Imager;
+use strict;
+use vars qw($VERSION);
+
+$VERSION = "1.004";
+
+# It's just a front end to the XS creation functions.
+
+
+# Parse color spec into an a set of 4 colors
+
+sub _pspec {
+ return (@_,1) if @_ == 3;
+ return (@_ ) if @_ == 4;
+ if ($_[0] =~
+ /^\#?([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])/i) {
+ return (hex($1)/255.99,hex($2)/255.99,hex($3)/255.99,hex($4)/255.99);
+ }
+ if ($_[0] =~ /^\#?([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])/i) {
+ return (hex($1)/255.99,hex($2)/255.99,hex($3)/255.99,1);
+ }
+ return ();
+}
+
+sub new {
+ shift; # get rid of class name.
+ my @arg = _pspec(@_);
+ return @arg ? new_internal($arg[0],$arg[1],$arg[2],$arg[3]) : ();
+}
+
+sub set {
+ my $self = shift;
+ my @arg = _pspec(@_);
+ return @arg ? set_internal($self, $arg[0],$arg[1],$arg[2],$arg[3]) : ();
+}
+
+sub CLONE_SKIP { 1 }
+
+1;
+
+__END__
+
+=head1 NAME
+
+Imager::Color::Float - Rough floating point sample colour handling
+
+=head1 SYNOPSIS
+
+ $color = Imager::Color->new($red, $green, $blue);
+ $color = Imager::Color->new($red, $green, $blue, $alpha);
+ $color = Imager::Color->new("#C0C0FF"); # html color specification
+
+ $color->set($red, $green, $blue);
+ $color->set($red, $green, $blue, $alpha);
+ $color->set("#C0C0FF"); # html color specification
+
+ ($red, $green, $blue, $alpha) = $color->rgba();
+ @hsv = $color->hsv(); # not implemented but proposed
+
+ $color->info();
+
+
+=head1 DESCRIPTION
+
+This module handles creating color objects used by imager. The idea is
+that in the future this module will be able to handle colorspace calculations
+as well.
+
+A floating point Imager color consists of up to four components, each
+in the range 0.0 to 1.0. Unfortunately the meaning of the components
+can change depending on the type of image you're dealing with:
+
+=over
+
+=item *
+
+for 3 or 4 channel images the color components are red, green, blue,
+alpha.
+
+=item *
+
+for 1 or 2 channel images the color components are gray, alpha, with
+the other two components ignored.
+
+=back
+
+An alpha value of zero is fully transparent, an alpha value of 1.0 is
+fully opaque.
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+This creates a color object to pass to functions that need a color argument.
+
+=item set
+
+This changes an already defined color. Note that this does not affect any places
+where the color has been used previously.
+
+=item rgba
+
+This returns the rgba code of the color the object contains.
+
+=item info
+
+Calling info merely dumps the relevant colorcode to the log.
+
+=back
+
+=head1 AUTHOR
+
+Arnar M. Hrafnkelsson, addi@umich.edu
+And a great deal of help from others - see the README for a complete
+list.
+
+=head1 SEE ALSO
+
+Imager(3), Imager::Color.
+
+http://imager.perl.org/
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Color/Table.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Color/Table.pm
new file mode 100755
index 00000000000..04ff2ede2d3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Color/Table.pm
@@ -0,0 +1,852 @@
+package Imager::Color::Table;
+use strict;
+use vars qw($VERSION);
+
+$VERSION = "1.002";
+
+ my %colors;
+
+{
+ local $_;
+ while (<DATA>) {
+ next if /^#/ or !/\S/;
+ chomp;
+ my ($r, $g, $b, $name) = split ' ', $_, 4;
+ if ($name) {
+ $colors{lc $name} = [ $r, $g, $b ];
+ }
+ }
+}
+
+sub get {
+ my ($class, $name) = @_;
+
+ exists $colors{lc $name} or return;
+
+ return @{$colors{lc $name}};
+}
+
+1;
+
+__DATA__
+# This color data was extracted from the freedesktop.org CVS tree, and
+# appears to be under the following license:
+#
+# Copyright (C) 2004 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+# X Window System is a trademark of X Consortium, Inc.
+
+255 250 250 snow
+248 248 255 ghost white
+248 248 255 GhostWhite
+245 245 245 white smoke
+245 245 245 WhiteSmoke
+220 220 220 gainsboro
+255 250 240 floral white
+255 250 240 FloralWhite
+253 245 230 old lace
+253 245 230 OldLace
+250 240 230 linen
+250 235 215 antique white
+250 235 215 AntiqueWhite
+255 239 213 papaya whip
+255 239 213 PapayaWhip
+255 235 205 blanched almond
+255 235 205 BlanchedAlmond
+255 228 196 bisque
+255 218 185 peach puff
+255 218 185 PeachPuff
+255 222 173 navajo white
+255 222 173 NavajoWhite
+255 228 181 moccasin
+255 248 220 cornsilk
+255 255 240 ivory
+255 250 205 lemon chiffon
+255 250 205 LemonChiffon
+255 245 238 seashell
+240 255 240 honeydew
+245 255 250 mint cream
+245 255 250 MintCream
+240 255 255 azure
+240 248 255 alice blue
+240 248 255 AliceBlue
+230 230 250 lavender
+255 240 245 lavender blush
+255 240 245 LavenderBlush
+255 228 225 misty rose
+255 228 225 MistyRose
+255 255 255 white
+ 0 0 0 black
+ 47 79 79 dark slate gray
+ 47 79 79 DarkSlateGray
+ 47 79 79 dark slate grey
+ 47 79 79 DarkSlateGrey
+105 105 105 dim gray
+105 105 105 DimGray
+105 105 105 dim grey
+105 105 105 DimGrey
+112 128 144 slate gray
+112 128 144 SlateGray
+112 128 144 slate grey
+112 128 144 SlateGrey
+119 136 153 light slate gray
+119 136 153 LightSlateGray
+119 136 153 light slate grey
+119 136 153 LightSlateGrey
+190 190 190 gray
+190 190 190 grey
+211 211 211 light grey
+211 211 211 LightGrey
+211 211 211 light gray
+211 211 211 LightGray
+ 25 25 112 midnight blue
+ 25 25 112 MidnightBlue
+ 0 0 128 navy
+ 0 0 128 navy blue
+ 0 0 128 NavyBlue
+100 149 237 cornflower blue
+100 149 237 CornflowerBlue
+ 72 61 139 dark slate blue
+ 72 61 139 DarkSlateBlue
+106 90 205 slate blue
+106 90 205 SlateBlue
+123 104 238 medium slate blue
+123 104 238 MediumSlateBlue
+132 112 255 light slate blue
+132 112 255 LightSlateBlue
+ 0 0 205 medium blue
+ 0 0 205 MediumBlue
+ 65 105 225 royal blue
+ 65 105 225 RoyalBlue
+ 0 0 255 blue
+ 30 144 255 dodger blue
+ 30 144 255 DodgerBlue
+ 0 191 255 deep sky blue
+ 0 191 255 DeepSkyBlue
+135 206 235 sky blue
+135 206 235 SkyBlue
+135 206 250 light sky blue
+135 206 250 LightSkyBlue
+ 70 130 180 steel blue
+ 70 130 180 SteelBlue
+176 196 222 light steel blue
+176 196 222 LightSteelBlue
+173 216 230 light blue
+173 216 230 LightBlue
+176 224 230 powder blue
+176 224 230 PowderBlue
+175 238 238 pale turquoise
+175 238 238 PaleTurquoise
+ 0 206 209 dark turquoise
+ 0 206 209 DarkTurquoise
+ 72 209 204 medium turquoise
+ 72 209 204 MediumTurquoise
+ 64 224 208 turquoise
+ 0 255 255 cyan
+224 255 255 light cyan
+224 255 255 LightCyan
+ 95 158 160 cadet blue
+ 95 158 160 CadetBlue
+102 205 170 medium aquamarine
+102 205 170 MediumAquamarine
+127 255 212 aquamarine
+ 0 100 0 dark green
+ 0 100 0 DarkGreen
+ 85 107 47 dark olive green
+ 85 107 47 DarkOliveGreen
+143 188 143 dark sea green
+143 188 143 DarkSeaGreen
+ 46 139 87 sea green
+ 46 139 87 SeaGreen
+ 60 179 113 medium sea green
+ 60 179 113 MediumSeaGreen
+ 32 178 170 light sea green
+ 32 178 170 LightSeaGreen
+152 251 152 pale green
+152 251 152 PaleGreen
+ 0 255 127 spring green
+ 0 255 127 SpringGreen
+124 252 0 lawn green
+124 252 0 LawnGreen
+ 0 255 0 green
+127 255 0 chartreuse
+ 0 250 154 medium spring green
+ 0 250 154 MediumSpringGreen
+173 255 47 green yellow
+173 255 47 GreenYellow
+ 50 205 50 lime green
+ 50 205 50 LimeGreen
+154 205 50 yellow green
+154 205 50 YellowGreen
+ 34 139 34 forest green
+ 34 139 34 ForestGreen
+107 142 35 olive drab
+107 142 35 OliveDrab
+189 183 107 dark khaki
+189 183 107 DarkKhaki
+240 230 140 khaki
+238 232 170 pale goldenrod
+238 232 170 PaleGoldenrod
+250 250 210 light goldenrod yellow
+250 250 210 LightGoldenrodYellow
+255 255 224 light yellow
+255 255 224 LightYellow
+255 255 0 yellow
+255 215 0 gold
+238 221 130 light goldenrod
+238 221 130 LightGoldenrod
+218 165 32 goldenrod
+184 134 11 dark goldenrod
+184 134 11 DarkGoldenrod
+188 143 143 rosy brown
+188 143 143 RosyBrown
+205 92 92 indian red
+205 92 92 IndianRed
+139 69 19 saddle brown
+139 69 19 SaddleBrown
+160 82 45 sienna
+205 133 63 peru
+222 184 135 burlywood
+245 245 220 beige
+245 222 179 wheat
+244 164 96 sandy brown
+244 164 96 SandyBrown
+210 180 140 tan
+210 105 30 chocolate
+178 34 34 firebrick
+165 42 42 brown
+233 150 122 dark salmon
+233 150 122 DarkSalmon
+250 128 114 salmon
+255 160 122 light salmon
+255 160 122 LightSalmon
+255 165 0 orange
+255 140 0 dark orange
+255 140 0 DarkOrange
+255 127 80 coral
+240 128 128 light coral
+240 128 128 LightCoral
+255 99 71 tomato
+255 69 0 orange red
+255 69 0 OrangeRed
+255 0 0 red
+255 105 180 hot pink
+255 105 180 HotPink
+255 20 147 deep pink
+255 20 147 DeepPink
+255 192 203 pink
+255 182 193 light pink
+255 182 193 LightPink
+219 112 147 pale violet red
+219 112 147 PaleVioletRed
+176 48 96 maroon
+199 21 133 medium violet red
+199 21 133 MediumVioletRed
+208 32 144 violet red
+208 32 144 VioletRed
+255 0 255 magenta
+238 130 238 violet
+221 160 221 plum
+218 112 214 orchid
+186 85 211 medium orchid
+186 85 211 MediumOrchid
+153 50 204 dark orchid
+153 50 204 DarkOrchid
+148 0 211 dark violet
+148 0 211 DarkViolet
+138 43 226 blue violet
+138 43 226 BlueViolet
+160 32 240 purple
+147 112 219 medium purple
+147 112 219 MediumPurple
+216 191 216 thistle
+255 250 250 snow1
+238 233 233 snow2
+205 201 201 snow3
+139 137 137 snow4
+255 245 238 seashell1
+238 229 222 seashell2
+205 197 191 seashell3
+139 134 130 seashell4
+255 239 219 AntiqueWhite1
+238 223 204 AntiqueWhite2
+205 192 176 AntiqueWhite3
+139 131 120 AntiqueWhite4
+255 228 196 bisque1
+238 213 183 bisque2
+205 183 158 bisque3
+139 125 107 bisque4
+255 218 185 PeachPuff1
+238 203 173 PeachPuff2
+205 175 149 PeachPuff3
+139 119 101 PeachPuff4
+255 222 173 NavajoWhite1
+238 207 161 NavajoWhite2
+205 179 139 NavajoWhite3
+139 121 94 NavajoWhite4
+255 250 205 LemonChiffon1
+238 233 191 LemonChiffon2
+205 201 165 LemonChiffon3
+139 137 112 LemonChiffon4
+255 248 220 cornsilk1
+238 232 205 cornsilk2
+205 200 177 cornsilk3
+139 136 120 cornsilk4
+255 255 240 ivory1
+238 238 224 ivory2
+205 205 193 ivory3
+139 139 131 ivory4
+240 255 240 honeydew1
+224 238 224 honeydew2
+193 205 193 honeydew3
+131 139 131 honeydew4
+255 240 245 LavenderBlush1
+238 224 229 LavenderBlush2
+205 193 197 LavenderBlush3
+139 131 134 LavenderBlush4
+255 228 225 MistyRose1
+238 213 210 MistyRose2
+205 183 181 MistyRose3
+139 125 123 MistyRose4
+240 255 255 azure1
+224 238 238 azure2
+193 205 205 azure3
+131 139 139 azure4
+131 111 255 SlateBlue1
+122 103 238 SlateBlue2
+105 89 205 SlateBlue3
+ 71 60 139 SlateBlue4
+ 72 118 255 RoyalBlue1
+ 67 110 238 RoyalBlue2
+ 58 95 205 RoyalBlue3
+ 39 64 139 RoyalBlue4
+ 0 0 255 blue1
+ 0 0 238 blue2
+ 0 0 205 blue3
+ 0 0 139 blue4
+ 30 144 255 DodgerBlue1
+ 28 134 238 DodgerBlue2
+ 24 116 205 DodgerBlue3
+ 16 78 139 DodgerBlue4
+ 99 184 255 SteelBlue1
+ 92 172 238 SteelBlue2
+ 79 148 205 SteelBlue3
+ 54 100 139 SteelBlue4
+ 0 191 255 DeepSkyBlue1
+ 0 178 238 DeepSkyBlue2
+ 0 154 205 DeepSkyBlue3
+ 0 104 139 DeepSkyBlue4
+135 206 255 SkyBlue1
+126 192 238 SkyBlue2
+108 166 205 SkyBlue3
+ 74 112 139 SkyBlue4
+176 226 255 LightSkyBlue1
+164 211 238 LightSkyBlue2
+141 182 205 LightSkyBlue3
+ 96 123 139 LightSkyBlue4
+198 226 255 SlateGray1
+185 211 238 SlateGray2
+159 182 205 SlateGray3
+108 123 139 SlateGray4
+202 225 255 LightSteelBlue1
+188 210 238 LightSteelBlue2
+162 181 205 LightSteelBlue3
+110 123 139 LightSteelBlue4
+191 239 255 LightBlue1
+178 223 238 LightBlue2
+154 192 205 LightBlue3
+104 131 139 LightBlue4
+224 255 255 LightCyan1
+209 238 238 LightCyan2
+180 205 205 LightCyan3
+122 139 139 LightCyan4
+187 255 255 PaleTurquoise1
+174 238 238 PaleTurquoise2
+150 205 205 PaleTurquoise3
+102 139 139 PaleTurquoise4
+152 245 255 CadetBlue1
+142 229 238 CadetBlue2
+122 197 205 CadetBlue3
+ 83 134 139 CadetBlue4
+ 0 245 255 turquoise1
+ 0 229 238 turquoise2
+ 0 197 205 turquoise3
+ 0 134 139 turquoise4
+ 0 255 255 cyan1
+ 0 238 238 cyan2
+ 0 205 205 cyan3
+ 0 139 139 cyan4
+151 255 255 DarkSlateGray1
+141 238 238 DarkSlateGray2
+121 205 205 DarkSlateGray3
+ 82 139 139 DarkSlateGray4
+127 255 212 aquamarine1
+118 238 198 aquamarine2
+102 205 170 aquamarine3
+ 69 139 116 aquamarine4
+193 255 193 DarkSeaGreen1
+180 238 180 DarkSeaGreen2
+155 205 155 DarkSeaGreen3
+105 139 105 DarkSeaGreen4
+ 84 255 159 SeaGreen1
+ 78 238 148 SeaGreen2
+ 67 205 128 SeaGreen3
+ 46 139 87 SeaGreen4
+154 255 154 PaleGreen1
+144 238 144 PaleGreen2
+124 205 124 PaleGreen3
+ 84 139 84 PaleGreen4
+ 0 255 127 SpringGreen1
+ 0 238 118 SpringGreen2
+ 0 205 102 SpringGreen3
+ 0 139 69 SpringGreen4
+ 0 255 0 green1
+ 0 238 0 green2
+ 0 205 0 green3
+ 0 139 0 green4
+127 255 0 chartreuse1
+118 238 0 chartreuse2
+102 205 0 chartreuse3
+ 69 139 0 chartreuse4
+192 255 62 OliveDrab1
+179 238 58 OliveDrab2
+154 205 50 OliveDrab3
+105 139 34 OliveDrab4
+202 255 112 DarkOliveGreen1
+188 238 104 DarkOliveGreen2
+162 205 90 DarkOliveGreen3
+110 139 61 DarkOliveGreen4
+255 246 143 khaki1
+238 230 133 khaki2
+205 198 115 khaki3
+139 134 78 khaki4
+255 236 139 LightGoldenrod1
+238 220 130 LightGoldenrod2
+205 190 112 LightGoldenrod3
+139 129 76 LightGoldenrod4
+255 255 224 LightYellow1
+238 238 209 LightYellow2
+205 205 180 LightYellow3
+139 139 122 LightYellow4
+255 255 0 yellow1
+238 238 0 yellow2
+205 205 0 yellow3
+139 139 0 yellow4
+255 215 0 gold1
+238 201 0 gold2
+205 173 0 gold3
+139 117 0 gold4
+255 193 37 goldenrod1
+238 180 34 goldenrod2
+205 155 29 goldenrod3
+139 105 20 goldenrod4
+255 185 15 DarkGoldenrod1
+238 173 14 DarkGoldenrod2
+205 149 12 DarkGoldenrod3
+139 101 8 DarkGoldenrod4
+255 193 193 RosyBrown1
+238 180 180 RosyBrown2
+205 155 155 RosyBrown3
+139 105 105 RosyBrown4
+255 106 106 IndianRed1
+238 99 99 IndianRed2
+205 85 85 IndianRed3
+139 58 58 IndianRed4
+255 130 71 sienna1
+238 121 66 sienna2
+205 104 57 sienna3
+139 71 38 sienna4
+255 211 155 burlywood1
+238 197 145 burlywood2
+205 170 125 burlywood3
+139 115 85 burlywood4
+255 231 186 wheat1
+238 216 174 wheat2
+205 186 150 wheat3
+139 126 102 wheat4
+255 165 79 tan1
+238 154 73 tan2
+205 133 63 tan3
+139 90 43 tan4
+255 127 36 chocolate1
+238 118 33 chocolate2
+205 102 29 chocolate3
+139 69 19 chocolate4
+255 48 48 firebrick1
+238 44 44 firebrick2
+205 38 38 firebrick3
+139 26 26 firebrick4
+255 64 64 brown1
+238 59 59 brown2
+205 51 51 brown3
+139 35 35 brown4
+255 140 105 salmon1
+238 130 98 salmon2
+205 112 84 salmon3
+139 76 57 salmon4
+255 160 122 LightSalmon1
+238 149 114 LightSalmon2
+205 129 98 LightSalmon3
+139 87 66 LightSalmon4
+255 165 0 orange1
+238 154 0 orange2
+205 133 0 orange3
+139 90 0 orange4
+255 127 0 DarkOrange1
+238 118 0 DarkOrange2
+205 102 0 DarkOrange3
+139 69 0 DarkOrange4
+255 114 86 coral1
+238 106 80 coral2
+205 91 69 coral3
+139 62 47 coral4
+255 99 71 tomato1
+238 92 66 tomato2
+205 79 57 tomato3
+139 54 38 tomato4
+255 69 0 OrangeRed1
+238 64 0 OrangeRed2
+205 55 0 OrangeRed3
+139 37 0 OrangeRed4
+255 0 0 red1
+238 0 0 red2
+205 0 0 red3
+139 0 0 red4
+255 20 147 DeepPink1
+238 18 137 DeepPink2
+205 16 118 DeepPink3
+139 10 80 DeepPink4
+255 110 180 HotPink1
+238 106 167 HotPink2
+205 96 144 HotPink3
+139 58 98 HotPink4
+255 181 197 pink1
+238 169 184 pink2
+205 145 158 pink3
+139 99 108 pink4
+255 174 185 LightPink1
+238 162 173 LightPink2
+205 140 149 LightPink3
+139 95 101 LightPink4
+255 130 171 PaleVioletRed1
+238 121 159 PaleVioletRed2
+205 104 137 PaleVioletRed3
+139 71 93 PaleVioletRed4
+255 52 179 maroon1
+238 48 167 maroon2
+205 41 144 maroon3
+139 28 98 maroon4
+255 62 150 VioletRed1
+238 58 140 VioletRed2
+205 50 120 VioletRed3
+139 34 82 VioletRed4
+255 0 255 magenta1
+238 0 238 magenta2
+205 0 205 magenta3
+139 0 139 magenta4
+255 131 250 orchid1
+238 122 233 orchid2
+205 105 201 orchid3
+139 71 137 orchid4
+255 187 255 plum1
+238 174 238 plum2
+205 150 205 plum3
+139 102 139 plum4
+224 102 255 MediumOrchid1
+209 95 238 MediumOrchid2
+180 82 205 MediumOrchid3
+122 55 139 MediumOrchid4
+191 62 255 DarkOrchid1
+178 58 238 DarkOrchid2
+154 50 205 DarkOrchid3
+104 34 139 DarkOrchid4
+155 48 255 purple1
+145 44 238 purple2
+125 38 205 purple3
+ 85 26 139 purple4
+171 130 255 MediumPurple1
+159 121 238 MediumPurple2
+137 104 205 MediumPurple3
+ 93 71 139 MediumPurple4
+255 225 255 thistle1
+238 210 238 thistle2
+205 181 205 thistle3
+139 123 139 thistle4
+ 0 0 0 gray0
+ 0 0 0 grey0
+ 3 3 3 gray1
+ 3 3 3 grey1
+ 5 5 5 gray2
+ 5 5 5 grey2
+ 8 8 8 gray3
+ 8 8 8 grey3
+ 10 10 10 gray4
+ 10 10 10 grey4
+ 13 13 13 gray5
+ 13 13 13 grey5
+ 15 15 15 gray6
+ 15 15 15 grey6
+ 18 18 18 gray7
+ 18 18 18 grey7
+ 20 20 20 gray8
+ 20 20 20 grey8
+ 23 23 23 gray9
+ 23 23 23 grey9
+ 26 26 26 gray10
+ 26 26 26 grey10
+ 28 28 28 gray11
+ 28 28 28 grey11
+ 31 31 31 gray12
+ 31 31 31 grey12
+ 33 33 33 gray13
+ 33 33 33 grey13
+ 36 36 36 gray14
+ 36 36 36 grey14
+ 38 38 38 gray15
+ 38 38 38 grey15
+ 41 41 41 gray16
+ 41 41 41 grey16
+ 43 43 43 gray17
+ 43 43 43 grey17
+ 46 46 46 gray18
+ 46 46 46 grey18
+ 48 48 48 gray19
+ 48 48 48 grey19
+ 51 51 51 gray20
+ 51 51 51 grey20
+ 54 54 54 gray21
+ 54 54 54 grey21
+ 56 56 56 gray22
+ 56 56 56 grey22
+ 59 59 59 gray23
+ 59 59 59 grey23
+ 61 61 61 gray24
+ 61 61 61 grey24
+ 64 64 64 gray25
+ 64 64 64 grey25
+ 66 66 66 gray26
+ 66 66 66 grey26
+ 69 69 69 gray27
+ 69 69 69 grey27
+ 71 71 71 gray28
+ 71 71 71 grey28
+ 74 74 74 gray29
+ 74 74 74 grey29
+ 77 77 77 gray30
+ 77 77 77 grey30
+ 79 79 79 gray31
+ 79 79 79 grey31
+ 82 82 82 gray32
+ 82 82 82 grey32
+ 84 84 84 gray33
+ 84 84 84 grey33
+ 87 87 87 gray34
+ 87 87 87 grey34
+ 89 89 89 gray35
+ 89 89 89 grey35
+ 92 92 92 gray36
+ 92 92 92 grey36
+ 94 94 94 gray37
+ 94 94 94 grey37
+ 97 97 97 gray38
+ 97 97 97 grey38
+ 99 99 99 gray39
+ 99 99 99 grey39
+102 102 102 gray40
+102 102 102 grey40
+105 105 105 gray41
+105 105 105 grey41
+107 107 107 gray42
+107 107 107 grey42
+110 110 110 gray43
+110 110 110 grey43
+112 112 112 gray44
+112 112 112 grey44
+115 115 115 gray45
+115 115 115 grey45
+117 117 117 gray46
+117 117 117 grey46
+120 120 120 gray47
+120 120 120 grey47
+122 122 122 gray48
+122 122 122 grey48
+125 125 125 gray49
+125 125 125 grey49
+127 127 127 gray50
+127 127 127 grey50
+130 130 130 gray51
+130 130 130 grey51
+133 133 133 gray52
+133 133 133 grey52
+135 135 135 gray53
+135 135 135 grey53
+138 138 138 gray54
+138 138 138 grey54
+140 140 140 gray55
+140 140 140 grey55
+143 143 143 gray56
+143 143 143 grey56
+145 145 145 gray57
+145 145 145 grey57
+148 148 148 gray58
+148 148 148 grey58
+150 150 150 gray59
+150 150 150 grey59
+153 153 153 gray60
+153 153 153 grey60
+156 156 156 gray61
+156 156 156 grey61
+158 158 158 gray62
+158 158 158 grey62
+161 161 161 gray63
+161 161 161 grey63
+163 163 163 gray64
+163 163 163 grey64
+166 166 166 gray65
+166 166 166 grey65
+168 168 168 gray66
+168 168 168 grey66
+171 171 171 gray67
+171 171 171 grey67
+173 173 173 gray68
+173 173 173 grey68
+176 176 176 gray69
+176 176 176 grey69
+179 179 179 gray70
+179 179 179 grey70
+181 181 181 gray71
+181 181 181 grey71
+184 184 184 gray72
+184 184 184 grey72
+186 186 186 gray73
+186 186 186 grey73
+189 189 189 gray74
+189 189 189 grey74
+191 191 191 gray75
+191 191 191 grey75
+194 194 194 gray76
+194 194 194 grey76
+196 196 196 gray77
+196 196 196 grey77
+199 199 199 gray78
+199 199 199 grey78
+201 201 201 gray79
+201 201 201 grey79
+204 204 204 gray80
+204 204 204 grey80
+207 207 207 gray81
+207 207 207 grey81
+209 209 209 gray82
+209 209 209 grey82
+212 212 212 gray83
+212 212 212 grey83
+214 214 214 gray84
+214 214 214 grey84
+217 217 217 gray85
+217 217 217 grey85
+219 219 219 gray86
+219 219 219 grey86
+222 222 222 gray87
+222 222 222 grey87
+224 224 224 gray88
+224 224 224 grey88
+227 227 227 gray89
+227 227 227 grey89
+229 229 229 gray90
+229 229 229 grey90
+232 232 232 gray91
+232 232 232 grey91
+235 235 235 gray92
+235 235 235 grey92
+237 237 237 gray93
+237 237 237 grey93
+240 240 240 gray94
+240 240 240 grey94
+242 242 242 gray95
+242 242 242 grey95
+245 245 245 gray96
+245 245 245 grey96
+247 247 247 gray97
+247 247 247 grey97
+250 250 250 gray98
+250 250 250 grey98
+252 252 252 gray99
+252 252 252 grey99
+255 255 255 gray100
+255 255 255 grey100
+169 169 169 dark grey
+169 169 169 DarkGrey
+169 169 169 dark gray
+169 169 169 DarkGray
+0 0 139 dark blue
+0 0 139 DarkBlue
+0 139 139 dark cyan
+0 139 139 DarkCyan
+139 0 139 dark magenta
+139 0 139 DarkMagenta
+139 0 0 dark red
+139 0 0 DarkRed
+144 238 144 light green
+144 238 144 LightGreen
+__END__
+
+=head1 NAME
+
+Imager::Color::Table - built-in Imager color table
+
+=head1 SYNOPSIS
+
+ use Imager::Color::Table;
+ my @rgb = Imager::Color::Table->get($name)
+ or die "Color $name not found";
+
+=head1 DESCRIPTION
+
+This class provides a base color table for use in resolving color names.
+
+The table contains the standard X11 rgb.txt colors.
+
+This table is not included as part of Imager::Color itself since it's
+moderately large.
+
+There is only one method:
+
+=over
+
+=item get
+
+ my @rgb = Imager::Color::Table->get('red')
+ or die "No red found";
+
+Retrieves a color from Imager::Color::Tables built-in color table.
+
+=back
+
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Cookbook.pod b/Master/tlpkg/tlperl.straw/lib/Imager/Cookbook.pod
new file mode 100755
index 00000000000..8d9cba4a273
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Cookbook.pod
@@ -0,0 +1,429 @@
+=head1 NAME
+
+Imager::Cookbook - recipes working with Imager
+
+=head1 DESCRIPTION
+
+Various simple and not so simple ways to do things with Imager.
+
+=head1 FILES
+
+This is described in detail in L<Imager::Files>.
+
+=head2 Reading an image from a file
+
+ my $image = Imager->new;
+
+ $image->read(file=>$filename) or die $image->errstr;
+
+See L<Imager::Files>.
+
+=head2 Writing an image to a file
+
+ $image->write(file=>$filename) or die $image->errstr;
+
+=head2 Write an animated gif.
+
+ # build an array of images to use in the gif
+ my @images;
+ # synthesize the images or read them from files, it doesn't matter
+ ...
+
+ # write the gif
+ Imager->write_multi({ file=>$filename, type=>'gif' }, @images)
+ or die Imager->errstr;
+
+See L<Imager::Files/"Writing an animated GIF"> for a more detailed
+example.
+
+=head2 Reading multiple images from one file
+
+Some formats, like GIF and TIFF support multiple images per file. Use
+the L<read_multi()|Imager::Files> method to read them:
+
+ my @images = Imager->read_multi(file=>$filename)
+ or die Imager->errstr;
+
+=head2 Converting from one file format to another
+
+This is as simple as reading the original file and writing the new
+file, for single images:
+
+ my $image = Imager->new;
+ # Imager auto-detects the input file type
+ $image->read(file => $input_filename)
+ or die $image->errstr;
+ # Imager derives the output file format from the filename
+ $image->write(file => $output_filename)
+ or die $image->errstr;
+
+ # or you can supply a type parameter:
+ $image->write(file => $output_filename, type => 'gif')
+ or die $image->errstr;
+
+The main issue that can occur with this is if the input file has
+transparency and the output file format doesn't support that. This
+can be a problem when converting from GIFs to JPEGs for example.
+
+To work around that you can compose the source image onto a background
+color:
+
+ if ($image->getchannels == 4 or $image->getchannels == 2) {
+ my $back = Imager->new(xsize => $image->getwidth,
+ ysize => $image->getheight);
+ # grey background for grayscale images, red for color
+ my $back_color = $image->getchannels == 2 ? [ 128 ] : 'red';
+ $back->box(filled => 1, color => $back_color);
+ $back->rubthrough(src => $image);
+ $image = $back;
+ }
+ # now we can write safely to jpeg or pnm
+
+Some formats support multiple files, so if you want to convert from
+say tiff to jpeg, you'll need multiple output files:
+
+ my @images = Imager->read_multi(file => 'input.tif')
+ or die Imager->errstr;
+ my $index = 1;
+ for my $image (@images) {
+ $image->write(file => sprintf('output%02d.jpg', $index++))
+ or die $image->errstr;
+ }
+
+=head1 IMAGE SYNTHESIS
+
+=head2 Creating an image
+
+To create a simple RGB image, supply the image width and height to the
+new() method:
+
+ my $rgb = Imager->new(xsize=>$width, ysize=>$height);
+
+If you also want an alpha channel:
+
+ my $rgb_alpha = Imager->new(xsize=>$width, ysize=>$height, channels=>4);
+
+To make a grayscale image:
+
+ my $gray = Imager->new(xsize=>$width, ysize=>$height, channels=>1);
+
+and a grayscale image with an alpha channel:
+
+ my $gray_alpha = Imager->new(xsize=>$width, ysize=>$height, channels=>2);
+
+When a new image is created this way all samples are set to zero -
+black for 1 or 3 channel images, transparent black for 2 or 4 channel
+images.
+
+You can also create paletted images and images with more than 8-bits
+per channel, see L<Imager::ImageTypes> for more details.
+
+=head2 Setting the background of a new image
+
+To set the background of a new image to a solid color, use the box()
+method with no limits, and C<< filled=>1 >>:
+
+ $image->box(filled=>1, color=>$color);
+
+As always, a color can be specified as an L<Imager::Color> object:
+
+ my $white = Imager::Color->new(255, 255, 255);
+ $image->box(filled=>1, color=>$white);
+
+or you supply any single scalar that Imager::Color's new() method
+accepts as a color description:
+
+ $image->box(filled=>1, color=>'white');
+ $image->box(filled=>1, color=>'#FF0000');
+ $image->box(filled=>1, color=>[ 255, 255, 255 ]);
+
+You can also fill the image with a fill object:
+
+ use Imager::Fill;
+ # create the fill object
+ my $fill = Imager::Fill->new(hatch=>'check1x1')
+ $image->box(fill=>$fill);
+
+ # let Imager create one automatically
+ $image->box(fill=>{ hatch=>'check1x1' });
+
+See L<Imager::Fill> for information on Imager's fill objects.
+
+=head1 WORLD WIDE WEB
+
+As with any CGI script it's up to you to validate data and set limits
+on any parameters supplied to Imager.
+
+For example, if you allow the caller to set the size of an output
+image you should limit the size to prevent the client from specifying
+an image size that will consume all available memory.
+
+This is beside any any other controls you need over access to data.
+
+See L<CGI> for a module useful for processing CGI submitted data.
+
+=head2 Returning an image from a CGI script
+
+This is similar to writing to a file, but you also need to supply the
+information needed by the web browser to identify the file format:
+
+ my $img = ....; # create the image and generate the contents
+ ++$|; # make sure the content type isn't buffered
+ print "Content-Type: image/png\n\n";
+ binmode STDOUT;
+ $img->write(fd=>fileno(STDOUT), type=>'png')
+ or die $img->errstr;
+
+You need to set the Content-Type header depending on the file format
+you send to the web browser.
+
+If you want to supply a content-length header, write the image to a
+scalar as a buffer:
+
+ my $img = ....; # create the image and generate the contents
+ my $data;
+ $img->write(type=>'png', data=>\$data)
+ or die $img->errstr;
+ print "Content-Type: image/png\n";
+ print "Content-Length: ",length($data),"\n\n";
+ binmode STDOUT;
+ print $data;
+
+See C<samples/samp-scale.cgi> and C<samples/samp-image.cgi> for a
+couple of simple examples of producing an image from CGI.
+
+=head2 Inserting a CGI image in a page
+
+There's occasionally confusion on how to display an image generated by
+Imager in a page generated by a CGI.
+
+Your web browser handles this process as two requests, one for the
+HTML page, and another for the image itself.
+
+Each request needs to perform validation since an attacker can control
+the values supplied to both requests.
+
+How you make the data available to the image generation code depends
+on your application.
+
+See C<samples/samp-form.cgi> and C<samples/samp-image.cgi> in the
+Imager distribution for one approach. The POD in C<samp-form.cgi>
+also discusses some of the issues involved.
+
+=head2 Parsing an image posted via CGI
+
+C<WARNING>: file format attacks have become a common attack vector,
+make sure you have up to date image file format libraries, otherwise
+trying to parse uploaded files, whether with Imager or some other
+tool, may result in a remote attacker being able to run their own code
+on your system.
+
+If your HTML form uses the correct magic, it can upload files to your
+CGI script, in particular, you need to use C< method="post" > and
+C<enctype="multipart/form-data"> in the C<form> tag, and use
+C<type="file"> in the C<input>, for example:
+
+ <form action="/cgi-bin/yourprogram" method="post"
+ enctype="multipart/form-data">
+ <input type="file" name="myimage" />
+ <input type="submit value="Upload Image" />
+ </form>
+
+To process the form:
+
+=over
+
+=item 1.
+
+first check that the user supplied a file
+
+=item 2.
+
+get the file handle
+
+=item 3.
+
+have Imager read the image
+
+=back
+
+ # returns the client's name for the file, don't open this locally
+ my $cgi = CGI->new;
+ # 1. check the user supplied a file
+ my $filename = $cgi->param('myimage');
+ if ($filename) {
+ # 2. get the file handle
+ my $fh = $cgi->upload('myimage');
+ if ($fh) {
+ binmode $fh;
+
+ # 3. have Imager read the image
+ my $img = Imager->new;
+ if ($img->read(fh=>$fh)) {
+ # we can now process the image
+ }
+ }
+ # else, you probably have an incorrect form or input tag
+ }
+ # else, the user didn't select a file
+
+See C<samples/samp-scale.cgi> and C<samples/samp-tags.cgi> in the
+Imager distribution for example code.
+
+You may also want to set limits on the size of the image read, using
+Imager's C<set_file_limits> method, documented in
+L<Imager::Files/set_file_limits>. For example:
+
+ # limit to 10 million bytes of memory usage
+ Imager->set_file_limits(bytes => 10_000_000);
+
+ # limit to 1024 x 1024
+ Imager->set_file_limits(width => 1024, height => 1024);
+
+=head1 DRAWING
+
+=head2 Adding a border to an image
+
+First make a new image with space for the border:
+
+ my $border_width = ...;
+ my $border_height = ...;
+ my $out = Imager->new(xsize => $source->getwidth() + 2 * $border_width,
+ ysize => $source->getheight() + 2 * $border_height,
+ bits => $source->bits,
+ channels => $source->getchannels);
+
+Then paste the source image into the new image:
+
+ $out->paste(left => $border_width,
+ top => $border_height,
+ img => $source);
+
+Whether you draw the border before or after pasting the original image
+depends on whether you want the border to overlap the image, for
+example a semi-tranparent border drawn after pasting the source image
+could overlap the edge without hiding it.
+
+If you want a solid border you could just fill the image before
+pasting the source for simplicity:
+
+ $out->box(filled=>1, color=>'red');
+ $out->paste(left => $border_width,
+ top => $border_height,
+ img => $source);
+
+
+=head1 TEXT
+
+=head2 Drawing text
+
+=head2 Aligning text
+
+=head2 Measuring text
+
+=head2 Word wrapping text
+
+=head2 Shearing (slanting) or Rotating text
+
+This requires that you have Imager installed with Freetype 2.x support
+installed, and that the font be created using the Freetype 2.x driver,
+for example:
+
+ my $font = Imager::Font->new(file=>$fontfile, type=>'ft2');
+
+First you need a transformation matrix, for shearing that could be:
+
+ my $angle_in_radians = ...;
+ my $tan_angle = sin($angle_rads) / cos($angle_rads);
+ # shear horizontally, supply this as y instead to do it vertically
+ my $matrix = Imager::Matrix2d->shear(x=>$tan_angle);
+
+For rotation that would be:
+
+ my $matrix = Imager::Matrix2d->rotate(radians => $angle_in_radians);
+
+or:
+
+ my $matrix = Imager::Matrix2d->rotate(degrees => $angle_in_degrees);
+
+Feed that to the font object:
+
+ $font->transform(matrix => $matrix);
+
+and draw the text as normal:
+
+ $image->string(string => $text,
+ x => $where_x,
+ y => $where_y,
+ color => $color,
+ font => $font);
+
+See samples/slant_text.pl for a comprehensive example, including
+calculating the transformed bounding box to create an image to fit the
+transformed text into.
+
+=head1 IMAGE TRANSFORMATION
+
+=head2 Shearing an image
+
+=head2 Convert to grayscale
+
+To convert an RGB image to a grayscale image, use the convert method:
+
+ my $grey = $image->convert(preset => 'gray');
+
+convert() returns a new image.
+
+See: L<Imager::Transformations/"Color transformations">
+
+=head1 METADATA
+
+=head2 Image format
+
+When Imager reads a file it does a magic number check to determine the
+file type, so "foo.png" could actually be a GIF image, and Imager will
+read it anyway.
+
+You can check the actual format of the image by looking at the
+C<i_format> tag.
+
+ my $format = $image->tags(name=>'i_format');
+
+=head2 Image spatial resolution
+
+Most image file formats store information about the physical size of
+the pixels, though in some cases that information isn't useful.
+
+Imager stores this information in the tags C<i_xres> and C<i_yres>,
+and this is always stored in dots per inch.
+
+Some formats, including TIFF and JPEG allow you to change the units
+spatial resolution information is stored in, if you set the tag that
+changes this the Imager will convert C<i_xres> and C<i_yres> to those
+units when it writes the file.
+
+For example to set the resolution to 300 dpi:
+
+ $image->settag(name => 'i_xres', value => 300);
+ $image->settag(name => 'i_yres', value => 300);
+
+If you want the file format to store the resolution in some other
+unit, for example you can write a TIFF file that stores the resolution
+in pixels per centimeter, you would do:
+
+ # 150 pixels/cm
+ $image->settag(name => 'i_xres', value => 150 * 2.54);
+ $image->settag(name => 'i_yres', value => 150 * 2.54);
+ $image->settag(name => 'tiff_resolutionunit', value => 3);
+
+Keywords: DPI
+
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=head1 SEE ALSO
+
+L<Imager>, L<Imager::Files>, L<Imager::Draw>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/CountColor.pm b/Master/tlpkg/tlperl.straw/lib/Imager/CountColor.pm
new file mode 100755
index 00000000000..514bc7f9526
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/CountColor.pm
@@ -0,0 +1,57 @@
+package Imager::CountColor;
+use strict;
+use Imager;
+use vars qw($VERSION @ISA @EXPORT_OK);
+require Exporter;
+@EXPORT_OK = 'count_color';
+
+BEGIN {
+ $VERSION = "0.01";
+ @ISA = qw(Exporter);
+
+ eval {
+ require XSLoader;
+ XSLoader::load('Imager::CountColor', $VERSION);
+ 1;
+ } or do {
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ bootstrap Imager::CountColor $VERSION;
+ };
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Imager::CountColor - demonstrates writing a simple function using Imager.
+
+=head1 SYNOPSIS
+
+ use Imager;
+ use Imager::CountColor;
+ my $im = Imager->new(...); # some Imager image
+ ...; # some sort of manipulation
+ print count_color($im, $color_object);
+
+=head1 DESCRIPTION
+
+This module is a simple demonstration of how to create an XS module
+that works with Imager objects.
+
+You may want to copy the source for this module as a start.
+
+=head1 SEE ALSO
+
+Imager, Imager::Filter::DynTest
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=cut
+
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Draw.pod b/Master/tlpkg/tlperl.straw/lib/Imager/Draw.pod
new file mode 100755
index 00000000000..c907627f6e1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Draw.pod
@@ -0,0 +1,1165 @@
+=head1 NAME
+
+Imager::Draw - Draw primitives to images
+
+=head1 SYNOPSIS
+
+ use Imager;
+ use Imager::Fill;
+
+ $img = ...;
+ $blue = Imager::Color->new( 0, 0, 255 );
+ $fill = Imager::Fill->new(hatch=>'stipple');
+
+ $img->line(color=>$blue, x1=>10, x2=>100,
+ y1=>20, y2=>50, aa=>1, endp=>1 );
+
+ $img->polyline(points=>[[$x0,$y0], [$x1,$y1], [$x2,$y2]],
+ color=>$blue);
+ $img->polyline(x=>[$x0,$x1,$x2], y=>[$y0,$y1,$y2], aa=>1);
+
+ $img->box(color=> $blue, xmin=> 10, ymin=>30,
+ xmax=>200, ymax=>300, filled=>1);
+ $img->box(fill=>$fill);
+
+ $img->arc(color=>$blue, r=>20, x=>200, y=>100,
+ d1=>10, d2=>20 );
+
+ $img->circle(color=>$blue, r=>50, x=>200, y=>100);
+
+ $img->polygon(points=>[[$x0,$y0], [$x1,$y1], [$x2,$y2]],
+ color=>$blue);
+
+ $img->polygon(x=>[$x0,$x1,$x2], y=>[$y0,$y1,$y2]);
+
+ $img->flood_fill(x=>50, y=>50, color=>$color);
+
+ $img->setpixel(x=>50, y=>70, color=>$color);
+
+ $img->setpixel(x=>[ 50, 60, 70 ], y=>[20, 30, 40], color=>$color);
+
+ my $color = $img->getpixel(x=>50, y=>70);
+
+ my @colors = $img->getpixel(x=>[ 50, 60, 70 ], y=>[20, 30, 40]);
+
+ # drawing text
+ my $font = Imager::Font->new(...) or die;
+ $img->string(x => 50, y => 70,
+ font => $font,
+ string => "Hello, World!",
+ color => 'red',
+ size => 30,
+ aa => 1);
+
+ # bottom right-hand corner of the image
+ $img->align_string(x => $img->getwidth() - 1,
+ y => $img->getheight() - 1,
+ halign => 'right',
+ valign => 'bottom',
+ string => 'Imager',
+ font => $font,
+ size => 12);
+
+ # low-level functions
+ my @colors = $img->getscanline(y=>50, x=>10, width=>20);
+
+ $img->setscanline(y=>60, x=>20, pixels=>\@colors);
+
+ my @samples = $img->getsamples(y=>50, x=>10, width=>20,
+ channels=>[ 2, 0 ]);
+
+=head1 DESCRIPTION
+
+It is possible to draw with graphics primitives onto images. Such
+primitives include boxes, arcs, circles, polygons and lines. The
+coordinate system in Imager has the origin C<(0,0)> in the upper left
+corner of an image with co-ordinates increasing to the right and
+bottom. For non antialiasing operation all coordinates are rounded
+towards the nearest integer. For antialiased operations floating
+point coordinates are used.
+
+Drawing is assumed to take place in a coordinate system of infinite
+resolution. This is the typical convention and really only matters when
+it is necessary to check for off-by-one cases. Typically it's usefull to
+think of C<(10, 20)> as C<(10.00, 20.00)> and consider the consiquences.
+
+=head2 Color Parameters
+
+X<color parameters>The C<color> parameter for any of the drawing
+methods can be an L<Imager::Color> object, a simple scalar that
+Imager::Color can understand, a hashref of parameters that
+Imager::Color->new understands, or an arrayref of red, green, blue
+values, for example:
+
+ $image->box(..., color=>'red');
+ $image->line(..., color=>'#FF0000');
+ $image->flood_fill(..., color=>[ 255, 0, 255 ]);
+
+=head2 Fill Parameters
+
+X<fill parameters>All filled primitives, i.e. C<arc()>, C<box()>,
+C<circle()>, C<polygon()> and the C<flood_fill()> method can take a
+C<fill> parameter instead of a C<color> parameter which can either be
+an Imager::Fill object, or a reference to a hash containing the
+parameters used to create the fill, for example:
+
+ $image->box(..., fill=>{ hatch => 'check1x1' });
+ my $fillimage = Imager->new;
+ $fillimage->read(file=>$somefile) or die;
+ $image->flood_fill(..., fill=>{ image=>$fillimage });
+
+Currently you can create opaque or transparent plain color fills,
+hatched fills, image based fills and fountain fills. See
+L<Imager::Fill> for more information.
+
+=head2 List of primitives
+
+=over
+
+=item line
+
+ $img->line(color=>$green, x1=>10, x2=>100,
+ y1=>20, y2=>50, aa=>1, endp=>1 );
+
+X<line method>Draws a line from (x1,y1) to (x2,y2). The endpoint
+(x2,y2) is drawn by default. If endp of 0 is specified then the
+endpoint will not be drawn. If C<aa> is set then the line will be
+drawn antialiased. The I<antialias> parameter is still available for
+backwards compatibility.
+
+Parameters:
+
+=over
+
+=item *
+
+x1, y1 - starting point of the line. Required.
+
+=item *
+
+x2, y2 - end point of the line. Required.
+
+=item *
+
+color - the color of the line. See L<"Color Parameters">. Default:
+black.
+
+=item *
+
+endp - if zero the end point of the line is not drawn. Default: 1 -
+the end point is drawn. This is useful to set to 0 when drawning a
+series of connected lines.
+
+=item *
+
+aa - if true the line is drawn anti-aliased. Default: 0.
+
+=back
+
+=item polyline
+
+ $img->polyline(points=>[[$x0,$y0],[$x1,$y1],[$x2,$y2]],color=>$red);
+ $img->polyline(x=>[$x0,$x1,$x2], y=>[$y0,$y1,$y2], aa=>1);
+
+X<polyline method>Polyline is used to draw multilple lines between a
+series of points. The point set can either be specified as an
+arrayref to an array of array references (where each such array
+represents a point). The other way is to specify two array
+references.
+
+The I<antialias> parameter is still available for backwards compatibility.
+
+=over
+
+=item *
+
+points - a reference to an array of references to arrays containing
+the co-ordinates of the points in the line, for example:
+
+ my @points = ( [ 0, 0 ], [ 100, 0 ], [ 100, 100 ], [ 0, 100 ] );
+ $img->polyline(points => \@points);
+
+=item *
+
+x, y - each is an array of x or y ordinates. This is an alternative
+to supplying the C<points> parameter.
+
+ # same as the above points example
+ my @x = ( 0, 100, 100, 0 );
+ my @y = ( 0, 0, 100, 100 );
+ $img->polyline(x => \@x, y => \@y);
+
+=item *
+
+color - the color of the line. See L<"Color Parameters">. Default:
+black.
+
+=item *
+
+aa - if true the line is drawn anti-aliased. Default: 0. Can also be
+supplied as C<antialias> for backward compatibility.
+
+=back
+
+=item box
+
+ $blue = Imager::Color->new( 0, 0, 255 );
+ $img->box(color => $blue, xmin=>10, ymin=>30, xmax=>200, ymax=>300,
+ filled=>1);
+
+X<box method>If any of the edges of the box are ommited it will snap
+to the outer edge of the image in that direction. If C<filled> is
+ommited the box is drawn as an outline. Instead of a color it is
+possible to use a C<fill> pattern:
+
+ $fill = Imager::Fill->new(hatch=>'stipple');
+ $img->box(fill=>$fill); # fill entire image with a given fill pattern
+
+ $img->box(xmin=>10, ymin=>30, xmax=>150, ymax=>60,
+ fill => { hatch=>'cross2' });
+
+Also if a color is omitted a color with (255,255,255,255) is used
+instead. [NOTE: This may change to use C<$img-E<gt>fgcolor()> in the future].
+
+Box does not support fractional coordinates yet.
+
+Parameters:
+
+=over
+
+=item *
+
+xmin - left side of the box. Default: 0 (left edge of the image)
+
+=item *
+
+ymin - top side of the box. Default: 0 (top edge of the image)
+
+=item *
+
+xmax - right side of the box. Default: $img->getwidth-1. (right edge
+of the image)
+
+=item *
+
+ymax - bottom side of the box. Default: $img->getheight-1. (bottom
+edge of the image)
+
+Note: xmax and ymax are I<inclusive> - the number of pixels drawn for
+a filled box is (xmax-xmin+1) * (ymax-ymin+1).
+
+=item *
+
+box - a reference to an array of (left, top, right, bottom)
+co-ordinates. This is an alternative to supplying xmin, ymin, xmax,
+ymax and overrides their values.
+
+=item *
+
+color - the color of the line. See L<"Color Parameters">. Default:
+white. This is ignored if the filled parameter
+
+=item *
+
+filled - if non-zero the box is filled with I<color> instead of
+outlined. Default: an outline is drawn.
+
+=item *
+
+fill - the fill for the box. If this is supplied then the box will be
+filled. See L<"Fill Parameters">.
+
+=back
+
+=item arc
+
+ $img->arc(color=>$red, r=>20, x=>200, y=>100, d1=>10, d2=>20 );
+
+This creates a filled red arc with a 'center' at (200, 100) and spans
+10 degrees and the slice has a radius of 20. [NOTE: arc has a BUG in
+it right now for large differences in angles.]
+It's also possible to supply a C<fill> parameter.
+
+Parameters:
+
+=over
+
+=item *
+
+x, y - center of the filled arc. Default: center of the image.
+
+=item *
+
+r - radius of the arc. Default: 1/3 of min(image height, image width).
+
+=item *
+
+d1 - starting angle of the arc, in degrees. Default: 0
+
+=item *
+
+d2 - ending angle of the arc, in degrees. Default: 361.
+
+=item *
+
+color - the color of the filled arc. See L<"Color Parameters">.
+Default: white. Overridden by C<fill>.
+
+=item *
+
+fill - the fill for the filled arc. See L<"Fill Parameters">
+
+=item *
+
+aa - if true the filled arc is drawn anti-aliased. Default: false.
+
+Anti-aliased arc() is experimental for now, I'm not entirely happy
+with the results in some cases.
+
+=back
+
+ # arc going through angle zero:
+ $img->arc(d1=>320, d2=>40, x=>100, y=>100, r=>50, color=>'blue');
+
+ # complex fill arc
+ $img->arc(d1=>135, d2=>45, x=>100, y=>150, r=>50,
+ fill=>{ solid=>'red', combine=>'diff' });
+
+=item circle
+
+ $img->circle(color=>$green, r=>50, x=>200, y=>100, aa=>1, filled=>1);
+
+This creates an antialiased green circle with its center at (200, 100)
+and has a radius of 50. It's also possible to supply a C<fill> parameter
+instead of a color parameter.
+
+ $img->circle(r => 50, x=> 150, y => 150, fill=>{ hatch => 'stipple' });
+
+The circle is always filled but that might change, so always pass a
+filled=>1 parameter if you want it to be filled.
+
+=over
+
+=item *
+
+x, y - center of the filled circle. Default: center of the image.
+
+=item *
+
+r - radius of the circle. Default: 1/3 of min(image height, image width).
+
+=item *
+
+color - the color of the filled circle. See L<"Color Parameters">.
+Default: white. Overridden by C<fill>.
+
+=item *
+
+fill - the fill for the filled circle. See L<"Fill Parameters">
+
+=item *
+
+aa - if true the filled circle is drawn anti-aliased. Default: false.
+
+=back
+
+=item polygon
+
+ $img->polygon(points=>[[$x0,$y0],[$x1,$y1],[$x2,$y2]],color=>$red);
+ $img->polygon(x=>[$x0,$x1,$x2], y=>[$y0,$y1,$y2], fill=>$fill);
+
+Polygon is used to draw a filled polygon. Currently the polygon is
+always drawn antialiased, although that will change in the future.
+Like other antialiased drawing functions its coordinates can be
+specified with floating point values. As with other filled shapes
+it's possible to use a C<fill> instead of a color.
+
+=over
+
+=item *
+
+points - a reference to an array of references to arrays containing
+the co-ordinates of the points in the line, for example:
+
+ my @points = ( [ 0, 0 ], [ 100, 0 ], [ 100, 100 ], [ 0, 100 ] );
+ $img->polygon(points => \@points);
+
+=item *
+
+x, y - each is an array of x or y ordinates. This is an alternative
+to supplying the C<points> parameter.
+
+ # same as the above points example
+ my @x = ( 0, 100, 100, 0 );
+ my @y = ( 0, 0, 100, 100 );
+ $img->polygon(x => \@x, y => \@y);
+
+=item *
+
+color - the color of the filled polygon. See L<"Color Parameters">.
+Default: black. Overridden by C<fill>.
+
+=item *
+
+fill - the fill for the filled circle. See L<"Fill Parameters">
+
+=back
+
+=item flood_fill
+
+X<flood_fill>You can fill a region that all has the same color using
+the flood_fill() method, for example:
+
+ $img->flood_fill(x=>50, y=>50, color=>$color);
+
+will fill all regions the same color connected to the point (50, 50).
+
+Alternatively you can fill a region limited by a given border color:
+
+ # stop at the red border
+ $im->flood_fill(x=>50, y=>50, color=>$color, border=>"red");
+
+You can also fill with a complex fill:
+
+ $img->flood_fill(x=>50, y=>50, fill=>{ hatch=>'cross1x1' });
+
+Parameters:
+
+=over
+
+=item *
+
+x, y - the start point of the fill.
+
+=item *
+
+color - the color of the filled area. See L<"Color Parameters">.
+Default: white. Overridden by C<fill>.
+
+=item *
+
+fill - the fill for the filled area. See L<"Fill Parameters">
+
+=item *
+
+border - the border color of the region to be filled. If this
+parameter is supplied flood_fill() will stop when it finds this color.
+If this is not supplied then a normal fill is done. C<border> can be
+supplied as a L<"Color Parameter">.
+
+=back
+
+=item setpixel
+
+ $img->setpixel(x=>50, y=>70, color=>$color);
+ $img->setpixel(x=>[ 50, 60, 70 ], y=>[20, 30, 40], color=>$color);
+
+setpixel() is used to set one or more individual pixels.
+
+Parameters:
+
+=over
+
+=item *
+
+x, y - either integers giving the co-ordinates of the pixel to set or
+array references containing a set of pixels to be set.
+
+=item *
+
+color - the color of the pixels drawn. See L<"Color Parameters">.
+Default: white.
+
+=back
+
+When called with array parameters, returns the number of pixels
+successfully set, or false if none.
+
+When called with scalars for x and y, return $img on success, false on
+failure.
+
+=item getpixel
+
+ my $color = $img->getpixel(x=>50, y=>70);
+ my @colors = $img->getpixel(x=>[ 50, 60, 70 ], y=>[20, 30, 40]);
+ my $colors_ref = $img->getpixel(x=>[ 50, 60, 70 ], y=>[20, 30, 40]);
+
+getpixel() is used to retrieve one or more individual pixels.
+
+For either method you can supply a single set of co-ordinates as
+scalar x and y parameters, or set each to an arrayref of ordinates.
+
+When called with arrays, getpixel() will return a list of colors in
+list context, and an arrayref in scalar context.
+
+To receive floating point colors from getpixel, set the C<type>
+parameter to 'float'.
+
+Parameters:
+
+=over
+
+=item *
+
+x, y - either integers giving the co-ordinates of the pixel to set or
+array references containing a set of pixels to be set.
+
+=item *
+
+type - the type of color object to return, either C<'8bit'> for
+Imager::Color objects or C<'float'> for Imager::Color::Float objects.
+Default: C<'8bit'>.
+
+=back
+
+=item string
+
+ my $font = Imager::Font->new(file=>"foo.ttf");
+ $img->string(x => 50, y => 70,
+ string => "Hello, World!",
+ font => $font,
+ size => 30,
+ aa => 1,
+ color => 'white');
+
+Draws text on the image.
+
+Parameters:
+
+=over
+
+=item *
+
+x, y - the point to draw the text from. If C<align> is 0 this is the
+top left of the string. If C<align> is 1 (the default) then this is
+the left of the string on the baseline. Required.
+
+=item *
+
+string - the text to draw. Required unless you supply the C<text>
+parameter.
+
+=item *
+
+font - an L<Imager::Font> object representing the font to draw the
+text with. Required.
+
+=item *
+
+aa - if non-zero the output will be anti-aliased. Default: the value
+set in Imager::Font->new() or 0 if not set.
+
+=item *
+
+align - if non-zero the point supplied in (x,y) will be on the
+base-line, if zero then (x,y) will be at the top-left of the string.
+
+ie. if drawing the string "yA" and align is 0 the point (x,y) will
+aligned with the top of the A. If align is 1 (the default) it will be
+aligned with the baseline of the font, typically bottom of the A,
+depending on the font used.
+
+Default: the value set in Imager::Font->new, or 1 if not set.
+
+=item *
+
+channel - if present, the text will be written to the specified
+channel of the image and the color parameter will be ignore.
+
+=item *
+
+color - the color to draw the text in. Default: the color supplied to
+Imager::Font->new, or red if none.
+
+=item *
+
+size - the point size to draw the text at. Default: the size supplied
+to Imager::Font->new, or 15.
+
+=item *
+
+sizew - the width scaling to draw the text at. Default: the value of
+C<size>.
+
+=item *
+
+utf8 - for drivers that support it, treat the string as UTF8 encoded.
+For versions of perl that support Unicode (5.6 and later), this will
+be enabled automatically if the C<string> parameter is already a UTF8
+string. See L<Imager::Font/"UTF8"> for more information.
+
+=item *
+
+vlayout - for drivers that support it, draw the text vertically.
+Note: I haven't found a font that has the appropriate metrics yet.
+
+=item *
+
+text - alias for the C<string> parameter.
+
+=back
+
+On error, string() returns false and you can use $img->errstr to get
+the reason for the error.
+
+=item align_string
+
+Draws text aligned around a point on the image.
+
+ # "Hello" centered at 100, 100 in the image.
+ my ($left, $top, $right, $bottom) =
+ $img->align_string(string=>"Hello",
+ x=>100, y=>100,
+ halign=>'center', valign=>'center',
+ font=>$font);
+
+Parameters:
+
+=over
+
+=item *
+
+x, y - the point to draw the text from. If C<align> is 0 this is the
+top left of the string. If C<align> is 1 (the default) then this is
+the left of the string on the baseline. Required.
+
+=item *
+
+string - the text to draw. Required unless you supply the C<text> parameter.
+
+=item *
+
+font - an L<Imager::Font> object representing the font to draw the
+text with. Required.
+
+=item *
+
+aa - if non-zero the output will be anti-aliased
+
+=item *
+
+valign - vertical alignment of the text against (x,y)
+
+=over
+
+=item *
+
+top - Point is at the top of the text.
+
+=item *
+
+bottom - Point is at the bottom of the text.
+
+=item *
+
+baseline - Point is on the baseline of the text. This is the default.
+
+=item *
+
+center - Point is vertically centered within the text.
+
+=back
+
+=item *
+
+halign - horizontal alignment of the text against (x,y)
+
+=over
+
+=item *
+
+left - The point is at the left of the text. This is the default.
+
+=item *
+
+start - The point is at the start point of the text.
+
+=item *
+
+center - The point is horizontally centered within the text.
+
+=item *
+
+right - The point is at the right end of the text.
+
+=item *
+
+end - The point is at the end point of the text.
+
+=back
+
+=item *
+
+channel - if present, the text will be written to the specified
+channel of the image and the color parameter will be ignore.
+
+=item *
+
+color - the color to draw the text in. Default: the color supplied to
+Imager::Font->new, or red if none.
+
+=item *
+
+size - the point size to draw the text at. Default: the size supplied
+to Imager::Font->new, or 15.
+
+=item *
+
+sizew - the width scaling to draw the text at. Default: the value of
+C<size>.
+
+=item *
+
+utf8 - for drivers that support it, treat the string as UTF8 encoded.
+For versions of perl that support Unicode (5.6 and later), this will
+be enabled automatically if the C<string> parameter is already a UTF8
+string. See L<Imager::Font/"UTF8"> for more information.
+
+=item *
+
+vlayout - for drivers that support it, draw the text vertically.
+Note: I haven't found a font that has the appropriate metrics yet.
+
+=item *
+
+text - alias for the C<string> parameter.
+
+=back
+
+On success returns a list of bounds of the drawn text, in the order
+left, top, right, bottom.
+
+On error, align_string() returns an empty list and you can use
+$img->errstr to get the reason for the error.
+
+=item setscanline
+
+Set all or part of a horizontal line of pixels to an image. This
+method is most useful in conjuction with L</getscanline>.
+
+The parameters you can pass are:
+
+=over
+
+=item *
+
+y - vertical position of the scanline. This parameter is required.
+
+=item *
+
+x - position to start on the scanline. Default: 0
+
+=item *
+
+pixels - either a reference to an array containing Imager::Color
+objects, an reference to an array containing Imager::Color::Float
+objects or a scalar containing packed color data.
+
+If C<type> is C<index> then this can either be a reference to an array
+of palette color indexes or a scalar containing packed indexes.
+
+See L</"Packed Color Data"> for information on the format of packed
+color data.
+
+=item *
+
+type - the type of pixel data supplied. If you supply an array
+reference of object then this is determined automatically. If you
+supply packed color data this defaults to '8bit', if your data is
+packed floating point color data then set this to 'float'.
+
+You can use float or 8bit samples with any image.
+
+If this is 'index' then pixels should be either an array of palette
+color indexes or a packed string of color indexes.
+
+=back
+
+Returns the number of pixels set.
+
+Each of the following sets 5 pixels from (5, 10) through (9, 10) to
+blue, red, blue, red, blue:
+
+ my $red_color = Imager::Color->new(255, 0, 0);
+ my $blue_color = Imager::Color->new(0, 0, 255);
+
+ $image->setscanline(y=>10, x=>5, pixels=>
+ [ ($blue_color, $red_color) x 2, $blue_color ]);
+
+ # use floating point color instead, for 16-bit plus images
+ my $red_colorf = Imager::Color::Float->new(1.0, 0, 0);
+ my $blue_colorf = Imager::Color::Float->new(0, 0, 1.0);
+
+ $image->setscanline(y=>10, x=>5, pixels=>
+ [ ($blue_colorf, $red_colorf) x 2, $blue_colorf ]);
+
+ # packed 8-bit data
+ $image->setscanline(y=>10, x=>5, pixels=>
+ pack("C*", ((0, 0, 255, 255), (255, 0, 0, 255)) x 2,
+ (0, 0, 255, 255)));
+
+ # packed floating point samples
+ $image->setscanline(y=>10, x=>5, type=>'float', pixels=>
+ pack("d*", ((0, 0, 1.0, 1.0), (1.0, 0, 0, 1.0)) x 2,
+ (0, 0, 1.0, 1.0)));
+
+
+Copy even rows from one image to another:
+
+ for (my $y = 0; $y < $im2->getheight; $y+=2) {
+ $im1->setscanline(y=>$y,
+ pixels=>scalar($im2->getscanline(y=>$y)));
+ }
+
+
+Set the blue channel to 0 for all pixels in an image. This could be
+done with convert too:
+
+ for my $y (0..$im->getheight-1) {
+ my $row = $im->getscanline(y=>$y);
+ $row =~ s/(..).(.)/$1\0$2/gs;
+ $im->setscanline(y=>$y, pixels=>$row);
+ }
+
+=item getscanline
+
+Read all or part of a horizontal line of pixels from an image. This
+method is most useful in conjunction with L</setscanline>.
+
+The parameters you can pass are:
+
+=over
+
+=item *
+
+y - vertical position of the scanline. This parameter is required.
+
+=item *
+
+x - position to start on the scanline. Default: 0
+
+=item *
+
+width - number of pixels to read. Default: $img->getwidth - x
+
+=item *
+
+type - the type of pixel data to return. Default: C<8bit>.
+
+Permited values are C<8bit> and C<float> and C<index>.
+
+=back
+
+In list context this method will return a list of Imager::Color
+objects when I<type> is C<8bit>, or a list of Imager::Color::Float
+objects when I<type> if C<float>, or a list of integers when I<type>
+is C<index>.
+
+In scalar context this returns a packed 8-bit pixels when I<type> is
+C<8bit>, or a list of packed floating point pixels when I<type> is
+C<float>, or packed palette color indexes when I<type> is C<index>.
+
+The values of samples for which the image does not have channels is
+undefined. For example, for a single channel image the values of
+channels 1 through 3 are undefined.
+
+Check image for a given color:
+
+ my $found;
+ YLOOP: for my $y (0..$img->getheight-1) {
+ my @colors = $img->getscanline(y=>$y);
+ for my $color (@colors) {
+ my ($red, $green, $blue, $alpha) = $color->rgba;
+ if ($red == $test_red && $green == $test_green && $blue == $test_blue
+ && $alpha == $test_alpha) {
+ ++$found;
+ last YLOOP;
+ }
+ }
+ }
+
+Or do it using packed data:
+
+ my $found;
+ my $test_packed = pack("CCCC", $test_red, $test_green, $test_blue,
+ $test_alpha);
+ YLOOP: for my $y (0..$img->getheight-1) {
+ my $colors = $img->getscanline(y=>$y);
+ while (length $colors) {
+ if (substr($colors, 0, 4, '') eq $test_packed) {
+ ++$found;
+ last YLOOP;
+ }
+ }
+ }
+
+Some of the examples for L</setscanline> for more examples.
+
+=item getsamples
+
+Read specified channels from all or part of a horizontal line of
+pixels from an image.
+
+The parameters you can pass are:
+
+=over
+
+=item *
+
+y - vertical position of the scanline. This parameter is required.
+
+=item *
+
+x - position to start on the scanline. Default: 0
+
+=item *
+
+width - number of pixels to read. Default: $img->getwidth - x
+
+=item *
+
+type - the type of sample data to return. Default: C<8bit>.
+
+Permited values are C<8bit> and C<float>.
+
+As of Imager 0.61 this can be C<16bit> only for 16 bit images.
+
+=item *
+
+channels - a reference to an array of channels to return, where 0 is
+the first channel. Default: C<< [ 0 .. $self->getchannels()-1 ] >>
+
+=item *
+
+target - if an array reference is supplied in target then the samples
+will be stored here instead of being returned.
+
+=item *
+
+offset - the offset within the array referenced by I<target>
+
+=back
+
+In list context this will return a list of integers between 0 and 255
+inclusive when I<type> is C<8bit>, or a list of floating point numbers
+between 0.0 and 1.0 inclusive when I<type> is C<float>.
+
+In scalar context this will return a string of packed bytes, as with
+C< pack("C*", ...) > when I<type> is C<8bit> or a string of packed
+doubles as with C< pack("d*", ...) > when I<type> is C<float>.
+
+If the I<target> option is supplied then only a count of samples is
+returned.
+
+Example: Check if any pixels in an image have a non-zero alpha
+channel:
+
+ my $has_coverage;
+ for my $y (0 .. $img->getheight()-1) {
+ my $alpha = $img->getsamples(y=>$y, channels=>[0]);
+ if ($alpha =~ /[^\0]/) {
+ ++$has_coverage;
+ last;
+ }
+ }
+
+Example: Convert a 2 channel grey image into a 4 channel RGBA image:
+
+ # this could be done with convert() instead
+ my $out = Imager->new(xsize => $src->getwidth(),
+ ysize => $src->getheight(),
+ channels => 4);
+ for my $y ( 0 .. $src->getheight()-1 ) {
+ my $data = $src->getsamples(y=>$y, channels=>[ 0, 0, 0, 1 ]);
+ $out->setscanline(y=>$y, pixels=>$data);
+ }
+
+Retrieve 16-bit samples:
+
+ if ($img->bits == 16) {
+ my @samples;
+ $img->getsamples(x => 0, y => $y, target => \@samples, type => '16bit');
+ }
+
+=item setsamples
+
+This allows writing of samples back to some images. Currently this is
+only supported for 16-bit/sample images.
+
+Parameters:
+
+=over
+
+=item *
+
+y - vertical position of the scanline. This parameter is required.
+
+=item *
+
+x - position to start on the scanline. Default: 0
+
+=item *
+
+width - number of pixels to write. Default: $img->getwidth - x. The
+minimum of this and the number of pixels represented by the samples
+provided will be written.
+
+=item *
+
+type - the type of sample data to write. This parameter is required.
+
+As of Imager 0.61 this can only be C<16bit> only for 16 bit images.
+
+=item *
+
+channels - a reference to an array of channels to return, where 0 is
+the first channel. Default: C<< [ 0 .. $self->getchannels()-1 ] >>
+
+=item *
+
+data - a reference to an array of samples to write. Required.
+
+=item *
+
+offset - the starting offset within the array referenced by I<data>
+
+=back
+
+Returns the number of samples written.
+
+=back
+
+=head1 Packed Color Data
+
+The getscanline() and setscanline() functions can work with pixels
+packed into scalars. This is useful to remove the cost of creating
+color objects, but should only be used when performance is an issue.
+
+Packed data can either be 1 byte per sample or 1 double per sample.
+
+Each pixel returned by getscanline() or supplied to setscanline()
+contains 4 samples, even if the image has fewer then 4 channels. The
+values of the extra samples as returned by getscanline() is not
+specified. The extra samples passed to setscanline() are ignored.
+
+To produce packed 1 byte/sample pixels, use the pack C<C> template:
+
+ my $packed_8bit_pixel = pack("CCCC", $red, $blue, $green, $alpha);
+
+To produce packed double/sample pixels, use the pack C<d> template:
+
+ my $packed_float_pixel = pack("dddd", $red, $blue, $green, $alpha);
+
+If you use a I<type> parameter of C<index> then the values are palette
+color indexes, not sample values:
+
+ my $im = Imager->new(xsize => 100, ysize => 100, type => 'paletted');
+ my $black_index = $im->addcolors(colors => [ 'black' ]);
+ my $red_index = $im->addcolors(colors => [ 'red' ]);
+ # 2 pixels
+ my $packed_index_data = pack("C*", $black_index, $red_index);
+ $im->setscanline(y => $y, pixels => $packed_index_data, type => 'index');
+
+=head1 Combine Types
+
+Some methods accept a C<combine> parameter, this can be any of the
+following:
+
+=over
+
+=item none
+
+The fill pixel replaces the target pixel.
+
+=item normal
+
+The fill pixels alpha value is used to combine it with the target pixel.
+
+=item multiply
+
+=item mult
+
+Each channel of fill and target is multiplied, and the result is
+combined using the alpha channel of the fill pixel.
+
+=item dissolve
+
+If the alpha of the fill pixel is greater than a random number, the
+fill pixel is alpha combined with the target pixel.
+
+=item add
+
+The channels of the fill and target are added together, clamped to the range of the samples and alpha combined with the target.
+
+=item subtract
+
+The channels of the fill are subtracted from the target, clamped to be
+>= 0, and alpha combined with the target.
+
+=item diff
+
+The channels of the fill are subtracted from the target and the
+absolute value taken this is alpha combined with the target.
+
+=item lighten
+
+The higher value is taken from each channel of the fill and target
+pixels, which is then alpha combined with the target.
+
+=item darken
+
+The higher value is taken from each channel of the fill and target
+pixels, which is then alpha combined with the target.
+
+=item hue
+
+The combination of the saturation and value of the target is combined
+with the hue of the fill pixel, and is then alpha combined with the
+target.
+
+=item sat
+
+The combination of the hue and value of the target is combined
+with the saturation of the fill pixel, and is then alpha combined with the
+target.
+
+=item value
+
+The combination of the hue and value of the target is combined
+with the value of the fill pixel, and is then alpha combined with the
+target.
+
+=item color
+
+The combination of the value of the target is combined with the hue
+and saturation of the fill pixel, and is then alpha combined with the
+target.
+
+=back
+
+=over
+
+=item combines
+
+Returns a list of possible combine types.
+
+=back
+
+=head1 BUGS
+
+box() does not support antialiasing yet. Arc, is only filled as of
+yet. Default color is not unified yet.
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>, Arnar M. Hrafnkelsson.
+
+=head1 SEE ALSO
+
+L<Imager>(3), L<Imager::Cookbook>(3)
+
+=head1 REVISION
+
+$Revision: 1667 $
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Engines.pod b/Master/tlpkg/tlperl.straw/lib/Imager/Engines.pod
new file mode 100755
index 00000000000..42784712e67
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Engines.pod
@@ -0,0 +1,558 @@
+=head1 NAME
+
+Imager::Engines - Programmable transformation operations
+
+=head1 SYNOPSIS
+
+ use Imager;
+
+ my %opts;
+ my @imgs;
+ my $img;
+ ...
+
+ my $newimg = $img->transform(
+ xexpr=>'x',
+ yexpr=>'y+10*sin((x+y)/10)')
+ or die $img->errstr;
+
+ my $newimg = Imager::transform2(\%opts, @imgs)
+ or die "transform2 failed: $Imager::ERRSTR";
+
+ my $newimg = $img->matrix_transform(
+ matrix=>[ -1, 0, $img->getwidth-1,
+ 0, 1, 0,
+ 0, 0, 1 ]);
+
+
+=head1 DESCRIPTION
+
+=head2 transform
+
+The C<transform()> function can be used to generate spatial warps and
+rotations and such effects. It only operates on a single image and
+its only function is to displace pixels.
+
+It can be given the operations in postfix notation or the module
+Affix::Infix2Postfix can be used to generate postfix code from infix
+code. Look in the test case t/t55trans.t for an example.
+
+C<transform()> needs expressions (or opcodes) that determine the
+source pixel for each target pixel. Source expressions are infix
+expressions using any of the +, -, *, / or ** binary operators, the -
+unary operator, ( and ) for grouping and the sin() and cos()
+functions. The target pixel is input as the variables x and y.
+
+You specify the x and y expressions as xexpr and yexpr respectively.
+You can also specify opcodes directly, but that's magic deep enough
+that you can look at the source code.
+
+Note: You can still use the transform() function, but the transform2()
+function is just as fast and is more likely to be enhanced and
+maintained.
+
+ $new_img=$img->transform(xexpr=>'x',yexpr=>'y+10*sin((x+y)/10)')
+
+ $new_img=$img->transform(xexpr=>'x+0.1*y+5*sin(y/10.0+1.57)',
+ yexpr=>'y+10*sin((x+y-0.785)/10)')
+
+=head2 transform2
+
+Imager also supports a C<transform2()> class method which allows you
+perform a more general set of operations, rather than just specifying
+a spatial transformation as with the transform() method, you can also
+perform colour transformations, image synthesis and image
+combinations from multiple source images.
+
+C<transform2()> takes an reference to an options hash, and a list of
+images to operate one (this list may be empty):
+
+ my %opts;
+ my @imgs;
+ ...
+ my $img = Imager::transform2(\%opts, @imgs)
+ or die "transform2 failed: $Imager::ERRSTR";
+
+The options hash may define a transformation function, and optionally:
+
+=over
+
+=item *
+
+width - the width of the image in pixels. If this isn't supplied the
+width of the first input image is used. If there are no input images
+an error occurs.
+
+=item *
+
+height - the height of the image in pixels. If this isn't supplied
+the height of the first input image is used. If there are no input
+images an error occurs.
+
+=item *
+
+constants - a reference to hash of constants to define for the
+expression engine. Some extra constants are defined by Imager
+
+=item *
+
+channels - the number of channels in the output image. If this isn't
+supplied a 3 channel image will be created.
+
+=back
+
+The tranformation function is specified using either the expr or
+rpnexpr member of the options.
+
+=head3 Infix expressions
+
+You can supply infix expressions to transform 2 with the expr keyword.
+
+ $opts{expr} = 'return getp1(w-x, h-y)'
+
+The 'expression' supplied follows this general grammar:
+
+ ( identifier '=' expr ';' )* 'return' expr
+
+This allows you to simplify your expressions using variables.
+
+A more complex example might be:
+
+ $opts{expr} = 'pix = getp1(x,y); return if(value(pix)>0.8,pix*0.8,pix)'
+
+Currently to use infix expressions you must have the L<Parse::RecDescent>
+module installed (available from CPAN). There is also what might be a
+significant delay the first time you run the infix expression parser
+due to the compilation of the expression grammar.
+
+=head3 Postfix expressions
+
+You can supply postfix or reverse-polish notation expressions to
+transform2() through the rpnexpr keyword.
+
+The parser for rpnexpr emulates a stack machine, so operators will
+expect to see their parameters on top of the stack. A stack machine
+isn't actually used during the image transformation itself.
+
+You can store the value at the top of the stack in a variable called
+foo using !foo and retrieve that value again using @foo. The !foo
+notation will pop the value from the stack.
+
+An example equivalent to the infix expression above:
+
+ $opts{rpnexpr} = 'x y getp1 !pix @pix value 0.8 gt @pix 0.8 * @pix ifp'
+
+At the end of the expression there should be a single pixel value left
+on the stack, which is used as the output pixel.
+
+=head3 Operators
+
+transform2() has a fairly rich range of operators.
+
+Each entry below includes the usage with rpnexpr, formatted as:
+
+=over
+
+I<operand> I<operand> ... B<I<operator>> -- I<result>
+
+=back
+
+If the operand or result begins with "N" it is a numeric value, if it
+begins with "C" it is a color or pixel value.
+
+=over
+
+=item +, *, -, /, %, **
+
+multiplication, addition, subtraction, division, remainder and
+exponentiation. Multiplication, addition and subtraction can be used
+on colour values too - though you need to be careful - adding 2 white
+values together and multiplying by 0.5 will give you grey, not white.
+
+Division by zero (or a small number) just results in a large number.
+Modulo zero (or a small number) results in zero. % is implemented
+using fmod() so you can use this to take a value mod a floating point
+value.
+
+rpnexpr usage:
+
+=over
+
+I<N1> I<N2> B<+> -- I<N>
+
+I<N1> I<N2> B<*> -- I<N>
+
+I<N1> I<N2> B<-> -- I<N>
+
+I<N1> I<N2> B</> -- I<N>
+
+I<N1> I<N2> B<**> -- I<N>
+
+I<N1> B<uminus> -- I<N>
+
+=back
+
+=item sin(N), cos(N), atan2(y,x)
+
+Some basic trig functions. They work in radians, so you can't just
+use the hue values.
+
+rpnexpr usage:
+
+=over
+
+I<N> B<sin> -- I<N>
+
+I<N> B<cos> -- I<N>
+
+I<Ny> I<Nx> B<atan2> -- I<N>
+
+=back
+
+=item distance(x1, y1, x2, y2)
+
+Find the distance between two points. This is handy (along with
+atan2()) for producing circular effects.
+
+rpnexpr usage:
+
+=over
+
+I<Nx1> I<Ny1> I<Nx2> I<Ny2> B<distance> -- I<N>
+
+=back
+
+=item sqrt(n)
+
+Find the square root. I haven't had much use for this since adding
+the distance() function.
+
+rpnexpr usage:
+
+=over
+
+I<N> B<sqrt> -- I<N>
+
+=back
+
+=item abs(n)
+
+Find the absolute value.
+
+rpnexpr usage:
+
+=over
+
+I<N> B<abs> -- I<N>
+
+=back
+
+=item getp1(x,y), getp2(x,y), getp3(x, y)
+
+Get the pixel at position (x,y) from the first, second or third image
+respectively. I may add a getpn() function at some point, but this
+prevents static checking of the instructions against the number of
+images actually passed in.
+
+rpnexpr usage:
+
+=over
+
+I<Nx> I<Ny> B<getp1> -- I<C>
+
+I<Nx> I<Ny> B<getp2> -- I<C>
+
+I<Nx> I<Ny> B<getp3> -- I<C>
+
+=back
+
+=item value(c), hue(c), sat(c), hsv(h,s,v), hsva(h,s,v,alpha)
+
+Separates a colour value into it's value (brightness), hue (colour)
+and saturation elements. Use hsv() to put them back together (after
+suitable manipulation), or hsva() to include a tranparency value.
+
+rpnexpr usage:
+
+=over
+
+I<C> B<value> -- I<N>
+
+I<C> B<hue> -- I<N>
+
+I<C> B<sat> -- I<N>
+
+I<Nh> I<Ns> I<Nv> B<hsv> -- I<C>
+
+I<Nh> I<Ns> I<Nv> I<Na> B<hsva> -- I<C>
+
+=back
+
+=item red(c), green(c), blue(c), rgb(r,g,b), rgba(r,g,b,a)
+
+Separates a colour value into it's red, green and blue colours. Use
+rgb(r,g,b) to put it back together, or rgba() to include a
+transparency value.
+
+rpnexpr usage:
+
+=over
+
+I<C> B<red> -- I<N>
+
+I<C> B<green> -- I<N>
+
+I<C> B<blue> -- I<N>
+
+I<Nr> I<Ng> I<Nb> B<rgb> -- I<C>
+
+I<Nr> I<Ng> I<Nb> I<Na> B<rgba> -- I<C>
+
+=back
+
+=item alpha(c)
+
+Retrieve the alpha value from a colour.
+
+rpnexpr usage:
+
+=over
+
+I<C> B<alpha> -- I<N>
+
+=back
+
+=item int(n)
+
+Convert a value to an integer. Uses a C int cast, so it may break on
+large values.
+
+rpnexpr usage:
+
+=over
+
+I<N> B<int> -- I<N>
+
+=back
+
+=item if(cond,ntrue,nfalse), if(cond,ctrue,cfalse)
+
+A simple (and inefficient) if function.
+
+rpnexpr usage:
+
+=over
+
+I<Ncond> I<N-true-result> I<N-false-result> B<if> -- I<N>
+
+I<Ncond> I<C-true-result> I<C-false-result> B<if> -- I<C>
+
+I<Ncond> I<C-true-result> I<C-false-result> B<ifp> -- I<C>
+
+=back
+
+=item <=,<,==,>=,>,!=
+
+Relational operators (typically used with if()). Since we're working
+with floating point values the equalities are 'near equalities' - an
+epsilon value is used.
+
+=over
+
+I<N1> I<N2> B<< <= >> -- I<N>
+
+I<N1> I<N2> B<< < >> -- I<N>
+
+I<N1> I<N2> B<< >= >> -- I<N>
+
+I<N1> I<N2> B<< > >> -- I<N>
+
+I<N1> I<N2> B<< == >> -- I<N>
+
+I<N1> I<N2> B<< != >> -- I<N>
+
+=back
+
+=item &&, ||, not(n)
+
+Basic logical operators.
+
+rpnexpr usage:
+
+=over
+
+I<N1> I<N2> B<and> -- I<N>
+
+I<N1> I<N2> B<or> -- I<N>
+
+I<N> B<not> -- I<N>
+
+=back
+
+=item log(n), exp(n)
+
+Natural logarithm and exponential.
+
+rpnexpr usage:
+
+=over
+
+I<N> B<log> -- I<N>
+
+I<N> B<exp> -- I<N>
+
+=back
+
+=item det(a, b, c, d)
+
+Calculate the determinant of the 2 x 2 matrix;
+
+ a b
+ c d
+
+rpnexpr usage:
+
+=over
+
+I<Na> I<Nb> I<Nc> I<Nd> B<det> -- I<N>
+
+=back
+
+=back
+
+=head3 Constants
+
+transform2() defines the following constants:
+
+=over
+
+=item pi
+
+The classical constant.
+
+=item w
+
+=item h
+
+The width and height of the output image.
+
+=item cx
+
+=item cy
+
+The center of the output image.
+
+=item wI<image number>
+
+=item hI<image number>
+
+The width and height of each of the input images, C<w1> is the width
+of the first input image and so on.
+
+=item cxI<image number>
+
+=item cyI<image number>
+
+The center of each of the input images, (C<cx1>, C<cy1>) is the center
+of the first input image and so on.
+
+=back
+
+A few examples:
+
+=over
+
+=item rpnexpr=>'x 25 % 15 * y 35 % 10 * getp1 !pat x y getp1 !pix @pix sat 0.7 gt @pat @pix ifp'
+
+tiles a smaller version of the input image over itself where the
+colour has a saturation over 0.7.
+
+=item rpnexpr=>'x 25 % 15 * y 35 % 10 * getp1 !pat y 360 / !rat x y getp1 1 @rat - pmult @pat @rat pmult padd'
+
+tiles the input image over itself so that at the top of the image the
+full-size image is at full strength and at the bottom the tiling is
+most visible.
+
+=item rpnexpr=>'x y getp1 !pix @pix value 0.96 gt @pix sat 0.1 lt and 128 128 255 rgb @pix ifp'
+
+replace pixels that are white or almost white with a palish blue
+
+=item rpnexpr=>'x 35 % 10 * y 45 % 8 * getp1 !pat x y getp1 !pix @pix sat 0.2 lt @pix value 0.9 gt and @pix @pat @pix value 2 / 0.5 + pmult ifp'
+
+Tiles the input image overitself where the image isn't white or almost
+white.
+
+=item rpnexpr=>'x y 160 180 distance !d y 180 - x 160 - atan2 !a @d 10 / @a + 3.1416 2 * % !a2 @a2 180 * 3.1416 / 1 @a2 sin 1 + 2 / hsv'
+
+Produces a spiral.
+
+=item rpnexpr=>'x y 160 180 distance !d y 180 - x 160 - atan2 !a @d 10 / @a + 3.1416 2 * % !a2 @a 180 * 3.1416 / 1 @a2 sin 1 + 2 / hsv'
+
+A spiral built on top of a colour wheel.
+
+=back
+
+For details on expression parsing see L<Imager::Expr>. For details on
+the virtual machine used to transform the images, see
+L<Imager::regmach.pod>.
+
+ # generate a colorful spiral
+ # requires that Parse::RecDescent be installed
+ my $newimg = Imager::transform2({
+ width => 160, height=>160,
+ expr => <<EOS
+ dist = distance(x, y, w/2, h/2);
+ angle = atan2(y-h/2, x-w/2);
+ angle2 = (dist / 10 + angle) % ( 2 * pi );
+ return hsv(angle*180/pi, 1, (sin(angle2)+1)/2);
+ EOS
+ });
+
+ # replace green portions of an image with another image
+ my $newimg = Imager::transform2({
+ rpnexpr => <<EOS
+ x y getp2 !pat # used to replace green portions
+ x y getp1 !pix # source with "green screen"
+ @pix red 10 lt @pix blue 10 lt && # low blue and red
+ @pix green 254 gt && # and high green
+ @pat @pix ifp
+ EOS
+ }, $source, $background);
+
+=head2 Matrix Transformations
+
+=over
+
+=item matrix_transform
+
+Rather than having to write code in a little language, you can use a
+matrix to perform affine transformations, using the matrix_transform()
+method:
+
+ my $newimg = $img->matrix_transform(matrix=>[ -1, 0, $img->getwidth-1,
+ 0, 1, 0,
+ 0, 0, 1 ]);
+
+By default the output image will be the same size as the input image,
+but you can supply the xsize and ysize parameters to change the size.
+
+Rather than building matrices by hand you can use the Imager::Matrix2d
+module to build the matrices. This class has methods to allow you to
+scale, shear, rotate, translate and reflect, and you can combine these
+with an overloaded multiplication operator.
+
+WARNING: the matrix you provide in the matrix operator transforms the
+co-ordinates within the B<destination> image to the co-ordinates
+within the I<source> image. This can be confusing.
+
+You can also supply a C<back> argument which acts as a background
+color for the areas of the image with no samples available (outside
+the rectangle of the source image.) This can be either an
+Imager::Color or Imager::Color::Float object. This is B<not> mixed
+transparent pixels in the middle of the source image, it is B<only>
+used for pixels where there is no corresponding pixel in the source
+image.
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Expr.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Expr.pm
new file mode 100755
index 00000000000..8730570f6ab
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Expr.pm
@@ -0,0 +1,695 @@
+package Imager::Expr;
+
+use Imager::Regops;
+use strict;
+use vars qw($VERSION);
+
+$VERSION = "1.004";
+
+my %expr_types;
+
+my $error;
+
+sub error {
+ shift if UNIVERSAL::isa($_[0], 'Imager::Expr');
+ if (@_) {
+ $error = "@_";
+ }
+ else {
+ return $error;
+ }
+}
+
+# what else?
+my %default_constants =
+ (
+ # too many digits, better than too few
+ pi=>3.14159265358979323846264338327950288419716939937510582097494
+ );
+
+sub new {
+ my ($class, $opts) = @_;
+
+ # possibly this is a very bad idea
+ my ($type) = grep exists $expr_types{$_}, keys %$opts;
+ die "Imager::Expr: No known expression type"
+ if !defined $type;
+ my $self = bless {}, $expr_types{$type};
+ $self->{variables} = [ @{$opts->{variables}} ];
+ $self->{constants} = { %default_constants, %{$opts->{constants} || {}} };
+ $self->{ops} = $self->compile($opts->{$type}, $opts)
+ or return;
+ $self->optimize()
+ or return;
+ $self->{code} = $self->assemble()
+ or return;
+ $self;
+}
+
+sub register_type {
+ my ($pack, $name) = @_;
+ $expr_types{$name} = $pack;
+}
+
+sub type_registered {
+ my ($class, $name) = @_;
+
+ $expr_types{$name};
+}
+
+sub _variables {
+ return @{$_[0]->{variables}};
+}
+
+sub code {
+ return $_[0]->{code};
+}
+
+sub nregs {
+ return $_[0]->{nregs};
+}
+
+sub cregs {
+ return $_[0]->{cregs};
+}
+
+my $numre = '[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?';
+
+sub numre {
+ $numre;
+}
+
+# optimize the code
+sub optimize {
+ my ($self) = @_;
+
+ my @ops = @{$self->{ops}};
+
+ # this function cannot current handle code with jumps
+ return 1 if grep $_->[0] =~ /^jump/, @ops;
+
+ # optimization - common sub-expression elimination
+ # it's possible to fold this into the code generation - but it will wait
+
+ my $max_opr = $Imager::Regops::MaxOperands;
+ my $attr = \%Imager::Regops::Attr;
+ my $foundops = 1;
+ while ($foundops) {
+ $foundops = 0;
+ my %seen;
+ my $index;
+ my @out;
+ while (@ops) {
+ my $op = shift @ops;
+ my $desc = join(",", @{$op}[0..$max_opr]);
+ if ($seen{$desc}) {
+ push(@out, @ops);
+ my $old = $op->[-1];
+ my $new = $seen{$desc};
+ for $op (@out) {
+ for my $reg (@{$op}[1..$max_opr]) {
+ $reg = $new if $reg eq $old;
+ }
+ }
+ $foundops=1;
+ last;
+ }
+ $seen{$desc} = $op->[-1];
+ push(@out, $op);
+ }
+ @ops = @out;
+ }
+ # strength reduction
+ for my $op (@ops) {
+ # reduce division by a constant to multiplication by a constant
+ if ($op->[0] eq 'div' && $op->[2] =~ /^r(\d+)/
+ && defined($self->{"nregs"}[$1])) {
+ my $newreg = @{$self->{"nregs"}};
+ push(@{$self->{"nregs"}}, 1.0/$self->{"nregs"}[$1]);
+ $op->[0] = 'mult';
+ $op->[2] = 'r'.$newreg;
+ }
+ }
+ $self->{ops} = \@ops;
+ 1;
+}
+
+sub assemble {
+ my ($self) = @_;
+ my $attr = \%Imager::Regops::Attr;
+ my $max_opr = $Imager::Regops::MaxOperands;
+ my @ops = @{$self->{ops}};
+ for my $op (@ops) {
+ $op->[0] = $attr->{$op->[0]}{opcode};
+ for (@{$op}[1..$max_opr+1]) { s/^[rpj]// }
+ }
+ my $pack = $Imager::Regops::PackCode x (2+$Imager::Regops::MaxOperands);
+
+ return join("", ,map { pack($pack, @$_, ) } @ops);
+}
+
+# converts stack code to register code
+sub stack_to_reg {
+ my ($self, @st_ops) = @_;
+ my @regstack;
+ my %nregs;
+ my @vars = $self->_variables();
+ my @nregs = (0) x scalar(@vars);
+ my @cregs;
+ my $attr = \%Imager::Regops::Attr;
+ my %vars;
+ my %names;
+ my $max_opr = $Imager::Regops::MaxOperands;
+ @vars{@vars} = map { "r$_" } 0..$#vars;
+
+ my @ops;
+ for (@st_ops) {
+ if (/^$numre$/) {
+ # combining constants makes the optimization below work
+ if (exists $nregs{$_}) {
+ push(@regstack, $nregs{$_});
+ }
+ else {
+ $nregs{$_} = "r".@nregs;
+ push(@regstack,"r".@nregs);
+ push(@nregs, $_);
+ }
+ }
+ elsif (exists $vars{$_}) {
+ push(@regstack, $vars{$_});
+ }
+ elsif (exists $attr->{$_} && length $attr->{$_}{types}) {
+ if (@regstack < $attr->{$_}{parms}) {
+ error("Imager::transform2: stack underflow on $_");
+ return;
+ }
+ my @parms = splice(@regstack, -$attr->{$_}{parms});
+ my $types = join("", map {substr($_,0,1)} @parms);
+ if ($types ne $attr->{$_}{types}) {
+ if (exists $attr->{$_.'p'} && $types eq $attr->{$_.'p'}{types}) {
+ $_ .= 'p';
+ }
+ else {
+ error("Imager::transform2: Call to $_ with incorrect types");
+ return;
+ }
+ }
+ my $result;
+ if ($attr->{$_}{result} eq 'r') {
+ $result = "r".@nregs;
+ push(@nregs, undef);
+ }
+ else {
+ $result = "p".@cregs;
+ push(@cregs, -1);
+ }
+ push(@regstack, $result);
+ push(@parms, "0") while @parms < $max_opr;
+ push(@ops, [ $_, @parms, $result ]);
+ #print "$result <- $_ @parms\n";
+ }
+ elsif (/^!(\w+)$/) {
+ if (!@regstack) {
+ error("Imager::transform2: stack underflow with $_");
+ return;
+ }
+ $names{$1} = pop(@regstack);
+ }
+ elsif (/^\@(\w+)$/) {
+ if (exists $names{$1}) {
+ push(@regstack, $names{$1});
+ }
+ else {
+ error("Imager::Expr: unknown storage \@$1");
+ return;
+ }
+ }
+ else {
+ error("Imager::Expr: unknown operator $_");
+ return;
+ }
+ }
+ if (@regstack != 1) {
+ error("stack must have only one item at end");
+ return;
+ }
+ if ($regstack[0] !~ /^p/) {
+ error("you must have a color value at the top of the stack at end");
+ return;
+ }
+ push(@ops, [ "ret", $regstack[0], (-1) x $max_opr ]);
+
+ $self->{"nregs"} = \@nregs;
+ $self->{"cregs"} = \@cregs;
+
+ return \@ops;
+}
+
+sub dumpops {
+ my $result = '';
+ for my $op (@{$_[0]->{ops}}) {
+ $result .= "@{$op}\n";
+ }
+ $result;
+}
+
+# unassembles the compiled code
+sub dumpcode {
+ my ($self) = @_;
+ my $code = $self->{"code"};
+ my $attr = \%Imager::Regops::Attr;
+ my @code = unpack("${Imager::Regops::PackCode}*", $code);
+ my %names = map { $attr->{$_}{opcode}, $_ } keys %Imager::Regops::Attr;
+ my @vars = $self->_variables();
+ my $result = '';
+ my $index = 0;
+ while (my @op = splice(@code, 0, 2+$Imager::Regops::MaxOperands)) {
+ my $opcode = shift @op;
+ my $name = $names{$opcode};
+ if ($name) {
+ $result .= "j$index: $name($opcode)";
+ my @types = split //, $attr->{$name}{types};
+ for my $parm (@types) {
+ my $reg = shift @op;
+ $result .= " $parm$reg";
+ if ($parm eq 'r') {
+ if ($reg < @vars) {
+ $result.= "($vars[$reg])";
+ }
+ elsif (defined $self->{"nregs"}[$reg]) {
+ $result .= "($self->{\"nregs\"}[$reg])";
+ }
+ }
+ }
+
+ $result .= " -> $attr->{$name}{result}$op[-1]"
+ if $attr->{$name}{result};
+ $result .= "\n";
+ }
+ else {
+ $result .= "unknown($opcode) @op\n";
+ }
+ ++$index;
+ }
+
+ $result;
+}
+
+package Imager::Expr::Postfix;
+use vars qw(@ISA);
+@ISA = qw(Imager::Expr);
+
+Imager::Expr::Postfix->register_type('rpnexpr');
+
+my %op_names = ( '+'=>'add', '-'=>'subtract', '*'=>'mult', '/' => 'div',
+ '%'=>'mod', '**'=>'pow' );
+
+sub compile {
+ my ($self, $expr, $opts) = @_;
+
+ $expr =~ s/#.*//; # remove comments
+ my @st_ops = split ' ', $expr;
+
+ for (@st_ops) {
+ $_ = $op_names{$_} if exists $op_names{$_};
+ $_ = $self->{constants}{$_} if exists $self->{constants}{$_};
+ }
+ return $self->stack_to_reg(@st_ops);
+}
+
+package Imager::Expr::Infix;
+
+use vars qw(@ISA);
+@ISA = qw(Imager::Expr);
+use Imager::Regops qw(%Attr $MaxOperands);
+
+
+eval "use Parse::RecDescent;";
+__PACKAGE__->register_type('expr') if !$@;
+
+# I really prefer bottom-up parsers
+my $grammar = <<'GRAMMAR';
+
+code : assigns 'return' expr
+{ $return = [ @item[1,3] ] }
+
+assigns : assign(s?) { $return = [ @{$item[1]} ] }
+
+assign : identifier '=' expr ';'
+{ $return = [ @item[1,3] ] }
+
+expr : relation
+
+relation : addition (relstuff)(s?)
+{
+ $return = $item[1];
+ for my $op(@{$item[2]}) { $return = [ $op->[0], $return, $op->[1] ] }
+ 1;
+}
+
+relstuff : relop addition { $return = [ @item[1,2] ] }
+
+relop : '<=' { $return = 'le' }
+ | '<' { $return = 'lt' }
+ | '==' { $return = 'eq' }
+ | '>=' { $return = 'ge' }
+ | '>' { $return = 'gt' }
+ | '!=' { $return = 'ne' }
+
+addition : multiply (addstuff)(s?)
+{
+ $return = $item[1];
+# for my $op(@{$item[2]}) { $return .= " @{$op}[1,0]"; }
+ for my $op(@{$item[2]}) { $return = [ $op->[0], $return, $op->[1] ] }
+ 1;
+}
+addstuff : addop multiply { $return = [ @item[1,2] ] }
+addop : '+' { $return = 'add' }
+ | '-' { $return = 'subtract' }
+
+multiply : power mulstuff(s?)
+{ $return = $item[1];
+# for my $op(@{$item[2]}) { $return .= " @{$op}[1,0]"; }
+ for my $op(@{$item[2]}) { $return = [ $op->[0], $return, $op->[1] ] }
+ 1;
+}
+
+mulstuff : mulop power { $return = [ @item[1,2] ] }
+mulop : '*' { $return = 'mult' }
+ | '/' { $return = 'div' }
+ | '%' { $return = 'mod' }
+
+power : powstuff(s?) atom
+{
+ $return = $item[2];
+ for my $op(reverse @{$item[1]}) { $return = [ @{$op}[1,0], $return ] }
+ 1;
+}
+ | atom
+powstuff : atom powop { $return = [ @item[1,2] ] }
+powop : '**' { $return = 'pow' }
+
+atom: '(' expr ')' { $return = $item[2] }
+ | '-' atom { $return = [ uminus=>$item[2] ] }
+ | number
+ | funccall
+ | identifier
+
+number : /[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/
+
+exprlist : expr ',' exprlist { $return = [ $item[1], @{$item[3]} ] }
+ | expr { $return = [ $item[1] ] }
+
+funccall : identifier '(' exprlist ')'
+{ $return = [ $item[1], @{$item[3]} ] }
+
+identifier : /[^\W\d]\w*/ { $return = $item[1] }
+
+GRAMMAR
+
+my $parser;
+
+sub init_parser {
+ if (!$parser) {
+ $parser = Parse::RecDescent->new($grammar);
+ }
+}
+
+sub compile {
+ my ($self, $expr, $opts) = @_;
+ if (!$parser) {
+ $parser = Parse::RecDescent->new($grammar);
+ }
+ my $optree = $parser->code($expr);
+ if (!$optree) {
+ $self->error("Error in $expr\n");
+ return;
+ }
+
+ @{$self->{inputs}}{$self->_variables} = ();
+ $self->{varregs} = {};
+ @{$self->{varregs}}{$self->_variables} = map { "r$_" } 0..$self->_variables-1;
+ $self->{"nregs"} = [ (undef) x $self->_variables ];
+ $self->{"cregs"} = [];
+ $self->{"lits"} = {};
+
+ eval {
+ # generate code for the assignments
+ for my $assign (@{$optree->[0]}) {
+ my ($varname, $tree) = @$assign;
+ if (exists $self->{inputs}{$varname}) {
+ $self->error("$varname is an input - you can't assign to it");
+ return;
+ }
+ $self->{varregs}{$varname} = $self->gencode($tree);
+ }
+
+ # generate the final result
+ my $result = $self->gencode($optree->[1]);
+ if ($result !~ /^p\d+$/) {
+ $self->error("You must return a colour value");
+ return;
+ }
+ push(@{$self->{genops}}, [ 'ret', $result, (0) x $MaxOperands ])
+ };
+ if ($@) {
+ $self->error($@);
+ return;
+ }
+
+ return $self->{genops};
+}
+
+sub gencode {
+ my ($self, $tree) = @_;
+
+ if (ref $tree) {
+ my ($op, @parms) = @$tree;
+
+ if (!exists $Attr{$op}) {
+ die "Unknown operator or function $op";
+ }
+
+ for my $subtree (@parms) {
+ $subtree = $self->gencode($subtree);
+ }
+ my $types = join("", map {substr($_,0,1)} @parms);
+
+ if (length($types) < length($Attr{$op}{types})) {
+ die "Too few parameters in call to $op";
+ }
+ if ($types ne $Attr{$op}{types}) {
+ # some alternate operators have the same name followed by p
+ my $opp = $op."p";
+ if (exists $Attr{$opp} &&
+ $types eq $Attr{$opp}{types}) {
+ $op = $opp;
+ }
+ else {
+ die "Call to $_ with incorrect types";
+ }
+ }
+ my $result;
+ if ($Attr{$op}{result} eq 'r') {
+ $result = "r".@{$self->{nregs}};
+ push(@{$self->{nregs}}, undef);
+ }
+ else {
+ $result = "p".@{$self->{cregs}};
+ push(@{$self->{cregs}}, undef);
+ }
+ push(@parms, "0") while @parms < $MaxOperands;
+ push(@{$self->{genops}}, [ $op, @parms, $result]);
+ return $result;
+ }
+ elsif (exists $self->{varregs}{$tree}) {
+ return $self->{varregs}{$tree};
+ }
+ elsif ($tree =~ /^$numre$/ || exists $self->{constants}{$tree}) {
+ $tree = $self->{constants}{$tree} if exists $self->{constants}{$tree};
+
+ if (exists $self->{lits}{$tree}) {
+ return $self->{lits}{$tree};
+ }
+ my $reg = "r".@{$self->{nregs}};
+ push(@{$self->{nregs}}, $tree);
+ $self->{lits}{$tree} = $reg;
+
+ return $reg;
+ }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Imager::Expr - implements expression parsing and compilation for the
+expression evaluation engine used by Imager::transform2()
+
+=head1 SYNOPSIS
+
+my $code = Imager::Expr->new({rpnexpr=>$someexpr})
+ or die "Cannot compile $someexpr: ",Imager::Expr::error();
+
+=head1 DESCRIPTION
+
+This module is used internally by the Imager::transform2() function.
+You shouldn't have much need to use it directly, but you may want to
+extend it.
+
+To create a new Imager::Expr object, call:
+
+ my %options;
+ my $expr = Imager::Expr->new(\%options)
+ or die Imager::Expr::error();
+
+You will need to set an expression value and you may set any of the
+following:
+
+=over
+
+=item *
+
+constants
+
+A hashref defining extra constants for expression parsing. The names
+of the constants must be valid identifiers (/[^\W\d]\w*/) and the
+values must be valid numeric constants (that Perl recognizes in
+scalars).
+
+Imager::Expr may define it's own constants (currently just pi.)
+
+=item *
+
+variables
+
+A reference to an array of variable names. These are allocated
+numeric registers starting from register zero.
+
+=back
+
+By default you can define a 'rpnexpr' key (which emulates RPN) or
+'expr' (an infix expression). It's also possible to write other
+expression parsers that will use other keys. Only one expression key
+should be defined.
+
+=head2 Instance methods
+
+The Imager::Expr::error() method is used to retrieve the error if the
+expression object cannot be created.
+
+=head2 Methods
+
+Imager::Expr provides only a few simple methods meant for external use:
+
+=over
+
+=item Imager::Expr->type_registered($keyword)
+
+Returns true if the given expression type is available. The parameter
+is the key supplied to the new() method.
+
+ if (Imager::Expr->type_registered('expr')) {
+ # use infix expressions
+ }
+
+=item $expr->code()
+
+Returns the compiled code.
+
+=item $expr->nregs()
+
+Returns a reference to the array of numeric registers.
+
+=item $expr->cregs()
+
+Returns a reference to the array of colour registers.
+
+=item $expr->dumpops()
+
+Returns a string with the generated VM "machine code".
+
+=item $expr->dumpcode()
+
+Returns a string with the unassembled VM "machine code".
+
+=back
+
+=head2 Creating a new parser
+
+I'll write this one day.
+
+Methods used by parsers:
+
+=over
+
+=item compile
+
+This is the main method you'll need to implement in a parser. See the
+existing parsers for a guide.
+
+It's supplied the following parameters:
+
+=over
+
+=item *
+
+$expr - the expression to be parsed
+
+=item *
+
+$options - the options hash supplied to transform2.
+
+=back
+
+Return an array ref of array refs containing opcodes and operands.
+
+=item @vars = $self->_variables()
+
+A list (not a reference) of the input variables. This should be used
+to allocate as many registers as there are variable as input
+registers.
+
+=item $self->error($message)
+
+Set the return value of Imager::Expr::error()
+
+=item @ops = $self->stack_to_reg(@stack_ops)
+
+Converts marginally parsed RPN to register code.
+
+=item assemble
+
+Called to convert op codes into byte code.
+
+=item numre
+
+Returns a regular expression that matches floating point numbers.
+
+=item optimize
+
+Optimizes the assembly code, including attempting common subexpression
+elimination and strength reducing division by a constant into
+multiplication by a constant.
+
+=item register_type
+
+Called by a new expression parser implementation to register itself,
+call as:
+
+ YourClassName->register_type('type code');
+
+where type code is the parameter that will accept the expression.
+
+=back
+
+=head2 Future compatibility
+
+Try to avoid doing your own optimization beyond literal folding - if
+we add some sort of jump, the existing optimizer will need to be
+rewritten, and any optimization you perform may well be broken too
+(well, your code generation will probably be broken anyway <sigh>).
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Expr/Assem.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Expr/Assem.pm
new file mode 100755
index 00000000000..a9496f74fd3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Expr/Assem.pm
@@ -0,0 +1,280 @@
+package Imager::Expr::Assem;
+use strict;
+use Imager::Expr;
+use Imager::Regops;
+use vars qw($VERSION);
+
+$VERSION = "1.002";
+
+use vars qw(@ISA);
+@ISA = qw(Imager::Expr);
+
+__PACKAGE__->register_type('assem');
+
+sub compile {
+ my ($self, $expr, $opts) = @_;
+ my %nregs;
+ my @vars = $self->_variables();
+ my @nregs = (0) x @vars;
+ my @cregs;
+ my %vars;
+ @vars{@vars} = map { "r$_" } 0..$#vars;
+ my %labels;
+ my @ops;
+ my @msgs;
+ my $attr = \%Imager::Regops::Attr;
+
+ # initially produce [ $linenum, $result, $opcode, @parms ]
+ my $lineno = 0;
+ while ($expr =~ s/^([^\n]+)(?:\n|$)//) {
+ ++$lineno;
+ my $line = $1;
+ $line =~ s/#.*//;
+ next if $line =~ /^\s*$/;
+ for my $op (split /;/, $line) {
+ if (my ($name, $type) = $op =~ /^\s*var\s+([^:]+):(\S+)\s*$/) {
+ if (exists $vars{$name}) {
+ push(@msgs, "$lineno: duplicate variable name '$name'");
+ next;
+ }
+ if ($type eq 'num' || $type eq 'n') {
+ $vars{$name} = 'r'.@nregs;
+ push(@nregs, undef);
+ next;
+ }
+ elsif ($type eq 'pixel' || $type eq 'p' || $type eq 'c') {
+ $vars{$name} = 'p'.@cregs;
+ push(@cregs, undef);
+ next;
+ }
+ push(@msgs, "$lineno: unknown variable type $type");
+ next;
+ }
+ # any statement can have a label
+ if ($op =~ s/^\s*(\w+):\s*//) {
+ if ($labels{$1}) {
+ push(@msgs,
+ "$lineno: duplicate label $1 (previous on $labels{$1}[1])");
+ next;
+ }
+ $labels{$1} = [ scalar @ops, $lineno ];
+ }
+ next if $op =~ /^\s*$/;
+ # jumps have special operand handling
+ if ($op =~ /^\s*jump\s+(\w+)\s*$/) {
+ push(@ops, [$lineno, "", "jump", $1]);
+ }
+ elsif (my ($code, $reg, $targ) =
+ ($op =~ /^\s*(jumpz|jumpnz)\s+(\S+)\s+(\S+)\s*$/)) {
+ push(@ops, [$lineno, "", $code, $reg, $targ]);
+ }
+ elsif ($op =~ /^\s*print\s+(\S+)\s*/) {
+ push(@ops, [$lineno, "", 'print', $1 ]);
+ }
+ elsif ($op =~ /^\s*ret\s+(\S+)\s*/) {
+ push(@ops, [$lineno, "", 'ret', $1]);
+ }
+ elsif ($op =~ s/\s*(\S+)\s*=\s*(\S+)\s*$//) {
+ # simple assignment
+ push(@ops, [$lineno, $1, "set", $2]);
+ }
+ elsif ($op =~ s/\s*(\S+)\s*=\s*(\S+)\s*//) {
+ # some normal ops finally
+ my ($result, $opcode) = ($1, $2);
+ unless ($attr->{$opcode}) {
+ push(@msgs, "$lineno: unknown operator $opcode");
+ next;
+ }
+ my @oper;
+ while ($op =~ s/(\S+)\s*//) {
+ push(@oper, $1);
+ }
+ push(@ops, [$lineno, $result, $opcode, @oper]);
+ }
+ else {
+ push(@msgs, "$lineno: invalid statement '$op'");
+ }
+ }
+ }
+
+ my $max_opr = $Imager::Regops::MaxOperands;
+ my $numre = $self->numre;
+ my $trans =
+ sub {
+ # translate a name/number to a <type><digits>
+ my ($name) = @_;
+ $name = $self->{constants}{$name}
+ if exists $self->{constants}{$name};
+ if ($vars{$name}) {
+ return $vars{$name};
+ }
+ elsif ($name =~ /^$numre$/) {
+ $vars{$name} = 'r'.@nregs;
+ push(@nregs, $name);
+ return $vars{$name};
+ }
+ else {
+ push(@msgs, "$lineno: undefined variable $name");
+ return '';
+ }
+ };
+ # now to translate symbols and so on
+ OP: for my $op (@ops) {
+ $lineno = shift @$op;
+ if ($op->[1] eq 'jump') {
+ unless (exists $labels{$op->[2]}) {
+ push(@msgs, "$lineno: unknown label $op->[2]");
+ next;
+ }
+ $op = [ 'jump', "j$labels{$op->[2]}[0]", (0) x $max_opr ];
+ }
+ elsif ($op->[1] =~ /^jump/) {
+ unless (exists $labels{$op->[3]}) {
+ push(@msgs, "$lineno: unknown label $op->[2]");
+ next;
+ }
+ $op = [ $op->[1], $trans->($op->[2]), "j$labels{$op->[3]}[0]",
+ (0) x ($max_opr-1) ];
+ }
+ elsif ($op->[1] eq 'print') {
+ $op = [ $op->[1], $trans->($op->[2]), (0) x $max_opr ];
+ }
+ elsif ($op->[1] eq 'ret') {
+ $op = [ 'ret', $trans->($op->[2]), (0) x $max_opr ];
+ }
+ else {
+ # a normal operator
+ my ($result, $name, @parms) = @$op;
+
+ if ($result =~ /^$numre$/) {
+ push(@msgs, "$lineno: target of operator cannot be a constant");
+ next;
+ }
+ $result = $trans->($result);
+ for my $parm (@parms) {
+ $parm = $trans->($parm);
+ }
+ push(@parms, (0) x ($max_opr-@parms));
+ $op = [ $op->[1], @parms, $result ];
+ }
+ }
+
+ # more validation than a real assembler
+ # not trying to solve the halting problem...
+ if (@ops && $ops[-1][0] ne 'ret' && $ops[-1][0] ne 'jump') {
+ push(@msgs, ": the last instruction must be ret or jump");
+ }
+
+ $self->{nregs} = \@nregs;
+ $self->{cregs} = \@cregs;
+
+ if (@msgs) {
+ $self->error(join("\n", @msgs));
+ return 0;
+ }
+
+ return \@ops;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ Imager::Expr::Assem - an assembler for producing code for the Imager
+ register machine
+
+=head1 SYNOPSIS
+
+ use Imager::Expr::Assem;
+ my $expr = Imager::Expr->new(assem=>'...', ...)
+
+=head1 DESCRIPTION
+
+This module is a simple Imager::Expr compiler that compiles a
+low-level language that has a nearly 1-to-1 relationship to the
+internal representation used for compiled regmach code.
+
+=head2 Syntax
+
+Each line can contain multiple statements separated by semi-colons.
+
+Anything after '#' in a line is ignored.
+
+Types of statements:
+
+=over 4
+
+=item variable definition
+
+=over 4
+
+C<var> I<name>:I<type>
+
+=back
+
+defines variable I<name> to have I<type>, which can be any of 'n' or
+'num' for a numeric type or 'pixel', 'p' or 'c' for a pixel or color
+type.
+
+Variable names cannot include whitespace.
+
+=item operators
+
+Operators can be split into 3 basic types, those that have a result
+value, those that don't and the null operator, eg. jump has no value.
+
+The format for operators that return a value is typically:
+
+=over 4
+
+I<result> = I<operator> I<operand> ...
+
+=back
+
+and for those that don't return a value:
+
+=over 4
+
+I<operator> I<operand>
+
+=back
+
+where operator is any valid regmach operator, result is any variable
+defined with C<var>, and operands are variables, constants or
+literals, or for jump operators, labels.
+
+The set operator can be simplified to:
+
+=over 4
+
+I<result> = I<operator>
+
+=back
+
+All operators maybe preceded by a label, which is any non-whitespace
+text immediately followed by a colon (':').
+
+=back
+
+=head1 BUGS
+
+Note that the current optimizer may produce incorrect optimization for
+your code, fortunately the optimizer will disable itself if you
+include any jump operator in your code. A single jump to anywhere
+after your final ret operator can be used to disable the optimizer
+without slowing down your code.
+
+There's currently no high-level code generation that can generate code
+with loops or real conditions.
+
+=head1 SEE ALSO
+
+Imager(3), transform.perl, regmach.c
+
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/ExtUtils.pm b/Master/tlpkg/tlperl.straw/lib/Imager/ExtUtils.pm
new file mode 100755
index 00000000000..a43a7bc418d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/ExtUtils.pm
@@ -0,0 +1,135 @@
+package Imager::ExtUtils;
+use strict;
+use File::Spec;
+
+use vars qw($VERSION);
+
+$VERSION = "1.002";
+
+=head1 NAME
+
+Imager::ExtUtils - functions handy in writing Imager extensions
+
+=head1 SYNOPSIS
+
+ # make Imager easier to use with Inline
+ # perldoc Imager::Inline
+ use Inline with => 'Imager';
+
+=head1 DESCRIPTION
+
+=over
+
+=item base_dir
+
+Returns the base directory where Imager is installed.
+
+=cut
+
+# figure out where Imager is installed
+sub base_dir {
+ for my $inc_dir (@INC) {
+ if (-e "$inc_dir/Imager.pm") {
+ my $base_dir = $inc_dir;
+ unless (File::Spec->file_name_is_absolute($base_dir)) {
+ $base_dir = File::Spec->rel2abs($base_dir);
+ }
+ return $base_dir;
+ }
+ }
+
+ die "Cannot locate an installed Imager!";
+}
+
+=item inline_config
+
+Implements Imager's Inline::C C<with> hook.
+
+=cut
+
+sub inline_config {
+ my ($class) = @_;
+ my $base = base_dir();
+
+ return
+ {
+ INC => $class->includes,
+ TYPEMAPS => $class->typemap,
+ AUTO_INCLUDE => <<CODE,
+/* Inserted by Imager $Imager::VERSION */
+#include "imext.h"
+#include "imperl.h"
+DEFINE_IMAGER_CALLBACKS;
+CODE
+ BOOT => 'PERL_INITIALIZE_IMAGER_CALLBACKS;',
+ FILTERS => \&_inline_filter,
+ };
+}
+
+my @inline_replace =
+ qw(
+ Imager::ImgRaw
+ Imager::Color::Float
+ Imager::Color
+ Imager::IO
+ );
+
+my %inline_replace =
+ map { (my $tmp = $_) =~ s/::/__/g; $_ => $tmp } @inline_replace;
+
+my $inline_replace_re = "\\b(" . join('|', @inline_replace) . ")\\b";
+
+sub _inline_filter {
+ my $code = shift;
+
+ $code =~ s/$inline_replace_re/$inline_replace{$1}/g;
+
+ $code;
+}
+
+=item includes
+
+Returns -I options suitable for use with ExtUtils::MakeMaker's INC
+option.
+
+=cut
+
+sub includes {
+ my $class = shift;
+ my $base = $class->base_dir();
+
+ "-I" . $base . '/Imager/include',
+}
+
+=item typemap
+
+Returns the full path to Imager's installed typemap.
+
+=cut
+
+sub typemap {
+ my $class = shift;
+ my $base = $class->base_dir();
+
+ $base . '/Imager/typemap';
+}
+
+1;
+
+__END__
+
+=back
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=head1 REVISION
+
+$Revision$
+
+=head1 SEE ALSO
+
+Imager, Imager::API, Imager::Inline, Imager::APIRef.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/File/CUR.pm b/Master/tlpkg/tlperl.straw/lib/Imager/File/CUR.pm
new file mode 100755
index 00000000000..7c3570c729f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/File/CUR.pm
@@ -0,0 +1,7 @@
+package Imager::File::CUR;
+use strict;
+
+# all the work is done by Imager::File::ICO
+use Imager::File::ICO;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/File/ICO.pm b/Master/tlpkg/tlperl.straw/lib/Imager/File/ICO.pm
new file mode 100755
index 00000000000..56ee231a016
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/File/ICO.pm
@@ -0,0 +1,176 @@
+package Imager::File::ICO;
+use strict;
+use Imager;
+use vars qw($VERSION @ISA);
+
+BEGIN {
+ $VERSION = "0.01";
+
+ eval {
+ require XSLoader;
+ XSLoader::load('Imager::File::ICO', $VERSION);
+ 1;
+ } or do {
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ bootstrap Imager::File::ICO $VERSION;
+ };
+}
+
+Imager->register_reader
+ (
+ type=>'ico',
+ single =>
+ sub {
+ my ($im, $io, %hsh) = @_;
+ my $masked =
+ exists $hsh{ico_masked} ? $hsh{ico_masked} : 1;
+ $im->{IMG} = i_readico_single($io, $hsh{page} || 0, $masked);
+
+ unless ($im->{IMG}) {
+ $im->_set_error(Imager->_error_as_msg);
+ return;
+ }
+ return $im;
+ },
+ multiple =>
+ sub {
+ my ($io, %hsh) = @_;
+
+ my $masked =
+ exists $hsh{ico_masked} ? $hsh{ico_masked} : 1;
+ my @imgs = i_readico_multi($io, $masked);
+ unless (@imgs) {
+ Imager->_set_error(Imager->_error_as_msg);
+ return;
+ }
+ return map {
+ bless { IMG => $_, DEBUG => $Imager::DEBUG, ERRSTR => undef }, 'Imager'
+ } @imgs;
+ },
+ );
+
+# the readers can read CUR files too
+Imager->register_reader
+ (
+ type=>'cur',
+ single =>
+ sub {
+ my ($im, $io, %hsh) = @_;
+ my $masked =
+ exists $hsh{ico_masked} ? $hsh{ico_masked} : 1;
+ $im->{IMG} = i_readico_single($io, $hsh{page} || 0, $masked);
+
+ unless ($im->{IMG}) {
+ $im->_set_error(Imager->_error_as_msg);
+ return;
+ }
+ return $im;
+ },
+ multiple =>
+ sub {
+ my ($io, %hsh) = @_;
+
+ my $masked =
+ exists $hsh{ico_masked} ? $hsh{ico_masked} : 1;
+ my @imgs = i_readico_multi($io, $masked);
+ unless (@imgs) {
+ Imager->_set_error(Imager->_error_as_msg);
+ return;
+ }
+ return map {
+ bless { IMG => $_, DEBUG => $Imager::DEBUG, ERRSTR => undef }, 'Imager'
+ } @imgs;
+ },
+ );
+
+Imager->register_writer
+ (
+ type=>'ico',
+ single =>
+ sub {
+ my ($im, $io, %hsh) = @_;
+
+ unless (i_writeico_wiol($io, $im->{IMG})) {
+ $im->_set_error(Imager->_error_as_msg);
+ return;
+ }
+ return $im;
+ },
+ multiple =>
+ sub {
+ my ($class, $io, $opts, @images) = @_;
+
+ if (!i_writeico_multi_wiol($io, map $_->{IMG}, @images)) {
+ Imager->_set_error(Imager->_error_as_msg);
+ return;
+ }
+
+ return 1;
+ },
+ );
+
+Imager->register_writer
+ (
+ type=>'cur',
+ single =>
+ sub {
+ my ($im, $io, %hsh) = @_;
+
+ unless (i_writecur_wiol($io, $im->{IMG})) {
+ $im->_set_error(Imager->_error_as_msg);
+ return;
+ }
+ return $im;
+ },
+ multiple =>
+ sub {
+ my ($class, $io, $opts, @images) = @_;
+
+ if (!i_writecur_multi_wiol($io, map $_->{IMG}, @images)) {
+ Imager->_set_error(Imager->_error_as_msg);
+ return;
+ }
+
+ return 1;
+ },
+ );
+
+1;
+
+__END__
+
+=head1 NAME
+
+Imager::File::ICO - read MS Icon files
+
+=head1 SYNOPSIS
+
+ use Imager;
+
+ my $img = Imager->new;
+ $img->read(file=>"foo.ico")
+ or die $img->errstr;
+
+ my @imgs = Imager->read_multi(file => "foo.ico")
+ or die Imager->errstr;
+
+ $img->write(file => "foo.ico")
+ or die $img->errstr;
+
+ Imager->write_multi({ file => "foo.ico" }, @imgs)
+ or die Imager->errstr;
+
+=head1 DESCRIPTION
+
+Imager's MS Icon support is documented in L<Imager::Files>.
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=head1 SEE ALSO
+
+Imager, Imager::Files.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/File/SGI.pm b/Master/tlpkg/tlperl.straw/lib/Imager/File/SGI.pm
new file mode 100755
index 00000000000..67cc6a9babb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/File/SGI.pm
@@ -0,0 +1,89 @@
+package Imager::File::SGI;
+use strict;
+use Imager;
+use vars qw($VERSION @ISA);
+
+BEGIN {
+ $VERSION = "0.01";
+
+ eval {
+ require XSLoader;
+ XSLoader::load('Imager::File::SGI', $VERSION);
+ 1;
+ } or do {
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ bootstrap Imager::File::SGI $VERSION;
+ };
+}
+
+Imager->register_reader
+ (
+ type=>'sgi',
+ single =>
+ sub {
+ my ($im, $io, %hsh) = @_;
+ $im->{IMG} = i_readsgi_wiol($io, $hsh{page} || 0);
+
+ unless ($im->{IMG}) {
+ $im->_set_error(Imager->_error_as_msg);
+ return;
+ }
+ return $im;
+ },
+ );
+
+Imager->register_writer
+ (
+ type=>'sgi',
+ single =>
+ sub {
+ my ($im, $io, %hsh) = @_;
+
+ $im->_set_opts(\%hsh, "i_", $im);
+ $im->_set_opts(\%hsh, "sgi_", $im);
+
+ unless (i_writesgi_wiol($io, $im->{IMG})) {
+ $im->_set_error(Imager->_error_as_msg);
+ return;
+ }
+ return $im;
+ },
+ );
+
+__END__
+
+=head1 NAME
+
+Imager::File::ICO - read MS Icon files
+
+=head1 SYNOPSIS
+
+ use Imager;
+
+ my $img = Imager->new;
+ $img->read(file=>"foo.ico")
+ or die $img->errstr;
+
+ my @imgs = Imager->read_multi(file => "foo.ico")
+ or die Imager->errstr;
+
+ $img->write(file => "foo.ico")
+ or die $img->errstr;
+
+ Imager->write_multi({ file => "foo.ico" }, @imgs)
+ or die Imager->errstr;
+
+=head1 DESCRIPTION
+
+Imager's MS Icon support is documented in L<Imager::Files>.
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=head1 SEE ALSO
+
+Imager, Imager::Files.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Files.pod b/Master/tlpkg/tlperl.straw/lib/Imager/Files.pod
new file mode 100755
index 00000000000..b7d612bf4d4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Files.pod
@@ -0,0 +1,1608 @@
+=head1 NAME
+
+Imager::Files - working with image files
+
+=head1 SYNOPSIS
+
+ use Imager;
+ my $img = ...;
+ $img->write(file=>$filename, type=>$type)
+ or die "Cannot write: ",$img->errstr;
+
+ # type is optional if we can guess the format from the filename
+ $img->write(file => "foo.png")
+ or die "Cannot write: ",$img->errstr;
+
+ $img = Imager->new;
+ $img->read(file=>$filename, type=>$type)
+ or die "Cannot read: ", $img->errstr;
+
+ # type is optional if we can guess the type from the file data
+ # and we normally can guess
+ $img->read(file => $filename)
+ or die "Cannot read: ", $img->errstr;
+
+ Imager->write_multi({ file=> $filename, ... }, @images)
+ or die "Cannot write: ", Imager->errstr;
+
+ my @imgs = Imager->read_multi(file=>$filename)
+ or die "Cannot read: ", Imager->errstr;
+
+ Imager->set_file_limits(width=>$max_width, height=>$max_height)
+
+ my @read_types = Imager->read_types;
+ my @write_types = Imager->write_types;
+
+ # we can write/write_multi to things other than filenames
+ my $data;
+ $img->write(data => \$data, type => $type) or die;
+
+ my $fh = ... ; # eg. IO::File
+ $img->write(fh => $fh, type => $type) or die;
+
+ $img->write(fd => fileno($fh), type => $type) or die;
+
+ # some file types need seek callbacks too
+ $img->write(callback => \&write_callback, type => $type) or die;
+
+ # and similarly for read/read_multi
+ $img->read(data => $data) or die;
+ $img->read(fh => $fh) or die;
+ $img->read(fd => fileno($fh)) or die;
+ $img->read(callback => \&read_callback) or die;
+
+ use Imager 0.68;
+ my $img = Imager->new(file => $filename)
+ or die Imager->errstr;
+
+=head1 DESCRIPTION
+
+You can read and write a variety of images formats, assuming you have
+the appropriate libraries, and images can be read or written to/from
+files, file handles, file descriptors, scalars, or through callbacks.
+
+To see which image formats Imager is compiled to support the following
+code snippet is sufficient:
+
+ use Imager;
+ print join " ", keys %Imager::formats;
+
+This will include some other information identifying libraries rather
+than file formats. For new code you might find the L</read_types> or
+L</write_types> methods useful.
+
+=over
+
+=item read
+
+Reading writing to and from files is simple, use the C<read()>
+method to read an image:
+
+ my $img = Imager->new;
+ $img->read(file=>$filename, type=>$type)
+ or die "Cannot read $filename: ", $img->errstr;
+
+In most cases Imager can auto-detect the file type, so you can just
+supply the filename:
+
+ $img->read(file => $filename)
+ or die "Cannot read $filename: ", $img->errstr;
+
+The read() method accepts the C<allow_partial> parameter. If this is
+non-zero then read() can return true on an incomplete image and set
+the C<i_incomplete> tag.
+
+From Imager 0.68 you can supply most read() parameters to the new()
+method to read the image file on creation. If the read fails, check
+Imager->errstr() for the cause:
+
+ use Imager 0.68;
+ my $img = Imager->new(file => $filename)
+ or die "Cannot read $filename: ", Imager->errstr;
+
+=item write
+
+and the C<write()> method to write an image:
+
+ $img->write(file=>$filename, type=>$type)
+ or die "Cannot write $filename: ", $img->errstr;
+
+=item read_multi
+
+If you're reading from a format that supports multiple images per
+file, use the C<read_multi()> method:
+
+ my @imgs = Imager->read_multi(file=>$filename, type=>$type)
+ or die "Cannot read $filename: ", Imager->errstr;
+
+As with the read() method, Imager will normally detect the C<type>
+automatically.
+
+=item write_multi
+
+and if you want to write multiple images to a single file use the
+C<write_multi()> method:
+
+ Imager->write_multi({ file=> $filename, type=>$type }, @images)
+ or die "Cannot write $filename: ", Imager->errstr;
+
+=item read_types
+
+This is a class method that returns a list of the image file types
+that Imager can read.
+
+ my @types = Imager->read_types;
+
+These types are the possible values for the C<type> parameter, not
+necessarily the extension of the files you're reading.
+
+It is possible for extra file read handlers to be loaded when
+attempting to read a file, which may modify the list of available read
+types.
+
+=item write_types
+
+This is a class method that returns a list of the image file types
+that Imager can write.
+
+ my @types = Imager->write_types;
+
+Note that these are the possible values for the C<type> parameter, not
+necessarily the extension of the files you're writing.
+
+It is possible for extra file write handlers to be loaded when
+attempting to write a file, which may modify the list of available
+write types.
+
+=back
+
+When writing, if the I<filename> includes an extension that Imager
+recognizes, then you don't need the I<type>, but you may want to
+provide one anyway. See L</Guessing types> for information on
+controlling this recognition.
+
+The C<type> parameter is a lowercase representation of the file type,
+and can be any of the following:
+
+ bmp Windows BitMaP (BMP)
+ gif Graphics Interchange Format (GIF)
+ jpeg JPEG/JFIF
+ png Portable Network Graphics (PNG)
+ pnm Portable aNyMap (PNM)
+ raw Raw
+ sgi SGI .rgb files
+ tga TARGA
+ tiff Tagged Image File Format (TIFF)
+
+When you read an image, Imager may set some tags, possibly including
+information about the spatial resolution, textual information, and
+animation information. See L<Imager::ImageTypes/Tags> for specifics.
+
+The open() method is a historical alias for the read() method.
+
+=head2 Input and output
+
+When reading or writing you can specify one of a variety of sources or
+targets:
+
+=over
+
+=item *
+
+file - The C<file> parameter is the name of the image file to be
+written to or read from. If Imager recognizes the extension of the
+file you do not need to supply a C<type>.
+
+ # write in tiff format
+ $image->write(file => "example.tif")
+ or die $image->errstr;
+
+ $image->write(file => 'foo.tmp', type => 'tiff')
+ or die $image->errstr;
+
+ my $image = Imager->new;
+ $image->read(file => 'example.tif')
+ or die $image->errstr;
+
+=item *
+
+fh - C<fh> is a file handle, typically either returned from
+C<<IO::File->new()>>, or a glob from an C<open> call. You should call
+C<binmode> on the handle before passing it to Imager.
+
+Imager will set the handle to autoflush to make sure any buffered data
+is flushed , since Imager will write to the file descriptor (from
+fileno()) rather than writing at the perl level.
+
+ $image->write(fh => \*STDOUT, type => 'gif')
+ or die $image->errstr;
+
+ # for example, a file uploaded via CGI.pm
+ $image->read(fd => $cgi->param('file'))
+ or die $image->errstr;
+
+=item *
+
+fd - C<fd> is a file descriptor. You can get this by calling the
+C<fileno()> function on a file handle, or by using one of the standard
+file descriptor numbers.
+
+If you get this from a perl file handle, you may need to flush any
+buffered output, otherwise it may appear in the output stream after
+the image.
+
+ $image->write(fd => file(STDOUT), type => 'gif')
+ or die $image->errstr;
+
+=item *
+
+data - When reading data, C<data> is a scalar containing the image
+file data, when writing, C<data> is a reference to the scalar to save
+the image file data too. For GIF images you will need giflib 4 or
+higher, and you may need to patch giflib to use this option for
+writing.
+
+ my $data;
+ $image->write(data => \$data, type => 'tiff')
+ or die $image->errstr;
+
+ my $data = $row->{someblob}; # eg. from a database
+ my @images = Imager->read_multi(data => $data)
+ or die Imager->errstr;
+
+=item *
+
+callback - Imager will make calls back to your supplied coderefs to
+read, write and seek from/to/through the image file.
+
+When reading from a file you can use either C<callback> or C<readcb>
+to supply the read callback, and when writing C<callback> or
+C<writecb> to supply the write callback.
+
+When writing you can also supply the C<maxbuffer> option to set the
+maximum amount of data that will be buffered before your write
+callback is called. Note: the amount of data supplied to your
+callback can be smaller or larger than this size.
+
+The read callback is called with 2 parameters, the minimum amount of
+data required, and the maximum amount that Imager will store in it's C
+level buffer. You may want to return the minimum if you have a slow
+data source, or the maximum if you have a fast source and want to
+prevent many calls to your perl callback. The read data should be
+returned as a scalar.
+
+Your write callback takes exactly one parameter, a scalar containing
+the data to be written. Return true for success.
+
+The seek callback takes 2 parameters, a I<POSITION>, and a I<WHENCE>,
+defined in the same way as perl's seek function.
+
+You can also supply a C<closecb> which is called with no parameters
+when there is no more data to be written. This could be used to flush
+buffered data.
+
+ # contrived
+ my $data;
+ sub mywrite {
+ $data .= unpack("H*", shift);
+ 1;
+ }
+ Imager->write_multi({ callback => \&mywrite, type => 'gif'}, @images)
+ or die Imager->errstr;
+
+Note that for reading you'll almost always need to provide a
+C<seekcb>.
+
+=back
+
+=head2 Guessing types
+
+When writing to a file, if you don't supply a C<type> parameter Imager
+will attempt to guess it from the filename. This is done by calling
+the code reference stored in C<$Imager::FORMATGUESS>. This is only
+done when write() or write_multi() is called with a C<file> parameter.
+
+The default function value of C<$Imager::FORMATGUESS> is
+C<\&Imager::def_guess_type>.
+
+=over
+
+=item def_guess_type
+
+This is the default function Imager uses to derive a file type from a
+file name. This is a function, not a method.
+
+Accepts a single parameter, the filename and returns the type or
+undef.
+
+=back
+
+You can replace function with your own implementation if you have some
+specialized need. The function takes a single parameter, the name of
+the file, and should return either a file type or under.
+
+ # I'm writing jpegs to weird filenames
+ local $Imager::FORMATGUESS = sub { 'jpeg' };
+
+When reading a file Imager examines beginning of the file for
+identifying information. The current implementation attempts to
+detect the following image types beyond those supported by Imager:
+
+=over
+
+xpm, mng, jng, SGI RGB, ilbm, pcx, fits, psd (Photoshop), eps, Utah
+RLE
+
+=back
+
+=head2 Limiting the sizes of images you read
+
+=over
+
+=item set_file_limits
+
+In some cases you will be receiving images from an untested source,
+such as submissions via CGI. To prevent such images from consuming
+large amounts of memory, you can set limits on the dimensions of
+images you read from files:
+
+=over
+
+=item *
+
+width - limit the width in pixels of the image
+
+=item *
+
+height - limit the height in pixels of the image
+
+=item *
+
+bytes - limits the amount of storage used by the image. This depends
+on the width, height, channels and sample size of the image. For
+paletted images this is calculated as if the image was expanded to a
+direct color image.
+
+=back
+
+To set the limits, call the class method set_file_limits:
+
+ Imager->set_file_limits(width=>$max_width, height=>$max_height);
+
+You can pass any or all of the limits above, any limits you do not
+pass are left as they were.
+
+Any limit of zero is treated as unlimited.
+
+By default, all of the limits are zero, or unlimited.
+
+You can reset all of the limited to their defaults by passing in the
+reset parameter as a true value:
+
+ # no limits
+ Imager->set_file_limits(reset=>1);
+
+This can be used with the other limits to reset all but the limit you
+pass:
+
+ # only width is limited
+ Imager->set_file_limits(reset=>1, width=>100);
+
+ # only bytes is limited
+ Imager->set_file_limits(reset=>1, bytes=>10_000_000);
+
+=item get_file_limits
+
+You can get the current limits with the get_file_limits() method:
+
+ my ($max_width, $max_height, $max_bytes) =
+ Imager->get_file_limits();
+
+=back
+
+=head1 TYPE SPECIFIC INFORMATION
+
+The different image formats can write different image type, and some have
+different options to control how the images are written.
+
+When you call C<write()> or C<write_multi()> with an option that has
+the same name as a tag for the image format you're writing, then the
+value supplied to that option will be used to set the corresponding
+tag in the image. Depending on the image format, these values will be
+used when writing the image.
+
+This replaces the previous options that were used when writing GIF
+images. Currently if you use an obsolete option, it will be converted
+to the equivalent tag and Imager will produced a warning. You can
+suppress these warnings by calling the C<Imager::init()> function with
+the C<warn_obsolete> option set to false:
+
+ Imager::init(warn_obsolete=>0);
+
+At some point in the future these obsolete options will no longer be
+supported.
+
+=head2 PNM (Portable aNy Map)
+
+Imager can write PGM (Portable Gray Map) and PPM (Portable PixMaps)
+files, depending on the number of channels in the image. Currently
+the images are written in binary formats. Only 1 and 3 channel images
+can be written, including 1 and 3 channel paletted images.
+
+ $img->write(file=>'foo.ppm') or die $img->errstr;
+
+Imager can read both the ASCII and binary versions of each of the PBM
+(Portable BitMap), PGM and PPM formats.
+
+ $img->read(file=>'foo.ppm') or die $img->errstr;
+
+PNM does not support the spatial resolution tags.
+
+The following tags are set when reading a PNM file:
+
+=over
+
+=item *
+
+X<pnm_maxval>pnm_maxval - the maxvals number from the PGM/PPM header.
+Always set to 2 for a PBM file.
+
+=item *
+
+X<pnm_type>pnm_type - the type number from the PNM header, 1 for ASCII
+PBM files, 2 for ASCII PGM files, 3 for ASCII PPM files, 4 for binary
+PBM files, 5 for binary PGM files, 6 for binary PPM files.
+
+=back
+
+The following tag is checked when writing an image with more than
+8-bits/sample:
+
+=over
+
+=item *
+
+X<pnm_write_wide_data>pnm_write_wide_data - if this is non-zero then
+write() can write PGM/PPM files with 16-bits/sample. Some
+applications, for example GIMP 2.2, and tools can only read
+8-bit/sample binary PNM files, so Imager will only write a 16-bit
+image when this tag is non-zero.
+
+=back
+
+=head2 JPEG
+
+You can supply a C<jpegquality> parameter (0-100) when writing a JPEG
+file, which defaults to 75%. If you write an image with an alpha
+channel to a jpeg file then it will be composited against the
+background set by the C<i_background> parameter (or tag).
+
+ $img->write(file=>'foo.jpg', jpegquality=>90) or die $img->errstr;
+
+Imager will read a grayscale JPEG as a 1 channel image and a color
+JPEG as a 3 channel image.
+
+ $img->read(file=>'foo.jpg') or die $img->errstr;
+
+The following tags are set in a JPEG image when read, and can be set
+to control output:
+
+=over
+
+=item jpeg_density_unit
+
+The value of the density unit field in the JFIF header. This is
+ignored on writing if the C<i_aspect_only> tag is non-zero.
+
+The C<i_xres> and C<i_yres> tags are expressed in pixels per inch no
+matter the value of this tag, they will be converted to/from the value
+stored in the JPEG file.
+
+=item jpeg_density_unit_name
+
+This is set when reading a JPEG file to the name of the unit given by
+C<jpeg_density_unit>. Possible results include C<inch>,
+C<centimeter>, C<none> (the C<i_aspect_only> tag is also set reading
+these files). If the value of jpeg_density_unit is unknown then this
+tag isn't set.
+
+=item jpeg_comment
+
+Text comment.
+
+=back
+
+JPEG supports the spatial resolution tags C<i_xres>, C<i_yres> and
+C<i_aspect_only>.
+
+If an APP1 block containing EXIF information is found, then any of the
+following tags can be set:
+
+=over
+
+exif_aperture exif_artist exif_brightness exif_color_space
+exif_contrast exif_copyright exif_custom_rendered exif_date_time
+exif_date_time_digitized exif_date_time_original
+exif_digital_zoom_ratio exif_exposure_bias exif_exposure_index
+exif_exposure_mode exif_exposure_program exif_exposure_time
+exif_f_number exif_flash exif_flash_energy exif_flashpix_version
+exif_focal_length exif_focal_length_in_35mm_film
+exif_focal_plane_resolution_unit exif_focal_plane_x_resolution
+exif_focal_plane_y_resolution exif_gain_control exif_image_description
+exif_image_unique_id exif_iso_speed_rating exif_make exif_max_aperture
+exif_metering_mode exif_model exif_orientation exif_related_sound_file
+exif_resolution_unit exif_saturation exif_scene_capture_type
+exif_sensing_method exif_sharpness exif_shutter_speed exif_software
+exif_spectral_sensitivity exif_sub_sec_time
+exif_sub_sec_time_digitized exif_sub_sec_time_original
+exif_subject_distance exif_subject_distance_range
+exif_subject_location exif_tag_light_source exif_user_comment
+exif_version exif_white_balance exif_x_resolution exif_y_resolution
+
+=back
+
+The following derived tags can also be set:
+
+=over
+
+exif_color_space_name exif_contrast_name exif_custom_rendered_name
+exif_exposure_mode_name exif_exposure_program_name exif_flash_name
+exif_focal_plane_resolution_unit_name exif_gain_control_name
+exif_light_source_name exif_metering_mode_name
+exif_resolution_unit_name exif_saturation_name
+exif_scene_capture_type_name exif_sensing_method_name
+exif_sharpness_name exif_subject_distance_range_name
+exif_white_balance_name
+
+=back
+
+The derived tags are for enumerated fields, when the value for the
+base field is valid then the text that appears in the EXIF
+specification for that value appears in the derived field. So for
+example if C<exf_metering_mode> is C<5> then
+C<exif_metering_mode_name> is set to C<Pattern>.
+
+eg.
+
+ my $image = Imager->new;
+ $image->read(file => 'exiftest.jpg')
+ or die "Cannot load image: ", $image->errstr;
+ print $image->tags(name => "exif_image_description"), "\n";
+ print $image->tags(name => "exif_exposure_mode"), "\n";
+ print $image->tags(name => "exif_exposure_mode_name"), "\n";
+
+ # for the exiftest.jpg in the Imager distribution the output would be:
+ Imager Development Notes
+ 0
+ Auto exposure
+
+=over
+
+=item parseiptc
+
+Historically, Imager saves IPTC data when reading a JPEG image, the
+parseiptc() method returns a list of key/value pairs resulting from a
+simple decoding of that data.
+
+Any future IPTC data decoding is likely to go into tags.
+
+=back
+
+=head2 GIF (Graphics Interchange Format)
+
+When writing one of more GIF images you can use the same
+L<Quantization Options|Imager::ImageTypes> as you can when converting
+an RGB image into a paletted image.
+
+When reading a GIF all of the sub-images are combined using the screen
+size and image positions into one big image, producing an RGB image.
+This may change in the future to produce a paletted image where possible.
+
+When you read a single GIF with C<$img-E<gt>read()> you can supply a
+reference to a scalar in the C<colors> parameter, if the image is read
+the scalar will be filled with a reference to an anonymous array of
+L<Imager::Color> objects, representing the palette of the image. This
+will be the first palette found in the image. If you want the
+palettes for each of the images in the file, use C<read_multi()> and
+use the C<getcolors()> method on each image.
+
+GIF does not support the spatial resolution tags.
+
+Imager will set the following tags in each image when reading, and can
+use most of them when writing to GIF:
+
+=over
+
+=item *
+
+gif_left - the offset of the image from the left of the "screen"
+("Image Left Position")
+
+=item *
+
+gif_top - the offset of the image from the top of the "screen" ("Image
+Top Position")
+
+=item *
+
+gif_interlace - non-zero if the image was interlaced ("Interlace
+Flag")
+
+=item *
+
+gif_screen_width, gif_screen_height - the size of the logical
+screen. When writing this is used as the minimum. If any image being
+written would extend beyond this then the screen size is extended.
+("Logical Screen Width", "Logical Screen Height").
+
+=item *
+
+gif_local_map - Non-zero if this image had a local color map. If set
+for an image when writing the image is quantized separately from the
+other images in the file.
+
+=item *
+
+gif_background - The index in the global colormap of the logical
+screen's background color. This is only set if the current image uses
+the global colormap. You can set this on write too, but for it to
+choose the color you want, you will need to supply only paletted
+images and set the C<gif_eliminate_unused> tag to 0.
+
+=item *
+
+gif_trans_index - The index of the color in the colormap used for
+transparency. If the image has a transparency then it is returned as
+a 4 channel image with the alpha set to zero in this palette entry.
+This value is not used when writing. ("Transparent Color Index")
+
+=item *
+
+gif_trans_color - A reference to an Imager::Color object, which is the
+colour to use for the palette entry used to represent transparency in
+the palette. You need to set the transp option (see L<Quantization
+options>) for this value to be used.
+
+=item *
+
+gif_delay - The delay until the next frame is displayed, in 1/100 of a
+second. ("Delay Time").
+
+=item *
+
+gif_user_input - whether or not a user input is expected before
+continuing (view dependent) ("User Input Flag").
+
+=item *
+
+gif_disposal - how the next frame is displayed ("Disposal Method")
+
+=item *
+
+gif_loop - the number of loops from the Netscape Loop extension. This
+may be zero to loop forever.
+
+=item *
+
+gif_comment - the first block of the first gif comment before each
+image.
+
+=item *
+
+gif_eliminate_unused - If this is true, when you write a paletted
+image any unused colors will be eliminated from its palette. This is
+set by default.
+
+=item *
+
+gif_colormap_size - the original size of the color map for the image.
+The color map of the image may have been expanded to include out of
+range color indexes.
+
+=back
+
+Where applicable, the ("name") is the name of that field from the GIF89
+standard.
+
+The following gif writing options are obsolete, you should set the
+corresponding tag in the image, either by using the tags functions, or
+by supplying the tag and value as options.
+
+=over
+
+=item *
+
+gif_each_palette - Each image in the gif file has it's own palette if
+this is non-zero. All but the first image has a local colour table
+(the first uses the global colour table.
+
+Use C<gif_local_map> in new code.
+
+=item *
+
+interlace - The images are written interlaced if this is non-zero.
+
+Use C<gif_interlace> in new code.
+
+=item *
+
+gif_delays - A reference to an array containing the delays between
+images, in 1/100 seconds.
+
+Use C<gif_delay> in new code.
+
+=item *
+
+gif_positions - A reference to an array of references to arrays which
+represent screen positions for each image.
+
+New code should use the C<gif_left> and C<gif_top> tags.
+
+=item *
+
+gif_loop_count - If this is non-zero the Netscape loop extension block
+is generated, which makes the animation of the images repeat.
+
+This is currently unimplemented due to some limitations in giflib.
+
+=back
+
+You can supply a C<page> parameter to the C<read()> method to read
+some page other than the first. The page is 0 based:
+
+ # read the second image in the file
+ $image->read(file=>"example.gif", page=>1)
+ or die "Cannot read second page: ",$image->errstr,"\n";
+
+Before release 0.46, Imager would read multi-image GIF image files
+into a single image, overlaying each of the images onto the virtual
+GIF screen.
+
+As of 0.46 the default is to read the first image from the file, as if
+called with C<< page => 0 >>.
+
+You can return to the previous behaviour by calling read with the
+C<gif_consolidate> parameter set to a true value:
+
+ $img->read(file=>$some_gif_file, gif_consolidate=>1);
+
+As with the to_paletted() method, if you supply a colors parameter as
+a reference to an array, this will be filled with Imager::Color
+objects of the color table generated for the image file.
+
+=head2 TIFF (Tagged Image File Format)
+
+Imager can write images to either paletted or RGB TIFF images,
+depending on the type of the source image. Currently if you write a
+16-bit/sample or double/sample image it will be written as an
+8-bit/sample image. Only 1 or 3 channel images can be written.
+
+If you are creating images for faxing you can set the I<class>
+parameter set to C<fax>. By default the image is written in fine
+mode, but this can be overridden by setting the I<fax_fine> parameter
+to zero. Since a fax image is bi-level, Imager uses a threshold to
+decide if a given pixel is black or white, based on a single channel.
+For greyscale images channel 0 is used, for color images channel 1
+(green) is used. If you want more control over the conversion you can
+use $img->to_paletted() to product a bi-level image. This way you can
+use dithering:
+
+ my $bilevel = $img->to_paletted(make_colors => 'mono',
+ translate => 'errdiff',
+ errdiff => 'stucki');
+
+=over
+
+=item class
+
+If set to 'fax' the image will be written as a bi-level fax image.
+
+=item fax_fine
+
+By default when I<class> is set to 'fax' the image is written in fine
+mode, you can select normal mode by setting I<fax_fine> to 0.
+
+=back
+
+Imager should be able to read any TIFF image you supply. Paletted
+TIFF images are read as paletted Imager images, since paletted TIFF
+images have 16-bits/sample (48-bits/color) this means the bottom
+8-bits are lost, but this shouldn't be a big deal. Currently all
+direct color images are read at 8-bits/sample.
+
+TIFF supports the spatial resolution tags. See the
+C<tiff_resolutionunit> tag for some extra options.
+
+As of Imager 0.62 Imager reads:
+
+=over
+
+=item *
+
+16-bit grey, RGB, or CMYK image, including a possible alpha channel as
+a 16-bit/sample image.
+
+=item *
+
+32-bit grey, RGB image, including a possible alpha channel as a
+double/sample image.
+
+=item *
+
+bi-level images as paletted images containing only black and white,
+which other formats will also write as bi-level.
+
+=item *
+
+tiled paletted images are now handled correctly
+
+=back
+
+The following tags are set in a TIFF image when read, and can be set
+to control output:
+
+=over
+
+=item tiff_compression
+
+When reading an image this is set to the numeric value of the TIFF
+compression tag.
+
+On writing you can set this to either a numeric compression tag value,
+or one of the following values:
+
+ Ident Number Description
+ none 1 No compression
+ packbits 32773 Macintosh RLE
+ ccittrle 2 CCITT RLE
+ fax3 3 CCITT Group 3 fax encoding (T.4)
+ t4 3 As above
+ fax4 4 CCITT Group 4 fax encoding (T.6)
+ t6 4 As above
+ lzw 5 LZW
+ jpeg 7 JPEG
+ zip 8 Deflate (GZIP) Non-standard
+ deflate 8 As above.
+ oldzip 32946 Deflate with an older code.
+ ccittrlew 32771 Word aligned CCITT RLE
+
+In general a compression setting will be ignored where it doesn't make
+sense, eg. C<jpeg> will be ignored for compression if the image is
+being written as bilevel.
+
+Imager attempts to check that your build of libtiff supports the given
+compression, and will fallback to C<packbits> if it isn't enabled.
+eg. older distributions didn't include LZW compression, and JPEG
+compression is only available if libtiff is configured with libjpeg's
+location.
+
+ $im->write(file => 'foo.tif', tiff_compression => 'lzw')
+ or die $im->errstr;
+
+=item tiff_jpegquality
+
+If I<tiff_compression> if C<jpeg> then this can be a number from 1 to
+100 giving the JPEG compression quality. High values are better
+quality and larger files.
+
+=item tiff_resolutionunit
+
+The value of the ResolutionUnit tag. This is ignored on writing if
+the i_aspect_only tag is non-zero.
+
+The C<i_xres> and C<i_yres> tags are expressed in pixels per inch no
+matter the value of this tag, they will be converted to/from the value
+stored in the TIFF file.
+
+=item tiff_resolutionunit_name
+
+This is set when reading a TIFF file to the name of the unit given by
+C<tiff_resolutionunit>. Possible results include C<inch>,
+C<centimeter>, C<none> (the C<i_aspect_only> tag is also set reading
+these files) or C<unknown>.
+
+=item tiff_bitspersample
+
+Bits per sample from the image. This value is not used when writing
+an image, it is only set on a read image.
+
+=item tiff_photometric
+
+Value of the PhotometricInterpretation tag from the image. This value
+is not used when writing an image, it is only set on a read image.
+
+=item tiff_documentname
+
+=item tiff_imagedescription
+
+=item tiff_make
+
+=item tiff_model
+
+=item tiff_pagename
+
+=item tiff_software
+
+=item tiff_datetime
+
+=item tiff_artist
+
+=item tiff_hostcomputer
+
+Various strings describing the image. tiff_datetime must be formatted
+as "YYYY:MM:DD HH:MM:SS". These correspond directly to the mixed case
+names in the TIFF specification. These are set in images read from a
+TIFF and saved when writing a TIFF image.
+
+=back
+
+You can supply a C<page> parameter to the C<read()> method to read
+some page other than the first. The page is 0 based:
+
+ # read the second image in the file
+ $image->read(file=>"example.tif", page=>1)
+ or die "Cannot read second page: ",$image->errstr,"\n";
+
+Note: Imager uses the TIFF*RGBA* family of libtiff functions,
+unfortunately these don't support alpha channels on CMYK images. This
+will result in a full coverage alpha channel on CMYK images with an
+alpha channel, until this is implemented in libtiff (or Imager's TIFF
+implementation changes.)
+
+If you read an image with multiple alpha channels, then only the first
+alpha channel will be read.
+
+Currently Imager's TIFF support reads all direct color images as 8-bit
+RGB images, this may change in the future to reading 16-bit/sample
+images.
+
+Currently tags that control the output color type and compression are
+ignored when writing, this may change in the future. If you have
+processes that rely upon Imager always producing packbits compressed
+RGB images, you should strip any tags before writing.
+
+=head2 BMP (BitMaP)
+
+Imager can write 24-bit RGB, and 8, 4 and 1-bit per pixel paletted
+Windows BMP files. Currently you cannot write compressed BMP files
+with Imager.
+
+Imager can read 24-bit RGB, and 8, 4 and 1-bit perl pixel paletted
+Windows BMP files. There is some support for reading 16-bit per pixel
+images, but I haven't found any for testing.
+
+BMP has no support for multi-image files.
+
+BMP files support the spatial resolution tags, but since BMP has no
+support for storing only an aspect ratio, if C<i_aspect_only> is set
+when you write the C<i_xres> and C<i_yres> values are scaled so the
+smaller is 72 DPI.
+
+The following tags are set when you read an image from a BMP file:
+
+=over
+
+=item bmp_compression
+
+The type of compression, if any. This can be any of the following
+values:
+
+=over
+
+=item BI_RGB (0)
+
+Uncompressed.
+
+=item BI_RLE8 (1)
+
+8-bits/pixel paletted value RLE compression.
+
+=item BI_RLE4 (2)
+
+4-bits/pixel paletted value RLE compression.
+
+=item BI_BITFIELDS (3)
+
+Packed RGB values.
+
+=back
+
+=item bmp_compression_name
+
+The bmp_compression value as a BI_* string
+
+=item bmp_important_colors
+
+The number of important colors as defined by the writer of the image.
+
+=item bmp_used_colors
+
+Number of color used from the BMP header
+
+=item bmp_filesize
+
+The file size from the BMP header
+
+=item bmp_bit_count
+
+Number of bits stored per pixel. (24, 8, 4 or 1)
+
+=back
+
+=head2 TGA (TarGA)
+
+When storing targa images rle compression can be activated with the
+'compress' parameter, the 'idstring' parameter can be used to set the
+targa comment field and the 'wierdpack' option can be used to use the
+15 and 16 bit targa formats for rgb and rgba data. The 15 bit format
+has 5 of each red, green and blue. The 16 bit format in addition
+allows 1 bit of alpha. The most significant bits are used for each
+channel.
+
+
+Tags:
+
+=over
+
+=item tga_idstring
+
+=item tga_bitspp
+
+=item compressed
+
+=back
+
+=head2 RAW
+
+When reading raw images you need to supply the width and height of the
+image in the xsize and ysize options:
+
+ $img->read(file=>'foo.raw', xsize=>100, ysize=>100)
+ or die "Cannot read raw image\n";
+
+If your input file has more channels than you want, or (as is common),
+junk in the fourth channel, you can use the datachannels and
+storechannels options to control the number of channels in your input
+file and the resulting channels in your image. For example, if your
+input image uses 32-bits per pixel with red, green, blue and junk
+values for each pixel you could do:
+
+ $img->read(file=>'foo.raw', xsize=>100, ysize=>100, datachannels=>4,
+ storechannels=>3)
+ or die "Cannot read raw image\n";
+
+Read parameters:
+
+=over
+
+=item *
+
+raw_interleave - controls the ordering of samples within the image.
+Default: 1. Alternatively and historically spelled C<interleave>.
+Possible values:
+
+=over
+
+=item *
+
+0 - samples are pixel by pixel, so all samples for the first pixel,
+then all samples for the second pixel and so on. eg. for a four pixel
+scanline the channels would be laid out as:
+
+ 012012012012
+
+=item *
+
+1 - samples are line by line, so channel 0 for the entire scanline is
+followed by channel 1 for the entire scanline and so on. eg. for a
+four pixel scanline the channels would be laid out as:
+
+ 000011112222
+
+This is the default.
+
+=back
+
+Unfortunately, historically, the default C<raw_interleave> for read
+has been 1, while writing only supports the C<raw_interleave> = 0
+format.
+
+For future compatibility, you should always supply the
+C<raw_interleave> (or C<interleave>) parameter. As of 0.68, Imager
+will warn if you attempt to read a raw image without a
+C<raw_interleave> parameter.
+
+=item *
+
+raw_storechannels - the number of channels to store in the image.
+Range: 1 to 4. Default: 3. Alternatively and historically spelled
+C<storechannels>.
+
+=item *
+
+raw_datachannels - the number of channels to read from the file.
+Range: 1 or more. Default: 3. Alternatively and historically spelled
+C<datachannels>.
+
+=back
+
+ $img->read(file=>'foo.raw', xsize=100, ysize=>100, raw_interleave=>1)
+ or die "Cannot read raw image\n";
+
+=head2 PNG
+
+There are no PNG specific tags.
+
+=head2 ICO (Microsoft Windows Icon) and CUR (Microsoft Windows Cursor)
+
+Icon and Cursor files are very similar, the only differences being a
+number in the header and the storage of the cursor hotspot. I've
+treated them separately so that you're not messing with tags to
+distinguish between them.
+
+The following tags are set when reading an icon image and are used
+when writing it:
+
+=over
+
+=item ico_mask
+
+This is the AND mask of the icon. When used as an icon in Windows 1
+bits in the mask correspond to pixels that are modified by the source
+image rather than simply replaced by the source image.
+
+Rather than requiring a binary bitmap this is accepted in a specific format:
+
+=over
+
+=item *
+
+first line consisting of the 0 placeholder, the 1 placeholder and a
+newline.
+
+=item *
+
+following lines which contain 0 and 1 placeholders for each scanline
+of the image, starting from the top of the image.
+
+=back
+
+When reading an image, '.' is used as the 0 placeholder and '*' as the
+1 placeholder. An example:
+
+ .*
+ ..........................******
+ ..........................******
+ ..........................******
+ ..........................******
+ ...........................*****
+ ............................****
+ ............................****
+ .............................***
+ .............................***
+ .............................***
+ .............................***
+ ..............................**
+ ..............................**
+ ...............................*
+ ...............................*
+ ................................
+ ................................
+ ................................
+ ................................
+ ................................
+ ................................
+ *...............................
+ **..............................
+ **..............................
+ ***.............................
+ ***.............................
+ ****............................
+ ****............................
+ *****...........................
+ *****...........................
+ *****...........................
+ *****...........................
+
+=back
+
+The following tags are set when reading an icon:
+
+=over
+
+=item ico_bits
+
+The number of bits per pixel used to store the image.
+
+=back
+
+For cursor files the following tags are set and read when reading and
+writing:
+
+=over
+
+=item cur_mask
+
+This is the same as the ico_mask above.
+
+=item cur_hotspotx
+
+=item cur_hotspoty
+
+The "hot" spot of the cursor image. This is the spot on the cursor
+that you click with. If you set these to out of range values they are
+clipped to the size of the image when written to the file.
+
+=back
+
+The following parameters can be supplied to read() or read_multi() to
+control reading of ICO/CUR files:
+
+=over
+
+=item *
+
+ico_masked - if true, the default, then the icon/cursors mask is
+applied as an alpha channel to the image. This may result in a
+paletted image being returned as a direct color image. Default: 1
+
+ # retrieve the image as stored, without using the mask as an alpha
+ # channel
+ $img->read(file => 'foo.ico', ico_masked => 0)
+ or die $img->errstr;
+
+This was introduced in Imager 0.60. Previously reading ICO images
+acted as if C<ico_masked =E<gt> 0>.
+
+=back
+
+C<cur_bits> is set when reading a cursor.
+
+Examples:
+
+ my $img = Imager->new(xsize => 32, ysize => 32, channels => 4);
+ $im->box(color => 'FF0000');
+ $im->write(file => 'box.ico');
+
+ $im->settag(name => 'cur_hotspotx', value => 16);
+ $im->settag(name => 'cur_hotspoty', value => 16);
+ $im->write(file => 'box.cur');
+
+=head2 SGI (RGB, BW)
+
+SGI images, often called by the extensions, RGB or BW, can be stored
+either uncompressed or compressed using an RLE compression.
+
+By default, when saving to an extension of C<rgb>, C<bw>, C<sgi>,
+C<rgba> the file will be saved in SGI format. The file extension is
+otherwise ignored, so saving a 3-channel image to a C<.bw> file will
+result in a 3-channel image on disk.
+
+The following tags are set when reading a SGI image:
+
+=over
+
+=item *
+
+i_comment - the IMAGENAME field from the image. Also written to the
+file when writing.
+
+=item *
+
+sgi_pixmin, sgi_pixmax - the PIXMIN and PIXMAX fields from the image.
+On reading image data is expanded from this range to the full range of
+samples in the image.
+
+=item *
+
+sgi_bpc - the number of bytes per sample for the image. Ignored when
+writing.
+
+=item *
+
+sgi_rle - whether or not the image is compressed. If this is non-zero
+when writing the image will be compressed.
+
+=back
+
+=head1 ADDING NEW FORMATS
+
+To support a new format for reading, call the register_reader() class
+method:
+
+=over
+
+=item register_reader
+
+Registers single or multiple image read functions.
+
+Parameters:
+
+=over
+
+=item *
+
+type - the identifier of the file format, if Imager's
+i_test_format_probe() can identify the format then this value should
+match i_test_format_probe()'s result.
+
+This parameter is required.
+
+=item *
+
+single - a code ref to read a single image from a file. This is
+supplied:
+
+=over
+
+=item *
+
+the object that read() was called on,
+
+=item *
+
+an Imager::IO object that should be used to read the file, and
+
+=item *
+
+all the parameters supplied to the read() method.
+
+=back
+
+The single parameter is required.
+
+=item *
+
+multiple - a code ref which is called to read multiple images from a
+file. This is supplied:
+
+=over
+
+=item *
+
+an Imager::IO object that should be used to read the file, and
+
+=item *
+
+all the parameters supplied to the read_multi() method.
+
+=back
+
+=back
+
+Example:
+
+ # from Imager::File::ICO
+ Imager->register_reader
+ (
+ type=>'ico',
+ single =>
+ sub {
+ my ($im, $io, %hsh) = @_;
+ $im->{IMG} = i_readico_single($io, $hsh{page} || 0);
+
+ unless ($im->{IMG}) {
+ $im->_set_error(Imager->_error_as_msg);
+ return;
+ }
+ return $im;
+ },
+ multiple =>
+ sub {
+ my ($io, %hsh) = @_;
+
+ my @imgs = i_readico_multi($io);
+ unless (@imgs) {
+ Imager->_set_error(Imager->_error_as_msg);
+ return;
+ }
+ return map {
+ bless { IMG => $_, DEBUG => $Imager::DEBUG, ERRSTR => undef }, 'Imager'
+ } @imgs;
+ },
+ );
+
+=item register_writer
+
+Registers single or multiple image write functions.
+
+Parameters:
+
+=over
+
+=item *
+
+type - the identifier of the file format. This is typically the
+extension in lowercase.
+
+This parameter is required.
+
+=item *
+
+single - a code ref to write a single image to a file. This is
+supplied:
+
+=over
+
+=item *
+
+the object that write() was called on,
+
+=item *
+
+an Imager::IO object that should be used to write the file, and
+
+=item *
+
+all the parameters supplied to the write() method.
+
+=back
+
+The single parameter is required.
+
+=item *
+
+multiple - a code ref which is called to write multiple images to a
+file. This is supplied:
+
+=over
+
+=item *
+
+the class name write_multi() was called on, this is typically
+C<Imager>.
+
+=item *
+
+an Imager::IO object that should be used to write the file, and
+
+=item *
+
+all the parameters supplied to the read_multi() method.
+
+=back
+
+=back
+
+=back
+
+If you name the reader module C<Imager::File::>I<your-format-name>
+where I<your-format-name> is a fully upper case version of the type
+value you would pass to read(), read_multi(), write() or write_multi()
+then Imager will attempt to load that module if it has no other way to
+read or write that format.
+
+For example, if you create a module Imager::File::GIF and the user has
+built Imager without it's normal GIF support then an attempt to read a
+GIF image will attempt to load Imager::File::GIF.
+
+If your module can only handle reading then you can name your module
+C<Imager::File::>I<your-format-name>C<Reader> and Imager will attempt
+to autoload it.
+
+If your module can only handle writing then you can name your module
+C<Imager::File::>I<your-format-name>C<Writer> and Imager will attempt
+to autoload it.
+
+=head1 EXAMPLES
+
+=head2 Producing an image from a CGI script
+
+Once you have an image the basic mechanism is:
+
+=over
+
+=item 1.
+
+set STDOUT to autoflush
+
+=item 2.
+
+output a content-type header, and optionally a content-length header
+
+=item 3.
+
+put STDOUT into binmode
+
+=item 4.
+
+call write() with the C<fd> or C<fh> parameter. You will need to
+provide the C<type> parameter since Imager can't use the extension to
+guess the file format you want.
+
+=back
+
+ # write an image from a CGI script
+ # using CGI.pm
+ use CGI qw(:standard);
+ $| = 1;
+ binmode STDOUT;
+ print header(-type=>'image/gif');
+ $img->write(type=>'gif', fd=>fileno(STDOUT))
+ or die $img->errstr;
+
+If you want to send a content length you can send the output to a
+scalar to get the length:
+
+ my $data;
+ $img->write(type=>'gif', data=>\$data)
+ or die $img->errstr;
+ binmode STDOUT;
+ print header(-type=>'image/gif', -content_length=>length($data));
+ print $data;
+
+=head2 Writing an animated GIF
+
+The basic idea is simple, just use write_multi():
+
+ my @imgs = ...;
+ Imager->write_multi({ file=>$filename, type=>'gif' }, @imgs);
+
+If your images are RGB images the default quantization mechanism will
+produce a very good result, but can take a long time to execute. You
+could either use the standard webmap:
+
+ Imager->write_multi({ file=>$filename,
+ type=>'gif',
+ make_colors=>'webmap' },
+ @imgs);
+
+or use a median cut algorithm to built a fairly optimal color map:
+
+ Imager->write_multi({ file=>$filename,
+ type=>'gif',
+ make_colors=>'mediancut' },
+ @imgs);
+
+By default all of the images will use the same global colormap, which
+will produce a smaller image. If your images have significant color
+differences, you may want to generate a new palette for each image:
+
+ Imager->write_multi({ file=>$filename,
+ type=>'gif',
+ make_colors=>'mediancut',
+ gif_local_map => 1 },
+ @imgs);
+
+which will set the C<gif_local_map> tag in each image to 1.
+Alternatively, if you know only some images have different colors, you
+can set the tag just for those images:
+
+ $imgs[2]->settag(name=>'gif_local_map', value=>1);
+ $imgs[4]->settag(name=>'gif_local_map', value=>1);
+
+and call write_multi() without a C<gif_local_map> parameter, or supply
+an arrayref of values for the tag:
+
+ Imager->write_multi({ file=>$filename,
+ type=>'gif',
+ make_colors=>'mediancut',
+ gif_local_map => [ 0, 0, 1, 0, 1 ] },
+ @imgs);
+
+Other useful parameters include C<gif_delay> to control the delay
+between frames and C<transp> to control transparency.
+
+=head2 Reading tags after reading an image
+
+This is pretty simple:
+
+ # print the author of a TIFF, if any
+ my $img = Imager->new;
+ $img->read(file=>$filename, type='tiff') or die $img->errstr;
+ my $author = $img->tags(name=>'tiff_author');
+ if (defined $author) {
+ print "Author: $author\n";
+ }
+
+=head1 BUGS
+
+When saving Gif images the program does NOT try to shave of extra
+colors if it is possible. If you specify 128 colors and there are
+only 2 colors used - it will have a 128 colortable anyway.
+
+=head1 SEE ALSO
+
+Imager(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Fill.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Fill.pm
new file mode 100755
index 00000000000..34786eade76
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Fill.pm
@@ -0,0 +1,447 @@
+package Imager::Fill;
+use strict;
+use vars qw($VERSION);
+
+$VERSION = "1.010";
+
+# this needs to be kept in sync with the array of hatches in fills.c
+my @hatch_types =
+ qw/check1x1 check2x2 check4x4 vline1 vline2 vline4
+ hline1 hline2 hline4 slash1 slosh1 slash2 slosh2
+ grid1 grid2 grid4 dots1 dots4 dots16 stipple weave cross1 cross2
+ vlozenge hlozenge scalesdown scalesup scalesleft scalesright stipple2
+ tile_L stipple3/;
+my %hatch_types;
+@hatch_types{@hatch_types} = 0..$#hatch_types;
+
+*_color = \&Imager::_color;
+
+sub new {
+ my ($class, %hsh) = @_;
+
+ my $self = bless { }, $class;
+ $hsh{combine} = Imager->_combine($hsh{combine}, 0);
+ if ($hsh{solid}) {
+ my $solid = _color($hsh{solid});
+ if (UNIVERSAL::isa($solid, 'Imager::Color')) {
+ $self->{fill} =
+ Imager::i_new_fill_solid($solid, $hsh{combine});
+ }
+ elsif (UNIVERSAL::isa($solid, 'Imager::Color::Float')) {
+ $self->{fill} =
+ Imager::i_new_fill_solidf($solid, $hsh{combine});
+ }
+ else {
+ $Imager::ERRSTR = "solid isn't a color";
+ return undef;
+ }
+ }
+ elsif (defined $hsh{hatch}) {
+ $hsh{dx} ||= 0;
+ $hsh{dy} ||= 0;
+ $hsh{fg} ||= Imager::Color->new(0, 0, 0);
+ if (ref $hsh{hatch}) {
+ $hsh{cust_hatch} = pack("C8", @{$hsh{hatch}});
+ $hsh{hatch} = 0;
+ }
+ elsif ($hsh{hatch} =~ /\D/) {
+ unless (exists($hatch_types{$hsh{hatch}})) {
+ $Imager::ERRSTR = "Unknown hatch type $hsh{hatch}";
+ return undef;
+ }
+ $hsh{hatch} = $hatch_types{$hsh{hatch}};
+ }
+ my $fg = _color($hsh{fg});
+ if (UNIVERSAL::isa($fg, 'Imager::Color')) {
+ my $bg = _color($hsh{bg} || Imager::Color->new(255, 255, 255));
+ $self->{fill} =
+ Imager::i_new_fill_hatch($fg, $bg, $hsh{combine},
+ $hsh{hatch}, $hsh{cust_hatch},
+ $hsh{dx}, $hsh{dy});
+ }
+ elsif (UNIVERSAL::isa($fg, 'Imager::Color::Float')) {
+ my $bg = _color($hsh{bg} || Imager::Color::Float->new(1, 1, 1));
+ $self->{fill} =
+ Imager::i_new_fill_hatchf($fg, $bg, $hsh{combine},
+ $hsh{hatch}, $hsh{cust_hatch},
+ $hsh{dx}, $hsh{dy});
+ }
+ else {
+ $Imager::ERRSTR = "fg isn't a color";
+ return undef;
+ }
+ }
+ elsif (defined $hsh{fountain}) {
+ # make sure we track the filter's defaults
+ my $fount = $Imager::filters{fountain};
+ my $def = $fount->{defaults};
+ my $names = $fount->{names};
+
+ $hsh{ftype} = $hsh{fountain};
+ # process names of values
+ for my $name (keys %$names) {
+ if (defined $hsh{$name} && exists $names->{$name}{$hsh{$name}}) {
+ $hsh{$name} = $names->{$name}{$hsh{$name}};
+ }
+ }
+ # process defaults
+ %hsh = (%$def, %hsh);
+ my @parms = @{$fount->{callseq}};
+ shift @parms;
+ for my $name (@parms) {
+ unless (defined $hsh{$name}) {
+ $Imager::ERRSTR =
+ "required parameter '$name' not set for fountain fill";
+ return undef;
+ }
+ }
+
+ # check that the segments supplied is an array ref
+ unless (ref $hsh{segments} && $hsh{segments} =~ /ARRAY/) {
+ $Imager::ERRSTR =
+ "segments must be an array reference or Imager::Fountain object";
+ return;
+ }
+
+ # make sure the segments are specified with colors
+ my @segments;
+ for my $segment (@{$hsh{segments}}) {
+ my @new_segment = @$segment;
+
+ $_ = _color($_) or return for @new_segment[3,4];
+ push @segments, \@new_segment;
+ }
+
+ $self->{fill} =
+ Imager::i_new_fill_fount($hsh{xa}, $hsh{ya}, $hsh{xb}, $hsh{yb},
+ $hsh{ftype}, $hsh{repeat}, $hsh{combine}, $hsh{super_sample},
+ $hsh{ssample_param}, \@segments);
+ }
+ elsif (defined $hsh{image}) {
+ $hsh{xoff} ||= 0;
+ $hsh{yoff} ||= 0;
+ $self->{fill} =
+ Imager::i_new_fill_image($hsh{image}{IMG}, $hsh{matrix}, $hsh{xoff},
+ $hsh{yoff}, $hsh{combine});
+ $self->{DEPS} = [ $hsh{image}{IMG} ];
+ }
+ elsif (defined $hsh{type} && $hsh{type} eq "opacity") {
+ my $other_fill = delete $hsh{other};
+ unless (defined $other_fill) {
+ Imager->_set_error("'other' parameter required to create opacity fill");
+ return;
+ }
+ unless (ref $other_fill &&
+ eval { $other_fill->isa("Imager::Fill") }) {
+ # try to auto convert to a fill object
+ if (ref $other_fill && $other_fill =~ /HASH/) {
+ $other_fill = Imager::Fill->new(%$other_fill)
+ or return;
+ }
+ else {
+ undef $other_fill;
+ }
+ unless ($other_fill) {
+ Imager->_set_error("'other' parameter must be an Imager::Fill object to create an opacity fill");
+ return;
+ }
+ }
+
+ my $raw_fill = $other_fill->{fill};
+ my $opacity = delete $hsh{opacity};
+ defined $opacity or $opacity = 0.5; # some sort of default
+ $self->{fill} =
+ Imager::i_new_fill_opacity($raw_fill, $opacity);
+ $self->{DEPS} = [ $other_fill ]; # keep reference to old fill and its deps
+ }
+ else {
+ $Imager::ERRSTR = "No fill type specified";
+ warn "No fill type!";
+ return undef;
+ }
+
+ $self;
+}
+
+sub hatches {
+ return @hatch_types;
+}
+
+sub combines {
+ return Imager->combines;
+}
+
+1;
+
+=head1 NAME
+
+ Imager::Fill - general fill types
+
+=head1 SYNOPSIS
+
+ use Imager;
+ use Imager::Fill;
+
+ my $fill1 = Imager::Fill->new(solid=>$color, combine=>$combine);
+ my $fill2 = Imager::Fill->new(hatch=>'vline2', fg=>$color1, bg=>$color2,
+ dx=>$dx, dy=>$dy);
+ my $fill3 = Imager::Fill->new(fountain=>$type, ...);
+ my $fill4 = Imager::Fill->new(image=>$img, ...);
+ my $fill5 = Imager::Fill->new(type => "opacity", other => $fill,
+ opacity => ...);
+
+=head1 DESCRIPTION
+
+Creates fill objects for use by most filled area drawing functions.
+
+All fills are created with the new method.
+
+=over
+
+=item new
+
+ my $fill = Imager::Fill->new(...);
+
+The parameters depend on the type of fill being created. See below
+for details.
+
+=back
+
+The currently available fills are:
+
+=over
+
+=item *
+
+solid
+
+=item *
+
+hatch
+
+=item *
+
+fountain (similar to gradients in paint software)
+
+=back
+
+=head1 Common options
+
+=over
+
+=item combine
+
+The way in which the fill data is combined with the underlying image.
+See L<Imager::Draw/"Combine Types">.
+
+=back
+
+In general colors can be specified as Imager::Color or
+Imager::Color::Float objects. The fill object will typically store
+both types and convert from one to the other. If a fill takes 2 color
+objects they should have the same type.
+
+=head2 Solid fills
+
+ my $fill = Imager::Fill->new(solid=>$color, $combine =>$combine)
+
+Creates a solid fill, the only required parameter is C<solid> which
+should be the color to fill with.
+
+=head2 Hatched fills
+
+ my $fill = Imager::Fill->new(hatch=>$type, fg=>$fgcolor, bg=>$bgcolor,
+ dx=>$dx, $dy=>$dy);
+
+Creates a hatched fill. You can specify the following keywords:
+
+=over
+
+=item hatch
+
+The type of hatch to perform, this can either be the numeric index of
+the hatch (not recommended), the symbolic name of the hatch, or an
+array of 8 integers which specify the pattern of the hatch.
+
+Hatches are represented as cells 8x8 arrays of bits, which limits their
+complexity.
+
+Current hatch names are:
+
+=over
+
+=item check1x1, check2x2, check4x4
+
+checkerboards at varios sizes
+
+=item vline1, vline2, vline4
+
+1, 2, or 4 vertical lines per cell
+
+=item hline1, hline2, hline4
+
+1, 2, or 4 horizontal lines per cell
+
+=item slash1, slash2
+
+1 or 2 / lines per cell.
+
+=item slosh1, slosh2
+
+1 or 2 \ lines per cell
+
+=item grid1, grid2, grid4
+
+1, 2, or 4 vertical and horizontal lines per cell
+
+=item dots1, dots4, dots16
+
+1, 4 or 16 dots per cell
+
+=item stipple, stipple2
+
+see the samples
+
+=item weave
+
+I hope this one is obvious.
+
+=item cross1, cross2
+
+2 densities of crosshatch
+
+=item vlozenge, hlozenge
+
+something like lozenge tiles
+
+=item scalesdown, scalesup, scalesleft, scalesright
+
+Vaguely like fish scales in each direction.
+
+=item tile_L
+
+L-shaped tiles
+
+=back
+
+=item fg
+
+=item bg
+
+The fg color is rendered where bits are set in the hatch, and the bg
+where they are clear. If you use a transparent fg or bg, and set
+combine, you can overlay the hatch onto an existing image.
+
+fg defaults to black, bg to white.
+
+=item dx
+
+=item dy
+
+An offset into the hatch cell. Both default to zero.
+
+=back
+
+You can call Imager::Fill->hatches for a list of hatch names.
+
+=head2 Fountain fills
+
+ my $fill = Imager::Fill->new(fountain=>$ftype,
+ xa=>$xa, ya=>$ya, xb=>$xb, yb=>$yb,
+ segments=>$segments, repeat=>$repeat, combine=>$combine,
+ super_sample=>$super_sample, ssample_param=>$ssample_param);
+
+This fills the given region with a fountain fill. This is exactly the
+same fill as the C<fountain> filter, but is restricted to the shape
+you are drawing, and the fountain parameter supplies the fill type,
+and is required.
+
+=head2 Image Fills
+
+ my $fill = Imager::Fill->new(image=>$src, xoff=>$xoff, yoff=>$yoff,
+ matrix=>$matrix, $combine);
+
+Fills the given image with a tiled version of the given image. The
+first non-zero value of xoff or yoff will provide an offset along the
+given axis between rows or columns of tiles respectively.
+
+The matrix parameter performs a co-ordinate transformation from the
+co-ordinates in the target image to the fill image co-ordinates.
+Linear interpolation is used to determine the fill pixel. You can use
+the L<Imager::Matrix2d> class to create transformation matrices.
+
+The matrix parameter will significantly slow down the fill.
+
+=head2 Opacity modification fill
+
+ my $fill = Imager::Fill->new(type => "opacity",
+ other => $fill, opacity => 0.25);
+
+This can be used to make a fill that is a more translucent or opaque
+version of an existing fill. This is intended for use where you
+receive a fill object as a parameter and need to change the opacity.
+
+Parameters:
+
+=over
+
+=item *
+
+type => "opacity" - Required
+
+=item *
+
+other - the fill to produce a modified version of. This must be an
+Imager::Fill object. Required.
+
+=item *
+
+opacity - multiplier for the source fill opacity. Default: 0.5.
+
+=back
+
+The source fill's combine mode is used.
+
+=head1 OTHER METHODS
+
+=over
+
+=item Imager::Fill->hatches
+
+A list of all defined hatch names.
+
+=item Imager::Fill->combines
+
+A list of all combine types.
+
+=back
+
+=head1 FUTURE PLANS
+
+I'm planning on adding the following types of fills:
+
+=over
+
+=item checkerboard
+
+combines 2 other fills in a checkerboard
+
+=item combine
+
+combines 2 other fills using the levels of an image
+
+=item regmach
+
+uses the transform2() register machine to create fills
+
+=back
+
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=head1 SEE ALSO
+
+Imager(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Filter/DynTest.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Filter/DynTest.pm
new file mode 100755
index 00000000000..05f04a1f5c3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Filter/DynTest.pm
@@ -0,0 +1,32 @@
+package Imager::Filter::DynTest;
+use strict;
+use Imager;
+use vars qw($VERSION @ISA);
+
+BEGIN {
+ $VERSION = "0.01";
+
+ eval {
+ require XSLoader;
+ XSLoader::load('Imager::Filter::DynTest', $VERSION);
+ 1;
+ } or do {
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ bootstrap Imager::Filter::DynTest $VERSION;
+ };
+}
+
+
+sub _lin_stretch {
+ my %hsh = @_;
+
+ lin_stretch($hsh{image}, $hsh{a}, $hsh{b});
+}
+
+Imager->register_filter(type=>'lin_stretch',
+ callsub => \&_lin_stretch,
+ defaults => { a => 0, b => 255 },
+ callseq => [ qw/image a b/ ]);
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Filter/Flines.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Filter/Flines.pm
new file mode 100755
index 00000000000..53905058d8a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Filter/Flines.pm
@@ -0,0 +1,57 @@
+package Imager::Filter::Flines;
+use strict;
+use Imager;
+use vars qw($VERSION @ISA);
+
+BEGIN {
+ $VERSION = "0.01";
+
+ eval {
+ require XSLoader;
+ XSLoader::load('Imager::Filter::Flines', $VERSION);
+ 1;
+ } or do {
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ bootstrap Imager::Filter::Flines $VERSION;
+ };
+}
+
+Imager->register_filter(type=>'flines',
+ callsub => sub { my %hsh = @_; flines($hsh{image}) },
+ defaults => {},
+ callseq => [ 'image' ] );
+
+1;
+
+__END__
+
+=head1 NAME
+
+Imager::Filter::Flines - dim alternate lines to emulate a video display
+
+=head1 SYNOPSIS
+
+ use Imager;
+ use Imager::Filter::Flines;
+
+ $img->filter(type=>'flines');
+
+=head1 DESCRIPTION
+
+This is an adaption of the flines dynamically loadable filter
+provided in dynfilt/ in previous releases of Imager.
+
+This filter has no parameters.
+
+=head1 AUTHOR
+
+Original by Arnar M. Hrafnkelsson.
+
+Adapted by Tony Cook <tony@imager.perl.org>
+
+=head1 SEE ALSO
+
+Imager, Imager::Filters.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Filter/Mandelbrot.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Filter/Mandelbrot.pm
new file mode 100755
index 00000000000..f762fa1d85b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Filter/Mandelbrot.pm
@@ -0,0 +1,91 @@
+package Imager::Filter::Mandelbrot;
+use strict;
+use Imager;
+use vars qw($VERSION @ISA);
+
+BEGIN {
+ $VERSION = "0.01";
+
+ eval {
+ require XSLoader;
+ XSLoader::load('Imager::Filter::Mandelbrot', $VERSION);
+ 1;
+ } or do {
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ bootstrap Imager::Filter::Mandelbrot $VERSION;
+ };
+}
+
+sub _mandelbrot {
+ my %hsh = @_;
+
+ mandelbrot($hsh{image}, $hsh{minx}, $hsh{miny}, $hsh{maxx}, $hsh{maxy}, $hsh{maxiter});
+}
+
+my %defaults =
+ (
+ minx => -2.5,
+ maxx => 1.5,
+ miny => -1.5,
+ maxy => 1.5,
+ maxiter => 256,
+ );
+
+my @callseq = qw/image minx miny maxx maxy maxiter/;
+
+Imager->register_filter(type=>'mandelbrot',
+ callsub => \&_mandelbrot,
+ defaults => \%defaults,
+ callseq => \@callseq);
+
+1;
+
+__END__
+
+=head1 NAME
+
+Imager::Filter::Mandelbrot - filter that renders the Mandelbrot set.
+
+=head1 SYNOPSIS
+
+ use Imager;
+ use Imager::Filter::Mandelbrot;
+
+ $img->filter(type=>'mandelbrot', ...);
+
+=head1 DESCRIPTION
+
+This is a expansion of the mandelbrot dynamically loadable filter
+provided in dynfilt in previous releases of Imager.
+
+Valid filter parameters are:
+
+=over
+
+=item *
+
+minx, maxx - the range of x values to render. Defaults: -2.5, 1.5.
+
+=item *
+
+miny, maxy - the range of y values to render. Defaults: -1.5, 1.5
+
+=item *
+
+maxiter - the maximum number of iterations to perform when checking if
+the sequence tend towards infinity.
+
+=back
+
+=head1 AUTHOR
+
+Original by Arnar M. Hrafnkelsson.
+
+Adapted and expanded by Tony Cook <tony@imager.perl.org>
+
+=head1 SEE ALSO
+
+Imager, Imager::Filters.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Filters.pod b/Master/tlpkg/tlperl.straw/lib/Imager/Filters.pod
new file mode 100755
index 00000000000..3ee181af101
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Filters.pod
@@ -0,0 +1,703 @@
+=head1 NAME
+
+Imager::Filters - Entire Image Filtering Operations
+
+=head1 SYNOPSIS
+
+ use Imager;
+
+ $img = ...;
+
+ $img->filter(type=>'autolevels');
+ $img->filter(type=>'autolevels', lsat=>0.2);
+ $img->filter(type=>'turbnoise')
+
+ # and lots of others
+
+ load_plugin("dynfilt/dyntest.so")
+ or die "unable to load plugin\n";
+
+ $img->filter(type=>'lin_stretch', a=>35, b=>200);
+
+ unload_plugin("dynfilt/dyntest.so")
+ or die "unable to load plugin\n";
+
+ $out = $img->difference(other=>$other_img);
+
+=head1 DESCRIPTION
+
+Filters are operations that have similar calling interface.
+
+=over
+
+=item filter
+
+Parameters:
+
+=over
+
+=item *
+
+type - the type of filter, see L</Types of Filters>.
+
+=item *
+
+many other possible parameters, see L</Types of Filters> below.
+
+=back
+
+=back
+
+=head2 Types of Filters
+
+Here is a list of the filters that are always avaliable in Imager.
+This list can be obtained by running the C<filterlist.perl> script
+that comes with the module source.
+
+ Filter Arguments Default value
+ autolevels lsat 0.1
+ usat 0.1
+ skew 0
+
+ bumpmap bump lightx lighty
+ elevation 0
+ st 2
+
+ bumpmap_complex bump
+ channel 0
+ tx 0
+ ty 0
+ Lx 0.2
+ Ly 0.4
+ Lz -1
+ cd 1.0
+ cs 40.0
+ n 1.3
+ Ia (0 0 0)
+ Il (255 255 255)
+ Is (255 255 255)
+
+ contrast intensity
+
+ conv coef
+
+ fountain xa ya xb yb
+ ftype linear
+ repeat none
+ combine none
+ super_sample none
+ ssample_param 4
+ segments(see below)
+
+ gaussian stddev
+
+ gradgen xo yo colors
+ dist 0
+
+ hardinvert
+
+ mosaic size 20
+
+ noise amount 3
+ subtype 0
+
+ postlevels levels 10
+
+ radnoise xo 100
+ yo 100
+ ascale 17.0
+ rscale 0.02
+
+ turbnoise xo 0.0
+ yo 0.0
+ scale 10.0
+
+ unsharpmask stddev 2.0
+ scale 1.0
+
+ watermark wmark
+ pixdiff 10
+ tx 0
+ ty 0
+
+All parameters must have some value but if a parameter has a default
+value it may be omitted when calling the filter function.
+
+Every one of these filters modifies the image in place.
+
+If none of the filters here do what you need, the
+L<Imager::Engines/tranform> or L<Imager::Engines/transform2> function
+may be useful.
+
+A reference of the filters follows:
+
+=over
+
+=item autolevels
+
+scales the value of each channel so that the values in the image will
+cover the whole possible range for the channel. I<lsat> and I<usat>
+truncate the range by the specified fraction at the top and bottom of
+the range respectivly.
+
+ # increase contrast per channel, losing little detail
+ $img->filter(type=>"autolevels")
+ or die $img->errstr;
+
+ # increase contrast, losing 20% of highlight at top and bottom range
+ $img->filter(type=>"autolevels", lsat=>0.2, usat=>0.2)
+ or die $img->errstr;
+
+=item bumpmap
+
+uses the channel I<elevation> image I<bump> as a bumpmap on your
+image, with the light at (I<lightx>, I<lightty>), with a shadow length
+of I<st>.
+
+ $img->filter(type=>"bumpmap", bump=>$bumpmap_img,
+ lightx=>10, lighty=>10, st=>5)
+ or die $img->errstr;
+
+=item bumpmap_complex
+
+uses the channel I<channel> image I<bump> as a bumpmap on your image.
+If Lz<0 the three L parameters are considered to be the direction of
+the light. If Lz>0 the L parameters are considered to be the light
+position. I<Ia> is the ambient colour, I<Il> is the light colour,
+I<Is> is the color of specular highlights. I<cd> is the diffuse
+coefficient and I<cs> is the specular coefficient. I<n> is the
+shininess of the surface.
+
+ $img->filter(type=>"bumpmap_complex", bump=>$bumpmap_img)
+ or die $img->errstr;
+
+=item contrast
+
+scales each channel by I<intensity>. Values of I<intensity> < 1.0
+will reduce the contrast.
+
+ # higher contrast
+ $img->filter(type=>"contrast", intensity=>1.3)
+ or die $img->errstr;
+
+ # lower contrast
+ $img->filter(type=>"contrast", intensity=>0.8)
+ or die $img->errstr;
+
+=item conv
+
+performs 2 1-dimensional convolutions on the image using the values
+from I<coef>. I<coef> should be have an odd length and the sum of the
+coefficients must be non-zero.
+
+ # sharper
+ $img->filter(type=>"conv", coef=>[-0.5, 2, -0.5 ])
+ or die $img->errstr;
+
+ # blur
+ $img->filter(type=>"conv", coef=>[ 1, 2, 1 ])
+ or die $img->errstr;
+
+ # error
+ $img->filter(type=>"conv", coef=>[ -0.5, 1, -0.5 ])
+ or die $img->errstr;
+
+=item fountain
+
+renders a fountain fill, similar to the gradient tool in most paint
+software. The default fill is a linear fill from opaque black to
+opaque white. The points A(xa, ya) and B(xb, yb) control the way the
+fill is performed, depending on the ftype parameter:
+
+=over
+
+=item linear
+
+the fill ramps from A through to B.
+
+=item bilinear
+
+the fill ramps in both directions from A, where AB defines the length
+of the gradient.
+
+=item radial
+
+A is the center of a circle, and B is a point on it's circumference.
+The fill ramps from the center out to the circumference.
+
+=item radial_square
+
+A is the center of a square and B is the center of one of it's sides.
+This can be used to rotate the square. The fill ramps out to the
+edges of the square.
+
+=item revolution
+
+A is the centre of a circle and B is a point on it's circumference. B
+marks the 0 and 360 point on the circle, with the fill ramping
+clockwise.
+
+=item conical
+
+A is the center of a circle and B is a point on it's circumference. B
+marks the 0 and point on the circle, with the fill ramping in both
+directions to meet opposite.
+
+=back
+
+The I<repeat> option controls how the fill is repeated for some
+I<ftype>s after it leaves the AB range:
+
+=over
+
+=item none
+
+no repeats, points outside of each range are treated as if they were
+on the extreme end of that range.
+
+=item sawtooth
+
+the fill simply repeats in the positive direction
+
+=item triangle
+
+the fill repeats in reverse and then forward and so on, in the
+positive direction
+
+=item saw_both
+
+the fill repeats in both the positive and negative directions (only
+meaningful for a linear fill).
+
+=item tri_both
+
+as for triangle, but in the negative direction too (only meaningful
+for a linear fill).
+
+=back
+
+By default the fill simply overwrites the whole image (unless you have
+parts of the range 0 through 1 that aren't covered by a segment), if
+any segments of your fill have any transparency, you can set the
+I<combine> option to 'normal' to have the fill combined with the
+existing pixels. See the description of I<combine> in L<Imager::Fill>.
+
+If your fill has sharp edges, for example between steps if you use
+repeat set to 'triangle', you may see some aliased or ragged edges.
+You can enable super-sampling which will take extra samples within the
+pixel in an attempt anti-alias the fill.
+
+The possible values for the super_sample option are:
+
+=over
+
+=item none
+
+no super-sampling is done
+
+=item grid
+
+a square grid of points are sampled. The number of points sampled is
+the square of ceil(0.5 + sqrt(ssample_param)).
+
+=item random
+
+a random set of points within the pixel are sampled. This looks
+pretty bad for low ssample_param values.
+
+=item circle
+
+the points on the radius of a circle within the pixel are sampled.
+This seems to produce the best results, but is fairly slow (for now).
+
+=back
+
+You can control the level of sampling by setting the ssample_param
+option. This is roughly the number of points sampled, but depends on
+the type of sampling.
+
+The segments option is an arrayref of segments. You really should use
+the L<Imager::Fountain> class to build your fountain fill. Each
+segment is an array ref containing:
+
+=over
+
+=item start
+
+a floating point number between 0 and 1, the start of the range of
+fill parameters covered by this segment.
+
+=item middle
+
+a floating point number between start and end which can be used to
+push the color range towards one end of the segment.
+
+=item end
+
+a floating point number between 0 and 1, the end of the range of fill
+parameters covered by this segment. This should be greater than
+start.
+
+=item c0
+
+=item c1
+
+The colors at each end of the segment. These can be either
+Imager::Color or Imager::Color::Float objects.
+
+=item segment type
+
+The type of segment, this controls the way the fill parameter varies
+over the segment. 0 for linear, 1 for curved (unimplemented), 2 for
+sine, 3 for sphere increasing, 4 for sphere decreasing.
+
+=item color type
+
+The way the color varies within the segment, 0 for simple RGB, 1 for
+hue increasing and 2 for hue decreasing.
+
+=back
+
+Don't forget to use Imager::Fountain instead of building your own.
+Really. It even loads GIMP gradient files.
+
+ # build the gradient the hard way - linear from black to white,
+ # then back again
+ my @simple =
+ (
+ [ 0, 0.25, 0.5, 'black', 'white', 0, 0 ],
+ [ 0.5. 0.75, 1.0, 'white', 'black', 0, 0 ],
+ );
+ # across
+ my $linear = $img->copy;
+ $linear->filter(type => "fountain",
+ ftype => 'linear',
+ repeat => 'sawtooth',
+ segments => \@simple,
+ xa => 0,
+ ya => $linear->getheight / 2,
+ xb => $linear->getwidth - 1,
+ yb => $linear->getheight / 2)
+ or die $linear->errstr;
+ # around
+ my $revolution = $img->copy;
+ $revolution->filter(type => "fountain",
+ ftype => 'revolution',
+ segments => \@simple,
+ xa => $revolution->getwidth / 2,
+ ya => $revolution->getheight / 2,
+ xb => $revolution->getwidth / 2,
+ yb => 0)
+ or die $revolution->errstr;
+ # out from the middle
+ my $radial = $img->copy;
+ $radial->filter(type => "fountain",
+ ftype => 'radial',
+ segments => \@simple,
+ xa => $im->getwidth / 2,
+ ya => $im->getheight / 2,
+ xb => $im->getwidth / 2,
+ yb => 0)
+ or die $radial->errstr;
+
+=item gaussian
+
+performs a gaussian blur of the image, using I<stddev> as the standard
+deviation of the curve used to combine pixels, larger values give
+bigger blurs. For a definition of Gaussian Blur, see:
+
+ http://www.maths.abdn.ac.uk/~igc/tch/mx4002/notes/node99.html
+
+Values of C<stddev> around 0.5 provide a barely noticable blur, values
+around 5 provide a very strong blur.
+
+ # only slightly blurred
+ $img->filter(type=>"gaussian", stddev=>0.5)
+ or die $img->errstr;
+
+ # more strongly blurred
+ $img->filter(type=>"gaussian", stddev=>5)
+ or die $img->errstr;
+
+=item gradgen
+
+renders a gradient, with the given I<colors> at the corresponding
+points (x,y) in I<xo> and I<yo>. You can specify the way distance is
+measured for color blending by setting I<dist> to 0 for Euclidean, 1
+for Euclidean squared, and 2 for Manhattan distance.
+
+ $img->filter(type="gradgen",
+ xo=>[ 10, 50, 10 ],
+ yo=>[ 10, 50, 50 ],
+ colors=>[ qw(red blue green) ]);
+
+=item hardinvert
+
+inverts the image, black to white, white to black. All channels are
+inverted, including the alpha channel if any.
+
+ $img->filter(type=>"hardinvert")
+ or die $img->errstr;
+
+=item mosaic
+
+produces averaged tiles of the given I<size>.
+
+ $img->filter(type=>"mosaic", size=>5)
+ or die $img->errstr;
+
+=item noise
+
+adds noise of the given I<amount> to the image. If I<subtype> is
+zero, the noise is even to each channel, otherwise noise is added to
+each channel independently.
+
+ # monochrome noise
+ $img->filter(type=>"noise", amount=>20, subtype=>0)
+ or die $img->errstr;
+
+ # color noise
+ $img->filter(type=>"noise", amount=>20, subtype=>1)
+ or die $img->errstr;
+
+=item radnoise
+
+renders radiant Perlin turbulent noise. The centre of the noise is at
+(I<xo>, I<yo>), I<ascale> controls the angular scale of the noise ,
+and I<rscale> the radial scale, higher numbers give more detail.
+
+ $img->filter(type=>"radnoise", xo=>50, yo=>50,
+ ascale=>1, rscale=>0.02)
+ or die $img->errstr;
+
+=item postlevels
+
+alters the image to have only I<levels> distinct level in each
+channel.
+
+ $img->filter(type=>"postlevels", levels=>10)
+ or die $img->errstr;
+
+=item turbnoise
+
+renders Perlin turbulent noise. (I<xo>, I<yo>) controls the origin of
+the noise, and I<scale> the scale of the noise, with lower numbers
+giving more detail.
+
+ $img->filter(type=>"turbnoise", xo=>10, yo=>10, scale=>10)
+ or die $img->errstr;
+
+=item unsharpmask
+
+performs an unsharp mask on the image. This increases the contrast of
+edges in the image.
+
+This is the result of subtracting a gaussian blurred version of the
+image from the original. I<stddev> controls the stddev parameter of
+the gaussian blur. Each output pixel is: in + I<scale> * (in -
+blurred).
+
+ $img->filter(type=>"unsharpmask", stddev=>1, scale=>0.5)
+ or die $img->errstr;
+
+unsharpmark has the following parameters:
+
+=over
+
+=item *
+
+stddev - this is equivalent to the C<Radius> value in the GIMP's
+unsharpmask filter. This controls the size of the contrast increase
+around edges, larger values will remove fine detail. You should
+probably experiement on the types of images you plan to work with.
+Default: 2.0.
+
+=item *
+
+scale - controls the strength of the edge enhancement, equivalent to
+I<Amount> in the GIMP's unsharp mask filter. Default: 1.0.
+
+=back
+
+=item watermark
+
+applies I<wmark> as a watermark on the image with strength I<pixdiff>,
+with an origin at (I<tx>, I<ty>)
+
+ $img->filter(type=>"watermark", tx=>10, ty=>50,
+ wmark=>$wmark_image, pixdiff=>50)
+ or die $img->errstr;
+
+=back
+
+A demonstration of most of the filters can be found at:
+
+ http://www.develop-help.com/imager/filters.html
+
+=head2 External Filters
+
+As of Imager 0.48 you can create perl or XS based filters and hook
+them into Imager's filter() method:
+
+=over
+
+=item register_filter
+
+Registers a filter so it is visible via Imager's filter() method.
+
+ Imager->register_filter(type => 'your_filter',
+ defaults => { parm1 => 'default1' },
+ callseq => [ qw/image parm1/ ],
+ callsub => \&your_filter);
+ $img->filter(type=>'your_filter', parm1 => 'something');
+
+The following parameters are needed:
+
+=over
+
+=item *
+
+type - the type value that will be supplied to filter() to use your
+filter.
+
+=item *
+
+defaults - a hash of defaults for the filter's parameters
+
+=item *
+
+callseq - a reference to an array of required parameter names.
+
+=item *
+
+callsub - a code reference called to execute your filter. The
+parameters passed to filter() are supplied as a list of parameter
+name, value ... which can be assigned to a hash.
+
+The special parameters C<image> and C<imager> are supplied as the low
+level image object from $self and $self itself respectively.
+
+The function you supply must modify the image in place.
+
+=back
+
+See Imager::Filter::Mandelbrot for an example.
+
+=back
+
+=head2 Plugins
+
+The plugin interface is deprecated. Please use the Imager API, see
+L</Imager::API> and L<External Filters> for details
+
+It is possible to add filters to the module without recompiling the
+module itself. This is done by using DSOs (Dynamic shared object)
+avaliable on most systems. This way you can maintain our own filters
+and not have to get me to add it, or worse patch every new version of
+the Module. Modules can be loaded AND UNLOADED at runtime. This
+means that you can have a server/daemon thingy that can do something
+like:
+
+ load_plugin("dynfilt/dyntest.so")
+ or die "unable to load plugin\n";
+
+ $img->filter(type=>'lin_stretch', a=>35, b=>200);
+
+ unload_plugin("dynfilt/dyntest.so")
+ or die "unable to load plugin\n";
+
+Someone decides that the filter is not working as it should -
+dyntest.c modified and recompiled.
+
+ load_plugin("dynfilt/dyntest.so")
+ or die "unable to load plugin\n";
+
+ $img->filter(%hsh);
+
+An example plugin comes with the module - Please send feedback to
+addi@umich.edu if you test this.
+
+Note: This seems to test ok on the following systems:
+Linux, Solaris, HPUX, OpenBSD, FreeBSD, TRU64/OSF1, AIX.
+If you test this on other systems please let me know.
+
+=over
+
+=item load_plugin
+
+This is a function, not a method, exported by default. You should
+import this function explicitly for future compatibility if you need
+it.
+
+Accepts a single parameter, the name of a shared library file to load.
+
+Returns true on success. Check Imager->errstr on failure.
+
+=item unload_plugin
+
+This is a function, not a method, which is exported by default. You
+should import this function explicitly for future compatibility if you
+need it.
+
+Accepts a single parameter, the name of a shared library to unload.
+This library must have been previously loaded by load_plugin().
+
+Returns true on success. Check Imager->errstr on failure.
+
+=back
+
+=head2 Image Difference
+
+=over
+
+=item difference
+
+You can create a new image that is the difference between 2 other images.
+
+ my $diff = $img->difference(other=>$other_img);
+
+For each pixel in $img that is different to the pixel in $other_img,
+the pixel from $other_img is given, otherwise the pixel is transparent
+black.
+
+This can be used for debugging image differences ("Where are they
+different?"), and for optimizing animated GIFs.
+
+Note that $img and $other_img must have the same number of channels.
+The width and height of $diff will be the minimum of each of the width
+and height of $img and $other_img.
+
+Parameters:
+
+=over
+
+=item *
+
+other - the other image object to compare against
+
+=item *
+
+mindist - the difference between corresponding samples must be greater
+than I<mindist> for the pixel to be considered different. So a value
+of zero returns all different pixels, not all pixels. Range: 0 to 255
+inclusive. Default: 0.
+
+For large sample images this is scaled down to the range 0 .. 1.
+
+=back
+
+=back
+
+=head1 AUTHOR
+
+Arnar M. Hrafnkelsson, Tony Cook <tony@imager.perl.org>.
+
+=head1 SEE ALSO
+
+Imager, Imager::Filter::Flines, Imager::Filter::Mandelbrot
+
+=head1 REVISION
+
+$Revision: 1643 $
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Font.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Font.pm
new file mode 100755
index 00000000000..0662421e1b8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Font.pm
@@ -0,0 +1,1001 @@
+package Imager::Font;
+
+use Imager::Color;
+use strict;
+use vars qw($VERSION);
+
+$VERSION = "1.033";
+
+# the aim here is that we can:
+# - add file based types in one place: here
+# - make sure we only attempt to create types that exist
+# - give reasonable defaults
+# - give the user some control over which types get used
+my %drivers =
+ (
+ tt=>{
+ class=>'Imager::Font::Truetype',
+ module=>'Imager/Font/Truetype.pm',
+ files=>'.*\.ttf$',
+ description => 'FreeType 1.x',
+ },
+ t1=>{
+ class=>'Imager::Font::Type1',
+ module=>'Imager/Font/Type1.pm',
+ files=>'.*\.pfb$',
+ description => 'T1Lib',
+ },
+ ft2=>{
+ class=>'Imager::Font::FreeType2',
+ module=>'Imager/Font/FreeType2.pm',
+ files=>'.*\.(pfa|pfb|otf|ttf|fon|fnt|dfont|pcf(\.gz)?)$',
+ description => 'FreeType 2.x',
+ },
+ ifs=>{
+ class=>'Imager::Font::Image',
+ module=>'Imager/Font/Image.pm',
+ files=>'.*\.ifs$',
+ },
+ w32=>{
+ class=>'Imager::Font::Win32',
+ module=>'Imager/Font/Win32.pm',
+ description => 'Win32 GDI Fonts',
+ },
+ );
+
+# this currently should only contain file based types, don't add w32
+my @priority = qw(t1 tt ft2 ifs);
+
+# when Imager::Font is loaded, Imager.xs has not been bootstrapped yet
+# this function is called from Imager.pm to finish initialization
+sub __init {
+ @priority = grep Imager::i_has_format($_), @priority;
+ for my $driver_name (grep Imager::i_has_format($_), keys %drivers) {
+ $drivers{$driver_name}{enabled} = 1;
+ }
+}
+
+# search method
+# 1. start by checking if file is the parameter
+# 1a. if so qualify path and compare to the cache.
+# 2a. if in cache - take it's id from there and increment count.
+#
+
+sub new {
+ my $class = shift;
+ my $self = {};
+ my ($file, $type, $id);
+ my %hsh=(color => Imager::Color->new(255,0,0,0),
+ size => 15,
+ @_);
+
+ bless $self,$class;
+
+ if ($hsh{'file'}) {
+ $file = $hsh{'file'};
+ if ( $file !~ m/^\// ) {
+ $file = './'.$file;
+ if (! -e $file) {
+ $Imager::ERRSTR = "Font $file not found";
+ return();
+ }
+ }
+
+ $type = $hsh{'type'};
+ if (!defined($type) or !$drivers{$type} or !$drivers{$type}{enabled}) {
+ for my $drv (@priority) {
+ undef $type;
+ my $re = $drivers{$drv}{files} or next;
+ if ($file =~ /$re/i) {
+ $type = $drv;
+ last;
+ }
+ }
+ }
+ if (!defined($type)) {
+ # some types we can support, but the driver isn't available
+ # work out which drivers support it, so we can provide the user
+ # some useful information on how to get it working
+ my @not_here;
+ for my $driver_name (keys %drivers) {
+ my $driver = $drivers{$driver_name};
+ push @not_here, "$driver_name ($driver->{description})"
+ if $driver->{files} && $file =~ /$driver->{files}/i;
+ }
+ if (@not_here) {
+ $Imager::ERRSTR = "No font drivers enabled that can support this file, rebuild Imager with any of ".join(", ", @not_here)." to use this font file";
+ }
+ else {
+ $Imager::ERRSTR = "No font type found for $hsh{'file'}";
+ }
+ return;
+ }
+ } elsif ($hsh{face}) {
+ $type = "w32";
+ } else {
+ $Imager::ERRSTR="No font file specified";
+ return;
+ }
+
+ if (!$Imager::formats{$type}) {
+ $Imager::ERRSTR = "`$type' not enabled";
+ return;
+ }
+
+ # here we should have the font type or be dead already.
+
+ require $drivers{$type}{module};
+ return $drivers{$type}{class}->new(%hsh);
+}
+
+# returns first defined parameter
+sub _first {
+ for (@_) {
+ return $_ if defined $_;
+ }
+ return undef;
+}
+
+sub draw {
+ my $self = shift;
+ my %input = ('x' => 0, 'y' => 0, @_);
+ unless ($input{image}) {
+ $Imager::ERRSTR = 'No image supplied to $font->draw()';
+ return;
+ }
+ my $image = $input{image};
+ $input{string} = _first($input{string}, $input{text});
+ unless (defined $input{string}) {
+ $image->_set_error("Missing required parameter 'string'");
+ return;
+ }
+ $input{aa} = _first($input{aa}, $input{antialias}, $self->{aa}, 1);
+ # the original draw code worked this out but didn't use it
+ $input{align} = _first($input{align}, $self->{align});
+ $input{color} = _first($input{color}, $self->{color});
+ $input{color} = Imager::_color($input{'color'});
+
+ $input{size} = _first($input{size}, $self->{size});
+ unless (defined $input{size}) {
+ $image->_set_error("No font size provided");
+ return undef;
+ }
+ $input{align} = _first($input{align}, 1);
+ $input{utf8} = _first($input{utf8}, $self->{utf8}, 0);
+ $input{vlayout} = _first($input{vlayout}, $self->{vlayout}, 0);
+
+ my $result = $self->_draw(%input);
+ unless ($result) {
+ $image->_set_error($image->_error_as_msg());
+ }
+
+ return $result;
+}
+
+sub align {
+ my $self = shift;
+ my %input = ( halign => 'left', valign => 'baseline',
+ 'x' => 0, 'y' => 0, @_ );
+
+ # image needs to be supplied, but can be supplied as undef
+ unless (exists $input{image}) {
+ Imager->_set_error("Missing required parameter 'image'");
+ return;
+ }
+
+ my $errors_to = $input{image} || 'Imager';
+
+ my $text = _first($input{string}, $input{text});
+ unless (defined $text) {
+ $errors_to->_set_error("Missing required parameter 'string'");
+ return;
+ }
+
+ my $size = _first($input{size}, $self->{size});
+ my $utf8 = _first($input{utf8}, 0);
+
+ my $bbox = $self->bounding_box(string=>$text, size=>$size, utf8=>$utf8);
+ my $valign = $input{valign};
+ $valign = 'baseline'
+ unless $valign && $valign =~ /^(?:top|center|bottom|baseline)$/;
+
+ my $halign = $input{halign};
+ $halign = 'start'
+ unless $halign && $halign =~ /^(?:left|start|center|end|right)$/;
+
+ my $x = $input{'x'};
+ my $y = $input{'y'};
+
+ if ($valign eq 'top') {
+ $y += $bbox->ascent;
+ }
+ elsif ($valign eq 'center') {
+ $y += $bbox->ascent - $bbox->text_height / 2;
+ }
+ elsif ($valign eq 'bottom') {
+ $y += $bbox->descent;
+ }
+ # else baseline is the default
+
+ if ($halign eq 'left') {
+ $x -= $bbox->start_offset;
+ }
+ elsif ($halign eq 'start') {
+ # nothing to do
+ }
+ elsif ($halign eq 'center') {
+ $x -= $bbox->start_offset + $bbox->total_width / 2;
+ }
+ elsif ($halign eq 'end') {
+ $x -= $bbox->advance_width;
+ }
+ elsif ($halign eq 'right') {
+ $x -= $bbox->advance_width - $bbox->right_bearing;
+ }
+ $x = int($x);
+ $y = int($y);
+
+ if ($input{image}) {
+ delete @input{qw/x y/};
+ $self->draw(%input, 'x' => $x, 'y' => $y, align=>1)
+ or return;
+ }
+
+ return ($x+$bbox->start_offset, $y-$bbox->ascent,
+ $x+$bbox->end_offset, $y-$bbox->descent+1);
+}
+
+sub bounding_box {
+ my $self=shift;
+ my %input=@_;
+
+ if (!exists $input{'string'}) {
+ $Imager::ERRSTR='string parameter missing';
+ return;
+ }
+ $input{size} ||= $self->{size};
+ $input{sizew} = _first($input{sizew}, $self->{sizew}, 0);
+ $input{utf8} = _first($input{utf8}, $self->{utf8}, 0);
+
+ my @box = $self->_bounding_box(%input);
+
+ if (wantarray) {
+ if(@box && exists $input{'x'} and exists $input{'y'}) {
+ my($gdescent, $gascent)=@box[1,3];
+ $box[1]=$input{'y'}-$gascent; # top = base - ascent (Y is down)
+ $box[3]=$input{'y'}-$gdescent; # bottom = base - descent (Y is down, descent is negative)
+ $box[0]+=$input{'x'};
+ $box[2]+=$input{'x'};
+ } elsif (@box && $input{'canon'}) {
+ $box[3]-=$box[1]; # make it cannoical (ie (0,0) - (width, height))
+ $box[2]-=$box[0];
+ }
+ return @box;
+ }
+ else {
+ require Imager::Font::BBox;
+
+ return Imager::Font::BBox->new(@box);
+ }
+}
+
+sub dpi {
+ my $self = shift;
+
+ # I'm assuming a default of 72 dpi
+ my @old = (72, 72);
+ if (@_) {
+ $Imager::ERRSTR = "Setting dpi not implemented for this font type";
+ return;
+ }
+
+ return @old;
+}
+
+sub transform {
+ my $self = shift;
+
+ my %hsh = @_;
+
+ # this is split into transform() and _transform() so we can
+ # implement other tags like: degrees=>12, which would build a
+ # 12 degree rotation matrix
+ # but I'll do that later
+ unless ($hsh{matrix}) {
+ $Imager::ERRSTR = "You need to supply a matrix";
+ return;
+ }
+
+ return $self->_transform(%hsh);
+}
+
+sub _transform {
+ $Imager::ERRSTR = "This type of font cannot be transformed";
+ return;
+}
+
+sub utf8 {
+ return 0;
+}
+
+sub priorities {
+ my $self = shift;
+ my @old = @priority;
+
+ if (@_) {
+ @priority = grep Imager::i_has_format($_), @_;
+ }
+ return @old;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Imager::Font - Font handling for Imager.
+
+=head1 SYNOPSIS
+
+ use Imager;
+
+ $t1font = Imager::Font->new(file => 'pathtofont.pfb');
+ $ttfont = Imager::Font->new(file => 'pathtofont.ttf');
+ $w32font = Imager::Font->new(face => 'Times New Roman');
+
+ $blue = Imager::Color->new("#0000FF");
+ $font = Imager::Font->new(file => 'pathtofont.ttf',
+ color => $blue,
+ size => 30);
+
+ ($neg_width,
+ $global_descent,
+ $pos_width,
+ $global_ascent,
+ $descent,
+ $ascent,
+ $advance_width,
+ $right_bearing) = $font->bounding_box(string=>"Foo");
+
+ my $bbox_object = $font->bounding_box(string=>"Foo");
+
+ # documented in Imager::Draw
+ $img->string(font => $font,
+ text => "Model-XYZ",
+ x => 15,
+ y => 40,
+ size => 40,
+ color => $red,
+ aa => 1);
+
+=head1 DESCRIPTION
+
+This module handles creating Font objects used by imager. The module
+also handles querying fonts for sizes and such. If both T1lib and
+freetype were avaliable at the time of compilation then Imager should
+be able to work with both truetype fonts and t1 postscript fonts. To
+check if Imager is t1 or truetype capable you can use something like
+this:
+
+ use Imager;
+ print "Has truetype" if $Imager::formats{tt};
+ print "Has t1 postscript" if $Imager::formats{t1};
+ print "Has Win32 fonts" if $Imager::formats{w32};
+ print "Has Freetype2" if $Imager::formats{ft2};
+
+=over 4
+
+=item new
+
+This creates a font object to pass to functions that take a font argument.
+
+ $font = Imager::Font->new(file => 'denmark.ttf',
+ index => 0,
+ color => $blue,
+ size => 30,
+ aa => 1);
+
+This creates a font which is the truetype font denmark.ttf. It's
+default color is $blue, default size is 30 pixels and it's rendered
+antialised by default. Imager can see which type of font a file is by
+looking at the suffix of the filename for the font. A suffix of 'ttf'
+is taken to mean a truetype font while a suffix of 'pfb' is taken to
+mean a t1 postscript font. If Imager cannot tell which type a font is
+you can tell it explicitly by using the C<type> parameter:
+
+ $t1font = Imager::Font->new(file => 'fruitcase', type => 't1');
+ $ttfont = Imager::Font->new(file => 'arglebarf', type => 'tt');
+
+The C<index> parameter is used to select a single face from a font
+file containing more than one face, for example, from a Macintosh font
+suitcase or a .dfont file.
+
+If any of the C<color>, C<size> or C<aa> parameters are omitted when
+calling C<< Imager::Font->new() >> the they take the following values:
+
+ color => Imager::Color->new(255, 0, 0, 0); # this default should be changed
+ size => 15
+ aa => 0
+ index => 0
+
+To use Win32 fonts supply the facename of the font:
+
+ $font = Imager::Font->new(face=>'Arial Bold Italic');
+
+There isn't any access to other logical font attributes, but this
+typically isn't necessary for Win32 TrueType fonts, since you can
+contruct the full name of the font as above.
+
+Other logical font attributes may be added if there is sufficient demand.
+
+Parameters:
+
+=over
+
+=item *
+
+file - name of the file to load the font from.
+
+=item *
+
+face - face name. This is used only under Win32 to create a GDI based
+font. This is ignored if the C<file> parameter is supplied.
+
+=item *
+
+type - font driver to use. Currently the permitted values for this are:
+
+=over
+
+=item *
+
+tt - Freetype 1.x driver. Supports TTF fonts.
+
+=item *
+
+t1 - T1 Lib driver. Supports Postscript Type 1 fonts. Allows for
+synthesis of underline, strikethrough and overline.
+
+=item *
+
+ft2 - Freetype 2.x driver. Supports many different font formats.
+Also supports the transform() method.
+
+=back
+
+=item *
+
+color - the default color used with this font. Default: red.
+
+=item *
+
+size - the default size used with this font. Default: 15.
+
+=item *
+
+utf8 - if non-zero then text supplied to $img->string(...) and
+$font->bounding_box(...) is assumed to be UTF 8 encoded by default.
+
+=item *
+
+align - the default value for the $img->string(...) C<align>
+parameter. Default: 1.
+
+=item *
+
+vlayout - the default value for the $img->string(...) C<vlayout>
+parameter. Default: 0.
+
+=item *
+
+aa - the default value for the $im->string(...) C<aa> parameter.
+Default: 0.
+
+=item *
+
+index - for font file containing multiple fonts this selects which
+font to use. This is useful for Macintosh DFON (.dfont) and suitcase
+font files.
+
+If you want to use a suitcase font you will need to tell Imager to use
+the FreeType 2.x driver by setting C<type> to C<'ft2'>:
+
+ my $font = Imager::Font->new(file=>$file, index => 1, type=>'ft2')
+ or die Imager->errstr;
+
+=back
+
+
+
+=item bounding_box
+
+Returns the bounding box for the specified string. Example:
+
+ my ($neg_width,
+ $global_descent,
+ $pos_width,
+ $global_ascent,
+ $descent,
+ $ascent,
+ $advance_width,
+ $right_bearing) = $font->bounding_box(string => "A Fool");
+
+ my $bbox_object = $font->bounding_box(string => "A Fool");
+
+=over
+
+=item C<$neg_width>
+
+the relative start of a the string. In some
+cases this can be a negative number, in that case the first letter
+stretches to the left of the starting position that is specified in
+the string method of the Imager class
+
+=item C<$global_descent>
+
+how far down the lowest letter of the entire font reaches below the
+baseline (this is often j).
+
+=item C<$pos_width>
+
+how wide the string from
+the starting position is. The total width of the string is
+C<$pos_width-$neg_width>.
+
+=item C<$descent>
+
+=item C<$ascent>
+
+the same as <$global_descent> and <$global_ascent> except that they
+are only for the characters that appear in the string.
+
+=item C<$advance_width>
+
+the distance from the start point that the next string output should
+start at, this is often the same as C<$pos_width>, but can be
+different if the final character overlaps the right side of its
+character cell.
+
+=item C<$right_bearing>
+
+The distance from the right side of the final glyph to the end of the
+advance width. If the final glyph overflows the advance width this
+value is negative.
+
+=back
+
+Obviously we can stuff all the results into an array just as well:
+
+ @metrics = $font->bounding_box(string => "testing 123");
+
+Note that extra values may be added, so $metrics[-1] isn't supported.
+It's possible to translate the output by a passing coordinate to the
+bounding box method:
+
+ @metrics = $font->bounding_box(string => "testing 123", x=>45, y=>34);
+
+This gives the bounding box as if the string had been put down at C<(x,y)>
+By giving bounding_box 'canon' as a true value it's possible to measure
+the space needed for the string:
+
+ @metrics = $font->bounding_box(string=>"testing",size=>15,canon=>1);
+
+This returns tha same values in $metrics[0] and $metrics[1],
+but:
+
+ $bbox[2] - horizontal space taken by glyphs
+ $bbox[3] - vertical space taken by glyphs
+
+Returns an L<Imager::Font::BBox> object in scalar context, so you can
+avoid all those confusing indices. This has methods as named above,
+with some extra convenience methods.
+
+Parameters are:
+
+=over
+
+=item *
+
+string - the string to calculate the bounding box for. Required.
+
+=item *
+
+size - the font size to use. Default: value set in
+Imager::Font->new(), or 15.
+
+=item *
+
+sizew - the font width to use. Default to the value of the C<size>
+parameter.
+
+=item *
+
+utf8 - For drivers that support it, treat the string as UTF8 encoded.
+For versions of perl that support Unicode (5.6 and later), this will
+be enabled automatically if the 'string' parameter is already a UTF8
+string. See L<UTF8> for more information. Default: the C<utf8> value
+passed to Imager::Font->new(...) or 0.
+
+=item *
+
+x, y - offsets applied to @box[0..3] to give you a adjusted bounding
+box. Ignored in scalar context.
+
+=item *
+
+canon - if non-zero and the C<x>, C<y> parameters are not supplied,
+then $pos_width and $global_ascent values will returned as the width
+and height of the text instead.
+
+=back
+
+=item string
+
+The $img->string(...) method is now documented in
+L<Imager::Draw/string>
+
+=item align(string=>$text, size=>$size, x=>..., y=>..., valign => ..., halign=>...)
+
+Higher level text output - outputs the text aligned as specified
+around the given point (x,y).
+
+ # "Hello" centered at 100, 100 in the image.
+ my ($left, $top, $right, $bottom) =
+ $font->align(string=>"Hello",
+ x=>100, y=>100,
+ halign=>'center', valign=>'center',
+ image=>$image);
+
+Takes the same parameters as $font->draw(), and the following extra
+parameters:
+
+=over
+
+=item valign
+
+Possible values are:
+
+=over
+
+=item top
+
+Point is at the top of the text.
+
+=item bottom
+
+Point is at the bottom of the text.
+
+=item baseline
+
+Point is on the baseline of the text (default.)
+
+=item center
+
+Point is vertically centered within the text.
+
+=back
+
+=item halign
+
+=over
+
+=item left
+
+The point is at the left of the text.
+
+=item start
+
+The point is at the start point of the text.
+
+=item center
+
+The point is horizontally centered within the text.
+
+=item right
+
+The point is at the right end of the text.
+
+=item end
+
+The point is at the end point of the text.
+
+=back
+
+=item image
+
+The image to draw to. Set to C<undef> to avoid drawing but still
+calculate the bounding box.
+
+=back
+
+Returns a list specifying the bounds of the drawn text.
+
+=item dpi()
+
+=item dpi(xdpi=>$xdpi, ydpi=>$ydpi)
+
+=item dpi(dpi=>$dpi)
+
+Set or retrieve the spatial resolution of the image in dots per inch.
+The default is 72 dpi.
+
+This isn't implemented for all font types yet.
+
+Possible parameters are:
+
+=over
+
+=item *
+
+xdpi, ydpi - set the horizontal and vertical resolution in dots per
+inch.
+
+=item *
+
+dpi - set both horizontal and vertical resolution to this value.
+
+=back
+
+Returns a list containing the previous xdpi, ydpi values.
+
+=item transform(matrix=>$matrix)
+
+Applies a transformation to the font, where matrix is an array ref of
+numbers representing a 2 x 3 matrix:
+
+ [ $matrix->[0], $matrix->[1], $matrix->[2],
+ $matrix->[3], $matrix->[4], $matrix->[5] ]
+
+Not all font types support transformations, these will return false.
+
+It's possible that a driver will disable hinting if you use a
+transformation, to prevent discontinuities in the transformations.
+See the end of the test script t/t38ft2font.t for an example.
+
+Currently only the ft2 (Freetype 2.x) driver supports the transform()
+method.
+
+See samples/slant_text.pl for a sample using this function.
+
+Note that the transformation is done in font co-ordinates where y
+increases as you move up, not image co-ordinates where y decreases as
+you move up.
+
+=item has_chars(string=>$text)
+
+Checks if the characters in $text are defined by the font.
+
+In a list context returns a list of true or false value corresponding
+to the characters in $text, true if the character is defined, false if
+not. In scalar context returns a string of NUL or non-NUL
+characters. Supports UTF8 where the font driver supports UTF8.
+
+Not all fonts support this method (use $font->can("has_chars") to
+check.)
+
+=over
+
+=item *
+
+string - string of characters to check for. Required. Must contain
+at least one character.
+
+=item *
+
+utf8 - For drivers that support it, treat the string as UTF8 encoded.
+For versions of perl that support Unicode (5.6 and later), this will
+be enabled automatically if the 'string' parameter is already a UTF8
+string. See L<UTF8> for more information. Default: the C<utf8> value
+passed to Imager::Font->new(...) or 0.
+
+=back
+
+=item face_name()
+
+Returns the internal name of the face. Not all font types support
+this method yet.
+
+=item glyph_names(string=>$string [, utf8=>$utf8 ][, reliable_only=>0 ] );
+
+Returns a list of glyph names for each of the characters in the
+string. If the character has no name then C<undef> is returned for
+the character.
+
+Some font files do not include glyph names, in this case Freetype 2
+will not return any names. Freetype 1 can return standard names even
+if there are no glyph names in the font.
+
+Freetype 2 has an API function that returns true only if the font has
+"reliable glyph names", unfortunately this always returns false for
+TTF fonts. This can avoid the check of this API by supplying
+C<reliable_only> as 0. The consequences of using this on an unknown
+font may be unpredictable, since the Freetype documentation doesn't
+say how those name tables are unreliable, or how FT2 handles them.
+
+Both Freetype 1.x and 2.x allow support for glyph names to not be
+included.
+
+=item draw
+
+This is used by Imager's string() method to implement drawing text.
+See L<Imager::Draw/string>.
+
+=back
+
+=head1 MULTIPLE MASTER FONTS
+
+The Freetype 2 driver supports multiple master fonts:
+
+=over
+
+=item is_mm()
+
+Test if the font is a multiple master font.
+
+=item mm_axes()
+
+Returns a list of the axes that can be changes in the font. Each
+entry is an array reference which contains:
+
+=over
+
+=item 1.
+
+Name of the axis.
+
+=item 2.
+
+minimum value for this axis.
+
+=item 3.
+
+maximum value for this axis
+
+=back
+
+=item set_mm_coords(coords=>\@values)
+
+Blends an interpolated design from the master fonts. @values must
+contain as many values as there are axes in the font.
+
+=back
+
+For example, to select the minimum value in each axis:
+
+ my @axes = $font->mm_axes;
+ my @coords = map $_->[1], @axes;
+ $font->set_mm_coords(coords=>\@coords);
+
+It's possible other drivers will support multiple master fonts in the
+future, check if your selected font object supports the is_mm() method
+using the can() method.
+
+=head1 UTF8
+
+There are 2 ways of rendering Unicode characters with Imager:
+
+=over
+
+=item *
+
+For versions of perl that support it, use perl's native UTF8 strings.
+This is the simplest method.
+
+=item *
+
+Hand build your own UTF8 encoded strings. Only recommended if your
+version of perl has no UTF8 support.
+
+=back
+
+Imager won't construct characters for you, so if want to output
+unicode character 00C3 "LATIN CAPITAL LETTER A WITH DIAERESIS", and
+your font doesn't support it, Imager will I<not> build it from 0041
+"LATIN CAPITAL LETTER A" and 0308 "COMBINING DIAERESIS".
+
+To check if a driver supports UTF8 call the utf8 method:
+
+=over
+
+=item utf8
+
+Return true if the font supports UTF8.
+
+=back
+
+=head2 Native UTF8 Support
+
+If your version of perl supports UTF8 and the driver supports UTF8,
+just use the $im->string() method, and it should do the right thing.
+
+=head2 Build your own
+
+In this case you need to build your own UTF8 encoded characters.
+
+For example:
+
+ $x = pack("C*", 0xE2, 0x80, 0x90); # character code 0x2010 HYPHEN
+
+You need to be be careful with versions of perl that have UTF8
+support, since your string may end up doubly UTF8 encoded.
+
+For example:
+
+ $x = "A\xE2\x80\x90\x41\x{2010}";
+ substr($x, -1, 0) = "";
+ # at this point $x is has the UTF8 flag set, but has 5 characters,
+ # none, of which is the constructed UTF8 character
+
+The test script t/t38ft2font.t has a small example of this after the
+comment:
+
+ # an attempt using emulation of UTF8
+
+=head1 DRIVER CONTROL
+
+If you don't supply a 'type' parameter to Imager::Font->new(), but you
+do supply a 'file' parameter, Imager will attempt to guess which font
+driver to used based on the extension of the font file.
+
+Since some formats can be handled by more than one driver, a priority
+list is used to choose which one should be used, if a given format can
+be handled by more than one driver.
+
+=over
+
+=item priorities
+
+The current priorities can be retrieved with:
+
+ @drivers = Imager::Font->priorities();
+
+You can set new priorities and save the old priorities with:
+
+ @old = Imager::Font->priorities(@drivers);
+
+=back
+
+If you supply driver names that are not currently supported, they will
+be ignored.
+
+Imager supports both T1Lib and Freetype2 for working with Type 1
+fonts, but currently only T1Lib does any caching, so by default T1Lib
+is given a higher priority. Since Imager's Freetype2 support can also
+do font transformations, you may want to give that a higher priority:
+
+ my @old = Imager::Font->priorities(qw(tt ft2 t1));
+
+=head1 AUTHOR
+
+Arnar M. Hrafnkelsson, addi@umich.edu
+And a great deal of help from others - see the README for a complete
+list.
+
+=head1 BUGS
+
+You need to modify this class to add new font types.
+
+The $pos_width member returned by the bounding_box() method has
+historically returned different values from different drivers. The
+Freetype 1.x and 2.x, and the Win32 drivers return the max of the
+advance width and the right edge of the right-most glyph. The Type 1
+driver always returns the right edge of the right-most glyph.
+
+The newer advance_width and right_bearing values allow access to any
+of the above.
+
+=head1 REVISION
+
+$Revision: 1667 $
+
+=head1 SEE ALSO
+
+Imager(3), Imager::Font::FreeType2(3), Imager::Font::Type1(3),
+Imager::Font::Win32(3), Imager::Font::Truetype(3), Imager::Font::BBox(3)
+
+ http://imager.perl.org/
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Font/BBox.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Font/BBox.pm
new file mode 100755
index 00000000000..3af88568f89
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Font/BBox.pm
@@ -0,0 +1,282 @@
+package Imager::Font::BBox;
+use strict;
+use vars qw($VERSION);
+
+$VERSION = "1.005";
+
+=head1 NAME
+
+Imager::Font::BBox - objects representing the bounding box of a string.
+
+=head1 SYNOPSIS
+
+ use Imager::Font;
+
+ # get the object
+ my $font = Imager::Font->new(...);
+ my $bbox = $font->bounding_box(string=>$text, size=>$size);
+
+ # methods
+ my $start = $bbox->start_offset;
+ my $left_bearing = $bbox->left_bearing;
+ my $right_bearing = $bbox->right_bearing;
+ my $end = $bbox->end_offset;
+ my $gdescent = $box->global_descent;
+ my $gascent = $bbox->global_ascent;
+ my $ascent = $bbox->ascent;
+ my $decent = $bbox->descent;
+ my $total_width = $bbox->total_width;
+ my $fheight = $bbox->font_height;
+ my $theight = $bbox->text_height;
+ my $display_width = $bbox->display_width;
+
+=head1 DESCRIPTION
+
+Objects of this class are returned by the Imager::Font bounding_box()
+method when it is called in scalar context.
+
+This will hopefully make the information from this method more
+accessible.
+
+=head1 METHODS
+
+=over
+
+=item start_offset()
+
+=item neg_width
+
+=item left_bearing
+
+Returns the horizonatal offset from the selected drawing location to
+the left edge of the first character drawn. If this is positive, the
+first glyph is to the right of the drawing location.
+
+The alias neg_width() is present to match the bounding_box()
+documentation for list context.
+
+The alias left_bearing() is present to match font terminology.
+
+=cut
+
+sub start_offset {
+ return $_[0][0];
+}
+
+sub neg_width {
+ return $_[0][0];
+}
+
+sub left_bearing {
+ return $_[0][0];
+}
+
+=item advance_width()
+
+The advance width of the string, if the driver supports that,
+otherwise the same as end_offset.
+
+=cut
+
+sub advance_width {
+ my $self = shift;
+
+ @$self > 6 ? $self->[6] : $self->[2];
+}
+
+=item right_bearing
+
+The distance from the right of the last glyph to the end of the advance
+point.
+
+If the glyph overflows the right side of the advance width this value
+is negative.
+
+=cut
+
+sub right_bearing {
+ my $self = shift;
+
+ @$self >= 8 && return $self->[7]; # driver gives it to us
+
+ # otherwise the closest we have is the difference between the
+ # end_pos and advance_width
+ return $self->advance_width - $self->pos_width;
+}
+
+=item display_width
+
+The distance from the left-most pixel of the left-most glyph to the
+right-most pixel of the right-most glyph.
+
+Equals advance_width - left_bearing - right_bearing (and implemented
+that way.)
+
+=cut
+
+sub display_width {
+ my ($self) = @_;
+
+ $self->advance_width - $self->left_bearing - $self->right_bearing;
+}
+
+=item global_descent()
+
+The lowest position relative to the font baseline that any character
+in the font reaches in the character cell. Normally negative.
+
+At least one font we've seen has reported a positive number for this.
+
+=cut
+
+sub global_descent {
+ return $_[0][1];
+}
+
+=item global_ascent()
+
+The highest position relative to the font baseline that any character
+in the font reaches in the character cell. Normally positive.
+
+=cut
+
+sub global_ascent {
+ return $_[0][3];
+}
+
+=item descent()
+
+The lowest position relative to the font baseline that any character
+in the supplied string reaches. Negative when any character's glyph
+reaches below the baseline.
+
+=cut
+
+sub descent {
+ return $_[0][4];
+}
+
+=item ascent()
+
+The highest position relative to the font baseline that any character
+in the supplied string reaches. Positive if any character's glyph
+reaches above the baseline.
+
+=cut
+
+sub ascent {
+ return $_[0][5];
+}
+
+=item font_height()
+
+The maximum displayed height of any string using this font.
+
+=cut
+
+sub font_height {
+ my $self = shift;
+ $self->global_ascent - $self->global_descent;
+}
+
+=item text_height()
+
+The displayed height of the supplied string.
+
+=cut
+
+sub text_height {
+ my $self = shift;
+
+ $self->ascent - $self->descent;
+}
+
+=back
+
+=head1 OBSOLETE METHODS
+
+These methods include bugs kept for backwards compatibility and
+shouldn't be used in new code.
+
+=over
+
+=item total_width()
+
+The total displayed width of the string.
+
+New code should use display_width().
+
+This depends on end_offset(), and is limited by it's backward
+compatibility.
+
+=cut
+
+sub total_width {
+ my $self = shift;
+
+ $self->end_offset - $self->start_offset;
+}
+
+=item end_offset
+
+=item pos_width
+
+The offset from the selected drawing location to the right edge of the
+last character drawn. Should always be positive.
+
+You can use the alias pos_width() if you are used to the
+bounding_box() documentation for list context.
+
+For backwards compatibility this method returns the maximum of the
+advance width and the offset of the right edge of the last glyph.
+
+=cut
+
+sub end_offset {
+ return $_[0][2];
+}
+
+sub pos_width {
+ return $_[0][2];
+}
+
+=back
+
+=head1 INTERNAL FUNCTIONS
+
+=over
+
+=item new(...)
+
+Called by Imager::Font->bounding_box() to create the object.
+
+=cut
+
+sub new {
+ my $class = shift;
+ return bless [ @_ ], $class;
+}
+
+=back
+
+=head1 BUGS
+
+Doesn't reproduce the functionality that you get using the x and y
+parameters to Imager::Font->bounding_box(). I considered:
+
+ my ($left, $top, $right, $bottom) = $box->offset(x=>$x, y=>$y)
+
+but this is about as clumsy as the original.
+
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=head1 SEE ALSO
+
+Imager(3), Imager::Font(3)
+
+=cut
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Font/FreeType2.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Font/FreeType2.pm
new file mode 100755
index 00000000000..4f0ac2e4358
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Font/FreeType2.pm
@@ -0,0 +1,233 @@
+package Imager::Font::FreeType2;
+use strict;
+use Imager::Color;
+use vars qw(@ISA $VERSION);
+@ISA = qw(Imager::Font);
+
+$VERSION = "1.013";
+
+*_first = \&Imager::Font::_first;
+
+sub new {
+ my $class = shift;
+ my %hsh=(color=>Imager::Color->new(255,0,0,0),
+ size=>15,
+ @_);
+
+ unless ($hsh{file}) {
+ $Imager::ERRSTR = "No font file specified";
+ return;
+ }
+ unless (-e $hsh{file}) {
+ $Imager::ERRSTR = "Font file $hsh{file} not found";
+ return;
+ }
+ unless ($Imager::formats{ft2}) {
+ $Imager::ERRSTR = "Freetype2 not supported in this build";
+ return;
+ }
+ my $id = i_ft2_new($hsh{file}, $hsh{'index'} || 0);
+ unless ($id) { # the low-level code may miss some error handling
+ $Imager::ERRSTR = Imager::_error_as_msg();
+ return;
+ }
+ return bless {
+ id => $id,
+ aa => $hsh{aa} || 0,
+ file => $hsh{file},
+ type => 't1',
+ size => $hsh{size},
+ color => $hsh{color},
+ utf8 => $hsh{utf8},
+ vlayout => $hsh{vlayout},
+ }, $class;
+}
+
+sub _draw {
+ my $self = shift;
+ my %input = @_;
+ if (exists $input{channel}) {
+ i_ft2_cp($self->{id}, $input{image}{IMG}, $input{'x'}, $input{'y'},
+ $input{channel}, $input{size}, $input{sizew} || 0,
+ $input{string}, , $input{align}, $input{aa}, $input{vlayout},
+ $input{utf8});
+ } else {
+ i_ft2_text($self->{id}, $input{image}{IMG},
+ $input{'x'}, $input{'y'},
+ $input{color}, $input{size}, $input{sizew} || 0,
+ $input{string}, $input{align}, $input{aa}, $input{vlayout},
+ $input{utf8});
+ }
+}
+
+sub _bounding_box {
+ my $self = shift;
+ my %input = @_;
+
+ return i_ft2_bbox($self->{id}, $input{size}, $input{sizew}, $input{string},
+ $input{utf8});
+}
+
+sub dpi {
+ my $self = shift;
+ my @old = i_ft2_getdpi($self->{id});
+ if (@_) {
+ my %hsh = @_;
+ my $result;
+ unless ($hsh{xdpi} && $hsh{ydpi}) {
+ if ($hsh{dpi}) {
+ $hsh{xdpi} = $hsh{ydpi} = $hsh{dpi};
+ }
+ else {
+ $Imager::ERRSTR = "dpi method requires xdpi and ydpi or just dpi";
+ return;
+ }
+ i_ft2_setdpi($self->{id}, $hsh{xdpi}, $hsh{ydpi}) or return;
+ }
+ }
+
+ return @old;
+}
+
+sub hinting {
+ my ($self, %opts) = @_;
+
+ i_ft2_sethinting($self->{id}, $opts{hinting} || 0);
+}
+
+sub _transform {
+ my $self = shift;
+
+ my %hsh = @_;
+ my $matrix = $hsh{matrix} or return undef;
+
+ return i_ft2_settransform($self->{id}, $matrix)
+}
+
+sub utf8 {
+ return 1;
+}
+
+# check if the font has the characters in the given string
+sub has_chars {
+ my ($self, %hsh) = @_;
+
+ unless (defined $hsh{string} && length $hsh{string}) {
+ $Imager::ERRSTR = "No string supplied to \$font->has_chars()";
+ return;
+ }
+ return i_ft2_has_chars($self->{id}, $hsh{string},
+ _first($hsh{'utf8'}, $self->{utf8}, 0));
+}
+
+sub face_name {
+ my ($self) = @_;
+
+ i_ft2_face_name($self->{id});
+}
+
+sub can_glyph_names {
+ i_ft2_can_do_glyph_names();
+}
+
+sub glyph_names {
+ my ($self, %input) = @_;
+
+ my $string = $input{string};
+ defined $string
+ or return Imager->_set_error("no string parameter passed to glyph_names");
+ my $utf8 = _first($input{utf8}, 0);
+ my $reliable_only = _first($input{reliable_only}, 1);
+
+ my @names = i_ft2_glyph_name($self->{id}, $string, $utf8, $reliable_only);
+ @names or return Imager->_set_error(Imager->_error_as_msg);
+
+ return @names if wantarray;
+ return pop @names;
+}
+
+sub is_mm {
+ my ($self) = @_;
+
+ i_ft2_is_multiple_master($self->{id});
+}
+
+sub mm_axes {
+ my ($self) = @_;
+
+ my ($num_axis, $num_design, @axes) =
+ i_ft2_get_multiple_masters($self->{id})
+ or return Imager->_set_error(Imager->_error_as_msg);
+
+ return @axes;
+}
+
+sub set_mm_coords {
+ my ($self, %opts) = @_;
+
+ $opts{coords}
+ or return Imager->_set_error("Missing coords parameter");
+ ref($opts{coords}) && $opts{coords} =~ /ARRAY\(0x[\da-f]+\)$/
+ or return Imager->_set_error("coords parameter must be an ARRAY ref");
+
+ i_ft2_set_mm_coords($self->{id}, @{$opts{coords}})
+ or return Imager->_set_error(Imager->_error_as_msg);
+
+ return 1;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ Imager::Font::FreeType2 - low-level functions for FreeType2 text output
+
+=head1 DESCRIPTION
+
+Imager::Font creates a Imager::Font::FreeType2 object when asked to.
+
+See Imager::Font to see how to use this type.
+
+This class provides low-level functions that require the caller to
+perform data validation.
+
+This driver supports:
+
+=over
+
+=item transform()
+
+=item dpi()
+
+=item draw()
+
+The following parameters:
+
+=over
+
+=item utf8
+
+=item vlayour
+
+=item sizew
+
+=back
+
+=back
+
+=head2 Special behaviors
+
+If you call transform() to set a transformation matrix, hinting will
+be switched off. This prevents sudden jumps in the size of the text
+caused by the hinting when the transformation is the identity matrix.
+If for some reason you want hinting enabled, use
+$font->hinting(hinting=>1) to re-enable hinting. This will need to be
+called after I<each> call to transform().
+
+=head1 AUTHOR
+
+Addi, Tony
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Font/Image.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Font/Image.pm
new file mode 100755
index 00000000000..19f3920ffe4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Font/Image.pm
@@ -0,0 +1,167 @@
+package Imager::Font::Image;
+use strict;
+use Imager::Color;
+use File::Basename;
+use File::Spec;
+
+use vars qw(@ISA %REQUIRED_FIELDS);
+@ISA = qw(Imager::Font);
+
+sub NWIDTH () { 0 }
+sub PWIDTH () { 2 }
+sub GDESCENT () { 1 }
+sub GASCENT () { 3 }
+sub DESCENT () { 4 }
+sub ASCENT () { 5 }
+
+
+%REQUIRED_FIELDS = (
+ Image_spec => 1,
+ Font_size => 1,
+ Global_ascent => 1,
+ Global_descent => 1,);
+
+# Required fields
+# Fontmetrics:
+# Font global data:
+# image name
+# font size
+# max glyph height
+# max glyph width
+#
+# The per character data is:
+# left edge (inclusive)
+# right edge (exclusive)
+# top edge (inclusive)
+# bottom edge (exclusive)
+# left adjustment
+# forward shift
+# baseline adjustment (from top)
+#
+# The left adjustment is the starting
+# offset into the glyph, the forward shift
+# is the actual forward movement of the
+# imaginary cursor.
+
+# To calculate the size of a string use:
+# sum (forward_shift_i) + left_adjustment_0 + width_last - left_adjustment_last - forward_shift_last
+
+# example font spec file:
+
+# IAGRFONT
+# # This is an imager font definition file. This is a comment
+# Image_spec = foo.png
+# Font_size = 12
+# Global_ascent = 10
+# Global_descent = -2
+# # Per character data
+# FM_65 = 20 40 30 50 3 15
+# # Code for 'A' left edge = 20, right = 40, top = 30, bottom 50, leading = 3, forward = 15.
+# The left adjustment is the starting
+# offset into the glyph, the forward shift
+# is the actual forward movement of the
+# imaginary cursor.
+
+# To calculate the size of a string use:
+# sum (forward_shift_i) + left_adjustment_0 + width_last - left_adjustment_last - forward_shift_last
+
+
+
+sub parse_fontspec_file {
+ my ($self, $file) = @_;
+ local *FH;
+ return unless open(FH, "<$file");
+
+ my %req = %REQUIRED_FIELDS;
+
+ while(<FH>) {
+ next if m/^\#/;
+ if (m/^\s*?(\S+?)\s*=\s*(.+?)\s*$/) {
+ # Check for a required field:
+ my $char = $1;
+ my $metric = $2;
+ if ($req{$char}) {
+ $self->{$char} = $metric;
+ delete $req{$1};
+ } else {
+ next unless $char =~ s/^FM_(\d+)$/$1/;
+ next unless $metric =~ m/(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)$/;
+ $self->{fm}->{$char} = [$1, $2, $3, $4, $5, $6];
+ }
+ }
+ }
+ close(FH);
+ return $self;
+}
+
+
+
+sub new {
+ my $self = bless {}, shift;
+ my %opts = (color=>Imager::Color->new(255, 0, 0, 0), @_);
+
+ unless ($opts{file}) {
+ $Imager::ERRSTR = "No font file specified";
+ return;
+ }
+ unless ($self->parse_fontspec_file($opts{file})) {
+ $Imager::ERRSTR = "Font file $opts{file} not found or bad";
+ return;
+ }
+
+ my $img = Imager->new();
+ my $img_filename = File::Spec->catfile( dirname($opts{'file'}),
+ $self->{Image_spec} );
+
+ unless ($img->open(%opts, file=>$img_filename)) {
+ $Imager::ERRSTR = "Font IMAGE file $img_filename not found or bad: ".
+ $img->errstr();
+ return;
+ }
+
+ $self->{image} = $img;
+ $self->{size} = $self->{Font_size};
+ return $self;
+}
+
+sub get_glyph_data {
+ my ($self, $glyph_code) = @_;
+ return unless exists $self->{fm}->{$glyph_code};
+ return @{$self->{fm}->{$glyph_code}};
+}
+
+# copy_glyph
+#
+# $x, $y is left, baseline for glyphs.
+#
+
+sub copy_glyph {
+ my ($self, $glyph_code, $target_img, $x, $y) = @_;
+
+ my @gdata = $self->get_glyph_data($glyph_code) or return;
+
+ $target_img->rubthrough(src=>$self->{image},
+ tx => $x + $gdata[4],
+ ty => $y - $self->{Global_ascent},,
+ src_minx => $gdata[0],
+ src_maxx => $gdata[1],
+ src_miny => $gdata[2],
+ src_maxy => $gdata[3]);
+}
+
+sub _draw {
+ my ($self, %opts) = @_;
+
+ my $x = $opts{'x'};
+ my $y = $opts{'y'};
+
+ my @glyphs = unpack("C*", $opts{string});
+ my $img = $opts{image};
+
+ my $glyph;
+ for $glyph (@glyphs) {
+ my @gmetrics = $self->get_glyph_data($glyph) or next;
+ $self->copy_glyph($glyph, $img, $x, $y);
+ $x += $gmetrics[5];
+ }
+}
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Font/Truetype.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Font/Truetype.pm
new file mode 100755
index 00000000000..24ffd098340
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Font/Truetype.pm
@@ -0,0 +1,127 @@
+package Imager::Font::Truetype;
+use strict;
+use vars qw(@ISA $VERSION);
+@ISA = qw(Imager::Font);
+
+$VERSION = "1.010";
+
+*_first = \&Imager::Font::_first;
+
+sub new {
+ my $class = shift;
+ my %hsh=(color=>Imager::Color->new(255,0,0,0),
+ size=>15,
+ @_);
+
+ unless ($hsh{file}) {
+ $Imager::ERRSTR = "No font file specified";
+ return;
+ }
+ unless (-e $hsh{file}) {
+ $Imager::ERRSTR = "Font file $hsh{file} not found";
+ return;
+ }
+ unless ($Imager::formats{tt}) {
+ $Imager::ERRSTR = "Type 1 fonts not supported in this build";
+ return;
+ }
+ my $id = Imager::i_tt_new($hsh{file});
+ unless ($id) { # the low-level code may miss some error handling
+ $Imager::ERRSTR = Imager::_error_as_msg();
+ return;
+ }
+ return bless {
+ id => $id,
+ aa => $hsh{aa} || 0,
+ file => $hsh{file},
+ type => 'tt',
+ size => $hsh{size},
+ color => $hsh{color},
+ }, $class;
+}
+
+sub _draw {
+ my $self = shift;
+ my %input = @_;
+
+ # note that the string length parameter is ignored and calculated in
+ # XS with SvPV(), since we want the number of bytes rather than the
+ # number of characters, which is what we'd get in perl for a UTF8
+ # encoded string in 5.6 and later
+
+ if ( exists $input{channel} ) {
+ Imager::i_tt_cp($self->{id},$input{image}{IMG},
+ $input{'x'}, $input{'y'}, $input{channel}, $input{size},
+ $input{string}, length($input{string}),$input{aa},
+ $input{utf8}, $input{align});
+ } else {
+ Imager::i_tt_text($self->{id}, $input{image}{IMG},
+ $input{'x'}, $input{'y'}, $input{color},
+ $input{size}, $input{string},
+ length($input{string}), $input{aa}, $input{utf8},
+ $input{align});
+ }
+}
+
+sub _bounding_box {
+ my $self = shift;
+ my %input = @_;
+ return Imager::i_tt_bbox($self->{id}, $input{size},
+ $input{string}, length($input{string}),
+ $input{utf8});
+}
+
+sub utf8 { 1 }
+
+# check if the font has the characters in the given string
+sub has_chars {
+ my ($self, %hsh) = @_;
+
+ unless (defined $hsh{string} && length $hsh{string}) {
+ $Imager::ERRSTR = "No string supplied to \$font->has_chars()";
+ return;
+ }
+ return Imager::i_tt_has_chars($self->{id}, $hsh{string},
+ _first($hsh{'utf8'}, $self->{utf8}, 0));
+}
+
+sub face_name {
+ my ($self) = @_;
+
+ Imager::i_tt_face_name($self->{id});
+}
+
+sub glyph_names {
+ my ($self, %input) = @_;
+
+ my $string = $input{string};
+ defined $string
+ or return Imager->_set_error("no string parameter passed to glyph_names");
+ my $utf8 = _first($input{utf8} || 0);
+
+ Imager::i_tt_glyph_name($self->{id}, $string, $utf8);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ Imager::Font::Truetype - low-level functions for Truetype fonts
+
+=head1 DESCRIPTION
+
+Imager::Font creates a Imager::Font::Truetype object when asked to create
+a font object based on a .ttf file.
+
+See Imager::Font to see how to use this type.
+
+This class provides low-level functions that require the caller to
+perform data validation.
+
+=head1 AUTHOR
+
+Addi, Tony
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Font/Type1.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Font/Type1.pm
new file mode 100755
index 00000000000..d9e15e7daaf
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Font/Type1.pm
@@ -0,0 +1,191 @@
+package Imager::Font::Type1;
+use strict;
+use Imager::Color;
+use vars qw(@ISA $VERSION);
+@ISA = qw(Imager::Font);
+
+$VERSION = "1.010";
+
+*_first = \&Imager::Font::_first;
+
+my $t1aa;
+
+# $T1AA is in there because for some reason (probably cache related) antialiasing
+# is a system wide setting in t1 lib.
+
+sub t1_set_aa_level {
+ if (!defined $t1aa or $_[0] != $t1aa) {
+ Imager::i_t1_set_aa($_[0]);
+ $t1aa=$_[0];
+ }
+}
+
+sub new {
+ my $class = shift;
+ my %hsh=(color=>Imager::Color->new(255,0,0,0),
+ size=>15,
+ @_);
+
+ unless ($hsh{file}) {
+ $Imager::ERRSTR = "No font file specified";
+ return;
+ }
+ unless (-e $hsh{file}) {
+ $Imager::ERRSTR = "Font file $hsh{file} not found";
+ return;
+ }
+ unless ($Imager::formats{t1}) {
+ $Imager::ERRSTR = "Type 1 fonts not supported in this build";
+ return;
+ }
+ unless ($hsh{file} =~ m!^/! || $hsh{file} =~ m!^\./!) {
+ $hsh{file} = './' . $hsh{file};
+ }
+
+ if($hsh{afm}) {
+ unless (-e $hsh{afm}) {
+ $Imager::ERRSTR = "Afm file $hsh{afm} not found";
+ return;
+ }
+ unless ($hsh{afm} =~ m!^/! || $hsh{afm} =~ m!^\./!) {
+ $hsh{file} = './' . $hsh{file};
+ }
+ } else {
+ $hsh{afm} = 0;
+ }
+
+ my $id = Imager::i_t1_new($hsh{file},$hsh{afm});
+ unless ($id >= 0) { # the low-level code may miss some error handling
+ $Imager::ERRSTR = "Could not load font ($id)";
+ return;
+ }
+ return bless {
+ id => $id,
+ aa => $hsh{aa} || 0,
+ file => $hsh{file},
+ type => 't1',
+ size => $hsh{size},
+ color => $hsh{color},
+ }, $class;
+}
+
+sub _draw {
+ my $self = shift;
+ my %input = @_;
+ t1_set_aa_level($input{aa});
+ my $flags = '';
+ $flags .= 'u' if $input{underline};
+ $flags .= 's' if $input{strikethrough};
+ $flags .= 'o' if $input{overline};
+ if (exists $input{channel}) {
+ Imager::i_t1_cp($input{image}{IMG}, $input{'x'}, $input{'y'},
+ $input{channel}, $self->{id}, $input{size},
+ $input{string}, length($input{string}), $input{align},
+ $input{utf8}, $flags);
+ } else {
+ Imager::i_t1_text($input{image}{IMG}, $input{'x'}, $input{'y'},
+ $input{color}, $self->{id}, $input{size},
+ $input{string}, length($input{string}),
+ $input{align}, $input{utf8}, $flags);
+ }
+
+ return $self;
+}
+
+sub _bounding_box {
+ my $self = shift;
+ my %input = @_;
+ my $flags = '';
+ $flags .= 'u' if $input{underline};
+ $flags .= 's' if $input{strikethrough};
+ $flags .= 'o' if $input{overline};
+ return Imager::i_t1_bbox($self->{id}, $input{size}, $input{string},
+ length($input{string}), $input{utf8}, $flags);
+}
+
+# check if the font has the characters in the given string
+sub has_chars {
+ my ($self, %hsh) = @_;
+
+ unless (defined $hsh{string} && length $hsh{string}) {
+ $Imager::ERRSTR = "No string supplied to \$font->has_chars()";
+ return;
+ }
+ return Imager::i_t1_has_chars($self->{id}, $hsh{string},
+ _first($hsh{'utf8'}, $self->{utf8}, 0));
+}
+
+sub utf8 {
+ 1;
+}
+
+sub face_name {
+ my ($self) = @_;
+
+ Imager::i_t1_face_name($self->{id});
+}
+
+sub glyph_names {
+ my ($self, %input) = @_;
+
+ my $string = $input{string};
+ defined $string
+ or return Imager->_set_error("no string parameter passed to glyph_names");
+ my $utf8 = _first($input{utf8} || 0);
+
+ Imager::i_t1_glyph_name($self->{id}, $string, $utf8);
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+ Imager::Font::Type1 - low-level functions for Type1 fonts
+
+=head1 DESCRIPTION
+
+Imager::Font creates a Imager::Font::Type1 object when asked to create
+a font object based on a .pfb file.
+
+See Imager::Font to see how to use this type.
+
+This class provides low-level functions that require the caller to
+perform data validation
+
+By default Imager no longer creates the F<t1lib.log> log file. You
+can re-enable that by calling Imager::init() with the C<t1log> option:
+
+ Imager::init(t1log=>1);
+
+This must be called before creating any fonts.
+
+Currently specific to Imager::Font::Type1, you can use the following
+flags when drawing text or calculating a bounding box:
+
+=over
+
+=item underline
+
+Draw the text with an underline.
+
+=item overline
+
+Draw the text with an overline.
+
+=item strikethrough
+
+Draw the text with a strikethrough.
+
+=back
+
+Obviously, if you're calculating the bounding box the size of the line
+is included in the box, and the line isn't drawn :)
+
+=head1 AUTHOR
+
+Addi, Tony
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Font/Win32.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Font/Win32.pm
new file mode 100755
index 00000000000..790d9ae8b09
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Font/Win32.pm
@@ -0,0 +1,61 @@
+package Imager::Font::Win32;
+use strict;
+use vars qw(@ISA $VERSION);
+@ISA = qw(Imager::Font);
+
+$VERSION = "1.005";
+
+# called by Imager::Font::new()
+# since Win32's HFONTs include the size information this
+# is just a stub
+sub new {
+ my ($class, %opts) = @_;
+
+ return bless \%opts, $class;
+}
+
+sub _bounding_box {
+ my ($self, %opts) = @_;
+
+ my @bbox = Imager::i_wf_bbox($self->{face}, $opts{size}, $opts{string}, $opts{utf8});
+}
+
+sub _draw {
+ my $self = shift;
+
+ my %input = @_;
+ if (exists $input{channel}) {
+ Imager::i_wf_cp($self->{face}, $input{image}{IMG}, $input{x}, $input{'y'},
+ $input{channel}, $input{size},
+ $input{string}, $input{align}, $input{aa}, $input{utf8});
+ }
+ else {
+ Imager::i_wf_text($self->{face}, $input{image}{IMG}, $input{x},
+ $input{'y'}, $input{color}, $input{size},
+ $input{string}, $input{align}, $input{aa}, $input{utf8});
+ }
+}
+
+
+sub utf8 {
+ return 1;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Imager::Font::Win32 - uses Win32 GDI services for text output
+
+=head1 SYNOPSIS
+
+ my $font = Imager::Font->new(face=>"Arial");
+
+=head1 DESCRIPTION
+
+Implements font support using Win32 GDI calls. See Imager::Font for
+usage information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Font/Wrap.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Font/Wrap.pm
new file mode 100755
index 00000000000..5e061d76eab
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Font/Wrap.pm
@@ -0,0 +1,387 @@
+package Imager::Font::Wrap;
+use strict;
+use Imager;
+use Imager::Font;
+use vars qw($VERSION);
+
+$VERSION = "1.002";
+
+*_first = \&Imager::Font::_first;
+
+# we can't accept the utf8 parameter, too hard at this level
+
+# the %state contains:
+# font - the font
+# im - the image
+# x - the left position
+# w - the width
+# justify - fill, left, right or center
+
+sub _format_line {
+ my ($state, $spaces, $text, $fill) = @_;
+
+ $text =~ s/ +$//;
+ my $box = $state->{font}->bounding_box(string=>$text,
+ size=>$state->{size});
+
+ my $y = $state->{linepos} + $box->global_ascent;
+
+ if ($state->{bottom}
+ && $state->{linepos} + $box->font_height > $state->{bottom}) {
+ $state->{full} = 1;
+ return 0;
+ }
+
+ if ($text =~ /\S/ && $state->{im}) {
+ my $justify = $fill ? $state->{justify} :
+ $state->{justify} eq 'fill' ? 'left' : $state->{justify};
+ if ($justify ne 'fill') {
+ my $x = $state->{x};
+ if ($justify eq 'right') {
+ $x += $state->{w} - $box->advance_width;
+ }
+ elsif ($justify eq 'center') {
+ $x += ($state->{w} - $box->advance_width) / 2;
+ }
+ $state->{font}->draw(image=>$state->{im}, string=>$text,
+ x=>$x, 'y'=>$y,
+ size=>$state->{size}, %{$state->{input}});
+ }
+ else {
+ (my $nospaces = $text) =~ tr/ //d;
+ my $nospace_bbox = $state->{font}->bounding_box(string=>$nospaces,
+ size=>$state->{size});
+ my $gap = $state->{w} - $nospace_bbox->advance_width;
+ my $x = $state->{x};
+ $spaces = $text =~ tr/ / /;
+ while (length $text) {
+ if ($text =~ s/^(\S+)//) {
+ my $word = $1;
+ my $bbox = $state->{font}->bounding_box(string=>$word,
+ size=>$state->{size});
+ $state->{font}->draw(image=>$state->{im}, string=>$1,
+ x=>$x, 'y'=>$y,
+ size=>$state->{size}, %{$state->{input}});
+ $x += $bbox->advance_width;
+ }
+ elsif ($text =~ s/^( +)//) {
+ my $sep = $1;
+ my $advance = int($gap * length($sep) / $spaces);
+ $spaces -= length $sep;
+ $gap -= $advance;
+ $x += $advance;
+ }
+ else {
+ die "This shouldn't happen\n";
+ }
+ }
+ }
+ }
+ $state->{linepos} += $box->font_height + $state->{linegap};
+
+ 1;
+}
+
+sub wrap_text {
+ my $class = shift;
+ my %input = @_;
+
+ # try to get something useful
+ my $x = _first(delete $input{'x'}, 0);
+ my $y = _first(delete $input{'y'}, 0);
+ exists $input{image}
+ or return Imager->_set_error('No image parameter supplied');
+ my $im = delete $input{image};
+ my $imerr = $im || 'Imager';
+ my $width = delete $input{width};
+ if (!defined $width) {
+ defined $im && $im->getwidth > $x
+ or return $imerr->_set_error("No width supplied and can't guess");
+ $width = $im->getwidth - $x;
+ }
+ my $font = delete $input{font}
+ or return $imerr->_set_error("No font parameter supplied");
+ my $size = _first(delete $input{size}, $font->{size});
+ defined $size
+ or return $imerr->_set_error("No font size supplied");
+
+ 2 * $size < $width
+ or return $imerr->_set_error("Width too small for font size");
+
+ my $text = delete $input{string};
+ defined $text
+ or return $imerr->_set_error("No string parameter supplied");
+
+ my $justify = _first($input{justify}, "left");
+
+ my %state =
+ (
+ font => $font,
+ im => $im,
+ x => $x,
+ w => $width,
+ justify => $justify,
+ 'y' => $y,
+ linepos=>$y,
+ size=>$size,
+ input => \%input,
+ linegap => delete $input{linegap} || 0,
+ );
+ $state{height} = delete $input{height};
+ if ($state{height}) {
+ $state{bottom} = $y + $state{height};
+ }
+ my $line = '';
+ my $spaces = 0;
+ my $charpos = 0;
+ my $linepos = 0;
+ pos($text) = 0; # avoid a warning
+ while (pos($text) < length($text)) {
+ #print pos($text), "\n";
+ if ($text =~ /\G( +)/gc) {
+ #print "spaces\n";
+ $line .= $1;
+ $spaces += length($1);
+ }
+ elsif ($text =~ /\G(?:\x0D\x0A?|\x0A\x0D?)/gc) {
+ #print "newline\n";
+ _format_line(\%state, $spaces, $line, 0)
+ or last;
+ $line = '';
+ $spaces = 0;
+ $linepos = pos($text);
+ }
+ elsif ($text =~ /\G(\S+)/gc) {
+ #print "word\n";
+ my $word = $1;
+ my $bbox = $font->bounding_box(string=>$line . $word, size=>$size);
+ if ($bbox->advance_width > $width) {
+ _format_line(\%state, $spaces, $line, 1)
+ or last;
+ $line = '';
+ $spaces = 0;
+ $linepos = pos($text) - length($word);
+ }
+ $line .= $word;
+ # check for long words
+ $bbox = $font->bounding_box(string=>$line, size=>$size);
+ while ($bbox->advance_width > $width) {
+ my $len = length($line) - 1;
+ $bbox = $font->bounding_box(string=>substr($line, 0, $len),
+ size=>$size);
+ while ($bbox->advance_width > $width) {
+ --$len;
+ $bbox = $font->bounding_box(string=>substr($line, 0, $len),
+ size=>$size);
+ }
+ _format_line(\%state, 0, substr($line, 0, $len), 0)
+ or last;
+ $line = substr($line, $len);
+ $bbox = $font->bounding_box(string=>$line, size=>$size);
+ $linepos = pos($text) - length($line);
+ }
+ }
+ elsif ($text =~ /\G\s/gc) {
+ # skip a single unrecognized whitespace char
+ #print "skip\n";
+ $linepos = pos($text);
+ }
+ }
+
+ if (length $line && !$state{full}) {
+ $linepos += length $line
+ if _format_line(\%state, 0, $line, 0);
+ }
+
+ if ($input{savepos}) {
+ ${$input{savepos}} = $linepos;
+ }
+
+ return ($x, $y, $x+$width, $state{linepos});
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ Imager::Font::Wrap - simple wrapped text output
+
+=head1 SYNOPSIS
+
+ use Imager::Font::Wrap;
+
+ my $img = Imager->new(xsize=>$xsize, ysize=>$ysize);
+
+ my $font = Imager::Font->new(file=>$fontfile);
+
+ my $string = "..."; # text with or without newlines
+
+ Imager::Font::Wrap->wrap_text( image => $img,
+ font => $font,
+ string => $string,
+ x => $left,
+ y => $top,
+ width => $width,
+ .... );
+
+=head1 DESCRIPTION
+
+This is a simple text wrapper with options to control the layout of
+text within the line.
+
+You can control the position, width and height of the text with the
+C<image>, C<x>, C<y>, C<width> and C<height> options.
+
+You can simply calculate space usage by setting C<image> to C<undef>,
+or set C<savepos> to see how much text can fit within the given
+C<height>.
+
+=over
+
+=item wrap_text
+
+Draw word-wrapped text.
+
+=over
+
+=item x
+
+=item y
+
+The top-left corner of the rectangle the text is formatted into.
+Defaults to (0, 0).
+
+=item width
+
+The width of the formatted text in pixels. Defaults to the horizontal
+gap between the top-left corner and the right edge of the image. If
+no image is supplied then this is required.
+
+=item height
+
+The maximum height of the formated text in pixels. Not required.
+
+=item savepos
+
+The amount of text consumed (as a count of characters) will be stored
+into the scalar this refers to.
+
+ my $pagenum = 1;
+ my $string = "...";
+ my $font = ...;
+ my $savepos;
+
+ while (length $string) {
+ my $img = Imager->new(xsize=>$xsize, ysize=>$ysize);
+ Imager::Font::Wrap->wrap_text(string=>$string, font=>$font,
+ image=>$img, savepos => \$savepos)
+ or die $img->errstr;
+ $savepos > 0
+ or die "Could not fit any text on page\n";
+ $string = substr($string, $savepos);
+ $img->write(file=>"page$pagenum.ppm");
+ }
+
+=item image
+
+The image to render the text to. Can be supplied as C<undef> to
+simply calculate the bounding box.
+
+=item font
+
+The font used to render the text. Required.
+
+=item size
+
+The size to render the font in. Defaults to the size stored in the
+font object. Required if it isn't stored in the font object.
+
+=item string
+
+The text to render. This can contain non-whitespace, blanks (ASCII
+0x20), and newlines.
+
+Newlines must match /(?:\x0A\x0D?|\x0D\x0A?)/. Whitespace other than
+blanks and newlines are completely ignored.
+
+=item justify
+
+The way text is formatted within each line. Possible values include:
+
+=over
+
+=item left
+
+Left aligned against the left edge of the text box.
+
+=item right
+
+Right aligned against the right edge of the text box.
+
+=item center
+
+Centered horizontally in the text box.
+
+=item fill
+
+All but the final line of the paragraph has spaces expanded so that
+the line fills from the left to the right edge of the text box.
+
+=back
+
+=item linegap
+
+Gap between lines of text in pixels. This is in addition to the size
+from $font->font_height. Can be positive or negative. Default 0.
+
+=back
+
+Any other parameters are passed onto Imager::Font->draw().
+
+Returns a list:
+
+ ($left, $top, $right, $bottom)
+
+which are the bounds of the space used to layout the text.
+
+If C<height> is set then this is the space used within that height.
+
+You can use this to calculate the space required to format the text
+before doing it:
+
+ my ($left, $top, $right, $bottom) =
+ Imager::Font::Wrap->wrap_text(string => $string,
+ font => $font,
+ width => $xsize);
+ my $img = Imager->new(xsize=>$xsize, ysize=>$bottom);
+ Imager::Font::Wrap->wrap_text(string => $string,
+ font => $font,
+ width => $xsize,
+ image => $image);
+
+=back
+
+=head1 BUGS
+
+Imager::Font can handle UTF8 encoded text itself, but this module
+doesn't support that (and probably won't). This could probably be
+done with regex magic.
+
+Currently ignores the C<sizew> parameter, if you supply one it will be
+supplied to the draw() function and the text will be too short or too
+long for the C<width>.
+
+Uses a simplistic text model, which is why there's no hyphenation, and
+no tabs.
+
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=head1 SEE ALSO
+
+Imager(3), Imager::Font(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Fountain.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Fountain.pm
new file mode 100755
index 00000000000..72d0b8a2042
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Fountain.pm
@@ -0,0 +1,429 @@
+package Imager::Fountain;
+use strict;
+use Imager::Color::Float;
+use vars qw($VERSION);
+
+$VERSION = "1.006";
+
+=head1 NAME
+
+ Imager::Fountain - a class for building fountain fills suitable for use by
+ the fountain filter.
+
+=head1 SYNOPSIS
+
+ use Imager::Fountain;
+ my $f1 = Imager::Fountain->read(gimp=>$filename);
+ $f->write(gimp=>$filename);
+ my $f1 = Imager::Fountain->new;
+ $f1->add(start=>0, middle=>0.5, end=>1.0,
+ c0=>Imager::Color->new(...),
+ c1=>Imager::Color->new(...),
+ type=>$trans_type, color=>$color_trans_type);
+
+=head1 DESCRIPTION
+
+Provide an interface to build arrays suitable for use by the Imager
+fountain filter. These can be loaded from or saved to a GIMP gradient
+file or you can build them from scratch.
+
+=over
+
+=item read(gimp=>$filename)
+
+=item read(gimp=>$filename, name=>\$name)
+
+Loads a gradient from the given GIMP gradient file, and returns a
+new Imager::Fountain object.
+
+If the name parameter is supplied as a scalar reference then any name
+field from newer GIMP gradient files will be returned in it.
+
+ my $gradient = Imager::Fountain->read(gimp=>'foo.ggr');
+ my $name;
+ my $gradient2 = Imager::Fountain->read(gimp=>'bar.ggr', name=>\$name);
+
+=cut
+
+sub read {
+ my ($class, %opts) = @_;
+
+ if ($opts{gimp}) {
+ my $fh;
+ $fh = ref($opts{gimp}) ? $opts{gimp} : IO::File->new($opts{gimp});
+ unless ($fh) {
+ $Imager::ERRSTR = "Cannot open $opts{gimp}: $!";
+ return;
+ }
+
+ my $trash_name;
+ my $name_ref = $opts{name} && ref $opts{name} ? $opts{name} : \$trash_name;
+
+ return $class->_load_gimp_gradient($fh, $opts{gimp}, $name_ref);
+ }
+ else {
+ warn "$class::read: Nothing to do!";
+ return;
+ }
+}
+
+=item write(gimp=>$filename)
+
+=item write(gimp=>$filename, name=>$name)
+
+Save the gradient to a GIMP gradient file.
+
+The second variant allows the gradient name to be set (for newer
+versions of the GIMP).
+
+ $gradient->write(gimp=>'foo.ggr')
+ or die Imager->errstr;
+ $gradient->write(gimp=>'bar.ggr', name=>'the bar gradient')
+ or die Imager->errstr;
+
+=cut
+
+sub write {
+ my ($self, %opts) = @_;
+
+ if ($opts{gimp}) {
+ my $fh;
+ $fh = ref($opts{gimp}) ? $opts{gimp} : IO::File->new("> ".$opts{gimp});
+ unless ($fh) {
+ $Imager::ERRSTR = "Cannot open $opts{gimp}: $!";
+ return;
+ }
+
+ return $self->_save_gimp_gradient($fh, $opts{gimp}, $opts{name});
+ }
+ else {
+ warn "Nothing to do\n";
+ return;
+ }
+}
+
+=item new
+
+Create an empty fountain fill description.
+
+=cut
+
+sub new {
+ my ($class) = @_;
+
+ return bless [], $class;
+}
+
+sub _first {
+ for (@_) {
+ return $_ if defined;
+ }
+ return undef;
+}
+
+=item add(start=>$start, middle=>$middle, end=>1.0, c0=>$start_color, c1=>$end_color, type=>$trans_type, color=>$color_trans_type)
+
+Adds a new segment to the fountain fill, the possible options are:
+
+=over
+
+=item start
+
+The start position in the gradient where this segment
+takes effect between 0 and 1. Default: 0.
+
+=item middle
+
+The mid-point of the transition between the 2
+colors, between 0 and 1. Default: average of I<start> and I<end>.
+
+=item end
+
+The end of the gradient, from 0 to 1. Default: 1.
+
+=item c0
+
+The color of the fountain fill where the fill parameter is equal
+to I<start>. Default: opaque black.
+
+=item c1
+
+The color of the fountain fill where the fill parameter is equal to
+I<end>. Default: opaque black.
+
+=item type
+
+The type of segment, controls the way in which the fill parameter
+moves from 0 to 1. Default: linear.
+
+This can take any of the following values:
+
+=over
+
+=item linear
+
+=item curved
+
+Unimplemented so far.
+
+=item sine
+
+=item sphereup
+
+=item spheredown
+
+=back
+
+=item color
+
+The way in which the color transitions between I<c0> and I<c1>.
+Default: direct.
+
+This can take any of the following values:
+
+=over
+
+=item direct
+
+Each channel is simple scaled between c0 and c1.
+
+=item hueup
+
+The color is converted to a HSV value and the scaling is done such
+that the hue increases as the fill parameter increases.
+
+=item huedown
+
+The color is converted to a HSV value and the scaling is done such
+that the hue decreases as the fill parameter increases.
+
+=back
+
+=back
+
+In most cases you can ignore some of the arguments, eg.
+
+ # assuming $f is a new Imager::Fountain in each case here
+ use Imager ':handy';
+ # simple transition from red to blue
+ $f->add(c0=>NC('#FF0000'), c1=>NC('#0000FF'));
+ # simple 2 stages from red to green to blue
+ $f->add(end=>0.5, c0=>NC('#FF0000'), c1=>NC('#00FF00'))
+ $f->add(start=>0.5, c0=>NC('#00FF00'), c1=>NC('#0000FF'));
+
+=cut
+
+# used to translate segment types and color transition types to numbers
+my %type_names =
+ (
+ linear => 0,
+ curved => 1,
+ sine => 2,
+ sphereup=> 3,
+ spheredown => 4,
+ );
+
+my %color_names =
+ (
+ direct => 0,
+ hueup => 1,
+ huedown => 2
+ );
+
+sub add {
+ my ($self, %opts) = @_;
+
+ my $start = _first($opts{start}, 0);
+ my $end = _first($opts{end}, 1);
+ my $middle = _first($opts{middle}, ($start+$end)/2);
+ my @row =
+ (
+ $start, $middle, $end,
+ _first($opts{c0}, Imager::Color::Float->new(0,0,0,1)),
+ _first($opts{c1}, Imager::Color::Float->new(1,1,1,0)),
+ _first($opts{type} && $type_names{$opts{type}}, $opts{type}, 0),
+ _first($opts{color} && $color_names{$opts{color}}, $opts{color}, 0)
+ );
+ push(@$self, \@row);
+
+ $self;
+}
+
+=item simple(positions=>[ ... ], colors=>[...])
+
+Creates a simple fountain fill object consisting of linear segments.
+
+The arrayrefs passed as positions and colors must have the same number
+of elements. They must have at least 2 elements each.
+
+colors must contain Imager::Color or Imager::Color::Float objects.
+
+eg.
+
+ my $f = Imager::Fountain->simple(positions=>[0, 0.2, 1.0],
+ colors=>[ NC(255,0,0), NC(0,255,0),
+ NC(0,0,255) ]);
+
+=cut
+
+sub simple {
+ my ($class, %opts) = @_;
+
+ if ($opts{positions} && $opts{colors}) {
+ my $positions = $opts{positions};
+ my $colors = $opts{colors};
+ unless (@$positions == @$colors) {
+ $Imager::ERRSTR = "positions and colors must be the same size";
+ return;
+ }
+ unless (@$positions >= 2) {
+ $Imager::ERRSTR = "not enough segments";
+ return;
+ }
+ my $f = $class->new;
+ for my $i (0.. $#$colors-1) {
+ $f->add(start=>$positions->[$i], end=>$positions->[$i+1],
+ c0 => $colors->[$i], c1=>$colors->[$i+1]);
+ }
+ return $f;
+ }
+ else {
+ warn "Nothing to do";
+ return;
+ }
+}
+
+=back
+
+=head2 Implementation Functions
+
+Documented for internal use.
+
+=over
+
+=item _load_gimp_gradient($class, $fh, $name)
+
+Does the work of loading a GIMP gradient file.
+
+=cut
+
+sub _load_gimp_gradient {
+ my ($class, $fh, $filename, $name) = @_;
+
+ my $head = <$fh>;
+ chomp $head;
+ unless ($head eq 'GIMP Gradient') {
+ $Imager::ERRSTR = "$filename is not a GIMP gradient file";
+ return;
+ }
+ my $count = <$fh>;
+ chomp $count;
+ if ($count =~ /^name:\s?(.*)/i) {
+ ref $name and $$name = $1;
+ $count = <$fh>; # try again
+ chomp $count;
+ }
+ unless ($count =~ /^\d+$/) {
+ $Imager::ERRSTR = "$filename is missing the segment count";
+ return;
+ }
+ my @result;
+ for my $i (1..$count) {
+ my $row = <$fh>;
+ chomp $row;
+ my @row = split ' ', $row;
+ unless (@row == 13) {
+ $Imager::ERRSTR = "Bad segment definition";
+ return;
+ }
+ my ($start, $middle, $end) = splice(@row, 0, 3);
+ my $c0 = Imager::Color::Float->new(splice(@row, 0, 4));
+ my $c1 = Imager::Color::Float->new(splice(@row, 0, 4));
+ my ($type, $color) = @row;
+ push(@result, [ $start, $middle, $end, $c0, $c1, $type, $color ]);
+ }
+ return bless \@result,
+}
+
+=item _save_gimp_gradient($self, $fh, $name)
+
+Does the work of saving to a GIMP gradient file.
+
+=cut
+
+sub _save_gimp_gradient {
+ my ($self, $fh, $filename, $name) = @_;
+
+ print $fh "GIMP Gradient\n";
+ defined $name or $name = '';
+ $name =~ tr/ -~/ /cds;
+ if ($name) {
+ print $fh "Name: $name\n";
+ }
+ print $fh scalar(@$self),"\n";
+ for my $row (@$self) {
+ printf $fh "%.6f %.6f %.6f ",@{$row}[0..2];
+ for my $i (0, 1) {
+ for ($row->[3+$i]->rgba) {
+ printf $fh "%.6f ", $_/255.0;
+ }
+ }
+ print $fh "@{$row}[5,6]";
+ unless (print $fh "\n") {
+ $Imager::ERRSTR = "write error: $!";
+ return;
+ }
+ }
+
+ return 1;
+}
+
+=back
+
+=head1 FILL PARAMETER
+
+The add() documentation mentions a fill parameter in a few places,
+this is as good a place as any to discuss it.
+
+The process of deciding the color produced by the gradient works
+through the following steps:
+
+=over
+
+=item 1.
+
+calculate the base value, which is typically a distance or an angle of
+some sort. This can be positive or occasinally negative, depending on
+the type of fill being performed (linear, radial, etc).
+
+=item 2.
+
+clamp or convert the base value to the range 0 through 1, how this is
+done depends on the repeat parameter. I'm calling this result the
+fill parameter.
+
+=item 3.
+
+the appropriate segment is found. This is currently done with a
+linear search, and the first matching segment is used. If there is no
+matching segment the pixel is not touched.
+
+=item 4.
+
+the fill parameter is scaled from 0 to 1 depending on the segment type.
+
+=item 5.
+
+the color produced, depending on the segment color type.
+
+=back
+
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=head1 SEE ALSO
+
+Imager(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Handy.pod b/Master/tlpkg/tlperl.straw/lib/Imager/Handy.pod
new file mode 100755
index 00000000000..7bb2c7c6c41
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Handy.pod
@@ -0,0 +1,57 @@
+=head1 NAME
+
+Imager::Handy - simple access to common functions
+
+=head1 SYNOPSIS
+
+ use Imager ':handy';
+ my $color = NC(255, 0, 0);
+ my $font = NF(1.0, 0, 0);
+
+=head1 DESCRIPTION
+
+If you use Imager with the C<:handy> import tag, it will export a
+number of functions that can shorter your code.
+
+=over
+
+=item NC
+
+=item newcolor
+
+=item newcolour
+
+Create a new Imager::Color object, supplying any parameters to the
+new() method.
+
+ my $color = NC('red');
+
+=item NF
+
+=item newfont
+
+Create a new Imager::Font object, supplying any parameters to the
+new() method.
+
+ my $font = NF(file => 'foo.ttf');
+
+=item NCF
+
+Create a new L<Imager::Color::Font> object, supplying any parameter to
+the new() method.
+
+ my $colorf = NCF(1.0, 0, 0);
+
+=back
+
+=head1 BUGS
+
+NC() can be mostly replaced by supplying the color name or other
+description directly to the drawing method.
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/ImageTypes.pod b/Master/tlpkg/tlperl.straw/lib/Imager/ImageTypes.pod
new file mode 100755
index 00000000000..b45de4664e2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/ImageTypes.pod
@@ -0,0 +1,1164 @@
+=head1 NAME
+
+Imager::ImageTypes - image models for Imager
+
+=head1 SYNOPSIS
+
+ use Imager;
+
+ $img = Imager->new(); # Empty image (size is 0 by 0)
+ $img->open(file=>'lena.png',type=>'png'); # Read image from file
+
+ $img = Imager->new(xsize=>400, ysize=>300); # RGB data
+
+ $img = Imager->new(xsize=>400, ysize=>300, # Grayscale
+ channels=>1); #
+
+ $img = Imager->new(xsize=>400, ysize=>300, # RGB with alpha
+ channels=>4); #
+
+ $img = Imager->new(xsize=>200, ysize=>200,
+ type=>'paletted'); # paletted image
+
+ $img = Imager->new(xsize=>200, ysize=>200,
+ bits=>16); # 16 bits/channel rgb
+
+ $img = Imager->new(xsize=>200, ysize=>200,
+ bits=>'double'); # 'double' floating point
+ # per channel
+
+ $img->img_set(xsize=>500, ysize=>500, # reset the image object
+ channels=>4);
+
+
+ # Example getting information about an Imager object
+
+ print "Image information:\n";
+ print "Width: ", $img->getwidth(), "\n";
+ print "Height: ", $img->getheight(), "\n";
+ print "Channels: ", $img->getchannels(), "\n";
+ print "Bits/Channel: ", $img->bits(), "\n";
+ print "Virtual: ", $img->virtual() ? "Yes" : "No", "\n";
+ my $colorcount = $img->getcolorcount(maxcolors=>512);
+ print "Actual number of colors in image: ";
+ print defined($colorcount) ? $colorcount : ">512", "\n";
+ print "Type: ", $img->type(), "\n";
+
+ if ($img->type() eq 'direct') {
+ print "Modifiable Channels: ";
+ print join " ", map {
+ ($img->getmask() & 1<<$_) ? $_ : ()
+ } 0..$img->getchannels();
+ print "\n";
+
+ } else {
+ # palette info
+ my $count = $img->colorcount;
+ @colors = $img->getcolors();
+ print "Palette size: $count\n";
+ my $mx = @colors > 4 ? 4 : 0+@colors;
+ print "First $mx entries:\n";
+ for (@colors[0..$mx-1]) {
+ my @res = $_->rgba();
+ print "(", join(", ", @res[0..$img->getchannels()-1]), ")\n";
+ }
+ }
+
+ my @tags = $img->tags();
+ if (@tags) {
+ print "Tags:\n";
+ for(@tags) {
+ print shift @$_, ": ", join " ", @$_, "\n";
+ }
+ } else {
+ print "No tags in image\n";
+ }
+
+=head1 DESCRIPTION
+
+Imager supports two basic models of image:
+
+=over
+
+=item *
+
+direct color - all samples are stored for every pixel. eg. for an
+8-bit/sample RGB image, 24 bits are stored for each pixel.
+
+=item *
+
+paletted - an index into a table of colors is stored for each pixel.
+
+=back
+
+Direct color or paletted images can have 1 to 4 samples per color
+stored. Imager treats these as follows:
+
+=over
+
+=item *
+
+1 sample per color - grayscale image.
+
+=item *
+
+2 samples per color - grayscale image with alpha channel.
+
+=item *
+
+3 samples per color - RGB image.
+
+=item *
+
+4 samples per color - RGB image with alpha channel.
+
+=back
+
+Direct color images can have sample sizes of 8-bits per sample,
+16-bits per sample or a double precision floating point number per
+sample (64-bits on many systems).
+
+Paletted images are always 8-bits/sample.
+
+To query an existing image about it's parameters see the C<bits()>,
+C<type()>, C<getwidth()>, C<getheight()>, C<getchannels()> and
+C<virtual()> methods.
+
+The coordinate system in Imager has the origin in the upper left
+corner, see L<Imager::Draw> for details.
+
+The alpha channel when one is present is considered unassociated -
+ie. the color data has not been scaled by the alpha channel. Note
+that not all code follows this (recent) rule, but will over time.
+
+=head2 Creating Imager Objects
+
+=over
+
+=item new
+
+ $img = Imager->new();
+ $img->read(file=>"alligator.ppm") or die $img->errstr;
+
+Here C<new()> creates an empty image with width and height of zero.
+It's only useful for creating an Imager object to call the read()
+method on later.
+
+ %opts = (xsize=>300, ysize=>200);
+ $img = Imager->new(%opts); # create direct mode RGBA image
+ $img = Imager->new(%opts, channels=>4); # create direct mode RGBA image
+
+You can also read a file from new():
+
+ $img = Imager->new(file => "someimage.png");
+
+The parameters for new are:
+
+=over
+
+=item *
+
+C<xsize>, C<ysize> - Defines the width and height in pixels of the
+image. These must be positive.
+
+If not supplied then only placeholder object is created, which can be
+supplied to the C<read()> or C<img_set()> methods.
+
+=item *
+
+C<channels> - The number of channels for the image. Default 3. Valid
+values are from 1 to 4.
+
+=item *
+
+C<bits> - The storage type for samples in the image. Default: 8.
+Valid values are:
+
+=over
+
+=item *
+
+C<8> - One byte per sample. 256 discrete values.
+
+=item *
+
+C<16> - 16-bits per sample, 65536 discrete values.
+
+=item *
+
+C<double> - one C double per sample.
+
+=back
+
+Note: you can use any Imager function on any sample size image.
+
+Paletted images always use 8 bits/sample.
+
+=item *
+
+C<type> - either C<'direct'> or C<'paletted'>. Default: C<'direct'>.
+
+Direct images store color values for each pixel.
+
+Paletted images keep a table of up to 256 colors called the palette,
+each pixel is represented as an index into that table.
+
+In most cases when working with Imager you will want to use the
+C<direct> image type.
+
+If you draw on a C<paletted> image with a color not in the image's
+palette then Imager will transparently convert it to a C<direct>
+image.
+
+=item *
+
+C<maxcolors> - the maximum number of colors in a paletted image.
+Default: 256. This must be in the range 1 through 256.
+
+=item *
+
+C<file>, C<fh>, C<fd>, C<callback>, C<readcb> - specify a filename,
+filehandle, file descriptor or callback to read image data from. See
+L<Imager::Files> for details. The typical use is:
+
+ my $im = Imager->new(file => $filename);
+
+=item *
+
+C<filetype> - treated as the file format parameter, as for C<type>
+with the read() method, eg:
+
+ my $im = Imager->new(file => $filename, filetype => "gif");
+
+In most cases Imager will detect the file's format itself.
+
+=back
+
+In the simplest case just supply the width and height of the image:
+
+ # 8 bit/sample, RGB image
+ my $img = Imager->new(xsize => $width, ysize => $height);
+
+or if you want an alpha channel:
+
+ # 8 bits/sample, RGBA image
+ my $img = Imager->new(xsize => $width, ysize => $height, channels=>4);
+
+Note that it I<is> possible for image creation to fail, for example if
+channels is out of range, or if the image would take too much memory.
+
+To create paletted images, set the 'type' parameter to 'paletted':
+
+ $img = Imager->new(xsize=>200, ysize=>200, type=>'paletted');
+
+which creates an image with a maxiumum of 256 colors, which you can
+change by supplying the C<maxcolors> parameter.
+
+For improved color precision you can use the bits parameter to specify
+16 bit per channel:
+
+ $img = Imager->new(xsize=>200, ysize=>200,
+ channels=>3, bits=>16);
+
+or for even more precision:
+
+ $img = Imager->new(xsize=>200, ysize=>200,
+ channels=>3, bits=>'double');
+
+to get an image that uses a double for each channel.
+
+Note that as of this writing all functions should work on images with
+more than 8-bits/channel, but many will only work at only
+8-bit/channel precision.
+
+If you want an empty Imager object to call the read() method on, just
+call new() with no parameters:
+
+ my $img = Imager->new;
+ $img->read(file=>$filename)
+ or die $img->errstr;
+
+Though it's much easier now to just call new() with a C<file>
+parameter:
+
+ my $img = Imager->new(file => $filename)
+ or die Imager->errstr;
+
+=item img_set
+
+img_set destroys the image data in the object and creates a new one
+with the given dimensions and channels. For a way to convert image
+data between formats see the C<convert()> method.
+
+ $img->img_set(xsize=>500, ysize=>500, channels=>4);
+
+This takes exactly the same parameters as the new() method.
+
+=back
+
+=head2 Image Attribute functions
+
+These return basic attributes of an image object.
+
+=over
+
+=item getwidth
+
+ print "Image width: ", $img->getwidth(), "\n";
+
+The C<getwidth()> method returns the width of the image. This value
+comes either from C<new()> with xsize,ysize parameters or from reading
+data from a file with C<read()>. If called on an image that has no
+valid data in it like C<Imager-E<gt>new()> returns, the return value
+of C<getwidth()> is undef.
+
+=item getheight
+
+ print "Image height: ", $img->getheight(), "\n";
+
+Same details apply as for L<getwidth>.
+
+=item getchannels
+
+ print "Image has ",$img->getchannels(), " channels\n";
+
+To get the number of channels in an image C<getchannels()> is used.
+
+
+=item bits
+
+The bits() method retrieves the number of bits used to represent each
+channel in a pixel, 8 for a normal image, 16 for 16-bit image and
+'double' for a double/channel image.
+
+ if ($img->bits eq 8) {
+ # fast but limited to 8-bits/sample
+ }
+ else {
+ # slower but more precise
+ }
+
+=item type
+
+The type() method returns either 'direct' for truecolor images or
+'paletted' for paletted images.
+
+ if ($img->type eq 'paletted') {
+ # print the palette
+ for my $color ($img->getcolors) {
+ print join(",", $color->rgba), "\n";
+ }
+ }
+
+=item virtual
+
+The virtual() method returns non-zero if the image contains no actual
+pixels, for example masked images.
+
+This may also be used for non-native Imager images in the future, for
+example, for an Imager object that draws on an SDL surface.
+
+=item is_bilevel
+
+Tests if the image will be written as a monochrome or bi-level image
+for formats that support that image organization.
+
+In scalar context, returns true if the image is bi-level.
+
+In list context returns a list:
+
+ ($is_bilevel, $zero_is_white) = $img->is_bilevel;
+
+An image is considered bi-level, if all of the following are true:
+
+=over
+
+=item *
+
+the image is a paletted image
+
+=item *
+
+the image has 1 or 3 channels
+
+=item *
+
+the image has only 2 colors in the palette
+
+=item *
+
+those 2 colors are black and white, in either order.
+
+=back
+
+If a real bi-level organization image is ever added to Imager, this
+function will return true for that too.
+
+=back
+
+=head2 Direct Type Images
+
+Direct images store the color value directly for each pixel in the
+image.
+
+=over
+
+=item getmask
+
+ @rgbanames = qw( red green blue alpha );
+ my $mask = $img->getmask();
+ print "Modifiable channels:\n";
+ for (0..$img->getchannels()-1) {
+ print $rgbanames[$_],"\n" if $mask & 1<<$_;
+ }
+
+C<getmask()> is used to fetch the current channel mask. The mask
+determines what channels are currently modifiable in the image. The
+channel mask is an integer value, if the i-th lsb is set the i-th
+channel is modifiable. eg. a channel mask of 0x5 means only channels
+0 and 2 are writable.
+
+=item setmask
+
+ $mask = $img->getmask();
+ $img->setmask(mask=>8); # modify alpha only
+
+ ...
+
+ $img->setmask(mask=>$mask); # restore previous mask
+
+C<setmask()> is used to set the channel mask of the image. See
+L<getmask> for details.
+
+=back
+
+=head2 Palette Type Images
+
+Paletted images keep an array of up to 256 colors, and each pixel is
+stored as an index into that array.
+
+In general you can work with paletted images in the same way as RGB
+images, except that if you attempt to draw to a paletted image with a
+color that is not in the image's palette, the image will be converted
+to an RGB image. This means that drawing on a paletted image with
+anti-aliasing enabled will almost certainly convert the image to RGB.
+
+Palette management takes place through C<addcolors()>, C<setcolors()>,
+C<getcolors()> and C<findcolor()>:
+
+=over
+
+=item addcolors
+
+You can add colors to a paletted image with the addcolors() method:
+
+ my @colors = ( Imager::Color->new(255, 0, 0),
+ Imager::Color->new(0, 255, 0) );
+ my $index = $img->addcolors(colors=>\@colors);
+
+The return value is the index of the first color added, or undef if
+adding the colors would overflow the palette.
+
+The only parameter is C<colors> which must be a reference to an array
+of Imager::Color objects.
+
+=item setcolors
+
+ $img->setcolors(start=>$start, colors=>\@colors);
+
+Once you have colors in the palette you can overwrite them with the
+C<setcolors()> method: C<setcolors()> returns true on success.
+
+Parameters:
+
+=over
+
+=item *
+
+start - the first index to be set. Default: 0
+
+=item *
+
+colors - reference to an array of Imager::Color objects.
+
+=back
+
+=item getcolors
+
+To retrieve existing colors from the palette use the getcolors() method:
+
+ # get the whole palette
+ my @colors = $img->getcolors();
+ # get a single color
+ my $color = $img->getcolors(start=>$index);
+ # get a range of colors
+ my @colors = $img->getcolors(start=>$index, count=>$count);
+
+=item findcolor
+
+To quickly find a color in the palette use findcolor():
+
+ my $index = $img->findcolor(color=>$color);
+
+which returns undef on failure, or the index of the color.
+
+Parameter:
+
+=over
+
+=item *
+
+color - an Imager::Color object.
+
+=back
+
+=item colorcount
+
+Returns the number of colors in the image's palette:
+
+ my $count = $img->colorcount;
+
+=item maxcolors
+
+Returns the maximum size of the image's palette.
+
+ my $maxcount = $img->maxcolors;
+
+=back
+
+=head2 Color Distribution
+
+=over
+
+=item getcolorcount
+
+Calculates the number of colors in an image.
+
+The amount of memory used by this is proportional to the number of
+colors present in the image, so to avoid using too much memory you can
+supply a maxcolors parameter to limit the memory used.
+
+Note: getcolorcount() treats the image as an 8-bit per sample image.
+
+=over
+
+=item *
+
+X<maxcolors!getcolorcount>maxcolors - the maximum number of colors to
+return. Default: unlimited.
+
+=back
+
+ if (defined($img->getcolorcount(maxcolors=>512)) {
+ print "Less than 512 colors in image\n";
+ }
+
+=item getcolorusagehash
+
+Calculates a histogram of colors used by the image.
+
+=over
+
+=item *
+
+X<maxcolors!getcolorusagehash>maxcolors - the maximum number of colors
+to return. Default: unlimited.
+
+=back
+
+Returns a reference to a hash where the keys are the raw color as
+bytes, and the values are the counts for that color.
+
+The alpha channel of the image is ignored. If the image is grayscale
+then the hash keys will each be a single character.
+
+ my $colors = $img->getcolorusagehash;
+ my $blue_count = $colors->{pack("CCC", 0, 0, 255)} || 0;
+ print "#0000FF used $blue_count times\n";
+
+=item getcolorusage
+
+Calculates color usage counts and returns just the counts.
+
+=over
+
+=item *
+
+X<maxcolors!getcolorusage>maxcolors - the maximum number of colors to
+return. Default: unlimited.
+
+=back
+
+Returns a list of the color frequencies in ascending order.
+
+ my @counts = $img->getcolorusage;
+ print "The most common color is used $counts[0] times\n";
+
+=back
+
+=head2 Conversion Between Image Types
+
+Warning: if you draw on a paletted image with colors that aren't in
+the palette, the image will be internally converted to a normal image.
+
+=over
+
+=item to_paletted
+
+You can create a new paletted image from an existing image using the
+to_paletted() method:
+
+ $palimg = $img->to_paletted(\%opts)
+
+where %opts contains the options specified under L<Quantization options>.
+
+ # convert to a paletted image using the web palette
+ # use the closest color to each pixel
+ my $webimg = $img->to_paletted({ make_colors => 'webmap' });
+
+ # convert to a paletted image using a fairly optimal palette
+ # use an error diffusion dither to try to reduce the average error
+ my $optimag = $img->to_paletted({ make_colors => 'mediancut',
+ translate => 'errdiff' });
+
+=item to_rgb8
+
+You can convert a paletted image (or any image) to an 8-bit/channel
+RGB image with:
+
+ $rgbimg = $img->to_rgb8;
+
+No parameters.
+
+=item to_rgb16
+
+You can convert a paletted image (or any image) to an 16-bit/channel
+RGB image with:
+
+ $rgbimg = $img->to_rgb16;
+
+No parameters.
+
+=item masked
+
+Creates a masked image. A masked image lets you create an image proxy
+object that protects parts of the underlying target image.
+
+In the discussion below there are 3 image objects involved:
+
+=over
+
+=item *
+
+the masked image - the return value of the masked() method. Any
+writes to this image are written to the target image, assuming the
+mask image allows it.
+
+=item *
+
+the mask image - the image that protects writes to the target image.
+Supplied as the C<mask> parameter to the masked() method.
+
+=item *
+
+the target image - the image you called the masked() method on. Any
+writes to the masked image end up on this image.
+
+=back
+
+Parameters:
+
+=over
+
+=item *
+
+mask - the mask image. If not supplied then all pixels in the target
+image are writable. On each write to the masked image, only pixels
+that have non-zero in chennel 0 of the mask image will be written to
+the original image. Default: none, if not supplied then no masking is
+done, but the other parameters are still honored.
+
+=item *
+
+left, top - the offset of writes to the target image. eg. if you
+attempt to set pixel (x,y) in the masked image, then pixel (x+left,
+y+top) will be written to in the original image.
+
+=item *
+
+bottom, right - the bottom right of the area in the target available
+from the masked image.
+
+=back
+
+Masked images let you control which pixels are modified in an
+underlying image. Where the first channel is completely black in the
+mask image, writes to the underlying image are ignored.
+
+For example, given a base image called $img:
+
+ my $mask = Imager->new(xsize=>$img->getwidth, ysize=>$img->getheight,
+ channels=>1);
+ # ... draw something on the mask
+ my $maskedimg = $img->masked(mask=>$mask);
+
+ # now draw on $maskedimg and it will only draw on areas of $img
+ # where $mask is non-zero in channel 0.
+
+You can specifiy the region of the underlying image that is masked
+using the left, top, right and bottom options.
+
+If you just want a subset of the image, without masking, just specify
+the region without specifying a mask. For example:
+
+ # just work with a 100x100 region of $img
+ my $maskedimg = $img->masked(left => 100, top=>100,
+ right=>200, bottom=>200);
+
+=back
+
+=head2 Tags
+
+Image tags contain meta-data about the image, ie. information not
+stored as pixels of the image.
+
+At the perl level each tag has a name or code and a value, which is an
+integer or an arbitrary string. An image can contain more than one
+tag with the same name or code, but having more than one tag with the
+same name is discouraged.
+
+You can retrieve tags from an image using the tags() method, you can
+get all of the tags in an image, as a list of array references, with
+the code or name of the tag followed by the value of the tag.
+
+=over
+
+=item tags
+
+Retrieve tags from the image.
+
+With no parameters, retrieves a list array references, each containing
+a name and value: all tags in the image:
+
+ # get a list of ( [ name1 => value1 ], [ name2 => value2 ] ... )
+ my @alltags = $img->tags;
+ print $_->[0], ":", $_->[1], "\n" for @all_tags;
+
+ # or put it in a hash, but this will lose duplicates
+ my %alltags = map @$_, $img->tags;
+
+in scalar context this returns the number of tags:
+
+ my $num_tags = $img->tags;
+
+or you can get all tags values for the given name:
+
+ my @namedtags = $img->tags(name => $name);
+
+in scalar context this returns the first tag of that name:
+
+ my $firstnamed = $img->tags(name => $name);
+
+or a given code:
+
+ my @tags = $img->tags(code=>$code);
+
+=item addtag
+
+You can add tags using the addtag() method, either by name:
+
+ my $index = $img->addtag(name=>$name, value=>$value);
+
+or by code:
+
+ my $index = $img->addtag(code=>$code, value=>$value);
+
+=item deltag
+
+You can remove tags with the deltag() method, either by index:
+
+ $img->deltag(index=>$index);
+
+or by name:
+
+ $img->deltag(name=>$name);
+
+or by code:
+
+ $img->deltag(code=>$code);
+
+In each case deltag() returns the number of tags deleted.
+
+=item settag
+
+settag() replaces any existing tags with a new tag. This is
+equivalent to calling deltag() then addtag().
+
+=back
+
+=head2 Common Tags
+
+Many tags are only meaningful for one format. GIF looping information
+is pretty useless for JPEG for example. Thus, many tags are set by
+only a single reader or used by a single writer. For a complete list
+of format specific tags see L<Imager::Files>.
+
+Since tags are a relatively new addition their use is not wide spread
+but eventually we hope to have all the readers for various formats set
+some standard information.
+
+=over
+
+=item *
+
+X<i_xres tag>X<i_yres tag>X<tags, i_xres>X<tags, i_yres>i_xres, i_yres
+- The spatial resolution of the image in pixels per inch. If the
+image format uses a different scale, eg. pixels per meter, then this
+value is converted. A floating point number stored as a string.
+
+ # our image was generated as a 300 dpi image
+ $img->settag(name => 'i_xres', value => 300);
+ $img->settag(name => 'i_yres', value => 300);
+
+ # 100 pixel/cm for a TIFF image
+ $img->settag(name => 'tiff_resolutionunit', value => 3); # RESUNIT_CENTIMETER
+ # convert to pixels per inch, Imager will convert it back
+ $img->settag(name => 'i_xres', value => 100 * 2.54);
+ $img->settag(name => 'i_yres', value => 100 * 2.54);
+
+=item *
+
+X<i_aspect_only tag>X<tags, i_aspect_only>i_aspect_only - If this is
+non-zero then the values in i_xres and i_yres are treated as a ratio
+only. If the image format does not support aspect ratios then this is
+scaled so the smaller value is 72dpi.
+
+=item *
+
+X<i_incomplete tag>X<tags, i_incomplete>i_incomplete - If this tag is
+present then the whole image could not be read. This isn't
+implemented for all images yet, and may not be.
+
+=item *
+
+X<i_lines_read tag>X<tags, i_lines_read>i_lines_read - If
+C<i_incomplete> is set then this tag may be set to the number of
+scanlines successfully read from the file. This can be used to decide
+whether an image is worth processing.
+
+=item *
+
+X<i_format tag>X<tags, i_format>i_format - The file format this file
+was read from.
+
+=item *
+
+X<i_background>X<tags, i_background>i_background - used when writing
+an image with an alpha channel to a file format that doesn't support
+alpha channels. The C<write> method will convert a normal color
+specification like "#FF0000" into a color object for you, but if you
+set this as a tag you will need to format it like
+C<color(>I<red>C<,>I<green>C<,>I<blue>C<)>, eg color(255,0,0).
+
+=back
+
+=head2 Quantization options
+
+These options can be specified when calling
+L<Imager::ImageTypes/to_paletted>, write_multi() for gif files, when
+writing a single image with the gifquant option set to 'gen', or for
+direct calls to i_writegif_gen and i_writegif_callback.
+
+=over
+
+=item colors
+
+A arrayref of colors that are fixed. Note that some color generators
+will ignore this. If this is supplied it will be filled with the
+color table generated for the image.
+
+=item transp
+
+The type of transparency processing to perform for images with an
+alpha channel where the output format does not have a proper alpha
+channel (eg. gif). This can be any of:
+
+=over
+
+=item none
+
+No transparency processing is done. (default)
+
+=item threshold
+
+Pixels more transparent that tr_threshold are rendered as transparent.
+
+=item errdiff
+
+An error diffusion dither is done on the alpha channel. Note that
+this is independent of the translation performed on the colour
+channels, so some combinations may cause undesired artifacts.
+
+=item ordered
+
+The ordered dither specified by tr_orddith is performed on the alpha
+channel.
+
+=back
+
+This will only be used if the image has an alpha channel, and if there
+is space in the palette for a transparency colour.
+
+=item tr_threshold
+
+The highest alpha value at which a pixel will be made transparent when
+transp is 'threshold'. (0-255, default 127)
+
+=item tr_errdiff
+
+The type of error diffusion to perform on the alpha channel when
+transp is 'errdiff'. This can be any defined error diffusion type
+except for custom (see errdiff below).
+
+=item tr_orddith
+
+The type of ordered dither to perform on the alpha channel when transp
+is 'ordered'. Possible values are:
+
+=over
+
+=item random
+
+A semi-random map is used. The map is the same each time.
+
+=item dot8
+
+8x8 dot dither.
+
+=item dot4
+
+4x4 dot dither
+
+=item hline
+
+horizontal line dither.
+
+=item vline
+
+vertical line dither.
+
+=item "/line"
+
+=item slashline
+
+diagonal line dither
+
+=item '\line'
+
+=item backline
+
+diagonal line dither
+
+=item tiny
+
+dot matrix dither (currently the default). This is probably the best
+for displays (like web pages).
+
+=item custom
+
+A custom dither matrix is used - see tr_map
+
+=back
+
+=item tr_map
+
+When tr_orddith is custom this defines an 8 x 8 matrix of integers
+representing the transparency threshold for pixels corresponding to
+each position. This should be a 64 element array where the first 8
+entries correspond to the first row of the matrix. Values should be
+betweern 0 and 255.
+
+=item make_colors
+
+Defines how the quantization engine will build the palette(s).
+Currently this is ignored if 'translate' is 'giflib', but that may
+change. Possible values are:
+
+=over
+
+=item *
+
+none - only colors supplied in 'colors' are used.
+
+=item *
+
+webmap - the web color map is used (need url here.)
+
+=item *
+
+addi - The original code for generating the color map (Addi's code) is
+used.
+
+=item *
+
+mediancut - Uses a mediancut algorithm, faster than 'addi', but not as good a
+result.
+
+=item *
+
+mono, monochrome - a fixed black and white palette, suitable for
+producing bi-level images (eg. facsimile)
+
+=back
+
+Other methods may be added in the future.
+
+=item colors
+
+A arrayref containing Imager::Color objects, which represents the
+starting set of colors to use in translating the images. webmap will
+ignore this. On return the final colors used are copied back into
+this array (which is expanded if necessary.)
+
+=item max_colors
+
+The maximum number of colors to use in the image.
+
+=item translate
+
+The method used to translate the RGB values in the source image into
+the colors selected by make_colors. Note that make_colors is ignored
+whene translate is 'giflib'.
+
+Possible values are:
+
+=over
+
+=item giflib
+
+The giflib native quantization function is used.
+
+=item closest
+
+The closest color available is used.
+
+=item perturb
+
+The pixel color is modified by perturb, and the closest color is chosen.
+
+=item errdiff
+
+An error diffusion dither is performed.
+
+=back
+
+It's possible other transate values will be added.
+
+=item errdiff
+
+The type of error diffusion dither to perform. These values (except
+for custom) can also be used in tr_errdif.
+
+=over
+
+=item floyd
+
+Floyd-Steinberg dither
+
+=item jarvis
+
+Jarvis, Judice and Ninke dither
+
+=item stucki
+
+Stucki dither
+
+=item custom
+
+Custom. If you use this you must also set errdiff_width,
+errdiff_height and errdiff_map.
+
+=back
+
+=item errdiff_width
+
+=item errdiff_height
+
+=item errdiff_orig
+
+=item errdiff_map
+
+When translate is 'errdiff' and errdiff is 'custom' these define a
+custom error diffusion map. errdiff_width and errdiff_height define
+the size of the map in the arrayref in errdiff_map. errdiff_orig is
+an integer which indicates the current pixel position in the top row
+of the map.
+
+=item perturb
+
+When translate is 'perturb' this is the magnitude of the random bias
+applied to each channel of the pixel before it is looked up in the
+color table.
+
+=back
+
+=head1 INITIALIZATION
+
+This documents the Imager initialization function, which you will
+almost never need to call.
+
+=over
+
+=item init
+
+This is a function, not a method.
+
+This function is a mess, it can take the following named parameters:
+
+=over
+
+=item *
+
+log - name of a log file to log Imager's actions to. Not all actions
+are logged, but the debugging memory allocator does log allocations
+here. Ignored if Imager has been built without logging support.
+
+=item *
+
+loglevel - the maximum level of message to log. Default: 1.
+
+=item *
+
+warn_obsolete - if this is non-zero then Imager will warn when you
+attempt to use obsoleted parameters or functionality. This currently
+only includes the old gif output options instead of tags.
+
+=item *
+
+t1log - if non-zero then T1lib will be configured to produce a log
+file. This will fail if there are any existing T1lib font objects.
+
+=back
+
+Example:
+
+ Imager::init(log => 'trace.log', loglevel => 9);
+
+=back
+
+=head1 REVISION
+
+$Revision: 1626 $
+
+=head1 AUTHORS
+
+Tony Cook, Arnar M. Hrafnkelsson
+
+=head1 SEE ALSO
+
+Imager(3), Imager::Files(3), Imager::Draw(3),
+Imager::Color(3), Imager::Fill(3), Imager::Font(3),
+Imager::Transformations(3), Imager::Engines(3), Imager::Filters(3),
+Imager::Expr(3), Imager::Matrix2d(3), Imager::Fountain(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Inline.pod b/Master/tlpkg/tlperl.straw/lib/Imager/Inline.pod
new file mode 100755
index 00000000000..8afc51e5e0e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Inline.pod
@@ -0,0 +1,74 @@
+=head1 NAME
+
+Imager::Inline - using Imager with Inline::C.
+
+=head1 SYNOPSIS
+
+ use Inline with => 'Imager';
+ use Inline C => <<'EOS';
+ Imager some_func(Imager::Color c, Imager::Fill f) {
+ Imager img = i_img_8_new(200, 200, 3);
+ /* fill with color */
+ i_box_filled(img, 0, 0, 199, 199, c);
+ /* inner area with fill */
+ i_box_cfill(img, 50, 50, 149, 149, f);
+
+ return img;
+ }
+ EOS
+
+=head1 DESCRIPTION
+
+Imager hooks into Inline's C<with> syntax to make it easier to write
+Inline::C code that works with Imager, you can call Imager functions
+without having to include headers or perform initialization.
+
+Imager's inline C<with> support does the following:
+
+=over
+
+=item *
+
+add the installed Imager include directory to INC
+
+=item *
+
+add the Imager typemap to TYPEMAPS
+
+=item *
+
+include the headers needed by Imager C extension modules.
+
+=item *
+
+declare and initialize the Imager API function table pointer
+
+=item *
+
+filter the supplied code to replace Imager's class names with those
+that Inline::C can handle.
+
+=back
+
+=head1 LIMITATIONS
+
+The filtering mechanism is global, it will replace the class names
+even inside string constants. If you need a string matching the name
+of one of Imager's classes, like C<"Imager::Color"> you will need to
+split it into 2 to use C's string pasting mechanism, for example:
+C<"Imager:" ":Color">.
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=head1 REVISION
+
+$Revision$
+
+=head1 SEE ALSO
+
+Imager, Imager::ExtUtils, Imager::API, Imager::APIRef,
+samples/inline_replace_color.pl
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/LargeSamples.pod b/Master/tlpkg/tlperl.straw/lib/Imager/LargeSamples.pod
new file mode 100755
index 00000000000..fe2f8f027ad
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/LargeSamples.pod
@@ -0,0 +1,110 @@
+=head1 NAME
+
+Imager::LargeSamples - track/document large sample support
+
+=head1 SYNOPSIS
+
+ # make a large sample image
+ my $im = Imager->new(..., bits => 16);
+
+ # call some method
+ my $result = $im->$method(...);
+
+ # was the image modified at its full sample size
+
+=head1 DESCRIPTION
+
+Imager has had in-memory support for large samples for years now, but
+many methods still don't work at the higher sample size when supplied
+with a large sample image.
+
+This document will track which methods support large samples and which
+don't, for future improvements.
+
+=head1 Support by method
+
+ Method Support Notes
+ ------ ------- -----
+ arc Partial [1]
+ box Partial [1]
+ circle Partial [1]
+ convert Full
+ copy Full
+ crop Full
+ difference Full
+ filter Partial Depends on the filter.
+ flip Full
+ flood_fill Partial [1]
+ getpixel Full
+ getsamples Full
+ getscanline Full
+ map None
+ masked Full
+ matrix_transform
+ Full
+ paste Full
+ polygon Partial [1]
+ polyline None
+ read Partial See L<File format large sample support>
+ read_multi Partial See L<File format large sample support>
+ rotate Full
+ rubthrough Full
+ scale Partial Some qtypes support large samples
+ scaleX None
+ scaleY None
+ setpixel Full
+ setscanline Full
+ string Full Preserves large samples, but most font drivers
+ generate 8 or fewer bits of levels of coverage.
+ transform None
+ transform2 None
+ write Partial See L<File format large sample support>
+ write_multi Partial See L<File format large sample support>
+
+[1] filling an area using the fill parameter works at the full depth
+of the image, using filled => 1 and color works at 8-bits/sample
+
+=head1 File format large sample support
+
+ Format Format samples Imager support
+ ------ -------------- --------------
+ BMP 8 8
+ GIF 8 8
+ ICO 8 8
+ JPEG 8, 12 8
+ PBM 1 1
+ PGM/PPM 1-16 read any, writes 8, 16
+ PNG 1, 2, 4, 8, 16 8
+ RAW 8
+ SGI 8, 16 8, 16
+ TGA 8 8
+ TIFF (many) read/write 8, 16, 32 contig rgb/grey images
+ read/write bi-level
+ read/write 4/8 paletted images
+
+=head1 Filter larger sample support
+
+ Filter Large sample support
+ ------ --------------------
+ autolevels No
+ bumpmap No
+ bumpmap_complex No
+ contrast No
+ conv Yes
+ fountain Yes
+ gaussian Yes
+ gradgen No
+ hardinvert Yes
+ mosaic No
+ postlevels No
+ radnoise No
+ turbnoise No
+ unsharpmask Yes
+ watermark No
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Matrix2d.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Matrix2d.pm
new file mode 100755
index 00000000000..a1000092ea4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Matrix2d.pm
@@ -0,0 +1,409 @@
+package Imager::Matrix2d;
+use strict;
+use vars qw($VERSION);
+
+$VERSION = "1.008";
+
+=head1 NAME
+
+ Imager::Matrix2d - simple wrapper for matrix construction
+
+=head1 SYNOPSIS
+
+ use Imager::Matrix2d;
+ $m1 = Imager::Matrix2d->identity;
+ $m2 = Imager::Matrix2d->rotate(radians=>$angle, x=>$cx, y=>$cy);
+ $m3 = Imager::Matrix2d->translate(x=>$dx, y=>$dy);
+ $m4 = Imager::Matrix2d->shear(x=>$sx, y=>$sy);
+ $m5 = Imager::Matrix2d->reflect(axis=>$axis);
+ $m6 = Imager::Matrix2d->scale(x=>$xratio, y=>$yratio);
+ $m6 = $m1 * $m2;
+ $m7 = $m1 + $m2;
+ use Imager::Matrix2d qw(:handy);
+ # various m2d_* functions imported
+ # where m2d_(.*) calls Imager::Matrix2d->$1()
+
+=head1 DESCRIPTION
+
+This class provides a simple wrapper around a reference to an array of
+9 co-efficients, treated as a matrix:
+
+ [ 0, 1, 2,
+ 3, 4, 5,
+ 6, 7, 8 ]
+
+Most of the methods in this class are constructors. The others are
+overloaded operators.
+
+Note that since Imager represents images with y increasing from top to
+bottom, rotation angles are clockwise, rather than counter-clockwise.
+
+=over
+
+=cut
+
+use vars qw(@EXPORT_OK %EXPORT_TAGS @ISA);
+@ISA = 'Exporter';
+require 'Exporter.pm';
+@EXPORT_OK = qw(m2d_rotate m2d_identity m2d_translate m2d_shear
+ m2d_reflect m2d_scale);
+%EXPORT_TAGS =
+ (
+ handy=> [ qw(m2d_rotate m2d_identity m2d_translate m2d_shear
+ m2d_reflect m2d_scale) ],
+ );
+
+use overload
+ '*' => \&_mult,
+ '+' => \&_add,
+ '""'=>\&_string;
+
+=item identity()
+
+Returns the identity matrix.
+
+=cut
+
+sub identity {
+ return bless [ 1, 0, 0,
+ 0, 1, 0,
+ 0, 0, 1 ], $_[0];
+}
+
+=item rotate(radians=>$angle)
+
+=item rotate(degrees=>$angle)
+
+Creates a matrix that rotates around the origin, or around the point
+(x,y) if the 'x' and 'y' parameters are provided.
+
+=cut
+
+sub rotate {
+ my ($class, %opts) = @_;
+ my $angle;
+
+ if (defined $opts{radians}) {
+ $angle = $opts{radians};
+ }
+ elsif (defined $opts{degrees}) {
+ $angle = $opts{degrees} * 3.1415926535 / 180;
+ }
+ else {
+ $Imager::ERRSTR = "degrees or radians parameter required";
+ return undef;
+ }
+
+ if ($opts{'x'} || $opts{'y'}) {
+ $opts{'x'} ||= 0;
+ $opts{'y'} ||= 0;
+ return $class->translate('x'=>-$opts{'x'}, 'y'=>-$opts{'y'})
+ * $class->rotate(radians=>$angle)
+ * $class->translate('x'=>$opts{'x'}, 'y'=>$opts{'y'});
+ }
+ else {
+ my $sin = sin($angle);
+ my $cos = cos($angle);
+ return bless [ $cos, -$sin, 0,
+ $sin, $cos, 0,
+ 0, 0, 1 ], $class;
+ }
+}
+
+=item translate(x=>$dx, y=>$dy)
+
+=item translate(x=>$dx)
+
+=item translate(y=>$dy)
+
+Translates by the specify amounts.
+
+=cut
+
+sub translate {
+ my ($class, %opts) = @_;
+
+ if (defined $opts{'x'} || defined $opts{'y'}) {
+ my $x = $opts{'x'} || 0;
+ my $y = $opts{'y'} || 0;
+ return bless [ 1, 0, $x,
+ 0, 1, $y,
+ 0, 0, 1 ], $class;
+ }
+
+ $Imager::ERRSTR = 'x or y parameter required';
+ return undef;
+}
+
+=item shear(x=>$sx, y=>$sy)
+
+=item shear(x=>$sx)
+
+=item shear(y=>$sy)
+
+Shear by the given amounts.
+
+=cut
+sub shear {
+ my ($class, %opts) = @_;
+
+ if (defined $opts{'x'} || defined $opts{'y'}) {
+ return bless [ 1, $opts{'x'}||0, 0,
+ $opts{'y'}||0, 1, 0,
+ 0, 0, 1 ], $class;
+ }
+ $Imager::ERRSTR = 'x and y parameters required';
+ return undef;
+}
+
+=item reflect(axis=>$axis)
+
+Reflect around the given axis, either 'x' or 'y'.
+
+=item reflect(radians=>$angle)
+
+=item reflect(degrees=>$angle)
+
+Reflect around a line drawn at the given angle from the origin.
+
+=cut
+
+sub reflect {
+ my ($class, %opts) = @_;
+
+ if (defined $opts{axis}) {
+ my $result = $class->identity;
+ if ($opts{axis} eq "y") {
+ $result->[0] = -$result->[0];
+ }
+ elsif ($opts{axis} eq "x") {
+ $result->[4] = -$result->[4];
+ }
+ else {
+ $Imager::ERRSTR = 'axis must be x or y';
+ return undef;
+ }
+
+ return $result;
+ }
+ my $angle;
+ if (defined $opts{radians}) {
+ $angle = $opts{radians};
+ }
+ elsif (defined $opts{degrees}) {
+ $angle = $opts{degrees} * 3.1415926535 / 180;
+ }
+ else {
+ $Imager::ERRSTR = 'axis, degrees or radians parameter required';
+ return undef;
+ }
+
+ # fun with matrices
+ return $class->rotate(radians=>-$angle) * $class->reflect(axis=>'x')
+ * $class->rotate(radians=>$angle);
+}
+
+=item scale(x=>$xratio, y=>$yratio)
+
+Scales at the given ratios.
+
+You can also specify a center for the scaling with the cx and cy
+parameters.
+
+=cut
+
+sub scale {
+ my ($class, %opts) = @_;
+
+ if (defined $opts{'x'} || defined $opts{'y'}) {
+ $opts{'x'} = 1 unless defined $opts{'x'};
+ $opts{'y'} = 1 unless defined $opts{'y'};
+ if ($opts{cx} || $opts{cy}) {
+ return $class->translate('x'=>-$opts{cx}, 'y'=>-$opts{cy})
+ * $class->scale('x'=>$opts{'x'}, 'y'=>$opts{'y'})
+ * $class->translate('x'=>$opts{cx}, 'y'=>$opts{cy});
+ }
+ else {
+ return bless [ $opts{'x'}, 0, 0,
+ 0, $opts{'y'}, 0,
+ 0, 0, 1 ], $class;
+ }
+ }
+ else {
+ $Imager::ERRSTR = 'x or y parameter required';
+ return undef;
+ }
+}
+
+=item _mult()
+
+Implements the overloaded '*' operator. Internal use.
+
+Currently both the left and right-hand sides of the operator must be
+an Imager::Matrix2d.
+
+=cut
+sub _mult {
+ my ($left, $right, $order) = @_;
+
+ if (ref($right) && UNIVERSAL::isa($right, __PACKAGE__)) {
+ if ($order) {
+ ($left, $right) = ($right, $left);
+ }
+ my @result;
+ for my $i (0..2) {
+ for my $j (0..2) {
+ my $accum = 0;
+ for my $k (0..2) {
+ $accum += $left->[3*$i + $k] * $right->[3*$k + $j];
+ }
+ $result[3*$i+$j] = $accum;
+ }
+ }
+ return bless \@result, __PACKAGE__;
+ }
+ else {
+ # presumably N * matrix or matrix * N
+ return undef; # for now
+ }
+}
+
+=item _add()
+
+Implements the overloaded binary '+' operator.
+
+Currently both the left and right sides of the operator must be
+Imager::Matrix2d objects.
+
+=cut
+sub _add {
+ my ($left, $right, $order) = @_;
+
+ if (ref($right) && UNIVERSAL::isa($right, __PACKAGE__)) {
+ my @result;
+ for (0..8) {
+ push @result, $left->[$_] + $right->[$_];
+ }
+
+ return bless \@result, __PACKAGE__;
+ }
+ else {
+ return undef;
+ }
+}
+
+=item _string()
+
+Implements the overloaded stringification operator.
+
+This returns a string containing 3 lines of text with no terminating
+newline.
+
+I tried to make it fairly nicely formatted. You might disagree :)
+
+=cut
+
+sub _string {
+ my ($m) = @_;
+
+ my $maxlen = 0;
+ for (@$m[0..8]) {
+ if (length() > $maxlen) {
+ $maxlen = length;
+ }
+ }
+ $maxlen <= 9 or $maxlen = 9;
+
+ my @left = ('[ ', ' ', ' ');
+ my @right = ("\n", "\n", ']');
+ my $out;
+ my $width = $maxlen+2;
+ for my $i (0..2) {
+ $out .= $left[$i];
+ for my $j (0..2) {
+ my $val = $m->[$i*3+$j];
+ if (length $val > 9) {
+ $val = sprintf("%9f", $val);
+ if ($val =~ /\./ && $val !~ /e/i) {
+ $val =~ s/0+$//;
+ $val =~ s/\.$//;
+ }
+ $val =~ s/^\s//;
+ }
+ $out .= sprintf("%-${width}s", "$val, ");
+ }
+ $out =~ s/ +\Z/ /;
+ $out .= $right[$i];
+ }
+ $out;
+}
+
+=back
+
+The following functions are shortcuts to the various constructors.
+
+These are not methods.
+
+You can import these methods with:
+
+ use Imager::Matrix2d ':handy';
+
+=over
+
+=item m2d_identity
+
+=item m2d_rotate()
+
+=item m2d_translate()
+
+=item m2d_shear()
+
+=item m2d_reflect()
+
+=item m2d_scale()
+
+=back
+
+=cut
+
+sub m2d_identity {
+ return __PACKAGE__->identity;
+}
+
+sub m2d_rotate {
+ return __PACKAGE__->rotate(@_);
+}
+
+sub m2d_translate {
+ return __PACKAGE__->translate(@_);
+}
+
+sub m2d_shear {
+ return __PACKAGE__->shear(@_);
+}
+
+sub m2d_reflect {
+ return __PACKAGE__->reflect(@_);
+}
+
+sub m2d_scale {
+ return __PACKAGE__->scale(@_);
+}
+
+1;
+
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=head1 BUGS
+
+Needs a way to invert matrixes.
+
+=head1 SEE ALSO
+
+Imager(3), Imager::Font(3)
+
+http://imager.perl.org/
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Preprocess.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Preprocess.pm
new file mode 100755
index 00000000000..f0b5be78892
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Preprocess.pm
@@ -0,0 +1,297 @@
+package Imager::Preprocess;
+use strict;
+require Exporter;
+use vars qw(@ISA @EXPORT);
+
+@EXPORT = qw(preprocess);
+@ISA = qw(Exporter);
+
+
+sub preprocess {
+ my $src = shift @ARGV;
+ my $dest = shift @ARGV
+ or usage();
+
+ open SRC, "< $src"
+ or die "Cannot open $src: $!\n";
+
+ my $cond;
+ my $cond_line;
+ my $save_code;
+ my @code;
+ my $code_line;
+ my @out;
+ my $failed;
+
+ push @out,
+ "#define IM_ROUND_8(x) ((int)((x)+0.5))\n",
+ "#define IM_ROUND_double(x) (x)\n",
+ "#define IM_LIMIT_8(x) ((x) < 0 ? 0 : (x) > 255 ? 255 : (x))\n",
+ "#define IM_LIMIT_double(x) ((x) < 0.0 ? 0.0 : (x) > 1.0 ? 1.0 : (x))\n",
+ "#line 1 \"$src\"\n";
+ while (defined(my $line = <SRC>)) {
+ if ($line =~ /^\#code\s+(\S.+)$/) {
+ $save_code
+ and do { warn "$src:$code_line:Unclosed #code block\n"; ++$failed; };
+
+ $cond = $1;
+ $cond_line = $.;
+ $code_line = $. + 1;
+ $save_code = 1;
+ }
+ elsif ($line =~ /^\#code\s*$/) {
+ $save_code
+ and do { warn "$src:$code_line:Unclosed #code block\n"; ++$failed; };
+
+ $cond = '';
+ $cond_line = 0;
+ $code_line = $. + 1;
+ $save_code = 1;
+ }
+ elsif ($line =~ /^\#\/code\s*$/) {
+ $save_code
+ or do { warn "$src:$.:#/code without #code\n"; ++$failed; next; };
+
+ if ($cond) {
+ push @out, "#line $cond_line \"$src\"\n";
+ push @out, " if ($cond) {\n";
+ }
+ push @out,
+ "#undef IM_EIGHT_BIT\n",
+ "#define IM_EIGHT_BIT 1\n",
+ "#undef IM_FILL_COMBINE\n",
+ "#define IM_FILL_COMBINE(fill) ((fill)->combine)\n",
+ "#undef IM_FILL_FILLER\n",
+ "#define IM_FILL_FILLER(fill) ((fill)->f_fill_with_color)\n";
+ push @out, "#line $code_line \"$src\"\n";
+ push @out, byte_samples(@code);
+ push @out, " }\n", " else {\n"
+ if $cond;
+ push @out,
+ "#undef IM_EIGHT_BIT\n",
+ "#undef IM_FILL_COMBINE\n",
+ "#define IM_FILL_COMBINE(fill) ((fill)->combinef)\n",
+ "#undef IM_FILL_FILLER\n",
+ "#define IM_FILL_FILLER(fill) ((fill)->f_fill_with_fcolor)\n";
+ push @out, "#line $code_line \"$src\"\n";
+ push @out, double_samples(@code);
+ push @out, " }\n"
+ if $cond;
+ push @out, "#line ",$.+1," \"$src\"\n";
+ @code = ();
+ $save_code = 0;
+ }
+ elsif ($save_code) {
+ push @code, $line;
+ }
+ else {
+ push @out, $line;
+ }
+ }
+
+ if ($save_code) {
+ warn "$src:$code_line:#code block not closed by EOF\n";
+ ++$failed;
+ }
+
+ close SRC;
+
+ $failed
+ and die "Errors during parsing, aborting\n";
+
+ open DEST, "> $dest"
+ or die "Cannot open $dest: $!\n";
+ print DEST @out;
+ close DEST;
+}
+
+sub byte_samples {
+ # important we make a copy
+ my @lines = @_;
+
+ for (@lines) {
+ s/\bIM_GPIX\b/i_gpix/g;
+ s/\bIM_GLIN\b/i_glin/g;
+ s/\bIM_PPIX\b/i_ppix/g;
+ s/\bIM_PLIN\b/i_plin/g;
+ s/\bIM_GSAMP\b/i_gsamp/g;
+ s/\bIM_SAMPLE_MAX\b/255/g;
+ s/\bIM_SAMPLE_MAX2\b/65025/g;
+ s/\bIM_SAMPLE_T/i_sample_t/g;
+ s/\bIM_COLOR\b/i_color/g;
+ s/\bIM_WORK_T\b/int/g;
+ s/\bIM_Sf\b/"%d"/g;
+ s/\bIM_Wf\b/"%d"/g;
+ s/\bIM_SUFFIX\((\w+)\)/$1_8/g;
+ s/\bIM_ROUND\(/IM_ROUND_8(/g;
+ s/\bIM_ADAPT_COLORS\(/i_adapt_colors(/g;
+ s/\bIM_LIMIT\(/IM_LIMIT_8(/g;
+ s/\bIM_RENDER_LINE\(/i_render_line(/g;
+ s/\bIM_FILL_COMBINE_F\b/i_fill_combine_f/g;
+ }
+
+ @lines;
+}
+
+sub double_samples {
+ # important we make a copy
+ my @lines = @_;
+
+ for (@lines) {
+ s/\bIM_GPIX\b/i_gpixf/g;
+ s/\bIM_GLIN\b/i_glinf/g;
+ s/\bIM_PPIX\b/i_ppixf/g;
+ s/\bIM_PLIN\b/i_plinf/g;
+ s/\bIM_GSAMP\b/i_gsampf/g;
+ s/\bIM_SAMPLE_MAX\b/1.0/g;
+ s/\bIM_SAMPLE_MAX2\b/1.0/g;
+ s/\bIM_SAMPLE_T/i_fsample_t/g;
+ s/\bIM_COLOR\b/i_fcolor/g;
+ s/\bIM_WORK_T\b/double/g;
+ s/\bIM_Sf\b/"%f"/g;
+ s/\bIM_Wf\b/"%f"/g;
+ s/\bIM_SUFFIX\((\w+)\)/$1_double/g;
+ s/\bIM_ROUND\(/IM_ROUND_double(/g;
+ s/\bIM_ADAPT_COLORS\(/i_adapt_fcolors(/g;
+ s/\bIM_LIMIT\(/IM_LIMIT_double(/g;
+ s/\bIM_RENDER_LINE\(/i_render_linef(/g;
+ s/\bIM_FILL_COMBINE_F\b/i_fill_combinef_f/g;
+ }
+
+ @lines;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Imager::Preprocess - simple preprocessor for handling multiple sample sizes
+
+=head1 SYNOPSIS
+
+ /* in the source: */
+ #code condition true to work with 8-bit samples
+ ... code using preprocessor types/values ...
+ #/code
+
+ perl -MImager -epreprocess foo.im foo.c
+
+=head1 DESCRIPTION
+
+This is a simple preprocessor that aims to reduce duplication of
+source code when implementing an algorithm both for 8-bit samples and
+double samples in Imager.
+
+Imager's Makefile.PL currently scans the MANIFEST for .im files and
+adds Makefile files to convert these to .c files.
+
+The beginning of a sample-independent section of code is preceded by:
+
+ #code expression
+
+where I<expression> should return true if processing should be done at
+8-bits/sample.
+
+You can also use a #code block around a function definition to produce
+8-bit and double sample versions of a function. In this case #code
+has no expression and you will need to use IM_SUFFIX() to produce
+different function names.
+
+The end of a sample-independent section of code is terminated by:
+
+ #/code
+
+#code sections cannot be nested.
+
+#/code without a starting #code is an error.
+
+The following types and values are defined in a #code section:
+
+=over
+
+=item *
+
+IM_GPIX(im, x, y, &col)
+
+=item *
+
+IM_GLIN(im, l, r, y, colors)
+
+=item *
+
+IM_PPIX(im, x, y, &col)
+
+=item *
+
+IM_PLIN(im, x, y, colors)
+
+=item *
+
+IM_GSAMP(im, l, r, y, samples, chans, chan_count)
+
+These correspond to the appropriate image function, eg. IM_GPIX()
+becomes i_gpix() or i_gpixf() as appropriate.
+
+=item *
+
+IM_ADAPT_COLORS(dest_channes, src_channels, colors, count)
+
+Call i_adapt_colors() or i_adapt_fcolors().
+
+=item *
+
+IM_FILL_COMBINE(fill) - retrieve the combine function from a fill
+object.
+
+=item *
+
+IM_FILL_FILLER(fill) - retrieve the fill_with_* function from a fill
+object.
+
+=item *
+
+IM_SAMPLE_MAX - maximum value for a sample
+
+=item *
+
+IM_SAMPLE_MAX2 - maximum value for a sample, squared
+
+=item *
+
+IM_SAMPLE_T - type of a sample (i_sample_t or i_fsample_t)
+
+=item *
+
+IM_COLOR - color type, either i_color or i_fcolor.
+
+=item *
+
+IM_WORK_T - working sample type, either int or double.
+
+=item *
+
+IM_Sf - format string for the sample type, C<"%d"> or C<"%f">.
+
+=item *
+
+IM_Wf - format string for the work type, C<"%d"> or C<"%f">.
+
+=item *
+
+IM_SUFFIX(identifier) - adds _8 or _double onto the end of identifier.
+
+=item *
+
+IM_EIGHT_BIT - this is a macro defined only in 8-bit/sample code.
+
+=back
+
+Other types, functions and values may be added in the future.
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Regops.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Regops.pm
new file mode 100755
index 00000000000..e2ed07e659f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Regops.pm
@@ -0,0 +1,528 @@
+# AUTOMATICALLY GENERATED BY regops.perl
+package Imager::Regops;
+use strict;
+require Exporter;
+use vars qw(@ISA @EXPORT @EXPORT_OK %Attr $MaxOperands $PackCode);
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(%Attr $MaxOperands $PackCode);
+
+use constant RBC_ADD => 0;
+use constant RBC_SUBTRACT => 1;
+use constant RBC_MULT => 2;
+use constant RBC_DIV => 3;
+use constant RBC_MOD => 4;
+use constant RBC_POW => 5;
+use constant RBC_UMINUS => 6;
+use constant RBC_MULTP => 7;
+use constant RBC_ADDP => 8;
+use constant RBC_SUBTRACTP => 9;
+use constant RBC_SIN => 10;
+use constant RBC_COS => 11;
+use constant RBC_ATAN2 => 12;
+use constant RBC_SQRT => 13;
+use constant RBC_DISTANCE => 14;
+use constant RBC_GETP1 => 15;
+use constant RBC_GETP2 => 16;
+use constant RBC_GETP3 => 17;
+use constant RBC_VALUE => 18;
+use constant RBC_HUE => 19;
+use constant RBC_SAT => 20;
+use constant RBC_HSV => 21;
+use constant RBC_RED => 22;
+use constant RBC_GREEN => 23;
+use constant RBC_BLUE => 24;
+use constant RBC_RGB => 25;
+use constant RBC_INT => 26;
+use constant RBC_IF => 27;
+use constant RBC_IFP => 28;
+use constant RBC_LE => 29;
+use constant RBC_LT => 30;
+use constant RBC_GE => 31;
+use constant RBC_GT => 32;
+use constant RBC_EQ => 33;
+use constant RBC_NE => 34;
+use constant RBC_AND => 35;
+use constant RBC_OR => 36;
+use constant RBC_NOT => 37;
+use constant RBC_ABS => 38;
+use constant RBC_RET => 39;
+use constant RBC_JUMP => 40;
+use constant RBC_JUMPZ => 41;
+use constant RBC_JUMPNZ => 42;
+use constant RBC_SET => 43;
+use constant RBC_SETP => 44;
+use constant RBC_PRINT => 45;
+use constant RBC_RGBA => 46;
+use constant RBC_HSVA => 47;
+use constant RBC_ALPHA => 48;
+use constant RBC_LOG => 49;
+use constant RBC_EXP => 50;
+use constant RBC_DET => 51;
+use constant RBC_OP_COUNT => 52;
+
+@EXPORT = qw(RBC_ADD RBC_SUBTRACT RBC_MULT RBC_DIV RBC_MOD RBC_POW RBC_UMINUS RBC_MULTP RBC_ADDP RBC_SUBTRACTP RBC_SIN RBC_COS RBC_ATAN2 RBC_SQRT RBC_DISTANCE RBC_GETP1 RBC_GETP2 RBC_GETP3 RBC_VALUE RBC_HUE RBC_SAT RBC_HSV RBC_RED RBC_GREEN RBC_BLUE RBC_RGB RBC_INT RBC_IF RBC_IFP RBC_LE RBC_LT RBC_GE RBC_GT RBC_EQ RBC_NE RBC_AND RBC_OR RBC_NOT RBC_ABS RBC_RET RBC_JUMP RBC_JUMPZ RBC_JUMPNZ RBC_SET RBC_SETP RBC_PRINT RBC_RGBA RBC_HSVA RBC_ALPHA RBC_LOG RBC_EXP RBC_DET RBC_OP_COUNT);
+
+%Attr =
+ (
+ 'abs' =>
+ {
+ 'func' => 1,
+ 'opcode' => 38,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'r',
+ },
+ 'add' =>
+ {
+ 'func' => 0,
+ 'opcode' => 0,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'addp' =>
+ {
+ 'func' => 0,
+ 'opcode' => 8,
+ 'parms' => 2,
+ 'result' => 'p',
+ 'types' => 'pp',
+ },
+ 'alpha' =>
+ {
+ 'func' => 1,
+ 'opcode' => 48,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'p',
+ },
+ 'and' =>
+ {
+ 'func' => 0,
+ 'opcode' => 35,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'atan2' =>
+ {
+ 'func' => 1,
+ 'opcode' => 12,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'blue' =>
+ {
+ 'func' => 1,
+ 'opcode' => 24,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'p',
+ },
+ 'cos' =>
+ {
+ 'func' => 1,
+ 'opcode' => 11,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'r',
+ },
+ 'det' =>
+ {
+ 'func' => 1,
+ 'opcode' => 51,
+ 'parms' => 4,
+ 'result' => 'r',
+ 'types' => 'rrrr',
+ },
+ 'distance' =>
+ {
+ 'func' => 1,
+ 'opcode' => 14,
+ 'parms' => 4,
+ 'result' => 'r',
+ 'types' => 'rrrr',
+ },
+ 'div' =>
+ {
+ 'func' => 0,
+ 'opcode' => 3,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'eq' =>
+ {
+ 'func' => 0,
+ 'opcode' => 33,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'exp' =>
+ {
+ 'func' => 1,
+ 'opcode' => 50,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'r',
+ },
+ 'ge' =>
+ {
+ 'func' => 0,
+ 'opcode' => 31,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'getp1' =>
+ {
+ 'func' => 1,
+ 'opcode' => 15,
+ 'parms' => 2,
+ 'result' => 'p',
+ 'types' => 'rr',
+ },
+ 'getp2' =>
+ {
+ 'func' => 1,
+ 'opcode' => 16,
+ 'parms' => 2,
+ 'result' => 'p',
+ 'types' => 'rr',
+ },
+ 'getp3' =>
+ {
+ 'func' => 1,
+ 'opcode' => 17,
+ 'parms' => 2,
+ 'result' => 'p',
+ 'types' => 'rr',
+ },
+ 'green' =>
+ {
+ 'func' => 1,
+ 'opcode' => 23,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'p',
+ },
+ 'gt' =>
+ {
+ 'func' => 0,
+ 'opcode' => 32,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'hsv' =>
+ {
+ 'func' => 1,
+ 'opcode' => 21,
+ 'parms' => 3,
+ 'result' => 'p',
+ 'types' => 'rrr',
+ },
+ 'hsva' =>
+ {
+ 'func' => 1,
+ 'opcode' => 47,
+ 'parms' => 4,
+ 'result' => 'p',
+ 'types' => 'rrrr',
+ },
+ 'hue' =>
+ {
+ 'func' => 1,
+ 'opcode' => 19,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'p',
+ },
+ 'if' =>
+ {
+ 'func' => 1,
+ 'opcode' => 27,
+ 'parms' => 3,
+ 'result' => 'r',
+ 'types' => 'rrr',
+ },
+ 'ifp' =>
+ {
+ 'func' => 1,
+ 'opcode' => 28,
+ 'parms' => 3,
+ 'result' => 'p',
+ 'types' => 'rpp',
+ },
+ 'int' =>
+ {
+ 'func' => 1,
+ 'opcode' => 26,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'r',
+ },
+ 'jump' =>
+ {
+ 'func' => 0,
+ 'opcode' => 40,
+ 'parms' => 0,
+ 'result' => undef,
+ 'types' => '',
+ },
+ 'jumpnz' =>
+ {
+ 'func' => 0,
+ 'opcode' => 42,
+ 'parms' => 1,
+ 'result' => undef,
+ 'types' => 'r',
+ },
+ 'jumpz' =>
+ {
+ 'func' => 0,
+ 'opcode' => 41,
+ 'parms' => 1,
+ 'result' => undef,
+ 'types' => 'r',
+ },
+ 'le' =>
+ {
+ 'func' => 0,
+ 'opcode' => 29,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'log' =>
+ {
+ 'func' => 1,
+ 'opcode' => 49,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'r',
+ },
+ 'lt' =>
+ {
+ 'func' => 0,
+ 'opcode' => 30,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'mod' =>
+ {
+ 'func' => 0,
+ 'opcode' => 4,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'mult' =>
+ {
+ 'func' => 0,
+ 'opcode' => 2,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'multp' =>
+ {
+ 'func' => 0,
+ 'opcode' => 7,
+ 'parms' => 2,
+ 'result' => 'p',
+ 'types' => 'pr',
+ },
+ 'ne' =>
+ {
+ 'func' => 0,
+ 'opcode' => 34,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'not' =>
+ {
+ 'func' => 0,
+ 'opcode' => 37,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'r',
+ },
+ 'op_count' =>
+ {
+ 'func' => 0,
+ 'opcode' => 52,
+ 'parms' => 0,
+ 'result' => undef,
+ 'types' => '',
+ },
+ 'or' =>
+ {
+ 'func' => 0,
+ 'opcode' => 36,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'pow' =>
+ {
+ 'func' => 0,
+ 'opcode' => 5,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'print' =>
+ {
+ 'func' => 1,
+ 'opcode' => 45,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'r',
+ },
+ 'red' =>
+ {
+ 'func' => 1,
+ 'opcode' => 22,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'p',
+ },
+ 'ret' =>
+ {
+ 'func' => 0,
+ 'opcode' => 39,
+ 'parms' => 1,
+ 'result' => undef,
+ 'types' => 'p',
+ },
+ 'rgb' =>
+ {
+ 'func' => 1,
+ 'opcode' => 25,
+ 'parms' => 3,
+ 'result' => 'p',
+ 'types' => 'rrr',
+ },
+ 'rgba' =>
+ {
+ 'func' => 1,
+ 'opcode' => 46,
+ 'parms' => 4,
+ 'result' => 'p',
+ 'types' => 'rrrr',
+ },
+ 'sat' =>
+ {
+ 'func' => 1,
+ 'opcode' => 20,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'p',
+ },
+ 'set' =>
+ {
+ 'func' => 0,
+ 'opcode' => 43,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'r',
+ },
+ 'setp' =>
+ {
+ 'func' => 0,
+ 'opcode' => 44,
+ 'parms' => 1,
+ 'result' => 'p',
+ 'types' => 'p',
+ },
+ 'sin' =>
+ {
+ 'func' => 1,
+ 'opcode' => 10,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'r',
+ },
+ 'sqrt' =>
+ {
+ 'func' => 1,
+ 'opcode' => 13,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'r',
+ },
+ 'subtract' =>
+ {
+ 'func' => 0,
+ 'opcode' => 1,
+ 'parms' => 2,
+ 'result' => 'r',
+ 'types' => 'rr',
+ },
+ 'subtractp' =>
+ {
+ 'func' => 0,
+ 'opcode' => 9,
+ 'parms' => 2,
+ 'result' => 'p',
+ 'types' => 'pp',
+ },
+ 'uminus' =>
+ {
+ 'func' => 0,
+ 'opcode' => 6,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'r',
+ },
+ 'value' =>
+ {
+ 'func' => 1,
+ 'opcode' => 18,
+ 'parms' => 1,
+ 'result' => 'r',
+ 'types' => 'p',
+ },
+ );
+$MaxOperands = 4;
+$PackCode = "i";
+1;
+
+__END__
+
+=head1 NAME
+
+Imager::Regops - generated information about the register based VM
+
+=head1 SYNOPSIS
+
+ use Imager::Regops;
+ $Imager::Regops::Attr{$opname}->{opcode} # opcode for given operator
+ $Imager::Regops::Attr{$opname}->{parms} # number of parameters
+ $Imager::Regops::Attr{$opname}->{types} # types of parameters
+ $Imager::Regops::Attr{$opname}->{func} # operator is a function
+ $Imager::Regops::Attr{$opname}->{result} # r for numeric, p for pixel result
+ $Imager::Regops::MaxOperands; # maximum number of operands
+
+=head1 DESCRIPTION
+
+This module is generated automatically from regmach.h so we don't need to
+maintain the same information in at least one extra place.
+
+At least that's the idea.
+
+=head1 AUTHOR
+
+Tony Cook, tony@develop-help.com
+
+=head1 SEE ALSO
+
+perl(1), Imager(3), http://imager.perl.org/
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Test.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Test.pm
new file mode 100755
index 00000000000..8d66ecb26b5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Test.pm
@@ -0,0 +1,694 @@
+package Imager::Test;
+use strict;
+use Test::Builder;
+require Exporter;
+use vars qw(@ISA @EXPORT_OK);
+@ISA = qw(Exporter);
+@EXPORT_OK =
+ qw(
+ diff_text_with_nul
+ test_image_raw
+ test_image_16
+ test_image
+ test_image_double
+ is_color1
+ is_color3
+ is_color4
+ is_color_close3
+ is_fcolor4
+ color_cmp
+ is_image
+ is_imaged
+ is_image_similar
+ isnt_image
+ image_bounds_checks
+ mask_tests
+ test_colorf_gpix
+ test_color_gpix
+ test_colorf_glin);
+
+sub diff_text_with_nul {
+ my ($desc, $text1, $text2, @params) = @_;
+
+ my $builder = Test::Builder->new;
+
+ print "# $desc\n";
+ my $imbase = Imager->new(xsize => 100, ysize => 100);
+ my $imcopy = Imager->new(xsize => 100, ysize => 100);
+
+ $builder->ok($imbase->string(x => 5, 'y' => 50, size => 20,
+ string => $text1,
+ @params), "$desc - draw text1");
+ $builder->ok($imcopy->string(x => 5, 'y' => 50, size => 20,
+ string => $text2,
+ @params), "$desc - draw text2");
+ $builder->isnt_num(Imager::i_img_diff($imbase->{IMG}, $imcopy->{IMG}), 0,
+ "$desc - check result different");
+}
+
+sub is_color3($$$$$) {
+ my ($color, $red, $green, $blue, $comment) = @_;
+
+ my $builder = Test::Builder->new;
+
+ unless (defined $color) {
+ $builder->ok(0, $comment);
+ $builder->diag("color is undef");
+ return;
+ }
+ unless ($color->can('rgba')) {
+ $builder->ok(0, $comment);
+ $builder->diag("color is not a color object");
+ return;
+ }
+
+ my ($cr, $cg, $cb) = $color->rgba;
+ unless ($builder->ok($cr == $red && $cg == $green && $cb == $blue, $comment)) {
+ $builder->diag(<<END_DIAG);
+Color mismatch:
+ Red: $red vs $cr
+Green: $green vs $cg
+ Blue: $blue vs $cb
+END_DIAG
+ return;
+ }
+
+ return 1;
+}
+
+sub is_color_close3($$$$$$) {
+ my ($color, $red, $green, $blue, $tolerance, $comment) = @_;
+
+ my $builder = Test::Builder->new;
+
+ unless (defined $color) {
+ $builder->ok(0, $comment);
+ $builder->diag("color is undef");
+ return;
+ }
+ unless ($color->can('rgba')) {
+ $builder->ok(0, $comment);
+ $builder->diag("color is not a color object");
+ return;
+ }
+
+ my ($cr, $cg, $cb) = $color->rgba;
+ unless ($builder->ok(abs($cr - $red) <= $tolerance
+ && abs($cg - $green) <= $tolerance
+ && abs($cb - $blue) <= $tolerance, $comment)) {
+ $builder->diag(<<END_DIAG);
+Color out of tolerance ($tolerance):
+ Red: expected $red vs received $cr
+Green: expected $green vs received $cg
+ Blue: expected $blue vs received $cb
+END_DIAG
+ return;
+ }
+
+ return 1;
+}
+
+sub is_color4($$$$$$) {
+ my ($color, $red, $green, $blue, $alpha, $comment) = @_;
+
+ my $builder = Test::Builder->new;
+
+ unless (defined $color) {
+ $builder->ok(0, $comment);
+ $builder->diag("color is undef");
+ return;
+ }
+ unless ($color->can('rgba')) {
+ $builder->ok(0, $comment);
+ $builder->diag("color is not a color object");
+ return;
+ }
+
+ my ($cr, $cg, $cb, $ca) = $color->rgba;
+ unless ($builder->ok($cr == $red && $cg == $green && $cb == $blue
+ && $ca == $alpha, $comment)) {
+ $builder->diag(<<END_DIAG);
+Color mismatch:
+ Red: $cr vs $red
+Green: $cg vs $green
+ Blue: $cb vs $blue
+Alpha: $ca vs $alpha
+END_DIAG
+ return;
+ }
+
+ return 1;
+}
+
+sub is_fcolor4($$$$$$;$) {
+ my ($color, $red, $green, $blue, $alpha, $comment_or_diff, $comment_or_undef) = @_;
+ my ($comment, $mindiff);
+ if (defined $comment_or_undef) {
+ ( $mindiff, $comment ) = ( $comment_or_diff, $comment_or_undef )
+ }
+ else {
+ ( $mindiff, $comment ) = ( 0.001, $comment_or_diff )
+ }
+
+ my $builder = Test::Builder->new;
+
+ unless (defined $color) {
+ $builder->ok(0, $comment);
+ $builder->diag("color is undef");
+ return;
+ }
+ unless ($color->can('rgba')) {
+ $builder->ok(0, $comment);
+ $builder->diag("color is not a color object");
+ return;
+ }
+
+ my ($cr, $cg, $cb, $ca) = $color->rgba;
+ unless ($builder->ok(abs($cr - $red) <= $mindiff
+ && abs($cg - $green) <= $mindiff
+ && abs($cb - $blue) <= $mindiff
+ && abs($ca - $alpha) <= $mindiff, $comment)) {
+ $builder->diag(<<END_DIAG);
+Color mismatch:
+ Red: $cr vs $red
+Green: $cg vs $green
+ Blue: $cb vs $blue
+Alpha: $ca vs $alpha
+END_DIAG
+ return;
+ }
+
+ return 1;
+}
+
+sub is_color1($$$) {
+ my ($color, $grey, $comment) = @_;
+
+ my $builder = Test::Builder->new;
+
+ unless (defined $color) {
+ $builder->ok(0, $comment);
+ $builder->diag("color is undef");
+ return;
+ }
+ unless ($color->can('rgba')) {
+ $builder->ok(0, $comment);
+ $builder->diag("color is not a color object");
+ return;
+ }
+
+ my ($cgrey) = $color->rgba;
+ unless ($builder->ok($cgrey == $grey, $comment)) {
+ $builder->diag(<<END_DIAG);
+Color mismatch:
+ Grey: $grey vs $cgrey
+END_DIAG
+ return;
+ }
+
+ return 1;
+}
+
+sub test_image_raw {
+ my $green=Imager::i_color_new(0,255,0,255);
+ my $blue=Imager::i_color_new(0,0,255,255);
+ my $red=Imager::i_color_new(255,0,0,255);
+
+ my $img=Imager::ImgRaw::new(150,150,3);
+
+ Imager::i_box_filled($img,70,25,130,125,$green);
+ Imager::i_box_filled($img,20,25,80,125,$blue);
+ Imager::i_arc($img,75,75,30,0,361,$red);
+ Imager::i_conv($img,[0.1, 0.2, 0.4, 0.2, 0.1]);
+
+ $img;
+}
+
+sub test_image {
+ my $green = Imager::Color->new(0, 255, 0, 255);
+ my $blue = Imager::Color->new(0, 0, 255, 255);
+ my $red = Imager::Color->new(255, 0, 0, 255);
+ my $img = Imager->new(xsize => 150, ysize => 150);
+ $img->box(filled => 1, color => $green, box => [ 70, 24, 130, 124 ]);
+ $img->box(filled => 1, color => $blue, box => [ 20, 26, 80, 126 ]);
+ $img->arc(x => 75, y => 75, r => 30, color => $red);
+ $img->filter(type => 'conv', coef => [ 0.1, 0.2, 0.4, 0.2, 0.1 ]);
+
+ $img;
+}
+
+sub test_image_16 {
+ my $green = Imager::Color->new(0, 255, 0, 255);
+ my $blue = Imager::Color->new(0, 0, 255, 255);
+ my $red = Imager::Color->new(255, 0, 0, 255);
+ my $img = Imager->new(xsize => 150, ysize => 150, bits => 16);
+ $img->box(filled => 1, color => $green, box => [ 70, 25, 130, 125 ]);
+ $img->box(filled => 1, color => $blue, box => [ 20, 25, 80, 125 ]);
+ $img->arc(x => 75, y => 75, r => 30, color => $red);
+ $img->filter(type => 'conv', coef => [ 0.1, 0.2, 0.4, 0.2, 0.1 ]);
+
+ $img;
+}
+
+sub test_image_double {
+ my $green = Imager::Color->new(0, 255, 0, 255);
+ my $blue = Imager::Color->new(0, 0, 255, 255);
+ my $red = Imager::Color->new(255, 0, 0, 255);
+ my $img = Imager->new(xsize => 150, ysize => 150, bits => 'double');
+ $img->box(filled => 1, color => $green, box => [ 70, 25, 130, 125 ]);
+ $img->box(filled => 1, color => $blue, box => [ 20, 25, 80, 125 ]);
+ $img->arc(x => 75, y => 75, r => 30, color => $red);
+ $img->filter(type => 'conv', coef => [ 0.1, 0.2, 0.4, 0.2, 0.1 ]);
+
+ $img;
+}
+
+sub _low_image_diff_check {
+ my ($left, $right, $comment) = @_;
+
+ my $builder = Test::Builder->new;
+
+ unless (defined $left) {
+ $builder->ok(0, $comment);
+ $builder->diag("left is undef");
+ return;
+ }
+ unless (defined $right) {
+ $builder->ok(0, $comment);
+ $builder->diag("right is undef");
+ return;
+ }
+ unless ($left->{IMG}) {
+ $builder->ok(0, $comment);
+ $builder->diag("left image has no low level object");
+ return;
+ }
+ unless ($right->{IMG}) {
+ $builder->ok(0, $comment);
+ $builder->diag("right image has no low level object");
+ return;
+ }
+ unless ($left->getwidth == $right->getwidth) {
+ $builder->ok(0, $comment);
+ $builder->diag("left width " . $left->getwidth . " vs right width "
+ . $right->getwidth);
+ return;
+ }
+ unless ($left->getheight == $right->getheight) {
+ $builder->ok(0, $comment);
+ $builder->diag("left height " . $left->getheight . " vs right height "
+ . $right->getheight);
+ return;
+ }
+ unless ($left->getchannels == $right->getchannels) {
+ $builder->ok(0, $comment);
+ $builder->diag("left channels " . $left->getchannels . " vs right channels "
+ . $right->getchannels);
+ return;
+ }
+
+ return 1;
+}
+
+sub is_image_similar($$$$) {
+ my ($left, $right, $limit, $comment) = @_;
+
+ {
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ _low_image_diff_check($left, $right, $comment)
+ or return;
+ }
+
+ my $builder = Test::Builder->new;
+
+ my $diff = Imager::i_img_diff($left->{IMG}, $right->{IMG});
+ if ($diff > $limit) {
+ $builder->ok(0, $comment);
+ $builder->diag("image data difference > $limit - $diff");
+
+ if ($limit == 0) {
+ # find the first mismatch
+ PIXELS:
+ for my $y (0 .. $left->getheight()-1) {
+ for my $x (0.. $left->getwidth()-1) {
+ my @lsamples = $left->getsamples(x => $x, y => $y, width => 1);
+ my @rsamples = $right->getsamples(x => $x, y => $y, width => 1);
+ if ("@lsamples" ne "@rsamples") {
+ $builder->diag("first mismatch at ($x, $y) - @lsamples vs @rsamples");
+ last PIXELS;
+ }
+ }
+ }
+ }
+
+ return;
+ }
+
+ return $builder->ok(1, $comment);
+}
+
+sub is_image($$$) {
+ my ($left, $right, $comment) = @_;
+
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ return is_image_similar($left, $right, 0, $comment);
+}
+
+sub is_imaged($$$) {
+ my ($left, $right, $comment) = @_;
+
+ {
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ _low_image_diff_check($left, $right, $comment)
+ or return;
+ }
+
+ my $builder = Test::Builder->new;
+
+ my $diff = Imager::i_img_diffd($left->{IMG}, $right->{IMG});
+ if ($diff > 0) {
+ $builder->ok(0, $comment);
+ $builder->diag("image data difference: $diff");
+
+ # find the first mismatch
+ PIXELS:
+ for my $y (0 .. $left->getheight()-1) {
+ for my $x (0.. $left->getwidth()-1) {
+ my @lsamples = $left->getsamples(x => $x, y => $y, width => 1);
+ my @rsamples = $right->getsamples(x => $x, y => $y, width => 1);
+ if ("@lsamples" ne "@rsamples") {
+ $builder->diag("first mismatch at ($x, $y) - @lsamples vs @rsamples");
+ last PIXELS;
+ }
+ }
+ }
+
+ return;
+ }
+
+ return $builder->ok(1, $comment);
+}
+
+sub isnt_image {
+ my ($left, $right, $comment) = @_;
+
+ my $builder = Test::Builder->new;
+
+ my $diff = Imager::i_img_diff($left->{IMG}, $right->{IMG});
+
+ return $builder->ok($diff, "$comment");
+}
+
+sub image_bounds_checks {
+ my $im = shift;
+
+ my $builder = Test::Builder->new;
+
+ $builder->ok(!$im->getpixel(x => -1, y => 0), 'bounds check get (-1, 0)');
+ $builder->ok(!$im->getpixel(x => 10, y => 0), 'bounds check get (10, 0)');
+ $builder->ok(!$im->getpixel(x => 0, y => -1), 'bounds check get (0, -1)');
+ $builder->ok(!$im->getpixel(x => 0, y => 10), 'bounds check get (0, 10)');
+ $builder->ok(!$im->getpixel(x => -1, y => 0), 'bounds check get (-1, 0) float');
+ $builder->ok(!$im->getpixel(x => 10, y => 0), 'bounds check get (10, 0) float');
+ $builder->ok(!$im->getpixel(x => 0, y => -1), 'bounds check get (0, -1) float');
+ $builder->ok(!$im->getpixel(x => 0, y => 10), 'bounds check get (0, 10) float');
+ my $black = Imager::Color->new(0, 0, 0);
+ require Imager::Color::Float;
+ my $blackf = Imager::Color::Float->new(0, 0, 0);
+ $builder->ok(!$im->setpixel(x => -1, y => 0, color => $black), 'bounds check set (-1, 0)');
+ $builder->ok(!$im->setpixel(x => 10, y => 0, color => $black), 'bounds check set (10, 0)');
+ $builder->ok(!$im->setpixel(x => 0, y => -1, color => $black), 'bounds check set (0, -1)');
+ $builder->ok(!$im->setpixel(x => 0, y => 10, color => $black), 'bounds check set (0, 10)');
+ $builder->ok(!$im->setpixel(x => -1, y => 0, color => $blackf), 'bounds check set (-1, 0) float');
+ $builder->ok(!$im->setpixel(x => 10, y => 0, color => $blackf), 'bounds check set (10, 0) float');
+ $builder->ok(!$im->setpixel(x => 0, y => -1, color => $blackf), 'bounds check set (0, -1) float');
+ $builder->ok(!$im->setpixel(x => 0, y => 10, color => $blackf), 'bounds check set (0, 10) float');
+}
+
+sub test_colorf_gpix {
+ my ($im, $x, $y, $expected, $epsilon, $comment) = @_;
+
+ my $builder = Test::Builder->new;
+
+ defined $comment or $comment = '';
+
+ my $c = Imager::i_gpixf($im, $x, $y);
+ unless ($c) {
+ $builder->ok(0, "$comment - retrieve color at ($x,$y)");
+ return;
+ }
+ unless ($builder->ok(colorf_cmp($c, $expected, $epsilon) == 0,
+ "$comment - got right color ($x, $y)")) {
+ my @c = $c->rgba;
+ my @exp = $expected->rgba;
+ $builder->diag(<<EOS);
+# got: ($c[0], $c[1], $c[2])
+# expected: ($exp[0], $exp[1], $exp[2])
+EOS
+ }
+ 1;
+}
+
+sub test_color_gpix {
+ my ($im, $x, $y, $expected, $comment) = @_;
+
+ my $builder = Test::Builder->new;
+
+ defined $comment or $comment = '';
+ my $c = Imager::i_get_pixel($im, $x, $y);
+ unless ($c) {
+ $builder->ok(0, "$comment - retrieve color at ($x,$y)");
+ return;
+ }
+ unless ($builder->ok(color_cmp($c, $expected) == 0,
+ "got right color ($x, $y)")) {
+ my @c = $c->rgba;
+ my @exp = $expected->rgba;
+ $builder->diag(<<EOS);
+# got: ($c[0], $c[1], $c[2])
+# expected: ($exp[0], $exp[1], $exp[2])
+EOS
+ return;
+ }
+
+ return 1;
+}
+
+sub test_colorf_glin {
+ my ($im, $x, $y, $pels, $comment) = @_;
+
+ my $builder = Test::Builder->new;
+
+ my @got = Imager::i_glinf($im, $x, $x+@$pels, $y);
+ @got == @$pels
+ or return $builder->is_num(scalar(@got), scalar(@$pels), "$comment - pixels retrieved");
+
+ return $builder->ok(!grep(colorf_cmp($pels->[$_], $got[$_], 0.005), 0..$#got),
+ "$comment - check colors ($x, $y)");
+}
+
+sub colorf_cmp {
+ my ($c1, $c2, $epsilon) = @_;
+
+ defined $epsilon or $epsilon = 0;
+
+ my @s1 = $c1->rgba;
+ my @s2 = $c2->rgba;
+
+ # print "# (",join(",", @s1[0..2]),") <=> (",join(",", @s2[0..2]),")\n";
+ return abs($s1[0]-$s2[0]) >= $epsilon && $s1[0] <=> $s2[0]
+ || abs($s1[1]-$s2[1]) >= $epsilon && $s1[1] <=> $s2[1]
+ || abs($s1[2]-$s2[2]) >= $epsilon && $s1[2] <=> $s2[2];
+}
+
+sub color_cmp {
+ my ($c1, $c2) = @_;
+
+ my @s1 = $c1->rgba;
+ my @s2 = $c2->rgba;
+
+ return $s1[0] <=> $s2[0]
+ || $s1[1] <=> $s2[1]
+ || $s1[2] <=> $s2[2];
+}
+
+# these test the action of the channel mask on the image supplied
+# which should be an OO image.
+sub mask_tests {
+ my ($im, $epsilon) = @_;
+
+ my $builder = Test::Builder->new;
+
+ defined $epsilon or $epsilon = 0;
+
+ # we want to check all four of ppix() and plin(), ppix() and plinf()
+ # basic test procedure:
+ # first using default/all 1s mask, set to white
+ # make sure we got white
+ # set mask to skip a channel, set to grey
+ # make sure only the right channels set
+
+ print "# channel mask tests\n";
+ # 8-bit color tests
+ my $white = Imager::NC(255, 255, 255);
+ my $grey = Imager::NC(128, 128, 128);
+ my $white_grey = Imager::NC(128, 255, 128);
+
+ print "# with ppix\n";
+ $builder->ok($im->setmask(mask=>~0), "set to default mask");
+ $builder->ok($im->setpixel(x=>0, 'y'=>0, color=>$white), "set to white all channels");
+ test_color_gpix($im->{IMG}, 0, 0, $white, "ppix");
+ $builder->ok($im->setmask(mask=>0xF-0x2), "set channel to exclude channel1");
+ $builder->ok($im->setpixel(x=>0, 'y'=>0, color=>$grey), "set to grey, no channel 2");
+ test_color_gpix($im->{IMG}, 0, 0, $white_grey, "ppix masked");
+
+ print "# with plin\n";
+ $builder->ok($im->setmask(mask=>~0), "set to default mask");
+ $builder->ok($im->setscanline(x=>0, 'y'=>1, pixels => [$white]),
+ "set to white all channels");
+ test_color_gpix($im->{IMG}, 0, 1, $white, "plin");
+ $builder->ok($im->setmask(mask=>0xF-0x2), "set channel to exclude channel1");
+ $builder->ok($im->setscanline(x=>0, 'y'=>1, pixels=>[$grey]),
+ "set to grey, no channel 2");
+ test_color_gpix($im->{IMG}, 0, 1, $white_grey, "plin masked");
+
+ # float color tests
+ my $whitef = Imager::NCF(1.0, 1.0, 1.0);
+ my $greyf = Imager::NCF(0.5, 0.5, 0.5);
+ my $white_greyf = Imager::NCF(0.5, 1.0, 0.5);
+
+ print "# with ppixf\n";
+ $builder->ok($im->setmask(mask=>~0), "set to default mask");
+ $builder->ok($im->setpixel(x=>0, 'y'=>2, color=>$whitef), "set to white all channels");
+ test_colorf_gpix($im->{IMG}, 0, 2, $whitef, $epsilon, "ppixf");
+ $builder->ok($im->setmask(mask=>0xF-0x2), "set channel to exclude channel1");
+ $builder->ok($im->setpixel(x=>0, 'y'=>2, color=>$greyf), "set to grey, no channel 2");
+ test_colorf_gpix($im->{IMG}, 0, 2, $white_greyf, $epsilon, "ppixf masked");
+
+ print "# with plinf\n";
+ $builder->ok($im->setmask(mask=>~0), "set to default mask");
+ $builder->ok($im->setscanline(x=>0, 'y'=>3, pixels => [$whitef]),
+ "set to white all channels");
+ test_colorf_gpix($im->{IMG}, 0, 3, $whitef, $epsilon, "plinf");
+ $builder->ok($im->setmask(mask=>0xF-0x2), "set channel to exclude channel1");
+ $builder->ok($im->setscanline(x=>0, 'y'=>3, pixels=>[$greyf]),
+ "set to grey, no channel 2");
+ test_colorf_gpix($im->{IMG}, 0, 3, $white_greyf, $epsilon, "plinf masked");
+
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Imager::Test - common functions used in testing Imager
+
+=head1 SYNOPSIS
+
+ use Imager::Test 'diff_text_with_nul';
+ diff_text_with_nul($test_name, $text1, $text2, @string_options);
+
+=head1 DESCRIPTION
+
+This is a repository of functions used in testing Imager.
+
+Some functions will only be useful in testing Imager itself, while
+others should be useful in testing modules that use Imager.
+
+No functions are exported by default.
+
+=head1 FUNCTIONS
+
+=over
+
+=item is_color3($color, $red, $blue, $green, $comment)
+
+Tests is $color matches the given ($red, $blue, $green)
+
+=item is_image($im1, $im2, $comment)
+
+Tests if the 2 images have the same content. Both images must be
+defined, have the same width, height, channels and the same color in
+each pixel. The color comparison is done at 8-bits per pixel. The
+color representation such as direct vs paletted, bits per sample are
+not checked. Equivalent to is_image_similar($im1, $im2, 0, $comment).
+
+=item is_imaged($im, $im2, $comment)
+
+Tests if the two images have the same content at the double/sample
+level.
+
+=item is_image_similar($im1, $im2, $maxdiff, $comment)
+
+Tests if the 2 images have similar content. Both images must be
+defined, have the same width, height and channels. The cum of the
+squares of the differences of each sample are calculated and must be
+less than or equal to I<$maxdiff> for the test to pass. The color
+comparison is done at 8-bits per pixel. The color representation such
+as direct vs paletted, bits per sample are not checked.
+
+=item test_image_raw()
+
+Returns a 150x150x3 Imager::ImgRaw test image.
+
+=item test_image()
+
+Returns a 150x150x3 8-bit/sample OO test image.
+
+=item test_image_16()
+
+Returns a 150x150x3 16-bit/sample OO test image.
+
+=item test_image_double()
+
+Returns a 150x150x3 double/sample OO test image.
+
+=item diff_text_with_nul($test_name, $text1, $text2, @options)
+
+Creates 2 test images and writes $text1 to the first image and $text2
+to the second image with the string() method. Each call adds 3 ok/not
+ok to the output of the test script.
+
+Extra options that should be supplied include the font and either a
+color or channel parameter.
+
+This was explicitly created for regression tests on #21770.
+
+=item image_bounds_checks($im)
+
+Attempts to write to various pixel positions outside the edge of the
+image to ensure that it fails in those locations.
+
+Any new image type should pass these tests. Does 16 separate tests.
+
+=item test_colorf_gpix($im, $x, $y, $expected, $epsilon, $comment)
+
+Retrieves the pixel ($x,$y) from the low-level image $im and compares
+it to the floating point color $expected, with a tolerance of epsilon.
+
+=item test_color_gpix($im, $x, $y, $expected, $comment)
+
+Retrieves the pixel ($x,$y) from the low-level image $im and compares
+it to the floating point color $expected.
+
+=item test_colorf_glin($im, $x, $y, $pels, $comment)
+
+Retrieves the floating point pixels ($x, $y)-[$x+@$pels, $y] from the
+low level image $im and compares them against @$pels.
+
+=item mask_tests($im, $epsilon)
+
+Perform a standard set of mask tests on the OO image $im.
+
+=back
+
+=head1 AUTHOR
+
+Tony Cook <tony@develop-help.com>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Transform.pm b/Master/tlpkg/tlperl.straw/lib/Imager/Transform.pm
new file mode 100755
index 00000000000..4c43abbe1f7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Transform.pm
@@ -0,0 +1,534 @@
+package Imager::Transform;
+use strict;
+use Imager;
+use Imager::Expr::Assem;
+use vars qw($VERSION);
+
+$VERSION = "1.004";
+
+my %funcs =
+ (
+ mandel=>
+ {
+ desc=>"Mandelbrot set",
+ type=>'assem',
+ assem=><<EOS,
+# x treated as in range minx..maxx
+# y treated as in range miny..maxy
+ var nx:n ; var ny:n
+ var diffx:n ; var diffy:n
+# conx/y are x/y adjusted to min..max ranges
+ var conx:n ; var cony:n
+ diffx = subtract maxx minx
+ conx = div x w
+ conx = mult conx diffx
+ conx = add conx minx
+ diffy = subtract maxy miny
+ cony = div y h
+ cony = mult cony diffy
+ cony = add cony miny
+ nx = 0
+ ny = 0
+ var count:n
+ count = 0
+loop:
+# calculate (nx,ny)**2 +(x,y)->
+# (nx*nx-ny*ny+x, 2.nx.ny+y)
+ var wx:n ; var wy:n ; var work:n
+ wx = mult nx nx
+ wy = mult ny ny
+ wx = subtract wx wy
+ ny = mult ny nx
+ ny = mult ny 2
+ nx = wx
+ nx = add nx conx
+ ny = add ny cony
+ work = distance nx ny 0 0
+ work = gt work 2
+ jumpnz work docol
+ count = add count 1
+ work = lt count maxcount
+ jumpnz work loop
+ jumpnz insideangle doinang
+ var workp:p
+ workp = rgb 0 0 0
+ ret workp
+ doinang:
+ var ang:n
+ ang = atan2 ny nx
+ ang = mult ang 360
+ ang = div ang pi
+ workp = hsv ang 255 0.5
+ ret workp
+ docol:
+ var outvalue:n
+ outvalue = mult outsidevaluestep count
+ outvalue = add outvalue outsidevalue
+ outvalue = mod outvalue 1.01
+ jumpnz outsideangle do_outang
+ work = mult count huestep
+ work = add work huebase
+ work = mod work 360
+ workp = hsv work 1 outvalue
+ ret workp
+ do_outang:
+ ang = atan2 ny nx
+ ang = mult ang 360
+ ang = div ang pi
+ ang = add ang outsidebase
+ workp = hsv ang outsidesat outvalue
+ ret workp
+EOS
+ constants=>
+ {
+ minx=>{ default=>-2, desc=>'Left of rendered area', },
+ miny=>{ default=>-1.5, desc=>'Top of rendered area', },
+ maxx=>{ default=>1, desc=>'Right of rendered area', },
+ maxy=>{ default=>1.5, desc=>'Bottom of rendered area', },
+ maxcount=>{ default=>100, desc=>'Maximum iterations', },
+ huestep=>{ default=>21.1, desc=>'Hue step for number of iterations', },
+ huebase=>{ default=>0, desc=>'Base hue for number of iterations', },
+ insideangle=>
+ {
+ default=>0,
+ desc=>'Non-zero to use angle of final as hue for inside',
+ },
+ insidebase=>
+ {
+ default=>0,
+ desc=>'Base angle for inside colours if insideangle is non-zero',
+ },
+ outsideangle=>
+ {
+ default=>0,
+ desc=>'Non-zero to use angle of final as hue for outside',
+ },
+ outsidebase=>
+ {
+ default=>0,
+ desc=>'Base angle if outsideangle is true',
+ },
+ outsidevalue=>
+ {
+ default=>1,
+ desc=>'Brightness for outside pixels',
+ },
+ outsidevaluestep=>
+ {
+ default=>0,
+ desc=>'Brightness step for each count for outside pixels',
+ },
+ outsidesat=>
+ {
+ default=>1,
+ desc=>'Saturation for outside pixels',
+ },
+ },
+ inputs=>[],
+ },
+ julia=>
+ {
+ desc=>"Julia set",
+ type=>'assem',
+ assem=><<EOS,
+# print x
+# x treated as in range minx..maxx
+# y treated as in range miny..maxy
+ var nx:n ; var ny:n
+ var diffx:n ; var diffy:n
+# conx/y are x/y adjusted to min..max ranges
+ var conx:n ; var cony:n
+ diffx = subtract maxx minx
+ conx = div x w
+ conx = mult conx diffx
+ conx = add conx minx
+ diffy = subtract maxy miny
+ cony = div y h
+ cony = mult cony diffy
+ cony = add cony miny
+ nx = conx
+ ny = cony
+ var count:n
+ count = 0
+loop:
+# calculate (nx,ny)**2 +(x,y)->
+# (nx*nx-ny*ny+x, 2.nx.ny+y)
+ var wx:n ; var wy:n ; var work:n
+ wx = mult nx nx
+ wy = mult ny ny
+ wx = subtract wx wy
+ ny = mult ny nx
+ ny = mult ny 2
+ nx = wx
+ nx = add nx zx
+ ny = add ny zy
+ work = distance nx ny 0 0
+ work = gt work 2
+ jumpnz work docol
+ count = add count 1
+ work = lt count maxcount
+ jumpnz work loop
+ jumpnz insideangle doinang
+ var workp:p
+ workp = rgb 0 0 0
+ ret workp
+ doinang:
+ var ang:n
+ ang = atan2 ny nx
+ ang = mult ang 360
+ ang = div ang pi
+ workp = hsv ang 255 0.5
+ ret workp
+ docol:
+ var outvalue:n
+ outvalue = mult outsidevaluestep count
+ outvalue = add outvalue outsidevalue
+ outvalue = mod outvalue 1.01
+ jumpnz outsideangle do_outang
+ work = mult count huestep
+ work = add work huebase
+ work = mod work 360
+ workp = hsv work 1 outvalue
+ ret workp
+ do_outang:
+ ang = atan2 ny nx
+ ang = mult ang 360
+ ang = div ang pi
+ ang = add ang outsidebase
+ workp = hsv ang outsidesat outvalue
+ ret workp
+EOS
+ constants=>
+ {
+ zx=>{default=>0.7, desc=>'Real part of initial Z', },
+ zy=>{default=>0.2, desc=>'Imaginary part of initial Z', },
+ minx=>{ default=>-1.5, desc=>'Left of rendered area', },
+ miny=>{ default=>-1.5, desc=>'Top of rendered area', },
+ maxx=>{ default=>1.5, desc=>'Right of rendered area', },
+ maxy=>{ default=>1.5, desc=>'Bottom of rendered area', },
+ maxcount=>{ default=>100, desc=>'Maximum iterations', },
+ huestep=>{ default=>21.1, desc=>'Hue step for number of iterations', },
+ huebase=>{ default=>0, desc=>'Base hue for number of iterations', },
+ insideangle=>
+ {
+ default=>0,
+ desc=>'Non-zero to use angle of final as hue for inside',
+ },
+ insidebase=>
+ {
+ default=>0,
+ desc=>'Base angle for inside colours if insideangle is non-zero',
+ },
+ outsideangle=>
+ {
+ default=>0,
+ desc=>'Non-zero to use angle of final as hue for outside',
+ },
+ outsidebase=>
+ {
+ default=>0,
+ desc=>'Base angle if outsideangle is true',
+ },
+ outsidevalue=>
+ {
+ default=>1,
+ desc=>'Brightness for outside pixels',
+ },
+ outsidevaluestep=>
+ {
+ default=>0,
+ desc=>'Brightness step for each count for outside pixels',
+ },
+ outsidesat=>
+ {
+ default=>1,
+ desc=>'Saturation for outside pixels',
+ },
+ },
+ inputs=>[],
+ },
+ circleripple=>
+ {
+ type=>'rpnexpr',
+ desc=>'Adds a circular ripple effect',
+ rpnexpr=><<'EOS',
+x y cx cy distance !dist
+@dist freq / sin !scale
+@scale depth * @dist + !adj
+y cy - x cx - atan2 !ang
+cx @ang cos @adj * + cy @ang sin @adj * + getp1 @scale shadow + shadow 1 + / *
+EOS
+ constants=>
+ {
+ freq=> { desc=>'Frequency of ripples', default=>5 },
+ depth=> { desc=>'Depth of ripples', default=>10 },
+ shadow=> { desc=>'Fraction of shadow', default=>20 },
+ },
+ inputs=>
+ [
+ { desc=>'Image to ripple' }
+ ],
+ },
+ spiral=>
+ {
+ type=>'rpnexpr',
+ desc=>'Render a colorful spiral',
+ rpnexpr=><<'EOS',
+x y cx cy distance !d y cy - x cx - atan2 !a
+@d spacing / @a + pi 2 * % !a2
+@a 180 * pi / 1 @a2 sin 1 + 2 / hsv
+EOS
+ constants=>
+ {
+ spacing=>{ desc=>'Spacing between arms', default=>10 },
+ },
+ inputs=>[],
+ },
+ diagripple=>
+ {
+ type=>'rpnexpr',
+ desc=>'Adds diagonal ripples to an image',
+ rpnexpr=><<'EOS',
+x y + !dist @dist freq / sin !scale
+@scale depth * !adj
+ x @adj + y @adj + getp1 @scale shadow + shadow 1 + / *
+EOS
+ constants=>
+ {
+ freq=>{ desc=>'Frequency of ripples', default=>5, },
+ depth=>{desc=>'Depth of ripples', default=>3,},
+ shadow=>
+ {
+ desc=>'Fraction of brightness to remove for shadows',
+ default=>20,
+ },
+ },
+ inputs=>
+ [
+ { desc=>'Image to add ripples to' }
+ ],
+ },
+ twist=>
+ {
+ type=>'rpnexpr',
+ desc=>'Twist an image',
+ rpnexpr=><<'EOS',
+x y cx cy distance !dist
+ y cy - x cx - atan2 @dist twist / + !ang
+cx @ang cos @dist * + cy @ang sin @dist * + getp1
+EOS
+ constants=>
+ {
+ twist=>{ desc=>'Amount of twist', default=>2.5, },
+ },
+ inputs=>
+ [
+ { desc=>'Image to twist' },
+ ],
+ },
+ # any other functions can wait until Imager::Expr::Infix supports
+ # jumps
+ );
+
+sub new {
+ my ($class, $name) = @_;
+
+ exists $funcs{$name} or return;
+
+ bless { func=>$funcs{$name}, name=>$name }, $class;
+}
+
+sub inputs {
+ my ($self) = @_;
+ return @{$self->{func}{inputs}}
+}
+
+sub constants {
+ my $self = shift;
+ if (@_) {
+ return @{$self->{func}{constants}}{@_};
+ }
+ else {
+ return keys %{$self->{func}{constants}};
+ }
+}
+
+sub transform {
+ my ($self, $opts, $constants, @in) = @_;
+
+ my $func = $self->{func};
+ my %opts = %$opts;
+ $opts{$func->{type}} = $func->{$func->{type}};
+ my %con = %$constants;
+ for my $name (keys %{$func->{'constants'}}) {
+ unless (exists $con{$name}) {
+ if (exists $func->{'constants'}{$name}{default}) {
+ $con{$name} = $func->{'constants'}{$name}{default};
+ }
+ else {
+ $self->{error} = "No value or default for constant $name";
+ return;
+ }
+ }
+ }
+ $opts{'constants'} = \%con;
+ unless (@in == @{$func->{'inputs'}}) {
+ $self->{error} = @in." input images given, ".
+ @{$func->{'inputs'}}." supplied";
+ return;
+ }
+
+ my $out = Imager::transform2(\%opts, @in);
+ unless ($out) {
+ $self->{error} = $Imager::ERRSTR;
+ return;
+ }
+ return $out;
+}
+
+sub errstr {
+ return $_[0]{error};
+}
+
+sub list {
+ return keys %funcs;
+}
+
+sub describe {
+ my ($class, $name) = @_;
+
+ my $func;
+ if (ref $class && !$name) {
+ $func = $class->{func};
+ $name = $class->{name}
+ }
+ else {
+ $func = $funcs{$name}
+ or return undef;
+ }
+ my $desc = <<EOS;
+Function : $name
+Description: $func->{desc}
+EOS
+ if ($func->{'inputs'} && @{$func->{'inputs'}}) {
+ $desc .= "Input images:\n";
+ my $i = 1;
+ for my $in (@{$func->{'inputs'}}) {
+ $desc .= " $i: $in->{desc}\n";
+ }
+ }
+ else {
+ $desc .= "There are no input images\n";
+ }
+ if ($func->{'constants'} && keys %{$func->{'constants'}}) {
+ $desc .= "Input constants:\n";
+ for my $key (keys %{$func->{'constants'}}) {
+ $desc .= " $key: $func->{'constants'}{$key}{desc}\n";
+ $desc .= " Default: $func->{'constants'}{$key}{default}\n";
+ }
+ }
+ else {
+ $desc .= "There are no constants\n";
+ }
+
+ return $desc;
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+ Imager::Transform - a library of register machine image transformations
+
+=head1 SYNOPSIS
+
+ # get a list of transformations
+ my @funcs = Imager::Transform->list;
+ # create a transformation object
+ my $tran = Imager::Transform->new($name);
+ # describe it
+ print $tran->describe;
+ # a list of constant names
+ my @constants = $tran->constants;
+ # information about some of the constants
+ my @info = $tran->constants(@constants);
+
+=head1 DESCRIPTION
+
+This module provides a library of transformations that use the Imager
+transform2() function.
+
+The aim is to provide a place to collect these transformations.
+
+At some point there might be an interface to add new functions, but
+there's not a whole lot of point to that.
+
+The interface is a little sparse as yet.
+
+=head1 METHODS
+
+=over 4
+
+=item my @names = Imager::Transform->list
+
+Returns a list of the transformations.
+
+=item my $desc = Imager::Transform->describe($name);
+
+=item my $desc = $tran->describe()
+
+Describes a transformation specified either by name (as a class
+method) or by reference (as an instance method).
+
+The class method returns undef if there is no such transformation.
+
+=item my $tran = Imager::Transform->new($name)
+
+Create a new transformation object. Returns undef if there is no such
+transformation.
+
+=item my @inputs = $tran->inputs;
+
+=item my $inputs = $tran->inputs;
+
+Returns a list of input image descriptions, or the number of them,
+depending on content.
+
+The list contains hashrefs, which current contain only one member,
+desc, a description of the use of the input image.
+
+=item $tran->constants
+
+Return's a list of names of constants that can be set for the
+transformation.
+
+=item $tran->constants($name, $name, ...)
+
+Returns a hashref for each named constant, which contains the default
+in key C<default> and a description in key C<desc>.
+
+=item my $out = $tran->transform(\%opts, \%constants, @imgs)
+
+Perform the image transformation.
+
+Returns the new image on success, or undef on failure, in which case
+you can use $tran->errstr to get an error message.
+
+=item $tran->errstr
+
+The error message, if any from the last image transformation.
+
+=back
+
+=head1 BUGS
+
+Needs more transformations.
+
+=head1 SEE ALSO
+
+Imager(3), transform.perl
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Transformations.pod b/Master/tlpkg/tlperl.straw/lib/Imager/Transformations.pod
new file mode 100755
index 00000000000..d0af4263bce
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Transformations.pod
@@ -0,0 +1,930 @@
+=head1 NAME
+
+Imager::Transformations - Simple transformations of one image into another.
+
+=head1 SYNOPSIS
+
+ use Imager;
+
+ $newimg = $img->copy();
+
+ $newimg = $img->scale(xpixels=>400, qtype => 'mixing');
+ $newimg = $img->scale(xpixels=>400, ypixels=>400);
+ $newimg = $img->scale(xpixels=>400, ypixels=>400, type=>'min');
+ $newimg = $img->scale(scalefactor=>0.25);
+
+ $newimg = $img->scaleX(pixels=>400);
+ $newimg = $img->scaleX(scalefactor=>0.25);
+ $newimg = $img->scaleY(pixels=>400);
+ $newimg = $img->scaleY(scalefactor=>0.25);
+
+ $newimg = $img->crop(left=>50, right=>100, top=>10, bottom=>100);
+ $newimg = $img->crop(left=>50, top=>10, width=>50, height=>90);
+
+ $dest->paste(left=>40,top=>20,img=>$logo);
+
+ $img->rubthrough(src=>$srcimage,tx=>30, ty=>50);
+ $img->rubthrough(src=>$srcimage,tx=>30, ty=>50,
+ src_minx=>20, src_miny=>30,
+ src_maxx=>20, src_maxy=>30);
+
+ $img->compose(src => $src, tx => 30, ty => 20, combine => 'color');
+ $img->compose(src => $src, tx => 30, ty => 20, combine => 'color');
+ mask => $mask, opacity => 0.5);
+
+ $img->flip(dir=>"h"); # horizontal flip
+ $img->flip(dir=>"vh"); # vertical and horizontal flip
+ $newimg = $img->copy->flip(dir=>"v"); # make a copy and flip it vertically
+
+ my $rot20 = $img->rotate(degrees=>20);
+ my $rotpi4 = $img->rotate(radians=>3.14159265/4);
+
+
+ # Convert image to gray
+ $new = $img->convert(preset=>'grey');
+
+ # Swap red/green channel
+ $new = $img->convert(matrix=>[ [ 0, 1, 0 ],
+ [ 1, 0, 0 ],
+ [ 0, 0, 1 ] ]);
+
+ # limit the range of red channel from 0..255 to 0..127
+ @map = map { int( $_/2 } 0..255;
+ $img->map( red=>\@map );
+
+ # Apply a Gamma of 1.4
+ my $gamma = 1.4;
+ my @map = map { int( 0.5 + 255*($_/255)**$gamma ) } 0..255;
+ $img->map(all=>\@map); # inplace conversion
+
+=head1 DESCRIPTION
+
+The methods described in Imager::Transformations fall into two categories.
+Either they take an existing image and modify it in place, or they
+return a modified copy.
+
+Functions that modify inplace are C<flip()>, C<paste()>,
+C<rubthrough()> and C<compose()>. If the original is to be left
+intact it's possible to make a copy and alter the copy:
+
+ $flipped = $img->copy()->flip(dir=>'h');
+
+=head2 Image copying/resizing/cropping/rotating
+
+A list of the transformations that do not alter the source image follows:
+
+=over
+
+=item copy
+
+To create a copy of an image use the C<copy()> method. This is usefull
+if you want to keep an original after doing something that changes the image.
+
+ $newimg = $orig->copy();
+
+=item scale
+
+X<scale>To scale an image so porportions are maintained use the
+C<$img-E<gt>scale()> method. if you give either a xpixels or ypixels
+parameter they will determine the width or height respectively. If
+both are given the one resulting in a larger image is used, unless you
+set the C<type> parameter to C<'min'>. example: C<$img> is 700 pixels
+wide and 500 pixels tall.
+
+ $newimg = $img->scale(xpixels=>400); # 400x285
+ $newimg = $img->scale(ypixels=>400); # 560x400
+
+ $newimg = $img->scale(xpixels=>400,ypixels=>400); # 560x400
+ $newimg = $img->scale(xpixels=>400,ypixels=>400,type=>'min'); # 400x285
+
+ $newimg = $img->scale(xpixels=>400, ypixels=>400),type=>'nonprop'); # 400x400
+
+ $newimg = $img->scale(scalefactor=>0.25); 175x125
+ $newimg = $img->scale(); # 350x250
+
+If you want to create low quality previews of images you can pass
+C<qtype=E<gt>'preview'> to scale and it will use nearest neighbor
+sampling instead of filtering. It is much faster but also generates
+worse looking images - especially if the original has a lot of sharp
+variations and the scaled image is by more than 3-5 times smaller than
+the original.
+
+=over
+
+=item *
+
+xpixels, ypixels - desired size of the scaled image. The C<type>
+parameter controls whether the larger or smaller of the two possible
+sizes is chosen, or if the image is scaled non-proportionally.
+
+=item *
+
+constrain - an Image::Math::Constrain object defining the way in which
+the image size should be constrained.
+
+=item *
+
+scalefactor - if none of xpixels, ypixels, xscalefactor, yscalefactor
+or constrain is supplied then this is used as the ratio to scale by.
+Default: 0.5.
+
+=item *
+
+xscalefactor, yscalefactor - if both are supplied then the image is
+scaled as per these parameters, whether this is proportionally or not.
+New in Imager 0.54.
+
+=item *
+
+type - controls whether the larger or smaller of the two possible
+sizes is chosen, possible values are:
+
+=over
+
+=item *
+
+min - the smaller of the 2 sizes are chosen.
+
+=item *
+
+max - the larger of the 2 sizes. This is the default.
+
+=item *
+
+nonprop - non-proportional scaling. New in Imager 0.54.
+
+=back
+
+scale() will fail if C<type> is set to some other value.
+
+For example, if the original image is 400 pixels wide by 200 pixels
+high and C<xpixels> is set to 300, and C<ypixels> is set to 160. When
+C<type> is C<'min'> the resulting image is 300 x 150, when C<type> is
+C<'max'> the resulting image is 320 x 150.
+
+C<type> is only used if both C<xpixels> and C<ypixels> are supplied.
+
+=item *
+
+qtype - defines the quality of scaling performed. Possible values are:
+
+=over
+
+=item *
+
+C<normal> - high quality scaling. This is the default.
+
+=item *
+
+C<preview> - lower quality. When scaling down this will skip input
+pixels, eg. scaling by 0.5 will skip every other pixel. When scaling
+up this will duplicate pixels.
+
+=item *
+
+C<mixing> - implements the mixing algorithm implemented by pnmscale.
+This retains more detail when scaling down than C<normal>. When
+scaling down this proportionally accumulates sample data from the
+pixels, resulting in a proportional mix of all of the pixels. When
+scaling up this will mix pixels when the sampling grid crosses a pixel
+boundary but will otherwise copy pixel values.
+
+=back
+
+scale() will fail if C<qtype> is set to some other value.
+
+C<preview> is faster than C<mixing> which is much faster than C<normal>.
+
+=back
+
+To scale an image on a given axis without maintaining proportions, it
+is best to call the scaleX() and scaleY() methods with the required
+dimensions. eg.
+
+ my $scaled = $img->scaleX(pixels=>400)->scaleY(pixels=>200);
+
+From Imager 0.54 you can scale without maintaining proportions either
+by supplying both the xscalefactor and yscalefactor arguments:
+
+ my $scaled = $img->scale(xscalefactor => 0.5, yscalefactor => 0.67);
+
+or by supplying C<xpixels> and C<ypixels> and setting C<type> to
+"nonprop":
+
+ my $scaled = $im->scale(xpixels => 200, ypixels => 200, type => 'nonprop');
+
+Returns a new scaled image on success. The source image is not
+modified.
+
+Returns false on failure, check the errstr() method for the reason for
+failure.
+
+A mandatory warning is produced if scale() is called in void context.
+
+ # setup
+ my $image = Imager->new;
+ $image->read(file => 'somefile.jpg')
+ or die $image->errstr;
+
+ # all full quality unless indicated otherwise
+ # half the size:
+ my $half = $image->scale;
+
+ # double the size
+ my $double = $image->scale(scalefactor => 2.0);
+
+ # so a 400 x 400 box fits in the resulting image:
+ my $fit400x400inside = $image->scale(xpixels => 400, ypixels => 400);
+ my $fit400x400inside2 = $image->scale(xpixels => 400, ypixels => 400,
+ type=>'max');
+
+ # fit inside a 400 x 400 box
+ my $inside400x400 = $image->scale(xpixels => 400, ypixels => 400,
+ type=>'min');
+
+ # make it 400 pixels wide or high
+ my $width400 = $image->scale(xpixels => 400);
+ my $height400 = $image->scale(ypixels => 400);
+
+ # low quality scales:
+ # to half size
+ my $low = $image->scale(qtype => 'preview');
+
+ # mixing method scale
+ my $mixed = $image->scale(qtype => 'mixing', scalefactor => 0.1);
+
+ # using an Image::Math::Constrain object
+ use Image::Math::Constrain;
+ my $constrain = Image::Math::Constrain->new(800, 600);
+ my $scaled = $image->scale(constrain => $constrain);
+
+ # same as Image::Math::Constrain version
+ my $scaled2 = $image->scale(xpixels => 800, ypixels => 600, type => 'min');
+
+=item scaleX
+
+scaleX() will scale along the X dimension, return a new image with the
+new width:
+
+ my $newimg = $img->scaleX(pixels=>400); # 400x500
+ $newimg = $img->scaleX(scalefactor=>0.25) # 175x500
+
+=over
+
+=item *
+
+scalefactor - the amount to scale the X axis. Ignored if C<pixels> is
+provided. Default: 0.5.
+
+=item *
+
+pixels - the new width of the image.
+
+=back
+
+Returns a new scaled image on success. The source image is not
+modified.
+
+Returns false on failure, check the errstr() method for the reason for
+failure.
+
+A mandatory warning is produced if scaleX() is called in void context.
+
+=item scaleY
+
+scaleY() will scale along the Y dimension, return a new image with the
+new height:
+
+ $newimg = $img->scaleY(pixels=>400); # 700x400
+ $newimg = $img->scaleY(scalefactor=>0.25) # 700x125
+
+=over
+
+=item *
+
+scalefactor - the amount to scale the Y axis. Ignored if C<pixels> is
+provided. Default: 0.5.
+
+=item *
+
+pixels - the new height of the image.
+
+=back
+
+Returns a new scaled image on success. The source image is not
+modified.
+
+Returns false on failure, check the errstr() method for the reason for
+failure.
+
+A mandatory warning is produced if scaleY() is called in void context.
+
+=item scale_calculate
+
+Performs the same calculations that the scale() method does to
+calculate the scaling factors from the parameters you pass.
+
+scale_calculate() can be called as an object method, or as a class
+method.
+
+Takes the following parameters over scale():
+
+=over
+
+=item *
+
+width, height - the image width and height to base the scaling on.
+Required if scale_calculate() is called as a class method. If called
+as an object method these default to the image width and height
+respectively.
+
+=back
+
+You might use scale_calculate() as a class method when generating an
+IMG tag, for example.
+
+Returns an empty list on failure.
+
+Returns a list containing horizontal scale factor, vertical scale
+factor, new width, new height, on success.
+
+ my ($x_scale, $y_scale, $new_width, $new_height) =
+ Imager->scale_calculate(width => 1024, height => 768,
+ ypixels => 180, type => 'min');
+
+ my ($x_scale, $y_scale, $new_width, $new_height) =
+ $img->scale_calculate(xpixels => 200, type => 'min');
+
+=item crop
+
+Another way to resize an image is to crop it. The parameters to
+crop are the edges of the area that you want in the returned image,
+where the right and bottom edges are non-inclusive. If a parameter is
+omitted a default is used instead.
+
+crop() returns the cropped image and does not modify the source image.
+
+The possible parameters are:
+
+=over
+
+=item *
+
+C<left> - the left edge of the area to be cropped. Default: 0
+
+=item *
+
+C<top> - the top edge of the area to be cropped. Default: 0
+
+=item *
+
+C<right> - the right edge of the area to be cropped. Default: right
+edge of image.
+
+=item *
+
+C<bottom> - the bottom edge of the area to be cropped. Default:
+bottom edge of image.
+
+=item *
+
+C<width> - width of the crop area. Ignored if both C<left> and C<right> are
+supplied. Centered on the image if neither C<left> nor C<right> are
+supplied.
+
+=item *
+
+C<height> - height of the crop area. Ignored if both C<top> and
+C<bottom> are supplied. Centered on the image if neither C<top> nor
+C<bottom> are supplied.
+
+=back
+
+For example:
+
+ # these produce the same image
+ $newimg = $img->crop(left=>50, right=>100, top=>10, bottom=>100);
+ $newimg = $img->crop(left=>50, top=>10, width=>50, height=>90);
+ $newimg = $img->crop(right=>100, bottom=>100, width=>50, height=>90);
+
+ # and the following produce the same image
+ $newimg = $img->crop(left=>50, right=>100);
+ $newimg = $img->crop(left=>50, right=>100, top=>0,
+ bottom=>$img->getheight);
+
+ # grab the top left corner of the image
+ $newimg = $img->crop(right=>50, bottom=>50);
+
+You can also specify width and height parameters which will produce a
+new image cropped from the center of the input image, with the given
+width and height.
+
+ $newimg = $img->crop(width=>50, height=>50);
+
+If you supply C<left>, C<width> and C<right> values, the C<right>
+value will be ignored. If you supply C<top>, C<height> and C<bottom>
+values, the C<bottom> value will be ignored.
+
+The edges of the cropped area default to the edges of the source
+image, for example:
+
+ # a vertical bar from the middle from top to bottom
+ $newimg = $img->crop(width=>50);
+
+ # the right half
+ $newimg = $img->crop(left=>$img->getwidth() / 2);
+
+If the resulting image would have zero width or height then crop()
+returns false and $img->errstr is an appropriate error message.
+
+A mandatory warning is produced if crop() is called in void context.
+
+=item rotate
+
+Use the rotate() method to rotate an image. This method will return a
+new, rotated image.
+
+To rotate by an exact amount in degrees or radians, use the 'degrees'
+or 'radians' parameter:
+
+ my $rot20 = $img->rotate(degrees=>20);
+ my $rotpi4 = $img->rotate(radians=>3.14159265/4);
+
+Exact image rotation uses the same underlying transformation engine as
+the matrix_transform() method (see Imager::Engines).
+
+You can also supply a C<back> argument which acts as a background
+color for the areas of the image with no samples available (outside
+the rectangle of the source image.) This can be either an
+Imager::Color or Imager::Color::Float object. This is B<not> mixed
+transparent pixels in the middle of the source image, it is B<only>
+used for pixels where there is no corresponding pixel in the source
+image.
+
+To rotate in steps of 90 degrees, use the 'right' parameter:
+
+ my $rotated = $img->rotate(right=>270);
+
+Rotations are clockwise for positive values.
+
+Parameters:
+
+=over
+
+=item *
+
+right - rotate by an exact multiple of 90 degrees, specified in
+degreess.
+
+=item *
+
+radians - rotate by an angle specified in radians.
+
+=item *
+
+degrees - rotate by an angle specified in degrees.
+
+=item *
+
+back - for C<radians> and C<degrees> this is the color used for the
+areas not covered by the original image. For example, the corners of
+an image rotated by 45 degrees.
+
+This can be either an Imager::Color object, an Imager::Color::Float
+object or any parameter that Imager can convert to a color object, see
+L<Imager::Draw/Color Parameters> for details.
+
+This is B<not> mixed transparent pixels in the middle of the source
+image, it is B<only> used for pixels where there is no corresponding
+pixel in the source image.
+
+Default: transparent black.
+
+=back
+
+ # rotate 45 degrees clockwise,
+ my $rotated = $img->rotate(degrees => 45);
+
+ # rotate 10 degrees counter-clockwise
+ # set pixels not sourced from the original to red
+ my $rotated = $img->rotate(degrees => -10, back => 'red');
+
+=back
+
+=head2 Image pasting/flipping
+
+A list of the transformations that alter the source image follows:
+
+=over
+
+=item paste
+
+X<paste>To copy an image to onto another image use the C<paste()>
+method.
+
+ $dest->paste(left=>40, top=>20, src=>$logo);
+
+That copies the entire C<$logo> image onto the C<$dest> image so that the
+upper left corner of the C<$logo> image is at (40,20).
+
+Parameters:
+
+=over
+
+=item *
+
+src, img - the source image. I<src> added for compatibility with
+rubthrough().
+
+=item *
+
+left, top - position in output of the top left of the pasted image.
+Default: (0,0)
+
+=item *
+
+src_minx, src_miny - the top left corner in the source image to start
+the paste from. Default: (0, 0)
+
+=item *
+
+src_maxx, src_maxy - the bottom right in the source image of the sub
+image to paste. This position is B<non> inclusive. Default: bottom
+right corner of the source image.
+
+=item *
+
+width, height - if the corresponding src_maxx or src_maxy is not
+defined then width or height is used for the width or height of the
+sub image to be pasted.
+
+=back
+
+ # copy the 20x20 pixel image from (20,20) in $src_image to (10,10) in $img
+ $img->paste(src=>$src_image,
+ left => 10, top => 10,
+ src_minx => 20, src_miny => 20,
+ src_maxx => 40, src_maxx => 40);
+
+If the source image has an alpha channel and the target doesn't, then
+the source is treated as if composed onto a black background.
+
+If the source image is color and the target is grayscale, the the
+source is treated as if run through C<< convert(preset=>'gray') >>.
+
+=item rubthrough
+
+A more complicated way of blending images is where one image is
+put 'over' the other with a certain amount of opaqueness. The
+method that does this is rubthrough.
+
+ $img->rubthrough(src=>$overlay,
+ tx=>30, ty=>50,
+ src_minx=>20, src_miny=>30,
+ src_maxx=>20, src_maxy=>30);
+
+That will take the sub image defined by I<$overlay> and
+I<[src_minx,src_maxx)[src_miny,src_maxy)> and overlay it on top of
+I<$img> with the upper left corner at (30,50). You can rub 2 or 4
+channel images onto a 3 channel image, or a 2 channel image onto a 1
+channel image. The last channel is used as an alpha channel. To add
+an alpha channel to an image see I<convert()>.
+
+Parameters:
+
+=over
+
+=item *
+
+tx, ty - location in the the target image ($self) to render the top
+left corner of the source.
+
+=item *
+
+src_minx, src_miny - the top left corner in the source to transfer to
+the target image. Default: (0, 0).
+
+=item *
+
+src_maxx, src_maxy - the bottom right in the source image of the sub
+image to overlay. This position is B<non> inclusive. Default: bottom
+right corner of the source image.
+
+=back
+
+ # overlay all of $source onto $targ
+ $targ->rubthrough(tx => 20, ty => 25, src => $source);
+
+ # overlay the top left corner of $source onto $targ
+ $targ->rubthrough(tx => 20, ty => 25, src => $source,
+ src_maxx => 20, src_maxy => 20);
+
+ # overlay the bottom right corner of $source onto $targ
+ $targ->rubthrough(tx => 20, ty => 30, src => $src,
+ src_minx => $src->getwidth() - 20,
+ src_miny => $src->getheight() - 20);
+
+rubthrough() returns true on success. On failure check
+$target->errstr for the reason for failure.
+
+=item compose
+
+Draws the source image over the target image, with the src alpha
+channel modified by the optional mask and the opacity.
+
+ $img->compose(src=>$overlay,
+ tx=>30, ty=>50,
+ src_minx=>20, src_miny=>30,
+ src_maxx=>20, src_maxy=>30,
+ mask => $mask, opacity => 0.5);
+
+That will take the sub image defined by I<$overlay> and
+I<[src_minx,src_maxx)[src_miny,src_maxy)> and overlay it on top of
+I<$img> with the upper left corner at (30,50). You can rub 2 or 4
+channel images onto a 3 channel image, or a 2 channel image onto a 1
+channel image.
+
+Parameters:
+
+=over
+
+=item *
+
+src - the source image to draw onto the target. Required.
+
+=item *
+
+tx, ty - location in the the target image ($self) to render the top
+left corner of the source. These can also be supplied as C<left> and
+C<right>. Default: (0, 0).
+
+=item *
+
+src_minx, src_miny - the top left corner in the source to transfer to
+the target image. Default: (0, 0).
+
+=item *
+
+src_maxx, src_maxy - the bottom right in the source image of the sub
+image to overlay. This position is B<non> inclusive. Default: bottom
+right corner of the source image.
+
+=item *
+
+mask - a mask image. The first channel of this image is used to
+modify the alpha channel of the source image. This can me used to
+mask out portions of the source image. Where the first channel is
+zero none of the source image will be used, where the first channel is
+max the full alpha of the source image will be used, as further
+modified by the opacity.
+
+=item *
+
+opacity - further modifies the alpha channel of the source image, in
+the range 0.0 to 1.0. Default: 1.0.
+
+=item *
+
+combine - the method to combine the source pixels with the target.
+See the combine option documentation in Imager::Fill. Default:
+normal.
+
+=back
+
+Calling compose() with no mask, combine set to C<normal>, opacity set
+to C<1.0> is equivalent to calling rubthrough().
+
+compose() is intended to be produce similar effects to layers in
+interactive paint software.
+
+ # overlay all of $source onto $targ
+ $targ->compose(tx => 20, ty => 25, src => $source);
+
+ # overlay the top left corner of $source onto $targ
+ $targ->compose(tx => 20, ty => 25, src => $source,
+ src_maxx => 20, src_maxy => 20);
+
+ # overlay the bottom right corner of $source onto $targ
+ $targ->compose(tx => 20, ty => 30, src => $src,
+ src_minx => $src->getwidth() - 20,
+ src_miny => $src->getheight() - 20);
+
+compose() returns true on success. On failure check $target->errstr
+for the reason for failure.
+
+=item flip
+
+An inplace horizontal or vertical flip is possible by calling the
+C<flip()> method. If the original is to be preserved it's possible to
+make a copy first. The only parameter it takes is the C<dir>
+parameter which can take the values C<h>, C<v>, C<vh> and C<hv>.
+
+ $img->flip(dir=>"h"); # horizontal flip
+ $img->flip(dir=>"vh"); # vertical and horizontal flip
+ $nimg = $img->copy->flip(dir=>"v"); # make a copy and flip it vertically
+
+flip() returns true on success. On failure check $img->errstr for the
+reason for failure.
+
+=back
+
+=head2 Color transformations
+
+=over
+
+=item convert
+
+You can use the convert method to transform the color space of an
+image using a matrix. For ease of use some presets are provided.
+
+The convert method can be used to:
+
+=over
+
+=item *
+
+convert an RGB or RGBA image to grayscale.
+
+=item *
+
+convert a grayscale image to RGB.
+
+=item *
+
+extract a single channel from an image.
+
+=item *
+
+set a given channel to a particular value (or from another channel)
+
+=back
+
+The currently defined presets are:
+
+=over
+
+=item gray
+
+=item grey
+
+converts an RGBA image into a grayscale image with alpha channel, or
+an RGB image into a grayscale image without an alpha channel.
+
+This weights the RGB channels at 22.2%, 70.7% and 7.1% respectively.
+
+=item noalpha
+
+removes the alpha channel from a 2 or 4 channel image. An identity
+for other images.
+
+=item red
+
+=item channel0
+
+extracts the first channel of the image into a single channel image
+
+=item green
+
+=item channel1
+
+extracts the second channel of the image into a single channel image
+
+=item blue
+
+=item channel2
+
+extracts the third channel of the image into a single channel image
+
+=item alpha
+
+extracts the alpha channel of the image into a single channel image.
+
+If the image has 1 or 3 channels (assumed to be grayscale of RGB) then
+the resulting image will be all white.
+
+=item rgb
+
+converts a grayscale image to RGB, preserving the alpha channel if any
+
+=item addalpha
+
+adds an alpha channel to a grayscale or RGB image. Preserves an
+existing alpha channel for a 2 or 4 channel image.
+
+=back
+
+For example, to convert an RGB image into a greyscale image:
+
+ $new = $img->convert(preset=>'grey'); # or gray
+
+or to convert a grayscale image to an RGB image:
+
+ $new = $img->convert(preset=>'rgb');
+
+The presets aren't necessary simple constants in the code, some are
+generated based on the number of channels in the input image.
+
+If you want to perform some other colour transformation, you can use
+the 'matrix' parameter.
+
+For each output pixel the following matrix multiplication is done:
+
+ | channel[0] | | $c00, ..., $c0k | | inchannel[0] |
+ | ... | = | ... | x | ... |
+ | channel[k] | | $ck0, ..., $ckk | | inchannel[k] |
+ 1
+Where C<k = $img-E<gt>getchannels()-1>.
+
+So if you want to swap the red and green channels on a 3 channel image:
+
+ $new = $img->convert(matrix=>[ [ 0, 1, 0 ],
+ [ 1, 0, 0 ],
+ [ 0, 0, 1 ] ]);
+
+or to convert a 3 channel image to greyscale using equal weightings:
+
+ $new = $img->convert(matrix=>[ [ 0.333, 0.333, 0.334 ] ])
+
+Convert a 2 channel image (grayscale with alpha) to an RGBA image with
+the grey converted to the specified RGB color:
+
+ # set (RGB) scaled on the grey scale portion and copy the alpha
+ # channel as is
+ my $colored = $gray->convert(matrix=>[ [ ($red/255), 0 ],
+ [ ($green/255), 0 ],
+ [ ($blue/255), 0 ],
+ [ 0, 1 ],
+ ]);
+
+To convert a 3 channel image to a 4 channel image with a 50 percent
+alpha channel:
+
+ my $withalpha = $rgb->convert(matrix =>[ [ 1, 0, 0, 0 ],
+ [ 0, 1, 0, 0 ],
+ [ 0, 0, 1, 0 ],
+ [ 0, 0, 0, 0.5 ],
+ ]);
+
+=back
+
+=head2 Color Mappings
+
+=over
+
+=item map
+
+You can use the map method to map the values of each channel of an
+image independently using a list of lookup tables. It's important to
+realize that the modification is made inplace. The function simply
+returns the input image again or undef on failure.
+
+Each channel is mapped independently through a lookup table with 256
+entries. The elements in the table should not be less than 0 and not
+greater than 255. If they are out of the 0..255 range they are
+clamped to the range. If a table does not contain 256 entries it is
+silently ignored.
+
+Single channels can mapped by specifying their name and the mapping
+table. The channel names are C<red>, C<green>, C<blue>, C<alpha>.
+
+ @map = map { int( $_/2 } 0..255;
+ $img->map( red=>\@map );
+
+It is also possible to specify a single map that is applied to all
+channels, alpha channel included. For example this applies a gamma
+correction with a gamma of 1.4 to the input image.
+
+ $gamma = 1.4;
+ @map = map { int( 0.5 + 255*($_/255)**$gamma ) } 0..255;
+ $img->map(all=> \@map);
+
+The C<all> map is used as a default channel, if no other map is
+specified for a channel then the C<all> map is used instead. If we
+had not wanted to apply gamma to the alpha channel we would have used:
+
+ $img->map(all=> \@map, alpha=>[]);
+
+Since C<[]> contains fewer than 256 element the gamma channel is
+unaffected.
+
+It is also possible to simply specify an array of maps that are
+applied to the images in the rgba order. For example to apply
+maps to the C<red> and C<blue> channels one would use:
+
+ $img->map(maps=>[\@redmap, [], \@bluemap]);
+
+=back
+
+=head1 SEE ALSO
+
+L<Imager>, L<Imager::Engines>
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>, Arnar M. Hrafnkelsson
+
+=head1 REVISION
+
+$Revision: 1667 $
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/Tutorial.pod b/Master/tlpkg/tlperl.straw/lib/Imager/Tutorial.pod
new file mode 100755
index 00000000000..a26d8d9bdc0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/Tutorial.pod
@@ -0,0 +1,180 @@
+=head1 NAME
+
+Imager::Tutorial - an introduction to Imager.
+
+=head1 DESCRIPTION
+
+=head2 Before you start
+
+If you have the necessary knowledge, install the image format
+libraries you want Imager image file support for, and Imager itself,
+otherwise arrange to have it done.
+
+You will also want some sort of image viewer tool, whether an image
+editor like Photoshop or the GIMP, or a web browser.
+
+=head2 Hello Boxes! - A Simple Start
+
+As with any perl program it's useful to start with a #! line, and to
+enable strict mode:
+
+ #!/usr/bin/perl -w
+ # you might to 'use warnings;' instead of the -w above
+ use strict;
+
+These lines will be omitted in further examples.
+
+As with any module, you need to load it:
+
+ use Imager;
+
+Now create a image to draw on:
+
+ my $image = Imager->new(xsize => 100, ysize => 100);
+
+and draw a couple of filled rectangles on it:
+
+ $image->box(xmin => 0, ymin => 0, xmax => 99, ymax => 99,
+ filled => 1, color => 'blue');
+ $image->box(xmin => 20, ymin => 20, xmax => 79, ymax => 79,
+ filled => 1, color => 'green');
+
+Since the first box fills the whole image, it can be simplified to:
+
+ $image->box(filled => 1, color => 'blue');
+
+and save it to a file:
+
+ $image->write(file=>'tutorial1.ppm')
+ or die 'Cannot save tutorial1.ppm: ', $image->errstr;
+
+So our completed program is:
+
+ use Imager;
+
+ my $image = Imager->new(xsize => 100, ysize => 100);
+
+ $image->box(filled => 1, color => 'blue');
+ $image->box(xmin => 20, ymin => 20, xmax => 79, ymax => 79,
+ filled => 1, color => 'green');
+
+ $image->write(file=>'tutorial1.ppm')
+ or die 'Cannot save tutorial1.ppm: ', $image->errstr;
+
+=head2 Adding some text
+
+The first thing you need to draw text is a font object:
+
+ # use a different file, depending on the font support you have in
+ # your installed Imager.
+ my $font_filename = 'fontfiles/ImUgly.ttf';
+ my $font = Imager::Font->new(file=>$font_filename)
+ or die "Cannot load $font_filename: ", Imager->errstr;
+
+If you're on Windows, you can supply a face name instead:
+
+ my $font = Imager::Font->new(face=>'Arial Bold')
+ or die "Cannot load 'Arial Bold: ", Imager->errstr;
+
+and draw the text:
+
+ my $text = "Hello Boxes!";
+ my $text_size = 12;
+
+ $font->align(string => $text,
+ size => $text_size,
+ color => 'red',
+ x => $image->getwidth/2,
+ y => $image->getheight/2,
+ halign => 'center',
+ valign => 'center',
+ image => $image);
+
+So inserting this into our existing code we have:
+
+ use Imager;
+
+ my $image = Imager->new(xsize => 100, ysize => 100);
+
+ $image->box(xmin => 0, ymin => 0, xmax => 99, ymax => 99,
+ filled => 1, color => 'blue');
+ $image->box(xmin => 20, ymin => 20, xmax => 79, ymax => 79,
+ filled => 1, color => 'green');
+
+ # use a different file, depending on the font support you have in
+ # your installed Imager.
+ my $font_filename = 'fontfiles/ImUgly.ttf';
+ my $font = Imager::Font->new(file=>$font_filename)
+ or die "Cannot load $font_filename: ", Imager->errstr;
+
+ my $text = "Hello Boxes!";
+ my $text_size = 12;
+
+ $font->align(string => $text,
+ size => $text_size,
+ color => 'red',
+ x => $image->getwidth/2,
+ y => $image->getheight/2,
+ halign => 'center',
+ valign => 'center',
+ image => $image);
+
+ $image->write(file=>'tutorial2.ppm')
+ or die 'Cannot save tutorial2.ppm: ', $image->errstr;
+
+=head2 Using an existing image as a base
+
+To load an image from a file, first create an empty image object:
+
+ my $read_image = Imager->new;
+
+then call the read method:
+
+ my $image_source = shift; # from the command-line
+ $read_image->read(file=>$image_source)
+ or die "Cannot load $image_source: ", $image->errstr;
+
+To keep to our working size, we'll scale the image:
+
+ # the scale() method always does a proportional scale, we don't want
+ # that here
+ my $scaled_image = $read_image->scaleX(pixels=>100)->scaleY(pixels=>100);
+
+draw our inner box on that, and save the result:
+
+ $scaled_image->box(xmin => 20, ymin => 20, xmax => 79, ymax => 79,
+ filled => 1, color => 'green');
+
+ $scaled_image->write(file=>'tutorial3.ppm')
+ or die 'Cannot save tutorial3.ppm: ', $image->errstr;
+
+so the complete program is:
+
+ use Imager;
+
+ my $read_image = Imager->new;
+
+ my $image_source = shift; # from the command-line
+ $read_image->read(file=>$image_source)
+ or die "Cannot load $image_source: ", $image->errstr;
+
+ # the scale() method always does a proportional scale, we don't want
+ # that here
+ my $scaled_image = $read_image->scaleX(pixels=>100)->scaleY(pixels=>100);
+
+ $scaled_image->box(xmin => 20, ymin => 20, xmax => 79, ymax => 79,
+ filled => 1, color => 'green');
+
+ $scaled_image->write(file=>'tutorial3.ppm')
+ or die 'Cannot save tutorial3.ppm: ', $image->errstr;
+
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=head1 REVISION
+
+$Revision: 811 $
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/draw.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/draw.h
new file mode 100755
index 00000000000..3453de302b6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/draw.h
@@ -0,0 +1,21 @@
+#include "imager.h"
+
+typedef struct {
+ int min,max;
+} minmax;
+
+typedef struct {
+ minmax *data;
+ int lines;
+} i_mmarray;
+
+/* FIXME: Merge this into datatypes.{c,h} */
+
+void i_mmarray_cr(i_mmarray *ar,int l);
+void i_mmarray_dst(i_mmarray *ar);
+void i_mmarray_add(i_mmarray *ar,int x,int y);
+int i_mmarray_gmin(i_mmarray *ar,int y);
+int i_mmarray_getm(i_mmarray *ar,int y);
+void i_mmarray_render(i_img *im,i_mmarray *ar,i_color *val);
+void i_mmarray_info(i_mmarray *ar);
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/dynaload.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/dynaload.h
new file mode 100755
index 00000000000..75f55cef434
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/dynaload.h
@@ -0,0 +1,58 @@
+#ifndef _DYNALOAD_H_
+#define _DYNALOAD_H_
+
+#include "log.h"
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "ppport.h"
+
+#include "ext.h"
+
+typedef struct DSO_handle_tag DSO_handle;
+
+typedef struct {
+ HV* hv;
+ char *key;
+ void *store;
+} UTIL_args;
+
+#if 0
+int getobj(void *hv_t,char *key,char *type,void **store);
+int getint(void *hv_t,char *key,int *store);
+int getdouble(void *hv_t,char *key,double *store);
+int getvoid(void *hv_t,char *key,void **store);
+#endif
+
+void *DSO_open(char* file,char** evalstring);
+func_ptr *DSO_funclist(DSO_handle *handle);
+int DSO_close(void *);
+void DSO_call(DSO_handle *handle,int func_index,HV* hv);
+
+#ifdef __EMX__ /* OS/2 */
+# ifndef RTLD_LAZY
+# define RTLD_LAZY 0
+# endif /* RTLD_LAZY */
+int dlclose(minthandle_t);
+#endif /* __EMX__ */
+
+#ifdef DLSYMUN
+
+#define I_EVALSTR "_evalstr"
+#define I_SYMBOL_TABLE "_symbol_table"
+#define I_UTIL_TABLE "_util_table"
+#define I_FUNCTION_LIST "_function_list"
+#define I_INSTALL_TABLES "_install_tables"
+
+#else
+
+#define I_EVALSTR "evalstr"
+#define I_SYMBOL_TABLE "symbol_table"
+#define I_UTIL_TABLE "util_table"
+#define I_FUNCTION_LIST "function_list"
+#define I_INSTALL_TABLES "install_tables"
+
+#endif
+
+#endif /* _DYNALOAD_H_ */
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/ext.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/ext.h
new file mode 100755
index 00000000000..dd1cfbd8f0e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/ext.h
@@ -0,0 +1,23 @@
+#include "imager.h"
+
+#ifndef IMAGER_EXT_H
+#define IMAGER_EXT_H
+
+/* structures for passing data between Imager-plugin and the Imager-module */
+
+typedef struct {
+ char *name;
+ void (*iptr)(void* ptr);
+ char *pcode;
+} func_ptr;
+
+
+typedef struct {
+ int (*getstr)(void *hv_t,char* key,char **store);
+ int (*getint)(void *hv_t,char *key,int *store);
+ int (*getdouble)(void *hv_t,char* key,double *store);
+ int (*getvoid)(void *hv_t,char* key,void **store);
+ int (*getobj)(void *hv_t,char* key,char* type,void **store);
+} UTIL_table_t;
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/feat.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/feat.h
new file mode 100755
index 00000000000..25fac9e320d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/feat.h
@@ -0,0 +1,34 @@
+#include "imager.h"
+
+static char *i_format_list[]={
+#ifdef HAVE_LIBJPEG
+ "jpeg",
+#endif
+#ifdef HAVE_LIBTIFF
+ "tiff",
+#endif
+#ifdef HAVE_LIBPNG
+ "png",
+#endif
+#ifdef HAVE_LIBGIF
+ "gif",
+#endif
+#ifdef HAVE_LIBT1
+ "t1",
+#endif
+#ifdef HAVE_LIBTT
+ "tt",
+#endif
+#ifdef HAVE_WIN32
+ "w32",
+#endif
+#ifdef HAVE_FT2
+ "ft2",
+#endif
+ "raw",
+ "pnm",
+ "bmp",
+ "tga",
+ "ifs",
+ NULL};
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/imager.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/imager.h
new file mode 100755
index 00000000000..e44311cc2c5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/imager.h
@@ -0,0 +1,612 @@
+#ifndef _IMAGE_H_
+#define _IMAGE_H_
+
+#include "imconfig.h"
+#include "imio.h"
+#include "iolayer.h"
+#include "log.h"
+#include "stackmach.h"
+
+
+#ifndef _MSC_VER
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+
+#ifdef SUNOS
+#include <strings.h>
+#endif
+
+#ifndef PI
+#define PI 3.14159265358979323846
+#endif
+
+#ifndef MAXINT
+#define MAXINT 2147483647
+#endif
+
+#include "imdatatypes.h"
+
+undef_int i_has_format(char *frmt);
+
+/* constructors and destructors */
+
+i_color *ICL_new_internal( unsigned char r,unsigned char g,unsigned char b,unsigned char a);
+i_color *ICL_set_internal(i_color *cl,unsigned char r,unsigned char g,unsigned char b,unsigned char a);
+void ICL_info (const i_color *cl);
+void ICL_DESTROY (i_color *cl);
+void ICL_add (i_color *dst, i_color *src, int ch);
+
+extern i_fcolor *i_fcolor_new(double r, double g, double b, double a);
+extern void i_fcolor_destroy(i_fcolor *cl);
+
+extern void i_rgb_to_hsvf(i_fcolor *color);
+extern void i_hsv_to_rgbf(i_fcolor *color);
+extern void i_rgb_to_hsv(i_color *color);
+extern void i_hsv_to_rgb(i_color *color);
+
+i_img *IIM_new(int x,int y,int ch);
+#define i_img_8_new IIM_new
+void IIM_DESTROY(i_img *im);
+i_img *i_img_new( void );
+i_img *i_img_empty(i_img *im,int x,int y);
+i_img *i_img_empty_ch(i_img *im,int x,int y,int ch);
+void i_img_exorcise(i_img *im);
+void i_img_destroy(i_img *im);
+i_img *i_img_alloc(void);
+void i_img_init(i_img *im);
+
+void i_img_info(i_img *im,int *info);
+
+extern i_img *i_sametype(i_img *im, int xsize, int ysize);
+extern i_img *i_sametype_chans(i_img *im, int xsize, int ysize, int channels);
+
+i_img *i_img_pal_new(int x, int y, int ch, int maxpal);
+
+/* Image feature settings */
+
+void i_img_setmask (i_img *im,int ch_mask);
+int i_img_getmask (i_img *im);
+int i_img_getchannels(i_img *im);
+i_img_dim i_img_get_width(i_img *im);
+i_img_dim i_img_get_height(i_img *im);
+
+/* Base functions */
+
+extern int i_ppix(i_img *im,int x,int y, const i_color *val);
+extern int i_gpix(i_img *im,int x,int y,i_color *val);
+extern int i_ppixf(i_img *im,int x,int y, const i_fcolor *val);
+extern int i_gpixf(i_img *im,int x,int y,i_fcolor *val);
+
+#define i_ppix(im, x, y, val) (((im)->i_f_ppix)((im), (x), (y), (val)))
+#define i_gpix(im, x, y, val) (((im)->i_f_gpix)((im), (x), (y), (val)))
+#define i_ppixf(im, x, y, val) (((im)->i_f_ppixf)((im), (x), (y), (val)))
+#define i_gpixf(im, x, y, val) (((im)->i_f_gpixf)((im), (x), (y), (val)))
+
+extern int i_plin(i_img *im, int l, int r, int y, const i_color *vals);
+extern int i_glin(i_img *im, int l, int r, int y, i_color *vals);
+extern int i_plinf(i_img *im, int l, int r, int y, const i_fcolor *vals);
+extern int i_glinf(i_img *im, int l, int r, int y, i_fcolor *vals);
+extern int i_gsamp(i_img *im, int l, int r, int y, i_sample_t *samp,
+ const int *chans, int chan_count);
+extern int i_gsampf(i_img *im, int l, int r, int y, i_fsample_t *samp,
+ const int *chans, int chan_count);
+extern int i_gpal(i_img *im, int x, int r, int y, i_palidx *vals);
+extern int i_ppal(i_img *im, int x, int r, int y, const i_palidx *vals);
+extern int i_addcolors(i_img *im, const i_color *colors, int count);
+extern int i_getcolors(i_img *im, int i, i_color *, int count);
+extern int i_colorcount(i_img *im);
+extern int i_maxcolors(i_img *im);
+extern int i_findcolor(i_img *im, const i_color *color, i_palidx *entry);
+extern int i_setcolors(i_img *im, int index, const i_color *colors,
+ int count);
+
+#define i_plin(im, l, r, y, val) (((im)->i_f_plin)(im, l, r, y, val))
+#define i_glin(im, l, r, y, val) (((im)->i_f_glin)(im, l, r, y, val))
+#define i_plinf(im, l, r, y, val) (((im)->i_f_plinf)(im, l, r, y, val))
+#define i_glinf(im, l, r, y, val) (((im)->i_f_glinf)(im, l, r, y, val))
+
+#define i_gsamp(im, l, r, y, samps, chans, count) \
+ (((im)->i_f_gsamp)((im), (l), (r), (y), (samps), (chans), (count)))
+#define i_gsampf(im, l, r, y, samps, chans, count) \
+ (((im)->i_f_gsampf)((im), (l), (r), (y), (samps), (chans), (count)))
+
+#define i_gsamp_bits(im, l, r, y, samps, chans, count, bits) \
+ (((im)->i_f_gsamp_bits) ? ((im)->i_f_gsamp_bits)((im), (l), (r), (y), (samps), (chans), (count), (bits)) : -1)
+#define i_psamp_bits(im, l, r, y, samps, chans, count, bits) \
+ (((im)->i_f_psamp_bits) ? ((im)->i_f_psamp_bits)((im), (l), (r), (y), (samps), (chans), (count), (bits)) : -1)
+
+#define i_findcolor(im, color, entry) \
+ (((im)->i_f_findcolor) ? ((im)->i_f_findcolor)((im), (color), (entry)) : 0)
+
+#define i_gpal(im, l, r, y, vals) \
+ (((im)->i_f_gpal) ? ((im)->i_f_gpal)((im), (l), (r), (y), (vals)) : 0)
+#define i_ppal(im, l, r, y, vals) \
+ (((im)->i_f_ppal) ? ((im)->i_f_ppal)((im), (l), (r), (y), (vals)) : 0)
+#define i_addcolors(im, colors, count) \
+ (((im)->i_f_addcolors) ? ((im)->i_f_addcolors)((im), (colors), (count)) : -1)
+#define i_getcolors(im, index, color, count) \
+ (((im)->i_f_getcolors) ? \
+ ((im)->i_f_getcolors)((im), (index), (color), (count)) : 0)
+#define i_setcolors(im, index, color, count) \
+ (((im)->i_f_setcolors) ? \
+ ((im)->i_f_setcolors)((im), (index), (color), (count)) : 0)
+#define i_colorcount(im) \
+ (((im)->i_f_colorcount) ? ((im)->i_f_colorcount)(im) : -1)
+#define i_maxcolors(im) \
+ (((im)->i_f_maxcolors) ? ((im)->i_f_maxcolors)(im) : -1)
+#define i_findcolor(im, color, entry) \
+ (((im)->i_f_findcolor) ? ((im)->i_f_findcolor)((im), (color), (entry)) : 0)
+
+#define i_img_virtual(im) ((im)->virtual)
+#define i_img_type(im) ((im)->type)
+#define i_img_bits(im) ((im)->bits)
+
+extern i_fill_t *i_new_fill_solidf(const i_fcolor *c, int combine);
+extern i_fill_t *i_new_fill_solid(const i_color *c, int combine);
+extern i_fill_t *
+i_new_fill_hatch(const i_color *fg, const i_color *bg, int combine, int hatch,
+ const unsigned char *cust_hatch, int dx, int dy);
+extern i_fill_t *
+i_new_fill_hatchf(const i_fcolor *fg, const i_fcolor *bg, int combine, int hatch,
+ const unsigned char *cust_hatch, int dx, int dy);
+extern i_fill_t *
+i_new_fill_image(i_img *im, const double *matrix, int xoff, int yoff, int combine);
+extern i_fill_t *i_new_fill_opacity(i_fill_t *, double alpha_mult);
+extern void i_fill_destroy(i_fill_t *fill);
+
+float i_gpix_pch(i_img *im,int x,int y,int ch);
+
+/* functions for drawing primitives */
+
+void i_box (i_img *im,int x1,int y1,int x2,int y2,const i_color *val);
+void i_box_filled (i_img *im,int x1,int y1,int x2,int y2,const i_color *val);
+void i_box_cfill(i_img *im, int x1, int y1, int x2, int y2, i_fill_t *fill);
+void i_line (i_img *im,int x1,int y1,int x2,int y2,const i_color *val, int endp);
+void i_line_aa (i_img *im,int x1,int y1,int x2,int y2,const i_color *val, int endp);
+void i_arc (i_img *im,int x,int y,float rad,float d1,float d2,const i_color *val);
+void i_arc_aa (i_img *im, double x, double y, double rad, double d1, double d2, const i_color *val);
+void i_arc_cfill(i_img *im,int x,int y,float rad,float d1,float d2,i_fill_t *fill);
+void i_arc_aa_cfill(i_img *im,double x,double y,double rad,double d1,double d2,i_fill_t *fill);
+void i_circle_aa (i_img *im,float x, float y,float rad,const i_color *val);
+void i_copyto (i_img *im,i_img *src,int x1,int y1,int x2,int y2,int tx,int ty);
+void i_copyto_trans(i_img *im,i_img *src,int x1,int y1,int x2,int y2,int tx,int ty,const i_color *trans);
+i_img* i_copy (i_img *src);
+int i_rubthru (i_img *im, i_img *src, int tx, int ty, int src_minx, int src_miny, int src_maxx, int src_maxy);
+extern int
+i_compose_mask(i_img *out, i_img *src, i_img *mask,
+ int out_left, int out_top, int src_left, int src_top,
+ int mask_left, int mask_top, int width, int height,
+ int combine, double opacity);
+extern int
+i_compose(i_img *out, i_img *src,
+ int out_left, int out_top, int src_left, int src_top,
+ int width, int height, int combine, double opacity);
+
+undef_int i_flipxy (i_img *im, int direction);
+extern i_img *i_rotate90(i_img *im, int degrees);
+extern i_img *i_rotate_exact(i_img *im, double amount);
+extern i_img *i_rotate_exact_bg(i_img *im, double amount, const i_color *backp, const i_fcolor *fbackp);
+extern i_img *i_matrix_transform(i_img *im, int xsize, int ysize, const double *matrix);
+extern i_img *i_matrix_transform_bg(i_img *im, int xsize, int ysize, const double *matrix, const i_color *backp, const i_fcolor *fbackp);
+
+void i_bezier_multi(i_img *im,int l,const double *x,const double *y,const i_color *val);
+void i_poly_aa (i_img *im,int l,const double *x,const double *y,const i_color *val);
+void i_poly_aa_cfill(i_img *im,int l,const double *x,const double *y,i_fill_t *fill);
+
+undef_int i_flood_fill (i_img *im,int seedx,int seedy, const i_color *dcol);
+undef_int i_flood_cfill(i_img *im, int seedx, int seedy, i_fill_t *fill);
+undef_int i_flood_fill_border (i_img *im,int seedx,int seedy, const i_color *dcol, const i_color *border);
+undef_int i_flood_cfill_border(i_img *im, int seedx, int seedy, i_fill_t *fill, const i_color *border);
+
+
+/* image processing functions */
+
+int i_gaussian (i_img *im, double stdev);
+int i_conv (i_img *im,const double *coeff,int len);
+void i_unsharp_mask(i_img *im, double stddev, double scale);
+
+/* colour manipulation */
+extern i_img *i_convert(i_img *src, const float *coeff, int outchan, int inchan);
+extern void i_map(i_img *im, unsigned char (*maps)[256], unsigned int mask);
+
+float i_img_diff (i_img *im1,i_img *im2);
+double i_img_diffd(i_img *im1,i_img *im2);
+
+/* font routines */
+
+undef_int i_init_fonts( int t1log );
+
+#ifdef HAVE_LIBT1
+
+undef_int i_init_t1( int t1log );
+int i_t1_new( char *pfb, char *afm );
+int i_t1_destroy( int font_id );
+undef_int i_t1_cp( i_img *im, int xb, int yb, int channel, int fontnum, float points, char* str, int len, int align, int utf8, char const *flags );
+undef_int i_t1_text( i_img *im, int xb, int yb, const i_color *cl, int fontnum, float points, const char* str, int len, int align, int utf8, char const *flags );
+int i_t1_bbox( int fontnum, float point, const char *str, int len, int cords[6], int utf8, char const *flags );
+void i_t1_set_aa( int st );
+void close_t1( void );
+int i_t1_has_chars(int font_num, char const *text, int len, int utf8, char *out);
+extern int i_t1_face_name(int font_num, char *name_buf, size_t name_buf_size);
+extern int i_t1_glyph_name(int font_num, unsigned long ch, char *name_buf,
+ size_t name_buf_size);
+#endif
+
+#ifdef HAVE_LIBTT
+
+undef_int i_init_tt( void );
+TT_Fonthandle* i_tt_new(const char *fontname);
+void i_tt_destroy( TT_Fonthandle *handle );
+undef_int i_tt_cp( TT_Fonthandle *handle,i_img *im,int xb,int yb,int channel,float points,char const* txt,int len,int smooth, int utf8, int align);
+undef_int i_tt_text( TT_Fonthandle *handle, i_img *im, int xb, int yb, const i_color *cl, float points, char const* txt, int len, int smooth, int utf8, int align);
+undef_int i_tt_bbox( TT_Fonthandle *handle, float points,const char *txt,int len,int cords[6], int utf8);
+int i_tt_has_chars(TT_Fonthandle *handle, char const *text, int len, int utf8, char *out);
+void i_tt_dump_names(TT_Fonthandle *handle);
+int i_tt_face_name(TT_Fonthandle *handle, char *name_buf,
+ size_t name_buf_size);
+int i_tt_glyph_name(TT_Fonthandle *handle, unsigned long ch, char *name_buf,
+ size_t name_buf_size);
+
+#endif /* End of freetype headers */
+
+#ifdef HAVE_FT2
+
+extern int i_ft2_init(void);
+extern FT2_Fonthandle * i_ft2_new(const char *name, int index);
+extern void i_ft2_destroy(FT2_Fonthandle *handle);
+extern int i_ft2_setdpi(FT2_Fonthandle *handle, int xdpi, int ydpi);
+extern int i_ft2_getdpi(FT2_Fonthandle *handle, int *xdpi, int *ydpi);
+extern int i_ft2_settransform(FT2_Fonthandle *handle, const double *matrix);
+extern int i_ft2_sethinting(FT2_Fonthandle *handle, int hinting);
+extern int i_ft2_bbox(FT2_Fonthandle *handle, double cheight, double cwidth,
+ char const *text, int len, int *bbox, int utf8);
+extern int i_ft2_bbox_r(FT2_Fonthandle *handle, double cheight, double cwidth,
+ char const *text, int len, int vlayout, int utf8, int *bbox);
+extern int i_ft2_text(FT2_Fonthandle *handle, i_img *im, int tx, int ty,
+ const i_color *cl, double cheight, double cwidth,
+ char const *text, int len, int align, int aa,
+ int vlayout, int utf8);
+extern int i_ft2_cp(FT2_Fonthandle *handle, i_img *im, int tx, int ty,
+ int channel, double cheight, double cwidth,
+ char const *text, int len, int align, int aa, int vlayout,
+ int utf8);
+extern int i_ft2_has_chars(FT2_Fonthandle *handle, char const *text, int len,
+ int utf8, char *work);
+extern int i_ft2_face_name(FT2_Fonthandle *handle, char *name_buf,
+ size_t name_buf_size);
+extern int i_ft2_can_face_name(void);
+extern int i_ft2_glyph_name(FT2_Fonthandle *handle, unsigned long ch,
+ char *name_buf, size_t name_buf_size,
+ int reliable_only);
+extern int i_ft2_can_do_glyph_names(void);
+extern int i_ft2_face_has_glyph_names(FT2_Fonthandle *handle);
+
+extern int i_ft2_get_multiple_masters(FT2_Fonthandle *handle,
+ i_font_mm *mm);
+extern int
+i_ft2_is_multiple_master(FT2_Fonthandle *handle);
+extern int
+i_ft2_set_mm_coords(FT2_Fonthandle *handle, int coord_count, const long *coords);
+#endif
+
+#ifdef WIN32
+
+extern int i_wf_bbox(const char *face, int size, const char *text, int length, int *bbox, int utf8);
+extern int i_wf_text(const char *face, i_img *im, int tx, int ty, const i_color *cl,
+ int size, const char *text, int len, int align, int aa, int utf8);
+extern int i_wf_cp(const char *face, i_img *im, int tx, int ty, int channel,
+ int size, const char *text, int len, int align, int aa, int utf8);
+extern int i_wf_addfont(char const *file);
+extern int i_wf_delfont(char const *file);
+
+#endif
+
+/* functions for reading and writing formats */
+
+/* general reader callback
+ userdata - data the user passed into the reader
+ buffer - the buffer to fill with data
+ need - the amount of data needed
+ want - the amount of space we have to store data
+ fill buffer and return the number of bytes read, 0 for eof, -1 for error
+*/
+
+typedef int (*i_read_callback_t)(char *userdata, char *buffer, int need,
+ int want);
+
+/* i_gen_reader() translates the low-level requests from whatever library
+ into buffered requests.
+ but the called function can always bypass buffering by only ever
+ reading I<need> bytes.
+*/
+#define CBBUFSIZ 4096
+
+typedef struct {
+ i_read_callback_t cb;
+ char *userdata;
+ char buffer[CBBUFSIZ];
+ int length;
+ int cpos;
+} i_gen_read_data;
+
+extern int i_gen_reader(i_gen_read_data *info, char *buffer, int need);
+extern i_gen_read_data *i_gen_read_data_new(i_read_callback_t cb, char *userdata);
+extern void i_free_gen_read_data(i_gen_read_data *);
+
+/* general writer callback
+ userdata - the data the user passed into the writer
+ data - the data to write
+ data_size - the number of bytes to write
+ write the data, return non-zero on success, zero on failure.
+*/
+typedef int (*i_write_callback_t)(char *userdata, char const *data, int size);
+
+typedef struct {
+ i_write_callback_t cb;
+ char *userdata;
+ char buffer[CBBUFSIZ];
+ int maxlength;
+ int filledto;
+} i_gen_write_data;
+
+extern int i_gen_writer(i_gen_write_data *info, char const *data, int size);
+extern i_gen_write_data *i_gen_write_data_new(i_write_callback_t cb, char *userdata, int maxlength);
+extern int i_free_gen_write_data(i_gen_write_data *, int flush);
+
+extern void i_quant_makemap(i_quantize *quant, i_img **imgs, int count);
+extern i_palidx *i_quant_translate(i_quantize *quant, i_img *img);
+extern void i_quant_transparent(i_quantize *quant, i_palidx *indices, i_img *img, i_palidx trans_index);
+
+extern i_img *i_img_pal_new(int x, int y, int channels, int maxpal);
+extern i_img *i_img_to_pal(i_img *src, i_quantize *quant);
+extern i_img *i_img_to_rgb(i_img *src);
+extern i_img *i_img_masked_new(i_img *targ, i_img *mask, int x, int y,
+ int w, int h);
+extern i_img *i_img_16_new(int x, int y, int ch);
+extern i_img *i_img_to_rgb16(i_img *im);
+extern i_img *i_img_double_new(int x, int y, int ch);
+
+extern int i_img_is_monochrome(i_img *im, int *zero_is_white);
+extern void i_get_file_background(i_img *im, i_color *bg);
+extern void i_get_file_backgroundf(i_img *im, i_fcolor *bg);
+
+const char * i_test_format_probe(io_glue *data, int length);
+
+
+#ifdef HAVE_LIBJPEG
+i_img *
+i_readjpeg_wiol(io_glue *ig, int length, char** iptc_itext, int *itlength);
+undef_int i_writejpeg_wiol(i_img *im, io_glue *ig, int qfactor);
+#endif /* HAVE_LIBJPEG */
+
+#ifdef HAVE_LIBTIFF
+i_img * i_readtiff_wiol(io_glue *ig, int allow_incomplete, int page);
+i_img ** i_readtiff_multi_wiol(io_glue *ig, int length, int *count);
+undef_int i_writetiff_wiol(i_img *im, io_glue *ig);
+undef_int i_writetiff_multi_wiol(io_glue *ig, i_img **imgs, int count);
+undef_int i_writetiff_wiol_faxable(i_img *im, io_glue *ig, int fine);
+undef_int i_writetiff_multi_wiol_faxable(io_glue *ig, i_img **imgs, int count, int fine);
+char const * i_tiff_libversion(void);
+int i_tiff_has_compression(char const *name);
+
+#endif /* HAVE_LIBTIFF */
+
+#ifdef HAVE_LIBPNG
+i_img *i_readpng_wiol(io_glue *ig, int length);
+undef_int i_writepng_wiol(i_img *im, io_glue *ig);
+#endif /* HAVE_LIBPNG */
+
+#ifdef HAVE_LIBGIF
+i_img *i_readgif(int fd, int **colour_table, int *colours);
+i_img *i_readgif_wiol(io_glue *ig, int **colour_table, int *colours);
+i_img *i_readgif_scalar(char *data, int length, int **colour_table, int *colours);
+i_img *i_readgif_callback(i_read_callback_t callback, char *userdata, int **colour_table, int *colours);
+i_img *i_readgif_single_wiol(io_glue *ig, int page);
+extern i_img **i_readgif_multi(int fd, int *count);
+extern i_img **i_readgif_multi_scalar(char *data, int length, int *count);
+extern i_img **i_readgif_multi_callback(i_read_callback_t callback, char *userdata, int *count);
+extern i_img **i_readgif_multi_wiol(io_glue *ig, int *count);
+undef_int i_writegif(i_img *im,int fd,int colors,int pixdev,int fixedlen,i_color fixed[]);
+undef_int i_writegifmc(i_img *im,int fd,int colors);
+undef_int i_writegifex(i_img *im,int fd);
+undef_int i_writegif_gen(i_quantize *quant, int fd, i_img **imgs, int count);
+undef_int i_writegif_callback(i_quantize *quant, i_write_callback_t cb, char *userdata, int maxbuffer, i_img **imgs, int count);
+undef_int i_writegif_wiol(io_glue *ig, i_quantize *quant,
+ i_img **imgs, int count);
+void i_qdist(i_img *im);
+
+#endif /* HAVE_LIBGIF */
+
+i_img * i_readraw_wiol(io_glue *ig, int x, int y, int datachannels, int storechannels, int intrl);
+undef_int i_writeraw_wiol(i_img* im, io_glue *ig);
+
+i_img * i_readpnm_wiol(io_glue *ig, int allow_incomplete);
+undef_int i_writeppm_wiol(i_img *im, io_glue *ig);
+
+extern int i_writebmp_wiol(i_img *im, io_glue *ig);
+extern i_img *i_readbmp_wiol(io_glue *ig, int allow_incomplete);
+
+int tga_header_verify(unsigned char headbuf[18]);
+
+i_img * i_readtga_wiol(io_glue *ig, int length);
+undef_int i_writetga_wiol(i_img *img, io_glue *ig, int wierdpack, int compress, char *idstring, size_t idlen);
+
+i_img * i_readrgb_wiol(io_glue *ig, int length);
+undef_int i_writergb_wiol(i_img *img, io_glue *ig, int wierdpack, int compress, char *idstring, size_t idlen);
+
+i_img * i_scaleaxis(i_img *im, float Value, int Axis);
+i_img * i_scale_nn(i_img *im, float scx, float scy);
+i_img * i_scale_mixing(i_img *src, int width, int height);
+i_img * i_haar(i_img *im);
+int i_count_colors(i_img *im,int maxc);
+int i_get_anonymous_color_histo(i_img *im, unsigned int **col_usage, int maxc);
+
+i_img * i_transform(i_img *im, int *opx,int opxl,int *opy,int opyl,double parm[],int parmlen);
+
+struct rm_op;
+i_img * i_transform2(int width, int height, int channels,
+ struct rm_op *ops, int ops_count,
+ double *n_regs, int n_regs_count,
+ i_color *c_regs, int c_regs_count,
+ i_img **in_imgs, int in_imgs_count);
+
+/* filters */
+
+void i_contrast(i_img *im, float intensity);
+void i_hardinvert(i_img *im);
+void i_noise(i_img *im, float amount, unsigned char type);
+void i_bumpmap(i_img *im,i_img *bump,int channel,int light_x,int light_y,int strength);
+void i_bumpmap_complex(i_img *im, i_img *bump, int channel, int tx, int ty, float Lx, float Ly,
+ float Lz, float cd, float cs, float n, i_color *Ia, i_color *Il, i_color *Is);
+void i_postlevels(i_img *im,int levels);
+void i_mosaic(i_img *im,int size);
+void i_watermark(i_img *im,i_img *wmark,int tx,int ty,int pixdiff);
+void i_autolevels(i_img *im,float lsat,float usat,float skew);
+void i_radnoise(i_img *im,int xo,int yo,float rscale,float ascale);
+void i_turbnoise(i_img *im,float xo,float yo,float scale);
+void i_gradgen(i_img *im, int num, int *xo, int *yo, i_color *ival, int dmeasure);
+int i_nearest_color(i_img *im, int num, int *xo, int *yo, i_color *ival, int dmeasure);
+i_img *i_diff_image(i_img *im, i_img *im2, double mindist);
+int
+i_fountain(i_img *im, double xa, double ya, double xb, double yb,
+ i_fountain_type type, i_fountain_repeat repeat,
+ int combine, int super_sample, double ssample_param,
+ int count, i_fountain_seg *segs);
+extern i_fill_t *
+i_new_fill_fount(double xa, double ya, double xb, double yb,
+ i_fountain_type type, i_fountain_repeat repeat,
+ int combine, int super_sample, double ssample_param,
+ int count, i_fountain_seg *segs);
+
+/* Debug only functions */
+
+void malloc_state( void );
+
+/* this is sort of obsolete now */
+
+typedef struct {
+ undef_int (*i_has_format)(char *frmt);
+ i_color*(*ICL_set)(i_color *cl,unsigned char r,unsigned char g,unsigned char b,unsigned char a);
+ void (*ICL_info)(const i_color *cl);
+
+ i_img*(*i_img_new)( void );
+ i_img*(*i_img_empty)(i_img *im,int x,int y);
+ i_img*(*i_img_empty_ch)(i_img *im,int x,int y,int ch);
+ void(*i_img_exorcise)(i_img *im);
+
+ void(*i_img_info)(i_img *im,int *info);
+
+ void(*i_img_setmask)(i_img *im,int ch_mask);
+ int (*i_img_getmask)(i_img *im);
+
+ /*
+ int (*i_ppix)(i_img *im,int x,int y,i_color *val);
+ int (*i_gpix)(i_img *im,int x,int y,i_color *val);
+ */
+ void(*i_box)(i_img *im,int x1,int y1,int x2,int y2,const i_color *val);
+ void(*i_line)(i_img *im,int x1,int y1,int x2,int y2,const i_color *val,int endp);
+ void(*i_arc)(i_img *im,int x,int y,float rad,float d1,float d2,const i_color *val);
+ void(*i_copyto)(i_img *im,i_img *src,int x1,int y1,int x2,int y2,int tx,int ty);
+ void(*i_copyto_trans)(i_img *im,i_img *src,int x1,int y1,int x2,int y2,int tx,int ty,const i_color *trans);
+ int(*i_rubthru)(i_img *im,i_img *src,int tx,int ty, int src_minx, int src_miny, int src_maxx, int src_maxy);
+
+} symbol_table_t;
+
+#include "imerror.h"
+
+/* image tag processing */
+extern void i_tags_new(i_img_tags *tags);
+extern int i_tags_addn(i_img_tags *tags, char const *name, int code,
+ int idata);
+extern int i_tags_add(i_img_tags *tags, char const *name, int code,
+ char const *data, int size, int idata);
+extern int i_tags_set(i_img_tags *tags, char const *name,
+ char const *data, int size);
+extern int i_tags_setn(i_img_tags *tags, char const *name, int idata);
+
+extern void i_tags_destroy(i_img_tags *tags);
+extern int i_tags_find(i_img_tags *tags, char const *name, int start,
+ int *entry);
+extern int i_tags_findn(i_img_tags *tags, int code, int start, int *entry);
+extern int i_tags_delete(i_img_tags *tags, int entry);
+extern int i_tags_delbyname(i_img_tags *tags, char const *name);
+extern int i_tags_delbycode(i_img_tags *tags, int code);
+extern int i_tags_get_float(i_img_tags *tags, char const *name, int code,
+ double *value);
+extern int i_tags_set_float(i_img_tags *tags, char const *name, int code,
+ double value);
+extern int i_tags_set_float2(i_img_tags *tags, char const *name, int code,
+ double value, int places);
+extern int i_tags_get_int(i_img_tags *tags, char const *name, int code,
+ int *value);
+extern int i_tags_get_string(i_img_tags *tags, char const *name, int code,
+ char *value, size_t value_size);
+extern int i_tags_get_color(i_img_tags *tags, char const *name, int code,
+ i_color *value);
+extern int i_tags_set_color(i_img_tags *tags, char const *name, int code,
+ i_color const *value);
+extern void i_tags_print(i_img_tags *tags);
+
+/* image file limits */
+extern int
+i_set_image_file_limits(int width, int height, int bytes);
+extern int
+i_get_image_file_limits(int *width, int *height, int *bytes);
+extern int
+i_int_check_image_file_limits(int width, int height, int channels, int sample_size);
+
+/* memory allocation */
+void* mymalloc(int size);
+void myfree(void *p);
+void* myrealloc(void *p, size_t newsize);
+void* mymalloc_file_line (size_t size, char* file, int line);
+void myfree_file_line (void *p, char*file, int line);
+void* myrealloc_file_line(void *p, size_t newsize, char* file,int line);
+
+#ifdef IMAGER_DEBUG_MALLOC
+
+#define mymalloc(x) (mymalloc_file_line((x), __FILE__, __LINE__))
+#define myrealloc(x,y) (myrealloc_file_line((x),(y), __FILE__, __LINE__))
+#define myfree(x) (myfree_file_line((x), __FILE__, __LINE__))
+
+void malloc_state (void);
+void* mymalloc_comm (int size, char *comm);
+void bndcheck_all (void);
+
+#else
+
+#define malloc_comm(a,b) (mymalloc(a))
+void malloc_state(void);
+
+#endif /* IMAGER_MALLOC_DEBUG */
+
+#include "imrender.h"
+#include "immacros.h"
+
+extern void
+i_adapt_colors(int dest_channels, int src_channels, i_color *colors,
+ size_t count);
+extern void
+i_adapt_fcolors(int dest_channels, int src_channels, i_fcolor *colors,
+ size_t count);
+
+extern void
+i_adapt_colors_bg(int dest_channels, int src_channels, i_color *colors,
+ size_t count, i_color const *bg);
+extern void
+i_adapt_fcolors_bg(int dest_channels, int src_channels, i_fcolor *colors,
+ size_t count, i_fcolor const *bg);
+
+extern int
+i_gsamp_bg(i_img *im, int l, int r, int y, i_sample_t *samples,
+ int out_channels, i_color const *bg);
+
+extern int
+i_gsampf_bg(i_img *im, int l, int r, int y, i_fsample_t *samples,
+ int out_channels, i_fcolor const *bg);
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/imageri.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/imageri.h
new file mode 100755
index 00000000000..e01df468397
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/imageri.h
@@ -0,0 +1,111 @@
+/* Declares utility functions useful across various files which
+ aren't meant to be available externally
+*/
+
+#ifndef IMAGEI_H_
+#define IMAGEI_H_
+
+#include "imager.h"
+
+/* wrapper functions that implement the floating point sample version of a
+ function in terms of the 8-bit sample version
+*/
+extern int i_ppixf_fp(i_img *im, int x, int y, const i_fcolor *pix);
+extern int i_gpixf_fp(i_img *im, int x, int y, i_fcolor *pix);
+extern int i_plinf_fp(i_img *im, int l, int r, int y, const i_fcolor *pix);
+extern int i_glinf_fp(i_img *im, int l, int r, int y, i_fcolor *pix);
+extern int i_gsampf_fp(i_img *im, int l, int r, int y, i_fsample_t *samp,
+ int const *chans, int chan_count);
+
+/* wrapper functions that forward palette calls to the underlying image,
+ assuming the underlying image is the first pointer in whatever
+ ext_data points at
+*/
+extern int i_addcolors_forward(i_img *im, const i_color *, int count);
+extern int i_getcolors_forward(i_img *im, int i, i_color *, int count);
+extern int i_colorcount_forward(i_img *im);
+extern int i_maxcolors_forward(i_img *im);
+extern int i_findcolor_forward(i_img *im, const i_color *color,
+ i_palidx *entry);
+extern int i_setcolors_forward(i_img *im, int index, const i_color *colors,
+ int count);
+
+/* fallback handler for gsamp_bits */
+extern int i_gsamp_bits_fb(i_img *im, int x, int r, int y, unsigned *samp,
+ const int *chans, int chan_count, int bits);
+
+#define SampleFTo16(num) ((int)((num) * 65535.0 + 0.01))
+/* we add that little bit to avoid rounding issues */
+#define Sample16ToF(num) ((num) / 65535.0)
+
+#define SampleFTo8(num) ((int)((num) * 255.0 + 0.01))
+#define Sample8ToF(num) ((num) / 255.0)
+
+#define Sample16To8(num) ((num) / 257)
+#define Sample8To16(num) ((num) * 257)
+
+extern void i_get_combine(int combine, i_fill_combine_f *, i_fill_combinef_f *);
+
+#define im_min(a, b) ((a) < (b) ? (a) : (b))
+#define im_max(a, b) ((a) > (b) ? (a) : (b))
+
+#include "ext.h"
+
+extern UTIL_table_t i_UTIL_table;
+
+/* Ideally this will move into imconfig.h if we ever probe */
+#if defined(_GNU_SOURCE) || __STDC_VERSION__ >= 199901L
+/* snprintf() is part of C99 and provided by Glibc */
+#define HAVE_SNPRINTF
+#endif
+
+/* test if all channels are writable */
+#define I_ALL_CHANNELS_WRITABLE(im) (((im)->ch_mask & 0xF) == 0xf)
+
+typedef struct i_int_hline_seg_tag {
+ int minx, x_limit;
+} i_int_hline_seg;
+
+typedef struct i_int_hline_entry_tag {
+ int count;
+ int alloc;
+ i_int_hline_seg segs[1];
+} i_int_hline_entry;
+
+/* represents a set of horizontal line segments to be filled in later */
+typedef struct i_int_hlines_tag {
+ int start_y, limit_y;
+ int start_x, limit_x;
+ i_int_hline_entry **entries;
+} i_int_hlines;
+
+extern void
+i_int_init_hlines(
+ i_int_hlines *hlines,
+ int start_y,
+ int count_y,
+ int start_x,
+ int width_x
+ );
+extern void i_int_init_hlines_img(i_int_hlines *hlines, i_img *img);
+extern void i_int_hlines_add(i_int_hlines *hlines, int y, int minx, int width);
+extern void i_int_hlines_destroy(i_int_hlines *hlines);
+
+extern void i_int_hlines_fill_color(i_img *im, i_int_hlines *hlines, const i_color *val);
+extern void i_int_hlines_fill_fill(i_img *im, i_int_hlines *hlines, i_fill_t *fill);
+
+#define I_LIMIT_8(x) ((x) < 0 ? 0 : (x) > 255 ? 255 : (x))
+#define I_LIMIT_DOUBLE(x) ((x) < 0.0 ? 0.0 : (x) > 1.0 ? 1.0 : (x))
+
+#define IM_STRING(x) #x
+
+/* I considered using assert.h here, but perl does it's own thing with
+ assert() and the NDEBUG test is opposite to the direction I prefer */
+#ifdef IM_ASSERT
+extern void im_assert_fail(char const *, int, char const *);
+#define im_assert(x) ((x) ? (void)(0) : im_assert_fail(__FILE__, __LINE__, IM_STRING(x)))
+#else
+#define im_assert(x) (void)(0)
+#endif
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/imconfig.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/imconfig.h
new file mode 100755
index 00000000000..187a099d97d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/imconfig.h
@@ -0,0 +1,62 @@
+/* This file is automatically generated by Makefile.PL.
+ Don't edit this file, since any changes will be lost */
+
+#ifndef IMAGER_IMCONFIG_H
+#define IMAGER_IMCONFIG_H
+
+/*
+ Logging system
+*/
+
+#define IMAGER_LOG 1
+
+/*
+ Parsed giflib version
+*/
+
+#define IM_GIFMAJOR 4
+#define IM_GIFMINOR 1
+
+/*
+ gif available
+*/
+
+#define HAVE_LIBGIF 1
+
+/*
+ jpeg available
+*/
+
+#define HAVE_LIBJPEG 1
+
+/*
+ png available
+*/
+
+#define HAVE_LIBPNG 1
+
+/*
+ tiff available
+*/
+
+#define HAVE_LIBTIFF 1
+
+/*
+ freetype2 available
+*/
+
+#define HAVE_FT2 1
+
+/*
+ w32 available
+*/
+
+#define HAVE_WIN32 1
+
+/*
+ Enable experimental EXIF support
+*/
+
+#define IMEXIF_ENABLE 1
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/imdatatypes.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/imdatatypes.h
new file mode 100755
index 00000000000..007ba1018b7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/imdatatypes.h
@@ -0,0 +1,715 @@
+#ifndef _DATATYPES_H_
+#define _DATATYPES_H_
+
+#include "imconfig.h"
+#include "imio.h"
+
+#define MAXCHANNELS 4
+
+/* used for palette indices in some internal code (which might be
+ exposed at some point
+*/
+typedef unsigned char i_palidx;
+
+/* We handle 2 types of sample, this is hopefully the most common, and the
+ smaller of the ones we support */
+typedef unsigned char i_sample_t;
+
+typedef struct { i_sample_t gray_color; } gray_color;
+typedef struct { i_sample_t r,g,b; } rgb_color;
+typedef struct { i_sample_t r,g,b,a; } rgba_color;
+typedef struct { i_sample_t c,m,y,k; } cmyk_color;
+
+typedef int undef_int; /* special value to put in typemaps to retun undef on 0 and 1 on 1 */
+
+/*
+=item i_color
+=category Data Types
+=synopsis i_color black;
+=synopsis black.rgba.r = black.rgba.g = black.rgba.b = black.rgba.a = 0;
+
+Type for 8-bit/sample color.
+
+Samples as per;
+
+ i_color c;
+
+i_color is a union of:
+
+=over
+
+=item *
+
+gray - contains a single element gray_color, eg. c.gray.gray_color
+
+=item *
+
+rgb - contains three elements r, g, b, eg. c.rgb.r
+
+=item *
+
+rgba - contains four elements r, g, b, a, eg. c.rgba.a
+
+=item *
+
+cmyk - contains four elements c, m, y, k, eg. C<c.cmyk.y>. Note that
+Imager never uses CMYK colors except when reading/writing files.
+
+=item *
+
+channels - an array of four channels, eg C<c.channels[2]>.
+
+=back
+
+=cut
+*/
+
+typedef union {
+ gray_color gray;
+ rgb_color rgb;
+ rgba_color rgba;
+ cmyk_color cmyk;
+ i_sample_t channel[MAXCHANNELS];
+ unsigned int ui;
+} i_color;
+
+/* this is the larger sample type, it should be able to accurately represent
+ any sample size we use */
+typedef double i_fsample_t;
+
+typedef struct { i_fsample_t gray_color; } i_fgray_color_t;
+typedef struct { i_fsample_t r, g, b; } i_frgb_color_t;
+typedef struct { i_fsample_t r, g, b, a; } i_frgba_color_t;
+typedef struct { i_fsample_t c, m, y, k; } i_fcmyk_color_t;
+
+/*
+=item i_fcolor
+=category Data Types
+
+This is the double/sample color type.
+
+Its layout exactly corresponds to i_color.
+
+=cut
+*/
+
+typedef union {
+ i_fgray_color_t gray;
+ i_frgb_color_t rgb;
+ i_frgba_color_t rgba;
+ i_fcmyk_color_t cmyk;
+ i_fsample_t channel[MAXCHANNELS];
+} i_fcolor;
+
+typedef enum {
+ i_direct_type, /* direct colour, keeps RGB values per pixel */
+ i_palette_type /* keeps a palette index per pixel */
+} i_img_type_t;
+
+typedef enum {
+ /* bits per sample, not per pixel */
+ /* a paletted image might have one bit per sample */
+ i_8_bits = 8,
+ i_16_bits = 16,
+ i_double_bits = sizeof(double) * 8
+} i_img_bits_t;
+
+typedef struct {
+ char *name; /* name of a given tag, might be NULL */
+ int code; /* number of a given tag, -1 if it has no meaning */
+ char *data; /* value of a given tag if it's not an int, may be NULL */
+ int size; /* size of the data */
+ int idata; /* value of a given tag if data is NULL */
+} i_img_tag;
+
+typedef struct {
+ int count; /* how many tags have been set */
+ int alloc; /* how many tags have been allocated for */
+ i_img_tag *tags;
+} i_img_tags;
+
+typedef struct i_img_ i_img;
+typedef int (*i_f_ppix_t)(i_img *im, int x, int y, const i_color *pix);
+typedef int (*i_f_ppixf_t)(i_img *im, int x, int y, const i_fcolor *pix);
+typedef int (*i_f_plin_t)(i_img *im, int x, int r, int y, const i_color *vals);
+typedef int (*i_f_plinf_t)(i_img *im, int x, int r, int y, const i_fcolor *vals);
+typedef int (*i_f_gpix_t)(i_img *im, int x, int y, i_color *pix);
+typedef int (*i_f_gpixf_t)(i_img *im, int x, int y, i_fcolor *pix);
+typedef int (*i_f_glin_t)(i_img *im, int x, int r, int y, i_color *vals);
+typedef int (*i_f_glinf_t)(i_img *im, int x, int r, int y, i_fcolor *vals);
+
+typedef int (*i_f_gsamp_t)(i_img *im, int x, int r, int y, i_sample_t *samp,
+ const int *chans, int chan_count);
+typedef int (*i_f_gsampf_t)(i_img *im, int x, int r, int y, i_fsample_t *samp,
+ const int *chan, int chan_count);
+
+typedef int (*i_f_gpal_t)(i_img *im, int x, int r, int y, i_palidx *vals);
+typedef int (*i_f_ppal_t)(i_img *im, int x, int r, int y, const i_palidx *vals);
+typedef int (*i_f_addcolors_t)(i_img *im, const i_color *colors, int count);
+typedef int (*i_f_getcolors_t)(i_img *im, int i, i_color *, int count);
+typedef int (*i_f_colorcount_t)(i_img *im);
+typedef int (*i_f_maxcolors_t)(i_img *im);
+typedef int (*i_f_findcolor_t)(i_img *im, const i_color *color, i_palidx *entry);
+typedef int (*i_f_setcolors_t)(i_img *im, int index, const i_color *colors,
+ int count);
+
+typedef void (*i_f_destroy_t)(i_img *im);
+
+typedef int (*i_f_gsamp_bits_t)(i_img *im, int x, int r, int y, unsigned *samp,
+ const int *chans, int chan_count, int bits);
+typedef int (*i_f_psamp_bits_t)(i_img *im, int x, int r, int y, unsigned const *samp,
+ const int *chans, int chan_count, int bits);
+
+/*
+=item i_img_dim
+=category Data Types
+=synopsis i_img_dim x;
+=order 90
+
+A signed integer type that represents an image dimension or ordinate.
+
+May be larger than int on some platforms.
+
+=cut
+*/
+typedef int i_img_dim;
+
+/*
+=item i_img
+=category Data Types
+=synopsis i_img *img;
+=order 10
+
+This is Imager's image type.
+
+It contains the following members:
+
+=over
+
+=item *
+
+channels - the number of channels in the image
+
+=item *
+
+xsize, ysize - the width and height of the image in pixels
+
+=item *
+
+bytes - the number of bytes used to store the image data. Undefined
+where virtual is non-zero.
+
+=item *
+
+ch_mask - a mask of writable channels. eg. if this is 6 then only
+channels 1 and 2 are writable. There may be bits set for which there
+are no channels in the image.
+
+=item *
+
+bits - the number of bits stored per sample. Should be one of
+i_8_bits, i_16_bits, i_double_bits.
+
+=item *
+
+type - either i_direct_type for direct color images, or i_palette_type
+for paletted images.
+
+=item *
+
+virtual - if zero then this image is-self contained. If non-zero then
+this image could be an interface to some other implementation.
+
+=item *
+
+idata - the image data. This should not be directly accessed. A new
+image implementation can use this to store its image data.
+i_img_destroy() will myfree() this pointer if it's non-null.
+
+=item *
+
+tags - a structure storing the image's tags. This should only be
+accessed via the i_tags_*() functions.
+
+=item *
+
+ext_data - a pointer for use internal to an image implementation.
+This should be freed by the image's destroy handler.
+
+=item *
+
+im_data - data internal to Imager. This is initialized by
+i_img_init().
+
+=item *
+
+i_f_ppix, i_f_ppixf, i_f_plin, i_f_plinf, i_f_gpix, i_f_gpixf,
+i_f_glin, i_f_glinf, i_f_gsamp, i_f_gampf - implementations for each
+of the required image functions. An image implementation should
+initialize these between calling i_img_alloc() and i_img_init().
+
+=item *
+
+i_f_gpal, i_f_ppal, i_f_addcolors, i_f_getcolors, i_f_colorcount,
+i_f_maxcolors, i_f_findcolor, i_f_setcolors - implementations for each
+paletted image function.
+
+=item *
+
+i_f_destroy - custom image destruction function. This should be used
+to release memory if necessary.
+
+=item *
+
+i_f_gsamp_bits - implements i_gsamp_bits() for this image.
+
+=item *
+
+i_f_psamp_bits - implements i_psamp_bits() for this image.
+
+=back
+
+=cut
+*/
+
+struct i_img_ {
+ int channels;
+ i_img_dim xsize,ysize;
+ size_t bytes;
+ unsigned int ch_mask;
+ i_img_bits_t bits;
+ i_img_type_t type;
+ int virtual; /* image might not keep any data, must use functions */
+ unsigned char *idata; /* renamed to force inspection of existing code */
+ /* can be NULL if virtual is non-zero */
+ i_img_tags tags;
+
+ void *ext_data;
+
+ /* interface functions */
+ i_f_ppix_t i_f_ppix;
+ i_f_ppixf_t i_f_ppixf;
+ i_f_plin_t i_f_plin;
+ i_f_plinf_t i_f_plinf;
+ i_f_gpix_t i_f_gpix;
+ i_f_gpixf_t i_f_gpixf;
+ i_f_glin_t i_f_glin;
+ i_f_glinf_t i_f_glinf;
+ i_f_gsamp_t i_f_gsamp;
+ i_f_gsampf_t i_f_gsampf;
+
+ /* only valid for type == i_palette_type */
+ i_f_gpal_t i_f_gpal;
+ i_f_ppal_t i_f_ppal;
+ i_f_addcolors_t i_f_addcolors;
+ i_f_getcolors_t i_f_getcolors;
+ i_f_colorcount_t i_f_colorcount;
+ i_f_maxcolors_t i_f_maxcolors;
+ i_f_findcolor_t i_f_findcolor;
+ i_f_setcolors_t i_f_setcolors;
+
+ i_f_destroy_t i_f_destroy;
+
+ /* as of 0.61 */
+ i_f_gsamp_bits_t i_f_gsamp_bits;
+ i_f_psamp_bits_t i_f_psamp_bits;
+
+ void *im_data;
+};
+
+/* ext_data for paletted images
+ */
+typedef struct {
+ int count; /* amount of space used in palette (in entries) */
+ int alloc; /* amount of space allocated for palette (in entries) */
+ i_color *pal;
+ int last_found;
+} i_img_pal_ext;
+
+/* Helper datatypes
+ The types in here so far are:
+
+ doubly linked bucket list - pretty efficient
+ octtree - no idea about goodness
+
+ needed: hashes.
+
+*/
+
+/* bitmap mask */
+
+struct i_bitmap {
+ int xsize,ysize;
+ char *data;
+};
+
+struct i_bitmap* btm_new(int xsize,int ysize);
+void btm_destroy(struct i_bitmap *btm);
+int btm_test(struct i_bitmap *btm,int x,int y);
+void btm_set(struct i_bitmap *btm,int x,int y);
+
+
+/* Stack/Linked list */
+
+struct llink {
+ struct llink *p,*n;
+ void *data;
+ int fill; /* Number used in this link */
+};
+
+struct llist {
+ struct llink *h,*t;
+ int multip; /* # of copies in a single chain */
+ int ssize; /* size of each small element */
+ int count; /* number of elements on the list */
+};
+
+
+/* Links */
+
+struct llink *llink_new( struct llink* p,int size );
+int llist_llink_push( struct llist *lst, struct llink *lnk, void *data );
+
+/* Lists */
+
+struct llist *llist_new( int multip, int ssize );
+void llist_destroy( struct llist *l );
+void llist_push( struct llist *l, void *data );
+void llist_dump( struct llist *l );
+int llist_pop( struct llist *l,void *data );
+
+
+
+
+/* Octtree */
+
+struct octt {
+ struct octt *t[8];
+ int cnt;
+};
+
+struct octt *octt_new(void);
+int octt_add(struct octt *ct,unsigned char r,unsigned char g,unsigned char b);
+void octt_dump(struct octt *ct);
+void octt_count(struct octt *ct,int *tot,int max,int *overflow);
+void octt_delete(struct octt *ct);
+void octt_histo(struct octt *ct, unsigned int **col_usage_it_adr);
+
+/* font bounding box results */
+enum bounding_box_index_t {
+ BBOX_NEG_WIDTH,
+ BBOX_GLOBAL_DESCENT,
+ BBOX_POS_WIDTH,
+ BBOX_GLOBAL_ASCENT,
+ BBOX_DESCENT,
+ BBOX_ASCENT,
+ BBOX_ADVANCE_WIDTH,
+ BBOX_RIGHT_BEARING,
+ BOUNDING_BOX_COUNT
+};
+
+/* Generic fills */
+struct i_fill_tag;
+
+typedef void (*i_fill_with_color_f)
+ (struct i_fill_tag *fill, int x, int y, int width, int channels,
+ i_color *data);
+typedef void (*i_fill_with_fcolor_f)
+ (struct i_fill_tag *fill, int x, int y, int width, int channels,
+ i_fcolor *data);
+typedef void (*i_fill_destroy_f)(struct i_fill_tag *fill);
+
+/* combine functions modify their target and are permitted to modify
+ the source to prevent having to perform extra copying/memory
+ allocations, etc
+ The out array has I<channels> channels.
+
+ The in array has I<channels> channels + an alpha channel if one
+ isn't included in I<channels>.
+*/
+
+typedef void (*i_fill_combine_f)(i_color *out, i_color *in, int channels,
+ int count);
+typedef void (*i_fill_combinef_f)(i_fcolor *out, i_fcolor *in, int channels,
+ int count);
+
+/* fountain fill types */
+typedef enum {
+ i_fst_linear,
+ i_fst_curved,
+ i_fst_sine,
+ i_fst_sphere_up,
+ i_fst_sphere_down,
+ i_fst_end
+} i_fountain_seg_type;
+typedef enum {
+ i_fc_direct,
+ i_fc_hue_up,
+ i_fc_hue_down,
+ i_fc_end
+} i_fountain_color;
+typedef struct {
+ double start, middle, end;
+ i_fcolor c[2];
+ i_fountain_seg_type type;
+ i_fountain_color color;
+} i_fountain_seg;
+typedef enum {
+ i_fr_none,
+ i_fr_sawtooth,
+ i_fr_triangle,
+ i_fr_saw_both,
+ i_fr_tri_both
+} i_fountain_repeat;
+typedef enum {
+ i_ft_linear,
+ i_ft_bilinear,
+ i_ft_radial,
+ i_ft_radial_square,
+ i_ft_revolution,
+ i_ft_conical,
+ i_ft_end
+} i_fountain_type;
+typedef enum {
+ i_fts_none,
+ i_fts_grid,
+ i_fts_random,
+ i_fts_circle
+} i_ft_supersample;
+
+/*
+=item i_fill_t
+=category Data Types
+=synopsis i_fill_t *fill;
+
+This is the "abstract" base type for Imager's fill types.
+
+Unless you're implementing a new fill type you'll typically treat this
+as an opaque type.
+
+=cut
+*/
+
+typedef struct i_fill_tag
+{
+ /* called for 8-bit/sample image (and maybe lower) */
+ /* this may be NULL, if so call fill_with_fcolor */
+ i_fill_with_color_f f_fill_with_color;
+
+ /* called for other sample sizes */
+ /* this must be non-NULL */
+ i_fill_with_fcolor_f f_fill_with_fcolor;
+
+ /* called if non-NULL to release any extra resources */
+ i_fill_destroy_f destroy;
+
+ /* if non-zero the caller will fill data with the original data
+ from the image */
+ i_fill_combine_f combine;
+ i_fill_combinef_f combinef;
+} i_fill_t;
+
+typedef enum {
+ ic_none,
+ ic_normal,
+ ic_multiply,
+ ic_dissolve,
+ ic_add,
+ ic_subtract,
+ ic_diff,
+ ic_lighten,
+ ic_darken,
+ ic_hue,
+ ic_sat,
+ ic_value,
+ ic_color
+} i_combine_t;
+
+/*
+ describes an axis of a MM font.
+ Modelled on FT2's FT_MM_Axis.
+ It would be nice to have a default entry too, but FT2
+ doesn't support it.
+*/
+typedef struct i_font_mm_axis_tag {
+ char const *name;
+ int minimum;
+ int maximum;
+} i_font_mm_axis;
+
+#define IM_FONT_MM_MAX_AXES 4
+
+/*
+ multiple master information for a font, if any
+ modelled on FT2's FT_Multi_Master.
+*/
+typedef struct i_font_mm_tag {
+ int num_axis;
+ int num_designs; /* provided but not necessarily useful */
+ i_font_mm_axis axis[IM_FONT_MM_MAX_AXES];
+} i_font_mm;
+
+#ifdef HAVE_LIBTT
+
+struct TT_Fonthandle_;
+
+typedef struct TT_Fonthandle_ TT_Fonthandle;
+
+#endif
+
+#ifdef HAVE_FT2
+
+typedef struct FT2_Fonthandle FT2_Fonthandle;
+
+#endif
+
+/* transparency handling for quantized output */
+typedef enum i_transp_tag {
+ tr_none, /* ignore any alpha channel */
+ tr_threshold, /* threshold the transparency - uses tr_threshold */
+ tr_errdiff, /* error diffusion */
+ tr_ordered /* an ordered dither */
+} i_transp;
+
+/* controls how we build the colour map */
+typedef enum i_make_colors_tag {
+ mc_none, /* user supplied colour map only */
+ mc_web_map, /* Use the 216 colour web colour map */
+ mc_addi, /* Addi's algorithm */
+ mc_median_cut, /* median cut - similar to giflib, hopefully */
+ mc_mono, /* fixed mono color map */
+ mc_mask = 0xFF /* (mask for generator) */
+} i_make_colors;
+
+/* controls how we translate the colours */
+typedef enum i_translate_tag {
+ pt_giflib, /* get gif lib to do it (ignores make_colours) */
+ pt_closest, /* just use the closest match within the hashbox */
+ pt_perturb, /* randomly perturb the data - uses perturb_size*/
+ pt_errdiff /* error diffusion dither - uses errdiff */
+} i_translate;
+
+/* Which error diffusion map to use */
+typedef enum i_errdiff_tag {
+ ed_floyd, /* floyd-steinberg */
+ ed_jarvis, /* Jarvis, Judice and Ninke */
+ ed_stucki, /* Stucki */
+ ed_custom, /* the map found in ed_map|width|height|orig */
+ ed_mask = 0xFF, /* mask to get the map */
+ ed_bidir = 0x100 /* change direction for each row */
+} i_errdiff;
+
+/* which ordered dither map to use
+ currently only available for transparency
+ I don't know of a way to do ordered dither of an image against some
+ general palette
+ */
+typedef enum i_ord_dith_tag
+{
+ od_random, /* sort of random */
+ od_dot8, /* large dot */
+ od_dot4,
+ od_hline,
+ od_vline,
+ od_slashline, /* / line dither */
+ od_backline, /* \ line dither */
+ od_tiny, /* small checkerbox */
+ od_custom /* custom 8x8 map */
+} i_ord_dith;
+
+typedef struct i_gif_pos_tag {
+ int x, y;
+} i_gif_pos;
+
+/* passed into i_writegif_gen() to control quantization */
+typedef struct i_quantize_tag {
+ /* how to handle transparency */
+ i_transp transp;
+ /* the threshold at which to make pixels opaque */
+ int tr_threshold;
+ i_errdiff tr_errdiff;
+ i_ord_dith tr_orddith;
+ unsigned char tr_custom[64];
+
+ /* how to make the colour map */
+ i_make_colors make_colors;
+
+ /* any existing colours
+ mc_existing is an existing colour table
+ mc_count is the number of existing colours
+ mc_size is the total size of the array that mc_existing points
+ at - this must be at least 256
+ */
+ i_color *mc_colors;
+ int mc_size;
+ int mc_count;
+
+ /* how we translate the colours */
+ i_translate translate;
+
+ /* the error diffusion map to use if translate is mc_errdiff */
+ i_errdiff errdiff;
+ /* the following define the error diffusion values to use if
+ errdiff is ed_custom. ed_orig is the column on the top row that
+ represents the current
+ */
+ int *ed_map;
+ int ed_width, ed_height, ed_orig;
+
+ /* the amount of perturbation to use for translate is mc_perturb */
+ int perturb;
+} i_quantize;
+
+typedef struct i_gif_opts {
+ /* each image has a local color map */
+ int each_palette;
+
+ /* images are interlaced */
+ int interlace;
+
+ /* time for which image is displayed
+ (in 1/100 seconds)
+ default: 0
+ */
+ int delay_count;
+ int *delays;
+
+ /* user input flags
+ default: 0
+ */
+ int user_input_count;
+ char *user_input_flags;
+
+ /* disposal
+ default: 0 */
+ int disposal_count;
+ char *disposal;
+
+ /* this is added to the color table when we make an image transparent */
+ i_color tran_color;
+
+ /* image positions */
+ int position_count;
+ i_gif_pos *positions;
+
+ /* Netscape loop extension - number of loops */
+ int loop_count;
+
+ /* should be eliminate unused colors? */
+ int eliminate_unused;
+} i_gif_opts;
+
+/* distance measures used by some filters */
+enum {
+ i_dmeasure_euclidean = 0,
+ i_dmeasure_euclidean_squared = 1,
+ i_dmeasure_manhatten = 2,
+ i_dmeasure_limit = 2,
+};
+
+#include "iolayert.h"
+
+#include "rendert.h"
+
+#endif
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/imerror.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/imerror.h
new file mode 100755
index 00000000000..313834f4b39
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/imerror.h
@@ -0,0 +1,27 @@
+#ifndef IMAGER_IMERROR_H
+#define IMAGER_IMERROR_H
+
+/* error handling
+ see error.c for documentation
+ the error information is currently global
+*/
+typedef struct {
+ char *msg;
+ int code;
+} i_errmsg;
+
+typedef void (*i_error_cb)(int code, char const *msg);
+typedef void (*i_failed_cb)(i_errmsg *msgs);
+extern i_error_cb i_set_error_cb(i_error_cb);
+extern i_failed_cb i_set_failed_cb(i_failed_cb);
+extern void i_set_argv0(char const *);
+extern int i_set_errors_fatal(int new_fatal);
+extern i_errmsg *i_errors(void);
+
+extern void i_push_error(int code, char const *msg);
+extern void i_push_errorf(int code, char const *fmt, ...);
+extern void i_push_errorvf(int code, char const *fmt, va_list);
+extern void i_clear_error(void);
+extern int i_failed(int code, char const *msg);
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/imexif.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/imexif.h
new file mode 100755
index 00000000000..70a2b161ca5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/imexif.h
@@ -0,0 +1,10 @@
+/* imexif.h - interface to Exif handling */
+#ifndef IMAGER_IMEXIF_H
+#define IMAGER_IMEXIF_H
+
+#include <stddef.h>
+#include "imageri.h"
+
+extern int i_int_decode_exif(i_img *im, unsigned char *data, size_t length);
+
+#endif /* ifndef IMAGER_IMEXIF_H */
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/imext.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/imext.h
new file mode 100755
index 00000000000..13fef908699
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/imext.h
@@ -0,0 +1,206 @@
+#ifndef IMAGER_IMEXT_H_
+#define IMAGER_IMEXT_H_
+
+#include "imexttypes.h"
+#include "immacros.h"
+
+extern im_ext_funcs *imager_function_ext_table;
+
+#define DEFINE_IMAGER_CALLBACKS im_ext_funcs *imager_function_ext_table
+
+#ifndef IMAGER_MIN_API_LEVEL
+#define IMAGER_MIN_API_LEVEL IMAGER_API_LEVEL
+#endif
+
+#define PERL_INITIALIZE_IMAGER_CALLBACKS \
+ do { \
+ imager_function_ext_table = INT2PTR(im_ext_funcs *, SvIV(get_sv(PERL_FUNCTION_TABLE_NAME, 1))); \
+ if (!imager_function_ext_table) \
+ croak("Imager API function table not found!"); \
+ if (imager_function_ext_table->version != IMAGER_API_VERSION) \
+ croak("Imager API version incorrect"); \
+ if (imager_function_ext_table->level < IMAGER_MIN_API_LEVEL) \
+ croak("API level %d below minimum of %d", imager_function_ext_table->level, IMAGER_MIN_API_LEVEL); \
+ } while (0)
+
+/* just for use here */
+#define im_extt imager_function_ext_table
+
+#ifdef IMAGER_DEBUG_MALLOC
+
+#define mymalloc(size) ((im_extt->f_mymalloc_file_line)((size), __FILE__, __LINE__))
+#define myrealloc(ptr, size) ((im_extt->f_myrealloc_file_line)((ptr), (size), __FILE__, __LINE__))
+#define myfree(ptr) ((im_extt->f_myfree_file_line)((ptr), __FILE__, __LINE__))
+
+#else
+
+#define mymalloc(size) ((im_extt->f_mymalloc)(size))
+#define myfree(size) ((im_extt->f_myfree)(size))
+#define myrealloc(block, newsize) ((im_extt->f_myrealloc)((block), (newsize)))
+
+#endif
+
+#define i_img_8_new(xsize, ysize, channels) ((im_extt->f_i_img_8_new)((xsize), (ysize), (channels)))
+#define i_img_16_new(xsize, ysize, channels) ((im_extt->f_i_img_16_new)((xsize), (ysize), (channels)))
+#define i_img_double_new(xsize, ysize, channels) ((im_extt->f_i_img_double_new)((xsize), (ysize), (channels)))
+#define i_img_pal_new(xsize, ysize, channels, maxpal) ((im_extt->f_i_img_pal_new)((xsize), (ysize), (channels), (maxpal)))
+
+#define i_img_destroy(im) ((im_extt->f_i_img_destroy)(im))
+#define i_sametype(im, xsize, ysize) ((im_extt->f_i_sametype)((im), (xsize), (ysize)))
+#define i_sametype_chans(im, xsize, ysize, channels) ((im_extt->f_i_sametype_chans)((im), (xsize), (ysize), (channels)))
+#define i_img_info(im, info) ((im_extt->f_i_img_info)((im), (info)))
+
+#ifndef IMAGER_DIRECT_IMAGE_CALLS
+#define IMAGER_DIRECT_IMAGE_CALLS 1
+#endif
+
+#if IMAGER_DIRECT_IMAGE_CALLS
+#define i_ppix(im, x, y, val) (((im)->i_f_ppix)((im), (x), (y), (val)))
+#define i_gpix(im, x, y, val) (((im)->i_f_gpix)((im), (x), (y), (val)))
+#define i_ppixf(im, x, y, val) (((im)->i_f_ppixf)((im), (x), (y), (val)))
+#define i_gpixf(im, x, y, val) (((im)->i_f_gpixf)((im), (x), (y), (val)))
+#define i_plin(im, l, r, y, val) (((im)->i_f_plin)(im, l, r, y, val))
+#define i_glin(im, l, r, y, val) (((im)->i_f_glin)(im, l, r, y, val))
+#define i_plinf(im, l, r, y, val) (((im)->i_f_plinf)(im, l, r, y, val))
+#define i_glinf(im, l, r, y, val) (((im)->i_f_glinf)(im, l, r, y, val))
+
+#define i_gsamp(im, l, r, y, samps, chans, count) \
+ (((im)->i_f_gsamp)((im), (l), (r), (y), (samps), (chans), (count)))
+#define i_gsampf(im, l, r, y, samps, chans, count) \
+ (((im)->i_f_gsampf)((im), (l), (r), (y), (samps), (chans), (count)))
+
+#define i_findcolor(im, color, entry) \
+ (((im)->i_f_findcolor) ? ((im)->i_f_findcolor)((im), (color), (entry)) : 0)
+
+#define i_gpal(im, l, r, y, vals) \
+ (((im)->i_f_gpal) ? ((im)->i_f_gpal)((im), (l), (r), (y), (vals)) : 0)
+#define i_ppal(im, l, r, y, vals) \
+ (((im)->i_f_ppal) ? ((im)->i_f_ppal)((im), (l), (r), (y), (vals)) : 0)
+#define i_addcolors(im, colors, count) \
+ (((im)->i_f_addcolors) ? ((im)->i_f_addcolors)((im), (colors), (count)) : -1)
+#define i_getcolors(im, index, color, count) \
+ (((im)->i_f_getcolors) ? \
+ ((im)->i_f_getcolors)((im), (index), (color), (count)) : 0)
+#define i_setcolors(im, index, color, count) \
+ (((im)->i_f_setcolors) ? \
+ ((im)->i_f_setcolors)((im), (index), (color), (count)) : 0)
+#define i_colorcount(im) \
+ (((im)->i_f_colorcount) ? ((im)->i_f_colorcount)(im) : -1)
+#define i_maxcolors(im) \
+ (((im)->i_f_maxcolors) ? ((im)->i_f_maxcolors)(im) : -1)
+#define i_findcolor(im, color, entry) \
+ (((im)->i_f_findcolor) ? ((im)->i_f_findcolor)((im), (color), (entry)) : 0)
+#else
+#define i_ppix(im, x, y, val) ((im_extt->f_i_ppix)((im), (x), (y), (val)))
+#define i_gpix(im, x, y, val) ((im_extt->f_i_gpix)((im), (x), (y), (val)))
+#define i_ppixf(im, x, y, val) ((im_extt->f_i_ppixf)((im), (x), (y), (val)))
+#define i_gpixf(im, x, y, val) ((im_extt->f_i_gpixf)((im), (x), (y), (val)))
+#define i_plin(im, l, r, y, val) ((im_extt->f_i_plin)((im), (l), (r), (y), (val)))
+#define i_glin(im, l, r, y, val) ((im_extt->f_i_glin)((im), (l), (r), (y), (val)))
+#define i_plinf(im, l, r, y, val) ((im_extt->f_i_plinf)((im), (l), (r), (y), (val)))
+#define i_glinf(im, l, r, y, val) ((im_extt->f_i_glinf)((im), (l), (r), (y), (val)))
+#define i_gsamp(im, l, r, y, samps, chans, count) \
+ ((im_extt->f_i_gsamp)((im), (l), (r), (y), (samps), (chans), (count)))
+#define i_gsampf(im, l, r, y, samps, chans, count) \
+ ((im_extt->f_i_gsampf)((im), (l), (r), (y), (samps), (chans), (count)))
+
+#endif
+
+#define i_new_fill_solid(c, combine) ((im_extt->f_i_new_fill_solid)((c), (combine)))
+#define i_new_fill_solidf(c, combine) ((im_extt->f_i_new_fill_solidf)((c), (combine)))
+#define i_new_fill_hatch(fg, bg, combine, hatch, cust_hatch, dx, dy) \
+ ((im_extt->f_i_new_fill_hatch)((fg), (bg), (combine), (hatch), (cust_hatch), (dx), (dy)))
+#define i_new_fill_hatchf(fg, bg, combine, hatch, cust_hatch, dx, dy) \
+ ((im_extt->f_i_new_fill_hatchf)((fg), (bg), (combine), (hatch), (cust_hatch), (dx), (dy)))
+#define i_new_fill_image(im, matrix, xoff, yoff, combine) \
+ ((im_extt->f_i_new_fill_image)((im), (matrix), (xoff), (yoff), (combine)))
+#define i_new_fill_fount(xa, ya, xb, yb, type, repeat, combine, super_sample, ssample_param, count, segs) \
+ ((im_extt->f_i_new_fill_fount)((xa), (ya), (xb), (yb), (type), (repeat), (combine), (super_sample), (ssample_param), (count), (segs)))
+#define i_fill_destroy(fill) ((im_extt->f_i_fill_destroy)(fill))
+
+#define i_quant_makemap(quant, imgs, count) \
+ ((im_extt->f_i_quant_makemap)((quant), (imgs), (count)))
+#define i_quant_translate(quant, img) \
+ ((im_extt->f_i_quant_translate)((quant), (img)))
+#define i_quant_transparent(quant, indices, img, trans_index) \
+ ((im_extt->f_i_quant_transparent)((quant), (indices), (img), (trans_index)))
+
+#define i_clear_error() ((im_extt->f_i_clear_error)())
+#define i_push_error(code, msg) ((im_extt->f_i_push_error)((code), (msg)))
+#define i_push_errorf (im_extt->f_i_push_errorf)
+#define i_push_errorvf(code, fmt, list) \
+ ((im_extt->f_i_push_errorvf)((code), (fmt), (list)))
+
+#define i_tags_new(tags) ((im_extt->f_i_tags_new)(tags))
+#define i_tags_set(tags, name, data, size) \
+ ((im_extt->f_i_tags_set)((tags), (name), (data), (size)))
+#define i_tags_setn(tags, name, idata) \
+ ((im_extt->f_i_tags_setn)((tags), (name), (idata)))
+#define i_tags_destroy(tags) ((im_extt->f_i_tags_destroy)(tags))
+#define i_tags_find(tags, name, start, entry) \
+ ((im_extt->f_i_tags_find)((tags), (name), (start), (entry)))
+#define i_tags_findn(tags, code, start, entry) \
+ ((im_extt->f_i_tags_findn)((tags), (code), (start), (entry)))
+#define i_tags_delete(tags, entry) \
+ ((im_extt->f_i_tags_delete)((tags), (entry)))
+#define i_tags_delbyname(tags, name) \
+ ((im_extt->f_i_tags_delbyname)((tags), (name)))
+#define i_tags_delbycode(tags, code) \
+ ((im_extt->f_i_tags_delbycode)((tags), (code)))
+#define i_tags_get_float(tags, name, code, value) \
+ ((im_extt->f_i_tags_get_float)((tags), (name), (code), (value)))
+#define i_tags_set_float(tags, name, code, value) \
+ ((im_extt->f_i_tags_set_float)((tags), (name), (code), (value)))
+#define i_tags_set_float2(tags, name, code, value, places) \
+ ((im_extt->f_i_tags_set_float2)((tags), (name), (code), (value), (places)))
+#define i_tags_get_int(tags, name, code, value) \
+ ((im_extt->f_i_tags_get_int)((tags), (name), (code), (value)))
+#define i_tags_get_string(tags, name, code, value, value_size) \
+ ((im_extt->f_i_tags_get_string)((tags), (name), (code), (value), (value_size)))
+#define i_tags_get_color(tags, name, code, value) \
+ ((im_extt->f_i_tags_get_color)((tags), (name), (code), (value)))
+#define i_tags_set_color(tags, name, code, value) \
+ ((im_extt->f_i_tags_set_color)((tags), (name), (code), (value)))
+
+#define i_box(im, x1, y1, x2, y2, val) ((im_extt->f_i_box)((im), (x1), (y1), (x2), (y2), (val)))
+#define i_box_filled(im, x1, y1, x2, y2, val) ((im_extt->f_i_box_filled)((im), (x1), (y1), (x2), (y2), (val)))
+#define i_box_cfill(im, x1, y1, x2, y2, fill) ((im_extt->f_i_box_cfill)((im), (x1), (y1), (x2), (y2), (fill)))
+#define i_line(im, x1, y1, x2, y2, val, endp) ((im_extt->f_i_line)((im), (x1), (y1), (x2), (y2), (val), (endp)))
+#define i_line_aa(im, x1, y1, x2, y2, val, endp) ((im_extt->f_i_line_aa)((im), (x1), (y1), (x2), (y2), (val), (endp)))
+#define i_arc(im, x, y, rad, d1, d2, val) ((im_extt->f_i_arc)((im), (x), (y), (rad), (d1), (d2), (val)))
+#define i_arc_aa(im, x, y, rad, d1, d2, val) ((im_extt->f_i_arc_aa)((im), (x), (y), (rad), (d1), (d2), (val)))
+#define i_arc_cfill(im, x, y, rad, d1, d2, fill) ((im_extt->f_i_arc_cfill)((im), (x), (y), (rad), (d1), (d2), (fill)))
+#define i_arc_aa_cfill(im, x, y, rad, d1, d2, fill) ((im_extt->f_i_arc_aa_cfill)((im), (x), (y), (rad), (d1), (d2), (fill)))
+#define i_circle_aa(im, x, y, rad, val) ((im_extt->f_i_circle_aa)((im), (x), (y), (rad), (val)))
+#define i_flood_fill(im, seedx, seedy, dcol) ((im_extt->f_i_flood_fill)((im), (seedx), (seedy), (dcol)))
+#define i_flood_cfill(im, seedx, seedy, fill) ((im_extt->f_i_flood_cfill)((im), (seedx), (seedy), (fill)))
+#define i_flood_fill_border(im, seedx, seedy, dcol, border) ((im_extt->f_i_flood_fill_border)((im), (seedx), (seedy), (dcol), (border)))
+#define i_flood_cfill_border(im, seedx, seedy, fill, border) ((im_extt->f_i_flood_cfill_border)((im), (seedx), (seedy), (fill), (border)))
+
+#define i_copyto(im, src, x1, y1, x2, y2, tx, ty) \
+ ((im_extt->f_i_copyto)((im), (src), (x1), (y1), (x2), (y2), (tx), (ty)))
+#define i_copyto_trans(im, src, x1, y1, x2, y2, tx, ty, trans) \
+ ((im_extt->f_i_copyto_trans)((im), (src), (x1), (y1), (x2), (y2), (tx), (ty), (trans)))
+#define i_copy(im) ((im_extt->f_i_copy)(im))
+#define i_rubthru(im, src, tx, ty, src_minx, src_miny, src_maxx, src_maxy) \
+ ((im_extt->f_i_rubthru)((im), (src), (tx), (ty), (src_minx), (src_miny), (src_maxx), (src_maxy)))
+
+#define i_set_image_file_limits(max_width, max_height, max_bytes) \
+ ((im_extt->f_i_set_image_file_limits)((max_width), (max_height), (max_bytes)))
+#define i_get_image_file_limits(max_width, max_height, max_bytes) \
+ ((im_extt->f_i_get_image_file_limits)((pmax_width), (pmax_height), (pmax_bytes)))
+#define i_int_check_image_file_limits(width, height, channels, sample_size) \
+ ((im_extt->f_i_int_check_image_file_limits)((width), (height), (channels), (sample_size)))
+
+#define i_img_setmask(img, mask) ((im_extt->f_i_img_setmask)((img), (mask)))
+#define i_img_getmask(img) ((im_extt->f_i_img_getmask)(img))
+#define i_img_getchannels(img) ((im_extt->f_i_img_getchannels)(img))
+#define i_img_get_width(img) ((im_extt->f_i_img_get_width)(img))
+#define i_img_get_height(img) ((im_extt->f_i_img_get_height)(img))
+#define i_lhead(file, line) ((im_extt->f_i_lhead)((file), (line)))
+#define i_loog (im_extt->f_i_loog)
+
+#define i_img_alloc() ((im_extt->f_i_img_alloc)())
+#define i_img_init(img) ((im_extt->f_i_img_init)(img))
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/imextdef.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/imextdef.h
new file mode 100755
index 00000000000..d1c5f50b76b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/imextdef.h
@@ -0,0 +1,11 @@
+#ifndef IMAGER_IMEXTDEF_H
+#define IMAGER_IMEXTDEF_H
+
+#include "imexttypes.h"
+
+extern im_ext_funcs imager_function_table;
+
+#define PERL_SET_GLOBAL_CALLBACKS \
+ sv_setiv(get_sv(PERL_FUNCTION_TABLE_NAME, 1), PTR2IV(&imager_function_table));
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/imexttypes.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/imexttypes.h
new file mode 100755
index 00000000000..fc3dcf7ac5e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/imexttypes.h
@@ -0,0 +1,163 @@
+#ifndef IMAGER_IMEXTTYPES_H_
+#define IMAGER_IMEXTTYPES_H_
+
+/* keep this file simple - apidocs.perl parses it. */
+
+#include "imdatatypes.h"
+
+/*
+ IMAGER_API_VERSION is similar to the version number in the third and
+ fourth bytes of TIFF files - if it ever changes then the API has changed
+ too much for any application to remain compatible.
+*/
+#define IMAGER_API_VERSION 1
+
+/*
+ IMAGER_API_LEVEL is the level of the structure. New function pointers
+ will always remain at the end (unless IMAGER_API_VERSION changes), and
+ will result in an increment of IMAGER_API_LEVEL.
+*/
+
+#define IMAGER_API_LEVEL 4
+
+typedef struct {
+ int version;
+ int level;
+
+ /* IMAGER_API_LEVEL 1 functions */
+ void * (*f_mymalloc)(int size);
+ void (*f_myfree)(void *block);
+ void * (*f_myrealloc)(void *block, size_t newsize);
+ void* (*f_mymalloc_file_line)(size_t size, char* file, int line);
+ void (*f_myfree_file_line)(void *p, char*file, int line);
+ void* (*f_myrealloc_file_line)(void *p, size_t newsize, char* file,int line);
+
+ i_img *(*f_i_img_8_new)(int xsize, int ysize, int channels);
+ i_img *(*f_i_img_16_new)(int xsize, int ysize, int channels);
+ i_img *(*f_i_img_double_new)(int xsize, int ysize, int channels);
+ i_img *(*f_i_img_pal_new)(int xsize, int ysize, int channels, int maxpal);
+ void (*f_i_img_destroy)(i_img *im);
+ i_img *(*f_i_sametype)(i_img *im, int xsize, int ysize);
+ i_img *(*f_i_sametype_chans)(i_img *im, int xsize, int ysize, int channels);
+ void (*f_i_img_info)(i_img *im, int *info);
+
+ int (*f_i_ppix)(i_img *im, int x, int y, const i_color *val);
+ int (*f_i_gpix)(i_img *im, int x, int y, i_color *val);
+ int (*f_i_ppixf)(i_img *im, int x, int y, const i_fcolor *val);
+ int (*f_i_gpixf)(i_img *im, int x, int y, i_fcolor *val);
+ int (*f_i_plin)(i_img *im, int l, int r, int y, const i_color *vals);
+ int (*f_i_glin)(i_img *im, int l, int r, int y, i_color *vals);
+ int (*f_i_plinf)(i_img *im, int l, int r, int y, const i_fcolor *vals);
+ int (*f_i_glinf)(i_img *im, int l, int r, int y, i_fcolor *vals);
+ int (*f_i_gsamp)(i_img *im, int l, int r, int y, i_sample_t *samp,
+ const int *chans, int chan_count);
+ int (*f_i_gsampf)(i_img *im, int l, int r, int y, i_fsample_t *samp,
+ const int *chans, int chan_count);
+ int (*f_i_gpal)(i_img *im, int x, int r, int y, i_palidx *vals);
+ int (*f_i_ppal)(i_img *im, int x, int r, int y, const i_palidx *vals);
+ int (*f_i_addcolors)(i_img *im, const i_color *colors, int count);
+ int (*f_i_getcolors)(i_img *im, int i, i_color *, int count);
+ int (*f_i_colorcount)(i_img *im);
+ int (*f_i_maxcolors)(i_img *im);
+ int (*f_i_findcolor)(i_img *im, const i_color *color, i_palidx *entry);
+ int (*f_i_setcolors)(i_img *im, int index, const i_color *colors,
+ int count);
+
+ i_fill_t *(*f_i_new_fill_solid)(const i_color *c, int combine);
+ i_fill_t *(*f_i_new_fill_solidf)(const i_fcolor *c, int combine);
+
+ i_fill_t *(*f_i_new_fill_hatch)(const i_color *fg, const i_color *bg, int combine,
+ int hatch, const unsigned char *cust_hatch,
+ int dx, int dy);
+ i_fill_t *(*f_i_new_fill_hatchf)(const i_fcolor *fg, const i_fcolor *bg, int combine,
+ int hatch, const unsigned char *cust_hatch,
+ int dx, int dy);
+ i_fill_t *(*f_i_new_fill_image)(i_img *im, const double *matrix, int xoff,
+ int yoff, int combine);
+ i_fill_t *(*f_i_new_fill_fount)(double xa, double ya, double xb, double yb,
+ i_fountain_type type, i_fountain_repeat repeat,
+ int combine, int super_sample, double ssample_param,
+ int count, i_fountain_seg *segs);
+
+ void (*f_i_fill_destroy)(i_fill_t *fill);
+
+ void (*f_i_quant_makemap)(i_quantize *quant, i_img **imgs, int count);
+ i_palidx * (*f_i_quant_translate)(i_quantize *quant, i_img *img);
+ void (*f_i_quant_transparent)(i_quantize *quant, i_palidx *indices,
+ i_img *img, i_palidx trans_index);
+
+ void (*f_i_clear_error)(void);
+ void (*f_i_push_error)(int code, char const *msg);
+ void (*f_i_push_errorf)(int code, char const *fmt, ...);
+ void (*f_i_push_errorvf)(int code, char const *fmt, va_list);
+
+ void (*f_i_tags_new)(i_img_tags *tags);
+ int (*f_i_tags_set)(i_img_tags *tags, char const *name, char const *data,
+ int size);
+ int (*f_i_tags_setn)(i_img_tags *tags, char const *name, int idata);
+ void (*f_i_tags_destroy)(i_img_tags *tags);
+ int (*f_i_tags_find)(i_img_tags *tags, char const *name, int start,
+ int *entry);
+ int (*f_i_tags_findn)(i_img_tags *tags, int code, int start, int *entry);
+ int (*f_i_tags_delete)(i_img_tags *tags, int entry);
+ int (*f_i_tags_delbyname)(i_img_tags *tags, char const *name);
+ int (*f_i_tags_delbycode)(i_img_tags *tags, int code);
+ int (*f_i_tags_get_float)(i_img_tags *tags, char const *name, int code,
+ double *value);
+ int (*f_i_tags_set_float)(i_img_tags *tags, char const *name, int code,
+ double value);
+ int (*f_i_tags_set_float2)(i_img_tags *tags, char const *name, int code,
+ double value, int places);
+ int (*f_i_tags_get_int)(i_img_tags *tags, char const *name, int code,
+ int *value);
+ int (*f_i_tags_get_string)(i_img_tags *tags, char const *name, int code,
+ char *value, size_t value_size);
+ int (*f_i_tags_get_color)(i_img_tags *tags, char const *name, int code,
+ i_color *value);
+ int (*f_i_tags_set_color)(i_img_tags *tags, char const *name, int code,
+ i_color const *value);
+
+ void (*f_i_box)(i_img *im, int x1, int y1, int x2, int y2, const i_color *val);
+ void (*f_i_box_filled)(i_img *im, int x1, int y1, int x2, int y2, const i_color *val);
+ void (*f_i_box_cfill)(i_img *im, int x1, int y1, int x2, int y2, i_fill_t *fill);
+ void (*f_i_line)(i_img *im, int x1, int y1, int x2, int y2, const i_color *val, int endp);
+ void (*f_i_line_aa)(i_img *im, int x1, int y1, int x2, int y2, const i_color *val, int endp);
+ void (*f_i_arc)(i_img *im, int x, int y, float rad, float d1, float d2, const i_color *val);
+ void (*f_i_arc_aa)(i_img *im, double x, double y, double rad, double d1, double d2, const i_color *val);
+ void (*f_i_arc_cfill)(i_img *im, int x, int y, float rad, float d1, float d2, i_fill_t *val);
+ void (*f_i_arc_aa_cfill)(i_img *im, double x, double y, double rad, double d1, double d2, i_fill_t *fill);
+ void (*f_i_circle_aa)(i_img *im, float x, float y, float rad, const i_color *val);
+ int (*f_i_flood_fill)(i_img *im, int seedx, int seedy, const i_color *dcol);
+ int (*f_i_flood_cfill)(i_img *im, int seedx, int seedy, i_fill_t *fill);
+
+ void (*f_i_copyto)(i_img *im, i_img *src, int x1, int y1, int x2, int y2, int tx, int ty);
+ void (*f_i_copyto_trans)(i_img *im, i_img *src, int x1, int y1, int x2, int y2, int tx, int ty, const i_color *trans);
+ i_img *(*f_i_copy)(i_img *im);
+ int (*f_i_rubthru)(i_img *im, i_img *src, int tx, int ty, int src_minx, int src_miny, int src_maxx, int src_maxy);
+
+ /* IMAGER_API_LEVEL 2 functions */
+ int (*f_i_set_image_file_limits)(int width, int height, int bytes);
+ int (*f_i_get_image_file_limits)(int *width, int *height, int *bytes);
+ int (*f_i_int_check_image_file_limits)(int width, int height, int channels, int sample_size);
+ int (*f_i_flood_fill_border)(i_img *im, int seedx, int seedy, const i_color *dcol, const i_color *border);
+ int (*f_i_flood_cfill_border)(i_img *im, int seedx, int seedy, i_fill_t *fill, const i_color *border);
+
+ /* IMAGER_API_LEVEL 3 functions */
+ void (*f_i_img_setmask)(i_img *im, int ch_mask);
+ int (*f_i_img_getmask)(i_img *im);
+ int (*f_i_img_getchannels)(i_img *im);
+ i_img_dim (*f_i_img_get_width)(i_img *im);
+ i_img_dim (*f_i_img_get_height)(i_img *im);
+ void (*f_i_lhead)(const char *file, int line_number);
+ void (*f_i_loog)(int level, const char *msg, ...);
+
+ /* IMAGER_API_LEVEL 4 functions will be added here */
+ i_img *(*f_i_img_alloc)(void);
+ void (*f_i_img_init)(i_img *);
+
+ /* IMAGER_API_LEVEL 5 functions will be added here */
+} im_ext_funcs;
+
+#define PERL_FUNCTION_TABLE_NAME "Imager::__ext_func_table"
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/imio.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/imio.h
new file mode 100755
index 00000000000..d78e4732702
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/imio.h
@@ -0,0 +1,34 @@
+#ifndef IMAGER_IMIO_H_
+#define IMAGER_IMIO_H_
+#include <stdio.h>
+#include <sys/stat.h>
+
+#include "imconfig.h"
+#include "log.h"
+
+typedef struct i_mempool {
+ void **p;
+ unsigned int alloc;
+ unsigned int used;
+} i_mempool;
+
+void i_mempool_init(i_mempool *mp);
+void i_mempool_extend(i_mempool *mp);
+void *i_mempool_alloc(i_mempool *mp, size_t size);
+void i_mempool_destroy(i_mempool *mp);
+
+
+
+#ifdef _MSC_VER
+#undef min
+#undef max
+#endif
+
+extern unsigned long i_utf8_advance(char const **p, int *len);
+
+/* XXX Shouldn't these go away? */
+
+int i_min(int a,int b);
+int i_max(int x,int y);
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/immacros.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/immacros.h
new file mode 100755
index 00000000000..9d5757445bf
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/immacros.h
@@ -0,0 +1,33 @@
+/*
+ Imager "functions" implemented as macros
+
+ I suppose these could go in imdatatypes, but they aren't types.
+*/
+#ifndef IMAGER_IMMACROS_H_
+#define IMAGER_IMMACROS_H_
+
+/*
+=item i_img_has_alpha(im)
+
+=category Image Information
+
+Return true if the image has an alpha channel.
+
+=cut
+*/
+
+#define i_img_has_alpha(im) ((im)->channels == 2 || (im)->channels == 4)
+
+/*
+=item i_img_color_channels(im)
+
+=category Image Information
+
+The number of channels holding color information.
+
+=cut
+*/
+
+#define i_img_color_channels(im) (i_img_has_alpha(im) ? (im)->channels - 1 : (im)->channels)
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/imperl.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/imperl.h
new file mode 100755
index 00000000000..fad1d66cc54
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/imperl.h
@@ -0,0 +1,35 @@
+/*
+ This header file defines types that Imager's typemap uses to convert to
+ perl types.
+
+ This is meant for use in XS code, not in normal C source.
+ */
+#ifndef IMAGER_IMPERL_H
+#define IMAGER_IMPERL_H
+
+#include "imdatatypes.h"
+
+typedef i_color* Imager__Color;
+typedef i_fcolor* Imager__Color__Float;
+typedef i_img* Imager__ImgRaw;
+typedef int undef_neg_int;
+typedef i_img * Imager;
+
+#ifdef HAVE_LIBTT
+typedef TT_Fonthandle* Imager__Font__TT;
+#endif
+
+#ifdef HAVE_FT2
+typedef FT2_Fonthandle* Imager__Font__FT2;
+#endif
+
+/* for the fill objects
+ Since a fill object may later have dependent images, (or fills!)
+ we need perl wrappers - oh well
+*/
+#define IFILL_DESTROY(fill) i_fill_destroy(fill);
+typedef i_fill_t* Imager__FillHandle;
+
+typedef io_glue *Imager__IO;
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/imrender.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/imrender.h
new file mode 100755
index 00000000000..9ded02232eb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/imrender.h
@@ -0,0 +1,23 @@
+#ifndef IMAGER_IMRENDER_H
+#define IMAGER_IMRENDER_H
+
+#include "rendert.h"
+
+extern void
+i_render_init(i_render *r, i_img *im, int width);
+extern void
+i_render_done(i_render *r);
+extern void
+i_render_color(i_render *r, int x, int y, int width, unsigned char const *src,
+ i_color const *color);
+extern void
+i_render_fill(i_render *r, int x, int y, int width, unsigned char const *src,
+ i_fill_t *fill);
+extern void
+i_render_line(i_render *r, int x, int y, int width, const i_sample_t *src,
+ i_color *line, i_fill_combine_f combine);
+extern void
+i_render_linef(i_render *r, int x, int y, int width, const double *src,
+ i_fcolor *line, i_fill_combinef_f combine);
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/iolayer.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/iolayer.h
new file mode 100755
index 00000000000..ec164c0f3f4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/iolayer.h
@@ -0,0 +1,34 @@
+#ifndef _IOLAYER_H_
+#define _IOLAYER_H_
+
+
+/* How the IO layer works:
+ *
+ * Start by getting an io_glue object. Then define its
+ * datasource via io_obj_setp_buffer or io_obj_setp_cb. Before
+ * using the io_glue object be sure to call io_glue_commit_types().
+ * After that data can be read via the io_glue->readcb() method.
+ *
+ */
+
+
+#include "iolayert.h"
+
+/* #define BBSIZ 1096 */
+#define BBSIZ 16384
+#define IO_FAKE_SEEK 1<<0L
+#define IO_TEMP_SEEK 1<<1L
+
+
+void io_glue_commit_types(io_glue *ig);
+void io_glue_gettypes (io_glue *ig, int reqmeth);
+
+/* XS functions */
+io_glue *io_new_fd(int fd);
+io_glue *io_new_bufchain(void);
+io_glue *io_new_buffer(char *data, size_t len, i_io_closebufp_t closecb, void *closedata);
+io_glue *io_new_cb(void *p, i_io_readl_t readcb, i_io_writel_t writecb, i_io_seekl_t seekcb, i_io_closel_t closecb, i_io_destroyl_t destroycb);
+size_t io_slurp(io_glue *ig, unsigned char **c);
+void io_glue_destroy(io_glue *ig);
+
+#endif /* _IOLAYER_H_ */
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/iolayert.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/iolayert.h
new file mode 100755
index 00000000000..9857d67b0eb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/iolayert.h
@@ -0,0 +1,99 @@
+#ifndef IMAGER_IOLAYERT_H
+#define IMAGER_IOLAYERT_H
+
+#ifndef _MSC_VER
+#include <unistd.h>
+#endif
+#include <sys/types.h>
+#include <stddef.h>
+
+typedef enum { FDSEEK, FDNOSEEK, BUFFER, CBSEEK, CBNOSEEK, BUFCHAIN } io_type;
+
+#ifdef _MSC_VER
+typedef int ssize_t;
+#endif
+
+typedef struct i_io_glue_t i_io_glue_t;
+
+/* compatibility for now */
+typedef i_io_glue_t io_glue;
+
+/* Callbacks we give out */
+
+typedef ssize_t(*i_io_readp_t) (io_glue *ig, void *buf, size_t count);
+typedef ssize_t(*i_io_writep_t)(io_glue *ig, const void *buf, size_t count);
+typedef off_t (*i_io_seekp_t) (io_glue *ig, off_t offset, int whence);
+typedef int (*i_io_closep_t)(io_glue *ig);
+typedef ssize_t(*i_io_sizep_t) (io_glue *ig);
+
+typedef void (*i_io_closebufp_t)(void *p);
+typedef void (*i_io_destroyp_t)(i_io_glue_t *ig);
+
+
+/* Callbacks we get */
+
+typedef ssize_t(*i_io_readl_t) (void *p, void *buf, size_t count);
+typedef ssize_t(*i_io_writel_t)(void *p, const void *buf, size_t count);
+typedef off_t (*i_io_seekl_t) (void *p, off_t offset, int whence);
+typedef int (*i_io_closel_t)(void *p);
+typedef void (*i_io_destroyl_t)(void *p);
+typedef ssize_t(*i_io_sizel_t) (void *p);
+
+extern char *io_type_names[];
+
+
+
+/* Structures to describe data sources */
+
+typedef struct {
+ io_type type;
+ int fd;
+} io_fdseek;
+
+typedef struct {
+ io_type type; /* Must be first parameter */
+ char *name; /* Data source name */
+ char *data;
+ size_t len;
+ i_io_closebufp_t closecb; /* free memory mapped segment or decrement refcount */
+ void *closedata;
+} io_buffer;
+
+typedef struct {
+ io_type type; /* Must be first parameter */
+ char *name; /* Data source name */
+ void *p; /* Callback data */
+ i_io_readl_t readcb;
+ i_io_writel_t writecb;
+ i_io_seekl_t seekcb;
+ i_io_closel_t closecb;
+ i_io_destroyl_t destroycb;
+} io_cb;
+
+typedef union {
+ io_type type;
+ io_fdseek fdseek;
+ io_buffer buffer;
+ io_cb cb;
+} io_obj;
+
+struct i_io_glue_t {
+ io_obj source;
+ int flags; /* Flags */
+ void *exdata; /* Pair specific data */
+ i_io_readp_t readcb;
+ i_io_writep_t writecb;
+ i_io_seekp_t seekcb;
+ i_io_closep_t closecb;
+ i_io_sizep_t sizecb;
+ i_io_destroyp_t destroycb;
+};
+
+#define i_io_type(ig) ((ig)->source.ig_type)
+#define i_io_read(ig, buf, size) ((ig)->readcb((ig), (buf), (size)))
+#define i_io_write(ig, data, size) ((ig)->writecb((ig), (data), (size)))
+#define i_io_seek(ig, offset, whence) ((ig)->seekcb((ig), (offset), (whence)))
+#define i_io_close(ig) ((ig)->closecb(ig))
+
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/log.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/log.h
new file mode 100755
index 00000000000..5b1f483957b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/log.h
@@ -0,0 +1,38 @@
+#ifndef _LOG_H_
+#define _LOG_H_
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <time.h>
+/*
+ input: name of file to log too
+ input: onoff, 0 means no logging
+ global: creates a global variable FILE* lg_file
+*/
+
+void i_lhead ( const char *file, int line );
+void i_init_log( const char *name, int onoff );
+void i_loog(int level,const char *msg, ... );
+void i_fatal ( int exitcode,const char *fmt, ... );
+
+/*
+=item mm_log((level, format, ...))
+=category Logging
+
+This is the main entry point to logging. Note that the extra set of
+parentheses are required due to limitations in C89 macros.
+
+This will format a string with the current file and line number to the
+log file if logging is enabled.
+
+=cut
+*/
+
+#ifdef IMAGER_LOG
+#define mm_log(x) { i_lhead(__FILE__,__LINE__); i_loog x; }
+#else
+#define mm_log(x)
+#endif
+
+
+#endif /* _LOG_H_ */
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/plug.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/plug.h
new file mode 100755
index 00000000000..e3583fca2cc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/plug.h
@@ -0,0 +1,42 @@
+#include "imager.h"
+
+/* structures for passing data between Imager-plugin and the Imager-module */
+
+#include "ext.h"
+
+
+#define getINT(k,s) (util_table->getint(INP,k,s))
+#define getDOUBLE(k,s) (util_table->getdouble(INP,k,s))
+#define getVOID(k,s) (util_table->getvoid(INP,k,(void**)s))
+#define getSTR(k,s) (util_table->getstr(INP,k,(char**)s))
+#define getOBJ(k,t,s) (util_table->getobj(INP,k,t,(void**)s))
+
+#define i_color_set(cl,r,g,b,a) (symbol_table->i_color_set(cl,r,g,b,a))
+#define i_color_info(cl) (symbol_table->i_color_info(cl))
+
+#define i_img_new() (symbol_table->i_img_new())
+#define i_img_empty(im,x,y) ((symbol_table->i_img_empty(im,x,y))
+#define i_img_empty_ch(im,x,y,ch) ((symbol_table->i_img_empty_ch(im,x,y,ch))
+#define i_img_exorcise(im) (symbol_table->i_img_exorcise(im))
+#define i_img_info(im,info) (symbol_table->i_img_info(im,info))
+
+#define i_img_setmask(im,ch_mask) (symbol_table->i_img_setmask(im,ch_mask))
+#define i_img_getmask(im) (symbol_table->i_img_getmask(im))
+
+/*
+Not needed? The i_gpix() macro in image.h will call the right function
+directly.
+#define i_ppix(im,x,y,val) (symbol_table->i_ppix(im,x,y,val))
+#define i_gpix(im,x,y,val) (symbol_table->i_gpix(im,x,y,val))
+*/
+
+#define i_box(im, x1, y1, x2, y2,val) (symbol_table->i_box(im, x1, y1, x2, y2,val))
+#define i_draw(im, x1, y1, x2, y2,val) (symbol_table->i_draw(im, x1, y1, x2, y2,val))
+#define i_arc(im, x, y, rad, d1, d2,val) (symbol_table->i_arc(im, x, y, rad, d1, d2,val))
+#define i_copyto(im,src, x1, y1, x2, y2, tx, ty,trans) (symbol_table->i_copyto(im,src, x1, y1, x2, y2, tx, ty,trans))
+#define i_rubthru(im,src, tx, ty) (symbol_table->i_rubthru(im,src, tx, ty))
+
+#ifdef WIN32
+extern char __declspec(dllexport) evalstr[];
+extern func_ptr __declspec(dllexport) function_list[];
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/ppport.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/ppport.h
new file mode 100755
index 00000000000..437df5c1b9b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/ppport.h
@@ -0,0 +1,4954 @@
+#if 0
+<<'SKIP';
+#endif
+/*
+----------------------------------------------------------------------
+
+ ppport.h -- Perl/Pollution/Portability Version 3.06_01
+
+ Automatically created by Devel::PPPort running under
+ perl 5.008008 on Tue Jul 4 22:01:23 2006.
+
+ Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
+ includes in parts/inc/ instead.
+
+ Use 'perldoc ppport.h' to view the documentation below.
+
+----------------------------------------------------------------------
+
+SKIP
+
+=pod
+
+=head1 NAME
+
+ppport.h - Perl/Pollution/Portability version 3.06_01
+
+=head1 SYNOPSIS
+
+ perl ppport.h [options] [source files]
+
+ Searches current directory for files if no [source files] are given
+
+ --help show short help
+
+ --patch=file write one patch file with changes
+ --copy=suffix write changed copies with suffix
+ --diff=program use diff program and options
+
+ --compat-version=version provide compatibility with Perl version
+ --cplusplus accept C++ comments
+
+ --quiet don't output anything except fatal errors
+ --nodiag don't show diagnostics
+ --nohints don't show hints
+ --nochanges don't suggest changes
+ --nofilter don't filter input files
+
+ --list-provided list provided API
+ --list-unsupported list unsupported API
+ --api-info=name show Perl API portability information
+
+=head1 COMPATIBILITY
+
+This version of F<ppport.h> is designed to support operation with Perl
+installations back to 5.003, and has been tested up to 5.9.3.
+
+=head1 OPTIONS
+
+=head2 --help
+
+Display a brief usage summary.
+
+=head2 --patch=I<file>
+
+If this option is given, a single patch file will be created if
+any changes are suggested. This requires a working diff program
+to be installed on your system.
+
+=head2 --copy=I<suffix>
+
+If this option is given, a copy of each file will be saved with
+the given suffix that contains the suggested changes. This does
+not require any external programs.
+
+If neither C<--patch> or C<--copy> are given, the default is to
+simply print the diffs for each file. This requires either
+C<Text::Diff> or a C<diff> program to be installed.
+
+=head2 --diff=I<program>
+
+Manually set the diff program and options to use. The default
+is to use C<Text::Diff>, when installed, and output unified
+context diffs.
+
+=head2 --compat-version=I<version>
+
+Tell F<ppport.h> to check for compatibility with the given
+Perl version. The default is to check for compatibility with Perl
+version 5.003. You can use this option to reduce the output
+of F<ppport.h> if you intend to be backward compatible only
+up to a certain Perl version.
+
+=head2 --cplusplus
+
+Usually, F<ppport.h> will detect C++ style comments and
+replace them with C style comments for portability reasons.
+Using this option instructs F<ppport.h> to leave C++
+comments untouched.
+
+=head2 --quiet
+
+Be quiet. Don't print anything except fatal errors.
+
+=head2 --nodiag
+
+Don't output any diagnostic messages. Only portability
+alerts will be printed.
+
+=head2 --nohints
+
+Don't output any hints. Hints often contain useful portability
+notes.
+
+=head2 --nochanges
+
+Don't suggest any changes. Only give diagnostic output and hints
+unless these are also deactivated.
+
+=head2 --nofilter
+
+Don't filter the list of input files. By default, files not looking
+like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
+
+=head2 --list-provided
+
+Lists the API elements for which compatibility is provided by
+F<ppport.h>. Also lists if it must be explicitly requested,
+if it has dependencies, and if there are hints for it.
+
+=head2 --list-unsupported
+
+Lists the API elements that are known not to be supported by
+F<ppport.h> and below which version of Perl they probably
+won't be available or work.
+
+=head2 --api-info=I<name>
+
+Show portability information for API elements matching I<name>.
+If I<name> is surrounded by slashes, it is interpreted as a regular
+expression.
+
+=head1 DESCRIPTION
+
+In order for a Perl extension (XS) module to be as portable as possible
+across differing versions of Perl itself, certain steps need to be taken.
+
+=over 4
+
+=item *
+
+Including this header is the first major one. This alone will give you
+access to a large part of the Perl API that hasn't been available in
+earlier Perl releases. Use
+
+ perl ppport.h --list-provided
+
+to see which API elements are provided by ppport.h.
+
+=item *
+
+You should avoid using deprecated parts of the API. For example, using
+global Perl variables without the C<PL_> prefix is deprecated. Also,
+some API functions used to have a C<perl_> prefix. Using this form is
+also deprecated. You can safely use the supported API, as F<ppport.h>
+will provide wrappers for older Perl versions.
+
+=item *
+
+If you use one of a few functions that were not present in earlier
+versions of Perl, and that can't be provided using a macro, you have
+to explicitly request support for these functions by adding one or
+more C<#define>s in your source code before the inclusion of F<ppport.h>.
+
+These functions will be marked C<explicit> in the list shown by
+C<--list-provided>.
+
+Depending on whether you module has a single or multiple files that
+use such functions, you want either C<static> or global variants.
+
+For a C<static> function, use:
+
+ #define NEED_function
+
+For a global function, use:
+
+ #define NEED_function_GLOBAL
+
+Note that you mustn't have more than one global request for one
+function in your project.
+
+ Function Static Request Global Request
+ -----------------------------------------------------------------------------------------
+ eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL
+ grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL
+ grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL
+ grok_number() NEED_grok_number NEED_grok_number_GLOBAL
+ grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL
+ grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL
+ newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL
+ newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL
+ sv_2pv_nolen() NEED_sv_2pv_nolen NEED_sv_2pv_nolen_GLOBAL
+ sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL
+ sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL
+ sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL
+ sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL
+ sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL
+ vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL
+
+To avoid namespace conflicts, you can change the namespace of the
+explicitly exported functions using the C<DPPP_NAMESPACE> macro.
+Just C<#define> the macro before including C<ppport.h>:
+
+ #define DPPP_NAMESPACE MyOwnNamespace_
+ #include "ppport.h"
+
+The default namespace is C<DPPP_>.
+
+=back
+
+The good thing is that most of the above can be checked by running
+F<ppport.h> on your source code. See the next section for
+details.
+
+=head1 EXAMPLES
+
+To verify whether F<ppport.h> is needed for your module, whether you
+should make any changes to your code, and whether any special defines
+should be used, F<ppport.h> can be run as a Perl script to check your
+source code. Simply say:
+
+ perl ppport.h
+
+The result will usually be a list of patches suggesting changes
+that should at least be acceptable, if not necessarily the most
+efficient solution, or a fix for all possible problems.
+
+If you know that your XS module uses features only available in
+newer Perl releases, if you're aware that it uses C++ comments,
+and if you want all suggestions as a single patch file, you could
+use something like this:
+
+ perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
+
+If you only want your code to be scanned without any suggestions
+for changes, use:
+
+ perl ppport.h --nochanges
+
+You can specify a different C<diff> program or options, using
+the C<--diff> option:
+
+ perl ppport.h --diff='diff -C 10'
+
+This would output context diffs with 10 lines of context.
+
+To display portability information for the C<newSVpvn> function,
+use:
+
+ perl ppport.h --api-info=newSVpvn
+
+Since the argument to C<--api-info> can be a regular expression,
+you can use
+
+ perl ppport.h --api-info=/_nomg$/
+
+to display portability information for all C<_nomg> functions or
+
+ perl ppport.h --api-info=/./
+
+to display information for all known API elements.
+
+=head1 BUGS
+
+If this version of F<ppport.h> is causing failure during
+the compilation of this module, please check if newer versions
+of either this module or C<Devel::PPPort> are available on CPAN
+before sending a bug report.
+
+If F<ppport.h> was generated using the latest version of
+C<Devel::PPPort> and is causing failure of this module, please
+file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>.
+
+Please include the following information:
+
+=over 4
+
+=item 1.
+
+The complete output from running "perl -V"
+
+=item 2.
+
+This file.
+
+=item 3.
+
+The name and version of the module you were trying to build.
+
+=item 4.
+
+A full log of the build that failed.
+
+=item 5.
+
+Any other information that you think could be relevant.
+
+=back
+
+For the latest version of this code, please get the C<Devel::PPPort>
+module from CPAN.
+
+=head1 COPYRIGHT
+
+Version 3.x, Copyright (c) 2004-2005, Marcus Holland-Moritz.
+
+Version 2.x, Copyright (C) 2001, Paul Marquess.
+
+Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<Devel::PPPort>.
+
+=cut
+
+use strict;
+
+my %opt = (
+ quiet => 0,
+ diag => 1,
+ hints => 1,
+ changes => 1,
+ cplusplus => 0,
+ filter => 1,
+);
+
+my($ppport) = $0 =~ /([\w.]+)$/;
+my $LF = '(?:\r\n|[\r\n])'; # line feed
+my $HS = "[ \t]"; # horizontal whitespace
+
+eval {
+ require Getopt::Long;
+ Getopt::Long::GetOptions(\%opt, qw(
+ help quiet diag! filter! hints! changes! cplusplus
+ patch=s copy=s diff=s compat-version=s
+ list-provided list-unsupported api-info=s
+ )) or usage();
+};
+
+if ($@ and grep /^-/, @ARGV) {
+ usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
+ die "Getopt::Long not found. Please don't use any options.\n";
+}
+
+usage() if $opt{help};
+
+if (exists $opt{'compat-version'}) {
+ my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
+ if ($@) {
+ die "Invalid version number format: '$opt{'compat-version'}'\n";
+ }
+ die "Only Perl 5 is supported\n" if $r != 5;
+ die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
+ $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
+}
+else {
+ $opt{'compat-version'} = 5;
+}
+
+# Never use C comments in this file!!!!!
+my $ccs = '/'.'*';
+my $cce = '*'.'/';
+my $rccs = quotemeta $ccs;
+my $rcce = quotemeta $cce;
+
+my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
+ ? ( $1 => {
+ ($2 ? ( base => $2 ) : ()),
+ ($3 ? ( todo => $3 ) : ()),
+ (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()),
+ (index($4, 'p') >= 0 ? ( provided => 1 ) : ()),
+ (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()),
+ } )
+ : die "invalid spec: $_" } qw(
+AvFILLp|5.004050||p
+AvFILL|||
+CLASS|||n
+CX_CURPAD_SAVE|||
+CX_CURPAD_SV|||
+CopFILEAV|5.006000||p
+CopFILEGV_set|5.006000||p
+CopFILEGV|5.006000||p
+CopFILESV|5.006000||p
+CopFILE_set|5.006000||p
+CopFILE|5.006000||p
+CopSTASHPV_set|5.006000||p
+CopSTASHPV|5.006000||p
+CopSTASH_eq|5.006000||p
+CopSTASH_set|5.006000||p
+CopSTASH|5.006000||p
+CopyD|5.009002||p
+Copy|||
+CvPADLIST|||
+CvSTASH|||
+CvWEAKOUTSIDE|||
+DEFSV|5.004050||p
+END_EXTERN_C|5.005000||p
+ENTER|||
+ERRSV|5.004050||p
+EXTEND|||
+EXTERN_C|5.005000||p
+FREETMPS|||
+GIMME_V||5.004000|n
+GIMME|||n
+GROK_NUMERIC_RADIX|5.007002||p
+G_ARRAY|||
+G_DISCARD|||
+G_EVAL|||
+G_NOARGS|||
+G_SCALAR|||
+G_VOID||5.004000|
+GetVars|||
+GvSV|||
+Gv_AMupdate|||
+HEf_SVKEY||5.004000|
+HeHASH||5.004000|
+HeKEY||5.004000|
+HeKLEN||5.004000|
+HePV||5.004000|
+HeSVKEY_force||5.004000|
+HeSVKEY_set||5.004000|
+HeSVKEY||5.004000|
+HeVAL||5.004000|
+HvNAME|||
+INT2PTR|5.006000||p
+IN_LOCALE_COMPILETIME|5.007002||p
+IN_LOCALE_RUNTIME|5.007002||p
+IN_LOCALE|5.007002||p
+IN_PERL_COMPILETIME|5.008001||p
+IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p
+IS_NUMBER_INFINITY|5.007002||p
+IS_NUMBER_IN_UV|5.007002||p
+IS_NUMBER_NAN|5.007003||p
+IS_NUMBER_NEG|5.007002||p
+IS_NUMBER_NOT_INT|5.007002||p
+IVSIZE|5.006000||p
+IVTYPE|5.006000||p
+IVdf|5.006000||p
+LEAVE|||
+LVRET|||
+MARK|||
+MY_CXT_CLONE|5.009002||p
+MY_CXT_INIT|5.007003||p
+MY_CXT|5.007003||p
+MoveD|5.009002||p
+Move|||
+NEWSV|||
+NOOP|5.005000||p
+NUM2PTR|5.006000||p
+NVTYPE|5.006000||p
+NVef|5.006001||p
+NVff|5.006001||p
+NVgf|5.006001||p
+Newc|||
+Newz|||
+New|||
+Nullav|||
+Nullch|||
+Nullcv|||
+Nullhv|||
+Nullsv|||
+ORIGMARK|||
+PAD_BASE_SV|||
+PAD_CLONE_VARS|||
+PAD_COMPNAME_FLAGS|||
+PAD_COMPNAME_GEN_set|||
+PAD_COMPNAME_GEN|||
+PAD_COMPNAME_OURSTASH|||
+PAD_COMPNAME_PV|||
+PAD_COMPNAME_TYPE|||
+PAD_RESTORE_LOCAL|||
+PAD_SAVE_LOCAL|||
+PAD_SAVE_SETNULLPAD|||
+PAD_SETSV|||
+PAD_SET_CUR_NOSAVE|||
+PAD_SET_CUR|||
+PAD_SVl|||
+PAD_SV|||
+PERL_BCDVERSION|5.009003||p
+PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p
+PERL_INT_MAX|5.004000||p
+PERL_INT_MIN|5.004000||p
+PERL_LONG_MAX|5.004000||p
+PERL_LONG_MIN|5.004000||p
+PERL_MAGIC_arylen|5.007002||p
+PERL_MAGIC_backref|5.007002||p
+PERL_MAGIC_bm|5.007002||p
+PERL_MAGIC_collxfrm|5.007002||p
+PERL_MAGIC_dbfile|5.007002||p
+PERL_MAGIC_dbline|5.007002||p
+PERL_MAGIC_defelem|5.007002||p
+PERL_MAGIC_envelem|5.007002||p
+PERL_MAGIC_env|5.007002||p
+PERL_MAGIC_ext|5.007002||p
+PERL_MAGIC_fm|5.007002||p
+PERL_MAGIC_glob|5.007002||p
+PERL_MAGIC_isaelem|5.007002||p
+PERL_MAGIC_isa|5.007002||p
+PERL_MAGIC_mutex|5.007002||p
+PERL_MAGIC_nkeys|5.007002||p
+PERL_MAGIC_overload_elem|5.007002||p
+PERL_MAGIC_overload_table|5.007002||p
+PERL_MAGIC_overload|5.007002||p
+PERL_MAGIC_pos|5.007002||p
+PERL_MAGIC_qr|5.007002||p
+PERL_MAGIC_regdata|5.007002||p
+PERL_MAGIC_regdatum|5.007002||p
+PERL_MAGIC_regex_global|5.007002||p
+PERL_MAGIC_shared_scalar|5.007003||p
+PERL_MAGIC_shared|5.007003||p
+PERL_MAGIC_sigelem|5.007002||p
+PERL_MAGIC_sig|5.007002||p
+PERL_MAGIC_substr|5.007002||p
+PERL_MAGIC_sv|5.007002||p
+PERL_MAGIC_taint|5.007002||p
+PERL_MAGIC_tiedelem|5.007002||p
+PERL_MAGIC_tiedscalar|5.007002||p
+PERL_MAGIC_tied|5.007002||p
+PERL_MAGIC_utf8|5.008001||p
+PERL_MAGIC_uvar_elem|5.007003||p
+PERL_MAGIC_uvar|5.007002||p
+PERL_MAGIC_vec|5.007002||p
+PERL_MAGIC_vstring|5.008001||p
+PERL_QUAD_MAX|5.004000||p
+PERL_QUAD_MIN|5.004000||p
+PERL_REVISION|5.006000||p
+PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p
+PERL_SCAN_DISALLOW_PREFIX|5.007003||p
+PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p
+PERL_SCAN_SILENT_ILLDIGIT|5.008001||p
+PERL_SHORT_MAX|5.004000||p
+PERL_SHORT_MIN|5.004000||p
+PERL_SUBVERSION|5.006000||p
+PERL_UCHAR_MAX|5.004000||p
+PERL_UCHAR_MIN|5.004000||p
+PERL_UINT_MAX|5.004000||p
+PERL_UINT_MIN|5.004000||p
+PERL_ULONG_MAX|5.004000||p
+PERL_ULONG_MIN|5.004000||p
+PERL_UNUSED_DECL|5.007002||p
+PERL_UQUAD_MAX|5.004000||p
+PERL_UQUAD_MIN|5.004000||p
+PERL_USHORT_MAX|5.004000||p
+PERL_USHORT_MIN|5.004000||p
+PERL_VERSION|5.006000||p
+PL_DBsingle|||pn
+PL_DBsub|||pn
+PL_DBtrace|||n
+PL_Sv|5.005000||p
+PL_compiling|5.004050||p
+PL_copline|5.005000||p
+PL_curcop|5.004050||p
+PL_curstash|5.004050||p
+PL_debstash|5.004050||p
+PL_defgv|5.004050||p
+PL_diehook|5.004050||p
+PL_dirty|5.004050||p
+PL_dowarn|||pn
+PL_errgv|5.004050||p
+PL_hexdigit|5.005000||p
+PL_hints|5.005000||p
+PL_last_in_gv|||n
+PL_modglobal||5.005000|n
+PL_na|5.004050||pn
+PL_no_modify|5.006000||p
+PL_ofs_sv|||n
+PL_perl_destruct_level|5.004050||p
+PL_perldb|5.004050||p
+PL_ppaddr|5.006000||p
+PL_rsfp_filters|5.004050||p
+PL_rsfp|5.004050||p
+PL_rs|||n
+PL_stack_base|5.004050||p
+PL_stack_sp|5.004050||p
+PL_stdingv|5.004050||p
+PL_sv_arenaroot|5.004050||p
+PL_sv_no|5.004050||pn
+PL_sv_undef|5.004050||pn
+PL_sv_yes|5.004050||pn
+PL_tainted|5.004050||p
+PL_tainting|5.004050||p
+POPi|||n
+POPl|||n
+POPn|||n
+POPpbytex||5.007001|n
+POPpx||5.005030|n
+POPp|||n
+POPs|||n
+PTR2IV|5.006000||p
+PTR2NV|5.006000||p
+PTR2UV|5.006000||p
+PTR2ul|5.007001||p
+PTRV|5.006000||p
+PUSHMARK|||
+PUSHi|||
+PUSHmortal|5.009002||p
+PUSHn|||
+PUSHp|||
+PUSHs|||
+PUSHu|5.004000||p
+PUTBACK|||
+PerlIO_clearerr||5.007003|
+PerlIO_close||5.007003|
+PerlIO_eof||5.007003|
+PerlIO_error||5.007003|
+PerlIO_fileno||5.007003|
+PerlIO_fill||5.007003|
+PerlIO_flush||5.007003|
+PerlIO_get_base||5.007003|
+PerlIO_get_bufsiz||5.007003|
+PerlIO_get_cnt||5.007003|
+PerlIO_get_ptr||5.007003|
+PerlIO_read||5.007003|
+PerlIO_seek||5.007003|
+PerlIO_set_cnt||5.007003|
+PerlIO_set_ptrcnt||5.007003|
+PerlIO_setlinebuf||5.007003|
+PerlIO_stderr||5.007003|
+PerlIO_stdin||5.007003|
+PerlIO_stdout||5.007003|
+PerlIO_tell||5.007003|
+PerlIO_unread||5.007003|
+PerlIO_write||5.007003|
+Poison|5.008000||p
+RETVAL|||n
+Renewc|||
+Renew|||
+SAVECLEARSV|||
+SAVECOMPPAD|||
+SAVEPADSV|||
+SAVETMPS|||
+SAVE_DEFSV|5.004050||p
+SPAGAIN|||
+SP|||
+START_EXTERN_C|5.005000||p
+START_MY_CXT|5.007003||p
+STMT_END|||p
+STMT_START|||p
+ST|||
+SVt_IV|||
+SVt_NV|||
+SVt_PVAV|||
+SVt_PVCV|||
+SVt_PVHV|||
+SVt_PVMG|||
+SVt_PV|||
+Safefree|||
+Slab_Alloc|||
+Slab_Free|||
+StructCopy|||
+SvCUR_set|||
+SvCUR|||
+SvEND|||
+SvGETMAGIC|5.004050||p
+SvGROW|||
+SvIOK_UV||5.006000|
+SvIOK_notUV||5.006000|
+SvIOK_off|||
+SvIOK_only_UV||5.006000|
+SvIOK_only|||
+SvIOK_on|||
+SvIOKp|||
+SvIOK|||
+SvIVX|||
+SvIV_nomg|5.009001||p
+SvIV_set|||
+SvIVx|||
+SvIV|||
+SvIsCOW_shared_hash||5.008003|
+SvIsCOW||5.008003|
+SvLEN_set|||
+SvLEN|||
+SvLOCK||5.007003|
+SvMAGIC_set||5.009003|
+SvNIOK_off|||
+SvNIOKp|||
+SvNIOK|||
+SvNOK_off|||
+SvNOK_only|||
+SvNOK_on|||
+SvNOKp|||
+SvNOK|||
+SvNVX|||
+SvNV_set|||
+SvNVx|||
+SvNV|||
+SvOK|||
+SvOOK|||
+SvPOK_off|||
+SvPOK_only_UTF8||5.006000|
+SvPOK_only|||
+SvPOK_on|||
+SvPOKp|||
+SvPOK|||
+SvPVX|||
+SvPV_force_nomg|5.007002||p
+SvPV_force|||
+SvPV_nolen|5.006000||p
+SvPV_nomg|5.007002||p
+SvPV_set|||
+SvPVbyte_force||5.009002|
+SvPVbyte_nolen||5.006000|
+SvPVbytex_force||5.006000|
+SvPVbytex||5.006000|
+SvPVbyte|5.006000||p
+SvPVutf8_force||5.006000|
+SvPVutf8_nolen||5.006000|
+SvPVutf8x_force||5.006000|
+SvPVutf8x||5.006000|
+SvPVutf8||5.006000|
+SvPVx|||
+SvPV|||
+SvREFCNT_dec|||
+SvREFCNT_inc|||
+SvREFCNT|||
+SvROK_off|||
+SvROK_on|||
+SvROK|||
+SvRV_set||5.009003|
+SvRV|||
+SvSETMAGIC|||
+SvSHARE||5.007003|
+SvSTASH_set||5.009003|
+SvSTASH|||
+SvSetMagicSV_nosteal||5.004000|
+SvSetMagicSV||5.004000|
+SvSetSV_nosteal||5.004000|
+SvSetSV|||
+SvTAINTED_off||5.004000|
+SvTAINTED_on||5.004000|
+SvTAINTED||5.004000|
+SvTAINT|||
+SvTRUE|||
+SvTYPE|||
+SvUNLOCK||5.007003|
+SvUOK||5.007001|
+SvUPGRADE|||
+SvUTF8_off||5.006000|
+SvUTF8_on||5.006000|
+SvUTF8||5.006000|
+SvUVXx|5.004000||p
+SvUVX|5.004000||p
+SvUV_nomg|5.009001||p
+SvUV_set||5.009003|
+SvUVx|5.004000||p
+SvUV|5.004000||p
+SvVOK||5.008001|
+THIS|||n
+UNDERBAR|5.009002||p
+UVSIZE|5.006000||p
+UVTYPE|5.006000||p
+UVXf|5.007001||p
+UVof|5.006000||p
+UVuf|5.006000||p
+UVxf|5.006000||p
+XCPT_CATCH|5.009002||p
+XCPT_RETHROW|5.009002||p
+XCPT_TRY_END|5.009002||p
+XCPT_TRY_START|5.009002||p
+XPUSHi|||
+XPUSHmortal|5.009002||p
+XPUSHn|||
+XPUSHp|||
+XPUSHs|||
+XPUSHu|5.004000||p
+XSRETURN_EMPTY|||
+XSRETURN_IV|||
+XSRETURN_NO|||
+XSRETURN_NV|||
+XSRETURN_PV|||
+XSRETURN_UNDEF|||
+XSRETURN_UV|5.008001||p
+XSRETURN_YES|||
+XSRETURN|||
+XST_mIV|||
+XST_mNO|||
+XST_mNV|||
+XST_mPV|||
+XST_mUNDEF|||
+XST_mUV|5.008001||p
+XST_mYES|||
+XS_VERSION_BOOTCHECK|||
+XS_VERSION|||
+XS|||
+ZeroD|5.009002||p
+Zero|||
+_aMY_CXT|5.007003||p
+_pMY_CXT|5.007003||p
+aMY_CXT_|5.007003||p
+aMY_CXT|5.007003||p
+aTHX_|5.006000||p
+aTHX|5.006000||p
+add_data|||
+allocmy|||
+amagic_call|||
+any_dup|||
+ao|||
+append_elem|||
+append_list|||
+apply_attrs_my|||
+apply_attrs_string||5.006001|
+apply_attrs|||
+apply|||
+asIV|||
+asUV|||
+atfork_lock||5.007003|n
+atfork_unlock||5.007003|n
+av_arylen_p||5.009003|
+av_clear|||
+av_delete||5.006000|
+av_exists||5.006000|
+av_extend|||
+av_fake|||
+av_fetch|||
+av_fill|||
+av_len|||
+av_make|||
+av_pop|||
+av_push|||
+av_reify|||
+av_shift|||
+av_store|||
+av_undef|||
+av_unshift|||
+ax|||n
+bad_type|||
+bind_match|||
+block_end|||
+block_gimme||5.004000|
+block_start|||
+boolSV|5.004000||p
+boot_core_PerlIO|||
+boot_core_UNIVERSAL|||
+boot_core_xsutils|||
+bytes_from_utf8||5.007001|
+bytes_to_utf8||5.006001|
+cache_re|||
+call_argv|5.006000||p
+call_atexit||5.006000|
+call_body|||
+call_list_body|||
+call_list||5.004000|
+call_method|5.006000||p
+call_pv|5.006000||p
+call_sv|5.006000||p
+calloc||5.007002|n
+cando|||
+cast_i32||5.006000|
+cast_iv||5.006000|
+cast_ulong||5.006000|
+cast_uv||5.006000|
+check_uni|||
+checkcomma|||
+checkposixcc|||
+ck_anoncode|||
+ck_bitop|||
+ck_concat|||
+ck_defined|||
+ck_delete|||
+ck_die|||
+ck_eof|||
+ck_eval|||
+ck_exec|||
+ck_exists|||
+ck_exit|||
+ck_ftst|||
+ck_fun|||
+ck_glob|||
+ck_grep|||
+ck_index|||
+ck_join|||
+ck_lengthconst|||
+ck_lfun|||
+ck_listiob|||
+ck_match|||
+ck_method|||
+ck_null|||
+ck_open|||
+ck_repeat|||
+ck_require|||
+ck_retarget|||
+ck_return|||
+ck_rfun|||
+ck_rvconst|||
+ck_sassign|||
+ck_select|||
+ck_shift|||
+ck_sort|||
+ck_spair|||
+ck_split|||
+ck_subr|||
+ck_substr|||
+ck_svconst|||
+ck_trunc|||
+ck_unpack|||
+cl_and|||
+cl_anything|||
+cl_init_zero|||
+cl_init|||
+cl_is_anything|||
+cl_or|||
+closest_cop|||
+convert|||
+cop_free|||
+cr_textfilter|||
+croak_nocontext|||vn
+croak|||v
+csighandler||5.007001|n
+custom_op_desc||5.007003|
+custom_op_name||5.007003|
+cv_ckproto|||
+cv_clone|||
+cv_const_sv||5.004000|
+cv_dump|||
+cv_undef|||
+cx_dump||5.005000|
+cx_dup|||
+cxinc|||
+dAXMARK||5.009003|
+dAX|5.007002||p
+dITEMS|5.007002||p
+dMARK|||
+dMY_CXT_SV|5.007003||p
+dMY_CXT|5.007003||p
+dNOOP|5.006000||p
+dORIGMARK|||
+dSP|||
+dTHR|5.004050||p
+dTHXa|5.006000||p
+dTHXoa|5.006000||p
+dTHX|5.006000||p
+dUNDERBAR|5.009002||p
+dXCPT|5.009002||p
+dXSARGS|||
+dXSI32|||
+dXSTARG|5.006000||p
+deb_curcv|||
+deb_nocontext|||vn
+deb_stack_all|||
+deb_stack_n|||
+debop||5.005000|
+debprofdump||5.005000|
+debprof|||
+debstackptrs||5.007003|
+debstack||5.007003|
+deb||5.007003|v
+del_he|||
+del_sv|||
+delimcpy||5.004000|
+depcom|||
+deprecate_old|||
+deprecate|||
+despatch_signals||5.007001|
+die_nocontext|||vn
+die_where|||
+die|||v
+dirp_dup|||
+div128|||
+djSP|||
+do_aexec5|||
+do_aexec|||
+do_aspawn|||
+do_binmode||5.004050|
+do_chomp|||
+do_chop|||
+do_close|||
+do_dump_pad|||
+do_eof|||
+do_exec3|||
+do_execfree|||
+do_exec|||
+do_gv_dump||5.006000|
+do_gvgv_dump||5.006000|
+do_hv_dump||5.006000|
+do_ipcctl|||
+do_ipcget|||
+do_join|||
+do_kv|||
+do_magic_dump||5.006000|
+do_msgrcv|||
+do_msgsnd|||
+do_oddball|||
+do_op_dump||5.006000|
+do_open9||5.006000|
+do_openn||5.007001|
+do_open||5.004000|
+do_pipe|||
+do_pmop_dump||5.006000|
+do_print|||
+do_readline|||
+do_seek|||
+do_semop|||
+do_shmio|||
+do_spawn_nowait|||
+do_spawn|||
+do_sprintf|||
+do_sv_dump||5.006000|
+do_sysseek|||
+do_tell|||
+do_trans_complex_utf8|||
+do_trans_complex|||
+do_trans_count_utf8|||
+do_trans_count|||
+do_trans_simple_utf8|||
+do_trans_simple|||
+do_trans|||
+do_vecget|||
+do_vecset|||
+do_vop|||
+docatch_body|||
+docatch|||
+doeval|||
+dofile|||
+dofindlabel|||
+doform|||
+doing_taint||5.008001|n
+dooneliner|||
+doopen_pm|||
+doparseform|||
+dopoptoeval|||
+dopoptolabel|||
+dopoptoloop|||
+dopoptosub_at|||
+dopoptosub|||
+dounwind|||
+dowantarray|||
+dump_all||5.006000|
+dump_eval||5.006000|
+dump_fds|||
+dump_form||5.006000|
+dump_indent||5.006000|v
+dump_mstats|||
+dump_packsubs||5.006000|
+dump_sub||5.006000|
+dump_vindent||5.006000|
+dumpuntil|||
+dup_attrlist|||
+emulate_eaccess|||
+eval_pv|5.006000||p
+eval_sv|5.006000||p
+expect_number|||
+fbm_compile||5.005000|
+fbm_instr||5.005000|
+fd_on_nosuid_fs|||
+filter_add|||
+filter_del|||
+filter_gets|||
+filter_read|||
+find_beginning|||
+find_byclass|||
+find_in_my_stash|||
+find_runcv|||
+find_rundefsvoffset||5.009002|
+find_script|||
+find_uninit_var|||
+fold_constants|||
+forbid_setid|||
+force_ident|||
+force_list|||
+force_next|||
+force_version|||
+force_word|||
+form_nocontext|||vn
+form||5.004000|v
+fp_dup|||
+fprintf_nocontext|||vn
+free_global_struct|||
+free_tied_hv_pool|||
+free_tmps|||
+gen_constant_list|||
+get_av|5.006000||p
+get_context||5.006000|n
+get_cv|5.006000||p
+get_db_sub|||
+get_debug_opts|||
+get_hash_seed|||
+get_hv|5.006000||p
+get_mstats|||
+get_no_modify|||
+get_num|||
+get_op_descs||5.005000|
+get_op_names||5.005000|
+get_opargs|||
+get_ppaddr||5.006000|
+get_sv|5.006000||p
+get_vtbl||5.005030|
+getcwd_sv||5.007002|
+getenv_len|||
+gp_dup|||
+gp_free|||
+gp_ref|||
+grok_bin|5.007003||p
+grok_hex|5.007003||p
+grok_number|5.007002||p
+grok_numeric_radix|5.007002||p
+grok_oct|5.007003||p
+group_end|||
+gv_AVadd|||
+gv_HVadd|||
+gv_IOadd|||
+gv_autoload4||5.004000|
+gv_check|||
+gv_dump||5.006000|
+gv_efullname3||5.004000|
+gv_efullname4||5.006001|
+gv_efullname|||
+gv_ename|||
+gv_fetchfile|||
+gv_fetchmeth_autoload||5.007003|
+gv_fetchmethod_autoload||5.004000|
+gv_fetchmethod|||
+gv_fetchmeth|||
+gv_fetchpvn_flags||5.009002|
+gv_fetchpv|||
+gv_fetchsv||5.009002|
+gv_fullname3||5.004000|
+gv_fullname4||5.006001|
+gv_fullname|||
+gv_handler||5.007001|
+gv_init_sv|||
+gv_init|||
+gv_share|||
+gv_stashpvn|5.006000||p
+gv_stashpv|||
+gv_stashsv|||
+he_dup|||
+hek_dup|||
+hfreeentries|||
+hsplit|||
+hv_assert||5.009001|
+hv_auxinit|||
+hv_clear_placeholders||5.009001|
+hv_clear|||
+hv_delayfree_ent||5.004000|
+hv_delete_common|||
+hv_delete_ent||5.004000|
+hv_delete|||
+hv_eiter_p||5.009003|
+hv_eiter_set||5.009003|
+hv_exists_ent||5.004000|
+hv_exists|||
+hv_fetch_common|||
+hv_fetch_ent||5.004000|
+hv_fetch|||
+hv_free_ent||5.004000|
+hv_iterinit|||
+hv_iterkeysv||5.004000|
+hv_iterkey|||
+hv_iternext_flags||5.008000|
+hv_iternextsv|||
+hv_iternext|||
+hv_iterval|||
+hv_ksplit||5.004000|
+hv_magic_check|||
+hv_magic|||
+hv_name_set||5.009003|
+hv_notallowed|||
+hv_placeholders_get||5.009003|
+hv_placeholders_p||5.009003|
+hv_placeholders_set||5.009003|
+hv_riter_p||5.009003|
+hv_riter_set||5.009003|
+hv_scalar||5.009001|
+hv_store_ent||5.004000|
+hv_store_flags||5.008000|
+hv_store|||
+hv_undef|||
+ibcmp_locale||5.004000|
+ibcmp_utf8||5.007003|
+ibcmp|||
+incl_perldb|||
+incline|||
+incpush|||
+ingroup|||
+init_argv_symbols|||
+init_debugger|||
+init_global_struct|||
+init_i18nl10n||5.006000|
+init_i18nl14n||5.006000|
+init_ids|||
+init_interp|||
+init_lexer|||
+init_main_stash|||
+init_perllib|||
+init_postdump_symbols|||
+init_predump_symbols|||
+init_stacks||5.005000|
+init_tm||5.007002|
+instr|||
+intro_my|||
+intuit_method|||
+intuit_more|||
+invert|||
+io_close|||
+isALNUM|||
+isALPHA|||
+isDIGIT|||
+isLOWER|||
+isSPACE|||
+isUPPER|||
+is_an_int|||
+is_gv_magical_sv|||
+is_gv_magical|||
+is_handle_constructor|||
+is_list_assignment|||
+is_lvalue_sub||5.007001|
+is_uni_alnum_lc||5.006000|
+is_uni_alnumc_lc||5.006000|
+is_uni_alnumc||5.006000|
+is_uni_alnum||5.006000|
+is_uni_alpha_lc||5.006000|
+is_uni_alpha||5.006000|
+is_uni_ascii_lc||5.006000|
+is_uni_ascii||5.006000|
+is_uni_cntrl_lc||5.006000|
+is_uni_cntrl||5.006000|
+is_uni_digit_lc||5.006000|
+is_uni_digit||5.006000|
+is_uni_graph_lc||5.006000|
+is_uni_graph||5.006000|
+is_uni_idfirst_lc||5.006000|
+is_uni_idfirst||5.006000|
+is_uni_lower_lc||5.006000|
+is_uni_lower||5.006000|
+is_uni_print_lc||5.006000|
+is_uni_print||5.006000|
+is_uni_punct_lc||5.006000|
+is_uni_punct||5.006000|
+is_uni_space_lc||5.006000|
+is_uni_space||5.006000|
+is_uni_upper_lc||5.006000|
+is_uni_upper||5.006000|
+is_uni_xdigit_lc||5.006000|
+is_uni_xdigit||5.006000|
+is_utf8_alnumc||5.006000|
+is_utf8_alnum||5.006000|
+is_utf8_alpha||5.006000|
+is_utf8_ascii||5.006000|
+is_utf8_char_slow|||
+is_utf8_char||5.006000|
+is_utf8_cntrl||5.006000|
+is_utf8_digit||5.006000|
+is_utf8_graph||5.006000|
+is_utf8_idcont||5.008000|
+is_utf8_idfirst||5.006000|
+is_utf8_lower||5.006000|
+is_utf8_mark||5.006000|
+is_utf8_print||5.006000|
+is_utf8_punct||5.006000|
+is_utf8_space||5.006000|
+is_utf8_string_loclen||5.009003|
+is_utf8_string_loc||5.008001|
+is_utf8_string||5.006001|
+is_utf8_upper||5.006000|
+is_utf8_xdigit||5.006000|
+isa_lookup|||
+items|||n
+ix|||n
+jmaybe|||
+keyword|||
+leave_scope|||
+lex_end|||
+lex_start|||
+linklist|||
+listkids|||
+list|||
+load_module_nocontext|||vn
+load_module||5.006000|v
+localize|||
+looks_like_number|||
+lop|||
+mPUSHi|5.009002||p
+mPUSHn|5.009002||p
+mPUSHp|5.009002||p
+mPUSHu|5.009002||p
+mXPUSHi|5.009002||p
+mXPUSHn|5.009002||p
+mXPUSHp|5.009002||p
+mXPUSHu|5.009002||p
+magic_clear_all_env|||
+magic_clearenv|||
+magic_clearpack|||
+magic_clearsig|||
+magic_dump||5.006000|
+magic_existspack|||
+magic_freearylen_p|||
+magic_freeovrld|||
+magic_freeregexp|||
+magic_getarylen|||
+magic_getdefelem|||
+magic_getglob|||
+magic_getnkeys|||
+magic_getpack|||
+magic_getpos|||
+magic_getsig|||
+magic_getsubstr|||
+magic_gettaint|||
+magic_getuvar|||
+magic_getvec|||
+magic_get|||
+magic_killbackrefs|||
+magic_len|||
+magic_methcall|||
+magic_methpack|||
+magic_nextpack|||
+magic_regdata_cnt|||
+magic_regdatum_get|||
+magic_regdatum_set|||
+magic_scalarpack|||
+magic_set_all_env|||
+magic_setamagic|||
+magic_setarylen|||
+magic_setbm|||
+magic_setcollxfrm|||
+magic_setdbline|||
+magic_setdefelem|||
+magic_setenv|||
+magic_setfm|||
+magic_setglob|||
+magic_setisa|||
+magic_setmglob|||
+magic_setnkeys|||
+magic_setpack|||
+magic_setpos|||
+magic_setregexp|||
+magic_setsig|||
+magic_setsubstr|||
+magic_settaint|||
+magic_setutf8|||
+magic_setuvar|||
+magic_setvec|||
+magic_set|||
+magic_sizepack|||
+magic_wipepack|||
+magicname|||
+make_trie|||
+malloced_size|||n
+malloc||5.007002|n
+markstack_grow|||
+measure_struct|||
+memEQ|5.004000||p
+memNE|5.004000||p
+mem_collxfrm|||
+mess_alloc|||
+mess_nocontext|||vn
+mess||5.006000|v
+method_common|||
+mfree||5.007002|n
+mg_clear|||
+mg_copy|||
+mg_dup|||
+mg_find|||
+mg_free|||
+mg_get|||
+mg_length||5.005000|
+mg_localize|||
+mg_magical|||
+mg_set|||
+mg_size||5.005000|
+mini_mktime||5.007002|
+missingterm|||
+mode_from_discipline|||
+modkids|||
+mod|||
+moreswitches|||
+mul128|||
+mulexp10|||n
+my_atof2||5.007002|
+my_atof||5.006000|
+my_attrs|||
+my_bcopy|||n
+my_betoh16|||n
+my_betoh32|||n
+my_betoh64|||n
+my_betohi|||n
+my_betohl|||n
+my_betohs|||n
+my_bzero|||n
+my_chsize|||
+my_exit_jump|||
+my_exit|||
+my_failure_exit||5.004000|
+my_fflush_all||5.006000|
+my_fork||5.007003|n
+my_htobe16|||n
+my_htobe32|||n
+my_htobe64|||n
+my_htobei|||n
+my_htobel|||n
+my_htobes|||n
+my_htole16|||n
+my_htole32|||n
+my_htole64|||n
+my_htolei|||n
+my_htolel|||n
+my_htoles|||n
+my_htonl|||
+my_kid|||
+my_letoh16|||n
+my_letoh32|||n
+my_letoh64|||n
+my_letohi|||n
+my_letohl|||n
+my_letohs|||n
+my_lstat|||
+my_memcmp||5.004000|n
+my_memset|||n
+my_ntohl|||
+my_pclose||5.004000|
+my_popen_list||5.007001|
+my_popen||5.004000|
+my_setenv|||
+my_socketpair||5.007003|n
+my_stat|||
+my_strftime||5.007002|
+my_swabn|||n
+my_swap|||
+my_unexec|||
+my|||
+newANONATTRSUB||5.006000|
+newANONHASH|||
+newANONLIST|||
+newANONSUB|||
+newASSIGNOP|||
+newATTRSUB||5.006000|
+newAVREF|||
+newAV|||
+newBINOP|||
+newCONDOP|||
+newCONSTSUB|5.006000||p
+newCVREF|||
+newDEFSVOP|||
+newFORM|||
+newFOROP|||
+newGVOP|||
+newGVREF|||
+newGVgen|||
+newHVREF|||
+newHVhv||5.005000|
+newHV|||
+newIO|||
+newLISTOP|||
+newLOGOP|||
+newLOOPEX|||
+newLOOPOP|||
+newMYSUB||5.006000|
+newNULLLIST|||
+newOP|||
+newPADOP||5.006000|
+newPMOP|||
+newPROG|||
+newPVOP|||
+newRANGE|||
+newRV_inc|5.004000||p
+newRV_noinc|5.006000||p
+newRV|||
+newSLICEOP|||
+newSTATEOP|||
+newSUB|||
+newSVOP|||
+newSVREF|||
+newSVhek||5.009003|
+newSViv|||
+newSVnv|||
+newSVpvf_nocontext|||vn
+newSVpvf||5.004000|v
+newSVpvn_share||5.007001|
+newSVpvn|5.006000||p
+newSVpv|||
+newSVrv|||
+newSVsv|||
+newSVuv|5.006000||p
+newSV|||
+newUNOP|||
+newWHILEOP||5.009003|
+newXSproto||5.006000|
+newXS||5.006000|
+new_collate||5.006000|
+new_constant|||
+new_ctype||5.006000|
+new_he|||
+new_logop|||
+new_numeric||5.006000|
+new_stackinfo||5.005000|
+new_version||5.009000|
+next_symbol|||
+nextargv|||
+nextchar|||
+ninstr|||
+no_bareword_allowed|||
+no_fh_allowed|||
+no_op|||
+not_a_number|||
+nothreadhook||5.008000|
+nuke_stacks|||
+num_overflow|||n
+oopsAV|||
+oopsCV|||
+oopsHV|||
+op_clear|||
+op_const_sv|||
+op_dump||5.006000|
+op_free|||
+op_null||5.007002|
+op_refcnt_lock||5.009002|
+op_refcnt_unlock||5.009002|
+open_script|||
+pMY_CXT_|5.007003||p
+pMY_CXT|5.007003||p
+pTHX_|5.006000||p
+pTHX|5.006000||p
+pack_cat||5.007003|
+pack_rec|||
+package|||
+packlist||5.008001|
+pad_add_anon|||
+pad_add_name|||
+pad_alloc|||
+pad_block_start|||
+pad_check_dup|||
+pad_compname_type|||
+pad_findlex|||
+pad_findmy|||
+pad_fixup_inner_anons|||
+pad_free|||
+pad_leavemy|||
+pad_new|||
+pad_push|||
+pad_reset|||
+pad_setsv|||
+pad_sv|||
+pad_swipe|||
+pad_tidy|||
+pad_undef|||
+parse_body|||
+parse_unicode_opts|||
+path_is_absolute|||
+peep|||
+pending_ident|||
+perl_alloc_using|||n
+perl_alloc|||n
+perl_clone_using|||n
+perl_clone|||n
+perl_construct|||n
+perl_destruct||5.007003|n
+perl_free|||n
+perl_parse||5.006000|n
+perl_run|||n
+pidgone|||
+pmflag|||
+pmop_dump||5.006000|
+pmruntime|||
+pmtrans|||
+pop_scope|||
+pregcomp|||
+pregexec|||
+pregfree|||
+prepend_elem|||
+printf_nocontext|||vn
+ptr_table_clear|||
+ptr_table_fetch|||
+ptr_table_free|||
+ptr_table_new|||
+ptr_table_split|||
+ptr_table_store|||
+push_scope|||
+put_byte|||
+pv_display||5.006000|
+pv_uni_display||5.007003|
+qerror|||
+re_croak2|||
+re_dup|||
+re_intuit_start||5.006000|
+re_intuit_string||5.006000|
+realloc||5.007002|n
+reentrant_free|||
+reentrant_init|||
+reentrant_retry|||vn
+reentrant_size|||
+refkids|||
+refto|||
+ref|||
+reg_node|||
+reganode|||
+regatom|||
+regbranch|||
+regclass_swash||5.007003|
+regclass|||
+regcp_set_to|||
+regcppop|||
+regcppush|||
+regcurly|||
+regdump||5.005000|
+regexec_flags||5.005000|
+reghop3|||
+reghopmaybe3|||
+reghopmaybe|||
+reghop|||
+reginclass|||
+reginitcolors||5.006000|
+reginsert|||
+regmatch|||
+regnext||5.005000|
+regoptail|||
+regpiece|||
+regpposixcc|||
+regprop|||
+regrepeat_hard|||
+regrepeat|||
+regtail|||
+regtry|||
+reguni|||
+regwhite|||
+reg|||
+repeatcpy|||
+report_evil_fh|||
+report_uninit|||
+require_errno|||
+require_pv||5.006000|
+rninstr|||
+rsignal_restore|||
+rsignal_save|||
+rsignal_state||5.004000|
+rsignal||5.004000|
+run_body|||
+runops_debug||5.005000|
+runops_standard||5.005000|
+rvpv_dup|||
+rxres_free|||
+rxres_restore|||
+rxres_save|||
+safesyscalloc||5.006000|n
+safesysfree||5.006000|n
+safesysmalloc||5.006000|n
+safesysrealloc||5.006000|n
+same_dirent|||
+save_I16||5.004000|
+save_I32|||
+save_I8||5.006000|
+save_aelem||5.004050|
+save_alloc||5.006000|
+save_aptr|||
+save_ary|||
+save_bool||5.008001|
+save_clearsv|||
+save_delete|||
+save_destructor_x||5.006000|
+save_destructor||5.006000|
+save_freeop|||
+save_freepv|||
+save_freesv|||
+save_generic_pvref||5.006001|
+save_generic_svref||5.005030|
+save_gp||5.004000|
+save_hash|||
+save_hek_flags|||
+save_helem||5.004050|
+save_hints||5.005000|
+save_hptr|||
+save_int|||
+save_item|||
+save_iv||5.005000|
+save_lines|||
+save_list|||
+save_long|||
+save_magic|||
+save_mortalizesv||5.007001|
+save_nogv|||
+save_op|||
+save_padsv||5.007001|
+save_pptr|||
+save_re_context||5.006000|
+save_scalar_at|||
+save_scalar|||
+save_set_svflags||5.009000|
+save_shared_pvref||5.007003|
+save_sptr|||
+save_svref|||
+save_threadsv||5.005000|
+save_vptr||5.006000|
+savepvn|||
+savepv|||
+savesharedpv||5.007003|
+savestack_grow_cnt||5.008001|
+savestack_grow|||
+savesvpv||5.009002|
+sawparens|||
+scalar_mod_type|||
+scalarboolean|||
+scalarkids|||
+scalarseq|||
+scalarvoid|||
+scalar|||
+scan_bin||5.006000|
+scan_commit|||
+scan_const|||
+scan_formline|||
+scan_heredoc|||
+scan_hex|||
+scan_ident|||
+scan_inputsymbol|||
+scan_num||5.007001|
+scan_oct|||
+scan_pat|||
+scan_str|||
+scan_subst|||
+scan_trans|||
+scan_version||5.009001|
+scan_vstring||5.008001|
+scan_word|||
+scope|||
+screaminstr||5.005000|
+seed|||
+set_context||5.006000|n
+set_csh|||
+set_numeric_local||5.006000|
+set_numeric_radix||5.006000|
+set_numeric_standard||5.006000|
+setdefout|||
+setenv_getix|||
+share_hek_flags|||
+share_hek|||
+si_dup|||
+sighandler|||n
+simplify_sort|||
+skipspace|||
+sortsv||5.007003|
+ss_dup|||
+stack_grow|||
+start_glob|||
+start_subparse||5.004000|
+stashpv_hvname_match||5.009003|
+stdize_locale|||
+strEQ|||
+strGE|||
+strGT|||
+strLE|||
+strLT|||
+strNE|||
+str_to_version||5.006000|
+strnEQ|||
+strnNE|||
+study_chunk|||
+sub_crush_depth|||
+sublex_done|||
+sublex_push|||
+sublex_start|||
+sv_2bool|||
+sv_2cv|||
+sv_2io|||
+sv_2iuv_non_preserve|||
+sv_2iv_flags||5.009001|
+sv_2iv|||
+sv_2mortal|||
+sv_2nv|||
+sv_2pv_flags||5.007002|
+sv_2pv_nolen|5.006000||p
+sv_2pvbyte_nolen|||
+sv_2pvbyte|5.006000||p
+sv_2pvutf8_nolen||5.006000|
+sv_2pvutf8||5.006000|
+sv_2pv|||
+sv_2uv_flags||5.009001|
+sv_2uv|5.004000||p
+sv_add_arena|||
+sv_add_backref|||
+sv_backoff|||
+sv_bless|||
+sv_cat_decode||5.008001|
+sv_catpv_mg|5.006000||p
+sv_catpvf_mg_nocontext|||pvn
+sv_catpvf_mg|5.006000|5.004000|pv
+sv_catpvf_nocontext|||vn
+sv_catpvf||5.004000|v
+sv_catpvn_flags||5.007002|
+sv_catpvn_mg|5.006000||p
+sv_catpvn_nomg|5.007002||p
+sv_catpvn|||
+sv_catpv|||
+sv_catsv_flags||5.007002|
+sv_catsv_mg|5.006000||p
+sv_catsv_nomg|5.007002||p
+sv_catsv|||
+sv_chop|||
+sv_clean_all|||
+sv_clean_objs|||
+sv_clear|||
+sv_cmp_locale||5.004000|
+sv_cmp|||
+sv_collxfrm|||
+sv_compile_2op||5.008001|
+sv_copypv||5.007003|
+sv_dec|||
+sv_del_backref|||
+sv_derived_from||5.004000|
+sv_dump|||
+sv_dup|||
+sv_eq|||
+sv_force_normal_flags||5.007001|
+sv_force_normal||5.006000|
+sv_free2|||
+sv_free_arenas|||
+sv_free|||
+sv_gets||5.004000|
+sv_grow|||
+sv_inc|||
+sv_insert|||
+sv_isa|||
+sv_isobject|||
+sv_iv||5.005000|
+sv_len_utf8||5.006000|
+sv_len|||
+sv_magicext||5.007003|
+sv_magic|||
+sv_mortalcopy|||
+sv_newmortal|||
+sv_newref|||
+sv_nolocking||5.007003|
+sv_nosharing||5.007003|
+sv_nounlocking||5.007003|
+sv_nv||5.005000|
+sv_peek||5.005000|
+sv_pos_b2u||5.006000|
+sv_pos_u2b||5.006000|
+sv_pvbyten_force||5.006000|
+sv_pvbyten||5.006000|
+sv_pvbyte||5.006000|
+sv_pvn_force_flags||5.007002|
+sv_pvn_force|||p
+sv_pvn_nomg|5.007003||p
+sv_pvn|5.006000||p
+sv_pvutf8n_force||5.006000|
+sv_pvutf8n||5.006000|
+sv_pvutf8||5.006000|
+sv_pv||5.006000|
+sv_recode_to_utf8||5.007003|
+sv_reftype|||
+sv_release_COW|||
+sv_release_IVX|||
+sv_replace|||
+sv_report_used|||
+sv_reset|||
+sv_rvweaken||5.006000|
+sv_setiv_mg|5.006000||p
+sv_setiv|||
+sv_setnv_mg|5.006000||p
+sv_setnv|||
+sv_setpv_mg|5.006000||p
+sv_setpvf_mg_nocontext|||pvn
+sv_setpvf_mg|5.006000|5.004000|pv
+sv_setpvf_nocontext|||vn
+sv_setpvf||5.004000|v
+sv_setpviv_mg||5.008001|
+sv_setpviv||5.008001|
+sv_setpvn_mg|5.006000||p
+sv_setpvn|||
+sv_setpv|||
+sv_setref_iv|||
+sv_setref_nv|||
+sv_setref_pvn|||
+sv_setref_pv|||
+sv_setref_uv||5.007001|
+sv_setsv_cow|||
+sv_setsv_flags||5.007002|
+sv_setsv_mg|5.006000||p
+sv_setsv_nomg|5.007002||p
+sv_setsv|||
+sv_setuv_mg|5.006000||p
+sv_setuv|5.006000||p
+sv_tainted||5.004000|
+sv_taint||5.004000|
+sv_true||5.005000|
+sv_unglob|||
+sv_uni_display||5.007003|
+sv_unmagic|||
+sv_unref_flags||5.007001|
+sv_unref|||
+sv_untaint||5.004000|
+sv_upgrade|||
+sv_usepvn_mg|5.006000||p
+sv_usepvn|||
+sv_utf8_decode||5.006000|
+sv_utf8_downgrade||5.006000|
+sv_utf8_encode||5.006000|
+sv_utf8_upgrade_flags||5.007002|
+sv_utf8_upgrade||5.007001|
+sv_uv|5.006000||p
+sv_vcatpvf_mg|5.006000|5.004000|p
+sv_vcatpvfn||5.004000|
+sv_vcatpvf|5.006000|5.004000|p
+sv_vsetpvf_mg|5.006000|5.004000|p
+sv_vsetpvfn||5.004000|
+sv_vsetpvf|5.006000|5.004000|p
+svtype|||
+swallow_bom|||
+swash_fetch||5.007002|
+swash_init||5.006000|
+sys_intern_clear|||
+sys_intern_dup|||
+sys_intern_init|||
+taint_env|||
+taint_proper|||
+tmps_grow||5.006000|
+toLOWER|||
+toUPPER|||
+to_byte_substr|||
+to_uni_fold||5.007003|
+to_uni_lower_lc||5.006000|
+to_uni_lower||5.007003|
+to_uni_title_lc||5.006000|
+to_uni_title||5.007003|
+to_uni_upper_lc||5.006000|
+to_uni_upper||5.007003|
+to_utf8_case||5.007003|
+to_utf8_fold||5.007003|
+to_utf8_lower||5.007003|
+to_utf8_substr|||
+to_utf8_title||5.007003|
+to_utf8_upper||5.007003|
+tokeq|||
+tokereport|||
+too_few_arguments|||
+too_many_arguments|||
+unlnk|||
+unpack_rec|||
+unpack_str||5.007003|
+unpackstring||5.008001|
+unshare_hek_or_pvn|||
+unshare_hek|||
+unsharepvn||5.004000|
+upg_version||5.009000|
+usage|||
+utf16_textfilter|||
+utf16_to_utf8_reversed||5.006001|
+utf16_to_utf8||5.006001|
+utf16rev_textfilter|||
+utf8_distance||5.006000|
+utf8_hop||5.006000|
+utf8_length||5.007001|
+utf8_mg_pos_init|||
+utf8_mg_pos|||
+utf8_to_bytes||5.006001|
+utf8_to_uvchr||5.007001|
+utf8_to_uvuni||5.007001|
+utf8n_to_uvchr||5.007001|
+utf8n_to_uvuni||5.007001|
+utilize|||
+uvchr_to_utf8_flags||5.007003|
+uvchr_to_utf8||5.007001|
+uvuni_to_utf8_flags||5.007003|
+uvuni_to_utf8||5.007001|
+validate_suid|||
+varname|||
+vcmp||5.009000|
+vcroak||5.006000|
+vdeb||5.007003|
+vdie|||
+vform||5.006000|
+visit|||
+vivify_defelem|||
+vivify_ref|||
+vload_module||5.006000|
+vmess||5.006000|
+vnewSVpvf|5.006000|5.004000|p
+vnormal||5.009002|
+vnumify||5.009000|
+vstringify||5.009000|
+vwarner||5.006000|
+vwarn||5.006000|
+wait4pid|||
+warn_nocontext|||vn
+warner_nocontext|||vn
+warner||5.006000|v
+warn|||v
+watch|||
+whichsig|||
+write_to_stderr|||
+yyerror|||
+yylex|||
+yyparse|||
+yywarn|||
+);
+
+if (exists $opt{'list-unsupported'}) {
+ my $f;
+ for $f (sort { lc $a cmp lc $b } keys %API) {
+ next unless $API{$f}{todo};
+ print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
+ }
+ exit 0;
+}
+
+# Scan for possible replacement candidates
+
+my(%replace, %need, %hints, %depends);
+my $replace = 0;
+my $hint = '';
+
+while (<DATA>) {
+ if ($hint) {
+ if (m{^\s*\*\s(.*?)\s*$}) {
+ $hints{$hint} ||= ''; # suppress warning with older perls
+ $hints{$hint} .= "$1\n";
+ }
+ else {
+ $hint = '';
+ }
+ }
+ $hint = $1 if m{^\s*$rccs\sHint:\s+(\w+)\s*$};
+
+ $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
+ $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
+ $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
+ $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
+
+ if (m{^\s*$rccs\s+(\w+)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
+ push @{$depends{$1}}, map { s/\s+//g; $_ } split /,/, $2;
+ }
+
+ $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
+}
+
+if (exists $opt{'api-info'}) {
+ my $f;
+ my $count = 0;
+ my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
+ for $f (sort { lc $a cmp lc $b } keys %API) {
+ next unless $f =~ /$match/;
+ print "\n=== $f ===\n\n";
+ my $info = 0;
+ if ($API{$f}{base} || $API{$f}{todo}) {
+ my $base = format_version($API{$f}{base} || $API{$f}{todo});
+ print "Supported at least starting from perl-$base.\n";
+ $info++;
+ }
+ if ($API{$f}{provided}) {
+ my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003";
+ print "Support by $ppport provided back to perl-$todo.\n";
+ print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
+ print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
+ print "$hints{$f}" if exists $hints{$f};
+ $info++;
+ }
+ unless ($info) {
+ print "No portability information available.\n";
+ }
+ $count++;
+ }
+ if ($count > 0) {
+ print "\n";
+ }
+ else {
+ print "Found no API matching '$opt{'api-info'}'.\n";
+ }
+ exit 0;
+}
+
+if (exists $opt{'list-provided'}) {
+ my $f;
+ for $f (sort { lc $a cmp lc $b } keys %API) {
+ next unless $API{$f}{provided};
+ my @flags;
+ push @flags, 'explicit' if exists $need{$f};
+ push @flags, 'depend' if exists $depends{$f};
+ push @flags, 'hint' if exists $hints{$f};
+ my $flags = @flags ? ' ['.join(', ', @flags).']' : '';
+ print "$f$flags\n";
+ }
+ exit 0;
+}
+
+my @files;
+my @srcext = qw( xs c h cc cpp );
+my $srcext = join '|', @srcext;
+
+if (@ARGV) {
+ my %seen;
+ @files = grep { -f && !exists $seen{$_} } map { glob $_ } @ARGV;
+}
+else {
+ eval {
+ require File::Find;
+ File::Find::find(sub {
+ $File::Find::name =~ /\.($srcext)$/i
+ and push @files, $File::Find::name;
+ }, '.');
+ };
+ if ($@) {
+ @files = map { glob "*.$_" } @srcext;
+ }
+}
+
+if (!@ARGV || $opt{filter}) {
+ my(@in, @out);
+ my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files;
+ for (@files) {
+ my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/\.($srcext)$/i;
+ push @{ $out ? \@out : \@in }, $_;
+ }
+ if (@ARGV && @out) {
+ warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out);
+ }
+ @files = @in;
+}
+
+unless (@files) {
+ die "No input files given!\n";
+}
+
+my(%files, %global, %revreplace);
+%revreplace = reverse %replace;
+my $filename;
+my $patch_opened = 0;
+
+for $filename (@files) {
+ unless (open IN, "<$filename") {
+ warn "Unable to read from $filename: $!\n";
+ next;
+ }
+
+ info("Scanning $filename ...");
+
+ my $c = do { local $/; <IN> };
+ close IN;
+
+ my %file = (orig => $c, changes => 0);
+
+ # temporarily remove C comments from the code
+ my @ccom;
+ $c =~ s{
+ (
+ [^"'/]+
+ |
+ (?:"[^"\\]*(?:\\.[^"\\]*)*" [^"'/]*)+
+ |
+ (?:'[^'\\]*(?:\\.[^'\\]*)*' [^"'/]*)+
+ )
+ |
+ (/ (?:
+ \*[^*]*\*+(?:[^$ccs][^*]*\*+)* /
+ |
+ /[^\r\n]*
+ ))
+ }{
+ defined $2 and push @ccom, $2;
+ defined $1 ? $1 : "$ccs$#ccom$cce";
+ }egsx;
+
+ $file{ccom} = \@ccom;
+ $file{code} = $c;
+ $file{has_inc_ppport} = ($c =~ /#.*include.*\Q$ppport\E/);
+
+ my $func;
+
+ for $func (keys %API) {
+ my $match = $func;
+ $match .= "|$revreplace{$func}" if exists $revreplace{$func};
+ if ($c =~ /\b(?:Perl_)?($match)\b/) {
+ $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
+ $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
+ if (exists $API{$func}{provided}) {
+ if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
+ $file{uses}{$func}++;
+ my @deps = rec_depend($func);
+ if (@deps) {
+ $file{uses_deps}{$func} = \@deps;
+ for (@deps) {
+ $file{uses}{$_} = 0 unless exists $file{uses}{$_};
+ }
+ }
+ for ($func, @deps) {
+ if (exists $need{$_}) {
+ $file{needs}{$_} = 'static';
+ }
+ }
+ }
+ }
+ if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
+ if ($c =~ /\b$func\b/) {
+ $file{uses_todo}{$func}++;
+ }
+ }
+ }
+ }
+
+ while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) {
+ if (exists $need{$2}) {
+ $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
+ }
+ else {
+ warning("Possibly wrong #define $1 in $filename");
+ }
+ }
+
+ for (qw(uses needs uses_todo needed_global needed_static)) {
+ for $func (keys %{$file{$_}}) {
+ push @{$global{$_}{$func}}, $filename;
+ }
+ }
+
+ $files{$filename} = \%file;
+}
+
+# Globally resolve NEED_'s
+my $need;
+for $need (keys %{$global{needs}}) {
+ if (@{$global{needs}{$need}} > 1) {
+ my @targets = @{$global{needs}{$need}};
+ my @t = grep $files{$_}{needed_global}{$need}, @targets;
+ @targets = @t if @t;
+ @t = grep /\.xs$/i, @targets;
+ @targets = @t if @t;
+ my $target = shift @targets;
+ $files{$target}{needs}{$need} = 'global';
+ for (@{$global{needs}{$need}}) {
+ $files{$_}{needs}{$need} = 'extern' if $_ ne $target;
+ }
+ }
+}
+
+for $filename (@files) {
+ exists $files{$filename} or next;
+
+ info("=== Analyzing $filename ===");
+
+ my %file = %{$files{$filename}};
+ my $func;
+ my $c = $file{code};
+
+ for $func (sort keys %{$file{uses_Perl}}) {
+ if ($API{$func}{varargs}) {
+ my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
+ { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
+ if ($changes) {
+ warning("Doesn't pass interpreter argument aTHX to Perl_$func");
+ $file{changes} += $changes;
+ }
+ }
+ else {
+ warning("Uses Perl_$func instead of $func");
+ $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*}
+ {$func$1(}g);
+ }
+ }
+
+ for $func (sort keys %{$file{uses_replace}}) {
+ warning("Uses $func instead of $replace{$func}");
+ $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
+ }
+
+ for $func (sort keys %{$file{uses}}) {
+ next unless $file{uses}{$func}; # if it's only a dependency
+ if (exists $file{uses_deps}{$func}) {
+ diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
+ }
+ elsif (exists $replace{$func}) {
+ warning("Uses $func instead of $replace{$func}");
+ $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
+ }
+ else {
+ diag("Uses $func");
+ }
+ hint($func);
+ }
+
+ for $func (sort keys %{$file{uses_todo}}) {
+ warning("Uses $func, which may not be portable below perl ",
+ format_version($API{$func}{todo}));
+ }
+
+ for $func (sort keys %{$file{needed_static}}) {
+ my $message = '';
+ if (not exists $file{uses}{$func}) {
+ $message = "No need to define NEED_$func if $func is never used";
+ }
+ elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') {
+ $message = "No need to define NEED_$func when already needed globally";
+ }
+ if ($message) {
+ diag($message);
+ $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg);
+ }
+ }
+
+ for $func (sort keys %{$file{needed_global}}) {
+ my $message = '';
+ if (not exists $global{uses}{$func}) {
+ $message = "No need to define NEED_${func}_GLOBAL if $func is never used";
+ }
+ elsif (exists $file{needs}{$func}) {
+ if ($file{needs}{$func} eq 'extern') {
+ $message = "No need to define NEED_${func}_GLOBAL when already needed globally";
+ }
+ elsif ($file{needs}{$func} eq 'static') {
+ $message = "No need to define NEED_${func}_GLOBAL when only used in this file";
+ }
+ }
+ if ($message) {
+ diag($message);
+ $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg);
+ }
+ }
+
+ $file{needs_inc_ppport} = keys %{$file{uses}};
+
+ if ($file{needs_inc_ppport}) {
+ my $pp = '';
+
+ for $func (sort keys %{$file{needs}}) {
+ my $type = $file{needs}{$func};
+ next if $type eq 'extern';
+ my $suffix = $type eq 'global' ? '_GLOBAL' : '';
+ unless (exists $file{"needed_$type"}{$func}) {
+ if ($type eq 'global') {
+ diag("Files [@{$global{needs}{$func}}] need $func, adding global request");
+ }
+ else {
+ diag("File needs $func, adding static request");
+ }
+ $pp .= "#define NEED_$func$suffix\n";
+ }
+ }
+
+ if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) {
+ $pp = '';
+ $file{changes}++;
+ }
+
+ unless ($file{has_inc_ppport}) {
+ diag("Needs to include '$ppport'");
+ $pp .= qq(#include "$ppport"\n)
+ }
+
+ if ($pp) {
+ $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms)
+ || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m)
+ || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m)
+ || ($c =~ s/^/$pp/);
+ }
+ }
+ else {
+ if ($file{has_inc_ppport}) {
+ diag("No need to include '$ppport'");
+ $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m);
+ }
+ }
+
+ # put back in our C comments
+ my $ix;
+ my $cppc = 0;
+ my @ccom = @{$file{ccom}};
+ for $ix (0 .. $#ccom) {
+ if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) {
+ $cppc++;
+ $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/;
+ }
+ else {
+ $c =~ s/$rccs$ix$rcce/$ccom[$ix]/;
+ }
+ }
+
+ if ($cppc) {
+ my $s = $cppc != 1 ? 's' : '';
+ warning("Uses $cppc C++ style comment$s, which is not portable");
+ }
+
+ if ($file{changes}) {
+ if (exists $opt{copy}) {
+ my $newfile = "$filename$opt{copy}";
+ if (-e $newfile) {
+ error("'$newfile' already exists, refusing to write copy of '$filename'");
+ }
+ else {
+ local *F;
+ if (open F, ">$newfile") {
+ info("Writing copy of '$filename' with changes to '$newfile'");
+ print F $c;
+ close F;
+ }
+ else {
+ error("Cannot open '$newfile' for writing: $!");
+ }
+ }
+ }
+ elsif (exists $opt{patch} || $opt{changes}) {
+ if (exists $opt{patch}) {
+ unless ($patch_opened) {
+ if (open PATCH, ">$opt{patch}") {
+ $patch_opened = 1;
+ }
+ else {
+ error("Cannot open '$opt{patch}' for writing: $!");
+ delete $opt{patch};
+ $opt{changes} = 1;
+ goto fallback;
+ }
+ }
+ mydiff(\*PATCH, $filename, $c);
+ }
+ else {
+fallback:
+ info("Suggested changes:");
+ mydiff(\*STDOUT, $filename, $c);
+ }
+ }
+ else {
+ my $s = $file{changes} == 1 ? '' : 's';
+ info("$file{changes} potentially required change$s detected");
+ }
+ }
+ else {
+ info("Looks good");
+ }
+}
+
+close PATCH if $patch_opened;
+
+exit 0;
+
+
+sub mydiff
+{
+ local *F = shift;
+ my($file, $str) = @_;
+ my $diff;
+
+ if (exists $opt{diff}) {
+ $diff = run_diff($opt{diff}, $file, $str);
+ }
+
+ if (!defined $diff and can_use('Text::Diff')) {
+ $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
+ $diff = <<HEADER . $diff;
+--- $file
++++ $file.patched
+HEADER
+ }
+
+ if (!defined $diff) {
+ $diff = run_diff('diff -u', $file, $str);
+ }
+
+ if (!defined $diff) {
+ $diff = run_diff('diff', $file, $str);
+ }
+
+ if (!defined $diff) {
+ error("Cannot generate a diff. Please install Text::Diff or use --copy.");
+ return;
+ }
+
+ print F $diff;
+
+}
+
+sub run_diff
+{
+ my($prog, $file, $str) = @_;
+ my $tmp = 'dppptemp';
+ my $suf = 'aaa';
+ my $diff = '';
+ local *F;
+
+ while (-e "$tmp.$suf") { $suf++ }
+ $tmp = "$tmp.$suf";
+
+ if (open F, ">$tmp") {
+ print F $str;
+ close F;
+
+ if (open F, "$prog $file $tmp |") {
+ while (<F>) {
+ s/\Q$tmp\E/$file.patched/;
+ $diff .= $_;
+ }
+ close F;
+ unlink $tmp;
+ return $diff;
+ }
+
+ unlink $tmp;
+ }
+ else {
+ error("Cannot open '$tmp' for writing: $!");
+ }
+
+ return undef;
+}
+
+sub can_use
+{
+ eval "use @_;";
+ return $@ eq '';
+}
+
+sub rec_depend
+{
+ my $func = shift;
+ my %seen;
+ return () unless exists $depends{$func};
+ grep !$seen{$_}++, map { ($_, rec_depend($_)) } @{$depends{$func}};
+}
+
+sub parse_version
+{
+ my $ver = shift;
+
+ if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
+ return ($1, $2, $3);
+ }
+ elsif ($ver !~ /^\d+\.[\d_]+$/) {
+ die "cannot parse version '$ver'\n";
+ }
+
+ $ver =~ s/_//g;
+ $ver =~ s/$/000000/;
+
+ my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+ $v = int $v;
+ $s = int $s;
+
+ if ($r < 5 || ($r == 5 && $v < 6)) {
+ if ($s % 10) {
+ die "cannot parse version '$ver'\n";
+ }
+ }
+
+ return ($r, $v, $s);
+}
+
+sub format_version
+{
+ my $ver = shift;
+
+ $ver =~ s/$/000000/;
+ my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+ $v = int $v;
+ $s = int $s;
+
+ if ($r < 5 || ($r == 5 && $v < 6)) {
+ if ($s % 10) {
+ die "invalid version '$ver'\n";
+ }
+ $s /= 10;
+
+ $ver = sprintf "%d.%03d", $r, $v;
+ $s > 0 and $ver .= sprintf "_%02d", $s;
+
+ return $ver;
+ }
+
+ return sprintf "%d.%d.%d", $r, $v, $s;
+}
+
+sub info
+{
+ $opt{quiet} and return;
+ print @_, "\n";
+}
+
+sub diag
+{
+ $opt{quiet} and return;
+ $opt{diag} and print @_, "\n";
+}
+
+sub warning
+{
+ $opt{quiet} and return;
+ print "*** ", @_, "\n";
+}
+
+sub error
+{
+ print "*** ERROR: ", @_, "\n";
+}
+
+my %given_hints;
+sub hint
+{
+ $opt{quiet} and return;
+ $opt{hints} or return;
+ my $func = shift;
+ exists $hints{$func} or return;
+ $given_hints{$func}++ and return;
+ my $hint = $hints{$func};
+ $hint =~ s/^/ /mg;
+ print " --- hint for $func ---\n", $hint;
+}
+
+sub usage
+{
+ my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms;
+ my %M = ( 'I' => '*' );
+ $usage =~ s/^\s*perl\s+\S+/$^X $0/;
+ $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g;
+
+ print <<ENDUSAGE;
+
+Usage: $usage
+
+See perldoc $0 for details.
+
+ENDUSAGE
+
+ exit 2;
+}
+
+__DATA__
+*/
+
+#ifndef _P_P_PORTABILITY_H_
+#define _P_P_PORTABILITY_H_
+
+#ifndef DPPP_NAMESPACE
+# define DPPP_NAMESPACE DPPP_
+#endif
+
+#define DPPP_CAT2(x,y) CAT2(x,y)
+#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name)
+
+#ifndef PERL_REVISION
+# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
+# define PERL_PATCHLEVEL_H_IMPLICIT
+# include <patchlevel.h>
+# endif
+# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
+# include <could_not_find_Perl_patchlevel.h>
+# endif
+# ifndef PERL_REVISION
+# define PERL_REVISION (5)
+ /* Replace: 1 */
+# define PERL_VERSION PATCHLEVEL
+# define PERL_SUBVERSION SUBVERSION
+ /* Replace PERL_PATCHLEVEL with PERL_VERSION */
+ /* Replace: 0 */
+# endif
+#endif
+
+#define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION)
+
+/* It is very unlikely that anyone will try to use this with Perl 6
+ (or greater), but who knows.
+ */
+#if PERL_REVISION != 5
+# error ppport.h only works with Perl version 5
+#endif /* PERL_REVISION != 5 */
+
+#ifdef I_LIMITS
+# include <limits.h>
+#endif
+
+#ifndef PERL_UCHAR_MIN
+# define PERL_UCHAR_MIN ((unsigned char)0)
+#endif
+
+#ifndef PERL_UCHAR_MAX
+# ifdef UCHAR_MAX
+# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
+# else
+# ifdef MAXUCHAR
+# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
+# else
+# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
+# endif
+# endif
+#endif
+
+#ifndef PERL_USHORT_MIN
+# define PERL_USHORT_MIN ((unsigned short)0)
+#endif
+
+#ifndef PERL_USHORT_MAX
+# ifdef USHORT_MAX
+# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
+# else
+# ifdef MAXUSHORT
+# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
+# else
+# ifdef USHRT_MAX
+# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
+# else
+# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
+# endif
+# endif
+# endif
+#endif
+
+#ifndef PERL_SHORT_MAX
+# ifdef SHORT_MAX
+# define PERL_SHORT_MAX ((short)SHORT_MAX)
+# else
+# ifdef MAXSHORT /* Often used in <values.h> */
+# define PERL_SHORT_MAX ((short)MAXSHORT)
+# else
+# ifdef SHRT_MAX
+# define PERL_SHORT_MAX ((short)SHRT_MAX)
+# else
+# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
+# endif
+# endif
+# endif
+#endif
+
+#ifndef PERL_SHORT_MIN
+# ifdef SHORT_MIN
+# define PERL_SHORT_MIN ((short)SHORT_MIN)
+# else
+# ifdef MINSHORT
+# define PERL_SHORT_MIN ((short)MINSHORT)
+# else
+# ifdef SHRT_MIN
+# define PERL_SHORT_MIN ((short)SHRT_MIN)
+# else
+# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
+# endif
+# endif
+# endif
+#endif
+
+#ifndef PERL_UINT_MAX
+# ifdef UINT_MAX
+# define PERL_UINT_MAX ((unsigned int)UINT_MAX)
+# else
+# ifdef MAXUINT
+# define PERL_UINT_MAX ((unsigned int)MAXUINT)
+# else
+# define PERL_UINT_MAX (~(unsigned int)0)
+# endif
+# endif
+#endif
+
+#ifndef PERL_UINT_MIN
+# define PERL_UINT_MIN ((unsigned int)0)
+#endif
+
+#ifndef PERL_INT_MAX
+# ifdef INT_MAX
+# define PERL_INT_MAX ((int)INT_MAX)
+# else
+# ifdef MAXINT /* Often used in <values.h> */
+# define PERL_INT_MAX ((int)MAXINT)
+# else
+# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
+# endif
+# endif
+#endif
+
+#ifndef PERL_INT_MIN
+# ifdef INT_MIN
+# define PERL_INT_MIN ((int)INT_MIN)
+# else
+# ifdef MININT
+# define PERL_INT_MIN ((int)MININT)
+# else
+# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
+# endif
+# endif
+#endif
+
+#ifndef PERL_ULONG_MAX
+# ifdef ULONG_MAX
+# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
+# else
+# ifdef MAXULONG
+# define PERL_ULONG_MAX ((unsigned long)MAXULONG)
+# else
+# define PERL_ULONG_MAX (~(unsigned long)0)
+# endif
+# endif
+#endif
+
+#ifndef PERL_ULONG_MIN
+# define PERL_ULONG_MIN ((unsigned long)0L)
+#endif
+
+#ifndef PERL_LONG_MAX
+# ifdef LONG_MAX
+# define PERL_LONG_MAX ((long)LONG_MAX)
+# else
+# ifdef MAXLONG
+# define PERL_LONG_MAX ((long)MAXLONG)
+# else
+# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
+# endif
+# endif
+#endif
+
+#ifndef PERL_LONG_MIN
+# ifdef LONG_MIN
+# define PERL_LONG_MIN ((long)LONG_MIN)
+# else
+# ifdef MINLONG
+# define PERL_LONG_MIN ((long)MINLONG)
+# else
+# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
+# endif
+# endif
+#endif
+
+#if defined(HAS_QUAD) && (defined(convex) || defined(uts))
+# ifndef PERL_UQUAD_MAX
+# ifdef ULONGLONG_MAX
+# define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX)
+# else
+# ifdef MAXULONGLONG
+# define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG)
+# else
+# define PERL_UQUAD_MAX (~(unsigned long long)0)
+# endif
+# endif
+# endif
+
+# ifndef PERL_UQUAD_MIN
+# define PERL_UQUAD_MIN ((unsigned long long)0L)
+# endif
+
+# ifndef PERL_QUAD_MAX
+# ifdef LONGLONG_MAX
+# define PERL_QUAD_MAX ((long long)LONGLONG_MAX)
+# else
+# ifdef MAXLONGLONG
+# define PERL_QUAD_MAX ((long long)MAXLONGLONG)
+# else
+# define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1))
+# endif
+# endif
+# endif
+
+# ifndef PERL_QUAD_MIN
+# ifdef LONGLONG_MIN
+# define PERL_QUAD_MIN ((long long)LONGLONG_MIN)
+# else
+# ifdef MINLONGLONG
+# define PERL_QUAD_MIN ((long long)MINLONGLONG)
+# else
+# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
+# endif
+# endif
+# endif
+#endif
+
+/* This is based on code from 5.003 perl.h */
+#ifdef HAS_QUAD
+# ifdef cray
+#ifndef IVTYPE
+# define IVTYPE int
+#endif
+
+#ifndef IV_MIN
+# define IV_MIN PERL_INT_MIN
+#endif
+
+#ifndef IV_MAX
+# define IV_MAX PERL_INT_MAX
+#endif
+
+#ifndef UV_MIN
+# define UV_MIN PERL_UINT_MIN
+#endif
+
+#ifndef UV_MAX
+# define UV_MAX PERL_UINT_MAX
+#endif
+
+# ifdef INTSIZE
+#ifndef IVSIZE
+# define IVSIZE INTSIZE
+#endif
+
+# endif
+# else
+# if defined(convex) || defined(uts)
+#ifndef IVTYPE
+# define IVTYPE long long
+#endif
+
+#ifndef IV_MIN
+# define IV_MIN PERL_QUAD_MIN
+#endif
+
+#ifndef IV_MAX
+# define IV_MAX PERL_QUAD_MAX
+#endif
+
+#ifndef UV_MIN
+# define UV_MIN PERL_UQUAD_MIN
+#endif
+
+#ifndef UV_MAX
+# define UV_MAX PERL_UQUAD_MAX
+#endif
+
+# ifdef LONGLONGSIZE
+#ifndef IVSIZE
+# define IVSIZE LONGLONGSIZE
+#endif
+
+# endif
+# else
+#ifndef IVTYPE
+# define IVTYPE long
+#endif
+
+#ifndef IV_MIN
+# define IV_MIN PERL_LONG_MIN
+#endif
+
+#ifndef IV_MAX
+# define IV_MAX PERL_LONG_MAX
+#endif
+
+#ifndef UV_MIN
+# define UV_MIN PERL_ULONG_MIN
+#endif
+
+#ifndef UV_MAX
+# define UV_MAX PERL_ULONG_MAX
+#endif
+
+# ifdef LONGSIZE
+#ifndef IVSIZE
+# define IVSIZE LONGSIZE
+#endif
+
+# endif
+# endif
+# endif
+#ifndef IVSIZE
+# define IVSIZE 8
+#endif
+
+#ifndef PERL_QUAD_MIN
+# define PERL_QUAD_MIN IV_MIN
+#endif
+
+#ifndef PERL_QUAD_MAX
+# define PERL_QUAD_MAX IV_MAX
+#endif
+
+#ifndef PERL_UQUAD_MIN
+# define PERL_UQUAD_MIN UV_MIN
+#endif
+
+#ifndef PERL_UQUAD_MAX
+# define PERL_UQUAD_MAX UV_MAX
+#endif
+
+#else
+#ifndef IVTYPE
+# define IVTYPE long
+#endif
+
+#ifndef IV_MIN
+# define IV_MIN PERL_LONG_MIN
+#endif
+
+#ifndef IV_MAX
+# define IV_MAX PERL_LONG_MAX
+#endif
+
+#ifndef UV_MIN
+# define UV_MIN PERL_ULONG_MIN
+#endif
+
+#ifndef UV_MAX
+# define UV_MAX PERL_ULONG_MAX
+#endif
+
+#endif
+
+#ifndef IVSIZE
+# ifdef LONGSIZE
+# define IVSIZE LONGSIZE
+# else
+# define IVSIZE 4 /* A bold guess, but the best we can make. */
+# endif
+#endif
+#ifndef UVTYPE
+# define UVTYPE unsigned IVTYPE
+#endif
+
+#ifndef UVSIZE
+# define UVSIZE IVSIZE
+#endif
+
+#ifndef sv_setuv
+# define sv_setuv(sv, uv) \
+ STMT_START { \
+ UV TeMpUv = uv; \
+ if (TeMpUv <= IV_MAX) \
+ sv_setiv(sv, TeMpUv); \
+ else \
+ sv_setnv(sv, (double)TeMpUv); \
+ } STMT_END
+#endif
+
+#ifndef newSVuv
+# define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
+#endif
+#ifndef sv_2uv
+# define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
+#endif
+
+#ifndef SvUVX
+# define SvUVX(sv) ((UV)SvIVX(sv))
+#endif
+
+#ifndef SvUVXx
+# define SvUVXx(sv) SvUVX(sv)
+#endif
+
+#ifndef SvUV
+# define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
+#endif
+
+#ifndef SvUVx
+# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
+#endif
+
+/* Hint: sv_uv
+ * Always use the SvUVx() macro instead of sv_uv().
+ */
+#ifndef sv_uv
+# define sv_uv(sv) SvUVx(sv)
+#endif
+#ifndef XST_mUV
+# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
+#endif
+
+#ifndef XSRETURN_UV
+# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END
+#endif
+#ifndef PUSHu
+# define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
+#endif
+
+#ifndef XPUSHu
+# define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
+#endif
+
+#if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))
+/* Replace: 1 */
+# define PL_DBsingle DBsingle
+# define PL_DBsub DBsub
+# define PL_Sv Sv
+# define PL_compiling compiling
+# define PL_copline copline
+# define PL_curcop curcop
+# define PL_curstash curstash
+# define PL_debstash debstash
+# define PL_defgv defgv
+# define PL_diehook diehook
+# define PL_dirty dirty
+# define PL_dowarn dowarn
+# define PL_errgv errgv
+# define PL_hexdigit hexdigit
+# define PL_hints hints
+# define PL_na na
+# define PL_no_modify no_modify
+# define PL_perl_destruct_level perl_destruct_level
+# define PL_perldb perldb
+# define PL_ppaddr ppaddr
+# define PL_rsfp_filters rsfp_filters
+# define PL_rsfp rsfp
+# define PL_stack_base stack_base
+# define PL_stack_sp stack_sp
+# define PL_stdingv stdingv
+# define PL_sv_arenaroot sv_arenaroot
+# define PL_sv_no sv_no
+# define PL_sv_undef sv_undef
+# define PL_sv_yes sv_yes
+# define PL_tainted tainted
+# define PL_tainting tainting
+/* Replace: 0 */
+#endif
+
+#ifndef PERL_UNUSED_DECL
+# ifdef HASATTRIBUTE
+# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
+# define PERL_UNUSED_DECL
+# else
+# define PERL_UNUSED_DECL __attribute__((unused))
+# endif
+# else
+# define PERL_UNUSED_DECL
+# endif
+#endif
+#ifndef NOOP
+# define NOOP (void)0
+#endif
+
+#ifndef dNOOP
+# define dNOOP extern int Perl___notused PERL_UNUSED_DECL
+#endif
+
+#ifndef NVTYPE
+# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+# define NVTYPE long double
+# else
+# define NVTYPE double
+# endif
+typedef NVTYPE NV;
+#endif
+
+#ifndef INT2PTR
+
+# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
+# define PTRV UV
+# define INT2PTR(any,d) (any)(d)
+# else
+# if PTRSIZE == LONGSIZE
+# define PTRV unsigned long
+# else
+# define PTRV unsigned
+# endif
+# define INT2PTR(any,d) (any)(PTRV)(d)
+# endif
+
+# define NUM2PTR(any,d) (any)(PTRV)(d)
+# define PTR2IV(p) INT2PTR(IV,p)
+# define PTR2UV(p) INT2PTR(UV,p)
+# define PTR2NV(p) NUM2PTR(NV,p)
+
+# if PTRSIZE == LONGSIZE
+# define PTR2ul(p) (unsigned long)(p)
+# else
+# define PTR2ul(p) INT2PTR(unsigned long,p)
+# endif
+
+#endif /* !INT2PTR */
+
+#undef START_EXTERN_C
+#undef END_EXTERN_C
+#undef EXTERN_C
+#ifdef __cplusplus
+# define START_EXTERN_C extern "C" {
+# define END_EXTERN_C }
+# define EXTERN_C extern "C"
+#else
+# define START_EXTERN_C
+# define END_EXTERN_C
+# define EXTERN_C extern
+#endif
+
+#ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
+# if defined(__STRICT_ANSI__) && defined(PERL_GCC_PEDANTIC)
+# define PERL_GCC_BRACE_GROUPS_FORBIDDEN
+# endif
+#endif
+
+#undef STMT_START
+#undef STMT_END
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
+# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */
+# define STMT_END )
+#else
+# if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
+# define STMT_START if (1)
+# define STMT_END else (void)0
+# else
+# define STMT_START do
+# define STMT_END while (0)
+# endif
+#endif
+#ifndef boolSV
+# define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
+#endif
+
+/* DEFSV appears first in 5.004_56 */
+#ifndef DEFSV
+# define DEFSV GvSV(PL_defgv)
+#endif
+
+#ifndef SAVE_DEFSV
+# define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
+#endif
+
+/* Older perls (<=5.003) lack AvFILLp */
+#ifndef AvFILLp
+# define AvFILLp AvFILL
+#endif
+#ifndef ERRSV
+# define ERRSV get_sv("@",FALSE)
+#endif
+#ifndef newSVpvn
+# define newSVpvn(data,len) ((data) \
+ ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
+ : newSV(0))
+#endif
+
+/* Hint: gv_stashpvn
+ * This function's backport doesn't support the length parameter, but
+ * rather ignores it. Portability can only be ensured if the length
+ * parameter is used for speed reasons, but the length can always be
+ * correctly computed from the string argument.
+ */
+#ifndef gv_stashpvn
+# define gv_stashpvn(str,len,create) gv_stashpv(str,create)
+#endif
+
+/* Replace: 1 */
+#ifndef get_cv
+# define get_cv perl_get_cv
+#endif
+
+#ifndef get_sv
+# define get_sv perl_get_sv
+#endif
+
+#ifndef get_av
+# define get_av perl_get_av
+#endif
+
+#ifndef get_hv
+# define get_hv perl_get_hv
+#endif
+
+/* Replace: 0 */
+
+#ifdef HAS_MEMCMP
+#ifndef memNE
+# define memNE(s1,s2,l) (memcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+# define memEQ(s1,s2,l) (!memcmp(s1,s2,l))
+#endif
+
+#else
+#ifndef memNE
+# define memNE(s1,s2,l) (bcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+# define memEQ(s1,s2,l) (!bcmp(s1,s2,l))
+#endif
+
+#endif
+#ifndef MoveD
+# define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifndef CopyD
+# define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifdef HAS_MEMSET
+#ifndef ZeroD
+# define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t))
+#endif
+
+#else
+#ifndef ZeroD
+# define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)),d)
+#endif
+
+#endif
+#ifndef Poison
+# define Poison(d,n,t) (void)memset((char*)(d), 0xAB, (n) * sizeof(t))
+#endif
+#ifndef dUNDERBAR
+# define dUNDERBAR dNOOP
+#endif
+
+#ifndef UNDERBAR
+# define UNDERBAR DEFSV
+#endif
+#ifndef dAX
+# define dAX I32 ax = MARK - PL_stack_base + 1
+#endif
+
+#ifndef dITEMS
+# define dITEMS I32 items = SP - MARK
+#endif
+#ifndef dXSTARG
+# define dXSTARG SV * targ = sv_newmortal()
+#endif
+#ifndef dTHR
+# define dTHR dNOOP
+#endif
+#ifndef dTHX
+# define dTHX dNOOP
+#endif
+
+#ifndef dTHXa
+# define dTHXa(x) dNOOP
+#endif
+#ifndef pTHX
+# define pTHX void
+#endif
+
+#ifndef pTHX_
+# define pTHX_
+#endif
+
+#ifndef aTHX
+# define aTHX
+#endif
+
+#ifndef aTHX_
+# define aTHX_
+#endif
+#ifndef dTHXoa
+# define dTHXoa(x) dTHXa(x)
+#endif
+#ifndef PUSHmortal
+# define PUSHmortal PUSHs(sv_newmortal())
+#endif
+
+#ifndef mPUSHp
+# define mPUSHp(p,l) sv_setpvn_mg(PUSHmortal, (p), (l))
+#endif
+
+#ifndef mPUSHn
+# define mPUSHn(n) sv_setnv_mg(PUSHmortal, (NV)(n))
+#endif
+
+#ifndef mPUSHi
+# define mPUSHi(i) sv_setiv_mg(PUSHmortal, (IV)(i))
+#endif
+
+#ifndef mPUSHu
+# define mPUSHu(u) sv_setuv_mg(PUSHmortal, (UV)(u))
+#endif
+#ifndef XPUSHmortal
+# define XPUSHmortal XPUSHs(sv_newmortal())
+#endif
+
+#ifndef mXPUSHp
+# define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn_mg(PUSHmortal, (p), (l)); } STMT_END
+#endif
+
+#ifndef mXPUSHn
+# define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv_mg(PUSHmortal, (NV)(n)); } STMT_END
+#endif
+
+#ifndef mXPUSHi
+# define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv_mg(PUSHmortal, (IV)(i)); } STMT_END
+#endif
+
+#ifndef mXPUSHu
+# define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv_mg(PUSHmortal, (UV)(u)); } STMT_END
+#endif
+
+/* Replace: 1 */
+#ifndef call_sv
+# define call_sv perl_call_sv
+#endif
+
+#ifndef call_pv
+# define call_pv perl_call_pv
+#endif
+
+#ifndef call_argv
+# define call_argv perl_call_argv
+#endif
+
+#ifndef call_method
+# define call_method perl_call_method
+#endif
+#ifndef eval_sv
+# define eval_sv perl_eval_sv
+#endif
+
+/* Replace: 0 */
+
+/* Replace perl_eval_pv with eval_pv */
+/* eval_pv depends on eval_sv */
+
+#ifndef eval_pv
+#if defined(NEED_eval_pv)
+static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+static
+#else
+extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+#endif
+
+#ifdef eval_pv
+# undef eval_pv
+#endif
+#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b)
+#define Perl_eval_pv DPPP_(my_eval_pv)
+
+#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL)
+
+SV*
+DPPP_(my_eval_pv)(char *p, I32 croak_on_error)
+{
+ dSP;
+ SV* sv = newSVpv(p, 0);
+
+ PUSHMARK(sp);
+ eval_sv(sv, G_SCALAR);
+ SvREFCNT_dec(sv);
+
+ SPAGAIN;
+ sv = POPs;
+ PUTBACK;
+
+ if (croak_on_error && SvTRUE(GvSV(errgv)))
+ croak(SvPVx(GvSV(errgv), na));
+
+ return sv;
+}
+
+#endif
+#endif
+#ifndef newRV_inc
+# define newRV_inc(sv) newRV(sv) /* Replace */
+#endif
+
+#ifndef newRV_noinc
+#if defined(NEED_newRV_noinc)
+static SV * DPPP_(my_newRV_noinc)(SV *sv);
+static
+#else
+extern SV * DPPP_(my_newRV_noinc)(SV *sv);
+#endif
+
+#ifdef newRV_noinc
+# undef newRV_noinc
+#endif
+#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a)
+#define Perl_newRV_noinc DPPP_(my_newRV_noinc)
+
+#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL)
+SV *
+DPPP_(my_newRV_noinc)(SV *sv)
+{
+ SV *rv = (SV *)newRV(sv);
+ SvREFCNT_dec(sv);
+ return rv;
+}
+#endif
+#endif
+
+/* Hint: newCONSTSUB
+ * Returns a CV* as of perl-5.7.1. This return value is not supported
+ * by Devel::PPPort.
+ */
+
+/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
+#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 63))) && ((PERL_VERSION != 4) || (PERL_SUBVERSION != 5))
+#if defined(NEED_newCONSTSUB)
+static void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
+static
+#else
+extern void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
+#endif
+
+#ifdef newCONSTSUB
+# undef newCONSTSUB
+#endif
+#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c)
+#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB)
+
+#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
+
+void
+DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv)
+{
+ U32 oldhints = PL_hints;
+ HV *old_cop_stash = PL_curcop->cop_stash;
+ HV *old_curstash = PL_curstash;
+ line_t oldline = PL_curcop->cop_line;
+ PL_curcop->cop_line = PL_copline;
+
+ PL_hints &= ~HINT_BLOCK_SCOPE;
+ if (stash)
+ PL_curstash = PL_curcop->cop_stash = stash;
+
+ newSUB(
+
+#if ((PERL_VERSION < 3) || ((PERL_VERSION == 3) && (PERL_SUBVERSION < 22)))
+ start_subparse(),
+#elif ((PERL_VERSION == 3) && (PERL_SUBVERSION == 22))
+ start_subparse(0),
+#else /* 5.003_23 onwards */
+ start_subparse(FALSE, 0),
+#endif
+
+ newSVOP(OP_CONST, 0, newSVpv(name,0)),
+ newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */
+ newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
+ );
+
+ PL_hints = oldhints;
+ PL_curcop->cop_stash = old_cop_stash;
+ PL_curstash = old_curstash;
+ PL_curcop->cop_line = oldline;
+}
+#endif
+#endif
+
+/*
+ * Boilerplate macros for initializing and accessing interpreter-local
+ * data from C. All statics in extensions should be reworked to use
+ * this, if you want to make the extension thread-safe. See ext/re/re.xs
+ * for an example of the use of these macros.
+ *
+ * Code that uses these macros is responsible for the following:
+ * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
+ * 2. Declare a typedef named my_cxt_t that is a structure that contains
+ * all the data that needs to be interpreter-local.
+ * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
+ * 4. Use the MY_CXT_INIT macro such that it is called exactly once
+ * (typically put in the BOOT: section).
+ * 5. Use the members of the my_cxt_t structure everywhere as
+ * MY_CXT.member.
+ * 6. Use the dMY_CXT macro (a declaration) in all the functions that
+ * access MY_CXT.
+ */
+
+#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
+ defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT)
+
+#ifndef START_MY_CXT
+
+/* This must appear in all extensions that define a my_cxt_t structure,
+ * right after the definition (i.e. at file scope). The non-threads
+ * case below uses it to declare the data as static. */
+#define START_MY_CXT
+
+#if (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION < 68 ))
+/* Fetches the SV that keeps the per-interpreter data. */
+#define dMY_CXT_SV \
+ SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
+#else /* >= perl5.004_68 */
+#define dMY_CXT_SV \
+ SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \
+ sizeof(MY_CXT_KEY)-1, TRUE)
+#endif /* < perl5.004_68 */
+
+/* This declaration should be used within all functions that use the
+ * interpreter-local data. */
+#define dMY_CXT \
+ dMY_CXT_SV; \
+ my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
+
+/* Creates and zeroes the per-interpreter data.
+ * (We allocate my_cxtp in a Perl SV so that it will be released when
+ * the interpreter goes away.) */
+#define MY_CXT_INIT \
+ dMY_CXT_SV; \
+ /* newSV() allocates one more than needed */ \
+ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+ Zero(my_cxtp, 1, my_cxt_t); \
+ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+
+/* This macro must be used to access members of the my_cxt_t structure.
+ * e.g. MYCXT.some_data */
+#define MY_CXT (*my_cxtp)
+
+/* Judicious use of these macros can reduce the number of times dMY_CXT
+ * is used. Use is similar to pTHX, aTHX etc. */
+#define pMY_CXT my_cxt_t *my_cxtp
+#define pMY_CXT_ pMY_CXT,
+#define _pMY_CXT ,pMY_CXT
+#define aMY_CXT my_cxtp
+#define aMY_CXT_ aMY_CXT,
+#define _aMY_CXT ,aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+/* Clones the per-interpreter data. */
+#define MY_CXT_CLONE \
+ dMY_CXT_SV; \
+ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+ Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
+ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+#endif
+
+#else /* single interpreter */
+
+#ifndef START_MY_CXT
+
+#define START_MY_CXT static my_cxt_t my_cxt;
+#define dMY_CXT_SV dNOOP
+#define dMY_CXT dNOOP
+#define MY_CXT_INIT NOOP
+#define MY_CXT my_cxt
+
+#define pMY_CXT void
+#define pMY_CXT_
+#define _pMY_CXT
+#define aMY_CXT
+#define aMY_CXT_
+#define _aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+#define MY_CXT_CLONE NOOP
+#endif
+
+#endif
+
+#ifndef IVdf
+# if IVSIZE == LONGSIZE
+# define IVdf "ld"
+# define UVuf "lu"
+# define UVof "lo"
+# define UVxf "lx"
+# define UVXf "lX"
+# else
+# if IVSIZE == INTSIZE
+# define IVdf "d"
+# define UVuf "u"
+# define UVof "o"
+# define UVxf "x"
+# define UVXf "X"
+# endif
+# endif
+#endif
+
+#ifndef NVef
+# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
+ defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */
+# define NVef PERL_PRIeldbl
+# define NVff PERL_PRIfldbl
+# define NVgf PERL_PRIgldbl
+# else
+# define NVef "e"
+# define NVff "f"
+# define NVgf "g"
+# endif
+#endif
+
+#ifndef SvPV_nolen
+
+#if defined(NEED_sv_2pv_nolen)
+static char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
+static
+#else
+extern char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
+#endif
+
+#ifdef sv_2pv_nolen
+# undef sv_2pv_nolen
+#endif
+#define sv_2pv_nolen(a) DPPP_(my_sv_2pv_nolen)(aTHX_ a)
+#define Perl_sv_2pv_nolen DPPP_(my_sv_2pv_nolen)
+
+#if defined(NEED_sv_2pv_nolen) || defined(NEED_sv_2pv_nolen_GLOBAL)
+
+char *
+DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv)
+{
+ STRLEN n_a;
+ return sv_2pv(sv, &n_a);
+}
+
+#endif
+
+/* Hint: sv_2pv_nolen
+ * Use the SvPV_nolen() macro instead of sv_2pv_nolen().
+ */
+
+/* SvPV_nolen depends on sv_2pv_nolen */
+#define SvPV_nolen(sv) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? SvPVX(sv) : sv_2pv_nolen(sv))
+
+#endif
+
+#ifdef SvPVbyte
+
+/* Hint: SvPVbyte
+ * Does not work in perl-5.6.1, ppport.h implements a version
+ * borrowed from perl-5.7.3.
+ */
+
+#if ((PERL_VERSION < 7) || ((PERL_VERSION == 7) && (PERL_SUBVERSION < 0)))
+
+#if defined(NEED_sv_2pvbyte)
+static char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
+static
+#else
+extern char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
+#endif
+
+#ifdef sv_2pvbyte
+# undef sv_2pvbyte
+#endif
+#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b)
+#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte)
+
+#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL)
+
+char *
+DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp)
+{
+ sv_utf8_downgrade(sv,0);
+ return SvPV(sv,*lp);
+}
+
+#endif
+
+/* Hint: sv_2pvbyte
+ * Use the SvPVbyte() macro instead of sv_2pvbyte().
+ */
+
+#undef SvPVbyte
+
+/* SvPVbyte depends on sv_2pvbyte */
+#define SvPVbyte(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
+
+#endif
+
+#else
+
+# define SvPVbyte SvPV
+# define sv_2pvbyte sv_2pv
+
+#endif
+
+/* sv_2pvbyte_nolen depends on sv_2pv_nolen */
+#ifndef sv_2pvbyte_nolen
+# define sv_2pvbyte_nolen sv_2pv_nolen
+#endif
+
+/* Hint: sv_pvn
+ * Always use the SvPV() macro instead of sv_pvn().
+ */
+#ifndef sv_pvn
+# define sv_pvn(sv, len) SvPV(sv, len)
+#endif
+
+/* Hint: sv_pvn_force
+ * Always use the SvPV_force() macro instead of sv_pvn_force().
+ */
+#ifndef sv_pvn_force
+# define sv_pvn_force(sv, len) SvPV_force(sv, len)
+#endif
+
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(vnewSVpvf)
+#if defined(NEED_vnewSVpvf)
+static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args);
+static
+#else
+extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args);
+#endif
+
+#ifdef vnewSVpvf
+# undef vnewSVpvf
+#endif
+#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b)
+#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf)
+
+#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL)
+
+SV *
+DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args)
+{
+ register SV *sv = newSV(0);
+ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
+ return sv;
+}
+
+#endif
+#endif
+
+/* sv_vcatpvf depends on sv_vcatpvfn */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf)
+# define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+/* sv_vsetpvf depends on sv_vsetpvfn */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf)
+# define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+/* sv_catpvf_mg depends on sv_vcatpvfn, sv_catpvf_mg_nocontext */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg)
+#if defined(NEED_sv_catpvf_mg)
+static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
+static
+#else
+extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
+#endif
+
+#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg)
+
+#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL)
+
+void
+DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ SvSETMAGIC(sv);
+ va_end(args);
+}
+
+#endif
+#endif
+
+/* sv_catpvf_mg_nocontext depends on sv_vcatpvfn */
+#ifdef PERL_IMPLICIT_CONTEXT
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg_nocontext)
+#if defined(NEED_sv_catpvf_mg_nocontext)
+static void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...);
+static
+#else
+extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...);
+#endif
+
+#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+
+#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL)
+
+void
+DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ SvSETMAGIC(sv);
+ va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+#ifndef sv_catpvf_mg
+# ifdef PERL_IMPLICIT_CONTEXT
+# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
+# else
+# define sv_catpvf_mg Perl_sv_catpvf_mg
+# endif
+#endif
+
+/* sv_vcatpvf_mg depends on sv_vcatpvfn */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf_mg)
+# define sv_vcatpvf_mg(sv, pat, args) \
+ STMT_START { \
+ sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \
+ SvSETMAGIC(sv); \
+ } STMT_END
+#endif
+
+/* sv_setpvf_mg depends on sv_vsetpvfn, sv_setpvf_mg_nocontext */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg)
+#if defined(NEED_sv_setpvf_mg)
+static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
+static
+#else
+extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
+#endif
+
+#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg)
+
+#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL)
+
+void
+DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ SvSETMAGIC(sv);
+ va_end(args);
+}
+
+#endif
+#endif
+
+/* sv_setpvf_mg_nocontext depends on sv_vsetpvfn */
+#ifdef PERL_IMPLICIT_CONTEXT
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg_nocontext)
+#if defined(NEED_sv_setpvf_mg_nocontext)
+static void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...);
+static
+#else
+extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...);
+#endif
+
+#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+
+#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL)
+
+void
+DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ SvSETMAGIC(sv);
+ va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+#ifndef sv_setpvf_mg
+# ifdef PERL_IMPLICIT_CONTEXT
+# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
+# else
+# define sv_setpvf_mg Perl_sv_setpvf_mg
+# endif
+#endif
+
+/* sv_vsetpvf_mg depends on sv_vsetpvfn */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf_mg)
+# define sv_vsetpvf_mg(sv, pat, args) \
+ STMT_START { \
+ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \
+ SvSETMAGIC(sv); \
+ } STMT_END
+#endif
+#ifndef SvGETMAGIC
+# define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
+#endif
+#ifndef PERL_MAGIC_sv
+# define PERL_MAGIC_sv '\0'
+#endif
+
+#ifndef PERL_MAGIC_overload
+# define PERL_MAGIC_overload 'A'
+#endif
+
+#ifndef PERL_MAGIC_overload_elem
+# define PERL_MAGIC_overload_elem 'a'
+#endif
+
+#ifndef PERL_MAGIC_overload_table
+# define PERL_MAGIC_overload_table 'c'
+#endif
+
+#ifndef PERL_MAGIC_bm
+# define PERL_MAGIC_bm 'B'
+#endif
+
+#ifndef PERL_MAGIC_regdata
+# define PERL_MAGIC_regdata 'D'
+#endif
+
+#ifndef PERL_MAGIC_regdatum
+# define PERL_MAGIC_regdatum 'd'
+#endif
+
+#ifndef PERL_MAGIC_env
+# define PERL_MAGIC_env 'E'
+#endif
+
+#ifndef PERL_MAGIC_envelem
+# define PERL_MAGIC_envelem 'e'
+#endif
+
+#ifndef PERL_MAGIC_fm
+# define PERL_MAGIC_fm 'f'
+#endif
+
+#ifndef PERL_MAGIC_regex_global
+# define PERL_MAGIC_regex_global 'g'
+#endif
+
+#ifndef PERL_MAGIC_isa
+# define PERL_MAGIC_isa 'I'
+#endif
+
+#ifndef PERL_MAGIC_isaelem
+# define PERL_MAGIC_isaelem 'i'
+#endif
+
+#ifndef PERL_MAGIC_nkeys
+# define PERL_MAGIC_nkeys 'k'
+#endif
+
+#ifndef PERL_MAGIC_dbfile
+# define PERL_MAGIC_dbfile 'L'
+#endif
+
+#ifndef PERL_MAGIC_dbline
+# define PERL_MAGIC_dbline 'l'
+#endif
+
+#ifndef PERL_MAGIC_mutex
+# define PERL_MAGIC_mutex 'm'
+#endif
+
+#ifndef PERL_MAGIC_shared
+# define PERL_MAGIC_shared 'N'
+#endif
+
+#ifndef PERL_MAGIC_shared_scalar
+# define PERL_MAGIC_shared_scalar 'n'
+#endif
+
+#ifndef PERL_MAGIC_collxfrm
+# define PERL_MAGIC_collxfrm 'o'
+#endif
+
+#ifndef PERL_MAGIC_tied
+# define PERL_MAGIC_tied 'P'
+#endif
+
+#ifndef PERL_MAGIC_tiedelem
+# define PERL_MAGIC_tiedelem 'p'
+#endif
+
+#ifndef PERL_MAGIC_tiedscalar
+# define PERL_MAGIC_tiedscalar 'q'
+#endif
+
+#ifndef PERL_MAGIC_qr
+# define PERL_MAGIC_qr 'r'
+#endif
+
+#ifndef PERL_MAGIC_sig
+# define PERL_MAGIC_sig 'S'
+#endif
+
+#ifndef PERL_MAGIC_sigelem
+# define PERL_MAGIC_sigelem 's'
+#endif
+
+#ifndef PERL_MAGIC_taint
+# define PERL_MAGIC_taint 't'
+#endif
+
+#ifndef PERL_MAGIC_uvar
+# define PERL_MAGIC_uvar 'U'
+#endif
+
+#ifndef PERL_MAGIC_uvar_elem
+# define PERL_MAGIC_uvar_elem 'u'
+#endif
+
+#ifndef PERL_MAGIC_vstring
+# define PERL_MAGIC_vstring 'V'
+#endif
+
+#ifndef PERL_MAGIC_vec
+# define PERL_MAGIC_vec 'v'
+#endif
+
+#ifndef PERL_MAGIC_utf8
+# define PERL_MAGIC_utf8 'w'
+#endif
+
+#ifndef PERL_MAGIC_substr
+# define PERL_MAGIC_substr 'x'
+#endif
+
+#ifndef PERL_MAGIC_defelem
+# define PERL_MAGIC_defelem 'y'
+#endif
+
+#ifndef PERL_MAGIC_glob
+# define PERL_MAGIC_glob '*'
+#endif
+
+#ifndef PERL_MAGIC_arylen
+# define PERL_MAGIC_arylen '#'
+#endif
+
+#ifndef PERL_MAGIC_pos
+# define PERL_MAGIC_pos '.'
+#endif
+
+#ifndef PERL_MAGIC_backref
+# define PERL_MAGIC_backref '<'
+#endif
+
+#ifndef PERL_MAGIC_ext
+# define PERL_MAGIC_ext '~'
+#endif
+
+/* That's the best we can do... */
+#ifndef SvPV_force_nomg
+# define SvPV_force_nomg SvPV_force
+#endif
+
+#ifndef SvPV_nomg
+# define SvPV_nomg SvPV
+#endif
+
+#ifndef sv_catpvn_nomg
+# define sv_catpvn_nomg sv_catpvn
+#endif
+
+#ifndef sv_catsv_nomg
+# define sv_catsv_nomg sv_catsv
+#endif
+
+#ifndef sv_setsv_nomg
+# define sv_setsv_nomg sv_setsv
+#endif
+
+#ifndef sv_pvn_nomg
+# define sv_pvn_nomg sv_pvn
+#endif
+
+#ifndef SvIV_nomg
+# define SvIV_nomg SvIV
+#endif
+
+#ifndef SvUV_nomg
+# define SvUV_nomg SvUV
+#endif
+
+#ifndef sv_catpv_mg
+# define sv_catpv_mg(sv, ptr) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_catpv(TeMpSv,ptr); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_catpvn_mg
+# define sv_catpvn_mg(sv, ptr, len) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_catpvn(TeMpSv,ptr,len); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_catsv_mg
+# define sv_catsv_mg(dsv, ssv) \
+ STMT_START { \
+ SV *TeMpSv = dsv; \
+ sv_catsv(TeMpSv,ssv); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setiv_mg
+# define sv_setiv_mg(sv, i) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setiv(TeMpSv,i); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setnv_mg
+# define sv_setnv_mg(sv, num) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setnv(TeMpSv,num); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setpv_mg
+# define sv_setpv_mg(sv, ptr) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setpv(TeMpSv,ptr); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setpvn_mg
+# define sv_setpvn_mg(sv, ptr, len) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setpvn(TeMpSv,ptr,len); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setsv_mg
+# define sv_setsv_mg(dsv, ssv) \
+ STMT_START { \
+ SV *TeMpSv = dsv; \
+ sv_setsv(TeMpSv,ssv); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setuv_mg
+# define sv_setuv_mg(sv, i) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setuv(TeMpSv,i); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_usepvn_mg
+# define sv_usepvn_mg(sv, ptr, len) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_usepvn(TeMpSv,ptr,len); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifdef USE_ITHREADS
+#ifndef CopFILE
+# define CopFILE(c) ((c)->cop_file)
+#endif
+
+#ifndef CopFILEGV
+# define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv)
+#endif
+
+#ifndef CopFILE_set
+# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv))
+#endif
+
+#ifndef CopFILESV
+# define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
+#endif
+
+#ifndef CopFILEAV
+# define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
+#endif
+
+#ifndef CopSTASHPV
+# define CopSTASHPV(c) ((c)->cop_stashpv)
+#endif
+
+#ifndef CopSTASHPV_set
+# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
+#endif
+
+#ifndef CopSTASH
+# define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
+#endif
+
+#ifndef CopSTASH_set
+# define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
+#endif
+
+#ifndef CopSTASH_eq
+# define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \
+ || (CopSTASHPV(c) && HvNAME(hv) \
+ && strEQ(CopSTASHPV(c), HvNAME(hv)))))
+#endif
+
+#else
+#ifndef CopFILEGV
+# define CopFILEGV(c) ((c)->cop_filegv)
+#endif
+
+#ifndef CopFILEGV_set
+# define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
+#endif
+
+#ifndef CopFILE_set
+# define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv))
+#endif
+
+#ifndef CopFILESV
+# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
+#endif
+
+#ifndef CopFILEAV
+# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
+#endif
+
+#ifndef CopFILE
+# define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
+#endif
+
+#ifndef CopSTASH
+# define CopSTASH(c) ((c)->cop_stash)
+#endif
+
+#ifndef CopSTASH_set
+# define CopSTASH_set(c,hv) ((c)->cop_stash = (hv))
+#endif
+
+#ifndef CopSTASHPV
+# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
+#endif
+
+#ifndef CopSTASHPV_set
+# define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
+#endif
+
+#ifndef CopSTASH_eq
+# define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv))
+#endif
+
+#endif /* USE_ITHREADS */
+#ifndef IN_PERL_COMPILETIME
+# define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling)
+#endif
+
+#ifndef IN_LOCALE_RUNTIME
+# define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE)
+#endif
+
+#ifndef IN_LOCALE_COMPILETIME
+# define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE)
+#endif
+
+#ifndef IN_LOCALE
+# define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
+#endif
+#ifndef IS_NUMBER_IN_UV
+# define IS_NUMBER_IN_UV 0x01
+#endif
+
+#ifndef IS_NUMBER_GREATER_THAN_UV_MAX
+# define IS_NUMBER_GREATER_THAN_UV_MAX 0x02
+#endif
+
+#ifndef IS_NUMBER_NOT_INT
+# define IS_NUMBER_NOT_INT 0x04
+#endif
+
+#ifndef IS_NUMBER_NEG
+# define IS_NUMBER_NEG 0x08
+#endif
+
+#ifndef IS_NUMBER_INFINITY
+# define IS_NUMBER_INFINITY 0x10
+#endif
+
+#ifndef IS_NUMBER_NAN
+# define IS_NUMBER_NAN 0x20
+#endif
+
+/* GROK_NUMERIC_RADIX depends on grok_numeric_radix */
+#ifndef GROK_NUMERIC_RADIX
+# define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send)
+#endif
+#ifndef PERL_SCAN_GREATER_THAN_UV_MAX
+# define PERL_SCAN_GREATER_THAN_UV_MAX 0x02
+#endif
+
+#ifndef PERL_SCAN_SILENT_ILLDIGIT
+# define PERL_SCAN_SILENT_ILLDIGIT 0x04
+#endif
+
+#ifndef PERL_SCAN_ALLOW_UNDERSCORES
+# define PERL_SCAN_ALLOW_UNDERSCORES 0x01
+#endif
+
+#ifndef PERL_SCAN_DISALLOW_PREFIX
+# define PERL_SCAN_DISALLOW_PREFIX 0x02
+#endif
+
+#ifndef grok_numeric_radix
+#if defined(NEED_grok_numeric_radix)
+static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+static
+#else
+extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+#endif
+
+#ifdef grok_numeric_radix
+# undef grok_numeric_radix
+#endif
+#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b)
+#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix)
+
+#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL)
+bool
+DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
+{
+#ifdef USE_LOCALE_NUMERIC
+#ifdef PL_numeric_radix_sv
+ if (PL_numeric_radix_sv && IN_LOCALE) {
+ STRLEN len;
+ char* radix = SvPV(PL_numeric_radix_sv, len);
+ if (*sp + len <= send && memEQ(*sp, radix, len)) {
+ *sp += len;
+ return TRUE;
+ }
+ }
+#else
+ /* older perls don't have PL_numeric_radix_sv so the radix
+ * must manually be requested from locale.h
+ */
+#include <locale.h>
+ dTHR; /* needed for older threaded perls */
+ struct lconv *lc = localeconv();
+ char *radix = lc->decimal_point;
+ if (radix && IN_LOCALE) {
+ STRLEN len = strlen(radix);
+ if (*sp + len <= send && memEQ(*sp, radix, len)) {
+ *sp += len;
+ return TRUE;
+ }
+ }
+#endif /* PERL_VERSION */
+#endif /* USE_LOCALE_NUMERIC */
+ /* always try "." if numeric radix didn't match because
+ * we may have data from different locales mixed */
+ if (*sp < send && **sp == '.') {
+ ++*sp;
+ return TRUE;
+ }
+ return FALSE;
+}
+#endif
+#endif
+
+/* grok_number depends on grok_numeric_radix */
+
+#ifndef grok_number
+#if defined(NEED_grok_number)
+static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+static
+#else
+extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+#endif
+
+#ifdef grok_number
+# undef grok_number
+#endif
+#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c)
+#define Perl_grok_number DPPP_(my_grok_number)
+
+#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL)
+int
+DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep)
+{
+ const char *s = pv;
+ const char *send = pv + len;
+ const UV max_div_10 = UV_MAX / 10;
+ const char max_mod_10 = UV_MAX % 10;
+ int numtype = 0;
+ int sawinf = 0;
+ int sawnan = 0;
+
+ while (s < send && isSPACE(*s))
+ s++;
+ if (s == send) {
+ return 0;
+ } else if (*s == '-') {
+ s++;
+ numtype = IS_NUMBER_NEG;
+ }
+ else if (*s == '+')
+ s++;
+
+ if (s == send)
+ return 0;
+
+ /* next must be digit or the radix separator or beginning of infinity */
+ if (isDIGIT(*s)) {
+ /* UVs are at least 32 bits, so the first 9 decimal digits cannot
+ overflow. */
+ UV value = *s - '0';
+ /* This construction seems to be more optimiser friendly.
+ (without it gcc does the isDIGIT test and the *s - '0' separately)
+ With it gcc on arm is managing 6 instructions (6 cycles) per digit.
+ In theory the optimiser could deduce how far to unroll the loop
+ before checking for overflow. */
+ if (++s < send) {
+ int digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ /* Now got 9 digits, so need to check
+ each time for overflow. */
+ digit = *s - '0';
+ while (digit >= 0 && digit <= 9
+ && (value < max_div_10
+ || (value == max_div_10
+ && digit <= max_mod_10))) {
+ value = value * 10 + digit;
+ if (++s < send)
+ digit = *s - '0';
+ else
+ break;
+ }
+ if (digit >= 0 && digit <= 9
+ && (s < send)) {
+ /* value overflowed.
+ skip the remaining digits, don't
+ worry about setting *valuep. */
+ do {
+ s++;
+ } while (s < send && isDIGIT(*s));
+ numtype |=
+ IS_NUMBER_GREATER_THAN_UV_MAX;
+ goto skip_value;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ numtype |= IS_NUMBER_IN_UV;
+ if (valuep)
+ *valuep = value;
+
+ skip_value:
+ if (GROK_NUMERIC_RADIX(&s, send)) {
+ numtype |= IS_NUMBER_NOT_INT;
+ while (s < send && isDIGIT(*s)) /* optional digits after the radix */
+ s++;
+ }
+ }
+ else if (GROK_NUMERIC_RADIX(&s, send)) {
+ numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
+ /* no digits before the radix means we need digits after it */
+ if (s < send && isDIGIT(*s)) {
+ do {
+ s++;
+ } while (s < send && isDIGIT(*s));
+ if (valuep) {
+ /* integer approximation is valid - it's 0. */
+ *valuep = 0;
+ }
+ }
+ else
+ return 0;
+ } else if (*s == 'I' || *s == 'i') {
+ s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+ s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
+ s++; if (s < send && (*s == 'I' || *s == 'i')) {
+ s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+ s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
+ s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
+ s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
+ s++;
+ }
+ sawinf = 1;
+ } else if (*s == 'N' || *s == 'n') {
+ /* XXX TODO: There are signaling NaNs and quiet NaNs. */
+ s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
+ s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+ s++;
+ sawnan = 1;
+ } else
+ return 0;
+
+ if (sawinf) {
+ numtype &= IS_NUMBER_NEG; /* Keep track of sign */
+ numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
+ } else if (sawnan) {
+ numtype &= IS_NUMBER_NEG; /* Keep track of sign */
+ numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
+ } else if (s < send) {
+ /* we can have an optional exponent part */
+ if (*s == 'e' || *s == 'E') {
+ /* The only flag we keep is sign. Blow away any "it's UV" */
+ numtype &= IS_NUMBER_NEG;
+ numtype |= IS_NUMBER_NOT_INT;
+ s++;
+ if (s < send && (*s == '-' || *s == '+'))
+ s++;
+ if (s < send && isDIGIT(*s)) {
+ do {
+ s++;
+ } while (s < send && isDIGIT(*s));
+ }
+ else
+ return 0;
+ }
+ }
+ while (s < send && isSPACE(*s))
+ s++;
+ if (s >= send)
+ return numtype;
+ if (len == 10 && memEQ(pv, "0 but true", 10)) {
+ if (valuep)
+ *valuep = 0;
+ return IS_NUMBER_IN_UV;
+ }
+ return 0;
+}
+#endif
+#endif
+
+/*
+ * The grok_* routines have been modified to use warn() instead of
+ * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit,
+ * which is why the stack variable has been renamed to 'xdigit'.
+ */
+
+#ifndef grok_bin
+#if defined(NEED_grok_bin)
+static UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+static
+#else
+extern UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+#endif
+
+#ifdef grok_bin
+# undef grok_bin
+#endif
+#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d)
+#define Perl_grok_bin DPPP_(my_grok_bin)
+
+#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL)
+UV
+DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+ const char *s = start;
+ STRLEN len = *len_p;
+ UV value = 0;
+ NV value_nv = 0;
+
+ const UV max_div_2 = UV_MAX / 2;
+ bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+ bool overflowed = FALSE;
+
+ if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+ /* strip off leading b or 0b.
+ for compatibility silently suffer "b" and "0b" as valid binary
+ numbers. */
+ if (len >= 1) {
+ if (s[0] == 'b') {
+ s++;
+ len--;
+ }
+ else if (len >= 2 && s[0] == '0' && s[1] == 'b') {
+ s+=2;
+ len-=2;
+ }
+ }
+ }
+
+ for (; len-- && *s; s++) {
+ char bit = *s;
+ if (bit == '0' || bit == '1') {
+ /* Write it in this wonky order with a goto to attempt to get the
+ compiler to make the common case integer-only loop pretty tight.
+ With gcc seems to be much straighter code than old scan_bin. */
+ redo:
+ if (!overflowed) {
+ if (value <= max_div_2) {
+ value = (value << 1) | (bit - '0');
+ continue;
+ }
+ /* Bah. We're just overflowed. */
+ warn("Integer overflow in binary number");
+ overflowed = TRUE;
+ value_nv = (NV) value;
+ }
+ value_nv *= 2.0;
+ /* If an NV has not enough bits in its mantissa to
+ * represent a UV this summing of small low-order numbers
+ * is a waste of time (because the NV cannot preserve
+ * the low-order bits anyway): we could just remember when
+ * did we overflow and in the end just multiply value_nv by the
+ * right amount. */
+ value_nv += (NV)(bit - '0');
+ continue;
+ }
+ if (bit == '_' && len && allow_underscores && (bit = s[1])
+ && (bit == '0' || bit == '1'))
+ {
+ --len;
+ ++s;
+ goto redo;
+ }
+ if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+ warn("Illegal binary digit '%c' ignored", *s);
+ break;
+ }
+
+ if ( ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+ || (!overflowed && value > 0xffffffff )
+#endif
+ ) {
+ warn("Binary number > 0b11111111111111111111111111111111 non-portable");
+ }
+ *len_p = s - start;
+ if (!overflowed) {
+ *flags = 0;
+ return value;
+ }
+ *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+ if (result)
+ *result = value_nv;
+ return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_hex
+#if defined(NEED_grok_hex)
+static UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+static
+#else
+extern UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+#endif
+
+#ifdef grok_hex
+# undef grok_hex
+#endif
+#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d)
+#define Perl_grok_hex DPPP_(my_grok_hex)
+
+#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL)
+UV
+DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+ const char *s = start;
+ STRLEN len = *len_p;
+ UV value = 0;
+ NV value_nv = 0;
+
+ const UV max_div_16 = UV_MAX / 16;
+ bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+ bool overflowed = FALSE;
+ const char *xdigit;
+
+ if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+ /* strip off leading x or 0x.
+ for compatibility silently suffer "x" and "0x" as valid hex numbers.
+ */
+ if (len >= 1) {
+ if (s[0] == 'x') {
+ s++;
+ len--;
+ }
+ else if (len >= 2 && s[0] == '0' && s[1] == 'x') {
+ s+=2;
+ len-=2;
+ }
+ }
+ }
+
+ for (; len-- && *s; s++) {
+ xdigit = strchr((char *) PL_hexdigit, *s);
+ if (xdigit) {
+ /* Write it in this wonky order with a goto to attempt to get the
+ compiler to make the common case integer-only loop pretty tight.
+ With gcc seems to be much straighter code than old scan_hex. */
+ redo:
+ if (!overflowed) {
+ if (value <= max_div_16) {
+ value = (value << 4) | ((xdigit - PL_hexdigit) & 15);
+ continue;
+ }
+ warn("Integer overflow in hexadecimal number");
+ overflowed = TRUE;
+ value_nv = (NV) value;
+ }
+ value_nv *= 16.0;
+ /* If an NV has not enough bits in its mantissa to
+ * represent a UV this summing of small low-order numbers
+ * is a waste of time (because the NV cannot preserve
+ * the low-order bits anyway): we could just remember when
+ * did we overflow and in the end just multiply value_nv by the
+ * right amount of 16-tuples. */
+ value_nv += (NV)((xdigit - PL_hexdigit) & 15);
+ continue;
+ }
+ if (*s == '_' && len && allow_underscores && s[1]
+ && (xdigit = strchr((char *) PL_hexdigit, s[1])))
+ {
+ --len;
+ ++s;
+ goto redo;
+ }
+ if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+ warn("Illegal hexadecimal digit '%c' ignored", *s);
+ break;
+ }
+
+ if ( ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+ || (!overflowed && value > 0xffffffff )
+#endif
+ ) {
+ warn("Hexadecimal number > 0xffffffff non-portable");
+ }
+ *len_p = s - start;
+ if (!overflowed) {
+ *flags = 0;
+ return value;
+ }
+ *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+ if (result)
+ *result = value_nv;
+ return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_oct
+#if defined(NEED_grok_oct)
+static UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+static
+#else
+extern UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+#endif
+
+#ifdef grok_oct
+# undef grok_oct
+#endif
+#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d)
+#define Perl_grok_oct DPPP_(my_grok_oct)
+
+#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL)
+UV
+DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+ const char *s = start;
+ STRLEN len = *len_p;
+ UV value = 0;
+ NV value_nv = 0;
+
+ const UV max_div_8 = UV_MAX / 8;
+ bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+ bool overflowed = FALSE;
+
+ for (; len-- && *s; s++) {
+ /* gcc 2.95 optimiser not smart enough to figure that this subtraction
+ out front allows slicker code. */
+ int digit = *s - '0';
+ if (digit >= 0 && digit <= 7) {
+ /* Write it in this wonky order with a goto to attempt to get the
+ compiler to make the common case integer-only loop pretty tight.
+ */
+ redo:
+ if (!overflowed) {
+ if (value <= max_div_8) {
+ value = (value << 3) | digit;
+ continue;
+ }
+ /* Bah. We're just overflowed. */
+ warn("Integer overflow in octal number");
+ overflowed = TRUE;
+ value_nv = (NV) value;
+ }
+ value_nv *= 8.0;
+ /* If an NV has not enough bits in its mantissa to
+ * represent a UV this summing of small low-order numbers
+ * is a waste of time (because the NV cannot preserve
+ * the low-order bits anyway): we could just remember when
+ * did we overflow and in the end just multiply value_nv by the
+ * right amount of 8-tuples. */
+ value_nv += (NV)digit;
+ continue;
+ }
+ if (digit == ('_' - '0') && len && allow_underscores
+ && (digit = s[1] - '0') && (digit >= 0 && digit <= 7))
+ {
+ --len;
+ ++s;
+ goto redo;
+ }
+ /* Allow \octal to work the DWIM way (that is, stop scanning
+ * as soon as non-octal characters are seen, complain only iff
+ * someone seems to want to use the digits eight and nine). */
+ if (digit == 8 || digit == 9) {
+ if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+ warn("Illegal octal digit '%c' ignored", *s);
+ }
+ break;
+ }
+
+ if ( ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+ || (!overflowed && value > 0xffffffff )
+#endif
+ ) {
+ warn("Octal number > 037777777777 non-portable");
+ }
+ *len_p = s - start;
+ if (!overflowed) {
+ *flags = 0;
+ return value;
+ }
+ *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+ if (result)
+ *result = value_nv;
+ return UV_MAX;
+}
+#endif
+#endif
+
+#ifdef NO_XSLOCKS
+# ifdef dJMPENV
+# define dXCPT dJMPENV; int rEtV = 0
+# define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0)
+# define XCPT_TRY_END JMPENV_POP;
+# define XCPT_CATCH if (rEtV != 0)
+# define XCPT_RETHROW JMPENV_JUMP(rEtV)
+# else
+# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0
+# define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0)
+# define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf);
+# define XCPT_CATCH if (rEtV != 0)
+# define XCPT_RETHROW Siglongjmp(top_env, rEtV)
+# endif
+#endif
+
+#endif /* _P_P_PORTABILITY_H_ */
+
+/* End of File ppport.h */
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/regmach.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/regmach.h
new file mode 100755
index 00000000000..ed1e30374ab
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/regmach.h
@@ -0,0 +1,89 @@
+#ifndef _REGMACH_H_
+#define _REGMACH_H_
+
+#include <stdio.h>
+#include <math.h>
+#include "imager.h"
+
+enum rm_byte_codes {
+ rbc_add, /* ra + rb -> r*/
+ rbc_subtract, /* ra - rb -> r */
+ rbc_mult, /* ra * rb -> r */
+ rbc_div, /* ra / rb -> r */
+ rbc_mod, /* ra % rb -> r */
+ rbc_pow, /* ra ** rb -> r */
+ rbc_uminus, /* -ra -> r */
+ rbc_multp, /* pa ** rb -> p */
+ rbc_addp, /* pa + pb -> p */
+ rbc_subtractp, /* pa - pb -> p */
+ /* rbcParm, we just preload a register */
+ rbc_sin, /* sin(ra) -> r */
+ rbc_cos, /* cos(ra) -> r */
+ rbc_atan2, /* atan2(ra,rb) -> r */
+ rbc_sqrt, /* sqrt(ra) -> r */
+ rbc_distance, /* distance(rx, ry, rx, ry) -> r */
+ /* getp? codes must be in order */
+ rbc_getp1, /* getp1(ra, rb) -> p */
+ rbc_getp2, /* getp2(ra, rb) -> p */
+ rbc_getp3, /* getp3(ra, rb) -> p */
+ rbc_value, /* value(pa) -> r */
+ rbc_hue, /* hue(pa) -> r */
+ rbc_sat, /* sat(pa) -> r */
+ rbc_hsv, /* hsv(rh, rs, rv) -> p */
+ rbc_red, /* red(pa) -> r */
+ rbc_green, /* green(pa) -> r */
+ rbc_blue, /* blue(pa) -> r */
+ rbc_rgb, /* rgb(rr, rg, rb) -> p */
+ rbc_int, /* int(ra) -> r */
+ rbc_if, /* if(rc, rt, rf) -> r */
+ rbc_ifp, /* if(rc, pt, pf) -> p */
+ rbc_le, /* ra <= rb -> r */
+ rbc_lt, /* ra < rb -> r */
+ rbc_ge, /* ra >= rb -> r */
+ rbc_gt, /* ra > rb -> r */
+ rbc_eq, /* ra == rb -> r -- does approx equal */
+ rbc_ne, /* ra != rb -> r -- does approx equal */
+ rbc_and, /* ra && rb -> r */
+ rbc_or, /* ra || rb -> r */
+ rbc_not, /* !ra -> r */
+ rbc_abs, /* abs(ra) -> r */
+ rbc_ret, /* returns pa */
+ rbc_jump, /* jump to ja */
+ rbc_jumpz, /* jump if ra == 0 to jb */
+ rbc_jumpnz, /* jump if ra != 0 to jb */
+ rbc_set, /* ra -> r */
+ rbc_setp, /* pa -> p*/
+ rbc_print, /* print(ra) -> r -- prints, leaves on stack */
+ rbc_rgba, /* rgba(ra, rb, rc, rd) -> p */
+ rbc_hsva, /* hsva(ra, rb, rc, rd) -> p */
+ rbc_alpha, /* alpha(pa) -> r */
+ rbc_log, /* log(ra) -> r */
+ rbc_exp, /* exp(ra) -> r */
+ rbc_det, /* det(ra, rb, rc, rd) -> r */
+ rbc_op_count
+};
+
+/* rm_word was originally char, but even for some simpler expressions
+ I was getting close to running out of register numbers.
+ It should also simplify structure alignment issues. (I hope.)
+*/
+typedef int rm_word;
+#define RM_WORD_PACK "i"
+
+struct rm_op {
+ rm_word code; /* op code */
+ rm_word ra; /* first operand */
+ rm_word rb; /* possible second operand */
+ rm_word rc; /* possible third operand */
+ rm_word rd; /* possible fourth operand */
+ rm_word rout; /* output register */
+};
+
+i_color i_rm_run(struct rm_op codes[], size_t code_count,
+ double n_regs[], size_t n_regs_count,
+ i_color c_regs[], size_t c_regs_count,
+ i_img *images[], size_t image_count);
+
+/* op_run(fx, sizeof(fx), parms, 2)) */
+
+#endif /* _REGMACH_H_ */
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/rendert.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/rendert.h
new file mode 100755
index 00000000000..2eb79a25676
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/rendert.h
@@ -0,0 +1,17 @@
+#ifndef IMAGER_RENDERT_H
+#define IMAGER_RENDERT_H
+
+typedef struct {
+ int magic;
+ i_img *im;
+
+ int line_width;
+ i_color *line_8;
+ i_fcolor *line_double;
+
+ int fill_width;
+ i_color *fill_line_8;
+ i_fcolor *fill_line_double;
+} i_render;
+
+#endif
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/include/stackmach.h b/Master/tlpkg/tlperl.straw/lib/Imager/include/stackmach.h
new file mode 100755
index 00000000000..d70572b227e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/include/stackmach.h
@@ -0,0 +1,25 @@
+#ifndef _STACKMACH_H_
+#define _STACKMACH_H_
+
+#include <stdio.h>
+#include <math.h>
+
+enum ByteCodes {
+ bcAdd,
+ bcSubtract,
+ bcMult,
+ bcDiv,
+ bcParm,
+ bcSin,
+ bcCos
+};
+
+double i_op_run(int codes[], size_t code_size, double parms[], size_t parm_size);
+
+/* op_run(fx, sizeof(fx), parms, 2)) */
+
+
+
+
+
+#endif /* _STACKMACH_H_ */
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/interface.pod b/Master/tlpkg/tlperl.straw/lib/Imager/interface.pod
new file mode 100755
index 00000000000..580e6e5fc8a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/interface.pod
@@ -0,0 +1,343 @@
+=head1 NAME
+
+Imager::interface.pod - decribes the C level virtual image interface
+
+=head1 SYNOPSIS
+
+
+=head1 DESCRIPTION
+
+The Imager virtual interface aims to allow image types to be created
+for special purposes, both to allow consistent access to images with
+different sample sizes, and organizations, but also to allow creation
+of synthesized or virtual images.
+
+This is a C level interface rather than Perl.
+
+=head2 Existing Images
+
+As of this writing we have the following concrete image types:
+
+=over
+
+=item *
+
+8-bit/sample direct images
+
+=item *
+
+16-bit/sample direct images
+
+=item *
+
+double/sample direct images
+
+=item *
+
+8-bit/sample 8-bit/index paletted images
+
+=back
+
+Currently there is only one virtual image type:
+
+=over
+
+=item *
+
+masked images, where a mask image can control write access to an
+underlying image.
+
+=back
+
+Other possible concrete images include:
+
+=over
+
+=item *
+
+"bitmaps", 1 bit/sample images (perhaps limited to a single channel)
+
+=item *
+
+16-bit/index paletted images
+
+=back
+
+Some other possible virtual images:
+
+=over
+
+=item *
+
+image alpha combining, where the combining function can be specified
+(see the layer modes in graphical editors like the GIMP or photoshop.
+
+=back
+
+=head1 THE INTERFACE
+
+Each image type needs to define a number of functions which implement
+the image operations.
+
+The image structure includes information describes the image, which
+can be used to determine the structure of the image:
+
+=over
+
+=item channels
+
+the number of samples kept for each pixel in the image. For paletted
+images the samples are kept for each entry in the palette.
+
+=item xsize, ysize
+
+the dimensions of the image in pixels.
+
+=item bytes
+
+the number of bytes of data kept for the image. Zero for virtual
+images. Does not include the space required for the palette for
+paletted images.
+
+=item ch_mask
+
+controls which samples will be written to for direct images.
+
+=item bits
+
+the number of bits kept for each sample. There are enum values
+i_8_bits, i_16_bits and i_double_bits (64).
+
+=item type
+
+the type of image, either i_direct_type or i_palette_type. Direct
+images keep the samples for every pixel image, while i_palette_type
+images keep an index into a color table for each pixel.
+
+=item virtual
+
+whether the image keeps any pixel data. If this is non-zero then
+idata points to image data, otherwise it points to implementation
+defined data, though ext_data is more likely to be used for that.
+
+=item idata
+
+image data. If the image is 8-bit direct, non-virtual, then this
+consists of each sample of the image stored one after another,
+otherwise it is implementation defined.
+
+=item tags
+
+will be used to store meta-data for an image, eg. tags from a TIFF
+file, or animation information from a GIF file. This should be
+initialized with a call to i_tags_new() in your image constructor if
+creating a new image type.
+
+=item ext_data
+
+for internal use of image types. This is not released by the standard
+i_img_exorcise() function. If you create a new image type and want to
+store a pointer to allocated memory here you should point i_f_destroy
+at a function that will release the data.
+
+=back
+
+If a caller has no knowledge of the internal format of an image, the
+caller must call the appropriate image function pointer. Imager
+provides macros that wrap these functions, so it isn't necessary to
+call them directly.
+
+Many functions have a similar function with an 'f' suffix, these take
+or return samples specified with floating point values rather than
+8-bit integers (unsigned char). Floating point samples are returned
+in the range 0 to 1 inclusive.
+
+=over
+
+=item i_f_ppix(im, x, y, color)
+
+=item i_f_ppixf(im, x, y, fcolor)
+
+stores the specified color at pixel (x,y) in the image. If the pixel
+can be stored return 0, otherwise -1. An image type may choose to
+return 0 under some circumstances, eg. writing to a masked area of an
+image. The color or fcolor always contains the actual samples to be
+written, rather than a palette index.
+
+=item i_f_plin(im, l, r, y, colors)
+
+=item i_f_plinf(im, l, r, y, fcolors)
+
+stores (r-l) pixels at positions (l,y) ... (r-1, y) from the array
+specified by colors (or fcolors). Returns the number of pixels
+written to. If l is negative it will return 0. If r > im->xsize then
+only (im->xsize - l) will be written.
+
+=item i_f_gpix(im, x, y, color)
+
+=item i_f_gpixf(im, x, y, fcolor)
+
+retrieves a single pixel from position (x,y). This returns the
+samples rather than the index for paletted images.
+
+=item i_f_glin(im, l, r, y, colors)
+
+=item i_f_glinf(im, l, r, y, fcolors)
+
+retrieves (r-l) pixels from positions (l, y) through (r-1, y) into the
+array specified by colors. Returns the number of pixels retrieved.
+If l < 0 no pixels are retrieved. If r > im->xsize then pixels (l, y)
+... (im->xsize-1, y) are retrieved. Retrieves the samples rather than
+the color indexes for paletted images.
+
+=item i_f_gsamp(im, l, r, y, samples, chans, chan_count)
+
+=item i_f_gsampf(im, l, r, y, fsamples, chans, chan_count)
+
+Retrieves samples from channels specified by chans (for length
+chan_count) from pixels at positions (l,y) ... (r-1, y). If chans is
+NULL then samples from channels 0 ... chan_count-1 will be retrieved.
+Returns the number of sample retrieved (_not_ the number of channels).
+If a channel in chans is not present in the image or l < 0, returns 0.
+If r > im->xsize, then the samples from (l,y) ... (im->xsize-1, y) are
+returned.
+
+=back
+
+The following are for images where type == i_palette_type only.
+
+=over
+
+=item i_f_gpal(im, l, r, y, vals)
+
+Retrieves color indexes from the image for pixels (l, y) ... (r-1, y)
+into vals. Returns the number of indexes retrieved.
+
+=item i_f_ppal(im, l, r, y, vals)
+
+Stores color indexes into the image for pixels (l, y) ... (r-1, y)
+from vals. Returns the number of indexes retrieved. If indices are
+outside the range of the images palette, then you may have problems
+reading those pixels with i_gpix() or i_glin().
+
+=item i_f_addcolors(im, colors, count)
+
+Adds the count colors to the image's palette. Returns the index of
+the first color added, or -1 if there is not enough space for count
+colors.
+
+=item i_f_getcolors(im, index, colors, count)
+
+Retrieves count colors from the image's palette starting from entry
+index in the palette. Returns non-zero on success.
+
+=item i_f_colorcount(im)
+
+Returns the number of colors in the image's palette. Returns -1 if
+this is not a paletted image.
+
+=item i_f_maxcolors(im)
+
+Returns the maximum number of colors that can fit in the image's
+palette. Returns -1 if this is not a paletted image.
+
+=item i_f_findcolor(im, color, entry)
+
+Searches the image's palette for the specified color, setting *entry
+to the index and returning non-zero. Returns zero if the color is not
+found.
+
+=item i_f_setcolors_t(im, index, colors, count)
+
+Sets count colors starting from index in the image from the array
+colors. The colors to be set must already have entries in the image's
+palette. Returns non-zero on success.
+
+=back
+
+Finally, the i_f_destroy function pointer can be set which is called
+when the image is destroyed. This can be used to release memory
+pointed to by ext_data or release any other resources.
+
+When writing to a paletted image with i_ppix() or i_plin() and the
+color you are writing doesn't exist in the image, then it's possible
+that the image will be internally converted to a direct image with the
+same number of channels.
+
+=head1 TOOLS
+
+Several functions have been written to simplify creating new image types.
+
+These tools are available by including imagei.h.
+
+=head2 Floating point wrappers
+
+These functions implement the floating point sample versions of each
+interface function in terms of the integer sample version.
+
+These are:
+
+=over
+
+=item i_ppixf_fp
+
+=item i_gpixf_fp
+
+=item i_plinf_fp
+
+=item i_glinf_fp
+
+=item i_gsampf_fp
+
+=back
+
+
+=head2 Forwarding functions
+
+These functions are used in virtual images where the call should
+simply be forwarded to the underlying image. The underlying image is
+assumed to be the first pointer in a structure pointed at by ext_data.
+
+If this is not the case then these functions will just crash :)
+
+=over
+
+=item i_addcolors_forward
+
+=item i_getcolors_forward
+
+=item i_colorcount_forward
+
+=item i_maxcolors_forward
+
+=item i_findcolor_forward
+
+=item i_setcolors_forward
+
+=back
+
+=head2 Sample macros
+
+Imagei.h defines several macros for converting samples between
+different sizes.
+
+Each macro is of the form SampleI<size>ToI<size> where I<size> is one
+of 8, 16, or F (for floating-point samples).
+
+=over
+
+=item SampleFTo16(sample)
+
+=item Sample16ToF(sample)
+
+=item SampleFTo8(sample)
+
+=item Sample8ToF(sample)
+
+=item Sample16To8(num)
+
+=item Sample8To16(num)
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/regmach.pod b/Master/tlpkg/tlperl.straw/lib/Imager/regmach.pod
new file mode 100755
index 00000000000..844742d6d8a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/regmach.pod
@@ -0,0 +1,103 @@
+=head1 NAME
+
+Imager::regmach - documents the register virtual machine used by
+Imager::transform2().
+
+=head1 SYNOPSIS
+
+The register machine is a complete rewrite of the stack machine
+orginally used by Imager::transform(), written for use by
+Imager::transform2().
+
+=head1 DESCRIPTION
+
+(This document might be a little incoherent.)
+
+The register machine is a fast implementation of a small instruction
+set designed for evaluating an arithmetic expression to produce a
+colour for an image.
+
+The machine takes as input:
+
+=over 4
+
+=item instructions
+
+An array of instructions
+
+=item numeric registers
+
+An array of numeric registers. Some registers are initialized as
+literals.
+
+=item colour registers
+
+An array of colour registers. Currently these registers aren't
+initialized.
+
+=item input images
+
+An array of Imager i_img pointers. The getpn operators read pixels
+from these images.
+
+=back
+
+The instructions supplied each take up to 4 input numeric or colour
+registers with a single output numeric or colour register. The
+machine attempts to execute instructions as safely as possible,
+assuming that correct instructions have been provided, eg. the machine
+protects against divide by zero, but doesn't check register numbers
+for validity.
+
+The final instruction must be a 'ret' instruction, which returns the
+result ;)
+
+=head2 Adding new instructions
+
+To add a new instruction:
+
+=over 4
+
+=item 1
+
+Add a new opcode to the enumeration in regmach.h - make sure to add
+comment after the enum name giving the input registers (rX for
+numeric, pX for colour) that the instruction takes. These must be in
+the order that the instruction expects to take the. Put a letter (r
+or p) after -> to indicate the result type.
+
+=item 2
+
+Add a case to regmach.c that executes the instruction.
+
+=item 3
+
+make
+
+=back
+
+The makefile should rebuild the Regops.pm file, and your new
+instruction will be added as a function.
+
+If you want to add a single alternative instruction that might take
+different argument types (it must take the same number of parameters),
+create another instruction with that name followed by a p. The
+current expression parsers explicitly look for such instruction names.
+
+=head2 Future directions
+
+Conditional and non-conditional jumps to implement iteration. This
+will break the current optimizer in L<Imager::Expr> (and the compilers
+for both expression compilers, for that matter.)
+
+Complex arithmetic (Addi suggested this one). This would most likely
+be a separate machine. Otherwise we'll have a very significant
+performance loss.
+
+=head1 WARNINGS
+
+If you feed bad 'machine code' to the register machine, you have a
+good chance of a SIGSEGV.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Imager/typemap b/Master/tlpkg/tlperl.straw/lib/Imager/typemap
new file mode 100755
index 00000000000..4438d086a17
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Imager/typemap
@@ -0,0 +1,118 @@
+#i_img * T_PTR_NULL
+Imager::Color T_PTROBJ
+Imager::Color::Float T_PTROBJ
+Imager::ImgRaw T_IMAGER_IMAGE
+Imager::Font::TT T_PTROBJ
+Imager::IO T_PTROBJ
+Imager::Font::FT2 T_PTROBJ
+Imager::FillHandle T_PTROBJ
+Imager::Internal::Hlines T_PTROBJ
+const char * T_PV
+float T_FLOAT
+float* T_ARRAY
+undef_int T_IV_U
+undef_neg_int T_IV_NEGU
+HASH T_HVREF
+utf8_str T_UTF8_STR
+
+# these types are for use by Inline, which can't handle types containing ::
+Imager__Color T_PTROBJ_INV
+Imager__Color__Float T_PTROBJ_INV
+Imager__ImgRaw T_IMAGER_IMAGE
+Imager__FillHandle T_PTROBJ_INV
+Imager__IO T_PTROBJ_INV
+
+# mostly intended for non-Imager-core use
+Imager T_IMAGER_FULL_IMAGE
+
+#############################################################################
+INPUT
+T_PTR_NULL
+ if (SvOK($arg)) $var = INT2PTR($type,SvIV($arg));
+ else $var = NULL
+
+# the pre-5.8.0 T_AVREF input map was fixed in 5.8.0
+T_AVREF
+ if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV)
+ $var = (AV*)SvRV($arg);
+ else
+ Perl_croak(aTHX_ \"$var is not an array reference\")
+
+# handles Imager objects rather than just raw objects
+T_IMAGER_IMAGE
+ if (sv_derived_from($arg, \"Imager::ImgRaw\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = INT2PTR($type,tmp);
+ }
+ else if (sv_derived_from($arg, \"Imager\") &&
+ SvTYPE(SvRV($arg)) == SVt_PVHV) {
+ HV *hv = (HV *)SvRV($arg);
+ SV **sv = hv_fetch(hv, \"IMG\", 3, 0);
+ if (sv && *sv && sv_derived_from(*sv, \"Imager::ImgRaw\")) {
+ IV tmp = SvIV((SV*)SvRV(*sv));
+ $var = INT2PTR($type,tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"$var is not of type Imager::ImgRaw\");
+ }
+ else
+ Perl_croak(aTHX_ \"$var is not of type Imager::ImgRaw\");
+
+T_IMAGER_FULL_IMAGE
+ if (sv_derived_from($arg, \"Imager\") &&
+ SvTYPE(SvRV($arg)) == SVt_PVHV) {
+ HV *hv = (HV *)SvRV($arg);
+ SV **sv = hv_fetch(hv, \"IMG\", 3, 0);
+ if (sv && *sv && sv_derived_from(*sv, \"Imager::ImgRaw\")) {
+ IV tmp = SvIV((SV*)SvRV(*sv));
+ $var = INT2PTR($type,tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"$var is not of type Imager::ImgRaw\");
+ }
+ else
+ Perl_croak(aTHX_ \"$var is not of type Imager\");
+
+# same as T_PTROBJ, but replace __ with ::, the opposite of the way
+# xsubpp's processing works
+# this is to compensate for Inline's problem with type names containing ::
+T_PTROBJ_INV
+ if (sv_derived_from($arg, \"${(my $ntt=$ntype)=~s/__/::/g;\$ntt}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = INT2PTR($type,tmp);
+ }
+ else
+ croak(\"$var is not of type ${(my $ntt=$ntype)=~s/__/::/g;\$ntt}\");
+
+
+#############################################################################
+OUTPUT
+T_IV_U
+ if ($var == 0) $arg=&PL_sv_undef;
+ else sv_setiv($arg, (IV)$var);
+T_IV_NEGU
+ if ($var < 0) $arg=&PL_sv_undef;
+ else sv_setiv($arg, (IV)$var);
+T_PTR_NULL
+ sv_setiv($arg, (IV)$var);
+
+# same as T_PTROBJ
+T_IMAGER_IMAGE
+ sv_setref_pv($arg, \"Imager::ImgRaw\", (void*)$var);
+
+T_PTROBJ_INV
+ sv_setref_pv($arg, \"${(my $ntt=$ntype)=~s/__/::/g;\$ntt}\", (void*)$var);
+
+# ugh, the things we do for ease of use
+# this isn't suitable in some cases
+T_IMAGER_FULL_IMAGE
+ if ($var) {
+ SV *imobj = NEWSV(0, 0);
+ HV *hv = newHV();
+ sv_setref_pv(imobj, \"Imager::ImgRaw\", $var);
+ hv_store(hv, "IMG", 3, imobj, 0);
+ $arg = sv_2mortal(sv_bless(newRV_noinc((SV*)hv), gv_stashpv("Imager", 1)));
+ }
+ else {
+ $arg = &PL_sv_undef;
+ }
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Authen/Basic.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Authen/Basic.pm
new file mode 100755
index 00000000000..e7815bd247f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Authen/Basic.pm
@@ -0,0 +1,65 @@
+package LWP::Authen::Basic;
+use strict;
+
+require MIME::Base64;
+
+sub auth_header {
+ my($class, $user, $pass) = @_;
+ return "Basic " . MIME::Base64::encode("$user:$pass", "");
+}
+
+sub authenticate
+{
+ my($class, $ua, $proxy, $auth_param, $response,
+ $request, $arg, $size) = @_;
+
+ my $realm = $auth_param->{realm} || "";
+ my $url = $proxy ? $request->{proxy} : $request->uri_canonical;
+ return $response unless $url;
+ my $host_port = $url->host_port;
+ my $auth_header = $proxy ? "Proxy-Authorization" : "Authorization";
+
+ my @m = $proxy ? (m_proxy => $url) : (m_host_port => $host_port);
+ push(@m, realm => $realm);
+
+ my $h = $ua->get_my_handler("request_prepare", @m, sub {
+ $_[0]{callback} = sub {
+ my($req, $ua, $h) = @_;
+ my($user, $pass) = $ua->credentials($host_port, $h->{realm});
+ if (defined $user) {
+ my $auth_value = $class->auth_header($user, $pass, $req, $ua, $h);
+ $req->header($auth_header => $auth_value);
+ }
+ };
+ });
+ $h->{auth_param} = $auth_param;
+
+ if (!$proxy && !$request->header($auth_header) && $ua->credentials($host_port, $realm)) {
+ # we can make sure this handler applies and retry
+ add_path($h, $url->path);
+ return $ua->request($request->clone, $arg, $size, $response);
+ }
+
+ my($user, $pass) = $ua->get_basic_credentials($realm, $url, $proxy);
+ unless (defined $user and defined $pass) {
+ $ua->set_my_handler("request_prepare", undef, @m); # delete handler
+ return $response;
+ }
+
+ # check that the password has changed
+ my ($olduser, $oldpass) = $ua->credentials($host_port, $realm);
+ return $response if (defined $olduser and defined $oldpass and
+ $user eq $olduser and $pass eq $oldpass);
+
+ $ua->credentials($host_port, $realm, $user, $pass);
+ add_path($h, $url->path) unless $proxy;
+ return $ua->request($request->clone, $arg, $size, $response);
+}
+
+sub add_path {
+ my($h, $path) = @_;
+ $path =~ s,[^/]+\z,,;
+ push(@{$h->{m_path_prefix}}, $path);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Authen/Digest.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Authen/Digest.pm
new file mode 100755
index 00000000000..b9365ae1c12
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Authen/Digest.pm
@@ -0,0 +1,68 @@
+package LWP::Authen::Digest;
+
+use strict;
+use base 'LWP::Authen::Basic';
+
+require Digest::MD5;
+
+sub auth_header {
+ my($class, $user, $pass, $request, $ua, $h) = @_;
+
+ my $auth_param = $h->{auth_param};
+
+ my $nc = sprintf "%08X", ++$ua->{authen_md5_nonce_count}{$auth_param->{nonce}};
+ my $cnonce = sprintf "%8x", time;
+
+ my $uri = $request->uri->path_query;
+ $uri = "/" unless length $uri;
+
+ my $md5 = Digest::MD5->new;
+
+ my(@digest);
+ $md5->add(join(":", $user, $auth_param->{realm}, $pass));
+ push(@digest, $md5->hexdigest);
+ $md5->reset;
+
+ push(@digest, $auth_param->{nonce});
+
+ if ($auth_param->{qop}) {
+ push(@digest, $nc, $cnonce, ($auth_param->{qop} =~ m|^auth[,;]auth-int$|) ? 'auth' : $auth_param->{qop});
+ }
+
+ $md5->add(join(":", $request->method, $uri));
+ push(@digest, $md5->hexdigest);
+ $md5->reset;
+
+ $md5->add(join(":", @digest));
+ my($digest) = $md5->hexdigest;
+ $md5->reset;
+
+ my %resp = map { $_ => $auth_param->{$_} } qw(realm nonce opaque);
+ @resp{qw(username uri response algorithm)} = ($user, $uri, $digest, "MD5");
+
+ if (($auth_param->{qop} || "") =~ m|^auth([,;]auth-int)?$|) {
+ @resp{qw(qop cnonce nc)} = ("auth", $cnonce, $nc);
+ }
+
+ my(@order) = qw(username realm qop algorithm uri nonce nc cnonce response);
+ if($request->method =~ /^(?:POST|PUT)$/) {
+ $md5->add($request->content);
+ my $content = $md5->hexdigest;
+ $md5->reset;
+ $md5->add(join(":", @digest[0..1], $content));
+ $md5->reset;
+ $resp{"message-digest"} = $md5->hexdigest;
+ push(@order, "message-digest");
+ }
+ push(@order, "opaque");
+ my @pairs;
+ for (@order) {
+ next unless defined $resp{$_};
+ push(@pairs, "$_=" . qq("$resp{$_}"));
+ }
+
+ my $auth_value = "Digest " . join(", ", @pairs);
+ return $auth_value;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Authen/Ntlm.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Authen/Ntlm.pm
new file mode 100755
index 00000000000..31e2a9877e0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Authen/Ntlm.pm
@@ -0,0 +1,180 @@
+package LWP::Authen::Ntlm;
+
+use strict;
+use vars qw/$VERSION/;
+
+$VERSION = '5.827';
+
+use Authen::NTLM "1.02";
+use MIME::Base64 "2.12";
+
+sub authenticate {
+ my($class, $ua, $proxy, $auth_param, $response,
+ $request, $arg, $size) = @_;
+
+ my($user, $pass) = $ua->get_basic_credentials($auth_param->{realm},
+ $request->uri, $proxy);
+
+ unless(defined $user and defined $pass) {
+ return $response;
+ }
+
+ if (!$ua->conn_cache()) {
+ warn "The keep_alive option must be enabled for NTLM authentication to work. NTLM authentication aborted.\n";
+ return $response;
+ }
+
+ my($domain, $username) = split(/\\/, $user);
+
+ ntlm_domain($domain);
+ ntlm_user($username);
+ ntlm_password($pass);
+
+ my $auth_header = $proxy ? "Proxy-Authorization" : "Authorization";
+
+ # my ($challenge) = $response->header('WWW-Authenticate');
+ my $challenge;
+ foreach ($response->header('WWW-Authenticate')) {
+ last if /^NTLM/ && ($challenge=$_);
+ }
+
+ if ($challenge eq 'NTLM') {
+ # First phase, send handshake
+ my $auth_value = "NTLM " . ntlm();
+ ntlm_reset();
+
+ # Need to check this isn't a repeated fail!
+ my $r = $response;
+ my $retry_count = 0;
+ while ($r) {
+ my $auth = $r->request->header($auth_header);
+ ++$retry_count if ($auth && $auth eq $auth_value);
+ if ($retry_count > 2) {
+ # here we know this failed before
+ $response->header("Client-Warning" =>
+ "Credentials for '$user' failed before");
+ return $response;
+ }
+ $r = $r->previous;
+ }
+
+ my $referral = $request->clone;
+ $referral->header($auth_header => $auth_value);
+ return $ua->request($referral, $arg, $size, $response);
+ }
+
+ else {
+ # Second phase, use the response challenge (unless non-401 code
+ # was returned, in which case, we just send back the response
+ # object, as is
+ my $auth_value;
+ if ($response->code ne '401') {
+ return $response;
+ }
+ else {
+ my $challenge;
+ foreach ($response->header('WWW-Authenticate')) {
+ last if /^NTLM/ && ($challenge=$_);
+ }
+ $challenge =~ s/^NTLM //;
+ ntlm();
+ $auth_value = "NTLM " . ntlm($challenge);
+ ntlm_reset();
+ }
+
+ my $referral = $request->clone;
+ $referral->header($auth_header => $auth_value);
+ my $response2 = $ua->request($referral, $arg, $size, $response);
+ return $response2;
+ }
+}
+
+1;
+
+
+=head1 NAME
+
+LWP::Authen::Ntlm - Library for enabling NTLM authentication (Microsoft) in LWP
+
+=head1 SYNOPSIS
+
+ use LWP::UserAgent;
+ use HTTP::Request::Common;
+ my $url = 'http://www.company.com/protected_page.html';
+
+ # Set up the ntlm client and then the base64 encoded ntlm handshake message
+ my $ua = new LWP::UserAgent(keep_alive=>1);
+ $ua->credentials('www.company.com:80', '', "MyDomain\\MyUserCode", 'MyPassword');
+
+ $request = GET $url;
+ print "--Performing request now...-----------\n";
+ $response = $ua->request($request);
+ print "--Done with request-------------------\n";
+
+ if ($response->is_success) {print "It worked!->" . $response->code . "\n"}
+ else {print "It didn't work!->" . $response->code . "\n"}
+
+=head1 DESCRIPTION
+
+C<LWP::Authen::Ntlm> allows LWP to authenticate against servers that are using the
+NTLM authentication scheme popularized by Microsoft. This type of authentication is
+common on intranets of Microsoft-centric organizations.
+
+The module takes advantage of the Authen::NTLM module by Mark Bush. Since there
+is also another Authen::NTLM module available from CPAN by Yee Man Chan with an
+entirely different interface, it is necessary to ensure that you have the correct
+NTLM module.
+
+In addition, there have been problems with incompatibilities between different
+versions of Mime::Base64, which Bush's Authen::NTLM makes use of. Therefore, it is
+necessary to ensure that your Mime::Base64 module supports exporting of the
+encode_base64 and decode_base64 functions.
+
+=head1 USAGE
+
+The module is used indirectly through LWP, rather than including it directly in your
+code. The LWP system will invoke the NTLM authentication when it encounters the
+authentication scheme while attempting to retrieve a URL from a server. In order
+for the NTLM authentication to work, you must have a few things set up in your
+code prior to attempting to retrieve the URL:
+
+=over 4
+
+=item *
+
+Enable persistent HTTP connections
+
+To do this, pass the "keep_alive=>1" option to the LWP::UserAgent when creating it, like this:
+
+ my $ua = new LWP::UserAgent(keep_alive=>1);
+
+=item *
+
+Set the credentials on the UserAgent object
+
+The credentials must be set like this:
+
+ $ua->credentials('www.company.com:80', '', "MyDomain\\MyUserCode", 'MyPassword');
+
+Note that you cannot use the HTTP::Request object's authorization_basic() method to set
+the credentials. Note, too, that the 'www.company.com:80' portion only sets credentials
+on the specified port AND it is case-sensitive (this is due to the way LWP is coded, and
+has nothing to do with LWP::Authen::Ntlm)
+
+=back
+
+=head1 AVAILABILITY
+
+General queries regarding LWP should be made to the LWP Mailing List.
+
+Questions specific to LWP::Authen::Ntlm can be forwarded to jtillman@bigfoot.com
+
+=head1 COPYRIGHT
+
+Copyright (c) 2002 James Tillman. All rights reserved. This
+program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<LWP>, L<LWP::UserAgent>, L<lwpcook>.
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/ConnCache.pm b/Master/tlpkg/tlperl.straw/lib/LWP/ConnCache.pm
new file mode 100755
index 00000000000..6ac55cedd40
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/ConnCache.pm
@@ -0,0 +1,310 @@
+package LWP::ConnCache;
+
+use strict;
+use vars qw($VERSION $DEBUG);
+
+$VERSION = "5.810";
+
+
+sub new {
+ my($class, %cnf) = @_;
+ my $total_capacity = delete $cnf{total_capacity};
+ $total_capacity = 1 unless defined $total_capacity;
+ if (%cnf && $^W) {
+ require Carp;
+ Carp::carp("Unrecognised options: @{[sort keys %cnf]}")
+ }
+ my $self = bless { cc_conns => [] }, $class;
+ $self->total_capacity($total_capacity);
+ $self;
+}
+
+
+sub deposit {
+ my($self, $type, $key, $conn) = @_;
+ push(@{$self->{cc_conns}}, [$conn, $type, $key, time]);
+ $self->enforce_limits($type);
+ return;
+}
+
+
+sub withdraw {
+ my($self, $type, $key) = @_;
+ my $conns = $self->{cc_conns};
+ for my $i (0 .. @$conns - 1) {
+ my $c = $conns->[$i];
+ next unless $c->[1] eq $type && $c->[2] eq $key;
+ splice(@$conns, $i, 1); # remove it
+ return $c->[0];
+ }
+ return undef;
+}
+
+
+sub total_capacity {
+ my $self = shift;
+ my $old = $self->{cc_limit_total};
+ if (@_) {
+ $self->{cc_limit_total} = shift;
+ $self->enforce_limits;
+ }
+ $old;
+}
+
+
+sub capacity {
+ my $self = shift;
+ my $type = shift;
+ my $old = $self->{cc_limit}{$type};
+ if (@_) {
+ $self->{cc_limit}{$type} = shift;
+ $self->enforce_limits($type);
+ }
+ $old;
+}
+
+
+sub enforce_limits {
+ my($self, $type) = @_;
+ my $conns = $self->{cc_conns};
+
+ my @types = $type ? ($type) : ($self->get_types);
+ for $type (@types) {
+ next unless $self->{cc_limit};
+ my $limit = $self->{cc_limit}{$type};
+ next unless defined $limit;
+ for my $i (reverse 0 .. @$conns - 1) {
+ next unless $conns->[$i][1] eq $type;
+ if (--$limit < 0) {
+ $self->dropping(splice(@$conns, $i, 1), "$type capacity exceeded");
+ }
+ }
+ }
+
+ if (defined(my $total = $self->{cc_limit_total})) {
+ while (@$conns > $total) {
+ $self->dropping(shift(@$conns), "Total capacity exceeded");
+ }
+ }
+}
+
+
+sub dropping {
+ my($self, $c, $reason) = @_;
+ print "DROPPING @$c [$reason]\n" if $DEBUG;
+}
+
+
+sub drop {
+ my($self, $checker, $reason) = @_;
+ if (ref($checker) ne "CODE") {
+ # make it so
+ if (!defined $checker) {
+ $checker = sub { 1 }; # drop all of them
+ }
+ elsif (_looks_like_number($checker)) {
+ my $age_limit = $checker;
+ my $time_limit = time - $age_limit;
+ $reason ||= "older than $age_limit";
+ $checker = sub { $_[3] < $time_limit };
+ }
+ else {
+ my $type = $checker;
+ $reason ||= "drop $type";
+ $checker = sub { $_[1] eq $type }; # match on type
+ }
+ }
+ $reason ||= "drop";
+
+ local $SIG{__DIE__}; # don't interfere with eval below
+ local $@;
+ my @c;
+ for (@{$self->{cc_conns}}) {
+ my $drop;
+ eval {
+ if (&$checker(@$_)) {
+ $self->dropping($_, $reason);
+ $drop++;
+ }
+ };
+ push(@c, $_) unless $drop;
+ }
+ @{$self->{cc_conns}} = @c;
+}
+
+
+sub prune {
+ my $self = shift;
+ $self->drop(sub { !shift->ping }, "ping");
+}
+
+
+sub get_types {
+ my $self = shift;
+ my %t;
+ $t{$_->[1]}++ for @{$self->{cc_conns}};
+ return keys %t;
+}
+
+
+sub get_connections {
+ my($self, $type) = @_;
+ my @c;
+ for (@{$self->{cc_conns}}) {
+ push(@c, $_->[0]) if !$type || ($type && $type eq $_->[1]);
+ }
+ @c;
+}
+
+
+sub _looks_like_number {
+ $_[0] =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
+}
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+LWP::ConnCache - Connection cache manager
+
+=head1 NOTE
+
+This module is experimental. Details of its interface is likely to
+change in the future.
+
+=head1 SYNOPSIS
+
+ use LWP::ConnCache;
+ my $cache = LWP::ConnCache->new;
+ $cache->deposit($type, $key, $sock);
+ $sock = $cache->withdraw($type, $key);
+
+=head1 DESCRIPTION
+
+The C<LWP::ConnCache> class is the standard connection cache manager
+for LWP::UserAgent.
+
+The following basic methods are provided:
+
+=over
+
+=item $cache = LWP::ConnCache->new( %options )
+
+This method constructs a new C<LWP::ConnCache> object. The only
+option currently accepted is 'total_capacity'. If specified it
+initialize the total_capacity option. It defaults to the value 1.
+
+=item $cache->total_capacity( [$num_connections] )
+
+Get/sets the number of connection that will be cached. Connections
+will start to be dropped when this limit is reached. If set to C<0>,
+then all connections are immediately dropped. If set to C<undef>,
+then there is no limit.
+
+=item $cache->capacity($type, [$num_connections] )
+
+Get/set a limit for the number of connections of the specified type
+that can be cached. The $type will typically be a short string like
+"http" or "ftp".
+
+=item $cache->drop( [$checker, [$reason]] )
+
+Drop connections by some criteria. The $checker argument is a
+subroutine that is called for each connection. If the routine returns
+a TRUE value then the connection is dropped. The routine is called
+with ($conn, $type, $key, $deposit_time) as arguments.
+
+Shortcuts: If the $checker argument is absent (or C<undef>) all cached
+connections are dropped. If the $checker is a number then all
+connections untouched that the given number of seconds or more are
+dropped. If $checker is a string then all connections of the given
+type are dropped.
+
+The $reason argument is passed on to the dropped() method.
+
+=item $cache->prune
+
+Calling this method will drop all connections that are dead. This is
+tested by calling the ping() method on the connections. If the ping()
+method exists and returns a FALSE value, then the connection is
+dropped.
+
+=item $cache->get_types
+
+This returns all the 'type' fields used for the currently cached
+connections.
+
+=item $cache->get_connections( [$type] )
+
+This returns all connection objects of the specified type. If no type
+is specified then all connections are returned. In scalar context the
+number of cached connections of the specified type is returned.
+
+=back
+
+
+The following methods are called by low-level protocol modules to
+try to save away connections and to get them back.
+
+=over
+
+=item $cache->deposit($type, $key, $conn)
+
+This method adds a new connection to the cache. As a result other
+already cached connections might be dropped. Multiple connections with
+the same $type/$key might added.
+
+=item $conn = $cache->withdraw($type, $key)
+
+This method tries to fetch back a connection that was previously
+deposited. If no cached connection with the specified $type/$key is
+found, then C<undef> is returned. There is not guarantee that a
+deposited connection can be withdrawn, as the cache manger is free to
+drop connections at any time.
+
+=back
+
+The following methods are called internally. Subclasses might want to
+override them.
+
+=over
+
+=item $conn->enforce_limits([$type])
+
+This method is called with after a new connection is added (deposited)
+in the cache or capacity limits are adjusted. The default
+implementation drops connections until the specified capacity limits
+are not exceeded.
+
+=item $conn->dropping($conn_record, $reason)
+
+This method is called when a connection is dropped. The record
+belonging to the dropped connection is passed as the first argument
+and a string describing the reason for the drop is passed as the
+second argument. The default implementation makes some noise if the
+$LWP::ConnCache::DEBUG variable is set and nothing more.
+
+=back
+
+=head1 SUBCLASSING
+
+For specialized cache policy it makes sense to subclass
+C<LWP::ConnCache> and perhaps override the deposit(), enforce_limits()
+and dropping() methods.
+
+The object itself is a hash. Keys prefixed with C<cc_> are reserved
+for the base class.
+
+=head1 SEE ALSO
+
+L<LWP::UserAgent>
+
+=head1 COPYRIGHT
+
+Copyright 2001 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Debug.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Debug.pm
new file mode 100755
index 00000000000..f583c527071
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Debug.pm
@@ -0,0 +1,110 @@
+package LWP::Debug; # legacy
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(level trace debug conns);
+
+use Carp ();
+
+my @levels = qw(trace debug conns);
+%current_level = ();
+
+
+sub import
+{
+ my $pack = shift;
+ my $callpkg = caller(0);
+ my @symbols = ();
+ my @levels = ();
+ for (@_) {
+ if (/^[-+]/) {
+ push(@levels, $_);
+ }
+ else {
+ push(@symbols, $_);
+ }
+ }
+ Exporter::export($pack, $callpkg, @symbols);
+ level(@levels);
+}
+
+
+sub level
+{
+ for (@_) {
+ if ($_ eq '+') { # all on
+ # switch on all levels
+ %current_level = map { $_ => 1 } @levels;
+ }
+ elsif ($_ eq '-') { # all off
+ %current_level = ();
+ }
+ elsif (/^([-+])(\w+)$/) {
+ $current_level{$2} = $1 eq '+';
+ }
+ else {
+ Carp::croak("Illegal level format $_");
+ }
+ }
+}
+
+
+sub trace { _log(@_) if $current_level{'trace'}; }
+sub debug { _log(@_) if $current_level{'debug'}; }
+sub conns { _log(@_) if $current_level{'conns'}; }
+
+
+sub _log
+{
+ my $msg = shift;
+ $msg .= "\n" unless $msg =~ /\n$/; # ensure trailing "\n"
+
+ my($package,$filename,$line,$sub) = caller(2);
+ print STDERR "$sub: $msg";
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+LWP::Debug - deprecated
+
+=head1 DESCRIPTION
+
+LWP::Debug used to provide tracing facilities, but these are not used
+by LWP any more. The code in this module is kept around
+(undocumented) so that 3rd party code that happen to use the old
+interfaces continue to run.
+
+One useful feature that LWP::Debug provided (in an imprecise and
+troublesome way) was network traffic monitoring. The following
+section provide some hints about recommened replacements.
+
+=head2 Network traffic monitoring
+
+The best way to monitor the network traffic that LWP generates is to
+use an external TCP monitoring program. The Wireshark program
+(L<http://www.wireshark.org/>) is higly recommended for this.
+
+Another approach it to use a debugging HTTP proxy server and make
+LWP direct all its traffic via this one. Call C<< $ua->proxy >> to
+set it up and then just use LWP as before.
+
+For less precise monitoring needs just setting up a few simple
+handlers might do. The following example sets up handlers to dump the
+request and response objects that pass through LWP:
+
+ use LWP::UserAgent;
+ $ua = LWP::UserAgent->new;
+ $ua->default_header('Accept-Encoding' => scalar HTTP::Message::decodable());
+
+ $ua->add_handler("request_send", sub { shift->dump; return });
+ $ua->add_handler("response_done", sub { shift->dump; return });
+
+ $ua->get("http://www.example.com");
+
+=head1 SEE ALSO
+
+L<LWP::UserAgent>
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/DebugFile.pm b/Master/tlpkg/tlperl.straw/lib/LWP/DebugFile.pm
new file mode 100755
index 00000000000..aacdfca0fe5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/DebugFile.pm
@@ -0,0 +1,5 @@
+package LWP::DebugFile;
+
+# legacy stub
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/MediaTypes.pm b/Master/tlpkg/tlperl.straw/lib/LWP/MediaTypes.pm
new file mode 100755
index 00000000000..a357c2918d1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/MediaTypes.pm
@@ -0,0 +1,297 @@
+package LWP::MediaTypes;
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(guess_media_type media_suffix);
+@EXPORT_OK = qw(add_type add_encoding read_media_types);
+$VERSION = "5.822";
+
+use strict;
+
+# note: These hashes will also be filled with the entries found in
+# the 'media.types' file.
+
+my %suffixType = (
+ 'txt' => 'text/plain',
+ 'html' => 'text/html',
+ 'gif' => 'image/gif',
+ 'jpg' => 'image/jpeg',
+ 'xml' => 'text/xml',
+);
+
+my %suffixExt = (
+ 'text/plain' => 'txt',
+ 'text/html' => 'html',
+ 'image/gif' => 'gif',
+ 'image/jpeg' => 'jpg',
+ 'text/xml' => 'xml',
+);
+
+#XXX: there should be some way to define this in the media.types files.
+my %suffixEncoding = (
+ 'Z' => 'compress',
+ 'gz' => 'gzip',
+ 'hqx' => 'x-hqx',
+ 'uu' => 'x-uuencode',
+ 'z' => 'x-pack',
+ 'bz2' => 'x-bzip2',
+);
+
+read_media_types();
+
+
+
+sub _dump {
+ require Data::Dumper;
+ Data::Dumper->new([\%suffixType, \%suffixExt, \%suffixEncoding],
+ [qw(*suffixType *suffixExt *suffixEncoding)])->Dump;
+}
+
+
+sub guess_media_type
+{
+ my($file, $header) = @_;
+ return undef unless defined $file;
+
+ my $fullname;
+ if (ref($file)) {
+ # assume URI object
+ $file = $file->path;
+ #XXX should handle non http:, file: or ftp: URIs differently
+ }
+ else {
+ $fullname = $file; # enable peek at actual file
+ }
+
+ my @encoding = ();
+ my $ct = undef;
+ for (file_exts($file)) {
+ # first check this dot part as encoding spec
+ if (exists $suffixEncoding{$_}) {
+ unshift(@encoding, $suffixEncoding{$_});
+ next;
+ }
+ if (exists $suffixEncoding{lc $_}) {
+ unshift(@encoding, $suffixEncoding{lc $_});
+ next;
+ }
+
+ # check content-type
+ if (exists $suffixType{$_}) {
+ $ct = $suffixType{$_};
+ last;
+ }
+ if (exists $suffixType{lc $_}) {
+ $ct = $suffixType{lc $_};
+ last;
+ }
+
+ # don't know nothing about this dot part, bail out
+ last;
+ }
+ unless (defined $ct) {
+ # Take a look at the file
+ if (defined $fullname) {
+ $ct = (-T $fullname) ? "text/plain" : "application/octet-stream";
+ }
+ else {
+ $ct = "application/octet-stream";
+ }
+ }
+
+ if ($header) {
+ $header->header('Content-Type' => $ct);
+ $header->header('Content-Encoding' => \@encoding) if @encoding;
+ }
+
+ wantarray ? ($ct, @encoding) : $ct;
+}
+
+
+sub media_suffix {
+ if (!wantarray && @_ == 1 && $_[0] !~ /\*/) {
+ return $suffixExt{$_[0]};
+ }
+ my(@type) = @_;
+ my(@suffix, $ext, $type);
+ foreach (@type) {
+ if (s/\*/.*/) {
+ while(($ext,$type) = each(%suffixType)) {
+ push(@suffix, $ext) if $type =~ /^$_$/;
+ }
+ }
+ else {
+ while(($ext,$type) = each(%suffixType)) {
+ push(@suffix, $ext) if $type eq $_;
+ }
+ }
+ }
+ wantarray ? @suffix : $suffix[0];
+}
+
+
+sub file_exts
+{
+ require File::Basename;
+ my @parts = reverse split(/\./, File::Basename::basename($_[0]));
+ pop(@parts); # never consider first part
+ @parts;
+}
+
+
+sub add_type
+{
+ my($type, @exts) = @_;
+ for my $ext (@exts) {
+ $ext =~ s/^\.//;
+ $suffixType{$ext} = $type;
+ }
+ $suffixExt{$type} = $exts[0] if @exts;
+}
+
+
+sub add_encoding
+{
+ my($type, @exts) = @_;
+ for my $ext (@exts) {
+ $ext =~ s/^\.//;
+ $suffixEncoding{$ext} = $type;
+ }
+}
+
+
+sub read_media_types
+{
+ my(@files) = @_;
+
+ local($/, $_) = ("\n", undef); # ensure correct $INPUT_RECORD_SEPARATOR
+
+ my @priv_files = ();
+ if($^O eq "MacOS") {
+ push(@priv_files, "$ENV{HOME}:media.types", "$ENV{HOME}:mime.types")
+ if defined $ENV{HOME}; # Some does not have a home (for instance Win32)
+ }
+ else {
+ push(@priv_files, "$ENV{HOME}/.media.types", "$ENV{HOME}/.mime.types")
+ if defined $ENV{HOME}; # Some doesn't have a home (for instance Win32)
+ }
+
+ # Try to locate "media.types" file, and initialize %suffixType from it
+ my $typefile;
+ unless (@files) {
+ if($^O eq "MacOS") {
+ @files = map {$_."LWP:media.types"} @INC;
+ }
+ else {
+ @files = map {"$_/LWP/media.types"} @INC;
+ }
+ push @files, @priv_files;
+ }
+ for $typefile (@files) {
+ local(*TYPE);
+ open(TYPE, $typefile) || next;
+ while (<TYPE>) {
+ next if /^\s*#/; # comment line
+ next if /^\s*$/; # blank line
+ s/#.*//; # remove end-of-line comments
+ my($type, @exts) = split(' ', $_);
+ add_type($type, @exts);
+ }
+ close(TYPE);
+ }
+}
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+LWP::MediaTypes - guess media type for a file or a URL
+
+=head1 SYNOPSIS
+
+ use LWP::MediaTypes qw(guess_media_type);
+ $type = guess_media_type("/tmp/foo.gif");
+
+=head1 DESCRIPTION
+
+This module provides functions for handling media (also known as
+MIME) types and encodings. The mapping from file extensions to media
+types is defined by the F<media.types> file. If the F<~/.media.types>
+file exists it is used instead.
+For backwards compatibility we will also look for F<~/.mime.types>.
+
+The following functions are exported by default:
+
+=over 4
+
+=item guess_media_type( $filename )
+
+=item guess_media_type( $uri )
+
+=item guess_media_type( $filename_or_uri, $header_to_modify )
+
+This function tries to guess media type and encoding for a file or a URI.
+It returns the content type, which is a string like C<"text/html">.
+In array context it also returns any content encodings applied (in the
+order used to encode the file). You can pass a URI object
+reference, instead of the file name.
+
+If the type can not be deduced from looking at the file name,
+then guess_media_type() will let the C<-T> Perl operator take a look.
+If this works (and C<-T> returns a TRUE value) then we return
+I<text/plain> as the type, otherwise we return
+I<application/octet-stream> as the type.
+
+The optional second argument should be a reference to a HTTP::Headers
+object or any object that implements the $obj->header method in a
+similar way. When it is present the values of the
+'Content-Type' and 'Content-Encoding' will be set for this header.
+
+=item media_suffix( $type, ... )
+
+This function will return all suffixes that can be used to denote the
+specified media type(s). Wildcard types can be used. In a scalar
+context it will return the first suffix found. Examples:
+
+ @suffixes = media_suffix('image/*', 'audio/basic');
+ $suffix = media_suffix('text/html');
+
+=back
+
+The following functions are only exported by explicit request:
+
+=over 4
+
+=item add_type( $type, @exts )
+
+Associate a list of file extensions with the given media type.
+Example:
+
+ add_type("x-world/x-vrml" => qw(wrl vrml));
+
+=item add_encoding( $type, @ext )
+
+Associate a list of file extensions with an encoding type.
+Example:
+
+ add_encoding("x-gzip" => "gz");
+
+=item read_media_types( @files )
+
+Parse media types files and add the type mappings found there.
+Example:
+
+ read_media_types("conf/mime.types");
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 1995-1999 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/MemberMixin.pm b/Master/tlpkg/tlperl.straw/lib/LWP/MemberMixin.pm
new file mode 100755
index 00000000000..e5ee6f6382e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/MemberMixin.pm
@@ -0,0 +1,44 @@
+package LWP::MemberMixin;
+
+sub _elem
+{
+ my $self = shift;
+ my $elem = shift;
+ my $old = $self->{$elem};
+ $self->{$elem} = shift if @_;
+ return $old;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+LWP::MemberMixin - Member access mixin class
+
+=head1 SYNOPSIS
+
+ package Foo;
+ require LWP::MemberMixin;
+ @ISA=qw(LWP::MemberMixin);
+
+=head1 DESCRIPTION
+
+A mixin class to get methods that provide easy access to member
+variables in the %$self.
+Ideally there should be better Perl language support for this.
+
+There is only one method provided:
+
+=over 4
+
+=item _elem($elem [, $val])
+
+Internal method to get/set the value of member variable
+C<$elem>. If C<$val> is present it is used as the new value
+for the member variable. If it is not present the current
+value is not touched. In both cases the previous value of
+the member variable is returned.
+
+=back
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Online.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Online.pm
new file mode 100755
index 00000000000..1ef4ef79774
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Online.pm
@@ -0,0 +1,372 @@
+package LWP::Online;
+
+=pod
+
+=head1 NAME
+
+LWP::Online - Does your process have access to the web
+
+=head1 SYNOPSIS
+
+ use LWP::Online 'online';
+
+ # "Is the internet working?"
+ die "NO INTARWWEB!!!" unless online();
+
+ # The above means something like this
+ unless ( online('http') ) {
+ die "No basic http access to the web";
+ }
+
+ # Special syntax for use in test scripts that need
+ # "real" access to the internet. Scripts will automatically
+ # skip if connection fails.
+ use LWP::Online ':skip_all';
+
+=head1 DESCRIPTION
+
+This module attempts to answer, as accurately as it can, one of the
+nastiest technical questions there is.
+
+B<Am I on the internet?>
+
+The answer is useful in a wide range of decisions. For example...
+
+I<Should my test scripts run the online portion of the tests or
+just skip them?>
+
+I<Do I try to fetch fresh data from the server?>
+
+I<If my request to the server breaks, is it because I'm offline, or
+because the server is offline?>
+
+And so on, and so forth.
+
+But a host of networking and security issues make this problem
+very difficult. There are firewalls, proxies (both well behaved and
+badly behaved). We might not have DNS. We might not have a network
+card at all!
+
+You might have network access, but only to a for-money wireless network
+that responds to ever HTTP request with a page asking you to enter your
+credit card details for paid access. Which means you don't "REALLY" have
+access.
+
+The mere nature of the question makes it practically unsolvable.
+
+But with the answer being so useful, and the only other alternative being
+to ask the user "duh... are you online?" (when you might not have a user
+at all) it's my gut feeling that it is worthwhile at least making an
+attempt to solve the problem, if only in a limited way.
+
+=head2 Why LWP::Online? Why not Net::Online?
+
+The nice thing about LWP::Online is that LWP deals with a whole range of
+different transports, and is very commonly installed. HTTP, HTTPS, FTP,
+and so on and so forth.
+
+Attempting to do a more generalised Net::Online that might also check for
+SSH and so on would end up most likely having to install a whole bunch of
+modules that you most likely will never use.
+
+So LWP forms a nice base on which to write a module that covers most of
+the situations in which you might care, while keeping the dependency
+overhead down to a minimum.
+
+=head2 Scope
+
+"Am I online?" is inherently an Open Problem.
+
+That is, it's a problem that had no clean permanent solution, and for
+which you could just keep writing more and more functionality
+indefinitely, asymtopically approaching 100% correctness but never
+reaching it.
+
+And so this module is intended to do as good a job as possible, without
+having to resort to asking any human questions (who may well get it wrong
+anyway), and limiting itself to a finite amount of programming work and
+a reasonable level of memory overhead to load the code.
+
+It is thus understood the module will B<never> be perfect, and that if
+any new functionality is desired, it needs to be able to implemented by
+the person that desires the new behaviour, and in a reasonably small
+amount of additional code.
+
+This module is also B<not> intended to compensate for malicious behaviour
+of any kind, it is quite possible that some malicious person might proxy
+fake versions of sites that pass our content checks and then proceed
+to show you other bad pages.
+
+=head2 Test Mode
+
+ use LWP::Online ':skip_all';
+
+As a convenience when writing tests scripts base on L<Test::More>, the
+special ':skip_all' param can be provided when loading B<LWP::Online>.
+
+This implements the functional equivalent of the following.
+
+ BEGIN {
+ require Test::More;
+ unless ( LWP::Online::online() ) {
+ Test::More->import(
+ skip_all => 'Test requires a working internet connection'
+ );
+ }
+ }
+
+The :skip_all special import flag can be mixed with regular imports.
+
+=head1 FUNCTIONS
+
+=cut
+
+use 5.005;
+use strict;
+use Carp 'croak';
+use LWP::Simple qw{ get $ua };
+
+use vars qw{$VERSION @ISA @EXPORT_OK};
+BEGIN {
+ $VERSION = '1.07';
+
+ # We are an Exporter
+ require Exporter;
+ @ISA = qw{ Exporter };
+ @EXPORT_OK = qw{ online offline };
+
+ # Set the useragent timeout
+ $ua->timeout(30);
+}
+
+# Set up configuration data
+use vars qw{%SUPPORTED @RELIABLE_HTTP};
+BEGIN {
+ # What transports do we support
+ %SUPPORTED = map { $_ => 1 } qw{ http };
+
+ # (Relatively) reliable websites
+ @RELIABLE_HTTP = (
+ # These are some initial trivial checks.
+ # The regex are case-sensitive to at least
+ # deal with the "couldn't get site.com case".
+ 'http://google.com/' => sub { /About Google/ },
+ 'http://yahoo.com/' => sub { /Yahoo!/ },
+ 'http://amazon.com/' => sub { /Amazon/ and /Cart/ },
+ 'http://cnn.com/' => sub { /CNN/ },
+ );
+}
+
+sub import {
+ my $class = shift;
+
+ # Handle the :skip_all special case
+ my @functions = grep { $_ ne ':skip_all' } @_;
+ if ( @functions != @_ ) {
+ require Test::More;
+ unless ( online() ) {
+ Test::More->import( skip_all => 'Test requires a working internet connection' );
+ }
+ }
+
+ # Hand the rest of the params off to Exporter
+ return $class->export_to_level( 1, $class, @functions );
+}
+
+
+
+
+
+#####################################################################
+# Exportable Functions
+
+=pod
+
+=head2 online
+
+ # Default check (uses http)
+ online() or die "No Internet";
+
+ # The above is equivalent to
+ online('http') or die "No Internet";
+
+The importable B<online> function is the main functionality provided
+by B<LWP::Online>. It takes a single optional transport name ('http'
+by default) and checks that LWP connectivity is available for that
+transport.
+
+Because it is intended as a Do What You Mean function, it checks not
+only that a network connection is available, and http requests return
+content, but also that it returns the CORRECT content instead of
+unexpected content supplied by a man in the middle.
+
+For example, many wireless connections require login or payment, and
+will return a service provider page for any URI that you attempt to
+fetch.
+
+The set of websites used for the testing is the Google, Amazon,
+Yahoo and CNN websites. The check is for a copyright statement on their
+homepage, and the function returns true as soon as two of the website
+return correctly, making the method relatively redundant.
+
+Returns true if the computer is "online" (has a working connection via
+LWP) or false if not.
+
+=cut
+
+sub online {
+ # Shortcut the default to plain http_online test
+ return http_online() unless @_;
+
+ while ( @_ ) {
+ # Get the transport to test
+ my $transport = shift;
+ unless ( $transport and $SUPPORTED{$transport} ) {
+ Carp::croak("Invalid or unsupported transport");
+ }
+
+ # Hand off to the transport function
+ if ( $transport eq 'http' ) {
+ http_online() or return '';
+ } else {
+ Carp::croak("Invalid or unsupported transport");
+ }
+ }
+
+ # All required transports available
+ return 1;
+}
+
+=pod
+
+=head2 offline
+
+The importable B<offline> function is provided as a convenience.
+
+It provides a simple pass-through (including any params) to the B<online>
+function, but with a negated result.
+
+=cut
+
+sub offline {
+ ! online(@_);
+}
+
+
+
+
+
+#####################################################################
+# Transport Functions
+
+sub http_online {
+ # Check the reliable websites list.
+ # If networking is offline, an error/paysite page might still
+ # give us a page that matches a page check, while any one or
+ # two of the reliable websites might be offline for some
+ # unknown reason (DDOS, earthquake, chinese firewall, etc)
+ # So we want 2 or more sites to pass checks to make the
+ # judgement call that we are online.
+ my $good = 0;
+ my $bad = 0;
+ my @reliable = @RELIABLE_HTTP;
+ while ( @reliable ) {
+ # Check the current good/bad state and consider
+ # making the online/offline judgement call.
+ return 1 if $good > 1;
+ return '' if $bad > 2;
+
+ # Try the next reliable site
+ my $site = shift @reliable;
+ my $check = shift @reliable;
+
+ # Try to fetch the site
+ my $content;
+ SCOPE: {
+ local $@;
+ $content = eval { get($site) };
+ if ( $@ ) {
+ # An exception is a simple failure
+ $bad++;
+ next;
+ }
+ }
+ unless ( defined $content ) {
+ # get() returns undef on failure
+ $bad++;
+ next;
+ }
+
+ # We got _something_.
+ # Check if it looks like what we want
+ SCOPE: {
+ local $_ = $content;
+ if ( $check->() ) {
+ $good++;
+ } else {
+ $bad++;
+ }
+ }
+ }
+
+ # We've run out of sites to check... erm... uh...
+ # We should probably fail conservatively and say not online.
+ return '';
+}
+
+1;
+
+=pod
+
+=head1 TO DO
+
+- Add more transport types that can be checked, somehow keeping the
+code growth under control.
+
+=head1 SUPPORT
+
+This module is stored in an Open Repository at the following address.
+
+L<http://svn.ali.as/cpan/trunk/LWP-Online>
+
+Write access to the repository is made available automatically to any
+published CPAN author, and to most other volunteers on request.
+
+If you are able to submit your bug report in the form of new (failing)
+unit tests (which for this module will be extremely difficult), or can
+apply your fix directly instead of submitting a patch, you are B<strongly>
+encouraged to do so as the author currently maintains over 100 modules
+and it can take some time to deal with non-Critical bug reports or patches.
+
+This will guarentee that your issue will be addressed in the next
+release of the module.
+
+If you cannot provide a direct test or fix, or don't have time to do so,
+then regular bug reports are still accepted and appreciated via the CPAN
+bug tracker.
+
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=LWP-Online>
+
+For other issues, for commercial enhancement or support, or to have your
+write access enabled for the repository, contact the author at the email
+address above.
+
+=head1 AUTHOR
+
+Adam Kennedy E<lt>adamk@cpan.orgE<gt>
+
+=head1 SEE ALSO
+
+L<LWP::Simple>
+
+=head1 COPYRIGHT
+
+Copyright 2006 - 2008 Adam Kennedy.
+
+This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+The full text of the license can be found in the
+LICENSE file included with this module.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol.pm
new file mode 100755
index 00000000000..61a28cd1386
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol.pm
@@ -0,0 +1,291 @@
+package LWP::Protocol;
+
+require LWP::MemberMixin;
+@ISA = qw(LWP::MemberMixin);
+$VERSION = "5.829";
+
+use strict;
+use Carp ();
+use HTTP::Status ();
+use HTTP::Response;
+
+my %ImplementedBy = (); # scheme => classname
+
+
+
+sub new
+{
+ my($class, $scheme, $ua) = @_;
+
+ my $self = bless {
+ scheme => $scheme,
+ ua => $ua,
+
+ # historical/redundant
+ max_size => $ua->{max_size},
+ }, $class;
+
+ $self;
+}
+
+
+sub create
+{
+ my($scheme, $ua) = @_;
+ my $impclass = LWP::Protocol::implementor($scheme) or
+ Carp::croak("Protocol scheme '$scheme' is not supported");
+
+ # hand-off to scheme specific implementation sub-class
+ my $protocol = $impclass->new($scheme, $ua);
+
+ return $protocol;
+}
+
+
+sub implementor
+{
+ my($scheme, $impclass) = @_;
+
+ if ($impclass) {
+ $ImplementedBy{$scheme} = $impclass;
+ }
+ my $ic = $ImplementedBy{$scheme};
+ return $ic if $ic;
+
+ return '' unless $scheme =~ /^([.+\-\w]+)$/; # check valid URL schemes
+ $scheme = $1; # untaint
+ $scheme =~ s/[.+\-]/_/g; # make it a legal module name
+
+ # scheme not yet known, look for a 'use'd implementation
+ $ic = "LWP::Protocol::$scheme"; # default location
+ $ic = "LWP::Protocol::nntp" if $scheme eq 'news'; #XXX ugly hack
+ no strict 'refs';
+ # check we actually have one for the scheme:
+ unless (@{"${ic}::ISA"}) {
+ # try to autoload it
+ eval "require $ic";
+ if ($@) {
+ if ($@ =~ /Can't locate/) { #' #emacs get confused by '
+ $ic = '';
+ }
+ else {
+ die "$@\n";
+ }
+ }
+ }
+ $ImplementedBy{$scheme} = $ic if $ic;
+ $ic;
+}
+
+
+sub request
+{
+ my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+ Carp::croak('LWP::Protocol::request() needs to be overridden in subclasses');
+}
+
+
+# legacy
+sub timeout { shift->_elem('timeout', @_); }
+sub max_size { shift->_elem('max_size', @_); }
+
+
+sub collect
+{
+ my ($self, $arg, $response, $collector) = @_;
+ my $content;
+ my($ua, $max_size) = @{$self}{qw(ua max_size)};
+
+ eval {
+ local $\; # protect the print below from surprises
+ if (!defined($arg) || !$response->is_success) {
+ $response->{default_add_content} = 1;
+ }
+ elsif (!ref($arg) && length($arg)) {
+ open(my $fh, ">", $arg) or die "Can't write to '$arg': $!";
+ binmode($fh);
+ push(@{$response->{handlers}{response_data}}, {
+ callback => sub {
+ print $fh $_[3] or die "Can't write to '$arg': $!";
+ 1;
+ },
+ });
+ push(@{$response->{handlers}{response_done}}, {
+ callback => sub {
+ close($fh) or die "Can't write to '$arg': $!";
+ undef($fh);
+ },
+ });
+ }
+ elsif (ref($arg) eq 'CODE') {
+ push(@{$response->{handlers}{response_data}}, {
+ callback => sub {
+ &$arg($_[3], $_[0], $self);
+ 1;
+ },
+ });
+ }
+ else {
+ die "Unexpected collect argument '$arg'";
+ }
+
+ $ua->run_handlers("response_header", $response);
+
+ if (delete $response->{default_add_content}) {
+ push(@{$response->{handlers}{response_data}}, {
+ callback => sub {
+ $_[0]->add_content($_[3]);
+ 1;
+ },
+ });
+ }
+
+
+ my $content_size = 0;
+ my $length = $response->content_length;
+ my %skip_h;
+
+ while ($content = &$collector, length $$content) {
+ for my $h ($ua->handlers("response_data", $response)) {
+ next if $skip_h{$h};
+ unless ($h->{callback}->($response, $ua, $h, $$content)) {
+ # XXX remove from $response->{handlers}{response_data} if present
+ $skip_h{$h}++;
+ }
+ }
+ $content_size += length($$content);
+ $ua->progress(($length ? ($content_size / $length) : "tick"), $response);
+ if (defined($max_size) && $content_size > $max_size) {
+ $response->push_header("Client-Aborted", "max_size");
+ last;
+ }
+ }
+ };
+ my $err = $@;
+ delete $response->{handlers}{response_data};
+ delete $response->{handlers} unless %{$response->{handlers}};
+ if ($err) {
+ chomp($err);
+ $response->push_header('X-Died' => $err);
+ $response->push_header("Client-Aborted", "die");
+ return $response;
+ }
+
+ return $response;
+}
+
+
+sub collect_once
+{
+ my($self, $arg, $response) = @_;
+ my $content = \ $_[3];
+ my $first = 1;
+ $self->collect($arg, $response, sub {
+ return $content if $first--;
+ return \ "";
+ });
+}
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+LWP::Protocol - Base class for LWP protocols
+
+=head1 SYNOPSIS
+
+ package LWP::Protocol::foo;
+ require LWP::Protocol;
+ @ISA=qw(LWP::Protocol);
+
+=head1 DESCRIPTION
+
+This class is used a the base class for all protocol implementations
+supported by the LWP library.
+
+When creating an instance of this class using
+C<LWP::Protocol::create($url)>, and you get an initialised subclass
+appropriate for that access method. In other words, the
+LWP::Protocol::create() function calls the constructor for one of its
+subclasses.
+
+All derived LWP::Protocol classes need to override the request()
+method which is used to service a request. The overridden method can
+make use of the collect() function to collect together chunks of data
+as it is received.
+
+The following methods and functions are provided:
+
+=over 4
+
+=item $prot = LWP::Protocol->new()
+
+The LWP::Protocol constructor is inherited by subclasses. As this is a
+virtual base class this method should B<not> be called directly.
+
+=item $prot = LWP::Protocol::create($scheme)
+
+Create an object of the class implementing the protocol to handle the
+given scheme. This is a function, not a method. It is more an object
+factory than a constructor. This is the function user agents should
+use to access protocols.
+
+=item $class = LWP::Protocol::implementor($scheme, [$class])
+
+Get and/or set implementor class for a scheme. Returns '' if the
+specified scheme is not supported.
+
+=item $prot->request(...)
+
+ $response = $protocol->request($request, $proxy, undef);
+ $response = $protocol->request($request, $proxy, '/tmp/sss');
+ $response = $protocol->request($request, $proxy, \&callback, 1024);
+
+Dispatches a request over the protocol, and returns a response
+object. This method needs to be overridden in subclasses. Refer to
+L<LWP::UserAgent> for description of the arguments.
+
+=item $prot->collect($arg, $response, $collector)
+
+Called to collect the content of a request, and process it
+appropriately into a scalar, file, or by calling a callback. If $arg
+is undefined, then the content is stored within the $response. If
+$arg is a simple scalar, then $arg is interpreted as a file name and
+the content is written to this file. If $arg is a reference to a
+routine, then content is passed to this routine.
+
+The $collector is a routine that will be called and which is
+responsible for returning pieces (as ref to scalar) of the content to
+process. The $collector signals EOF by returning a reference to an
+empty sting.
+
+The return value from collect() is the $response object reference.
+
+B<Note:> We will only use the callback or file argument if
+$response->is_success(). This avoids sending content data for
+redirects and authentication responses to the callback which would be
+confusing.
+
+=item $prot->collect_once($arg, $response, $content)
+
+Can be called when the whole response content is available as
+$content. This will invoke collect() with a collector callback that
+returns a reference to $content the first time and an empty string the
+next.
+
+=back
+
+=head1 SEE ALSO
+
+Inspect the F<LWP/Protocol/file.pm> and F<LWP/Protocol/http.pm> files
+for examples of usage.
+
+=head1 COPYRIGHT
+
+Copyright 1995-2001 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/GHTTP.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/GHTTP.pm
new file mode 100755
index 00000000000..2a356b5fcb1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/GHTTP.pm
@@ -0,0 +1,73 @@
+package LWP::Protocol::GHTTP;
+
+# You can tell LWP to use this module for 'http' requests by running
+# code like this before you make requests:
+#
+# require LWP::Protocol::GHTTP;
+# LWP::Protocol::implementor('http', 'LWP::Protocol::GHTTP');
+#
+
+use strict;
+use vars qw(@ISA);
+
+require LWP::Protocol;
+@ISA=qw(LWP::Protocol);
+
+require HTTP::Response;
+require HTTP::Status;
+
+use HTTP::GHTTP qw(METHOD_GET METHOD_HEAD METHOD_POST);
+
+my %METHOD =
+(
+ GET => METHOD_GET,
+ HEAD => METHOD_HEAD,
+ POST => METHOD_POST,
+);
+
+sub request
+{
+ my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+
+ my $method = $request->method;
+ unless (exists $METHOD{$method}) {
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ "Bad method '$method'");
+ }
+
+ my $r = HTTP::GHTTP->new($request->uri);
+
+ # XXX what headers for repeated headers here?
+ $request->headers->scan(sub { $r->set_header(@_)});
+
+ $r->set_type($METHOD{$method});
+
+ # XXX should also deal with subroutine content.
+ my $cref = $request->content_ref;
+ $r->set_body($$cref) if length($$cref);
+
+ # XXX is this right
+ $r->set_proxy($proxy->as_string) if $proxy;
+
+ $r->process_request;
+
+ my $response = HTTP::Response->new($r->get_status);
+
+ # XXX How can get the headers out of $r?? This way is too stupid.
+ my @headers;
+ eval {
+ # Wrapped in eval because this method is not always available
+ @headers = $r->get_headers;
+ };
+ @headers = qw(Date Connection Server Content-type
+ Accept-Ranges Server
+ Content-Length Last-Modified ETag) if $@;
+ for (@headers) {
+ my $v = $r->get_header($_);
+ $response->header($_ => $v) if defined $v;
+ }
+
+ return $self->collect_once($arg, $response, $r->get_body);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/cpan.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/cpan.pm
new file mode 100755
index 00000000000..66d8f213b98
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/cpan.pm
@@ -0,0 +1,72 @@
+package LWP::Protocol::cpan;
+
+use strict;
+use vars qw(@ISA);
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+require URI;
+require HTTP::Status;
+require HTTP::Response;
+
+our $CPAN;
+
+unless ($CPAN) {
+ # Try to find local CPAN mirror via $CPAN::Config
+ eval {
+ require CPAN::Config;
+ if($CPAN::Config) {
+ my $urls = $CPAN::Config->{urllist};
+ if (ref($urls) eq "ARRAY") {
+ my $file;
+ for (@$urls) {
+ if (/^file:/) {
+ $file = $_;
+ last;
+ }
+ }
+
+ if ($file) {
+ $CPAN = $file;
+ }
+ else {
+ $CPAN = $urls->[0];
+ }
+ }
+ }
+ };
+
+ $CPAN ||= "http://cpan.org/"; # last resort
+}
+
+# ensure that we don't chop of last part
+$CPAN .= "/" unless $CPAN =~ m,/$,;
+
+
+sub request {
+ my($self, $request, $proxy, $arg, $size) = @_;
+ # check proxy
+ if (defined $proxy)
+ {
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ 'You can not proxy with cpan');
+ }
+
+ # check method
+ my $method = $request->method;
+ unless ($method eq 'GET' || $method eq 'HEAD') {
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ 'Library does not allow method ' .
+ "$method for 'cpan:' URLs");
+ }
+
+ my $path = $request->uri->path;
+ $path =~ s,^/,,;
+
+ my $response = HTTP::Response->new(&HTTP::Status::RC_FOUND);
+ $response->header("Location" => URI->new_abs($path, $CPAN));
+ $response;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/data.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/data.pm
new file mode 100755
index 00000000000..a97c1b1e50e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/data.pm
@@ -0,0 +1,52 @@
+package LWP::Protocol::data;
+
+# Implements access to data:-URLs as specified in RFC 2397
+
+use strict;
+use vars qw(@ISA);
+
+require HTTP::Response;
+require HTTP::Status;
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+use HTTP::Date qw(time2str);
+require LWP; # needs version number
+
+sub request
+{
+ my($self, $request, $proxy, $arg, $size) = @_;
+
+ # check proxy
+ if (defined $proxy)
+ {
+ return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+ 'You can not proxy with data';
+ }
+
+ # check method
+ my $method = $request->method;
+ unless ($method eq 'GET' || $method eq 'HEAD') {
+ return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+ 'Library does not allow method ' .
+ "$method for 'data:' URLs";
+ }
+
+ my $url = $request->uri;
+ my $response = new HTTP::Response &HTTP::Status::RC_OK, "Document follows";
+
+ my $media_type = $url->media_type;
+
+ my $data = $url->data;
+ $response->header('Content-Type' => $media_type,
+ 'Content-Length' => length($data),
+ 'Date' => time2str(time),
+ 'Server' => "libwww-perl-internal/$LWP::VERSION"
+ );
+ $response->content($data) if $method ne "HEAD";
+
+ return $response;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/file.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/file.pm
new file mode 100755
index 00000000000..7d78f7d3255
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/file.pm
@@ -0,0 +1,146 @@
+package LWP::Protocol::file;
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+use strict;
+
+require LWP::MediaTypes;
+require HTTP::Request;
+require HTTP::Response;
+require HTTP::Status;
+require HTTP::Date;
+
+
+sub request
+{
+ my($self, $request, $proxy, $arg, $size) = @_;
+
+ $size = 4096 unless defined $size and $size > 0;
+
+ # check proxy
+ if (defined $proxy)
+ {
+ return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+ 'You can not proxy through the filesystem';
+ }
+
+ # check method
+ my $method = $request->method;
+ unless ($method eq 'GET' || $method eq 'HEAD') {
+ return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+ 'Library does not allow method ' .
+ "$method for 'file:' URLs";
+ }
+
+ # check url
+ my $url = $request->uri;
+
+ my $scheme = $url->scheme;
+ if ($scheme ne 'file') {
+ return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "LWP::Protocol::file::request called for '$scheme'";
+ }
+
+ # URL OK, look at file
+ my $path = $url->file;
+
+ # test file exists and is readable
+ unless (-e $path) {
+ return new HTTP::Response &HTTP::Status::RC_NOT_FOUND,
+ "File `$path' does not exist";
+ }
+ unless (-r _) {
+ return new HTTP::Response &HTTP::Status::RC_FORBIDDEN,
+ 'User does not have read permission';
+ }
+
+ # looks like file exists
+ my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$filesize,
+ $atime,$mtime,$ctime,$blksize,$blocks)
+ = stat(_);
+
+ # XXX should check Accept headers?
+
+ # check if-modified-since
+ my $ims = $request->header('If-Modified-Since');
+ if (defined $ims) {
+ my $time = HTTP::Date::str2time($ims);
+ if (defined $time and $time >= $mtime) {
+ return new HTTP::Response &HTTP::Status::RC_NOT_MODIFIED,
+ "$method $path";
+ }
+ }
+
+ # Ok, should be an OK response by now...
+ my $response = new HTTP::Response &HTTP::Status::RC_OK;
+
+ # fill in response headers
+ $response->header('Last-Modified', HTTP::Date::time2str($mtime));
+
+ if (-d _) { # If the path is a directory, process it
+ # generate the HTML for directory
+ opendir(D, $path) or
+ return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "Cannot read directory '$path': $!";
+ my(@files) = sort readdir(D);
+ closedir(D);
+
+ # Make directory listing
+ require URI::Escape;
+ require HTML::Entities;
+ my $pathe = $path . ( $^O eq 'MacOS' ? ':' : '/');
+ for (@files) {
+ my $furl = URI::Escape::uri_escape($_);
+ if ( -d "$pathe$_" ) {
+ $furl .= '/';
+ $_ .= '/';
+ }
+ my $desc = HTML::Entities::encode($_);
+ $_ = qq{<LI><A HREF="$furl">$desc</A>};
+ }
+ # Ensure that the base URL is "/" terminated
+ my $base = $url->clone;
+ unless ($base->path =~ m|/$|) {
+ $base->path($base->path . "/");
+ }
+ my $html = join("\n",
+ "<HTML>\n<HEAD>",
+ "<TITLE>Directory $path</TITLE>",
+ "<BASE HREF=\"$base\">",
+ "</HEAD>\n<BODY>",
+ "<H1>Directory listing of $path</H1>",
+ "<UL>", @files, "</UL>",
+ "</BODY>\n</HTML>\n");
+
+ $response->header('Content-Type', 'text/html');
+ $response->header('Content-Length', length $html);
+ $html = "" if $method eq "HEAD";
+
+ return $self->collect_once($arg, $response, $html);
+
+ }
+
+ # path is a regular file
+ $response->header('Content-Length', $filesize);
+ LWP::MediaTypes::guess_media_type($path, $response);
+
+ # read the file
+ if ($method ne "HEAD") {
+ open(F, $path) or return new
+ HTTP::Response(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "Cannot read file '$path': $!");
+ binmode(F);
+ $response = $self->collect($arg, $response, sub {
+ my $content = "";
+ my $bytes = sysread(F, $content, $size);
+ return \$content if $bytes > 0;
+ return \ "";
+ });
+ close(F);
+ }
+
+ $response;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/ftp.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/ftp.pm
new file mode 100755
index 00000000000..d12acb32374
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/ftp.pm
@@ -0,0 +1,543 @@
+package LWP::Protocol::ftp;
+
+# Implementation of the ftp protocol (RFC 959). We let the Net::FTP
+# package do all the dirty work.
+
+use Carp ();
+
+use HTTP::Status ();
+use HTTP::Negotiate ();
+use HTTP::Response ();
+use LWP::MediaTypes ();
+use File::Listing ();
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+use strict;
+eval {
+ package LWP::Protocol::MyFTP;
+
+ require Net::FTP;
+ Net::FTP->require_version(2.00);
+
+ use vars qw(@ISA);
+ @ISA=qw(Net::FTP);
+
+ sub new {
+ my $class = shift;
+
+ my $self = $class->SUPER::new(@_) || return undef;
+
+ my $mess = $self->message; # welcome message
+ $mess =~ s|\n.*||s; # only first line left
+ $mess =~ s|\s*ready\.?$||;
+ # Make the version number more HTTP like
+ $mess =~ s|\s*\(Version\s*|/| and $mess =~ s|\)$||;
+ ${*$self}{myftp_server} = $mess;
+ #$response->header("Server", $mess);
+
+ $self;
+ }
+
+ sub http_server {
+ my $self = shift;
+ ${*$self}{myftp_server};
+ }
+
+ sub home {
+ my $self = shift;
+ my $old = ${*$self}{myftp_home};
+ if (@_) {
+ ${*$self}{myftp_home} = shift;
+ }
+ $old;
+ }
+
+ sub go_home {
+ my $self = shift;
+ $self->cwd(${*$self}{myftp_home});
+ }
+
+ sub request_count {
+ my $self = shift;
+ ++${*$self}{myftp_reqcount};
+ }
+
+ sub ping {
+ my $self = shift;
+ return $self->go_home;
+ }
+
+};
+my $init_failed = $@;
+
+
+sub _connect {
+ my($self, $host, $port, $user, $account, $password, $timeout) = @_;
+
+ my $key;
+ my $conn_cache = $self->{ua}{conn_cache};
+ if ($conn_cache) {
+ $key = "$host:$port:$user";
+ $key .= ":$account" if defined($account);
+ if (my $ftp = $conn_cache->withdraw("ftp", $key)) {
+ if ($ftp->ping) {
+ # save it again
+ $conn_cache->deposit("ftp", $key, $ftp);
+ return $ftp;
+ }
+ }
+ }
+
+ # try to make a connection
+ my $ftp = LWP::Protocol::MyFTP->new($host,
+ Port => $port,
+ Timeout => $timeout,
+ LocalAddr => $self->{ua}{local_address},
+ );
+ # XXX Should be some what to pass on 'Passive' (header??)
+ unless ($ftp) {
+ $@ =~ s/^Net::FTP: //;
+ return HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR, $@);
+ }
+
+ unless ($ftp->login($user, $password, $account)) {
+ # Unauthorized. Let's fake a RC_UNAUTHORIZED response
+ my $mess = scalar($ftp->message);
+ $mess =~ s/\n$//;
+ my $res = HTTP::Response->new(&HTTP::Status::RC_UNAUTHORIZED, $mess);
+ $res->header("Server", $ftp->http_server);
+ $res->header("WWW-Authenticate", qq(Basic Realm="FTP login"));
+ return $res;
+ }
+
+ my $home = $ftp->pwd;
+ $ftp->home($home);
+
+ $conn_cache->deposit("ftp", $key, $ftp) if $conn_cache;
+
+ return $ftp;
+}
+
+
+sub request
+{
+ my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+
+ $size = 4096 unless $size;
+
+ # check proxy
+ if (defined $proxy)
+ {
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ 'You can not proxy through the ftp');
+ }
+
+ my $url = $request->uri;
+ if ($url->scheme ne 'ftp') {
+ my $scheme = $url->scheme;
+ return HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "LWP::Protocol::ftp::request called for '$scheme'");
+ }
+
+ # check method
+ my $method = $request->method;
+
+ unless ($method eq 'GET' || $method eq 'HEAD' || $method eq 'PUT') {
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ 'Library does not allow method ' .
+ "$method for 'ftp:' URLs");
+ }
+
+ if ($init_failed) {
+ return HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ $init_failed);
+ }
+
+ my $host = $url->host;
+ my $port = $url->port;
+ my $user = $url->user;
+ my $password = $url->password;
+
+ # If a basic autorization header is present than we prefer these over
+ # the username/password specified in the URL.
+ {
+ my($u,$p) = $request->authorization_basic;
+ if (defined $u) {
+ $user = $u;
+ $password = $p;
+ }
+ }
+
+ # We allow the account to be specified in the "Account" header
+ my $account = $request->header('Account');
+
+ my $ftp = $self->_connect($host, $port, $user, $account, $password, $timeout);
+ return $ftp if ref($ftp) eq "HTTP::Response"; # ugh!
+
+ # Create an initial response object
+ my $response = HTTP::Response->new(&HTTP::Status::RC_OK, "OK");
+ $response->header(Server => $ftp->http_server);
+ $response->header('Client-Request-Num' => $ftp->request_count);
+ $response->request($request);
+
+ # Get & fix the path
+ my @path = grep { length } $url->path_segments;
+ my $remote_file = pop(@path);
+ $remote_file = '' unless defined $remote_file;
+
+ my $type;
+ if (ref $remote_file) {
+ my @params;
+ ($remote_file, @params) = @$remote_file;
+ for (@params) {
+ $type = $_ if s/^type=//;
+ }
+ }
+
+ if ($type && $type eq 'a') {
+ $ftp->ascii;
+ }
+ else {
+ $ftp->binary;
+ }
+
+ for (@path) {
+ unless ($ftp->cwd($_)) {
+ return HTTP::Response->new(&HTTP::Status::RC_NOT_FOUND,
+ "Can't chdir to $_");
+ }
+ }
+
+ if ($method eq 'GET' || $method eq 'HEAD') {
+ if (my $mod_time = $ftp->mdtm($remote_file)) {
+ $response->last_modified($mod_time);
+ if (my $ims = $request->if_modified_since) {
+ if ($mod_time <= $ims) {
+ $response->code(&HTTP::Status::RC_NOT_MODIFIED);
+ $response->message("Not modified");
+ return $response;
+ }
+ }
+ }
+
+ # We'll use this later to abort the transfer if necessary.
+ # if $max_size is defined, we need to abort early. Otherwise, it's
+ # a normal transfer
+ my $max_size = undef;
+
+ # Set resume location, if the client requested it
+ if ($request->header('Range') && $ftp->supported('REST'))
+ {
+ my $range_info = $request->header('Range');
+
+ # Change bytes=2772992-6781209 to just 2772992
+ my ($start_byte,$end_byte) = $range_info =~ /.*=\s*(\d+)-(\d+)?/;
+ if ( defined $start_byte && !defined $end_byte ) {
+
+ # open range -- only the start is specified
+
+ $ftp->restart( $start_byte );
+ # don't define $max_size, we don't want to abort early
+ }
+ elsif ( defined $start_byte && defined $end_byte &&
+ $start_byte >= 0 && $end_byte >= $start_byte ) {
+
+ $ftp->restart( $start_byte );
+ $max_size = $end_byte - $start_byte;
+ }
+ else {
+
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ 'Incorrect syntax for Range request');
+ }
+ }
+ elsif ($request->header('Range') && !$ftp->supported('REST'))
+ {
+ return HTTP::Response->new(&HTTP::Status::RC_NOT_IMPLEMENTED,
+ "Server does not support resume.");
+ }
+
+ my $data; # the data handle
+ if (length($remote_file) and $data = $ftp->retr($remote_file)) {
+ my($type, @enc) = LWP::MediaTypes::guess_media_type($remote_file);
+ $response->header('Content-Type', $type) if $type;
+ for (@enc) {
+ $response->push_header('Content-Encoding', $_);
+ }
+ my $mess = $ftp->message;
+ if ($mess =~ /\((\d+)\s+bytes\)/) {
+ $response->header('Content-Length', "$1");
+ }
+
+ if ($method ne 'HEAD') {
+ # Read data from server
+ $response = $self->collect($arg, $response, sub {
+ my $content = '';
+ my $result = $data->read($content, $size);
+
+ # Stop early if we need to.
+ if (defined $max_size)
+ {
+ # We need an interface to Net::FTP::dataconn for getting
+ # the number of bytes already read
+ my $bytes_received = $data->bytes_read();
+
+ # We were already over the limit. (Should only happen
+ # once at the end.)
+ if ($bytes_received - length($content) > $max_size)
+ {
+ $content = '';
+ }
+ # We just went over the limit
+ elsif ($bytes_received > $max_size)
+ {
+ # Trim content
+ $content = substr($content, 0,
+ $max_size - ($bytes_received - length($content)) );
+ }
+ # We're under the limit
+ else
+ {
+ }
+ }
+
+ return \$content;
+ } );
+ }
+ # abort is needed for HEAD, it's == close if the transfer has
+ # already completed.
+ unless ($data->abort) {
+ # Something did not work too well. Note that we treat
+ # responses to abort() with code 0 in case of HEAD as ok
+ # (at least wu-ftpd 2.6.1(1) does that).
+ if ($method ne 'HEAD' || $ftp->code != 0) {
+ $response->code(&HTTP::Status::RC_INTERNAL_SERVER_ERROR);
+ $response->message("FTP close response: " . $ftp->code .
+ " " . $ftp->message);
+ }
+ }
+ }
+ elsif (!length($remote_file) || ( $ftp->code >= 400 && $ftp->code < 600 )) {
+ # not a plain file, try to list instead
+ if (length($remote_file) && !$ftp->cwd($remote_file)) {
+ return HTTP::Response->new(&HTTP::Status::RC_NOT_FOUND,
+ "File '$remote_file' not found");
+ }
+
+ # It should now be safe to try to list the directory
+ my @lsl = $ftp->dir;
+
+ # Try to figure out if the user want us to convert the
+ # directory listing to HTML.
+ my @variants =
+ (
+ ['html', 0.60, 'text/html' ],
+ ['dir', 1.00, 'text/ftp-dir-listing' ]
+ );
+ #$HTTP::Negotiate::DEBUG=1;
+ my $prefer = HTTP::Negotiate::choose(\@variants, $request);
+
+ my $content = '';
+
+ if (!defined($prefer)) {
+ return HTTP::Response->new(&HTTP::Status::RC_NOT_ACCEPTABLE,
+ "Neither HTML nor directory listing wanted");
+ }
+ elsif ($prefer eq 'html') {
+ $response->header('Content-Type' => 'text/html');
+ $content = "<HEAD><TITLE>File Listing</TITLE>\n";
+ my $base = $request->uri->clone;
+ my $path = $base->path;
+ $base->path("$path/") unless $path =~ m|/$|;
+ $content .= qq(<BASE HREF="$base">\n</HEAD>\n);
+ $content .= "<BODY>\n<UL>\n";
+ for (File::Listing::parse_dir(\@lsl, 'GMT')) {
+ my($name, $type, $size, $mtime, $mode) = @$_;
+ $content .= qq( <LI> <a href="$name">$name</a>);
+ $content .= " $size bytes" if $type eq 'f';
+ $content .= "\n";
+ }
+ $content .= "</UL></body>\n";
+ }
+ else {
+ $response->header('Content-Type', 'text/ftp-dir-listing');
+ $content = join("\n", @lsl, '');
+ }
+
+ $response->header('Content-Length', length($content));
+
+ if ($method ne 'HEAD') {
+ $response = $self->collect_once($arg, $response, $content);
+ }
+ }
+ else {
+ my $res = HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ "FTP return code " . $ftp->code);
+ $res->content_type("text/plain");
+ $res->content($ftp->message);
+ return $res;
+ }
+ }
+ elsif ($method eq 'PUT') {
+ # method must be PUT
+ unless (length($remote_file)) {
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ "Must have a file name to PUT to");
+ }
+ my $data;
+ if ($data = $ftp->stor($remote_file)) {
+ my $content = $request->content;
+ my $bytes = 0;
+ if (defined $content) {
+ if (ref($content) eq 'SCALAR') {
+ $bytes = $data->write($$content, length($$content));
+ }
+ elsif (ref($content) eq 'CODE') {
+ my($buf, $n);
+ while (length($buf = &$content)) {
+ $n = $data->write($buf, length($buf));
+ last unless $n;
+ $bytes += $n;
+ }
+ }
+ elsif (!ref($content)) {
+ if (defined $content && length($content)) {
+ $bytes = $data->write($content, length($content));
+ }
+ }
+ else {
+ die "Bad content";
+ }
+ }
+ $data->close;
+
+ $response->code(&HTTP::Status::RC_CREATED);
+ $response->header('Content-Type', 'text/plain');
+ $response->content("$bytes bytes stored as $remote_file on $host\n")
+
+ }
+ else {
+ my $res = HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ "FTP return code " . $ftp->code);
+ $res->content_type("text/plain");
+ $res->content($ftp->message);
+ return $res;
+ }
+ }
+ else {
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ "Illegal method $method");
+ }
+
+ $response;
+}
+
+1;
+
+__END__
+
+# This is what RFC 1738 has to say about FTP access:
+# --------------------------------------------------
+#
+# 3.2. FTP
+#
+# The FTP URL scheme is used to designate files and directories on
+# Internet hosts accessible using the FTP protocol (RFC959).
+#
+# A FTP URL follow the syntax described in Section 3.1. If :<port> is
+# omitted, the port defaults to 21.
+#
+# 3.2.1. FTP Name and Password
+#
+# A user name and password may be supplied; they are used in the ftp
+# "USER" and "PASS" commands after first making the connection to the
+# FTP server. If no user name or password is supplied and one is
+# requested by the FTP server, the conventions for "anonymous" FTP are
+# to be used, as follows:
+#
+# The user name "anonymous" is supplied.
+#
+# The password is supplied as the Internet e-mail address
+# of the end user accessing the resource.
+#
+# If the URL supplies a user name but no password, and the remote
+# server requests a password, the program interpreting the FTP URL
+# should request one from the user.
+#
+# 3.2.2. FTP url-path
+#
+# The url-path of a FTP URL has the following syntax:
+#
+# <cwd1>/<cwd2>/.../<cwdN>/<name>;type=<typecode>
+#
+# Where <cwd1> through <cwdN> and <name> are (possibly encoded) strings
+# and <typecode> is one of the characters "a", "i", or "d". The part
+# ";type=<typecode>" may be omitted. The <cwdx> and <name> parts may be
+# empty. The whole url-path may be omitted, including the "/"
+# delimiting it from the prefix containing user, password, host, and
+# port.
+#
+# The url-path is interpreted as a series of FTP commands as follows:
+#
+# Each of the <cwd> elements is to be supplied, sequentially, as the
+# argument to a CWD (change working directory) command.
+#
+# If the typecode is "d", perform a NLST (name list) command with
+# <name> as the argument, and interpret the results as a file
+# directory listing.
+#
+# Otherwise, perform a TYPE command with <typecode> as the argument,
+# and then access the file whose name is <name> (for example, using
+# the RETR command.)
+#
+# Within a name or CWD component, the characters "/" and ";" are
+# reserved and must be encoded. The components are decoded prior to
+# their use in the FTP protocol. In particular, if the appropriate FTP
+# sequence to access a particular file requires supplying a string
+# containing a "/" as an argument to a CWD or RETR command, it is
+# necessary to encode each "/".
+#
+# For example, the URL <URL:ftp://myname@host.dom/%2Fetc/motd> is
+# interpreted by FTP-ing to "host.dom", logging in as "myname"
+# (prompting for a password if it is asked for), and then executing
+# "CWD /etc" and then "RETR motd". This has a different meaning from
+# <URL:ftp://myname@host.dom/etc/motd> which would "CWD etc" and then
+# "RETR motd"; the initial "CWD" might be executed relative to the
+# default directory for "myname". On the other hand,
+# <URL:ftp://myname@host.dom//etc/motd>, would "CWD " with a null
+# argument, then "CWD etc", and then "RETR motd".
+#
+# FTP URLs may also be used for other operations; for example, it is
+# possible to update a file on a remote file server, or infer
+# information about it from the directory listings. The mechanism for
+# doing so is not spelled out here.
+#
+# 3.2.3. FTP Typecode is Optional
+#
+# The entire ;type=<typecode> part of a FTP URL is optional. If it is
+# omitted, the client program interpreting the URL must guess the
+# appropriate mode to use. In general, the data content type of a file
+# can only be guessed from the name, e.g., from the suffix of the name;
+# the appropriate type code to be used for transfer of the file can
+# then be deduced from the data content of the file.
+#
+# 3.2.4 Hierarchy
+#
+# For some file systems, the "/" used to denote the hierarchical
+# structure of the URL corresponds to the delimiter used to construct a
+# file name hierarchy, and thus, the filename will look similar to the
+# URL path. This does NOT mean that the URL is a Unix filename.
+#
+# 3.2.5. Optimization
+#
+# Clients accessing resources via FTP may employ additional heuristics
+# to optimize the interaction. For some FTP servers, for example, it
+# may be reasonable to keep the control connection open while accessing
+# multiple URLs from the same server. However, there is no common
+# hierarchical model to the FTP protocol, so if a directory change
+# command has been given, it is impossible in general to deduce what
+# sequence should be given to navigate to another directory for a
+# second retrieval, if the paths are different. The only reliable
+# algorithm is to disconnect and reestablish the control connection.
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/gopher.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/gopher.pm
new file mode 100755
index 00000000000..db6c0bfba9d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/gopher.pm
@@ -0,0 +1,213 @@
+package LWP::Protocol::gopher;
+
+# Implementation of the gopher protocol (RFC 1436)
+#
+# This code is based on 'wwwgopher.pl,v 0.10 1994/10/17 18:12:34 shelden'
+# which in turn is a vastly modified version of Oscar's http'get()
+# dated 28/3/94 in <ftp://cui.unige.ch/PUBLIC/oscar/scripts/http.pl>
+# including contributions from Marc van Heyningen and Martijn Koster.
+
+use strict;
+use vars qw(@ISA);
+
+require HTTP::Response;
+require HTTP::Status;
+require IO::Socket;
+require IO::Select;
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+
+my %gopher2mimetype = (
+ '0' => 'text/plain', # 0 file
+ '1' => 'text/html', # 1 menu
+ # 2 CSO phone-book server
+ # 3 Error
+ '4' => 'application/mac-binhex40', # 4 BinHexed Macintosh file
+ '5' => 'application/zip', # 5 DOS binary archive of some sort
+ '6' => 'application/octet-stream', # 6 UNIX uuencoded file.
+ '7' => 'text/html', # 7 Index-Search server
+ # 8 telnet session
+ '9' => 'application/octet-stream', # 9 binary file
+ 'h' => 'text/html', # html
+ 'g' => 'image/gif', # gif
+ 'I' => 'image/*', # some kind of image
+);
+
+my %gopher2encoding = (
+ '6' => 'x_uuencode', # 6 UNIX uuencoded file.
+);
+
+sub request
+{
+ my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+
+ $size = 4096 unless $size;
+
+ # check proxy
+ if (defined $proxy) {
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ 'You can not proxy through the gopher');
+ }
+
+ my $url = $request->uri;
+ die "bad scheme" if $url->scheme ne 'gopher';
+
+
+ my $method = $request->method;
+ unless ($method eq 'GET' || $method eq 'HEAD') {
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ 'Library does not allow method ' .
+ "$method for 'gopher:' URLs");
+ }
+
+ my $gophertype = $url->gopher_type;
+ unless (exists $gopher2mimetype{$gophertype}) {
+ return HTTP::Response->new(&HTTP::Status::RC_NOT_IMPLEMENTED,
+ 'Library does not support gophertype ' .
+ $gophertype);
+ }
+
+ my $response = HTTP::Response->new(&HTTP::Status::RC_OK, "OK");
+ $response->header('Content-type' => $gopher2mimetype{$gophertype}
+ || 'text/plain');
+ $response->header('Content-Encoding' => $gopher2encoding{$gophertype})
+ if exists $gopher2encoding{$gophertype};
+
+ if ($method eq 'HEAD') {
+ # XXX: don't even try it so we set this header
+ $response->header('Client-Warning' => 'Client answer only');
+ return $response;
+ }
+
+ if ($gophertype eq '7' && ! $url->search) {
+ # the url is the prompt for a gopher search; supply boiler-plate
+ return $self->collect_once($arg, $response, <<"EOT");
+<HEAD>
+<TITLE>Gopher Index</TITLE>
+<ISINDEX>
+</HEAD>
+<BODY>
+<H1>$url<BR>Gopher Search</H1>
+This is a searchable Gopher index.
+Use the search function of your browser to enter search terms.
+</BODY>
+EOT
+ }
+
+ my $host = $url->host;
+ my $port = $url->port;
+
+ my $requestLine = "";
+
+ my $selector = $url->selector;
+ if (defined $selector) {
+ $requestLine .= $selector;
+ my $search = $url->search;
+ if (defined $search) {
+ $requestLine .= "\t$search";
+ my $string = $url->string;
+ if (defined $string) {
+ $requestLine .= "\t$string";
+ }
+ }
+ }
+ $requestLine .= "\015\012";
+
+ # potential request headers are just ignored
+
+ # Ok, lets make the request
+ my $socket = IO::Socket::INET->new(PeerAddr => $host,
+ PeerPort => $port,
+ LocalAddr => $self->{ua}{local_address},
+ Proto => 'tcp',
+ Timeout => $timeout);
+ die "Can't connect to $host:$port" unless $socket;
+ my $sel = IO::Select->new($socket);
+
+ {
+ die "write timeout" if $timeout && !$sel->can_write($timeout);
+ my $n = syswrite($socket, $requestLine, length($requestLine));
+ die $! unless defined($n);
+ die "short write" if $n != length($requestLine);
+ }
+
+ my $user_arg = $arg;
+
+ # must handle menus in a special way since they are to be
+ # converted to HTML. Undefing $arg ensures that the user does
+ # not see the data before we get a change to convert it.
+ $arg = undef if $gophertype eq '1' || $gophertype eq '7';
+
+ # collect response
+ my $buf = '';
+ $response = $self->collect($arg, $response, sub {
+ die "read timeout" if $timeout && !$sel->can_read($timeout);
+ my $n = sysread($socket, $buf, $size);
+ die $! unless defined($n);
+ return \$buf;
+ } );
+
+ # Convert menu to HTML and return data to user.
+ if ($gophertype eq '1' || $gophertype eq '7') {
+ my $content = menu2html($response->content);
+ if (defined $user_arg) {
+ $response = $self->collect_once($user_arg, $response, $content);
+ }
+ else {
+ $response->content($content);
+ }
+ }
+
+ $response;
+}
+
+
+sub gopher2url
+{
+ my($gophertype, $path, $host, $port) = @_;
+
+ my $url;
+
+ if ($gophertype eq '8' || $gophertype eq 'T') {
+ # telnet session
+ $url = $HTTP::URI_CLASS->new($gophertype eq '8' ? 'telnet:':'tn3270:');
+ $url->user($path) if defined $path;
+ }
+ else {
+ $path = URI::Escape::uri_escape($path);
+ $url = $HTTP::URI_CLASS->new("gopher:/$gophertype$path");
+ }
+ $url->host($host);
+ $url->port($port);
+ $url;
+}
+
+sub menu2html {
+ my($menu) = @_;
+
+ $menu =~ s/\015//g; # remove carriage return
+ my $tmp = <<"EOT";
+<HTML>
+<HEAD>
+ <TITLE>Gopher menu</TITLE>
+</HEAD>
+<BODY>
+<H1>Gopher menu</H1>
+EOT
+ for (split("\n", $menu)) {
+ last if /^\./;
+ my($pretty, $path, $host, $port) = split("\t");
+
+ $pretty =~ s/^(.)//;
+ my $type = $1;
+
+ my $url = gopher2url($type, $path, $host, $port)->as_string;
+ $tmp .= qq{<A HREF="$url">$pretty</A><BR>\n};
+ }
+ $tmp .= "</BODY>\n</HTML>\n";
+ $tmp;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/http.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/http.pm
new file mode 100755
index 00000000000..b067311884f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/http.pm
@@ -0,0 +1,475 @@
+package LWP::Protocol::http;
+
+use strict;
+
+require HTTP::Response;
+require HTTP::Status;
+require Net::HTTP;
+
+use vars qw(@ISA @EXTRA_SOCK_OPTS);
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+my $CRLF = "\015\012";
+
+sub _new_socket
+{
+ my($self, $host, $port, $timeout) = @_;
+ my $conn_cache = $self->{ua}{conn_cache};
+ if ($conn_cache) {
+ if (my $sock = $conn_cache->withdraw($self->socket_type, "$host:$port")) {
+ return $sock if $sock && !$sock->can_read(0);
+ # if the socket is readable, then either the peer has closed the
+ # connection or there are some garbage bytes on it. In either
+ # case we abandon it.
+ $sock->close;
+ }
+ }
+
+ local($^W) = 0; # IO::Socket::INET can be noisy
+ my $sock = $self->socket_class->new(PeerAddr => $host,
+ PeerPort => $port,
+ LocalAddr => $self->{ua}{local_address},
+ Proto => 'tcp',
+ Timeout => $timeout,
+ KeepAlive => !!$conn_cache,
+ SendTE => 1,
+ $self->_extra_sock_opts($host, $port),
+ );
+
+ unless ($sock) {
+ # IO::Socket::INET leaves additional error messages in $@
+ $@ =~ s/^.*?: //;
+ die "Can't connect to $host:$port ($@)";
+ }
+
+ # perl 5.005's IO::Socket does not have the blocking method.
+ eval { $sock->blocking(0); };
+
+ $sock;
+}
+
+sub socket_type
+{
+ return "http";
+}
+
+sub socket_class
+{
+ my $self = shift;
+ (ref($self) || $self) . "::Socket";
+}
+
+sub _extra_sock_opts # to be overridden by subclass
+{
+ return @EXTRA_SOCK_OPTS;
+}
+
+sub _check_sock
+{
+ #my($self, $req, $sock) = @_;
+}
+
+sub _get_sock_info
+{
+ my($self, $res, $sock) = @_;
+ if (defined(my $peerhost = $sock->peerhost)) {
+ $res->header("Client-Peer" => "$peerhost:" . $sock->peerport);
+ }
+}
+
+sub _fixup_header
+{
+ my($self, $h, $url, $proxy) = @_;
+
+ # Extract 'Host' header
+ my $hhost = $url->authority;
+ if ($hhost =~ s/^([^\@]*)\@//) { # get rid of potential "user:pass@"
+ # add authorization header if we need them. HTTP URLs do
+ # not really support specification of user and password, but
+ # we allow it.
+ if (defined($1) && not $h->header('Authorization')) {
+ require URI::Escape;
+ $h->authorization_basic(map URI::Escape::uri_unescape($_),
+ split(":", $1, 2));
+ }
+ }
+ $h->init_header('Host' => $hhost);
+
+ if ($proxy) {
+ # Check the proxy URI's userinfo() for proxy credentials
+ # export http_proxy="http://proxyuser:proxypass@proxyhost:port"
+ my $p_auth = $proxy->userinfo();
+ if(defined $p_auth) {
+ require URI::Escape;
+ $h->proxy_authorization_basic(map URI::Escape::uri_unescape($_),
+ split(":", $p_auth, 2))
+ }
+ }
+}
+
+sub hlist_remove {
+ my($hlist, $k) = @_;
+ $k = lc $k;
+ for (my $i = @$hlist - 2; $i >= 0; $i -= 2) {
+ next unless lc($hlist->[$i]) eq $k;
+ splice(@$hlist, $i, 2);
+ }
+}
+
+sub request
+{
+ my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+
+ $size ||= 4096;
+
+ # check method
+ my $method = $request->method;
+ unless ($method =~ /^[A-Za-z0-9_!\#\$%&\'*+\-.^\`|~]+$/) { # HTTP token
+ return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+ 'Library does not allow method ' .
+ "$method for 'http:' URLs";
+ }
+
+ my $url = $request->uri;
+ my($host, $port, $fullpath);
+
+ # Check if we're proxy'ing
+ if (defined $proxy) {
+ # $proxy is an URL to an HTTP server which will proxy this request
+ $host = $proxy->host;
+ $port = $proxy->port;
+ $fullpath = $method eq "CONNECT" ?
+ ($url->host . ":" . $url->port) :
+ $url->as_string;
+ }
+ else {
+ $host = $url->host;
+ $port = $url->port;
+ $fullpath = $url->path_query;
+ $fullpath = "/$fullpath" unless $fullpath =~ m,^/,;
+ }
+
+ # connect to remote site
+ my $socket = $self->_new_socket($host, $port, $timeout);
+ $self->_check_sock($request, $socket);
+
+ my @h;
+ my $request_headers = $request->headers->clone;
+ $self->_fixup_header($request_headers, $url, $proxy);
+
+ $request_headers->scan(sub {
+ my($k, $v) = @_;
+ $k =~ s/^://;
+ $v =~ s/\n/ /g;
+ push(@h, $k, $v);
+ });
+
+ my $content_ref = $request->content_ref;
+ $content_ref = $$content_ref if ref($$content_ref);
+ my $chunked;
+ my $has_content;
+
+ if (ref($content_ref) eq 'CODE') {
+ my $clen = $request_headers->header('Content-Length');
+ $has_content++ if $clen;
+ unless (defined $clen) {
+ push(@h, "Transfer-Encoding" => "chunked");
+ $has_content++;
+ $chunked++;
+ }
+ }
+ else {
+ # Set (or override) Content-Length header
+ my $clen = $request_headers->header('Content-Length');
+ if (defined($$content_ref) && length($$content_ref)) {
+ $has_content = length($$content_ref);
+ if (!defined($clen) || $clen ne $has_content) {
+ if (defined $clen) {
+ warn "Content-Length header value was wrong, fixed";
+ hlist_remove(\@h, 'Content-Length');
+ }
+ push(@h, 'Content-Length' => $has_content);
+ }
+ }
+ elsif ($clen) {
+ warn "Content-Length set when there is no content, fixed";
+ hlist_remove(\@h, 'Content-Length');
+ }
+ }
+
+ my $write_wait = 0;
+ $write_wait = 2
+ if ($request_headers->header("Expect") || "") =~ /100-continue/;
+
+ my $req_buf = $socket->format_request($method, $fullpath, @h);
+ #print "------\n$req_buf\n------\n";
+
+ if (!$has_content || $write_wait || $has_content > 8*1024) {
+ WRITE:
+ {
+ # Since this just writes out the header block it should almost
+ # always succeed to send the whole buffer in a single write call.
+ my $n = $socket->syswrite($req_buf, length($req_buf));
+ unless (defined $n) {
+ redo WRITE if $!{EINTR};
+ if ($!{EAGAIN}) {
+ select(undef, undef, undef, 0.1);
+ redo WRITE;
+ }
+ die "write failed: $!";
+ }
+ if ($n) {
+ substr($req_buf, 0, $n, "");
+ }
+ else {
+ select(undef, undef, undef, 0.5);
+ }
+ redo WRITE if length $req_buf;
+ }
+ }
+
+ my($code, $mess, @junk);
+ my $drop_connection;
+
+ if ($has_content) {
+ my $eof;
+ my $wbuf;
+ my $woffset = 0;
+ if (ref($content_ref) eq 'CODE') {
+ my $buf = &$content_ref();
+ $buf = "" unless defined($buf);
+ $buf = sprintf "%x%s%s%s", length($buf), $CRLF, $buf, $CRLF
+ if $chunked;
+ substr($buf, 0, 0) = $req_buf if $req_buf;
+ $wbuf = \$buf;
+ }
+ else {
+ if ($req_buf) {
+ my $buf = $req_buf . $$content_ref;
+ $wbuf = \$buf;
+ }
+ else {
+ $wbuf = $content_ref;
+ }
+ $eof = 1;
+ }
+
+ my $fbits = '';
+ vec($fbits, fileno($socket), 1) = 1;
+
+ WRITE:
+ while ($woffset < length($$wbuf)) {
+
+ my $sel_timeout = $timeout;
+ if ($write_wait) {
+ $sel_timeout = $write_wait if $write_wait < $sel_timeout;
+ }
+ my $time_before;
+ $time_before = time if $sel_timeout;
+
+ my $rbits = $fbits;
+ my $wbits = $write_wait ? undef : $fbits;
+ my $sel_timeout_before = $sel_timeout;
+ SELECT:
+ {
+ my $nfound = select($rbits, $wbits, undef, $sel_timeout);
+ if ($nfound < 0) {
+ if ($!{EINTR} || $!{EAGAIN}) {
+ if ($time_before) {
+ $sel_timeout = $sel_timeout_before - (time - $time_before);
+ $sel_timeout = 0 if $sel_timeout < 0;
+ }
+ redo SELECT;
+ }
+ die "select failed: $!";
+ }
+ }
+
+ if ($write_wait) {
+ $write_wait -= time - $time_before;
+ $write_wait = 0 if $write_wait < 0;
+ }
+
+ if (defined($rbits) && $rbits =~ /[^\0]/) {
+ # readable
+ my $buf = $socket->_rbuf;
+ my $n = $socket->sysread($buf, 1024, length($buf));
+ unless (defined $n) {
+ die "read failed: $!" unless $!{EINTR} || $!{EAGAIN};
+ # if we get here the rest of the block will do nothing
+ # and we will retry the read on the next round
+ }
+ elsif ($n == 0) {
+ # the server closed the connection before we finished
+ # writing all the request content. No need to write any more.
+ $drop_connection++;
+ last WRITE;
+ }
+ $socket->_rbuf($buf);
+ if (!$code && $buf =~ /\015?\012\015?\012/) {
+ # a whole response header is present, so we can read it without blocking
+ ($code, $mess, @h) = $socket->read_response_headers(laxed => 1,
+ junk_out => \@junk,
+ );
+ if ($code eq "100") {
+ $write_wait = 0;
+ undef($code);
+ }
+ else {
+ $drop_connection++;
+ last WRITE;
+ # XXX should perhaps try to abort write in a nice way too
+ }
+ }
+ }
+ if (defined($wbits) && $wbits =~ /[^\0]/) {
+ my $n = $socket->syswrite($$wbuf, length($$wbuf), $woffset);
+ unless (defined $n) {
+ die "write failed: $!" unless $!{EINTR} || $!{EAGAIN};
+ $n = 0; # will retry write on the next round
+ }
+ elsif ($n == 0) {
+ die "write failed: no bytes written";
+ }
+ $woffset += $n;
+
+ if (!$eof && $woffset >= length($$wbuf)) {
+ # need to refill buffer from $content_ref code
+ my $buf = &$content_ref();
+ $buf = "" unless defined($buf);
+ $eof++ unless length($buf);
+ $buf = sprintf "%x%s%s%s", length($buf), $CRLF, $buf, $CRLF
+ if $chunked;
+ $wbuf = \$buf;
+ $woffset = 0;
+ }
+ }
+ } # WRITE
+ }
+
+ ($code, $mess, @h) = $socket->read_response_headers(laxed => 1, junk_out => \@junk)
+ unless $code;
+ ($code, $mess, @h) = $socket->read_response_headers(laxed => 1, junk_out => \@junk)
+ if $code eq "100";
+
+ my $response = HTTP::Response->new($code, $mess);
+ my $peer_http_version = $socket->peer_http_version;
+ $response->protocol("HTTP/$peer_http_version");
+ {
+ local $HTTP::Headers::TRANSLATE_UNDERSCORE;
+ $response->push_header(@h);
+ }
+ $response->push_header("Client-Junk" => \@junk) if @junk;
+
+ $response->request($request);
+ $self->_get_sock_info($response, $socket);
+
+ if ($method eq "CONNECT") {
+ $response->{client_socket} = $socket; # so it can be picked up
+ return $response;
+ }
+
+ if (my @te = $response->remove_header('Transfer-Encoding')) {
+ $response->push_header('Client-Transfer-Encoding', \@te);
+ }
+ $response->push_header('Client-Response-Num', scalar $socket->increment_response_count);
+
+ my $complete;
+ $response = $self->collect($arg, $response, sub {
+ my $buf = ""; #prevent use of uninitialized value in SSLeay.xs
+ my $n;
+ READ:
+ {
+ $n = $socket->read_entity_body($buf, $size);
+ unless (defined $n) {
+ redo READ if $!{EINTR} || $!{EAGAIN};
+ die "read failed: $!";
+ }
+ redo READ if $n == -1;
+ }
+ $complete++ if !$n;
+ return \$buf;
+ } );
+ $drop_connection++ unless $complete;
+
+ @h = $socket->get_trailers;
+ if (@h) {
+ local $HTTP::Headers::TRANSLATE_UNDERSCORE;
+ $response->push_header(@h);
+ }
+
+ # keep-alive support
+ unless ($drop_connection) {
+ if (my $conn_cache = $self->{ua}{conn_cache}) {
+ my %connection = map { (lc($_) => 1) }
+ split(/\s*,\s*/, ($response->header("Connection") || ""));
+ if (($peer_http_version eq "1.1" && !$connection{close}) ||
+ $connection{"keep-alive"})
+ {
+ $conn_cache->deposit($self->socket_type, "$host:$port", $socket);
+ }
+ }
+ }
+
+ $response;
+}
+
+
+#-----------------------------------------------------------
+package LWP::Protocol::http::SocketMethods;
+
+sub sysread {
+ my $self = shift;
+ if (my $timeout = ${*$self}{io_socket_timeout}) {
+ die "read timeout" unless $self->can_read($timeout);
+ }
+ else {
+ # since we have made the socket non-blocking we
+ # use select to wait for some data to arrive
+ $self->can_read(undef) || die "Assert";
+ }
+ sysread($self, $_[0], $_[1], $_[2] || 0);
+}
+
+sub can_read {
+ my($self, $timeout) = @_;
+ my $fbits = '';
+ vec($fbits, fileno($self), 1) = 1;
+ SELECT:
+ {
+ my $before;
+ $before = time if $timeout;
+ my $nfound = select($fbits, undef, undef, $timeout);
+ if ($nfound < 0) {
+ if ($!{EINTR} || $!{EAGAIN}) {
+ # don't really think EAGAIN can happen here
+ if ($timeout) {
+ $timeout -= time - $before;
+ $timeout = 0 if $timeout < 0;
+ }
+ redo SELECT;
+ }
+ die "select failed: $!";
+ }
+ return $nfound > 0;
+ }
+}
+
+sub ping {
+ my $self = shift;
+ !$self->can_read(0);
+}
+
+sub increment_response_count {
+ my $self = shift;
+ return ++${*$self}{'myhttp_response_count'};
+}
+
+#-----------------------------------------------------------
+package LWP::Protocol::http::Socket;
+use vars qw(@ISA);
+@ISA = qw(LWP::Protocol::http::SocketMethods Net::HTTP);
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/http10.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/http10.pm
new file mode 100755
index 00000000000..ac84f6de747
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/http10.pm
@@ -0,0 +1,289 @@
+package LWP::Protocol::http10;
+
+use strict;
+
+require HTTP::Response;
+require HTTP::Status;
+require IO::Socket;
+require IO::Select;
+
+use vars qw(@ISA @EXTRA_SOCK_OPTS);
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+my $CRLF = "\015\012"; # how lines should be terminated;
+ # "\r\n" is not correct on all systems, for
+ # instance MacPerl defines it to "\012\015"
+
+sub _new_socket
+{
+ my($self, $host, $port, $timeout) = @_;
+
+ local($^W) = 0; # IO::Socket::INET can be noisy
+ my $sock = IO::Socket::INET->new(PeerAddr => $host,
+ PeerPort => $port,
+ Proto => 'tcp',
+ Timeout => $timeout,
+ $self->_extra_sock_opts($host, $port),
+ );
+ unless ($sock) {
+ # IO::Socket::INET leaves additional error messages in $@
+ $@ =~ s/^.*?: //;
+ die "Can't connect to $host:$port ($@)";
+ }
+ $sock;
+}
+
+sub _extra_sock_opts # to be overridden by subclass
+{
+ return @EXTRA_SOCK_OPTS;
+}
+
+
+sub _check_sock
+{
+ #my($self, $req, $sock) = @_;
+}
+
+sub _get_sock_info
+{
+ my($self, $res, $sock) = @_;
+ if (defined(my $peerhost = $sock->peerhost)) {
+ $res->header("Client-Peer" => "$peerhost:" . $sock->peerport);
+ }
+}
+
+sub _fixup_header
+{
+ my($self, $h, $url, $proxy) = @_;
+
+ $h->remove_header('Connection'); # need support here to be useful
+
+ # HTTP/1.1 will require us to send the 'Host' header, so we might
+ # as well start now.
+ my $hhost = $url->authority;
+ if ($hhost =~ s/^([^\@]*)\@//) { # get rid of potential "user:pass@"
+ # add authorization header if we need them. HTTP URLs do
+ # not really support specification of user and password, but
+ # we allow it.
+ if (defined($1) && not $h->header('Authorization')) {
+ require URI::Escape;
+ $h->authorization_basic(map URI::Escape::uri_unescape($_),
+ split(":", $1, 2));
+ }
+ }
+ $h->init_header('Host' => $hhost);
+
+ if ($proxy) {
+ # Check the proxy URI's userinfo() for proxy credentials
+ # export http_proxy="http://proxyuser:proxypass@proxyhost:port"
+ my $p_auth = $proxy->userinfo();
+ if(defined $p_auth) {
+ require URI::Escape;
+ $h->proxy_authorization_basic(map URI::Escape::uri_unescape($_),
+ split(":", $p_auth, 2))
+ }
+ }
+}
+
+
+sub request
+{
+ my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+
+ $size ||= 4096;
+
+ # check method
+ my $method = $request->method;
+ unless ($method =~ /^[A-Za-z0-9_!\#\$%&\'*+\-.^\`|~]+$/) { # HTTP token
+ return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+ 'Library does not allow method ' .
+ "$method for 'http:' URLs";
+ }
+
+ my $url = $request->uri;
+ my($host, $port, $fullpath);
+
+ # Check if we're proxy'ing
+ if (defined $proxy) {
+ # $proxy is an URL to an HTTP server which will proxy this request
+ $host = $proxy->host;
+ $port = $proxy->port;
+ $fullpath = $method eq "CONNECT" ?
+ ($url->host . ":" . $url->port) :
+ $url->as_string;
+ }
+ else {
+ $host = $url->host;
+ $port = $url->port;
+ $fullpath = $url->path_query;
+ $fullpath = "/" unless length $fullpath;
+ }
+
+ # connect to remote site
+ my $socket = $self->_new_socket($host, $port, $timeout);
+ $self->_check_sock($request, $socket);
+
+ my $sel = IO::Select->new($socket) if $timeout;
+
+ my $request_line = "$method $fullpath HTTP/1.0$CRLF";
+
+ my $h = $request->headers->clone;
+ my $cont_ref = $request->content_ref;
+ $cont_ref = $$cont_ref if ref($$cont_ref);
+ my $ctype = ref($cont_ref);
+
+ # If we're sending content we *have* to specify a content length
+ # otherwise the server won't know a messagebody is coming.
+ if ($ctype eq 'CODE') {
+ die 'No Content-Length header for request with dynamic content'
+ unless defined($h->header('Content-Length')) ||
+ $h->content_type =~ /^multipart\//;
+ # For HTTP/1.1 we could have used chunked transfer encoding...
+ }
+ else {
+ $h->header('Content-Length' => length $$cont_ref)
+ if defined($$cont_ref) && length($$cont_ref);
+ }
+
+ $self->_fixup_header($h, $url, $proxy);
+
+ my $buf = $request_line . $h->as_string($CRLF) . $CRLF;
+ my $n; # used for return value from syswrite/sysread
+ my $length;
+ my $offset;
+
+ # syswrite $buf
+ $length = length($buf);
+ $offset = 0;
+ while ( $offset < $length ) {
+ die "write timeout" if $timeout && !$sel->can_write($timeout);
+ $n = $socket->syswrite($buf, $length-$offset, $offset );
+ die $! unless defined($n);
+ $offset += $n;
+ }
+
+ if ($ctype eq 'CODE') {
+ while ( ($buf = &$cont_ref()), defined($buf) && length($buf)) {
+ # syswrite $buf
+ $length = length($buf);
+ $offset = 0;
+ while ( $offset < $length ) {
+ die "write timeout" if $timeout && !$sel->can_write($timeout);
+ $n = $socket->syswrite($buf, $length-$offset, $offset );
+ die $! unless defined($n);
+ $offset += $n;
+ }
+ }
+ }
+ elsif (defined($$cont_ref) && length($$cont_ref)) {
+ # syswrite $$cont_ref
+ $length = length($$cont_ref);
+ $offset = 0;
+ while ( $offset < $length ) {
+ die "write timeout" if $timeout && !$sel->can_write($timeout);
+ $n = $socket->syswrite($$cont_ref, $length-$offset, $offset );
+ die $! unless defined($n);
+ $offset += $n;
+ }
+ }
+
+ # read response line from server
+ my $response;
+ $buf = '';
+
+ # Inside this loop we will read the response line and all headers
+ # found in the response.
+ while (1) {
+ die "read timeout" if $timeout && !$sel->can_read($timeout);
+ $n = $socket->sysread($buf, $size, length($buf));
+ die $! unless defined($n);
+ die "unexpected EOF before status line seen" unless $n;
+
+ if ($buf =~ s/^(HTTP\/\d+\.\d+)[ \t]+(\d+)[ \t]*([^\012]*)\012//) {
+ # HTTP/1.0 response or better
+ my($ver,$code,$msg) = ($1, $2, $3);
+ $msg =~ s/\015$//;
+ $response = HTTP::Response->new($code, $msg);
+ $response->protocol($ver);
+
+ # ensure that we have read all headers. The headers will be
+ # terminated by two blank lines
+ until ($buf =~ /^\015?\012/ || $buf =~ /\015?\012\015?\012/) {
+ # must read more if we can...
+ die "read timeout" if $timeout && !$sel->can_read($timeout);
+ my $old_len = length($buf);
+ $n = $socket->sysread($buf, $size, $old_len);
+ die $! unless defined($n);
+ die "unexpected EOF before all headers seen" unless $n;
+ }
+
+ # now we start parsing the headers. The strategy is to
+ # remove one line at a time from the beginning of the header
+ # buffer ($res).
+ my($key, $val);
+ while ($buf =~ s/([^\012]*)\012//) {
+ my $line = $1;
+
+ # if we need to restore as content when illegal headers
+ # are found.
+ my $save = "$line\012";
+
+ $line =~ s/\015$//;
+ last unless length $line;
+
+ if ($line =~ /^([a-zA-Z0-9_\-.]+)\s*:\s*(.*)/) {
+ $response->push_header($key, $val) if $key;
+ ($key, $val) = ($1, $2);
+ }
+ elsif ($line =~ /^\s+(.*)/ && $key) {
+ $val .= " $1";
+ }
+ else {
+ $response->push_header("Client-Bad-Header-Line" => $line);
+ }
+ }
+ $response->push_header($key, $val) if $key;
+ last;
+
+ }
+ elsif ((length($buf) >= 5 and $buf !~ /^HTTP\//) or
+ $buf =~ /\012/ ) {
+ # HTTP/0.9 or worse
+ $response = HTTP::Response->new(&HTTP::Status::RC_OK, "OK");
+ $response->protocol('HTTP/0.9');
+ last;
+
+ }
+ else {
+ # need more data
+ }
+ };
+ $response->request($request);
+ $self->_get_sock_info($response, $socket);
+
+ if ($method eq "CONNECT") {
+ $response->{client_socket} = $socket; # so it can be picked up
+ $response->content($buf); # in case we read more than the headers
+ return $response;
+ }
+
+ my $usebuf = length($buf) > 0;
+ $response = $self->collect($arg, $response, sub {
+ if ($usebuf) {
+ $usebuf = 0;
+ return \$buf;
+ }
+ die "read timeout" if $timeout && !$sel->can_read($timeout);
+ my $n = $socket->sysread($buf, $size);
+ die $! unless defined($n);
+ return \$buf;
+ } );
+
+ #$socket->close;
+
+ $response;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/https.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/https.pm
new file mode 100755
index 00000000000..367c8f793d8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/https.pm
@@ -0,0 +1,51 @@
+package LWP::Protocol::https;
+
+use strict;
+
+use vars qw(@ISA);
+require LWP::Protocol::http;
+@ISA = qw(LWP::Protocol::http);
+
+sub socket_type
+{
+ return "https";
+}
+
+sub _check_sock
+{
+ my($self, $req, $sock) = @_;
+ my $check = $req->header("If-SSL-Cert-Subject");
+ if (defined $check) {
+ my $cert = $sock->get_peer_certificate ||
+ die "Missing SSL certificate";
+ my $subject = $cert->subject_name;
+ die "Bad SSL certificate subject: '$subject' !~ /$check/"
+ unless $subject =~ /$check/;
+ $req->remove_header("If-SSL-Cert-Subject"); # don't pass it on
+ }
+}
+
+sub _get_sock_info
+{
+ my $self = shift;
+ $self->SUPER::_get_sock_info(@_);
+ my($res, $sock) = @_;
+ $res->header("Client-SSL-Cipher" => $sock->get_cipher);
+ my $cert = $sock->get_peer_certificate;
+ if ($cert) {
+ $res->header("Client-SSL-Cert-Subject" => $cert->subject_name);
+ $res->header("Client-SSL-Cert-Issuer" => $cert->issuer_name);
+ }
+ if(! eval { $sock->get_peer_verify }) {
+ $res->header("Client-SSL-Warning" => "Peer certificate not verified");
+ }
+}
+
+#-----------------------------------------------------------
+package LWP::Protocol::https::Socket;
+
+use vars qw(@ISA);
+require Net::HTTPS;
+@ISA = qw(Net::HTTPS LWP::Protocol::http::SocketMethods);
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/https10.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/https10.pm
new file mode 100755
index 00000000000..662ba76d284
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/https10.pm
@@ -0,0 +1,75 @@
+package LWP::Protocol::https10;
+
+use strict;
+
+# Figure out which SSL implementation to use
+use vars qw($SSL_CLASS);
+if ($Net::SSL::VERSION) {
+ $SSL_CLASS = "Net::SSL";
+}
+elsif ($IO::Socket::SSL::VERSION) {
+ $SSL_CLASS = "IO::Socket::SSL"; # it was already loaded
+}
+else {
+ eval { require Net::SSL; }; # from Crypt-SSLeay
+ if ($@) {
+ require IO::Socket::SSL;
+ $SSL_CLASS = "IO::Socket::SSL";
+ }
+ else {
+ $SSL_CLASS = "Net::SSL";
+ }
+}
+
+
+use vars qw(@ISA);
+
+require LWP::Protocol::http10;
+@ISA=qw(LWP::Protocol::http10);
+
+sub _new_socket
+{
+ my($self, $host, $port, $timeout) = @_;
+ local($^W) = 0; # IO::Socket::INET can be noisy
+ my $sock = $SSL_CLASS->new(PeerAddr => $host,
+ PeerPort => $port,
+ Proto => 'tcp',
+ Timeout => $timeout,
+ );
+ unless ($sock) {
+ # IO::Socket::INET leaves additional error messages in $@
+ $@ =~ s/^.*?: //;
+ die "Can't connect to $host:$port ($@)";
+ }
+ $sock;
+}
+
+sub _check_sock
+{
+ my($self, $req, $sock) = @_;
+ my $check = $req->header("If-SSL-Cert-Subject");
+ if (defined $check) {
+ my $cert = $sock->get_peer_certificate ||
+ die "Missing SSL certificate";
+ my $subject = $cert->subject_name;
+ die "Bad SSL certificate subject: '$subject' !~ /$check/"
+ unless $subject =~ /$check/;
+ $req->remove_header("If-SSL-Cert-Subject"); # don't pass it on
+ }
+}
+
+sub _get_sock_info
+{
+ my $self = shift;
+ $self->SUPER::_get_sock_info(@_);
+ my($res, $sock) = @_;
+ $res->header("Client-SSL-Cipher" => $sock->get_cipher);
+ my $cert = $sock->get_peer_certificate;
+ if ($cert) {
+ $res->header("Client-SSL-Cert-Subject" => $cert->subject_name);
+ $res->header("Client-SSL-Cert-Issuer" => $cert->issuer_name);
+ }
+ $res->header("Client-SSL-Warning" => "Peer certificate not verified");
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/loopback.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/loopback.pm
new file mode 100755
index 00000000000..2cd67ae3608
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/loopback.pm
@@ -0,0 +1,26 @@
+package LWP::Protocol::loopback;
+
+use strict;
+use vars qw(@ISA);
+require HTTP::Response;
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+sub request {
+ my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+
+ my $response = HTTP::Response->new(200, "OK");
+ $response->content_type("message/http; msgtype=request");
+
+ $response->header("Via", "loopback/1.0 $proxy")
+ if $proxy;
+
+ $response->header("X-Arg", $arg);
+ $response->header("X-Read-Size", $size);
+ $response->header("X-Timeout", $timeout);
+
+ return $self->collect_once($arg, $response, $request->as_string);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/mailto.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/mailto.pm
new file mode 100755
index 00000000000..700beb729d5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/mailto.pm
@@ -0,0 +1,183 @@
+package LWP::Protocol::mailto;
+
+# This module implements the mailto protocol. It is just a simple
+# frontend to the Unix sendmail program except on MacOS, where it uses
+# Mail::Internet.
+
+require LWP::Protocol;
+require HTTP::Request;
+require HTTP::Response;
+require HTTP::Status;
+
+use Carp;
+use strict;
+use vars qw(@ISA $SENDMAIL);
+
+@ISA = qw(LWP::Protocol);
+
+unless ($SENDMAIL = $ENV{SENDMAIL}) {
+ for my $sm (qw(/usr/sbin/sendmail
+ /usr/lib/sendmail
+ /usr/ucblib/sendmail
+ ))
+ {
+ if (-x $sm) {
+ $SENDMAIL = $sm;
+ last;
+ }
+ }
+ die "Can't find the 'sendmail' program" unless $SENDMAIL;
+}
+
+sub request
+{
+ my($self, $request, $proxy, $arg, $size) = @_;
+
+ my ($mail, $addr) if $^O eq "MacOS";
+ my @text = () if $^O eq "MacOS";
+
+ # check proxy
+ if (defined $proxy)
+ {
+ return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+ 'You can not proxy with mail';
+ }
+
+ # check method
+ my $method = $request->method;
+
+ if ($method ne 'POST') {
+ return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+ 'Library does not allow method ' .
+ "$method for 'mailto:' URLs";
+ }
+
+ # check url
+ my $url = $request->uri;
+
+ my $scheme = $url->scheme;
+ if ($scheme ne 'mailto') {
+ return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "LWP::Protocol::mailto::request called for '$scheme'";
+ }
+ if ($^O eq "MacOS") {
+ eval {
+ require Mail::Internet;
+ };
+ if($@) {
+ return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "You don't have MailTools installed";
+ }
+ unless ($ENV{SMTPHOSTS}) {
+ return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "You don't have SMTPHOSTS defined";
+ }
+ }
+ else {
+ unless (-x $SENDMAIL) {
+ return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "You don't have $SENDMAIL";
+ }
+ }
+ if ($^O eq "MacOS") {
+ $mail = Mail::Internet->new or
+ return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "Can't get a Mail::Internet object";
+ }
+ else {
+ open(SENDMAIL, "| $SENDMAIL -oi -t") or
+ return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "Can't run $SENDMAIL: $!";
+ }
+ if ($^O eq "MacOS") {
+ $addr = $url->encoded822addr;
+ }
+ else {
+ $request = $request->clone; # we modify a copy
+ my @h = $url->headers; # URL headers override those in the request
+ while (@h) {
+ my $k = shift @h;
+ my $v = shift @h;
+ next unless defined $v;
+ if (lc($k) eq "body") {
+ $request->content($v);
+ }
+ else {
+ $request->push_header($k => $v);
+ }
+ }
+ }
+ if ($^O eq "MacOS") {
+ $mail->add(To => $addr);
+ $mail->add(split(/[:\n]/,$request->headers_as_string));
+ }
+ else {
+ print SENDMAIL $request->headers_as_string;
+ print SENDMAIL "\n";
+ }
+ my $content = $request->content;
+ if (defined $content) {
+ my $contRef = ref($content) ? $content : \$content;
+ if (ref($contRef) eq 'SCALAR') {
+ if ($^O eq "MacOS") {
+ @text = split("\n",$$contRef);
+ foreach (@text) {
+ $_ .= "\n";
+ }
+ }
+ else {
+ print SENDMAIL $$contRef;
+ }
+
+ }
+ elsif (ref($contRef) eq 'CODE') {
+ # Callback provides data
+ my $d;
+ if ($^O eq "MacOS") {
+ my $stuff = "";
+ while (length($d = &$contRef)) {
+ $stuff .= $d;
+ }
+ @text = split("\n",$stuff);
+ foreach (@text) {
+ $_ .= "\n";
+ }
+ }
+ else {
+ print SENDMAIL $d;
+ }
+ }
+ }
+ if ($^O eq "MacOS") {
+ $mail->body(\@text);
+ unless ($mail->smtpsend) {
+ return HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "Mail::Internet->smtpsend unable to send message to <$addr>");
+ }
+ }
+ else {
+ unless (close(SENDMAIL)) {
+ my $err = $! ? "$!" : "Exit status $?";
+ return HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "$SENDMAIL: $err");
+ }
+ }
+
+
+ my $response = HTTP::Response->new(&HTTP::Status::RC_ACCEPTED,
+ "Mail accepted");
+ $response->header('Content-Type', 'text/plain');
+ if ($^O eq "MacOS") {
+ $response->header('Server' => "Mail::Internet $Mail::Internet::VERSION");
+ $response->content("Message sent to <$addr>\n");
+ }
+ else {
+ $response->header('Server' => $SENDMAIL);
+ my $to = $request->header("To");
+ $response->content("Message sent to <$to>\n");
+ }
+
+ return $response;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/nntp.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/nntp.pm
new file mode 100755
index 00000000000..788477d488a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/nntp.pm
@@ -0,0 +1,145 @@
+package LWP::Protocol::nntp;
+
+# Implementation of the Network News Transfer Protocol (RFC 977)
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+require HTTP::Response;
+require HTTP::Status;
+require Net::NNTP;
+
+use strict;
+
+
+sub request
+{
+ my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+
+ $size = 4096 unless $size;
+
+ # Check for proxy
+ if (defined $proxy) {
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ 'You can not proxy through NNTP');
+ }
+
+ # Check that the scheme is as expected
+ my $url = $request->uri;
+ my $scheme = $url->scheme;
+ unless ($scheme eq 'news' || $scheme eq 'nntp') {
+ return HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "LWP::Protocol::nntp::request called for '$scheme'");
+ }
+
+ # check for a valid method
+ my $method = $request->method;
+ unless ($method eq 'GET' || $method eq 'HEAD' || $method eq 'POST') {
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ 'Library does not allow method ' .
+ "$method for '$scheme:' URLs");
+ }
+
+ # extract the identifier and check against posting to an article
+ my $groupart = $url->_group;
+ my $is_art = $groupart =~ /@/;
+
+ if ($is_art && $method eq 'POST') {
+ return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+ "Can't post to an article <$groupart>");
+ }
+
+ my $nntp = Net::NNTP->new($url->host,
+ #Port => 18574,
+ Timeout => $timeout,
+ #Debug => 1,
+ );
+ die "Can't connect to nntp server" unless $nntp;
+
+ # Check the initial welcome message from the NNTP server
+ if ($nntp->status != 2) {
+ return HTTP::Response->new(&HTTP::Status::RC_SERVICE_UNAVAILABLE,
+ $nntp->message);
+ }
+ my $response = HTTP::Response->new(&HTTP::Status::RC_OK, "OK");
+
+ my $mess = $nntp->message;
+
+ # Try to extract server name from greeting message.
+ # Don't know if this works well for a large class of servers, but
+ # this works for our server.
+ $mess =~ s/\s+ready\b.*//;
+ $mess =~ s/^\S+\s+//;
+ $response->header(Server => $mess);
+
+ # First we handle posting of articles
+ if ($method eq 'POST') {
+ $nntp->quit; $nntp = undef;
+ $response->code(&HTTP::Status::RC_NOT_IMPLEMENTED);
+ $response->message("POST not implemented yet");
+ return $response;
+ }
+
+ # The method must be "GET" or "HEAD" by now
+ if (!$is_art) {
+ if (!$nntp->group($groupart)) {
+ $response->code(&HTTP::Status::RC_NOT_FOUND);
+ $response->message($nntp->message);
+ }
+ $nntp->quit; $nntp = undef;
+ # HEAD: just check if the group exists
+ if ($method eq 'GET' && $response->is_success) {
+ $response->code(&HTTP::Status::RC_NOT_IMPLEMENTED);
+ $response->message("GET newsgroup not implemented yet");
+ }
+ return $response;
+ }
+
+ # Send command to server to retrieve an article (or just the headers)
+ my $get = $method eq 'HEAD' ? "head" : "article";
+ my $art = $nntp->$get("<$groupart>");
+ unless ($art) {
+ $nntp->quit; $nntp = undef;
+ $response->code(&HTTP::Status::RC_NOT_FOUND);
+ $response->message($nntp->message);
+ return $response;
+ }
+
+ # Parse headers
+ my($key, $val);
+ local $_;
+ while ($_ = shift @$art) {
+ if (/^\s+$/) {
+ last; # end of headers
+ }
+ elsif (/^(\S+):\s*(.*)/) {
+ $response->push_header($key, $val) if $key;
+ ($key, $val) = ($1, $2);
+ }
+ elsif (/^\s+(.*)/) {
+ next unless $key;
+ $val .= $1;
+ }
+ else {
+ unshift(@$art, $_);
+ last;
+ }
+ }
+ $response->push_header($key, $val) if $key;
+
+ # Ensure that there is a Content-Type header
+ $response->header("Content-Type", "text/plain")
+ unless $response->header("Content-Type");
+
+ # Collect the body
+ $response = $self->collect_once($arg, $response, join("", @$art))
+ if @$art;
+
+ # Say goodbye to the server
+ $nntp->quit;
+ $nntp = undef;
+
+ $response;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/nogo.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/nogo.pm
new file mode 100755
index 00000000000..68150a722d5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Protocol/nogo.pm
@@ -0,0 +1,24 @@
+package LWP::Protocol::nogo;
+# If you want to disable access to a particular scheme, use this
+# class and then call
+# LWP::Protocol::implementor(that_scheme, 'LWP::Protocol::nogo');
+# For then on, attempts to access URLs with that scheme will generate
+# a 500 error.
+
+use strict;
+use vars qw(@ISA);
+require HTTP::Response;
+require HTTP::Status;
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+sub request {
+ my($self, $request) = @_;
+ my $scheme = $request->uri->scheme;
+
+ return HTTP::Response->new(
+ &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ "Access to \'$scheme\' URIs has been disabled"
+ );
+}
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/RobotUA.pm b/Master/tlpkg/tlperl.straw/lib/LWP/RobotUA.pm
new file mode 100755
index 00000000000..291c298e95f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/RobotUA.pm
@@ -0,0 +1,308 @@
+package LWP::RobotUA;
+
+require LWP::UserAgent;
+@ISA = qw(LWP::UserAgent);
+$VERSION = "5.827";
+
+require WWW::RobotRules;
+require HTTP::Request;
+require HTTP::Response;
+
+use Carp ();
+use HTTP::Status ();
+use HTTP::Date qw(time2str);
+use strict;
+
+
+#
+# Additional attributes in addition to those found in LWP::UserAgent:
+#
+# $self->{'delay'} Required delay between request to the same
+# server in minutes.
+#
+# $self->{'rules'} A WWW::RobotRules object
+#
+
+sub new
+{
+ my $class = shift;
+ my %cnf;
+ if (@_ < 4) {
+ # legacy args
+ @cnf{qw(agent from rules)} = @_;
+ }
+ else {
+ %cnf = @_;
+ }
+
+ Carp::croak('LWP::RobotUA agent required') unless $cnf{agent};
+ Carp::croak('LWP::RobotUA from address required')
+ unless $cnf{from} && $cnf{from} =~ m/\@/;
+
+ my $delay = delete $cnf{delay} || 1;
+ my $use_sleep = delete $cnf{use_sleep};
+ $use_sleep = 1 unless defined($use_sleep);
+ my $rules = delete $cnf{rules};
+
+ my $self = LWP::UserAgent->new(%cnf);
+ $self = bless $self, $class;
+
+ $self->{'delay'} = $delay; # minutes
+ $self->{'use_sleep'} = $use_sleep;
+
+ if ($rules) {
+ $rules->agent($cnf{agent});
+ $self->{'rules'} = $rules;
+ }
+ else {
+ $self->{'rules'} = WWW::RobotRules->new($cnf{agent});
+ }
+
+ $self;
+}
+
+
+sub delay { shift->_elem('delay', @_); }
+sub use_sleep { shift->_elem('use_sleep', @_); }
+
+
+sub agent
+{
+ my $self = shift;
+ my $old = $self->SUPER::agent(@_);
+ if (@_) {
+ # Changing our name means to start fresh
+ $self->{'rules'}->agent($self->{'agent'});
+ }
+ $old;
+}
+
+
+sub rules {
+ my $self = shift;
+ my $old = $self->_elem('rules', @_);
+ $self->{'rules'}->agent($self->{'agent'}) if @_;
+ $old;
+}
+
+
+sub no_visits
+{
+ my($self, $netloc) = @_;
+ $self->{'rules'}->no_visits($netloc) || 0;
+}
+
+*host_count = \&no_visits; # backwards compatibility with LWP-5.02
+
+
+sub host_wait
+{
+ my($self, $netloc) = @_;
+ return undef unless defined $netloc;
+ my $last = $self->{'rules'}->last_visit($netloc);
+ if ($last) {
+ my $wait = int($self->{'delay'} * 60 - (time - $last));
+ $wait = 0 if $wait < 0;
+ return $wait;
+ }
+ return 0;
+}
+
+
+sub simple_request
+{
+ my($self, $request, $arg, $size) = @_;
+
+ # Do we try to access a new server?
+ my $allowed = $self->{'rules'}->allowed($request->uri);
+
+ if ($allowed < 0) {
+ # Host is not visited before, or robots.txt expired; fetch "robots.txt"
+ my $robot_url = $request->uri->clone;
+ $robot_url->path("robots.txt");
+ $robot_url->query(undef);
+
+ # make access to robot.txt legal since this will be a recursive call
+ $self->{'rules'}->parse($robot_url, "");
+
+ my $robot_req = new HTTP::Request 'GET', $robot_url;
+ my $robot_res = $self->request($robot_req);
+ my $fresh_until = $robot_res->fresh_until;
+ if ($robot_res->is_success) {
+ my $c = $robot_res->content;
+ if ($robot_res->content_type =~ m,^text/, && $c =~ /^\s*Disallow\s*:/mi) {
+ $self->{'rules'}->parse($robot_url, $c, $fresh_until);
+ }
+ else {
+ $self->{'rules'}->parse($robot_url, "", $fresh_until);
+ }
+
+ }
+ else {
+ $self->{'rules'}->parse($robot_url, "", $fresh_until);
+ }
+
+ # recalculate allowed...
+ $allowed = $self->{'rules'}->allowed($request->uri);
+ }
+
+ # Check rules
+ unless ($allowed) {
+ my $res = new HTTP::Response
+ &HTTP::Status::RC_FORBIDDEN, 'Forbidden by robots.txt';
+ $res->request( $request ); # bind it to that request
+ return $res;
+ }
+
+ my $netloc = eval { local $SIG{__DIE__}; $request->uri->host_port; };
+ my $wait = $self->host_wait($netloc);
+
+ if ($wait) {
+ if ($self->{'use_sleep'}) {
+ sleep($wait)
+ }
+ else {
+ my $res = new HTTP::Response
+ &HTTP::Status::RC_SERVICE_UNAVAILABLE, 'Please, slow down';
+ $res->header('Retry-After', time2str(time + $wait));
+ $res->request( $request ); # bind it to that request
+ return $res;
+ }
+ }
+
+ # Perform the request
+ my $res = $self->SUPER::simple_request($request, $arg, $size);
+
+ $self->{'rules'}->visit($netloc);
+
+ $res;
+}
+
+
+sub as_string
+{
+ my $self = shift;
+ my @s;
+ push(@s, "Robot: $self->{'agent'} operated by $self->{'from'} [$self]");
+ push(@s, " Minimum delay: " . int($self->{'delay'}*60) . "s");
+ push(@s, " Will sleep if too early") if $self->{'use_sleep'};
+ push(@s, " Rules = $self->{'rules'}");
+ join("\n", @s, '');
+}
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+LWP::RobotUA - a class for well-behaved Web robots
+
+=head1 SYNOPSIS
+
+ use LWP::RobotUA;
+ my $ua = LWP::RobotUA->new('my-robot/0.1', 'me@foo.com');
+ $ua->delay(10); # be very nice -- max one hit every ten minutes!
+ ...
+
+ # Then just use it just like a normal LWP::UserAgent:
+ my $response = $ua->get('http://whatever.int/...');
+ ...
+
+=head1 DESCRIPTION
+
+This class implements a user agent that is suitable for robot
+applications. Robots should be nice to the servers they visit. They
+should consult the F</robots.txt> file to ensure that they are welcomed
+and they should not make requests too frequently.
+
+But before you consider writing a robot, take a look at
+<URL:http://www.robotstxt.org/>.
+
+When you use a I<LWP::RobotUA> object as your user agent, then you do not
+really have to think about these things yourself; C<robots.txt> files
+are automatically consulted and obeyed, the server isn't queried
+too rapidly, and so on. Just send requests
+as you do when you are using a normal I<LWP::UserAgent>
+object (using C<< $ua->get(...) >>, C<< $ua->head(...) >>,
+C<< $ua->request(...) >>, etc.), and this
+special agent will make sure you are nice.
+
+=head1 METHODS
+
+The LWP::RobotUA is a sub-class of LWP::UserAgent and implements the
+same methods. In addition the following methods are provided:
+
+=over 4
+
+=item $ua = LWP::RobotUA->new( %options )
+
+=item $ua = LWP::RobotUA->new( $agent, $from )
+
+=item $ua = LWP::RobotUA->new( $agent, $from, $rules )
+
+The LWP::UserAgent options C<agent> and C<from> are mandatory. The
+options C<delay>, C<use_sleep> and C<rules> initialize attributes
+private to the RobotUA. If C<rules> are not provided, then
+C<WWW::RobotRules> is instantiated providing an internal database of
+F<robots.txt>.
+
+It is also possible to just pass the value of C<agent>, C<from> and
+optionally C<rules> as plain positional arguments.
+
+=item $ua->delay
+
+=item $ua->delay( $minutes )
+
+Get/set the minimum delay between requests to the same server, in
+I<minutes>. The default is 1 minute. Note that this number doesn't
+have to be an integer; for example, this sets the delay to 10 seconds:
+
+ $ua->delay(10/60);
+
+=item $ua->use_sleep
+
+=item $ua->use_sleep( $boolean )
+
+Get/set a value indicating whether the UA should sleep() if requests
+arrive too fast, defined as $ua->delay minutes not passed since
+last request to the given server. The default is TRUE. If this value is
+FALSE then an internal SERVICE_UNAVAILABLE response will be generated.
+It will have an Retry-After header that indicates when it is OK to
+send another request to this server.
+
+=item $ua->rules
+
+=item $ua->rules( $rules )
+
+Set/get which I<WWW::RobotRules> object to use.
+
+=item $ua->no_visits( $netloc )
+
+Returns the number of documents fetched from this server host. Yeah I
+know, this method should probably have been named num_visits() or
+something like that. :-(
+
+=item $ua->host_wait( $netloc )
+
+Returns the number of I<seconds> (from now) you must wait before you can
+make a new request to this host.
+
+=item $ua->as_string
+
+Returns a string that describes the state of the UA.
+Mainly useful for debugging.
+
+=back
+
+=head1 SEE ALSO
+
+L<LWP::UserAgent>, L<WWW::RobotRules>
+
+=head1 COPYRIGHT
+
+Copyright 1996-2004 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/Simple.pm b/Master/tlpkg/tlperl.straw/lib/LWP/Simple.pm
new file mode 100755
index 00000000000..8a68ea847f8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/Simple.pm
@@ -0,0 +1,253 @@
+package LWP::Simple;
+
+use strict;
+use vars qw($ua %loop_check $FULL_LWP @EXPORT @EXPORT_OK $VERSION);
+
+require Exporter;
+
+@EXPORT = qw(get head getprint getstore mirror);
+@EXPORT_OK = qw($ua);
+
+# I really hate this. I was a bad idea to do it in the first place.
+# Wonder how to get rid of it??? (It even makes LWP::Simple 7% slower
+# for trivial tests)
+use HTTP::Status;
+push(@EXPORT, @HTTP::Status::EXPORT);
+
+$VERSION = "5.827";
+
+sub import
+{
+ my $pkg = shift;
+ my $callpkg = caller;
+ Exporter::export($pkg, $callpkg, @_);
+}
+
+use LWP::UserAgent ();
+use HTTP::Status ();
+use HTTP::Date ();
+$ua = new LWP::UserAgent; # we create a global UserAgent object
+$ua->agent("LWP::Simple/$VERSION ");
+$ua->env_proxy;
+
+
+sub get ($)
+{
+ my $response = $ua->get(shift);
+ return $response->decoded_content if $response->is_success;
+ return undef;
+}
+
+
+sub head ($)
+{
+ my($url) = @_;
+ my $request = HTTP::Request->new(HEAD => $url);
+ my $response = $ua->request($request);
+
+ if ($response->is_success) {
+ return $response unless wantarray;
+ return (scalar $response->header('Content-Type'),
+ scalar $response->header('Content-Length'),
+ HTTP::Date::str2time($response->header('Last-Modified')),
+ HTTP::Date::str2time($response->header('Expires')),
+ scalar $response->header('Server'),
+ );
+ }
+ return;
+}
+
+
+sub getprint ($)
+{
+ my($url) = @_;
+ my $request = HTTP::Request->new(GET => $url);
+ local($\) = ""; # ensure standard $OUTPUT_RECORD_SEPARATOR
+ my $callback = sub { print $_[0] };
+ if ($^O eq "MacOS") {
+ $callback = sub { $_[0] =~ s/\015?\012/\n/g; print $_[0] }
+ }
+ my $response = $ua->request($request, $callback);
+ unless ($response->is_success) {
+ print STDERR $response->status_line, " <URL:$url>\n";
+ }
+ $response->code;
+}
+
+
+sub getstore ($$)
+{
+ my($url, $file) = @_;
+ my $request = HTTP::Request->new(GET => $url);
+ my $response = $ua->request($request, $file);
+
+ $response->code;
+}
+
+
+sub mirror ($$)
+{
+ my($url, $file) = @_;
+ my $response = $ua->mirror($url, $file);
+ $response->code;
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+LWP::Simple - simple procedural interface to LWP
+
+=head1 SYNOPSIS
+
+ perl -MLWP::Simple -e 'getprint "http://www.sn.no"'
+
+ use LWP::Simple;
+ $content = get("http://www.sn.no/");
+ die "Couldn't get it!" unless defined $content;
+
+ if (mirror("http://www.sn.no/", "foo") == RC_NOT_MODIFIED) {
+ ...
+ }
+
+ if (is_success(getprint("http://www.sn.no/"))) {
+ ...
+ }
+
+=head1 DESCRIPTION
+
+This module is meant for people who want a simplified view of the
+libwww-perl library. It should also be suitable for one-liners. If
+you need more control or access to the header fields in the requests
+sent and responses received, then you should use the full object-oriented
+interface provided by the C<LWP::UserAgent> module.
+
+The following functions are provided (and exported) by this module:
+
+=over 3
+
+=item get($url)
+
+The get() function will fetch the document identified by the given URL
+and return it. It returns C<undef> if it fails. The $url argument can
+be either a simple string or a reference to a URI object.
+
+You will not be able to examine the response code or response headers
+(like 'Content-Type') when you are accessing the web using this
+function. If you need that information you should use the full OO
+interface (see L<LWP::UserAgent>).
+
+=item head($url)
+
+Get document headers. Returns the following 5 values if successful:
+($content_type, $document_length, $modified_time, $expires, $server)
+
+Returns an empty list if it fails. In scalar context returns TRUE if
+successful.
+
+=item getprint($url)
+
+Get and print a document identified by a URL. The document is printed
+to the selected default filehandle for output (normally STDOUT) as
+data is received from the network. If the request fails, then the
+status code and message are printed on STDERR. The return value is
+the HTTP response code.
+
+=item getstore($url, $file)
+
+Gets a document identified by a URL and stores it in the file. The
+return value is the HTTP response code.
+
+=item mirror($url, $file)
+
+Get and store a document identified by a URL, using
+I<If-modified-since>, and checking the I<Content-Length>. Returns
+the HTTP response code.
+
+=back
+
+This module also exports the HTTP::Status constants and procedures.
+You can use them when you check the response code from getprint(),
+getstore() or mirror(). The constants are:
+
+ RC_CONTINUE
+ RC_SWITCHING_PROTOCOLS
+ RC_OK
+ RC_CREATED
+ RC_ACCEPTED
+ RC_NON_AUTHORITATIVE_INFORMATION
+ RC_NO_CONTENT
+ RC_RESET_CONTENT
+ RC_PARTIAL_CONTENT
+ RC_MULTIPLE_CHOICES
+ RC_MOVED_PERMANENTLY
+ RC_MOVED_TEMPORARILY
+ RC_SEE_OTHER
+ RC_NOT_MODIFIED
+ RC_USE_PROXY
+ RC_BAD_REQUEST
+ RC_UNAUTHORIZED
+ RC_PAYMENT_REQUIRED
+ RC_FORBIDDEN
+ RC_NOT_FOUND
+ RC_METHOD_NOT_ALLOWED
+ RC_NOT_ACCEPTABLE
+ RC_PROXY_AUTHENTICATION_REQUIRED
+ RC_REQUEST_TIMEOUT
+ RC_CONFLICT
+ RC_GONE
+ RC_LENGTH_REQUIRED
+ RC_PRECONDITION_FAILED
+ RC_REQUEST_ENTITY_TOO_LARGE
+ RC_REQUEST_URI_TOO_LARGE
+ RC_UNSUPPORTED_MEDIA_TYPE
+ RC_INTERNAL_SERVER_ERROR
+ RC_NOT_IMPLEMENTED
+ RC_BAD_GATEWAY
+ RC_SERVICE_UNAVAILABLE
+ RC_GATEWAY_TIMEOUT
+ RC_HTTP_VERSION_NOT_SUPPORTED
+
+The HTTP::Status classification functions are:
+
+=over 3
+
+=item is_success($rc)
+
+True if response code indicated a successful request.
+
+=item is_error($rc)
+
+True if response code indicated that an error occurred.
+
+=back
+
+The module will also export the LWP::UserAgent object as C<$ua> if you
+ask for it explicitly.
+
+The user agent created by this module will identify itself as
+"LWP::Simple/#.##"
+and will initialize its proxy defaults from the environment (by
+calling $ua->env_proxy).
+
+=head1 CAVEAT
+
+Note that if you are using both LWP::Simple and the very popular CGI.pm
+module, you may be importing a C<head> function from each module,
+producing a warning like "Prototype mismatch: sub main::head ($) vs
+none". Get around this problem by just not importing LWP::Simple's
+C<head> function, like so:
+
+ use LWP::Simple qw(!head);
+ use CGI qw(:standard); # then only CGI.pm defines a head()
+
+Then if you do need LWP::Simple's C<head> function, you can just call
+it as C<LWP::Simple::head($url)>.
+
+=head1 SEE ALSO
+
+L<LWP>, L<lwpcook>, L<LWP::UserAgent>, L<HTTP::Status>, L<lwp-request>,
+L<lwp-mirror>
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/UserAgent.pm b/Master/tlpkg/tlperl.straw/lib/LWP/UserAgent.pm
new file mode 100755
index 00000000000..abec3f68762
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/UserAgent.pm
@@ -0,0 +1,1700 @@
+package LWP::UserAgent;
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+require LWP::MemberMixin;
+@ISA = qw(LWP::MemberMixin);
+$VERSION = "5.834";
+
+use HTTP::Request ();
+use HTTP::Response ();
+use HTTP::Date ();
+
+use LWP ();
+use LWP::Protocol ();
+
+use Carp ();
+
+if ($ENV{PERL_LWP_USE_HTTP_10}) {
+ require LWP::Protocol::http10;
+ LWP::Protocol::implementor('http', 'LWP::Protocol::http10');
+ eval {
+ require LWP::Protocol::https10;
+ LWP::Protocol::implementor('https', 'LWP::Protocol::https10');
+ };
+}
+
+
+
+sub new
+{
+ # Check for common user mistake
+ Carp::croak("Options to LWP::UserAgent should be key/value pairs, not hash reference")
+ if ref($_[1]) eq 'HASH';
+
+ my($class, %cnf) = @_;
+
+ my $agent = delete $cnf{agent};
+ my $from = delete $cnf{from};
+ my $def_headers = delete $cnf{default_headers};
+ my $timeout = delete $cnf{timeout};
+ $timeout = 3*60 unless defined $timeout;
+ my $local_address = delete $cnf{local_address};
+ my $use_eval = delete $cnf{use_eval};
+ $use_eval = 1 unless defined $use_eval;
+ my $parse_head = delete $cnf{parse_head};
+ $parse_head = 1 unless defined $parse_head;
+ my $show_progress = delete $cnf{show_progress};
+ my $max_size = delete $cnf{max_size};
+ my $max_redirect = delete $cnf{max_redirect};
+ $max_redirect = 7 unless defined $max_redirect;
+ my $env_proxy = delete $cnf{env_proxy};
+
+ my $cookie_jar = delete $cnf{cookie_jar};
+ my $conn_cache = delete $cnf{conn_cache};
+ my $keep_alive = delete $cnf{keep_alive};
+
+ Carp::croak("Can't mix conn_cache and keep_alive")
+ if $conn_cache && $keep_alive;
+
+
+ my $protocols_allowed = delete $cnf{protocols_allowed};
+ my $protocols_forbidden = delete $cnf{protocols_forbidden};
+
+ my $requests_redirectable = delete $cnf{requests_redirectable};
+ $requests_redirectable = ['GET', 'HEAD']
+ unless defined $requests_redirectable;
+
+ # Actually ""s are just as good as 0's, but for concision we'll just say:
+ Carp::croak("protocols_allowed has to be an arrayref or 0, not \"$protocols_allowed\"!")
+ if $protocols_allowed and ref($protocols_allowed) ne 'ARRAY';
+ Carp::croak("protocols_forbidden has to be an arrayref or 0, not \"$protocols_forbidden\"!")
+ if $protocols_forbidden and ref($protocols_forbidden) ne 'ARRAY';
+ Carp::croak("requests_redirectable has to be an arrayref or 0, not \"$requests_redirectable\"!")
+ if $requests_redirectable and ref($requests_redirectable) ne 'ARRAY';
+
+
+ if (%cnf && $^W) {
+ Carp::carp("Unrecognized LWP::UserAgent options: @{[sort keys %cnf]}");
+ }
+
+ my $self = bless {
+ def_headers => $def_headers,
+ timeout => $timeout,
+ local_address => $local_address,
+ use_eval => $use_eval,
+ show_progress=> $show_progress,
+ max_size => $max_size,
+ max_redirect => $max_redirect,
+ proxy => {},
+ no_proxy => [],
+ protocols_allowed => $protocols_allowed,
+ protocols_forbidden => $protocols_forbidden,
+ requests_redirectable => $requests_redirectable,
+ }, $class;
+
+ $self->agent(defined($agent) ? $agent : $class->_agent)
+ if defined($agent) || !$def_headers || !$def_headers->header("User-Agent");
+ $self->from($from) if $from;
+ $self->cookie_jar($cookie_jar) if $cookie_jar;
+ $self->parse_head($parse_head);
+ $self->env_proxy if $env_proxy;
+
+ $self->protocols_allowed( $protocols_allowed ) if $protocols_allowed;
+ $self->protocols_forbidden($protocols_forbidden) if $protocols_forbidden;
+
+ if ($keep_alive) {
+ $conn_cache ||= { total_capacity => $keep_alive };
+ }
+ $self->conn_cache($conn_cache) if $conn_cache;
+
+ return $self;
+}
+
+
+sub send_request
+{
+ my($self, $request, $arg, $size) = @_;
+ my($method, $url) = ($request->method, $request->uri);
+ my $scheme = $url->scheme;
+
+ local($SIG{__DIE__}); # protect against user defined die handlers
+
+ $self->progress("begin", $request);
+
+ my $response = $self->run_handlers("request_send", $request);
+
+ unless ($response) {
+ my $protocol;
+
+ {
+ # Honor object-specific restrictions by forcing protocol objects
+ # into class LWP::Protocol::nogo.
+ my $x;
+ if($x = $self->protocols_allowed) {
+ if (grep lc($_) eq $scheme, @$x) {
+ }
+ else {
+ require LWP::Protocol::nogo;
+ $protocol = LWP::Protocol::nogo->new;
+ }
+ }
+ elsif ($x = $self->protocols_forbidden) {
+ if(grep lc($_) eq $scheme, @$x) {
+ require LWP::Protocol::nogo;
+ $protocol = LWP::Protocol::nogo->new;
+ }
+ }
+ # else fall thru and create the protocol object normally
+ }
+
+ # Locate protocol to use
+ my $proxy = $request->{proxy};
+ if ($proxy) {
+ $scheme = $proxy->scheme;
+ }
+
+ unless ($protocol) {
+ $protocol = eval { LWP::Protocol::create($scheme, $self) };
+ if ($@) {
+ $@ =~ s/ at .* line \d+.*//s; # remove file/line number
+ $response = _new_response($request, &HTTP::Status::RC_NOT_IMPLEMENTED, $@);
+ if ($scheme eq "https") {
+ $response->message($response->message . " (Crypt::SSLeay or IO::Socket::SSL not installed)");
+ $response->content_type("text/plain");
+ $response->content(<<EOT);
+LWP will support https URLs if either Crypt::SSLeay or IO::Socket::SSL
+is installed. More information at
+<http://search.cpan.org/dist/libwww-perl/README.SSL>.
+EOT
+ }
+ }
+ }
+
+ if (!$response && $self->{use_eval}) {
+ # we eval, and turn dies into responses below
+ eval {
+ $response = $protocol->request($request, $proxy,
+ $arg, $size, $self->{timeout});
+ };
+ if ($@) {
+ $@ =~ s/ at .* line \d+.*//s; # remove file/line number
+ $response = _new_response($request,
+ &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+ $@);
+ }
+ }
+ elsif (!$response) {
+ $response = $protocol->request($request, $proxy,
+ $arg, $size, $self->{timeout});
+ # XXX: Should we die unless $response->is_success ???
+ }
+ }
+
+ $response->request($request); # record request for reference
+ $response->header("Client-Date" => HTTP::Date::time2str(time));
+
+ $self->run_handlers("response_done", $response);
+
+ $self->progress("end", $response);
+ return $response;
+}
+
+
+sub prepare_request
+{
+ my($self, $request) = @_;
+ die "Method missing" unless $request->method;
+ my $url = $request->uri;
+ die "URL missing" unless $url;
+ die "URL must be absolute" unless $url->scheme;
+
+ $self->run_handlers("request_preprepare", $request);
+
+ if (my $def_headers = $self->{def_headers}) {
+ for my $h ($def_headers->header_field_names) {
+ $request->init_header($h => [$def_headers->header($h)]);
+ }
+ }
+
+ $self->run_handlers("request_prepare", $request);
+
+ return $request;
+}
+
+
+sub simple_request
+{
+ my($self, $request, $arg, $size) = @_;
+
+ # sanity check the request passed in
+ if (defined $request) {
+ if (ref $request) {
+ Carp::croak("You need a request object, not a " . ref($request) . " object")
+ if ref($request) eq 'ARRAY' or ref($request) eq 'HASH' or
+ !$request->can('method') or !$request->can('uri');
+ }
+ else {
+ Carp::croak("You need a request object, not '$request'");
+ }
+ }
+ else {
+ Carp::croak("No request object passed in");
+ }
+
+ eval {
+ $request = $self->prepare_request($request);
+ };
+ if ($@) {
+ $@ =~ s/ at .* line \d+.*//s; # remove file/line number
+ return _new_response($request, &HTTP::Status::RC_BAD_REQUEST, $@);
+ }
+ return $self->send_request($request, $arg, $size);
+}
+
+
+sub request
+{
+ my($self, $request, $arg, $size, $previous) = @_;
+
+ my $response = $self->simple_request($request, $arg, $size);
+ $response->previous($previous) if $previous;
+
+ if ($response->redirects >= $self->{max_redirect}) {
+ $response->header("Client-Warning" =>
+ "Redirect loop detected (max_redirect = $self->{max_redirect})");
+ return $response;
+ }
+
+ if (my $req = $self->run_handlers("response_redirect", $response)) {
+ return $self->request($req, $arg, $size, $response);
+ }
+
+ my $code = $response->code;
+
+ if ($code == &HTTP::Status::RC_MOVED_PERMANENTLY or
+ $code == &HTTP::Status::RC_FOUND or
+ $code == &HTTP::Status::RC_SEE_OTHER or
+ $code == &HTTP::Status::RC_TEMPORARY_REDIRECT)
+ {
+ my $referral = $request->clone;
+
+ # These headers should never be forwarded
+ $referral->remove_header('Host', 'Cookie');
+
+ if ($referral->header('Referer') &&
+ $request->uri->scheme eq 'https' &&
+ $referral->uri->scheme eq 'http')
+ {
+ # RFC 2616, section 15.1.3.
+ # https -> http redirect, suppressing Referer
+ $referral->remove_header('Referer');
+ }
+
+ if ($code == &HTTP::Status::RC_SEE_OTHER ||
+ $code == &HTTP::Status::RC_FOUND)
+ {
+ my $method = uc($referral->method);
+ unless ($method eq "GET" || $method eq "HEAD") {
+ $referral->method("GET");
+ $referral->content("");
+ $referral->remove_content_headers;
+ }
+ }
+
+ # And then we update the URL based on the Location:-header.
+ my $referral_uri = $response->header('Location');
+ {
+ # Some servers erroneously return a relative URL for redirects,
+ # so make it absolute if it not already is.
+ local $URI::ABS_ALLOW_RELATIVE_SCHEME = 1;
+ my $base = $response->base;
+ $referral_uri = "" unless defined $referral_uri;
+ $referral_uri = $HTTP::URI_CLASS->new($referral_uri, $base)
+ ->abs($base);
+ }
+ $referral->uri($referral_uri);
+
+ return $response unless $self->redirect_ok($referral, $response);
+ return $self->request($referral, $arg, $size, $response);
+
+ }
+ elsif ($code == &HTTP::Status::RC_UNAUTHORIZED ||
+ $code == &HTTP::Status::RC_PROXY_AUTHENTICATION_REQUIRED
+ )
+ {
+ my $proxy = ($code == &HTTP::Status::RC_PROXY_AUTHENTICATION_REQUIRED);
+ my $ch_header = $proxy ? "Proxy-Authenticate" : "WWW-Authenticate";
+ my @challenge = $response->header($ch_header);
+ unless (@challenge) {
+ $response->header("Client-Warning" =>
+ "Missing Authenticate header");
+ return $response;
+ }
+
+ require HTTP::Headers::Util;
+ CHALLENGE: for my $challenge (@challenge) {
+ $challenge =~ tr/,/;/; # "," is used to separate auth-params!!
+ ($challenge) = HTTP::Headers::Util::split_header_words($challenge);
+ my $scheme = shift(@$challenge);
+ shift(@$challenge); # no value
+ $challenge = { @$challenge }; # make rest into a hash
+
+ unless ($scheme =~ /^([a-z]+(?:-[a-z]+)*)$/) {
+ $response->header("Client-Warning" =>
+ "Bad authentication scheme '$scheme'");
+ return $response;
+ }
+ $scheme = $1; # untainted now
+ my $class = "LWP::Authen::\u$scheme";
+ $class =~ s/-/_/g;
+
+ no strict 'refs';
+ unless (%{"$class\::"}) {
+ # try to load it
+ eval "require $class";
+ if ($@) {
+ if ($@ =~ /^Can\'t locate/) {
+ $response->header("Client-Warning" =>
+ "Unsupported authentication scheme '$scheme'");
+ }
+ else {
+ $response->header("Client-Warning" => $@);
+ }
+ next CHALLENGE;
+ }
+ }
+ unless ($class->can("authenticate")) {
+ $response->header("Client-Warning" =>
+ "Unsupported authentication scheme '$scheme'");
+ next CHALLENGE;
+ }
+ return $class->authenticate($self, $proxy, $challenge, $response,
+ $request, $arg, $size);
+ }
+ return $response;
+ }
+ return $response;
+}
+
+
+#
+# Now the shortcuts...
+#
+sub get {
+ require HTTP::Request::Common;
+ my($self, @parameters) = @_;
+ my @suff = $self->_process_colonic_headers(\@parameters,1);
+ return $self->request( HTTP::Request::Common::GET( @parameters ), @suff );
+}
+
+
+sub post {
+ require HTTP::Request::Common;
+ my($self, @parameters) = @_;
+ my @suff = $self->_process_colonic_headers(\@parameters, (ref($parameters[1]) ? 2 : 1));
+ return $self->request( HTTP::Request::Common::POST( @parameters ), @suff );
+}
+
+
+sub head {
+ require HTTP::Request::Common;
+ my($self, @parameters) = @_;
+ my @suff = $self->_process_colonic_headers(\@parameters,1);
+ return $self->request( HTTP::Request::Common::HEAD( @parameters ), @suff );
+}
+
+
+sub _process_colonic_headers {
+ # Process :content_cb / :content_file / :read_size_hint headers.
+ my($self, $args, $start_index) = @_;
+
+ my($arg, $size);
+ for(my $i = $start_index; $i < @$args; $i += 2) {
+ next unless defined $args->[$i];
+
+ #printf "Considering %s => %s\n", $args->[$i], $args->[$i + 1];
+
+ if($args->[$i] eq ':content_cb') {
+ # Some sanity-checking...
+ $arg = $args->[$i + 1];
+ Carp::croak("A :content_cb value can't be undef") unless defined $arg;
+ Carp::croak("A :content_cb value must be a coderef")
+ unless ref $arg and UNIVERSAL::isa($arg, 'CODE');
+
+ }
+ elsif ($args->[$i] eq ':content_file') {
+ $arg = $args->[$i + 1];
+
+ # Some sanity-checking...
+ Carp::croak("A :content_file value can't be undef")
+ unless defined $arg;
+ Carp::croak("A :content_file value can't be a reference")
+ if ref $arg;
+ Carp::croak("A :content_file value can't be \"\"")
+ unless length $arg;
+
+ }
+ elsif ($args->[$i] eq ':read_size_hint') {
+ $size = $args->[$i + 1];
+ # Bother checking it?
+
+ }
+ else {
+ next;
+ }
+ splice @$args, $i, 2;
+ $i -= 2;
+ }
+
+ # And return a suitable suffix-list for request(REQ,...)
+
+ return unless defined $arg;
+ return $arg, $size if defined $size;
+ return $arg;
+}
+
+my @ANI = qw(- \ | /);
+
+sub progress {
+ my($self, $status, $m) = @_;
+ return unless $self->{show_progress};
+
+ local($,, $\);
+ if ($status eq "begin") {
+ print STDERR "** ", $m->method, " ", $m->uri, " ==> ";
+ $self->{progress_start} = time;
+ $self->{progress_lastp} = "";
+ $self->{progress_ani} = 0;
+ }
+ elsif ($status eq "end") {
+ delete $self->{progress_lastp};
+ delete $self->{progress_ani};
+ print STDERR $m->status_line;
+ my $t = time - delete $self->{progress_start};
+ print STDERR " (${t}s)" if $t;
+ print STDERR "\n";
+ }
+ elsif ($status eq "tick") {
+ print STDERR "$ANI[$self->{progress_ani}++]\b";
+ $self->{progress_ani} %= @ANI;
+ }
+ else {
+ my $p = sprintf "%3.0f%%", $status * 100;
+ return if $p eq $self->{progress_lastp};
+ print STDERR "$p\b\b\b\b";
+ $self->{progress_lastp} = $p;
+ }
+ STDERR->flush;
+}
+
+
+#
+# This whole allow/forbid thing is based on man 1 at's way of doing things.
+#
+sub is_protocol_supported
+{
+ my($self, $scheme) = @_;
+ if (ref $scheme) {
+ # assume we got a reference to an URI object
+ $scheme = $scheme->scheme;
+ }
+ else {
+ Carp::croak("Illegal scheme '$scheme' passed to is_protocol_supported")
+ if $scheme =~ /\W/;
+ $scheme = lc $scheme;
+ }
+
+ my $x;
+ if(ref($self) and $x = $self->protocols_allowed) {
+ return 0 unless grep lc($_) eq $scheme, @$x;
+ }
+ elsif (ref($self) and $x = $self->protocols_forbidden) {
+ return 0 if grep lc($_) eq $scheme, @$x;
+ }
+
+ local($SIG{__DIE__}); # protect against user defined die handlers
+ $x = LWP::Protocol::implementor($scheme);
+ return 1 if $x and $x ne 'LWP::Protocol::nogo';
+ return 0;
+}
+
+
+sub protocols_allowed { shift->_elem('protocols_allowed' , @_) }
+sub protocols_forbidden { shift->_elem('protocols_forbidden' , @_) }
+sub requests_redirectable { shift->_elem('requests_redirectable', @_) }
+
+
+sub redirect_ok
+{
+ # RFC 2616, section 10.3.2 and 10.3.3 say:
+ # If the 30[12] status code is received in response to a request other
+ # than GET or HEAD, the user agent MUST NOT automatically redirect the
+ # request unless it can be confirmed by the user, since this might
+ # change the conditions under which the request was issued.
+
+ # Note that this routine used to be just:
+ # return 0 if $_[1]->method eq "POST"; return 1;
+
+ my($self, $new_request, $response) = @_;
+ my $method = $response->request->method;
+ return 0 unless grep $_ eq $method,
+ @{ $self->requests_redirectable || [] };
+
+ if ($new_request->uri->scheme eq 'file') {
+ $response->header("Client-Warning" =>
+ "Can't redirect to a file:// URL!");
+ return 0;
+ }
+
+ # Otherwise it's apparently okay...
+ return 1;
+}
+
+
+sub credentials
+{
+ my $self = shift;
+ my $netloc = lc(shift);
+ my $realm = shift || "";
+ my $old = $self->{basic_authentication}{$netloc}{$realm};
+ if (@_) {
+ $self->{basic_authentication}{$netloc}{$realm} = [@_];
+ }
+ return unless $old;
+ return @$old if wantarray;
+ return join(":", @$old);
+}
+
+
+sub get_basic_credentials
+{
+ my($self, $realm, $uri, $proxy) = @_;
+ return if $proxy;
+ return $self->credentials($uri->host_port, $realm);
+}
+
+
+sub timeout { shift->_elem('timeout', @_); }
+sub local_address{ shift->_elem('local_address',@_); }
+sub max_size { shift->_elem('max_size', @_); }
+sub max_redirect { shift->_elem('max_redirect', @_); }
+sub show_progress{ shift->_elem('show_progress', @_); }
+
+sub parse_head {
+ my $self = shift;
+ if (@_) {
+ my $flag = shift;
+ my $parser;
+ my $old = $self->set_my_handler("response_header", $flag ? sub {
+ my($response, $ua) = @_;
+ require HTML::HeadParser;
+ $parser = HTML::HeadParser->new;
+ $parser->xml_mode(1) if $response->content_is_xhtml;
+ $parser->utf8_mode(1) if $] >= 5.008 && $HTML::Parser::VERSION >= 3.40;
+
+ push(@{$response->{handlers}{response_data}}, {
+ callback => sub {
+ return unless $parser;
+ unless ($parser->parse($_[3])) {
+ my $h = $parser->header;
+ my $r = $_[0];
+ for my $f ($h->header_field_names) {
+ $r->init_header($f, [$h->header($f)]);
+ }
+ undef($parser);
+ }
+ },
+ });
+
+ } : undef,
+ m_media_type => "html",
+ );
+ return !!$old;
+ }
+ else {
+ return !!$self->get_my_handler("response_header");
+ }
+}
+
+sub cookie_jar {
+ my $self = shift;
+ my $old = $self->{cookie_jar};
+ if (@_) {
+ my $jar = shift;
+ if (ref($jar) eq "HASH") {
+ require HTTP::Cookies;
+ $jar = HTTP::Cookies->new(%$jar);
+ }
+ $self->{cookie_jar} = $jar;
+ $self->set_my_handler("request_prepare",
+ $jar ? sub { $jar->add_cookie_header($_[0]); } : undef,
+ );
+ $self->set_my_handler("response_done",
+ $jar ? sub { $jar->extract_cookies($_[0]); } : undef,
+ );
+ }
+ $old;
+}
+
+sub default_headers {
+ my $self = shift;
+ my $old = $self->{def_headers} ||= HTTP::Headers->new;
+ if (@_) {
+ Carp::croak("default_headers not set to HTTP::Headers compatible object")
+ unless @_ == 1 && $_[0]->can("header_field_names");
+ $self->{def_headers} = shift;
+ }
+ return $old;
+}
+
+sub default_header {
+ my $self = shift;
+ return $self->default_headers->header(@_);
+}
+
+sub _agent { "libwww-perl/$LWP::VERSION" }
+
+sub agent {
+ my $self = shift;
+ if (@_) {
+ my $agent = shift;
+ if ($agent) {
+ $agent .= $self->_agent if $agent =~ /\s+$/;
+ }
+ else {
+ undef($agent)
+ }
+ return $self->default_header("User-Agent", $agent);
+ }
+ return $self->default_header("User-Agent");
+}
+
+sub from { # legacy
+ my $self = shift;
+ return $self->default_header("From", @_);
+}
+
+
+sub conn_cache {
+ my $self = shift;
+ my $old = $self->{conn_cache};
+ if (@_) {
+ my $cache = shift;
+ if (ref($cache) eq "HASH") {
+ require LWP::ConnCache;
+ $cache = LWP::ConnCache->new(%$cache);
+ }
+ $self->{conn_cache} = $cache;
+ }
+ $old;
+}
+
+
+sub add_handler {
+ my($self, $phase, $cb, %spec) = @_;
+ $spec{line} ||= join(":", (caller)[1,2]);
+ my $conf = $self->{handlers}{$phase} ||= do {
+ require HTTP::Config;
+ HTTP::Config->new;
+ };
+ $conf->add(%spec, callback => $cb);
+}
+
+sub set_my_handler {
+ my($self, $phase, $cb, %spec) = @_;
+ $spec{owner} = (caller(1))[3] unless exists $spec{owner};
+ $self->remove_handler($phase, %spec);
+ $spec{line} ||= join(":", (caller)[1,2]);
+ $self->add_handler($phase, $cb, %spec) if $cb;
+}
+
+sub get_my_handler {
+ my $self = shift;
+ my $phase = shift;
+ my $init = pop if @_ % 2;
+ my %spec = @_;
+ my $conf = $self->{handlers}{$phase};
+ unless ($conf) {
+ return unless $init;
+ require HTTP::Config;
+ $conf = $self->{handlers}{$phase} = HTTP::Config->new;
+ }
+ $spec{owner} = (caller(1))[3] unless exists $spec{owner};
+ my @h = $conf->find(%spec);
+ if (!@h && $init) {
+ if (ref($init) eq "CODE") {
+ $init->(\%spec);
+ }
+ elsif (ref($init) eq "HASH") {
+ while (my($k, $v) = each %$init) {
+ $spec{$k} = $v;
+ }
+ }
+ $spec{callback} ||= sub {};
+ $spec{line} ||= join(":", (caller)[1,2]);
+ $conf->add(\%spec);
+ return \%spec;
+ }
+ return wantarray ? @h : $h[0];
+}
+
+sub remove_handler {
+ my($self, $phase, %spec) = @_;
+ if ($phase) {
+ my $conf = $self->{handlers}{$phase} || return;
+ my @h = $conf->remove(%spec);
+ delete $self->{handlers}{$phase} if $conf->empty;
+ return @h;
+ }
+
+ return unless $self->{handlers};
+ return map $self->remove_handler($_), sort keys %{$self->{handlers}};
+}
+
+sub handlers {
+ my($self, $phase, $o) = @_;
+ my @h;
+ if ($o->{handlers} && $o->{handlers}{$phase}) {
+ push(@h, @{$o->{handlers}{$phase}});
+ }
+ if (my $conf = $self->{handlers}{$phase}) {
+ push(@h, $conf->matching($o));
+ }
+ return @h;
+}
+
+sub run_handlers {
+ my($self, $phase, $o) = @_;
+ if (defined(wantarray)) {
+ for my $h ($self->handlers($phase, $o)) {
+ my $ret = $h->{callback}->($o, $self, $h);
+ return $ret if $ret;
+ }
+ return undef;
+ }
+
+ for my $h ($self->handlers($phase, $o)) {
+ $h->{callback}->($o, $self, $h);
+ }
+}
+
+
+# depreciated
+sub use_eval { shift->_elem('use_eval', @_); }
+sub use_alarm
+{
+ Carp::carp("LWP::UserAgent->use_alarm(BOOL) is a no-op")
+ if @_ > 1 && $^W;
+ "";
+}
+
+
+sub clone
+{
+ my $self = shift;
+ my $copy = bless { %$self }, ref $self; # copy most fields
+
+ delete $copy->{handlers};
+ delete $copy->{conn_cache};
+
+ # copy any plain arrays and hashes; known not to need recursive copy
+ for my $k (qw(proxy no_proxy requests_redirectable)) {
+ next unless $copy->{$k};
+ if (ref($copy->{$k}) eq "ARRAY") {
+ $copy->{$k} = [ @{$copy->{$k}} ];
+ }
+ elsif (ref($copy->{$k}) eq "HASH") {
+ $copy->{$k} = { %{$copy->{$k}} };
+ }
+ }
+
+ if ($self->{def_headers}) {
+ $copy->{def_headers} = $self->{def_headers}->clone;
+ }
+
+ # re-enable standard handlers
+ $copy->parse_head($self->parse_head);
+
+ # no easy way to clone the cookie jar; so let's just remove it for now
+ $copy->cookie_jar(undef);
+
+ $copy;
+}
+
+
+sub mirror
+{
+ my($self, $url, $file) = @_;
+
+ my $request = HTTP::Request->new('GET', $url);
+
+ # If the file exists, add a cache-related header
+ if ( -e $file ) {
+ my ($mtime) = ( stat($file) )[9];
+ if ($mtime) {
+ $request->header( 'If-Modified-Since' => HTTP::Date::time2str($mtime) );
+ }
+ }
+ my $tmpfile = "$file-$$";
+
+ my $response = $self->request($request, $tmpfile);
+ if ( $response->header('X-Died') ) {
+ die $response->header('X-Died');
+ }
+
+ # Only fetching a fresh copy of the would be considered success.
+ # If the file was not modified, "304" would returned, which
+ # is considered by HTTP::Status to be a "redirect", /not/ "success"
+ if ( $response->is_success ) {
+ my @stat = stat($tmpfile) or die "Could not stat tmpfile '$tmpfile': $!";
+ my $file_length = $stat[7];
+ my ($content_length) = $response->header('Content-length');
+
+ if ( defined $content_length and $file_length < $content_length ) {
+ unlink($tmpfile);
+ die "Transfer truncated: " . "only $file_length out of $content_length bytes received\n";
+ }
+ elsif ( defined $content_length and $file_length > $content_length ) {
+ unlink($tmpfile);
+ die "Content-length mismatch: " . "expected $content_length bytes, got $file_length\n";
+ }
+ # The file was the expected length.
+ else {
+ # Replace the stale file with a fresh copy
+ if ( -e $file ) {
+ # Some dosish systems fail to rename if the target exists
+ chmod 0777, $file;
+ unlink $file;
+ }
+ rename( $tmpfile, $file )
+ or die "Cannot rename '$tmpfile' to '$file': $!\n";
+
+ # make sure the file has the same last modification time
+ if ( my $lm = $response->last_modified ) {
+ utime $lm, $lm, $file;
+ }
+ }
+ }
+ # The local copy is fresh enough, so just delete the temp file
+ else {
+ unlink($tmpfile);
+ }
+ return $response;
+}
+
+
+sub _need_proxy {
+ my($req, $ua) = @_;
+ return if exists $req->{proxy};
+ my $proxy = $ua->{proxy}{$req->uri->scheme} || return;
+ if ($ua->{no_proxy}) {
+ if (my $host = eval { $req->uri->host }) {
+ for my $domain (@{$ua->{no_proxy}}) {
+ if ($host =~ /\Q$domain\E$/) {
+ return;
+ }
+ }
+ }
+ }
+ $req->{proxy} = $HTTP::URI_CLASS->new($proxy);
+}
+
+
+sub proxy
+{
+ my $self = shift;
+ my $key = shift;
+ return map $self->proxy($_, @_), @$key if ref $key;
+
+ Carp::croak("'$key' is not a valid URI scheme") unless $key =~ /^$URI::scheme_re\z/;
+ my $old = $self->{'proxy'}{$key};
+ if (@_) {
+ my $url = shift;
+ if (defined($url) && length($url)) {
+ Carp::croak("Proxy must be specified as absolute URI; '$url' is not") unless $url =~ /^$URI::scheme_re:/;
+ Carp::croak("Bad http proxy specification '$url'") if $url =~ /^https?:/ && $url !~ m,^https?://\w,;
+ }
+ $self->{proxy}{$key} = $url;
+ $self->set_my_handler("request_preprepare", \&_need_proxy)
+ }
+ return $old;
+}
+
+
+sub env_proxy {
+ my ($self) = @_;
+ my($k,$v);
+ while(($k, $v) = each %ENV) {
+ if ($ENV{REQUEST_METHOD}) {
+ # Need to be careful when called in the CGI environment, as
+ # the HTTP_PROXY variable is under control of that other guy.
+ next if $k =~ /^HTTP_/;
+ $k = "HTTP_PROXY" if $k eq "CGI_HTTP_PROXY";
+ }
+ $k = lc($k);
+ next unless $k =~ /^(.*)_proxy$/;
+ $k = $1;
+ if ($k eq 'no') {
+ $self->no_proxy(split(/\s*,\s*/, $v));
+ }
+ else {
+ # Ignore random _proxy variables, allow only valid schemes
+ next unless $k =~ /^$URI::scheme_re\z/;
+ # Ignore xxx_proxy variables if xxx isn't a supported protocol
+ next unless LWP::Protocol::implementor($k);
+ $self->proxy($k, $v);
+ }
+ }
+}
+
+
+sub no_proxy {
+ my($self, @no) = @_;
+ if (@no) {
+ push(@{ $self->{'no_proxy'} }, @no);
+ }
+ else {
+ $self->{'no_proxy'} = [];
+ }
+}
+
+
+sub _new_response {
+ my($request, $code, $message) = @_;
+ my $response = HTTP::Response->new($code, $message);
+ $response->request($request);
+ $response->header("Client-Date" => HTTP::Date::time2str(time));
+ $response->header("Client-Warning" => "Internal response");
+ $response->header("Content-Type" => "text/plain");
+ $response->content("$code $message\n");
+ return $response;
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+LWP::UserAgent - Web user agent class
+
+=head1 SYNOPSIS
+
+ require LWP::UserAgent;
+
+ my $ua = LWP::UserAgent->new;
+ $ua->timeout(10);
+ $ua->env_proxy;
+
+ my $response = $ua->get('http://search.cpan.org/');
+
+ if ($response->is_success) {
+ print $response->decoded_content; # or whatever
+ }
+ else {
+ die $response->status_line;
+ }
+
+=head1 DESCRIPTION
+
+The C<LWP::UserAgent> is a class implementing a web user agent.
+C<LWP::UserAgent> objects can be used to dispatch web requests.
+
+In normal use the application creates an C<LWP::UserAgent> object, and
+then configures it with values for timeouts, proxies, name, etc. It
+then creates an instance of C<HTTP::Request> for the request that
+needs to be performed. This request is then passed to one of the
+request method the UserAgent, which dispatches it using the relevant
+protocol, and returns a C<HTTP::Response> object. There are
+convenience methods for sending the most common request types: get(),
+head() and post(). When using these methods then the creation of the
+request object is hidden as shown in the synopsis above.
+
+The basic approach of the library is to use HTTP style communication
+for all protocol schemes. This means that you will construct
+C<HTTP::Request> objects and receive C<HTTP::Response> objects even
+for non-HTTP resources like I<gopher> and I<ftp>. In order to achieve
+even more similarity to HTTP style communications, gopher menus and
+file directories are converted to HTML documents.
+
+=head1 CONSTRUCTOR METHODS
+
+The following constructor methods are available:
+
+=over 4
+
+=item $ua = LWP::UserAgent->new( %options )
+
+This method constructs a new C<LWP::UserAgent> object and returns it.
+Key/value pair arguments may be provided to set up the initial state.
+The following options correspond to attribute methods described below:
+
+ KEY DEFAULT
+ ----------- --------------------
+ agent "libwww-perl/#.###"
+ from undef
+ conn_cache undef
+ cookie_jar undef
+ default_headers HTTP::Headers->new
+ local_address undef
+ max_size undef
+ max_redirect 7
+ parse_head 1
+ protocols_allowed undef
+ protocols_forbidden undef
+ requests_redirectable ['GET', 'HEAD']
+ timeout 180
+
+The following additional options are also accepted: If the
+C<env_proxy> option is passed in with a TRUE value, then proxy
+settings are read from environment variables (see env_proxy() method
+below). If the C<keep_alive> option is passed in, then a
+C<LWP::ConnCache> is set up (see conn_cache() method below). The
+C<keep_alive> value is passed on as the C<total_capacity> for the
+connection cache.
+
+=item $ua->clone
+
+Returns a copy of the LWP::UserAgent object.
+
+=back
+
+=head1 ATTRIBUTES
+
+The settings of the configuration attributes modify the behaviour of the
+C<LWP::UserAgent> when it dispatches requests. Most of these can also
+be initialized by options passed to the constructor method.
+
+The following attribute methods are provided. The attribute value is
+left unchanged if no argument is given. The return value from each
+method is the old attribute value.
+
+=over
+
+=item $ua->agent
+
+=item $ua->agent( $product_id )
+
+Get/set the product token that is used to identify the user agent on
+the network. The agent value is sent as the "User-Agent" header in
+the requests. The default is the string returned by the _agent()
+method (see below).
+
+If the $product_id ends with space then the _agent() string is
+appended to it.
+
+The user agent string should be one or more simple product identifiers
+with an optional version number separated by the "/" character.
+Examples are:
+
+ $ua->agent('Checkbot/0.4 ' . $ua->_agent);
+ $ua->agent('Checkbot/0.4 '); # same as above
+ $ua->agent('Mozilla/5.0');
+ $ua->agent(""); # don't identify
+
+=item $ua->_agent
+
+Returns the default agent identifier. This is a string of the form
+"libwww-perl/#.###", where "#.###" is substituted with the version number
+of this library.
+
+=item $ua->from
+
+=item $ua->from( $email_address )
+
+Get/set the e-mail address for the human user who controls
+the requesting user agent. The address should be machine-usable, as
+defined in RFC 822. The C<from> value is send as the "From" header in
+the requests. Example:
+
+ $ua->from('gaas@cpan.org');
+
+The default is to not send a "From" header. See the default_headers()
+method for the more general interface that allow any header to be defaulted.
+
+=item $ua->cookie_jar
+
+=item $ua->cookie_jar( $cookie_jar_obj )
+
+Get/set the cookie jar object to use. The only requirement is that
+the cookie jar object must implement the extract_cookies($request) and
+add_cookie_header($response) methods. These methods will then be
+invoked by the user agent as requests are sent and responses are
+received. Normally this will be a C<HTTP::Cookies> object or some
+subclass.
+
+The default is to have no cookie_jar, i.e. never automatically add
+"Cookie" headers to the requests.
+
+Shortcut: If a reference to a plain hash is passed in as the
+$cookie_jar_object, then it is replaced with an instance of
+C<HTTP::Cookies> that is initialized based on the hash. This form also
+automatically loads the C<HTTP::Cookies> module. It means that:
+
+ $ua->cookie_jar({ file => "$ENV{HOME}/.cookies.txt" });
+
+is really just a shortcut for:
+
+ require HTTP::Cookies;
+ $ua->cookie_jar(HTTP::Cookies->new(file => "$ENV{HOME}/.cookies.txt"));
+
+=item $ua->default_headers
+
+=item $ua->default_headers( $headers_obj )
+
+Get/set the headers object that will provide default header values for
+any requests sent. By default this will be an empty C<HTTP::Headers>
+object.
+
+=item $ua->default_header( $field )
+
+=item $ua->default_header( $field => $value )
+
+This is just a short-cut for $ua->default_headers->header( $field =>
+$value ). Example:
+
+ $ua->default_header('Accept-Encoding' => scalar HTTP::Message::decodable());
+ $ua->default_header('Accept-Language' => "no, en");
+
+=item $ua->conn_cache
+
+=item $ua->conn_cache( $cache_obj )
+
+Get/set the C<LWP::ConnCache> object to use. See L<LWP::ConnCache>
+for details.
+
+=item $ua->credentials( $netloc, $realm )
+
+=item $ua->credentials( $netloc, $realm, $uname, $pass )
+
+Get/set the user name and password to be used for a realm.
+
+The $netloc is a string of the form "<host>:<port>". The username and
+password will only be passed to this server. Example:
+
+ $ua->credentials("www.example.com:80", "Some Realm", "foo", "secret");
+
+=item $ua->local_address
+
+=item $ua->local_address( $address )
+
+Get/set the local interface to bind to for network connections. The interface
+can be specified as a hostname or an IP address. This value is passed as the
+C<LocalAddr> argument to L<IO::Socket::INET>.
+
+=item $ua->max_size
+
+=item $ua->max_size( $bytes )
+
+Get/set the size limit for response content. The default is C<undef>,
+which means that there is no limit. If the returned response content
+is only partial, because the size limit was exceeded, then a
+"Client-Aborted" header will be added to the response. The content
+might end up longer than C<max_size> as we abort once appending a
+chunk of data makes the length exceed the limit. The "Content-Length"
+header, if present, will indicate the length of the full content and
+will normally not be the same as C<< length($res->content) >>.
+
+=item $ua->max_redirect
+
+=item $ua->max_redirect( $n )
+
+This reads or sets the object's limit of how many times it will obey
+redirection responses in a given request cycle.
+
+By default, the value is 7. This means that if you call request()
+method and the response is a redirect elsewhere which is in turn a
+redirect, and so on seven times, then LWP gives up after that seventh
+request.
+
+=item $ua->parse_head
+
+=item $ua->parse_head( $boolean )
+
+Get/set a value indicating whether we should initialize response
+headers from the E<lt>head> section of HTML documents. The default is
+TRUE. Do not turn this off, unless you know what you are doing.
+
+=item $ua->protocols_allowed
+
+=item $ua->protocols_allowed( \@protocols )
+
+This reads (or sets) this user agent's list of protocols that the
+request methods will exclusively allow. The protocol names are case
+insensitive.
+
+For example: C<$ua-E<gt>protocols_allowed( [ 'http', 'https'] );>
+means that this user agent will I<allow only> those protocols,
+and attempts to use this user agent to access URLs with any other
+schemes (like "ftp://...") will result in a 500 error.
+
+To delete the list, call: C<$ua-E<gt>protocols_allowed(undef)>
+
+By default, an object has neither a C<protocols_allowed> list, nor a
+C<protocols_forbidden> list.
+
+Note that having a C<protocols_allowed> list causes any
+C<protocols_forbidden> list to be ignored.
+
+=item $ua->protocols_forbidden
+
+=item $ua->protocols_forbidden( \@protocols )
+
+This reads (or sets) this user agent's list of protocols that the
+request method will I<not> allow. The protocol names are case
+insensitive.
+
+For example: C<$ua-E<gt>protocols_forbidden( [ 'file', 'mailto'] );>
+means that this user agent will I<not> allow those protocols, and
+attempts to use this user agent to access URLs with those schemes
+will result in a 500 error.
+
+To delete the list, call: C<$ua-E<gt>protocols_forbidden(undef)>
+
+=item $ua->requests_redirectable
+
+=item $ua->requests_redirectable( \@requests )
+
+This reads or sets the object's list of request names that
+C<$ua-E<gt>redirect_ok(...)> will allow redirection for. By
+default, this is C<['GET', 'HEAD']>, as per RFC 2616. To
+change to include 'POST', consider:
+
+ push @{ $ua->requests_redirectable }, 'POST';
+
+=item $ua->show_progress
+
+=item $ua->show_progress( $boolean )
+
+Get/set a value indicating whether a progress bar should be displayed
+on on the terminal as requests are processed. The default is FALSE.
+
+=item $ua->timeout
+
+=item $ua->timeout( $secs )
+
+Get/set the timeout value in seconds. The default timeout() value is
+180 seconds, i.e. 3 minutes.
+
+The requests is aborted if no activity on the connection to the server
+is observed for C<timeout> seconds. This means that the time it takes
+for the complete transaction and the request() method to actually
+return might be longer.
+
+=back
+
+=head2 Proxy attributes
+
+The following methods set up when requests should be passed via a
+proxy server.
+
+=over
+
+=item $ua->proxy(\@schemes, $proxy_url)
+
+=item $ua->proxy($scheme, $proxy_url)
+
+Set/retrieve proxy URL for a scheme:
+
+ $ua->proxy(['http', 'ftp'], 'http://proxy.sn.no:8001/');
+ $ua->proxy('gopher', 'http://proxy.sn.no:8001/');
+
+The first form specifies that the URL is to be used for proxying of
+access methods listed in the list in the first method argument,
+i.e. 'http' and 'ftp'.
+
+The second form shows a shorthand form for specifying
+proxy URL for a single access scheme.
+
+=item $ua->no_proxy( $domain, ... )
+
+Do not proxy requests to the given domains. Calling no_proxy without
+any domains clears the list of domains. Eg:
+
+ $ua->no_proxy('localhost', 'example.com');
+
+=item $ua->env_proxy
+
+Load proxy settings from *_proxy environment variables. You might
+specify proxies like this (sh-syntax):
+
+ gopher_proxy=http://proxy.my.place/
+ wais_proxy=http://proxy.my.place/
+ no_proxy="localhost,example.com"
+ export gopher_proxy wais_proxy no_proxy
+
+csh or tcsh users should use the C<setenv> command to define these
+environment variables.
+
+On systems with case insensitive environment variables there exists a
+name clash between the CGI environment variables and the C<HTTP_PROXY>
+environment variable normally picked up by env_proxy(). Because of
+this C<HTTP_PROXY> is not honored for CGI scripts. The
+C<CGI_HTTP_PROXY> environment variable can be used instead.
+
+=back
+
+=head2 Handlers
+
+Handlers are code that injected at various phases during the
+processing of requests. The following methods are provided to manage
+the active handlers:
+
+=over
+
+=item $ua->add_handler( $phase => \&cb, %matchspec )
+
+Add handler to be invoked in the given processing phase. For how to
+specify %matchspec see L<HTTP::Config/"Matching">.
+
+The possible values $phase and the corresponding callback signatures are:
+
+=over
+
+=item request_preprepare => sub { my($request, $ua, $h) = @_; ... }
+
+The handler is called before the C<request_prepare> and other standard
+initialization of of the request. This can be used to set up headers
+and attributes that the C<request_prepare> handler depends on. Proxy
+initialization should take place here; but in general don't register
+handlers for this phase.
+
+=item request_prepare => sub { my($request, $ua, $h) = @_; ... }
+
+The handler is called before the request is sent and can modify the
+request any way it see fit. This can for instance be used to add
+certain headers to specific requests.
+
+The method can assign a new request object to $_[0] to replace the
+request that is sent fully.
+
+The return value from the callback is ignored. If an exceptions is
+raised it will abort the request and make the request method return a
+"400 Bad request" response.
+
+=item request_send => sub { my($request, $ua, $h) = @_; ... }
+
+This handler get a chance of handling requests before it's sent to the
+protocol handlers. It should return an HTTP::Response object if it
+wishes to terminate the processing; otherwise it should return nothing.
+
+The C<response_header> and C<response_data> handlers will not be
+invoked for this response, but the C<response_done> will be.
+
+=item response_header => sub { my($response, $ua, $h) = @_; ... }
+
+This handler is called right after the response headers have been
+received, but before any content data. The handler might set up
+handlers for data and might croak to abort the request.
+
+The handler might set the $response->{default_add_content} value to
+control if any received data should be added to the response object
+directly. This will initially be false if the $ua->request() method
+was called with a ':content_filename' or ':content_callbak' argument;
+otherwise true.
+
+=item response_data => sub { my($response, $ua, $h, $data) = @_; ... }
+
+This handlers is called for each chunk of data received for the
+response. The handler might croak to abort the request.
+
+This handler need to return a TRUE value to be called again for
+subsequent chunks for the same request.
+
+=item response_done => sub { my($response, $ua, $h) = @_; ... }
+
+The handler is called after the response has been fully received, but
+before any redirect handling is attempted. The handler can be used to
+extract information or modify the response.
+
+=item response_redirect => sub { my($response, $ua, $h) = @_; ... }
+
+The handler is called in $ua->request after C<response_done>. If the
+handler return an HTTP::Request object we'll start over with processing
+this request instead.
+
+=back
+
+=item $ua->remove_handler( undef, %matchspec )
+
+=item $ua->remove_handler( $phase, %matchspec )
+
+Remove handlers that match the given %matchspec. If $phase is not
+provided remove handlers from all phases.
+
+Be careful as calling this function with %matchspec that is not not
+specific enough can remove handlers not owned by you. It's probably
+better to use the set_my_handler() method instead.
+
+The removed handlers are returned.
+
+=item $ua->set_my_handler( $phase, $cb, %matchspec )
+
+Set handlers private to the executing subroutine. Works by defaulting
+an C<owner> field to the %matchhspec that holds the name of the called
+subroutine. You might pass an explicit C<owner> to override this.
+
+If $cb is passed as C<undef>, remove the handler.
+
+=item $ua->get_my_handler( $phase, %matchspec )
+
+=item $ua->get_my_handler( $phase, %matchspec, $init )
+
+Will retrieve the matching handler as hash ref.
+
+If C<$init> is passed passed as a TRUE value, create and add the
+handler if it's not found. If $init is a subroutine reference, then
+it's called with the created handler hash as argument. This sub might
+populate the hash with extra fields; especially the callback. If
+$init is a hash reference, merge the hashes.
+
+=item $ua->handlers( $phase, $request )
+
+=item $ua->handlers( $phase, $response )
+
+Returns the handlers that apply to the given request or response at
+the given processing phase.
+
+=back
+
+=head1 REQUEST METHODS
+
+The methods described in this section are used to dispatch requests
+via the user agent. The following request methods are provided:
+
+=over
+
+=item $ua->get( $url )
+
+=item $ua->get( $url , $field_name => $value, ... )
+
+This method will dispatch a C<GET> request on the given $url. Further
+arguments can be given to initialize the headers of the request. These
+are given as separate name/value pairs. The return value is a
+response object. See L<HTTP::Response> for a description of the
+interface it provides.
+
+There will still be a response object returned when LWP can't connect to the
+server specified in the URL or when other failures in protocol handlers occur.
+These internal responses use the standard HTTP status codes, so the responses
+can't be differentiated by testing the response status code alone. Error
+responses that LWP generates internally will have the "Client-Warning" header
+set to the value "Internal response". If you need to differentiate these
+internal responses from responses that a remote server actually generates, you
+need to test this header value.
+
+Fields names that start with ":" are special. These will not
+initialize headers of the request but will determine how the response
+content is treated. The following special field names are recognized:
+
+ :content_file => $filename
+ :content_cb => \&callback
+ :read_size_hint => $bytes
+
+If a $filename is provided with the C<:content_file> option, then the
+response content will be saved here instead of in the response
+object. If a callback is provided with the C<:content_cb> option then
+this function will be called for each chunk of the response content as
+it is received from the server. If neither of these options are
+given, then the response content will accumulate in the response
+object itself. This might not be suitable for very large response
+bodies. Only one of C<:content_file> or C<:content_cb> can be
+specified. The content of unsuccessful responses will always
+accumulate in the response object itself, regardless of the
+C<:content_file> or C<:content_cb> options passed in.
+
+The C<:read_size_hint> option is passed to the protocol module which
+will try to read data from the server in chunks of this size. A
+smaller value for the C<:read_size_hint> will result in a higher
+number of callback invocations.
+
+The callback function is called with 3 arguments: a chunk of data, a
+reference to the response object, and a reference to the protocol
+object. The callback can abort the request by invoking die(). The
+exception message will show up as the "X-Died" header field in the
+response returned by the get() function.
+
+=item $ua->head( $url )
+
+=item $ua->head( $url , $field_name => $value, ... )
+
+This method will dispatch a C<HEAD> request on the given $url.
+Otherwise it works like the get() method described above.
+
+=item $ua->post( $url, \%form )
+
+=item $ua->post( $url, \@form )
+
+=item $ua->post( $url, \%form, $field_name => $value, ... )
+
+=item $ua->post( $url, $field_name => $value,... Content => \%form )
+
+=item $ua->post( $url, $field_name => $value,... Content => \@form )
+
+=item $ua->post( $url, $field_name => $value,... Content => $content )
+
+This method will dispatch a C<POST> request on the given $url, with
+%form or @form providing the key/value pairs for the fill-in form
+content. Additional headers and content options are the same as for
+the get() method.
+
+This method will use the POST() function from C<HTTP::Request::Common>
+to build the request. See L<HTTP::Request::Common> for a details on
+how to pass form content and other advanced features.
+
+=item $ua->mirror( $url, $filename )
+
+This method will get the document identified by $url and store it in
+file called $filename. If the file already exists, then the request
+will contain an "If-Modified-Since" header matching the modification
+time of the file. If the document on the server has not changed since
+this time, then nothing happens. If the document has been updated, it
+will be downloaded again. The modification time of the file will be
+forced to match that of the server.
+
+The return value is the the response object.
+
+=item $ua->request( $request )
+
+=item $ua->request( $request, $content_file )
+
+=item $ua->request( $request, $content_cb )
+
+=item $ua->request( $request, $content_cb, $read_size_hint )
+
+This method will dispatch the given $request object. Normally this
+will be an instance of the C<HTTP::Request> class, but any object with
+a similar interface will do. The return value is a response object.
+See L<HTTP::Request> and L<HTTP::Response> for a description of the
+interface provided by these classes.
+
+The request() method will process redirects and authentication
+responses transparently. This means that it may actually send several
+simple requests via the simple_request() method described below.
+
+The request methods described above; get(), head(), post() and
+mirror(), will all dispatch the request they build via this method.
+They are convenience methods that simply hides the creation of the
+request object for you.
+
+The $content_file, $content_cb and $read_size_hint all correspond to
+options described with the get() method above.
+
+You are allowed to use a CODE reference as C<content> in the request
+object passed in. The C<content> function should return the content
+when called. The content can be returned in chunks. The content
+function will be invoked repeatedly until it return an empty string to
+signal that there is no more content.
+
+=item $ua->simple_request( $request )
+
+=item $ua->simple_request( $request, $content_file )
+
+=item $ua->simple_request( $request, $content_cb )
+
+=item $ua->simple_request( $request, $content_cb, $read_size_hint )
+
+This method dispatches a single request and returns the response
+received. Arguments are the same as for request() described above.
+
+The difference from request() is that simple_request() will not try to
+handle redirects or authentication responses. The request() method
+will in fact invoke this method for each simple request it sends.
+
+=item $ua->is_protocol_supported( $scheme )
+
+You can use this method to test whether this user agent object supports the
+specified C<scheme>. (The C<scheme> might be a string (like 'http' or
+'ftp') or it might be an URI object reference.)
+
+Whether a scheme is supported, is determined by the user agent's
+C<protocols_allowed> or C<protocols_forbidden> lists (if any), and by
+the capabilities of LWP. I.e., this will return TRUE only if LWP
+supports this protocol I<and> it's permitted for this particular
+object.
+
+=back
+
+=head2 Callback methods
+
+The following methods will be invoked as requests are processed. These
+methods are documented here because subclasses of C<LWP::UserAgent>
+might want to override their behaviour.
+
+=over
+
+=item $ua->prepare_request( $request )
+
+This method is invoked by simple_request(). Its task is to modify the
+given $request object by setting up various headers based on the
+attributes of the user agent. The return value should normally be the
+$request object passed in. If a different request object is returned
+it will be the one actually processed.
+
+The headers affected by the base implementation are; "User-Agent",
+"From", "Range" and "Cookie".
+
+=item $ua->redirect_ok( $prospective_request, $response )
+
+This method is called by request() before it tries to follow a
+redirection to the request in $response. This should return a TRUE
+value if this redirection is permissible. The $prospective_request
+will be the request to be sent if this method returns TRUE.
+
+The base implementation will return FALSE unless the method
+is in the object's C<requests_redirectable> list,
+FALSE if the proposed redirection is to a "file://..."
+URL, and TRUE otherwise.
+
+=item $ua->get_basic_credentials( $realm, $uri, $isproxy )
+
+This is called by request() to retrieve credentials for documents
+protected by Basic or Digest Authentication. The arguments passed in
+is the $realm provided by the server, the $uri requested and a boolean
+flag to indicate if this is authentication against a proxy server.
+
+The method should return a username and password. It should return an
+empty list to abort the authentication resolution attempt. Subclasses
+can override this method to prompt the user for the information. An
+example of this can be found in C<lwp-request> program distributed
+with this library.
+
+The base implementation simply checks a set of pre-stored member
+variables, set up with the credentials() method.
+
+=item $ua->progress( $status, $request_or_response )
+
+This is called frequently as the response is received regardless of
+how the content is processed. The method is called with $status
+"begin" at the start of processing the request and with $state "end"
+before the request method returns. In between these $status will be
+the fraction of the response currently received or the string "tick"
+if the fraction can't be calculated.
+
+When $status is "begin" the second argument is the request object,
+otherwise it is the response object.
+
+=back
+
+=head1 SEE ALSO
+
+See L<LWP> for a complete overview of libwww-perl5. See L<lwpcook>
+and the scripts F<lwp-request> and F<lwp-download> for examples of
+usage.
+
+See L<HTTP::Request> and L<HTTP::Response> for a description of the
+message objects dispatched and received. See L<HTTP::Request::Common>
+and L<HTML::Form> for other ways to build request objects.
+
+See L<WWW::Mechanize> and L<WWW::Search> for examples of more
+specialized user agents based on C<LWP::UserAgent>.
+
+=head1 COPYRIGHT
+
+Copyright 1995-2009 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
diff --git a/Master/tlpkg/tlperl.straw/lib/LWP/media.types b/Master/tlpkg/tlperl.straw/lib/LWP/media.types
new file mode 100755
index 00000000000..fbd54984d63
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/LWP/media.types
@@ -0,0 +1,1064 @@
+# This is a comment. I love comments.
+
+# This file controls what Internet media types are sent to the client for
+# given file extension(s). Sending the correct media type to the client
+# is important so they know how to handle the content of the file.
+# For more information about Internet media types, please read RFC 2045,
+# 2046, 2047, 2048, and 2077. The Internet media type registry is
+# at <http://www.iana.org/assignments/media-types/>.
+
+# MIME type Extensions
+application/activemessage
+application/andrew-inset ez
+application/applefile
+application/atom+xml atom
+application/atomcat+xml atomcat
+application/atomicmail
+application/atomsvc+xml atomsvc
+application/auth-policy+xml
+application/batch-smtp
+application/beep+xml
+application/cals-1840
+application/ccxml+xml ccxml
+application/cellml+xml
+application/cnrp+xml
+application/commonground
+application/conference-info+xml
+application/cpl+xml
+application/csta+xml
+application/cstadata+xml
+application/cybercash
+application/davmount+xml davmount
+application/dca-rft
+application/dec-dx
+application/dialog-info+xml
+application/dicom
+application/dns
+application/dvcs
+application/ecmascript ecma
+application/edi-consent
+application/edi-x12
+application/edifact
+application/epp+xml
+application/eshop
+application/fastinfoset
+application/fastsoap
+application/fits
+application/font-tdpfr pfr
+application/h224
+application/http
+application/hyperstudio stk
+application/iges
+application/im-iscomposing+xml
+application/index
+application/index.cmd
+application/index.obj
+application/index.response
+application/index.vnd
+application/iotp
+application/ipp
+application/isup
+application/javascript js
+application/json json
+application/kpml-request+xml
+application/kpml-response+xml
+application/lost+xml lostxml
+application/mac-binhex40 hqx
+application/mac-compactpro cpt
+application/macwriteii
+application/marc mrc
+application/mathematica ma nb mb
+application/mathml+xml mathml
+application/mbms-associated-procedure-description+xml
+application/mbms-deregister+xml
+application/mbms-envelope+xml
+application/mbms-msk+xml
+application/mbms-msk-response+xml
+application/mbms-protection-description+xml
+application/mbms-reception-report+xml
+application/mbms-register+xml
+application/mbms-register-response+xml
+application/mbms-user-service-description+xml
+application/mbox mbox
+application/media_control+xml
+application/mediaservercontrol+xml mscml
+application/mikey
+application/moss-keys
+application/moss-signature
+application/mosskey-data
+application/mosskey-request
+application/mp4 mp4s
+application/mpeg4-generic
+application/mpeg4-iod
+application/mpeg4-iod-xmt
+application/msword doc dot
+application/mxf mxf
+application/nasdata
+application/news-transmission
+application/nss
+application/ocsp-request
+application/ocsp-response
+application/octet-stream bin dms lha lzh class so iso dmg dist distz pkg bpk dump elc
+application/oda oda
+application/oebps-package+xml
+application/ogg ogx
+application/parityfec
+application/patch-ops-error+xml xer
+application/pdf pdf
+application/pgp-encrypted pgp
+application/pgp-keys
+application/pgp-signature asc sig
+application/pics-rules prf
+application/pidf+xml
+application/pidf-diff+xml
+application/pkcs10 p10
+application/pkcs7-mime p7m p7c
+application/pkcs7-signature p7s
+application/pkix-cert cer
+application/pkix-crl crl
+application/pkix-pkipath pkipath
+application/pkixcmp pki
+application/pls+xml pls
+application/poc-settings+xml
+application/postscript ai eps ps
+application/prs.alvestrand.titrax-sheet
+application/prs.cww cww
+application/prs.nprend
+application/prs.plucker
+application/qsig
+application/rdf+xml rdf
+application/reginfo+xml rif
+application/relax-ng-compact-syntax rnc
+application/remote-printing
+application/resource-lists+xml rl
+application/resource-lists-diff+xml rld
+application/riscos
+application/rlmi+xml
+application/rls-services+xml rs
+application/rsd+xml rsd
+application/rss+xml rss
+application/rtf rtf
+application/rtx
+application/samlassertion+xml
+application/samlmetadata+xml
+application/sbml+xml sbml
+application/scvp-cv-request scq
+application/scvp-cv-response scs
+application/scvp-vp-request spq
+application/scvp-vp-response spp
+application/sdp sdp
+application/set-payment
+application/set-payment-initiation setpay
+application/set-registration
+application/set-registration-initiation setreg
+application/sgml
+application/sgml-open-catalog
+application/shf+xml shf
+application/sieve
+application/simple-filter+xml
+application/simple-message-summary
+application/simplesymbolcontainer
+application/slate
+application/smil
+application/smil+xml smi smil
+application/soap+fastinfoset
+application/soap+xml
+application/sparql-query rq
+application/sparql-results+xml srx
+application/spirits-event+xml
+application/srgs gram
+application/srgs+xml grxml
+application/ssml+xml ssml
+application/timestamp-query
+application/timestamp-reply
+application/tve-trigger
+application/ulpfec
+application/vemmi
+application/vividence.scriptfile
+application/vnd.3gpp.bsf+xml
+application/vnd.3gpp.pic-bw-large plb
+application/vnd.3gpp.pic-bw-small psb
+application/vnd.3gpp.pic-bw-var pvb
+application/vnd.3gpp.sms
+application/vnd.3gpp2.bcmcsinfo+xml
+application/vnd.3gpp2.sms
+application/vnd.3gpp2.tcap tcap
+application/vnd.3m.post-it-notes pwn
+application/vnd.accpac.simply.aso aso
+application/vnd.accpac.simply.imp imp
+application/vnd.acucobol acu
+application/vnd.acucorp atc acutc
+application/vnd.adobe.xdp+xml xdp
+application/vnd.adobe.xfdf xfdf
+application/vnd.aether.imp
+application/vnd.americandynamics.acc acc
+application/vnd.amiga.ami ami
+application/vnd.anser-web-certificate-issue-initiation cii
+application/vnd.anser-web-funds-transfer-initiation fti
+application/vnd.antix.game-component atx
+application/vnd.apple.installer+xml mpkg
+application/vnd.arastra.swi swi
+application/vnd.audiograph aep
+application/vnd.autopackage
+application/vnd.avistar+xml
+application/vnd.blueice.multipass mpm
+application/vnd.bmi bmi
+application/vnd.businessobjects rep
+application/vnd.cab-jscript
+application/vnd.canon-cpdl
+application/vnd.canon-lips
+application/vnd.cendio.thinlinc.clientconf
+application/vnd.chemdraw+xml cdxml
+application/vnd.chipnuts.karaoke-mmd mmd
+application/vnd.cinderella cdy
+application/vnd.cirpack.isdn-ext
+application/vnd.claymore cla
+application/vnd.clonk.c4group c4g c4d c4f c4p c4u
+application/vnd.commerce-battelle
+application/vnd.commonspace csp cst
+application/vnd.contact.cmsg cdbcmsg
+application/vnd.cosmocaller cmc
+application/vnd.crick.clicker clkx
+application/vnd.crick.clicker.keyboard clkk
+application/vnd.crick.clicker.palette clkp
+application/vnd.crick.clicker.template clkt
+application/vnd.crick.clicker.wordbank clkw
+application/vnd.criticaltools.wbs+xml wbs
+application/vnd.ctc-posml pml
+application/vnd.ctct.ws+xml
+application/vnd.cups-pdf
+application/vnd.cups-postscript
+application/vnd.cups-ppd ppd
+application/vnd.cups-raster
+application/vnd.cups-raw
+application/vnd.curl curl
+application/vnd.cybank
+application/vnd.data-vision.rdz rdz
+application/vnd.denovo.fcselayout-link fe_launch
+application/vnd.dna dna
+application/vnd.dolby.mlp mlp
+application/vnd.dpgraph dpg
+application/vnd.dreamfactory dfac
+application/vnd.dvb.esgcontainer
+application/vnd.dvb.ipdcesgaccess
+application/vnd.dvb.iptv.alfec-base
+application/vnd.dvb.iptv.alfec-enhancement
+application/vnd.dxr
+application/vnd.ecdis-update
+application/vnd.ecowin.chart mag
+application/vnd.ecowin.filerequest
+application/vnd.ecowin.fileupdate
+application/vnd.ecowin.series
+application/vnd.ecowin.seriesrequest
+application/vnd.ecowin.seriesupdate
+application/vnd.enliven nml
+application/vnd.epson.esf esf
+application/vnd.epson.msf msf
+application/vnd.epson.quickanime qam
+application/vnd.epson.salt slt
+application/vnd.epson.ssf ssf
+application/vnd.ericsson.quickcall
+application/vnd.eszigno3+xml es3 et3
+application/vnd.eudora.data
+application/vnd.ezpix-album ez2
+application/vnd.ezpix-package ez3
+application/vnd.fdf fdf
+application/vnd.ffsns
+application/vnd.fints
+application/vnd.flographit gph
+application/vnd.fluxtime.clip ftc
+application/vnd.font-fontforge-sfd
+application/vnd.framemaker fm frame maker
+application/vnd.frogans.fnc fnc
+application/vnd.frogans.ltf ltf
+application/vnd.fsc.weblaunch fsc
+application/vnd.fujitsu.oasys oas
+application/vnd.fujitsu.oasys2 oa2
+application/vnd.fujitsu.oasys3 oa3
+application/vnd.fujitsu.oasysgp fg5
+application/vnd.fujitsu.oasysprs bh2
+application/vnd.fujixerox.art-ex
+application/vnd.fujixerox.art4
+application/vnd.fujixerox.hbpl
+application/vnd.fujixerox.ddd ddd
+application/vnd.fujixerox.docuworks xdw
+application/vnd.fujixerox.docuworks.binder xbd
+application/vnd.fut-misnet
+application/vnd.fuzzysheet fzs
+application/vnd.genomatix.tuxedo txd
+application/vnd.gmx gmx
+application/vnd.google-earth.kml+xml kml
+application/vnd.google-earth.kmz kmz
+application/vnd.grafeq gqf gqs
+application/vnd.gridmp
+application/vnd.groove-account gac
+application/vnd.groove-help ghf
+application/vnd.groove-identity-message gim
+application/vnd.groove-injector grv
+application/vnd.groove-tool-message gtm
+application/vnd.groove-tool-template tpl
+application/vnd.groove-vcard vcg
+application/vnd.handheld-entertainment+xml zmm
+application/vnd.hbci hbci
+application/vnd.hcl-bireports
+application/vnd.hhe.lesson-player les
+application/vnd.hp-hpgl hpgl
+application/vnd.hp-hpid hpid
+application/vnd.hp-hps hps
+application/vnd.hp-jlyt jlt
+application/vnd.hp-pcl pcl
+application/vnd.hp-pclxl pclxl
+application/vnd.httphone
+application/vnd.hydrostatix.sof-data sfd-hdstx
+application/vnd.hzn-3d-crossword x3d
+application/vnd.ibm.afplinedata
+application/vnd.ibm.electronic-media
+application/vnd.ibm.minipay mpy
+application/vnd.ibm.modcap afp listafp list3820
+application/vnd.ibm.rights-management irm
+application/vnd.ibm.secure-container sc
+application/vnd.iccprofile icc icm
+application/vnd.igloader igl
+application/vnd.immervision-ivp ivp
+application/vnd.immervision-ivu ivu
+application/vnd.informedcontrol.rms+xml
+application/vnd.intercon.formnet xpw xpx
+application/vnd.intertrust.digibox
+application/vnd.intertrust.nncp
+application/vnd.intu.qbo qbo
+application/vnd.intu.qfx qfx
+application/vnd.iptc.g2.conceptitem+xml
+application/vnd.iptc.g2.knowledgeitem+xml
+application/vnd.iptc.g2.newsitem+xml
+application/vnd.iptc.g2.packageitem+xml
+application/vnd.ipunplugged.rcprofile rcprofile
+application/vnd.irepository.package+xml irp
+application/vnd.is-xpr xpr
+application/vnd.jam jam
+application/vnd.japannet-directory-service
+application/vnd.japannet-jpnstore-wakeup
+application/vnd.japannet-payment-wakeup
+application/vnd.japannet-registration
+application/vnd.japannet-registration-wakeup
+application/vnd.japannet-setstore-wakeup
+application/vnd.japannet-verification
+application/vnd.japannet-verification-wakeup
+application/vnd.jcp.javame.midlet-rms rms
+application/vnd.jisp jisp
+application/vnd.joost.joda-archive joda
+application/vnd.kahootz ktz ktr
+application/vnd.kde.karbon karbon
+application/vnd.kde.kchart chrt
+application/vnd.kde.kformula kfo
+application/vnd.kde.kivio flw
+application/vnd.kde.kontour kon
+application/vnd.kde.kpresenter kpr kpt
+application/vnd.kde.kspread ksp
+application/vnd.kde.kword kwd kwt
+application/vnd.kenameaapp htke
+application/vnd.kidspiration kia
+application/vnd.kinar kne knp
+application/vnd.koan skp skd skt skm
+application/vnd.kodak-descriptor sse
+application/vnd.liberty-request+xml
+application/vnd.llamagraphics.life-balance.desktop lbd
+application/vnd.llamagraphics.life-balance.exchange+xml lbe
+application/vnd.lotus-1-2-3 123
+application/vnd.lotus-approach apr
+application/vnd.lotus-freelance pre
+application/vnd.lotus-notes nsf
+application/vnd.lotus-organizer org
+application/vnd.lotus-screencam scm
+application/vnd.lotus-wordpro lwp
+application/vnd.macports.portpkg portpkg
+application/vnd.marlin.drm.actiontoken+xml
+application/vnd.marlin.drm.conftoken+xml
+application/vnd.marlin.drm.license+xml
+application/vnd.marlin.drm.mdcf
+application/vnd.mcd mcd
+application/vnd.medcalcdata mc1
+application/vnd.mediastation.cdkey cdkey
+application/vnd.meridian-slingshot
+application/vnd.mfer mwf
+application/vnd.mfmp mfm
+application/vnd.micrografx.flo flo
+application/vnd.micrografx.igx igx
+application/vnd.mif mif
+application/vnd.minisoft-hp3000-save
+application/vnd.mitsubishi.misty-guard.trustweb
+application/vnd.mobius.daf daf
+application/vnd.mobius.dis dis
+application/vnd.mobius.mbk mbk
+application/vnd.mobius.mqy mqy
+application/vnd.mobius.msl msl
+application/vnd.mobius.plc plc
+application/vnd.mobius.txf txf
+application/vnd.mophun.application mpn
+application/vnd.mophun.certificate mpc
+application/vnd.motorola.flexsuite
+application/vnd.motorola.flexsuite.adsi
+application/vnd.motorola.flexsuite.fis
+application/vnd.motorola.flexsuite.gotap
+application/vnd.motorola.flexsuite.kmr
+application/vnd.motorola.flexsuite.ttc
+application/vnd.motorola.flexsuite.wem
+application/vnd.motorola.iprm
+application/vnd.mozilla.xul+xml xul
+application/vnd.ms-artgalry cil
+application/vnd.ms-asf asf
+application/vnd.ms-cab-compressed cab
+application/vnd.ms-excel xls xlm xla xlc xlt xlw
+application/vnd.ms-fontobject eot
+application/vnd.ms-htmlhelp chm
+application/vnd.ms-ims ims
+application/vnd.ms-lrm lrm
+application/vnd.ms-playready.initiator+xml
+application/vnd.ms-powerpoint ppt pps pot
+application/vnd.ms-project mpp mpt
+application/vnd.ms-tnef
+application/vnd.ms-wmdrm.lic-chlg-req
+application/vnd.ms-wmdrm.lic-resp
+application/vnd.ms-wmdrm.meter-chlg-req
+application/vnd.ms-wmdrm.meter-resp
+application/vnd.ms-works wps wks wcm wdb
+application/vnd.ms-wpl wpl
+application/vnd.ms-xpsdocument xps
+application/vnd.mseq mseq
+application/vnd.msign
+application/vnd.multiad.creator
+application/vnd.multiad.creator.cif
+application/vnd.music-niff
+application/vnd.musician mus
+application/vnd.muvee.style msty
+application/vnd.ncd.control
+application/vnd.ncd.reference
+application/vnd.nervana
+application/vnd.netfpx
+application/vnd.neurolanguage.nlu nlu
+application/vnd.noblenet-directory nnd
+application/vnd.noblenet-sealer nns
+application/vnd.noblenet-web nnw
+application/vnd.nokia.catalogs
+application/vnd.nokia.conml+wbxml
+application/vnd.nokia.conml+xml
+application/vnd.nokia.isds-radio-presets
+application/vnd.nokia.iptv.config+xml
+application/vnd.nokia.landmark+wbxml
+application/vnd.nokia.landmark+xml
+application/vnd.nokia.landmarkcollection+xml
+application/vnd.nokia.n-gage.ac+xml
+application/vnd.nokia.n-gage.data ngdat
+application/vnd.nokia.n-gage.symbian.install n-gage
+application/vnd.nokia.ncd
+application/vnd.nokia.pcd+wbxml
+application/vnd.nokia.pcd+xml
+application/vnd.nokia.radio-preset rpst
+application/vnd.nokia.radio-presets rpss
+application/vnd.novadigm.edm edm
+application/vnd.novadigm.edx edx
+application/vnd.novadigm.ext ext
+application/vnd.oasis.opendocument.chart odc
+application/vnd.oasis.opendocument.chart-template otc
+application/vnd.oasis.opendocument.formula odf
+application/vnd.oasis.opendocument.formula-template otf
+application/vnd.oasis.opendocument.graphics odg
+application/vnd.oasis.opendocument.graphics-template otg
+application/vnd.oasis.opendocument.image odi
+application/vnd.oasis.opendocument.image-template oti
+application/vnd.oasis.opendocument.presentation odp
+application/vnd.oasis.opendocument.presentation-template otp
+application/vnd.oasis.opendocument.spreadsheet ods
+application/vnd.oasis.opendocument.spreadsheet-template ots
+application/vnd.oasis.opendocument.text odt
+application/vnd.oasis.opendocument.text-master otm
+application/vnd.oasis.opendocument.text-template ott
+application/vnd.oasis.opendocument.text-web oth
+application/vnd.obn
+application/vnd.olpc-sugar xo
+application/vnd.oma-scws-config
+application/vnd.oma-scws-http-request
+application/vnd.oma-scws-http-response
+application/vnd.oma.bcast.associated-procedure-parameter+xml
+application/vnd.oma.bcast.drm-trigger+xml
+application/vnd.oma.bcast.imd+xml
+application/vnd.oma.bcast.ltkm
+application/vnd.oma.bcast.notification+xml
+application/vnd.oma.bcast.provisioningtrigger
+application/vnd.oma.bcast.sgboot
+application/vnd.oma.bcast.sgdd+xml
+application/vnd.oma.bcast.sgdu
+application/vnd.oma.bcast.simple-symbol-container
+application/vnd.oma.bcast.smartcard-trigger+xml
+application/vnd.oma.bcast.sprov+xml
+application/vnd.oma.bcast.stkm
+application/vnd.oma.dcd
+application/vnd.oma.dcdc
+application/vnd.oma.dd2+xml dd2
+application/vnd.oma.drm.risd+xml
+application/vnd.oma.group-usage-list+xml
+application/vnd.oma.poc.detailed-progress-report+xml
+application/vnd.oma.poc.final-report+xml
+application/vnd.oma.poc.groups+xml
+application/vnd.oma.poc.invocation-descriptor+xml
+application/vnd.oma.poc.optimized-progress-report+xml
+application/vnd.oma.xcap-directory+xml
+application/vnd.omads-email+xml
+application/vnd.omads-file+xml
+application/vnd.omads-folder+xml
+application/vnd.omaloc-supl-init
+application/vnd.openofficeorg.extension oxt
+application/vnd.osa.netdeploy
+application/vnd.osgi.dp dp
+application/vnd.otps.ct-kip+xml
+application/vnd.palm prc pdb pqa oprc
+application/vnd.paos.xml
+application/vnd.pg.format str
+application/vnd.pg.osasli ei6
+application/vnd.piaccess.application-licence
+application/vnd.picsel efif
+application/vnd.poc.group-advertisement+xml
+application/vnd.pocketlearn plf
+application/vnd.powerbuilder6 pbd
+application/vnd.powerbuilder6-s
+application/vnd.powerbuilder7
+application/vnd.powerbuilder7-s
+application/vnd.powerbuilder75
+application/vnd.powerbuilder75-s
+application/vnd.preminet
+application/vnd.previewsystems.box box
+application/vnd.proteus.magazine mgz
+application/vnd.publishare-delta-tree qps
+application/vnd.pvi.ptid1 ptid
+application/vnd.pwg-multiplexed
+application/vnd.pwg-xhtml-print+xml
+application/vnd.qualcomm.brew-app-res
+application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb
+application/vnd.rapid
+application/vnd.recordare.musicxml mxl
+application/vnd.recordare.musicxml+xml
+application/vnd.renlearn.rlprint
+application/vnd.rn-realmedia rm
+application/vnd.route66.link66+xml link66
+application/vnd.ruckus.download
+application/vnd.s3sms
+application/vnd.sbm.mid2
+application/vnd.scribus
+application/vnd.sealed.3df
+application/vnd.sealed.csf
+application/vnd.sealed.doc
+application/vnd.sealed.eml
+application/vnd.sealed.mht
+application/vnd.sealed.net
+application/vnd.sealed.ppt
+application/vnd.sealed.tiff
+application/vnd.sealed.xls
+application/vnd.sealedmedia.softseal.html
+application/vnd.sealedmedia.softseal.pdf
+application/vnd.seemail see
+application/vnd.sema sema
+application/vnd.semd semd
+application/vnd.semf semf
+application/vnd.shana.informed.formdata ifm
+application/vnd.shana.informed.formtemplate itp
+application/vnd.shana.informed.interchange iif
+application/vnd.shana.informed.package ipk
+application/vnd.simtech-mindmapper twd twds
+application/vnd.smaf mmf
+application/vnd.software602.filler.form+xml
+application/vnd.software602.filler.form-xml-zip
+application/vnd.solent.sdkm+xml sdkm sdkd
+application/vnd.spotfire.dxp dxp
+application/vnd.spotfire.sfs sfs
+application/vnd.sss-cod
+application/vnd.sss-dtf
+application/vnd.sss-ntf
+application/vnd.street-stream
+application/vnd.sun.wadl+xml
+application/vnd.sus-calendar sus susp
+application/vnd.svd svd
+application/vnd.swiftview-ics
+application/vnd.syncml+xml xsm
+application/vnd.syncml.dm+wbxml bdm
+application/vnd.syncml.dm+xml xdm
+application/vnd.syncml.ds.notification
+application/vnd.tao.intent-module-archive tao
+application/vnd.tmobile-livetv tmo
+application/vnd.trid.tpt tpt
+application/vnd.triscape.mxs mxs
+application/vnd.trueapp tra
+application/vnd.truedoc
+application/vnd.ufdl ufd ufdl
+application/vnd.uiq.theme utz
+application/vnd.umajin umj
+application/vnd.unity unityweb
+application/vnd.uoml+xml uoml
+application/vnd.uplanet.alert
+application/vnd.uplanet.alert-wbxml
+application/vnd.uplanet.bearer-choice
+application/vnd.uplanet.bearer-choice-wbxml
+application/vnd.uplanet.cacheop
+application/vnd.uplanet.cacheop-wbxml
+application/vnd.uplanet.channel
+application/vnd.uplanet.channel-wbxml
+application/vnd.uplanet.list
+application/vnd.uplanet.list-wbxml
+application/vnd.uplanet.listcmd
+application/vnd.uplanet.listcmd-wbxml
+application/vnd.uplanet.signal
+application/vnd.vcx vcx
+application/vnd.vd-study
+application/vnd.vectorworks
+application/vnd.vidsoft.vidconference
+application/vnd.visio vsd vst vss vsw
+application/vnd.visionary vis
+application/vnd.vividence.scriptfile
+application/vnd.vsf vsf
+application/vnd.wap.sic
+application/vnd.wap.slc
+application/vnd.wap.wbxml wbxml
+application/vnd.wap.wmlc wmlc
+application/vnd.wap.wmlscriptc wmlsc
+application/vnd.webturbo wtb
+application/vnd.wfa.wsc
+application/vnd.wmc
+application/vnd.wmf.bootstrap
+application/vnd.wordperfect wpd
+application/vnd.wqd wqd
+application/vnd.wrq-hp3000-labelled
+application/vnd.wt.stf stf
+application/vnd.wv.csp+wbxml
+application/vnd.wv.csp+xml
+application/vnd.wv.ssp+xml
+application/vnd.xara xar
+application/vnd.xfdl xfdl
+application/vnd.xmi+xml
+application/vnd.xmpie.cpkg
+application/vnd.xmpie.dpkg
+application/vnd.xmpie.plan
+application/vnd.xmpie.ppkg
+application/vnd.xmpie.xlim
+application/vnd.yamaha.hv-dic hvd
+application/vnd.yamaha.hv-script hvs
+application/vnd.yamaha.hv-voice hvp
+application/vnd.yamaha.smaf-audio saf
+application/vnd.yamaha.smaf-phrase spf
+application/vnd.yellowriver-custom-menu cmp
+application/vnd.zzazz.deck+xml zaz
+application/voicexml+xml vxml
+application/watcherinfo+xml
+application/whoispp-query
+application/whoispp-response
+application/winhlp hlp
+application/wita
+application/wordperfect5.1
+application/wsdl+xml wsdl
+application/wspolicy+xml wspolicy
+application/x-ace-compressed ace
+application/x-bcpio bcpio
+application/x-bittorrent torrent
+application/x-bzip bz
+application/x-bzip2 bz2 boz
+application/x-cdlink vcd
+application/x-chat chat
+application/x-chess-pgn pgn
+application/x-compress
+application/x-cpio cpio
+application/x-csh csh
+application/x-director dcr dir dxr fgd
+application/x-dvi dvi
+application/x-futuresplash spl
+application/x-gtar gtar
+application/x-gzip
+application/x-hdf hdf
+application/x-latex latex
+application/x-ms-wmd wmd
+application/x-ms-wmz wmz
+application/x-msaccess mdb
+application/x-msbinder obd
+application/x-mscardfile crd
+application/x-msclip clp
+application/x-msdownload exe dll com bat msi
+application/x-msmediaview mvb m13 m14
+application/x-msmetafile wmf
+application/x-msmoney mny
+application/x-mspublisher pub
+application/x-msschedule scd
+application/x-msterminal trm
+application/x-mswrite wri
+application/x-netcdf nc cdf
+application/x-pkcs12 p12 pfx
+application/x-pkcs7-certificates p7b spc
+application/x-pkcs7-certreqresp p7r
+application/x-rar-compressed rar
+application/x-sh sh
+application/x-shar shar
+application/x-shockwave-flash swf
+application/x-stuffit sit
+application/x-stuffitx sitx
+application/x-sv4cpio sv4cpio
+application/x-sv4crc sv4crc
+application/x-tar tar
+application/x-tcl tcl
+application/x-tex tex
+application/x-texinfo texinfo texi
+application/x-ustar ustar
+application/x-wais-source src
+application/x-x509-ca-cert der crt
+application/x400-bp
+application/xcap-att+xml
+application/xcap-caps+xml
+application/xcap-el+xml
+application/xcap-error+xml
+application/xcap-ns+xml
+application/xenc+xml xenc
+application/xhtml+xml xhtml xht
+application/xml xml xsl
+application/xml-dtd dtd
+application/xml-external-parsed-entity
+application/xmpp+xml
+application/xop+xml xop
+application/xslt+xml xslt
+application/xspf+xml xspf
+application/xv+xml mxml xhvml xvml xvm
+application/zip zip
+audio/32kadpcm
+audio/3gpp
+audio/3gpp2
+audio/ac3
+audio/amr
+audio/amr-wb
+audio/amr-wb+
+audio/asc
+audio/basic au snd
+audio/bv16
+audio/bv32
+audio/clearmode
+audio/cn
+audio/dat12
+audio/dls
+audio/dsr-es201108
+audio/dsr-es202050
+audio/dsr-es202211
+audio/dsr-es202212
+audio/dvi4
+audio/eac3
+audio/evrc
+audio/evrc-qcp
+audio/evrc0
+audio/evrc1
+audio/evrcb
+audio/evrcb0
+audio/evrcb1
+audio/evrcwb
+audio/evrcwb0
+audio/evrcwb1
+audio/g722
+audio/g7221
+audio/g723
+audio/g726-16
+audio/g726-24
+audio/g726-32
+audio/g726-40
+audio/g728
+audio/g729
+audio/g7291
+audio/g729d
+audio/g729e
+audio/gsm
+audio/gsm-efr
+audio/ilbc
+audio/l16
+audio/l20
+audio/l24
+audio/l8
+audio/lpc
+audio/midi mid midi kar rmi
+audio/mobile-xmf
+audio/mp4 mp4a
+audio/mp4a-latm
+audio/mpa
+audio/mpa-robust
+audio/mpeg mpga mp2 mp2a mp3 m2a m3a
+audio/mpeg4-generic
+audio/ogg oga ogg spx
+audio/parityfec
+audio/pcma
+audio/pcmu
+audio/prs.sid
+audio/qcelp
+audio/red
+audio/rtp-enc-aescm128
+audio/rtp-midi
+audio/rtx
+audio/smv
+audio/smv0
+audio/smv-qcp
+audio/sp-midi
+audio/t140c
+audio/t38
+audio/telephone-event
+audio/tone
+audio/ulpfec
+audio/vdvi
+audio/vmr-wb
+audio/vnd.3gpp.iufp
+audio/vnd.4sb
+audio/vnd.audiokoz
+audio/vnd.celp
+audio/vnd.cisco.nse
+audio/vnd.cmles.radio-events
+audio/vnd.cns.anp1
+audio/vnd.cns.inf1
+audio/vnd.digital-winds eol
+audio/vnd.dlna.adts
+audio/vnd.dolby.mlp
+audio/vnd.dts dts
+audio/vnd.dts.hd dtshd
+audio/vnd.everad.plj
+audio/vnd.hns.audio
+audio/vnd.lucent.voice lvp
+audio/vnd.ms-playready.media.pya pya
+audio/vnd.nokia.mobile-xmf
+audio/vnd.nortel.vbk
+audio/vnd.nuera.ecelp4800 ecelp4800
+audio/vnd.nuera.ecelp7470 ecelp7470
+audio/vnd.nuera.ecelp9600 ecelp9600
+audio/vnd.octel.sbc
+audio/vnd.qcelp
+audio/vnd.rhetorex.32kadpcm
+audio/vnd.sealedmedia.softseal.mpeg
+audio/vnd.vmx.cvsd
+audio/vorbis
+audio/vorbis-config
+audio/wav wav
+audio/x-aiff aif aiff aifc
+audio/x-mpegurl m3u
+audio/x-ms-wax wax
+audio/x-ms-wma wma
+audio/x-pn-realaudio ram ra
+audio/x-pn-realaudio-plugin rmp
+audio/x-wav wav
+chemical/x-cdx cdx
+chemical/x-cif cif
+chemical/x-cmdf cmdf
+chemical/x-cml cml
+chemical/x-csml csml
+chemical/x-pdb pdb
+chemical/x-xyz xyz
+image/bmp bmp
+image/cgm cgm
+image/fits
+image/g3fax g3
+image/gif gif
+image/ief ief
+image/jp2
+image/jpeg jpeg jpg jpe
+image/jpm
+image/jpx
+image/naplps
+image/png png
+image/prs.btif btif
+image/prs.pti
+image/svg+xml svg svgz
+image/t38
+image/tiff tiff tif
+image/tiff-fx
+image/vnd.adobe.photoshop psd
+image/vnd.cns.inf2
+image/vnd.djvu djvu djv
+image/vnd.dwg dwg
+image/vnd.dxf dxf
+image/vnd.fastbidsheet fbs
+image/vnd.fpx fpx
+image/vnd.fst fst
+image/vnd.fujixerox.edmics-mmr mmr
+image/vnd.fujixerox.edmics-rlc rlc
+image/vnd.globalgraphics.pgb
+image/vnd.microsoft.icon
+image/vnd.mix
+image/vnd.ms-modi mdi
+image/vnd.net-fpx npx
+image/vnd.sealed.png
+image/vnd.sealedmedia.softseal.gif
+image/vnd.sealedmedia.softseal.jpg
+image/vnd.svf
+image/vnd.wap.wbmp wbmp
+image/vnd.xiff xif
+image/x-cmu-raster ras
+image/x-cmx cmx
+image/x-icon ico
+image/x-pcx pcx
+image/x-pict pic pct
+image/x-portable-anymap pnm
+image/x-portable-bitmap pbm
+image/x-portable-graymap pgm
+image/x-portable-pixmap ppm
+image/x-rgb rgb
+image/x-xbitmap xbm
+image/x-xpixmap xpm
+image/x-xwindowdump xwd
+message/cpim
+message/delivery-status
+message/disposition-notification
+message/external-body
+message/global
+message/global-delivery-status
+message/global-disposition-notification
+message/global-headers
+message/http
+message/news
+message/partial
+message/rfc822 eml mime
+message/s-http
+message/sip
+message/sipfrag
+message/tracking-status
+message/vnd.si.simp
+model/iges igs iges
+model/mesh msh mesh silo
+model/vnd.dwf dwf
+model/vnd.flatland.3dml
+model/vnd.gdl gdl
+model/vnd.gs.gdl
+model/vnd.gtw gtw
+model/vnd.moml+xml
+model/vnd.mts mts
+model/vnd.parasolid.transmit.binary
+model/vnd.parasolid.transmit.text
+model/vnd.vtu vtu
+model/vrml wrl vrml
+multipart/alternative
+multipart/appledouble
+multipart/byteranges
+multipart/digest
+multipart/encrypted
+multipart/form-data
+multipart/header-set
+multipart/mixed
+multipart/parallel
+multipart/related
+multipart/report
+multipart/signed
+multipart/voice-message
+text/calendar ics ifb
+text/css css
+text/csv csv
+text/directory
+text/dns
+text/enriched
+text/html html htm
+text/parityfec
+text/plain txt text conf def list log in
+text/prs.fallenstein.rst
+text/prs.lines.tag dsc
+text/red
+text/rfc822-headers
+text/richtext rtx
+text/rtf
+text/rtp-enc-aescm128
+text/rtx
+text/sgml sgml sgm
+text/t140
+text/tab-separated-values tsv
+text/troff t tr roff man me ms
+text/ulpfec
+text/uri-list uri uris urls
+text/vnd.abc
+text/vnd.curl
+text/vnd.dmclientscript
+text/vnd.esmertec.theme-descriptor
+text/vnd.fly fly
+text/vnd.fmi.flexstor flx
+text/vnd.graphviz gv
+text/vnd.in3d.3dml 3dml
+text/vnd.in3d.spot spot
+text/vnd.iptc.newsml
+text/vnd.iptc.nitf
+text/vnd.latex-z
+text/vnd.motorola.reflex
+text/vnd.ms-mediapackage
+text/vnd.net2phone.commcenter.command
+text/vnd.si.uricatalogue
+text/vnd.sun.j2me.app-descriptor jad
+text/vnd.trolltech.linguist
+text/vnd.wap.si
+text/vnd.wap.sl
+text/vnd.wap.wml wml
+text/vnd.wap.wmlscript wmls
+text/x-asm s asm
+text/x-c c cc cxx cpp h hh dic
+text/x-fortran f for f77 f90
+text/x-pascal p pas
+text/x-java-source java
+text/x-setext etx
+text/x-uuencode uu
+text/x-vcalendar vcs
+text/x-vcard vcf
+text/xml
+text/xml-external-parsed-entity
+video/3gpp 3gp
+video/3gpp-tt
+video/3gpp2 3g2
+video/bmpeg
+video/bt656
+video/celb
+video/dv
+video/h261 h261
+video/h263 h263
+video/h263-1998
+video/h263-2000
+video/h264 h264
+video/jpeg jpgv
+video/jpeg2000
+video/jpm jpm jpgm
+video/mj2 mj2 mjp2
+video/mp1s
+video/mp2p
+video/mp2t
+video/mp4 mp4 mp4v mpg4
+video/mp4v-es
+video/mpeg mpeg mpg mpe m1v m2v
+video/mpeg4-generic
+video/mpv
+video/nv
+video/ogg ogv
+video/parityfec
+video/pointer
+video/quicktime qt mov
+video/raw
+video/rtp-enc-aescm128
+video/rtx
+video/smpte292m
+video/ulpfec
+video/vc1
+video/vnd.cctv
+video/vnd.dlna.mpeg-tts
+video/vnd.fvt fvt
+video/vnd.hns.video
+video/vnd.iptvforum.1dparityfec-1010
+video/vnd.iptvforum.1dparityfec-2005
+video/vnd.iptvforum.2dparityfec-1010
+video/vnd.iptvforum.2dparityfec-2005
+video/vnd.iptvforum.ttsavc
+video/vnd.iptvforum.ttsmpeg2
+video/vnd.motorola.video
+video/vnd.motorola.videop
+video/vnd.mpegurl mxu m4u
+video/vnd.ms-playready.media.pyv pyv
+video/vnd.nokia.interleaved-multimedia
+video/vnd.nokia.videovoip
+video/vnd.objectvideo
+video/vnd.sealed.mpeg1
+video/vnd.sealed.mpeg4
+video/vnd.sealed.swf
+video/vnd.sealedmedia.softseal.mov
+video/vnd.vivo viv
+video/x-fli fli
+video/x-ms-asf asf asx
+video/x-ms-wm wm
+video/x-ms-wmv wmv
+video/x-ms-wmx wmx
+video/x-ms-wvx wvx
+video/x-msvideo avi
+video/x-sgi-movie movie
+x-conference/x-cooltalk ice
diff --git a/Master/tlpkg/tlperl.straw/lib/List/Util.pm b/Master/tlpkg/tlperl.straw/lib/List/Util.pm
new file mode 100755
index 00000000000..2b51a69d79b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/List/Util.pm
@@ -0,0 +1,233 @@
+# List::Util.pm
+#
+# Copyright (c) 1997-2009 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+# This module is normally only loaded if the XS module is not available
+
+package List::Util;
+
+use strict;
+use vars qw(@ISA @EXPORT_OK $VERSION $XS_VERSION $TESTING_PERL_ONLY);
+require Exporter;
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(first min max minstr maxstr reduce sum shuffle);
+$VERSION = "1.22";
+$XS_VERSION = $VERSION;
+$VERSION = eval $VERSION;
+
+eval {
+ # PERL_DL_NONLAZY must be false, or any errors in loading will just
+ # cause the perl code to be tested
+ local $ENV{PERL_DL_NONLAZY} = 0 if $ENV{PERL_DL_NONLAZY};
+ eval {
+ require XSLoader;
+ XSLoader::load('List::Util', $XS_VERSION);
+ 1;
+ } or do {
+ require DynaLoader;
+ local @ISA = qw(DynaLoader);
+ bootstrap List::Util $XS_VERSION;
+ };
+} unless $TESTING_PERL_ONLY;
+
+
+if (!defined &sum) {
+ require List::Util::PP;
+ List::Util::PP->import;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+List::Util - A selection of general-utility list subroutines
+
+=head1 SYNOPSIS
+
+ use List::Util qw(first max maxstr min minstr reduce shuffle sum);
+
+=head1 DESCRIPTION
+
+C<List::Util> contains a selection of subroutines that people have
+expressed would be nice to have in the perl core, but the usage would
+not really be high enough to warrant the use of a keyword, and the size
+so small such that being individual extensions would be wasteful.
+
+By default C<List::Util> does not export any subroutines. The
+subroutines defined are
+
+=over 4
+
+=item first BLOCK LIST
+
+Similar to C<grep> in that it evaluates BLOCK setting C<$_> to each element
+of LIST in turn. C<first> returns the first element where the result from
+BLOCK is a true value. If BLOCK never returns true or LIST was empty then
+C<undef> is returned.
+
+ $foo = first { defined($_) } @list # first defined value in @list
+ $foo = first { $_ > $value } @list # first value in @list which
+ # is greater than $value
+
+This function could be implemented using C<reduce> like this
+
+ $foo = reduce { defined($a) ? $a : wanted($b) ? $b : undef } undef, @list
+
+for example wanted() could be defined() which would return the first
+defined value in @list
+
+=item max LIST
+
+Returns the entry in the list with the highest numerical value. If the
+list is empty then C<undef> is returned.
+
+ $foo = max 1..10 # 10
+ $foo = max 3,9,12 # 12
+ $foo = max @bar, @baz # whatever
+
+This function could be implemented using C<reduce> like this
+
+ $foo = reduce { $a > $b ? $a : $b } 1..10
+
+=item maxstr LIST
+
+Similar to C<max>, but treats all the entries in the list as strings
+and returns the highest string as defined by the C<gt> operator.
+If the list is empty then C<undef> is returned.
+
+ $foo = maxstr 'A'..'Z' # 'Z'
+ $foo = maxstr "hello","world" # "world"
+ $foo = maxstr @bar, @baz # whatever
+
+This function could be implemented using C<reduce> like this
+
+ $foo = reduce { $a gt $b ? $a : $b } 'A'..'Z'
+
+=item min LIST
+
+Similar to C<max> but returns the entry in the list with the lowest
+numerical value. If the list is empty then C<undef> is returned.
+
+ $foo = min 1..10 # 1
+ $foo = min 3,9,12 # 3
+ $foo = min @bar, @baz # whatever
+
+This function could be implemented using C<reduce> like this
+
+ $foo = reduce { $a < $b ? $a : $b } 1..10
+
+=item minstr LIST
+
+Similar to C<min>, but treats all the entries in the list as strings
+and returns the lowest string as defined by the C<lt> operator.
+If the list is empty then C<undef> is returned.
+
+ $foo = minstr 'A'..'Z' # 'A'
+ $foo = minstr "hello","world" # "hello"
+ $foo = minstr @bar, @baz # whatever
+
+This function could be implemented using C<reduce> like this
+
+ $foo = reduce { $a lt $b ? $a : $b } 'A'..'Z'
+
+=item reduce BLOCK LIST
+
+Reduces LIST by calling BLOCK, in a scalar context, multiple times,
+setting C<$a> and C<$b> each time. The first call will be with C<$a>
+and C<$b> set to the first two elements of the list, subsequent
+calls will be done by setting C<$a> to the result of the previous
+call and C<$b> to the next element in the list.
+
+Returns the result of the last call to BLOCK. If LIST is empty then
+C<undef> is returned. If LIST only contains one element then that
+element is returned and BLOCK is not executed.
+
+ $foo = reduce { $a < $b ? $a : $b } 1..10 # min
+ $foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz' # minstr
+ $foo = reduce { $a + $b } 1 .. 10 # sum
+ $foo = reduce { $a . $b } @bar # concat
+
+If your algorithm requires that C<reduce> produce an identity value, then
+make sure that you always pass that identity value as the first argument to prevent
+C<undef> being returned
+
+ $foo = reduce { $a + $b } 0, @values; # sum with 0 identity value
+
+=item shuffle LIST
+
+Returns the elements of LIST in a random order
+
+ @cards = shuffle 0..51 # 0..51 in a random order
+
+=item sum LIST
+
+Returns the sum of all the elements in LIST. If LIST is empty then
+C<undef> is returned.
+
+ $foo = sum 1..10 # 55
+ $foo = sum 3,9,12 # 24
+ $foo = sum @bar, @baz # whatever
+
+This function could be implemented using C<reduce> like this
+
+ $foo = reduce { $a + $b } 1..10
+
+If your algorithm requires that C<sum> produce an identity of 0, then
+make sure that you always pass C<0> as the first argument to prevent
+C<undef> being returned
+
+ $foo = sum 0, @values;
+
+=back
+
+=head1 KNOWN BUGS
+
+With perl versions prior to 5.005 there are some cases where reduce
+will return an incorrect result. This will show up as test 7 of
+reduce.t failing.
+
+=head1 SUGGESTED ADDITIONS
+
+The following are additions that have been requested, but I have been reluctant
+to add due to them being very simple to implement in perl
+
+ # One argument is true
+
+ sub any { $_ && return 1 for @_; 0 }
+
+ # All arguments are true
+
+ sub all { $_ || return 0 for @_; 1 }
+
+ # All arguments are false
+
+ sub none { $_ && return 0 for @_; 1 }
+
+ # One argument is false
+
+ sub notall { $_ || return 1 for @_; 0 }
+
+ # How many elements are true
+
+ sub true { scalar grep { $_ } @_ }
+
+ # How many elements are false
+
+ sub false { scalar grep { !$_ } @_ }
+
+=head1 SEE ALSO
+
+L<Scalar::Util>, L<List::MoreUtils>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-2007 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/List/Util/PP.pm b/Master/tlpkg/tlperl.straw/lib/List/Util/PP.pm
new file mode 100755
index 00000000000..425f1c50159
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/List/Util/PP.pm
@@ -0,0 +1,83 @@
+# List::Util::PP.pm
+#
+# Copyright (c) 1997-2009 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package List::Util::PP;
+
+use strict;
+use warnings;
+use vars qw(@ISA @EXPORT $VERSION $a $b);
+require Exporter;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(first min max minstr maxstr reduce sum shuffle);
+$VERSION = "1.22";
+$VERSION = eval $VERSION;
+
+sub reduce (&@) {
+ my $code = shift;
+ require Scalar::Util;
+ my $type = Scalar::Util::reftype($code);
+ unless($type and $type eq 'CODE') {
+ require Carp;
+ Carp::croak("Not a subroutine reference");
+ }
+ no strict 'refs';
+
+ return shift unless @_ > 1;
+
+ use vars qw($a $b);
+
+ my $caller = caller;
+ local(*{$caller."::a"}) = \my $a;
+ local(*{$caller."::b"}) = \my $b;
+
+ $a = shift;
+ foreach (@_) {
+ $b = $_;
+ $a = &{$code}();
+ }
+
+ $a;
+}
+
+sub first (&@) {
+ my $code = shift;
+ require Scalar::Util;
+ my $type = Scalar::Util::reftype($code);
+ unless($type and $type eq 'CODE') {
+ require Carp;
+ Carp::croak("Not a subroutine reference");
+ }
+
+ foreach (@_) {
+ return $_ if &{$code}();
+ }
+
+ undef;
+}
+
+
+sub sum (@) { reduce { $a + $b } @_ }
+
+sub min (@) { reduce { $a < $b ? $a : $b } @_ }
+
+sub max (@) { reduce { $a > $b ? $a : $b } @_ }
+
+sub minstr (@) { reduce { $a lt $b ? $a : $b } @_ }
+
+sub maxstr (@) { reduce { $a gt $b ? $a : $b } @_ }
+
+sub shuffle (@) {
+ my @a=\(@_);
+ my $n;
+ my $i=@_;
+ map {
+ $n = rand($i--);
+ (${$a[$n]}, $a[$n] = $a[$i])[0];
+ } @_;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/List/Util/XS.pm b/Master/tlpkg/tlperl.straw/lib/List/Util/XS.pm
new file mode 100755
index 00000000000..76bf6469c40
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/List/Util/XS.pm
@@ -0,0 +1,45 @@
+package List::Util::XS;
+use strict;
+use vars qw($VERSION);
+use List::Util;
+
+$VERSION = "1.22"; # FIXUP
+$VERSION = eval $VERSION; # FIXUP
+
+sub _VERSION { # FIXUP
+ require Carp;
+ Carp::croak("You need to install Scalar-List-Utils with a C compiler to ensure the XS is compiled")
+ if defined $_[1];
+ $VERSION;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+List::Util::XS - Indicate if List::Util was compiled with a C compiler
+
+=head1 SYNOPSIS
+
+ use List::Util::XS 1.20;
+
+=head1 DESCRIPTION
+
+C<List::Util::XS> can be used as a dependency to ensure List::Util was
+installed using a C compiler and that the XS version is installed.
+
+During installation C<$List::Util::XS::VERSION> will be set to
+C<undef> if the XS was not compiled.
+
+=head1 SEE ALSO
+
+L<Scalar::Util>, L<List::Util>, L<List::MoreUtils>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2008 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Constants.pm b/Master/tlpkg/tlperl.straw/lib/Locale/Constants.pm
new file mode 100755
index 00000000000..d8ef8f7e21a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Constants.pm
@@ -0,0 +1,31 @@
+#
+# Locale::Constants - defined constants for identifying codesets
+#
+# $Id: Constants.pm,v 2.7 2004/06/10 21:19:34 neilb Exp $
+#
+
+package Locale::Constants;
+use strict;
+
+require Exporter;
+
+#-----------------------------------------------------------------------
+# Public Global Variables
+#-----------------------------------------------------------------------
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION = sprintf("%d.%02d", q$Revision: 2.7 $ =~ /(\d+)\.(\d+)/);
+@ISA = qw(Exporter);
+@EXPORT = qw(LOCALE_CODE_ALPHA_2 LOCALE_CODE_ALPHA_3 LOCALE_CODE_NUMERIC
+ LOCALE_CODE_DEFAULT);
+
+#-----------------------------------------------------------------------
+# Constants
+#-----------------------------------------------------------------------
+use constant LOCALE_CODE_ALPHA_2 => 1;
+use constant LOCALE_CODE_ALPHA_3 => 2;
+use constant LOCALE_CODE_NUMERIC => 3;
+
+use constant LOCALE_CODE_DEFAULT => LOCALE_CODE_ALPHA_2;
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Constants.pod b/Master/tlpkg/tlperl.straw/lib/Locale/Constants.pod
new file mode 100755
index 00000000000..ae42abbec97
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Constants.pod
@@ -0,0 +1,76 @@
+
+=head1 NAME
+
+Locale::Constants - constants for Locale codes
+
+=head1 SYNOPSIS
+
+ use Locale::Constants;
+
+ $codeset = LOCALE_CODE_ALPHA_2;
+
+=head1 DESCRIPTION
+
+B<Locale::Constants> defines symbols which are used in
+the four modules from the Locale-Codes distribution:
+
+ Locale::Language
+ Locale::Country
+ Locale::Currency
+ Locale::Script
+
+B<Note:> at the moment only Locale::Country and Locale::Script
+support more than one code set.
+
+The symbols defined are used to specify which codes you
+want to be used:
+
+ LOCALE_CODE_ALPHA_2
+ LOCALE_CODE_ALPHA_3
+ LOCALE_CODE_NUMERIC
+
+You shouldn't have to C<use> this module directly yourself -
+it is used by the three Locale modules, which in turn export
+the symbols.
+
+=head1 KNOWN BUGS AND LIMITATIONS
+
+None at the moment.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Locale::Language
+
+Codes for identification of languages.
+
+=item Locale::Country
+
+Codes for identification of countries.
+
+=item Locale::Script
+
+Codes for identification of scripts.
+
+=item Locale::Currency
+
+Codes for identification of currencies and funds.
+
+=back
+
+=head1 AUTHOR
+
+Neil Bowers E<lt>neil@bowers.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002-2004, Neil Bowers.
+
+Copyright (C) 2001, Canon Research Centre Europe (CRE).
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Country.pm b/Master/tlpkg/tlperl.straw/lib/Locale/Country.pm
new file mode 100755
index 00000000000..2ecd1305c0d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Country.pm
@@ -0,0 +1,550 @@
+#
+# Locale::Country - ISO codes for country identification (ISO 3166)
+#
+# $Id: Country.pm,v 2.7 2004/06/10 21:19:34 neilb Exp $
+#
+
+package Locale::Country;
+use strict;
+require 5.002;
+
+require Exporter;
+use Carp;
+use Locale::Constants;
+
+
+#-----------------------------------------------------------------------
+# Public Global Variables
+#-----------------------------------------------------------------------
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+$VERSION = sprintf("%d.%02d", q$Revision: 2.7 $ =~ /(\d+)\.(\d+)/);
+@ISA = qw(Exporter);
+@EXPORT = qw(code2country country2code
+ all_country_codes all_country_names
+ country_code2code
+ LOCALE_CODE_ALPHA_2 LOCALE_CODE_ALPHA_3 LOCALE_CODE_NUMERIC);
+
+#-----------------------------------------------------------------------
+# Private Global Variables
+#-----------------------------------------------------------------------
+my $CODES = [];
+my $COUNTRIES = [];
+
+
+#=======================================================================
+#
+# code2country ( CODE [, CODESET ] )
+#
+#=======================================================================
+sub code2country
+{
+ my $code = shift;
+ my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+
+ return undef unless defined $code;
+
+ #-------------------------------------------------------------------
+ # Make sure the code is in the right form before we use it
+ # to look up the corresponding country.
+ # We have to sprintf because the codes are given as 3-digits,
+ # with leading 0's. Eg 052 for Barbados.
+ #-------------------------------------------------------------------
+ if ($codeset == LOCALE_CODE_NUMERIC)
+ {
+ return undef if ($code =~ /\D/);
+ $code = sprintf("%.3d", $code);
+ }
+ else
+ {
+ $code = lc($code);
+ }
+
+ if (exists $CODES->[$codeset]->{$code})
+ {
+ return $CODES->[$codeset]->{$code};
+ }
+ else
+ {
+ #---------------------------------------------------------------
+ # no such country code!
+ #---------------------------------------------------------------
+ return undef;
+ }
+}
+
+
+#=======================================================================
+#
+# country2code ( NAME [, CODESET ] )
+#
+#=======================================================================
+sub country2code
+{
+ my $country = shift;
+ my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+
+ return undef unless defined $country;
+ $country = lc($country);
+ if (exists $COUNTRIES->[$codeset]->{$country})
+ {
+ return $COUNTRIES->[$codeset]->{$country};
+ }
+ else
+ {
+ #---------------------------------------------------------------
+ # no such country!
+ #---------------------------------------------------------------
+ return undef;
+ }
+}
+
+
+#=======================================================================
+#
+# country_code2code ( NAME [, CODESET ] )
+#
+#=======================================================================
+sub country_code2code
+{
+ (@_ == 3) or croak "country_code2code() takes 3 arguments!";
+
+ my $code = shift;
+ my $inset = shift;
+ my $outset = shift;
+ my $outcode;
+ my $country;
+
+
+ return undef if $inset == $outset;
+ $country = code2country($code, $inset);
+ return undef if not defined $country;
+ $outcode = country2code($country, $outset);
+ return $outcode;
+}
+
+
+#=======================================================================
+#
+# all_country_codes ( [ CODESET ] )
+#
+#=======================================================================
+sub all_country_codes
+{
+ my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+ return keys %{ $CODES->[$codeset] };
+}
+
+
+#=======================================================================
+#
+# all_country_names ( [ CODESET ] )
+#
+#=======================================================================
+sub all_country_names
+{
+ my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+ return values %{ $CODES->[$codeset] };
+}
+
+
+#=======================================================================
+#
+# alias_code ( ALIAS => CODE [ , CODESET ] )
+#
+# Add an alias for an existing code. If the CODESET isn't specified,
+# then we use the default (currently the alpha-2 codeset).
+#
+# Locale::Country::alias_code('uk' => 'gb');
+#
+#=======================================================================
+sub alias_code
+{
+ my $alias = shift;
+ my $real = shift;
+ my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+ my $country;
+
+
+ if (not exists $CODES->[$codeset]->{$real})
+ {
+ carp "attempt to alias \"$alias\" to unknown country code \"$real\"\n";
+ return undef;
+ }
+ $country = $CODES->[$codeset]->{$real};
+ $CODES->[$codeset]->{$alias} = $country;
+ $COUNTRIES->[$codeset]->{"\L$country"} = $alias;
+
+ return $alias;
+}
+
+# old name of function for backwards compatibility
+*_alias_code = *alias_code;
+
+
+#=======================================================================
+#
+# rename_country
+#
+# change the official name for a country, eg:
+# gb => 'Great Britain'
+# rather than the standard 'United Kingdom'. The original is retained
+# as an alias, but the new name will be returned if you lookup the
+# name from code.
+#
+#=======================================================================
+sub rename_country
+{
+ my $code = shift;
+ my $new_name = shift;
+ my $codeset = @_ > 0 ? shift : _code2codeset($code);
+ my $country;
+ my $c;
+
+
+ if (not defined $codeset)
+ {
+ carp "rename_country(): unknown country code \"$code\"\n";
+ return 0;
+ }
+
+ $country = $CODES->[$codeset]->{$code};
+
+ foreach my $cset (LOCALE_CODE_ALPHA_2,
+ LOCALE_CODE_ALPHA_3,
+ LOCALE_CODE_NUMERIC)
+ {
+ if ($cset == $codeset)
+ {
+ $c = $code;
+ }
+ else
+ {
+ $c = country_code2code($code, $codeset, $cset);
+ }
+
+ $CODES->[$cset]->{$c} = $new_name;
+ $COUNTRIES->[$cset]->{"\L$new_name"} = $c;
+ }
+
+ return 1;
+}
+
+
+#=======================================================================
+#
+# _code2codeset
+#
+# given a country code in an unknown codeset, return the codeset
+# it is from, or undef.
+#
+#=======================================================================
+sub _code2codeset
+{
+ my $code = shift;
+
+
+ foreach my $codeset (LOCALE_CODE_ALPHA_2, LOCALE_CODE_ALPHA_3,
+ LOCALE_CODE_NUMERIC)
+ {
+ return $codeset if (exists $CODES->[$codeset]->{$code})
+ }
+
+ return undef;
+}
+
+
+#=======================================================================
+#
+# initialisation code - stuff the DATA into the ALPHA2 hash
+#
+#=======================================================================
+{
+ my ($alpha2, $alpha3, $numeric);
+ my ($country, @countries);
+ local $_;
+
+
+ while (<DATA>)
+ {
+ next unless /\S/;
+ chop;
+ ($alpha2, $alpha3, $numeric, @countries) = split(/:/, $_);
+
+ $CODES->[LOCALE_CODE_ALPHA_2]->{$alpha2} = $countries[0];
+ foreach $country (@countries)
+ {
+ $COUNTRIES->[LOCALE_CODE_ALPHA_2]->{"\L$country"} = $alpha2;
+ }
+
+ if ($alpha3)
+ {
+ $CODES->[LOCALE_CODE_ALPHA_3]->{$alpha3} = $countries[0];
+ foreach $country (@countries)
+ {
+ $COUNTRIES->[LOCALE_CODE_ALPHA_3]->{"\L$country"} = $alpha3;
+ }
+ }
+
+ if ($numeric)
+ {
+ $CODES->[LOCALE_CODE_NUMERIC]->{$numeric} = $countries[0];
+ foreach $country (@countries)
+ {
+ $COUNTRIES->[LOCALE_CODE_NUMERIC]->{"\L$country"} = $numeric;
+ }
+ }
+
+ }
+
+ close(DATA);
+}
+
+1;
+
+__DATA__
+ad:and:020:Andorra
+ae:are:784:United Arab Emirates
+af:afg:004:Afghanistan
+ag:atg:028:Antigua and Barbuda
+ai:aia:660:Anguilla
+al:alb:008:Albania
+am:arm:051:Armenia
+an:ant:530:Netherlands Antilles
+ao:ago:024:Angola
+aq:ata:010:Antarctica
+ar:arg:032:Argentina
+as:asm:016:American Samoa
+at:aut:040:Austria
+au:aus:036:Australia
+aw:abw:533:Aruba
+ax:ala:248:Aland Islands
+az:aze:031:Azerbaijan
+ba:bih:070:Bosnia and Herzegovina
+bb:brb:052:Barbados
+bd:bgd:050:Bangladesh
+be:bel:056:Belgium
+bf:bfa:854:Burkina Faso
+bg:bgr:100:Bulgaria
+bh:bhr:048:Bahrain
+bi:bdi:108:Burundi
+bj:ben:204:Benin
+bm:bmu:060:Bermuda
+bn:brn:096:Brunei Darussalam
+bo:bol:068:Bolivia
+br:bra:076:Brazil
+bs:bhs:044:Bahamas
+bt:btn:064:Bhutan
+bv:bvt:074:Bouvet Island
+bw:bwa:072:Botswana
+by:blr:112:Belarus
+bz:blz:084:Belize
+ca:can:124:Canada
+cc:cck:166:Cocos (Keeling) Islands
+cd:cod:180:Congo, The Democratic Republic of the:Zaire:Congo, Democratic Republic of the
+cf:caf:140:Central African Republic
+cg:cog:178:Congo:Congo, Republic of the
+ch:che:756:Switzerland
+ci:civ:384:Cote D'Ivoire
+ck:cok:184:Cook Islands
+cl:chl:152:Chile
+cm:cmr:120:Cameroon
+cn:chn:156:China
+co:col:170:Colombia
+cr:cri:188:Costa Rica
+cs:scg:891:Serbia and Montenegro:Yugoslavia
+cu:cub:192:Cuba
+cv:cpv:132:Cape Verde
+cx:cxr:162:Christmas Island
+cy:cyp:196:Cyprus
+cz:cze:203:Czech Republic
+de:deu:276:Germany
+dj:dji:262:Djibouti
+dk:dnk:208:Denmark
+dm:dma:212:Dominica
+do:dom:214:Dominican Republic
+dz:dza:012:Algeria
+ec:ecu:218:Ecuador
+ee:est:233:Estonia
+eg:egy:818:Egypt
+eh:esh:732:Western Sahara
+er:eri:232:Eritrea
+es:esp:724:Spain
+et:eth:231:Ethiopia
+fi:fin:246:Finland
+fj:fji:242:Fiji
+fk:flk:238:Falkland Islands (Malvinas):Falkland Islands (Islas Malvinas)
+fm:fsm:583:Micronesia, Federated States of
+fo:fro:234:Faroe Islands
+fr:fra:250:France
+fx:fxx:249:France, Metropolitan
+ga:gab:266:Gabon
+gb:gbr:826:United Kingdom:Great Britain
+gd:grd:308:Grenada
+ge:geo:268:Georgia
+gf:guf:254:French Guiana
+gh:gha:288:Ghana
+gi:gib:292:Gibraltar
+gl:grl:304:Greenland
+gm:gmb:270:Gambia
+gn:gin:324:Guinea
+gp:glp:312:Guadeloupe
+gq:gnq:226:Equatorial Guinea
+gr:grc:300:Greece
+gs:sgs:239:South Georgia and the South Sandwich Islands
+gt:gtm:320:Guatemala
+gu:gum:316:Guam
+gw:gnb:624:Guinea-Bissau
+gy:guy:328:Guyana
+hk:hkg:344:Hong Kong
+hm:hmd:334:Heard Island and McDonald Islands
+hn:hnd:340:Honduras
+hr:hrv:191:Croatia
+ht:hti:332:Haiti
+hu:hun:348:Hungary
+id:idn:360:Indonesia
+ie:irl:372:Ireland
+il:isr:376:Israel
+in:ind:356:India
+io:iot:086:British Indian Ocean Territory
+iq:irq:368:Iraq
+ir:irn:364:Iran, Islamic Republic of:Iran
+is:isl:352:Iceland
+it:ita:380:Italy
+jm:jam:388:Jamaica
+jo:jor:400:Jordan
+jp:jpn:392:Japan
+ke:ken:404:Kenya
+kg:kgz:417:Kyrgyzstan
+kh:khm:116:Cambodia
+ki:kir:296:Kiribati
+km:com:174:Comoros
+kn:kna:659:Saint Kitts and Nevis
+kp:prk:408:Korea, Democratic People's Republic of:Korea, North:North Korea
+kr:kor:410:Korea, Republic of:Korea, South:South Korea
+kw:kwt:414:Kuwait
+ky:cym:136:Cayman Islands
+kz:kaz:398:Kazakhstan:Kazakstan
+la:lao:418:Lao People's Democratic Republic
+lb:lbn:422:Lebanon
+lc:lca:662:Saint Lucia
+li:lie:438:Liechtenstein
+lk:lka:144:Sri Lanka
+lr:lbr:430:Liberia
+ls:lso:426:Lesotho
+lt:ltu:440:Lithuania
+lu:lux:442:Luxembourg
+lv:lva:428:Latvia
+ly:lby:434:Libyan Arab Jamahiriya:Libya
+ma:mar:504:Morocco
+mc:mco:492:Monaco
+md:mda:498:Moldova, Republic of:Moldova
+mg:mdg:450:Madagascar
+mh:mhl:584:Marshall Islands
+mk:mkd:807:Macedonia, the Former Yugoslav Republic of:Macedonia, Former Yugoslav Republic of:Macedonia
+ml:mli:466:Mali
+mm:mmr:104:Myanmar:Burma
+mn:mng:496:Mongolia
+mo:mac:446:Macao:Macau
+mp:mnp:580:Northern Mariana Islands
+mq:mtq:474:Martinique
+mr:mrt:478:Mauritania
+ms:msr:500:Montserrat
+mt:mlt:470:Malta
+mu:mus:480:Mauritius
+mv:mdv:462:Maldives
+mw:mwi:454:Malawi
+mx:mex:484:Mexico
+my:mys:458:Malaysia
+mz:moz:508:Mozambique
+na:nam:516:Namibia
+nc:ncl:540:New Caledonia
+ne:ner:562:Niger
+nf:nfk:574:Norfolk Island
+ng:nga:566:Nigeria
+ni:nic:558:Nicaragua
+nl:nld:528:Netherlands
+no:nor:578:Norway
+np:npl:524:Nepal
+nr:nru:520:Nauru
+nu:niu:570:Niue
+nz:nzl:554:New Zealand
+om:omn:512:Oman
+pa:pan:591:Panama
+pe:per:604:Peru
+pf:pyf:258:French Polynesia
+pg:png:598:Papua New Guinea
+ph:phl:608:Philippines
+pk:pak:586:Pakistan
+pl:pol:616:Poland
+pm:spm:666:Saint Pierre and Miquelon
+pn:pcn:612:Pitcairn:Pitcairn Island
+pr:pri:630:Puerto Rico
+ps:pse:275:Palestinian Territory, Occupied
+pt:prt:620:Portugal
+pw:plw:585:Palau
+py:pry:600:Paraguay
+qa:qat:634:Qatar
+re:reu:638:Reunion
+ro:rou:642:Romania
+ru:rus:643:Russian Federation:Russia
+rw:rwa:646:Rwanda
+sa:sau:682:Saudi Arabia
+sb:slb:090:Solomon Islands
+sc:syc:690:Seychelles
+sd:sdn:736:Sudan
+se:swe:752:Sweden
+sg:sgp:702:Singapore
+sh:shn:654:Saint Helena
+si:svn:705:Slovenia
+sj:sjm:744:Svalbard and Jan Mayen:Jan Mayen:Svalbard
+sk:svk:703:Slovakia
+sl:sle:694:Sierra Leone
+sm:smr:674:San Marino
+sn:sen:686:Senegal
+so:som:706:Somalia
+sr:sur:740:Suriname
+st:stp:678:Sao Tome and Principe
+sv:slv:222:El Salvador
+sy:syr:760:Syrian Arab Republic:Syria
+sz:swz:748:Swaziland
+tc:tca:796:Turks and Caicos Islands
+td:tcd:148:Chad
+tf:atf:260:French Southern Territories:French Southern and Antarctic Lands
+tg:tgo:768:Togo
+th:tha:764:Thailand
+tj:tjk:762:Tajikistan
+tk:tkl:772:Tokelau
+tm:tkm:795:Turkmenistan
+tn:tun:788:Tunisia
+to:ton:776:Tonga
+tl:tls:626:Timor-Leste:East Timor
+tr:tur:792:Turkey
+tt:tto:780:Trinidad and Tobago
+tv:tuv:798:Tuvalu
+tw:twn:158:Taiwan, Province of China:Taiwan
+tz:tza:834:Tanzania, United Republic of:Tanzania
+ua:ukr:804:Ukraine
+ug:uga:800:Uganda
+um:umi:581:United States Minor Outlying Islands
+us:usa:840:United States:USA:United States of America
+uy:ury:858:Uruguay
+uz:uzb:860:Uzbekistan
+va:vat:336:Holy See (Vatican City State):Holy See (Vatican City)
+vc:vct:670:Saint Vincent and the Grenadines
+ve:ven:862:Venezuela
+vg:vgb:092:Virgin Islands, British:British Virgin Islands
+vi:vir:850:Virgin Islands, U.S.
+vn:vnm:704:Vietnam
+vu:vut:548:Vanuatu
+wf:wlf:876:Wallis and Futuna
+ws:wsm:882:Samoa
+ye:yem:887:Yemen
+yt:myt:175:Mayotte
+za:zaf:710:South Africa
+zm:zmb:894:Zambia
+zw:zwe:716:Zimbabwe
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Country.pod b/Master/tlpkg/tlperl.straw/lib/Locale/Country.pod
new file mode 100755
index 00000000000..b13cd22a4a7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Country.pod
@@ -0,0 +1,306 @@
+
+=head1 NAME
+
+Locale::Country - ISO codes for country identification (ISO 3166)
+
+=head1 SYNOPSIS
+
+ use Locale::Country;
+
+ $country = code2country('jp'); # $country gets 'Japan'
+ $code = country2code('Norway'); # $code gets 'no'
+
+ @codes = all_country_codes();
+ @names = all_country_names();
+
+ # semi-private routines
+ Locale::Country::alias_code('uk' => 'gb');
+ Locale::Country::rename_country('gb' => 'Great Britain');
+
+
+=head1 DESCRIPTION
+
+The C<Locale::Country> module provides access to the ISO
+codes for identifying countries, as defined in ISO 3166-1.
+You can either access the codes via the L<conversion routines>
+(described below), or with the two functions which return lists
+of all country codes or all country names.
+
+There are three different code sets you can use for identifying
+countries:
+
+=over 4
+
+=item B<alpha-2>
+
+Two letter codes, such as 'tv' for Tuvalu.
+This code set is identified with the symbol C<LOCALE_CODE_ALPHA_2>.
+
+=item B<alpha-3>
+
+Three letter codes, such as 'brb' for Barbados.
+This code set is identified with the symbol C<LOCALE_CODE_ALPHA_3>.
+
+=item B<numeric>
+
+Numeric codes, such as 064 for Bhutan.
+This code set is identified with the symbol C<LOCALE_CODE_NUMERIC>.
+
+=back
+
+All of the routines take an optional additional argument
+which specifies the code set to use.
+If not specified, it defaults to the two-letter codes.
+This is partly for backwards compatibility (previous versions
+of this module only supported the alpha-2 codes), and
+partly because they are the most widely used codes.
+
+The alpha-2 and alpha-3 codes are not case-dependent,
+so you can use 'BO', 'Bo', 'bO' or 'bo' for Bolivia.
+When a code is returned by one of the functions in
+this module, it will always be lower-case.
+
+As of version 2.00, Locale::Country supports variant
+names for countries. So, for example, the country code for "United States"
+is "us", so country2code('United States') returns 'us'.
+Now the following will also return 'us':
+
+ country2code('United States of America')
+ country2code('USA')
+
+
+=head1 CONVERSION ROUTINES
+
+There are three conversion routines: C<code2country()>, C<country2code()>,
+and C<country_code2code()>.
+
+=over 4
+
+=item code2country( CODE, [ CODESET ] )
+
+This function takes a country code and returns a string
+which contains the name of the country identified.
+If the code is not a valid country code, as defined by ISO 3166,
+then C<undef> will be returned:
+
+ $country = code2country('fi');
+
+=item country2code( STRING, [ CODESET ] )
+
+This function takes a country name and returns the corresponding
+country code, if such exists.
+If the argument could not be identified as a country name,
+then C<undef> will be returned:
+
+ $code = country2code('Norway', LOCALE_CODE_ALPHA_3);
+ # $code will now be 'nor'
+
+The case of the country name is not important.
+See the section L<KNOWN BUGS AND LIMITATIONS> below.
+
+=item country_code2code( CODE, CODESET, CODESET )
+
+This function takes a country code from one code set,
+and returns the corresponding code from another code set.
+
+ $alpha2 = country_code2code('fin',
+ LOCALE_CODE_ALPHA_3, LOCALE_CODE_ALPHA_2);
+ # $alpha2 will now be 'fi'
+
+If the code passed is not a valid country code in
+the first code set, or if there isn't a code for the
+corresponding country in the second code set,
+then C<undef> will be returned.
+
+=back
+
+
+=head1 QUERY ROUTINES
+
+There are two function which can be used to obtain a list of all codes,
+or all country names:
+
+=over 4
+
+=item C<all_country_codes( [ CODESET ] )>
+
+Returns a list of all two-letter country codes.
+The codes are guaranteed to be all lower-case,
+and not in any particular order.
+
+=item C<all_country_names( [ CODESET ] )>
+
+Returns a list of all country names for which there is a corresponding
+country code in the specified code set.
+The names are capitalised, and not returned in any particular order.
+
+Not all countries have alpha-3 and numeric codes -
+some just have an alpha-2 code,
+so you'll get a different number of countries
+depending on which code set you specify.
+
+=back
+
+
+=head1 SEMI-PRIVATE ROUTINES
+
+Locale::Country provides two semi-private routines for modifying
+the internal data.
+Given their status, they aren't exported by default,
+and so need to be called by prefixing the function name with the
+package name.
+
+=head2 alias_code
+
+Define a new code as an alias for an existing code:
+
+ Locale::Country::alias_code( ALIAS => CODE [, CODESET ] )
+
+This feature was added as a mechanism for handling
+a "uk" code. The ISO standard says that the two-letter code for
+"United Kingdom" is "gb", whereas domain names are all .uk.
+
+By default the module does not understand "uk", since it is implementing
+an ISO standard. If you would like 'uk' to work as the two-letter
+code for United Kingdom, use the following:
+
+ Locale::Country::alias_code('uk' => 'gb');
+
+With this code, both "uk" and "gb" are valid codes for United Kingdom,
+with the reverse lookup returning "uk" rather than the usual "gb".
+
+B<Note:> this function was previously called _alias_code,
+but the leading underscore has been dropped.
+The old name will be supported for all 2.X releases for
+backwards compatibility.
+
+=head2 rename_country
+
+If the official country name just isn't good enough for you,
+you can rename a country. For example, the official country
+name for code 'gb' is 'United Kingdom'.
+If you want to change that, you might call:
+
+ Locale::Country::rename_country('gb' => 'Great Britain');
+
+This means that calling code2country('gb') will now return
+'Great Britain' instead of 'United Kingdom'.
+The original country name is retained as an alias,
+so for the above example, country2code('United Kingdom')
+will still return 'gb'.
+
+
+=head1 EXAMPLES
+
+The following example illustrates use of the C<code2country()> function.
+The user is prompted for a country code, and then told the corresponding
+country name:
+
+ $| = 1; # turn off buffering
+
+ print "Enter country code: ";
+ chop($code = <STDIN>);
+ $country = code2country($code, LOCALE_CODE_ALPHA_2);
+ if (defined $country)
+ {
+ print "$code = $country\n";
+ }
+ else
+ {
+ print "'$code' is not a valid country code!\n";
+ }
+
+=head1 DOMAIN NAMES
+
+Most top-level domain names are based on these codes,
+but there are certain codes which aren't.
+If you are using this module to identify country from hostname,
+your best bet is to preprocess the country code.
+
+For example, B<edu>, B<com>, B<gov> and friends would map to B<us>;
+B<uk> would map to B<gb>. Any others?
+
+=head1 KNOWN BUGS AND LIMITATIONS
+
+=over 4
+
+=item *
+
+When using C<country2code()>, the country name must currently appear
+exactly as it does in the source of the module. The module now supports
+a small number of variants.
+
+Possible extensions to this are: an interface for getting at the
+list of variant names, and regular expression matches.
+
+=item *
+
+In the current implementation, all data is read in when the
+module is loaded, and then held in memory.
+A lazy implementation would be more memory friendly.
+
+=item *
+
+Support for country names in different languages.
+
+=back
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Locale::Language
+
+ISO two letter codes for identification of language (ISO 639).
+
+=item Locale::Script
+
+ISO codes for identification of scripts (ISO 15924).
+
+=item Locale::Currency
+
+ISO three letter codes for identification of currencies
+and funds (ISO 4217).
+
+=item Locale::SubCountry
+
+ISO codes for country sub-divisions (states, counties, provinces, etc),
+as defined in ISO 3166-2.
+This module is not part of the Locale-Codes distribution,
+but is available from CPAN in CPAN/modules/by-module/Locale/
+
+=item ISO 3166-1
+
+The ISO standard which defines these codes.
+
+=item http://www.iso.org/iso/en/prods-services/iso3166ma/index.html
+
+Official home page for the ISO 3166 maintenance agency.
+
+=item http://www.egt.ie/standards/iso3166/iso3166-1-en.html
+
+Another useful, but not official, home page.
+
+=item http://www.cia.gov/cia/publications/factbook/docs/app-d-1.html
+
+An appendix in the CIA world fact book which lists country codes
+as defined by ISO 3166, FIPS 10-4, and internet domain names.
+
+=back
+
+
+=head1 AUTHOR
+
+Neil Bowers E<lt>neil@bowers.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002-2004, Neil Bowers.
+
+Copyright (c) 1997-2001 Canon Research Centre Europe (CRE).
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Currency.pm b/Master/tlpkg/tlperl.straw/lib/Locale/Currency.pm
new file mode 100755
index 00000000000..13cd0482ba7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Currency.pm
@@ -0,0 +1,356 @@
+#
+# Locale::Currency - ISO three letter codes for currency identification
+# (ISO 4217)
+#
+# $Id: Currency.pm,v 2.7 2004/06/10 21:19:34 neilb Exp $
+#
+
+package Locale::Currency;
+use strict;
+require 5.002;
+
+require Exporter;
+
+#-----------------------------------------------------------------------
+# Public Global Variables
+#-----------------------------------------------------------------------
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION = sprintf("%d.%02d", q$Revision: 2.7 $ =~ /(\d+)\.(\d+)/);
+@ISA = qw(Exporter);
+@EXPORT = qw(&code2currency &currency2code
+ &all_currency_codes &all_currency_names );
+
+#-----------------------------------------------------------------------
+# Private Global Variables
+#-----------------------------------------------------------------------
+my %CODES = ();
+my %CURRENCIES = ();
+
+
+#=======================================================================
+#
+# code2currency( CODE )
+#
+#=======================================================================
+sub code2currency
+{
+ my $code = shift;
+
+
+ return undef unless defined $code;
+ $code = lc($code);
+ if (exists $CODES{$code})
+ {
+ return $CODES{$code};
+ }
+ else
+ {
+ #---------------------------------------------------------------
+ # no such currency code!
+ #---------------------------------------------------------------
+ return undef;
+ }
+}
+
+
+#=======================================================================
+#
+# currency2code ( CURRENCY )
+#
+#=======================================================================
+sub currency2code
+{
+ my $curr = shift;
+
+
+ return undef unless defined $curr;
+ $curr = lc($curr);
+ if (exists $CURRENCIES{$curr})
+ {
+ return $CURRENCIES{$curr};
+ }
+ else
+ {
+ #---------------------------------------------------------------
+ # no such currency!
+ #---------------------------------------------------------------
+ return undef;
+ }
+}
+
+
+#=======================================================================
+#
+# all_currency_codes()
+#
+#=======================================================================
+sub all_currency_codes
+{
+ return keys %CODES;
+}
+
+
+#=======================================================================
+#
+# all_currency_names()
+#
+#=======================================================================
+sub all_currency_names
+{
+ return values %CODES;
+}
+
+
+#=======================================================================
+# initialisation code - stuff the DATA into the CODES hash
+#=======================================================================
+{
+ my $code;
+ my $currency;
+ local $_;
+
+
+ while (<DATA>)
+ {
+ next unless /\S/;
+ chop;
+ ($code, $currency) = split(/:/, $_, 2);
+ $CODES{$code} = $currency;
+ $CURRENCIES{"\L$currency"} = $code;
+ }
+
+ close(DATA);
+}
+
+1;
+
+__DATA__
+adp:Andorran Peseta
+aed:UAE Dirham
+afa:Afghani
+all:Lek
+amd:Armenian Dram
+ang:Netherlands Antillean Guilder
+aoa:Kwanza
+aon:New Kwanza
+aor:Kwanza Reajustado
+ars:Argentine Peso
+ats:Schilling
+aud:Australian Dollar
+awg:Aruban Guilder
+azm:Azerbaijanian Manat
+
+bam:Convertible Marks
+bbd:Barbados Dollar
+bdt:Taka
+bef:Belgian Franc
+bgl:Lev
+bgn:Bulgarian Lev
+bhd:Bahraini Dinar
+bhd:Dinar
+bif:Burundi Franc
+bmd:Bermudian Dollar
+bnd:Brunei Dollar
+bob:Boliviano
+bov:MVDol
+brl:Brazilian Real
+bsd:Bahamian Dollar
+btn:Ngultrum
+bwp:Pula
+byb:Belarussian Ruble
+byr:Belarussian Ruble
+bzd:Belize Dollar
+
+cad:Canadian Dollar
+cdf:Franc Congolais
+chf:Swiss Franc
+clf:Unidades de Formento
+clp:Chilean Peso
+cny:Yuan Renminbi
+cop:Colombian Peso
+crc:Costa Rican Colon
+cup:Cuban Peso
+cve:Cape Verde Escudo
+cyp:Cyprus Pound
+czk:Czech Koruna
+
+dem:German Mark
+djf:Djibouti Franc
+dkk:Danish Krone
+dop:Dominican Peso
+dzd:Algerian Dinar
+
+ecs:Sucre
+ecv:Unidad de Valor Constante (UVC)
+eek:Kroon
+egp:Egyptian Pound
+ern:Nakfa
+esp:Spanish Peseta
+etb:Ethiopian Birr
+eur:Euro
+
+fim:Markka
+fjd:Fiji Dollar
+fkp:Falkland Islands Pound
+frf:French Franc
+
+gbp:Pound Sterling
+gel:Lari
+ghc:Cedi
+gip:Gibraltar Pound
+gmd:Dalasi
+gnf:Guinea Franc
+grd:Drachma
+gtq:Quetzal
+gwp:Guinea-Bissau Peso
+gyd:Guyana Dollar
+
+hkd:Hong Kong Dollar
+hnl:Lempira
+hrk:Kuna
+htg:Gourde
+huf:Forint
+
+idr:Rupiah
+iep:Irish Pound
+ils:Shekel
+inr:Indian Rupee
+iqd:Iraqi Dinar
+irr:Iranian Rial
+isk:Iceland Krona
+itl:Italian Lira
+
+jmd:Jamaican Dollar
+jod:Jordanian Dinar
+jpy:Yen
+
+kes:Kenyan Shilling
+kgs:Som
+khr:Riel
+kmf:Comoro Franc
+kpw:North Korean Won
+krw:Won
+kwd:Kuwaiti Dinar
+kyd:Cayman Islands Dollar
+kzt:Tenge
+
+lak:Kip
+lbp:Lebanese Pound
+lkr:Sri Lanka Rupee
+lrd:Liberian Dollar
+lsl:Loti
+ltl:Lithuanian Litas
+luf:Luxembourg Franc
+lvl:Latvian Lats
+lyd:Libyan Dinar
+
+mad:Moroccan Dirham
+mdl:Moldovan Leu
+mgf:Malagasy Franc
+mkd:Denar
+mmk:Kyat
+mnt:Tugrik
+mop:Pataca
+mro:Ouguiya
+mtl:Maltese Lira
+mur:Mauritius Rupee
+mvr:Rufiyaa
+mwk:Kwacha
+mxn:Mexican Nuevo Peso
+myr:Malaysian Ringgit
+mzm:Metical
+
+nad:Namibia Dollar
+ngn:Naira
+nio:Cordoba Oro
+nlg:Netherlands Guilder
+nok:Norwegian Krone
+npr:Nepalese Rupee
+nzd:New Zealand Dollar
+
+omr:Rial Omani
+
+pab:Balboa
+pen:Nuevo Sol
+pgk:Kina
+php:Philippine Peso
+pkr:Pakistan Rupee
+pln:Zloty
+pte:Portuguese Escudo
+pyg:Guarani
+
+qar:Qatari Rial
+
+rol:Leu
+rub:Russian Ruble
+rur:Russian Ruble
+rwf:Rwanda Franc
+
+sar:Saudi Riyal
+sbd:Solomon Islands Dollar
+scr:Seychelles Rupee
+sdd:Sudanese Dinar
+sek:Swedish Krona
+sgd:Singapore Dollar
+shp:St. Helena Pound
+sit:Tolar
+skk:Slovak Koruna
+sll:Leone
+sos:Somali Shilling
+srg:Surinam Guilder
+std:Dobra
+svc:El Salvador Colon
+syp:Syrian Pound
+szl:Lilangeni
+
+thb:Baht
+tjr:Tajik Ruble
+tmm:Manat
+tnd:Tunisian Dollar
+top:Pa'anga
+tpe:Timor Escudo
+trl:Turkish Lira
+ttd:Trinidad and Tobago Dollar
+twd:New Taiwan Dollar
+tzs:Tanzanian Shilling
+
+uah:Hryvnia
+uak:Karbovanets
+ugx:Uganda Shilling
+usd:US Dollar
+usn:US Dollar (Next day)
+uss:US Dollar (Same day)
+uyu:Peso Uruguayo
+uzs:Uzbekistan Sum
+
+veb:Bolivar
+vnd:Dong
+vuv:Vatu
+
+wst:Tala
+
+xaf:CFA Franc BEAC
+xag:Silver
+xau:Gold
+xba:European Composite Unit
+xbb:European Monetary Unit
+xbc:European Unit of Account 9
+xb5:European Unit of Account 17
+xcd:East Caribbean Dollar
+xdr:SDR
+xeu:ECU (until 1998-12-31)
+xfu:UIC-Franc
+xfo:Gold-Franc
+xof:CFA Franc BCEAO
+xpd:Palladium
+xpf:CFP Franc
+xpt:Platinum
+
+yer:Yemeni Rial
+yum:New Dinar
+
+zal:Financial Rand
+zar:Rand
+zmk:Kwacha
+zrn:New Zaire
+zwd:Zimbabwe Dollar
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Currency.pod b/Master/tlpkg/tlperl.straw/lib/Locale/Currency.pod
new file mode 100755
index 00000000000..dce32612949
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Currency.pod
@@ -0,0 +1,191 @@
+
+=head1 NAME
+
+Locale::Currency - ISO three letter codes for currency identification (ISO 4217)
+
+=head1 SYNOPSIS
+
+ use Locale::Currency;
+
+ $curr = code2currency('usd'); # $curr gets 'US Dollar'
+ $code = currency2code('Euro'); # $code gets 'eur'
+
+ @codes = all_currency_codes();
+ @names = all_currency_names();
+
+
+=head1 DESCRIPTION
+
+The C<Locale::Currency> module provides access to the ISO three-letter
+codes for identifying currencies and funds, as defined in ISO 4217.
+You can either access the codes via the L<conversion routines>
+(described below),
+or with the two functions which return lists of all currency codes or
+all currency names.
+
+There are two special codes defined by the standard which aren't
+understood by this module:
+
+=over 4
+
+=item XTS
+
+Specifically reserved for testing purposes.
+
+=item XXX
+
+For transactions where no currency is involved.
+
+=back
+
+
+=head1 CONVERSION ROUTINES
+
+There are two conversion routines: C<code2currency()> and C<currency2code()>.
+
+=over 4
+
+=item code2currency()
+
+This function takes a three letter currency code and returns a string
+which contains the name of the currency identified. If the code is
+not a valid currency code, as defined by ISO 4217, then C<undef>
+will be returned.
+
+ $curr = code2currency($code);
+
+=item currency2code()
+
+This function takes a currency name and returns the corresponding
+three letter currency code, if such exists.
+If the argument could not be identified as a currency name,
+then C<undef> will be returned.
+
+ $code = currency2code('French Franc');
+
+The case of the currency name is not important.
+See the section L<KNOWN BUGS AND LIMITATIONS> below.
+
+=back
+
+
+=head1 QUERY ROUTINES
+
+There are two function which can be used to obtain a list of all
+currency codes, or all currency names:
+
+=over 4
+
+=item C<all_currency_codes()>
+
+Returns a list of all three-letter currency codes.
+The codes are guaranteed to be all lower-case,
+and not in any particular order.
+
+=item C<all_currency_names()>
+
+Returns a list of all currency names for which there is a corresponding
+three-letter currency code. The names are capitalised, and not returned
+in any particular order.
+
+=back
+
+
+=head1 EXAMPLES
+
+The following example illustrates use of the C<code2currency()> function.
+The user is prompted for a currency code, and then told the corresponding
+currency name:
+
+ $| = 1; # turn off buffering
+
+ print "Enter currency code: ";
+ chop($code = <STDIN>);
+ $curr = code2currency($code);
+ if (defined $curr)
+ {
+ print "$code = $curr\n";
+ }
+ else
+ {
+ print "'$code' is not a valid currency code!\n";
+ }
+
+=head1 KNOWN BUGS AND LIMITATIONS
+
+=over 4
+
+=item *
+
+In the current implementation, all data is read in when the
+module is loaded, and then held in memory.
+A lazy implementation would be more memory friendly.
+
+=item *
+
+This module also includes the special codes which are
+not for a currency, such as Gold, Platinum, etc.
+This might cause a problem if you're using this module
+to display a list of currencies.
+Let Neil know if this does cause a problem, and we can
+do something about it.
+
+=item *
+
+ISO 4217 also defines a numeric code for each currency.
+Currency codes are not currently supported by this module,
+in the same way Locale::Country supports multiple codesets.
+
+=item *
+
+There are three cases where there is more than one
+code for the same currency name.
+Kwacha has two codes: mwk for Malawi, and zmk for Zambia.
+The Russian Ruble has two codes: rub and rur.
+The Belarussian Ruble has two codes: byr and byb.
+The currency2code() function only returns one code, so
+you might not get back the code you expected.
+
+=back
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Locale::Country
+
+ISO codes for identification of country (ISO 3166).
+
+=item Locale::Script
+
+ISO codes for identification of written scripts (ISO 15924).
+
+=item ISO 4217:1995
+
+Code for the representation of currencies and funds.
+
+=item http://www.bsi-global.com/iso4217currency
+
+Official web page for the ISO 4217 maintenance agency.
+This has the latest list of codes, in MS Word format. Boo.
+
+=back
+
+=head1 AUTHOR
+
+Michael Hennecke E<lt>hennecke@rz.uni-karlsruhe.deE<gt>
+and
+Neil Bowers E<lt>neil@bowers.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002-2004, Neil Bowers.
+
+Copyright (c) 2001 Michael Hennecke and
+Canon Research Centre Europe (CRE).
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Language.pm b/Master/tlpkg/tlperl.straw/lib/Locale/Language.pm
new file mode 100755
index 00000000000..e8454c39b4a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Language.pm
@@ -0,0 +1,315 @@
+#
+# Locale::Language - ISO two letter codes for language identification (ISO 639)
+#
+# $Id: Language.pm,v 2.7 2004/06/10 21:19:34 neilb Exp $
+#
+
+package Locale::Language;
+use strict;
+require 5.002;
+
+require Exporter;
+
+#-----------------------------------------------------------------------
+# Public Global Variables
+#-----------------------------------------------------------------------
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION = sprintf("%d.%02d", q$Revision: 2.7 $ =~ /(\d+)\.(\d+)/);
+@ISA = qw(Exporter);
+@EXPORT = qw(&code2language &language2code
+ &all_language_codes &all_language_names );
+
+#-----------------------------------------------------------------------
+# Private Global Variables
+#-----------------------------------------------------------------------
+my %CODES = ();
+my %LANGUAGES = ();
+
+
+#=======================================================================
+#
+# code2language ( CODE )
+#
+#=======================================================================
+sub code2language
+{
+ my $code = shift;
+
+
+ return undef unless defined $code;
+ $code = lc($code);
+ if (exists $CODES{$code})
+ {
+ return $CODES{$code};
+ }
+ else
+ {
+ #---------------------------------------------------------------
+ # no such language code!
+ #---------------------------------------------------------------
+ return undef;
+ }
+}
+
+
+#=======================================================================
+#
+# language2code ( LANGUAGE )
+#
+#=======================================================================
+sub language2code
+{
+ my $lang = shift;
+
+
+ return undef unless defined $lang;
+ $lang = lc($lang);
+ if (exists $LANGUAGES{$lang})
+ {
+ return $LANGUAGES{$lang};
+ }
+ else
+ {
+ #---------------------------------------------------------------
+ # no such language!
+ #---------------------------------------------------------------
+ return undef;
+ }
+}
+
+
+#=======================================================================
+#
+# all_language_codes()
+#
+#=======================================================================
+sub all_language_codes
+{
+ return keys %CODES;
+}
+
+
+#=======================================================================
+#
+# all_language_names()
+#
+#=======================================================================
+sub all_language_names
+{
+ return values %CODES;
+}
+
+
+#=======================================================================
+# initialisation code - stuff the DATA into the CODES hash
+#=======================================================================
+{
+ my $code;
+ my $language;
+ local $_;
+
+
+ while (<DATA>)
+ {
+ next unless /\S/;
+ chop;
+ ($code, $language) = split(/:/, $_, 2);
+ $CODES{$code} = $language;
+ $LANGUAGES{"\L$language"} = $code;
+ }
+
+ close(DATA);
+}
+
+1;
+
+__DATA__
+aa:Afar
+ab:Abkhazian
+ae:Avestan
+af:Afrikaans
+am:Amharic
+ar:Arabic
+as:Assamese
+ay:Aymara
+az:Azerbaijani
+
+ba:Bashkir
+be:Belarusian
+bg:Bulgarian
+bh:Bihari
+bi:Bislama
+bn:Bengali
+bo:Tibetan
+br:Breton
+bs:Bosnian
+
+ca:Catalan
+ce:Chechen
+ch:Chamorro
+co:Corsican
+cs:Czech
+cu:Church Slavic
+cv:Chuvash
+cy:Welsh
+
+da:Danish
+de:German
+dz:Dzongkha
+
+el:Greek
+en:English
+eo:Esperanto
+es:Spanish
+et:Estonian
+eu:Basque
+
+fa:Persian
+fi:Finnish
+fj:Fijian
+fo:Faeroese
+fr:French
+fy:Frisian
+
+ga:Irish
+gd:Gaelic (Scots)
+gl:Gallegan
+gn:Guarani
+gu:Gujarati
+gv:Manx
+
+ha:Hausa
+he:Hebrew
+hi:Hindi
+ho:Hiri Motu
+hr:Croatian
+hu:Hungarian
+hy:Armenian
+hz:Herero
+
+ia:Interlingua
+id:Indonesian
+ie:Interlingue
+ik:Inupiaq
+is:Icelandic
+it:Italian
+iu:Inuktitut
+
+ja:Japanese
+jw:Javanese
+
+ka:Georgian
+ki:Kikuyu
+kj:Kuanyama
+kk:Kazakh
+kl:Kalaallisut
+km:Khmer
+kn:Kannada
+ko:Korean
+ks:Kashmiri
+ku:Kurdish
+kv:Komi
+kw:Cornish
+ky:Kirghiz
+
+la:Latin
+lb:Letzeburgesch
+ln:Lingala
+lo:Lao
+lt:Lithuanian
+lv:Latvian
+
+mg:Malagasy
+mh:Marshall
+mi:Maori
+mk:Macedonian
+ml:Malayalam
+mn:Mongolian
+mo:Moldavian
+mr:Marathi
+ms:Malay
+mt:Maltese
+my:Burmese
+
+na:Nauru
+nb:Norwegian Bokmal
+nd:Ndebele, North
+ne:Nepali
+ng:Ndonga
+nl:Dutch
+nn:Norwegian Nynorsk
+no:Norwegian
+nr:Ndebele, South
+nv:Navajo
+ny:Chichewa; Nyanja
+
+oc:Occitan (post 1500)
+om:Oromo
+or:Oriya
+os:Ossetian; Ossetic
+
+pa:Panjabi
+pi:Pali
+pl:Polish
+ps:Pushto
+pt:Portuguese
+
+qu:Quechua
+
+rm:Rhaeto-Romance
+rn:Rundi
+ro:Romanian
+ru:Russian
+rw:Kinyarwanda
+
+sa:Sanskrit
+sc:Sardinian
+sd:Sindhi
+se:Sami
+sg:Sango
+si:Sinhalese
+sk:Slovak
+sl:Slovenian
+sm:Samoan
+sn:Shona
+so:Somali
+sq:Albanian
+sr:Serbian
+ss:Swati
+st:Sotho
+su:Sundanese
+sv:Swedish
+sw:Swahili
+
+ta:Tamil
+te:Telugu
+tg:Tajik
+th:Thai
+ti:Tigrinya
+tk:Turkmen
+tl:Tagalog
+tn:Tswana
+to:Tonga
+tr:Turkish
+ts:Tsonga
+tt:Tatar
+tw:Twi
+
+ug:Uighur
+uk:Ukrainian
+ur:Urdu
+uz:Uzbek
+
+vi:Vietnamese
+vo:Volapuk
+
+wo:Wolof
+
+xh:Xhosa
+
+yi:Yiddish
+yo:Yoruba
+
+za:Zhuang
+zh:Chinese
+zu:Zulu
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Language.pod b/Master/tlpkg/tlperl.straw/lib/Locale/Language.pod
new file mode 100755
index 00000000000..ce7b378e5d9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Language.pod
@@ -0,0 +1,158 @@
+
+=head1 NAME
+
+Locale::Language - ISO two letter codes for language identification (ISO 639)
+
+=head1 SYNOPSIS
+
+ use Locale::Language;
+
+ $lang = code2language('en'); # $lang gets 'English'
+ $code = language2code('French'); # $code gets 'fr'
+
+ @codes = all_language_codes();
+ @names = all_language_names();
+
+
+=head1 DESCRIPTION
+
+The C<Locale::Language> module provides access to the ISO two-letter
+codes for identifying languages, as defined in ISO 639. You can either
+access the codes via the L<conversion routines> (described below),
+or via the two functions which return lists of all language codes or
+all language names.
+
+
+=head1 CONVERSION ROUTINES
+
+There are two conversion routines: C<code2language()> and C<language2code()>.
+
+=over 4
+
+=item code2language()
+
+This function takes a two letter language code and returns a string
+which contains the name of the language identified. If the code is
+not a valid language code, as defined by ISO 639, then C<undef>
+will be returned.
+
+ $lang = code2language($code);
+
+=item language2code()
+
+This function takes a language name and returns the corresponding
+two letter language code, if such exists.
+If the argument could not be identified as a language name,
+then C<undef> will be returned.
+
+ $code = language2code('French');
+
+The case of the language name is not important.
+See the section L<KNOWN BUGS AND LIMITATIONS> below.
+
+=back
+
+
+=head1 QUERY ROUTINES
+
+There are two function which can be used to obtain a list of all
+language codes, or all language names:
+
+=over 4
+
+=item C<all_language_codes()>
+
+Returns a list of all two-letter language codes.
+The codes are guaranteed to be all lower-case,
+and not in any particular order.
+
+=item C<all_language_names()>
+
+Returns a list of all language names for which there is a corresponding
+two-letter language code. The names are capitalised, and not returned
+in any particular order.
+
+=back
+
+
+=head1 EXAMPLES
+
+The following example illustrates use of the C<code2language()> function.
+The user is prompted for a language code, and then told the corresponding
+language name:
+
+ $| = 1; # turn off buffering
+
+ print "Enter language code: ";
+ chop($code = <STDIN>);
+ $lang = code2language($code);
+ if (defined $lang)
+ {
+ print "$code = $lang\n";
+ }
+ else
+ {
+ print "'$code' is not a valid language code!\n";
+ }
+
+=head1 KNOWN BUGS AND LIMITATIONS
+
+=over 4
+
+=item *
+
+In the current implementation, all data is read in when the
+module is loaded, and then held in memory.
+A lazy implementation would be more memory friendly.
+
+=item *
+
+Currently just supports the two letter language codes -
+there are also three-letter codes, and numbers.
+Would these be of any use to anyone?
+
+=back
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Locale::Country
+
+ISO codes for identification of country (ISO 3166).
+Supports 2-letter, 3-letter, and numeric country codes.
+
+=item Locale::Script
+
+ISO codes for identification of written scripts (ISO 15924).
+
+=item Locale::Currency
+
+ISO three letter codes for identification of currencies and funds (ISO 4217).
+
+=item ISO 639:1988 (E/F)
+
+Code for the representation of names of languages.
+
+=item http://lcweb.loc.gov/standards/iso639-2/langhome.html
+
+Home page for ISO 639-2.
+
+=back
+
+
+=head1 AUTHOR
+
+Neil Bowers E<lt>neil@bowers.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002-2004, Neil Bowers.
+
+Copyright (c) 1997-2001 Canon Research Centre Europe (CRE).
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Maketext.pm b/Master/tlpkg/tlperl.straw/lib/Locale/Maketext.pm
new file mode 100755
index 00000000000..eda9e97b1b7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Maketext.pm
@@ -0,0 +1,456 @@
+package Locale::Maketext;
+use strict;
+use vars qw( @ISA $VERSION $MATCH_SUPERS $USING_LANGUAGE_TAGS
+$USE_LITERALS $MATCH_SUPERS_TIGHTLY);
+use Carp ();
+use I18N::LangTags 0.30 ();
+
+#--------------------------------------------------------------------------
+
+BEGIN { unless(defined &DEBUG) { *DEBUG = sub () {0} } }
+# define the constant 'DEBUG' at compile-time
+
+$VERSION = '1.13';
+@ISA = ();
+
+$MATCH_SUPERS = 1;
+$MATCH_SUPERS_TIGHTLY = 1;
+$USING_LANGUAGE_TAGS = 1;
+# Turning this off is somewhat of a security risk in that little or no
+# checking will be done on the legality of tokens passed to the
+# eval("use $module_name") in _try_use. If you turn this off, you have
+# to do your own taint checking.
+
+$USE_LITERALS = 1 unless defined $USE_LITERALS;
+# a hint for compiling bracket-notation things.
+
+my %isa_scan = ();
+
+###########################################################################
+
+sub quant {
+ my($handle, $num, @forms) = @_;
+
+ return $num if @forms == 0; # what should this mean?
+ return $forms[2] if @forms > 2 and $num == 0; # special zeroth case
+
+ # Normal case:
+ # Note that the formatting of $num is preserved.
+ return( $handle->numf($num) . ' ' . $handle->numerate($num, @forms) );
+ # Most human languages put the number phrase before the qualified phrase.
+}
+
+
+sub numerate {
+ # return this lexical item in a form appropriate to this number
+ my($handle, $num, @forms) = @_;
+ my $s = ($num == 1);
+
+ return '' unless @forms;
+ if(@forms == 1) { # only the headword form specified
+ return $s ? $forms[0] : ($forms[0] . 's'); # very cheap hack.
+ }
+ else { # sing and plural were specified
+ return $s ? $forms[0] : $forms[1];
+ }
+}
+
+#--------------------------------------------------------------------------
+
+sub numf {
+ my($handle, $num) = @_[0,1];
+ if($num < 10_000_000_000 and $num > -10_000_000_000 and $num == int($num)) {
+ $num += 0; # Just use normal integer stringification.
+ # Specifically, don't let %G turn ten million into 1E+007
+ }
+ else {
+ $num = CORE::sprintf('%G', $num);
+ # "CORE::" is there to avoid confusion with the above sub sprintf.
+ }
+ while( $num =~ s/^([-+]?\d+)(\d{3})/$1,$2/s ) {1} # right from perlfaq5
+ # The initial \d+ gobbles as many digits as it can, and then we
+ # backtrack so it un-eats the rightmost three, and then we
+ # insert the comma there.
+
+ $num =~ tr<.,><,.> if ref($handle) and $handle->{'numf_comma'};
+ # This is just a lame hack instead of using Number::Format
+ return $num;
+}
+
+sub sprintf {
+ no integer;
+ my($handle, $format, @params) = @_;
+ return CORE::sprintf($format, @params);
+ # "CORE::" is there to avoid confusion with myself!
+}
+
+#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
+
+use integer; # vroom vroom... applies to the whole rest of the module
+
+sub language_tag {
+ my $it = ref($_[0]) || $_[0];
+ return undef unless $it =~ m/([^':]+)(?:::)?$/s;
+ $it = lc($1);
+ $it =~ tr<_><->;
+ return $it;
+}
+
+sub encoding {
+ my $it = $_[0];
+ return(
+ (ref($it) && $it->{'encoding'})
+ || 'iso-8859-1' # Latin-1
+ );
+}
+
+#--------------------------------------------------------------------------
+
+sub fallback_languages { return('i-default', 'en', 'en-US') }
+
+sub fallback_language_classes { return () }
+
+#--------------------------------------------------------------------------
+
+sub fail_with { # an actual attribute method!
+ my($handle, @params) = @_;
+ return unless ref($handle);
+ $handle->{'fail'} = $params[0] if @params;
+ return $handle->{'fail'};
+}
+
+#--------------------------------------------------------------------------
+
+sub failure_handler_auto {
+ # Meant to be used like:
+ # $handle->fail_with('failure_handler_auto')
+
+ my $handle = shift;
+ my $phrase = shift;
+
+ $handle->{'failure_lex'} ||= {};
+ my $lex = $handle->{'failure_lex'};
+
+ my $value;
+ $lex->{$phrase} ||= ($value = $handle->_compile($phrase));
+
+ # Dumbly copied from sub maketext:
+ return ${$value} if ref($value) eq 'SCALAR';
+ return $value if ref($value) ne 'CODE';
+ {
+ local $SIG{'__DIE__'};
+ eval { $value = &$value($handle, @_) };
+ }
+ # If we make it here, there was an exception thrown in the
+ # call to $value, and so scream:
+ if($@) {
+ my $err = $@;
+ # pretty up the error message
+ $err =~ s{\s+at\s+\(eval\s+\d+\)\s+line\s+(\d+)\.?\n?}
+ {\n in bracket code [compiled line $1],}s;
+ #$err =~ s/\n?$/\n/s;
+ Carp::croak "Error in maketexting \"$phrase\":\n$err as used";
+ # Rather unexpected, but suppose that the sub tried calling
+ # a method that didn't exist.
+ }
+ else {
+ return $value;
+ }
+}
+
+#==========================================================================
+
+sub new {
+ # Nothing fancy!
+ my $class = ref($_[0]) || $_[0];
+ my $handle = bless {}, $class;
+ $handle->init;
+ return $handle;
+}
+
+sub init { return } # no-op
+
+###########################################################################
+
+sub maketext {
+ # Remember, this can fail. Failure is controllable many ways.
+ Carp::croak 'maketext requires at least one parameter' unless @_ > 1;
+
+ my($handle, $phrase) = splice(@_,0,2);
+ Carp::confess('No handle/phrase') unless (defined($handle) && defined($phrase));
+
+
+ # Don't interefere with $@ in case that's being interpolated into the msg.
+ local $@;
+
+ # Look up the value:
+
+ my $value;
+ foreach my $h_r (
+ @{ $isa_scan{ref($handle) || $handle} || $handle->_lex_refs }
+ ) {
+ DEBUG and warn "* Looking up \"$phrase\" in $h_r\n";
+ if(exists $h_r->{$phrase}) {
+ DEBUG and warn " Found \"$phrase\" in $h_r\n";
+ unless(ref($value = $h_r->{$phrase})) {
+ # Nonref means it's not yet compiled. Compile and replace.
+ $value = $h_r->{$phrase} = $handle->_compile($value);
+ }
+ last;
+ }
+ elsif($phrase !~ m/^_/s and $h_r->{'_AUTO'}) {
+ # it's an auto lex, and this is an autoable key!
+ DEBUG and warn " Automaking \"$phrase\" into $h_r\n";
+
+ $value = $h_r->{$phrase} = $handle->_compile($phrase);
+ last;
+ }
+ DEBUG>1 and print " Not found in $h_r, nor automakable\n";
+ # else keep looking
+ }
+
+ unless(defined($value)) {
+ DEBUG and warn "! Lookup of \"$phrase\" in/under ", ref($handle) || $handle, " fails.\n";
+ if(ref($handle) and $handle->{'fail'}) {
+ DEBUG and warn "WARNING0: maketext fails looking for <$phrase>\n";
+ my $fail;
+ if(ref($fail = $handle->{'fail'}) eq 'CODE') { # it's a sub reference
+ return &{$fail}($handle, $phrase, @_);
+ # If it ever returns, it should return a good value.
+ }
+ else { # It's a method name
+ return $handle->$fail($phrase, @_);
+ # If it ever returns, it should return a good value.
+ }
+ }
+ else {
+ # All we know how to do is this;
+ Carp::croak("maketext doesn't know how to say:\n$phrase\nas needed");
+ }
+ }
+
+ return $$value if ref($value) eq 'SCALAR';
+ return $value unless ref($value) eq 'CODE';
+
+ {
+ local $SIG{'__DIE__'};
+ eval { $value = &$value($handle, @_) };
+ }
+ # If we make it here, there was an exception thrown in the
+ # call to $value, and so scream:
+ if ($@) {
+ my $err = $@;
+ # pretty up the error message
+ $err =~ s{\s+at\s+\(eval\s+\d+\)\s+line\s+(\d+)\.?\n?}
+ {\n in bracket code [compiled line $1],}s;
+ #$err =~ s/\n?$/\n/s;
+ Carp::croak "Error in maketexting \"$phrase\":\n$err as used";
+ # Rather unexpected, but suppose that the sub tried calling
+ # a method that didn't exist.
+ }
+ else {
+ return $value;
+ }
+}
+
+###########################################################################
+
+sub get_handle { # This is a constructor and, yes, it CAN FAIL.
+ # Its class argument has to be the base class for the current
+ # application's l10n files.
+
+ my($base_class, @languages) = @_;
+ $base_class = ref($base_class) || $base_class;
+ # Complain if they use __PACKAGE__ as a project base class?
+
+ if( @languages ) {
+ DEBUG and warn 'Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+ if($USING_LANGUAGE_TAGS) { # An explicit language-list was given!
+ @languages =
+ map {; $_, I18N::LangTags::alternate_language_tags($_) }
+ # Catch alternation
+ map I18N::LangTags::locale2language_tag($_),
+ # If it's a lg tag, fine, pass thru (untainted)
+ # If it's a locale ID, try converting to a lg tag (untainted),
+ # otherwise nix it.
+ @languages;
+ DEBUG and warn 'Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+ }
+ }
+ else {
+ @languages = $base_class->_ambient_langprefs;
+ }
+
+ @languages = $base_class->_langtag_munging(@languages);
+
+ my %seen;
+ foreach my $module_name ( map { $base_class . '::' . $_ } @languages ) {
+ next unless length $module_name; # sanity
+ next if $seen{$module_name}++ # Already been here, and it was no-go
+ || !&_try_use($module_name); # Try to use() it, but can't it.
+ return($module_name->new); # Make it!
+ }
+
+ return undef; # Fail!
+}
+
+###########################################################################
+
+sub _langtag_munging {
+ my($base_class, @languages) = @_;
+
+ # We have all these DEBUG statements because otherwise it's hard as hell
+ # to diagnose ifwhen something goes wrong.
+
+ DEBUG and warn 'Lgs1: ', map("<$_>", @languages), "\n";
+
+ if($USING_LANGUAGE_TAGS) {
+ DEBUG and warn 'Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+ @languages = $base_class->_add_supers( @languages );
+
+ push @languages, I18N::LangTags::panic_languages(@languages);
+ DEBUG and warn "After adding panic languages:\n",
+ ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+
+ push @languages, $base_class->fallback_languages;
+ # You are free to override fallback_languages to return empty-list!
+ DEBUG and warn 'Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+
+ @languages = # final bit of processing to turn them into classname things
+ map {
+ my $it = $_; # copy
+ $it =~ tr<-A-Z><_a-z>; # lc, and turn - to _
+ $it =~ tr<_a-z0-9><>cd; # remove all but a-z0-9_
+ $it;
+ } @languages
+ ;
+ DEBUG and warn "Nearing end of munging:\n",
+ ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+ }
+ else {
+ DEBUG and warn "Bypassing language-tags.\n",
+ ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+ }
+
+ DEBUG and warn "Before adding fallback classes:\n",
+ ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+
+ push @languages, $base_class->fallback_language_classes;
+ # You are free to override that to return whatever.
+
+ DEBUG and warn "Finally:\n",
+ ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+
+ return @languages;
+}
+
+###########################################################################
+
+sub _ambient_langprefs {
+ require I18N::LangTags::Detect;
+ return I18N::LangTags::Detect::detect();
+}
+
+###########################################################################
+
+sub _add_supers {
+ my($base_class, @languages) = @_;
+
+ if (!$MATCH_SUPERS) {
+ # Nothing
+ DEBUG and warn "Bypassing any super-matching.\n",
+ ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+
+ }
+ elsif( $MATCH_SUPERS_TIGHTLY ) {
+ DEBUG and warn "Before adding new supers tightly:\n",
+ ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+ @languages = I18N::LangTags::implicate_supers( @languages );
+ DEBUG and warn "After adding new supers tightly:\n",
+ ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+
+ }
+ else {
+ DEBUG and warn "Before adding supers to end:\n",
+ ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+ @languages = I18N::LangTags::implicate_supers_strictly( @languages );
+ DEBUG and warn "After adding supers to end:\n",
+ ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n";
+ }
+
+ return @languages;
+}
+
+###########################################################################
+#
+# This is where most people should stop reading.
+#
+###########################################################################
+
+use Locale::Maketext::GutsLoader;
+
+###########################################################################
+
+my %tried = ();
+# memoization of whether we've used this module, or found it unusable.
+
+sub _try_use { # Basically a wrapper around "require Modulename"
+ # "Many men have tried..." "They tried and failed?" "They tried and died."
+ return $tried{$_[0]} if exists $tried{$_[0]}; # memoization
+
+ my $module = $_[0]; # ASSUME sane module name!
+ { no strict 'refs';
+ return($tried{$module} = 1)
+ if defined(%{$module . '::Lexicon'}) or defined(@{$module . '::ISA'});
+ # weird case: we never use'd it, but there it is!
+ }
+
+ DEBUG and warn " About to use $module ...\n";
+ {
+ local $SIG{'__DIE__'};
+ eval "require $module"; # used to be "use $module", but no point in that.
+ }
+ if($@) {
+ DEBUG and warn "Error using $module \: $@\n";
+ return $tried{$module} = 0;
+ }
+ else {
+ DEBUG and warn " OK, $module is used\n";
+ return $tried{$module} = 1;
+ }
+}
+
+#--------------------------------------------------------------------------
+
+sub _lex_refs { # report the lexicon references for this handle's class
+ # returns an arrayREF!
+ no strict 'refs';
+ no warnings 'once';
+ my $class = ref($_[0]) || $_[0];
+ DEBUG and warn "Lex refs lookup on $class\n";
+ return $isa_scan{$class} if exists $isa_scan{$class}; # memoization!
+
+ my @lex_refs;
+ my $seen_r = ref($_[1]) ? $_[1] : {};
+
+ if( defined( *{$class . '::Lexicon'}{'HASH'} )) {
+ push @lex_refs, *{$class . '::Lexicon'}{'HASH'};
+ DEBUG and warn '%' . $class . '::Lexicon contains ',
+ scalar(keys %{$class . '::Lexicon'}), " entries\n";
+ }
+
+ # Implements depth(height?)-first recursive searching of superclasses.
+ # In hindsight, I suppose I could have just used Class::ISA!
+ foreach my $superclass (@{$class . '::ISA'}) {
+ DEBUG and warn " Super-class search into $superclass\n";
+ next if $seen_r->{$superclass}++;
+ push @lex_refs, @{&_lex_refs($superclass, $seen_r)}; # call myself
+ }
+
+ $isa_scan{$class} = \@lex_refs; # save for next time
+ return \@lex_refs;
+}
+
+sub clear_isa_scan { %isa_scan = (); return; } # end on a note of simplicity!
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Maketext.pod b/Master/tlpkg/tlperl.straw/lib/Locale/Maketext.pod
new file mode 100755
index 00000000000..15533e4e870
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Maketext.pod
@@ -0,0 +1,1326 @@
+
+# Time-stamp: "2004-01-11 18:35:34 AST"
+
+=head1 NAME
+
+Locale::Maketext - framework for localization
+
+=head1 SYNOPSIS
+
+ package MyProgram;
+ use strict;
+ use MyProgram::L10N;
+ # ...which inherits from Locale::Maketext
+ my $lh = MyProgram::L10N->get_handle() || die "What language?";
+ ...
+ # And then any messages your program emits, like:
+ warn $lh->maketext( "Can't open file [_1]: [_2]\n", $f, $! );
+ ...
+
+=head1 DESCRIPTION
+
+It is a common feature of applications (whether run directly,
+or via the Web) for them to be "localized" -- i.e., for them
+to a present an English interface to an English-speaker, a German
+interface to a German-speaker, and so on for all languages it's
+programmed with. Locale::Maketext
+is a framework for software localization; it provides you with the
+tools for organizing and accessing the bits of text and text-processing
+code that you need for producing localized applications.
+
+In order to make sense of Maketext and how all its
+components fit together, you should probably
+go read L<Locale::Maketext::TPJ13|Locale::Maketext::TPJ13>, and
+I<then> read the following documentation.
+
+You may also want to read over the source for C<File::Findgrep>
+and its constituent modules -- they are a complete (if small)
+example application that uses Maketext.
+
+=head1 QUICK OVERVIEW
+
+The basic design of Locale::Maketext is object-oriented, and
+Locale::Maketext is an abstract base class, from which you
+derive a "project class".
+The project class (with a name like "TkBocciBall::Localize",
+which you then use in your module) is in turn the base class
+for all the "language classes" for your project
+(with names "TkBocciBall::Localize::it",
+"TkBocciBall::Localize::en",
+"TkBocciBall::Localize::fr", etc.).
+
+A language class is
+a class containing a lexicon of phrases as class data,
+and possibly also some methods that are of use in interpreting
+phrases in the lexicon, or otherwise dealing with text in that
+language.
+
+An object belonging to a language class is called a "language
+handle"; it's typically a flyweight object.
+
+The normal course of action is to call:
+
+ use TkBocciBall::Localize; # the localization project class
+ $lh = TkBocciBall::Localize->get_handle();
+ # Depending on the user's locale, etc., this will
+ # make a language handle from among the classes available,
+ # and any defaults that you declare.
+ die "Couldn't make a language handle??" unless $lh;
+
+From then on, you use the C<maketext> function to access
+entries in whatever lexicon(s) belong to the language handle
+you got. So, this:
+
+ print $lh->maketext("You won!"), "\n";
+
+...emits the right text for this language. If the object
+in C<$lh> belongs to class "TkBocciBall::Localize::fr" and
+%TkBocciBall::Localize::fr::Lexicon contains C<("You won!"
+=E<gt> "Tu as gagnE<eacute>!")>, then the above
+code happily tells the user "Tu as gagnE<eacute>!".
+
+=head1 METHODS
+
+Locale::Maketext offers a variety of methods, which fall
+into three categories:
+
+=over
+
+=item *
+
+Methods to do with constructing language handles.
+
+=item *
+
+C<maketext> and other methods to do with accessing %Lexicon data
+for a given language handle.
+
+=item *
+
+Methods that you may find it handy to use, from routines of
+yours that you put in %Lexicon entries.
+
+=back
+
+These are covered in the following section.
+
+=head2 Construction Methods
+
+These are to do with constructing a language handle:
+
+=over
+
+=item *
+
+$lh = YourProjClass->get_handle( ...langtags... ) || die "lg-handle?";
+
+This tries loading classes based on the language-tags you give (like
+C<("en-US", "sk", "kon", "es-MX", "ja", "i-klingon")>, and for the first class
+that succeeds, returns YourProjClass::I<language>->new().
+
+If it runs thru the entire given list of language-tags, and finds no classes
+for those exact terms, it then tries "superordinate" language classes.
+So if no "en-US" class (i.e., YourProjClass::en_us)
+was found, nor classes for anything else in that list, we then try
+its superordinate, "en" (i.e., YourProjClass::en), and so on thru
+the other language-tags in the given list: "es".
+(The other language-tags in our example list:
+happen to have no superordinates.)
+
+If none of those language-tags leads to loadable classes, we then
+try classes derived from YourProjClass->fallback_languages() and
+then if nothing comes of that, we use classes named by
+YourProjClass->fallback_language_classes(). Then in the (probably
+quite unlikely) event that that fails, we just return undef.
+
+=item *
+
+$lh = YourProjClass->get_handleB<()> || die "lg-handle?";
+
+When C<get_handle> is called with an empty parameter list, magic happens:
+
+If C<get_handle> senses that it's running in program that was
+invoked as a CGI, then it tries to get language-tags out of the
+environment variable "HTTP_ACCEPT_LANGUAGE", and it pretends that
+those were the languages passed as parameters to C<get_handle>.
+
+Otherwise (i.e., if not a CGI), this tries various OS-specific ways
+to get the language-tags for the current locale/language, and then
+pretends that those were the value(s) passed to C<get_handle>.
+
+Currently this OS-specific stuff consists of looking in the environment
+variables "LANG" and "LANGUAGE"; and on MSWin machines (where those
+variables are typically unused), this also tries using
+the module Win32::Locale to get a language-tag for whatever language/locale
+is currently selected in the "Regional Settings" (or "International"?)
+Control Panel. I welcome further
+suggestions for making this do the Right Thing under other operating
+systems that support localization.
+
+If you're using localization in an application that keeps a configuration
+file, you might consider something like this in your project class:
+
+ sub get_handle_via_config {
+ my $class = $_[0];
+ my $chosen_language = $Config_settings{'language'};
+ my $lh;
+ if($chosen_language) {
+ $lh = $class->get_handle($chosen_language)
+ || die "No language handle for \"$chosen_language\" or the like";
+ } else {
+ # Config file missing, maybe?
+ $lh = $class->get_handle()
+ || die "Can't get a language handle";
+ }
+ return $lh;
+ }
+
+=item *
+
+$lh = YourProjClass::langname->new();
+
+This constructs a language handle. You usually B<don't> call this
+directly, but instead let C<get_handle> find a language class to C<use>
+and to then call ->new on.
+
+=item *
+
+$lh->init();
+
+This is called by ->new to initialize newly-constructed language handles.
+If you define an init method in your class, remember that it's usually
+considered a good idea to call $lh->SUPER::init in it (presumably at the
+beginning), so that all classes get a chance to initialize a new object
+however they see fit.
+
+=item *
+
+YourProjClass->fallback_languages()
+
+C<get_handle> appends the return value of this to the end of
+whatever list of languages you pass C<get_handle>. Unless
+you override this method, your project class
+will inherit Locale::Maketext's C<fallback_languages>, which
+currently returns C<('i-default', 'en', 'en-US')>.
+("i-default" is defined in RFC 2277).
+
+This method (by having it return the name
+of a language-tag that has an existing language class)
+can be used for making sure that
+C<get_handle> will always manage to construct a language
+handle (assuming your language classes are in an appropriate
+@INC directory). Or you can use the next method:
+
+=item *
+
+YourProjClass->fallback_language_classes()
+
+C<get_handle> appends the return value of this to the end
+of the list of classes it will try using. Unless
+you override this method, your project class
+will inherit Locale::Maketext's C<fallback_language_classes>,
+which currently returns an empty list, C<()>.
+By setting this to some value (namely, the name of a loadable
+language class), you can be sure that
+C<get_handle> will always manage to construct a language
+handle.
+
+=back
+
+=head2 The "maketext" Method
+
+This is the most important method in Locale::Maketext:
+
+ $text = $lh->maketext(I<key>, ...parameters for this phrase...);
+
+This looks in the %Lexicon of the language handle
+$lh and all its superclasses, looking
+for an entry whose key is the string I<key>. Assuming such
+an entry is found, various things then happen, depending on the
+value found:
+
+If the value is a scalarref, the scalar is dereferenced and returned
+(and any parameters are ignored).
+
+If the value is a coderef, we return &$value($lh, ...parameters...).
+
+If the value is a string that I<doesn't> look like it's in Bracket Notation,
+we return it (after replacing it with a scalarref, in its %Lexicon).
+
+If the value I<does> look like it's in Bracket Notation, then we compile
+it into a sub, replace the string in the %Lexicon with the new coderef,
+and then we return &$new_sub($lh, ...parameters...).
+
+Bracket Notation is discussed in a later section. Note
+that trying to compile a string into Bracket Notation can throw
+an exception if the string is not syntactically valid (say, by not
+balancing brackets right.)
+
+Also, calling &$coderef($lh, ...parameters...) can throw any sort of
+exception (if, say, code in that sub tries to divide by zero). But
+a very common exception occurs when you have Bracket
+Notation text that says to call a method "foo", but there is no such
+method. (E.g., "You have [quaB<tn>,_1,ball]." will throw an exception
+on trying to call $lh->quaB<tn>($_[1],'ball') -- you presumably meant
+"quant".) C<maketext> catches these exceptions, but only to make the
+error message more readable, at which point it rethrows the exception.
+
+An exception I<may> be thrown if I<key> is not found in any
+of $lh's %Lexicon hashes. What happens if a key is not found,
+is discussed in a later section, "Controlling Lookup Failure".
+
+Note that you might find it useful in some cases to override
+the C<maketext> method with an "after method", if you want to
+translate encodings, or even scripts:
+
+ package YrProj::zh_cn; # Chinese with PRC-style glyphs
+ use base ('YrProj::zh_tw'); # Taiwan-style
+ sub maketext {
+ my $self = shift(@_);
+ my $value = $self->maketext(@_);
+ return Chineeze::taiwan2mainland($value);
+ }
+
+Or you may want to override it with something that traps
+any exceptions, if that's critical to your program:
+
+ sub maketext {
+ my($lh, @stuff) = @_;
+ my $out;
+ eval { $out = $lh->SUPER::maketext(@stuff) };
+ return $out unless $@;
+ ...otherwise deal with the exception...
+ }
+
+Other than those two situations, I don't imagine that
+it's useful to override the C<maketext> method. (If
+you run into a situation where it is useful, I'd be
+interested in hearing about it.)
+
+=over
+
+=item $lh->fail_with I<or> $lh->fail_with(I<PARAM>)
+
+=item $lh->failure_handler_auto
+
+These two methods are discussed in the section "Controlling
+Lookup Failure".
+
+=back
+
+=head2 Utility Methods
+
+These are methods that you may find it handy to use, generally
+from %Lexicon routines of yours (whether expressed as
+Bracket Notation or not).
+
+=over
+
+=item $language->quant($number, $singular)
+
+=item $language->quant($number, $singular, $plural)
+
+=item $language->quant($number, $singular, $plural, $negative)
+
+This is generally meant to be called from inside Bracket Notation
+(which is discussed later), as in
+
+ "Your search matched [quant,_1,document]!"
+
+It's for I<quantifying> a noun (i.e., saying how much of it there is,
+while giving the correct form of it). The behavior of this method is
+handy for English and a few other Western European languages, and you
+should override it for languages where it's not suitable. You can feel
+free to read the source, but the current implementation is basically
+as this pseudocode describes:
+
+ if $number is 0 and there's a $negative,
+ return $negative;
+ elsif $number is 1,
+ return "1 $singular";
+ elsif there's a $plural,
+ return "$number $plural";
+ else
+ return "$number " . $singular . "s";
+ #
+ # ...except that we actually call numf to
+ # stringify $number before returning it.
+
+So for English (with Bracket Notation)
+C<"...[quant,_1,file]..."> is fine (for 0 it returns "0 files",
+for 1 it returns "1 file", and for more it returns "2 files", etc.)
+
+But for "directory", you'd want C<"[quant,_1,directory,directories]">
+so that our elementary C<quant> method doesn't think that the
+plural of "directory" is "directorys". And you might find that the
+output may sound better if you specify a negative form, as in:
+
+ "[quant,_1,file,files,No files] matched your query.\n"
+
+Remember to keep in mind verb agreement (or adjectives too, in
+other languages), as in:
+
+ "[quant,_1,document] were matched.\n"
+
+Because if _1 is one, you get "1 document B<were> matched".
+An acceptable hack here is to do something like this:
+
+ "[quant,_1,document was, documents were] matched.\n"
+
+=item $language->numf($number)
+
+This returns the given number formatted nicely according to
+this language's conventions. Maketext's default method is
+mostly to just take the normal string form of the number
+(applying sprintf "%G" for only very large numbers), and then
+to add commas as necessary. (Except that
+we apply C<tr/,./.,/> if $language->{'numf_comma'} is true;
+that's a bit of a hack that's useful for languages that express
+two million as "2.000.000" and not as "2,000,000").
+
+If you want anything fancier, consider overriding this with something
+that uses L<Number::Format|Number::Format>, or does something else
+entirely.
+
+Note that numf is called by quant for stringifying all quantifying
+numbers.
+
+=item $language->sprintf($format, @items)
+
+This is just a wrapper around Perl's normal C<sprintf> function.
+It's provided so that you can use "sprintf" in Bracket Notation:
+
+ "Couldn't access datanode [sprintf,%10x=~[%s~],_1,_2]!\n"
+
+returning...
+
+ Couldn't access datanode Stuff=[thangamabob]!
+
+=item $language->language_tag()
+
+Currently this just takes the last bit of C<ref($language)>, turns
+underscores to dashes, and returns it. So if $language is
+an object of class Hee::HOO::Haw::en_us, $language->language_tag()
+returns "en-us". (Yes, the usual representation for that language
+tag is "en-US", but case is I<never> considered meaningful in
+language-tag comparison.)
+
+You may override this as you like; Maketext doesn't use it for
+anything.
+
+=item $language->encoding()
+
+Currently this isn't used for anything, but it's provided
+(with default value of
+C<(ref($language) && $language-E<gt>{'encoding'})) or "iso-8859-1">
+) as a sort of suggestion that it may be useful/necessary to
+associate encodings with your language handles (whether on a
+per-class or even per-handle basis.)
+
+=back
+
+=head2 Language Handle Attributes and Internals
+
+A language handle is a flyweight object -- i.e., it doesn't (necessarily)
+carry any data of interest, other than just being a member of
+whatever class it belongs to.
+
+A language handle is implemented as a blessed hash. Subclasses of yours
+can store whatever data you want in the hash. Currently the only hash
+entry used by any crucial Maketext method is "fail", so feel free to
+use anything else as you like.
+
+B<Remember: Don't be afraid to read the Maketext source if there's
+any point on which this documentation is unclear.> This documentation
+is vastly longer than the module source itself.
+
+=over
+
+=back
+
+=head1 LANGUAGE CLASS HIERARCHIES
+
+These are Locale::Maketext's assumptions about the class
+hierarchy formed by all your language classes:
+
+=over
+
+=item *
+
+You must have a project base class, which you load, and
+which you then use as the first argument in
+the call to YourProjClass->get_handle(...). It should derive
+(whether directly or indirectly) from Locale::Maketext.
+It B<doesn't matter> how you name this class, although assuming this
+is the localization component of your Super Mega Program,
+good names for your project class might be
+SuperMegaProgram::Localization, SuperMegaProgram::L10N,
+SuperMegaProgram::I18N, SuperMegaProgram::International,
+or even SuperMegaProgram::Languages or SuperMegaProgram::Messages.
+
+=item *
+
+Language classes are what YourProjClass->get_handle will try to load.
+It will look for them by taking each language-tag (B<skipping> it
+if it doesn't look like a language-tag or locale-tag!), turning it to
+all lowercase, turning dashes to underscores, and appending it
+to YourProjClass . "::". So this:
+
+ $lh = YourProjClass->get_handle(
+ 'en-US', 'fr', 'kon', 'i-klingon', 'i-klingon-romanized'
+ );
+
+will try loading the classes
+YourProjClass::en_us (note lowercase!), YourProjClass::fr,
+YourProjClass::kon,
+YourProjClass::i_klingon
+and YourProjClass::i_klingon_romanized. (And it'll stop at the
+first one that actually loads.)
+
+=item *
+
+I assume that each language class derives (directly or indirectly)
+from your project class, and also defines its @ISA, its %Lexicon,
+or both. But I anticipate no dire consequences if these assumptions
+do not hold.
+
+=item *
+
+Language classes may derive from other language classes (although they
+should have "use I<Thatclassname>" or "use base qw(I<...classes...>)").
+They may derive from the project
+class. They may derive from some other class altogether. Or via
+multiple inheritance, it may derive from any mixture of these.
+
+=item *
+
+I foresee no problems with having multiple inheritance in
+your hierarchy of language classes. (As usual, however, Perl will
+complain bitterly if you have a cycle in the hierarchy: i.e., if
+any class is its own ancestor.)
+
+=back
+
+=head1 ENTRIES IN EACH LEXICON
+
+A typical %Lexicon entry is meant to signify a phrase,
+taking some number (0 or more) of parameters. An entry
+is meant to be accessed by via
+a string I<key> in $lh->maketext(I<key>, ...parameters...),
+which should return a string that is generally meant for
+be used for "output" to the user -- regardless of whether
+this actually means printing to STDOUT, writing to a file,
+or putting into a GUI widget.
+
+While the key must be a string value (since that's a basic
+restriction that Perl places on hash keys), the value in
+the lexicon can currently be of several types:
+a defined scalar, scalarref, or coderef. The use of these is
+explained above, in the section 'The "maketext" Method', and
+Bracket Notation for strings is discussed in the next section.
+
+While you can use arbitrary unique IDs for lexicon keys
+(like "_min_larger_max_error"), it is often
+useful for if an entry's key is itself a valid value, like
+this example error message:
+
+ "Minimum ([_1]) is larger than maximum ([_2])!\n",
+
+Compare this code that uses an arbitrary ID...
+
+ die $lh->maketext( "_min_larger_max_error", $min, $max )
+ if $min > $max;
+
+...to this code that uses a key-as-value:
+
+ die $lh->maketext(
+ "Minimum ([_1]) is larger than maximum ([_2])!\n",
+ $min, $max
+ ) if $min > $max;
+
+The second is, in short, more readable. In particular, it's obvious
+that the number of parameters you're feeding to that phrase (two) is
+the number of parameters that it I<wants> to be fed. (Since you see
+_1 and a _2 being used in the key there.)
+
+Also, once a project is otherwise
+complete and you start to localize it, you can scrape together
+all the various keys you use, and pass it to a translator; and then
+the translator's work will go faster if what he's presented is this:
+
+ "Minimum ([_1]) is larger than maximum ([_2])!\n",
+ => "", # fill in something here, Jacques!
+
+rather than this more cryptic mess:
+
+ "_min_larger_max_error"
+ => "", # fill in something here, Jacques
+
+I think that keys as lexicon values makes the completed lexicon
+entries more readable:
+
+ "Minimum ([_1]) is larger than maximum ([_2])!\n",
+ => "Le minimum ([_1]) est plus grand que le maximum ([_2])!\n",
+
+Also, having valid values as keys becomes very useful if you set
+up an _AUTO lexicon. _AUTO lexicons are discussed in a later
+section.
+
+I almost always use keys that are themselves
+valid lexicon values. One notable exception is when the value is
+quite long. For example, to get the screenful of data that
+a command-line program might return when given an unknown switch,
+I often just use a brief, self-explanatory key such as "_USAGE_MESSAGE". At that point I then go
+and immediately to define that lexicon entry in the
+ProjectClass::L10N::en lexicon (since English is always my "project
+language"):
+
+ '_USAGE_MESSAGE' => <<'EOSTUFF',
+ ...long long message...
+ EOSTUFF
+
+and then I can use it as:
+
+ getopt('oDI', \%opts) or die $lh->maketext('_USAGE_MESSAGE');
+
+Incidentally,
+note that each class's C<%Lexicon> inherits-and-extends
+the lexicons in its superclasses. This is not because these are
+special hashes I<per se>, but because you access them via the
+C<maketext> method, which looks for entries across all the
+C<%Lexicon> hashes in a language class I<and> all its ancestor classes.
+(This is because the idea of "class data" isn't directly implemented
+in Perl, but is instead left to individual class-systems to implement
+as they see fit..)
+
+Note that you may have things stored in a lexicon
+besides just phrases for output: for example, if your program
+takes input from the keyboard, asking a "(Y/N)" question,
+you probably need to know what the equivalent of "Y[es]/N[o]" is
+in whatever language. You probably also need to know what
+the equivalents of the answers "y" and "n" are. You can
+store that information in the lexicon (say, under the keys
+"~answer_y" and "~answer_n", and the long forms as
+"~answer_yes" and "~answer_no", where "~" is just an ad-hoc
+character meant to indicate to programmers/translators that
+these are not phrases for output).
+
+Or instead of storing this in the language class's lexicon,
+you can (and, in some cases, really should) represent the same bit
+of knowledge as code in a method in the language class. (That
+leaves a tidy distinction between the lexicon as the things we
+know how to I<say>, and the rest of the things in the lexicon class
+as things that we know how to I<do>.) Consider
+this example of a processor for responses to French "oui/non"
+questions:
+
+ sub y_or_n {
+ return undef unless defined $_[1] and length $_[1];
+ my $answer = lc $_[1]; # smash case
+ return 1 if $answer eq 'o' or $answer eq 'oui';
+ return 0 if $answer eq 'n' or $answer eq 'non';
+ return undef;
+ }
+
+...which you'd then call in a construct like this:
+
+ my $response;
+ until(defined $response) {
+ print $lh->maketext("Open the pod bay door (y/n)? ");
+ $response = $lh->y_or_n( get_input_from_keyboard_somehow() );
+ }
+ if($response) { $pod_bay_door->open() }
+ else { $pod_bay_door->leave_closed() }
+
+Other data worth storing in a lexicon might be things like
+filenames for language-targetted resources:
+
+ ...
+ "_main_splash_png"
+ => "/styles/en_us/main_splash.png",
+ "_main_splash_imagemap"
+ => "/styles/en_us/main_splash.incl",
+ "_general_graphics_path"
+ => "/styles/en_us/",
+ "_alert_sound"
+ => "/styles/en_us/hey_there.wav",
+ "_forward_icon"
+ => "left_arrow.png",
+ "_backward_icon"
+ => "right_arrow.png",
+ # In some other languages, left equals
+ # BACKwards, and right is FOREwards.
+ ...
+
+You might want to do the same thing for expressing key bindings
+or the like (since hardwiring "q" as the binding for the function
+that quits a screen/menu/program is useful only if your language
+happens to associate "q" with "quit"!)
+
+=head1 BRACKET NOTATION
+
+Bracket Notation is a crucial feature of Locale::Maketext. I mean
+Bracket Notation to provide a replacement for the use of sprintf formatting.
+Everything you do with Bracket Notation could be done with a sub block,
+but bracket notation is meant to be much more concise.
+
+Bracket Notation is a like a miniature "template" system (in the sense
+of L<Text::Template|Text::Template>, not in the sense of C++ templates),
+where normal text is passed thru basically as is, but text in special
+regions is specially interpreted. In Bracket Notation, you use square brackets ("[...]"),
+not curly braces ("{...}") to note sections that are specially interpreted.
+
+For example, here all the areas that are taken literally are underlined with
+a "^", and all the in-bracket special regions are underlined with an X:
+
+ "Minimum ([_1]) is larger than maximum ([_2])!\n",
+ ^^^^^^^^^ XX ^^^^^^^^^^^^^^^^^^^^^^^^^^ XX ^^^^
+
+When that string is compiled from bracket notation into a real Perl sub,
+it's basically turned into:
+
+ sub {
+ my $lh = $_[0];
+ my @params = @_;
+ return join '',
+ "Minimum (",
+ ...some code here...
+ ") is larger than maximum (",
+ ...some code here...
+ ")!\n",
+ }
+ # to be called by $lh->maketext(KEY, params...)
+
+In other words, text outside bracket groups is turned into string
+literals. Text in brackets is rather more complex, and currently follows
+these rules:
+
+=over
+
+=item *
+
+Bracket groups that are empty, or which consist only of whitespace,
+are ignored. (Examples: "[]", "[ ]", or a [ and a ] with returns
+and/or tabs and/or spaces between them.
+
+Otherwise, each group is taken to be a comma-separated group of items,
+and each item is interpreted as follows:
+
+=item *
+
+An item that is "_I<digits>" or "_-I<digits>" is interpreted as
+$_[I<value>]. I.e., "_1" becomes with $_[1], and "_-3" is interpreted
+as $_[-3] (in which case @_ should have at least three elements in it).
+Note that $_[0] is the language handle, and is typically not named
+directly.
+
+=item *
+
+An item "_*" is interpreted to mean "all of @_ except $_[0]".
+I.e., C<@_[1..$#_]>. Note that this is an empty list in the case
+of calls like $lh->maketext(I<key>) where there are no
+parameters (except $_[0], the language handle).
+
+=item *
+
+Otherwise, each item is interpreted as a string literal.
+
+=back
+
+The group as a whole is interpreted as follows:
+
+=over
+
+=item *
+
+If the first item in a bracket group looks like a method name,
+then that group is interpreted like this:
+
+ $lh->that_method_name(
+ ...rest of items in this group...
+ ),
+
+=item *
+
+If the first item in a bracket group is "*", it's taken as shorthand
+for the so commonly called "quant" method. Similarly, if the first
+item in a bracket group is "#", it's taken to be shorthand for
+"numf".
+
+=item *
+
+If the first item in a bracket group is the empty-string, or "_*"
+or "_I<digits>" or "_-I<digits>", then that group is interpreted
+as just the interpolation of all its items:
+
+ join('',
+ ...rest of items in this group...
+ ),
+
+Examples: "[_1]" and "[,_1]", which are synonymous; and
+"C<[,ID-(,_4,-,_2,)]>", which compiles as
+C<join "", "ID-(", $_[4], "-", $_[2], ")">.
+
+=item *
+
+Otherwise this bracket group is invalid. For example, in the group
+"[!@#,whatever]", the first item C<"!@#"> is neither the empty-string,
+"_I<number>", "_-I<number>", "_*", nor a valid method name; and so
+Locale::Maketext will throw an exception of you try compiling an
+expression containing this bracket group.
+
+=back
+
+Note, incidentally, that items in each group are comma-separated,
+not C</\s*,\s*/>-separated. That is, you might expect that this
+bracket group:
+
+ "Hoohah [foo, _1 , bar ,baz]!"
+
+would compile to this:
+
+ sub {
+ my $lh = $_[0];
+ return join '',
+ "Hoohah ",
+ $lh->foo( $_[1], "bar", "baz"),
+ "!",
+ }
+
+But it actually compiles as this:
+
+ sub {
+ my $lh = $_[0];
+ return join '',
+ "Hoohah ",
+ $lh->foo(" _1 ", " bar ", "baz"), # note the <space> in " bar "
+ "!",
+ }
+
+In the notation discussed so far, the characters "[" and "]" are given
+special meaning, for opening and closing bracket groups, and "," has
+a special meaning inside bracket groups, where it separates items in the
+group. This begs the question of how you'd express a literal "[" or
+"]" in a Bracket Notation string, and how you'd express a literal
+comma inside a bracket group. For this purpose I've adopted "~" (tilde)
+as an escape character: "~[" means a literal '[' character anywhere
+in Bracket Notation (i.e., regardless of whether you're in a bracket
+group or not), and ditto for "~]" meaning a literal ']', and "~," meaning
+a literal comma. (Altho "," means a literal comma outside of
+bracket groups -- it's only inside bracket groups that commas are special.)
+
+And on the off chance you need a literal tilde in a bracket expression,
+you get it with "~~".
+
+Currently, an unescaped "~" before a character
+other than a bracket or a comma is taken to mean just a "~" and that
+character. I.e., "~X" means the same as "~~X" -- i.e., one literal tilde,
+and then one literal "X". However, by using "~X", you are assuming that
+no future version of Maketext will use "~X" as a magic escape sequence.
+In practice this is not a great problem, since first off you can just
+write "~~X" and not worry about it; second off, I doubt I'll add lots
+of new magic characters to bracket notation; and third off, you
+aren't likely to want literal "~" characters in your messages anyway,
+since it's not a character with wide use in natural language text.
+
+Brackets must be balanced -- every openbracket must have
+one matching closebracket, and vice versa. So these are all B<invalid>:
+
+ "I ate [quant,_1,rhubarb pie."
+ "I ate [quant,_1,rhubarb pie[."
+ "I ate quant,_1,rhubarb pie]."
+ "I ate quant,_1,rhubarb pie[."
+
+Currently, bracket groups do not nest. That is, you B<cannot> say:
+
+ "Foo [bar,baz,[quux,quuux]]\n";
+
+If you need a notation that's that powerful, use normal Perl:
+
+ %Lexicon = (
+ ...
+ "some_key" => sub {
+ my $lh = $_[0];
+ join '',
+ "Foo ",
+ $lh->bar('baz', $lh->quux('quuux')),
+ "\n",
+ },
+ ...
+ );
+
+Or write the "bar" method so you don't need to pass it the
+output from calling quux.
+
+I do not anticipate that you will need (or particularly want)
+to nest bracket groups, but you are welcome to email me with
+convincing (real-life) arguments to the contrary.
+
+=head1 AUTO LEXICONS
+
+If maketext goes to look in an individual %Lexicon for an entry
+for I<key> (where I<key> does not start with an underscore), and
+sees none, B<but does see> an entry of "_AUTO" => I<some_true_value>,
+then we actually define $Lexicon{I<key>} = I<key> right then and there,
+and then use that value as if it had been there all
+along. This happens before we even look in any superclass %Lexicons!
+
+(This is meant to be somewhat like the AUTOLOAD mechanism in
+Perl's function call system -- or, looked at another way,
+like the L<AutoLoader|AutoLoader> module.)
+
+I can picture all sorts of circumstances where you just
+do not want lookup to be able to fail (since failing
+normally means that maketext throws a C<die>, although
+see the next section for greater control over that). But
+here's one circumstance where _AUTO lexicons are meant to
+be I<especially> useful:
+
+As you're writing an application, you decide as you go what messages
+you need to emit. Normally you'd go to write this:
+
+ if(-e $filename) {
+ go_process_file($filename)
+ } else {
+ print qq{Couldn't find file "$filename"!\n};
+ }
+
+but since you anticipate localizing this, you write:
+
+ use ThisProject::I18N;
+ my $lh = ThisProject::I18N->get_handle();
+ # For the moment, assume that things are set up so
+ # that we load class ThisProject::I18N::en
+ # and that that's the class that $lh belongs to.
+ ...
+ if(-e $filename) {
+ go_process_file($filename)
+ } else {
+ print $lh->maketext(
+ qq{Couldn't find file "[_1]"!\n}, $filename
+ );
+ }
+
+Now, right after you've just written the above lines, you'd
+normally have to go open the file
+ThisProject/I18N/en.pm, and immediately add an entry:
+
+ "Couldn't find file \"[_1]\"!\n"
+ => "Couldn't find file \"[_1]\"!\n",
+
+But I consider that somewhat of a distraction from the work
+of getting the main code working -- to say nothing of the fact
+that I often have to play with the program a few times before
+I can decide exactly what wording I want in the messages (which
+in this case would require me to go changing three lines of code:
+the call to maketext with that key, and then the two lines in
+ThisProject/I18N/en.pm).
+
+However, if you set "_AUTO => 1" in the %Lexicon in,
+ThisProject/I18N/en.pm (assuming that English (en) is
+the language that all your programmers will be using for this
+project's internal message keys), then you don't ever have to
+go adding lines like this
+
+ "Couldn't find file \"[_1]\"!\n"
+ => "Couldn't find file \"[_1]\"!\n",
+
+to ThisProject/I18N/en.pm, because if _AUTO is true there,
+then just looking for an entry with the key "Couldn't find
+file \"[_1]\"!\n" in that lexicon will cause it to be added,
+with that value!
+
+Note that the reason that keys that start with "_"
+are immune to _AUTO isn't anything generally magical about
+the underscore character -- I just wanted a way to have most
+lexicon keys be autoable, except for possibly a few, and I
+arbitrarily decided to use a leading underscore as a signal
+to distinguish those few.
+
+=head1 CONTROLLING LOOKUP FAILURE
+
+If you call $lh->maketext(I<key>, ...parameters...),
+and there's no entry I<key> in $lh's class's %Lexicon, nor
+in the superclass %Lexicon hash, I<and> if we can't auto-make
+I<key> (because either it starts with a "_", or because none
+of its lexicons have C<_AUTO =E<gt> 1,>), then we have
+failed to find a normal way to maketext I<key>. What then
+happens in these failure conditions, depends on the $lh object's
+"fail" attribute.
+
+If the language handle has no "fail" attribute, maketext
+will simply throw an exception (i.e., it calls C<die>, mentioning
+the I<key> whose lookup failed, and naming the line number where
+the calling $lh->maketext(I<key>,...) was.
+
+If the language handle has a "fail" attribute whose value is a
+coderef, then $lh->maketext(I<key>,...params...) gives up and calls:
+
+ return $that_subref->($lh, $key, @params);
+
+Otherwise, the "fail" attribute's value should be a string denoting
+a method name, so that $lh->maketext(I<key>,...params...) can
+give up with:
+
+ return $lh->$that_method_name($phrase, @params);
+
+The "fail" attribute can be accessed with the C<fail_with> method:
+
+ # Set to a coderef:
+ $lh->fail_with( \&failure_handler );
+
+ # Set to a method name:
+ $lh->fail_with( 'failure_method' );
+
+ # Set to nothing (i.e., so failure throws a plain exception)
+ $lh->fail_with( undef );
+
+ # Get the current value
+ $handler = $lh->fail_with();
+
+Now, as to what you may want to do with these handlers: Maybe you'd
+want to log what key failed for what class, and then die. Maybe
+you don't like C<die> and instead you want to send the error message
+to STDOUT (or wherever) and then merely C<exit()>.
+
+Or maybe you don't want to C<die> at all! Maybe you could use a
+handler like this:
+
+ # Make all lookups fall back onto an English value,
+ # but only after we log it for later fingerpointing.
+ my $lh_backup = ThisProject->get_handle('en');
+ open(LEX_FAIL_LOG, ">>wherever/lex.log") || die "GNAARGH $!";
+ sub lex_fail {
+ my($failing_lh, $key, $params) = @_;
+ print LEX_FAIL_LOG scalar(localtime), "\t",
+ ref($failing_lh), "\t", $key, "\n";
+ return $lh_backup->maketext($key,@params);
+ }
+
+Some users have expressed that they think this whole mechanism of
+having a "fail" attribute at all, seems a rather pointless complication.
+But I want Locale::Maketext to be usable for software projects of I<any>
+scale and type; and different software projects have different ideas
+of what the right thing is to do in failure conditions. I could simply
+say that failure always throws an exception, and that if you want to be
+careful, you'll just have to wrap every call to $lh->maketext in an
+S<eval { }>. However, I want programmers to reserve the right (via
+the "fail" attribute) to treat lookup failure as something other than
+an exception of the same level of severity as a config file being
+unreadable, or some essential resource being inaccessible.
+
+One possibly useful value for the "fail" attribute is the method name
+"failure_handler_auto". This is a method defined in the class
+Locale::Maketext itself. You set it with:
+
+ $lh->fail_with('failure_handler_auto');
+
+Then when you call $lh->maketext(I<key>, ...parameters...) and
+there's no I<key> in any of those lexicons, maketext gives up with
+
+ return $lh->failure_handler_auto($key, @params);
+
+But failure_handler_auto, instead of dying or anything, compiles
+$key, caching it in
+
+ $lh->{'failure_lex'}{$key} = $complied
+
+and then calls the compiled value, and returns that. (I.e., if
+$key looks like bracket notation, $compiled is a sub, and we return
+&{$compiled}(@params); but if $key is just a plain string, we just
+return that.)
+
+The effect of using "failure_auto_handler"
+is like an AUTO lexicon, except that it 1) compiles $key even if
+it starts with "_", and 2) you have a record in the new hashref
+$lh->{'failure_lex'} of all the keys that have failed for
+this object. This should avoid your program dying -- as long
+as your keys aren't actually invalid as bracket code, and as
+long as they don't try calling methods that don't exist.
+
+"failure_auto_handler" may not be exactly what you want, but I
+hope it at least shows you that maketext failure can be mitigated
+in any number of very flexible ways. If you can formalize exactly
+what you want, you should be able to express that as a failure
+handler. You can even make it default for every object of a given
+class, by setting it in that class's init:
+
+ sub init {
+ my $lh = $_[0]; # a newborn handle
+ $lh->SUPER::init();
+ $lh->fail_with('my_clever_failure_handler');
+ return;
+ }
+ sub my_clever_failure_handler {
+ ...you clever things here...
+ }
+
+=head1 HOW TO USE MAKETEXT
+
+Here is a brief checklist on how to use Maketext to localize
+applications:
+
+=over
+
+=item *
+
+Decide what system you'll use for lexicon keys. If you insist,
+you can use opaque IDs (if you're nostalgic for C<catgets>),
+but I have better suggestions in the
+section "Entries in Each Lexicon", above. Assuming you opt for
+meaningful keys that double as values (like "Minimum ([_1]) is
+larger than maximum ([_2])!\n"), you'll have to settle on what
+language those should be in. For the sake of argument, I'll
+call this English, specifically American English, "en-US".
+
+=item *
+
+Create a class for your localization project. This is
+the name of the class that you'll use in the idiom:
+
+ use Projname::L10N;
+ my $lh = Projname::L10N->get_handle(...) || die "Language?";
+
+Assuming you call your class Projname::L10N, create a class
+consisting minimally of:
+
+ package Projname::L10N;
+ use base qw(Locale::Maketext);
+ ...any methods you might want all your languages to share...
+
+ # And, assuming you want the base class to be an _AUTO lexicon,
+ # as is discussed a few sections up:
+
+ 1;
+
+=item *
+
+Create a class for the language your internal keys are in. Name
+the class after the language-tag for that language, in lowercase,
+with dashes changed to underscores. Assuming your project's first
+language is US English, you should call this Projname::L10N::en_us.
+It should consist minimally of:
+
+ package Projname::L10N::en_us;
+ use base qw(Projname::L10N);
+ %Lexicon = (
+ '_AUTO' => 1,
+ );
+ 1;
+
+(For the rest of this section, I'll assume that this "first
+language class" of Projname::L10N::en_us has
+_AUTO lexicon.)
+
+=item *
+
+Go and write your program. Everywhere in your program where
+you would say:
+
+ print "Foobar $thing stuff\n";
+
+instead do it thru maketext, using no variable interpolation in
+the key:
+
+ print $lh->maketext("Foobar [_1] stuff\n", $thing);
+
+If you get tired of constantly saying C<print $lh-E<gt>maketext>,
+consider making a functional wrapper for it, like so:
+
+ use Projname::L10N;
+ use vars qw($lh);
+ $lh = Projname::L10N->get_handle(...) || die "Language?";
+ sub pmt (@) { print( $lh->maketext(@_)) }
+ # "pmt" is short for "Print MakeText"
+ $Carp::Verbose = 1;
+ # so if maketext fails, we see made the call to pmt
+
+Besides whole phrases meant for output, anything language-dependent
+should be put into the class Projname::L10N::en_us,
+whether as methods, or as lexicon entries -- this is discussed
+in the section "Entries in Each Lexicon", above.
+
+=item *
+
+Once the program is otherwise done, and once its localization for
+the first language works right (via the data and methods in
+Projname::L10N::en_us), you can get together the data for translation.
+If your first language lexicon isn't an _AUTO lexicon, then you already
+have all the messages explicitly in the lexicon (or else you'd be
+getting exceptions thrown when you call $lh->maketext to get
+messages that aren't in there). But if you were (advisedly) lazy and are
+using an _AUTO lexicon, then you've got to make a list of all the phrases
+that you've so far been letting _AUTO generate for you. There are very
+many ways to assemble such a list. The most straightforward is to simply
+grep the source for every occurrence of "maketext" (or calls
+to wrappers around it, like the above C<pmt> function), and to log the
+following phrase.
+
+=item *
+
+You may at this point want to consider whether your base class
+(Projname::L10N), from which all lexicons inherit from (Projname::L10N::en,
+Projname::L10N::es, etc.), should be an _AUTO lexicon. It may be true
+that in theory, all needed messages will be in each language class;
+but in the presumably unlikely or "impossible" case of lookup failure,
+you should consider whether your program should throw an exception,
+emit text in English (or whatever your project's first language is),
+or some more complex solution as described in the section
+"Controlling Lookup Failure", above.
+
+=item *
+
+Submit all messages/phrases/etc. to translators.
+
+(You may, in fact, want to start with localizing to I<one> other language
+at first, if you're not sure that you've properly abstracted the
+language-dependent parts of your code.)
+
+Translators may request clarification of the situation in which a
+particular phrase is found. For example, in English we are entirely happy
+saying "I<n> files found", regardless of whether we mean "I looked for files,
+and found I<n> of them" or the rather distinct situation of "I looked for
+something else (like lines in files), and along the way I saw I<n>
+files." This may involve rethinking things that you thought quite clear:
+should "Edit" on a toolbar be a noun ("editing") or a verb ("to edit")? Is
+there already a conventionalized way to express that menu option, separate
+from the target language's normal word for "to edit"?
+
+In all cases where the very common phenomenon of quantification
+(saying "I<N> files", for B<any> value of N)
+is involved, each translator should make clear what dependencies the
+number causes in the sentence. In many cases, dependency is
+limited to words adjacent to the number, in places where you might
+expect them ("I found the-?PLURAL I<N>
+empty-?PLURAL directory-?PLURAL"), but in some cases there are
+unexpected dependencies ("I found-?PLURAL ..."!) as well as long-distance
+dependencies "The I<N> directory-?PLURAL could not be deleted-?PLURAL"!).
+
+Remind the translators to consider the case where N is 0:
+"0 files found" isn't exactly natural-sounding in any language, but it
+may be unacceptable in many -- or it may condition special
+kinds of agreement (similar to English "I didN'T find ANY files").
+
+Remember to ask your translators about numeral formatting in their
+language, so that you can override the C<numf> method as
+appropriate. Typical variables in number formatting are: what to
+use as a decimal point (comma? period?); what to use as a thousands
+separator (space? nonbreaking space? comma? period? small
+middot? prime? apostrophe?); and even whether the so-called "thousands
+separator" is actually for every third digit -- I've heard reports of
+two hundred thousand being expressible as "2,00,000" for some Indian
+(Subcontinental) languages, besides the less surprising "S<200 000>",
+"200.000", "200,000", and "200'000". Also, using a set of numeral
+glyphs other than the usual ASCII "0"-"9" might be appreciated, as via
+C<tr/0-9/\x{0966}-\x{096F}/> for getting digits in Devanagari script
+(for Hindi, Konkani, others).
+
+The basic C<quant> method that Locale::Maketext provides should be
+good for many languages. For some languages, it might be useful
+to modify it (or its constituent C<numerate> method)
+to take a plural form in the two-argument call to C<quant>
+(as in "[quant,_1,files]") if
+it's all-around easier to infer the singular form from the plural, than
+to infer the plural form from the singular.
+
+But for other languages (as is discussed at length
+in L<Locale::Maketext::TPJ13|Locale::Maketext::TPJ13>), simple
+C<quant>/C<numerify> is not enough. For the particularly problematic
+Slavic languages, what you may need is a method which you provide
+with the number, the citation form of the noun to quantify, and
+the case and gender that the sentence's syntax projects onto that
+noun slot. The method would then be responsible for determining
+what grammatical number that numeral projects onto its noun phrase,
+and what case and gender it may override the normal case and gender
+with; and then it would look up the noun in a lexicon providing
+all needed inflected forms.
+
+=item *
+
+You may also wish to discuss with the translators the question of
+how to relate different subforms of the same language tag,
+considering how this reacts with C<get_handle>'s treatment of
+these. For example, if a user accepts interfaces in "en, fr", and
+you have interfaces available in "en-US" and "fr", what should
+they get? You may wish to resolve this by establishing that "en"
+and "en-US" are effectively synonymous, by having one class
+zero-derive from the other.
+
+For some languages this issue may never come up (Danish is rarely
+expressed as "da-DK", but instead is just "da"). And for other
+languages, the whole concept of a "generic" form may verge on
+being uselessly vague, particularly for interfaces involving voice
+media in forms of Arabic or Chinese.
+
+=item *
+
+Once you've localized your program/site/etc. for all desired
+languages, be sure to show the result (whether live, or via
+screenshots) to the translators. Once they approve, make every
+effort to have it then checked by at least one other speaker of
+that language. This holds true even when (or especially when) the
+translation is done by one of your own programmers. Some
+kinds of systems may be harder to find testers for than others,
+depending on the amount of domain-specific jargon and concepts
+involved -- it's easier to find people who can tell you whether
+they approve of your translation for "delete this message" in an
+email-via-Web interface, than to find people who can give you
+an informed opinion on your translation for "attribute value"
+in an XML query tool's interface.
+
+=back
+
+=head1 SEE ALSO
+
+I recommend reading all of these:
+
+L<Locale::Maketext::TPJ13|Locale::Maketext::TPJ13> -- my I<The Perl
+Journal> article about Maketext. It explains many important concepts
+underlying Locale::Maketext's design, and some insight into why
+Maketext is better than the plain old approach of having
+message catalogs that are just databases of sprintf formats.
+
+L<File::Findgrep|File::Findgrep> is a sample application/module
+that uses Locale::Maketext to localize its messages. For a larger
+internationalized system, see also L<Apache::MP3>.
+
+L<I18N::LangTags|I18N::LangTags>.
+
+L<Win32::Locale|Win32::Locale>.
+
+RFC 3066, I<Tags for the Identification of Languages>,
+as at http://sunsite.dk/RFC/rfc/rfc3066.html
+
+RFC 2277, I<IETF Policy on Character Sets and Languages>
+is at http://sunsite.dk/RFC/rfc/rfc2277.html -- much of it is
+just things of interest to protocol designers, but it explains
+some basic concepts, like the distinction between locales and
+language-tags.
+
+The manual for GNU C<gettext>. The gettext dist is available in
+C<ftp://prep.ai.mit.edu/pub/gnu/> -- get
+a recent gettext tarball and look in its "doc/" directory, there's
+an easily browsable HTML version in there. The
+gettext documentation asks lots of questions worth thinking
+about, even if some of their answers are sometimes wonky,
+particularly where they start talking about pluralization.
+
+The Locale/Maketext.pm source. Obverse that the module is much
+shorter than its documentation!
+
+=head1 COPYRIGHT AND DISCLAIMER
+
+Copyright (c) 1999-2004 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Maketext/Guts.pm b/Master/tlpkg/tlperl.straw/lib/Locale/Maketext/Guts.pm
new file mode 100755
index 00000000000..9af292c61cc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Maketext/Guts.pm
@@ -0,0 +1,328 @@
+package Locale::Maketext::Guts;
+
+$VERSION = '1.13';
+
+BEGIN {
+ # Just so we're nice and define SOMETHING in "our" package.
+ *zorp = sub { return scalar @_ } unless defined &zorp;
+}
+
+package Locale::Maketext;
+use strict;
+use vars qw($USE_LITERALS $GUTSPATH);
+
+BEGIN {
+ $GUTSPATH = __FILE__;
+ *DEBUG = sub () {0} unless defined &DEBUG;
+}
+
+use utf8;
+
+sub _compile {
+ # This big scary routine compiles an entry.
+ # It returns either a coderef if there's brackety bits in this, or
+ # otherwise a ref to a scalar.
+
+ my $target = ref($_[0]) || $_[0];
+
+ my(@code);
+ my(@c) = (''); # "chunks" -- scratch.
+ my $call_count = 0;
+ my $big_pile = '';
+ {
+ my $in_group = 0; # start out outside a group
+ my($m, @params); # scratch
+
+ while($_[1] =~ # Iterate over chunks.
+ m/\G(
+ [^\~\[\]]+ # non-~[] stuff
+ |
+ ~. # ~[, ~], ~~, ~other
+ |
+ \[ # [ presumably opening a group
+ |
+ \] # ] presumably closing a group
+ |
+ ~ # terminal ~ ?
+ |
+ $
+ )/xgs
+ ) {
+ DEBUG>2 and print qq{ "$1"\n};
+
+ if($1 eq '[' or $1 eq '') { # "[" or end
+ # Whether this is "[" or end, force processing of any
+ # preceding literal.
+ if($in_group) {
+ if($1 eq '') {
+ $target->_die_pointing($_[1], 'Unterminated bracket group');
+ }
+ else {
+ $target->_die_pointing($_[1], 'You can\'t nest bracket groups');
+ }
+ }
+ else {
+ if ($1 eq '') {
+ DEBUG>2 and print " [end-string]\n";
+ }
+ else {
+ $in_group = 1;
+ }
+ die "How come \@c is empty?? in <$_[1]>" unless @c; # sanity
+ if(length $c[-1]) {
+ # Now actually processing the preceding literal
+ $big_pile .= $c[-1];
+ if($USE_LITERALS and (
+ (ord('A') == 65)
+ ? $c[-1] !~ m/[^\x20-\x7E]/s
+ # ASCII very safe chars
+ : $c[-1] !~ m/[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~\x07]/s
+ # EBCDIC very safe chars
+ )) {
+ # normal case -- all very safe chars
+ $c[-1] =~ s/'/\\'/g;
+ push @code, q{ '} . $c[-1] . "',\n";
+ $c[-1] = ''; # reuse this slot
+ }
+ else {
+ push @code, ' $c[' . $#c . "],\n";
+ push @c, ''; # new chunk
+ }
+ }
+ # else just ignore the empty string.
+ }
+
+ }
+ elsif($1 eq ']') { # "]"
+ # close group -- go back in-band
+ if($in_group) {
+ $in_group = 0;
+
+ DEBUG>2 and print " --Closing group [$c[-1]]\n";
+
+ # And now process the group...
+
+ if(!length($c[-1]) or $c[-1] =~ m/^\s+$/s) {
+ DEBUG > 2 and print " -- (Ignoring)\n";
+ $c[-1] = ''; # reset out chink
+ next;
+ }
+
+ #$c[-1] =~ s/^\s+//s;
+ #$c[-1] =~ s/\s+$//s;
+ ($m,@params) = split(/,/, $c[-1], -1); # was /\s*,\s*/
+
+ # A bit of a hack -- we've turned "~,"'s into DELs, so turn
+ # 'em into real commas here.
+ if (ord('A') == 65) { # ASCII, etc
+ foreach($m, @params) { tr/\x7F/,/ }
+ }
+ else { # EBCDIC (1047, 0037, POSIX-BC)
+ # Thanks to Peter Prymmer for the EBCDIC handling
+ foreach($m, @params) { tr/\x07/,/ }
+ }
+
+ # Special-case handling of some method names:
+ if($m eq '_*' or $m =~ m/^_(-?\d+)$/s) {
+ # Treat [_1,...] as [,_1,...], etc.
+ unshift @params, $m;
+ $m = '';
+ }
+ elsif($m eq '*') {
+ $m = 'quant'; # "*" for "times": "4 cars" is 4 times "cars"
+ }
+ elsif($m eq '#') {
+ $m = 'numf'; # "#" for "number": [#,_1] for "the number _1"
+ }
+
+ # Most common case: a simple, legal-looking method name
+ if($m eq '') {
+ # 0-length method name means to just interpolate:
+ push @code, ' (';
+ }
+ elsif($m =~ /^\w+(?:\:\:\w+)*$/s
+ and $m !~ m/(?:^|\:)\d/s
+ # exclude starting a (sub)package or symbol with a digit
+ ) {
+ # Yes, it even supports the demented (and undocumented?)
+ # $obj->Foo::bar(...) syntax.
+ $target->_die_pointing(
+ $_[1], q{Can't use "SUPER::" in a bracket-group method},
+ 2 + length($c[-1])
+ )
+ if $m =~ m/^SUPER::/s;
+ # Because for SUPER:: to work, we'd have to compile this into
+ # the right package, and that seems just not worth the bother,
+ # unless someone convinces me otherwise.
+
+ push @code, ' $_[0]->' . $m . '(';
+ }
+ else {
+ # TODO: implement something? or just too icky to consider?
+ $target->_die_pointing(
+ $_[1],
+ "Can't use \"$m\" as a method name in bracket group",
+ 2 + length($c[-1])
+ );
+ }
+
+ pop @c; # we don't need that chunk anymore
+ ++$call_count;
+
+ foreach my $p (@params) {
+ if($p eq '_*') {
+ # Meaning: all parameters except $_[0]
+ $code[-1] .= ' @_[1 .. $#_], ';
+ # and yes, that does the right thing for all @_ < 3
+ }
+ elsif($p =~ m/^_(-?\d+)$/s) {
+ # _3 meaning $_[3]
+ $code[-1] .= '$_[' . (0 + $1) . '], ';
+ }
+ elsif($USE_LITERALS and (
+ (ord('A') == 65)
+ ? $p !~ m/[^\x20-\x7E]/s
+ # ASCII very safe chars
+ : $p !~ m/[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~\x07]/s
+ # EBCDIC very safe chars
+ )) {
+ # Normal case: a literal containing only safe characters
+ $p =~ s/'/\\'/g;
+ $code[-1] .= q{'} . $p . q{', };
+ }
+ else {
+ # Stow it on the chunk-stack, and just refer to that.
+ push @c, $p;
+ push @code, ' $c[' . $#c . '], ';
+ }
+ }
+ $code[-1] .= "),\n";
+
+ push @c, '';
+ }
+ else {
+ $target->_die_pointing($_[1], q{Unbalanced ']'});
+ }
+
+ }
+ elsif(substr($1,0,1) ne '~') {
+ # it's stuff not containing "~" or "[" or "]"
+ # i.e., a literal blob
+ $c[-1] .= $1;
+
+ }
+ elsif($1 eq '~~') { # "~~"
+ $c[-1] .= '~';
+
+ }
+ elsif($1 eq '~[') { # "~["
+ $c[-1] .= '[';
+
+ }
+ elsif($1 eq '~]') { # "~]"
+ $c[-1] .= ']';
+
+ }
+ elsif($1 eq '~,') { # "~,"
+ if($in_group) {
+ # This is a hack, based on the assumption that no-one will actually
+ # want a DEL inside a bracket group. Let's hope that's it's true.
+ if (ord('A') == 65) { # ASCII etc
+ $c[-1] .= "\x7F";
+ }
+ else { # EBCDIC (cp 1047, 0037, POSIX-BC)
+ $c[-1] .= "\x07";
+ }
+ }
+ else {
+ $c[-1] .= '~,';
+ }
+
+ }
+ elsif($1 eq '~') { # possible only at string-end, it seems.
+ $c[-1] .= '~';
+
+ }
+ else {
+ # It's a "~X" where X is not a special character.
+ # Consider it a literal ~ and X.
+ $c[-1] .= $1;
+ }
+ }
+ }
+
+ if($call_count) {
+ undef $big_pile; # Well, nevermind that.
+ }
+ else {
+ # It's all literals! Ahwell, that can happen.
+ # So don't bother with the eval. Return a SCALAR reference.
+ return \$big_pile;
+ }
+
+ die q{Last chunk isn't null??} if @c and length $c[-1]; # sanity
+ DEBUG and warn scalar(@c), " chunks under closure\n";
+ if(@code == 0) { # not possible?
+ DEBUG and warn "Empty code\n";
+ return \'';
+ }
+ elsif(@code > 1) { # most cases, presumably!
+ unshift @code, "join '',\n";
+ }
+ unshift @code, "use strict; sub {\n";
+ push @code, "}\n";
+
+ DEBUG and warn @code;
+ my $sub = eval(join '', @code);
+ die "$@ while evalling" . join('', @code) if $@; # Should be impossible.
+ return $sub;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _die_pointing {
+ # This is used by _compile to throw a fatal error
+ my $target = shift; # class name
+ # ...leaving $_[0] the error-causing text, and $_[1] the error message
+
+ my $i = index($_[0], "\n");
+
+ my $pointy;
+ my $pos = pos($_[0]) - (defined($_[2]) ? $_[2] : 0) - 1;
+ if($pos < 1) {
+ $pointy = "^=== near there\n";
+ }
+ else { # we need to space over
+ my $first_tab = index($_[0], "\t");
+ if($pos > 2 and ( -1 == $first_tab or $first_tab > pos($_[0]))) {
+ # No tabs, or the first tab is harmlessly after where we will point to,
+ # AND we're far enough from the margin that we can draw a proper arrow.
+ $pointy = ('=' x $pos) . "^ near there\n";
+ }
+ else {
+ # tabs screw everything up!
+ $pointy = substr($_[0],0,$pos);
+ $pointy =~ tr/\t //cd;
+ # make everything into whitespace, but preseving tabs
+ $pointy .= "^=== near there\n";
+ }
+ }
+
+ my $errmsg = "$_[1], in\:\n$_[0]";
+
+ if($i == -1) {
+ # No newline.
+ $errmsg .= "\n" . $pointy;
+ }
+ elsif($i == (length($_[0]) - 1) ) {
+ # Already has a newline at end.
+ $errmsg .= $pointy;
+ }
+ else {
+ # don't bother with the pointy bit, I guess.
+ }
+ Carp::croak( "$errmsg via $target, as used" );
+}
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Maketext/GutsLoader.pm b/Master/tlpkg/tlperl.straw/lib/Locale/Maketext/GutsLoader.pm
new file mode 100755
index 00000000000..daa9840260a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Maketext/GutsLoader.pm
@@ -0,0 +1,49 @@
+package Locale::Maketext::GutsLoader;
+
+$VERSION = '1.13';
+
+use strict;
+sub zorp { return scalar @_ }
+
+BEGIN {
+ $Locale::Maketext::GutsLoader::GUTSPATH = __FILE__;
+ *Locale::Maketext::DEBUG = sub () {0}
+ unless defined &Locale::Maketext::DEBUG;
+}
+
+#
+# This whole drama is so that we can load the utf8'd code
+# in Locale::Maketext::Guts, but if that fails, snip the
+# utf8 and then try THAT.
+#
+
+$Locale::Maketext::GUTSPATH = '';
+Locale::Maketext::DEBUG and warn "Requiring Locale::Maketext::Guts...\n";
+eval 'require Locale::Maketext::Guts';
+
+if ($@) {
+ my $path = $Locale::Maketext::GUTSPATH;
+
+ die "Can't load Locale::Maketext::Guts\nAborting" unless $path;
+
+ die "No readable file $Locale::Maketext::GutsLoader::GUTSPATH\nAborting"
+ unless -e $path and -f _ and -r _;
+
+ open(IN, $path) or die "Can't read-open $path\nAborting";
+
+ my $source;
+ { local $/; $source = <IN>; }
+ close(IN);
+ unless( $source =~ s/\b(use utf8)/# $1/ ) {
+ Locale::Maketext::DEBUG and
+ print "I didn't see 'use utf8' in $path\n";
+ }
+ eval $source;
+ die "Can't compile $path\n...The error I got was:\n$@\nAborting" if $@;
+ Locale::Maketext::DEBUG and warn "Non-utf8'd Locale::Maketext::Guts fine\n";
+}
+else {
+ Locale::Maketext::DEBUG and warn "Loaded Locale::Maketext::Guts fine\n";
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Maketext/Simple.pm b/Master/tlpkg/tlperl.straw/lib/Locale/Maketext/Simple.pm
new file mode 100755
index 00000000000..30760f3c26d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Maketext/Simple.pm
@@ -0,0 +1,341 @@
+package Locale::Maketext::Simple;
+$Locale::Maketext::Simple::VERSION = '0.21';
+
+use strict;
+use 5.005;
+
+=head1 NAME
+
+Locale::Maketext::Simple - Simple interface to Locale::Maketext::Lexicon
+
+=head1 VERSION
+
+This document describes version 0.18 of Locale::Maketext::Simple,
+released Septermber 8, 2006.
+
+=head1 SYNOPSIS
+
+Minimal setup (looks for F<auto/Foo/*.po> and F<auto/Foo/*.mo>):
+
+ package Foo;
+ use Locale::Maketext::Simple; # exports 'loc'
+ loc_lang('fr'); # set language to French
+ sub hello {
+ print loc("Hello, [_1]!", "World");
+ }
+
+More sophisticated example:
+
+ package Foo::Bar;
+ use Locale::Maketext::Simple (
+ Class => 'Foo', # search in auto/Foo/
+ Style => 'gettext', # %1 instead of [_1]
+ Export => 'maketext', # maketext() instead of loc()
+ Subclass => 'L10N', # Foo::L10N instead of Foo::I18N
+ Decode => 1, # decode entries to unicode-strings
+ Encoding => 'locale', # but encode lexicons in current locale
+ # (needs Locale::Maketext::Lexicon 0.36)
+ );
+ sub japh {
+ print maketext("Just another %1 hacker", "Perl");
+ }
+
+=head1 DESCRIPTION
+
+This module is a simple wrapper around B<Locale::Maketext::Lexicon>,
+designed to alleviate the need of creating I<Language Classes> for
+module authors.
+
+The language used is chosen from the loc_lang call. If a lookup is not
+possible, the i-default language will be used. If the lookup is not in the
+i-default language, then the key will be returned.
+
+If B<Locale::Maketext::Lexicon> is not present, it implements a
+minimal localization function by simply interpolating C<[_1]> with
+the first argument, C<[_2]> with the second, etc. Interpolated
+function like C<[quant,_1]> are treated as C<[_1]>, with the sole
+exception of C<[tense,_1,X]>, which will append C<ing> to C<_1> when
+X is C<present>, or appending C<ed> to <_1> otherwise.
+
+=head1 OPTIONS
+
+All options are passed either via the C<use> statement, or via an
+explicit C<import>.
+
+=head2 Class
+
+By default, B<Locale::Maketext::Simple> draws its source from the
+calling package's F<auto/> directory; you can override this behaviour
+by explicitly specifying another package as C<Class>.
+
+=head2 Path
+
+If your PO and MO files are under a path elsewhere than C<auto/>,
+you may specify it using the C<Path> option.
+
+=head2 Style
+
+By default, this module uses the C<maketext> style of C<[_1]> and
+C<[quant,_1]> for interpolation. Alternatively, you can specify the
+C<gettext> style, which uses C<%1> and C<%quant(%1)> for interpolation.
+
+This option is case-insensitive.
+
+=head2 Export
+
+By default, this module exports a single function, C<loc>, into its
+caller's namespace. You can set it to another name, or set it to
+an empty string to disable exporting.
+
+=head2 Subclass
+
+By default, this module creates an C<::I18N> subclass under the
+caller's package (or the package specified by C<Class>), and stores
+lexicon data in its subclasses. You can assign a name other than
+C<I18N> via this option.
+
+=head2 Decode
+
+If set to a true value, source entries will be converted into
+utf8-strings (available in Perl 5.6.1 or later). This feature
+needs the B<Encode> or B<Encode::compat> module.
+
+=head2 Encoding
+
+Specifies an encoding to store lexicon entries, instead of
+utf8-strings. If set to C<locale>, the encoding from the current
+locale setting is used. Implies a true value for C<Decode>.
+
+=cut
+
+sub import {
+ my ($class, %args) = @_;
+
+ $args{Class} ||= caller;
+ $args{Style} ||= 'maketext';
+ $args{Export} ||= 'loc';
+ $args{Subclass} ||= 'I18N';
+
+ my ($loc, $loc_lang) = $class->load_loc(%args);
+ $loc ||= $class->default_loc(%args);
+
+ no strict 'refs';
+ *{caller(0) . "::$args{Export}"} = $loc if $args{Export};
+ *{caller(0) . "::$args{Export}_lang"} = $loc_lang || sub { 1 };
+}
+
+my %Loc;
+
+sub reload_loc { %Loc = () }
+
+sub load_loc {
+ my ($class, %args) = @_;
+
+ my $pkg = join('::', grep { defined and length } $args{Class}, $args{Subclass});
+ return $Loc{$pkg} if exists $Loc{$pkg};
+
+ eval { require Locale::Maketext::Lexicon; 1 } or return;
+ $Locale::Maketext::Lexicon::VERSION > 0.20 or return;
+ eval { require File::Spec; 1 } or return;
+
+ my $path = $args{Path} || $class->auto_path($args{Class}) or return;
+ my $pattern = File::Spec->catfile($path, '*.[pm]o');
+ my $decode = $args{Decode} || 0;
+ my $encoding = $args{Encoding} || undef;
+
+ $decode = 1 if $encoding;
+
+ $pattern =~ s{\\}{/}g; # to counter win32 paths
+
+ eval "
+ package $pkg;
+ use base 'Locale::Maketext';
+ Locale::Maketext::Lexicon->import({
+ 'i-default' => [ 'Auto' ],
+ '*' => [ Gettext => \$pattern ],
+ _decode => \$decode,
+ _encoding => \$encoding,
+ });
+ *${pkg}::Lexicon = \\%${pkg}::i_default::Lexicon;
+ *tense = sub { \$_[1] . ((\$_[2] eq 'present') ? 'ing' : 'ed') }
+ unless defined &tense;
+
+ 1;
+ " or die $@;
+
+ my $lh = eval { $pkg->get_handle } or return;
+ my $style = lc($args{Style});
+ if ($style eq 'maketext') {
+ $Loc{$pkg} = sub {
+ $lh->maketext(@_)
+ };
+ }
+ elsif ($style eq 'gettext') {
+ $Loc{$pkg} = sub {
+ my $str = shift;
+ $str =~ s{([\~\[\]])}{~$1}g;
+ $str =~ s{
+ ([%\\]%) # 1 - escaped sequence
+ |
+ % (?:
+ ([A-Za-z#*]\w*) # 2 - function call
+ \(([^\)]*)\) # 3 - arguments
+ |
+ ([1-9]\d*|\*) # 4 - variable
+ )
+ }{
+ $1 ? $1
+ : $2 ? "\[$2,"._unescape($3)."]"
+ : "[_$4]"
+ }egx;
+ return $lh->maketext($str, @_);
+ };
+ }
+ else {
+ die "Unknown Style: $style";
+ }
+
+ return $Loc{$pkg}, sub {
+ $lh = $pkg->get_handle(@_);
+ };
+}
+
+sub default_loc {
+ my ($self, %args) = @_;
+ my $style = lc($args{Style});
+ if ($style eq 'maketext') {
+ return sub {
+ my $str = shift;
+ $str =~ s{((?<!~)(?:~~)*)\[_([1-9]\d*|\*)\]}
+ {$1%$2}g;
+ $str =~ s{((?<!~)(?:~~)*)\[([A-Za-z#*]\w*),([^\]]+)\]}
+ {"$1%$2(" . _escape($3) . ')'}eg;
+ _default_gettext($str, @_);
+ };
+ }
+ elsif ($style eq 'gettext') {
+ return \&_default_gettext;
+ }
+ else {
+ die "Unknown Style: $style";
+ }
+}
+
+sub _default_gettext {
+ my $str = shift;
+ $str =~ s{
+ % # leading symbol
+ (?: # either one of
+ \d+ # a digit, like %1
+ | # or
+ (\w+)\( # a function call -- 1
+ (?: # either
+ %\d+ # an interpolation
+ | # or
+ ([^,]*) # some string -- 2
+ ) # end either
+ (?: # maybe followed
+ , # by a comma
+ ([^),]*) # and a param -- 3
+ )? # end maybe
+ (?: # maybe followed
+ , # by another comma
+ ([^),]*) # and a param -- 4
+ )? # end maybe
+ [^)]* # and other ignorable params
+ \) # closing function call
+ ) # closing either one of
+ }{
+ my $digit = $2 || shift;
+ $digit . (
+ $1 ? (
+ ($1 eq 'tense') ? (($3 eq 'present') ? 'ing' : 'ed') :
+ ($1 eq 'quant') ? ' ' . (($digit > 1) ? ($4 || "$3s") : $3) :
+ ''
+ ) : ''
+ );
+ }egx;
+ return $str;
+};
+
+sub _escape {
+ my $text = shift;
+ $text =~ s/\b_([1-9]\d*)/%$1/g;
+ return $text;
+}
+
+sub _unescape {
+ join(',', map {
+ /\A(\s*)%([1-9]\d*|\*)(\s*)\z/ ? "$1_$2$3" : $_
+ } split(/,/, $_[0]));
+}
+
+sub auto_path {
+ my ($self, $calldir) = @_;
+ $calldir =~ s#::#/#g;
+ my $path = $INC{$calldir . '.pm'} or return;
+
+ # Try absolute path name.
+ if ($^O eq 'MacOS') {
+ (my $malldir = $calldir) =~ tr#/#:#;
+ $path =~ s#^(.*)$malldir\.pm\z#$1auto:$malldir:#s;
+ } else {
+ $path =~ s#^(.*)$calldir\.pm\z#$1auto/$calldir/#;
+ }
+
+ return $path if -d $path;
+
+ # If that failed, try relative path with normal @INC searching.
+ $path = "auto/$calldir/";
+ foreach my $inc (@INC) {
+ return "$inc/$path" if -d "$inc/$path";
+ }
+
+ return;
+}
+
+1;
+
+=head1 ACKNOWLEDGMENTS
+
+Thanks to Jos I. Boumans for suggesting this module to be written.
+
+Thanks to Chia-Liang Kao for suggesting C<Path> and C<loc_lang>.
+
+=head1 SEE ALSO
+
+L<Locale::Maketext>, L<Locale::Maketext::Lexicon>
+
+=head1 AUTHORS
+
+Audrey Tang E<lt>cpan@audreyt.orgE<gt>
+
+=head1 COPYRIGHT
+
+Copyright 2003, 2004, 2005, 2006 by Audrey Tang E<lt>cpan@audreyt.orgE<gt>.
+
+This software is released under the MIT license cited below. Additionally,
+when this software is distributed with B<Perl Kit, Version 5>, you may also
+redistribute it and/or modify it under the same terms as Perl itself.
+
+=head2 The "MIT" License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Maketext/TPJ13.pod b/Master/tlpkg/tlperl.straw/lib/Locale/Maketext/TPJ13.pod
new file mode 100755
index 00000000000..b5e2c0b972b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Maketext/TPJ13.pod
@@ -0,0 +1,775 @@
+# This document contains text in Perl "POD" format.
+# Use a POD viewer like perldoc or perlman to render it.
+
+=head1 NAME
+
+Locale::Maketext::TPJ13 -- article about software localization
+
+=head1 SYNOPSIS
+
+ # This an article, not a module.
+
+=head1 DESCRIPTION
+
+The following article by Sean M. Burke and Jordan Lachler
+first appeared in I<The Perl Journal> #13
+and is copyright 1999 The Perl Journal. It appears
+courtesy of Jon Orwant and The Perl Journal. This document may be
+distributed under the same terms as Perl itself.
+
+=head1 Localization and Perl: gettext breaks, Maketext fixes
+
+by Sean M. Burke and Jordan Lachler
+
+This article points out cases where gettext (a common system for
+localizing software interfaces -- i.e., making them work in the user's
+language of choice) fails because of basic differences between human
+languages. This article then describes Maketext, a new system capable
+of correctly treating these differences.
+
+=head2 A Localization Horror Story: It Could Happen To You
+
+=over
+
+"There are a number of languages spoken by human beings in this
+world."
+
+-- Harald Tveit Alvestrand, in RFC 1766, "Tags for the
+Identification of Languages"
+
+=back
+
+Imagine that your task for the day is to localize a piece of software
+-- and luckily for you, the only output the program emits is two
+messages, like this:
+
+ I scanned 12 directories.
+
+ Your query matched 10 files in 4 directories.
+
+So how hard could that be? You look at the code that
+produces the first item, and it reads:
+
+ printf("I scanned %g directories.",
+ $directory_count);
+
+You think about that, and realize that it doesn't even work right for
+English, as it can produce this output:
+
+ I scanned 1 directories.
+
+So you rewrite it to read:
+
+ printf("I scanned %g %s.",
+ $directory_count,
+ $directory_count == 1 ?
+ "directory" : "directories",
+ );
+
+...which does the Right Thing. (In case you don't recall, "%g" is for
+locale-specific number interpolation, and "%s" is for string
+interpolation.)
+
+But you still have to localize it for all the languages you're
+producing this software for, so you pull Locale::gettext off of CPAN
+so you can access the C<gettext> C functions you've heard are standard
+for localization tasks.
+
+And you write:
+
+ printf(gettext("I scanned %g %s."),
+ $dir_scan_count,
+ $dir_scan_count == 1 ?
+ gettext("directory") : gettext("directories"),
+ );
+
+But you then read in the gettext manual (Drepper, Miller, and Pinard 1995)
+that this is not a good idea, since how a single word like "directory"
+or "directories" is translated may depend on context -- and this is
+true, since in a case language like German or Russian, you'd may need
+these words with a different case ending in the first instance (where the
+word is the object of a verb) than in the second instance, which you haven't even
+gotten to yet (where the word is the object of a preposition, "in %g
+directories") -- assuming these keep the same syntax when translated
+into those languages.
+
+So, on the advice of the gettext manual, you rewrite:
+
+ printf( $dir_scan_count == 1 ?
+ gettext("I scanned %g directory.") :
+ gettext("I scanned %g directories."),
+ $dir_scan_count );
+
+So, you email your various translators (the boss decides that the
+languages du jour are Chinese, Arabic, Russian, and Italian, so you
+have one translator for each), asking for translations for "I scanned
+%g directory." and "I scanned %g directories.". When they reply,
+you'll put that in the lexicons for gettext to use when it localizes
+your software, so that when the user is running under the "zh"
+(Chinese) locale, gettext("I scanned %g directory.") will return the
+appropriate Chinese text, with a "%g" in there where printf can then
+interpolate $dir_scan.
+
+Your Chinese translator emails right back -- he says both of these
+phrases translate to the same thing in Chinese, because, in linguistic
+jargon, Chinese "doesn't have number as a grammatical category" --
+whereas English does. That is, English has grammatical rules that
+refer to "number", i.e., whether something is grammatically singular
+or plural; and one of these rules is the one that forces nouns to take
+a plural suffix (generally "s") when in a plural context, as they are when
+they follow a number other than "one" (including, oddly enough, "zero").
+Chinese has no such rules, and so has just the one phrase where English
+has two. But, no problem, you can have this one Chinese phrase appear
+as the translation for the two English phrases in the "zh" gettext
+lexicon for your program.
+
+Emboldened by this, you dive into the second phrase that your software
+needs to output: "Your query matched 10 files in 4 directories.". You notice
+that if you want to treat phrases as indivisible, as the gettext
+manual wisely advises, you need four cases now, instead of two, to
+cover the permutations of singular and plural on the two items,
+$dir_count and $file_count. So you try this:
+
+ printf( $file_count == 1 ?
+ ( $directory_count == 1 ?
+ gettext("Your query matched %g file in %g directory.") :
+ gettext("Your query matched %g file in %g directories.") ) :
+ ( $directory_count == 1 ?
+ gettext("Your query matched %g files in %g directory.") :
+ gettext("Your query matched %g files in %g directories.") ),
+ $file_count, $directory_count,
+ );
+
+(The case of "1 file in 2 [or more] directories" could, I suppose,
+occur in the case of symlinking or something of the sort.)
+
+It occurs to you that this is not the prettiest code you've ever
+written, but this seems the way to go. You mail off to the
+translators asking for translations for these four cases. The
+Chinese guy replies with the one phrase that these all translate to in
+Chinese, and that phrase has two "%g"s in it, as it should -- but
+there's a problem. He translates it word-for-word back: "In %g
+directories contains %g files match your query." The %g
+slots are in an order reverse to what they are in English. You wonder
+how you'll get gettext to handle that.
+
+But you put it aside for the moment, and optimistically hope that the
+other translators won't have this problem, and that their languages
+will be better behaved -- i.e., that they will be just like English.
+
+But the Arabic translator is the next to write back. First off, your
+code for "I scanned %g directory." or "I scanned %g directories."
+assumes there's only singular or plural. But, to use linguistic
+jargon again, Arabic has grammatical number, like English (but unlike
+Chinese), but it's a three-term category: singular, dual, and plural.
+In other words, the way you say "directory" depends on whether there's
+one directory, or I<two> of them, or I<more than two> of them. Your
+test of C<($directory == 1)> no longer does the job. And it means
+that where English's grammatical category of number necessitates
+only the two permutations of the first sentence based on "directory
+[singular]" and "directories [plural]", Arabic has three -- and,
+worse, in the second sentence ("Your query matched %g file in %g
+directory."), where English has four, Arabic has nine. You sense
+an unwelcome, exponential trend taking shape.
+
+Your Italian translator emails you back and says that "I searched 0
+directories" (a possible English output of your program) is stilted,
+and if you think that's fine English, that's your problem, but that
+I<just will not do> in the language of Dante. He insists that where
+$directory_count is 0, your program should produce the Italian text
+for "I I<didn't> scan I<any> directories.". And ditto for "I didn't
+match any files in any directories", although he says the last part
+about "in any directories" should probably just be left off.
+
+You wonder how you'll get gettext to handle this; to accomodate the
+ways Arabic, Chinese, and Italian deal with numbers in just these few
+very simple phrases, you need to write code that will ask gettext for
+different queries depending on whether the numerical values in
+question are 1, 2, more than 2, or in some cases 0, and you still haven't
+figured out the problem with the different word order in Chinese.
+
+Then your Russian translator calls on the phone, to I<personally> tell
+you the bad news about how really unpleasant your life is about to
+become:
+
+Russian, like German or Latin, is an inflectional language; that is, nouns
+and adjectives have to take endings that depend on their case
+(i.e., nominative, accusative, genitive, etc...) -- which is roughly a matter of
+what role they have in syntax of the sentence --
+as well as on the grammatical gender (i.e., masculine, feminine, neuter)
+and number (i.e., singular or plural) of the noun, as well as on the
+declension class of the noun. But unlike with most other inflected languages,
+putting a number-phrase (like "ten" or "forty-three", or their Arabic
+numeral equivalents) in front of noun in Russian can change the case and
+number that noun is, and therefore the endings you have to put on it.
+
+He elaborates: In "I scanned %g directories", you'd I<expect>
+"directories" to be in the accusative case (since it is the direct
+object in the sentence) and the plural number,
+except where $directory_count is 1, then you'd expect the singular, of
+course. Just like Latin or German. I<But!> Where $directory_count %
+10 is 1 ("%" for modulo, remember), assuming $directory count is an
+integer, and except where $directory_count % 100 is 11, "directories"
+is forced to become grammatically singular, which means it gets the
+ending for the accusative singular... You begin to visualize the code
+it'd take to test for the problem so far, I<and still work for Chinese
+and Arabic and Italian>, and how many gettext items that'd take, but
+he keeps going... But where $directory_count % 10 is 2, 3, or 4
+(except where $directory_count % 100 is 12, 13, or 14), the word for
+"directories" is forced to be genitive singular -- which means another
+ending... The room begins to spin around you, slowly at first... But
+with I<all other> integer values, since "directory" is an inanimate
+noun, when preceded by a number and in the nominative or accusative
+cases (as it is here, just your luck!), it does stay plural, but it is
+forced into the genitive case -- yet another ending... And
+you never hear him get to the part about how you're going to run into
+similar (but maybe subtly different) problems with other Slavic
+languages like Polish, because the floor comes up to meet you, and you
+fade into unconsciousness.
+
+
+The above cautionary tale relates how an attempt at localization can
+lead from programmer consternation, to program obfuscation, to a need
+for sedation. But careful evaluation shows that your choice of tools
+merely needed further consideration.
+
+=head2 The Linguistic View
+
+=over
+
+"It is more complicated than you think."
+
+-- The Eighth Networking Truth, from RFC 1925
+
+=back
+
+The field of Linguistics has expended a great deal of effort over the
+past century trying to find grammatical patterns which hold across
+languages; it's been a constant process
+of people making generalizations that should apply to all languages,
+only to find out that, all too often, these generalizations fail --
+sometimes failing for just a few languages, sometimes whole classes of
+languages, and sometimes nearly every language in the world except
+English. Broad statistical trends are evident in what the "average
+language" is like as far as what its rules can look like, must look
+like, and cannot look like. But the "average language" is just as
+unreal a concept as the "average person" -- it runs up against the
+fact no language (or person) is, in fact, average. The wisdom of past
+experience leads us to believe that any given language can do whatever
+it wants, in any order, with appeal to any kind of grammatical
+categories wants -- case, number, tense, real or metaphoric
+characteristics of the things that words refer to, arbitrary or
+predictable classifications of words based on what endings or prefixes
+they can take, degree or means of certainty about the truth of
+statements expressed, and so on, ad infinitum.
+
+Mercifully, most localization tasks are a matter of finding ways to
+translate whole phrases, generally sentences, where the context is
+relatively set, and where the only variation in content is I<usually>
+in a number being expressed -- as in the example sentences above.
+Translating specific, fully-formed sentences is, in practice, fairly
+foolproof -- which is good, because that's what's in the phrasebooks
+that so many tourists rely on. Now, a given phrase (whether in a
+phrasebook or in a gettext lexicon) in one language I<might> have a
+greater or lesser applicability than that phrase's translation into
+another language -- for example, strictly speaking, in Arabic, the
+"your" in "Your query matched..." would take a different form
+depending on whether the user is male or female; so the Arabic
+translation "your[feminine] query" is applicable in fewer cases than
+the corresponding English phrase, which doesn't distinguish the user's
+gender. (In practice, it's not feasable to have a program know the
+user's gender, so the masculine "you" in Arabic is usually used, by
+default.)
+
+But in general, such surprises are rare when entire sentences are
+being translated, especially when the functional context is restricted
+to that of a computer interacting with a user either to convey a fact
+or to prompt for a piece of information. So, for purposes of
+localization, translation by phrase (generally by sentence) is both the
+simplest and the least problematic.
+
+=head2 Breaking gettext
+
+=over
+
+"It Has To Work."
+
+-- First Networking Truth, RFC 1925
+
+=back
+
+Consider that sentences in a tourist phrasebook are of two types: ones
+like "How do I get to the marketplace?" that don't have any blanks to
+fill in, and ones like "How much do these ___ cost?", where there's
+one or more blanks to fill in (and these are usually linked to a
+list of words that you can put in that blank: "fish", "potatoes",
+"tomatoes", etc.) The ones with no blanks are no problem, but the
+fill-in-the-blank ones may not be really straightforward. If it's a
+Swahili phrasebook, for example, the authors probably didn't bother to
+tell you the complicated ways that the verb "cost" changes its
+inflectional prefix depending on the noun you're putting in the blank.
+The trader in the marketplace will still understand what you're saying if
+you say "how much do these potatoes cost?" with the wrong
+inflectional prefix on "cost". After all, I<you> can't speak proper Swahili,
+I<you're> just a tourist. But while tourists can be stupid, computers
+are supposed to be smart; the computer should be able to fill in the
+blank, and still have the results be grammatical.
+
+In other words, a phrasebook entry takes some values as parameters
+(the things that you fill in the blank or blanks), and provides a value
+based on these parameters, where the way you get that final value from
+the given values can, properly speaking, involve an arbitrarily
+complex series of operations. (In the case of Chinese, it'd be not at
+all complex, at least in cases like the examples at the beginning of
+this article; whereas in the case of Russian it'd be a rather complex
+series of operations. And in some languages, the
+complexity could be spread around differently: while the act of
+putting a number-expression in front of a noun phrase might not be
+complex by itself, it may change how you have to, for example, inflect
+a verb elsewhere in the sentence. This is what in syntax is called
+"long-distance dependencies".)
+
+This talk of parameters and arbitrary complexity is just another way
+to say that an entry in a phrasebook is what in a programming language
+would be called a "function". Just so you don't miss it, this is the
+crux of this article: I<A phrase is a function; a phrasebook is a
+bunch of functions.>
+
+The reason that using gettext runs into walls (as in the above
+second-person horror story) is that you're trying to use a string (or
+worse, a choice among a bunch of strings) to do what you really need a
+function for -- which is futile. Preforming (s)printf interpolation
+on the strings which you get back from gettext does allow you to do I<some>
+common things passably well... sometimes... sort of; but, to paraphrase
+what some people say about C<csh> script programming, "it fools you
+into thinking you can use it for real things, but you can't, and you
+don't discover this until you've already spent too much time trying,
+and by then it's too late."
+
+=head2 Replacing gettext
+
+So, what needs to replace gettext is a system that supports lexicons
+of functions instead of lexicons of strings. An entry in a lexicon
+from such a system should I<not> look like this:
+
+ "J'ai trouv\xE9 %g fichiers dans %g r\xE9pertoires"
+
+[\xE9 is e-acute in Latin-1. Some pod renderers would
+scream if I used the actual character here. -- SB]
+
+but instead like this, bearing in mind that this is just a first stab:
+
+ sub I_found_X1_files_in_X2_directories {
+ my( $files, $dirs ) = @_[0,1];
+ $files = sprintf("%g %s", $files,
+ $files == 1 ? 'fichier' : 'fichiers');
+ $dirs = sprintf("%g %s", $dirs,
+ $dirs == 1 ? "r\xE9pertoire" : "r\xE9pertoires");
+ return "J'ai trouv\xE9 $files dans $dirs.";
+ }
+
+Now, there's no particularly obvious way to store anything but strings
+in a gettext lexicon; so it looks like we just have to start over and
+make something better, from scratch. I call my shot at a
+gettext-replacement system "Maketext", or, in CPAN terms,
+Locale::Maketext.
+
+When designing Maketext, I chose to plan its main features in terms of
+"buzzword compliance". And here are the buzzwords:
+
+=head2 Buzzwords: Abstraction and Encapsulation
+
+The complexity of the language you're trying to output a phrase in is
+entirely abstracted inside (and encapsulated within) the Maketext module
+for that interface. When you call:
+
+ print $lang->maketext("You have [quant,_1,piece] of new mail.",
+ scalar(@messages));
+
+you don't know (and in fact can't easily find out) whether this will
+involve lots of figuring, as in Russian (if $lang is a handle to the
+Russian module), or relatively little, as in Chinese. That kind of
+abstraction and encapsulation may encourage other pleasant buzzwords
+like modularization and stratification, depending on what design
+decisions you make.
+
+=head2 Buzzword: Isomorphism
+
+"Isomorphism" means "having the same structure or form"; in discussions
+of program design, the word takes on the special, specific meaning that
+your implementation of a solution to a problem I<has the same
+structure> as, say, an informal verbal description of the solution, or
+maybe of the problem itself. Isomorphism is, all things considered,
+a good thing -- it's what problem-solving (and solution-implementing)
+should look like.
+
+What's wrong the with gettext-using code like this...
+
+ printf( $file_count == 1 ?
+ ( $directory_count == 1 ?
+ "Your query matched %g file in %g directory." :
+ "Your query matched %g file in %g directories." ) :
+ ( $directory_count == 1 ?
+ "Your query matched %g files in %g directory." :
+ "Your query matched %g files in %g directories." ),
+ $file_count, $directory_count,
+ );
+
+is first off that it's not well abstracted -- these ways of testing
+for grammatical number (as in the expressions like C<foo == 1 ?
+singular_form : plural_form>) should be abstracted to each language
+module, since how you get grammatical number is language-specific.
+
+But second off, it's not isomorphic -- the "solution" (i.e., the
+phrasebook entries) for Chinese maps from these four English phrases to
+the one Chinese phrase that fits for all of them. In other words, the
+informal solution would be "The way to say what you want in Chinese is
+with the one phrase 'For your question, in Y directories you would
+find X files'" -- and so the implemented solution should be,
+isomorphically, just a straightforward way to spit out that one
+phrase, with numerals properly interpolated. It shouldn't have to map
+from the complexity of other languages to the simplicity of this one.
+
+=head2 Buzzword: Inheritance
+
+There's a great deal of reuse possible for sharing of phrases between
+modules for related dialects, or for sharing of auxiliary functions
+between related languages. (By "auxiliary functions", I mean
+functions that don't produce phrase-text, but which, say, return an
+answer to "does this number require a plural noun after it?". Such
+auxiliary functions would be used in the internal logic of functions
+that actually do produce phrase-text.)
+
+In the case of sharing phrases, consider that you have an interface
+already localized for American English (probably by having been
+written with that as the native locale, but that's incidental).
+Localizing it for UK English should, in practical terms, be just a
+matter of running it past a British person with the instructions to
+indicate what few phrases would benefit from a change in spelling or
+possibly minor rewording. In that case, you should be able to put in
+the UK English localization module I<only> those phrases that are
+UK-specific, and for all the rest, I<inherit> from the American
+English module. (And I expect this same situation would apply with
+Brazilian and Continental Portugese, possbily with some I<very>
+closely related languages like Czech and Slovak, and possibly with the
+slightly different "versions" of written Mandarin Chinese, as I hear exist in
+Taiwan and mainland China.)
+
+As to sharing of auxiliary functions, consider the problem of Russian
+numbers from the beginning of this article; obviously, you'd want to
+write only once the hairy code that, given a numeric value, would
+return some specification of which case and number a given quanitified
+noun should use. But suppose that you discover, while localizing an
+interface for, say, Ukranian (a Slavic language related to Russian,
+spoken by several million people, many of whom would be relieved to
+find that your Web site's or software's interface is available in
+their language), that the rules in Ukranian are the same as in Russian
+for quantification, and probably for many other grammatical functions.
+While there may well be no phrases in common between Russian and
+Ukranian, you could still choose to have the Ukranian module inherit
+from the Russian module, just for the sake of inheriting all the
+various grammatical methods. Or, probably better organizationally,
+you could move those functions to a module called C<_E_Slavic> or
+something, which Russian and Ukranian could inherit useful functions
+from, but which would (presumably) provide no lexicon.
+
+=head2 Buzzword: Concision
+
+Okay, concision isn't a buzzword. But it should be, so I decree that
+as a new buzzword, "concision" means that simple common things should
+be expressible in very few lines (or maybe even just a few characters)
+of code -- call it a special case of "making simple things easy and
+hard things possible", and see also the role it played in the
+MIDI::Simple language, discussed elsewhere in this issue [TPJ#13].
+
+Consider our first stab at an entry in our "phrasebook of functions":
+
+ sub I_found_X1_files_in_X2_directories {
+ my( $files, $dirs ) = @_[0,1];
+ $files = sprintf("%g %s", $files,
+ $files == 1 ? 'fichier' : 'fichiers');
+ $dirs = sprintf("%g %s", $dirs,
+ $dirs == 1 ? "r\xE9pertoire" : "r\xE9pertoires");
+ return "J'ai trouv\xE9 $files dans $dirs.";
+ }
+
+You may sense that a lexicon (to use a non-committal catch-all term for a
+collection of things you know how to say, regardless of whether they're
+phrases or words) consisting of functions I<expressed> as above would
+make for rather long-winded and repetitive code -- even if you wisely
+rewrote this to have quantification (as we call adding a number
+expression to a noun phrase) be a function called like:
+
+ sub I_found_X1_files_in_X2_directories {
+ my( $files, $dirs ) = @_[0,1];
+ $files = quant($files, "fichier");
+ $dirs = quant($dirs, "r\xE9pertoire");
+ return "J'ai trouv\xE9 $files dans $dirs.";
+ }
+
+And you may also sense that you do not want to bother your translators
+with having to write Perl code -- you'd much rather that they spend
+their I<very costly time> on just translation. And this is to say
+nothing of the near impossibility of finding a commercial translator
+who would know even simple Perl.
+
+In a first-hack implementation of Maketext, each language-module's
+lexicon looked like this:
+
+ %Lexicon = (
+ "I found %g files in %g directories"
+ => sub {
+ my( $files, $dirs ) = @_[0,1];
+ $files = quant($files, "fichier");
+ $dirs = quant($dirs, "r\xE9pertoire");
+ return "J'ai trouv\xE9 $files dans $dirs.";
+ },
+ ... and so on with other phrase => sub mappings ...
+ );
+
+but I immediately went looking for some more concise way to basically
+denote the same phrase-function -- a way that would also serve to
+concisely denote I<most> phrase-functions in the lexicon for I<most>
+languages. After much time and even some actual thought, I decided on
+this system:
+
+* Where a value in a %Lexicon hash is a contentful string instead of
+an anonymous sub (or, conceivably, a coderef), it would be interpreted
+as a sort of shorthand expression of what the sub does. When accessed
+for the first time in a session, it is parsed, turned into Perl code,
+and then eval'd into an anonymous sub; then that sub replaces the
+original string in that lexicon. (That way, the work of parsing and
+evaling the shorthand form for a given phrase is done no more than
+once per session.)
+
+* Calls to C<maketext> (as Maketext's main function is called) happen
+thru a "language session handle", notionally very much like an IO
+handle, in that you open one at the start of the session, and use it
+for "sending signals" to an object in order to have it return the text
+you want.
+
+So, this:
+
+ $lang->maketext("You have [quant,_1,piece] of new mail.",
+ scalar(@messages));
+
+basically means this: look in the lexicon for $lang (which may inherit
+from any number of other lexicons), and find the function that we
+happen to associate with the string "You have [quant,_1,piece] of new
+mail" (which is, and should be, a functioning "shorthand" for this
+function in the native locale -- English in this case). If you find
+such a function, call it with $lang as its first parameter (as if it
+were a method), and then a copy of scalar(@messages) as its second,
+and then return that value. If that function was found, but was in
+string shorthand instead of being a fully specified function, parse it
+and make it into a function before calling it the first time.
+
+* The shorthand uses code in brackets to indicate method calls that
+should be performed. A full explanation is not in order here, but a
+few examples will suffice:
+
+ "You have [quant,_1,piece] of new mail."
+
+The above code is shorthand for, and will be interpreted as,
+this:
+
+ sub {
+ my $handle = $_[0];
+ my(@params) = @_;
+ return join '',
+ "You have ",
+ $handle->quant($params[1], 'piece'),
+ "of new mail.";
+ }
+
+where "quant" is the name of a method you're using to quantify the
+noun "piece" with the number $params[0].
+
+A string with no brackety calls, like this:
+
+ "Your search expression was malformed."
+
+is somewhat of a degerate case, and just gets turned into:
+
+ sub { return "Your search expression was malformed." }
+
+However, not everything you can write in Perl code can be written in
+the above shorthand system -- not by a long shot. For example, consider
+the Italian translator from the beginning of this article, who wanted
+the Italian for "I didn't find any files" as a special case, instead
+of "I found 0 files". That couldn't be specified (at least not easily
+or simply) in our shorthand system, and it would have to be written
+out in full, like this:
+
+ sub { # pretend the English strings are in Italian
+ my($handle, $files, $dirs) = @_[0,1,2];
+ return "I didn't find any files" unless $files;
+ return join '',
+ "I found ",
+ $handle->quant($files, 'file'),
+ " in ",
+ $handle->quant($dirs, 'directory'),
+ ".";
+ }
+
+Next to a lexicon full of shorthand code, that sort of sticks out like a
+sore thumb -- but this I<is> a special case, after all; and at least
+it's possible, if not as concise as usual.
+
+As to how you'd implement the Russian example from the beginning of
+the article, well, There's More Than One Way To Do It, but it could be
+something like this (using English words for Russian, just so you know
+what's going on):
+
+ "I [quant,_1,directory,accusative] scanned."
+
+This shifts the burden of complexity off to the quant method. That
+method's parameters are: the numeric value it's going to use to
+quantify something; the Russian word it's going to quantify; and the
+parameter "accusative", which you're using to mean that this
+sentence's syntax wants a noun in the accusative case there, although
+that quantification method may have to overrule, for grammatical
+reasons you may recall from the beginning of this article.
+
+Now, the Russian quant method here is responsible not only for
+implementing the strange logic necessary for figuring out how Russian
+number-phrases impose case and number on their noun-phrases, but also
+for inflecting the Russian word for "directory". How that inflection
+is to be carried out is no small issue, and among the solutions I've
+seen, some (like variations on a simple lookup in a hash where all
+possible forms are provided for all necessary words) are
+straightforward but I<can> become cumbersome when you need to inflect
+more than a few dozen words; and other solutions (like using
+algorithms to model the inflections, storing only root forms and
+irregularities) I<can> involve more overhead than is justifiable for
+all but the largest lexicons.
+
+Mercifully, this design decision becomes crucial only in the hairiest
+of inflected languages, of which Russian is by no means the I<worst> case
+scenario, but is worse than most. Most languages have simpler
+inflection systems; for example, in English or Swahili, there are
+generally no more than two possible inflected forms for a given noun
+("error/errors"; "kosa/makosa"), and the
+rules for producing these forms are fairly simple -- or at least,
+simple rules can be formulated that work for most words, and you can
+then treat the exceptions as just "irregular", at least relative to
+your ad hoc rules. A simpler inflection system (simpler rules, fewer
+forms) means that design decisions are less crucial to maintaining
+sanity, whereas the same decisions could incur
+overhead-versus-scalability problems in languages like Russian. It
+may I<also> be likely that code (possibly in Perl, as with
+Lingua::EN::Inflect, for English nouns) has already
+been written for the language in question, whether simple or complex.
+
+Moreover, a third possibility may even be simpler than anything
+discussed above: "Just require that all possible (or at least
+applicable) forms be provided in the call to the given language's quant
+method, as in:"
+
+ "I found [quant,_1,file,files]."
+
+That way, quant just has to chose which form it needs, without having
+to look up or generate anything. While possibly not optimal for
+Russian, this should work well for most other languages, where
+quantification is not as complicated an operation.
+
+=head2 The Devil in the Details
+
+There's plenty more to Maketext than described above -- for example,
+there's the details of how language tags ("en-US", "i-pwn", "fi",
+etc.) or locale IDs ("en_US") interact with actual module naming
+("BogoQuery/Locale/en_us.pm"), and what magic can ensue; there's the
+details of how to record (and possibly negotiate) what character
+encoding Maketext will return text in (UTF8? Latin-1? KOI8?). There's
+the interesting fact that Maketext is for localization, but nowhere
+actually has a "C<use locale;>" anywhere in it. For the curious,
+there's the somewhat frightening details of how I actually
+implement something like data inheritance so that searches across
+modules' %Lexicon hashes can parallel how Perl implements method
+inheritance.
+
+And, most importantly, there's all the practical details of how to
+actually go about deriving from Maketext so you can use it for your
+interfaces, and the various tools and conventions for starting out and
+maintaining individual language modules.
+
+That is all covered in the documentation for Locale::Maketext and the
+modules that come with it, available in CPAN. After having read this
+article, which covers the why's of Maketext, the documentation,
+which covers the how's of it, should be quite straightfoward.
+
+=head2 The Proof in the Pudding: Localizing Web Sites
+
+Maketext and gettext have a notable difference: gettext is in C,
+accessible thru C library calls, whereas Maketext is in Perl, and
+really can't work without a Perl interpreter (although I suppose
+something like it could be written for C). Accidents of history (and
+not necessarily lucky ones) have made C++ the most common language for
+the implementation of applications like word processors, Web browsers,
+and even many in-house applications like custom query systems. Current
+conditions make it somewhat unlikely that the next one of any of these
+kinds of applications will be written in Perl, albeit clearly more for
+reasons of custom and inertia than out of consideration of what is the
+right tool for the job.
+
+However, other accidents of history have made Perl a well-accepted
+language for design of server-side programs (generally in CGI form)
+for Web site interfaces. Localization of static pages in Web sites is
+trivial, feasable either with simple language-negotiation features in
+servers like Apache, or with some kind of server-side inclusions of
+language-appropriate text into layout templates. However, I think
+that the localization of Perl-based search systems (or other kinds of
+dynamic content) in Web sites, be they public or access-restricted,
+is where Maketext will see the greatest use.
+
+I presume that it would be only the exceptional Web site that gets
+localized for English I<and> Chinese I<and> Italian I<and> Arabic
+I<and> Russian, to recall the languages from the beginning of this
+article -- to say nothing of German, Spanish, French, Japanese,
+Finnish, and Hindi, to name a few languages that benefit from large
+numbers of programmers or Web viewers or both.
+
+However, the ever-increasing internationalization of the Web (whether
+measured in terms of amount of content, of numbers of content writers
+or programmers, or of size of content audiences) makes it increasingly
+likely that the interface to the average Web-based dynamic content
+service will be localized for two or maybe three languages. It is my
+hope that Maketext will make that task as simple as possible, and will
+remove previous barriers to localization for languages dissimilar to
+English.
+
+ __END__
+
+Sean M. Burke (sburkeE<64>cpan.org) has a Master's in linguistics
+from Northwestern University; he specializes in language technology.
+Jordan Lachler (lachlerE<64>unm.edu) is a PhD student in the Department of
+Linguistics at the University of New Mexico; he specializes in
+morphology and pedagogy of North American native languages.
+
+=head2 References
+
+Alvestrand, Harald Tveit. 1995. I<RFC 1766: Tags for the
+Identification of Languages.>
+C<ftp://ftp.isi.edu/in-notes/rfc1766.txt>
+[Now see RFC 3066.]
+
+Callon, Ross, editor. 1996. I<RFC 1925: The Twelve
+Networking Truths.>
+C<ftp://ftp.isi.edu/in-notes/rfc1925.txt>
+
+Drepper, Ulrich, Peter Miller,
+and FranE<ccedil>ois Pinard. 1995-2001. GNU
+C<gettext>. Available in C<ftp://prep.ai.mit.edu/pub/gnu/>, with
+extensive docs in the distribution tarball. [Since
+I wrote this article in 1998, I now see that the
+gettext docs are now trying more to come to terms with
+plurality. Whether useful conclusions have come from it
+is another question altogether. -- SMB, May 2001]
+
+Forbes, Nevill. 1964. I<Russian Grammar.> Third Edition, revised
+by J. C. Dumbreck. Oxford University Press.
+
+=cut
+
+#End
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Script.pm b/Master/tlpkg/tlperl.straw/lib/Locale/Script.pm
new file mode 100755
index 00000000000..f5fdbab05c9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Script.pm
@@ -0,0 +1,294 @@
+#
+# Locale::Script - ISO codes for script identification (ISO 15924)
+#
+# $Id: Script.pm,v 2.7 2004/06/10 21:19:34 neilb Exp $
+#
+
+package Locale::Script;
+use strict;
+require 5.002;
+
+require Exporter;
+use Carp;
+use Locale::Constants;
+
+
+#-----------------------------------------------------------------------
+# Public Global Variables
+#-----------------------------------------------------------------------
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+$VERSION = sprintf("%d.%02d", q$Revision: 2.7 $ =~ /(\d+)\.(\d+)/);
+@ISA = qw(Exporter);
+@EXPORT = qw(code2script script2code
+ all_script_codes all_script_names
+ script_code2code
+ LOCALE_CODE_ALPHA_2 LOCALE_CODE_ALPHA_3 LOCALE_CODE_NUMERIC);
+
+#-----------------------------------------------------------------------
+# Private Global Variables
+#-----------------------------------------------------------------------
+my $CODES = [];
+my $COUNTRIES = [];
+
+
+#=======================================================================
+#
+# code2script ( CODE [, CODESET ] )
+#
+#=======================================================================
+sub code2script
+{
+ my $code = shift;
+ my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+
+ return undef unless defined $code;
+
+ #-------------------------------------------------------------------
+ # Make sure the code is in the right form before we use it
+ # to look up the corresponding script.
+ # We have to sprintf because the codes are given as 3-digits,
+ # with leading 0's. Eg 070 for Egyptian demotic.
+ #-------------------------------------------------------------------
+ if ($codeset == LOCALE_CODE_NUMERIC)
+ {
+ return undef if ($code =~ /\D/);
+ $code = sprintf("%.3d", $code);
+ }
+ else
+ {
+ $code = lc($code);
+ }
+
+ if (exists $CODES->[$codeset]->{$code})
+ {
+ return $CODES->[$codeset]->{$code};
+ }
+ else
+ {
+ #---------------------------------------------------------------
+ # no such script code!
+ #---------------------------------------------------------------
+ return undef;
+ }
+}
+
+
+#=======================================================================
+#
+# script2code ( SCRIPT [, CODESET ] )
+#
+#=======================================================================
+sub script2code
+{
+ my $script = shift;
+ my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+
+ return undef unless defined $script;
+ $script = lc($script);
+ if (exists $COUNTRIES->[$codeset]->{$script})
+ {
+ return $COUNTRIES->[$codeset]->{$script};
+ }
+ else
+ {
+ #---------------------------------------------------------------
+ # no such script!
+ #---------------------------------------------------------------
+ return undef;
+ }
+}
+
+
+#=======================================================================
+#
+# script_code2code ( CODE, IN-CODESET, OUT-CODESET )
+#
+#=======================================================================
+sub script_code2code
+{
+ (@_ == 3) or croak "script_code2code() takes 3 arguments!";
+
+ my $code = shift;
+ my $inset = shift;
+ my $outset = shift;
+ my $outcode;
+ my $script;
+
+
+ return undef if $inset == $outset;
+ $script = code2script($code, $inset);
+ return undef if not defined $script;
+ $outcode = script2code($script, $outset);
+ return $outcode;
+}
+
+
+#=======================================================================
+#
+# all_script_codes()
+#
+#=======================================================================
+sub all_script_codes
+{
+ my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+ return keys %{ $CODES->[$codeset] };
+}
+
+
+#=======================================================================
+#
+# all_script_names()
+#
+#=======================================================================
+sub all_script_names
+{
+ my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+ return values %{ $CODES->[$codeset] };
+}
+
+
+#=======================================================================
+#
+# initialisation code - stuff the DATA into the ALPHA2 hash
+#
+#=======================================================================
+{
+ my ($alpha2, $alpha3, $numeric);
+ my $script;
+ local $_;
+
+
+ while (<DATA>)
+ {
+ next unless /\S/;
+ chop;
+ ($alpha2, $alpha3, $numeric, $script) = split(/:/, $_, 4);
+
+ $CODES->[LOCALE_CODE_ALPHA_2]->{$alpha2} = $script;
+ $COUNTRIES->[LOCALE_CODE_ALPHA_2]->{"\L$script"} = $alpha2;
+
+ if ($alpha3)
+ {
+ $CODES->[LOCALE_CODE_ALPHA_3]->{$alpha3} = $script;
+ $COUNTRIES->[LOCALE_CODE_ALPHA_3]->{"\L$script"} = $alpha3;
+ }
+
+ if ($numeric)
+ {
+ $CODES->[LOCALE_CODE_NUMERIC]->{$numeric} = $script;
+ $COUNTRIES->[LOCALE_CODE_NUMERIC]->{"\L$script"} = $numeric;
+ }
+
+ }
+
+ close(DATA);
+}
+
+1;
+
+__DATA__
+am:ama:130:Aramaic
+ar:ara:160:Arabic
+av:ave:151:Avestan
+bh:bhm:300:Brahmi (Ashoka)
+bi:bid:372:Buhid
+bn:ben:325:Bengali
+bo:bod:330:Tibetan
+bp:bpm:285:Bopomofo
+br:brl:570:Braille
+bt:btk:365:Batak
+bu:bug:367:Buginese (Makassar)
+by:bys:550:Blissymbols
+ca:cam:358:Cham
+ch:chu:221:Old Church Slavonic
+ci:cir:291:Cirth
+cm:cmn:402:Cypro-Minoan
+co:cop:205:Coptic
+cp:cpr:403:Cypriote syllabary
+cy:cyr:220:Cyrillic
+ds:dsr:250:Deserel (Mormon)
+dv:dvn:315:Devanagari (Nagari)
+ed:egd:070:Egyptian demotic
+eg:egy:050:Egyptian hieroglyphs
+eh:egh:060:Egyptian hieratic
+el:ell:200:Greek
+eo:eos:210:Etruscan and Oscan
+et:eth:430:Ethiopic
+gl:glg:225:Glagolitic
+gm:gmu:310:Gurmukhi
+gt:gth:206:Gothic
+gu:guj:320:Gujarati
+ha:han:500:Han ideographs
+he:heb:125:Hebrew
+hg:hgl:420:Hangul
+hm:hmo:450:Pahawh Hmong
+ho:hoo:371:Hanunoo
+hr:hrg:410:Hiragana
+hu:hun:176:Old Hungarian runic
+hv:hvn:175:Kok Turki runic
+hy:hye:230:Armenian
+iv:ivl:610:Indus Valley
+ja:jap:930:(alias for Han + Hiragana + Katakana)
+jl:jlg:445:Cherokee syllabary
+jw:jwi:360:Javanese
+ka:kam:241:Georgian (Mxedruli)
+kh:khn:931:(alias for Hangul + Han)
+kk:kkn:411:Katakana
+km:khm:354:Khmer
+kn:kan:345:Kannada
+kr:krn:357:Karenni (Kayah Li)
+ks:kst:305:Kharoshthi
+kx:kax:240:Georgian (Xucuri)
+la:lat:217:Latin
+lf:laf:215:Latin (Fraktur variant)
+lg:lag:216:Latin (Gaelic variant)
+lo:lao:356:Lao
+lp:lpc:335:Lepcha (Rong)
+md:mda:140:Mandaean
+me:mer:100:Meroitic
+mh:may:090:Mayan hieroglyphs
+ml:mlm:347:Malayalam
+mn:mon:145:Mongolian
+my:mya:350:Burmese
+na:naa:400:Linear A
+nb:nbb:401:Linear B
+og:ogm:212:Ogham
+or:ory:327:Oriya
+os:osm:260:Osmanya
+ph:phx:115:Phoenician
+ph:pah:150:Pahlavi
+pl:pld:282:Pollard Phonetic
+pq:pqd:295:Klingon plQaD
+pr:prm:227:Old Permic
+ps:pst:600:Phaistos Disk
+rn:rnr:211:Runic (Germanic)
+rr:rro:620:Rongo-rongo
+sa:sar:110:South Arabian
+si:sin:348:Sinhala
+sj:syj:137:Syriac (Jacobite variant)
+sl:slb:440:Unified Canadian Aboriginal Syllabics
+sn:syn:136:Syriac (Nestorian variant)
+sw:sww:281:Shavian (Shaw)
+sy:syr:135:Syriac (Estrangelo)
+ta:tam:346:Tamil
+tb:tbw:373:Tagbanwa
+te:tel:340:Telugu
+tf:tfn:120:Tifnagh
+tg:tag:370:Tagalog
+th:tha:352:Thai
+tn:tna:170:Thaana
+tw:twr:290:Tengwar
+va:vai:470:Vai
+vs:vsp:280:Visible Speech
+xa:xas:000:Cuneiform, Sumero-Akkadian
+xf:xfa:105:Cuneiform, Old Persian
+xk:xkn:412:(alias for Hiragana + Katakana)
+xu:xug:106:Cuneiform, Ugaritic
+yi:yii:460:Yi
+zx:zxx:997:Unwritten language
+zy:zyy:998:Undetermined script
+zz:zzz:999:Uncoded script
diff --git a/Master/tlpkg/tlperl.straw/lib/Locale/Script.pod b/Master/tlpkg/tlperl.straw/lib/Locale/Script.pod
new file mode 100755
index 00000000000..93ff88245ea
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Locale/Script.pod
@@ -0,0 +1,253 @@
+
+=head1 NAME
+
+Locale::Script - ISO codes for script identification (ISO 15924)
+
+=head1 SYNOPSIS
+
+ use Locale::Script;
+ use Locale::Constants;
+
+ $script = code2script('ph'); # 'Phoenician'
+ $code = script2code('Tibetan'); # 'bo'
+ $code3 = script2code('Tibetan',
+ LOCALE_CODE_ALPHA_3); # 'bod'
+ $codeN = script2code('Tibetan',
+ LOCALE_CODE_ALPHA_NUMERIC); # 330
+
+ @codes = all_script_codes();
+ @scripts = all_script_names();
+
+
+=head1 DESCRIPTION
+
+The C<Locale::Script> module provides access to the ISO
+codes for identifying scripts, as defined in ISO 15924.
+For example, Egyptian hieroglyphs are denoted by the two-letter
+code 'eg', the three-letter code 'egy', and the numeric code 050.
+
+You can either access the codes via the conversion routines
+(described below), or with the two functions which return lists
+of all script codes or all script names.
+
+There are three different code sets you can use for identifying
+scripts:
+
+=over 4
+
+=item B<alpha-2>
+
+Two letter codes, such as 'bo' for Tibetan.
+This code set is identified with the symbol C<LOCALE_CODE_ALPHA_2>.
+
+=item B<alpha-3>
+
+Three letter codes, such as 'ell' for Greek.
+This code set is identified with the symbol C<LOCALE_CODE_ALPHA_3>.
+
+=item B<numeric>
+
+Numeric codes, such as 410 for Hiragana.
+This code set is identified with the symbol C<LOCALE_CODE_NUMERIC>.
+
+=back
+
+All of the routines take an optional additional argument
+which specifies the code set to use.
+If not specified, it defaults to the two-letter codes.
+This is partly for backwards compatibility (previous versions
+of Locale modules only supported the alpha-2 codes), and
+partly because they are the most widely used codes.
+
+The alpha-2 and alpha-3 codes are not case-dependent,
+so you can use 'BO', 'Bo', 'bO' or 'bo' for Tibetan.
+When a code is returned by one of the functions in
+this module, it will always be lower-case.
+
+=head2 SPECIAL CODES
+
+The standard defines various special codes.
+
+=over 4
+
+=item *
+
+The standard reserves codes in the ranges B<qa> - B<qt>,
+B<qaa> - B<qat>, and B<900> - B<919>, for private use.
+
+=item *
+
+B<zx>, B<zxx>, and B<997>, are the codes for unwritten languages.
+
+=item *
+
+B<zy>, B<zyy>, and B<998>, are the codes for an undetermined script.
+
+=item *
+
+B<zz>, B<zzz>, and B<999>, are the codes for an uncoded script.
+
+=back
+
+The private codes are not recognised by Locale::Script,
+but the others are.
+
+
+=head1 CONVERSION ROUTINES
+
+There are three conversion routines: C<code2script()>, C<script2code()>,
+and C<script_code2code()>.
+
+=over 4
+
+=item code2script( CODE, [ CODESET ] )
+
+This function takes a script code and returns a string
+which contains the name of the script identified.
+If the code is not a valid script code, as defined by ISO 15924,
+then C<undef> will be returned:
+
+ $script = code2script('cy'); # Cyrillic
+
+=item script2code( STRING, [ CODESET ] )
+
+This function takes a script name and returns the corresponding
+script code, if such exists.
+If the argument could not be identified as a script name,
+then C<undef> will be returned:
+
+ $code = script2code('Gothic', LOCALE_CODE_ALPHA_3);
+ # $code will now be 'gth'
+
+The case of the script name is not important.
+See the section L<KNOWN BUGS AND LIMITATIONS> below.
+
+=item script_code2code( CODE, CODESET, CODESET )
+
+This function takes a script code from one code set,
+and returns the corresponding code from another code set.
+
+ $alpha2 = script_code2code('jwi',
+ LOCALE_CODE_ALPHA_3 => LOCALE_CODE_ALPHA_2);
+ # $alpha2 will now be 'jw' (Javanese)
+
+If the code passed is not a valid script code in
+the first code set, or if there isn't a code for the
+corresponding script in the second code set,
+then C<undef> will be returned.
+
+=back
+
+
+=head1 QUERY ROUTINES
+
+There are two function which can be used to obtain a list of all codes,
+or all script names:
+
+=over 4
+
+=item C<all_script_codes ( [ CODESET ] )>
+
+Returns a list of all two-letter script codes.
+The codes are guaranteed to be all lower-case,
+and not in any particular order.
+
+=item C<all_script_names ( [ CODESET ] )>
+
+Returns a list of all script names for which there is a corresponding
+script code in the specified code set.
+The names are capitalised, and not returned in any particular order.
+
+=back
+
+
+=head1 EXAMPLES
+
+The following example illustrates use of the C<code2script()> function.
+The user is prompted for a script code, and then told the corresponding
+script name:
+
+ $| = 1; # turn off buffering
+
+ print "Enter script code: ";
+ chop($code = <STDIN>);
+ $script = code2script($code, LOCALE_CODE_ALPHA_2);
+ if (defined $script)
+ {
+ print "$code = $script\n";
+ }
+ else
+ {
+ print "'$code' is not a valid script code!\n";
+ }
+
+
+=head1 KNOWN BUGS AND LIMITATIONS
+
+=over 4
+
+=item *
+
+When using C<script2code()>, the script name must currently appear
+exactly as it does in the source of the module. For example,
+
+ script2code('Egyptian hieroglyphs')
+
+will return B<eg>, as expected. But the following will all return C<undef>:
+
+ script2code('hieroglyphs')
+ script2code('Egyptian Hieroglypics')
+
+If there's need for it, a future version could have variants
+for script names.
+
+=item *
+
+In the current implementation, all data is read in when the
+module is loaded, and then held in memory.
+A lazy implementation would be more memory friendly.
+
+=back
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Locale::Language
+
+ISO two letter codes for identification of language (ISO 639).
+
+=item Locale::Currency
+
+ISO three letter codes for identification of currencies
+and funds (ISO 4217).
+
+=item Locale::Country
+
+ISO three letter codes for identification of countries (ISO 3166)
+
+=item ISO 15924
+
+The ISO standard which defines these codes.
+
+=item http://www.evertype.com/standards/iso15924/
+
+Home page for ISO 15924.
+
+
+=back
+
+
+=head1 AUTHOR
+
+Neil Bowers E<lt>neil@bowers.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2002-2004 Neil Bowers.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Memoize.pm b/Master/tlpkg/tlperl.straw/lib/Memoize.pm
new file mode 100755
index 00000000000..0cecbcab0a6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Memoize.pm
@@ -0,0 +1,1047 @@
+# -*- mode: perl; perl-indent-level: 2; -*-
+# Memoize.pm
+#
+# Transparent memoization of idempotent functions
+#
+# Copyright 1998, 1999, 2000, 2001 M-J. Dominus.
+# You may copy and distribute this program under the
+# same terms as Perl itself. If in doubt,
+# write to mjd-perl-memoize+@plover.com for a license.
+#
+# Version 1.01 $Revision: 1.18 $ $Date: 2001/06/24 17:16:47 $
+
+package Memoize;
+$VERSION = '1.01_03';
+
+# Compile-time constants
+sub SCALAR () { 0 }
+sub LIST () { 1 }
+
+
+#
+# Usage memoize(functionname/ref,
+# { NORMALIZER => coderef, INSTALL => name,
+# LIST_CACHE => descriptor, SCALAR_CACHE => descriptor }
+#
+
+use Carp;
+use Exporter;
+use vars qw($DEBUG);
+use Config; # Dammit.
+@ISA = qw(Exporter);
+@EXPORT = qw(memoize);
+@EXPORT_OK = qw(unmemoize flush_cache);
+use strict;
+
+my %memotable;
+my %revmemotable;
+my @CONTEXT_TAGS = qw(MERGE TIE MEMORY FAULT HASH);
+my %IS_CACHE_TAG = map {($_ => 1)} @CONTEXT_TAGS;
+
+# Raise an error if the user tries to specify one of thesepackage as a
+# tie for LIST_CACHE
+
+my %scalar_only = map {($_ => 1)} qw(DB_File GDBM_File SDBM_File ODBM_File NDBM_File);
+
+sub memoize {
+ my $fn = shift;
+ my %options = @_;
+ my $options = \%options;
+
+ unless (defined($fn) &&
+ (ref $fn eq 'CODE' || ref $fn eq '')) {
+ croak "Usage: memoize 'functionname'|coderef {OPTIONS}";
+ }
+
+ my $uppack = caller; # TCL me Elmo!
+ my $cref; # Code reference to original function
+ my $name = (ref $fn ? undef : $fn);
+
+ # Convert function names to code references
+ $cref = &_make_cref($fn, $uppack);
+
+ # Locate function prototype, if any
+ my $proto = prototype $cref;
+ if (defined $proto) { $proto = "($proto)" }
+ else { $proto = "" }
+
+ # I would like to get rid of the eval, but there seems not to be any
+ # other way to set the prototype properly. The switch here for
+ # 'usethreads' works around a bug in threadperl having to do with
+ # magic goto. It would be better to fix the bug and use the magic
+ # goto version everywhere.
+ my $wrapper =
+ $Config{usethreads}
+ ? eval "sub $proto { &_memoizer(\$cref, \@_); }"
+ : eval "sub $proto { unshift \@_, \$cref; goto &_memoizer; }";
+
+ my $normalizer = $options{NORMALIZER};
+ if (defined $normalizer && ! ref $normalizer) {
+ $normalizer = _make_cref($normalizer, $uppack);
+ }
+
+ my $install_name;
+ if (defined $options->{INSTALL}) {
+ # INSTALL => name
+ $install_name = $options->{INSTALL};
+ } elsif (! exists $options->{INSTALL}) {
+ # No INSTALL option provided; use original name if possible
+ $install_name = $name;
+ } else {
+ # INSTALL => undef means don't install
+ }
+
+ if (defined $install_name) {
+ $install_name = $uppack . '::' . $install_name
+ unless $install_name =~ /::/;
+ no strict;
+ local($^W) = 0; # ``Subroutine $install_name redefined at ...''
+ *{$install_name} = $wrapper; # Install memoized version
+ }
+
+ $revmemotable{$wrapper} = "" . $cref; # Turn code ref into hash key
+
+ # These will be the caches
+ my %caches;
+ for my $context (qw(SCALAR LIST)) {
+ # suppress subsequent 'uninitialized value' warnings
+ $options{"${context}_CACHE"} ||= '';
+
+ my $cache_opt = $options{"${context}_CACHE"};
+ my @cache_opt_args;
+ if (ref $cache_opt) {
+ @cache_opt_args = @$cache_opt;
+ $cache_opt = shift @cache_opt_args;
+ }
+ if ($cache_opt eq 'FAULT') { # no cache
+ $caches{$context} = undef;
+ } elsif ($cache_opt eq 'HASH') { # user-supplied hash
+ my $cache = $cache_opt_args[0];
+ my $package = ref(tied %$cache);
+ if ($context eq 'LIST' && $scalar_only{$package}) {
+ croak("You can't use $package for LIST_CACHE because it can only store scalars");
+ }
+ $caches{$context} = $cache;
+ } elsif ($cache_opt eq '' || $IS_CACHE_TAG{$cache_opt}) {
+ # default is that we make up an in-memory hash
+ $caches{$context} = {};
+ # (this might get tied later, or MERGEd away)
+ } else {
+ croak "Unrecognized option to `${context}_CACHE': `$cache_opt' should be one of (@CONTEXT_TAGS); aborting";
+ }
+ }
+
+ # Perhaps I should check here that you didn't supply *both* merge
+ # options. But if you did, it does do something reasonable: They
+ # both get merged to the same in-memory hash.
+ if ($options{SCALAR_CACHE} eq 'MERGE') {
+ $caches{SCALAR} = $caches{LIST};
+ } elsif ($options{LIST_CACHE} eq 'MERGE') {
+ $caches{LIST} = $caches{SCALAR};
+ }
+
+ # Now deal with the TIE options
+ {
+ my $context;
+ foreach $context (qw(SCALAR LIST)) {
+ # If the relevant option wasn't `TIE', this call does nothing.
+ _my_tie($context, $caches{$context}, $options); # Croaks on failure
+ }
+ }
+
+ # We should put some more stuff in here eventually.
+ # We've been saying that for serveral versions now.
+ # And you know what? More stuff keeps going in!
+ $memotable{$cref} =
+ {
+ O => $options, # Short keys here for things we need to access frequently
+ N => $normalizer,
+ U => $cref,
+ MEMOIZED => $wrapper,
+ PACKAGE => $uppack,
+ NAME => $install_name,
+ S => $caches{SCALAR},
+ L => $caches{LIST},
+ };
+
+ $wrapper # Return just memoized version
+}
+
+# This function tries to load a tied hash class and tie the hash to it.
+sub _my_tie {
+ my ($context, $hash, $options) = @_;
+ my $fullopt = $options->{"${context}_CACHE"};
+
+ # We already checked to make sure that this works.
+ my $shortopt = (ref $fullopt) ? $fullopt->[0] : $fullopt;
+
+ return unless defined $shortopt && $shortopt eq 'TIE';
+ carp("TIE option to memoize() is deprecated; use HASH instead")
+ if $^W;
+
+ my @args = ref $fullopt ? @$fullopt : ();
+ shift @args;
+ my $module = shift @args;
+ if ($context eq 'LIST' && $scalar_only{$module}) {
+ croak("You can't use $module for LIST_CACHE because it can only store scalars");
+ }
+ my $modulefile = $module . '.pm';
+ $modulefile =~ s{::}{/}g;
+ eval { require $modulefile };
+ if ($@) {
+ croak "Memoize: Couldn't load hash tie module `$module': $@; aborting";
+ }
+ my $rc = (tie %$hash => $module, @args);
+ unless ($rc) {
+ croak "Memoize: Couldn't tie hash to `$module': $!; aborting";
+ }
+ 1;
+}
+
+sub flush_cache {
+ my $func = _make_cref($_[0], scalar caller);
+ my $info = $memotable{$revmemotable{$func}};
+ die "$func not memoized" unless defined $info;
+ for my $context (qw(S L)) {
+ my $cache = $info->{$context};
+ if (tied %$cache && ! (tied %$cache)->can('CLEAR')) {
+ my $funcname = defined($info->{NAME}) ?
+ "function $info->{NAME}" : "anonymous function $func";
+ my $context = {S => 'scalar', L => 'list'}->{$context};
+ croak "Tied cache hash for $context-context $funcname does not support flushing";
+ } else {
+ %$cache = ();
+ }
+ }
+}
+
+# This is the function that manages the memo tables.
+sub _memoizer {
+ my $orig = shift; # stringized version of ref to original func.
+ my $info = $memotable{$orig};
+ my $normalizer = $info->{N};
+
+ my $argstr;
+ my $context = (wantarray() ? LIST : SCALAR);
+
+ if (defined $normalizer) {
+ no strict;
+ if ($context == SCALAR) {
+ $argstr = &{$normalizer}(@_);
+ } elsif ($context == LIST) {
+ ($argstr) = &{$normalizer}(@_);
+ } else {
+ croak "Internal error \#41; context was neither LIST nor SCALAR\n";
+ }
+ } else { # Default normalizer
+ local $^W = 0;
+ $argstr = join chr(28),@_;
+ }
+
+ if ($context == SCALAR) {
+ my $cache = $info->{S};
+ _crap_out($info->{NAME}, 'scalar') unless $cache;
+ if (exists $cache->{$argstr}) {
+ return $cache->{$argstr};
+ } else {
+ my $val = &{$info->{U}}(@_);
+ # Scalars are considered to be lists; store appropriately
+ if ($info->{O}{SCALAR_CACHE} eq 'MERGE') {
+ $cache->{$argstr} = [$val];
+ } else {
+ $cache->{$argstr} = $val;
+ }
+ $val;
+ }
+ } elsif ($context == LIST) {
+ my $cache = $info->{L};
+ _crap_out($info->{NAME}, 'list') unless $cache;
+ if (exists $cache->{$argstr}) {
+ my $val = $cache->{$argstr};
+ # If LISTCONTEXT=>MERGE, then the function never returns lists,
+ # so we have a scalar value cached, so just return it straightaway:
+ return ($val) if $info->{O}{LIST_CACHE} eq 'MERGE';
+ # Maybe in a later version we can use a faster test.
+
+ # Otherwise, we cached an array containing the returned list:
+ return @$val;
+ } else {
+ my @q = &{$info->{U}}(@_);
+ $cache->{$argstr} = $info->{O}{LIST_CACHE} eq 'MERGE' ? $q [0] : \@q;
+ @q;
+ }
+ } else {
+ croak "Internal error \#42; context was neither LIST nor SCALAR\n";
+ }
+}
+
+sub unmemoize {
+ my $f = shift;
+ my $uppack = caller;
+ my $cref = _make_cref($f, $uppack);
+
+ unless (exists $revmemotable{$cref}) {
+ croak "Could not unmemoize function `$f', because it was not memoized to begin with";
+ }
+
+ my $tabent = $memotable{$revmemotable{$cref}};
+ unless (defined $tabent) {
+ croak "Could not figure out how to unmemoize function `$f'";
+ }
+ my $name = $tabent->{NAME};
+ if (defined $name) {
+ no strict;
+ local($^W) = 0; # ``Subroutine $install_name redefined at ...''
+ *{$name} = $tabent->{U}; # Replace with original function
+ }
+ undef $memotable{$revmemotable{$cref}};
+ undef $revmemotable{$cref};
+
+ # This removes the last reference to the (possibly tied) memo tables
+ # my ($old_function, $memotabs) = @{$tabent}{'U','S','L'};
+ # undef $tabent;
+
+# # Untie the memo tables if they were tied.
+# my $i;
+# for $i (0,1) {
+# if (tied %{$memotabs->[$i]}) {
+# warn "Untying hash #$i\n";
+# untie %{$memotabs->[$i]};
+# }
+# }
+
+ $tabent->{U};
+}
+
+sub _make_cref {
+ my $fn = shift;
+ my $uppack = shift;
+ my $cref;
+ my $name;
+
+ if (ref $fn eq 'CODE') {
+ $cref = $fn;
+ } elsif (! ref $fn) {
+ if ($fn =~ /::/) {
+ $name = $fn;
+ } else {
+ $name = $uppack . '::' . $fn;
+ }
+ no strict;
+ if (defined $name and !defined(&$name)) {
+ croak "Cannot operate on nonexistent function `$fn'";
+ }
+# $cref = \&$name;
+ $cref = *{$name}{CODE};
+ } else {
+ my $parent = (caller(1))[3]; # Function that called _make_cref
+ croak "Usage: argument 1 to `$parent' must be a function name or reference.\n";
+ }
+ $DEBUG and warn "${name}($fn) => $cref in _make_cref\n";
+ $cref;
+}
+
+sub _crap_out {
+ my ($funcname, $context) = @_;
+ if (defined $funcname) {
+ croak "Function `$funcname' called in forbidden $context context; faulting";
+ } else {
+ croak "Anonymous function called in forbidden $context context; faulting";
+ }
+}
+
+1;
+
+
+
+
+
+=head1 NAME
+
+Memoize - Make functions faster by trading space for time
+
+=head1 SYNOPSIS
+
+ # This is the documentation for Memoize 1.01
+ use Memoize;
+ memoize('slow_function');
+ slow_function(arguments); # Is faster than it was before
+
+
+This is normally all you need to know. However, many options are available:
+
+ memoize(function, options...);
+
+Options include:
+
+ NORMALIZER => function
+ INSTALL => new_name
+
+ SCALAR_CACHE => 'MEMORY'
+ SCALAR_CACHE => ['HASH', \%cache_hash ]
+ SCALAR_CACHE => 'FAULT'
+ SCALAR_CACHE => 'MERGE'
+
+ LIST_CACHE => 'MEMORY'
+ LIST_CACHE => ['HASH', \%cache_hash ]
+ LIST_CACHE => 'FAULT'
+ LIST_CACHE => 'MERGE'
+
+=head1 DESCRIPTION
+
+`Memoizing' a function makes it faster by trading space for time. It
+does this by caching the return values of the function in a table.
+If you call the function again with the same arguments, C<memoize>
+jumps in and gives you the value out of the table, instead of letting
+the function compute the value all over again.
+
+Here is an extreme example. Consider the Fibonacci sequence, defined
+by the following function:
+
+ # Compute Fibonacci numbers
+ sub fib {
+ my $n = shift;
+ return $n if $n < 2;
+ fib($n-1) + fib($n-2);
+ }
+
+This function is very slow. Why? To compute fib(14), it first wants
+to compute fib(13) and fib(12), and add the results. But to compute
+fib(13), it first has to compute fib(12) and fib(11), and then it
+comes back and computes fib(12) all over again even though the answer
+is the same. And both of the times that it wants to compute fib(12),
+it has to compute fib(11) from scratch, and then it has to do it
+again each time it wants to compute fib(13). This function does so
+much recomputing of old results that it takes a really long time to
+run---fib(14) makes 1,200 extra recursive calls to itself, to compute
+and recompute things that it already computed.
+
+This function is a good candidate for memoization. If you memoize the
+`fib' function above, it will compute fib(14) exactly once, the first
+time it needs to, and then save the result in a table. Then if you
+ask for fib(14) again, it gives you the result out of the table.
+While computing fib(14), instead of computing fib(12) twice, it does
+it once; the second time it needs the value it gets it from the table.
+It doesn't compute fib(11) four times; it computes it once, getting it
+from the table the next three times. Instead of making 1,200
+recursive calls to `fib', it makes 15. This makes the function about
+150 times faster.
+
+You could do the memoization yourself, by rewriting the function, like
+this:
+
+ # Compute Fibonacci numbers, memoized version
+ { my @fib;
+ sub fib {
+ my $n = shift;
+ return $fib[$n] if defined $fib[$n];
+ return $fib[$n] = $n if $n < 2;
+ $fib[$n] = fib($n-1) + fib($n-2);
+ }
+ }
+
+Or you could use this module, like this:
+
+ use Memoize;
+ memoize('fib');
+
+ # Rest of the fib function just like the original version.
+
+This makes it easy to turn memoizing on and off.
+
+Here's an even simpler example: I wrote a simple ray tracer; the
+program would look in a certain direction, figure out what it was
+looking at, and then convert the `color' value (typically a string
+like `red') of that object to a red, green, and blue pixel value, like
+this:
+
+ for ($direction = 0; $direction < 300; $direction++) {
+ # Figure out which object is in direction $direction
+ $color = $object->{color};
+ ($r, $g, $b) = @{&ColorToRGB($color)};
+ ...
+ }
+
+Since there are relatively few objects in a picture, there are only a
+few colors, which get looked up over and over again. Memoizing
+C<ColorToRGB> sped up the program by several percent.
+
+=head1 DETAILS
+
+This module exports exactly one function, C<memoize>. The rest of the
+functions in this package are None of Your Business.
+
+You should say
+
+ memoize(function)
+
+where C<function> is the name of the function you want to memoize, or
+a reference to it. C<memoize> returns a reference to the new,
+memoized version of the function, or C<undef> on a non-fatal error.
+At present, there are no non-fatal errors, but there might be some in
+the future.
+
+If C<function> was the name of a function, then C<memoize> hides the
+old version and installs the new memoized version under the old name,
+so that C<&function(...)> actually invokes the memoized version.
+
+=head1 OPTIONS
+
+There are some optional options you can pass to C<memoize> to change
+the way it behaves a little. To supply options, invoke C<memoize>
+like this:
+
+ memoize(function, NORMALIZER => function,
+ INSTALL => newname,
+ SCALAR_CACHE => option,
+ LIST_CACHE => option
+ );
+
+Each of these options is optional; you can include some, all, or none
+of them.
+
+=head2 INSTALL
+
+If you supply a function name with C<INSTALL>, memoize will install
+the new, memoized version of the function under the name you give.
+For example,
+
+ memoize('fib', INSTALL => 'fastfib')
+
+installs the memoized version of C<fib> as C<fastfib>; without the
+C<INSTALL> option it would have replaced the old C<fib> with the
+memoized version.
+
+To prevent C<memoize> from installing the memoized version anywhere, use
+C<INSTALL =E<gt> undef>.
+
+=head2 NORMALIZER
+
+Suppose your function looks like this:
+
+ # Typical call: f('aha!', A => 11, B => 12);
+ sub f {
+ my $a = shift;
+ my %hash = @_;
+ $hash{B} ||= 2; # B defaults to 2
+ $hash{C} ||= 7; # C defaults to 7
+
+ # Do something with $a, %hash
+ }
+
+Now, the following calls to your function are all completely equivalent:
+
+ f(OUCH);
+ f(OUCH, B => 2);
+ f(OUCH, C => 7);
+ f(OUCH, B => 2, C => 7);
+ f(OUCH, C => 7, B => 2);
+ (etc.)
+
+However, unless you tell C<Memoize> that these calls are equivalent,
+it will not know that, and it will compute the values for these
+invocations of your function separately, and store them separately.
+
+To prevent this, supply a C<NORMALIZER> function that turns the
+program arguments into a string in a way that equivalent arguments
+turn into the same string. A C<NORMALIZER> function for C<f> above
+might look like this:
+
+ sub normalize_f {
+ my $a = shift;
+ my %hash = @_;
+ $hash{B} ||= 2;
+ $hash{C} ||= 7;
+
+ join(',', $a, map ($_ => $hash{$_}) sort keys %hash);
+ }
+
+Each of the argument lists above comes out of the C<normalize_f>
+function looking exactly the same, like this:
+
+ OUCH,B,2,C,7
+
+You would tell C<Memoize> to use this normalizer this way:
+
+ memoize('f', NORMALIZER => 'normalize_f');
+
+C<memoize> knows that if the normalized version of the arguments is
+the same for two argument lists, then it can safely look up the value
+that it computed for one argument list and return it as the result of
+calling the function with the other argument list, even if the
+argument lists look different.
+
+The default normalizer just concatenates the arguments with character
+28 in between. (In ASCII, this is called FS or control-\.) This
+always works correctly for functions with only one string argument,
+and also when the arguments never contain character 28. However, it
+can confuse certain argument lists:
+
+ normalizer("a\034", "b")
+ normalizer("a", "\034b")
+ normalizer("a\034\034b")
+
+for example.
+
+Since hash keys are strings, the default normalizer will not
+distinguish between C<undef> and the empty string. It also won't work
+when the function's arguments are references. For example, consider a
+function C<g> which gets two arguments: A number, and a reference to
+an array of numbers:
+
+ g(13, [1,2,3,4,5,6,7]);
+
+The default normalizer will turn this into something like
+C<"13\034ARRAY(0x436c1f)">. That would be all right, except that a
+subsequent array of numbers might be stored at a different location
+even though it contains the same data. If this happens, C<Memoize>
+will think that the arguments are different, even though they are
+equivalent. In this case, a normalizer like this is appropriate:
+
+ sub normalize { join ' ', $_[0], @{$_[1]} }
+
+For the example above, this produces the key "13 1 2 3 4 5 6 7".
+
+Another use for normalizers is when the function depends on data other
+than those in its arguments. Suppose you have a function which
+returns a value which depends on the current hour of the day:
+
+ sub on_duty {
+ my ($problem_type) = @_;
+ my $hour = (localtime)[2];
+ open my $fh, "$DIR/$problem_type" or die...;
+ my $line;
+ while ($hour-- > 0)
+ $line = <$fh>;
+ }
+ return $line;
+ }
+
+At 10:23, this function generates the 10th line of a data file; at
+3:45 PM it generates the 15th line instead. By default, C<Memoize>
+will only see the $problem_type argument. To fix this, include the
+current hour in the normalizer:
+
+ sub normalize { join ' ', (localtime)[2], @_ }
+
+The calling context of the function (scalar or list context) is
+propagated to the normalizer. This means that if the memoized
+function will treat its arguments differently in list context than it
+would in scalar context, you can have the normalizer function select
+its behavior based on the results of C<wantarray>. Even if called in
+a list context, a normalizer should still return a single string.
+
+=head2 C<SCALAR_CACHE>, C<LIST_CACHE>
+
+Normally, C<Memoize> caches your function's return values into an
+ordinary Perl hash variable. However, you might like to have the
+values cached on the disk, so that they persist from one run of your
+program to the next, or you might like to associate some other
+interesting semantics with the cached values.
+
+There's a slight complication under the hood of C<Memoize>: There are
+actually I<two> caches, one for scalar values and one for list values.
+When your function is called in scalar context, its return value is
+cached in one hash, and when your function is called in list context,
+its value is cached in the other hash. You can control the caching
+behavior of both contexts independently with these options.
+
+The argument to C<LIST_CACHE> or C<SCALAR_CACHE> must either be one of
+the following four strings:
+
+ MEMORY
+ FAULT
+ MERGE
+ HASH
+
+or else it must be a reference to a list whose first element is one of
+these four strings, such as C<[HASH, arguments...]>.
+
+=over 4
+
+=item C<MEMORY>
+
+C<MEMORY> means that return values from the function will be cached in
+an ordinary Perl hash variable. The hash variable will not persist
+after the program exits. This is the default.
+
+=item C<HASH>
+
+C<HASH> allows you to specify that a particular hash that you supply
+will be used as the cache. You can tie this hash beforehand to give
+it any behavior you want.
+
+A tied hash can have any semantics at all. It is typically tied to an
+on-disk database, so that cached values are stored in the database and
+retrieved from it again when needed, and the disk file typically
+persists after your program has exited. See C<perltie> for more
+complete details about C<tie>.
+
+A typical example is:
+
+ use DB_File;
+ tie my %cache => 'DB_File', $filename, O_RDWR|O_CREAT, 0666;
+ memoize 'function', SCALAR_CACHE => [HASH => \%cache];
+
+This has the effect of storing the cache in a C<DB_File> database
+whose name is in C<$filename>. The cache will persist after the
+program has exited. Next time the program runs, it will find the
+cache already populated from the previous run of the program. Or you
+can forcibly populate the cache by constructing a batch program that
+runs in the background and populates the cache file. Then when you
+come to run your real program the memoized function will be fast
+because all its results have been precomputed.
+
+=item C<TIE>
+
+This option is no longer supported. It is still documented only to
+aid in the debugging of old programs that use it. Old programs should
+be converted to use the C<HASH> option instead.
+
+ memoize ... [TIE, PACKAGE, ARGS...]
+
+is merely a shortcut for
+
+ require PACKAGE;
+ { my %cache;
+ tie %cache, PACKAGE, ARGS...;
+ }
+ memoize ... [HASH => \%cache];
+
+=item C<FAULT>
+
+C<FAULT> means that you never expect to call the function in scalar
+(or list) context, and that if C<Memoize> detects such a call, it
+should abort the program. The error message is one of
+
+ `foo' function called in forbidden list context at line ...
+ `foo' function called in forbidden scalar context at line ...
+
+=item C<MERGE>
+
+C<MERGE> normally means the function does not distinguish between list
+and sclar context, and that return values in both contexts should be
+stored together. C<LIST_CACHE =E<gt> MERGE> means that list context
+return values should be stored in the same hash that is used for
+scalar context returns, and C<SCALAR_CACHE =E<gt> MERGE> means the
+same, mutatis mutandis. It is an error to specify C<MERGE> for both,
+but it probably does something useful.
+
+Consider this function:
+
+ sub pi { 3; }
+
+Normally, the following code will result in two calls to C<pi>:
+
+ $x = pi();
+ ($y) = pi();
+ $z = pi();
+
+The first call caches the value C<3> in the scalar cache; the second
+caches the list C<(3)> in the list cache. The third call doesn't call
+the real C<pi> function; it gets the value from the scalar cache.
+
+Obviously, the second call to C<pi> is a waste of time, and storing
+its return value is a waste of space. Specifying C<LIST_CACHE =E<gt>
+MERGE> will make C<memoize> use the same cache for scalar and list
+context return values, so that the second call uses the scalar cache
+that was populated by the first call. C<pi> ends up being called only
+once, and both subsequent calls return C<3> from the cache, regardless
+of the calling context.
+
+Another use for C<MERGE> is when you want both kinds of return values
+stored in the same disk file; this saves you from having to deal with
+two disk files instead of one. You can use a normalizer function to
+keep the two sets of return values separate. For example:
+
+ tie my %cache => 'MLDBM', 'DB_File', $filename, ...;
+
+ memoize 'myfunc',
+ NORMALIZER => 'n',
+ SCALAR_CACHE => [HASH => \%cache],
+ LIST_CACHE => MERGE,
+ ;
+
+ sub n {
+ my $context = wantarray() ? 'L' : 'S';
+ # ... now compute the hash key from the arguments ...
+ $hashkey = "$context:$hashkey";
+ }
+
+This normalizer function will store scalar context return values in
+the disk file under keys that begin with C<S:>, and list context
+return values under keys that begin with C<L:>.
+
+=back
+
+=head1 OTHER FACILITIES
+
+=head2 C<unmemoize>
+
+There's an C<unmemoize> function that you can import if you want to.
+Why would you want to? Here's an example: Suppose you have your cache
+tied to a DBM file, and you want to make sure that the cache is
+written out to disk if someone interrupts the program. If the program
+exits normally, this will happen anyway, but if someone types
+control-C or something then the program will terminate immediately
+without synchronizing the database. So what you can do instead is
+
+ $SIG{INT} = sub { unmemoize 'function' };
+
+C<unmemoize> accepts a reference to, or the name of a previously
+memoized function, and undoes whatever it did to provide the memoized
+version in the first place, including making the name refer to the
+unmemoized version if appropriate. It returns a reference to the
+unmemoized version of the function.
+
+If you ask it to unmemoize a function that was never memoized, it
+croaks.
+
+=head2 C<flush_cache>
+
+C<flush_cache(function)> will flush out the caches, discarding I<all>
+the cached data. The argument may be a function name or a reference
+to a function. For finer control over when data is discarded or
+expired, see the documentation for C<Memoize::Expire>, included in
+this package.
+
+Note that if the cache is a tied hash, C<flush_cache> will attempt to
+invoke the C<CLEAR> method on the hash. If there is no C<CLEAR>
+method, this will cause a run-time error.
+
+An alternative approach to cache flushing is to use the C<HASH> option
+(see above) to request that C<Memoize> use a particular hash variable
+as its cache. Then you can examine or modify the hash at any time in
+any way you desire. You may flush the cache by using C<%hash = ()>.
+
+=head1 CAVEATS
+
+Memoization is not a cure-all:
+
+=over 4
+
+=item *
+
+Do not memoize a function whose behavior depends on program
+state other than its own arguments, such as global variables, the time
+of day, or file input. These functions will not produce correct
+results when memoized. For a particularly easy example:
+
+ sub f {
+ time;
+ }
+
+This function takes no arguments, and as far as C<Memoize> is
+concerned, it always returns the same result. C<Memoize> is wrong, of
+course, and the memoized version of this function will call C<time> once
+to get the current time, and it will return that same time
+every time you call it after that.
+
+=item *
+
+Do not memoize a function with side effects.
+
+ sub f {
+ my ($a, $b) = @_;
+ my $s = $a + $b;
+ print "$a + $b = $s.\n";
+ }
+
+This function accepts two arguments, adds them, and prints their sum.
+Its return value is the numuber of characters it printed, but you
+probably didn't care about that. But C<Memoize> doesn't understand
+that. If you memoize this function, you will get the result you
+expect the first time you ask it to print the sum of 2 and 3, but
+subsequent calls will return 1 (the return value of
+C<print>) without actually printing anything.
+
+=item *
+
+Do not memoize a function that returns a data structure that is
+modified by its caller.
+
+Consider these functions: C<getusers> returns a list of users somehow,
+and then C<main> throws away the first user on the list and prints the
+rest:
+
+ sub main {
+ my $userlist = getusers();
+ shift @$userlist;
+ foreach $u (@$userlist) {
+ print "User $u\n";
+ }
+ }
+
+ sub getusers {
+ my @users;
+ # Do something to get a list of users;
+ \@users; # Return reference to list.
+ }
+
+If you memoize C<getusers> here, it will work right exactly once. The
+reference to the users list will be stored in the memo table. C<main>
+will discard the first element from the referenced list. The next
+time you invoke C<main>, C<Memoize> will not call C<getusers>; it will
+just return the same reference to the same list it got last time. But
+this time the list has already had its head removed; C<main> will
+erroneously remove another element from it. The list will get shorter
+and shorter every time you call C<main>.
+
+Similarly, this:
+
+ $u1 = getusers();
+ $u2 = getusers();
+ pop @$u1;
+
+will modify $u2 as well as $u1, because both variables are references
+to the same array. Had C<getusers> not been memoized, $u1 and $u2
+would have referred to different arrays.
+
+=item *
+
+Do not memoize a very simple function.
+
+Recently someone mentioned to me that the Memoize module made his
+program run slower instead of faster. It turned out that he was
+memoizing the following function:
+
+ sub square {
+ $_[0] * $_[0];
+ }
+
+I pointed out that C<Memoize> uses a hash, and that looking up a
+number in the hash is necessarily going to take a lot longer than a
+single multiplication. There really is no way to speed up the
+C<square> function.
+
+Memoization is not magical.
+
+=back
+
+=head1 PERSISTENT CACHE SUPPORT
+
+You can tie the cache tables to any sort of tied hash that you want
+to, as long as it supports C<TIEHASH>, C<FETCH>, C<STORE>, and
+C<EXISTS>. For example,
+
+ tie my %cache => 'GDBM_File', $filename, O_RDWR|O_CREAT, 0666;
+ memoize 'function', SCALAR_CACHE => [HASH => \%cache];
+
+works just fine. For some storage methods, you need a little glue.
+
+C<SDBM_File> doesn't supply an C<EXISTS> method, so included in this
+package is a glue module called C<Memoize::SDBM_File> which does
+provide one. Use this instead of plain C<SDBM_File> to store your
+cache table on disk in an C<SDBM_File> database:
+
+ tie my %cache => 'Memoize::SDBM_File', $filename, O_RDWR|O_CREAT, 0666;
+ memoize 'function', SCALAR_CACHE => [HASH => \%cache];
+
+C<NDBM_File> has the same problem and the same solution. (Use
+C<Memoize::NDBM_File instead of plain NDBM_File.>)
+
+C<Storable> isn't a tied hash class at all. You can use it to store a
+hash to disk and retrieve it again, but you can't modify the hash while
+it's on the disk. So if you want to store your cache table in a
+C<Storable> database, use C<Memoize::Storable>, which puts a hashlike
+front-end onto C<Storable>. The hash table is actually kept in
+memory, and is loaded from your C<Storable> file at the time you
+memoize the function, and stored back at the time you unmemoize the
+function (or when your program exits):
+
+ tie my %cache => 'Memoize::Storable', $filename;
+ memoize 'function', SCALAR_CACHE => [HASH => \%cache];
+
+ tie my %cache => 'Memoize::Storable', $filename, 'nstore';
+ memoize 'function', SCALAR_CACHE => [HASH => \%cache];
+
+Include the `nstore' option to have the C<Storable> database written
+in `network order'. (See L<Storable> for more details about this.)
+
+The C<flush_cache()> function will raise a run-time error unless the
+tied package provides a C<CLEAR> method.
+
+=head1 EXPIRATION SUPPORT
+
+See Memoize::Expire, which is a plug-in module that adds expiration
+functionality to Memoize. If you don't like the kinds of policies
+that Memoize::Expire implements, it is easy to write your own plug-in
+module to implement whatever policy you desire. Memoize comes with
+several examples. An expiration manager that implements a LRU policy
+is available on CPAN as Memoize::ExpireLRU.
+
+=head1 BUGS
+
+The test suite is much better, but always needs improvement.
+
+There is some problem with the way C<goto &f> works under threaded
+Perl, perhaps because of the lexical scoping of C<@_>. This is a bug
+in Perl, and until it is resolved, memoized functions will see a
+slightly different C<caller()> and will perform a little more slowly
+on threaded perls than unthreaded perls.
+
+Some versions of C<DB_File> won't let you store data under a key of
+length 0. That means that if you have a function C<f> which you
+memoized and the cache is in a C<DB_File> database, then the value of
+C<f()> (C<f> called with no arguments) will not be memoized. If this
+is a big problem, you can supply a normalizer function that prepends
+C<"x"> to every key.
+
+=head1 MAILING LIST
+
+To join a very low-traffic mailing list for announcements about
+C<Memoize>, send an empty note to C<mjd-perl-memoize-request@plover.com>.
+
+=head1 AUTHOR
+
+Mark-Jason Dominus (C<mjd-perl-memoize+@plover.com>), Plover Systems co.
+
+See the C<Memoize.pm> Page at http://www.plover.com/~mjd/perl/Memoize/
+for news and upgrades. Near this page, at
+http://www.plover.com/~mjd/perl/MiniMemoize/ there is an article about
+memoization and about the internals of Memoize that appeared in The
+Perl Journal, issue #13. (This article is also included in the
+Memoize distribution as `article.html'.)
+
+The author's book I<Higher Order Perl> (2005, ISBN 1558607013, published
+by Morgan Kaufmann) discusses memoization (and many other fascinating
+topics) in tremendous detail. It will also be available on-line for free.
+For more information, visit http://perl.plover.com/book/ .
+
+To join a mailing list for announcements about C<Memoize>, send an
+empty message to C<mjd-perl-memoize-request@plover.com>. This mailing
+list is for announcements only and has extremely low traffic---about
+two messages per year.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1998, 1999, 2000, 2001 by Mark Jason Dominus
+
+This library is free software; you may redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 THANK YOU
+
+Many thanks to Jonathan Roy for bug reports and suggestions, to
+Michael Schwern for other bug reports and patches, to Mike Cariaso for
+helping me to figure out the Right Thing to Do About Expiration, to
+Joshua Gerth, Joshua Chamas, Jonathan Roy (again), Mark D. Anderson,
+and Andrew Johnson for more suggestions about expiration, to Brent
+Powers for the Memoize::ExpireLRU module, to Ariel Scolnicov for
+delightful messages about the Fibonacci function, to Dion Almaer for
+thought-provoking suggestions about the default normalizer, to Walt
+Mankowski and Kurt Starsinic for much help investigating problems
+under threaded Perl, to Alex Dudkevich for reporting the bug in
+prototyped functions and for checking my patch, to Tony Bass for many
+helpful suggestions, to Jonathan Roy (again) for finding a use for
+C<unmemoize()>, to Philippe Verdret for enlightening discussion of
+C<Hook::PrePostCall>, to Nat Torkington for advice I ignored, to Chris
+Nandor for portability advice, to Randal Schwartz for suggesting the
+'C<flush_cache> function, and to Jenda Krynicky for being a light in
+the world.
+
+Special thanks to Jarkko Hietaniemi, the 5.8.0 pumpking, for including
+this module in the core and for his patient and helpful guidance
+during the integration process.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build.pm
new file mode 100755
index 00000000000..d265d50657a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build.pm
@@ -0,0 +1,1146 @@
+package Module::Build;
+
+# This module doesn't do much of anything itself, it inherits from the
+# modules that do the real work. The only real thing it has to do is
+# figure out which OS-specific module to pull in. Many of the
+# OS-specific modules don't do anything either - most of the work is
+# done in Module::Build::Base.
+
+use strict;
+use File::Spec ();
+use File::Path ();
+use File::Basename ();
+
+use Module::Build::Base;
+
+use vars qw($VERSION @ISA);
+@ISA = qw(Module::Build::Base);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+
+# Okay, this is the brute-force method of finding out what kind of
+# platform we're on. I don't know of a systematic way. These values
+# came from the latest (bleadperl) perlport.pod.
+
+my %OSTYPES = qw(
+ aix Unix
+ bsdos Unix
+ dgux Unix
+ dragonfly Unix
+ dynixptx Unix
+ freebsd Unix
+ linux Unix
+ haiku Unix
+ hpux Unix
+ irix Unix
+ darwin Unix
+ machten Unix
+ midnightbsd Unix
+ mirbsd Unix
+ next Unix
+ openbsd Unix
+ netbsd Unix
+ dec_osf Unix
+ nto Unix
+ svr4 Unix
+ svr5 Unix
+ sco_sv Unix
+ unicos Unix
+ unicosmk Unix
+ solaris Unix
+ sunos Unix
+ cygwin Unix
+ os2 Unix
+ interix Unix
+ gnu Unix
+ gnukfreebsd Unix
+ nto Unix
+
+ dos Windows
+ MSWin32 Windows
+
+ os390 EBCDIC
+ os400 EBCDIC
+ posix-bc EBCDIC
+ vmesa EBCDIC
+
+ MacOS MacOS
+ VMS VMS
+ VOS VOS
+ riscos RiscOS
+ amigaos Amiga
+ mpeix MPEiX
+ );
+
+# Inserts the given module into the @ISA hierarchy between
+# Module::Build and its immediate parent
+sub _interpose_module {
+ my ($self, $mod) = @_;
+ eval "use $mod";
+ die $@ if $@;
+
+ no strict 'refs';
+ my $top_class = $mod;
+ while (@{"${top_class}::ISA"}) {
+ last if ${"${top_class}::ISA"}[0] eq $ISA[0];
+ $top_class = ${"${top_class}::ISA"}[0];
+ }
+
+ @{"${top_class}::ISA"} = @ISA;
+ @ISA = ($mod);
+}
+
+if (grep {-e File::Spec->catfile($_, qw(Module Build Platform), $^O) . '.pm'} @INC) {
+ __PACKAGE__->_interpose_module("Module::Build::Platform::$^O");
+
+} elsif (exists $OSTYPES{$^O}) {
+ __PACKAGE__->_interpose_module("Module::Build::Platform::$OSTYPES{$^O}");
+
+} else {
+ warn "Unknown OS type '$^O' - using default settings\n";
+}
+
+sub os_type { $OSTYPES{$^O} }
+
+sub is_vmsish { return ((os_type() || '') eq 'VMS') }
+sub is_windowsish { return ((os_type() || '') eq 'Windows') }
+sub is_unixish { return ((os_type() || '') eq 'Unix') }
+
+1;
+
+__END__
+
+=for :stopwords
+bindoc binhtml destdir distcheck distclean distdir distmeta distsign disttest
+fakeinstall html installdirs installsitebin installsitescript installvendorbin
+installvendorscript libdoc libhtml pardist ppd ppmdist realclean skipcheck
+testall testcover testdb testpod testpodcoverage versioninstall
+
+=head1 NAME
+
+Module::Build - Build and install Perl modules
+
+
+=head1 SYNOPSIS
+
+Standard process for building & installing modules:
+
+ perl Build.PL
+ ./Build
+ ./Build test
+ ./Build install
+
+Or, if you're on a platform (like DOS or Windows) that doesn't require
+the "./" notation, you can do this:
+
+ perl Build.PL
+ Build
+ Build test
+ Build install
+
+
+=head1 DESCRIPTION
+
+C<Module::Build> is a system for building, testing, and installing
+Perl modules. It is meant to be an alternative to
+C<ExtUtils::MakeMaker>. Developers may alter the behavior of the
+module through subclassing in a much more straightforward way than
+with C<MakeMaker>. It also does not require a C<make> on your system
+- most of the C<Module::Build> code is pure-perl and written in a very
+cross-platform way. In fact, you don't even need a shell, so even
+platforms like MacOS (traditional) can use it fairly easily. Its only
+prerequisites are modules that are included with perl 5.6.0, and it
+works fine on perl 5.005 if you can install a few additional modules.
+
+See L<"MOTIVATIONS"> for more comparisons between C<ExtUtils::MakeMaker>
+and C<Module::Build>.
+
+To install C<Module::Build>, and any other module that uses
+C<Module::Build> for its installation process, do the following:
+
+ perl Build.PL # 'Build.PL' script creates the 'Build' script
+ ./Build # Need ./ to ensure we're using this "Build" script
+ ./Build test # and not another one that happens to be in the PATH
+ ./Build install
+
+This illustrates initial configuration and the running of three
+'actions'. In this case the actions run are 'build' (the default
+action), 'test', and 'install'. Other actions defined so far include:
+
+ build manpages
+ clean pardist
+ code patch_blead
+ config_data ppd
+ diff ppmdist
+ dist prereq_data
+ distcheck prereq_report
+ distclean pure_install
+ distdir realclean
+ distmeta retest
+ distsign skipcheck
+ disttest test
+ docs testall
+ fakeinstall testcover
+ help testdb
+ html testpod
+ install testpodcoverage
+ installdeps versioninstall
+ manifest
+
+You can run the 'help' action for a complete list of actions.
+
+
+=head1 GUIDE TO DOCUMENTATION
+
+The documentation for C<Module::Build> is broken up into three sections:
+
+=over
+
+=item General Usage (L<Module::Build>)
+
+This is the document you are currently reading. It describes basic
+usage and background information. Its main purpose is to assist the
+user who wants to learn how to invoke and control C<Module::Build>
+scripts at the command line.
+
+=item Authoring Reference (L<Module::Build::Authoring>)
+
+This document describes the structure and organization of
+C<Module::Build>, and the relevant concepts needed by authors who are
+writing F<Build.PL> scripts for a distribution or controlling
+C<Module::Build> processes programmatically.
+
+=item API Reference (L<Module::Build::API>)
+
+This is a reference to the C<Module::Build> API.
+
+=item Cookbook (L<Module::Build::Cookbook>)
+
+This document demonstrates how to accomplish many common tasks. It
+covers general command line usage and authoring of F<Build.PL>
+scripts. Includes working examples.
+
+=back
+
+
+=head1 ACTIONS
+
+There are some general principles at work here. First, each task when
+building a module is called an "action". These actions are listed
+above; they correspond to the building, testing, installing,
+packaging, etc., tasks.
+
+Second, arguments are processed in a very systematic way. Arguments
+are always key=value pairs. They may be specified at C<perl Build.PL>
+time (i.e. C<perl Build.PL destdir=/my/secret/place>), in which case
+their values last for the lifetime of the C<Build> script. They may
+also be specified when executing a particular action (i.e.
+C<Build test verbose=1>), in which case their values last only for the
+lifetime of that command. Per-action command line parameters take
+precedence over parameters specified at C<perl Build.PL> time.
+
+The build process also relies heavily on the C<Config.pm> module.
+If the user wishes to override any of the
+values in C<Config.pm>, she may specify them like so:
+
+ perl Build.PL --config cc=gcc --config ld=gcc
+
+The following build actions are provided by default.
+
+=over 4
+
+=item build
+
+[version 0.01]
+
+If you run the C<Build> script without any arguments, it runs the
+C<build> action, which in turn runs the C<code> and C<docs> actions.
+
+This is analogous to the C<MakeMaker> I<make all> target.
+
+=item clean
+
+[version 0.01]
+
+This action will clean up any files that the build process may have
+created, including the C<blib/> directory (but not including the
+C<_build/> directory and the C<Build> script itself).
+
+=item code
+
+[version 0.20]
+
+This action builds your code base.
+
+By default it just creates a C<blib/> directory and copies any C<.pm>
+and C<.pod> files from your C<lib/> directory into the C<blib/>
+directory. It also compiles any C<.xs> files from C<lib/> and places
+them in C<blib/>. Of course, you need a working C compiler (probably
+the same one that built perl itself) for the compilation to work
+properly.
+
+The C<code> action also runs any C<.PL> files in your F<lib/>
+directory. Typically these create other files, named the same but
+without the C<.PL> ending. For example, a file F<lib/Foo/Bar.pm.PL>
+could create the file F<lib/Foo/Bar.pm>. The C<.PL> files are
+processed first, so any C<.pm> files (or other kinds that we deal
+with) will get copied correctly.
+
+=item config_data
+
+[version 0.26]
+
+...
+
+=item diff
+
+[version 0.14]
+
+This action will compare the files about to be installed with their
+installed counterparts. For .pm and .pod files, a diff will be shown
+(this currently requires a 'diff' program to be in your PATH). For
+other files like compiled binary files, we simply report whether they
+differ.
+
+A C<flags> parameter may be passed to the action, which will be passed
+to the 'diff' program. Consult your 'diff' documentation for the
+parameters it will accept - a good one is C<-u>:
+
+ ./Build diff flags=-u
+
+=item dist
+
+[version 0.02]
+
+This action is helpful for module authors who want to package up their
+module for source distribution through a medium like CPAN. It will create a
+tarball of the files listed in F<MANIFEST> and compress the tarball using
+GZIP compression.
+
+By default, this action will use the C<Archive::Tar> module. However, you can
+force it to use binary "tar" and "gzip" executables by supplying an explicit
+C<tar> (and optional C<gzip>) parameter:
+
+ ./Build dist --tar C:\path\to\tar.exe --gzip C:\path\to\zip.exe
+
+=item distcheck
+
+[version 0.05]
+
+Reports which files are in the build directory but not in the
+F<MANIFEST> file, and vice versa. (See L<manifest> for details.)
+
+=item distclean
+
+[version 0.05]
+
+Performs the 'realclean' action and then the 'distcheck' action.
+
+=item distdir
+
+[version 0.05]
+
+Creates a "distribution directory" named C<$dist_name-$dist_version>
+(if that directory already exists, it will be removed first), then
+copies all the files listed in the F<MANIFEST> file to that directory.
+This directory is what the distribution tarball is created from.
+
+=item distmeta
+
+[version 0.21]
+
+Creates the F<META.yml> file that describes the distribution.
+
+F<META.yml> is a file containing various bits of I<metadata> about the
+distribution. The metadata includes the distribution name, version,
+abstract, prerequisites, license, and various other data about the
+distribution. This file is created as F<META.yml> in YAML format.
+It is recommended that the C<YAML::Tiny> module be installed to create it.
+If the C<YAML::Tiny> module is not installed, an internal module supplied
+with Module::Build will be used to write the META.yml file, and this
+will most likely be fine.
+
+F<META.yml> file must also be listed in F<MANIFEST> - if it's not, a
+warning will be issued.
+
+The current version of the F<META.yml> specification can be found at
+L<http://module-build.sourceforge.net/META-spec-current.html>
+
+=item distsign
+
+[version 0.16]
+
+Uses C<Module::Signature> to create a SIGNATURE file for your
+distribution, and adds the SIGNATURE file to the distribution's
+MANIFEST.
+
+=item disttest
+
+[version 0.05]
+
+Performs the 'distdir' action, then switches into that directory and
+runs a C<perl Build.PL>, followed by the 'build' and 'test' actions in
+that directory.
+
+=item docs
+
+[version 0.20]
+
+This will generate documentation (e.g. Unix man pages and HTML
+documents) for any installable items under B<blib/> that
+contain POD. If there are no C<bindoc> or C<libdoc> installation
+targets defined (as will be the case on systems that don't support
+Unix manpages) no action is taken for manpages. If there are no
+C<binhtml> or C<libhtml> installation targets defined no action is
+taken for HTML documents.
+
+=item fakeinstall
+
+[version 0.02]
+
+This is just like the C<install> action, but it won't actually do
+anything, it will just report what it I<would> have done if you had
+actually run the C<install> action.
+
+=item help
+
+[version 0.03]
+
+This action will simply print out a message that is meant to help you
+use the build process. It will show you a list of available build
+actions too.
+
+With an optional argument specifying an action name (e.g. C<Build help
+test>), the 'help' action will show you any POD documentation it can
+find for that action.
+
+=item html
+
+[version 0.26]
+
+This will generate HTML documentation for any binary or library files
+under B<blib/> that contain POD. The HTML documentation will only be
+installed if the install paths can be determined from values in
+C<Config.pm>. You can also supply or override install paths on the
+command line by specifying C<install_path> values for the C<binhtml>
+and/or C<libhtml> installation targets.
+
+=item install
+
+[version 0.01]
+
+This action will use C<ExtUtils::Install> to install the files from
+C<blib/> into the system. See L<"INSTALL PATHS">
+for details about how Module::Build determines where to install
+things, and how to influence this process.
+
+If you want the installation process to look around in C<@INC> for
+other versions of the stuff you're installing and try to delete it,
+you can use the C<uninst> parameter, which tells C<ExtUtils::Install> to
+do so:
+
+ ./Build install uninst=1
+
+This can be a good idea, as it helps prevent multiple versions of a
+module from being present on your system, which can be a confusing
+situation indeed.
+
+=item installdeps
+
+[version 0.36]
+
+This action will use the C<cpan_client> parameter as a command to install
+missing prerequisites. You will be prompted whether to install
+optional dependencies.
+
+The C<cpan_client> option defaults to 'cpan' but can be set as an option or in
+F<.modulebuildrc>. It must be a shell command that takes a list of modules to
+install as arguments (e.g. 'cpanp -i' for CPANPLUS). If the program part is a
+relative path (e.g. 'cpan' or 'cpanp'), it will be located relative to the perl
+program that executed Build.PL.
+
+ /opt/perl/5.8.9/bin/perl Build.PL
+ ./Build installdeps --cpan_client 'cpanp -i'
+ # installs to 5.8.9
+
+=item manifest
+
+[version 0.05]
+
+This is an action intended for use by module authors, not people
+installing modules. It will bring the F<MANIFEST> up to date with the
+files currently present in the distribution. You may use a
+F<MANIFEST.SKIP> file to exclude certain files or directories from
+inclusion in the F<MANIFEST>. F<MANIFEST.SKIP> should contain a bunch
+of regular expressions, one per line. If a file in the distribution
+directory matches any of the regular expressions, it won't be included
+in the F<MANIFEST>.
+
+The following is a reasonable F<MANIFEST.SKIP> starting point, you can
+add your own stuff to it:
+
+ ^_build
+ ^Build$
+ ^blib
+ ~$
+ \.bak$
+ ^MANIFEST\.SKIP$
+ CVS
+
+See the L<distcheck> and L<skipcheck> actions if you want to find out
+what the C<manifest> action would do, without actually doing anything.
+
+=item manpages
+
+[version 0.28]
+
+This will generate man pages for any binary or library files under
+B<blib/> that contain POD. The man pages will only be installed if the
+install paths can be determined from values in C<Config.pm>. You can
+also supply or override install paths by specifying there values on
+the command line with the C<bindoc> and C<libdoc> installation
+targets.
+
+=item pardist
+
+[version 0.2806]
+
+Generates a PAR binary distribution for use with L<PAR> or L<PAR::Dist>.
+
+It requires that the PAR::Dist module (version 0.17 and up) is
+installed on your system.
+
+=item ppd
+
+[version 0.20]
+
+Build a PPD file for your distribution.
+
+This action takes an optional argument C<codebase> which is used in
+the generated PPD file to specify the (usually relative) URL of the
+distribution. By default, this value is the distribution name without
+any path information.
+
+Example:
+
+ ./Build ppd --codebase "MSWin32-x86-multi-thread/Module-Build-0.21.tar.gz"
+
+=item ppmdist
+
+[version 0.23]
+
+Generates a PPM binary distribution and a PPD description file. This
+action also invokes the C<ppd> action, so it can accept the same
+C<codebase> argument described under that action.
+
+This uses the same mechanism as the C<dist> action to tar & zip its
+output, so you can supply C<tar> and/or C<gzip> parameters to affect
+the result.
+
+=item prereq_data
+
+[version 0.32]
+
+This action prints out a Perl data structure of all prerequisites and the versions
+required. The output can be loaded again using C<eval()>. This can be useful for
+external tools that wish to query a Build script for prerequisites.
+
+=item prereq_report
+
+[version 0.28]
+
+This action prints out a list of all prerequisites, the versions required, and
+the versions actually installed. This can be useful for reviewing the
+configuration of your system prior to a build, or when compiling data to send
+for a bug report.
+
+=item pure_install
+
+[version 0.28]
+
+This action is identical to the C<install> action. In the future,
+though, when C<install> starts writing to the file
+F<$(INSTALLARCHLIB)/perllocal.pod>, C<pure_install> won't, and that
+will be the only difference between them.
+
+=item realclean
+
+[version 0.01]
+
+This action is just like the C<clean> action, but also removes the
+C<_build> directory and the C<Build> script. If you run the
+C<realclean> action, you are essentially starting over, so you will
+have to re-create the C<Build> script again.
+
+=item retest
+
+[version 0.2806]
+
+This is just like the C<test> action, but doesn't actually build the
+distribution first, and doesn't add F<blib/> to the load path, and
+therefore will test against a I<previously> installed version of the
+distribution. This can be used to verify that a certain installed
+distribution still works, or to see whether newer versions of a
+distribution still pass the old regression tests, and so on.
+
+=item skipcheck
+
+[version 0.05]
+
+Reports which files are skipped due to the entries in the
+F<MANIFEST.SKIP> file (See L<manifest> for details)
+
+=item test
+
+[version 0.01]
+
+This will use C<Test::Harness> or C<TAP::Harness> to run any regression
+tests and report their results. Tests can be defined in the standard
+places: a file called C<test.pl> in the top-level directory, or several
+files ending with C<.t> in a C<t/> directory.
+
+If you want tests to be 'verbose', i.e. show details of test execution
+rather than just summary information, pass the argument C<verbose=1>.
+
+If you want to run tests under the perl debugger, pass the argument
+C<debugger=1>.
+
+If you want to have Module::Build find test files with different file
+name extensions, pass the C<test_file_exts> argument with an array
+of extensions, such as C<[qw( .t .s .z )]>.
+
+If you want test to be run by C<TAP::Harness>, rather than C<Test::Harness>,
+pass the argument C<tap_harness_args> as an array reference of arguments to
+pass to the TAP::Harness constructor.
+
+In addition, if a file called C<visual.pl> exists in the top-level
+directory, this file will be executed as a Perl script and its output
+will be shown to the user. This is a good place to put speed tests or
+other tests that don't use the C<Test::Harness> format for output.
+
+To override the choice of tests to run, you may pass a C<test_files>
+argument whose value is a whitespace-separated list of test scripts to
+run. This is especially useful in development, when you only want to
+run a single test to see whether you've squashed a certain bug yet:
+
+ ./Build test --test_files t/something_failing.t
+
+You may also pass several C<test_files> arguments separately:
+
+ ./Build test --test_files t/one.t --test_files t/two.t
+
+or use a C<glob()>-style pattern:
+
+ ./Build test --test_files 't/01-*.t'
+
+=item testall
+
+[version 0.2807]
+
+[Note: the 'testall' action and the code snippets below are currently
+in alpha stage, see
+L<"http://www.nntp.perl.org/group/perl.module.build/2007/03/msg584.html"> ]
+
+Runs the C<test> action plus each of the C<test$type> actions defined by
+the keys of the C<test_types> parameter.
+
+Currently, you need to define the ACTION_test$type method yourself and
+enumerate them in the test_types parameter.
+
+ my $mb = Module::Build->subclass(
+ code => q(
+ sub ACTION_testspecial { shift->generic_test(type => 'special'); }
+ sub ACTION_testauthor { shift->generic_test(type => 'author'); }
+ )
+ )->new(
+ ...
+ test_types => {
+ special => '.st',
+ author => ['.at', '.pt' ],
+ },
+ ...
+
+=item testcover
+
+[version 0.26]
+
+Runs the C<test> action using C<Devel::Cover>, generating a
+code-coverage report showing which parts of the code were actually
+exercised during the tests.
+
+To pass options to C<Devel::Cover>, set the C<$DEVEL_COVER_OPTIONS>
+environment variable:
+
+ DEVEL_COVER_OPTIONS=-ignore,Build ./Build testcover
+
+=item testdb
+
+[version 0.05]
+
+This is a synonym for the 'test' action with the C<debugger=1>
+argument.
+
+=item testpod
+
+[version 0.25]
+
+This checks all the files described in the C<docs> action and
+produces C<Test::Harness>-style output. If you are a module author,
+this is useful to run before creating a new release.
+
+=item testpodcoverage
+
+[version 0.28]
+
+This checks the pod coverage of the distribution and
+produces C<Test::Harness>-style output. If you are a module author,
+this is useful to run before creating a new release.
+
+=item versioninstall
+
+[version 0.16]
+
+** Note: since C<only.pm> is so new, and since we just recently added
+support for it here too, this feature is to be considered
+experimental. **
+
+If you have the C<only.pm> module installed on your system, you can
+use this action to install a module into the version-specific library
+trees. This means that you can have several versions of the same
+module installed and C<use> a specific one like this:
+
+ use only MyModule => 0.55;
+
+To override the default installation libraries in C<only::config>,
+specify the C<versionlib> parameter when you run the C<Build.PL> script:
+
+ perl Build.PL --versionlib /my/version/place/
+
+To override which version the module is installed as, specify the
+C<versionlib> parameter when you run the C<Build.PL> script:
+
+ perl Build.PL --version 0.50
+
+See the C<only.pm> documentation for more information on
+version-specific installs.
+
+=back
+
+
+=head1 OPTIONS
+
+=head2 Command Line Options
+
+The following options can be used during any invocation of C<Build.PL>
+or the Build script, during any action. For information on other
+options specific to an action, see the documentation for the
+respective action.
+
+NOTE: There is some preliminary support for options to use the more
+familiar long option style. Most options can be preceded with the
+C<--> long option prefix, and the underscores changed to dashes
+(e.g. C<--use-rcfile>). Additionally, the argument to boolean options is
+optional, and boolean options can be negated by prefixing them with
+C<no> or C<no-> (e.g. C<--noverbose> or C<--no-verbose>).
+
+=over 4
+
+=item quiet
+
+Suppress informative messages on output.
+
+=item verbose
+
+Display extra information about the Build on output.
+
+=item cpan_client
+
+Sets the C<cpan_client> command for use with the C<installdeps> action.
+See C<installdeps> for more details.
+
+=item use_rcfile
+
+Load the F<~/.modulebuildrc> option file. This option can be set to
+false to prevent the custom resource file from being loaded.
+
+=item allow_mb_mismatch
+
+Suppresses the check upon startup that the version of Module::Build
+we're now running under is the same version that was initially invoked
+when building the distribution (i.e. when the C<Build.PL> script was
+first run). As of 0.3601, a mismatch results in a warning instead of
+a fatal error, so this option effectively just suppresses the warning.
+
+=item debug
+
+Prints Module::Build debugging information to STDOUT, such as a trace of
+executed build actions.
+
+=back
+
+=head2 Default Options File (F<.modulebuildrc>)
+
+[version 0.28]
+
+When Module::Build starts up, it will look first for a file,
+F<$ENV{HOME}/.modulebuildrc>. If it's not found there, it will look
+in the the F<.modulebuildrc> file in the directories referred to by
+the environment variables C<HOMEDRIVE> + C<HOMEDIR>, C<USERPROFILE>,
+C<APPDATA>, C<WINDIR>, C<SYS$LOGIN>. If the file exists, the options
+specified there will be used as defaults, as if they were typed on the
+command line. The defaults can be overridden by specifying new values
+on the command line.
+
+The action name must come at the beginning of the line, followed by any
+amount of whitespace and then the options. Options are given the same
+as they would be on the command line. They can be separated by any
+amount of whitespace, including newlines, as long there is whitespace at
+the beginning of each continued line. Anything following a hash mark (C<#>)
+is considered a comment, and is stripped before parsing. If more than
+one line begins with the same action name, those lines are merged into
+one set of options.
+
+Besides the regular actions, there are two special pseudo-actions: the
+key C<*> (asterisk) denotes any global options that should be applied
+to all actions, and the key 'Build_PL' specifies options to be applied
+when you invoke C<perl Build.PL>.
+
+ * verbose=1 # global options
+ diff flags=-u
+ install --install_base /home/ken
+ --install_path html=/home/ken/docs/html
+ installdeps --cpan_client 'cpanp -i'
+
+If you wish to locate your resource file in a different location, you
+can set the environment variable C<MODULEBUILDRC> to the complete
+absolute path of the file containing your options.
+
+=head2 Environment variables
+
+=over
+
+=item MODULEBUILDRC
+
+[version 0.28]
+
+Specifies an alternate location for a default options file as described above.
+
+=item PERL_MB_OPT
+
+[version 0.36]
+
+Command line options that are applied to Build.PL or any Build action. The
+string is split as the shell would (e.g. whitespace) and the result is
+prepended to any actual command-line arguments.
+
+=back
+
+=head1 INSTALL PATHS
+
+[version 0.19]
+
+When you invoke Module::Build's C<build> action, it needs to figure
+out where to install things. The nutshell version of how this works
+is that default installation locations are determined from
+F<Config.pm>, and they may be overridden by using the C<install_path>
+parameter. An C<install_base> parameter lets you specify an
+alternative installation root like F</home/foo>, and a C<destdir> lets
+you specify a temporary installation directory like F</tmp/install> in
+case you want to create bundled-up installable packages.
+
+Natively, Module::Build provides default installation locations for
+the following types of installable items:
+
+=over 4
+
+=item lib
+
+Usually pure-Perl module files ending in F<.pm>.
+
+=item arch
+
+"Architecture-dependent" module files, usually produced by compiling
+XS, L<Inline>, or similar code.
+
+=item script
+
+Programs written in pure Perl. In order to improve reuse, try to make
+these as small as possible - put the code into modules whenever
+possible.
+
+=item bin
+
+"Architecture-dependent" executable programs, i.e. compiled C code or
+something. Pretty rare to see this in a perl distribution, but it
+happens.
+
+=item bindoc
+
+Documentation for the stuff in C<script> and C<bin>. Usually
+generated from the POD in those files. Under Unix, these are manual
+pages belonging to the 'man1' category.
+
+=item libdoc
+
+Documentation for the stuff in C<lib> and C<arch>. This is usually
+generated from the POD in F<.pm> files. Under Unix, these are manual
+pages belonging to the 'man3' category.
+
+=item binhtml
+
+This is the same as C<bindoc> above, but applies to HTML documents.
+
+=item libhtml
+
+This is the same as C<bindoc> above, but applies to HTML documents.
+
+=back
+
+Four other parameters let you control various aspects of how
+installation paths are determined:
+
+=over 4
+
+=item installdirs
+
+The default destinations for these installable things come from
+entries in your system's C<Config.pm>. You can select from three
+different sets of default locations by setting the C<installdirs>
+parameter as follows:
+
+ 'installdirs' set to:
+ core site vendor
+
+ uses the following defaults from Config.pm:
+
+ lib => installprivlib installsitelib installvendorlib
+ arch => installarchlib installsitearch installvendorarch
+ script => installscript installsitebin installvendorbin
+ bin => installbin installsitebin installvendorbin
+ bindoc => installman1dir installsiteman1dir installvendorman1dir
+ libdoc => installman3dir installsiteman3dir installvendorman3dir
+ binhtml => installhtml1dir installsitehtml1dir installvendorhtml1dir [*]
+ libhtml => installhtml3dir installsitehtml3dir installvendorhtml3dir [*]
+
+ * Under some OS (eg. MSWin32) the destination for HTML documents is
+ determined by the C<Config.pm> entry C<installhtmldir>.
+
+The default value of C<installdirs> is "site". If you're creating
+vendor distributions of module packages, you may want to do something
+like this:
+
+ perl Build.PL --installdirs vendor
+
+or
+
+ ./Build install --installdirs vendor
+
+If you're installing an updated version of a module that was included
+with perl itself (i.e. a "core module"), then you may set
+C<installdirs> to "core" to overwrite the module in its present
+location.
+
+(Note that the 'script' line is different from C<MakeMaker> -
+unfortunately there's no such thing as "installsitescript" or
+"installvendorscript" entry in C<Config.pm>, so we use the
+"installsitebin" and "installvendorbin" entries to at least get the
+general location right. In the future, if C<Config.pm> adds some more
+appropriate entries, we'll start using those.)
+
+=item install_path
+
+Once the defaults have been set, you can override them.
+
+On the command line, that would look like this:
+
+ perl Build.PL --install_path lib=/foo/lib --install_path arch=/foo/lib/arch
+
+or this:
+
+ ./Build install --install_path lib=/foo/lib --install_path arch=/foo/lib/arch
+
+=item install_base
+
+You can also set the whole bunch of installation paths by supplying the
+C<install_base> parameter to point to a directory on your system. For
+instance, if you set C<install_base> to "/home/ken" on a Linux
+system, you'll install as follows:
+
+ lib => /home/ken/lib/perl5
+ arch => /home/ken/lib/perl5/i386-linux
+ script => /home/ken/bin
+ bin => /home/ken/bin
+ bindoc => /home/ken/man/man1
+ libdoc => /home/ken/man/man3
+ binhtml => /home/ken/html
+ libhtml => /home/ken/html
+
+Note that this is I<different> from how C<MakeMaker>'s C<PREFIX>
+parameter works. C<install_base> just gives you a default layout under the
+directory you specify, which may have little to do with the
+C<installdirs=site> layout.
+
+The exact layout under the directory you specify may vary by system -
+we try to do the "sensible" thing on each platform.
+
+=item destdir
+
+If you want to install everything into a temporary directory first
+(for instance, if you want to create a directory tree that a package
+manager like C<rpm> or C<dpkg> could create a package from), you can
+use the C<destdir> parameter:
+
+ perl Build.PL --destdir /tmp/foo
+
+or
+
+ ./Build install --destdir /tmp/foo
+
+This will effectively install to "/tmp/foo/$sitelib",
+"/tmp/foo/$sitearch", and the like, except that it will use
+C<File::Spec> to make the pathnames work correctly on whatever
+platform you're installing on.
+
+=item prefix
+
+Provided for compatibility with C<ExtUtils::MakeMaker>'s PREFIX argument.
+C<prefix> should be used when you wish Module::Build to install your
+modules, documentation and scripts in the same place
+C<ExtUtils::MakeMaker> does.
+
+The following are equivalent.
+
+ perl Build.PL --prefix /tmp/foo
+ perl Makefile.PL PREFIX=/tmp/foo
+
+Because of the very complex nature of the prefixification logic, the
+behavior of PREFIX in C<MakeMaker> has changed subtly over time.
+Module::Build's --prefix logic is equivalent to the PREFIX logic found
+in C<ExtUtils::MakeMaker> 6.30.
+
+If you do not need to retain compatibility with C<ExtUtils::MakeMaker> or
+are starting a fresh Perl installation we recommend you use
+C<install_base> instead (and C<INSTALL_BASE> in C<ExtUtils::MakeMaker>).
+See L<Module::Build::Cookbook/Instaling in the same location as
+ExtUtils::MakeMaker> for further information.
+
+
+=back
+
+
+=head1 MOTIVATIONS
+
+There are several reasons I wanted to start over, and not just fix
+what I didn't like about C<MakeMaker>:
+
+=over 4
+
+=item *
+
+I don't like the core idea of C<MakeMaker>, namely that C<make> should be
+involved in the build process. Here are my reasons:
+
+=over 4
+
+=item +
+
+When a person is installing a Perl module, what can you assume about
+their environment? Can you assume they have C<make>? No, but you can
+assume they have some version of Perl.
+
+=item +
+
+When a person is writing a Perl module for intended distribution, can
+you assume that they know how to build a Makefile, so they can
+customize their build process? No, but you can assume they know Perl,
+and could customize that way.
+
+=back
+
+For years, these things have been a barrier to people getting the
+build/install process to do what they want.
+
+=item *
+
+There are several architectural decisions in C<MakeMaker> that make it
+very difficult to customize its behavior. For instance, when using
+C<MakeMaker> you do C<use ExtUtils::MakeMaker>, but the object created in
+C<WriteMakefile()> is actually blessed into a package name that's
+created on the fly, so you can't simply subclass
+C<ExtUtils::MakeMaker>. There is a workaround C<MY> package that lets
+you override certain C<MakeMaker> methods, but only certain explicitly
+preselected (by C<MakeMaker>) methods can be overridden. Also, the method
+of customization is very crude: you have to modify a string containing
+the Makefile text for the particular target. Since these strings
+aren't documented, and I<can't> be documented (they take on different
+values depending on the platform, version of perl, version of
+C<MakeMaker>, etc.), you have no guarantee that your modifications will
+work on someone else's machine or after an upgrade of C<MakeMaker> or
+perl.
+
+=item *
+
+It is risky to make major changes to C<MakeMaker>, since it does so many
+things, is so important, and generally works. C<Module::Build> is an
+entirely separate package so that I can work on it all I want, without
+worrying about backward compatibility.
+
+=item *
+
+Finally, Perl is said to be a language for system administration.
+Could it really be the case that Perl isn't up to the task of building
+and installing software? Even if that software is a bunch of stupid
+little C<.pm> files that just need to be copied from one place to
+another? My sense was that we could design a system to accomplish
+this in a flexible, extensible, and friendly manner. Or die trying.
+
+=back
+
+
+=head1 TO DO
+
+The current method of relying on time stamps to determine whether a
+derived file is out of date isn't likely to scale well, since it
+requires tracing all dependencies backward, it runs into problems on
+NFS, and it's just generally flimsy. It would be better to use an MD5
+signature or the like, if available. See C<cons> for an example.
+
+ - append to perllocal.pod
+ - add a 'plugin' functionality
+
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+Development questions, bug reports, and patches should be sent to the
+Module-Build mailing list at <module-build@perl.org>.
+
+Bug reports are also welcome at
+<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build>.
+
+The latest development version is available from the Subversion
+repository at <https://svn.perl.org/modules/Module-Build/trunk/>
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+perl(1), L<Module::Build::Cookbook>, L<Module::Build::Authoring>,
+L<Module::Build::API>, L<ExtUtils::MakeMaker>, L<YAML::Tiny>
+
+F<META.yml> Specification:
+L<http://module-build.sourceforge.net/META-spec-current.html>
+
+L<http://www.dsmit.com/cons/>
+
+L<http://search.cpan.org/dist/PerlBuildSystem/>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/API.pod b/Master/tlpkg/tlperl.straw/lib/Module/Build/API.pod
new file mode 100755
index 00000000000..fe307b9520a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/API.pod
@@ -0,0 +1,2007 @@
+=head1 NAME
+
+Module::Build::API - API Reference for Module Authors
+
+=for :stopwords apache bsd distdir distsign gpl installdirs lgpl mit mozilla packlists
+
+=head1 DESCRIPTION
+
+I list here some of the most important methods in C<Module::Build>.
+Normally you won't need to deal with these methods unless you want to
+subclass C<Module::Build>. But since one of the reasons I created
+this module in the first place was so that subclassing is possible
+(and easy), I will certainly write more docs as the interface
+stabilizes.
+
+
+=head2 CONSTRUCTORS
+
+=over 4
+
+=item current()
+
+[version 0.20]
+
+This method returns a reasonable facsimile of the currently-executing
+C<Module::Build> object representing the current build. You can use
+this object to query its L</notes()> method, inquire about installed
+modules, and so on. This is a great way to share information between
+different parts of your build process. For instance, you can ask
+the user a question during C<perl Build.PL>, then use their answer
+during a regression test:
+
+ # In Build.PL:
+ my $color = $build->prompt("What is your favorite color?");
+ $build->notes(color => $color);
+
+ # In t/colortest.t:
+ use Module::Build;
+ my $build = Module::Build->current;
+ my $color = $build->notes('color');
+ ...
+
+The way the C<current()> method is currently implemented, there may be
+slight differences between the C<$build> object in Build.PL and the
+one in C<t/colortest.t>. It is our goal to minimize these differences
+in future releases of Module::Build, so please report any anomalies
+you find.
+
+One important caveat: in its current implementation, C<current()> will
+B<NOT> work correctly if you have changed out of the directory that
+C<Module::Build> was invoked from.
+
+=item new()
+
+[version 0.03]
+
+Creates a new Module::Build object. Arguments to the new() method are
+listed below. Most arguments are optional, but you must provide
+either the L</module_name> argument, or L</dist_name> and one of
+L</dist_version> or L</dist_version_from>. In other words, you must
+provide enough information to determine both a distribution name and
+version.
+
+
+=over 4
+
+=item add_to_cleanup
+
+[version 0.19]
+
+An array reference of files to be cleaned up when the C<clean> action
+is performed. See also the L<add_to_cleanup()|/"add_to_cleanup(@files)">
+method.
+
+=item auto_configure_requires
+
+[version 0.34]
+
+This parameter determines whether Module::Build will add itself
+automatically to configure_requires (and build_requires) if Module::Build
+is not already there. The required version will be the last 'major' release,
+as defined by the decimal version truncated to two decimal places (e.g. 0.34,
+instead of 0.3402). The default value is true.
+
+=item auto_features
+
+[version 0.26]
+
+This parameter supports the setting of features (see
+L</feature($name)>) automatically based on a set of prerequisites. For
+instance, for a module that could optionally use either MySQL or
+PostgreSQL databases, you might use C<auto_features> like this:
+
+ my $build = Module::Build->new
+ (
+ ...other stuff here...
+ auto_features => {
+ pg_support => {
+ description => "Interface with Postgres databases",
+ requires => { 'DBD::Pg' => 23.3,
+ 'DateTime::Format::Pg' => 0 },
+ },
+ mysql_support => {
+ description => "Interface with MySQL databases",
+ requires => { 'DBD::mysql' => 17.9,
+ 'DateTime::Format::MySQL' => 0 },
+ },
+ }
+ );
+
+For each feature named, the required prerequisites will be checked, and
+if there are no failures, the feature will be enabled (set to C<1>).
+Otherwise the failures will be displayed to the user and the feature
+will be disabled (set to C<0>).
+
+See the documentation for L</requires> for the details of how
+requirements can be specified.
+
+=item autosplit
+
+[version 0.04]
+
+An optional C<autosplit> argument specifies a file which should be run
+through the L<AutoSplit::autosplit()|AutoSplit/autosplit> function.
+If multiple files should be split, the argument may be given as an
+array of the files to split.
+
+In general I don't consider autosplitting a great idea, because it's
+not always clear that autosplitting achieves its intended performance
+benefits. It may even harm performance in environments like mod_perl,
+where as much as possible of a module's code should be loaded during
+startup.
+
+=item build_class
+
+[version 0.28]
+
+The Module::Build class or subclass to use in the build script.
+Defaults to "Module::Build" or the class name passed to or created by
+a call to L</subclass()>. This property is useful if you're
+writing a custom Module::Build subclass and have a bootstrapping
+problem--that is, your subclass requires modules that may not be
+installed when C<perl Build.PL> is executed, but you've listed in
+L</build_requires> so that they should be available when C<./Build> is
+executed.
+
+=item build_requires
+
+[version 0.07]
+
+Modules listed in this section are necessary to build and install the
+given module, but are not necessary for regular usage of it. This is
+actually an important distinction - it allows for tighter control over
+the body of installed modules, and facilitates correct dependency
+checking on binary/packaged distributions of the module.
+
+See the documentation for L<Module::Build::Authoring/"PREREQUISITES">
+for the details of how requirements can be specified.
+
+=item create_packlist
+
+[version 0.28]
+
+If true, this parameter tells Module::Build to create a F<.packlist>
+file during the C<install> action, just like C<ExtUtils::MakeMaker> does.
+The file is created in a subdirectory of the C<arch> installation
+location. It is used by some other tools (CPAN, CPANPLUS, etc.) for
+determining what files are part of an install.
+
+The default value is true. This parameter was introduced in
+Module::Build version 0.2609; previously no packlists were ever
+created by Module::Build.
+
+=item c_source
+
+[version 0.04]
+
+An optional C<c_source> argument specifies a directory which contains
+C source files that the rest of the build may depend on. Any C<.c>
+files in the directory will be compiled to object files. The
+directory will be added to the search path during the compilation and
+linking phases of any C or XS files.
+
+=item conflicts
+
+[version 0.07]
+
+Modules listed in this section conflict in some serious way with the
+given module. C<Module::Build> (or some higher-level tool) will
+refuse to install the given module if the given module/version is also
+installed.
+
+See the documentation for L<Module::Build::Authoring/"PREREQUISITES">
+for the details of how requirements can be specified.
+
+=item create_license
+
+[version 0.31]
+
+This parameter tells Module::Build to automatically create a
+F<LICENSE> file at the top level of your distribution, containing the
+full text of the author's chosen license. This requires
+C<Software::License> on the author's machine, and further requires
+that the C<license> parameter specifies a license that it knows about.
+
+=item create_makefile_pl
+
+[version 0.19]
+
+This parameter lets you use C<Module::Build::Compat> during the
+C<distdir> (or C<dist>) action to automatically create a Makefile.PL
+for compatibility with C<ExtUtils::MakeMaker>. The parameter's value
+should be one of the styles named in the L<Module::Build::Compat>
+documentation.
+
+=item create_readme
+
+[version 0.22]
+
+This parameter tells Module::Build to automatically create a F<README>
+file at the top level of your distribution. Currently it will simply
+use C<Pod::Text> (or C<Pod::Readme> if it's installed) on the file
+indicated by C<dist_version_from> and put the result in the F<README>
+file. This is by no means the only recommended style for writing a
+F<README>, but it seems to be one common one used on the CPAN.
+
+If you generate a F<README> in this way, it's probably a good idea to
+create a separate F<INSTALL> file if that information isn't in the
+generated F<README>.
+
+=item dist_abstract
+
+[version 0.20]
+
+This should be a short description of the distribution. This is used when
+generating metadata for F<META.yml> and PPD files. If it is not given
+then C<Module::Build> looks in the POD of the module from which it gets
+the distribution's version. If it finds a POD section marked "=head1
+NAME", then it looks for the first line matching C<\s+-\s+(.+)>,
+and uses the captured text as the abstract.
+
+=item dist_author
+
+[version 0.20]
+
+This should be something like "John Doe <jdoe@example.com>", or if
+there are multiple authors, an anonymous array of strings may be
+specified. This is used when generating metadata for F<META.yml> and
+PPD files. If this is not specified, then C<Module::Build> looks at
+the module from which it gets the distribution's version. If it finds
+a POD section marked "=head1 AUTHOR", then it uses the contents of
+this section.
+
+=item dist_name
+
+[version 0.11]
+
+Specifies the name for this distribution. Most authors won't need to
+set this directly, they can use C<module_name> to set C<dist_name> to
+a reasonable default. However, some agglomerative distributions like
+C<libwww-perl> or C<bioperl> have names that don't correspond directly
+to a module name, so C<dist_name> can be set independently.
+
+=item dist_version
+
+[version 0.11]
+
+Specifies a version number for the distribution. See L</module_name>
+or L</dist_version_from> for ways to have this set automatically from a
+C<$VERSION> variable in a module. One way or another, a version
+number needs to be set.
+
+=item dist_version_from
+
+[version 0.11]
+
+Specifies a file to look for the distribution version in. Most
+authors won't need to set this directly, they can use L</module_name>
+to set it to a reasonable default.
+
+The version is extracted from the specified file according to the same
+rules as L<ExtUtils::MakeMaker> and C<CPAN.pm>. It involves finding
+the first line that matches the regular expression
+
+ /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/
+
+eval()-ing that line, then checking the value of the C<$VERSION>
+variable. Quite ugly, really, but all the modules on CPAN depend on
+this process, so there's no real opportunity to change to something
+better.
+
+If the target file of L</dist_version_from> contains more than one package
+declaration, the version returned will be the one matching the configured
+L</module_name>.
+
+=item dynamic_config
+
+[version 0.07]
+
+A boolean flag indicating whether the F<Build.PL> file must be
+executed, or whether this module can be built, tested and installed
+solely from consulting its metadata file. The main reason to set this
+to a true value is that your module performs some dynamic
+configuration as part of its build/install process. If the flag is
+omitted, the F<META.yml> spec says that installation tools should
+treat it as 1 (true), because this is a safer way to behave.
+
+Currently C<Module::Build> doesn't actually do anything with this flag
+- it's up to higher-level tools like C<CPAN.pm> to do something useful
+with it. It can potentially bring lots of security, packaging, and
+convenience improvements.
+
+=item extra_compiler_flags
+
+=item extra_linker_flags
+
+[version 0.19]
+
+These parameters can contain array references (or strings, in which
+case they will be split into arrays) to pass through to the compiler
+and linker phases when compiling/linking C code. For example, to tell
+the compiler that your code is C++, you might do:
+
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ extra_compiler_flags => ['-x', 'c++'],
+ );
+
+To link your XS code against glib you might write something like:
+
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ dynamic_config => 1,
+ extra_compiler_flags => scalar `glib-config --cflags`,
+ extra_linker_flags => scalar `glib-config --libs`,
+ );
+
+=item get_options
+
+[version 0.26]
+
+You can pass arbitrary command line options to F<Build.PL> or
+F<Build>, and they will be stored in the Module::Build object and can
+be accessed via the L</args()> method. However, sometimes you want
+more flexibility out of your argument processing than this allows. In
+such cases, use the C<get_options> parameter to pass in a hash
+reference of argument specifications, and the list of arguments to
+F<Build.PL> or F<Build> will be processed according to those
+specifications before they're passed on to C<Module::Build>'s own
+argument processing.
+
+The supported option specification hash keys are:
+
+
+=over 4
+
+=item type
+
+The type of option. The types are those supported by Getopt::Long; consult
+its documentation for a complete list. Typical types are C<=s> for strings,
+C<+> for additive options, and C<!> for negatable options. If the
+type is not specified, it will be considered a boolean, i.e. no
+argument is taken and a value of 1 will be assigned when the option is
+encountered.
+
+=item store
+
+A reference to a scalar in which to store the value passed to the option.
+If not specified, the value will be stored under the option name in the
+hash returned by the C<args()> method.
+
+=item default
+
+A default value for the option. If no default value is specified and no option
+is passed, then the option key will not exist in the hash returned by
+C<args()>.
+
+=back
+
+
+You can combine references to your own variables or subroutines with
+unreferenced specifications, for which the result will also be stored in the
+hash returned by C<args()>. For example:
+
+ my $loud = 0;
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ get_options => {
+ Loud => { store => \$loud },
+ Dbd => { type => '=s' },
+ Quantity => { type => '+' },
+ }
+ );
+
+ print STDERR "HEY, ARE YOU LISTENING??\n" if $loud;
+ print "We'll use the ", $build->args('Dbd'), " DBI driver\n";
+ print "Are you sure you want that many?\n"
+ if $build->args('Quantity') > 2;
+
+The arguments for such a specification can be called like so:
+
+ perl Build.PL --Loud --Dbd=DBD::pg --Quantity --Quantity --Quantity
+
+B<WARNING:> Any option specifications that conflict with Module::Build's own
+options (defined by its properties) will throw an exception. Use capitalized
+option names to avoid unintended conflicts with future Module::Build options.
+
+Consult the Getopt::Long documentation for details on its usage.
+
+=item include_dirs
+
+[version 0.24]
+
+Specifies any additional directories in which to search for C header
+files. May be given as a string indicating a single directory, or as
+a list reference indicating multiple directories.
+
+=item install_path
+
+[version 0.19]
+
+You can set paths for individual installable elements by using the
+C<install_path> parameter:
+
+ my $build = Module::Build->new
+ (
+ ...other stuff here...
+ install_path => {
+ lib => '/foo/lib',
+ arch => '/foo/lib/arch',
+ }
+ );
+
+=item installdirs
+
+[version 0.19]
+
+Determines where files are installed within the normal perl hierarchy
+as determined by F<Config.pm>. Valid values are: C<core>, C<site>,
+C<vendor>. The default is C<site>. See
+L<Module::Build/"INSTALL PATHS">
+
+=item license
+
+[version 0.07]
+
+Specifies the licensing terms of your distribution. Valid options include:
+
+
+=over 4
+
+=item apache
+
+The distribution is licensed under the Apache License, Version 2.0
+(L<http://apache.org/licenses/LICENSE-2.0>).
+
+=item apache_1_1
+
+The distribution is licensed under the Apache Software License, Version 1.1
+(L<http://apache.org/licenses/LICENSE-1.1>).
+
+=item artistic
+
+The distribution is licensed under the Artistic License, as specified
+by the F<Artistic> file in the standard Perl distribution.
+
+=item artistic_2
+
+The distribution is licensed under the Artistic 2.0 License
+(L<http://opensource.org/licenses/artistic-license-2.0.php>.)
+
+=item bsd
+
+The distribution is licensed under the BSD License
+(L<http://www.opensource.org/licenses/bsd-license.php>).
+
+=item gpl
+
+The distribution is licensed under the terms of the GNU General
+Public License (L<http://www.opensource.org/licenses/gpl-license.php>).
+
+=item lgpl
+
+The distribution is licensed under the terms of the GNU Lesser
+General Public License
+(L<http://www.opensource.org/licenses/lgpl-license.php>).
+
+=item mit
+
+The distribution is licensed under the MIT License
+(L<http://opensource.org/licenses/mit-license.php>).
+
+=item mozilla
+
+The distribution is licensed under the Mozilla Public
+License. (L<http://opensource.org/licenses/mozilla1.0.php> or
+L<http://opensource.org/licenses/mozilla1.1.php>)
+
+=item open_source
+
+The distribution is licensed under some other Open Source
+Initiative-approved license listed at
+L<http://www.opensource.org/licenses/>.
+
+=item perl
+
+The distribution may be copied and redistributed under the same terms
+as Perl itself (this is by far the most common licensing option for
+modules on CPAN). This is a dual license, in which the user may
+choose between either the GPL or the Artistic license.
+
+=item restrictive
+
+The distribution may not be redistributed without special permission
+from the author and/or copyright holder.
+
+=item unrestricted
+
+The distribution is licensed under a license that is B<not> approved
+by www.opensource.org but that allows distribution without
+restrictions.
+
+=back
+
+
+Note that you must still include the terms of your license in your
+documentation - this field only lets automated tools figure out your
+licensing restrictions. Humans still need something to read. If you
+choose to provide this field, you should make sure that you keep it in
+sync with your written documentation if you ever change your licensing
+terms.
+
+You may also use a license type of C<unknown> if you don't wish to
+specify your terms in the metadata.
+
+It is a fatal error to use a license other than the ones mentioned
+above. This is not because I wish to impose licensing terms on you -
+please let me know if you would like another license option to be
+added to the list. I just started out with a small set of licenses to
+keep things simple, figuring I'd let people with actual working
+knowledge in this area tell me what to do. So if that's you, drop me
+a line.
+
+=item meta_add
+
+[version 0.28]
+
+A hash of key/value pairs that should be added to the F<META.yml> file
+during the C<distmeta> action. Any existing entries with the same
+names will be overridden.
+
+See the L</"MODULE METADATA"> section for details.
+
+=item meta_merge
+
+[version 0.28]
+
+A hash of key/value pairs that should be merged into the F<META.yml>
+file during the C<distmeta> action. Any existing entries with the
+same names will be overridden.
+
+The only difference between C<meta_add> and C<meta_merge> is their
+behavior on hash-valued and array-valued entries: C<meta_add> will
+completely blow away the existing hash or array value, but
+C<meta_merge> will merge the supplied data into the existing hash or
+array value.
+
+See the L</"MODULE METADATA"> section for details.
+
+=item module_name
+
+[version 0.03]
+
+The C<module_name> is a shortcut for setting default values of
+C<dist_name> and C<dist_version_from>, reflecting the fact that the
+majority of CPAN distributions are centered around one "main" module.
+For instance, if you set C<module_name> to C<Foo::Bar>, then
+C<dist_name> will default to C<Foo-Bar> and C<dist_version_from> will
+default to C<lib/Foo/Bar.pm>. C<dist_version_from> will in turn be
+used to set C<dist_version>.
+
+Setting C<module_name> won't override a C<dist_*> parameter you
+specify explicitly.
+
+=item needs_compiler
+
+[version 0.36]
+
+The C<needs_compiler> parameter indicates whether a compiler is required to
+build the distsribution. The default is false, unless XS files are found or
+the C<c_source> parameter is set, in which case it is true. If true,
+L<ExtUtils::CBuilder> is automatically added to C<build_requires> if needed.
+
+For a distribution where a compiler is I<optional>, e.g. a dual XS/pure-Perl
+distribution, C<needs_compiler> should explicitly be set to a false value.
+
+=item PL_files
+
+[version 0.06]
+
+An optional parameter specifying a set of C<.PL> files in your
+distribution. These will be run as Perl scripts prior to processing
+the rest of the files in your distribution with the name of the file
+they're generating as an argument. They are usually used as templates
+for creating other files dynamically, so that a file like
+C<lib/Foo/Bar.pm.PL> might create the file C<lib/Foo/Bar.pm>.
+
+The files are specified with the C<.PL> files as hash keys, and the
+file(s) they generate as hash values, like so:
+
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ ...
+ PL_files => { 'lib/Foo/Bar.pm.PL' => 'lib/Foo/Bar.pm' },
+ );
+
+Note that the path specifications are I<always> given in Unix-like
+format, not in the style of the local system.
+
+If your C<.PL> scripts don't create any files, or if they create files
+with unexpected names, or even if they create multiple files, you can
+indicate that so that Module::Build can properly handle these created
+files:
+
+ PL_files => {
+ 'lib/Foo/Bar.pm.PL' => 'lib/Foo/Bar.pm',
+ 'lib/something.PL' => ['/lib/something', '/lib/else'],
+ 'lib/funny.PL' => [],
+ }
+
+Here's an example of a simple PL file.
+
+ my $output_file = shift;
+ open my $fh, ">", $output_file or die "Can't open $output_file: $!";
+
+ print $fh <<'END';
+ #!/usr/bin/perl
+
+ print "Hello, world!\n";
+ END
+
+PL files are not installed by default, so its safe to put them in
+F<lib/> and F<bin/>.
+
+
+=item pm_files
+
+[version 0.19]
+
+An optional parameter specifying the set of C<.pm> files in this
+distribution, specified as a hash reference whose keys are the files'
+locations in the distributions, and whose values are their logical
+locations based on their package name, i.e. where they would be found
+in a "normal" Module::Build-style distribution. This parameter is
+mainly intended to support alternative layouts of files.
+
+For instance, if you have an old-style C<MakeMaker> distribution for a
+module called C<Foo::Bar> and a F<Bar.pm> file at the top level of the
+distribution, you could specify your layout in your C<Build.PL> like
+this:
+
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ ...
+ pm_files => { 'Bar.pm' => 'lib/Foo/Bar.pm' },
+ );
+
+Note that the values should include C<lib/>, because this is where
+they would be found in a "normal" Module::Build-style distribution.
+
+Note also that the path specifications are I<always> given in
+Unix-like format, not in the style of the local system.
+
+=item pod_files
+
+[version 0.19]
+
+Just like C<pm_files>, but used for specifying the set of C<.pod>
+files in your distribution.
+
+=item recommends
+
+[version 0.08]
+
+This is just like the L</requires> argument, except that modules listed
+in this section aren't essential, just a good idea. We'll just print
+a friendly warning if one of these modules aren't found, but we'll
+continue running.
+
+If a module is recommended but not required, all tests should still
+pass if the module isn't installed. This may mean that some tests
+may be skipped if recommended dependencies aren't present.
+
+Automated tools like CPAN.pm should inform the user when recommended
+modules aren't installed, and it should offer to install them if it
+wants to be helpful.
+
+See the documentation for L<Module::Build::Authoring/"PREREQUISITES">
+for the details of how requirements can be specified.
+
+=item recursive_test_files
+
+[version 0.28]
+
+Normally, C<Module::Build> does not search subdirectories when looking
+for tests to run. When this options is set it will search recursively
+in all subdirectories of the standard 't' test directory.
+
+=item requires
+
+[version 0.07]
+
+An optional C<requires> argument specifies any module prerequisites
+that the current module depends on.
+
+One note: currently C<Module::Build> doesn't actually I<require> the
+user to have dependencies installed, it just strongly urges. In the
+future we may require it. There's also a L</recommends> section for
+things that aren't absolutely required.
+
+Automated tools like CPAN.pm should refuse to install a module if one
+of its dependencies isn't satisfied, unless a "force" command is given
+by the user. If the tools are helpful, they should also offer to
+install the dependencies.
+
+A synonym for C<requires> is C<prereq>, to help succour people
+transitioning from C<ExtUtils::MakeMaker>. The C<requires> term is
+preferred, but the C<prereq> term will remain valid in future
+distributions.
+
+See the documentation for L<Module::Build::Authoring/"PREREQUISITES">
+for the details of how requirements can be specified.
+
+=item script_files
+
+[version 0.18]
+
+An optional parameter specifying a set of files that should be
+installed as executable Perl scripts when the module is installed.
+May be given as an array reference of the files, as a hash reference
+whose keys are the files (and whose values will currently be ignored),
+as a string giving the name of a directory in which to find scripts,
+or as a string giving the name of a single script file.
+
+The default is to install any scripts found in a F<bin> directory at
+the top level of the distribution, minus any keys of L<PL_files>.
+
+For backward compatibility, you may use the parameter C<scripts>
+instead of C<script_files>. Please consider this usage deprecated,
+though it will continue to exist for several version releases.
+
+=item share_dir
+
+[version 0.36]
+
+An optional parameter specifying directories of static data files to
+be installed as read-only files for use with L<File::ShareDir>. The
+C<share_dir> property supports both distribution-level and
+module-level share files.
+
+The simplest use of C<share_dir> is to set it to a directory name or an
+arrayref of directory names containing files to be installed in the
+distribution-level share directory.
+
+ share_dir => 'share'
+
+Alternatively, if C<share_dir> is a hashref, it may have C<dist> or
+C<module> keys providing full flexibility in defining how share
+directories should be installed.
+
+ share_dir => {
+ dist => [ 'examples', 'more_examples' ],
+ module => {
+ Foo::Templates => ['share/html', 'share/text'],
+ Foo::Config => 'share/config',
+ }
+ }
+
+If C<share_dir> is set, then File::ShareDir will automatically be added
+to the C<requires> hash.
+
+=item sign
+
+[version 0.16]
+
+If a true value is specified for this parameter, L<Module::Signature>
+will be used (via the 'distsign' action) to create a SIGNATURE file
+for your distribution during the 'distdir' action, and to add the
+SIGNATURE file to the MANIFEST (therefore, don't add it yourself).
+
+The default value is false. In the future, the default may change to
+true if you have C<Module::Signature> installed on your system.
+
+=item test_files
+
+[version 0.23]
+
+An optional parameter specifying a set of files that should be used as
+C<Test::Harness>-style regression tests to be run during the C<test>
+action. May be given as an array reference of the files, or as a hash
+reference whose keys are the files (and whose values will currently be
+ignored). If the argument is given as a single string (not in an
+array reference), that string will be treated as a C<glob()> pattern
+specifying the files to use.
+
+The default is to look for a F<test.pl> script in the top-level
+directory of the distribution, and any files matching the glob pattern
+C<*.t> in the F<t/> subdirectory. If the C<recursive_test_files>
+property is true, then the C<t/> directory will be scanned recursively
+for C<*.t> files.
+
+=item use_tap_harness
+
+[version 0.2808_03]
+
+An optional parameter indicating whether or not to use TAP::Harness for
+testing rather than Test::Harness. Defaults to false. If set to true, you must
+therefore be sure to add TAP::Harness as a requirement for your module in
+L</build_requires>. Implicitly set to a true value if C<tap_harness_args> is
+specified.
+
+=item tap_harness_args
+
+[version 0.2808_03]
+
+An optional parameter specifying parameters to be passed to TAP::Harness when
+running tests. Must be given as a hash reference of parameters; see the
+L<TAP::Harness|TAP::Harness> documentation for details. Note that specifying
+this parameter will implicitly set C<use_tap_harness> to a true value. You
+must therefore be sure to add TAP::Harness as a requirement for your module in
+L</build_requires>.
+
+=item xs_files
+
+[version 0.19]
+
+Just like C<pm_files>, but used for specifying the set of C<.xs>
+files in your distribution.
+
+=back
+
+
+=item new_from_context(%args)
+
+[version 0.28]
+
+When called from a directory containing a F<Build.PL> script (in other words,
+the base directory of a distribution), this method will run the F<Build.PL> and
+call C<resume()> to return the resulting C<Module::Build> object to the caller.
+Any key-value arguments given to C<new_from_context()> are essentially like
+command line arguments given to the F<Build.PL> script, so for example you
+could pass C<< verbose => 1 >> to this method to turn on verbosity.
+
+=item resume()
+
+[version 0.03]
+
+You'll probably never call this method directly, it's only called from the
+auto-generated C<Build> script (and the C<new_from_context> method). The
+C<new()> method is only called once, when the user runs C<perl Build.PL>.
+Thereafter, when the user runs C<Build test> or another action, the
+C<Module::Build> object is created using the C<resume()> method to
+re-instantiate with the settings given earlier to C<new()>.
+
+=item subclass()
+
+[version 0.06]
+
+This creates a new C<Module::Build> subclass on the fly, as described
+in the L<Module::Build::Authoring/"SUBCLASSING"> section. The caller
+must provide either a C<class> or C<code> parameter, or both. The
+C<class> parameter indicates the name to use for the new subclass, and
+defaults to C<MyModuleBuilder>. The C<code> parameter specifies Perl
+code to use as the body of the subclass.
+
+=item add_property
+
+[version 0.31]
+
+ package 'My::Build';
+ use base 'Module::Build';
+ __PACKAGE__->add_property( 'pedantic' );
+ __PACKAGE__->add_property( answer => 42 );
+ __PACKAGE__->add_property(
+ 'epoch',
+ default => sub { time },
+ check => sub {
+ return 1 if /^\d+$/;
+ shift->property_error( "'$_' is not an epoch time" );
+ return 0;
+ },
+ );
+
+Adds a property to a Module::Build class. Properties are those attributes of a
+Module::Build object which can be passed to the constructor and which have
+accessors to get and set them. All of the core properties, such as
+C<module_name> and C<license>, are defined using this class method.
+
+The first argument to C<add_property()> is always the name of the property.
+The second argument can be either a default value for the property, or a list
+of key/value pairs. The supported keys are:
+
+=over
+
+=item C<default>
+
+The default value. May optionally be specified as a code reference, in which
+case the return value from the execution of the code reference will be used.
+If you need the default to be a code reference, just use a code reference to
+return it, e.g.:
+
+ default => sub { sub { ... } },
+
+=item C<check>
+
+A code reference that checks that a value specified for the property is valid.
+During the execution of the code reference, the new value will be included in
+the C<$_> variable. If the value is correct, the C<check> code reference
+should return true. If the value is not correct, it sends an error message to
+C<property_error()> and returns false.
+
+=back
+
+When this method is called, a new property will be installed in the
+Module::Build class, and an accessor will be built to allow the property to be
+get or set on the build object.
+
+ print $build->pedantic, $/;
+ $build->pedantic(0);
+
+If the default value is a hash reference, this generates a special-case
+accessor method, wherein individual key/value pairs may be set or fetched:
+
+ print "stuff{foo} is: ", $build->stuff( 'foo' ), $/;
+ $build->stuff( foo => 'bar' );
+ print $build->stuff( 'foo' ), $/; # Outputs "bar"
+
+Of course, you can still set the entire hash reference at once, as well:
+
+ $build->stuff( { foo => 'bar', baz => 'yo' } );
+
+In either case, if a C<check> has been specified for the property, it will be
+applied to the entire hash. So the check code reference should look something
+like:
+
+ check => sub {
+ return 1 if defined $_ && exists $_->{foo};
+ shift->property_error(qq{Property "stuff" needs "foo"});
+ return 0;
+ },
+
+=item property_error
+
+[version 0.31]
+
+=back
+
+
+=head2 METHODS
+
+=over 4
+
+=item add_build_element($type)
+
+[version 0.26]
+
+Adds a new type of entry to the build process. Accepts a single
+string specifying its type-name. There must also be a method defined
+to process things of that type, e.g. if you add a build element called
+C<'foo'>, then you must also define a method called
+C<process_foo_files()>.
+
+See also
+L<Module::Build::Cookbook/"Adding new file types to the build process">.
+
+=item add_to_cleanup(@files)
+
+[version 0.03]
+
+You may call C<< $self->add_to_cleanup(@patterns) >> to tell
+C<Module::Build> that certain files should be removed when the user
+performs the C<Build clean> action. The arguments to the method are
+patterns suitable for passing to Perl's C<glob()> function, specified
+in either Unix format or the current machine's native format. It's
+usually convenient to use Unix format when you hard-code the filenames
+(e.g. in F<Build.PL>) and the native format when the names are
+programmatically generated (e.g. in a testing script).
+
+I decided to provide a dynamic method of the C<$build> object, rather
+than just use a static list of files named in the F<Build.PL>, because
+these static lists can get difficult to manage. I usually prefer to
+keep the responsibility for registering temporary files close to the
+code that creates them.
+
+=item args()
+
+[version 0.26]
+
+ my $args_href = $build->args;
+ my %args = $build->args;
+ my $arg_value = $build->args($key);
+ $build->args($key, $value);
+
+This method is the preferred interface for retrieving the arguments passed via
+command line options to F<Build.PL> or F<Build>, minus the Module-Build
+specific options.
+
+When called in in a scalar context with no arguments, this method returns a
+reference to the hash storing all of the arguments; in an array context, it
+returns the hash itself. When passed a single argument, it returns the value
+stored in the args hash for that option key. When called with two arguments,
+the second argument is assigned to the args hash under the key passed as the
+first argument.
+
+=item autosplit_file($from, $to)
+
+[version 0.28]
+
+Invokes the L<AutoSplit> module on the C<$from> file, sending the
+output to the C<lib/auto> directory inside C<$to>. C<$to> is
+typically the C<blib/> directory.
+
+=item base_dir()
+
+[version 0.14]
+
+Returns a string containing the root-level directory of this build,
+i.e. where the C<Build.PL> script and the C<lib> directory can be
+found. This is usually the same as the current working directory,
+because the C<Build> script will C<chdir()> into this directory as
+soon as it begins execution.
+
+=item build_requires()
+
+[version 0.21]
+
+Returns a hash reference indicating the C<build_requires>
+prerequisites that were passed to the C<new()> method.
+
+=item can_action( $action )
+
+Returns a reference to the method that defines C<$action>, or false
+otherwise. This is handy for actions defined (or maybe not!) in subclasses.
+
+[version 0.32_xx]
+
+=item cbuilder()
+
+[version 0.2809]
+
+Returns the internal ExtUtils::CBuilder object that can be used for
+compiling & linking C code. If no such object is available (e.g. if
+the system has no compiler installed) an exception will be thrown.
+
+=item check_installed_status($module, $version)
+
+[version 0.11]
+
+This method returns a hash reference indicating whether a version
+dependency on a certain module is satisfied. The C<$module> argument
+is given as a string like C<"Data::Dumper"> or C<"perl">, and the
+C<$version> argument can take any of the forms described in L</requires>
+above. This allows very fine-grained version checking.
+
+The returned hash reference has the following structure:
+
+ {
+ ok => $whether_the_dependency_is_satisfied,
+ have => $version_already_installed,
+ need => $version_requested, # Same as incoming $version argument
+ message => $informative_error_message,
+ }
+
+If no version of C<$module> is currently installed, the C<have> value
+will be the string C<< "<none>" >>. Otherwise the C<have> value will
+simply be the version of the installed module. Note that this means
+that if C<$module> is installed but doesn't define a version number,
+the C<have> value will be C<undef> - this is why we don't use C<undef>
+for the case when C<$module> isn't installed at all.
+
+This method may be called either as an object method
+(C<< $build->check_installed_status($module, $version) >>)
+or as a class method
+(C<< Module::Build->check_installed_status($module, $version) >>).
+
+=item check_installed_version($module, $version)
+
+[version 0.05]
+
+Like L<check_installed_status()|/"check_installed_status($module, $version)">,
+but simply returns true or false depending on whether module
+C<$module> satisfies the dependency C<$version>.
+
+If the check succeeds, the return value is the actual version of
+C<$module> installed on the system. This allows you to do the
+following:
+
+ my $installed = $build->check_installed_version('DBI', '1.15');
+ if ($installed) {
+ print "Congratulations, version $installed of DBI is installed.\n";
+ } else {
+ die "Sorry, you must install DBI.\n";
+ }
+
+If the check fails, we return false and set C<$@> to an informative
+error message.
+
+If C<$version> is any non-true value (notably zero) and any version of
+C<$module> is installed, we return true. In this case, if C<$module>
+doesn't define a version, or if its version is zero, we return the
+special value "0 but true", which is numerically zero, but logically
+true.
+
+In general you might prefer to use C<check_installed_status> if you
+need detailed information, or this method if you just need a yes/no
+answer.
+
+=item compare_versions($v1, $op, $v2)
+
+[version 0.28]
+
+Compares two module versions C<$v1> and C<$v2> using the operator
+C<$op>, which should be one of Perl's numeric operators like C<!=> or
+C<< >= >> or the like. We do at least a halfway-decent job of
+handling versions that aren't strictly numeric, like C<0.27_02>, but
+exotic stuff will likely cause problems.
+
+In the future, the guts of this method might be replaced with a call
+out to C<version.pm>.
+
+=item config($key)
+
+=item config($key, $value)
+
+=item config() [deprecated]
+
+[version 0.22]
+
+With a single argument C<$key>, returns the value associated with that
+key in the C<Config.pm> hash, including any changes the author or user
+has specified.
+
+With C<$key> and C<$value> arguments, sets the value for future
+callers of C<config($key)>.
+
+With no arguments, returns a hash reference containing all such
+key-value pairs. This usage is deprecated, though, because it's a
+resource hog and violates encapsulation.
+
+=item config_data($name)
+
+=item config_data($name => $value)
+
+[version 0.26]
+
+With a single argument, returns the value of the configuration
+variable C<$name>. With two arguments, sets the given configuration
+variable to the given value. The value may be any Perl scalar that's
+serializable with C<Data::Dumper>. For instance, if you write a
+module that can use a MySQL or PostgreSQL back-end, you might create
+configuration variables called C<mysql_connect> and
+C<postgres_connect>, and set each to an array of connection parameters
+for C<< DBI->connect() >>.
+
+Configuration values set in this way using the Module::Build object
+will be available for querying during the build/test process and after
+installation via the generated C<...::ConfigData> module, as
+C<< ...::ConfigData->config($name) >>.
+
+The L<feature()|/"feature($name)"> and C<config_data()> methods represent
+Module::Build's main support for configuration of installed modules.
+See also L<Module::Build::Authoring/"SAVING CONFIGURATION INFORMATION">.
+
+=item conflicts()
+
+[version 0.21]
+
+Returns a hash reference indicating the C<conflicts> prerequisites
+that were passed to the C<new()> method.
+
+=item contains_pod($file) [deprecated]
+
+[version 0.20]
+
+[Deprecated] Please see L<Module::Build::ModuleInfo> instead.
+
+Returns true if the given file appears to contain POD documentation.
+Currently this checks whether the file has a line beginning with
+'=pod', '=head', or '=item', but the exact semantics may change in the
+future.
+
+=item copy_if_modified(%parameters)
+
+[version 0.19]
+
+Takes the file in the C<from> parameter and copies it to the file in
+the C<to> parameter, or the directory in the C<to_dir> parameter, if
+the file has changed since it was last copied (or if it doesn't exist
+in the new location). By default the entire directory structure of
+C<from> will be copied into C<to_dir>; an optional C<flatten>
+parameter will copy into C<to_dir> without doing so.
+
+Returns the path to the destination file, or C<undef> if nothing
+needed to be copied.
+
+Any directories that need to be created in order to perform the
+copying will be automatically created.
+
+The destination file is set to read-only. If the source file has the
+executable bit set, then the destination file will be made executable.
+
+=item create_build_script()
+
+[version 0.05]
+
+Creates an executable script called C<Build> in the current directory
+that will be used to execute further user actions. This script is
+roughly analogous (in function, not in form) to the Makefile created
+by C<ExtUtils::MakeMaker>. This method also creates some temporary
+data in a directory called C<_build/>. Both of these will be removed
+when the C<realclean> action is performed.
+
+Among the files created in C<_build/> is a F<_build/prereqs> file
+containing the set of prerequisites for this distribution, as a hash
+of hashes. This file may be C<eval()>-ed to obtain the authoritative
+set of prerequisites, which might be different from the contents of
+F<META.yml> (because F<Build.PL> might have set them dynamically).
+But fancy developers take heed: do not put any fancy custom runtime
+code in the F<_build/prereqs> file, leave it as a static declaration
+containing only strings and numbers. Similarly, do not alter the
+structure of the internal C<< $self->{properties}{requires} >> (etc.)
+data members, because that's where this data comes from.
+
+=item current_action()
+
+[version 0.28]
+
+Returns the name of the currently-running action, such as "build" or
+"test". This action is not necessarily the action that was originally
+invoked by the user. For example, if the user invoked the "test"
+action, current_action() would initially return "test". However,
+action "test" depends on action "code", so current_action() will
+return "code" while that dependency is being executed. Once that
+action has completed, current_action() will again return "test".
+
+If you need to know the name of the original action invoked by the
+user, see L</invoked_action()> below.
+
+=item depends_on(@actions)
+
+[version 0.28]
+
+Invokes the named action or list of actions in sequence. Using this
+method is preferred to calling the action explicitly because it
+performs some internal record-keeping, and it ensures that the same
+action is not invoked multiple times (note: in future versions of
+Module::Build it's conceivable that this run-only-once mechanism will
+be changed to something more intelligent).
+
+Note that the name of this method is something of a misnomer; it
+should really be called something like
+C<invoke_actions_unless_already_invoked()> or something, but for
+better or worse (perhaps better!) we were still thinking in
+C<make>-like dependency terms when we created this method.
+
+See also L<dispatch()|/"dispatch($action, %args)">. The main
+distinction between the two is that C<depends_on()> is meant to call
+an action from inside another action, whereas C<dispatch()> is meant
+to set the very top action in motion.
+
+=item dir_contains($first_dir, $second_dir)
+
+[version 0.28]
+
+Returns true if the first directory logically contains the second
+directory. This is just a convenience function because C<File::Spec>
+doesn't really provide an easy way to figure this out (but
+C<Path::Class> does...).
+
+=item dispatch($action, %args)
+
+[version 0.03]
+
+Invokes the build action C<$action>. Optionally, a list of options
+and their values can be passed in. This is equivalent to invoking an
+action at the command line, passing in a list of options.
+
+Custom options that have not been registered must be passed in as a
+hash reference in a key named "args":
+
+ $build->dispatch('foo', verbose => 1, args => { my_option => 'value' });
+
+This method is intended to be used to programmatically invoke build
+actions, e.g. by applications controlling Module::Build-based builds
+rather than by subclasses.
+
+See also L<depends_on()|/"depends_on(@actions)">. The main
+distinction between the two is that C<depends_on()> is meant to call
+an action from inside another action, whereas C<dispatch()> is meant
+to set the very top action in motion.
+
+=item dist_dir()
+
+[version 0.28]
+
+Returns the name of the directory that will be created during the
+C<dist> action. The name is derived from the C<dist_name> and
+C<dist_version> properties.
+
+=item dist_name()
+
+[version 0.21]
+
+Returns the name of the current distribution, as passed to the
+C<new()> method in a C<dist_name> or modified C<module_name>
+parameter.
+
+=item dist_version()
+
+[version 0.21]
+
+Returns the version of the current distribution, as determined by the
+C<new()> method from a C<dist_version>, C<dist_version_from>, or
+C<module_name> parameter.
+
+=item do_system($cmd, @args)
+
+[version 0.21]
+
+This is a fairly simple wrapper around Perl's C<system()> built-in
+command. Given a command and an array of optional arguments, this
+method will print the command to C<STDOUT>, and then execute it using
+Perl's C<system()>. It returns true or false to indicate success or
+failure (the opposite of how C<system()> works, but more intuitive).
+
+Note that if you supply a single argument to C<do_system()>, it
+will/may be processed by the system's shell, and any special
+characters will do their special things. If you supply multiple
+arguments, no shell will get involved and the command will be executed
+directly.
+
+=item feature($name)
+
+=item feature($name => $value)
+
+[version 0.26]
+
+With a single argument, returns true if the given feature is set.
+With two arguments, sets the given feature to the given boolean value.
+In this context, a "feature" is any optional functionality of an
+installed module. For instance, if you write a module that could
+optionally support a MySQL or PostgreSQL backend, you might create
+features called C<mysql_support> and C<postgres_support>, and set them
+to true/false depending on whether the user has the proper databases
+installed and configured.
+
+Features set in this way using the Module::Build object will be
+available for querying during the build/test process and after
+installation via the generated C<...::ConfigData> module, as
+C<< ...::ConfigData->feature($name) >>.
+
+The C<feature()> and C<config_data()> methods represent
+Module::Build's main support for configuration of installed modules.
+See also L<Module::Build::Authoring/"SAVING CONFIGURATION INFORMATION">.
+
+=item fix_shebang_line(@files)
+
+[version 0.??]
+
+Modify any "shebang" line in the specified files to use the path to the
+perl executable being used for the current build. Files are modified
+in-place. The existing shebang line must have a command that contains
+"C<perl>"; arguments to the command do not count. In particular, this
+means that the use of C<#!/usr/bin/env perl> will not be changed.
+
+For an explanation of shebang lines, see
+L<http://en.wikipedia.org/wiki/Shebang_%28Unix%29>.
+
+=item have_c_compiler()
+
+[version 0.21]
+
+Returns true if the current system seems to have a working C compiler.
+We currently determine this by attempting to compile a simple C source
+file and reporting whether the attempt was successful.
+
+=item install_base_relpaths()
+
+=item install_base_relpaths($type)
+
+=item install_base_relpaths($type => $path)
+
+[version 0.28]
+
+Set or retrieve the relative paths that are appended to
+C<install_base> for any installable element. This is useful if you
+want to set the relative install path for custom build elements.
+
+With no argument, it returns a reference to a hash containing all
+elements and their respective values. This hash should not be modified
+directly; use the multiple argument below form to change values.
+
+The single argument form returns the value associated with the
+element C<$type>.
+
+The multiple argument form allows you to set the paths for element types.
+C<$value> must be a relative path using Unix-like paths. (A series of
+directories separated by slashes, e.g. C<foo/bar>.) The return value is a
+localized path based on C<$value>.
+
+Assigning the value C<undef> to an element causes it to be removed.
+
+=item install_destination($type)
+
+[version 0.28]
+
+Returns the directory in which items of type C<$type> (e.g. C<lib>,
+C<arch>, C<bin>, or anything else returned by the L</install_types()>
+method) will be installed during the C<install> action. Any settings
+for C<install_path>, C<install_base>, and C<prefix> are taken into
+account when determining the return value.
+
+=item install_path()
+
+=item install_path($type)
+
+=item install_path($type => $path)
+
+[version 0.28]
+
+Set or retrieve paths for specific installable elements. This is
+useful when you want to examine any explicit install paths specified
+by the user on the command line, or if you want to set the install
+path for a specific installable element based on another attribute
+like C<install_base()>.
+
+With no argument, it returns a reference to a hash containing all
+elements and their respective values. This hash should not be modified
+directly; use the multiple argument below form to change values.
+
+The single argument form returns the value associated with the
+element C<$type>.
+
+The multiple argument form allows you to set the paths for element types.
+The supplied C<$path> should be an absolute path to install elements
+of C<$type>. The return value is C<$path>.
+
+Assigning the value C<undef> to an element causes it to be removed.
+
+=item install_types()
+
+[version 0.28]
+
+Returns a list of installable types that this build knows about.
+These types each correspond to the name of a directory in F<blib/>,
+and the list usually includes items such as C<lib>, C<arch>, C<bin>,
+C<script>, C<libdoc>, C<bindoc>, and if HTML documentation is to be
+built, C<libhtml> and C<binhtml>. Other user-defined types may also
+exist.
+
+=item invoked_action()
+
+[version 0.28]
+
+This is the name of the original action invoked by the user. This
+value is set when the user invokes F<Build.PL>, the F<Build> script,
+or programmatically through the L<dispatch()|/"dispatch($action, %args)">
+method. It does not change as sub-actions are executed as
+dependencies are evaluated.
+
+To get the name of the currently executing dependency, see
+L</current_action()> above.
+
+=item notes()
+
+=item notes($key)
+
+=item notes($key => $value)
+
+[version 0.20]
+
+The C<notes()> value allows you to store your own persistent
+information about the build, and to share that information among
+different entities involved in the build. See the example in the
+C<current()> method.
+
+The C<notes()> method is essentially a glorified hash access. With no
+arguments, C<notes()> returns the entire hash of notes. With one argument,
+C<notes($key)> returns the value associated with the given key. With two
+arguments, C<notes($key, $value)> sets the value associated with the given key
+to C<$value> and returns the new value.
+
+The lifetime of the C<notes> data is for "a build" - that is, the
+C<notes> hash is created when C<perl Build.PL> is run (or when the
+C<new()> method is run, if the Module::Build Perl API is being used
+instead of called from a shell), and lasts until C<perl Build.PL> is
+run again or the C<clean> action is run.
+
+=item orig_dir()
+
+[version 0.28]
+
+Returns a string containing the working directory that was in effect
+before the F<Build> script chdir()-ed into the C<base_dir>. This
+might be useful for writing wrapper tools that might need to chdir()
+back out.
+
+=item os_type()
+
+[version 0.04]
+
+If you're subclassing Module::Build and some code needs to alter its
+behavior based on the current platform, you may only need to know
+whether you're running on Windows, Unix, MacOS, VMS, etc., and not the
+fine-grained value of Perl's C<$^O> variable. The C<os_type()> method
+will return a string like C<Windows>, C<Unix>, C<MacOS>, C<VMS>, or
+whatever is appropriate. If you're running on an unknown platform, it
+will return C<undef> - there shouldn't be many unknown platforms
+though.
+
+=item is_vmsish()
+
+=item is_windowsish()
+
+=item is_unixish()
+
+Convenience functions that return a boolean value indicating whether
+this platform behaves respectively like VMS, Windows, or Unix. For
+arbitrary reasons other platforms don't get their own such functions,
+at least not yet.
+
+
+=item prefix_relpaths()
+
+=item prefix_relpaths($installdirs)
+
+=item prefix_relpaths($installdirs, $type)
+
+=item prefix_relpaths($installdirs, $type => $path)
+
+[version 0.28]
+
+Set or retrieve the relative paths that are appended to C<prefix> for
+any installable element. This is useful if you want to set the
+relative install path for custom build elements.
+
+With no argument, it returns a reference to a hash containing all
+elements and their respective values as defined by the current
+C<installdirs> setting.
+
+With a single argument, it returns a reference to a hash containing
+all elements and their respective values as defined by
+C<$installdirs>.
+
+The hash returned by the above calls should not be modified directly;
+use the three-argument below form to change values.
+
+The two argument form returns the value associated with the
+element C<$type>.
+
+The multiple argument form allows you to set the paths for element types.
+C<$value> must be a relative path using Unix-like paths. (A series of
+directories separated by slashes, e.g. C<foo/bar>.) The return value is a
+localized path based on C<$value>.
+
+Assigning the value C<undef> to an element causes it to be removed.
+
+=item get_metadata()
+
+[version 0.36]
+
+This method returns a hash reference of metadata that can be used to create a
+YAML datastream. It is provided for authors to override or customize the fields
+of F<META.yml>. E.g.
+
+ package My::Builder;
+ use base 'Module::Build';
+
+ sub get_metadata {
+ my $self, @args = @_;
+ my $data = $self->SUPER::get_metadata(@args);
+ $data->{custom_field} = 'foo';
+ return $data;
+ }
+
+The only valid argument is C<fatal>, which indicates whether missing required
+metadata fields should be a fatal error or not. For META creation, it
+generally should, but for MYMETA creation for end-users, it should not be
+fatal.
+
+This method is a wrapper around the old prepare_metadata API now that we
+no longer use YAML::Node to hold metadata.
+
+=item prepare_metadata() [deprecated]
+
+[version 0.36]
+
+[Deprecated] As of 0.36, authors should use C<get_metadata> instead. This
+method is preserved for backwards compatibility only.
+
+It takes three positional arguments: a hashref (to which metadata will be
+added), an optional arrayref (to which metadata keys will be added in order if
+the arrayref exists), and a hashref of arguments (as provided to get_metadata).
+The latter argument is new as of 0.36. Earlier versions are always fatal on
+errors.
+
+Prior to version 0.36, this method took a YAML::Node as an argument to hold
+assembled metadata.
+
+=item prereq_failures()
+
+[version 0.11]
+
+Returns a data structure containing information about any failed
+prerequisites (of any of the types described above), or C<undef> if
+all prerequisites are met.
+
+The data structure returned is a hash reference. The top level keys
+are the type of prerequisite failed, one of "requires",
+"build_requires", "conflicts", or "recommends". The associated values
+are hash references whose keys are the names of required (or
+conflicting) modules. The associated values of those are hash
+references indicating some information about the failure. For example:
+
+ {
+ have => '0.42',
+ need => '0.59',
+ message => 'Version 0.42 is installed, but we need version 0.59',
+ }
+
+or
+
+ {
+ have => '<none>',
+ need => '0.59',
+ message => 'Prerequisite Foo isn't installed',
+ }
+
+This hash has the same structure as the hash returned by the
+C<check_installed_status()> method, except that in the case of
+"conflicts" dependencies we change the "need" key to "conflicts" and
+construct a proper message.
+
+Examples:
+
+ # Check a required dependency on Foo::Bar
+ if ( $build->prereq_failures->{requires}{Foo::Bar} ) { ...
+
+ # Check whether there were any failures
+ if ( $build->prereq_failures ) { ...
+
+ # Show messages for all failures
+ my $failures = $build->prereq_failures;
+ while (my ($type, $list) = each %$failures) {
+ while (my ($name, $hash) = each %$list) {
+ print "Failure for $name: $hash->{message}\n";
+ }
+ }
+
+=item prereq_data()
+
+[version 0.32]
+
+Returns a reference to a hash describing all prerequisites. The keys of the
+hash will the various prerequisite types ('requires', 'build_requires',
+'configure_requires', 'recommends', or 'conflicts') and the values will
+references to hashes of module names and version numbers. Only prerequisites
+types that are defined will be included. The C<prereq_data> action is just a
+thin wrapper around the C<prereq_data()> method and dumps the hash as a string
+that can be loaded using C<eval()>.
+
+=item prereq_report()
+
+[version 0.28]
+
+Returns a human-readable (table-form) string showing all
+prerequisites, the versions required, and the versions actually
+installed. This can be useful for reviewing the configuration of your
+system prior to a build, or when compiling data to send for a bug
+report. The C<prereq_report> action is just a thin wrapper around the
+C<prereq_report()> method.
+
+=item prompt($message, $default)
+
+[version 0.12]
+
+Asks the user a question and returns their response as a string. The
+first argument specifies the message to display to the user (for
+example, C<"Where do you keep your money?">). The second argument,
+which is optional, specifies a default answer (for example,
+C<"wallet">). The user will be asked the question once.
+
+If C<prompt()> detects that it is not running interactively and there
+is nothing on STDIN or if the PERL_MM_USE_DEFAULT environment variable
+is set to true, the $default will be used without prompting.
+
+To prevent automated processes from blocking, the user must either set
+PERL_MM_USE_DEFAULT or attach something to STDIN (this can be a
+pipe/file containing a scripted set of answers or /dev/null.)
+
+If no $default is provided an empty string will be used instead. In
+non-interactive mode, the absence of $default is an error (though
+explicitly passing C<undef()> as the default is valid as of 0.27.)
+
+This method may be called as a class or object method.
+
+=item recommends()
+
+[version 0.21]
+
+Returns a hash reference indicating the C<recommends> prerequisites
+that were passed to the C<new()> method.
+
+=item requires()
+
+[version 0.21]
+
+Returns a hash reference indicating the C<requires> prerequisites that
+were passed to the C<new()> method.
+
+=item rscan_dir($dir, $pattern)
+
+[version 0.28]
+
+Uses C<File::Find> to traverse the directory C<$dir>, returning a
+reference to an array of entries matching C<$pattern>. C<$pattern>
+may either be a regular expression (using C<qr//> or just a plain
+string), or a reference to a subroutine that will return true for
+wanted entries. If C<$pattern> is not given, all entries will be
+returned.
+
+Examples:
+
+ # All the *.pm files in lib/
+ $m->rscan_dir('lib', qr/\.pm$/)
+
+ # All the files in blib/ that aren't *.html files
+ $m->rscan_dir('blib', sub {-f $_ and not /\.html$/});
+
+ # All the files in t/
+ $m->rscan_dir('t');
+
+=item runtime_params()
+
+=item runtime_params($key)
+
+[version 0.28]
+
+The C<runtime_params()> method stores the values passed on the command line
+for valid properties (that is, any command line options for which
+C<valid_property()> returns a true value). The value on the command line may
+override the default value for a property, as well as any value specified in a
+call to C<new()>. This allows you to programmatically tell if C<perl Build.PL>
+or any execution of C<./Build> had command line options specified that
+override valid properties.
+
+The C<runtime_params()> method is essentially a glorified read-only hash. With
+no arguments, C<runtime_params()> returns the entire hash of properties
+specified on the command line. With one argument, C<runtime_params($key)>
+returns the value associated with the given key.
+
+The lifetime of the C<runtime_params> data is for "a build" - that is, the
+C<runtime_params> hash is created when C<perl Build.PL> is run (or when the
+C<new()> method is called, if the Module::Build Perl API is being used instead
+of called from a shell), and lasts until C<perl Build.PL> is run again or the
+C<clean> action is run.
+
+=item script_files()
+
+[version 0.18]
+
+Returns a hash reference whose keys are the perl script files to be
+installed, if any. This corresponds to the C<script_files> parameter to the
+C<new()> method. With an optional argument, this parameter may be set
+dynamically.
+
+For backward compatibility, the C<scripts()> method does exactly the
+same thing as C<script_files()>. C<scripts()> is deprecated, but it
+will stay around for several versions to give people time to
+transition.
+
+=item up_to_date($source_file, $derived_file)
+
+=item up_to_date(\@source_files, \@derived_files)
+
+[version 0.20]
+
+This method can be used to compare a set of source files to a set of
+derived files. If any of the source files are newer than any of the
+derived files, it returns false. Additionally, if any of the derived
+files do not exist, it returns false. Otherwise it returns true.
+
+The arguments may be either a scalar or an array reference of file
+names.
+
+=item y_n($message, $default)
+
+[version 0.12]
+
+Asks the user a yes/no question using C<prompt()> and returns true or
+false accordingly. The user will be asked the question repeatedly
+until they give an answer that looks like "yes" or "no".
+
+The first argument specifies the message to display to the user (for
+example, C<"Shall I invest your money for you?">), and the second
+argument specifies the default answer (for example, C<"y">).
+
+Note that the default is specified as a string like C<"y"> or C<"n">,
+and the return value is a Perl boolean value like 1 or 0. I thought
+about this for a while and this seemed like the most useful way to do
+it.
+
+This method may be called as a class or object method.
+
+=back
+
+
+=head2 Autogenerated Accessors
+
+In addition to the aforementioned methods, there are also some get/set
+accessor methods for the following properties:
+
+=over 4
+
+=item PL_files()
+
+=item allow_mb_mismatch()
+
+=item auto_configure_requires()
+
+=item autosplit()
+
+=item base_dir()
+
+=item bindoc_dirs()
+
+=item blib()
+
+=item build_bat()
+
+=item build_class()
+
+=item build_elements()
+
+=item build_requires()
+
+=item build_script()
+
+=item bundle_inc()
+
+=item bundle_inc_preload()
+
+=item c_source()
+
+=item config_dir()
+
+=item configure_requires()
+
+=item conflicts()
+
+=item cpan_client()
+
+=item create_license()
+
+=item create_makefile_pl()
+
+=item create_packlist()
+
+=item create_readme()
+
+=item debug()
+
+=item debugger()
+
+=item destdir()
+
+=item get_options()
+
+=item html_css()
+
+=item include_dirs()
+
+=item install_base()
+
+=item installdirs()
+
+=item libdoc_dirs()
+
+=item license()
+
+=item magic_number()
+
+=item mb_version()
+
+=item meta_add()
+
+=item meta_merge()
+
+=item metafile()
+
+=item module_name()
+
+=item mymetafile()
+
+=item needs_compiler()
+
+=item orig_dir()
+
+=item perl()
+
+=item pm_files()
+
+=item pod_files()
+
+=item pollute()
+
+=item prefix()
+
+=item prereq_action_types()
+
+=item program_name()
+
+=item quiet()
+
+=item recommends()
+
+=item recurse_into()
+
+=item recursive_test_files()
+
+=item requires()
+
+=item scripts()
+
+=item sign()
+
+=item tap_harness_args()
+
+=item test_file_exts()
+
+=item use_rcfile()
+
+=item use_tap_harness()
+
+=item verbose()
+
+=item xs_files()
+
+=back
+
+
+=head1 MODULE METADATA
+
+If you would like to add other useful metadata, C<Module::Build>
+supports this with the C<meta_add> and C<meta_merge> arguments to
+L</new>. The authoritative list of supported metadata can be found at
+L<http://module-build.sourceforge.net/META-spec-current.html>, but for
+convenience - here are a few of the more useful ones:
+
+=over 4
+
+=item keywords
+
+For describing the distribution using keyword (or "tags") in order to
+make CPAN.org indexing and search more efficient and useful.
+
+See L<http://module-build.sourceforge.net/META-spec-current.html#keywords>.
+
+=item resources
+
+A list of additional resources available for users of the
+distribution. This can include links to a homepage on the web, a
+bug tracker, the repository location, a even subscription page for the
+distribution mailing list.
+
+See L<http://module-build.sourceforge.net/META-spec-current.html#resources>.
+
+=back
+
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+perl(1), L<Module::Build>(3), L<Module::Build::Authoring>(3),
+L<Module::Build::Cookbook>(3), L<ExtUtils::MakeMaker>(3), L<YAML::Tiny>(3)
+
+F<META.yml> Specification:
+L<http://module-build.sourceforge.net/META-spec-current.html>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Authoring.pod b/Master/tlpkg/tlperl.straw/lib/Module/Build/Authoring.pod
new file mode 100755
index 00000000000..38fb3f089a6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Authoring.pod
@@ -0,0 +1,323 @@
+=head1 NAME
+
+Module::Build::Authoring - Authoring Module::Build modules
+
+
+=head1 DESCRIPTION
+
+When creating a C<Build.PL> script for a module, something like the
+following code will typically be used:
+
+ use Module::Build;
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ requires => {
+ 'perl' => '5.6.1',
+ 'Some::Module' => '1.23',
+ 'Other::Module' => '>= 1.2, != 1.5, < 2.0',
+ },
+ );
+ $build->create_build_script;
+
+A simple module could get away with something as short as this for its
+C<Build.PL> script:
+
+ use Module::Build;
+ Module::Build->new(
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ )->create_build_script;
+
+The model used by C<Module::Build> is a lot like the C<MakeMaker>
+metaphor, with the following correspondences:
+
+ In Module::Build In ExtUtils::MakeMaker
+ --------------------------- ------------------------
+ Build.PL (initial script) Makefile.PL (initial script)
+ Build (a short perl script) Makefile (a long Makefile)
+ _build/ (saved state info) various config text in the Makefile
+
+Any customization can be done simply by subclassing C<Module::Build>
+and adding a method called (for example) C<ACTION_test>, overriding
+the default 'test' action. You could also add a method called
+C<ACTION_whatever>, and then you could perform the action C<Build
+whatever>.
+
+For information on providing compatibility with
+C<ExtUtils::MakeMaker>, see L<Module::Build::Compat> and
+L<http://www.makemaker.org/wiki/index.cgi?ModuleBuildConversionGuide>.
+
+
+=head1 STRUCTURE
+
+Module::Build creates a class hierarchy conducive to customization.
+Here is the parent-child class hierarchy in classy ASCII art:
+
+ /--------------------\
+ | Your::Parent | (If you subclass Module::Build)
+ \--------------------/
+ |
+ |
+ /--------------------\ (Doesn't define any functionality
+ | Module::Build | of its own - just figures out what
+ \--------------------/ other modules to load.)
+ |
+ |
+ /-----------------------------------\ (Some values of $^O may
+ | Module::Build::Platform::$^O | define specialized functionality.
+ \-----------------------------------/ Otherwise it's ...::Default, a
+ | pass-through class.)
+ |
+ /--------------------------\
+ | Module::Build::Base | (Most of the functionality of
+ \--------------------------/ Module::Build is defined here.)
+
+
+=head1 SUBCLASSING
+
+Right now, there are two ways to subclass Module::Build. The first
+way is to create a regular module (in a C<.pm> file) that inherits
+from Module::Build, and use that module's class instead of using
+Module::Build directly:
+
+ ------ in Build.PL: ----------
+ #!/usr/bin/perl
+
+ use lib q(/nonstandard/library/path);
+ use My::Builder; # Or whatever you want to call it
+
+ my $build = My::Builder->new
+ (
+ module_name => 'Foo::Bar', # All the regular args...
+ license => 'perl',
+ dist_author => 'A N Other <me@here.net.au>',
+ requires => { Carp => 0 }
+ );
+ $build->create_build_script;
+
+This is relatively straightforward, and is the best way to do things
+if your My::Builder class contains lots of code. The
+C<create_build_script()> method will ensure that the current value of
+C<@INC> (including the C</nonstandard/library/path>) is propagated to
+the Build script, so that My::Builder can be found when running build
+actions. If you find that you need to C<chdir> into a different directories
+in your subclass methods or actions, be sure to always return to the original
+directory (available via the C<base_dir()> method before returning control
+to the parent class. This is important to avoid data serialization problems.
+
+For very small additions, Module::Build provides a C<subclass()>
+method that lets you subclass Module::Build more conveniently, without
+creating a separate file for your module:
+
+ ------ in Build.PL: ----------
+ #!/usr/bin/perl
+
+ use Module::Build;
+ my $class = Module::Build->subclass
+ (
+ class => 'My::Builder',
+ code => q{
+ sub ACTION_foo {
+ print "I'm fooing to death!\n";
+ }
+ },
+ );
+
+ my $build = $class->new
+ (
+ module_name => 'Foo::Bar', # All the regular args...
+ license => 'perl',
+ dist_author => 'A N Other <me@here.net.au>',
+ requires => { Carp => 0 }
+ );
+ $build->create_build_script;
+
+Behind the scenes, this actually does create a C<.pm> file, since the
+code you provide must persist after Build.PL is run if it is to be
+very useful.
+
+See also the documentation for the L<Module::Build::API/"subclass()">
+method.
+
+
+=head1 PREREQUISITES
+
+=head2 Types of prerequisites
+
+To specify what versions of other modules are used by this
+distribution, several types of prerequisites can be defined with the
+following parameters:
+
+=over 3
+
+=item configure_requires
+
+Items that must be installed I<before> configuring this distribution
+(i.e. before running the F<Build.PL> script). This might be a
+specific minimum version of C<Module::Build> or any other module the
+F<Build.PL> needs in order to do its stuff. Clients like C<CPAN.pm>
+or C<CPANPLUS> will be expected to pick C<configure_requires> out of the
+F<META.yml> file and install these items before running the
+C<Build.PL>.
+
+If no configure_requires is specified, the current version of Module::Build
+is automatically added to configure_requires.
+
+=item build_requires
+
+Items that are necessary for building and testing this distribution,
+but aren't necessary after installation. This can help users who only
+want to install these items temporarily. It also helps reduce the
+size of the CPAN dependency graph if everything isn't smooshed into
+C<requires>.
+
+=item requires
+
+Items that are necessary for basic functioning.
+
+=item recommends
+
+Items that are recommended for enhanced functionality, but there are
+ways to use this distribution without having them installed. You
+might also think of this as "can use" or "is aware of" or "changes
+behavior in the presence of".
+
+=item conflicts
+
+Items that can cause problems with this distribution when installed.
+This is pretty rare.
+
+=back
+
+=head2 Format of prerequisites
+
+The prerequisites are given in a hash reference, where the keys are
+the module names and the values are version specifiers:
+
+ requires => {
+ Foo::Module => '2.4',
+ Bar::Module => 0,
+ Ken::Module => '>= 1.2, != 1.5, < 2.0',
+ perl => '5.6.0'
+ },
+
+The above four version specifiers have different effects. The value
+C<'2.4'> means that B<at least> version 2.4 of C<Foo::Module> must be
+installed. The value C<0> means that B<any> version of C<Bar::Module>
+is acceptable, even if C<Bar::Module> doesn't define a version. The
+more verbose value C<'E<gt>= 1.2, != 1.5, E<lt> 2.0'> means that
+C<Ken::Module>'s version must be B<at least> 1.2, B<less than> 2.0,
+and B<not equal to> 1.5. The list of criteria is separated by commas,
+and all criteria must be satisfied.
+
+A special C<perl> entry lets you specify the versions of the Perl
+interpreter that are supported by your module. The same version
+dependency-checking semantics are available, except that we also
+understand perl's new double-dotted version numbers.
+
+=head2 XS Extensions
+
+Modules which need to compile XS code should list C<ExtUtils::CBuilder>
+as a C<build_requires> element.
+
+
+=head1 SAVING CONFIGURATION INFORMATION
+
+Module::Build provides a very convenient way to save configuration
+information that your installed modules (or your regression tests) can
+access. If your Build process calls the C<feature()> or
+C<config_data()> methods, then a C<Foo::Bar::ConfigData> module will
+automatically be created for you, where C<Foo::Bar> is the
+C<module_name> parameter as passed to C<new()>. This module provides
+access to the data saved by these methods, and a way to update the
+values. There is also a utility script called C<config_data>
+distributed with Module::Build that provides a command line interface
+to this same functionality. See also the generated
+C<Foo::Bar::ConfigData> documentation, and the C<config_data>
+script's documentation, for more information.
+
+
+=head1 STARTING MODULE DEVELOPMENT
+
+When starting development on a new module, it's rarely worth your time
+to create a tree of all the files by hand. Some automatic
+module-creators are available: the oldest is C<h2xs>, which has
+shipped with perl itself for a long time. Its name reflects the fact
+that modules were originally conceived of as a way to wrap up a C
+library (thus the C<h> part) into perl extensions (thus the C<xs>
+part).
+
+These days, C<h2xs> has largely been superseded by modules like
+C<ExtUtils::ModuleMaker>, and C<Module::Starter>. They have varying
+degrees of support for C<Module::Build>.
+
+
+=head1 AUTOMATION
+
+One advantage of Module::Build is that since it's implemented as Perl
+methods, you can invoke these methods directly if you want to install
+a module non-interactively. For instance, the following Perl script
+will invoke the entire build/install procedure:
+
+ my $build = Module::Build->new(module_name => 'MyModule');
+ $build->dispatch('build');
+ $build->dispatch('test');
+ $build->dispatch('install');
+
+If any of these steps encounters an error, it will throw a fatal
+exception.
+
+You can also pass arguments as part of the build process:
+
+ my $build = Module::Build->new(module_name => 'MyModule');
+ $build->dispatch('build');
+ $build->dispatch('test', verbose => 1);
+ $build->dispatch('install', sitelib => '/my/secret/place/');
+
+Building and installing modules in this way skips creating the
+C<Build> script.
+
+
+=head1 MIGRATION
+
+Note that if you want to provide both a F<Makefile.PL> and a
+F<Build.PL> for your distribution, you probably want to add the
+following to C<WriteMakefile> in your F<Makefile.PL> so that C<MakeMaker>
+doesn't try to run your F<Build.PL> as a normal F<.PL> file:
+
+ PL_FILES => {},
+
+You may also be interested in looking at the C<Module::Build::Compat>
+module, which can automatically create various kinds of F<Makefile.PL>
+compatibility layers.
+
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+Development questions, bug reports, and patches should be sent to the
+Module-Build mailing list at <module-build@perl.org>.
+
+Bug reports are also welcome at
+<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build>.
+
+The latest development version is available from the Subversion
+repository at <https://svn.perl.org/modules/Module-Build/trunk/>
+
+
+=head1 SEE ALSO
+
+perl(1), L<Module::Build>(3), L<Module::Build::API>(3),
+L<Module::Build::Cookbook>(3), L<ExtUtils::MakeMaker>(3), L<YAML>(3)
+
+F<META.yml> Specification:
+L<http://module-build.sourceforge.net/META-spec-current.html>
+
+L<http://www.dsmit.com/cons/>
+
+L<http://search.cpan.org/dist/PerlBuildSystem/>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Base.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Base.pm
new file mode 100755
index 00000000000..5bd8ec72a55
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Base.pm
@@ -0,0 +1,5287 @@
+# -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*-
+# vim:ts=8:sw=2:et:sta:sts=2
+package Module::Build::Base;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+BEGIN { require 5.00503 }
+
+use Carp;
+use Cwd ();
+use File::Copy ();
+use File::Find ();
+use File::Path ();
+use File::Basename ();
+use File::Spec 0.82 ();
+use File::Compare ();
+use Module::Build::Dumper ();
+use IO::File ();
+use Text::ParseWords ();
+
+use Module::Build::ModuleInfo;
+use Module::Build::Notes;
+use Module::Build::Config;
+use Module::Build::Version;
+
+
+#################### Constructors ###########################
+sub new {
+ my $self = shift()->_construct(@_);
+
+ $self->{invoked_action} = $self->{action} ||= 'Build_PL';
+ $self->cull_args(@ARGV);
+
+ die "Too early to specify a build action '$self->{action}'. Do 'Build $self->{action}' instead.\n"
+ if $self->{action} && $self->{action} ne 'Build_PL';
+
+ $self->check_manifest;
+ $self->auto_require;
+ if ( $self->check_prereq + $self->check_autofeatures != 2) {
+ $self->log_warn(<<EOF);
+
+ERRORS/WARNINGS FOUND IN PREREQUISITES. You may wish to install the versions
+of the modules indicated above before proceeding with this installation
+
+EOF
+ unless (
+ $self->dist_name eq 'Module-Build' ||
+ $ENV{PERL5_CPANPLUS_IS_RUNNING} || $ENV{PERL5_CPAN_IS_RUNNING}
+ ) {
+ $self->log_warn(
+ "Run 'Build installdeps' to install missing prerequisites.\n\n"
+ );
+ }
+ }
+
+ # record for later use in resume;
+ $self->{properties}{_added_to_INC} = [ $self->_added_to_INC ];
+
+ $self->set_bundle_inc;
+
+ $self->dist_name;
+ $self->dist_version;
+ $self->_guess_module_name unless $self->module_name;
+
+ $self->_find_nested_builds;
+
+ return $self;
+}
+
+sub resume {
+ my $package = shift;
+ my $self = $package->_construct(@_);
+ $self->read_config;
+
+ my @added_earlier = @{ $self->{properties}{_added_to_INC} || [] };
+
+ @INC = ($self->_added_to_INC, @added_earlier, $self->_default_INC);
+
+ # If someone called Module::Build->current() or
+ # Module::Build->new_from_context() and the correct class to use is
+ # actually a *subclass* of Module::Build, we may need to load that
+ # subclass here and re-delegate the resume() method to it.
+ unless ( UNIVERSAL::isa($package, $self->build_class) ) {
+ my $build_class = $self->build_class;
+ my $config_dir = $self->config_dir || '_build';
+ my $build_lib = File::Spec->catdir( $config_dir, 'lib' );
+ unshift( @INC, $build_lib );
+ unless ( $build_class->can('new') ) {
+ eval "require $build_class; 1" or die "Failed to re-load '$build_class': $@";
+ }
+ return $build_class->resume(@_);
+ }
+
+ unless ($self->_perl_is_same($self->{properties}{perl})) {
+ my $perl = $self->find_perl_interpreter;
+ $self->log_warn(" * WARNING: Configuration was initially created with '$self->{properties}{perl}',\n".
+ " but we are now using '$perl'.\n");
+ }
+
+ $self->cull_args(@ARGV);
+
+ unless ($self->allow_mb_mismatch) {
+ my $mb_version = $Module::Build::VERSION;
+ if ( $mb_version ne $self->{properties}{mb_version} ) {
+ $self->log_warn(<<"MISMATCH");
+* WARNING: Configuration was initially created with Module::Build
+ version '$self->{properties}{mb_version}' but we are now using version '$mb_version'.
+ If errors occur, you must re-run the Build.PL or Makefile.PL script.
+MISMATCH
+ }
+ }
+
+ $self->{invoked_action} = $self->{action} ||= 'build';
+
+ return $self;
+}
+
+sub new_from_context {
+ my ($package, %args) = @_;
+
+ $package->run_perl_script('Build.PL',[],[$package->unparse_args(\%args)]);
+ return $package->resume;
+}
+
+sub current {
+ # hmm, wonder what the right thing to do here is
+ local @ARGV;
+ return shift()->resume;
+}
+
+sub _construct {
+ my ($package, %input) = @_;
+
+ my $args = delete $input{args} || {};
+ my $config = delete $input{config} || {};
+
+ my $self = bless {
+ args => {%$args},
+ config => Module::Build::Config->new(values => $config),
+ properties => {
+ base_dir => $package->cwd,
+ mb_version => $Module::Build::VERSION,
+ %input,
+ },
+ phash => {},
+ stash => {}, # temporary caching, not stored in _build
+ }, $package;
+
+ $self->_set_defaults;
+ my ($p, $ph) = ($self->{properties}, $self->{phash});
+
+ foreach (qw(notes config_data features runtime_params cleanup auto_features)) {
+ my $file = File::Spec->catfile($self->config_dir, $_);
+ $ph->{$_} = Module::Build::Notes->new(file => $file);
+ $ph->{$_}->restore if -e $file;
+ if (exists $p->{$_}) {
+ my $vals = delete $p->{$_};
+ while (my ($k, $v) = each %$vals) {
+ $self->$_($k, $v);
+ }
+ }
+ }
+
+ # The following warning could be unnecessary if the user is running
+ # an embedded perl, but there aren't too many of those around, and
+ # embedded perls aren't usually used to install modules, and the
+ # installation process sometimes needs to run external scripts
+ # (e.g. to run tests).
+ $p->{perl} = $self->find_perl_interpreter
+ or $self->log_warn("Warning: Can't locate your perl binary");
+
+ my $blibdir = sub { File::Spec->catdir($p->{blib}, @_) };
+ $p->{bindoc_dirs} ||= [ $blibdir->("script") ];
+ $p->{libdoc_dirs} ||= [ $blibdir->("lib"), $blibdir->("arch") ];
+
+ $p->{dist_author} = [ $p->{dist_author} ] if defined $p->{dist_author} and not ref $p->{dist_author};
+
+ # Synonyms
+ $p->{requires} = delete $p->{prereq} if defined $p->{prereq};
+ $p->{script_files} = delete $p->{scripts} if defined $p->{scripts};
+
+ # Convert to from shell strings to arrays
+ for ('extra_compiler_flags', 'extra_linker_flags') {
+ $p->{$_} = [ $self->split_like_shell($p->{$_}) ] if exists $p->{$_};
+ }
+
+ # Convert to arrays
+ for ('include_dirs') {
+ $p->{$_} = [ $p->{$_} ] if exists $p->{$_} && !ref $p->{$_}
+ }
+
+ $self->add_to_cleanup( @{delete $p->{add_to_cleanup}} )
+ if $p->{add_to_cleanup};
+
+ return $self;
+}
+
+################## End constructors #########################
+
+sub log_info {
+ my $self = shift;
+ print @_ unless(ref($self) and $self->quiet);
+}
+sub log_verbose {
+ my $self = shift;
+ $self->log_info(@_) if(ref($self) and $self->verbose);
+}
+sub log_debug {
+ my $self = shift;
+ print @_ if ref $self && $self->debug;
+}
+
+sub log_warn {
+ # Try to make our call stack invisible
+ shift;
+ if (@_ and $_[-1] !~ /\n$/) {
+ my (undef, $file, $line) = caller();
+ warn @_, " at $file line $line.\n";
+ } else {
+ warn @_;
+ }
+}
+
+
+# install paths must be generated when requested to be sure all changes
+# to config (from various sources) are included
+sub _default_install_paths {
+ my $self = shift;
+ my $c = $self->{config};
+ my $p = {};
+
+ my @libstyle = $c->get('installstyle') ?
+ File::Spec->splitdir($c->get('installstyle')) : qw(lib perl5);
+ my $arch = $c->get('archname');
+ my $version = $c->get('version');
+
+ my $bindoc = $c->get('installman1dir') || undef;
+ my $libdoc = $c->get('installman3dir') || undef;
+
+ my $binhtml = $c->get('installhtml1dir') || $c->get('installhtmldir') || undef;
+ my $libhtml = $c->get('installhtml3dir') || $c->get('installhtmldir') || undef;
+
+ $p->{install_sets} =
+ {
+ core => {
+ lib => $c->get('installprivlib'),
+ arch => $c->get('installarchlib'),
+ bin => $c->get('installbin'),
+ script => $c->get('installscript'),
+ bindoc => $bindoc,
+ libdoc => $libdoc,
+ binhtml => $binhtml,
+ libhtml => $libhtml,
+ },
+ site => {
+ lib => $c->get('installsitelib'),
+ arch => $c->get('installsitearch'),
+ bin => $c->get('installsitebin') || $c->get('installbin'),
+ script => $c->get('installsitescript') ||
+ $c->get('installsitebin') || $c->get('installscript'),
+ bindoc => $c->get('installsiteman1dir') || $bindoc,
+ libdoc => $c->get('installsiteman3dir') || $libdoc,
+ binhtml => $c->get('installsitehtml1dir') || $binhtml,
+ libhtml => $c->get('installsitehtml3dir') || $libhtml,
+ },
+ vendor => {
+ lib => $c->get('installvendorlib'),
+ arch => $c->get('installvendorarch'),
+ bin => $c->get('installvendorbin') || $c->get('installbin'),
+ script => $c->get('installvendorscript') ||
+ $c->get('installvendorbin') || $c->get('installscript'),
+ bindoc => $c->get('installvendorman1dir') || $bindoc,
+ libdoc => $c->get('installvendorman3dir') || $libdoc,
+ binhtml => $c->get('installvendorhtml1dir') || $binhtml,
+ libhtml => $c->get('installvendorhtml3dir') || $libhtml,
+ },
+ };
+
+ $p->{original_prefix} =
+ {
+ core => $c->get('installprefixexp') || $c->get('installprefix') ||
+ $c->get('prefixexp') || $c->get('prefix') || '',
+ site => $c->get('siteprefixexp'),
+ vendor => $c->get('usevendorprefix') ? $c->get('vendorprefixexp') : '',
+ };
+ $p->{original_prefix}{site} ||= $p->{original_prefix}{core};
+
+ # Note: you might be tempted to use $Config{installstyle} here
+ # instead of hard-coding lib/perl5, but that's been considered and
+ # (at least for now) rejected. `perldoc Config` has some wisdom
+ # about it.
+ $p->{install_base_relpaths} =
+ {
+ lib => ['lib', 'perl5'],
+ arch => ['lib', 'perl5', $arch],
+ bin => ['bin'],
+ script => ['bin'],
+ bindoc => ['man', 'man1'],
+ libdoc => ['man', 'man3'],
+ binhtml => ['html'],
+ libhtml => ['html'],
+ };
+
+ $p->{prefix_relpaths} =
+ {
+ core => {
+ lib => [@libstyle],
+ arch => [@libstyle, $version, $arch],
+ bin => ['bin'],
+ script => ['bin'],
+ bindoc => ['man', 'man1'],
+ libdoc => ['man', 'man3'],
+ binhtml => ['html'],
+ libhtml => ['html'],
+ },
+ vendor => {
+ lib => [@libstyle],
+ arch => [@libstyle, $version, $arch],
+ bin => ['bin'],
+ script => ['bin'],
+ bindoc => ['man', 'man1'],
+ libdoc => ['man', 'man3'],
+ binhtml => ['html'],
+ libhtml => ['html'],
+ },
+ site => {
+ lib => [@libstyle, 'site_perl'],
+ arch => [@libstyle, 'site_perl', $version, $arch],
+ bin => ['bin'],
+ script => ['bin'],
+ bindoc => ['man', 'man1'],
+ libdoc => ['man', 'man3'],
+ binhtml => ['html'],
+ libhtml => ['html'],
+ },
+ };
+ return $p
+}
+
+sub _find_nested_builds {
+ my $self = shift;
+ my $r = $self->recurse_into or return;
+
+ my ($file, @r);
+ if (!ref($r) && $r eq 'auto') {
+ local *DH;
+ opendir DH, $self->base_dir
+ or die "Can't scan directory " . $self->base_dir . " for nested builds: $!";
+ while (defined($file = readdir DH)) {
+ my $subdir = File::Spec->catdir( $self->base_dir, $file );
+ next unless -d $subdir;
+ push @r, $subdir if -e File::Spec->catfile( $subdir, 'Build.PL' );
+ }
+ }
+
+ $self->recurse_into(\@r);
+}
+
+sub cwd {
+ return Cwd::cwd();
+}
+
+sub _quote_args {
+ # Returns a string that can become [part of] a command line with
+ # proper quoting so that the subprocess sees this same list of args.
+ my ($self, @args) = @_;
+
+ my @quoted;
+
+ for (@args) {
+ if ( /^[^\s*?!\$<>;\\|'"\[\]\{\}]+$/ ) {
+ # Looks pretty safe
+ push @quoted, $_;
+ } else {
+ # XXX this will obviously have to improve - is there already a
+ # core module lying around that does proper quoting?
+ s/('+)/'"$1"'/g;
+ push @quoted, qq('$_');
+ }
+ }
+
+ return join " ", @quoted;
+}
+
+sub _backticks {
+ my ($self, @cmd) = @_;
+ if ($self->have_forkpipe) {
+ local *FH;
+ my $pid = open *FH, "-|";
+ if ($pid) {
+ return wantarray ? <FH> : join '', <FH>;
+ } else {
+ die "Can't execute @cmd: $!\n" unless defined $pid;
+ exec { $cmd[0] } @cmd;
+ }
+ } else {
+ my $cmd = $self->_quote_args(@cmd);
+ return `$cmd`;
+ }
+}
+
+# Tells us whether the construct open($fh, '-|', @command) is
+# supported. It would probably be better to dynamically sense this.
+sub have_forkpipe { 1 }
+
+# Determine whether a given binary is the same as the perl
+# (configuration) that started this process.
+sub _perl_is_same {
+ my ($self, $perl) = @_;
+
+ my @cmd = ($perl);
+
+ # When run from the perl core, @INC will include the directories
+ # where perl is yet to be installed. We need to reference the
+ # absolute path within the source distribution where it can find
+ # it's Config.pm This also prevents us from picking up a Config.pm
+ # from a different configuration that happens to be already
+ # installed in @INC.
+ if ($ENV{PERL_CORE}) {
+ push @cmd, '-I' . File::Spec->catdir(File::Basename::dirname($perl), 'lib');
+ }
+
+ push @cmd, qw(-MConfig=myconfig -e print -e myconfig);
+ return $self->_backticks(@cmd) eq Config->myconfig;
+}
+
+# cache _discover_perl_interpreter() results
+{
+ my $known_perl;
+ sub find_perl_interpreter {
+ my $self = shift;
+
+ return $known_perl if defined($known_perl);
+ return $known_perl = $self->_discover_perl_interpreter;
+ }
+}
+
+# Returns the absolute path of the perl interpreter used to invoke
+# this process. The path is derived from $^X or $Config{perlpath}. On
+# some platforms $^X contains the complete absolute path of the
+# interpreter, on other it may contain a relative path, or simply
+# 'perl'. This can also vary depending on whether a path was supplied
+# when perl was invoked. Additionally, the value in $^X may omit the
+# executable extension on platforms that use one. It's a fatal error
+# if the interpreter can't be found because it can result in undefined
+# behavior by routines that depend on it (generating errors or
+# invoking the wrong perl.)
+sub _discover_perl_interpreter {
+ my $proto = shift;
+ my $c = ref($proto) ? $proto->{config} : 'Module::Build::Config';
+
+ my $perl = $^X;
+ my $perl_basename = File::Basename::basename($perl);
+
+ my @potential_perls;
+
+ # Try 1, Check $^X for absolute path
+ push( @potential_perls, $perl )
+ if File::Spec->file_name_is_absolute($perl);
+
+ # Try 2, Check $^X for a valid relative path
+ my $abs_perl = File::Spec->rel2abs($perl);
+ push( @potential_perls, $abs_perl );
+
+ # Try 3, Last ditch effort: These two option use hackery to try to locate
+ # a suitable perl. The hack varies depending on whether we are running
+ # from an installed perl or an uninstalled perl in the perl source dist.
+ if ($ENV{PERL_CORE}) {
+
+ # Try 3.A, If we are in a perl source tree, running an uninstalled
+ # perl, we can keep moving up the directory tree until we find our
+ # binary. We wouldn't do this under any other circumstances.
+
+ # CBuilder is also in the core, so it should be available here
+ require ExtUtils::CBuilder;
+ my $perl_src = Cwd::realpath( ExtUtils::CBuilder->perl_src );
+ if ( defined($perl_src) && length($perl_src) ) {
+ my $uninstperl =
+ File::Spec->rel2abs(File::Spec->catfile( $perl_src, $perl_basename ));
+ push( @potential_perls, $uninstperl );
+ }
+
+ } else {
+
+ # Try 3.B, First look in $Config{perlpath}, then search the user's
+ # PATH. We do not want to do either if we are running from an
+ # uninstalled perl in a perl source tree.
+
+ push( @potential_perls, $c->get('perlpath') );
+
+ push( @potential_perls,
+ map File::Spec->catfile($_, $perl_basename), File::Spec->path() );
+ }
+
+ # Now that we've enumerated the potential perls, it's time to test
+ # them to see if any of them match our configuration, returning the
+ # absolute path of the first successful match.
+ my $exe = $c->get('exe_ext');
+ foreach my $thisperl ( @potential_perls ) {
+
+ if (defined $exe) {
+ $thisperl .= $exe unless $thisperl =~ m/$exe$/i;
+ }
+
+ if ( -f $thisperl && $proto->_perl_is_same($thisperl) ) {
+ return $thisperl;
+ }
+ }
+
+ # We've tried all alternatives, and didn't find a perl that matches
+ # our configuration. Throw an exception, and list alternatives we tried.
+ my @paths = map File::Basename::dirname($_), @potential_perls;
+ die "Can't locate the perl binary used to run this script " .
+ "in (@paths)\n";
+}
+
+# Adapted from IPC::Cmd::can_run()
+sub find_command {
+ my ($self, $command) = @_;
+
+ if( File::Spec->file_name_is_absolute($command) ) {
+ return $self->_maybe_command($command);
+
+ } else {
+ for my $dir ( File::Spec->path ) {
+ my $abs = File::Spec->catfile($dir, $command);
+ return $abs if $abs = $self->_maybe_command($abs);
+ }
+ }
+}
+
+# Copied from ExtUtils::MM_Unix::maybe_command
+sub _maybe_command {
+ my($self,$file) = @_;
+ return $file if -x $file && ! -d $file;
+ return;
+}
+
+sub _is_interactive {
+ return -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ; # Pipe?
+}
+
+# NOTE this is a blocking operation if(-t STDIN)
+sub _is_unattended {
+ my $self = shift;
+ return $ENV{PERL_MM_USE_DEFAULT} ||
+ ( !$self->_is_interactive && eof STDIN );
+}
+
+sub _readline {
+ my $self = shift;
+ return undef if $self->_is_unattended;
+
+ my $answer = <STDIN>;
+ chomp $answer if defined $answer;
+ return $answer;
+}
+
+sub prompt {
+ my $self = shift;
+ my $mess = shift
+ or die "prompt() called without a prompt message";
+
+ # use a list to distinguish a default of undef() from no default
+ my @def;
+ @def = (shift) if @_;
+ # use dispdef for output
+ my @dispdef = scalar(@def) ?
+ ('[', (defined($def[0]) ? $def[0] . ' ' : ''), ']') :
+ (' ', '');
+
+ local $|=1;
+ print "$mess ", @dispdef;
+
+ if ( $self->_is_unattended && !@def ) {
+ die <<EOF;
+ERROR: This build seems to be unattended, but there is no default value
+for this question. Aborting.
+EOF
+ }
+
+ my $ans = $self->_readline();
+
+ if ( !defined($ans) # Ctrl-D or unattended
+ or !length($ans) ) { # User hit return
+ print "$dispdef[1]\n";
+ $ans = scalar(@def) ? $def[0] : '';
+ }
+
+ return $ans;
+}
+
+sub y_n {
+ my $self = shift;
+ my ($mess, $def) = @_;
+
+ die "y_n() called without a prompt message" unless $mess;
+ die "Invalid default value: y_n() default must be 'y' or 'n'"
+ if $def && $def !~ /^[yn]/i;
+
+ my $answer;
+ while (1) { # XXX Infinite or a large number followed by an exception ?
+ $answer = $self->prompt(@_);
+ return 1 if $answer =~ /^y/i;
+ return 0 if $answer =~ /^n/i;
+ local $|=1;
+ print "Please answer 'y' or 'n'.\n";
+ }
+}
+
+sub current_action { shift->{action} }
+sub invoked_action { shift->{invoked_action} }
+
+sub notes { shift()->{phash}{notes}->access(@_) }
+sub config_data { shift()->{phash}{config_data}->access(@_) }
+sub runtime_params { shift->{phash}{runtime_params}->read( @_ ? shift : () ) } # Read-only
+sub auto_features { shift()->{phash}{auto_features}->access(@_) }
+
+sub features {
+ my $self = shift;
+ my $ph = $self->{phash};
+
+ if (@_) {
+ my $key = shift;
+ if ($ph->{features}->exists($key)) {
+ return $ph->{features}->access($key, @_);
+ }
+
+ if (my $info = $ph->{auto_features}->access($key)) {
+ my $disabled;
+ for my $type ( @{$self->prereq_action_types} ) {
+ next if $type eq 'description' || $type eq 'recommends' || ! exists $info->{$type};
+ my $prereqs = $info->{$type};
+ for my $modname ( sort keys %$prereqs ) {
+ my $spec = $prereqs->{$modname};
+ my $status = $self->check_installed_status($modname, $spec);
+ if ((!$status->{ok}) xor ($type =~ /conflicts$/)) { return 0; }
+ if ( ! eval "require $modname; 1" ) { return 0; }
+ }
+ }
+ return 1;
+ }
+
+ return $ph->{features}->access($key, @_);
+ }
+
+ # No args - get the auto_features & overlay the regular features
+ my %features;
+ my %auto_features = $ph->{auto_features}->access();
+ while (my ($name, $info) = each %auto_features) {
+ my $failures = $self->prereq_failures($info);
+ my $disabled = grep( /^(?:\w+_)?(?:requires|conflicts)$/,
+ keys %$failures ) ? 1 : 0;
+ $features{$name} = $disabled ? 0 : 1;
+ }
+ %features = (%features, $ph->{features}->access());
+
+ return wantarray ? %features : \%features;
+}
+BEGIN { *feature = \&features } # Alias
+
+sub _mb_feature {
+ my $self = shift;
+
+ if (($self->module_name || '') eq 'Module::Build') {
+ # We're building Module::Build itself, so ...::ConfigData isn't
+ # valid, but $self->features() should be.
+ return $self->feature(@_);
+ } else {
+ require Module::Build::ConfigData;
+ return Module::Build::ConfigData->feature(@_);
+ }
+}
+
+sub _warn_mb_feature_deps {
+ my $self = shift;
+ my $name = shift;
+ $self->log_warn(
+ "The '$name' feature is not available. Please install missing\n" .
+ "feature dependencies and try again.\n".
+ $self->_feature_deps_msg($name) . "\n"
+ );
+}
+
+sub add_build_element {
+ my ($self, $elem) = @_;
+ my $elems = $self->build_elements;
+ push @$elems, $elem unless grep { $_ eq $elem } @$elems;
+}
+
+sub ACTION_config_data {
+ my $self = shift;
+ return unless $self->has_config_data;
+
+ my $module_name = $self->module_name
+ or die "The config_data feature requires that 'module_name' be set";
+ my $notes_name = $module_name . '::ConfigData'; # TODO: Customize name ???
+ my $notes_pm = File::Spec->catfile($self->blib, 'lib', split /::/, "$notes_name.pm");
+
+ return if $self->up_to_date(['Build.PL',
+ $self->config_file('config_data'),
+ $self->config_file('features')
+ ], $notes_pm);
+
+ $self->log_verbose("Writing config notes to $notes_pm\n");
+ File::Path::mkpath(File::Basename::dirname($notes_pm));
+
+ Module::Build::Notes->write_config_data
+ (
+ file => $notes_pm,
+ module => $module_name,
+ config_module => $notes_name,
+ config_data => scalar $self->config_data,
+ feature => scalar $self->{phash}{features}->access(),
+ auto_features => scalar $self->auto_features,
+ );
+}
+
+########################################################################
+{ # enclosing these lexicals -- TODO
+ my %valid_properties = ( __PACKAGE__, {} );
+ my %additive_properties;
+
+ sub _mb_classes {
+ my $class = ref($_[0]) || $_[0];
+ return ($class, $class->mb_parents);
+ }
+
+ sub valid_property {
+ my ($class, $prop) = @_;
+ return grep exists( $valid_properties{$_}{$prop} ), $class->_mb_classes;
+ }
+
+ sub valid_properties {
+ return keys %{ shift->valid_properties_defaults() };
+ }
+
+ sub valid_properties_defaults {
+ my %out;
+ for my $class (reverse shift->_mb_classes) {
+ @out{ keys %{ $valid_properties{$class} } } = map {
+ $_->()
+ } values %{ $valid_properties{$class} };
+ }
+ return \%out;
+ }
+
+ sub array_properties {
+ for (shift->_mb_classes) {
+ return @{$additive_properties{$_}->{ARRAY}}
+ if exists $additive_properties{$_}->{ARRAY};
+ }
+ }
+
+ sub hash_properties {
+ for (shift->_mb_classes) {
+ return @{$additive_properties{$_}->{'HASH'}}
+ if exists $additive_properties{$_}->{'HASH'};
+ }
+ }
+
+ sub add_property {
+ my ($class, $property) = (shift, shift);
+ die "Property '$property' already exists"
+ if $class->valid_property($property);
+ my %p = @_ == 1 ? ( default => shift ) : @_;
+
+ my $type = ref $p{default};
+ $valid_properties{$class}{$property} =
+ $type eq 'CODE' ? $p{default} :
+ $type eq 'HASH' ? sub { return { %{ $p{default} } } } :
+ $type eq 'ARRAY'? sub { return [ @{ $p{default} } ] } :
+ sub { return $p{default} } ;
+
+ push @{$additive_properties{$class}->{$type}}, $property
+ if $type;
+
+ unless ($class->can($property)) {
+ # TODO probably should put these in a util package
+ my $sub = $type eq 'HASH'
+ ? _make_hash_accessor($property, \%p)
+ : _make_accessor($property, \%p);
+ no strict 'refs';
+ *{"$class\::$property"} = $sub;
+ }
+
+ return $class;
+ }
+
+ sub property_error {
+ my $self = shift;
+ die 'ERROR: ', @_;
+ }
+
+ sub _set_defaults {
+ my $self = shift;
+
+ # Set the build class.
+ $self->{properties}{build_class} ||= ref $self;
+
+ # If there was no orig_dir, set to the same as base_dir
+ $self->{properties}{orig_dir} ||= $self->{properties}{base_dir};
+
+ my $defaults = $self->valid_properties_defaults;
+
+ foreach my $prop (keys %$defaults) {
+ $self->{properties}{$prop} = $defaults->{$prop}
+ unless exists $self->{properties}{$prop};
+ }
+
+ # Copy defaults for arrays any arrays.
+ for my $prop ($self->array_properties) {
+ $self->{properties}{$prop} = [@{$defaults->{$prop}}]
+ unless exists $self->{properties}{$prop};
+ }
+ # Copy defaults for arrays any hashes.
+ for my $prop ($self->hash_properties) {
+ $self->{properties}{$prop} = {%{$defaults->{$prop}}}
+ unless exists $self->{properties}{$prop};
+ }
+ }
+
+} # end closure
+########################################################################
+sub _make_hash_accessor {
+ my ($property, $p) = @_;
+ my $check = $p->{check} || sub { 1 };
+
+ return sub {
+ my $self = shift;
+
+ # This is only here to deprecate the historic accident of calling
+ # properties as class methods - I suspect it only happens in our
+ # test suite.
+ unless(ref($self)) {
+ carp("\n$property not a class method (@_)");
+ return;
+ }
+
+ my $x = $self->{properties};
+ return $x->{$property} unless @_;
+
+ my $prop = $x->{$property};
+ if ( defined $_[0] && !ref $_[0] ) {
+ if ( @_ == 1 ) {
+ return exists $prop->{$_[0]} ? $prop->{$_[0]} : undef;
+ } elsif ( @_ % 2 == 0 ) {
+ my %new = (%{ $prop }, @_);
+ local $_ = \%new;
+ $x->{$property} = \%new if $check->($self);
+ return $x->{$property};
+ } else {
+ die "Unexpected arguments for property '$property'\n";
+ }
+ } else {
+ die "Unexpected arguments for property '$property'\n"
+ if defined $_[0] && ref $_[0] ne 'HASH';
+ local $_ = $_[0];
+ $x->{$property} = shift if $check->($self);
+ }
+ };
+}
+########################################################################
+sub _make_accessor {
+ my ($property, $p) = @_;
+ my $check = $p->{check} || sub { 1 };
+
+ return sub {
+ my $self = shift;
+
+ # This is only here to deprecate the historic accident of calling
+ # properties as class methods - I suspect it only happens in our
+ # test suite.
+ unless(ref($self)) {
+ carp("\n$property not a class method (@_)");
+ return;
+ }
+
+ my $x = $self->{properties};
+ return $x->{$property} unless @_;
+ local $_ = $_[0];
+ $x->{$property} = shift if $check->($self);
+ return $x->{$property};
+ };
+}
+########################################################################
+
+# Add the default properties.
+__PACKAGE__->add_property(auto_configure_requires => 1);
+__PACKAGE__->add_property(blib => 'blib');
+__PACKAGE__->add_property(build_class => 'Module::Build');
+__PACKAGE__->add_property(build_elements => [qw(PL support pm xs share_dir pod script)]);
+__PACKAGE__->add_property(build_script => 'Build');
+__PACKAGE__->add_property(build_bat => 0);
+__PACKAGE__->add_property(bundle_inc => []);
+__PACKAGE__->add_property(bundle_inc_preload => []);
+__PACKAGE__->add_property(config_dir => '_build');
+__PACKAGE__->add_property(include_dirs => []);
+__PACKAGE__->add_property(license => 'unknown');
+__PACKAGE__->add_property(metafile => 'META.yml');
+__PACKAGE__->add_property(mymetafile => 'MYMETA.yml');
+__PACKAGE__->add_property(recurse_into => []);
+__PACKAGE__->add_property(use_rcfile => 1);
+__PACKAGE__->add_property(create_packlist => 1);
+__PACKAGE__->add_property(allow_mb_mismatch => 0);
+__PACKAGE__->add_property(config => undef);
+__PACKAGE__->add_property(test_file_exts => ['.t']);
+__PACKAGE__->add_property(use_tap_harness => 0);
+__PACKAGE__->add_property(cpan_client => 'cpan');
+__PACKAGE__->add_property(tap_harness_args => {});
+__PACKAGE__->add_property(
+ 'installdirs',
+ default => 'site',
+ check => sub {
+ return 1 if /^(core|site|vendor)$/;
+ return shift->property_error(
+ $_ eq 'perl'
+ ? 'Perhaps you meant installdirs to be "core" rather than "perl"?'
+ : 'installdirs must be one of "core", "site", or "vendor"'
+ );
+ return shift->property_error("Perhaps you meant 'core'?") if $_ eq 'perl';
+ return 0;
+ },
+);
+
+{
+ my $Is_ActivePerl = eval {require ActivePerl::DocTools};
+ __PACKAGE__->add_property(html_css => $Is_ActivePerl ? 'Active.css' : '');
+}
+
+{
+ my @prereq_action_types = qw(requires build_requires conflicts recommends);
+ foreach my $type (@prereq_action_types) {
+ __PACKAGE__->add_property($type => {});
+ }
+ __PACKAGE__->add_property(prereq_action_types => \@prereq_action_types);
+}
+
+__PACKAGE__->add_property($_ => {}) for qw(
+ get_options
+ install_base_relpaths
+ install_path
+ install_sets
+ meta_add
+ meta_merge
+ original_prefix
+ prefix_relpaths
+ configure_requires
+);
+
+__PACKAGE__->add_property($_) for qw(
+ PL_files
+ autosplit
+ base_dir
+ bindoc_dirs
+ c_source
+ create_license
+ create_makefile_pl
+ create_readme
+ debugger
+ destdir
+ dist_abstract
+ dist_author
+ dist_name
+ dist_version
+ dist_version_from
+ extra_compiler_flags
+ extra_linker_flags
+ has_config_data
+ install_base
+ libdoc_dirs
+ magic_number
+ mb_version
+ module_name
+ needs_compiler
+ orig_dir
+ perl
+ pm_files
+ pod_files
+ pollute
+ prefix
+ program_name
+ quiet
+ recursive_test_files
+ script_files
+ scripts
+ share_dir
+ sign
+ test_files
+ verbose
+ debug
+ xs_files
+);
+
+sub config {
+ my $self = shift;
+ my $c = ref($self) ? $self->{config} : 'Module::Build::Config';
+ return $c->all_config unless @_;
+
+ my $key = shift;
+ return $c->get($key) unless @_;
+
+ my $val = shift;
+ return $c->set($key => $val);
+}
+
+sub mb_parents {
+ # Code borrowed from Class::ISA.
+ my @in_stack = (shift);
+ my %seen = ($in_stack[0] => 1);
+
+ my ($current, @out);
+ while (@in_stack) {
+ next unless defined($current = shift @in_stack)
+ && $current->isa('Module::Build::Base');
+ push @out, $current;
+ next if $current eq 'Module::Build::Base';
+ no strict 'refs';
+ unshift @in_stack,
+ map {
+ my $c = $_; # copy, to avoid being destructive
+ substr($c,0,2) = "main::" if substr($c,0,2) eq '::';
+ # Canonize the :: -> main::, ::foo -> main::foo thing.
+ # Should I ever canonize the Foo'Bar = Foo::Bar thing?
+ $seen{$c}++ ? () : $c;
+ } @{"$current\::ISA"};
+
+ # I.e., if this class has any parents (at least, ones I've never seen
+ # before), push them, in order, onto the stack of classes I need to
+ # explore.
+ }
+ shift @out;
+ return @out;
+}
+
+sub extra_linker_flags { shift->_list_accessor('extra_linker_flags', @_) }
+sub extra_compiler_flags { shift->_list_accessor('extra_compiler_flags', @_) }
+
+sub _list_accessor {
+ (my $self, local $_) = (shift, shift);
+ my $p = $self->{properties};
+ $p->{$_} = [@_] if @_;
+ $p->{$_} = [] unless exists $p->{$_};
+ return ref($p->{$_}) ? $p->{$_} : [$p->{$_}];
+}
+
+# XXX Problem - if Module::Build is loaded from a different directory,
+# it'll look for (and perhaps destroy/create) a _build directory.
+sub subclass {
+ my ($pack, %opts) = @_;
+
+ my $build_dir = '_build'; # XXX The _build directory is ostensibly settable by the user. Shouldn't hard-code here.
+ $pack->delete_filetree($build_dir) if -e $build_dir;
+
+ die "Must provide 'code' or 'class' option to subclass()\n"
+ unless $opts{code} or $opts{class};
+
+ $opts{code} ||= '';
+ $opts{class} ||= 'MyModuleBuilder';
+
+ my $filename = File::Spec->catfile($build_dir, 'lib', split '::', $opts{class}) . '.pm';
+ my $filedir = File::Basename::dirname($filename);
+ $pack->log_verbose("Creating custom builder $filename in $filedir\n");
+
+ File::Path::mkpath($filedir);
+ die "Can't create directory $filedir: $!" unless -d $filedir;
+
+ my $fh = IO::File->new("> $filename") or die "Can't create $filename: $!";
+ print $fh <<EOF;
+package $opts{class};
+use $pack;
+\@ISA = qw($pack);
+$opts{code}
+1;
+EOF
+ close $fh;
+
+ unshift @INC, File::Spec->catdir(File::Spec->rel2abs($build_dir), 'lib');
+ eval "use $opts{class}";
+ die $@ if $@;
+
+ return $opts{class};
+}
+
+sub _guess_module_name {
+ my $self = shift;
+ my $p = $self->{properties};
+ return if $p->{module_name};
+ if ( $p->{dist_version_from} && -e $p->{dist_version_from} ) {
+ my $mi = Module::Build::ModuleInfo->new_from_file($self->dist_version_from);
+ $p->{module_name} = $mi->name;
+ }
+ else {
+ my $mod_path = my $mod_name = $p->{dist_name};
+ $mod_name =~ s{-}{::}g;
+ $mod_path =~ s{-}{/}g;
+ $mod_path .= ".pm";
+ if ( -e $mod_path || -e "lib/$mod_path" ) {
+ $p->{module_name} = $mod_name;
+ }
+ else {
+ $self->log_warn( << 'END_WARN' );
+No 'module_name' was provided and it could not be inferred
+from other properties. This will prevent a packlist from
+being written for this file. Please set either 'module_name'
+or 'dist_version_from' in Build.PL.
+END_WARN
+ }
+ }
+}
+
+sub dist_name {
+ my $self = shift;
+ my $p = $self->{properties};
+ return $p->{dist_name} if defined $p->{dist_name};
+
+ die "Can't determine distribution name, must supply either 'dist_name' or 'module_name' parameter"
+ unless $self->module_name;
+
+ ($p->{dist_name} = $self->module_name) =~ s/::/-/g;
+
+ return $p->{dist_name};
+}
+
+sub dist_version_from {
+ my ($self) = @_;
+ my $p = $self->{properties};
+ if ($self->module_name) {
+ $p->{dist_version_from} ||=
+ join( '/', 'lib', split(/::/, $self->module_name) ) . '.pm';
+ }
+ return $p->{dist_version_from} || undef;
+}
+
+sub dist_version {
+ my ($self) = @_;
+ my $p = $self->{properties};
+
+ return $p->{dist_version} if defined $p->{dist_version};
+
+ if ( my $dist_version_from = $self->dist_version_from ) {
+ my $version_from = File::Spec->catfile( split( qr{/}, $dist_version_from ) );
+ my $pm_info = Module::Build::ModuleInfo->new_from_file( $version_from )
+ or die "Can't find file $version_from to determine version";
+ $p->{dist_version} = $self->normalize_version( $pm_info->version() );
+ }
+
+ die ("Can't determine distribution version, must supply either 'dist_version',\n".
+ "'dist_version_from', or 'module_name' parameter")
+ unless defined $p->{dist_version};
+
+ return $p->{dist_version};
+}
+
+sub dist_author { shift->_pod_parse('author') }
+sub dist_abstract { shift->_pod_parse('abstract') }
+
+sub _pod_parse {
+ my ($self, $part) = @_;
+ my $p = $self->{properties};
+ my $member = "dist_$part";
+ return $p->{$member} if defined $p->{$member};
+
+ my $docfile = $self->_main_docfile
+ or return;
+ my $fh = IO::File->new($docfile)
+ or return;
+
+ require Module::Build::PodParser;
+ my $parser = Module::Build::PodParser->new(fh => $fh);
+ my $method = "get_$part";
+ return $p->{$member} = $parser->$method();
+}
+
+sub version_from_file { # Method provided for backwards compatibility
+ return Module::Build::ModuleInfo->new_from_file($_[1])->version();
+}
+
+sub find_module_by_name { # Method provided for backwards compatibility
+ return Module::Build::ModuleInfo->find_module_by_name(@_[1,2]);
+}
+
+sub add_to_cleanup {
+ my $self = shift;
+ my %files = map {$self->localize_file_path($_), 1} @_;
+ $self->{phash}{cleanup}->write(\%files);
+}
+
+sub cleanup {
+ my $self = shift;
+ my $all = $self->{phash}{cleanup}->read;
+ return keys %$all;
+}
+
+sub config_file {
+ my $self = shift;
+ return unless -d $self->config_dir;
+ return File::Spec->catfile($self->config_dir, @_);
+}
+
+sub read_config {
+ my ($self) = @_;
+
+ my $file = $self->config_file('build_params')
+ or die "Can't find 'build_params' in " . $self->config_dir;
+ my $fh = IO::File->new($file) or die "Can't read '$file': $!";
+ my $ref = eval do {local $/; <$fh>};
+ die if $@;
+ my $c;
+ ($self->{args}, $c, $self->{properties}) = @$ref;
+ $self->{config} = Module::Build::Config->new(values => $c);
+ close $fh;
+}
+
+sub has_config_data {
+ my $self = shift;
+ return scalar grep $self->{phash}{$_}->has_data(), qw(config_data features auto_features);
+}
+
+sub _write_data {
+ my ($self, $filename, $data) = @_;
+
+ my $file = $self->config_file($filename);
+ my $fh = IO::File->new("> $file") or die "Can't create '$file': $!";
+ unless (ref($data)) { # e.g. magicnum
+ print $fh $data;
+ return;
+ }
+
+ print {$fh} Module::Build::Dumper->_data_dump($data);
+}
+
+sub write_config {
+ my ($self) = @_;
+
+ File::Path::mkpath($self->{properties}{config_dir});
+ -d $self->{properties}{config_dir} or die "Can't mkdir $self->{properties}{config_dir}: $!";
+
+ my @items = @{ $self->prereq_action_types };
+ $self->_write_data('prereqs', { map { $_, $self->$_() } @items });
+ $self->_write_data('build_params', [$self->{args}, $self->{config}->values_set, $self->{properties}]);
+
+ # Set a new magic number and write it to a file
+ $self->_write_data('magicnum', $self->magic_number(int rand 1_000_000));
+
+ $self->{phash}{$_}->write() foreach qw(notes cleanup features auto_features config_data runtime_params);
+}
+
+{
+ # packfile map -- keys are guts of regular expressions; If they match,
+ # values are module names corresponding to the packlist
+ my %packlist_map = (
+ '^File::Spec' => 'Cwd',
+ '^Devel::AssertOS' => 'Devel::CheckOS',
+ );
+
+ sub _find_packlist {
+ my ($self, $inst, $mod) = @_;
+ my $lookup = $mod;
+ my $packlist = eval { $inst->packlist($lookup) };
+ if ( ! $packlist ) {
+ # try from packlist_map
+ while ( my ($re, $new_mod) = each %packlist_map ) {
+ if ( $mod =~ qr/$re/ ) {
+ $lookup = $new_mod;
+ $packlist = eval { $inst->packlist($lookup) };
+ last;
+ }
+ }
+ }
+ return $packlist ? $lookup : undef;
+ }
+
+ sub set_bundle_inc {
+ my $self = shift;
+
+ my $bundle_inc = $self->{properties}{bundle_inc};
+ my $bundle_inc_preload = $self->{properties}{bundle_inc_preload};
+ # We're in author mode if inc::latest is loaded, but not from cwd
+ return unless inc::latest->can('loaded_modules');
+ require ExtUtils::Installed;
+ # ExtUtils::Installed is buggy about finding additions to default @INC
+ my $inst = eval { ExtUtils::Installed->new(extra_libs => [@INC]) };
+ if ($@) {
+ $self->log_warn( << "EUI_ERROR" );
+Bundling in inc/ is disabled because ExtUtils::Installed could not
+create a list of your installed modules. Here is the error:
+$@
+EUI_ERROR
+ return;
+ }
+ my @bundle_list = map { [ $_, 0 ] } inc::latest->loaded_modules;
+
+ # XXX TODO: Need to get ordering of prerequisites correct so they are
+ # are loaded in the right order. Use an actual tree?!
+
+ while( @bundle_list ) {
+ my ($mod, $prereq) = @{ shift @bundle_list };
+
+ # XXX TODO: Append prereqs to list
+ # skip if core or already in bundle or preload lists
+ # push @bundle_list, [$_, 1] for prereqs()
+
+ # Locate packlist for bundling
+ my $lookup = $self->_find_packlist($inst,$mod);
+ if ( ! $lookup ) {
+ # XXX Really needs a more helpful error message here
+ die << "NO_PACKLIST";
+Could not find a packlist for '$mod'. If it's a core module, try
+force installing it from CPAN.
+NO_PACKLIST
+ }
+ else {
+ push @{ $prereq ? $bundle_inc_preload : $bundle_inc }, $lookup;
+ }
+ }
+ } # sub check_bundling
+}
+
+sub check_autofeatures {
+ my ($self) = @_;
+ my $features = $self->auto_features;
+
+ return 1 unless %$features;
+
+ # TODO refactor into ::Util
+ my $longest = sub {
+ my @str = @_ or croak("no strings given");
+
+ my @len = map({length($_)} @str);
+ my $max = 0;
+ my $longest;
+ for my $i (0..$#len) {
+ ($max, $longest) = ($len[$i], $str[$i]) if($len[$i] > $max);
+ }
+ return($longest);
+ };
+ my $max_name_len = length($longest->(keys %$features));
+
+ my ($num_disabled, $log_text) = (0, "\nChecking optional features...\n");
+ for my $name ( sort keys %$features ) {
+ $log_text .= $self->_feature_deps_msg($name, $max_name_len);
+ }
+
+ $num_disabled = () = $log_text =~ /disabled/g;
+
+ # warn user if features disabled
+ if ( $num_disabled ) {
+ $self->log_warn( $log_text );
+ return 0;
+ }
+ else {
+ $self->log_verbose( $log_text );
+ return 1;
+ }
+}
+
+sub _feature_deps_msg {
+ my ($self, $name, $max_name_len) = @_;
+ $max_name_len ||= length $name;
+ my $features = $self->auto_features;
+ my $info = $features->{$name};
+ my $feature_text = "$name" . '.' x ($max_name_len - length($name) + 4);
+
+ my ($log_text, $disabled) = ('','');
+ if ( my $failures = $self->prereq_failures($info) ) {
+ $disabled = grep( /^(?:\w+_)?(?:requires|conflicts)$/,
+ keys %$failures ) ? 1 : 0;
+ $feature_text .= $disabled ? "disabled\n" : "enabled\n";
+
+ for my $type ( @{ $self->prereq_action_types } ) {
+ next unless exists $failures->{$type};
+ $feature_text .= " $type:\n";
+ my $prereqs = $failures->{$type};
+ for my $module ( sort keys %$prereqs ) {
+ my $status = $prereqs->{$module};
+ my $required =
+ ($type =~ /^(?:\w+_)?(?:requires|conflicts)$/) ? 1 : 0;
+ my $prefix = ($required) ? '!' : '*';
+ $feature_text .= " $prefix $status->{message}\n";
+ }
+ }
+ } else {
+ $feature_text .= "enabled\n";
+ }
+ $log_text .= $feature_text if $disabled || $self->verbose;
+ return $log_text;
+}
+
+# Automatically detect and add prerequisites based on configuration
+sub auto_require {
+ my ($self) = @_;
+ my $p = $self->{properties};
+
+ # add current Module::Build to configure_requires if there
+ # isn't one already specified (but not ourself, so we're not circular)
+ if ( $self->dist_name ne 'Module-Build'
+ && $self->auto_configure_requires
+ && ! exists $p->{configure_requires}{'Module::Build'}
+ ) {
+ (my $ver = $VERSION) =~ s/^(\d+\.\d\d).*$/$1/; # last major release only
+ $self->_add_prereq('configure_requires', 'Module::Build', $ver);
+ }
+
+ # if we're in author mode, add inc::latest modules to
+ # configure_requires if not already set. If we're not in author mode
+ # then configure_requires will have been satisfied, or we'll just
+ # live with what we've bundled
+ if ( inc::latest->can('loaded_module') ) {
+ for my $mod ( inc::latest->loaded_modules ) {
+ next if exists $p->{configure_requires}{$mod};
+ $self->_add_prereq('configure_requires', $mod, $mod->VERSION);
+ }
+ }
+
+ # If needs_compiler is not explictly set, automatically set it
+ # If set, we need ExtUtils::CBuilder (and a compiler)
+ my $xs_files = $self->find_xs_files;
+ if ( ! defined $p->{needs_compiler} ) {
+ $self->needs_compiler( keys %$xs_files || defined $self->c_source );
+ }
+ if ($self->needs_compiler) {
+ $self->_add_prereq('build_requires', 'ExtUtils::CBuilder', 0);
+ if ( ! $self->have_c_compiler ) {
+ $self->log_warn(<<'EOM');
+Warning: ExtUtils::CBuilder not installed or no compiler detected
+Proceeding with configuration, but compilation may fail during Build
+
+EOM
+ }
+ }
+
+ # If using share_dir, require File::ShareDir
+ if ( $self->share_dir ) {
+ $self->_add_prereq( 'requires', 'File::ShareDir', '1.00' );
+ }
+
+ return;
+}
+
+sub _add_prereq {
+ my ($self, $type, $module, $version) = @_;
+ my $p = $self->{properties};
+ $version = 0 unless defined $version;
+ if ( exists $p->{$type}{$module} ) {
+ return if $self->compare_versions( $version, '<=', $p->{$type}{$module} );
+ }
+ $self->log_verbose("Adding to $type\: $module => $version\n");
+ $p->{$type}{$module} = $version;
+ return 1;
+}
+
+sub prereq_failures {
+ my ($self, $info) = @_;
+
+ my @types = @{ $self->prereq_action_types };
+ $info ||= {map {$_, $self->$_()} @types};
+
+ my $out;
+
+ foreach my $type (@types) {
+ my $prereqs = $info->{$type};
+ for my $modname ( keys %$prereqs ) {
+ my $spec = $prereqs->{$modname};
+ my $status = $self->check_installed_status($modname, $spec);
+
+ if ($type =~ /^(?:\w+_)?conflicts$/) {
+ next if !$status->{ok};
+ $status->{conflicts} = delete $status->{need};
+ $status->{message} = "$modname ($status->{have}) conflicts with this distribution";
+
+ } elsif ($type =~ /^(?:\w+_)?recommends$/) {
+ next if $status->{ok};
+ $status->{message} = (!ref($status->{have}) && $status->{have} eq '<none>'
+ ? "$modname is not installed"
+ : "$modname ($status->{have}) is installed, but we prefer to have $spec");
+ } else {
+ next if $status->{ok};
+ }
+
+ $out->{$type}{$modname} = $status;
+ }
+ }
+
+ return $out;
+}
+
+# returns a hash of defined prerequisites; i.e. only prereq types with values
+sub _enum_prereqs {
+ my $self = shift;
+ my %prereqs;
+ foreach my $type ( @{ $self->prereq_action_types } ) {
+ if ( $self->can( $type ) ) {
+ my $prereq = $self->$type() || {};
+ $prereqs{$type} = $prereq if %$prereq;
+ }
+ }
+ return \%prereqs;
+}
+
+sub check_prereq {
+ my $self = shift;
+
+ # Check to see if there are any prereqs to check
+ my $info = $self->_enum_prereqs;
+ return 1 unless $info;
+
+ my $log_text = "Checking prerequisites...\n";
+
+ my $failures = $self->prereq_failures($info);
+
+ if ( $failures ) {
+ $self->log_warn($log_text);
+ for my $type ( @{ $self->prereq_action_types } ) {
+ my $prereqs = $failures->{$type};
+ $self->log_warn(" ${type}:\n") if keys %$prereqs;
+ for my $module ( sort keys %$prereqs ) {
+ my $status = $prereqs->{$module};
+ my $prefix = ($type =~ /^(?:\w+_)?recommends$/) ? "* " : "! ";
+ $self->log_warn(" $prefix $status->{message}\n");
+ }
+ }
+ return 0;
+ } else {
+ $self->log_verbose($log_text . "Looks good\n\n");
+ return 1;
+ }
+}
+
+sub perl_version {
+ my ($self) = @_;
+ # Check the current perl interpreter
+ # It's much more convenient to use $] here than $^V, but 'man
+ # perlvar' says I'm not supposed to. Bloody tyrant.
+ return $^V ? $self->perl_version_to_float(sprintf "%vd", $^V) : $];
+}
+
+sub perl_version_to_float {
+ my ($self, $version) = @_;
+ return $version if grep( /\./, $version ) < 2;
+ $version =~ s/\./../;
+ $version =~ s/\.(\d+)/sprintf '%03d', $1/eg;
+ return $version;
+}
+
+sub _parse_conditions {
+ my ($self, $spec) = @_;
+
+ if ($spec =~ /^\s*([\w.]+)\s*$/) { # A plain number, maybe with dots, letters, and underscores
+ return (">= $spec");
+ } else {
+ return split /\s*,\s*/, $spec;
+ }
+}
+
+sub check_installed_status {
+ my ($self, $modname, $spec) = @_;
+ my %status = (need => $spec);
+
+ if ($modname eq 'perl') {
+ $status{have} = $self->perl_version;
+
+ } elsif (eval { no strict; $status{have} = ${"${modname}::VERSION"} }) {
+ # Don't try to load if it's already loaded
+
+ } else {
+ my $pm_info = Module::Build::ModuleInfo->new_from_module( $modname );
+ unless (defined( $pm_info )) {
+ @status{ qw(have message) } = ('<none>', "$modname is not installed");
+ return \%status;
+ }
+
+ $status{have} = $pm_info->version();
+ if ($spec and !defined($status{have})) {
+ @status{ qw(have message) } = (undef, "Couldn't find a \$VERSION in prerequisite $modname");
+ return \%status;
+ }
+ }
+
+ my @conditions = $self->_parse_conditions($spec);
+
+ foreach (@conditions) {
+ my ($op, $version) = /^\s* (<=?|>=?|==|!=) \s* ([\w.]+) \s*$/x
+ or die "Invalid prerequisite condition '$_' for $modname";
+
+ $version = $self->perl_version_to_float($version)
+ if $modname eq 'perl';
+
+ next if $op eq '>=' and !$version; # Module doesn't have to actually define a $VERSION
+
+ unless ($self->compare_versions( $status{have}, $op, $version )) {
+ $status{message} = "$modname ($status{have}) is installed, but we need version $op $version";
+ return \%status;
+ }
+ }
+
+ $status{ok} = 1;
+ return \%status;
+}
+
+sub compare_versions {
+ my $self = shift;
+ my ($v1, $op, $v2) = @_;
+ $v1 = Module::Build::Version->new($v1)
+ unless UNIVERSAL::isa($v1,'Module::Build::Version');
+
+ my $eval_str = "\$v1 $op \$v2";
+ my $result = eval $eval_str;
+ $self->log_warn("error comparing versions: '$eval_str' $@") if $@;
+
+ return $result;
+}
+
+# I wish I could set $! to a string, but I can't, so I use $@
+sub check_installed_version {
+ my ($self, $modname, $spec) = @_;
+
+ my $status = $self->check_installed_status($modname, $spec);
+
+ if ($status->{ok}) {
+ return $status->{have} if $status->{have} and "$status->{have}" ne '<none>';
+ return '0 but true';
+ }
+
+ $@ = $status->{message};
+ return 0;
+}
+
+sub make_executable {
+ # Perl's chmod() is mapped to useful things on various non-Unix
+ # platforms, so we use it in the base class even though it looks
+ # Unixish.
+
+ my $self = shift;
+ foreach (@_) {
+ my $current_mode = (stat $_)[2];
+ chmod $current_mode | oct(111), $_;
+ }
+}
+
+sub is_executable {
+ # We assume this does the right thing on generic platforms, though
+ # we do some other more specific stuff on Unixish platforms.
+ my ($self, $file) = @_;
+ return -x $file;
+}
+
+sub _startperl { shift()->config('startperl') }
+
+# Return any directories in @INC which are not in the default @INC for
+# this perl. For example, stuff passed in with -I or loaded with "use lib".
+sub _added_to_INC {
+ my $self = shift;
+
+ my %seen;
+ $seen{$_}++ foreach $self->_default_INC;
+ return grep !$seen{$_}++, @INC;
+}
+
+# Determine the default @INC for this Perl
+{
+ my @default_inc; # Memoize
+ sub _default_INC {
+ my $self = shift;
+ return @default_inc if @default_inc;
+
+ local $ENV{PERL5LIB}; # this is not considered part of the default.
+
+ my $perl = ref($self) ? $self->perl : $self->find_perl_interpreter;
+
+ my @inc = $self->_backticks($perl, '-le', 'print for @INC');
+ chomp @inc;
+
+ return @default_inc = @inc;
+ }
+}
+
+sub print_build_script {
+ my ($self, $fh) = @_;
+
+ my $build_package = $self->build_class;
+
+ my $closedata="";
+
+ my %q = map {$_, $self->$_()} qw(config_dir base_dir);
+
+ my $case_tolerant = 0+(File::Spec->can('case_tolerant')
+ && File::Spec->case_tolerant);
+ $q{base_dir} = uc $q{base_dir} if $case_tolerant;
+ $q{base_dir} = Win32::GetShortPathName($q{base_dir}) if $self->is_windowsish;
+
+ $q{magic_numfile} = $self->config_file('magicnum');
+
+ my @myINC = $self->_added_to_INC;
+ for (@myINC, values %q) {
+ $_ = File::Spec->canonpath( $_ );
+ s/([\\\'])/\\$1/g;
+ }
+
+ my $quoted_INC = join ",\n", map " '$_'", @myINC;
+ my $shebang = $self->_startperl;
+ my $magic_number = $self->magic_number;
+
+ print $fh <<EOF;
+$shebang
+
+use strict;
+use Cwd;
+use File::Basename;
+use File::Spec;
+
+sub magic_number_matches {
+ return 0 unless -e '$q{magic_numfile}';
+ local *FH;
+ open FH, '$q{magic_numfile}' or return 0;
+ my \$filenum = <FH>;
+ close FH;
+ return \$filenum == $magic_number;
+}
+
+my \$progname;
+my \$orig_dir;
+BEGIN {
+ \$^W = 1; # Use warnings
+ \$progname = basename(\$0);
+ \$orig_dir = Cwd::cwd();
+ my \$base_dir = '$q{base_dir}';
+ if (!magic_number_matches()) {
+ unless (chdir(\$base_dir)) {
+ die ("Couldn't chdir(\$base_dir), aborting\\n");
+ }
+ unless (magic_number_matches()) {
+ die ("Configuration seems to be out of date, please re-run 'perl Build.PL' again.\\n");
+ }
+ }
+ unshift \@INC,
+ (
+$quoted_INC
+ );
+}
+
+close(*DATA) unless eof(*DATA); # ensure no open handles to this script
+
+use $build_package;
+
+# Some platforms have problems setting \$^X in shebang contexts, fix it up here
+\$^X = Module::Build->find_perl_interpreter;
+
+if (-e 'Build.PL' and not $build_package->up_to_date('Build.PL', \$progname)) {
+ warn "Warning: Build.PL has been altered. You may need to run 'perl Build.PL' again.\\n";
+}
+
+# This should have just enough arguments to be able to bootstrap the rest.
+my \$build = $build_package->resume (
+ properties => {
+ config_dir => '$q{config_dir}',
+ orig_dir => \$orig_dir,
+ },
+);
+
+\$build->dispatch;
+EOF
+}
+
+sub create_mymeta {
+ my ($self) = @_;
+ my $mymetafile = $self->mymetafile;
+ my $metafile = $self->metafile;
+
+ # cleanup
+ if ( $self->delete_filetree($mymetafile) ) {
+ $self->log_verbose("Removed previous '$mymetafile'\n");
+ }
+ $self->log_info("Creating new '$mymetafile' with configuration results\n");
+
+ # use old meta and update prereqs, if possible
+ my $mymeta;
+ if ( -f $metafile ) {
+ $mymeta = eval { $self->read_metafile( $self->metafile ) };
+ }
+ # if we read META OK, just update it
+ if ( defined $mymeta ) {
+ my $prereqs = $self->_normalize_prereqs;
+ for my $t ( keys %$prereqs ) {
+ $mymeta->{$t} = $prereqs->{$t};
+ }
+ }
+ # but generate from scratch, ignoring errors if META doesn't exist
+ else {
+ $mymeta = $self->get_metadata( fatal => 0 );
+ }
+
+ # MYMETA is always static
+ $mymeta->{dynamic_config} = 0;
+ # Note which M::B created it
+ $mymeta->{generated_by} = "Module::Build version $Module::Build::VERSION";
+
+ $self->write_metafile( $mymetafile, $mymeta );
+ return 1;
+}
+
+sub create_build_script {
+ my ($self) = @_;
+
+ $self->write_config;
+ $self->create_mymeta;
+
+ # Create Build
+ my ($build_script, $dist_name, $dist_version)
+ = map $self->$_(), qw(build_script dist_name dist_version);
+
+ if ( $self->delete_filetree($build_script) ) {
+ $self->log_verbose("Removed previous script '$build_script'\n");
+ }
+
+ $self->log_info("Creating new '$build_script' script for ",
+ "'$dist_name' version '$dist_version'\n");
+ my $fh = IO::File->new(">$build_script") or die "Can't create '$build_script': $!";
+ $self->print_build_script($fh);
+ close $fh;
+
+ $self->make_executable($build_script);
+
+ return 1;
+}
+
+sub check_manifest {
+ my $self = shift;
+ return unless -e 'MANIFEST';
+
+ # Stolen nearly verbatim from MakeMaker. But ExtUtils::Manifest
+ # could easily be re-written into a modern Perl dialect.
+
+ require ExtUtils::Manifest; # ExtUtils::Manifest is not warnings clean.
+ local ($^W, $ExtUtils::Manifest::Quiet) = (0,1);
+
+ $self->log_verbose("Checking whether your kit is complete...\n");
+ if (my @missed = ExtUtils::Manifest::manicheck()) {
+ $self->log_warn("WARNING: the following files are missing in your kit:\n",
+ "\t", join("\n\t", @missed), "\n",
+ "Please inform the author.\n\n");
+ } else {
+ $self->log_verbose("Looks good\n\n");
+ }
+}
+
+sub dispatch {
+ my $self = shift;
+ local $self->{_completed_actions} = {};
+
+ if (@_) {
+ my ($action, %p) = @_;
+ my $args = $p{args} ? delete($p{args}) : {};
+
+ local $self->{invoked_action} = $action;
+ local $self->{args} = {%{$self->{args}}, %$args};
+ local $self->{properties} = {%{$self->{properties}}, %p};
+ return $self->_call_action($action);
+ }
+
+ die "No build action specified" unless $self->{action};
+ local $self->{invoked_action} = $self->{action};
+ $self->_call_action($self->{action});
+}
+
+sub _call_action {
+ my ($self, $action) = @_;
+
+ return if $self->{_completed_actions}{$action}++;
+
+ local $self->{action} = $action;
+ my $method = $self->can_action( $action );
+ die "No action '$action' defined, try running the 'help' action.\n" unless $method;
+ $self->log_debug("Starting ACTION_$action\n");
+ my $rc = $self->$method();
+ $self->log_debug("Finished ACTION_$action\n");
+ return $rc;
+}
+
+sub can_action {
+ my ($self, $action) = @_;
+ return $self->can( "ACTION_$action" );
+}
+
+# cuts the user-specified options out of the command-line args
+sub cull_options {
+ my $self = shift;
+ my (@argv) = @_;
+
+ # XXX is it even valid to call this as a class method?
+ return({}, @argv) unless(ref($self)); # no object
+
+ my $specs = $self->get_options;
+ return({}, @argv) unless($specs and %$specs); # no user options
+
+ require Getopt::Long;
+ # XXX Should we let Getopt::Long handle M::B's options? That would
+ # be easy-ish to add to @specs right here, but wouldn't handle options
+ # passed without "--" as M::B currently allows. We might be able to
+ # get around this by setting the "prefix_pattern" Configure option.
+ my @specs;
+ my $args = {};
+ # Construct the specifications for GetOptions.
+ while (my ($k, $v) = each %$specs) {
+ # Throw an error if specs conflict with our own.
+ die "Option specification '$k' conflicts with a " . ref $self
+ . " option of the same name"
+ if $self->valid_property($k);
+ push @specs, $k . (defined $v->{type} ? $v->{type} : '');
+ push @specs, $v->{store} if exists $v->{store};
+ $args->{$k} = $v->{default} if exists $v->{default};
+ }
+
+ local @ARGV = @argv; # No other way to dupe Getopt::Long
+
+ # Get the options values and return them.
+ # XXX Add option to allow users to set options?
+ if ( @specs ) {
+ Getopt::Long::Configure('pass_through');
+ Getopt::Long::GetOptions($args, @specs);
+ }
+
+ return $args, @ARGV;
+}
+
+sub unparse_args {
+ my ($self, $args) = @_;
+ my @out;
+ while (my ($k, $v) = each %$args) {
+ push @out, (UNIVERSAL::isa($v, 'HASH') ? map {+"--$k", "$_=$v->{$_}"} keys %$v :
+ UNIVERSAL::isa($v, 'ARRAY') ? map {+"--$k", $_} @$v :
+ ("--$k", $v));
+ }
+ return @out;
+}
+
+sub args {
+ my $self = shift;
+ return wantarray ? %{ $self->{args} } : $self->{args} unless @_;
+ my $key = shift;
+ $self->{args}{$key} = shift if @_;
+ return $self->{args}{$key};
+}
+
+# allows select parameters (with underscores) to be spoken with dashes
+# when used as command-line options
+sub _translate_option {
+ my $self = shift;
+ my $opt = shift;
+
+ (my $tr_opt = $opt) =~ tr/-/_/;
+
+ return $tr_opt if grep $tr_opt =~ /^(?:no_?)?$_$/, qw(
+ create_license
+ create_makefile_pl
+ create_readme
+ extra_compiler_flags
+ extra_linker_flags
+ html_css
+ install_base
+ install_path
+ meta_add
+ meta_merge
+ test_files
+ use_rcfile
+ use_tap_harness
+ tap_harness_args
+ cpan_client
+ ); # normalize only selected option names
+
+ return $opt;
+}
+
+sub _read_arg {
+ my ($self, $args, $key, $val) = @_;
+
+ $key = $self->_translate_option($key);
+
+ if ( exists $args->{$key} ) {
+ $args->{$key} = [ $args->{$key} ] unless ref $args->{$key};
+ push @{$args->{$key}}, $val;
+ } else {
+ $args->{$key} = $val;
+ }
+}
+
+# decide whether or not an option requires/has an operand
+sub _optional_arg {
+ my $self = shift;
+ my $opt = shift;
+ my $argv = shift;
+
+ $opt = $self->_translate_option($opt);
+
+ my @bool_opts = qw(
+ build_bat
+ create_license
+ create_readme
+ pollute
+ quiet
+ uninst
+ use_rcfile
+ verbose
+ debug
+ sign
+ use_tap_harness
+ );
+
+ # inverted boolean options; eg --noverbose or --no-verbose
+ # converted to proper name & returned with false value (verbose, 0)
+ if ( grep $opt =~ /^no[-_]?$_$/, @bool_opts ) {
+ $opt =~ s/^no-?//;
+ return ($opt, 0);
+ }
+
+ # non-boolean option; return option unchanged along with its argument
+ return ($opt, shift(@$argv)) unless grep $_ eq $opt, @bool_opts;
+
+ # we're punting a bit here, if an option appears followed by a digit
+ # we take the digit as the argument for the option. If there is
+ # nothing that looks like a digit, we pretend the option is a flag
+ # that is being set and has no argument.
+ my $arg = 1;
+ $arg = shift(@$argv) if @$argv && $argv->[0] =~ /^\d+$/;
+
+ return ($opt, $arg);
+}
+
+sub read_args {
+ my $self = shift;
+
+ (my $args, @_) = $self->cull_options(@_);
+ my %args = %$args;
+
+ my $opt_re = qr/[\w\-]+/;
+
+ my ($action, @argv);
+ while (@_) {
+ local $_ = shift;
+ if ( /^(?:--)?($opt_re)=(.*)$/ ) {
+ $self->_read_arg(\%args, $1, $2);
+ } elsif ( /^--($opt_re)$/ ) {
+ my($opt, $arg) = $self->_optional_arg($1, \@_);
+ $self->_read_arg(\%args, $opt, $arg);
+ } elsif ( /^($opt_re)$/ and !defined($action)) {
+ $action = $1;
+ } else {
+ push @argv, $_;
+ }
+ }
+ $args{ARGV} = \@argv;
+
+ for ('extra_compiler_flags', 'extra_linker_flags') {
+ $args{$_} = [ $self->split_like_shell($args{$_}) ] if exists $args{$_};
+ }
+
+ # Convert to arrays
+ for ('include_dirs') {
+ $args{$_} = [ $args{$_} ] if exists $args{$_} && !ref $args{$_}
+ }
+
+ # Hashify these parameters
+ for ($self->hash_properties, 'config') {
+ next unless exists $args{$_};
+ my %hash;
+ $args{$_} ||= [];
+ $args{$_} = [ $args{$_} ] unless ref $args{$_};
+ foreach my $arg ( @{$args{$_}} ) {
+ $arg =~ /(\w+)=(.*)/
+ or die "Malformed '$_' argument: '$arg' should be something like 'foo=bar'";
+ $hash{$1} = $2;
+ }
+ $args{$_} = \%hash;
+ }
+
+ # De-tilde-ify any path parameters
+ for my $key (qw(prefix install_base destdir)) {
+ next if !defined $args{$key};
+ $args{$key} = $self->_detildefy($args{$key});
+ }
+
+ for my $key (qw(install_path)) {
+ next if !defined $args{$key};
+
+ for my $subkey (keys %{$args{$key}}) {
+ next if !defined $args{$key}{$subkey};
+ my $subkey_ext = $self->_detildefy($args{$key}{$subkey});
+ if ( $subkey eq 'html' ) { # translate for compatibility
+ $args{$key}{binhtml} = $subkey_ext;
+ $args{$key}{libhtml} = $subkey_ext;
+ } else {
+ $args{$key}{$subkey} = $subkey_ext;
+ }
+ }
+ }
+
+ if ($args{makefile_env_macros}) {
+ require Module::Build::Compat;
+ %args = (%args, Module::Build::Compat->makefile_to_build_macros);
+ }
+
+ return \%args, $action;
+}
+
+# Default: do nothing. Overridden for Unix & Windows.
+sub _detildefy {}
+
+
+# merge Module::Build argument lists that have already been parsed
+# by read_args(). Takes two references to option hashes and merges
+# the contents, giving priority to the first.
+sub _merge_arglist {
+ my( $self, $opts1, $opts2 ) = @_;
+
+ $opts1 ||= {};
+ $opts2 ||= {};
+ my %new_opts = %$opts1;
+ while (my ($key, $val) = each %$opts2) {
+ if ( exists( $opts1->{$key} ) ) {
+ if ( ref( $val ) eq 'HASH' ) {
+ while (my ($k, $v) = each %$val) {
+ $new_opts{$key}{$k} = $v unless exists( $opts1->{$key}{$k} );
+ }
+ }
+ } else {
+ $new_opts{$key} = $val
+ }
+ }
+
+ return %new_opts;
+}
+
+# Look for a home directory on various systems.
+sub _home_dir {
+ my @home_dirs;
+ push( @home_dirs, $ENV{HOME} ) if $ENV{HOME};
+
+ push( @home_dirs, File::Spec->catpath($ENV{HOMEDRIVE}, $ENV{HOMEPATH}, '') )
+ if $ENV{HOMEDRIVE} && $ENV{HOMEPATH};
+
+ my @other_home_envs = qw( USERPROFILE APPDATA WINDIR SYS$LOGIN );
+ push( @home_dirs, map $ENV{$_}, grep $ENV{$_}, @other_home_envs );
+
+ my @real_home_dirs = grep -d, @home_dirs;
+
+ return wantarray ? @real_home_dirs : shift( @real_home_dirs );
+}
+
+sub _find_user_config {
+ my $self = shift;
+ my $file = shift;
+ foreach my $dir ( $self->_home_dir ) {
+ my $path = File::Spec->catfile( $dir, $file );
+ return $path if -e $path;
+ }
+ return undef;
+}
+
+# read ~/.modulebuildrc returning global options '*' and
+# options specific to the currently executing $action.
+sub read_modulebuildrc {
+ my( $self, $action ) = @_;
+
+ return () unless $self->use_rcfile;
+
+ my $modulebuildrc;
+ if ( exists($ENV{MODULEBUILDRC}) && $ENV{MODULEBUILDRC} eq 'NONE' ) {
+ return ();
+ } elsif ( exists($ENV{MODULEBUILDRC}) && -e $ENV{MODULEBUILDRC} ) {
+ $modulebuildrc = $ENV{MODULEBUILDRC};
+ } elsif ( exists($ENV{MODULEBUILDRC}) ) {
+ $self->log_warn("WARNING: Can't find resource file " .
+ "'$ENV{MODULEBUILDRC}' defined in environment.\n" .
+ "No options loaded\n");
+ return ();
+ } else {
+ $modulebuildrc = $self->_find_user_config( '.modulebuildrc' );
+ return () unless $modulebuildrc;
+ }
+
+ my $fh = IO::File->new( $modulebuildrc )
+ or die "Can't open $modulebuildrc: $!";
+
+ my %options; my $buffer = '';
+ while (defined( my $line = <$fh> )) {
+ chomp( $line );
+ $line =~ s/#.*$//;
+ next unless length( $line );
+
+ if ( $line =~ /^\S/ ) {
+ if ( $buffer ) {
+ my( $action, $options ) = split( /\s+/, $buffer, 2 );
+ $options{$action} .= $options . ' ';
+ $buffer = '';
+ }
+ $buffer = $line;
+ } else {
+ $buffer .= $line;
+ }
+ }
+
+ if ( $buffer ) { # anything left in $buffer ?
+ my( $action, $options ) = split( /\s+/, $buffer, 2 );
+ $options{$action} .= $options . ' '; # merge if more than one line
+ }
+
+ my ($global_opts) =
+ $self->read_args( $self->split_like_shell( $options{'*'} || '' ) );
+ my ($action_opts) =
+ $self->read_args( $self->split_like_shell( $options{$action} || '' ) );
+
+ # specific $action options take priority over global options '*'
+ return $self->_merge_arglist( $action_opts, $global_opts );
+}
+
+# merge the relevant options in ~/.modulebuildrc into Module::Build's
+# option list where they do not conflict with commandline options.
+sub merge_modulebuildrc {
+ my( $self, $action, %cmdline_opts ) = @_;
+ my %rc_opts = $self->read_modulebuildrc( $action || $self->{action} || 'build' );
+ my %new_opts = $self->_merge_arglist( \%cmdline_opts, \%rc_opts );
+ $self->merge_args( $action, %new_opts );
+}
+
+sub merge_args {
+ my ($self, $action, %args) = @_;
+ $self->{action} = $action if defined $action;
+
+ my %additive = map { $_ => 1 } $self->hash_properties;
+
+ # Extract our 'properties' from $cmd_args, the rest are put in 'args'.
+ while (my ($key, $val) = each %args) {
+ $self->{phash}{runtime_params}->access( $key => $val )
+ if $self->valid_property($key);
+
+ if ($key eq 'config') {
+ $self->config($_ => $val->{$_}) foreach keys %$val;
+ } else {
+ my $add_to = $additive{$key} ? $self->{properties}{$key} :
+ $self->valid_property($key) ? $self->{properties} :
+ $self->{args} ;
+
+ if ($additive{$key}) {
+ $add_to->{$_} = $val->{$_} foreach keys %$val;
+ } else {
+ $add_to->{$key} = $val;
+ }
+ }
+ }
+}
+
+sub cull_args {
+ my $self = shift;
+ my @arg_list = @_;
+ unshift @arg_list, $self->split_like_shell($ENV{PERL_MB_OPT})
+ if $ENV{PERL_MB_OPT};
+ my ($args, $action) = $self->read_args(@arg_list);
+ $self->merge_args($action, %$args);
+ $self->merge_modulebuildrc( $action, %$args );
+}
+
+sub super_classes {
+ my ($self, $class, $seen) = @_;
+ $class ||= ref($self) || $self;
+ $seen ||= {};
+
+ no strict 'refs';
+ my @super = grep {not $seen->{$_}++} $class, @{ $class . '::ISA' };
+ return @super, map {$self->super_classes($_,$seen)} @super;
+}
+
+sub known_actions {
+ my ($self) = @_;
+
+ my %actions;
+ no strict 'refs';
+
+ foreach my $class ($self->super_classes) {
+ foreach ( keys %{ $class . '::' } ) {
+ $actions{$1}++ if /^ACTION_(\w+)/;
+ }
+ }
+
+ return wantarray ? sort keys %actions : \%actions;
+}
+
+sub get_action_docs {
+ my ($self, $action) = @_;
+ my $actions = $self->known_actions;
+ die "No known action '$action'" unless $actions->{$action};
+
+ my ($files_found, @docs) = (0);
+ foreach my $class ($self->super_classes) {
+ (my $file = $class) =~ s{::}{/}g;
+ # NOTE: silently skipping relative paths if any chdir() happened
+ $file = $INC{$file . '.pm'} or next;
+ my $fh = IO::File->new("< $file") or next;
+ $files_found++;
+
+ # Code below modified from /usr/bin/perldoc
+
+ # Skip to ACTIONS section
+ local $_;
+ while (<$fh>) {
+ last if /^=head1 ACTIONS\s/;
+ }
+
+ # Look for our action and determine the style
+ my $style;
+ while (<$fh>) {
+ last if /^=head1 /;
+
+ # only item and head2 are allowed (3&4 are not in 5.005)
+ if(/^=(item|head2)\s+\Q$action\E\b/) {
+ $style = $1;
+ push @docs, $_;
+ last;
+ }
+ }
+ $style or next; # not here
+
+ # and the content
+ if($style eq 'item') {
+ my ($found, $inlist) = (0, 0);
+ while (<$fh>) {
+ if (/^=(item|back)/) {
+ last unless $inlist;
+ }
+ push @docs, $_;
+ ++$inlist if /^=over/;
+ --$inlist if /^=back/;
+ }
+ }
+ else { # head2 style
+ # stop at anything equal or greater than the found level
+ while (<$fh>) {
+ last if(/^=(?:head[12]|cut)/);
+ push @docs, $_;
+ }
+ }
+ # TODO maybe disallow overriding just pod for an action
+ # TODO and possibly: @docs and last;
+ }
+
+ unless ($files_found) {
+ $@ = "Couldn't find any documentation to search";
+ return;
+ }
+ unless (@docs) {
+ $@ = "Couldn't find any docs for action '$action'";
+ return;
+ }
+
+ return join '', @docs;
+}
+
+sub ACTION_prereq_report {
+ my $self = shift;
+ $self->log_info( $self->prereq_report );
+}
+
+sub ACTION_prereq_data {
+ my $self = shift;
+ $self->log_info( Module::Build::Dumper->_data_dump( $self->prereq_data ) );
+}
+
+sub prereq_data {
+ my $self = shift;
+ my @types = ('configure_requires', @{ $self->prereq_action_types } );
+ my $info = { map { $_ => $self->$_() } grep { %{$self->$_()} } @types };
+ return $info;
+}
+
+sub prereq_report {
+ my $self = shift;
+ my $info = $self->prereq_data;
+
+ my $output = '';
+ foreach my $type (keys %$info) {
+ my $prereqs = $info->{$type};
+ $output .= "\n$type:\n";
+ my $mod_len = 2;
+ my $ver_len = 4;
+ my %mods;
+ while ( my ($modname, $spec) = each %$prereqs ) {
+ my $len = length $modname;
+ $mod_len = $len if $len > $mod_len;
+ $spec ||= '0';
+ $len = length $spec;
+ $ver_len = $len if $len > $ver_len;
+
+ my $mod = $self->check_installed_status($modname, $spec);
+ $mod->{name} = $modname;
+ $mod->{ok} ||= 0;
+ $mod->{ok} = ! $mod->{ok} if $type =~ /^(\w+_)?conflicts$/;
+
+ $mods{lc $modname} = $mod;
+ }
+
+ my $space = q{ } x ($mod_len - 3);
+ my $vspace = q{ } x ($ver_len - 3);
+ my $sline = q{-} x ($mod_len - 3);
+ my $vline = q{-} x ($ver_len - 3);
+ my $disposition = ($type =~ /^(\w+_)?conflicts$/) ?
+ 'Clash' : 'Need';
+ $output .=
+ " Module $space $disposition $vspace Have\n".
+ " ------$sline+------$vline-+----------\n";
+
+
+ for my $k (sort keys %mods) {
+ my $mod = $mods{$k};
+ my $space = q{ } x ($mod_len - length $k);
+ my $vspace = q{ } x ($ver_len - length $mod->{need});
+ my $f = $mod->{ok} ? ' ' : '!';
+ $output .=
+ " $f $mod->{name} $space $mod->{need} $vspace ".
+ (defined($mod->{have}) ? $mod->{have} : "")."\n";
+ }
+ }
+ return $output;
+}
+
+sub ACTION_help {
+ my ($self) = @_;
+ my $actions = $self->known_actions;
+
+ if (@{$self->{args}{ARGV}}) {
+ my $msg = eval {$self->get_action_docs($self->{args}{ARGV}[0], $actions)};
+ print $@ ? "$@\n" : $msg;
+ return;
+ }
+
+ print <<EOF;
+
+ Usage: $0 <action> arg1=value arg2=value ...
+ Example: $0 test verbose=1
+
+ Actions defined:
+EOF
+
+ print $self->_action_listing($actions);
+
+ print "\nRun `Build help <action>` for details on an individual action.\n";
+ print "See `perldoc Module::Build` for complete documentation.\n";
+}
+
+sub _action_listing {
+ my ($self, $actions) = @_;
+
+ # Flow down columns, not across rows
+ my @actions = sort keys %$actions;
+ @actions = map $actions[($_ + ($_ % 2) * @actions) / 2], 0..$#actions;
+
+ my $out = '';
+ while (my ($one, $two) = splice @actions, 0, 2) {
+ $out .= sprintf(" %-12s %-12s\n", $one, $two||'');
+ }
+ $out =~ s{\s*$}{}mg; # remove trailing spaces
+ return $out;
+}
+
+sub ACTION_retest {
+ my ($self) = @_;
+
+ # Protect others against our @INC changes
+ local @INC = @INC;
+
+ # Filter out nonsensical @INC entries - some versions of
+ # Test::Harness will really explode the number of entries here
+ @INC = grep {ref() || -d} @INC if @INC > 100;
+
+ $self->do_tests;
+}
+
+sub ACTION_testall {
+ my ($self) = @_;
+
+ my @types;
+ for my $action (grep { $_ ne 'all' } $self->get_test_types) {
+ # XXX We can't just dispatch because we get multiple summaries but
+ # we'll need to dispatch to support custom setup/teardown in the
+ # action. To support that, we'll need to call something besides
+ # Harness::runtests() because we'll need to collect the results in
+ # parts, then run the summary.
+ push(@types, $action);
+ #$self->_call_action( "test$action" );
+ }
+ $self->generic_test(types => ['default', @types]);
+}
+
+sub get_test_types {
+ my ($self) = @_;
+
+ my $t = $self->{properties}->{test_types};
+ return ( defined $t ? ( keys %$t ) : () );
+}
+
+
+sub ACTION_test {
+ my ($self) = @_;
+ $self->generic_test(type => 'default');
+}
+
+sub generic_test {
+ my $self = shift;
+ (@_ % 2) and croak('Odd number of elements in argument hash');
+ my %args = @_;
+
+ my $p = $self->{properties};
+
+ my @types = (
+ (exists($args{type}) ? $args{type} : ()),
+ (exists($args{types}) ? @{$args{types}} : ()),
+ );
+ @types or croak "need some types of tests to check";
+
+ my %test_types = (
+ default => $p->{test_file_exts},
+ (defined($p->{test_types}) ? %{$p->{test_types}} : ()),
+ );
+
+ for my $type (@types) {
+ croak "$type not defined in test_types!"
+ unless defined $test_types{ $type };
+ }
+
+ # we use local here because it ends up two method calls deep
+ local $p->{test_file_exts} = [ map { ref $_ ? @$_ : $_ } @test_types{@types} ];
+ $self->depends_on('code');
+
+ # Protect others against our @INC changes
+ local @INC = @INC;
+
+ # Make sure we test the module in blib/
+ unshift @INC, (File::Spec->catdir($p->{base_dir}, $self->blib, 'lib'),
+ File::Spec->catdir($p->{base_dir}, $self->blib, 'arch'));
+
+ # Filter out nonsensical @INC entries - some versions of
+ # Test::Harness will really explode the number of entries here
+ @INC = grep {ref() || -d} @INC if @INC > 100;
+
+ $self->do_tests;
+}
+
+# Test::Harness dies on failure but TAP::Harness does not, so we must
+# die if running under TAP::Harness
+sub do_tests {
+ my $self = shift;
+
+ my $tests = $self->find_test_files;
+
+ if(@$tests) {
+ my $args = $self->tap_harness_args;
+ if($self->use_tap_harness or ($args and %$args)) {
+ my $aggregate = $self->run_tap_harness($tests);
+ if ( $aggregate->has_errors ) {
+ die "Errors in testing. Cannot continue.\n";
+ }
+ }
+ else {
+ $self->run_test_harness($tests);
+ }
+ }
+ else {
+ $self->log_info("No tests defined.\n");
+ }
+
+ $self->run_visual_script;
+}
+
+sub run_tap_harness {
+ my ($self, $tests) = @_;
+
+ require TAP::Harness;
+
+ # TODO allow the test @INC to be set via our API?
+
+ my $aggregate = TAP::Harness->new({
+ lib => [@INC],
+ verbosity => $self->{properties}{verbose},
+ switches => [ $self->harness_switches ],
+ %{ $self->tap_harness_args },
+ })->runtests(@$tests);
+
+ return $aggregate;
+}
+
+sub run_test_harness {
+ my ($self, $tests) = @_;
+ require Test::Harness;
+ my $p = $self->{properties};
+ my @harness_switches = $self->harness_switches;
+
+ # Work around a Test::Harness bug that loses the particular perl
+ # we're running under. $self->perl is trustworthy, but $^X isn't.
+ local $^X = $self->perl;
+
+ # Do everything in our power to work with all versions of Test::Harness
+ local $Test::Harness::switches = join ' ', grep defined, $Test::Harness::switches, @harness_switches;
+ local $Test::Harness::Switches = join ' ', grep defined, $Test::Harness::Switches, @harness_switches;
+ local $ENV{HARNESS_PERL_SWITCHES} = join ' ', grep defined, $ENV{HARNESS_PERL_SWITCHES}, @harness_switches;
+
+ $Test::Harness::switches = undef unless length $Test::Harness::switches;
+ $Test::Harness::Switches = undef unless length $Test::Harness::Switches;
+ delete $ENV{HARNESS_PERL_SWITCHES} unless length $ENV{HARNESS_PERL_SWITCHES};
+
+ local ($Test::Harness::verbose,
+ $Test::Harness::Verbose,
+ $ENV{TEST_VERBOSE},
+ $ENV{HARNESS_VERBOSE}) = ($p->{verbose} || 0) x 4;
+
+ Test::Harness::runtests(@$tests);
+}
+
+sub run_visual_script {
+ my $self = shift;
+ # This will get run and the user will see the output. It doesn't
+ # emit Test::Harness-style output.
+ $self->run_perl_script('visual.pl', '-Mblib='.$self->blib)
+ if -e 'visual.pl';
+}
+
+sub harness_switches {
+ shift->{properties}{debugger} ? qw(-w -d) : ();
+}
+
+sub test_files {
+ my $self = shift;
+ my $p = $self->{properties};
+ if (@_) {
+ return $p->{test_files} = (@_ == 1 ? shift : [@_]);
+ }
+ return $self->find_test_files;
+}
+
+sub expand_test_dir {
+ my ($self, $dir) = @_;
+ my $exts = $self->{properties}{test_file_exts};
+
+ return sort map { @{$self->rscan_dir($dir, qr{^[^.].*\Q$_\E$})} } @$exts
+ if $self->recursive_test_files;
+
+ return sort map { glob File::Spec->catfile($dir, "*$_") } @$exts;
+}
+
+sub ACTION_testdb {
+ my ($self) = @_;
+ local $self->{properties}{debugger} = 1;
+ $self->depends_on('test');
+}
+
+sub ACTION_testcover {
+ my ($self) = @_;
+
+ unless (Module::Build::ModuleInfo->find_module_by_name('Devel::Cover')) {
+ warn("Cannot run testcover action unless Devel::Cover is installed.\n");
+ return;
+ }
+
+ $self->add_to_cleanup('coverage', 'cover_db');
+ $self->depends_on('code');
+
+ # See whether any of the *.pm files have changed since last time
+ # testcover was run. If so, start over.
+ if (-e 'cover_db') {
+ my $pm_files = $self->rscan_dir
+ (File::Spec->catdir($self->blib, 'lib'), file_qr('\.pm$') );
+ my $cover_files = $self->rscan_dir('cover_db', sub {-f $_ and not /\.html$/});
+
+ $self->do_system(qw(cover -delete))
+ unless $self->up_to_date($pm_files, $cover_files)
+ && $self->up_to_date($self->test_files, $cover_files);
+ }
+
+ local $Test::Harness::switches =
+ local $Test::Harness::Switches =
+ local $ENV{HARNESS_PERL_SWITCHES} = "-MDevel::Cover";
+
+ $self->depends_on('test');
+ $self->do_system('cover');
+}
+
+sub ACTION_code {
+ my ($self) = @_;
+
+ # All installable stuff gets created in blib/ .
+ # Create blib/arch to keep blib.pm happy
+ my $blib = $self->blib;
+ $self->add_to_cleanup($blib);
+ File::Path::mkpath( File::Spec->catdir($blib, 'arch') );
+
+ if (my $split = $self->autosplit) {
+ $self->autosplit_file($_, $blib) for ref($split) ? @$split : ($split);
+ }
+
+ foreach my $element (@{$self->build_elements}) {
+ my $method = "process_${element}_files";
+ $method = "process_files_by_extension" unless $self->can($method);
+ $self->$method($element);
+ }
+
+ $self->depends_on('config_data');
+}
+
+sub ACTION_build {
+ my $self = shift;
+ $self->log_info("Building " . $self->dist_name . "\n");
+ $self->depends_on('code');
+ $self->depends_on('docs');
+}
+
+sub process_files_by_extension {
+ my ($self, $ext) = @_;
+
+ my $method = "find_${ext}_files";
+ my $files = $self->can($method) ? $self->$method() : $self->_find_file_by_type($ext, 'lib');
+
+ while (my ($file, $dest) = each %$files) {
+ $self->copy_if_modified(from => $file, to => File::Spec->catfile($self->blib, $dest) );
+ }
+}
+
+sub process_support_files {
+ my $self = shift;
+ my $p = $self->{properties};
+ return unless $p->{c_source};
+
+ push @{$p->{include_dirs}}, $p->{c_source};
+
+ my $files = $self->rscan_dir($p->{c_source}, file_qr('\.c(c|p|pp|xx|\+\+)?$'));
+ foreach my $file (@$files) {
+ push @{$p->{objects}}, $self->compile_c($file);
+ }
+}
+
+sub process_share_dir_files {
+ my $self = shift;
+ my $files = $self->_find_share_dir_files;
+ return unless $files;
+
+ # root for all File::ShareDir paths
+ my $share_prefix = File::Spec->catdir($self->blib, qw/lib auto share/);
+
+ # copy all share files to blib
+ while (my ($file, $dest) = each %$files) {
+ $self->copy_if_modified(
+ from => $file, to => File::Spec->catfile( $share_prefix, $dest )
+ );
+ }
+}
+
+sub _find_share_dir_files {
+ my $self = shift;
+ my $share_dir = $self->share_dir;
+ return unless $share_dir;
+
+ my @file_map;
+ if ( $share_dir->{dist} ) {
+ my $prefix = "dist/".$self->dist_name;
+ push @file_map, $self->_share_dir_map( $prefix, $share_dir->{dist} );
+ }
+
+ if ( $share_dir->{module} ) {
+ for my $mod ( keys %{ $share_dir->{module} } ) {
+ (my $altmod = $mod) =~ s{::}{-}g;
+ my $prefix = "module/$altmod";
+ push @file_map, $self->_share_dir_map($prefix, $share_dir->{module}{$mod});
+ }
+ }
+
+ return { @file_map };
+}
+
+sub _share_dir_map {
+ my ($self, $prefix, $list) = @_;
+ my %files;
+ for my $dir ( @$list ) {
+ for my $f ( @{ $self->rscan_dir( $dir, sub {-f} )} ) {
+ $f =~ s{\A.*\Q$dir\E/}{};
+ $files{"$dir/$f"} = "$prefix/$f";
+ }
+ }
+ return %files;
+}
+
+sub process_PL_files {
+ my ($self) = @_;
+ my $files = $self->find_PL_files;
+
+ while (my ($file, $to) = each %$files) {
+ unless ($self->up_to_date( $file, $to )) {
+ $self->run_perl_script($file, [], [@$to]) or die "$file failed";
+ $self->add_to_cleanup(@$to);
+ }
+ }
+}
+
+sub process_xs_files {
+ my $self = shift;
+ my $files = $self->find_xs_files;
+ while (my ($from, $to) = each %$files) {
+ unless ($from eq $to) {
+ $self->add_to_cleanup($to);
+ $self->copy_if_modified( from => $from, to => $to );
+ }
+ $self->process_xs($to);
+ }
+}
+
+sub process_pod_files { shift()->process_files_by_extension(shift()) }
+sub process_pm_files { shift()->process_files_by_extension(shift()) }
+
+sub process_script_files {
+ my $self = shift;
+ my $files = $self->find_script_files;
+ return unless keys %$files;
+
+ my $script_dir = File::Spec->catdir($self->blib, 'script');
+ File::Path::mkpath( $script_dir );
+
+ foreach my $file (keys %$files) {
+ my $result = $self->copy_if_modified($file, $script_dir, 'flatten') or next;
+ $self->fix_shebang_line($result) unless $self->is_vmsish;
+ $self->make_executable($result);
+ }
+}
+
+sub find_PL_files {
+ my $self = shift;
+ if (my $files = $self->{properties}{PL_files}) {
+ # 'PL_files' is given as a Unix file spec, so we localize_file_path().
+
+ if (UNIVERSAL::isa($files, 'ARRAY')) {
+ return { map {$_, [/^(.*)\.PL$/]}
+ map $self->localize_file_path($_),
+ @$files };
+
+ } elsif (UNIVERSAL::isa($files, 'HASH')) {
+ my %out;
+ while (my ($file, $to) = each %$files) {
+ $out{ $self->localize_file_path($file) } = [ map $self->localize_file_path($_),
+ ref $to ? @$to : ($to) ];
+ }
+ return \%out;
+
+ } else {
+ die "'PL_files' must be a hash reference or array reference";
+ }
+ }
+
+ return unless -d 'lib';
+ return { map {$_, [/^(.*)\.PL$/i ]} @{ $self->rscan_dir('lib',
+ file_qr('\.PL$')) } };
+}
+
+sub find_pm_files { shift->_find_file_by_type('pm', 'lib') }
+sub find_pod_files { shift->_find_file_by_type('pod', 'lib') }
+sub find_xs_files { shift->_find_file_by_type('xs', 'lib') }
+
+sub find_script_files {
+ my $self = shift;
+ if (my $files = $self->script_files) {
+ # Always given as a Unix file spec. Values in the hash are
+ # meaningless, but we preserve if present.
+ return { map {$self->localize_file_path($_), $files->{$_}} keys %$files };
+ }
+
+ # No default location for script files
+ return {};
+}
+
+sub find_test_files {
+ my $self = shift;
+ my $p = $self->{properties};
+
+ if (my $files = $p->{test_files}) {
+ $files = [keys %$files] if UNIVERSAL::isa($files, 'HASH');
+ $files = [map { -d $_ ? $self->expand_test_dir($_) : $_ }
+ map glob,
+ $self->split_like_shell($files)];
+
+ # Always given as a Unix file spec.
+ return [ map $self->localize_file_path($_), @$files ];
+
+ } else {
+ # Find all possible tests in t/ or test.pl
+ my @tests;
+ push @tests, 'test.pl' if -e 'test.pl';
+ push @tests, $self->expand_test_dir('t') if -e 't' and -d _;
+ return \@tests;
+ }
+}
+
+sub _find_file_by_type {
+ my ($self, $type, $dir) = @_;
+
+ if (my $files = $self->{properties}{"${type}_files"}) {
+ # Always given as a Unix file spec
+ return { map $self->localize_file_path($_), %$files };
+ }
+
+ return {} unless -d $dir;
+ return { map {$_, $_}
+ map $self->localize_file_path($_),
+ grep !/\.\#/,
+ @{ $self->rscan_dir($dir, file_qr("\\.$type\$")) } };
+}
+
+sub localize_file_path {
+ my ($self, $path) = @_;
+ return File::Spec->catfile( split m{/}, $path );
+}
+
+sub localize_dir_path {
+ my ($self, $path) = @_;
+ return File::Spec->catdir( split m{/}, $path );
+}
+
+sub fix_shebang_line { # Adapted from fixin() in ExtUtils::MM_Unix 1.35
+ my ($self, @files) = @_;
+ my $c = ref($self) ? $self->{config} : 'Module::Build::Config';
+
+ my ($does_shbang) = $c->get('sharpbang') =~ /^\s*\#\!/;
+ for my $file (@files) {
+ my $FIXIN = IO::File->new($file) or die "Can't process '$file': $!";
+ local $/ = "\n";
+ chomp(my $line = <$FIXIN>);
+ next unless $line =~ s/^\s*\#!\s*//; # Not a shbang file.
+
+ my ($cmd, $arg) = (split(' ', $line, 2), '');
+ next unless $cmd =~ /perl/i;
+ my $interpreter = $self->{properties}{perl};
+
+ $self->log_verbose("Changing sharpbang in $file to $interpreter");
+ my $shb = '';
+ $shb .= $c->get('sharpbang')."$interpreter $arg\n" if $does_shbang;
+
+ # I'm not smart enough to know the ramifications of changing the
+ # embedded newlines here to \n, so I leave 'em in.
+ $shb .= qq{
+eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
+ if 0; # not running under some shell
+} unless $self->is_windowsish; # this won't work on win32, so don't
+
+ my $FIXOUT = IO::File->new(">$file.new")
+ or die "Can't create new $file: $!\n";
+
+ # Print out the new #! line (or equivalent).
+ local $\;
+ undef $/; # Was localized above
+ print $FIXOUT $shb, <$FIXIN>;
+ close $FIXIN;
+ close $FIXOUT;
+
+ rename($file, "$file.bak")
+ or die "Can't rename $file to $file.bak: $!";
+
+ rename("$file.new", $file)
+ or die "Can't rename $file.new to $file: $!";
+
+ $self->delete_filetree("$file.bak")
+ or $self->log_warn("Couldn't clean up $file.bak, leaving it there");
+
+ $self->do_system($c->get('eunicefix'), $file) if $c->get('eunicefix') ne ':';
+ }
+}
+
+
+sub ACTION_testpod {
+ my $self = shift;
+ $self->depends_on('docs');
+
+ eval q{use Test::Pod 0.95; 1}
+ or die "The 'testpod' action requires Test::Pod version 0.95";
+
+ my @files = sort keys %{$self->_find_pods($self->libdoc_dirs)},
+ keys %{$self->_find_pods
+ ($self->bindoc_dirs,
+ exclude => [ file_qr('\.bat$') ])}
+ or die "Couldn't find any POD files to test\n";
+
+ { package # hide from PAUSE
+ Module::Build::PodTester; # Don't want to pollute the main namespace
+ Test::Pod->import( tests => scalar @files );
+ pod_file_ok($_) foreach @files;
+ }
+}
+
+sub ACTION_testpodcoverage {
+ my $self = shift;
+
+ $self->depends_on('docs');
+
+ eval q{use Test::Pod::Coverage 1.00; 1}
+ or die "The 'testpodcoverage' action requires ",
+ "Test::Pod::Coverage version 1.00";
+
+ # TODO this needs test coverage!
+
+ # XXX work-around a bug in Test::Pod::Coverage previous to v1.09
+ # Make sure we test the module in blib/
+ local @INC = @INC;
+ my $p = $self->{properties};
+ unshift(@INC,
+ # XXX any reason to include arch?
+ File::Spec->catdir($p->{base_dir}, $self->blib, 'lib'),
+ #File::Spec->catdir($p->{base_dir}, $self->blib, 'arch')
+ );
+
+ all_pod_coverage_ok();
+}
+
+sub ACTION_docs {
+ my $self = shift;
+
+ $self->depends_on('code');
+ $self->depends_on('manpages', 'html');
+}
+
+# Given a file type, will return true if the file type would normally
+# be installed when neither install-base nor prefix has been set.
+# I.e. it will be true only if the path is set from Config.pm or
+# set explicitly by the user via install-path.
+sub _is_default_installable {
+ my $self = shift;
+ my $type = shift;
+ return ( $self->install_destination($type) &&
+ ( $self->install_path($type) ||
+ $self->install_sets($self->installdirs)->{$type} )
+ ) ? 1 : 0;
+}
+
+sub ACTION_manpages {
+ my $self = shift;
+
+ return unless $self->_mb_feature('manpage_support');
+
+ $self->depends_on('code');
+
+ foreach my $type ( qw(bin lib) ) {
+ my $files = $self->_find_pods( $self->{properties}{"${type}doc_dirs"},
+ exclude => [ file_qr('\.bat$') ] );
+ next unless %$files;
+
+ my $sub = $self->can("manify_${type}_pods");
+ next unless defined( $sub );
+
+ if ( $self->invoked_action eq 'manpages' ) {
+ $self->$sub();
+ } elsif ( $self->_is_default_installable("${type}doc") ) {
+ $self->$sub();
+ }
+ }
+
+}
+
+sub manify_bin_pods {
+ my $self = shift;
+
+ my $files = $self->_find_pods( $self->{properties}{bindoc_dirs},
+ exclude => [ file_qr('\.bat$') ] );
+ return unless keys %$files;
+
+ my $mandir = File::Spec->catdir( $self->blib, 'bindoc' );
+ File::Path::mkpath( $mandir, 0, oct(777) );
+
+ require Pod::Man;
+ foreach my $file (keys %$files) {
+ # Pod::Simple based parsers only support one document per instance.
+ # This is expected to change in a future version (Pod::Simple > 3.03).
+ my $parser = Pod::Man->new( section => 1 ); # binaries go in section 1
+ my $manpage = $self->man1page_name( $file ) . '.' .
+ $self->config( 'man1ext' );
+ my $outfile = File::Spec->catfile($mandir, $manpage);
+ next if $self->up_to_date( $file, $outfile );
+ $self->log_verbose("Manifying $file -> $outfile\n");
+ eval { $parser->parse_from_file( $file, $outfile ); 1 }
+ or $self->log_warn("Error creating '$outfile': $@\n");
+ $files->{$file} = $outfile;
+ }
+}
+
+sub manify_lib_pods {
+ my $self = shift;
+
+ my $files = $self->_find_pods($self->{properties}{libdoc_dirs});
+ return unless keys %$files;
+
+ my $mandir = File::Spec->catdir( $self->blib, 'libdoc' );
+ File::Path::mkpath( $mandir, 0, oct(777) );
+
+ require Pod::Man;
+ while (my ($file, $relfile) = each %$files) {
+ # Pod::Simple based parsers only support one document per instance.
+ # This is expected to change in a future version (Pod::Simple > 3.03).
+ my $parser = Pod::Man->new( section => 3 ); # libraries go in section 3
+ my $manpage = $self->man3page_name( $relfile ) . '.' .
+ $self->config( 'man3ext' );
+ my $outfile = File::Spec->catfile( $mandir, $manpage);
+ next if $self->up_to_date( $file, $outfile );
+ $self->log_verbose("Manifying $file -> $outfile\n");
+ eval { $parser->parse_from_file( $file, $outfile ); 1 }
+ or $self->log_warn("Error creating '$outfile': $@\n");
+ $files->{$file} = $outfile;
+ }
+}
+
+sub _find_pods {
+ my ($self, $dirs, %args) = @_;
+ my %files;
+ foreach my $spec (@$dirs) {
+ my $dir = $self->localize_dir_path($spec);
+ next unless -e $dir;
+
+ FILE: foreach my $file ( @{ $self->rscan_dir( $dir ) } ) {
+ foreach my $regexp ( @{ $args{exclude} } ) {
+ next FILE if $file =~ $regexp;
+ }
+ $files{$file} = File::Spec->abs2rel($file, $dir) if $self->contains_pod( $file )
+ }
+ }
+ return \%files;
+}
+
+sub contains_pod {
+ my ($self, $file) = @_;
+ return '' unless -T $file; # Only look at text files
+
+ my $fh = IO::File->new( $file ) or die "Can't open $file: $!";
+ while (my $line = <$fh>) {
+ return 1 if $line =~ /^\=(?:head|pod|item)/;
+ }
+
+ return '';
+}
+
+sub ACTION_html {
+ my $self = shift;
+
+ return unless $self->_mb_feature('HTML_support');
+
+ $self->depends_on('code');
+
+ foreach my $type ( qw(bin lib) ) {
+ my $files = $self->_find_pods( $self->{properties}{"${type}doc_dirs"},
+ exclude =>
+ [ file_qr('\.(?:bat|com|html)$') ] );
+ next unless %$files;
+
+ if ( $self->invoked_action eq 'html' ) {
+ $self->htmlify_pods( $type );
+ } elsif ( $self->_is_default_installable("${type}html") ) {
+ $self->htmlify_pods( $type );
+ }
+ }
+
+}
+
+
+# 1) If it's an ActiveState perl install, we need to run
+# ActivePerl::DocTools->UpdateTOC;
+# 2) Links to other modules are not being generated
+sub htmlify_pods {
+ my $self = shift;
+ my $type = shift;
+ my $htmldir = shift || File::Spec->catdir($self->blib, "${type}html");
+
+ require Module::Build::PodParser;
+ require Pod::Html;
+
+ $self->add_to_cleanup('pod2htm*');
+
+ my $pods = $self->_find_pods( $self->{properties}{"${type}doc_dirs"},
+ exclude => [ file_qr('\.(?:bat|com|html)$') ] );
+ return unless %$pods; # nothing to do
+
+ unless ( -d $htmldir ) {
+ File::Path::mkpath($htmldir, 0, oct(755))
+ or die "Couldn't mkdir $htmldir: $!";
+ }
+
+ my @rootdirs = ($type eq 'bin') ? qw(bin) :
+ $self->installdirs eq 'core' ? qw(lib) : qw(site lib);
+
+ my $podpath = join ':',
+ map $_->[1],
+ grep -e $_->[0],
+ map [File::Spec->catdir($self->blib, $_), $_],
+ qw( script lib );
+
+ foreach my $pod ( keys %$pods ) {
+
+ my ($name, $path) = File::Basename::fileparse($pods->{$pod},
+ file_qr('\.(?:pm|plx?|pod)$'));
+ my @dirs = File::Spec->splitdir( File::Spec->canonpath( $path ) );
+ pop( @dirs ) if scalar(@dirs) && $dirs[-1] eq File::Spec->curdir;
+
+ my $fulldir = File::Spec->catfile($htmldir, @rootdirs, @dirs);
+ my $outfile = File::Spec->catfile($fulldir, "${name}.html");
+ my $infile = File::Spec->abs2rel($pod);
+
+ next if $self->up_to_date($infile, $outfile);
+
+ unless ( -d $fulldir ){
+ File::Path::mkpath($fulldir, 0, oct(755))
+ or die "Couldn't mkdir $fulldir: $!";
+ }
+
+ my $path2root = join( '/', ('..') x (@rootdirs+@dirs) );
+ my $htmlroot = join( '/',
+ ($path2root,
+ $self->installdirs eq 'core' ? () : qw(site) ) );
+
+ my $fh = IO::File->new($infile) or die "Can't read $infile: $!";
+ my $abstract = Module::Build::PodParser->new(fh => $fh)->get_abstract();
+
+ my $title = join( '::', (@dirs, $name) );
+ $title .= " - $abstract" if $abstract;
+
+ my @opts = (
+ '--flush',
+ "--title=$title",
+ "--podpath=$podpath",
+ "--infile=$infile",
+ "--outfile=$outfile",
+ '--podroot=' . $self->blib,
+ "--htmlroot=$htmlroot",
+ );
+
+ if ( eval{Pod::Html->VERSION(1.03)} ) {
+ push( @opts, ('--header', '--backlink=Back to Top') );
+ push( @opts, "--css=$path2root/" . $self->html_css) if $self->html_css;
+ }
+
+ $self->log_verbose("HTMLifying $infile -> $outfile\n");
+ $self->log_verbose("pod2html @opts\n");
+ eval { Pod::Html::pod2html(@opts); 1 }
+ or $self->log_warn("pod2html @opts failed: $@");
+ }
+
+}
+
+# Adapted from ExtUtils::MM_Unix
+sub man1page_name {
+ my $self = shift;
+ return File::Basename::basename( shift );
+}
+
+# Adapted from ExtUtils::MM_Unix and Pod::Man
+# Depending on M::B's dependency policy, it might make more sense to refactor
+# Pod::Man::begin_pod() to extract a name() methods, and use them...
+# -spurkis
+sub man3page_name {
+ my $self = shift;
+ my ($vol, $dirs, $file) = File::Spec->splitpath( shift );
+ my @dirs = File::Spec->splitdir( File::Spec->canonpath($dirs) );
+
+ # Remove known exts from the base name
+ $file =~ s/\.p(?:od|m|l)\z//i;
+
+ return join( $self->manpage_separator, @dirs, $file );
+}
+
+sub manpage_separator {
+ return '::';
+}
+
+# For systems that don't have 'diff' executable, should use Algorithm::Diff
+sub ACTION_diff {
+ my $self = shift;
+ $self->depends_on('build');
+ my $local_lib = File::Spec->rel2abs('lib');
+ my @myINC = grep {$_ ne $local_lib} @INC;
+
+ # The actual install destination might not be in @INC, so check there too.
+ push @myINC, map $self->install_destination($_), qw(lib arch);
+
+ my @flags = @{$self->{args}{ARGV}};
+ @flags = $self->split_like_shell($self->{args}{flags} || '') unless @flags;
+
+ my $installmap = $self->install_map;
+ delete $installmap->{read};
+ delete $installmap->{write};
+
+ my $text_suffix = file_qr('\.(pm|pod)$');
+
+ while (my $localdir = each %$installmap) {
+ my @localparts = File::Spec->splitdir($localdir);
+ my $files = $self->rscan_dir($localdir, sub {-f});
+
+ foreach my $file (@$files) {
+ my @parts = File::Spec->splitdir($file);
+ @parts = @parts[@localparts .. $#parts]; # Get rid of blib/lib or similar
+
+ my $installed = Module::Build::ModuleInfo->find_module_by_name(
+ join('::', @parts), \@myINC );
+ if (not $installed) {
+ print "Only in lib: $file\n";
+ next;
+ }
+
+ my $status = File::Compare::compare($installed, $file);
+ next if $status == 0; # Files are the same
+ die "Can't compare $installed and $file: $!" if $status == -1;
+
+ if ($file =~ $text_suffix) {
+ $self->do_system('diff', @flags, $installed, $file);
+ } else {
+ print "Binary files $file and $installed differ\n";
+ }
+ }
+ }
+}
+
+sub ACTION_pure_install {
+ shift()->depends_on('install');
+}
+
+sub ACTION_install {
+ my ($self) = @_;
+ require ExtUtils::Install;
+ $self->depends_on('build');
+ ExtUtils::Install::install($self->install_map, $self->verbose, 0, $self->{args}{uninst}||0);
+}
+
+sub ACTION_fakeinstall {
+ my ($self) = @_;
+ require ExtUtils::Install;
+ my $eui_version = ExtUtils::Install->VERSION;
+ if ( $eui_version < 1.32 ) {
+ $self->log_warn(
+ "The 'fakeinstall' action requires Extutils::Install 1.32 or later.\n"
+ . "(You only have version $eui_version)."
+ );
+ return;
+ }
+ $self->depends_on('build');
+ ExtUtils::Install::install($self->install_map, !$self->quiet, 1, $self->{args}{uninst}||0);
+}
+
+sub ACTION_versioninstall {
+ my ($self) = @_;
+
+ die "You must have only.pm 0.25 or greater installed for this operation: $@\n"
+ unless eval { require only; 'only'->VERSION(0.25); 1 };
+
+ $self->depends_on('build');
+
+ my %onlyargs = map {exists($self->{args}{$_}) ? ($_ => $self->{args}{$_}) : ()}
+ qw(version versionlib);
+ only::install::install(%onlyargs);
+}
+
+sub ACTION_installdeps {
+ my ($self) = @_;
+
+ # XXX include feature prerequisites as optional prereqs?
+
+ my $info = $self->_enum_prereqs;
+ if (! $info ) {
+ $self->log_info( "No prerequisites detected\n" );
+ return;
+ }
+
+ my $failures = $self->prereq_failures($info);
+ if ( ! $failures ) {
+ $self->log_info( "All prerequisites satisfied\n" );
+ return;
+ }
+
+ my @install;
+ while (my ($type, $prereqs) = each %$failures) {
+ if($type =~ m/^(?:\w+_)?requires$/) {
+ push(@install, keys %$prereqs);
+ next;
+ }
+ $self->log_info("Checking optional dependencies:\n");
+ while (my ($module, $status) = each %$prereqs) {
+ push(@install, $module) if($self->y_n("Install $module?", 'y'));
+ }
+ }
+
+ return unless @install;
+
+ my ($command, @opts) = $self->split_like_shell($self->cpan_client);
+
+ # relative command should be relative to our active Perl
+ # so we need to locate that command
+ if ( ! File::Spec->file_name_is_absolute( $command ) ) {
+ my @bindirs = File::Basename::dirname($self->perl);
+ push @bindirs, map {$self->config->{"install${_}bin"}} '','site','vendor';
+ for my $d ( @bindirs ) {
+ my $abs_cmd = $self->find_command(File::Spec->catfile( $d, $command ));
+ if ( defined $abs_cmd ) {
+ $command = $abs_cmd;
+ last;
+ }
+ }
+ }
+
+ if ( ! -x $command ) {
+ die "cpan_client '$command' is not executable\n";
+ }
+
+ $self->do_system($command, @opts, @install);
+}
+
+sub ACTION_clean {
+ my ($self) = @_;
+ $self->log_info("Cleaning up build files\n");
+ foreach my $item (map glob($_), $self->cleanup) {
+ $self->delete_filetree($item);
+ }
+}
+
+sub ACTION_realclean {
+ my ($self) = @_;
+ $self->depends_on('clean');
+ $self->log_info("Cleaning up configuration files\n");
+ $self->delete_filetree(
+ $self->config_dir, $self->mymetafile, $self->build_script
+ );
+}
+
+sub ACTION_ppd {
+ my ($self) = @_;
+
+ require Module::Build::PPMMaker;
+ my $ppd = Module::Build::PPMMaker->new();
+ my $file = $ppd->make_ppd(%{$self->{args}}, build => $self);
+ $self->add_to_cleanup($file);
+}
+
+sub ACTION_ppmdist {
+ my ($self) = @_;
+
+ $self->depends_on( 'build' );
+
+ my $ppm = $self->ppm_name;
+ $self->delete_filetree( $ppm );
+ $self->log_info( "Creating $ppm\n" );
+ $self->add_to_cleanup( $ppm, "$ppm.tar.gz" );
+
+ my %types = ( # translate types/dirs to those expected by ppm
+ lib => 'lib',
+ arch => 'arch',
+ bin => 'bin',
+ script => 'script',
+ bindoc => 'man1',
+ libdoc => 'man3',
+ binhtml => undef,
+ libhtml => undef,
+ );
+
+ foreach my $type ($self->install_types) {
+ next if exists( $types{$type} ) && !defined( $types{$type} );
+
+ my $dir = File::Spec->catdir( $self->blib, $type );
+ next unless -e $dir;
+
+ my $files = $self->rscan_dir( $dir );
+ foreach my $file ( @$files ) {
+ next unless -f $file;
+ my $rel_file =
+ File::Spec->abs2rel( File::Spec->rel2abs( $file ),
+ File::Spec->rel2abs( $dir ) );
+ my $to_file =
+ File::Spec->catfile( $ppm, 'blib',
+ exists( $types{$type} ) ? $types{$type} : $type,
+ $rel_file );
+ $self->copy_if_modified( from => $file, to => $to_file );
+ }
+ }
+
+ foreach my $type ( qw(bin lib) ) {
+ local $self->{properties}{html_css} = 'Active.css';
+ $self->htmlify_pods( $type, File::Spec->catdir($ppm, 'blib', 'html') );
+ }
+
+ # create a tarball;
+ # the directory tar'ed must be blib so we need to do a chdir first
+ my $target = File::Spec->catfile( File::Spec->updir, $ppm );
+ $self->_do_in_dir( $ppm, sub { $self->make_tarball( 'blib', $target ) } );
+
+ $self->depends_on( 'ppd' );
+
+ $self->delete_filetree( $ppm );
+}
+
+sub ACTION_pardist {
+ my ($self) = @_;
+
+ # Need PAR::Dist
+ if ( not eval { require PAR::Dist; PAR::Dist->VERSION(0.17) } ) {
+ $self->log_warn(
+ "In order to create .par distributions, you need to\n"
+ . "install PAR::Dist first."
+ );
+ return();
+ }
+
+ $self->depends_on( 'build' );
+
+ return PAR::Dist::blib_to_par(
+ name => $self->dist_name,
+ version => $self->dist_version,
+ );
+}
+
+sub ACTION_dist {
+ my ($self) = @_;
+
+ $self->depends_on('distdir');
+
+ my $dist_dir = $self->dist_dir;
+
+ $self->make_tarball($dist_dir);
+ $self->delete_filetree($dist_dir);
+}
+
+sub ACTION_distcheck {
+ my ($self) = @_;
+
+ $self->_check_manifest_skip unless $self->invoked_action eq 'distclean';
+
+ require ExtUtils::Manifest;
+ local $^W; # ExtUtils::Manifest is not warnings clean.
+ my ($missing, $extra) = ExtUtils::Manifest::fullcheck();
+
+ return unless @$missing || @$extra;
+
+ my $msg = "MANIFEST appears to be out of sync with the distribution\n";
+ if ( $self->invoked_action eq 'distcheck' ) {
+ die $msg;
+ } else {
+ warn $msg;
+ }
+}
+
+sub _check_mymeta_skip {
+ my $self = shift;
+ my $maniskip = shift || 'MANIFEST.SKIP';
+
+ require ExtUtils::Manifest;
+ local $^W; # ExtUtils::Manifest is not warnings clean.
+
+ # older ExtUtils::Manifest had a private _maniskip
+ my $skip_factory = ExtUtils::Manifest->can('maniskip')
+ || ExtUtils::Manifest->can('_maniskip');
+
+ my $mymetafile = $self->mymetafile;
+ # we can't check it, just add it anyway to be safe
+ unless ( $skip_factory && $skip_factory->($maniskip)->($mymetafile) ) {
+ $self->log_warn("File '$maniskip' does not include '$mymetafile'. Adding it now.\n");
+ $self->_append_maniskip("^$mymetafile\$", $maniskip);
+ }
+}
+
+sub _add_to_manifest {
+ my ($self, $manifest, $lines) = @_;
+ $lines = [$lines] unless ref $lines;
+
+ my $existing_files = $self->_read_manifest($manifest);
+ return unless defined( $existing_files );
+
+ @$lines = grep {!exists $existing_files->{$_}} @$lines
+ or return;
+
+ my $mode = (stat $manifest)[2];
+ chmod($mode | oct(222), $manifest) or die "Can't make $manifest writable: $!";
+
+ my $fh = IO::File->new("< $manifest") or die "Can't read $manifest: $!";
+ my $last_line = (<$fh>)[-1] || "\n";
+ my $has_newline = $last_line =~ /\n$/;
+ $fh->close;
+
+ $fh = IO::File->new(">> $manifest") or die "Can't write to $manifest: $!";
+ print $fh "\n" unless $has_newline;
+ print $fh map "$_\n", @$lines;
+ close $fh;
+ chmod($mode, $manifest);
+
+ $self->log_verbose(map "Added to $manifest: $_\n", @$lines);
+}
+
+sub _sign_dir {
+ my ($self, $dir) = @_;
+
+ unless (eval { require Module::Signature; 1 }) {
+ $self->log_warn("Couldn't load Module::Signature for 'distsign' action:\n $@\n");
+ return;
+ }
+
+ # Add SIGNATURE to the MANIFEST
+ {
+ my $manifest = File::Spec->catfile($dir, 'MANIFEST');
+ die "Signing a distribution requires a MANIFEST file" unless -e $manifest;
+ $self->_add_to_manifest($manifest, "SIGNATURE Added here by Module::Build");
+ }
+
+ # Would be nice if Module::Signature took a directory argument.
+
+ $self->_do_in_dir($dir, sub {local $Module::Signature::Quiet = 1; Module::Signature::sign()});
+}
+
+sub _do_in_dir {
+ my ($self, $dir, $do) = @_;
+
+ my $start_dir = $self->cwd;
+ chdir $dir or die "Can't chdir() to $dir: $!";
+ eval {$do->()};
+ my @err = $@ ? ($@) : ();
+ chdir $start_dir or push @err, "Can't chdir() back to $start_dir: $!";
+ die join "\n", @err if @err;
+}
+
+sub ACTION_distsign {
+ my ($self) = @_;
+ {
+ local $self->{properties}{sign} = 0; # We'll sign it ourselves
+ $self->depends_on('distdir') unless -d $self->dist_dir;
+ }
+ $self->_sign_dir($self->dist_dir);
+}
+
+sub ACTION_skipcheck {
+ my ($self) = @_;
+
+ require ExtUtils::Manifest;
+ local $^W; # ExtUtils::Manifest is not warnings clean.
+ ExtUtils::Manifest::skipcheck();
+}
+
+sub ACTION_distclean {
+ my ($self) = @_;
+
+ $self->depends_on('realclean');
+ $self->depends_on('distcheck');
+}
+
+sub do_create_makefile_pl {
+ my $self = shift;
+ require Module::Build::Compat;
+ $self->log_info("Creating Makefile.PL\n");
+ Module::Build::Compat->create_makefile_pl($self->create_makefile_pl, $self, @_);
+ $self->_add_to_manifest('MANIFEST', 'Makefile.PL');
+}
+
+sub do_create_license {
+ my $self = shift;
+ $self->log_info("Creating LICENSE file\n");
+
+ if ( ! $self->_mb_feature('license_creation') ) {
+ $self->_warn_mb_feature_deps('license_creation');
+ die "Aborting.\n";
+ }
+
+ my $l = $self->license
+ or die "No license specified";
+
+ my $key = $self->valid_licenses->{$l}
+ or die "'$l' isn't a license key we know about";
+ my $class = "Software::License::$key";
+
+ eval "use $class; 1"
+ or die "Can't load Software::License::$key to create LICENSE file: $@";
+
+ $self->delete_filetree('LICENSE');
+
+ my $author = join " & ", @{ $self->dist_author };
+ my $license = $class->new({holder => $author});
+ my $fh = IO::File->new('> LICENSE')
+ or die "Can't write LICENSE file: $!";
+ print $fh $license->fulltext;
+ close $fh;
+
+ $self->_add_to_manifest('MANIFEST', 'LICENSE');
+}
+
+sub do_create_readme {
+ my $self = shift;
+ $self->delete_filetree('README');
+
+ my $docfile = $self->_main_docfile;
+ unless ( $docfile ) {
+ $self->log_warn(<<EOF);
+Cannot create README: can't determine which file contains documentation;
+Must supply either 'dist_version_from', or 'module_name' parameter.
+EOF
+ return;
+ }
+
+ # work around some odd Pod::Readme->new() failures in test reports by
+ # confirming that new() is available
+ if ( eval {require Pod::Readme; Pod::Readme->can('new') } ) {
+ $self->log_info("Creating README using Pod::Readme\n");
+
+ my $parser = Pod::Readme->new;
+ $parser->parse_from_file($docfile, 'README', @_);
+
+ } elsif ( eval {require Pod::Text; 1} ) {
+ $self->log_info("Creating README using Pod::Text\n");
+
+ my $fh = IO::File->new('> README');
+ if ( defined($fh) ) {
+ local $^W = 0;
+ no strict "refs";
+
+ # work around bug in Pod::Text 3.01, which expects
+ # Pod::Simple::parse_file to take input and output filehandles
+ # when it actually only takes an input filehandle
+
+ my $old_parse_file;
+ $old_parse_file = \&{"Pod::Simple::parse_file"}
+ and
+ local *{"Pod::Simple::parse_file"} = sub {
+ my $self = shift;
+ $self->output_fh($_[1]) if $_[1];
+ $self->$old_parse_file($_[0]);
+ }
+ if $Pod::Text::VERSION
+ == 3.01; # Split line to avoid evil version-finder
+
+ Pod::Text::pod2text( $docfile, $fh );
+
+ $fh->close;
+ } else {
+ $self->log_warn(
+ "Cannot create 'README' file: Can't open file for writing\n" );
+ return;
+ }
+
+ } else {
+ $self->log_warn("Can't load Pod::Readme or Pod::Text to create README\n");
+ return;
+ }
+
+ $self->_add_to_manifest('MANIFEST', 'README');
+}
+
+sub _main_docfile {
+ my $self = shift;
+ if ( my $pm_file = $self->dist_version_from ) {
+ (my $pod_file = $pm_file) =~ s/.pm$/.pod/;
+ return (-e $pod_file ? $pod_file : $pm_file);
+ } else {
+ return undef;
+ }
+}
+
+sub do_create_bundle_inc {
+ my $self = shift;
+ my $dist_inc = File::Spec->catdir( $self->dist_dir, 'inc' );
+ require inc::latest;
+ inc::latest->write($dist_inc, @{$self->bundle_inc_preload});
+ inc::latest->bundle_module($_, $dist_inc) for @{$self->bundle_inc};
+ return 1;
+}
+
+sub ACTION_distdir {
+ my ($self) = @_;
+
+ if ( @{$self->bundle_inc} && ! $self->_mb_feature('inc_bundling_support') ) {
+ $self->_warn_mb_feature_deps('inc_bundling_support');
+ die "Aborting.\n";
+ }
+
+ $self->depends_on('distmeta');
+
+ # Must not include MYMETA
+ $self->_check_mymeta_skip('MANIFEST.SKIP');
+
+ my $dist_files = $self->_read_manifest('MANIFEST')
+ or die "Can't create distdir without a MANIFEST file - run 'manifest' action first.\n";
+ delete $dist_files->{SIGNATURE}; # Don't copy, create a fresh one
+ die "No files found in MANIFEST - try running 'manifest' action?\n"
+ unless ($dist_files and keys %$dist_files);
+ my $metafile = $self->metafile;
+ $self->log_warn("*** Did you forget to add $metafile to the MANIFEST?\n")
+ unless exists $dist_files->{$metafile};
+
+ my $dist_dir = $self->dist_dir;
+ $self->delete_filetree($dist_dir);
+ $self->log_info("Creating $dist_dir\n");
+ $self->add_to_cleanup($dist_dir);
+
+ foreach my $file (keys %$dist_files) {
+ my $new = $self->copy_if_modified(from => $file, to_dir => $dist_dir, verbose => 0);
+ }
+
+ $self->do_create_bundle_inc if @{$self->bundle_inc};
+
+ $self->_sign_dir($dist_dir) if $self->{properties}{sign};
+}
+
+sub ACTION_disttest {
+ my ($self) = @_;
+
+ $self->depends_on('distdir');
+
+ $self->_do_in_dir
+ ( $self->dist_dir,
+ sub {
+ # XXX could be different names for scripts
+
+ $self->run_perl_script('Build.PL') # XXX Should this be run w/ --nouse-rcfile
+ or die "Error executing 'Build.PL' in dist directory: $!";
+ $self->run_perl_script('Build')
+ or die "Error executing 'Build' in dist directory: $!";
+ $self->run_perl_script('Build', [], ['test'])
+ or die "Error executing 'Build test' in dist directory";
+ });
+}
+
+
+=begin private
+
+ my $has_include = $build->_eumanifest_has_include;
+
+Returns true if the installed version of ExtUtils::Manifest supports
+#include and #include_default directives. False otherwise.
+
+=end private
+
+=cut
+
+# #!include and #!include_default were added in 1.50
+sub _eumanifest_has_include {
+ my $self = shift;
+
+ require ExtUtils::Manifest;
+ return eval { ExtUtils::Manifest->VERSION(1.50); 1 };
+}
+
+
+=begin private
+
+ my $maniskip_file = $build->_default_maniskip;
+
+Returns the location of the installed MANIFEST.SKIP file used by
+default.
+
+=end private
+
+=cut
+
+sub _default_maniskip {
+ my $self = shift;
+
+ my $default_maniskip;
+ for my $dir (@INC) {
+ $default_maniskip = File::Spec->catfile($dir, "ExtUtils", "MANIFEST.SKIP");
+ last if -r $default_maniskip;
+ }
+
+ return $default_maniskip;
+}
+
+
+=begin private
+
+ my $content = $build->_slurp($file);
+
+Reads $file and returns the $content.
+
+=end private
+
+=cut
+
+sub _slurp {
+ my $self = shift;
+ my $file = shift;
+ open my $fh, "<", $file or croak "Can't open $file: $!";
+ local $/;
+ return <$fh>;
+}
+
+
+
+sub _append_maniskip {
+ my $self = shift;
+ my $skip = shift;
+ my $file = shift || 'MANIFEST.SKIP';
+ return unless defined $skip && length $skip;
+ my $fh = IO::File->new(">> $file")
+ or die "Can't open $file: $!";
+
+ print $fh "$skip\n";
+ $fh->close();
+}
+
+sub _write_default_maniskip {
+ my $self = shift;
+ my $file = shift || 'MANIFEST.SKIP';
+ my $fh = IO::File->new("> $file")
+ or die "Can't open $file: $!";
+
+ my $content = $self->_eumanifest_has_include ? "#!include_default\n"
+ : $self->_slurp( $self->_default_maniskip );
+
+ $content .= <<'EOF';
+# Avoid configuration metadata file
+^MYMETA\.
+
+# Avoid Module::Build generated and utility files.
+\bBuild$
+\bBuild.bat$
+\b_build
+\bBuild.COM$
+\bBUILD.COM$
+\bbuild.com$
+^MANIFEST\.SKIP
+
+# Avoid archives of this distribution
+EOF
+
+ # Skip, for example, 'Module-Build-0.27.tar.gz'
+ $content .= '\b'.$self->dist_name.'-[\d\.\_]+'."\n";
+
+ print $fh $content;
+
+ return;
+}
+
+sub _check_manifest_skip {
+ my ($self) = @_;
+
+ my $maniskip = 'MANIFEST.SKIP';
+
+ if ( ! -e $maniskip ) {
+ $self->log_warn("File '$maniskip' does not exist: Creating a temporary '$maniskip'\n");
+ $self->_write_default_maniskip($maniskip);
+ $self->add_to_cleanup($maniskip);
+ }
+ else {
+ # MYMETA must not be added to MANIFEST, so always confirm the skip
+ $self->_check_mymeta_skip( $maniskip );
+ }
+
+ return;
+}
+
+sub ACTION_manifest {
+ my ($self) = @_;
+
+ $self->_check_manifest_skip;
+
+ require ExtUtils::Manifest; # ExtUtils::Manifest is not warnings clean.
+ local ($^W, $ExtUtils::Manifest::Quiet) = (0,1);
+ ExtUtils::Manifest::mkmanifest();
+}
+
+# Case insensitive regex for files
+sub file_qr {
+ return File::Spec->case_tolerant ? qr($_[0])i : qr($_[0]);
+}
+
+sub dist_dir {
+ my ($self) = @_;
+ return join "-", $self->dist_name, $self->dist_version;
+}
+
+sub ppm_name {
+ my $self = shift;
+ return 'PPM-' . $self->dist_dir;
+}
+
+sub _files_in {
+ my ($self, $dir) = @_;
+ return unless -d $dir;
+
+ local *DH;
+ opendir DH, $dir or die "Can't read directory $dir: $!";
+
+ my @files;
+ while (defined (my $file = readdir DH)) {
+ my $full_path = File::Spec->catfile($dir, $file);
+ next if -d $full_path;
+ push @files, $full_path;
+ }
+ return @files;
+}
+
+sub share_dir {
+ my $self = shift;
+ my $p = $self->{properties};
+
+ $p->{share_dir} = shift if @_;
+
+ # Always coerce to proper hash form
+ if ( ! defined $p->{share_dir} ) {
+ return;
+ }
+ elsif ( ! ref $p->{share_dir} ) {
+ # scalar -- treat as a single 'dist' directory
+ $p->{share_dir} = { dist => [ $p->{share_dir} ] };
+ }
+ elsif ( ref $p->{share_dir} eq 'ARRAY' ) {
+ # array -- treat as a list of 'dist' directories
+ $p->{share_dir} = { dist => $p->{share_dir} };
+ }
+ elsif ( ref $p->{share_dir} eq 'HASH' ) {
+ # hash -- check structure
+ my $share_dir = $p->{share_dir};
+ # check dist key
+ if ( defined $share_dir->{dist} ) {
+ if ( ! ref $share_dir->{dist} ) {
+ # scalar, so upgrade to arrayref
+ $share_dir->{dist} = [ $share_dir->{dist} ];
+ }
+ elsif ( ref $share_dir->{dist} ne 'ARRAY' ) {
+ die "'dist' key in 'share_dir' must be scalar or arrayref";
+ }
+ }
+ # check module key
+ if ( defined $share_dir->{module} ) {
+ my $mod_hash = $share_dir->{module};
+ if ( ref $mod_hash eq 'HASH' ) {
+ for my $k ( keys %$mod_hash ) {
+ if ( ! ref $mod_hash->{$k} ) {
+ $mod_hash->{$k} = [ $mod_hash->{$k} ];
+ }
+ elsif( ref $mod_hash->{$k} ne 'ARRAY' ) {
+ die "modules in 'module' key of 'share_dir' must be scalar or arrayref";
+ }
+ }
+ }
+ else {
+ die "'module' key in 'share_dir' must be hashref";
+ }
+ }
+ }
+ else {
+ die "'share_dir' must be hashref, arrayref or string";
+ }
+
+ return $p->{share_dir};
+}
+
+sub script_files {
+ my $self = shift;
+
+ for ($self->{properties}{script_files}) {
+ $_ = shift if @_;
+ next unless $_;
+
+ # Always coerce into a hash
+ return $_ if UNIVERSAL::isa($_, 'HASH');
+ return $_ = { map {$_,1} @$_ } if UNIVERSAL::isa($_, 'ARRAY');
+
+ die "'script_files' must be a hashref, arrayref, or string" if ref();
+
+ return $_ = { map {$_,1} $self->_files_in( $_ ) } if -d $_;
+ return $_ = {$_ => 1};
+ }
+
+ my %pl_files = map {
+ File::Spec->canonpath( File::Spec->case_tolerant ? uc $_ : $_ ) => 1
+ } keys %{ $self->PL_files || {} };
+
+ my @bin_files = $self->_files_in('bin');
+
+ my %bin_map = map {
+ $_ => File::Spec->canonpath( File::Spec->case_tolerant ? uc $_ : $_ )
+ } @bin_files;
+
+ return $_ = { map {$_ => 1} grep !$pl_files{$bin_map{$_}}, @bin_files };
+}
+BEGIN { *scripts = \&script_files; }
+
+{
+ my %licenses = (
+ perl => 'Perl_5',
+ apache => 'Apache_2_0',
+ apache_1_1 => 'Apache_1_1',
+ artistic => 'Artistic_1_0',
+ artistic_2 => 'Artistic_2_0',
+ lgpl => 'LGPL_2_1',
+ lgpl2 => 'LGPL_2_1',
+ lgpl3 => 'LGPL_3_0',
+ bsd => 'BSD',
+ gpl => 'GPL_1',
+ gpl2 => 'GPL_2',
+ gpl3 => 'GPL_3',
+ mit => 'MIT',
+ mozilla => 'Mozilla_1_1',
+ open_source => undef,
+ unrestricted => undef,
+ restrictive => undef,
+ unknown => undef,
+ );
+
+ # TODO - would be nice to not have these here, since they're more
+ # properly stored only in Software::License
+ my %license_urls = (
+ perl => 'http://dev.perl.org/licenses/',
+ apache => 'http://apache.org/licenses/LICENSE-2.0',
+ apache_1_1 => 'http://apache.org/licenses/LICENSE-1.1',
+ artistic => 'http://opensource.org/licenses/artistic-license.php',
+ artistic_2 => 'http://opensource.org/licenses/artistic-license-2.0.php',
+ lgpl => 'http://opensource.org/licenses/lgpl-license.php',
+ lgpl2 => 'http://opensource.org/licenses/lgpl-2.1.php',
+ lgpl3 => 'http://opensource.org/licenses/lgpl-3.0.html',
+ bsd => 'http://opensource.org/licenses/bsd-license.php',
+ gpl => 'http://opensource.org/licenses/gpl-license.php',
+ gpl2 => 'http://opensource.org/licenses/gpl-2.0.php',
+ gpl3 => 'http://opensource.org/licenses/gpl-3.0.html',
+ mit => 'http://opensource.org/licenses/mit-license.php',
+ mozilla => 'http://opensource.org/licenses/mozilla1.1.php',
+ open_source => undef,
+ unrestricted => undef,
+ restrictive => undef,
+ unknown => undef,
+ );
+ sub valid_licenses {
+ return \%licenses;
+ }
+ sub _license_url {
+ return $license_urls{$_[1]};
+ }
+}
+
+sub _hash_merge {
+ my ($self, $h, $k, $v) = @_;
+ if (ref $h->{$k} eq 'ARRAY') {
+ push @{$h->{$k}}, ref $v ? @$v : $v;
+ } elsif (ref $h->{$k} eq 'HASH') {
+ $h->{$k}{$_} = $v->{$_} foreach keys %$v;
+ } else {
+ $h->{$k} = $v;
+ }
+}
+
+sub ACTION_distmeta {
+ my ($self) = @_;
+
+ $self->do_create_makefile_pl if $self->create_makefile_pl;
+ $self->do_create_readme if $self->create_readme;
+ $self->do_create_license if $self->create_license;
+ $self->do_create_metafile;
+}
+
+sub do_create_metafile {
+ my $self = shift;
+ return if $self->{wrote_metadata};
+
+ my $p = $self->{properties};
+ my $metafile = $self->metafile;
+
+ unless ($p->{license}) {
+ $self->log_warn("No license specified, setting license = 'unknown'\n");
+ $p->{license} = 'unknown';
+ }
+ unless (exists $self->valid_licenses->{ $p->{license} }) {
+ die "Unknown license type '$p->{license}'";
+ }
+
+ # If we're in the distdir, the metafile may exist and be non-writable.
+ $self->delete_filetree($metafile);
+ $self->log_info("Creating $metafile\n");
+
+ # Since we're building ourself, we have to do some special stuff
+ # here: the ConfigData module is found in blib/lib.
+ local @INC = @INC;
+ if (($self->module_name || '') eq 'Module::Build') {
+ $self->depends_on('config_data');
+ push @INC, File::Spec->catdir($self->blib, 'lib');
+ }
+
+ if ($self->write_metafile($self->metafile,$self->get_metadata(fatal=>1))){
+ $self->{wrote_metadata} = 1;
+ $self->_add_to_manifest('MANIFEST', $metafile);
+ }
+
+ return 1;
+}
+
+sub read_metafile {
+ my $self = shift;
+ my ($metafile) = @_;
+ my $yaml;
+
+ my $class = $self->_mb_feature('YAML_support')
+ ? 'YAML::Tiny' : 'Module::Build::YAML' ;
+
+ eval "require $class; 1" or die $@;
+ my $meta = $class->read($metafile)
+ or $self->log_warn( "Error reading '$metafile': " . $class->errstr . "\n");
+
+ return $meta->[0] || {};
+}
+
+sub write_metafile {
+ my $self = shift;
+ my ($metafile, $node) = @_;
+ my $yaml;
+
+ if ($self->_mb_feature('YAML_support')) {
+ # XXX this is probably redundant, but stick with it
+ require YAML::Tiny;
+ $yaml = YAML::Tiny->new($node);
+ } else {
+ require Module::Build::YAML;
+ $yaml = Module::Build::YAML->new($node);
+ }
+ my $result = $yaml->write($metafile)
+ or $self->log_warn( "Error writing '$metafile': " . $yaml->errstr . "\n");
+ return $result;
+}
+
+sub normalize_version {
+ my ($self, $version) = @_;
+ if ( $version =~ /[=<>!,]/ ) { # logic, not just version
+ # take as is without modification
+ }
+ elsif ( ref $version eq 'version' ||
+ ref $version eq 'Module::Build::Version' ) { # version objects
+ $version = $version->is_qv ? $version->normal : $version->stringify;
+ }
+ elsif ( $version =~ /^[^v][^.]*\.[^.]+\./ ) { # no leading v, multiple dots
+ # normalize string tuples without "v": "1.2.3" -> "v1.2.3"
+ $version = "v$version";
+ }
+ else {
+ # leave alone
+ }
+ return $version;
+}
+
+sub _normalize_prereqs {
+ my ($self) = @_;
+ my $p = $self->{properties};
+
+ # copy prereq data structures so we can modify them before writing to META
+ my %prereq_types;
+ for my $type ( 'configure_requires', @{$self->prereq_action_types} ) {
+ if (exists $p->{$type}) {
+ for my $mod ( keys %{ $p->{$type} } ) {
+ $prereq_types{$type}{$mod} =
+ $self->normalize_version($p->{$type}{$mod});
+ }
+ }
+ }
+ return \%prereq_types;
+}
+
+
+# wrapper around old prepare_metadata API;
+sub get_metadata {
+ my ($self, %args) = @_;
+ my $metadata = {};
+ $self->prepare_metadata( $metadata, undef, \%args );
+ return $metadata;
+}
+
+# To preserve compatibility with old API, $node *must* be a hashref
+# passed in to prepare_metadata. $keys is an arrayref holding a
+# list of keys -- it's use is optional and generally no longer needed
+# but kept for back compatibility. $args is an optional parameter to
+# support the new 'fatal' toggle
+
+sub prepare_metadata {
+ my ($self, $node, $keys, $args) = @_;
+ unless ( ref $node eq 'HASH' ) {
+ croak "prepare_metadata() requires a hashref argument to hold output\n";
+ }
+ my $fatal = $args->{fatal} || 0;
+ my $p = $self->{properties};
+
+ # A little helper sub
+ my $add_node = sub {
+ my ($name, $val) = @_;
+ $node->{$name} = $val;
+ push @$keys, $name if $keys;
+ };
+
+ foreach (qw(dist_name dist_version dist_author dist_abstract license)) {
+ (my $name = $_) =~ s/^dist_//;
+ $add_node->($name, $self->$_());
+ unless ( defined($node->{$name}) && length($node->{$name}) ) {
+ my $err = "ERROR: Missing required field '$_' for metafile\n";
+ if ( $fatal ) {
+ die $err;
+ }
+ else {
+ $self->log_warn($err);
+ }
+ }
+ }
+ $node->{version} = $self->normalize_version($node->{version});
+
+ if (defined( my $l = $self->license )) {
+ unless ( exists $self->valid_licenses->{ $l } ) {
+ my $err = "Unknown license string '$l'";
+ if ( $fatal ) {
+ die $err;
+ }
+ else {
+ $self->log_warn($err);
+ }
+ }
+
+ if (my $key = $self->valid_licenses->{ $l }) {
+ my $class = "Software::License::$key";
+ if (eval "require Software::License; require $class; 1") {
+ # S::L requires a 'holder' key
+ $node->{resources}{license} = $class->new({holder=>"nobody"})->url;
+ }
+ else {
+ $node->{resources}{license} = $self->_license_url($l);
+ }
+ }
+ # XXX we are silently omitting the url for any unknown license
+ }
+
+
+ my $prereqs = $self->_normalize_prereqs;
+ for my $t ( keys %$prereqs ) {
+ $add_node->($t, $prereqs->{$t});
+ }
+
+ if (exists $p->{dynamic_config}) {
+ $add_node->('dynamic_config', $p->{dynamic_config});
+ }
+ my $pkgs = eval { $self->find_dist_packages };
+ if ($@) {
+ $self->log_warn("$@\nWARNING: Possible missing or corrupt 'MANIFEST' file.\n" .
+ "Nothing to enter for 'provides' field in metafile.\n");
+ } else {
+ $node->{provides} = $pkgs if %$pkgs;
+ }
+;
+ if (exists $p->{no_index}) {
+ $add_node->('no_index', $p->{no_index});
+ }
+
+ $add_node->('generated_by', "Module::Build version $Module::Build::VERSION");
+
+ $add_node->('meta-spec',
+ {version => '1.4',
+ url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
+ });
+
+ while (my($k, $v) = each %{$self->meta_add}) {
+ $add_node->($k, $v);
+ }
+
+ while (my($k, $v) = each %{$self->meta_merge}) {
+ $self->_hash_merge($node, $k, $v);
+ }
+
+ return $node;
+}
+
+sub _read_manifest {
+ my ($self, $file) = @_;
+ return undef unless -e $file;
+
+ require ExtUtils::Manifest; # ExtUtils::Manifest is not warnings clean.
+ local ($^W, $ExtUtils::Manifest::Quiet) = (0,1);
+ return scalar ExtUtils::Manifest::maniread($file);
+}
+
+sub find_dist_packages {
+ my $self = shift;
+
+ # Only packages in .pm files are candidates for inclusion here.
+ # Only include things in the MANIFEST, not things in developer's
+ # private stock.
+
+ my $manifest = $self->_read_manifest('MANIFEST')
+ or die "Can't find dist packages without a MANIFEST file\nRun 'Build manifest' to generate one\n";
+
+ # Localize
+ my %dist_files = map { $self->localize_file_path($_) => $_ }
+ keys %$manifest;
+
+ my @pm_files = grep { $_ !~ m{^t} } # skip things in t/
+ grep {exists $dist_files{$_}}
+ keys %{ $self->find_pm_files };
+
+ return $self->find_packages_in_files(\@pm_files, \%dist_files);
+}
+
+sub find_packages_in_files {
+ my ($self, $file_list, $filename_map) = @_;
+
+ # First, we enumerate all packages & versions,
+ # separating into primary & alternative candidates
+ my( %prime, %alt );
+ foreach my $file (@{$file_list}) {
+ my $mapped_filename = $filename_map->{$file};
+ my @path = split( /\//, $mapped_filename );
+ (my $prime_package = join( '::', @path[1..$#path] )) =~ s/\.pm$//;
+
+ my $pm_info = Module::Build::ModuleInfo->new_from_file( $file );
+
+ foreach my $package ( $pm_info->packages_inside ) {
+ next if $package eq 'main'; # main can appear numerous times, ignore
+ next if $package eq 'DB'; # special debugging package, ignore
+ next if grep /^_/, split( /::/, $package ); # private package, ignore
+
+ my $version = $pm_info->version( $package );
+
+ if ( $package eq $prime_package ) {
+ if ( exists( $prime{$package} ) ) {
+ # M::B::ModuleInfo will handle this conflict
+ die "Unexpected conflict in '$package'; multiple versions found.\n";
+ } else {
+ $prime{$package}{file} = $mapped_filename;
+ $prime{$package}{version} = $version if defined( $version );
+ }
+ } else {
+ push( @{$alt{$package}}, {
+ file => $mapped_filename,
+ version => $version,
+ } );
+ }
+ }
+ }
+
+ # Then we iterate over all the packages found above, identifying conflicts
+ # and selecting the "best" candidate for recording the file & version
+ # for each package.
+ foreach my $package ( keys( %alt ) ) {
+ my $result = $self->_resolve_module_versions( $alt{$package} );
+
+ if ( exists( $prime{$package} ) ) { # primary package selected
+
+ if ( $result->{err} ) {
+ # Use the selected primary package, but there are conflicting
+ # errors among multiple alternative packages that need to be
+ # reported
+ $self->log_warn(
+ "Found conflicting versions for package '$package'\n" .
+ " $prime{$package}{file} ($prime{$package}{version})\n" .
+ $result->{err}
+ );
+
+ } elsif ( defined( $result->{version} ) ) {
+ # There is a primary package selected, and exactly one
+ # alternative package
+
+ if ( exists( $prime{$package}{version} ) &&
+ defined( $prime{$package}{version} ) ) {
+ # Unless the version of the primary package agrees with the
+ # version of the alternative package, report a conflict
+ if ( $self->compare_versions( $prime{$package}{version}, '!=',
+ $result->{version} ) ) {
+ $self->log_warn(
+ "Found conflicting versions for package '$package'\n" .
+ " $prime{$package}{file} ($prime{$package}{version})\n" .
+ " $result->{file} ($result->{version})\n"
+ );
+ }
+
+ } else {
+ # The prime package selected has no version so, we choose to
+ # use any alternative package that does have a version
+ $prime{$package}{file} = $result->{file};
+ $prime{$package}{version} = $result->{version};
+ }
+
+ } else {
+ # no alt package found with a version, but we have a prime
+ # package so we use it whether it has a version or not
+ }
+
+ } else { # No primary package was selected, use the best alternative
+
+ if ( $result->{err} ) {
+ $self->log_warn(
+ "Found conflicting versions for package '$package'\n" .
+ $result->{err}
+ );
+ }
+
+ # Despite possible conflicting versions, we choose to record
+ # something rather than nothing
+ $prime{$package}{file} = $result->{file};
+ $prime{$package}{version} = $result->{version}
+ if defined( $result->{version} );
+ }
+ }
+
+ # Normalize versions. Can't use exists() here because of bug in YAML::Node.
+ # XXX "bug in YAML::Node" comment seems irrelvant -- dagolden, 2009-05-18
+ for (grep defined $_->{version}, values %prime) {
+ $_->{version} = $self->normalize_version( $_->{version} );
+ }
+
+ return \%prime;
+}
+
+# separate out some of the conflict resolution logic from
+# $self->find_dist_packages(), above, into a helper function.
+#
+sub _resolve_module_versions {
+ my $self = shift;
+
+ my $packages = shift;
+
+ my( $file, $version );
+ my $err = '';
+ foreach my $p ( @$packages ) {
+ if ( defined( $p->{version} ) ) {
+ if ( defined( $version ) ) {
+ if ( $self->compare_versions( $version, '!=', $p->{version} ) ) {
+ $err .= " $p->{file} ($p->{version})\n";
+ } else {
+ # same version declared multiple times, ignore
+ }
+ } else {
+ $file = $p->{file};
+ $version = $p->{version};
+ }
+ }
+ $file ||= $p->{file} if defined( $p->{file} );
+ }
+
+ if ( $err ) {
+ $err = " $file ($version)\n" . $err;
+ }
+
+ my %result = (
+ file => $file,
+ version => $version,
+ err => $err
+ );
+
+ return \%result;
+}
+
+sub make_tarball {
+ my ($self, $dir, $file) = @_;
+ $file ||= $dir;
+
+ $self->log_info("Creating $file.tar.gz\n");
+
+ if ($self->{args}{tar}) {
+ my $tar_flags = $self->verbose ? 'cvf' : 'cf';
+ $self->do_system($self->split_like_shell($self->{args}{tar}), $tar_flags, "$file.tar", $dir);
+ $self->do_system($self->split_like_shell($self->{args}{gzip}), "$file.tar") if $self->{args}{gzip};
+ } else {
+ eval { require Archive::Tar && Archive::Tar->VERSION(1.09); 1 }
+ or die "You must install Archive::Tar 1.09+ to make a distribution tarball\n".
+ "or specify a binary tar program with the '--tar' option.\n".
+ "See the documentation for the 'dist' action.\n";
+
+ my $files = $self->rscan_dir($dir);
+
+ # Archive::Tar versions >= 1.09 use the following to enable a compatibility
+ # hack so that the resulting archive is compatible with older clients.
+ # If no file path is 100 chars or longer, we disable the prefix field
+ # for maximum compatibility. If there are any long file paths then we
+ # need the prefix field after all.
+ $Archive::Tar::DO_NOT_USE_PREFIX =
+ (grep { length($_) >= 100 } @$files) ? 0 : 1;
+
+ my $tar = Archive::Tar->new;
+ $tar->add_files(@$files);
+ for my $f ($tar->get_files) {
+ $f->mode($f->mode & ~022); # chmod go-w
+ }
+ $tar->write("$file.tar.gz", 1);
+ }
+}
+
+sub install_path {
+ my $self = shift;
+ my( $type, $value ) = ( @_, '<empty>' );
+
+ Carp::croak( 'Type argument missing' )
+ unless defined( $type );
+
+ my $map = $self->{properties}{install_path};
+ return $map unless @_;
+
+ # delete existing value if $value is literal undef()
+ unless ( defined( $value ) ) {
+ delete( $map->{$type} );
+ return undef;
+ }
+
+ # return existing value if no new $value is given
+ if ( $value eq '<empty>' ) {
+ return undef unless exists $map->{$type};
+ return $map->{$type};
+ }
+
+ # set value if $value is a valid relative path
+ return $map->{$type} = $value;
+}
+
+sub install_sets {
+ # Usage: install_sets('site'), install_sets('site', 'lib'),
+ # or install_sets('site', 'lib' => $value);
+ my ($self, $dirs, $key, $value) = @_;
+ $dirs = $self->installdirs unless defined $dirs;
+ # update property before merging with defaults
+ if ( @_ == 4 && defined $dirs && defined $key) {
+ # $value can be undef; will mask default
+ $self->{properties}{install_sets}{$dirs}{$key} = $value;
+ }
+ my $map = { $self->_merge_arglist(
+ $self->{properties}{install_sets},
+ $self->_default_install_paths->{install_sets}
+ )};
+ if ( defined $dirs && defined $key ) {
+ return $map->{$dirs}{$key};
+ }
+ elsif ( defined $dirs ) {
+ return $map->{$dirs};
+ }
+ else {
+ croak "Can't determine installdirs for install_sets()";
+ }
+}
+
+sub original_prefix {
+ # Usage: original_prefix(), original_prefix('lib'),
+ # or original_prefix('lib' => $value);
+ my ($self, $key, $value) = @_;
+ # update property before merging with defaults
+ if ( @_ == 3 && defined $key) {
+ # $value can be undef; will mask default
+ $self->{properties}{original_prefix}{$key} = $value;
+ }
+ my $map = { $self->_merge_arglist(
+ $self->{properties}{original_prefix},
+ $self->_default_install_paths->{original_prefix}
+ )};
+ return $map unless defined $key;
+ return $map->{$key}
+}
+
+sub install_base_relpaths {
+ # Usage: install_base_relpaths(), install_base_relpaths('lib'),
+ # or install_base_relpaths('lib' => $value);
+ my $self = shift;
+ if ( @_ > 1 ) { # change values before merge
+ $self->_set_relpaths($self->{properties}{install_base_relpaths}, @_);
+ }
+ my $map = { $self->_merge_arglist(
+ $self->{properties}{install_base_relpaths},
+ $self->_default_install_paths->{install_base_relpaths}
+ )};
+ return $map unless @_;
+ my $relpath = $map->{$_[0]};
+ return defined $relpath ? File::Spec->catdir( @$relpath ) : undef;
+}
+
+# Defaults to use in case the config install paths cannot be prefixified.
+sub prefix_relpaths {
+ # Usage: prefix_relpaths('site'), prefix_relpaths('site', 'lib'),
+ # or prefix_relpaths('site', 'lib' => $value);
+ my $self = shift;
+ my $installdirs = shift || $self->installdirs
+ or croak "Can't determine installdirs for prefix_relpaths()";
+ if ( @_ > 1 ) { # change values before merge
+ $self->{properties}{prefix_relpaths}{$installdirs} ||= {};
+ $self->_set_relpaths($self->{properties}{prefix_relpaths}{$installdirs}, @_);
+ }
+ my $map = {$self->_merge_arglist(
+ $self->{properties}{prefix_relpaths}{$installdirs},
+ $self->_default_install_paths->{prefix_relpaths}{$installdirs}
+ )};
+ return $map unless @_;
+ my $relpath = $map->{$_[0]};
+ return defined $relpath ? File::Spec->catdir( @$relpath ) : undef;
+}
+
+sub _set_relpaths {
+ my $self = shift;
+ my( $map, $type, $value ) = @_;
+
+ Carp::croak( 'Type argument missing' )
+ unless defined( $type );
+
+ # set undef if $value is literal undef()
+ if ( ! defined( $value ) ) {
+ $map->{$type} = undef;
+ return;
+ }
+ # set value if $value is a valid relative path
+ else {
+ Carp::croak( "Value must be a relative path" )
+ if File::Spec::Unix->file_name_is_absolute($value);
+
+ my @value = split( /\//, $value );
+ $map->{$type} = \@value;
+ }
+}
+
+# Translated from ExtUtils::MM_Any::init_INSTALL_from_PREFIX
+sub prefix_relative {
+ my ($self, $type) = @_;
+ my $installdirs = $self->installdirs;
+
+ my $relpath = $self->install_sets($installdirs)->{$type};
+
+ return $self->_prefixify($relpath,
+ $self->original_prefix($installdirs),
+ $type,
+ );
+}
+
+# Translated from ExtUtils::MM_Unix::prefixify()
+sub _prefixify {
+ my($self, $path, $sprefix, $type) = @_;
+
+ my $rprefix = $self->prefix;
+ $rprefix .= '/' if $sprefix =~ m|/$|;
+
+ $self->log_verbose(" prefixify $path from $sprefix to $rprefix\n")
+ if defined( $path ) && length( $path );
+
+ if( !defined( $path ) || ( length( $path ) == 0 ) ) {
+ $self->log_verbose(" no path to prefixify, falling back to default.\n");
+ return $self->_prefixify_default( $type, $rprefix );
+ } elsif( !File::Spec->file_name_is_absolute($path) ) {
+ $self->log_verbose(" path is relative, not prefixifying.\n");
+ } elsif( $path !~ s{^\Q$sprefix\E\b}{}s ) {
+ $self->log_verbose(" cannot prefixify, falling back to default.\n");
+ return $self->_prefixify_default( $type, $rprefix );
+ }
+
+ $self->log_verbose(" now $path in $rprefix\n");
+
+ return $path;
+}
+
+sub _prefixify_default {
+ my $self = shift;
+ my $type = shift;
+ my $rprefix = shift;
+
+ my $default = $self->prefix_relpaths($self->installdirs, $type);
+ if( !$default ) {
+ $self->log_verbose(" no default install location for type '$type', using prefix '$rprefix'.\n");
+ return $rprefix;
+ } else {
+ return $default;
+ }
+}
+
+sub install_destination {
+ my ($self, $type) = @_;
+
+ return $self->install_path($type) if $self->install_path($type);
+
+ if ( $self->install_base ) {
+ my $relpath = $self->install_base_relpaths($type);
+ return $relpath ? File::Spec->catdir($self->install_base, $relpath) : undef;
+ }
+
+ if ( $self->prefix ) {
+ my $relpath = $self->prefix_relative($type);
+ return $relpath ? File::Spec->catdir($self->prefix, $relpath) : undef;
+ }
+
+ return $self->install_sets($self->installdirs)->{$type};
+}
+
+sub install_types {
+ my $self = shift;
+
+ my %types;
+ if ( $self->install_base ) {
+ %types = %{$self->install_base_relpaths};
+ } elsif ( $self->prefix ) {
+ %types = %{$self->prefix_relpaths};
+ } else {
+ %types = %{$self->install_sets($self->installdirs)};
+ }
+
+ %types = (%types, %{$self->install_path});
+
+ return sort keys %types;
+}
+
+sub install_map {
+ my ($self, $blib) = @_;
+ $blib ||= $self->blib;
+
+ my( %map, @skipping );
+ foreach my $type ($self->install_types) {
+ my $localdir = File::Spec->catdir( $blib, $type );
+ next unless -e $localdir;
+
+ if (my $dest = $self->install_destination($type)) {
+ $map{$localdir} = $dest;
+ } else {
+ push( @skipping, $type );
+ }
+ }
+
+ $self->log_warn(
+ "WARNING: Can't figure out install path for types: @skipping\n" .
+ "Files will not be installed.\n"
+ ) if @skipping;
+
+ # Write the packlist into the same place as ExtUtils::MakeMaker.
+ if ($self->create_packlist and my $module_name = $self->module_name) {
+ my $archdir = $self->install_destination('arch');
+ my @ext = split /::/, $module_name;
+ $map{write} = File::Spec->catfile($archdir, 'auto', @ext, '.packlist');
+ }
+
+ # Handle destdir
+ if (length(my $destdir = $self->destdir || '')) {
+ foreach (keys %map) {
+ # Need to remove volume from $map{$_} using splitpath, or else
+ # we'll create something crazy like C:\Foo\Bar\E:\Baz\Quux
+ # VMS will always have the file separate than the path.
+ my ($volume, $path, $file) = File::Spec->splitpath( $map{$_}, 0 );
+
+ # catdir needs a list of directories, or it will create something
+ # crazy like volume:[Foo.Bar.volume.Baz.Quux]
+ my @dirs = File::Spec->splitdir($path);
+
+ # First merge the directories
+ $path = File::Spec->catdir($destdir, @dirs);
+
+ # Then put the file back on if there is one.
+ if ($file ne '') {
+ $map{$_} = File::Spec->catfile($path, $file)
+ } else {
+ $map{$_} = $path;
+ }
+ }
+ }
+
+ $map{read} = ''; # To keep ExtUtils::Install quiet
+
+ return \%map;
+}
+
+sub depends_on {
+ my $self = shift;
+ foreach my $action (@_) {
+ $self->_call_action($action);
+ }
+}
+
+sub rscan_dir {
+ my ($self, $dir, $pattern) = @_;
+ my @result;
+ local $_; # find() can overwrite $_, so protect ourselves
+ my $subr = !$pattern ? sub {push @result, $File::Find::name} :
+ !ref($pattern) || (ref $pattern eq 'Regexp') ? sub {push @result, $File::Find::name if /$pattern/} :
+ ref($pattern) eq 'CODE' ? sub {push @result, $File::Find::name if $pattern->()} :
+ die "Unknown pattern type";
+
+ File::Find::find({wanted => $subr, no_chdir => 1}, $dir);
+ return \@result;
+}
+
+sub delete_filetree {
+ my $self = shift;
+ my $deleted = 0;
+ foreach (@_) {
+ next unless -e $_;
+ $self->log_verbose("Deleting $_\n");
+ File::Path::rmtree($_, 0, 0);
+ die "Couldn't remove '$_': $!\n" if -e $_;
+ $deleted++;
+ }
+ return $deleted;
+}
+
+sub autosplit_file {
+ my ($self, $file, $to) = @_;
+ require AutoSplit;
+ my $dir = File::Spec->catdir($to, 'lib', 'auto');
+ AutoSplit::autosplit($file, $dir);
+}
+
+sub cbuilder {
+ # Returns a CBuilder object
+
+ my $self = shift;
+ my $s = $self->{stash};
+ return $s->{_cbuilder} if $s->{_cbuilder};
+
+ require ExtUtils::CBuilder;
+ return $s->{_cbuilder} = ExtUtils::CBuilder->new(
+ config => $self->config,
+ ($self->quiet ? (quiet => 1 ) : ()),
+ );
+}
+
+sub have_c_compiler {
+ my ($self) = @_;
+
+ my $p = $self->{properties};
+ return $p->{_have_c_compiler} if defined $p->{_have_c_compiler};
+
+ $self->log_verbose("Checking if compiler tools configured... ");
+ my $b = eval { $self->cbuilder };
+ my $have = $b && eval { $b->have_compiler };
+ $self->log_verbose($have ? "ok.\n" : "failed.\n");
+ return $p->{_have_c_compiler} = $have;
+}
+
+sub compile_c {
+ my ($self, $file, %args) = @_;
+
+ if ( ! $self->have_c_compiler ) {
+ die "Error: no compiler detected to compile '$file'. Aborting\n";
+ }
+
+ my $b = $self->cbuilder;
+ my $obj_file = $b->object_file($file);
+ $self->add_to_cleanup($obj_file);
+ return $obj_file if $self->up_to_date($file, $obj_file);
+
+ $b->compile(source => $file,
+ defines => $args{defines},
+ object_file => $obj_file,
+ include_dirs => $self->include_dirs,
+ extra_compiler_flags => $self->extra_compiler_flags,
+ );
+
+ return $obj_file;
+}
+
+sub link_c {
+ my ($self, $spec) = @_;
+ my $p = $self->{properties}; # For convenience
+
+ $self->add_to_cleanup($spec->{lib_file});
+
+ my $objects = $p->{objects} || [];
+
+ return $spec->{lib_file}
+ if $self->up_to_date([$spec->{obj_file}, @$objects],
+ $spec->{lib_file});
+
+ my $module_name = $spec->{module_name} || $self->module_name;
+
+ $self->cbuilder->link(
+ module_name => $module_name,
+ objects => [$spec->{obj_file}, @$objects],
+ lib_file => $spec->{lib_file},
+ extra_linker_flags => $p->{extra_linker_flags} );
+
+ return $spec->{lib_file};
+}
+
+sub compile_xs {
+ my ($self, $file, %args) = @_;
+
+ $self->log_verbose("$file -> $args{outfile}\n");
+
+ if (eval {require ExtUtils::ParseXS; 1}) {
+
+ ExtUtils::ParseXS::process_file(
+ filename => $file,
+ prototypes => 0,
+ output => $args{outfile},
+ );
+ } else {
+ # Ok, I give up. Just use backticks.
+
+ my $xsubpp = Module::Build::ModuleInfo->find_module_by_name('ExtUtils::xsubpp')
+ or die "Can't find ExtUtils::xsubpp in INC (@INC)";
+
+ my @typemaps;
+ push @typemaps, Module::Build::ModuleInfo->find_module_by_name(
+ 'ExtUtils::typemap', \@INC
+ );
+ my $lib_typemap = Module::Build::ModuleInfo->find_module_by_name(
+ 'typemap', [File::Basename::dirname($file), File::Spec->rel2abs('.')]
+ );
+ push @typemaps, $lib_typemap if $lib_typemap;
+ @typemaps = map {+'-typemap', $_} @typemaps;
+
+ my $cf = $self->{config};
+ my $perl = $self->{properties}{perl};
+
+ my @command = ($perl, "-I".$cf->get('installarchlib'), "-I".$cf->get('installprivlib'), $xsubpp, '-noprototypes',
+ @typemaps, $file);
+
+ $self->log_info("@command\n");
+ my $fh = IO::File->new("> $args{outfile}") or die "Couldn't write $args{outfile}: $!";
+ print {$fh} $self->_backticks(@command);
+ close $fh;
+ }
+}
+
+sub split_like_shell {
+ my ($self, $string) = @_;
+
+ return () unless defined($string);
+ return @$string if UNIVERSAL::isa($string, 'ARRAY');
+ $string =~ s/^\s+|\s+$//g;
+ return () unless length($string);
+
+ return Text::ParseWords::shellwords($string);
+}
+
+sub oneliner {
+ # Returns a string that the shell can evaluate as a perl command.
+ # This should be avoided whenever possible, since "the shell" really
+ # means zillions of shells on zillions of platforms and it's really
+ # hard to get it right all the time.
+
+ # Some of this code is stolen with permission from ExtUtils::MakeMaker.
+
+ my($self, $cmd, $switches, $args) = @_;
+ $switches = [] unless defined $switches;
+ $args = [] unless defined $args;
+
+ # Strip leading and trailing newlines
+ $cmd =~ s{^\n+}{};
+ $cmd =~ s{\n+$}{};
+
+ my $perl = ref($self) ? $self->perl : $self->find_perl_interpreter;
+ return $self->_quote_args($perl, @$switches, '-e', $cmd, @$args);
+}
+
+sub run_perl_script {
+ my ($self, $script, $preargs, $postargs) = @_;
+ foreach ($preargs, $postargs) {
+ $_ = [ $self->split_like_shell($_) ] unless ref();
+ }
+ return $self->run_perl_command([@$preargs, $script, @$postargs]);
+}
+
+sub run_perl_command {
+ # XXX Maybe we should accept @args instead of $args? Must resolve
+ # this before documenting.
+ my ($self, $args) = @_;
+ $args = [ $self->split_like_shell($args) ] unless ref($args);
+ my $perl = ref($self) ? $self->perl : $self->find_perl_interpreter;
+
+ # Make sure our local additions to @INC are propagated to the subprocess
+ local $ENV{PERL5LIB} = join $self->config('path_sep'), $self->_added_to_INC;
+
+ return $self->do_system($perl, @$args);
+}
+
+# Infer various data from the path of the input filename
+# that is needed to create output files.
+# The input filename is expected to be of the form:
+# lib/Module/Name.ext or Module/Name.ext
+sub _infer_xs_spec {
+ my $self = shift;
+ my $file = shift;
+
+ my $cf = $self->{config};
+
+ my %spec;
+
+ my( $v, $d, $f ) = File::Spec->splitpath( $file );
+ my @d = File::Spec->splitdir( $d );
+ (my $file_base = $f) =~ s/\.[^.]+$//i;
+
+ $spec{base_name} = $file_base;
+
+ $spec{src_dir} = File::Spec->catpath( $v, $d, '' );
+
+ # the module name
+ shift( @d ) while @d && ($d[0] eq 'lib' || $d[0] eq '');
+ pop( @d ) while @d && $d[-1] eq '';
+ $spec{module_name} = join( '::', (@d, $file_base) );
+
+ $spec{archdir} = File::Spec->catdir($self->blib, 'arch', 'auto',
+ @d, $file_base);
+
+ $spec{bs_file} = File::Spec->catfile($spec{archdir}, "${file_base}.bs");
+
+ $spec{lib_file} = File::Spec->catfile($spec{archdir},
+ "${file_base}.".$cf->get('dlext'));
+
+ $spec{c_file} = File::Spec->catfile( $spec{src_dir},
+ "${file_base}.c" );
+
+ $spec{obj_file} = File::Spec->catfile( $spec{src_dir},
+ "${file_base}".$cf->get('obj_ext') );
+
+ return \%spec;
+}
+
+sub process_xs {
+ my ($self, $file) = @_;
+
+ my $spec = $self->_infer_xs_spec($file);
+
+ # File name, minus the suffix
+ (my $file_base = $file) =~ s/\.[^.]+$//;
+
+ # .xs -> .c
+ $self->add_to_cleanup($spec->{c_file});
+
+ unless ($self->up_to_date($file, $spec->{c_file})) {
+ $self->compile_xs($file, outfile => $spec->{c_file});
+ }
+
+ # .c -> .o
+ my $v = $self->dist_version;
+ $self->compile_c($spec->{c_file},
+ defines => {VERSION => qq{"$v"}, XS_VERSION => qq{"$v"}});
+
+ # archdir
+ File::Path::mkpath($spec->{archdir}, 0, oct(777)) unless -d $spec->{archdir};
+
+ # .xs -> .bs
+ $self->add_to_cleanup($spec->{bs_file});
+ unless ($self->up_to_date($file, $spec->{bs_file})) {
+ require ExtUtils::Mkbootstrap;
+ $self->log_info("ExtUtils::Mkbootstrap::Mkbootstrap('$spec->{bs_file}')\n");
+ ExtUtils::Mkbootstrap::Mkbootstrap($spec->{bs_file}); # Original had $BSLOADLIBS - what's that?
+ {my $fh = IO::File->new(">> $spec->{bs_file}")} # create
+ utime((time)x2, $spec->{bs_file}); # touch
+ }
+
+ # .o -> .(a|bundle)
+ $self->link_c($spec);
+}
+
+sub do_system {
+ my ($self, @cmd) = @_;
+ $self->log_verbose("@cmd\n");
+
+ # Some systems proliferate huge PERL5LIBs, try to ameliorate:
+ my %seen;
+ my $sep = $self->config('path_sep');
+ local $ENV{PERL5LIB} =
+ ( !exists($ENV{PERL5LIB}) ? '' :
+ length($ENV{PERL5LIB}) < 500
+ ? $ENV{PERL5LIB}
+ : join $sep, grep { ! $seen{$_}++ and -d $_ } split($sep, $ENV{PERL5LIB})
+ );
+
+ my $status = system(@cmd);
+ if ($status and $! =~ /Argument list too long/i) {
+ my $env_entries = '';
+ foreach (sort keys %ENV) { $env_entries .= "$_=>".length($ENV{$_})."; " }
+ warn "'Argument list' was 'too long', env lengths are $env_entries";
+ }
+ return !$status;
+}
+
+sub copy_if_modified {
+ my $self = shift;
+ my %args = (@_ > 3
+ ? ( @_ )
+ : ( from => shift, to_dir => shift, flatten => shift )
+ );
+ $args{verbose} = !$self->quiet
+ unless exists $args{verbose};
+
+ my $file = $args{from};
+ unless (defined $file and length $file) {
+ die "No 'from' parameter given to copy_if_modified";
+ }
+
+ # makes no sense to replicate an absolute path, so assume flatten
+ $args{flatten} = 1 if File::Spec->file_name_is_absolute( $file );
+
+ my $to_path;
+ if (defined $args{to} and length $args{to}) {
+ $to_path = $args{to};
+ } elsif (defined $args{to_dir} and length $args{to_dir}) {
+ $to_path = File::Spec->catfile( $args{to_dir}, $args{flatten}
+ ? File::Basename::basename($file)
+ : $file );
+ } else {
+ die "No 'to' or 'to_dir' parameter given to copy_if_modified";
+ }
+
+ return if $self->up_to_date($file, $to_path); # Already fresh
+
+ {
+ local $self->{properties}{quiet} = 1;
+ $self->delete_filetree($to_path); # delete destination if exists
+ }
+
+ # Create parent directories
+ File::Path::mkpath(File::Basename::dirname($to_path), 0, oct(777));
+
+ $self->log_verbose("Copying $file -> $to_path\n");
+
+ if ($^O eq 'os2') {# copy will not overwrite; 0x1 = overwrite
+ chmod 0666, $to_path;
+ File::Copy::syscopy($file, $to_path, 0x1) or die "Can't copy('$file', '$to_path'): $!";
+ } else {
+ File::Copy::copy($file, $to_path) or die "Can't copy('$file', '$to_path'): $!";
+ }
+
+ # mode is read-only + (executable if source is executable)
+ my $mode = oct(444) | ( $self->is_executable($file) ? oct(111) : 0 );
+ chmod( $mode, $to_path );
+
+ return $to_path;
+}
+
+sub up_to_date {
+ my ($self, $source, $derived) = @_;
+ $source = [$source] unless ref $source;
+ $derived = [$derived] unless ref $derived;
+
+ # empty $derived means $source should always run
+ return 0 if @$source && !@$derived || grep {not -e} @$derived;
+
+ my $most_recent_source = time / (24*60*60);
+ foreach my $file (@$source) {
+ unless (-e $file) {
+ $self->log_warn("Can't find source file $file for up-to-date check");
+ next;
+ }
+ $most_recent_source = -M _ if -M _ < $most_recent_source;
+ }
+
+ foreach my $derived (@$derived) {
+ return 0 if -M $derived > $most_recent_source;
+ }
+ return 1;
+}
+
+sub dir_contains {
+ my ($self, $first, $second) = @_;
+ # File::Spec doesn't have an easy way to check whether one directory
+ # is inside another, unfortunately.
+
+ ($first, $second) = map File::Spec->canonpath($_), ($first, $second);
+ my @first_dirs = File::Spec->splitdir($first);
+ my @second_dirs = File::Spec->splitdir($second);
+
+ return 0 if @second_dirs < @first_dirs;
+
+ my $is_same = ( File::Spec->case_tolerant
+ ? sub {lc(shift()) eq lc(shift())}
+ : sub {shift() eq shift()} );
+
+ while (@first_dirs) {
+ return 0 unless $is_same->(shift @first_dirs, shift @second_dirs);
+ }
+
+ return 1;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Base - Default methods for Module::Build
+
+=head1 SYNOPSIS
+
+ Please see the Module::Build documentation.
+
+=head1 DESCRIPTION
+
+The C<Module::Build::Base> module defines the core functionality of
+C<Module::Build>. Its methods may be overridden by any of the
+platform-dependent modules in the C<Module::Build::Platform::>
+namespace, but the intention here is to make this base module as
+platform-neutral as possible. Nicely enough, Perl has several core
+tools available in the C<File::> namespace for doing this, so the task
+isn't very difficult.
+
+Please see the C<Module::Build> documentation for more details.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Bundling.pod b/Master/tlpkg/tlperl.straw/lib/Module/Build/Bundling.pod
new file mode 100755
index 00000000000..5e7b9f98075
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Bundling.pod
@@ -0,0 +1,147 @@
+=head1 NAME
+
+Module::Build::Bundling - How to bundle Module::Build with a distribution
+
+=head1 SYNOPSIS
+
+ # Build.PL
+ use inc::latest 'Module::Build';
+
+ Module::Build->new(
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ )->create_build_script;
+
+=head1 DESCRIPTION
+
+B<WARNING -- THIS IS AN EXPERIMENTAL FEATURE>
+
+In order to install a distribution using Module::Build, users must
+have Module::Build available on their systems. There are two ways
+to do this. The first way is to include Module::Build in the
+C<configure_requires> metadata field. This field is supported by
+recent versions L<CPAN> and L<CPANPLUS> and is a standard feature
+in the Perl core as of Perl 5.10.1. Module::Build now adds itself
+to C<configure_requires> by default.
+
+The second way supports older Perls that have not upgraded CPAN or
+CPANPLUS and involves bundling an entire copy of Module::Build
+into the distribution's C<inc/> directory. This is the same approach
+used by L<Module::Install>, a modern wrapper around ExtUtils::MakeMaker
+for Makefile.PL based distributions.
+
+The "trick" to making this work for Module::Build is making sure the
+highest version Module::Build is used, whether this is in C<inc/> or
+already installed on the user's system. This ensures that all necessary
+features are available as well as any new bug fixes. This is done using
+the new L<inc::latest> module.
+
+A "normal" Build.PL looks like this (with only the minimum required
+fields):
+
+ use Module::Build;
+
+ Module::Build->new(
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ )->create_build_script;
+
+A "bundling" Build.PL replaces the initial "use" line with a nearly
+transparent replacement:
+
+ use inc::latest 'Module::Build';
+
+ Module::Build->new(
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ )->create_build_script;
+
+For I<authors>, when "Build dist" is run, Module::Build will be
+automatically bundled into C<inc> according to the rules for
+L<inc::latest>.
+
+For I<users>, inc::latest will load the latest Module::Build, whether
+installed or bundled in C<inc/>.
+
+=head1 BUNDLING OTHER CONFIGURATION DEPENDENCIES
+
+The same approach works for other configuration dependencies -- modules
+that I<must> be available for Build.PL to run. All other dependencies can
+be specified as usual in the Build.PL and CPAN or CPANPLUS will install
+them after Build.PL finishes.
+
+For example, to bundle the L<Devel::AssertOS::Unix> module (which ensures a
+"Unix-like" operating system), one could do this:
+
+ use inc::latest 'Devel::AssertOS::Unix';
+ use inc::latest 'Module::Build';
+
+ Module::Build->new(
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ )->create_build_script;
+
+The C<inc::latest> module creates bundled directories based on the packlist
+file of an installed distribution. Even though C<inc::latest> takes module
+name arguments, it is better to think of it as bundling and making
+available entire I<distributions>. When a module is loaded through
+C<inc::latest>, it looks in all bundled distributions in C<inc/> for a
+newer module than can be found in the existing C<@INC> array.
+
+Thus, the module-name provided should usually be the "top-level" module
+name of a distribution, though this is not strictly required. For example,
+L<Module::Build> has a number of heuristics to map module names to
+packlists, allowing users to do things like this:
+
+ use inc::latest 'Devel::AssertOS::Unix';
+
+even though Devel::AssertOS::Unix is contained within the Devel-CheckOS
+distribution.
+
+At the current time, packlists are required. Thus, bundling dual-core
+modules, I<including Module::Build>, may require a 'forced install' over
+versions in the latest version of perl in order to create the necessary
+packlist for bundling. This limitation will hopefully be addressed in a
+future version of Module::Build.
+
+=head2 WARNING -- How to Manage Dependency Chains
+
+Before bundling a distribution you must ensure that all prerequisites are
+also bundled and load in the correct order. For Module::Build itself, this
+should not be necessary, but it is necessary for any other distribution.
+(A future release of Module::Build will hopefully address this deficiency.)
+
+For example, if you need C<Wibble>, but C<Wibble> depends on C<Wobble>,
+your Build.PL might look like this:
+
+ use inc::latest 'Wobble';
+ use inc::latest 'Wibble';
+ use inc::latest 'Module::Build';
+
+ Module::Build->new(
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ )->create_build_script;
+
+Authors are strongly suggested to limit the bundling of additional
+dependencies if at all possible and to carefully test their distribution
+tarballs on older versions of Perl before uploading to CPAN.
+
+=head1 AUTHOR
+
+David Golden <dagolden@cpan.org>
+
+Development questions, bug reports, and patches should be sent to the
+Module-Build mailing list at <module-build@perl.org>.
+
+Bug reports are also welcome at
+<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build>.
+
+=head1 SEE ALSO
+
+perl(1), L<inc::latest>, L<Module::Build>(3), L<Module::Build::API>(3),
+L<Module::Build::Cookbook>(3),
+
+=cut
+
+# vim: tw=75
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Compat.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Compat.pm
new file mode 100755
index 00000000000..95d695f6f56
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Compat.pm
@@ -0,0 +1,628 @@
+package Module::Build::Compat;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+
+use File::Basename ();
+use File::Spec;
+use IO::File;
+use Config;
+use Module::Build;
+use Module::Build::ModuleInfo;
+use Module::Build::Version;
+use Data::Dumper;
+
+my %convert_installdirs = (
+ PERL => 'core',
+ SITE => 'site',
+ VENDOR => 'vendor',
+);
+
+my %makefile_to_build =
+ (
+ TEST_VERBOSE => 'verbose',
+ VERBINST => 'verbose',
+ INC => sub { map {(extra_compiler_flags => $_)} Module::Build->split_like_shell(shift) },
+ POLLUTE => sub { (extra_compiler_flags => '-DPERL_POLLUTE') },
+ INSTALLDIRS => sub { (installdirs => $convert_installdirs{uc shift()}) },
+ LIB => sub {
+ my $lib = shift;
+ my %config = (
+ installprivlib => $lib,
+ installsitelib => $lib,
+ installarchlib => "$lib/$Config{archname}",
+ installsitearch => "$lib/$Config{archname}"
+ );
+ return map { (config => "$_=$config{$_}") } keys %config;
+ },
+
+ # Convert INSTALLVENDORLIB and friends.
+ (
+ map {
+ my $name = $_;
+ $name => sub {
+ my @ret = (config => lc($name) . "=" . shift );
+ print STDERR "# Converted to @ret\n";
+
+ return @ret;
+ }
+ } qw(
+ INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH
+ INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB
+ INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN
+ INSTALLSCRIPT INSTALLSITESCRIPT INSTALLVENDORSCRIPT
+ INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR
+ INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR
+ )
+ ),
+
+ # Some names they have in common
+ map {$_, lc($_)} qw(DESTDIR PREFIX INSTALL_BASE UNINST),
+ );
+
+my %macro_to_build = %makefile_to_build;
+# "LIB=foo make" is not the same as "perl Makefile.PL LIB=foo"
+delete $macro_to_build{LIB};
+
+sub _simple_prereq {
+ return $_[0] =~ /^[0-9_]+\.?[0-9_]*$/; # crudly, a decimal literal
+}
+
+sub _merge_prereq {
+ my ($req, $breq) = @_;
+ $req ||= {};
+ $breq ||= {};
+
+ # validate formats
+ for my $p ( $req, $breq ) {
+ for my $k (keys %$p) {
+ next if $k eq 'perl';
+ die "Prereq '$p->{$k}' for '$k' is not supported by Module::Build::Compat\n"
+ unless _simple_prereq($p->{$k});
+ }
+ }
+ # merge
+ my $merge = { %$req };
+ for my $k ( keys %$breq ) {
+ my $v1 = $merge->{$k} || 0;
+ my $v2 = $breq->{$k};
+ $merge->{$k} = $v1 > $v2 ? $v1 : $v2;
+ }
+ return %$merge;
+}
+
+
+sub create_makefile_pl {
+ my ($package, $type, $build, %args) = @_;
+
+ die "Don't know how to build Makefile.PL of type '$type'"
+ unless $type =~ /^(small|passthrough|traditional)$/;
+
+ if ($type eq 'passthrough') {
+ $build->log_warn(<<"HERE");
+
+IMPORTANT NOTE: The '$type' style of Makefile.PL is deprecated and
+may be removed in a future version of Module::Build in favor of the
+'configure_requires' property. See Module::Build::Compat
+documentation for details.
+
+HERE
+ }
+
+ my $fh;
+ if ($args{fh}) {
+ $fh = $args{fh};
+ } else {
+ $args{file} ||= 'Makefile.PL';
+ local $build->{properties}{quiet} = 1;
+ $build->delete_filetree($args{file});
+ $fh = IO::File->new("> $args{file}") or die "Can't write $args{file}: $!";
+ }
+
+ print {$fh} "# Note: this file was auto-generated by ", __PACKAGE__, " version $VERSION\n";
+
+ # Minimum perl version should be specified as "require 5.XXXXXX" in
+ # Makefile.PL
+ my $requires = $build->requires;
+ if ( my $minimum_perl = $requires->{perl} ) {
+ my $min_ver = Module::Build::Version->new($minimum_perl)->numify;
+ print {$fh} "require $min_ver;\n";
+ }
+
+ # If a *bundled* custom subclass is being used, make sure we add its
+ # directory to @INC. Also, lib.pm always needs paths in Unix format.
+ my $subclass_load = '';
+ if (ref($build) ne "Module::Build") {
+ my $subclass_dir = $package->subclass_dir($build);
+
+ if (File::Spec->file_name_is_absolute($subclass_dir)) {
+ my $base_dir = $build->base_dir;
+
+ if ($build->dir_contains($base_dir, $subclass_dir)) {
+ $subclass_dir = File::Spec->abs2rel($subclass_dir, $base_dir);
+ $subclass_dir = $package->unixify_dir($subclass_dir);
+ $subclass_load = "use lib '$subclass_dir';";
+ }
+ # Otherwise, leave it the empty string
+
+ } else {
+ $subclass_dir = $package->unixify_dir($subclass_dir);
+ $subclass_load = "use lib '$subclass_dir';";
+ }
+ }
+
+ if ($type eq 'small') {
+ printf {$fh} <<'EOF', $subclass_load, ref($build), ref($build);
+ use Module::Build::Compat 0.02;
+ %s
+ Module::Build::Compat->run_build_pl(args => \@ARGV);
+ require %s;
+ Module::Build::Compat->write_makefile(build_class => '%s');
+EOF
+
+ } elsif ($type eq 'passthrough') {
+ printf {$fh} <<'EOF', $subclass_load, ref($build), ref($build);
+
+ unless (eval "use Module::Build::Compat 0.02; 1" ) {
+ print "This module requires Module::Build to install itself.\n";
+
+ require ExtUtils::MakeMaker;
+ my $yn = ExtUtils::MakeMaker::prompt
+ (' Install Module::Build now from CPAN?', 'y');
+
+ unless ($yn =~ /^y/i) {
+ die " *** Cannot install without Module::Build. Exiting ...\n";
+ }
+
+ require Cwd;
+ require File::Spec;
+ require CPAN;
+
+ # Save this 'cause CPAN will chdir all over the place.
+ my $cwd = Cwd::cwd();
+
+ CPAN::Shell->install('Module::Build::Compat');
+ CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate
+ or die "Couldn't install Module::Build, giving up.\n";
+
+ chdir $cwd or die "Cannot chdir() back to $cwd: $!";
+ }
+ eval "use Module::Build::Compat 0.02; 1" or die $@;
+ %s
+ Module::Build::Compat->run_build_pl(args => \@ARGV);
+ my $build_script = 'Build';
+ $build_script .= '.com' if $^O eq 'VMS';
+ exit(0) unless(-e $build_script); # cpantesters convention
+ require %s;
+ Module::Build::Compat->write_makefile(build_class => '%s');
+EOF
+
+ } elsif ($type eq 'traditional') {
+
+ my (%MM_Args, %prereq);
+ if (eval "use Tie::IxHash; 1") {
+ tie %MM_Args, 'Tie::IxHash'; # Don't care if it fails here
+ tie %prereq, 'Tie::IxHash'; # Don't care if it fails here
+ }
+
+ my %name = ($build->module_name
+ ? (NAME => $build->module_name)
+ : (DISTNAME => $build->dist_name));
+
+ my %version = ($build->dist_version_from
+ ? (VERSION_FROM => $build->dist_version_from)
+ : (VERSION => $build->dist_version)
+ );
+ %MM_Args = (%name, %version);
+
+ %prereq = _merge_prereq( $build->requires, $build->build_requires );
+ %prereq = map {$_, $prereq{$_}} sort keys %prereq;
+
+ delete $prereq{perl};
+ $MM_Args{PREREQ_PM} = \%prereq;
+
+ $MM_Args{INSTALLDIRS} = $build->installdirs eq 'core' ? 'perl' : $build->installdirs;
+
+ $MM_Args{EXE_FILES} = [ sort keys %{$build->script_files} ] if $build->script_files;
+
+ $MM_Args{PL_FILES} = $build->PL_files || {};
+
+ if ($build->recursive_test_files) {
+ $MM_Args{test} = { TESTS => join q{ }, $package->_test_globs($build) };
+ }
+
+ local $Data::Dumper::Terse = 1;
+ my $args = Data::Dumper::Dumper(\%MM_Args);
+ $args =~ s/\{(.*)\}/($1)/s;
+
+ print $fh <<"EOF";
+use ExtUtils::MakeMaker;
+WriteMakefile
+$args;
+EOF
+ }
+}
+
+sub _test_globs {
+ my ($self, $build) = @_;
+
+ return map { File::Spec->catfile($_, '*.t') }
+ @{$build->rscan_dir('t', sub { -d $File::Find::name })};
+}
+
+sub subclass_dir {
+ my ($self, $build) = @_;
+
+ return (Module::Build::ModuleInfo->find_module_dir_by_name(ref $build)
+ || File::Spec->catdir($build->config_dir, 'lib'));
+}
+
+sub unixify_dir {
+ my ($self, $path) = @_;
+ return join '/', File::Spec->splitdir($path);
+}
+
+sub makefile_to_build_args {
+ my $class = shift;
+ my @out;
+ foreach my $arg (@_) {
+ next if $arg eq '';
+
+ my ($key, $val) = ($arg =~ /^(\w+)=(.+)/ ? ($1, $2) :
+ die "Malformed argument '$arg'");
+
+ # Do tilde-expansion if it looks like a tilde prefixed path
+ ( $val ) = Module::Build->_detildefy( $val ) if $val =~ /^~/;
+
+ if (exists $makefile_to_build{$key}) {
+ my $trans = $makefile_to_build{$key};
+ push @out, $class->_argvify( ref($trans) ? $trans->($val) : ($trans => $val) );
+ } elsif (exists $Config{lc($key)}) {
+ push @out, $class->_argvify( config => lc($key) . "=$val" );
+ } else {
+ # Assume M::B can handle it in lowercase form
+ push @out, $class->_argvify("\L$key" => $val);
+ }
+ }
+ return @out;
+}
+
+sub _argvify {
+ my ($self, @pairs) = @_;
+ my @out;
+ while (@pairs) {
+ my ($k, $v) = splice @pairs, 0, 2;
+ push @out, ("--$k", $v);
+ }
+ return @out;
+}
+
+sub makefile_to_build_macros {
+ my @out;
+ my %config; # must accumulate and return as a hashref
+ while (my ($macro, $trans) = each %macro_to_build) {
+ # On some platforms (e.g. Cygwin with 'make'), the mere presence
+ # of "EXPORT: FOO" in the Makefile will make $ENV{FOO} defined.
+ # Therefore we check length() too.
+ next unless exists $ENV{$macro} && length $ENV{$macro};
+ my $val = $ENV{$macro};
+ my @args = ref($trans) ? $trans->($val) : ($trans => $val);
+ while (@args) {
+ my ($k, $v) = splice(@args, 0, 2);
+ if ( $k eq 'config' ) {
+ if ( $v =~ /^([^=]+)=(.*)$/ ) {
+ $config{$1} = $2;
+ }
+ else {
+ warn "Couldn't parse config '$v'\n";
+ }
+ }
+ else {
+ push @out, ($k => $v);
+ }
+ }
+ }
+ push @out, (config => \%config) if %config;
+ return @out;
+}
+
+sub run_build_pl {
+ my ($pack, %in) = @_;
+ $in{script} ||= 'Build.PL';
+ my @args = $in{args} ? $pack->makefile_to_build_args(@{$in{args}}) : ();
+ print "# running $in{script} @args\n";
+ Module::Build->run_perl_script($in{script}, [], \@args) or die "Couldn't run $in{script}: $!";
+}
+
+sub fake_makefile {
+ my ($self, %args) = @_;
+ unless (exists $args{build_class}) {
+ warn "Unknown 'build_class', defaulting to 'Module::Build'\n";
+ $args{build_class} = 'Module::Build';
+ }
+ my $class = $args{build_class};
+
+ my $perl = $class->find_perl_interpreter;
+
+ # VMS MMS/MMK need to use MCR to run the Perl image.
+ $perl = 'MCR ' . $perl if $self->_is_vms_mms;
+
+ my $noop = ($class->is_windowsish ? 'rem>nul' :
+ $self->_is_vms_mms ? 'Continue' :
+ 'true');
+
+ my $filetype = $class->is_vmsish ? '.COM' : '';
+
+ my $Build = 'Build' . $filetype . ' --makefile_env_macros 1';
+ my $unlink = $class->oneliner('1 while unlink $ARGV[0]', [], [$args{makefile}]);
+ $unlink =~ s/\$/\$\$/g unless $class->is_vmsish;
+
+ my $maketext = ($^O eq 'os2' ? "SHELL = sh\n\n" : '');
+
+ $maketext .= <<"EOF";
+all : force_do_it
+ $perl $Build
+realclean : force_do_it
+ $perl $Build realclean
+ $unlink
+distclean : force_do_it
+ $perl $Build distclean
+ $unlink
+
+
+force_do_it :
+ @ $noop
+EOF
+
+ foreach my $action ($class->known_actions) {
+ next if $action =~ /^(all|distclean|realclean|force_do_it)$/; # Don't double-define
+ $maketext .= <<"EOF";
+$action : force_do_it
+ $perl $Build $action
+EOF
+ }
+
+ if ($self->_is_vms_mms) {
+ # Roll our own .EXPORT as MMS/MMK don't honor that directive.
+ $maketext .= "\n.FIRST\n\t\@ $noop\n";
+ for my $macro (keys %macro_to_build) {
+ $maketext .= ".IFDEF $macro\n\tDEFINE $macro \"\$($macro)\"\n.ENDIF\n";
+ }
+ $maketext .= "\n";
+ }
+ else {
+ $maketext .= "\n.EXPORT : " . join(' ', keys %macro_to_build) . "\n\n";
+ }
+
+ return $maketext;
+}
+
+sub fake_prereqs {
+ my $file = File::Spec->catfile('_build', 'prereqs');
+ my $fh = IO::File->new("< $file") or die "Can't read $file: $!";
+ my $prereqs = eval do {local $/; <$fh>};
+ close $fh;
+
+ my %merged = _merge_prereq( $prereqs->{requires}, $prereqs->{build_requires} );
+ my @prereq;
+ foreach (sort keys %merged) {
+ next if $_ eq 'perl';
+ push @prereq, "$_=>q[$merged{$_}]";
+ }
+ return unless @prereq;
+ return "# PREREQ_PM => { " . join(", ", @prereq) . " }\n\n";
+}
+
+
+sub write_makefile {
+ my ($pack, %in) = @_;
+
+ unless (exists $in{build_class}) {
+ warn "Unknown 'build_class', defaulting to 'Module::Build'\n";
+ $in{build_class} = 'Module::Build';
+ }
+ my $class = $in{build_class};
+ $in{makefile} ||= $pack->_is_vms_mms ? 'Descrip.MMS' : 'Makefile';
+
+ open MAKE, "> $in{makefile}" or die "Cannot write $in{makefile}: $!";
+ print MAKE $pack->fake_prereqs;
+ print MAKE $pack->fake_makefile(%in);
+ close MAKE;
+}
+
+sub _is_vms_mms {
+ return Module::Build->is_vmsish && ($Config{make} =~ m/MM[SK]/i);
+}
+
+1;
+__END__
+
+=for :stopwords passthrough
+
+=head1 NAME
+
+Module::Build::Compat - Compatibility with ExtUtils::MakeMaker
+
+
+=head1 SYNOPSIS
+
+ # In a Build.PL :
+ use Module::Build;
+ my $build = Module::Build->new
+ ( module_name => 'Foo::Bar',
+ license => 'perl',
+ create_makefile_pl => 'traditional' );
+ ...
+
+
+=head1 DESCRIPTION
+
+Because C<ExtUtils::MakeMaker> has been the standard way to distribute
+modules for a long time, many tools (CPAN.pm, or your system
+administrator) may expect to find a working F<Makefile.PL> in every
+distribution they download from CPAN. If you want to throw them a
+bone, you can use C<Module::Build::Compat> to automatically generate a
+F<Makefile.PL> for you, in one of several different styles.
+
+C<Module::Build::Compat> also provides some code that helps out the
+F<Makefile.PL> at runtime.
+
+
+=head1 METHODS
+
+=over 4
+
+=item create_makefile_pl($style, $build)
+
+Creates a F<Makefile.PL> in the current directory in one of several
+styles, based on the supplied C<Module::Build> object C<$build>. This is
+typically controlled by passing the desired style as the
+C<create_makefile_pl> parameter to C<Module::Build>'s C<new()> method;
+the F<Makefile.PL> will then be automatically created during the
+C<distdir> action.
+
+The currently supported styles are:
+
+=over 4
+
+=item traditional
+
+A F<Makefile.PL> will be created in the "traditional" style, i.e. it will
+use C<ExtUtils::MakeMaker> and won't rely on C<Module::Build> at all.
+In order to create the F<Makefile.PL>, we'll include the C<requires> and
+C<build_requires> dependencies as the C<PREREQ_PM> parameter.
+
+You don't want to use this style if during the C<perl Build.PL> stage
+you ask the user questions, or do some auto-sensing about the user's
+environment, or if you subclass C<Module::Build> to do some
+customization, because the vanilla F<Makefile.PL> won't do any of that.
+
+=item small
+
+A small F<Makefile.PL> will be created that passes all functionality
+through to the F<Build.PL> script in the same directory. The user must
+already have C<Module::Build> installed in order to use this, or else
+they'll get a module-not-found error.
+
+=item passthrough (DEPRECATED)
+
+This is just like the C<small> option above, but if C<Module::Build> is
+not already installed on the user's system, the script will offer to
+use C<CPAN.pm> to download it and install it before continuing with
+the build.
+
+This option has been deprecated and may be removed in a future version
+of Module::Build. Modern CPAN.pm and CPANPLUS will recognize the
+C<configure_requires> metadata property and install Module::Build before
+running Build.PL if Module::Build is listed and Module::Build now
+adds itself to configure_requires by default.
+
+Perl 5.10.1 includes C<configure_requires> support. In the future, when
+C<configure_requires> support is deemed sufficiently widespread, the
+C<passthrough> style will be removed.
+
+=back
+
+=item run_build_pl(args => \@ARGV)
+
+This method runs the F<Build.PL> script, passing it any arguments the
+user may have supplied to the C<perl Makefile.PL> command. Because
+C<ExtUtils::MakeMaker> and C<Module::Build> accept different arguments, this
+method also performs some translation between the two.
+
+C<run_build_pl()> accepts the following named parameters:
+
+=over 4
+
+=item args
+
+The C<args> parameter specifies the parameters that would usually
+appear on the command line of the C<perl Makefile.PL> command -
+typically you'll just pass a reference to C<@ARGV>.
+
+=item script
+
+This is the filename of the script to run - it defaults to C<Build.PL>.
+
+=back
+
+=item write_makefile()
+
+This method writes a 'dummy' F<Makefile> that will pass all commands
+through to the corresponding C<Module::Build> actions.
+
+C<write_makefile()> accepts the following named parameters:
+
+=over 4
+
+=item makefile
+
+The name of the file to write - defaults to the string C<Makefile>.
+
+=back
+
+=back
+
+
+=head1 SCENARIOS
+
+So, some common scenarios are:
+
+=over 4
+
+=item 1.
+
+Just include a F<Build.PL> script (without a F<Makefile.PL>
+script), and give installation directions in a F<README> or F<INSTALL>
+document explaining how to install the module. In particular, explain
+that the user must install C<Module::Build> before installing your
+module.
+
+Note that if you do this, you may make things easier for yourself, but
+harder for people with older versions of CPAN or CPANPLUS on their
+system, because those tools generally only understand the
+F<Makefile.PL>/C<ExtUtils::MakeMaker> way of doing things.
+
+=item 2.
+
+Include a F<Build.PL> script and a "traditional" F<Makefile.PL>,
+created either manually or with C<create_makefile_pl()>. Users won't
+ever have to install C<Module::Build> if they use the F<Makefile.PL>, but
+they won't get to take advantage of C<Module::Build>'s extra features
+either.
+
+For good measure, of course, test both the F<Makefile.PL> and the
+F<Build.PL> before shipping.
+
+=item 3.
+
+Include a F<Build.PL> script and a "pass-through" F<Makefile.PL>
+built using C<Module::Build::Compat>. This will mean that people can
+continue to use the "old" installation commands, and they may never
+notice that it's actually doing something else behind the scenes. It
+will also mean that your installation process is compatible with older
+versions of tools like CPAN and CPANPLUS.
+
+=back
+
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+L<Module::Build>(3), L<ExtUtils::MakeMaker>(3)
+
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Config.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Config.pm
new file mode 100755
index 00000000000..997960073fd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Config.pm
@@ -0,0 +1,59 @@
+package Module::Build::Config;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Config;
+
+sub new {
+ my ($pack, %args) = @_;
+ return bless {
+ stack => {},
+ values => $args{values} || {},
+ }, $pack;
+}
+
+sub get {
+ my ($self, $key) = @_;
+ return $self->{values}{$key} if ref($self) && exists $self->{values}{$key};
+ return $Config{$key};
+}
+
+sub set {
+ my ($self, $key, $val) = @_;
+ $self->{values}{$key} = $val;
+}
+
+sub push {
+ my ($self, $key, $val) = @_;
+ push @{$self->{stack}{$key}}, $self->{values}{$key}
+ if exists $self->{values}{$key};
+ $self->{values}{$key} = $val;
+}
+
+sub pop {
+ my ($self, $key) = @_;
+
+ my $val = delete $self->{values}{$key};
+ if ( exists $self->{stack}{$key} ) {
+ $self->{values}{$key} = pop @{$self->{stack}{$key}};
+ delete $self->{stack}{$key} unless @{$self->{stack}{$key}};
+ }
+
+ return $val;
+}
+
+sub values_set {
+ my $self = shift;
+ return undef unless ref($self);
+ return $self->{values};
+}
+
+sub all_config {
+ my $self = shift;
+ my $v = ref($self) ? $self->{values} : {};
+ return {%Config, %$v};
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/ConfigData.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/ConfigData.pm
new file mode 100755
index 00000000000..15114ee072b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/ConfigData.pm
@@ -0,0 +1,220 @@
+package Module::Build::ConfigData;
+use strict;
+my $arrayref = eval do {local $/; <DATA>}
+ or die "Couldn't load ConfigData data: $@";
+close DATA;
+my ($config, $features, $auto_features) = @$arrayref;
+
+sub config { $config->{$_[1]} }
+
+sub set_config { $config->{$_[1]} = $_[2] }
+sub set_feature { $features->{$_[1]} = 0+!!$_[2] } # Constrain to 1 or 0
+
+sub auto_feature_names { grep !exists $features->{$_}, keys %$auto_features }
+
+sub feature_names {
+ my @features = (keys %$features, auto_feature_names());
+ @features;
+}
+
+sub config_names { keys %$config }
+
+sub write {
+ my $me = __FILE__;
+ require IO::File;
+
+ # Can't use Module::Build::Dumper here because M::B is only a
+ # build-time prereq of this module
+ require Data::Dumper;
+
+ my $mode_orig = (stat $me)[2] & 07777;
+ chmod($mode_orig | 0222, $me); # Make it writeable
+ my $fh = IO::File->new($me, 'r+') or die "Can't rewrite $me: $!";
+ seek($fh, 0, 0);
+ while (<$fh>) {
+ last if /^__DATA__$/;
+ }
+ die "Couldn't find __DATA__ token in $me" if eof($fh);
+
+ seek($fh, tell($fh), 0);
+ my $data = [$config, $features, $auto_features];
+ $fh->print( 'do{ my '
+ . Data::Dumper->new([$data],['x'])->Purity(1)->Dump()
+ . '$x; }' );
+ truncate($fh, tell($fh));
+ $fh->close;
+
+ chmod($mode_orig, $me)
+ or warn "Couldn't restore permissions on $me: $!";
+}
+
+sub feature {
+ my ($package, $key) = @_;
+ return $features->{$key} if exists $features->{$key};
+
+ my $info = $auto_features->{$key} or return 0;
+
+ # Under perl 5.005, each(%$foo) isn't working correctly when $foo
+ # was reanimated with Data::Dumper and eval(). Not sure why, but
+ # copying to a new hash seems to solve it.
+ my %info = %$info;
+
+ require Module::Build; # XXX should get rid of this
+ while (my ($type, $prereqs) = each %info) {
+ next if $type eq 'description' || $type eq 'recommends';
+
+ my %p = %$prereqs; # Ditto here.
+ while (my ($modname, $spec) = each %p) {
+ my $status = Module::Build->check_installed_status($modname, $spec);
+ if ((!$status->{ok}) xor ($type =~ /conflicts$/)) { return 0; }
+ if ( ! eval "require $modname; 1" ) { return 0; }
+ }
+ }
+ return 1;
+}
+
+
+=head1 NAME
+
+Module::Build::ConfigData - Configuration for Module::Build
+
+=head1 SYNOPSIS
+
+ use Module::Build::ConfigData;
+ $value = Module::Build::ConfigData->config('foo');
+ $value = Module::Build::ConfigData->feature('bar');
+
+ @names = Module::Build::ConfigData->config_names;
+ @names = Module::Build::ConfigData->feature_names;
+
+ Module::Build::ConfigData->set_config(foo => $new_value);
+ Module::Build::ConfigData->set_feature(bar => $new_value);
+ Module::Build::ConfigData->write; # Save changes
+
+
+=head1 DESCRIPTION
+
+This module holds the configuration data for the C<Module::Build>
+module. It also provides a programmatic interface for getting or
+setting that configuration data. Note that in order to actually make
+changes, you'll have to have write access to the C<Module::Build::ConfigData>
+module, and you should attempt to understand the repercussions of your
+actions.
+
+
+=head1 METHODS
+
+=over 4
+
+=item config($name)
+
+Given a string argument, returns the value of the configuration item
+by that name, or C<undef> if no such item exists.
+
+=item feature($name)
+
+Given a string argument, returns the value of the feature by that
+name, or C<undef> if no such feature exists.
+
+=item set_config($name, $value)
+
+Sets the configuration item with the given name to the given value.
+The value may be any Perl scalar that will serialize correctly using
+C<Data::Dumper>. This includes references, objects (usually), and
+complex data structures. It probably does not include transient
+things like filehandles or sockets.
+
+=item set_feature($name, $value)
+
+Sets the feature with the given name to the given boolean value. The
+value will be converted to 0 or 1 automatically.
+
+=item config_names()
+
+Returns a list of all the names of config items currently defined in
+C<Module::Build::ConfigData>, or in scalar context the number of items.
+
+=item feature_names()
+
+Returns a list of all the names of features currently defined in
+C<Module::Build::ConfigData>, or in scalar context the number of features.
+
+=item auto_feature_names()
+
+Returns a list of all the names of features whose availability is
+dynamically determined, or in scalar context the number of such
+features. Does not include such features that have later been set to
+a fixed value.
+
+=item write()
+
+Commits any changes from C<set_config()> and C<set_feature()> to disk.
+Requires write access to the C<Module::Build::ConfigData> module.
+
+=back
+
+
+=head1 AUTHOR
+
+C<Module::Build::ConfigData> was automatically created using C<Module::Build>.
+C<Module::Build> was written by Ken Williams, but he holds no
+authorship claim or copyright claim to the contents of C<Module::Build::ConfigData>.
+
+=cut
+
+
+__DATA__
+do{ my $x = [
+ {},
+ {},
+ {
+ 'license_creation' => {
+ 'requires' => {
+ 'Software::License' => 0
+ },
+ 'description' => 'Create licenses automatically in distributions'
+ },
+ 'inc_bundling_support' => {
+ 'requires' => {
+ 'ExtUtils::Installed' => '1.999',
+ 'ExtUtils::Install' => '1.54'
+ },
+ 'description' => 'Bundle Module::Build in inc/'
+ },
+ 'YAML_support' => {
+ 'requires' => {
+ 'YAML::Tiny' => '1.38'
+ },
+ 'description' => 'Use YAML::Tiny to write META.yml files'
+ },
+ 'manpage_support' => {
+ 'requires' => {
+ 'Pod::Man' => 0
+ },
+ 'description' => 'Create Unix man pages'
+ },
+ 'PPM_support' => {
+ 'requires' => {
+ 'IO::File' => '1.13'
+ },
+ 'description' => 'Generate PPM files for distributions'
+ },
+ 'dist_authoring' => {
+ 'requires' => {
+ 'Archive::Tar' => '1.09'
+ },
+ 'recommends' => {
+ 'Module::Signature' => '0.21',
+ 'Pod::Readme' => '0.04'
+ },
+ 'description' => 'Create new distributions'
+ },
+ 'HTML_support' => {
+ 'requires' => {
+ 'Pod::Html' => 0
+ },
+ 'description' => 'Create HTML documentation'
+ }
+ }
+ ];
+$x; } \ No newline at end of file
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Cookbook.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Cookbook.pm
new file mode 100755
index 00000000000..a68dca540ab
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Cookbook.pm
@@ -0,0 +1,529 @@
+package Module::Build::Cookbook;
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+
+
+=head1 NAME
+
+Module::Build::Cookbook - Examples of Module::Build Usage
+
+=head1 DESCRIPTION
+
+C<Module::Build> isn't conceptually very complicated, but examples are
+always helpful. The following recipes should help developers and/or
+installers put together the pieces from the other parts of the
+documentation.
+
+
+=head1 BASIC RECIPES
+
+
+=head2 Installing modules that use Module::Build
+
+In most cases, you can just issue the following commands:
+
+ perl Build.PL
+ ./Build
+ ./Build test
+ ./Build install
+
+There's nothing complicated here - first you're running a script
+called F<Build.PL>, then you're running a (newly-generated) script
+called F<Build> and passing it various arguments.
+
+The exact commands may vary a bit depending on how you invoke perl
+scripts on your system. For instance, if you have multiple versions
+of perl installed, you can install to one particular perl's library
+directories like so:
+
+ /usr/bin/perl5.8.1 Build.PL
+ ./Build
+ ./Build test
+ ./Build install
+
+If you're on Windows where the current directory is always searched
+first for scripts, you'll probably do something like this:
+
+ perl Build.PL
+ Build
+ Build test
+ Build install
+
+On the old Mac OS (version 9 or lower) using MacPerl, you can
+double-click on the F<Build.PL> script to create the F<Build> script,
+then double-click on the F<Build> script to run its C<build>, C<test>,
+and C<install> actions.
+
+The F<Build> script knows what perl was used to run F<Build.PL>, so
+you don't need to re-invoke the F<Build> script with the complete perl
+path each time. If you invoke it with the I<wrong> perl path, you'll
+get a warning or a fatal error.
+
+=head2 Modifying Config.pm values
+
+C<Module::Build> relies heavily on various values from perl's
+C<Config.pm> to do its work. For example, default installation paths
+are given by C<installsitelib> and C<installvendorman3dir> and
+friends, C linker & compiler settings are given by C<ld>,
+C<lddlflags>, C<cc>, C<ccflags>, and so on. I<If you're pretty sure
+you know what you're doing>, you can tell C<Module::Build> to pretend
+there are different values in F<Config.pm> than what's really there,
+by passing arguments for the C<--config> parameter on the command
+line:
+
+ perl Build.PL --config cc=gcc --config ld=gcc
+
+Inside the C<Build.PL> script the same thing can be accomplished by
+passing values for the C<config> parameter to C<new()>:
+
+ my $build = Module::Build->new
+ (
+ ...
+ config => { cc => 'gcc', ld => 'gcc' },
+ ...
+ );
+
+In custom build code, the same thing can be accomplished by calling
+the L<Module::Build/config> method:
+
+ $build->config( cc => 'gcc' ); # Set
+ $build->config( ld => 'gcc' ); # Set
+ ...
+ my $linker = $build->config('ld'); # Get
+
+
+=head2 Installing modules using the programmatic interface
+
+If you need to build, test, and/or install modules from within some
+other perl code (as opposed to having the user type installation
+commands at the shell), you can use the programmatic interface.
+Create a Module::Build object (or an object of a custom Module::Build
+subclass) and then invoke its C<dispatch()> method to run various
+actions.
+
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ requires => { 'Some::Module' => '1.23' },
+ );
+ $build->dispatch('build');
+ $build->dispatch('test', verbose => 1);
+ $build->dispatch('install');
+
+The first argument to C<dispatch()> is the name of the action, and any
+following arguments are named parameters.
+
+This is the interface we use to test Module::Build itself in the
+regression tests.
+
+
+=head2 Installing to a temporary directory
+
+To create packages for package managers like RedHat's C<rpm> or
+Debian's C<deb>, you may need to install to a temporary directory
+first and then create the package from that temporary installation.
+To do this, specify the C<destdir> parameter to the C<install> action:
+
+ ./Build install --destdir /tmp/my-package-1.003
+
+This essentially just prepends all the installation paths with the
+F</tmp/my-package-1.003> directory.
+
+
+=head2 Installing to a non-standard directory
+
+To install to a non-standard directory (for example, if you don't have
+permission to install in the system-wide directories), you can use the
+C<install_base> or C<prefix> parameters:
+
+ ./Build install --install_base /foo/bar
+
+See L<Module::Build/"INSTALL PATHS"> for a much more complete
+discussion of how installation paths are determined.
+
+
+=head2 Installing in the same location as ExtUtils::MakeMaker
+
+With the introduction of C<--prefix> in Module::Build 0.28 and
+C<INSTALL_BASE> in C<ExtUtils::MakeMaker> 6.31 its easy to get them both
+to install to the same locations.
+
+First, ensure you have at least version 0.28 of Module::Build
+installed and 6.31 of C<ExtUtils::MakeMaker>. Prior versions have
+differing (and in some cases quite strange) installation behaviors.
+
+The following installation flags are equivalent between
+C<ExtUtils::MakeMaker> and C<Module::Build>.
+
+ MakeMaker Module::Build
+ PREFIX=... --prefix ...
+ INSTALL_BASE=... --install_base ...
+ DESTDIR=... --destdir ...
+ LIB=... --install_path lib=...
+ INSTALLDIRS=... --installdirs ...
+ INSTALLDIRS=perl --installdirs core
+ UNINST=... --uninst ...
+ INC=... --extra_compiler_flags ...
+ POLLUTE=1 --extra_compiler_flags -DPERL_POLLUTE
+
+For example, if you are currently installing C<MakeMaker> modules with
+this command:
+
+ perl Makefile.PL PREFIX=~
+ make test
+ make install UNINST=1
+
+You can install into the same location with Module::Build using this:
+
+ perl Build.PL --prefix ~
+ ./Build test
+ ./Build install --uninst 1
+
+=head3 C<prefix> vs C<install_base>
+
+The behavior of C<prefix> is complicated and depends on
+how your Perl is configured. The resulting installation locations
+will vary from machine to machine and even different installations of
+Perl on the same machine. Because of this, it's difficult to document
+where C<prefix> will place your modules.
+
+In contrast, C<install_base> has predictable, easy to explain
+installation locations. Now that C<Module::Build> and C<MakeMaker> both
+have C<install_base> there is little reason to use C<prefix> other
+than to preserve your existing installation locations. If you are
+starting a fresh Perl installation we encourage you to use
+C<install_base>. If you have an existing installation installed via
+C<prefix>, consider moving it to an installation structure matching
+C<install_base> and using that instead.
+
+
+=head2 Running a single test file
+
+C<Module::Build> supports running a single test, which enables you to
+track down errors more quickly. Use the following format:
+
+ ./Build test --test_files t/mytest.t
+
+In addition, you may want to run the test in verbose mode to get more
+informative output:
+
+ ./Build test --test_files t/mytest.t --verbose 1
+
+I run this so frequently that I define the following shell alias:
+
+ alias t './Build test --verbose 1 --test_files'
+
+So then I can just execute C<t t/mytest.t> to run a single test.
+
+
+=head1 ADVANCED RECIPES
+
+
+=head2 Making a CPAN.pm-compatible distribution
+
+New versions of CPAN.pm understand how to use a F<Build.PL> script,
+but old versions don't. If authors want to help users who have old
+versions, some form of F<Makefile.PL> should be supplied. The easiest
+way to accomplish this is to use the C<create_makefile_pl> parameter to
+C<< Module::Build->new() >> in the C<Build.PL> script, which can
+create various flavors of F<Makefile.PL> during the C<dist> action.
+
+As a best practice, we recommend using the "traditional" style of
+F<Makefile.PL> unless your distribution has needs that can't be
+accomplished that way.
+
+The C<Module::Build::Compat> module, which is part of
+C<Module::Build>'s distribution, is responsible for creating these
+F<Makefile.PL>s. Please see L<Module::Build::Compat> for the details.
+
+
+=head2 Changing the order of the build process
+
+The C<build_elements> property specifies the steps C<Module::Build>
+will take when building a distribution. To change the build order,
+change the order of the entries in that property:
+
+ # Process pod files first
+ my @e = @{$build->build_elements};
+ my ($i) = grep {$e[$_] eq 'pod'} 0..$#e;
+ unshift @e, splice @e, $i, 1;
+
+Currently, C<build_elements> has the following default value:
+
+ [qw( PL support pm xs pod script )]
+
+Do take care when altering this property, since there may be
+non-obvious (and non-documented!) ordering dependencies in the
+C<Module::Build> code.
+
+
+=head2 Adding new file types to the build process
+
+Sometimes you might have extra types of files that you want to install
+alongside the standard types like F<.pm> and F<.pod> files. For
+instance, you might have a F<Bar.dat> file containing some data
+related to the C<Foo::Bar> module and you'd like for it to end up as
+F<Foo/Bar.dat> somewhere in perl's C<@INC> path so C<Foo::Bar> can
+access it easily at runtime. The following code from a sample
+C<Build.PL> file demonstrates how to accomplish this:
+
+ use Module::Build;
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ ...other stuff here...
+ );
+ $build->add_build_element('dat');
+ $build->create_build_script;
+
+This will find all F<.dat> files in the F<lib/> directory, copy them
+to the F<blib/lib/> directory during the C<build> action, and install
+them during the C<install> action.
+
+If your extra files aren't located in the C<lib/> directory in your
+distribution, you can explicitly say where they are, just as you'd do
+with F<.pm> or F<.pod> files:
+
+ use Module::Build;
+ my $build = new Module::Build
+ (
+ module_name => 'Foo::Bar',
+ dat_files => {'some/dir/Bar.dat' => 'lib/Foo/Bar.dat'},
+ ...other stuff here...
+ );
+ $build->add_build_element('dat');
+ $build->create_build_script;
+
+If your extra files actually need to be created on the user's machine,
+or if they need some other kind of special processing, you'll probably
+want to subclass C<Module::Build> and create a special method to
+process them, named C<process_${kind}_files()>:
+
+ use Module::Build;
+ my $class = Module::Build->subclass(code => <<'EOF');
+ sub process_dat_files {
+ my $self = shift;
+ ... locate and process *.dat files,
+ ... and create something in blib/lib/
+ }
+ EOF
+ my $build = $class->new
+ (
+ module_name => 'Foo::Bar',
+ ...other stuff here...
+ );
+ $build->add_build_element('dat');
+ $build->create_build_script;
+
+If your extra files don't go in F<lib/> but in some other place, see
+L<"Adding new elements to the install process"> for how to actually
+get them installed.
+
+Please note that these examples use some capabilities of Module::Build
+that first appeared in version 0.26. Before that it could
+still be done, but the simple cases took a bit more work.
+
+
+=head2 Adding new elements to the install process
+
+By default, Module::Build creates seven subdirectories of the F<blib>
+directory during the build process: F<lib>, F<arch>, F<bin>,
+F<script>, F<bindoc>, F<libdoc>, and F<html> (some of these may be
+missing or empty if there's nothing to go in them). Anything copied
+to these directories during the build will eventually be installed
+during the C<install> action (see L<Module::Build/"INSTALL PATHS">.
+
+If you need to create a new custom type of installable element, e.g. C<conf>,
+then you need to tell Module::Build where things in F<blib/conf/>
+should be installed. To do this, use the C<install_path> parameter to
+the C<new()> method:
+
+ my $build = Module::Build->new
+ (
+ ...other stuff here...
+ install_path => { conf => $installation_path }
+ );
+
+Or you can call the C<install_path()> method later:
+
+ $build->install_path(conf => $installation_path);
+
+The user may also specify the path on the command line:
+
+ perl Build.PL --install_path conf=/foo/path/etc
+
+The important part, though, is that I<somehow> the install path needs
+to be set, or else nothing in the F<blib/conf/> directory will get
+installed, and a runtime error during the C<install> action will
+result.
+
+See also L<"Adding new file types to the build process"> for how to
+create the stuff in F<blib/conf/> in the first place.
+
+
+=head1 EXAMPLES ON CPAN
+
+Several distributions on CPAN are making good use of various features
+of Module::Build. They can serve as real-world examples for others.
+
+
+=head2 SVN-Notify-Mirror
+
+L<http://search.cpan.org/~jpeacock/SVN-Notify-Mirror/>
+
+John Peacock, author of the C<SVN-Notify-Mirror> distribution, says:
+
+=over 4
+
+=item 1. Using C<auto_features>, I check to see whether two optional
+modules are available - SVN::Notify::Config and Net::SSH;
+
+=item 2. If the S::N::Config module is loaded, I automatically
+generate test files for it during Build (using the C<PL_files>
+property).
+
+=item 3. If the C<ssh_feature> is available, I ask if the user wishes
+to perform the ssh tests (since it requires a little preliminary
+setup);
+
+=item 4. Only if the user has C<ssh_feature> and answers yes to the
+testing, do I generate a test file.
+
+I'm sure I could not have handled this complexity with EU::MM, but it
+was very easy to do with M::B.
+
+=back
+
+
+=head2 Modifying an action
+
+Sometimes you might need an to have an action, say C<./Build install>,
+do something unusual. For instance, you might need to change the
+ownership of a file or do something else peculiar to your application.
+
+You can subclass C<Module::Build> on the fly using the C<subclass()>
+method and override the methods that perform the actions. You may
+need to read through C<Module::Build::Authoring> and
+C<Module::Build::API> to find the methods you want to override. All
+"action" methods are implemented by a method called "ACTION_" followed
+by the action's name, so here's an example of how it would work for
+the C<install> action:
+
+ # Build.PL
+ use Module::Build;
+ my $class = Module::Build->subclass(
+ class => "Module::Build::Custom",
+ code => <<'SUBCLASS' );
+
+ sub ACTION_install {
+ my $self = shift;
+ # YOUR CODE HERE
+ $self->SUPER::ACTION_install;
+ }
+ SUBCLASS
+
+ $class->new(
+ module_name => 'Your::Module',
+ # rest of the usual Module::Build parameters
+ )->create_build_script;
+
+
+=head2 Adding an action
+
+You can add a new C<./Build> action simply by writing the method for
+it in your subclass. Use C<depends_on> to declare that another action
+must have been run before your action.
+
+For example, let's say you wanted to be able to write C<./Build
+commit> to test your code and commit it to Subversion.
+
+ # Build.PL
+ use Module::Build;
+ my $class = Module::Build->subclass(
+ class => "Module::Build::Custom",
+ code => <<'SUBCLASS' );
+
+ sub ACTION_commit {
+ my $self = shift;
+
+ $self->depends_on("test");
+ $self->do_system(qw(svn commit));
+ }
+ SUBCLASS
+
+
+=head2 Bundling Module::Build
+
+Note: This section probably needs an update as the technology improves
+(see contrib/bundle.pl in the distribution).
+
+Suppose you want to use some new-ish features of Module::Build,
+e.g. newer than the version of Module::Build your users are likely to
+already have installed on their systems. The first thing you should
+do is set C<configure_requires> to your minimum version of
+Module::Build. See L<Module::Build::Authoring>.
+
+But not every build system honors C<configure_requires> yet. Here's
+how you can ship a copy of Module::Build, but still use a newer
+installed version to take advantage of any bug fixes and upgrades.
+
+First, install Module::Build into F<Your-Project/inc/Module-Build>.
+CPAN will not index anything in the F<inc> directory so this copy will
+not show up in CPAN searches.
+
+ cd Module-Build
+ perl Build.PL --install_base /path/to/Your-Project/inc/Module-Build
+ ./Build test
+ ./Build install
+
+You should now have all the Module::Build .pm files in
+F<Your-Project/inc/Module-Build/lib/perl5>.
+
+Next, add this to the top of your F<Build.PL>.
+
+ my $Bundled_MB = 0.30; # or whatever version it was.
+
+ # Find out what version of Module::Build is installed or fail quietly.
+ # This should be cross-platform.
+ my $Installed_MB =
+ `$^X -e "eval q{require Module::Build; print Module::Build->VERSION} or exit 1";
+
+ # some operating systems put a newline at the end of every print.
+ chomp $Installed_MB;
+
+ $Installed_MB = 0 if $?;
+
+ # Use our bundled copy of Module::Build if it's newer than the installed.
+ unshift @INC, "inc/Module-Build/lib/perl5" if $Bundled_MB > $Installed_MB;
+
+ require Module::Build;
+
+And write the rest of your F<Build.PL> normally. Module::Build will
+remember your change to C<@INC> and use it when you run F<./Build>.
+
+In the future, we hope to provide a more automated solution for this
+scenario; see C<inc/latest.pm> in the Module::Build distribution for
+one indication of the direction we're moving.
+
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2008 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+perl(1), L<Module::Build>(3), L<Module::Build::Authoring>(3),
+L<Module::Build::API>(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Dumper.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Dumper.pm
new file mode 100755
index 00000000000..2a9bad1b637
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Dumper.pm
@@ -0,0 +1,19 @@
+package Module::Build::Dumper;
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+
+# This is just a split-out of a wrapper function to do Data::Dumper
+# stuff "the right way". See:
+# http://groups.google.com/group/perl.module.build/browse_thread/thread/c8065052b2e0d741
+
+use Data::Dumper;
+
+sub _data_dump {
+ my ($self, $data) = @_;
+ return ("do{ my "
+ . Data::Dumper->new([$data],['x'])->Purity(1)->Terse(0)->Dump()
+ . '$x; }')
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/ModuleInfo.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/ModuleInfo.pm
new file mode 100755
index 00000000000..053ae18d523
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/ModuleInfo.pm
@@ -0,0 +1,491 @@
+# -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*-
+# vim:ts=8:sw=2:et:sta:sts=2
+package Module::Build::ModuleInfo;
+
+# This module provides routines to gather information about
+# perl modules (assuming this may be expanded in the distant
+# parrot future to look at other types of modules).
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+
+use File::Spec;
+use IO::File;
+use Module::Build::Version;
+
+my $V_NUM_REGEXP = qr{v?[0-9._]+}; # crudely, a v-string or decimal
+
+my $PKG_REGEXP = qr{ # match a package declaration
+ ^[\s\{;]* # intro chars on a line
+ package # the word 'package'
+ \s+ # whitespace
+ ([\w:]+) # a package name
+ \s* # optional whitespace
+ ($V_NUM_REGEXP)? # optional version number
+ \s* # optional whitesapce
+ ; # semicolon line terminator
+}x;
+
+my $VARNAME_REGEXP = qr{ # match fully-qualified VERSION name
+ ([\$*]) # sigil - $ or *
+ (
+ ( # optional leading package name
+ (?:::|\')? # possibly starting like just :: (Ì la $::VERSION)
+ (?:\w+(?:::|\'))* # Foo::Bar:: ...
+ )?
+ VERSION
+ )\b
+}x;
+
+my $VERS_REGEXP = qr{ # match a VERSION definition
+ (?:
+ \(\s*$VARNAME_REGEXP\s*\) # with parens
+ |
+ $VARNAME_REGEXP # without parens
+ )
+ \s*
+ =[^=~] # = but not ==, nor =~
+}x;
+
+
+sub new_from_file {
+ my $class = shift;
+ my $filename = File::Spec->rel2abs( shift );
+
+ return undef unless defined( $filename ) && -f $filename;
+ return $class->_init(undef, $filename, @_);
+}
+
+sub new_from_module {
+ my $class = shift;
+ my $module = shift;
+ my %props = @_;
+
+ $props{inc} ||= \@INC;
+ my $filename = $class->find_module_by_name( $module, $props{inc} );
+ return undef unless defined( $filename ) && -f $filename;
+ return $class->_init($module, $filename, %props);
+}
+
+sub _init {
+ my $class = shift;
+ my $module = shift;
+ my $filename = shift;
+ my %props = @_;
+
+ my( %valid_props, @valid_props );
+ @valid_props = qw( collect_pod inc );
+ @valid_props{@valid_props} = delete( @props{@valid_props} );
+ warn "Unknown properties: @{[keys %props]}\n" if scalar( %props );
+
+ my %data = (
+ module => $module,
+ filename => $filename,
+ version => undef,
+ packages => [],
+ versions => {},
+ pod => {},
+ pod_headings => [],
+ collect_pod => 0,
+
+ %valid_props,
+ );
+
+ my $self = bless(\%data, $class);
+
+ $self->_parse_file();
+
+ unless($self->{module} and length($self->{module})) {
+ my ($v, $d, $f) = File::Spec->splitpath($self->{filename});
+ if($f =~ /\.pm$/) {
+ $f =~ s/\..+$//;
+ my @candidates = grep /$f$/, @{$self->{packages}};
+ $self->{module} = shift(@candidates); # punt
+ }
+ else {
+ if(grep /main/, @{$self->{packages}}) {
+ $self->{module} = 'main';
+ }
+ else {
+ $self->{module} = $self->{packages}[0] || '';
+ }
+ }
+ }
+
+ $self->{version} = $self->{versions}{$self->{module}}
+ if defined( $self->{module} );
+
+ return $self;
+}
+
+# class method
+sub _do_find_module {
+ my $class = shift;
+ my $module = shift || die 'find_module_by_name() requires a package name';
+ my $dirs = shift || \@INC;
+
+ my $file = File::Spec->catfile(split( /::/, $module));
+ foreach my $dir ( @$dirs ) {
+ my $testfile = File::Spec->catfile($dir, $file);
+ return [ File::Spec->rel2abs( $testfile ), $dir ]
+ if -e $testfile and !-d _; # For stuff like ExtUtils::xsubpp
+ return [ File::Spec->rel2abs( "$testfile.pm" ), $dir ]
+ if -e "$testfile.pm";
+ }
+ return;
+}
+
+# class method
+sub find_module_by_name {
+ my $found = shift()->_do_find_module(@_) or return;
+ return $found->[0];
+}
+
+# class method
+sub find_module_dir_by_name {
+ my $found = shift()->_do_find_module(@_) or return;
+ return $found->[1];
+}
+
+
+# given a line of perl code, attempt to parse it if it looks like a
+# $VERSION assignment, returning sigil, full name, & package name
+sub _parse_version_expression {
+ my $self = shift;
+ my $line = shift;
+
+ my( $sig, $var, $pkg );
+ if ( $line =~ $VERS_REGEXP ) {
+ ( $sig, $var, $pkg ) = $2 ? ( $1, $2, $3 ) : ( $4, $5, $6 );
+ if ( $pkg ) {
+ $pkg = ($pkg eq '::') ? 'main' : $pkg;
+ $pkg =~ s/::$//;
+ }
+ }
+
+ return ( $sig, $var, $pkg );
+}
+
+sub _parse_file {
+ my $self = shift;
+
+ my $filename = $self->{filename};
+ my $fh = IO::File->new( $filename )
+ or die( "Can't open '$filename': $!" );
+
+ $self->_parse_fh($fh);
+}
+
+sub _parse_fh {
+ my ($self, $fh) = @_;
+
+ my( $in_pod, $seen_end, $need_vers ) = ( 0, 0, 0 );
+ my( @pkgs, %vers, %pod, @pod );
+ my $pkg = 'main';
+ my $pod_sect = '';
+ my $pod_data = '';
+
+ while (defined( my $line = <$fh> )) {
+ my $line_num = $.;
+
+ chomp( $line );
+ next if $line =~ /^\s*#/;
+
+ $in_pod = ($line =~ /^=(?!cut)/) ? 1 : ($line =~ /^=cut/) ? 0 : $in_pod;
+
+ # Would be nice if we could also check $in_string or something too
+ last if !$in_pod && $line =~ /^__(?:DATA|END)__$/;
+
+ if ( $in_pod || $line =~ /^=cut/ ) {
+
+ if ( $line =~ /^=head\d\s+(.+)\s*$/ ) {
+ push( @pod, $1 );
+ if ( $self->{collect_pod} && length( $pod_data ) ) {
+ $pod{$pod_sect} = $pod_data;
+ $pod_data = '';
+ }
+ $pod_sect = $1;
+
+
+ } elsif ( $self->{collect_pod} ) {
+ $pod_data .= "$line\n";
+
+ }
+
+ } else {
+
+ $pod_sect = '';
+ $pod_data = '';
+
+ # parse $line to see if it's a $VERSION declaration
+ my( $vers_sig, $vers_fullname, $vers_pkg ) =
+ $self->_parse_version_expression( $line );
+
+ if ( $line =~ $PKG_REGEXP ) {
+ $pkg = $1;
+ push( @pkgs, $pkg ) unless grep( $pkg eq $_, @pkgs );
+ $vers{$pkg} = (defined $2 ? $2 : undef) unless exists( $vers{$pkg} );
+ $need_vers = defined $2 ? 0 : 1;
+
+ # VERSION defined with full package spec, i.e. $Module::VERSION
+ } elsif ( $vers_fullname && $vers_pkg ) {
+ push( @pkgs, $vers_pkg ) unless grep( $vers_pkg eq $_, @pkgs );
+ $need_vers = 0 if $vers_pkg eq $pkg;
+
+ unless ( defined $vers{$vers_pkg} && length $vers{$vers_pkg} ) {
+ $vers{$vers_pkg} =
+ $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line );
+ } else {
+ # Warn unless the user is using the "$VERSION = eval
+ # $VERSION" idiom (though there are probably other idioms
+ # that we should watch out for...)
+ warn <<"EOM" unless $line =~ /=\s*eval/;
+Package '$vers_pkg' already declared with version '$vers{$vers_pkg}',
+ignoring subsequent declaration on line $line_num.
+EOM
+ }
+
+ # first non-comment line in undeclared package main is VERSION
+ } elsif ( !exists($vers{main}) && $pkg eq 'main' && $vers_fullname ) {
+ $need_vers = 0;
+ my $v =
+ $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line );
+ $vers{$pkg} = $v;
+ push( @pkgs, 'main' );
+
+ # first non-comment line in undeclared package defines package main
+ } elsif ( !exists($vers{main}) && $pkg eq 'main' && $line =~ /\w+/ ) {
+ $need_vers = 1;
+ $vers{main} = '';
+ push( @pkgs, 'main' );
+
+ # only keep if this is the first $VERSION seen
+ } elsif ( $vers_fullname && $need_vers ) {
+ $need_vers = 0;
+ my $v =
+ $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line );
+
+
+ unless ( defined $vers{$pkg} && length $vers{$pkg} ) {
+ $vers{$pkg} = $v;
+ } else {
+ warn <<"EOM";
+Package '$pkg' already declared with version '$vers{$pkg}'
+ignoring new version '$v' on line $line_num.
+EOM
+ }
+
+ }
+
+ }
+
+ }
+
+ if ( $self->{collect_pod} && length($pod_data) ) {
+ $pod{$pod_sect} = $pod_data;
+ }
+
+ $self->{versions} = \%vers;
+ $self->{packages} = \@pkgs;
+ $self->{pod} = \%pod;
+ $self->{pod_headings} = \@pod;
+}
+
+{
+my $pn = 0;
+sub _evaluate_version_line {
+ my $self = shift;
+ my( $sigil, $var, $line ) = @_;
+
+ # Some of this code came from the ExtUtils:: hierarchy.
+
+ # We compile into $vsub because 'use version' would cause
+ # compiletime/runtime issues with local()
+ my $vsub;
+ $pn++; # everybody gets their own package
+ my $eval = qq{BEGIN { q# Hide from _packages_inside()
+ #; package Module::Build::ModuleInfo::_version::p$pn;
+ use Module::Build::Version;
+ no strict;
+
+ local $sigil$var;
+ \$$var=undef;
+ \$vsub = sub {
+ $line;
+ \$$var
+ };
+ }};
+
+ local $^W;
+ # Try to get the $VERSION
+ eval $eval;
+ # some modules say $VERSION = $Foo::Bar::VERSION, but Foo::Bar isn't
+ # installed, so we need to hunt in ./lib for it
+ if ( $@ =~ /Can't locate/ && -d 'lib' ) {
+ local @INC = ('lib',@INC);
+ eval $eval;
+ }
+ warn "Error evaling version line '$eval' in $self->{filename}: $@\n"
+ if $@;
+ (ref($vsub) eq 'CODE') or
+ die "failed to build version sub for $self->{filename}";
+ my $result = eval { $vsub->() };
+ die "Could not get version from $self->{filename} by executing:\n$eval\n\nThe fatal error was: $@\n"
+ if $@;
+
+ # Activestate apparently creates custom versions like '1.23_45_01', which
+ # cause M::B::Version to think it's an invalid alpha. So check for that
+ # and strip them
+ my $num_dots = () = $result =~ m{\.}g;
+ my $num_unders = () = $result =~ m{_}g;
+ if ( substr($result,0,1) ne 'v' && $num_dots < 2 && $num_unders > 1 ) {
+ $result =~ s{_}{}g;
+ }
+
+ # Bless it into our own version class
+ eval { $result = Module::Build::Version->new($result) };
+ die "Version '$result' from $self->{filename} does not appear to be valid:\n$eval\n\nThe fatal error was: $@\n"
+ if $@;
+
+ return $result;
+}
+}
+
+
+############################################################
+
+# accessors
+sub name { $_[0]->{module} }
+
+sub filename { $_[0]->{filename} }
+sub packages_inside { @{$_[0]->{packages}} }
+sub pod_inside { @{$_[0]->{pod_headings}} }
+sub contains_pod { $#{$_[0]->{pod_headings}} }
+
+sub version {
+ my $self = shift;
+ my $mod = shift || $self->{module};
+ my $vers;
+ if ( defined( $mod ) && length( $mod ) &&
+ exists( $self->{versions}{$mod} ) ) {
+ return $self->{versions}{$mod};
+ } else {
+ return undef;
+ }
+}
+
+sub pod {
+ my $self = shift;
+ my $sect = shift;
+ if ( defined( $sect ) && length( $sect ) &&
+ exists( $self->{pod}{$sect} ) ) {
+ return $self->{pod}{$sect};
+ } else {
+ return undef;
+ }
+}
+
+1;
+
+__END__
+
+=for :stopwords ModuleInfo
+
+=head1 NAME
+
+ModuleInfo - Gather package and POD information from a perl module file
+
+
+=head1 DESCRIPTION
+
+=over 4
+
+=item new_from_file($filename, collect_pod => 1)
+
+Construct a C<ModuleInfo> object given the path to a file. Takes an optional
+argument C<collect_pod> which is a boolean that determines whether
+POD data is collected and stored for reference. POD data is not
+collected by default. POD headings are always collected.
+
+=item new_from_module($module, collect_pod => 1, inc => \@dirs)
+
+Construct a C<ModuleInfo> object given a module or package name. In addition
+to accepting the C<collect_pod> argument as described above, this
+method accepts a C<inc> argument which is a reference to an array of
+of directories to search for the module. If none are given, the
+default is @INC.
+
+=item name()
+
+Returns the name of the package represented by this module. If there
+are more than one packages, it makes a best guess based on the
+filename. If it's a script (i.e. not a *.pm) the package name is
+'main'.
+
+=item version($package)
+
+Returns the version as defined by the $VERSION variable for the
+package as returned by the C<name> method if no arguments are
+given. If given the name of a package it will attempt to return the
+version of that package if it is specified in the file.
+
+=item filename()
+
+Returns the absolute path to the file.
+
+=item packages_inside()
+
+Returns a list of packages.
+
+=item pod_inside()
+
+Returns a list of POD sections.
+
+=item contains_pod()
+
+Returns true if there is any POD in the file.
+
+=item pod($section)
+
+Returns the POD data in the given section.
+
+=item find_module_by_name($module, \@dirs)
+
+Returns the path to a module given the module or package name. A list
+of directories can be passed in as an optional parameter, otherwise
+@INC is searched.
+
+Can be called as either an object or a class method.
+
+=item find_module_dir_by_name($module, \@dirs)
+
+Returns the entry in C<@dirs> (or C<@INC> by default) that contains
+the module C<$module>. A list of directories can be passed in as an
+optional parameter, otherwise @INC is searched.
+
+Can be called as either an object or a class method.
+
+=back
+
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>, Randy W. Sims <RandyS@ThePierianSpring.org>
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+perl(1), L<Module::Build>(3)
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Notes.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Notes.pm
new file mode 100755
index 00000000000..cf85d4ee3d3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Notes.pm
@@ -0,0 +1,332 @@
+package Module::Build::Notes;
+
+# A class for persistent hashes
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Data::Dumper;
+use IO::File;
+use Module::Build::Dumper;
+
+sub new {
+ my ($class, %args) = @_;
+ my $file = delete $args{file} or die "Missing required parameter 'file' to new()";
+ my $self = bless {
+ disk => {},
+ new => {},
+ file => $file,
+ %args,
+ }, $class;
+}
+
+sub restore {
+ my $self = shift;
+
+ my $fh = IO::File->new("< $self->{file}") or die "Can't read $self->{file}: $!";
+ $self->{disk} = eval do {local $/; <$fh>};
+ die $@ if $@;
+ $self->{new} = {};
+}
+
+sub access {
+ my $self = shift;
+ return $self->read() unless @_;
+
+ my $key = shift;
+ return $self->read($key) unless @_;
+
+ my $value = shift;
+ $self->write({ $key => $value });
+ return $self->read($key);
+}
+
+sub has_data {
+ my $self = shift;
+ return keys %{$self->read()} > 0;
+}
+
+sub exists {
+ my ($self, $key) = @_;
+ return exists($self->{new}{$key}) || exists($self->{disk}{$key});
+}
+
+sub read {
+ my $self = shift;
+
+ if (@_) {
+ # Return 1 key as a scalar
+ my $key = shift;
+ return $self->{new}{$key} if exists $self->{new}{$key};
+ return $self->{disk}{$key};
+ }
+
+ # Return all data
+ my $out = (keys %{$self->{new}}
+ ? {%{$self->{disk}}, %{$self->{new}}}
+ : $self->{disk});
+ return wantarray ? %$out : $out;
+}
+
+sub _same {
+ my ($self, $x, $y) = @_;
+ return 1 if !defined($x) and !defined($y);
+ return 0 if !defined($x) or !defined($y);
+ return $x eq $y;
+}
+
+sub write {
+ my ($self, $href) = @_;
+ $href ||= {};
+
+ @{$self->{new}}{ keys %$href } = values %$href; # Merge
+
+ # Do some optimization to avoid unnecessary writes
+ foreach my $key (keys %{ $self->{new} }) {
+ next if ref $self->{new}{$key};
+ next if ref $self->{disk}{$key} or !exists $self->{disk}{$key};
+ delete $self->{new}{$key} if $self->_same($self->{new}{$key}, $self->{disk}{$key});
+ }
+
+ if (my $file = $self->{file}) {
+ my ($vol, $dir, $base) = File::Spec->splitpath($file);
+ $dir = File::Spec->catpath($vol, $dir, '');
+ return unless -e $dir && -d $dir; # The user needs to arrange for this
+
+ return if -e $file and !keys %{ $self->{new} }; # Nothing to do
+
+ @{$self->{disk}}{ keys %{$self->{new}} } = values %{$self->{new}}; # Merge
+ $self->_dump($file, $self->{disk});
+
+ $self->{new} = {};
+ }
+ return $self->read;
+}
+
+sub _dump {
+ my ($self, $file, $data) = @_;
+
+ my $fh = IO::File->new("> $file") or die "Can't create '$file': $!";
+ print {$fh} Module::Build::Dumper->_data_dump($data);
+}
+
+my $orig_template = do { local $/; <DATA> };
+close DATA;
+
+sub write_config_data {
+ my ($self, %args) = @_;
+
+ my $template = $orig_template;
+ $template =~ s/NOTES_NAME/$args{config_module}/g;
+ $template =~ s/MODULE_NAME/$args{module}/g;
+ $template =~ s/=begin private\n//;
+ $template =~ s/=end private/=cut/;
+
+ # strip out private POD markers we use to keep pod from being
+ # recognized for *this* source file
+ $template =~ s{$_\n}{} for '=begin private', '=end private';
+
+ my $fh = IO::File->new("> $args{file}") or die "Can't create '$args{file}': $!";
+ print {$fh} $template;
+ print {$fh} "\n__DATA__\n";
+ print {$fh} Module::Build::Dumper->_data_dump([$args{config_data}, $args{feature}, $args{auto_features}]);
+
+}
+
+1;
+
+
+=head1 NAME
+
+Module::Build::Notes - Create persistent distribution configuration modules
+
+=head1 DESCRIPTION
+
+This module is used internally by Module::Build to create persistent
+configuration files that can be installed with a distribution. See
+L<Module::Build::ConfigData> for an example.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+perl(1), L<Module::Build>(3)
+
+=cut
+
+__DATA__
+package NOTES_NAME;
+use strict;
+my $arrayref = eval do {local $/; <DATA>}
+ or die "Couldn't load ConfigData data: $@";
+close DATA;
+my ($config, $features, $auto_features) = @$arrayref;
+
+sub config { $config->{$_[1]} }
+
+sub set_config { $config->{$_[1]} = $_[2] }
+sub set_feature { $features->{$_[1]} = 0+!!$_[2] } # Constrain to 1 or 0
+
+sub auto_feature_names { grep !exists $features->{$_}, keys %$auto_features }
+
+sub feature_names {
+ my @features = (keys %$features, auto_feature_names());
+ @features;
+}
+
+sub config_names { keys %$config }
+
+sub write {
+ my $me = __FILE__;
+ require IO::File;
+
+ # Can't use Module::Build::Dumper here because M::B is only a
+ # build-time prereq of this module
+ require Data::Dumper;
+
+ my $mode_orig = (stat $me)[2] & 07777;
+ chmod($mode_orig | 0222, $me); # Make it writeable
+ my $fh = IO::File->new($me, 'r+') or die "Can't rewrite $me: $!";
+ seek($fh, 0, 0);
+ while (<$fh>) {
+ last if /^__DATA__$/;
+ }
+ die "Couldn't find __DATA__ token in $me" if eof($fh);
+
+ seek($fh, tell($fh), 0);
+ my $data = [$config, $features, $auto_features];
+ $fh->print( 'do{ my '
+ . Data::Dumper->new([$data],['x'])->Purity(1)->Dump()
+ . '$x; }' );
+ truncate($fh, tell($fh));
+ $fh->close;
+
+ chmod($mode_orig, $me)
+ or warn "Couldn't restore permissions on $me: $!";
+}
+
+sub feature {
+ my ($package, $key) = @_;
+ return $features->{$key} if exists $features->{$key};
+
+ my $info = $auto_features->{$key} or return 0;
+
+ # Under perl 5.005, each(%$foo) isn't working correctly when $foo
+ # was reanimated with Data::Dumper and eval(). Not sure why, but
+ # copying to a new hash seems to solve it.
+ my %info = %$info;
+
+ require Module::Build; # XXX should get rid of this
+ while (my ($type, $prereqs) = each %info) {
+ next if $type eq 'description' || $type eq 'recommends';
+
+ my %p = %$prereqs; # Ditto here.
+ while (my ($modname, $spec) = each %p) {
+ my $status = Module::Build->check_installed_status($modname, $spec);
+ if ((!$status->{ok}) xor ($type =~ /conflicts$/)) { return 0; }
+ if ( ! eval "require $modname; 1" ) { return 0; }
+ }
+ }
+ return 1;
+}
+
+=begin private
+
+=head1 NAME
+
+NOTES_NAME - Configuration for MODULE_NAME
+
+=head1 SYNOPSIS
+
+ use NOTES_NAME;
+ $value = NOTES_NAME->config('foo');
+ $value = NOTES_NAME->feature('bar');
+
+ @names = NOTES_NAME->config_names;
+ @names = NOTES_NAME->feature_names;
+
+ NOTES_NAME->set_config(foo => $new_value);
+ NOTES_NAME->set_feature(bar => $new_value);
+ NOTES_NAME->write; # Save changes
+
+
+=head1 DESCRIPTION
+
+This module holds the configuration data for the C<MODULE_NAME>
+module. It also provides a programmatic interface for getting or
+setting that configuration data. Note that in order to actually make
+changes, you'll have to have write access to the C<NOTES_NAME>
+module, and you should attempt to understand the repercussions of your
+actions.
+
+
+=head1 METHODS
+
+=over 4
+
+=item config($name)
+
+Given a string argument, returns the value of the configuration item
+by that name, or C<undef> if no such item exists.
+
+=item feature($name)
+
+Given a string argument, returns the value of the feature by that
+name, or C<undef> if no such feature exists.
+
+=item set_config($name, $value)
+
+Sets the configuration item with the given name to the given value.
+The value may be any Perl scalar that will serialize correctly using
+C<Data::Dumper>. This includes references, objects (usually), and
+complex data structures. It probably does not include transient
+things like filehandles or sockets.
+
+=item set_feature($name, $value)
+
+Sets the feature with the given name to the given boolean value. The
+value will be converted to 0 or 1 automatically.
+
+=item config_names()
+
+Returns a list of all the names of config items currently defined in
+C<NOTES_NAME>, or in scalar context the number of items.
+
+=item feature_names()
+
+Returns a list of all the names of features currently defined in
+C<NOTES_NAME>, or in scalar context the number of features.
+
+=item auto_feature_names()
+
+Returns a list of all the names of features whose availability is
+dynamically determined, or in scalar context the number of such
+features. Does not include such features that have later been set to
+a fixed value.
+
+=item write()
+
+Commits any changes from C<set_config()> and C<set_feature()> to disk.
+Requires write access to the C<NOTES_NAME> module.
+
+=back
+
+
+=head1 AUTHOR
+
+C<NOTES_NAME> was automatically created using C<Module::Build>.
+C<Module::Build> was written by Ken Williams, but he holds no
+authorship claim or copyright claim to the contents of C<NOTES_NAME>.
+
+=end private
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/PPMMaker.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/PPMMaker.pm
new file mode 100755
index 00000000000..977b4370d91
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/PPMMaker.pm
@@ -0,0 +1,189 @@
+package Module::Build::PPMMaker;
+
+use strict;
+use Config;
+use vars qw($VERSION);
+use IO::File;
+
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+
+# This code is mostly borrowed from ExtUtils::MM_Unix 6.10_03, with a
+# few tweaks based on the PPD spec at
+# http://www.xav.com/perl/site/lib/XML/PPD.html
+
+# The PPD spec is based on <http://www.w3.org/TR/NOTE-OSD>
+
+sub new {
+ my $package = shift;
+ return bless {@_}, $package;
+}
+
+sub make_ppd {
+ my ($self, %args) = @_;
+ my $build = delete $args{build};
+
+ my @codebase;
+ if (exists $args{codebase}) {
+ @codebase = ref $args{codebase} ? @{$args{codebase}} : ($args{codebase});
+ } else {
+ my $distfile = $build->ppm_name . '.tar.gz';
+ print "Using default codebase '$distfile'\n";
+ @codebase = ($distfile);
+ }
+
+ my %dist;
+ foreach my $info (qw(name author abstract version)) {
+ my $method = "dist_$info";
+ $dist{$info} = $build->$method() or die "Can't determine distribution's $info\n";
+ }
+
+ $self->_simple_xml_escape($_) foreach $dist{abstract}, @{$dist{author}};
+
+ # TODO: could add <LICENSE HREF=...> tag if we knew what the URLs were for
+ # various licenses
+ my $ppd = <<"PPD";
+<SOFTPKG NAME=\"$dist{name}\" VERSION=\"$dist{version}\">
+ <ABSTRACT>$dist{abstract}</ABSTRACT>
+@{[ join "\n", map " <AUTHOR>$_</AUTHOR>", @{$dist{author}} ]}
+ <IMPLEMENTATION>
+PPD
+
+ # We don't include recommended dependencies because PPD has no way
+ # to distinguish them from normal dependencies. We don't include
+ # build_requires dependencies because the PPM installer doesn't
+ # build or test before installing. And obviously we don't include
+ # conflicts either.
+
+ foreach my $type (qw(requires)) {
+ my $prereq = $build->$type();
+ while (my ($modname, $spec) = each %$prereq) {
+ next if $modname eq 'perl';
+
+ my $min_version = '0.0';
+ foreach my $c ($build->_parse_conditions($spec)) {
+ my ($op, $version) = $c =~ /^\s* (<=?|>=?|==|!=) \s* ([\w.]+) \s*$/x;
+
+ # This is a nasty hack because it fails if there is no >= op
+ if ($op eq '>=') {
+ $min_version = $version;
+ last;
+ }
+ }
+
+ # PPM4 spec requires a '::' for top level modules
+ $modname .= '::' unless $modname =~ /::/;
+
+ $ppd .= qq! <REQUIRE NAME="$modname" VERSION="$min_version" />\n!;
+ }
+ }
+
+ # We only include these tags if this module involves XS, on the
+ # assumption that pure Perl modules will work on any OS.
+ if (keys %{$build->find_xs_files}) {
+ my $perl_version = $self->_ppd_version($build->perl_version);
+ $ppd .= sprintf(<<'EOF', $self->_varchname($build->config) );
+ <ARCHITECTURE NAME="%s" />
+EOF
+ }
+
+ foreach my $codebase (@codebase) {
+ $self->_simple_xml_escape($codebase);
+ $ppd .= sprintf(<<'EOF', $codebase);
+ <CODEBASE HREF="%s" />
+EOF
+ }
+
+ $ppd .= <<'EOF';
+ </IMPLEMENTATION>
+</SOFTPKG>
+EOF
+
+ my $ppd_file = "$dist{name}.ppd";
+ my $fh = IO::File->new(">$ppd_file")
+ or die "Cannot write to $ppd_file: $!";
+
+ my $io_file_ok = eval { IO::File->VERSION(1.13); 1 };
+ $fh->binmode(":utf8")
+ if $io_file_ok && $fh->can('binmode') && $] >= 5.008 && $Config{useperlio};
+ print $fh $ppd;
+ close $fh;
+
+ return $ppd_file;
+}
+
+sub _ppd_version {
+ my ($self, $version) = @_;
+
+ # generates something like "0,18,0,0"
+ return join ',', (split(/\./, $version), (0)x4)[0..3];
+}
+
+sub _varchname { # Copied from PPM.pm
+ my ($self, $config) = @_;
+ my $varchname = $config->{archname};
+ # Append "-5.8" to architecture name for Perl 5.8 and later
+ if ($] >= 5.008) {
+ my $vstring = sprintf "%vd", $^V;
+ $vstring =~ s/\.\d+$//;
+ $varchname .= "-$vstring";
+ }
+ return $varchname;
+}
+
+{
+ my %escapes = (
+ "\n" => "\\n",
+ '"' => '&quot;',
+ '&' => '&amp;',
+ '>' => '&gt;',
+ '<' => '&lt;',
+ );
+ my $rx = join '|', keys %escapes;
+
+ sub _simple_xml_escape {
+ $_[1] =~ s/($rx)/$escapes{$1}/go;
+ }
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::PPMMaker - Perl Package Manager file creation
+
+
+=head1 SYNOPSIS
+
+ On the command line, builds a .ppd file:
+ ./Build ppd
+
+
+=head1 DESCRIPTION
+
+This package contains the code that builds F<.ppd> "Perl Package
+Description" files, in support of ActiveState's "Perl Package
+Manager". Details are here:
+L<http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/>
+
+
+=head1 AUTHOR
+
+Dave Rolsky <autarch@urth.org>, Ken Williams <kwilliams@cpan.org>
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/Amiga.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/Amiga.pm
new file mode 100755
index 00000000000..9356325c9f4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/Amiga.pm
@@ -0,0 +1,34 @@
+package Module::Build::Platform::Amiga;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::Amiga - Builder class for Amiga platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/Default.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/Default.pm
new file mode 100755
index 00000000000..8d46fc47d56
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/Default.pm
@@ -0,0 +1,33 @@
+package Module::Build::Platform::Default;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::Default - Stub class for unknown platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/EBCDIC.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/EBCDIC.pm
new file mode 100755
index 00000000000..140e27872aa
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/EBCDIC.pm
@@ -0,0 +1,34 @@
+package Module::Build::Platform::EBCDIC;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::EBCDIC - Builder class for EBCDIC platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/MPEiX.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/MPEiX.pm
new file mode 100755
index 00000000000..66bbdc95da6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/MPEiX.pm
@@ -0,0 +1,34 @@
+package Module::Build::Platform::MPEiX;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::MPEiX - Builder class for MPEiX platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/MacOS.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/MacOS.pm
new file mode 100755
index 00000000000..b80781bd955
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/MacOS.pm
@@ -0,0 +1,152 @@
+package Module::Build::Platform::MacOS;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+use ExtUtils::Install;
+
+sub have_forkpipe { 0 }
+
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new(@_);
+
+ # $Config{sitelib} and $Config{sitearch} are, unfortunately, missing.
+ foreach ('sitelib', 'sitearch') {
+ $self->config($_ => $self->config("install$_"))
+ unless $self->config($_);
+ }
+
+ # For some reason $Config{startperl} is filled with a bunch of crap.
+ (my $sp = $self->config('startperl')) =~ s/.*Exit \{Status\}\s//;
+ $self->config(startperl => $sp);
+
+ return $self;
+}
+
+sub make_executable {
+ my $self = shift;
+ require MacPerl;
+ foreach (@_) {
+ MacPerl::SetFileInfo('McPL', 'TEXT', $_);
+ }
+}
+
+sub dispatch {
+ my $self = shift;
+
+ if( !@_ and !@ARGV ) {
+ require MacPerl;
+
+ # What comes first in the action list.
+ my @action_list = qw(build test install);
+ my %actions = map {+($_, 1)} $self->known_actions;
+ delete @actions{@action_list};
+ push @action_list, sort { $a cmp $b } keys %actions;
+
+ my %toolserver = map {+$_ => 1} qw(test disttest diff testdb);
+ foreach (@action_list) {
+ $_ .= ' *' if $toolserver{$_};
+ }
+
+ my $cmd = MacPerl::Pick("What build command? ('*' requires ToolServer)", @action_list);
+ return unless defined $cmd;
+ $cmd =~ s/ \*$//;
+ $ARGV[0] = ($cmd);
+
+ my $args = MacPerl::Ask('Any extra arguments? (ie. verbose=1)', '');
+ return unless defined $args;
+ push @ARGV, $self->split_like_shell($args);
+ }
+
+ $self->SUPER::dispatch(@_);
+}
+
+sub ACTION_realclean {
+ my $self = shift;
+ chmod 0666, $self->{properties}{build_script};
+ $self->SUPER::ACTION_realclean;
+}
+
+# ExtUtils::Install has a hard-coded '.' directory in versions less
+# than 1.30. We use a sneaky trick to turn that into ':'.
+#
+# Note that we do it here in a cross-platform way, so this code could
+# actually go in Module::Build::Base. But we put it here to be less
+# intrusive for other platforms.
+
+sub ACTION_install {
+ my $self = shift;
+
+ return $self->SUPER::ACTION_install(@_)
+ if eval {ExtUtils::Install->VERSION('1.30'); 1};
+
+ local $^W = 0; # Avoid a 'redefine' warning
+ local *ExtUtils::Install::find = sub {
+ my ($code, @dirs) = @_;
+
+ @dirs = map { $_ eq '.' ? File::Spec->curdir : $_ } @dirs;
+
+ return File::Find::find($code, @dirs);
+ };
+
+ return $self->SUPER::ACTION_install(@_);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Module::Build::Platform::MacOS - Builder class for MacOS platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base> and override a few methods. Please see
+L<Module::Build> for the docs.
+
+=head2 Overridden Methods
+
+=over 4
+
+=item new()
+
+MacPerl doesn't define $Config{sitelib} or $Config{sitearch} for some
+reason, but $Config{installsitelib} and $Config{installsitearch} are
+there. So we copy the install variables to the other location
+
+=item make_executable()
+
+On MacOS we set the file type and creator to MacPerl so it will run
+with a double-click.
+
+=item dispatch()
+
+Because there's no easy way to say "./Build test" on MacOS, if
+dispatch is called with no arguments and no @ARGV a dialog box will
+pop up asking what action to take and any extra arguments.
+
+Default action is "test".
+
+=item ACTION_realclean()
+
+Need to unlock the Build program before deleting.
+
+=back
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com>
+
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/RiscOS.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/RiscOS.pm
new file mode 100755
index 00000000000..95e31515876
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/RiscOS.pm
@@ -0,0 +1,34 @@
+package Module::Build::Platform::RiscOS;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::RiscOS - Builder class for RiscOS platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/Unix.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/Unix.pm
new file mode 100755
index 00000000000..0be5fc7df07
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/Unix.pm
@@ -0,0 +1,73 @@
+package Module::Build::Platform::Unix;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+sub is_executable {
+ # We consider the owner bit to be authoritative on a file, because
+ # -x will always return true if the user is root and *any*
+ # executable bit is set. The -x test seems to try to answer the
+ # question "can I execute this file", but I think we want "is this
+ # file executable".
+
+ my ($self, $file) = @_;
+ return +(stat $file)[2] & 0100;
+}
+
+sub _startperl { "#! " . shift()->perl }
+
+sub _construct {
+ my $self = shift()->SUPER::_construct(@_);
+
+ # perl 5.8.1-RC[1-3] had some broken %Config entries, and
+ # unfortunately Red Hat 9 shipped it like that. Fix 'em up here.
+ my $c = $self->{config};
+ for (qw(siteman1 siteman3 vendorman1 vendorman3)) {
+ $c->{"install${_}dir"} ||= $c->{"install${_}"};
+ }
+
+ return $self;
+}
+
+# Open group says username should be portable filename characters,
+# but some Unix OS working with ActiveDirectory wind up with user-names
+# with back-slashes in the name. The new code below is very liberal
+# in what it accepts.
+sub _detildefy {
+ my ($self, $value) = @_;
+ $value =~ s[^~([^/]+)?(?=/|$)] # tilde with optional username
+ [$1 ?
+ ((getpwnam $1)[7] || "~$1") :
+ ($ENV{HOME} || (getpwuid $>)[7])
+ ]ex;
+ return $value;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::Unix - Builder class for Unix platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/VMS.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/VMS.pm
new file mode 100755
index 00000000000..f406b7afb6f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/VMS.pm
@@ -0,0 +1,539 @@
+package Module::Build::Platform::VMS;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+use Config;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+
+=head1 NAME
+
+Module::Build::Platform::VMS - Builder class for VMS platforms
+
+=head1 DESCRIPTION
+
+This module inherits from C<Module::Build::Base> and alters a few
+minor details of its functionality. Please see L<Module::Build> for
+the general docs.
+
+=head2 Overridden Methods
+
+=over 4
+
+=item _set_defaults
+
+Change $self->{build_script} to 'Build.com' so @Build works.
+
+=cut
+
+sub _set_defaults {
+ my $self = shift;
+ $self->SUPER::_set_defaults(@_);
+
+ $self->{properties}{build_script} = 'Build.com';
+}
+
+
+=item cull_args
+
+'@Build foo' on VMS will not preserve the case of 'foo'. Rather than forcing
+people to write '@Build "foo"' we'll dispatch case-insensitively.
+
+=cut
+
+sub cull_args {
+ my $self = shift;
+ my($action, $args) = $self->SUPER::cull_args(@_);
+ my @possible_actions = grep { lc $_ eq lc $action } $self->known_actions;
+
+ die "Ambiguous action '$action'. Could be one of @possible_actions"
+ if @possible_actions > 1;
+
+ return ($possible_actions[0], $args);
+}
+
+
+=item manpage_separator
+
+Use '__' instead of '::'.
+
+=cut
+
+sub manpage_separator {
+ return '__';
+}
+
+
+=item prefixify
+
+Prefixify taking into account VMS' filepath syntax.
+
+=cut
+
+# Translated from ExtUtils::MM_VMS::prefixify()
+sub _prefixify {
+ my($self, $path, $sprefix, $type) = @_;
+ my $rprefix = $self->prefix;
+
+ $self->log_verbose(" prefixify $path from $sprefix to $rprefix\n");
+
+ # Translate $(PERLPREFIX) to a real path.
+ $rprefix = VMS::Filespec::vmspath($rprefix) if $rprefix;
+ $sprefix = VMS::Filespec::vmspath($sprefix) if $sprefix;
+
+ $self->log_verbose(" rprefix translated to $rprefix\n".
+ " sprefix translated to $sprefix\n");
+
+ if( length $path == 0 ) {
+ $self->log_verbose(" no path to prefixify.\n")
+ }
+ elsif( !File::Spec->file_name_is_absolute($path) ) {
+ $self->log_verbose(" path is relative, not prefixifying.\n");
+ }
+ elsif( $sprefix eq $rprefix ) {
+ $self->log_verbose(" no new prefix.\n");
+ }
+ else {
+ my($path_vol, $path_dirs) = File::Spec->splitpath( $path );
+ my $vms_prefix = $self->config('vms_prefix');
+ if( $path_vol eq $vms_prefix.':' ) {
+ $self->log_verbose(" $vms_prefix: seen\n");
+
+ $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
+ $path = $self->_catprefix($rprefix, $path_dirs);
+ }
+ else {
+ $self->log_verbose(" cannot prefixify.\n");
+ return $self->prefix_relpaths($self->installdirs, $type);
+ }
+ }
+
+ $self->log_verbose(" now $path\n");
+
+ return $path;
+}
+
+=item _quote_args
+
+Command-line arguments (but not the command itself) must be quoted
+to ensure case preservation.
+
+=cut
+
+sub _quote_args {
+ # Returns a string that can become [part of] a command line with
+ # proper quoting so that the subprocess sees this same list of args,
+ # or if we get a single arg that is an array reference, quote the
+ # elements of it and return the reference.
+ my ($self, @args) = @_;
+ my $got_arrayref = (scalar(@args) == 1
+ && UNIVERSAL::isa($args[0], 'ARRAY'))
+ ? 1
+ : 0;
+
+ # Do not quote qualifiers that begin with '/'.
+ map { if (!/^\//) {
+ $_ =~ s/\"/""/g; # escape C<"> by doubling
+ $_ = q(").$_.q(");
+ }
+ }
+ ($got_arrayref ? @{$args[0]}
+ : @args
+ );
+
+ return $got_arrayref ? $args[0]
+ : join(' ', @args);
+}
+
+=item have_forkpipe
+
+There is no native fork(), so some constructs depending on it are not
+available.
+
+=cut
+
+sub have_forkpipe { 0 }
+
+=item _backticks
+
+Override to ensure that we quote the arguments but not the command.
+
+=cut
+
+sub _backticks {
+ # The command must not be quoted but the arguments to it must be.
+ my ($self, @cmd) = @_;
+ my $cmd = shift @cmd;
+ my $args = $self->_quote_args(@cmd);
+ return `$cmd $args`;
+}
+
+=item find_command
+
+Local an executable program
+
+=cut
+
+sub find_command {
+ my ($self, $command) = @_;
+
+ # a lot of VMS executables have a symbol defined
+ # check those first
+ if ( $^O eq 'VMS' ) {
+ require VMS::DCLsym;
+ my $syms = VMS::DCLsym->new;
+ return $command if scalar $syms->getsym( uc $command );
+ }
+
+ $self->SUPER::find_command($command);
+}
+
+# _maybe_command copied from ExtUtils::MM_VMS::maybe_command
+
+=item _maybe_command (override)
+
+Follows VMS naming conventions for executable files.
+If the name passed in doesn't exactly match an executable file,
+appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
+to check for DCL procedure. If this fails, checks directories in DCL$PATH
+and finally F<Sys$System:> for an executable file having the name specified,
+with or without the F<.Exe>-equivalent suffix.
+
+=cut
+
+sub _maybe_command {
+ my($self,$file) = @_;
+ return $file if -x $file && ! -d _;
+ my(@dirs) = ('');
+ my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
+
+ if ($file !~ m![/:>\]]!) {
+ for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
+ my $dir = $ENV{"DCL\$PATH;$i"};
+ $dir .= ':' unless $dir =~ m%[\]:]$%;
+ push(@dirs,$dir);
+ }
+ push(@dirs,'Sys$System:');
+ foreach my $dir (@dirs) {
+ my $sysfile = "$dir$file";
+ foreach my $ext (@exts) {
+ return $file if -x "$sysfile$ext" && ! -d _;
+ }
+ }
+ }
+ return;
+}
+
+=item do_system
+
+Override to ensure that we quote the arguments but not the command.
+
+=cut
+
+sub do_system {
+ # The command must not be quoted but the arguments to it must be.
+ my ($self, @cmd) = @_;
+ $self->log_verbose("@cmd\n");
+ my $cmd = shift @cmd;
+ my $args = $self->_quote_args(@cmd);
+ return !system("$cmd $args");
+}
+
+=item oneliner
+
+Override to ensure that we do not quote the command.
+
+=cut
+
+sub oneliner {
+ my $self = shift;
+ my $oneliner = $self->SUPER::oneliner(@_);
+
+ $oneliner =~ s/^\"\S+\"//;
+
+ return "MCR $^X $oneliner";
+}
+
+=item _infer_xs_spec
+
+Inherit the standard version but tweak the library file name to be
+something Dynaloader can find.
+
+=cut
+
+sub _infer_xs_spec {
+ my $self = shift;
+ my $file = shift;
+
+ my $spec = $self->SUPER::_infer_xs_spec($file);
+
+ # Need to create with the same name as DynaLoader will load with.
+ if (defined &DynaLoader::mod2fname) {
+ my $file = $$spec{module_name} . '.' . $self->{config}->get('dlext');
+ $file =~ tr/:/_/;
+ $file = DynaLoader::mod2fname([$file]);
+ $$spec{lib_file} = File::Spec->catfile($$spec{archdir}, $file);
+ }
+
+ return $spec;
+}
+
+=item rscan_dir
+
+Inherit the standard version but remove dots at end of name.
+If the extended character set is in effect, do not remove dots from filenames
+with Unix path delimiters.
+
+=cut
+
+sub rscan_dir {
+ my ($self, $dir, $pattern) = @_;
+
+ my $result = $self->SUPER::rscan_dir( $dir, $pattern );
+
+ for my $file (@$result) {
+ if (!_efs() && ($file =~ m#/#)) {
+ $file =~ s/\.$//;
+ }
+ }
+ return $result;
+}
+
+=item dist_dir
+
+Inherit the standard version but replace embedded dots with underscores because
+a dot is the directory delimiter on VMS.
+
+=cut
+
+sub dist_dir {
+ my $self = shift;
+
+ my $dist_dir = $self->SUPER::dist_dir;
+ $dist_dir =~ s/\./_/g unless _efs();
+ return $dist_dir;
+}
+
+=item man3page_name
+
+Inherit the standard version but chop the extra manpage delimiter off the front if
+there is one. The VMS version of splitdir('[.foo]') returns '', 'foo'.
+
+=cut
+
+sub man3page_name {
+ my $self = shift;
+
+ my $mpname = $self->SUPER::man3page_name( shift );
+ my $sep = $self->manpage_separator;
+ $mpname =~ s/^$sep//;
+ return $mpname;
+}
+
+=item expand_test_dir
+
+Inherit the standard version but relativize the paths as the native glob() doesn't
+do that for us.
+
+=cut
+
+sub expand_test_dir {
+ my ($self, $dir) = @_;
+
+ my @reldirs = $self->SUPER::expand_test_dir( $dir );
+
+ for my $eachdir (@reldirs) {
+ my ($v,$d,$f) = File::Spec->splitpath( $eachdir );
+ my $reldir = File::Spec->abs2rel( File::Spec->catpath( $v, $d, '' ) );
+ $eachdir = File::Spec->catfile( $reldir, $f );
+ }
+ return @reldirs;
+}
+
+=item _detildefy
+
+The home-grown glob() does not currently handle tildes, so provide limited support
+here. Expect only UNIX format file specifications for now.
+
+=cut
+
+sub _detildefy {
+ my ($self, $arg) = @_;
+
+ # Apparently double ~ are not translated.
+ return $arg if ($arg =~ /^~~/);
+
+ # Apparently ~ followed by whitespace are not translated.
+ return $arg if ($arg =~ /^~ /);
+
+ if ($arg =~ /^~/) {
+ my $spec = $arg;
+
+ # Remove the tilde
+ $spec =~ s/^~//;
+
+ # Remove any slash following the tilde if present.
+ $spec =~ s#^/##;
+
+ # break up the paths for the merge
+ my $home = VMS::Filespec::unixify($ENV{HOME});
+
+ # In the default VMS mode, the trailing slash is present.
+ # In Unix report mode it is not. The parsing logic assumes that
+ # it is present.
+ $home .= '/' unless $home =~ m#/$#;
+
+ # Trivial case of just ~ by it self
+ if ($spec eq '') {
+ $home =~ s#/$##;
+ return $home;
+ }
+
+ my ($hvol, $hdir, $hfile) = File::Spec::Unix->splitpath($home);
+ if ($hdir eq '') {
+ # Someone has tampered with $ENV{HOME}
+ # So hfile is probably the directory since this should be
+ # a path.
+ $hdir = $hfile;
+ }
+
+ my ($vol, $dir, $file) = File::Spec::Unix->splitpath($spec);
+
+ my @hdirs = File::Spec::Unix->splitdir($hdir);
+ my @dirs = File::Spec::Unix->splitdir($dir);
+
+ my $newdirs;
+
+ # Two cases of tilde handling
+ if ($arg =~ m#^~/#) {
+
+ # Simple case, just merge together
+ $newdirs = File::Spec::Unix->catdir(@hdirs, @dirs);
+
+ } else {
+
+ # Complex case, need to add an updir - No delimiters
+ my @backup = File::Spec::Unix->splitdir(File::Spec::Unix->updir);
+
+ $newdirs = File::Spec::Unix->catdir(@hdirs, @backup, @dirs);
+
+ }
+
+ # Now put the two cases back together
+ $arg = File::Spec::Unix->catpath($hvol, $newdirs, $file);
+
+ }
+ return $arg;
+
+}
+
+=item find_perl_interpreter
+
+On VMS, $^X returns the fully qualified absolute path including version
+number. It's logically impossible to improve on it for getting the perl
+we're currently running, and attempting to manipulate it is usually
+lossy.
+
+=cut
+
+sub find_perl_interpreter {
+ return VMS::Filespec::vmsify($^X);
+}
+
+=item localize_file_path
+
+Convert the file path to the local syntax
+
+=cut
+
+sub localize_file_path {
+ my ($self, $path) = @_;
+ $path = VMS::Filespec::vmsify($path);
+ $path =~ s/\.\z//;
+ return $path;
+}
+
+=item localize_dir_path
+
+Convert the directory path to the local syntax
+
+=cut
+
+sub localize_dir_path {
+ my ($self, $path) = @_;
+ return VMS::Filespec::vmspath($path);
+}
+
+=item ACTION_clean
+
+The home-grown glob() expands a bit too aggressively when given a bare name,
+so default in a zero-length extension.
+
+=cut
+
+sub ACTION_clean {
+ my ($self) = @_;
+ foreach my $item (map glob(VMS::Filespec::rmsexpand($_, '.;0')), $self->cleanup) {
+ $self->delete_filetree($item);
+ }
+}
+
+
+# Need to look up the feature settings. The preferred way is to use the
+# VMS::Feature module, but that may not be available to dual life modules.
+
+my $use_feature;
+BEGIN {
+ if (eval { local $SIG{__DIE__}; require VMS::Feature; }) {
+ $use_feature = 1;
+ }
+}
+
+# Need to look up the UNIX report mode. This may become a dynamic mode
+# in the future.
+sub _unix_rpt {
+ my $unix_rpt;
+ if ($use_feature) {
+ $unix_rpt = VMS::Feature::current("filename_unix_report");
+ } else {
+ my $env_unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
+ $unix_rpt = $env_unix_rpt =~ /^[ET1]/i;
+ }
+ return $unix_rpt;
+}
+
+# Need to look up the EFS character set mode. This may become a dynamic
+# mode in the future.
+sub _efs {
+ my $efs;
+ if ($use_feature) {
+ $efs = VMS::Feature::current("efs_charset");
+ } else {
+ my $env_efs = $ENV{'DECC$EFS_CHARSET'} || '';
+ $efs = $env_efs =~ /^[ET1]/i;
+ }
+ return $efs;
+}
+
+=back
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com>
+Ken Williams <kwilliams@cpan.org>
+Craig A. Berry <craigberry@mac.com>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
+
+1;
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/VOS.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/VOS.pm
new file mode 100755
index 00000000000..001a9507d44
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/VOS.pm
@@ -0,0 +1,34 @@
+package Module::Build::Platform::VOS;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::VOS - Builder class for VOS platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/Windows.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/Windows.pm
new file mode 100755
index 00000000000..1e248a75c5f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/Windows.pm
@@ -0,0 +1,320 @@
+package Module::Build::Platform::Windows;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+
+use Config;
+use File::Basename;
+use File::Spec;
+use IO::File;
+
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+sub manpage_separator {
+ return '.';
+}
+
+sub have_forkpipe { 0 }
+
+sub _detildefy {
+ my ($self, $value) = @_;
+ $value =~ s,^~(?= [/\\] | $ ),$ENV{HOME},x
+ if $ENV{HOME};
+ return $value;
+}
+
+sub ACTION_realclean {
+ my ($self) = @_;
+
+ $self->SUPER::ACTION_realclean();
+
+ my $basename = basename($0);
+ $basename =~ s/(?:\.bat)?$//i;
+
+ if ( lc $basename eq lc $self->build_script ) {
+ if ( $self->build_bat ) {
+ $self->log_verbose("Deleting $basename.bat\n");
+ my $full_progname = $0;
+ $full_progname =~ s/(?:\.bat)?$/.bat/i;
+
+ # Voodoo required to have a batch file delete itself without error;
+ # Syntax differs between 9x & NT: the later requires a null arg (???)
+ require Win32;
+ my $null_arg = (Win32::IsWinNT()) ? '""' : '';
+ my $cmd = qq(start $null_arg /min "\%comspec\%" /c del "$full_progname");
+
+ my $fh = IO::File->new(">> $basename.bat")
+ or die "Can't create $basename.bat: $!";
+ print $fh $cmd;
+ close $fh ;
+ } else {
+ $self->delete_filetree($self->build_script . '.bat');
+ }
+ }
+}
+
+sub make_executable {
+ my $self = shift;
+
+ $self->SUPER::make_executable(@_);
+
+ foreach my $script (@_) {
+
+ # Native batch script
+ if ( $script =~ /\.(bat|cmd)$/ ) {
+ $self->SUPER::make_executable($script);
+ next;
+
+ # Perl script that needs to be wrapped in a batch script
+ } else {
+ my %opts = ();
+ if ( $script eq $self->build_script ) {
+ $opts{ntargs} = q(-x -S %0 --build_bat %*);
+ $opts{otherargs} = q(-x -S "%0" --build_bat %1 %2 %3 %4 %5 %6 %7 %8 %9);
+ }
+
+ my $out = eval {$self->pl2bat(in => $script, update => 1, %opts)};
+ if ( $@ ) {
+ $self->log_warn("WARNING: Unable to convert file '$script' to an executable script:\n$@");
+ } else {
+ $self->SUPER::make_executable($out);
+ }
+ }
+ }
+}
+
+# This routine was copied almost verbatim from the 'pl2bat' utility
+# distributed with perl. It requires too much voodoo with shell quoting
+# differences and shortcomings between the various flavors of Windows
+# to reliably shell out
+sub pl2bat {
+ my $self = shift;
+ my %opts = @_;
+
+ # NOTE: %0 is already enclosed in doublequotes by cmd.exe, as appropriate
+ $opts{ntargs} = '-x -S %0 %*' unless exists $opts{ntargs};
+ $opts{otherargs} = '-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9' unless exists $opts{otherargs};
+
+ $opts{stripsuffix} = '/\\.plx?/' unless exists $opts{stripsuffix};
+ $opts{stripsuffix} = ($opts{stripsuffix} =~ m{^/([^/]*[^/\$]|)\$?/?$} ? $1 : "\Q$opts{stripsuffix}\E");
+
+ unless (exists $opts{out}) {
+ $opts{out} = $opts{in};
+ $opts{out} =~ s/$opts{stripsuffix}$//oi;
+ $opts{out} .= '.bat' unless $opts{in} =~ /\.bat$/i or $opts{in} =~ /^-$/;
+ }
+
+ my $head = <<EOT;
+ \@rem = '--*-Perl-*--
+ \@echo off
+ if "%OS%" == "Windows_NT" goto WinNT
+ perl $opts{otherargs}
+ goto endofperl
+ :WinNT
+ perl $opts{ntargs}
+ if NOT "%COMSPEC%" == "%SystemRoot%\\system32\\cmd.exe" goto endofperl
+ if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+ if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+ goto endofperl
+ \@rem ';
+EOT
+
+ $head =~ s/^\s+//gm;
+ my $headlines = 2 + ($head =~ tr/\n/\n/);
+ my $tail = "\n__END__\n:endofperl\n";
+
+ my $linedone = 0;
+ my $taildone = 0;
+ my $linenum = 0;
+ my $skiplines = 0;
+
+ my $start = $Config{startperl};
+ $start = "#!perl" unless $start =~ /^#!.*perl/;
+
+ my $in = IO::File->new("< $opts{in}") or die "Can't open $opts{in}: $!";
+ my @file = <$in>;
+ $in->close;
+
+ foreach my $line ( @file ) {
+ $linenum++;
+ if ( $line =~ /^:endofperl\b/ ) {
+ if (!exists $opts{update}) {
+ warn "$opts{in} has already been converted to a batch file!\n";
+ return;
+ }
+ $taildone++;
+ }
+ if ( not $linedone and $line =~ /^#!.*perl/ ) {
+ if (exists $opts{update}) {
+ $skiplines = $linenum - 1;
+ $line .= "#line ".(1+$headlines)."\n";
+ } else {
+ $line .= "#line ".($linenum+$headlines)."\n";
+ }
+ $linedone++;
+ }
+ if ( $line =~ /^#\s*line\b/ and $linenum == 2 + $skiplines ) {
+ $line = "";
+ }
+ }
+
+ my $out = IO::File->new("> $opts{out}") or die "Can't open $opts{out}: $!";
+ print $out $head;
+ print $out $start, ( $opts{usewarnings} ? " -w" : "" ),
+ "\n#line ", ($headlines+1), "\n" unless $linedone;
+ print $out @file[$skiplines..$#file];
+ print $out $tail unless $taildone;
+ $out->close;
+
+ return $opts{out};
+}
+
+
+sub _quote_args {
+ # Returns a string that can become [part of] a command line with
+ # proper quoting so that the subprocess sees this same list of args.
+ my ($self, @args) = @_;
+
+ my @quoted;
+
+ for (@args) {
+ if ( /^[^\s*?!\$<>;|'"\[\]\{\}]+$/ ) {
+ # Looks pretty safe
+ push @quoted, $_;
+ } else {
+ # XXX this will obviously have to improve - is there already a
+ # core module lying around that does proper quoting?
+ s/"/\\"/g;
+ push @quoted, qq("$_");
+ }
+ }
+
+ return join " ", @quoted;
+}
+
+
+sub split_like_shell {
+ # As it turns out, Windows command-parsing is very different from
+ # Unix command-parsing. Double-quotes mean different things,
+ # backslashes don't necessarily mean escapes, and so on. So we
+ # can't use Text::ParseWords::shellwords() to break a command string
+ # into words. The algorithm below was bashed out by Randy and Ken
+ # (mostly Randy), and there are a lot of regression tests, so we
+ # should feel free to adjust if desired.
+
+ (my $self, local $_) = @_;
+
+ return @$_ if defined() && UNIVERSAL::isa($_, 'ARRAY');
+
+ my @argv;
+ return @argv unless defined() && length();
+
+ my $arg = '';
+ my( $i, $quote_mode ) = ( 0, 0 );
+
+ while ( $i < length() ) {
+
+ my $ch = substr( $_, $i , 1 );
+ my $next_ch = substr( $_, $i+1, 1 );
+
+ if ( $ch eq '\\' && $next_ch eq '"' ) {
+ $arg .= '"';
+ $i++;
+ } elsif ( $ch eq '\\' && $next_ch eq '\\' ) {
+ $arg .= '\\';
+ $i++;
+ } elsif ( $ch eq '"' && $next_ch eq '"' && $quote_mode ) {
+ $quote_mode = !$quote_mode;
+ $arg .= '"';
+ $i++;
+ } elsif ( $ch eq '"' && $next_ch eq '"' && !$quote_mode &&
+ ( $i + 2 == length() ||
+ substr( $_, $i + 2, 1 ) eq ' ' )
+ ) { # for cases like: a"" => [ 'a' ]
+ push( @argv, $arg );
+ $arg = '';
+ $i += 2;
+ } elsif ( $ch eq '"' ) {
+ $quote_mode = !$quote_mode;
+ } elsif ( $ch eq ' ' && !$quote_mode ) {
+ push( @argv, $arg ) if $arg;
+ $arg = '';
+ ++$i while substr( $_, $i + 1, 1 ) eq ' ';
+ } else {
+ $arg .= $ch;
+ }
+
+ $i++;
+ }
+
+ push( @argv, $arg ) if defined( $arg ) && length( $arg );
+ return @argv;
+}
+
+
+# system(@cmd) does not like having double-quotes in it on Windows.
+# So we quote them and run it as a single command.
+sub do_system {
+ my ($self, @cmd) = @_;
+
+ my $cmd = $self->_quote_args(@cmd);
+ my $status = system($cmd);
+ if ($status and $! =~ /Argument list too long/i) {
+ my $env_entries = '';
+ foreach (sort keys %ENV) { $env_entries .= "$_=>".length($ENV{$_})."; " }
+ warn "'Argument list' was 'too long', env lengths are $env_entries";
+ }
+ return !$status;
+}
+
+# Copied from ExtUtils::MM_Win32
+sub _maybe_command {
+ my($self,$file) = @_;
+ my @e = exists($ENV{'PATHEXT'})
+ ? split(/;/, $ENV{PATHEXT})
+ : qw(.com .exe .bat .cmd);
+ my $e = '';
+ for (@e) { $e .= "\Q$_\E|" }
+ chop $e;
+ # see if file ends in one of the known extensions
+ if ($file =~ /($e)$/i) {
+ return $file if -e $file;
+ }
+ else {
+ for (@e) {
+ return "$file$_" if -e "$file$_";
+ }
+ }
+ return;
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Module::Build::Platform::Windows - Builder class for Windows platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base> and override a few methods. Please see
+L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>, Randy W. Sims <RandyS@ThePierianSpring.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/aix.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/aix.pm
new file mode 100755
index 00000000000..dab064805d3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/aix.pm
@@ -0,0 +1,40 @@
+package Module::Build::Platform::aix;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Platform::Unix;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Platform::Unix);
+
+# This class isn't necessary anymore, but we can't delete it, because
+# some people might still have the old copy in their @INC, containing
+# code we don't want to execute, so we have to make sure an upgrade
+# will replace it with this empty subclass.
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::aix - Builder class for AIX platform
+
+=head1 DESCRIPTION
+
+This module provides some routines very specific to the AIX
+platform.
+
+Please see the L<Module::Build> for the general docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/cygwin.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/cygwin.pm
new file mode 100755
index 00000000000..37c59ad0ce2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/cygwin.pm
@@ -0,0 +1,55 @@
+package Module::Build::Platform::cygwin;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Platform::Unix;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Platform::Unix);
+
+sub manpage_separator {
+ '.'
+}
+
+# Copied from ExtUtils::MM_Cygwin::maybe_command()
+# If our path begins with F</cygdrive/> then we use C<ExtUtils::MM_Win32>
+# to determine if it may be a command. Otherwise we use the tests
+# from C<ExtUtils::MM_Unix>.
+
+sub _maybe_command {
+ my ($self, $file) = @_;
+
+ if ($file =~ m{^/cygdrive/}i) {
+ require Module::Build::Platform::Win32;
+ return Module::Build::Platform::Win32->_maybe_command($file);
+ }
+
+ return $self->SUPER::_maybe_command($file);
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::cygwin - Builder class for Cygwin platform
+
+=head1 DESCRIPTION
+
+This module provides some routines very specific to the cygwin
+platform.
+
+Please see the L<Module::Build> for the general docs.
+
+=head1 AUTHOR
+
+Initial stub by Yitzchak Scott-Thoennes <sthoenna@efn.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/darwin.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/darwin.pm
new file mode 100755
index 00000000000..c2f3126c440
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/darwin.pm
@@ -0,0 +1,40 @@
+package Module::Build::Platform::darwin;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Platform::Unix;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Platform::Unix);
+
+# This class isn't necessary anymore, but we can't delete it, because
+# some people might still have the old copy in their @INC, containing
+# code we don't want to execute, so we have to make sure an upgrade
+# will replace it with this empty subclass.
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::darwin - Builder class for Mac OS X platform
+
+=head1 DESCRIPTION
+
+This module provides some routines very specific to the Mac OS X
+platform.
+
+Please see the L<Module::Build> for the general docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/os2.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/os2.pm
new file mode 100755
index 00000000000..be164ae980b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Platform/os2.pm
@@ -0,0 +1,49 @@
+package Module::Build::Platform::os2;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Platform::Unix;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Platform::Unix);
+
+sub manpage_separator { '.' }
+
+sub have_forkpipe { 0 }
+
+# Copied from ExtUtils::MM_OS2::maybe_command
+sub _maybe_command {
+ my($self,$file) = @_;
+ $file =~ s,[/\\]+,/,g;
+ return $file if -x $file && ! -d _;
+ return "$file.exe" if -x "$file.exe" && ! -d _;
+ return "$file.cmd" if -x "$file.cmd" && ! -d _;
+ return;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::os2 - Builder class for OS/2 platform
+
+=head1 DESCRIPTION
+
+This module provides some routines very specific to the OS/2
+platform.
+
+Please see the L<Module::Build> for the general docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/PodParser.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/PodParser.pm
new file mode 100755
index 00000000000..225450c6b98
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/PodParser.pm
@@ -0,0 +1,106 @@
+package Module::Build::PodParser;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use vars qw(@ISA);
+
+sub new {
+ # Perl is so fun.
+ my $package = shift;
+
+ my $self;
+
+ # Try using Pod::Parser first
+ if (eval{ require Pod::Parser; 1; }) {
+ @ISA = qw(Pod::Parser);
+ $self = $package->SUPER::new(@_);
+ $self->{have_pod_parser} = 1;
+ } else {
+ @ISA = ();
+ *parse_from_filehandle = \&_myparse_from_filehandle;
+ $self = bless {have_pod_parser => 0, @_}, $package;
+ }
+
+ unless ($self->{fh}) {
+ die "No 'file' or 'fh' parameter given" unless $self->{file};
+ $self->{fh} = IO::File->new($self->{file}) or die "Couldn't open $self->{file}: $!";
+ }
+
+ return $self;
+}
+
+sub _myparse_from_filehandle {
+ my ($self, $fh) = @_;
+
+ local $_;
+ while (<$fh>) {
+ next unless /^=(?!cut)/ .. /^=cut/; # in POD
+ last if ($self->{abstract}) = /^ (?: [a-z:]+ \s+ - \s+ ) (.*\S) /ix;
+ }
+
+ my @author;
+ while (<$fh>) {
+ next unless /^=head1\s+AUTHORS?/i ... /^=/;
+ next if /^=/;
+ push @author, $_ if /\@/;
+ }
+ return unless @author;
+ s/^\s+|\s+$//g foreach @author;
+
+ $self->{author} = \@author;
+
+ return;
+}
+
+sub get_abstract {
+ my $self = shift;
+ return $self->{abstract} if defined $self->{abstract};
+
+ $self->parse_from_filehandle($self->{fh});
+
+ return $self->{abstract};
+}
+
+sub get_author {
+ my $self = shift;
+ return $self->{author} if defined $self->{author};
+
+ $self->parse_from_filehandle($self->{fh});
+
+ return $self->{author} || [];
+}
+
+################## Pod::Parser overrides ###########
+sub initialize {
+ my $self = shift;
+ $self->{_head} = '';
+ $self->SUPER::initialize();
+}
+
+sub command {
+ my ($self, $cmd, $text) = @_;
+ if ( $cmd eq 'head1' ) {
+ $text =~ s/^\s+//;
+ $text =~ s/\s+$//;
+ $self->{_head} = $text;
+ }
+}
+
+sub textblock {
+ my ($self, $text) = @_;
+ $text =~ s/^\s+//;
+ $text =~ s/\s+$//;
+ if (uc $self->{_head} eq 'NAME') {
+ my ($name, $abstract) = split( /\s+-\s+/, $text, 2 );
+ $self->{abstract} = $abstract;
+ } elsif ($self->{_head} =~ /^AUTHORS?$/i) {
+ push @{$self->{author}}, $text if $text =~ /\@/;
+ }
+}
+
+sub verbatim {}
+sub interior_sequence {}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/Version.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/Version.pm
new file mode 100755
index 00000000000..21abe00cbe0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/Version.pm
@@ -0,0 +1,684 @@
+package Module::Build::Version;
+use strict;
+
+use vars qw($VERSION);
+$VERSION = 0.77;
+
+eval "use version $VERSION";
+if ($@) { # can't locate version files, use our own
+
+ # Avoid redefined warnings if an old version.pm was available
+ delete $version::{$_} foreach keys %version::;
+
+ # first we get the stub version module
+ my $version;
+ while (<DATA>) {
+ s/(\$VERSION)\s=\s\d+/\$VERSION = 0/;
+ $version .= $_ if $_;
+ last if /^1;$/;
+ }
+
+ # and now get the current version::vpp code
+ my $vpp;
+ while (<DATA>) {
+ s/(\$VERSION)\s=\s\d+/\$VERSION = 0/;
+ $vpp .= $_ if $_;
+ last if /^1;$/;
+ }
+
+ # but we eval them in reverse order since version depends on
+ # version::vpp to already exist
+ eval $vpp; die $@ if $@;
+ $INC{'version/vpp.pm'} = 'inside Module::Build::Version';
+ eval $version; die $@ if $@;
+ $INC{'version.pm'} = 'inside Module::Build::Version';
+}
+
+# now we can safely subclass version, installed or not
+use vars qw(@ISA);
+@ISA = qw(version);
+
+1;
+__DATA__
+# stub version module to make everything else happy
+package version;
+
+use 5.005_04;
+use strict;
+
+use vars qw(@ISA $VERSION $CLASS *declare *qv);
+
+$VERSION = 0.77;
+
+$CLASS = 'version';
+
+push @ISA, "version::vpp";
+local $^W;
+*version::qv = \&version::vpp::qv;
+*version::declare = \&version::vpp::declare;
+*version::_VERSION = \&version::vpp::_VERSION;
+if ($] > 5.009001 && $] <= 5.010000) {
+ no strict 'refs';
+ *{'version::stringify'} = \*version::vpp::stringify;
+ *{'version::(""'} = \*version::vpp::stringify;
+ *{'version::new'} = \*version::vpp::new;
+}
+
+# Preloaded methods go here.
+sub import {
+ no strict 'refs';
+ my ($class) = shift;
+
+ # Set up any derived class
+ unless ($class eq 'version') {
+ local $^W;
+ *{$class.'::declare'} = \&version::declare;
+ *{$class.'::qv'} = \&version::qv;
+ }
+
+ my %args;
+ if (@_) { # any remaining terms are arguments
+ map { $args{$_} = 1 } @_
+ }
+ else { # no parameters at all on use line
+ %args =
+ (
+ qv => 1,
+ 'UNIVERSAL::VERSION' => 1,
+ );
+ }
+
+ my $callpkg = caller();
+
+ if (exists($args{declare})) {
+ *{$callpkg."::declare"} =
+ sub {return $class->declare(shift) }
+ unless defined(&{$callpkg.'::declare'});
+ }
+
+ if (exists($args{qv})) {
+ *{$callpkg."::qv"} =
+ sub {return $class->qv(shift) }
+ unless defined(&{"$callpkg\::qv"});
+ }
+
+ if (exists($args{'UNIVERSAL::VERSION'})) {
+ local $^W;
+ *UNIVERSAL::VERSION = \&version::_VERSION;
+ }
+
+ if (exists($args{'VERSION'})) {
+ *{$callpkg."::VERSION"} = \&version::_VERSION;
+ }
+}
+
+1;
+
+# replace everything from here to the end with the current version/vpp.pm
+package version::vpp;
+use strict;
+
+use POSIX qw/locale_h/;
+use locale;
+use vars qw ($VERSION @ISA @REGEXS);
+$VERSION = '0.77';
+$VERSION = eval $VERSION;
+
+push @REGEXS, qr/
+ ^v? # optional leading 'v'
+ (\d*) # major revision not required
+ \. # requires at least one decimal
+ (?:(\d+)\.?){1,}
+ /x;
+
+use overload (
+ '""' => \&stringify,
+ '0+' => \&numify,
+ 'cmp' => \&vcmp,
+ '<=>' => \&vcmp,
+ 'bool' => \&vbool,
+ 'nomethod' => \&vnoop,
+);
+
+my $VERSION_MAX = 0x7FFFFFFF;
+
+eval "use warnings";
+if ($@) {
+ eval '
+ package warnings;
+ sub enabled {return $^W;}
+ 1;
+ ';
+}
+
+sub new
+{
+ my ($class, $value) = @_;
+ my $self = bless ({}, ref ($class) || $class);
+
+ if ( ref($value) && eval('$value->isa("version")') ) {
+ # Can copy the elements directly
+ $self->{version} = [ @{$value->{version} } ];
+ $self->{qv} = 1 if $value->{qv};
+ $self->{alpha} = 1 if $value->{alpha};
+ $self->{original} = ''.$value->{original};
+ return $self;
+ }
+
+ my $currlocale = setlocale(LC_ALL);
+
+ # if the current locale uses commas for decimal points, we
+ # just replace commas with decimal places, rather than changing
+ # locales
+ if ( localeconv()->{decimal_point} eq ',' ) {
+ $value =~ tr/,/./;
+ }
+
+ if ( not defined $value or $value =~ /^undef$/ ) {
+ # RT #19517 - special case for undef comparison
+ # or someone forgot to pass a value
+ push @{$self->{version}}, 0;
+ $self->{original} = "0";
+ return ($self);
+ }
+
+ if ( $#_ == 2 ) { # must be CVS-style
+ $value = 'v'.$_[2];
+ }
+
+ $value = _un_vstring($value);
+
+ # exponential notation
+ if ( $value =~ /\d+.?\d*e[-+]?\d+/ ) {
+ $value = sprintf("%.9f",$value);
+ $value =~ s/(0+)$//; # trim trailing zeros
+ }
+
+ # This is not very efficient, but it is morally equivalent
+ # to the XS code (as that is the reference implementation).
+ # See vutil/vutil.c for details
+ my $qv = 0;
+ my $alpha = 0;
+ my $width = 3;
+ my $saw_period = 0;
+ my $vinf = 0;
+ my ($start, $last, $pos, $s);
+ $s = 0;
+
+ while ( substr($value,$s,1) =~ /\s/ ) { # leading whitespace is OK
+ $s++;
+ }
+
+ if (substr($value,$s,1) eq 'v') {
+ $s++; # get past 'v'
+ $qv = 1; # force quoted version processing
+ }
+
+ $start = $last = $pos = $s;
+
+ # pre-scan the input string to check for decimals/underbars
+ while ( substr($value,$pos,1) =~ /[._\d,]/ ) {
+ if ( substr($value,$pos,1) eq '.' ) {
+ if ($alpha) {
+ Carp::croak("Invalid version format ".
+ "(underscores before decimal)");
+ }
+ $saw_period++;
+ $last = $pos;
+ }
+ elsif ( substr($value,$pos,1) eq '_' ) {
+ if ($alpha) {
+ require Carp;
+ Carp::croak("Invalid version format ".
+ "(multiple underscores)");
+ }
+ $alpha = 1;
+ $width = $pos - $last - 1; # natural width of sub-version
+ }
+ elsif ( substr($value,$pos,1) eq ','
+ and substr($value,$pos+1,1) =~ /[0-9]/ ) {
+ # looks like an unhandled locale
+ $saw_period++;
+ $last = $pos;
+ }
+ $pos++;
+ }
+
+ if ( $alpha && !$saw_period ) {
+ require Carp;
+ Carp::croak("Invalid version format ".
+ "(alpha without decimal)");
+ }
+
+ if ( $alpha && $saw_period && $width == 0 ) {
+ require Carp;
+ Carp::croak("Invalid version format ".
+ "(misplaced _ in number)");
+ }
+
+ if ( $saw_period > 1 ) {
+ $qv = 1; # force quoted version processing
+ }
+
+ $last = $pos;
+ $pos = $s;
+
+ if ( $qv ) {
+ $self->{qv} = 1;
+ }
+
+ if ( $alpha ) {
+ $self->{alpha} = 1;
+ }
+
+ if ( !$qv && $width < 3 ) {
+ $self->{width} = $width;
+ }
+
+ while ( substr($value,$pos,1) =~ /\d/ ) {
+ $pos++;
+ }
+
+ if ( substr($value,$pos,1) !~ /[a-z]/ ) { ### FIX THIS ###
+ my $rev;
+
+ while (1) {
+ $rev = 0;
+ {
+
+ # this is atoi() that delimits on underscores
+ my $end = $pos;
+ my $mult = 1;
+ my $orev;
+
+ # the following if() will only be true after the decimal
+ # point of a version originally created with a bare
+ # floating point number, i.e. not quoted in any way
+ if ( !$qv && $s > $start && $saw_period == 1 ) {
+ $mult *= 100;
+ while ( $s < $end ) {
+ $orev = $rev;
+ $rev += substr($value,$s,1) * $mult;
+ $mult /= 10;
+ if ( abs($orev) > abs($rev)
+ || abs($rev) > abs($VERSION_MAX) ) {
+ if ( warnings::enabled("overflow") ) {
+ require Carp;
+ Carp::carp("Integer overflow in version");
+ }
+ $s = $end - 1;
+ $rev = $VERSION_MAX;
+ }
+ $s++;
+ if ( substr($value,$s,1) eq '_' ) {
+ $s++;
+ }
+ }
+ }
+ else {
+ while (--$end >= $s) {
+ $orev = $rev;
+ $rev += substr($value,$end,1) * $mult;
+ $mult *= 10;
+ if ( abs($orev) > abs($rev)
+ || abs($rev) > abs($VERSION_MAX) ) {
+ if ( warnings::enabled("overflow") ) {
+ require Carp;
+ Carp::carp("Integer overflow in version");
+ }
+ $end = $s - 1;
+ $rev = $VERSION_MAX;
+ }
+ }
+ }
+ }
+
+ # Append revision
+ push @{$self->{version}}, $rev;
+ if ( substr($value,$pos,1) eq '.'
+ && substr($value,$pos+1,1) =~ /\d/ ) {
+ $s = ++$pos;
+ }
+ elsif ( substr($value,$pos,1) eq '_'
+ && substr($value,$pos+1,1) =~ /\d/ ) {
+ $s = ++$pos;
+ }
+ elsif ( substr($value,$pos,1) eq ','
+ && substr($value,$pos+1,1) =~ /\d/ ) {
+ $s = ++$pos;
+ }
+ elsif ( substr($value,$pos,1) =~ /\d/ ) {
+ $s = $pos;
+ }
+ else {
+ $s = $pos;
+ last;
+ }
+ if ( $qv ) {
+ while ( substr($value,$pos,1) =~ /\d/ ) {
+ $pos++;
+ }
+ }
+ else {
+ my $digits = 0;
+ while (substr($value,$pos,1) =~ /[\d_]/ && $digits < 3) {
+ if ( substr($value,$pos,1) ne '_' ) {
+ $digits++;
+ }
+ $pos++;
+ }
+ }
+ }
+ }
+ if ( $qv ) { # quoted versions always get at least three terms
+ my $len = scalar @{$self->{version}};
+ $len = 3 - $len;
+ while ($len-- > 0) {
+ push @{$self->{version}}, 0;
+ }
+ }
+
+ if ( substr($value,$pos) ) { # any remaining text
+ if ( warnings::enabled("misc") ) {
+ require Carp;
+ Carp::carp("Version string '$value' contains invalid data; ".
+ "ignoring: '".substr($value,$pos)."'");
+ }
+ }
+
+ # cache the original value for use when stringification
+ if ( $vinf ) {
+ $self->{vinf} = 1;
+ $self->{original} = 'v.Inf';
+ }
+ else {
+ $self->{original} = substr($value,0,$pos);
+ }
+
+ return ($self);
+}
+
+*parse = \&new;
+
+sub numify
+{
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ my $width = $self->{width} || 3;
+ my $alpha = $self->{alpha} || "";
+ my $len = $#{$self->{version}};
+ my $digit = $self->{version}[0];
+ my $string = sprintf("%d.", $digit );
+
+ for ( my $i = 1 ; $i < $len ; $i++ ) {
+ $digit = $self->{version}[$i];
+ if ( $width < 3 ) {
+ my $denom = 10**(3-$width);
+ my $quot = int($digit/$denom);
+ my $rem = $digit - ($quot * $denom);
+ $string .= sprintf("%0".$width."d_%d", $quot, $rem);
+ }
+ else {
+ $string .= sprintf("%03d", $digit);
+ }
+ }
+
+ if ( $len > 0 ) {
+ $digit = $self->{version}[$len];
+ if ( $alpha && $width == 3 ) {
+ $string .= "_";
+ }
+ $string .= sprintf("%0".$width."d", $digit);
+ }
+ else # $len = 0
+ {
+ $string .= sprintf("000");
+ }
+
+ return $string;
+}
+
+sub normal
+{
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ my $alpha = $self->{alpha} || "";
+ my $len = $#{$self->{version}};
+ my $digit = $self->{version}[0];
+ my $string = sprintf("v%d", $digit );
+
+ for ( my $i = 1 ; $i < $len ; $i++ ) {
+ $digit = $self->{version}[$i];
+ $string .= sprintf(".%d", $digit);
+ }
+
+ if ( $len > 0 ) {
+ $digit = $self->{version}[$len];
+ if ( $alpha ) {
+ $string .= sprintf("_%0d", $digit);
+ }
+ else {
+ $string .= sprintf(".%0d", $digit);
+ }
+ }
+
+ if ( $len <= 2 ) {
+ for ( $len = 2 - $len; $len != 0; $len-- ) {
+ $string .= sprintf(".%0d", 0);
+ }
+ }
+
+ return $string;
+}
+
+sub stringify
+{
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ return exists $self->{original}
+ ? $self->{original}
+ : exists $self->{qv}
+ ? $self->normal
+ : $self->numify;
+}
+
+sub vcmp
+{
+ require UNIVERSAL;
+ my ($left,$right,$swap) = @_;
+ my $class = ref($left);
+ unless ( UNIVERSAL::isa($right, $class) ) {
+ $right = $class->new($right);
+ }
+
+ if ( $swap ) {
+ ($left, $right) = ($right, $left);
+ }
+ unless (_verify($left)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ unless (_verify($right)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ my $l = $#{$left->{version}};
+ my $r = $#{$right->{version}};
+ my $m = $l < $r ? $l : $r;
+ my $lalpha = $left->is_alpha;
+ my $ralpha = $right->is_alpha;
+ my $retval = 0;
+ my $i = 0;
+ while ( $i <= $m && $retval == 0 ) {
+ $retval = $left->{version}[$i] <=> $right->{version}[$i];
+ $i++;
+ }
+
+ # tiebreaker for alpha with identical terms
+ if ( $retval == 0
+ && $l == $r
+ && $left->{version}[$m] == $right->{version}[$m]
+ && ( $lalpha || $ralpha ) ) {
+
+ if ( $lalpha && !$ralpha ) {
+ $retval = -1;
+ }
+ elsif ( $ralpha && !$lalpha) {
+ $retval = +1;
+ }
+ }
+
+ # possible match except for trailing 0's
+ if ( $retval == 0 && $l != $r ) {
+ if ( $l < $r ) {
+ while ( $i <= $r && $retval == 0 ) {
+ if ( $right->{version}[$i] != 0 ) {
+ $retval = -1; # not a match after all
+ }
+ $i++;
+ }
+ }
+ else {
+ while ( $i <= $l && $retval == 0 ) {
+ if ( $left->{version}[$i] != 0 ) {
+ $retval = +1; # not a match after all
+ }
+ $i++;
+ }
+ }
+ }
+
+ return $retval;
+}
+
+sub vbool {
+ my ($self) = @_;
+ return vcmp($self,$self->new("0"),1);
+}
+
+sub vnoop {
+ require Carp;
+ Carp::croak("operation not supported with version object");
+}
+
+sub is_alpha {
+ my ($self) = @_;
+ return (exists $self->{alpha});
+}
+
+sub qv {
+ my $value = shift;
+ my $class = 'version';
+ if (@_) {
+ $class = ref($value) || $value;
+ $value = shift;
+ }
+
+ $value = _un_vstring($value);
+ $value = 'v'.$value unless $value =~ /(^v|\d+\.\d+\.\d)/;
+ my $version = $class->new($value);
+ return $version;
+}
+
+*declare = \&qv;
+
+sub is_qv {
+ my ($self) = @_;
+ return (exists $self->{qv});
+}
+
+
+sub _verify {
+ my ($self) = @_;
+ if ( ref($self)
+ && eval { exists $self->{version} }
+ && ref($self->{version}) eq 'ARRAY'
+ ) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+
+sub _un_vstring {
+ my $value = shift;
+ # may be a v-string
+ if ( $] >= 5.006_000 && length($value) >= 3 && $value !~ /[._]/ ) {
+ my $tvalue = sprintf("v%vd",$value);
+ if ( $tvalue =~ /^v\d+\.\d+\.\d+$/ ) {
+ # must be a v-string
+ $value = $tvalue;
+ }
+ }
+ return $value;
+}
+
+sub _VERSION {
+ my ($obj, $req) = @_;
+ my $class = ref($obj) || $obj;
+
+ no strict 'refs';
+ if ( exists $INC{"$class.pm"} and not %{"$class\::"} and $] >= 5.008) {
+ # file but no package
+ require Carp;
+ Carp::croak( "$class defines neither package nor VERSION"
+ ."--version check failed");
+ }
+
+ my $version = eval "\$$class\::VERSION";
+ if ( defined $version ) {
+ local $^W if $] <= 5.008;
+ $version = version::vpp->new($version);
+ }
+
+ if ( defined $req ) {
+ unless ( defined $version ) {
+ require Carp;
+ my $msg = $] < 5.006
+ ? "$class version $req required--this is only version "
+ : "$class does not define \$$class\::VERSION"
+ ."--version check failed";
+
+ if ( $ENV{VERSION_DEBUG} ) {
+ Carp::confess($msg);
+ }
+ else {
+ Carp::croak($msg);
+ }
+ }
+
+ $req = version::vpp->new($req);
+
+ if ( $req > $version ) {
+ require Carp;
+ if ( $req->is_qv ) {
+ Carp::croak(
+ sprintf ("%s version %s required--".
+ "this is only version %s", $class,
+ $req->normal, $version->normal)
+ );
+ }
+ else {
+ Carp::croak(
+ sprintf ("%s version %s required--".
+ "this is only version %s", $class,
+ $req->stringify, $version->stringify)
+ );
+ }
+ }
+ }
+
+ return defined $version ? $version->stringify : undef;
+}
+
+1; #this line is important and will help the module return a true value
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Build/YAML.pm b/Master/tlpkg/tlperl.straw/lib/Module/Build/YAML.pm
new file mode 100755
index 00000000000..2da91f22563
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Build/YAML.pm
@@ -0,0 +1,600 @@
+# Adapted from YAML::Tiny 1.40
+package Module::Build::YAML;
+
+use strict;
+use Carp 'croak';
+
+# UTF Support?
+sub HAVE_UTF8 () { $] >= 5.007003 }
+BEGIN {
+ if ( HAVE_UTF8 ) {
+ # The string eval helps hide this from Test::MinimumVersion
+ eval "require utf8;";
+ die "Failed to load UTF-8 support" if $@;
+ }
+
+ # Class structure
+ require 5.004;
+
+ $Module::Build::YAML::VERSION = '1.40';
+
+ # Error storage
+ $Module::Build::YAML::errstr = '';
+}
+
+# The character class of all characters we need to escape
+# NOTE: Inlined, since it's only used once
+# my $RE_ESCAPE = '[\\x00-\\x08\\x0b-\\x0d\\x0e-\\x1f\"\n]';
+
+# Printed form of the unprintable characters in the lowest range
+# of ASCII characters, listed by ASCII ordinal position.
+my @UNPRINTABLE = qw(
+ z x01 x02 x03 x04 x05 x06 a
+ x08 t n v f r x0e x0f
+ x10 x11 x12 x13 x14 x15 x16 x17
+ x18 x19 x1a e x1c x1d x1e x1f
+);
+
+# Printable characters for escapes
+my %UNESCAPES = (
+ z => "\x00", a => "\x07", t => "\x09",
+ n => "\x0a", v => "\x0b", f => "\x0c",
+ r => "\x0d", e => "\x1b", '\\' => '\\',
+);
+
+# Special magic boolean words
+my %QUOTE = map { $_ => 1 } qw{
+ null Null NULL
+ y Y yes Yes YES n N no No NO
+ true True TRUE false False FALSE
+ on On ON off Off OFF
+};
+
+#####################################################################
+# Implementation
+
+# Create an empty Module::Build::YAML object
+sub new {
+ my $class = shift;
+ bless [ @_ ], $class;
+}
+
+# Create an object from a file
+sub read {
+ my $class = ref $_[0] ? ref shift : shift;
+
+ # Check the file
+ my $file = shift or return $class->_error( 'You did not specify a file name' );
+ return $class->_error( "File '$file' does not exist" ) unless -e $file;
+ return $class->_error( "'$file' is a directory, not a file" ) unless -f _;
+ return $class->_error( "Insufficient permissions to read '$file'" ) unless -r _;
+
+ # Slurp in the file
+ local $/ = undef;
+ local *CFG;
+ unless ( open(CFG, $file) ) {
+ return $class->_error("Failed to open file '$file': $!");
+ }
+ my $contents = <CFG>;
+ unless ( close(CFG) ) {
+ return $class->_error("Failed to close file '$file': $!");
+ }
+
+ $class->read_string( $contents );
+}
+
+# Create an object from a string
+sub read_string {
+ my $class = ref $_[0] ? ref shift : shift;
+ my $self = bless [], $class;
+ my $string = $_[0];
+ unless ( defined $string ) {
+ return $self->_error("Did not provide a string to load");
+ }
+
+ # Byte order marks
+ # NOTE: Keeping this here to educate maintainers
+ # my %BOM = (
+ # "\357\273\277" => 'UTF-8',
+ # "\376\377" => 'UTF-16BE',
+ # "\377\376" => 'UTF-16LE',
+ # "\377\376\0\0" => 'UTF-32LE'
+ # "\0\0\376\377" => 'UTF-32BE',
+ # );
+ if ( $string =~ /^(?:\376\377|\377\376|\377\376\0\0|\0\0\376\377)/ ) {
+ return $self->_error("Stream has a non UTF-8 BOM");
+ } else {
+ # Strip UTF-8 bom if found, we'll just ignore it
+ $string =~ s/^\357\273\277//;
+ }
+
+ # Try to decode as utf8
+ utf8::decode($string) if HAVE_UTF8;
+
+ # Check for some special cases
+ return $self unless length $string;
+ unless ( $string =~ /[\012\015]+\z/ ) {
+ return $self->_error("Stream does not end with newline character");
+ }
+
+ # Split the file into lines
+ my @lines = grep { ! /^\s*(?:\#.*)?\z/ }
+ split /(?:\015{1,2}\012|\015|\012)/, $string;
+
+ # Strip the initial YAML header
+ @lines and $lines[0] =~ /^\%YAML[: ][\d\.]+.*\z/ and shift @lines;
+
+ # A nibbling parser
+ while ( @lines ) {
+ # Do we have a document header?
+ if ( $lines[0] =~ /^---\s*(?:(.+)\s*)?\z/ ) {
+ # Handle scalar documents
+ shift @lines;
+ if ( defined $1 and $1 !~ /^(?:\#.+|\%YAML[: ][\d\.]+)\z/ ) {
+ push @$self, $self->_read_scalar( "$1", [ undef ], \@lines );
+ next;
+ }
+ }
+
+ if ( ! @lines or $lines[0] =~ /^(?:---|\.\.\.)/ ) {
+ # A naked document
+ push @$self, undef;
+ while ( @lines and $lines[0] !~ /^---/ ) {
+ shift @lines;
+ }
+
+ } elsif ( $lines[0] =~ /^\s*\-/ ) {
+ # An array at the root
+ my $document = [ ];
+ push @$self, $document;
+ $self->_read_array( $document, [ 0 ], \@lines );
+
+ } elsif ( $lines[0] =~ /^(\s*)\S/ ) {
+ # A hash at the root
+ my $document = { };
+ push @$self, $document;
+ $self->_read_hash( $document, [ length($1) ], \@lines );
+
+ } else {
+ croak("Module::Build::YAML failed to classify the line '$lines[0]'");
+ }
+ }
+
+ $self;
+}
+
+# Deparse a scalar string to the actual scalar
+sub _read_scalar {
+ my ($self, $string, $indent, $lines) = @_;
+
+ # Trim trailing whitespace
+ $string =~ s/\s*\z//;
+
+ # Explitic null/undef
+ return undef if $string eq '~';
+
+ # Quotes
+ if ( $string =~ /^\'(.*?)\'\z/ ) {
+ return '' unless defined $1;
+ $string = $1;
+ $string =~ s/\'\'/\'/g;
+ return $string;
+ }
+ if ( $string =~ /^\"((?:\\.|[^\"])*)\"\z/ ) {
+ # Reusing the variable is a little ugly,
+ # but avoids a new variable and a string copy.
+ $string = $1;
+ $string =~ s/\\"/"/g;
+ $string =~ s/\\([never\\fartz]|x([0-9a-fA-F]{2}))/(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}/gex;
+ return $string;
+ }
+
+ # Special cases
+ if ( $string =~ /^[\'\"!&]/ ) {
+ croak("Module::Build::YAML does not support a feature in line '$lines->[0]'");
+ }
+ return {} if $string eq '{}';
+ return [] if $string eq '[]';
+
+ # Regular unquoted string
+ return $string unless $string =~ /^[>|]/;
+
+ # Error
+ croak("Module::Build::YAML failed to find multi-line scalar content") unless @$lines;
+
+ # Check the indent depth
+ $lines->[0] =~ /^(\s*)/;
+ $indent->[-1] = length("$1");
+ if ( defined $indent->[-2] and $indent->[-1] <= $indent->[-2] ) {
+ croak("Module::Build::YAML found bad indenting in line '$lines->[0]'");
+ }
+
+ # Pull the lines
+ my @multiline = ();
+ while ( @$lines ) {
+ $lines->[0] =~ /^(\s*)/;
+ last unless length($1) >= $indent->[-1];
+ push @multiline, substr(shift(@$lines), length($1));
+ }
+
+ my $j = (substr($string, 0, 1) eq '>') ? ' ' : "\n";
+ my $t = (substr($string, 1, 1) eq '-') ? '' : "\n";
+ return join( $j, @multiline ) . $t;
+}
+
+# Parse an array
+sub _read_array {
+ my ($self, $array, $indent, $lines) = @_;
+
+ while ( @$lines ) {
+ # Check for a new document
+ if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) {
+ while ( @$lines and $lines->[0] !~ /^---/ ) {
+ shift @$lines;
+ }
+ return 1;
+ }
+
+ # Check the indent level
+ $lines->[0] =~ /^(\s*)/;
+ if ( length($1) < $indent->[-1] ) {
+ return 1;
+ } elsif ( length($1) > $indent->[-1] ) {
+ croak("Module::Build::YAML found bad indenting in line '$lines->[0]'");
+ }
+
+ if ( $lines->[0] =~ /^(\s*\-\s+)[^\'\"]\S*\s*:(?:\s+|$)/ ) {
+ # Inline nested hash
+ my $indent2 = length("$1");
+ $lines->[0] =~ s/-/ /;
+ push @$array, { };
+ $self->_read_hash( $array->[-1], [ @$indent, $indent2 ], $lines );
+
+ } elsif ( $lines->[0] =~ /^\s*\-(\s*)(.+?)\s*\z/ ) {
+ # Array entry with a value
+ shift @$lines;
+ push @$array, $self->_read_scalar( "$2", [ @$indent, undef ], $lines );
+
+ } elsif ( $lines->[0] =~ /^\s*\-\s*\z/ ) {
+ shift @$lines;
+ unless ( @$lines ) {
+ push @$array, undef;
+ return 1;
+ }
+ if ( $lines->[0] =~ /^(\s*)\-/ ) {
+ my $indent2 = length("$1");
+ if ( $indent->[-1] == $indent2 ) {
+ # Null array entry
+ push @$array, undef;
+ } else {
+ # Naked indenter
+ push @$array, [ ];
+ $self->_read_array( $array->[-1], [ @$indent, $indent2 ], $lines );
+ }
+
+ } elsif ( $lines->[0] =~ /^(\s*)\S/ ) {
+ push @$array, { };
+ $self->_read_hash( $array->[-1], [ @$indent, length("$1") ], $lines );
+
+ } else {
+ croak("Module::Build::YAML failed to classify line '$lines->[0]'");
+ }
+
+ } elsif ( defined $indent->[-2] and $indent->[-1] == $indent->[-2] ) {
+ # This is probably a structure like the following...
+ # ---
+ # foo:
+ # - list
+ # bar: value
+ #
+ # ... so lets return and let the hash parser handle it
+ return 1;
+
+ } else {
+ croak("Module::Build::YAML failed to classify line '$lines->[0]'");
+ }
+ }
+
+ return 1;
+}
+
+# Parse an array
+sub _read_hash {
+ my ($self, $hash, $indent, $lines) = @_;
+
+ while ( @$lines ) {
+ # Check for a new document
+ if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) {
+ while ( @$lines and $lines->[0] !~ /^---/ ) {
+ shift @$lines;
+ }
+ return 1;
+ }
+
+ # Check the indent level
+ $lines->[0] =~ /^(\s*)/;
+ if ( length($1) < $indent->[-1] ) {
+ return 1;
+ } elsif ( length($1) > $indent->[-1] ) {
+ croak("Module::Build::YAML found bad indenting in line '$lines->[0]'");
+ }
+
+ # Get the key
+ unless ( $lines->[0] =~ s/^\s*([^\'\" ][^\n]*?)\s*:(\s+|$)// ) {
+ if ( $lines->[0] =~ /^\s*[?\'\"]/ ) {
+ croak("Module::Build::YAML does not support a feature in line '$lines->[0]'");
+ }
+ croak("Module::Build::YAML failed to classify line '$lines->[0]'");
+ }
+ my $key = $1;
+
+ # Do we have a value?
+ if ( length $lines->[0] ) {
+ # Yes
+ $hash->{$key} = $self->_read_scalar( shift(@$lines), [ @$indent, undef ], $lines );
+ } else {
+ # An indent
+ shift @$lines;
+ unless ( @$lines ) {
+ $hash->{$key} = undef;
+ return 1;
+ }
+ if ( $lines->[0] =~ /^(\s*)-/ ) {
+ $hash->{$key} = [];
+ $self->_read_array( $hash->{$key}, [ @$indent, length($1) ], $lines );
+ } elsif ( $lines->[0] =~ /^(\s*)./ ) {
+ my $indent2 = length("$1");
+ if ( $indent->[-1] >= $indent2 ) {
+ # Null hash entry
+ $hash->{$key} = undef;
+ } else {
+ $hash->{$key} = {};
+ $self->_read_hash( $hash->{$key}, [ @$indent, length($1) ], $lines );
+ }
+ }
+ }
+ }
+
+ return 1;
+}
+
+# Save an object to a file
+sub write {
+ my $self = shift;
+ my $file = shift or return $self->_error('No file name provided');
+
+ # Write it to the file
+ open( CFG, '>' . $file ) or return $self->_error(
+ "Failed to open file '$file' for writing: $!"
+ );
+ print CFG $self->write_string;
+ close CFG;
+
+ return 1;
+}
+
+# Save an object to a string
+sub write_string {
+ my $self = shift;
+ return '' unless @$self;
+
+ # Iterate over the documents
+ my $indent = 0;
+ my @lines = ();
+ foreach my $cursor ( @$self ) {
+ push @lines, '---';
+
+ # An empty document
+ if ( ! defined $cursor ) {
+ # Do nothing
+
+ # A scalar document
+ } elsif ( ! ref $cursor ) {
+ $lines[-1] .= ' ' . $self->_write_scalar( $cursor, $indent );
+
+ # A list at the root
+ } elsif ( ref $cursor eq 'ARRAY' ) {
+ unless ( @$cursor ) {
+ $lines[-1] .= ' []';
+ next;
+ }
+ push @lines, $self->_write_array( $cursor, $indent, {} );
+
+ # A hash at the root
+ } elsif ( ref $cursor eq 'HASH' ) {
+ unless ( %$cursor ) {
+ $lines[-1] .= ' {}';
+ next;
+ }
+ push @lines, $self->_write_hash( $cursor, $indent, {} );
+
+ } else {
+ croak("Cannot serialize " . ref($cursor));
+ }
+ }
+
+ join '', map { "$_\n" } @lines;
+}
+
+sub _write_scalar {
+ my $string = $_[1];
+ return '~' unless defined $string;
+ return "''" unless length $string;
+ if ( $string =~ /[\x00-\x08\x0b-\x0d\x0e-\x1f\"\'\n]/ ) {
+ $string =~ s/\\/\\\\/g;
+ $string =~ s/"/\\"/g;
+ $string =~ s/\n/\\n/g;
+ $string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g;
+ return qq|"$string"|;
+ }
+ if ( $string =~ /(?:^\W|\s)/ or $QUOTE{$string} ) {
+ return "'$string'";
+ }
+ return $string;
+}
+
+sub _write_array {
+ my ($self, $array, $indent, $seen) = @_;
+ if ( $seen->{refaddr($array)}++ ) {
+ die "Module::Build::YAML does not support circular references";
+ }
+ my @lines = ();
+ foreach my $el ( @$array ) {
+ my $line = (' ' x $indent) . '-';
+ my $type = ref $el;
+ if ( ! $type ) {
+ $line .= ' ' . $self->_write_scalar( $el, $indent + 1 );
+ push @lines, $line;
+
+ } elsif ( $type eq 'ARRAY' ) {
+ if ( @$el ) {
+ push @lines, $line;
+ push @lines, $self->_write_array( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' []';
+ push @lines, $line;
+ }
+
+ } elsif ( $type eq 'HASH' ) {
+ if ( keys %$el ) {
+ push @lines, $line;
+ push @lines, $self->_write_hash( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' {}';
+ push @lines, $line;
+ }
+
+ } else {
+ die "Module::Build::YAML does not support $type references";
+ }
+ }
+
+ @lines;
+}
+
+sub _write_hash {
+ my ($self, $hash, $indent, $seen) = @_;
+ if ( $seen->{refaddr($hash)}++ ) {
+ die "Module::Build::YAML does not support circular references";
+ }
+ my @lines = ();
+ foreach my $name ( sort keys %$hash ) {
+ my $el = $hash->{$name};
+ my $line = (' ' x $indent) . "$name:";
+ my $type = ref $el;
+ if ( ! $type ) {
+ $line .= ' ' . $self->_write_scalar( $el, $indent + 1 );
+ push @lines, $line;
+
+ } elsif ( $type eq 'ARRAY' ) {
+ if ( @$el ) {
+ push @lines, $line;
+ push @lines, $self->_write_array( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' []';
+ push @lines, $line;
+ }
+
+ } elsif ( $type eq 'HASH' ) {
+ if ( keys %$el ) {
+ push @lines, $line;
+ push @lines, $self->_write_hash( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' {}';
+ push @lines, $line;
+ }
+
+ } else {
+ die "Module::Build::YAML does not support $type references";
+ }
+ }
+
+ @lines;
+}
+
+# Set error
+sub _error {
+ $Module::Build::YAML::errstr = $_[1];
+ undef;
+}
+
+# Retrieve error
+sub errstr {
+ $Module::Build::YAML::errstr;
+}
+
+#####################################################################
+# YAML Compatibility
+
+sub Dump {
+ Module::Build::YAML->new(@_)->write_string;
+}
+
+sub Load {
+ my $self = Module::Build::YAML->read_string(@_);
+ unless ( $self ) {
+ croak("Failed to load YAML document from string");
+ }
+ if ( wantarray ) {
+ return @$self;
+ } else {
+ # To match YAML.pm, return the last document
+ return $self->[-1];
+ }
+}
+
+BEGIN {
+ *freeze = *Dump;
+ *thaw = *Load;
+}
+
+sub DumpFile {
+ my $file = shift;
+ Module::Build::YAML->new(@_)->write($file);
+}
+
+sub LoadFile {
+ my $self = Module::Build::YAML->read($_[0]);
+ unless ( $self ) {
+ croak("Failed to load YAML document from '" . ($_[0] || '') . "'");
+ }
+ if ( wantarray ) {
+ return @$self;
+ } else {
+ # Return only the last document to match YAML.pm,
+ return $self->[-1];
+ }
+}
+
+#####################################################################
+# Use Scalar::Util if possible, otherwise emulate it
+
+BEGIN {
+ eval {
+ require Scalar::Util;
+ };
+ if ( $@ ) {
+ # Failed to load Scalar::Util
+ eval <<'END_PERL';
+sub refaddr {
+ my $pkg = ref($_[0]) or return undef;
+ if (!!UNIVERSAL::can($_[0], 'can')) {
+ bless $_[0], 'Scalar::Util::Fake';
+ } else {
+ $pkg = undef;
+ }
+ "$_[0]" =~ /0x(\w+)/;
+ my $i = do { local $^W; hex $1 };
+ bless $_[0], $pkg if defined $pkg;
+ $i;
+}
+END_PERL
+ } else {
+ Scalar::Util->import('refaddr');
+ }
+}
+
+1;
+
+__END__
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/CoreList.pm b/Master/tlpkg/tlperl.straw/lib/Module/CoreList.pm
new file mode 100755
index 00000000000..1865a954108
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/CoreList.pm
@@ -0,0 +1,13799 @@
+package Module::CoreList;
+use strict;
+use vars qw/$VERSION %released %version %families %upstream
+ %bug_tracker %deprecated/;
+$VERSION = '2.25';
+
+=head1 NAME
+
+Module::CoreList - what modules shipped with versions of perl
+
+=head1 SYNOPSIS
+
+ use Module::CoreList;
+
+ print $Module::CoreList::version{5.00503}{CPAN}; # prints 1.48
+
+ print Module::CoreList->first_release('File::Spec'); # prints 5.00405
+ print Module::CoreList->first_release_by_date('File::Spec'); # prints 5.005
+ print Module::CoreList->first_release('File::Spec', 0.82); # prints 5.006001
+
+ print join ', ', Module::CoreList->find_modules(qr/Data/);
+ # prints 'Data::Dumper'
+ print join ', ', Module::CoreList->find_modules(qr/test::h.*::.*s/i, 5.008008);
+ # prints 'Test::Harness::Assert, Test::Harness::Straps'
+
+ print join ", ", @{ $Module::CoreList::families{5.005} };
+ # prints "5.005, 5.00503, 5.00504"
+
+=head1 DESCRIPTION
+
+Module::CoreList contains the hash of hashes
+%Module::CoreList::version, that is keyed on perl version as indicated
+in $]. The second level hash is module => version pairs.
+
+Note, it is possible for the version of a module to be unspecified,
+whereby the value is undef, so use C<exists $version{$foo}{$bar}> if
+that's what you're testing for.
+
+It also contains %Module::CoreList::released hash, which has ISO
+formatted versions of the release dates, as gleaned from L<perlhist>.
+
+New, in 1.96 is also the %Module::CoreList::families hash, which
+clusters known perl releases by their major versions.
+
+Starting with 2.10, the special module name C<Unicode> refers to the version of
+the Unicode Character Database bundled with Perl.
+
+Since 2.11, Module::CoreList::first_release() returns the first release
+in the order of perl version numbers. If you want to get the earliest
+perl release instead, use Module::CoreList::first_release_by_date().
+
+New in 2.22, Module::CoreList::is_deprecated(MODULE,PERL_VERSION) returns true
+if MODULE is marked as deprecated in PERL_VERSION. If PERL_VERSION is
+omitted, it defaults to the current version of Perl.
+
+=head1 CAVEATS
+
+Module::CoreList currently covers the 5.000, 5.001, 5.002, 5.003_07, 5.004,
+5.004_05, 5.005, 5.005_03, 5.005_04, 5.6.0, 5.6.1, 5.6.2, 5.7.3, 5.8.0, 5.8.1,
+5.8.2, 5.8.3, 5.8.4, 5.8.5, 5.8.6, 5.8.7, 5.8.8, 5.8.9, 5.9.0, 5.9.1, 5.9.2, 5.9.3,
+5.9.4, 5.9.5, 5.10.0, 5.10.1, 5.11.0, 5.11.1, 5.11.2, 5.11.3 and 5.11.4 releases of perl.
+
+=head1 HISTORY
+
+Moved to Changes file.
+
+=head1 AUTHOR
+
+Richard Clamp E<lt>richardc@unixbeard.netE<gt>
+
+Currently maintained by the perl 5 porters E<lt>perl5-porters@perl.orgE<gt>.
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002-2009 Richard Clamp. All Rights Reserved.
+
+This module is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<corelist>, L<Module::Info>, L<perl>
+
+=cut
+
+my $dumpinc = 0;
+sub import {
+ my $self = shift;
+ my $what = shift || '';
+ if ($what eq 'dumpinc') {
+ $dumpinc = 1;
+ }
+}
+
+END {
+ print "---INC---\n", join "\n" => keys %INC
+ if $dumpinc;
+}
+
+
+sub first_release_raw {
+ my ($discard, $module, $version) = @_;
+
+ my @perls = $version
+ ? grep { exists $version{$_}{ $module } &&
+ $version{$_}{ $module } ge $version } keys %version
+ : grep { exists $version{$_}{ $module } } keys %version;
+
+ return @perls;
+}
+
+sub first_release_by_date {
+ my @perls = &first_release_raw;
+ return unless @perls;
+ return (sort { $released{$a} cmp $released{$b} } @perls)[0];
+}
+
+sub first_release {
+ my @perls = &first_release_raw;
+ return unless @perls;
+ return (sort { $a cmp $b } @perls)[0];
+}
+
+sub find_modules {
+ my $discard = shift;
+ my $regex = shift;
+ my @perls = @_;
+ @perls = keys %version unless @perls;
+
+ my %mods;
+ foreach (@perls) {
+ while (my ($k, $v) = each %{$version{$_}}) {
+ $mods{$k}++ if $k =~ $regex;
+ }
+ }
+ return sort keys %mods
+}
+
+sub find_version {
+ my ($class, $v) = @_;
+ return $version{$v} if defined $version{$v};
+ return undef;
+}
+
+sub is_deprecated {
+ my ($module, $perl_version) = @_;
+ $perl_version ||= $];
+ return unless $module && exists $deprecated{$perl_version}{$module};
+ return $deprecated{$perl_version}{$module};
+}
+
+# When things escaped.
+# NB. If you put version numbers with trailing zeroes here, you
+# should also add an alias for the numerical ($]) version; see
+# just before the __END__ of this module.
+%released = (
+ 5.000 => '1994-10-17',
+ 5.001 => '1995-03-14',
+ 5.002 => '1996-02-29',
+ 5.00307 => '1996-10-10',
+ 5.004 => '1997-05-15',
+ 5.005 => '1998-07-22',
+ 5.00503 => '1999-03-28',
+ 5.00405 => '1999-04-29',
+ 5.006 => '2000-03-22',
+ 5.006001 => '2001-04-08',
+ 5.007003 => '2002-03-05',
+ 5.008 => '2002-07-19',
+ 5.008001 => '2003-09-25',
+ 5.009 => '2003-10-27',
+ 5.008002 => '2003-11-05',
+ 5.006002 => '2003-11-15',
+ 5.008003 => '2004-01-14',
+ 5.00504 => '2004-02-23',
+ 5.009001 => '2004-03-16',
+ 5.008004 => '2004-04-21',
+ 5.008005 => '2004-07-19',
+ 5.008006 => '2004-11-27',
+ 5.009002 => '2005-04-01',
+ 5.008007 => '2005-05-30',
+ 5.009003 => '2006-01-28',
+ 5.008008 => '2006-01-31',
+ 5.009004 => '2006-08-15',
+ 5.009005 => '2007-07-07',
+ 5.010000 => '2007-12-18',
+ 5.008009 => '2008-12-14',
+ 5.010001 => '2009-08-22',
+ 5.011000 => '2009-10-02',
+ 5.011001 => '2009-10-20',
+ 5.011002 => '2009-11-20',
+ 5.011003 => '2009-12-20',
+ 5.011004 => '2010-01-20',
+ );
+
+for my $version ( sort { $a <=> $b } keys %released ) {
+ my $family = int ($version * 1000) / 1000;
+ push @{ $families{ $family }} , $version;
+}
+
+
+%version = (
+ 5.000 => {
+ 'AnyDBM_File' => undef, # lib/AnyDBM_File.pm
+ 'AutoLoader' => undef, # lib/AutoLoader.pm
+ 'AutoSplit' => undef, # lib/AutoSplit.pm
+ 'Benchmark' => undef, # lib/Benchmark.pm
+ 'Carp' => undef, # lib/Carp.pm
+ 'Cwd' => undef, # lib/Cwd.pm
+ 'DB_File' => undef, # ext/DB_File/DB_File.pm
+ 'DynaLoader' => undef, # ext/DynaLoader/DynaLoader.pm
+ 'English' => undef, # lib/English.pm
+ 'Env' => undef, # lib/Env.pm
+ 'Exporter' => undef, # lib/Exporter.pm
+ 'ExtUtils::MakeMaker' => undef, # lib/ExtUtils/MakeMaker.pm
+ 'Fcntl' => undef, # ext/Fcntl/Fcntl.pm
+ 'File::Basename' => undef, # lib/File/Basename.pm
+ 'File::CheckTree' => undef, # lib/File/CheckTree.pm
+ 'File::Find' => undef, # lib/File/Find.pm
+ 'FileHandle' => undef, # lib/FileHandle.pm
+ 'GDBM_File' => undef, # ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => undef, # lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, # lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, # lib/I18N/Collate.pm
+ 'IPC::Open2' => undef, # lib/IPC/Open2.pm
+ 'IPC::Open3' => undef, # lib/IPC/Open3.pm
+ 'Math::BigFloat' => undef, # lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, # lib/Math/BigInt.pm
+ 'Math::Complex' => undef, # lib/Math/Complex.pm
+ 'NDBM_File' => undef, # ext/NDBM_File/NDBM_File.pm
+ 'Net::Ping' => undef, # lib/Net/Ping.pm
+ 'ODBM_File' => undef, # ext/ODBM_File/ODBM_File.pm
+ 'POSIX' => undef, # ext/POSIX/POSIX.pm
+ 'SDBM_File' => undef, # ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => undef, # lib/Search/Dict.pm
+ 'Shell' => undef, # lib/Shell.pm
+ 'Socket' => undef, # ext/Socket/Socket.pm
+ 'Sys::Hostname' => undef, # lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, # lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, # lib/Term/Cap.pm
+ 'Term::Complete' => undef, # lib/Term/Complete.pm
+ 'Test::Harness' => undef, # lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, # lib/Text/Abbrev.pm
+ 'Text::ParseWords' => undef, # lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, # lib/Text/Soundex.pm
+ 'Text::Tabs' => undef, # lib/Text/Tabs.pm
+ 'TieHash' => undef, # lib/TieHash.pm
+ 'Time::Local' => undef, # lib/Time/Local.pm
+ 'integer' => undef, # lib/integer.pm
+ 'less' => undef, # lib/less.pm
+ 'sigtrap' => undef, # lib/sigtrap.pm
+ 'strict' => undef, # lib/strict.pm
+ 'subs' => undef, # lib/subs.pm
+ },
+
+ 5.001 => {
+ 'AnyDBM_File' => undef, # lib/AnyDBM_File.pm
+ 'AutoLoader' => undef, # lib/AutoLoader.pm
+ 'AutoSplit' => undef, # lib/AutoSplit.pm
+ 'Benchmark' => undef, # lib/Benchmark.pm
+ 'Carp' => undef, # lib/Carp.pm
+ 'Cwd' => undef, # lib/Cwd.pm
+ 'DB_File' => undef, # ext/DB_File/DB_File.pm
+ 'DynaLoader' => undef, # ext/DynaLoader/DynaLoader.pm
+ 'English' => undef, # lib/English.pm
+ 'Env' => undef, # lib/Env.pm
+ 'Exporter' => undef, # lib/Exporter.pm
+ 'ExtUtils::Liblist' => undef, # lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => undef, # lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => undef, # lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => undef, # lib/ExtUtils/Mkbootstrap.pm
+ 'Fcntl' => undef, # ext/Fcntl/Fcntl.pm
+ 'File::Basename' => undef, # lib/File/Basename.pm
+ 'File::CheckTree' => undef, # lib/File/CheckTree.pm
+ 'File::Find' => undef, # lib/File/Find.pm
+ 'File::Path' => undef, # lib/File/Path.pm
+ 'FileHandle' => undef, # lib/FileHandle.pm
+ 'GDBM_File' => undef, # ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => undef, # lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, # lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, # lib/I18N/Collate.pm
+ 'IPC::Open2' => undef, # lib/IPC/Open2.pm
+ 'IPC::Open3' => undef, # lib/IPC/Open3.pm
+ 'Math::BigFloat' => undef, # lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, # lib/Math/BigInt.pm
+ 'Math::Complex' => undef, # lib/Math/Complex.pm
+ 'NDBM_File' => undef, # ext/NDBM_File/NDBM_File.pm
+ 'Net::Ping' => undef, # lib/Net/Ping.pm
+ 'ODBM_File' => undef, # ext/ODBM_File/ODBM_File.pm
+ 'POSIX' => undef, # ext/POSIX/POSIX.pm
+ 'SDBM_File' => undef, # ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => undef, # lib/Search/Dict.pm
+ 'Shell' => undef, # lib/Shell.pm
+ 'Socket' => undef, # ext/Socket/Socket.pm
+ 'SubstrHash' => undef, # lib/SubstrHash.pm
+ 'Sys::Hostname' => undef, # lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, # lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, # lib/Term/Cap.pm
+ 'Term::Complete' => undef, # lib/Term/Complete.pm
+ 'Test::Harness' => undef, # lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, # lib/Text/Abbrev.pm
+ 'Text::ParseWords' => undef, # lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, # lib/Text/Soundex.pm
+ 'Text::Tabs' => undef, # lib/Text/Tabs.pm
+ 'TieHash' => undef, # lib/TieHash.pm
+ 'Time::Local' => undef, # lib/Time/Local.pm
+ 'integer' => undef, # lib/integer.pm
+ 'less' => undef, # lib/less.pm
+ 'lib' => undef, # lib/lib.pm
+ 'sigtrap' => undef, # lib/sigtrap.pm
+ 'strict' => undef, # lib/strict.pm
+ 'subs' => undef, # lib/subs.pm
+ },
+
+ 5.002 => {
+ 'AnyDBM_File' => undef, # lib/AnyDBM_File.pm
+ 'AutoLoader' => undef, # lib/AutoLoader.pm
+ 'AutoSplit' => undef, # lib/AutoSplit.pm
+ 'Benchmark' => undef, # lib/Benchmark.pm
+ 'Carp' => undef, # lib/Carp.pm
+ 'Cwd' => undef, # lib/Cwd.pm
+ 'DB_File' => '1.01', # ext/DB_File/DB_File.pm
+ 'Devel::SelfStubber' => '1.01', # lib/Devel/SelfStubber.pm
+ 'DirHandle' => undef, # lib/DirHandle.pm
+ 'DynaLoader' => '1.00', # ext/DynaLoader/DynaLoader.pm
+ 'English' => undef, # lib/English.pm
+ 'Env' => undef, # lib/Env.pm
+ 'Exporter' => undef, # lib/Exporter.pm
+ 'ExtUtils::Install' => undef, # lib/ExtUtils/Install.pm
+ 'ExtUtils::Liblist' => undef, # lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MM_OS2' => undef, # lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => undef, # lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, # lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MakeMaker' => '5.21', # lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.22', # lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => undef, # lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.00', # lib/ExtUtils/Mksymlists.pm
+ 'Fcntl' => '1.00', # ext/Fcntl/Fcntl.pm
+ 'File::Basename' => undef, # lib/File/Basename.pm
+ 'File::CheckTree' => undef, # lib/File/CheckTree.pm
+ 'File::Copy' => '1.5', # lib/File/Copy.pm
+ 'File::Find' => undef, # lib/File/Find.pm
+ 'File::Path' => '1.01', # lib/File/Path.pm
+ 'FileCache' => undef, # lib/FileCache.pm
+ 'FileHandle' => '1.00', # ext/FileHandle/FileHandle.pm
+ 'GDBM_File' => '1.00', # ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.01', # lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, # lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, # lib/I18N/Collate.pm
+ 'IPC::Open2' => undef, # lib/IPC/Open2.pm
+ 'IPC::Open3' => undef, # lib/IPC/Open3.pm
+ 'Math::BigFloat' => undef, # lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, # lib/Math/BigInt.pm
+ 'Math::Complex' => undef, # lib/Math/Complex.pm
+ 'NDBM_File' => '1.00', # ext/NDBM_File/NDBM_File.pm
+ 'Net::Ping' => '1', # lib/Net/Ping.pm
+ 'ODBM_File' => '1.00', # ext/ODBM_File/ODBM_File.pm
+ 'POSIX' => '1.00', # ext/POSIX/POSIX.pm
+ 'Pod::Functions' => undef, # lib/Pod/Functions.pm
+ 'Pod::Text' => undef, # lib/Pod/Text.pm
+ 'SDBM_File' => '1.00', # ext/SDBM_File/SDBM_File.pm
+ 'Safe' => '1.00', # ext/Safe/Safe.pm
+ 'Search::Dict' => undef, # lib/Search/Dict.pm
+ 'SelectSaver' => undef, # lib/SelectSaver.pm
+ 'SelfLoader' => '1.06', # lib/SelfLoader.pm
+ 'Shell' => undef, # lib/Shell.pm
+ 'Socket' => '1.5', # ext/Socket/Socket.pm
+ 'Symbol' => undef, # lib/Symbol.pm
+ 'Sys::Hostname' => undef, # lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, # lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, # lib/Term/Cap.pm
+ 'Term::Complete' => undef, # lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, # lib/Term/ReadLine.pm
+ 'Test::Harness' => '1.07', # lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, # lib/Text/Abbrev.pm
+ 'Text::ParseWords' => undef, # lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, # lib/Text/Soundex.pm
+ 'Text::Tabs' => undef, # lib/Text/Tabs.pm
+ 'Text::Wrap' => undef, # lib/Text/Wrap.pm
+ 'Tie::Hash' => undef, # lib/Tie/Hash.pm
+ 'Tie::Scalar' => undef, # lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, # lib/Tie/SubstrHash.pm
+ 'Time::Local' => undef, # lib/Time/Local.pm
+ 'diagnostics' => undef, # lib/diagnostics.pm
+ 'integer' => undef, # lib/integer.pm
+ 'less' => undef, # lib/less.pm
+ 'lib' => undef, # lib/lib.pm
+ 'overload' => undef, # lib/overload.pm
+ 'sigtrap' => undef, # lib/sigtrap.pm
+ 'strict' => undef, # lib/strict.pm
+ 'subs' => undef, # lib/subs.pm
+ 'vars' => undef, # lib/vars.pm
+ },
+
+ 5.00307 => {
+ 'AnyDBM_File' => undef, #./lib/AnyDBM_File.pm
+ 'AutoLoader' => undef, #./lib/AutoLoader.pm
+ 'AutoSplit' => undef, #./lib/AutoSplit.pm
+ 'Benchmark' => undef, #./lib/Benchmark.pm
+ 'Carp' => undef, #./lib/Carp.pm
+ 'Config' => undef,
+ 'Cwd' => undef, #./lib/Cwd.pm
+ 'DB_File' => '1.03', #./lib/DB_File.pm
+ 'Devel::SelfStubber' => '1.01', #./lib/Devel/SelfStubber.pm
+ 'diagnostics' => undef, #./lib/diagnostics.pm
+ 'DirHandle' => undef, #./lib/DirHandle.pm
+ 'DynaLoader' => '1.00', #./ext/DynaLoader/DynaLoader.pm
+ 'English' => undef, #./lib/English.pm
+ 'Env' => undef, #./lib/Env.pm
+ 'Exporter' => undef, #./lib/Exporter.pm
+ 'ExtUtils::Embed' => '1.18', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.15 ', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Liblist' => '1.20 ', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '5.38', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.27', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => '1.13 ', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.12 ', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_OS2' => undef, #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.107 ', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::testlib' => '1.11 ', #./lib/ExtUtils/testlib.pm
+ 'Fatal' => undef, #./lib/Fatal.pm
+ 'Fcntl' => '1.00', #./ext/Fcntl/Fcntl.pm
+ 'File::Basename' => '2.4', #./lib/File/Basename.pm
+ 'File::CheckTree' => undef, #./lib/File/CheckTree.pm
+ 'File::Copy' => '1.5', #./lib/File/Copy.pm
+ 'File::Find' => undef, #./lib/File/Find.pm
+ 'File::Path' => '1.01', #./lib/File/Path.pm
+ 'FileCache' => undef, #./lib/FileCache.pm
+ 'FileHandle' => '1.00', #./ext/FileHandle/FileHandle.pm
+ 'FindBin' => '1.04', #./lib/FindBin.pm
+ 'GDBM_File' => '1.00', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.04', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, #./lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #./lib/I18N/Collate.pm
+ 'integer' => undef, #./lib/integer.pm
+ 'IO' => undef, #./ext/IO/IO.pm
+ 'IO::File' => '1.05', #./ext/IO/lib/IO/File.pm
+ 'IO::Handle' => '1.12', #./ext/IO/lib/IO/Handle.pm
+ 'IO::Pipe' => '1.07', #./ext/IO/lib/IO/Pipe.pm
+ 'IO::Seekable' => '1.05', #./ext/IO/lib/IO/Seekable.pm
+ 'IO::Select' => '1.09', #./ext/IO/lib/IO/Select.pm
+ 'IO::Socket' => '1.13', #./ext/IO/lib/IO/Socket.pm
+ 'IPC::Open2' => undef, #./lib/IPC/Open2.pm
+ 'IPC::Open3' => undef, #./lib/IPC/Open3.pm
+ 'less' => undef, #./lib/less.pm
+ 'lib' => undef, #./lib/lib.pm
+ 'Math::BigFloat' => undef, #./lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, #./lib/Math/BigInt.pm
+ 'Math::Complex' => undef, #./lib/Math/Complex.pm
+ 'NDBM_File' => '1.00', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::Ping' => '1.01', #./lib/Net/Ping.pm
+ 'ODBM_File' => '1.00', #./ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.01', #./ext/Opcode/Opcode.pm
+ 'ops' => undef, #./ext/Opcode/ops.pm
+ 'OS2::ExtAttr' => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => undef, #./os2/OS2/Process/Process.pm
+ 'OS2::REXX' => undef, #./os2/OS2/REXX/REXX.pm
+ 'overload' => undef, #./lib/overload.pm
+ 'Pod::Functions' => undef, #./lib/Pod/Functions.pm
+ 'Pod::Text' => undef, #./lib/Pod/Text.pm
+ 'POSIX' => '1.00', #./ext/POSIX/POSIX.pm
+ 'Safe' => '2.06', #./ext/Opcode/Safe.pm
+ 'SDBM_File' => '1.00', #./ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => undef, #./lib/Search/Dict.pm
+ 'SelectSaver' => undef, #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.06', #./lib/SelfLoader.pm
+ 'Shell' => undef, #./lib/Shell.pm
+ 'sigtrap' => '1.01', #./lib/sigtrap.pm
+ 'Socket' => '1.5', #./ext/Socket/Socket.pm
+ 'strict' => undef, #./lib/strict.pm
+ 'subs' => undef, #./lib/subs.pm
+ 'Symbol' => undef, #./lib/Symbol.pm
+ 'Sys::Hostname' => undef, #./lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, #./lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, #./lib/Term/Cap.pm
+ 'Term::Complete' => undef, #./lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #./lib/Term/ReadLine.pm
+ 'Test::Harness' => '1.13', #./lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, #./lib/Text/Abbrev.pm
+ 'Text::ParseWords' => undef, #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '96.051501', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '96.041801', #./lib/Text/Wrap.pm
+ 'Tie::Hash' => undef, #./lib/Tie/Hash.pm
+ 'Tie::Scalar' => undef, #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #./lib/Tie/SubstrHash.pm
+ 'Time::Local' => undef, #./lib/Time/Local.pm
+ 'UNIVERSAL' => undef, #./lib/UNIVERSAL.pm
+ 'vars' => undef, #./lib/vars.pm
+ 'VMS::Filespec' => undef, #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.0', #./vms/ext/Stdio/Stdio.pm
+ },
+
+ 5.004 => {
+ 'AnyDBM_File' => undef, #./lib/AnyDBM_File.pm
+ 'AutoLoader' => undef, #./lib/AutoLoader.pm
+ 'AutoSplit' => undef, #./lib/AutoSplit.pm
+ 'autouse' => '1.01', #./lib/autouse.pm
+ 'Benchmark' => undef, #./lib/Benchmark.pm
+ 'blib' => undef, #./lib/blib.pm
+ 'Bundle::CPAN' => '0.02', #./lib/Bundle/CPAN.pm
+ 'Carp' => undef, #./lib/Carp.pm
+ 'CGI' => '2.36', #./lib/CGI.pm
+ 'CGI::Apache' => '1.01', #./lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.06', #./lib/CGI/Carp.pm
+ 'CGI::Fast' => '1.00a', #./lib/CGI/Fast.pm
+ 'CGI::Push' => '1.00', #./lib/CGI/Push.pm
+ 'CGI::Switch' => '0.05', #./lib/CGI/Switch.pm
+ 'Class::Struct' => undef, #./lib/Class/Struct.pm
+ 'Config' => undef,
+ 'constant' => '1.00', #./lib/constant.pm
+ 'CPAN' => '1.2401', #./lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.18 ', #./lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => undef, #./lib/CPAN/Nox.pm
+ 'Cwd' => '2.00', #./lib/Cwd.pm
+ 'DB_File' => '1.14', #./ext/DB_File/DB_File.pm
+ 'Devel::SelfStubber' => '1.01', #./lib/Devel/SelfStubber.pm
+ 'diagnostics' => undef, #./lib/diagnostics.pm
+ 'DirHandle' => undef, #./lib/DirHandle.pm
+ 'DynaLoader' => '1.02', #./ext/DynaLoader/DynaLoader.pm
+ 'English' => undef, #./lib/English.pm
+ 'Env' => undef, #./lib/Env.pm
+ 'Exporter' => undef, #./lib/Exporter.pm
+ 'ExtUtils::Command' => '1.00', #./lib/ExtUtils/Command.pm
+ 'ExtUtils::Embed' => '1.2501', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.16 ', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Liblist' => '1.2201 ', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '5.4002', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.33 ', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => '1.13 ', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.13 ', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_OS2' => undef, #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.114 ', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => undef, #./lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::testlib' => '1.11 ', #./lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #./vms/ext/XSSymSet.pm
+ 'Fcntl' => '1.03', #./ext/Fcntl/Fcntl.pm
+ 'File::Basename' => '2.5', #./lib/File/Basename.pm
+ 'File::CheckTree' => undef, #./lib/File/CheckTree.pm
+ 'File::Compare' => '1.1001', #./lib/File/Compare.pm
+ 'File::Copy' => '2.02', #./lib/File/Copy.pm
+ 'File::Find' => undef, #./lib/File/Find.pm
+ 'File::Path' => '1.04', #./lib/File/Path.pm
+ 'File::stat' => undef, #./lib/File/stat.pm
+ 'FileCache' => undef, #./lib/FileCache.pm
+ 'FileHandle' => '2.00', #./lib/FileHandle.pm
+ 'FindBin' => '1.04', #./lib/FindBin.pm
+ 'GDBM_File' => '1.00', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.10', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, #./lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #./lib/I18N/Collate.pm
+ 'integer' => undef, #./lib/integer.pm
+ 'IO' => undef, #./ext/IO/IO.pm
+ 'IO::File' => '1.0602', #./ext/IO/lib/IO/File.pm
+ 'IO::Handle' => '1.1504', #./ext/IO/lib/IO/Handle.pm
+ 'IO::Pipe' => '1.0901', #./ext/IO/lib/IO/Pipe.pm
+ 'IO::Seekable' => '1.06', #./ext/IO/lib/IO/Seekable.pm
+ 'IO::Select' => '1.10', #./ext/IO/lib/IO/Select.pm
+ 'IO::Socket' => '1.1602', #./ext/IO/lib/IO/Socket.pm
+ 'IPC::Open2' => '1.01', #./lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0101', #./lib/IPC/Open3.pm
+ 'less' => undef, #./lib/less.pm
+ 'lib' => undef, #./lib/lib.pm
+ 'locale' => undef, #./lib/locale.pm
+ 'Math::BigFloat' => undef, #./lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, #./lib/Math/BigInt.pm
+ 'Math::Complex' => '1.01', #./lib/Math/Complex.pm
+ 'Math::Trig' => '1', #./lib/Math/Trig.pm
+ 'NDBM_File' => '1.00', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::hostent' => undef, #./lib/Net/hostent.pm
+ 'Net::netent' => undef, #./lib/Net/netent.pm
+ 'Net::Ping' => '2.02', #./lib/Net/Ping.pm
+ 'Net::protoent' => undef, #./lib/Net/protoent.pm
+ 'Net::servent' => undef, #./lib/Net/servent.pm
+ 'ODBM_File' => '1.00', #./ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.04', #./ext/Opcode/Opcode.pm
+ 'ops' => undef, #./ext/Opcode/ops.pm
+ 'Safe' => '2.06', #./ext/Opcode/Safe.pm
+ 'OS2::ExtAttr' => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => undef, #./os2/OS2/Process/Process.pm
+ 'OS2::REXX' => undef, #./os2/OS2/REXX/REXX.pm
+ 'overload' => undef, #./lib/overload.pm
+ 'Pod::Functions' => undef, #./lib/Pod/Functions.pm
+ 'Pod::Html' => undef, #./lib/Pod/Html.pm
+ 'Pod::Text' => '1.0203', #./lib/Pod/Text.pm
+ 'POSIX' => '1.02', #./ext/POSIX/POSIX.pm
+ 'SDBM_File' => '1.00', #./ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => undef, #./lib/Search/Dict.pm
+ 'SelectSaver' => undef, #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.07', #./lib/SelfLoader.pm
+ 'Shell' => undef, #./lib/Shell.pm
+ 'sigtrap' => '1.02', #./lib/sigtrap.pm
+ 'Socket' => '1.6', #./ext/Socket/Socket.pm
+ 'strict' => undef, #./lib/strict.pm
+ 'subs' => undef, #./lib/subs.pm
+ 'Symbol' => '1.02', #./lib/Symbol.pm
+ 'Sys::Hostname' => undef, #./lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, #./lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, #./lib/Term/Cap.pm
+ 'Term::Complete' => undef, #./lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #./lib/Term/ReadLine.pm
+ 'Test::Harness' => '1.1502', #./lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, #./lib/Text/Abbrev.pm
+ 'Text::ParseWords' => undef, #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '96.121201', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '97.011701', #./lib/Text/Wrap.pm
+ 'Tie::Hash' => undef, #./lib/Tie/Hash.pm
+ 'Tie::RefHash' => undef, #./lib/Tie/RefHash.pm
+ 'Tie::Scalar' => undef, #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #./lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.01', #./lib/Time/gmtime.pm
+ 'Time::Local' => undef, #./lib/Time/Local.pm
+ 'Time::localtime' => '1.01', #./lib/Time/localtime.pm
+ 'Time::tm' => undef, #./lib/Time/tm.pm
+ 'UNIVERSAL' => undef, #./lib/UNIVERSAL.pm
+ 'User::grent' => undef, #./lib/User/grent.pm
+ 'User::pwent' => undef, #./lib/User/pwent.pm
+ 'vars' => undef, #./lib/vars.pm
+ 'VMS::DCLsym' => '1.01', #./vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => undef, #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.02', #./vms/ext/Stdio/Stdio.pm
+ 'vmsish' => undef, #./vms/ext/vmsish.pm
+ },
+
+ 5.005 => {
+ 'AnyDBM_File' => undef, #./lib/AnyDBM_File.pm
+ 'attrs' => '1.0', #./ext/attrs/attrs.pm
+ 'AutoLoader' => undef, #./lib/AutoLoader.pm
+ 'AutoSplit' => '1.0302', #./lib/AutoSplit.pm
+ 'autouse' => '1.01', #./lib/autouse.pm
+ 'B' => undef, #./ext/B/B.pm
+ 'B::Asmdata' => undef, #./ext/B/B/Asmdata.pm
+ 'B::Assembler' => undef, #./ext/B/B/Assembler.pm
+ 'B::Bblock' => undef, #./ext/B/B/Bblock.pm
+ 'B::Bytecode' => undef, #./ext/B/B/Bytecode.pm
+ 'B::C' => undef, #./ext/B/B/C.pm
+ 'B::CC' => undef, #./ext/B/B/CC.pm
+ 'B::Debug' => undef, #./ext/B/B/Debug.pm
+ 'B::Deparse' => '0.56', #./ext/B/B/Deparse.pm
+ 'B::Disassembler' => undef, #./ext/B/B/Disassembler.pm
+ 'B::Lint' => undef, #./ext/B/B/Lint.pm
+ 'B::Showlex' => undef, #./ext/B/B/Showlex.pm
+ 'B::Stackobj' => undef, #./ext/B/B/Stackobj.pm
+ 'B::Terse' => undef, #./ext/B/B/Terse.pm
+ 'B::Xref' => undef, #./ext/B/B/Xref.pm
+ 'base' => undef, #./lib/base.pm
+ 'Benchmark' => undef, #./lib/Benchmark.pm
+ 'blib' => '1.00', #./lib/blib.pm
+ 'Carp' => undef, #./lib/Carp.pm
+ 'CGI' => '2.42', #./lib/CGI.pm
+ 'CGI::Apache' => '1.1', #./lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.101', #./lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.06', #./lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.00a', #./lib/CGI/Fast.pm
+ 'CGI::Push' => '1.01', #./lib/CGI/Push.pm
+ 'CGI::Switch' => '0.06', #./lib/CGI/Switch.pm
+ 'Class::Struct' => undef, #./lib/Class/Struct.pm
+ 'Config' => undef,
+ 'constant' => '1.00', #./lib/constant.pm
+ 'CPAN' => '1.3901', #./lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.29 ', #./lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => undef, #./lib/CPAN/Nox.pm
+ 'Cwd' => '2.01', #./lib/Cwd.pm
+ 'Data::Dumper' => '2.09', #./ext/Data/Dumper/Dumper.pm
+ 'DB_File' => '1.60', #./ext/DB_File/DB_File.pm
+ 'Devel::SelfStubber' => '1.01', #./lib/Devel/SelfStubber.pm
+ 'DynaLoader' => '1.03',
+ 'diagnostics' => undef, #./lib/diagnostics.pm
+ 'DirHandle' => undef, #./lib/DirHandle.pm
+ 'English' => undef, #./lib/English.pm
+ 'Env' => undef, #./lib/Env.pm
+ 'Exporter' => undef, #./lib/Exporter.pm
+ 'ExtUtils::Command' => '1.01', #./lib/ExtUtils/Command.pm
+ 'ExtUtils::Embed' => '1.2505', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.28 ', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.02', #./lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.25 ', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '5.4301', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.33 ', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => '1.13 ', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.17 ', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_OS2' => undef, #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.12601 ', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => undef, #./lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::Packlist' => '0.03', #./lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.11 ', #./lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #./vms/ext/XSSymSet.pm
+ 'Fatal' => '1.02', #./lib/Fatal.pm
+ 'Fcntl' => '1.03', #./ext/Fcntl/Fcntl.pm
+ 'fields' => '0.02', #./lib/fields.pm
+ 'File::Basename' => '2.6', #./lib/File/Basename.pm
+ 'File::CheckTree' => undef, #./lib/File/CheckTree.pm
+ 'File::Compare' => '1.1001', #./lib/File/Compare.pm
+ 'File::Copy' => '2.02', #./lib/File/Copy.pm
+ 'File::DosGlob' => undef, #./lib/File/DosGlob.pm
+ 'File::Find' => undef, #./lib/File/Find.pm
+ 'File::Path' => '1.0401', #./lib/File/Path.pm
+ 'File::Spec' => '0.6', #./lib/File/Spec.pm
+ 'File::Spec::Mac' => '1.0', #./lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => undef, #./lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => undef, #./lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => undef, #./lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => undef, #./lib/File/Spec/Win32.pm
+ 'File::stat' => undef, #./lib/File/stat.pm
+ 'FileCache' => undef, #./lib/FileCache.pm
+ 'FileHandle' => '2.00', #./lib/FileHandle.pm
+ 'FindBin' => '1.41', #./lib/FindBin.pm
+ 'GDBM_File' => '1.00', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.17', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, #./lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #./lib/I18N/Collate.pm
+ 'integer' => undef, #./lib/integer.pm
+ 'IO' => undef, #./ext/IO/IO.pm
+ 'IO::File' => '1.06021', #./ext/IO/lib/IO/File.pm
+ 'IO::Handle' => '1.1505', #./ext/IO/lib/IO/Handle.pm
+ 'IO::Pipe' => '1.0901', #./ext/IO/lib/IO/Pipe.pm
+ 'IO::Seekable' => '1.06', #./ext/IO/lib/IO/Seekable.pm
+ 'IO::Select' => '1.10', #./ext/IO/lib/IO/Select.pm
+ 'IO::Socket' => '1.1603', #./ext/IO/lib/IO/Socket.pm
+ 'IPC::Open2' => '1.01', #./lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0102', #./lib/IPC/Open3.pm
+ 'IPC::Msg' => '1.00', #./ext/IPC/SysV/Msg.pm
+ 'IPC::Semaphore' => '1.00', #./ext/IPC/SysV/Semaphore.pm
+ 'IPC::SysV' => '1.03', #./ext/IPC/SysV/SysV.pm
+ 'less' => undef, #./lib/less.pm
+ 'lib' => undef, #./lib/lib.pm
+ 'locale' => undef, #./lib/locale.pm
+ 'Math::BigFloat' => undef, #./lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, #./lib/Math/BigInt.pm
+ 'Math::Complex' => '1.25', #./lib/Math/Complex.pm
+ 'Math::Trig' => '1', #./lib/Math/Trig.pm
+ 'NDBM_File' => '1.01', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::hostent' => undef, #./lib/Net/hostent.pm
+ 'Net::netent' => undef, #./lib/Net/netent.pm
+ 'Net::Ping' => '2.02', #./lib/Net/Ping.pm
+ 'Net::protoent' => undef, #./lib/Net/protoent.pm
+ 'Net::servent' => undef, #./lib/Net/servent.pm
+ 'O' => undef, #./ext/B/O.pm
+ 'ODBM_File' => '1.00', #./ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.04', #./ext/Opcode/Opcode.pm
+ 'ops' => undef, #./ext/Opcode/ops.pm
+ 'Safe' => '2.06', #./ext/Opcode/Safe.pm
+ 'OS2::ExtAttr' => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '0.2', #./os2/OS2/Process/Process.pm
+ 'OS2::REXX' => undef, #./os2/OS2/REXX/REXX.pm
+ 'overload' => undef, #./lib/overload.pm
+ 'Pod::Functions' => undef, #./lib/Pod/Functions.pm
+ 'Pod::Html' => '1.01', #./lib/Pod/Html.pm
+ 'Pod::Text' => '1.0203', #./lib/Pod/Text.pm
+ 'POSIX' => '1.02', #./ext/POSIX/POSIX.pm
+ 're' => '0.02', #./ext/re/re.pm
+ 'SDBM_File' => '1.00', #./ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => undef, #./lib/Search/Dict.pm
+ 'SelectSaver' => undef, #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.08', #./lib/SelfLoader.pm
+ 'Shell' => undef, #./lib/Shell.pm
+ 'sigtrap' => '1.02', #./lib/sigtrap.pm
+ 'Socket' => '1.7', #./ext/Socket/Socket.pm
+ 'strict' => '1.01', #./lib/strict.pm
+ 'subs' => undef, #./lib/subs.pm
+ 'Symbol' => '1.02', #./lib/Symbol.pm
+ 'Sys::Hostname' => undef, #./lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, #./lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, #./lib/Term/Cap.pm
+ 'Term::Complete' => undef, #./lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #./lib/Term/ReadLine.pm
+ 'Test' => '1.04', #./lib/Test.pm
+ 'Test::Harness' => '1.1602', #./lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, #./lib/Text/Abbrev.pm
+ 'Text::ParseWords' => '3.1', #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '96.121201', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '97.02', #./lib/Text/Wrap.pm
+ 'Thread' => '1.0', #./ext/Thread/Thread.pm
+ 'Thread::Queue' => undef, #./ext/Thread/Thread/Queue.pm
+ 'Thread::Semaphore' => undef, #./ext/Thread/Thread/Semaphore.pm
+ 'Thread::Signal' => undef, #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => undef, #./ext/Thread/Thread/Specific.pm
+ 'Tie::Array' => '1.00', #./lib/Tie/Array.pm
+ 'Tie::Handle' => undef, #./lib/Tie/Handle.pm
+ 'Tie::Hash' => undef, #./lib/Tie/Hash.pm
+ 'Tie::RefHash' => undef, #./lib/Tie/RefHash.pm
+ 'Tie::Scalar' => undef, #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #./lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.01', #./lib/Time/gmtime.pm
+ 'Time::Local' => undef, #./lib/Time/Local.pm
+ 'Time::localtime' => '1.01', #./lib/Time/localtime.pm
+ 'Time::tm' => undef, #./lib/Time/tm.pm
+ 'UNIVERSAL' => undef, #./lib/UNIVERSAL.pm
+ 'User::grent' => undef, #./lib/User/grent.pm
+ 'User::pwent' => undef, #./lib/User/pwent.pm
+ 'vars' => undef, #./lib/vars.pm
+ 'VMS::DCLsym' => '1.01', #./vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => undef, #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.1', #./vms/ext/Stdio/Stdio.pm
+ 'vmsish' => undef, #./vms/ext/vmsish.pm
+ },
+
+ 5.00503 => {
+ 'AnyDBM_File' => undef,
+ 'attrs' => '1.0',
+ 'AutoLoader' => undef,
+ 'AutoSplit' => 1.0303,
+ 'autouse' => 1.01,
+ 'B::Asmdata' => undef,
+ 'B::Assembler' => undef,
+ 'B::Bblock' => undef,
+ 'B::Bytecode' => undef,
+ 'B::C' => undef,
+ 'B::CC' => undef,
+ 'B::Debug' => undef,
+ 'B::Deparse' => 0.56,
+ 'B::Disassembler' => undef,
+ 'B::Lint' => undef,
+ 'B' => undef,
+ 'B::Showlex' => undef,
+ 'B::Stackobj' => undef,
+ 'B::Terse' => undef,
+ 'B::Xref' => undef,
+ 'base' => undef,
+ 'Benchmark' => undef,
+ 'blib' => '1.00',
+ 'Carp' => undef,
+ 'CGI' => 2.46,
+ 'CGI::Apache' => 1.1,
+ 'CGI::Carp' => 1.13,
+ 'CGI::Cookie' => 1.06,
+ 'CGI::Fast' => 1.01,
+ 'CGI::Push' => 1.01,
+ 'CGI::Switch' => 0.06,
+ 'Class::Struct' => undef,
+ 'Config' => undef,
+ 'constant' => '1.00',
+ 'CPAN::FirstTime' => 1.36 ,
+ 'CPAN' => 1.48,
+ 'CPAN::Nox' => '1.00',
+ 'Cwd' => 2.01,
+ 'Data::Dumper' => 2.101,
+ 'DB_File' => 1.65,
+ 'Devel::SelfStubber' => 1.01,
+ 'diagnostics' => undef,
+ 'DirHandle' => undef,
+ 'Dumpvalue' => undef,
+ 'DynaLoader' => 1.03,
+ 'English' => undef,
+ 'Env' => undef,
+ 'Exporter' => undef,
+ 'ExtUtils::Command' => 1.01,
+ 'ExtUtils::Embed' => 1.2505,
+ 'ExtUtils::Install' => 1.28 ,
+ 'ExtUtils::Installed' => 0.02,
+ 'ExtUtils::Liblist' => 1.25 ,
+ 'ExtUtils::MakeMaker' => 5.4302,
+ 'ExtUtils::Manifest' => 1.33 ,
+ 'ExtUtils::Mkbootstrap' => 1.14 ,
+ 'ExtUtils::Mksymlists' => 1.17 ,
+ 'ExtUtils::MM_OS2' => undef,
+ 'ExtUtils::MM_Unix' => 1.12602 ,
+ 'ExtUtils::MM_VMS' => undef,
+ 'ExtUtils::MM_Win32' => undef,
+ 'ExtUtils::Packlist' => 0.03,
+ 'ExtUtils::testlib' => 1.11 ,
+ 'ExtUtils::XSSymSet' => '1.0',
+ 'Fatal' => 1.02,
+ 'Fcntl' => 1.03,
+ 'fields' => 0.02,
+ 'File::Basename' => 2.6,
+ 'File::CheckTree' => undef,
+ 'File::Compare' => 1.1001,
+ 'File::Copy' => 2.02,
+ 'File::DosGlob' => undef,
+ 'File::Find' => undef,
+ 'File::Path' => 1.0401,
+ 'File::Spec' => 0.6,
+ 'File::Spec::Mac' => '1.0',
+ 'File::Spec::OS2' => undef,
+ 'File::Spec::Unix' => undef,
+ 'File::Spec::VMS' => undef,
+ 'File::Spec::Win32' => undef,
+ 'File::stat' => undef,
+ 'FileCache' => undef,
+ 'FileHandle' => '2.00',
+ 'FindBin' => 1.42,
+ 'GDBM_File' => '1.00',
+ 'Getopt::Long' => 2.19,
+ 'Getopt::Std' => 1.01,
+ 'I18N::Collate' => undef,
+ 'integer' => undef,
+ 'IO' => undef,
+ 'IO::File' => 1.06021,
+ 'IO::Handle' => 1.1505,
+ 'IO::Pipe' => 1.0902,
+ 'IO::Seekable' => 1.06,
+ 'IO::Select' => '1.10',
+ 'IO::Socket' => 1.1603,
+ 'IPC::Msg' => '1.00',
+ 'IPC::Open2' => 1.01,
+ 'IPC::Open3' => 1.0103,
+ 'IPC::Semaphore' => '1.00',
+ 'IPC::SysV' => 1.03,
+ 'less' => undef,
+ 'lib' => undef,
+ 'locale' => undef,
+ 'Math::BigFloat' => undef,
+ 'Math::BigInt' => undef,
+ 'Math::Complex' => 1.26,
+ 'Math::Trig' => 1,
+ 'NDBM_File' => 1.01,
+ 'Net::hostent' => undef,
+ 'Net::netent' => undef,
+ 'Net::Ping' => 2.02,
+ 'Net::protoent' => undef,
+ 'Net::servent' => undef,
+ 'O' => undef,
+ 'ODBM_File' => '1.00',
+ 'Opcode' => 1.04,
+ 'ops' => undef,
+ 'OS2::ExtAttr' => 0.01,
+ 'OS2::PrfDB' => 0.02,
+ 'OS2::Process' => 0.2,
+ 'OS2::REXX' => undef,
+ 'overload' => undef,
+ 'Pod::Functions' => undef,
+ 'Pod::Html' => 1.01,
+ 'Pod::Text' => 1.0203,
+ 'POSIX' => 1.02,
+ 're' => 0.02,
+ 'Safe' => 2.06,
+ 'SDBM_File' => '1.00',
+ 'Search::Dict' => undef,
+ 'SelectSaver' => undef,
+ 'SelfLoader' => 1.08,
+ 'Shell' => undef,
+ 'sigtrap' => 1.02,
+ 'Socket' => 1.7,
+ 'strict' => 1.01,
+ 'subs' => undef,
+ 'Symbol' => 1.02,
+ 'Sys::Hostname' => undef,
+ 'Sys::Syslog' => undef,
+ 'Term::Cap' => undef,
+ 'Term::Complete' => undef,
+ 'Term::ReadLine' => undef,
+ 'Test' => 1.122,
+ 'Test::Harness' => 1.1602,
+ 'Text::Abbrev' => undef,
+ 'Text::ParseWords' => 3.1,
+ 'Text::Soundex' => undef,
+ 'Text::Tabs' => 96.121201,
+ 'Text::Wrap' => 98.112902,
+ 'Thread' => '1.0',
+ 'Thread::Queue' => undef,
+ 'Thread::Semaphore' => undef,
+ 'Thread::Specific' => undef,
+ 'Thread::Signal' => undef,
+ 'Tie::Array' => '1.00',
+ 'Tie::Handle' => undef,
+ 'Tie::Hash' => undef,
+ 'Tie::RefHash' => undef,
+ 'Tie::Scalar' => undef,
+ 'Tie::SubstrHash' => undef,
+ 'Time::gmtime' => 1.01,
+ 'Time::Local' => undef,
+ 'Time::localtime' => 1.01,
+ 'Time::tm' => undef,
+ 'UNIVERSAL' => undef,
+ 'User::grent' => undef,
+ 'User::pwent' => undef,
+ 'vars' => undef,
+ 'VMS::DCLsym' => 1.01,
+ 'VMS::Filespec' => undef,
+ 'VMS::Stdio' => 2.1,
+ 'vmsish' => undef,
+ },
+
+ 5.00405 => {
+ 'AnyDBM_File' => undef, #./lib/AnyDBM_File.pm
+ 'attrs' => '0.1', #./lib/attrs.pm
+ 'AutoLoader' => '5.56', #./lib/AutoLoader.pm
+ 'AutoSplit' => '1.0303', #./lib/AutoSplit.pm
+ 'autouse' => '1.01', #./lib/autouse.pm
+ 'base' => undef, #./lib/base.pm
+ 'Benchmark' => undef, #./lib/Benchmark.pm
+ 'blib' => '1.00', #./lib/blib.pm
+ 'Bundle::CPAN' => '0.03', #./lib/Bundle/CPAN.pm
+ 'Carp' => undef, #./lib/Carp.pm
+ 'CGI' => '2.42', #./lib/CGI.pm
+ 'CGI::Apache' => '1.1', #./lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.10', #./lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.06', #./lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.00a', #./lib/CGI/Fast.pm
+ 'CGI::Push' => '1.01', #./lib/CGI/Push.pm
+ 'CGI::Switch' => '0.06', #./lib/CGI/Switch.pm
+ 'Class::Struct' => undef, #./lib/Class/Struct.pm
+ 'Config' => undef,
+ 'constant' => '1.00', #./lib/constant.pm
+ 'CPAN' => '1.40', #./lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.30 ', #./lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => undef, #./lib/CPAN/Nox.pm
+ 'Cwd' => '2.01', #./lib/Cwd.pm
+ 'DB_File' => '1.15', #./ext/DB_File/DB_File.pm
+ 'Devel::SelfStubber' => '1.01', #./lib/Devel/SelfStubber.pm
+ 'diagnostics' => undef, #./lib/diagnostics.pm
+ 'DirHandle' => undef, #./lib/DirHandle.pm
+ 'DynaLoader' => '1.03',
+ 'English' => undef, #./lib/English.pm
+ 'Env' => undef, #./lib/Env.pm
+ 'Exporter' => undef, #./lib/Exporter.pm
+ 'ExtUtils::Command' => '1.01', #./lib/ExtUtils/Command.pm
+ 'ExtUtils::Embed' => '1.2505', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.28 ', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Liblist' => '1.25 ', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '5.42', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.33 ', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => '1.14 ', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.16 ', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_OS2' => undef, #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.118 ', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => undef, #./lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::testlib' => '1.11 ', #./lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #./vms/ext/XSSymSet.pm
+ 'Fcntl' => '1.03', #./ext/Fcntl/Fcntl.pm
+ 'File::Basename' => '2.6', #./lib/File/Basename.pm
+ 'File::CheckTree' => undef, #./lib/File/CheckTree.pm
+ 'File::Compare' => '1.1001', #./lib/File/Compare.pm
+ 'File::Copy' => '2.02', #./lib/File/Copy.pm
+ 'File::DosGlob' => undef, #./lib/File/DosGlob.pm
+ 'File::Find' => undef, #./lib/File/Find.pm
+ 'File::Path' => '1.0402', #./lib/File/Path.pm
+ 'File::Spec' => '0.6', #./lib/File/Spec.pm
+ 'File::Spec::Mac' => '1.0', #./lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => undef, #./lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => undef, #./lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => undef, #./lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => undef, #./lib/File/Spec/Win32.pm
+ 'File::stat' => undef, #./lib/File/stat.pm
+ 'FileCache' => undef, #./lib/FileCache.pm
+ 'FileHandle' => '2.00', #./lib/FileHandle.pm
+ 'FindBin' => '1.41', #./lib/FindBin.pm
+ 'GDBM_File' => '1.00', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.19', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, #./lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #./lib/I18N/Collate.pm
+ 'integer' => undef, #./lib/integer.pm
+ 'IO' => undef, #./ext/IO/IO.pm
+ 'IO::File' => '1.06021', #./ext/IO/lib/IO/File.pm
+ 'IO::Handle' => '1.1504', #./ext/IO/lib/IO/Handle.pm
+ 'IO::Pipe' => '1.0901', #./ext/IO/lib/IO/Pipe.pm
+ 'IO::Seekable' => '1.06', #./ext/IO/lib/IO/Seekable.pm
+ 'IO::Select' => '1.10', #./ext/IO/lib/IO/Select.pm
+ 'IO::Socket' => '1.1603', #./ext/IO/lib/IO/Socket.pm
+ 'IPC::Open2' => '1.01', #./lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0103', #./lib/IPC/Open3.pm
+ 'less' => undef, #./lib/less.pm
+ 'lib' => undef, #./lib/lib.pm
+ 'locale' => undef, #./lib/locale.pm
+ 'Math::BigFloat' => undef, #./lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, #./lib/Math/BigInt.pm
+ 'Math::Complex' => '1.25', #./lib/Math/Complex.pm
+ 'Math::Trig' => '1', #./lib/Math/Trig.pm
+ 'NDBM_File' => '1.01', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::hostent' => undef, #./lib/Net/hostent.pm
+ 'Net::netent' => undef, #./lib/Net/netent.pm
+ 'Net::Ping' => '2.02', #./lib/Net/Ping.pm
+ 'Net::protoent' => undef, #./lib/Net/protoent.pm
+ 'Net::servent' => undef, #./lib/Net/servent.pm
+ 'ODBM_File' => '1.00', #./ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.04', #./ext/Opcode/Opcode.pm
+ 'ops' => undef, #./ext/Opcode/ops.pm
+ 'OS2::ExtAttr' => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => undef, #./os2/OS2/Process/Process.pm
+ 'OS2::REXX' => undef, #./os2/OS2/REXX/REXX.pm
+ 'overload' => undef, #./lib/overload.pm
+ 'Pod::Functions' => undef, #./lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0101', #./lib/Pod/Html.pm
+ 'Pod::Text' => '1.0204', #./lib/Pod/Text.pm
+ 'POSIX' => '1.02', #./ext/POSIX/POSIX.pm
+ 're' => undef, #./lib/re.pm
+ 'Safe' => '2.06', #./ext/Opcode/Safe.pm
+ 'SDBM_File' => '1.00', #./ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => undef, #./lib/Search/Dict.pm
+ 'SelectSaver' => undef, #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.08', #./lib/SelfLoader.pm
+ 'Shell' => undef, #./lib/Shell.pm
+ 'sigtrap' => '1.02', #./lib/sigtrap.pm
+ 'Socket' => '1.7', #./ext/Socket/Socket.pm
+ 'strict' => '1.01', #./lib/strict.pm
+ 'subs' => undef, #./lib/subs.pm
+ 'Symbol' => '1.02', #./lib/Symbol.pm
+ 'Sys::Hostname' => undef, #./lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, #./lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, #./lib/Term/Cap.pm
+ 'Term::Complete' => undef, #./lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #./lib/Term/ReadLine.pm
+ 'Test' => '1.04', #./lib/Test.pm
+ 'Test::Harness' => '1.1602', #./lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, #./lib/Text/Abbrev.pm
+ 'Text::ParseWords' => '3.1001', #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '96.121201', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '98.112902', #./lib/Text/Wrap.pm
+ 'Tie::Handle' => undef, #./lib/Tie/Handle.pm
+ 'Tie::Hash' => undef, #./lib/Tie/Hash.pm
+ 'Tie::RefHash' => undef, #./lib/Tie/RefHash.pm
+ 'Tie::Scalar' => undef, #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #./lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.01', #./lib/Time/gmtime.pm
+ 'Time::Local' => undef, #./lib/Time/Local.pm
+ 'Time::localtime' => '1.01', #./lib/Time/localtime.pm
+ 'Time::tm' => undef, #./lib/Time/tm.pm
+ 'UNIVERSAL' => undef, #./lib/UNIVERSAL.pm
+ 'User::grent' => undef, #./lib/User/grent.pm
+ 'User::pwent' => undef, #./lib/User/pwent.pm
+ 'vars' => undef, #./lib/vars.pm
+ 'VMS::DCLsym' => '1.01', #./vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => undef, #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.02', #./vms/ext/Stdio/Stdio.pm
+ 'vmsish' => undef, #./vms/ext/vmsish.pm
+ },
+
+ 5.00504 => {
+ 'AnyDBM_File' => undef, #lib/AnyDBM_File.pm
+ 'attrs' => '1.0', #lib/attrs.pm
+ 'AutoLoader' => undef, #lib/AutoLoader.pm
+ 'AutoSplit' => '1.0303', #lib/AutoSplit.pm
+ 'autouse' => '1.01', #lib/autouse.pm
+ 'base' => undef, #lib/base.pm
+ 'B::Asmdata' => undef, #lib/B/Asmdata.pm
+ 'B::Assembler' => undef, #lib/B/Assembler.pm
+ 'B::Bblock' => undef, #lib/B/Bblock.pm
+ 'B::Bytecode' => undef, #lib/B/Bytecode.pm
+ 'B::CC' => undef, #lib/B/CC.pm
+ 'B::C' => undef, #lib/B/C.pm
+ 'B::Debug' => undef, #lib/B/Debug.pm
+ 'B::Deparse' => '0.56', #lib/B/Deparse.pm
+ 'B::Disassembler' => undef, #lib/B/Disassembler.pm
+ 'Benchmark' => undef, #lib/Benchmark.pm
+ 'blib' => '1.00', #lib/blib.pm
+ 'B::Lint' => undef, #lib/B/Lint.pm
+ 'B::Showlex' => undef, #lib/B/Showlex.pm
+ 'B::Stackobj' => undef, #lib/B/Stackobj.pm
+ 'B::Terse' => undef, #lib/B/Terse.pm
+ 'B' => undef, #lib/B.pm
+ 'B::Xref' => undef, #lib/B/Xref.pm
+ 'Carp' => undef, #lib/Carp.pm
+ 'CGI' => '2.46', #lib/CGI.pm
+ 'CGI::Apache' => '1.1', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.13', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.06', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.01', #lib/CGI/Fast.pm
+ 'CGI::Push' => '1.01', #lib/CGI/Push.pm
+ 'CGI::Switch' => '0.06', #lib/CGI/Switch.pm
+ 'Class::Struct' => undef, #lib/Class/Struct.pm
+ 'Config' => undef, #lib/Config.pm
+ 'constant' => '1.00', #lib/constant.pm
+ 'CPAN' => '1.48', #lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.36 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.00', #lib/CPAN/Nox.pm
+ 'Cwd' => '2.01', #lib/Cwd.pm
+ 'Data::Dumper' => '2.101', #lib/Data/Dumper.pm
+ 'DB_File' => '1.807', #lib/DB_File.pm
+ 'Devel::SelfStubber' => '1.01', #lib/Devel/SelfStubber.pm
+ 'diagnostics' => undef, #lib/diagnostics.pm
+ 'DirHandle' => undef, #lib/DirHandle.pm
+ 'Dumpvalue' => undef, #lib/Dumpvalue.pm
+ 'DynaLoader' => '1.03', #lib/DynaLoader.pm
+ 'English' => undef, #lib/English.pm
+ 'Env' => undef, #lib/Env.pm
+ 'Errno' => '1.111', #lib/Errno.pm
+ 'Exporter' => undef, #lib/Exporter.pm
+ 'ExtUtils::Command' => '1.01', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Embed' => '1.2505', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.28 ', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.02', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.25 ', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '5.4302', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.33 ', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.14 ', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.17 ', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_OS2' => undef, #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.12602 ', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => undef, #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::Packlist' => '0.03', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.11 ', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'Fatal' => '1.02', #lib/Fatal.pm
+ 'Fcntl' => '1.03', #lib/Fcntl.pm
+ 'fields' => '0.02', #lib/fields.pm
+ 'File::Basename' => '2.6', #lib/File/Basename.pm
+ 'FileCache' => undef, #lib/FileCache.pm
+ 'File::CheckTree' => undef, #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1002', #lib/File/Compare.pm
+ 'File::Copy' => '2.02', #lib/File/Copy.pm
+ 'File::DosGlob' => undef, #lib/File/DosGlob.pm
+ 'File::Find' => undef, #lib/File/Find.pm
+ 'FileHandle' => '2.00', #lib/FileHandle.pm
+ 'File::Path' => '1.0401', #lib/File/Path.pm
+ 'File::Spec' => '0.8', #lib/File/Spec.pm
+ 'File::Spec::Functions' => undef, #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => undef, #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => undef, #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => undef, #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => undef, #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => undef, #lib/File/Spec/Win32.pm
+ 'File::stat' => undef, #lib/File/stat.pm
+ 'FindBin' => '1.42', #lib/FindBin.pm
+ 'GDBM_File' => '1.00', #lib/GDBM_File.pm
+ 'Getopt::Long' => '2.20', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.01', #lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #lib/I18N/Collate.pm
+ 'integer' => undef, #lib/integer.pm
+ 'IO::File' => '1.06021', #lib/IO/File.pm
+ 'IO::Handle' => '1.1505', #lib/IO/Handle.pm
+ 'IO::Pipe' => '1.0902', #lib/IO/Pipe.pm
+ 'IO::Seekable' => '1.06', #lib/IO/Seekable.pm
+ 'IO::Select' => '1.10', #lib/IO/Select.pm
+ 'IO::Socket' => '1.1603', #lib/IO/Socket.pm
+ 'IO' => undef, #lib/IO.pm
+ 'IPC::Msg' => '1.00', #lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0103', #lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.00', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.03', #lib/IPC/SysV.pm
+ 'less' => undef, #lib/less.pm
+ 'lib' => undef, #lib/lib.pm
+ 'locale' => undef, #lib/locale.pm
+ 'Math::BigFloat' => undef, #lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, #lib/Math/BigInt.pm
+ 'Math::Complex' => '1.26', #lib/Math/Complex.pm
+ 'Math::Trig' => '1', #lib/Math/Trig.pm
+ 'NDBM_File' => '1.01', #ext/NDBM_File/NDBM_File.pm
+ 'Net::hostent' => undef, #lib/Net/hostent.pm
+ 'Net::netent' => undef, #lib/Net/netent.pm
+ 'Net::Ping' => '2.02', #lib/Net/Ping.pm
+ 'Net::protoent' => undef, #lib/Net/protoent.pm
+ 'Net::servent' => undef, #lib/Net/servent.pm
+ 'ODBM_File' => '1.00', #ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.04', #lib/Opcode.pm
+ 'ops' => undef, #lib/ops.pm
+ 'O' => undef, #lib/O.pm
+ 'OS2::ExtAttr' => '0.01', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '0.2', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => undef, #os2/OS2/REXX/REXX.pm
+ 'overload' => undef, #lib/overload.pm
+ 'Pod::Functions' => undef, #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.02', #lib/Pod/Html.pm
+ 'Pod::Text' => '1.0203', #lib/Pod/Text.pm
+ 'POSIX' => '1.02', #lib/POSIX.pm
+ 're' => '0.02', #lib/re.pm
+ 'Safe' => '2.06', #lib/Safe.pm
+ 'SDBM_File' => '1.00', #lib/SDBM_File.pm
+ 'Search::Dict' => undef, #lib/Search/Dict.pm
+ 'SelectSaver' => undef, #lib/SelectSaver.pm
+ 'SelfLoader' => '1.08', #lib/SelfLoader.pm
+ 'Shell' => undef, #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'Socket' => '1.7', #lib/Socket.pm
+ 'strict' => '1.01', #lib/strict.pm
+ 'subs' => undef, #lib/subs.pm
+ 'Symbol' => '1.02', #lib/Symbol.pm
+ 'Sys::Hostname' => undef, #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, #lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, #lib/Term/Cap.pm
+ 'Term::Complete' => undef, #lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #lib/Term/ReadLine.pm
+ 'Test' => '1.122', #lib/Test.pm
+ 'Test::Harness' => '1.1602', #lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, #lib/Text/Abbrev.pm
+ 'Text::ParseWords' => '3.1', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, #lib/Text/Soundex.pm
+ 'Text::Tabs' => '96.121201', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '98.112902', #lib/Text/Wrap.pm
+ 'Thread' => '1.0', #ext/Thread/Thread.pm
+ 'Thread::Queue' => undef, #ext/Thread/Thread/Queue.pm
+ 'Thread::Semaphore' => undef, #ext/Thread/Thread/Semaphore.pm
+ 'Thread::Signal' => undef, #ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => undef, #ext/Thread/Thread/Specific.pm
+ 'Tie::Array' => '1.00', #lib/Tie/Array.pm
+ 'Tie::Handle' => undef, #lib/Tie/Handle.pm
+ 'Tie::Hash' => undef, #lib/Tie/Hash.pm
+ 'Tie::RefHash' => undef, #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => undef, #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.01', #lib/Time/gmtime.pm
+ 'Time::localtime' => '1.01', #lib/Time/localtime.pm
+ 'Time::Local' => undef, #lib/Time/Local.pm
+ 'Time::tm' => undef, #lib/Time/tm.pm
+ 'UNIVERSAL' => undef, #lib/UNIVERSAL.pm
+ 'User::grent' => undef, #lib/User/grent.pm
+ 'User::pwent' => undef, #lib/User/pwent.pm
+ 'vars' => undef, #lib/vars.pm
+ 'VMS::DCLsym' => '1.01', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => undef, #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.1', #vms/ext/Stdio/Stdio.pm
+ 'vmsish' => undef, #vms/ext/vmsish.pm
+ },
+
+ 5.006 => {
+ 'AnyDBM_File' => undef, #./lib/AnyDBM_File.pm
+ 'AutoLoader' => '5.57', #./lib/AutoLoader.pm
+ 'AutoSplit' => '1.0305', #./lib/AutoSplit.pm
+ 'B' => undef, #./ext/B/B.pm
+ 'B::Asmdata' => undef, #./ext/B/B/Asmdata.pm
+ 'B::Assembler' => undef, #./ext/B/B/Assembler.pm
+ 'B::Bblock' => undef, #./ext/B/B/Bblock.pm
+ 'B::Bytecode' => undef, #./ext/B/B/Bytecode.pm
+ 'B::C' => undef, #./ext/B/B/C.pm
+ 'B::CC' => undef, #./ext/B/B/CC.pm
+ 'B::Debug' => undef, #./ext/B/B/Debug.pm
+ 'B::Deparse' => '0.59', #./ext/B/B/Deparse.pm
+ 'B::Disassembler' => undef, #./ext/B/B/Disassembler.pm
+ 'B::Lint' => undef, #./ext/B/B/Lint.pm
+ 'B::Showlex' => undef, #./ext/B/B/Showlex.pm
+ 'B::Stackobj' => undef, #./ext/B/B/Stackobj.pm
+ 'B::Stash' => undef, #./ext/B/B/Stash.pm
+ 'B::Terse' => undef, #./ext/B/B/Terse.pm
+ 'B::Xref' => undef, #./ext/B/B/Xref.pm
+ 'Benchmark' => '1', #./lib/Benchmark.pm
+ 'ByteLoader' => '0.03', #./ext/ByteLoader/ByteLoader.pm
+ 'CGI' => '2.56', #./lib/CGI.pm
+ 'CGI::Apache' => undef, #./lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.14', #./lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.12', #./lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.02', #./lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.03', #./lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.01', #./lib/CGI/Push.pm
+ 'CGI::Switch' => undef, #./lib/CGI/Switch.pm
+ 'CPAN' => '1.52', #./lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.38 ', #./lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.00', #./lib/CPAN/Nox.pm
+ 'Carp' => undef, #./lib/Carp.pm
+ 'Carp::Heavy' => undef, #./lib/Carp/Heavy.pm
+ 'Class::Struct' => '0.58', #./lib/Class/Struct.pm
+ 'Config' => undef,
+ 'Cwd' => '2.02', #./lib/Cwd.pm
+ 'DB' => '1.0', #./lib/DB.pm
+ 'DB_File' => '1.72', #./ext/DB_File/DB_File.pm
+ 'Data::Dumper' => '2.101', #./ext/Data/Dumper/Dumper.pm
+ 'Devel::DProf' => '20000000.00_00', #./ext/Devel/DProf/DProf.pm
+ 'Devel::Peek' => '1.00_01', #./ext/Devel/Peek/Peek.pm
+ 'Devel::SelfStubber' => '1.01', #./lib/Devel/SelfStubber.pm
+ 'DirHandle' => undef, #./lib/DirHandle.pm
+ 'Dumpvalue' => undef, #./lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04',
+ 'English' => undef, #./lib/English.pm
+ 'Env' => undef, #./lib/Env.pm
+ 'Exporter' => '5.562', #./lib/Exporter.pm
+ 'Exporter::Heavy' => undef, #./lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.01', #./lib/ExtUtils/Command.pm
+ 'ExtUtils::Embed' => '1.2505', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.28 ', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.02', #./lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.25 ', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MM_Cygwin' => undef, #./lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_OS2' => undef, #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.12603 ', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => undef, #./lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MakeMaker' => '5.45', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.33 ', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.14 ', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.17 ', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::Packlist' => '0.03', #./lib/ExtUtils/Packlist.pm
+ 'ExtUtils::XSSymSet' => '1.0', #./vms/ext/XSSymSet.pm
+ 'ExtUtils::testlib' => '1.11 ', #./lib/ExtUtils/testlib.pm
+ 'Fatal' => '1.02', #./lib/Fatal.pm
+ 'Fcntl' => '1.03', #./ext/Fcntl/Fcntl.pm
+ 'File::Basename' => '2.6', #./lib/File/Basename.pm
+ 'File::CheckTree' => undef, #./lib/File/CheckTree.pm
+ 'File::Compare' => '1.1002', #./lib/File/Compare.pm
+ 'File::Copy' => '2.03', #./lib/File/Copy.pm
+ 'File::DosGlob' => undef, #./lib/File/DosGlob.pm
+ 'File::Find' => undef, #./lib/File/Find.pm
+ 'File::Glob' => '0.991', #./ext/File/Glob/Glob.pm
+ 'File::Path' => '1.0403', #./lib/File/Path.pm
+ 'File::Spec' => '0.8', #./lib/File/Spec.pm
+ 'File::Spec::Functions' => undef, #./lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => undef, #./lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => undef, #./lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => undef, #./lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => undef, #./lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => undef, #./lib/File/Spec/Win32.pm
+ 'File::stat' => undef, #./lib/File/stat.pm
+ 'FileCache' => undef, #./lib/FileCache.pm
+ 'FileHandle' => '2.00', #./lib/FileHandle.pm
+ 'FindBin' => '1.42', #./lib/FindBin.pm
+ 'GDBM_File' => '1.03', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.23', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.02', #./lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #./lib/I18N/Collate.pm
+ 'IO' => '1.20', #./ext/IO/IO.pm
+ 'IO::Dir' => '1.03', #./ext/IO/lib/IO/Dir.pm
+ 'IO::File' => '1.08', #./ext/IO/lib/IO/File.pm
+ 'IO::Handle' => '1.21', #./ext/IO/lib/IO/Handle.pm
+ 'IO::Pipe' => '1.121', #./ext/IO/lib/IO/Pipe.pm
+ 'IO::Poll' => '0.01', #./ext/IO/lib/IO/Poll.pm
+ 'IO::Seekable' => '1.08', #./ext/IO/lib/IO/Seekable.pm
+ 'IO::Select' => '1.14', #./ext/IO/lib/IO/Select.pm
+ 'IO::Socket' => '1.26', #./ext/IO/lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.25', #./ext/IO/lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.20', #./ext/IO/lib/IO/Socket/UNIX.pm
+ 'IPC::Open2' => '1.01', #./lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0103', #./lib/IPC/Open3.pm
+ 'IPC::Msg' => '1.00', #./ext/IPC/SysV/Msg.pm
+ 'IPC::Semaphore' => '1.00', #./ext/IPC/SysV/Semaphore.pm
+ 'IPC::SysV' => '1.03', #./ext/IPC/SysV/SysV.pm
+ 'JNI' => '0.01', #./jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #./jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #./jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #./jpl/JPL/Compile.pm
+ 'Math::BigFloat' => undef, #./lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, #./lib/Math/BigInt.pm
+ 'Math::Complex' => '1.26', #./lib/Math/Complex.pm
+ 'Math::Trig' => '1', #./lib/Math/Trig.pm
+ 'NDBM_File' => '1.03', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::Ping' => '2.02', #./lib/Net/Ping.pm
+ 'Net::hostent' => undef, #./lib/Net/hostent.pm
+ 'Net::netent' => undef, #./lib/Net/netent.pm
+ 'Net::protoent' => undef, #./lib/Net/protoent.pm
+ 'Net::servent' => undef, #./lib/Net/servent.pm
+ 'O' => undef, #./ext/B/O.pm
+ 'ODBM_File' => '1.02', #./ext/ODBM_File/ODBM_File.pm
+ 'OS2::ExtAttr' => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '0.2', #./os2/OS2/Process/Process.pm
+ 'OS2::REXX' => undef, #./os2/OS2/REXX/REXX.pm
+ 'OS2::DLL' => undef, #./os2/OS2/REXX/DLL/DLL.pm
+ 'Opcode' => '1.04', #./ext/Opcode/Opcode.pm
+ 'POSIX' => '1.03', #./ext/POSIX/POSIX.pm
+ 'Pod::Checker' => '1.098', #./lib/Pod/Checker.pm
+ 'Pod::Find' => '0.12', #./lib/Pod/Find.pm
+ 'Pod::Functions' => undef, #./lib/Pod/Functions.pm
+ 'Pod::Html' => '1.03', #./lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.12', #./lib/Pod/InputObjects.pm
+ 'Pod::Man' => '1.02', #./lib/Pod/Man.pm
+ 'Pod::ParseUtils' => '0.2', #./lib/Pod/ParseUtils.pm
+ 'Pod::Parser' => '1.12', #./lib/Pod/Parser.pm
+ 'Pod::Plainer' => '0.01', #./lib/Pod/Plainer.pm
+ 'Pod::Select' => '1.12', #./lib/Pod/Select.pm
+ 'Pod::Text' => '2.03', #./lib/Pod/Text.pm
+ 'Pod::Text::Color' => '0.05', #./lib/Pod/Text/Color.pm
+ 'Pod::Text::Termcap' => '0.04', #./lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.12', #./lib/Pod/Usage.pm
+ 'SDBM_File' => '1.02', #./ext/SDBM_File/SDBM_File.pm
+ 'Safe' => '2.06', #./ext/Opcode/Safe.pm
+ 'Search::Dict' => undef, #./lib/Search/Dict.pm
+ 'SelectSaver' => undef, #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.0901', #./lib/SelfLoader.pm
+ 'Shell' => '0.2', #./lib/Shell.pm
+ 'Socket' => '1.72', #./ext/Socket/Socket.pm
+ 'Symbol' => '1.02', #./lib/Symbol.pm
+ 'Sys::Hostname' => '1.1', #./ext/Sys/Hostname/Hostname.pm
+ 'Sys::Syslog' => '0.01', #./ext/Sys/Syslog/Syslog.pm
+ 'Term::ANSIColor' => '1.01', #./lib/Term/ANSIColor.pm
+ 'Term::Cap' => undef, #./lib/Term/Cap.pm
+ 'Term::Complete' => undef, #./lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #./lib/Term/ReadLine.pm
+ 'Test' => '1.13', #./lib/Test.pm
+ 'Test::Harness' => '1.1604', #./lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, #./lib/Text/Abbrev.pm
+ 'Text::ParseWords' => '3.2', #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.0', #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '98.112902', #./lib/Text/Wrap.pm
+ 'Thread' => '1.0', #./ext/Thread/Thread.pm
+ 'Thread::Queue' => undef, #./ext/Thread/Thread/Queue.pm
+ 'Thread::Semaphore' => undef, #./ext/Thread/Thread/Semaphore.pm
+ 'Thread::Signal' => undef, #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => undef, #./ext/Thread/Thread/Specific.pm
+ 'Tie::Array' => '1.01', #./lib/Tie/Array.pm
+ 'Tie::Handle' => '1.0', #./lib/Tie/Handle.pm
+ 'Tie::Hash' => undef, #./lib/Tie/Hash.pm
+ 'Tie::RefHash' => undef, #./lib/Tie/RefHash.pm
+ 'Tie::Scalar' => undef, #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #./lib/Tie/SubstrHash.pm
+ 'Time::Local' => undef, #./lib/Time/Local.pm
+ 'Time::gmtime' => '1.01', #./lib/Time/gmtime.pm
+ 'Time::localtime' => '1.01', #./lib/Time/localtime.pm
+ 'Time::tm' => undef, #./lib/Time/tm.pm
+ 'UNIVERSAL' => undef, #./lib/UNIVERSAL.pm
+ 'User::grent' => undef, #./lib/User/grent.pm
+ 'User::pwent' => undef, #./lib/User/pwent.pm
+ 'VMS::DCLsym' => '1.01', #./vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => undef, #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.2', #./vms/ext/Stdio/Stdio.pm
+ 'XSLoader' => '0.01',
+ 'attributes' => '0.03', #./lib/attributes.pm
+ 'attrs' => '1.0', #./ext/attrs/attrs.pm
+ 'autouse' => '1.02', #./lib/autouse.pm
+ 'base' => '1.01', #./lib/base.pm
+ 'blib' => '1.00', #./lib/blib.pm
+ 'bytes' => undef, #./lib/bytes.pm
+ 'charnames' => undef, #./lib/charnames.pm
+ 'constant' => '1.02', #./lib/constant.pm
+ 'diagnostics' => '1.0', #./lib/diagnostics.pm
+ 'fields' => '1.01', #./lib/fields.pm
+ 'filetest' => undef, #./lib/filetest.pm
+ 'integer' => undef, #./lib/integer.pm
+ 'less' => undef, #./lib/less.pm
+ 'lib' => '0.5564', #./lib/lib.pm
+ 'locale' => undef, #./lib/locale.pm
+ 'open' => undef, #./lib/open.pm
+ 'ops' => undef, #./ext/Opcode/ops.pm
+ 'overload' => undef, #./lib/overload.pm
+ 're' => '0.02', #./ext/re/re.pm
+ 'sigtrap' => '1.02', #./lib/sigtrap.pm
+ 'strict' => '1.01', #./lib/strict.pm
+ 'subs' => undef, #./lib/subs.pm
+ 'utf8' => undef, #./lib/utf8.pm
+ 'vars' => undef, #./lib/vars.pm
+ 'vmsish' => undef, #./vms/ext/vmsish.pm
+ 'warnings' => undef, #./lib/warnings.pm
+ 'warnings::register' => undef, #./lib/warnings/register.pm
+ },
+
+ 5.006001 => {
+ 'AnyDBM_File' => undef,
+ 'attributes' => 0.03,
+ 'attrs' => '1.0',
+ 'AutoLoader' => 5.58,
+ 'AutoSplit' => 1.0305,
+ 'autouse' => 1.02,
+ 'B::Asmdata' => undef,
+ 'B::Assembler' => 0.02,
+ 'B::Bblock' => undef,
+ 'B::Bytecode' => undef,
+ 'B::C' => undef,
+ 'B::CC' => undef,
+ 'B::Concise' => 0.51,
+ 'B::Debug' => undef,
+ 'B::Deparse' => 0.6,
+ 'B::Disassembler' => undef,
+ 'B::Lint' => undef,
+ 'B' => undef,
+ 'B::Showlex' => undef,
+ 'B::Stackobj' => undef,
+ 'B::Stash' => undef,
+ 'B::Terse' => undef,
+ 'B::Xref' => undef,
+ 'base' => 1.01,
+ 'Benchmark' => 1,
+ 'blib' => '1.00',
+ 'ByteLoader' => 0.04,
+ 'bytes' => undef,
+ 'Carp' => undef,
+ 'Carp::Heavy' => undef,
+ 'CGI' => 2.752,
+ 'CGI::Apache' => undef,
+ 'CGI::Carp' => '1.20',
+ 'CGI::Cookie' => 1.18,
+ 'CGI::Fast' => 1.02,
+ 'CGI::Pretty' => 1.05,
+ 'CGI::Push' => 1.04,
+ 'CGI::Switch' => undef,
+ 'CGI::Util' => 1.1,
+ 'charnames' => undef,
+ 'Class::Struct' => 0.59,
+ 'Config' => undef,
+ 'constant' => 1.02,
+ 'CPAN::FirstTime' => 1.53 ,
+ 'CPAN' => '1.59_54',
+ 'CPAN::Nox' => '1.00',
+ 'Cwd' => 2.04,
+ 'Data::Dumper' => 2.102,
+ 'DB' => '1.0',
+ 'DB_File' => 1.75,
+ 'Devel::DProf' => '20000000.00_00',
+ 'Devel::Peek' => '1.00_01',
+ 'Devel::SelfStubber' => 1.01,
+ 'diagnostics' => '1.0', # really v1.0, but that causes breakage
+ 'DirHandle' => undef,
+ 'Dumpvalue' => undef,
+ 'DynaLoader' => 1.04,
+ 'English' => undef,
+ 'Env' => undef,
+ 'Exporter' => 5.562,
+ 'Exporter::Heavy' => undef,
+ 'ExtUtils::Command' => 1.01,
+ 'ExtUtils::Embed' => 1.2505,
+ 'ExtUtils::Install' => 1.28 ,
+ 'ExtUtils::Installed' => 0.02,
+ 'ExtUtils::Liblist' => 1.26 ,
+ 'ExtUtils::MakeMaker' => 5.45,
+ 'ExtUtils::Manifest' => 1.33 ,
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => 1.14 ,
+ 'ExtUtils::Mksymlists' => 1.17 ,
+ 'ExtUtils::MM_Cygwin' => undef,
+ 'ExtUtils::MM_OS2' => undef,
+ 'ExtUtils::MM_Unix' => 1.12603 ,
+ 'ExtUtils::MM_VMS' => undef,
+ 'ExtUtils::MM_Win32' => undef,
+ 'ExtUtils::Packlist' => 0.03,
+ 'ExtUtils::testlib' => 1.11 ,
+ 'ExtUtils::XSSymSet' => '1.0',
+ 'Fatal' => 1.02,
+ 'Fcntl' => 1.03,
+ 'fields' => 1.01,
+ 'File::Basename' => 2.6,
+ 'File::CheckTree' => undef,
+ 'File::Compare' => 1.1002,
+ 'File::Copy' => 2.03,
+ 'File::DosGlob' => undef,
+ 'File::Find' => undef,
+ 'File::Glob' => 0.991,
+ 'File::Path' => 1.0404,
+ 'File::Spec' => 0.82,
+ 'File::Spec::Epoc' => undef,
+ 'File::Spec::Functions' => 1.1,
+ 'File::Spec::Mac' => 1.2,
+ 'File::Spec::OS2' => 1.1,
+ 'File::Spec::Unix' => 1.2,
+ 'File::Spec::VMS' => 1.1,
+ 'File::Spec::Win32' => 1.2,
+ 'File::stat' => undef,
+ 'File::Temp' => 0.12,
+ 'FileCache' => undef,
+ 'FileHandle' => '2.00',
+ 'filetest' => undef,
+ 'FindBin' => 1.42,
+ 'GDBM_File' => 1.05,
+ 'Getopt::Long' => 2.25,
+ 'Getopt::Std' => 1.02,
+ 'I18N::Collate' => undef,
+ 'integer' => undef,
+ 'IO' => '1.20',
+ 'IO::Dir' => 1.03,
+ 'IO::File' => 1.08,
+ 'IO::Handle' => 1.21,
+ 'IO::Pipe' => 1.121,
+ 'IO::Poll' => 0.05,
+ 'IO::Seekable' => 1.08,
+ 'IO::Select' => 1.14,
+ 'IO::Socket' => 1.26,
+ 'IO::Socket::INET' => 1.25,
+ 'IO::Socket::UNIX' => '1.20',
+ 'IPC::Msg' => '1.00',
+ 'IPC::Open2' => 1.01,
+ 'IPC::Open3' => 1.0103,
+ 'IPC::Semaphore' => '1.00',
+ 'IPC::SysV' => 1.03,
+ 'JNI' => 0.1,
+ 'JPL::AutoLoader' => undef,
+ 'JPL::Class' => undef,
+ 'JPL::Compile' => undef,
+ 'less' => undef,
+ 'lib' => 0.5564,
+ 'locale' => undef,
+ 'Math::BigFloat' => 0.02,
+ 'Math::BigInt' => 0.01,
+ 'Math::Complex' => 1.31,
+ 'Math::Trig' => 1,
+ 'NDBM_File' => 1.04,
+ 'Net::hostent' => undef,
+ 'Net::netent' => undef,
+ 'Net::Ping' => 2.02,
+ 'Net::protoent' => undef,
+ 'Net::servent' => undef,
+ 'O' => undef,
+ 'ODBM_File' => 1.03,
+ 'Opcode' => 1.04,
+ 'open' => undef,
+ 'ops' => undef,
+ 'OS2::DLL' => undef,
+ 'OS2::ExtAttr' => 0.01,
+ 'OS2::PrfDB' => 0.02,
+ 'OS2::Process' => 0.2,
+ 'OS2::REXX' => '1.00',
+ 'overload' => undef,
+ 'Pod::Checker' => 1.2,
+ 'Pod::Find' => 0.21,
+ 'Pod::Functions' => undef,
+ 'Pod::Html' => 1.03,
+ 'Pod::LaTeX' => 0.53,
+ 'Pod::Man' => 1.15,
+ 'Pod::InputObjects' => 1.13,
+ 'Pod::Parser' => 1.13,
+ 'Pod::ParseUtils' => 0.22,
+ 'Pod::Plainer' => 0.01,
+ 'Pod::Select' => 1.13,
+ 'Pod::Text' => 2.08,
+ 'Pod::Text::Color' => 0.06,
+ 'Pod::Text::Overstrike' => 1.01,
+ 'Pod::Text::Termcap' => 1,
+ 'Pod::Usage' => 1.14,
+ 'POSIX' => 1.03,
+ 're' => 0.02,
+ 'Safe' => 2.06,
+ 'SDBM_File' => 1.03,
+ 'Search::Dict' => undef,
+ 'SelectSaver' => undef,
+ 'SelfLoader' => 1.0902,
+ 'Shell' => 0.3,
+ 'sigtrap' => 1.02,
+ 'Socket' => 1.72,
+ 'strict' => 1.01,
+ 'subs' => undef,
+ 'Symbol' => 1.02,
+ 'Sys::Hostname' => 1.1,
+ 'Sys::Syslog' => 0.01,
+ 'Term::ANSIColor' => 1.03,
+ 'Term::Cap' => undef,
+ 'Term::Complete' => undef,
+ 'Term::ReadLine' => undef,
+ 'Test' => 1.15,
+ 'Test::Harness' => 1.1604,
+ 'Text::Abbrev' => undef,
+ 'Text::ParseWords' => 3.2,
+ 'Text::Soundex' => '1.0',
+ 'Text::Tabs' => 98.112801,
+ 'Text::Wrap' => 2001.0131,
+ 'Thread' => '1.0',
+ 'Thread::Queue' => undef,
+ 'Thread::Semaphore' => undef,
+ 'Thread::Signal' => undef,
+ 'Thread::Specific' => undef,
+ 'Tie::Array' => 1.01,
+ 'Tie::Handle' => '4.0',
+ 'Tie::Hash' => undef,
+ 'Tie::RefHash' => 1.3,
+ 'Tie::Scalar' => undef,
+ 'Tie::SubstrHash' => undef,
+ 'Time::gmtime' => 1.01,
+ 'Time::Local' => undef,
+ 'Time::localtime' => 1.01,
+ 'Time::tm' => undef,
+ 'UNIVERSAL' => undef,
+ 'User::grent' => undef,
+ 'User::pwent' => undef,
+ 'utf8' => undef,
+ 'vars' => undef,
+ 'VMS::DCLsym' => 1.01,
+ 'VMS::Filespec' => undef,
+ 'VMS::Stdio' => 2.2,
+ 'vmsish' => undef,
+ 'warnings' => undef,
+ 'warnings::register' => undef,
+ 'XSLoader' => '0.01',
+ },
+
+ 5.006002 => {
+ 'AnyDBM_File' => undef, #lib/AnyDBM_File.pm
+ 'attributes' => '0.03', #lib/attributes.pm
+ 'attrs' => '1.0', #lib/attrs.pm
+ 'AutoLoader' => '5.58', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.0305', #lib/AutoSplit.pm
+ 'autouse' => '1.02', #lib/autouse.pm
+ 'B' => undef, #lib/B.pm
+ 'B::Asmdata' => undef, #lib/B/Asmdata.pm
+ 'B::Assembler' => '0.02', #lib/B/Assembler.pm
+ 'B::Bblock' => undef, #lib/B/Bblock.pm
+ 'B::Bytecode' => undef, #lib/B/Bytecode.pm
+ 'B::C' => undef, #lib/B/C.pm
+ 'B::CC' => undef, #lib/B/CC.pm
+ 'B::Concise' => '0.51', #lib/B/Concise.pm
+ 'B::Debug' => undef, #lib/B/Debug.pm
+ 'B::Deparse' => '0.6', #lib/B/Deparse.pm
+ 'B::Disassembler' => undef, #lib/B/Disassembler.pm
+ 'B::Lint' => undef, #lib/B/Lint.pm
+ 'B::Showlex' => undef, #lib/B/Showlex.pm
+ 'B::Stackobj' => undef, #lib/B/Stackobj.pm
+ 'B::Stash' => undef, #lib/B/Stash.pm
+ 'B::Terse' => undef, #lib/B/Terse.pm
+ 'B::Xref' => undef, #lib/B/Xref.pm
+ 'base' => '1.01', #lib/base.pm
+ 'Benchmark' => '1', #lib/Benchmark.pm
+ 'blib' => '1.00', #lib/blib.pm
+ 'ByteLoader' => '0.04', #lib/ByteLoader.pm
+ 'bytes' => undef, #lib/bytes.pm
+ 'Carp' => undef, #lib/Carp.pm
+ 'Carp::Heavy' => undef, #lib/Carp/Heavy.pm
+ 'CGI' => '2.752', #lib/CGI.pm
+ 'CGI::Apache' => undef, #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.20', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.18', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.02', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.05', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => undef, #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.1', #lib/CGI/Util.pm
+ 'charnames' => undef, #lib/charnames.pm
+ 'Class::Struct' => '0.59', #lib/Class/Struct.pm
+ 'Config' => undef, #lib/Config.pm
+ 'constant' => '1.02', #lib/constant.pm
+ 'CPAN' => '1.59_54', #lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.53 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.00', #lib/CPAN/Nox.pm
+ 'Cwd' => '2.04', #lib/Cwd.pm
+ 'Data::Dumper' => '2.121', #lib/Data/Dumper.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'DB_File' => '1.806', #lib/DB_File.pm
+ 'Devel::DProf' => '20000000.00_00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.00_01', #lib/Devel/Peek.pm
+ 'Devel::SelfStubber' => '1.01', #lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.0', #lib/diagnostics.pm
+ 'DirHandle' => undef, #lib/DirHandle.pm
+ 'Dumpvalue' => undef, #lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04', #lib/DynaLoader.pm
+ 'English' => undef, #lib/English.pm
+ 'Env' => undef, #lib/Env.pm
+ 'Errno' => '1.111', #lib/Errno.pm
+ 'Exporter' => '5.562', #lib/Exporter.pm
+ 'Exporter::Heavy' => undef, #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Embed' => '1.2505', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.17', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'ExtUtils::Manifest' => '1.42', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.07', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.06', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.03', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'Fatal' => '1.02', #lib/Fatal.pm
+ 'Fcntl' => '1.03', #lib/Fcntl.pm
+ 'fields' => '1.01', #lib/fields.pm
+ 'File::Basename' => '2.6', #lib/File/Basename.pm
+ 'File::CheckTree' => undef, #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1002', #lib/File/Compare.pm
+ 'File::Copy' => '2.03', #lib/File/Copy.pm
+ 'File::DosGlob' => undef, #lib/File/DosGlob.pm
+ 'File::Find' => undef, #lib/File/Find.pm
+ 'File::Glob' => '0.991', #lib/File/Glob.pm
+ 'File::Path' => '1.0404', #lib/File/Path.pm
+ 'File::Spec' => '0.86', #lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #lib/File/Spec/Win32.pm
+ 'File::stat' => undef, #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'FileCache' => undef, #lib/FileCache.pm
+ 'FileHandle' => '2.00', #lib/FileHandle.pm
+ 'filetest' => undef, #lib/filetest.pm
+ 'FindBin' => '1.42', #lib/FindBin.pm
+ 'GDBM_File' => '1.05', #ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.25', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.02', #lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #lib/I18N/Collate.pm
+ 'if' => '0.03', #lib/if.pm
+ 'integer' => undef, #lib/integer.pm
+ 'IO' => '1.20', #lib/IO.pm
+ 'IO::Dir' => '1.03', #lib/IO/Dir.pm
+ 'IO::File' => '1.08', #lib/IO/File.pm
+ 'IO::Handle' => '1.21', #lib/IO/Handle.pm
+ 'IO::Pipe' => '1.121', #lib/IO/Pipe.pm
+ 'IO::Poll' => '0.05', #lib/IO/Poll.pm
+ 'IO::Seekable' => '1.08', #lib/IO/Seekable.pm
+ 'IO::Select' => '1.14', #lib/IO/Select.pm
+ 'IO::Socket' => '1.26', #lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.25', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.20', #lib/IO/Socket/UNIX.pm
+ 'IPC::Msg' => '1.00', #lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0103', #lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.00', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.03', #lib/IPC/SysV.pm
+ 'JNI' => '0.1', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'less' => undef, #lib/less.pm
+ 'lib' => '0.5564', #lib/lib.pm
+ 'locale' => undef, #lib/locale.pm
+ 'Math::BigFloat' => '0.02', #lib/Math/BigFloat.pm
+ 'Math::BigInt' => '0.01', #lib/Math/BigInt.pm
+ 'Math::Complex' => '1.31', #lib/Math/Complex.pm
+ 'Math::Trig' => '1', #lib/Math/Trig.pm
+ 'NDBM_File' => '1.04', #ext/NDBM_File/NDBM_File.pm
+ 'Net::hostent' => undef, #lib/Net/hostent.pm
+ 'Net::netent' => undef, #lib/Net/netent.pm
+ 'Net::Ping' => '2.02', #lib/Net/Ping.pm
+ 'Net::protoent' => undef, #lib/Net/protoent.pm
+ 'Net::servent' => undef, #lib/Net/servent.pm
+ 'O' => undef, #lib/O.pm
+ 'ODBM_File' => '1.03', #ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.04', #lib/Opcode.pm
+ 'open' => undef, #lib/open.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'OS2::DLL' => undef, #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.01', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '0.2', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.00', #os2/OS2/REXX/REXX.pm
+ 'overload' => undef, #lib/overload.pm
+ 'Pod::Checker' => '1.2', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.21', #lib/Pod/Find.pm
+ 'Pod::Functions' => undef, #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.03', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.13', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.53', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.15', #lib/Pod/Man.pm
+ 'Pod::Parser' => '1.13', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.22', #lib/Pod/ParseUtils.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.08', #lib/Pod/Text.pm
+ 'Pod::Text::Color' => '0.06', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.01', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1', #lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.14', #lib/Pod/Usage.pm
+ 'POSIX' => '1.03', #lib/POSIX.pm
+ 're' => '0.02', #lib/re.pm
+ 'Safe' => '2.10', #lib/Safe.pm
+ 'SDBM_File' => '1.03', #lib/SDBM_File.pm
+ 'Search::Dict' => undef, #lib/Search/Dict.pm
+ 'SelectSaver' => undef, #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0902', #lib/SelfLoader.pm
+ 'Shell' => '0.3', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'Socket' => '1.72', #lib/Socket.pm
+ 'strict' => '1.01', #lib/strict.pm
+ 'subs' => undef, #lib/subs.pm
+ 'Symbol' => '1.02', #lib/Symbol.pm
+ 'Sys::Hostname' => '1.1', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.01', #lib/Sys/Syslog.pm
+ 'Term::ANSIColor' => '1.03', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => undef, #lib/Term/Cap.pm
+ 'Term::Complete' => undef, #lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #lib/Term/ReadLine.pm
+ 'Test' => '1.24', #lib/Test.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.30', #lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.01', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.01', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.15', #lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Text::Abbrev' => undef, #lib/Text/Abbrev.pm
+ 'Text::ParseWords' => '3.2', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.0', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.0131', #lib/Text/Wrap.pm
+ 'Thread' => '1.0', #ext/Thread/Thread.pm
+ 'Thread::Queue' => undef, #ext/Thread/Thread/Queue.pm
+ 'Thread::Semaphore' => undef, #ext/Thread/Thread/Semaphore.pm
+ 'Thread::Signal' => undef, #ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => undef, #ext/Thread/Thread/Specific.pm
+ 'Tie::Array' => '1.01', #lib/Tie/Array.pm
+ 'Tie::Handle' => '4.0', #lib/Tie/Handle.pm
+ 'Tie::Hash' => undef, #lib/Tie/Hash.pm
+ 'Tie::RefHash' => '1.3', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => undef, #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.01', #lib/Time/gmtime.pm
+ 'Time::Local' => undef, #lib/Time/Local.pm
+ 'Time::localtime' => '1.01', #lib/Time/localtime.pm
+ 'Time::tm' => undef, #lib/Time/tm.pm
+ 'Unicode' => '3.0.1', # lib/unicore/version
+ 'UNIVERSAL' => undef, #lib/UNIVERSAL.pm
+ 'User::grent' => undef, #lib/User/grent.pm
+ 'User::pwent' => undef, #lib/User/pwent.pm
+ 'utf8' => undef, #lib/utf8.pm
+ 'vars' => undef, #lib/vars.pm
+ 'VMS::DCLsym' => '1.01', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => undef, #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.2', #vms/ext/Stdio/Stdio.pm
+ 'vmsish' => undef, #vms/ext/vmsish.pm
+ 'warnings' => undef, #lib/warnings.pm
+ 'warnings::register' => undef, #lib/warnings/register.pm
+ 'XSLoader' => '0.01', #lib/XSLoader.pm
+ },
+
+ 5.007003 => {
+ 'AnyDBM_File' => '1.00',
+ 'Attribute::Handlers' => '0.76',
+ 'attributes' => '0.04_01',
+ 'attrs' => '1.01',
+ 'AutoLoader' => '5.59',
+ 'AutoSplit' => '1.0307',
+ 'autouse' => '1.03',
+ 'B::Asmdata' => '1.00',
+ 'B::Assembler' => '0.04',
+ 'B::Bblock' => '1.00',
+ 'B::Bytecode' => '1.00',
+ 'B::C' => '1.01',
+ 'B::CC' => '1.00',
+ 'B::Concise' => '0.52',
+ 'B::Debug' => '1.00',
+ 'B::Deparse' => '0.63',
+ 'B::Disassembler' => '1.01',
+ 'B::Lint' => '1.00',
+ 'B' => '1.00',
+ 'B::Showlex' => '1.00',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.00',
+ 'B::Xref' => '1.00',
+ 'base' => '1.02',
+ 'Benchmark' => '1.04',
+ 'blib' => '1.01',
+ 'ByteLoader' => '0.04',
+ 'bytes' => '1.00',
+ 'Carp' => '1.01',
+ 'Carp::Heavy' => undef,
+ 'CGI' => '2.80',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.22',
+ 'CGI::Cookie' => '1.20',
+ 'CGI::Fast' => '1.04',
+ 'CGI::Pretty' => '1.05_00',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.3',
+ 'charnames' => '1.01',
+ 'Class::ISA' => '0.32',
+ 'Class::Struct' => '0.61',
+ 'Config' => undef,
+ 'constant' => '1.04',
+ 'CPAN::FirstTime' => '1.54 ',
+ 'CPAN' => '1.59_56',
+ 'CPAN::Nox' => '1.00_01',
+ 'Cwd' => '2.06',
+ 'Data::Dumper' => '2.12',
+ 'DB' => '1.0',
+ 'DB_File' => '1.804',
+ 'Devel::DProf' => '20000000.00_01',
+ 'Devel::Peek' => '1.00_03',
+ 'Devel::PPPort' => '2.0002',
+ 'Devel::SelfStubber' => '1.03',
+ 'diagnostics' => '1.1',
+ 'Digest' => '1.00',
+ 'Digest::MD5' => '2.16',
+ 'DirHandle' => '1.00',
+ 'Dumpvalue' => '1.10',
+ 'DynaLoader' => 1.04,
+ 'Encode' => '0.40',
+ 'Encode::CN' => '0.02',
+ 'Encode::CN::HZ' => undef,
+ 'Encode::Encoding' => '0.02',
+ 'Encode::Internal' => '0.30',
+ 'Encode::iso10646_1' => '0.30',
+ 'Encode::JP' => '0.02',
+ 'Encode::JP::Constants' => '1.02',
+ 'Encode::JP::H2Z' => '0.77',
+ 'Encode::JP::ISO_2022_JP' => undef,
+ 'Encode::JP::JIS' => undef,
+ 'Encode::JP::Tr' => '0.77',
+ 'Encode::KR' => '0.02',
+ 'Encode::Tcl' => '1.01',
+ 'Encode::Tcl::Escape' => '1.01',
+ 'Encode::Tcl::Extended' => '1.01',
+ 'Encode::Tcl::HanZi' => '1.01',
+ 'Encode::Tcl::Table' => '1.01',
+ 'Encode::TW' => '0.02',
+ 'Encode::Unicode' => '0.30',
+ 'Encode::usc2_le' => '0.30',
+ 'Encode::utf8' => '0.30',
+ 'Encode::XS' => '0.40',
+ 'encoding' => '1.00',
+ 'English' => '1.00',
+ 'Env' => '1.00',
+ 'Exporter' => '5.566',
+ 'Exporter::Heavy' => '5.562',
+ 'ExtUtils::Command' => '1.02',
+ 'ExtUtils::Constant' => '0.11',
+ 'ExtUtils::Embed' => '1.250601',
+ 'ExtUtils::Install' => '1.29',
+ 'ExtUtils::Installed' => '0.04',
+ 'ExtUtils::Liblist' => '1.2701',
+ 'ExtUtils::MakeMaker' => '5.48_03',
+ 'ExtUtils::Manifest' => '1.35',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.1401',
+ 'ExtUtils::Mksymlists' => '1.18',
+ 'ExtUtils::MM_BeOS' => '1.00',
+ 'ExtUtils::MM_Cygwin' => '1.00',
+ 'ExtUtils::MM_OS2' => '1.00',
+ 'ExtUtils::MM_Unix' => '1.12607',
+ 'ExtUtils::MM_VMS' => '5.56',
+ 'ExtUtils::MM_Win32' => '1.00_02',
+ 'ExtUtils::Packlist' => '0.04',
+ 'ExtUtils::testlib' => '1.1201',
+ 'ExtUtils::XSSymSet' => '1.0',
+ 'Fatal' => '1.03',
+ 'Fcntl' => '1.04',
+ 'fields' => '1.02',
+ 'File::Basename' => '2.71',
+ 'File::CheckTree' => '4.1',
+ 'File::Compare' => '1.1003',
+ 'File::Copy' => '2.05',
+ 'File::DosGlob' => '1.00',
+ 'File::Find' => '1.04',
+ 'File::Glob' => '1.01',
+ 'File::Path' => '1.05',
+ 'File::Spec' => '0.83',
+ 'File::Spec::Cygwin' => '1.0',
+ 'File::Spec::Epoc' => '1.00',
+ 'File::Spec::Functions' => '1.2',
+ 'File::Spec::Mac' => '1.3',
+ 'File::Spec::OS2' => '1.1',
+ 'File::Spec::Unix' => '1.4',
+ 'File::Spec::VMS' => '1.2',
+ 'File::Spec::Win32' => '1.3',
+ 'File::stat' => '1.00',
+ 'File::Temp' => '0.13',
+ 'FileCache' => '1.00',
+ 'FileHandle' => '2.01',
+ 'filetest' => '1.00',
+ 'Filter::Simple' => '0.77',
+ 'Filter::Util::Call' => '1.06',
+ 'FindBin' => '1.43',
+ 'GDBM_File' => '1.06',
+ 'Getopt::Long' => '2.28',
+ 'Getopt::Std' => '1.03',
+ 'I18N::Collate' => '1.00',
+ 'I18N::Langinfo' => '0.01',
+ 'I18N::LangTags' => '0.27',
+ 'I18N::LangTags::List' => '0.25',
+ 'if' => '0.01',
+ 'integer' => '1.00',
+ 'IO' => '1.20',
+ 'IO::Dir' => '1.03_00',
+ 'IO::File' => '1.09',
+ 'IO::Handle' => '1.21_00',
+ 'IO::Pipe' => '1.122',
+ 'IO::Poll' => '0.06',
+ 'IO::Seekable' => '1.08_00',
+ 'IO::Select' => '1.15',
+ 'IO::Socket' => '1.27',
+ 'IO::Socket::INET' => '1.26',
+ 'IO::Socket::UNIX' => '1.20_00',
+ 'IPC::Msg' => '1.00_00',
+ 'IPC::Open2' => '1.01',
+ 'IPC::Open3' => '1.0104',
+ 'IPC::Semaphore' => '1.00_00',
+ 'IPC::SysV' => '1.03_00',
+ 'JNI' => '0.1',
+ 'JPL::AutoLoader' => undef,
+ 'JPL::Class' => undef,
+ 'JPL::Compile' => undef,
+ 'less' => '0.01',
+ 'lib' => '0.5564',
+ 'List::Util' => '1.06_00',
+ 'locale' => '1.00',
+ 'Locale::Constants' => '2.01',
+ 'Locale::Country' => '2.01',
+ 'Locale::Currency' => '2.01',
+ 'Locale::Language' => '2.01',
+ 'Locale::Maketext' => '1.03',
+ 'Locale::Script' => '2.01',
+ 'Math::BigFloat' => '1.30',
+ 'Math::BigInt' => '1.54',
+ 'Math::BigInt::Calc' => '0.25',
+ 'Math::Complex' => '1.34',
+ 'Math::Trig' => '1.01',
+ 'Memoize' => '0.66',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '0.66',
+ 'Memoize::ExpireFile' => '0.65',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'MIME::Base64' => '2.12',
+ 'MIME::QuotedPrint' => '2.03',
+ 'NDBM_File' => '1.04',
+ 'Net::Cmd' => '2.21',
+ 'Net::Config' => '1.10',
+ 'Net::Domain' => '2.17',
+ 'Net::FTP' => '2.64',
+ 'Net::FTP::A' => '1.15',
+ 'Net::FTP::dataconn' => '0.10',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::hostent' => '1.00',
+ 'Net::netent' => '1.00',
+ 'Net::Netrc' => '2.12',
+ 'Net::NNTP' => '2.21',
+ 'Net::Ping' => '2.12',
+ 'Net::POP3' => '2.23',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.00',
+ 'Net::SMTP' => '2.21',
+ 'Net::Time' => '2.09',
+ 'NEXT' => '0.50',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.03',
+ 'Opcode' => '1.05',
+ 'open' => '1.01',
+ 'ops' => '1.00',
+ 'OS2::DLL' => '1.00',
+ 'OS2::ExtAttr' => '0.01',
+ 'OS2::PrfDB' => '0.02',
+ 'OS2::Process' => '1.0',
+ 'OS2::REXX' => '1.01',
+ 'overload' => '1.00',
+ 'PerlIO' => '1.00',
+ 'PerlIO::Scalar' => '0.01',
+ 'PerlIO::Via' => '0.01',
+ 'Pod::Checker' => '1.3',
+ 'Pod::Find' => '0.22',
+ 'Pod::Functions' => '1.01',
+ 'Pod::Html' => '1.04',
+ 'Pod::LaTeX' => '0.54',
+ 'Pod::Man' => '1.32',
+ 'Pod::InputObjects' => '1.13',
+ 'Pod::ParseLink' => '1.05',
+ 'Pod::Parser' => '1.13',
+ 'Pod::ParseUtils' => '0.22',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.13',
+ 'Pod::Text' => '2.18',
+ 'Pod::Text::Color' => '1.03',
+ 'Pod::Text::Overstrike' => '1.08',
+ 'Pod::Text::Termcap' => '1.09',
+ 'Pod::Usage' => '1.14',
+ 'POSIX' => '1.05',
+ 're' => '0.03',
+ 'Safe' => '2.07',
+ 'Scalar::Util' => undef,
+ 'SDBM_File' => '1.03',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.00',
+ 'SelfLoader' => '1.0903',
+ 'Shell' => '0.4',
+ 'sigtrap' => '1.02',
+ 'Socket' => '1.75',
+ 'sort' => '1.00',
+ 'Storable' => '1.015',
+ 'strict' => '1.02',
+ 'subs' => '1.00',
+ 'Switch' => '2.06',
+ 'Symbol' => '1.04',
+ 'Sys::Hostname' => '1.1',
+ 'Sys::Syslog' => '0.02',
+ 'Term::ANSIColor' => '1.04',
+ 'Term::Cap' => '1.07',
+ 'Term::Complete' => '1.4',
+ 'Term::ReadLine' => '1.00',
+ 'Test' => '1.18',
+ 'Test::Builder' => '0.11',
+ 'Test::Harness' => '2.01',
+ 'Test::Harness::Assert' => '0.01',
+ 'Test::Harness::Iterator'=> '0.01',
+ 'Test::Harness::Straps' => '0.08',
+ 'Test::More' => '0.41',
+ 'Test::Simple' => '0.41',
+ 'Text::Abbrev' => '1.00',
+ 'Text::Balanced' => '1.89',
+ 'Text::ParseWords' => '3.21',
+ 'Text::Soundex' => '1.01',
+ 'Text::Tabs' => '98.112801',
+ 'Text::Wrap' => '2001.0929',
+ 'Thread' => '2.00',
+ 'Thread::Queue' => '1.00',
+ 'Thread::Semaphore' => '1.00',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'threads' => '0.05',
+ 'threads::shared' => '0.90',
+ 'Tie::Array' => '1.02',
+ 'Tie::File' => '0.17',
+ 'Tie::Hash' => '1.00',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Memoize' => '1.0',
+ 'Tie::RefHash' => '1.3_00',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::gmtime' => '1.02',
+ 'Time::HiRes' => '1.20_00',
+ 'Time::Local' => '1.04',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'Unicode::Collate' => '0.10',
+ 'Unicode::Normalize' => '0.14',
+ 'Unicode::UCD' => '0.2',
+ 'UNIVERSAL' => '1.00',
+ 'User::grent' => '1.00',
+ 'User::pwent' => '1.00',
+ 'utf8' => '1.00',
+ 'vars' => '1.01',
+ 'VMS::DCLsym' => '1.02',
+ 'VMS::Filespec' => '1.1',
+ 'VMS::Stdio' => '2.3',
+ 'vmsish' => '1.00',
+ 'warnings' => '1.00',
+ 'warnings::register' => '1.00',
+ 'XS::Typemap' => '0.01',
+ 'XSLoader' => '0.01',
+ },
+
+ 5.008 => {
+ 'AnyDBM_File' => '1.00', #./lib/AnyDBM_File.pm
+ 'Attribute::Handlers' => '0.77', #./lib/Attribute/Handlers.pm
+ 'attributes' => '0.05', #./lib/attributes.pm
+ 'attrs' => '1.01', #./ext/attrs/attrs.pm
+ 'AutoLoader' => '5.59', #./lib/AutoLoader.pm
+ 'AutoSplit' => '1.0307', #./lib/AutoSplit.pm
+ 'autouse' => '1.03', #./lib/autouse.pm
+ 'B' => '1.01', #./ext/B/B.pm
+ 'B::Asmdata' => '1.00', #./ext/B/B/Asmdata.pm
+ 'B::Assembler' => '0.04', #./ext/B/B/Assembler.pm
+ 'B::Bblock' => '1.00', #./ext/B/B/Bblock.pm
+ 'B::Bytecode' => '1.00', #./ext/B/B/Bytecode.pm
+ 'B::C' => '1.01', #./ext/B/B/C.pm
+ 'B::CC' => '1.00', #./ext/B/B/CC.pm
+ 'B::Concise' => '0.52', #./ext/B/B/Concise.pm
+ 'B::Debug' => '1.00', #./ext/B/B/Debug.pm
+ 'B::Deparse' => '0.63', #./ext/B/B/Deparse.pm
+ 'B::Disassembler' => '1.01', #./ext/B/B/Disassembler.pm
+ 'B::Lint' => '1.01', #./ext/B/B/Lint.pm
+ 'B::Showlex' => '1.00', #./ext/B/B/Showlex.pm
+ 'B::Stackobj' => '1.00', #./ext/B/B/Stackobj.pm
+ 'B::Stash' => '1.00', #./ext/B/B/Stash.pm
+ 'B::Terse' => '1.00', #./ext/B/B/Terse.pm
+ 'B::Xref' => '1.01', #./ext/B/B/Xref.pm
+ 'base' => '1.03', #./lib/base.pm
+ 'Benchmark' => '1.04', #./lib/Benchmark.pm
+ 'bigint' => '0.02', #./lib/bigint.pm
+ 'bignum' => '0.11', #./lib/bignum.pm
+ 'bigrat' => '0.04', #./lib/bigrat.pm
+ 'blib' => '1.02', #./lib/blib.pm
+ 'ByteLoader' => '0.04', #./ext/ByteLoader/ByteLoader.pm
+ 'bytes' => '1.00', #./lib/bytes.pm
+ 'Carp' => '1.01', #./lib/Carp.pm
+ 'Carp::Heavy' => 'undef', #./lib/Carp/Heavy.pm
+ 'CGI' => '2.81', #./lib/CGI.pm
+ 'CGI::Apache' => '1.00', #./lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.23', #./lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.20', #./lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.04', #./lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.05_00', #./lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #./lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #./lib/CGI/Switch.pm
+ 'CGI::Util' => '1.3', #./lib/CGI/Util.pm
+ 'charnames' => '1.01', #./lib/charnames.pm
+ 'Class::ISA' => '0.32', #./lib/Class/ISA.pm
+ 'Class::Struct' => '0.61', #./lib/Class/Struct.pm
+ 'constant' => '1.04', #./lib/constant.pm
+ 'Config' => undef,
+ 'CPAN' => '1.61', #./lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.56 ', #./lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.02', #./lib/CPAN/Nox.pm
+ 'Cwd' => '2.06', #./lib/Cwd.pm
+ 'Data::Dumper' => '2.12', #./ext/Data/Dumper/Dumper.pm
+ 'DB' => '1.0', #./lib/DB.pm
+ 'DB_File' => '1.804', #./ext/DB_File/DB_File.pm
+ 'Devel::DProf' => '20000000.00_01', #./ext/Devel/DProf/DProf.pm
+ 'Devel::Peek' => '1.00_03', #./ext/Devel/Peek/Peek.pm
+ 'Devel::PPPort' => '2.0002', #./ext/Devel/PPPort/PPPort.pm
+ 'Devel::SelfStubber' => '1.03', #./lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.1', #./lib/diagnostics.pm
+ 'Digest' => '1.00', #./lib/Digest.pm
+ 'Digest::MD5' => '2.20', #./ext/Digest/MD5/MD5.pm
+ 'DirHandle' => '1.00', #./lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #./lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04',
+ 'Encode' => '1.75', #./ext/Encode/Encode.pm
+ 'Encode::Alias' => '1.32', #./ext/Encode/lib/Encode/Alias.pm
+ 'Encode::Byte' => '1.22', #./ext/Encode/Byte/Byte.pm
+ 'Encode::CJKConstants' => '1.00', #./ext/Encode/lib/Encode/CJKConstants.pm
+ 'Encode::CN' => '1.24', #./ext/Encode/CN/CN.pm
+ 'Encode::CN::HZ' => '1.04', #./ext/Encode/lib/Encode/CN/HZ.pm
+ 'Encode::Config' => '1.06', #./ext/Encode/lib/Encode/Config.pm
+ 'Encode::EBCDIC' => '1.21', #./ext/Encode/EBCDIC/EBCDIC.pm
+ 'Encode::Encoder' => '0.05', #./ext/Encode/lib/Encode/Encoder.pm
+ 'Encode::Encoding' => '1.30', #./ext/Encode/lib/Encode/Encoding.pm
+ 'Encode::Guess' => '1.06', #./ext/Encode/lib/Encode/Guess.pm
+ 'Encode::JP::H2Z' => '1.02', #./ext/Encode/lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '1.08', #./ext/Encode/lib/Encode/JP/JIS7.pm
+ 'Encode::JP' => '1.25', #./ext/Encode/JP/JP.pm
+ 'Encode::KR' => '1.22', #./ext/Encode/KR/KR.pm
+ 'Encode::KR::2022_KR' => '1.05', #./ext/Encode/lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '1.05', #./ext/Encode/lib/Encode/MIME/Header.pm
+ 'Encode::Symbol' => '1.22', #./ext/Encode/Symbol/Symbol.pm
+ 'Encode::TW' => '1.26', #./ext/Encode/TW/TW.pm
+ 'Encode::Unicode' => '1.37', #./ext/Encode/Unicode/Unicode.pm
+ 'encoding' => '1.35', #./ext/Encode/encoding.pm
+ 'English' => '1.00', #./lib/English.pm
+ 'Env' => '1.00', #./lib/Env.pm
+ 'Exporter' => '5.566', #./lib/Exporter.pm
+ 'Exporter::Heavy' => '5.566', #./lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.04', #./lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.01', #./lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Constant' => '0.12', #./lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.29', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.06', #./lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.00', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.29', #./lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.03', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.38', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.15', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #./lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.04', #./lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.03', #./lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.04', #./lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.01', #./lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.03', #./lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.05', #./lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.03', #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.33', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.01', #./lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.65', #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.05', #./lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.02', #./lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #./lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #./lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #./lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #./vms/ext/XSSymSet.pm
+ 'Fatal' => '1.03', #./lib/Fatal.pm
+ 'Fcntl' => '1.04', #./ext/Fcntl/Fcntl.pm
+ 'fields' => '1.02', #./lib/fields.pm
+ 'File::Basename' => '2.71', #./lib/File/Basename.pm
+ 'File::CheckTree' => '4.2', #./lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #./lib/File/Compare.pm
+ 'File::Copy' => '2.05', #./lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #./lib/File/DosGlob.pm
+ 'File::Find' => '1.04', #./lib/File/Find.pm
+ 'File::Glob' => '1.01', #./ext/File/Glob/Glob.pm
+ 'File::Path' => '1.05', #./lib/File/Path.pm
+ 'File::Spec' => '0.83', #./lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.0', #./lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.00', #./lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.2', #./lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.3', #./lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.1', #./lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.4', #./lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.2', #./lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.3', #./lib/File/Spec/Win32.pm
+ 'File::stat' => '1.00', #./lib/File/stat.pm
+ 'File::Temp' => '0.13', #./lib/File/Temp.pm
+ 'FileCache' => '1.021', #./lib/FileCache.pm
+ 'FileHandle' => '2.01', #./lib/FileHandle.pm
+ 'filetest' => '1.00', #./lib/filetest.pm
+ 'Filter::Simple' => '0.78', #./lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.06', #./ext/Filter/Util/Call/Call.pm
+ 'FindBin' => '1.43', #./lib/FindBin.pm
+ 'GDBM_File' => '1.06', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.32', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.03', #./lib/Getopt/Std.pm
+ 'Hash::Util' => '0.04', #./lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #./lib/I18N/Collate.pm
+ 'I18N::Langinfo' => '0.01', #./ext/I18N/Langinfo/Langinfo.pm
+ 'I18N::LangTags' => '0.27', #./lib/I18N/LangTags.pm
+ 'I18N::LangTags::List' => '0.25', #./lib/I18N/LangTags/List.pm
+ 'if' => '0.01', #./lib/if.pm
+ 'integer' => '1.00', #./lib/integer.pm
+ 'IO' => '1.20', #./ext/IO/IO.pm
+ 'IO::Dir' => '1.03_00', #./ext/IO/lib/IO/Dir.pm
+ 'IO::File' => '1.09', #./ext/IO/lib/IO/File.pm
+ 'IO::Handle' => '1.21_00', #./ext/IO/lib/IO/Handle.pm
+ 'IO::Pipe' => '1.122', #./ext/IO/lib/IO/Pipe.pm
+ 'IO::Poll' => '0.06', #./ext/IO/lib/IO/Poll.pm
+ 'IO::Seekable' => '1.08_00', #./ext/IO/lib/IO/Seekable.pm
+ 'IO::Select' => '1.15', #./ext/IO/lib/IO/Select.pm
+ 'IO::Socket' => '1.27', #./ext/IO/lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.26', #./ext/IO/lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.20_00', #./ext/IO/lib/IO/Socket/UNIX.pm
+ 'IPC::Open2' => '1.01', #./lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0104', #./lib/IPC/Open3.pm
+ 'IPC::Msg' => '1.00_00', #./ext/IPC/SysV/Msg.pm
+ 'IPC::Semaphore' => '1.00_00', #./ext/IPC/SysV/Semaphore.pm
+ 'IPC::SysV' => '1.03_00', #./ext/IPC/SysV/SysV.pm
+ 'JNI' => '0.1', #./jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #./jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #./jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #./jpl/JPL/Compile.pm
+ 'less' => '0.01', #./lib/less.pm
+ 'lib' => '0.5564',
+ 'List::Util' => '1.07_00', #./ext/List/Util/lib/List/Util.pm
+ 'locale' => '1.00', #./lib/locale.pm
+ 'Locale::Constants' => '2.01', #./lib/Locale/Constants.pm
+ 'Locale::Country' => '2.04', #./lib/Locale/Country.pm
+ 'Locale::Currency' => '2.01', #./lib/Locale/Currency.pm
+ 'Locale::Language' => '2.01', #./lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.03', #./lib/Locale/Maketext.pm
+ 'Locale::Script' => '2.01', #./lib/Locale/Script.pm
+ 'Math::BigFloat' => '1.35', #./lib/Math/BigFloat.pm
+ 'Math::BigFloat::Trace' => '0.01', #./lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt' => '1.60', #./lib/Math/BigInt.pm
+ 'Math::BigInt::Calc' => '0.30', #./lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::Trace' => '0.01', #./lib/Math/BigInt/Trace.pm
+ 'Math::BigRat' => '0.07', #./lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #./lib/Math/Complex.pm
+ 'Math::Trig' => '1.01', #./lib/Math/Trig.pm
+ 'Memoize' => '1.01', #./lib/Memoize.pm
+ 'Memoize::AnyDBM_File' => '0.65', #./lib/Memoize/AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #./lib/Memoize/Expire.pm
+ 'Memoize::ExpireFile' => '1.01', #./lib/Memoize/ExpireFile.pm
+ 'Memoize::ExpireTest' => '0.65', #./lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #./lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #./lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #./lib/Memoize/Storable.pm
+ 'MIME::Base64' => '2.12', #./ext/MIME/Base64/Base64.pm
+ 'MIME::QuotedPrint' => '2.03', #./ext/MIME/Base64/QuotedPrint.pm
+ 'NDBM_File' => '1.04', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::Cmd' => '2.21', #./lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #./lib/Net/Config.pm
+ 'Net::Domain' => '2.17', #./lib/Net/Domain.pm
+ 'Net::FTP' => '2.65', #./lib/Net/FTP.pm
+ 'Net::FTP::A' => '1.15', #./lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #./lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #./lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #./lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #./lib/Net/FTP/L.pm
+ 'Net::hostent' => '1.00', #./lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #./lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #./lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.21', #./lib/Net/NNTP.pm
+ 'Net::Ping' => '2.19', #./lib/Net/Ping.pm
+ 'Net::POP3' => '2.23', #./lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #./lib/Net/protoent.pm
+ 'Net::servent' => '1.00', #./lib/Net/servent.pm
+ 'Net::SMTP' => '2.24', #./lib/Net/SMTP.pm
+ 'Net::Time' => '2.09', #./lib/Net/Time.pm
+ 'NEXT' => '0.50', #./lib/NEXT.pm
+ 'O' => '1.00', #./ext/B/O.pm
+ 'ODBM_File' => '1.03', #./ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.05', #./ext/Opcode/Opcode.pm
+ 'open' => '1.01', #./lib/open.pm
+ 'ops' => '1.00', #./ext/Opcode/ops.pm
+ 'OS2::DLL' => '1.00', #./os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.0', #./os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.01', #./os2/OS2/REXX/REXX.pm
+ 'overload' => '1.00', #./lib/overload.pm
+ 'PerlIO' => '1.01', #./lib/PerlIO.pm
+ 'PerlIO::encoding' => '0.06', #./ext/PerlIO/encoding/encoding.pm
+ 'PerlIO::scalar' => '0.01', #./ext/PerlIO/scalar/scalar.pm
+ 'PerlIO::via' => '0.01', #./ext/PerlIO/via/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.04', #./lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.3', #./lib/Pod/Checker.pm
+ 'Pod::Find' => '0.22', #./lib/Pod/Find.pm
+ 'Pod::Functions' => '1.01', #./lib/Pod/Functions.pm
+ 'Pod::Html' => '1.04', #./lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.13', #./lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.54', #./lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.33', #./lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.05', #./lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.13', #./lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.22', #./lib/Pod/ParseUtils.pm
+ 'Pod::Plainer' => '0.01', #./lib/Pod/Plainer.pm
+ 'Pod::Select' => '1.13', #./lib/Pod/Select.pm
+ 'Pod::Text' => '2.19', #./lib/Pod/Text.pm
+ 'Pod::Text::Color' => '1.03', #./lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.08', #./lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.09', #./lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.14', #./lib/Pod/Usage.pm
+ 'POSIX' => '1.05', #./ext/POSIX/POSIX.pm
+ 're' => '0.03', #./ext/re/re.pm
+ 'Safe' => '2.07', #./ext/Opcode/Safe.pm
+ 'Scalar::Util' => 'undef', #./ext/List/Util/lib/Scalar/Util.pm
+ 'SDBM_File' => '1.03', #./ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => '1.02', #./lib/Search/Dict.pm
+ 'SelectSaver' => '1.00', #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.0903', #./lib/SelfLoader.pm
+ 'Shell' => '0.4', #./lib/Shell.pm
+ 'sigtrap' => '1.02', #./lib/sigtrap.pm
+ 'Socket' => '1.75', #./ext/Socket/Socket.pm
+ 'sort' => '1.01', #./lib/sort.pm
+ 'Storable' => '2.04', #./ext/Storable/Storable.pm
+ 'strict' => '1.02', #./lib/strict.pm
+ 'subs' => '1.00', #./lib/subs.pm
+ 'Switch' => '2.09', #./lib/Switch.pm
+ 'Symbol' => '1.04', #./lib/Symbol.pm
+ 'Sys::Hostname' => '1.1', #./ext/Sys/Hostname/Hostname.pm
+ 'Sys::Syslog' => '0.03', #./ext/Sys/Syslog/Syslog.pm
+ 'Term::ANSIColor' => '1.04', #./lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.07', #./lib/Term/Cap.pm
+ 'Term::Complete' => '1.4', #./lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.00', #./lib/Term/ReadLine.pm
+ 'Test' => '1.20', #./lib/Test.pm
+ 'Test::Builder' => '0.15', #./lib/Test/Builder.pm
+ 'Test::Harness' => '2.26', #./lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.01', #./lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.01', #./lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.14', #./lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.45', #./lib/Test/More.pm
+ 'Test::Simple' => '0.45', #./lib/Test/Simple.pm
+ 'Text::Abbrev' => '1.00', #./lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.89', #./lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.21', #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.0929', #./lib/Text/Wrap.pm
+ 'Thread' => '2.00', #./lib/Thread.pm
+ 'Thread::Queue' => '2.00', #./lib/Thread/Queue.pm
+ 'Thread::Semaphore' => '2.00', #./lib/Thread/Semaphore.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'threads' => '0.99', #./ext/threads/threads.pm
+ 'threads::shared' => '0.90', #./ext/threads/shared/shared.pm
+ 'Tie::Array' => '1.02', #./lib/Tie/Array.pm
+ 'Tie::File' => '0.93', #./lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #./lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.00', #./lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #./lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.30', #./lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #./lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #./lib/Time/gmtime.pm
+ 'Time::HiRes' => '1.20_00', #./ext/Time/HiRes/HiRes.pm
+ 'Time::Local' => '1.04', #./lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #./lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #./lib/Time/tm.pm
+ 'Unicode' => '3.2.0', # lib/unicore/version
+ 'Unicode::Collate' => '0.12', #./lib/Unicode/Collate.pm
+ 'Unicode::Normalize' => '0.17', #./ext/Unicode/Normalize/Normalize.pm
+ 'Unicode::UCD' => '0.2', #./lib/Unicode/UCD.pm
+ 'UNIVERSAL' => '1.00', #./lib/UNIVERSAL.pm
+ 'User::grent' => '1.00', #./lib/User/grent.pm
+ 'User::pwent' => '1.00', #./lib/User/pwent.pm
+ 'utf8' => '1.00', #./lib/utf8.pm
+ 'vars' => '1.01', #./lib/vars.pm
+ 'VMS::DCLsym' => '1.02', #./vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.1', #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #./vms/ext/Stdio/Stdio.pm
+ 'vmsish' => '1.00', #./lib/vmsish.pm
+ 'warnings' => '1.00', #./lib/warnings.pm
+ 'warnings::register' => '1.00', #./lib/warnings/register.pm
+ 'XS::APItest' => '0.01', #./ext/XS/APItest/APItest.pm
+ 'XS::Typemap' => '0.01', #./ext/XS/Typemap/Typemap.pm
+ 'XSLoader' => '0.01',
+ },
+
+ 5.008001 => {
+ 'AnyDBM_File' => '1.00', #./lib/AnyDBM_File.pm
+ 'Attribute::Handlers' => '0.78', #./lib/Attribute/Handlers.pm
+ 'attributes' => '0.06', #./lib/attributes.pm
+ 'attrs' => '1.01', #./lib/attrs.pm
+ 'AutoLoader' => '5.60', #./lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #./lib/AutoSplit.pm
+ 'autouse' => '1.03', #./lib/autouse.pm
+ 'B' => '1.02', #./lib/B.pm
+ 'B::Asmdata' => '1.01', #./lib/B/Asmdata.pm
+ 'B::Assembler' => '0.06', #./lib/B/Assembler.pm
+ 'B::Bblock' => '1.02', #./lib/B/Bblock.pm
+ 'B::Bytecode' => '1.01', #./lib/B/Bytecode.pm
+ 'B::C' => '1.02', #./lib/B/C.pm
+ 'B::CC' => '1.00', #./lib/B/CC.pm
+ 'B::Concise' => '0.56', #./lib/B/Concise.pm
+ 'B::Debug' => '1.01', #./lib/B/Debug.pm
+ 'B::Deparse' => '0.64', #./lib/B/Deparse.pm
+ 'B::Disassembler' => '1.03', #./lib/B/Disassembler.pm
+ 'B::Lint' => '1.02', #./lib/B/Lint.pm
+ 'B::Showlex' => '1.00', #./lib/B/Showlex.pm
+ 'B::Stackobj' => '1.00', #./lib/B/Stackobj.pm
+ 'B::Stash' => '1.00', #./lib/B/Stash.pm
+ 'B::Terse' => '1.02', #./lib/B/Terse.pm
+ 'B::Xref' => '1.01', #./lib/B/Xref.pm
+ 'base' => '2.03', #./lib/base.pm
+ 'Benchmark' => '1.051', #./lib/Benchmark.pm
+ 'bigint' => '0.04', #./lib/bigint.pm
+ 'bignum' => '0.14', #./lib/bignum.pm
+ 'bigrat' => '0.06', #./lib/bigrat.pm
+ 'blib' => '1.02', #./lib/blib.pm
+ 'ByteLoader' => '0.05', #./lib/ByteLoader.pm
+ 'bytes' => '1.01', #./lib/bytes.pm
+ 'Carp' => '1.01', #./lib/Carp.pm
+ 'Carp::Heavy' => '1.01', #./lib/Carp/Heavy.pm
+ 'CGI' => '3.00', #./lib/CGI.pm
+ 'CGI::Apache' => '1.00', #./lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.26', #./lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #./lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.041', #./lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.07_00', #./lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #./lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #./lib/CGI/Switch.pm
+ 'CGI::Util' => '1.31', #./lib/CGI/Util.pm
+ 'charnames' => '1.02', #./lib/charnames.pm
+ 'Class::ISA' => '0.32', #./lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #./lib/Class/Struct.pm
+ 'Config' => undef, #./lib/Config.pm
+ 'constant' => '1.04', #./lib/constant.pm
+ 'CPAN' => '1.76_01', #./lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.60 ', #./lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #./lib/CPAN/Nox.pm
+ 'Cwd' => '2.08', #./lib/Cwd.pm
+ 'Data::Dumper' => '2.121', #./lib/Data/Dumper.pm
+ 'DB' => '1.0', #./lib/DB.pm
+ 'DB_File' => '1.806', #./lib/DB_File.pm
+ 'Devel::DProf' => '20030813.00', #./lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.01', #./lib/Devel/Peek.pm
+ 'Devel::PPPort' => '2.007', #./lib/Devel/PPPort.pm
+ 'Devel::SelfStubber' => '1.03', #./lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.11', #./lib/diagnostics.pm
+ 'Digest' => '1.02', #./lib/Digest.pm
+ 'Digest::MD5' => '2.27', #./lib/Digest/MD5.pm
+ 'DirHandle' => '1.00', #./lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #./lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04', #./lib/DynaLoader.pm
+ 'Encode' => '1.9801', #./lib/Encode.pm
+ 'Encode::Alias' => '1.38', #./lib/Encode/Alias.pm
+ 'Encode::Byte' => '1.23', #./lib/Encode/Byte.pm
+ 'Encode::CJKConstants' => '1.02', #./lib/Encode/CJKConstants.pm
+ 'Encode::CN' => '1.24', #./lib/Encode/CN.pm
+ 'Encode::CN::HZ' => '1.05', #./lib/Encode/CN/HZ.pm
+ 'Encode::Config' => '1.07', #./lib/Encode/Config.pm
+ 'Encode::EBCDIC' => '1.21', #./lib/Encode/EBCDIC.pm
+ 'Encode::Encoder' => '0.07', #./lib/Encode/Encoder.pm
+ 'Encode::Encoding' => '1.33', #./lib/Encode/Encoding.pm
+ 'Encode::Guess' => '1.09', #./lib/Encode/Guess.pm
+ 'Encode::JP' => '1.25', #./lib/Encode/JP.pm
+ 'Encode::JP::H2Z' => '1.02', #./lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '1.12', #./lib/Encode/JP/JIS7.pm
+ 'Encode::KR' => '1.23', #./lib/Encode/KR.pm
+ 'Encode::KR::2022_KR' => '1.06', #./lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '1.09', #./lib/Encode/MIME/Header.pm
+ 'Encode::Symbol' => '1.22', #./lib/Encode/Symbol.pm
+ 'Encode::TW' => '1.26', #./lib/Encode/TW.pm
+ 'Encode::Unicode' => '1.40', #./lib/Encode/Unicode.pm
+ 'Encode::Unicode::UTF7' => '0.02', #./lib/Encode/Unicode/UTF7.pm
+ 'encoding' => '1.47', #./lib/encoding.pm
+ 'English' => '1.01', #./lib/English.pm
+ 'Env' => '1.00', #./lib/Env.pm
+ 'Errno' => '1.09_00', #./lib/Errno.pm
+ 'Exporter' => '5.567', #./lib/Exporter.pm
+ 'Exporter::Heavy' => '5.567', #./lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #./lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.03', #./lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Constant' => '0.14', #./lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.32', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.08', #./lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.01', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3', #./lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.17', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #./lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #./lib/ExtUtils/MakeMaker/vmsish.pm
+ 'ExtUtils::Manifest' => '1.42', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #./lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #./lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.07', #./lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #./lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #./lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #./lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #./lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.06', #./lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.04', #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #./lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #./lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.03', #./lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #./lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #./lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #./lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #./vms/ext/XSSymSet.pm
+ 'Fatal' => '1.03', #./lib/Fatal.pm
+ 'Fcntl' => '1.05', #./lib/Fcntl.pm
+ 'fields' => '2.03', #./lib/fields.pm
+ 'File::Basename' => '2.72', #./lib/File/Basename.pm
+ 'File::CheckTree' => '4.2', #./lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #./lib/File/Compare.pm
+ 'File::Copy' => '2.06', #./lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #./lib/File/DosGlob.pm
+ 'File::Find' => '1.05', #./lib/File/Find.pm
+ 'File::Glob' => '1.02', #./lib/File/Glob.pm
+ 'File::Path' => '1.06', #./lib/File/Path.pm
+ 'File::Spec' => '0.86', #./lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.1', #./lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #./lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #./lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #./lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #./lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #./lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #./lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #./lib/File/Spec/Win32.pm
+ 'File::stat' => '1.00', #./lib/File/stat.pm
+ 'File::Temp' => '0.14', #./lib/File/Temp.pm
+ 'FileCache' => '1.03', #./lib/FileCache.pm
+ 'FileHandle' => '2.01', #./lib/FileHandle.pm
+ 'filetest' => '1.01', #./lib/filetest.pm
+ 'Filter::Simple' => '0.78', #./lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #./lib/Filter/Util/Call.pm
+ 'FindBin' => '1.43', #./lib/FindBin.pm
+ 'GDBM_File' => '1.07', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.34', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.04', #./lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #./lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #./lib/I18N/Collate.pm
+ 'I18N::Langinfo' => '0.02', #./lib/I18N/Langinfo.pm
+ 'I18N::LangTags' => '0.28', #./lib/I18N/LangTags.pm
+ 'I18N::LangTags::List' => '0.26', #./lib/I18N/LangTags/List.pm
+ 'if' => '0.03', #./lib/if.pm
+ 'integer' => '1.00', #./lib/integer.pm
+ 'IO' => '1.21', #./lib/IO.pm
+ 'IO::Dir' => '1.04', #./lib/IO/Dir.pm
+ 'IO::File' => '1.10', #./lib/IO/File.pm
+ 'IO::Handle' => '1.23', #./lib/IO/Handle.pm
+ 'IO::Pipe' => '1.122', #./lib/IO/Pipe.pm
+ 'IO::Poll' => '0.06', #./lib/IO/Poll.pm
+ 'IO::Seekable' => '1.09', #./lib/IO/Seekable.pm
+ 'IO::Select' => '1.16', #./lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #./lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.27', #./lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #./lib/IO/Socket/UNIX.pm
+ 'IPC::Msg' => '1.02', #./lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #./lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0105', #./lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.02', #./lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #./lib/IPC/SysV.pm
+ 'JNI' => '0.2', #./jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #./jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #./jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #./jpl/JPL/Compile.pm
+ 'less' => '0.01', #./lib/less.pm
+ 'lib' => '0.5565', #./lib/lib.pm
+ 'List::Util' => '1.13', #./lib/List/Util.pm
+ 'locale' => '1.00', #./lib/locale.pm
+ 'Locale::Constants' => '2.01', #./lib/Locale/Constants.pm
+ 'Locale::Country' => '2.61', #./lib/Locale/Country.pm
+ 'Locale::Currency' => '2.21', #./lib/Locale/Currency.pm
+ 'Locale::Language' => '2.21', #./lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.06', #./lib/Locale/Maketext.pm
+ 'Locale::Maketext::Guts'=> undef, #./lib/Locale/Maketext/Guts.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #./lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Script' => '2.21', #./lib/Locale/Script.pm
+ 'Math::BigFloat' => '1.40', #./lib/Math/BigFloat.pm
+ 'Math::BigFloat::Trace' => '0.01', #./lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt' => '1.66', #./lib/Math/BigInt.pm
+ 'Math::BigInt::Calc' => '0.36', #./lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::Scalar' => '0.11', #./lib/Math/BigInt/Scalar.pm
+ 'Math::BigInt::Trace' => '0.01', #./lib/Math/BigInt/Trace.pm
+ 'Math::BigRat' => '0.10', #./lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #./lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #./lib/Math/Trig.pm
+ 'Memoize' => '1.01', #./lib/Memoize.pm
+ 'Memoize::AnyDBM_File' => '0.65', #./lib/Memoize/AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #./lib/Memoize/Expire.pm
+ 'Memoize::ExpireFile' => '1.01', #./lib/Memoize/ExpireFile.pm
+ 'Memoize::ExpireTest' => '0.65', #./lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #./lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #./lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #./lib/Memoize/Storable.pm
+ 'MIME::Base64' => '2.20', #./lib/MIME/Base64.pm
+ 'MIME::QuotedPrint' => '2.20', #./lib/MIME/QuotedPrint.pm
+ 'NDBM_File' => '1.05', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::Cmd' => '2.24', #./lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #./lib/Net/Config.pm
+ 'Net::Domain' => '2.18', #./lib/Net/Domain.pm
+ 'Net::FTP' => '2.71', #./lib/Net/FTP.pm
+ 'Net::FTP::A' => '1.16', #./lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #./lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #./lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #./lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #./lib/Net/FTP/L.pm
+ 'Net::hostent' => '1.01', #./lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #./lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #./lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.22', #./lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #./lib/Net/Ping.pm
+ 'Net::POP3' => '2.24', #./lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #./lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #./lib/Net/servent.pm
+ 'Net::SMTP' => '2.26', #./lib/Net/SMTP.pm
+ 'Net::Time' => '2.09', #./lib/Net/Time.pm
+ 'NEXT' => '0.60', #./lib/NEXT.pm
+ 'O' => '1.00', #./lib/O.pm
+ 'ODBM_File' => '1.04', #./ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.05', #./lib/Opcode.pm
+ 'open' => '1.02', #./lib/open.pm
+ 'ops' => '1.00', #./lib/ops.pm
+ 'OS2::ExtAttr' => '0.02', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #./os2/OS2/Process/Process.pm
+ 'OS2::DLL' => '1.01', #./os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::REXX' => '1.02', #./os2/OS2/REXX/REXX.pm
+ 'overload' => '1.01', #./lib/overload.pm
+ 'PerlIO' => '1.02', #./lib/PerlIO.pm
+ 'PerlIO::encoding' => '0.07', #./lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #./lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #./lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.05', #./lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.41', #./lib/Pod/Checker.pm
+ 'Pod::Find' => '0.24', #./lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #./lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0501', #./lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #./lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.55', #./lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #./lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #./lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.13', #./lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.3', #./lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.10', #./lib/Pod/Perldoc.pm
+ 'Pod::Perldoc::BaseTo' => undef, #./lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #./lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #./lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #./lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #./lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #./lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #./lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #./lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #./lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #./lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Plainer' => '0.01', #./lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.01', #./lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #./lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #./lib/Pod/Text.pm
+ 'Pod::Text::Color' => '1.04', #./lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #./lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #./lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.16', #./lib/Pod/Usage.pm
+ 'POSIX' => '1.06', #./lib/POSIX.pm
+ 're' => '0.04', #./lib/re.pm
+ 'Safe' => '2.10', #./lib/Safe.pm
+ 'Scalar::Util' => '1.13', #./lib/Scalar/Util.pm
+ 'SDBM_File' => '1.04', #./lib/SDBM_File.pm
+ 'Search::Dict' => '1.02', #./lib/Search/Dict.pm
+ 'SelectSaver' => '1.00', #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #./lib/SelfLoader.pm
+ 'Shell' => '0.5', #./lib/Shell.pm
+ 'sigtrap' => '1.02', #./lib/sigtrap.pm
+ 'Socket' => '1.76', #./lib/Socket.pm
+ 'sort' => '1.02', #./lib/sort.pm
+ 'Storable' => '2.08', #./lib/Storable.pm
+ 'strict' => '1.03', #./lib/strict.pm
+ 'subs' => '1.00', #./lib/subs.pm
+ 'Switch' => '2.10', #./lib/Switch.pm
+ 'Symbol' => '1.05', #./lib/Symbol.pm
+ 'Sys::Hostname' => '1.11', #./lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.04', #./lib/Sys/Syslog.pm
+ 'Term::ANSIColor' => '1.07', #./lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.08', #./lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #./lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #./lib/Term/ReadLine.pm
+ 'Test' => '1.24', #./lib/Test.pm
+ 'Test::Builder' => '0.17', #./lib/Test/Builder.pm
+ 'Test::Harness' => '2.30', #./lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.01', #./lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.01', #./lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.15', #./lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.47', #./lib/Test/More.pm
+ 'Test::Simple' => '0.47', #./lib/Test/Simple.pm
+ 'Text::Abbrev' => '1.01', #./lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #./lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.21', #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09291', #./lib/Text/Wrap.pm
+ 'Thread' => '2.00', #./lib/Thread.pm
+ 'Thread::Queue' => '2.00', #./lib/Thread/Queue.pm
+ 'Thread::Semaphore' => '2.01', #./lib/Thread/Semaphore.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'threads' => '1.00', #./lib/threads.pm
+ 'threads::shared' => '0.91', #./lib/threads/shared.pm
+ 'Tie::Array' => '1.03', #./lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #./lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #./lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.00', #./lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #./lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #./lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #./lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #./lib/Time/gmtime.pm
+ 'Time::HiRes' => '1.51', #./lib/Time/HiRes.pm
+ 'Time::Local' => '1.07', #./lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #./lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #./lib/Time/tm.pm
+ 'Unicode' => '4.0.0', # lib/unicore/version
+ 'Unicode::Collate' => '0.28', #./lib/Unicode/Collate.pm
+ 'Unicode::Normalize' => '0.23', #./lib/Unicode/Normalize.pm
+ 'Unicode::UCD' => '0.21', #./lib/Unicode/UCD.pm
+ 'UNIVERSAL' => '1.01', #./lib/UNIVERSAL.pm
+ 'User::grent' => '1.00', #./lib/User/grent.pm
+ 'User::pwent' => '1.00', #./lib/User/pwent.pm
+ 'utf8' => '1.02', #./lib/utf8.pm
+ 'vars' => '1.01', #./lib/vars.pm
+ 'VMS::DCLsym' => '1.02', #./vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #./vms/ext/Stdio/Stdio.pm
+ 'vmsish' => '1.01', #./lib/vmsish.pm
+ 'warnings' => '1.03', #./lib/warnings.pm
+ 'warnings::register' => '1.00', #./lib/warnings/register.pm
+ 'XS::APItest' => '0.02', #./lib/XS/APItest.pm
+ 'XS::Typemap' => '0.01', #./lib/XS/Typemap.pm
+ 'XSLoader' => '0.02', #./lib/XSLoader.pm
+ },
+
+ 5.008002 => {
+ 'AnyDBM_File' => '1.00', #AnyDBM_File.pm
+ 'Attribute::Handlers' => 0.78, #Attribute\Handlers.pm
+ 'attributes' => 0.06, #attributes.pm
+ 'attrs' => 1.01, #attrs.pm
+ 'AutoLoader' => '5.60', #AutoLoader.pm
+ 'AutoSplit' => 1.04, #AutoSplit.pm
+ 'autouse' => 1.03, #autouse.pm
+ 'B' => 1.02, #B.pm
+ 'B::Asmdata' => 1.01, #B\Asmdata.pm
+ 'B::Assembler' => 0.06, #B\Assembler.pm
+ 'B::Bblock' => 1.02, #B\Bblock.pm
+ 'B::Bytecode' => 1.01, #B\Bytecode.pm
+ 'B::C' => 1.02, #B\C.pm
+ 'B::CC' => '1.00', #B\CC.pm
+ 'B::Concise' => 0.56, #B\Concise.pm
+ 'B::Debug' => 1.01, #B\Debug.pm
+ 'B::Deparse' => 0.64, #B\Deparse.pm
+ 'B::Disassembler' => 1.03, #B\Disassembler.pm
+ 'B::Lint' => 1.02, #B\Lint.pm
+ 'B::Showlex' => '1.00', #B\Showlex.pm
+ 'B::Stackobj' => '1.00', #B\Stackobj.pm
+ 'B::Stash' => '1.00', #B\Stash.pm
+ 'B::Terse' => 1.02, #B\Terse.pm
+ 'B::Xref' => 1.01, #B\Xref.pm
+ 'base' => 2.03, #base.pm
+ 'Benchmark' => 1.051, #Benchmark.pm
+ 'bigint' => 0.04, #bigint.pm
+ 'bignum' => 0.14, #bignum.pm
+ 'bigrat' => 0.06, #bigrat.pm
+ 'blib' => 1.02, #blib.pm
+ 'ByteLoader' => 0.05, #ByteLoader.pm
+ 'bytes' => 1.01, #bytes.pm
+ 'Carp' => 1.01, #Carp.pm
+ 'Carp::Heavy' => 1.01, #Carp\Heavy.pm
+ 'CGI' => '3.00', #CGI.pm
+ 'CGI::Apache' => '1.00', #CGI\Apache.pm
+ 'CGI::Carp' => 1.26, #CGI\Carp.pm
+ 'CGI::Cookie' => 1.24, #CGI\Cookie.pm
+ 'CGI::Fast' => 1.041, #CGI\Fast.pm
+ 'CGI::Pretty' => '1.07_00', #CGI\Pretty.pm
+ 'CGI::Push' => 1.04, #CGI\Push.pm
+ 'CGI::Switch' => '1.00', #CGI\Switch.pm
+ 'CGI::Util' => 1.31, #CGI\Util.pm
+ 'charnames' => 1.02, #charnames.pm
+ 'Class::ISA' => 0.32, #Class\ISA.pm
+ 'Class::Struct' => 0.63, #Class\Struct.pm
+ 'Config' => undef, #Config.pm
+ 'constant' => 1.04, #constant.pm
+ 'CPAN' => '1.76_01', #CPAN.pm
+ 'CPAN::FirstTime' => '1.60 ', #CPAN\FirstTime.pm
+ 'CPAN::Nox' => 1.03, #CPAN\Nox.pm
+ 'Cwd' => 2.08, #Cwd.pm
+ 'Data::Dumper' => 2.121, #Data\Dumper.pm
+ 'DB' => '1.0', #DB.pm
+ 'Devel::DProf' => '20030813.00', #Devel\DProf.pm
+ 'Devel::Peek' => 1.01, #Devel\Peek.pm
+ 'Devel::PPPort' => 2.009, #Devel\PPPort.pm
+ 'Devel::SelfStubber' => 1.03, #Devel\SelfStubber.pm
+ 'diagnostics' => 1.11, #diagnostics.pm
+ 'Digest' => 1.02, #Digest.pm
+ 'Digest::MD5' => '2.30', #Digest\MD5.pm
+ 'DirHandle' => '1.00', #DirHandle.pm
+ 'Dumpvalue' => 1.11, #Dumpvalue.pm
+ 'DynaLoader' => 1.04, #DynaLoader.pm
+ 'Encode' => 1.9801, #Encode.pm
+ 'Encode::Alias' => 1.38, #Encode\Alias.pm
+ 'Encode::Byte' => 1.23, #Encode\Byte.pm
+ 'Encode::CJKConstants' => 1.02, #Encode\CJKConstants.pm
+ 'Encode::CN' => 1.24, #Encode\CN.pm
+ 'Encode::CN::HZ' => 1.05, #Encode\CN\HZ.pm
+ 'Encode::Config' => 1.07, #Encode\Config.pm
+ 'Encode::EBCDIC' => 1.21, #Encode\EBCDIC.pm
+ 'Encode::Encoder' => 0.07, #Encode\Encoder.pm
+ 'Encode::Encoding' => 1.33, #Encode\Encoding.pm
+ 'Encode::Guess' => 1.09, #Encode\Guess.pm
+ 'Encode::JP' => 1.25, #Encode\JP.pm
+ 'Encode::JP::H2Z' => 1.02, #Encode\JP\H2Z.pm
+ 'Encode::JP::JIS7' => 1.12, #Encode\JP\JIS7.pm
+ 'Encode::KR' => 1.23, #Encode\KR.pm
+ 'Encode::KR::2022_KR' => 1.06, #Encode\KR\2022_KR.pm
+ 'Encode::MIME::Header' => 1.09, #Encode\MIME\Header.pm
+ 'Encode::Symbol' => 1.22, #Encode\Symbol.pm
+ 'Encode::TW' => 1.26, #Encode\TW.pm
+ 'Encode::Unicode' => '1.40', #Encode\Unicode.pm
+ 'Encode::Unicode::UTF7' => 0.02, #Encode\Unicode\UTF7.pm
+ 'encoding' => 1.47, #encoding.pm
+ 'English' => 1.01, #English.pm
+ 'Env' => '1.00', #Env.pm
+ 'Errno' => '1.09_00', #Errno.pm
+ 'Exporter' => 5.567, #Exporter.pm
+ 'Exporter::Heavy' => 5.567, #Exporter\Heavy.pm
+ 'ExtUtils::Command' => 1.05, #ExtUtils\Command.pm
+ 'ExtUtils::Command::MM' => 0.03, #ExtUtils\Command\MM.pm
+ 'ExtUtils::Constant' => 0.14, #ExtUtils\Constant.pm
+ 'ExtUtils::Embed' => 1.250601, #ExtUtils\Embed.pm
+ 'ExtUtils::Install' => 1.32, #ExtUtils\Install.pm
+ 'ExtUtils::Installed' => 0.08, #ExtUtils\Installed.pm
+ 'ExtUtils::Liblist' => 1.01, #ExtUtils\Liblist.pm
+ 'ExtUtils::Liblist::Kid' => 1.3, #ExtUtils\Liblist\Kid.pm
+ 'ExtUtils::MakeMaker' => 6.17, #ExtUtils\MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes' => 0.01, #ExtUtils\MakeMaker\bytes.pm
+ 'ExtUtils::MakeMaker::vmsish' => 0.01, #ExtUtils\MakeMaker\vmsish.pm
+ 'ExtUtils::Manifest' => 1.42, #ExtUtils\Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #ExtUtils\Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => 1.15, #ExtUtils\Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => 1.19, #ExtUtils\Mksymlists.pm
+ 'ExtUtils::MM' => 0.04, #ExtUtils\MM.pm
+ 'ExtUtils::MM_Any' => 0.07, #ExtUtils\MM_Any.pm
+ 'ExtUtils::MM_BeOS' => 1.04, #ExtUtils\MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => 1.06, #ExtUtils\MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => 0.02, #ExtUtils\MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => 1.07, #ExtUtils\MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => 2.06, #ExtUtils\MM_NW5.pm
+ 'ExtUtils::MM_OS2' => 1.04, #ExtUtils\MM_OS2.pm
+ 'ExtUtils::MM_Unix' => 1.42, #ExtUtils\MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => 0.02, #ExtUtils\MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #ExtUtils\MM_VMS.pm
+ 'ExtUtils::MM_Win32' => 1.09, #ExtUtils\MM_Win32.pm
+ 'ExtUtils::MM_Win95' => 0.03, #ExtUtils\MM_Win95.pm
+ 'ExtUtils::MY' => 0.01, #ExtUtils\MY.pm
+ 'ExtUtils::Packlist' => 0.04, #ExtUtils\Packlist.pm
+ 'ExtUtils::testlib' => 1.15, #ExtUtils\testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms\ext\XSSymSet.pm
+ 'Fatal' => 1.03, #Fatal.pm
+ 'Fcntl' => 1.05, #Fcntl.pm
+ 'fields' => 2.03, #fields.pm
+ 'File::Basename' => 2.72, #File\Basename.pm
+ 'File::CheckTree' => 4.2, #File\CheckTree.pm
+ 'File::Compare' => 1.1003, #File\Compare.pm
+ 'File::Copy' => 2.06, #File\Copy.pm
+ 'File::DosGlob' => '1.00', #File\DosGlob.pm
+ 'File::Find' => 1.05, #File\Find.pm
+ 'File::Glob' => 1.02, #File\Glob.pm
+ 'File::Path' => 1.06, #File\Path.pm
+ 'File::Spec' => 0.86, #File\Spec.pm
+ 'File::Spec::Cygwin' => 1.1, #File\Spec\Cygwin.pm
+ 'File::Spec::Epoc' => 1.1, #File\Spec\Epoc.pm
+ 'File::Spec::Functions' => 1.3, #File\Spec\Functions.pm
+ 'File::Spec::Mac' => 1.4, #File\Spec\Mac.pm
+ 'File::Spec::OS2' => 1.2, #File\Spec\OS2.pm
+ 'File::Spec::Unix' => 1.5, #File\Spec\Unix.pm
+ 'File::Spec::VMS' => 1.4, #File\Spec\VMS.pm
+ 'File::Spec::Win32' => 1.4, #File\Spec\Win32.pm
+ 'File::stat' => '1.00', #File\stat.pm
+ 'File::Temp' => 0.14, #File\Temp.pm
+ 'FileCache' => 1.03, #FileCache.pm
+ 'FileHandle' => 2.01, #FileHandle.pm
+ 'filetest' => 1.01, #filetest.pm
+ 'Filter::Simple' => 0.78, #Filter\Simple.pm
+ 'Filter::Util::Call' => 1.0601, #Filter\Util\Call.pm
+ 'FindBin' => 1.43, #FindBin.pm
+ 'GDBM_File' => '1.07', #ext\GDBM_File\GDBM_File.pm
+ 'Getopt::Long' => 2.34, #Getopt\Long.pm
+ 'Getopt::Std' => 1.04, #Getopt\Std.pm
+ 'Hash::Util' => 0.05, #Hash\Util.pm
+ 'I18N::Collate' => '1.00', #I18N\Collate.pm
+ 'I18N::Langinfo' => '0.02', #I18N\Langinfo.pm
+ 'I18N::LangTags' => 0.29, #I18N\LangTags.pm
+ 'I18N::LangTags::List' => 0.29, #I18N\LangTags\List.pm
+ 'if' => 0.03, #if.pm
+ 'integer' => '1.00', #integer.pm
+ 'IO' => 1.21, #IO.pm
+ 'IO::Dir' => 1.04, #IO\Dir.pm
+ 'IO::File' => '1.10', #IO\File.pm
+ 'IO::Handle' => 1.23, #IO\Handle.pm
+ 'IO::Pipe' => 1.122, #IO\Pipe.pm
+ 'IO::Poll' => 0.06, #IO\Poll.pm
+ 'IO::Seekable' => 1.09, #IO\Seekable.pm
+ 'IO::Select' => 1.16, #IO\Select.pm
+ 'IO::Socket' => 1.28, #IO\Socket.pm
+ 'IO::Socket::INET' => 1.27, #IO\Socket\INET.pm
+ 'IO::Socket::UNIX' => 1.21, #IO\Socket\UNIX.pm
+ 'IPC::Msg' => 1.02, #IPC\Msg.pm
+ 'IPC::Open2' => 1.01, #IPC\Open2.pm
+ 'IPC::Open3' => 1.0105, #IPC\Open3.pm
+ 'IPC::Semaphore' => 1.02, #IPC\Semaphore.pm
+ 'IPC::SysV' => 1.04, #IPC\SysV.pm
+ 'JNI' => '0.2', #jpl\JNI\JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl\JPL\AutoLoader.pm
+ 'JPL::Class' => undef, #jpl\JPL\Class.pm
+ 'JPL::Compile' => undef, #jpl\JPL\Compile.pm
+ 'less' => 0.01, #less.pm
+ 'lib' => 0.5565, #lib.pm
+ 'List::Util' => 1.13, #List\Util.pm
+ 'locale' => '1.00', #locale.pm
+ 'Locale::Constants' => 2.01, #Locale\Constants.pm
+ 'Locale::Country' => 2.61, #Locale\Country.pm
+ 'Locale::Currency' => 2.21, #Locale\Currency.pm
+ 'Locale::Language' => 2.21, #Locale\Language.pm
+ 'Locale::Maketext' => 1.06, #Locale\Maketext.pm
+ 'Locale::Maketext::Guts' => undef, #Locale\Maketext\Guts.pm
+ 'Locale::Maketext::GutsLoader' => undef, #Locale\Maketext\GutsLoader.pm
+ 'Locale::Script' => 2.21, #Locale\Script.pm
+ 'Math::BigFloat' => '1.40', #Math\BigFloat.pm
+ 'Math::BigFloat::Trace' => 0.01, #Math\BigFloat\Trace.pm
+ 'Math::BigInt' => 1.66, #Math\BigInt.pm
+ 'Math::BigInt::Calc' => 0.36, #Math\BigInt\Calc.pm
+ 'Math::BigInt::Scalar' => 0.11, #Math\BigInt\Scalar.pm
+ 'Math::BigInt::Trace' => 0.01, #Math\BigInt\Trace.pm
+ 'Math::BigRat' => '0.10', #Math\BigRat.pm
+ 'Math::Complex' => 1.34, #Math\Complex.pm
+ 'Math::Trig' => 1.02, #Math\Trig.pm
+ 'Memoize' => 1.01, #Memoize.pm
+ 'Memoize::AnyDBM_File' => 0.65, #Memoize\AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #Memoize\Expire.pm
+ 'Memoize::ExpireFile' => 1.01, #Memoize\ExpireFile.pm
+ 'Memoize::ExpireTest' => 0.65, #Memoize\ExpireTest.pm
+ 'Memoize::NDBM_File' => 0.65, #Memoize\NDBM_File.pm
+ 'Memoize::SDBM_File' => 0.65, #Memoize\SDBM_File.pm
+ 'Memoize::Storable' => 0.65, #Memoize\Storable.pm
+ 'MIME::Base64' => 2.21, #MIME\Base64.pm
+ 'MIME::QuotedPrint' => 2.21, #MIME\QuotedPrint.pm
+ 'NDBM_File' => '1.05', #ext\NDBM_File\NDBM_File.pm
+ 'Net::Cmd' => 2.24, #Net\Cmd.pm
+ 'Net::Config' => '1.10', #Net\Config.pm
+ 'Net::Domain' => 2.19, #Net\Domain.pm
+ 'Net::FTP' => 2.72, #Net\FTP.pm
+ 'Net::FTP::A' => 1.16, #Net\FTP\A.pm
+ 'Net::FTP::dataconn' => 0.11, #Net\FTP\dataconn.pm
+ 'Net::FTP::E' => 0.01, #Net\FTP\E.pm
+ 'Net::FTP::I' => 1.12, #Net\FTP\I.pm
+ 'Net::FTP::L' => 0.01, #Net\FTP\L.pm
+ 'Net::hostent' => 1.01, #Net\hostent.pm
+ 'Net::netent' => '1.00', #Net\netent.pm
+ 'Net::Netrc' => 2.12, #Net\Netrc.pm
+ 'Net::NNTP' => 2.22, #Net\NNTP.pm
+ 'Net::Ping' => 2.31, #Net\Ping.pm
+ 'Net::POP3' => 2.24, #Net\POP3.pm
+ 'Net::protoent' => '1.00', #Net\protoent.pm
+ 'Net::servent' => 1.01, #Net\servent.pm
+ 'Net::SMTP' => 2.26, #Net\SMTP.pm
+ 'Net::Time' => 2.09, #Net\Time.pm
+ 'NEXT' => '0.60', #NEXT.pm
+ 'O' => '1.00', #O.pm
+ 'ODBM_File' => '1.04', #ext\ODBM_File\ODBM_File.pm
+ 'Opcode' => 1.05, #Opcode.pm
+ 'open' => 1.02, #open.pm
+ 'ops' => '1.00', #ops.pm
+ 'OS2::DLL' => '1.01', #os2\OS2\REXX\DLL\DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2\OS2\ExtAttr\ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2\OS2\PrfDB\PrfDB.pm
+ 'OS2::Process' => '1.01', #os2\OS2\Process\Process.pm
+ 'OS2::REXX' => '1.02', #os2\OS2\REXX\REXX.pm
+ 'overload' => 1.01, #overload.pm
+ 'PerlIO' => 1.02, #PerlIO.pm
+ 'PerlIO::encoding' => 0.07, #PerlIO\encoding.pm
+ 'PerlIO::scalar' => 0.02, #PerlIO\scalar.pm
+ 'PerlIO::via' => 0.02, #PerlIO\via.pm
+ 'PerlIO::via::QuotedPrint' => 0.05, #PerlIO\via\QuotedPrint.pm
+ 'Pod::Checker' => 1.41, #Pod\Checker.pm
+ 'Pod::Find' => 0.24, #Pod\Find.pm
+ 'Pod::Functions' => 1.02, #Pod\Functions.pm
+ 'Pod::Html' => 1.0501, #Pod\Html.pm
+ 'Pod::InputObjects' => 1.14, #Pod\InputObjects.pm
+ 'Pod::LaTeX' => 0.55, #Pod\LaTeX.pm
+ 'Pod::Man' => 1.37, #Pod\Man.pm
+ 'Pod::ParseLink' => 1.06, #Pod\ParseLink.pm
+ 'Pod::Parser' => 1.13, #Pod\Parser.pm
+ 'Pod::ParseUtils' => 0.3, #Pod\ParseUtils.pm
+ 'Pod::Perldoc' => 3.11, #Pod\Perldoc.pm
+ 'Pod::Perldoc::BaseTo' => undef, #Pod\Perldoc\BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO' => undef, #Pod\Perldoc\GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker' => undef, #Pod\Perldoc\ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #Pod\Perldoc\ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #Pod\Perldoc\ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #Pod\Perldoc\ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #Pod\Perldoc\ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #Pod\Perldoc\ToText.pm
+ 'Pod::Perldoc::ToTk' => undef, #Pod\Perldoc\ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #Pod\Perldoc\ToXml.pm
+ 'Pod::Plainer' => 0.01, #Pod\Plainer.pm
+ 'Pod::PlainText' => 2.01, #Pod\PlainText.pm
+ 'Pod::Select' => 1.13, #Pod\Select.pm
+ 'Pod::Text' => 2.21, #Pod\Text.pm
+ 'Pod::Text::Color' => 1.04, #Pod\Text\Color.pm
+ 'Pod::Text::Overstrike' => 1.1, #Pod\Text\Overstrike.pm
+ 'Pod::Text::Termcap' => 1.11, #Pod\Text\Termcap.pm
+ 'Pod::Usage' => 1.16, #Pod\Usage.pm
+ 'POSIX' => 1.06, #POSIX.pm
+ 're' => 0.04, #re.pm
+ 'Safe' => '2.10', #Safe.pm
+ 'Scalar::Util' => 1.13, #Scalar\Util.pm
+ 'SDBM_File' => 1.04, #SDBM_File.pm
+ 'Search::Dict' => 1.02, #Search\Dict.pm
+ 'SelectSaver' => '1.00', #SelectSaver.pm
+ 'SelfLoader' => 1.0904, #SelfLoader.pm
+ 'Shell' => 0.5, #Shell.pm
+ 'sigtrap' => 1.02, #sigtrap.pm
+ 'Socket' => 1.76, #Socket.pm
+ 'sort' => 1.02, #sort.pm
+ 'Storable' => 2.08, #Storable.pm
+ 'strict' => 1.03, #strict.pm
+ 'subs' => '1.00', #subs.pm
+ 'Switch' => '2.10', #Switch.pm
+ 'Symbol' => 1.05, #Symbol.pm
+ 'Sys::Hostname' => 1.11, #Sys\Hostname.pm
+ 'Sys::Syslog' => '0.04', #ext\Sys\Syslog\Syslog.pm
+ 'Term::ANSIColor' => 1.07, #Term\ANSIColor.pm
+ 'Term::Cap' => 1.08, #Term\Cap.pm
+ 'Term::Complete' => 1.401, #Term\Complete.pm
+ 'Term::ReadLine' => 1.01, #Term\ReadLine.pm
+ 'Test' => 1.24, #Test.pm
+ 'Test::Builder' => 0.17, #Test\Builder.pm
+ 'Test::Harness' => '2.30', #Test\Harness.pm
+ 'Test::Harness::Assert' => 0.01, #Test\Harness\Assert.pm
+ 'Test::Harness::Iterator' => 0.01, #Test\Harness\Iterator.pm
+ 'Test::Harness::Straps' => 0.15, #Test\Harness\Straps.pm
+ 'Test::More' => 0.47, #Test\More.pm
+ 'Test::Simple' => 0.47, #Test\Simple.pm
+ 'Text::Abbrev' => 1.01, #Text\Abbrev.pm
+ 'Text::Balanced' => 1.95, #Text\Balanced.pm
+ 'Text::ParseWords' => 3.21, #Text\ParseWords.pm
+ 'Text::Soundex' => 1.01, #Text\Soundex.pm
+ 'Text::Tabs' => 98.112801, #Text\Tabs.pm
+ 'Text::Wrap' => 2001.09291, #Text\Wrap.pm
+ 'Thread' => '2.00', #Thread.pm
+ 'Thread::Queue' => '2.00', #Thread\Queue.pm
+ 'Thread::Semaphore' => 2.01, #Thread\Semaphore.pm
+ 'Thread::Signal' => '1.00', #Thread\Signal.pm
+ 'Thread::Specific' => '1.00', #Thread\Specific.pm
+ 'threads' => '1.00', #threads.pm
+ 'threads::shared' => 0.91, #threads\shared.pm
+ 'Tie::Array' => 1.03, #Tie\Array.pm
+ 'Tie::File' => 0.97, #Tie\File.pm
+ 'Tie::Handle' => 4.1, #Tie\Handle.pm
+ 'Tie::Hash' => '1.00', #Tie\Hash.pm
+ 'Tie::Memoize' => '1.0', #Tie\Memoize.pm
+ 'Tie::RefHash' => 1.31, #Tie\RefHash.pm
+ 'Tie::Scalar' => '1.00', #Tie\Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #Tie\SubstrHash.pm
+ 'Time::gmtime' => 1.02, #Time\gmtime.pm
+ 'Time::HiRes' => 1.52, #Time\HiRes.pm
+ 'Time::Local' => 1.07, #Time\Local.pm
+ 'Time::localtime' => 1.02, #Time\localtime.pm
+ 'Time::tm' => '1.00', #Time\tm.pm
+ 'Unicode' => '4.0.0', # lib/unicore/version
+ 'Unicode::Collate' => '0.30', #Unicode\Collate.pm
+ 'Unicode::Normalize' => 0.25, #Unicode\Normalize.pm
+ 'Unicode::UCD' => 0.21, #Unicode\UCD.pm
+ 'UNIVERSAL' => 1.01, #UNIVERSAL.pm
+ 'User::grent' => '1.00', #User\grent.pm
+ 'User::pwent' => '1.00', #User\pwent.pm
+ 'utf8' => 1.02, #utf8.pm
+ 'vars' => 1.01, #vars.pm
+ 'VMS::DCLsym' => '1.02', #vms\ext\DCLsym\DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms\ext\Filespec.pm
+ 'VMS::Stdio' => '2.3', #vms\ext\Stdio\Stdio.pm
+ 'vmsish' => 1.01, #vmsish.pm
+ 'warnings' => 1.03, #warnings.pm
+ 'warnings::register' => '1.00', #warnings\register.pm
+ 'XS::APItest' => 0.02, #XS\APItest.pm
+ 'XS::Typemap' => 0.01, #XS\Typemap.pm
+ 'XSLoader' => 0.02, #XSLoader.pm
+ },
+
+ 5.008003 => {
+ 'AnyDBM_File' => '1.00', #lib/AnyDBM_File.pm
+ 'Attribute::Handlers' => '0.78', #lib/Attribute/Handlers.pm
+ 'attributes' => '0.06', #lib/attributes.pm
+ 'attrs' => '1.01', #lib/attrs.pm
+ 'AutoLoader' => '5.60', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #lib/AutoSplit.pm
+ 'autouse' => '1.03', #lib/autouse.pm
+ 'B' => '1.02', #lib/B.pm
+ 'base' => '2.04', #lib/base.pm
+ 'B::Asmdata' => '1.01', #lib/B/Asmdata.pm
+ 'B::Assembler' => '0.06', #lib/B/Assembler.pm
+ 'B::Bblock' => '1.02', #lib/B/Bblock.pm
+ 'B::Bytecode' => '1.01', #lib/B/Bytecode.pm
+ 'B::C' => '1.02', #lib/B/C.pm
+ 'B::CC' => '1.00', #lib/B/CC.pm
+ 'B::Concise' => '0.56', #lib/B/Concise.pm
+ 'B::Debug' => '1.01', #lib/B/Debug.pm
+ 'B::Deparse' => '0.64', #lib/B/Deparse.pm
+ 'B::Disassembler' => '1.03', #lib/B/Disassembler.pm
+ 'Benchmark' => '1.052', #lib/Benchmark.pm
+ 'bigint' => '0.04', #lib/bigint.pm
+ 'bignum' => '0.14', #lib/bignum.pm
+ 'bigrat' => '0.06', #lib/bigrat.pm
+ 'blib' => '1.02', #lib/blib.pm
+ 'B::Lint' => '1.02', #lib/B/Lint.pm
+ 'B::Showlex' => '1.00', #lib/B/Showlex.pm
+ 'B::Stackobj' => '1.00', #lib/B/Stackobj.pm
+ 'B::Stash' => '1.00', #lib/B/Stash.pm
+ 'B::Terse' => '1.02', #lib/B/Terse.pm
+ 'B::Xref' => '1.01', #lib/B/Xref.pm
+ 'ByteLoader' => '0.05', #lib/ByteLoader.pm
+ 'bytes' => '1.01', #lib/bytes.pm
+ 'Carp' => '1.01', #lib/Carp.pm
+ 'Carp::Heavy' => '1.01', #lib/Carp/Heavy.pm
+ 'CGI' => '3.01', #lib/CGI.pm
+ 'CGI::Apache' => '1.00', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.27', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.05', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.08', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.4', #lib/CGI/Util.pm
+ 'charnames' => '1.02', #lib/charnames.pm
+ 'Class::ISA' => '0.32', #lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #lib/Class/Struct.pm
+ 'Config' => undef, #lib/Config.pm
+ 'constant' => '1.04', #lib/constant.pm
+ 'CPAN' => '1.76_01', #lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.60 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #lib/CPAN/Nox.pm
+ 'Cwd' => '2.12', #lib/Cwd.pm
+ 'Data::Dumper' => '2.121', #lib/Data/Dumper.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'DB_File' => '1.808', #lib/DB_File.pm
+ 'Devel::DProf' => '20030813.00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.01', #lib/Devel/Peek.pm
+ 'Devel::PPPort' => '2.011', #lib/Devel/PPPort.pm
+ 'Devel::SelfStubber' => '1.03', #lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.12', #lib/diagnostics.pm
+ 'Digest' => '1.05', #lib/Digest.pm
+ 'Digest::base' => '1.00', #lib/Digest/base.pm
+ 'Digest::MD5' => '2.33', #lib/Digest/MD5.pm
+ 'DirHandle' => '1.00', #lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04', #lib/DynaLoader.pm
+ 'Encode' => '1.99', #lib/Encode.pm
+ 'Encode::Alias' => '1.38', #lib/Encode/Alias.pm
+ 'Encode::Byte' => '1.23', #lib/Encode/Byte.pm
+ 'Encode::CJKConstants' => '1.02', #lib/Encode/CJKConstants.pm
+ 'Encode::CN' => '1.24', #lib/Encode/CN.pm
+ 'Encode::CN::HZ' => '1.05', #lib/Encode/CN/HZ.pm
+ 'Encode::Config' => '1.07', #lib/Encode/Config.pm
+ 'Encode::EBCDIC' => '1.21', #lib/Encode/EBCDIC.pm
+ 'Encode::Encoder' => '0.07', #lib/Encode/Encoder.pm
+ 'Encode::Encoding' => '1.33', #lib/Encode/Encoding.pm
+ 'Encode::Guess' => '1.09', #lib/Encode/Guess.pm
+ 'Encode::JP' => '1.25', #lib/Encode/JP.pm
+ 'Encode::JP::H2Z' => '1.02', #lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '1.12', #lib/Encode/JP/JIS7.pm
+ 'Encode::KR' => '1.23', #lib/Encode/KR.pm
+ 'Encode::KR::2022_KR' => '1.06', #lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '1.09', #lib/Encode/MIME/Header.pm
+ 'Encode::Symbol' => '1.22', #lib/Encode/Symbol.pm
+ 'Encode::TW' => '1.26', #lib/Encode/TW.pm
+ 'Encode::Unicode' => '1.40', #lib/Encode/Unicode.pm
+ 'Encode::Unicode::UTF7' => '0.02', #lib/Encode/Unicode/UTF7.pm
+ 'encoding' => '1.48', #lib/encoding.pm
+ 'English' => '1.01', #lib/English.pm
+ 'Env' => '1.00', #lib/Env.pm
+ 'Errno' => '1.09_00', #lib/Errno.pm
+ 'Exporter' => '5.57', #lib/Exporter.pm
+ 'Exporter::Heavy' => '5.567', #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Constant' => '0.14', #lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.17', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'ExtUtils::Manifest' => '1.42', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.07', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.06', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.03', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'Fatal' => '1.03', #lib/Fatal.pm
+ 'Fcntl' => '1.05', #lib/Fcntl.pm
+ 'fields' => '2.03', #lib/fields.pm
+ 'File::Basename' => '2.72', #lib/File/Basename.pm
+ 'FileCache' => '1.03', #lib/FileCache.pm
+ 'File::CheckTree' => '4.3', #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #lib/File/Compare.pm
+ 'File::Copy' => '2.07', #lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #lib/File/DosGlob.pm
+ 'File::Find' => '1.06', #lib/File/Find.pm
+ 'File::Glob' => '1.02', #lib/File/Glob.pm
+ 'FileHandle' => '2.01', #lib/FileHandle.pm
+ 'File::Path' => '1.06', #lib/File/Path.pm
+ 'File::Spec' => '0.87', #lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #lib/File/Spec/Win32.pm
+ 'File::stat' => '1.00', #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'filetest' => '1.01', #lib/filetest.pm
+ 'Filter::Simple' => '0.78', #lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #lib/Filter/Util/Call.pm
+ 'FindBin' => '1.44', #lib/FindBin.pm
+ 'GDBM_File' => '1.07', #lib/GDBM_File.pm
+ 'Getopt::Long' => '2.34', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.05', #lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #lib/I18N/Collate.pm
+ 'I18N::Langinfo' => '0.02', #lib/I18N/Langinfo.pm
+ 'I18N::LangTags' => '0.29', #lib/I18N/LangTags.pm
+ 'I18N::LangTags::List' => '0.29', #lib/I18N/LangTags/List.pm
+ 'if' => '0.03', #lib/if.pm
+ 'integer' => '1.00', #lib/integer.pm
+ 'IO' => '1.21', #lib/IO.pm
+ 'IO::Dir' => '1.04', #lib/IO/Dir.pm
+ 'IO::File' => '1.10', #lib/IO/File.pm
+ 'IO::Handle' => '1.23', #lib/IO/Handle.pm
+ 'IO::Pipe' => '1.122', #lib/IO/Pipe.pm
+ 'IO::Poll' => '0.06', #lib/IO/Poll.pm
+ 'IO::Seekable' => '1.09', #lib/IO/Seekable.pm
+ 'IO::Select' => '1.16', #lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.27', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #lib/IO/Socket/UNIX.pm
+ 'IPC::Msg' => '1.02', #lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0105', #lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.02', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #lib/IPC/SysV.pm
+ 'JNI' => '0.2', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'less' => '0.01', #lib/less.pm
+ 'lib' => '0.5565', #lib/lib.pm
+ 'List::Util' => '1.13', #lib/List/Util.pm
+ 'locale' => '1.00', #lib/locale.pm
+ 'Locale::Constants' => '2.01', #lib/Locale/Constants.pm
+ 'Locale::Country' => '2.61', #lib/Locale/Country.pm
+ 'Locale::Currency' => '2.21', #lib/Locale/Currency.pm
+ 'Locale::Language' => '2.21', #lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.06', #lib/Locale/Maketext.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Maketext::Guts'=> undef, #lib/Locale/Maketext/Guts.pm
+ 'Locale::Script' => '2.21', #lib/Locale/Script.pm
+ 'Math::BigFloat' => '1.42', #lib/Math/BigFloat.pm
+ 'Math::BigFloat::Trace' => '0.01', #lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt' => '1.68', #lib/Math/BigInt.pm
+ 'Math::BigInt::Calc' => '0.38', #lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::CalcEmu' => '0.02', #lib/Math/BigInt/CalcEmu.pm
+ 'Math::BigInt::Trace' => '0.01', #lib/Math/BigInt/Trace.pm
+ 'Math::BigRat' => '0.10', #lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #lib/Math/Trig.pm
+ 'Memoize' => '1.01', #lib/Memoize.pm
+ 'Memoize::AnyDBM_File' => '0.65', #lib/Memoize/AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #lib/Memoize/Expire.pm
+ 'Memoize::ExpireFile' => '1.01', #lib/Memoize/ExpireFile.pm
+ 'Memoize::ExpireTest' => '0.65', #lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #lib/Memoize/Storable.pm
+ 'MIME::Base64' => '2.21', #lib/MIME/Base64.pm
+ 'MIME::QuotedPrint' => '2.21', #lib/MIME/QuotedPrint.pm
+ 'NDBM_File' => '1.05', #lib/NDBM_File.pm
+ 'Net::Cmd' => '2.24', #lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #lib/Net/Config.pm
+ 'Net::Domain' => '2.19', #lib/Net/Domain.pm
+ 'Net::FTP' => '2.72', #lib/Net/FTP.pm
+ 'Net::FTP::A' => '1.16', #lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #lib/Net/FTP/L.pm
+ 'Net::hostent' => '1.01', #lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.22', #lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #lib/Net/Ping.pm
+ 'Net::POP3' => '2.24', #lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #lib/Net/servent.pm
+ 'Net::SMTP' => '2.26', #lib/Net/SMTP.pm
+ 'Net::Time' => '2.09', #lib/Net/Time.pm
+ 'NEXT' => '0.60', #lib/NEXT.pm
+ 'O' => '1.00', #lib/O.pm
+ 'ODBM_File' => '1.04', #ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.05', #lib/Opcode.pm
+ 'open' => '1.02', #lib/open.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'OS2::DLL' => '1.02', #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.02', #os2/OS2/REXX/REXX.pm
+ 'overload' => '1.01', #lib/overload.pm
+ 'PerlIO' => '1.03', #lib/PerlIO.pm
+ 'PerlIO::encoding' => '0.07', #lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.06', #lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.41', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.24', #lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0502', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.55', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.14', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.3', #lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.12', #lib/Pod/Perldoc.pm
+ 'Pod::Perldoc::BaseTo' => undef, #lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.02', #lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #lib/Pod/Text.pm
+ 'Pod::Text::Color' => '1.04', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.16', #lib/Pod/Usage.pm
+ 'POSIX' => '1.07', #lib/POSIX.pm
+ 're' => '0.04', #lib/re.pm
+ 'Safe' => '2.10', #lib/Safe.pm
+ 'Scalar::Util' => '1.13', #lib/Scalar/Util.pm
+ 'SDBM_File' => '1.04', #lib/SDBM_File.pm
+ 'Search::Dict' => '1.02', #lib/Search/Dict.pm
+ 'SelectSaver' => '1.00', #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #lib/SelfLoader.pm
+ 'Shell' => '0.5', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'Socket' => '1.76', #lib/Socket.pm
+ 'sort' => '1.02', #lib/sort.pm
+ 'Storable' => '2.09', #lib/Storable.pm
+ 'strict' => '1.03', #lib/strict.pm
+ 'subs' => '1.00', #lib/subs.pm
+ 'Switch' => '2.10', #lib/Switch.pm
+ 'Symbol' => '1.05', #lib/Symbol.pm
+ 'Sys::Hostname' => '1.11', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.04', #lib/Sys/Syslog.pm
+ 'Term::ANSIColor' => '1.07', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.08', #lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #lib/Term/ReadLine.pm
+ 'Test' => '1.24', #lib/Test.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.40', #lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.02', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.02', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.19', #lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Text::Abbrev' => '1.01', #lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.21', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09291', #lib/Text/Wrap.pm
+ 'Thread' => '2.00', #lib/Thread.pm
+ 'Thread::Queue' => '2.00', #lib/Thread/Queue.pm
+ 'threads' => '1.01', #lib/threads.pm
+ 'Thread::Semaphore' => '2.01', #lib/Thread/Semaphore.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'threads::shared' => '0.92', #lib/threads/shared.pm
+ 'Tie::Array' => '1.03', #lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.01', #lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #lib/Time/gmtime.pm
+ 'Time::HiRes' => '1.52', #lib/Time/HiRes.pm
+ 'Time::Local' => '1.07', #lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #lib/Time/tm.pm
+ 'Unicode' => '4.0.0', # lib/unicore/version
+ 'Unicode::Collate' => '0.33', #lib/Unicode/Collate.pm
+ 'Unicode::Normalize' => '0.28', #lib/Unicode/Normalize.pm
+ 'Unicode::UCD' => '0.21', #lib/Unicode/UCD.pm
+ 'UNIVERSAL' => '1.01', #lib/UNIVERSAL.pm
+ 'User::grent' => '1.00', #lib/User/grent.pm
+ 'User::pwent' => '1.00', #lib/User/pwent.pm
+ 'utf8' => '1.02', #lib/utf8.pm
+ 'vars' => '1.01', #lib/vars.pm
+ 'VMS::DCLsym' => '1.02', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #vms/ext/Stdio/Stdio.pm
+ 'vmsish' => '1.01', #lib/vmsish.pm
+ 'warnings' => '1.03', #lib/warnings.pm
+ 'warnings::register' => '1.00', #lib/warnings/register.pm
+ 'XS::APItest' => '0.03', #lib/XS/APItest.pm
+ 'XSLoader' => '0.02', #lib/XSLoader.pm
+ 'XS::Typemap' => '0.01', #lib/XS/Typemap.pm
+ },
+
+ 5.009 => {
+ 'AnyDBM_File' => '1.00', #lib/AnyDBM_File.pm
+ 'assertions' => '0.01', #lib/assertions.pm
+ 'assertions::activate' => '0.01', #lib/assertions/activate.pm
+ 'Attribute::Handlers' => '0.78', #lib/Attribute/Handlers.pm
+ 'attributes' => '0.06', #lib/attributes.pm
+ 'attrs' => '1.01', #lib/attrs.pm
+ 'AutoLoader' => '5.60', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #lib/AutoSplit.pm
+ 'autouse' => '1.03', #lib/autouse.pm
+ 'B' => '1.03', #lib/B.pm
+ 'B::Asmdata' => '1.01', #lib/B/Asmdata.pm
+ 'B::Assembler' => '0.06', #lib/B/Assembler.pm
+ 'B::Bblock' => '1.02', #lib/B/Bblock.pm
+ 'B::Bytecode' => '1.01', #lib/B/Bytecode.pm
+ 'B::C' => '1.03', #lib/B/C.pm
+ 'B::CC' => '1.00', #lib/B/CC.pm
+ 'B::Concise' => '0.57', #lib/B/Concise.pm
+ 'B::Debug' => '1.01', #lib/B/Debug.pm
+ 'B::Deparse' => '0.65', #lib/B/Deparse.pm
+ 'B::Disassembler' => '1.03', #lib/B/Disassembler.pm
+ 'B::Lint' => '1.02', #lib/B/Lint.pm
+ 'B::Showlex' => '1.00', #lib/B/Showlex.pm
+ 'B::Stackobj' => '1.00', #lib/B/Stackobj.pm
+ 'B::Stash' => '1.00', #lib/B/Stash.pm
+ 'B::Terse' => '1.02', #lib/B/Terse.pm
+ 'B::Xref' => '1.01', #lib/B/Xref.pm
+ 'base' => '2.03', #lib/base.pm
+ 'Benchmark' => '1.051', #lib/Benchmark.pm
+ 'bigint' => '0.04', #lib/bigint.pm
+ 'bignum' => '0.14', #lib/bignum.pm
+ 'bigrat' => '0.06', #lib/bigrat.pm
+ 'blib' => '1.02', #lib/blib.pm
+ 'ByteLoader' => '0.05', #lib/ByteLoader.pm
+ 'bytes' => '1.01', #lib/bytes.pm
+ 'Carp' => '1.01', #lib/Carp.pm
+ 'Carp::Heavy' => '1.01', #lib/Carp/Heavy.pm
+ 'CGI' => '3.00', #lib/CGI.pm
+ 'CGI::Apache' => '1.00', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.26', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.041', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.07_00', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.31', #lib/CGI/Util.pm
+ 'charnames' => '1.02', #lib/charnames.pm
+ 'Class::ISA' => '0.32', #lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #lib/Class/Struct.pm
+ 'Config' => undef, #lib/Config.pm
+ 'constant' => '1.04', #lib/constant.pm
+ 'CPAN' => '1.76_01', #lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.60 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #lib/CPAN/Nox.pm
+ 'Cwd' => '2.08', #lib/Cwd.pm
+ 'Data::Dumper' => '2.121', #lib/Data/Dumper.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'DB_File' => '1.806', #lib/DB_File.pm
+ 'Devel::DProf' => '20030813.00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.01', #lib/Devel/Peek.pm
+ 'Devel::PPPort' => '2.008', #lib/Devel/PPPort.pm
+ 'Devel::SelfStubber' => '1.03', #lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.11', #lib/diagnostics.pm
+ 'Digest' => '1.02', #lib/Digest.pm
+ 'Digest::MD5' => '2.30', #lib/Digest/MD5.pm
+ 'DirHandle' => '1.00', #lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04', #lib/DynaLoader.pm
+ 'Encode' => '1.9801', #lib/Encode.pm
+ 'Encode::Alias' => '1.38', #lib/Encode/Alias.pm
+ 'Encode::Byte' => '1.23', #lib/Encode/Byte.pm
+ 'Encode::CJKConstants' => '1.02', #lib/Encode/CJKConstants.pm
+ 'Encode::CN' => '1.24', #lib/Encode/CN.pm
+ 'Encode::CN::HZ' => '1.05', #lib/Encode/CN/HZ.pm
+ 'Encode::Config' => '1.07', #lib/Encode/Config.pm
+ 'Encode::EBCDIC' => '1.21', #lib/Encode/EBCDIC.pm
+ 'Encode::Encoder' => '0.07', #lib/Encode/Encoder.pm
+ 'Encode::Encoding' => '1.33', #lib/Encode/Encoding.pm
+ 'Encode::Guess' => '1.09', #lib/Encode/Guess.pm
+ 'Encode::JP' => '1.25', #lib/Encode/JP.pm
+ 'Encode::JP::H2Z' => '1.02', #lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '1.12', #lib/Encode/JP/JIS7.pm
+ 'Encode::KR' => '1.23', #lib/Encode/KR.pm
+ 'Encode::KR::2022_KR' => '1.06', #lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '1.09', #lib/Encode/MIME/Header.pm
+ 'Encode::Symbol' => '1.22', #lib/Encode/Symbol.pm
+ 'Encode::TW' => '1.26', #lib/Encode/TW.pm
+ 'Encode::Unicode' => '1.40', #lib/Encode/Unicode.pm
+ 'Encode::Unicode::UTF7' => '0.02', #lib/Encode/Unicode/UTF7.pm
+ 'encoding' => '1.47', #lib/encoding.pm
+ 'English' => '1.02', #lib/English.pm
+ 'Env' => '1.00', #lib/Env.pm
+ 'Errno' => '1.09_00', #lib/Errno.pm
+ 'Exporter' => '5.567', #lib/Exporter.pm
+ 'Exporter::Heavy' => '5.567', #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Constant' => '0.14', #lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.17', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'ExtUtils::Manifest' => '1.42', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.07', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.06', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.03', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'Fatal' => '1.04', #lib/Fatal.pm
+ 'Fcntl' => '1.05', #lib/Fcntl.pm
+ 'fields' => '2.03', #lib/fields.pm
+ 'File::Basename' => '2.72', #lib/File/Basename.pm
+ 'File::CheckTree' => '4.2', #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #lib/File/Compare.pm
+ 'File::Copy' => '2.06', #lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #lib/File/DosGlob.pm
+ 'File::Find' => '1.05', #lib/File/Find.pm
+ 'File::Glob' => '1.02', #lib/File/Glob.pm
+ 'File::Path' => '1.06', #lib/File/Path.pm
+ 'File::Spec' => '0.86', #lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #lib/File/Spec/Win32.pm
+ 'File::stat' => '1.00', #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'FileCache' => '1.03', #lib/FileCache.pm
+ 'FileHandle' => '2.01', #lib/FileHandle.pm
+ 'filetest' => '1.01', #lib/filetest.pm
+ 'Filter::Simple' => '0.78', #lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #lib/Filter/Util/Call.pm
+ 'FindBin' => '1.43', #lib/FindBin.pm
+ 'GDBM_File' => '1.07', #ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.34', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.04', #lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #lib/I18N/Collate.pm
+ 'I18N::Langinfo' => '0.02', #lib/I18N/Langinfo.pm
+ 'I18N::LangTags' => '0.29', #lib/I18N/LangTags.pm
+ 'I18N::LangTags::List' => '0.29', #lib/I18N/LangTags/List.pm
+ 'if' => '0.03', #lib/if.pm
+ 'integer' => '1.00', #lib/integer.pm
+ 'IO' => '1.21', #lib/IO.pm
+ 'IO::Dir' => '1.04', #lib/IO/Dir.pm
+ 'IO::File' => '1.10', #lib/IO/File.pm
+ 'IO::Handle' => '1.23', #lib/IO/Handle.pm
+ 'IO::Pipe' => '1.122', #lib/IO/Pipe.pm
+ 'IO::Poll' => '0.06', #lib/IO/Poll.pm
+ 'IO::Seekable' => '1.09', #lib/IO/Seekable.pm
+ 'IO::Select' => '1.16', #lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.27', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #lib/IO/Socket/UNIX.pm
+ 'IPC::Msg' => '1.02', #lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0105', #lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.02', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #lib/IPC/SysV.pm
+ 'JNI' => '0.2', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'less' => '0.01', #lib/less.pm
+ 'lib' => '0.5565', #lib/lib.pm
+ 'List::Util' => '1.13', #lib/List/Util.pm
+ 'locale' => '1.00', #lib/locale.pm
+ 'Locale::Constants' => '2.01', #lib/Locale/Constants.pm
+ 'Locale::Country' => '2.61', #lib/Locale/Country.pm
+ 'Locale::Currency' => '2.21', #lib/Locale/Currency.pm
+ 'Locale::Language' => '2.21', #lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.06', #lib/Locale/Maketext.pm
+ 'Locale::Maketext::Guts'=> undef, #lib/Locale/Maketext/Guts.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Script' => '2.21', #lib/Locale/Script.pm
+ 'Math::BigFloat' => '1.40', #lib/Math/BigFloat.pm
+ 'Math::BigFloat::Trace' => '0.01', #lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt' => '1.66', #lib/Math/BigInt.pm
+ 'Math::BigInt::Calc' => '0.36', #lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::Scalar' => '0.11', #lib/Math/BigInt/Scalar.pm
+ 'Math::BigInt::Trace' => '0.01', #lib/Math/BigInt/Trace.pm
+ 'Math::BigRat' => '0.10', #lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #lib/Math/Trig.pm
+ 'Memoize' => '1.01', #lib/Memoize.pm
+ 'Memoize::AnyDBM_File' => '0.65', #lib/Memoize/AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #lib/Memoize/Expire.pm
+ 'Memoize::ExpireFile' => '1.01', #lib/Memoize/ExpireFile.pm
+ 'Memoize::ExpireTest' => '0.65', #lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #lib/Memoize/Storable.pm
+ 'MIME::Base64' => '2.21', #lib/MIME/Base64.pm
+ 'MIME::QuotedPrint' => '2.21', #lib/MIME/QuotedPrint.pm
+ 'NDBM_File' => '1.05', #ext/NDBM_File/NDBM_File.pm
+ 'Net::Cmd' => '2.24', #lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #lib/Net/Config.pm
+ 'Net::Domain' => '2.19', #lib/Net/Domain.pm
+ 'Net::FTP' => '2.72', #lib/Net/FTP.pm
+ 'Net::FTP::A' => '1.16', #lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #lib/Net/FTP/L.pm
+ 'Net::hostent' => '1.01', #lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.22', #lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #lib/Net/Ping.pm
+ 'Net::POP3' => '2.24', #lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #lib/Net/servent.pm
+ 'Net::SMTP' => '2.26', #lib/Net/SMTP.pm
+ 'Net::Time' => '2.09', #lib/Net/Time.pm
+ 'NEXT' => '0.60', #lib/NEXT.pm
+ 'O' => '1.00', #lib/O.pm
+ 'ODBM_File' => '1.04', #ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.06', #lib/Opcode.pm
+ 'open' => '1.02', #lib/open.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'OS2::DLL' => '1.02', #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.02', #os2/OS2/REXX/REXX.pm
+ 'overload' => '1.02', #lib/overload.pm
+ 'PerlIO' => '1.02', #lib/PerlIO.pm
+ 'PerlIO::encoding' => '0.07', #lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.05', #lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.41', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.24', #lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0501', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.55', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.13', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.3', #lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.11', #lib/Pod/Perldoc.pm
+ 'Pod::Perldoc::BaseTo' => undef, #lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.01', #lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #lib/Pod/Text.pm
+ 'Pod::Text::Color' => '1.04', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.16', #lib/Pod/Usage.pm
+ 'POSIX' => '1.06', #lib/POSIX.pm
+ 're' => '0.04', #lib/re.pm
+ 'Safe' => '2.10', #lib/Safe.pm
+ 'Scalar::Util' => '1.13', #lib/Scalar/Util.pm
+ 'SDBM_File' => '1.04', #lib/SDBM_File.pm
+ 'Search::Dict' => '1.02', #lib/Search/Dict.pm
+ 'SelectSaver' => '1.00', #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #lib/SelfLoader.pm
+ 'Shell' => '0.5', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'Socket' => '1.76', #lib/Socket.pm
+ 'sort' => '1.02', #lib/sort.pm
+ 'Storable' => '2.08', #lib/Storable.pm
+ 'strict' => '1.03', #lib/strict.pm
+ 'subs' => '1.00', #lib/subs.pm
+ 'Switch' => '2.10', #lib/Switch.pm
+ 'Symbol' => '1.05', #lib/Symbol.pm
+ 'Sys::Hostname' => '1.11', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.04', #lib/Sys/Syslog.pm
+ 'Term::ANSIColor' => '1.07', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.08', #lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #lib/Term/ReadLine.pm
+ 'Test' => '1.24', #lib/Test.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.30', #lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.01', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.01', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.15', #lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Text::Abbrev' => '1.01', #lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.21', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09291', #lib/Text/Wrap.pm
+ 'Thread' => '2.00', #lib/Thread.pm
+ 'Thread::Queue' => '2.00', #lib/Thread/Queue.pm
+ 'Thread::Semaphore' => '2.01', #lib/Thread/Semaphore.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'threads' => '1.00', #lib/threads.pm
+ 'threads::shared' => '0.91', #lib/threads/shared.pm
+ 'Tie::Array' => '1.03', #lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.00', #lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #lib/Time/gmtime.pm
+ 'Time::HiRes' => '1.51', #lib/Time/HiRes.pm
+ 'Time::Local' => '1.07', #lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #lib/Time/tm.pm
+ 'Unicode' => '4.0.0', #lib/unicore/version
+ 'Unicode::Collate' => '0.28', #lib/Unicode/Collate.pm
+ 'Unicode::Normalize' => '0.23', #lib/Unicode/Normalize.pm
+ 'Unicode::UCD' => '0.21', #lib/Unicode/UCD.pm
+ 'UNIVERSAL' => '1.01', #lib/UNIVERSAL.pm
+ 'User::grent' => '1.00', #lib/User/grent.pm
+ 'User::pwent' => '1.00', #lib/User/pwent.pm
+ 'utf8' => '1.02', #lib/utf8.pm
+ 'vars' => '1.01', #lib/vars.pm
+ 'version' => '0.29', #lib/version.pm
+ 'VMS::DCLsym' => '1.02', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #vms/ext/Stdio/Stdio.pm
+ 'vmsish' => '1.01', #lib/vmsish.pm
+ 'warnings' => '1.03', #lib/warnings.pm
+ 'warnings::register' => '1.00', #lib/warnings/register.pm
+ 'XS::APItest' => '0.02', #lib/XS/APItest.pm
+ 'XS::Typemap' => '0.01', #lib/XS/Typemap.pm
+ 'XSLoader' => '0.03', #lib/XSLoader.pm
+ },
+
+ 5.009001 => {
+ 'AnyDBM_File' => '1.00', #lib/AnyDBM_File.pm
+ 'assertions' => '0.01', #lib/assertions.pm
+ 'assertions::activate' => '0.01', #lib/assertions/activate.pm
+ 'Attribute::Handlers' => '0.78_01', #lib/Attribute/Handlers.pm
+ 'attributes' => '0.06', #lib/attributes.pm
+ 'attrs' => '1.01', #lib/attrs.pm
+ 'AutoLoader' => '5.60', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #lib/AutoSplit.pm
+ 'autouse' => '1.03', #lib/autouse.pm
+ 'B' => '1.05', #lib/B.pm
+ 'base' => '2.04', #lib/base.pm
+ 'B::Asmdata' => '1.01', #lib/B/Asmdata.pm
+ 'B::Assembler' => '0.06', #lib/B/Assembler.pm
+ 'B::Bblock' => '1.02', #lib/B/Bblock.pm
+ 'B::Bytecode' => '1.01', #lib/B/Bytecode.pm
+ 'B::C' => '1.04', #lib/B/C.pm
+ 'B::CC' => '1.00', #lib/B/CC.pm
+ 'B::Concise' => '0.59', #lib/B/Concise.pm
+ 'B::Debug' => '1.02', #lib/B/Debug.pm
+ 'B::Deparse' => '0.65', #lib/B/Deparse.pm
+ 'B::Disassembler' => '1.03', #lib/B/Disassembler.pm
+ 'Benchmark' => '1.06', #lib/Benchmark.pm
+ 'bigint' => '0.05', #lib/bigint.pm
+ 'bignum' => '0.15', #lib/bignum.pm
+ 'bigrat' => '0.06', #lib/bigrat.pm
+ 'blib' => '1.02', #lib/blib.pm
+ 'B::Lint' => '1.02', #lib/B/Lint.pm
+ 'B::Showlex' => '1.00', #lib/B/Showlex.pm
+ 'B::Stackobj' => '1.00', #lib/B/Stackobj.pm
+ 'B::Stash' => '1.00', #lib/B/Stash.pm
+ 'B::Terse' => '1.02', #lib/B/Terse.pm
+ 'B::Xref' => '1.01', #lib/B/Xref.pm
+ 'ByteLoader' => '0.05', #lib/ByteLoader.pm
+ 'bytes' => '1.01', #lib/bytes.pm
+ 'Carp' => '1.02', #lib/Carp.pm
+ 'Carp::Heavy' => '1.01', #lib/Carp/Heavy.pm
+ 'CGI' => '3.04', #lib/CGI.pm
+ 'CGI::Apache' => '1.00', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.27', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.05', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.08', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.4', #lib/CGI/Util.pm
+ 'charnames' => '1.03', #lib/charnames.pm
+ 'Class::ISA' => '0.32', #lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #lib/Class/Struct.pm
+ 'Config' => undef, #lib/Config.pm
+ 'constant' => '1.04', #lib/constant.pm
+ 'CPAN' => '1.76_01', #lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.60 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #lib/CPAN/Nox.pm
+ 'Cwd' => '2.17', #lib/Cwd.pm
+ 'Data::Dumper' => '2.121', #lib/Data/Dumper.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'DB_File' => '1.808_01', #lib/DB_File.pm
+ 'DBM_Filter' => '0.01', #lib/DBM_Filter.pm
+ 'DBM_Filter::compress' => '0.01', #lib/DBM_Filter/compress.pm
+ 'DBM_Filter::encode' => '0.01', #lib/DBM_Filter/encode.pm
+ 'DBM_Filter::int32' => '0.01', #lib/DBM_Filter/int32.pm
+ 'DBM_Filter::null' => '0.01', #lib/DBM_Filter/null.pm
+ 'DBM_Filter::utf8' => '0.01', #lib/DBM_Filter/utf8.pm
+ 'Devel::DProf' => '20030813.00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.01', #lib/Devel/Peek.pm
+ 'Devel::PPPort' => '2.011_01', #lib/Devel/PPPort.pm
+ 'Devel::SelfStubber' => '1.03', #lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.12', #lib/diagnostics.pm
+ 'Digest' => '1.05', #lib/Digest.pm
+ 'Digest::base' => '1.00', #lib/Digest/base.pm
+ 'Digest::MD5' => '2.33', #lib/Digest/MD5.pm
+ 'DirHandle' => '1.00', #lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04', #lib/DynaLoader.pm
+ 'Encode' => '1.99_01', #lib/Encode.pm
+ 'Encode::Alias' => '1.38', #lib/Encode/Alias.pm
+ 'Encode::Byte' => '1.23', #lib/Encode/Byte.pm
+ 'Encode::CJKConstants' => '1.02', #lib/Encode/CJKConstants.pm
+ 'Encode::CN' => '1.24', #lib/Encode/CN.pm
+ 'Encode::CN::HZ' => '1.0501', #lib/Encode/CN/HZ.pm
+ 'Encode::Config' => '1.07', #lib/Encode/Config.pm
+ 'Encode::EBCDIC' => '1.21', #lib/Encode/EBCDIC.pm
+ 'Encode::Encoder' => '0.07', #lib/Encode/Encoder.pm
+ 'Encode::Encoding' => '1.33', #lib/Encode/Encoding.pm
+ 'Encode::Guess' => '1.09', #lib/Encode/Guess.pm
+ 'Encode::JP' => '1.25', #lib/Encode/JP.pm
+ 'Encode::JP::H2Z' => '1.02', #lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '1.12', #lib/Encode/JP/JIS7.pm
+ 'Encode::KR' => '1.23', #lib/Encode/KR.pm
+ 'Encode::KR::2022_KR' => '1.06', #lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '1.09', #lib/Encode/MIME/Header.pm
+ 'Encode::Symbol' => '1.22', #lib/Encode/Symbol.pm
+ 'Encode::TW' => '1.26', #lib/Encode/TW.pm
+ 'Encode::Unicode' => '1.40', #lib/Encode/Unicode.pm
+ 'Encode::Unicode::UTF7' => '0.02', #lib/Encode/Unicode/UTF7.pm
+ 'encoding' => '1.48', #lib/encoding.pm
+ 'English' => '1.02', #lib/English.pm
+ 'Env' => '1.00', #lib/Env.pm
+ 'Errno' => '1.09_00', #lib/Errno.pm
+ 'Exporter' => '5.58', #lib/Exporter.pm
+ 'Exporter::Heavy' => '5.567', #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.07', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Constant' => '0.14', #lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.21_02', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'ExtUtils::Manifest' => '1.43', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.0901', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.07', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.07_01', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.45_01', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.71_01', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.10_01', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.03', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'Fatal' => '1.04', #lib/Fatal.pm
+ 'Fcntl' => '1.05', #lib/Fcntl.pm
+ 'fields' => '2.03', #lib/fields.pm
+ 'File::Basename' => '2.72', #lib/File/Basename.pm
+ 'FileCache' => '1.03', #lib/FileCache.pm
+ 'File::CheckTree' => '4.3', #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #lib/File/Compare.pm
+ 'File::Copy' => '2.07', #lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #lib/File/DosGlob.pm
+ 'File::Find' => '1.07', #lib/File/Find.pm
+ 'File::Glob' => '1.02', #lib/File/Glob.pm
+ 'FileHandle' => '2.01', #lib/FileHandle.pm
+ 'File::Path' => '1.06', #lib/File/Path.pm
+ 'File::Spec' => '0.87', #lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #lib/File/Spec/Win32.pm
+ 'File::stat' => '1.00', #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'filetest' => '1.01', #lib/filetest.pm
+ 'Filter::Simple' => '0.78', #lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #lib/Filter/Util/Call.pm
+ 'FindBin' => '1.44', #lib/FindBin.pm
+ 'GDBM_File' => '1.07', #lib/GDBM_File.pm
+ 'Getopt::Long' => '2.3401', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.05', #lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #lib/I18N/Collate.pm
+ 'I18N::Langinfo' => '0.02', #lib/I18N/Langinfo.pm
+ 'I18N::LangTags' => '0.29', #lib/I18N/LangTags.pm
+ 'I18N::LangTags::List' => '0.29', #lib/I18N/LangTags/List.pm
+ 'if' => '0.0401', #lib/if.pm
+ 'integer' => '1.00', #lib/integer.pm
+ 'IO' => '1.21', #lib/IO.pm
+ 'IO::Dir' => '1.04', #lib/IO/Dir.pm
+ 'IO::File' => '1.10', #lib/IO/File.pm
+ 'IO::Handle' => '1.23', #lib/IO/Handle.pm
+ 'IO::Pipe' => '1.122', #lib/IO/Pipe.pm
+ 'IO::Poll' => '0.06', #lib/IO/Poll.pm
+ 'IO::Seekable' => '1.09', #lib/IO/Seekable.pm
+ 'IO::Select' => '1.16', #lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.27', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #lib/IO/Socket/UNIX.pm
+ 'IPC::Msg' => '1.02', #lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0105', #lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.02', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #lib/IPC/SysV.pm
+ 'JNI' => '0.2', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'less' => '0.01', #lib/less.pm
+ 'lib' => '0.5565', #lib/lib.pm
+ 'List::Util' => '1.13', #lib/List/Util.pm
+ 'locale' => '1.00', #lib/locale.pm
+ 'Locale::Constants' => '2.01', #lib/Locale/Constants.pm
+ 'Locale::Country' => '2.61', #lib/Locale/Country.pm
+ 'Locale::Currency' => '2.21', #lib/Locale/Currency.pm
+ 'Locale::Language' => '2.21', #lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.08', #lib/Locale/Maketext.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Maketext::Guts'=> undef, #lib/Locale/Maketext/Guts.pm
+ 'Locale::Script' => '2.21', #lib/Locale/Script.pm
+ 'Math::BigFloat' => '1.44', #lib/Math/BigFloat.pm
+ 'Math::BigFloat::Trace' => '0.01', #lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt' => '1.70', #lib/Math/BigInt.pm
+ 'Math::BigInt::Calc' => '0.40', #lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::CalcEmu' => '0.04', #lib/Math/BigInt/CalcEmu.pm
+ 'Math::BigInt::Trace' => '0.01', #lib/Math/BigInt/Trace.pm
+ 'Math::BigRat' => '0.12', #lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #lib/Math/Trig.pm
+ 'Memoize' => '1.01_01', #lib/Memoize.pm
+ 'Memoize::AnyDBM_File' => '0.65', #lib/Memoize/AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #lib/Memoize/Expire.pm
+ 'Memoize::ExpireFile' => '1.01', #lib/Memoize/ExpireFile.pm
+ 'Memoize::ExpireTest' => '0.65', #lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #lib/Memoize/Storable.pm
+ 'MIME::Base64' => '3.00_01', #lib/MIME/Base64.pm
+ 'MIME::QuotedPrint' => '3.00', #lib/MIME/QuotedPrint.pm
+ 'NDBM_File' => '1.05', #lib/NDBM_File.pm
+ 'Net::Cmd' => '2.24', #lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #lib/Net/Config.pm
+ 'Net::Domain' => '2.19', #lib/Net/Domain.pm
+ 'Net::FTP' => '2.72', #lib/Net/FTP.pm
+ 'Net::FTP::A' => '1.16', #lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #lib/Net/FTP/L.pm
+ 'Net::hostent' => '1.01', #lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.22', #lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #lib/Net/Ping.pm
+ 'Net::POP3' => '2.24', #lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #lib/Net/servent.pm
+ 'Net::SMTP' => '2.26', #lib/Net/SMTP.pm
+ 'Net::Time' => '2.09', #lib/Net/Time.pm
+ 'NEXT' => '0.60', #lib/NEXT.pm
+ 'O' => '1.00', #lib/O.pm
+ 'ODBM_File' => '1.04', #ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.06', #lib/Opcode.pm
+ 'open' => '1.02', #lib/open.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'OS2::DLL' => '1.02', #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.02', #os2/OS2/REXX/REXX.pm
+ 'overload' => '1.02', #lib/overload.pm
+ 'PerlIO' => '1.03', #lib/PerlIO.pm
+ 'PerlIO::encoding' => '0.07', #lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.06', #lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.41', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.24', #lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0502', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.55', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.14', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.3', #lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.12', #lib/Pod/Perldoc.pm
+ 'Pod::Perldoc::BaseTo' => undef, #lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.02', #lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #lib/Pod/Text.pm
+ 'Pod::Text::Color' => '1.04', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.16', #lib/Pod/Usage.pm
+ 'POSIX' => '1.07', #lib/POSIX.pm
+ 're' => '0.04', #lib/re.pm
+ 'Safe' => '2.10', #lib/Safe.pm
+ 'Scalar::Util' => '1.13', #lib/Scalar/Util.pm
+ 'SDBM_File' => '1.04', #lib/SDBM_File.pm
+ 'Search::Dict' => '1.02', #lib/Search/Dict.pm
+ 'SelectSaver' => '1.00', #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #lib/SelfLoader.pm
+ 'Shell' => '0.5.2', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'Socket' => '1.77', #lib/Socket.pm
+ 'sort' => '1.02', #lib/sort.pm
+ 'Storable' => '2.11', #lib/Storable.pm
+ 'strict' => '1.03', #lib/strict.pm
+ 'subs' => '1.00', #lib/subs.pm
+ 'Switch' => '2.10', #lib/Switch.pm
+ 'Symbol' => '1.05', #lib/Symbol.pm
+ 'Sys::Hostname' => '1.11', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.05', #lib/Sys/Syslog.pm
+ 'Term::ANSIColor' => '1.08', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.08', #lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #lib/Term/ReadLine.pm
+ 'Test' => '1.24', #lib/Test.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.40', #lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.02', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.02', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.19', #lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Text::Abbrev' => '1.01', #lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.21', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09291', #lib/Text/Wrap.pm
+ 'Thread' => '2.00', #lib/Thread.pm
+ 'Thread::Queue' => '2.00', #lib/Thread/Queue.pm
+ 'threads' => '1.02', #lib/threads.pm
+ 'Thread::Semaphore' => '2.01', #lib/Thread/Semaphore.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'threads::shared' => '0.92', #lib/threads/shared.pm
+ 'Tie::Array' => '1.03', #lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.01', #lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #lib/Time/gmtime.pm
+ 'Time::HiRes' => '1.56', #lib/Time/HiRes.pm
+ 'Time::Local' => '1.07_94', #lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #lib/Time/tm.pm
+ 'Unicode' => '4.0.0', #lib/unicore/version
+ 'Unicode::Collate' => '0.33', #lib/Unicode/Collate.pm
+ 'Unicode::Normalize' => '0.28', #lib/Unicode/Normalize.pm
+ 'Unicode::UCD' => '0.21', #lib/Unicode/UCD.pm
+ 'UNIVERSAL' => '1.02', #lib/UNIVERSAL.pm
+ 'User::grent' => '1.00', #lib/User/grent.pm
+ 'User::pwent' => '1.00', #lib/User/pwent.pm
+ 'utf8' => '1.02', #lib/utf8.pm
+ 'vars' => '1.01', #lib/vars.pm
+ 'version' => '0.36', #lib/version.pm
+ 'VMS::DCLsym' => '1.02', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #vms/ext/Stdio/Stdio.pm
+ 'vmsish' => '1.01', #lib/vmsish.pm
+ 'warnings' => '1.03', #lib/warnings.pm
+ 'warnings::register' => '1.00', #lib/warnings/register.pm
+ 'XS::APItest' => '0.03', #lib/XS/APItest.pm
+ 'XSLoader' => '0.03', #lib/XSLoader.pm
+ 'XS::Typemap' => '0.01', #lib/XS/Typemap.pm
+ },
+
+ 5.008004 => {
+ 'AnyDBM_File' => '1.00', #lib/AnyDBM_File.pm
+ 'attributes' => '0.06', #lib/attributes.pm
+ 'AutoLoader' => '5.60', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #lib/AutoSplit.pm
+ 'autouse' => '1.03', #lib/autouse.pm
+ 'base' => '2.05', #lib/base.pm
+ 'Benchmark' => '1.06', #lib/Benchmark.pm
+ 'bigint' => '0.05', #lib/bigint.pm
+ 'bignum' => '0.15', #lib/bignum.pm
+ 'bigrat' => '0.06', #lib/bigrat.pm
+ 'blib' => '1.02', #lib/blib.pm
+ 'bytes' => '1.01', #lib/bytes.pm
+ 'Carp' => '1.02', #lib/Carp.pm
+ 'CGI' => '3.04', #lib/CGI.pm
+ 'charnames' => '1.03', #lib/charnames.pm
+ 'constant' => '1.04', #lib/constant.pm
+ 'CPAN' => '1.76_01', #lib/CPAN.pm
+ 'Cwd' => '2.17', #lib/Cwd.pm
+ 'DBM_Filter' => '0.01', #lib/DBM_Filter.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'diagnostics' => '1.12', #lib/diagnostics.pm
+ 'Digest' => '1.06', #lib/Digest.pm
+ 'DirHandle' => '1.00', #lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #lib/Dumpvalue.pm
+ 'English' => '1.01', #lib/English.pm
+ 'Env' => '1.00', #lib/Env.pm
+ 'Exporter' => '5.58', #lib/Exporter.pm
+ 'Fatal' => '1.03', #lib/Fatal.pm
+ 'fields' => '2.03', #lib/fields.pm
+ 'FileCache' => '1.03', #lib/FileCache.pm
+ 'FileHandle' => '2.01', #lib/FileHandle.pm
+ 'filetest' => '1.01', #lib/filetest.pm
+ 'FindBin' => '1.44', #lib/FindBin.pm
+ 'if' => '0.03', #lib/if.pm
+ 'integer' => '1.00', #lib/integer.pm
+ 'less' => '0.01', #lib/less.pm
+ 'locale' => '1.00', #lib/locale.pm
+ 'Memoize' => '1.01', #lib/Memoize.pm
+ 'NEXT' => '0.60', #lib/NEXT.pm
+ 'open' => '1.03', #lib/open.pm
+ 'overload' => '1.01', #lib/overload.pm
+ 'PerlIO' => '1.03', #lib/PerlIO.pm
+ 'SelectSaver' => '1.00', #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #lib/SelfLoader.pm
+ 'Shell' => '0.5.2', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'sort' => '1.02', #lib/sort.pm
+ 'strict' => '1.03', #lib/strict.pm
+ 'subs' => '1.00', #lib/subs.pm
+ 'Switch' => '2.10', #lib/Switch.pm
+ 'Symbol' => '1.05', #lib/Symbol.pm
+ 'Test' => '1.24', #lib/Test.pm
+ 'Thread' => '2.00', #lib/Thread.pm
+ 'Unicode' => '4.0.1', # lib/unicore/version
+ 'UNIVERSAL' => '1.01', #lib/UNIVERSAL.pm
+ 'utf8' => '1.03', #lib/utf8.pm
+ 'vars' => '1.01', #lib/vars.pm
+ 'vmsish' => '1.01', #lib/vmsish.pm
+ 'warnings' => '1.03', #lib/warnings.pm
+ 'Config' => undef, #lib/Config.pm
+ 'lib' => '0.5565', #lib/lib.pm
+ 're' => '0.04', #lib/re.pm
+ 'XSLoader' => '0.02', #lib/XSLoader.pm
+ 'DynaLoader' => '1.05', #lib/DynaLoader.pm
+ 'attrs' => '1.01', #lib/attrs.pm
+ 'B' => '1.02', #lib/B.pm
+ 'O' => '1.00', #lib/O.pm
+ 'ByteLoader' => '0.05', #lib/ByteLoader.pm
+ 'DB_File' => '1.808', #lib/DB_File.pm
+ 'Encode' => '1.99_01', #lib/Encode.pm
+ 'encoding' => '1.48', #lib/encoding.pm
+ 'Fcntl' => '1.05', #lib/Fcntl.pm
+ 'GDBM_File' => '1.07', #lib/GDBM_File.pm
+ 'IO' => '1.21', #lib/IO.pm
+ 'NDBM_File' => '1.05', #lib/NDBM_File.pm
+ 'Safe' => '2.10', #lib/Safe.pm
+ 'Opcode' => '1.05', #lib/Opcode.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'POSIX' => '1.08', #lib/POSIX.pm
+ 'SDBM_File' => '1.04', #lib/SDBM_File.pm
+ 'Socket' => '1.77', #lib/Socket.pm
+ 'Storable' => '2.12', #lib/Storable.pm
+ 'threads' => '1.03', #lib/threads.pm
+ 'Errno' => '1.09_00', #lib/Errno.pm
+ 'Attribute::Handlers' => '0.78_01', #lib/Attribute/Handlers.pm
+ 'Carp::Heavy' => '1.01', #lib/Carp/Heavy.pm
+ 'CGI::Apache' => '1.00', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.27', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.05', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.08', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.4', #lib/CGI/Util.pm
+ 'Class::ISA' => '0.32', #lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #lib/Class/Struct.pm
+ 'CPAN::FirstTime' => '1.60 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #lib/CPAN/Nox.pm
+ 'DBM_Filter::compress' => '0.01', #lib/DBM_Filter/compress.pm
+ 'DBM_Filter::encode' => '0.01', #lib/DBM_Filter/encode.pm
+ 'DBM_Filter::int32' => '0.01', #lib/DBM_Filter/int32.pm
+ 'DBM_Filter::null' => '0.01', #lib/DBM_Filter/null.pm
+ 'DBM_Filter::utf8' => '0.01', #lib/DBM_Filter/utf8.pm
+ 'Devel::SelfStubber' => '1.03', #lib/Devel/SelfStubber.pm
+ 'Devel::DProf' => '20030813.00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.01', #lib/Devel/Peek.pm
+ 'Devel::PPPort' => '2.011', #lib/Devel/PPPort.pm
+ 'Digest::base' => '1.00', #lib/Digest/base.pm
+ 'Digest::MD5' => '2.33', #lib/Digest/MD5.pm
+ 'Exporter::Heavy' => '5.57', #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Constant' => '0.14', #lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '6.17', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.42', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_Any' => '0.07', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.07_02', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.0301', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3001', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'File::Basename' => '2.72', #lib/File/Basename.pm
+ 'File::CheckTree' => '4.3', #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #lib/File/Compare.pm
+ 'File::Copy' => '2.07', #lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #lib/File/DosGlob.pm
+ 'File::Find' => '1.07', #lib/File/Find.pm
+ 'File::Path' => '1.06', #lib/File/Path.pm
+ 'File::Spec' => '0.87', #lib/File/Spec.pm
+ 'File::stat' => '1.00', #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'File::Glob' => '1.02', #lib/File/Glob.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #lib/File/Spec/Win32.pm
+ 'Filter::Simple' => '0.78', #lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #lib/Filter/Util/Call.pm
+ 'Getopt::Long' => '2.34', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.05', #lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #lib/I18N/Collate.pm
+ 'I18N::LangTags' => '0.29', #lib/I18N/LangTags.pm
+ 'I18N::Langinfo' => '0.02', #lib/I18N/Langinfo.pm
+ 'I18N::LangTags::List' => '0.29', #lib/I18N/LangTags/List.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0106', #lib/IPC/Open3.pm
+ 'IPC::Msg' => '1.02', #lib/IPC/Msg.pm
+ 'IPC::Semaphore' => '1.02', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #lib/IPC/SysV.pm
+ 'Locale::Constants' => '2.01', #lib/Locale/Constants.pm
+ 'Locale::Country' => '2.61', #lib/Locale/Country.pm
+ 'Locale::Currency' => '2.21', #lib/Locale/Currency.pm
+ 'Locale::Language' => '2.21', #lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.08', #lib/Locale/Maketext.pm
+ 'Locale::Script' => '2.21', #lib/Locale/Script.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Maketext::Guts'=> undef, #lib/Locale/Maketext/Guts.pm
+ 'Math::BigFloat' => '1.44', #lib/Math/BigFloat.pm
+ 'Math::BigInt' => '1.70', #lib/Math/BigInt.pm
+ 'Math::BigRat' => '0.12', #lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #lib/Math/Trig.pm
+ 'Math::BigFloat::Trace' => '0.01', #lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt::CalcEmu' => '0.04', #lib/Math/BigInt/CalcEmu.pm
+ 'Math::BigInt::Calc' => '0.40', #lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::Trace' => '0.01', #lib/Math/BigInt/Trace.pm
+ 'Memoize::AnyDBM_File' => '0.65', #lib/Memoize/AnyDBM_File.pm
+ 'Memoize::ExpireFile' => '1.01', #lib/Memoize/ExpireFile.pm
+ 'Memoize::Expire' => '1.00', #lib/Memoize/Expire.pm
+ 'Memoize::ExpireTest' => '0.65', #lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #lib/Memoize/Storable.pm
+ 'Net::Cmd' => '2.24', #lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #lib/Net/Config.pm
+ 'Net::Domain' => '2.19', #lib/Net/Domain.pm
+ 'Net::FTP' => '2.72', #lib/Net/FTP.pm
+ 'Net::hostent' => '1.01', #lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.22', #lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #lib/Net/Ping.pm
+ 'Net::POP3' => '2.24', #lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #lib/Net/servent.pm
+ 'Net::SMTP' => '2.26', #lib/Net/SMTP.pm
+ 'Net::Time' => '2.09', #lib/Net/Time.pm
+ 'Net::FTP::A' => '1.16', #lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #lib/Net/FTP/L.pm
+ 'PerlIO::encoding' => '0.07', #lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.06', #lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.41', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.24', #lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0502', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.55', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.14', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.3', #lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.12', #lib/Pod/Perldoc.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.02', #lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #lib/Pod/Text.pm
+ 'Pod::Usage' => '1.16', #lib/Pod/Usage.pm
+ 'Pod::Perldoc::BaseTo' => undef, #lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Text::Color' => '1.04', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #lib/Pod/Text/Termcap.pm
+ 'Search::Dict' => '1.02', #lib/Search/Dict.pm
+ 'Term::ANSIColor' => '1.08', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.08', #lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #lib/Term/ReadLine.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.40', #lib/Test/Harness.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Test::Harness::Assert' => '0.02', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.02', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.19', #lib/Test/Harness/Straps.pm
+ 'Text::Abbrev' => '1.01', #lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.21', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09291', #lib/Text/Wrap.pm
+ 'Thread::Queue' => '2.00', #lib/Thread/Queue.pm
+ 'Thread::Semaphore' => '2.01', #lib/Thread/Semaphore.pm
+ 'Tie::Array' => '1.03', #lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.01', #lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #lib/Time/gmtime.pm
+ 'Time::Local' => '1.07', #lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #lib/Time/tm.pm
+ 'Time::HiRes' => '1.59', #lib/Time/HiRes.pm
+ 'Unicode::Collate' => '0.33', #lib/Unicode/Collate.pm
+ 'Unicode::UCD' => '0.22', #lib/Unicode/UCD.pm
+ 'Unicode::Normalize' => '0.28', #lib/Unicode/Normalize.pm
+ 'User::grent' => '1.00', #lib/User/grent.pm
+ 'User::pwent' => '1.00', #lib/User/pwent.pm
+ 'warnings::register' => '1.00', #lib/warnings/register.pm
+ 'B::Stash' => '1.00', #lib/B/Stash.pm
+ 'B::Asmdata' => '1.01', #lib/B/Asmdata.pm
+ 'B::C' => '1.02', #lib/B/C.pm
+ 'B::Deparse' => '0.66', #lib/B/Deparse.pm
+ 'B::Debug' => '1.01', #lib/B/Debug.pm
+ 'B::Bblock' => '1.02', #lib/B/Bblock.pm
+ 'B::Assembler' => '0.07', #lib/B/Assembler.pm
+ 'B::Terse' => '1.02', #lib/B/Terse.pm
+ 'B::CC' => '1.00', #lib/B/CC.pm
+ 'B::Concise' => '0.60', #lib/B/Concise.pm
+ 'B::Lint' => '1.02', #lib/B/Lint.pm
+ 'B::Showlex' => '1.00', #lib/B/Showlex.pm
+ 'B::Bytecode' => '1.01', #lib/B/Bytecode.pm
+ 'B::Disassembler' => '1.03', #lib/B/Disassembler.pm
+ 'B::Xref' => '1.01', #lib/B/Xref.pm
+ 'B::Stackobj' => '1.00', #lib/B/Stackobj.pm
+ 'Data::Dumper' => '2.121', #lib/Data/Dumper.pm
+ 'Encode::Alias' => '1.38', #lib/Encode/Alias.pm
+ 'Encode::Encoding' => '1.33', #lib/Encode/Encoding.pm
+ 'Encode::Guess' => '1.09', #lib/Encode/Guess.pm
+ 'Encode::Config' => '1.07', #lib/Encode/Config.pm
+ 'Encode::Encoder' => '0.07', #lib/Encode/Encoder.pm
+ 'Encode::CJKConstants' => '1.02', #lib/Encode/CJKConstants.pm
+ 'Encode::Byte' => '1.23', #lib/Encode/Byte.pm
+ 'Encode::CN' => '1.24', #lib/Encode/CN.pm
+ 'Encode::EBCDIC' => '1.21', #lib/Encode/EBCDIC.pm
+ 'Encode::JP' => '1.25', #lib/Encode/JP.pm
+ 'Encode::KR' => '1.23', #lib/Encode/KR.pm
+ 'Encode::Symbol' => '1.22', #lib/Encode/Symbol.pm
+ 'Encode::TW' => '1.26', #lib/Encode/TW.pm
+ 'Encode::Unicode' => '1.40', #lib/Encode/Unicode.pm
+ 'Encode::JP::H2Z' => '1.02', #lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '1.12', #lib/Encode/JP/JIS7.pm
+ 'Encode::Unicode::UTF7' => '0.02', #lib/Encode/Unicode/UTF7.pm
+ 'Encode::KR::2022_KR' => '1.06', #lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '1.09', #lib/Encode/MIME/Header.pm
+ 'Encode::CN::HZ' => '1.0501', #lib/Encode/CN/HZ.pm
+ 'IO::Pipe' => '1.123', #lib/IO/Pipe.pm
+ 'IO::File' => '1.10', #lib/IO/File.pm
+ 'IO::Select' => '1.16', #lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #lib/IO/Socket.pm
+ 'IO::Poll' => '0.06', #lib/IO/Poll.pm
+ 'IO::Dir' => '1.04', #lib/IO/Dir.pm
+ 'IO::Handle' => '1.24', #lib/IO/Handle.pm
+ 'IO::Seekable' => '1.09', #lib/IO/Seekable.pm
+ 'IO::Socket::INET' => '1.27', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #lib/IO/Socket/UNIX.pm
+ 'List::Util' => '1.13', #lib/List/Util.pm
+ 'Scalar::Util' => '1.13', #lib/Scalar/Util.pm
+ 'MIME::QuotedPrint' => '3.01', #lib/MIME/QuotedPrint.pm
+ 'MIME::Base64' => '3.01', #lib/MIME/Base64.pm
+ 'Sys::Hostname' => '1.11', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.05', #lib/Sys/Syslog.pm
+ 'XS::APItest' => '0.03', #lib/XS/APItest.pm
+ 'XS::Typemap' => '0.01', #lib/XS/Typemap.pm
+ 'threads::shared' => '0.92', #lib/threads/shared.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'JNI' => '0.2', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'ODBM_File' => '1.05', #ext/ODBM_File/ODBM_File.pm
+ 'OS2::DLL' => '1.02', #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.02', #os2/OS2/REXX/REXX.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'VMS::DCLsym' => '1.02', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #vms/ext/Stdio/Stdio.pm
+ },
+
+ 5.008005 => {
+ 'AnyDBM_File' => '1.00', #lib/AnyDBM_File.pm
+ 'attributes' => '0.06', #lib/attributes.pm
+ 'AutoLoader' => '5.60', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #lib/AutoSplit.pm
+ 'autouse' => '1.04', #lib/autouse.pm
+ 'base' => '2.06', #lib/base.pm
+ 'Benchmark' => '1.06', #lib/Benchmark.pm
+ 'bigint' => '0.05', #lib/bigint.pm
+ 'bignum' => '0.15', #lib/bignum.pm
+ 'bigrat' => '0.06', #lib/bigrat.pm
+ 'blib' => '1.02', #lib/blib.pm
+ 'bytes' => '1.01', #lib/bytes.pm
+ 'Carp' => '1.03', #lib/Carp.pm
+ 'CGI' => '3.05', #lib/CGI.pm
+ 'charnames' => '1.04', #lib/charnames.pm
+ 'constant' => '1.04', #lib/constant.pm
+ 'CPAN' => '1.76_01', #lib/CPAN.pm
+ 'Cwd' => '2.19', #lib/Cwd.pm
+ 'DBM_Filter' => '0.01', #lib/DBM_Filter.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'diagnostics' => '1.13', #lib/diagnostics.pm
+ 'Digest' => '1.08', #lib/Digest.pm
+ 'DirHandle' => '1.00', #lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #lib/Dumpvalue.pm
+ 'English' => '1.01', #lib/English.pm
+ 'Env' => '1.00', #lib/Env.pm
+ 'Exporter' => '5.58', #lib/Exporter.pm
+ 'Fatal' => '1.03', #lib/Fatal.pm
+ 'fields' => '2.03', #lib/fields.pm
+ 'FileCache' => '1.04_01', #lib/FileCache.pm
+ 'FileHandle' => '2.01', #lib/FileHandle.pm
+ 'filetest' => '1.01', #lib/filetest.pm
+ 'FindBin' => '1.44', #lib/FindBin.pm
+ 'if' => '0.03', #lib/if.pm
+ 'integer' => '1.00', #lib/integer.pm
+ 'less' => '0.01', #lib/less.pm
+ 'locale' => '1.00', #lib/locale.pm
+ 'Memoize' => '1.01', #lib/Memoize.pm
+ 'NEXT' => '0.60', #lib/NEXT.pm
+ 'open' => '1.03', #lib/open.pm
+ 'overload' => '1.01', #lib/overload.pm
+ 'PerlIO' => '1.03', #lib/PerlIO.pm
+ 'SelectSaver' => '1.00', #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #lib/SelfLoader.pm
+ 'Shell' => '0.6', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'sort' => '1.02', #lib/sort.pm
+ 'strict' => '1.03', #lib/strict.pm
+ 'subs' => '1.00', #lib/subs.pm
+ 'Switch' => '2.10', #lib/Switch.pm
+ 'Symbol' => '1.05', #lib/Symbol.pm
+ 'Test' => '1.25', #lib/Test.pm
+ 'Thread' => '2.00', #lib/Thread.pm
+ 'UNIVERSAL' => '1.01', #lib/UNIVERSAL.pm
+ 'utf8' => '1.04', #lib/utf8.pm
+ 'vars' => '1.01', #lib/vars.pm
+ 'vmsish' => '1.01', #lib/vmsish.pm
+ 'warnings' => '1.03', #lib/warnings.pm
+ 'Config' => undef, #lib/Config.pm
+ 'lib' => '0.5565', #lib/lib.pm
+ 're' => '0.04', #lib/re.pm
+ 'XSLoader' => '0.02', #lib/XSLoader.pm
+ 'DynaLoader' => '1.05', #lib/DynaLoader.pm
+ 'attrs' => '1.01', #lib/attrs.pm
+ 'B' => '1.02', #lib/B.pm
+ 'O' => '1.00', #lib/O.pm
+ 'ByteLoader' => '0.05', #lib/ByteLoader.pm
+ 'DB_File' => '1.809', #lib/DB_File.pm
+ 'Encode' => '2.01', #lib/Encode.pm
+ 'encoding' => '2.00', #lib/encoding.pm
+ 'Fcntl' => '1.05', #lib/Fcntl.pm
+ 'GDBM_File' => '1.07', #lib/GDBM_File.pm
+ 'IO' => '1.21', #lib/IO.pm
+ 'NDBM_File' => '1.05', #lib/NDBM_File.pm
+ 'Safe' => '2.11', #lib/Safe.pm
+ 'Opcode' => '1.05', #lib/Opcode.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'POSIX' => '1.08', #lib/POSIX.pm
+ 'SDBM_File' => '1.04', #lib/SDBM_File.pm
+ 'Socket' => '1.77', #lib/Socket.pm
+ 'Storable' => '2.13', #lib/Storable.pm
+ 'threads' => '1.05', #lib/threads.pm
+ 'Errno' => '1.09_00', #lib/Errno.pm
+ 'Attribute::Handlers' => '0.78_01', #lib/Attribute/Handlers.pm
+ 'Carp::Heavy' => '1.01', #lib/Carp/Heavy.pm
+ 'CGI::Apache' => '1.00', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.28', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.05', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.08', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.5', #lib/CGI/Util.pm
+ 'Class::ISA' => '0.32', #lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #lib/Class/Struct.pm
+ 'CPAN::FirstTime' => '1.60 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #lib/CPAN/Nox.pm
+ 'DBM_Filter::compress' => '0.01', #lib/DBM_Filter/compress.pm
+ 'DBM_Filter::encode' => '0.01', #lib/DBM_Filter/encode.pm
+ 'DBM_Filter::int32' => '0.01', #lib/DBM_Filter/int32.pm
+ 'DBM_Filter::null' => '0.01', #lib/DBM_Filter/null.pm
+ 'DBM_Filter::utf8' => '0.01', #lib/DBM_Filter/utf8.pm
+ 'Devel::SelfStubber' => '1.03', #lib/Devel/SelfStubber.pm
+ 'Devel::DProf' => '20030813.00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.01', #lib/Devel/Peek.pm
+ 'Devel::PPPort' => '2.011', #lib/Devel/PPPort.pm
+ 'Digest::base' => '1.00', #lib/Digest/base.pm
+ 'Digest::MD5' => '2.33', #lib/Digest/MD5.pm
+ 'Exporter::Heavy' => '5.57', #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Constant' => '0.14', #lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '6.17', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.42', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_Any' => '0.07', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.07_02', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.0301', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3001', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'File::Basename' => '2.73', #lib/File/Basename.pm
+ 'File::CheckTree' => '4.3', #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #lib/File/Compare.pm
+ 'File::Copy' => '2.08', #lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #lib/File/DosGlob.pm
+ 'File::Find' => '1.07', #lib/File/Find.pm
+ 'File::Path' => '1.06', #lib/File/Path.pm
+ 'File::Spec' => '0.87', #lib/File/Spec.pm
+ 'File::stat' => '1.00', #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'File::Glob' => '1.03', #lib/File/Glob.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #lib/File/Spec/Win32.pm
+ 'Filter::Simple' => '0.78', #lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #lib/Filter/Util/Call.pm
+ 'Getopt::Long' => '2.34', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.05', #lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #lib/I18N/Collate.pm
+ 'I18N::LangTags' => '0.33', #lib/I18N/LangTags.pm
+ 'I18N::Langinfo' => '0.02', #lib/I18N/Langinfo.pm
+ 'I18N::LangTags::Detect'=> '1.03', #lib/I18N/LangTags/Detect.pm
+ 'I18N::LangTags::List' => '0.29', #lib/I18N/LangTags/List.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0106', #lib/IPC/Open3.pm
+ 'IPC::Msg' => '1.02', #lib/IPC/Msg.pm
+ 'IPC::Semaphore' => '1.02', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #lib/IPC/SysV.pm
+ 'Locale::Constants' => '2.07', #lib/Locale/Constants.pm
+ 'Locale::Country' => '2.07', #lib/Locale/Country.pm
+ 'Locale::Currency' => '2.07', #lib/Locale/Currency.pm
+ 'Locale::Language' => '2.07', #lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.09', #lib/Locale/Maketext.pm
+ 'Locale::Script' => '2.07', #lib/Locale/Script.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Maketext::Guts'=> undef, #lib/Locale/Maketext/Guts.pm
+ 'Math::BigFloat' => '1.44', #lib/Math/BigFloat.pm
+ 'Math::BigInt' => '1.70', #lib/Math/BigInt.pm
+ 'Math::BigRat' => '0.12', #lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #lib/Math/Trig.pm
+ 'Math::BigFloat::Trace' => '0.01', #lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt::CalcEmu' => '0.04', #lib/Math/BigInt/CalcEmu.pm
+ 'Math::BigInt::Calc' => '0.40', #lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::Trace' => '0.01', #lib/Math/BigInt/Trace.pm
+ 'Memoize::AnyDBM_File' => '0.65', #lib/Memoize/AnyDBM_File.pm
+ 'Memoize::ExpireFile' => '1.01', #lib/Memoize/ExpireFile.pm
+ 'Memoize::Expire' => '1.00', #lib/Memoize/Expire.pm
+ 'Memoize::ExpireTest' => '0.65', #lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #lib/Memoize/Storable.pm
+ 'Net::Cmd' => '2.26', #lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #lib/Net/Config.pm
+ 'Net::Domain' => '2.19', #lib/Net/Domain.pm
+ 'Net::FTP' => '2.75', #lib/Net/FTP.pm
+ 'Net::hostent' => '1.01', #lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.23', #lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #lib/Net/Ping.pm
+ 'Net::POP3' => '2.28', #lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #lib/Net/servent.pm
+ 'Net::SMTP' => '2.29', #lib/Net/SMTP.pm
+ 'Net::Time' => '2.10', #lib/Net/Time.pm
+ 'Net::FTP::A' => '1.16', #lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #lib/Net/FTP/L.pm
+ 'PerlIO::encoding' => '0.07', #lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.06', #lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.42', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.2401', #lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0502', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.56', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.14', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '1.2', #lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.13', #lib/Pod/Perldoc.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.02', #lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #lib/Pod/Text.pm
+ 'Pod::Usage' => '1.16', #lib/Pod/Usage.pm
+ 'Pod::Perldoc::BaseTo' => undef, #lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Text::Color' => '1.04', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #lib/Pod/Text/Termcap.pm
+ 'Search::Dict' => '1.02', #lib/Search/Dict.pm
+ 'Term::ANSIColor' => '1.08', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.09', #lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #lib/Term/ReadLine.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.42', #lib/Test/Harness.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Test::Harness::Assert' => '0.02', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.02', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.19', #lib/Test/Harness/Straps.pm
+ 'Text::Abbrev' => '1.01', #lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.22', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09292', #lib/Text/Wrap.pm
+ 'Thread::Queue' => '2.00', #lib/Thread/Queue.pm
+ 'Thread::Semaphore' => '2.01', #lib/Thread/Semaphore.pm
+ 'Tie::Array' => '1.03', #lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.01', #lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #lib/Time/gmtime.pm
+ 'Time::Local' => '1.10', #lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #lib/Time/tm.pm
+ 'Time::HiRes' => '1.59', #lib/Time/HiRes.pm
+ 'Unicode' => '4.0.1', # lib/unicore/version
+ 'Unicode::Collate' => '0.40', #lib/Unicode/Collate.pm
+ 'Unicode::UCD' => '0.22', #lib/Unicode/UCD.pm
+ 'Unicode::Normalize' => '0.30', #lib/Unicode/Normalize.pm
+ 'User::grent' => '1.00', #lib/User/grent.pm
+ 'User::pwent' => '1.00', #lib/User/pwent.pm
+ 'warnings::register' => '1.00', #lib/warnings/register.pm
+ 'B::Stash' => '1.00', #lib/B/Stash.pm
+ 'B::Asmdata' => '1.01', #lib/B/Asmdata.pm
+ 'B::C' => '1.02', #lib/B/C.pm
+ 'B::Deparse' => '0.67', #lib/B/Deparse.pm
+ 'B::Debug' => '1.01', #lib/B/Debug.pm
+ 'B::Bblock' => '1.02', #lib/B/Bblock.pm
+ 'B::Assembler' => '0.07', #lib/B/Assembler.pm
+ 'B::Terse' => '1.02', #lib/B/Terse.pm
+ 'B::CC' => '1.00', #lib/B/CC.pm
+ 'B::Concise' => '0.61', #lib/B/Concise.pm
+ 'B::Lint' => '1.02', #lib/B/Lint.pm
+ 'B::Showlex' => '1.00', #lib/B/Showlex.pm
+ 'B::Bytecode' => '1.01', #lib/B/Bytecode.pm
+ 'B::Disassembler' => '1.03', #lib/B/Disassembler.pm
+ 'B::Xref' => '1.01', #lib/B/Xref.pm
+ 'B::Stackobj' => '1.00', #lib/B/Stackobj.pm
+ 'Data::Dumper' => '2.121', #lib/Data/Dumper.pm
+ 'Encode::Alias' => '2.00', #lib/Encode/Alias.pm
+ 'Encode::Encoding' => '2.00', #lib/Encode/Encoding.pm
+ 'Encode::Guess' => '2.00', #lib/Encode/Guess.pm
+ 'Encode::Config' => '2.00', #lib/Encode/Config.pm
+ 'Encode::Encoder' => '2.00', #lib/Encode/Encoder.pm
+ 'Encode::CJKConstants' => '2.00', #lib/Encode/CJKConstants.pm
+ 'Encode::Byte' => '2.00', #lib/Encode/Byte.pm
+ 'Encode::CN' => '2.00', #lib/Encode/CN.pm
+ 'Encode::EBCDIC' => '2.00', #lib/Encode/EBCDIC.pm
+ 'Encode::JP' => '2.00', #lib/Encode/JP.pm
+ 'Encode::KR' => '2.00', #lib/Encode/KR.pm
+ 'Encode::Symbol' => '2.00', #lib/Encode/Symbol.pm
+ 'Encode::TW' => '2.00', #lib/Encode/TW.pm
+ 'Encode::Unicode' => '2.00', #lib/Encode/Unicode.pm
+ 'Encode::JP::H2Z' => '2.00', #lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '2.00', #lib/Encode/JP/JIS7.pm
+ 'Encode::Unicode::UTF7' => '2.01', #lib/Encode/Unicode/UTF7.pm
+ 'Encode::KR::2022_KR' => '2.00', #lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '2.00', #lib/Encode/MIME/Header.pm
+ 'Encode::CN::HZ' => '2.01', #lib/Encode/CN/HZ.pm
+ 'IO::Pipe' => '1.123', #lib/IO/Pipe.pm
+ 'IO::File' => '1.10', #lib/IO/File.pm
+ 'IO::Select' => '1.16', #lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #lib/IO/Socket.pm
+ 'IO::Poll' => '0.06', #lib/IO/Poll.pm
+ 'IO::Dir' => '1.04', #lib/IO/Dir.pm
+ 'IO::Handle' => '1.24', #lib/IO/Handle.pm
+ 'IO::Seekable' => '1.09', #lib/IO/Seekable.pm
+ 'IO::Socket::INET' => '1.27', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #lib/IO/Socket/UNIX.pm
+ 'List::Util' => '1.14', #lib/List/Util.pm
+ 'Scalar::Util' => '1.14', #lib/Scalar/Util.pm
+ 'MIME::QuotedPrint' => '3.01', #lib/MIME/QuotedPrint.pm
+ 'MIME::Base64' => '3.01', #lib/MIME/Base64.pm
+ 'Sys::Hostname' => '1.11', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.05', #lib/Sys/Syslog.pm
+ 'XS::APItest' => '0.04', #lib/XS/APItest.pm
+ 'XS::Typemap' => '0.01', #lib/XS/Typemap.pm
+ 'threads::shared' => '0.92', #lib/threads/shared.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'JNI' => '0.2', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'ODBM_File' => '1.05', #ext/ODBM_File/ODBM_File.pm
+ 'OS2::DLL' => '1.02', #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.02', #os2/OS2/REXX/REXX.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'VMS::DCLsym' => '1.02', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #vms/ext/Stdio/Stdio.pm
+ },
+
+ 5.008006 => {
+ 'AnyDBM_File' => '1.00', #lib/AnyDBM_File.pm
+ 'Attribute::Handlers' => '0.78_01', #lib/Attribute/Handlers.pm
+ 'attributes' => '0.06', #lib/attributes.pm
+ 'attrs' => '1.01', #lib/attrs.pm
+ 'AutoLoader' => '5.60', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #lib/AutoSplit.pm
+ 'autouse' => '1.04', #lib/autouse.pm
+ 'B' => '1.07', #lib/B.pm
+ 'base' => '2.06', #lib/base.pm
+ 'B::Asmdata' => '1.01', #lib/B/Asmdata.pm
+ 'B::Assembler' => '0.07', #lib/B/Assembler.pm
+ 'B::Bblock' => '1.02', #lib/B/Bblock.pm
+ 'B::Bytecode' => '1.01', #lib/B/Bytecode.pm
+ 'B::C' => '1.04', #lib/B/C.pm
+ 'B::CC' => '1.00', #lib/B/CC.pm
+ 'B::Concise' => '0.64', #lib/B/Concise.pm
+ 'B::Debug' => '1.02', #lib/B/Debug.pm
+ 'B::Deparse' => '0.69', #lib/B/Deparse.pm
+ 'B::Disassembler' => '1.03', #lib/B/Disassembler.pm
+ 'Benchmark' => '1.06', #lib/Benchmark.pm
+ 'bigint' => '0.05', #lib/bigint.pm
+ 'bignum' => '0.15', #lib/bignum.pm
+ 'bigrat' => '0.06', #lib/bigrat.pm
+ 'blib' => '1.02', #lib/blib.pm
+ 'B::Lint' => '1.03', #lib/B/Lint.pm
+ 'B::Showlex' => '1.02', #lib/B/Showlex.pm
+ 'B::Stackobj' => '1.00', #lib/B/Stackobj.pm
+ 'B::Stash' => '1.00', #lib/B/Stash.pm
+ 'B::Terse' => '1.02', #lib/B/Terse.pm
+ 'B::Xref' => '1.01', #lib/B/Xref.pm
+ 'ByteLoader' => '0.05', #lib/ByteLoader.pm
+ 'bytes' => '1.01', #lib/bytes.pm
+ 'Carp' => '1.03', #lib/Carp.pm
+ 'Carp::Heavy' => '1.03', #lib/Carp/Heavy.pm
+ 'CGI' => '3.05', #lib/CGI.pm
+ 'CGI::Apache' => '1.00', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.28', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.05', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.08', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.5', #lib/CGI/Util.pm
+ 'charnames' => '1.04', #lib/charnames.pm
+ 'Class::ISA' => '0.32', #lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #lib/Class/Struct.pm
+ 'Config' => undef, #lib/Config.pm
+ 'constant' => '1.04', #lib/constant.pm
+ 'CPAN' => '1.76_01', #lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.60 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #lib/CPAN/Nox.pm
+ 'Cwd' => '3.01', #lib/Cwd.pm
+ 'Data::Dumper' => '2.121_02', #lib/Data/Dumper.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'DB_File' => '1.810', #lib/DB_File.pm
+ 'DBM_Filter' => '0.01', #lib/DBM_Filter.pm
+ 'DBM_Filter::compress' => '0.01', #lib/DBM_Filter/compress.pm
+ 'DBM_Filter::encode' => '0.01', #lib/DBM_Filter/encode.pm
+ 'DBM_Filter::int32' => '0.01', #lib/DBM_Filter/int32.pm
+ 'DBM_Filter::null' => '0.01', #lib/DBM_Filter/null.pm
+ 'DBM_Filter::utf8' => '0.01', #lib/DBM_Filter/utf8.pm
+ 'Devel::DProf' => '20030813.00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.02', #lib/Devel/Peek.pm
+ 'Devel::PPPort' => '3.03', #lib/Devel/PPPort.pm
+ 'Devel::SelfStubber' => '1.03', #lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.14', #lib/diagnostics.pm
+ 'Digest' => '1.08', #lib/Digest.pm
+ 'Digest::base' => '1.00', #lib/Digest/base.pm
+ 'Digest::MD5' => '2.33', #lib/Digest/MD5.pm
+ 'DirHandle' => '1.00', #lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #lib/Dumpvalue.pm
+ 'DynaLoader' => '1.05', #lib/DynaLoader.pm
+ 'Encode' => '2.08', #lib/Encode.pm
+ 'Encode::Alias' => '2.02', #lib/Encode/Alias.pm
+ 'Encode::Byte' => '2.00', #lib/Encode/Byte.pm
+ 'Encode::CJKConstants' => '2.00', #lib/Encode/CJKConstants.pm
+ 'Encode::CN' => '2.00', #lib/Encode/CN.pm
+ 'Encode::CN::HZ' => '2.01', #lib/Encode/CN/HZ.pm
+ 'Encode::Config' => '2.00', #lib/Encode/Config.pm
+ 'Encode::EBCDIC' => '2.00', #lib/Encode/EBCDIC.pm
+ 'Encode::Encoder' => '2.00', #lib/Encode/Encoder.pm
+ 'Encode::Encoding' => '2.02', #lib/Encode/Encoding.pm
+ 'Encode::Guess' => '2.00', #lib/Encode/Guess.pm
+ 'Encode::JP' => '2.01', #lib/Encode/JP.pm
+ 'Encode::JP::H2Z' => '2.00', #lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '2.00', #lib/Encode/JP/JIS7.pm
+ 'Encode::KR' => '2.00', #lib/Encode/KR.pm
+ 'Encode::KR::2022_KR' => '2.00', #lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '2.00', #lib/Encode/MIME/Header.pm
+ 'Encode::Symbol' => '2.00', #lib/Encode/Symbol.pm
+ 'Encode::TW' => '2.00', #lib/Encode/TW.pm
+ 'Encode::Unicode' => '2.02', #lib/Encode/Unicode.pm
+ 'Encode::Unicode::UTF7' => '2.01', #lib/Encode/Unicode/UTF7.pm
+ 'encoding' => '2.01', #lib/encoding.pm
+ 'English' => '1.01', #lib/English.pm
+ 'Env' => '1.00', #lib/Env.pm
+ 'Errno' => '1.09_00', #lib/Errno.pm
+ 'Exporter' => '5.58', #lib/Exporter.pm
+ 'Exporter::Heavy' => '5.58', #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Constant' => '0.1401', #lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3001', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.17', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'ExtUtils::Manifest' => '1.42', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.07', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.07_02', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.0301', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'Fatal' => '1.03', #lib/Fatal.pm
+ 'Fcntl' => '1.05', #lib/Fcntl.pm
+ 'fields' => '2.03', #lib/fields.pm
+ 'File::Basename' => '2.73', #lib/File/Basename.pm
+ 'FileCache' => '1.04_01', #lib/FileCache.pm
+ 'File::CheckTree' => '4.3', #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #lib/File/Compare.pm
+ 'File::Copy' => '2.08', #lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #lib/File/DosGlob.pm
+ 'File::Find' => '1.07', #lib/File/Find.pm
+ 'File::Glob' => '1.03', #lib/File/Glob.pm
+ 'FileHandle' => '2.01', #lib/FileHandle.pm
+ 'File::Path' => '1.06', #lib/File/Path.pm
+ 'File::Spec' => '3.01', #lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.5', #lib/File/Spec/Win32.pm
+ 'File::stat' => '1.00', #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'filetest' => '1.01', #lib/filetest.pm
+ 'Filter::Simple' => '0.78', #lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #lib/Filter/Util/Call.pm
+ 'FindBin' => '1.44', #lib/FindBin.pm
+ 'GDBM_File' => '1.07', #lib/GDBM_File.pm
+ 'Getopt::Long' => '2.34', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.05', #lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #lib/I18N/Collate.pm
+ 'I18N::Langinfo' => '0.02', #lib/I18N/Langinfo.pm
+ 'I18N::LangTags' => '0.35', #lib/I18N/LangTags.pm
+ 'I18N::LangTags::Detect'=> '1.03', #lib/I18N/LangTags/Detect.pm
+ 'I18N::LangTags::List' => '0.35', #lib/I18N/LangTags/List.pm
+ 'if' => '0.03', #lib/if.pm
+ 'integer' => '1.00', #lib/integer.pm
+ 'IO' => '1.21', #lib/IO.pm
+ 'IO::Dir' => '1.04', #lib/IO/Dir.pm
+ 'IO::File' => '1.10', #lib/IO/File.pm
+ 'IO::Handle' => '1.24', #lib/IO/Handle.pm
+ 'IO::Pipe' => '1.123', #lib/IO/Pipe.pm
+ 'IO::Poll' => '0.06', #lib/IO/Poll.pm
+ 'IO::Seekable' => '1.09', #lib/IO/Seekable.pm
+ 'IO::Select' => '1.16', #lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.27', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #lib/IO/Socket/UNIX.pm
+ 'IPC::Msg' => '1.02', #lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0106', #lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.02', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #lib/IPC/SysV.pm
+ 'JNI' => '0.2', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'less' => '0.01', #lib/less.pm
+ 'lib' => '0.5565', #lib/lib.pm
+ 'List::Util' => '1.14', #lib/List/Util.pm
+ 'locale' => '1.00', #lib/locale.pm
+ 'Locale::Constants' => '2.07', #lib/Locale/Constants.pm
+ 'Locale::Country' => '2.07', #lib/Locale/Country.pm
+ 'Locale::Currency' => '2.07', #lib/Locale/Currency.pm
+ 'Locale::Language' => '2.07', #lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.09', #lib/Locale/Maketext.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Maketext::Guts'=> undef, #lib/Locale/Maketext/Guts.pm
+ 'Locale::Script' => '2.07', #lib/Locale/Script.pm
+ 'Math::BigFloat' => '1.47', #lib/Math/BigFloat.pm
+ 'Math::BigFloat::Trace' => '0.01', #lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt' => '1.73', #lib/Math/BigInt.pm
+ 'Math::BigInt::Calc' => '0.43', #lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::CalcEmu' => '0.04', #lib/Math/BigInt/CalcEmu.pm
+ 'Math::BigInt::Trace' => '0.01', #lib/Math/BigInt/Trace.pm
+ 'Math::BigRat' => '0.13', #lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #lib/Math/Trig.pm
+ 'Memoize' => '1.01', #lib/Memoize.pm
+ 'Memoize::AnyDBM_File' => '0.65', #lib/Memoize/AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #lib/Memoize/Expire.pm
+ 'Memoize::ExpireFile' => '1.01', #lib/Memoize/ExpireFile.pm
+ 'Memoize::ExpireTest' => '0.65', #lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #lib/Memoize/Storable.pm
+ 'MIME::Base64' => '3.05', #lib/MIME/Base64.pm
+ 'MIME::QuotedPrint' => '3.03', #lib/MIME/QuotedPrint.pm
+ 'NDBM_File' => '1.05', #lib/NDBM_File.pm
+ 'Net::Cmd' => '2.26', #lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #lib/Net/Config.pm
+ 'Net::Domain' => '2.19', #lib/Net/Domain.pm
+ 'Net::FTP' => '2.75', #lib/Net/FTP.pm
+ 'Net::FTP::A' => '1.16', #lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #lib/Net/FTP/L.pm
+ 'Net::hostent' => '1.01', #lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.23', #lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #lib/Net/Ping.pm
+ 'Net::POP3' => '2.28', #lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #lib/Net/servent.pm
+ 'Net::SMTP' => '2.29', #lib/Net/SMTP.pm
+ 'Net::Time' => '2.10', #lib/Net/Time.pm
+ 'NEXT' => '0.60', #lib/NEXT.pm
+ 'O' => '1.00', #lib/O.pm
+ 'ODBM_File' => '1.05', #ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.05', #lib/Opcode.pm
+ 'open' => '1.04', #lib/open.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'OS2::DLL' => '1.02', #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.02', #os2/OS2/REXX/REXX.pm
+ 'overload' => '1.02', #lib/overload.pm
+ 'PerlIO' => '1.03', #lib/PerlIO.pm
+ 'PerlIO::encoding' => '0.07', #lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.06', #lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.42', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.2401', #lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0502', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.56', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.14', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '1.2', #lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.13', #lib/Pod/Perldoc.pm
+ 'Pod::Perldoc::BaseTo' => undef, #lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.02', #lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #lib/Pod/Text.pm
+ 'Pod::Text::Color' => '1.04', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.16', #lib/Pod/Usage.pm
+ 'POSIX' => '1.08', #lib/POSIX.pm
+ 're' => '0.04', #lib/re.pm
+ 'Safe' => '2.11', #lib/Safe.pm
+ 'Scalar::Util' => '1.14', #lib/Scalar/Util.pm
+ 'SDBM_File' => '1.04', #lib/SDBM_File.pm
+ 'Search::Dict' => '1.02', #lib/Search/Dict.pm
+ 'SelectSaver' => '1.00', #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #lib/SelfLoader.pm
+ 'Shell' => '0.6', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'Socket' => '1.77', #lib/Socket.pm
+ 'sort' => '1.02', #lib/sort.pm
+ 'Storable' => '2.13', #lib/Storable.pm
+ 'strict' => '1.03', #lib/strict.pm
+ 'subs' => '1.00', #lib/subs.pm
+ 'Switch' => '2.10', #lib/Switch.pm
+ 'Symbol' => '1.05', #lib/Symbol.pm
+ 'Sys::Hostname' => '1.11', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.05', #lib/Sys/Syslog.pm
+ 'Term::ANSIColor' => '1.08', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.09', #lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #lib/Term/ReadLine.pm
+ 'Test' => '1.25', #lib/Test.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.42', #lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.02', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.02', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.19', #lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Text::Abbrev' => '1.01', #lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.23', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09292', #lib/Text/Wrap.pm
+ 'Thread' => '2.00', #lib/Thread.pm
+ 'Thread::Queue' => '2.00', #lib/Thread/Queue.pm
+ 'threads' => '1.05', #lib/threads.pm
+ 'Thread::Semaphore' => '2.01', #lib/Thread/Semaphore.pm
+ 'Thread::Signal' => '1.00', #ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #ext/Thread/Thread/Specific.pm
+ 'threads::shared' => '0.92', #lib/threads/shared.pm
+ 'Tie::Array' => '1.03', #lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.01', #lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #lib/Time/gmtime.pm
+ 'Time::HiRes' => '1.65', #lib/Time/HiRes.pm
+ 'Time::Local' => '1.10', #lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #lib/Time/tm.pm
+ 'Unicode::Collate' => '0.40', #lib/Unicode/Collate.pm
+ 'Unicode::Normalize' => '0.30', #lib/Unicode/Normalize.pm
+ 'Unicode::UCD' => '0.22', #lib/Unicode/UCD.pm
+ 'UNIVERSAL' => '1.01', #lib/UNIVERSAL.pm
+ 'Unicode' => '4.0.1', # lib/unicore/version
+ 'User::grent' => '1.00', #lib/User/grent.pm
+ 'User::pwent' => '1.00', #lib/User/pwent.pm
+ 'utf8' => '1.04', #lib/utf8.pm
+ 'vars' => '1.01', #lib/vars.pm
+ 'VMS::DCLsym' => '1.02', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms/ext/Filespec.pm
+ 'vmsish' => '1.01', #lib/vmsish.pm
+ 'VMS::Stdio' => '2.3', #vms/ext/Stdio/Stdio.pm
+ 'warnings' => '1.03', #lib/warnings.pm
+ 'warnings::register' => '1.00', #lib/warnings/register.pm
+ 'XS::APItest' => '0.05', #lib/XS/APItest.pm
+ 'XSLoader' => '0.02', #lib/XSLoader.pm
+ 'XS::Typemap' => '0.01', #lib/XS/Typemap.pm
+ },
+
+ 5.009002 => {
+ 'AnyDBM_File' => '1.00',
+ 'Attribute::Handlers' => '0.78_01',
+ 'AutoLoader' => '5.60',
+ 'AutoSplit' => '1.04',
+ 'B' => '1.07',
+ 'B::Asmdata' => '1.01',
+ 'B::Assembler' => '0.07',
+ 'B::Bblock' => '1.02',
+ 'B::Bytecode' => '1.01',
+ 'B::C' => '1.04',
+ 'B::CC' => '1.00',
+ 'B::Concise' => '0.64',
+ 'B::Debug' => '1.02',
+ 'B::Deparse' => '0.69',
+ 'B::Disassembler' => '1.03',
+ 'B::Lint' => '1.03',
+ 'B::Showlex' => '1.02',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.02',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.07',
+ 'ByteLoader' => '0.05',
+ 'CGI' => '3.07',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.25',
+ 'CGI::Fast' => '1.05',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5',
+ 'CPAN' => '1.76_01',
+ 'CPAN::FirstTime' => '1.60 ',
+ 'CPAN::Nox' => '1.03',
+ 'Carp' => '1.04',
+ 'Carp::Heavy' => '1.04',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.05',
+ 'DB' => '1.0',
+ 'DBM_Filter' => '0.01',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.811',
+ 'DCLsym' => '1.02',
+ 'Data::Dumper' => '2.121_04',
+ 'Devel::DProf' => '20030813.00',
+ 'Devel::PPPort' => '3.06',
+ 'Devel::Peek' => '1.02',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.10',
+ 'Digest::MD5' => '2.33',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '0.01',
+ 'DirHandle' => '1.00',
+ 'Dumpvalue' => '1.11',
+ 'DynaLoader' => '1.07',
+ 'Encode' => '2.09',
+ 'Encode::Alias' => '2.02',
+ 'Encode::Byte' => '2.00',
+ 'Encode::CJKConstants' => '2.00',
+ 'Encode::CN' => '2.00',
+ 'Encode::CN::HZ' => '2.01',
+ 'Encode::Config' => '2.00',
+ 'Encode::EBCDIC' => '2.00',
+ 'Encode::Encoder' => '2.00',
+ 'Encode::Encoding' => '2.02',
+ 'Encode::Guess' => '2.00',
+ 'Encode::JP' => '2.01',
+ 'Encode::JP::H2Z' => '2.00',
+ 'Encode::JP::JIS7' => '2.00',
+ 'Encode::KR' => '2.00',
+ 'Encode::KR::2022_KR' => '2.00',
+ 'Encode::MIME::Header' => '2.00',
+ 'Encode::Symbol' => '2.00',
+ 'Encode::TW' => '2.00',
+ 'Encode::Unicode' => '2.02',
+ 'Encode::Unicode::UTF7' => '2.01',
+ 'English' => '1.03',
+ 'Env' => '1.00',
+ 'Errno' => '1.09_01',
+ 'Exporter' => '5.59',
+ 'Exporter::Heavy' => '5.59',
+ 'ExtUtils::Command' => '1.07',
+ 'ExtUtils::Command::MM' => '0.03_01',
+ 'ExtUtils::Constant' => '0.16',
+ 'ExtUtils::Constant::Base'=> '0.01',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.01',
+ 'ExtUtils::Embed' => '1.26',
+ 'ExtUtils::Install' => '1.32',
+ 'ExtUtils::Installed' => '0.08',
+ 'ExtUtils::Liblist' => '1.01',
+ 'ExtUtils::Liblist::Kid'=> '1.3',
+ 'ExtUtils::MM' => '0.04',
+ 'ExtUtils::MM_Any' => '0.10',
+ 'ExtUtils::MM_BeOS' => '1.04',
+ 'ExtUtils::MM_Cygwin' => '1.07',
+ 'ExtUtils::MM_DOS' => '0.02',
+ 'ExtUtils::MM_MacOS' => '1.08',
+ 'ExtUtils::MM_NW5' => '2.07',
+ 'ExtUtils::MM_OS2' => '1.04',
+ 'ExtUtils::MM_UWIN' => '0.02',
+ 'ExtUtils::MM_Unix' => '1.46_01',
+ 'ExtUtils::MM_VMS' => '5.71',
+ 'ExtUtils::MM_Win32' => '1.10',
+ 'ExtUtils::MM_Win95' => '0.03',
+ 'ExtUtils::MY' => '0.01',
+ 'ExtUtils::MakeMaker' => '6.25',
+ 'ExtUtils::MakeMaker::bytes'=> '0.01',
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01',
+ 'ExtUtils::Manifest' => '1.44',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.15',
+ 'ExtUtils::Mksymlists' => '1.19',
+ 'ExtUtils::Packlist' => '0.04',
+ 'ExtUtils::testlib' => '1.15',
+ 'Fatal' => '1.04',
+ 'Fcntl' => '1.05',
+ 'File::Basename' => '2.73',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1003',
+ 'File::Copy' => '2.08',
+ 'File::DosGlob' => '1.00',
+ 'File::Find' => '1.09',
+ 'File::Glob' => '1.04',
+ 'File::Path' => '1.06',
+ 'File::Spec' => '3.05',
+ 'File::Spec::Cygwin' => '1.1',
+ 'File::Spec::Epoc' => '1.1',
+ 'File::Spec::Functions' => '1.3',
+ 'File::Spec::Mac' => '1.4',
+ 'File::Spec::OS2' => '1.2',
+ 'File::Spec::Unix' => '1.5',
+ 'File::Spec::VMS' => '1.4',
+ 'File::Spec::Win32' => '1.5',
+ 'File::Temp' => '0.16',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.04_01',
+ 'FileHandle' => '2.01',
+ 'Filespec' => '1.11',
+ 'Filter::Simple' => '0.78',
+ 'Filter::Util::Call' => '1.0601',
+ 'FindBin' => '1.44',
+ 'GDBM_File' => '1.07',
+ 'Getopt::Long' => '2.3401',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.05',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.21',
+ 'IO::Dir' => '1.04',
+ 'IO::File' => '1.10',
+ 'IO::Handle' => '1.24',
+ 'IO::Pipe' => '1.123',
+ 'IO::Poll' => '0.06',
+ 'IO::Seekable' => '1.09',
+ 'IO::Select' => '1.16',
+ 'IO::Socket' => '1.28',
+ 'IO::Socket::INET' => '1.27',
+ 'IO::Socket::UNIX' => '1.21',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.01',
+ 'IPC::Open3' => '1.0106',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.04',
+ 'List::Util' => '1.14',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.09',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Script' => '2.07',
+ 'MIME::Base64' => '3.05',
+ 'MIME::QuotedPrint' => '3.03',
+ 'Math::BigFloat' => '1.49',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.75',
+ 'Math::BigInt::Calc' => '0.45',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.14',
+ 'Math::Complex' => '1.34',
+ 'Math::Trig' => '1.02',
+ 'Memoize' => '1.01_01',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::CoreList' => '1.99',
+ 'NDBM_File' => '1.05',
+ 'NEXT' => '0.60_01',
+ 'Net::Cmd' => '2.26',
+ 'Net::Config' => '1.10',
+ 'Net::Domain' => '2.19',
+ 'Net::FTP' => '2.75',
+ 'Net::FTP::A' => '1.16',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.23',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.28',
+ 'Net::Ping' => '2.31',
+ 'Net::SMTP' => '2.29',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.05',
+ 'Opcode' => '1.06',
+ 'POSIX' => '1.08',
+ 'PerlIO' => '1.03',
+ 'PerlIO::encoding' => '0.07',
+ 'PerlIO::scalar' => '0.02',
+ 'PerlIO::via' => '0.02',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.42',
+ 'Pod::Find' => '1.3',
+ 'Pod::Functions' => '1.02',
+ 'Pod::Html' => '1.0502',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '1.37',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.3',
+ 'Pod::Parser' => '1.3',
+ 'Pod::Perldoc' => '3.14',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.3',
+ 'Pod::Text' => '2.21',
+ 'Pod::Text::Color' => '1.04',
+ 'Pod::Text::Overstrike' => '1.1',
+ 'Pod::Text::Termcap' => '1.11',
+ 'Pod::Usage' => '1.3',
+ 'SDBM_File' => '1.04',
+ 'Safe' => '2.11',
+ 'Scalar::Util' => '1.14_1',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.0904',
+ 'Shell' => '0.6',
+ 'Socket' => '1.77',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.14',
+ 'Switch' => '2.10',
+ 'Symbol' => '1.05',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.06',
+ 'Term::ANSIColor' => '1.09',
+ 'Term::Cap' => '1.09',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.01',
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.22',
+ 'Test::Harness' => '2.46',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Straps' => '0.20_01',
+ 'Test::More' => '0.54',
+ 'Test::Simple' => '0.54',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '1.95_01',
+ 'Text::ParseWords' => '3.24',
+ 'Text::Soundex' => '1.01',
+ 'Text::Tabs' => '98.112801',
+ 'Text::Wrap' => '2001.09292',
+ 'Thread' => '2.00',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.01',
+ 'Tie::Memoize' => '1.0',
+ 'Tie::RefHash' => '1.32',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.66',
+ 'Time::Local' => '1.11',
+ 'Time::gmtime' => '1.02',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.02',
+ 'Unicode' => '4.0.1',
+ 'Unicode::Collate' => '0.40',
+ 'Unicode::Normalize' => '0.30',
+ 'Unicode::UCD' => '0.22',
+ 'User::grent' => '1.00',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.23',
+ 'XS::APItest' => '0.05',
+ 'XS::Typemap' => '0.01',
+ 'XSLoader' => '0.03',
+ 'XSSymSet' => '1.0',
+ 'assertions' => '0.01',
+ 'assertions::activate' => '0.01',
+ 'attributes' => '0.06',
+ 'attrs' => '1.01',
+ 'autouse' => '1.04',
+ 'base' => '2.06',
+ 'bigint' => '0.06',
+ 'bignum' => '0.16',
+ 'bigrat' => '0.07',
+ 'blib' => '1.02',
+ 'bytes' => '1.01',
+ 'charnames' => '1.04',
+ 'constant' => '1.05',
+ 'diagnostics' => '1.14',
+ 'encoding' => '2.01',
+ 'encoding::warnings' => '0.05',
+ 'fields' => '2.03',
+ 'filetest' => '1.01',
+ 'if' => '0.0401',
+ 'integer' => '1.00',
+ 'less' => '0.01',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'open' => '1.04',
+ 'ops' => '1.00',
+ 'overload' => '1.03',
+ 're' => '0.05',
+ 'sigtrap' => '1.02',
+ 'sort' => '1.02',
+ 'strict' => '1.03',
+ 'subs' => '1.00',
+ 'threads' => '1.05',
+ 'threads::shared' => '0.92',
+ 'utf8' => '1.04',
+ 'vars' => '1.01',
+ 'version' => '0.42',
+ 'vmsish' => '1.01',
+ 'warnings' => '1.04',
+ 'warnings::register' => '1.00',
+ },
+
+ 5.008007 => {
+ 'AnyDBM_File' => '1.00',
+ 'Attribute::Handlers' => '0.78_01',
+ 'AutoLoader' => '5.60',
+ 'AutoSplit' => '1.04',
+ 'B' => '1.09',
+ 'B::Asmdata' => '1.01',
+ 'B::Assembler' => '0.07',
+ 'B::Bblock' => '1.02',
+ 'B::Bytecode' => '1.01',
+ 'B::C' => '1.04',
+ 'B::CC' => '1.00',
+ 'B::Concise' => '0.65',
+ 'B::Debug' => '1.02',
+ 'B::Deparse' => '0.7',
+ 'B::Disassembler' => '1.04',
+ 'B::Lint' => '1.03',
+ 'B::Showlex' => '1.02',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.03',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.07',
+ 'ByteLoader' => '0.05',
+ 'CGI' => '3.10',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.25',
+ 'CGI::Fast' => '1.05',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5',
+ 'CPAN' => '1.76_01',
+ 'CPAN::FirstTime' => '1.60 ',
+ 'CPAN::Nox' => '1.03',
+ 'Carp' => '1.04',
+ 'Carp::Heavy' => '1.04',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Config' => undef,
+ 'Cwd' => '3.05',
+ 'DB' => '1.0',
+ 'DBM_Filter' => '0.01',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.811',
+ 'DCLsym' => '1.02',
+ 'Data::Dumper' => '2.121_04',
+ 'Devel::DProf' => '20050310.00',
+ 'Devel::PPPort' => '3.06',
+ 'Devel::Peek' => '1.02',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.10',
+ 'Digest::MD5' => '2.33',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '0.01',
+ 'DirHandle' => '1.00',
+ 'Dumpvalue' => '1.11',
+ 'DynaLoader' => '1.05',
+ 'Encode' => '2.10',
+ 'Encode::Alias' => '2.03',
+ 'Encode::Byte' => '2.00',
+ 'Encode::CJKConstants' => '2.00',
+ 'Encode::CN' => '2.00',
+ 'Encode::CN::HZ' => '2.01',
+ 'Encode::Config' => '2.00',
+ 'Encode::EBCDIC' => '2.00',
+ 'Encode::Encoder' => '2.00',
+ 'Encode::Encoding' => '2.02',
+ 'Encode::Guess' => '2.00',
+ 'Encode::JP' => '2.01',
+ 'Encode::JP::H2Z' => '2.00',
+ 'Encode::JP::JIS7' => '2.00',
+ 'Encode::KR' => '2.00',
+ 'Encode::KR::2022_KR' => '2.00',
+ 'Encode::MIME::Header' => '2.00',
+ 'Encode::Symbol' => '2.00',
+ 'Encode::TW' => '2.00',
+ 'Encode::Unicode' => '2.02',
+ 'Encode::Unicode::UTF7' => '2.01',
+ 'English' => '1.01',
+ 'Env' => '1.00',
+ 'Errno' => '1.09_01',
+ 'Exporter' => '5.58',
+ 'Exporter::Heavy' => '5.58',
+ 'ExtUtils::Command' => '1.05',
+ 'ExtUtils::Command::MM' => '0.03',
+ 'ExtUtils::Constant' => '0.16',
+ 'ExtUtils::Constant::Base'=> '0.01',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.01',
+ 'ExtUtils::Embed' => '1.250601',
+ 'ExtUtils::Install' => '1.32',
+ 'ExtUtils::Installed' => '0.08',
+ 'ExtUtils::Liblist' => '1.01',
+ 'ExtUtils::Liblist::Kid'=> '1.3001',
+ 'ExtUtils::MM' => '0.04',
+ 'ExtUtils::MM_Any' => '0.07',
+ 'ExtUtils::MM_BeOS' => '1.04',
+ 'ExtUtils::MM_Cygwin' => '1.06',
+ 'ExtUtils::MM_DOS' => '0.02',
+ 'ExtUtils::MM_MacOS' => '1.07',
+ 'ExtUtils::MM_NW5' => '2.07_02',
+ 'ExtUtils::MM_OS2' => '1.04',
+ 'ExtUtils::MM_UWIN' => '0.02',
+ 'ExtUtils::MM_Unix' => '1.42',
+ 'ExtUtils::MM_VMS' => '5.70',
+ 'ExtUtils::MM_Win32' => '1.09',
+ 'ExtUtils::MM_Win95' => '0.0301',
+ 'ExtUtils::MY' => '0.01',
+ 'ExtUtils::MakeMaker' => '6.17',
+ 'ExtUtils::MakeMaker::bytes'=> '0.01',
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01',
+ 'ExtUtils::Manifest' => '1.42',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.15',
+ 'ExtUtils::Mksymlists' => '1.19',
+ 'ExtUtils::Packlist' => '0.04',
+ 'ExtUtils::testlib' => '1.15',
+ 'Fatal' => '1.03',
+ 'Fcntl' => '1.05',
+ 'File::Basename' => '2.73',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1003',
+ 'File::Copy' => '2.08',
+ 'File::DosGlob' => '1.00',
+ 'File::Find' => '1.09',
+ 'File::Glob' => '1.04',
+ 'File::Path' => '1.07',
+ 'File::Spec' => '3.05',
+ 'File::Spec::Cygwin' => '1.1',
+ 'File::Spec::Epoc' => '1.1',
+ 'File::Spec::Functions' => '1.3',
+ 'File::Spec::Mac' => '1.4',
+ 'File::Spec::OS2' => '1.2',
+ 'File::Spec::Unix' => '1.5',
+ 'File::Spec::VMS' => '1.4',
+ 'File::Spec::Win32' => '1.5',
+ 'File::Temp' => '0.16',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.05',
+ 'FileHandle' => '2.01',
+ 'Filespec' => '1.11',
+ 'Filter::Simple' => '0.78',
+ 'Filter::Util::Call' => '1.0601',
+ 'FindBin' => '1.44',
+ 'GDBM_File' => '1.07',
+ 'Getopt::Long' => '2.34',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.05',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.21',
+ 'IO::Dir' => '1.04',
+ 'IO::File' => '1.11',
+ 'IO::Handle' => '1.24',
+ 'IO::Pipe' => '1.123',
+ 'IO::Poll' => '0.06',
+ 'IO::Seekable' => '1.09',
+ 'IO::Select' => '1.16',
+ 'IO::Socket' => '1.28',
+ 'IO::Socket::INET' => '1.28',
+ 'IO::Socket::UNIX' => '1.21',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.01',
+ 'IPC::Open3' => '1.0106',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.04',
+ 'List::Util' => '1.14',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.09',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Script' => '2.07',
+ 'MIME::Base64' => '3.05',
+ 'MIME::QuotedPrint' => '3.03',
+ 'Math::BigFloat' => '1.51',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.77',
+ 'Math::BigInt::Calc' => '0.47',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.15',
+ 'Math::Complex' => '1.34',
+ 'Math::Trig' => '1.02',
+ 'Memoize' => '1.01',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'NDBM_File' => '1.05',
+ 'NEXT' => '0.60',
+ 'Net::Cmd' => '2.26',
+ 'Net::Config' => '1.10',
+ 'Net::Domain' => '2.19',
+ 'Net::FTP' => '2.75',
+ 'Net::FTP::A' => '1.16',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.23',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.28',
+ 'Net::Ping' => '2.31',
+ 'Net::SMTP' => '2.29',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.05',
+ 'Opcode' => '1.05',
+ 'POSIX' => '1.08',
+ 'PerlIO' => '1.03',
+ 'PerlIO::encoding' => '0.07',
+ 'PerlIO::scalar' => '0.02',
+ 'PerlIO::via' => '0.02',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.42',
+ 'Pod::Find' => '1.3',
+ 'Pod::Functions' => '1.02',
+ 'Pod::Html' => '1.0503',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '1.37',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.3',
+ 'Pod::Parser' => '1.3',
+ 'Pod::Perldoc' => '3.14',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.3',
+ 'Pod::Text' => '2.21',
+ 'Pod::Text::Color' => '1.04',
+ 'Pod::Text::Overstrike' => '1.1',
+ 'Pod::Text::Termcap' => '1.11',
+ 'Pod::Usage' => '1.3',
+ 'SDBM_File' => '1.04',
+ 'Safe' => '2.11',
+ 'Scalar::Util' => '1.14',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.0904',
+ 'Shell' => '0.6',
+ 'Socket' => '1.77',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.13',
+ 'Switch' => '2.10',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.06',
+ 'Term::ANSIColor' => '1.09',
+ 'Term::Cap' => '1.09',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.01',
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.22',
+ 'Test::Harness' => '2.48',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Straps' => '0.23',
+ 'Test::More' => '0.54',
+ 'Test::Simple' => '0.54',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '1.95',
+ 'Text::ParseWords' => '3.24',
+ 'Text::Soundex' => '1.01',
+ 'Text::Tabs' => '98.112801',
+ 'Text::Wrap' => '2001.09293',
+ 'Thread' => '2.00',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.01',
+ 'Tie::Memoize' => '1.0',
+ 'Tie::RefHash' => '1.32',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.66',
+ 'Time::Local' => '1.11',
+ 'Time::gmtime' => '1.02',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.01',
+ 'Unicode' => '4.1.0', # lib/unicore/version
+ 'Unicode::Collate' => '0.40',
+ 'Unicode::Normalize' => '0.32',
+ 'Unicode::UCD' => '0.23',
+ 'User::grent' => '1.00',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.24',
+ 'XS::APItest' => '0.06',
+ 'XS::Typemap' => '0.01',
+ 'XSLoader' => '0.02',
+ 'XSSymSet' => '1.0',
+ 'attributes' => '0.06',
+ 'attrs' => '1.01',
+ 'autouse' => '1.04',
+ 'base' => '2.07',
+ 'bigint' => '0.07',
+ 'bignum' => '0.17',
+ 'bigrat' => '0.08',
+ 'blib' => '1.02',
+ 'bytes' => '1.02',
+ 'charnames' => '1.04',
+ 'constant' => '1.05',
+ 'diagnostics' => '1.14',
+ 'encoding' => '2.01',
+ 'fields' => '2.03',
+ 'filetest' => '1.01',
+ 'if' => '0.03',
+ 'integer' => '1.00',
+ 'less' => '0.01',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'open' => '1.04',
+ 'ops' => '1.00',
+ 'overload' => '1.03',
+ 're' => '0.04',
+ 'sigtrap' => '1.02',
+ 'sort' => '1.02',
+ 'strict' => '1.03',
+ 'subs' => '1.00',
+ 'threads' => '1.05',
+ 'threads::shared' => '0.93',
+ 'utf8' => '1.05',
+ 'vars' => '1.01',
+ 'vmsish' => '1.01',
+ 'warnings' => '1.03',
+ 'warnings::register' => '1.00',
+ },
+
+ 5.009003 => {
+ 'AnyDBM_File' => '1.00',
+ 'Archive::Tar' => '1.26_01',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.78_02',
+ 'AutoLoader' => '5.60',
+ 'AutoSplit' => '1.04_01',
+ 'B' => '1.10',
+ 'B::Asmdata' => '1.01',
+ 'B::Assembler' => '0.07',
+ 'B::Bblock' => '1.02',
+ 'B::Bytecode' => '1.01',
+ 'B::C' => '1.04',
+ 'B::CC' => '1.00',
+ 'B::Concise' => '0.67',
+ 'B::Debug' => '1.02',
+ 'B::Deparse' => '0.73',
+ 'B::Disassembler' => '1.05',
+ 'B::Lint' => '1.04',
+ 'B::Showlex' => '1.02',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.03',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.07',
+ 'ByteLoader' => '0.06',
+ 'CGI' => '3.15_01',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.26',
+ 'CGI::Fast' => '1.05',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5',
+ 'CPAN' => '1.83_58',
+ 'CPAN::Debug' => '4.44',
+ 'CPAN::FirstTime' => '4.50',
+ 'CPAN::HandleConfig' => '4.31',
+ 'CPAN::Nox' => '2.31',
+ 'CPAN::Tarzip' => '3.36',
+ 'CPAN::Version' => '2.55',
+ 'Carp' => '1.05',
+ 'Carp::Heavy' => '1.05',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Compress::Zlib' => '2.000_07',
+ 'Compress::Zlib::Common'=> '2.000_07',
+ 'Compress::Zlib::Compress::Gzip::Constants'=> '2.000_07',
+ 'Compress::Zlib::Compress::Zip::Constants'=> '1.00',
+ 'Compress::Zlib::CompressPlugin::Deflate'=> '2.000_05',
+ 'Compress::Zlib::CompressPlugin::Identity'=> '2.000_05',
+ 'Compress::Zlib::File::GlobMapper'=> '0.000_02',
+ 'Compress::Zlib::FileConstants'=> '2.000_07',
+ 'Compress::Zlib::IO::Compress::Base'=> '2.000_05',
+ 'Compress::Zlib::IO::Compress::Deflate'=> '2.000_07',
+ 'Compress::Zlib::IO::Compress::Gzip'=> '2.000_07',
+ 'Compress::Zlib::IO::Compress::RawDeflate'=> '2.000_07',
+ 'Compress::Zlib::IO::Compress::Zip'=> '2.000_04',
+ 'Compress::Zlib::IO::Uncompress::AnyInflate'=> '2.000_07',
+ 'Compress::Zlib::IO::Uncompress::AnyUncompress'=> '2.000_05',
+ 'Compress::Zlib::IO::Uncompress::Base'=> '2.000_05',
+ 'Compress::Zlib::IO::Uncompress::Gunzip'=> '2.000_07',
+ 'Compress::Zlib::IO::Uncompress::Inflate'=> '2.000_07',
+ 'Compress::Zlib::IO::Uncompress::RawInflate'=> '2.000_07',
+ 'Compress::Zlib::IO::Uncompress::Unzip'=> '2.000_05',
+ 'Compress::Zlib::ParseParameters'=> '2.000_07',
+ 'Compress::Zlib::UncompressPlugin::Identity'=> '2.000_05',
+ 'Compress::Zlib::UncompressPlugin::Inflate'=> '2.000_05',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.15',
+ 'DB' => '1.01',
+ 'DBM_Filter' => '0.01',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.814',
+ 'DCLsym' => '1.02',
+ 'Data::Dumper' => '2.121_08',
+ 'Devel::DProf' => '20050603.00',
+ 'Devel::PPPort' => '3.08',
+ 'Devel::Peek' => '1.03',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.14',
+ 'Digest::MD5' => '2.36',
+ 'Digest::SHA' => '5.32',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '1.00',
+ 'DirHandle' => '1.01',
+ 'Dumpvalue' => '1.12',
+ 'DynaLoader' => '1.07',
+ 'Encode' => '2.14',
+ 'Encode::Alias' => '2.04',
+ 'Encode::Byte' => '2.00',
+ 'Encode::CJKConstants' => '2.00',
+ 'Encode::CN' => '2.00',
+ 'Encode::CN::HZ' => '2.02',
+ 'Encode::Config' => '2.01',
+ 'Encode::EBCDIC' => '2.00',
+ 'Encode::Encoder' => '2.00',
+ 'Encode::Encoding' => '2.02',
+ 'Encode::Guess' => '2.00',
+ 'Encode::JP' => '2.01',
+ 'Encode::JP::H2Z' => '2.00',
+ 'Encode::JP::JIS7' => '2.00',
+ 'Encode::KR' => '2.00',
+ 'Encode::KR::2022_KR' => '2.00',
+ 'Encode::MIME::Header' => '2.02',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.01',
+ 'Encode::Symbol' => '2.00',
+ 'Encode::TW' => '2.00',
+ 'Encode::Unicode' => '2.02',
+ 'Encode::Unicode::UTF7' => '2.01',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.09_01',
+ 'Exporter' => '5.59',
+ 'Exporter::Heavy' => '5.59',
+ 'ExtUtils::CBuilder' => '0.15',
+ 'ExtUtils::CBuilder::Base'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.01',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.13',
+ 'ExtUtils::Command' => '1.09',
+ 'ExtUtils::Command::MM' => '0.05_01',
+ 'ExtUtils::Constant' => '0.2',
+ 'ExtUtils::Constant::Base'=> '0.02',
+ 'ExtUtils::Constant::ProxySubs'=> '0.01',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.02',
+ 'ExtUtils::Embed' => '1.26',
+ 'ExtUtils::Install' => '1.33',
+ 'ExtUtils::Installed' => '0.08',
+ 'ExtUtils::Liblist' => '1.01',
+ 'ExtUtils::Liblist::Kid'=> '1.3',
+ 'ExtUtils::MM' => '0.05',
+ 'ExtUtils::MM_AIX' => '0.03',
+ 'ExtUtils::MM_Any' => '0.13_01',
+ 'ExtUtils::MM_BeOS' => '1.05',
+ 'ExtUtils::MM_Cygwin' => '1.08',
+ 'ExtUtils::MM_DOS' => '0.02',
+ 'ExtUtils::MM_MacOS' => '1.08',
+ 'ExtUtils::MM_NW5' => '2.08',
+ 'ExtUtils::MM_OS2' => '1.05',
+ 'ExtUtils::MM_QNX' => '0.02',
+ 'ExtUtils::MM_UWIN' => '0.02',
+ 'ExtUtils::MM_Unix' => '1.50_01',
+ 'ExtUtils::MM_VMS' => '5.73',
+ 'ExtUtils::MM_VOS' => '0.02',
+ 'ExtUtils::MM_Win32' => '1.12',
+ 'ExtUtils::MM_Win95' => '0.04',
+ 'ExtUtils::MY' => '0.01',
+ 'ExtUtils::MakeMaker' => '6.30_01',
+ 'ExtUtils::MakeMaker::Config'=> '0.02',
+ 'ExtUtils::MakeMaker::bytes'=> '0.01',
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01',
+ 'ExtUtils::Manifest' => '1.46',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.15',
+ 'ExtUtils::Mksymlists' => '1.19',
+ 'ExtUtils::Packlist' => '0.04',
+ 'ExtUtils::ParseXS' => '2.15_02',
+ 'ExtUtils::testlib' => '1.15',
+ 'Fatal' => '1.04',
+ 'Fcntl' => '1.05',
+ 'File::Basename' => '2.74',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1005',
+ 'File::Copy' => '2.09',
+ 'File::DosGlob' => '1.00',
+ 'File::Find' => '1.10',
+ 'File::Glob' => '1.05',
+ 'File::Path' => '1.08',
+ 'File::Spec' => '3.15',
+ 'File::Spec::Cygwin' => '1.1',
+ 'File::Spec::Epoc' => '1.1',
+ 'File::Spec::Functions' => '1.3',
+ 'File::Spec::Mac' => '1.4',
+ 'File::Spec::OS2' => '1.2',
+ 'File::Spec::Unix' => '1.5',
+ 'File::Spec::VMS' => '1.4',
+ 'File::Spec::Win32' => '1.6',
+ 'File::Temp' => '0.16_01',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.06',
+ 'FileHandle' => '2.01',
+ 'Filespec' => '1.11',
+ 'Filter::Simple' => '0.82',
+ 'Filter::Util::Call' => '1.0601',
+ 'FindBin' => '1.47',
+ 'GDBM_File' => '1.08',
+ 'Getopt::Long' => '2.35',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.05',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.22',
+ 'IO::Dir' => '1.05',
+ 'IO::File' => '1.13_01',
+ 'IO::Handle' => '1.26',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.29_01',
+ 'IO::Socket::INET' => '1.29_02',
+ 'IO::Socket::UNIX' => '1.22_01',
+ 'IO::Zlib' => '1.04_02',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.02',
+ 'IPC::Open3' => '1.02',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.04',
+ 'List::Util' => '1.18',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.10_01',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Script' => '2.07',
+ 'MIME::Base64' => '3.07',
+ 'MIME::QuotedPrint' => '3.07',
+ 'Math::BigFloat' => '1.51',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.77',
+ 'Math::BigInt::Calc' => '0.47',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.10',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.15',
+ 'Math::Complex' => '1.35',
+ 'Math::Trig' => '1.03',
+ 'Memoize' => '1.01_01',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::CoreList' => '2.02',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.06',
+ 'NEXT' => '0.60_01',
+ 'Net::Cmd' => '2.26_01',
+ 'Net::Config' => '1.10',
+ 'Net::Domain' => '2.19_01',
+ 'Net::FTP' => '2.75',
+ 'Net::FTP::A' => '1.16',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.23',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.28',
+ 'Net::Ping' => '2.31_04',
+ 'Net::SMTP' => '2.29',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.06',
+ 'Opcode' => '1.08',
+ 'POSIX' => '1.10',
+ 'PerlIO' => '1.04',
+ 'PerlIO::encoding' => '0.09',
+ 'PerlIO::scalar' => '0.04',
+ 'PerlIO::via' => '0.03',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.43',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.34',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.0504',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.04',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.33',
+ 'Pod::Parser' => '1.32',
+ 'Pod::Perldoc' => '3.14_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.3',
+ 'Pod::Simple' => '3.04',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.01',
+ 'Pod::Text::Color' => '2.01',
+ 'Pod::Text::Overstrike' => '2',
+ 'Pod::Text::Termcap' => '2.01',
+ 'Pod::Usage' => '1.33_01',
+ 'SDBM_File' => '1.05',
+ 'Safe' => '2.12',
+ 'Scalar::Util' => '1.18',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.0905',
+ 'Shell' => '0.6',
+ 'Socket' => '1.78',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.15_02',
+ 'Switch' => '2.10_01',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.13',
+ 'Term::ANSIColor' => '1.10',
+ 'Term::Cap' => '1.09',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.02',
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.32',
+ 'Test::Builder::Module' => '0.03',
+ 'Test::Builder::Tester' => '1.02',
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => '2.56',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Straps' => '0.26',
+ 'Test::More' => '0.62',
+ 'Test::Simple' => '0.62',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '1.95_01',
+ 'Text::ParseWords' => '3.24',
+ 'Text::Soundex' => '1.01',
+ 'Text::Tabs' => '2005.0824',
+ 'Text::Wrap' => '2005.082401',
+ 'Thread' => '2.00',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_01',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.02',
+ 'Tie::Memoize' => '1.0',
+ 'Tie::RefHash' => '1.32',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.86',
+ 'Time::Local' => '1.11',
+ 'Time::gmtime' => '1.02',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.03',
+ 'Unicode' => '4.1.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '0.32',
+ 'Unicode::UCD' => '0.24',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.2601',
+ 'XS::APItest' => '0.09',
+ 'XS::Typemap' => '0.02',
+ 'XSLoader' => '0.06',
+ 'XSSymSet' => '1.0',
+ 'assertions' => '0.02',
+ 'assertions::activate' => '0.02',
+ 'assertions::compat' => undef,
+ 'attributes' => '0.06',
+ 'attrs' => '1.02',
+ 'autouse' => '1.05',
+ 'base' => '2.07',
+ 'bigint' => '0.07',
+ 'bignum' => '0.17',
+ 'bigrat' => '0.08',
+ 'blib' => '1.03',
+ 'bytes' => '1.02',
+ 'charnames' => '1.05',
+ 'constant' => '1.07',
+ 'diagnostics' => '1.15',
+ 'encoding' => '2.02',
+ 'encoding::warnings' => '0.05',
+ 'feature' => '1.00',
+ 'fields' => '2.03',
+ 'filetest' => '1.01',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.01',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'open' => '1.05',
+ 'ops' => '1.01',
+ 'overload' => '1.04',
+ 're' => '0.06',
+ 'sigtrap' => '1.02',
+ 'sort' => '2.00',
+ 'strict' => '1.03',
+ 'subs' => '1.00',
+ 'threads' => '1.07',
+ 'threads::shared' => '0.94',
+ 'utf8' => '1.06',
+ 'vars' => '1.01',
+ 'version' => '0.53',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.05',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.008008 => {
+ 'AnyDBM_File' => '1.00',
+ 'Attribute::Handlers' => '0.78_02',
+ 'AutoLoader' => '5.60',
+ 'AutoSplit' => '1.04',
+ 'B' => '1.09_01',
+ 'B::Asmdata' => '1.01',
+ 'B::Assembler' => '0.07',
+ 'B::Bblock' => '1.02_01',
+ 'B::Bytecode' => '1.01_01',
+ 'B::C' => '1.04_01',
+ 'B::CC' => '1.00_01',
+ 'B::Concise' => '0.66',
+ 'B::Debug' => '1.02_01',
+ 'B::Deparse' => '0.71',
+ 'B::Disassembler' => '1.05',
+ 'B::Lint' => '1.03',
+ 'B::Showlex' => '1.02',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.03_01',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.07',
+ 'ByteLoader' => '0.06',
+ 'CGI' => '3.15',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.26',
+ 'CGI::Fast' => '1.05',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5',
+ 'CPAN' => '1.76_02',
+ 'CPAN::FirstTime' => '1.60 ',
+ 'CPAN::Nox' => '1.03',
+ 'Carp' => '1.04',
+ 'Carp::Heavy' => '1.04',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Config' => undef,
+ 'Cwd' => '3.12',
+ 'DB' => '1.01',
+ 'DBM_Filter' => '0.01',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.814',
+ 'DCLsym' => '1.02',
+ 'Data::Dumper' => '2.121_08',
+ 'Devel::DProf' => '20050603.00',
+ 'Devel::PPPort' => '3.06_01',
+ 'Devel::Peek' => '1.03',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.14',
+ 'Digest::MD5' => '2.36',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '1.00',
+ 'DirHandle' => '1.00',
+ 'Dumpvalue' => '1.12',
+ 'DynaLoader' => '1.05',
+ 'Encode' => '2.12',
+ 'Encode::Alias' => '2.04',
+ 'Encode::Byte' => '2.00',
+ 'Encode::CJKConstants' => '2.00',
+ 'Encode::CN' => '2.00',
+ 'Encode::CN::HZ' => '2.01',
+ 'Encode::Config' => '2.01',
+ 'Encode::EBCDIC' => '2.00',
+ 'Encode::Encoder' => '2.00',
+ 'Encode::Encoding' => '2.02',
+ 'Encode::Guess' => '2.00',
+ 'Encode::JP' => '2.01',
+ 'Encode::JP::H2Z' => '2.00',
+ 'Encode::JP::JIS7' => '2.00',
+ 'Encode::KR' => '2.00',
+ 'Encode::KR::2022_KR' => '2.00',
+ 'Encode::MIME::Header' => '2.01',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.01',
+ 'Encode::Symbol' => '2.00',
+ 'Encode::TW' => '2.00',
+ 'Encode::Unicode' => '2.02',
+ 'Encode::Unicode::UTF7' => '2.01',
+ 'English' => '1.02',
+ 'Env' => '1.00',
+ 'Errno' => '1.09_01',
+ 'Exporter' => '5.58',
+ 'Exporter::Heavy' => '5.58',
+ 'ExtUtils::Command' => '1.09',
+ 'ExtUtils::Command::MM' => '0.05',
+ 'ExtUtils::Constant' => '0.17',
+ 'ExtUtils::Constant::Base'=> '0.01',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.01',
+ 'ExtUtils::Embed' => '1.26',
+ 'ExtUtils::Install' => '1.33',
+ 'ExtUtils::Installed' => '0.08',
+ 'ExtUtils::Liblist' => '1.01',
+ 'ExtUtils::Liblist::Kid'=> '1.3',
+ 'ExtUtils::MM' => '0.05',
+ 'ExtUtils::MM_AIX' => '0.03',
+ 'ExtUtils::MM_Any' => '0.13',
+ 'ExtUtils::MM_BeOS' => '1.05',
+ 'ExtUtils::MM_Cygwin' => '1.08',
+ 'ExtUtils::MM_DOS' => '0.02',
+ 'ExtUtils::MM_MacOS' => '1.08',
+ 'ExtUtils::MM_NW5' => '2.08',
+ 'ExtUtils::MM_OS2' => '1.05',
+ 'ExtUtils::MM_QNX' => '0.02',
+ 'ExtUtils::MM_UWIN' => '0.02',
+ 'ExtUtils::MM_Unix' => '1.50',
+ 'ExtUtils::MM_VMS' => '5.73',
+ 'ExtUtils::MM_VOS' => '0.02',
+ 'ExtUtils::MM_Win32' => '1.12',
+ 'ExtUtils::MM_Win95' => '0.04',
+ 'ExtUtils::MY' => '0.01',
+ 'ExtUtils::MakeMaker' => '6.30',
+ 'ExtUtils::MakeMaker::Config'=> '0.02',
+ 'ExtUtils::MakeMaker::bytes'=> '0.01',
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01',
+ 'ExtUtils::Manifest' => '1.46',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.15',
+ 'ExtUtils::Mksymlists' => '1.19',
+ 'ExtUtils::Packlist' => '0.04',
+ 'ExtUtils::testlib' => '1.15',
+ 'Fatal' => '1.03',
+ 'Fcntl' => '1.05',
+ 'File::Basename' => '2.74',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1003',
+ 'File::Copy' => '2.09',
+ 'File::DosGlob' => '1.00',
+ 'File::Find' => '1.10',
+ 'File::Glob' => '1.05',
+ 'File::Path' => '1.08',
+ 'File::Spec' => '3.12',
+ 'File::Spec::Cygwin' => '1.1',
+ 'File::Spec::Epoc' => '1.1',
+ 'File::Spec::Functions' => '1.3',
+ 'File::Spec::Mac' => '1.4',
+ 'File::Spec::OS2' => '1.2',
+ 'File::Spec::Unix' => '1.5',
+ 'File::Spec::VMS' => '1.4',
+ 'File::Spec::Win32' => '1.6',
+ 'File::Temp' => '0.16',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.06',
+ 'FileHandle' => '2.01',
+ 'Filespec' => '1.11',
+ 'Filter::Simple' => '0.82',
+ 'Filter::Util::Call' => '1.0601',
+ 'FindBin' => '1.47',
+ 'GDBM_File' => '1.08',
+ 'Getopt::Long' => '2.35',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.05',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.22',
+ 'IO::Dir' => '1.05',
+ 'IO::File' => '1.13',
+ 'IO::Handle' => '1.25',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.29',
+ 'IO::Socket::INET' => '1.29',
+ 'IO::Socket::UNIX' => '1.22',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.02',
+ 'IPC::Open3' => '1.02',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.04',
+ 'List::Util' => '1.18',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.09',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Script' => '2.07',
+ 'MIME::Base64' => '3.07',
+ 'MIME::QuotedPrint' => '3.07',
+ 'Math::BigFloat' => '1.51',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.77',
+ 'Math::BigInt::Calc' => '0.47',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.15',
+ 'Math::Complex' => '1.35',
+ 'Math::Trig' => '1.03',
+ 'Memoize' => '1.01',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'NDBM_File' => '1.06',
+ 'NEXT' => '0.60',
+ 'Net::Cmd' => '2.26',
+ 'Net::Config' => '1.10',
+ 'Net::Domain' => '2.19',
+ 'Net::FTP' => '2.75',
+ 'Net::FTP::A' => '1.16',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.23',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.28',
+ 'Net::Ping' => '2.31',
+ 'Net::SMTP' => '2.29',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.06',
+ 'Opcode' => '1.06',
+ 'POSIX' => '1.09',
+ 'PerlIO' => '1.04',
+ 'PerlIO::encoding' => '0.09',
+ 'PerlIO::scalar' => '0.04',
+ 'PerlIO::via' => '0.03',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.43',
+ 'Pod::Find' => '1.34',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.0504',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '1.37',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.33',
+ 'Pod::Parser' => '1.32',
+ 'Pod::Perldoc' => '3.14',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.3',
+ 'Pod::Text' => '2.21',
+ 'Pod::Text::Color' => '1.04',
+ 'Pod::Text::Overstrike' => '1.1',
+ 'Pod::Text::Termcap' => '1.11',
+ 'Pod::Usage' => '1.33',
+ 'SDBM_File' => '1.05',
+ 'Safe' => '2.12',
+ 'Scalar::Util' => '1.18',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.0904',
+ 'Shell' => '0.6',
+ 'Socket' => '1.78',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.15',
+ 'Switch' => '2.10_01',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.13',
+ 'Term::ANSIColor' => '1.10',
+ 'Term::Cap' => '1.09',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.02',
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.32',
+ 'Test::Builder::Module' => '0.02',
+ 'Test::Builder::Tester' => '1.02',
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => '2.56',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Straps' => '0.26',
+ 'Test::More' => '0.62',
+ 'Test::Simple' => '0.62',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '1.95',
+ 'Text::ParseWords' => '3.24',
+ 'Text::Soundex' => '1.01',
+ 'Text::Tabs' => '2005.0824',
+ 'Text::Wrap' => '2005.082401',
+ 'Thread' => '2.00',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.02',
+ 'Tie::Memoize' => '1.0',
+ 'Tie::RefHash' => '1.32',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.86',
+ 'Time::Local' => '1.11',
+ 'Time::gmtime' => '1.02',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.01',
+ 'Unicode' => '4.1.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '0.32',
+ 'Unicode::UCD' => '0.24',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.2601',
+ 'XS::APItest' => '0.08',
+ 'XS::Typemap' => '0.02',
+ 'XSLoader' => '0.06',
+ 'XSSymSet' => '1.0',
+ 'attributes' => '0.06',
+ 'attrs' => '1.02',
+ 'autouse' => '1.05',
+ 'base' => '2.07',
+ 'bigint' => '0.07',
+ 'bignum' => '0.17',
+ 'bigrat' => '0.08',
+ 'blib' => '1.03',
+ 'bytes' => '1.02',
+ 'charnames' => '1.05',
+ 'constant' => '1.05',
+ 'diagnostics' => '1.15',
+ 'encoding' => '2.02',
+ 'fields' => '2.03',
+ 'filetest' => '1.01',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.01',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'open' => '1.05',
+ 'ops' => '1.01',
+ 'overload' => '1.04',
+ 're' => '0.05',
+ 'sigtrap' => '1.02',
+ 'sort' => '1.02',
+ 'strict' => '1.03',
+ 'subs' => '1.00',
+ 'threads' => '1.07',
+ 'threads::shared' => '0.94',
+ 'utf8' => '1.06',
+ 'vars' => '1.01',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.05',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.009004 => {
+ 'AnyDBM_File' => '1.00',
+ 'Archive::Tar' => '1.30_01',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.78_02',
+ 'AutoLoader' => '5.61',
+ 'AutoSplit' => '1.04_01',
+ 'B' => '1.11',
+ 'B::Asmdata' => '1.01',
+ 'B::Assembler' => '0.07',
+ 'B::Bblock' => '1.02',
+ 'B::Bytecode' => '1.02',
+ 'B::C' => '1.05',
+ 'B::CC' => '1.00',
+ 'B::Concise' => '0.69',
+ 'B::Debug' => '1.02',
+ 'B::Deparse' => '0.76',
+ 'B::Disassembler' => '1.05',
+ 'B::Lint' => '1.08',
+ 'B::Showlex' => '1.02',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.03',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.08',
+ 'ByteLoader' => '0.06',
+ 'CGI' => '3.20',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.27',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5',
+ 'CPAN' => '1.87_55',
+ 'CPAN::Debug' => '5.400561',
+ 'CPAN::FirstTime' => '5.400742',
+ 'CPAN::HandleConfig' => '5.400740',
+ 'CPAN::Nox' => '5.400561',
+ 'CPAN::Tarzip' => '5.400714',
+ 'CPAN::Version' => '5.400561',
+ 'Carp' => '1.05',
+ 'Carp::Heavy' => '1.05',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Zlib' => '2.000_13',
+ 'Compress::Zlib' => '2.000_13',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.19',
+ 'DB' => '1.01',
+ 'DBM_Filter' => '0.01',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.814',
+ 'DCLsym' => '1.02',
+ 'Data::Dumper' => '2.121_08',
+ 'Devel::DProf' => '20050603.00',
+ 'Devel::PPPort' => '3.10',
+ 'Devel::Peek' => '1.03',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.15',
+ 'Digest::MD5' => '2.36',
+ 'Digest::SHA' => '5.43',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '1.00',
+ 'DirHandle' => '1.01',
+ 'Dumpvalue' => '1.12',
+ 'DynaLoader' => '1.07',
+ 'Encode' => '2.18_01',
+ 'Encode::Alias' => '2.06',
+ 'Encode::Byte' => '2.02',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.04',
+ 'Encode::Config' => '2.03',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.04',
+ 'Encode::Guess' => '2.02',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.02',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.04',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.03',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.09_01',
+ 'Exporter' => '5.59',
+ 'Exporter::Heavy' => '5.59',
+ 'ExtUtils::CBuilder' => '0.18',
+ 'ExtUtils::CBuilder::Base'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.12_01',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.01',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.13',
+ 'ExtUtils::Command' => '1.09',
+ 'ExtUtils::Command::MM' => '0.05_01',
+ 'ExtUtils::Constant' => '0.2',
+ 'ExtUtils::Constant::Base'=> '0.03',
+ 'ExtUtils::Constant::ProxySubs'=> '0.03',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.02',
+ 'ExtUtils::Embed' => '1.26',
+ 'ExtUtils::Install' => '1.41',
+ 'ExtUtils::Installed' => '1.41',
+ 'ExtUtils::Liblist' => '1.01',
+ 'ExtUtils::Liblist::Kid'=> '1.3',
+ 'ExtUtils::MM' => '0.05',
+ 'ExtUtils::MM_AIX' => '0.03',
+ 'ExtUtils::MM_Any' => '0.13_02',
+ 'ExtUtils::MM_BeOS' => '1.05',
+ 'ExtUtils::MM_Cygwin' => '1.08',
+ 'ExtUtils::MM_DOS' => '0.02',
+ 'ExtUtils::MM_MacOS' => '1.08',
+ 'ExtUtils::MM_NW5' => '2.08_01',
+ 'ExtUtils::MM_OS2' => '1.05',
+ 'ExtUtils::MM_QNX' => '0.02',
+ 'ExtUtils::MM_UWIN' => '0.02',
+ 'ExtUtils::MM_Unix' => '1.5003',
+ 'ExtUtils::MM_VMS' => '5.73_03',
+ 'ExtUtils::MM_VOS' => '0.02',
+ 'ExtUtils::MM_Win32' => '1.12_02',
+ 'ExtUtils::MM_Win95' => '0.04_01',
+ 'ExtUtils::MY' => '0.01',
+ 'ExtUtils::MakeMaker' => '6.30_02',
+ 'ExtUtils::MakeMaker::Config'=> '0.02',
+ 'ExtUtils::MakeMaker::bytes'=> '0.01',
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01',
+ 'ExtUtils::Manifest' => '1.46_01',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.15_01',
+ 'ExtUtils::Mksymlists' => '1.19_01',
+ 'ExtUtils::Packlist' => '1.41',
+ 'ExtUtils::ParseXS' => '2.15_02',
+ 'ExtUtils::testlib' => '1.15',
+ 'Fatal' => '1.04',
+ 'Fcntl' => '1.05',
+ 'File::Basename' => '2.75',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1005',
+ 'File::Copy' => '2.09',
+ 'File::DosGlob' => '1.00',
+ 'File::Find' => '1.11',
+ 'File::Glob' => '1.05',
+ 'File::GlobMapper' => '0.000_02',
+ 'File::Path' => '1.08',
+ 'File::Spec' => '3.19',
+ 'File::Spec::Cygwin' => '1.1',
+ 'File::Spec::Epoc' => '1.1',
+ 'File::Spec::Functions' => '1.3',
+ 'File::Spec::Mac' => '1.4',
+ 'File::Spec::OS2' => '1.2',
+ 'File::Spec::Unix' => '1.5',
+ 'File::Spec::VMS' => '1.4',
+ 'File::Spec::Win32' => '1.6',
+ 'File::Temp' => '0.16_01',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.07',
+ 'FileHandle' => '2.01',
+ 'Filespec' => '1.11',
+ 'Filter::Simple' => '0.82',
+ 'Filter::Util::Call' => '1.0601',
+ 'FindBin' => '1.47',
+ 'GDBM_File' => '1.08',
+ 'Getopt::Long' => '2.3501',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '0.01',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.23_01',
+ 'IO::Compress::Adapter::Deflate'=> '2.000_13',
+ 'IO::Compress::Adapter::Identity'=> '2.000_13',
+ 'IO::Compress::Base' => '2.000_13',
+ 'IO::Compress::Base::Common'=> '2.000_13',
+ 'IO::Compress::Deflate' => '2.000_13',
+ 'IO::Compress::Gzip' => '2.000_13',
+ 'IO::Compress::Gzip::Constants'=> '2.000_13',
+ 'IO::Compress::RawDeflate'=> '2.000_13',
+ 'IO::Compress::Zip' => '2.000_13',
+ 'IO::Compress::Zip::Constants'=> '2.000_13',
+ 'IO::Compress::Zlib::Constants'=> '2.000_13',
+ 'IO::Compress::Zlib::Extra'=> '2.000_13',
+ 'IO::Dir' => '1.06',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.27',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.30_01',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Identity'=> '2.000_13',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.000_13',
+ 'IO::Uncompress::AnyInflate'=> '2.000_13',
+ 'IO::Uncompress::AnyUncompress'=> '2.000_13',
+ 'IO::Uncompress::Base' => '2.000_13',
+ 'IO::Uncompress::Gunzip'=> '2.000_13',
+ 'IO::Uncompress::Inflate'=> '2.000_13',
+ 'IO::Uncompress::RawInflate'=> '2.000_13',
+ 'IO::Uncompress::Unzip' => '2.000_13',
+ 'IO::Zlib' => '1.04_02',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.02',
+ 'IPC::Open3' => '1.02',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.04',
+ 'List::Util' => '1.18',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.10_01',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Script' => '2.07',
+ 'MIME::Base64' => '3.07_01',
+ 'MIME::QuotedPrint' => '3.07',
+ 'Math::BigFloat' => '1.51',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.77',
+ 'Math::BigInt::Calc' => '0.47',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.10',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.15',
+ 'Math::Complex' => '1.36',
+ 'Math::Trig' => '1.04',
+ 'Memoize' => '1.01_01',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.2805',
+ 'Module::Build::Base' => undef,
+ 'Module::Build::Compat' => '0.03',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> undef,
+ 'Module::Build::ModuleInfo'=> undef,
+ 'Module::Build::Notes' => undef,
+ 'Module::Build::PPMMaker'=> undef,
+ 'Module::Build::Platform::Amiga'=> undef,
+ 'Module::Build::Platform::Default'=> undef,
+ 'Module::Build::Platform::EBCDIC'=> undef,
+ 'Module::Build::Platform::MPEiX'=> undef,
+ 'Module::Build::Platform::MacOS'=> undef,
+ 'Module::Build::Platform::RiscOS'=> undef,
+ 'Module::Build::Platform::Unix'=> undef,
+ 'Module::Build::Platform::VMS'=> undef,
+ 'Module::Build::Platform::VOS'=> undef,
+ 'Module::Build::Platform::Windows'=> undef,
+ 'Module::Build::Platform::aix'=> undef,
+ 'Module::Build::Platform::cygwin'=> undef,
+ 'Module::Build::Platform::darwin'=> undef,
+ 'Module::Build::Platform::os2'=> undef,
+ 'Module::Build::PodParser'=> undef,
+ 'Module::Build::Version'=> '0',
+ 'Module::Build::YAML' => '0.50',
+ 'Module::CoreList' => '2.08',
+ 'Module::Load' => '0.10',
+ 'Module::Loaded' => '0.01',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.06',
+ 'NEXT' => '0.60_01',
+ 'Net::Cmd' => '2.26_01',
+ 'Net::Config' => '1.10',
+ 'Net::Domain' => '2.19_01',
+ 'Net::FTP' => '2.75',
+ 'Net::FTP::A' => '1.16',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.23',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.28',
+ 'Net::Ping' => '2.31_04',
+ 'Net::SMTP' => '2.29',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.06',
+ 'Opcode' => '1.08',
+ 'POSIX' => '1.10',
+ 'Package::Constants' => '0.01',
+ 'PerlIO' => '1.04',
+ 'PerlIO::encoding' => '0.09',
+ 'PerlIO::scalar' => '0.04',
+ 'PerlIO::via' => '0.03',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.43',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.34',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.07',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.09',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.33',
+ 'Pod::Parser' => '1.32',
+ 'Pod::Perldoc' => '3.14_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.3',
+ 'Pod::Simple' => '3.04',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.07',
+ 'Pod::Text::Color' => '2.03',
+ 'Pod::Text::Overstrike' => '2',
+ 'Pod::Text::Termcap' => '2.03',
+ 'Pod::Usage' => '1.33_01',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.12',
+ 'Scalar::Util' => '1.18',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.0905',
+ 'Shell' => '0.7',
+ 'Socket' => '1.78',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.15_02',
+ 'Switch' => '2.10_01',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.17',
+ 'Term::ANSIColor' => '1.11',
+ 'Term::Cap' => '1.09',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.02',
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.33',
+ 'Test::Builder::Module' => '0.03',
+ 'Test::Builder::Tester' => '1.04',
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => '2.62',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Straps' => '0.26',
+ 'Test::Harness::Util' => '0.01',
+ 'Test::More' => '0.64',
+ 'Test::Simple' => '0.64',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '1.98_01',
+ 'Text::ParseWords' => '3.25',
+ 'Text::Soundex' => '1.01',
+ 'Text::Tabs' => '2007.071101',
+ 'Text::Wrap' => '2006.0711',
+ 'Thread' => '2.00',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_01',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.02',
+ 'Tie::Memoize' => '1.0',
+ 'Tie::RefHash' => '1.34_01',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.87',
+ 'Time::Local' => '1.13',
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.04',
+ 'Unicode' => '4.1.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '1.01',
+ 'Unicode::UCD' => '0.24',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.2601',
+ 'Win32API::File' => '0.1001',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'XS::APItest' => '0.09',
+ 'XS::Typemap' => '0.02',
+ 'XSLoader' => '0.06',
+ 'XSSymSet' => '1.0',
+ 'assertions' => '0.03',
+ 'assertions::activate' => '0.02',
+ 'assertions::compat' => '0.02',
+ 'attributes' => '0.06',
+ 'attrs' => '1.02',
+ 'autouse' => '1.06',
+ 'base' => '2.07',
+ 'bigint' => '0.07',
+ 'bignum' => '0.17',
+ 'bigrat' => '0.08',
+ 'blib' => '1.03',
+ 'bytes' => '1.02',
+ 'charnames' => '1.05',
+ 'constant' => '1.07',
+ 'diagnostics' => '1.16',
+ 'encoding' => '2.04',
+ 'encoding::warnings' => '0.10',
+ 'feature' => '1.01',
+ 'fields' => '2.03',
+ 'filetest' => '1.01',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.01',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'open' => '1.05',
+ 'ops' => '1.01',
+ 'overload' => '1.04',
+ 're' => '0.0601',
+ 'sigtrap' => '1.02',
+ 'sort' => '2.00',
+ 'strict' => '1.03',
+ 'subs' => '1.00',
+ 'threads' => '1.38',
+ 'threads::shared' => '0.94_01',
+ 'utf8' => '1.06',
+ 'vars' => '1.01',
+ 'version' => '0.67',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.05',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.009005 => {
+ 'AnyDBM_File' => '1.00',
+ 'Archive::Extract' => '0.22_01',
+ 'Archive::Tar' => '1.32',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.78_06',
+ 'AutoLoader' => '5.63',
+ 'AutoSplit' => '1.05',
+ 'B' => '1.16',
+ 'B::Concise' => '0.72',
+ 'B::Debug' => '1.05',
+ 'B::Deparse' => '0.82',
+ 'B::Lint' => '1.09',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.1',
+ 'CGI' => '3.29',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.28',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5_01',
+ 'CPAN' => '1.9102',
+ 'CPAN::Debug' => '5.400955',
+ 'CPAN::FirstTime' => '5.401669',
+ 'CPAN::HandleConfig' => '5.401744',
+ 'CPAN::Kwalify' => '5.401418',
+ 'CPAN::Nox' => '5.400844',
+ 'CPAN::Queue' => '5.401704',
+ 'CPAN::Tarzip' => '5.401717',
+ 'CPAN::Version' => '5.401387',
+ 'CPANPLUS' => '0.81_01',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Base' => '0.01',
+ 'CPANPLUS::Dist::Build' => '0.06_01',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.01',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.81_01',
+ 'CPANPLUS::Internals::Constants'=> '0.01',
+ 'CPANPLUS::Internals::Constants::Report'=> '0.01',
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.81_01',
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'CPANPLUS::inc' => undef,
+ 'Carp' => '1.07',
+ 'Carp::Heavy' => '1.07',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Zlib' => '2.005',
+ 'Compress::Zlib' => '2.005',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.25',
+ 'DB' => '1.01',
+ 'DBM_Filter' => '0.02',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.815',
+ 'DCLsym' => '1.03',
+ 'Data::Dumper' => '2.121_13',
+ 'Devel::DProf' => '20050603.00',
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.11_01',
+ 'Devel::Peek' => '1.03',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.15',
+ 'Digest::MD5' => '2.36_01',
+ 'Digest::SHA' => '5.44',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '1.00',
+ 'DirHandle' => '1.01',
+ 'Dumpvalue' => '1.12',
+ 'DynaLoader' => '1.08',
+ 'Encode' => '2.23',
+ 'Encode::Alias' => '2.07',
+ 'Encode::Byte' => '2.03',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.04',
+ 'Encode::Config' => '2.04',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.00',
+ 'Encode::Guess' => '2.02',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.03',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.05',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.05',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.10',
+ 'Exporter' => '5.60',
+ 'Exporter::Heavy' => '5.60',
+ 'ExtUtils::CBuilder' => '0.19',
+ 'ExtUtils::CBuilder::Base'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.13',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.01',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.13',
+ 'ExtUtils::Command' => '1.13',
+ 'ExtUtils::Command::MM' => '0.07',
+ 'ExtUtils::Constant' => '0.2',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.03',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.02',
+ 'ExtUtils::Embed' => '1.26',
+ 'ExtUtils::Install' => '1.41_01',
+ 'ExtUtils::Installed' => '1.41',
+ 'ExtUtils::Liblist' => '1.03',
+ 'ExtUtils::Liblist::Kid'=> '1.33',
+ 'ExtUtils::MM' => '0.07',
+ 'ExtUtils::MM_AIX' => '0.05',
+ 'ExtUtils::MM_Any' => '0.15',
+ 'ExtUtils::MM_BeOS' => '1.07',
+ 'ExtUtils::MM_Cygwin' => '1.1',
+ 'ExtUtils::MM_DOS' => '0.04',
+ 'ExtUtils::MM_MacOS' => '1.1',
+ 'ExtUtils::MM_NW5' => '2.1',
+ 'ExtUtils::MM_OS2' => '1.07',
+ 'ExtUtils::MM_QNX' => '0.04',
+ 'ExtUtils::MM_UWIN' => '0.04',
+ 'ExtUtils::MM_Unix' => '1.54_01',
+ 'ExtUtils::MM_VMS' => '5.76',
+ 'ExtUtils::MM_VOS' => '0.04',
+ 'ExtUtils::MM_Win32' => '1.15',
+ 'ExtUtils::MM_Win95' => '0.06',
+ 'ExtUtils::MY' => '0.03',
+ 'ExtUtils::MakeMaker' => '6.36',
+ 'ExtUtils::MakeMaker::Config'=> '0.04',
+ 'ExtUtils::MakeMaker::bytes'=> '0.03',
+ 'ExtUtils::MakeMaker::vmsish'=> '0.03',
+ 'ExtUtils::Manifest' => '1.51_01',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.17',
+ 'ExtUtils::Mksymlists' => '1.21',
+ 'ExtUtils::Packlist' => '1.41',
+ 'ExtUtils::ParseXS' => '2.18',
+ 'ExtUtils::testlib' => '1.17',
+ 'Fatal' => '1.05',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.76',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1005',
+ 'File::Copy' => '2.10',
+ 'File::DosGlob' => '1.00',
+ 'File::Fetch' => '0.10',
+ 'File::Find' => '1.11',
+ 'File::Glob' => '1.06',
+ 'File::GlobMapper' => '0.000_02',
+ 'File::Path' => '2.01',
+ 'File::Spec' => '3.25',
+ 'File::Spec::Cygwin' => '1.1_01',
+ 'File::Spec::Epoc' => '1.1',
+ 'File::Spec::Functions' => '1.3',
+ 'File::Spec::Mac' => '1.4',
+ 'File::Spec::OS2' => '1.2',
+ 'File::Spec::Unix' => '1.5',
+ 'File::Spec::VMS' => '1.4_01',
+ 'File::Spec::Win32' => '1.6',
+ 'File::Temp' => '0.18',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.07',
+ 'FileHandle' => '2.01',
+ 'Filespec' => '1.11',
+ 'Filter::Simple' => '0.82',
+ 'Filter::Util::Call' => '1.0602',
+ 'FindBin' => '1.49',
+ 'GDBM_File' => '1.08',
+ 'Getopt::Long' => '2.36',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.01',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.23_01',
+ 'IO::Compress::Adapter::Deflate'=> '2.005',
+ 'IO::Compress::Adapter::Identity'=> '2.005',
+ 'IO::Compress::Base' => '2.005',
+ 'IO::Compress::Base::Common'=> '2.005',
+ 'IO::Compress::Deflate' => '2.005',
+ 'IO::Compress::Gzip' => '2.005',
+ 'IO::Compress::Gzip::Constants'=> '2.005',
+ 'IO::Compress::RawDeflate'=> '2.005',
+ 'IO::Compress::Zip' => '2.005',
+ 'IO::Compress::Zip::Constants'=> '2.005',
+ 'IO::Compress::Zlib::Constants'=> '2.005',
+ 'IO::Compress::Zlib::Extra'=> '2.005',
+ 'IO::Dir' => '1.06',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.27',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.30_01',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Identity'=> '2.005',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.005',
+ 'IO::Uncompress::AnyInflate'=> '2.005',
+ 'IO::Uncompress::AnyUncompress'=> '2.005',
+ 'IO::Uncompress::Base' => '2.005',
+ 'IO::Uncompress::Gunzip'=> '2.005',
+ 'IO::Uncompress::Inflate'=> '2.005',
+ 'IO::Uncompress::RawInflate'=> '2.005',
+ 'IO::Uncompress::Unzip' => '2.005',
+ 'IO::Zlib' => '1.05_01',
+ 'IPC::Cmd' => '0.36_01',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.02',
+ 'IPC::Open3' => '1.02',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.04',
+ 'List::Util' => '1.19',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.10_01',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Maketext::Simple'=> '0.18',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.01',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.0201',
+ 'MIME::Base64' => '3.07_01',
+ 'MIME::QuotedPrint' => '3.07',
+ 'Math::BigFloat' => '1.58',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.87',
+ 'Math::BigInt::Calc' => '0.51',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.15_01',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.19',
+ 'Math::Complex' => '1.37',
+ 'Math::Trig' => '1.04',
+ 'Memoize' => '1.01_02',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.2808',
+ 'Module::Build::Base' => undef,
+ 'Module::Build::Compat' => '0.03',
+ 'Module::Build::Config' => undef,
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> undef,
+ 'Module::Build::ModuleInfo'=> undef,
+ 'Module::Build::Notes' => undef,
+ 'Module::Build::PPMMaker'=> undef,
+ 'Module::Build::Platform::Amiga'=> undef,
+ 'Module::Build::Platform::Default'=> undef,
+ 'Module::Build::Platform::EBCDIC'=> undef,
+ 'Module::Build::Platform::MPEiX'=> undef,
+ 'Module::Build::Platform::MacOS'=> undef,
+ 'Module::Build::Platform::RiscOS'=> undef,
+ 'Module::Build::Platform::Unix'=> undef,
+ 'Module::Build::Platform::VMS'=> undef,
+ 'Module::Build::Platform::VOS'=> undef,
+ 'Module::Build::Platform::Windows'=> undef,
+ 'Module::Build::Platform::aix'=> undef,
+ 'Module::Build::Platform::cygwin'=> undef,
+ 'Module::Build::Platform::darwin'=> undef,
+ 'Module::Build::Platform::os2'=> undef,
+ 'Module::Build::PodParser'=> undef,
+ 'Module::Build::Version'=> '0.7203',
+ 'Module::Build::YAML' => '0.50',
+ 'Module::CoreList' => '2.12',
+ 'Module::Load' => '0.10',
+ 'Module::Load::Conditional'=> '0.16',
+ 'Module::Loaded' => '0.01',
+ 'Module::Pluggable' => '3.6',
+ 'Module::Pluggable::Object'=> '3.6',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.07',
+ 'NEXT' => '0.60_01',
+ 'Net::Cmd' => '2.28',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.31_04',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.32',
+ 'Opcode' => '1.09',
+ 'POSIX' => '1.13',
+ 'Package::Constants' => '0.01',
+ 'Params::Check' => '0.26',
+ 'PerlIO' => '1.04',
+ 'PerlIO::encoding' => '0.10',
+ 'PerlIO::scalar' => '0.05',
+ 'PerlIO::via' => '0.04',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.43',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.34',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.08',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.12',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.35',
+ 'Pod::Parser' => '1.35',
+ 'Pod::Perldoc' => '3.14_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.35',
+ 'Pod::Simple' => '3.05',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.08',
+ 'Pod::Text::Color' => '2.03',
+ 'Pod::Text::Overstrike' => '2',
+ 'Pod::Text::Termcap' => '2.03',
+ 'Pod::Usage' => '1.35',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.12',
+ 'Scalar::Util' => '1.19',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.11',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.79',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.16',
+ 'Switch' => '2.13',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.18_01',
+ 'Term::ANSIColor' => '1.12',
+ 'Term::Cap' => '1.09',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.02',
+ 'Term::UI' => '0.14_01',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.70',
+ 'Test::Builder::Module' => '0.68',
+ 'Test::Builder::Tester' => '1.07',
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => '2.64',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Results'=> '0.01',
+ 'Test::Harness::Straps' => '0.26',
+ 'Test::Harness::Util' => '0.01',
+ 'Test::More' => '0.70',
+ 'Test::Simple' => '0.70',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.0.0',
+ 'Text::ParseWords' => '3.25',
+ 'Text::Soundex' => '3.02',
+ 'Text::Tabs' => '2007.1117',
+ 'Text::Wrap' => '2006.1117',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.02',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.37',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9707',
+ 'Time::Local' => '1.17',
+ 'Time::Piece' => '1.11_02',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.04',
+ 'Unicode' => '5.0.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '1.02',
+ 'Unicode::UCD' => '0.25',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.30',
+ 'Win32API::File' => '0.1001_01',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.12',
+ 'XS::Typemap' => '0.02',
+ 'XSLoader' => '0.08',
+ 'XSSymSet' => '1.1',
+ 'attributes' => '0.08',
+ 'attrs' => '1.02',
+ 'autouse' => '1.06',
+ 'base' => '2.12',
+ 'bigint' => '0.22',
+ 'bignum' => '0.22',
+ 'bigrat' => '0.22',
+ 'blib' => '1.03',
+ 'bytes' => '1.03',
+ 'charnames' => '1.06',
+ 'constant' => '1.10',
+ 'diagnostics' => '1.17',
+ 'encoding' => '2.06',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.10',
+ 'fields' => '2.12',
+ 'filetest' => '1.01',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'mro' => '1.00',
+ 'open' => '1.05',
+ 'ops' => '1.01',
+ 'overload' => '1.06',
+ 're' => '0.08',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.63',
+ 'threads::shared' => '1.12',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.7203',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.06',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.010000 => {
+ 'AnyDBM_File' => '1.00',
+ 'Archive::Extract' => '0.24',
+ 'Archive::Tar' => '1.38',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.79',
+ 'AutoLoader' => '5.63',
+ 'AutoSplit' => '1.05',
+ 'B' => '1.17',
+ 'B::Concise' => '0.74',
+ 'B::Debug' => '1.05',
+ 'B::Deparse' => '0.83',
+ 'B::Lint' => '1.09',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.1',
+ 'CGI' => '3.29',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.28',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5_01',
+ 'CPAN' => '1.9205',
+ 'CPAN::API::HOWTO' => undef,
+ 'CPAN::Debug' => '5.402212',
+ 'CPAN::DeferedCode' => '5.50',
+ 'CPAN::FirstTime' => '5.402229',
+ 'CPAN::HandleConfig' => '5.402212',
+ 'CPAN::Kwalify' => '5.401418',
+ 'CPAN::Nox' => '5.402411',
+ 'CPAN::Queue' => '5.402212',
+ 'CPAN::Tarzip' => '5.402213',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.84',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Base' => '0.01',
+ 'CPANPLUS::Dist::Build' => '0.06_02',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.01',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.84',
+ 'CPANPLUS::Internals::Constants'=> '0.01',
+ 'CPANPLUS::Internals::Constants::Report'=> '0.01',
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.84',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'CPANPLUS::inc' => undef,
+ 'Carp' => '1.08',
+ 'Carp::Heavy' => '1.08',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Zlib' => '2.008',
+ 'Compress::Zlib' => '2.008',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.2501',
+ 'DB' => '1.01',
+ 'DBM_Filter' => '0.02',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.816_1',
+ 'DCLsym' => '1.03',
+ 'Data::Dumper' => '2.121_14',
+ 'Devel::DProf' => '20050603.00',
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.13',
+ 'Devel::Peek' => '1.03',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.15',
+ 'Digest::MD5' => '2.36_01',
+ 'Digest::SHA' => '5.45',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '1.00',
+ 'DirHandle' => '1.01',
+ 'Dumpvalue' => '1.12',
+ 'DynaLoader' => '1.08',
+ 'Encode' => '2.23',
+ 'Encode::Alias' => '2.07',
+ 'Encode::Byte' => '2.03',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.04',
+ 'Encode::Config' => '2.04',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.00',
+ 'Encode::Guess' => '2.02',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.03',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.05',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.05',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.10',
+ 'Exporter' => '5.62',
+ 'Exporter::Heavy' => '5.62',
+ 'ExtUtils::CBuilder' => '0.21',
+ 'ExtUtils::CBuilder::Base'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.22',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.21',
+ 'ExtUtils::Command' => '1.13',
+ 'ExtUtils::Command::MM' => '6.42',
+ 'ExtUtils::Constant' => '0.2',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.05',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.02',
+ 'ExtUtils::Embed' => '1.27',
+ 'ExtUtils::Install' => '1.44',
+ 'ExtUtils::Installed' => '1.43',
+ 'ExtUtils::Liblist' => '6.42',
+ 'ExtUtils::Liblist::Kid'=> '6.42',
+ 'ExtUtils::MM' => '6.42',
+ 'ExtUtils::MM_AIX' => '6.42',
+ 'ExtUtils::MM_Any' => '6.42',
+ 'ExtUtils::MM_BeOS' => '6.42',
+ 'ExtUtils::MM_Cygwin' => '6.42',
+ 'ExtUtils::MM_DOS' => '6.42',
+ 'ExtUtils::MM_MacOS' => '6.42',
+ 'ExtUtils::MM_NW5' => '6.42',
+ 'ExtUtils::MM_OS2' => '6.42',
+ 'ExtUtils::MM_QNX' => '6.42',
+ 'ExtUtils::MM_UWIN' => '6.42',
+ 'ExtUtils::MM_Unix' => '6.42',
+ 'ExtUtils::MM_VMS' => '6.42',
+ 'ExtUtils::MM_VOS' => '6.42',
+ 'ExtUtils::MM_Win32' => '6.42',
+ 'ExtUtils::MM_Win95' => '6.42',
+ 'ExtUtils::MY' => '6.42',
+ 'ExtUtils::MakeMaker' => '6.42',
+ 'ExtUtils::MakeMaker::Config'=> '6.42',
+ 'ExtUtils::MakeMaker::bytes'=> '6.42',
+ 'ExtUtils::MakeMaker::vmsish'=> '6.42',
+ 'ExtUtils::Manifest' => '1.51_01',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.42',
+ 'ExtUtils::Mksymlists' => '6.42',
+ 'ExtUtils::Packlist' => '1.43',
+ 'ExtUtils::ParseXS' => '2.18_02',
+ 'ExtUtils::testlib' => '6.42',
+ 'Fatal' => '1.05',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.76',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1005',
+ 'File::Copy' => '2.11',
+ 'File::DosGlob' => '1.00',
+ 'File::Fetch' => '0.14',
+ 'File::Find' => '1.12',
+ 'File::Glob' => '1.06',
+ 'File::GlobMapper' => '0.000_02',
+ 'File::Path' => '2.04',
+ 'File::Spec' => '3.2501',
+ 'File::Spec::Cygwin' => '3.2501',
+ 'File::Spec::Epoc' => '3.2501',
+ 'File::Spec::Functions' => '3.2501',
+ 'File::Spec::Mac' => '3.2501',
+ 'File::Spec::OS2' => '3.2501',
+ 'File::Spec::Unix' => '3.2501',
+ 'File::Spec::VMS' => '3.2501',
+ 'File::Spec::Win32' => '3.2501',
+ 'File::Temp' => '0.18',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.07',
+ 'FileHandle' => '2.01',
+ 'Filespec' => '1.12',
+ 'Filter::Simple' => '0.82',
+ 'Filter::Util::Call' => '1.07',
+ 'FindBin' => '1.49',
+ 'GDBM_File' => '1.08',
+ 'Getopt::Long' => '2.37',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.03',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.23_01',
+ 'IO::Compress::Adapter::Deflate'=> '2.008',
+ 'IO::Compress::Adapter::Identity'=> '2.008',
+ 'IO::Compress::Base' => '2.008',
+ 'IO::Compress::Base::Common'=> '2.008',
+ 'IO::Compress::Deflate' => '2.008',
+ 'IO::Compress::Gzip' => '2.008',
+ 'IO::Compress::Gzip::Constants'=> '2.008',
+ 'IO::Compress::RawDeflate'=> '2.008',
+ 'IO::Compress::Zip' => '2.008',
+ 'IO::Compress::Zip::Constants'=> '2.008',
+ 'IO::Compress::Zlib::Constants'=> '2.008',
+ 'IO::Compress::Zlib::Extra'=> '2.008',
+ 'IO::Dir' => '1.06',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.27',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.30_01',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Identity'=> '2.008',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.008',
+ 'IO::Uncompress::AnyInflate'=> '2.008',
+ 'IO::Uncompress::AnyUncompress'=> '2.008',
+ 'IO::Uncompress::Base' => '2.008',
+ 'IO::Uncompress::Gunzip'=> '2.008',
+ 'IO::Uncompress::Inflate'=> '2.008',
+ 'IO::Uncompress::RawInflate'=> '2.008',
+ 'IO::Uncompress::Unzip' => '2.008',
+ 'IO::Zlib' => '1.07',
+ 'IPC::Cmd' => '0.40_1',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.02',
+ 'IPC::Open3' => '1.02',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.05',
+ 'List::Util' => '1.19',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.12',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Maketext::Simple'=> '0.18',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.01',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.04',
+ 'MIME::Base64' => '3.07_01',
+ 'MIME::QuotedPrint' => '3.07',
+ 'Math::BigFloat' => '1.59',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.88',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.16',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.21',
+ 'Math::Complex' => '1.37',
+ 'Math::Trig' => '1.04',
+ 'Memoize' => '1.01_02',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.2808_01',
+ 'Module::Build::Base' => '0.2808_01',
+ 'Module::Build::Compat' => '0.2808_01',
+ 'Module::Build::Config' => '0.2808_01',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> undef,
+ 'Module::Build::Dumper' => undef,
+ 'Module::Build::ModuleInfo'=> '0.2808_01',
+ 'Module::Build::Notes' => '0.2808_01',
+ 'Module::Build::PPMMaker'=> '0.2808_01',
+ 'Module::Build::Platform::Amiga'=> '0.2808_01',
+ 'Module::Build::Platform::Default'=> '0.2808_01',
+ 'Module::Build::Platform::EBCDIC'=> '0.2808_01',
+ 'Module::Build::Platform::MPEiX'=> '0.2808_01',
+ 'Module::Build::Platform::MacOS'=> '0.2808_01',
+ 'Module::Build::Platform::RiscOS'=> '0.2808_01',
+ 'Module::Build::Platform::Unix'=> '0.2808_01',
+ 'Module::Build::Platform::VMS'=> '0.2808_01',
+ 'Module::Build::Platform::VOS'=> '0.2808_01',
+ 'Module::Build::Platform::Windows'=> '0.2808_01',
+ 'Module::Build::Platform::aix'=> '0.2808_01',
+ 'Module::Build::Platform::cygwin'=> '0.2808_01',
+ 'Module::Build::Platform::darwin'=> '0.2808_01',
+ 'Module::Build::Platform::os2'=> '0.2808_01',
+ 'Module::Build::PodParser'=> '0.2808_01',
+ 'Module::Build::Version'=> '0.7203',
+ 'Module::Build::YAML' => '0.50',
+ 'Module::CoreList' => '2.12',
+ 'Module::Load' => '0.12',
+ 'Module::Load::Conditional'=> '0.22',
+ 'Module::Loaded' => '0.01',
+ 'Module::Pluggable' => '3.6',
+ 'Module::Pluggable::Object'=> '3.6',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.07',
+ 'NEXT' => '0.60_01',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.33',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.32',
+ 'Opcode' => '1.11',
+ 'POSIX' => '1.13',
+ 'Package::Constants' => '0.01',
+ 'Params::Check' => '0.26',
+ 'PerlIO' => '1.04',
+ 'PerlIO::encoding' => '0.10',
+ 'PerlIO::scalar' => '0.05',
+ 'PerlIO::via' => '0.04',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.43_01',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.34',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.08',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.16',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.35',
+ 'Pod::Parser' => '1.35',
+ 'Pod::Perldoc' => '3.14_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.35',
+ 'Pod::Simple' => '3.05',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.08',
+ 'Pod::Text::Color' => '2.03',
+ 'Pod::Text::Overstrike' => '2',
+ 'Pod::Text::Termcap' => '2.03',
+ 'Pod::Usage' => '1.35',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.12',
+ 'Scalar::Util' => '1.19',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.11',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.80',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.18',
+ 'Switch' => '2.13',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.22',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'Term::ANSIColor' => '1.12',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.03',
+ 'Term::UI' => '0.18',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.72',
+ 'Test::Builder::Module' => '0.72',
+ 'Test::Builder::Tester' => '1.09',
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => '2.64',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Results'=> '0.01',
+ 'Test::Harness::Straps' => '0.26_01',
+ 'Test::Harness::Util' => '0.01',
+ 'Test::More' => '0.72',
+ 'Test::Simple' => '0.72',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.0.0',
+ 'Text::ParseWords' => '3.26',
+ 'Text::Soundex' => '3.03',
+ 'Text::Tabs' => '2007.1117',
+ 'Text::Wrap' => '2006.1117',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.02',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.37',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::StdHandle' => undef,
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9711',
+ 'Time::Local' => '1.18',
+ 'Time::Piece' => '1.12',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.04',
+ 'Unicode' => '5.0.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '1.02',
+ 'Unicode::UCD' => '0.25',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.34',
+ 'Win32API::File' => '0.1001_01',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.12',
+ 'XS::Typemap' => '0.02',
+ 'XSLoader' => '0.08',
+ 'XSSymSet' => '1.1',
+ 'attributes' => '0.08',
+ 'attrs' => '1.02',
+ 'autouse' => '1.06',
+ 'base' => '2.13',
+ 'bigint' => '0.22',
+ 'bignum' => '0.22',
+ 'bigrat' => '0.22',
+ 'blib' => '1.03',
+ 'bytes' => '1.03',
+ 'charnames' => '1.06',
+ 'constant' => '1.13',
+ 'diagnostics' => '1.17',
+ 'encoding' => '2.06',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.11',
+ 'fields' => '2.13',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'mro' => '1.00',
+ 'open' => '1.06',
+ 'ops' => '1.01',
+ 'overload' => '1.06',
+ 're' => '0.08',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.67',
+ 'threads::shared' => '1.14',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.74',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.06',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.008009 => {
+ 'AnyDBM_File' => '1.00',
+ 'Attribute::Handlers' => '0.78_03',
+ 'AutoLoader' => '5.67',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.19',
+ 'B::Asmdata' => '1.02',
+ 'B::Assembler' => '0.08',
+ 'B::Bblock' => '1.02_01',
+ 'B::Bytecode' => '1.01_01',
+ 'B::C' => '1.05',
+ 'B::CC' => '1.00_01',
+ 'B::Concise' => '0.76',
+ 'B::Debug' => '1.05',
+ 'B::Deparse' => '0.87',
+ 'B::Disassembler' => '1.05',
+ 'B::Lint' => '1.11',
+ 'B::Lint::Debug' => undef,
+ 'B::Showlex' => '1.02',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.1',
+ 'ByteLoader' => '0.06',
+ 'CGI' => '3.42',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.30_01',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5_01',
+ 'CPAN' => '1.9301',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferedCode' => '5.50',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::FirstTime' => '5.5_01',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Tarzip' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'Carp' => '1.10',
+ 'Carp::Heavy' => '1.10',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Config' => undef,
+ 'Cwd' => '3.29',
+ 'DB' => '1.01',
+ 'DBM_Filter' => '0.02',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.817',
+ 'DCLsym' => '1.03',
+ 'Data::Dumper' => '2.121_17',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.14',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.15',
+ 'Digest::MD5' => '2.37',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '1.00',
+ 'DirHandle' => '1.02',
+ 'Dumpvalue' => '1.12',
+ 'DynaLoader' => '1.09',
+ 'Encode' => '2.26',
+ 'Encode::Alias' => '2.10',
+ 'Encode::Byte' => '2.03',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.02',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.05',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.05',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.03',
+ 'Env' => '1.00',
+ 'Errno' => '1.10',
+ 'Exporter' => '5.63',
+ 'Exporter::Heavy' => '5.63',
+ 'ExtUtils::Command' => '1.15',
+ 'ExtUtils::Command::MM' => '6.48',
+ 'ExtUtils::Constant' => '0.21',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.02',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.50_01',
+ 'ExtUtils::Installed' => '1.43',
+ 'ExtUtils::Liblist' => '6.48',
+ 'ExtUtils::Liblist::Kid'=> '6.48',
+ 'ExtUtils::MM' => '6.48',
+ 'ExtUtils::MM_AIX' => '6.48',
+ 'ExtUtils::MM_Any' => '6.48',
+ 'ExtUtils::MM_BeOS' => '6.48',
+ 'ExtUtils::MM_Cygwin' => '6.48',
+ 'ExtUtils::MM_DOS' => '6.48',
+ 'ExtUtils::MM_Darwin' => '6.48',
+ 'ExtUtils::MM_MacOS' => '6.48',
+ 'ExtUtils::MM_NW5' => '6.48',
+ 'ExtUtils::MM_OS2' => '6.48',
+ 'ExtUtils::MM_QNX' => '6.48',
+ 'ExtUtils::MM_UWIN' => '6.48',
+ 'ExtUtils::MM_Unix' => '6.48',
+ 'ExtUtils::MM_VMS' => '6.48',
+ 'ExtUtils::MM_VOS' => '6.48',
+ 'ExtUtils::MM_Win32' => '6.48',
+ 'ExtUtils::MM_Win95' => '6.48',
+ 'ExtUtils::MY' => '6.48',
+ 'ExtUtils::MakeMaker' => '6.48',
+ 'ExtUtils::MakeMaker::Config'=> '6.48',
+ 'ExtUtils::MakeMaker::bytes'=> '6.48',
+ 'ExtUtils::MakeMaker::vmsish'=> '6.48',
+ 'ExtUtils::Manifest' => '1.55',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.48',
+ 'ExtUtils::Mksymlists' => '6.48',
+ 'ExtUtils::Packlist' => '1.43',
+ 'ExtUtils::ParseXS' => '2.19',
+ 'ExtUtils::testlib' => '6.48',
+ 'Fatal' => '1.06',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.77',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1005',
+ 'File::Copy' => '2.13',
+ 'File::DosGlob' => '1.01',
+ 'File::Find' => '1.13',
+ 'File::Glob' => '1.06',
+ 'File::Path' => '2.07_02',
+ 'File::Spec' => '3.29',
+ 'File::Spec::Cygwin' => '3.29',
+ 'File::Spec::Epoc' => '3.29',
+ 'File::Spec::Functions' => '3.29',
+ 'File::Spec::Mac' => '3.29',
+ 'File::Spec::OS2' => '3.29',
+ 'File::Spec::Unix' => '3.29',
+ 'File::Spec::VMS' => '3.29',
+ 'File::Spec::Win32' => '3.29',
+ 'File::Temp' => '0.20',
+ 'File::stat' => '1.01',
+ 'FileCache' => '1.07',
+ 'FileHandle' => '2.01',
+ 'Filespec' => '1.11',
+ 'Filter::Simple' => '0.83',
+ 'Filter::Util::Call' => '1.07',
+ 'FindBin' => '1.49',
+ 'GDBM_File' => '1.09',
+ 'Getopt::Long' => '2.37',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.06',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.23',
+ 'IO::Dir' => '1.06',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.27',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.30',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IPC::Msg' => '2.00',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.03',
+ 'IPC::Semaphore' => '2.00',
+ 'IPC::SharedMem' => '2.00',
+ 'IPC::SysV' => '2.00',
+ 'IPC::lib::IPC::Msg' => '2.00',
+ 'IPC::lib::IPC::Semaphore'=> '2.00',
+ 'IPC::lib::IPC::SharedMem'=> '2.00',
+ 'List::Util' => '1.19',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.13',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Script' => '2.07',
+ 'MIME::Base64' => '3.07',
+ 'MIME::QuotedPrint' => '3.07',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.22',
+ 'Math::Complex' => '1.54',
+ 'Math::Trig' => '1.18',
+ 'Memoize' => '1.01',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::CoreList' => '2.17',
+ 'Module::Pluggable' => '3.8',
+ 'Module::Pluggable::Object'=> '3.6',
+ 'Module::Pluggable::lib::Devel::InnerPackage'=> '0.3',
+ 'NDBM_File' => '1.07',
+ 'NEXT' => '0.61',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.35',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Opcode' => '1.0601',
+ 'POSIX' => '1.15',
+ 'PerlIO' => '1.05',
+ 'PerlIO::encoding' => '0.11',
+ 'PerlIO::scalar' => '0.06',
+ 'PerlIO::via' => '0.05',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.43',
+ 'Pod::Find' => '1.34',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '1.37',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.35',
+ 'Pod::Parser' => '1.35',
+ 'Pod::Perldoc' => '3.14',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.35',
+ 'Pod::Text' => '2.21',
+ 'Pod::Text::Color' => '1.04',
+ 'Pod::Text::Overstrike' => '1.1',
+ 'Pod::Text::Termcap' => '1.11',
+ 'Pod::Usage' => '1.35',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.16',
+ 'Scalar::Util' => '1.19',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72',
+ 'Socket' => '1.81',
+ 'Stdio' => '2.4',
+ 'Storable' => '2.19',
+ 'Switch' => '2.13',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'Term::ANSIColor' => '1.12',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.03',
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.80',
+ 'Test::Builder::Module' => '0.80',
+ 'Test::Builder::Tester' => '1.13',
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => '2.64',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Results'=> '0.01_01',
+ 'Test::Harness::Straps' => '0.26_01',
+ 'Test::Harness::Util' => '0.01',
+ 'Test::More' => '0.80',
+ 'Test::Simple' => '0.80',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '1.98',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03',
+ 'Text::Tabs' => '2007.1117',
+ 'Text::Wrap' => '2006.1117',
+ 'Thread' => '2.01',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9715',
+ 'Time::Local' => '1.1901',
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.01',
+ 'Unicode' => '5.1.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '1.02',
+ 'Unicode::UCD' => '0.25',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.38',
+ 'Win32API::File' => '0.1001_01',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.15',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSSymSet' => '1.1',
+ 'attributes' => '0.09',
+ 'attrs' => '1.02',
+ 'autouse' => '1.06',
+ 'base' => '2.13',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.02',
+ 'charnames' => '1.06',
+ 'constant' => '1.17',
+ 'diagnostics' => '1.16',
+ 'encoding' => '2.6_01',
+ 'fields' => '2.12',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.01',
+ 'lib' => '0.61',
+ 'locale' => '1.00',
+ 'open' => '1.06',
+ 'ops' => '1.02',
+ 'overload' => '1.06',
+ 're' => '0.0601',
+ 'sigtrap' => '1.04',
+ 'sort' => '1.02',
+ 'strict' => '1.03',
+ 'subs' => '1.00',
+ 'threads' => '1.71',
+ 'threads::shared' => '1.27',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.05_01',
+ 'warnings::register' => '1.01',
+ },
+ 5.010001 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.34',
+ 'Archive::Tar' => '1.52',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.85',
+ 'AutoLoader' => '5.68',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.22',
+ 'B::Concise' => '0.76',
+ 'B::Debug' => '1.11',
+ 'B::Deparse' => '0.89',
+ 'B::Lint' => '1.11',
+ 'B::Lint::Debug' => undef,
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.43',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.30_01',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5_01',
+ 'CPAN' => '1.9402',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.93',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5001',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.53',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Index' => '1.93',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.00',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5',
+ 'CPAN::Tarzip' => '5.501',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.88',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.36',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.36',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.88',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.88',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.11',
+ 'Carp::Heavy' => '1.11',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.020',
+ 'Compress::Raw::Zlib' => '2.020',
+ 'Compress::Zlib' => '2.020',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.30',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.02',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'DCLsym' => '1.03',
+ 'Data::Dumper' => '2.124',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.35',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.03',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.06',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.63',
+ 'Exporter::Heavy' => '5.63',
+ 'ExtUtils::CBuilder' => '0.2602',
+ 'ExtUtils::CBuilder::Base'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.2602',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.55_02',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.54',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.55_02',
+ 'ExtUtils::Liblist::Kid'=> '6.5502',
+ 'ExtUtils::MM' => '6.55_02',
+ 'ExtUtils::MM_AIX' => '6.55_02',
+ 'ExtUtils::MM_Any' => '6.55_02',
+ 'ExtUtils::MM_BeOS' => '6.55_02',
+ 'ExtUtils::MM_Cygwin' => '6.55_02',
+ 'ExtUtils::MM_DOS' => '6.5502',
+ 'ExtUtils::MM_Darwin' => '6.55_02',
+ 'ExtUtils::MM_MacOS' => '6.5502',
+ 'ExtUtils::MM_NW5' => '6.55_02',
+ 'ExtUtils::MM_OS2' => '6.55_02',
+ 'ExtUtils::MM_QNX' => '6.55_02',
+ 'ExtUtils::MM_UWIN' => '6.5502',
+ 'ExtUtils::MM_Unix' => '6.55_02',
+ 'ExtUtils::MM_VMS' => '6.55_02',
+ 'ExtUtils::MM_VOS' => '6.55_02',
+ 'ExtUtils::MM_Win32' => '6.55_02',
+ 'ExtUtils::MM_Win95' => '6.55_02',
+ 'ExtUtils::MY' => '6.5502',
+ 'ExtUtils::MakeMaker' => '6.55_02',
+ 'ExtUtils::MakeMaker::Config'=> '6.55_02',
+ 'ExtUtils::Manifest' => '1.56',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.55_02',
+ 'ExtUtils::Mksymlists' => '6.55_02',
+ 'ExtUtils::Packlist' => '1.43',
+ 'ExtUtils::ParseXS' => '2.2002',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.5502',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.77',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.14',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.20',
+ 'File::Find' => '1.14',
+ 'File::Glob' => '1.06',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.07_03',
+ 'File::Spec' => '3.30',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.01',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.09',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.25',
+ 'IO::Compress::Adapter::Bzip2'=> '2.020',
+ 'IO::Compress::Adapter::Deflate'=> '2.020',
+ 'IO::Compress::Adapter::Identity'=> '2.020',
+ 'IO::Compress::Base' => '2.020',
+ 'IO::Compress::Base::Common'=> '2.020',
+ 'IO::Compress::Bzip2' => '2.020',
+ 'IO::Compress::Deflate' => '2.020',
+ 'IO::Compress::Gzip' => '2.020',
+ 'IO::Compress::Gzip::Constants'=> '2.020',
+ 'IO::Compress::RawDeflate'=> '2.020',
+ 'IO::Compress::Zip' => '2.020',
+ 'IO::Compress::Zip::Constants'=> '2.020',
+ 'IO::Compress::Zlib::Constants'=> '2.020',
+ 'IO::Compress::Zlib::Extra'=> '2.020',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.020',
+ 'IO::Uncompress::Adapter::Identity'=> '2.020',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.020',
+ 'IO::Uncompress::AnyInflate'=> '2.020',
+ 'IO::Uncompress::AnyUncompress'=> '2.020',
+ 'IO::Uncompress::Base' => '2.020',
+ 'IO::Uncompress::Bunzip2'=> '2.020',
+ 'IO::Uncompress::Gunzip'=> '2.020',
+ 'IO::Uncompress::Inflate'=> '2.020',
+ 'IO::Uncompress::RawInflate'=> '2.020',
+ 'IO::Uncompress::Unzip' => '2.020',
+ 'IO::Zlib' => '1.09',
+ 'IPC::Cmd' => '0.46',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.04',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.21',
+ 'List::Util::PP' => '1.21',
+ 'List::Util::XS' => '1.21',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.13',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.18',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.04',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.22',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.340201',
+ 'Module::Build::Base' => '0.340201',
+ 'Module::Build::Compat' => '0.340201',
+ 'Module::Build::Config' => '0.340201',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.340201',
+ 'Module::Build::Dumper' => '0.340201',
+ 'Module::Build::ModuleInfo'=> '0.340201',
+ 'Module::Build::Notes' => '0.340201',
+ 'Module::Build::PPMMaker'=> '0.340201',
+ 'Module::Build::Platform::Amiga'=> '0.340201',
+ 'Module::Build::Platform::Default'=> '0.340201',
+ 'Module::Build::Platform::EBCDIC'=> '0.340201',
+ 'Module::Build::Platform::MPEiX'=> '0.340201',
+ 'Module::Build::Platform::MacOS'=> '0.340201',
+ 'Module::Build::Platform::RiscOS'=> '0.340201',
+ 'Module::Build::Platform::Unix'=> '0.340201',
+ 'Module::Build::Platform::VMS'=> '0.340201',
+ 'Module::Build::Platform::VOS'=> '0.340201',
+ 'Module::Build::Platform::Windows'=> '0.340201',
+ 'Module::Build::Platform::aix'=> '0.340201',
+ 'Module::Build::Platform::cygwin'=> '0.340201',
+ 'Module::Build::Platform::darwin'=> '0.340201',
+ 'Module::Build::Platform::os2'=> '0.340201',
+ 'Module::Build::PodParser'=> '0.340201',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '0.50',
+ 'Module::CoreList' => '2.18',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.30',
+ 'Module::Loaded' => '0.02',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.34',
+ 'Opcode' => '1.11',
+ 'POSIX' => '1.17',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.39',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.11',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.07',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.22',
+ 'Pod::ParseLink' => '1.09',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.14_04',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.07',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XHTML' => '3.04',
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.13',
+ 'Pod::Text::Color' => '2.05',
+ 'Pod::Text::Overstrike' => '2.03',
+ 'Pod::Text::Termcap' => '2.05',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.18',
+ 'Scalar::Util' => '1.21',
+ 'Scalar::Util::PP' => '1.21',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.82',
+ 'Stdio' => '2.4',
+ 'Storable' => '2.20',
+ 'Switch' => '2.14',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.00',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.04',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.92',
+ 'Test::Builder::Module' => '0.92',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.92',
+ 'Test::Simple' => '0.92',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.0.0',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.05',
+ 'Unicode' => '5.1.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.15',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'attributes' => '0.09',
+ 'attrs' => '1.03',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.14',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.17',
+ 'diagnostics' => '1.17',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.13',
+ 'fields' => '2.14',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.01',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.07',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.221',
+ 're' => '0.09',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.72',
+ 'threads::shared' => '1.29',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.77',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.06',
+ 'warnings::register' => '1.01',
+ },
+ 5.011000 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.34',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.22',
+ 'B::Concise' => '0.76',
+ 'B::Debug' => '1.11',
+ 'B::Deparse' => '0.91',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.45',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '3.44',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.45',
+ 'CPAN' => '1.94_51',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.94',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5002',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.53',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5',
+ 'CPAN::Tarzip' => '5.501',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.88',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.40',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.40',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.88',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.88',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.12',
+ 'Carp::Heavy' => '1.12',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.021',
+ 'Compress::Raw::Zlib' => '2.021',
+ 'Compress::Zlib' => '2.021',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.3002',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.02',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.37',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.03',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.06',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64',
+ 'Exporter::Heavy' => '5.64',
+ 'ExtUtils::CBuilder' => '0.2602',
+ 'ExtUtils::CBuilder::Base'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.2602',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.55_02',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.54',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.55_02',
+ 'ExtUtils::Liblist::Kid'=> '6.5502',
+ 'ExtUtils::MM' => '6.55_02',
+ 'ExtUtils::MM_AIX' => '6.55_02',
+ 'ExtUtils::MM_Any' => '6.55_02',
+ 'ExtUtils::MM_BeOS' => '6.55_02',
+ 'ExtUtils::MM_Cygwin' => '6.55_02',
+ 'ExtUtils::MM_DOS' => '6.5502',
+ 'ExtUtils::MM_Darwin' => '6.55_02',
+ 'ExtUtils::MM_MacOS' => '6.5502',
+ 'ExtUtils::MM_NW5' => '6.55_02',
+ 'ExtUtils::MM_OS2' => '6.55_02',
+ 'ExtUtils::MM_QNX' => '6.55_02',
+ 'ExtUtils::MM_UWIN' => '6.5502',
+ 'ExtUtils::MM_Unix' => '6.55_02',
+ 'ExtUtils::MM_VMS' => '6.55_02',
+ 'ExtUtils::MM_VOS' => '6.55_02',
+ 'ExtUtils::MM_Win32' => '6.55_02',
+ 'ExtUtils::MM_Win95' => '6.55_02',
+ 'ExtUtils::MY' => '6.5502',
+ 'ExtUtils::MakeMaker' => '6.55_02',
+ 'ExtUtils::MakeMaker::Config'=> '6.55_02',
+ 'ExtUtils::Manifest' => '1.56',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.55_02',
+ 'ExtUtils::Mksymlists' => '6.55_02',
+ 'ExtUtils::Packlist' => '1.43',
+ 'ExtUtils::ParseXS' => '2.200403',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.5502',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.16',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.20',
+ 'File::Find' => '1.14',
+ 'File::Glob' => '1.06',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.07_03',
+ 'File::Spec' => '3.30',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.09',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.25_01',
+ 'IO::Compress::Adapter::Bzip2'=> '2.021',
+ 'IO::Compress::Adapter::Deflate'=> '2.021',
+ 'IO::Compress::Adapter::Identity'=> '2.021',
+ 'IO::Compress::Base' => '2.021',
+ 'IO::Compress::Base::Common'=> '2.021',
+ 'IO::Compress::Bzip2' => '2.021',
+ 'IO::Compress::Deflate' => '2.021',
+ 'IO::Compress::Gzip' => '2.021',
+ 'IO::Compress::Gzip::Constants'=> '2.021',
+ 'IO::Compress::RawDeflate'=> '2.021',
+ 'IO::Compress::Zip' => '2.021',
+ 'IO::Compress::Zip::Constants'=> '2.021',
+ 'IO::Compress::Zlib::Constants'=> '2.021',
+ 'IO::Compress::Zlib::Extra'=> '2.021',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.021',
+ 'IO::Uncompress::Adapter::Identity'=> '2.021',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.021',
+ 'IO::Uncompress::AnyInflate'=> '2.021',
+ 'IO::Uncompress::AnyUncompress'=> '2.021',
+ 'IO::Uncompress::Base' => '2.021',
+ 'IO::Uncompress::Bunzip2'=> '2.021',
+ 'IO::Uncompress::Gunzip'=> '2.021',
+ 'IO::Uncompress::Inflate'=> '2.021',
+ 'IO::Uncompress::RawInflate'=> '2.021',
+ 'IO::Uncompress::Unzip' => '2.021',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.50',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.21',
+ 'List::Util::PP' => '1.21',
+ 'List::Util::XS' => '1.21',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.13',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.35',
+ 'Module::Build::Base' => '0.35',
+ 'Module::Build::Compat' => '0.35',
+ 'Module::Build::Config' => '0.35',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.35',
+ 'Module::Build::Dumper' => '0.35',
+ 'Module::Build::ModuleInfo'=> '0.35',
+ 'Module::Build::Notes' => '0.35',
+ 'Module::Build::PPMMaker'=> '0.35',
+ 'Module::Build::Platform::Amiga'=> '0.35',
+ 'Module::Build::Platform::Default'=> '0.35',
+ 'Module::Build::Platform::EBCDIC'=> '0.35',
+ 'Module::Build::Platform::MPEiX'=> '0.35',
+ 'Module::Build::Platform::MacOS'=> '0.35',
+ 'Module::Build::Platform::RiscOS'=> '0.35',
+ 'Module::Build::Platform::Unix'=> '0.35',
+ 'Module::Build::Platform::VMS'=> '0.35',
+ 'Module::Build::Platform::VOS'=> '0.35',
+ 'Module::Build::Platform::Windows'=> '0.35',
+ 'Module::Build::Platform::aix'=> '0.35',
+ 'Module::Build::Platform::cygwin'=> '0.35',
+ 'Module::Build::Platform::darwin'=> '0.35',
+ 'Module::Build::Platform::os2'=> '0.35',
+ 'Module::Build::PodParser'=> '0.35',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '0.50',
+ 'Module::CoreList' => '2.19',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.30',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.34',
+ 'Opcode' => '1.13',
+ 'POSIX' => '1.17',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.39',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.11',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.08',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.22',
+ 'Pod::ParseLink' => '1.09',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.01',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.07',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XHTML' => '3.04',
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.13',
+ 'Pod::Text::Color' => '2.05',
+ 'Pod::Text::Overstrike' => '2.03',
+ 'Pod::Text::Termcap' => '2.05',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.19',
+ 'Scalar::Util' => '1.21',
+ 'Scalar::Util::PP' => '1.21',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.84',
+ 'Storable' => '2.20',
+ 'Switch' => '2.14_01',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.92',
+ 'Test::Builder::Module' => '0.92',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.92',
+ 'Test::Simple' => '0.92',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.05',
+ 'Unicode' => '5.1.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.15',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.14',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.19',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.17',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.13',
+ 'fields' => '2.14',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.01',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.08',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.10',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.74',
+ 'threads::shared' => '1.31',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.77',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.07',
+ 'warnings::register' => '1.01',
+ },
+ 5.011001 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.34',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.77',
+ 'B::Debug' => '1.11',
+ 'B::Deparse' => '0.92',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.48',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_51',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.94',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5002',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.53',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5',
+ 'CPAN::Tarzip' => '5.501',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.89_03',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.40',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.40',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.89_03',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.89_03',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.13',
+ 'Carp::Heavy' => '1.13',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.021',
+ 'Compress::Raw::Zlib' => '2.021',
+ 'Compress::Zlib' => '2.021',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.3002',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.02',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.37',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.03',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.06',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64',
+ 'Exporter::Heavy' => '5.64',
+ 'ExtUtils::CBuilder' => '0.260301',
+ 'ExtUtils::CBuilder::Base'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.260301',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.55_02',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.55_02',
+ 'ExtUtils::Liblist::Kid'=> '6.5502',
+ 'ExtUtils::MM' => '6.55_02',
+ 'ExtUtils::MM_AIX' => '6.55_02',
+ 'ExtUtils::MM_Any' => '6.55_02',
+ 'ExtUtils::MM_BeOS' => '6.55_02',
+ 'ExtUtils::MM_Cygwin' => '6.55_02',
+ 'ExtUtils::MM_DOS' => '6.5502',
+ 'ExtUtils::MM_Darwin' => '6.55_02',
+ 'ExtUtils::MM_MacOS' => '6.5502',
+ 'ExtUtils::MM_NW5' => '6.55_02',
+ 'ExtUtils::MM_OS2' => '6.55_02',
+ 'ExtUtils::MM_QNX' => '6.55_02',
+ 'ExtUtils::MM_UWIN' => '6.5502',
+ 'ExtUtils::MM_Unix' => '6.55_02',
+ 'ExtUtils::MM_VMS' => '6.55_02',
+ 'ExtUtils::MM_VOS' => '6.55_02',
+ 'ExtUtils::MM_Win32' => '6.55_02',
+ 'ExtUtils::MM_Win95' => '6.55_02',
+ 'ExtUtils::MY' => '6.5502',
+ 'ExtUtils::MakeMaker' => '6.55_02',
+ 'ExtUtils::MakeMaker::Config'=> '6.55_02',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.55_02',
+ 'ExtUtils::Mksymlists' => '6.55_02',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.5502',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.16',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.20',
+ 'File::Find' => '1.14',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08',
+ 'File::Spec' => '3.30',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.09',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.021',
+ 'IO::Compress::Adapter::Deflate'=> '2.021',
+ 'IO::Compress::Adapter::Identity'=> '2.021',
+ 'IO::Compress::Base' => '2.021',
+ 'IO::Compress::Base::Common'=> '2.021',
+ 'IO::Compress::Bzip2' => '2.021',
+ 'IO::Compress::Deflate' => '2.021',
+ 'IO::Compress::Gzip' => '2.021',
+ 'IO::Compress::Gzip::Constants'=> '2.021',
+ 'IO::Compress::RawDeflate'=> '2.021',
+ 'IO::Compress::Zip' => '2.021',
+ 'IO::Compress::Zip::Constants'=> '2.021',
+ 'IO::Compress::Zlib::Constants'=> '2.021',
+ 'IO::Compress::Zlib::Extra'=> '2.021',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.021',
+ 'IO::Uncompress::Adapter::Identity'=> '2.021',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.021',
+ 'IO::Uncompress::AnyInflate'=> '2.021',
+ 'IO::Uncompress::AnyUncompress'=> '2.021',
+ 'IO::Uncompress::Base' => '2.021',
+ 'IO::Uncompress::Bunzip2'=> '2.021',
+ 'IO::Uncompress::Gunzip'=> '2.021',
+ 'IO::Uncompress::Inflate'=> '2.021',
+ 'IO::Uncompress::RawInflate'=> '2.021',
+ 'IO::Uncompress::Unzip' => '2.021',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.50',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.21',
+ 'List::Util::PP' => '1.21',
+ 'List::Util::XS' => '1.21',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.13',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.35',
+ 'Module::Build::Base' => '0.35',
+ 'Module::Build::Compat' => '0.35',
+ 'Module::Build::Config' => '0.35',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.35',
+ 'Module::Build::Dumper' => '0.35',
+ 'Module::Build::ModuleInfo'=> '0.35',
+ 'Module::Build::Notes' => '0.35',
+ 'Module::Build::PPMMaker'=> '0.35',
+ 'Module::Build::Platform::Amiga'=> '0.35',
+ 'Module::Build::Platform::Default'=> '0.35',
+ 'Module::Build::Platform::EBCDIC'=> '0.35',
+ 'Module::Build::Platform::MPEiX'=> '0.35',
+ 'Module::Build::Platform::MacOS'=> '0.35',
+ 'Module::Build::Platform::RiscOS'=> '0.35',
+ 'Module::Build::Platform::Unix'=> '0.35',
+ 'Module::Build::Platform::VMS'=> '0.35',
+ 'Module::Build::Platform::VOS'=> '0.35',
+ 'Module::Build::Platform::Windows'=> '0.35',
+ 'Module::Build::Platform::aix'=> '0.35',
+ 'Module::Build::Platform::cygwin'=> '0.35',
+ 'Module::Build::Platform::darwin'=> '0.35',
+ 'Module::Build::Platform::os2'=> '0.35',
+ 'Module::Build::PodParser'=> '0.35',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '0.50',
+ 'Module::CoreList' => '2.21',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.30',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.18',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.11',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.22',
+ 'Pod::ParseLink' => '1.09',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.01',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.08',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XHTML' => '3.04',
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.13',
+ 'Pod::Text::Color' => '2.05',
+ 'Pod::Text::Overstrike' => '2.03',
+ 'Pod::Text::Termcap' => '2.05',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.19',
+ 'Scalar::Util' => '1.21',
+ 'Scalar::Util::PP' => '1.21',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.85',
+ 'Storable' => '2.22',
+ 'Switch' => '2.15',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.05',
+ 'Unicode' => '5.1.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.16',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.14',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.19',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.17',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.13',
+ 'fields' => '2.14',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.09',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.10',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.74',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.77',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.07',
+ 'warnings::register' => '1.01',
+ },
+ 5.011002 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.34',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.11',
+ 'B::Deparse' => '0.93',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.48',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_51',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.94',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5002',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.53',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5',
+ 'CPAN::Tarzip' => '5.501',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.89_09',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.44',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.44',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.89_09',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.89_09',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.14',
+ 'Carp::Heavy' => '1.14',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.021',
+ 'Compress::Raw::Zlib' => '2.021',
+ 'Compress::Zlib' => '2.022',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.3002',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.38',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.55_02',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.55_02',
+ 'ExtUtils::Liblist::Kid'=> '6.5502',
+ 'ExtUtils::MM' => '6.55_02',
+ 'ExtUtils::MM_AIX' => '6.55_02',
+ 'ExtUtils::MM_Any' => '6.55_02',
+ 'ExtUtils::MM_BeOS' => '6.55_02',
+ 'ExtUtils::MM_Cygwin' => '6.55_02',
+ 'ExtUtils::MM_DOS' => '6.5502',
+ 'ExtUtils::MM_Darwin' => '6.55_02',
+ 'ExtUtils::MM_MacOS' => '6.5502',
+ 'ExtUtils::MM_NW5' => '6.55_02',
+ 'ExtUtils::MM_OS2' => '6.55_02',
+ 'ExtUtils::MM_QNX' => '6.55_02',
+ 'ExtUtils::MM_UWIN' => '6.5502',
+ 'ExtUtils::MM_Unix' => '6.55_02',
+ 'ExtUtils::MM_VMS' => '6.55_02',
+ 'ExtUtils::MM_VOS' => '6.55_02',
+ 'ExtUtils::MM_Win32' => '6.55_02',
+ 'ExtUtils::MM_Win95' => '6.55_02',
+ 'ExtUtils::MY' => '6.5502',
+ 'ExtUtils::MakeMaker' => '6.55_02',
+ 'ExtUtils::MakeMaker::Config'=> '6.55_02',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.55_02',
+ 'ExtUtils::Mksymlists' => '6.55_02',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.5502',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.16',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.22',
+ 'File::Find' => '1.14',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08',
+ 'File::Spec' => '3.30',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.09',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.022',
+ 'IO::Compress::Adapter::Deflate'=> '2.022',
+ 'IO::Compress::Adapter::Identity'=> '2.022',
+ 'IO::Compress::Base' => '2.022',
+ 'IO::Compress::Base::Common'=> '2.022',
+ 'IO::Compress::Bzip2' => '2.022',
+ 'IO::Compress::Deflate' => '2.022',
+ 'IO::Compress::Gzip' => '2.022',
+ 'IO::Compress::Gzip::Constants'=> '2.022',
+ 'IO::Compress::RawDeflate'=> '2.022',
+ 'IO::Compress::Zip' => '2.022',
+ 'IO::Compress::Zip::Constants'=> '2.022',
+ 'IO::Compress::Zlib::Constants'=> '2.022',
+ 'IO::Compress::Zlib::Extra'=> '2.022',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.022',
+ 'IO::Uncompress::Adapter::Identity'=> '2.022',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.022',
+ 'IO::Uncompress::AnyInflate'=> '2.022',
+ 'IO::Uncompress::AnyUncompress'=> '2.022',
+ 'IO::Uncompress::Base' => '2.022',
+ 'IO::Uncompress::Bunzip2'=> '2.022',
+ 'IO::Uncompress::Gunzip'=> '2.022',
+ 'IO::Uncompress::Inflate'=> '2.022',
+ 'IO::Uncompress::RawInflate'=> '2.022',
+ 'IO::Uncompress::Unzip' => '2.022',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.54',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.22',
+ 'List::Util::PP' => '1.22',
+ 'List::Util::XS' => '1.22',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.35_09',
+ 'Module::Build::Base' => '0.35_09',
+ 'Module::Build::Compat' => '0.35_09',
+ 'Module::Build::Config' => '0.35_09',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.35_09',
+ 'Module::Build::Dumper' => '0.35_09',
+ 'Module::Build::ModuleInfo'=> '0.35_09',
+ 'Module::Build::Notes' => '0.35_09',
+ 'Module::Build::PPMMaker'=> '0.35_09',
+ 'Module::Build::Platform::Amiga'=> '0.35_09',
+ 'Module::Build::Platform::Default'=> '0.35_09',
+ 'Module::Build::Platform::EBCDIC'=> '0.35_09',
+ 'Module::Build::Platform::MPEiX'=> '0.35_09',
+ 'Module::Build::Platform::MacOS'=> '0.35_09',
+ 'Module::Build::Platform::RiscOS'=> '0.35_09',
+ 'Module::Build::Platform::Unix'=> '0.35_09',
+ 'Module::Build::Platform::VMS'=> '0.35_09',
+ 'Module::Build::Platform::VOS'=> '0.35_09',
+ 'Module::Build::Platform::Windows'=> '0.35_09',
+ 'Module::Build::Platform::aix'=> '0.35_09',
+ 'Module::Build::Platform::cygwin'=> '0.35_09',
+ 'Module::Build::Platform::darwin'=> '0.35_09',
+ 'Module::Build::Platform::os2'=> '0.35_09',
+ 'Module::Build::PodParser'=> '0.35_09',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.23',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.34',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.18',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.11',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.22',
+ 'Pod::ParseLink' => '1.09',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.01',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.10',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XHTML' => '3.10',
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.13',
+ 'Pod::Text::Color' => '2.05',
+ 'Pod::Text::Overstrike' => '2.03',
+ 'Pod::Text::Termcap' => '2.05',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.19',
+ 'Scalar::Util' => '1.22',
+ 'Scalar::Util::PP' => '1.22',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Simple' => '0.01',
+ 'Socket' => '1.85',
+ 'Storable' => '2.22',
+ 'Switch' => '2.16',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.05',
+ 'Unicode' => '5.1.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.17',
+ 'XS::APItest::KeywordRPN'=> '0.003',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.19',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.18',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.13',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.35_09',
+ 'integer' => '1.00',
+ 'legacy' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.10',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.74',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.77',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.07',
+ 'warnings::register' => '1.01',
+ },
+ 5.011003 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.570001',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.36',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.11',
+ 'B::Deparse' => '0.93',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.48',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_5301',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.94',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.530001',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.770001',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5',
+ 'CPAN::Tarzip' => '5.501',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.90',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.44',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.44',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.90',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.90',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.14',
+ 'Carp::Heavy' => '1.14',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.021',
+ 'Compress::Raw::Zlib' => '2.021',
+ 'Compress::Zlib' => '2.022',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::V' => undef,
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.56',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.56',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.16',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.22',
+ 'File::Find' => '1.15',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.09',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.022',
+ 'IO::Compress::Adapter::Deflate'=> '2.022',
+ 'IO::Compress::Adapter::Identity'=> '2.022',
+ 'IO::Compress::Base' => '2.022',
+ 'IO::Compress::Base::Common'=> '2.022',
+ 'IO::Compress::Bzip2' => '2.022',
+ 'IO::Compress::Deflate' => '2.022',
+ 'IO::Compress::Gzip' => '2.022',
+ 'IO::Compress::Gzip::Constants'=> '2.022',
+ 'IO::Compress::RawDeflate'=> '2.022',
+ 'IO::Compress::Zip' => '2.022',
+ 'IO::Compress::Zip::Constants'=> '2.022',
+ 'IO::Compress::Zlib::Constants'=> '2.022',
+ 'IO::Compress::Zlib::Extra'=> '2.022',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.022',
+ 'IO::Uncompress::Adapter::Identity'=> '2.022',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.022',
+ 'IO::Uncompress::AnyInflate'=> '2.022',
+ 'IO::Uncompress::AnyUncompress'=> '2.022',
+ 'IO::Uncompress::Base' => '2.022',
+ 'IO::Uncompress::Bunzip2'=> '2.022',
+ 'IO::Uncompress::Gunzip'=> '2.022',
+ 'IO::Uncompress::Inflate'=> '2.022',
+ 'IO::Uncompress::RawInflate'=> '2.022',
+ 'IO::Uncompress::Unzip' => '2.022',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.54',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.22',
+ 'List::Util::PP' => '1.22',
+ 'List::Util::XS' => '1.22',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.36',
+ 'Module::Build::Base' => '0.36',
+ 'Module::Build::Compat' => '0.36',
+ 'Module::Build::Config' => '0.36',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.36',
+ 'Module::Build::Dumper' => '0.36',
+ 'Module::Build::ModuleInfo'=> '0.36',
+ 'Module::Build::Notes' => '0.36',
+ 'Module::Build::PPMMaker'=> '0.36',
+ 'Module::Build::Platform::Amiga'=> '0.36',
+ 'Module::Build::Platform::Default'=> '0.36',
+ 'Module::Build::Platform::EBCDIC'=> '0.36',
+ 'Module::Build::Platform::MPEiX'=> '0.36',
+ 'Module::Build::Platform::MacOS'=> '0.36',
+ 'Module::Build::Platform::RiscOS'=> '0.36',
+ 'Module::Build::Platform::Unix'=> '0.36',
+ 'Module::Build::Platform::VMS'=> '0.36',
+ 'Module::Build::Platform::VOS'=> '0.36',
+ 'Module::Build::Platform::Windows'=> '0.36',
+ 'Module::Build::Platform::aix'=> '0.36',
+ 'Module::Build::Platform::cygwin'=> '0.36',
+ 'Module::Build::Platform::darwin'=> '0.36',
+ 'Module::Build::Platform::os2'=> '0.36',
+ 'Module::Build::PodParser'=> '0.36',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.24',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.34',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.11',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.22',
+ 'Pod::ParseLink' => '1.09',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.01',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.13',
+ 'Pod::Simple::BlackBox' => '3.13',
+ 'Pod::Simple::Checker' => '3.13',
+ 'Pod::Simple::Debug' => '3.13',
+ 'Pod::Simple::DumpAsText'=> '3.13',
+ 'Pod::Simple::DumpAsXML'=> '3.13',
+ 'Pod::Simple::HTML' => '3.13',
+ 'Pod::Simple::HTMLBatch'=> '3.13',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.13',
+ 'Pod::Simple::Methody' => '3.13',
+ 'Pod::Simple::Progress' => '3.13',
+ 'Pod::Simple::PullParser'=> '3.13',
+ 'Pod::Simple::PullParserEndToken'=> '3.13',
+ 'Pod::Simple::PullParserStartToken'=> '3.13',
+ 'Pod::Simple::PullParserTextToken'=> '3.13',
+ 'Pod::Simple::PullParserToken'=> '3.13',
+ 'Pod::Simple::RTF' => '3.13',
+ 'Pod::Simple::Search' => '3.13',
+ 'Pod::Simple::SimpleTree'=> '3.13',
+ 'Pod::Simple::Text' => '3.13',
+ 'Pod::Simple::TextContent'=> '3.13',
+ 'Pod::Simple::TiedOutFH'=> '3.13',
+ 'Pod::Simple::Transcode'=> '3.13',
+ 'Pod::Simple::TranscodeDumb'=> '3.13',
+ 'Pod::Simple::TranscodeSmart'=> '3.13',
+ 'Pod::Simple::XHTML' => '3.13',
+ 'Pod::Simple::XMLOutStream'=> '3.13',
+ 'Pod::Text' => '3.13',
+ 'Pod::Text::Color' => '2.05',
+ 'Pod::Text::Overstrike' => '2.03',
+ 'Pod::Text::Termcap' => '2.05',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.20',
+ 'Scalar::Util' => '1.22',
+ 'Scalar::Util::PP' => '1.22',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.85',
+ 'Storable' => '2.22',
+ 'Switch' => '2.16',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.05',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.17',
+ 'XS::APItest::KeywordRPN'=> '0.003',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.19',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.14',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.36',
+ 'integer' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.10',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.75',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.77',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.08',
+ 'warnings::register' => '1.01',
+ },
+ 5.011004 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.38',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.11',
+ 'B::Deparse' => '0.94',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.48',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_54',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.94',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.53',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5',
+ 'CPAN::Tarzip' => '5.501',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.90',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.44',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.44',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.90',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.90',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.15',
+ 'Carp::Heavy' => '1.15',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.024',
+ 'Compress::Raw::Zlib' => '2.024',
+ 'Compress::Zlib' => '2.024',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.56',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.56',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.17',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.15',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.024',
+ 'IO::Compress::Adapter::Deflate'=> '2.024',
+ 'IO::Compress::Adapter::Identity'=> '2.024',
+ 'IO::Compress::Base' => '2.024',
+ 'IO::Compress::Base::Common'=> '2.024',
+ 'IO::Compress::Bzip2' => '2.024',
+ 'IO::Compress::Deflate' => '2.024',
+ 'IO::Compress::Gzip' => '2.024',
+ 'IO::Compress::Gzip::Constants'=> '2.024',
+ 'IO::Compress::RawDeflate'=> '2.024',
+ 'IO::Compress::Zip' => '2.024',
+ 'IO::Compress::Zip::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Extra'=> '2.024',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Adapter::Identity'=> '2.024',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.024',
+ 'IO::Uncompress::AnyInflate'=> '2.024',
+ 'IO::Uncompress::AnyUncompress'=> '2.024',
+ 'IO::Uncompress::Base' => '2.024',
+ 'IO::Uncompress::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Gunzip'=> '2.024',
+ 'IO::Uncompress::Inflate'=> '2.024',
+ 'IO::Uncompress::RawInflate'=> '2.024',
+ 'IO::Uncompress::Unzip' => '2.024',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.54',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.22',
+ 'List::Util::PP' => '1.22',
+ 'List::Util::XS' => '1.22',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3603',
+ 'Module::Build::Base' => '0.3603',
+ 'Module::Build::Compat' => '0.3603',
+ 'Module::Build::Config' => '0.3603',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3603',
+ 'Module::Build::Dumper' => '0.3603',
+ 'Module::Build::ModuleInfo'=> '0.3603',
+ 'Module::Build::Notes' => '0.3603',
+ 'Module::Build::PPMMaker'=> '0.3603',
+ 'Module::Build::Platform::Amiga'=> '0.3603',
+ 'Module::Build::Platform::Default'=> '0.3603',
+ 'Module::Build::Platform::EBCDIC'=> '0.3603',
+ 'Module::Build::Platform::MPEiX'=> '0.3603',
+ 'Module::Build::Platform::MacOS'=> '0.3603',
+ 'Module::Build::Platform::RiscOS'=> '0.3603',
+ 'Module::Build::Platform::Unix'=> '0.3603',
+ 'Module::Build::Platform::VMS'=> '0.3603',
+ 'Module::Build::Platform::VOS'=> '0.3603',
+ 'Module::Build::Platform::Windows'=> '0.3603',
+ 'Module::Build::Platform::aix'=> '0.3603',
+ 'Module::Build::Platform::cygwin'=> '0.3603',
+ 'Module::Build::Platform::darwin'=> '0.3603',
+ 'Module::Build::Platform::os2'=> '0.3603',
+ 'Module::Build::PodParser'=> '0.3603',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.24',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.34',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.22',
+ 'Pod::ParseLink' => '1.09',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.01',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.13',
+ 'Pod::Simple::BlackBox' => '3.13',
+ 'Pod::Simple::Checker' => '3.13',
+ 'Pod::Simple::Debug' => '3.13',
+ 'Pod::Simple::DumpAsText'=> '3.13',
+ 'Pod::Simple::DumpAsXML'=> '3.13',
+ 'Pod::Simple::HTML' => '3.13',
+ 'Pod::Simple::HTMLBatch'=> '3.13',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.13',
+ 'Pod::Simple::Methody' => '3.13',
+ 'Pod::Simple::Progress' => '3.13',
+ 'Pod::Simple::PullParser'=> '3.13',
+ 'Pod::Simple::PullParserEndToken'=> '3.13',
+ 'Pod::Simple::PullParserStartToken'=> '3.13',
+ 'Pod::Simple::PullParserTextToken'=> '3.13',
+ 'Pod::Simple::PullParserToken'=> '3.13',
+ 'Pod::Simple::RTF' => '3.13',
+ 'Pod::Simple::Search' => '3.13',
+ 'Pod::Simple::SimpleTree'=> '3.13',
+ 'Pod::Simple::Text' => '3.13',
+ 'Pod::Simple::TextContent'=> '3.13',
+ 'Pod::Simple::TiedOutFH'=> '3.13',
+ 'Pod::Simple::Transcode'=> '3.13',
+ 'Pod::Simple::TranscodeDumb'=> '3.13',
+ 'Pod::Simple::TranscodeSmart'=> '3.13',
+ 'Pod::Simple::XHTML' => '3.13',
+ 'Pod::Simple::XMLOutStream'=> '3.13',
+ 'Pod::Text' => '3.13',
+ 'Pod::Text::Color' => '2.05',
+ 'Pod::Text::Overstrike' => '2.03',
+ 'Pod::Text::Termcap' => '2.05',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.21',
+ 'Scalar::Util' => '1.22',
+ 'Scalar::Util::PP' => '1.22',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.85',
+ 'Storable' => '2.22',
+ 'Switch' => '2.16',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.06',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.17',
+ 'XS::APItest::KeywordRPN'=> '0.003',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.19',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.15',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3603',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.11',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.75',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.81',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.09',
+ 'warnings::register' => '1.01',
+ },
+);
+
+%deprecated = (
+ 5.011 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.011001 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.011002 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.011003 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.011004 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+);
+
+%upstream = (
+ 'App::Cpan' => 'cpan',
+ 'App::Prove' => undef,
+ 'App::Prove::State' => undef,
+ 'App::Prove::State::Result'=> undef,
+ 'App::Prove::State::Result::Test'=> undef,
+ 'Archive::Extract' => 'cpan',
+ 'Archive::Tar' => 'cpan',
+ 'Archive::Tar::Constant'=> 'cpan',
+ 'Archive::Tar::File' => 'cpan',
+ 'Attribute::Handlers' => 'blead',
+ 'AutoLoader' => 'cpan',
+ 'AutoSplit' => 'cpan',
+ 'B::Concise' => undef,
+ 'B::Debug' => undef,
+ 'B::Deparse' => 'blead',
+ 'B::Lint' => undef,
+ 'B::Lint::Debug' => undef,
+ 'CGI' => 'cpan',
+ 'CGI::Apache' => 'cpan',
+ 'CGI::Carp' => 'cpan',
+ 'CGI::Cookie' => 'cpan',
+ 'CGI::Fast' => 'cpan',
+ 'CGI::Pretty' => 'cpan',
+ 'CGI::Push' => 'cpan',
+ 'CGI::Switch' => 'cpan',
+ 'CGI::Util' => 'cpan',
+ 'CPAN' => 'cpan',
+ 'CPAN::Author' => 'cpan',
+ 'CPAN::Bundle' => 'cpan',
+ 'CPAN::CacheMgr' => 'cpan',
+ 'CPAN::Complete' => 'cpan',
+ 'CPAN::Debug' => 'cpan',
+ 'CPAN::DeferredCode' => 'cpan',
+ 'CPAN::Distribution' => 'cpan',
+ 'CPAN::Distroprefs' => 'cpan',
+ 'CPAN::Distrostatus' => 'cpan',
+ 'CPAN::Exception::RecursiveDependency'=> 'cpan',
+ 'CPAN::Exception::blocked_urllist'=> 'cpan',
+ 'CPAN::Exception::yaml_not_installed'=> 'cpan',
+ 'CPAN::FTP' => 'cpan',
+ 'CPAN::FTP::netrc' => 'cpan',
+ 'CPAN::FirstTime' => 'cpan',
+ 'CPAN::HandleConfig' => 'cpan',
+ 'CPAN::Index' => 'cpan',
+ 'CPAN::InfoObj' => 'cpan',
+ 'CPAN::Kwalify' => 'cpan',
+ 'CPAN::LWP::UserAgent' => 'cpan',
+ 'CPAN::Mirrors' => 'cpan',
+ 'CPAN::Module' => 'cpan',
+ 'CPAN::Nox' => 'cpan',
+ 'CPAN::Prompt' => 'cpan',
+ 'CPAN::Queue' => 'cpan',
+ 'CPAN::Shell' => 'cpan',
+ 'CPAN::Tarzip' => 'cpan',
+ 'CPAN::URL' => 'cpan',
+ 'CPAN::Version' => 'cpan',
+ 'CPANPLUS' => 'cpan',
+ 'CPANPLUS::Backend' => 'cpan',
+ 'CPANPLUS::Backend::RV' => 'cpan',
+ 'CPANPLUS::Config' => 'cpan',
+ 'CPANPLUS::Configure' => 'cpan',
+ 'CPANPLUS::Configure::Setup'=> 'cpan',
+ 'CPANPLUS::Dist' => 'cpan',
+ 'CPANPLUS::Dist::Autobundle'=> 'cpan',
+ 'CPANPLUS::Dist::Base' => 'cpan',
+ 'CPANPLUS::Dist::Build' => 'cpan',
+ 'CPANPLUS::Dist::Build::Constants'=> 'cpan',
+ 'CPANPLUS::Dist::MM' => 'cpan',
+ 'CPANPLUS::Dist::Sample'=> 'cpan',
+ 'CPANPLUS::Error' => 'cpan',
+ 'CPANPLUS::Internals' => 'cpan',
+ 'CPANPLUS::Internals::Constants'=> 'cpan',
+ 'CPANPLUS::Internals::Constants::Report'=> 'cpan',
+ 'CPANPLUS::Internals::Extract'=> 'cpan',
+ 'CPANPLUS::Internals::Fetch'=> 'cpan',
+ 'CPANPLUS::Internals::Report'=> 'cpan',
+ 'CPANPLUS::Internals::Search'=> 'cpan',
+ 'CPANPLUS::Internals::Source'=> 'cpan',
+ 'CPANPLUS::Internals::Source::Memory'=> 'cpan',
+ 'CPANPLUS::Internals::Source::SQLite'=> 'cpan',
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> 'cpan',
+ 'CPANPLUS::Internals::Utils'=> 'cpan',
+ 'CPANPLUS::Internals::Utils::Autoflush'=> 'cpan',
+ 'CPANPLUS::Module' => 'cpan',
+ 'CPANPLUS::Module::Author'=> 'cpan',
+ 'CPANPLUS::Module::Author::Fake'=> 'cpan',
+ 'CPANPLUS::Module::Checksums'=> 'cpan',
+ 'CPANPLUS::Module::Fake'=> 'cpan',
+ 'CPANPLUS::Module::Signature'=> 'cpan',
+ 'CPANPLUS::Selfupdate' => 'cpan',
+ 'CPANPLUS::Shell' => 'cpan',
+ 'CPANPLUS::Shell::Classic'=> 'cpan',
+ 'CPANPLUS::Shell::Default'=> 'cpan',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> 'cpan',
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> 'cpan',
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> 'cpan',
+ 'Class::ISA' => 'cpan',
+ 'Compress::Raw::Bzip2' => undef,
+ 'Compress::Raw::Zlib' => undef,
+ 'Compress::Zlib' => 'cpan',
+ 'Cwd' => 'cpan',
+ 'DB_File' => undef,
+ 'Devel::InnerPackage' => undef,
+ 'Devel::PPPort' => 'cpan',
+ 'Digest' => undef,
+ 'Digest::MD5' => undef,
+ 'Digest::SHA' => undef,
+ 'Digest::base' => undef,
+ 'Digest::file' => undef,
+ 'Encode' => undef,
+ 'Encode::Alias' => undef,
+ 'Encode::Byte' => undef,
+ 'Encode::CJKConstants' => undef,
+ 'Encode::CN' => undef,
+ 'Encode::CN::HZ' => undef,
+ 'Encode::Config' => undef,
+ 'Encode::EBCDIC' => undef,
+ 'Encode::Encoder' => undef,
+ 'Encode::Encoding' => undef,
+ 'Encode::GSM0338' => undef,
+ 'Encode::Guess' => undef,
+ 'Encode::JP' => undef,
+ 'Encode::JP::H2Z' => undef,
+ 'Encode::JP::JIS7' => undef,
+ 'Encode::KR' => undef,
+ 'Encode::KR::2022_KR' => undef,
+ 'Encode::MIME::Header' => undef,
+ 'Encode::MIME::Header::ISO_2022_JP'=> undef,
+ 'Encode::MIME::Name' => undef,
+ 'Encode::Symbol' => undef,
+ 'Encode::TW' => undef,
+ 'Encode::Unicode' => undef,
+ 'Encode::Unicode::UTF7' => undef,
+ 'Exporter' => 'blead',
+ 'Exporter::Heavy' => 'blead',
+ 'ExtUtils::CBuilder' => 'cpan',
+ 'ExtUtils::CBuilder::Base'=> 'cpan',
+ 'ExtUtils::CBuilder::Platform::Unix'=> 'cpan',
+ 'ExtUtils::CBuilder::Platform::VMS'=> 'cpan',
+ 'ExtUtils::CBuilder::Platform::Windows'=> 'cpan',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> 'cpan',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> 'cpan',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> 'cpan',
+ 'ExtUtils::CBuilder::Platform::aix'=> 'cpan',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> 'cpan',
+ 'ExtUtils::CBuilder::Platform::darwin'=> 'cpan',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> 'cpan',
+ 'ExtUtils::CBuilder::Platform::os2'=> 'cpan',
+ 'ExtUtils::Command' => undef,
+ 'ExtUtils::Command::MM' => 'first-come',
+ 'ExtUtils::Constant' => undef,
+ 'ExtUtils::Constant::Base'=> undef,
+ 'ExtUtils::Constant::ProxySubs'=> undef,
+ 'ExtUtils::Constant::Utils'=> undef,
+ 'ExtUtils::Constant::XS'=> undef,
+ 'ExtUtils::Install' => 'blead',
+ 'ExtUtils::Installed' => 'blead',
+ 'ExtUtils::Liblist' => 'first-come',
+ 'ExtUtils::Liblist::Kid'=> 'first-come',
+ 'ExtUtils::MM' => 'first-come',
+ 'ExtUtils::MM_AIX' => 'first-come',
+ 'ExtUtils::MM_Any' => 'first-come',
+ 'ExtUtils::MM_BeOS' => 'first-come',
+ 'ExtUtils::MM_Cygwin' => 'first-come',
+ 'ExtUtils::MM_DOS' => 'first-come',
+ 'ExtUtils::MM_Darwin' => 'first-come',
+ 'ExtUtils::MM_MacOS' => 'first-come',
+ 'ExtUtils::MM_NW5' => 'first-come',
+ 'ExtUtils::MM_OS2' => 'first-come',
+ 'ExtUtils::MM_QNX' => 'first-come',
+ 'ExtUtils::MM_UWIN' => 'first-come',
+ 'ExtUtils::MM_Unix' => 'first-come',
+ 'ExtUtils::MM_VMS' => 'first-come',
+ 'ExtUtils::MM_VOS' => 'first-come',
+ 'ExtUtils::MM_Win32' => 'first-come',
+ 'ExtUtils::MM_Win95' => 'first-come',
+ 'ExtUtils::MY' => 'first-come',
+ 'ExtUtils::MakeMaker' => 'first-come',
+ 'ExtUtils::MakeMaker::Config'=> 'first-come',
+ 'ExtUtils::Manifest' => 'cpan',
+ 'ExtUtils::Mkbootstrap' => 'first-come',
+ 'ExtUtils::Mksymlists' => 'first-come',
+ 'ExtUtils::Packlist' => 'blead',
+ 'ExtUtils::ParseXS' => 'cpan',
+ 'ExtUtils::testlib' => 'first-come',
+ 'Fatal' => 'cpan',
+ 'File::Fetch' => 'cpan',
+ 'File::GlobMapper' => 'cpan',
+ 'File::Path' => undef,
+ 'File::Spec' => 'cpan',
+ 'File::Spec::Cygwin' => 'cpan',
+ 'File::Spec::Epoc' => 'cpan',
+ 'File::Spec::Functions' => 'cpan',
+ 'File::Spec::Mac' => 'cpan',
+ 'File::Spec::OS2' => 'cpan',
+ 'File::Spec::Unix' => 'cpan',
+ 'File::Spec::VMS' => 'cpan',
+ 'File::Spec::Win32' => 'cpan',
+ 'File::Temp' => undef,
+ 'Filespec' => undef,
+ 'Filter::Simple' => 'blead',
+ 'Filter::Util::Call' => undef,
+ 'Getopt::Long' => 'cpan',
+ 'IO::Compress::Adapter::Bzip2'=> 'cpan',
+ 'IO::Compress::Adapter::Deflate'=> 'cpan',
+ 'IO::Compress::Adapter::Identity'=> 'cpan',
+ 'IO::Compress::Base' => 'cpan',
+ 'IO::Compress::Base::Common'=> 'cpan',
+ 'IO::Compress::Bzip2' => 'cpan',
+ 'IO::Compress::Deflate' => 'cpan',
+ 'IO::Compress::Gzip' => 'cpan',
+ 'IO::Compress::Gzip::Constants'=> 'cpan',
+ 'IO::Compress::RawDeflate'=> 'cpan',
+ 'IO::Compress::Zip' => 'cpan',
+ 'IO::Compress::Zip::Constants'=> 'cpan',
+ 'IO::Compress::Zlib::Constants'=> 'cpan',
+ 'IO::Compress::Zlib::Extra'=> 'cpan',
+ 'IO::Uncompress::Adapter::Bunzip2'=> 'cpan',
+ 'IO::Uncompress::Adapter::Identity'=> 'cpan',
+ 'IO::Uncompress::Adapter::Inflate'=> 'cpan',
+ 'IO::Uncompress::AnyInflate'=> 'cpan',
+ 'IO::Uncompress::AnyUncompress'=> 'cpan',
+ 'IO::Uncompress::Base' => 'cpan',
+ 'IO::Uncompress::Bunzip2'=> 'cpan',
+ 'IO::Uncompress::Gunzip'=> 'cpan',
+ 'IO::Uncompress::Inflate'=> 'cpan',
+ 'IO::Uncompress::RawInflate'=> 'cpan',
+ 'IO::Uncompress::Unzip' => 'cpan',
+ 'IO::Zlib' => undef,
+ 'IPC::Cmd' => 'cpan',
+ 'IPC::Msg' => 'cpan',
+ 'IPC::Semaphore' => 'cpan',
+ 'IPC::SharedMem' => 'cpan',
+ 'IPC::SysV' => 'cpan',
+ 'List::Util' => undef,
+ 'List::Util::PP' => undef,
+ 'List::Util::XS' => undef,
+ 'Locale::Constants' => undef,
+ 'Locale::Country' => undef,
+ 'Locale::Currency' => undef,
+ 'Locale::Language' => undef,
+ 'Locale::Maketext' => 'blead',
+ 'Locale::Maketext::Guts'=> 'blead',
+ 'Locale::Maketext::GutsLoader'=> 'blead',
+ 'Locale::Maketext::Simple'=> 'cpan',
+ 'Locale::Script' => undef,
+ 'Log::Message' => 'cpan',
+ 'Log::Message::Config' => 'cpan',
+ 'Log::Message::Handlers'=> 'cpan',
+ 'Log::Message::Item' => 'cpan',
+ 'Log::Message::Simple' => 'cpan',
+ 'MIME::Base64' => undef,
+ 'MIME::QuotedPrint' => undef,
+ 'Math::BigFloat' => undef,
+ 'Math::BigFloat::Trace' => undef,
+ 'Math::BigInt' => undef,
+ 'Math::BigInt::Calc' => undef,
+ 'Math::BigInt::CalcEmu' => undef,
+ 'Math::BigInt::FastCalc'=> undef,
+ 'Math::BigInt::Trace' => undef,
+ 'Math::BigRat' => undef,
+ 'Math::Complex' => 'cpan',
+ 'Math::Trig' => 'cpan',
+ 'Memoize' => undef,
+ 'Memoize::AnyDBM_File' => undef,
+ 'Memoize::Expire' => undef,
+ 'Memoize::ExpireFile' => undef,
+ 'Memoize::ExpireTest' => undef,
+ 'Memoize::NDBM_File' => undef,
+ 'Memoize::SDBM_File' => undef,
+ 'Memoize::Storable' => undef,
+ 'Module::Build' => 'cpan',
+ 'Module::Build::Base' => 'cpan',
+ 'Module::Build::Compat' => 'cpan',
+ 'Module::Build::Config' => 'cpan',
+ 'Module::Build::ConfigData'=> 'cpan',
+ 'Module::Build::Cookbook'=> 'cpan',
+ 'Module::Build::Dumper' => 'cpan',
+ 'Module::Build::ModuleInfo'=> 'cpan',
+ 'Module::Build::Notes' => 'cpan',
+ 'Module::Build::PPMMaker'=> 'cpan',
+ 'Module::Build::Platform::Amiga'=> 'cpan',
+ 'Module::Build::Platform::Default'=> 'cpan',
+ 'Module::Build::Platform::EBCDIC'=> 'cpan',
+ 'Module::Build::Platform::MPEiX'=> 'cpan',
+ 'Module::Build::Platform::MacOS'=> 'cpan',
+ 'Module::Build::Platform::RiscOS'=> 'cpan',
+ 'Module::Build::Platform::Unix'=> 'cpan',
+ 'Module::Build::Platform::VMS'=> 'cpan',
+ 'Module::Build::Platform::VOS'=> 'cpan',
+ 'Module::Build::Platform::Windows'=> 'cpan',
+ 'Module::Build::Platform::aix'=> 'cpan',
+ 'Module::Build::Platform::cygwin'=> 'cpan',
+ 'Module::Build::Platform::darwin'=> 'cpan',
+ 'Module::Build::Platform::os2'=> 'cpan',
+ 'Module::Build::PodParser'=> 'cpan',
+ 'Module::Build::Version'=> 'cpan',
+ 'Module::Build::YAML' => 'cpan',
+ 'Module::CoreList' => 'blead',
+ 'Module::Load' => 'cpan',
+ 'Module::Load::Conditional'=> 'cpan',
+ 'Module::Loaded' => 'cpan',
+ 'Module::Pluggable' => undef,
+ 'Module::Pluggable::Object'=> undef,
+ 'NEXT' => 'cpan',
+ 'Net::Cmd' => undef,
+ 'Net::Config' => undef,
+ 'Net::Domain' => undef,
+ 'Net::FTP' => undef,
+ 'Net::FTP::A' => undef,
+ 'Net::FTP::E' => undef,
+ 'Net::FTP::I' => undef,
+ 'Net::FTP::L' => undef,
+ 'Net::FTP::dataconn' => undef,
+ 'Net::NNTP' => undef,
+ 'Net::Netrc' => undef,
+ 'Net::POP3' => undef,
+ 'Net::Ping' => 'blead',
+ 'Net::SMTP' => undef,
+ 'Net::Time' => undef,
+ 'Object::Accessor' => 'cpan',
+ 'Package::Constants' => 'cpan',
+ 'Params::Check' => 'cpan',
+ 'Parse::CPAN::Meta' => 'cpan',
+ 'PerlIO::via::QuotedPrint'=> undef,
+ 'Pod::Checker' => undef,
+ 'Pod::Escapes' => undef,
+ 'Pod::Find' => undef,
+ 'Pod::InputObjects' => undef,
+ 'Pod::LaTeX' => undef,
+ 'Pod::Man' => 'cpan',
+ 'Pod::ParseLink' => 'cpan',
+ 'Pod::ParseUtils' => undef,
+ 'Pod::Parser' => undef,
+ 'Pod::Perldoc' => 'blead',
+ 'Pod::Perldoc::BaseTo' => 'blead',
+ 'Pod::Perldoc::GetOptsOO'=> 'blead',
+ 'Pod::Perldoc::ToChecker'=> 'blead',
+ 'Pod::Perldoc::ToMan' => 'blead',
+ 'Pod::Perldoc::ToNroff' => 'blead',
+ 'Pod::Perldoc::ToPod' => 'blead',
+ 'Pod::Perldoc::ToRtf' => 'blead',
+ 'Pod::Perldoc::ToText' => 'blead',
+ 'Pod::Perldoc::ToTk' => 'blead',
+ 'Pod::Perldoc::ToXml' => 'blead',
+ 'Pod::PlainText' => undef,
+ 'Pod::Plainer' => 'blead',
+ 'Pod::Select' => undef,
+ 'Pod::Simple' => 'cpan',
+ 'Pod::Simple::BlackBox' => 'cpan',
+ 'Pod::Simple::Checker' => 'cpan',
+ 'Pod::Simple::Debug' => 'cpan',
+ 'Pod::Simple::DumpAsText'=> 'cpan',
+ 'Pod::Simple::DumpAsXML'=> 'cpan',
+ 'Pod::Simple::HTML' => 'cpan',
+ 'Pod::Simple::HTMLBatch'=> 'cpan',
+ 'Pod::Simple::HTMLLegacy'=> 'cpan',
+ 'Pod::Simple::LinkSection'=> 'cpan',
+ 'Pod::Simple::Methody' => 'cpan',
+ 'Pod::Simple::Progress' => 'cpan',
+ 'Pod::Simple::PullParser'=> 'cpan',
+ 'Pod::Simple::PullParserEndToken'=> 'cpan',
+ 'Pod::Simple::PullParserStartToken'=> 'cpan',
+ 'Pod::Simple::PullParserTextToken'=> 'cpan',
+ 'Pod::Simple::PullParserToken'=> 'cpan',
+ 'Pod::Simple::RTF' => 'cpan',
+ 'Pod::Simple::Search' => 'cpan',
+ 'Pod::Simple::SimpleTree'=> 'cpan',
+ 'Pod::Simple::Text' => 'cpan',
+ 'Pod::Simple::TextContent'=> 'cpan',
+ 'Pod::Simple::TiedOutFH'=> 'cpan',
+ 'Pod::Simple::Transcode'=> 'cpan',
+ 'Pod::Simple::TranscodeDumb'=> 'cpan',
+ 'Pod::Simple::TranscodeSmart'=> 'cpan',
+ 'Pod::Simple::XHTML' => 'cpan',
+ 'Pod::Simple::XMLOutStream'=> 'cpan',
+ 'Pod::Text' => 'cpan',
+ 'Pod::Text::Color' => 'cpan',
+ 'Pod::Text::Overstrike' => 'cpan',
+ 'Pod::Text::Termcap' => 'cpan',
+ 'Pod::Usage' => undef,
+ 'Safe' => 'blead',
+ 'Scalar::Util' => undef,
+ 'Scalar::Util::PP' => undef,
+ 'SelfLoader' => 'blead',
+ 'Shell' => undef,
+ 'Storable' => 'blead',
+ 'Switch' => 'blead',
+ 'Sys::Syslog' => 'cpan',
+ 'Sys::Syslog::win32::Win32'=> 'cpan',
+ 'TAP::Base' => undef,
+ 'TAP::Formatter::Base' => undef,
+ 'TAP::Formatter::Color' => undef,
+ 'TAP::Formatter::Console'=> undef,
+ 'TAP::Formatter::Console::ParallelSession'=> undef,
+ 'TAP::Formatter::Console::Session'=> undef,
+ 'TAP::Formatter::File' => undef,
+ 'TAP::Formatter::File::Session'=> undef,
+ 'TAP::Formatter::Session'=> undef,
+ 'TAP::Harness' => undef,
+ 'TAP::Object' => undef,
+ 'TAP::Parser' => undef,
+ 'TAP::Parser::Aggregator'=> undef,
+ 'TAP::Parser::Grammar' => undef,
+ 'TAP::Parser::Iterator' => undef,
+ 'TAP::Parser::Iterator::Array'=> undef,
+ 'TAP::Parser::Iterator::Process'=> undef,
+ 'TAP::Parser::Iterator::Stream'=> undef,
+ 'TAP::Parser::IteratorFactory'=> undef,
+ 'TAP::Parser::Multiplexer'=> undef,
+ 'TAP::Parser::Result' => undef,
+ 'TAP::Parser::Result::Bailout'=> undef,
+ 'TAP::Parser::Result::Comment'=> undef,
+ 'TAP::Parser::Result::Plan'=> undef,
+ 'TAP::Parser::Result::Pragma'=> undef,
+ 'TAP::Parser::Result::Test'=> undef,
+ 'TAP::Parser::Result::Unknown'=> undef,
+ 'TAP::Parser::Result::Version'=> undef,
+ 'TAP::Parser::Result::YAML'=> undef,
+ 'TAP::Parser::ResultFactory'=> undef,
+ 'TAP::Parser::Scheduler'=> undef,
+ 'TAP::Parser::Scheduler::Job'=> undef,
+ 'TAP::Parser::Scheduler::Spinner'=> undef,
+ 'TAP::Parser::Source' => undef,
+ 'TAP::Parser::Source::Perl'=> undef,
+ 'TAP::Parser::Utils' => undef,
+ 'TAP::Parser::YAMLish::Reader'=> undef,
+ 'TAP::Parser::YAMLish::Writer'=> undef,
+ 'Term::ANSIColor' => 'cpan',
+ 'Term::Cap' => undef,
+ 'Term::UI' => 'cpan',
+ 'Term::UI::History' => 'cpan',
+ 'Test' => 'cpan',
+ 'Test::Builder' => 'cpan',
+ 'Test::Builder::Module' => 'cpan',
+ 'Test::Builder::Tester' => 'cpan',
+ 'Test::Builder::Tester::Color'=> 'cpan',
+ 'Test::Harness' => undef,
+ 'Test::More' => 'cpan',
+ 'Test::Simple' => 'cpan',
+ 'Text::Balanced' => undef,
+ 'Text::ParseWords' => undef,
+ 'Text::Soundex' => undef,
+ 'Text::Tabs' => 'cpan',
+ 'Text::Wrap' => 'cpan',
+ 'Thread::Queue' => 'blead',
+ 'Thread::Semaphore' => 'blead',
+ 'Tie::File' => undef,
+ 'Tie::RefHash' => 'cpan',
+ 'Time::HiRes' => undef,
+ 'Time::Local' => 'blead',
+ 'Time::Piece' => undef,
+ 'Time::Piece::Seconds' => undef,
+ 'Unicode::Collate' => 'first-come',
+ 'Unicode::Normalize' => 'first-come',
+ 'VMS::DCLsym' => undef,
+ 'VMS::Stdio' => undef,
+ 'Win32' => 'cpan',
+ 'Win32API::File' => 'cpan',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> 'cpan',
+ 'Win32CORE' => undef,
+ 'XS::APItest::KeywordRPN'=> 'blead',
+ 'XSLoader' => 'blead',
+ 'XSLoader::XSLoader' => 'blead',
+ 'autodie' => 'cpan',
+ 'autodie::exception' => 'cpan',
+ 'autodie::exception::system'=> 'cpan',
+ 'autodie::hints' => 'cpan',
+ 'base' => 'blead',
+ 'bigint' => undef,
+ 'bignum' => undef,
+ 'bigrat' => undef,
+ 'constant' => 'blead',
+ 'encoding' => undef,
+ 'encoding::warnings' => undef,
+ 'fields' => 'blead',
+ 'if' => undef,
+ 'inc::latest' => 'cpan',
+ 'lib' => 'blead',
+ 'parent' => undef,
+ 'threads' => 'blead',
+ 'threads::shared' => 'blead',
+ 'version' => undef,
+ 'warnings' => undef,
+ 'warnings::register' => undef,
+);
+
+%bug_tracker = (
+ 'App::Cpan' => undef,
+ 'App::Prove' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'App::Prove::State' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'App::Prove::State::Result'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'App::Prove::State::Result::Test'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'Archive::Extract' => undef,
+ 'Archive::Tar' => undef,
+ 'Archive::Tar::Constant'=> undef,
+ 'Archive::Tar::File' => undef,
+ 'Attribute::Handlers' => undef,
+ 'B::Debug' => undef,
+ 'B::Deparse' => undef,
+ 'B::Lint' => undef,
+ 'B::Lint::Debug' => undef,
+ 'CGI' => undef,
+ 'CGI::Apache' => undef,
+ 'CGI::Carp' => undef,
+ 'CGI::Cookie' => undef,
+ 'CGI::Fast' => undef,
+ 'CGI::Pretty' => undef,
+ 'CGI::Push' => undef,
+ 'CGI::Switch' => undef,
+ 'CGI::Util' => undef,
+ 'CPAN' => undef,
+ 'CPAN::Author' => undef,
+ 'CPAN::Bundle' => undef,
+ 'CPAN::CacheMgr' => undef,
+ 'CPAN::Complete' => undef,
+ 'CPAN::Debug' => undef,
+ 'CPAN::DeferredCode' => undef,
+ 'CPAN::Distribution' => undef,
+ 'CPAN::Distroprefs' => undef,
+ 'CPAN::Distrostatus' => undef,
+ 'CPAN::Exception::RecursiveDependency'=> undef,
+ 'CPAN::Exception::blocked_urllist'=> undef,
+ 'CPAN::Exception::yaml_not_installed'=> undef,
+ 'CPAN::FTP' => undef,
+ 'CPAN::FTP::netrc' => undef,
+ 'CPAN::FirstTime' => undef,
+ 'CPAN::HandleConfig' => undef,
+ 'CPAN::Index' => undef,
+ 'CPAN::InfoObj' => undef,
+ 'CPAN::Kwalify' => undef,
+ 'CPAN::LWP::UserAgent' => undef,
+ 'CPAN::Mirrors' => undef,
+ 'CPAN::Module' => undef,
+ 'CPAN::Nox' => undef,
+ 'CPAN::Prompt' => undef,
+ 'CPAN::Queue' => undef,
+ 'CPAN::Shell' => undef,
+ 'CPAN::Tarzip' => undef,
+ 'CPAN::URL' => undef,
+ 'CPAN::Version' => undef,
+ 'CPANPLUS' => undef,
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => undef,
+ 'CPANPLUS::Dist::Build::Constants'=> undef,
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => undef,
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> undef,
+ 'CPANPLUS::Shell::Default'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Class::ISA' => undef,
+ 'Compress::Raw::Bzip2' => undef,
+ 'Compress::Raw::Zlib' => undef,
+ 'Compress::Zlib' => undef,
+ 'Cwd' => undef,
+ 'DB_File' => undef,
+ 'Devel::InnerPackage' => undef,
+ 'Devel::PPPort' => undef,
+ 'Digest' => undef,
+ 'Digest::MD5' => undef,
+ 'Digest::SHA' => undef,
+ 'Digest::base' => undef,
+ 'Digest::file' => undef,
+ 'Encode' => undef,
+ 'Encode::Alias' => undef,
+ 'Encode::Byte' => undef,
+ 'Encode::CJKConstants' => undef,
+ 'Encode::CN' => undef,
+ 'Encode::CN::HZ' => undef,
+ 'Encode::Config' => undef,
+ 'Encode::EBCDIC' => undef,
+ 'Encode::Encoder' => undef,
+ 'Encode::Encoding' => undef,
+ 'Encode::GSM0338' => undef,
+ 'Encode::Guess' => undef,
+ 'Encode::JP' => undef,
+ 'Encode::JP::H2Z' => undef,
+ 'Encode::JP::JIS7' => undef,
+ 'Encode::KR' => undef,
+ 'Encode::KR::2022_KR' => undef,
+ 'Encode::MIME::Header' => undef,
+ 'Encode::MIME::Header::ISO_2022_JP'=> undef,
+ 'Encode::MIME::Name' => undef,
+ 'Encode::Symbol' => undef,
+ 'Encode::TW' => undef,
+ 'Encode::Unicode' => undef,
+ 'Encode::Unicode::UTF7' => undef,
+ 'Exporter' => undef,
+ 'Exporter::Heavy' => undef,
+ 'ExtUtils::CBuilder' => undef,
+ 'ExtUtils::CBuilder::Base'=> undef,
+ 'ExtUtils::CBuilder::Platform::Unix'=> undef,
+ 'ExtUtils::CBuilder::Platform::VMS'=> undef,
+ 'ExtUtils::CBuilder::Platform::Windows'=> undef,
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> undef,
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> undef,
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> undef,
+ 'ExtUtils::CBuilder::Platform::aix'=> undef,
+ 'ExtUtils::CBuilder::Platform::cygwin'=> undef,
+ 'ExtUtils::CBuilder::Platform::darwin'=> undef,
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> undef,
+ 'ExtUtils::CBuilder::Platform::os2'=> undef,
+ 'ExtUtils::Command' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-Command',
+ 'ExtUtils::Command::MM' => undef,
+ 'ExtUtils::Constant' => undef,
+ 'ExtUtils::Constant::Base'=> undef,
+ 'ExtUtils::Constant::ProxySubs'=> undef,
+ 'ExtUtils::Constant::Utils'=> undef,
+ 'ExtUtils::Constant::XS'=> undef,
+ 'ExtUtils::Install' => undef,
+ 'ExtUtils::Installed' => undef,
+ 'ExtUtils::Liblist' => undef,
+ 'ExtUtils::Liblist::Kid'=> undef,
+ 'ExtUtils::MM' => undef,
+ 'ExtUtils::MM_AIX' => undef,
+ 'ExtUtils::MM_Any' => undef,
+ 'ExtUtils::MM_BeOS' => undef,
+ 'ExtUtils::MM_Cygwin' => undef,
+ 'ExtUtils::MM_DOS' => undef,
+ 'ExtUtils::MM_Darwin' => undef,
+ 'ExtUtils::MM_MacOS' => undef,
+ 'ExtUtils::MM_NW5' => undef,
+ 'ExtUtils::MM_OS2' => undef,
+ 'ExtUtils::MM_QNX' => undef,
+ 'ExtUtils::MM_UWIN' => undef,
+ 'ExtUtils::MM_Unix' => undef,
+ 'ExtUtils::MM_VMS' => undef,
+ 'ExtUtils::MM_VOS' => undef,
+ 'ExtUtils::MM_Win32' => undef,
+ 'ExtUtils::MM_Win95' => undef,
+ 'ExtUtils::MY' => undef,
+ 'ExtUtils::MakeMaker' => undef,
+ 'ExtUtils::MakeMaker::Config'=> undef,
+ 'ExtUtils::Manifest' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-Manifest',
+ 'ExtUtils::Mkbootstrap' => undef,
+ 'ExtUtils::Mksymlists' => undef,
+ 'ExtUtils::Packlist' => undef,
+ 'ExtUtils::ParseXS' => 'http://rt.cpan.org/Dist/Display.html?Queue=ExtUtils-ParseXS',
+ 'ExtUtils::testlib' => undef,
+ 'Fatal' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'File::Fetch' => undef,
+ 'File::GlobMapper' => undef,
+ 'File::Path' => undef,
+ 'File::Spec' => undef,
+ 'File::Spec::Cygwin' => undef,
+ 'File::Spec::Epoc' => undef,
+ 'File::Spec::Functions' => undef,
+ 'File::Spec::Mac' => undef,
+ 'File::Spec::OS2' => undef,
+ 'File::Spec::Unix' => undef,
+ 'File::Spec::VMS' => undef,
+ 'File::Spec::Win32' => undef,
+ 'File::Temp' => undef,
+ 'Filespec' => undef,
+ 'Filter::Simple' => undef,
+ 'Filter::Util::Call' => undef,
+ 'Getopt::Long' => undef,
+ 'IO::Compress::Adapter::Bzip2'=> undef,
+ 'IO::Compress::Adapter::Deflate'=> undef,
+ 'IO::Compress::Adapter::Identity'=> undef,
+ 'IO::Compress::Base' => undef,
+ 'IO::Compress::Base::Common'=> undef,
+ 'IO::Compress::Bzip2' => undef,
+ 'IO::Compress::Deflate' => undef,
+ 'IO::Compress::Gzip' => undef,
+ 'IO::Compress::Gzip::Constants'=> undef,
+ 'IO::Compress::RawDeflate'=> undef,
+ 'IO::Compress::Zip' => undef,
+ 'IO::Compress::Zip::Constants'=> undef,
+ 'IO::Compress::Zlib::Constants'=> undef,
+ 'IO::Compress::Zlib::Extra'=> undef,
+ 'IO::Uncompress::Adapter::Bunzip2'=> undef,
+ 'IO::Uncompress::Adapter::Identity'=> undef,
+ 'IO::Uncompress::Adapter::Inflate'=> undef,
+ 'IO::Uncompress::AnyInflate'=> undef,
+ 'IO::Uncompress::AnyUncompress'=> undef,
+ 'IO::Uncompress::Base' => undef,
+ 'IO::Uncompress::Bunzip2'=> undef,
+ 'IO::Uncompress::Gunzip'=> undef,
+ 'IO::Uncompress::Inflate'=> undef,
+ 'IO::Uncompress::RawInflate'=> undef,
+ 'IO::Uncompress::Unzip' => undef,
+ 'IO::Zlib' => undef,
+ 'IPC::Cmd' => undef,
+ 'IPC::Msg' => undef,
+ 'IPC::Semaphore' => undef,
+ 'IPC::SharedMem' => undef,
+ 'IPC::SysV' => undef,
+ 'List::Util' => undef,
+ 'List::Util::PP' => undef,
+ 'List::Util::XS' => undef,
+ 'Locale::Constants' => undef,
+ 'Locale::Country' => undef,
+ 'Locale::Currency' => undef,
+ 'Locale::Language' => undef,
+ 'Locale::Maketext' => undef,
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Maketext::Simple'=> undef,
+ 'Locale::Script' => undef,
+ 'Log::Message' => undef,
+ 'Log::Message::Config' => undef,
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => undef,
+ 'MIME::Base64' => undef,
+ 'MIME::QuotedPrint' => undef,
+ 'Math::BigFloat' => undef,
+ 'Math::BigFloat::Trace' => undef,
+ 'Math::BigInt' => undef,
+ 'Math::BigInt::Calc' => undef,
+ 'Math::BigInt::CalcEmu' => undef,
+ 'Math::BigInt::FastCalc'=> undef,
+ 'Math::BigInt::Trace' => undef,
+ 'Math::BigRat' => undef,
+ 'Math::Complex' => undef,
+ 'Math::Trig' => undef,
+ 'Memoize' => undef,
+ 'Memoize::AnyDBM_File' => undef,
+ 'Memoize::Expire' => undef,
+ 'Memoize::ExpireFile' => undef,
+ 'Memoize::ExpireTest' => undef,
+ 'Memoize::NDBM_File' => undef,
+ 'Memoize::SDBM_File' => undef,
+ 'Memoize::Storable' => undef,
+ 'Module::Build' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Base' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Compat' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Config' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Cookbook'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Dumper' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::ModuleInfo'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Notes' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::PPMMaker'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::Amiga'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::Default'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::EBCDIC'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::MPEiX'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::MacOS'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::RiscOS'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::Unix'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::VMS'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::VOS'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::Windows'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::aix'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::cygwin'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::darwin'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::os2'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::PodParser'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Version'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::YAML' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::CoreList' => undef,
+ 'Module::Load' => undef,
+ 'Module::Load::Conditional'=> undef,
+ 'Module::Loaded' => undef,
+ 'Module::Pluggable' => undef,
+ 'Module::Pluggable::Object'=> undef,
+ 'NEXT' => undef,
+ 'Net::Cmd' => undef,
+ 'Net::Config' => undef,
+ 'Net::Domain' => undef,
+ 'Net::FTP' => undef,
+ 'Net::FTP::A' => undef,
+ 'Net::FTP::E' => undef,
+ 'Net::FTP::I' => undef,
+ 'Net::FTP::L' => undef,
+ 'Net::FTP::dataconn' => undef,
+ 'Net::NNTP' => undef,
+ 'Net::Netrc' => undef,
+ 'Net::POP3' => undef,
+ 'Net::Ping' => undef,
+ 'Net::SMTP' => undef,
+ 'Net::Time' => undef,
+ 'Object::Accessor' => undef,
+ 'Package::Constants' => undef,
+ 'Params::Check' => undef,
+ 'Parse::CPAN::Meta' => undef,
+ 'PerlIO::via::QuotedPrint'=> undef,
+ 'Pod::Checker' => undef,
+ 'Pod::Escapes' => undef,
+ 'Pod::Find' => undef,
+ 'Pod::InputObjects' => undef,
+ 'Pod::LaTeX' => undef,
+ 'Pod::Man' => undef,
+ 'Pod::ParseLink' => undef,
+ 'Pod::ParseUtils' => undef,
+ 'Pod::Parser' => undef,
+ 'Pod::Perldoc' => undef,
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => undef,
+ 'Pod::Plainer' => undef,
+ 'Pod::Select' => undef,
+ 'Pod::Simple' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::BlackBox' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Checker' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Debug' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::DumpAsText'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::DumpAsXML'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::HTML' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::HTMLBatch'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::HTMLLegacy'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::LinkSection'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Methody' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Progress' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::PullParser'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::PullParserEndToken'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::PullParserStartToken'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::PullParserTextToken'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::PullParserToken'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::RTF' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Search' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::SimpleTree'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Text' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::TextContent'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::TiedOutFH'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Transcode'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::TranscodeDumb'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::TranscodeSmart'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::XHTML' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::XMLOutStream'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Text' => undef,
+ 'Pod::Text::Color' => undef,
+ 'Pod::Text::Overstrike' => undef,
+ 'Pod::Text::Termcap' => undef,
+ 'Pod::Usage' => undef,
+ 'Safe' => undef,
+ 'Scalar::Util' => undef,
+ 'Scalar::Util::PP' => undef,
+ 'SelfLoader' => undef,
+ 'Shell' => undef,
+ 'Storable' => undef,
+ 'Switch' => undef,
+ 'Sys::Syslog' => undef,
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Base' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Color' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Console'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Console::ParallelSession'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Console::Session'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::File' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::File::Session'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Session'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Harness' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Object' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Aggregator'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Grammar' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Iterator' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Iterator::Array'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Iterator::Process'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Iterator::Stream'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::IteratorFactory'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Multiplexer'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Bailout'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Comment'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Plan'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Pragma'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Test'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Unknown'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Version'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::YAML'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::ResultFactory'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Scheduler'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Scheduler::Job'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Scheduler::Spinner'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Source' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Source::Perl'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Utils' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::YAMLish::Reader'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::YAMLish::Writer'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'Term::ANSIColor' => undef,
+ 'Term::Cap' => undef,
+ 'Term::UI' => undef,
+ 'Term::UI::History' => undef,
+ 'Test' => undef,
+ 'Test::Builder' => 'http://code.google.com/p/test-more/issues',
+ 'Test::Builder::Module' => 'http://code.google.com/p/test-more/issues',
+ 'Test::Builder::Tester' => 'http://code.google.com/p/test-more/issues',
+ 'Test::Builder::Tester::Color'=> 'http://code.google.com/p/test-more/issues',
+ 'Test::Harness' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'Test::More' => 'http://code.google.com/p/test-more/issues',
+ 'Test::Simple' => 'http://code.google.com/p/test-more/issues',
+ 'Text::Balanced' => undef,
+ 'Text::ParseWords' => undef,
+ 'Text::Soundex' => undef,
+ 'Text::Tabs' => undef,
+ 'Text::Wrap' => undef,
+ 'Thread::Queue' => undef,
+ 'Thread::Semaphore' => undef,
+ 'Tie::File' => undef,
+ 'Tie::RefHash' => undef,
+ 'Time::HiRes' => undef,
+ 'Time::Local' => undef,
+ 'Time::Piece' => undef,
+ 'Time::Piece::Seconds' => undef,
+ 'Unicode::Collate' => undef,
+ 'Unicode::Normalize' => undef,
+ 'Win32' => undef,
+ 'Win32API::File' => undef,
+ 'Win32API::File::ExtUtils::Myconst2perl'=> undef,
+ 'XS::APItest::KeywordRPN'=> undef,
+ 'XSLoader' => undef,
+ 'XSLoader::XSLoader' => undef,
+ 'autodie' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'autodie::exception' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'autodie::exception::system'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'autodie::hints' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'base' => undef,
+ 'bigint' => undef,
+ 'bignum' => undef,
+ 'bigrat' => undef,
+ 'constant' => undef,
+ 'encoding' => undef,
+ 'encoding::warnings' => undef,
+ 'fields' => undef,
+ 'if' => undef,
+ 'inc::latest' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'lib' => undef,
+ 'parent' => undef,
+ 'threads' => undef,
+ 'threads::shared' => undef,
+ 'version' => undef,
+);
+
+# Create aliases with trailing zeros for $] use
+
+$released{'5.000'} = $released{5};
+$released{'5.010000'} = $released{5.01};
+$released{'5.011000'} = $released{5.011};
+
+$version{'5.000'} = $version{5};
+$version{'5.010000'} = $version{5.01};
+$version{'5.011000'} = $version{5.011};
+
+$deprecated{'5.011000'} = $deprecated{5.011};
+
+1;
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Load.pm b/Master/tlpkg/tlperl.straw/lib/Module/Load.pm
new file mode 100755
index 00000000000..08f64b2b2c0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Load.pm
@@ -0,0 +1,181 @@
+package Module::Load;
+
+$VERSION = '0.16';
+
+use strict;
+use File::Spec ();
+
+sub import {
+ my $who = _who();
+
+ { no strict 'refs';
+ *{"${who}::load"} = *load;
+ }
+}
+
+sub load (*;@) {
+ my $mod = shift or return;
+ my $who = _who();
+
+ if( _is_file( $mod ) ) {
+ require $mod;
+ } else {
+ LOAD: {
+ my $err;
+ for my $flag ( qw[1 0] ) {
+ my $file = _to_file( $mod, $flag);
+ eval { require $file };
+ $@ ? $err .= $@ : last LOAD;
+ }
+ die $err if $err;
+ }
+ }
+
+ ### This addresses #41883: Module::Load cannot import
+ ### non-Exporter module. ->import() routines weren't
+ ### properly called when load() was used.
+ { no strict 'refs';
+ my $import;
+ if (@_ and $import = $mod->can('import')) {
+ unshift @_, $mod;
+ goto &$import;
+ }
+ }
+}
+
+sub _to_file{
+ local $_ = shift;
+ my $pm = shift || '';
+
+ my @parts = split /::/;
+
+ ### because of [perl #19213], see caveats ###
+ my $file = $^O eq 'MSWin32'
+ ? join "/", @parts
+ : File::Spec->catfile( @parts );
+
+ $file .= '.pm' if $pm;
+
+ ### on perl's before 5.10 (5.9.5@31746) if you require
+ ### a file in VMS format, it's stored in %INC in VMS
+ ### format. Therefor, better unixify it first
+ ### Patch in reply to John Malmbergs patch (as mentioned
+ ### above) on p5p Tue 21 Aug 2007 04:55:07
+ $file = VMS::Filespec::unixify($file) if $^O eq 'VMS';
+
+ return $file;
+}
+
+sub _who { (caller(1))[0] }
+
+sub _is_file {
+ local $_ = shift;
+ return /^\./ ? 1 :
+ /[^\w:']/ ? 1 :
+ undef
+ #' silly bbedit..
+}
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Module::Load - runtime require of both modules and files
+
+=head1 SYNOPSIS
+
+ use Module::Load;
+
+ my $module = 'Data:Dumper';
+ load Data::Dumper; # loads that module
+ load 'Data::Dumper'; # ditto
+ load $module # tritto
+
+ my $script = 'some/script.pl'
+ load $script;
+ load 'some/script.pl'; # use quotes because of punctuations
+
+ load thing; # try 'thing' first, then 'thing.pm'
+
+ load CGI, ':standard' # like 'use CGI qw[:standard]'
+
+
+=head1 DESCRIPTION
+
+C<load> eliminates the need to know whether you are trying to require
+either a file or a module.
+
+If you consult C<perldoc -f require> you will see that C<require> will
+behave differently when given a bareword or a string.
+
+In the case of a string, C<require> assumes you are wanting to load a
+file. But in the case of a bareword, it assumes you mean a module.
+
+This gives nasty overhead when you are trying to dynamically require
+modules at runtime, since you will need to change the module notation
+(C<Acme::Comment>) to a file notation fitting the particular platform
+you are on.
+
+C<load> eliminates the need for this overhead and will just DWYM.
+
+=head1 Rules
+
+C<load> has the following rules to decide what it thinks you want:
+
+=over 4
+
+=item *
+
+If the argument has any characters in it other than those matching
+C<\w>, C<:> or C<'>, it must be a file
+
+=item *
+
+If the argument matches only C<[\w:']>, it must be a module
+
+=item *
+
+If the argument matches only C<\w>, it could either be a module or a
+file. We will try to find C<file> first in C<@INC> and if that fails,
+we will try to find C<file.pm> in @INC.
+If both fail, we die with the respective error messages.
+
+=back
+
+=head1 Caveats
+
+Because of a bug in perl (#19213), at least in version 5.6.1, we have
+to hardcode the path separator for a require on Win32 to be C</>, like
+on Unix rather than the Win32 C<\>. Otherwise perl will not read its
+own %INC accurately double load files if they are required again, or
+in the worst case, core dump.
+
+C<Module::Load> cannot do implicit imports, only explicit imports.
+(in other words, you always have to specify explicitly what you wish
+to import from a module, even if the functions are in that modules'
+C<@EXPORT>)
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jonas B. Nielsen for making explicit imports work.
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-module-load@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Load/Conditional.pm b/Master/tlpkg/tlperl.straw/lib/Module/Load/Conditional.pm
new file mode 100755
index 00000000000..850a7b65cdf
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Load/Conditional.pm
@@ -0,0 +1,643 @@
+package Module::Load::Conditional;
+
+use strict;
+
+use Module::Load;
+use Params::Check qw[check];
+use Locale::Maketext::Simple Style => 'gettext';
+
+use Carp ();
+use File::Spec ();
+use FileHandle ();
+use version;
+
+use constant ON_VMS => $^O eq 'VMS';
+
+BEGIN {
+ use vars qw[ $VERSION @ISA $VERBOSE $CACHE @EXPORT_OK $DEPRECATED
+ $FIND_VERSION $ERROR $CHECK_INC_HASH];
+ use Exporter;
+ @ISA = qw[Exporter];
+ $VERSION = '0.34';
+ $VERBOSE = 0;
+ $DEPRECATED = 0;
+ $FIND_VERSION = 1;
+ $CHECK_INC_HASH = 0;
+ @EXPORT_OK = qw[check_install can_load requires];
+}
+
+=pod
+
+=head1 NAME
+
+Module::Load::Conditional - Looking up module information / loading at runtime
+
+=head1 SYNOPSIS
+
+ use Module::Load::Conditional qw[can_load check_install requires];
+
+
+ my $use_list = {
+ CPANPLUS => 0.05,
+ LWP => 5.60,
+ 'Test::More' => undef,
+ };
+
+ print can_load( modules => $use_list )
+ ? 'all modules loaded successfully'
+ : 'failed to load required modules';
+
+
+ my $rv = check_install( module => 'LWP', version => 5.60 )
+ or print 'LWP is not installed!';
+
+ print 'LWP up to date' if $rv->{uptodate};
+ print "LWP version is $rv->{version}\n";
+ print "LWP is installed as file $rv->{file}\n";
+
+
+ print "LWP requires the following modules to be installed:\n";
+ print join "\n", requires('LWP');
+
+ ### allow M::L::C to peek in your %INC rather than just
+ ### scanning @INC
+ $Module::Load::Conditional::CHECK_INC_HASH = 1;
+
+ ### reset the 'can_load' cache
+ undef $Module::Load::Conditional::CACHE;
+
+ ### don't have Module::Load::Conditional issue warnings --
+ ### default is '1'
+ $Module::Load::Conditional::VERBOSE = 0;
+
+ ### The last error that happened during a call to 'can_load'
+ my $err = $Module::Load::Conditional::ERROR;
+
+
+=head1 DESCRIPTION
+
+Module::Load::Conditional provides simple ways to query and possibly load any of
+the modules you have installed on your system during runtime.
+
+It is able to load multiple modules at once or none at all if one of
+them was not able to load. It also takes care of any error checking
+and so forth.
+
+=head1 Methods
+
+=head1 $href = check_install( module => NAME [, version => VERSION, verbose => BOOL ] );
+
+C<check_install> allows you to verify if a certain module is installed
+or not. You may call it with the following arguments:
+
+=over 4
+
+=item module
+
+The name of the module you wish to verify -- this is a required key
+
+=item version
+
+The version this module needs to be -- this is optional
+
+=item verbose
+
+Whether or not to be verbose about what it is doing -- it will default
+to $Module::Load::Conditional::VERBOSE
+
+=back
+
+It will return undef if it was not able to find where the module was
+installed, or a hash reference with the following keys if it was able
+to find the file:
+
+=over 4
+
+=item file
+
+Full path to the file that contains the module
+
+=item dir
+
+Directory, or more exact the C<@INC> entry, where the module was
+loaded from.
+
+=item version
+
+The version number of the installed module - this will be C<undef> if
+the module had no (or unparsable) version number, or if the variable
+C<$Module::Load::Conditional::FIND_VERSION> was set to true.
+(See the C<GLOBAL VARIABLES> section below for details)
+
+=item uptodate
+
+A boolean value indicating whether or not the module was found to be
+at least the version you specified. If you did not specify a version,
+uptodate will always be true if the module was found.
+If no parsable version was found in the module, uptodate will also be
+true, since C<check_install> had no way to verify clearly.
+
+See also C<$Module::Load::Conditional::DEPRECATED>, which affects
+the outcome of this value.
+
+=back
+
+=cut
+
+### this checks if a certain module is installed already ###
+### if it returns true, the module in question is already installed
+### or we found the file, but couldn't open it, OR there was no version
+### to be found in the module
+### it will return 0 if the version in the module is LOWER then the one
+### we are looking for, or if we couldn't find the desired module to begin with
+### if the installed version is higher or equal to the one we want, it will return
+### a hashref with he module name and version in it.. so 'true' as well.
+sub check_install {
+ my %hash = @_;
+
+ my $tmpl = {
+ version => { default => '0.0' },
+ module => { required => 1 },
+ verbose => { default => $VERBOSE },
+ };
+
+ my $args;
+ unless( $args = check( $tmpl, \%hash, $VERBOSE ) ) {
+ warn loc( q[A problem occurred checking arguments] ) if $VERBOSE;
+ return;
+ }
+
+ my $file = File::Spec->catfile( split /::/, $args->{module} ) . '.pm';
+ my $file_inc = File::Spec::Unix->catfile(
+ split /::/, $args->{module}
+ ) . '.pm';
+
+ ### where we store the return value ###
+ my $href = {
+ file => undef,
+ version => undef,
+ uptodate => undef,
+ };
+
+ my $filename;
+
+ ### check the inc hash if we're allowed to
+ if( $CHECK_INC_HASH ) {
+ $filename = $href->{'file'} =
+ $INC{ $file_inc } if defined $INC{ $file_inc };
+
+ ### find the version by inspecting the package
+ if( defined $filename && $FIND_VERSION ) {
+ no strict 'refs';
+ $href->{version} = ${ "$args->{module}"."::VERSION" };
+ }
+ }
+
+ ### we didnt find the filename yet by looking in %INC,
+ ### so scan the dirs
+ unless( $filename ) {
+
+ DIR: for my $dir ( @INC ) {
+
+ my $fh;
+
+ if ( ref $dir ) {
+ ### @INC hook -- we invoke it and get the filehandle back
+ ### this is actually documented behaviour as of 5.8 ;)
+
+ if (UNIVERSAL::isa($dir, 'CODE')) {
+ ($fh) = $dir->($dir, $file);
+
+ } elsif (UNIVERSAL::isa($dir, 'ARRAY')) {
+ ($fh) = $dir->[0]->($dir, $file, @{$dir}{1..$#{$dir}})
+
+ } elsif (UNIVERSAL::can($dir, 'INC')) {
+ ($fh) = $dir->INC($file);
+ }
+
+ if (!UNIVERSAL::isa($fh, 'GLOB')) {
+ warn loc(q[Cannot open file '%1': %2], $file, $!)
+ if $args->{verbose};
+ next;
+ }
+
+ $filename = $INC{$file_inc} || $file;
+
+ } else {
+ $filename = File::Spec->catfile($dir, $file);
+ next unless -e $filename;
+
+ $fh = new FileHandle;
+ if (!$fh->open($filename)) {
+ warn loc(q[Cannot open file '%1': %2], $file, $!)
+ if $args->{verbose};
+ next;
+ }
+ }
+
+ ### store the directory we found the file in
+ $href->{dir} = $dir;
+
+ ### files need to be in unix format under vms,
+ ### or they might be loaded twice
+ $href->{file} = ON_VMS
+ ? VMS::Filespec::unixify( $filename )
+ : $filename;
+
+ ### user wants us to find the version from files
+ if( $FIND_VERSION ) {
+
+ my $in_pod = 0;
+ while ( my $line = <$fh> ) {
+
+ ### stolen from EU::MM_Unix->parse_version to address
+ ### #24062: "Problem with CPANPLUS 0.076 misidentifying
+ ### versions after installing Text::NSP 1.03" where a
+ ### VERSION mentioned in the POD was found before
+ ### the real $VERSION declaration.
+ $in_pod = $line =~ /^=(?!cut)/ ? 1 :
+ $line =~ /^=cut/ ? 0 :
+ $in_pod;
+ next if $in_pod;
+
+ ### try to find a version declaration in this string.
+ my $ver = __PACKAGE__->_parse_version( $line );
+
+ if( defined $ver ) {
+ $href->{version} = $ver;
+
+ last DIR;
+ }
+ }
+ }
+ }
+ }
+
+ ### if we couldn't find the file, return undef ###
+ return unless defined $href->{file};
+
+ ### only complain if we're expected to find a version higher than 0.0 anyway
+ if( $FIND_VERSION and not defined $href->{version} ) {
+ { ### don't warn about the 'not numeric' stuff ###
+ local $^W;
+
+ ### if we got here, we didn't find the version
+ warn loc(q[Could not check version on '%1'], $args->{module} )
+ if $args->{verbose} and $args->{version} > 0;
+ }
+ $href->{uptodate} = 1;
+
+ } else {
+ ### don't warn about the 'not numeric' stuff ###
+ local $^W;
+
+ ### use qv(), as it will deal with developer release number
+ ### ie ones containing _ as well. This addresses bug report
+ ### #29348: Version compare logic doesn't handle alphas?
+ ###
+ ### Update from JPeacock: apparently qv() and version->new
+ ### are different things, and we *must* use version->new
+ ### here, or things like #30056 might start happening
+ $href->{uptodate} =
+ version->new( $args->{version} ) <= version->new( $href->{version} )
+ ? 1
+ : 0;
+ }
+
+ if ( $DEPRECATED and version->new($]) >= version->new('5.011') ) {
+ require Module::CoreList;
+ require Config;
+
+ $href->{uptodate} = 0 if
+ exists $Module::CoreList::version{ 0+$] }{ $args->{module} } and
+ Module::CoreList::is_deprecated( $args->{module} ) and
+ $Config::Config{privlibexp} eq $href->{dir};
+ }
+
+ return $href;
+}
+
+sub _parse_version {
+ my $self = shift;
+ my $str = shift or return;
+ my $verbose = shift or 0;
+
+ ### skip commented out lines, they won't eval to anything.
+ return if $str =~ /^\s*#/;
+
+ ### the following regexp & eval statement comes from the
+ ### ExtUtils::MakeMaker source (EU::MM_Unix->parse_version)
+ ### Following #18892, which tells us the original
+ ### regex breaks under -T, we must modifiy it so
+ ### it captures the entire expression, and eval /that/
+ ### rather than $_, which is insecure.
+ my $taint_safe_str = do { $str =~ /(^.*$)/sm; $1 };
+
+ if( $str =~ /(?<!\\)([\$*])(([\w\:\']*)\bVERSION)\b.*\=/ ) {
+
+ print "Evaluating: $str\n" if $verbose;
+
+ ### this creates a string to be eval'd, like:
+ # package Module::Load::Conditional::_version;
+ # no strict;
+ #
+ # local $VERSION;
+ # $VERSION=undef; do {
+ # use version; $VERSION = qv('0.0.3');
+ # }; $VERSION
+
+ my $eval = qq{
+ package Module::Load::Conditional::_version;
+ no strict;
+
+ local $1$2;
+ \$$2=undef; do {
+ $taint_safe_str
+ }; \$$2
+ };
+
+ print "Evaltext: $eval\n" if $verbose;
+
+ my $result = do {
+ local $^W = 0;
+ eval($eval);
+ };
+
+
+ my $rv = defined $result ? $result : '0.0';
+
+ print( $@ ? "Error: $@\n" : "Result: $rv\n" ) if $verbose;
+
+ return $rv;
+ }
+
+ ### unable to find a version in this string
+ return;
+}
+
+=head2 $bool = can_load( modules => { NAME => VERSION [,NAME => VERSION] }, [verbose => BOOL, nocache => BOOL] )
+
+C<can_load> will take a list of modules, optionally with version
+numbers and determine if it is able to load them. If it can load *ALL*
+of them, it will. If one or more are unloadable, none will be loaded.
+
+This is particularly useful if you have More Than One Way (tm) to
+solve a problem in a program, and only wish to continue down a path
+if all modules could be loaded, and not load them if they couldn't.
+
+This function uses the C<load> function from Module::Load under the
+hood.
+
+C<can_load> takes the following arguments:
+
+=over 4
+
+=item modules
+
+This is a hashref of module/version pairs. The version indicates the
+minimum version to load. If no version is provided, any version is
+assumed to be good enough.
+
+=item verbose
+
+This controls whether warnings should be printed if a module failed
+to load.
+The default is to use the value of $Module::Load::Conditional::VERBOSE.
+
+=item nocache
+
+C<can_load> keeps its results in a cache, so it will not load the
+same module twice, nor will it attempt to load a module that has
+already failed to load before. By default, C<can_load> will check its
+cache, but you can override that by setting C<nocache> to true.
+
+=cut
+
+sub can_load {
+ my %hash = @_;
+
+ my $tmpl = {
+ modules => { default => {}, strict_type => 1 },
+ verbose => { default => $VERBOSE },
+ nocache => { default => 0 },
+ };
+
+ my $args;
+
+ unless( $args = check( $tmpl, \%hash, $VERBOSE ) ) {
+ $ERROR = loc(q[Problem validating arguments!]);
+ warn $ERROR if $VERBOSE;
+ return;
+ }
+
+ ### layout of $CACHE:
+ ### $CACHE = {
+ ### $ module => {
+ ### usable => BOOL,
+ ### version => \d,
+ ### file => /path/to/file,
+ ### },
+ ### };
+
+ $CACHE ||= {}; # in case it was undef'd
+
+ my $error;
+ BLOCK: {
+ my $href = $args->{modules};
+
+ my @load;
+ for my $mod ( keys %$href ) {
+
+ next if $CACHE->{$mod}->{usable} && !$args->{nocache};
+
+ ### else, check if the hash key is defined already,
+ ### meaning $mod => 0,
+ ### indicating UNSUCCESSFUL prior attempt of usage
+
+ ### use qv(), as it will deal with developer release number
+ ### ie ones containing _ as well. This addresses bug report
+ ### #29348: Version compare logic doesn't handle alphas?
+ ###
+ ### Update from JPeacock: apparently qv() and version->new
+ ### are different things, and we *must* use version->new
+ ### here, or things like #30056 might start happening
+ if ( !$args->{nocache}
+ && defined $CACHE->{$mod}->{usable}
+ && (version->new( $CACHE->{$mod}->{version}||0 )
+ >= version->new( $href->{$mod} ) )
+ ) {
+ $error = loc( q[Already tried to use '%1', which was unsuccessful], $mod);
+ last BLOCK;
+ }
+
+ my $mod_data = check_install(
+ module => $mod,
+ version => $href->{$mod}
+ );
+
+ if( !$mod_data or !defined $mod_data->{file} ) {
+ $error = loc(q[Could not find or check module '%1'], $mod);
+ $CACHE->{$mod}->{usable} = 0;
+ last BLOCK;
+ }
+
+ map {
+ $CACHE->{$mod}->{$_} = $mod_data->{$_}
+ } qw[version file uptodate];
+
+ push @load, $mod;
+ }
+
+ for my $mod ( @load ) {
+
+ if ( $CACHE->{$mod}->{uptodate} ) {
+
+ eval { load $mod };
+
+ ### in case anything goes wrong, log the error, the fact
+ ### we tried to use this module and return 0;
+ if( $@ ) {
+ $error = $@;
+ $CACHE->{$mod}->{usable} = 0;
+ last BLOCK;
+ } else {
+ $CACHE->{$mod}->{usable} = 1;
+ }
+
+ ### module not found in @INC, store the result in
+ ### $CACHE and return 0
+ } else {
+
+ $error = loc(q[Module '%1' is not uptodate!], $mod);
+ $CACHE->{$mod}->{usable} = 0;
+ last BLOCK;
+ }
+ }
+
+ } # BLOCK
+
+ if( defined $error ) {
+ $ERROR = $error;
+ Carp::carp( loc(q|%1 [THIS MAY BE A PROBLEM!]|,$error) ) if $args->{verbose};
+ return;
+ } else {
+ return 1;
+ }
+}
+
+=back
+
+=head2 @list = requires( MODULE );
+
+C<requires> can tell you what other modules a particular module
+requires. This is particularly useful when you're intending to write
+a module for public release and are listing its prerequisites.
+
+C<requires> takes but one argument: the name of a module.
+It will then first check if it can actually load this module, and
+return undef if it can't.
+Otherwise, it will return a list of modules and pragmas that would
+have been loaded on the module's behalf.
+
+Note: The list C<require> returns has originated from your current
+perl and your current install.
+
+=cut
+
+sub requires {
+ my $who = shift;
+
+ unless( check_install( module => $who ) ) {
+ warn loc(q[You do not have module '%1' installed], $who) if $VERBOSE;
+ return undef;
+ }
+
+ my $lib = join " ", map { qq["-I$_"] } @INC;
+ my $cmd = qq[$^X $lib -M$who -e"print(join(qq[\\n],keys(%INC)))"];
+
+ return sort
+ grep { !/^$who$/ }
+ map { chomp; s|/|::|g; $_ }
+ grep { s|\.pm$||i; }
+ `$cmd`;
+}
+
+1;
+
+__END__
+
+=head1 Global Variables
+
+The behaviour of Module::Load::Conditional can be altered by changing the
+following global variables:
+
+=head2 $Module::Load::Conditional::VERBOSE
+
+This controls whether Module::Load::Conditional will issue warnings and
+explanations as to why certain things may have failed. If you set it
+to 0, Module::Load::Conditional will not output any warnings.
+The default is 0;
+
+=head2 $Module::Load::Conditional::FIND_VERSION
+
+This controls whether Module::Load::Conditional will try to parse
+(and eval) the version from the module you're trying to load.
+
+If you don't wish to do this, set this variable to C<false>. Understand
+then that version comparisons are not possible, and Module::Load::Conditional
+can not tell you what module version you have installed.
+This may be desirable from a security or performance point of view.
+Note that C<$FIND_VERSION> code runs safely under C<taint mode>.
+
+The default is 1;
+
+=head2 $Module::Load::Conditional::CHECK_INC_HASH
+
+This controls whether C<Module::Load::Conditional> checks your
+C<%INC> hash to see if a module is available. By default, only
+C<@INC> is scanned to see if a module is physically on your
+filesystem, or avialable via an C<@INC-hook>. Setting this variable
+to C<true> will trust any entries in C<%INC> and return them for
+you.
+
+The default is 0;
+
+=head2 $Module::Load::Conditional::CACHE
+
+This holds the cache of the C<can_load> function. If you explicitly
+want to remove the current cache, you can set this variable to
+C<undef>
+
+=head2 $Module::Load::Conditional::ERROR
+
+This holds a string of the last error that happened during a call to
+C<can_load>. It is useful to inspect this when C<can_load> returns
+C<undef>.
+
+=head2 $Module::Load::Conditional::DEPRECATED
+
+This controls whether C<Module::Load::Conditional> checks if
+a dual-life core module has been deprecated. If this is set to
+true C<check_install> will return false to C<uptodate>, if
+a dual-life module is found to be loaded from C<$Config{privlibexp}>
+
+The default is 0;
+
+=head1 See Also
+
+C<Module::Load>
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-module-load-conditional@rt.cpan.orgE<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Loaded.pm b/Master/tlpkg/tlperl.straw/lib/Module/Loaded.pm
new file mode 100755
index 00000000000..26cf07e3e61
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Loaded.pm
@@ -0,0 +1,142 @@
+package Module::Loaded;
+
+use strict;
+use Carp qw[carp];
+
+BEGIN { use base 'Exporter';
+ use vars qw[@EXPORT $VERSION];
+
+ $VERSION = '0.06';
+ @EXPORT = qw[mark_as_loaded mark_as_unloaded is_loaded];
+}
+
+=head1 NAME
+
+Module::Loaded - mark modules as loaded or unloaded
+
+=head1 SYNOPSIS
+
+ use Module::Loaded;
+
+ $bool = mark_as_loaded('Foo'); # Foo.pm is now marked as loaded
+ $loc = is_loaded('Foo'); # location of Foo.pm set to the
+ # loaders location
+ eval "require 'Foo'"; # is now a no-op
+
+ $bool = mark_as_unloaded('Foo'); # Foo.pm no longer marked as loaded
+ eval "require 'Foo'"; # Will try to find Foo.pm in @INC
+
+=head1 DESCRIPTION
+
+When testing applications, often you find yourself needing to provide
+functionality in your test environment that would usually be provided
+by external modules. Rather than munging the C<%INC> by hand to mark
+these external modules as loaded, so they are not attempted to be loaded
+by perl, this module offers you a very simple way to mark modules as
+loaded and/or unloaded.
+
+=head1 FUNCTIONS
+
+=head2 $bool = mark_as_loaded( PACKAGE );
+
+Marks the package as loaded to perl. C<PACKAGE> can be a bareword or
+string.
+
+If the module is already loaded, C<mark_as_loaded> will carp about
+this and tell you from where the C<PACKAGE> has been loaded already.
+
+=cut
+
+sub mark_as_loaded (*) {
+ my $pm = shift;
+ my $file = __PACKAGE__->_pm_to_file( $pm ) or return;
+ my $who = [caller]->[1];
+
+ my $where = is_loaded( $pm );
+ if ( defined $where ) {
+ carp "'$pm' already marked as loaded ('$where')";
+
+ } else {
+ $INC{$file} = $who;
+ }
+
+ return 1;
+}
+
+=head2 $bool = mark_as_unloaded( PACKAGE );
+
+Marks the package as unloaded to perl, which is the exact opposite
+of C<mark_as_loaded>. C<PACKAGE> can be a bareword or string.
+
+If the module is already unloaded, C<mark_as_unloaded> will carp about
+this and tell you the C<PACKAGE> has been unloaded already.
+
+=cut
+
+sub mark_as_unloaded (*) {
+ my $pm = shift;
+ my $file = __PACKAGE__->_pm_to_file( $pm ) or return;
+
+ unless( defined is_loaded( $pm ) ) {
+ carp "'$pm' already marked as unloaded";
+
+ } else {
+ delete $INC{ $file };
+ }
+
+ return 1;
+}
+
+=head2 $loc = is_loaded( PACKAGE );
+
+C<is_loaded> tells you if C<PACKAGE> has been marked as loaded yet.
+C<PACKAGE> can be a bareword or string.
+
+It returns falls if C<PACKAGE> has not been loaded yet and the location
+from where it is said to be loaded on success.
+
+=cut
+
+sub is_loaded (*) {
+ my $pm = shift;
+ my $file = __PACKAGE__->_pm_to_file( $pm ) or return;
+
+ return $INC{$file} if exists $INC{$file};
+
+ return;
+}
+
+
+sub _pm_to_file {
+ my $pkg = shift;
+ my $pm = shift or return;
+
+ my $file = join '/', split '::', $pm;
+ $file .= '.pm';
+
+ return $file;
+}
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-module-loaded@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/P5Z.pm b/Master/tlpkg/tlperl.straw/lib/Module/P5Z.pm
new file mode 100755
index 00000000000..32f6f2b59d6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/P5Z.pm
@@ -0,0 +1,34 @@
+package Module::P5Z;
+
+use 5.005;
+use strict;
+use File::pushd ();
+use Archive::Tar ();
+
+use vars qw{$VERSION};
+BEGIN {
+ $VERSION = '1.16';
+}
+
+
+
+
+
+#####################################################################
+# Constructor
+
+sub read {
+ my $class = shift;
+ my $self = bless { @_ }, $class;
+
+ # Apply defaults
+ $self->{tempd} ||= File::pushd::tempd();
+
+ $self;
+}
+
+sub tempd {
+ $_[0]->{tempd};
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Plan/Archive.pm b/Master/tlpkg/tlperl.straw/lib/Module/Plan/Archive.pm
new file mode 100755
index 00000000000..2e228a065e2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Plan/Archive.pm
@@ -0,0 +1,115 @@
+package Module::Plan::Archive;
+
+# Simple module for creating Module::Build::Plan archives, which are
+# single-file packaged sets of tarballs with a build in p5i script.
+
+use 5.005;
+use strict;
+use Carp 'croak';
+use Params::Util '_INSTANCE',
+ '_STRING';
+use Archive::Tar ();
+use Module::Plan::Base ();
+
+use vars qw{$VERSION};
+BEGIN {
+ $VERSION = '1.16';
+}
+
+
+
+
+
+#####################################################################
+# Constructor and Accessors
+
+sub new {
+ my $class = shift;
+ my $self = bless { @_ }, $class;
+
+ # Check params
+ unless ( _INSTANCE($self->plan, 'Module::Plan::Base') ) {
+ Carp("Did not provide a Module::Plan::Base object to Archive contructor");
+ }
+ unless ( $self->plan->can('fetch') ) {
+ Carp("The plan does not implement a 'fetch' method");
+ }
+
+ return $self;
+}
+
+sub from_p5i {
+ my $class = shift;
+
+ # Create an archive from a file name
+ my $file = shift;
+ unless ( _STRING($file) and -f $file ) {
+ Carp('Missing or invalid file name');
+ }
+
+ # Create the plan, and from that the archive
+ return $class->new(
+ plan => Module::Plan::Base->read( $file, @_ ),
+ );
+}
+
+sub plan {
+ $_[0]->{plan};
+}
+
+sub no_inject {
+ $_[0]->plan->no_inject;
+}
+
+
+
+
+
+#####################################################################
+# Archive Generation
+
+sub save {
+ my $self = shift;
+ my $file = shift;
+ my $archive = $self->archive;
+ my $rv = $archive->write( $file, 9 );
+ return 1;
+}
+
+sub archive {
+ my $self = shift;
+ my $plan = $self->plan;
+
+ # Create the tarball and add the plan
+ my $tar = Archive::Tar->new;
+ $tar->add_data( 'default.p5i', $self->default_p5i );
+
+ # Add the files
+ foreach my $name ( $plan->names ) {
+ unless ( $plan->dists_hash->{$name} ) {
+ $plan->_fetch_uri($name);
+ }
+
+ # Read the dist into memory and add to tarball
+ my $file = $plan->dists_hash->{$name};
+ my $buffer = '';
+ SCOPE: {
+ local $/ = undef;
+ open( DIST, $file ) or die "open: $!";
+ defined($buffer = <DIST>) or die "read: $!";
+ close( DIST ) or die "close: $!";
+ }
+ $tar->add_data( $name, $buffer );
+ }
+
+ return $tar;
+}
+
+# Generate the new default.p5i plan file for the archive
+sub default_p5i {
+ my $self = shift;
+ my $class = $self->can('ref') ? $self->ref : ref($self);
+ return join '', map { "$_\n" } ( $class, "", $self->plan->names );
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Plan/Base.pm b/Master/tlpkg/tlperl.straw/lib/Module/Plan/Base.pm
new file mode 100755
index 00000000000..4c920bdc794
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Plan/Base.pm
@@ -0,0 +1,399 @@
+package Module::Plan::Base;
+
+=pod
+
+=head1 NAME
+
+Module::Plan::Base - Base class for Module::Plan classes
+
+=head1 DESCRIPTION
+
+B<Module::Plan::Base> provides the underlying basic functionality. That is,
+taking a file, injecting it into CPAN, and the installing it via the L<CPAN>
+module.
+
+It also provides for a basic "phase" system, that allows steps to be taken
+in the appropriate order. This is very simple for now, but may be upgraded
+later into a dependency-based system.
+
+This class is undocumented for the moment.
+
+See L<pip> for the front-end console application for this module.
+
+=cut
+
+use 5.005;
+use strict;
+use Carp 'croak';
+use File::Spec ();
+use File::Temp ();
+use File::Basename ();
+use Params::Util qw{ _STRING _CLASS _INSTANCE };
+use URI ();
+use URI::file ();
+#use LWP::Simple (); # Loaded on-demand with require
+#use CPAN::Inject (); # Loaded on-demand with require
+#use PAR::Dist (); # Loaded on-demand with require
+BEGIN {
+ # Versions of CPAN older than 1.88 strip off '.' from @INC,
+ # breaking stuff. At 1.88 CPAN changed to converting them
+ # to absolute paths via rel2abs instead.
+ # This is an exact copy of the code that does this, which
+ # will allow Module::Plan::Base to work with versions of CPAN.pm
+ # older than 1.88 without being impacted by the bug.
+ # This is mainly good, because forcing CPAN.pm to be upgraded
+ # has problems of it's own, and so by using this hack we can
+ # install correctly with the version of CPAN.pm bundled with
+ # older versions of Perl.
+ for my $inc (@INC) {
+ $inc = File::Spec->rel2abs($inc) unless ref $inc;
+ }
+}
+use CPAN;
+
+use vars qw{$VERSION};
+BEGIN {
+ $VERSION = '1.16';
+}
+
+
+
+
+
+#####################################################################
+# Constructor and Accessors
+
+sub new {
+ my $class = shift;
+ my $self = bless { @_ }, $class;
+
+ # Create internal state variables
+ $self->{names} = [ ];
+ $self->{uris} = { };
+ $self->{dists} = { };
+ $self->{cpan_path} = { };
+
+ # Precalculate the various paths for the P5I file
+ $self->{p5i_uri} = $self->_p5i_uri( $self->p5i );
+ $self->{p5i_dir} = $self->_p5i_dir( $self->p5i_uri );
+ $self->{dir} = File::Temp::tempdir( CLEANUP => 1 );
+
+ # Check the no_inject option
+ $self->{no_inject} = !! $self->{no_inject};
+
+ # Create the CPAN injector
+ unless ( $self->no_inject ) {
+ require CPAN::Inject;
+ $self->{inject} ||= CPAN::Inject->from_cpan_config;
+ unless ( _INSTANCE($self->{inject}, 'CPAN::Inject') ) {
+ croak("Did not provide a valid 'param' CPAN::Inject object");
+ }
+ }
+
+ $self;
+}
+
+# Which params do we allow to read
+my %READ_ALLOW = ( no_inject => 1 );
+
+sub read {
+ my $class = shift;
+
+ # Check the file
+ my $p5i = shift or croak( 'You did not specify a file name' );
+ croak( "File '$p5i' does not exist" ) unless -e $p5i;
+ croak( "'$p5i' is a directory, not a file" ) unless -f _;
+ croak( "Insufficient permissions to read '$p5i'" ) unless -r _;
+
+ # Get a filtered set of params to pass through
+ my %params = @_;
+ %params = map { $_ => $params{$_} }
+ grep { $READ_ALLOW{$_} }
+ sort keys %params;
+
+ # Slurp in the file
+ my $contents;
+ SCOPE: {
+ local $/ = undef;
+ open CFG, $p5i or croak( "Failed to open file '$p5i': $!" );
+ $contents = <CFG>;
+ close CFG;
+ }
+
+ # Split and find the header line for the type
+ my @lines = split /(?:\015{1,2}\012|\015|\012)/, $contents;
+ my $header = shift @lines;
+ unless ( _CLASS($header) ) {
+ croak("Invalid header '$header', not a class name");
+ }
+
+ # Load the class
+ require join('/', split /::/, $header) . '.pm';
+ unless ( $header->VERSION and $header->isa($class) ) {
+ croak("Invalid header '$header', class is not a Module::Plan::Base subclass");
+ }
+
+ # MSWIN32: we want this because URI encodes backslashes
+ # and encoded backslashes make File::Spec (and later LWP::Simple)
+ # confuse afterwords.
+ $p5i =~ s{\\}{/}g;
+
+ # Class looks good, create our object and hand off
+ return $header->new(
+ p5i => $p5i,
+ lines => \@lines,
+ %params,
+ );
+}
+
+sub p5i {
+ $_[0]->{p5i};
+}
+
+sub p5i_uri {
+ $_[0]->{p5i_uri};
+}
+
+sub p5i_dir {
+ $_[0]->{p5i_dir};
+}
+
+sub dir {
+ $_[0]->{dir};
+}
+
+sub lines {
+ @{ $_[0]->{lines} };
+}
+
+sub names {
+ @{ $_[0]->{names} };
+}
+
+sub dists {
+ %{ $_[0]->{dists} };
+}
+
+sub dists_hash {
+ $_[0]->{dists};
+}
+
+sub uris {
+ my $self = shift;
+ my %copy = %{ $self->{uris} };
+ foreach my $key ( keys %copy ) {
+ $copy{$key} = $copy{$key}->clone;
+ }
+ %copy;
+}
+
+sub no_inject {
+ $_[0]->{no_inject};
+}
+
+sub inject {
+ $_[0]->{inject};
+}
+
+# Generate the plan file from the plan object
+sub as_string {
+ return join '',
+ map { "$_\n" }
+ $_[0]->can('ref')
+ ? $_[0]->ref
+ : ref $_[0],
+ "",
+ $_[0]->lines;
+}
+
+
+
+
+
+#####################################################################
+# Files and Installation
+
+sub add_file {
+ my $self = shift;
+ my $file = _STRING(shift) or croak("Did not provide a file name");
+
+ # Handle relative and absolute paths
+ $file = File::Spec->rel2abs( $file, $self->dir );
+ my (undef, undef, $name) = File::Spec->splitpath( $file );
+
+ # Check for duplicates
+ if ( scalar grep { $name eq $_ } @{$self->{names}} ) {
+ croak("Duplicate file $name in plan");
+ }
+
+ # Add the name and the file name
+ push @{ $self->{names} }, $name;
+ $self->{dists}->{$name} = $file;
+
+ return 1;
+}
+
+sub add_uri {
+ my $self = shift;
+ my $uri = _INSTANCE(shift, 'URI') or croak("Did not provide a URI");
+ unless ( $uri->can('path') ) {
+ croak("URI is not have a ->path method");
+ }
+
+ # Split into segments to get the file
+ my @segments = $uri->path_segments;
+ my $name = $segments[-1];
+
+ # Check for duplicates
+ if ( scalar grep { $name eq $_ } @{$self->{names}} ) {
+ croak("Duplicate file $name in plan");
+ }
+
+ # Add the name and the file name
+ push @{ $self->{names} }, $name;
+ $self->{uris}->{$name} = $uri;
+
+ return 1;
+}
+
+sub run {
+ die ref($_[0]) . " does not implement 'run'";
+}
+
+sub _fetch_uri {
+ my $self = shift;
+ my $name = shift;
+ my $uri = $self->{uris}->{$name};
+ unless ( $uri ) {
+ die("Unknown uri for $name");
+ }
+
+ # Determine the dists file name
+ my $file = File::Spec->catfile( $self->{dir}, $name );
+ if ( -f $file ) {
+ die("File $file already exists");
+ }
+ $self->{dists}->{$name} = $file;
+
+ # Download the URI to the destination
+ require LWP::Simple;
+ my $content = LWP::Simple::get( $uri );
+ unless ( defined $content ) {
+ croak("Failed to download $uri");
+ }
+
+ # Save the file
+ unless ( open( DOWNLOAD, '>', $file ) ) {
+ croak("Failed to open $file to write");
+ }
+ binmode( DOWNLOAD );
+ unless ( print DOWNLOAD $content ) {
+ croak("Failed to write to $file");
+ }
+ unless ( close( DOWNLOAD ) ) {
+ croak("Failed to close $file");
+ }
+
+ return 1;
+}
+
+sub _cpan_inject {
+ my $self = shift;
+ my $name = shift;
+ my $file = $self->{dists}->{$name};
+ unless ( $file ) {
+ die("Unknown file $name");
+ }
+
+ # Inject the file into the CPAN cache
+ $self->{cpan_path}->{$name} = $self->inject->add( file => $file );
+
+ 1;
+}
+
+sub _cpan_install {
+ my $self = shift;
+ my $name = shift;
+ my $distro = $self->{cpan_path}->{$name};
+ unless ( $distro ) {
+ die("Unknown file $name");
+ }
+
+ # Install via the CPAN::Shell
+ CPAN::Shell->install($distro);
+}
+
+sub _par_install {
+ my $self = shift;
+ my $name = shift;
+ my $uri = $self->{uris}->{$name};
+ unless ( $uri ) {
+ die("Unknown uri for $name");
+ }
+
+ # Install entirely using PAR::Dist
+ require PAR::Dist;
+ PAR::Dist::install_par( $uri->as_string );
+}
+
+# Takes arbitrary param, returns URI to the P5I file
+sub _p5i_uri {
+ my $uri = _INSTANCE($_[1], 'URI') ? $_[1]
+ : _STRING($_[1]) ? URI->new($_[1])
+ : undef
+ or croak("Not a valid P5I path");
+
+ # Convert generics to file URIs
+ unless ( $uri->scheme ) {
+ # It's a raw filename
+ $uri = URI::file->new($uri->as_string) or croak("Not a valid P5I path");
+ }
+
+ # Make any file paths absolute
+ if ( $uri->isa('URI::file') ) {
+ my $file = File::Spec->rel2abs( $uri->path );
+ $uri = URI::file->new($file);
+ }
+
+ $uri;
+}
+
+sub _p5i_dir {
+ my $uri = _INSTANCE($_[1], 'URI')
+ or croak("Did not pass a URI to p5i_dir");
+
+ # Use a naive method for the moment
+ my $string = $uri->as_string;
+ $string =~ s/\/[^\/]+$//;
+
+ # Return the modified version
+ URI->new( $string, $uri->scheme );
+}
+
+1;
+
+=pod
+
+=head1 SUPPORT
+
+See the main L<pip> module for support information.
+
+=head1 AUTHORS
+
+Adam Kennedy E<lt>adamk@cpan.orgE<gt>
+
+=head1 SEE ALSO
+
+L<pip>, L<Module::Plan>, L<Module::Inspector>
+
+=head1 COPYRIGHT
+
+Copyright 2006 - 2009 Adam Kennedy.
+
+This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+The full text of the license can be found in the
+LICENSE file included with this module.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Plan/Lite.pm b/Master/tlpkg/tlperl.straw/lib/Module/Plan/Lite.pm
new file mode 100755
index 00000000000..9c98627e2f6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Plan/Lite.pm
@@ -0,0 +1,137 @@
+package Module::Plan::Lite;
+
+=pod
+
+=head1 NAME
+
+Module::Plan::Lite - Lite installation scripts for third-party modules
+
+=head1 SYNOPSIS
+
+The following is the contents of your default.pip file.
+
+ Module::Plan::Lite
+
+ # Everything in the plan file is installed in order
+
+ # Supported file forms
+ Install-This-First-1.00.tar.gz
+ Install-This-Second.1.31.tar.gz
+ extensions/This-This-0.02.tar.gz
+ /absolute/Module-Location-4.12.tar.gz
+
+ # Supported URI types
+ ftp://foo.com/pip-0.13.tar.gz
+ http://foo.com/pip-0.13.tar.gz
+
+ # Support for PAR installation and conventions
+ http://foo.com/DBI-1.37-MSWin32-5.8.0.par
+ http://foo.com/DBI-1.37
+ cpan://SMUELLER/PAR-Packer-0.975
+
+=cut
+
+use strict;
+use URI ();
+use Module::Plan::Base ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '1.16';
+ @ISA = 'Module::Plan::Base';
+}
+
+
+
+
+
+#####################################################################
+# Constructor
+
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new(@_);
+
+ # Parsing here isn't the best, but this is Lite after all
+ foreach ( $self->lines ) {
+ # Strip whitespace and comments
+ next if /^\s*(?:\#|$)/;
+
+ # Create the URI
+ my $uri = URI->new_abs( $_, $self->p5i_uri );
+ unless ( $uri ) {
+ croak("Failed to get the URI for $_");
+ }
+
+ # Add the uri
+ $self->add_uri( $uri );
+ }
+
+ $self;
+}
+
+sub fetch {
+ my $self = shift;
+
+ # Download the needed modules
+ foreach my $name ( $self->names ) {
+ next if $self->{dists}->{$name};
+ $self->_fetch_uri($name);
+ }
+
+ return 1;
+}
+
+sub run {
+ my $self = shift;
+
+ # Download the needed modules
+ foreach my $name ( $self->names ) {
+ next if $name =~ /(\.par|[\d.]+)$/;
+ next if $self->{dists}->{$name};
+ $self->_fetch_uri($name);
+ }
+
+ # Inject them into CPAN and install
+ foreach my $name ( $self->names ) {
+ # Install via PAR::Dist
+ if ( $name =~ /(\.par|[\d.]+)$/ ) {
+ $self->_par_install($name);
+ next;
+ }
+
+ # Install via CPAN.pm
+ $self->_cpan_inject($name);
+ $self->_cpan_install($name);
+ }
+
+ return 1;
+}
+
+1;
+
+=pod
+
+=head1 SUPPORT
+
+See the main L<pip> module for support information.
+
+=head1 AUTHORS
+
+Adam Kennedy E<lt>adamk@cpan.orgE<gt>
+
+=head1 SEE ALSO
+
+L<pip>, L<Module::Plan>
+
+=head1 COPYRIGHT
+
+Copyright 2006 - 2009 Adam Kennedy.
+
+This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+The full text of the license can be found in the
+LICENSE file included with this module.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Pluggable.pm b/Master/tlpkg/tlperl.straw/lib/Module/Pluggable.pm
new file mode 100755
index 00000000000..bbdb49b6bca
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Pluggable.pm
@@ -0,0 +1,355 @@
+package Module::Pluggable;
+
+use strict;
+use vars qw($VERSION);
+use Module::Pluggable::Object;
+
+# ObQuote:
+# Bob Porter: Looks like you've been missing a lot of work lately.
+# Peter Gibbons: I wouldn't say I've been missing it, Bob!
+
+
+$VERSION = '3.9';
+
+sub import {
+ my $class = shift;
+ my %opts = @_;
+
+ my ($pkg, $file) = caller;
+ # the default name for the method is 'plugins'
+ my $sub = $opts{'sub_name'} || 'plugins';
+ # get our package
+ my ($package) = $opts{'package'} || $pkg;
+ $opts{filename} = $file;
+ $opts{package} = $package;
+
+
+ my $finder = Module::Pluggable::Object->new(%opts);
+ my $subroutine = sub { my $self = shift; return $finder->plugins(@_) };
+
+ my $searchsub = sub {
+ my $self = shift;
+ my ($action,@paths) = @_;
+
+ $finder->{'search_path'} = ["${package}::Plugin"] if ($action eq 'add' and not $finder->{'search_path'} );
+ push @{$finder->{'search_path'}}, @paths if ($action eq 'add');
+ $finder->{'search_path'} = \@paths if ($action eq 'new');
+ return $finder->{'search_path'};
+ };
+
+
+ my $onlysub = sub {
+ my ($self, $only) = @_;
+
+ if (defined $only) {
+ $finder->{'only'} = $only;
+ };
+
+ return $finder->{'only'};
+ };
+
+ my $exceptsub = sub {
+ my ($self, $except) = @_;
+
+ if (defined $except) {
+ $finder->{'except'} = $except;
+ };
+
+ return $finder->{'except'};
+ };
+
+
+ no strict 'refs';
+ no warnings qw(redefine prototype);
+
+ *{"$package\::$sub"} = $subroutine;
+ *{"$package\::search_path"} = $searchsub;
+ *{"$package\::only"} = $onlysub;
+ *{"$package\::except"} = $exceptsub;
+
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+Module::Pluggable - automatically give your module the ability to have plugins
+
+=head1 SYNOPSIS
+
+
+Simple use Module::Pluggable -
+
+ package MyClass;
+ use Module::Pluggable;
+
+
+and then later ...
+
+ use MyClass;
+ my $mc = MyClass->new();
+ # returns the names of all plugins installed under MyClass::Plugin::*
+ my @plugins = $mc->plugins();
+
+=head1 EXAMPLE
+
+Why would you want to do this? Say you have something that wants to pass an
+object to a number of different plugins in turn. For example you may
+want to extract meta-data from every email you get sent and do something
+with it. Plugins make sense here because then you can keep adding new
+meta data parsers and all the logic and docs for each one will be
+self contained and new handlers are easy to add without changing the
+core code. For that, you might do something like ...
+
+ package Email::Examiner;
+
+ use strict;
+ use Email::Simple;
+ use Module::Pluggable require => 1;
+
+ sub handle_email {
+ my $self = shift;
+ my $email = shift;
+
+ foreach my $plugin ($self->plugins) {
+ $plugin->examine($email);
+ }
+
+ return 1;
+ }
+
+
+
+.. and all the plugins will get a chance in turn to look at it.
+
+This can be trivally extended so that plugins could save the email
+somewhere and then no other plugin should try and do that.
+Simply have it so that the C<examine> method returns C<1> if
+it has saved the email somewhere. You might also wnat to be paranoid
+and check to see if the plugin has an C<examine> method.
+
+ foreach my $plugin ($self->plugins) {
+ next unless $plugin->can('examine');
+ last if $plugin->examine($email);
+ }
+
+
+And so on. The sky's the limit.
+
+
+=head1 DESCRIPTION
+
+Provides a simple but, hopefully, extensible way of having 'plugins' for
+your module. Obviously this isn't going to be the be all and end all of
+solutions but it works for me.
+
+Essentially all it does is export a method into your namespace that
+looks through a search path for .pm files and turn those into class names.
+
+Optionally it instantiates those classes for you.
+
+=head1 ADVANCED USAGE
+
+
+Alternatively, if you don't want to use 'plugins' as the method ...
+
+ package MyClass;
+ use Module::Pluggable sub_name => 'foo';
+
+
+and then later ...
+
+ my @plugins = $mc->foo();
+
+
+Or if you want to look in another namespace
+
+ package MyClass;
+ use Module::Pluggable search_path => ['Acme::MyClass::Plugin', 'MyClass::Extend'];
+
+or directory
+
+ use Module::Pluggable search_dirs => ['mylibs/Foo'];
+
+
+Or if you want to instantiate each plugin rather than just return the name
+
+ package MyClass;
+ use Module::Pluggable instantiate => 'new';
+
+and then
+
+ # whatever is passed to 'plugins' will be passed
+ # to 'new' for each plugin
+ my @plugins = $mc->plugins(@options);
+
+
+alternatively you can just require the module without instantiating it
+
+ package MyClass;
+ use Module::Pluggable require => 1;
+
+since requiring automatically searches inner packages, which may not be desirable, you can turn this off
+
+
+ package MyClass;
+ use Module::Pluggable require => 1, inner => 0;
+
+
+You can limit the plugins loaded using the except option, either as a string,
+array ref or regex
+
+ package MyClass;
+ use Module::Pluggable except => 'MyClass::Plugin::Foo';
+
+or
+
+ package MyClass;
+ use Module::Pluggable except => ['MyClass::Plugin::Foo', 'MyClass::Plugin::Bar'];
+
+or
+
+ package MyClass;
+ use Module::Pluggable except => qr/^MyClass::Plugin::(Foo|Bar)$/;
+
+
+and similarly for only which will only load plugins which match.
+
+Remember you can use the module more than once
+
+ package MyClass;
+ use Module::Pluggable search_path => 'MyClass::Filters' sub_name => 'filters';
+ use Module::Pluggable search_path => 'MyClass::Plugins' sub_name => 'plugins';
+
+and then later ...
+
+ my @filters = $self->filters;
+ my @plugins = $self->plugins;
+
+=head1 INNER PACKAGES
+
+If you have, for example, a file B<lib/Something/Plugin/Foo.pm> that
+contains package definitions for both C<Something::Plugin::Foo> and
+C<Something::Plugin::Bar> then as long as you either have either
+the B<require> or B<instantiate> option set then we'll also find
+C<Something::Plugin::Bar>. Nifty!
+
+=head1 OPTIONS
+
+You can pass a hash of options when importing this module.
+
+The options can be ...
+
+=head2 sub_name
+
+The name of the subroutine to create in your namespace.
+
+By default this is 'plugins'
+
+=head2 search_path
+
+An array ref of namespaces to look in.
+
+=head2 search_dirs
+
+An array ref of directorys to look in before @INC.
+
+=head2 instantiate
+
+Call this method on the class. In general this will probably be 'new'
+but it can be whatever you want. Whatever arguments are passed to 'plugins'
+will be passed to the method.
+
+The default is 'undef' i.e just return the class name.
+
+=head2 require
+
+Just require the class, don't instantiate (overrides 'instantiate');
+
+=head2 inner
+
+If set to 0 will B<not> search inner packages.
+If set to 1 will override C<require>.
+
+=head2 only
+
+Takes a string, array ref or regex describing the names of the only plugins to
+return. Whilst this may seem perverse ... well, it is. But it also
+makes sense. Trust me.
+
+=head2 except
+
+Similar to C<only> it takes a description of plugins to exclude
+from returning. This is slightly less perverse.
+
+=head2 package
+
+This is for use by extension modules which build on C<Module::Pluggable>:
+passing a C<package> option allows you to place the plugin method in a
+different package other than your own.
+
+=head2 file_regex
+
+By default C<Module::Pluggable> only looks for I<.pm> files.
+
+By supplying a new C<file_regex> then you can change this behaviour e.g
+
+ file_regex => qr/\.plugin$/
+
+=head2 include_editor_junk
+
+By default C<Module::Pluggable> ignores files that look like they were
+left behind by editors. Currently this means files ending in F<~> (~),
+the extensions F<.swp> or F<.swo>, or files beginning with F<.#>.
+
+Setting C<include_editor_junk> changes C<Module::Pluggable> so it does
+not ignore any files it finds.
+
+
+=head1 METHODs
+
+=head2 search_path
+
+The method C<search_path> is exported into you namespace as well.
+You can call that at any time to change or replace the
+search_path.
+
+ $self->search_path( add => "New::Path" ); # add
+ $self->search_path( new => "New::Path" ); # replace
+
+
+
+=head1 FUTURE PLANS
+
+This does everything I need and I can't really think of any other
+features I want to add. Famous last words of course
+
+Recently tried fixed to find inner packages and to make it
+'just work' with PAR but there are still some issues.
+
+
+However suggestions (and patches) are welcome.
+
+=head1 AUTHOR
+
+Simon Wistow <simon@thegestalt.org>
+
+=head1 COPYING
+
+Copyright, 2006 Simon Wistow
+
+Distributed under the same terms as Perl itself.
+
+=head1 BUGS
+
+None known.
+
+=head1 SEE ALSO
+
+L<File::Spec>, L<File::Find>, L<File::Basename>, L<Class::Factory::Util>, L<Module::Pluggable::Ordered>
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Pluggable/Object.pm b/Master/tlpkg/tlperl.straw/lib/Module/Pluggable/Object.pm
new file mode 100755
index 00000000000..e0ee993075d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Pluggable/Object.pm
@@ -0,0 +1,373 @@
+package Module::Pluggable::Object;
+
+use strict;
+use File::Find ();
+use File::Basename;
+use File::Spec::Functions qw(splitdir catdir curdir catfile abs2rel);
+use Carp qw(croak carp);
+use Devel::InnerPackage;
+use vars qw($VERSION);
+
+$VERSION = '3.9';
+
+
+sub new {
+ my $class = shift;
+ my %opts = @_;
+
+ return bless \%opts, $class;
+
+}
+
+### Eugggh, this code smells
+### This is what happens when you keep adding patches
+### *sigh*
+
+
+sub plugins {
+ my $self = shift;
+
+ # override 'require'
+ $self->{'require'} = 1 if $self->{'inner'};
+
+ my $filename = $self->{'filename'};
+ my $pkg = $self->{'package'};
+
+ # Get the exception params instantiated
+ $self->_setup_exceptions;
+
+ # automatically turn a scalar search path or namespace into a arrayref
+ for (qw(search_path search_dirs)) {
+ $self->{$_} = [ $self->{$_} ] if exists $self->{$_} && !ref($self->{$_});
+ }
+
+ # default search path is '<Module>::<Name>::Plugin'
+ $self->{'search_path'} = ["${pkg}::Plugin"] unless $self->{'search_path'};
+
+
+ #my %opts = %$self;
+
+
+ # check to see if we're running under test
+ my @SEARCHDIR = exists $INC{"blib.pm"} && defined $filename && $filename =~ m!(^|/)blib/! ? grep {/blib/} @INC : @INC;
+
+ # add any search_dir params
+ unshift @SEARCHDIR, @{$self->{'search_dirs'}} if defined $self->{'search_dirs'};
+
+
+ my @plugins = $self->search_directories(@SEARCHDIR);
+ push(@plugins, $self->handle_innerpackages($_)) for @{$self->{'search_path'}};
+
+ # push @plugins, map { print STDERR "$_\n"; $_->require } list_packages($_) for (@{$self->{'search_path'}});
+
+ # return blank unless we've found anything
+ return () unless @plugins;
+
+
+
+ # remove duplicates
+ # probably not necessary but hey ho
+ my %plugins;
+ for(@plugins) {
+ next unless $self->_is_legit($_);
+ $plugins{$_} = 1;
+ }
+
+ # are we instantiating or requring?
+ if (defined $self->{'instantiate'}) {
+ my $method = $self->{'instantiate'};
+ return map { ($_->can($method)) ? $_->$method(@_) : () } keys %plugins;
+ } else {
+ # no? just return the names
+ return keys %plugins;
+ }
+
+
+}
+
+sub _setup_exceptions {
+ my $self = shift;
+
+ my %only;
+ my %except;
+ my $only;
+ my $except;
+
+ if (defined $self->{'only'}) {
+ if (ref($self->{'only'}) eq 'ARRAY') {
+ %only = map { $_ => 1 } @{$self->{'only'}};
+ } elsif (ref($self->{'only'}) eq 'Regexp') {
+ $only = $self->{'only'}
+ } elsif (ref($self->{'only'}) eq '') {
+ $only{$self->{'only'}} = 1;
+ }
+ }
+
+
+ if (defined $self->{'except'}) {
+ if (ref($self->{'except'}) eq 'ARRAY') {
+ %except = map { $_ => 1 } @{$self->{'except'}};
+ } elsif (ref($self->{'except'}) eq 'Regexp') {
+ $except = $self->{'except'}
+ } elsif (ref($self->{'except'}) eq '') {
+ $except{$self->{'except'}} = 1;
+ }
+ }
+ $self->{_exceptions}->{only_hash} = \%only;
+ $self->{_exceptions}->{only} = $only;
+ $self->{_exceptions}->{except_hash} = \%except;
+ $self->{_exceptions}->{except} = $except;
+
+}
+
+sub _is_legit {
+ my $self = shift;
+ my $plugin = shift;
+ my %only = %{$self->{_exceptions}->{only_hash}||{}};
+ my %except = %{$self->{_exceptions}->{except_hash}||{}};
+ my $only = $self->{_exceptions}->{only};
+ my $except = $self->{_exceptions}->{except};
+
+ return 0 if (keys %only && !$only{$plugin} );
+ return 0 unless (!defined $only || $plugin =~ m!$only! );
+
+ return 0 if (keys %except && $except{$plugin} );
+ return 0 if (defined $except && $plugin =~ m!$except! );
+
+ return 1;
+}
+
+sub search_directories {
+ my $self = shift;
+ my @SEARCHDIR = @_;
+
+ my @plugins;
+ # go through our @INC
+ foreach my $dir (@SEARCHDIR) {
+ push @plugins, $self->search_paths($dir);
+ }
+ return @plugins;
+}
+
+
+sub search_paths {
+ my $self = shift;
+ my $dir = shift;
+ my @plugins;
+
+ my $file_regex = $self->{'file_regex'} || qr/\.pm$/;
+
+
+ # and each directory in our search path
+ foreach my $searchpath (@{$self->{'search_path'}}) {
+ # create the search directory in a cross platform goodness way
+ my $sp = catdir($dir, (split /::/, $searchpath));
+
+ # if it doesn't exist or it's not a dir then skip it
+ next unless ( -e $sp && -d _ ); # Use the cached stat the second time
+
+ my @files = $self->find_files($sp);
+
+ # foreach one we've found
+ foreach my $file (@files) {
+ # untaint the file; accept .pm only
+ next unless ($file) = ($file =~ /(.*$file_regex)$/);
+ # parse the file to get the name
+ my ($name, $directory, $suffix) = fileparse($file, $file_regex);
+
+ next if (!$self->{include_editor_junk} && $self->_is_editor_junk($name));
+
+ $directory = abs2rel($directory, $sp);
+
+ # If we have a mixed-case package name, assume case has been preserved
+ # correctly. Otherwise, root through the file to locate the case-preserved
+ # version of the package name.
+ my @pkg_dirs = ();
+ if ( $name eq lc($name) || $name eq uc($name) ) {
+ my $pkg_file = catfile($sp, $directory, "$name$suffix");
+ open PKGFILE, "<$pkg_file" or die "search_paths: Can't open $pkg_file: $!";
+ my $in_pod = 0;
+ while ( my $line = <PKGFILE> ) {
+ $in_pod = 1 if $line =~ m/^=\w/;
+ $in_pod = 0 if $line =~ /^=cut/;
+ next if ($in_pod || $line =~ /^=cut/); # skip pod text
+ next if $line =~ /^\s*#/; # and comments
+ if ( $line =~ m/^\s*package\s+(.*::)?($name)\s*;/i ) {
+ @pkg_dirs = split /::/, $1;
+ $name = $2;
+ last;
+ }
+ }
+ close PKGFILE;
+ }
+
+ # then create the class name in a cross platform way
+ $directory =~ s/^[a-z]://i if($^O =~ /MSWin32|dos/); # remove volume
+ my @dirs = ();
+ if ($directory) {
+ ($directory) = ($directory =~ /(.*)/);
+ @dirs = grep(length($_), splitdir($directory))
+ unless $directory eq curdir();
+ for my $d (reverse @dirs) {
+ my $pkg_dir = pop @pkg_dirs;
+ last unless defined $pkg_dir;
+ $d =~ s/\Q$pkg_dir\E/$pkg_dir/i; # Correct case
+ }
+ } else {
+ $directory = "";
+ }
+ my $plugin = join '::', $searchpath, @dirs, $name;
+
+ next unless $plugin =~ m!(?:[a-z\d]+)[a-z\d]!i;
+
+ my $err = $self->handle_finding_plugin($plugin);
+ carp "Couldn't require $plugin : $err" if $err;
+
+ push @plugins, $plugin;
+ }
+
+ # now add stuff that may have been in package
+ # NOTE we should probably use all the stuff we've been given already
+ # but then we can't unload it :(
+ push @plugins, $self->handle_innerpackages($searchpath);
+ } # foreach $searchpath
+
+ return @plugins;
+}
+
+sub _is_editor_junk {
+ my $self = shift;
+ my $name = shift;
+
+ # Emacs (and other Unix-y editors) leave temp files ending in a
+ # tilde as a backup.
+ return 1 if $name =~ /~$/;
+ # Emacs makes these files while a buffer is edited but not yet
+ # saved.
+ return 1 if $name =~ /^\.#/;
+ # Vim can leave these files behind if it crashes.
+ return 1 if $name =~ /\.sw[po]$/;
+
+ return 0;
+}
+
+sub handle_finding_plugin {
+ my $self = shift;
+ my $plugin = shift;
+
+ return unless (defined $self->{'instantiate'} || $self->{'require'});
+ return unless $self->_is_legit($plugin);
+ $self->_require($plugin);
+}
+
+sub find_files {
+ my $self = shift;
+ my $search_path = shift;
+ my $file_regex = $self->{'file_regex'} || qr/\.pm$/;
+
+
+ # find all the .pm files in it
+ # this isn't perfect and won't find multiple plugins per file
+ #my $cwd = Cwd::getcwd;
+ my @files = ();
+ { # for the benefit of perl 5.6.1's Find, localize topic
+ local $_;
+ File::Find::find( { no_chdir => 1,
+ wanted => sub {
+ # Inlined from File::Find::Rule C< name => '*.pm' >
+ return unless $File::Find::name =~ /$file_regex/;
+ (my $path = $File::Find::name) =~ s#^\\./##;
+ push @files, $path;
+ }
+ }, $search_path );
+ }
+ #chdir $cwd;
+ return @files;
+
+}
+
+sub handle_innerpackages {
+ my $self = shift;
+ return () if (exists $self->{inner} && !$self->{inner});
+
+ my $path = shift;
+ my @plugins;
+
+ foreach my $plugin (Devel::InnerPackage::list_packages($path)) {
+ my $err = $self->handle_finding_plugin($plugin);
+ #next if $err;
+ #next unless $INC{$plugin};
+ push @plugins, $plugin;
+ }
+ return @plugins;
+
+}
+
+
+sub _require {
+ my $self = shift;
+ my $pack = shift;
+ local $@;
+ eval "CORE::require $pack";
+ return $@;
+}
+
+
+1;
+
+=pod
+
+=head1 NAME
+
+Module::Pluggable::Object - automatically give your module the ability to have plugins
+
+=head1 SYNOPSIS
+
+
+Simple use Module::Pluggable -
+
+ package MyClass;
+ use Module::Pluggable::Object;
+
+ my $finder = Module::Pluggable::Object->new(%opts);
+ print "My plugins are: ".join(", ", $finder->plugins)."\n";
+
+=head1 DESCRIPTION
+
+Provides a simple but, hopefully, extensible way of having 'plugins' for
+your module. Obviously this isn't going to be the be all and end all of
+solutions but it works for me.
+
+Essentially all it does is export a method into your namespace that
+looks through a search path for .pm files and turn those into class names.
+
+Optionally it instantiates those classes for you.
+
+This object is wrapped by C<Module::Pluggable>. If you want to do something
+odd or add non-general special features you're probably best to wrap this
+and produce your own subclass.
+
+=head1 OPTIONS
+
+See the C<Module::Pluggable> docs.
+
+=head1 AUTHOR
+
+Simon Wistow <simon@thegestalt.org>
+
+=head1 COPYING
+
+Copyright, 2006 Simon Wistow
+
+Distributed under the same terms as Perl itself.
+
+=head1 BUGS
+
+None known.
+
+=head1 SEE ALSO
+
+L<Module::Pluggable>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Module/Signature.pm b/Master/tlpkg/tlperl.straw/lib/Module/Signature.pm
new file mode 100755
index 00000000000..2d526ec3ed0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Module/Signature.pm
@@ -0,0 +1,874 @@
+package Module::Signature;
+$Module::Signature::VERSION = '0.61';
+
+use 5.005;
+use strict;
+use vars qw($VERSION $SIGNATURE @ISA @EXPORT_OK);
+use vars qw($Preamble $Cipher $Debug $Verbose $Timeout);
+use vars qw($KeyServer $KeyServerPort $AutoKeyRetrieve $CanKeyRetrieve);
+
+use constant CANNOT_VERIFY => '0E0';
+use constant SIGNATURE_OK => 0;
+use constant SIGNATURE_MISSING => -1;
+use constant SIGNATURE_MALFORMED => -2;
+use constant SIGNATURE_BAD => -3;
+use constant SIGNATURE_MISMATCH => -4;
+use constant MANIFEST_MISMATCH => -5;
+use constant CIPHER_UNKNOWN => -6;
+
+use ExtUtils::Manifest ();
+use Exporter;
+
+@EXPORT_OK = (
+ qw(sign verify),
+ qw($SIGNATURE $KeyServer $Cipher $Preamble),
+ (grep { /^[A-Z_]+_[A-Z_]+$/ } keys %Module::Signature::),
+);
+@ISA = 'Exporter';
+
+$SIGNATURE = 'SIGNATURE';
+$Timeout = $ENV{MODULE_SIGNATURE_TIMEOUT} || 3;
+$Verbose = $ENV{MODULE_SIGNATURE_VERBOSE} || 0;
+$KeyServer = $ENV{MODULE_SIGNATURE_KEYSERVER} || 'pgp.mit.edu';
+$KeyServerPort = $ENV{MODULE_SIGNATURE_KEYSERVERPORT} || '11371';
+$Cipher = $ENV{MODULE_SIGNATURE_CIPHER} || 'SHA1';
+$Preamble = << ".";
+This file contains message digests of all files listed in MANIFEST,
+signed via the Module::Signature module, version $VERSION.
+
+To verify the content in this distribution, first make sure you have
+Module::Signature installed, then type:
+
+ % cpansign -v
+
+It will check each file's integrity, as well as the signature's
+validity. If "==> Signature verified OK! <==" is not displayed,
+the distribution may already have been compromised, and you should
+not run its Makefile.PL or Build.PL.
+
+.
+
+$AutoKeyRetrieve = 1;
+$CanKeyRetrieve = undef;
+
+sub verify {
+ my %args = ( skip => 1, @_ );
+ my $rv;
+
+ (-r $SIGNATURE) or do {
+ warn "==> MISSING Signature file! <==\n";
+ return SIGNATURE_MISSING;
+ };
+
+ (my $sigtext = _read_sigfile($SIGNATURE)) or do {
+ warn "==> MALFORMED Signature file! <==\n";
+ return SIGNATURE_MALFORMED;
+ };
+
+ (my ($cipher) = ($sigtext =~ /^(\w+) /)) or do {
+ warn "==> MALFORMED Signature file! <==\n";
+ return SIGNATURE_MALFORMED;
+ };
+
+ (defined(my $plaintext = _mkdigest($cipher))) or do {
+ warn "==> UNKNOWN Cipher format! <==\n";
+ return CIPHER_UNKNOWN;
+ };
+
+ $rv = _verify($SIGNATURE, $sigtext, $plaintext);
+
+ if ($rv == SIGNATURE_OK) {
+ my ($mani, $file) = _fullcheck($args{skip});
+
+ if (@{$mani} or @{$file}) {
+ warn "==> MISMATCHED content between MANIFEST and distribution files! <==\n";
+ return MANIFEST_MISMATCH;
+ }
+ else {
+ warn "==> Signature verified OK! <==\n" if $Verbose;
+ }
+ }
+ elsif ($rv == SIGNATURE_BAD) {
+ warn "==> BAD/TAMPERED signature detected! <==\n";
+ }
+ elsif ($rv == SIGNATURE_MISMATCH) {
+ warn "==> MISMATCHED content between SIGNATURE and distribution files! <==\n";
+ }
+
+ return $rv;
+}
+
+sub _verify {
+ my $signature = shift || $SIGNATURE;
+ my $sigtext = shift || '';
+ my $plaintext = shift || '';
+
+ local $SIGNATURE = $signature if $signature ne $SIGNATURE;
+
+ if ($AutoKeyRetrieve and !$CanKeyRetrieve) {
+ if (!defined $CanKeyRetrieve) {
+ require IO::Socket::INET;
+ my $sock = IO::Socket::INET->new(
+ Timeout => $Timeout,
+ PeerAddr => "$KeyServer:$KeyServerPort",
+ );
+ $CanKeyRetrieve = ($sock ? 1 : 0);
+ $sock->shutdown(2) if $sock;
+ }
+ $AutoKeyRetrieve = $CanKeyRetrieve;
+ }
+
+ if (my $version = _has_gpg()) {
+ return _verify_gpg($sigtext, $plaintext, $version);
+ }
+ elsif (eval {require Crypt::OpenPGP; 1}) {
+ return _verify_crypt_openpgp($sigtext, $plaintext);
+ }
+ else {
+ warn "Cannot use GnuPG or Crypt::OpenPGP, please install either one first!\n";
+ return _compare($sigtext, $plaintext, CANNOT_VERIFY);
+ }
+}
+
+sub _has_gpg {
+ `gpg --version` =~ /GnuPG.*?(\S+)$/m or return;
+ return $1;
+}
+
+sub _fullcheck {
+ my $skip = shift;
+ my @extra;
+
+ local $^W;
+ local $ExtUtils::Manifest::Quiet = 1;
+
+ my($mani, $file);
+ if( _legacy_extutils() ) {
+ my $_maniskip = &ExtUtils::Manifest::_maniskip;
+
+ local *ExtUtils::Manifest::_maniskip = sub { sub {
+ return unless $skip;
+ my $ok = $_maniskip->(@_);
+ if ($ok ||= (!-e 'MANIFEST.SKIP' and _default_skip(@_))) {
+ print "Skipping $_\n" for @_;
+ push @extra, @_;
+ }
+ return $ok;
+ } };
+
+ ($mani, $file) = ExtUtils::Manifest::fullcheck();
+ }
+ else {
+ ($mani, $file) = ExtUtils::Manifest::fullcheck();
+ }
+
+ foreach my $makefile ('Makefile', 'Build') {
+ warn "==> SKIPPED CHECKING '$_'!" .
+ (-e "$_.PL" && " (run $_.PL to ensure its integrity)") .
+ " <===\n" for grep $_ eq $makefile, @extra;
+ }
+
+ @{$mani} = grep {$_ ne 'SIGNATURE'} @{$mani};
+
+ warn "Not in MANIFEST: $_\n" for @{$file};
+ warn "No such file: $_\n" for @{$mani};
+
+ return ($mani, $file);
+}
+
+sub _legacy_extutils {
+ # ExtUtils::Manifest older than 1.41 does not handle default skips well.
+ return (ExtUtils::Manifest->VERSION < 1.41);
+}
+
+sub _default_skip {
+ local $_ = shift;
+ return 1 if /\bRCS\b/ or /\bCVS\b/ or /\B\.svn\b/ or /,v$/
+ or /^MANIFEST\.bak/ or /^Makefile$/ or /^blib\//
+ or /^MakeMaker-\d/ or /^pm_to_blib/ or /^blibdirs/
+ or /^_build\// or /^Build$/ or /^pmfiles\.dat/
+ or /~$/ or /\.old$/ or /\#$/ or /^\.#/;
+}
+
+sub _verify_gpg {
+ my ($sigtext, $plaintext, $version) = @_;
+
+ local $SIGNATURE = Win32::GetShortPathName($SIGNATURE)
+ if defined &Win32::GetShortPathName and $SIGNATURE =~ /[^-\w.:~\\\/]/;
+
+ my $keyserver = _keyserver($version);
+
+ my @quiet = $Verbose ? () : qw(-q --logger-fd=1);
+ my @cmd = (
+ qw(gpg --verify --batch --no-tty), @quiet, ($KeyServer ? (
+ "--keyserver=$keyserver",
+ ($AutoKeyRetrieve and $version ge '1.0.7')
+ ? '--keyserver-options=auto-key-retrieve'
+ : ()
+ ) : ()), $SIGNATURE
+ );
+
+ my $output = '';
+ if( $Verbose ) {
+ warn "Executing @cmd\n";
+ system @cmd;
+ }
+ else {
+ my $cmd = join ' ', @cmd;
+ $output = `$cmd`;
+ }
+
+ if( $? ) {
+ print STDERR $output;
+ }
+ elsif ($output =~ /((?: +[\dA-F]{4}){10,})/) {
+ warn "WARNING: This key is not certified with a trusted signature!\n";
+ warn "Primary key fingerprint:$1\n";
+ }
+
+ return SIGNATURE_BAD if ($? and $AutoKeyRetrieve);
+ return _compare($sigtext, $plaintext, (!$?) ? SIGNATURE_OK : CANNOT_VERIFY);
+}
+
+sub _keyserver {
+ my $version = shift;
+ my $scheme = 'x-hkp';
+ $scheme = 'hkp' if $version ge '1.2.0';
+
+ return "$scheme://$KeyServer:$KeyServerPort";
+}
+
+sub _verify_crypt_openpgp {
+ my ($sigtext, $plaintext) = @_;
+
+ require Crypt::OpenPGP;
+ my $pgp = Crypt::OpenPGP->new(
+ ($KeyServer) ? ( KeyServer => $KeyServer, AutoKeyRetrieve => $AutoKeyRetrieve ) : (),
+ );
+ my $rv = $pgp->handle( Filename => $SIGNATURE )
+ or die $pgp->errstr;
+
+ return SIGNATURE_BAD if (!$rv->{Validity} and $AutoKeyRetrieve);
+
+ if ($rv->{Validity}) {
+ warn 'Signature made ', scalar localtime($rv->{Signature}->timestamp),
+ ' using key ID ', substr(uc(unpack('H*', $rv->{Signature}->key_id)), -8), "\n",
+ "Good signature from \"$rv->{Validity}\"\n" if $Verbose;
+ }
+ else {
+ warn "Cannot verify signature; public key not found\n";
+ }
+
+ return _compare($sigtext, $plaintext, $rv->{Validity} ? SIGNATURE_OK : CANNOT_VERIFY);
+}
+
+sub _read_sigfile {
+ my $sigfile = shift;
+ my $signature = '';
+ my $well_formed;
+
+ local *D;
+ open D, $sigfile or die "Could not open $sigfile: $!";
+
+ if ($] >= 5.006 and <D> =~ /\r/) {
+ close D;
+ open D, $sigfile or die "Could not open $sigfile: $!";
+ binmode D, ':crlf';
+ } else {
+ close D;
+ open D, $sigfile or die "Could not open $sigfile: $!";
+ }
+
+ while (<D>) {
+ next if (1 .. /^-----BEGIN PGP SIGNED MESSAGE-----/);
+ last if /^-----BEGIN PGP SIGNATURE/;
+
+ $signature .= $_;
+ }
+
+ return ((split(/\n+/, $signature, 2))[1]);
+}
+
+sub _compare {
+ my ($str1, $str2, $ok) = @_;
+
+ # normalize all linebreaks
+ $str1 =~ s/[^\S ]+/\n/g; $str2 =~ s/[^\S ]+/\n/g;
+
+ return $ok if $str1 eq $str2;
+
+ if (eval { require Text::Diff; 1 }) {
+ warn "--- $SIGNATURE ".localtime((stat($SIGNATURE))[9])."\n";
+ warn '+++ (current) '.localtime()."\n";
+ warn Text::Diff::diff( \$str1, \$str2, { STYLE => 'Unified' } );
+ }
+ else {
+ local (*D, *S);
+ open S, $SIGNATURE or die "Could not open $SIGNATURE: $!";
+ open D, "| diff -u $SIGNATURE -" or (warn "Could not call diff: $!", return SIGNATURE_MISMATCH);
+ while (<S>) {
+ print D $_ if (1 .. /^-----BEGIN PGP SIGNED MESSAGE-----/);
+ print D if (/^Hash: / .. /^$/);
+ next if (1 .. /^-----BEGIN PGP SIGNATURE/);
+ print D $str2, "-----BEGIN PGP SIGNATURE-----\n", $_ and last;
+ }
+ print D <S>;
+ close D;
+ }
+
+ return SIGNATURE_MISMATCH;
+}
+
+sub sign {
+ my %args = ( skip => 1, @_ );
+ my $overwrite = $args{overwrite};
+ my $plaintext = _mkdigest();
+
+ my ($mani, $file) = _fullcheck($args{skip});
+
+ if (@{$mani} or @{$file}) {
+ warn "==> MISMATCHED content between MANIFEST and the distribution! <==\n";
+ warn "==> Please correct your MANIFEST file and/or delete extra files. <==\n";
+ }
+
+ if (!$overwrite and -e $SIGNATURE and -t STDIN) {
+ local $/ = "\n";
+ print "$SIGNATURE already exists; overwrite [y/N]? ";
+ return unless <STDIN> =~ /[Yy]/;
+ }
+
+ if (my $version = _has_gpg()) {
+ _sign_gpg($SIGNATURE, $plaintext, $version);
+ }
+ elsif (eval {require Crypt::OpenPGP; 1}) {
+ _sign_crypt_openpgp($SIGNATURE, $plaintext);
+ }
+ else {
+ die 'Cannot use GnuPG or Crypt::OpenPGP, please install either one first!';
+ }
+
+ warn "==> SIGNATURE file created successfully. <==\n";
+ return SIGNATURE_OK;
+}
+
+sub _sign_gpg {
+ my ($sigfile, $plaintext, $version) = @_;
+
+ die "Could not write to $sigfile"
+ if -e $sigfile and (-d $sigfile or not -w $sigfile);
+
+ local *D;
+ open D, "| gpg --clearsign >> $sigfile.tmp" or die "Could not call gpg: $!";
+ print D $plaintext;
+ close D;
+
+ (-e "$sigfile.tmp" and -s "$sigfile.tmp") or do {
+ unlink "$sigfile.tmp";
+ die "Cannot find $sigfile.tmp, signing aborted.\n";
+ };
+
+ open D, "$sigfile.tmp" or die "Cannot open $sigfile.tmp: $!";
+
+ open S, ">$sigfile" or do {
+ unlink "$sigfile.tmp";
+ die "Could not write to $sigfile: $!";
+ };
+
+ print S $Preamble;
+ print S <D>;
+
+ close S;
+ close D;
+
+ unlink("$sigfile.tmp");
+
+ my $key_id;
+ my $key_name;
+ # This doesn't work because the output from verify goes to STDERR.
+ # If I try to redirect it using "--logger-fd 1" it just hangs.
+ # WTF?
+ my @verify = `gpg --batch --verify $SIGNATURE`;
+ while (@verify) {
+ if (/key ID ([0-9A-F]+)$/) {
+ $key_id = $1;
+ } elsif (/signature from "(.+)"$/) {
+ $key_name = $1;
+ }
+ }
+
+ my $found_name;
+ my $found_key;
+ if (defined $key_id && defined $key_name) {
+ my $keyserver = _keyserver($version);
+ while (`gpg --batch --keyserver=$keyserver --search-keys '$key_name'`) {
+ if (/^\(\d+\)/) {
+ $found_name = 0;
+ } elsif ($found_name) {
+ if (/key \Q$key_id\E/) {
+ $found_key = 1;
+ last;
+ }
+ }
+
+ if (/\Q$key_name\E/) {
+ $found_name = 1;
+ next;
+ }
+ }
+
+ unless ($found_key) {
+ _warn_non_public_signature($key_name);
+ }
+ }
+
+ return 1;
+}
+
+sub _sign_crypt_openpgp {
+ my ($sigfile, $plaintext) = @_;
+
+ require Crypt::OpenPGP;
+ my $pgp = Crypt::OpenPGP->new;
+ my $ring = Crypt::OpenPGP::KeyRing->new(
+ Filename => $pgp->{cfg}->get('SecRing')
+ ) or die $pgp->error(Crypt::OpenPGP::KeyRing->errstr);
+ my $kb = $ring->find_keyblock_by_index(-1)
+ or die $pgp->error('Can\'t find last keyblock: ' . $ring->errstr);
+
+ my $cert = $kb->signing_key;
+ my $uid = $cert->uid($kb->primary_uid);
+ warn "Debug: acquiring signature from $uid\n" if $Debug;
+
+ my $signature = $pgp->sign(
+ Data => $plaintext,
+ Detach => 0,
+ Clearsign => 1,
+ Armour => 1,
+ Key => $cert,
+ PassphraseCallback => \&Crypt::OpenPGP::_default_passphrase_cb,
+ ) or die $pgp->errstr;
+
+
+ local *D;
+ open D, "> $sigfile" or die "Could not write to $sigfile: $!";
+ print D $Preamble;
+ print D $signature;
+ close D;
+
+ require Crypt::OpenPGP::KeyServer;
+ my $server = Crypt::OpenPGP::KeyServer->new(Server => $KeyServer);
+
+ unless ($server->find_keyblock_by_keyid($cert->key_id)) {
+ _warn_non_public_signature($uid);
+ }
+
+ return 1;
+}
+
+sub _warn_non_public_signature {
+ my $uid = shift;
+
+ warn <<"EOF"
+You have signed this distribution with a key ($uid) that cannot be
+found on the public key server at $KeyServer.
+
+This will probably cause signature verification to fail if your module
+is distributed on CPAN.
+EOF
+}
+
+sub _mkdigest {
+ my $digest = _mkdigest_files(undef, @_) or return;
+ my $plaintext = '';
+
+ foreach my $file (sort keys %$digest) {
+ next if $file eq $SIGNATURE;
+ $plaintext .= "@{$digest->{$file}} $file\n";
+ }
+
+ return $plaintext;
+}
+
+sub _mkdigest_files {
+ my $p = shift;
+ my $algorithm = shift || $Cipher;
+ my $dosnames = (defined(&Dos::UseLFN) && Dos::UseLFN()==0);
+ my $read = ExtUtils::Manifest::maniread() || {};
+ my $found = ExtUtils::Manifest::manifind($p);
+ my(%digest) = ();
+ my $obj = eval { Digest->new($algorithm) } || eval {
+ my ($base, $variant) = ($algorithm =~ /^(\w+?)(\d+)$/g) or die;
+ require "Digest/$base.pm"; "Digest::$base"->new($variant)
+ } || eval {
+ require "Digest/$algorithm.pm"; "Digest::$algorithm"->new
+ } || eval {
+ my ($base, $variant) = ($algorithm =~ /^(\w+?)(\d+)$/g) or die;
+ require "Digest/$base/PurePerl.pm"; "Digest::$base\::PurePerl"->new($variant)
+ } || eval {
+ require "Digest/$algorithm/PurePerl.pm"; "Digest::$algorithm\::PurePerl"->new
+ } or do { eval {
+ my ($base, $variant) = ($algorithm =~ /^(\w+?)(\d+)$/g) or die;
+ warn "Unknown cipher: $algorithm, please install Digest::$base, Digest::$base$variant, or Digest::$base\::PurePerl\n";
+ } and return } or do {
+ warn "Unknown cipher: $algorithm, please install Digest::$algorithm\n"; return;
+ };
+
+ foreach my $file (sort keys %$read){
+ warn "Debug: collecting digest from $file\n" if $Debug;
+ if ($dosnames){
+ $file = lc $file;
+ $file =~ s!(\.(\w|-)+)!substr ($1,0,4)!ge;
+ $file =~ s!((\w|-)+)!substr ($1,0,8)!ge;
+ }
+ unless ( exists $found->{$file} ) {
+ warn "No such file: $file\n" if $Verbose;
+ }
+ else {
+ local *F;
+ open F, $file or die "Cannot open $file for reading: $!";
+ if (-B $file) {
+ binmode(F);
+ $obj->addfile(*F);
+ }
+ elsif ($] >= 5.006) {
+ binmode(F, ':crlf');
+ $obj->addfile(*F);
+ }
+ elsif ($^O eq 'MSWin32') {
+ $obj->addfile(*F);
+ }
+ else {
+ # Normalize by hand...
+ local $/;
+ binmode(F);
+ my $input = <F>;
+ $input =~ s/\015?\012/\n/g;
+ $obj->add($input);
+ }
+ $digest{$file} = [$algorithm, $obj->hexdigest];
+ $obj->reset;
+ }
+ }
+
+ return \%digest;
+}
+
+1;
+
+__END__
+
+=encoding utf8
+
+=head1 NAME
+
+Module::Signature - Module signature file manipulation
+
+=head1 VERSION
+
+This document describes version 0.61 of B<Module::Signature>,
+released November 18, 2009.
+
+=head1 SYNOPSIS
+
+As a shell command:
+
+ % cpansign # verify an existing SIGNATURE, or
+ # make a new one if none exists
+
+ % cpansign sign # make signature; overwrites existing one
+ % cpansign -s # same thing
+
+ % cpansign verify # verify a signature
+ % cpansign -v # same thing
+ % cpansign -v --skip # ignore files in MANIFEST.SKIP
+
+ % cpansign help # display this documentation
+ % cpansign -h # same thing
+
+In programs:
+
+ use Module::Signature qw(sign verify SIGNATURE_OK);
+ sign();
+ sign(overwrite => 1); # overwrites without asking
+
+ # see the CONSTANTS section below
+ (verify() == SIGNATURE_OK) or die "failed!";
+
+=head1 DESCRIPTION
+
+B<Module::Signature> adds cryptographic authentications to CPAN
+distributions, via the special F<SIGNATURE> file.
+
+If you are a module user, all you have to do is to remember to run
+C<cpansign -v> (or just C<cpansign>) before issuing C<perl Makefile.PL>
+or C<perl Build.PL>; that will ensure the distribution has not been
+tampered with.
+
+Module authors can easily add the F<SIGNATURE> file to the distribution
+tarball; see L</NOTES> below for how to do it as part of C<make dist>.
+
+If you I<really> want to sign a distribution manually, simply add
+C<SIGNATURE> to F<MANIFEST>, then type C<cpansign -s> immediately
+before C<make dist>. Be sure to delete the F<SIGNATURE> file afterwards.
+
+Please also see L</NOTES> about F<MANIFEST.SKIP> issues, especially if
+you are using B<Module::Build> or writing your own F<MANIFEST.SKIP>.
+
+=head1 VARIABLES
+
+No package variables are exported by default.
+
+=over 4
+
+=item $Verbose
+
+If true, Module::Signature will give information during processing including
+gpg output. If false, Module::Signature will be as quiet as possible as
+long as everything is working ok. Defaults to false.
+
+=item $SIGNATURE
+
+The filename for a distribution's signature file. Defaults to
+C<SIGNATURE>.
+
+=item $KeyServer
+
+The OpenPGP key server for fetching the author's public key
+(currently only implemented on C<gpg>, not C<Crypt::OpenPGP>).
+May be set to a false value to prevent this module from
+fetching public keys.
+
+=item $KeyServerPort
+
+The OpenPGP key server port, defaults to C<11371>.
+
+=item $Timeout
+
+Maximum time to wait to try to establish a link to the key server.
+Defaults to C<3>.
+
+=item $AutoKeyRetrieve
+
+Whether to automatically fetch unknown keys from the key server.
+Defaults to C<1>.
+
+=item $Cipher
+
+The default cipher used by the C<Digest> module to make signature
+files. Defaults to C<SHA1>, but may be changed to other ciphers
+via the C<MODULE_SIGNATURE_CIPHER> environment variable if the SHA1
+cipher is undesirable for the user.
+
+The cipher specified in the F<SIGNATURE> file's first entry will
+be used to validate its integrity. For C<SHA1>, the user needs
+to have any one of these four modules installed: B<Digest::SHA>,
+B<Digest::SHA1>, B<Digest::SHA::PurePerl>, or (currently nonexistent)
+B<Digest::SHA1::PurePerl>.
+
+=item $Preamble
+
+The explanatory text written to newly generated F<SIGNATURE> files
+before the actual entries.
+
+=back
+
+=head1 ENVIRONMENT
+
+B<Module::Signature> honors these environment variables:
+
+=over 4
+
+=item MODULE_SIGNATURE_CIPHER
+
+Works like C<$Cipher>.
+
+=item MODULE_SIGNATURE_VERBOSE
+
+Works like C<$Verbose>.
+
+=item MODULE_SIGNATURE_KEYSERVER
+
+Works like C<$KeyServer>.
+
+=item MODULE_SIGNATURE_KEYSERVERPORT
+
+Works like C<$KeyServerPort>.
+
+=item MODULE_SIGNATURE_TIMEOUT
+
+Works like C<$Timeout>.
+
+=back
+
+=head1 CONSTANTS
+
+These constants are not exported by default.
+
+=over 4
+
+=item CANNOT_VERIFY (C<0E0>)
+
+Cannot verify the OpenPGP signature, maybe due to the lack of a network
+connection to the key server, or if neither gnupg nor Crypt::OpenPGP
+exists on the system.
+
+=item SIGNATURE_OK (C<0>)
+
+Signature successfully verified.
+
+=item SIGNATURE_MISSING (C<-1>)
+
+The F<SIGNATURE> file does not exist.
+
+=item SIGNATURE_MALFORMED (C<-2>)
+
+The signature file does not contains a valid OpenPGP message.
+
+=item SIGNATURE_BAD (C<-3>)
+
+Invalid signature detected -- it might have been tampered with.
+
+=item SIGNATURE_MISMATCH (C<-4>)
+
+The signature is valid, but files in the distribution have changed
+since its creation.
+
+=item MANIFEST_MISMATCH (C<-5>)
+
+There are extra files in the current directory not specified by
+the MANIFEST file.
+
+=item CIPHER_UNKNOWN (C<-6>)
+
+The cipher used by the signature file is not recognized by the
+C<Digest> and C<Digest::*> modules.
+
+=back
+
+=head1 NOTES
+
+=head2 Signing your module as part of C<make dist>
+
+The easiest way is to use B<Module::Install>:
+
+ sign; # put this before "WriteAll"
+ WriteAll;
+
+For B<ExtUtils::MakeMaker> (version 6.18 or above), you may do this:
+
+ WriteMakefile(
+ (MM->can('signature_target') ? (SIGN => 1) : ()),
+ # ... original arguments ...
+ );
+
+Users of B<Module::Build> may do this:
+
+ Module::Build->new(
+ (sign => 1),
+ # ... original arguments ...
+ )->create_build_script;
+
+=head2 F<MANIFEST.SKIP> Considerations
+
+(The following section is lifted from Iain Truskett's B<Test::Signature>
+module, under the Perl license. Thanks, Iain!)
+
+It is B<imperative> that your F<MANIFEST> and F<MANIFEST.SKIP> files be
+accurate and complete. If you are using C<ExtUtils::MakeMaker> and you
+do not have a F<MANIFEST.SKIP> file, then don't worry about the rest of
+this. If you do have a F<MANIFEST.SKIP> file, or you use
+C<Module::Build>, you must read this.
+
+Since the test is run at C<make test> time, the distribution has been
+made. Thus your F<MANIFEST.SKIP> file should have the entries listed
+below.
+
+If you're using C<ExtUtils::MakeMaker>, you should have, at least:
+
+ #defaults
+ ^Makefile$
+ ^blib/
+ ^pm_to_blib
+ ^blibdirs
+
+These entries are part of the default set provided by
+C<ExtUtils::Manifest>, which is ignored if you provide your own
+F<MANIFEST.SKIP> file.
+
+If you are using C<Module::Build>, you should have two extra entries:
+
+ ^Build$
+ ^_build/
+
+If you don't have the correct entries, C<Module::Signature> will
+complain that you have:
+
+ ==> MISMATCHED content between MANIFEST and distribution files! <==
+
+You should note this during normal development testing anyway.
+
+=head2 Testing signatures
+
+You may add this code as F<t/0-signature.t> in your distribution tree:
+
+ #!/usr/bin/perl
+
+ use strict;
+ print "1..1\n";
+
+ if (!$ENV{TEST_SIGNATURE}) {
+ print "ok 1 # skip Set the environment variable",
+ " TEST_SIGNATURE to enable this test\n";
+ }
+ elsif (!-s 'SIGNATURE') {
+ print "ok 1 # skip No signature file found\n";
+ }
+ elsif (!eval { require Module::Signature; 1 }) {
+ print "ok 1 # skip ",
+ "Next time around, consider install Module::Signature, ",
+ "so you can verify the integrity of this distribution.\n";
+ }
+ elsif (!eval { require Socket; Socket::inet_aton('pgp.mit.edu') }) {
+ print "ok 1 # skip ",
+ "Cannot connect to the keyserver\n";
+ }
+ else {
+ (Module::Signature::verify() == Module::Signature::SIGNATURE_OK())
+ or print "not ";
+ print "ok 1 # Valid signature\n";
+ }
+
+ __END__
+
+If you are already using B<Test::More> for testing, a more
+straightforward version of F<t/0-signature.t> can be found in the
+B<Module::Signature> distribution.
+
+Also, if you prefer a more full-fledged testing package, and are
+willing to inflict the dependency of B<Module::Build> on your users,
+Iain Truskett's B<Test::Signature> might be a better choice.
+
+=cut
+
+=head1 SEE ALSO
+
+L<Digest>, L<Digest::SHA>, L<Digest::SHA1>, L<Digest::SHA::PurePerl>
+
+L<ExtUtils::Manifest>, L<Crypt::OpenPGP>, L<Test::Signature>
+
+L<Module::Install>, L<ExtUtils::MakeMaker>, L<Module::Build>
+
+=head1 AUTHORS
+
+å”é³³ E<lt>cpan@audreyt.orgE<gt>
+
+=head1 CC0 1.0 Universal
+
+To the extent possible under law, å”é³³ has waived all copyright and related
+or neighboring rights to Module-Signature.
+
+This work is published from Taiwan.
+
+L<http://creativecommons.org/publicdomain/zero/1.0>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/NEXT.pm b/Master/tlpkg/tlperl.straw/lib/NEXT.pm
new file mode 100755
index 00000000000..1e59280241e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/NEXT.pm
@@ -0,0 +1,563 @@
+package NEXT;
+$VERSION = '0.64';
+use Carp;
+use strict;
+use overload ();
+
+sub NEXT::ELSEWHERE::ancestors
+{
+ my @inlist = shift;
+ my @outlist = ();
+ while (my $next = shift @inlist) {
+ push @outlist, $next;
+ no strict 'refs';
+ unshift @inlist, @{"$outlist[-1]::ISA"};
+ }
+ return @outlist;
+}
+
+sub NEXT::ELSEWHERE::ordered_ancestors
+{
+ my @inlist = shift;
+ my @outlist = ();
+ while (my $next = shift @inlist) {
+ push @outlist, $next;
+ no strict 'refs';
+ push @inlist, @{"$outlist[-1]::ISA"};
+ }
+ return sort { $a->isa($b) ? -1
+ : $b->isa($a) ? +1
+ : 0 } @outlist;
+}
+
+sub NEXT::ELSEWHERE::buildAUTOLOAD
+{
+ my $autoload_name = caller() . '::AUTOLOAD';
+
+ no strict 'refs';
+ *{$autoload_name} = sub {
+ my ($self) = @_;
+ my $depth = 1;
+ until (((caller($depth))[3]||q{}) !~ /^\(eval\)$/) { $depth++ }
+ my $caller = (caller($depth))[3];
+ my $wanted = $NEXT::AUTOLOAD || $autoload_name;
+ undef $NEXT::AUTOLOAD;
+ my ($caller_class, $caller_method) = do { $caller =~ m{(.*)::(.*)}g };
+ my ($wanted_class, $wanted_method) = do { $wanted =~ m{(.*)::(.*)}g };
+ croak "Can't call $wanted from $caller"
+ unless $caller_method eq $wanted_method;
+
+ my $key = ref $self && overload::Overloaded($self)
+ ? overload::StrVal($self) : $self;
+
+ local ($NEXT::NEXT{$key,$wanted_method}, $NEXT::SEEN) =
+ ($NEXT::NEXT{$key,$wanted_method}, $NEXT::SEEN);
+
+ unless ($NEXT::NEXT{$key,$wanted_method}) {
+ my @forebears =
+ NEXT::ELSEWHERE::ancestors ref $self || $self,
+ $wanted_class;
+ while (@forebears) {
+ last if shift @forebears eq $caller_class
+ }
+ no strict 'refs';
+ @{$NEXT::NEXT{$key,$wanted_method}} =
+ map {
+ my $stash = \%{"${_}::"};
+ ($stash->{$caller_method} && (*{$stash->{$caller_method}}{CODE}))
+ ? *{$stash->{$caller_method}}{CODE}
+ : () } @forebears
+ unless $wanted_method eq 'AUTOLOAD';
+ @{$NEXT::NEXT{$key,$wanted_method}} =
+ map {
+ my $stash = \%{"${_}::"};
+ ($stash->{AUTOLOAD} && (*{$stash->{AUTOLOAD}}{CODE}))
+ ? "${_}::AUTOLOAD"
+ : () } @forebears
+ unless @{$NEXT::NEXT{$key,$wanted_method}||[]};
+ $NEXT::SEEN->{$key,*{$caller}{CODE}}++;
+ }
+ my $call_method = shift @{$NEXT::NEXT{$key,$wanted_method}};
+ while (do { $wanted_class =~ /^NEXT\b.*\b(UNSEEN|DISTINCT)\b/ }
+ && defined $call_method
+ && $NEXT::SEEN->{$key,$call_method}++) {
+ $call_method = shift @{$NEXT::NEXT{$key,$wanted_method}};
+ }
+ unless (defined $call_method) {
+ return unless do { $wanted_class =~ /^NEXT:.*:ACTUAL/ };
+ (local $Carp::CarpLevel)++;
+ croak qq(Can't locate object method "$wanted_method" ),
+ qq(via package "$caller_class");
+ };
+ return $self->$call_method(@_[1..$#_]) if ref $call_method eq 'CODE';
+ no strict 'refs';
+ do { ($wanted_method=${$caller_class."::AUTOLOAD"}) =~ s/.*::// }
+ if $wanted_method eq 'AUTOLOAD';
+ $$call_method = $caller_class."::NEXT::".$wanted_method;
+ return $call_method->(@_);
+ };
+}
+
+no strict 'vars';
+package NEXT; NEXT::ELSEWHERE::buildAUTOLOAD();
+package NEXT::UNSEEN; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD();
+package NEXT::DISTINCT; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD();
+package NEXT::ACTUAL; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD();
+package NEXT::ACTUAL::UNSEEN; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD();
+package NEXT::ACTUAL::DISTINCT; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD();
+package NEXT::UNSEEN::ACTUAL; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD();
+package NEXT::DISTINCT::ACTUAL; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD();
+
+package EVERY;
+
+sub EVERY::ELSEWHERE::buildAUTOLOAD {
+ my $autoload_name = caller() . '::AUTOLOAD';
+
+ no strict 'refs';
+ *{$autoload_name} = sub {
+ my ($self) = @_;
+ my $depth = 1;
+ until (((caller($depth))[3]||q{}) !~ /^\(eval\)$/) { $depth++ }
+ my $caller = (caller($depth))[3];
+ my $wanted = $EVERY::AUTOLOAD || $autoload_name;
+ undef $EVERY::AUTOLOAD;
+ my ($wanted_class, $wanted_method) = do { $wanted =~ m{(.*)::(.*)}g };
+
+ my $key = ref($self) && overload::Overloaded($self)
+ ? overload::StrVal($self) : $self;
+
+ local $NEXT::ALREADY_IN_EVERY{$key,$wanted_method} =
+ $NEXT::ALREADY_IN_EVERY{$key,$wanted_method};
+
+ return if $NEXT::ALREADY_IN_EVERY{$key,$wanted_method}++;
+
+ my @forebears = NEXT::ELSEWHERE::ordered_ancestors ref $self || $self,
+ $wanted_class;
+ @forebears = reverse @forebears if do { $wanted_class =~ /\bLAST\b/ };
+ no strict 'refs';
+ my %seen;
+ my @every = map { my $sub = "${_}::$wanted_method";
+ !*{$sub}{CODE} || $seen{$sub}++ ? () : $sub
+ } @forebears
+ unless $wanted_method eq 'AUTOLOAD';
+
+ my $want = wantarray;
+ if (@every) {
+ if ($want) {
+ return map {($_, [$self->$_(@_[1..$#_])])} @every;
+ }
+ elsif (defined $want) {
+ return { map {($_, scalar($self->$_(@_[1..$#_])))}
+ @every
+ };
+ }
+ else {
+ $self->$_(@_[1..$#_]) for @every;
+ return;
+ }
+ }
+
+ @every = map { my $sub = "${_}::AUTOLOAD";
+ !*{$sub}{CODE} || $seen{$sub}++ ? () : "${_}::AUTOLOAD"
+ } @forebears;
+ if ($want) {
+ return map { $$_ = ref($self)."::EVERY::".$wanted_method;
+ ($_, [$self->$_(@_[1..$#_])]);
+ } @every;
+ }
+ elsif (defined $want) {
+ return { map { $$_ = ref($self)."::EVERY::".$wanted_method;
+ ($_, scalar($self->$_(@_[1..$#_])))
+ } @every
+ };
+ }
+ else {
+ for (@every) {
+ $$_ = ref($self)."::EVERY::".$wanted_method;
+ $self->$_(@_[1..$#_]);
+ }
+ return;
+ }
+ };
+}
+
+package EVERY::LAST; @ISA = 'EVERY'; EVERY::ELSEWHERE::buildAUTOLOAD();
+package EVERY; @ISA = 'NEXT'; EVERY::ELSEWHERE::buildAUTOLOAD();
+
+1;
+
+__END__
+
+=head1 NAME
+
+NEXT.pm - Provide a pseudo-class NEXT (et al) that allows method redispatch
+
+
+=head1 SYNOPSIS
+
+ use NEXT;
+
+ package A;
+ sub A::method { print "$_[0]: A method\n"; $_[0]->NEXT::method() }
+ sub A::DESTROY { print "$_[0]: A dtor\n"; $_[0]->NEXT::DESTROY() }
+
+ package B;
+ use base qw( A );
+ sub B::AUTOLOAD { print "$_[0]: B AUTOLOAD\n"; $_[0]->NEXT::AUTOLOAD() }
+ sub B::DESTROY { print "$_[0]: B dtor\n"; $_[0]->NEXT::DESTROY() }
+
+ package C;
+ sub C::method { print "$_[0]: C method\n"; $_[0]->NEXT::method() }
+ sub C::AUTOLOAD { print "$_[0]: C AUTOLOAD\n"; $_[0]->NEXT::AUTOLOAD() }
+ sub C::DESTROY { print "$_[0]: C dtor\n"; $_[0]->NEXT::DESTROY() }
+
+ package D;
+ use base qw( B C );
+ sub D::method { print "$_[0]: D method\n"; $_[0]->NEXT::method() }
+ sub D::AUTOLOAD { print "$_[0]: D AUTOLOAD\n"; $_[0]->NEXT::AUTOLOAD() }
+ sub D::DESTROY { print "$_[0]: D dtor\n"; $_[0]->NEXT::DESTROY() }
+
+ package main;
+
+ my $obj = bless {}, "D";
+
+ $obj->method(); # Calls D::method, A::method, C::method
+ $obj->missing_method(); # Calls D::AUTOLOAD, B::AUTOLOAD, C::AUTOLOAD
+
+ # Clean-up calls D::DESTROY, B::DESTROY, A::DESTROY, C::DESTROY
+
+
+
+=head1 DESCRIPTION
+
+NEXT.pm adds a pseudoclass named C<NEXT> to any program
+that uses it. If a method C<m> calls C<$self-E<gt>NEXT::m()>, the call to
+C<m> is redispatched as if the calling method had not originally been found.
+
+In other words, a call to C<$self-E<gt>NEXT::m()> resumes the depth-first,
+left-to-right search of C<$self>'s class hierarchy that resulted in the
+original call to C<m>.
+
+Note that this is not the same thing as C<$self-E<gt>SUPER::m()>, which
+begins a new dispatch that is restricted to searching the ancestors
+of the current class. C<$self-E<gt>NEXT::m()> can backtrack
+past the current class -- to look for a suitable method in other
+ancestors of C<$self> -- whereas C<$self-E<gt>SUPER::m()> cannot.
+
+A typical use would be in the destructors of a class hierarchy,
+as illustrated in the synopsis above. Each class in the hierarchy
+has a DESTROY method that performs some class-specific action
+and then redispatches the call up the hierarchy. As a result,
+when an object of class D is destroyed, the destructors of I<all>
+its parent classes are called (in depth-first, left-to-right order).
+
+Another typical use of redispatch would be in C<AUTOLOAD>'ed methods.
+If such a method determined that it was not able to handle a
+particular call, it might choose to redispatch that call, in the
+hope that some other C<AUTOLOAD> (above it, or to its left) might
+do better.
+
+By default, if a redispatch attempt fails to find another method
+elsewhere in the objects class hierarchy, it quietly gives up and does
+nothing (but see L<"Enforcing redispatch">). This gracious acquiescence
+is also unlike the (generally annoying) behaviour of C<SUPER>, which
+throws an exception if it cannot redispatch.
+
+Note that it is a fatal error for any method (including C<AUTOLOAD>)
+to attempt to redispatch any method that does not have the
+same name. For example:
+
+ sub D::oops { print "oops!\n"; $_[0]->NEXT::other_method() }
+
+
+=head2 Enforcing redispatch
+
+It is possible to make C<NEXT> redispatch more demandingly (i.e. like
+C<SUPER> does), so that the redispatch throws an exception if it cannot
+find a "next" method to call.
+
+To do this, simple invoke the redispatch as:
+
+ $self->NEXT::ACTUAL::method();
+
+rather than:
+
+ $self->NEXT::method();
+
+The C<ACTUAL> tells C<NEXT> that there must actually be a next method to call,
+or it should throw an exception.
+
+C<NEXT::ACTUAL> is most commonly used in C<AUTOLOAD> methods, as a means to
+decline an C<AUTOLOAD> request, but preserve the normal exception-on-failure
+semantics:
+
+ sub AUTOLOAD {
+ if ($AUTOLOAD =~ /foo|bar/) {
+ # handle here
+ }
+ else { # try elsewhere
+ shift()->NEXT::ACTUAL::AUTOLOAD(@_);
+ }
+ }
+
+By using C<NEXT::ACTUAL>, if there is no other C<AUTOLOAD> to handle the
+method call, an exception will be thrown (as usually happens in the absence of
+a suitable C<AUTOLOAD>).
+
+
+=head2 Avoiding repetitions
+
+If C<NEXT> redispatching is used in the methods of a "diamond" class hierarchy:
+
+ # A B
+ # / \ /
+ # C D
+ # \ /
+ # E
+
+ use NEXT;
+
+ package A;
+ sub foo { print "called A::foo\n"; shift->NEXT::foo() }
+
+ package B;
+ sub foo { print "called B::foo\n"; shift->NEXT::foo() }
+
+ package C; @ISA = qw( A );
+ sub foo { print "called C::foo\n"; shift->NEXT::foo() }
+
+ package D; @ISA = qw(A B);
+ sub foo { print "called D::foo\n"; shift->NEXT::foo() }
+
+ package E; @ISA = qw(C D);
+ sub foo { print "called E::foo\n"; shift->NEXT::foo() }
+
+ E->foo();
+
+then derived classes may (re-)inherit base-class methods through two or
+more distinct paths (e.g. in the way C<E> inherits C<A::foo> twice --
+through C<C> and C<D>). In such cases, a sequence of C<NEXT> redispatches
+will invoke the multiply inherited method as many times as it is
+inherited. For example, the above code prints:
+
+ called E::foo
+ called C::foo
+ called A::foo
+ called D::foo
+ called A::foo
+ called B::foo
+
+(i.e. C<A::foo> is called twice).
+
+In some cases this I<may> be the desired effect within a diamond hierarchy,
+but in others (e.g. for destructors) it may be more appropriate to
+call each method only once during a sequence of redispatches.
+
+To cover such cases, you can redispatch methods via:
+
+ $self->NEXT::DISTINCT::method();
+
+rather than:
+
+ $self->NEXT::method();
+
+This causes the redispatcher to only visit each distinct C<method> method
+once. That is, to skip any classes in the hierarchy that it has
+already visited during redispatch. So, for example, if the
+previous example were rewritten:
+
+ package A;
+ sub foo { print "called A::foo\n"; shift->NEXT::DISTINCT::foo() }
+
+ package B;
+ sub foo { print "called B::foo\n"; shift->NEXT::DISTINCT::foo() }
+
+ package C; @ISA = qw( A );
+ sub foo { print "called C::foo\n"; shift->NEXT::DISTINCT::foo() }
+
+ package D; @ISA = qw(A B);
+ sub foo { print "called D::foo\n"; shift->NEXT::DISTINCT::foo() }
+
+ package E; @ISA = qw(C D);
+ sub foo { print "called E::foo\n"; shift->NEXT::DISTINCT::foo() }
+
+ E->foo();
+
+then it would print:
+
+ called E::foo
+ called C::foo
+ called A::foo
+ called D::foo
+ called B::foo
+
+and omit the second call to C<A::foo> (since it would not be distinct
+from the first call to C<A::foo>).
+
+Note that you can also use:
+
+ $self->NEXT::DISTINCT::ACTUAL::method();
+
+or:
+
+ $self->NEXT::ACTUAL::DISTINCT::method();
+
+to get both unique invocation I<and> exception-on-failure.
+
+Note that, for historical compatibility, you can also use
+C<NEXT::UNSEEN> instead of C<NEXT::DISTINCT>.
+
+
+=head2 Invoking all versions of a method with a single call
+
+Yet another pseudo-class that NEXT.pm provides is C<EVERY>.
+Its behaviour is considerably simpler than that of the C<NEXT> family.
+A call to:
+
+ $obj->EVERY::foo();
+
+calls I<every> method named C<foo> that the object in C<$obj> has inherited.
+That is:
+
+ use NEXT;
+
+ package A; @ISA = qw(B D X);
+ sub foo { print "A::foo " }
+
+ package B; @ISA = qw(D X);
+ sub foo { print "B::foo " }
+
+ package X; @ISA = qw(D);
+ sub foo { print "X::foo " }
+
+ package D;
+ sub foo { print "D::foo " }
+
+ package main;
+
+ my $obj = bless {}, 'A';
+ $obj->EVERY::foo(); # prints" A::foo B::foo X::foo D::foo
+
+Prefixing a method call with C<EVERY::> causes every method in the
+object's hierarchy with that name to be invoked. As the above example
+illustrates, they are not called in Perl's usual "left-most-depth-first"
+order. Instead, they are called "breadth-first-dependency-wise".
+
+That means that the inheritance tree of the object is traversed breadth-first
+and the resulting order of classes is used as the sequence in which methods
+are called. However, that sequence is modified by imposing a rule that the
+appropriate method of a derived class must be called before the same method of
+any ancestral class. That's why, in the above example, C<X::foo> is called
+before C<D::foo>, even though C<D> comes before C<X> in C<@B::ISA>.
+
+In general, there's no need to worry about the order of calls. They will be
+left-to-right, breadth-first, most-derived-first. This works perfectly for
+most inherited methods (including destructors), but is inappropriate for
+some kinds of methods (such as constructors, cloners, debuggers, and
+initializers) where it's more appropriate that the least-derived methods be
+called first (as more-derived methods may rely on the behaviour of their
+"ancestors"). In that case, instead of using the C<EVERY> pseudo-class:
+
+ $obj->EVERY::foo(); # prints" A::foo B::foo X::foo D::foo
+
+you can use the C<EVERY::LAST> pseudo-class:
+
+ $obj->EVERY::LAST::foo(); # prints" D::foo X::foo B::foo A::foo
+
+which reverses the order of method call.
+
+Whichever version is used, the actual methods are called in the same
+context (list, scalar, or void) as the original call via C<EVERY>, and return:
+
+=over
+
+=item *
+
+A hash of array references in list context. Each entry of the hash has the
+fully qualified method name as its key and a reference to an array containing
+the method's list-context return values as its value.
+
+=item *
+
+A reference to a hash of scalar values in scalar context. Each entry of the hash has the
+fully qualified method name as its key and the method's scalar-context return values as its value.
+
+=item *
+
+Nothing in void context (obviously).
+
+=back
+
+=head2 Using C<EVERY> methods
+
+The typical way to use an C<EVERY> call is to wrap it in another base
+method, that all classes inherit. For example, to ensure that every
+destructor an object inherits is actually called (as opposed to just the
+left-most-depth-first-est one):
+
+ package Base;
+ sub DESTROY { $_[0]->EVERY::Destroy }
+
+ package Derived1;
+ use base 'Base';
+ sub Destroy {...}
+
+ package Derived2;
+ use base 'Base', 'Derived1';
+ sub Destroy {...}
+
+et cetera. Every derived class than needs its own clean-up
+behaviour simply adds its own C<Destroy> method (I<not> a C<DESTROY> method),
+which the call to C<EVERY::LAST::Destroy> in the inherited destructor
+then correctly picks up.
+
+Likewise, to create a class hierarchy in which every initializer inherited by
+a new object is invoked:
+
+ package Base;
+ sub new {
+ my ($class, %args) = @_;
+ my $obj = bless {}, $class;
+ $obj->EVERY::LAST::Init(\%args);
+ }
+
+ package Derived1;
+ use base 'Base';
+ sub Init {
+ my ($argsref) = @_;
+ ...
+ }
+
+ package Derived2;
+ use base 'Base', 'Derived1';
+ sub Init {
+ my ($argsref) = @_;
+ ...
+ }
+
+et cetera. Every derived class than needs some additional initialization
+behaviour simply adds its own C<Init> method (I<not> a C<new> method),
+which the call to C<EVERY::LAST::Init> in the inherited constructor
+then correctly picks up.
+
+
+=head1 AUTHOR
+
+Damian Conway (damian@conway.org)
+
+=head1 BUGS AND IRRITATIONS
+
+Because it's a module, not an integral part of the interpreter, NEXT.pm
+has to guess where the surrounding call was found in the method
+look-up sequence. In the presence of diamond inheritance patterns
+it occasionally guesses wrong.
+
+It's also too slow (despite caching).
+
+Comment, suggestions, and patches welcome.
+
+=head1 COPYRIGHT
+
+ Copyright (c) 2000-2001, Damian Conway. All Rights Reserved.
+ This module is free software. It may be used, redistributed
+ and/or modified under the same terms as Perl itself.
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/Cmd.pm b/Master/tlpkg/tlperl.straw/lib/Net/Cmd.pm
new file mode 100755
index 00000000000..4f0e4449f80
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/Cmd.pm
@@ -0,0 +1,783 @@
+# Net::Cmd.pm
+#
+# Copyright (c) 1995-2006 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::Cmd;
+
+require 5.001;
+require Exporter;
+
+use strict;
+use vars qw(@ISA @EXPORT $VERSION);
+use Carp;
+use Symbol 'gensym';
+
+BEGIN {
+ if ($^O eq 'os390') {
+ require Convert::EBCDIC;
+
+ # Convert::EBCDIC->import;
+ }
+}
+
+BEGIN {
+ if (!eval { require utf8 }) {
+ *is_utf8 = sub { 0 };
+ }
+ elsif (eval { utf8::is_utf8(undef); 1 }) {
+ *is_utf8 = \&utf8::is_utf8;
+ }
+ elsif (eval { require Encode; Encode::is_utf8(undef); 1 }) {
+ *is_utf8 = \&Encode::is_utf8;
+ }
+ else {
+ *is_utf8 = sub { $_[0] =~ /[^\x00-\xff]/ };
+ }
+}
+
+$VERSION = "2.29";
+@ISA = qw(Exporter);
+@EXPORT = qw(CMD_INFO CMD_OK CMD_MORE CMD_REJECT CMD_ERROR CMD_PENDING);
+
+
+sub CMD_INFO {1}
+sub CMD_OK {2}
+sub CMD_MORE {3}
+sub CMD_REJECT {4}
+sub CMD_ERROR {5}
+sub CMD_PENDING {0}
+
+my %debug = ();
+
+my $tr = $^O eq 'os390' ? Convert::EBCDIC->new() : undef;
+
+
+sub toebcdic {
+ my $cmd = shift;
+
+ unless (exists ${*$cmd}{'net_cmd_asciipeer'}) {
+ my $string = $_[0];
+ my $ebcdicstr = $tr->toebcdic($string);
+ ${*$cmd}{'net_cmd_asciipeer'} = $string !~ /^\d+/ && $ebcdicstr =~ /^\d+/;
+ }
+
+ ${*$cmd}{'net_cmd_asciipeer'}
+ ? $tr->toebcdic($_[0])
+ : $_[0];
+}
+
+
+sub toascii {
+ my $cmd = shift;
+ ${*$cmd}{'net_cmd_asciipeer'}
+ ? $tr->toascii($_[0])
+ : $_[0];
+}
+
+
+sub _print_isa {
+ no strict qw(refs);
+
+ my $pkg = shift;
+ my $cmd = $pkg;
+
+ $debug{$pkg} ||= 0;
+
+ my %done = ();
+ my @do = ($pkg);
+ my %spc = ($pkg, "");
+
+ while ($pkg = shift @do) {
+ next if defined $done{$pkg};
+
+ $done{$pkg} = 1;
+
+ my $v =
+ defined ${"${pkg}::VERSION"}
+ ? "(" . ${"${pkg}::VERSION"} . ")"
+ : "";
+
+ my $spc = $spc{$pkg};
+ $cmd->debug_print(1, "${spc}${pkg}${v}\n");
+
+ if (@{"${pkg}::ISA"}) {
+ @spc{@{"${pkg}::ISA"}} = (" " . $spc{$pkg}) x @{"${pkg}::ISA"};
+ unshift(@do, @{"${pkg}::ISA"});
+ }
+ }
+}
+
+
+sub debug {
+ @_ == 1 or @_ == 2 or croak 'usage: $obj->debug([LEVEL])';
+
+ my ($cmd, $level) = @_;
+ my $pkg = ref($cmd) || $cmd;
+ my $oldval = 0;
+
+ if (ref($cmd)) {
+ $oldval = ${*$cmd}{'net_cmd_debug'} || 0;
+ }
+ else {
+ $oldval = $debug{$pkg} || 0;
+ }
+
+ return $oldval
+ unless @_ == 2;
+
+ $level = $debug{$pkg} || 0
+ unless defined $level;
+
+ _print_isa($pkg)
+ if ($level && !exists $debug{$pkg});
+
+ if (ref($cmd)) {
+ ${*$cmd}{'net_cmd_debug'} = $level;
+ }
+ else {
+ $debug{$pkg} = $level;
+ }
+
+ $oldval;
+}
+
+
+sub message {
+ @_ == 1 or croak 'usage: $obj->message()';
+
+ my $cmd = shift;
+
+ wantarray
+ ? @{${*$cmd}{'net_cmd_resp'}}
+ : join("", @{${*$cmd}{'net_cmd_resp'}});
+}
+
+
+sub debug_text { $_[2] }
+
+
+sub debug_print {
+ my ($cmd, $out, $text) = @_;
+ print STDERR $cmd, ($out ? '>>> ' : '<<< '), $cmd->debug_text($out, $text);
+}
+
+
+sub code {
+ @_ == 1 or croak 'usage: $obj->code()';
+
+ my $cmd = shift;
+
+ ${*$cmd}{'net_cmd_code'} = "000"
+ unless exists ${*$cmd}{'net_cmd_code'};
+
+ ${*$cmd}{'net_cmd_code'};
+}
+
+
+sub status {
+ @_ == 1 or croak 'usage: $obj->status()';
+
+ my $cmd = shift;
+
+ substr(${*$cmd}{'net_cmd_code'}, 0, 1);
+}
+
+
+sub set_status {
+ @_ == 3 or croak 'usage: $obj->set_status(CODE, MESSAGE)';
+
+ my $cmd = shift;
+ my ($code, $resp) = @_;
+
+ $resp = [$resp]
+ unless ref($resp);
+
+ (${*$cmd}{'net_cmd_code'}, ${*$cmd}{'net_cmd_resp'}) = ($code, $resp);
+
+ 1;
+}
+
+
+sub command {
+ my $cmd = shift;
+
+ unless (defined fileno($cmd)) {
+ $cmd->set_status("599", "Connection closed");
+ return $cmd;
+ }
+
+
+ $cmd->dataend()
+ if (exists ${*$cmd}{'net_cmd_last_ch'});
+
+ if (scalar(@_)) {
+ local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+
+ my $str = join(
+ " ",
+ map {
+ /\n/
+ ? do { my $n = $_; $n =~ tr/\n/ /; $n }
+ : $_;
+ } @_
+ );
+ $str = $cmd->toascii($str) if $tr;
+ $str .= "\015\012";
+
+ my $len = length $str;
+ my $swlen;
+
+ $cmd->close
+ unless (defined($swlen = syswrite($cmd, $str, $len)) && $swlen == $len);
+
+ $cmd->debug_print(1, $str)
+ if ($cmd->debug);
+
+ ${*$cmd}{'net_cmd_resp'} = []; # the response
+ ${*$cmd}{'net_cmd_code'} = "000"; # Made this one up :-)
+ }
+
+ $cmd;
+}
+
+
+sub ok {
+ @_ == 1 or croak 'usage: $obj->ok()';
+
+ my $code = $_[0]->code;
+ 0 < $code && $code < 400;
+}
+
+
+sub unsupported {
+ my $cmd = shift;
+
+ ${*$cmd}{'net_cmd_resp'} = ['Unsupported command'];
+ ${*$cmd}{'net_cmd_code'} = 580;
+ 0;
+}
+
+
+sub getline {
+ my $cmd = shift;
+
+ ${*$cmd}{'net_cmd_lines'} ||= [];
+
+ return shift @{${*$cmd}{'net_cmd_lines'}}
+ if scalar(@{${*$cmd}{'net_cmd_lines'}});
+
+ my $partial = defined(${*$cmd}{'net_cmd_partial'}) ? ${*$cmd}{'net_cmd_partial'} : "";
+ my $fd = fileno($cmd);
+
+ return undef
+ unless defined $fd;
+
+ my $rin = "";
+ vec($rin, $fd, 1) = 1;
+
+ my $buf;
+
+ until (scalar(@{${*$cmd}{'net_cmd_lines'}})) {
+ my $timeout = $cmd->timeout || undef;
+ my $rout;
+
+ my $select_ret = select($rout = $rin, undef, undef, $timeout);
+ if ($select_ret > 0) {
+ unless (sysread($cmd, $buf = "", 1024)) {
+ carp(ref($cmd) . ": Unexpected EOF on command channel")
+ if $cmd->debug;
+ $cmd->close;
+ return undef;
+ }
+
+ substr($buf, 0, 0) = $partial; ## prepend from last sysread
+
+ my @buf = split(/\015?\012/, $buf, -1); ## break into lines
+
+ $partial = pop @buf;
+
+ push(@{${*$cmd}{'net_cmd_lines'}}, map {"$_\n"} @buf);
+
+ }
+ else {
+ my $msg = $select_ret ? "Error or Interrupted: $!" : "Timeout";
+ carp("$cmd: $msg") if ($cmd->debug);
+ return undef;
+ }
+ }
+
+ ${*$cmd}{'net_cmd_partial'} = $partial;
+
+ if ($tr) {
+ foreach my $ln (@{${*$cmd}{'net_cmd_lines'}}) {
+ $ln = $cmd->toebcdic($ln);
+ }
+ }
+
+ shift @{${*$cmd}{'net_cmd_lines'}};
+}
+
+
+sub ungetline {
+ my ($cmd, $str) = @_;
+
+ ${*$cmd}{'net_cmd_lines'} ||= [];
+ unshift(@{${*$cmd}{'net_cmd_lines'}}, $str);
+}
+
+
+sub parse_response {
+ return ()
+ unless $_[1] =~ s/^(\d\d\d)(.?)//o;
+ ($1, $2 eq "-");
+}
+
+
+sub response {
+ my $cmd = shift;
+ my ($code, $more) = (undef) x 2;
+
+ ${*$cmd}{'net_cmd_resp'} ||= [];
+
+ while (1) {
+ my $str = $cmd->getline();
+
+ return CMD_ERROR
+ unless defined($str);
+
+ $cmd->debug_print(0, $str)
+ if ($cmd->debug);
+
+ ($code, $more) = $cmd->parse_response($str);
+ unless (defined $code) {
+ $cmd->ungetline($str);
+ last;
+ }
+
+ ${*$cmd}{'net_cmd_code'} = $code;
+
+ push(@{${*$cmd}{'net_cmd_resp'}}, $str);
+
+ last unless ($more);
+ }
+
+ substr($code, 0, 1);
+}
+
+
+sub read_until_dot {
+ my $cmd = shift;
+ my $fh = shift;
+ my $arr = [];
+
+ while (1) {
+ my $str = $cmd->getline() or return undef;
+
+ $cmd->debug_print(0, $str)
+ if ($cmd->debug & 4);
+
+ last if ($str =~ /^\.\r?\n/o);
+
+ $str =~ s/^\.\././o;
+
+ if (defined $fh) {
+ print $fh $str;
+ }
+ else {
+ push(@$arr, $str);
+ }
+ }
+
+ $arr;
+}
+
+
+sub datasend {
+ my $cmd = shift;
+ my $arr = @_ == 1 && ref($_[0]) ? $_[0] : \@_;
+ my $line = join("", @$arr);
+
+ # encode to individual utf8 bytes if
+ # $line is a string (in internal UTF-8)
+ utf8::encode($line) if is_utf8($line);
+
+ return 0 unless defined(fileno($cmd));
+
+ my $last_ch = ${*$cmd}{'net_cmd_last_ch'};
+ $last_ch = ${*$cmd}{'net_cmd_last_ch'} = "\012" unless defined $last_ch;
+
+ return 1 unless length $line;
+
+ if ($cmd->debug) {
+ foreach my $b (split(/\n/, $line)) {
+ $cmd->debug_print(1, "$b\n");
+ }
+ }
+
+ $line =~ tr/\r\n/\015\012/ unless "\r" eq "\015";
+
+ my $first_ch = '';
+
+ if ($last_ch eq "\015") {
+ $first_ch = "\012" if $line =~ s/^\012//;
+ }
+ elsif ($last_ch eq "\012") {
+ $first_ch = "." if $line =~ /^\./;
+ }
+
+ $line =~ s/\015?\012(\.?)/\015\012$1$1/sg;
+
+ substr($line, 0, 0) = $first_ch;
+
+ ${*$cmd}{'net_cmd_last_ch'} = substr($line, -1, 1);
+
+ my $len = length($line);
+ my $offset = 0;
+ my $win = "";
+ vec($win, fileno($cmd), 1) = 1;
+ my $timeout = $cmd->timeout || undef;
+
+ local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+
+ while ($len) {
+ my $wout;
+ my $s = select(undef, $wout = $win, undef, $timeout);
+ if ((defined $s and $s > 0) or -f $cmd) # -f for testing on win32
+ {
+ my $w = syswrite($cmd, $line, $len, $offset);
+ unless (defined($w)) {
+ carp("$cmd: $!") if $cmd->debug;
+ return undef;
+ }
+ $len -= $w;
+ $offset += $w;
+ }
+ else {
+ carp("$cmd: Timeout") if ($cmd->debug);
+ return undef;
+ }
+ }
+
+ 1;
+}
+
+
+sub rawdatasend {
+ my $cmd = shift;
+ my $arr = @_ == 1 && ref($_[0]) ? $_[0] : \@_;
+ my $line = join("", @$arr);
+
+ return 0 unless defined(fileno($cmd));
+
+ return 1
+ unless length($line);
+
+ if ($cmd->debug) {
+ my $b = "$cmd>>> ";
+ print STDERR $b, join("\n$b", split(/\n/, $line)), "\n";
+ }
+
+ my $len = length($line);
+ my $offset = 0;
+ my $win = "";
+ vec($win, fileno($cmd), 1) = 1;
+ my $timeout = $cmd->timeout || undef;
+
+ local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+ while ($len) {
+ my $wout;
+ if (select(undef, $wout = $win, undef, $timeout) > 0) {
+ my $w = syswrite($cmd, $line, $len, $offset);
+ unless (defined($w)) {
+ carp("$cmd: $!") if $cmd->debug;
+ return undef;
+ }
+ $len -= $w;
+ $offset += $w;
+ }
+ else {
+ carp("$cmd: Timeout") if ($cmd->debug);
+ return undef;
+ }
+ }
+
+ 1;
+}
+
+
+sub dataend {
+ my $cmd = shift;
+
+ return 0 unless defined(fileno($cmd));
+
+ my $ch = ${*$cmd}{'net_cmd_last_ch'};
+ my $tosend;
+
+ if (!defined $ch) {
+ return 1;
+ }
+ elsif ($ch ne "\012") {
+ $tosend = "\015\012";
+ }
+
+ $tosend .= ".\015\012";
+
+ local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+
+ $cmd->debug_print(1, ".\n")
+ if ($cmd->debug);
+
+ syswrite($cmd, $tosend, length $tosend);
+
+ delete ${*$cmd}{'net_cmd_last_ch'};
+
+ $cmd->response() == CMD_OK;
+}
+
+# read and write to tied filehandle
+sub tied_fh {
+ my $cmd = shift;
+ ${*$cmd}{'net_cmd_readbuf'} = '';
+ my $fh = gensym();
+ tie *$fh, ref($cmd), $cmd;
+ return $fh;
+}
+
+# tie to myself
+sub TIEHANDLE {
+ my $class = shift;
+ my $cmd = shift;
+ return $cmd;
+}
+
+# Tied filehandle read. Reads requested data length, returning
+# end-of-file when the dot is encountered.
+sub READ {
+ my $cmd = shift;
+ my ($len, $offset) = @_[1, 2];
+ return unless exists ${*$cmd}{'net_cmd_readbuf'};
+ my $done = 0;
+ while (!$done and length(${*$cmd}{'net_cmd_readbuf'}) < $len) {
+ ${*$cmd}{'net_cmd_readbuf'} .= $cmd->getline() or return;
+ $done++ if ${*$cmd}{'net_cmd_readbuf'} =~ s/^\.\r?\n\Z//m;
+ }
+
+ $_[0] = '';
+ substr($_[0], $offset + 0) = substr(${*$cmd}{'net_cmd_readbuf'}, 0, $len);
+ substr(${*$cmd}{'net_cmd_readbuf'}, 0, $len) = '';
+ delete ${*$cmd}{'net_cmd_readbuf'} if $done;
+
+ return length $_[0];
+}
+
+
+sub READLINE {
+ my $cmd = shift;
+
+ # in this context, we use the presence of readbuf to
+ # indicate that we have not yet reached the eof
+ return unless exists ${*$cmd}{'net_cmd_readbuf'};
+ my $line = $cmd->getline;
+ return if $line =~ /^\.\r?\n/;
+ $line;
+}
+
+
+sub PRINT {
+ my $cmd = shift;
+ my ($buf, $len, $offset) = @_;
+ $len ||= length($buf);
+ $offset += 0;
+ return unless $cmd->datasend(substr($buf, $offset, $len));
+ ${*$cmd}{'net_cmd_sending'}++; # flag that we should call dataend()
+ return $len;
+}
+
+
+sub CLOSE {
+ my $cmd = shift;
+ my $r = exists(${*$cmd}{'net_cmd_sending'}) ? $cmd->dataend : 1;
+ delete ${*$cmd}{'net_cmd_readbuf'};
+ delete ${*$cmd}{'net_cmd_sending'};
+ $r;
+}
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+Net::Cmd - Network Command class (as used by FTP, SMTP etc)
+
+=head1 SYNOPSIS
+
+ use Net::Cmd;
+
+ @ISA = qw(Net::Cmd);
+
+=head1 DESCRIPTION
+
+C<Net::Cmd> is a collection of methods that can be inherited by a sub class
+of C<IO::Handle>. These methods implement the functionality required for a
+command based protocol, for example FTP and SMTP.
+
+=head1 USER METHODS
+
+These methods provide a user interface to the C<Net::Cmd> object.
+
+=over 4
+
+=item debug ( VALUE )
+
+Set the level of debug information for this object. If C<VALUE> is not given
+then the current state is returned. Otherwise the state is changed to
+C<VALUE> and the previous state returned.
+
+Different packages
+may implement different levels of debug but a non-zero value results in
+copies of all commands and responses also being sent to STDERR.
+
+If C<VALUE> is C<undef> then the debug level will be set to the default
+debug level for the class.
+
+This method can also be called as a I<static> method to set/get the default
+debug level for a given class.
+
+=item message ()
+
+Returns the text message returned from the last command
+
+=item code ()
+
+Returns the 3-digit code from the last command. If a command is pending
+then the value 0 is returned
+
+=item ok ()
+
+Returns non-zero if the last code value was greater than zero and
+less than 400. This holds true for most command servers. Servers
+where this does not hold may override this method.
+
+=item status ()
+
+Returns the most significant digit of the current status code. If a command
+is pending then C<CMD_PENDING> is returned.
+
+=item datasend ( DATA )
+
+Send data to the remote server, converting LF to CRLF. Any line starting
+with a '.' will be prefixed with another '.'.
+C<DATA> may be an array or a reference to an array.
+
+=item dataend ()
+
+End the sending of data to the remote server. This is done by ensuring that
+the data already sent ends with CRLF then sending '.CRLF' to end the
+transmission. Once this data has been sent C<dataend> calls C<response> and
+returns true if C<response> returns CMD_OK.
+
+=back
+
+=head1 CLASS METHODS
+
+These methods are not intended to be called by the user, but used or
+over-ridden by a sub-class of C<Net::Cmd>
+
+=over 4
+
+=item debug_print ( DIR, TEXT )
+
+Print debugging information. C<DIR> denotes the direction I<true> being
+data being sent to the server. Calls C<debug_text> before printing to
+STDERR.
+
+=item debug_text ( TEXT )
+
+This method is called to print debugging information. TEXT is
+the text being sent. The method should return the text to be printed
+
+This is primarily meant for the use of modules such as FTP where passwords
+are sent, but we do not want to display them in the debugging information.
+
+=item command ( CMD [, ARGS, ... ])
+
+Send a command to the command server. All arguments a first joined with
+a space character and CRLF is appended, this string is then sent to the
+command server.
+
+Returns undef upon failure
+
+=item unsupported ()
+
+Sets the status code to 580 and the response text to 'Unsupported command'.
+Returns zero.
+
+=item response ()
+
+Obtain a response from the server. Upon success the most significant digit
+of the status code is returned. Upon failure, timeout etc., I<undef> is
+returned.
+
+=item parse_response ( TEXT )
+
+This method is called by C<response> as a method with one argument. It should
+return an array of 2 values, the 3-digit status code and a flag which is true
+when this is part of a multi-line response and this line is not the list.
+
+=item getline ()
+
+Retrieve one line, delimited by CRLF, from the remote server. Returns I<undef>
+upon failure.
+
+B<NOTE>: If you do use this method for any reason, please remember to add
+some C<debug_print> calls into your method.
+
+=item ungetline ( TEXT )
+
+Unget a line of text from the server.
+
+=item rawdatasend ( DATA )
+
+Send data to the remote server without performing any conversions. C<DATA>
+is a scalar.
+
+=item read_until_dot ()
+
+Read data from the remote server until a line consisting of a single '.'.
+Any lines starting with '..' will have one of the '.'s removed.
+
+Returns a reference to a list containing the lines, or I<undef> upon failure.
+
+=item tied_fh ()
+
+Returns a filehandle tied to the Net::Cmd object. After issuing a
+command, you may read from this filehandle using read() or <>. The
+filehandle will return EOF when the final dot is encountered.
+Similarly, you may write to the filehandle in order to send data to
+the server after issuing a command that expects data to be written.
+
+See the Net::POP3 and Net::SMTP modules for examples of this.
+
+=back
+
+=head1 EXPORTS
+
+C<Net::Cmd> exports six subroutines, five of these, C<CMD_INFO>, C<CMD_OK>,
+C<CMD_MORE>, C<CMD_REJECT> and C<CMD_ERROR>, correspond to possible results
+of C<response> and C<status>. The sixth is C<CMD_PENDING>.
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-2006 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/Config.eg b/Master/tlpkg/tlperl.straw/lib/Net/Config.eg
new file mode 100755
index 00000000000..77dc1f138b8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/Config.eg
@@ -0,0 +1,49 @@
+package Net::Config;
+
+require Exporter;
+use vars qw(@ISA @EXPORT %NetConfig);
+use strict;
+
+@EXPORT = qw(%NetConfig);
+@ISA = qw(Exporter);
+
+# WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+# WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+#
+# Below this line is auto-generated, *ANY* changes will be lost
+
+%NetConfig = (
+ # the followinf parameters are all lists of hosts for the
+ # respective protocols.
+ nntp_hosts => [],
+ snpp_hosts => [],
+ pop3_hosts => [],
+ smtp_hosts => [],
+ ph_hosts => [],
+ daytime_hosts => [],
+ time_hosts => [],
+
+ # your internet domain
+ inet_domain => undef,
+
+ # If you have an ftp proxy firewall (not an http firewall)
+ # then set this to the name of the firewall
+ ftp_firewall => undef,
+
+ # set if all connections done via the firewall should use
+ # passive data connections
+ ftp_ext_passive => 0,
+
+ # set if all connections not done via the firewall should use
+ # passive data connections
+ ftp_int_passive => 0,
+
+ # If set the make test will attempt to connect to the hosts above
+ test_hosts => 0,
+
+ # Used during Configure (which you are not using) to do
+ # DNS lookups to ensure hosts exist
+ test_exist => 0,
+
+);
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/Config.pm b/Master/tlpkg/tlperl.straw/lib/Net/Config.pm
new file mode 100755
index 00000000000..db51c1fc0d2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/Config.pm
@@ -0,0 +1,312 @@
+# Net::Config.pm
+#
+# Copyright (c) 2000 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::Config;
+
+require Exporter;
+use vars qw(@ISA @EXPORT %NetConfig $VERSION $CONFIGURE $LIBNET_CFG);
+use Socket qw(inet_aton inet_ntoa);
+use strict;
+
+@EXPORT = qw(%NetConfig);
+@ISA = qw(Net::LocalCfg Exporter);
+$VERSION = "1.11";
+
+eval { local $SIG{__DIE__}; require Net::LocalCfg };
+
+%NetConfig = (
+ nntp_hosts => [],
+ snpp_hosts => [],
+ pop3_hosts => [],
+ smtp_hosts => [],
+ ph_hosts => [],
+ daytime_hosts => [],
+ time_hosts => [],
+ inet_domain => undef,
+ ftp_firewall => undef,
+ ftp_ext_passive => 1,
+ ftp_int_passive => 1,
+ test_hosts => 1,
+ test_exist => 1,
+);
+
+#
+# Try to get as much configuration info as possible from InternetConfig
+#
+$^O eq 'MacOS' and eval <<TRY_INTERNET_CONFIG;
+use Mac::InternetConfig;
+
+{
+my %nc = (
+ nntp_hosts => [ \$InternetConfig{ kICNNTPHost() } ],
+ pop3_hosts => [ \$InternetConfig{ kICMailAccount() } =~ /\@(.*)/ ],
+ smtp_hosts => [ \$InternetConfig{ kICSMTPHost() } ],
+ ftp_testhost => \$InternetConfig{ kICFTPHost() } ? \$InternetConfig{ kICFTPHost()} : undef,
+ ph_hosts => [ \$InternetConfig{ kICPhHost() } ],
+ ftp_ext_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0,
+ ftp_int_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0,
+ socks_hosts =>
+ \$InternetConfig{ kICUseSocks() } ? [ \$InternetConfig{ kICSocksHost() } ] : [],
+ ftp_firewall =>
+ \$InternetConfig{ kICUseFTPProxy() } ? [ \$InternetConfig{ kICFTPProxyHost() } ] : [],
+);
+\@NetConfig{keys %nc} = values %nc;
+}
+TRY_INTERNET_CONFIG
+
+my $file = __FILE__;
+my $ref;
+$file =~ s/Config.pm/libnet.cfg/;
+if (-f $file) {
+ $ref = eval { local $SIG{__DIE__}; do $file };
+ if (ref($ref) eq 'HASH') {
+ %NetConfig = (%NetConfig, %{$ref});
+ $LIBNET_CFG = $file;
+ }
+}
+if ($< == $> and !$CONFIGURE) {
+ my $home = eval { local $SIG{__DIE__}; (getpwuid($>))[7] } || $ENV{HOME};
+ $home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH} || '') if defined $ENV{HOMEDRIVE};
+ if (defined $home) {
+ $file = $home . "/.libnetrc";
+ $ref = eval { local $SIG{__DIE__}; do $file } if -f $file;
+ %NetConfig = (%NetConfig, %{$ref})
+ if ref($ref) eq 'HASH';
+ }
+}
+my ($k, $v);
+while (($k, $v) = each %NetConfig) {
+ $NetConfig{$k} = [$v]
+ if ($k =~ /_hosts$/ and $k ne "test_hosts" and defined($v) and !ref($v));
+}
+
+# Take a hostname and determine if it is inside the firewall
+
+
+sub requires_firewall {
+ shift; # ignore package
+ my $host = shift;
+
+ return 0 unless defined $NetConfig{'ftp_firewall'};
+
+ $host = inet_aton($host) or return -1;
+ $host = inet_ntoa($host);
+
+ if (exists $NetConfig{'local_netmask'}) {
+ my $quad = unpack("N", pack("C*", split(/\./, $host)));
+ my $list = $NetConfig{'local_netmask'};
+ $list = [$list] unless ref($list);
+ foreach (@$list) {
+ my ($net, $bits) = (m#^(\d+\.\d+\.\d+\.\d+)/(\d+)$#) or next;
+ my $mask = ~0 << (32 - $bits);
+ my $addr = unpack("N", pack("C*", split(/\./, $net)));
+
+ return 0 if (($addr & $mask) == ($quad & $mask));
+ }
+ return 1;
+ }
+
+ return 0;
+}
+
+use vars qw(*is_external);
+*is_external = \&requires_firewall;
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::Config - Local configuration data for libnet
+
+=head1 SYNOPSYS
+
+ use Net::Config qw(%NetConfig);
+
+=head1 DESCRIPTION
+
+C<Net::Config> holds configuration data for the modules in the libnet
+distribution. During installation you will be asked for these values.
+
+The configuration data is held globally in a file in the perl installation
+tree, but a user may override any of these values by providing their own. This
+can be done by having a C<.libnetrc> file in their home directory. This file
+should return a reference to a HASH containing the keys described below.
+For example
+
+ # .libnetrc
+ {
+ nntp_hosts => [ "my_preferred_host" ],
+ ph_hosts => [ "my_ph_server" ],
+ }
+ __END__
+
+=head1 METHODS
+
+C<Net::Config> defines the following methods. They are methods as they are
+invoked as class methods. This is because C<Net::Config> inherits from
+C<Net::LocalCfg> so you can override these methods if you want.
+
+=over 4
+
+=item requires_firewall HOST
+
+Attempts to determine if a given host is outside your firewall. Possible
+return values are.
+
+ -1 Cannot lookup hostname
+ 0 Host is inside firewall (or there is no ftp_firewall entry)
+ 1 Host is outside the firewall
+
+This is done by using hostname lookup and the C<local_netmask> entry in
+the configuration data.
+
+=back
+
+=head1 NetConfig VALUES
+
+=over 4
+
+=item nntp_hosts
+
+=item snpp_hosts
+
+=item pop3_hosts
+
+=item smtp_hosts
+
+=item ph_hosts
+
+=item daytime_hosts
+
+=item time_hosts
+
+Each is a reference to an array of hostnames (in order of preference),
+which should be used for the given protocol
+
+=item inet_domain
+
+Your internet domain name
+
+=item ftp_firewall
+
+If you have an FTP proxy firewall (B<NOT> an HTTP or SOCKS firewall)
+then this value should be set to the firewall hostname. If your firewall
+does not listen to port 21, then this value should be set to
+C<"hostname:port"> (eg C<"hostname:99">)
+
+=item ftp_firewall_type
+
+There are many different ftp firewall products available. But unfortunately
+there is no standard for how to traverse a firewall. The list below shows the
+sequence of commands that Net::FTP will use
+
+ user Username for remote host
+ pass Password for remote host
+ fwuser Username for firewall
+ fwpass Password for firewall
+ remote.host The hostname of the remote ftp server
+
+=over 4
+
+=item 0
+
+There is no firewall
+
+=item 1
+
+ USER user@remote.host
+ PASS pass
+
+=item 2
+
+ USER fwuser
+ PASS fwpass
+ USER user@remote.host
+ PASS pass
+
+=item 3
+
+ USER fwuser
+ PASS fwpass
+ SITE remote.site
+ USER user
+ PASS pass
+
+=item 4
+
+ USER fwuser
+ PASS fwpass
+ OPEN remote.site
+ USER user
+ PASS pass
+
+=item 5
+
+ USER user@fwuser@remote.site
+ PASS pass@fwpass
+
+=item 6
+
+ USER fwuser@remote.site
+ PASS fwpass
+ USER user
+ PASS pass
+
+=item 7
+
+ USER user@remote.host
+ PASS pass
+ AUTH fwuser
+ RESP fwpass
+
+=back
+
+=item ftp_ext_passive
+
+=item ftp_int_passive
+
+FTP servers can work in passive or active mode. Active mode is when
+you want to transfer data you have to tell the server the address and
+port to connect to. Passive mode is when the server provide the
+address and port and you establish the connection.
+
+With some firewalls active mode does not work as the server cannot
+connect to your machine (because you are behind a firewall) and the firewall
+does not re-write the command. In this case you should set C<ftp_ext_passive>
+to a I<true> value.
+
+Some servers are configured to only work in passive mode. If you have
+one of these you can force C<Net::FTP> to always transfer in passive
+mode; when not going via a firewall, by setting C<ftp_int_passive> to
+a I<true> value.
+
+=item local_netmask
+
+A reference to a list of netmask strings in the form C<"134.99.4.0/24">.
+These are used by the C<requires_firewall> function to determine if a given
+host is inside or outside your firewall.
+
+=back
+
+The following entries are used during installation & testing on the
+libnet package
+
+=over 4
+
+=item test_hosts
+
+If true then C<make test> may attempt to connect to hosts given in the
+configuration.
+
+=item test_exists
+
+If true then C<Configure> will check each hostname given that it exists
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/Domain.pm b/Master/tlpkg/tlperl.straw/lib/Net/Domain.pm
new file mode 100755
index 00000000000..330909da49d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/Domain.pm
@@ -0,0 +1,347 @@
+# Net::Domain.pm
+#
+# Copyright (c) 1995-1998 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::Domain;
+
+require Exporter;
+
+use Carp;
+use strict;
+use vars qw($VERSION @ISA @EXPORT_OK);
+use Net::Config;
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(hostname hostdomain hostfqdn domainname);
+
+$VERSION = "2.20";
+
+my ($host, $domain, $fqdn) = (undef, undef, undef);
+
+# Try every conceivable way to get hostname.
+
+
+sub _hostname {
+
+ # we already know it
+ return $host
+ if (defined $host);
+
+ if ($^O eq 'MSWin32') {
+ require Socket;
+ my ($name, $alias, $type, $len, @addr) = gethostbyname($ENV{'COMPUTERNAME'} || 'localhost');
+ while (@addr) {
+ my $a = shift(@addr);
+ $host = gethostbyaddr($a, Socket::AF_INET());
+ last if defined $host;
+ }
+ if (defined($host) && index($host, '.') > 0) {
+ $fqdn = $host;
+ ($host, $domain) = $fqdn =~ /^([^\.]+)\.(.*)$/;
+ }
+ return $host;
+ }
+ elsif ($^O eq 'MacOS') {
+ chomp($host = `hostname`);
+ }
+ elsif ($^O eq 'VMS') { ## multiple varieties of net s/w makes this hard
+ $host = $ENV{'UCX$INET_HOST'} if defined($ENV{'UCX$INET_HOST'});
+ $host = $ENV{'MULTINET_HOST_NAME'} if defined($ENV{'MULTINET_HOST_NAME'});
+ if (index($host, '.') > 0) {
+ $fqdn = $host;
+ ($host, $domain) = $fqdn =~ /^([^\.]+)\.(.*)$/;
+ }
+ return $host;
+ }
+ else {
+ local $SIG{'__DIE__'};
+
+ # syscall is preferred since it avoids tainting problems
+ eval {
+ my $tmp = "\0" x 256; ## preload scalar
+ eval {
+ package main;
+ require "syscall.ph";
+ defined(&main::SYS_gethostname);
+ }
+ || eval {
+ package main;
+ require "sys/syscall.ph";
+ defined(&main::SYS_gethostname);
+ }
+ and $host =
+ (syscall(&main::SYS_gethostname, $tmp, 256) == 0)
+ ? $tmp
+ : undef;
+ }
+
+ # POSIX
+ || eval {
+ require POSIX;
+ $host = (POSIX::uname())[1];
+ }
+
+ # trusty old hostname command
+ || eval {
+ chop($host = `(hostname) 2>/dev/null`); # BSD'ish
+ }
+
+ # sysV/POSIX uname command (may truncate)
+ || eval {
+ chop($host = `uname -n 2>/dev/null`); ## SYSV'ish && POSIX'ish
+ }
+
+ # Apollo pre-SR10
+ || eval { $host = (split(/[:\. ]/, `/com/host`, 6))[0]; }
+
+ || eval { $host = ""; };
+ }
+
+ # remove garbage
+ $host =~ s/[\0\r\n]+//go;
+ $host =~ s/(\A\.+|\.+\Z)//go;
+ $host =~ s/\.\.+/\./go;
+
+ $host;
+}
+
+
+sub _hostdomain {
+
+ # we already know it
+ return $domain
+ if (defined $domain);
+
+ local $SIG{'__DIE__'};
+
+ return $domain = $NetConfig{'inet_domain'}
+ if defined $NetConfig{'inet_domain'};
+
+ # try looking in /etc/resolv.conf
+ # putting this here and assuming that it is correct, eliminates
+ # calls to gethostbyname, and therefore DNS lookups. This helps
+ # those on dialup systems.
+
+ local *RES;
+ local ($_);
+
+ if (open(RES, "/etc/resolv.conf")) {
+ while (<RES>) {
+ $domain = $1
+ if (/\A\s*(?:domain|search)\s+(\S+)/);
+ }
+ close(RES);
+
+ return $domain
+ if (defined $domain);
+ }
+
+ # just try hostname and system calls
+
+ my $host = _hostname();
+ my (@hosts);
+
+ @hosts = ($host, "localhost");
+
+ unless (defined($host) && $host =~ /\./) {
+ my $dom = undef;
+ eval {
+ my $tmp = "\0" x 256; ## preload scalar
+ eval {
+ package main;
+ require "syscall.ph";
+ }
+ || eval {
+ package main;
+ require "sys/syscall.ph";
+ }
+ and $dom =
+ (syscall(&main::SYS_getdomainname, $tmp, 256) == 0)
+ ? $tmp
+ : undef;
+ };
+
+ if ($^O eq 'VMS') {
+ $dom ||= $ENV{'TCPIP$INET_DOMAIN'}
+ || $ENV{'UCX$INET_DOMAIN'};
+ }
+
+ chop($dom = `domainname 2>/dev/null`)
+ unless (defined $dom || $^O =~ /^(?:cygwin|MSWin32)/);
+
+ if (defined $dom) {
+ my @h = ();
+ $dom =~ s/^\.+//;
+ while (length($dom)) {
+ push(@h, "$host.$dom");
+ $dom =~ s/^[^.]+.+// or last;
+ }
+ unshift(@hosts, @h);
+ }
+ }
+
+ # Attempt to locate FQDN
+
+ foreach (grep { defined $_ } @hosts) {
+ my @info = gethostbyname($_);
+
+ next unless @info;
+
+ # look at real name & aliases
+ my $site;
+ foreach $site ($info[0], split(/ /, $info[1])) {
+ if (rindex($site, ".") > 0) {
+
+ # Extract domain from FQDN
+
+ ($domain = $site) =~ s/\A[^\.]+\.//;
+ return $domain;
+ }
+ }
+ }
+
+ # Look for environment variable
+
+ $domain ||= $ENV{LOCALDOMAIN} || $ENV{DOMAIN};
+
+ if (defined $domain) {
+ $domain =~ s/[\r\n\0]+//g;
+ $domain =~ s/(\A\.+|\.+\Z)//g;
+ $domain =~ s/\.\.+/\./g;
+ }
+
+ $domain;
+}
+
+
+sub domainname {
+
+ return $fqdn
+ if (defined $fqdn);
+
+ _hostname();
+ _hostdomain();
+
+ # Assumption: If the host name does not contain a period
+ # and the domain name does, then assume that they are correct
+ # this helps to eliminate calls to gethostbyname, and therefore
+ # eleminate DNS lookups
+
+ return $fqdn = $host . "." . $domain
+ if (defined $host
+ and defined $domain
+ and $host !~ /\./
+ and $domain =~ /\./);
+
+ # For hosts that have no name, just an IP address
+ return $fqdn = $host if defined $host and $host =~ /^\d+(\.\d+){3}$/;
+
+ my @host = defined $host ? split(/\./, $host) : ('localhost');
+ my @domain = defined $domain ? split(/\./, $domain) : ();
+ my @fqdn = ();
+
+ # Determine from @host & @domain the FQDN
+
+ my @d = @domain;
+
+LOOP:
+ while (1) {
+ my @h = @host;
+ while (@h) {
+ my $tmp = join(".", @h, @d);
+ if ((gethostbyname($tmp))[0]) {
+ @fqdn = (@h, @d);
+ $fqdn = $tmp;
+ last LOOP;
+ }
+ pop @h;
+ }
+ last unless shift @d;
+ }
+
+ if (@fqdn) {
+ $host = shift @fqdn;
+ until ((gethostbyname($host))[0]) {
+ $host .= "." . shift @fqdn;
+ }
+ $domain = join(".", @fqdn);
+ }
+ else {
+ undef $host;
+ undef $domain;
+ undef $fqdn;
+ }
+
+ $fqdn;
+}
+
+
+sub hostfqdn { domainname() }
+
+
+sub hostname {
+ domainname()
+ unless (defined $host);
+ return $host;
+}
+
+
+sub hostdomain {
+ domainname()
+ unless (defined $domain);
+ return $domain;
+}
+
+1; # Keep require happy
+
+__END__
+
+=head1 NAME
+
+Net::Domain - Attempt to evaluate the current host's internet name and domain
+
+=head1 SYNOPSIS
+
+ use Net::Domain qw(hostname hostfqdn hostdomain domainname);
+
+=head1 DESCRIPTION
+
+Using various methods B<attempt> to find the Fully Qualified Domain Name (FQDN)
+of the current host. From this determine the host-name and the host-domain.
+
+Each of the functions will return I<undef> if the FQDN cannot be determined.
+
+=over 4
+
+=item hostfqdn ()
+
+Identify and return the FQDN of the current host.
+
+=item domainname ()
+
+An alias for hostfqdn ().
+
+=item hostname ()
+
+Returns the smallest part of the FQDN which can be used to identify the host.
+
+=item hostdomain ()
+
+Returns the remainder of the FQDN after the I<hostname> has been removed.
+
+=back
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>.
+Adapted from Sys::Hostname by David Sundstrom <sunds@asictest.sc.ti.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1998 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/FTP.pm b/Master/tlpkg/tlperl.straw/lib/Net/FTP.pm
new file mode 100755
index 00000000000..9ed6d385d9c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/FTP.pm
@@ -0,0 +1,1829 @@
+# Net::FTP.pm
+#
+# Copyright (c) 1995-2004 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+# Documentation (at end) improved 1996 by Nathan Torkington <gnat@frii.com>.
+
+package Net::FTP;
+
+require 5.001;
+
+use strict;
+use vars qw(@ISA $VERSION);
+use Carp;
+
+use Socket 1.3;
+use IO::Socket;
+use Time::Local;
+use Net::Cmd;
+use Net::Config;
+use Fcntl qw(O_WRONLY O_RDONLY O_APPEND O_CREAT O_TRUNC);
+
+$VERSION = '2.77';
+@ISA = qw(Exporter Net::Cmd IO::Socket::INET);
+
+# Someday I will "use constant", when I am not bothered to much about
+# compatability with older releases of perl
+
+use vars qw($TELNET_IAC $TELNET_IP $TELNET_DM);
+($TELNET_IAC, $TELNET_IP, $TELNET_DM) = (255, 244, 242);
+
+
+BEGIN {
+
+ # make a constant so code is fast'ish
+ my $is_os390 = $^O eq 'os390';
+ *trEBCDIC = sub () {$is_os390}
+}
+
+
+sub new {
+ my $pkg = shift;
+ my ($peer, %arg);
+ if (@_ % 2) {
+ $peer = shift;
+ %arg = @_;
+ }
+ else {
+ %arg = @_;
+ $peer = delete $arg{Host};
+ }
+
+ my $host = $peer;
+ my $fire = undef;
+ my $fire_type = undef;
+
+ if (exists($arg{Firewall}) || Net::Config->requires_firewall($peer)) {
+ $fire = $arg{Firewall}
+ || $ENV{FTP_FIREWALL}
+ || $NetConfig{ftp_firewall}
+ || undef;
+
+ if (defined $fire) {
+ $peer = $fire;
+ delete $arg{Port};
+ $fire_type = $arg{FirewallType}
+ || $ENV{FTP_FIREWALL_TYPE}
+ || $NetConfig{firewall_type}
+ || undef;
+ }
+ }
+
+ my $ftp = $pkg->SUPER::new(
+ PeerAddr => $peer,
+ PeerPort => $arg{Port} || 'ftp(21)',
+ LocalAddr => $arg{'LocalAddr'},
+ Proto => 'tcp',
+ Timeout => defined $arg{Timeout}
+ ? $arg{Timeout}
+ : 120
+ )
+ or return undef;
+
+ ${*$ftp}{'net_ftp_host'} = $host; # Remote hostname
+ ${*$ftp}{'net_ftp_type'} = 'A'; # ASCII/binary/etc mode
+ ${*$ftp}{'net_ftp_blksize'} = abs($arg{'BlockSize'} || 10240);
+
+ ${*$ftp}{'net_ftp_localaddr'} = $arg{'LocalAddr'};
+
+ ${*$ftp}{'net_ftp_firewall'} = $fire
+ if (defined $fire);
+ ${*$ftp}{'net_ftp_firewall_type'} = $fire_type
+ if (defined $fire_type);
+
+ ${*$ftp}{'net_ftp_passive'} =
+ int exists $arg{Passive} ? $arg{Passive}
+ : exists $ENV{FTP_PASSIVE} ? $ENV{FTP_PASSIVE}
+ : defined $fire ? $NetConfig{ftp_ext_passive}
+ : $NetConfig{ftp_int_passive}; # Whew! :-)
+
+ $ftp->hash(exists $arg{Hash} ? $arg{Hash} : 0, 1024);
+
+ $ftp->autoflush(1);
+
+ $ftp->debug(exists $arg{Debug} ? $arg{Debug} : undef);
+
+ unless ($ftp->response() == CMD_OK) {
+ $ftp->close();
+ $@ = $ftp->message;
+ undef $ftp;
+ }
+
+ $ftp;
+}
+
+##
+## User interface methods
+##
+
+
+sub host {
+ my $me = shift;
+ ${*$me}{'net_ftp_host'};
+}
+
+
+sub hash {
+ my $ftp = shift; # self
+
+ my ($h, $b) = @_;
+ unless ($h) {
+ delete ${*$ftp}{'net_ftp_hash'};
+ return [\*STDERR, 0];
+ }
+ ($h, $b) = (ref($h) ? $h : \*STDERR, $b || 1024);
+ select((select($h), $| = 1)[0]);
+ $b = 512 if $b < 512;
+ ${*$ftp}{'net_ftp_hash'} = [$h, $b];
+}
+
+
+sub quit {
+ my $ftp = shift;
+
+ $ftp->_QUIT;
+ $ftp->close;
+}
+
+
+sub DESTROY { }
+
+
+sub ascii { shift->type('A', @_); }
+sub binary { shift->type('I', @_); }
+
+
+sub ebcdic {
+ carp "TYPE E is unsupported, shall default to I";
+ shift->type('E', @_);
+}
+
+
+sub byte {
+ carp "TYPE L is unsupported, shall default to I";
+ shift->type('L', @_);
+}
+
+# Allow the user to send a command directly, BE CAREFUL !!
+
+
+sub quot {
+ my $ftp = shift;
+ my $cmd = shift;
+
+ $ftp->command(uc $cmd, @_);
+ $ftp->response();
+}
+
+
+sub site {
+ my $ftp = shift;
+
+ $ftp->command("SITE", @_);
+ $ftp->response();
+}
+
+
+sub mdtm {
+ my $ftp = shift;
+ my $file = shift;
+
+ # Server Y2K bug workaround
+ #
+ # sigh; some idiotic FTP servers use ("19%d",tm.tm_year) instead of
+ # ("%d",tm.tm_year+1900). This results in an extra digit in the
+ # string returned. To account for this we allow an optional extra
+ # digit in the year. Then if the first two digits are 19 we use the
+ # remainder, otherwise we subtract 1900 from the whole year.
+
+ $ftp->_MDTM($file)
+ && $ftp->message =~ /((\d\d)(\d\d\d?))(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/
+ ? timegm($8, $7, $6, $5, $4 - 1, $2 eq '19' ? $3 : ($1 - 1900))
+ : undef;
+}
+
+
+sub size {
+ my $ftp = shift;
+ my $file = shift;
+ my $io;
+ if ($ftp->supported("SIZE")) {
+ return $ftp->_SIZE($file)
+ ? ($ftp->message =~ /(\d+)\s*(bytes?\s*)?$/)[0]
+ : undef;
+ }
+ elsif ($ftp->supported("STAT")) {
+ my @msg;
+ return undef
+ unless $ftp->_STAT($file) && (@msg = $ftp->message) == 3;
+ my $line;
+ foreach $line (@msg) {
+ return (split(/\s+/, $line))[4]
+ if $line =~ /^[-rwxSsTt]{10}/;
+ }
+ }
+ else {
+ my @files = $ftp->dir($file);
+ if (@files) {
+ return (split(/\s+/, $1))[4]
+ if $files[0] =~ /^([-rwxSsTt]{10}.*)$/;
+ }
+ }
+ undef;
+}
+
+
+sub login {
+ my ($ftp, $user, $pass, $acct) = @_;
+ my ($ok, $ruser, $fwtype);
+
+ unless (defined $user) {
+ require Net::Netrc;
+
+ my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_host'});
+
+ ($user, $pass, $acct) = $rc->lpa()
+ if ($rc);
+ }
+
+ $user ||= "anonymous";
+ $ruser = $user;
+
+ $fwtype = ${*$ftp}{'net_ftp_firewall_type'}
+ || $NetConfig{'ftp_firewall_type'}
+ || 0;
+
+ if ($fwtype && defined ${*$ftp}{'net_ftp_firewall'}) {
+ if ($fwtype == 1 || $fwtype == 7) {
+ $user .= '@' . ${*$ftp}{'net_ftp_host'};
+ }
+ else {
+ require Net::Netrc;
+
+ my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_firewall'});
+
+ my ($fwuser, $fwpass, $fwacct) = $rc ? $rc->lpa() : ();
+
+ if ($fwtype == 5) {
+ $user = join('@', $user, $fwuser, ${*$ftp}{'net_ftp_host'});
+ $pass = $pass . '@' . $fwpass;
+ }
+ else {
+ if ($fwtype == 2) {
+ $user .= '@' . ${*$ftp}{'net_ftp_host'};
+ }
+ elsif ($fwtype == 6) {
+ $fwuser .= '@' . ${*$ftp}{'net_ftp_host'};
+ }
+
+ $ok = $ftp->_USER($fwuser);
+
+ return 0 unless $ok == CMD_OK || $ok == CMD_MORE;
+
+ $ok = $ftp->_PASS($fwpass || "");
+
+ return 0 unless $ok == CMD_OK || $ok == CMD_MORE;
+
+ $ok = $ftp->_ACCT($fwacct)
+ if defined($fwacct);
+
+ if ($fwtype == 3) {
+ $ok = $ftp->command("SITE", ${*$ftp}{'net_ftp_host'})->response;
+ }
+ elsif ($fwtype == 4) {
+ $ok = $ftp->command("OPEN", ${*$ftp}{'net_ftp_host'})->response;
+ }
+
+ return 0 unless $ok == CMD_OK || $ok == CMD_MORE;
+ }
+ }
+ }
+
+ $ok = $ftp->_USER($user);
+
+ # Some dumb firewalls don't prefix the connection messages
+ $ok = $ftp->response()
+ if ($ok == CMD_OK && $ftp->code == 220 && $user =~ /\@/);
+
+ if ($ok == CMD_MORE) {
+ unless (defined $pass) {
+ require Net::Netrc;
+
+ my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_host'}, $ruser);
+
+ ($ruser, $pass, $acct) = $rc->lpa()
+ if ($rc);
+
+ $pass = '-anonymous@'
+ if (!defined $pass && (!defined($ruser) || $ruser =~ /^anonymous/o));
+ }
+
+ $ok = $ftp->_PASS($pass || "");
+ }
+
+ $ok = $ftp->_ACCT($acct)
+ if (defined($acct) && ($ok == CMD_MORE || $ok == CMD_OK));
+
+ if ($fwtype == 7 && $ok == CMD_OK && defined ${*$ftp}{'net_ftp_firewall'}) {
+ my ($f, $auth, $resp) = _auth_id($ftp);
+ $ftp->authorize($auth, $resp) if defined($resp);
+ }
+
+ $ok == CMD_OK;
+}
+
+
+sub account {
+ @_ == 2 or croak 'usage: $ftp->account( ACCT )';
+ my $ftp = shift;
+ my $acct = shift;
+ $ftp->_ACCT($acct) == CMD_OK;
+}
+
+
+sub _auth_id {
+ my ($ftp, $auth, $resp) = @_;
+
+ unless (defined $resp) {
+ require Net::Netrc;
+
+ $auth ||= eval { (getpwuid($>))[0] } || $ENV{NAME};
+
+ my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_firewall'}, $auth)
+ || Net::Netrc->lookup(${*$ftp}{'net_ftp_firewall'});
+
+ ($auth, $resp) = $rc->lpa()
+ if ($rc);
+ }
+ ($ftp, $auth, $resp);
+}
+
+
+sub authorize {
+ @_ >= 1 || @_ <= 3 or croak 'usage: $ftp->authorize( [AUTH [, RESP]])';
+
+ my ($ftp, $auth, $resp) = &_auth_id;
+
+ my $ok = $ftp->_AUTH($auth || "");
+
+ $ok = $ftp->_RESP($resp || "")
+ if ($ok == CMD_MORE);
+
+ $ok == CMD_OK;
+}
+
+
+sub rename {
+ @_ == 3 or croak 'usage: $ftp->rename(FROM, TO)';
+
+ my ($ftp, $from, $to) = @_;
+
+ $ftp->_RNFR($from)
+ && $ftp->_RNTO($to);
+}
+
+
+sub type {
+ my $ftp = shift;
+ my $type = shift;
+ my $oldval = ${*$ftp}{'net_ftp_type'};
+
+ return $oldval
+ unless (defined $type);
+
+ return undef
+ unless ($ftp->_TYPE($type, @_));
+
+ ${*$ftp}{'net_ftp_type'} = join(" ", $type, @_);
+
+ $oldval;
+}
+
+
+sub alloc {
+ my $ftp = shift;
+ my $size = shift;
+ my $oldval = ${*$ftp}{'net_ftp_allo'};
+
+ return $oldval
+ unless (defined $size);
+
+ return undef
+ unless ($ftp->_ALLO($size, @_));
+
+ ${*$ftp}{'net_ftp_allo'} = join(" ", $size, @_);
+
+ $oldval;
+}
+
+
+sub abort {
+ my $ftp = shift;
+
+ send($ftp, pack("CCC", $TELNET_IAC, $TELNET_IP, $TELNET_IAC), MSG_OOB);
+
+ $ftp->command(pack("C", $TELNET_DM) . "ABOR");
+
+ ${*$ftp}{'net_ftp_dataconn'}->close()
+ if defined ${*$ftp}{'net_ftp_dataconn'};
+
+ $ftp->response();
+
+ $ftp->status == CMD_OK;
+}
+
+
+sub get {
+ my ($ftp, $remote, $local, $where) = @_;
+
+ my ($loc, $len, $buf, $resp, $data);
+ local *FD;
+
+ my $localfd = ref($local) || ref(\$local) eq "GLOB";
+
+ ($local = $remote) =~ s#^.*/##
+ unless (defined $local);
+
+ croak("Bad remote filename '$remote'\n")
+ if $remote =~ /[\r\n]/s;
+
+ ${*$ftp}{'net_ftp_rest'} = $where if defined $where;
+ my $rest = ${*$ftp}{'net_ftp_rest'};
+
+ delete ${*$ftp}{'net_ftp_port'};
+ delete ${*$ftp}{'net_ftp_pasv'};
+
+ $data = $ftp->retr($remote)
+ or return undef;
+
+ if ($localfd) {
+ $loc = $local;
+ }
+ else {
+ $loc = \*FD;
+
+ unless (sysopen($loc, $local, O_CREAT | O_WRONLY | ($rest ? O_APPEND: O_TRUNC))) {
+ carp "Cannot open Local file $local: $!\n";
+ $data->abort;
+ return undef;
+ }
+ }
+
+ if ($ftp->type eq 'I' && !binmode($loc)) {
+ carp "Cannot binmode Local file $local: $!\n";
+ $data->abort;
+ close($loc) unless $localfd;
+ return undef;
+ }
+
+ $buf = '';
+ my ($count, $hashh, $hashb, $ref) = (0);
+
+ ($hashh, $hashb) = @$ref
+ if ($ref = ${*$ftp}{'net_ftp_hash'});
+
+ my $blksize = ${*$ftp}{'net_ftp_blksize'};
+ local $\; # Just in case
+
+ while (1) {
+ last unless $len = $data->read($buf, $blksize);
+
+ if (trEBCDIC && $ftp->type ne 'I') {
+ $buf = $ftp->toebcdic($buf);
+ $len = length($buf);
+ }
+
+ if ($hashh) {
+ $count += $len;
+ print $hashh "#" x (int($count / $hashb));
+ $count %= $hashb;
+ }
+ unless (print $loc $buf) {
+ carp "Cannot write to Local file $local: $!\n";
+ $data->abort;
+ close($loc)
+ unless $localfd;
+ return undef;
+ }
+ }
+
+ print $hashh "\n" if $hashh;
+
+ unless ($localfd) {
+ unless (close($loc)) {
+ carp "Cannot close file $local (perhaps disk space) $!\n";
+ return undef;
+ }
+ }
+
+ unless ($data->close()) # implied $ftp->response
+ {
+ carp "Unable to close datastream";
+ return undef;
+ }
+
+ return $local;
+}
+
+
+sub cwd {
+ @_ == 1 || @_ == 2 or croak 'usage: $ftp->cwd( [ DIR ] )';
+
+ my ($ftp, $dir) = @_;
+
+ $dir = "/" unless defined($dir) && $dir =~ /\S/;
+
+ $dir eq ".."
+ ? $ftp->_CDUP()
+ : $ftp->_CWD($dir);
+}
+
+
+sub cdup {
+ @_ == 1 or croak 'usage: $ftp->cdup()';
+ $_[0]->_CDUP;
+}
+
+
+sub pwd {
+ @_ == 1 || croak 'usage: $ftp->pwd()';
+ my $ftp = shift;
+
+ $ftp->_PWD();
+ $ftp->_extract_path;
+}
+
+# rmdir( $ftp, $dir, [ $recurse ] )
+#
+# Removes $dir on remote host via FTP.
+# $ftp is handle for remote host
+#
+# If $recurse is TRUE, the directory and deleted recursively.
+# This means all of its contents and subdirectories.
+#
+# Initial version contributed by Dinkum Software
+#
+sub rmdir {
+ @_ == 2 || @_ == 3 or croak('usage: $ftp->rmdir( DIR [, RECURSE ] )');
+
+ # Pick off the args
+ my ($ftp, $dir, $recurse) = @_;
+ my $ok;
+
+ return $ok
+ if $ok = $ftp->_RMD($dir)
+ or !$recurse;
+
+ # Try to delete the contents
+ # Get a list of all the files in the directory
+ my @filelist = grep { !/^\.{1,2}$/ } $ftp->ls($dir);
+
+ return undef
+ unless @filelist; # failed, it is probably not a directory
+
+ # Go thru and delete each file or the directory
+ my $file;
+ foreach $file (map { m,/, ? $_ : "$dir/$_" } @filelist) {
+ next # successfully deleted the file
+ if $ftp->delete($file);
+
+ # Failed to delete it, assume its a directory
+ # Recurse and ignore errors, the final rmdir() will
+ # fail on any errors here
+ return $ok
+ unless $ok = $ftp->rmdir($file, 1);
+ }
+
+ # Directory should be empty
+ # Try to remove the directory again
+ # Pass results directly to caller
+ # If any of the prior deletes failed, this
+ # rmdir() will fail because directory is not empty
+ return $ftp->_RMD($dir);
+}
+
+
+sub restart {
+ @_ == 2 || croak 'usage: $ftp->restart( BYTE_OFFSET )';
+
+ my ($ftp, $where) = @_;
+
+ ${*$ftp}{'net_ftp_rest'} = $where;
+
+ return undef;
+}
+
+
+sub mkdir {
+ @_ == 2 || @_ == 3 or croak 'usage: $ftp->mkdir( DIR [, RECURSE ] )';
+
+ my ($ftp, $dir, $recurse) = @_;
+
+ $ftp->_MKD($dir) || $recurse
+ or return undef;
+
+ my $path = $dir;
+
+ unless ($ftp->ok) {
+ my @path = split(m#(?=/+)#, $dir);
+
+ $path = "";
+
+ while (@path) {
+ $path .= shift @path;
+
+ $ftp->_MKD($path);
+
+ $path = $ftp->_extract_path($path);
+ }
+
+ # If the creation of the last element was not successful, see if we
+ # can cd to it, if so then return path
+
+ unless ($ftp->ok) {
+ my ($status, $message) = ($ftp->status, $ftp->message);
+ my $pwd = $ftp->pwd;
+
+ if ($pwd && $ftp->cwd($dir)) {
+ $path = $dir;
+ $ftp->cwd($pwd);
+ }
+ else {
+ undef $path;
+ }
+ $ftp->set_status($status, $message);
+ }
+ }
+
+ $path;
+}
+
+
+sub delete {
+ @_ == 2 || croak 'usage: $ftp->delete( FILENAME )';
+
+ $_[0]->_DELE($_[1]);
+}
+
+
+sub put { shift->_store_cmd("stor", @_) }
+sub put_unique { shift->_store_cmd("stou", @_) }
+sub append { shift->_store_cmd("appe", @_) }
+
+
+sub nlst { shift->_data_cmd("NLST", @_) }
+sub list { shift->_data_cmd("LIST", @_) }
+sub retr { shift->_data_cmd("RETR", @_) }
+sub stor { shift->_data_cmd("STOR", @_) }
+sub stou { shift->_data_cmd("STOU", @_) }
+sub appe { shift->_data_cmd("APPE", @_) }
+
+
+sub _store_cmd {
+ my ($ftp, $cmd, $local, $remote) = @_;
+ my ($loc, $sock, $len, $buf);
+ local *FD;
+
+ my $localfd = ref($local) || ref(\$local) eq "GLOB";
+
+ unless (defined $remote) {
+ croak 'Must specify remote filename with stream input'
+ if $localfd;
+
+ require File::Basename;
+ $remote = File::Basename::basename($local);
+ }
+ if (defined ${*$ftp}{'net_ftp_allo'}) {
+ delete ${*$ftp}{'net_ftp_allo'};
+ }
+ else {
+
+ # if the user hasn't already invoked the alloc method since the last
+ # _store_cmd call, figure out if the local file is a regular file(not
+ # a pipe, or device) and if so get the file size from stat, and send
+ # an ALLO command before sending the STOR, STOU, or APPE command.
+ my $size = do { local $^W; -f $local && -s _ }; # no ALLO if sending data from a pipe
+ $ftp->_ALLO($size) if $size;
+ }
+ croak("Bad remote filename '$remote'\n")
+ if $remote =~ /[\r\n]/s;
+
+ if ($localfd) {
+ $loc = $local;
+ }
+ else {
+ $loc = \*FD;
+
+ unless (sysopen($loc, $local, O_RDONLY)) {
+ carp "Cannot open Local file $local: $!\n";
+ return undef;
+ }
+ }
+
+ if ($ftp->type eq 'I' && !binmode($loc)) {
+ carp "Cannot binmode Local file $local: $!\n";
+ return undef;
+ }
+
+ delete ${*$ftp}{'net_ftp_port'};
+ delete ${*$ftp}{'net_ftp_pasv'};
+
+ $sock = $ftp->_data_cmd($cmd, $remote)
+ or return undef;
+
+ $remote = ($ftp->message =~ /FILE:\s*(.*)/)[0]
+ if 'STOU' eq uc $cmd;
+
+ my $blksize = ${*$ftp}{'net_ftp_blksize'};
+
+ my ($count, $hashh, $hashb, $ref) = (0);
+
+ ($hashh, $hashb) = @$ref
+ if ($ref = ${*$ftp}{'net_ftp_hash'});
+
+ while (1) {
+ last unless $len = read($loc, $buf = "", $blksize);
+
+ if (trEBCDIC && $ftp->type ne 'I') {
+ $buf = $ftp->toascii($buf);
+ $len = length($buf);
+ }
+
+ if ($hashh) {
+ $count += $len;
+ print $hashh "#" x (int($count / $hashb));
+ $count %= $hashb;
+ }
+
+ my $wlen;
+ unless (defined($wlen = $sock->write($buf, $len)) && $wlen == $len) {
+ $sock->abort;
+ close($loc)
+ unless $localfd;
+ print $hashh "\n" if $hashh;
+ return undef;
+ }
+ }
+
+ print $hashh "\n" if $hashh;
+
+ close($loc)
+ unless $localfd;
+
+ $sock->close()
+ or return undef;
+
+ if ('STOU' eq uc $cmd and $ftp->message =~ m/unique\s+file\s*name\s*:\s*(.*)\)|"(.*)"/) {
+ require File::Basename;
+ $remote = File::Basename::basename($+);
+ }
+
+ return $remote;
+}
+
+
+sub port {
+ @_ == 1 || @_ == 2 or croak 'usage: $ftp->port([PORT])';
+
+ my ($ftp, $port) = @_;
+ my $ok;
+
+ delete ${*$ftp}{'net_ftp_intern_port'};
+
+ unless (defined $port) {
+
+ # create a Listen socket at same address as the command socket
+
+ ${*$ftp}{'net_ftp_listen'} ||= IO::Socket::INET->new(
+ Listen => 5,
+ Proto => 'tcp',
+ Timeout => $ftp->timeout,
+ LocalAddr => $ftp->sockhost,
+ );
+
+ my $listen = ${*$ftp}{'net_ftp_listen'};
+
+ my ($myport, @myaddr) = ($listen->sockport, split(/\./, $listen->sockhost));
+
+ $port = join(',', @myaddr, $myport >> 8, $myport & 0xff);
+
+ ${*$ftp}{'net_ftp_intern_port'} = 1;
+ }
+
+ $ok = $ftp->_PORT($port);
+
+ ${*$ftp}{'net_ftp_port'} = $port;
+
+ $ok;
+}
+
+
+sub ls { shift->_list_cmd("NLST", @_); }
+sub dir { shift->_list_cmd("LIST", @_); }
+
+
+sub pasv {
+ @_ == 1 or croak 'usage: $ftp->pasv()';
+
+ my $ftp = shift;
+
+ delete ${*$ftp}{'net_ftp_intern_port'};
+
+ $ftp->_PASV && $ftp->message =~ /(\d+(,\d+)+)/
+ ? ${*$ftp}{'net_ftp_pasv'} = $1
+ : undef;
+}
+
+
+sub unique_name {
+ my $ftp = shift;
+ ${*$ftp}{'net_ftp_unique'} || undef;
+}
+
+
+sub supported {
+ @_ == 2 or croak 'usage: $ftp->supported( CMD )';
+ my $ftp = shift;
+ my $cmd = uc shift;
+ my $hash = ${*$ftp}{'net_ftp_supported'} ||= {};
+
+ return $hash->{$cmd}
+ if exists $hash->{$cmd};
+
+ return $hash->{$cmd} = 0
+ unless $ftp->_HELP($cmd);
+
+ my $text = $ftp->message;
+ if ($text =~ /following\s+commands/i) {
+ $text =~ s/^.*\n//;
+ while ($text =~ /(\*?)(\w+)(\*?)/sg) {
+ $hash->{"\U$2"} = !length("$1$3");
+ }
+ }
+ else {
+ $hash->{$cmd} = $text !~ /unimplemented/i;
+ }
+
+ $hash->{$cmd} ||= 0;
+}
+
+##
+## Deprecated methods
+##
+
+
+sub lsl {
+ carp "Use of Net::FTP::lsl deprecated, use 'dir'"
+ if $^W;
+ goto &dir;
+}
+
+
+sub authorise {
+ carp "Use of Net::FTP::authorise deprecated, use 'authorize'"
+ if $^W;
+ goto &authorize;
+}
+
+
+##
+## Private methods
+##
+
+
+sub _extract_path {
+ my ($ftp, $path) = @_;
+
+ # This tries to work both with and without the quote doubling
+ # convention (RFC 959 requires it, but the first 3 servers I checked
+ # didn't implement it). It will fail on a server which uses a quote in
+ # the message which isn't a part of or surrounding the path.
+ $ftp->ok
+ && $ftp->message =~ /(?:^|\s)\"(.*)\"(?:$|\s)/
+ && ($path = $1) =~ s/\"\"/\"/g;
+
+ $path;
+}
+
+##
+## Communication methods
+##
+
+
+sub _dataconn {
+ my $ftp = shift;
+ my $data = undef;
+ my $pkg = "Net::FTP::" . $ftp->type;
+
+ eval "require " . $pkg;
+
+ $pkg =~ s/ /_/g;
+
+ delete ${*$ftp}{'net_ftp_dataconn'};
+
+ if (defined ${*$ftp}{'net_ftp_pasv'}) {
+ my @port = map { 0 + $_ } split(/,/, ${*$ftp}{'net_ftp_pasv'});
+
+ $data = $pkg->new(
+ PeerAddr => join(".", @port[0 .. 3]),
+ PeerPort => $port[4] * 256 + $port[5],
+ LocalAddr => ${*$ftp}{'net_ftp_localaddr'},
+ Proto => 'tcp'
+ );
+ }
+ elsif (defined ${*$ftp}{'net_ftp_listen'}) {
+ $data = ${*$ftp}{'net_ftp_listen'}->accept($pkg);
+ close(delete ${*$ftp}{'net_ftp_listen'});
+ }
+
+ if ($data) {
+ ${*$data} = "";
+ $data->timeout($ftp->timeout);
+ ${*$ftp}{'net_ftp_dataconn'} = $data;
+ ${*$data}{'net_ftp_cmd'} = $ftp;
+ ${*$data}{'net_ftp_blksize'} = ${*$ftp}{'net_ftp_blksize'};
+ }
+
+ $data;
+}
+
+
+sub _list_cmd {
+ my $ftp = shift;
+ my $cmd = uc shift;
+
+ delete ${*$ftp}{'net_ftp_port'};
+ delete ${*$ftp}{'net_ftp_pasv'};
+
+ my $data = $ftp->_data_cmd($cmd, @_);
+
+ return
+ unless (defined $data);
+
+ require Net::FTP::A;
+ bless $data, "Net::FTP::A"; # Force ASCII mode
+
+ my $databuf = '';
+ my $buf = '';
+ my $blksize = ${*$ftp}{'net_ftp_blksize'};
+
+ while ($data->read($databuf, $blksize)) {
+ $buf .= $databuf;
+ }
+
+ my $list = [split(/\n/, $buf)];
+
+ $data->close();
+
+ if (trEBCDIC) {
+ for (@$list) { $_ = $ftp->toebcdic($_) }
+ }
+
+ wantarray
+ ? @{$list}
+ : $list;
+}
+
+
+sub _data_cmd {
+ my $ftp = shift;
+ my $cmd = uc shift;
+ my $ok = 1;
+ my $where = delete ${*$ftp}{'net_ftp_rest'} || 0;
+ my $arg;
+
+ for $arg (@_) {
+ croak("Bad argument '$arg'\n")
+ if $arg =~ /[\r\n]/s;
+ }
+
+ if ( ${*$ftp}{'net_ftp_passive'}
+ && !defined ${*$ftp}{'net_ftp_pasv'}
+ && !defined ${*$ftp}{'net_ftp_port'})
+ {
+ my $data = undef;
+
+ $ok = defined $ftp->pasv;
+ $ok = $ftp->_REST($where)
+ if $ok && $where;
+
+ if ($ok) {
+ $ftp->command($cmd, @_);
+ $data = $ftp->_dataconn();
+ $ok = CMD_INFO == $ftp->response();
+ if ($ok) {
+ $data->reading
+ if $data && $cmd =~ /RETR|LIST|NLST/;
+ return $data;
+ }
+ $data->_close
+ if $data;
+ }
+ return undef;
+ }
+
+ $ok = $ftp->port
+ unless (defined ${*$ftp}{'net_ftp_port'}
+ || defined ${*$ftp}{'net_ftp_pasv'});
+
+ $ok = $ftp->_REST($where)
+ if $ok && $where;
+
+ return undef
+ unless $ok;
+
+ $ftp->command($cmd, @_);
+
+ return 1
+ if (defined ${*$ftp}{'net_ftp_pasv'});
+
+ $ok = CMD_INFO == $ftp->response();
+
+ return $ok
+ unless exists ${*$ftp}{'net_ftp_intern_port'};
+
+ if ($ok) {
+ my $data = $ftp->_dataconn();
+
+ $data->reading
+ if $data && $cmd =~ /RETR|LIST|NLST/;
+
+ return $data;
+ }
+
+
+ close(delete ${*$ftp}{'net_ftp_listen'});
+
+ return undef;
+}
+
+##
+## Over-ride methods (Net::Cmd)
+##
+
+
+sub debug_text { $_[2] =~ /^(pass|resp|acct)/i ? "$1 ....\n" : $_[2]; }
+
+
+sub command {
+ my $ftp = shift;
+
+ delete ${*$ftp}{'net_ftp_port'};
+ $ftp->SUPER::command(@_);
+}
+
+
+sub response {
+ my $ftp = shift;
+ my $code = $ftp->SUPER::response();
+
+ delete ${*$ftp}{'net_ftp_pasv'}
+ if ($code != CMD_MORE && $code != CMD_INFO);
+
+ $code;
+}
+
+
+sub parse_response {
+ return ($1, $2 eq "-")
+ if $_[1] =~ s/^(\d\d\d)([- ]?)//o;
+
+ my $ftp = shift;
+
+ # Darn MS FTP server is a load of CRAP !!!!
+ return ()
+ unless ${*$ftp}{'net_cmd_code'} + 0;
+
+ (${*$ftp}{'net_cmd_code'}, 1);
+}
+
+##
+## Allow 2 servers to talk directly
+##
+
+
+sub pasv_xfer_unique {
+ my ($sftp, $sfile, $dftp, $dfile) = @_;
+ $sftp->pasv_xfer($sfile, $dftp, $dfile, 1);
+}
+
+
+sub pasv_xfer {
+ my ($sftp, $sfile, $dftp, $dfile, $unique) = @_;
+
+ ($dfile = $sfile) =~ s#.*/##
+ unless (defined $dfile);
+
+ my $port = $sftp->pasv
+ or return undef;
+
+ $dftp->port($port)
+ or return undef;
+
+ return undef
+ unless ($unique ? $dftp->stou($dfile) : $dftp->stor($dfile));
+
+ unless ($sftp->retr($sfile) && $sftp->response == CMD_INFO) {
+ $sftp->retr($sfile);
+ $dftp->abort;
+ $dftp->response();
+ return undef;
+ }
+
+ $dftp->pasv_wait($sftp);
+}
+
+
+sub pasv_wait {
+ @_ == 2 or croak 'usage: $ftp->pasv_wait(NON_PASV_FTP)';
+
+ my ($ftp, $non_pasv) = @_;
+ my ($file, $rin, $rout);
+
+ vec($rin = '', fileno($ftp), 1) = 1;
+ select($rout = $rin, undef, undef, undef);
+
+ $ftp->response();
+ $non_pasv->response();
+
+ return undef
+ unless $ftp->ok() && $non_pasv->ok();
+
+ return $1
+ if $ftp->message =~ /unique file name:\s*(\S*)\s*\)/;
+
+ return $1
+ if $non_pasv->message =~ /unique file name:\s*(\S*)\s*\)/;
+
+ return 1;
+}
+
+
+sub feature {
+ @_ == 2 or croak 'usage: $ftp->feature( NAME )';
+ my ($ftp, $feat) = @_;
+
+ my $feature = ${*$ftp}{net_ftp_feature} ||= do {
+ my @feat;
+
+ # Example response
+ # 211-Features:
+ # MDTM
+ # REST STREAM
+ # SIZE
+ # 211 End
+
+ @feat = map { /^\s+(.*\S)/ } $ftp->message
+ if $ftp->_FEAT;
+
+ \@feat;
+ };
+
+ return grep { /^\Q$feat\E\b/i } @$feature;
+}
+
+
+sub cmd { shift->command(@_)->response() }
+
+########################################
+#
+# RFC959 commands
+#
+
+
+sub _ABOR { shift->command("ABOR")->response() == CMD_OK }
+sub _ALLO { shift->command("ALLO", @_)->response() == CMD_OK }
+sub _CDUP { shift->command("CDUP")->response() == CMD_OK }
+sub _NOOP { shift->command("NOOP")->response() == CMD_OK }
+sub _PASV { shift->command("PASV")->response() == CMD_OK }
+sub _QUIT { shift->command("QUIT")->response() == CMD_OK }
+sub _DELE { shift->command("DELE", @_)->response() == CMD_OK }
+sub _CWD { shift->command("CWD", @_)->response() == CMD_OK }
+sub _PORT { shift->command("PORT", @_)->response() == CMD_OK }
+sub _RMD { shift->command("RMD", @_)->response() == CMD_OK }
+sub _MKD { shift->command("MKD", @_)->response() == CMD_OK }
+sub _PWD { shift->command("PWD", @_)->response() == CMD_OK }
+sub _TYPE { shift->command("TYPE", @_)->response() == CMD_OK }
+sub _RNTO { shift->command("RNTO", @_)->response() == CMD_OK }
+sub _RESP { shift->command("RESP", @_)->response() == CMD_OK }
+sub _MDTM { shift->command("MDTM", @_)->response() == CMD_OK }
+sub _SIZE { shift->command("SIZE", @_)->response() == CMD_OK }
+sub _HELP { shift->command("HELP", @_)->response() == CMD_OK }
+sub _STAT { shift->command("STAT", @_)->response() == CMD_OK }
+sub _FEAT { shift->command("FEAT", @_)->response() == CMD_OK }
+sub _APPE { shift->command("APPE", @_)->response() == CMD_INFO }
+sub _LIST { shift->command("LIST", @_)->response() == CMD_INFO }
+sub _NLST { shift->command("NLST", @_)->response() == CMD_INFO }
+sub _RETR { shift->command("RETR", @_)->response() == CMD_INFO }
+sub _STOR { shift->command("STOR", @_)->response() == CMD_INFO }
+sub _STOU { shift->command("STOU", @_)->response() == CMD_INFO }
+sub _RNFR { shift->command("RNFR", @_)->response() == CMD_MORE }
+sub _REST { shift->command("REST", @_)->response() == CMD_MORE }
+sub _PASS { shift->command("PASS", @_)->response() }
+sub _ACCT { shift->command("ACCT", @_)->response() }
+sub _AUTH { shift->command("AUTH", @_)->response() }
+
+
+sub _USER {
+ my $ftp = shift;
+ my $ok = $ftp->command("USER", @_)->response();
+
+ # A certain brain dead firewall :-)
+ $ok = $ftp->command("user", @_)->response()
+ unless $ok == CMD_MORE or $ok == CMD_OK;
+
+ $ok;
+}
+
+
+sub _SMNT { shift->unsupported(@_) }
+sub _MODE { shift->unsupported(@_) }
+sub _SYST { shift->unsupported(@_) }
+sub _STRU { shift->unsupported(@_) }
+sub _REIN { shift->unsupported(@_) }
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::FTP - FTP Client class
+
+=head1 SYNOPSIS
+
+ use Net::FTP;
+
+ $ftp = Net::FTP->new("some.host.name", Debug => 0)
+ or die "Cannot connect to some.host.name: $@";
+
+ $ftp->login("anonymous",'-anonymous@')
+ or die "Cannot login ", $ftp->message;
+
+ $ftp->cwd("/pub")
+ or die "Cannot change working directory ", $ftp->message;
+
+ $ftp->get("that.file")
+ or die "get failed ", $ftp->message;
+
+ $ftp->quit;
+
+=head1 DESCRIPTION
+
+C<Net::FTP> is a class implementing a simple FTP client in Perl as
+described in RFC959. It provides wrappers for a subset of the RFC959
+commands.
+
+=head1 OVERVIEW
+
+FTP stands for File Transfer Protocol. It is a way of transferring
+files between networked machines. The protocol defines a client
+(whose commands are provided by this module) and a server (not
+implemented in this module). Communication is always initiated by the
+client, and the server responds with a message and a status code (and
+sometimes with data).
+
+The FTP protocol allows files to be sent to or fetched from the
+server. Each transfer involves a B<local file> (on the client) and a
+B<remote file> (on the server). In this module, the same file name
+will be used for both local and remote if only one is specified. This
+means that transferring remote file C</path/to/file> will try to put
+that file in C</path/to/file> locally, unless you specify a local file
+name.
+
+The protocol also defines several standard B<translations> which the
+file can undergo during transfer. These are ASCII, EBCDIC, binary,
+and byte. ASCII is the default type, and indicates that the sender of
+files will translate the ends of lines to a standard representation
+which the receiver will then translate back into their local
+representation. EBCDIC indicates the file being transferred is in
+EBCDIC format. Binary (also known as image) format sends the data as
+a contiguous bit stream. Byte format transfers the data as bytes, the
+values of which remain the same regardless of differences in byte size
+between the two machines (in theory - in practice you should only use
+this if you really know what you're doing).
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ([ HOST ] [, OPTIONS ])
+
+This is the constructor for a new Net::FTP object. C<HOST> is the
+name of the remote host to which an FTP connection is required.
+
+C<HOST> is optional. If C<HOST> is not given then it may instead be
+passed as the C<Host> option described below.
+
+C<OPTIONS> are passed in a hash like fashion, using key and value pairs.
+Possible options are:
+
+B<Host> - FTP host to connect to. It may be a single scalar, as defined for
+the C<PeerAddr> option in L<IO::Socket::INET>, or a reference to
+an array with hosts to try in turn. The L</host> method will return the value
+which was used to connect to the host.
+
+
+B<Firewall> - The name of a machine which acts as an FTP firewall. This can be
+overridden by an environment variable C<FTP_FIREWALL>. If specified, and the
+given host cannot be directly connected to, then the
+connection is made to the firewall machine and the string C<@hostname> is
+appended to the login identifier. This kind of setup is also referred to
+as an ftp proxy.
+
+B<FirewallType> - The type of firewall running on the machine indicated by
+B<Firewall>. This can be overridden by an environment variable
+C<FTP_FIREWALL_TYPE>. For a list of permissible types, see the description of
+ftp_firewall_type in L<Net::Config>.
+
+B<BlockSize> - This is the block size that Net::FTP will use when doing
+transfers. (defaults to 10240)
+
+B<Port> - The port number to connect to on the remote machine for the
+FTP connection
+
+B<Timeout> - Set a timeout value (defaults to 120)
+
+B<Debug> - debug level (see the debug method in L<Net::Cmd>)
+
+B<Passive> - If set to a non-zero value then all data transfers will
+be done using passive mode. If set to zero then data transfers will be
+done using active mode. If the machine is connected to the Internet
+directly, both passive and active mode should work equally well.
+Behind most firewall and NAT configurations passive mode has a better
+chance of working. However, in some rare firewall configurations,
+active mode actually works when passive mode doesn't. Some really old
+FTP servers might not implement passive transfers. If not specified,
+then the transfer mode is set by the environment variable
+C<FTP_PASSIVE> or if that one is not set by the settings done by the
+F<libnetcfg> utility. If none of these apply then passive mode is
+used.
+
+B<Hash> - If given a reference to a file handle (e.g., C<\*STDERR>),
+print hash marks (#) on that filehandle every 1024 bytes. This
+simply invokes the C<hash()> method for you, so that hash marks
+are displayed for all transfers. You can, of course, call C<hash()>
+explicitly whenever you'd like.
+
+B<LocalAddr> - Local address to use for all socket connections, this
+argument will be passed to L<IO::Socket::INET>
+
+If the constructor fails undef will be returned and an error message will
+be in $@
+
+=back
+
+=head1 METHODS
+
+Unless otherwise stated all methods return either a I<true> or I<false>
+value, with I<true> meaning that the operation was a success. When a method
+states that it returns a value, failure will be returned as I<undef> or an
+empty list.
+
+=over 4
+
+=item login ([LOGIN [,PASSWORD [, ACCOUNT] ] ])
+
+Log into the remote FTP server with the given login information. If
+no arguments are given then the C<Net::FTP> uses the C<Net::Netrc>
+package to lookup the login information for the connected host.
+If no information is found then a login of I<anonymous> is used.
+If no password is given and the login is I<anonymous> then I<anonymous@>
+will be used for password.
+
+If the connection is via a firewall then the C<authorize> method will
+be called with no arguments.
+
+=item authorize ( [AUTH [, RESP]])
+
+This is a protocol used by some firewall ftp proxies. It is used
+to authorise the user to send data out. If both arguments are not specified
+then C<authorize> uses C<Net::Netrc> to do a lookup.
+
+=item site (ARGS)
+
+Send a SITE command to the remote server and wait for a response.
+
+Returns most significant digit of the response code.
+
+=item ascii
+
+Transfer file in ASCII. CRLF translation will be done if required
+
+=item binary
+
+Transfer file in binary mode. No transformation will be done.
+
+B<Hint>: If both server and client machines use the same line ending for
+text files, then it will be faster to transfer all files in binary mode.
+
+=item rename ( OLDNAME, NEWNAME )
+
+Rename a file on the remote FTP server from C<OLDNAME> to C<NEWNAME>. This
+is done by sending the RNFR and RNTO commands.
+
+=item delete ( FILENAME )
+
+Send a request to the server to delete C<FILENAME>.
+
+=item cwd ( [ DIR ] )
+
+Attempt to change directory to the directory given in C<$dir>. If
+C<$dir> is C<"..">, the FTP C<CDUP> command is used to attempt to
+move up one directory. If no directory is given then an attempt is made
+to change the directory to the root directory.
+
+=item cdup ()
+
+Change directory to the parent of the current directory.
+
+=item pwd ()
+
+Returns the full pathname of the current directory.
+
+=item restart ( WHERE )
+
+Set the byte offset at which to begin the next data transfer. Net::FTP simply
+records this value and uses it when during the next data transfer. For this
+reason this method will not return an error, but setting it may cause
+a subsequent data transfer to fail.
+
+=item rmdir ( DIR [, RECURSE ])
+
+Remove the directory with the name C<DIR>. If C<RECURSE> is I<true> then
+C<rmdir> will attempt to delete everything inside the directory.
+
+=item mkdir ( DIR [, RECURSE ])
+
+Create a new directory with the name C<DIR>. If C<RECURSE> is I<true> then
+C<mkdir> will attempt to create all the directories in the given path.
+
+Returns the full pathname to the new directory.
+
+=item alloc ( SIZE [, RECORD_SIZE] )
+
+The alloc command allows you to give the ftp server a hint about the size
+of the file about to be transferred using the ALLO ftp command. Some storage
+systems use this to make intelligent decisions about how to store the file.
+The C<SIZE> argument represents the size of the file in bytes. The
+C<RECORD_SIZE> argument indicates a maximum record or page size for files
+sent with a record or page structure.
+
+The size of the file will be determined, and sent to the server
+automatically for normal files so that this method need only be called if
+you are transferring data from a socket, named pipe, or other stream not
+associated with a normal file.
+
+=item ls ( [ DIR ] )
+
+Get a directory listing of C<DIR>, or the current directory.
+
+In an array context, returns a list of lines returned from the server. In
+a scalar context, returns a reference to a list.
+
+=item dir ( [ DIR ] )
+
+Get a directory listing of C<DIR>, or the current directory in long format.
+
+In an array context, returns a list of lines returned from the server. In
+a scalar context, returns a reference to a list.
+
+=item get ( REMOTE_FILE [, LOCAL_FILE [, WHERE]] )
+
+Get C<REMOTE_FILE> from the server and store locally. C<LOCAL_FILE> may be
+a filename or a filehandle. If not specified, the file will be stored in
+the current directory with the same leafname as the remote file.
+
+If C<WHERE> is given then the first C<WHERE> bytes of the file will
+not be transferred, and the remaining bytes will be appended to
+the local file if it already exists.
+
+Returns C<LOCAL_FILE>, or the generated local file name if C<LOCAL_FILE>
+is not given. If an error was encountered undef is returned.
+
+=item put ( LOCAL_FILE [, REMOTE_FILE ] )
+
+Put a file on the remote server. C<LOCAL_FILE> may be a name or a filehandle.
+If C<LOCAL_FILE> is a filehandle then C<REMOTE_FILE> must be specified. If
+C<REMOTE_FILE> is not specified then the file will be stored in the current
+directory with the same leafname as C<LOCAL_FILE>.
+
+Returns C<REMOTE_FILE>, or the generated remote filename if C<REMOTE_FILE>
+is not given.
+
+B<NOTE>: If for some reason the transfer does not complete and an error is
+returned then the contents that had been transferred will not be remove
+automatically.
+
+=item put_unique ( LOCAL_FILE [, REMOTE_FILE ] )
+
+Same as put but uses the C<STOU> command.
+
+Returns the name of the file on the server.
+
+=item append ( LOCAL_FILE [, REMOTE_FILE ] )
+
+Same as put but appends to the file on the remote server.
+
+Returns C<REMOTE_FILE>, or the generated remote filename if C<REMOTE_FILE>
+is not given.
+
+=item unique_name ()
+
+Returns the name of the last file stored on the server using the
+C<STOU> command.
+
+=item mdtm ( FILE )
+
+Returns the I<modification time> of the given file
+
+=item size ( FILE )
+
+Returns the size in bytes for the given file as stored on the remote server.
+
+B<NOTE>: The size reported is the size of the stored file on the remote server.
+If the file is subsequently transferred from the server in ASCII mode
+and the remote server and local machine have different ideas about
+"End Of Line" then the size of file on the local machine after transfer
+may be different.
+
+=item supported ( CMD )
+
+Returns TRUE if the remote server supports the given command.
+
+=item hash ( [FILEHANDLE_GLOB_REF],[ BYTES_PER_HASH_MARK] )
+
+Called without parameters, or with the first argument false, hash marks
+are suppressed. If the first argument is true but not a reference to a
+file handle glob, then \*STDERR is used. The second argument is the number
+of bytes per hash mark printed, and defaults to 1024. In all cases the
+return value is a reference to an array of two: the filehandle glob reference
+and the bytes per hash mark.
+
+=item feature ( NAME )
+
+Determine if the server supports the specified feature. The return
+value is a list of lines the server responded with to describe the
+options that it supports for the given feature. If the feature is
+unsupported then the empty list is returned.
+
+ if ($ftp->feature( 'MDTM' )) {
+ # Do something
+ }
+
+ if (grep { /\bTLS\b/ } $ftp->feature('AUTH')) {
+ # Server supports TLS
+ }
+
+=back
+
+The following methods can return different results depending on
+how they are called. If the user explicitly calls either
+of the C<pasv> or C<port> methods then these methods will
+return a I<true> or I<false> value. If the user does not
+call either of these methods then the result will be a
+reference to a C<Net::FTP::dataconn> based object.
+
+=over 4
+
+=item nlst ( [ DIR ] )
+
+Send an C<NLST> command to the server, with an optional parameter.
+
+=item list ( [ DIR ] )
+
+Same as C<nlst> but using the C<LIST> command
+
+=item retr ( FILE )
+
+Begin the retrieval of a file called C<FILE> from the remote server.
+
+=item stor ( FILE )
+
+Tell the server that you wish to store a file. C<FILE> is the
+name of the new file that should be created.
+
+=item stou ( FILE )
+
+Same as C<stor> but using the C<STOU> command. The name of the unique
+file which was created on the server will be available via the C<unique_name>
+method after the data connection has been closed.
+
+=item appe ( FILE )
+
+Tell the server that we want to append some data to the end of a file
+called C<FILE>. If this file does not exist then create it.
+
+=back
+
+If for some reason you want to have complete control over the data connection,
+this includes generating it and calling the C<response> method when required,
+then the user can use these methods to do so.
+
+However calling these methods only affects the use of the methods above that
+can return a data connection. They have no effect on methods C<get>, C<put>,
+C<put_unique> and those that do not require data connections.
+
+=over 4
+
+=item port ( [ PORT ] )
+
+Send a C<PORT> command to the server. If C<PORT> is specified then it is sent
+to the server. If not, then a listen socket is created and the correct information
+sent to the server.
+
+=item pasv ()
+
+Tell the server to go into passive mode. Returns the text that represents the
+port on which the server is listening, this text is in a suitable form to
+sent to another ftp server using the C<port> method.
+
+=back
+
+The following methods can be used to transfer files between two remote
+servers, providing that these two servers can connect directly to each other.
+
+=over 4
+
+=item pasv_xfer ( SRC_FILE, DEST_SERVER [, DEST_FILE ] )
+
+This method will do a file transfer between two remote ftp servers. If
+C<DEST_FILE> is omitted then the leaf name of C<SRC_FILE> will be used.
+
+=item pasv_xfer_unique ( SRC_FILE, DEST_SERVER [, DEST_FILE ] )
+
+Like C<pasv_xfer> but the file is stored on the remote server using
+the STOU command.
+
+=item pasv_wait ( NON_PASV_SERVER )
+
+This method can be used to wait for a transfer to complete between a passive
+server and a non-passive server. The method should be called on the passive
+server with the C<Net::FTP> object for the non-passive server passed as an
+argument.
+
+=item abort ()
+
+Abort the current data transfer.
+
+=item quit ()
+
+Send the QUIT command to the remote FTP server and close the socket connection.
+
+=back
+
+=head2 Methods for the adventurous
+
+C<Net::FTP> inherits from C<Net::Cmd> so methods defined in C<Net::Cmd> may
+be used to send commands to the remote FTP server.
+
+=over 4
+
+=item quot (CMD [,ARGS])
+
+Send a command, that Net::FTP does not directly support, to the remote
+server and wait for a response.
+
+Returns most significant digit of the response code.
+
+B<WARNING> This call should only be used on commands that do not require
+data connections. Misuse of this method can hang the connection.
+
+=back
+
+=head1 THE dataconn CLASS
+
+Some of the methods defined in C<Net::FTP> return an object which will
+be derived from this class.The dataconn class itself is derived from
+the C<IO::Socket::INET> class, so any normal IO operations can be performed.
+However the following methods are defined in the dataconn class and IO should
+be performed using these.
+
+=over 4
+
+=item read ( BUFFER, SIZE [, TIMEOUT ] )
+
+Read C<SIZE> bytes of data from the server and place it into C<BUFFER>, also
+performing any <CRLF> translation necessary. C<TIMEOUT> is optional, if not
+given, the timeout value from the command connection will be used.
+
+Returns the number of bytes read before any <CRLF> translation.
+
+=item write ( BUFFER, SIZE [, TIMEOUT ] )
+
+Write C<SIZE> bytes of data from C<BUFFER> to the server, also
+performing any <CRLF> translation necessary. C<TIMEOUT> is optional, if not
+given, the timeout value from the command connection will be used.
+
+Returns the number of bytes written before any <CRLF> translation.
+
+=item bytes_read ()
+
+Returns the number of bytes read so far.
+
+=item abort ()
+
+Abort the current data transfer.
+
+=item close ()
+
+Close the data connection and get a response from the FTP server. Returns
+I<true> if the connection was closed successfully and the first digit of
+the response from the server was a '2'.
+
+=back
+
+=head1 UNIMPLEMENTED
+
+The following RFC959 commands have not been implemented:
+
+=over 4
+
+=item B<SMNT>
+
+Mount a different file system structure without changing login or
+accounting information.
+
+=item B<HELP>
+
+Ask the server for "helpful information" (that's what the RFC says) on
+the commands it accepts.
+
+=item B<MODE>
+
+Specifies transfer mode (stream, block or compressed) for file to be
+transferred.
+
+=item B<SYST>
+
+Request remote server system identification.
+
+=item B<STAT>
+
+Request remote server status.
+
+=item B<STRU>
+
+Specifies file structure for file to be transferred.
+
+=item B<REIN>
+
+Reinitialize the connection, flushing all I/O and account information.
+
+=back
+
+=head1 REPORTING BUGS
+
+When reporting bugs/problems please include as much information as possible.
+It may be difficult for me to reproduce the problem as almost every setup
+is different.
+
+A small script which yields the problem will probably be of help. It would
+also be useful if this script was run with the extra options C<Debug => 1>
+passed to the constructor, and the output sent with the bug report. If you
+cannot include a small script then please include a Debug trace from a
+run of your program which does yield the problem.
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 SEE ALSO
+
+L<Net::Netrc>
+L<Net::Cmd>
+
+ftp(1), ftpd(8), RFC 959
+http://www.cis.ohio-state.edu/htbin/rfc/rfc959.html
+
+=head1 USE EXAMPLES
+
+For an example of the use of Net::FTP see
+
+=over 4
+
+=item http://www.csh.rit.edu/~adam/Progs/
+
+C<autoftp> is a program that can retrieve, send, or list files via
+the FTP protocol in a non-interactive manner.
+
+=back
+
+=head1 CREDITS
+
+Henry Gabryjelski <henryg@WPI.EDU> - for the suggestion of creating directories
+recursively.
+
+Nathan Torkington <gnat@frii.com> - for some input on the documentation.
+
+Roderick Schertler <roderick@gate.net> - for various inputs
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-2004 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/FTP/A.pm b/Master/tlpkg/tlperl.straw/lib/Net/FTP/A.pm
new file mode 100755
index 00000000000..427d02b19e9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/FTP/A.pm
@@ -0,0 +1,111 @@
+##
+## Package to read/write on ASCII data connections
+##
+
+package Net::FTP::A;
+use strict;
+use vars qw(@ISA $buf $VERSION);
+use Carp;
+
+require Net::FTP::dataconn;
+
+@ISA = qw(Net::FTP::dataconn);
+$VERSION = "1.18";
+
+
+sub read {
+ my $data = shift;
+ local *buf = \$_[0];
+ shift;
+ my $size = shift || croak 'read($buf,$size,[$offset])';
+ my $timeout = @_ ? shift: $data->timeout;
+
+ if (length(${*$data}) < $size && !${*$data}{'net_ftp_eof'}) {
+ my $blksize = ${*$data}{'net_ftp_blksize'};
+ $blksize = $size if $size > $blksize;
+
+ my $l = 0;
+ my $n;
+
+ READ:
+ {
+ my $readbuf = defined(${*$data}{'net_ftp_cr'}) ? "\015" : '';
+
+ $data->can_read($timeout)
+ or croak "Timeout";
+
+ if ($n = sysread($data, $readbuf, $blksize, length $readbuf)) {
+ ${*$data}{'net_ftp_bytesread'} += $n;
+ ${*$data}{'net_ftp_cr'} =
+ substr($readbuf, -1) eq "\015"
+ ? chop($readbuf)
+ : undef;
+ }
+ else {
+ return undef
+ unless defined $n;
+
+ ${*$data}{'net_ftp_eof'} = 1;
+ }
+
+ $readbuf =~ s/\015\012/\n/sgo;
+ ${*$data} .= $readbuf;
+
+ unless (length(${*$data})) {
+
+ redo READ
+ if ($n > 0);
+
+ $size = length(${*$data})
+ if ($n == 0);
+ }
+ }
+ }
+
+ $buf = substr(${*$data}, 0, $size);
+ substr(${*$data}, 0, $size) = '';
+
+ length $buf;
+}
+
+
+sub write {
+ my $data = shift;
+ local *buf = \$_[0];
+ shift;
+ my $size = shift || croak 'write($buf,$size,[$timeout])';
+ my $timeout = @_ ? shift: $data->timeout;
+
+ my $nr = (my $tmp = substr($buf, 0, $size)) =~ tr/\r\n/\015\012/;
+ $tmp =~ s/([^\015])\012/$1\015\012/sg if $nr;
+ $tmp =~ s/^\012/\015\012/ unless ${*$data}{'net_ftp_outcr'};
+ ${*$data}{'net_ftp_outcr'} = substr($tmp, -1) eq "\015";
+
+ # If the remote server has closed the connection we will be signal'd
+ # when we write. This can happen if the disk on the remote server fills up
+
+ local $SIG{PIPE} = 'IGNORE'
+ unless ($SIG{PIPE} || '') eq 'IGNORE'
+ or $^O eq 'MacOS';
+
+ my $len = length($tmp);
+ my $off = 0;
+ my $wrote = 0;
+
+ my $blksize = ${*$data}{'net_ftp_blksize'};
+
+ while ($len) {
+ $data->can_write($timeout)
+ or croak "Timeout";
+
+ $off += $wrote;
+ $wrote = syswrite($data, substr($tmp, $off), $len > $blksize ? $blksize : $len);
+ return undef
+ unless defined($wrote);
+ $len -= $wrote;
+ }
+
+ $size;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/FTP/E.pm b/Master/tlpkg/tlperl.straw/lib/Net/FTP/E.pm
new file mode 100755
index 00000000000..d480cd72955
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/FTP/E.pm
@@ -0,0 +1,8 @@
+package Net::FTP::E;
+
+require Net::FTP::I;
+
+@ISA = qw(Net::FTP::I);
+$VERSION = "0.01";
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/FTP/I.pm b/Master/tlpkg/tlperl.straw/lib/Net/FTP/I.pm
new file mode 100755
index 00000000000..449bb99eab6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/FTP/I.pm
@@ -0,0 +1,80 @@
+##
+## Package to read/write on BINARY data connections
+##
+
+package Net::FTP::I;
+
+use vars qw(@ISA $buf $VERSION);
+use Carp;
+
+require Net::FTP::dataconn;
+
+@ISA = qw(Net::FTP::dataconn);
+$VERSION = "1.12";
+
+
+sub read {
+ my $data = shift;
+ local *buf = \$_[0];
+ shift;
+ my $size = shift || croak 'read($buf,$size,[$timeout])';
+ my $timeout = @_ ? shift: $data->timeout;
+
+ my $n;
+
+ if ($size > length ${*$data} and !${*$data}{'net_ftp_eof'}) {
+ $data->can_read($timeout)
+ or croak "Timeout";
+
+ my $blksize = ${*$data}{'net_ftp_blksize'};
+ $blksize = $size if $size > $blksize;
+
+ unless ($n = sysread($data, ${*$data}, $blksize, length ${*$data})) {
+ return undef unless defined $n;
+ ${*$data}{'net_ftp_eof'} = 1;
+ }
+ }
+
+ $buf = substr(${*$data}, 0, $size);
+
+ $n = length($buf);
+
+ substr(${*$data}, 0, $n) = '';
+
+ ${*$data}{'net_ftp_bytesread'} += $n;
+
+ $n;
+}
+
+
+sub write {
+ my $data = shift;
+ local *buf = \$_[0];
+ shift;
+ my $size = shift || croak 'write($buf,$size,[$timeout])';
+ my $timeout = @_ ? shift: $data->timeout;
+
+ # If the remote server has closed the connection we will be signal'd
+ # when we write. This can happen if the disk on the remote server fills up
+
+ local $SIG{PIPE} = 'IGNORE'
+ unless ($SIG{PIPE} || '') eq 'IGNORE'
+ or $^O eq 'MacOS';
+ my $sent = $size;
+ my $off = 0;
+
+ my $blksize = ${*$data}{'net_ftp_blksize'};
+ while ($sent > 0) {
+ $data->can_write($timeout)
+ or croak "Timeout";
+
+ my $n = syswrite($data, $buf, $sent > $blksize ? $blksize : $sent, $off);
+ return undef unless defined($n);
+ $sent -= $n;
+ $off += $n;
+ }
+
+ $size;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/FTP/L.pm b/Master/tlpkg/tlperl.straw/lib/Net/FTP/L.pm
new file mode 100755
index 00000000000..f7423cb9f95
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/FTP/L.pm
@@ -0,0 +1,8 @@
+package Net::FTP::L;
+
+require Net::FTP::I;
+
+@ISA = qw(Net::FTP::I);
+$VERSION = "0.01";
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/FTP/dataconn.pm b/Master/tlpkg/tlperl.straw/lib/Net/FTP/dataconn.pm
new file mode 100755
index 00000000000..e7645cbd930
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/FTP/dataconn.pm
@@ -0,0 +1,124 @@
+##
+## Generic data connection package
+##
+
+package Net::FTP::dataconn;
+
+use Carp;
+use vars qw(@ISA $timeout $VERSION);
+use Net::Cmd;
+use Errno;
+
+$VERSION = '0.11';
+@ISA = qw(IO::Socket::INET);
+
+
+sub reading {
+ my $data = shift;
+ ${*$data}{'net_ftp_bytesread'} = 0;
+}
+
+
+sub abort {
+ my $data = shift;
+ my $ftp = ${*$data}{'net_ftp_cmd'};
+
+ # no need to abort if we have finished the xfer
+ return $data->close
+ if ${*$data}{'net_ftp_eof'};
+
+ # for some reason if we continously open RETR connections and not
+ # read a single byte, then abort them after a while the server will
+ # close our connection, this prevents the unexpected EOF on the
+ # command channel -- GMB
+ if (exists ${*$data}{'net_ftp_bytesread'}
+ && (${*$data}{'net_ftp_bytesread'} == 0))
+ {
+ my $buf = "";
+ my $timeout = $data->timeout;
+ $data->can_read($timeout) && sysread($data, $buf, 1);
+ }
+
+ ${*$data}{'net_ftp_eof'} = 1; # fake
+
+ $ftp->abort; # this will close me
+}
+
+
+sub _close {
+ my $data = shift;
+ my $ftp = ${*$data}{'net_ftp_cmd'};
+
+ $data->SUPER::close();
+
+ delete ${*$ftp}{'net_ftp_dataconn'}
+ if exists ${*$ftp}{'net_ftp_dataconn'}
+ && $data == ${*$ftp}{'net_ftp_dataconn'};
+}
+
+
+sub close {
+ my $data = shift;
+ my $ftp = ${*$data}{'net_ftp_cmd'};
+
+ if (exists ${*$data}{'net_ftp_bytesread'} && !${*$data}{'net_ftp_eof'}) {
+ my $junk;
+ $data->read($junk, 1, 0);
+ return $data->abort unless ${*$data}{'net_ftp_eof'};
+ }
+
+ $data->_close;
+
+ $ftp->response() == CMD_OK
+ && $ftp->message =~ /unique file name:\s*(\S*)\s*\)/
+ && (${*$ftp}{'net_ftp_unique'} = $1);
+
+ $ftp->status == CMD_OK;
+}
+
+
+sub _select {
+ my ($data, $timeout, $do_read) = @_;
+ my ($rin, $rout, $win, $wout, $tout, $nfound);
+
+ vec($rin = '', fileno($data), 1) = 1;
+
+ ($win, $rin) = ($rin, $win) unless $do_read;
+
+ while (1) {
+ $nfound = select($rout = $rin, $wout = $win, undef, $tout = $timeout);
+
+ last if $nfound >= 0;
+
+ croak "select: $!"
+ unless $!{EINTR};
+ }
+
+ $nfound;
+}
+
+
+sub can_read {
+ _select(@_[0, 1], 1);
+}
+
+
+sub can_write {
+ _select(@_[0, 1], 0);
+}
+
+
+sub cmd {
+ my $ftp = shift;
+
+ ${*$ftp}{'net_ftp_cmd'};
+}
+
+
+sub bytes_read {
+ my $ftp = shift;
+
+ ${*$ftp}{'net_ftp_bytesread'} || 0;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/HTTP.pm b/Master/tlpkg/tlperl.straw/lib/Net/HTTP.pm
new file mode 100755
index 00000000000..120de285f71
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/HTTP.pm
@@ -0,0 +1,279 @@
+package Net::HTTP;
+
+use strict;
+use vars qw($VERSION @ISA $SOCKET_CLASS);
+
+$VERSION = "5.834";
+unless ($SOCKET_CLASS) {
+ eval { require IO::Socket::INET } || require IO::Socket;
+ $SOCKET_CLASS = "IO::Socket::INET";
+}
+require Net::HTTP::Methods;
+require Carp;
+
+@ISA = ($SOCKET_CLASS, 'Net::HTTP::Methods');
+
+sub new {
+ my $class = shift;
+ Carp::croak("No Host option provided") unless @_;
+ $class->SUPER::new(@_);
+}
+
+sub configure {
+ my($self, $cnf) = @_;
+ $self->http_configure($cnf);
+}
+
+sub http_connect {
+ my($self, $cnf) = @_;
+ $self->SUPER::configure($cnf);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::HTTP - Low-level HTTP connection (client)
+
+=head1 SYNOPSIS
+
+ use Net::HTTP;
+ my $s = Net::HTTP->new(Host => "www.perl.com") || die $@;
+ $s->write_request(GET => "/", 'User-Agent' => "Mozilla/5.0");
+ my($code, $mess, %h) = $s->read_response_headers;
+
+ while (1) {
+ my $buf;
+ my $n = $s->read_entity_body($buf, 1024);
+ die "read failed: $!" unless defined $n;
+ last unless $n;
+ print $buf;
+ }
+
+=head1 DESCRIPTION
+
+The C<Net::HTTP> class is a low-level HTTP client. An instance of the
+C<Net::HTTP> class represents a connection to an HTTP server. The
+HTTP protocol is described in RFC 2616. The C<Net::HTTP> class
+supports C<HTTP/1.0> and C<HTTP/1.1>.
+
+C<Net::HTTP> is a sub-class of C<IO::Socket::INET>. You can mix the
+methods described below with reading and writing from the socket
+directly. This is not necessary a good idea, unless you know what you
+are doing.
+
+The following methods are provided (in addition to those of
+C<IO::Socket::INET>):
+
+=over
+
+=item $s = Net::HTTP->new( %options )
+
+The C<Net::HTTP> constructor method takes the same options as
+C<IO::Socket::INET>'s as well as these:
+
+ Host: Initial host attribute value
+ KeepAlive: Initial keep_alive attribute value
+ SendTE: Initial send_te attribute_value
+ HTTPVersion: Initial http_version attribute value
+ PeerHTTPVersion: Initial peer_http_version attribute value
+ MaxLineLength: Initial max_line_length attribute value
+ MaxHeaderLines: Initial max_header_lines attribute value
+
+The C<Host> option is also the default for C<IO::Socket::INET>'s
+C<PeerAddr>. The C<PeerPort> defaults to 80 if not provided.
+
+The C<Listen> option provided by C<IO::Socket::INET>'s constructor
+method is not allowed.
+
+If unable to connect to the given HTTP server then the constructor
+returns C<undef> and $@ contains the reason. After a successful
+connect, a C<Net:HTTP> object is returned.
+
+=item $s->host
+
+Get/set the default value of the C<Host> header to send. The $host
+must not be set to an empty string (or C<undef>) for HTTP/1.1.
+
+=item $s->keep_alive
+
+Get/set the I<keep-alive> value. If this value is TRUE then the
+request will be sent with headers indicating that the server should try
+to keep the connection open so that multiple requests can be sent.
+
+The actual headers set will depend on the value of the C<http_version>
+and C<peer_http_version> attributes.
+
+=item $s->send_te
+
+Get/set the a value indicating if the request will be sent with a "TE"
+header to indicate the transfer encodings that the server can choose to
+use. The list of encodings announced as accepted by this client depends
+on availability of the following modules: C<Compress::Raw::Zlib> for
+I<deflate>, and C<IO::Compress::Gunzip> for I<gzip>.
+
+=item $s->http_version
+
+Get/set the HTTP version number that this client should announce.
+This value can only be set to "1.0" or "1.1". The default is "1.1".
+
+=item $s->peer_http_version
+
+Get/set the protocol version number of our peer. This value will
+initially be "1.0", but will be updated by a successful
+read_response_headers() method call.
+
+=item $s->max_line_length
+
+Get/set a limit on the length of response line and response header
+lines. The default is 8192. A value of 0 means no limit.
+
+=item $s->max_header_length
+
+Get/set a limit on the number of header lines that a response can
+have. The default is 128. A value of 0 means no limit.
+
+=item $s->format_request($method, $uri, %headers, [$content])
+
+Format a request message and return it as a string. If the headers do
+not include a C<Host> header, then a header is inserted with the value
+of the C<host> attribute. Headers like C<Connection> and
+C<Keep-Alive> might also be added depending on the status of the
+C<keep_alive> attribute.
+
+If $content is given (and it is non-empty), then a C<Content-Length>
+header is automatically added unless it was already present.
+
+=item $s->write_request($method, $uri, %headers, [$content])
+
+Format and send a request message. Arguments are the same as for
+format_request(). Returns true if successful.
+
+=item $s->format_chunk( $data )
+
+Returns the string to be written for the given chunk of data.
+
+=item $s->write_chunk($data)
+
+Will write a new chunk of request entity body data. This method
+should only be used if the C<Transfer-Encoding> header with a value of
+C<chunked> was sent in the request. Note, writing zero-length data is
+a no-op. Use the write_chunk_eof() method to signal end of entity
+body data.
+
+Returns true if successful.
+
+=item $s->format_chunk_eof( %trailers )
+
+Returns the string to be written for signaling EOF when a
+C<Transfer-Encoding> of C<chunked> is used.
+
+=item $s->write_chunk_eof( %trailers )
+
+Will write eof marker for chunked data and optional trailers. Note
+that trailers should not really be used unless is was signaled
+with a C<Trailer> header.
+
+Returns true if successful.
+
+=item ($code, $mess, %headers) = $s->read_response_headers( %opts )
+
+Read response headers from server and return it. The $code is the 3
+digit HTTP status code (see L<HTTP::Status>) and $mess is the textual
+message that came with it. Headers are then returned as key/value
+pairs. Since key letter casing is not normalized and the same key can
+even occur multiple times, assigning these values directly to a hash
+is not wise. Only the $code is returned if this method is called in
+scalar context.
+
+As a side effect this method updates the 'peer_http_version'
+attribute.
+
+Options might be passed in as key/value pairs. There are currently
+only two options supported; C<laxed> and C<junk_out>.
+
+The C<laxed> option will make read_response_headers() more forgiving
+towards servers that have not learned how to speak HTTP properly. The
+C<laxed> option is a boolean flag, and is enabled by passing in a TRUE
+value. The C<junk_out> option can be used to capture bad header lines
+when C<laxed> is enabled. The value should be an array reference.
+Bad header lines will be pushed onto the array.
+
+The C<laxed> option must be specified in order to communicate with
+pre-HTTP/1.0 servers that don't describe the response outcome or the
+data they send back with a header block. For these servers
+peer_http_version is set to "0.9" and this method returns (200,
+"Assumed OK").
+
+The method will raise an exception (die) if the server does not speak
+proper HTTP or if the C<max_line_length> or C<max_header_length>
+limits are reached. If the C<laxed> option is turned on and
+C<max_line_length> and C<max_header_length> checks are turned off,
+then no exception will be raised and this method will always
+return a response code.
+
+=item $n = $s->read_entity_body($buf, $size);
+
+Reads chunks of the entity body content. Basically the same interface
+as for read() and sysread(), but the buffer offset argument is not
+supported yet. This method should only be called after a successful
+read_response_headers() call.
+
+The return value will be C<undef> on read errors, 0 on EOF, -1 if no data
+could be returned this time, otherwise the number of bytes assigned
+to $buf. The $buf is set to "" when the return value is -1.
+
+You normally want to retry this call if this function returns either
+-1 or C<undef> with C<$!> as EINTR or EAGAIN (see L<Errno>). EINTR
+can happen if the application catches signals and EAGAIN can happen if
+you made the socket non-blocking.
+
+This method will raise exceptions (die) if the server does not speak
+proper HTTP. This can only happen when reading chunked data.
+
+=item %headers = $s->get_trailers
+
+After read_entity_body() has returned 0 to indicate end of the entity
+body, you might call this method to pick up any trailers.
+
+=item $s->_rbuf
+
+Get/set the read buffer content. The read_response_headers() and
+read_entity_body() methods use an internal buffer which they will look
+for data before they actually sysread more from the socket itself. If
+they read too much, the remaining data will be left in this buffer.
+
+=item $s->_rbuf_length
+
+Returns the number of bytes in the read buffer. This should always be
+the same as:
+
+ length($s->_rbuf)
+
+but might be more efficient.
+
+=back
+
+=head1 SUBCLASSING
+
+The read_response_headers() and read_entity_body() will invoke the
+sysread() method when they need more data. Subclasses might want to
+override this method to control how reading takes place.
+
+The object itself is a glob. Subclasses should avoid using hash key
+names prefixed with C<http_> and C<io_>.
+
+=head1 SEE ALSO
+
+L<LWP>, L<IO::Socket::INET>, L<Net::HTTP::NB>
+
+=head1 COPYRIGHT
+
+Copyright 2001-2003 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/HTTP/Methods.pm b/Master/tlpkg/tlperl.straw/lib/Net/HTTP/Methods.pm
new file mode 100755
index 00000000000..22cc272b47e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/HTTP/Methods.pm
@@ -0,0 +1,593 @@
+package Net::HTTP::Methods;
+
+require 5.005; # 4-arg substr
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = "5.834";
+
+my $CRLF = "\015\012"; # "\r\n" is not portable
+
+*_bytes = defined(&utf8::downgrade) ?
+ sub {
+ unless (utf8::downgrade($_[0], 1)) {
+ require Carp;
+ Carp::croak("Wide character in HTTP request (bytes required)");
+ }
+ return $_[0];
+ }
+ :
+ sub {
+ return $_[0];
+ };
+
+
+sub new {
+ my $class = shift;
+ unshift(@_, "Host") if @_ == 1;
+ my %cnf = @_;
+ require Symbol;
+ my $self = bless Symbol::gensym(), $class;
+ return $self->http_configure(\%cnf);
+}
+
+sub http_configure {
+ my($self, $cnf) = @_;
+
+ die "Listen option not allowed" if $cnf->{Listen};
+ my $explict_host = (exists $cnf->{Host});
+ my $host = delete $cnf->{Host};
+ my $peer = $cnf->{PeerAddr} || $cnf->{PeerHost};
+ if (!$peer) {
+ die "No Host option provided" unless $host;
+ $cnf->{PeerAddr} = $peer = $host;
+ }
+
+ if ($peer =~ s,:(\d+)$,,) {
+ $cnf->{PeerPort} = int($1); # always override
+ }
+ if (!$cnf->{PeerPort}) {
+ $cnf->{PeerPort} = $self->http_default_port;
+ }
+
+ if (!$explict_host) {
+ $host = $peer;
+ $host =~ s/:.*//;
+ }
+ if ($host && $host !~ /:/) {
+ my $p = $cnf->{PeerPort};
+ $host .= ":$p" if $p != $self->http_default_port;
+ }
+
+ $cnf->{Proto} = 'tcp';
+
+ my $keep_alive = delete $cnf->{KeepAlive};
+ my $http_version = delete $cnf->{HTTPVersion};
+ $http_version = "1.1" unless defined $http_version;
+ my $peer_http_version = delete $cnf->{PeerHTTPVersion};
+ $peer_http_version = "1.0" unless defined $peer_http_version;
+ my $send_te = delete $cnf->{SendTE};
+ my $max_line_length = delete $cnf->{MaxLineLength};
+ $max_line_length = 8*1024 unless defined $max_line_length;
+ my $max_header_lines = delete $cnf->{MaxHeaderLines};
+ $max_header_lines = 128 unless defined $max_header_lines;
+
+ return undef unless $self->http_connect($cnf);
+
+ $self->host($host);
+ $self->keep_alive($keep_alive);
+ $self->send_te($send_te);
+ $self->http_version($http_version);
+ $self->peer_http_version($peer_http_version);
+ $self->max_line_length($max_line_length);
+ $self->max_header_lines($max_header_lines);
+
+ ${*$self}{'http_buf'} = "";
+
+ return $self;
+}
+
+sub http_default_port {
+ 80;
+}
+
+# set up property accessors
+for my $method (qw(host keep_alive send_te max_line_length max_header_lines peer_http_version)) {
+ my $prop_name = "http_" . $method;
+ no strict 'refs';
+ *$method = sub {
+ my $self = shift;
+ my $old = ${*$self}{$prop_name};
+ ${*$self}{$prop_name} = shift if @_;
+ return $old;
+ };
+}
+
+# we want this one to be a bit smarter
+sub http_version {
+ my $self = shift;
+ my $old = ${*$self}{'http_version'};
+ if (@_) {
+ my $v = shift;
+ $v = "1.0" if $v eq "1"; # float
+ unless ($v eq "1.0" or $v eq "1.1") {
+ require Carp;
+ Carp::croak("Unsupported HTTP version '$v'");
+ }
+ ${*$self}{'http_version'} = $v;
+ }
+ $old;
+}
+
+sub format_request {
+ my $self = shift;
+ my $method = shift;
+ my $uri = shift;
+
+ my $content = (@_ % 2) ? pop : "";
+
+ for ($method, $uri) {
+ require Carp;
+ Carp::croak("Bad method or uri") if /\s/ || !length;
+ }
+
+ push(@{${*$self}{'http_request_method'}}, $method);
+ my $ver = ${*$self}{'http_version'};
+ my $peer_ver = ${*$self}{'http_peer_http_version'} || "1.0";
+
+ my @h;
+ my @connection;
+ my %given = (host => 0, "content-length" => 0, "te" => 0);
+ while (@_) {
+ my($k, $v) = splice(@_, 0, 2);
+ my $lc_k = lc($k);
+ if ($lc_k eq "connection") {
+ $v =~ s/^\s+//;
+ $v =~ s/\s+$//;
+ push(@connection, split(/\s*,\s*/, $v));
+ next;
+ }
+ if (exists $given{$lc_k}) {
+ $given{$lc_k}++;
+ }
+ push(@h, "$k: $v");
+ }
+
+ if (length($content) && !$given{'content-length'}) {
+ push(@h, "Content-Length: " . length($content));
+ }
+
+ my @h2;
+ if ($given{te}) {
+ push(@connection, "TE") unless grep lc($_) eq "te", @connection;
+ }
+ elsif ($self->send_te && gunzip_ok()) {
+ # gzip is less wanted since the IO::Uncompress::Gunzip interface for
+ # it does not really allow chunked decoding to take place easily.
+ push(@h2, "TE: deflate,gzip;q=0.3");
+ push(@connection, "TE");
+ }
+
+ unless (grep lc($_) eq "close", @connection) {
+ if ($self->keep_alive) {
+ if ($peer_ver eq "1.0") {
+ # from looking at Netscape's headers
+ push(@h2, "Keep-Alive: 300");
+ unshift(@connection, "Keep-Alive");
+ }
+ }
+ else {
+ push(@connection, "close") if $ver ge "1.1";
+ }
+ }
+ push(@h2, "Connection: " . join(", ", @connection)) if @connection;
+ unless ($given{host}) {
+ my $h = ${*$self}{'http_host'};
+ push(@h2, "Host: $h") if $h;
+ }
+
+ return _bytes(join($CRLF, "$method $uri HTTP/$ver", @h2, @h, "", $content));
+}
+
+
+sub write_request {
+ my $self = shift;
+ $self->print($self->format_request(@_));
+}
+
+sub format_chunk {
+ my $self = shift;
+ return $_[0] unless defined($_[0]) && length($_[0]);
+ return _bytes(sprintf("%x", length($_[0])) . $CRLF . $_[0] . $CRLF);
+}
+
+sub write_chunk {
+ my $self = shift;
+ return 1 unless defined($_[0]) && length($_[0]);
+ $self->print(_bytes(sprintf("%x", length($_[0])) . $CRLF . $_[0] . $CRLF));
+}
+
+sub format_chunk_eof {
+ my $self = shift;
+ my @h;
+ while (@_) {
+ push(@h, sprintf "%s: %s$CRLF", splice(@_, 0, 2));
+ }
+ return _bytes(join("", "0$CRLF", @h, $CRLF));
+}
+
+sub write_chunk_eof {
+ my $self = shift;
+ $self->print($self->format_chunk_eof(@_));
+}
+
+
+sub my_read {
+ die if @_ > 3;
+ my $self = shift;
+ my $len = $_[1];
+ for (${*$self}{'http_buf'}) {
+ if (length) {
+ $_[0] = substr($_, 0, $len, "");
+ return length($_[0]);
+ }
+ else {
+ return $self->sysread($_[0], $len);
+ }
+ }
+}
+
+
+sub my_readline {
+ my $self = shift;
+ my $what = shift;
+ for (${*$self}{'http_buf'}) {
+ my $max_line_length = ${*$self}{'http_max_line_length'};
+ my $pos;
+ while (1) {
+ # find line ending
+ $pos = index($_, "\012");
+ last if $pos >= 0;
+ die "$what line too long (limit is $max_line_length)"
+ if $max_line_length && length($_) > $max_line_length;
+
+ # need to read more data to find a line ending
+ READ:
+ {
+ my $n = $self->sysread($_, 1024, length);
+ unless (defined $n) {
+ redo READ if $!{EINTR};
+ if ($!{EAGAIN}) {
+ # Hmm, we must be reading from a non-blocking socket
+ # XXX Should really wait until this socket is readable,...
+ select(undef, undef, undef, 0.1); # but this will do for now
+ redo READ;
+ }
+ # if we have already accumulated some data let's at least
+ # return that as a line
+ die "$what read failed: $!" unless length;
+ }
+ unless ($n) {
+ return undef unless length;
+ return substr($_, 0, length, "");
+ }
+ }
+ }
+ die "$what line too long ($pos; limit is $max_line_length)"
+ if $max_line_length && $pos > $max_line_length;
+
+ my $line = substr($_, 0, $pos+1, "");
+ $line =~ s/(\015?\012)\z// || die "Assert";
+ return wantarray ? ($line, $1) : $line;
+ }
+}
+
+
+sub _rbuf {
+ my $self = shift;
+ if (@_) {
+ for (${*$self}{'http_buf'}) {
+ my $old;
+ $old = $_ if defined wantarray;
+ $_ = shift;
+ return $old;
+ }
+ }
+ else {
+ return ${*$self}{'http_buf'};
+ }
+}
+
+sub _rbuf_length {
+ my $self = shift;
+ return length ${*$self}{'http_buf'};
+}
+
+
+sub _read_header_lines {
+ my $self = shift;
+ my $junk_out = shift;
+
+ my @headers;
+ my $line_count = 0;
+ my $max_header_lines = ${*$self}{'http_max_header_lines'};
+ while (my $line = my_readline($self, 'Header')) {
+ if ($line =~ /^(\S+?)\s*:\s*(.*)/s) {
+ push(@headers, $1, $2);
+ }
+ elsif (@headers && $line =~ s/^\s+//) {
+ $headers[-1] .= " " . $line;
+ }
+ elsif ($junk_out) {
+ push(@$junk_out, $line);
+ }
+ else {
+ die "Bad header: '$line'\n";
+ }
+ if ($max_header_lines) {
+ $line_count++;
+ if ($line_count >= $max_header_lines) {
+ die "Too many header lines (limit is $max_header_lines)";
+ }
+ }
+ }
+ return @headers;
+}
+
+
+sub read_response_headers {
+ my($self, %opt) = @_;
+ my $laxed = $opt{laxed};
+
+ my($status, $eol) = my_readline($self, 'Status');
+ unless (defined $status) {
+ die "Server closed connection without sending any data back";
+ }
+
+ my($peer_ver, $code, $message) = split(/\s+/, $status, 3);
+ if (!$peer_ver || $peer_ver !~ s,^HTTP/,, || $code !~ /^[1-5]\d\d$/) {
+ die "Bad response status line: '$status'" unless $laxed;
+ # assume HTTP/0.9
+ ${*$self}{'http_peer_http_version'} = "0.9";
+ ${*$self}{'http_status'} = "200";
+ substr(${*$self}{'http_buf'}, 0, 0) = $status . ($eol || "");
+ return 200 unless wantarray;
+ return (200, "Assumed OK");
+ };
+
+ ${*$self}{'http_peer_http_version'} = $peer_ver;
+ ${*$self}{'http_status'} = $code;
+
+ my $junk_out;
+ if ($laxed) {
+ $junk_out = $opt{junk_out} || [];
+ }
+ my @headers = $self->_read_header_lines($junk_out);
+
+ # pick out headers that read_entity_body might need
+ my @te;
+ my $content_length;
+ for (my $i = 0; $i < @headers; $i += 2) {
+ my $h = lc($headers[$i]);
+ if ($h eq 'transfer-encoding') {
+ my $te = $headers[$i+1];
+ $te =~ s/^\s+//;
+ $te =~ s/\s+$//;
+ push(@te, $te) if length($te);
+ }
+ elsif ($h eq 'content-length') {
+ # ignore bogus and overflow values
+ if ($headers[$i+1] =~ /^\s*(\d{1,15})(?:\s|$)/) {
+ $content_length = $1;
+ }
+ }
+ }
+ ${*$self}{'http_te'} = join(",", @te);
+ ${*$self}{'http_content_length'} = $content_length;
+ ${*$self}{'http_first_body'}++;
+ delete ${*$self}{'http_trailers'};
+ return $code unless wantarray;
+ return ($code, $message, @headers);
+}
+
+
+sub read_entity_body {
+ my $self = shift;
+ my $buf_ref = \$_[0];
+ my $size = $_[1];
+ die "Offset not supported yet" if $_[2];
+
+ my $chunked;
+ my $bytes;
+
+ if (${*$self}{'http_first_body'}) {
+ ${*$self}{'http_first_body'} = 0;
+ delete ${*$self}{'http_chunked'};
+ delete ${*$self}{'http_bytes'};
+ my $method = shift(@{${*$self}{'http_request_method'}});
+ my $status = ${*$self}{'http_status'};
+ if ($method eq "HEAD") {
+ # this response is always empty regardless of other headers
+ $bytes = 0;
+ }
+ elsif (my $te = ${*$self}{'http_te'}) {
+ my @te = split(/\s*,\s*/, lc($te));
+ die "Chunked must be last Transfer-Encoding '$te'"
+ unless pop(@te) eq "chunked";
+
+ for (@te) {
+ if ($_ eq "deflate" && inflate_ok()) {
+ #require Compress::Raw::Zlib;
+ my ($i, $status) = Compress::Raw::Zlib::Inflate->new();
+ die "Can't make inflator: $status" unless $i;
+ $_ = sub { my $out; $i->inflate($_[0], \$out); $out }
+ }
+ elsif ($_ eq "gzip" && gunzip_ok()) {
+ #require IO::Uncompress::Gunzip;
+ my @buf;
+ $_ = sub {
+ push(@buf, $_[0]);
+ return "" unless $_[1];
+ my $input = join("", @buf);
+ my $output;
+ IO::Uncompress::Gunzip::gunzip(\$input, \$output, Transparent => 0)
+ or die "Can't gunzip content: $IO::Uncompress::Gunzip::GunzipError";
+ return \$output;
+ };
+ }
+ elsif ($_ eq "identity") {
+ $_ = sub { $_[0] };
+ }
+ else {
+ die "Can't handle transfer encoding '$te'";
+ }
+ }
+
+ @te = reverse(@te);
+
+ ${*$self}{'http_te2'} = @te ? \@te : "";
+ $chunked = -1;
+ }
+ elsif (defined(my $content_length = ${*$self}{'http_content_length'})) {
+ $bytes = $content_length;
+ }
+ elsif ($status =~ /^(?:1|[23]04)/) {
+ # RFC 2616 says that these responses should always be empty
+ # but that does not appear to be true in practice [RT#17907]
+ $bytes = 0;
+ }
+ else {
+ # XXX Multi-Part types are self delimiting, but RFC 2616 says we
+ # only has to deal with 'multipart/byteranges'
+
+ # Read until EOF
+ }
+ }
+ else {
+ $chunked = ${*$self}{'http_chunked'};
+ $bytes = ${*$self}{'http_bytes'};
+ }
+
+ if (defined $chunked) {
+ # The state encoded in $chunked is:
+ # $chunked == 0: read CRLF after chunk, then chunk header
+ # $chunked == -1: read chunk header
+ # $chunked > 0: bytes left in current chunk to read
+
+ if ($chunked <= 0) {
+ my $line = my_readline($self, 'Entity body');
+ if ($chunked == 0) {
+ die "Missing newline after chunk data: '$line'"
+ if !defined($line) || $line ne "";
+ $line = my_readline($self, 'Entity body');
+ }
+ die "EOF when chunk header expected" unless defined($line);
+ my $chunk_len = $line;
+ $chunk_len =~ s/;.*//; # ignore potential chunk parameters
+ unless ($chunk_len =~ /^([\da-fA-F]+)\s*$/) {
+ die "Bad chunk-size in HTTP response: $line";
+ }
+ $chunked = hex($1);
+ if ($chunked == 0) {
+ ${*$self}{'http_trailers'} = [$self->_read_header_lines];
+ $$buf_ref = "";
+
+ my $n = 0;
+ if (my $transforms = delete ${*$self}{'http_te2'}) {
+ for (@$transforms) {
+ $$buf_ref = &$_($$buf_ref, 1);
+ }
+ $n = length($$buf_ref);
+ }
+
+ # in case somebody tries to read more, make sure we continue
+ # to return EOF
+ delete ${*$self}{'http_chunked'};
+ ${*$self}{'http_bytes'} = 0;
+
+ return $n;
+ }
+ }
+
+ my $n = $chunked;
+ $n = $size if $size && $size < $n;
+ $n = my_read($self, $$buf_ref, $n);
+ return undef unless defined $n;
+
+ ${*$self}{'http_chunked'} = $chunked - $n;
+
+ if ($n > 0) {
+ if (my $transforms = ${*$self}{'http_te2'}) {
+ for (@$transforms) {
+ $$buf_ref = &$_($$buf_ref, 0);
+ }
+ $n = length($$buf_ref);
+ $n = -1 if $n == 0;
+ }
+ }
+ return $n;
+ }
+ elsif (defined $bytes) {
+ unless ($bytes) {
+ $$buf_ref = "";
+ return 0;
+ }
+ my $n = $bytes;
+ $n = $size if $size && $size < $n;
+ $n = my_read($self, $$buf_ref, $n);
+ return undef unless defined $n;
+ ${*$self}{'http_bytes'} = $bytes - $n;
+ return $n;
+ }
+ else {
+ # read until eof
+ $size ||= 8*1024;
+ return my_read($self, $$buf_ref, $size);
+ }
+}
+
+sub get_trailers {
+ my $self = shift;
+ @{${*$self}{'http_trailers'} || []};
+}
+
+BEGIN {
+my $gunzip_ok;
+my $inflate_ok;
+
+sub gunzip_ok {
+ return $gunzip_ok if defined $gunzip_ok;
+
+ # Try to load IO::Uncompress::Gunzip.
+ local $@;
+ local $SIG{__DIE__};
+ $gunzip_ok = 0;
+
+ eval {
+ require IO::Uncompress::Gunzip;
+ $gunzip_ok++;
+ };
+
+ return $gunzip_ok;
+}
+
+sub inflate_ok {
+ return $inflate_ok if defined $inflate_ok;
+
+ # Try to load Compress::Raw::Zlib.
+ local $@;
+ local $SIG{__DIE__};
+ $inflate_ok = 0;
+
+ eval {
+ require Compress::Raw::Zlib;
+ $inflate_ok++;
+ };
+
+ return $inflate_ok;
+}
+
+} # BEGIN
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/HTTP/NB.pm b/Master/tlpkg/tlperl.straw/lib/Net/HTTP/NB.pm
new file mode 100755
index 00000000000..e4145116f6a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/HTTP/NB.pm
@@ -0,0 +1,105 @@
+package Net::HTTP::NB;
+
+use strict;
+use vars qw($VERSION @ISA);
+
+$VERSION = "5.810";
+
+require Net::HTTP;
+@ISA=qw(Net::HTTP);
+
+sub sysread {
+ my $self = $_[0];
+ if (${*$self}{'httpnb_read_count'}++) {
+ ${*$self}{'http_buf'} = ${*$self}{'httpnb_save'};
+ die "Multi-read\n";
+ }
+ my $buf;
+ my $offset = $_[3] || 0;
+ my $n = sysread($self, $_[1], $_[2], $offset);
+ ${*$self}{'httpnb_save'} .= substr($_[1], $offset);
+ return $n;
+}
+
+sub read_response_headers {
+ my $self = shift;
+ ${*$self}{'httpnb_read_count'} = 0;
+ ${*$self}{'httpnb_save'} = ${*$self}{'http_buf'};
+ my @h = eval { $self->SUPER::read_response_headers(@_) };
+ if ($@) {
+ return if $@ eq "Multi-read\n";
+ die;
+ }
+ return @h;
+}
+
+sub read_entity_body {
+ my $self = shift;
+ ${*$self}{'httpnb_read_count'} = 0;
+ ${*$self}{'httpnb_save'} = ${*$self}{'http_buf'};
+ # XXX I'm not so sure this does the correct thing in case of
+ # transfer-encoding tranforms
+ my $n = eval { $self->SUPER::read_entity_body(@_); };
+ if ($@) {
+ $_[0] = "";
+ return -1;
+ }
+ return $n;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::HTTP::NB - Non-blocking HTTP client
+
+=head1 SYNOPSIS
+
+ use Net::HTTP::NB;
+ my $s = Net::HTTP::NB->new(Host => "www.perl.com") || die $@;
+ $s->write_request(GET => "/");
+
+ use IO::Select;
+ my $sel = IO::Select->new($s);
+
+ READ_HEADER: {
+ die "Header timeout" unless $sel->can_read(10);
+ my($code, $mess, %h) = $s->read_response_headers;
+ redo READ_HEADER unless $code;
+ }
+
+ while (1) {
+ die "Body timeout" unless $sel->can_read(10);
+ my $buf;
+ my $n = $s->read_entity_body($buf, 1024);
+ last unless $n;
+ print $buf;
+ }
+
+=head1 DESCRIPTION
+
+Same interface as C<Net::HTTP> but it will never try multiple reads
+when the read_response_headers() or read_entity_body() methods are
+invoked. This make it possible to multiplex multiple Net::HTTP::NB
+using select without risk blocking.
+
+If read_response_headers() did not see enough data to complete the
+headers an empty list is returned.
+
+If read_entity_body() did not see new entity data in its read
+the value -1 is returned.
+
+=head1 SEE ALSO
+
+L<Net::HTTP>
+
+=head1 COPYRIGHT
+
+Copyright 2001 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/HTTPS.pm b/Master/tlpkg/tlperl.straw/lib/Net/HTTPS.pm
new file mode 100755
index 00000000000..bfed714870c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/HTTPS.pm
@@ -0,0 +1,59 @@
+package Net::HTTPS;
+
+use strict;
+use vars qw($VERSION $SSL_SOCKET_CLASS @ISA);
+
+$VERSION = "5.819";
+
+# Figure out which SSL implementation to use
+if ($SSL_SOCKET_CLASS) {
+ # somebody already set it
+}
+elsif ($Net::SSL::VERSION) {
+ $SSL_SOCKET_CLASS = "Net::SSL";
+}
+elsif ($IO::Socket::SSL::VERSION) {
+ $SSL_SOCKET_CLASS = "IO::Socket::SSL"; # it was already loaded
+}
+else {
+ eval { require Net::SSL; }; # from Crypt-SSLeay
+ if ($@) {
+ my $old_errsv = $@;
+ eval {
+ require IO::Socket::SSL;
+ };
+ if ($@) {
+ $old_errsv =~ s/\s\(\@INC contains:.*\)/)/g;
+ die $old_errsv . $@;
+ }
+ $SSL_SOCKET_CLASS = "IO::Socket::SSL";
+ }
+ else {
+ $SSL_SOCKET_CLASS = "Net::SSL";
+ }
+}
+
+require Net::HTTP::Methods;
+
+@ISA=($SSL_SOCKET_CLASS, 'Net::HTTP::Methods');
+
+sub configure {
+ my($self, $cnf) = @_;
+ $self->http_configure($cnf);
+}
+
+sub http_connect {
+ my($self, $cnf) = @_;
+ $self->SUPER::configure($cnf);
+}
+
+sub http_default_port {
+ 443;
+}
+
+# The underlying SSLeay classes fails to work if the socket is
+# placed in non-blocking mode. This override of the blocking
+# method makes sure it stays the way it was created.
+sub blocking { } # noop
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/Hostname.pm.eg b/Master/tlpkg/tlperl.straw/lib/Net/Hostname.pm.eg
new file mode 100755
index 00000000000..4736c1a6ef2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/Hostname.pm.eg
@@ -0,0 +1,14 @@
+#
+
+package Sys::Hostname;
+
+use Net::Domain qw(hostname);
+use Carp;
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(hostname);
+
+carp "deprecated package 'Sys::Hostname', use Net::Domain" if $^W;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/NNTP.pm b/Master/tlpkg/tlperl.straw/lib/Net/NNTP.pm
new file mode 100755
index 00000000000..a742aed04c8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/NNTP.pm
@@ -0,0 +1,1140 @@
+# Net::NNTP.pm
+#
+# Copyright (c) 1995-1997 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::NNTP;
+
+use strict;
+use vars qw(@ISA $VERSION $debug);
+use IO::Socket;
+use Net::Cmd;
+use Carp;
+use Time::Local;
+use Net::Config;
+
+$VERSION = "2.24";
+@ISA = qw(Net::Cmd IO::Socket::INET);
+
+
+sub new {
+ my $self = shift;
+ my $type = ref($self) || $self;
+ my ($host, %arg);
+ if (@_ % 2) {
+ $host = shift;
+ %arg = @_;
+ }
+ else {
+ %arg = @_;
+ $host = delete $arg{Host};
+ }
+ my $obj;
+
+ $host ||= $ENV{NNTPSERVER} || $ENV{NEWSHOST};
+
+ my $hosts = defined $host ? [$host] : $NetConfig{nntp_hosts};
+
+ @{$hosts} = qw(news)
+ unless @{$hosts};
+
+ my $h;
+ foreach $h (@{$hosts}) {
+ $obj = $type->SUPER::new(
+ PeerAddr => ($host = $h),
+ PeerPort => $arg{Port} || 'nntp(119)',
+ Proto => 'tcp',
+ Timeout => defined $arg{Timeout}
+ ? $arg{Timeout}
+ : 120
+ )
+ and last;
+ }
+
+ return undef
+ unless defined $obj;
+
+ ${*$obj}{'net_nntp_host'} = $host;
+
+ $obj->autoflush(1);
+ $obj->debug(exists $arg{Debug} ? $arg{Debug} : undef);
+
+ unless ($obj->response() == CMD_OK) {
+ $obj->close;
+ return undef;
+ }
+
+ my $c = $obj->code;
+ my @m = $obj->message;
+
+ unless (exists $arg{Reader} && $arg{Reader} == 0) {
+
+ # if server is INN and we have transfer rights the we are currently
+ # talking to innd not nnrpd
+ if ($obj->reader) {
+
+ # If reader suceeds the we need to consider this code to determine postok
+ $c = $obj->code;
+ }
+ else {
+
+ # I want to ignore this failure, so restore the previous status.
+ $obj->set_status($c, \@m);
+ }
+ }
+
+ ${*$obj}{'net_nntp_post'} = $c == 200 ? 1 : 0;
+
+ $obj;
+}
+
+
+sub host {
+ my $me = shift;
+ ${*$me}{'net_nntp_host'};
+}
+
+
+sub debug_text {
+ my $nntp = shift;
+ my $inout = shift;
+ my $text = shift;
+
+ if ( (ref($nntp) and $nntp->code == 350 and $text =~ /^(\S+)/)
+ || ($text =~ /^(authinfo\s+pass)/io))
+ {
+ $text = "$1 ....\n";
+ }
+
+ $text;
+}
+
+
+sub postok {
+ @_ == 1 or croak 'usage: $nntp->postok()';
+ my $nntp = shift;
+ ${*$nntp}{'net_nntp_post'} || 0;
+}
+
+
+sub article {
+ @_ >= 1 && @_ <= 3 or croak 'usage: $nntp->article( [ MSGID ], [ FH ] )';
+ my $nntp = shift;
+ my @fh;
+
+ @fh = (pop) if @_ == 2 || (@_ && (ref($_[0]) || ref(\$_[0]) eq 'GLOB'));
+
+ $nntp->_ARTICLE(@_)
+ ? $nntp->read_until_dot(@fh)
+ : undef;
+}
+
+
+sub articlefh {
+ @_ >= 1 && @_ <= 2 or croak 'usage: $nntp->articlefh( [ MSGID ] )';
+ my $nntp = shift;
+
+ return unless $nntp->_ARTICLE(@_);
+ return $nntp->tied_fh;
+}
+
+
+sub authinfo {
+ @_ == 3 or croak 'usage: $nntp->authinfo( USER, PASS )';
+ my ($nntp, $user, $pass) = @_;
+
+ $nntp->_AUTHINFO("USER", $user) == CMD_MORE
+ && $nntp->_AUTHINFO("PASS", $pass) == CMD_OK;
+}
+
+
+sub authinfo_simple {
+ @_ == 3 or croak 'usage: $nntp->authinfo( USER, PASS )';
+ my ($nntp, $user, $pass) = @_;
+
+ $nntp->_AUTHINFO('SIMPLE') == CMD_MORE
+ && $nntp->command($user, $pass)->response == CMD_OK;
+}
+
+
+sub body {
+ @_ >= 1 && @_ <= 3 or croak 'usage: $nntp->body( [ MSGID ], [ FH ] )';
+ my $nntp = shift;
+ my @fh;
+
+ @fh = (pop) if @_ == 2 || (@_ && ref($_[0]) || ref(\$_[0]) eq 'GLOB');
+
+ $nntp->_BODY(@_)
+ ? $nntp->read_until_dot(@fh)
+ : undef;
+}
+
+
+sub bodyfh {
+ @_ >= 1 && @_ <= 2 or croak 'usage: $nntp->bodyfh( [ MSGID ] )';
+ my $nntp = shift;
+ return unless $nntp->_BODY(@_);
+ return $nntp->tied_fh;
+}
+
+
+sub head {
+ @_ >= 1 && @_ <= 3 or croak 'usage: $nntp->head( [ MSGID ], [ FH ] )';
+ my $nntp = shift;
+ my @fh;
+
+ @fh = (pop) if @_ == 2 || (@_ && ref($_[0]) || ref(\$_[0]) eq 'GLOB');
+
+ $nntp->_HEAD(@_)
+ ? $nntp->read_until_dot(@fh)
+ : undef;
+}
+
+
+sub headfh {
+ @_ >= 1 && @_ <= 2 or croak 'usage: $nntp->headfh( [ MSGID ] )';
+ my $nntp = shift;
+ return unless $nntp->_HEAD(@_);
+ return $nntp->tied_fh;
+}
+
+
+sub nntpstat {
+ @_ == 1 || @_ == 2 or croak 'usage: $nntp->nntpstat( [ MSGID ] )';
+ my $nntp = shift;
+
+ $nntp->_STAT(@_) && $nntp->message =~ /(<[^>]+>)/o
+ ? $1
+ : undef;
+}
+
+
+sub group {
+ @_ == 1 || @_ == 2 or croak 'usage: $nntp->group( [ GROUP ] )';
+ my $nntp = shift;
+ my $grp = ${*$nntp}{'net_nntp_group'} || undef;
+
+ return $grp
+ unless (@_ || wantarray);
+
+ my $newgrp = shift;
+
+ return wantarray ? () : undef
+ unless $nntp->_GROUP($newgrp || $grp || "")
+ && $nntp->message =~ /(\d+)\s+(\d+)\s+(\d+)\s+(\S+)/;
+
+ my ($count, $first, $last, $group) = ($1, $2, $3, $4);
+
+ # group may be replied as '(current group)'
+ $group = ${*$nntp}{'net_nntp_group'}
+ if $group =~ /\(/;
+
+ ${*$nntp}{'net_nntp_group'} = $group;
+
+ wantarray
+ ? ($count, $first, $last, $group)
+ : $group;
+}
+
+
+sub help {
+ @_ == 1 or croak 'usage: $nntp->help()';
+ my $nntp = shift;
+
+ $nntp->_HELP
+ ? $nntp->read_until_dot
+ : undef;
+}
+
+
+sub ihave {
+ @_ >= 2 or croak 'usage: $nntp->ihave( MESSAGE-ID [, MESSAGE ])';
+ my $nntp = shift;
+ my $mid = shift;
+
+ $nntp->_IHAVE($mid) && $nntp->datasend(@_)
+ ? @_ == 0 || $nntp->dataend
+ : undef;
+}
+
+
+sub last {
+ @_ == 1 or croak 'usage: $nntp->last()';
+ my $nntp = shift;
+
+ $nntp->_LAST && $nntp->message =~ /(<[^>]+>)/o
+ ? $1
+ : undef;
+}
+
+
+sub list {
+ @_ == 1 or croak 'usage: $nntp->list()';
+ my $nntp = shift;
+
+ $nntp->_LIST
+ ? $nntp->_grouplist
+ : undef;
+}
+
+
+sub newgroups {
+ @_ >= 2 or croak 'usage: $nntp->newgroups( SINCE [, DISTRIBUTIONS ])';
+ my $nntp = shift;
+ my $time = _timestr(shift);
+ my $dist = shift || "";
+
+ $dist = join(",", @{$dist})
+ if ref($dist);
+
+ $nntp->_NEWGROUPS($time, $dist)
+ ? $nntp->_grouplist
+ : undef;
+}
+
+
+sub newnews {
+ @_ >= 2 && @_ <= 4
+ or croak 'usage: $nntp->newnews( SINCE [, GROUPS [, DISTRIBUTIONS ]])';
+ my $nntp = shift;
+ my $time = _timestr(shift);
+ my $grp = @_ ? shift: $nntp->group;
+ my $dist = shift || "";
+
+ $grp ||= "*";
+ $grp = join(",", @{$grp})
+ if ref($grp);
+
+ $dist = join(",", @{$dist})
+ if ref($dist);
+
+ $nntp->_NEWNEWS($grp, $time, $dist)
+ ? $nntp->_articlelist
+ : undef;
+}
+
+
+sub next {
+ @_ == 1 or croak 'usage: $nntp->next()';
+ my $nntp = shift;
+
+ $nntp->_NEXT && $nntp->message =~ /(<[^>]+>)/o
+ ? $1
+ : undef;
+}
+
+
+sub post {
+ @_ >= 1 or croak 'usage: $nntp->post( [ MESSAGE ] )';
+ my $nntp = shift;
+
+ $nntp->_POST() && $nntp->datasend(@_)
+ ? @_ == 0 || $nntp->dataend
+ : undef;
+}
+
+
+sub postfh {
+ my $nntp = shift;
+ return unless $nntp->_POST();
+ return $nntp->tied_fh;
+}
+
+
+sub quit {
+ @_ == 1 or croak 'usage: $nntp->quit()';
+ my $nntp = shift;
+
+ $nntp->_QUIT;
+ $nntp->close;
+}
+
+
+sub slave {
+ @_ == 1 or croak 'usage: $nntp->slave()';
+ my $nntp = shift;
+
+ $nntp->_SLAVE;
+}
+
+##
+## The following methods are not implemented by all servers
+##
+
+
+sub active {
+ @_ == 1 || @_ == 2 or croak 'usage: $nntp->active( [ PATTERN ] )';
+ my $nntp = shift;
+
+ $nntp->_LIST('ACTIVE', @_)
+ ? $nntp->_grouplist
+ : undef;
+}
+
+
+sub active_times {
+ @_ == 1 or croak 'usage: $nntp->active_times()';
+ my $nntp = shift;
+
+ $nntp->_LIST('ACTIVE.TIMES')
+ ? $nntp->_grouplist
+ : undef;
+}
+
+
+sub distributions {
+ @_ == 1 or croak 'usage: $nntp->distributions()';
+ my $nntp = shift;
+
+ $nntp->_LIST('DISTRIBUTIONS')
+ ? $nntp->_description
+ : undef;
+}
+
+
+sub distribution_patterns {
+ @_ == 1 or croak 'usage: $nntp->distributions()';
+ my $nntp = shift;
+
+ my $arr;
+ local $_;
+
+ $nntp->_LIST('DISTRIB.PATS')
+ && ($arr = $nntp->read_until_dot)
+ ? [grep { /^\d/ && (chomp, $_ = [split /:/]) } @$arr]
+ : undef;
+}
+
+
+sub newsgroups {
+ @_ == 1 || @_ == 2 or croak 'usage: $nntp->newsgroups( [ PATTERN ] )';
+ my $nntp = shift;
+
+ $nntp->_LIST('NEWSGROUPS', @_)
+ ? $nntp->_description
+ : undef;
+}
+
+
+sub overview_fmt {
+ @_ == 1 or croak 'usage: $nntp->overview_fmt()';
+ my $nntp = shift;
+
+ $nntp->_LIST('OVERVIEW.FMT')
+ ? $nntp->_articlelist
+ : undef;
+}
+
+
+sub subscriptions {
+ @_ == 1 or croak 'usage: $nntp->subscriptions()';
+ my $nntp = shift;
+
+ $nntp->_LIST('SUBSCRIPTIONS')
+ ? $nntp->_articlelist
+ : undef;
+}
+
+
+sub listgroup {
+ @_ == 1 || @_ == 2 or croak 'usage: $nntp->listgroup( [ GROUP ] )';
+ my $nntp = shift;
+
+ $nntp->_LISTGROUP(@_)
+ ? $nntp->_articlelist
+ : undef;
+}
+
+
+sub reader {
+ @_ == 1 or croak 'usage: $nntp->reader()';
+ my $nntp = shift;
+
+ $nntp->_MODE('READER');
+}
+
+
+sub xgtitle {
+ @_ == 1 || @_ == 2 or croak 'usage: $nntp->xgtitle( [ PATTERN ] )';
+ my $nntp = shift;
+
+ $nntp->_XGTITLE(@_)
+ ? $nntp->_description
+ : undef;
+}
+
+
+sub xhdr {
+ @_ >= 2 && @_ <= 4 or croak 'usage: $nntp->xhdr( HEADER, [ MESSAGE-SPEC ] )';
+ my $nntp = shift;
+ my $hdr = shift;
+ my $arg = _msg_arg(@_);
+
+ $nntp->_XHDR($hdr, $arg)
+ ? $nntp->_description
+ : undef;
+}
+
+
+sub xover {
+ @_ == 2 || @_ == 3 or croak 'usage: $nntp->xover( MESSAGE-SPEC )';
+ my $nntp = shift;
+ my $arg = _msg_arg(@_);
+
+ $nntp->_XOVER($arg)
+ ? $nntp->_fieldlist
+ : undef;
+}
+
+
+sub xpat {
+ @_ == 4 || @_ == 5 or croak '$nntp->xpat( HEADER, PATTERN, MESSAGE-SPEC )';
+ my $nntp = shift;
+ my $hdr = shift;
+ my $pat = shift;
+ my $arg = _msg_arg(@_);
+
+ $pat = join(" ", @$pat)
+ if ref($pat);
+
+ $nntp->_XPAT($hdr, $arg, $pat)
+ ? $nntp->_description
+ : undef;
+}
+
+
+sub xpath {
+ @_ == 2 or croak 'usage: $nntp->xpath( MESSAGE-ID )';
+ my ($nntp, $mid) = @_;
+
+ return undef
+ unless $nntp->_XPATH($mid);
+
+ my $m;
+ ($m = $nntp->message) =~ s/^\d+\s+//o;
+ my @p = split /\s+/, $m;
+
+ wantarray ? @p : $p[0];
+}
+
+
+sub xrover {
+ @_ == 2 || @_ == 3 or croak 'usage: $nntp->xrover( MESSAGE-SPEC )';
+ my $nntp = shift;
+ my $arg = _msg_arg(@_);
+
+ $nntp->_XROVER($arg)
+ ? $nntp->_description
+ : undef;
+}
+
+
+sub date {
+ @_ == 1 or croak 'usage: $nntp->date()';
+ my $nntp = shift;
+
+ $nntp->_DATE
+ && $nntp->message =~ /(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/
+ ? timegm($6, $5, $4, $3, $2 - 1, $1 - 1900)
+ : undef;
+}
+
+
+##
+## Private subroutines
+##
+
+
+sub _msg_arg {
+ my $spec = shift;
+ my $arg = "";
+
+ if (@_) {
+ carp "Depriciated passing of two message numbers, " . "pass a reference"
+ if $^W;
+ $spec = [$spec, $_[0]];
+ }
+
+ if (defined $spec) {
+ if (ref($spec)) {
+ $arg = $spec->[0];
+ if (defined $spec->[1]) {
+ $arg .= "-"
+ if $spec->[1] != $spec->[0];
+ $arg .= $spec->[1]
+ if $spec->[1] > $spec->[0];
+ }
+ }
+ else {
+ $arg = $spec;
+ }
+ }
+
+ $arg;
+}
+
+
+sub _timestr {
+ my $time = shift;
+ my @g = reverse((gmtime($time))[0 .. 5]);
+ $g[1] += 1;
+ $g[0] %= 100;
+ sprintf "%02d%02d%02d %02d%02d%02d GMT", @g;
+}
+
+
+sub _grouplist {
+ my $nntp = shift;
+ my $arr = $nntp->read_until_dot
+ or return undef;
+
+ my $hash = {};
+ my $ln;
+
+ foreach $ln (@$arr) {
+ my @a = split(/[\s\n]+/, $ln);
+ $hash->{$a[0]} = [@a[1, 2, 3]];
+ }
+
+ $hash;
+}
+
+
+sub _fieldlist {
+ my $nntp = shift;
+ my $arr = $nntp->read_until_dot
+ or return undef;
+
+ my $hash = {};
+ my $ln;
+
+ foreach $ln (@$arr) {
+ my @a = split(/[\t\n]/, $ln);
+ my $m = shift @a;
+ $hash->{$m} = [@a];
+ }
+
+ $hash;
+}
+
+
+sub _articlelist {
+ my $nntp = shift;
+ my $arr = $nntp->read_until_dot;
+
+ chomp(@$arr)
+ if $arr;
+
+ $arr;
+}
+
+
+sub _description {
+ my $nntp = shift;
+ my $arr = $nntp->read_until_dot
+ or return undef;
+
+ my $hash = {};
+ my $ln;
+
+ foreach $ln (@$arr) {
+ chomp($ln);
+
+ $hash->{$1} = $ln
+ if $ln =~ s/^\s*(\S+)\s*//o;
+ }
+
+ $hash;
+
+}
+
+##
+## The commands
+##
+
+
+sub _ARTICLE { shift->command('ARTICLE', @_)->response == CMD_OK }
+sub _AUTHINFO { shift->command('AUTHINFO', @_)->response }
+sub _BODY { shift->command('BODY', @_)->response == CMD_OK }
+sub _DATE { shift->command('DATE')->response == CMD_INFO }
+sub _GROUP { shift->command('GROUP', @_)->response == CMD_OK }
+sub _HEAD { shift->command('HEAD', @_)->response == CMD_OK }
+sub _HELP { shift->command('HELP', @_)->response == CMD_INFO }
+sub _IHAVE { shift->command('IHAVE', @_)->response == CMD_MORE }
+sub _LAST { shift->command('LAST')->response == CMD_OK }
+sub _LIST { shift->command('LIST', @_)->response == CMD_OK }
+sub _LISTGROUP { shift->command('LISTGROUP', @_)->response == CMD_OK }
+sub _NEWGROUPS { shift->command('NEWGROUPS', @_)->response == CMD_OK }
+sub _NEWNEWS { shift->command('NEWNEWS', @_)->response == CMD_OK }
+sub _NEXT { shift->command('NEXT')->response == CMD_OK }
+sub _POST { shift->command('POST', @_)->response == CMD_MORE }
+sub _QUIT { shift->command('QUIT', @_)->response == CMD_OK }
+sub _SLAVE { shift->command('SLAVE', @_)->response == CMD_OK }
+sub _STAT { shift->command('STAT', @_)->response == CMD_OK }
+sub _MODE { shift->command('MODE', @_)->response == CMD_OK }
+sub _XGTITLE { shift->command('XGTITLE', @_)->response == CMD_OK }
+sub _XHDR { shift->command('XHDR', @_)->response == CMD_OK }
+sub _XPAT { shift->command('XPAT', @_)->response == CMD_OK }
+sub _XPATH { shift->command('XPATH', @_)->response == CMD_OK }
+sub _XOVER { shift->command('XOVER', @_)->response == CMD_OK }
+sub _XROVER { shift->command('XROVER', @_)->response == CMD_OK }
+sub _XTHREAD { shift->unsupported }
+sub _XSEARCH { shift->unsupported }
+sub _XINDEX { shift->unsupported }
+
+##
+## IO/perl methods
+##
+
+
+sub DESTROY {
+ my $nntp = shift;
+ defined(fileno($nntp)) && $nntp->quit;
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::NNTP - NNTP Client class
+
+=head1 SYNOPSIS
+
+ use Net::NNTP;
+
+ $nntp = Net::NNTP->new("some.host.name");
+ $nntp->quit;
+
+=head1 DESCRIPTION
+
+C<Net::NNTP> is a class implementing a simple NNTP client in Perl as described
+in RFC977. C<Net::NNTP> inherits its communication methods from C<Net::Cmd>
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ HOST ] [, OPTIONS ])
+
+This is the constructor for a new Net::NNTP object. C<HOST> is the
+name of the remote host to which a NNTP connection is required. If not
+given then it may be passed as the C<Host> option described below. If no host is passed
+then two environment variables are checked, first C<NNTPSERVER> then
+C<NEWSHOST>, then C<Net::Config> is checked, and if a host is not found
+then C<news> is used.
+
+C<OPTIONS> are passed in a hash like fashion, using key and value pairs.
+Possible options are:
+
+B<Host> - NNTP host to connect to. It may be a single scalar, as defined for
+the C<PeerAddr> option in L<IO::Socket::INET>, or a reference to
+an array with hosts to try in turn. The L</host> method will return the value
+which was used to connect to the host.
+
+B<Timeout> - Maximum time, in seconds, to wait for a response from the
+NNTP server, a value of zero will cause all IO operations to block.
+(default: 120)
+
+B<Debug> - Enable the printing of debugging information to STDERR
+
+B<Reader> - If the remote server is INN then initially the connection
+will be to nnrpd, by default C<Net::NNTP> will issue a C<MODE READER> command
+so that the remote server becomes innd. If the C<Reader> option is given
+with a value of zero, then this command will not be sent and the
+connection will be left talking to nnrpd.
+
+=back
+
+=head1 METHODS
+
+Unless otherwise stated all methods return either a I<true> or I<false>
+value, with I<true> meaning that the operation was a success. When a method
+states that it returns a value, failure will be returned as I<undef> or an
+empty list.
+
+=over 4
+
+=item article ( [ MSGID|MSGNUM ], [FH] )
+
+Retrieve the header, a blank line, then the body (text) of the
+specified article.
+
+If C<FH> is specified then it is expected to be a valid filehandle
+and the result will be printed to it, on success a true value will be
+returned. If C<FH> is not specified then the return value, on success,
+will be a reference to an array containing the article requested, each
+entry in the array will contain one line of the article.
+
+If no arguments are passed then the current article in the currently
+selected newsgroup is fetched.
+
+C<MSGNUM> is a numeric id of an article in the current newsgroup, and
+will change the current article pointer. C<MSGID> is the message id of
+an article as shown in that article's header. It is anticipated that the
+client will obtain the C<MSGID> from a list provided by the C<newnews>
+command, from references contained within another article, or from the
+message-id provided in the response to some other commands.
+
+If there is an error then C<undef> will be returned.
+
+=item body ( [ MSGID|MSGNUM ], [FH] )
+
+Like C<article> but only fetches the body of the article.
+
+=item head ( [ MSGID|MSGNUM ], [FH] )
+
+Like C<article> but only fetches the headers for the article.
+
+=item articlefh ( [ MSGID|MSGNUM ] )
+
+=item bodyfh ( [ MSGID|MSGNUM ] )
+
+=item headfh ( [ MSGID|MSGNUM ] )
+
+These are similar to article(), body() and head(), but rather than
+returning the requested data directly, they return a tied filehandle
+from which to read the article.
+
+=item nntpstat ( [ MSGID|MSGNUM ] )
+
+The C<nntpstat> command is similar to the C<article> command except that no
+text is returned. When selecting by message number within a group,
+the C<nntpstat> command serves to set the "current article pointer" without
+sending text.
+
+Using the C<nntpstat> command to
+select by message-id is valid but of questionable value, since a
+selection by message-id does B<not> alter the "current article pointer".
+
+Returns the message-id of the "current article".
+
+=item group ( [ GROUP ] )
+
+Set and/or get the current group. If C<GROUP> is not given then information
+is returned on the current group.
+
+In a scalar context it returns the group name.
+
+In an array context the return value is a list containing, the number
+of articles in the group, the number of the first article, the number
+of the last article and the group name.
+
+=item ihave ( MSGID [, MESSAGE ])
+
+The C<ihave> command informs the server that the client has an article
+whose id is C<MSGID>. If the server desires a copy of that
+article, and C<MESSAGE> has been given the it will be sent.
+
+Returns I<true> if the server desires the article and C<MESSAGE> was
+successfully sent,if specified.
+
+If C<MESSAGE> is not specified then the message must be sent using the
+C<datasend> and C<dataend> methods from L<Net::Cmd>
+
+C<MESSAGE> can be either an array of lines or a reference to an array.
+
+=item last ()
+
+Set the "current article pointer" to the previous article in the current
+newsgroup.
+
+Returns the message-id of the article.
+
+=item date ()
+
+Returns the date on the remote server. This date will be in a UNIX time
+format (seconds since 1970)
+
+=item postok ()
+
+C<postok> will return I<true> if the servers initial response indicated
+that it will allow posting.
+
+=item authinfo ( USER, PASS )
+
+Authenticates to the server (using AUTHINFO USER / AUTHINFO PASS)
+using the supplied username and password. Please note that the
+password is sent in clear text to the server. This command should not
+be used with valuable passwords unless the connection to the server is
+somehow protected.
+
+=item list ()
+
+Obtain information about all the active newsgroups. The results is a reference
+to a hash where the key is a group name and each value is a reference to an
+array. The elements in this array are:- the last article number in the group,
+the first article number in the group and any information flags about the group.
+
+=item newgroups ( SINCE [, DISTRIBUTIONS ])
+
+C<SINCE> is a time value and C<DISTRIBUTIONS> is either a distribution
+pattern or a reference to a list of distribution patterns.
+The result is the same as C<list>, but the
+groups return will be limited to those created after C<SINCE> and, if
+specified, in one of the distribution areas in C<DISTRIBUTIONS>.
+
+=item newnews ( SINCE [, GROUPS [, DISTRIBUTIONS ]])
+
+C<SINCE> is a time value. C<GROUPS> is either a group pattern or a reference
+to a list of group patterns. C<DISTRIBUTIONS> is either a distribution
+pattern or a reference to a list of distribution patterns.
+
+Returns a reference to a list which contains the message-ids of all news posted
+after C<SINCE>, that are in a groups which matched C<GROUPS> and a
+distribution which matches C<DISTRIBUTIONS>.
+
+=item next ()
+
+Set the "current article pointer" to the next article in the current
+newsgroup.
+
+Returns the message-id of the article.
+
+=item post ( [ MESSAGE ] )
+
+Post a new article to the news server. If C<MESSAGE> is specified and posting
+is allowed then the message will be sent.
+
+If C<MESSAGE> is not specified then the message must be sent using the
+C<datasend> and C<dataend> methods from L<Net::Cmd>
+
+C<MESSAGE> can be either an array of lines or a reference to an array.
+
+The message, either sent via C<datasend> or as the C<MESSAGE>
+parameter, must be in the format as described by RFC822 and must
+contain From:, Newsgroups: and Subject: headers.
+
+=item postfh ()
+
+Post a new article to the news server using a tied filehandle. If
+posting is allowed, this method will return a tied filehandle that you
+can print() the contents of the article to be posted. You must
+explicitly close() the filehandle when you are finished posting the
+article, and the return value from the close() call will indicate
+whether the message was successfully posted.
+
+=item slave ()
+
+Tell the remote server that I am not a user client, but probably another
+news server.
+
+=item quit ()
+
+Quit the remote server and close the socket connection.
+
+=back
+
+=head2 Extension methods
+
+These methods use commands that are not part of the RFC977 documentation. Some
+servers may not support all of them.
+
+=over 4
+
+=item newsgroups ( [ PATTERN ] )
+
+Returns a reference to a hash where the keys are all the group names which
+match C<PATTERN>, or all of the groups if no pattern is specified, and
+each value contains the description text for the group.
+
+=item distributions ()
+
+Returns a reference to a hash where the keys are all the possible
+distribution names and the values are the distribution descriptions.
+
+=item subscriptions ()
+
+Returns a reference to a list which contains a list of groups which
+are recommended for a new user to subscribe to.
+
+=item overview_fmt ()
+
+Returns a reference to an array which contain the names of the fields returned
+by C<xover>.
+
+=item active_times ()
+
+Returns a reference to a hash where the keys are the group names and each
+value is a reference to an array containing the time the groups was created
+and an identifier, possibly an Email address, of the creator.
+
+=item active ( [ PATTERN ] )
+
+Similar to C<list> but only active groups that match the pattern are returned.
+C<PATTERN> can be a group pattern.
+
+=item xgtitle ( PATTERN )
+
+Returns a reference to a hash where the keys are all the group names which
+match C<PATTERN> and each value is the description text for the group.
+
+=item xhdr ( HEADER, MESSAGE-SPEC )
+
+Obtain the header field C<HEADER> for all the messages specified.
+
+The return value will be a reference
+to a hash where the keys are the message numbers and each value contains
+the text of the requested header for that message.
+
+=item xover ( MESSAGE-SPEC )
+
+The return value will be a reference
+to a hash where the keys are the message numbers and each value contains
+a reference to an array which contains the overview fields for that
+message.
+
+The names of the fields can be obtained by calling C<overview_fmt>.
+
+=item xpath ( MESSAGE-ID )
+
+Returns the path name to the file on the server which contains the specified
+message.
+
+=item xpat ( HEADER, PATTERN, MESSAGE-SPEC)
+
+The result is the same as C<xhdr> except the is will be restricted to
+headers where the text of the header matches C<PATTERN>
+
+=item xrover
+
+The XROVER command returns reference information for the article(s)
+specified.
+
+Returns a reference to a HASH where the keys are the message numbers and the
+values are the References: lines from the articles
+
+=item listgroup ( [ GROUP ] )
+
+Returns a reference to a list of all the active messages in C<GROUP>, or
+the current group if C<GROUP> is not specified.
+
+=item reader
+
+Tell the server that you are a reader and not another server.
+
+This is required by some servers. For example if you are connecting to
+an INN server and you have transfer permission your connection will
+be connected to the transfer daemon, not the NNTP daemon. Issuing
+this command will cause the transfer daemon to hand over control
+to the NNTP daemon.
+
+Some servers do not understand this command, but issuing it and ignoring
+the response is harmless.
+
+=back
+
+=head1 UNSUPPORTED
+
+The following NNTP command are unsupported by the package, and there are
+no plans to do so.
+
+ AUTHINFO GENERIC
+ XTHREAD
+ XSEARCH
+ XINDEX
+
+=head1 DEFINITIONS
+
+=over 4
+
+=item MESSAGE-SPEC
+
+C<MESSAGE-SPEC> is either a single message-id, a single message number, or
+a reference to a list of two message numbers.
+
+If C<MESSAGE-SPEC> is a reference to a list of two message numbers and the
+second number in a range is less than or equal to the first then the range
+represents all messages in the group after the first message number.
+
+B<NOTE> For compatibility reasons only with earlier versions of Net::NNTP
+a message spec can be passed as a list of two numbers, this is deprecated
+and a reference to the list should now be passed
+
+=item PATTERN
+
+The C<NNTP> protocol uses the C<WILDMAT> format for patterns.
+The WILDMAT format was first developed by Rich Salz based on
+the format used in the UNIX "find" command to articulate
+file names. It was developed to provide a uniform mechanism
+for matching patterns in the same manner that the UNIX shell
+matches filenames.
+
+Patterns are implicitly anchored at the
+beginning and end of each string when testing for a match.
+
+There are five pattern matching operations other than a strict
+one-to-one match between the pattern and the source to be
+checked for a match.
+
+The first is an asterisk C<*> to match any sequence of zero or more
+characters.
+
+The second is a question mark C<?> to match any single character. The
+third specifies a specific set of characters.
+
+The set is specified as a list of characters, or as a range of characters
+where the beginning and end of the range are separated by a minus (or dash)
+character, or as any combination of lists and ranges. The dash can
+also be included in the set as a character it if is the beginning
+or end of the set. This set is enclosed in square brackets. The
+close square bracket C<]> may be used in a set if it is the first
+character in the set.
+
+The fourth operation is the same as the
+logical not of the third operation and is specified the same
+way as the third with the addition of a caret character C<^> at
+the beginning of the test string just inside the open square
+bracket.
+
+The final operation uses the backslash character to
+invalidate the special meaning of an open square bracket C<[>,
+the asterisk, backslash or the question mark. Two backslashes in
+sequence will result in the evaluation of the backslash as a
+character with no special meaning.
+
+=over 4
+
+=item Examples
+
+=item C<[^]-]>
+
+matches any single character other than a close square
+bracket or a minus sign/dash.
+
+=item C<*bdc>
+
+matches any string that ends with the string "bdc"
+including the string "bdc" (without quotes).
+
+=item C<[0-9a-zA-Z]>
+
+matches any single printable alphanumeric ASCII character.
+
+=item C<a??d>
+
+matches any four character string which begins
+with a and ends with d.
+
+=back
+
+=back
+
+=head1 SEE ALSO
+
+L<Net::Cmd>
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1997 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/Netrc.pm b/Master/tlpkg/tlperl.straw/lib/Net/Netrc.pm
new file mode 100755
index 00000000000..28c826b38cd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/Netrc.pm
@@ -0,0 +1,325 @@
+# Net::Netrc.pm
+#
+# Copyright (c) 1995-1998 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::Netrc;
+
+use Carp;
+use strict;
+use FileHandle;
+use vars qw($VERSION);
+
+$VERSION = "2.12";
+
+my %netrc = ();
+
+
+sub _readrc {
+ my $host = shift;
+ my ($home, $file);
+
+ if ($^O eq "MacOS") {
+ $home = $ENV{HOME} || `pwd`;
+ chomp($home);
+ $file = ($home =~ /:$/ ? $home . "netrc" : $home . ":netrc");
+ }
+ else {
+
+ # Some OS's don't have `getpwuid', so we default to $ENV{HOME}
+ $home = eval { (getpwuid($>))[7] } || $ENV{HOME};
+ $home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH} || '') if defined $ENV{HOMEDRIVE};
+ $file = $home . "/.netrc";
+ }
+
+ my ($login, $pass, $acct) = (undef, undef, undef);
+ my $fh;
+ local $_;
+
+ $netrc{default} = undef;
+
+ # OS/2 and Win32 do not handle stat in a way compatable with this check :-(
+ unless ($^O eq 'os2'
+ || $^O eq 'MSWin32'
+ || $^O eq 'MacOS'
+ || $^O =~ /^cygwin/)
+ {
+ my @stat = stat($file);
+
+ if (@stat) {
+ if ($stat[2] & 077) {
+ carp "Bad permissions: $file";
+ return;
+ }
+ if ($stat[4] != $<) {
+ carp "Not owner: $file";
+ return;
+ }
+ }
+ }
+
+ if ($fh = FileHandle->new($file, "r")) {
+ my ($mach, $macdef, $tok, @tok) = (0, 0);
+
+ while (<$fh>) {
+ undef $macdef if /\A\n\Z/;
+
+ if ($macdef) {
+ push(@$macdef, $_);
+ next;
+ }
+
+ s/^\s*//;
+ chomp;
+
+ while (length && s/^("((?:[^"]+|\\.)*)"|((?:[^\\\s]+|\\.)*))\s*//) {
+ (my $tok = $+) =~ s/\\(.)/$1/g;
+ push(@tok, $tok);
+ }
+
+ TOKEN:
+ while (@tok) {
+ if ($tok[0] eq "default") {
+ shift(@tok);
+ $mach = bless {};
+ $netrc{default} = [$mach];
+
+ next TOKEN;
+ }
+
+ last TOKEN
+ unless @tok > 1;
+
+ $tok = shift(@tok);
+
+ if ($tok eq "machine") {
+ my $host = shift @tok;
+ $mach = bless {machine => $host};
+
+ $netrc{$host} = []
+ unless exists($netrc{$host});
+ push(@{$netrc{$host}}, $mach);
+ }
+ elsif ($tok =~ /^(login|password|account)$/) {
+ next TOKEN unless $mach;
+ my $value = shift @tok;
+
+ # Following line added by rmerrell to remove '/' escape char in .netrc
+ $value =~ s/\/\\/\\/g;
+ $mach->{$1} = $value;
+ }
+ elsif ($tok eq "macdef") {
+ next TOKEN unless $mach;
+ my $value = shift @tok;
+ $mach->{macdef} = {}
+ unless exists $mach->{macdef};
+ $macdef = $mach->{machdef}{$value} = [];
+ }
+ }
+ }
+ $fh->close();
+ }
+}
+
+
+sub lookup {
+ my ($pkg, $mach, $login) = @_;
+
+ _readrc()
+ unless exists $netrc{default};
+
+ $mach ||= 'default';
+ undef $login
+ if $mach eq 'default';
+
+ if (exists $netrc{$mach}) {
+ if (defined $login) {
+ my $m;
+ foreach $m (@{$netrc{$mach}}) {
+ return $m
+ if (exists $m->{login} && $m->{login} eq $login);
+ }
+ return undef;
+ }
+ return $netrc{$mach}->[0];
+ }
+
+ return $netrc{default}->[0]
+ if defined $netrc{default};
+
+ return undef;
+}
+
+
+sub login {
+ my $me = shift;
+
+ exists $me->{login}
+ ? $me->{login}
+ : undef;
+}
+
+
+sub account {
+ my $me = shift;
+
+ exists $me->{account}
+ ? $me->{account}
+ : undef;
+}
+
+
+sub password {
+ my $me = shift;
+
+ exists $me->{password}
+ ? $me->{password}
+ : undef;
+}
+
+
+sub lpa {
+ my $me = shift;
+ ($me->login, $me->password, $me->account);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::Netrc - OO interface to users netrc file
+
+=head1 SYNOPSIS
+
+ use Net::Netrc;
+
+ $mach = Net::Netrc->lookup('some.machine');
+ $login = $mach->login;
+ ($login, $password, $account) = $mach->lpa;
+
+=head1 DESCRIPTION
+
+C<Net::Netrc> is a class implementing a simple interface to the .netrc file
+used as by the ftp program.
+
+C<Net::Netrc> also implements security checks just like the ftp program,
+these checks are, first that the .netrc file must be owned by the user and
+second the ownership permissions should be such that only the owner has
+read and write access. If these conditions are not met then a warning is
+output and the .netrc file is not read.
+
+=head1 THE .netrc FILE
+
+The .netrc file contains login and initialization information used by the
+auto-login process. It resides in the user's home directory. The following
+tokens are recognized; they may be separated by spaces, tabs, or new-lines:
+
+=over 4
+
+=item machine name
+
+Identify a remote machine name. The auto-login process searches
+the .netrc file for a machine token that matches the remote machine
+specified. Once a match is made, the subsequent .netrc tokens
+are processed, stopping when the end of file is reached or an-
+other machine or a default token is encountered.
+
+=item default
+
+This is the same as machine name except that default matches
+any name. There can be only one default token, and it must be
+after all machine tokens. This is normally used as:
+
+ default login anonymous password user@site
+
+thereby giving the user automatic anonymous login to machines
+not specified in .netrc.
+
+=item login name
+
+Identify a user on the remote machine. If this token is present,
+the auto-login process will initiate a login using the
+specified name.
+
+=item password string
+
+Supply a password. If this token is present, the auto-login
+process will supply the specified string if the remote server
+requires a password as part of the login process.
+
+=item account string
+
+Supply an additional account password. If this token is present,
+the auto-login process will supply the specified string
+if the remote server requires an additional account password.
+
+=item macdef name
+
+Define a macro. C<Net::Netrc> only parses this field to be compatible
+with I<ftp>.
+
+=back
+
+=head1 CONSTRUCTOR
+
+The constructor for a C<Net::Netrc> object is not called new as it does not
+really create a new object. But instead is called C<lookup> as this is
+essentially what it does.
+
+=over 4
+
+=item lookup ( MACHINE [, LOGIN ])
+
+Lookup and return a reference to the entry for C<MACHINE>. If C<LOGIN> is given
+then the entry returned will have the given login. If C<LOGIN> is not given then
+the first entry in the .netrc file for C<MACHINE> will be returned.
+
+If a matching entry cannot be found, and a default entry exists, then a
+reference to the default entry is returned.
+
+If there is no matching entry found and there is no default defined, or
+no .netrc file is found, then C<undef> is returned.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item login ()
+
+Return the login id for the netrc entry
+
+=item password ()
+
+Return the password for the netrc entry
+
+=item account ()
+
+Return the account information for the netrc entry
+
+=item lpa ()
+
+Return a list of login, password and account information fir the netrc entry
+
+=back
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 SEE ALSO
+
+L<Net::Netrc>
+L<Net::Cmd>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1998 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/POP3.pm b/Master/tlpkg/tlperl.straw/lib/Net/POP3.pm
new file mode 100755
index 00000000000..8381c81815e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/POP3.pm
@@ -0,0 +1,742 @@
+# Net::POP3.pm
+#
+# Copyright (c) 1995-2004 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::POP3;
+
+use strict;
+use IO::Socket;
+use vars qw(@ISA $VERSION $debug);
+use Net::Cmd;
+use Carp;
+use Net::Config;
+
+$VERSION = "2.29";
+
+@ISA = qw(Net::Cmd IO::Socket::INET);
+
+
+sub new {
+ my $self = shift;
+ my $type = ref($self) || $self;
+ my ($host, %arg);
+ if (@_ % 2) {
+ $host = shift;
+ %arg = @_;
+ }
+ else {
+ %arg = @_;
+ $host = delete $arg{Host};
+ }
+ my $hosts = defined $host ? [$host] : $NetConfig{pop3_hosts};
+ my $obj;
+ my @localport = exists $arg{ResvPort} ? (LocalPort => $arg{ResvPort}) : ();
+
+ my $h;
+ foreach $h (@{$hosts}) {
+ $obj = $type->SUPER::new(
+ PeerAddr => ($host = $h),
+ PeerPort => $arg{Port} || 'pop3(110)',
+ Proto => 'tcp',
+ @localport,
+ Timeout => defined $arg{Timeout}
+ ? $arg{Timeout}
+ : 120
+ )
+ and last;
+ }
+
+ return undef
+ unless defined $obj;
+
+ ${*$obj}{'net_pop3_host'} = $host;
+
+ $obj->autoflush(1);
+ $obj->debug(exists $arg{Debug} ? $arg{Debug} : undef);
+
+ unless ($obj->response() == CMD_OK) {
+ $obj->close();
+ return undef;
+ }
+
+ ${*$obj}{'net_pop3_banner'} = $obj->message;
+
+ $obj;
+}
+
+
+sub host {
+ my $me = shift;
+ ${*$me}{'net_pop3_host'};
+}
+
+##
+## We don't want people sending me their passwords when they report problems
+## now do we :-)
+##
+
+
+sub debug_text { $_[2] =~ /^(pass|rpop)/i ? "$1 ....\n" : $_[2]; }
+
+
+sub login {
+ @_ >= 1 && @_ <= 3 or croak 'usage: $pop3->login( USER, PASS )';
+ my ($me, $user, $pass) = @_;
+
+ if (@_ <= 2) {
+ ($user, $pass) = $me->_lookup_credentials($user);
+ }
+
+ $me->user($user)
+ and $me->pass($pass);
+}
+
+
+sub apop {
+ @_ >= 1 && @_ <= 3 or croak 'usage: $pop3->apop( USER, PASS )';
+ my ($me, $user, $pass) = @_;
+ my $banner;
+ my $md;
+
+ if (eval { local $SIG{__DIE__}; require Digest::MD5 }) {
+ $md = Digest::MD5->new();
+ }
+ elsif (eval { local $SIG{__DIE__}; require MD5 }) {
+ $md = MD5->new();
+ }
+ else {
+ carp "You need to install Digest::MD5 or MD5 to use the APOP command";
+ return undef;
+ }
+
+ return undef
+ unless ($banner = (${*$me}{'net_pop3_banner'} =~ /(<.*>)/)[0]);
+
+ if (@_ <= 2) {
+ ($user, $pass) = $me->_lookup_credentials($user);
+ }
+
+ $md->add($banner, $pass);
+
+ return undef
+ unless ($me->_APOP($user, $md->hexdigest));
+
+ $me->_get_mailbox_count();
+}
+
+
+sub user {
+ @_ == 2 or croak 'usage: $pop3->user( USER )';
+ $_[0]->_USER($_[1]) ? 1 : undef;
+}
+
+
+sub pass {
+ @_ == 2 or croak 'usage: $pop3->pass( PASS )';
+
+ my ($me, $pass) = @_;
+
+ return undef
+ unless ($me->_PASS($pass));
+
+ $me->_get_mailbox_count();
+}
+
+
+sub reset {
+ @_ == 1 or croak 'usage: $obj->reset()';
+
+ my $me = shift;
+
+ return 0
+ unless ($me->_RSET);
+
+ if (defined ${*$me}{'net_pop3_mail'}) {
+ local $_;
+ foreach (@{${*$me}{'net_pop3_mail'}}) {
+ delete $_->{'net_pop3_deleted'};
+ }
+ }
+}
+
+
+sub last {
+ @_ == 1 or croak 'usage: $obj->last()';
+
+ return undef
+ unless $_[0]->_LAST && $_[0]->message =~ /(\d+)/;
+
+ return $1;
+}
+
+
+sub top {
+ @_ == 2 || @_ == 3 or croak 'usage: $pop3->top( MSGNUM [, NUMLINES ])';
+ my $me = shift;
+
+ return undef
+ unless $me->_TOP($_[0], $_[1] || 0);
+
+ $me->read_until_dot;
+}
+
+
+sub popstat {
+ @_ == 1 or croak 'usage: $pop3->popstat()';
+ my $me = shift;
+
+ return ()
+ unless $me->_STAT && $me->message =~ /(\d+)\D+(\d+)/;
+
+ ($1 || 0, $2 || 0);
+}
+
+
+sub list {
+ @_ == 1 || @_ == 2 or croak 'usage: $pop3->list( [ MSGNUM ] )';
+ my $me = shift;
+
+ return undef
+ unless $me->_LIST(@_);
+
+ if (@_) {
+ $me->message =~ /\d+\D+(\d+)/;
+ return $1 || undef;
+ }
+
+ my $info = $me->read_until_dot
+ or return undef;
+
+ my %hash = map { (/(\d+)\D+(\d+)/) } @$info;
+
+ return \%hash;
+}
+
+
+sub get {
+ @_ == 2 or @_ == 3 or croak 'usage: $pop3->get( MSGNUM [, FH ])';
+ my $me = shift;
+
+ return undef
+ unless $me->_RETR(shift);
+
+ $me->read_until_dot(@_);
+}
+
+
+sub getfh {
+ @_ == 2 or croak 'usage: $pop3->getfh( MSGNUM )';
+ my $me = shift;
+
+ return unless $me->_RETR(shift);
+ return $me->tied_fh;
+}
+
+
+sub delete {
+ @_ == 2 or croak 'usage: $pop3->delete( MSGNUM )';
+ my $me = shift;
+ return 0 unless $me->_DELE(@_);
+ ${*$me}{'net_pop3_deleted'} = 1;
+}
+
+
+sub uidl {
+ @_ == 1 || @_ == 2 or croak 'usage: $pop3->uidl( [ MSGNUM ] )';
+ my $me = shift;
+ my $uidl;
+
+ $me->_UIDL(@_)
+ or return undef;
+ if (@_) {
+ $uidl = ($me->message =~ /\d+\s+([\041-\176]+)/)[0];
+ }
+ else {
+ my $ref = $me->read_until_dot
+ or return undef;
+ my $ln;
+ $uidl = {};
+ foreach $ln (@$ref) {
+ my ($msg, $uid) = $ln =~ /^\s*(\d+)\s+([\041-\176]+)/;
+ $uidl->{$msg} = $uid;
+ }
+ }
+ return $uidl;
+}
+
+
+sub ping {
+ @_ == 2 or croak 'usage: $pop3->ping( USER )';
+ my $me = shift;
+
+ return () unless $me->_PING(@_) && $me->message =~ /(\d+)\D+(\d+)/;
+
+ ($1 || 0, $2 || 0);
+}
+
+
+sub _lookup_credentials {
+ my ($me, $user) = @_;
+
+ require Net::Netrc;
+
+ $user ||= eval { local $SIG{__DIE__}; (getpwuid($>))[0] }
+ || $ENV{NAME}
+ || $ENV{USER}
+ || $ENV{LOGNAME};
+
+ my $m = Net::Netrc->lookup(${*$me}{'net_pop3_host'}, $user);
+ $m ||= Net::Netrc->lookup(${*$me}{'net_pop3_host'});
+
+ my $pass = $m
+ ? $m->password || ""
+ : "";
+
+ ($user, $pass);
+}
+
+
+sub _get_mailbox_count {
+ my ($me) = @_;
+ my $ret = ${*$me}{'net_pop3_count'} =
+ ($me->message =~ /(\d+)\s+message/io) ? $1 : ($me->popstat)[0];
+
+ $ret ? $ret : "0E0";
+}
+
+
+sub _STAT { shift->command('STAT')->response() == CMD_OK }
+sub _LIST { shift->command('LIST', @_)->response() == CMD_OK }
+sub _RETR { shift->command('RETR', $_[0])->response() == CMD_OK }
+sub _DELE { shift->command('DELE', $_[0])->response() == CMD_OK }
+sub _NOOP { shift->command('NOOP')->response() == CMD_OK }
+sub _RSET { shift->command('RSET')->response() == CMD_OK }
+sub _QUIT { shift->command('QUIT')->response() == CMD_OK }
+sub _TOP { shift->command('TOP', @_)->response() == CMD_OK }
+sub _UIDL { shift->command('UIDL', @_)->response() == CMD_OK }
+sub _USER { shift->command('USER', $_[0])->response() == CMD_OK }
+sub _PASS { shift->command('PASS', $_[0])->response() == CMD_OK }
+sub _APOP { shift->command('APOP', @_)->response() == CMD_OK }
+sub _PING { shift->command('PING', $_[0])->response() == CMD_OK }
+
+
+sub _RPOP { shift->command('RPOP', $_[0])->response() == CMD_OK }
+sub _LAST { shift->command('LAST')->response() == CMD_OK }
+
+
+sub _CAPA { shift->command('CAPA')->response() == CMD_OK }
+
+
+sub quit {
+ my $me = shift;
+
+ $me->_QUIT;
+ $me->close;
+}
+
+
+sub DESTROY {
+ my $me = shift;
+
+ if (defined fileno($me) and ${*$me}{'net_pop3_deleted'}) {
+ $me->reset;
+ $me->quit;
+ }
+}
+
+##
+## POP3 has weird responses, so we emulate them to look the same :-)
+##
+
+
+sub response {
+ my $cmd = shift;
+ my $str = $cmd->getline() or return undef;
+ my $code = "500";
+
+ $cmd->debug_print(0, $str)
+ if ($cmd->debug);
+
+ if ($str =~ s/^\+OK\s*//io) {
+ $code = "200";
+ }
+ elsif ($str =~ s/^\+\s*//io) {
+ $code = "300";
+ }
+ else {
+ $str =~ s/^-ERR\s*//io;
+ }
+
+ ${*$cmd}{'net_cmd_resp'} = [$str];
+ ${*$cmd}{'net_cmd_code'} = $code;
+
+ substr($code, 0, 1);
+}
+
+
+sub capa {
+ my $this = shift;
+ my ($capa, %capabilities);
+
+ # Fake a capability here
+ $capabilities{APOP} = '' if ($this->banner() =~ /<.*>/);
+
+ if ($this->_CAPA()) {
+ $capabilities{CAPA} = 1;
+ $capa = $this->read_until_dot();
+ %capabilities = (%capabilities, map {/^\s*(\S+)\s*(.*)/} @$capa);
+ }
+ else {
+
+ # Check AUTH for SASL capabilities
+ if ($this->command('AUTH')->response() == CMD_OK) {
+ my $mechanism = $this->read_until_dot();
+ $capabilities{SASL} = join " ", map {m/([A-Z0-9_-]+)/} @{$mechanism};
+ }
+ }
+
+ return ${*$this}{'net_pop3e_capabilities'} = \%capabilities;
+}
+
+
+sub capabilities {
+ my $this = shift;
+
+ ${*$this}{'net_pop3e_capabilities'} || $this->capa;
+}
+
+
+sub auth {
+ my ($self, $username, $password) = @_;
+
+ eval {
+ require MIME::Base64;
+ require Authen::SASL;
+ } or $self->set_status(500, ["Need MIME::Base64 and Authen::SASL todo auth"]), return 0;
+
+ my $capa = $self->capa;
+ my $mechanisms = $capa->{SASL} || 'CRAM-MD5';
+
+ my $sasl;
+
+ if (ref($username) and UNIVERSAL::isa($username, 'Authen::SASL')) {
+ $sasl = $username;
+ my $user_mech = $sasl->mechanism || '';
+ my @user_mech = split(/\s+/, $user_mech);
+ my %user_mech;
+ @user_mech{@user_mech} = ();
+
+ my @server_mech = split(/\s+/, $mechanisms);
+ my @mech = @user_mech
+ ? grep { exists $user_mech{$_} } @server_mech
+ : @server_mech;
+ unless (@mech) {
+ $self->set_status(
+ 500,
+ [ 'Client SASL mechanisms (',
+ join(', ', @user_mech),
+ ') do not match the SASL mechnism the server announces (',
+ join(', ', @server_mech), ')',
+ ]
+ );
+ return 0;
+ }
+
+ $sasl->mechanism(join(" ", @mech));
+ }
+ else {
+ die "auth(username, password)" if not length $username;
+ $sasl = Authen::SASL->new(
+ mechanism => $mechanisms,
+ callback => {
+ user => $username,
+ pass => $password,
+ authname => $username,
+ }
+ );
+ }
+
+ # We should probably allow the user to pass the host, but I don't
+ # currently know and SASL mechanisms that are used by smtp that need it
+ my ($hostname) = split /:/, ${*$self}{'net_pop3_host'};
+ my $client = eval { $sasl->client_new('pop', $hostname, 0) };
+
+ unless ($client) {
+ my $mech = $sasl->mechanism;
+ $self->set_status(
+ 500,
+ [ " Authen::SASL failure: $@",
+ '(please check if your local Authen::SASL installation',
+ "supports mechanism '$mech'"
+ ]
+ );
+ return 0;
+ }
+
+ my ($token) = $client->client_start
+ or do {
+ my $mech = $client->mechanism;
+ $self->set_status(
+ 500,
+ [ ' Authen::SASL failure: $client->client_start ',
+ "mechanism '$mech' hostname #$hostname#",
+ $client->error
+ ]
+ );
+ return 0;
+ };
+
+ # We dont support sasl mechanisms that encrypt the socket traffic.
+ # todo that we would really need to change the ISA hierarchy
+ # so we dont inherit from IO::Socket, but instead hold it in an attribute
+
+ my @cmd = ("AUTH", $client->mechanism);
+ my $code;
+
+ push @cmd, MIME::Base64::encode_base64($token, '')
+ if defined $token and length $token;
+
+ while (($code = $self->command(@cmd)->response()) == CMD_MORE) {
+
+ my ($token) = $client->client_step(MIME::Base64::decode_base64(($self->message)[0])) or do {
+ $self->set_status(
+ 500,
+ [ ' Authen::SASL failure: $client->client_step ',
+ "mechanism '", $client->mechanism, " hostname #$hostname#, ",
+ $client->error
+ ]
+ );
+ return 0;
+ };
+
+ @cmd = (MIME::Base64::encode_base64(defined $token ? $token : '', ''));
+ }
+
+ $code == CMD_OK;
+}
+
+
+sub banner {
+ my $this = shift;
+
+ return ${*$this}{'net_pop3_banner'};
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::POP3 - Post Office Protocol 3 Client class (RFC1939)
+
+=head1 SYNOPSIS
+
+ use Net::POP3;
+
+ # Constructors
+ $pop = Net::POP3->new('pop3host');
+ $pop = Net::POP3->new('pop3host', Timeout => 60);
+
+ if ($pop->login($username, $password) > 0) {
+ my $msgnums = $pop->list; # hashref of msgnum => size
+ foreach my $msgnum (keys %$msgnums) {
+ my $msg = $pop->get($msgnum);
+ print @$msg;
+ $pop->delete($msgnum);
+ }
+ }
+
+ $pop->quit;
+
+=head1 DESCRIPTION
+
+This module implements a client interface to the POP3 protocol, enabling
+a perl5 application to talk to POP3 servers. This documentation assumes
+that you are familiar with the POP3 protocol described in RFC1939.
+
+A new Net::POP3 object must be created with the I<new> method. Once
+this has been done, all POP3 commands are accessed via method calls
+on the object.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ HOST ] [, OPTIONS ] 0
+
+This is the constructor for a new Net::POP3 object. C<HOST> is the
+name of the remote host to which an POP3 connection is required.
+
+C<HOST> is optional. If C<HOST> is not given then it may instead be
+passed as the C<Host> option described below. If neither is given then
+the C<POP3_Hosts> specified in C<Net::Config> will be used.
+
+C<OPTIONS> are passed in a hash like fashion, using key and value pairs.
+Possible options are:
+
+B<Host> - POP3 host to connect to. It may be a single scalar, as defined for
+the C<PeerAddr> option in L<IO::Socket::INET>, or a reference to
+an array with hosts to try in turn. The L</host> method will return the value
+which was used to connect to the host.
+
+B<ResvPort> - If given then the socket for the C<Net::POP3> object
+will be bound to the local port given using C<bind> when the socket is
+created.
+
+B<Timeout> - Maximum time, in seconds, to wait for a response from the
+POP3 server (default: 120)
+
+B<Debug> - Enable debugging information
+
+=back
+
+=head1 METHODS
+
+Unless otherwise stated all methods return either a I<true> or I<false>
+value, with I<true> meaning that the operation was a success. When a method
+states that it returns a value, failure will be returned as I<undef> or an
+empty list.
+
+=over 4
+
+=item auth ( USERNAME, PASSWORD )
+
+Attempt SASL authentication.
+
+=item user ( USER )
+
+Send the USER command.
+
+=item pass ( PASS )
+
+Send the PASS command. Returns the number of messages in the mailbox.
+
+=item login ( [ USER [, PASS ]] )
+
+Send both the USER and PASS commands. If C<PASS> is not given the
+C<Net::POP3> uses C<Net::Netrc> to lookup the password using the host
+and username. If the username is not specified then the current user name
+will be used.
+
+Returns the number of messages in the mailbox. However if there are no
+messages on the server the string C<"0E0"> will be returned. This is
+will give a true value in a boolean context, but zero in a numeric context.
+
+If there was an error authenticating the user then I<undef> will be returned.
+
+=item apop ( [ USER [, PASS ]] )
+
+Authenticate with the server identifying as C<USER> with password C<PASS>.
+Similar to L</login>, but the password is not sent in clear text.
+
+To use this method you must have the Digest::MD5 or the MD5 module installed,
+otherwise this method will return I<undef>.
+
+=item banner ()
+
+Return the sever's connection banner
+
+=item capa ()
+
+Return a reference to a hash of the capabilities of the server. APOP
+is added as a pseudo capability. Note that I've been unable to
+find a list of the standard capability values, and some appear to
+be multi-word and some are not. We make an attempt at intelligently
+parsing them, but it may not be correct.
+
+=item capabilities ()
+
+Just like capa, but only uses a cache from the last time we asked
+the server, so as to avoid asking more than once.
+
+=item top ( MSGNUM [, NUMLINES ] )
+
+Get the header and the first C<NUMLINES> of the body for the message
+C<MSGNUM>. Returns a reference to an array which contains the lines of text
+read from the server.
+
+=item list ( [ MSGNUM ] )
+
+If called with an argument the C<list> returns the size of the message
+in octets.
+
+If called without arguments a reference to a hash is returned. The
+keys will be the C<MSGNUM>'s of all undeleted messages and the values will
+be their size in octets.
+
+=item get ( MSGNUM [, FH ] )
+
+Get the message C<MSGNUM> from the remote mailbox. If C<FH> is not given
+then get returns a reference to an array which contains the lines of
+text read from the server. If C<FH> is given then the lines returned
+from the server are printed to the filehandle C<FH>.
+
+=item getfh ( MSGNUM )
+
+As per get(), but returns a tied filehandle. Reading from this
+filehandle returns the requested message. The filehandle will return
+EOF at the end of the message and should not be reused.
+
+=item last ()
+
+Returns the highest C<MSGNUM> of all the messages accessed.
+
+=item popstat ()
+
+Returns a list of two elements. These are the number of undeleted
+elements and the size of the mbox in octets.
+
+=item ping ( USER )
+
+Returns a list of two elements. These are the number of new messages
+and the total number of messages for C<USER>.
+
+=item uidl ( [ MSGNUM ] )
+
+Returns a unique identifier for C<MSGNUM> if given. If C<MSGNUM> is not
+given C<uidl> returns a reference to a hash where the keys are the
+message numbers and the values are the unique identifiers.
+
+=item delete ( MSGNUM )
+
+Mark message C<MSGNUM> to be deleted from the remote mailbox. All messages
+that are marked to be deleted will be removed from the remote mailbox
+when the server connection closed.
+
+=item reset ()
+
+Reset the status of the remote POP3 server. This includes resetting the
+status of all messages to not be deleted.
+
+=item quit ()
+
+Quit and close the connection to the remote POP3 server. Any messages marked
+as deleted will be deleted from the remote mailbox.
+
+=back
+
+=head1 NOTES
+
+If a C<Net::POP3> object goes out of scope before C<quit> method is called
+then the C<reset> method will called before the connection is closed. This
+means that any messages marked to be deleted will not be.
+
+=head1 SEE ALSO
+
+L<Net::Netrc>,
+L<Net::Cmd>
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-2003 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/Ping.pm b/Master/tlpkg/tlperl.straw/lib/Net/Ping.pm
new file mode 100755
index 00000000000..e9fff93eeaa
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/Ping.pm
@@ -0,0 +1,1777 @@
+package Net::Ping;
+
+require 5.002;
+require Exporter;
+
+use strict;
+use vars qw(@ISA @EXPORT $VERSION
+ $def_timeout $def_proto $def_factor
+ $max_datasize $pingstring $hires $source_verify $syn_forking);
+use Fcntl qw( F_GETFL F_SETFL O_NONBLOCK );
+use Socket qw( SOCK_DGRAM SOCK_STREAM SOCK_RAW PF_INET SOL_SOCKET SO_ERROR
+ inet_aton inet_ntoa sockaddr_in );
+use POSIX qw( ENOTCONN ECONNREFUSED ECONNRESET EINPROGRESS EWOULDBLOCK EAGAIN WNOHANG );
+use FileHandle;
+use Carp;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(pingecho);
+$VERSION = "2.36";
+
+sub SOL_IP { 0; };
+sub IP_TOS { 1; };
+
+# Constants
+
+$def_timeout = 5; # Default timeout to wait for a reply
+$def_proto = "tcp"; # Default protocol to use for pinging
+$def_factor = 1.2; # Default exponential backoff rate.
+$max_datasize = 1024; # Maximum data bytes in a packet
+# The data we exchange with the server for the stream protocol
+$pingstring = "pingschwingping!\n";
+$source_verify = 1; # Default is to verify source endpoint
+$syn_forking = 0;
+
+if ($^O =~ /Win32/i) {
+ # Hack to avoid this Win32 spewage:
+ # Your vendor has not defined POSIX macro ECONNREFUSED
+ my @pairs = (ECONNREFUSED => 10061, # "Unknown Error" Special Win32 Response?
+ ENOTCONN => 10057,
+ ECONNRESET => 10054,
+ EINPROGRESS => 10036,
+ EWOULDBLOCK => 10035,
+ );
+ while (my $name = shift @pairs) {
+ my $value = shift @pairs;
+ # When defined, these all are non-zero
+ unless (eval $name) {
+ no strict 'refs';
+ *{$name} = defined prototype \&{$name} ? sub () {$value} : sub {$value};
+ }
+ }
+# $syn_forking = 1; # XXX possibly useful in < Win2K ?
+};
+
+# h2ph "asm/socket.h"
+# require "asm/socket.ph";
+sub SO_BINDTODEVICE {25;}
+
+# Description: The pingecho() subroutine is provided for backward
+# compatibility with the original Net::Ping. It accepts a host
+# name/IP and an optional timeout in seconds. Create a tcp ping
+# object and try pinging the host. The result of the ping is returned.
+
+sub pingecho
+{
+ my ($host, # Name or IP number of host to ping
+ $timeout # Optional timeout in seconds
+ ) = @_;
+ my ($p); # A ping object
+
+ $p = Net::Ping->new("tcp", $timeout);
+ $p->ping($host); # Going out of scope closes the connection
+}
+
+# Description: The new() method creates a new ping object. Optional
+# parameters may be specified for the protocol to use, the timeout in
+# seconds and the size in bytes of additional data which should be
+# included in the packet.
+# After the optional parameters are checked, the data is constructed
+# and a socket is opened if appropriate. The object is returned.
+
+sub new
+{
+ my ($this,
+ $proto, # Optional protocol to use for pinging
+ $timeout, # Optional timeout in seconds
+ $data_size, # Optional additional bytes of data
+ $device, # Optional device to use
+ $tos, # Optional ToS to set
+ ) = @_;
+ my $class = ref($this) || $this;
+ my $self = {};
+ my ($cnt, # Count through data bytes
+ $min_datasize # Minimum data bytes required
+ );
+
+ bless($self, $class);
+
+ $proto = $def_proto unless $proto; # Determine the protocol
+ croak('Protocol for ping must be "icmp", "udp", "tcp", "syn", "stream", or "external"')
+ unless $proto =~ m/^(icmp|udp|tcp|syn|stream|external)$/;
+ $self->{"proto"} = $proto;
+
+ $timeout = $def_timeout unless $timeout; # Determine the timeout
+ croak("Default timeout for ping must be greater than 0 seconds")
+ if $timeout <= 0;
+ $self->{"timeout"} = $timeout;
+
+ $self->{"device"} = $device;
+
+ $self->{"tos"} = $tos;
+
+ $min_datasize = ($proto eq "udp") ? 1 : 0; # Determine data size
+ $data_size = $min_datasize unless defined($data_size) && $proto ne "tcp";
+ croak("Data for ping must be from $min_datasize to $max_datasize bytes")
+ if ($data_size < $min_datasize) || ($data_size > $max_datasize);
+ $data_size-- if $self->{"proto"} eq "udp"; # We provide the first byte
+ $self->{"data_size"} = $data_size;
+
+ $self->{"data"} = ""; # Construct data bytes
+ for ($cnt = 0; $cnt < $self->{"data_size"}; $cnt++)
+ {
+ $self->{"data"} .= chr($cnt % 256);
+ }
+
+ $self->{"local_addr"} = undef; # Don't bind by default
+ $self->{"retrans"} = $def_factor; # Default exponential backoff rate
+ $self->{"econnrefused"} = undef; # Default Connection refused behavior
+
+ $self->{"seq"} = 0; # For counting packets
+ if ($self->{"proto"} eq "udp") # Open a socket
+ {
+ $self->{"proto_num"} = (getprotobyname('udp'))[2] ||
+ croak("Can't udp protocol by name");
+ $self->{"port_num"} = (getservbyname('echo', 'udp'))[2] ||
+ croak("Can't get udp echo port by name");
+ $self->{"fh"} = FileHandle->new();
+ socket($self->{"fh"}, PF_INET, SOCK_DGRAM,
+ $self->{"proto_num"}) ||
+ croak("udp socket error - $!");
+ if ($self->{'device'}) {
+ setsockopt($self->{"fh"}, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'}))
+ or croak "error binding to device $self->{'device'} $!";
+ }
+ if ($self->{'tos'}) {
+ setsockopt($self->{"fh"}, SOL_IP, IP_TOS(), pack("I*", $self->{'tos'}))
+ or croak "error configuring tos to $self->{'tos'} $!";
+ }
+ }
+ elsif ($self->{"proto"} eq "icmp")
+ {
+ croak("icmp ping requires root privilege") if ($> and $^O ne 'VMS' and $^O ne 'cygwin');
+ $self->{"proto_num"} = (getprotobyname('icmp'))[2] ||
+ croak("Can't get icmp protocol by name");
+ $self->{"pid"} = $$ & 0xffff; # Save lower 16 bits of pid
+ $self->{"fh"} = FileHandle->new();
+ socket($self->{"fh"}, PF_INET, SOCK_RAW, $self->{"proto_num"}) ||
+ croak("icmp socket error - $!");
+ if ($self->{'device'}) {
+ setsockopt($self->{"fh"}, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'}))
+ or croak "error binding to device $self->{'device'} $!";
+ }
+ if ($self->{'tos'}) {
+ setsockopt($self->{"fh"}, SOL_IP, IP_TOS(), pack("I*", $self->{'tos'}))
+ or croak "error configuring tos to $self->{'tos'} $!";
+ }
+ }
+ elsif ($self->{"proto"} eq "tcp" || $self->{"proto"} eq "stream")
+ {
+ $self->{"proto_num"} = (getprotobyname('tcp'))[2] ||
+ croak("Can't get tcp protocol by name");
+ $self->{"port_num"} = (getservbyname('echo', 'tcp'))[2] ||
+ croak("Can't get tcp echo port by name");
+ $self->{"fh"} = FileHandle->new();
+ }
+ elsif ($self->{"proto"} eq "syn")
+ {
+ $self->{"proto_num"} = (getprotobyname('tcp'))[2] ||
+ croak("Can't get tcp protocol by name");
+ $self->{"port_num"} = (getservbyname('echo', 'tcp'))[2] ||
+ croak("Can't get tcp echo port by name");
+ if ($syn_forking) {
+ $self->{"fork_rd"} = FileHandle->new();
+ $self->{"fork_wr"} = FileHandle->new();
+ pipe($self->{"fork_rd"}, $self->{"fork_wr"});
+ $self->{"fh"} = FileHandle->new();
+ $self->{"good"} = {};
+ $self->{"bad"} = {};
+ } else {
+ $self->{"wbits"} = "";
+ $self->{"bad"} = {};
+ }
+ $self->{"syn"} = {};
+ $self->{"stop_time"} = 0;
+ }
+ elsif ($self->{"proto"} eq "external")
+ {
+ # No preliminary work needs to be done.
+ }
+
+ return($self);
+}
+
+# Description: Set the local IP address from which pings will be sent.
+# For ICMP and UDP pings, this calls bind() on the already-opened socket;
+# for TCP pings, just saves the address to be used when the socket is
+# opened. Returns non-zero if successful; croaks on error.
+sub bind
+{
+ my ($self,
+ $local_addr # Name or IP number of local interface
+ ) = @_;
+ my ($ip # Packed IP number of $local_addr
+ );
+
+ croak("Usage: \$p->bind(\$local_addr)") unless @_ == 2;
+ croak("already bound") if defined($self->{"local_addr"}) &&
+ ($self->{"proto"} eq "udp" || $self->{"proto"} eq "icmp");
+
+ $ip = inet_aton($local_addr);
+ croak("nonexistent local address $local_addr") unless defined($ip);
+ $self->{"local_addr"} = $ip; # Only used if proto is tcp
+
+ if ($self->{"proto"} eq "udp" || $self->{"proto"} eq "icmp")
+ {
+ CORE::bind($self->{"fh"}, sockaddr_in(0, $ip)) ||
+ croak("$self->{'proto'} bind error - $!");
+ }
+ elsif (($self->{"proto"} ne "tcp") && ($self->{"proto"} ne "syn"))
+ {
+ croak("Unknown protocol \"$self->{proto}\" in bind()");
+ }
+
+ return 1;
+}
+
+# Description: A select() wrapper that compensates for platform
+# peculiarities.
+sub mselect
+{
+ if ($_[3] > 0 and $^O eq 'MSWin32') {
+ # On windows, select() doesn't process the message loop,
+ # but sleep() will, allowing alarm() to interrupt the latter.
+ # So we chop up the timeout into smaller pieces and interleave
+ # select() and sleep() calls.
+ my $t = $_[3];
+ my $gran = 0.5; # polling granularity in seconds
+ my @args = @_;
+ while (1) {
+ $gran = $t if $gran > $t;
+ my $nfound = select($_[0], $_[1], $_[2], $gran);
+ undef $nfound if $nfound == -1;
+ $t -= $gran;
+ return $nfound if $nfound or !defined($nfound) or $t <= 0;
+
+ sleep(0);
+ ($_[0], $_[1], $_[2]) = @args;
+ }
+ }
+ else {
+ my $nfound = select($_[0], $_[1], $_[2], $_[3]);
+ undef $nfound if $nfound == -1;
+ return $nfound;
+ }
+}
+
+# Description: Allow UDP source endpoint comparison to be
+# skipped for those remote interfaces that do
+# not response from the same endpoint.
+
+sub source_verify
+{
+ my $self = shift;
+ $source_verify = 1 unless defined
+ ($source_verify = ((defined $self) && (ref $self)) ? shift() : $self);
+}
+
+# Description: Set whether or not the connect
+# behavior should enforce remote service
+# availability as well as reachability.
+
+sub service_check
+{
+ my $self = shift;
+ $self->{"econnrefused"} = 1 unless defined
+ ($self->{"econnrefused"} = shift());
+}
+
+sub tcp_service_check
+{
+ service_check(@_);
+}
+
+# Description: Set exponential backoff for retransmission.
+# Should be > 1 to retain exponential properties.
+# If set to 0, retransmissions are disabled.
+
+sub retrans
+{
+ my $self = shift;
+ $self->{"retrans"} = shift;
+}
+
+# Description: allows the module to use milliseconds as returned by
+# the Time::HiRes module
+
+$hires = 0;
+sub hires
+{
+ my $self = shift;
+ $hires = 1 unless defined
+ ($hires = ((defined $self) && (ref $self)) ? shift() : $self);
+ require Time::HiRes if $hires;
+}
+
+sub time
+{
+ return $hires ? Time::HiRes::time() : CORE::time();
+}
+
+# Description: Sets or clears the O_NONBLOCK flag on a file handle.
+sub socket_blocking_mode
+{
+ my ($self,
+ $fh, # the file handle whose flags are to be modified
+ $block) = @_; # if true then set the blocking
+ # mode (clear O_NONBLOCK), otherwise
+ # set the non-blocking mode (set O_NONBLOCK)
+
+ my $flags;
+ if ($^O eq 'MSWin32' || $^O eq 'VMS') {
+ # FIONBIO enables non-blocking sockets on windows and vms.
+ # FIONBIO is (0x80000000|(4<<16)|(ord('f')<<8)|126), as per winsock.h, ioctl.h
+ my $f = 0x8004667e;
+ my $v = pack("L", $block ? 0 : 1);
+ ioctl($fh, $f, $v) or croak("ioctl failed: $!");
+ return;
+ }
+ if ($flags = fcntl($fh, F_GETFL, 0)) {
+ $flags = $block ? ($flags & ~O_NONBLOCK) : ($flags | O_NONBLOCK);
+ if (!fcntl($fh, F_SETFL, $flags)) {
+ croak("fcntl F_SETFL: $!");
+ }
+ } else {
+ croak("fcntl F_GETFL: $!");
+ }
+}
+
+# Description: Ping a host name or IP number with an optional timeout.
+# First lookup the host, and return undef if it is not found. Otherwise
+# perform the specific ping method based on the protocol. Return the
+# result of the ping.
+
+sub ping
+{
+ my ($self,
+ $host, # Name or IP number of host to ping
+ $timeout, # Seconds after which ping times out
+ ) = @_;
+ my ($ip, # Packed IP number of $host
+ $ret, # The return value
+ $ping_time, # When ping began
+ );
+
+ croak("Usage: \$p->ping(\$host [, \$timeout])") unless @_ == 2 || @_ == 3;
+ $timeout = $self->{"timeout"} unless $timeout;
+ croak("Timeout must be greater than 0 seconds") if $timeout <= 0;
+
+ $ip = inet_aton($host);
+ return () unless defined($ip); # Does host exist?
+
+ # Dispatch to the appropriate routine.
+ $ping_time = &time();
+ if ($self->{"proto"} eq "external") {
+ $ret = $self->ping_external($ip, $timeout);
+ }
+ elsif ($self->{"proto"} eq "udp") {
+ $ret = $self->ping_udp($ip, $timeout);
+ }
+ elsif ($self->{"proto"} eq "icmp") {
+ $ret = $self->ping_icmp($ip, $timeout);
+ }
+ elsif ($self->{"proto"} eq "tcp") {
+ $ret = $self->ping_tcp($ip, $timeout);
+ }
+ elsif ($self->{"proto"} eq "stream") {
+ $ret = $self->ping_stream($ip, $timeout);
+ }
+ elsif ($self->{"proto"} eq "syn") {
+ $ret = $self->ping_syn($host, $ip, $ping_time, $ping_time+$timeout);
+ } else {
+ croak("Unknown protocol \"$self->{proto}\" in ping()");
+ }
+
+ return wantarray ? ($ret, &time() - $ping_time, inet_ntoa($ip)) : $ret;
+}
+
+# Uses Net::Ping::External to do an external ping.
+sub ping_external {
+ my ($self,
+ $ip, # Packed IP number of the host
+ $timeout # Seconds after which ping times out
+ ) = @_;
+
+ eval { require Net::Ping::External; }
+ or croak('Protocol "external" not supported on your system: Net::Ping::External not found');
+ return Net::Ping::External::ping(ip => $ip, timeout => $timeout);
+}
+
+use constant ICMP_ECHOREPLY => 0; # ICMP packet types
+use constant ICMP_UNREACHABLE => 3; # ICMP packet types
+use constant ICMP_ECHO => 8;
+use constant ICMP_STRUCT => "C2 n3 A"; # Structure of a minimal ICMP packet
+use constant SUBCODE => 0; # No ICMP subcode for ECHO and ECHOREPLY
+use constant ICMP_FLAGS => 0; # No special flags for send or recv
+use constant ICMP_PORT => 0; # No port with ICMP
+
+sub ping_icmp
+{
+ my ($self,
+ $ip, # Packed IP number of the host
+ $timeout # Seconds after which ping times out
+ ) = @_;
+
+ my ($saddr, # sockaddr_in with port and ip
+ $checksum, # Checksum of ICMP packet
+ $msg, # ICMP packet to send
+ $len_msg, # Length of $msg
+ $rbits, # Read bits, filehandles for reading
+ $nfound, # Number of ready filehandles found
+ $finish_time, # Time ping should be finished
+ $done, # set to 1 when we are done
+ $ret, # Return value
+ $recv_msg, # Received message including IP header
+ $from_saddr, # sockaddr_in of sender
+ $from_port, # Port packet was sent from
+ $from_ip, # Packed IP of sender
+ $from_type, # ICMP type
+ $from_subcode, # ICMP subcode
+ $from_chk, # ICMP packet checksum
+ $from_pid, # ICMP packet id
+ $from_seq, # ICMP packet sequence
+ $from_msg # ICMP message
+ );
+
+ $self->{"seq"} = ($self->{"seq"} + 1) % 65536; # Increment sequence
+ $checksum = 0; # No checksum for starters
+ $msg = pack(ICMP_STRUCT . $self->{"data_size"}, ICMP_ECHO, SUBCODE,
+ $checksum, $self->{"pid"}, $self->{"seq"}, $self->{"data"});
+ $checksum = Net::Ping->checksum($msg);
+ $msg = pack(ICMP_STRUCT . $self->{"data_size"}, ICMP_ECHO, SUBCODE,
+ $checksum, $self->{"pid"}, $self->{"seq"}, $self->{"data"});
+ $len_msg = length($msg);
+ $saddr = sockaddr_in(ICMP_PORT, $ip);
+ $self->{"from_ip"} = undef;
+ $self->{"from_type"} = undef;
+ $self->{"from_subcode"} = undef;
+ send($self->{"fh"}, $msg, ICMP_FLAGS, $saddr); # Send the message
+
+ $rbits = "";
+ vec($rbits, $self->{"fh"}->fileno(), 1) = 1;
+ $ret = 0;
+ $done = 0;
+ $finish_time = &time() + $timeout; # Must be done by this time
+ while (!$done && $timeout > 0) # Keep trying if we have time
+ {
+ $nfound = mselect((my $rout=$rbits), undef, undef, $timeout); # Wait for packet
+ $timeout = $finish_time - &time(); # Get remaining time
+ if (!defined($nfound)) # Hmm, a strange error
+ {
+ $ret = undef;
+ $done = 1;
+ }
+ elsif ($nfound) # Got a packet from somewhere
+ {
+ $recv_msg = "";
+ $from_pid = -1;
+ $from_seq = -1;
+ $from_saddr = recv($self->{"fh"}, $recv_msg, 1500, ICMP_FLAGS);
+ ($from_port, $from_ip) = sockaddr_in($from_saddr);
+ ($from_type, $from_subcode) = unpack("C2", substr($recv_msg, 20, 2));
+ if ($from_type == ICMP_ECHOREPLY) {
+ ($from_pid, $from_seq) = unpack("n3", substr($recv_msg, 24, 4))
+ if length $recv_msg >= 28;
+ } else {
+ ($from_pid, $from_seq) = unpack("n3", substr($recv_msg, 52, 4))
+ if length $recv_msg >= 56;
+ }
+ $self->{"from_ip"} = $from_ip;
+ $self->{"from_type"} = $from_type;
+ $self->{"from_subcode"} = $from_subcode;
+ if (($from_pid == $self->{"pid"}) && # Does the packet check out?
+ (! $source_verify || (inet_ntoa($from_ip) eq inet_ntoa($ip))) &&
+ ($from_seq == $self->{"seq"})) {
+ if ($from_type == ICMP_ECHOREPLY) {
+ $ret = 1;
+ $done = 1;
+ } elsif ($from_type == ICMP_UNREACHABLE) {
+ $done = 1;
+ }
+ }
+ } else { # Oops, timed out
+ $done = 1;
+ }
+ }
+ return $ret;
+}
+
+sub icmp_result {
+ my ($self) = @_;
+ my $ip = $self->{"from_ip"} || "";
+ $ip = "\0\0\0\0" unless 4 == length $ip;
+ return (inet_ntoa($ip),($self->{"from_type"} || 0), ($self->{"from_subcode"} || 0));
+}
+
+# Description: Do a checksum on the message. Basically sum all of
+# the short words and fold the high order bits into the low order bits.
+
+sub checksum
+{
+ my ($class,
+ $msg # The message to checksum
+ ) = @_;
+ my ($len_msg, # Length of the message
+ $num_short, # The number of short words in the message
+ $short, # One short word
+ $chk # The checksum
+ );
+
+ $len_msg = length($msg);
+ $num_short = int($len_msg / 2);
+ $chk = 0;
+ foreach $short (unpack("n$num_short", $msg))
+ {
+ $chk += $short;
+ } # Add the odd byte in
+ $chk += (unpack("C", substr($msg, $len_msg - 1, 1)) << 8) if $len_msg % 2;
+ $chk = ($chk >> 16) + ($chk & 0xffff); # Fold high into low
+ return(~(($chk >> 16) + $chk) & 0xffff); # Again and complement
+}
+
+
+# Description: Perform a tcp echo ping. Since a tcp connection is
+# host specific, we have to open and close each connection here. We
+# can't just leave a socket open. Because of the robust nature of
+# tcp, it will take a while before it gives up trying to establish a
+# connection. Therefore, we use select() on a non-blocking socket to
+# check against our timeout. No data bytes are actually
+# sent since the successful establishment of a connection is proof
+# enough of the reachability of the remote host. Also, tcp is
+# expensive and doesn't need our help to add to the overhead.
+
+sub ping_tcp
+{
+ my ($self,
+ $ip, # Packed IP number of the host
+ $timeout # Seconds after which ping times out
+ ) = @_;
+ my ($ret # The return value
+ );
+
+ $! = 0;
+ $ret = $self -> tcp_connect( $ip, $timeout);
+ if (!$self->{"econnrefused"} &&
+ $! == ECONNREFUSED) {
+ $ret = 1; # "Connection refused" means reachable
+ }
+ $self->{"fh"}->close();
+ return $ret;
+}
+
+sub tcp_connect
+{
+ my ($self,
+ $ip, # Packed IP number of the host
+ $timeout # Seconds after which connect times out
+ ) = @_;
+ my ($saddr); # Packed IP and Port
+
+ $saddr = sockaddr_in($self->{"port_num"}, $ip);
+
+ my $ret = 0; # Default to unreachable
+
+ my $do_socket = sub {
+ socket($self->{"fh"}, PF_INET, SOCK_STREAM, $self->{"proto_num"}) ||
+ croak("tcp socket error - $!");
+ if (defined $self->{"local_addr"} &&
+ !CORE::bind($self->{"fh"}, sockaddr_in(0, $self->{"local_addr"}))) {
+ croak("tcp bind error - $!");
+ }
+ if ($self->{'device'}) {
+ setsockopt($self->{"fh"}, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'}))
+ or croak("error binding to device $self->{'device'} $!");
+ }
+ if ($self->{'tos'}) {
+ setsockopt($self->{"fh"}, SOL_IP, IP_TOS(), pack("I*", $self->{'tos'}))
+ or croak "error configuring tos to $self->{'tos'} $!";
+ }
+ };
+ my $do_connect = sub {
+ $self->{"ip"} = $ip;
+ # ECONNREFUSED is 10061 on MSWin32. If we pass it as child error through $?,
+ # we'll get (10061 & 255) = 77, so we cannot check it in the parent process.
+ return ($ret = connect($self->{"fh"}, $saddr) || ($! == ECONNREFUSED && !$self->{"econnrefused"}));
+ };
+ my $do_connect_nb = sub {
+ # Set O_NONBLOCK property on filehandle
+ $self->socket_blocking_mode($self->{"fh"}, 0);
+
+ # start the connection attempt
+ if (!connect($self->{"fh"}, $saddr)) {
+ if ($! == ECONNREFUSED) {
+ $ret = 1 unless $self->{"econnrefused"};
+ } elsif ($! != EINPROGRESS && ($^O ne 'MSWin32' || $! != EWOULDBLOCK)) {
+ # EINPROGRESS is the expected error code after a connect()
+ # on a non-blocking socket. But if the kernel immediately
+ # determined that this connect() will never work,
+ # Simply respond with "unreachable" status.
+ # (This can occur on some platforms with errno
+ # EHOSTUNREACH or ENETUNREACH.)
+ return 0;
+ } else {
+ # Got the expected EINPROGRESS.
+ # Just wait for connection completion...
+ my ($wbits, $wout, $wexc);
+ $wout = $wexc = $wbits = "";
+ vec($wbits, $self->{"fh"}->fileno, 1) = 1;
+
+ my $nfound = mselect(undef,
+ ($wout = $wbits),
+ ($^O eq 'MSWin32' ? ($wexc = $wbits) : undef),
+ $timeout);
+ warn("select: $!") unless defined $nfound;
+
+ if ($nfound && vec($wout, $self->{"fh"}->fileno, 1)) {
+ # the socket is ready for writing so the connection
+ # attempt completed. test whether the connection
+ # attempt was successful or not
+
+ if (getpeername($self->{"fh"})) {
+ # Connection established to remote host
+ $ret = 1;
+ } else {
+ # TCP ACK will never come from this host
+ # because there was an error connecting.
+
+ # This should set $! to the correct error.
+ my $char;
+ sysread($self->{"fh"},$char,1);
+ $! = ECONNREFUSED if ($! == EAGAIN && $^O =~ /cygwin/i);
+
+ $ret = 1 if (!$self->{"econnrefused"}
+ && $! == ECONNREFUSED);
+ }
+ } else {
+ # the connection attempt timed out (or there were connect
+ # errors on Windows)
+ if ($^O =~ 'MSWin32') {
+ # If the connect will fail on a non-blocking socket,
+ # winsock reports ECONNREFUSED as an exception, and we
+ # need to fetch the socket-level error code via getsockopt()
+ # instead of using the thread-level error code that is in $!.
+ if ($nfound && vec($wexc, $self->{"fh"}->fileno, 1)) {
+ $! = unpack("i", getsockopt($self->{"fh"}, SOL_SOCKET,
+ SO_ERROR));
+ }
+ }
+ }
+ }
+ } else {
+ # Connection established to remote host
+ $ret = 1;
+ }
+
+ # Unset O_NONBLOCK property on filehandle
+ $self->socket_blocking_mode($self->{"fh"}, 1);
+ $self->{"ip"} = $ip;
+ return $ret;
+ };
+
+ if ($syn_forking) {
+ # Buggy Winsock API doesn't allow nonblocking connect.
+ # Hence, if our OS is Windows, we need to create a separate
+ # process to do the blocking connect attempt.
+ # XXX Above comments are not true at least for Win2K, where
+ # nonblocking connect works.
+
+ $| = 1; # Clear buffer prior to fork to prevent duplicate flushing.
+ $self->{'tcp_chld'} = fork;
+ if (!$self->{'tcp_chld'}) {
+ if (!defined $self->{'tcp_chld'}) {
+ # Fork did not work
+ warn "Fork error: $!";
+ return 0;
+ }
+ &{ $do_socket }();
+
+ # Try a slow blocking connect() call
+ # and report the status to the parent.
+ if ( &{ $do_connect }() ) {
+ $self->{"fh"}->close();
+ # No error
+ exit 0;
+ } else {
+ # Pass the error status to the parent
+ # Make sure that $! <= 255
+ exit($! <= 255 ? $! : 255);
+ }
+ }
+
+ &{ $do_socket }();
+
+ my $patience = &time() + $timeout;
+
+ my ($child, $child_errno);
+ $? = 0; $child_errno = 0;
+ # Wait up to the timeout
+ # And clean off the zombie
+ do {
+ $child = waitpid($self->{'tcp_chld'}, &WNOHANG());
+ $child_errno = $? >> 8;
+ select(undef, undef, undef, 0.1);
+ } while &time() < $patience && $child != $self->{'tcp_chld'};
+
+ if ($child == $self->{'tcp_chld'}) {
+ if ($self->{"proto"} eq "stream") {
+ # We need the socket connected here, in parent
+ # Should be safe to connect because the child finished
+ # within the timeout
+ &{ $do_connect }();
+ }
+ # $ret cannot be set by the child process
+ $ret = !$child_errno;
+ } else {
+ # Time must have run out.
+ # Put that choking client out of its misery
+ kill "KILL", $self->{'tcp_chld'};
+ # Clean off the zombie
+ waitpid($self->{'tcp_chld'}, 0);
+ $ret = 0;
+ }
+ delete $self->{'tcp_chld'};
+ $! = $child_errno;
+ } else {
+ # Otherwise don't waste the resources to fork
+
+ &{ $do_socket }();
+
+ &{ $do_connect_nb }();
+ }
+
+ return $ret;
+}
+
+sub DESTROY {
+ my $self = shift;
+ if ($self->{'proto'} eq 'tcp' &&
+ $self->{'tcp_chld'}) {
+ # Put that choking client out of its misery
+ kill "KILL", $self->{'tcp_chld'};
+ # Clean off the zombie
+ waitpid($self->{'tcp_chld'}, 0);
+ }
+}
+
+# This writes the given string to the socket and then reads it
+# back. It returns 1 on success, 0 on failure.
+sub tcp_echo
+{
+ my $self = shift;
+ my $timeout = shift;
+ my $pingstring = shift;
+
+ my $ret = undef;
+ my $time = &time();
+ my $wrstr = $pingstring;
+ my $rdstr = "";
+
+ eval <<'EOM';
+ do {
+ my $rin = "";
+ vec($rin, $self->{"fh"}->fileno(), 1) = 1;
+
+ my $rout = undef;
+ if($wrstr) {
+ $rout = "";
+ vec($rout, $self->{"fh"}->fileno(), 1) = 1;
+ }
+
+ if(mselect($rin, $rout, undef, ($time + $timeout) - &time())) {
+
+ if($rout && vec($rout,$self->{"fh"}->fileno(),1)) {
+ my $num = syswrite($self->{"fh"}, $wrstr, length $wrstr);
+ if($num) {
+ # If it was a partial write, update and try again.
+ $wrstr = substr($wrstr,$num);
+ } else {
+ # There was an error.
+ $ret = 0;
+ }
+ }
+
+ if(vec($rin,$self->{"fh"}->fileno(),1)) {
+ my $reply;
+ if(sysread($self->{"fh"},$reply,length($pingstring)-length($rdstr))) {
+ $rdstr .= $reply;
+ $ret = 1 if $rdstr eq $pingstring;
+ } else {
+ # There was an error.
+ $ret = 0;
+ }
+ }
+
+ }
+ } until &time() > ($time + $timeout) || defined($ret);
+EOM
+
+ return $ret;
+}
+
+
+
+
+# Description: Perform a stream ping. If the tcp connection isn't
+# already open, it opens it. It then sends some data and waits for
+# a reply. It leaves the stream open on exit.
+
+sub ping_stream
+{
+ my ($self,
+ $ip, # Packed IP number of the host
+ $timeout # Seconds after which ping times out
+ ) = @_;
+
+ # Open the stream if it's not already open
+ if(!defined $self->{"fh"}->fileno()) {
+ $self->tcp_connect($ip, $timeout) or return 0;
+ }
+
+ croak "tried to switch servers while stream pinging"
+ if $self->{"ip"} ne $ip;
+
+ return $self->tcp_echo($timeout, $pingstring);
+}
+
+# Description: opens the stream. You would do this if you want to
+# separate the overhead of opening the stream from the first ping.
+
+sub open
+{
+ my ($self,
+ $host, # Host or IP address
+ $timeout # Seconds after which open times out
+ ) = @_;
+
+ my ($ip); # Packed IP number of the host
+ $ip = inet_aton($host);
+ $timeout = $self->{"timeout"} unless $timeout;
+
+ if($self->{"proto"} eq "stream") {
+ if(defined($self->{"fh"}->fileno())) {
+ croak("socket is already open");
+ } else {
+ $self->tcp_connect($ip, $timeout);
+ }
+ }
+}
+
+
+# Description: Perform a udp echo ping. Construct a message of
+# at least the one-byte sequence number and any additional data bytes.
+# Send the message out and wait for a message to come back. If we
+# get a message, make sure all of its parts match. If they do, we are
+# done. Otherwise go back and wait for the message until we run out
+# of time. Return the result of our efforts.
+
+use constant UDP_FLAGS => 0; # Nothing special on send or recv
+sub ping_udp
+{
+ my ($self,
+ $ip, # Packed IP number of the host
+ $timeout # Seconds after which ping times out
+ ) = @_;
+
+ my ($saddr, # sockaddr_in with port and ip
+ $ret, # The return value
+ $msg, # Message to be echoed
+ $finish_time, # Time ping should be finished
+ $flush, # Whether socket needs to be disconnected
+ $connect, # Whether socket needs to be connected
+ $done, # Set to 1 when we are done pinging
+ $rbits, # Read bits, filehandles for reading
+ $nfound, # Number of ready filehandles found
+ $from_saddr, # sockaddr_in of sender
+ $from_msg, # Characters echoed by $host
+ $from_port, # Port message was echoed from
+ $from_ip # Packed IP number of sender
+ );
+
+ $saddr = sockaddr_in($self->{"port_num"}, $ip);
+ $self->{"seq"} = ($self->{"seq"} + 1) % 256; # Increment sequence
+ $msg = chr($self->{"seq"}) . $self->{"data"}; # Add data if any
+
+ if ($self->{"connected"}) {
+ if ($self->{"connected"} ne $saddr) {
+ # Still connected to wrong destination.
+ # Need to flush out the old one.
+ $flush = 1;
+ }
+ } else {
+ # Not connected yet.
+ # Need to connect() before send()
+ $connect = 1;
+ }
+
+ # Have to connect() and send() instead of sendto()
+ # in order to pick up on the ECONNREFUSED setting
+ # from recv() or double send() errno as utilized in
+ # the concept by rdw @ perlmonks. See:
+ # http://perlmonks.thepen.com/42898.html
+ if ($flush) {
+ # Need to socket() again to flush the descriptor
+ # This will disconnect from the old saddr.
+ socket($self->{"fh"}, PF_INET, SOCK_DGRAM,
+ $self->{"proto_num"});
+ }
+ # Connect the socket if it isn't already connected
+ # to the right destination.
+ if ($flush || $connect) {
+ connect($self->{"fh"}, $saddr); # Tie destination to socket
+ $self->{"connected"} = $saddr;
+ }
+ send($self->{"fh"}, $msg, UDP_FLAGS); # Send it
+
+ $rbits = "";
+ vec($rbits, $self->{"fh"}->fileno(), 1) = 1;
+ $ret = 0; # Default to unreachable
+ $done = 0;
+ my $retrans = 0.01;
+ my $factor = $self->{"retrans"};
+ $finish_time = &time() + $timeout; # Ping needs to be done by then
+ while (!$done && $timeout > 0)
+ {
+ if ($factor > 1)
+ {
+ $timeout = $retrans if $timeout > $retrans;
+ $retrans*= $factor; # Exponential backoff
+ }
+ $nfound = mselect((my $rout=$rbits), undef, undef, $timeout); # Wait for response
+ my $why = $!;
+ $timeout = $finish_time - &time(); # Get remaining time
+
+ if (!defined($nfound)) # Hmm, a strange error
+ {
+ $ret = undef;
+ $done = 1;
+ }
+ elsif ($nfound) # A packet is waiting
+ {
+ $from_msg = "";
+ $from_saddr = recv($self->{"fh"}, $from_msg, 1500, UDP_FLAGS);
+ if (!$from_saddr) {
+ # For example an unreachable host will make recv() fail.
+ if (!$self->{"econnrefused"} &&
+ ($! == ECONNREFUSED ||
+ $! == ECONNRESET)) {
+ # "Connection refused" means reachable
+ # Good, continue
+ $ret = 1;
+ }
+ $done = 1;
+ } else {
+ ($from_port, $from_ip) = sockaddr_in($from_saddr);
+ if (!$source_verify ||
+ (($from_ip eq $ip) && # Does the packet check out?
+ ($from_port == $self->{"port_num"}) &&
+ ($from_msg eq $msg)))
+ {
+ $ret = 1; # It's a winner
+ $done = 1;
+ }
+ }
+ }
+ elsif ($timeout <= 0) # Oops, timed out
+ {
+ $done = 1;
+ }
+ else
+ {
+ # Send another in case the last one dropped
+ if (send($self->{"fh"}, $msg, UDP_FLAGS)) {
+ # Another send worked? The previous udp packet
+ # must have gotten lost or is still in transit.
+ # Hopefully this new packet will arrive safely.
+ } else {
+ if (!$self->{"econnrefused"} &&
+ $! == ECONNREFUSED) {
+ # "Connection refused" means reachable
+ # Good, continue
+ $ret = 1;
+ }
+ $done = 1;
+ }
+ }
+ }
+ return $ret;
+}
+
+# Description: Send a TCP SYN packet to host specified.
+sub ping_syn
+{
+ my $self = shift;
+ my $host = shift;
+ my $ip = shift;
+ my $start_time = shift;
+ my $stop_time = shift;
+
+ if ($syn_forking) {
+ return $self->ping_syn_fork($host, $ip, $start_time, $stop_time);
+ }
+
+ my $fh = FileHandle->new();
+ my $saddr = sockaddr_in($self->{"port_num"}, $ip);
+
+ # Create TCP socket
+ if (!socket ($fh, PF_INET, SOCK_STREAM, $self->{"proto_num"})) {
+ croak("tcp socket error - $!");
+ }
+
+ if (defined $self->{"local_addr"} &&
+ !CORE::bind($fh, sockaddr_in(0, $self->{"local_addr"}))) {
+ croak("tcp bind error - $!");
+ }
+
+ if ($self->{'device'}) {
+ setsockopt($fh, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'}))
+ or croak("error binding to device $self->{'device'} $!");
+ }
+ if ($self->{'tos'}) {
+ setsockopt($fh, SOL_IP, IP_TOS(), pack("I*", $self->{'tos'}))
+ or croak "error configuring tos to $self->{'tos'} $!";
+ }
+ # Set O_NONBLOCK property on filehandle
+ $self->socket_blocking_mode($fh, 0);
+
+ # Attempt the non-blocking connect
+ # by just sending the TCP SYN packet
+ if (connect($fh, $saddr)) {
+ # Non-blocking, yet still connected?
+ # Must have connected very quickly,
+ # or else it wasn't very non-blocking.
+ #warn "WARNING: Nonblocking connect connected anyway? ($^O)";
+ } else {
+ # Error occurred connecting.
+ if ($! == EINPROGRESS || ($^O eq 'MSWin32' && $! == EWOULDBLOCK)) {
+ # The connection is just still in progress.
+ # This is the expected condition.
+ } else {
+ # Just save the error and continue on.
+ # The ack() can check the status later.
+ $self->{"bad"}->{$host} = $!;
+ }
+ }
+
+ my $entry = [ $host, $ip, $fh, $start_time, $stop_time ];
+ $self->{"syn"}->{$fh->fileno} = $entry;
+ if ($self->{"stop_time"} < $stop_time) {
+ $self->{"stop_time"} = $stop_time;
+ }
+ vec($self->{"wbits"}, $fh->fileno, 1) = 1;
+
+ return 1;
+}
+
+sub ping_syn_fork {
+ my ($self, $host, $ip, $start_time, $stop_time) = @_;
+
+ # Buggy Winsock API doesn't allow nonblocking connect.
+ # Hence, if our OS is Windows, we need to create a separate
+ # process to do the blocking connect attempt.
+ my $pid = fork();
+ if (defined $pid) {
+ if ($pid) {
+ # Parent process
+ my $entry = [ $host, $ip, $pid, $start_time, $stop_time ];
+ $self->{"syn"}->{$pid} = $entry;
+ if ($self->{"stop_time"} < $stop_time) {
+ $self->{"stop_time"} = $stop_time;
+ }
+ } else {
+ # Child process
+ my $saddr = sockaddr_in($self->{"port_num"}, $ip);
+
+ # Create TCP socket
+ if (!socket ($self->{"fh"}, PF_INET, SOCK_STREAM, $self->{"proto_num"})) {
+ croak("tcp socket error - $!");
+ }
+
+ if (defined $self->{"local_addr"} &&
+ !CORE::bind($self->{"fh"}, sockaddr_in(0, $self->{"local_addr"}))) {
+ croak("tcp bind error - $!");
+ }
+
+ if ($self->{'device'}) {
+ setsockopt($self->{"fh"}, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'}))
+ or croak("error binding to device $self->{'device'} $!");
+ }
+ if ($self->{'tos'}) {
+ setsockopt($self->{"fh"}, SOL_IP, IP_TOS(), pack("I*", $self->{'tos'}))
+ or croak "error configuring tos to $self->{'tos'} $!";
+ }
+
+ $!=0;
+ # Try to connect (could take a long time)
+ connect($self->{"fh"}, $saddr);
+ # Notify parent of connect error status
+ my $err = $!+0;
+ my $wrstr = "$$ $err";
+ # Force to 16 chars including \n
+ $wrstr .= " "x(15 - length $wrstr). "\n";
+ syswrite($self->{"fork_wr"}, $wrstr, length $wrstr);
+ exit;
+ }
+ } else {
+ # fork() failed?
+ die "fork: $!";
+ }
+ return 1;
+}
+
+# Description: Wait for TCP ACK from host specified
+# from ping_syn above. If no host is specified, wait
+# for TCP ACK from any of the hosts in the SYN queue.
+sub ack
+{
+ my $self = shift;
+
+ if ($self->{"proto"} eq "syn") {
+ if ($syn_forking) {
+ my @answer = $self->ack_unfork(shift);
+ return wantarray ? @answer : $answer[0];
+ }
+ my $wbits = "";
+ my $stop_time = 0;
+ if (my $host = shift) {
+ # Host passed as arg
+ if (exists $self->{"bad"}->{$host}) {
+ if (!$self->{"econnrefused"} &&
+ $self->{"bad"}->{ $host } &&
+ (($! = ECONNREFUSED)>0) &&
+ $self->{"bad"}->{ $host } eq "$!") {
+ # "Connection refused" means reachable
+ # Good, continue
+ } else {
+ # ECONNREFUSED means no good
+ return ();
+ }
+ }
+ my $host_fd = undef;
+ foreach my $fd (keys %{ $self->{"syn"} }) {
+ my $entry = $self->{"syn"}->{$fd};
+ if ($entry->[0] eq $host) {
+ $host_fd = $fd;
+ $stop_time = $entry->[4]
+ || croak("Corrupted SYN entry for [$host]");
+ last;
+ }
+ }
+ croak("ack called on [$host] without calling ping first!")
+ unless defined $host_fd;
+ vec($wbits, $host_fd, 1) = 1;
+ } else {
+ # No $host passed so scan all hosts
+ # Use the latest stop_time
+ $stop_time = $self->{"stop_time"};
+ # Use all the bits
+ $wbits = $self->{"wbits"};
+ }
+
+ while ($wbits !~ /^\0*\z/) {
+ my $timeout = $stop_time - &time();
+ # Force a minimum of 10 ms timeout.
+ $timeout = 0.01 if $timeout <= 0.01;
+
+ my $winner_fd = undef;
+ my $wout = $wbits;
+ my $fd = 0;
+ # Do "bad" fds from $wbits first
+ while ($wout !~ /^\0*\z/) {
+ if (vec($wout, $fd, 1)) {
+ # Wipe it from future scanning.
+ vec($wout, $fd, 1) = 0;
+ if (my $entry = $self->{"syn"}->{$fd}) {
+ if ($self->{"bad"}->{ $entry->[0] }) {
+ $winner_fd = $fd;
+ last;
+ }
+ }
+ }
+ $fd++;
+ }
+
+ if (defined($winner_fd) or my $nfound = mselect(undef, ($wout=$wbits), undef, $timeout)) {
+ if (defined $winner_fd) {
+ $fd = $winner_fd;
+ } else {
+ # Done waiting for one of the ACKs
+ $fd = 0;
+ # Determine which one
+ while ($wout !~ /^\0*\z/ &&
+ !vec($wout, $fd, 1)) {
+ $fd++;
+ }
+ }
+ if (my $entry = $self->{"syn"}->{$fd}) {
+ # Wipe it from future scanning.
+ delete $self->{"syn"}->{$fd};
+ vec($self->{"wbits"}, $fd, 1) = 0;
+ vec($wbits, $fd, 1) = 0;
+ if (!$self->{"econnrefused"} &&
+ $self->{"bad"}->{ $entry->[0] } &&
+ (($! = ECONNREFUSED)>0) &&
+ $self->{"bad"}->{ $entry->[0] } eq "$!") {
+ # "Connection refused" means reachable
+ # Good, continue
+ } elsif (getpeername($entry->[2])) {
+ # Connection established to remote host
+ # Good, continue
+ } else {
+ # TCP ACK will never come from this host
+ # because there was an error connecting.
+
+ # This should set $! to the correct error.
+ my $char;
+ sysread($entry->[2],$char,1);
+ # Store the excuse why the connection failed.
+ $self->{"bad"}->{$entry->[0]} = $!;
+ if (!$self->{"econnrefused"} &&
+ (($! == ECONNREFUSED) ||
+ ($! == EAGAIN && $^O =~ /cygwin/i))) {
+ # "Connection refused" means reachable
+ # Good, continue
+ } else {
+ # No good, try the next socket...
+ next;
+ }
+ }
+ # Everything passed okay, return the answer
+ return wantarray ?
+ ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1]))
+ : $entry->[0];
+ } else {
+ warn "Corrupted SYN entry: unknown fd [$fd] ready!";
+ vec($wbits, $fd, 1) = 0;
+ vec($self->{"wbits"}, $fd, 1) = 0;
+ }
+ } elsif (defined $nfound) {
+ # Timed out waiting for ACK
+ foreach my $fd (keys %{ $self->{"syn"} }) {
+ if (vec($wbits, $fd, 1)) {
+ my $entry = $self->{"syn"}->{$fd};
+ $self->{"bad"}->{$entry->[0]} = "Timed out";
+ vec($wbits, $fd, 1) = 0;
+ vec($self->{"wbits"}, $fd, 1) = 0;
+ delete $self->{"syn"}->{$fd};
+ }
+ }
+ } else {
+ # Weird error occurred with select()
+ warn("select: $!");
+ $self->{"syn"} = {};
+ $wbits = "";
+ }
+ }
+ }
+ return ();
+}
+
+sub ack_unfork {
+ my ($self,$host) = @_;
+ my $stop_time = $self->{"stop_time"};
+ if ($host) {
+ # Host passed as arg
+ if (my $entry = $self->{"good"}->{$host}) {
+ delete $self->{"good"}->{$host};
+ return ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1]));
+ }
+ }
+
+ my $rbits = "";
+ my $timeout;
+
+ if (keys %{ $self->{"syn"} }) {
+ # Scan all hosts that are left
+ vec($rbits, fileno($self->{"fork_rd"}), 1) = 1;
+ $timeout = $stop_time - &time();
+ # Force a minimum of 10 ms timeout.
+ $timeout = 0.01 if $timeout < 0.01;
+ } else {
+ # No hosts left to wait for
+ $timeout = 0;
+ }
+
+ if ($timeout > 0) {
+ my $nfound;
+ while ( keys %{ $self->{"syn"} } and
+ $nfound = mselect((my $rout=$rbits), undef, undef, $timeout)) {
+ # Done waiting for one of the ACKs
+ if (!sysread($self->{"fork_rd"}, $_, 16)) {
+ # Socket closed, which means all children are done.
+ return ();
+ }
+ my ($pid, $how) = split;
+ if ($pid) {
+ # Flush the zombie
+ waitpid($pid, 0);
+ if (my $entry = $self->{"syn"}->{$pid}) {
+ # Connection attempt to remote host is done
+ delete $self->{"syn"}->{$pid};
+ if (!$how || # If there was no error connecting
+ (!$self->{"econnrefused"} &&
+ $how == ECONNREFUSED)) { # "Connection refused" means reachable
+ if ($host && $entry->[0] ne $host) {
+ # A good connection, but not the host we need.
+ # Move it from the "syn" hash to the "good" hash.
+ $self->{"good"}->{$entry->[0]} = $entry;
+ # And wait for the next winner
+ next;
+ }
+ return ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1]));
+ }
+ } else {
+ # Should never happen
+ die "Unknown ping from pid [$pid]";
+ }
+ } else {
+ die "Empty response from status socket?";
+ }
+ }
+ if (defined $nfound) {
+ # Timed out waiting for ACK status
+ } else {
+ # Weird error occurred with select()
+ warn("select: $!");
+ }
+ }
+ if (my @synners = keys %{ $self->{"syn"} }) {
+ # Kill all the synners
+ kill 9, @synners;
+ foreach my $pid (@synners) {
+ # Wait for the deaths to finish
+ # Then flush off the zombie
+ waitpid($pid, 0);
+ }
+ }
+ $self->{"syn"} = {};
+ return ();
+}
+
+# Description: Tell why the ack() failed
+sub nack {
+ my $self = shift;
+ my $host = shift || croak('Usage> nack($failed_ack_host)');
+ return $self->{"bad"}->{$host} || undef;
+}
+
+# Description: Close the connection.
+
+sub close
+{
+ my ($self) = @_;
+
+ if ($self->{"proto"} eq "syn") {
+ delete $self->{"syn"};
+ } elsif ($self->{"proto"} eq "tcp") {
+ # The connection will already be closed
+ } else {
+ $self->{"fh"}->close();
+ }
+}
+
+sub port_number {
+ my $self = shift;
+ if(@_) {
+ $self->{port_num} = shift @_;
+ $self->service_check(1);
+ }
+ return $self->{port_num};
+}
+
+
+1;
+__END__
+
+=head1 NAME
+
+Net::Ping - check a remote host for reachability
+
+=head1 SYNOPSIS
+
+ use Net::Ping;
+
+ $p = Net::Ping->new();
+ print "$host is alive.\n" if $p->ping($host);
+ $p->close();
+
+ $p = Net::Ping->new("icmp");
+ $p->bind($my_addr); # Specify source interface of pings
+ foreach $host (@host_array)
+ {
+ print "$host is ";
+ print "NOT " unless $p->ping($host, 2);
+ print "reachable.\n";
+ sleep(1);
+ }
+ $p->close();
+
+ $p = Net::Ping->new("tcp", 2);
+ # Try connecting to the www port instead of the echo port
+ $p->port_number(getservbyname("http", "tcp"));
+ while ($stop_time > time())
+ {
+ print "$host not reachable ", scalar(localtime()), "\n"
+ unless $p->ping($host);
+ sleep(300);
+ }
+ undef($p);
+
+ # Like tcp protocol, but with many hosts
+ $p = Net::Ping->new("syn");
+ $p->port_number(getservbyname("http", "tcp"));
+ foreach $host (@host_array) {
+ $p->ping($host);
+ }
+ while (($host,$rtt,$ip) = $p->ack) {
+ print "HOST: $host [$ip] ACKed in $rtt seconds.\n";
+ }
+
+ # High precision syntax (requires Time::HiRes)
+ $p = Net::Ping->new();
+ $p->hires();
+ ($ret, $duration, $ip) = $p->ping($host, 5.5);
+ printf("$host [ip: $ip] is alive (packet return time: %.2f ms)\n", 1000 * $duration)
+ if $ret;
+ $p->close();
+
+ # For backward compatibility
+ print "$host is alive.\n" if pingecho($host);
+
+=head1 DESCRIPTION
+
+This module contains methods to test the reachability of remote
+hosts on a network. A ping object is first created with optional
+parameters, a variable number of hosts may be pinged multiple
+times and then the connection is closed.
+
+You may choose one of six different protocols to use for the
+ping. The "tcp" protocol is the default. Note that a live remote host
+may still fail to be pingable by one or more of these protocols. For
+example, www.microsoft.com is generally alive but not "icmp" pingable.
+
+With the "tcp" protocol the ping() method attempts to establish a
+connection to the remote host's echo port. If the connection is
+successfully established, the remote host is considered reachable. No
+data is actually echoed. This protocol does not require any special
+privileges but has higher overhead than the "udp" and "icmp" protocols.
+
+Specifying the "udp" protocol causes the ping() method to send a udp
+packet to the remote host's echo port. If the echoed packet is
+received from the remote host and the received packet contains the
+same data as the packet that was sent, the remote host is considered
+reachable. This protocol does not require any special privileges.
+It should be borne in mind that, for a udp ping, a host
+will be reported as unreachable if it is not running the
+appropriate echo service. For Unix-like systems see L<inetd(8)>
+for more information.
+
+If the "icmp" protocol is specified, the ping() method sends an icmp
+echo message to the remote host, which is what the UNIX ping program
+does. If the echoed message is received from the remote host and
+the echoed information is correct, the remote host is considered
+reachable. Specifying the "icmp" protocol requires that the program
+be run as root or that the program be setuid to root.
+
+If the "external" protocol is specified, the ping() method attempts to
+use the C<Net::Ping::External> module to ping the remote host.
+C<Net::Ping::External> interfaces with your system's default C<ping>
+utility to perform the ping, and generally produces relatively
+accurate results. If C<Net::Ping::External> if not installed on your
+system, specifying the "external" protocol will result in an error.
+
+If the "syn" protocol is specified, the ping() method will only
+send a TCP SYN packet to the remote host then immediately return.
+If the syn packet was sent successfully, it will return a true value,
+otherwise it will return false. NOTE: Unlike the other protocols,
+the return value does NOT determine if the remote host is alive or
+not since the full TCP three-way handshake may not have completed
+yet. The remote host is only considered reachable if it receives
+a TCP ACK within the timeout specified. To begin waiting for the
+ACK packets, use the ack() method as explained below. Use the
+"syn" protocol instead the "tcp" protocol to determine reachability
+of multiple destinations simultaneously by sending parallel TCP
+SYN packets. It will not block while testing each remote host.
+demo/fping is provided in this distribution to demonstrate the
+"syn" protocol as an example.
+This protocol does not require any special privileges.
+
+=head2 Functions
+
+=over 4
+
+=item Net::Ping->new([$proto [, $def_timeout [, $bytes [, $device [, $tos ]]]]]);
+
+Create a new ping object. All of the parameters are optional. $proto
+specifies the protocol to use when doing a ping. The current choices
+are "tcp", "udp", "icmp", "stream", "syn", or "external".
+The default is "tcp".
+
+If a default timeout ($def_timeout) in seconds is provided, it is used
+when a timeout is not given to the ping() method (below). The timeout
+must be greater than 0 and the default, if not specified, is 5 seconds.
+
+If the number of data bytes ($bytes) is given, that many data bytes
+are included in the ping packet sent to the remote host. The number of
+data bytes is ignored if the protocol is "tcp". The minimum (and
+default) number of data bytes is 1 if the protocol is "udp" and 0
+otherwise. The maximum number of data bytes that can be specified is
+1024.
+
+If $device is given, this device is used to bind the source endpoint
+before sending the ping packet. I believe this only works with
+superuser privileges and with udp and icmp protocols at this time.
+
+If $tos is given, this ToS is configured into the socket.
+
+=item $p->ping($host [, $timeout]);
+
+Ping the remote host and wait for a response. $host can be either the
+hostname or the IP number of the remote host. The optional timeout
+must be greater than 0 seconds and defaults to whatever was specified
+when the ping object was created. Returns a success flag. If the
+hostname cannot be found or there is a problem with the IP number, the
+success flag returned will be undef. Otherwise, the success flag will
+be 1 if the host is reachable and 0 if it is not. For most practical
+purposes, undef and 0 and can be treated as the same case. In array
+context, the elapsed time as well as the string form of the ip the
+host resolved to are also returned. The elapsed time value will
+be a float, as retuned by the Time::HiRes::time() function, if hires()
+has been previously called, otherwise it is returned as an integer.
+
+=item $p->source_verify( { 0 | 1 } );
+
+Allows source endpoint verification to be enabled or disabled.
+This is useful for those remote destinations with multiples
+interfaces where the response may not originate from the same
+endpoint that the original destination endpoint was sent to.
+This only affects udp and icmp protocol pings.
+
+This is enabled by default.
+
+=item $p->service_check( { 0 | 1 } );
+
+Set whether or not the connect behavior should enforce
+remote service availability as well as reachability. Normally,
+if the remote server reported ECONNREFUSED, it must have been
+reachable because of the status packet that it reported.
+With this option enabled, the full three-way tcp handshake
+must have been established successfully before it will
+claim it is reachable. NOTE: It still does nothing more
+than connect and disconnect. It does not speak any protocol
+(i.e., HTTP or FTP) to ensure the remote server is sane in
+any way. The remote server CPU could be grinding to a halt
+and unresponsive to any clients connecting, but if the kernel
+throws the ACK packet, it is considered alive anyway. To
+really determine if the server is responding well would be
+application specific and is beyond the scope of Net::Ping.
+For udp protocol, enabling this option demands that the
+remote server replies with the same udp data that it was sent
+as defined by the udp echo service.
+
+This affects the "udp", "tcp", and "syn" protocols.
+
+This is disabled by default.
+
+=item $p->tcp_service_check( { 0 | 1 } );
+
+Deprecated method, but does the same as service_check() method.
+
+=item $p->hires( { 0 | 1 } );
+
+Causes this module to use Time::HiRes module, allowing milliseconds
+to be returned by subsequent calls to ping().
+
+This is disabled by default.
+
+=item $p->bind($local_addr);
+
+Sets the source address from which pings will be sent. This must be
+the address of one of the interfaces on the local host. $local_addr
+may be specified as a hostname or as a text IP address such as
+"192.168.1.1".
+
+If the protocol is set to "tcp", this method may be called any
+number of times, and each call to the ping() method (below) will use
+the most recent $local_addr. If the protocol is "icmp" or "udp",
+then bind() must be called at most once per object, and (if it is
+called at all) must be called before the first call to ping() for that
+object.
+
+=item $p->open($host);
+
+When you are using the "stream" protocol, this call pre-opens the
+tcp socket. It's only necessary to do this if you want to
+provide a different timeout when creating the connection, or
+remove the overhead of establishing the connection from the
+first ping. If you don't call C<open()>, the connection is
+automatically opened the first time C<ping()> is called.
+This call simply does nothing if you are using any protocol other
+than stream.
+
+=item $p->ack( [ $host ] );
+
+When using the "syn" protocol, use this method to determine
+the reachability of the remote host. This method is meant
+to be called up to as many times as ping() was called. Each
+call returns the host (as passed to ping()) that came back
+with the TCP ACK. The order in which the hosts are returned
+may not necessarily be the same order in which they were
+SYN queued using the ping() method. If the timeout is
+reached before the TCP ACK is received, or if the remote
+host is not listening on the port attempted, then the TCP
+connection will not be established and ack() will return
+undef. In list context, the host, the ack time, and the
+dotted ip string will be returned instead of just the host.
+If the optional $host argument is specified, the return
+value will be pertaining to that host only.
+This call simply does nothing if you are using any protocol
+other than syn.
+
+=item $p->nack( $failed_ack_host );
+
+The reason that host $failed_ack_host did not receive a
+valid ACK. Useful to find out why when ack( $fail_ack_host )
+returns a false value.
+
+=item $p->close();
+
+Close the network connection for this ping object. The network
+connection is also closed by "undef $p". The network connection is
+automatically closed if the ping object goes out of scope (e.g. $p is
+local to a subroutine and you leave the subroutine).
+
+=item $p->port_number([$port_number])
+
+When called with a port number, the port number used to ping is set to
+$port_number rather than using the echo port. It also has the effect
+of calling C<$p-E<gt>service_check(1)> causing a ping to return a successful
+response only if that specific port is accessible. This function returns
+the value of the port that C<ping()> will connect to.
+
+=item pingecho($host [, $timeout]);
+
+To provide backward compatibility with the previous version of
+Net::Ping, a pingecho() subroutine is available with the same
+functionality as before. pingecho() uses the tcp protocol. The
+return values and parameters are the same as described for the ping()
+method. This subroutine is obsolete and may be removed in a future
+version of Net::Ping.
+
+=back
+
+=head1 NOTES
+
+There will be less network overhead (and some efficiency in your
+program) if you specify either the udp or the icmp protocol. The tcp
+protocol will generate 2.5 times or more traffic for each ping than
+either udp or icmp. If many hosts are pinged frequently, you may wish
+to implement a small wait (e.g. 25ms or more) between each ping to
+avoid flooding your network with packets.
+
+The icmp protocol requires that the program be run as root or that it
+be setuid to root. The other protocols do not require special
+privileges, but not all network devices implement tcp or udp echo.
+
+Local hosts should normally respond to pings within milliseconds.
+However, on a very congested network it may take up to 3 seconds or
+longer to receive an echo packet from the remote host. If the timeout
+is set too low under these conditions, it will appear that the remote
+host is not reachable (which is almost the truth).
+
+Reachability doesn't necessarily mean that the remote host is actually
+functioning beyond its ability to echo packets. tcp is slightly better
+at indicating the health of a system than icmp because it uses more
+of the networking stack to respond.
+
+Because of a lack of anything better, this module uses its own
+routines to pack and unpack ICMP packets. It would be better for a
+separate module to be written which understands all of the different
+kinds of ICMP packets.
+
+=head1 INSTALL
+
+The latest source tree is available via cvs:
+
+ cvs -z3 -q -d :pserver:anonymous@cvs.roobik.com.:/usr/local/cvsroot/freeware checkout Net-Ping
+ cd Net-Ping
+
+The tarball can be created as follows:
+
+ perl Makefile.PL ; make ; make dist
+
+The latest Net::Ping release can be found at CPAN:
+
+ $CPAN/modules/by-module/Net/
+
+1) Extract the tarball
+
+ gtar -zxvf Net-Ping-xxxx.tar.gz
+ cd Net-Ping-xxxx
+
+2) Build:
+
+ make realclean
+ perl Makefile.PL
+ make
+ make test
+
+3) Install
+
+ make install
+
+Or install it RPM Style:
+
+ rpm -ta SOURCES/Net-Ping-xxxx.tar.gz
+
+ rpm -ih RPMS/noarch/perl-Net-Ping-xxxx.rpm
+
+=head1 BUGS
+
+For a list of known issues, visit:
+
+https://rt.cpan.org/NoAuth/Bugs.html?Dist=Net-Ping
+
+To report a new bug, visit:
+
+https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Net-Ping
+
+=head1 AUTHORS
+
+ Current maintainer:
+ bbb@cpan.org (Rob Brown)
+
+ External protocol:
+ colinm@cpan.org (Colin McMillen)
+
+ Stream protocol:
+ bronson@trestle.com (Scott Bronson)
+
+ Original pingecho():
+ karrer@bernina.ethz.ch (Andreas Karrer)
+ pmarquess@bfsec.bt.co.uk (Paul Marquess)
+
+ Original Net::Ping author:
+ mose@ns.ccsn.edu (Russell Mosemann)
+
+=head1 COPYRIGHT
+
+Copyright (c) 2002-2003, Rob Brown. All rights reserved.
+
+Copyright (c) 2001, Colin McMillen. All rights reserved.
+
+This program is free software; you may redistribute it and/or
+modify it under the same terms as Perl itself.
+
+$Id: Ping.pm,v 1.86 2003/06/27 21:31:07 rob Exp $
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/SMTP.pm b/Master/tlpkg/tlperl.straw/lib/Net/SMTP.pm
new file mode 100755
index 00000000000..a28496d6886
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/SMTP.pm
@@ -0,0 +1,867 @@
+# Net::SMTP.pm
+#
+# Copyright (c) 1995-2004 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::SMTP;
+
+require 5.001;
+
+use strict;
+use vars qw($VERSION @ISA);
+use Socket 1.3;
+use Carp;
+use IO::Socket;
+use Net::Cmd;
+use Net::Config;
+
+$VERSION = "2.31";
+
+@ISA = qw(Net::Cmd IO::Socket::INET);
+
+
+sub new {
+ my $self = shift;
+ my $type = ref($self) || $self;
+ my ($host, %arg);
+ if (@_ % 2) {
+ $host = shift;
+ %arg = @_;
+ }
+ else {
+ %arg = @_;
+ $host = delete $arg{Host};
+ }
+ my $hosts = defined $host ? $host : $NetConfig{smtp_hosts};
+ my $obj;
+
+ my $h;
+ foreach $h (@{ref($hosts) ? $hosts : [$hosts]}) {
+ $obj = $type->SUPER::new(
+ PeerAddr => ($host = $h),
+ PeerPort => $arg{Port} || 'smtp(25)',
+ LocalAddr => $arg{LocalAddr},
+ LocalPort => $arg{LocalPort},
+ Proto => 'tcp',
+ Timeout => defined $arg{Timeout}
+ ? $arg{Timeout}
+ : 120
+ )
+ and last;
+ }
+
+ return undef
+ unless defined $obj;
+
+ $obj->autoflush(1);
+
+ $obj->debug(exists $arg{Debug} ? $arg{Debug} : undef);
+
+ unless ($obj->response() == CMD_OK) {
+ $obj->close();
+ return undef;
+ }
+
+ ${*$obj}{'net_smtp_exact_addr'} = $arg{ExactAddresses};
+ ${*$obj}{'net_smtp_host'} = $host;
+
+ (${*$obj}{'net_smtp_banner'}) = $obj->message;
+ (${*$obj}{'net_smtp_domain'}) = $obj->message =~ /\A\s*(\S+)/;
+
+ unless ($obj->hello($arg{Hello} || "")) {
+ $obj->close();
+ return undef;
+ }
+
+ $obj;
+}
+
+
+sub host {
+ my $me = shift;
+ ${*$me}{'net_smtp_host'};
+}
+
+##
+## User interface methods
+##
+
+
+sub banner {
+ my $me = shift;
+
+ return ${*$me}{'net_smtp_banner'} || undef;
+}
+
+
+sub domain {
+ my $me = shift;
+
+ return ${*$me}{'net_smtp_domain'} || undef;
+}
+
+
+sub etrn {
+ my $self = shift;
+ defined($self->supports('ETRN', 500, ["Command unknown: 'ETRN'"]))
+ && $self->_ETRN(@_);
+}
+
+
+sub auth {
+ my ($self, $username, $password) = @_;
+
+ eval {
+ require MIME::Base64;
+ require Authen::SASL;
+ } or $self->set_status(500, ["Need MIME::Base64 and Authen::SASL todo auth"]), return 0;
+
+ my $mechanisms = $self->supports('AUTH', 500, ["Command unknown: 'AUTH'"]);
+ return unless defined $mechanisms;
+
+ my $sasl;
+
+ if (ref($username) and UNIVERSAL::isa($username, 'Authen::SASL')) {
+ $sasl = $username;
+ $sasl->mechanism($mechanisms);
+ }
+ else {
+ die "auth(username, password)" if not length $username;
+ $sasl = Authen::SASL->new(
+ mechanism => $mechanisms,
+ callback => {
+ user => $username,
+ pass => $password,
+ authname => $username,
+ }
+ );
+ }
+
+ # We should probably allow the user to pass the host, but I don't
+ # currently know and SASL mechanisms that are used by smtp that need it
+ my $client = $sasl->client_new('smtp', ${*$self}{'net_smtp_host'}, 0);
+ my $str = $client->client_start;
+
+ # We dont support sasl mechanisms that encrypt the socket traffic.
+ # todo that we would really need to change the ISA hierarchy
+ # so we dont inherit from IO::Socket, but instead hold it in an attribute
+
+ my @cmd = ("AUTH", $client->mechanism);
+ my $code;
+
+ push @cmd, MIME::Base64::encode_base64($str, '')
+ if defined $str and length $str;
+
+ while (($code = $self->command(@cmd)->response()) == CMD_MORE) {
+ @cmd = (
+ MIME::Base64::encode_base64(
+ $client->client_step(MIME::Base64::decode_base64(($self->message)[0])), ''
+ )
+ );
+ }
+
+ $code == CMD_OK;
+}
+
+
+sub hello {
+ my $me = shift;
+ my $domain = shift || "localhost.localdomain";
+ my $ok = $me->_EHLO($domain);
+ my @msg = $me->message;
+
+ if ($ok) {
+ my $h = ${*$me}{'net_smtp_esmtp'} = {};
+ my $ln;
+ foreach $ln (@msg) {
+ $h->{uc $1} = $2
+ if $ln =~ /(\w+)\b[= \t]*([^\n]*)/;
+ }
+ }
+ elsif ($me->status == CMD_ERROR) {
+ @msg = $me->message
+ if $ok = $me->_HELO($domain);
+ }
+
+ return undef unless $ok;
+
+ $msg[0] =~ /\A\s*(\S+)/;
+ return ($1 || " ");
+}
+
+
+sub supports {
+ my $self = shift;
+ my $cmd = uc shift;
+ return ${*$self}{'net_smtp_esmtp'}->{$cmd}
+ if exists ${*$self}{'net_smtp_esmtp'}->{$cmd};
+ $self->set_status(@_)
+ if @_;
+ return;
+}
+
+
+sub _addr {
+ my $self = shift;
+ my $addr = shift;
+ $addr = "" unless defined $addr;
+
+ if (${*$self}{'net_smtp_exact_addr'}) {
+ return $1 if $addr =~ /^\s*(<.*>)\s*$/s;
+ }
+ else {
+ return $1 if $addr =~ /(<[^>]*>)/;
+ $addr =~ s/^\s+|\s+$//sg;
+ }
+
+ "<$addr>";
+}
+
+
+sub mail {
+ my $me = shift;
+ my $addr = _addr($me, shift);
+ my $opts = "";
+
+ if (@_) {
+ my %opt = @_;
+ my ($k, $v);
+
+ if (exists ${*$me}{'net_smtp_esmtp'}) {
+ my $esmtp = ${*$me}{'net_smtp_esmtp'};
+
+ if (defined($v = delete $opt{Size})) {
+ if (exists $esmtp->{SIZE}) {
+ $opts .= sprintf " SIZE=%d", $v + 0;
+ }
+ else {
+ carp 'Net::SMTP::mail: SIZE option not supported by host';
+ }
+ }
+
+ if (defined($v = delete $opt{Return})) {
+ if (exists $esmtp->{DSN}) {
+ $opts .= " RET=" . ((uc($v) eq "FULL") ? "FULL" : "HDRS");
+ }
+ else {
+ carp 'Net::SMTP::mail: DSN option not supported by host';
+ }
+ }
+
+ if (defined($v = delete $opt{Bits})) {
+ if ($v eq "8") {
+ if (exists $esmtp->{'8BITMIME'}) {
+ $opts .= " BODY=8BITMIME";
+ }
+ else {
+ carp 'Net::SMTP::mail: 8BITMIME option not supported by host';
+ }
+ }
+ elsif ($v eq "binary") {
+ if (exists $esmtp->{'BINARYMIME'} && exists $esmtp->{'CHUNKING'}) {
+ $opts .= " BODY=BINARYMIME";
+ ${*$me}{'net_smtp_chunking'} = 1;
+ }
+ else {
+ carp 'Net::SMTP::mail: BINARYMIME option not supported by host';
+ }
+ }
+ elsif (exists $esmtp->{'8BITMIME'} or exists $esmtp->{'BINARYMIME'}) {
+ $opts .= " BODY=7BIT";
+ }
+ else {
+ carp 'Net::SMTP::mail: 8BITMIME and BINARYMIME options not supported by host';
+ }
+ }
+
+ if (defined($v = delete $opt{Transaction})) {
+ if (exists $esmtp->{CHECKPOINT}) {
+ $opts .= " TRANSID=" . _addr($me, $v);
+ }
+ else {
+ carp 'Net::SMTP::mail: CHECKPOINT option not supported by host';
+ }
+ }
+
+ if (defined($v = delete $opt{Envelope})) {
+ if (exists $esmtp->{DSN}) {
+ $v =~ s/([^\041-\176]|=|\+)/sprintf "+%02x", ord($1)/sge;
+ $opts .= " ENVID=$v";
+ }
+ else {
+ carp 'Net::SMTP::mail: DSN option not supported by host';
+ }
+ }
+
+ if (defined($v = delete $opt{ENVID})) {
+
+ # expected to be in a format as required by RFC 3461, xtext-encoded
+ if (exists $esmtp->{DSN}) {
+ $opts .= " ENVID=$v";
+ }
+ else {
+ carp 'Net::SMTP::mail: DSN option not supported by host';
+ }
+ }
+
+ if (defined($v = delete $opt{AUTH})) {
+
+ # expected to be in a format as required by RFC 2554,
+ # rfc2821-quoted and xtext-encoded, or <>
+ if (exists $esmtp->{AUTH}) {
+ $v = '<>' if !defined($v) || $v eq '';
+ $opts .= " AUTH=$v";
+ }
+ else {
+ carp 'Net::SMTP::mail: AUTH option not supported by host';
+ }
+ }
+
+ if (defined($v = delete $opt{XVERP})) {
+ if (exists $esmtp->{'XVERP'}) {
+ $opts .= " XVERP";
+ }
+ else {
+ carp 'Net::SMTP::mail: XVERP option not supported by host';
+ }
+ }
+
+ carp 'Net::SMTP::recipient: unknown option(s) ' . join(" ", keys %opt) . ' - ignored'
+ if scalar keys %opt;
+ }
+ else {
+ carp 'Net::SMTP::mail: ESMTP not supported by host - options discarded :-(';
+ }
+ }
+
+ $me->_MAIL("FROM:" . $addr . $opts);
+}
+
+
+sub send { my $me = shift; $me->_SEND("FROM:" . _addr($me, $_[0])) }
+sub send_or_mail { my $me = shift; $me->_SOML("FROM:" . _addr($me, $_[0])) }
+sub send_and_mail { my $me = shift; $me->_SAML("FROM:" . _addr($me, $_[0])) }
+
+
+sub reset {
+ my $me = shift;
+
+ $me->dataend()
+ if (exists ${*$me}{'net_smtp_lastch'});
+
+ $me->_RSET();
+}
+
+
+sub recipient {
+ my $smtp = shift;
+ my $opts = "";
+ my $skip_bad = 0;
+
+ if (@_ && ref($_[-1])) {
+ my %opt = %{pop(@_)};
+ my $v;
+
+ $skip_bad = delete $opt{'SkipBad'};
+
+ if (exists ${*$smtp}{'net_smtp_esmtp'}) {
+ my $esmtp = ${*$smtp}{'net_smtp_esmtp'};
+
+ if (defined($v = delete $opt{Notify})) {
+ if (exists $esmtp->{DSN}) {
+ $opts .= " NOTIFY=" . join(",", map { uc $_ } @$v);
+ }
+ else {
+ carp 'Net::SMTP::recipient: DSN option not supported by host';
+ }
+ }
+
+ if (defined($v = delete $opt{ORcpt})) {
+ if (exists $esmtp->{DSN}) {
+ $opts .= " ORCPT=" . $v;
+ }
+ else {
+ carp 'Net::SMTP::recipient: DSN option not supported by host';
+ }
+ }
+
+ carp 'Net::SMTP::recipient: unknown option(s) ' . join(" ", keys %opt) . ' - ignored'
+ if scalar keys %opt;
+ }
+ elsif (%opt) {
+ carp 'Net::SMTP::recipient: ESMTP not supported by host - options discarded :-(';
+ }
+ }
+
+ my @ok;
+ my $addr;
+ foreach $addr (@_) {
+ if ($smtp->_RCPT("TO:" . _addr($smtp, $addr) . $opts)) {
+ push(@ok, $addr) if $skip_bad;
+ }
+ elsif (!$skip_bad) {
+ return 0;
+ }
+ }
+
+ return $skip_bad ? @ok : 1;
+}
+
+BEGIN {
+ *to = \&recipient;
+ *cc = \&recipient;
+ *bcc = \&recipient;
+}
+
+
+sub data {
+ my $me = shift;
+
+ if (exists ${*$me}{'net_smtp_chunking'}) {
+ carp 'Net::SMTP::data: CHUNKING extension in use, must call bdat instead';
+ }
+ else {
+ my $ok = $me->_DATA() && $me->datasend(@_);
+
+ $ok && @_
+ ? $me->dataend
+ : $ok;
+ }
+}
+
+
+sub bdat {
+ my $me = shift;
+
+ if (exists ${*$me}{'net_smtp_chunking'}) {
+ my $data = shift;
+
+ $me->_BDAT(length $data)
+ && $me->rawdatasend($data)
+ && $me->response() == CMD_OK;
+ }
+ else {
+ carp 'Net::SMTP::bdat: CHUNKING extension is not in use, call data instead';
+ }
+}
+
+
+sub bdatlast {
+ my $me = shift;
+
+ if (exists ${*$me}{'net_smtp_chunking'}) {
+ my $data = shift;
+
+ $me->_BDAT(length $data, "LAST")
+ && $me->rawdatasend($data)
+ && $me->response() == CMD_OK;
+ }
+ else {
+ carp 'Net::SMTP::bdat: CHUNKING extension is not in use, call data instead';
+ }
+}
+
+
+sub datafh {
+ my $me = shift;
+ return unless $me->_DATA();
+ return $me->tied_fh;
+}
+
+
+sub expand {
+ my $me = shift;
+
+ $me->_EXPN(@_)
+ ? ($me->message)
+ : ();
+}
+
+
+sub verify { shift->_VRFY(@_) }
+
+
+sub help {
+ my $me = shift;
+
+ $me->_HELP(@_)
+ ? scalar $me->message
+ : undef;
+}
+
+
+sub quit {
+ my $me = shift;
+
+ $me->_QUIT;
+ $me->close;
+}
+
+
+sub DESTROY {
+
+ # ignore
+}
+
+##
+## RFC821 commands
+##
+
+
+sub _EHLO { shift->command("EHLO", @_)->response() == CMD_OK }
+sub _HELO { shift->command("HELO", @_)->response() == CMD_OK }
+sub _MAIL { shift->command("MAIL", @_)->response() == CMD_OK }
+sub _RCPT { shift->command("RCPT", @_)->response() == CMD_OK }
+sub _SEND { shift->command("SEND", @_)->response() == CMD_OK }
+sub _SAML { shift->command("SAML", @_)->response() == CMD_OK }
+sub _SOML { shift->command("SOML", @_)->response() == CMD_OK }
+sub _VRFY { shift->command("VRFY", @_)->response() == CMD_OK }
+sub _EXPN { shift->command("EXPN", @_)->response() == CMD_OK }
+sub _HELP { shift->command("HELP", @_)->response() == CMD_OK }
+sub _RSET { shift->command("RSET")->response() == CMD_OK }
+sub _NOOP { shift->command("NOOP")->response() == CMD_OK }
+sub _QUIT { shift->command("QUIT")->response() == CMD_OK }
+sub _DATA { shift->command("DATA")->response() == CMD_MORE }
+sub _BDAT { shift->command("BDAT", @_) }
+sub _TURN { shift->unsupported(@_); }
+sub _ETRN { shift->command("ETRN", @_)->response() == CMD_OK }
+sub _AUTH { shift->command("AUTH", @_)->response() == CMD_OK }
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::SMTP - Simple Mail Transfer Protocol Client
+
+=head1 SYNOPSIS
+
+ use Net::SMTP;
+
+ # Constructors
+ $smtp = Net::SMTP->new('mailhost');
+ $smtp = Net::SMTP->new('mailhost', Timeout => 60);
+
+=head1 DESCRIPTION
+
+This module implements a client interface to the SMTP and ESMTP
+protocol, enabling a perl5 application to talk to SMTP servers. This
+documentation assumes that you are familiar with the concepts of the
+SMTP protocol described in RFC821.
+
+A new Net::SMTP object must be created with the I<new> method. Once
+this has been done, all SMTP commands are accessed through this object.
+
+The Net::SMTP class is a subclass of Net::Cmd and IO::Socket::INET.
+
+=head1 EXAMPLES
+
+This example prints the mail domain name of the SMTP server known as mailhost:
+
+ #!/usr/local/bin/perl -w
+
+ use Net::SMTP;
+
+ $smtp = Net::SMTP->new('mailhost');
+ print $smtp->domain,"\n";
+ $smtp->quit;
+
+This example sends a small message to the postmaster at the SMTP server
+known as mailhost:
+
+ #!/usr/local/bin/perl -w
+
+ use Net::SMTP;
+
+ $smtp = Net::SMTP->new('mailhost');
+
+ $smtp->mail($ENV{USER});
+ $smtp->to('postmaster');
+
+ $smtp->data();
+ $smtp->datasend("To: postmaster\n");
+ $smtp->datasend("\n");
+ $smtp->datasend("A simple test message\n");
+ $smtp->dataend();
+
+ $smtp->quit;
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ HOST ] [, OPTIONS ] )
+
+This is the constructor for a new Net::SMTP object. C<HOST> is the
+name of the remote host to which an SMTP connection is required.
+
+C<HOST> is optional. If C<HOST> is not given then it may instead be
+passed as the C<Host> option described below. If neither is given then
+the C<SMTP_Hosts> specified in C<Net::Config> will be used.
+
+C<OPTIONS> are passed in a hash like fashion, using key and value pairs.
+Possible options are:
+
+B<Hello> - SMTP requires that you identify yourself. This option
+specifies a string to pass as your mail domain. If not given localhost.localdomain
+will be used.
+
+B<Host> - SMTP host to connect to. It may be a single scalar, as defined for
+the C<PeerAddr> option in L<IO::Socket::INET>, or a reference to
+an array with hosts to try in turn. The L</host> method will return the value
+which was used to connect to the host.
+
+B<LocalAddr> and B<LocalPort> - These parameters are passed directly
+to IO::Socket to allow binding the socket to a local port.
+
+B<Timeout> - Maximum time, in seconds, to wait for a response from the
+SMTP server (default: 120)
+
+B<ExactAddresses> - If true the all ADDRESS arguments must be as
+defined by C<addr-spec> in RFC2822. If not given, or false, then
+Net::SMTP will attempt to extract the address from the value passed.
+
+B<Debug> - Enable debugging information
+
+
+Example:
+
+
+ $smtp = Net::SMTP->new('mailhost',
+ Hello => 'my.mail.domain',
+ Timeout => 30,
+ Debug => 1,
+ );
+
+ # the same
+ $smtp = Net::SMTP->new(
+ Host => 'mailhost',
+ Hello => 'my.mail.domain',
+ Timeout => 30,
+ Debug => 1,
+ );
+
+ # Connect to the default server from Net::config
+ $smtp = Net::SMTP->new(
+ Hello => 'my.mail.domain',
+ Timeout => 30,
+ );
+
+=back
+
+=head1 METHODS
+
+Unless otherwise stated all methods return either a I<true> or I<false>
+value, with I<true> meaning that the operation was a success. When a method
+states that it returns a value, failure will be returned as I<undef> or an
+empty list.
+
+=over 4
+
+=item banner ()
+
+Returns the banner message which the server replied with when the
+initial connection was made.
+
+=item domain ()
+
+Returns the domain that the remote SMTP server identified itself as during
+connection.
+
+=item hello ( DOMAIN )
+
+Tell the remote server the mail domain which you are in using the EHLO
+command (or HELO if EHLO fails). Since this method is invoked
+automatically when the Net::SMTP object is constructed the user should
+normally not have to call it manually.
+
+=item host ()
+
+Returns the value used by the constructor, and passed to IO::Socket::INET,
+to connect to the host.
+
+=item etrn ( DOMAIN )
+
+Request a queue run for the DOMAIN given.
+
+=item auth ( USERNAME, PASSWORD )
+
+Attempt SASL authentication.
+
+=item mail ( ADDRESS [, OPTIONS] )
+
+=item send ( ADDRESS )
+
+=item send_or_mail ( ADDRESS )
+
+=item send_and_mail ( ADDRESS )
+
+Send the appropriate command to the server MAIL, SEND, SOML or SAML. C<ADDRESS>
+is the address of the sender. This initiates the sending of a message. The
+method C<recipient> should be called for each address that the message is to
+be sent to.
+
+The C<mail> method can some additional ESMTP OPTIONS which is passed
+in hash like fashion, using key and value pairs. Possible options are:
+
+ Size => <bytes>
+ Return => "FULL" | "HDRS"
+ Bits => "7" | "8" | "binary"
+ Transaction => <ADDRESS>
+ Envelope => <ENVID> # xtext-encodes its argument
+ ENVID => <ENVID> # similar to Envelope, but expects argument encoded
+ XVERP => 1
+ AUTH => <submitter> # encoded address according to RFC 2554
+
+The C<Return> and C<Envelope> parameters are used for DSN (Delivery
+Status Notification).
+
+The submitter address in C<AUTH> option is expected to be in a format as
+required by RFC 2554, in an RFC2821-quoted form and xtext-encoded, or <> .
+
+=item reset ()
+
+Reset the status of the server. This may be called after a message has been
+initiated, but before any data has been sent, to cancel the sending of the
+message.
+
+=item recipient ( ADDRESS [, ADDRESS, [...]] [, OPTIONS ] )
+
+Notify the server that the current message should be sent to all of the
+addresses given. Each address is sent as a separate command to the server.
+Should the sending of any address result in a failure then the process is
+aborted and a I<false> value is returned. It is up to the user to call
+C<reset> if they so desire.
+
+The C<recipient> method can also pass additional case-sensitive OPTIONS as an
+anonymous hash using key and value pairs. Possible options are:
+
+ Notify => ['NEVER'] or ['SUCCESS','FAILURE','DELAY'] (see below)
+ ORcpt => <ORCPT>
+ SkipBad => 1 (to ignore bad addresses)
+
+If C<SkipBad> is true the C<recipient> will not return an error when a bad
+address is encountered and it will return an array of addresses that did
+succeed.
+
+ $smtp->recipient($recipient1,$recipient2); # Good
+ $smtp->recipient($recipient1,$recipient2, { SkipBad => 1 }); # Good
+ $smtp->recipient($recipient1,$recipient2, { Notify => ['FAILURE','DELAY'], SkipBad => 1 }); # Good
+ @goodrecips=$smtp->recipient(@recipients, { Notify => ['FAILURE'], SkipBad => 1 }); # Good
+ $smtp->recipient("$recipient,$recipient2"); # BAD
+
+Notify is used to request Delivery Status Notifications (DSNs), but your
+SMTP/ESMTP service may not respect this request depending upon its version and
+your site's SMTP configuration.
+
+Leaving out the Notify option usually defaults an SMTP service to its default
+behavior equivalent to ['FAILURE'] notifications only, but again this may be
+dependent upon your site's SMTP configuration.
+
+The NEVER keyword must appear by itself if used within the Notify option and "requests
+that a DSN not be returned to the sender under any conditions."
+
+ {Notify => ['NEVER']}
+
+ $smtp->recipient(@recipients, { Notify => ['NEVER'], SkipBad => 1 }); # Good
+
+You may use any combination of these three values 'SUCCESS','FAILURE','DELAY' in
+the anonymous array reference as defined by RFC3461 (see http://rfc.net/rfc3461.html
+for more information. Note: quotations in this topic from same.).
+
+A Notify parameter of 'SUCCESS' or 'FAILURE' "requests that a DSN be issued on
+successful delivery or delivery failure, respectively."
+
+A Notify parameter of 'DELAY' "indicates the sender's willingness to receive
+delayed DSNs. Delayed DSNs may be issued if delivery of a message has been
+delayed for an unusual amount of time (as determined by the Message Transfer
+Agent (MTA) at which the message is delayed), but the final delivery status
+(whether successful or failure) cannot be determined. The absence of the DELAY
+keyword in a NOTIFY parameter requests that a "delayed" DSN NOT be issued under
+any conditions."
+
+ {Notify => ['SUCCESS','FAILURE','DELAY']}
+
+ $smtp->recipient(@recipients, { Notify => ['FAILURE','DELAY'], SkipBad => 1 }); # Good
+
+ORcpt is also part of the SMTP DSN extension according to RFC3461.
+It is used to pass along the original recipient that the mail was first
+sent to. The machine that generates a DSN will use this address to inform
+the sender, because he can't know if recipients get rewritten by mail servers.
+It is expected to be in a format as required by RFC3461, xtext-encoded.
+
+=item to ( ADDRESS [, ADDRESS [...]] )
+
+=item cc ( ADDRESS [, ADDRESS [...]] )
+
+=item bcc ( ADDRESS [, ADDRESS [...]] )
+
+Synonyms for C<recipient>.
+
+=item data ( [ DATA ] )
+
+Initiate the sending of the data from the current message.
+
+C<DATA> may be a reference to a list or a list. If specified the contents
+of C<DATA> and a termination string C<".\r\n"> is sent to the server. And the
+result will be true if the data was accepted.
+
+If C<DATA> is not specified then the result will indicate that the server
+wishes the data to be sent. The data must then be sent using the C<datasend>
+and C<dataend> methods described in L<Net::Cmd>.
+
+=item expand ( ADDRESS )
+
+Request the server to expand the given address Returns an array
+which contains the text read from the server.
+
+=item verify ( ADDRESS )
+
+Verify that C<ADDRESS> is a legitimate mailing address.
+
+Most sites usually disable this feature in their SMTP service configuration.
+Use "Debug => 1" option under new() to see if disabled.
+
+=item help ( [ $subject ] )
+
+Request help text from the server. Returns the text or undef upon failure
+
+=item quit ()
+
+Send the QUIT command to the remote SMTP server and close the socket connection.
+
+=back
+
+=head1 ADDRESSES
+
+Net::SMTP attempts to DWIM with addresses that are passed. For
+example an application might extract The From: line from an email
+and pass that to mail(). While this may work, it is not recommended.
+The application should really use a module like L<Mail::Address>
+to extract the mail address and pass that.
+
+If C<ExactAddresses> is passed to the constructor, then addresses
+should be a valid rfc2821-quoted address, although Net::SMTP will
+accept accept the address surrounded by angle brackets.
+
+ funny user@domain WRONG
+ "funny user"@domain RIGHT, recommended
+ <"funny user"@domain> OK
+
+=head1 SEE ALSO
+
+L<Net::Cmd>
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-2004 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/SMTP/TLS.pm b/Master/tlpkg/tlperl.straw/lib/Net/SMTP/TLS.pm
new file mode 100755
index 00000000000..10f9f196e40
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/SMTP/TLS.pm
@@ -0,0 +1,401 @@
+=head1 NAME
+
+Net::SMTP::TLS - An SMTP client supporting TLS and AUTH
+
+=head1 VERSION
+
+Version 0.12
+
+=head1 SYNOPSIS
+
+ use Net::SMTP::TLS;
+ my $mailer = new Net::SMTP::TLS(
+ 'your.mail.host',
+ Hello => 'some.host.name',
+ Port => 25, #redundant
+ User => 'emailguy',
+ Password=> 's3cr3t');
+ $mailer->mail('emailguy@your.mail.host');
+ $mailer->to('someonecool@somewhere.else');
+ $mailer->data;
+ $mailer->datasend("Sent thru TLS!");
+ $mailer->dataend;
+ $mailer->quit;
+
+=head1 DESCRIPTION
+
+B<Net::SMTP::TLS> is a TLS and AUTH capable SMTP client which offers an interface that users will find familiar from L<Net::SMTP>. B<Net::SMTP::TLS> implements a subset of the methods provided by that module, but certainly not (yet) a complete mirror image of that API.
+
+The methods supported by B<Net::SMTP::TLS> are used in the above example. Though self explanatory for the most part, please see the perldoc for L<Net::SMTP> if you are unclear.
+
+The differences in the methods provided are as follows:
+
+=over
+
+The I<mail> method does not take the options list taken by L<Net::SMTP>
+
+The I<to> method also does not take options, and is the only method available to set the recipient (unlike the many synonyms provided by L<Net::SMTP>).
+
+The constructor takes a limited number of L<Net::SMTP>'s parameters. The constructor for B<Net::SMTP::TLS> takes the following (in addition to the hostname of the mail server, which must be the first parameter and is not explicitly named):
+
+=over
+
+NoTLS - In the unlikely event that you need to use this class to perform non-TLS SMTP (you ought to be using Net::SMTP itself for that...), this will turn off TLS when supplied with a true value. This will most often cause an error related to authentication when used on a server that requires TLS
+
+Hello - hostname used in the EHLO command
+
+Port - port to connect to the SMTP service (defaults to 25)
+
+Timeout - Timeout for inital socket connection (defaults to 5, passed directly to L<IO::Socket::INET>)
+
+User - username for SMTP AUTH
+
+Password - password for SMTP AUTH
+
+=back
+
+=back
+
+=head1 TLS and AUTHentication
+
+During construction of an B<Net::SMTP::TLS> instance, the full login process will occur. This involves first sending EHLO to the server, then initiating a TLS session through STARTTLS. Once this is complete, the module will attempt to login using the credentials supplied by the constructor, if such credentials have been supplied.
+
+The AUTH method will depend on the features returned by the server after the EHLO command. Based on that, CRAM-MD5 will be used if available, followed by LOGIN, followed by PLAIN. Please note that LOGIN is the only method of authentication that has been tested. CRAM-MD5 and PLAIN login functionality was taken directly from the script mentioned in the acknowledgements section, however, I have not tested them personally.
+
+=head1 ERROR HANDLING
+
+This module will croak in the event of an SMTP error. Should you wish to handle this gracefully in your application, you may wrap your mail transmission in an eval {} block and check $@ afterward.
+
+=head1 ACKNOWLEDGEMENTS
+
+This code was blatantly plagiarized from Michal Ludvig's smtp-client.pl script. See L<http://www.logix.cz/michal/devel/smtp> for his excellent work.
+
+=head1 AUTHOR
+
+Alexander Christian Westholm, awestholm at verizon dawt net
+
+Improvements courtesy of Tomek Zielinski
+
+=cut
+
+package Net::SMTP::TLS;
+
+use strict;
+use warnings;
+
+our $VERSION = '0.12';
+use Carp;
+
+use Net::SSLeay;
+use IO::Socket::INET;
+use IO::Socket::SSL;
+use MIME::Base64 qw[encode_base64 decode_base64];
+use Digest::HMAC_MD5 qw[hmac_md5_hex];
+
+BEGIN { #set up Net::SSLeay's internals
+ Net::SSLeay::load_error_strings();
+ Net::SSLeay::SSLeay_add_ssl_algorithms();
+ Net::SSLeay::randomize();
+}
+
+sub new {
+ my $pkg = shift;
+ my $host= shift;
+ my %args= @_;
+ $args{Host} = $host;
+ $args{Hello}= "localhost" if not $args{Hello};
+ # make the non-SSL socket that will later be
+ # transformed
+ $args{sock} = new IO::Socket::INET(
+ PeerAddr => $host,
+ PeerPort => $args{Port} || 25,
+ Proto => 'tcp',
+ Timeout => $args{Timeout} || 5)
+ or croak "Connect failed :$@\n";
+
+ my $me = bless \%args, $pkg;
+ # read the line immediately after connecting
+ my ($rsp,$txt) = $me->_response();
+ if(not $rsp == 220){
+ croak "Could not connect to SMTP server: $host $txt\n";
+ }
+ $me->hello(); # the first hello, 2nd after starttls
+ $me->starttls() if not $args{NoTLS}; # why we're here, after all
+ $me->login() if($me->{User} and $me->{Password});
+ return $me;
+}
+
+# simply print a command to the server
+sub _command {
+ my $me = shift;
+ my $command = shift;
+ $me->{sock}->printf($command."\015\012");
+}
+
+# read a line from the server and parse the
+# CODE SEPERATOR TEXT response format
+sub _response {
+ my $me = shift;
+ my $line = $me->{sock}->getline();
+ my @rsp = ($line =~ /(\d+)(.)([^\r]*)/);
+ # reverse things so the seperator is at the end...
+ # that way we don't have to get fancy with the return
+ # values for calls that don't require the "more indicator"
+ return ($rsp[0],$rsp[2],$rsp[1]);
+}
+
+# issue an EHLO command using the hostname provided to the constructor via
+# the Hello paramter, which defaults to localhost. After that, read
+# all the ESMTP capabilities returned by the server
+sub hello {
+ my $me = shift;
+ $me->_command("EHLO ".$me->{Hello});
+ my ($num,$txt,$more) = $me->_response();
+ if(not $num == 250){
+ croak "EHLO command failed: $num $txt\n";
+ }
+ my %features = ();
+ # SMTP uses the dash to seperate the status code from
+ # the response text while there are more lines remaining
+ while($more eq '-'){
+ ($num,$txt,$more) = $me->_response();
+ $txt =~ s/[\n|\r]//g;
+ $txt =~ /(\S+)\s(.*)$/;
+ my ($feat, $parm) = ($txt =~ /^(\w+)[= ]*(.*)$/);
+ $features{$feat} = $parm;
+ }
+ $me->{features} = \%features;
+ return 1;
+}
+
+# the magic! issue the STARTTLS command and
+# use IO::Socket::SSL to transform that no-good
+# plain old socket into an SSL socket
+sub starttls {
+ my $me = shift;
+ $me->_command("STARTTLS");
+ my ($num,$txt) = $me->_response();
+ if(not $num == 220){
+ croak "Invalid response for STARTTLS: $num $txt\n";
+ }
+ if(not IO::Socket::SSL::socket_to_SSL($me->{sock},
+ SSL_version => "SSLv3 TLSv1")){
+ croak "Couldn't start TLS: ".IO::Socket::SSL::errstr."\n";
+ }
+ $me->hello();
+}
+
+# based on the AUTH line returned in the features after EHLO,
+# determine which type of authentication to perform
+sub login {
+ my $me = shift;
+ my $type= $me->{features}->{AUTH};
+ if(not $type){
+ croak "Server did not return AUTH in capabilities\n";
+ }
+ if($type =~ /CRAM\-MD5/){
+ $me->auth_MD5();
+ }elsif($type =~ /LOGIN/){
+ $me->auth_LOGIN();
+ }elsif($type =~ /PLAIN/){
+ $me->auth_PLAIN();
+ }else{
+ croak "Unsupported Authentication mechanism\n";
+ }
+}
+
+# perform a LOGIN authentication...
+# works well on my box.
+sub auth_LOGIN {
+ my $me = shift;
+ $me->_command("AUTH LOGIN");
+ my ($num,$txt) = $me->_response();
+ if(not $num == 334){
+ croak "Cannot authenticate via LOGIN: $num $txt\n";
+ }
+ $me->_command(encode_base64($me->{User},""));
+ ($num,$txt) = $me->_response();
+ if(not $num == 334){
+ croak "Auth failed: $num $txt\n";
+ }
+ $me->_command(encode_base64($me->{Password},""));
+ ($num,$txt) = $me->_response();
+ if(not $num == 235){
+ croak "Auth failed: $num $txt\n";
+ }
+}
+
+# use MD5 to login... gets the ticket from the text
+# of the line returned after the auth command is issued.
+# NOTE: untested
+sub auth_MD5{
+ my $me =shift;
+ $me->_command("AUTH CRAM-MD5");
+ my ($num,$txt) = $me->_response();
+ if(not $num == 334){
+ croak "Cannot authenticate via CRAM-MD5: $num $txt\n";
+ }
+ my $ticket = decode_base64($txt) or
+ croak "Unable to decode ticket";
+ my $md5_pass = hmac_md5_hex($ticket, $me->{Password});
+ $me->_command(encode_base64(
+ $me->{User}." ".$md5_pass, ""));
+ ($num,$txt) = $me->_response();
+ if(not $num == 235){
+ croak "Auth failed: $num $txt\n";
+ }
+}
+
+# perform plain authentication
+sub auth_PLAIN{
+ my $me = shift;
+ my $user= $me->{User};
+ my $pass= $me->{Password};
+ $me->_command(sprintf("AUTH PLAIN %S",
+ encode_base64("$user\0$user\0$pass","")));
+ my ($num,$txt) = $me->_response();
+ if(not $num == 235){
+ croak "Auth failed: $num $txt\n";
+ }
+}
+
+sub _addr {
+ my $addr = shift;
+ $addr = "" unless defined $addr;
+
+ return $1 if $addr =~ /(<[^>]*>)/;
+ $addr =~ s/^\s+|\s+$//sg;
+
+ "<$addr>";
+}
+
+# send the MAIL FROM: <addr> command
+sub mail {
+ my $me = shift;
+ my $from= shift;
+ $me->_command("MAIL FROM: "._addr($from));
+ my ($num,$txt) = $me->_response();
+ if(not $num == 250){
+ croak "Could't set FROM: $num $txt\n";
+ }
+}
+
+# send the RCPT TO: <addr> command
+sub recipient
+{
+ my $me = shift;
+
+
+ my $addr;
+ foreach $addr (@_)
+ {
+ $me->_command("RCPT TO: "._addr($addr));
+ my ($num,$txt) = $me->_response();
+ if(not $num == 250){
+ croak "Couldn't send TO <$addr>: $num $txt\n";
+ }
+ }
+}
+
+BEGIN {
+ *to = \&recipient;
+ *cc = \&recipient;
+ *bcc = \&recipient;
+}
+
+
+# start the body of the message
+# I would probably have designed the public methods of
+# this class differently, but this is to keep with
+# Net::SMTP's API
+sub data {
+ my $me = shift;
+ $me->_command("DATA");
+ my ($num,$txt) = $me->_response();
+ if(not $num == 354){
+ croak "Data failed: $num $txt\n";
+ }
+}
+
+# send stuff over raw (for use as message body)
+sub datasend {
+ my $cmd = shift;
+ my $arr = @_ == 1 && ref($_[0]) ? $_[0] : \@_;
+ my $line = join("" ,@$arr);
+
+ return 0 unless defined(fileno($cmd->{sock}));
+
+ my $last_ch = $cmd->{last_ch};
+ $last_ch = $cmd->{last_ch} = "\012" unless defined $last_ch;
+
+ return 1 unless length $line;
+
+ $line =~ tr/\r\n/\015\012/ unless "\r" eq "\015";
+
+ my $first_ch = '';
+
+ if ($last_ch eq "\015") {
+ $first_ch = "\012" if $line =~ s/^\012//;
+ }
+ elsif ($last_ch eq "\012") {
+ $first_ch = "." if $line =~ /^\./;
+ }
+
+ $line =~ s/\015?\012(\.?)/\015\012$1$1/sg;
+
+ substr($line,0,0) = $first_ch;
+
+ $cmd->{last_ch} = substr($line,-1,1);
+
+ my $len = length($line);
+ my $offset = 0;
+ my $win = "";
+ vec($win,fileno($cmd->{sock}),1) = 1;
+ my $timeout = $cmd->{sock}->timeout || undef;
+
+ local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+
+ while($len)
+ {
+ my $wout;
+ if (select(undef,$wout=$win, undef, $timeout) > 0 or -f $cmd->{sock}) # -f for testing on win32
+ {
+ my $w = syswrite($cmd->{sock}, $line, $len, $offset);
+ unless (defined($w))
+ {
+ carp("Error: $!");
+ return undef;
+ }
+ $len -= $w;
+ }
+ else
+ {
+ carp("Error: Timeout");
+ return undef;
+ }
+ }
+
+}
+
+# end the message body submission by a line with nothing
+# but a period on it.
+sub dataend {
+ my $me = shift;
+ $me->_command("\015\012.");
+ my ($num,$txt) = $me->_response();
+ if(not $num == 250){
+ croak "Couldn't send mail: $num $txt\n";
+ }
+}
+
+# politely disconnect from the SMTP server.
+sub quit {
+ my $me = shift;
+ $me->_command("QUIT");
+ my ($num, $txt) = $me->_response();
+ if(not $num == 221){
+ croak "An error occurred disconnecting from the mail server: $num $txt\n";
+ }
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/SSL.pm b/Master/tlpkg/tlperl.straw/lib/Net/SSL.pm
new file mode 100755
index 00000000000..f14435aeb69
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/SSL.pm
@@ -0,0 +1,607 @@
+package Net::SSL;
+
+use strict;
+use MIME::Base64;
+use Socket;
+use Carp;
+
+use vars qw(@ISA $VERSION $NEW_ARGS);
+$VERSION = '2.84';
+
+require IO::Socket;
+@ISA=qw(IO::Socket::INET);
+
+my %REAL; # private to this package only
+my $DEFAULT_VERSION = '23';
+my $CRLF = "\015\012";
+my $SEND_USERAGENT_TO_PROXY = 0;
+
+require Crypt::SSLeay;
+
+sub _default_context {
+ require Crypt::SSLeay::MainContext;
+ Crypt::SSLeay::MainContext::main_ctx(@_);
+}
+
+sub _alarm_set {
+ return if $^O eq 'MSWin32' or $^O eq 'NetWare';
+ alarm(shift);
+}
+
+sub new {
+ my($class, %arg) = @_;
+ local $NEW_ARGS = \%arg;
+ $class->SUPER::new(%arg);
+}
+
+sub DESTROY {
+ my $self = shift;
+ delete $REAL{$self};
+ local $@;
+ eval { $self->SUPER::DESTROY; };
+}
+
+sub configure {
+ my($self, $arg) = @_;
+ my $ssl_version = delete $arg->{SSL_Version} ||
+ $ENV{HTTPS_VERSION} || $DEFAULT_VERSION;
+ my $ssl_debug = delete $arg->{SSL_Debug} || $ENV{HTTPS_DEBUG} || 0;
+
+ my $ctx = delete $arg->{SSL_Context} || _default_context($ssl_version);
+
+ *$self->{ssl_ctx} = $ctx;
+ *$self->{ssl_version} = $ssl_version;
+ *$self->{ssl_debug} = $ssl_debug;
+ *$self->{ssl_arg} = $arg;
+ *$self->{ssl_peer_addr} = $arg->{PeerAddr};
+ *$self->{ssl_peer_port} = $arg->{PeerPort};
+ *$self->{ssl_new_arg} = $NEW_ARGS;
+ *$self->{ssl_peer_verify} = 0;
+
+ ## Crypt::SSLeay must also aware the SSL Proxy before calling
+ ## $socket->configure($args). Because the $sock->configure() will
+ ## die when failed to resolve the destination server IP address,
+ ## whether the SSL proxy is used or not!
+ ## - dqbai, 2003-05-10
+ if (my $proxy = $self->proxy) {
+ ($arg->{PeerAddr}, $arg->{PeerPort}) = split(':',$proxy);
+ $arg->{PeerPort} || croak("no port given for proxy server $proxy");
+ }
+
+ $self->SUPER::configure($arg);
+}
+
+# override to make sure there is really a timeout
+sub timeout {
+ shift->SUPER::timeout || 60;
+}
+
+sub blocking {
+ my $self = shift;
+ $self->SUPER::blocking(@_);
+}
+
+sub connect {
+ my $self = shift;
+
+ # configure certs on connect() time, so we can throw an undef
+ # and have LWP understand the error
+ eval { $self->configure_certs() };
+ if($@) {
+ $@ = "configure certs failed: $@; $!";
+ $self->die_with_error($@);
+ }
+
+ # finished, update set_verify status
+ if(my $rv = *$self->{ssl_ctx}->set_verify()) {
+ *$self->{ssl_peer_verify} = $rv;
+ }
+
+ if ($self->proxy) {
+ # don't die() in connect, just return undef and set $@
+ my $proxy_connect = eval { $self->proxy_connect_helper(@_) };
+ if(! $proxy_connect || $@) {
+ $@ = "proxy connect failed: $@; $!";
+ croak($@);
+ }
+ }
+ else {
+ *$self->{io_socket_peername}=@_ == 1 ? $_[0] : IO::Socket::sockaddr_in(@_);
+ if(!$self->SUPER::connect(@_)) {
+ # better to die than return here
+ $@ = "Connect failed: $@; $!";
+ croak($@);
+ }
+ }
+
+ my $debug = *$self->{ssl_debug} || 0;
+ my $ssl = Crypt::SSLeay::Conn->new(*$self->{ssl_ctx}, $debug, $self);
+ my $arg = *$self->{ssl_arg};
+ my $new_arg = *$self->{ssl_new_arg};
+ $arg->{SSL_Debug} = $debug;
+
+ eval {
+ local $SIG{ALRM} = sub { $self->die_with_error("SSL connect timeout") };
+ # timeout / 2 because we have 3 possible connects here
+ _alarm_set($self->timeout / 2);
+
+ my $rv;
+ {
+ local $SIG{PIPE} = \&die;
+ $rv = eval { $ssl->connect; };
+ }
+ if (not defined $rv or $rv <= 0) {
+ _alarm_set(0);
+ $ssl = undef;
+ my %args = (%$new_arg, %$arg);
+ if(*$self->{ssl_version} == 23) {
+ $args{SSL_Version} = 3;
+ # the new connect might itself be overridden with a REAL SSL
+ my $new_ssl = Net::SSL->new(%args);
+ $REAL{$self} = $REAL{$new_ssl} || $new_ssl;
+ return $REAL{$self};
+ }
+ elsif(*$self->{ssl_version} == 3) {
+ # $self->die_with_error("SSL negotiation failed");
+ $args{SSL_Version} = 2;
+ my $new_ssl = Net::SSL->new(%args);
+ $REAL{$self} = $new_ssl;
+ return $new_ssl;
+ }
+ else {
+ # don't die, but do set $@, and return undef
+ eval { $self->die_with_error("SSL negotiation failed") };
+ croak($@);
+ }
+ }
+ _alarm_set(0);
+ };
+
+ # odd error in eval {} block, maybe alarm outside the evals
+ if($@) {
+ $@ = "$@; $!";
+ croak($@);
+ }
+
+ # successful SSL connection gets stored
+ *$self->{ssl_ssl} = $ssl;
+ $self;
+}
+
+# Delegate these calls to the Crypt::SSLeay::Conn object
+sub get_peer_certificate {
+ my $self = shift;
+ $self = $REAL{$self} || $self;
+ *$self->{ssl_ssl}->get_peer_certificate(@_);
+}
+
+sub get_peer_verify {
+ my $self = shift;
+ $self = $REAL{$self} || $self;
+ *$self->{ssl_peer_verify};
+}
+
+sub get_shared_ciphers {
+ my $self = shift;
+ $self = $REAL{$self} || $self;
+ *$self->{ssl_ssl}->get_shared_ciphers(@_);
+}
+
+sub get_cipher {
+ my $self = shift;
+ $self = $REAL{$self} || $self;
+ *$self->{ssl_ssl}->get_cipher(@_);
+}
+
+sub ssl_context {
+ my $self = shift;
+ $self = $REAL{$self} || $self;
+ *$self->{ssl_ctx};
+}
+
+sub die_with_error {
+ my $self=shift;
+ my $reason=shift;
+
+ my @err;
+ while(my $err=Crypt::SSLeay::Err::get_error_string()) {
+ push @err, $err;
+ }
+ croak("$reason: " . join( ' | ', @err ));
+}
+
+sub read {
+ my $self = shift;
+ $self = $REAL{$self} || $self;
+
+ local $SIG{__DIE__} = \&Carp::confess;
+ local $SIG{ALRM} = sub { $self->die_with_error("SSL read timeout") };
+
+ _alarm_set($self->timeout);
+ my $n = *$self->{ssl_ssl}->read(@_);
+ _alarm_set(0);
+ $self->die_with_error("read failed") if !defined $n;
+
+ $n;
+}
+
+sub write {
+ my $self = shift;
+ $self = $REAL{$self} || $self;
+ my $n = *$self->{ssl_ssl}->write(@_);
+ $self->die_with_error("write failed") if !defined $n;
+ $n;
+}
+
+*sysread = \&read;
+*syswrite = \&write;
+
+sub print {
+ my $self = shift;
+ $self = $REAL{$self} || $self;
+ # should we care about $, and $\??
+ # I think it is too expensive...
+ $self->write(join("", @_));
+}
+
+sub printf {
+ my $self = shift;
+ $self = $REAL{$self} || $self;
+ my $fmt = shift;
+ $self->write(sprintf($fmt, @_));
+}
+
+sub getchunk {
+ my $self = shift;
+ $self = $REAL{$self} || $self;
+ my $buf = ''; # warnings
+ my $n = $self->read($buf, 32768);
+ return unless defined $n;
+ $buf;
+}
+
+# This is really inefficient, but we only use it for reading the proxy response
+# so that does not really matter.
+sub getline {
+ my $self = shift;
+ $self = $REAL{$self} || $self;
+ my $val="";
+ my $buf;
+ do {
+ $self->SUPER::recv($buf, 1);
+ $val .= $buf;
+ } until ($buf eq "\n");
+
+ $val;
+}
+
+# XXX: no way to disable <$sock>?? (tied handle perhaps?)
+
+sub get_lwp_object {
+ my $self = shift;
+
+ my $lwp_object;
+ my $i = 0;
+ while(1) {
+ package DB;
+ my @stack = caller($i++);
+ last unless @stack;
+ my @stack_args = @DB::args;
+ my $stack_object = $stack_args[0] || next;
+ return $stack_object
+ if ref($stack_object)
+ and $stack_object->isa('LWP::UserAgent');
+ }
+ return undef;
+}
+
+sub send_useragent_to_proxy {
+ if (my $val = shift) {
+ $SEND_USERAGENT_TO_PROXY = $val;
+ }
+ return $SEND_USERAGENT_TO_PROXY;
+}
+
+sub proxy_connect_helper {
+ my $self = shift;
+
+ my $proxy = $self->proxy;
+ my ($proxy_host, $proxy_port) = split(':',$proxy);
+ $proxy_port || croak("no port given for proxy server $proxy");
+
+ my $proxy_addr = gethostbyname($proxy_host);
+ $proxy_addr || croak("can't resolve proxy server name: $proxy_host, $!");
+
+ my($peer_port, $peer_addr) = (*$self->{ssl_peer_port}, *$self->{ssl_peer_addr});
+ $peer_addr || croak("no peer addr given");
+ $peer_port || croak("no peer port given");
+
+ # see if the proxy should be bypassed
+ my @no_proxy = split( /\s*,\s*/, $ENV{NO_PROXY} || $ENV{no_proxy} || '');
+ my $is_proxied = 1;
+ my $domain;
+ for $domain (@no_proxy) {
+ if ($peer_addr =~ /\Q$domain\E$/) {
+ $is_proxied = 0;
+ last;
+ }
+ }
+
+ if ($is_proxied) {
+ $self->SUPER::connect($proxy_port, $proxy_addr)
+ || croak("proxy connect to $proxy_host:$proxy_port failed: $!");
+ }
+ else {
+ $self->SUPER::connect($peer_port, $peer_addr)
+ || croak("proxy bypass to $peer_addr:$peer_addr failed: $!");
+ }
+
+ my $connect_string;
+ if ($ENV{"HTTPS_PROXY_USERNAME"} || $ENV{"HTTPS_PROXY_PASSWORD"}) {
+ my $user = $ENV{"HTTPS_PROXY_USERNAME"};
+ my $pass = $ENV{"HTTPS_PROXY_PASSWORD"};
+
+ my $credentials = encode_base64("$user:$pass", "");
+ $connect_string = join($CRLF,
+ "CONNECT $peer_addr:$peer_port HTTP/1.0",
+ "Proxy-authorization: Basic $credentials"
+ );
+ }
+ else {
+ $connect_string = "CONNECT $peer_addr:$peer_port HTTP/1.0";
+ }
+ $connect_string .= $CRLF;
+
+ if (send_useragent_to_proxy()) {
+ my $lwp_object = $self->get_lwp_object;
+ if($lwp_object && $lwp_object->agent) {
+ $connect_string .= "User-Agent: ".$lwp_object->agent.$CRLF;
+ }
+ }
+
+ $connect_string .= $CRLF;
+ $self->SUPER::send($connect_string);
+ my $header;
+ my $n = $self->SUPER::sysread($header, 8192);
+ my $conn_ok = ($header =~ /HTTP\/\d+\.\d+\s+200\s+/is) ? 1 : 0;
+
+ if (not $conn_ok) {
+ croak("PROXY ERROR HEADER, could be non-SSL URL:\n$header");
+ }
+
+ $conn_ok;
+}
+
+# code adapted from LWP::UserAgent, with $ua->env_proxy API
+sub proxy {
+ my $proxy_server = $ENV{HTTPS_PROXY} || $ENV{https_proxy};
+ return unless $proxy_server;
+
+ $proxy_server =~ s|\Ahttps?://||i;
+ $proxy_server;
+}
+
+sub configure_certs {
+ my $self = shift;
+ my $ctx = *$self->{ssl_ctx};
+
+ my $count = 0;
+ for (qw(HTTPS_PKCS12_FILE HTTPS_CERT_FILE HTTPS_KEY_FILE)) {
+ my $file = $ENV{$_};
+ if ($file) {
+ (-e $file) or croak("$file file does not exist: $!");
+ (-r $file) or croak("$file file is not readable");
+ $count++;
+ if (/PKCS12/) {
+ $count++;
+ $ctx->use_pkcs12_file($file ,$ENV{'HTTPS_PKCS12_PASSWORD'}) || croak("failed to load $file: $!");
+ last;
+ }
+ elsif (/CERT/) {
+ $ctx->use_certificate_file($file ,1) || croak("failed to load $file: $!");
+ }
+ elsif (/KEY/) {
+ $ctx->use_PrivateKey_file($file, 1) || croak("failed to load $file: $!");
+ }
+ else {
+ croak("setting $_ not supported");
+ }
+ }
+ }
+
+ # if both configs are set, then verify them
+ if ($count == 2) {
+ if (! $ctx->check_private_key) {
+ croak("Private key and certificate do not match");
+ }
+ }
+
+ $count; # number of successful cert loads/checks
+}
+
+sub accept { shift->_unimpl("accept") }
+sub getc { shift->_unimpl("getc") }
+sub ungetc { shift->_unimpl("ungetc") }
+sub getlines { shift->_unimpl("getlines"); }
+
+sub _unimpl {
+ my($self, $meth) = @_;
+ croak("$meth not implemented for Net::SSL sockets");
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::SSL - support for Secure Sockets Layer
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+Creates a new C<Net::SSL> object.
+
+=item configure
+
+Configures a C<Net::SSL> socket for operation.
+
+=item configure_certs
+
+Sets up a certificate file to use for communicating with on
+the socket.
+
+=item connect
+
+=item die_with_error
+
+=item get_cipher
+
+=item get_lwp_object
+
+Walks up the caller stack and looks for something blessed into
+the C<LWP::UserAgent> namespace and returns it. Vaguely deprecated.
+
+=item get_peer_certificate
+
+Gets the peer certificate from the underlying C<Crypt::SSLeay::Conn>
+object.
+
+=item get_peer_verify
+
+=item get_shared_ciphers
+
+=item getchunk
+
+Attempts to read up to 32KiB of data from the socket. Returns
+C<undef> if nothing was read, otherwise returns the data as
+a scalar.
+
+=item getline
+
+Reads one character at a time until a newline is encountered,
+and returns the line, including the newline. Grossly
+inefficient.
+
+=item print
+
+Concatenates the input parameters and writes them to the socket.
+Does not honour C<$,> nor C<$/>. Returns the number of bytes written.
+
+=item printf
+
+Performs a C<sprintf> of the input parameters (thus, the first
+parameter must be the format), and writes the result to the socket.
+Returns the number of bytes written.
+
+=item proxy
+
+Returns the hostname of an https proxy server, as specified by the
+C<HTTPS_PROXY> environment variable.
+
+=item proxy_connect_helper
+
+Helps set up a connection through a proxy.
+
+=item read
+
+Performs a read on the socket and returns the result.
+
+=item ssl_context
+
+=item sysread
+
+Is an alias of C<read>.
+
+=item timeout
+
+Returns the timeout value of the socket as defined by the implementing
+class or 60 seconds by default.
+
+=item blocking
+
+Returns a boolean indicating whether the underlying socket is in
+blocking mode. By default, Net::SSL sockets are in blocking mode.
+
+ $sock->blocking(0); # set to non-blocking mode
+
+This method simply calls the underlying C<blocking> method of the
+IO::Socket object.
+
+=item write
+
+Writes the parameters passed in (thus, a list) to the socket. Returns
+the number of bytes written.
+
+=item syswrite
+
+Is an alias of C<write>.
+
+=item accept
+
+Not yet implemented. Will die if called.
+
+=item getc
+
+Not yet implemented. Will die if called.
+
+=item getlines
+
+Not yet implemented. Will die if called.
+
+=item ungetc
+
+Not yet implemented. Will die if called.
+
+=item send_useragent_to_proxy
+
+By default (as of version 2.80 of C<Net::SSL> in the 0.54 distribution
+of Crypt::SSLeay), the user agent string is no longer sent to the
+proxy (but will continue to be sent to the remote host).
+
+The previous behaviour was of marginal benefit, and could cause
+fatal errors in certain scenarios (see CPAN bug #4759) and so no
+longer happens by default.
+
+To reinstate the old behaviour, call C<Net::SSL::send_useragent_to_proxy>
+with a true value (usually 1).
+
+=back
+
+=head1 DIAGNOSTICS
+
+ "no port given for proxy server <proxy>"
+
+A proxy was specified for configuring a socket, but no port number
+was given. Ensure that the proxy is specified as a host:port pair,
+such as C<proxy.example.com:8086>.
+
+ "configure certs failed: <contents of $@>; <contents of $!>"
+
+ "proxy connect failed: <contents of $@>; <contents of $!>"
+
+ "Connect failed: <contents of $@>; <contents of $!>"
+
+During connect().
+
+=head2 SEE ALSO
+
+=over 4
+
+=item IO::Socket::INET
+
+C<Net::SSL> is implemented by subclassing C<IO::Socket::INET>, hence
+methods not specifically overridden are defined by that package.
+
+=item Net::SSLeay
+
+A package that provides a Perl-level interface to the C<openssl>
+secure sockets layer library.
+
+=back
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/SSLeay.pm b/Master/tlpkg/tlperl.straw/lib/Net/SSLeay.pm
new file mode 100755
index 00000000000..08a0ec30f6a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/SSLeay.pm
@@ -0,0 +1,2610 @@
+# Net::SSLeay.pm - Perl module for using Eric Young's implementation of SSL
+#
+# Copyright (c) 1996-2003 Sampo Kellomaki <sampo@iki.fi>, All Rights Reserved.
+# Copyright (C) 2005 Florian Ragwitz <rafl@debian.org>, All Rights Reserved.
+# Copyright (C) 2005 Mike McCauley <mikem@open.com.au>, All Rights Reserved.
+#
+# $Id$
+#
+# Version 1.04, 31.3.1999
+# 30.7.1999, Tracking OpenSSL-0.9.3a changes, --Sampo
+# 31.7.1999, version 1.05 --Sampo
+# 7.4.2001, fixed input error upon 0, OpenSSL-0.9.6a, version 1.06 --Sampo
+# 18.4.2001, added TLSv1 support by Stephen C. Koehler
+# <koehler@securecomputing.com>, version 1.07, --Sampo
+# 25.4.2001, 64 bit fixes by Marko Asplund <aspa@kronodoc.fi> --Sampo
+# 17.4.2001, more error codes from aspa --Sampo
+# 25.9.2001, added heaps and piles of newer OpenSSL auxiliary functions --Sampo
+# 6.11.2001, got rid of $p_errs madness --Sampo
+# 9.11.2001, added EGD (entropy gathering daemon) reference info --Sampo
+# 7.12.2001, Added proxy support by Bruno De Wolf <bruno.dewolf@@pandora._be>
+# 6.1.2002, cosmetic fix to socket options from Kwindla Hultman Kramer <kwindla@@allafrica_.com>
+# 25.3.2002, added post_https_cert and friends per patch from
+# mock@@obscurity.ogr, --Sampo
+# 3.4.2002, added `use bytes' from Marcus Taylor <marcus@@semantico_.com>
+# This avoids unicode/utf8 (as may appear in some XML docs)
+# from fooling the length comuptations. Dropped support for
+# perl5.005_03 because I do not have opportunity to test it. --Sampo
+# 5.4.2002, improved Unicode gotcha eliminator to support old perls --Sampo
+# 8.4.2002, added a small line end fix from Petr Dousa (pdousa@@kerio_.com)
+# 17.5.2002, Added BIO_s_mem, BIO_new, BIO_free, BIO_write, BIO_read
+# BIO_eof, BIO_pending, BIO_wpending, RSA_generate_key, RSA_free
+# --mikem@open._com.au
+# 10.8.2002, Added SSL_peek patch to ssl_read_until from
+# Peter Behroozi <peter@@fhpwireless_.com> --Sampo
+# 21.8.2002, Added SESSION_get_master_key, SSL_get_client_random, SSL_get_server_random
+# --mikem@open.com_.au
+# 2.9.2002, Added SSL_CTX_get_cert_store, X509_STORE_add_cert, X509_STORE_add_crl
+# X509_STORE_set_flags, X509_load_cert_file, X509_load_crl_file
+# X509_load_cert_crl_file, PEM_read_bio_X509_CRL,
+# constants for X509_V_FLAG_* in order to support certificate revocation lists.
+# --mikem@open.com_.au
+# 6.9.2002, fixed X509_STORE_set_flags to X509_STORE_CTX_set_flags, --Sampo
+# 19.9.2002, applied patch from Tim Engler <tim@burntcouch_.com>
+# 18.2.2003, applied patch from Toni Andjelkovic <toni@soth._at>
+# 13.6.2003, partially applied leak patch by Marian Jancar <mjancar@suse._cz>
+# 25.6.2003, write_partial() return value patch from
+# Kim Minh Kaplan <kmkaplan@selfoffice._com>
+# 17.8.2003, added http support :-) --Sampo
+# 17.8.2003, started 1.25 dev --Sampo
+# 30.11.2005, Applied a patch by Peter Behroozi that adds get1_session() for session caching --Florian
+# 30.11.2005, Applied a patch by ex8k-hbn@asahi-net.or.jp that limits the chunk size for tcp_read_all --Florian
+# 30.11.2005, Applied a patch by ivan-cpan-rt@420.am that avoids adding a Host header if an own is specified in do_httpx3
+# 13.12.2005, Added comments re thread safety and resetting of default_passwd_callback after use
+# --mikem@open.com.au
+#
+# The distribution and use of this module are subject to the conditions
+# listed in LICENSE file at the root of OpenSSL-0.9.7b
+# distribution (i.e. free, but mandatory attribution and NO WARRANTY).
+
+package Net::SSLeay;
+
+use strict;
+use Carp;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD $CRLF);
+use Socket;
+use Errno;
+
+require Exporter;
+use AutoLoader;
+
+# 0=no warns, 1=only errors, 2=ciphers, 3=progress, 4=dump data
+$Net::SSLeay::trace = 0; # Do not change here, use
+ # $Net::SSLeay::trace = [1-4] in caller
+
+# 2 = insist on v2 SSL protocol
+# 3 = insist on v3 SSL
+# 10 = insist on TLSv1
+# 0 or undef = guess (v23)
+#
+$Net::SSLeay::ssl_version = 0; # don't change here, use
+ # Net::SSLeay::version=[2,3,0] in caller
+
+#define to enable the "cat /proc/$$/stat" stuff
+$Net::SSLeay::linux_debug = 0;
+
+# Number of seconds to sleep after sending message and before half
+# closing connection. Useful with antiquated broken servers.
+$Net::SSLeay::slowly = 0;
+
+# RANDOM NUMBER INITIALIZATION
+#
+# Edit to your taste. Using /dev/random would be more secure, but may
+# block if randomness is not available, thus the default is
+# /dev/urandom. $how_random determines how many bits of randomness to take
+# from the device. You should take enough (read SSLeay/doc/rand), but
+# beware that randomness is limited resource so you should not waste
+# it either or you may end up with randomness depletion (situation where
+# /dev/random would block and /dev/urandom starts to return predictable
+# numbers).
+#
+# N.B. /dev/urandom does not exit on all systems, such as Solaris 2.6. In that
+# case you should get a third party package that emulates /dev/urandom
+# (e.g. via named pipe) or supply a random number file. Some such
+# packages are documented in Caveat section of the POD documentation.
+
+$Net::SSLeay::random_device = '/dev/urandom';
+$Net::SSLeay::how_random = 512;
+
+$VERSION = '1.35';
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(
+ AT_MD5_WITH_RSA_ENCRYPTION
+ CB_ACCEPT_EXIT
+ CB_ACCEPT_LOOP
+ CB_CONNECT_EXIT
+ CB_CONNECT_LOOP
+ CK_DES_192_EDE3_CBC_WITH_MD5
+ CK_DES_192_EDE3_CBC_WITH_SHA
+ CK_DES_64_CBC_WITH_MD5
+ CK_DES_64_CBC_WITH_SHA
+ CK_DES_64_CFB64_WITH_MD5_1
+ CK_IDEA_128_CBC_WITH_MD5
+ CK_NULL
+ CK_NULL_WITH_MD5
+ CK_RC2_128_CBC_EXPORT40_WITH_MD5
+ CK_RC2_128_CBC_WITH_MD5
+ CK_RC4_128_EXPORT40_WITH_MD5
+ CK_RC4_128_WITH_MD5
+ CLIENT_VERSION
+ ERROR_NONE
+ ERROR_SSL
+ ERROR_SYSCALL
+ ERROR_WANT_CONNECT
+ ERROR_WANT_READ
+ ERROR_WANT_WRITE
+ ERROR_WANT_X509_LOOKUP
+ ERROR_ZERO_RETURN
+ CT_X509_CERTIFICATE
+ FILETYPE_ASN1
+ FILETYPE_PEM
+ F_CLIENT_CERTIFICATE
+ F_CLIENT_HELLO
+ F_CLIENT_MASTER_KEY
+ F_D2I_SSL_SESSION
+ F_GET_CLIENT_FINISHED
+ F_GET_CLIENT_HELLO
+ F_GET_CLIENT_MASTER_KEY
+ F_GET_SERVER_FINISHED
+ F_GET_SERVER_HELLO
+ F_GET_SERVER_VERIFY
+ F_I2D_SSL_SESSION
+ F_READ_N
+ F_REQUEST_CERTIFICATE
+ F_SERVER_HELLO
+ F_SSL_ACCEPT
+ F_SSL_CERT_NEW
+ F_SSL_CONNECT
+ F_SSL_ENC_DES_CBC_INIT
+ F_SSL_ENC_DES_CFB_INIT
+ F_SSL_ENC_DES_EDE3_CBC_INIT
+ F_SSL_ENC_IDEA_CBC_INIT
+ F_SSL_ENC_NULL_INIT
+ F_SSL_ENC_RC2_CBC_INIT
+ F_SSL_ENC_RC4_INIT
+ F_SSL_GET_NEW_SESSION
+ F_SSL_MAKE_CIPHER_LIST
+ F_SSL_NEW
+ F_SSL_READ
+ F_SSL_RSA_PRIVATE_DECRYPT
+ F_SSL_RSA_PUBLIC_ENCRYPT
+ F_SSL_SESSION_NEW
+ F_SSL_SESSION_PRINT_FP
+ F_SSL_SET_CERTIFICATE
+ F_SSL_SET_FD
+ F_SSL_SET_RFD
+ F_SSL_SET_WFD
+ F_SSL_STARTUP
+ F_SSL_USE_CERTIFICATE
+ F_SSL_USE_CERTIFICATE_ASN1
+ F_SSL_USE_CERTIFICATE_FILE
+ F_SSL_USE_PRIVATEKEY
+ F_SSL_USE_PRIVATEKEY_ASN1
+ F_SSL_USE_PRIVATEKEY_FILE
+ F_SSL_USE_RSAPRIVATEKEY
+ F_SSL_USE_RSAPRIVATEKEY_ASN1
+ F_SSL_USE_RSAPRIVATEKEY_FILE
+ F_WRITE_PENDING
+ GEN_OTHERNAME
+ GEN_EMAIL
+ GEN_DNS
+ GEN_X400
+ GEN_DIRNAME
+ GEN_EDIPARTY
+ GEN_URI
+ GEN_IPADD
+ GEN_RID
+ MAX_MASTER_KEY_LENGTH_IN_BITS
+ MAX_RECORD_LENGTH_2_BYTE_HEADER
+ MAX_RECORD_LENGTH_3_BYTE_HEADER
+ MAX_SSL_SESSION_ID_LENGTH_IN_BYTES
+ MIN_RSA_MODULUS_LENGTH_IN_BYTES
+ MT_CLIENT_CERTIFICATE
+ MT_CLIENT_FINISHED
+ MT_CLIENT_HELLO
+ MT_CLIENT_MASTER_KEY
+ MT_ERROR
+ MT_REQUEST_CERTIFICATE
+ MT_SERVER_FINISHED
+ MT_SERVER_HELLO
+ MT_SERVER_VERIFY
+ NOTHING
+ NID_undef
+ NID_algorithm
+ NID_rsadsi
+ NID_pkcs
+ NID_md2
+ NID_md5
+ NID_rc4
+ NID_rsaEncryption
+ NID_md2WithRSAEncryption
+ NID_md5WithRSAEncryption
+ NID_pbeWithMD2AndDES_CBC
+ NID_pbeWithMD5AndDES_CBC
+ NID_X500
+ NID_X509
+ NID_commonName
+ NID_countryName
+ NID_localityName
+ NID_stateOrProvinceName
+ NID_organizationName
+ NID_organizationalUnitName
+ NID_rsa
+ NID_pkcs7
+ NID_pkcs7_data
+ NID_pkcs7_signed
+ NID_pkcs7_enveloped
+ NID_pkcs7_signedAndEnveloped
+ NID_pkcs7_digest
+ NID_pkcs7_encrypted
+ NID_pkcs3
+ NID_dhKeyAgreement
+ NID_des_ecb
+ NID_des_cfb64
+ NID_des_cbc
+ NID_des_ede
+ NID_des_ede3
+ NID_idea_cbc
+ NID_idea_cfb64
+ NID_idea_ecb
+ NID_rc2_cbc
+ NID_rc2_ecb
+ NID_rc2_cfb64
+ NID_rc2_ofb64
+ NID_sha
+ NID_shaWithRSAEncryption
+ NID_des_ede_cbc
+ NID_des_ede3_cbc
+ NID_des_ofb64
+ NID_idea_ofb64
+ NID_pkcs9
+ NID_pkcs9_emailAddress
+ NID_pkcs9_unstructuredName
+ NID_pkcs9_contentType
+ NID_pkcs9_messageDigest
+ NID_pkcs9_signingTime
+ NID_pkcs9_countersignature
+ NID_pkcs9_challengePassword
+ NID_pkcs9_unstructuredAddress
+ NID_pkcs9_extCertAttributes
+ NID_netscape
+ NID_netscape_cert_extension
+ NID_netscape_data_type
+ NID_des_ede_cfb64
+ NID_des_ede3_cfb64
+ NID_des_ede_ofb64
+ NID_des_ede3_ofb64
+ NID_sha1
+ NID_sha1WithRSAEncryption
+ NID_dsaWithSHA
+ NID_dsa_2
+ NID_pbeWithSHA1AndRC2_CBC
+ NID_id_pbkdf2
+ NID_dsaWithSHA1_2
+ NID_netscape_cert_type
+ NID_netscape_base_url
+ NID_netscape_revocation_url
+ NID_netscape_ca_revocation_url
+ NID_netscape_renewal_url
+ NID_netscape_ca_policy_url
+ NID_netscape_ssl_server_name
+ NID_netscape_comment
+ NID_netscape_cert_sequence
+ NID_desx_cbc
+ NID_id_ce
+ NID_subject_key_identifier
+ NID_key_usage
+ NID_private_key_usage_period
+ NID_subject_alt_name
+ NID_issuer_alt_name
+ NID_basic_constraints
+ NID_crl_number
+ NID_certificate_policies
+ NID_authority_key_identifier
+ NID_bf_cbc
+ NID_bf_ecb
+ NID_bf_cfb64
+ NID_bf_ofb64
+ NID_mdc2
+ NID_mdc2WithRSA
+ NID_rc4_40
+ NID_rc2_40_cbc
+ NID_givenName
+ NID_surname
+ NID_initials
+ NID_uniqueIdentifier
+ NID_crl_distribution_points
+ NID_md5WithRSA
+ NID_serialNumber
+ NID_title
+ NID_description
+ NID_cast5_cbc
+ NID_cast5_ecb
+ NID_cast5_cfb64
+ NID_cast5_ofb64
+ NID_pbeWithMD5AndCast5_CBC
+ NID_dsaWithSHA1
+ NID_md5_sha1
+ NID_sha1WithRSA
+ NID_dsa
+ NID_ripemd160
+ NID_ripemd160WithRSA
+ NID_rc5_cbc
+ NID_rc5_ecb
+ NID_rc5_cfb64
+ NID_rc5_ofb64
+ NID_rle_compression
+ NID_zlib_compression
+ NID_ext_key_usage
+ NID_id_pkix
+ NID_id_kp
+ NID_server_auth
+ NID_client_auth
+ NID_code_sign
+ NID_email_protect
+ NID_time_stamp
+ NID_ms_code_ind
+ NID_ms_code_com
+ NID_ms_ctl_sign
+ NID_ms_sgc
+ NID_ms_efs
+ NID_ns_sgc
+ NID_delta_crl
+ NID_crl_reason
+ NID_invalidity_date
+ NID_sxnet
+ NID_pbe_WithSHA1And128BitRC4
+ NID_pbe_WithSHA1And40BitRC4
+ NID_pbe_WithSHA1And3_Key_TripleDES_CBC
+ NID_pbe_WithSHA1And2_Key_TripleDES_CBC
+ NID_pbe_WithSHA1And128BitRC2_CBC
+ NID_pbe_WithSHA1And40BitRC2_CBC
+ NID_keyBag
+ NID_pkcs8ShroudedKeyBag
+ NID_certBag
+ NID_crlBag
+ NID_secretBag
+ NID_safeContentsBag
+ NID_friendlyName
+ NID_localKeyID
+ NID_x509Certificate
+ NID_sdsiCertificate
+ NID_x509Crl
+ NID_pbes2
+ NID_pbmac1
+ NID_hmacWithSHA1
+ NID_id_qt_cps
+ NID_id_qt_unotice
+ NID_rc2_64_cbc
+ NID_SMIMECapabilities
+ NID_pbeWithMD2AndRC2_CBC
+ NID_pbeWithMD5AndRC2_CBC
+ NID_pbeWithSHA1AndDES_CBC
+ NID_ms_ext_req
+ NID_ext_req
+ NID_name
+ NID_dnQualifier
+ NID_id_pe
+ NID_id_ad
+ NID_info_access
+ NID_ad_OCSP
+ NID_ad_ca_issuers
+ NID_OCSP_sign
+ OPENSSL_VERSION_NUMBER
+ PE_BAD_CERTIFICATE
+ PE_NO_CERTIFICATE
+ PE_NO_CIPHER
+ PE_UNSUPPORTED_CERTIFICATE_TYPE
+ READING
+ RWERR_BAD_MAC_DECODE
+ RWERR_BAD_WRITE_RETRY
+ RWERR_INTERNAL_ERROR
+ R_BAD_AUTHENTICATION_TYPE
+ R_BAD_CHECKSUM
+ R_BAD_MAC_DECODE
+ R_BAD_RESPONSE_ARGUMENT
+ R_BAD_SSL_FILETYPE
+ R_BAD_SSL_SESSION_ID_LENGTH
+ R_BAD_STATE
+ R_BAD_WRITE_RETRY
+ R_CHALLENGE_IS_DIFFERENT
+ R_CIPHER_CODE_TOO_LONG
+ R_CIPHER_TABLE_SRC_ERROR
+ R_CONECTION_ID_IS_DIFFERENT
+ R_INVALID_CHALLENGE_LENGTH
+ R_NO_CERTIFICATE_SET
+ R_NO_CERTIFICATE_SPECIFIED
+ R_NO_CIPHER_LIST
+ R_NO_CIPHER_MATCH
+ R_NO_CIPHER_WE_TRUST
+ R_NO_PRIVATEKEY
+ R_NO_PUBLICKEY
+ R_NO_READ_METHOD_SET
+ R_NO_WRITE_METHOD_SET
+ R_NULL_SSL_CTX
+ R_PEER_DID_NOT_RETURN_A_CERTIFICATE
+ R_PEER_ERROR
+ R_PEER_ERROR_CERTIFICATE
+ R_PEER_ERROR_NO_CIPHER
+ R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE
+ R_PERR_ERROR_NO_CERTIFICATE
+ R_PUBLIC_KEY_ENCRYPT_ERROR
+ R_PUBLIC_KEY_IS_NOT_RSA
+ R_PUBLIC_KEY_NO_RSA
+ R_READ_WRONG_PACKET_TYPE
+ R_REVERSE_KEY_ARG_LENGTH_IS_WRONG
+ R_REVERSE_MASTER_KEY_LENGTH_IS_WRONG
+ R_REVERSE_SSL_SESSION_ID_LENGTH_IS_WRONG
+ R_SHORT_READ
+ R_SSL_SESSION_ID_IS_DIFFERENT
+ R_UNABLE_TO_EXTRACT_PUBLIC_KEY
+ R_UNDEFINED_INIT_STATE
+ R_UNKNOWN_REMOTE_ERROR_TYPE
+ R_UNKNOWN_STATE
+ R_UNSUPORTED_CIPHER
+ R_WRONG_PUBLIC_KEY_TYPE
+ R_X509_LIB
+ RSA_3
+ RSA_F4
+ SERVER_VERSION
+ SESSION
+ SESSION_ASN1_VERSION
+ ST_ACCEPT
+ ST_BEFORE
+ ST_CLIENT_START_ENCRYPTION
+ ST_CONNECT
+ ST_GET_CLIENT_FINISHED_A
+ ST_GET_CLIENT_FINISHED_B
+ ST_GET_CLIENT_HELLO_A
+ ST_GET_CLIENT_HELLO_B
+ ST_GET_CLIENT_MASTER_KEY_A
+ ST_GET_CLIENT_MASTER_KEY_B
+ ST_GET_SERVER_FINISHED_A
+ ST_GET_SERVER_FINISHED_B
+ ST_GET_SERVER_HELLO_A
+ ST_GET_SERVER_HELLO_B
+ ST_GET_SERVER_VERIFY_A
+ ST_GET_SERVER_VERIFY_B
+ ST_INIT
+ ST_OK
+ ST_READ_BODY
+ ST_READ_HEADER
+ ST_SEND_CLIENT_CERTIFICATE_A
+ ST_SEND_CLIENT_CERTIFICATE_B
+ ST_SEND_CLIENT_CERTIFICATE_C
+ ST_SEND_CLIENT_CERTIFICATE_D
+ ST_SEND_CLIENT_FINISHED_A
+ ST_SEND_CLIENT_FINISHED_B
+ ST_SEND_CLIENT_HELLO_A
+ ST_SEND_CLIENT_HELLO_B
+ ST_SEND_CLIENT_MASTER_KEY_A
+ ST_SEND_CLIENT_MASTER_KEY_B
+ ST_SEND_REQUEST_CERTIFICATE_A
+ ST_SEND_REQUEST_CERTIFICATE_B
+ ST_SEND_REQUEST_CERTIFICATE_C
+ ST_SEND_REQUEST_CERTIFICATE_D
+ ST_SEND_SERVER_FINISHED_A
+ ST_SEND_SERVER_FINISHED_B
+ ST_SEND_SERVER_HELLO_A
+ ST_SEND_SERVER_HELLO_B
+ ST_SEND_SERVER_VERIFY_A
+ ST_SEND_SERVER_VERIFY_B
+ ST_SERVER_START_ENCRYPTION
+ ST_X509_GET_CLIENT_CERTIFICATE
+ ST_X509_GET_SERVER_CERTIFICATE
+ TXT_DES_192_EDE3_CBC_WITH_MD5
+ TXT_DES_192_EDE3_CBC_WITH_SHA
+ TXT_DES_64_CBC_WITH_MD5
+ TXT_DES_64_CBC_WITH_SHA
+ TXT_DES_64_CFB64_WITH_MD5_1
+ TXT_IDEA_128_CBC_WITH_MD5
+ TXT_NULL
+ TXT_NULL_WITH_MD5
+ TXT_RC2_128_CBC_EXPORT40_WITH_MD5
+ TXT_RC2_128_CBC_WITH_MD5
+ TXT_RC4_128_EXPORT40_WITH_MD5
+ TXT_RC4_128_WITH_MD5
+ VERIFY_CLIENT_ONCE
+ VERIFY_FAIL_IF_NO_PEER_CERT
+ VERIFY_NONE
+ VERIFY_PEER
+ WRITING
+ X509_LOOKUP
+ X509_V_FLAG_CB_ISSUER_CHECK
+ X509_V_FLAG_USE_CHECK_TIME
+ X509_V_FLAG_CRL_CHECK
+ X509_V_FLAG_CRL_CHECK_ALL
+ X509_V_FLAG_IGNORE_CRITICAL
+ CTX_new
+ CTX_v2_new
+ CTX_v3_new
+ CTX_v23_new
+ CTX_free
+ new
+ free
+ accept
+ clear
+ connect
+ set_fd
+ set_rfd
+ set_wfd
+ get_fd
+ read
+ write
+ peek
+ use_RSAPrivateKey
+ use_RSAPrivateKey_ASN1
+ use_RSAPrivateKey_file
+ CTX_use_RSAPrivateKey_file
+ use_PrivateKey
+ use_PrivateKey_ASN1
+ use_PrivateKey_file
+ use_certificate
+ use_certificate_ASN1
+ use_certificate_file
+ CTX_use_certificate_file
+ load_error_strings
+ ERR_load_SSL_strings
+ ERR_load_RAND_strings
+ state_string
+ rstate_string
+ state_string_long
+ rstate_string_long
+ get_time
+ set_time
+ get_timeout
+ set_timeout
+ copy_session_id
+ set_read_ahead
+ get_read_ahead
+ pending
+ get_cipher_list
+ set_cipher_list
+ get_cipher
+ get_shared_ciphers
+ get_peer_certificate
+ set_verify
+ flush_sessions
+ set_bio
+ get_rbio
+ get_wbio
+ SESSION_new
+ SESSION_print
+ SESSION_free
+ i2d_SSL_SESSION
+ set_session
+ add_session
+ remove_session
+ d2i_SSL_SESSION
+ BIO_f_ssl
+ BIO_new
+ BIO_new_file
+ BIO_s_mem
+ BIO_free
+ BIO_read
+ BIO_write
+ BIO_eof
+ BIO_pending
+ BIO_wpending
+ ERR_get_error
+ ERR_error_string
+ err
+ clear_error
+ X509_get_issuer_name
+ X509_get_subject_name
+ X509_NAME_oneline
+ X509_NAME_get_text_by_NID
+ CTX_get_cert_store
+ X509_STORE_add_cert
+ X509_STORE_add_crl
+ X509_STORE_CTX_set_flags
+ X509_load_cert_file
+ X509_load_crl_file
+ X509_load_cert_crl_file
+ PEM_read_bio_X509_CRL
+ die_if_ssl_error
+ die_now
+ print_errs
+ set_cert_and_key
+ set_server_cert_and_key
+ make_form
+ make_headers
+ do_https
+ get_https
+ post_https
+ get_https4
+ post_https4
+ sslcat
+ ssl_read_CRLF
+ ssl_read_all
+ ssl_read_until
+ ssl_write_CRLF
+ ssl_write_all
+ get_http
+ post_http
+ get_httpx
+ post_httpx
+ get_https3
+ post_https3
+ get_http4
+ post_http4
+ get_httpx4
+ post_httpx4
+ tcpcat
+ tcpxcat
+ tcp_read_CRLF
+ tcp_read_all
+ tcp_read_until
+ tcp_write_CRLF
+ tcp_write_all
+ dump_peer_certificate
+ RSA_generate_key
+ RSA_free
+ X509_free
+ SESSION_get_master_key
+ get_client_random
+ get_server_random
+);
+
+sub AUTOLOAD {
+ # This AUTOLOAD is used to 'autoload' constants from the constant()
+ # XS function. If a constant is not found then control is passed
+ # to the AUTOLOAD in AutoLoader.
+
+ my $constname;
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ my $val = constant($constname);
+ if ($! != 0) {
+ if ($! =~ /((Invalid)|(not valid))/i || $!{EINVAL}) {
+ $AutoLoader::AUTOLOAD = $AUTOLOAD;
+ goto &AutoLoader::AUTOLOAD;
+ }
+ else {
+ croak "Your vendor has not defined SSLeay macro $constname";
+ }
+ }
+ eval "sub $AUTOLOAD { $val }";
+ goto &$AUTOLOAD;
+}
+
+eval {
+ require XSLoader;
+ XSLoader::load('Net::SSLeay', $VERSION);
+ 1;
+} or do {
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ bootstrap Net::SSLeay $VERSION;
+};
+
+# Preloaded methods go here.
+
+$CRLF = "\x0d\x0a"; # because \r\n is not fully portable
+
+### Print SSLeay error stack
+
+sub print_errs {
+ my ($msg) = @_;
+ my ($count, $err, $errs, $e) = (0,0,'');
+ while ($err = ERR_get_error()) {
+ $count ++;
+ $e = "$msg $$: $count - " . ERR_error_string($err) . "\n";
+ $errs .= $e;
+ warn $e if $Net::SSLeay::trace;
+ }
+ return $errs;
+}
+
+# Death is conditional to SSLeay errors existing, i.e. this function checks
+# for errors and only dies in affirmative.
+# usage: Net::SSLeay::write($ssl, "foo") or die_if_ssl_error("SSL write ($!)");
+
+sub die_if_ssl_error {
+ my ($msg) = @_;
+ die "$$: $msg\n" if print_errs($msg);
+}
+
+# Unconditional death. Used to print SSLeay errors before dying.
+# usage: Net::SSLeay::connect($ssl) or die_now("Failed SSL connect ($!)");
+
+sub die_now {
+ my ($msg) = @_;
+ print_errs($msg);
+ die "$$: $msg\n";
+}
+
+# Perl 5.6.* unicode support causes that length() no longer reliably
+# reflects the byte length of a string. This eval is to fix that.
+# Thanks to Sean Burke for the snippet.
+
+BEGIN{
+eval 'use bytes; sub blength ($) { length $_[0] }';
+$@ and eval ' sub blength ($) { length $_[0] }' ;
+}
+
+# Autoload methods go after =cut, and are processed by the autosplit program.
+
+1;
+__END__
+# Documentation. Use `perl-root/pod/pod2html SSLeay.pm` to output html
+
+=head1 NAME
+
+Net::SSLeay - Perl extension for using OpenSSL
+
+=head1 SYNOPSIS
+
+ use Net::SSLeay qw(get_https post_https sslcat make_headers make_form);
+
+ ($page) = get_https('www.bacus.pt', 443, '/'); # 1
+
+ ($page, $response, %reply_headers)
+ = get_https('www.bacus.pt', 443, '/', # 2
+ make_headers(User-Agent => 'Cryptozilla/5.0b1',
+ Referer => 'https://www.bacus.pt'
+ ));
+
+ ($page, $result, %headers) = # 2b
+ = get_https('www.bacus.pt', 443, '/protected.html',
+ make_headers(Authorization =>
+ 'Basic ' . MIME::Base64::encode("$user:$pass",''))
+ );
+
+ ($page, $response, %reply_headers)
+ = post_https('www.bacus.pt', 443, '/foo.cgi', '', # 3
+ make_form(OK => '1',
+ name => 'Sampo'
+ ));
+
+ $reply = sslcat($host, $port, $request); # 4
+
+ ($reply, $err, $server_cert) = sslcat($host, $port, $request); # 5
+
+ $Net::SSLeay::trace = 2; # 0=no debugging, 1=ciphers, 2=trace, 3=dump data
+
+=head1 DESCRIPTION
+
+There is a related module called C<Net::SSLeay::Handle> included in this
+distribution that you might want to use instead. It has its own pod
+documentation.
+
+This module offers some high level convinience functions for accessing
+web pages on SSL servers (for symmetry, same API is offered for
+accessing http servers, too), a C<sslcat()> function for writing your own
+clients, and finally access to the SSL api of SSLeay/OpenSSL package
+so you can write servers or clients for more complicated applications.
+
+For high level functions it is most convinient to import them to your
+main namespace as indicated in the synopsis.
+
+Case 1 demonstrates typical invocation of get_https() to fetch an HTML
+page from secure server. The first argument provides host name or ip
+in dotted decimal notation of the remote server to contact. Second
+argument is the TCP port at the remote end (your own port is picked
+arbitrarily from high numbered ports as usual for TCP). The third
+argument is the URL of the page without the host name part. If in
+doubt consult HTTP specifications at L<http://www.w3c.org>.
+
+Case 2 demonstrates full fledged use of C<get_https()>. As can be seen,
+C<get_https()> parses the response and response headers and returns them as
+a list, which can be captured in a hash for later reference. Also a
+fourth argument to C<get_https()> is used to insert some additional headers
+in the request. C<make_headers()> is a function that will convert a list or
+hash to such headers. By default C<get_https()> supplies C<Host> (make virtual
+hosting easy) and C<Accept> (reportedly needed by IIS) headers.
+
+Case 2b demonstrates how to get password protected page. Refer to
+HTTP protocol specifications for further details (e.g. RFC-2617).
+
+Case 3 invokes C<post_https()> to submit a HTML/CGI form to secure
+server. First four arguments are equal to C<get_https()> (note that empty
+string (C<''>) is passed as header argument). The fifth argument is the
+contents of the form formatted according to CGI specification. In this
+case the helper function C<make_https()> is used to do the formatting,
+but you could pass any string. The C<post_https()> automatically adds
+C<Content-Type> and C<Content-Length> headers to the request.
+
+Case 4 shows the fundamental C<sslcat()> function (inspired in spirit by
+C<netcat> utility :-). Its your swiss army knife that allows you to
+easily contact servers, send some data, and then get the response. You
+are responsible for formatting the data and parsing the response -
+C<sslcat()> is just a transport.
+
+Case 5 is a full invocation of C<sslcat()> which allows return of errors
+as well as the server (peer) certificate.
+
+The C<$trace> global variable can be used to control the verbosity of high
+level functions. Level 0 guarantees silence, level 1 (the default)
+only emits error messages.
+
+=head2 Alternate versions of the API
+
+The above mentioned functions actually return the response headers as
+a list, which only gets converted to hash upon assignment (this
+assignment looses information if the same header occurs twice, as may
+be the case with cookies). There are also other variants of the
+functions that return unprocessed headers and that return a reference
+to a hash.
+
+ ($page, $response, @headers) = get_https('www.bacus.pt', 443, '/');
+ for ($i = 0; $i < $#headers; $i+=2) {
+ print "$headers[$i] = " . $headers[$i+1] . "\n";
+ }
+
+ ($page, $response, $headers, $server_cert)
+ = get_https3('www.bacus.pt', 443, '/');
+ print "$headers\n";
+
+ ($page, $response, %headers_ref, $server_cert)
+ = get_https4('www.bacus.pt', 443, '/');
+ for $k (sort keys %{headers_ref}) {
+ for $v (@{$headers_ref{$k}}) {
+ print "$k = $v\n";
+ }
+ }
+
+All of the above code fragments accomplish the same thing: display all
+values of all headers. The API functions ending in "3" return the
+headers simply as a scalar string and it is up to the application to
+split them up. The functions ending in "4" return a reference to
+hash of arrays (see L<perlref> and L<perllol> if you are
+not familiar with complex perl data structures). To access single value
+of such header hash you would do something like
+
+ print $headers_ref{COOKIE}[0];
+
+The variants 3 and 4 also allow you to discover the server certificate
+in case you would like to store or display it, e.g.
+
+ ($p, $resp, $hdrs, $server_cert) = get_https3('www.bacus.pt', 443, '/');
+ if (!defined($server_cert) || ($server_cert == 0)) {
+ warn "Subject Name: undefined, Issuer Name: undefined";
+ } else {
+ warn 'Subject Name: '
+ . Net::SSLeay::X509_NAME_oneline(
+ Net::SSLeay::X509_get_subject_name($server_cert))
+ . 'Issuer Name: '
+ . Net::SSLeay::X509_NAME_oneline(
+ Net::SSLeay::X509_get_issuer_name($server_cert));
+ }
+
+Beware that this method only allows after the fact verification of
+the certificate: by the time C<get_https3()> has returned the https
+request has already been sent to the server, whether you decide to
+tryst it or not. To do the verification correctly you must either
+employ the OpenSSL certificate verification framework or use
+the lower level API to first connect and verify the certificate
+and only then send the http data. See implementation of C<ds_https3()>
+for guidance on how to do this.
+
+=head2 Using client certificates
+
+Secure web communications are encrypted using symmetric crypto keys
+exchanged using encryption based on the certificate of the
+server. Therefore in all SSL connections the server must have a
+certificate. This serves both to authenticate the server to the
+clients and to perform the key exchange.
+
+Sometimes it is necessary to authenticate the client as well. Two
+options are available: HTTP basic authentication and client side
+certificate. The basic authentication over HTTPS is actually quite
+safe because HTTPS guarantees that the password will not travel in
+clear. Never-the-less, problems like easily guessable passwords
+remain. The client certificate method involves authentication of the
+client at SSL level using a certificate. For this to work, both the
+client and the server will have certificates (which typically are
+different) and private keys.
+
+The API functions outlined above accept additional arguments that
+allow one to supply the client side certificate and key files. The
+format of these files is the same as used for server certificates and
+the caveat about encrypting private key applies.
+
+ ($page, $result, %headers) = # 2c
+ = get_https('www.bacus.pt', 443, '/protected.html',
+ make_headers(Authorization =>
+ 'Basic ' . MIME::Base64::encode("$user:$pass",'')),
+ '', $mime_type6, $path_to_crt7, $path_to_key8);
+
+ ($page, $response, %reply_headers)
+ = post_https('www.bacus.pt', 443, '/foo.cgi', # 3b
+ make_headers('Authorization' =>
+ 'Basic ' . MIME::Base64::encode("$user:$pass",'')),
+ make_form(OK => '1', name => 'Sampo'),
+ $mime_type6, $path_to_crt7, $path_to_key8);
+
+Case 2c demonstrates getting password protected page that also requires
+client certificate, i.e. it is possible to use both authentication
+methods simultaneously.
+
+Case 3b is full blown post to secure server that requires both password
+authentication and client certificate, just like in case 2c.
+
+Note: Client will not send a certificate unless the server requests one.
+This is typically achieved by setting verify mode to C<VERIFY_PEER> on the
+server:
+
+ Net::SSLeay::set_verify(ssl, Net::SSLeay::VERIFY_PEER, 0);
+
+See C<perldoc ~openssl/doc/ssl/SSL_CTX_set_verify.pod> for full description.
+
+=head2 Working through Web proxy
+
+C<Net::SSLeay> can use a web proxy to make its connections. You need to
+first set the proxy host and port using C<set_proxy()> and then just
+use the normal API functions, e.g:
+
+ Net::SSLeay::set_proxy('gateway.myorg.com', 8080);
+ ($page) = get_https('www.bacus.pt', 443, '/');
+
+If your proxy requires authentication, you can supply username and
+password as well
+
+ Net::SSLeay::set_proxy('gateway.myorg.com', 8080, 'joe', 'salainen');
+ ($page, $result, %headers) =
+ = get_https('www.bacus.pt', 443, '/protected.html',
+ make_headers(Authorization =>
+ 'Basic ' . MIME::Base64::encode("susie:pass",''))
+ );
+
+This example demonstrates case where we authenticate to the proxy as
+C<"joe"> and to the final web server as C<"susie">. Proxy authentication
+requires C<MIME::Base64> module to work.
+
+=head2 Certificate verification and Certificate Revoocation Lists (CRLs)
+
+OpenSSL supports the ability to verify peer certificates. It can also
+optionally check the peer certificate against a Certificate Revocation
+List (CRL) from the certificates issuer. A CRL is a file, created by
+the certificate issuer that lists all the certificates that it
+previously signed, but which it now revokes. CRLs are in PEM format.
+
+You can enable C<Net::SSLeay CRL> checking like this:
+
+ &Net::SSLeay::X509_STORE_CTX_set_flags
+ (&Net::SSLeay::CTX_get_cert_store($ssl),
+ &Net::SSLeay::X509_V_FLAG_CRL_CHECK);
+
+After setting this flag, if OpenSSL checks a peer's certificate, then
+it will attempt to find a CRL for the issuer. It does this by looking
+for a specially named file in the search directory specified by
+CTX_load_verify_locations. CRL files are named with the hash of the
+issuer's subject name, followed by C<.r0>, C<.r1> etc. For example
+C<ab1331b2.r0>, C<ab1331b2.r1>. It will read all the .r files for the
+issuer, and then check for a revocation of the peer cerificate in all
+of them. (You can also force it to look in a specific named CRL
+file., see below). You can find out the hash of the issuer subject
+name in a CRL with
+
+ openssl crl -in crl.pem -hash -noout
+
+If the peer certificate does not pass the revocation list, or if no
+CRL is found, then the handshaking fails with an error.
+
+You can also force OpenSSL to look for CRLs in one or more arbitrarily
+named files.
+
+ my $bio = Net::SSLeay::BIO_new_file($crlfilename, 'r');
+ my $crl = Net::SSLeay::PEM_read_bio_X509_CRL($bio);
+ if ($crl) {
+ Net::SSLeay::X509_STORE_add_crl(Net::SSLeay::CTX_get_cert_store($ssl, $crl);
+ } else {
+ error reading CRL....
+ }
+
+
+=head2 Convenience routines
+
+To be used with Low level API
+
+ Net::SSLeay::randomize($rn_seed_file,$additional_seed);
+ Net::SSLeay::set_cert_and_key($ctx, $cert_path, $key_path);
+ $cert = Net::SSLeay::dump_peer_certificate($ssl);
+ Net::SSLeay::ssl_write_all($ssl, $message) or die "ssl write failure";
+ $got = Net::SSLeay::ssl_read_all($ssl) or die "ssl read failure";
+
+ $got = Net::SSLeay::ssl_read_CRLF($ssl [, $max_length]);
+ $got = Net::SSLeay::ssl_read_until($ssl [, $delimit [, $max_length]]);
+ Net::SSLeay::ssl_write_CRLF($ssl, $message);
+
+C<randomize()> seeds the eay PRNG with C</dev/urandom> (see top of C<SSLeay.pm>
+for how to change or configure this) and optionally with user provided
+data. It is very important to properly seed your random numbers, so
+do not forget to call this. The high level API functions automatically
+call C<randomize()> so it is not needed with them. See also caveats.
+
+C<set_cert_and_key()> takes two file names as arguments and sets
+the certificate and private key to those. This can be used to
+set either cerver certificates or client certificates.
+
+C<dump_peer_certificate()> allows you to get plaintext description of the
+certificate the peer (usually server) presented to us.
+
+C<ssl_read_all()> and C<ssl_write_all()> provide true blocking semantics for
+these operations (see limitation, below, for explanation). These are
+much preferred to the low level API equivalents (which implement BSD
+blocking semantics). The message argument to C<ssl_write_all()> can be
+reference. This is helpful to avoid unnecessary copy when writing
+something big, e.g:
+
+ $data = 'A' x 1000000000;
+ Net::SSLeay::ssl_write_all($ssl, \$data) or die "ssl write failed";
+
+C<ssl_read_CRLF()> uses C<ssl_read_all()> to read in a line terminated with a
+carriage return followed by a linefeed (CRLF). The CRLF is included in
+the returned scalar.
+
+C<ssl_read_until()> uses C<ssl_read_all()> to read from the SSL input
+stream until it encounters a programmer specified delimiter.
+If the delimiter is undefined, C<$/> is used. If C<$/> is undefined,
+C<\n> is used. One can optionally set a maximum length of bytes to read
+from the SSL input stream.
+
+C<ssl_write_CRLF()> writes C<$message> and appends CRLF to the SSL output stream.
+
+=head2 Low level API
+
+In addition to the high level functions outlined above, this module
+contains straight forward access to SSL part of OpenSSL C api. Only the SSL
+subpart of OpenSSL is implemented (if anyone wants to implement other
+parts, feel free to submit patches).
+
+See C<ssl.h> header from OpenSSL C distribution for list of low lever
+SSLeay functions to call (to check if some function has been
+implemented see directly in SSLeay.xs). The module strips SSLeay names
+of the initial C<"SSL_">, generally you should use C<Net::SSLeay::> in
+place. For example:
+
+In C:
+
+ #include <ssl.h>
+
+ err = SSL_set_verify (ssl, SSL_VERIFY_CLIENT_ONCE,
+ &your_call_back_here);
+
+In Perl:
+
+ use Net::SSLeay;
+
+ $err = Net::SSLeay::set_verify ($ssl,
+ Net::SSLeay::VERIFY_CLIENT_ONCE,
+ \&your_call_back_here);
+
+If the function does not start by C<SSL_> you should use the full
+function name, e.g.:
+
+ $err = Net::SSLeay::ERR_get_error;
+
+Following new functions behave in perlish way:
+
+ $got = Net::SSLeay::read($ssl);
+ # Performs SSL_read, but returns $got
+ # resized according to data received.
+ # Returns undef on failure.
+
+ Net::SSLeay::write($ssl, $foo) || die;
+ # Performs SSL_write, but automatically
+ # figures out the size of $foo
+
+In order to use the low level API you should start your programs with
+the following incantation:
+
+ use Net::SSLeay qw(die_now die_if_ssl_error);
+ Net::SSLeay::load_error_strings();
+ Net::SSLeay::SSLeay_add_ssl_algorithms(); # Important!
+ Net::SSLeay::ENGINE_load_builtin_engines(); # If you want built-in engines
+ Net::SSLeay::ENGINE_register_all_complete(); # If you want built-in engines
+ Net::SSLeay::randomize();
+
+C<die_now()> and C<die_if_ssl_error()> are used to conveniently print SSLeay error
+stack when something goes wrong, thusly:
+
+ Net::SSLeay::connect($ssl) or die_now("Failed SSL connect ($!)");
+ Net::SSLeay::write($ssl, "foo") or die_if_ssl_error("SSL write ($!)");
+
+You can also use C<Net::SSLeay::print_errs()> to dump the error stack without
+exiting the program. As can be seen, your code becomes much more readable
+if you import the error reporting functions to your main name space.
+
+I can not emphasize enough the need to check error returns. Use these
+functions even in most simple programs, they will reduce debugging
+time greatly. Do not ask questions in mailing list without having
+first sprinkled these in your code.
+
+=head2 Sockets
+
+Perl uses file handles for all I/O. While SSLeay has quite flexible BIO
+mechanism and perl has evolved PerlIO mechanism, this module still
+sticks to using file descriptors. Thus to attach SSLeay to socket you
+should use C<fileno()> to extract the underlying file descriptor:
+
+ Net::SSLeay::set_fd($ssl, fileno(S)); # Must use fileno
+
+You should also set C<$|> to 1 to eliminate STDIO buffering so you do not
+get confused if you use perl I/O functions to manipulate your socket
+handle.
+
+If you need to C<select(2)> on the socket, go right ahead, but be warned
+that OpenSSL does some internal buffering so SSL_read does not always
+return data even if socket selected for reading (just keep on
+selecting and trying to read). C<Net::SSLeay> is no different from the
+C language OpenSSL in this respect.
+
+=head2 Callbacks
+
+At this moment the implementation of verify_callback is crippeled in
+the sense that at any given time there can be only one call back which
+is shared by all SSL contexts, sessions and connections. This is
+due to having to keep the reference to the perl call back in a
+static variable so that the callback C glue can find it. To remove
+this restriction would require either a more complex data structure
+(like a hash?) in XSUB to map the call backs to their owners or,
+cleaner, adding a context pointer in the SSL structure. This context would
+then be passed to the C callback, which in our case would be the glue
+to look up the proper Perl function from the context and call it.
+
+---- inaccurate ----
+The verify call back looks like this in C:
+
+ int (*callback)(int ok,X509 *subj_cert,X509 *issuer_cert,
+ int depth,int errorcode,char *arg,STACK *cert_chain)
+
+The corresponding Perl function should be something like this:
+
+ sub verify {
+ my ($ok, $subj_cert, $issuer_cert, $depth, $errorcode,
+ $arg, $chain) = @_;
+ print "Verifying certificate...\n";
+ ...
+ return $ok;
+ }
+
+It is used like this:
+
+ Net::SSLeay::set_verify ($ssl, Net::SSLeay::VERIFY_PEER, \&verify);
+
+Callbacks for decrypting private keys are implemented, but have the
+same limitation as the verify_callback implementation (one password
+callback shared between all contexts.) You might use it something
+like this:
+
+ Net::SSLeay::CTX_set_default_passwd_cb($ctx, sub { "top-secret" });
+ Net::SSLeay::CTX_use_PrivateKey_file($ctx, "key.pem",
+ Net::SSLeay::FILETYPE_PEM)
+ or die "Error reading private key";
+ Net::SSLeay::CTX_set_default_passwd_cb($ctx, undef);
+
+No other callbacks are implemented. You do not need to use any
+callback for simple (i.e. normal) cases where the SSLeay built-in
+verify mechanism satisfies your needs.
+
+It is desirable to reset these callbacks to undef immediately after use to prevent
+thread safety problems and crashes on exit that can occur if different threads
+set different callbacks.
+
+---- end inaccurate ----
+
+If you want to use callback stuff, see examples/callback.pl! Its the
+only one I am able to make work reliably.
+
+=head2 X509 and RAND stuff
+
+This module largely lacks interface to the X509 and RAND routines, but
+as I was lazy and needed them, the following kludges are implemented:
+
+ $x509_name = Net::SSLeay::X509_get_subject_name($x509_cert);
+ $x509_name = Net::SSLeay::X509_get_issuer_name($x509_cert);
+ print Net::SSLeay::X509_NAME_oneline($x509_name);
+ $text = Net::SSLeay::X509_NAME_get_text_by_NID($name, $nid);
+
+ ($type1, $subject1, $type2, $subject2, ...) =
+ Net::SSLeay::X509_get_subjectAltNames($x509_cert)
+
+ subjectAltName types as per x509v3.h GEN_*, for example
+ GEN_DNS or GEN_IPADD which can be imported.
+
+ Net::SSLeay::RAND_seed($buf); # Perlishly figures out buf size
+ Net::SSLeay::RAND_bytes($buf, $num);
+ Net::SSLeay::RAND_pseudo_bytes($buf, $num);
+ Net::SSLeay::RAND_add($buf, $num, $entropy);
+ Net::SSLeay::RAND_poll();
+ Net::SSLeay::RAND_status();
+ Net::SSLeay::RAND_cleanup();
+ Net::SSLeay::RAND_file_name($num);
+ Net::SSLeay::RAND_load_file($file_name, $how_many_bytes);
+ Net::SSLeay::RAND_write_file($file_name);
+ Net::SSLeay::RAND_egd($path);
+ Net::SSLeay::RAND_egd_bytes($path, $bytes);
+
+Actually you should consider using the following helper functions:
+
+ print Net::SSLeay::dump_peer_certificate($ssl);
+ Net::SSLeay::randomize();
+
+=head2 RSA interface
+
+Some RSA functions are available:
+
+ $rsakey = Net::SSLeay::RSA_generate_key();
+ Net::SSLeay::CTX_set_tmp_rsa($ctx, $rsakey);
+ Net::SSLeay::RSA_free($rsakey);
+
+=head2 BIO interface
+
+Some BIO functions are available:
+
+ Net::SSLeay::BIO_s_mem();
+ $bio = Net::SSLeay::BIO_new(BIO_s_mem())
+ $bio = Net::SSLeay::BIO_new_file($filename, $mode);
+ Net::SSLeay::BIO_free($bio)
+ $count = Net::SSLeay::BIO_write($data);
+ $data = Net::SSLeay::BIO_read($bio);
+ $data = Net::SSLeay::BIO_read($bio, $maxbytes);
+ $is_eof = Net::SSLeay::BIO_eof($bio);
+ $count = Net::SSLeay::BIO_pending($bio);
+ $count = Net::SSLeay::BIO_wpending ($bio);
+
+=head2 Low level API
+
+Some very low level API functions are available:
+
+ $client_random = Net::SSLeay::get_client_random($ssl);
+ $server_random = Net::SSLeay::get_server_random($ssl);
+ $session = Net::SSLeay::get_session($ssl);
+ $master_key = Net::SSLeay::SESSION_get_master_key($session);
+ Net::SSLeay::SESSION_set_master_key($session, $master_secret);
+ $keyblocksize = Net::SSLeay::get_keyblock_size($session);
+
+=head2 HTTP (without S) API
+
+Over the years it has become clear that it would be convenient to use
+the light weight flavour API of C<Net::SSLeay> also for normal HTTP (see
+LWP for heavy weight object oriented approach). In fact it would be
+nice to be able to flip https on and off on the fly. Thus regular HTTP
+support was evolved.
+
+ use Net::SSLeay qw(get_http post_http tcpcat
+ get_httpx post_httpx tcpxcat
+ make_headers make_form);
+
+ ($page, $result, %headers) =
+ = get_http('www.bacus.pt', 443, '/protected.html',
+ make_headers(Authorization =>
+ 'Basic ' . MIME::Base64::encode("$user:$pass",''))
+ );
+
+ ($page, $response, %reply_headers)
+ = post_http('www.bacus.pt', 443, '/foo.cgi', '',
+ make_form(OK => '1',
+ name => 'Sampo'
+ ));
+
+ ($reply, $err) = tcpcat($host, $port, $request);
+
+ ($page, $result, %headers) =
+ = get_httpx($usessl, 'www.bacus.pt', 443, '/protected.html',
+ make_headers(Authorization =>
+ 'Basic ' . MIME::Base64::encode("$user:$pass",''))
+ );
+
+ ($page, $response, %reply_headers)
+ = post_httpx($usessl, 'www.bacus.pt', 443, '/foo.cgi', '',
+ make_form(OK => '1', name => 'Sampo' ));
+
+ ($reply, $err, $server_cert) = tcpxcat($usessl, $host, $port, $request);
+
+As can be seen, the C<"x"> family of APIs takes as first argument a flag
+which indicated whether SSL is used or not.
+
+=head1 EXAMPLES
+
+One very good example is to look at the implementation of C<sslcat()> in the
+C<SSLeay.pm> file.
+
+Following is a simple SSLeay client (with too little error checking :-(
+
+ #!/usr/local/bin/perl
+ use Socket;
+ use Net::SSLeay qw(die_now die_if_ssl_error) ;
+ Net::SSLeay::load_error_strings();
+ Net::SSLeay::SSLeay_add_ssl_algorithms();
+ Net::SSLeay::randomize();
+
+ ($dest_serv, $port, $msg) = @ARGV; # Read command line
+ $port = getservbyname ($port, 'tcp') unless $port =~ /^\d+$/;
+ $dest_ip = gethostbyname ($dest_serv);
+ $dest_serv_params = sockaddr_in($port, $dest_ip);
+
+ socket (S, &AF_INET, &SOCK_STREAM, 0) or die "socket: $!";
+ connect (S, $dest_serv_params) or die "connect: $!";
+ select (S); $| = 1; select (STDOUT); # Eliminate STDIO buffering
+
+ # The network connection is now open, lets fire up SSL
+
+ $ctx = Net::SSLeay::CTX_new() or die_now("Failed to create SSL_CTX $!");
+ Net::SSLeay::CTX_set_options($ctx, &Net::SSLeay::OP_ALL)
+ and die_if_ssl_error("ssl ctx set options");
+ $ssl = Net::SSLeay::new($ctx) or die_now("Failed to create SSL $!");
+ Net::SSLeay::set_fd($ssl, fileno(S)); # Must use fileno
+ $res = Net::SSLeay::connect($ssl) and die_if_ssl_error("ssl connect");
+ print "Cipher `" . Net::SSLeay::get_cipher($ssl) . "'\n";
+
+ # Exchange data
+
+ $res = Net::SSLeay::write($ssl, $msg); # Perl knows how long $msg is
+ die_if_ssl_error("ssl write");
+ CORE::shutdown S, 1; # Half close --> No more output, sends EOF to server
+ $got = Net::SSLeay::read($ssl); # Perl returns undef on failure
+ die_if_ssl_error("ssl read");
+ print $got;
+
+ Net::SSLeay::free ($ssl); # Tear down connection
+ Net::SSLeay::CTX_free ($ctx);
+ close S;
+
+Following is a simple SSLeay echo server (non forking):
+
+ #!/usr/local/bin/perl -w
+ use Socket;
+ use Net::SSLeay qw(die_now die_if_ssl_error);
+ Net::SSLeay::load_error_strings();
+ Net::SSLeay::SSLeay_add_ssl_algorithms();
+ Net::SSLeay::randomize();
+
+ $our_ip = "\0\0\0\0"; # Bind to all interfaces
+ $port = 1235;
+ $sockaddr_template = 'S n a4 x8';
+ $our_serv_params = pack ($sockaddr_template, &AF_INET, $port, $our_ip);
+
+ socket (S, &AF_INET, &SOCK_STREAM, 0) or die "socket: $!";
+ bind (S, $our_serv_params) or die "bind: $!";
+ listen (S, 5) or die "listen: $!";
+ $ctx = Net::SSLeay::CTX_new () or die_now("CTX_new ($ctx): $!");
+ Net::SSLeay::CTX_set_options($ctx, &Net::SSLeay::OP_ALL)
+ and die_if_ssl_error("ssl ctx set options");
+
+ # Following will ask password unless private key is not encrypted
+ Net::SSLeay::CTX_use_RSAPrivateKey_file ($ctx, 'plain-rsa.pem',
+ &Net::SSLeay::FILETYPE_PEM);
+ die_if_ssl_error("private key");
+ Net::SSLeay::CTX_use_certificate_file ($ctx, 'plain-cert.pem',
+ &Net::SSLeay::FILETYPE_PEM);
+ die_if_ssl_error("certificate");
+
+ while (1) {
+ print "Accepting connections...\n";
+ ($addr = accept (NS, S)) or die "accept: $!";
+ select (NS); $| = 1; select (STDOUT); # Piping hot!
+
+ ($af,$client_port,$client_ip) = unpack($sockaddr_template,$addr);
+ @inetaddr = unpack('C4',$client_ip);
+ print "$af connection from " .
+ join ('.', @inetaddr) . ":$client_port\n";
+
+ # We now have a network connection, lets fire up SSLeay...
+
+ $ssl = Net::SSLeay::new($ctx) or die_now("SSL_new ($ssl): $!");
+ Net::SSLeay::set_fd($ssl, fileno(NS));
+
+ $err = Net::SSLeay::accept($ssl) and die_if_ssl_error('ssl accept');
+ print "Cipher `" . Net::SSLeay::get_cipher($ssl) . "'\n";
+
+ # Connected. Exchange some data.
+
+ $got = Net::SSLeay::read($ssl); # Returns undef on fail
+ die_if_ssl_error("ssl read");
+ print "Got `$got' (" . length ($got) . " chars)\n";
+
+ Net::SSLeay::write ($ssl, uc ($got)) or die "write: $!";
+ die_if_ssl_error("ssl write");
+
+ Net::SSLeay::free ($ssl); # Tear down connection
+ close NS;
+ }
+
+Yet another echo server. This one runs from C</etc/inetd.conf> so it avoids
+all the socket code overhead. Only caveat is opening rsa key file -
+it had better be without any encryption or else it will not know where
+to ask for the password. Note how C<STDIN> and C<STDOUT> are wired to SSL.
+
+ #!/usr/local/bin/perl
+ # /etc/inetd.conf
+ # ssltst stream tcp nowait root /path/to/server.pl server.pl
+ # /etc/services
+ # ssltst 1234/tcp
+
+ use Net::SSLeay qw(die_now die_if_ssl_error);
+ Net::SSLeay::load_error_strings();
+ Net::SSLeay::SSLeay_add_ssl_algorithms();
+ Net::SSLeay::randomize();
+
+ chdir '/key/dir' or die "chdir: $!";
+ $| = 1; # Piping hot!
+ open LOG, ">>/dev/console" or die "Can't open log file $!";
+ select LOG; print "server.pl started\n";
+
+ $ctx = Net::SSLeay::CTX_new() or die_now "CTX_new ($ctx) ($!)";
+ $ssl = Net::SSLeay::new($ctx) or die_now "new ($ssl) ($!)";
+ Net::SSLeay::set_options($ssl, &Net::SSLeay::OP_ALL)
+ and die_if_ssl_error("ssl set options");
+
+ # We get already open network connection from inetd, now we just
+ # need to attach SSLeay to STDIN and STDOUT
+ Net::SSLeay::set_rfd($ssl, fileno(STDIN));
+ Net::SSLeay::set_wfd($ssl, fileno(STDOUT));
+
+ Net::SSLeay::use_RSAPrivateKey_file ($ssl, 'plain-rsa.pem',
+ Net::SSLeay::FILETYPE_PEM);
+ die_if_ssl_error("private key");
+ Net::SSLeay::use_certificate_file ($ssl, 'plain-cert.pem',
+ Net::SSLeay::FILETYPE_PEM);
+ die_if_ssl_error("certificate");
+
+ Net::SSLeay::accept($ssl) and die_if_ssl_err("ssl accept: $!");
+ print "Cipher `" . Net::SSLeay::get_cipher($ssl) . "'\n";
+
+ $got = Net::SSLeay::read($ssl);
+ die_if_ssl_error("ssl read");
+ print "Got `$got' (" . length ($got) . " chars)\n";
+
+ Net::SSLeay::write ($ssl, uc($got)) or die "write: $!";
+ die_if_ssl_error("ssl write");
+
+ Net::SSLeay::free ($ssl); # Tear down the connection
+ Net::SSLeay::CTX_free ($ctx);
+ close LOG;
+
+There are also a number of example/test programs in the examples directory:
+
+ sslecho.pl - A simple server, not unlike the one above
+ minicli.pl - Implements a client using low level SSLeay routines
+ sslcat.pl - Demonstrates using high level sslcat utility function
+ get_page.pl - Is a utility for getting html pages from secure servers
+ callback.pl - Demonstrates certificate verification and callback usage
+ stdio_bulk.pl - Does SSL over Unix pipes
+ ssl-inetd-serv.pl - SSL server that can be invoked from inetd.conf
+ httpd-proxy-snif.pl - Utility that allows you to see how a browser
+ sends https request to given server and what reply
+ it gets back (very educative :-)
+ makecert.pl - Creates a self signed cert (does not use this module)
+
+=head1 LIMITATIONS
+
+C<Net::SSLeay::read()> uses internal buffer of 32KB, thus no single read
+will return more. In practice one read returns much less, usually
+as much as fits in one network packet. To work around this,
+you should use a loop like this:
+
+ $reply = '';
+ while ($got = Net::SSLeay::read($ssl)) {
+ last if print_errs('SSL_read');
+ $reply .= $got;
+ }
+
+Although there is no built-in limit in C<Net::SSLeay::write()>, the network
+packet size limitation applies here as well, thus use:
+
+ $written = 0;
+
+ while ($written < length($message)) {
+ $written += Net::SSLeay::write($ssl, substr($message, $written));
+ last if print_errs('SSL_write');
+ }
+
+Or alternatively you can just use the following convinence functions:
+
+ Net::SSLeay::ssl_write_all($ssl, $message) or die "ssl write failure";
+ $got = Net::SSLeay::ssl_read_all($ssl) or die "ssl read failure";
+
+=head1 KNOWN BUGS AND CAVEATS
+
+Autoloader emits
+
+ Argument "xxx" isn't numeric in entersub at blib/lib/Net/SSLeay.pm'
+
+warning if die_if_ssl_error is made autoloadable. If you figure out why,
+drop me a line.
+
+Callback set using C<SSL_set_verify()> does not appear to work. This may
+well be eay problem (e.g. see C<ssl/ssl_lib.c> line 1029). Try using
+C<SSL_CTX_set_verify()> instead and do not be surprised if even this stops
+working in future versions.
+
+Callback and certificate verification stuff is generally too little tested.
+
+Random numbers are not initialized randomly enough, especially if you
+do not have C</dev/random> and/or C</dev/urandom> (such as in Solaris
+platforms - but I've been suggested that cryptorand daemon from SUNski
+package solves this). In this case you should investigate third party
+software that can emulate these devices, e.g. by way of a named pipe
+to some program.
+
+Another gotcha with random number initialization is randomness
+depletion. This phenomenon, which has been extensively discussed in
+OpenSSL, Apache-SSL, and Apache-mod_ssl forums, can cause your
+script to block if you use C</dev/random> or to operate insecurely
+if you use C</dev/urandom>. What happens is that when too much
+randomness is drawn from the operating system's randomness pool
+then randomness can temporarily be unavailable. C</dev/random> solves
+this problem by waiting until enough randomness can be gathered - and
+this can take a long time since blocking reduces activity in the
+machine and less activity provides less random events: a vicious circle.
+C</dev/urandom> solves this dilemma more pragmatically by simply returning
+predictable "random" numbers. SomeC< /dev/urandom> emulation software
+however actually seems to implement C</dev/random> semantics. Caveat emptor.
+
+I've been pointed to two such daemons by Mik Firestone <mik@@speed.stdio._com>
+who has used them on Solaris 8:
+
+=over
+
+=item 1
+
+Entropy Gathering Daemon (EGD) at L<http://www.lothar.com/tech/crypto/>
+
+=item 2
+
+Pseudo-random number generating daemon (PRNGD) at
+L<http://www.aet.tu-cottbus.de/personen/jaenicke/postfix_tls/prngd.html>
+
+=back
+
+If you are using the low level API functions to communicate with other
+SSL implementations, you would do well to call
+
+ Net::SSLeay::CTX_set_options($ctx, &Net::SSLeay::OP_ALL)
+ and die_if_ssl_error("ssl ctx set options");
+
+to cope with some well know bugs in some other SSL
+implementations. The high level API functions always set all known
+compatibility options.
+
+Sometimes C<sslcat()> (and the high level HTTPS functions that build on it)
+is too fast in signaling the EOF to legacy HTTPS servers. This causes
+the server to return empty page. To work around this problem you can
+set global variable
+
+ $Net::SSLeay::slowly = 1; # Add sleep so broken servers can keep up
+
+HTTP/1.1 is not supported. Specifically this module does not know to
+issue or serve multiple http requests per connection. This is a serious
+short coming, but using SSL session cache on your server helps to
+alleviate the CPU load somewhat.
+
+As of version 1.09 many newer OpenSSL auxiliary functions were
+added (from C<REM_AUTOMATICALLY_GENERATED_1_09> onwards in C<SSLeay.xs>).
+Unfortunately I have not had any opportunity to test these. Some of
+them are trivial enough that I believe they "just work", but others
+have rather complex interfaces with function pointers and all. In these
+cases you should proceed wit great caution.
+
+This module defaults to using OpenSSL automatic protocol negotiation
+code for automatically detecting the version of the SSL protocol
+that the other end talks. With most web servers this works just
+fine, but once in a while I get complaints from people that the module
+does not work with some web servers. Usually this can be solved
+by explicitly setting the protocol version, e.g.
+
+ $Net::SSLeay::ssl_version = 2; # Insist on SSLv2
+ $Net::SSLeay::ssl_version = 3; # Insist on SSLv3
+ $Net::SSLeay::ssl_version = 10; # Insist on TLSv1
+
+Although the autonegotiation is nice to have, the SSL standards
+do not formally specify any such mechanism. Most of the world has
+accepted the SSLeay/OpenSSL way of doing it as the de facto standard. But
+for the few that think differently, you have to explicitly speak
+the correct version. This is not really a bug, but rather a deficiency
+in the standards. If a site refuses to respond or sends back some
+nonsensical error codes (at SSL handshake level), try this option
+before mailing me.
+
+The high level API returns the certificate of the peer, thus allowing
+one to check what certificate was supplied. However, you will only be
+able to check the certificate after the fact, i.e. you already sent
+your form data by the time you find out that you did not trust them,
+oops.
+
+So, while being able to know the certificate after the fact is surely
+useful, the security minded would still choose to do the connection
+and certificate verification first and only after that exchange data
+with the site. Currently none of the high level API functions do
+this, thus you would have to program it using the low level API. A
+good place to start is to see how C<Net::SSLeay::http_cat()> function
+is implemented.
+
+The high level API functions use a global file handle C<SSLCAT_S>
+internally. This really should not be a problem because there is no
+way to interleave the high level API functions, unless you use threads
+(but threads are not very well supported in perl anyway (as of version
+5.6.1). However, you may run into problems if you call undocumented
+internal functions in an interleaved fashion.
+
+=head1 DIAGNOSTICS
+
+=over
+
+=item Random number generator not seeded!!!
+
+B<(W)> This warning indicates that C<randomize()> was not able to read
+C</dev/random> or C</dev/urandom>, possibly because your system does not
+have them or they are differently named. You can still use SSL, but
+the encryption will not be as strong.
+
+=item open_tcp_connection: destination host not found:`server' (port 123) ($!)
+
+Name lookup for host named C<server> failed.
+
+=item open_tcp_connection: failed `server', 123 ($!)
+
+The name was resolved, but establising the TCP connection failed.
+
+=item msg 123: 1 - error:140770F8:SSL routines:SSL23_GET_SERVER_HELLO:unknown proto
+
+SSLeay error string. First (123) number is PID, second number (1) indicates
+the position of the error message in SSLeay error stack. You often see
+a pile of these messages as errors cascade.
+
+=item msg 123: 1 - error:02001002::lib(2) :func(1) :reason(2)
+
+The same as above, but you didn't call load_error_strings() so SSLeay
+couldn't verbosely explain the error. You can still find out what it
+means with this command:
+
+ /usr/local/ssl/bin/ssleay errstr 02001002
+
+=item Password is being asked for private key
+
+This is normal behaviour if your private key is encrypted. Either
+you have to supply the password or you have to use unencrypted
+private key. Scan OpenSSL.org for the FAQ that explains how to
+do this (or just study examples/makecert.pl which is used
+during C<make test> to do just that).
+
+=back
+
+=head1 REPORTING BUGS AND SUPPORT
+
+Bug reports, patch submission, feature requests, subversion access to the latest
+source code etc can be obtained at
+L<http://alioth.debian.org/projects/net-ssleay>
+
+The developer mailing list (for people interested in contributin to the source code)
+can be found at
+L<http://lists.alioth.debian.org/mailman/listinfo/net-ssleay-devel>
+
+Commercial support for Net::SSLeay may be obtained from
+
+ Symlabs (netssleay@symlabs.com)
+ Tel: +351-214.222.630
+ Fax: +351-214.222.637
+
+=head1 VERSION
+
+There are currently two perl modules for using OpenSSL C
+library: C<Net::SSLeay> (maintaned by me) and C<SSLeay> (maintained by OpenSSL
+team). This module is the C<Net::SSLeay> variant.
+
+At the time of making this release, Eric's module was still quite
+sketchy and could not be used for real work, thus I felt motivated to
+make this maintenance release. This module is not planned to evolve to
+contain any further functionality, i.e. I will concentrate on just
+making a simple SSL connection over TCP socket. Presumably Eric's own
+module will offer full SSLeay API one day.
+
+This module uses OpenSSL-0.9.6c. It does not work with any earlier
+version and there is no guarantee that it will work with later
+versions either, though as long as C API does not change, it
+should. This module requires Perl 5.005 or newer, though I
+believe it would build with Perl 5.002 or newer.
+
+=head1 BUGS
+
+Please report any bugs or feature requests to
+C<bug-net_ssleay.pm at rt.cpan.org>, or through the web interface at
+L<http://rt.cpan.org/Public/Dist/Display.html?Name=Net_SSLeay.pm>.
+I will be notified, and then you'll automatically be notified of progress on
+your bug as I make changes.
+
+=head1 SUPPORT
+
+You can find documentation for this module with the C<perldoc> command.
+
+ perldoc Net::SSLeay
+
+You can also look for information at:
+
+=over 4
+
+=item * AnnoCPAN: Annotated CPAN documentation
+
+L<http://annocpan.org/dist/Net_SSLeay.pm>
+
+=item * CPAN Ratings
+
+L<http://cpanratings.perl.org/d/Net_SSLeay.pm>
+
+=item * RT: CPAN's request tracker
+
+L<http://rt.cpan.org/Public/Dist/Display.html?Name=Net_SSLeay.pm>
+
+=item * Search CPAN
+
+L<http://search.cpan.org/dist/Net_SSLeay.pm>
+
+=back
+
+=head1 AUTHOR
+
+Maintained by Mike McCauley and Florian Ragwitz since November 2005
+
+Originally written by Sampo Kellomäki <sampo@symlabs.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1996-2003 Sampo Kellomäki <sampo@symlabs.com>
+
+Copyright (C) 2005-2006 Florian Ragwitz <rafl@debian.org>
+
+Copyright (C) 2005 Mike McCauley <mikem@open.com.au>
+
+All Rights Reserved.
+
+Distribution and use of this module is under the same terms as the
+OpenSSL package itself (i.e. free, but mandatory attribution; NO
+WARRANTY). Please consult LICENSE file in the root of the OpenSSL
+distribution.
+
+While the source distribution of this perl module does not contain
+Eric's or OpenSSL's code, if you use this module you will use OpenSSL
+library. Please give Eric and OpenSSL team credit (as required by
+their licenses).
+
+And remember, you, and nobody else but you, are responsible for
+auditing this module and OpenSSL library for security problems,
+backdoors, and general suitability for your application.
+
+=head1 SEE ALSO
+
+ Net::SSLeay::Handle - File handle interface
+ ./Net_SSLeay/examples - Example servers and a clients
+ <http://symlabs.com/Net_SSLeay/index.html> - Net::SSLeay.pm home
+ <http://symlabs.com/Net_SSLeay/smime.html> - Another module using OpenSSL
+ <http://www.openssl.org/> - OpenSSL source, documentation, etc
+ openssl-users-request@openssl.org - General OpenSSL mailing list
+ <http://home.netscape.com/newsref/std/SSL.html> - SSL Draft specification
+ <http://www.w3c.org> - HTTP specifications
+ <http://www.ietf.org/rfc/rfc2617.txt> - How to send password
+ <http://www.lothar.com/tech/crypto/> - Entropy Gathering Daemon (EGD)
+ <http://www.aet.tu-cottbus.de/personen/jaenicke/postfix_tls/prngd.html>
+ - pseudo-random number generating daemon (PRNGD)
+ perl(1)
+ perlref(1)
+ perllol(1)
+ perldoc ~openssl/doc/ssl/SSL_CTX_set_verify.pod
+
+=cut
+
+# ';
+
+### Some methods that are macros in C
+
+sub want_nothing { want(shift) == 1 }
+sub want_read { want(shift) == 2 }
+sub want_write { want(shift) == 3 }
+sub want_X509_lookup { want(shift) == 4 }
+
+###
+### Open TCP stream to given host and port, looking up the details
+### from system databases or DNS.
+###
+
+sub open_tcp_connection {
+ my ($dest_serv, $port) = @_;
+ my ($errs);
+
+ $port = getservbyname($port, 'tcp') unless $port =~ /^\d+$/;
+ my $dest_serv_ip = gethostbyname($dest_serv);
+ unless (defined($dest_serv_ip)) {
+ $errs = "$0 $$: open_tcp_connection: destination host not found:"
+ . " `$dest_serv' (port $port) ($!)\n";
+ warn $errs if $trace;
+ return wantarray ? (0, $errs) : 0;
+ }
+ my $sin = sockaddr_in($port, $dest_serv_ip);
+
+ warn "Opening connection to $dest_serv:$port (" .
+ inet_ntoa($dest_serv_ip) . ")" if $trace>2;
+
+ my $proto = getprotobyname('tcp');
+ if (socket (SSLCAT_S, &PF_INET(), &SOCK_STREAM(), $proto)) {
+ warn "next connect" if $trace>3;
+ if (CORE::connect (SSLCAT_S, $sin)) {
+ my $old_out = select (SSLCAT_S); $| = 1; select ($old_out);
+ warn "connected to $dest_serv, $port" if $trace>3;
+ return wantarray ? (1, undef) : 1; # Success
+ }
+ }
+ $errs = "$0 $$: open_tcp_connection: failed `$dest_serv', $port ($!)\n";
+ warn $errs if $trace;
+ close SSLCAT_S;
+ return wantarray ? (0, $errs) : 0; # Fail
+}
+
+### Open connection via standard web proxy, if one was defined
+### using set_proxy().
+
+sub open_proxy_tcp_connection {
+ my ($dest_serv, $port) = @_;
+ return open_tcp_connection($dest_serv, $port) if !$proxyhost;
+
+ warn "Connect via proxy: $proxyhost:$proxyport" if $trace>2;
+ my ($ret, $errs) = open_tcp_connection($proxyhost, $proxyport);
+ return wantarray ? (0, $errs) : 0 if !$ret; # Connection fail
+
+ warn "Asking proxy to connect to $dest_serv:$port" if $trace>2;
+ #print SSLCAT_S "CONNECT $dest_serv:$port HTTP/1.0$proxyauth$CRLF$CRLF";
+ #my $line = <SSLCAT_S>; # *** bug? Mixing stdio with syscall read?
+ ($ret, $errs) =
+ tcp_write_all("CONNECT $dest_serv:$port HTTP/1.0$proxyauth$CRLF$CRLF");
+ return wantarray ? (0,$errs) : 0 if $errs;
+ ($line, $errs) = tcp_read_until($CRLF . $CRLF, 1024);
+ warn "Proxy response: $line" if $trace>2;
+ return wantarray ? (0,$errs) : 0 if $errs;
+ return wantarray ? (1,'') : 1; # Success
+}
+
+###
+### read and write helpers that block
+###
+
+sub debug_read {
+ my ($replyr, $gotr) = @_;
+ my $vm = $trace>2 && $linux_debug ?
+ (split ' ', `cat /proc/$$/stat`)[22] : 'vm_unknown';
+ warn " got " . blength($$gotr) . ':'
+ . blength($$replyr) . " bytes (VM=$vm).\n" if $trace == 3;
+ warn " got `$$gotr' (" . blength($$gotr) . ':'
+ . blength($$replyr) . " bytes, VM=$vm)\n" if $trace>3;
+}
+
+sub ssl_read_all {
+ my ($ssl,$how_much) = @_;
+ $how_much = 2000000000 unless $how_much;
+ my ($got, $errs);
+ my $reply = '';
+
+ while ($how_much > 0) {
+ $got = Net::SSLeay::read($ssl,
+ ($how_much > 32768) ? 32768 : $how_much
+ );
+ last if $errs = print_errs('SSL_read');
+ $how_much -= blength($got);
+ debug_read(\$reply, \$got) if $trace>1;
+ last if $got eq ''; # EOF
+ $reply .= $got;
+ }
+
+ return wantarray ? ($reply, $errs) : $reply;
+}
+
+sub tcp_read_all {
+ my ($how_much) = @_;
+ $how_much = 2000000000 unless $how_much;
+ my ($n, $got, $errs);
+ my $reply = '';
+
+ my $bsize = 0x10000;
+ while ($how_much > 0) {
+ $n = sysread(SSLCAT_S,$got, (($bsize < $how_much) ? $bsize : $how_much));
+ warn "Read error: $! ($n,$how_much)" unless defined $n;
+ last if !$n; # EOF
+ $how_much -= $n;
+ debug_read(\$reply, \$got) if $trace>1;
+ $reply .= $got;
+ }
+ return wantarray ? ($reply, $errs) : $reply;
+}
+
+sub ssl_write_all {
+ my $ssl = $_[0];
+ my ($data_ref, $errs);
+ if (ref $_[1]) {
+ $data_ref = $_[1];
+ } else {
+ $data_ref = \$_[1];
+ }
+ my ($wrote, $written, $to_write) = (0,0, blength($$data_ref));
+ my $vm = $trace>2 && $linux_debug ?
+ (split ' ', `cat /proc/$$/stat`)[22] : 'vm_unknown';
+ warn " write_all VM at entry=$vm\n" if $trace>2;
+ while ($to_write) {
+ #sleep 1; # *** DEBUG
+ warn "partial `$$data_ref'\n" if $trace>3;
+ $wrote = write_partial($ssl, $written, $to_write, $$data_ref);
+ if (defined $wrote && ($wrote > 0)) { # write_partial can return -1
+ $written += $wrote;
+ $to_write -= $wrote;
+ }
+ $vm = $trace>2 && $linux_debug ?
+ (split ' ', `cat /proc/$$/stat`)[22] : 'vm_unknown';
+ warn " written so far $wrote:$written bytes (VM=$vm)\n" if $trace>2;
+
+ $errs .= print_errs('SSL_write');
+ return (wantarray ? (undef, $errs) : undef) if $errs;
+ }
+ return wantarray ? ($written, $errs) : $written;
+}
+
+sub tcp_write_all {
+ my ($data_ref, $errs);
+ if (ref $_[0]) {
+ $data_ref = $_[0];
+ } else {
+ $data_ref = \$_[0];
+ }
+ my ($wrote, $written, $to_write) = (0,0, blength($$data_ref));
+ my $vm = $trace>2 && $linux_debug ?
+ (split ' ', `cat /proc/$$/stat`)[22] : 'vm_unknown';
+ warn " write_all VM at entry=$vm to_write=$to_write\n" if $trace>2;
+ while ($to_write) {
+ warn "partial `$$data_ref'\n" if $trace>3;
+ $wrote = syswrite(SSLCAT_S, $$data_ref, $to_write, $written);
+ if (defined $wrote && ($wrote > 0)) { # write_partial can return -1
+ $written += $wrote;
+ $to_write -= $wrote;
+ } elsif (!defined($wrote)) {
+ warn "tcp_write_all: $!";
+ return (wantarray ? (undef, "$!") : undef);
+ }
+ $vm = $trace>2 && $linux_debug ?
+ (split ' ', `cat /proc/$$/stat`)[22] : 'vm_unknown';
+ warn " written so far $wrote:$written bytes (VM=$vm)\n" if $trace>2;
+ }
+ return wantarray ? ($written, '') : $written;
+}
+
+### from patch by Clinton Wong <clintdw@netcom.com>
+
+# ssl_read_until($ssl [, $delimit [, $max_length]])
+# if $delimit missing, use $/ if it exists, otherwise use \n
+# read until delimiter reached, up to $max_length chars if defined
+
+sub ssl_read_until ($;$$) {
+ my ($ssl,$delim, $max_length) = @_;
+ local $[;
+
+ # guess the delim string if missing
+ if ( ! defined $delim ) {
+ if ( defined $/ && length $/ ) { $delim = $/ }
+ else { $delim = "\n" } # Note: \n,$/ value depends on the platform
+ }
+ my $len_delim = length $delim;
+
+ my ($got);
+ my $reply = '';
+
+ # If we have OpenSSL 0.9.6a or later, we can use SSL_peek to
+ # speed things up.
+ # N.B. 0.9.6a has security problems, so the support for
+ # anything earlier than 0.9.6e will be dropped soon.
+ if (&Net::SSLeay::OPENSSL_VERSION_NUMBER >= 0x0090601f) {
+ $max_length = 2000000000 unless (defined $max_length);
+ my ($pending, $peek_length, $found, $done);
+ while (blength($reply) < $max_length and !$done) {
+ #Block if necessary until we get some data
+ $got = Net::SSLeay::peek($ssl,1);
+ last if print_errs('SSL_peek');
+
+ $pending = Net::SSLeay::pending($ssl) + blength($reply);
+ $peek_length = ($pending > $max_length) ? $max_length : $pending;
+ $peek_length -= blength($reply);
+ $got = Net::SSLeay::peek($ssl, $peek_length);
+ last if print_errs('SSL_peek');
+ $peek_length = blength($got);
+
+ #$found = index($got, $delim); # Old and broken
+
+ # the delimiter may be split across two gets, so we prepend
+ # a little from the last get onto this one before we check
+ # for a match
+ my $match;
+ if(blength($reply) >= blength($delim) - 1) {
+ #if what we've read so far is greater or equal
+ #in length of what we need to prepatch
+ $match = substr $reply, blength($reply) - blength($delim) + 1;
+ } else {
+ $match = $reply;
+ }
+
+ $match .= $got;
+ $found = index($match, $delim);
+
+ if ($found > -1) {
+ #$got = Net::SSLeay::read($ssl, $found+$len_delim);
+ #read up to the end of the delimiter
+ $got = Net::SSLeay::read($ssl,
+ $found + $len_delim
+ - ((blength $match) - (blength $got)));
+ $done = 1;
+ } else {
+ $got = Net::SSLeay::read($ssl, $peek_length);
+ $done = 1 if ($peek_length == $max_length - blength($reply));
+ }
+
+ last if print_errs('SSL_read');
+ debug_read(\$reply, \$got) if $trace>1;
+ last if $got eq '';
+ $reply .= $got;
+ }
+ } else {
+ while (!defined $max_length || length $reply < $max_length) {
+ $got = Net::SSLeay::read($ssl,1); # one by one
+ last if print_errs('SSL_read');
+ debug_read(\$reply, \$got) if $trace>1;
+ last if $got eq '';
+ $reply .= $got;
+ last if $len_delim
+ && substr($reply, blength($reply)-$len_delim) eq $delim;
+ }
+ }
+ return $reply;
+}
+
+sub tcp_read_until {
+ my ($delim, $max_length) = @_;
+ local $[;
+
+ # guess the delim string if missing
+ if ( ! defined $delim ) {
+ if ( defined $/ && length $/ ) { $delim = $/ }
+ else { $delim = "\n" } # Note: \n,$/ value depends on the platform
+ }
+ my $len_delim = length $delim;
+
+ my ($n,$got);
+ my $reply = '';
+
+ while (!defined $max_length || length $reply < $max_length) {
+ $n = sysread(SSLCAT_S, $got, 1); # one by one
+ warn "tcp_read_until: $!" if !defined $n;
+ debug_read(\$reply, \$got) if $trace>1;
+ last if !$n; # EOF
+ $reply .= $got;
+ last if $len_delim
+ && substr($reply, blength($reply)-$len_delim) eq $delim;
+ }
+ return $reply;
+}
+
+# ssl_read_CRLF($ssl [, $max_length])
+sub ssl_read_CRLF ($;$) { ssl_read_until($_[0], $CRLF, $_[1]) }
+sub tcp_read_CRLF { tcp_read_until($CRLF, $_[0]) }
+
+# ssl_write_CRLF($ssl, $message) writes $message and appends CRLF
+sub ssl_write_CRLF ($$) {
+ # the next line uses less memory but might use more network packets
+ return ssl_write_all($_[0], $_[1]) + ssl_write_all($_[0], $CRLF);
+
+ # the next few lines do the same thing at the expense of memory, with
+ # the chance that it will use less packets, since CRLF is in the original
+ # message and won't be sent separately.
+
+ #my $data_ref;
+ #if (ref $_[1]) { $data_ref = $_[1] }
+ # else { $data_ref = \$_[1] }
+ #my $message = $$data_ref . $CRLF;
+ #return ssl_write_all($_[0], \$message);
+}
+
+sub tcp_write_CRLF {
+ # the next line uses less memory but might use more network packets
+ return tcp_write_all($_[0]) + tcp_write_all($CRLF);
+
+ # the next few lines do the same thing at the expense of memory, with
+ # the chance that it will use less packets, since CRLF is in the original
+ # message and won't be sent separately.
+
+ #my $data_ref;
+ #if (ref $_[1]) { $data_ref = $_[1] }
+ # else { $data_ref = \$_[1] }
+ #my $message = $$data_ref . $CRLF;
+ #return tcp_write_all($_[0], \$message);
+}
+
+### Quickly print out with whom we're talking
+
+sub dump_peer_certificate ($) {
+ my ($ssl) = @_;
+ my $cert = get_peer_certificate($ssl);
+ return if print_errs('get_peer_certificate');
+ print "no cert defined\n" if !defined($cert);
+ # Cipher=NONE with empty cert fix
+ if (!defined($cert) || ($cert == 0)) {
+ warn "cert = `$cert'\n" if $trace;
+ return "Subject Name: undefined\nIssuer Name: undefined\n";
+ } else {
+ my $x = 'Subject Name: '
+ . X509_NAME_oneline(X509_get_subject_name($cert)) . "\n"
+ . 'Issuer Name: '
+ . X509_NAME_oneline(X509_get_issuer_name($cert)) . "\n";
+ Net::SSLeay::X509_free($cert);
+ return $x;
+ }
+}
+
+### Arrange some randomness for eay PRNG
+
+sub randomize (;$$) {
+ my ($rn_seed_file, $seed, $egd_path) = @_;
+ my $rnsf = defined($rn_seed_file) && -r $rn_seed_file;
+
+ $egd_path = '';
+ $egd_path = $ENV{'EGD_PATH'} if $ENV{'EGD_PATH'};
+
+ RAND_seed(rand() + $$); # Stir it with time and pid
+
+ unless ($rnsf || -r $Net::SSLeay::random_device || $seed || -S $egd_path) {
+ warn "Random number generator not seeded!!!" if $trace;
+ }
+
+ RAND_load_file($rn_seed_file, -s _) if $rnsf;
+ RAND_seed($seed) if $seed;
+ RAND_seed($ENV{RND_SEED}) if $ENV{RND_SEED};
+ RAND_egd($egd_path) if -e $egd_path && -S _;
+ RAND_load_file($Net::SSLeay::random_device, $Net::SSLeay::how_random/8)
+ if -r $Net::SSLeay::random_device;
+}
+
+sub new_x_ctx {
+ if ($ssl_version == 2) { $ctx = CTX_v2_new(); }
+ elsif ($ssl_version == 3) { $ctx = CTX_v3_new(); }
+ elsif ($ssl_version == 10) { $ctx = CTX_tlsv1_new(); }
+ else { $ctx = CTX_new(); }
+ return $ctx;
+}
+
+###
+### Basic request - response primitive (don't use for https)
+###
+
+sub sslcat { # address, port, message, $crt, $key --> reply / (reply,errs,cert)
+ my ($dest_serv, $port, $out_message, $crt_path, $key_path) = @_;
+ my ($ctx, $ssl, $got, $errs, $written);
+
+ ($got, $errs) = open_proxy_tcp_connection($dest_serv, $port);
+ return (wantarray ? (undef, $errs) : undef) unless $got;
+
+ ### Do SSL negotiation stuff
+
+ warn "Creating SSL $ssl_version context...\n" if $trace>2;
+ load_error_strings(); # Some bloat, but I'm after ease of use
+ SSLeay_add_ssl_algorithms(); # and debuggability.
+ randomize();
+
+ $ctx = new_x_ctx();
+ goto cleanup2 if $errs = print_errs('CTX_new') or !$ctx;
+
+ CTX_set_options($ctx, &OP_ALL);
+ goto cleanup2 if $errs = print_errs('CTX_set_options');
+
+ warn "Cert `$crt_path' given without key" if $crt_path && !$key_path;
+ set_cert_and_key($ctx, $crt_path, $key_path) if $crt_path;
+
+ warn "Creating SSL connection (context was '$ctx')...\n" if $trace>2;
+ $ssl = new($ctx);
+ goto cleanup if $errs = print_errs('SSL_new') or !$ssl;
+
+ warn "Setting fd (ctx $ctx, con $ssl)...\n" if $trace>2;
+ set_fd($ssl, fileno(SSLCAT_S));
+ goto cleanup if $errs = print_errs('set_fd');
+
+ warn "Entering SSL negotiation phase...\n" if $trace>2;
+
+ if ($trace>2) {
+ my $i = 0;
+ my $p = '';
+ my $cipher_list = 'Cipher list: ';
+ $p=Net::SSLeay::get_cipher_list($ssl,$i);
+ $cipher_list .= $p if $p;
+ do {
+ $i++;
+ $cipher_list .= ', ' . $p if $p;
+ $p=Net::SSLeay::get_cipher_list($ssl,$i);
+ } while $p;
+ $cipher_list .= '\n';
+ warn $cipher_list;
+ }
+
+ $got = Net::SSLeay::connect($ssl);
+ warn "SSLeay connect returned $got\n" if $trace>2;
+ goto cleanup if $errs = print_errs('SSL_connect');
+
+ my $server_cert = get_peer_certificate($ssl);
+ print_errs('get_peer_certificate');
+ if ($trace>1) {
+ warn "Cipher `" . get_cipher($ssl) . "'\n";
+ print_errs('get_ciper');
+ warn dump_peer_certificate($ssl);
+ }
+
+ ### Connected. Exchange some data (doing repeated tries if necessary).
+
+ warn "sslcat $$: sending " . blength($out_message) . " bytes...\n"
+ if $trace==3;
+ warn "sslcat $$: sending `$out_message' (" . blength($out_message)
+ . " bytes)...\n" if $trace>3;
+ ($written, $errs) = ssl_write_all($ssl, $out_message);
+ goto cleanup unless $written;
+
+ sleep $slowly if $slowly; # Closing too soon can abort broken servers
+ CORE::shutdown SSLCAT_S, 1; # Half close --> No more output, send EOF to server
+
+ warn "waiting for reply...\n" if $trace>2;
+ ($got, $errs) = ssl_read_all($ssl);
+ warn "Got " . blength($got) . " bytes.\n" if $trace==3;
+ warn "Got `$got' (" . blength($got) . " bytes)\n" if $trace>3;
+
+cleanup:
+ free ($ssl);
+ $errs .= print_errs('SSL_free');
+cleanup2:
+ CTX_free ($ctx);
+ $errs .= print_errs('CTX_free');
+ close SSLCAT_S;
+ return wantarray ? ($got, $errs, $server_cert) : $got;
+}
+
+sub tcpcat { # address, port, message, $crt, $key --> reply / (reply,errs,cert)
+ my ($dest_serv, $port, $out_message) = @_;
+ my ($got, $errs, $written);
+
+ ($got, $errs) = open_proxy_tcp_connection($dest_serv, $port);
+ return (wantarray ? (undef, $errs) : undef) unless $got;
+
+ ### Connected. Exchange some data (doing repeated tries if necessary).
+
+ warn "tcpcat $$: sending " . blength($out_message) . " bytes...\n"
+ if $trace==3;
+ warn "tcpcat $$: sending `$out_message' (" . blength($out_message)
+ . " bytes)...\n" if $trace>3;
+ ($written, $errs) = tcp_write_all($out_message);
+ goto cleanup unless $written;
+
+ sleep $slowly if $slowly; # Closing too soon can abort broken servers
+ CORE::shutdown SSLCAT_S, 1; # Half close --> No more output, send EOF to server
+
+ warn "waiting for reply...\n" if $trace>2;
+ ($got, $errs) = tcp_read_all($ssl);
+ warn "Got " . blength($got) . " bytes.\n" if $trace==3;
+ warn "Got `$got' (" . blength($got) . " bytes)\n" if $trace>3;
+
+cleanup:
+ close SSLCAT_S;
+ return wantarray ? ($got, $errs) : $got;
+}
+
+sub tcpxcat {
+ my ($usessl, $site, $port, $req, $crt_path, $key_path) = @_;
+ if ($usessl) {
+ return sslcat($site, $port, $req, $crt_path, $key_path);
+ } else {
+ return tcpcat($site, $port, $req);
+ }
+}
+
+###
+### Basic request - response primitive, this is different from sslcat
+### because this does not shutdown the connection.
+###
+
+sub https_cat { # address, port, message --> returns reply / (reply,errs,cert)
+ my ($dest_serv, $port, $out_message, $crt_path, $key_path) = @_;
+ my ($ctx, $ssl, $got, $errs, $written);
+
+ ($got, $errs) = open_proxy_tcp_connection($dest_serv, $port);
+ return (wantarray ? (undef, $errs) : undef) unless $got;
+
+ ### Do SSL negotiation stuff
+
+ warn "Creating SSL $ssl_version context...\n" if $trace>2;
+ load_error_strings(); # Some bloat, but I'm after ease of use
+ SSLeay_add_ssl_algorithms(); # and debuggability.
+ randomize();
+
+ $ctx = new_x_ctx();
+ goto cleanup2 if $errs = print_errs('CTX_new') or !$ctx;
+
+ CTX_set_options($ctx, &OP_ALL);
+ goto cleanup2 if $errs = print_errs('CTX_set_options');
+
+ warn "Cert `$crt_path' given without key" if $crt_path && !$key_path;
+ set_cert_and_key($ctx, $crt_path, $key_path) if $crt_path;
+
+ warn "Creating SSL connection (context was '$ctx')...\n" if $trace>2;
+ $ssl = new($ctx);
+ goto cleanup if $errs = print_errs('SSL_new') or !$ssl;
+
+ warn "Setting fd (ctx $ctx, con $ssl)...\n" if $trace>2;
+ set_fd($ssl, fileno(SSLCAT_S));
+ goto cleanup if $errs = print_errs('set_fd');
+
+ warn "Entering SSL negotiation phase...\n" if $trace>2;
+
+ if ($trace>2) {
+ my $i = 0;
+ my $p = '';
+ my $cipher_list = 'Cipher list: ';
+ $p=Net::SSLeay::get_cipher_list($ssl,$i);
+ $cipher_list .= $p if $p;
+ do {
+ $i++;
+ $cipher_list .= ', ' . $p if $p;
+ $p=Net::SSLeay::get_cipher_list($ssl,$i);
+ } while $p;
+ $cipher_list .= '\n';
+ warn $cipher_list;
+ }
+
+ $got = Net::SSLeay::connect($ssl);
+ warn "SSLeay connect failed" if $trace>2 && $got==0;
+ goto cleanup if $errs = print_errs('SSL_connect');
+
+ my $server_cert = get_peer_certificate($ssl);
+ print_errs('get_peer_certificate');
+ if ($trace>1) {
+ warn "Cipher `" . get_cipher($ssl) . "'\n";
+ print_errs('get_ciper');
+ warn dump_peer_certificate($ssl);
+ }
+
+ ### Connected. Exchange some data (doing repeated tries if necessary).
+
+ warn "https_cat $$: sending " . blength($out_message) . " bytes...\n"
+ if $trace==3;
+ warn "https_cat $$: sending `$out_message' (" . blength($out_message)
+ . " bytes)...\n" if $trace>3;
+ ($written, $errs) = ssl_write_all($ssl, $out_message);
+ goto cleanup unless $written;
+
+ warn "waiting for reply...\n" if $trace>2;
+ ($got, $errs) = ssl_read_all($ssl);
+ warn "Got " . blength($got) . " bytes.\n" if $trace==3;
+ warn "Got `$got' (" . blength($got) . " bytes)\n" if $trace>3;
+
+cleanup:
+ free ($ssl);
+ $errs .= print_errs('SSL_free');
+cleanup2:
+ CTX_free ($ctx);
+ $errs .= print_errs('CTX_free');
+ close SSLCAT_S;
+ return wantarray ? ($got, $errs, $server_cert) : $got;
+}
+
+sub http_cat { # address, port, message --> returns reply / (reply,errs,cert)
+ my ($dest_serv, $port, $out_message) = @_;
+ my ($got, $errs, $written);
+
+ ($got, $errs) = open_proxy_tcp_connection($dest_serv, $port);
+ return (wantarray ? (undef, $errs) : undef) unless $got;
+
+ ### Connected. Exchange some data (doing repeated tries if necessary).
+
+ warn "http_cat $$: sending " . blength($out_message) . " bytes...\n"
+ if $trace==3;
+ warn "http_cat $$: sending `$out_message' (" . blength($out_message)
+ . " bytes)...\n" if $trace>3;
+ ($written, $errs) = tcp_write_all($out_message);
+ goto cleanup unless $written;
+
+ warn "waiting for reply...\n" if $trace>2;
+ ($got, $errs) = tcp_read_all(200000);
+ warn "Got " . blength($got) . " bytes.\n" if $trace==3;
+ warn "Got `$got' (" . blength($got) . " bytes)\n" if $trace>3;
+
+cleanup:
+ close SSLCAT_S;
+ return wantarray ? ($got, $errs) : $got;
+}
+
+sub httpx_cat {
+ my ($usessl, $site, $port, $req, $crt_path, $key_path) = @_;
+ warn "httpx_cat: usessl=$usessl ($site:$port)" if $trace;
+ if ($usessl) {
+ return https_cat($site, $port, $req, $crt_path, $key_path);
+ } else {
+ return http_cat($site, $port, $req);
+ }
+}
+
+###
+### Easy set up of private key and certificate
+###
+
+sub set_cert_and_key ($$$) {
+ my ($ctx, $cert_path, $key_path) = @_;
+ my $errs = '';
+ # Following will ask password unless private key is not encrypted
+ CTX_use_RSAPrivateKey_file ($ctx, $key_path, &FILETYPE_PEM);
+ $errs .= print_errs("private key `$key_path' ($!)");
+ CTX_use_certificate_file ($ctx, $cert_path, &FILETYPE_PEM);
+ $errs .= print_errs("certificate `$cert_path' ($!)");
+ return wantarray ? (undef, $errs) : ($errs eq '');
+}
+
+### Old deprecated API
+
+sub set_server_cert_and_key ($$$) { &set_cert_and_key }
+
+### Set up to use web proxy
+
+sub set_proxy ($$;**) {
+ ($proxyhost, $proxyport, $proxyuser, $proxypass) = @_;
+ require MIME::Base64 if $proxyuser;
+ $proxyauth = $CRLF . 'Proxy-authorization: Basic '
+ . MIME::Base64::encode("$proxyuser:$proxypass", '')
+ if $proxyuser;
+}
+
+###
+### Easy https manipulation routines
+###
+
+sub make_form {
+ my (@fields) = @_;
+ my $form;
+ while (@fields) {
+ my ($name, $data) = (shift(@fields), shift(@fields));
+ $data =~ s/([^\w\-.\@\$ ])/sprintf("%%%2.2x",ord($1))/gse;
+ $data =~ tr[ ][+];
+ $form .= "$name=$data&";
+ }
+ chop $form;
+ return $form;
+}
+
+sub make_headers {
+ my (@headers) = @_;
+ my $headers;
+ while (@headers) {
+ my $header = shift(@headers);
+ my $value = shift(@headers);
+ $header =~ s/:$//;
+ $value =~ s/\x0d?\x0a$//; # because we add it soon, see below
+ $headers .= "$header: $value$CRLF";
+ }
+ return $headers;
+}
+
+sub do_httpx3 {
+ my ($method, $usessl, $site, $port, $path, $headers,
+ $content, $mime_type, $crt_path, $key_path) = @_;
+ my ($response, $page, $h,$v);
+
+ if ($content) {
+ $mime_type = "application/x-www-form-urlencoded" unless $mime_type;
+ my $len = blength($content);
+ $content = "Content-Type: $mime_type$CRLF"
+ . "Content-Length: $len$CRLF$CRLF$content";
+ } else {
+ $content = "$CRLF$CRLF";
+ }
+ my $req = "$method $path HTTP/1.0$CRLF";
+ unless (defined $headers && $headers =~ /^Host:/m) {
+ $req .= "Host: $site";
+ unless (($port == 80 && !$usessl) || ($port == 443 && $usessl)) {
+ $req .= ":$port";
+ }
+ $req .= $CRLF;
+ }
+ $req .= (defined $headers ? $headers : '') . "Accept: */*$CRLF$content";
+
+ warn "do_httpx3($method,$usessl,$site:$port)" if $trace;
+ my ($http, $errs, $server_cert)
+ = httpx_cat($usessl, $site, $port, $req, $crt_path, $key_path);
+ return (undef, "HTTP/1.0 900 NET OR SSL ERROR$CRLF$CRLF$errs") if $errs;
+
+ $http = '' if !defined $http;
+ ($headers, $page) = split /\s?\n\s?\n/, $http, 2;
+ warn "headers >$headers< page >>$page<< http >>>$http<<<" if $trace>1;
+ ($response, $headers) = split /\s?\n/, $headers, 2;
+ return ($page, $response, $headers, $server_cert);
+}
+
+sub do_https3 { splice(@_,1,0) = 1; do_httpx3; } # Legacy undocumented
+
+### do_https2() is a legacy version in the sense that it is unable
+### to return all instances of duplicate headers.
+
+sub do_httpx2 {
+ my ($page, $response, $headers, $server_cert) = &do_httpx3;
+ X509_free($server_cert) if defined $server_cert;
+ return ($page, $response,
+ map( { ($h,$v)=/^(\S+)\:\s*(.*)$/; (uc($h),$v); }
+ split(/\s?\n/, $headers)
+ )
+ );
+}
+
+sub do_https2 { splice(@_,1,0) = 1; do_httpx2; } # Legacy undocumented
+
+### Returns headers as a hash where multiple instances of same header
+### are handled correctly.
+
+sub do_httpx4 {
+ my ($page, $response, $headers, $server_cert) = &do_httpx3;
+ X509_free($server_cert) if defined $server_cert;
+ my %hr = ();
+ for my $hh (split /\s?\n/, $headers) {
+ my ($h,$v)=/^(\S+)\:\s*(.*)$/;
+ push @{$hr{uc($h)}}, $v;
+ }
+ return ($page, $response, \%hr);
+}
+
+sub do_https4 { splice(@_,1,0) = 1; do_httpx4; } # Legacy undocumented
+
+# https
+
+sub get_https { do_httpx2(GET => 1, @_) }
+sub post_https { do_httpx2(POST => 1, @_) }
+sub put_https { do_httpx2(PUT => 1, @_) }
+sub head_https { do_httpx2(HEAD => 1, @_) }
+
+sub get_https3 { do_httpx3(GET => 1, @_) }
+sub post_https3 { do_httpx3(POST => 1, @_) }
+sub put_https3 { do_httpx3(PUT => 1, @_) }
+sub head_https3 { do_httpx3(HEAD => 1, @_) }
+
+sub get_https4 { do_httpx4(GET => 1, @_) }
+sub post_https4 { do_httpx4(POST => 1, @_) }
+sub put_https4 { do_httpx4(PUT => 1, @_) }
+sub head_https4 { do_httpx4(HEAD => 1, @_) }
+
+# http
+
+sub get_http { do_httpx2(GET => 0, @_) }
+sub post_http { do_httpx2(POST => 0, @_) }
+sub put_http { do_httpx2(PUT => 0, @_) }
+sub head_http { do_httpx2(HEAD => 0, @_) }
+
+sub get_http3 { do_httpx3(GET => 0, @_) }
+sub post_http3 { do_httpx3(POST => 0, @_) }
+sub put_http3 { do_httpx3(PUT => 0, @_) }
+sub head_http3 { do_httpx3(HEAD => 0, @_) }
+
+sub get_http4 { do_httpx4(GET => 0, @_) }
+sub post_http4 { do_httpx4(POST => 0, @_) }
+sub put_http4 { do_httpx4(PUT => 0, @_) }
+sub head_http4 { do_httpx4(HEAD => 0, @_) }
+
+# Either https or http
+
+sub get_httpx { do_httpx2(GET => @_) }
+sub post_httpx { do_httpx2(POST => @_) }
+sub put_httpx { do_httpx2(PUT => @_) }
+sub head_httpx { do_httpx2(HEAD => @_) }
+
+sub get_httpx3 { do_httpx3(GET => @_) }
+sub post_httpx3 { do_httpx3(POST => @_) }
+sub put_httpx3 { do_httpx3(PUT => @_) }
+sub head_httpx3 { do_httpx3(HEAD => @_) }
+
+sub get_httpx4 { do_httpx4(GET => @_) }
+sub post_httpx4 { do_httpx4(POST => @_) }
+sub put_httpx4 { do_httpx4(PUT => @_) }
+sub head_httpx4 { do_httpx4(HEAD => @_) }
+
+### Legacy, don't use
+# ($page, $respone_or_err, %headers) = do_https(...);
+
+sub do_https {
+ my ($site, $port, $path, $method, $headers,
+ $content, $mime_type, $crt_path, $key_path) = @_;
+
+ do_https2($method, $site, $port, $path, $headers,
+ $content, $mime_type, $crt_path, $key_path);
+}
+
+1;
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/SSLeay/Handle.pm b/Master/tlpkg/tlperl.straw/lib/Net/SSLeay/Handle.pm
new file mode 100755
index 00000000000..d4dfb59f7de
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/SSLeay/Handle.pm
@@ -0,0 +1,394 @@
+package Net::SSLeay::Handle;
+
+require 5.005_03;
+use strict;
+
+use Socket;
+use Net::SSLeay;
+
+require Exporter;
+
+=head1 NAME
+
+Net::SSLeay::Handle - Perl module that lets SSL (HTTPS) sockets be
+handled as standard file handles.
+
+=head1 SYNOPSIS
+
+ use Net::SSLeay::Handle qw/shutdown/;
+ my ($host, $port) = ("localhost", 443);
+
+ tie(*SSL, "Net::SSLeay::Handle", $host, $port);
+
+ print SSL "GET / HTTP/1.0\r\n";
+ shutdown(\*SSL, 1);
+ print while (<SSL>);
+ close SSL;
+
+=head1 DESCRIPTION
+
+Net::SSLeay::Handle allows you to request and receive HTTPS web pages
+using "old-fashion" file handles as in:
+
+ print SSL "GET / HTTP/1.0\r\n";
+
+and
+
+ print while (<SSL>);
+
+If you export the shutdown routine, then the only extra code that
+you need to add to your program is the tie function as in:
+
+ my $socket;
+ if ($scheme eq "https") {
+ tie(*S2, "Net::SSLeay::Handle", $host, $port);
+ $socket = \*S2;
+ else {
+ $socket = Net::SSLeay::Handle->make_socket($host, $port);
+ }
+ print $socket $request_headers;
+ ...
+
+=cut
+
+use vars qw(@ISA @EXPORT_OK $VERSION);
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(shutdown);
+$VERSION = '0.61';
+
+my $Initialized; #-- only _initialize() once
+my $Debug = 0; #-- pretty hokey
+my %Glob_Ref; #-- used to make unique \*S names for versions < 5.6
+
+#== Tie Handle Methods ========================================================
+#
+# see perldoc perltie for details.
+#
+#==============================================================================
+
+sub TIEHANDLE {
+ my ($class, $socket, $port) = @_;
+ $Debug > 10 and print "TIEHANDLE(@{[join ', ', @_]})\n";
+
+ ref $socket eq "GLOB" or $socket = $class->make_socket($socket, $port);
+
+ $class->_initialize();
+
+ my $ctx = Net::SSLeay::CTX_new() or die_now("Failed to create SSL_CTX $!");
+ my $ssl = Net::SSLeay::new($ctx) or die_now("Failed to create SSL $!");
+
+ my $fileno = fileno($socket);
+
+ Net::SSLeay::set_fd($ssl, $fileno); # Must use fileno
+
+ my $resp = Net::SSLeay::connect($ssl);
+
+ $Debug and print "Cipher '" . Net::SSLeay::get_cipher($ssl) . "'\n";
+
+ my $self = bless {
+ ssl => $ssl,
+ ctx => $ctx,
+ socket => $socket,
+ fileno => $fileno,
+ }, $class;
+
+ return $self;
+}
+
+sub PRINT {
+ my $self = shift;
+
+ my $ssl = _get_ssl($self);
+ my $resp = 0;
+ for my $msg (@_) {
+ defined $msg or last;
+ $resp = Net::SSLeay::write($ssl, $msg) or last;
+ }
+ return $resp;
+}
+
+sub READLINE {
+ my $self = shift;
+ my $ssl = _get_ssl($self);
+ if (wantarray) {
+ my @lines;
+ while (my $line = Net::SSLeay::ssl_read_until($ssl)) {
+ push @lines, $line;
+ }
+ return @lines;
+ } else {
+ my $line = Net::SSLeay::ssl_read_until($ssl);
+ return $line ? $line : undef;
+ }
+}
+
+sub READ {
+ my ($self, $buf, $len, $offset) = \ (@_);
+ my $ssl = _get_ssl($$self);
+ defined($$offset) or
+ return length($$buf = Net::SSLeay::ssl_read_all($ssl, $$len));
+
+ defined(my $read = Net::SSLeay::ssl_read_all($ssl, $$len))
+ or return undef;
+
+ my $buf_len = length($$buf);
+ $$offset > $buf_len and $$buf .= chr(0) x ($$offset - $buf_len);
+ substr($$buf, $$offset) = $read;
+ return length($read);
+}
+
+sub WRITE {
+ my $self = shift;
+ my ($buf, $len, $offset) = @_;
+ $offset = 0 unless defined $offset;
+
+ # Return number of characters written.
+ my $ssl = $self->_get_ssl();
+ return $len if Net::SSLeay::write($ssl, substr($buf, $offset, $len));
+ return undef;
+}
+
+sub CLOSE {
+ my $self = shift;
+ my $fileno = $self->{fileno};
+ $Debug > 10 and print "close($fileno)\n";
+ Net::SSLeay::free ($self->{ssl});
+ Net::SSLeay::CTX_free ($self->{ctx});
+ close $self->{socket};
+}
+
+sub FILENO { $_[0]->{fileno} }
+
+
+=head1 FUNCTIONS
+
+=over
+
+=item shutdown
+
+ shutdown(\*SOCKET, $mode)
+
+Calls to the main shutdown() don't work with tied sockets created with this
+module. This shutdown should be able to distinquish between tied and untied
+sockets and do the right thing.
+
+=cut
+
+sub shutdown {
+ my ($obj, @params) = @_;
+
+ my $socket = UNIVERSAL::isa($obj, 'Net::SSLeay::Handle') ?
+ $obj->{socket} : $obj;
+ return shutdown($socket, @params);
+}
+
+=item debug
+
+ my $debug = Net::SSLeay::Handle->debug()
+ Net::SSLeay::Handle->debug(1)
+
+Get/set debuging mode. Always returns the debug value before the function call.
+if an additional argument is given the debug option will be set to this value.
+
+=cut
+
+sub debug {
+ my ($class, $debug) = @_;
+ my $old_debug = $Debug;
+ @_ >1 and $Debug = $debug || 0;
+ return $old_debug;
+}
+
+#=== Internal Methods =========================================================
+
+=item make_socket
+
+ my $sock = Net::SSLeay::Handle->make_socket($host, $port);
+
+Creates a socket that is connected to $post using $port. It uses
+$Net::SSLeay::proxyhost and proxyport if set and authentificates itself against
+this proxy depending on $Net::SSLeay::proxyauth. It also turns autoflush on for
+the created socket.
+
+=cut
+
+sub make_socket {
+ my ($class, $host, $port) = @_;
+ $Debug > 10 and print "_make_socket(@{[join ', ', @_]})\n";
+ $host ||= 'localhost';
+ $port ||= 443;
+
+ my $phost = $Net::SSLeay::proxyhost;
+ my $pport = $Net::SSLeay::proxyhost ? $Net::SSLeay::proxyport : $port;
+
+ my $dest_ip = gethostbyname($phost || $host);
+ my $host_params = sockaddr_in($pport, $dest_ip);
+ my $socket = $^V ? undef : $class->_glob_ref("$host:$port");
+
+ socket($socket, &PF_INET(), &SOCK_STREAM(), 0) or die "socket: $!";
+ connect($socket, $host_params) or die "connect: $!";
+
+ my $old_select = select($socket); $| = 1; select($old_select);
+ $phost and do {
+ my $auth = $Net::SSLeay::proxyauth;
+ my $CRLF = $Net::SSLeay::CRLF;
+ print $socket "CONNECT $host:$port HTTP/1.0$auth$CRLF$CRLF";
+ my $line = <$socket>;
+ };
+ return $socket;
+}
+
+=back
+
+=cut
+
+#--- _glob_ref($strings) ------------------------------------------------------
+#
+# Create a unique namespace name and return a glob ref to it. Would be great
+# to use the fileno but need this before we get back the fileno.
+# NEED TO LOCK THIS ROUTINE IF USING THREADS. (but it is only used for
+# versions < 5.6 :)
+#------------------------------------------------------------------------------
+
+sub _glob_ref {
+ my $class = shift;
+ my $preamb = join("", @_) || "_glob_ref";
+ my $num = ++$Glob_Ref{$preamb};
+ my $name = "$preamb:$num";
+ no strict 'refs';
+ my $glob_ref = \*$name;
+ use strict 'refs';
+
+ $Debug and do {
+ print "GLOB_REF $preamb\n";
+ while (my ($k, $v) = each %Glob_Ref) {print "$k = $v\n"}
+ print "\n";
+ };
+
+ return $glob_ref;
+}
+
+sub _initialize {
+ $Initialized++ and return;
+ Net::SSLeay::load_error_strings();
+ Net::SSLeay::SSLeay_add_ssl_algorithms();
+ Net::SSLeay::randomize();
+}
+
+sub __dummy {
+ my $host = $Net::SSLeay::proxyhost;
+ my $port = $Net::SSLeay::proxyport;
+ my $auth = $Net::SSLeay::proxyauth;
+}
+
+#--- _get_self($socket) -------------------------------------------------------
+# Returns a hash containing attributes for $socket (= \*SOMETHING) based
+# on fileno($socket). Will return undef if $socket was not created here.
+#------------------------------------------------------------------------------
+
+sub _get_self { return $_[0]; }
+
+#--- _get_ssl($socket) --------------------------------------------------------
+# Returns a the "ssl" attribute for $socket (= \*SOMETHING) based
+# on fileno($socket). Will cause a warning and return undef if $socket was not
+# created here.
+#------------------------------------------------------------------------------
+
+sub _get_ssl {
+ return $_[0]->{ssl};
+}
+
+1;
+
+__END__
+
+=head2 USING EXISTING SOCKETS
+
+One of the motivations for writing this module was to avoid
+duplicating socket creation code (which is mostly error handling).
+The calls to tie() above where it is passed a $host and $port is
+provided for convenience testing. If you already have a socket
+connected to the right host and port, S1, then you can do something
+like:
+
+ my $socket \*S1;
+ if ($scheme eq "https") {
+ tie(*S2, "Net::SSLeay::Handle", $socket);
+ $socket = \*S2;
+ }
+ my $last_sel = select($socket); $| = 1; select($last_sel);
+ print $socket $request_headers;
+ ...
+
+Note: As far as I know you must be careful with the globs in the tie()
+function. The first parameter must be a glob (*SOMETHING) and the
+last parameter must be a reference to a glob (\*SOMETHING_ELSE) or a
+scaler that was assigned to a reference to a glob (as in the example
+above)
+
+Also, the two globs must be different. When I tried to use the same
+glob, I got a core dump.
+
+=head2 EXPORT
+
+None by default.
+
+You can export the shutdown() function.
+
+It is suggested that you do export shutdown() or use the fully
+qualified Net::SSLeay::Handle::shutdown() function to shutdown SSL
+sockets. It should be smart enough to distinguish between SSL and
+non-SSL sockets and do the right thing.
+
+=head1 EXAMPLES
+
+ use Net::SSLeay::Handle qw/shutdown/;
+ my ($host, $port) = ("localhost", 443);
+
+ tie(*SSL, "Net::SSLeay::Handle", $host, $port);
+
+ print SSL "GET / HTTP/1.0\r\n";
+ shutdown(\*SSL, 1);
+ print while (<SSL>);
+ close SSL;
+
+=head1 TODO
+
+Better error handling. Callback routine?
+
+=head1 CAVEATS
+
+Tying to a file handle is a little tricky (for me at least).
+
+The first parameter to tie() must be a glob (*SOMETHING) and the last
+parameter must be a reference to a glob (\*SOMETHING_ELSE) or a scaler
+that was assigned to a reference to a glob ($s = \*SOMETHING_ELSE).
+Also, the two globs must be different. When I tried to use the same
+glob, I got a core dump.
+
+I was able to associate attributes to globs created by this module
+(like *SSL above) by making a hash of hashes keyed by the file head1.
+
+Support for old perls may not be 100%. If in trouble try 5.6.0 or
+newer.
+
+=head1 CHANGES
+
+Please see Net-SSLeay-Handle-0.50/Changes file.
+
+=head1 KNOWN BUGS
+
+If you let this module construct sockets for you with Perl versions
+below v.5.6 then there is a slight memory leak. Other upgrade your
+Perl, or create the sockets yourself. The leak was created to let
+these older versions of Perl access more than one Handle at a time.
+
+=head1 AUTHOR
+
+Jim Bowlin jbowlin@linklint.org
+
+=head1 SEE ALSO
+
+Net::SSLeay, perl(1), http://openssl.org/
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/Time.pm b/Master/tlpkg/tlperl.straw/lib/Net/Time.pm
new file mode 100755
index 00000000000..6f1dd04586e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/Time.pm
@@ -0,0 +1,151 @@
+# Net::Time.pm
+#
+# Copyright (c) 1995-2004 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::Time;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT_OK $TIMEOUT);
+use Carp;
+use IO::Socket;
+require Exporter;
+use Net::Config;
+use IO::Select;
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(inet_time inet_daytime);
+
+$VERSION = "2.10";
+
+$TIMEOUT = 120;
+
+
+sub _socket {
+ my ($pname, $pnum, $host, $proto, $timeout) = @_;
+
+ $proto ||= 'udp';
+
+ my $port = (getservbyname($pname, $proto))[2] || $pnum;
+
+ my $hosts = defined $host ? [$host] : $NetConfig{$pname . '_hosts'};
+
+ my $me;
+
+ foreach $host (@$hosts) {
+ $me = IO::Socket::INET->new(
+ PeerAddr => $host,
+ PeerPort => $port,
+ Proto => $proto
+ )
+ and last;
+ }
+
+ return unless $me;
+
+ $me->send("\n")
+ if $proto eq 'udp';
+
+ $timeout = $TIMEOUT
+ unless defined $timeout;
+
+ IO::Select->new($me)->can_read($timeout)
+ ? $me
+ : undef;
+}
+
+
+sub inet_time {
+ my $s = _socket('time', 37, @_) || return undef;
+ my $buf = '';
+ my $offset = 0 | 0;
+
+ return undef
+ unless defined $s->recv($buf, length(pack("N", 0)));
+
+ # unpack, we | 0 to ensure we have an unsigned
+ my $time = (unpack("N", $buf))[0] | 0;
+
+ # the time protocol return time in seconds since 1900, convert
+ # it to a the required format
+
+ if ($^O eq "MacOS") {
+
+ # MacOS return seconds since 1904, 1900 was not a leap year.
+ $offset = (4 * 31536000) | 0;
+ }
+ else {
+
+ # otherwise return seconds since 1972, there were 17 leap years between
+ # 1900 and 1972
+ $offset = (70 * 31536000 + 17 * 86400) | 0;
+ }
+
+ $time - $offset;
+}
+
+
+sub inet_daytime {
+ my $s = _socket('daytime', 13, @_) || return undef;
+ my $buf = '';
+
+ defined($s->recv($buf, 1024))
+ ? $buf
+ : undef;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::Time - time and daytime network client interface
+
+=head1 SYNOPSIS
+
+ use Net::Time qw(inet_time inet_daytime);
+
+ print inet_time(); # use default host from Net::Config
+ print inet_time('localhost');
+ print inet_time('localhost', 'tcp');
+
+ print inet_daytime(); # use default host from Net::Config
+ print inet_daytime('localhost');
+ print inet_daytime('localhost', 'tcp');
+
+=head1 DESCRIPTION
+
+C<Net::Time> provides subroutines that obtain the time on a remote machine.
+
+=over 4
+
+=item inet_time ( [HOST [, PROTOCOL [, TIMEOUT]]])
+
+Obtain the time on C<HOST>, or some default host if C<HOST> is not given
+or not defined, using the protocol as defined in RFC868. The optional
+argument C<PROTOCOL> should define the protocol to use, either C<tcp> or
+C<udp>. The result will be a time value in the same units as returned
+by time() or I<undef> upon failure.
+
+=item inet_daytime ( [HOST [, PROTOCOL [, TIMEOUT]]])
+
+Obtain the time on C<HOST>, or some default host if C<HOST> is not given
+or not defined, using the protocol as defined in RFC867. The optional
+argument C<PROTOCOL> should define the protocol to use, either C<tcp> or
+C<udp>. The result will be an ASCII string or I<undef> upon failure.
+
+=back
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-2004 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/hostent.pm b/Master/tlpkg/tlperl.straw/lib/Net/hostent.pm
new file mode 100755
index 00000000000..3a2fc013877
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/hostent.pm
@@ -0,0 +1,151 @@
+package Net::hostent;
+use strict;
+
+use 5.006_001;
+our $VERSION = '1.01';
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+BEGIN {
+ use Exporter ();
+ @EXPORT = qw(gethostbyname gethostbyaddr gethost);
+ @EXPORT_OK = qw(
+ $h_name @h_aliases
+ $h_addrtype $h_length
+ @h_addr_list $h_addr
+ );
+ %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars @EXPORT_OK;
+
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
+struct 'Net::hostent' => [
+ name => '$',
+ aliases => '@',
+ addrtype => '$',
+ 'length' => '$',
+ addr_list => '@',
+];
+
+sub addr { shift->addr_list->[0] }
+
+sub populate (@) {
+ return unless @_;
+ my $hob = new();
+ $h_name = $hob->[0] = $_[0];
+ @h_aliases = @{ $hob->[1] } = split ' ', $_[1];
+ $h_addrtype = $hob->[2] = $_[2];
+ $h_length = $hob->[3] = $_[3];
+ $h_addr = $_[4];
+ @h_addr_list = @{ $hob->[4] } = @_[ (4 .. $#_) ];
+ return $hob;
+}
+
+sub gethostbyname ($) { populate(CORE::gethostbyname(shift)) }
+
+sub gethostbyaddr ($;$) {
+ my ($addr, $addrtype);
+ $addr = shift;
+ require Socket unless @_;
+ $addrtype = @_ ? shift : Socket::AF_INET();
+ populate(CORE::gethostbyaddr($addr, $addrtype))
+}
+
+sub gethost($) {
+ if ($_[0] =~ /^\d+(?:\.\d+(?:\.\d+(?:\.\d+)?)?)?$/) {
+ require Socket;
+ &gethostbyaddr(Socket::inet_aton(shift));
+ } else {
+ &gethostbyname;
+ }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Net::hostent - by-name interface to Perl's built-in gethost*() functions
+
+=head1 SYNOPSIS
+
+ use Net::hostent;
+
+=head1 DESCRIPTION
+
+This module's default exports override the core gethostbyname() and
+gethostbyaddr() functions, replacing them with versions that return
+"Net::hostent" objects. This object has methods that return the similarly
+named structure field name from the C's hostent structure from F<netdb.h>;
+namely name, aliases, addrtype, length, and addr_list. The aliases and
+addr_list methods return array reference, the rest scalars. The addr
+method is equivalent to the zeroth element in the addr_list array
+reference.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag. (Note that this still
+overrides your core functions.) Access these fields as variables named
+with a preceding C<h_>. Thus, C<$host_obj-E<gt>name()> corresponds to
+$h_name if you import the fields. Array references are available as
+regular array variables, so for example C<@{ $host_obj-E<gt>aliases()
+}> would be simply @h_aliases.
+
+The gethost() function is a simple front-end that forwards a numeric
+argument to gethostbyaddr() by way of Socket::inet_aton, and the rest
+to gethostbyname().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 EXAMPLES
+
+ use Net::hostent;
+ use Socket;
+
+ @ARGV = ('netscape.com') unless @ARGV;
+
+ for $host ( @ARGV ) {
+
+ unless ($h = gethost($host)) {
+ warn "$0: no such host: $host\n";
+ next;
+ }
+
+ printf "\n%s is %s%s\n",
+ $host,
+ lc($h->name) eq lc($host) ? "" : "*really* ",
+ $h->name;
+
+ print "\taliases are ", join(", ", @{$h->aliases}), "\n"
+ if @{$h->aliases};
+
+ if ( @{$h->addr_list} > 1 ) {
+ my $i;
+ for $addr ( @{$h->addr_list} ) {
+ printf "\taddr #%d is [%s]\n", $i++, inet_ntoa($addr);
+ }
+ } else {
+ printf "\taddress is [%s]\n", inet_ntoa($h->addr);
+ }
+
+ if ($h = gethostbyaddr($h->addr)) {
+ if (lc($h->name) ne lc($host)) {
+ printf "\tThat addr reverses to host %s!\n", $h->name;
+ $host = $h->name;
+ redo;
+ }
+ }
+ }
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/libnetFAQ.pod b/Master/tlpkg/tlperl.straw/lib/Net/libnetFAQ.pod
new file mode 100755
index 00000000000..e6ec362f36a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/libnetFAQ.pod
@@ -0,0 +1,303 @@
+=head1 NAME
+
+libnetFAQ - libnet Frequently Asked Questions
+
+=head1 DESCRIPTION
+
+=head2 Where to get this document
+
+This document is distributed with the libnet distribution, and is also
+available on the libnet web page at
+
+ http://search.cpan.org/~gbarr/libnet/
+
+=head2 How to contribute to this document
+
+You may mail corrections, additions, and suggestions to me
+gbarr@pobox.com.
+
+=head1 Author and Copyright Information
+
+Copyright (c) 1997-1998 Graham Barr. All rights reserved.
+This document is free; you can redistribute it and/or modify it
+under the terms of the Artistic License.
+
+=head2 Disclaimer
+
+This information is offered in good faith and in the hope that it may
+be of use, but is not guaranteed to be correct, up to date, or suitable
+for any particular purpose whatsoever. The authors accept no liability
+in respect of this information or its use.
+
+
+=head1 Obtaining and installing libnet
+
+=head2 What is libnet ?
+
+libnet is a collection of perl5 modules which all related to network
+programming. The majority of the modules available provided the
+client side of popular server-client protocols that are used in
+the internet community.
+
+=head2 Which version of perl do I need ?
+
+libnet has been know to work with versions of perl from 5.002 onwards. However
+if your release of perl is prior to perl5.004 then you will need to
+obtain and install the IO distribution from CPAN. If you have perl5.004
+or later then you will have the IO modules in your installation already,
+but CPAN may contain updates.
+
+=head2 What other modules do I need ?
+
+The only modules you will need installed are the modules from the IO
+distribution. If you have perl5.004 or later you will already have
+these modules.
+
+=head2 What machines support libnet ?
+
+libnet itself is an entirely perl-code distribution so it should work
+on any machine that perl runs on. However IO may not work
+with some machines and earlier releases of perl. But this
+should not be the case with perl version 5.004 or later.
+
+=head2 Where can I get the latest libnet release
+
+The latest libnet release is always on CPAN, you will find it
+in
+
+ http://www.cpan.org/modules/by-module/Net/
+
+The latest release and information is also available on the libnet web page
+at
+
+ http://search.cpan.org/~gbarr/libnet/
+
+=head1 Using Net::FTP
+
+=head2 How do I download files from an FTP server ?
+
+An example taken from an article posted to comp.lang.perl.misc
+
+ #!/your/path/to/perl
+
+ # a module making life easier
+
+ use Net::FTP;
+
+ # for debugging: $ftp = Net::FTP->new('site','Debug',10);
+ # open a connection and log in!
+
+ $ftp = Net::FTP->new('target_site.somewhere.xxx');
+ $ftp->login('username','password');
+
+ # set transfer mode to binary
+
+ $ftp->binary();
+
+ # change the directory on the ftp site
+
+ $ftp->cwd('/some/path/to/somewhere/');
+
+ foreach $name ('file1', 'file2', 'file3') {
+
+ # get's arguments are in the following order:
+ # ftp server's filename
+ # filename to save the transfer to on the local machine
+ # can be simply used as get($name) if you want the same name
+
+ $ftp->get($name,$name);
+ }
+
+ # ftp done!
+
+ $ftp->quit;
+
+=head2 How do I transfer files in binary mode ?
+
+To transfer files without <LF><CR> translation Net::FTP provides
+the C<binary> method
+
+ $ftp->binary;
+
+=head2 How can I get the size of a file on a remote FTP server ?
+
+=head2 How can I get the modification time of a file on a remote FTP server ?
+
+=head2 How can I change the permissions of a file on a remote server ?
+
+The FTP protocol does not have a command for changing the permissions
+of a file on the remote server. But some ftp servers may allow a chmod
+command to be issued via a SITE command, eg
+
+ $ftp->quot('site chmod 0777',$filename);
+
+But this is not guaranteed to work.
+
+=head2 Can I do a reget operation like the ftp command ?
+
+=head2 How do I get a directory listing from an FTP server ?
+
+=head2 Changing directory to "" does not fail ?
+
+Passing an argument of "" to ->cwd() has the same affect of calling ->cwd()
+without any arguments. Turn on Debug (I<See below>) and you will see what is
+happening
+
+ $ftp = Net::FTP->new($host, Debug => 1);
+ $ftp->login;
+ $ftp->cwd("");
+
+gives
+
+ Net::FTP=GLOB(0x82196d8)>>> CWD /
+ Net::FTP=GLOB(0x82196d8)<<< 250 CWD command successful.
+
+=head2 I am behind a SOCKS firewall, but the Firewall option does not work ?
+
+The Firewall option is only for support of one type of firewall. The type
+supported is an ftp proxy.
+
+To use Net::FTP, or any other module in the libnet distribution,
+through a SOCKS firewall you must create a socks-ified perl executable
+by compiling perl with the socks library.
+
+=head2 I am behind an FTP proxy firewall, but cannot access machines outside ?
+
+Net::FTP implements the most popular ftp proxy firewall approach. The scheme
+implemented is that where you log in to the firewall with C<user@hostname>
+
+I have heard of one other type of firewall which requires a login to the
+firewall with an account, then a second login with C<user@hostname>. You can
+still use Net::FTP to traverse these firewalls, but a more manual approach
+must be taken, eg
+
+ $ftp = Net::FTP->new($firewall) or die $@;
+ $ftp->login($firewall_user, $firewall_passwd) or die $ftp->message;
+ $ftp->login($ext_user . '@' . $ext_host, $ext_passwd) or die $ftp->message.
+
+=head2 My ftp proxy firewall does not listen on port 21
+
+FTP servers usually listen on the same port number, port 21, as any other
+FTP server. But there is no reason why this has to be the case.
+
+If you pass a port number to Net::FTP then it assumes this is the port
+number of the final destination. By default Net::FTP will always try
+to connect to the firewall on port 21.
+
+Net::FTP uses IO::Socket to open the connection and IO::Socket allows
+the port number to be specified as part of the hostname. So this problem
+can be resolved by either passing a Firewall option like C<"hostname:1234">
+or by setting the C<ftp_firewall> option in Net::Config to be a string
+in in the same form.
+
+=head2 Is it possible to change the file permissions of a file on an FTP server ?
+
+The answer to this is "maybe". The FTP protocol does not specify a command to change
+file permissions on a remote host. However many servers do allow you to run the
+chmod command via the C<SITE> command. This can be done with
+
+ $ftp->site('chmod','0775',$file);
+
+=head2 I have seen scripts call a method message, but cannot find it documented ?
+
+Net::FTP, like several other packages in libnet, inherits from Net::Cmd, so
+all the methods described in Net::Cmd are also available on Net::FTP
+objects.
+
+=head2 Why does Net::FTP not implement mput and mget methods
+
+The quick answer is because they are easy to implement yourself. The long
+answer is that to write these in such a way that multiple platforms are
+supported correctly would just require too much code. Below are
+some examples how you can implement these yourself.
+
+sub mput {
+ my($ftp,$pattern) = @_;
+ foreach my $file (glob($pattern)) {
+ $ftp->put($file) or warn $ftp->message;
+ }
+}
+
+sub mget {
+ my($ftp,$pattern) = @_;
+ foreach my $file ($ftp->ls($pattern)) {
+ $ftp->get($file) or warn $ftp->message;
+ }
+}
+
+
+=head1 Using Net::SMTP
+
+=head2 Why can't the part of an Email address after the @ be used as the hostname ?
+
+The part of an Email address which follows the @ is not necessarily a hostname,
+it is a mail domain. To find the name of a host to connect for a mail domain
+you need to do a DNS MX lookup
+
+=head2 Why does Net::SMTP not do DNS MX lookups ?
+
+Net::SMTP implements the SMTP protocol. The DNS MX lookup is not part
+of this protocol.
+
+=head2 The verify method always returns true ?
+
+Well it may seem that way, but it does not. The verify method returns true
+if the command succeeded. If you pass verify an address which the
+server would normally have to forward to another machine, the command
+will succeed with something like
+
+ 252 Couldn't verify <someone@there> but will attempt delivery anyway
+
+This command will fail only if you pass it an address in a domain
+the server directly delivers for, and that address does not exist.
+
+=head1 Debugging scripts
+
+=head2 How can I debug my scripts that use Net::* modules ?
+
+Most of the libnet client classes allow options to be passed to the
+constructor, in most cases one option is called C<Debug>. Passing
+this option with a non-zero value will turn on a protocol trace, which
+will be sent to STDERR. This trace can be useful to see what commands
+are being sent to the remote server and what responses are being
+received back.
+
+ #!/your/path/to/perl
+
+ use Net::FTP;
+
+ my $ftp = new Net::FTP($host, Debug => 1);
+ $ftp->login('gbarr','password');
+ $ftp->quit;
+
+this script would output something like
+
+ Net::FTP: Net::FTP(2.22)
+ Net::FTP: Exporter
+ Net::FTP: Net::Cmd(2.0801)
+ Net::FTP: IO::Socket::INET
+ Net::FTP: IO::Socket(1.1603)
+ Net::FTP: IO::Handle(1.1504)
+
+ Net::FTP=GLOB(0x8152974)<<< 220 imagine FTP server (Version wu-2.4(5) Tue Jul 29 11:17:18 CDT 1997) ready.
+ Net::FTP=GLOB(0x8152974)>>> user gbarr
+ Net::FTP=GLOB(0x8152974)<<< 331 Password required for gbarr.
+ Net::FTP=GLOB(0x8152974)>>> PASS ....
+ Net::FTP=GLOB(0x8152974)<<< 230 User gbarr logged in. Access restrictions apply.
+ Net::FTP=GLOB(0x8152974)>>> QUIT
+ Net::FTP=GLOB(0x8152974)<<< 221 Goodbye.
+
+The first few lines tell you the modules that Net::FTP uses and their versions,
+this is useful data to me when a user reports a bug. The last seven lines
+show the communication with the server. Each line has three parts. The first
+part is the object itself, this is useful for separating the output
+if you are using multiple objects. The second part is either C<<<<<> to
+show data coming from the server or C<&gt&gt&gt&gt> to show data
+going to the server. The remainder of the line is the command
+being sent or response being received.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997 Graham Barr.
+All rights reserved.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/netent.pm b/Master/tlpkg/tlperl.straw/lib/Net/netent.pm
new file mode 100755
index 00000000000..f7d32cb9254
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/netent.pm
@@ -0,0 +1,169 @@
+package Net::netent;
+use strict;
+
+use 5.006_001;
+our $VERSION = '1.00';
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+BEGIN {
+ use Exporter ();
+ @EXPORT = qw(getnetbyname getnetbyaddr getnet);
+ @EXPORT_OK = qw(
+ $n_name @n_aliases
+ $n_addrtype $n_net
+ );
+ %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars @EXPORT_OK;
+
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
+struct 'Net::netent' => [
+ name => '$',
+ aliases => '@',
+ addrtype => '$',
+ net => '$',
+];
+
+sub populate (@) {
+ return unless @_;
+ my $nob = new();
+ $n_name = $nob->[0] = $_[0];
+ @n_aliases = @{ $nob->[1] } = split ' ', $_[1];
+ $n_addrtype = $nob->[2] = $_[2];
+ $n_net = $nob->[3] = $_[3];
+ return $nob;
+}
+
+sub getnetbyname ($) { populate(CORE::getnetbyname(shift)) }
+
+sub getnetbyaddr ($;$) {
+ my ($net, $addrtype);
+ $net = shift;
+ require Socket if @_;
+ $addrtype = @_ ? shift : Socket::AF_INET();
+ populate(CORE::getnetbyaddr($net, $addrtype))
+}
+
+sub getnet($) {
+ if ($_[0] =~ /^\d+(?:\.\d+(?:\.\d+(?:\.\d+)?)?)?$/) {
+ require Socket;
+ &getnetbyaddr(Socket::inet_aton(shift));
+ } else {
+ &getnetbyname;
+ }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Net::netent - by-name interface to Perl's built-in getnet*() functions
+
+=head1 SYNOPSIS
+
+ use Net::netent qw(:FIELDS);
+ getnetbyname("loopback") or die "bad net";
+ printf "%s is %08X\n", $n_name, $n_net;
+
+ use Net::netent;
+
+ $n = getnetbyname("loopback") or die "bad net";
+ { # there's gotta be a better way, eh?
+ @bytes = unpack("C4", pack("N", $n->net));
+ shift @bytes while @bytes && $bytes[0] == 0;
+ }
+ printf "%s is %08X [%d.%d.%d.%d]\n", $n->name, $n->net, @bytes;
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getnetbyname() and
+getnetbyaddr() functions, replacing them with versions that return
+"Net::netent" objects. This object has methods that return the similarly
+named structure field name from the C's netent structure from F<netdb.h>;
+namely name, aliases, addrtype, and net. The aliases
+method returns an array reference, the rest scalars.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag. (Note that this still
+overrides your core functions.) Access these fields as variables named
+with a preceding C<n_>. Thus, C<$net_obj-E<gt>name()> corresponds to
+$n_name if you import the fields. Array references are available as
+regular array variables, so for example C<@{ $net_obj-E<gt>aliases()
+}> would be simply @n_aliases.
+
+The getnet() function is a simple front-end that forwards a numeric
+argument to getnetbyaddr(), and the rest
+to getnetbyname().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 EXAMPLES
+
+The getnet() functions do this in the Perl core:
+
+ sv_setiv(sv, (I32)nent->n_net);
+
+The gethost() functions do this in the Perl core:
+
+ sv_setpvn(sv, hent->h_addr, len);
+
+That means that the address comes back in binary for the
+host functions, and as a regular perl integer for the net ones.
+This seems a bug, but here's how to deal with it:
+
+ use strict;
+ use Socket;
+ use Net::netent;
+
+ @ARGV = ('loopback') unless @ARGV;
+
+ my($n, $net);
+
+ for $net ( @ARGV ) {
+
+ unless ($n = getnetbyname($net)) {
+ warn "$0: no such net: $net\n";
+ next;
+ }
+
+ printf "\n%s is %s%s\n",
+ $net,
+ lc($n->name) eq lc($net) ? "" : "*really* ",
+ $n->name;
+
+ print "\taliases are ", join(", ", @{$n->aliases}), "\n"
+ if @{$n->aliases};
+
+ # this is stupid; first, why is this not in binary?
+ # second, why am i going through these convolutions
+ # to make it looks right
+ {
+ my @a = unpack("C4", pack("N", $n->net));
+ shift @a while @a && $a[0] == 0;
+ printf "\taddr is %s [%d.%d.%d.%d]\n", $n->net, @a;
+ }
+
+ if ($n = getnetbyaddr($n->net)) {
+ if (lc($n->name) ne lc($net)) {
+ printf "\tThat addr reverses to net %s!\n", $n->name;
+ $net = $n->name;
+ redo;
+ }
+ }
+ }
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/protoent.pm b/Master/tlpkg/tlperl.straw/lib/Net/protoent.pm
new file mode 100755
index 00000000000..2cbccad3cbc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/protoent.pm
@@ -0,0 +1,96 @@
+package Net::protoent;
+use strict;
+
+use 5.006_001;
+our $VERSION = '1.00';
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+BEGIN {
+ use Exporter ();
+ @EXPORT = qw(getprotobyname getprotobynumber getprotoent getproto);
+ @EXPORT_OK = qw( $p_name @p_aliases $p_proto );
+ %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars @EXPORT_OK;
+
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
+struct 'Net::protoent' => [
+ name => '$',
+ aliases => '@',
+ proto => '$',
+];
+
+sub populate (@) {
+ return unless @_;
+ my $pob = new();
+ $p_name = $pob->[0] = $_[0];
+ @p_aliases = @{ $pob->[1] } = split ' ', $_[1];
+ $p_proto = $pob->[2] = $_[2];
+ return $pob;
+}
+
+sub getprotoent ( ) { populate(CORE::getprotoent()) }
+sub getprotobyname ($) { populate(CORE::getprotobyname(shift)) }
+sub getprotobynumber ($) { populate(CORE::getprotobynumber(shift)) }
+
+sub getproto ($;$) {
+ no strict 'refs';
+ return &{'getprotoby' . ($_[0]=~/^\d+$/ ? 'number' : 'name')}(@_);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::protoent - by-name interface to Perl's built-in getproto*() functions
+
+=head1 SYNOPSIS
+
+ use Net::protoent;
+ $p = getprotobyname(shift || 'tcp') || die "no proto";
+ printf "proto for %s is %d, aliases are %s\n",
+ $p->name, $p->proto, "@{$p->aliases}";
+
+ use Net::protoent qw(:FIELDS);
+ getprotobyname(shift || 'tcp') || die "no proto";
+ print "proto for $p_name is $p_proto, aliases are @p_aliases\n";
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getprotoent(),
+getprotobyname(), and getnetbyport() functions, replacing them with
+versions that return "Net::protoent" objects. They take default
+second arguments of "tcp". This object has methods that return the
+similarly named structure field name from the C's protoent structure
+from F<netdb.h>; namely name, aliases, and proto. The aliases method
+returns an array reference, the rest scalars.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag. (Note that this still
+overrides your core functions.) Access these fields as variables named
+with a preceding C<p_>. Thus, C<$proto_obj-E<gt>name()> corresponds to
+$p_name if you import the fields. Array references are available as
+regular array variables, so for example C<@{ $proto_obj-E<gt>aliases()
+}> would be simply @p_aliases.
+
+The getproto() function is a simple front-end that forwards a numeric
+argument to getprotobyport(), and the rest to getprotobyname().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/Master/tlpkg/tlperl.straw/lib/Net/servent.pm b/Master/tlpkg/tlperl.straw/lib/Net/servent.pm
new file mode 100755
index 00000000000..78a16814555
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Net/servent.pm
@@ -0,0 +1,113 @@
+package Net::servent;
+use strict;
+
+use 5.006_001;
+our $VERSION = '1.01';
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+BEGIN {
+ use Exporter ();
+ @EXPORT = qw(getservbyname getservbyport getservent getserv);
+ @EXPORT_OK = qw( $s_name @s_aliases $s_port $s_proto );
+ %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars @EXPORT_OK;
+
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
+struct 'Net::servent' => [
+ name => '$',
+ aliases => '@',
+ port => '$',
+ proto => '$',
+];
+
+sub populate (@) {
+ return unless @_;
+ my $sob = new();
+ $s_name = $sob->[0] = $_[0];
+ @s_aliases = @{ $sob->[1] } = split ' ', $_[1];
+ $s_port = $sob->[2] = $_[2];
+ $s_proto = $sob->[3] = $_[3];
+ return $sob;
+}
+
+sub getservent ( ) { populate(CORE::getservent()) }
+sub getservbyname ($;$) { populate(CORE::getservbyname(shift,shift||'tcp')) }
+sub getservbyport ($;$) { populate(CORE::getservbyport(shift,shift||'tcp')) }
+
+sub getserv ($;$) {
+ no strict 'refs';
+ return &{'getservby' . ($_[0]=~/^\d+$/ ? 'port' : 'name')}(@_);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::servent - by-name interface to Perl's built-in getserv*() functions
+
+=head1 SYNOPSIS
+
+ use Net::servent;
+ $s = getservbyname(shift || 'ftp') || die "no service";
+ printf "port for %s is %s, aliases are %s\n",
+ $s->name, $s->port, "@{$s->aliases}";
+
+ use Net::servent qw(:FIELDS);
+ getservbyname(shift || 'ftp') || die "no service";
+ print "port for $s_name is $s_port, aliases are @s_aliases\n";
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getservent(),
+getservbyname(), and
+getnetbyport() functions, replacing them with versions that return
+"Net::servent" objects. They take default second arguments of "tcp". This object has methods that return the similarly
+named structure field name from the C's servent structure from F<netdb.h>;
+namely name, aliases, port, and proto. The aliases
+method returns an array reference, the rest scalars.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag. (Note that this still
+overrides your core functions.) Access these fields as variables named
+with a preceding C<s_>. Thus, C<$serv_obj-E<gt>name()> corresponds to
+$s_name if you import the fields. Array references are available as
+regular array variables, so for example C<@{ $serv_obj-E<gt>aliases()}>
+would be simply @s_aliases.
+
+The getserv() function is a simple front-end that forwards a numeric
+argument to getservbyport(), and the rest to getservbyname().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 EXAMPLES
+
+ use Net::servent qw(:FIELDS);
+
+ while (@ARGV) {
+ my ($service, $proto) = ((split m!/!, shift), 'tcp');
+ my $valet = getserv($service, $proto);
+ unless ($valet) {
+ warn "$0: No service: $service/$proto\n"
+ next;
+ }
+ printf "service $service/$proto is port %d\n", $valet->port;
+ print "alias are @s_aliases\n" if @s_aliases;
+ }
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/Master/tlpkg/tlperl.straw/lib/Number/Compare.pm b/Master/tlpkg/tlperl.straw/lib/Number/Compare.pm
new file mode 100755
index 00000000000..0191e925e2e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Number/Compare.pm
@@ -0,0 +1,100 @@
+# $Id: Compare.pm 846 2002-10-25 15:46:01Z richardc $
+package Number::Compare;
+use strict;
+use Carp qw(croak);
+use vars qw/$VERSION/;
+$VERSION = '0.01';
+
+sub new {
+ my $referent = shift;
+ my $class = ref $referent || $referent;
+ my $expr = $class->parse_to_perl( shift );
+
+ bless eval "sub { \$_[0] $expr }", $class;
+}
+
+sub parse_to_perl {
+ shift;
+ my $test = shift;
+
+ $test =~ m{^
+ ([<>]=?)? # comparison
+ (.*?) # value
+ ([kmg]i?)? # magnitude
+ $}ix
+ or croak "don't understand '$test' as a test";
+
+ my $comparison = $1 || '==';
+ my $target = $2;
+ my $magnitude = $3;
+ $target *= 1000 if lc $magnitude eq 'k';
+ $target *= 1024 if lc $magnitude eq 'ki';
+ $target *= 1000000 if lc $magnitude eq 'm';
+ $target *= 1024*1024 if lc $magnitude eq 'mi';
+ $target *= 1000000000 if lc $magnitude eq 'g';
+ $target *= 1024*1024*1024 if lc $magnitude eq 'gi';
+
+ return "$comparison $target";
+}
+
+sub test { $_[0]->( $_[1] ) }
+
+1;
+
+__END__
+
+=head1 NAME
+
+Number::Compare - numeric comparisons
+
+=head1 SYNOPSIS
+
+ Number::Compare->new(">1Ki")->test(1025); # is 1025 > 1024
+
+ my $c = Number::Compare->new(">1M");
+ $c->(1_200_000); # slightly terser invocation
+
+=head1 DESCRIPTION
+
+Number::Compare compiles a simple comparison to an anonymous
+subroutine, which you can call with a value to be tested again.
+
+Now this would be very pointless, if Number::Compare didn't understand
+magnitudes.
+
+The target value may use magnitudes of kilobytes (C<k>, C<ki>),
+megabytes (C<m>, C<mi>), or gigabytes (C<g>, C<gi>). Those suffixed
+with an C<i> use the appropriate 2**n version in accordance with the
+IEC standard: http://physics.nist.gov/cuu/Units/binary.html
+
+=head1 METHODS
+
+=head2 ->new( $test )
+
+Returns a new object that compares the specified test.
+
+=head2 ->test( $value )
+
+A longhanded version of $compare->( $value ). Predates blessed
+subroutine reference implementation.
+
+=head2 ->parse_to_perl( $test )
+
+Returns a perl code fragment equivalent to the test.
+
+=head1 AUTHOR
+
+Richard Clamp <richardc@unixbeard.net>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002 Richard Clamp. All Rights Reserved.
+
+This module is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+http://physics.nist.gov/cuu/Units/binary.html
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/O.pm b/Master/tlpkg/tlperl.straw/lib/O.pm
new file mode 100755
index 00000000000..2976a894208
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/O.pm
@@ -0,0 +1,143 @@
+package O;
+
+our $VERSION = '1.01';
+
+use B qw(minus_c save_BEGINs);
+use Carp;
+
+sub import {
+ my ($class, @options) = @_;
+ my ($quiet, $veryquiet) = (0, 0);
+ if ($options[0] eq '-q' || $options[0] eq '-qq') {
+ $quiet = 1;
+ open (SAVEOUT, ">&STDOUT");
+ close STDOUT;
+ open (STDOUT, ">", \$O::BEGIN_output);
+ if ($options[0] eq '-qq') {
+ $veryquiet = 1;
+ }
+ shift @options;
+ }
+ my $backend = shift (@options);
+ eval q[
+ BEGIN {
+ minus_c;
+ save_BEGINs;
+ }
+
+ CHECK {
+ if ($quiet) {
+ close STDOUT;
+ open (STDOUT, ">&SAVEOUT");
+ close SAVEOUT;
+ }
+
+ # Note: if you change the code after this 'use', please
+ # change the fudge factors in B::Concise (grep for
+ # "fragile kludge") so that its output still looks
+ # nice. Thanks. --smcc
+ use B::].$backend.q[ ();
+ if ($@) {
+ croak "use of backend $backend failed: $@";
+ }
+
+
+ my $compilesub = &{"B::${backend}::compile"}(@options);
+ if (ref($compilesub) ne "CODE") {
+ die $compilesub;
+ }
+
+ local $savebackslash = $\;
+ local ($\,$",$,) = (undef,' ','');
+ &$compilesub();
+
+ close STDERR if $veryquiet;
+ }
+ ];
+ die $@ if $@;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+O - Generic interface to Perl Compiler backends
+
+=head1 SYNOPSIS
+
+ perl -MO=[-q,]Backend[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+This is the module that is used as a frontend to the Perl Compiler.
+
+If you pass the C<-q> option to the module, then the STDOUT
+filehandle will be redirected into the variable C<$O::BEGIN_output>
+during compilation. This has the effect that any output printed
+to STDOUT by BEGIN blocks or use'd modules will be stored in this
+variable rather than printed. It's useful with those backends which
+produce output themselves (C<Deparse>, C<Concise> etc), so that
+their output is not confused with that generated by the code
+being compiled.
+
+The C<-qq> option behaves like C<-q>, except that it also closes
+STDERR after deparsing has finished. This suppresses the "Syntax OK"
+message normally produced by perl.
+
+=head1 CONVENTIONS
+
+Most compiler backends use the following conventions: OPTIONS
+consists of a comma-separated list of words (no white-space).
+The C<-v> option usually puts the backend into verbose mode.
+The C<-ofile> option generates output to B<file> instead of
+stdout. The C<-D> option followed by various letters turns on
+various internal debugging flags. See the documentation for the
+desired backend (named C<B::Backend> for the example above) to
+find out about that backend.
+
+=head1 IMPLEMENTATION
+
+This section is only necessary for those who want to write a
+compiler backend module that can be used via this module.
+
+The command-line mentioned in the SYNOPSIS section corresponds to
+the Perl code
+
+ use O ("Backend", OPTIONS);
+
+The C<O::import> function loads the appropriate C<B::Backend> module
+and calls its C<compile> function, passing it OPTIONS. That function
+is expected to return a sub reference which we'll call CALLBACK. Next,
+the "compile-only" flag is switched on (equivalent to the command-line
+option C<-c>) and a CHECK block is registered which calls
+CALLBACK. Thus the main Perl program mentioned on the command-line is
+read in, parsed and compiled into internal syntax tree form. Since the
+C<-c> flag is set, the program does not start running (excepting BEGIN
+blocks of course) but the CALLBACK function registered by the compiler
+backend is called.
+
+In summary, a compiler backend module should be called "B::Foo"
+for some foo and live in the appropriate directory for that name.
+It should define a function called C<compile>. When the user types
+
+ perl -MO=Foo,OPTIONS foo.pl
+
+that function is called and is passed those OPTIONS (split on
+commas). It should return a sub ref to the main compilation function.
+After the user's program is loaded and parsed, that returned sub ref
+is invoked which can then go ahead and do the compilation, usually by
+making use of the C<B> module's functionality.
+
+=head1 BUGS
+
+The C<-q> and C<-qq> options don't work correctly if perl isn't
+compiled with PerlIO support : STDOUT will be closed instead of being
+redirected to C<$O::BEGIN_output>.
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Object/Accessor.pm b/Master/tlpkg/tlperl.straw/lib/Object/Accessor.pm
new file mode 100755
index 00000000000..7166200af19
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Object/Accessor.pm
@@ -0,0 +1,819 @@
+package Object::Accessor;
+
+use strict;
+use Carp qw[carp croak];
+use vars qw[$FATAL $DEBUG $AUTOLOAD $VERSION];
+use Params::Check qw[allow];
+use Data::Dumper;
+
+### some objects might have overload enabled, we'll need to
+### disable string overloading for callbacks
+require overload;
+
+$VERSION = '0.36';
+$FATAL = 0;
+$DEBUG = 0;
+
+use constant VALUE => 0; # array index in the hash value
+use constant ALLOW => 1; # array index in the hash value
+use constant ALIAS => 2; # array index in the hash value
+
+=head1 NAME
+
+Object::Accessor - interface to create per object accessors
+
+=head1 SYNOPSIS
+
+ ### using the object
+ $obj = Object::Accessor->new; # create object
+ $obj = Object::Accessor->new(@list); # create object with accessors
+ $obj = Object::Accessor->new(\%h); # create object with accessors
+ # and their allow handlers
+
+ $bool = $obj->mk_accessors('foo'); # create accessors
+ $bool = $obj->mk_accessors( # create accessors with input
+ {foo => ALLOW_HANDLER} ); # validation
+
+ $bool = $obj->mk_aliases( # create an alias to an existing
+ alias_name => 'method'); # method name
+
+ $clone = $obj->mk_clone; # create a clone of original
+ # object without data
+ $bool = $obj->mk_flush; # clean out all data
+
+ @list = $obj->ls_accessors; # retrieves a list of all
+ # accessors for this object
+
+ $bar = $obj->foo('bar'); # set 'foo' to 'bar'
+ $bar = $obj->foo(); # retrieve 'bar' again
+
+ $sub = $obj->can('foo'); # retrieve coderef for
+ # 'foo' accessor
+ $bar = $sub->('bar'); # set 'foo' via coderef
+ $bar = $sub->(); # retrieve 'bar' by coderef
+
+ ### using the object as base class
+ package My::Class;
+ use base 'Object::Accessor';
+
+ $obj = My::Class->new; # create base object
+ $bool = $obj->mk_accessors('foo'); # create accessors, etc...
+
+ ### make all attempted access to non-existant accessors fatal
+ ### (defaults to false)
+ $Object::Accessor::FATAL = 1;
+
+ ### enable debugging
+ $Object::Accessor::DEBUG = 1;
+
+ ### advanced usage -- callbacks
+ { my $obj = Object::Accessor->new('foo');
+ $obj->register_callback( sub { ... } );
+
+ $obj->foo( 1 ); # these calls invoke the callback you registered
+ $obj->foo() # which allows you to change the get/set
+ # behaviour and what is returned to the caller.
+ }
+
+ ### advanced usage -- lvalue attributes
+ { my $obj = Object::Accessor::Lvalue->new('foo');
+ print $obj->foo = 1; # will print 1
+ }
+
+ ### advanced usage -- scoped attribute values
+ { my $obj = Object::Accessor->new('foo');
+
+ $obj->foo( 1 );
+ print $obj->foo; # will print 1
+
+ ### bind the scope of the value of attribute 'foo'
+ ### to the scope of '$x' -- when $x goes out of
+ ### scope, 'foo's previous value will be restored
+ { $obj->foo( 2 => \my $x );
+ print $obj->foo, ' ', $x; # will print '2 2'
+ }
+ print $obj->foo; # will print 1
+ }
+
+
+=head1 DESCRIPTION
+
+C<Object::Accessor> provides an interface to create per object
+accessors (as opposed to per C<Class> accessors, as, for example,
+C<Class::Accessor> provides).
+
+You can choose to either subclass this module, and thus using its
+accessors on your own module, or to store an C<Object::Accessor>
+object inside your own object, and access the accessors from there.
+See the C<SYNOPSIS> for examples.
+
+=head1 METHODS
+
+=head2 $object = Object::Accessor->new( [ARGS] );
+
+Creates a new (and empty) C<Object::Accessor> object. This method is
+inheritable.
+
+Any arguments given to C<new> are passed straight to C<mk_accessors>.
+
+If you want to be able to assign to your accessors as if they
+were C<lvalue>s, you should create your object in the
+C<Object::Acccessor::Lvalue> namespace instead. See the section
+on C<LVALUE ACCESSORS> below.
+
+=cut
+
+sub new {
+ my $class = shift;
+ my $obj = bless {}, $class;
+
+ $obj->mk_accessors( @_ ) if @_;
+
+ return $obj;
+}
+
+=head2 $bool = $object->mk_accessors( @ACCESSORS | \%ACCESSOR_MAP );
+
+Creates a list of accessors for this object (and C<NOT> for other ones
+in the same class!).
+Will not clobber existing data, so if an accessor already exists,
+requesting to create again is effectively a C<no-op>.
+
+When providing a C<hashref> as argument, rather than a normal list,
+you can specify a list of key/value pairs of accessors and their
+respective input validators. The validators can be anything that
+C<Params::Check>'s C<allow> function accepts. Please see its manpage
+for details.
+
+For example:
+
+ $object->mk_accessors( {
+ foo => qr/^\d+$/, # digits only
+ bar => [0,1], # booleans
+ zot => \&my_sub # a custom verification sub
+ } );
+
+Returns true on success, false on failure.
+
+Accessors that are called on an object, that do not exist return
+C<undef> by default, but you can make this a fatal error by setting the
+global variable C<$FATAL> to true. See the section on C<GLOBAL
+VARIABLES> for details.
+
+Note that you can bind the values of attributes to a scope. This allows
+you to C<temporarily> change a value of an attribute, and have it's
+original value restored up on the end of it's bound variable's scope;
+
+For example, in this snippet of code, the attribute C<foo> will
+temporarily be set to C<2>, until the end of the scope of C<$x>, at
+which point the original value of C<1> will be restored.
+
+ my $obj = Object::Accessor->new;
+
+ $obj->mk_accessors('foo');
+ $obj->foo( 1 );
+ print $obj->foo; # will print 1
+
+ ### bind the scope of the value of attribute 'foo'
+ ### to the scope of '$x' -- when $x goes out of
+ ### scope, 'foo' previous value will be restored
+ { $obj->foo( 2 => \my $x );
+ print $obj->foo, ' ', $x; # will print '2 2'
+ }
+ print $obj->foo; # will print 1
+
+
+Note that all accessors are read/write for everyone. See the C<TODO>
+section for details.
+
+=cut
+
+sub mk_accessors {
+ my $self = $_[0];
+ my $is_hash = UNIVERSAL::isa( $_[1], 'HASH' );
+
+ ### first argument is a hashref, which means key/val pairs
+ ### as keys + allow handlers
+ for my $acc ( $is_hash ? keys %{$_[1]} : @_[1..$#_] ) {
+
+ ### already created apparently
+ if( exists $self->{$acc} ) {
+ __PACKAGE__->___debug( "Accessor '$acc' already exists");
+ next;
+ }
+
+ __PACKAGE__->___debug( "Creating accessor '$acc'");
+
+ ### explicitly vivify it, so that exists works in ls_accessors()
+ $self->{$acc}->[VALUE] = undef;
+
+ ### set the allow handler only if one was specified
+ $self->{$acc}->[ALLOW] = $_[1]->{$acc} if $is_hash;
+ }
+
+ return 1;
+}
+
+=head2 @list = $self->ls_accessors;
+
+Returns a list of accessors that are supported by the current object.
+The corresponding coderefs can be retrieved by passing this list one
+by one to the C<can> method.
+
+=cut
+
+sub ls_accessors {
+ ### metainformation is stored in the stringified
+ ### key of the object, so skip that when listing accessors
+ return sort grep { $_ ne "$_[0]" } keys %{$_[0]};
+}
+
+=head2 $ref = $self->ls_allow(KEY)
+
+Returns the allow handler for the given key, which can be used with
+C<Params::Check>'s C<allow()> handler. If there was no allow handler
+specified, an allow handler that always returns true will be returned.
+
+=cut
+
+sub ls_allow {
+ my $self = shift;
+ my $key = shift or return;
+ return exists $self->{$key}->[ALLOW]
+ ? $self->{$key}->[ALLOW]
+ : sub { 1 };
+}
+
+=head2 $bool = $self->mk_aliases( alias => method, [alias2 => method2, ...] );
+
+Creates an alias for a given method name. For all intents and purposes,
+these two accessors are now identical for this object. This is akin to
+doing the following on the symbol table level:
+
+ *alias = *method
+
+This allows you to do the following:
+
+ $self->mk_accessors('foo');
+ $self->mk_aliases( bar => 'foo' );
+
+ $self->bar( 42 );
+ print $self->foo; # will print 42
+
+=cut
+
+sub mk_aliases {
+ my $self = shift;
+ my %aliases = @_;
+
+ while( my($alias, $method) = each %aliases ) {
+
+ ### already created apparently
+ if( exists $self->{$alias} ) {
+ __PACKAGE__->___debug( "Accessor '$alias' already exists");
+ next;
+ }
+
+ $self->___alias( $alias => $method );
+ }
+
+ return 1;
+}
+
+=head2 $clone = $self->mk_clone;
+
+Makes a clone of the current object, which will have the exact same
+accessors as the current object, but without the data stored in them.
+
+=cut
+
+### XXX this creates an object WITH allow handlers at all times.
+### even if the original didnt
+sub mk_clone {
+ my $self = $_[0];
+ my $class = ref $self;
+
+ my $clone = $class->new;
+
+ ### split out accessors with and without allow handlers, so we
+ ### don't install dummy allow handers (which makes O::A::lvalue
+ ### warn for example)
+ my %hash; my @list;
+ for my $acc ( $self->ls_accessors ) {
+ my $allow = $self->{$acc}->[ALLOW];
+ $allow ? $hash{$acc} = $allow : push @list, $acc;
+
+ ### is this an alias?
+ if( my $org = $self->{ $acc }->[ ALIAS ] ) {
+ $clone->___alias( $acc => $org );
+ }
+ }
+
+ ### copy the accessors from $self to $clone
+ $clone->mk_accessors( \%hash ) if %hash;
+ $clone->mk_accessors( @list ) if @list;
+
+ ### copy callbacks
+ #$clone->{"$clone"} = $self->{"$self"} if $self->{"$self"};
+ $clone->___callback( $self->___callback );
+
+ return $clone;
+}
+
+=head2 $bool = $self->mk_flush;
+
+Flushes all the data from the current object; all accessors will be
+set back to their default state of C<undef>.
+
+Returns true on success and false on failure.
+
+=cut
+
+sub mk_flush {
+ my $self = $_[0];
+
+ # set each accessor's data to undef
+ $self->{$_}->[VALUE] = undef for $self->ls_accessors;
+
+ return 1;
+}
+
+=head2 $bool = $self->mk_verify;
+
+Checks if all values in the current object are in accordance with their
+own allow handler. Specifically useful to check if an empty initialised
+object has been filled with values satisfying their own allow criteria.
+
+=cut
+
+sub mk_verify {
+ my $self = $_[0];
+
+ my $fail;
+ for my $name ( $self->ls_accessors ) {
+ unless( allow( $self->$name, $self->ls_allow( $name ) ) ) {
+ my $val = defined $self->$name ? $self->$name : '<undef>';
+
+ __PACKAGE__->___error("'$name' ($val) is invalid");
+ $fail++;
+ }
+ }
+
+ return if $fail;
+ return 1;
+}
+
+=head2 $bool = $self->register_callback( sub { ... } );
+
+This method allows you to register a callback, that is invoked
+every time an accessor is called. This allows you to munge input
+data, access external data stores, etc.
+
+You are free to return whatever you wish. On a C<set> call, the
+data is even stored in the object.
+
+Below is an example of the use of a callback.
+
+ $object->some_method( "some_value" );
+
+ my $callback = sub {
+ my $self = shift; # the object
+ my $meth = shift; # "some_method"
+ my $val = shift; # ["some_value"]
+ # could be undef -- check 'exists';
+ # if scalar @$val is empty, it was a 'get'
+
+ # your code here
+
+ return $new_val; # the value you want to be set/returned
+ }
+
+To access the values stored in the object, circumventing the
+callback structure, you should use the C<___get> and C<___set> methods
+documented further down.
+
+=cut
+
+sub register_callback {
+ my $self = shift;
+ my $sub = shift or return;
+
+ ### use the memory address as key, it's not used EVER as an
+ ### accessor --kane
+ $self->___callback( $sub );
+
+ return 1;
+}
+
+
+=head2 $bool = $self->can( METHOD_NAME )
+
+This method overrides C<UNIVERAL::can> in order to provide coderefs to
+accessors which are loaded on demand. It will behave just like
+C<UNIVERSAL::can> where it can -- returning a class method if it exists,
+or a closure pointing to a valid accessor of this particular object.
+
+You can use it as follows:
+
+ $sub = $object->can('some_accessor'); # retrieve the coderef
+ $sub->('foo'); # 'some_accessor' now set
+ # to 'foo' for $object
+ $foo = $sub->(); # retrieve the contents
+ # of 'some_accessor'
+
+See the C<SYNOPSIS> for more examples.
+
+=cut
+
+### custom 'can' as UNIVERSAL::can ignores autoload
+sub can {
+ my($self, $method) = @_;
+
+ ### it's one of our regular methods
+ if( $self->UNIVERSAL::can($method) ) {
+ __PACKAGE__->___debug( "Can '$method' -- provided by package" );
+ return $self->UNIVERSAL::can($method);
+ }
+
+ ### it's an accessor we provide;
+ if( UNIVERSAL::isa( $self, 'HASH' ) and exists $self->{$method} ) {
+ __PACKAGE__->___debug( "Can '$method' -- provided by object" );
+ return sub { $self->$method(@_); }
+ }
+
+ ### we don't support it
+ __PACKAGE__->___debug( "Cannot '$method'" );
+ return;
+}
+
+### don't autoload this
+sub DESTROY { 1 };
+
+### use autoload so we can have per-object accessors,
+### not per class, as that is incorrect
+sub AUTOLOAD {
+ my $self = shift;
+ my($method) = ($AUTOLOAD =~ /([^:']+$)/);
+
+ my $val = $self->___autoload( $method, @_ ) or return;
+
+ return $val->[0];
+}
+
+sub ___autoload {
+ my $self = shift;
+ my $method = shift;
+ my $assign = scalar @_; # is this an assignment?
+
+ ### a method on our object
+ if( UNIVERSAL::isa( $self, 'HASH' ) ) {
+ if ( not exists $self->{$method} ) {
+ __PACKAGE__->___error("No such accessor '$method'", 1);
+ return;
+ }
+
+ ### a method on something else, die with a descriptive error;
+ } else {
+ local $FATAL = 1;
+ __PACKAGE__->___error(
+ "You called '$AUTOLOAD' on '$self' which was interpreted by ".
+ __PACKAGE__ . " as an object call. Did you mean to include ".
+ "'$method' from somewhere else?", 1 );
+ }
+
+ ### is this is an alias, redispatch to the original method
+ if( my $original = $self->{ $method }->[ALIAS] ) {
+ return $self->___autoload( $original, @_ );
+ }
+
+ ### assign?
+ my $val = $assign ? shift(@_) : $self->___get( $method );
+
+ if( $assign ) {
+
+ ### any binding?
+ if( $_[0] ) {
+ if( ref $_[0] and UNIVERSAL::isa( $_[0], 'SCALAR' ) ) {
+
+ ### tie the reference, so we get an object and
+ ### we can use it's going out of scope to restore
+ ### the old value
+ my $cur = $self->{$method}->[VALUE];
+
+ tie ${$_[0]}, __PACKAGE__ . '::TIE',
+ sub { $self->$method( $cur ) };
+
+ ${$_[0]} = $val;
+
+ } else {
+ __PACKAGE__->___error(
+ "Can not bind '$method' to anything but a SCALAR", 1
+ );
+ }
+ }
+
+ ### need to check the value?
+ if( exists $self->{$method}->[ALLOW] ) {
+
+ ### double assignment due to 'used only once' warnings
+ local $Params::Check::VERBOSE = 0;
+ local $Params::Check::VERBOSE = 0;
+
+ allow( $val, $self->{$method}->[ALLOW] ) or (
+ __PACKAGE__->___error(
+ "'$val' is an invalid value for '$method'", 1),
+ return
+ );
+ }
+ }
+
+ ### callbacks?
+ if( my $sub = $self->___callback ) {
+ $val = eval { $sub->( $self, $method, ($assign ? [$val] : []) ) };
+
+ ### register the error
+ $self->___error( $@, 1 ), return if $@;
+ }
+
+ ### now we can actually assign it
+ if( $assign ) {
+ $self->___set( $method, $val ) or return;
+ }
+
+ return [$val];
+}
+
+=head2 $val = $self->___get( METHOD_NAME );
+
+Method to directly access the value of the given accessor in the
+object. It circumvents all calls to allow checks, callbakcs, etc.
+
+Use only if you C<Know What You Are Doing>! General usage for
+this functionality would be in your own custom callbacks.
+
+=cut
+
+### XXX O::A::lvalue is mirroring this behaviour! if this
+### changes, lvalue's autoload must be changed as well
+sub ___get {
+ my $self = shift;
+ my $method = shift or return;
+ return $self->{$method}->[VALUE];
+}
+
+=head2 $bool = $self->___set( METHOD_NAME => VALUE );
+
+Method to directly set the value of the given accessor in the
+object. It circumvents all calls to allow checks, callbakcs, etc.
+
+Use only if you C<Know What You Are Doing>! General usage for
+this functionality would be in your own custom callbacks.
+
+=cut
+
+sub ___set {
+ my $self = shift;
+ my $method = shift or return;
+
+ ### you didn't give us a value to set!
+ exists $_[0] or return;
+ my $val = shift;
+
+ ### if there's more arguments than $self, then
+ ### replace the method called by the accessor.
+ ### XXX implement rw vs ro accessors!
+ $self->{$method}->[VALUE] = $val;
+
+ return 1;
+}
+
+=head2 $bool = $self->___alias( ALIAS => METHOD );
+
+Method to directly alias one accessor to another for
+this object. It circumvents all sanity checks, etc.
+
+Use only if you C<Know What You Are Doing>!
+
+=cut
+
+sub ___alias {
+ my $self = shift;
+ my $alias = shift or return;
+ my $method = shift or return;
+
+ $self->{ $alias }->[ALIAS] = $method;
+
+ return 1;
+}
+
+sub ___debug {
+ return unless $DEBUG;
+
+ my $self = shift;
+ my $msg = shift;
+ my $lvl = shift || 0;
+
+ local $Carp::CarpLevel += 1;
+
+ carp($msg);
+}
+
+sub ___error {
+ my $self = shift;
+ my $msg = shift;
+ my $lvl = shift || 0;
+ local $Carp::CarpLevel += ($lvl + 1);
+ $FATAL ? croak($msg) : carp($msg);
+}
+
+### objects might be overloaded.. if so, we can't trust what "$self"
+### will return, which might get *really* painful.. so check for that
+### and get their unoverloaded stringval if needed.
+sub ___callback {
+ my $self = shift;
+ my $sub = shift;
+
+ my $mem = overload::Overloaded( $self )
+ ? overload::StrVal( $self )
+ : "$self";
+
+ $self->{$mem} = $sub if $sub;
+
+ return $self->{$mem};
+}
+
+=head1 LVALUE ACCESSORS
+
+C<Object::Accessor> supports C<lvalue> attributes as well. To enable
+these, you should create your objects in the designated namespace,
+C<Object::Accessor::Lvalue>. For example:
+
+ my $obj = Object::Accessor::Lvalue->new('foo');
+ $obj->foo += 1;
+ print $obj->foo;
+
+will actually print C<1> and work as expected. Since this is an
+optional feature, that's not desirable in all cases, we require
+you to explicitly use the C<Object::Accessor::Lvalue> class.
+
+Doing the same on the standard C<Object>>Accessor> class would
+generate the following code & errors:
+
+ my $obj = Object::Accessor->new('foo');
+ $obj->foo += 1;
+
+ Can't modify non-lvalue subroutine call
+
+Note that C<lvalue> support on C<AUTOLOAD> routines is a
+C<perl 5.8.x> feature. See perldoc L<perl58delta> for details.
+
+=head2 CAVEATS
+
+=over 4
+
+=item * Allow handlers
+
+Due to the nature of C<lvalue subs>, we never get access to the
+value you are assigning, so we can not check it againt your allow
+handler. Allow handlers are therefor unsupported under C<lvalue>
+conditions.
+
+See C<perldoc perlsub> for details.
+
+=item * Callbacks
+
+Due to the nature of C<lvalue subs>, we never get access to the
+value you are assigning, so we can not check provide this value
+to your callback. Furthermore, we can not distinguish between
+a C<get> and a C<set> call. Callbacks are therefor unsupported
+under C<lvalue> conditions.
+
+See C<perldoc perlsub> for details.
+
+
+=cut
+
+{ package Object::Accessor::Lvalue;
+ use base 'Object::Accessor';
+ use strict;
+ use vars qw[$AUTOLOAD];
+
+ ### constants needed to access values from the objects
+ *VALUE = *Object::Accessor::VALUE;
+ *ALLOW = *Object::Accessor::ALLOW;
+
+ ### largely copied from O::A::Autoload
+ sub AUTOLOAD : lvalue {
+ my $self = shift;
+ my($method) = ($AUTOLOAD =~ /([^:']+$)/);
+
+ $self->___autoload( $method, @_ ) or return;
+
+ ### *dont* add return to it, or it won't be stored
+ ### see perldoc perlsub on lvalue subs
+ ### XXX can't use $self->___get( ... ), as we MUST have
+ ### the container that's used for the lvalue assign as
+ ### the last statement... :(
+ $self->{$method}->[ VALUE() ];
+ }
+
+ sub mk_accessors {
+ my $self = shift;
+ my $is_hash = UNIVERSAL::isa( $_[0], 'HASH' );
+
+ $self->___error(
+ "Allow handlers are not supported for '". __PACKAGE__ ."' objects"
+ ) if $is_hash;
+
+ return $self->SUPER::mk_accessors( @_ );
+ }
+
+ sub register_callback {
+ my $self = shift;
+ $self->___error(
+ "Callbacks are not supported for '". __PACKAGE__ ."' objects"
+ );
+ return;
+ }
+}
+
+
+### standard tie class for bound attributes
+{ package Object::Accessor::TIE;
+ use Tie::Scalar;
+ use Data::Dumper;
+ use base 'Tie::StdScalar';
+
+ my %local = ();
+
+ sub TIESCALAR {
+ my $class = shift;
+ my $sub = shift;
+ my $ref = undef;
+ my $obj = bless \$ref, $class;
+
+ ### store the restore sub
+ $local{ $obj } = $sub;
+ return $obj;
+ }
+
+ sub DESTROY {
+ my $tied = shift;
+ my $sub = delete $local{ $tied };
+
+ ### run the restore sub to set the old value back
+ return $sub->();
+ }
+}
+
+=back
+
+=head1 GLOBAL VARIABLES
+
+=head2 $Object::Accessor::FATAL
+
+Set this variable to true to make all attempted access to non-existant
+accessors be fatal.
+This defaults to C<false>.
+
+=head2 $Object::Accessor::DEBUG
+
+Set this variable to enable debugging output.
+This defaults to C<false>.
+
+=head1 TODO
+
+=head2 Create read-only accessors
+
+Currently all accessors are read/write for everyone. Perhaps a future
+release should make it possible to have read-only accessors as well.
+
+=head1 CAVEATS
+
+If you use codereferences for your allow handlers, you will not be able
+to freeze the data structures using C<Storable>.
+
+Due to a bug in storable (until at least version 2.15), C<qr//> compiled
+regexes also don't de-serialize properly. Although this bug has been
+reported, you should be aware of this issue when serializing your objects.
+
+You can track the bug here:
+
+ http://rt.cpan.org/Ticket/Display.html?id=1827
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-object-accessor@rt.cpan.orgE<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/Dist.pm b/Master/tlpkg/tlperl.straw/lib/PAR/Dist.pm
new file mode 100755
index 00000000000..2c39a54804a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/Dist.pm
@@ -0,0 +1,1425 @@
+package PAR::Dist;
+use 5.006;
+use strict;
+require Exporter;
+use vars qw/$VERSION @ISA @EXPORT @EXPORT_OK $DEBUG/;
+
+$VERSION = '0.47'; # Change version in POD, too!
+@ISA = 'Exporter';
+@EXPORT = qw/
+ blib_to_par
+ install_par
+ uninstall_par
+ sign_par
+ verify_par
+ merge_par
+ remove_man
+ get_meta
+ generate_blib_stub
+/;
+
+@EXPORT_OK = qw/
+ parse_dist_name
+ contains_binaries
+/;
+
+$DEBUG = 0;
+
+use Carp qw/carp croak/;
+use File::Spec;
+
+=head1 NAME
+
+PAR::Dist - Create and manipulate PAR distributions
+
+=head1 VERSION
+
+This document describes version 0.47 of PAR::Dist, released November 29, 2009.
+
+=head1 SYNOPSIS
+
+As a shell command:
+
+ % perl -MPAR::Dist -eblib_to_par
+
+In programs:
+
+ use PAR::Dist;
+
+ my $dist = blib_to_par(); # make a PAR file using ./blib/
+ install_par($dist); # install it into the system
+ uninstall_par($dist); # uninstall it from the system
+ sign_par($dist); # sign it using Module::Signature
+ verify_par($dist); # verify it using Module::Signature
+
+ install_par("http://foo.com/DBI-1.37-MSWin32-5.8.0.par"); # works too
+ install_par("http://foo.com/DBI-1.37"); # auto-appends archname + perlver
+ install_par("cpan://SMUELLER/PAR-Packer-0.975"); # uses CPAN author directory
+
+=head1 DESCRIPTION
+
+This module creates and manipulates I<PAR distributions>. They are
+architecture-specific B<PAR> files, containing everything under F<blib/>
+of CPAN distributions after their C<make> or C<Build> stage, a
+F<META.yml> describing metadata of the original CPAN distribution,
+and a F<MANIFEST> detailing all files within it. Digitally signed PAR
+distributions will also contain a F<SIGNATURE> file.
+
+The naming convention for such distributions is:
+
+ $NAME-$VERSION-$ARCH-$PERL_VERSION.par
+
+For example, C<PAR-Dist-0.01-i386-freebsd-5.8.0.par> corresponds to the
+0.01 release of C<PAR-Dist> on CPAN, built for perl 5.8.0 running on
+C<i386-freebsd>.
+
+=head1 FUNCTIONS
+
+Several functions are exported by default. Unless otherwise noted,
+they can take either a hash of
+named arguments, a single argument (taken as C<$path> by C<blib_to_par>
+and C<$dist> by other functions), or no arguments (in which case
+the first PAR file in the current directory is used).
+
+Therefore, under a directory containing only a single F<test.par>, all
+invocations below are equivalent:
+
+ % perl -MPAR::Dist -e"install_par( dist => 'test.par' )"
+ % perl -MPAR::Dist -e"install_par( 'test.par' )"
+ % perl -MPAR::Dist -einstall_par;
+
+If C<$dist> resembles a URL, C<LWP::Simple::mirror> is called to mirror it
+locally under C<$ENV{PAR_TEMP}> (or C<$TEMP/par/> if unspecified), and the
+function will act on the fetched local file instead. If the URL begins
+with C<cpan://AUTHOR/>, it will be expanded automatically to the author's CPAN
+directory (e.g. C<http://www.cpan.org/modules/by-authors/id/A/AU/AUTHOR/>).
+
+If C<$dist> does not have a file extension beginning with a letter or
+underscore, a dash and C<$suffix> ($ARCH-$PERL_VERSION.par by default)
+will be appended to it.
+
+=head2 blib_to_par
+
+Takes key/value pairs as parameters or a single parameter indicating the
+path that contains the F<blib/> subdirectory.
+
+Builds a PAR distribution from the F<blib/> subdirectory under C<path>, or
+under the current directory if unspecified. If F<blib/> does not exist,
+it automatically runs F<Build>, F<make>, F<Build.PL> or F<Makefile.PL> to
+create it.
+
+Returns the filename of the generated PAR distribution.
+
+Valid parameters are:
+
+=over 2
+
+=item path
+
+Sets the path which contains the F<blib/> subdirectory from which the PAR
+distribution will be generated.
+
+=item name, version, suffix
+
+These attributes set the name, version and platform specific suffix
+of the distribution. Name and version can be automatically
+determined from the distributions F<META.yml> or F<Makefile.PL> files.
+
+The suffix is generated from your architecture name and your version of
+perl by default.
+
+=item dist
+
+The output filename for the PAR distribution.
+
+=item quiet
+
+Set to true to suppress as much output as possible.
+
+=back
+
+=cut
+
+sub blib_to_par {
+ @_ = (path => @_) if @_ == 1;
+
+ my %args = @_;
+ require Config;
+
+
+ # don't use 'my $foo ... if ...' it creates a static variable!
+ my $quiet = $args{quiet} || 0;
+ my $dist;
+ my $path = $args{path};
+ $dist = File::Spec->rel2abs($args{dist}) if $args{dist};
+ my $name = $args{name};
+ my $version = $args{version};
+ my $suffix = $args{suffix} || "$Config::Config{archname}-$Config::Config{version}.par";
+ my $cwd;
+
+ if (defined $path) {
+ require Cwd;
+ $cwd = Cwd::cwd();
+ chdir $path;
+ }
+
+ _build_blib() unless -d "blib";
+
+ my @files;
+ open MANIFEST, ">", File::Spec->catfile("blib", "MANIFEST") or die $!;
+ open META, ">", File::Spec->catfile("blib", "META.yml") or die $!;
+
+ require File::Find;
+ File::Find::find( sub {
+ next unless $File::Find::name;
+ (-r && !-d) and push ( @files, substr($File::Find::name, 5) );
+ } , 'blib' );
+
+ print MANIFEST join(
+ "\n",
+ ' <!-- accessible as jar:file:///NAME.par!/MANIFEST in compliant browsers -->',
+ (sort @files),
+ q( # <html><body onload="var X=document.body.innerHTML.split(/\n/);var Y='<iframe src=&quot;META.yml&quot; style=&quot;float:right;height:40%;width:40%&quot;></iframe><ul>';for(var x in X){if(!X[x].match(/^\s*#/)&&X[x].length)Y+='<li><a href=&quot;'+X[x]+'&quot;>'+X[x]+'</a>'}document.body.innerHTML=Y">)
+ );
+ close MANIFEST;
+
+ if (open(OLD_META, "META.yml")) {
+ while (<OLD_META>) {
+ if (/^distribution_type:/) {
+ print META "distribution_type: par\n";
+ }
+ else {
+ print META $_;
+ }
+
+ if (/^name:\s+(.*)/) {
+ $name ||= $1;
+ $name =~ s/::/-/g;
+ }
+ elsif (/^version:\s+.*Module::Build::Version/) {
+ while (<OLD_META>) {
+ /^\s+original:\s+(.*)/ or next;
+ $version ||= $1;
+ last;
+ }
+ }
+ elsif (/^version:\s+(.*)/) {
+ $version ||= $1;
+ }
+ }
+ close OLD_META;
+ close META;
+ }
+
+ if ((!$name or !$version) and open(MAKEFILE, "Makefile")) {
+ while (<MAKEFILE>) {
+ if (/^DISTNAME\s+=\s+(.*)$/) {
+ $name ||= $1;
+ }
+ elsif (/^VERSION\s+=\s+(.*)$/) {
+ $version ||= $1;
+ }
+ }
+ }
+
+ if (not defined($name) or not defined($version)) {
+ # could not determine name or version. Error.
+ my $what;
+ if (not defined $name) {
+ $what = 'name';
+ $what .= ' and version' if not defined $version;
+ }
+ elsif (not defined $version) {
+ $what = 'version';
+ }
+
+ carp("I was unable to determine the $what of the PAR distribution. Please create a Makefile or META.yml file from which we can infer the information or just specify the missing information as an option to blib_to_par.");
+ return();
+ }
+
+ $name =~ s/\s+$//;
+ $version =~ s/\s+$//;
+
+ my $file = "$name-$version-$suffix";
+ unlink $file if -f $file;
+
+ print META << "YAML" if fileno(META);
+name: $name
+version: $version
+build_requires: {}
+conflicts: {}
+dist_name: $file
+distribution_type: par
+dynamic_config: 0
+generated_by: 'PAR::Dist version $PAR::Dist::VERSION'
+license: unknown
+YAML
+ close META;
+
+ mkdir('blib', 0777);
+ chdir('blib');
+ require Cwd;
+ my $zipoutfile = File::Spec->catfile(File::Spec->updir, $file);
+ _zip(dist => $zipoutfile);
+ chdir(File::Spec->updir);
+
+ unlink File::Spec->catfile("blib", "MANIFEST");
+ unlink File::Spec->catfile("blib", "META.yml");
+
+ $dist ||= File::Spec->catfile($cwd, $file) if $cwd;
+
+ if ($dist and $file ne $dist) {
+ if ( File::Copy::copy($file, $dist) ) {
+ unlink $file;
+ } else {
+ die "Cannot copy $file: $!";
+ }
+
+ $file = $dist;
+ }
+
+ my $pathname = File::Spec->rel2abs($file);
+ if ($^O eq 'MSWin32') {
+ $pathname =~ s!\\!/!g;
+ $pathname =~ s!:!|!g;
+ };
+ print << "." if !$quiet;
+Successfully created binary distribution '$file'.
+Its contents are accessible in compliant browsers as:
+ jar:file://$pathname!/MANIFEST
+.
+
+ chdir $cwd if $cwd;
+ return $file;
+}
+
+sub _build_blib {
+ if (-e 'Build') {
+ _system_wrapper($^X, "Build");
+ }
+ elsif (-e 'Makefile') {
+ _system_wrapper($Config::Config{make});
+ }
+ elsif (-e 'Build.PL') {
+ _system_wrapper($^X, "Build.PL");
+ _system_wrapper($^X, "Build");
+ }
+ elsif (-e 'Makefile.PL') {
+ _system_wrapper($^X, "Makefile.PL");
+ _system_wrapper($Config::Config{make});
+ }
+}
+
+=head2 install_par
+
+Installs a PAR distribution into the system, using
+C<ExtUtils::Install::install_default>.
+
+If only a single parameter is given, it is treated as the value for the
+C<dist> parameter.
+
+Valid named parameters are:
+
+=over 2
+
+=item dist
+
+The .par file to install. The heuristics outlined in the B<FUNCTIONS>
+section above apply.
+
+=item prefix
+
+This string will be prepended to all installation paths.
+If it isn't specified, the environment variable
+C<PERL_INSTALL_ROOT> is used as a prefix.
+
+=item uninstall_shadows
+
+This corresponds to the C<uninstall_shadows> option of L<ExtUtils::Install>. Quoting its manual:
+If C<uninstall_shadows> is set to true, any differing versions throughout C<@INC>
+will be uninstalled. This is C<make install UNINST=1>.
+
+=item verbose
+
+This corresponds to the C<verbose> option of L<ExtUtils::Install>. According to its manual:
+If C<verbose> is true, will print out each file removed. This is C<make install VERBINST=1>.
+C<verbose> values going up to 5 show increasingly more diagnostics output.
+
+Default verbosity for PAR::Dist is 1.
+
+=back
+
+If you're just going to install into the running perl like everything else,
+you can stop reading the rest of this section now.
+
+Additionally, you can use several parameters to change the default
+installation destinations. You don't usually have to worry about this
+unless you are installing into a user-local directory.
+The following section outlines the parameter names and default settings:
+
+ Parameter From To
+ inst_lib blib/lib $Config{installsitelib} (*)
+ inst_archlib blib/arch $Config{installsitearch}
+ inst_script blib/script $Config{installscript}
+ inst_bin blib/bin $Config{installbin}
+ inst_man1dir blib/man1 $Config{installman1dir}
+ inst_man3dir blib/man3 $Config{installman3dir}
+ packlist_read $Config{sitearchexp}/auto/$name/.packlist
+ packlist_write $Config{installsitearch}/auto/$name/.packlist
+
+The C<packlist_write> parameter is used to control where the F<.packlist>
+file is written to. (Necessary for uninstallation.)
+The C<packlist_read> parameter specifies a .packlist file to merge in if
+it exists. By setting any of the above installation targets to C<undef>,
+you can remove that target altogether. For example, passing
+C<< inst_man1dir => undef, inst_man3dir => undef >> means that the contained
+manual pages won't be installed. This is not available for the packlists.
+
+Again, the defaults will be the normal I<site> paths from C<%Config>.
+
+(*) If the C<.par>'s I<inst_archlib> section (normally C<blib/arch>)
+isn't empty, the code in I<inst_lib> (normally C<blib/lib>) is also installed
+into the I<inst_archlib> path. This makes sense for XS modules.
+If, however, you override C<inst_lib>, this automatic conversion is
+also overridden! You can use the named parameter
+C<auto_inst_lib_conversion =E<gt> 1> to re-enable the conversion
+for custom I<inst_lib>'s.
+
+Finally, you may specify a C<custom_targets> parameter. Its value should be
+a reference to a hash of custom installation targets such as
+
+ custom_targets => { 'blib/my_data' => '/some/path/my_data' }
+
+You can use this to install the F<.par> archives contents to arbitrary
+locations.
+
+=cut
+
+sub install_par {
+ my %args = &_args;
+ _install_or_uninstall(%args, action => 'install');
+}
+
+=head2 uninstall_par
+
+Uninstalls all previously installed contents of a PAR distribution,
+using C<ExtUtils::Install::uninstall>.
+
+Takes almost the same parameters as C<install_par>, but naturally,
+the installation target parameters do not apply. The only exception
+to this is the C<packlist_read> parameter which specifies the
+F<.packlist> file to read the list of installed files from.
+It defaults to C<$Config::Config{installsitearch}/auto/$name/.packlist>.
+
+Additionally, the C<uninstall_shadows> parameter of C<install_par>
+isn't available.
+
+=cut
+
+sub uninstall_par {
+ my %args = &_args;
+ _install_or_uninstall(%args, action => 'uninstall');
+}
+
+sub _install_or_uninstall {
+ my %args = &_args;
+ my $name = $args{name};
+ my $action = $args{action};
+
+ my %ENV_copy = %ENV;
+ $ENV{PERL_INSTALL_ROOT} = $args{prefix} if defined $args{prefix};
+
+ require Cwd;
+ my $old_dir = Cwd::cwd();
+
+ my ($dist, $tmpdir) = _unzip_to_tmpdir( dist => $args{dist}, subdir => 'blib' );
+
+ if ( open (META, File::Spec->catfile('blib', 'META.yml')) ) {
+ while (<META>) {
+ next unless /^name:\s+(.*)/;
+ $name = $1;
+ $name =~ s/\s+$//;
+ last;
+ }
+ close META;
+ }
+ return if not defined $name or $name eq '';
+
+ if (-d 'script') {
+ require ExtUtils::MY;
+ foreach my $file (glob("script/*")) {
+ next unless -T $file;
+ ExtUtils::MY->fixin($file);
+ chmod(0555, $file);
+ }
+ }
+
+ $name =~ s{::|-}{/}g;
+ require ExtUtils::Install;
+
+ if ($action eq 'install') {
+ my $target = _installation_target( File::Spec->curdir, $name, \%args );
+ my $custom_targets = $args{custom_targets} || {};
+ $target->{$_} = $custom_targets->{$_} foreach keys %{$custom_targets};
+
+ my $uninstall_shadows = $args{uninstall_shadows};
+ my $verbose = $args{verbose};
+ ExtUtils::Install::install($target, $verbose, 0, $uninstall_shadows);
+ }
+ elsif ($action eq 'uninstall') {
+ require Config;
+ my $verbose = $args{verbose};
+ ExtUtils::Install::uninstall(
+ $args{packlist_read}||"$Config::Config{installsitearch}/auto/$name/.packlist",
+ $verbose
+ );
+ }
+
+ %ENV = %ENV_copy;
+
+ chdir($old_dir);
+ File::Path::rmtree([$tmpdir]);
+
+ return 1;
+}
+
+# Returns the default installation target as used by
+# ExtUtils::Install::install(). First parameter should be the base
+# directory containing the blib/ we're installing from.
+# Second parameter should be the name of the distribution for the packlist
+# paths. Third parameter may be a hash reference with user defined keys for
+# the target hash. In fact, any contents that do not start with 'inst_' are
+# skipped.
+sub _installation_target {
+ require Config;
+ my $dir = shift;
+ my $name = shift;
+ my $user = shift || {};
+
+ # accepted sources (and user overrides)
+ my %sources = (
+ inst_lib => File::Spec->catdir($dir,"blib","lib"),
+ inst_archlib => File::Spec->catdir($dir,"blib","arch"),
+ inst_bin => File::Spec->catdir($dir,'blib','bin'),
+ inst_script => File::Spec->catdir($dir,'blib','script'),
+ inst_man1dir => File::Spec->catdir($dir,'blib','man1'),
+ inst_man3dir => File::Spec->catdir($dir,'blib','man3'),
+ packlist_read => 'read',
+ packlist_write => 'write',
+ );
+
+
+ my $par_has_archlib = _directory_not_empty( $sources{inst_archlib} );
+
+ # default targets
+ my $target = {
+ read => $Config::Config{sitearchexp}."/auto/$name/.packlist",
+ write => $Config::Config{installsitearch}."/auto/$name/.packlist",
+ $sources{inst_lib} =>
+ ($par_has_archlib
+ ? $Config::Config{installsitearch}
+ : $Config::Config{installsitelib}),
+ $sources{inst_archlib} => $Config::Config{installsitearch},
+ $sources{inst_bin} => $Config::Config{installbin} ,
+ $sources{inst_script} => $Config::Config{installscript},
+ $sources{inst_man1dir} => $Config::Config{installman1dir},
+ $sources{inst_man3dir} => $Config::Config{installman3dir},
+ };
+
+ # Included for future support for ${flavour}perl external lib installation
+# if ($Config::Config{flavour_perl}) {
+# my $ext = File::Spec->catdir($dir, 'blib', 'ext');
+# # from => to
+# $sources{inst_external_lib} = File::Spec->catdir($ext, 'lib');
+# $sources{inst_external_bin} = File::Spec->catdir($ext, 'bin');
+# $sources{inst_external_include} = File::Spec->catdir($ext, 'include');
+# $sources{inst_external_src} = File::Spec->catdir($ext, 'src');
+# $target->{ $sources{inst_external_lib} } = $Config::Config{flavour_install_lib};
+# $target->{ $sources{inst_external_bin} } = $Config::Config{flavour_install_bin};
+# $target->{ $sources{inst_external_include} } = $Config::Config{flavour_install_include};
+# $target->{ $sources{inst_external_src} } = $Config::Config{flavour_install_src};
+# }
+
+ # insert user overrides
+ foreach my $key (keys %$user) {
+ my $value = $user->{$key};
+ if (not defined $value and $key ne 'packlist_read' and $key ne 'packlist_write') {
+ # undef means "remove"
+ delete $target->{ $sources{$key} };
+ }
+ elsif (exists $sources{$key}) {
+ # overwrite stuff, don't let the user create new entries
+ $target->{ $sources{$key} } = $value;
+ }
+ }
+
+ # apply the automatic inst_lib => inst_archlib conversion again
+ # if the user asks for it and there is an archlib in the .par
+ if ($user->{auto_inst_lib_conversion} and $par_has_archlib) {
+ $target->{inst_lib} = $target->{inst_archlib};
+ }
+
+ return $target;
+}
+
+sub _directory_not_empty {
+ require File::Find;
+ my($dir) = @_;
+ my $files = 0;
+ File::Find::find(sub {
+ return if $_ eq ".exists";
+ if (-f) {
+ $File::Find::prune++;
+ $files = 1;
+ }
+ }, $dir);
+ return $files;
+}
+
+=head2 sign_par
+
+Digitally sign a PAR distribution using C<gpg> or B<Crypt::OpenPGP>,
+via B<Module::Signature>.
+
+=cut
+
+sub sign_par {
+ my %args = &_args;
+ _verify_or_sign(%args, action => 'sign');
+}
+
+=head2 verify_par
+
+Verify the digital signature of a PAR distribution using C<gpg> or
+B<Crypt::OpenPGP>, via B<Module::Signature>.
+
+Returns a boolean value indicating whether verification passed; C<$!>
+is set to the return code of C<Module::Signature::verify>.
+
+=cut
+
+sub verify_par {
+ my %args = &_args;
+ $! = _verify_or_sign(%args, action => 'verify');
+ return ( $! == Module::Signature::SIGNATURE_OK() );
+}
+
+=head2 merge_par
+
+I<Note:> Since version 0.32 of PAR::Dist, this function requires a YAML
+reader. The order of precedence is:
+
+ YAML YAML::Syck YAML::Tiny YAML::XS
+
+Merges two or more PAR distributions into one. First argument must
+be the name of the distribution you want to merge all others into.
+Any following arguments will be interpreted as the file names of
+further PAR distributions to merge into the first one.
+
+ merge_par('foo.par', 'bar.par', 'baz.par')
+
+This will merge the distributions C<foo.par>, C<bar.par> and C<baz.par>
+into the distribution C<foo.par>. C<foo.par> will be overwritten!
+
+The original META.yml of C<foo.par> is retained, but augmented with any
+C<provides>, C<requires>, C<recommends>, C<build_requires>, and
+C<configure_requires> sections from the other C<.par> files.
+
+=cut
+
+sub merge_par {
+ my $base_par = shift;
+ my @additional_pars = @_;
+ require Cwd;
+ require File::Copy;
+ require File::Path;
+ require File::Find;
+
+ # parameter checking
+ if (not defined $base_par) {
+ croak "First argument to merge_par() must be the .par archive to modify.";
+ }
+
+ if (not -f $base_par or not -r _ or not -w _) {
+ croak "'$base_par' is not a file or you do not have enough permissions to read and modify it.";
+ }
+
+ foreach (@additional_pars) {
+ if (not -f $_ or not -r _) {
+ croak "'$_' is not a file or you do not have enough permissions to read it.";
+ }
+ }
+
+ # The unzipping will change directories. Remember old dir.
+ my $old_cwd = Cwd::cwd();
+
+ # Unzip the base par to a temp. dir.
+ (undef, my $base_dir) = _unzip_to_tmpdir(
+ dist => $base_par, subdir => 'blib'
+ );
+ my $blibdir = File::Spec->catdir($base_dir, 'blib');
+
+ # move the META.yml to the (main) temp. dir.
+ my $main_meta_file = File::Spec->catfile($base_dir, 'META.yml');
+ File::Copy::move(
+ File::Spec->catfile($blibdir, 'META.yml'),
+ $main_meta_file
+ );
+ # delete (incorrect) MANIFEST
+ unlink File::Spec->catfile($blibdir, 'MANIFEST');
+
+ # extract additional pars and merge
+ foreach my $par (@additional_pars) {
+ # restore original directory because the par path
+ # might have been relative!
+ chdir($old_cwd);
+ (undef, my $add_dir) = _unzip_to_tmpdir(
+ dist => $par
+ );
+
+ # merge the meta (at least the provides info) into the main meta.yml
+ my $meta_file = File::Spec->catfile($add_dir, 'META.yml');
+ if (-f $meta_file) {
+ _merge_meta($main_meta_file, $meta_file);
+ }
+
+ my @files;
+ my @dirs;
+ # I hate File::Find
+ # And I hate writing portable code, too.
+ File::Find::find(
+ {wanted =>sub {
+ my $file = $File::Find::name;
+ push @files, $file if -f $file;
+ push @dirs, $file if -d _;
+ }},
+ $add_dir
+ );
+ my ($vol, $subdir, undef) = File::Spec->splitpath( $add_dir, 1);
+ my @dir = File::Spec->splitdir( $subdir );
+
+ # merge directory structure
+ foreach my $dir (@dirs) {
+ my ($v, $d, undef) = File::Spec->splitpath( $dir, 1 );
+ my @d = File::Spec->splitdir( $d );
+ shift @d foreach @dir; # remove tmp dir from path
+ my $target = File::Spec->catdir( $blibdir, @d );
+ mkdir($target);
+ }
+
+ # merge files
+ foreach my $file (@files) {
+ my ($v, $d, $f) = File::Spec->splitpath( $file );
+ my @d = File::Spec->splitdir( $d );
+ shift @d foreach @dir; # remove tmp dir from path
+ my $target = File::Spec->catfile(
+ File::Spec->catdir( $blibdir, @d ),
+ $f
+ );
+ File::Copy::copy($file, $target)
+ or die "Could not copy '$file' to '$target': $!";
+
+ }
+ chdir($old_cwd);
+ File::Path::rmtree([$add_dir]);
+ }
+
+ # delete (copied) MANIFEST and META.yml
+ unlink File::Spec->catfile($blibdir, 'MANIFEST');
+ unlink File::Spec->catfile($blibdir, 'META.yml');
+
+ chdir($base_dir);
+ my $resulting_par_file = Cwd::abs_path(blib_to_par(quiet => 1));
+ chdir($old_cwd);
+ File::Copy::move($resulting_par_file, $base_par);
+
+ File::Path::rmtree([$base_dir]);
+}
+
+
+sub _merge_meta {
+ my $meta_orig_file = shift;
+ my $meta_extra_file = shift;
+ return() if not defined $meta_orig_file or not -f $meta_orig_file;
+ return 1 if not defined $meta_extra_file or not -f $meta_extra_file;
+
+ my $yaml_functions = _get_yaml_functions();
+
+ die "Cannot merge META.yml files without a YAML reader/writer"
+ if !exists $yaml_functions->{LoadFile}
+ or !exists $yaml_functions->{DumpFile};
+
+ my $orig_meta = $yaml_functions->{LoadFile}->($meta_orig_file);
+ my $extra_meta = $yaml_functions->{LoadFile}->($meta_extra_file);
+
+ # I seem to remember there was this incompatibility between the different
+ # YAML implementations with regards to "document" handling:
+ my $orig_tree = (ref($orig_meta) eq 'ARRAY' ? $orig_meta->[0] : $orig_meta);
+ my $extra_tree = (ref($extra_meta) eq 'ARRAY' ? $extra_meta->[0] : $extra_meta);
+
+ _merge_provides($orig_tree, $extra_tree);
+ _merge_requires($orig_tree, $extra_tree);
+
+ $yaml_functions->{DumpFile}->($meta_orig_file, $orig_meta);
+
+ return 1;
+}
+
+# merge the two-level provides sections of META.yml
+sub _merge_provides {
+ my $orig_hash = shift;
+ my $extra_hash = shift;
+
+ return() if not exists $extra_hash->{provides};
+ $orig_hash->{provides} ||= {};
+
+ my $orig_provides = $orig_hash->{provides};
+ my $extra_provides = $extra_hash->{provides};
+
+ # two level clone is enough wrt META spec 1.4
+ # overwrite the original provides since we're also overwriting the files.
+ foreach my $module (keys %$extra_provides) {
+ my $extra_mod_hash = $extra_provides->{$module};
+ my %mod_hash;
+ $mod_hash{$_} = $extra_mod_hash->{$_} for keys %$extra_mod_hash;
+ $orig_provides->{$module} = \%mod_hash;
+ }
+}
+
+# merge the single-level requires-like sections of META.yml
+sub _merge_requires {
+ my $orig_hash = shift;
+ my $extra_hash = shift;
+
+ foreach my $type (qw(requires build_requires configure_requires recommends)) {
+ next if not exists $extra_hash->{$type};
+ $orig_hash->{$type} ||= {};
+
+ # one level clone is enough wrt META spec 1.4
+ foreach my $module (keys %{ $extra_hash->{$type} }) {
+ # FIXME there should be a version comparison here, BUT how are we going to do that without a guaranteed version.pm?
+ $orig_hash->{$type}{$module} = $extra_hash->{$type}{$module}; # assign version and module name
+ }
+ }
+}
+
+=head2 remove_man
+
+Remove the man pages from a PAR distribution. Takes one named
+parameter: I<dist> which should be the name (and path) of the
+PAR distribution file. The calling conventions outlined in
+the C<FUNCTIONS> section above apply.
+
+The PAR archive will be
+extracted, stripped of all C<man\d?> and C<html> subdirectories
+and then repackaged into the original file.
+
+=cut
+
+sub remove_man {
+ my %args = &_args;
+ my $par = $args{dist};
+ require Cwd;
+ require File::Copy;
+ require File::Path;
+ require File::Find;
+
+ # parameter checking
+ if (not defined $par) {
+ croak "First argument to remove_man() must be the .par archive to modify.";
+ }
+
+ if (not -f $par or not -r _ or not -w _) {
+ croak "'$par' is not a file or you do not have enough permissions to read and modify it.";
+ }
+
+ # The unzipping will change directories. Remember old dir.
+ my $old_cwd = Cwd::cwd();
+
+ # Unzip the base par to a temp. dir.
+ (undef, my $base_dir) = _unzip_to_tmpdir(
+ dist => $par, subdir => 'blib'
+ );
+ my $blibdir = File::Spec->catdir($base_dir, 'blib');
+
+ # move the META.yml to the (main) temp. dir.
+ File::Copy::move(
+ File::Spec->catfile($blibdir, 'META.yml'),
+ File::Spec->catfile($base_dir, 'META.yml')
+ );
+ # delete (incorrect) MANIFEST
+ unlink File::Spec->catfile($blibdir, 'MANIFEST');
+
+ opendir DIRECTORY, 'blib' or die $!;
+ my @dirs = grep { /^blib\/(?:man\d*|html)$/ }
+ grep { -d $_ }
+ map { File::Spec->catfile('blib', $_) }
+ readdir DIRECTORY;
+ close DIRECTORY;
+
+ File::Path::rmtree(\@dirs);
+
+ chdir($base_dir);
+ my $resulting_par_file = Cwd::abs_path(blib_to_par());
+ chdir($old_cwd);
+ File::Copy::move($resulting_par_file, $par);
+
+ File::Path::rmtree([$base_dir]);
+}
+
+
+=head2 get_meta
+
+Opens a PAR archive and extracts the contained META.yml file.
+Returns the META.yml file as a string.
+
+Takes one named parameter: I<dist>. If only one parameter is
+passed, it is treated as the I<dist> parameter. (Have a look
+at the description in the C<FUNCTIONS> section above.)
+
+Returns undef if no PAR archive or no META.yml within the
+archive were found.
+
+=cut
+
+sub get_meta {
+ my %args = &_args;
+ my $dist = $args{dist};
+ return undef if not defined $dist or not -r $dist;
+ require Cwd;
+ require File::Path;
+
+ # The unzipping will change directories. Remember old dir.
+ my $old_cwd = Cwd::cwd();
+
+ # Unzip the base par to a temp. dir.
+ (undef, my $base_dir) = _unzip_to_tmpdir(
+ dist => $dist, subdir => 'blib'
+ );
+ my $blibdir = File::Spec->catdir($base_dir, 'blib');
+
+ my $meta = File::Spec->catfile($blibdir, 'META.yml');
+
+ if (not -r $meta) {
+ return undef;
+ }
+
+ open FH, '<', $meta
+ or die "Could not open file '$meta' for reading: $!";
+
+ local $/ = undef;
+ my $meta_text = <FH>;
+ close FH;
+
+ chdir($old_cwd);
+
+ File::Path::rmtree([$base_dir]);
+
+ return $meta_text;
+}
+
+
+
+sub _unzip {
+ my %args = &_args;
+ my $dist = $args{dist};
+ my $path = $args{path} || File::Spec->curdir;
+ return unless -f $dist;
+
+ # Try fast unzipping first
+ if (eval { require Archive::Unzip::Burst; 1 }) {
+ my $return = !Archive::Unzip::Burst::unzip($dist, $path);
+ return if $return; # true return value == error (a la system call)
+ }
+ # Then slow unzipping
+ if (eval { require Archive::Zip; 1 }) {
+ my $zip = Archive::Zip->new;
+ local %SIG;
+ $SIG{__WARN__} = sub { print STDERR $_[0] unless $_[0] =~ /\bstat\b/ };
+ return unless $zip->read($dist) == Archive::Zip::AZ_OK()
+ and $zip->extractTree('', "$path/") == Archive::Zip::AZ_OK();
+ }
+ # Then fall back to the system
+ else {
+ undef $!;
+ if (_system_wrapper(unzip => $dist, '-d', $path)) {
+ die "Failed to unzip '$dist' to path '$path': Could neither load "
+ . "Archive::Zip nor (successfully) run the system 'unzip' (unzip said: $!)";
+ }
+ }
+
+ return 1;
+}
+
+sub _zip {
+ my %args = &_args;
+ my $dist = $args{dist};
+
+ if (eval { require Archive::Zip; 1 }) {
+ my $zip = Archive::Zip->new;
+ $zip->addTree( File::Spec->curdir, '' );
+ $zip->writeToFileNamed( $dist ) == Archive::Zip::AZ_OK() or die $!;
+ }
+ else {
+ undef $!;
+ if (_system_wrapper(qw(zip -r), $dist, File::Spec->curdir)) {
+ die "Failed to zip '" .File::Spec->curdir(). "' to '$dist': Could neither load "
+ . "Archive::Zip nor (successfully) run the system 'zip' (zip said: $!)";
+ }
+ }
+ return 1;
+}
+
+
+# This sub munges the arguments to most of the PAR::Dist functions
+# into a hash. On the way, it downloads PAR archives as necessary, etc.
+sub _args {
+ # default to the first .par in the CWD
+ if (not @_) {
+ @_ = (glob('*.par'))[0];
+ }
+
+ # single argument => it's a distribution file name or URL
+ @_ = (dist => @_) if @_ == 1;
+
+ my %args = @_;
+ $args{name} ||= $args{dist};
+
+ # If we are installing from an URL, we want to munge the
+ # distribution name so that it is in form "Module-Name"
+ if (defined $args{name}) {
+ $args{name} =~ s/^\w+:\/\///;
+ my @elems = parse_dist_name($args{name});
+ # @elems is name, version, arch, perlversion
+ if (defined $elems[0]) {
+ $args{name} = $elems[0];
+ }
+ else {
+ $args{name} =~ s/^.*\/([^\/]+)$/$1/;
+ $args{name} =~ s/^([0-9A-Za-z_-]+)-\d+\..+$/$1/;
+ }
+ }
+
+ # append suffix if there is none
+ if ($args{dist} and not $args{dist} =~ /\.[a-zA-Z_][^.]*$/) {
+ require Config;
+ my $suffix = $args{suffix};
+ $suffix ||= "$Config::Config{archname}-$Config::Config{version}.par";
+ $args{dist} .= "-$suffix";
+ }
+
+ # download if it's an URL
+ if ($args{dist} and $args{dist} =~ m!^\w+://!) {
+ $args{dist} = _fetch(dist => $args{dist})
+ }
+
+ return %args;
+}
+
+
+# Download PAR archive, but only if necessary (mirror!)
+my %escapes;
+sub _fetch {
+ my %args = @_;
+
+ if ($args{dist} =~ s/^file:\/\///) {
+ return $args{dist} if -e $args{dist};
+ return;
+ }
+ require LWP::Simple;
+
+ $ENV{PAR_TEMP} ||= File::Spec->catdir(File::Spec->tmpdir, 'par');
+ mkdir $ENV{PAR_TEMP}, 0777;
+ %escapes = map { chr($_) => sprintf("%%%02X", $_) } 0..255 unless %escapes;
+
+ $args{dist} =~ s{^cpan://((([a-zA-Z])[a-zA-Z])[-_a-zA-Z]+)/}
+ {http://www.cpan.org/modules/by-authors/id/\U$3/$2/$1\E/};
+
+ my $file = $args{dist};
+ $file =~ s/([^\w\.])/$escapes{$1}/g;
+ $file = File::Spec->catfile( $ENV{PAR_TEMP}, $file);
+ my $rc = LWP::Simple::mirror( $args{dist}, $file );
+
+ if (!LWP::Simple::is_success($rc) and $rc != 304) {
+ die "Error $rc: ", LWP::Simple::status_message($rc), " ($args{dist})\n";
+ }
+
+ return $file if -e $file;
+ return;
+}
+
+sub _verify_or_sign {
+ my %args = &_args;
+
+ require File::Path;
+ require Module::Signature;
+ die "Module::Signature version 0.25 required"
+ unless Module::Signature->VERSION >= 0.25;
+
+ require Cwd;
+ my $cwd = Cwd::cwd();
+ my $action = $args{action};
+ my ($dist, $tmpdir) = _unzip_to_tmpdir($args{dist});
+ $action ||= (-e 'SIGNATURE' ? 'verify' : 'sign');
+
+ if ($action eq 'sign') {
+ open FH, '>SIGNATURE' unless -e 'SIGNATURE';
+ open FH, 'MANIFEST' or die $!;
+
+ local $/;
+ my $out = <FH>;
+ if ($out !~ /^SIGNATURE(?:\s|$)/m) {
+ $out =~ s/^(?!\s)/SIGNATURE\n/m;
+ open FH, '>MANIFEST' or die $!;
+ print FH $out;
+ }
+ close FH;
+
+ $args{overwrite} = 1 unless exists $args{overwrite};
+ $args{skip} = 0 unless exists $args{skip};
+ }
+
+ my $rv = Module::Signature->can($action)->(%args);
+ _zip(dist => $dist) if $action eq 'sign';
+ File::Path::rmtree([$tmpdir]);
+
+ chdir($cwd);
+ return $rv;
+}
+
+sub _unzip_to_tmpdir {
+ my %args = &_args;
+
+ require File::Temp;
+
+ my $dist = File::Spec->rel2abs($args{dist});
+ my $tmpdirname = File::Spec->catdir(File::Spec->tmpdir, "parXXXXX");
+ my $tmpdir = File::Temp::mkdtemp($tmpdirname)
+ or die "Could not create temporary directory from template '$tmpdirname': $!";
+ my $path = $tmpdir;
+ $path = File::Spec->catdir($tmpdir, $args{subdir}) if defined $args{subdir};
+ _unzip(dist => $dist, path => $path);
+
+ chdir $tmpdir;
+ return ($dist, $tmpdir);
+}
+
+
+
+=head2 parse_dist_name
+
+First argument must be a distribution file name. The file name
+is parsed into I<distribution name>, I<distribution version>,
+I<architecture name>, and I<perl version>.
+
+Returns the results as a list in the above order.
+If any or all of the above cannot be determined, returns undef instead
+of the undetermined elements.
+
+Supported formats are:
+
+Math-Symbolic-0.502-x86_64-linux-gnu-thread-multi-5.8.7
+
+Math-Symbolic-0.502
+
+The ".tar.gz" or ".par" extensions as well as any
+preceding paths are stripped before parsing. Starting with C<PAR::Dist>
+0.22, versions containing a preceding C<v> are parsed correctly.
+
+This function is not exported by default.
+
+=cut
+
+sub parse_dist_name {
+ my $file = shift;
+ return(undef, undef, undef, undef) if not defined $file;
+
+ (undef, undef, $file) = File::Spec->splitpath($file);
+
+ my $version = qr/v?(?:\d+(?:_\d+)?|\d*(?:\.\d+(?:_\d+)?)+)/;
+ $file =~ s/\.(?:par|tar\.gz|tar)$//i;
+ my @elem = split /-/, $file;
+ my (@dn, $dv, @arch, $pv);
+ while (@elem) {
+ my $e = shift @elem;
+ if (
+ $e =~ /^$version$/o
+ and not(# if not next token also a version
+ # (assumes an arch string doesnt start with a version...)
+ @elem and $elem[0] =~ /^$version$/o
+ )
+ ) {
+
+ $dv = $e;
+ last;
+ }
+ push @dn, $e;
+ }
+
+ my $dn;
+ $dn = join('-', @dn) if @dn;
+
+ if (not @elem) {
+ return( $dn, $dv, undef, undef);
+ }
+
+ while (@elem) {
+ my $e = shift @elem;
+ if ($e =~ /^$version|any_version$/) {
+ $pv = $e;
+ last;
+ }
+ push @arch, $e;
+ }
+
+ my $arch;
+ $arch = join('-', @arch) if @arch;
+
+ return($dn, $dv, $arch, $pv);
+}
+
+=head2 generate_blib_stub
+
+Creates a F<blib/lib> subdirectory in the current directory
+and prepares a F<META.yml> with meta information for a
+new PAR distribution. First argument should be the name of the
+PAR distribution in a format understood by C<parse_dist_name()>.
+Alternatively, named arguments resembling those of
+C<blib_to_par> are accepted.
+
+After running C<generate_blib_stub> and injecting files into
+the F<blib> directory, you can create a PAR distribution
+using C<blib_to_par>.
+This function is useful for creating custom PAR distributions
+from scratch. (I.e. not from an unpacked CPAN distribution)
+Example:
+
+ use PAR::Dist;
+ use File::Copy 'copy';
+
+ generate_blib_stub(
+ name => 'MyApp', version => '1.00'
+ );
+ copy('MyApp.pm', 'blib/lib/MyApp.pm');
+ blib_to_par(); # generates the .par file!
+
+C<generate_blib_stub> will not overwrite existing files.
+
+=cut
+
+sub generate_blib_stub {
+ my %args = &_args;
+ my $dist = $args{dist};
+ require Config;
+
+ my $name = $args{name};
+ my $version = $args{version};
+ my $suffix = $args{suffix};
+
+ my ($parse_name, $parse_version, $archname, $perlversion)
+ = parse_dist_name($dist);
+
+ $name ||= $parse_name;
+ $version ||= $parse_version;
+ $suffix = "$archname-$perlversion"
+ if (not defined $suffix or $suffix eq '')
+ and $archname and $perlversion;
+
+ $suffix ||= "$Config::Config{archname}-$Config::Config{version}";
+ if ( grep { not defined $_ } ($name, $version, $suffix) ) {
+ warn "Could not determine distribution meta information from distribution name '$dist'";
+ return();
+ }
+ $suffix =~ s/\.par$//;
+
+ if (not -f 'META.yml') {
+ open META, '>', 'META.yml'
+ or die "Could not open META.yml file for writing: $!";
+ print META << "YAML" if fileno(META);
+name: $name
+version: $version
+build_requires: {}
+conflicts: {}
+dist_name: $name-$version-$suffix.par
+distribution_type: par
+dynamic_config: 0
+generated_by: 'PAR::Dist version $PAR::Dist::VERSION'
+license: unknown
+YAML
+ close META;
+ }
+
+ mkdir('blib');
+ mkdir(File::Spec->catdir('blib', 'lib'));
+ mkdir(File::Spec->catdir('blib', 'script'));
+
+ return 1;
+}
+
+
+=head2 contains_binaries
+
+This function is not exported by default.
+
+Opens a PAR archive tries to determine whether that archive
+contains platform-specific binary code.
+
+Takes one named parameter: I<dist>. If only one parameter is
+passed, it is treated as the I<dist> parameter. (Have a look
+at the description in the C<FUNCTIONS> section above.)
+
+Throws a fatal error if the PAR archive could not be found.
+
+Returns one if the PAR was found to contain binary code
+and zero otherwise.
+
+=cut
+
+sub contains_binaries {
+ require File::Find;
+ my %args = &_args;
+ my $dist = $args{dist};
+ return undef if not defined $dist or not -r $dist;
+ require Cwd;
+ require File::Path;
+
+ # The unzipping will change directories. Remember old dir.
+ my $old_cwd = Cwd::cwd();
+
+ # Unzip the base par to a temp. dir.
+ (undef, my $base_dir) = _unzip_to_tmpdir(
+ dist => $dist, subdir => 'blib'
+ );
+ my $blibdir = File::Spec->catdir($base_dir, 'blib');
+ my $archdir = File::Spec->catdir($blibdir, 'arch');
+
+ my $found = 0;
+
+ File::Find::find(
+ sub {
+ $found++ if -f $_ and not /^\.exists$/;
+ },
+ $archdir
+ );
+
+ chdir($old_cwd);
+
+ File::Path::rmtree([$base_dir]);
+
+ return $found ? 1 : 0;
+}
+
+sub _system_wrapper {
+ if ($DEBUG) {
+ Carp::cluck("Running system call '@_' from:");
+ }
+ return system(@_);
+}
+
+# stolen from Module::Install::Can
+# very much internal and subject to change or removal
+sub _MI_can_run {
+ require ExtUtils::MakeMaker;
+ my ($cmd) = @_;
+
+ my $_cmd = $cmd;
+ return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd));
+
+ for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') {
+ my $abs = File::Spec->catfile($dir, $cmd);
+ return $abs if (-x $abs or $abs = MM->maybe_command($abs));
+ }
+
+ return;
+}
+
+
+# Tries to load any YAML reader writer I know of
+# returns nothing on failure or hash reference containing
+# a subset of Load, Dump, LoadFile, DumpFile
+# entries with sub references on success.
+sub _get_yaml_functions {
+ # reasoning for the ranking here:
+ # - syck is fast and reasonably complete
+ # - YAML.pm is slow and aging
+ # - Tiny is only a very small subset
+ # - XS is very new and I'm not sure it's ready for prime-time yet
+ # - Parse... is only a reader and only deals with the same subset as ::Tiny
+ my @modules = qw(YAML::Syck YAML YAML::Tiny YAML::XS Parse::CPAN::Meta);
+
+ my %yaml_functions;
+ foreach my $module (@modules) {
+ eval "require $module;";
+ if (!$@) {
+ warn "PAR::Dist testers/debug info: Using '$module' as YAML implementation" if $DEBUG;
+ foreach my $sub (qw(Load Dump LoadFile DumpFile)) {
+ no strict 'refs';
+ my $subref = *{"${module}::$sub"}{CODE};
+ if (defined $subref and ref($subref) eq 'CODE') {
+ $yaml_functions{$sub} = $subref;
+ }
+ }
+ $yaml_functions{yaml_provider} = $module;
+ last;
+ }
+ } # end foreach module candidates
+ if (not keys %yaml_functions) {
+ warn "Cannot find a working YAML reader/writer implementation. Tried to load all of '@modules'";
+ }
+ return(\%yaml_functions);
+}
+
+sub _check_tools {
+ my $tools = _get_yaml_functions();
+ if ($DEBUG) {
+ foreach (qw/Load Dump LoadFile DumpFile/) {
+ warn "No YAML support for $_ found.\n" if not defined $tools->{$_};
+ }
+ }
+
+ $tools->{zip} = undef;
+ # A::Zip 1.28 was a broken release...
+ if (eval {require Archive::Zip; 1;} and $Archive::Zip::VERSION ne '1.28') {
+ warn "Using Archive::Zip as ZIP tool.\n" if $DEBUG;
+ $tools->{zip} = 'Archive::Zip';
+ }
+ elsif (_MI_can_run("zip") and _MI_can_run("unzip")) {
+ warn "Using zip/unzip as ZIP tool.\n" if $DEBUG;
+ $tools->{zip} = 'zip';
+ }
+ else {
+ warn "Found neither Archive::Zip (version != 1.28) nor ZIP/UNZIP as valid ZIP tools.\n" if $DEBUG;
+ $tools->{zip} = undef;
+ }
+
+ return $tools;
+}
+
+1;
+
+=head1 SEE ALSO
+
+L<PAR>, L<ExtUtils::Install>, L<Module::Signature>, L<LWP::Simple>
+
+=head1 AUTHORS
+
+Audrey Tang E<lt>cpan@audreyt.orgE<gt> 2003-2007
+
+Steffen Mueller E<lt>smueller@cpan.orgE<gt> 2005-2009
+
+PAR has a mailing list, E<lt>par@perl.orgE<gt>, that you can write to;
+send an empty mail to E<lt>par-subscribe@perl.orgE<gt> to join the list
+and participate in the discussion.
+
+Please send bug reports to E<lt>bug-par@rt.cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+Copyright 2003-2009 by Audrey Tang E<lt>autrijus@autrijus.orgE<gt>.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/Dist/FromPPD.pm b/Master/tlpkg/tlperl.straw/lib/PAR/Dist/FromPPD.pm
new file mode 100755
index 00000000000..5460db1e4d5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/Dist/FromPPD.pm
@@ -0,0 +1,555 @@
+package PAR::Dist::FromPPD;
+
+use 5.006;
+use strict;
+use warnings;
+
+our $VERSION = '0.03';
+
+use PAR::Dist;
+use LWP::Simple ();
+use XML::Parser;
+use Cwd qw/cwd abs_path/;
+use File::Copy;
+use File::Spec;
+use File::Path;
+use File::Temp ();
+use Archive::Tar ();
+
+require Exporter;
+
+our @ISA = qw(Exporter);
+
+our %EXPORT_TAGS = ( 'all' => [ qw(
+ ppd_to_par get_ppd_content
+) ] );
+
+our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
+
+our @EXPORT = qw(
+ ppd_to_par
+);
+
+
+our $VERBOSE = 0;
+
+
+sub _verbose {
+ $VERBOSE = shift if (@_);
+ return $VERBOSE
+}
+
+sub _diag {
+ my $msg = shift;
+ return unless _verbose();
+ print $msg ."\n";
+}
+
+sub ppd_to_par {
+ die "Uneven number of arguments to 'ppd_to_par'." if @_ % 2;
+ my %args = @_;
+ my @par_files;
+
+ _verbose($args{'verbose'});
+
+ if (not defined $args{uri}) {
+ die "You need to specify an URI for the PPD file";
+ }
+ my $ppd_uri = $args{uri};
+
+ my $outdir = abs_path(defined($args{out}) ? $args{out} : '.');
+ die "Output path not a directory." if not -d $outdir;
+
+ _diag "Looking for PPD.";
+
+ my $ppd_text = get_ppd_content($ppd_uri);
+
+ _diag "Parsing PPD XML.";
+ my $parser = XML::Parser->new(Style => 'Tree');
+ my $ppd_tree = $parser->parse($ppd_text);
+ die "Parsing PPD XML failed" if not defined $ppd_tree;
+
+ my $ppd_info = _ppd_to_info($ppd_tree);
+ die "Malformed PPD" if not defined $ppd_info;
+
+ _diag "Applying user overrides.";
+ # override parsed data with user specified data
+ my %arg_map = (
+ distname => 'name',
+ distversion => 'version',
+ );
+ _override_info($ppd_info, \%arg_map, \%args);
+
+ if (not defined $ppd_info->{name}) {
+ die "Missing distribution name";
+ }
+ if (not defined $ppd_info->{version}) {
+ die "Missing distribution version";
+ }
+ if (not @{$ppd_info->{implementations}}) {
+ die "No IMPLEMENTATION sections in the distribution";
+ }
+
+ # Select implementation
+ _diag "Selecting implementation.";
+ my $implem = [@{$ppd_info->{implementations}}];
+ my $chosen;
+ my $sperl = $args{selectperl};
+ $sperl = qr/$sperl/ if defined $sperl;
+ my $sarch = $args{selectarch};
+ $sarch = qr/$sarch/ if defined $sarch;
+ if (not $sarch) {
+ if (not $sperl) {
+ $chosen = $implem->[0];
+ }
+ else {
+ # have $sperl not $sarch
+ foreach my $impl (@$implem) {
+ if ($impl->{perl} and $impl->{perl} =~ $sperl) {
+ $chosen = $impl;
+ last;
+ }
+ }
+ $chosen = $implem->[0] if not $chosen;
+ }
+ }
+ else {
+ # have $sarch
+ if (not $sperl) {
+ foreach my $impl (@$implem) {
+ if ($impl->{arch} and $impl->{arch} =~ $sarch) {
+ $chosen = $impl;
+ last;
+ }
+ }
+ $chosen = $implem->[0] if not $chosen;
+ }
+ else {
+ # both
+ my @pre;
+ foreach my $impl (@$implem) {
+ if ($impl->{arch} and $impl->{arch} =~ $sarch) {
+ push @pre, $impl;
+ }
+ }
+ if (not @pre) {
+ $chosen = $implem->[0];
+ }
+ else {
+ foreach my $impl (@pre) {
+ if ($impl->{perl} and $impl->{perl} =~ $sperl) {
+ $chosen = $impl;
+ last;
+ }
+ }
+ $chosen = $pre[0] if not $chosen;
+ }
+ }
+ }
+
+ # apply the rest of the overrides
+ %arg_map = (
+ arch => [qw(implementations arch)],
+ perlversion => [qw(implementations perl)],
+ );
+ _override_info($ppd_info, \%arg_map, \%args);
+
+ if (not defined $chosen->{arch}) {
+ die "Architecture name of chosen implementation is undefined"
+ }
+ if (not defined $chosen->{perl}) {
+ die "Minimum perl version of chosen implementation is undefined"
+ }
+
+ _diag "Creating temporary directory";
+ my $tdir = File::Temp::tempdir( CLEANUP => 1 );
+
+ _diag "Fetching (or finding) implementation file";
+ my $impl_file;
+
+ foreach my $uri (@{$chosen->{uri}}) {
+ my $filename = $uri;
+ $filename =~ s/^.*(?:\/|\\|:)([^\\\/:]+)$/$1/;
+ my $localfile = File::Spec->catfile($tdir, $filename);
+ if ($uri =~ /^(?:ftp|https?):\/\//) {
+ my $code = LWP::Simple::getstore(
+ $uri, $localfile
+ );
+ _diag("URI '$uri' via LWP '$localfile' failed. (LWP, code $code)"), next
+ if not LWP::Simple::is_success($code);
+ $impl_file = $localfile;
+ }
+ elsif ($uri =~ /^file:\/\// or $uri !~ /^\w+:\/\//) {
+ # local file
+ unless(-f $uri and File::Copy::copy($uri, $localfile)) {
+ _diag "URI '$uri' failed. (local)";
+
+ # try as relative URI
+ my $base = $args{uri};
+ if ($base =~ /^(?:https?|ftp):\/\//) {
+ $base =~ s!/[^/]+$!/$uri!;
+ my $code = LWP::Simple::getstore(
+ $base, $localfile
+ );
+ _diag("URI '$base' via LWP '$localfile' failed. (LWP, code $code)"), next
+ if not LWP::Simple::is_success($code);
+ $impl_file = $localfile;
+ }
+ else {
+ next;
+ }
+ }
+ $impl_file = $localfile;
+ }
+ else {
+ _diag "Invalid URI '$uri'.";
+ next;
+ }
+ }
+
+
+ if (not defined $impl_file) {
+ _diag "All CODEBASEs failed.";
+ File::Path::rmtree([$tdir]);
+ return();
+ }
+
+ _diag "Local file: '$impl_file'";
+
+ _diag "chdir() to '$tdir'";
+ my $cwd = Cwd::cwd();
+ chdir($tdir);
+
+ _diag "Generating 'blib' stub'";
+ PAR::Dist::generate_blib_stub(
+ name => $ppd_info->{name},
+ version => $ppd_info->{version},
+ suffix => join('-', $chosen->{arch}, $chosen->{perl}),
+ );
+
+ _diag "Extracting local file.";
+ my ($vol, $path, $file) = File::Spec->splitpath($impl_file);
+ my $tar = Archive::Tar->new($file, 1)
+ or chdir($cwd), die "Could not open .tar(.gz) file";
+
+ $tar->extract();
+
+ _diag "Building PAR ".$ppd_info->{name};
+
+ my $par_file;
+ eval {
+ $par_file = PAR::Dist::blib_to_par(
+ name => $ppd_info->{name},
+ version => $ppd_info->{version},
+ suffix => join('-', $chosen->{arch}, $chosen->{perl}).'.par',
+ )
+ } or chdir($cwd), die "Failed to build .par: $@";
+
+ chdir($cwd), die "Could not find PAR distribution file '$par_file'."
+ if not -f $par_file;
+
+ _diag "Built PAR file '$par_file'.";
+
+ _diag "Moving distribution file to output directory '$outdir'.";
+
+ unless (File::Copy::move($par_file, $outdir)) {
+ chdir($cwd);
+ die "Could not move file '$par_file' to directory "
+ . "'$outdir'. Reason: $!";
+ }
+ $par_file = File::Spec->catfile($outdir, $par_file);
+ if (-f $par_file) {
+ push @par_files, $par_file;
+ }
+ else {
+ chdir($cwd);
+ die "Lost PAR file along the way. (Ouch!) Expected it at '$par_file'";
+ }
+
+ # strip docs
+ if ($args{strip_docs}) {
+ _diag "Removing documentation from the PAR distribution(s).";
+ PAR::Dist::remove_man($_) for @par_files;
+ }
+
+ chdir($cwd);
+ File::Path::rmtree([$tdir]);
+ return(1);
+}
+
+
+
+sub get_ppd_content {
+ my $ppd_uri = shift;
+ my $ppd_text;
+ if ($ppd_uri =~ /^(?:https?|ftp):\/\//) {
+ # fetch with LWP::Simple
+ _diag "Fetching with LWP::Simple.";
+ $ppd_text = LWP::Simple::get($ppd_uri);
+ die "Could not fetch PPD content from '$ppd_uri' using LWP"
+ if not defined $ppd_text;
+ }
+ elsif ($ppd_uri =~ /^file:\/\// or $ppd_uri !~ /^\w*:\/\//) {
+ # It's a local file
+ _diag "Reading PPD info from file.";
+ $ppd_uri =~ s/^file:\/\///;
+ open my $fh, '<', $ppd_uri
+ or die "Could not read PPD content from file '$ppd_uri' ($!)";
+ local $/ = undef;
+ $ppd_text = <$fh>;
+ close $fh;
+ die "Could not read PPD content from file '$ppd_uri' ($!)"
+ if not defined $ppd_text;
+ }
+ else {
+ # Invalid URI (in our context)
+ die "The PPD URI is invalid: '$ppd_uri'";
+ }
+ return $ppd_text;
+}
+
+
+sub _ppd_to_info {
+ my $tree = shift;
+ my $info = {
+ name => undef,
+ version => undef,
+ title => undef,
+ abstract => undef,
+ author => undef,
+ license => undef,
+ deps => [],
+ implementations => [],
+ };
+
+ return() if not defined $tree or not ref($tree) eq 'ARRAY';
+ return() if not $tree->[0] =~ /^softpkg$/i;
+ my $children = $tree->[1];
+ my $dist_attr = shift @$children;
+ $info->{name} = $dist_attr->{NAME};
+ $info->{version} = $dist_attr->{VERSION};
+ return() if not defined $info->{name} or not defined $info->{version};
+ $info->{version} =~ s/,/./g;
+ $info->{version} =~ s/(?:\.0)+$//;
+
+ while (@$children) {
+ my $tag = shift @$children;
+ # Skip any direct content
+ shift(@$children), next if $tag eq '0';
+ if ($tag =~ /^implementation$/i) {
+ my $impl = _parse_implementation(shift @$children);
+ push @{$info->{implementations}}, $impl if defined $impl;
+ }
+ elsif ($tag =~ /^dependency$/i) {
+ my $dep = _parse_dependency(shift @$children);
+ push @{$info->{deps}}, $dep if defined $dep;
+ }
+ elsif ($tag =~ /^title$/i) {
+ $info->{title} = shift(@$children)->[2];
+ }
+ elsif ($tag =~ /^abstract$/i) {
+ $info->{abstract} = shift(@$children)->[2];
+ }
+ elsif ($tag =~ /^author$/i) {
+ $info->{author} = shift(@$children)->[2];
+ }
+ elsif ($tag =~ /^license$/i) {
+ $info->{license} = shift(@$children)->[0]{HREF};
+ }
+ else {
+ shift @$children;
+ }
+ }
+ return $info;
+}
+
+
+sub _parse_dependency {
+ my $content_ary = shift;
+ return(); # XXX currently unused and hence not implemented
+}
+
+sub _parse_implementation {
+ my $impl_ary = shift;
+ my $impl = {
+ deps => [],
+ os => [],
+ arch => undef,
+ uri => undef,
+ processor => undef,
+ language => undef,
+ osversion => undef,
+ perl => undef,
+ };
+
+ my $c = $impl_ary;
+ shift @$c; # skip attributes
+
+ while (@$c) {
+ my $tag = shift @$c;
+ if ($tag eq '0') {
+ shift @$c;
+ }
+ elsif ($tag =~ /^language$/i) {
+ $impl->{language} = shift(@$c)->[2];
+ }
+ elsif ($tag =~ /^os$/i) {
+ my $attr = shift(@$c)->[0];
+ push @{$impl->{os}}, $attr->{VALUE} || $attr->{NAME};
+ }
+ elsif ($tag =~ /^osversion$/i) {
+ my $attr = shift(@$c)->[0];
+ $impl->{osversion} = $attr->{VALUE} || $attr->{NAME};
+ }
+ elsif ($tag =~ /^perlcore$/i) {
+ my $attr = shift(@$c)->[0];
+ $impl->{perl} = $attr->{VERSION};
+ }
+ elsif ($tag =~ /^processor$/i) {
+ my $attr = shift(@$c)->[0];
+ $impl->{processor} = $attr->{VALUE} || $attr->{NAME};
+ }
+ elsif ($tag =~ /^architecture$/i) {
+ my $attr = shift(@$c)->[0];
+ $impl->{arch} = $attr->{VALUE} || $attr->{NAME};
+ }
+ elsif ($tag =~ /^codebase$/i) {
+ my $attr = shift(@$c)->[0];
+ push @{$impl->{uri}}, $attr->{HREF} || $attr->{FILENAME};
+ }
+ elsif ($tag =~ /^dependency$/i) {
+ my $dep = _parse_dependency(shift @$c);
+ push @{$impl->{deps}}, $dep if defined $dep;
+ }
+ else {
+ shift @$c;
+ }
+ }
+
+ return $impl;
+}
+
+sub _override_info {
+ my $info = shift;
+ my $arg_map = shift;
+ my $args = shift;
+ foreach my $arg (keys %$arg_map) {
+ next if not defined $args->{$arg};
+ my $to = $arg_map->{$arg};
+ if (ref($to)) {
+ my $ary = $info->{shift(@$to)};
+ $ary->[$_]{$to->[0]} = $args->{$arg} for 0..$#$ary;
+ }
+ else {
+ $info->{$to} = $args->{$arg};
+ }
+ }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+PAR::Dist::FromPPD - Create PAR distributions from PPD/PPM packages
+
+=head1 SYNOPSIS
+
+ use PAR::Dist::FromPPD;
+
+ # Creates a .par distribution of the PAR module in the
+ # current directory based on the PAR.ppd file from the excellent
+ # bribes.org PPM repository.
+ ppd_to_par(uri => 'http://www.bribes.org/perl/ppm/PAR.ppd');
+
+ # You could download the .ppd and .tar.gz files first and then do:
+ ppd_to_par(uri => 'PAR.ppd', verbose => 1);
+
+=head1 DESCRIPTION
+
+This module creates PAR distributions from PPD XML documents which
+are used by ActiveState's "Perl Package Manager", short PPM.
+
+It parses the PPD document to extract the required
+information and then uses PAR::Dist to create a .par archive from it.
+
+Please note that this code I<works for me> but hasn't been tested
+to full extent.
+
+=head2 EXPORT
+
+By default, the C<ppd_to_par> subroutine is exported to the callers
+namespace. C<get_ppd_content> will be exported on demand.
+
+=head1 SUBROUTINES
+
+This is a list of all public subroutines in the module.
+
+=head2 ppd_to_par
+
+The only mandatory parameter is an URI for the PPD file to parse.
+
+Arguments:
+
+ uri => 'ftp://foo/bar' or 'file:///home/you/file.ppd', ...
+ out => 'directory' (write distribution files to this directory)
+ verbose => 1/0 (verbose mode on/off)
+ distname => Override the distribution name
+ distversion => Override the distribution version
+ perlversion => Override the distribution's (minimum?) perl version
+ arch => Override the distribution's target architecture
+ selectarch => Regular Expression.
+ selectperl => Regular Expression.
+
+C<arch> may also be set to C<any_arch> and C<perlversion> may be set to
+C<any_version>.
+
+If a regular expression is specified using C<selectarch>, that expression is
+matched against the architecture settings of each implementation. The first
+matching implementation is chosen. If none matches, the implementations
+are tried in order of appearance. Of course, this heuristic is applied before
+any architecture overriding via the C<arch> parameter is carried out.
+
+C<selectperl> works the same as C<selectarch>, but operates on the (minimum)
+perl version of an implementation. If both C<selectperl> and C<selectarch>
+are present, C<selectperl> operates on the implementations matched by
+C<selectarch>. That means C<selectarch> takes precedence.
+
+=head2 get_ppd_content
+
+First argument must be an URI string for the PPD.
+(Supported are C<file://> URIs and whatever L<LWP>
+supports.)
+
+Fetches the PPD file and returns its contents as a string.
+
+C<die()>s on error.
+
+=head1 SEE ALSO
+
+The L<PAR::Dist> module is used to create .par distributions from an
+unpacked CPAN distribution. The L<CPAN> module is used to fetch the
+distributions from the CPAN.
+
+PAR has a mailing list, <par@perl.org>, that you can write to; send an empty mail to <par-subscribe@perl.org> to join the list and participate in the discussion.
+
+Please send bug reports to <bug-par-dist-fromppd@rt.cpan.org>.
+
+The official PAR website may be of help, too: http://par.perl.org
+
+For details on the I<Perl Package Manager>, please refer to ActiveState's
+website at L<http://activestate.com>.
+
+=head1 AUTHOR
+
+Steffen Mueller, E<lt>smueller at cpan dot orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2006 by Steffen Mueller
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.6 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/Dist/InstallPPD.pm b/Master/tlpkg/tlperl.straw/lib/PAR/Dist/InstallPPD.pm
new file mode 100755
index 00000000000..e159caadcb4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/Dist/InstallPPD.pm
@@ -0,0 +1,215 @@
+package PAR::Dist::InstallPPD;
+
+use 5.006;
+use strict;
+use warnings;
+
+use PAR::Dist::FromPPD ();
+use PAR::Dist ();
+use File::Temp ();
+use File::Spec;
+use File::Path;
+use Cwd;
+
+require Config;
+require Exporter;
+
+our @ISA = qw(Exporter);
+
+our %EXPORT_TAGS = ( 'all' => [ qw(
+ par_install_ppd
+) ] );
+
+our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
+
+our @EXPORT = qw(
+ par_install_ppd
+);
+
+our $VERSION = '0.02';
+
+our $VERBOSE = 0;
+
+
+sub _verbose {
+ $VERBOSE = shift if (@_);
+ return $VERBOSE
+}
+
+sub _diag {
+ my $msg = shift;
+ return unless _verbose();
+ print $msg ."\n";
+}
+
+sub par_install_ppd {
+ die "Uneven number of arguments to 'par_install_ppd'." if @_ % 2;
+ my %args = @_;
+
+ _verbose($args{'verbose'});
+
+ _diag "Creating temporary directory for temporary .par";
+
+ my $tdir = $args{out} = File::Temp::tempdir(
+ CLEANUP => 1,
+ DIR => File::Spec->tmpdir(),
+ );
+
+ _diag "Preparing meta data for temporary .par";
+
+ # should be figured out by ::FromPPD
+ delete $args{$_} for qw(
+ distversion perlversion
+ );
+ # just need to be defined.
+ $args{arch} = $Config::Config{archname};
+ $args{perlversion} = sprintf('%vd', $^V);
+
+ # Accept running perl version (5.8.8)
+ # or main perl version (5.8)
+ # or any other subversions (5.8.6)
+ my $perlver = sprintf('%vd', $^V);
+ my $mainperlver = $perlver;
+ $mainperlver =~ s/^(\d+)\.(\d+)\..*$/$1.$2/;
+ _diag "Setting perl version to ($perlver|$mainperlver|$mainperlver\\.\\d+)"
+ if not defined $args{selectperl};
+ $args{selectperl} ||= qr/^(?:$perlver|$mainperlver|$mainperlver\.\d+)$/;
+
+
+ # Accept running arch
+ my $arch = quotemeta( $Config::Config{archname} );
+ _diag "Setting architecture to $Config::Config{archname}"
+ if not defined $args{selectarch};
+ my $perlver_nodots = $mainperlver;
+ $perlver_nodots =~ s/\.//g;
+ $args{selectarch} ||= qr/^(?:$arch-?(?:$perlver_nodots\d*|$mainperlver(?:\.\d+)?)|$arch)$/;
+
+ _diag "Using temporary directory $tdir.";
+ _diag "Invoking PAR::Dist::FromPPD to create the .par file.";
+
+ PAR::Dist::FromPPD::ppd_to_par(%args);
+
+ _diag "Searching for generated .par file.";
+
+ _diag "chdir() to '$tdir'";
+ my $cwd = Cwd::cwd();
+ chdir($tdir);
+
+ opendir my $dh, '.' or die $!;
+
+ my @par_files = grep {-f $_ and /\.par$/i} readdir($dh);
+
+ _diag "Found PAR files: @par_files.";
+
+ _diag "Installing PAR files.";
+
+ foreach my $file (@par_files) {
+ _diag "Installing file '$file' with PAR::Dist::install_par().";
+ PAR::Dist::install_par($file);
+ }
+
+ _diag "Done installing PAR files.";
+
+ chdir($cwd);
+ File::Path::rmtree([$tdir]);
+ return(1);
+}
+
+
+
+
+1;
+__END__
+
+=head1 NAME
+
+PAR::Dist::InstallPPD - Installs PPM packages the PAR way
+
+=head1 SYNOPSIS
+
+ use PAR::Dist::InstallPPD;
+
+ # Creates a .par distribution of the Tk module in the
+ # current directory based on the Tk.ppd file from the excellent
+ # bribes.org PPM repository.
+ par_install_ppd(uri => 'http://www.bribes.org/perl/ppm/Tk.ppd');
+
+ # You could download the .ppd and .tar.gz files first and then do:
+ par_install_ppd(uri => 'Tk.ppd', verbose => 1);
+
+=head1 DESCRIPTION
+
+This module creates PAR distributions from PPD XML documents which
+are used by ActiveState's "Perl Package Manager", short PPM.
+Then, it installs these newly created temporary F<.par> files in the
+default location using L<PAR::Dist>'s C<install_par> routine.
+
+Yes, that means you can install packages for the PPM without PPM.
+
+The module uses L<PAR::Dist::FromPPD> to create the F<.par> files.
+
+Please note that this code I<works for me> but hasn't been tested
+to full extent.
+
+=head2 EXPORT
+
+By default, the C<par_install_ppd> subroutine is exported to the caller's
+namespace.
+
+=head1 SUBROUTINES
+
+This is a list of all public subroutines in the module.
+
+=head2 par_install_ppd
+
+This routine takes the same arguments as C<ppd_to_par> from
+L<PAR::Dist::FromPPD> except for the output directory and the
+options that set the meta data for the produced F<.par> file.
+The details are reproduced below.
+
+The only mandatory parameter is an URI for the PPD file to parse.
+
+Arguments:
+
+ uri => 'ftp://foo/bar' or 'file:///home/you/file.ppd', ...
+ verbose => 1/0 (verbose mode on/off)
+ selectarch => Regular Expression.
+ selectperl => Regular Expression.
+
+If a regular expression is specified using C<selectarch>, that expression is
+matched against the architecture settings of each implementation. The first
+matching implementation is chosen. If none matches, the implementations
+are tried in order of appearance.
+
+C<selectperl> works the same as C<selectarch>, but operates on the (minimum)
+perl version of an implementation. If both C<selectperl> and C<selectarch>
+are present, C<selectperl> operates on the implementations matched by
+C<selectarch>. That means C<selectarch> takes precedence.
+
+=head1 SEE ALSO
+
+The L<PAR::Dist> module is used to create L<.par> distributions and install
+them. The L<PAR::Dist::FromPPD> module converts the PPD package descriptions.
+
+PAR has a mailing list, <par@perl.org>, that you can write to; send an empty mail to <par-subscribe@perl.org> to join the list and participate in the discussion.
+
+Please send bug reports to <bug-par-dist-fromcpan@rt.cpan.org>.
+
+The official PAR website may be of help, too: http://par.perl.org
+
+For details on the I<Perl Package Manager>, please refer to ActiveState's
+website at L<http://activestate.com>.
+
+=head1 AUTHOR
+
+Steffen Mueller, E<lt>smueller at cpan dot orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2006 by Steffen Mueller
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.6 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/Environment.pod b/Master/tlpkg/tlperl.straw/lib/PAR/Environment.pod
new file mode 100755
index 00000000000..84796e3095b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/Environment.pod
@@ -0,0 +1,256 @@
+=head1 NAME
+
+PAR::Environment - Index and reference of PAR environment variables
+
+=head1 DESCRIPTION
+
+PAR uses various environment variables both during the building process of
+executables or PAR archives and the I<use> of them. Since the wealth of
+combinations and settings might confuse one or the other (like me), this
+document is intended to document all environment variables which PAR uses.
+
+Wherever I want to refer to the C<$ENV{FOO}> environment hash entry, I will
+usually talk about the C<FOO> variable for brevity.
+
+=head1 INDEX OF ENVIRONMENT VARIABLES
+
+B<Please note that this is still very, very incomplete! Contributions welcome!>
+
+For each variable, there should be a description what it contains, when
+it can be expected to exist (and contain meaningful information),
+when it is sensible to define it yourself, and what effect this has.
+
+Of course, the description may use examples.
+
+=head2 PAR_0
+
+If the running program is run from within a PAR archive or pp-produced
+executable, this variable contains the name of the extracted program
+(i.e. .pl file). This is useful of you want to open the source code
+file of the running program.
+
+For example, if you package a file F<foo.pl> into
+F<bar.par> and run F<foo.pl> with this command
+
+ par.pl foo.par bar.pl
+
+then the C<PAR_0> variable will contain something like
+C</tmp/par-youser/cache-b175f53eb731da9594e0dde337d66013ddf25a44/495829f0.pl>
+where C<youser> is your username and
+C</tmp/par-youser/cache-b175f53eb731da9594e0dde337d66013ddf25a44/> is the
+PAR cache directory (C<PAR_TEMP>).
+
+The name of the PAR cache directory can take a number of different forms,
+so use C<PAR_0> if you want to find the extracted program's .pl file --
+attempting to construct the name yourself requires complex logic that
+has already produced the value in C<PAR_0>.
+
+This works the same for executable binaries (F<.exe>, ...).
+
+If you are looking for the name and path of the pp-ed binary file,
+please refer to the C<PAR_PROGNAME> variable.
+
+=head2 PAR_ARGC, PAR_ARGV_0, PAR_ARGV_...
+
+You should not rely on these variables outside of the PAR binary loader
+code.
+
+These variables are set when a non-dependent pp-ed binary executable
+runs. The initially executed process extracts another binary and runs
+it as a child process. In order to pass its command line arguments to
+the child, the parent process sets C<PAR_ARG*> as they would be
+used in C programs: C<PAR_ARGC> has the number of arguments, C<PAR_ARGV_0>
+has the name of the executable, C<PAR_ARGV_*> are the command line arguments.
+
+If you would like to access the name of the running program (script or binary),
+please refer to C<PAR_0> and C<PAR_PROGNAME> instead!
+
+Related: C<PAR_SPAWNED>, C<PAR_0>, C<PAR_PROGNAME>
+
+=head2 PAR_CLEAN
+
+Users should set C<PAR_GLOBAL_CLEAN> instead.
+Recreated from C<PAR_GLOBAL_CLEAN> and the value of C<-C> from the YAML file
+by the PAR loader, and used within loader to control the initial behavior
+of extraction, and the final behavior of cleanup. The user can reference
+C<PAR_CLEAN> in the application to determine which of these behaviors
+is being used for this run of the application.
+
+=head2 PAR_DEBUG
+
+Users should set C<PAR_GLOBAL_DEBUG> instead.
+
+If this variable is set to a true value and F<par.pl> is run,
+verbose output is sent to STDOUT or the logging filehandle.
+This is overridden by the C<-q> option to F<par.pl>,
+for steps after argument parsing occurs.
+
+This currently only influences F<par.pl>. Whether this is the intended
+behaviour remains to be verified.
+
+=head2 PAR_GLOBAL_CLEAN
+
+Setting C<PAR_GLOBAL_CLEAN> alters the behavior of par applications
+which see that environment variable at launch.
+C<PAR_GLOBAL_CLEAN> overrides the C<-C> option.
+Settings of 0 and 1 are supported. 0 corresponds to not using C<-C> on the
+pp command line; 1 corresponds to using C<-C> on the pp command line.
+C<PAR_GLOBAL_CLEAN> is ignored if C<PAR_GLOBAL_TEMP> is set, yet it
+controls the form of C<PAR_TEMP> when C<PAR_GLOBAL_TEMP> is not set.
+
+=head2 PAR_GLOBAL_DEBUG
+
+The PAR loader becomes more verbose when C<PAR_DEBUG> is set.
+Setting C<PAR_GLOBAL_DEBUG> guarantees that C<PAR_DEBUG> will be set
+internally, initially. See C<PAR_DEBUG> for more details.
+
+=head2 PAR_GLOBAL_TEMP
+
+Contributes to the calculation of C<PAR_TEMP>, and is further explained
+there.
+
+=head2 PAR_GLOBAL_TMPDIR
+
+Contributes to the calculation of C<PAR_TEMP>, and is further explained
+there.
+
+=head2 PAR_INITIALIZED
+
+This environment variable is for internal use by the PAR binary loader
+only.
+Documented only to avoid surprises if spawned applications expect
+to see a value initialized by the user.
+
+=head2 PAR_PROGNAME
+
+C<PAR_PROGNAME> is set to the fully-qualified path name of the executable
+program.
+On Windows, this is reliably obtained from the C<GetModuleFileName> API.
+On other OSes, if the C runtime is given a qualified path name, it is used,
+or the unqualified file name given is qualified by walking the path.
+This is reasonably reliable given normal program spawning conventions,
+but cannot be guaranteed to be correct in all circumstances.
+
+=head2 PAR_APP_REUSE
+
+Strictly internal. Skip this section if you're not a PAR developer.
+
+The variable shouldn't ever be exposed to user code and packaged
+applications should not depend on it being set or not.
+
+If an application has been packaged with the C<--reusable> option, the
+bootstrapping code will set this environment variable to the name of
+the program that is to be run instead of the packaged program.
+The F<main.pl> loader script fetches the file name, deletes the
+environment variable, and then runs the given program.
+
+=head2 PAR_RUN
+
+This environment variable was set during constructions of C<PAR::Packer>
+objects (usually during F<pp> runs only) by versions of PAR up to
+0.957. Since PAR 0.958, this variable is unused.
+
+=head2 PAR_SPAWNED
+
+This variable is used internally by the F<parl> binary loader to signal
+the child process that it's the child.
+
+You should not rely on this variable outside of the PAR binary loader
+code. For a slightly more detailed discussion, please refer to the
+F<who_am_i.txt> documentation file in the PAR source distribution
+which was contributed by Alan Stewart. Related: C<PAR_ARGC>, C<PAR_ARGV_*>
+
+Documented only to avoid surprises if spawned applications expect
+to see a value initialized by the user.
+
+=head2 PAR_TEMP
+
+Users should set C<PAR_GLOBAL_TEMP> instead.
+C<PAR_TEMP> is calculated from a variety of other variables.
+See the C<NOTES> section in the pod for PAR.pm for
+a complete description of how the calculation proceeds.
+C<PAR_TEMP>, once calculated, is used as the location
+where PAR stores its extracted, temporary file cache.
+
+=head2 PAR_TMPDIR
+
+Contributes to the calculation of C<PAR_TEMP>, and is further explained
+there. Users should set C<PAR_GLOBAL_TMPDIR> instead.
+
+=head2 PAR_VERBATIM
+
+The C<PAR_VERBATIM> variable controls the way Perl code is packaged
+into a PAR archive or binary executable. If it is set to a true
+value during the packaging process, modules (and scripts) are
+B<not> passed through the default C<PAR::Filter::PodStrip> filter
+which removes all POD documentation from the code. Note that the
+C<PAR::Filter::PatchContent> filter is still applied.
+
+The C<-F> option to the F<pp> tool overrides the C<PAR_VERBATIM>
+setting. That means if you set C<PAR_VERBATIM=1> but specify
+C<-F PodStrip> on the C<pp> command line, the C<PodStrip> filter
+will be applied.
+
+C<PAR_VERBATIM> is not used by the PAR application.
+
+=head2 PAR_VERBOSE
+
+Setting this environment variable to a positive integer
+has the same effect as using the C<-verbose> switch to F<pp>.
+
+=head2 PP_OPTS
+
+During a F<pp> run, the contents of the C<PP_OPTS> variable are
+treated as if they were part of the command line. In newer versions
+of PAR, you can also write options to a file and execute F<pp>
+as follows to read the options from the file:
+
+ pp @FILENAME
+
+That can, of course, be combined with other command line arguments
+to F<pp> or the C<PP_OPTS> variable.
+
+=head2 TMP, TEMP, TMPDIR, TEMPDIR
+
+Please refer to C<PAR_TMPDIR>.
+
+=head1 SEE ALSO
+
+The PAR homepage at L<http://par.perl.org>.
+
+L<PAR>, L<PAR::Tutorial>, L<PAR::FAQ> (For a more current FAQ,
+refer to the homepage.)
+
+L<par.pl>, L<parl>, L<pp>
+
+L<PAR::Dist> for details on PAR distributions.
+
+=head1 AUTHORS
+
+Steffen Mueller E<lt>smueller@cpan.orgE<gt>
+
+L<http://par.perl.org/> is the official PAR website. You can write
+to the mailing list at E<lt>par@perl.orgE<gt>, or send an empty mail to
+E<lt>par-subscribe@perl.orgE<gt> to participate in the discussion.
+
+Please submit bug reports to E<lt>bug-par@rt.cpan.orgE<gt>. If you need
+support, however, joining the E<lt>par@perl.orgE<gt> mailing list is
+preferred.
+
+=head1 COPYRIGHT
+
+PAR: Copyright 2003-2008 by Audrey Tang,
+E<lt>cpan@audreyt.orgE<gt>.
+
+This document: Copyright 2006-2008 by Steffen Mueller,
+E<lt>smueller@cpan.orgE<gt>
+
+Some information has been taken from Alan Stewart's extra documentation in the
+F<contrib/> folder of the PAR distribution.
+
+This program or documentation is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/FAQ.pod b/Master/tlpkg/tlperl.straw/lib/PAR/FAQ.pod
new file mode 100755
index 00000000000..35e47dffe24
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/FAQ.pod
@@ -0,0 +1,358 @@
+=head1 NAME
+
+PAR::FAQ - Frequently Asked Questions about PAR
+
+=head1 SYNOPSIS
+
+This is the Frequently Asked Questions list for the Perl Archive Toolkit.
+You can edit this document at L<http://par.perl.org/wiki/FAQ> online.
+This (included) FAQ list might be outdated. The Wiki version at the above URL
+is guaranteed to be up to date.
+
+=head1 DESCRIPTION
+
+=head2 Where is the Windows binary version?
+
+You can find windows binaries here:
+
+L<http://www.cpan.org/authors/id/S/SM/SMUELLER/>
+
+There are three ways to install them. Sorted in order of preference:
+
+=head3 cpan
+
+Run the I<cpan> command line tool that comes with Perl. In the I<cpan> shell, type
+
+ install PAR
+
+and wait for the script to download and extract PAR and its dependencies. If you have a C compiler installed, PAR will be built on your computer for your specific version of Perl. If you do not have a C compiler, the installer will look at the site referenced above for a compatible binary release and ask you whether you would like to install it.
+
+=head3 ppm
+
+If you are using ActivePerl from ActiveState, you can use the 'ppm' program that comes with the ActiveState Perl. Instructions can be found below. PAR is availlable from various PPM repositories and some packages are compatible with some versions of ActivePerl and not with others. There is an incomplete PAR-Win32 Binary Compatibility List at L<http://par.wikia.com/wiki/PAR_PPM_Compatibility_List> There are at least three relevant PPM repositories: The default ActiveState one, the bribes repository which is used in the example below and Randy Kobes' repository at L<http://theoryx5.uwinnipeg.ca/ppms/>.
+
+ C:\> ppm3
+ # activestate was out of date compared to this one
+ % rep add bribes http://www.bribes.org/perl/ppm
+ # move it to first place on list of repositories
+ % rep up bribes
+ CPAN>upgrade -install PAR
+
+And finally, 'q' to quit and that's all :-) You have access to pp and so on...
+
+=head3 manual
+
+For reference, here's the old explanation of how to install it by hand:
+The file you need will be called PAR-X.XX-MSWin32-x86-multi-thread-Y.Y.Y.par where X.XX is the version of PAR you will use and Y.Y.Y is the version of Perl you have. Unzip this file (you may need to rename it to end with .zip instead of .par first) and copy all the files in the script directory into a directory in your PATH. Now you should be able to use PAR.
+
+=head2 Can PAR bundle all its prerequisites?
+
+I<Note:> This entry needs serious attention.
+
+Yes and no.
+
+It would be possible to do this but it would also introduce a maintenance nightmare. A new version of PAR would have to be released whenever a new version of any of the dependencies came out. This is already painful with the included L<Module::Install>.
+
+The original proposal which led to this FAQ entry considered the case where you want to install PAR without a working CPAN.pm/CPAN shell installation or without internet connectivity. By default, PAR will try to install its dependencies from CPAN using the CPAN.pm module.
+
+Given that you have a development machine with PAR installed and with a working CPAN.pm, it is reasonably simple to create one or more .par distributions of PAR's dependencies. Install L<PAR::Dist::FromCPAN>. Then you can create .par distributions (read: binaries installable with the pure-perl PAR::Dist on the same architecture) for the PAR dependencies as follows:
+
+ mkdir par_files
+ cpan2par --pattern PAR --follow --out par_files/ --merge --skip File::.*
+ --skip Getopt::Std --skip Carp --skip Data::Dumper --skip Time::Local
+ --skip 'Test\b.*' --skip Text::ParseWords --skip ExtUtils::.*
+ --skip Getopt::Long --skip Text::Abbrev --skip DirHandle --skip Pod::.*
+
+(Line breaks inserted for readability.) What happens here? cpan2par uses the API of the CPAN.pm module to fetch the PAR distribution from CPAN, unpacks it, builds it, creates a .par archive from its compiled state and then does the same for any of its dependencies. And then for its dependencies dependencies and... You get the idea. This is what the --follow option does. We add a couple of --skip options to skip core modules which we need not include and any Test::* modules. The --merge option merges all of the .par distributions into the original PAR one. Voila! (Future versions of PAR::Dist::FromCPAN might include an option --skip-core which would skip any modules contained in the core distribution.)
+
+After this command worked its magic, you should have a single file PAR-VERSION-ARCHNAME-PERLVERSION.par in the subdirectory 'par_files/'. You can now install PAR and its non-core dependencies on any machine that has the architecture of your development system (and a binary compatible perl version) using L<PAR::Dist> as follows:
+
+ perl -MPAR::Dist -einstall_par
+
+Provided that you run the command from within the directory containing the aforementioned .par file (and no other .par file).
+
+Since you might not even have PAR::Dist on the target machine, you can do this simple hack to get a basic installer:
+
+ perl -MPAR::Dist -e'open my $fh, "<", $INC{"PAR/Dist.pm"}; print <$fh>;
+ print "\npackage main;\nPAR::Dist::install_par(\@ARGV ? shift(\@ARGV)
+ : ());\n\n"'
+ > installer.pl
+
+(Again: Line breaks inserted for readability.) This looks for your installed copy of PAR::Dist, reads it, writes it to STDOUT and appends two lines of code: "package main;" and a call to PAR::Dist::install_par. By default, it will install any (single) .par file in the current directory. If supplied with a file name as first argument, it will install the specified file. It should have no non-core dependencies! So shipping the generated PAR-....par file and the installer.pl file to the target machine and running "perl installer.pl" should just magically install PAR and its dependencies for you.
+
+Now, this whole trick works equally well for any other modules. In fact, if you have PAR on the target machine, you needn't even install the modules in the .par file in order to use them! You can just add "use PAR 'foo-bar.par';" to your code and any modules will be loaded from the .par file as necessary. ("perl -MPAR=foo-bar.par your_script.pl" works, too.) The documentation of the PAR module has details on this.
+
+Finally, note that you can install L<PAR::Repository::Client> on the target machines and subsequently use PAR 0.951 and later to automatically fetch any unfulfilled dependencies from a (remote or local) repository:
+
+ use PAR { repository => 'http://my_local_secure_host/repository' };
+
+or:
+
+ use PAR { repository => 'file:///path/to/repository' };
+
+Details, again, in the L<PAR> documentation and in the L<PAR::Repository::Client> documentation.
+
+Answer from: Steffen Mueller, 16 August 2006
+
+=head2 If I try to compile my wxGlade generated script, it doesn't run. What's wrong?
+
+I<Note:> Is this still a problem?
+
+Comment out the line that starts with " unless (caller) ", and compile it again. Note that this is considered a bug; clearing the caller stack is a development in progress. See: L<http://par.perl.org/wiki/Development_in_progress>
+
+=head2 I get a link error '/usr/bin/ld: cannot find -lperl' during the 'make' step of the installation on Debian. What's wrong?
+
+This is a common problem when building compiled libraries on Debian distribution installations with the default perl package. To fix this problem, create a symbolic link from libperl.so.5.6.1 to libperl.so in /usr/lib (cd /usr/lib; ln -s libperl.so.5.6.1 libperl.so) and re-run the 'make' step of the installation. Or install libperl-dev
+
+=head2 I specify a .ico file with --icon for Win32, but the icon is still the black and white camel. What's wrong?
+
+Unlike Perl2EXE, which can use a standard 16-color bitmap as an application icon, PAR requires a true Windows icon file. Download a trial version of Microangelo and use that to create your .ico file. The latest Netpbm tools at L<http://netpbm.sourceforge.net/> has ppmtowinicon, which can tack a pbm and convert it to a windows icon. It is open source and has win32 ports.
+
+Gimp for Windows can also create Windows icon files L<http://gimp-win.sourceforge.net/>.
+
+=head2 I added a directory to my PAR file using "zip -r" or winzip, and then generated an executable from this PAR file, and the executable failed to run (IO error: reading header signature :..). What's wrong?
+
+As pointed out by Alan Stewart, zip adds a directory entry for the new directory, and it causes the PAR executable to fail. Just use :
+
+ zip -r -D hello.par my_dir/
+
+or the Archive::Zip::addTree as follows :
+
+ $zip->addTree( $root, $dest, sub { -f } )
+
+=head2 On what platforms can I run PAR? On what platforms will the resulting executable run?
+
+Win32 (95/98/ME/NT4/2K/XP), FreeBSD, Linux, AIX, Solaris, Darwin and Cygwin.
+
+The resulting executable will run on any platforms that supports the binary format of the generating platform.
+
+=head2 How do I extract my script out of packed executable?
+
+In other words, "I did a `pp foo.pl' and I lost foo.pl, how do I get it back?".
+
+The answer is to just use unzip/winzip/winrar/whatever to decompress the executable, treating it like a normal Zip file. You may need to rename the executable into a .zip extension first.
+
+=head2 Can PAR completely hide my source code?
+
+Not completely, but possible to a degree. Starting from version 0.76, PAR supports an input filter mechanism, which can be used to implement source obfuscators (or even product activation schemes).
+
+But if you are looking for 100% bulletproof way of hiding source code, it is not possible with any language. Learning Perl, 3rd Edition has this answer to offer (quoted with permission from Randal Schwartz):
+
+If you're wishing for an opaque binary, though, we have to tell
+you that they don't exist. If someone can install and run your
+program, they can turn it back into source code. Granted, this
+won't necessarily be the same source that you started with, but
+it will be some kind of source code. The real way to keep your
+secret algorithm a secret is, alas, to apply the proper number
+of attorneys; they can write a license that says "you can do
+this with the code, but you can't do that. And if you break our
+rules, we've got the proper number of attorneys to ensure that
+you'll regret it."
+
+Other than that, I would point you at L<PAR::Filter::Crypto>. Be sure to read the CAVEATS and WARNINGS sections of the documentation.
+
+=head2 On Windows XP, pp crashes saying that "par.exe has encountered a problem"
+
+This is believed to be fixed by PAR 0.76_99. The following answer applies to PAR 0.76 and earlier:
+
+You may be able to escape this problem by setting some executables to Windows 95 compatibility mode. Specifically, find "parl.exe" (probably in "C:\perl\5.8.0\bin") using Windows Explorer, and right-click on it and choose "Properties". Choose the "Compatibility" tab and tick the box for "Run this program with compatibility mode for" and check that the dropdown shows "Windows 95". Then click OK.
+
+Now you can hopefully run pp as normal to generate an EXE. Before you can run the generated EXE, you'll need to set its compatibility mode too, in the same way as you did for parl.exe.
+
+This workaround is known not to work in all cases, and the developers are working on a solution to the problem. See these posts for more info:
+
+L<http://www.mail-archive.com/par@perl.org/msg00423.html>,
+L<http://www.mail-archive.com/par@perl.org/msg00435.html>,
+L<http://www.mail-archive.com/par@perl.org/msg00573.html>,
+L<http://www.mail-archive.com/par@perl.org/msg00670.html>
+
+=head2 Perl Tk tips
+
+On Windows XP start your script with
+
+ use strict; use Encode::Unicode; use Tk;
+
+Some widgets use xbm bitmaps which don't get picked up by PAR. The error is:
+
+ couldn't read bitmap file "": No such file or directory
+ error reading bitmap file "" at Tk/Widget.pm line 205.
+ at Tk/Widget.pm line 203
+
+Fix is to find the missing xbm files (perl -V tells you where to start looking) and add them to the executable eg
+
+copy missing xbm files to script directory then:
+
+ % pp --add cbxarrow.xbm --add arrowdownwin.xbm -o test test.pl
+
+=head2 Problem with Win32::Perms and Perms.DLL
+
+With a script my.pl using Win32::Perms, pp -o my.exe my.pl you may have:
+
+ Can't locate loadable object for module Win32::Perms in @INC
+ (@INC contains: CODE(0xb97eec) CODE(0xc8a99c) .)
+ at ../blib/lib/PAR/Heavy.pm line 78
+
+In fact the dll is Perms.DLL wit DLL in capital letters. That's the problem. The bootstrap function of PAR in the Dynaloader module fails looking for Perms.dll in the table of dlls which contains only Perms.DLL. And so the solution is just rename Perms.DLL in Perms.dll and do pp -o my.exe my.pl ... and everything goes right.
+
+=head2 Under Win32, a pp packed executable has trouble executing other perl scripts or pp packed executable
+
+I<Note:> Is this still current?
+
+When running on a Win32 system, if a perl script is packed with pp and invokes another Perl script or pp packed executable, either with system() or backticks, the invoked program runs with the copy of perl5x.dll already loaded into memory. If the calling executable was packed with "pp -d", the perl5x.dll is the one from the installed perl bin directory. Otherwise, it is the one packed with the executable. The perl5x.dll from the bin dir knows the @INC paths for the installed libraries; the one in the executable does not. Because of this, a program packed without "-d" calling a program with packed with "-d" or calling perl.exe to run a plain Perl script may fail. This is a Win32 limitation.
+
+=head2 How can I make a .exe that runs with no console window under Windows?
+
+Use the --gui switch, ie
+
+ % pp --gui -o file.exe file.pl
+
+I found that this is not documented on all versions of pp ... Some versions have a more complete doc than others when you type "pp -h" etc. (This should be reasonably documented now.)
+
+When searching for an answer to this myself, I found many references to using "exetype" ... it comes as a .bat with ActivePerl, or you can find an exetype.pl from several places. You run "exetype file.exe [WINDOWS|CONSOLE]". This worked, I think, but still did not achieve the desired result on my PAR executable. While the exe itself did not generate a console window, par.exe (which was invoked in my exe somewhere) DID generate a console window, with a titlebar saying "par.exe <strange-looking path to file in temp dir>", whereas before changing the console window title bar just displayed the path to my .exe.
+
+=head2 How can I change the icon of the generated .exe file under Windows?
+
+There is another not-completely-documented switch that only works on windows, –icon MyIcon.ico. So just use this:
+
+ % pp --icon "c:\path to\MyIcon.ico" -o file.exe file.pl.
+
+(This should also be documented now?)
+
+=head2 The command line parameters (@ARGV) of a pp-ed binary called from another pp-ed binary are missing or broken. What the...?
+
+This was a bug in releases up to and incuding PAR-0.90. Please upgrade to PAR 0.91 or later and the problem will go away.
+
+=head2 I want to include a pp-ed binary in an RPM package. How can I make this work?
+
+The binary executables outputted by pp (on Linux) are not valid ELF binaries because it basically attaches a zip archive to the binary loader and does not modify the ELF headers to reflect that. When building an RPM archive, the validity of the ELF headers is checked by default. This can result in problems when packaging pp-ed binaries in RPM archives.
+
+Scott McBrien helped track down what can be done to get this to work:
+
+ [I]t appears that the RPM archive that is generated gets a list of
+ the MD5 sums for components of the executable file calculated by
+ prelink. By disabling prelink, it fixed the problem; in my RPM .spec
+ file:
+ %define __prelink_undo_cmd %{nil}
+
+After quite some time, it seems like the smart folks at Redhat found the culprit. I'm glad *they* did, because I wouldn't have:
+
+ It appears that we found a solution that works. It like the pp
+ executables are already stripped, so we don't want rpm stripping them
+ again, which, of course, renders them useless.
+
+ In this case, we added the following lines to the spec file to keep rpm
+ from running the strip process and not produce debuginfo packages:
+
+ %define __spec_install_post :
+ %define debug_package %{nil}
+
+ Don't forget to add the ":" character to __spec_install_post as above or
+ this won't work.
+
+Much praise to all who helped track this down! The discussion can be found in the following RT tickets:
+L<http://rt.cpan.org/Public/Bug/Display.html?id=18536 #18536> and L<http://rt.cpan.org/Public/Bug/Display.html?id=19609 #19609>.
+
+-- Steffen Mueller, 22 July 2006
+
+=head2 How can I package Wx applications?
+
+Have a look at the separately maintained L<Wx::Perl::Packager> module.
+
+-- Steffen Mueller, 3 July 2006
+
+=head2 How can I package Catalyst web applications?
+
+Catalyst has some builtin PAR support. I found the following URL to be very helpful:
+
+L<http://catalyst.infogami.com/cookbook/par>.
+
+-- Steffen Mueller, 21 July 2006
+
+=head2 The resulting files are huge! How can I reduce the size of the output file?
+
+The executables generated by pp generally contain a copy of your Perl shared libraries, the Perl core modules and any module dependencies your packaged application may have. That is a lot. Sometimes, PAR packages too much. It adheres to the philosophy of rather making the application work than generating a streamlined executable. If you want to optimize this, you will have to do so by excluding specific modules.
+
+Chris Dolan's recent post to the PAR mailing list explains this well. Quoting Chris: (L<http://www.nntp.perl.org/group/perl.par/2490>)
+
+ [...]
+ I've found a few tricks that can help a lot:
+
+ * If you know the target platform has Perl pre-installed (e.g. Mac OS X)
+ then use the "--dependent" flag. This skips all of the core modules,
+ yielding a much smaller executable.
+
+ One significant caveat is moving to older systems. For example,
+ Mac OS X 10.2 had Perl 5.6.0 which has 146 fewer core modules than
+ Perl 5.8.6 which shipped with Mac OS X 10.4, and (even more significantly)
+ is binary-incompatible with any extra XS modules added from CPAN.
+ Other platforms can be even harder to predict.
+
+ * Watch for modules that pull in lots of dependencies
+
+ A good example is DBI. If your program uses DBI, then Module::ScanDeps
+ pulls in ALL of the DBD::* modules (some of which are large) installed on
+ your system, because it cannot realistically parse the DBI->connect()
+ arguments which specify which database drivers are actually needed.
+ In one of my MySQL-based applications, I use this invocation of PAR:
+
+ pp -X DBD::SQLite -X DBD::CSV -X DBD::File -X DBD::Excel
+
+ which saves quite a few bytes, because both DBD::SQLite and DBD::Excel
+ have lots of CPAN dependencies. The actual list if DBD::* modules you
+ need to exclude depends on your system. Here's a short command that will
+ reveal all DBD::* modules on a unix-like system:
+
+ perl -MModule::ScanDeps -le'print for map {"DBD/".$_->{name}} Module::ScanDeps::_glob_in_inc("DBD")'
+
+ Another smaller example is SOAP::Transport::* where most installations
+ only need SOAP::Transport::HTTP.
+ [...]
+
+Similar techniques can be applied when a module makes use of L<Module::Pluggable> for plugins.
+
+Finally, there is a PAR filter available as a separate distribution on CPAN which compresses the source code as much as possible by first parsing it using PPI and then spitting out a reduced functional equivalent:
+L<PAR::Filter::Squish>.
+
+-- Steffen Mueller, August 2006
+
+=head2 How do I use Win32::GUI::SplashScreen with PAR?
+
+When using pp to package an application that uses Win32::GUI::SplashScreen, try adding the splashscreen bitmap manually as suggested in the Win32::GUI::SplashScreen docs:
+
+ pp -a SPLASHFILE.bmp -o xxx.exe xxx.pl
+
+=head2 The Perl Packager scripts says that it can create executable that runs in same OS. Can I use it to create Win32 binary with linux machine? Or what should I use to create Win32 executable binary on linux from my script?
+
+It is not possible to create stand-alone binaries for different platform than what you are currently running on. This is a generally hard problem since you would have to cross-compile all XS modules and perl itself. Not nice.
+
+For example, if you would like to develop an application on Linux and ship it for both Linux/x86 and Win32/x86, it works well to set up a Virtual Machine with a Windows (XP or 2000 or whatever) and a Perl installation. On that machine, use PAR/pp to package your application for Win32.
+
+See also the question "On what platforms can I run PAR? On what platforms will the resulting executable run?".
+
+-- Steffen Mueller, 2 November 2006
+
+=head1 SEE ALSO
+
+L<PAR>, L<PAR::Tutorial>
+
+=head1 AUTHORS
+
+Audrey Tang E<lt>cpan@audreyt.orgE<gt>,
+Steffen Mueller E<lt>smueller@cpan.orgE<gt>
+
+L<http://par.perl.org/> is the official PAR website. You can write
+to the mailing list at E<lt>par@perl.orgE<gt>, or send an empty mail to
+E<lt>par-subscribe@perl.orgE<gt> to participate in the discussion.
+
+Please submit bug reports to E<lt>bug-par@rt.cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+Copyright 2003-2008 by Audrey Tang E<lt>cpan@audreyt.orgE<gt>.
+
+This document is free documentation; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/Heavy.pm b/Master/tlpkg/tlperl.straw/lib/PAR/Heavy.pm
new file mode 100755
index 00000000000..e05e5d1ebce
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/Heavy.pm
@@ -0,0 +1,204 @@
+package PAR::Heavy;
+$PAR::Heavy::VERSION = '0.11';
+
+=head1 NAME
+
+PAR::Heavy - PAR guts
+
+=head1 SYNOPSIS
+
+(internal use only)
+
+=head1 DESCRIPTION
+
+No user-serviceable parts inside.
+
+=cut
+
+########################################################################
+# Dynamic inclusion of XS modules
+
+my ($bootstrap, $dl_findfile); # Caches for code references
+my ($dlext); # Cache for $Config{dlext}
+my ($cache_key); # The current file to find
+my $is_insensitive_fs = (
+ -s $0
+ and (-s lc($0) || -1) == (-s uc($0) || -1)
+ and (-s lc($0) || -1) == -s $0
+);
+
+# Adds pre-hooks to Dynaloader's key methods
+sub _init_dynaloader {
+ return if $bootstrap;
+ return unless eval { require DynaLoader; DynaLoader::dl_findfile(); 1 };
+
+ $bootstrap = \&DynaLoader::bootstrap;
+ $dl_findfile = \&DynaLoader::dl_findfile;
+
+ local $^W;
+ *{'DynaLoader::dl_expandspec'} = sub { return };
+ *{'DynaLoader::bootstrap'} = \&_bootstrap;
+ *{'DynaLoader::dl_findfile'} = \&_dl_findfile;
+}
+
+# Return the cached location of .dll inside PAR first, if possible.
+sub _dl_findfile {
+ return $FullCache{$cache_key} if exists $FullCache{$cache_key};
+ if ($is_insensitive_fs) {
+ # We have a case-insensitive filesystem...
+ my ($key) = grep { lc($_) eq lc($cache_key) } keys %FullCache;
+ return $FullCache{$key} if defined $key;
+ }
+ return $dl_findfile->(@_);
+}
+
+# Find and extract .dll from PAR files for a given dynamic module.
+sub _bootstrap {
+ my (@args) = @_;
+ my ($module) = $args[0] or return;
+
+ my @modparts = split(/::/, $module);
+ my $modfname = $modparts[-1];
+
+ $modfname = &DynaLoader::mod2fname(\@modparts)
+ if defined &DynaLoader::mod2fname;
+
+ if (($^O eq 'NetWare') && (length($modfname) > 8)) {
+ $modfname = substr($modfname, 0, 8);
+ }
+
+ # XXX: Multi-platform .dll support in PARs needs better than $Config.
+ # FIXME: Config is always loaded by PAR.pm!
+ $dlext ||= do {
+ require Config;
+ (defined %Config::Config) ? $Config::Config{dlext} : '';
+ };
+
+ my $modpname = join((($^O eq 'MacOS') ? ':' : '/'), @modparts);
+ my $file = $cache_key = "auto/$modpname/$modfname.$dlext";
+
+ if ($FullCache{$file}) {
+ # TODO: understand
+ local $DynaLoader::do_expand = 1;
+ return $bootstrap->(@args);
+ }
+
+ my $member;
+ # First, try to find things in the peferentially loaded PARs:
+ $member = PAR::_find_par_internals([@PAR::PAR_INC], undef, $file, 1)
+ if defined &PAR::_find_par_internals;
+
+ # If that failed to find the dll, let DynaLoader (try or) throw an error
+ unless ($member) {
+ my $filename = eval { $bootstrap->(@args) };
+ return $filename if not $@ and defined $filename;
+
+ # Now try the fallback pars
+ $member = PAR::_find_par_internals([@PAR::PAR_INC_LAST], undef, $file, 1)
+ if defined &PAR::_find_par_internals;
+
+ # If that fails, let dynaloader have another go JUST to throw an error
+ # While this may seem wasteful, nothing really matters once we fail to
+ # load shared libraries!
+ unless ($member) {
+ return $bootstrap->(@args);
+ }
+ }
+
+ $FullCache{$file} = _dl_extract($member, $file);
+
+ # Now extract all associated shared objs in the same auto/ dir
+ # XXX: shouldn't this also set $FullCache{...} for those files?
+ my $first = $member->fileName;
+ my $path_pattern = $first;
+ $path_pattern =~ s{[^/]*$}{};
+ if ($PAR::LastAccessedPAR) {
+ foreach my $member ( $PAR::LastAccessedPAR->members ) {
+ next if $member->isDirectory;
+
+ my $name = $member->fileName;
+ next if $name eq $first;
+ next unless $name =~ m{^/?\Q$path_pattern\E\/[^/]*\.\Q$dlext\E[^/]*$};
+ $name =~ s{.*/}{};
+ _dl_extract($member, $file, $name);
+ }
+ }
+
+ local $DynaLoader::do_expand = 1;
+ return $bootstrap->(@args);
+}
+
+sub _dl_extract {
+ my ($member, $file, $name) = @_;
+
+ require File::Spec;
+ require File::Temp;
+
+ my ($fh, $filename);
+
+ # fix borked tempdir from earlier versions
+ if ($ENV{PAR_TEMP} and -e $ENV{PAR_TEMP} and !-d $ENV{PAR_TEMP}) {
+ unlink($ENV{PAR_TEMP});
+ mkdir($ENV{PAR_TEMP}, 0755);
+ }
+
+ if ($ENV{PAR_CLEAN} and !$name) {
+ ($fh, $filename) = File::Temp::tempfile(
+ DIR => ($ENV{PAR_TEMP} || File::Spec->tmpdir),
+ SUFFIX => ".$dlext",
+ UNLINK => ($^O ne 'MSWin32' and $^O !~ /hpux/),
+ );
+ ($filename) = $filename =~ /^([\x20-\xff]+)$/;
+ }
+ else {
+ $filename = File::Spec->catfile(
+ ($ENV{PAR_TEMP} || File::Spec->tmpdir),
+ ($name || ($member->crc32String . ".$dlext"))
+ );
+ ($filename) = $filename =~ /^([\x20-\xff]+)$/;
+
+ open $fh, '>', $filename or die $!
+ unless -r $filename and -e _
+ and -s _ == $member->uncompressedSize;
+ }
+
+ if ($fh) {
+ binmode($fh);
+ $member->extractToFileHandle($fh);
+ close $fh;
+ chmod 0755, $filename;
+ }
+
+ return $filename;
+}
+
+1;
+
+=head1 SEE ALSO
+
+L<PAR>
+
+=head1 AUTHORS
+
+Audrey Tang E<lt>cpan@audreyt.orgE<gt>
+
+L<http://par.perl.org/> is the official PAR website. You can write
+to the mailing list at E<lt>par@perl.orgE<gt>, or send an empty mail to
+E<lt>par-subscribe@perl.orgE<gt> to participate in the discussion.
+
+Please submit bug reports to E<lt>bug-par@rt.cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+Copyright 2002-2009 by Audrey Tang
+E<lt>cpan@audreyt.orgE<gt>.
+
+Copyright 2006-2009 by Steffen Mueller
+E<lt>smueller@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client.pm b/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client.pm
new file mode 100755
index 00000000000..55460c65ba2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client.pm
@@ -0,0 +1,1025 @@
+package PAR::Repository::Client;
+
+use 5.006;
+use strict;
+use warnings;
+
+our $VERSION = '0.25';
+
+# list compatible repository versions
+# This is a list of numbers of the form "\d+.\d".
+# Before comparison, any versions are reduced to the
+# first digit after the period.
+# Incompatible changes require a change in version in the
+# first digit after the period.
+our $Compatible_Versions = {
+ '0.1' => 1,
+ '0.2' => 1,
+};
+
+use constant MODULES_DBM_FILE => 'modules_dists.dbm';
+use constant SYMLINKS_DBM_FILE => 'symlinks.dbm';
+use constant SCRIPTS_DBM_FILE => 'scripts_dists.dbm';
+use constant DEPENDENCIES_DBM_FILE => 'dependencies.dbm';
+use constant REPOSITORY_INFO_FILE => 'repository_info.yml';
+use constant DBM_CHECKSUMS_FILE => 'dbm_checksums.txt';
+
+use base 'PAR::Repository::Query',
+ 'PAR::Repository::Client::Util',
+ 'PAR::Repository::Client::DBM';
+
+require PAR::Repository::Client::HTTP;
+require PAR::Repository::Client::Local;
+
+use Carp qw/croak/;
+use File::Spec;
+require version;
+require Config;
+require PAR::Dist;
+require DBM::Deep;
+require Archive::Zip;
+require File::Temp;
+require File::Copy;
+require File::Path;
+require YAML::Tiny;
+require PAR;
+
+=head1 NAME
+
+PAR::Repository::Client - Access PAR repositories
+
+=head1 SYNOPSIS
+
+ use PAR::Repository::Client;
+
+ my $client = PAR::Repository::Client->new(
+ uri => 'http://foo/repository',
+ http_timeout => 20, # default is 180s
+ );
+
+ # This is happening at run-time, of course:
+ # But calling import from your namespace
+ $client->use_module('Foo::Bar') or die $client->error;
+
+ $client->require_module('Bar::Baz') or die $client->error;
+
+ $client->run_script('foo', 'arg1', 'arg2') or die $client->error;
+ # should not be reached since we ran 'foo'!
+
+=head1 DESCRIPTION
+
+This module represents the client for PAR repositories as
+implemented by the L<PAR::Repository> module.
+
+Chances are you should be looking at the L<PAR> module
+instead. Starting with version 0.950, it supports
+automatically loading any modules that aren't found on your
+system from a repository. If you need finer control than that,
+then this module is the right one to use.
+
+You can use this module to access repositories in one of
+two ways: On your local filesystem or via HTTP(S?). The
+access methods are implemented in
+L<PAR::Repository::Client::HTTP> and L<PAR::Repository::Client::Local>.
+Any common code is in this module.
+
+L<PAR::Repository::Query> implements the querying interface. The methods
+described in that module's documentation can be called on
+C<PAR::Repository::Client> objects.
+
+=head2 PAR REPOSITORIES
+
+For a detailed discussion of the structure of PAR repositories, please
+have a look at the L<PAR::Repository> distribution.
+
+A PAR repository is, well, a repository of F<.par> distributions which
+contain Perl modules and scripts. You can create F<.par> distributions
+using the L<PAR::Dist> module or the L<PAR> module itself.
+
+If you are unsure what PAR archives are, then have a look
+at the L<SEE ALSO> section below, which points you at the
+relevant locations.
+
+=head1 PUBLIC METHODS
+
+Following is a list of class and instance methods.
+(Instance methods until otherwise mentioned.)
+
+=cut
+
+=head2 new
+
+Creates a new PAR::Repository::Client object. Takes named arguments.
+
+Mandatory parameter:
+
+I<uri> specifies the URI of the repository to use. Initially, http and
+file URIs will be supported, so you can access a repository locally
+using C<file:///path/to/repository> or just with C</path/to/repository>.
+HTTP accessible repositories can be specified as C<http://foo> and
+C<https://foo>.
+
+Optional parameters:
+
+ auto_install
+ auto_upgrade
+ static_dependencies
+ cache_dir
+ private_cache_dir
+ architecture
+ perl_version
+ installation_targets
+ http_timeout
+ checksums_timeout
+
+If the optional I<auto_install> parameter is set to a true value
+(default: false), any F<.par> file that is about to be loaded is
+installed on the local system instead. In this context, please
+refer to the C<install_module()> method.
+
+Similar to I<auto_install>, the I<auto_upgrade> parameter installs
+a distribution that is about to be loaded - but only if the
+specified module does not exist on the local system yet or is outdated.
+
+You cannot set both I<auto_install> and I<auto_upgrade>. If you do,
+you will get a fatal error.
+
+If you set the C<static_dependencies> option to a true value,
+then the inter-distribution dependency information that is retrieved
+from the repository will be used to recursively apply your requested
+action to all dependencies. Essentially, this makes the C<install_module>
+method act like a real package manager similar to PPM.
+In contrast, the default behaviour is to fetch distributions only
+on demand and potentially recursively.
+
+In order to control where the modules are installed to, you can
+use the C<installation_targets> method.
+
+The optional C<architecture> and C<perl_version> parameters
+can be used to specify the architecture and perl version that are
+used to choose the right PAR archives from the repository.
+Defaults to your running perl, so
+please read the comments on C<architecture> and C<perl_version>
+below before blindly using this.
+
+Upon client creation, the repository's version is validated to be
+compatible with this version of the client.
+
+You may specify a C<http_timeout> in seconds.
+
+The C<cache_dir>
+parameter can be used to set the directory where you want the downloaded
+files to reside. It defaults to the C<$ENV{PAR_TEMP}> directory or
+otherwise the C<par> subdirectory of your system's temporary directory.
+If you set C<cache_dir> to something other than the default, the downloaded
+files should be automatically cached when the HTTP transport layer is
+used as C<LWP::mirror()> only checks for updates.
+
+By default, each repository client uses its own private cache directory.
+If you specify C<private_cache_dir =E<gt> 0>, caching will be mostly
+disabled. While a C<private_cache_dir> and caching are the default,
+if you explicitly set a different cache directory with C<cach_dir>,
+you also have to explicitly flag it as a repository-private cache directory
+(aka re-enable caching) with C<private_cache_dir =E<gt> 1>.
+
+By default, it is assumed that the package indices do not change all that
+often. Therefore, there is a default delay of 30 seconds before their
+checksums are re-checked as this may require a network request. You can
+specify in seconds or disable the delay using the C<checksums_timeout =E<gt> XX>
+option.
+
+=cut
+
+sub new {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+
+ croak(__PACKAGE__."->new() takes an even number of arguments.")
+ if @_ % 2;
+ my %args = @_;
+
+ croak(__PACKAGE__."->new() needs an 'uri' argument.")
+ if not defined $args{uri};
+
+ my $uri = $args{uri};
+
+ my $obj_class = 'Local';
+ if ($uri =~ /^https?:\/\//) {
+ $obj_class = 'HTTP';
+ }
+
+ # make sure there is a protocol
+ if ($uri !~ /^\w+:\/\//) {
+ $uri = "file://$uri";
+ }
+
+ if ($args{auto_install} and $args{auto_upgrade}) {
+ croak(__PACKAGE__."->new(): You can only specify one of 'auto_upgrade' and 'auto_install'");
+ }
+
+ my $self = bless {
+ # the repository uri
+ uri => $uri,
+
+ # The last error message
+ error => '',
+
+ # The hash ref of checksums for checking whether we
+ # need to update the dbms
+ checksums => undef,
+ supports_checksums => undef,
+ checksums_timeout => (defined($args{checksums_timeout}) ? $args{checksums_timeout} : 30),
+ last_checksums_refresh => 0,
+
+ # the modules- and scripts dbm storage
+ # both the local temp file for cleanup
+ # and the actual tied hash
+ modules_dbm_temp_file => undef,
+ modules_dbm_hash => undef,
+ scripts_dbm_temp_file => undef,
+ scripts_dbm_hash => undef,
+ dependencies_dbm_temp_file => undef,
+ dependencies_dbm_hash => undef,
+
+ info => undef, # used for YAML info caching
+ auto_install => $args{auto_install},
+ auto_upgrade => $args{auto_upgrade},
+ static_dependencies => $args{static_dependencies},
+ installation_targets => {}, # see PAR::Dist
+ perl_version => (defined($args{perl_version}) ? $args{perl_version} : $Config::Config{version}),
+ architecture => (defined($args{architecture}) ? $args{architecture} : $Config::Config{archname}),
+ cache_dir => $args{cache_dir},
+ } => "PAR::Repository::Client::$obj_class";
+
+ # set up the cache dir
+ if (
+ not defined $self->{cache_dir}
+ and (not exists $args{private_cache_dir} or $args{private_cache_dir}) # either default or forced
+ ) {
+ $self->{cache_dir} = $self->generate_private_cache_dir();
+ $self->{private_cache_dir} = 1;
+ }
+ elsif (not defined $self->{cache_dir}) {
+ $self->{cache_dir} = defined($ENV{PAR_TEMP})
+ ? $ENV{PAR_TEMP}
+ : $self->generate_private_cache_dir(); # if there is no PAR_TEMP, use a private cache
+ $self->{private_cache_dir} = defined($ENV{PAR_TEMP});
+ }
+ else {
+ # explicit cache dir
+ $self->{private_cache_dir} = 0;
+ }
+
+ if (!-d $self->{cache_dir}) {
+ $self->{cleanup_cache_dir} = 1;
+ File::Path::mkpath($self->{cache_dir});
+ }
+
+ # for inter-run caching, calculate the checksums of the local files
+ $self->{checksums} = $self->_calculate_cache_local_checksums();
+
+ $self->_init(\%args);
+
+ $self->validate_repository()
+ or croak $self->{error};
+
+ return $self;
+}
+
+
+
+=head2 require_module
+
+First argument must be a package name (namespace) to require.
+The method scans the repository for distributions that
+contain the specified package.
+
+When one or more distributions are found, it determines which
+distribution to use using the C<prefered_distribution()> method.
+
+Then, it fetches the prefered F<.par> distribution from the
+repository and opens it using the L<PAR> module. Finally,
+it loads the specified module from the downloaded
+F<.par> distribution using C<require()>.
+
+Returns 1 on success, the empty list on failure. In case
+of failure, an error message can be obtained with the
+C<error()> method.
+
+=cut
+
+sub require_module {
+ my $self = shift;
+ my $namespace = shift;
+ $self->{error} = undef;
+
+ # fetch the module, load preferably (fallback => 0)
+ my $file = $self->get_module($namespace, 0);
+
+ eval "require $namespace;";
+ if ($@) {
+ $self->{error} = "An error occurred while executing 'require $namespace;'. Error: $@";
+ return();
+ }
+
+ return 1;
+}
+
+
+=head2 use_module
+
+Works the same as the C<require_module> method except that
+instead of only requiring the specified module, it also
+calls the C<import> method if it exists. Any arguments to
+this methods after the package to load are passed to the
+C<import> call.
+
+=cut
+
+sub use_module {
+ my $self = shift;
+ my $namespace = shift;
+ my @args = @_;
+ $self->{error} = undef;
+
+ my ($pkg) = caller();
+
+ my $required = $self->require_module($namespace);
+ return() if not $required; # error set by require_module
+
+ eval "package $pkg; ${namespace}->import(\@args) if ${namespace}->can('import');";
+ if ($@) {
+ $self->{error} = "An error occurred while executing 'package $pkg; ${namespace}->import(\@args);'. Error: $@";
+ return();
+ }
+ return 1;
+}
+
+=head2 get_module
+
+First parameter must be a namespace, second parameter may be
+a boolean indicating whether the PAR is a fallback-PAR or one
+to load from preferably. (Defaults to false which means
+loading preferably.)
+
+Searches for a specified namespace in the repository and downloads
+the corresponding PAR distribution. Automatically loads PAR
+and appends the downloaded PAR distribution to the list of
+PARs to load from. If auto-installation or auto-upgrading was
+enabled, the contents of the PAR distribution will
+be installed in addition to loading the PAR.
+
+Returns the name of the local
+PAR file. Think of this as C<require_module> without actually
+doing a C<require()> of the module.
+
+=cut
+
+
+sub get_module {
+ my $self = shift;
+ my $namespace = shift;
+ my $fallback = shift;
+
+ $self->{error} = undef;
+
+ my @local_par_files;
+ if ($self->{auto_install}) {
+ @local_par_files = $self->install_module($namespace);
+ }
+ elsif ($self->{auto_upgrade}) {
+ @local_par_files = $self->upgrade_module($namespace);
+ }
+ elsif ($self->{static_dependencies}) {
+ my $deps = $self->get_module_dependencies($namespace);
+ return() if not ref $deps;
+
+ foreach my $dep_dist (@$deps) {
+ my $local_par_file = $self->_fetch_dist($dep_dist);
+ return() if not defined $local_par_file;
+ push @local_par_files, $local_par_file;
+ }
+ }
+ else {
+ my $dist = $self->_module2dist($namespace);
+ return() if not defined $dist;
+ my $local_par_file = $self->_fetch_dist($dist);
+ return() if not defined $local_par_file;
+ push @local_par_files, $local_par_file;
+ }
+ return() if not @local_par_files;
+
+ foreach my $local_par_file ($fallback ? @local_par_files : reverse(@local_par_files)) {
+ PAR->import( { file => $local_par_file, fallback => ($fallback?1:0) } );
+ }
+
+ return shift @local_par_files; # FIXME should this return the full array?
+}
+
+
+=head2 install_module
+
+Works the same as C<get_module> but instead of loading the
+F<.par> file using PAR, it installs its contents using
+L<PAR::Dist>'s C<install_par()> routine.
+
+First argument must be the namespace of a module to install.
+
+Note that this method always installs the whole F<.par> distribution
+that contains the newest version of the specified namespace and not
+only the F<.pm> file from the distribution which contains the
+specified namespace.
+
+Returns the name of the local F<.par> file which was installed or
+the empty list on failure.
+
+=cut
+
+sub install_module {
+ my $self = shift;
+ my $namespace = shift;
+
+ $self->{error} = undef;
+
+ my @local_par_files;
+ if ($self->{static_dependencies}) {
+ my $deps = $self->get_module_dependencies($namespace);
+ return() if not ref $deps;
+
+ foreach my $dep_dist (@$deps) {
+ my $local_par_file = $self->_fetch_dist($dep_dist);
+ return() if not defined $local_par_file;
+ push @local_par_files, $local_par_file;
+ }
+ }
+ else {
+ push @local_par_files, $self->_fetch_module($namespace);
+ }
+ return() if not @local_par_files;
+
+ foreach my $local_par_file (@local_par_files) {
+ PAR::Dist::install_par(
+ %{$self->installation_targets()},
+ dist => $local_par_file,
+ ) or return ();
+ }
+
+ return shift @local_par_files; # FIXME should this return the whole array?
+}
+
+
+=head2 upgrade_module
+
+Works the same as C<get_module> but instead of loading the
+F<.par> file using PAR, it checks whether the local version of
+the module is current. If it isn't, the distribution containing
+the newest version of the module is installed using
+L<PAR::Dist>'s C<install_par()> routine.
+
+First argument must be the namespace of a module to upgrade.
+
+Note that this method always installs the whole F<.par> distribution
+that contains the newest version of the specified namespace and not
+only the F<.pm> file from the distribution which contains the
+specified namespace.
+
+Returns the name of the local F<.par> file which was installed or
+the empty list on failure or if the local version of the module is
+already current.
+
+I<CAVEAT:> This will first try to require a locally installed version
+of the module. If that succeeds, its version is compared to the
+highest version in the repository. If an upgrade is necessary,
+the new module will be installed. If the module hadn't been found
+locally before the installation, it will be loaded. If it was
+found locally (and thus loaded), C<IT WILL NOT BE RELOADED SO
+YOU GET THE NEW VERSION>.
+This is because reloading of modules is not a simple issue.
+If you need this behaviour, you can get it manually using L<Class::Unload>
+and another require.
+
+=cut
+
+sub upgrade_module {
+ my $self = shift;
+ my $namespace = shift;
+
+ $self->{error} = undef;
+
+ # get local version
+ my $local_version;
+ local @PAR::PriorityRepositoryObjects = (); # do not load from remote!
+ local @PAR::RepositoryObjects = (); # do not load from remote!
+ local @PAR::UpgradeRepositoryObjects = ();
+ eval "require ${namespace}; \$local_version = ${namespace}->VERSION;";
+ $local_version = version->new($local_version) if defined($local_version) and not eval {$local_version->isa('version')};
+
+ # no local version found. Install from repo
+ if (not defined $local_version) {
+ return $self->install_module($namespace);
+ }
+
+ # The following code is all for determining the newest
+ # version in the repository.
+ my ($modh) = $self->modules_dbm;
+ if (not defined $modh) {
+ return();
+ }
+
+ my $dists = $modh->{$namespace};
+ if (not defined $dists) {
+ $self->{error} = "Could not find module '$namespace' in the repository.";
+ return();
+ }
+
+ my $dist = $self->prefered_distribution($namespace, $dists);
+ if (not defined $dist) {
+ $self->{error} = "PAR: Could not find a distribution for package '$namespace'";
+ return();
+ }
+
+ my $repo_version = $modh->{$namespace}{$dist};
+ $repo_version = version->new($repo_version) if not eval {$repo_version->isa('version')};
+
+ if ($repo_version > $local_version) {
+ return $self->install_module($namespace);
+ }
+
+ return();
+}
+
+
+=head2 run_script
+
+First parameter must be a script name.
+
+Searches for a specified script in the repository and downloads
+the corresponding PAR distribution. Automatically loads PAR
+and appends the downloaded PAR distribution to the list of
+PARs to load from.
+
+Then, it runs the script. It does not return unless some error occurrs.
+
+If either I<auto_install> or I<auto_upgrade> were specified as
+parameters to the constructor, the downloaded PAR distribution will
+be installed regardless of the versions of any previously installed
+scripts. This differs from the behaviour for mdoules.
+
+=cut
+
+sub run_script {
+ my $self = shift;
+ my $script = shift;
+
+ my @local_par_files;
+ if ($self->{static_dependencies}) {
+ my $deps = $self->get_script_dependencies($script);
+ return() if not ref $deps;
+
+ foreach my $dep_dist (@$deps) {
+ my $local_par_file = $self->_fetch_dist($dep_dist);
+ return() if not defined $local_par_file;
+ push @local_par_files, $local_par_file;
+ }
+ }
+ else {
+ my $dist = $self->_script2dist($script);
+ return() unless defined $dist;
+ my $local_par_file = $self->fetch_par($dist);
+ return() unless defined $local_par_file;
+ push @local_par_files, $local_par_file;
+ }
+ return() if not @local_par_files;
+
+ if ($self->{auto_install}) {
+ foreach my $local_par_file (@local_par_files) {
+ PAR::Dist::install_par(
+ %{ $self->installation_targets() },
+ dist => $local_par_file,
+ ) or return ();
+ }
+ }
+ elsif ($self->{auto_upgrade}) {
+ # FIXME This is not the right way to do it!
+ foreach my $local_par_file (@local_par_files) {
+ PAR::Dist::install_par(
+ %{ $self->installation_targets() },
+ dist => $local_par_file,
+ ) or return ();
+ }
+ }
+
+ my $script_par = shift @local_par_files;
+ foreach my $local_par_file (@local_par_files) {
+ PAR->import( { file => $local_par_file } );
+ }
+
+ PAR->import( { file => $script_par, run => $script } );
+
+ # doesn't happen!?
+ return 1;
+}
+
+
+=head2 get_module_dependencies
+
+Given a module name, determines the correct distribution in
+the repository that supplies the module. Returns a reference
+to an array containing that distribution and all distributions
+it depends on. The distribution that contains the given module
+is the first in the array.
+
+Returns the empty list on failure.
+
+=cut
+
+sub get_module_dependencies {
+ my $self = shift;
+ my $namespace = shift;
+ $self->{error} = undef,
+
+ my $dist = $self->_module2dist($namespace);
+ return() if not defined $dist;
+
+ my $deps = $self->_resolve_static_dependencies($dist);
+ return() if not ref $deps;
+ unshift @$deps, $dist;
+
+ return $deps;
+}
+
+
+=head2 get_script_dependencies
+
+Given a script name, determines the correct distribution in
+the repository that supplies the script. Returns a reference
+to an array containing that distribution and all distributions
+it depends on. The distribution that contains the given script
+is the first in the array.
+
+Returns the empty list on failure.
+
+=cut
+
+sub get_script_dependencies {
+ my $self = shift;
+ my $script = shift;
+ $self->{error} = undef,
+
+ my $dist = $self->_script2dist($script);
+ return() if not defined $dist;
+
+ my $deps = $self->_resolve_static_dependencies($dist);
+ return() if not ref $deps;
+ unshift @$deps, $dist;
+
+ return $deps;
+}
+
+
+=head2 installation_targets
+
+Sets the installation targets for modules and scripts if any arguments are
+passed. Returns the current setting otherwise.
+
+Arguments should be key/value pairs of installation targets
+as recognized by the C<install_par()> routine in L<PAR::Dist>.
+The contents of this hash are passed verbatim to every call to
+C<install_par()> made by this package.
+
+In this context, note that aside from the normal i<inst_lib> and similar
+targets, you can also specify a I<custom_targets> element starting with
+C<PAR::Dist> version 0.20. For details, refer to the L<PAR::Dist> manual.
+
+Returns a hash reference to a hash containing the installation targets.
+
+=cut
+
+sub installation_targets {
+ my $self = shift;
+ if (not @_) {
+ return {%{$self->{installation_targets}}};
+ }
+
+ my %args = @_;
+
+ $self->{installation_targets} = \%args;
+ return {%{$self->{installation_targets}}};
+}
+
+
+=head1 ACCESSORS
+
+These methods get or set some attributes of the repository client.
+
+=head2 error
+
+Returns the last error message if there was an error or
+the empty list otherwise.
+
+=cut
+
+sub error {
+ my $self = shift;
+ my $err = $self->{error};
+ return(defined($err) ? $err : ());
+}
+
+
+=head2 perl_version
+
+Sets and/or returns the perl version which is used to choose the right
+C<.par> packages from the repository. Defaults to the currently running
+perl version (from C<%Config>).
+
+You'd better know what you're doing if you plan to set this to something
+you're not actually running. One valid use is if you use the
+C<installation_targets> possibly in conjunction with
+L<ExtUtils::InferConfig> to install into a different perl than the
+one that's running!
+
+=cut
+
+sub perl_version {
+ my $self = shift;
+ $self->{perl_version} = shift @_ if @_;
+ return $self->{perl_version};
+}
+
+
+=head2 architecture
+
+Sets and/or returns the name of the architecture which is used to choose the right
+C<.par> packages from the repository. Defaults to the currently running
+architecture (from C<%Config>).
+
+You'd better know what you're doing if you plan to set this to something
+you're not actually running. One valid use is if you use the
+C<installation_targets> possibly in conjunction with
+L<ExtUtils::InferConfig> to install into a different perl than the
+one that's running!
+
+=cut
+
+sub architecture {
+ my $self = shift;
+ $self->{architecture} = shift @_ if @_;
+ return $self->{architecture};
+}
+
+
+=head1 OTHER METHODS
+
+These methods, while part of the official interface, should need rarely be
+called by most users.
+
+=head2 prefered_distribution
+
+This method decides from which distribution a module will be loaded.
+It returns the corresponding distribution file name.
+
+Takes a namespace as first argument followed by a reference
+to a hash of distribution file names with associated module
+versions. Example:
+
+ 'Math::Symbolic',
+ { 'Math-Symbolic-0.502-x86_64-linux-gnu-thread-multi-5.8.7.par' => '0.502',
+ 'Math-Symbolic-0.128-any_arch-any_version.par' => '0.128'
+ }
+
+This means that the C<Math::Symbolic> namespace was found in version C<0.502>
+and C<0.128> in said distribution files. If you were using linux on an x86_64
+computer using perl 5.8.7, this would return the first file name. Otherwise,
+you would only get version C<0.128>.
+
+=cut
+
+sub prefered_distribution {
+ my $self = shift;
+ $self->{error} = undef;
+ my $ns = shift;
+ my $dists = shift;
+
+ # potentially faster not to query the db here and rely
+ # on the while/each
+ #return() if not keys %$dists;
+
+ my $this_pver = $self->perl_version;
+ my $this_arch = $self->architecture;
+
+ my @sorted;
+ while (my ($dist, $ver) = each(%$dists)) {
+ # distfile, version, distname, distver, arch, pver
+ my $version = version->new($ver||0);
+ my ($n, $v, $a, $p) = PAR::Dist::parse_dist_name($dist);
+ next if not defined $a or not defined $p;
+ # skip the ones for other archs
+ next if $a ne $this_arch and $a ne 'any_arch';
+ next if $p ne $this_pver and $p ne 'any_version';
+
+ # as a fallback while sorting, prefer arch and pver
+ # specific dists to fallbacks
+ my $order_num =
+ ($a eq 'any_arch' ? 2 : 0)
+ + ($p eq 'any_version' ? 1 : 0);
+ push @sorted, [$dist, $version, $order_num];
+ }
+ return() if not @sorted;
+
+ # sort by version, highest first.
+ @sorted =
+ sort {
+ # sort version
+ $b->[1] <=> $a->[1]
+ or
+ # specific before any_version before any_arch before any_*
+ $a->[2] <=> $b->[2]
+ }
+ @sorted;
+
+ my $dist = shift @sorted;
+ return $dist->[0];
+}
+
+
+=head2 validate_repository_version
+
+Accesses the repository meta information and validates that it
+has a compatible version. This is done on object creation, so
+it should not normally be necessary to call this from user code.
+
+Returns a boolean indicating the outcome of the operation.
+
+=cut
+
+sub validate_repository_version {
+ my $self = shift;
+ $self->{error} = undef;
+
+ my $info = $self->_repository_info;
+ if (not defined $info) {
+ return();
+ }
+ elsif (not exists $info->[0]{repository_version}) {
+ $self->{error} = "Repository info file ('repository_info.yml') does not contain a version.";
+ return();
+ }
+
+ # check for compatibility
+ my $repo_version = $info->[0]{repository_version};
+
+ my $main_repo_version = $repo_version;
+ $main_repo_version =~ s/^(\d+\.\d).*$/$1/;
+
+ if ( not exists $PAR::Repository::Client::Compatible_Versions->{$main_repo_version} ) {
+ $self->{error} = "Repository has an incompatible version (".$info->[0]{repository_version}.")";
+ return();
+ }
+
+ $repo_version =~ s/_.*$//; # remove dev suffix
+ if ($repo_version < 0.18 and $self->{static_dependencies}) {
+ $self->{error} = "Client has static dependency resolution enabled, but repository does not support that. "
+ ."Either upgrade your repository to version 0.18 or greater or disable static dependency "
+ ."resolution in the client.";
+ return();
+ }
+
+ return 1;
+}
+
+
+# given a module name, find the prefered distribution
+sub _module2dist {
+ my $self = shift;
+ my $namespace = shift;
+
+ $self->{error} = undef;
+
+ my ($modh) = $self->modules_dbm;
+ if (not defined $modh) {
+ return();
+ }
+
+ if (not exists $modh->{$namespace} or not defined $modh->{$namespace}) {
+ $self->{error} = "Could not find module '$namespace' in the repository.";
+ return();
+ }
+
+ my $dist = $self->prefered_distribution($namespace, $modh->{$namespace});
+ if (not defined $dist) {
+ $self->{error} = "PAR: Could not find a distribution for package '$namespace'";
+ return();
+ }
+ return $dist;
+}
+
+
+# resolve a script to its prefered distribution
+sub _script2dist {
+ my $self = shift;
+ my $script = shift;
+
+ $self->{error} = undef;
+
+ my ($scrh) = $self->scripts_dbm;
+ if (not defined $scrh) {
+ return();
+ }
+
+ my $dists = $scrh->{$script};
+ if (not defined $dists) {
+ $self->{error} = "Could not find script '$script' in the repository.";
+ return();
+ }
+ my $dist = $self->prefered_distribution($script, $dists);
+ if (not defined $dist) {
+ $self->{error} = "PAR: Could not find a distribution for script '$script'";
+ return();
+ }
+
+ return $dist;
+}
+
+
+# download a distribution
+sub _fetch_dist {
+ my $self = shift;
+ my $dist = shift;
+
+ my $local_par_file = $self->fetch_par($dist);
+ return() if not defined $local_par_file or not -f $local_par_file;
+
+ return $local_par_file;
+}
+
+
+# resolve a namespace to a distribution and download it
+sub _fetch_module {
+ my $self = shift;
+ my $namespace = shift;
+
+ my $dist = $self->_module2dist($namespace);
+ return() unless defined $dist;
+
+ return $self->_fetch_dist($dist);
+}
+
+
+# resolve a script to a distribution and download it
+sub _fetch_script {
+ my $self = shift;
+ my $namespace = shift;
+
+ my $dist = $self->_script2dist($namespace);
+ return() unless defined $dist;
+
+ return $self->_fetch_dist($dist);
+}
+
+
+sub DESTROY {
+ my $self = shift;
+ $self->close_modules_dbm;
+ $self->close_scripts_dbm;
+ $self->close_dependencies_dbm;
+
+ # attempt to clean up empty cache directories
+ rmdir($self->{cache_dir})
+ if $self->{cleanup_cache_dir}
+ and $self->{private_cache_dir}
+ and defined($self->{cache_dir})
+ and -d $self->{cache_dir};
+}
+
+1;
+__END__
+
+=head1 SEE ALSO
+
+This module is directly related to the C<PAR> project. You need to have
+basic familiarity with it. Its homepage is at L<http://par.perl.org/>
+
+See L<PAR>, L<PAR::Dist>, L<PAR::Repository>, etc.
+
+L<PAR::Repository::Query> implements the querying interface. The methods
+described in that module's documentation can be called on
+C<PAR::Repository::Client> objects.
+
+L<PAR::Repository> implements the server side creation and manipulation
+of PAR repositories.
+
+L<PAR::WebStart> is doing something similar but is otherwise unrelated.
+
+=head1 AUTHOR
+
+Steffen Mueller, E<lt>smueller@cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006-2009 by Steffen Mueller
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.6 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client/DBM.pm b/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client/DBM.pm
new file mode 100755
index 00000000000..fd5e2485ad4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client/DBM.pm
@@ -0,0 +1,501 @@
+package PAR::Repository::Client::DBM;
+
+use 5.006;
+use strict;
+use warnings;
+
+our $VERSION = '0.24';
+
+use Carp qw/croak/;
+
+=head1 NAME
+
+PAR::Repository::Client::DBM - Contains all the DBM access functions
+
+=head1 SYNOPSIS
+
+ use PAR::Repository::Client;
+
+=head1 DESCRIPTION
+
+This module implements access to the underlying DBMs.
+
+All of the methods described here shouldn't be used frivolously in user
+code even if some of them are part of the API and are guaranteed not
+to change.
+
+=cut
+
+
+=head2 need_dbm_update
+
+Takes one or no arguments. Without arguments, all DBM files are
+checked. With an argument, only the specified DBM file will be checked.
+
+Returns true if either one of the following conditions match:
+
+=over 2
+
+=item
+
+The repository does not support checksums.
+
+=item
+
+The checksums (and thus also the DBM files) haven't been
+downloaded yet.
+
+=item
+
+The local copies of the checksums do not match those of the repository.
+
+=back
+
+In cases two and three above, the return value is actually the hash
+reference of checksums that was fetched from the repository.
+
+Returns the empty list if the local checksums match those of the
+repository exactly.
+
+You don't usually need to call this directly. By default, DBM files
+are only fetched from the repository if necessary.
+
+=cut
+
+sub need_dbm_update {
+ my $self = shift;
+ $self->{error} = undef;
+
+ my $check_file = shift;
+ $check_file .= '.zip' if defined $check_file and not $check_file =~ /\.zip$/;
+
+ my $support = $self->{supports_checksums};
+ if (defined $support and not $support) {
+ return 1;
+ }
+
+ my $checksums = $self->_dbm_checksums();
+ $self->{last_checksums_refresh} = time() if $self->{checksums_timeout};
+
+ if (not defined $checksums) {
+ $self->{supports_checksums} = 0;
+ return 1;
+ }
+ else {
+ $self->{supports_checksums} = 1;
+ }
+
+ if (not defined $self->{checksums} or keys %{$self->{checksums}} == 0) {
+ # never fetched checksums before.
+ return $checksums;
+ }
+ else {
+ # we fetched checksums earlier, match them
+ my $local_checksums = $self->{checksums};
+ if (not defined $check_file) {
+ return $checksums if keys(%$local_checksums) != keys(%$checksums);
+ foreach my $file (keys %$checksums) {
+ return $checksums
+ if not exists $local_checksums->{$file}
+ or not $local_checksums->{$file} eq $checksums->{$file};
+ }
+ }
+ else {
+ return $checksums
+ if not exists $local_checksums->{$check_file}
+ or not exists $checksums->{$check_file} # shouldn't happen
+ or not $local_checksums->{$check_file} eq $checksums->{$check_file};
+ }
+ return();
+ }
+}
+
+
+=head2 modules_dbm
+
+Fetches the C<modules_dists.dbm> database from the repository,
+ties it to a L<DBM::Deep> object and returns a tied hash
+reference or the empty list on failure. Second return
+value is the name of the local temporary file.
+
+In case of failure, an error message is available via
+the C<error()> method.
+
+The method uses the C<_fetch_dbm_file()> method which must be
+implemented in a subclass such as L<PAR::Repository::Client::HTTP>.
+
+=cut
+
+sub modules_dbm {
+ my $self = shift;
+ return( $self->_get_a_dbm('modules', PAR::Repository::Client::MODULES_DBM_FILE()) );
+}
+
+
+=head2 scripts_dbm
+
+Fetches the C<scripts_dists.dbm> database from the repository,
+ties it to a L<DBM::Deep> object and returns a tied hash
+reference or the empty list on failure. Second return
+value is the name of the local temporary file.
+
+In case of failure, an error message is available via
+the C<error()> method.
+
+The method uses the C<_fetch_dbm_file()> method which must be
+implemented in a subclass such as L<PAR::Repository::Client::HTTP>.
+
+=cut
+
+sub scripts_dbm {
+ my $self = shift;
+ return( $self->_get_a_dbm('scripts', PAR::Repository::Client::SCRIPTS_DBM_FILE()) );
+}
+
+
+=head2 dependencies_dbm
+
+Fetches the C<dependencies.dbm> database from the repository,
+ties it to a L<DBM::Deep> object and returns a tied hash
+reference or the empty list on failure. Second return
+value is the name of the local temporary file.
+
+In case of failure, an error message is available via
+the C<error()> method.
+
+The method uses the C<_fetch_dbm_file()> method which must be
+implemented in a subclass such as L<PAR::Repository::Client::HTTP>.
+
+=cut
+
+sub dependencies_dbm {
+ my $self = shift;
+ return( $self->_get_a_dbm('dependencies', PAR::Repository::Client::DEPENDENCIES_DBM_FILE()) );
+}
+
+
+=head2 close_modules_dbm
+
+Closes the C<modules_dists.dbm> file and does all necessary
+cleaning up.
+
+This is called when the object is destroyed.
+
+=cut
+
+sub close_modules_dbm {
+ my $self = shift;
+ my $hash = $self->{modules_dbm_hash};
+ return if not defined $hash;
+
+ my $obj = tied($hash);
+ $self->{modules_dbm_hash} = undef;
+ undef $hash;
+ undef $obj;
+
+ unlink $self->{modules_dbm_temp_file};
+ $self->{modules_dbm_temp_file} = undef;
+ if ($self->{checksums}) {
+ delete $self->{checksums}{PAR::Repository::Client::MODULES_DBM_FILE().".zip"};
+ }
+
+ return 1;
+}
+
+
+=head2 close_scripts_dbm
+
+Closes the C<scripts_dists.dbm> file and does all necessary
+cleaning up.
+
+This is called when the object is destroyed.
+
+=cut
+
+sub close_scripts_dbm {
+ my $self = shift;
+ my $hash = $self->{scripts_dbm_hash};
+ return if not defined $hash;
+
+ my $obj = tied($hash);
+ $self->{scripts_dbm_hash} = undef;
+ undef $hash;
+ undef $obj;
+
+ unlink $self->{scripts_dbm_temp_file};
+ $self->{scripts_dbm_temp_file} = undef;
+ if ($self->{checksums}) {
+ delete $self->{checksums}{PAR::Repository::Client::SCRIPTS_DBM_FILE().".zip"};
+ }
+
+ return 1;
+}
+
+
+=head2 close_dependencies_dbm
+
+Closes the C<dependencies.dbm> file and does all necessary
+cleaning up.
+
+This is called when the object is destroyed.
+
+=cut
+
+sub close_dependencies_dbm {
+ my $self = shift;
+ my $hash = $self->{dependencies_dbm_hash};
+ return if not defined $hash;
+
+ my $obj = tied($hash);
+ $self->{dependencies_dbm_hash} = undef;
+ undef $hash;
+ undef $obj;
+
+ unlink $self->{dependencies_dbm_temp_file};
+ $self->{dependencies_dbm_temp_file} = undef;
+ if ($self->{checksums}) {
+ delete $self->{checksums}{PAR::Repository::Client::DEPENDENCIES_DBM_FILE().".zip"};
+ }
+
+ return 1;
+}
+
+
+=head1 PRIVATE METHODS
+
+These private methods should not be relied upon from the outside of
+the module.
+
+=head2 _get_a_dbm
+
+This is a private method.
+
+Generic method returning a dbm.
+Requires two arguments. The type of the DBM (C<modules>,
+C<scripts>, C<dependencies>), and the name of the remote
+DBM file. The latter should be taken from one of the package
+constants.
+
+=cut
+
+sub _get_a_dbm {
+ my $self = shift;
+ $self->{error} = undef;
+
+ my $dbm_type = shift;
+ my $dbm_remotefile = shift;
+
+ my $dbm_hashkey = $dbm_type . "_dbm_hash";
+ my $tempfile_hashkey = $dbm_type . "_dbm_temp_file";
+ my $dbm_remotefile_zip = $dbm_remotefile . ".zip";
+
+ my $checksums = $self->need_dbm_update($dbm_remotefile);
+
+ if ($self->{$dbm_hashkey}) {
+ # need new dbm file?
+ return($self->{$dbm_hashkey}, $self->{$tempfile_hashkey})
+ if not $checksums;
+
+ # does this particular dbm need to be updated?
+ if ($self->{checksums}) {
+ my $local_checksum = $self->{checksums}{$dbm_remotefile_zip};
+ my $remote_checksum = $checksums->{$dbm_remotefile_zip};
+ return($self->{$dbm_hashkey}, $self->{$tempfile_hashkey})
+ if defined $local_checksum and defined $remote_checksum
+ and $local_checksum eq $remote_checksum;
+ }
+
+ # just to make sure
+ my $method = 'close_' . $dbm_type . "_dbm";
+ $self->$method;
+ }
+
+ my $file;
+ if ($checksums) {
+ $file = $self->_fetch_dbm_file($dbm_remotefile_zip);
+ # (error set by _fetch_dbm_file)
+ return() if not defined $file; # or not -f $file; # <--- _fetch_dbm_file should do the stat!
+ }
+ else {
+ # cached!
+ $file = File::Spec->catfile($self->{cache_dir}, $dbm_remotefile_zip);
+ $self->{error} = "Cache miss error: Expected $file to exist, but it doesn't" if not -f $file;
+ }
+
+ my ($tempfh, $tempfile) = File::Temp::tempfile(
+ 'temporary_dbm_XXXXX',
+ UNLINK => 0,
+ DIR => File::Spec->tmpdir(),
+ EXLOCK => 0, # FIXME no exclusive locking or else we block on BSD. What's the right solution?
+ );
+
+ if (not $self->_unzip_file($file, $tempfile, $dbm_remotefile)) {
+ $self->{error} = "Could not unzip dbm file '$file' to '$tempfile'";
+ unlink($tempfile);
+ return();
+ }
+
+ $self->{$tempfile_hashkey} = $tempfile;
+
+ my %hash;
+ my $obj = tie %hash, "DBM::Deep", {
+ file => $tempfile,
+ locking => 1,
+ autoflush => 0,
+ };
+
+ $self->{$dbm_hashkey} = \%hash;
+
+ # save this dbm file checksum
+ if (ref($checksums)) {
+ if (not $self->{checksums}) {
+ $self->{checksums} = {};
+ }
+ $self->{checksums}{$dbm_remotefile_zip} = $checksums->{$dbm_remotefile_zip};
+ }
+
+ return (\%hash, $tempfile);
+}
+
+
+=head2 _parse_dbm_checksums
+
+This is a private method.
+
+Given a reference to a file handle, a reference to a string
+or a file name, this method parses a checksum file
+and returns a hash reference associating file names
+with their base64 encoded MD5 hashes.
+
+If passed a ref to a string, the contents of the string will
+be assumed to contain the checksum data.
+
+=cut
+
+sub _parse_dbm_checksums {
+ my $self = shift;
+ $self->{error} = undef;
+
+ my $file_or_fh = shift;
+ my $is_string = 0;
+ my $fh;
+ if (ref($file_or_fh) eq 'GLOB') {
+ $fh = $file_or_fh;
+ }
+ elsif (ref($file_or_fh) eq 'SCALAR') {
+ $is_string = 1;
+ }
+ else {
+ open $fh, '<', $file_or_fh
+ or die "Could not open file '$file_or_fh' for reading: $!";
+ }
+
+ my $hashes = {};
+ my @lines;
+ @lines = split /\n/, $$file_or_fh if $is_string;
+
+ while (1) {
+ local $_ = $is_string ? shift @lines : <$fh>;
+ last if not defined $_;
+ next if /^\s*$/ or /^\s*#/;
+ my ($file, $hash) = split /\t/, $_;
+ if (not defined $file or not defined $hash) {
+ $self->{error} = "Error reading repository checksums.";
+ return();
+ }
+ $hash =~ s/\s+$//;
+ $hashes->{$file} = $hash;
+ }
+
+ return $hashes;
+}
+
+
+=head2 _calculate_cache_local_checksums
+
+This is a private method.
+
+Calculates the checksums of the DBMs in the local cache directory.
+If the repository client isn't using a private cache directory, this
+B<short circuits> and does not actually try to calculate
+any checksums of potentially modified files.
+
+Returns the checksums hash just like the checksum fetching
+routine.
+
+Maintainer note: Essentially the same code lives in
+PAR::Repository's DBM code for calculating the repository checksums
+in the first place.
+
+=cut
+
+sub _calculate_cache_local_checksums {
+ my $self = shift;
+
+ # only support inter-run cache summing if we're in a private cache dir!
+ if (!$self->{private_cache_dir}) {
+ return();
+ }
+
+ # find a working base64 MD5 implementation
+ my $md5_function;
+ eval { require Digest::MD5; $md5_function = \&Digest::MD5::md5_base64; };
+ eval { require Digest::Perl::MD5; $md5_function = \&Digest::Perl::MD5::md5_base64; } if $@;
+ if ($@) {
+ return();
+ }
+
+ my $hashes = {};
+ # calculate local hashes
+ foreach my $dbmfile (
+ PAR::Repository::Client::MODULES_DBM_FILE(),
+ PAR::Repository::Client::SCRIPTS_DBM_FILE(),
+ PAR::Repository::Client::SYMLINKS_DBM_FILE(),
+ PAR::Repository::Client::DEPENDENCIES_DBM_FILE(),
+ ) {
+ my $filepath = File::Spec->catfile($self->{cache_dir}, $dbmfile.'.zip');
+ next unless -f $filepath;
+ open my $fh, '<', $filepath
+ or die "Could not open DBM file '$filepath' for reading: $!";
+ local $/ = undef;
+ my $hash = $md5_function->(<$fh>);
+ close $fh;
+ $hashes->{$dbmfile.'.zip'} = $hash;
+ } # end foreach dbm files
+
+ return $hashes;
+}
+
+1;
+
+__END__
+
+=head1 SEE ALSO
+
+This module is directly related to the C<PAR> project. You need to have
+basic familiarity with it. Its homepage is at L<http://par.perl.org/>
+
+See L<PAR>, L<PAR::Dist>, L<PAR::Repository>, etc.
+
+L<PAR::Repository::Query> implements the querying interface. The methods
+described in that module's documentation can be called on
+C<PAR::Repository::Client> objects.
+
+L<PAR::Repository> implements the server side creation and manipulation
+of PAR repositories.
+
+L<PAR::WebStart> is doing something similar but is otherwise unrelated.
+
+=head1 AUTHOR
+
+Steffen Mueller, E<lt>smueller@cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006-2009 by Steffen Mueller
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.6 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client/HTTP.pm b/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client/HTTP.pm
new file mode 100755
index 00000000000..385480f980f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client/HTTP.pm
@@ -0,0 +1,332 @@
+package PAR::Repository::Client::HTTP;
+
+use 5.006;
+use strict;
+use warnings;
+
+use vars qw/$ua/;
+require LWP::Simple;
+LWP::Simple->import('$ua');
+
+use base 'PAR::Repository::Client';
+
+use Carp qw/croak/;
+
+our $VERSION = '0.24';
+
+=head1 NAME
+
+PAR::Repository::Client::HTTP - PAR repository via HTTP
+
+=head1 SYNOPSIS
+
+ use PAR::Repository::Client;
+
+ my $client = PAR::Repository::Client->new(
+ uri => 'http:///foo/repository',
+ http_timeout => 20, # but default is 180s
+ );
+
+=head1 DESCRIPTION
+
+This module implements repository accesses via HTTP.
+
+If you create a new L<PAR::Repository::Client> object and pass it
+an uri parameter which starts with C<http://> or C<https://>,
+it will create an object of this class. It inherits from
+C<PAR::Repository::Client>.
+
+The repository is accessed using L<LWP::Simple>.
+
+=head2 EXPORT
+
+None.
+
+=head1 METHODS
+
+Following is a list of class and instance methods.
+(Instance methods until otherwise mentioned.)
+
+=cut
+
+
+=head2 fetch_par
+
+Fetches a .par distribution from the repository and stores it
+locally. Returns the name of the local file or the empty list on
+failure.
+
+First argument must be the distribution name to fetch.
+
+=cut
+
+sub fetch_par {
+ my $self = shift;
+ $self->{error} = undef;
+ my $dist = shift;
+ return() if not defined $dist;
+
+ my $url = $self->{uri};
+ $url =~ s/\/$//;
+
+ my ($n, $v, $a, $p) = PAR::Dist::parse_dist_name($dist);
+ $url .= "/$a/$p/$n-$v-$a-$p.par";
+
+ my $file = $self->_fetch_file($url);
+
+ if (not defined $file) {
+ $self->{error} = "Could not fetch distribution from URI '$url'";
+ return();
+ }
+
+ return $file;
+}
+
+
+{
+ my %escapes;
+ sub _fetch_file {
+ my $self = shift;
+ $self->{error} = undef;
+ my $file = shift;
+ #warn "FETCHING FILE: $file";
+
+ my $cache_dir = $self->{cache_dir}; # used to be PAR_TEMP, but now configurable
+ %escapes = map { chr($_) => sprintf("%%%02X", $_) } 0..255 unless %escapes;
+
+ $file =~ m!/([^/]+)$!;
+ my $local_file = (defined($1) ? $1 : $file);
+ $local_file =~ s/([^\w\._])/$escapes{$1}/g;
+ $local_file = File::Spec->catfile( $self->{cache_dir}, $local_file );
+
+ my $timeout = $self->{http_timeout};
+ my $old_timeout = $ua->timeout();
+ $ua->timeout($timeout) if defined $timeout;
+ my $rc = LWP::Simple::mirror( $file, $local_file );
+ $ua->timeout($old_timeout) if defined $timeout;
+ if (!LWP::Simple::is_success($rc) and not $rc == HTTP::Status::RC_NOT_MODIFIED()) {
+ $self->{error} = "Error $rc: " . LWP::Simple::status_message($rc) . " ($file)\n";
+ return();
+ }
+
+ return $local_file if -f $local_file;
+ return();
+ }
+}
+
+
+sub _fetch_as_data {
+ my $self = shift;
+ $self->{error} = undef;
+ my $file = shift;
+ #warn "FETCHING DATA: $file";
+
+ my $timeout = $self->{http_timeout};
+ my $old_timeout = $ua->timeout();
+ $ua->timeout($timeout) if defined $timeout;
+ my $data = LWP::Simple::get( $file );
+ $ua->timeout($old_timeout) if defined $timeout;
+
+ return $data if defined $data;
+
+ $self->{error} = "Could not get '$file' from repository";
+ return();
+}
+
+
+=head2 validate_repository
+
+Makes sure the repository is valid. Returns the empty list
+if that is not so and a true value if the repository is valid.
+
+Checks that the repository version is compatible.
+
+The error message is available as C<$client->error()> on
+failure.
+
+=cut
+
+sub validate_repository {
+ my $self = shift;
+ $self->{error} = undef;
+
+ my $mod_db = $self->modules_dbm;
+ return() if not defined $mod_db;
+
+ return() if not $self->validate_repository_version;
+
+ return 1;
+}
+
+
+=head2 _repository_info
+
+Returns a YAML::Tiny object representing the repository meta
+information.
+
+This is a private method.
+
+=cut
+
+sub _repository_info {
+ my $self = shift;
+ $self->{error} = undef;
+ return $self->{info} if defined $self->{info};
+
+ my $url = $self->{uri};
+ $url =~ s/\/$//;
+
+ my $file = $self->_fetch_file(
+ $url.'/'.PAR::Repository::Client::REPOSITORY_INFO_FILE()
+ );
+
+ return() if not defined $file;
+
+ my $yaml = YAML::Tiny->new->read($file);
+ if (not defined $yaml) {
+ $self->{error} = "Error reading repository info from YAML file.";
+ return();
+ }
+
+ # workaround for possible YAML::Syck/YAML::Tiny bug
+ # This is not the right way to do it!
+ @$yaml = ($yaml->[1]) if @$yaml > 1;
+
+ $self->{info} = $yaml;
+ return $yaml;
+}
+
+
+=head2 _fetch_dbm_file
+
+This is a private method.
+
+Fetches a dbm (index) file from the repository and
+returns the name of the temporary local file or the
+empty list on failure.
+
+An error message is available via the C<error()>
+method in case of failure.
+
+=cut
+
+sub _fetch_dbm_file {
+ my $self = shift;
+ $self->{error} = undef;
+ my $file = shift;
+ return if not defined $file;
+
+ my $url = $self->{uri};
+ $url =~ s/\/$//;
+
+ my $local = $self->_fetch_file("$url/$file");
+ return() if not defined $local or not -f $local;
+
+ return $local;
+}
+
+
+=head2 _dbm_checksums
+
+This is a private method.
+
+If the repository has a checksums file (new feature of
+C<PAR::Repository> 0.15), this method returns a hash
+associating the DBM file names (e.g. C<foo_bar.dbm.zip>)
+with their MD5 hashes (base 64).
+
+This method B<always> queries the repository and never caches
+the information locally. That's the whole point of having the
+checksums.
+
+In case the repository does not have checksums, this method
+returns the empty list, so check the return value!
+The error message (see the C<error()> method) will be
+I<"Repository does not support checksums"> in that case.
+
+=cut
+
+sub _dbm_checksums {
+ my $self = shift;
+ $self->{error} = undef;
+
+ my $url = $self->{uri};
+ $url =~ s/\/$//;
+
+ # if we're running on a "trust-the-checksums-for-this-long" basis...
+ # ... return if the timeout hasn't elapsed
+ if ($self->{checksums} and $self->{checksums_timeout}) {
+ my $time = time();
+ if ($time - $self->{last_checksums_refresh} < $self->{checksums_timeout}) {
+ return($self->{checksums});
+ }
+ }
+
+ my $data = $self->_fetch_as_data(
+ $url.'/'.PAR::Repository::Client::DBM_CHECKSUMS_FILE()
+ );
+
+ if (not defined $data) {
+ $self->{error} = "Repository does not support checksums";
+ return();
+ }
+
+ return $self->_parse_dbm_checksums(\$data);
+}
+
+
+=head2 _init
+
+This private method is called by the C<new()> method of
+L<PAR::Repository::Client>. It is used to initialize
+the client object and C<new()> passes it a hash ref to
+its arguments.
+
+Should return a true value on success.
+
+=cut
+
+sub _init {
+ my $self = shift;
+ my $args = shift || {};
+ # We implement additional object attributes here
+ $self->{http_timeout} = $args->{http_timeout};
+ $self->{http_timeout} = 180 if not defined $self->{http_timeout};
+
+ return 1;
+}
+
+
+
+1;
+__END__
+
+=head1 SEE ALSO
+
+This module is part of the L<PAR::Repository::Client> distribution.
+
+This module is directly related to the C<PAR> project. You need to have
+basic familiarity with it. The PAR homepage is at L<http://par.perl.org>.
+
+See L<PAR>, L<PAR::Dist>, L<PAR::Repository>, etc.
+
+L<PAR::Repository> implements the server side creation and manipulation
+of PAR repositories.
+
+L<PAR::WebStart> is doing something similar but is otherwise unrelated.
+
+The repository access is done via L<LWP::Simple>.
+
+=head1 AUTHOR
+
+Steffen Mueller, E<lt>smueller@cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2006-2009 by Steffen Mueller
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.6 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client/Local.pm b/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client/Local.pm
new file mode 100755
index 00000000000..d333f995b0d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client/Local.pm
@@ -0,0 +1,285 @@
+package PAR::Repository::Client::Local;
+
+use 5.006;
+use strict;
+use warnings;
+
+use base 'PAR::Repository::Client';
+
+use Carp qw/croak/;
+require File::Copy;
+
+our $VERSION = '0.24';
+
+=head1 NAME
+
+PAR::Repository::Client::Local - PAR repo. on the local file system
+
+=head1 SYNOPSIS
+
+ use PAR::Repository::Client;
+
+ my $client = PAR::Repository::Client->new(
+ uri => 'file:///foo/repository',
+ );
+
+=head1 DESCRIPTION
+
+This module implements repository accesses on the local filesystem.
+
+If you create a new L<PAR::Repository::Client> object and pass it
+an uri parameter which starts with C<file://> or just a path,
+it will create an object of this class. It inherits from
+C<PAR::Repository::Client>.
+
+=head2 EXPORT
+
+None.
+
+=head1 METHODS
+
+Following is a list of class and instance methods.
+(Instance methods until otherwise mentioned.)
+
+=cut
+
+=head2 fetch_par
+
+Fetches a .par distribution from the repository and stores it
+locally. Returns the name of the local file or the empty list on
+failure.
+
+First argument must be the distribution name to fetch.
+
+=cut
+
+sub fetch_par {
+ my $self = shift;
+ $self->{error} = undef;
+ my $dist = shift;
+ if (not defined $dist) {
+ $self->{error} = "undef passed as argument to fetch_par()";
+ return();
+ }
+
+ my $path = $self->{uri};
+ $path =~ s/(?:\/|\\)$//;
+ $path =~ s!^file://!!i;
+
+ my ($dname, $vers, $arch, $perl) = PAR::Dist::parse_dist_name($dist);
+ my $file = File::Spec->catfile(
+ File::Spec->catdir($path, $arch, $perl),
+ "$dname-$vers-$arch-$perl.par"
+ );
+
+ if (not -f $file) {
+ $self->{error} = "Could not find distribution in local repository at '$file'";
+ return();
+ }
+
+ return $file;
+}
+
+=head2 validate_repository
+
+Makes sure the repository is valid. Returns the empty list
+if that is not so and a true value if the repository is valid.
+
+Checks that the repository version is compatible.
+
+The error message is available as C<$client->error()> on
+failure.
+
+=cut
+
+sub validate_repository {
+ my $self = shift;
+ $self->{error} = undef;
+
+ my $mod_db = $self->modules_dbm;
+
+ return() unless defined $mod_db;
+
+ return() unless $self->validate_repository_version;
+
+ return 1;
+}
+
+=head2 _repository_info
+
+Returns a YAML::Tiny object representing the repository meta
+information.
+
+This is a private method.
+
+=cut
+
+sub _repository_info {
+ my $self = shift;
+ $self->{error} = undef;
+ return $self->{info} if defined $self->{info};
+
+ my $path = $self->{uri};
+ $path =~ s/(?:\/|\\)$//;
+ $path =~ s!^file://!!i;
+
+ my $file = File::Spec->catfile($path, PAR::Repository::Client::REPOSITORY_INFO_FILE());
+
+ if (not defined $file or not -f $file) {
+ $self->{error} = "File '$file' does not exist in repository.";
+ return();
+ }
+
+ my $yaml = YAML::Tiny->new->read($file);
+ if (not defined $yaml) {
+ $self->{error} = "Error reading repository info from YAML file.";
+ return();
+ }
+
+ # workaround for possible YAML::Syck/YAML::Tiny bug
+ # This is not the right way to do it!
+ @$yaml = ($yaml->[1]) if @$yaml > 1;
+ $self->{info} = $yaml;
+ return $yaml;
+}
+
+=head2 _fetch_dbm_file
+
+This is a private method.
+
+Fetches a dbm (index) file from the repository and
+returns the name of the local file or the
+empty list on failure.
+
+An error message is available via the C<error()>
+method in case of failure.
+
+=cut
+
+sub _fetch_dbm_file {
+ my $self = shift;
+ $self->{error} = undef;
+ my $file = shift;
+ return if not defined $file;
+
+ my $path = $self->{uri};
+ $path =~ s/(?:\/|\\)$//;
+ $path =~ s!^file://!!i;
+
+ my $url = File::Spec->catfile( $path, $file );
+
+ if (not -f $url) {
+ $self->{error} = "Could not find dbm file in local repository at '$url'";
+ return();
+ }
+
+ my ($tempfh, $tempfile) = File::Temp::tempfile(
+ 'temp_zip_dbm_XXXXX',
+ UNLINK => 1, # because we cache the suckers by default
+ DIR => $self->{cache_dir},
+ EXLOCK => 0, # FIXME no exclusive locking or else we block on BSD. What's the right solution?
+ );
+
+ File::Copy::copy($url, $tempfile);
+
+ return $tempfile;
+}
+
+
+
+=head2 _dbm_checksums
+
+This is a private method.
+
+If the repository has a checksums file (new feature of
+C<PAR::Repository> 0.15), this method returns a hash
+associating the DBM file names (e.g. C<foo_bar.dbm.zip>)
+with their MD5 hashes (base 64).
+
+This method B<always> queries the repository and never caches
+the information locally. That's the whole point of having the
+checksums.
+
+In case the repository does not have checksums, this method
+returns the empty list, so check the return value!
+The error message (see the C<error()> method) will be
+I<"Repository does not support checksums"> in that case.
+
+=cut
+
+sub _dbm_checksums {
+ my $self = shift;
+ $self->{error} = undef;
+
+ my $path = $self->{uri};
+ $path =~ s/(?:\/|\\)$//;
+ $path =~ s!^file://!!i;
+
+ # if we're running on a "trust-the-checksums-for-this-long" basis...
+ # ... return if the timeout hasn't elapsed
+ if ($self->{checksums} and $self->{checksums_timeout}) {
+ my $time = time();
+ if ($time - $self->{last_checksums_refresh} < $self->{checksums_timeout}) {
+ return($self->{checksums});
+ }
+ }
+
+ my $file = File::Spec->catfile($path, PAR::Repository::Client::DBM_CHECKSUMS_FILE());
+
+ if (not defined $file or not -f $file) {
+ $self->{error} = "Repository does not support checksums";
+ return();
+ }
+
+ return $self->_parse_dbm_checksums($file);
+}
+
+
+=head2 _init
+
+This private method is called by the C<new()> method of
+L<PAR::Repository::Client>. It is used to initialize
+the client object and C<new()> passes it a hash ref to
+its arguments.
+
+Should return a true value on success.
+
+=cut
+
+sub _init {
+ # We implement additional object attributes here
+ # Currently no extra attributes...
+ return 1;
+}
+
+
+1;
+__END__
+
+=head1 SEE ALSO
+
+This module is part of the L<PAR::Repository::Client> distribution.
+
+This module is directly related to the C<PAR> project. You need to have
+basic familiarity with it. The PAR homepage is at L<http://par.perl.org/>.
+
+See L<PAR>, L<PAR::Dist>, L<PAR::Repository>, etc.
+
+L<PAR::Repository> implements the server side creation and manipulation
+of PAR repositories.
+
+L<PAR::WebStart> is doing something similar but is otherwise unrelated.
+
+=head1 AUTHOR
+
+Steffen Mueller, E<lt>smueller@cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006-2009 by Steffen Mueller
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.6 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client/Util.pm b/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client/Util.pm
new file mode 100755
index 00000000000..e048bc27ca0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Client/Util.pm
@@ -0,0 +1,136 @@
+package PAR::Repository::Client::Util;
+
+use 5.006;
+use strict;
+use warnings;
+
+our $VERSION = '0.24';
+
+use Carp qw/croak/;
+
+=head1 NAME
+
+PAR::Repository::Client::Util - Small helper methods common to all implementations
+
+=head1 SYNOPSIS
+
+ use PAR::Repository::Client;
+
+=head1 DESCRIPTION
+
+This module implements small helper methods which are common to all
+L<PAR::Repository::Client> implementations.
+
+=head1 PRIVATE METHODS
+
+These private methods should not be relied upon from the outside of
+the module.
+
+=head2 _unzip_file
+
+This is a private method. Callable as class or instance method.
+
+Unzips the file given as first argument to the file
+given as second argument.
+If a third argument is used, the zip member of that name
+is extracted. If the zip member name is omitted, it is
+set to the target file name.
+
+Returns the name of the unzipped file.
+
+=cut
+
+sub _unzip_file {
+ my $class = shift;
+ my $file = shift;
+ my $target = shift;
+ my $member = shift;
+ $member = $target if not defined $member;
+ return unless -f $file;
+
+ my $zip = Archive::Zip->new;
+ local %SIG;
+ $SIG{__WARN__} = sub { print STDERR $_[0] unless $_[0] =~ /\bstat\b/ };
+
+ return unless $zip->read($file) == Archive::Zip::AZ_OK()
+ and $zip->extractMember($member, $target) == Archive::Zip::AZ_OK();
+
+ return $target;
+}
+
+
+# given a distribution name, recursively determines all distributions
+# it depends on
+sub _resolve_static_dependencies {
+ my $self = shift;
+ my $distribution = shift;
+
+ my ($deph) = $self->dependencies_dbm();
+ return([]) if not exists $deph->{$distribution};
+
+ my ($modh) = $self->modules_dbm();
+
+ my @module_queue = (keys %{$deph->{$distribution}});
+ my @dep_dists;
+ my %module_seen;
+ my %dist_seen;
+
+ while (@module_queue) {
+ #use Data::Dumper; warn Dumper \@module_queue;
+ my $module = shift @module_queue;
+ next if $module_seen{$module}++;
+ next if not exists $modh->{$module}; # FIXME should this be somehow reported?
+ my $dist = $self->prefered_distribution($module, $modh->{$module});
+ next if not defined $dist;
+ next if $dist_seen{$dist}++;
+ push @dep_dists, $dist;
+ push @module_queue, keys %{$deph->{$dist}} if exists $deph->{$dist};
+ }
+
+ return \@dep_dists;
+}
+
+sub generate_private_cache_dir {
+ my $self = shift;
+ my $uri = $self->{uri};
+ my $digester = PAR::SetupTemp::_get_digester(); # requires PAR 0.987!
+ $digester->add($uri);
+ my $digest = $digester->b64digest();
+ $digest =~ s/\W/_/g;
+ my $user_temp_dir = PAR::SetupTemp::_get_par_user_tempdir();
+ my $priv_cache_dir = File::Spec->catdir($user_temp_dir, "par-repo-$digest");
+ return $priv_cache_dir;
+}
+
+1;
+__END__
+
+=head1 SEE ALSO
+
+This module is directly related to the C<PAR> project. You need to have
+basic familiarity with it. Its homepage is at L<http://par.perl.org/>
+
+See L<PAR>, L<PAR::Dist>, L<PAR::Repository>, etc.
+
+L<PAR::Repository::Query> implements the querying interface. The methods
+described in that module's documentation can be called on
+C<PAR::Repository::Client> objects.
+
+L<PAR::Repository> implements the server side creation and manipulation
+of PAR repositories.
+
+L<PAR::WebStart> is doing something similar but is otherwise unrelated.
+
+=head1 AUTHOR
+
+Steffen Mueller, E<lt>smueller@cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006-2009 by Steffen Mueller
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.6 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Query.pm b/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Query.pm
new file mode 100755
index 00000000000..7c0f48c49f8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/Repository/Query.pm
@@ -0,0 +1,410 @@
+package PAR::Repository::Query;
+
+use 5.006;
+use strict;
+use warnings;
+
+use Carp qw/croak/;
+
+our $VERSION = '0.14';
+
+=head1 NAME
+
+PAR::Repository::Query - Implements repository queries
+
+=head1 SYNOPSIS
+
+ use PAR::Repository;
+ # or:
+ use PAR::Repository::Client;
+
+=head1 DESCRIPTION
+
+This module is for internal use by L<PAR::Repository> or
+L<PAR::Repository::Client> only. Both modules inherit from this.
+C<PAR::Repository::Query> implements a unified query interface for
+both the server- and client-side components of PAR repositories.
+
+If you decide to inherit from this class (for whatever reason),
+you should provide at least two methods: C<modules_dbm> which returns
+a L<DBM::Deep> object representing the modules DBM file.
+(See L<PAR::Repository::DBM> for details.) And C<scripts_dbm> which is
+the equivalent for the scripts DBM file.
+
+=head2 EXPORT
+
+None. But the methods are callable on C<PAR::Repository> and
+C<PAR::Repository::Client> objects.
+
+=head1 METHODS
+
+Following is a list of class and instance methods.
+(Instance methods until otherwise mentioned.)
+
+There is no C<PAR::Repository::Query> object.
+
+=cut
+
+=head2 query_module
+
+Polls the repository for modules matching certain criteria.
+Takes named arguments. Either a C<regex> or a C<name> parameter
+must be present but not both.
+
+Returns a reference to an array containing alternating distribution
+file names and module versions. This method returns the following
+structure
+
+ [ 'Foo-Bar-0.01-any_arch-5.8.7.par', '0.01', ... ]
+
+that means the module was found in the distribution
+F<Foo-Bar-0.01-any_arch-5.8.7.par> and the copy in that file has version
+0.01.
+
+Parameters:
+
+=over 2
+
+=item B<name>
+
+The name of the module to look for. This is used for an exact match.
+If you want to find C<Foo> in C<Foo::Bar>, use the C<regex> parameter.
+Only one of C<name> and C<regex> may be specified.
+
+=item B<regex>
+
+Same as C<name>, but interpreted as a regular expression.
+Only one of C<name> and C<regex> may be specified.
+
+=item B<arch>
+
+Can be used to reduce the number of matches to a specific architecture.
+Always interpreted as a regular expression.
+
+=back
+
+=cut
+
+sub query_module {
+ my $self = shift;
+# $self->verbose(2, "Entering query_module()");
+ croak("query_module() called with uneven number of arguments.")
+ if @_ % 2;
+ my %args = @_;
+
+ my $name = $args{name};
+ my $regex = $args{regex};
+
+ if (defined $name and defined $regex) {
+ croak("query_module() accepts only one of 'name' and 'regex' parameters.");
+ }
+ elsif (not defined $name and not defined $regex) {
+ croak("query_module() needs one of 'name' and 'regex' parameters.");
+ }
+ elsif (defined $name) {
+ $regex = qr/^\Q$name\E$/;
+ }
+ else { # regex defined
+ $regex = qr/$regex/ if not ref($regex) eq 'Regexp';
+ }
+
+ my ($modh, $modfile) = $self->modules_dbm
+ or die("Could not get modules DBM.");
+
+ my @modules;
+
+ my $arch_regex = $args{arch};
+ $arch_regex = qr/$arch_regex/
+ if defined $arch_regex and not ref($arch_regex) eq 'Regexp';
+
+ # iterate over all modules in the mod_dbm hash
+ while (my ($mod_name, $dists) = each(%$modh)) {
+ # skip non-matching
+ next if $mod_name !~ $regex;
+
+ if (defined $arch_regex) {
+ while (my ($distname, $version) = each(%$dists)) {
+ (undef, undef, my $arch, undef)
+ = PAR::Dist::parse_dist_name($distname);
+ next if $arch !~ $arch_regex;
+ push @modules, [$distname, $version];
+ }
+ }
+ else {
+ while (my ($distname, $version) = each(%$dists)) {
+ push @modules, [$distname, $version];
+ }
+ }
+ }
+
+ my %seen;
+ # sort return list alphabetically
+ return [
+ map { @$_ }
+ sort { $a->[0] cmp $b->[0] }
+ grep { not $seen{$_->[0] . '|' . $_->[1]}++ }
+ @modules
+ ];
+}
+
+=head2 query_script
+
+Note: Usually, you probably want to use C<query_script_hash()>
+instead. The usage of both methods is very similar (and described
+right below), but the data structure returned differes somewhat.
+
+Polls the repository for scripts matching certain criteria.
+Takes named arguments. Either a C<regex> or a C<name> parameter
+must be present but not both.
+
+Returns a reference to an array containing alternating distribution
+file names and script versions. This method returns the following
+structure
+
+ [ 'Foo-Bar-0.01-any_arch-5.8.7.par', '0.01', ... ]
+
+that means the script was found in the distribution
+F<Foo-Bar-0.01-any_arch-5.8.7.par> and the copy in that file has version
+0.01.
+
+Parameters:
+
+=over 2
+
+=item B<name>
+
+The name of the script to look for. This is used for an exact match.
+If you want to find C<foo> in C<foobar>, use the C<regex> parameter.
+Only one of C<name> and C<regex> may be specified.
+
+=item B<regex>
+
+Same as C<name>, but interpreted as a regular expression.
+Only one of C<name> and C<regex> may be specified.
+
+=item B<arch>
+
+Can be used to reduce the number of matches to a specific architecture.
+Always interpreted as a regular expression.
+
+=back
+
+=cut
+
+# FIXME: factor out common code from query_script and query_module!
+sub query_script {
+ my $self = shift;
+# $self->verbose(2, "Entering query_script()");
+
+ my $scripts = $self->query_script_hash(@_);
+
+ my %seen;
+ # sort return list alphabetically
+ return [
+ map { @$_ }
+ sort { $a->[0] cmp $b->[0] }
+ grep { not $seen{$_->[0] . '|' . $_->[1]}++ }
+ map {
+ my $scripthash = $scripts->{$_};
+ map { [$_, $scripthash->{$_}] } keys %$scripthash;
+ }
+ keys %$scripts
+ ];
+}
+
+
+=head2 query_script_hash
+
+Works exactly the same as C<query_script> except it returns
+a different resulting structure which includes the matching
+script's name:
+
+ { 'fooscript' => { 'Foo-Bar-0.01-any_arch-5.8.7.par' => '0.01', ... }, ... }
+
+that means the script C<fooscript> was found in the distribution
+F<Foo-Bar-0.01-any_arch-5.8.7.par> and the copy in that file has version
+0.01.
+
+Parameters are the same as for C<query_script>
+
+=cut
+
+# FIXME: factor out common code from query_script_hash and query_module!
+sub query_script_hash {
+ my $self = shift;
+# $self->verbose(2, "Entering query_script_hash()");
+ croak("query_script() or query_script_hash() called with uneven number of arguments.")
+ if @_ % 2;
+ my %args = @_;
+
+ my $name = $args{name};
+ my $regex = $args{regex};
+
+ if (defined $name and defined $regex) {
+ croak("query_script() or query_script_hash() accepts only one of 'name' and 'regex' parameters.");
+ }
+ elsif (not defined $name and not defined $regex) {
+ croak("query_script() or query_script_hash() needs one of 'name' and 'regex' parameters.");
+ }
+ elsif (defined $name) {
+ $regex = qr/^\Q$name\E$/;
+ }
+ else { # regex defined
+ $regex = qr/$regex/ if not ref($regex) eq 'Regexp';
+ }
+
+ my ($scrh, $scrfile) = $self->scripts_dbm
+ or die("Could not get scripts DBM.");
+
+ my %scripts;
+
+ my $arch_regex = $args{arch};
+ $arch_regex = qr/$arch_regex/
+ if defined $arch_regex and not ref($arch_regex) eq 'Regexp';
+
+ # iterate over all scripts in the scripts hash
+ while (my ($scr_name, $dists) = each(%$scrh)) {
+ # skip non-matching
+ next if $scr_name !~ $regex;
+
+ while (my ($distname, $version) = each(%$dists)) {
+ if (defined $arch_regex) {
+ (undef, undef, my $arch, undef)
+ = PAR::Dist::parse_dist_name($distname);
+ next if $arch !~ $arch_regex;
+ }
+ $scripts{$scr_name} = {} if not exists $scripts{$scr_name};
+ $scripts{$scr_name}{$distname} = $version; # distname => version
+ }
+ }
+
+ return \%scripts;
+}
+
+
+
+=head2 query_dist
+
+Polls the repository for distributions matching certain criteria.
+Takes named arguments. Either a C<regex> or a C<name> parameter
+must be present but not both.
+
+Returns a reference to an array containing alternating distribution
+file names and hash references. The hashes contain module names
+and associated versions in the distribution.
+This method returns the following structure
+
+ [
+ 'Foo-Bar-0.01-any_arch-5.8.7.par',
+ {Foo::Bar => '0.01', Foo::Bar::Baz => '0.02'},
+ ...
+ ]
+
+that means the distribution F<Foo-Bar-0.01-any_arch-5.8.7.par> matched and
+that distribution contains the modules C<Foo::Bar> and C<Foo::Bar::Baz>
+with versions 0.01 and 0.02 respectively.
+
+Parameters:
+
+=over 2
+
+=item B<name>
+
+The name of the distribution to look for. This is used for an exact match.
+If you want to find C<Foo> in C<Foo-Bar-0.01-any_arch-5.8.8.par>,
+use the C<regex> parameter.
+Only one of C<name> and C<regex> may be specified.
+
+=item B<regex>
+
+Same as C<name>, but interpreted as a regular expression.
+Only one of C<name> and C<regex> may be specified.
+
+=item B<arch>
+
+Can be used to reduce the number of matches to a specific architecture.
+Always interpreted as a regular expression.
+
+=back
+
+=cut
+
+sub query_dist {
+ my $self = shift;
+# $self->verbose(2, "Entering query_dist()");
+ croak("query_dist() called with uneven number of arguments.")
+ if @_ % 2;
+ my %args = @_;
+
+ my $name = $args{name};
+ my $regex = $args{regex};
+
+ if (defined $name and defined $regex) {
+ croak("query_dist() accepts only one of 'name' and 'regex' parameters.");
+ }
+ elsif (not defined $name and not defined $regex) {
+ croak("query_dist() needs one of 'name' and 'regex' parameters.");
+ }
+ elsif (defined $name) {
+ $regex = qr/^\Q$name\E$/;
+ }
+ else { # regex defined
+ $regex = qr/$regex/ if not ref($regex) eq 'Regexp';
+ }
+
+ my ($modh, $modfile) = $self->modules_dbm
+ or die("Could not get modules DBM.");
+
+ my %dists;
+
+ my $arch_regex = $args{arch};
+ $arch_regex = qr/$arch_regex/
+ if defined $arch_regex and not ref($arch_regex) eq 'Regexp';
+
+ # iterate over all modules in the mod_dbm hash
+ while (my ($mod_name, $this_dists) = each(%$modh)) {
+ # get the distributions for the module
+ my $this_dists = $modh->{$mod_name};
+
+ while (my ($dist_name, $dist) = each(%$this_dists)) {
+ # skip non-matching
+ next if $dist_name !~ $regex;
+
+ # skip non-matching archs
+ if (defined $arch_regex) {
+ (undef, undef, my $arch, undef)
+ = PAR::Dist::parse_dist_name($dist_name);
+ next if $arch !~ $arch_regex;
+ }
+
+ $dists{$dist_name}{$mod_name} = $dist;
+ }
+ }
+
+ # sort return list alphabetically
+ return [
+ map { @$_ }
+ sort { $a->[0] cmp $b->[0] }
+ map { [$_, $dists{$_}] }
+ keys %dists
+ ];
+}
+
+
+
+1;
+__END__
+
+=head1 AUTHOR
+
+Steffen Müller, E<lt>smueller@cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2006-2009 by Steffen Müller
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.6 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/SetupProgname.pm b/Master/tlpkg/tlperl.straw/lib/PAR/SetupProgname.pm
new file mode 100755
index 00000000000..23c7e1e3b5f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/SetupProgname.pm
@@ -0,0 +1,92 @@
+package PAR::SetupProgname;
+$PAR::VERSION = '0.982';
+
+use 5.006;
+use strict;
+use warnings;
+use Config ();
+
+=head1 NAME
+
+PAR::SetupProgname - Setup $ENV{PAR_PROGNAME}
+
+=head1 SYNOPSIS
+
+PAR guts, beware. Check L<PAR>
+
+=head1 DESCRIPTION
+
+Routines to setup the C<PAR_PROGNAME> environment variable.
+Read the C<PAR::Environment> manual.
+
+The C<set_progname()> subroutine sets up the C<PAR_PROGNAME>
+environment variable
+
+=cut
+
+# for PAR internal use only!
+our $Progname = $ENV{PAR_PROGNAME} || $0;
+
+# same code lives in PAR::Packer's par.pl!
+sub set_progname {
+ require File::Spec;
+
+ if (defined $ENV{PAR_PROGNAME} and $ENV{PAR_PROGNAME} =~ /(.+)/) {
+ $Progname = $1;
+ }
+ $Progname = $0 if not defined $Progname;
+
+ if (( () = File::Spec->splitdir($Progname) ) > 1 or !$ENV{PAR_PROGNAME}) {
+ if (open my $fh, $Progname) {
+ return if -s $fh;
+ }
+ if (-s "$Progname$Config::Config{_exe}") {
+ $Progname .= $Config::Config{_exe};
+ return;
+ }
+ }
+
+ foreach my $dir (split /\Q$Config::Config{path_sep}\E/, $ENV{PATH}) {
+ next if exists $ENV{PAR_TEMP} and $dir eq $ENV{PAR_TEMP};
+ my $name = File::Spec->catfile($dir, "$Progname$Config::Config{_exe}");
+ if (-s $name) { $Progname = $name; last }
+ $name = File::Spec->catfile($dir, "$Progname");
+ if (-s $name) { $Progname = $name; last }
+ }
+}
+
+
+1;
+
+__END__
+
+=head1 SEE ALSO
+
+The PAR homepage at L<http://par.perl.org>.
+
+L<PAR>, L<PAR::Environment>
+
+=head1 AUTHORS
+
+Audrey Tang E<lt>cpan@audreyt.orgE<gt>,
+Steffen Mueller E<lt>smueller@cpan.orgE<gt>
+
+L<http://par.perl.org/> is the official PAR website. You can write
+to the mailing list at E<lt>par@perl.orgE<gt>, or send an empty mail to
+E<lt>par-subscribe@perl.orgE<gt> to participate in the discussion.
+
+Please submit bug reports to E<lt>bug-par@rt.cpan.orgE<gt>. If you need
+support, however, joining the E<lt>par@perl.orgE<gt> mailing list is
+preferred.
+
+=head1 COPYRIGHT
+
+Copyright 2002-2008 by Audrey Tang E<lt>cpan@audreyt.orgE<gt>.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/SetupTemp.pm b/Master/tlpkg/tlperl.straw/lib/PAR/SetupTemp.pm
new file mode 100755
index 00000000000..6eeba3b2d23
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/SetupTemp.pm
@@ -0,0 +1,162 @@
+package PAR::SetupTemp;
+$PAR::VERSION = '0.982';
+
+use 5.006;
+use strict;
+use warnings;
+
+use PAR::SetupProgname;
+
+=head1 NAME
+
+PAR::SetupTemp - Setup $ENV{PAR_TEMP}
+
+=head1 SYNOPSIS
+
+PAR guts, beware. Check L<PAR>
+
+=head1 DESCRIPTION
+
+Routines to setup the C<PAR_TEMP> environment variable.
+The documentation of how the temporary directories are handled
+is currently scattered across the C<PAR> manual and the
+C<PAR::Environment> manual.
+
+The C<set_par_temp_env()> subroutine sets up the C<PAR_TEMP>
+environment variable.
+
+=cut
+
+# for PAR internal use only!
+our $PARTemp;
+
+# The C version of this code appears in myldr/mktmpdir.c
+# This code also lives in PAR::Packer's par.pl as _set_par_temp!
+sub set_par_temp_env {
+ PAR::SetupProgname::set_progname()
+ unless defined $PAR::SetupProgname::Progname;
+
+ if (defined $ENV{PAR_TEMP} and $ENV{PAR_TEMP} =~ /(.+)/) {
+ $PARTemp = $1;
+ return;
+ }
+
+ my $stmpdir = _get_par_user_tempdir();
+ require File::Spec;
+ if (defined $stmpdir) { # it'd be quite bad if this was not the case
+ if (!$ENV{PAR_CLEAN} and my $mtime = (stat($PAR::SetupProgname::Progname))[9]) {
+ my $ctx = _get_digester();
+
+ # Workaround for bug in Digest::SHA 5.38 and 5.39
+ my $sha_version = eval { $Digest::SHA::VERSION } || 0;
+ if ($sha_version eq '5.38' or $sha_version eq '5.39') {
+ $ctx->addfile($PAR::SetupProgname::Progname, "b") if ($ctx);
+ }
+ else {
+ if ($ctx and open(my $fh, "<$PAR::SetupProgname::Progname")) {
+ binmode($fh);
+ $ctx->addfile($fh);
+ close($fh);
+ }
+ }
+
+ $stmpdir = File::Spec->catdir(
+ $stmpdir,
+ "cache-" . ( $ctx ? $ctx->hexdigest : $mtime )
+ );
+ }
+ else {
+ $ENV{PAR_CLEAN} = 1;
+ $stmpdir = File::Spec->catdir($stmpdir, "temp-$$");
+ }
+
+ $ENV{PAR_TEMP} = $stmpdir;
+ mkdir $stmpdir, 0755;
+ } # end if found a temp dir
+
+ $PARTemp = $1 if defined $ENV{PAR_TEMP} and $ENV{PAR_TEMP} =~ /(.+)/;
+}
+
+# Find any digester
+# Used in PAR::Repository::Client!
+sub _get_digester {
+ my $ctx = eval { require Digest::SHA; Digest::SHA->new(1) }
+ || eval { require Digest::SHA1; Digest::SHA1->new }
+ || eval { require Digest::MD5; Digest::MD5->new };
+ return $ctx;
+}
+
+# find the per-user temporary directory (eg /tmp/par-$USER)
+# Used in PAR::Repository::Client!
+sub _get_par_user_tempdir {
+ my $username = _find_username();
+ my $temp_path;
+ foreach my $path (
+ (map $ENV{$_}, qw( PAR_TMPDIR TMPDIR TEMPDIR TEMP TMP )),
+ qw( C:\\TEMP /tmp . )
+ ) {
+ next unless defined $path and -d $path and -w $path;
+ $temp_path = File::Spec->catdir($path, "par-$username");
+ ($temp_path) = $temp_path =~ /^(.*)$/s;
+ mkdir $temp_path, 0755;
+
+ last;
+ }
+ return $temp_path;
+}
+
+# tries hard to find out the name of the current user
+sub _find_username {
+ my $username;
+ my $pwuid;
+ # does not work everywhere:
+ eval {($pwuid) = getpwuid($>) if defined $>;};
+
+ if ( defined(&Win32::LoginName) ) {
+ $username = &Win32::LoginName;
+ }
+ elsif (defined $pwuid) {
+ $username = $pwuid;
+ }
+ else {
+ $username = $ENV{USERNAME} || $ENV{USER} || 'SYSTEM';
+ }
+ $username =~ s/\W/_/g;
+
+ return $username;
+}
+
+1;
+
+__END__
+
+=head1 SEE ALSO
+
+The PAR homepage at L<http://par.perl.org>.
+
+L<PAR>, L<PAR::Environment>
+
+=head1 AUTHORS
+
+Audrey Tang E<lt>cpan@audreyt.orgE<gt>,
+Steffen Mueller E<lt>smueller@cpan.orgE<gt>
+
+L<http://par.perl.org/> is the official PAR website. You can write
+to the mailing list at E<lt>par@perl.orgE<gt>, or send an empty mail to
+E<lt>par-subscribe@perl.orgE<gt> to participate in the discussion.
+
+Please submit bug reports to E<lt>bug-par@rt.cpan.orgE<gt>. If you need
+support, however, joining the E<lt>par@perl.orgE<gt> mailing list is
+preferred.
+
+=head1 COPYRIGHT
+
+Copyright 2002-2008 by Audrey Tang E<lt>cpan@audreyt.orgE<gt>.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/PAR/Tutorial.pod b/Master/tlpkg/tlperl.straw/lib/PAR/Tutorial.pod
new file mode 100755
index 00000000000..ab797739d84
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PAR/Tutorial.pod
@@ -0,0 +1,1116 @@
+=head1 NAME
+
+PAR::Tutorial - Cross-Platform Packaging and Deployment with PAR
+
+=head1 SYNOPSIS
+
+This is a tutorial on PAR, first appeared at the 7th Perl Conference.
+The HTML version of this tutorial is available online as
+L<http://search.cpan.org/perldoc?PAR::Tutorial>
+
+=head1 DESCRIPTION
+
+=head2 On Deploying Perl Applications
+
+ % sshnuke.pl 10.2.2.2 -rootpw="Z1ON0101"
+ Perl v5.6.1 required--this is only v5.6.0, stopped at sshnuke.pl line 1.
+ BEGIN failed--compilation aborted at sshnuke.pl line 1.
+
+=over 4
+
+=item * Q: "Help! I can't run your program!"
+
+=item * A1: Install Perl & C<perl -MCPAN -e'install(...)'>
+
+=over 4
+
+=item * How do we know which modules are needed?
+
+=item * New versions of CPAN modules may break C<sshnuke.pl>
+
+=back
+
+=item * A2: Install Perl & C<tar zxf my_perllib.tgz>
+
+=over 4
+
+=item * Possibly overwriting existing modules; not cross-platform at all
+
+=back
+
+=item * A3: Use the executable generated by C<perlcc sshnuke.pl>
+
+=over 4
+
+=item * Impossible to debug; C<perlcc> usually does not work anyway
+
+=back
+
+=back
+
+
+
+=head2 PAR, the Perl Archive Toolkit
+
+=over 4
+
+=item * Do what JAR (Java Archive) does for Perl
+
+=over 4
+
+=item * Aggregates modules, scripts and other files into a Zip file
+
+=item * Easy to generate, update and extract
+
+=item * Version consistency: solves forward-compatibility problems
+
+=item * Developed by community: C<par@perl.org>
+
+=back
+
+=item * PAR files can be packed into self-contained scripts
+
+=over 4
+
+=item * Automatically scans perl script for dependencies
+
+=item * Bundles all necessary 3rd-party modules with it
+
+=item * Requires only core Perl to run on the target machine
+
+=item * PAR also comes with C<pp>, the Perl Packager:
+
+ % pp -o sshnuke.exe sshnuke.pl # stand-alone executable!
+
+=back
+
+=back
+
+
+
+=head2 Simple Packaging
+
+=over 4
+
+=item * PAR files are just Zip files with modules in it
+
+=item * Any Zip tools can generate them:
+
+ % zip foo.par Hello.pm World.pm # pack two modules
+ % zip -r bar.par lib/ # grab all modules in lib/
+
+=item * To load modules from PAR files:
+
+ use PAR;
+ use lib "foo.par"; # the .par part is optional
+ use Hello;
+
+=item * This also works:
+
+ use PAR "/home/mylibs/*.par"; # put all of them into @INC
+ use Hello;
+
+=back
+
+
+
+=head2 PAR Loaders
+
+=over 4
+
+=item * Use C<par.pl> to run files inside a PAR archive:
+
+ % par.pl foo.par # looks for 'main.pl' by default
+ % par.pl foo.par test.pl # runs script/test.pl in foo.par
+
+=item * Same thing, with the stand-alone C<parl> or C<parl.exe>:
+
+ % parl foo.par # no perl or PAR.pm needed!
+ % parl foo.par test.pl # ditto
+
+=item * The PAR loader can prepend itself to a PAR file:
+
+=over 4
+
+=item * C<-b> bundles non-core modules needed by C<PAR.pm>:
+
+ % par.pl -b -O./foo.pl foo.par # self-contained script
+
+=item * C<-B> bundles core modules in addition to C<-b>:
+
+ % parl -B -O./foo.exe foo.par # self-contained binary
+
+=back
+
+=back
+
+
+
+=head2 Dependency Scanning
+
+=over 4
+
+=item * Recursively scan dependencies with C<scandeps.pl>:
+
+ % scandeps.pl sshnuke.pl
+ # Legend: [C]ore [X]ternal [S]ubmodule [?]NotOnCPAN
+ 'Crypt::SSLeay' => '0', # X #
+ 'Net::HTTP' => '0', # #
+ 'Crypt::SSLeay::X509' => '0', # S # Crypt::SSLeay
+ 'Net::HTTP::Methods' => '0', # S # Net::HTTP
+ 'Compress::Zlib' => '0', # X # Net::HTTP::Methods
+
+=item * Scan an one-liner, list all involved files:
+
+ % scandeps.pl -V -e "use Dynaloader;"
+ ...
+ # auto/DynaLoader/dl_findfile.al [autoload]
+ # auto/DynaLoader/extralibs.ld [autoload]
+ # auto/File/Glob/Glob.bs [data]
+ # auto/File/Glob/Glob.so [shared]
+ ...
+
+=back
+
+
+
+=head2 Perl Packager: C<pp>
+
+=over 4
+
+=item * Combines scanning, zipping and loader-embedding:
+
+ % pp -o out.exe src.pl # self-contained .exe
+ % out.exe # runs anywhere on the same OS
+
+=item * Bundle additional modules:
+
+ % pp -o out.exe -M CGI src.pl # pack CGI + its dependencies, too
+
+=item * Pack one-liners:
+
+ % pp -o out.exe -e 'print "Hi!"' # turns one-liner into executable
+
+
+=item * Generate PAR files instead of executables:
+
+ % pp -p src.pl # makes 'source.par'
+ % pp -B -p src.pl # include core modules
+
+=back
+
+
+
+=head2 How it works
+
+=over 4
+
+=item * Command-line options are almost identical to C<perlcc>'s
+
+=over 4
+
+=item * Also supports C<gcc>-style long options:
+
+ % pp --gui --verbose --output=out.exe src.pl
+
+=back
+
+=item * Small initial overhead; no runtime overhead
+
+=item * Dependencies are POD-stripped before packing
+
+=item * Loads modules directly into memory on demand
+
+=item * Shared libraries (DLLs) are extracted with File::Temp
+
+=item * Works on Perl 5.6.0 or above
+
+=item * Tested on Win32 (VC++ and MinGW), FreeBSD, NetBSD, Linux, MacOSX, Cygwin, AIX, Solaris, HP-UX, Tru64...
+
+=back
+
+
+
+=head2 Aggregating multiple programs
+
+=over 4
+
+=item * A common question:
+
+ > I have used pp to make several standalone applications which work
+ > great, the only problem is that for each executable that I make, I am
+ > assuming the parl.exe is somehow bundled into the resulting exe.
+
+=item * The obvious workaround:
+
+ You can ship parl.exe by itself, along with .par files built
+ by "pp -p", and run those PAR files by associating them to parl.exe.
+
+=item * On platforms that have C<ln>, there is a better solution:
+
+ % pp --output=a.out a.pl b.pl # two scripts in one!
+ % ln a.out b.out # symlink also works
+ % ./a.out # runs a.pl
+ % ./b.out # runs b.pl
+
+=back
+
+
+
+=head2 Cross-platform Packages
+
+=over 4
+
+=item * Of course, there is no cross-platform binary format
+
+=item * Pure-perl PAR packages are cross-platform by default
+
+=over 4
+
+=item * However, XS modules are specific to Perl version and platform
+
+=item * Multiple versions of a XS module can co-exist in a PAR file
+
+=back
+
+=item * Suppose we need C<out.par> on both Win32 and Finix:
+
+ C:\> pp --multiarch --output=out.par src.pl
+ ...copy src.pl and out.par to a Finix machine...
+ % pp --multiarch --output=out.par src.pl
+
+=item * Now it works on both platforms:
+
+ % parl out.par # runs src.pl
+ % perl -MPAR=out.par -e '...' # uses modules inside out.par
+
+=back
+
+
+
+=head2 The Anatomy of a PAR file
+
+=over 4
+
+=item * Modules can reside in several directories:
+
+ / # casual packaging only
+ /lib/ # standard location
+ /arch/ # for creating from blib/
+ /i386-freebsd/ # i.e. $Config{archname}
+ /5.8.0/ # i.e. Perl version number
+ /5.8.0/i386-freebsd/ # combination of the two above
+
+=item * Scripts are stored in one of the two locations:
+
+ / # casual packaging only
+ /script/ # standard location
+
+=item * Shared libraries may be architecture- or perl-version-specific:
+
+ /shlib/(5.8.0/)?(i386-freebsd/)?
+
+=item * PAR files may recursively contain other PAR files:
+
+ /par/(5.8.0/)?(i386-freebsd/)?
+
+=back
+
+
+
+=head2 Special files
+
+=over 4
+
+=item * MANIFEST
+
+=over 4
+
+=item * Index of all files inside PAR
+
+=item * Can be parsed with C<ExtUtils::Manifest>
+
+=back
+
+=item * META.yml
+
+=over 4
+
+=item * Dependency, license, runtime options
+
+=item * Can be parsed with C<YAML>
+
+=back
+
+=item * SIGNATURE
+
+=over 4
+
+=item * OpenPGP-signed digital signature
+
+=item * Can be parsed and verified with C<Module::Signature>
+
+=back
+
+=back
+
+
+
+=head2 Advantages over perlcc, PerlApp and Perl2exe
+
+=over 4
+
+=item * This is not meant to be a flame
+
+=over 4
+
+=item * All three maintainers have contributed to PAR directly; I'm grateful
+
+=back
+
+=item * perlcc
+
+=over 4
+
+=item * "The code generated in this way is not guaranteed to work... Use for production purposes is strongly discouraged." (from perldoc perlcc)
+
+=item * I<Guaranteed to not work> is more like it
+
+=back
+
+=item * PerlApp / Perl2exe
+
+=over 4
+
+=item * Expensive: Need to pay for each upgrade
+
+=item * Non-portable: Only available for limited platforms
+
+=item * Proprietary: Cannot extend its features or fix bugs
+
+=item * Obfuscated: Vendor and black-hats can see your code, but you can't
+
+=item * Inflexible: Does not work with existing Perl installations
+
+=back
+
+=back
+
+
+
+=head2 MANIFEST: Best viewed with Mozilla
+
+=over 4
+
+=item * The URL of C<MANIFEST> inside C</home/autrijus/foo.par>:
+
+ jar:file:///home/autrijus/foo.par!/MANIFEST
+
+=item * Open it in a Gecko browser (e.g. Netscape 6+) with Javascript enabled:
+
+=item * No needed to unzip anything; just click on files to view them
+
+=back
+
+
+
+=head2 META.yml: Metadata galore
+
+=over 4
+
+=item * Static, machine-readable distribution metadata
+
+=over 4
+
+=item * Supported by C<Module::Build>, C<ExtUtils::MakeMaker>, C<Module::Install>
+
+=back
+
+=item * A typical C<pp>-generated C<META.yml> looks like this:
+
+ build_requires: {}
+ conflicts: {}
+ dist_name: out.par
+ distribution_type: par
+ dynamic_config: 0
+ generated_by: 'Perl Packager version 0.03'
+ license: unknown
+ par:
+ clean: 0
+ signature: ''
+ verbatim: 0
+ version: 0.68
+
+=item * The C<par:> settings controls its runtime behavior
+
+=back
+
+
+
+=head2 SIGNATURE: Signing and verifying packages
+
+=over 4
+
+=item * OpenPGP clear-signed manifest with SHA1 digests
+
+=over 4
+
+=item * Supported by C<Module::Signature>, C<CPANPLUS> and C<Module::Build>
+
+=back
+
+=item * A typical C<SIGNATURE> looks like this:
+
+ -----BEGIN PGP SIGNED MESSAGE-----
+ Hash: SHA1
+
+ SHA1 8a014cd6d0f6775552a01d1e6354a69eb6826046 AUTHORS
+ ...
+ -----BEGIN PGP SIGNATURE-----
+ ...
+ -----END PGP SIGNATURE-----
+
+=item * Use C<pp> and C<cpansign> to work with signatures:
+
+ % pp -s -o foo.par bar.pl # make and sign foo.par from bar.pl
+ % cpansign -s foo.par # sign this PAR file
+ % cpansign -v foo.par # verify this PAR file
+
+=back
+
+
+
+=head2 Perl Servlets with Apache::PAR
+
+=over 4
+
+=item * Framework for self-contained Web applications
+
+=over 4
+
+=item * Similar to Java's "Web Application Archive" (WAR) files
+
+=item * Works with mod_perl 1.x or 2.x
+
+=back
+
+=item * A complete web application inside a C<.par> file
+
+=over 4
+
+=item * Apache configuration, static files, Perl modules...
+
+=item * Supports Static, Registry and PerlRun handlers
+
+=item * Can also load all PARs under a directory
+
+=back
+
+=item * One additional special file: C<web.conf>
+
+ Alias /myapp/cgi-perl/ ##PARFILE##/
+ <Location /myapp/cgi-perl>
+ Options +ExecCGI
+ SetHandler perl-script
+ PerlHandler Apache::PAR::Registry
+ </Location>
+
+=back
+
+
+
+=head2 Hon Dah, A-par-che!
+
+=over 4
+
+=item * First, make a C<hondah.par> from an one-liner:
+
+ # use the "web.conf" from the previous slide
+ % pp -p -o hondah.par -e 'print "Hon Dah!\n"' \
+ --add web.conf
+ % chmod a+x hondah.par
+
+=item * Add this to C<httpd.conf>, then restart apache:
+
+ <IfDefine MODPERL2>
+ PerlModule Apache2
+ </IfDefine>
+ PerlAddVar PARInclude /home/autrijus/hondah.par
+ PerlModule Apache::PAR
+
+=item * Test it out:
+
+ % GET http://localhost/myapp/cgi-perl/main.pl
+ Hon Dah!
+
+=item * Instant one-liner web application that works!
+
+=back
+
+
+
+=head2 On-demand library fetching
+
+=over 4
+
+=item * With LWP installed, your can use remote PAR files:
+
+ use PAR;
+ use lib 'http://aut.dyndns.org/par/DBI-latest.par';
+ use DBI; # always up to date!
+
+=item * Modules are now cached under C<$ENV{PAR_GLOBAL_TEMP}>
+
+=item * Auto-updates with C<LWP::Simple::mirror>
+
+=over 4
+
+=item * Download only if modified
+
+=item * Safe for offline use after the first time
+
+=item * May use C<SIGNATURE> to prevent DNS-spoofing
+
+=back
+
+=item * Makes large-scale deployment a breeze
+
+=over 4
+
+=item * Upgrades from a central location
+
+=item * No installers needed
+
+=back
+
+=back
+
+
+
+=head2 Code Obfuscation
+
+=over 4
+
+=item * Also known as I<source-hiding> techniques
+
+=over 4
+
+=item * It is I<not> encryption
+
+=item * Offered by PerlApp, Perl2Exe, Stunnix...
+
+=back
+
+=item * Usually easy to defeat
+
+=over 4
+
+=item * Take optree dump from memory, feed to C<B::Deparse>
+
+=item * If you just want to stop a casual C<grep>, "deflate" already works
+
+=back
+
+=item * PAR now supports pluggable I<input filters> with C<pp -f>
+
+=over 4
+
+=item * Bundled examples: Bleach, PodStrip and PatchContent
+
+=item * True encryption using C<Crypt::*>
+
+=item * Or even _product activation_ over the internet
+
+=back
+
+=item * Alternatively, just keep core logic in your server and use RPC
+
+=back
+
+
+
+=head2 Accessing packed files
+
+=over 4
+
+=item * To get the host archive from a packed program:
+
+ my $zip = PAR::par_handle($0); # an Archive::Zip object
+ my $content = $zip->contents('MANIFEST');
+
+=item * Same thing, but with C<read_file()>:
+
+ my $content = PAR::read_file('MANIFEST');
+
+=item * Loaded PAR files are stored in C<%PAR::LibCache>:
+
+ use PAR '/home/mylibs/*.par';
+ while (my ($filename, $zip) = each %PAR::LibCache) {
+ print "[$filename - MANIFEST]\n";
+ print $zip->contents('MANIFEST');
+ }
+
+=back
+
+
+
+=head2 Packing GUI applications
+
+=over 4
+
+=item * GUI toolkits often need to link with shared libraries:
+
+ # search for libncurses under library paths and pack it
+ % pp -l ncurses curses_app.pl # same for Tk, Wx, Gtk, Qt...
+
+=item * Use C<pp --gui> on Win32 to eliminate the console window:
+
+ # pack 'src.pl' into a console-less 'out.exe' (Win32 only)
+ % pp --gui -o out.exe src.pl
+
+=item * "Can't locate Foo/Widget/Bar.pm in @INC"?
+
+=over 4
+
+=item * Some toolkits (notably Tk) autoloads modules without C<use> or C<require>
+
+=item * Hence C<pp> and C<Module::ScanDeps> may fail to detect them
+
+=item * Tk problems mostly fixed by now, but other toolkits may still break
+
+=item * You can work around it with C<pp -M> or an explicit C<require>
+
+=item * Or better, send a short test-case to C<par@perl.org> so we can fix it
+
+=back
+
+=back
+
+
+
+=head2 Precompiled CPAN distributions
+
+=over 4
+
+=item * Installing XS extensions from CPAN was difficult
+
+=over 4
+
+=item * Some platforms do not come with a compiler (Win32, MacOSX...)
+
+=item * Some headers or libraries may be missing
+
+=item * PAR.pm itself used to suffer from both problems
+
+=back
+
+=item * ...but not anymore -- C<Module::Install> to the rescue!
+
+ # same old Makefile.PL, with a few changes
+ use inc::Module::Install; # was "use ExtUtils::MakeMaker;"
+ WriteMakefile( ... ); # same as the original
+ check_nmake(); # make sure the user have nmake
+ par_base('AUTRIJUS'); # your CPAN ID or a URL
+ fetch_par() unless can_cc(); # use precompiled PAR only if necessary
+
+=item * Users will not notice anything, except now it works
+
+=over 4
+
+=item * Of course, you still need to type C<make par> and upload the precompiled package
+
+=item * PAR users can also install it directly with C<parl -i>
+
+=back
+
+=back
+
+
+
+=head2 Platform-specific Tips
+
+=over 4
+
+=item * Win32 and other icon-savvy platforms
+
+=over 4
+
+=item * Needs 3rd-party tools to add icons to C<pp>-generated executables
+
+=item * PE Header manipulation in Perl -- volunteers wanted!
+
+=back
+
+=item * Linux and other libc-based platforms
+
+=over 4
+
+=item * Try to avoid running C<pp> on a bleeding-edge version of the OS
+
+=item * Older versions with an earlier libc won't work with new ones
+
+=back
+
+=item * Solaris and other zlib-lacking platforms (but not Win32)
+
+=over 4
+
+=item * You need a static-linked C<Compress::Zlib> before installing PAR
+
+=item * In the future, PAR may depend on C<Compress::Zlib::Static> instead
+
+=back
+
+=item * Any platform with limited bandwidth or disk space
+
+=over 4
+
+=item * Use UPX to minimize the executable size
+
+=back
+
+=back
+
+
+
+=head2 Thank you!
+
+=over 4
+
+=item * Additional resources
+
+=over 4
+
+=item * Mailing list: C<par@perl.org>
+
+=item * Subscribe: Send a blank email to C<par-subscribe@perl.org>
+
+=item * List archive: L<http://nntp.x.perl.org/group/perl.par>
+
+=item * PAR::Intro: L<http://search.cpan.org/dist/PAR/lib/PAR/Intro.pod>
+
+=item * Apache::PAR: L<http://search.cpan.org/dist/Apache-PAR/>
+
+=item * Module::Install: L<http://search.cpan.org/dist/Module-Install/>
+
+=back
+
+=item * Any questions?
+
+=back
+
+
+
+=head2 Bonus Slides: PAR Internals
+
+
+
+=head2 Overview of PAR.pm's Implementation
+
+=over 4
+
+=item * Here begins the scary part
+
+=over 4
+
+=item * Grues, Dragons and Jabberwocks abound...
+
+=item * You are going to learn weird things about Perl internals
+
+=back
+
+=item * PAR invokes four areas of Perl arcana:
+
+=over 4
+
+=item * @INC code references
+
+=item * On-the-fly source filtering
+
+=item * Overriding C<DynaLoader::bootstrap()> to handle XS modules
+
+=item * Making self-bootstrapping binary executables
+
+=back
+
+=item * The first two only works on 5.6 or later
+
+=over 4
+
+=item * DynaLoader and C<%INC> are there since Perl 5 was born
+
+=item * PAR currently needs 5.6, but a 5.005 port is possible
+
+=back
+
+=back
+
+
+
+=head2 Code References in @INC
+
+=over 4
+
+=item * On 1999-07-19, Ken Fox submitted a patch to P5P
+
+=over 4
+
+=item * To _enable using remote modules_ by putting hooks in @INC
+
+=item * It's accepted to come in Perl 5.6, but undocumented until 5.8
+
+=item * Type C<perldoc -f require> to read the nitty-gritty details
+
+=back
+
+=item * Coderefs in @INC may return a fh, or undef to 'pass':
+
+ push @INC, sub {
+ my ($coderef, $filename) = @_; # $coderef is \&my_sub
+ open my $fh, "wget ftp://example.com/$filename |";
+ return $fh; # using remote modules, indeed!
+ };
+
+=item * Perl 5.8 let you open a file handle to a string, so we just use that:
+
+ open my $fh, '<', \($zip->memberNamed($filename)->contents);
+ return $fh;
+
+=item * But Perl 5.6 does not have that, and I don't want to use temp files...
+
+=back
+
+
+
+=head2 Source Filtering without Filter::* Modules
+
+=over 4
+
+=item * ... Undocumented features to the rescue!
+
+=over 4
+
+=item * It turns out that @INC hooks can return B<two> values
+
+=item * The first is still the file handle
+
+=item * The second is a code reference for line-by-line source filtering!
+
+=back
+
+=item * This is how C<Acme::use::strict::with::pride> works:
+
+ # Force all modules used to use strict and warnings
+ open my $fh, "<", $filename or return;
+ my @lines = ("use strict; use warnings;\n", "#line 1 \"$full\"\n");
+ return ($fh, sub {
+ return 0 unless @lines;
+ push @lines, $_; $_ = shift @lines; return length $_;
+ });
+
+=back
+
+
+
+=head2 Source Filtering without Filter::* Modules (cont.)
+
+=over 4
+
+=item * But we don't really have a filehandle for anything
+
+=item * Another undocumented feature saves the day!
+
+=item * We can actually omit the first return value altogether:
+
+ # Return all contents line-by-line from the file inside PAR
+ my @lines = split(
+ /(?<=\n)/,
+ $zip->memberNamed($filename)->contents
+ );
+ return (sub {
+ $_ = shift(@lines);
+ return length $_;
+ });
+
+=back
+
+
+
+=head2 Overriding DynaLoader::bootstrap
+
+=over 4
+
+=item * XS modules have dynamically loaded libraries
+
+=over 4
+
+=item * They cannot be loaded as part of a zip file, so we extract them out
+
+=item * Must intercept DynaLoader's library-finding process
+
+=back
+
+=item * Module names are passed to C<bootstrap> for XS loading
+
+=over 4
+
+=item * During the process, it calls C<dl_findfile> to locate the file
+
+=item * So we install pre-hooks around both functions
+
+=back
+
+=item * Our C<_bootstrap> just checks if the library is in PARs
+
+=over 4
+
+=item * If yes, extract it to a C<File::Temp> temp file
+
+=over 4
+
+=item * The file will be automatically cleaned up when the program ends
+
+=back
+
+=item * It then pass the arguments to the original C<bootstrap>
+
+=item * Finally, our C<dl_findfile> intercepts known filenames and return it
+
+=back
+
+=back
+
+
+
+=head2 Anatomy of a Self-Contained PAR executable
+
+=over 4
+
+=item * The par script ($0) itself
+
+=over 4
+
+=item * May be in plain-text or native executable format
+
+=back
+
+=item * Any number of embedded files
+
+=over 4
+
+=item * Typically used to bootstrap PAR's various dependencies
+
+=item * Each section begins with the magic string "FILE"
+
+=item * Length of filename in pack('N') format and the filename (auto/.../)
+
+=item * File length in pack('N') and the file's content (not compressed)
+
+=back
+
+=item * One PAR file
+
+=over 4
+
+=item * Just a regular zip file with the magic string C<"PK\003\004">
+
+=back
+
+=item * Ending section
+
+=over 4
+
+=item * A pack('N') number of the total length of FILE and PAR sections
+
+=item * Finally, there must be a 8-bytes magic string: C<"\012PAR.pm\012">
+
+=back
+
+=back
+
+
+
+=head2 Self-Bootstrapping Tricks
+
+=over 4
+
+=item * All we can expect is a working perl interpreter
+
+=over 4
+
+=item * The self-contained script *must not* use any modules at all
+
+=item * But to process PAR files, we need XS modules like Compress::Zlib
+
+=back
+
+=item * Answer: bundle all modules + libraries used by PAR.pm
+
+=over 4
+
+=item * That's what the C<FILE> section in the previous slide is for
+
+=item * Load modules to memory, and write object files to disk
+
+=item * Then use a local C<@INC> hook to load them on demand
+
+=back
+
+=item * Minimizing the amount of temporary files
+
+=over 4
+
+=item * First, try to load PerlIO::scalar and File::Temp
+
+=item * Set up an END hook to unlink all temp files up to this point
+
+=item * Load other bundled files, and look in the compressed PAR section
+
+=item * This can be much easier with a pure-perl C<inflate()>; patches welcome!
+
+=back
+
+=back
+
+
+
+=head2 Thank you (again)!
+
+=over 4
+
+=item * Any questions, I<please>?
+
+=back
+
+
+=cut
+
+
+=head1 SEE ALSO
+
+L<PAR>, L<pp>, L<par.pl>, L<parl>
+
+L<ex::lib::zip>, L<Acme::use::strict::with::pride>
+
+L<App::Packer>, L<Apache::PAR>, L<CPANPLUS>, L<Module::Install>
+
+=head1 AUTHORS
+
+Audrey Tang E<lt>cpan@audreyt.orgE<gt>
+
+L<http://par.perl.org/> is the official PAR website. You can write
+to the mailing list at E<lt>par@perl.orgE<gt>, or send an empty mail to
+E<lt>par-subscribe@perl.orgE<gt> to participate in the discussion.
+
+Please submit bug reports to E<lt>bug-par@rt.cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+Copyright 2003, 2004, 2005, 2006 by Audrey Tang E<lt>cpan@audreyt.orgE<gt>.
+
+This document is free documentation; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/PPM.pm b/Master/tlpkg/tlperl.straw/lib/PPM.pm
new file mode 100755
index 00000000000..ff442c41de2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/PPM.pm
@@ -0,0 +1,2138 @@
+package PPM;
+require 5.004;
+require Exporter;
+use vars qw( $VERSION );
+$VERSION = '0.01_01';
+
+@ISA = qw(Exporter);
+@EXPORT = qw(PPMdat PPMERR InstalledPackageProperties ListOfRepositories
+ RemoveRepository AddRepository GetPPMOptions SetPPMOptions InstallPackage
+ RemovePackage VerifyPackage UpgradePackage RepositoryPackages
+ RepositoryPackageProperties QueryInstalledPackages
+ RepositorySummary ServerSearch PPMShell);
+
+use LWP::UserAgent;
+use LWP::Simple;
+
+use File::Basename;
+use File::Copy;
+use File::Path;
+use File::Spec;
+use ExtUtils::Install;
+use Cwd;
+use Config;
+use PPM::RelocPerl;
+
+use PPM::XML::PPD;
+use PPM::XML::PPMConfig;
+use XML::Parser;
+use Archive::Tar;
+use Archive::Zip;
+
+use strict;
+
+if ($] <= 5.008) {
+ require SOAP::Lite;
+}
+
+my $useDocTools; # Generate HTML documentation after installing a package
+
+BEGIN {
+ if (eval "require ActivePerl::DocTools") {
+ import ActivePerl::DocTools;
+ $useDocTools++;
+ }
+}
+
+#set Debug to 1 to debug PPMdat file reading
+# 2 to debug parsing PPDs
+#
+# values may be or'ed together.
+#
+my $Debug = 0;
+
+my ($PPMERR, $PPM_ver, $CPU, $OS_VALUE, $OS_VERSION, $LANGUAGE);
+
+# options from data file.
+my %options;
+
+my $TraceStarted = 0;
+
+# true if we're running from ppm.pl, as opposed to VPM, etc.
+my $PPMShell;
+
+my %repositories;
+my %cached_ppd_list;
+
+# Keys for this hash are package names. It is filled in by a successful
+# call to read_config(). Each package is a hash with the following keys:
+# LOCATION, INST_DATE, INST_ROOT, INST_PACKLIST and INST_PPD.
+my %installed_packages = ();
+
+# Keys for this hash are CODEBASE, INSTALL_HREF, INSTALL_EXEC,
+# INSTALL_SCRIPT, NAME, VERSION, TITLE, ABSTRACT, LICENSE, AUTHOR,
+# UNINSTALL_HREF, UNINSTALL_EXEC, UNINSTALL_SCRIPT, PERLCORE_VER and DEPEND.
+# It is filled in after a successful call to parsePPD().
+my %current_package = ();
+my @current_package_stack;
+
+# this may get overridden by the config file.
+my @required_packages = qw(PPM SOAP-Lite libnet Archive-Tar Compress-Zlib
+ libwww-perl XML-Parser XML-Element);
+
+# Packages that can't be upgraded on Win9x
+my @Win9x_denied = qw(xml-parser compress-zlib);
+my %Win9x_denied;
+@Win9x_denied{@Win9x_denied} = ();
+
+# ppm.xml location is in the environment variable 'PPM_DAT', else it is in
+# [Perl]/site/lib, else it is in the same place as this script.
+my ($basename, $path) = fileparse($0);
+
+if (defined $ENV{'PPM_DAT'} && -f $ENV{'PPM_DAT'})
+{
+ $PPM::PPMdat = $ENV{'PPM_DAT'};
+}
+elsif (-f "$Config{'installsitelib'}/ppm.xml")
+{
+ $PPM::PPMdat = "$Config{'installsitelib'}/ppm.xml";
+}
+elsif (-f "$Config{'installprivlib'}/ppm.xml")
+{
+ $PPM::PPMdat = "$Config{'installprivlib'}/ppm.xml";
+}
+elsif (-f $path . "/ppm.xml")
+{
+ $PPM::PPMdat = $path . $PPM::PPMdat;
+}
+else
+{
+ &Trace("Failed to load PPM_DAT file") if $options{'TRACE'};
+ print "Failed to load PPM_DAT file\n";
+ return -1;
+}
+
+&Trace("Using config file: $PPM::PPMdat") if $options{'TRACE'};
+
+my $init = 0;
+chmod(0600, $PPM::PPMdat);
+
+# add -5.d to archname for Perl >= 5.8
+my $varchname = $Config{archname};
+if ($] >= 5.008) {
+ my $vstring = sprintf "%vd", $^V;
+ $vstring =~ s/\.\d+$//;
+ $varchname .= "-$vstring";
+}
+
+#
+# Exported subs
+#
+
+sub InstalledPackageProperties
+{
+ my %ret_hash;
+ read_config();
+ foreach (keys %installed_packages) {
+ parsePPD(%{ $installed_packages{$_}{'INST_PPD'} } );
+ $ret_hash{$_}{'NAME'} = $_;
+ $ret_hash{$_}{'DATE'} = $installed_packages{$_}{'INST_DATE'};
+ $ret_hash{$_}{'TITLE'} = $current_package{'TITLE'};
+ $ret_hash{$_}{'AUTHOR'} = $current_package{'AUTHOR'};
+ $ret_hash{$_}{'VERSION'} = $current_package{'VERSION'};
+ $ret_hash{$_}{'ABSTRACT'} = $current_package{'ABSTRACT'};
+ $ret_hash{$_}{'PERLCORE_VER'} = $current_package{'PERLCORE_VER'};
+ foreach my $dep (keys %{$current_package{'DEPEND'}}) {
+ push @{$ret_hash{$_}{'DEPEND'}}, $dep;
+ }
+ }
+ return %ret_hash;
+}
+
+sub ListOfRepositories
+{
+ my %reps;
+ read_config();
+ foreach (keys %repositories) {
+ $reps{$_} = $repositories{$_}{'LOCATION'};
+ }
+ return %reps;
+}
+
+sub RemoveRepository
+{
+ my %argv = @_;
+ my $repository = $argv{'repository'};
+ my $save = $argv{'save'};
+ read_config();
+ foreach (keys %repositories) {
+ if ($_ =~ /^\Q$repository\E$/) {
+ &Trace("Removed repository $repositories{$repository}")
+ if $options{'TRACE'};
+ delete $repositories{$repository};
+ last;
+ }
+ }
+ save_options() if $save;
+}
+
+sub AddRepository
+{
+ my %argv = @_;
+ my $repository = $argv{'repository'};
+ my $save = $argv{'save'};
+ my $location = $argv{'location'};
+ my $username = $argv{'username'};
+ my $password = $argv{'password'};
+ my $summaryfile = $argv{'summaryfile'};
+ read_config();
+ $repositories{$repository}{'LOCATION'} = $location;
+ $repositories{$repository}{'USERNAME'} = $username if defined $username;
+ $repositories{$repository}{'PASSWORD'} = $password if defined $password;
+ $repositories{$repository}{'SUMMARYFILE'} = $summaryfile
+ if defined $summaryfile;
+ &Trace("Added repository $location") if $options{'TRACE'};
+ save_options() if $save;
+}
+
+sub GetPPMOptions
+{
+ read_config();
+ return %options;
+}
+
+sub SetPPMOptions
+{
+ my %argv = @_;
+ %options = %{$argv{'options'}};
+ save_options() if $argv{'save'};
+}
+
+sub UpgradePackage
+{
+ my %argv = @_;
+ my $package = $argv{'package'};
+ my $location = $argv{'location'};
+ return VerifyPackage("package" => $package, "location" => $location,
+ "upgrade" => 1);
+}
+
+# Returns 1 on success, 0 and sets $PPMERR on failure.
+sub InstallPackage
+{
+ my %argv = @_;
+ my $package = $argv{'package'};
+ my $location = $argv{'location'};
+ my $root = $argv{'root'} || $options{'ROOT'} || undef;
+ my ($PPDfile, %PPD);
+
+ read_config();
+
+ if (!defined($package) && -d "blib" && -f "Makefile") {
+ unless (open MAKEFILE, "< Makefile") {
+ $PPM::PPMERR = "Couldn't open Makefile for reading: $!";
+ return 0;
+ }
+ while (<MAKEFILE>) {
+ if (/^DISTNAME\s*=\s*(\S+)/) {
+ $package = $1;
+ $PPDfile = "$1.ppd";
+ last;
+ }
+ }
+ close MAKEFILE;
+ unless (defined $PPDfile) {
+ $PPM::PPMERR = "Couldn't determine local package name";
+ return 0;
+ }
+ system("$Config{make} ppd");
+ return 0 unless (%PPD = getPPDfile('package' => $PPDfile));
+ parsePPD(%PPD);
+ $options{'CLEAN'} = 0;
+ goto InstallBlib;
+ }
+
+ unless (%PPD = getPPDfile('package' => $package,
+ 'location' => $location, 'PPDfile' => \$PPDfile)) {
+ &Trace("Could not locate a PPD file for package $package")
+ if $options{'TRACE'};
+ $PPM::PPMERR = "Could not locate a PPD file for package $package";
+ return 0;
+ }
+ if ($Config{'osname'} eq 'MSWin32' &&
+ !&Win32::IsWinNT && exists $Win9x_denied{lc($package)}) {
+ $PPM::PPMERR = "Package '$package' cannot be installed with PPM on Win9x--see http://www.ActiveState.com/ppm for details";
+ return 0;
+ }
+
+ parsePPD(%PPD);
+ if (!$current_package{'CODEBASE'} && !$current_package{'INSTALL_HREF'}) {
+ &Trace("Read a PPD for '$package', but it is not intended for this build of Perl ($varchname)")
+ if $options{'TRACE'};
+ $PPM::PPMERR = "Read a PPD for '$package', but it is not intended for this build of Perl ($varchname)";
+ return 0;
+ }
+
+ if (defined $current_package{'DEPEND'}) {
+ push(@current_package_stack, [%current_package]);
+ foreach my $dep (keys %{$current_package{'DEPEND'}}) {
+ # Has PPM already installed it?
+ unless ($installed_packages{$dep}) {
+ # Has *anybody* installed it, or is it part of core Perl?
+ my $p = $dep;
+ $p =~ s@-@/@g;
+ my $found = grep -f, map "$_/$p.pm", @INC;
+ unless ($found) {
+ &Trace("Installing dependency '$dep'...")
+ if $options{'TRACE'};
+ unless (!InstallPackage("package" => $dep,
+ "location" => $location)) {
+ &Trace("Error installing dependency: $PPM::PPMERR")
+ if $options{'TRACE'};
+ $PPM::PPMERR = "Error installing dependency: $PPM::PPMERR\n";
+ return 0 unless ($options{'FORCE_INSTALL'});
+ }
+ }
+ }
+ # make sure minimum version is installed, if necessary
+ elsif (defined $current_package{'DEPEND'}{$dep}) {
+ my @comp =
+ split (',', cpan2ppd_version($current_package{'DEPEND'}{$dep}));
+ # parsePPD fills in %current_package
+ push(@current_package_stack, [%current_package]);
+ parsePPD(%{$installed_packages{$dep}{'INST_PPD'}});
+ my @inst =
+ split (',', cpan2ppd_version($current_package{'VERSION'}));
+ foreach(0..3) {
+ if ($comp[$_] > $inst[$_]) {
+ VerifyPackage("package" => $dep, "upgrade" => 1);
+ last;
+ }
+ last if ($comp[$_] < $inst[$_]);
+ }
+ %current_package = @{pop @current_package_stack};
+ }
+ }
+ %current_package = @{pop @current_package_stack};
+ }
+ my ($basename, $path) = fileparse($PPDfile);
+ # strip the trailing path separator
+ my $chr = substr($path, -1, 1);
+ chop $path if ($chr eq '/' || $chr eq '\\');
+ if ($path =~ /^file:\/\/.*\|/i) {
+ # $path is a local directory, let's avoid LWP by changing
+ # it to a pathname.
+ $path =~ s@^file://@@i;
+ $path =~ s@^localhost/@@i;
+ $path =~ s@\|@:@;
+ }
+
+ # get the code and put it in build_dir
+ my $install_dir = "$options{'BUILDDIR'}/$current_package{'NAME'}-$$";
+ File::Path::rmtree($install_dir,0,0);
+ unless (-d $install_dir || File::Path::mkpath($install_dir, 0, 0755)) {
+ &Trace("Could not create $install_dir: $!") if $options{'TRACE'};
+ $PPM::PPMERR = "Could not create $install_dir: $!";
+ return 0;
+ }
+ $basename = fileparse($current_package{'CODEBASE'});
+ # CODEBASE is a URL
+ if ($current_package{'CODEBASE'} =~ m@^...*://@i) {
+ return 0 unless read_href('href' => "$current_package{'CODEBASE'}",
+ 'target' => "$install_dir/$basename", 'request' => "GET",
+ 'progress' => 1);
+ }
+ # CODEBASE is a full pathname
+ elsif (-f $current_package{'CODEBASE'}) {
+ &Trace("Copying $current_package{'CODEBASE'} to $install_dir/$basename")
+ if $options{'TRACE'} > 1;
+ copy($current_package{'CODEBASE'}, "$install_dir/$basename");
+ }
+ # CODEBASE is relative to the directory location of the PPD
+ elsif (-f "$path/$current_package{'CODEBASE'}") {
+ &Trace("Copying $path/$current_package{'CODEBASE'} to $install_dir/$basename") if $options{'TRACE'} > 1;
+ copy("$path/$current_package{'CODEBASE'}", "$install_dir/$basename");
+ }
+ # CODEBASE is relative to the URL location of the PPD
+ else {
+ return 0 unless read_href('target' => "$install_dir/$basename",
+ 'href' => "$path/$current_package{'CODEBASE'}",
+ 'request' => 'GET', 'progress' => 1);
+ }
+
+ my $cwd = getcwd();
+ $cwd .= "/" if $cwd =~ /[a-z]:$/i;
+ chdir($install_dir);
+
+ my ($tarzip, $have_zip);
+ if ($basename =~ /\.zip$/i) {
+ $have_zip = 1;
+ $tarzip = Archive::Zip->new($basename);
+ $tarzip->extractTree();
+ }
+ elsif ($basename =~ /\.gz$/i) {
+ $tarzip = Archive::Tar->new($basename,1);
+ }
+ else {
+ $tarzip = Archive::Tar->new($basename,0);
+ }
+
+ if ($have_zip) {
+ $basename =~ /(.*).zip/i;
+ }
+ else {
+ $tarzip->extract($tarzip->list_files);
+ $basename =~ /(.*).tar/i;
+ }
+ chdir($1);
+ RelocPerl('.') if ($Config{'osname'} ne 'MSWin32');
+
+ InstallBlib:
+ my $inst_archlib = $Config{installsitearch};
+ my $inst_root = $Config{prefix};
+ my $packlist = File::Spec->catfile("$Config{installsitearch}/auto",
+ split(/-/, $current_package{'NAME'}), ".packlist");
+
+ # copied from ExtUtils::Install
+ my $INST_LIB = File::Spec->catdir(File::Spec->curdir,"blib","lib");
+ my $INST_ARCHLIB = File::Spec->catdir(File::Spec->curdir,"blib","arch");
+ my $INST_BIN = File::Spec->catdir(File::Spec->curdir,'blib','bin');
+ my $INST_SCRIPT = File::Spec->catdir(File::Spec->curdir,'blib','script');
+ my $INST_MAN1DIR = File::Spec->catdir(File::Spec->curdir,'blib','man1');
+ my $INST_MAN3DIR = File::Spec->catdir(File::Spec->curdir,'blib','man3');
+ my $INST_HTMLDIR = File::Spec->catdir(File::Spec->curdir,'blib','html');
+ my $INST_HTMLHELPDIR = File::Spec->catdir(File::Spec->curdir,'blib','htmlhelp');
+
+ my $inst_script = $Config{installscript};
+ my $inst_man1dir = $Config{installman1dir};
+ my $inst_man3dir = $Config{installman3dir};
+ my $inst_bin = $Config{installbin};
+ my $inst_htmldir = $Config{installhtmldir};
+ my $inst_htmlhelpdir = $Config{installhtmlhelpdir};
+ my $inst_lib = $Config{installsitelib};
+
+ if (defined $root && $root !~ /^\Q$inst_root\E$/i) {
+ $packlist =~ s/\Q$inst_root/$root\E/i;
+ $inst_lib =~ s/\Q$inst_root/$root\E/i;
+ $inst_archlib =~ s/\Q$inst_root/$root\E/i;
+ $inst_bin =~ s/\Q$inst_root/$root\E/i;
+ $inst_script =~ s/\Q$inst_root/$root\E/i;
+ $inst_man1dir =~ s/\Q$inst_root/$root\E/i;
+ $inst_man3dir =~ s/\Q$inst_root/$root\E/i;
+ $inst_root = $root;
+ }
+
+ while (1) {
+ my $cwd = getcwd();
+ $cwd .= "/" if $cwd =~ /[a-z]:$/i;
+ &Trace("Calling ExtUtils::Install::install") if $options{'TRACE'} > 1;
+ eval {
+ ExtUtils::Install::install({
+ "read" => $packlist, "write" => $packlist,
+ $INST_LIB => $inst_lib, $INST_ARCHLIB => $inst_archlib,
+ $INST_BIN => $inst_bin, $INST_SCRIPT => $inst_script,
+ $INST_MAN1DIR => $inst_man1dir, $INST_MAN3DIR => $inst_man3dir,
+ $INST_HTMLDIR => $inst_htmldir,
+ $INST_HTMLHELPDIR => $inst_htmlhelpdir},0,0,0);
+ };
+ # install might have croaked in another directory
+ chdir($cwd);
+ # Can't remove some DLLs, but we can rename them and try again.
+ if ($@ && $@ =~ /Cannot forceunlink (\S+)/) {
+ &Trace("$@...attempting rename") if $options{'TRACE'};
+ my $oldname = $1;
+ $oldname =~ s/:$//;
+ my $newname = $oldname . "." . time();
+ unless (rename($oldname, $newname)) {
+ &Trace("$!") if $options{'TRACE'};
+ $PPM::PPMERR = $@;
+ return 0;
+ }
+ }
+ # Some other error
+ elsif($@) {
+ &Trace("$@") if $options{'TRACE'};
+ $PPM::PPMERR = $@;
+ return 0;
+ }
+ else { last; }
+ }
+
+ #rebuild the html TOC
+ Trace("Calling ActivePerl::DocTools::WriteTOC()") if $options{'TRACE'} > 1;
+ ActivePerl::DocTools::WriteTOC() if $useDocTools;
+
+ if (defined $current_package{'INSTALL_SCRIPT'}) {
+ run_script("script" => $current_package{'INSTALL_SCRIPT'},
+ "scriptHREF" => $current_package{'INSTALL_HREF'},
+ "exec" => $current_package{'INSTALL_EXEC'},
+ "inst_root" => $inst_root, "inst_archlib" => $inst_archlib);
+ }
+
+ chdir($cwd);
+
+# ask to store this location as default for this package?
+ PPMdat_add_package($path, $packlist, $inst_root);
+ # if 'install.ppm' exists, don't remove; system()
+ # has probably not finished with it yet.
+ if ($options{'CLEAN'} && !-f "$install_dir/install.ppm") {
+ File::Path::rmtree($install_dir,0,0);
+ }
+ &Trace("Package $package successfully installed") if $options{'TRACE'};
+ reread_config();
+
+ return 1;
+}
+
+# Returns a hash with key $location, and elements of arrays of package names.
+# Uses '%repositories' if $location is not specified.
+sub RepositoryPackages
+{
+ my %argv = @_;
+ my $location = $argv{'location'};
+ my %ppds;
+ if (defined $location) {
+ @{$ppds{$location}} = list_available("location" => $location);
+ }
+ else {
+ read_config(); # need repositories
+ foreach (keys %repositories) {
+ $location = $repositories{$_}{'LOCATION'};
+ @{$ppds{$location}} = list_available("location" => $location);
+ }
+ }
+ return %ppds;
+}
+
+sub RepositoryPackageProperties
+{
+ my %argv = @_;
+ my $location = $argv{'location'};
+ my $package = $argv{'package'};
+ my %PPD;
+ read_config();
+ unless (%PPD = getPPDfile('package' => $package, 'location' => $location)) {
+ &Trace("RepositoryPackageProperties: Could not locate a PPD file for package $package") if $options{'TRACE'};
+ $PPM::PPMERR = "Could not locate a PPD file for package $package";
+ return;
+ }
+ parsePPD(%PPD);
+
+ my %ret_hash = map { $_ => $current_package{$_} }
+ qw(NAME TITLE AUTHOR VERSION ABSTRACT PERLCORE_VER);
+ foreach my $dep (keys %{$current_package{'DEPEND'}}) {
+ push @{$ret_hash{'DEPEND'}}, $dep;
+ }
+
+ return %ret_hash;
+}
+
+# Returns 1 on success, 0 and sets $PPMERR on failure.
+sub RemovePackage
+{
+ my %argv = @_;
+ my $package = $argv{'package'};
+ my $force = $argv{'force'};
+ my %PPD;
+
+ read_config();
+ unless ($installed_packages{$package}) {
+ my $pattern = $package;
+ undef $package;
+ # Do another lookup, ignoring case
+ foreach (keys %installed_packages) {
+ if (/^$pattern$/i) {
+ $package = $_;
+ last;
+ }
+ }
+ unless ($package) {
+ &Trace("Package '$pattern' has not been installed by PPM")
+ if $options{'TRACE'};
+ $PPM::PPMERR = "Package '$pattern' has not been installed by PPM";
+ return 0;
+ }
+ }
+
+ # Don't let them remove PPM itself, libnet, Archive-Tar, etc.
+ # but we can force removal if we're upgrading
+ unless ($force) {
+ foreach (@required_packages) {
+ if ($_ eq $package) {
+ &Trace("Package '$package' is required by PPM and cannot be removed") if $options{'TRACE'};
+ $PPM::PPMERR = "Package '$package' is required by PPM and cannot be removed";
+ return 0;
+ }
+ }
+ }
+
+ my $install_dir = "$options{'BUILDDIR'}/$package";
+
+ %PPD = %{ $installed_packages{$package}{'INST_PPD'} };
+ parsePPD(%PPD);
+ my $cwd = getcwd();
+ $cwd .= "/" if $cwd =~ /[a-z]:$/i;
+ if (defined $current_package{'UNINSTALL_SCRIPT'}) {
+ if (!chdir($install_dir)) {
+ &Trace("Could not chdir() to $install_dir: $!") if $options{'TRACE'};
+ $PPM::PPMERR = "Could not chdir() to $install_dir: $!";
+ return 0;
+ }
+ run_script("script" => $current_package{'UNINSTALL_SCRIPT'},
+ "scriptHREF" => $current_package{'UNINSTALL_HREF'},
+ "exec" => $current_package{'UNINSTALL_EXEC'});
+ chdir($cwd);
+ }
+ else {
+ if (-f $installed_packages{$package}{'INST_PACKLIST'}) {
+ &Trace("Calling ExtUtils::Install::uninstall")
+ if $options{'TRACE'} > 1;
+ eval {
+ ExtUtils::Install::uninstall("$installed_packages{$package}{'INST_PACKLIST'}", 0, 0);
+ };
+ warn $@ if $@;
+ }
+ }
+
+ #rebuild the html TOC
+ Trace("Calling ActivePerl::DocTools::WriteTOC()") if $options{'TRACE'} > 1;
+ ActivePerl::DocTools::WriteTOC() if $useDocTools;
+
+ File::Path::rmtree($install_dir,0,0);
+ PPMdat_remove_package($package);
+ &Trace("Package $package removed") if $options{'TRACE'};
+ reread_config();
+ return 1;
+}
+
+# returns "0" if package is up-to-date; "1" if an upgrade is available;
+# undef and sets $PPMERR on error; and the new VERSION string if a package
+# was upgraded.
+sub VerifyPackage
+{
+ my %argv = @_;
+ my $package = $argv{'package'};
+ my $location = $argv{'location'};
+ my $upgrade = $argv{'upgrade'};
+ my $force = $argv{'force'};
+ my ($installedPPDfile, $comparePPDfile, %installedPPD, %comparePPD);
+
+ read_config();
+
+ unless ($installed_packages{$package}) {
+ my $pattern = $package;
+ undef $package;
+ # Do another lookup, ignoring case
+ foreach (keys %installed_packages) {
+ if (/^$pattern$/i) {
+ $package = $_;
+ last;
+ }
+ }
+ unless ($package) {
+ &Trace("Package '$pattern' has not been installed by PPM") if $options{'TRACE'};
+ $PPM::PPMERR = "Package '$pattern' has not been installed by PPM";
+ return undef;
+ }
+ }
+
+ %installedPPD = %{ $installed_packages{$package}{'INST_PPD'} };
+
+ unless (%comparePPD = getPPDfile('package' => $package,
+ 'location' => $location)) {
+ &Trace("VerifyPackage: Could not locate a PPD file for $package")
+ if $options{'TRACE'};
+ $PPM::PPMERR = "Could not locate a PPD file for $package";
+ return;
+ }
+
+ parsePPD(%installedPPD);
+ my @installed_version =
+ split (',', cpan2ppd_version($current_package{'VERSION'}));
+ my $inst_root = $installed_packages{$package}{'INST_ROOT'};
+
+ parsePPD(%comparePPD);
+ unless ($current_package{'CODEBASE'} || $current_package{'INSTALL_HREF'}) {
+ &Trace("Read a PPD for '$package', but it is not intended for this build of Perl ($varchname)")
+ if $options{'TRACE'};
+ $PPM::PPMERR = "Read a PPD for '$package', but it is not intended for this build of Perl ($varchname)";
+ return undef;
+ }
+ my @compare_version
+ = split (',', cpan2ppd_version($current_package{'VERSION'}));
+ my $available;
+ foreach(0..3) {
+ next if $installed_version[$_] == $compare_version[$_];
+ $available++ if $installed_version[$_] < $compare_version[$_];
+ last;
+ }
+
+ if ($available || $force) {
+ &Trace("Upgrade to $package is available") if $options{'TRACE'} > 1;
+ if ($upgrade) {
+ if ($Config{'osname'} eq 'MSWin32' &&
+ !&Win32::IsWinNT && exists $Win9x_denied{lc($package)}) {
+ $PPM::PPMERR = "Package '$package' cannot be upgraded with PPM on Win9x--see http://www.ActiveState.com/ppm for details";
+ return undef;
+ }
+
+ # need to remember the $location, because once we remove the
+ # package, it's unavailable.
+ $location = $installed_packages{$package}{'LOCATION'} unless $location;
+ unless (getPPDfile('package' => $package,
+ 'location' => $location)) {
+ &Trace("VerifyPackage: Could not locate a PPD file for $package") if $options{'TRACE'};
+ $PPM::PPMERR = "Could not locate a PPD file for $package";
+ return undef;
+ }
+ RemovePackage("package" => $package, "force" => 1);
+ InstallPackage("package" => $package, "location" => $location,
+ "root" => $inst_root) or return undef;
+ return $current_package{'VERSION'};
+ }
+ return 1;
+ }
+ # package is up to date
+ return 0;
+}
+
+# Changes where the packages are installed.
+# Returns previous root on success, undef and sets $PPMERR on failure.
+sub chroot
+{
+ my %argv = @_;
+ my $location = $argv{'location'};
+
+ unless (-d $location) {
+ &Trace("'$location' does not exist.") if $options{'TRACE'};
+ $PPM::PPMERR = "'$location' does not exist.\n";
+ return undef;
+ }
+
+ my $previous_root = $options{'ROOT'} || $Config{'prefix'};
+ $options{'ROOT'} = $location;
+ return $previous_root;
+}
+
+sub QueryInstalledPackages
+{
+ my %argv = @_;
+ my $ignorecase = $options{'IGNORECASE'} || $argv{'ignorecase'};
+ my $searchtag = uc $argv{'searchtag'} || undef;
+ my ($searchRE, $package, %ret_hash);
+ if (defined $argv{'searchRE'}) {
+ $searchRE = $argv{'searchRE'};
+ $searchRE = "(?i)$searchRE" if $ignorecase;
+ eval { $searchRE =~ /$searchRE/ };
+ if ($@) {
+ &Trace("'$searchRE': invalid regular expression.") if $options{'TRACE'};
+ $PPM::PPMERR = "'$searchRE': invalid regular expression.";
+ return ();
+ }
+ }
+
+ read_config();
+ foreach $package (keys %installed_packages) {
+ my $results = $package;
+ if (defined $searchtag) {
+ my %Package = %{ $installed_packages{$package} };
+ parsePPD( %{ $Package{'INST_PPD'} } );
+ $results = $current_package{$searchtag};
+ }
+
+ $ret_hash{$package} = $results
+ if (!defined $searchRE || ($results =~ /$searchRE/));
+ }
+
+ return %ret_hash;
+}
+
+# Returns a summary of available packages for all repositories.
+# Returned hash has the following structure:
+#
+# $hash{repository}{package_name}{NAME}
+# $hash{repository}{package_name}{VERSION}
+# etc.
+#
+sub RepositorySummary {
+ my %argv = @_;
+ my $location = $argv{'location'};
+ my (%summary, %locations);
+
+ # If we weren't given the location of a repository to query the summary
+ # for, check all of the repositories that we know about.
+ unless ($location) {
+ read_config(); # need repositories
+ foreach (keys %repositories) {
+ $locations{$repositories{$_}{'LOCATION'}} =
+ $repositories{$_}{'SUMMARYFILE'};
+ }
+ }
+ # Otherwise, we were given a repository to query, figure out where we can
+ # find the summary file for that repository.
+ else {
+ foreach (keys %repositories) {
+ if ($location =~ /\Q$repositories{$_}{'LOCATION'}\E/i) {
+ $locations{$repositories{$_}{'LOCATION'}} =
+ $repositories{$_}{'SUMMARYFILE'};
+ last;
+ }
+ }
+ }
+
+ # Check all of the summary file locations that we were able to find.
+ foreach $location (keys %locations) {
+ my $summaryfile = $locations{$location};
+ unless ($summaryfile) {
+ &Trace("RepositorySummary: No summary available from $location.")
+ if $options{'TRACE'};
+ $PPM::PPMERR = "No summary available from $location.\n";
+ next;
+ }
+ my $data;
+ if ($location =~ m@^...*://@i) {
+ next unless ($data = read_href("request" => 'GET',
+ "href" => "$location/$summaryfile"));
+ } else {
+ local $/;
+ next if (!open (DATAFILE, "$location/$summaryfile"));
+ $data = <DATAFILE>;
+ close(DATAFILE);
+ }
+ $summary{$location} = parse_summary($data);
+ }
+
+ return %summary;
+}
+
+# Returns the same structure as RepositorySummary() above.
+sub ServerSearch
+{
+ my %argv = @_;
+ my $location = $argv{'location'};
+ my $searchRE = $argv{'searchRE'};
+ my $searchtag = $argv{'searchtag'};
+ my $data;
+ my %summary;
+
+ return unless $location =~ m#^(http://.*)\?(urn:.*)#i;
+ my ($proxy, $uri) = ($1, $2);
+ my $client = SOAP::Lite -> uri($uri) -> proxy($proxy);
+ eval { $data = $client ->
+ search_ppds($varchname, $searchRE, $searchtag) -> result; };
+ if ($@) {
+ &Trace("Error searching repository '$proxy': $@")
+ if $options{'TRACE'};
+ $PPM::PPMERR = "Error searching repository '$proxy': $@\n";
+ return;
+ }
+
+ $summary{$location} = parse_summary($data);
+ return %summary;
+}
+
+#
+# Internal subs
+#
+
+sub parse_summary
+{
+ my $data = shift;
+ my (%summary, @parsed);
+
+ # take care of '&'
+ $data =~ s/&(?!\w+;)/&amp;/go;
+
+ my $parser = new XML::Parser( Style => 'Objects',
+ Pkg => 'PPM::XML::RepositorySummary' );
+ eval { @parsed = @{ $parser->parse( $data ) } };
+ if ($@) {
+ &Trace("parse_summary: content of summary file is not valid")
+ if $options{'TRACE'};
+ $PPM::PPMERR =
+ "parse_summary: content of summary file is not valid: $!\n";
+ return;
+ }
+
+
+ my $packages = ${$parsed[0]}{Kids};
+
+ foreach my $package (@{$packages}) {
+ my $elem_type = ref $package;
+ $elem_type =~ s/.*:://;
+ next if ($elem_type eq 'Characters');
+
+ if ($elem_type eq 'SOFTPKG') {
+ my %ret_hash;
+ parsePPD(%{$package});
+ %ret_hash = map { $_ => $current_package{$_} }
+ qw(NAME TITLE AUTHOR VERSION ABSTRACT PERLCORE_VER);
+ foreach my $dep (keys %{$current_package{'DEPEND'}}) {
+ push @{$ret_hash{'DEPEND'}}, $dep;
+ }
+ $summary{$current_package{'NAME'}} = \%ret_hash;
+ }
+ }
+ return \%summary;
+}
+
+sub save_options
+{
+ read_config();
+ my %PPMConfig;
+ # Read in the existing PPM configuration file
+ return unless (%PPMConfig = getPPDfile('package' => $PPM::PPMdat,
+ 'parsertype' => 'PPM::XML::PPMConfig'));
+
+ # Remove all of the declarations for REPOSITORY and PPMPRECIOUS;
+ # we'll output these from the lists we've got in memory instead.
+ foreach my $idx (0 .. @{$PPMConfig{Kids}}) {
+ my $elem = $PPMConfig{Kids}[$idx];
+ my $elem_type = ref $elem;
+ if ($elem_type =~ /::REPOSITORY$|::PPMPRECIOUS$/o) {
+ splice( @{$PPMConfig{Kids}}, $idx, 1 );
+ redo; # Restart again so we don't miss any
+ }
+ }
+
+ # Traverse the info we read in and replace the values in it with the new
+ # config options that we've got.
+ foreach my $elem (@{ $PPMConfig{Kids} }) {
+ my $elem_type = ref $elem;
+ $elem_type =~ s/.*:://;
+ next if ($elem_type ne 'OPTIONS');
+ %{$elem} = map { $_ => $options{$_} } keys %options;
+ # This bit of ugliness is necessary for historical (VPM) reasons
+ delete $elem->{FORCE_INSTALL};
+ $elem->{FORCEINSTALL} = $options{'FORCE_INSTALL'};
+ }
+
+ # Find out where the package listings start and insert our PPMPRECIOUS and
+ # updated list of REPOSITORYs.
+ foreach my $idx (0 .. @{$PPMConfig{Kids}}) {
+ my $elem = $PPMConfig{Kids}[$idx];
+ my $elem_type = ref $elem;
+ $elem_type =~ s/.*:://;
+ next unless (($elem_type eq 'PACKAGE') or
+ ($idx == $#{$PPMConfig{Kids}}));
+
+ # Insert our PPMPRECIOUS
+ my $chardata = new PPM::XML::PPMConfig::Characters;
+ $chardata->{Text} = join( ';', @required_packages );
+ my $precious = new PPM::XML::PPMConfig::PPMPRECIOUS;
+ push( @{$precious->{Kids}}, $chardata );
+ splice( @{$PPMConfig{Kids}}, $idx, 0, $precious );
+
+ # Insert the list of repositories we've got
+ my $rep_name;
+ foreach $rep_name (keys %repositories) {
+ my $repository = new PPM::XML::PPMConfig::REPOSITORY;
+ %{$repository} =
+ map { $_ => $repositories{$rep_name}{$_} }
+ keys %{$repositories{$rep_name}};
+ $repository->{'NAME'} = $rep_name;
+ splice( @{$PPMConfig{Kids}}, $idx, 0, $repository );
+ }
+ last;
+ }
+ # Take the data structure we've got and bless it into a PPMCONFIG object so
+ # that we can output it.
+ my $cfg = bless \%PPMConfig, 'PPM::XML::PPMConfig::PPMCONFIG';
+
+ # Open the output file and output the PPM config file
+ unless (open( DAT, ">$PPM::PPMdat" )) {
+ &Trace("open of $PPM::PPMdat failed: $!") if $options{'TRACE'};
+ $PPM::PPMERR = "open of $PPM::PPMdat failed: $!\n";
+ return 1;
+ }
+ my $oldout = select DAT;
+ $cfg->output();
+ select $oldout;
+ close( DAT );
+ &Trace("Wrote config file") if $options{'TRACE'} > 1;
+}
+
+# Gets a listing of all of the packages available in the repository. If an
+# argument of 'location' is provided in %argv, it is used as the repository to
+# query. This method returns to the caller a complete list of all of the
+# available packages at the repository in a list context, returning 'undef' if
+# any errors occurred.
+sub list_available
+{
+ my %argv = @_;
+ my $location = $argv{'location'};
+ my @ppds;
+
+ if ($location =~ /^file:\/\/.*\|/i) {
+ # $location is a local directory, let's avoid LWP by changing
+ # it to a pathname.
+ $location =~ s@^file://@@i;
+ $location =~ s@^localhost/@@i;
+ $location =~ s@\|@:@;
+ }
+
+ # URL in UNC notation
+ if ($location =~ /^file:\/\/\/\//i) {
+ $location =~ s@^file://@@i;
+ }
+
+ # directory or UNC
+ if (-d $location || $location =~ /^\\\\/ || $location =~ /^\/\//) {
+ opendir(PPDDIR, $location) or return undef;
+ my ($file);
+ @ppds = grep { /\.ppd$/i && -f "$location/$_" } readdir(PPDDIR);
+ foreach $file (@ppds) {
+ $file =~ s/\.ppd//i;
+ }
+ }
+ elsif ($location =~ m@^...*://@i) {
+ if ($cached_ppd_list{$location}) {
+ return @{$cached_ppd_list{$location}};
+ }
+
+ # If we're accessing a SOAP server, do things differently than we would
+ # for FTP, HTTP, etc.
+ if ($location =~ m#^(http://.*)\?(.*)#i) {
+ my ($proxy, $uri) = ($1, $2);
+ my $client = SOAP::Lite -> uri($uri) -> proxy($proxy);
+ eval { @ppds = $client->packages()->paramsout };
+ if ($@) {
+ &Trace("Package list from '$proxy' failed: $@")
+ if $options{'TRACE'};
+ $PPM::PPMERR =
+ "Package list from repository '$proxy' failed: $@\n";
+ return;
+ }
+ }
+ else {
+ return unless (my $doc = read_href("href" => $location,
+ "request" => 'GET'));
+
+ if ($doc =~ /^<head><title>/) {
+ # read an IIS format directory listing
+ @ppds = grep { /\.ppd/i } split('<br>', $doc);
+ foreach my $file (@ppds) {
+ $file =~ s/\.ppd<.*$//is;
+ $file =~ s@.*>@@is;
+ }
+ }
+ elsif ($doc =~ /<BODY BGCOLOR=FFFFFF>\n\n<form name=VPMform/s) {
+ # read output of default.prk over an HTTP connection
+ @ppds = grep { /^<!--Key:.*-->$/ } split('\n', $doc);
+ foreach my $file (@ppds) {
+ if ($file =~ /^<!--Key:(.*)-->$/) {
+ $file = $1;
+ }
+ }
+ }
+ else {
+ # read an Apache format directory listing
+ @ppds = grep { /\.ppd/i } split('\n', $doc);
+ foreach my $file (@ppds) {
+ $file =~ s/^.*>(.*?)\.ppd<.*$/$1/i;
+ }
+ }
+ }
+
+ # All done, take the list of PPDs that we've queried and cache it for
+ # later re-use, then return it to the caller.
+ @{$cached_ppd_list{$location}} = sort @ppds;
+ return @{$cached_ppd_list{$location}};
+ }
+ return sort @ppds;
+}
+
+my ($response, $bytes_transferred);
+
+sub read_href
+{
+ my %argv = @_;
+ my $href = $argv{'href'};
+ my $request = $argv{'request'};
+ my $target = $argv{'target'};
+ my $progress = $argv{'progress'}; # display status of binary transfers
+ my ($proxy_user, $proxy_pass);
+ # If this is a SOAP URL, handle it differently than FTP/HTTP/file.
+ if ($href =~ m#^(http://.*)\?(.*)#i) {
+ my ($proxy, $uri) = ($1, $2);
+ my $fcn;
+ if ($uri =~ m#(.*:/.*)/(.+?)$#) {
+ ($uri, $fcn) = ($1, $2);
+ }
+ my $client = SOAP::Lite -> uri($uri) -> proxy($proxy);
+ if ($fcn eq 'fetch_summary') {
+ my $summary = eval { $client->fetch_summary()->result; };
+ if ($@) {
+ &Trace("Error getting summary from repository '$proxy': $@")
+ if $options{'TRACE'};
+ $PPM::PPMERR =
+ "Error getting summary from repository '$proxy': $@\n";
+ return;
+ }
+ return $summary;
+ }
+ $fcn =~ s/\.ppd$//i;
+ my $ppd = eval { $client->fetch_ppd($fcn)->result };
+ if ($@) {
+ &Trace("Error fetching '$fcn' from repository '$proxy': $@")
+ if $options{'TRACE'};
+ $PPM::PPMERR =
+ "Error fetching '$fcn' from repository '$proxy': $@\n";
+ return;
+ }
+ return $ppd;
+ # todo: write to disk file if $target
+ }
+ # Otherwise it's a standard URL, go ahead and request it using LWP.
+ my $ua = new LWP::UserAgent;
+ $ua->agent($ENV{HTTP_proxy_agent} || ("$0/0.1 " . $ua->agent));
+ if (defined $ENV{HTTP_proxy}) {
+ $proxy_user = $ENV{HTTP_proxy_user};
+ $proxy_pass = $ENV{HTTP_proxy_pass};
+ &Trace("read_href: calling env_proxy: $ENV{'HTTP_proxy'}")
+ if $options{'TRACE'} > 1;
+ $ua->env_proxy;
+ }
+ my $req = new HTTP::Request $request => $href;
+ if (defined $proxy_user && defined $proxy_pass) {
+ &Trace("read_href: calling proxy_authorization_basic($proxy_user, $proxy_pass)") if $options{'TRACE'} > 1;
+ $req->proxy_authorization_basic("$proxy_user", "$proxy_pass");
+ }
+
+ # Do we need to do authorization?
+ # This is a hack, but will have to do for now.
+ foreach (keys %repositories) {
+ if ($href =~ /^$repositories{$_}{'LOCATION'}/i) {
+ my $username = $repositories{$_}{'USERNAME'};
+ my $password = $repositories{$_}{'PASSWORD'};
+ if (defined $username && defined $password) {
+ &Trace("read_href: calling proxy_authorization_basic($username, $password)") if $options{'TRACE'} > 1;
+ $req->authorization_basic($username, $password);
+ last;
+ }
+ }
+ }
+
+ ($response, $bytes_transferred) = (undef, 0);
+ if ($progress) {
+ # display the 'progress indicator'
+ $ua->request($req, \&lwp_callback,
+ ($options{'DOWNLOADSTATUS'} || 4096));
+ print "\n" if ($PPM::PPMShell && $options{'DOWNLOADSTATUS'});
+ }
+ else {
+ $response = $ua->request($req);
+ }
+ if ($response && $response->is_success) {
+ if ($target) {
+ unless (open(OUT, ">$target")) {
+ &Trace("read_href: Couldn't open $target for writing")
+ if $options{'TRACE'};
+ $PPM::PPMERR = "Couldn't open $target for writing\n";
+ return;
+ }
+ binmode(OUT);
+ print OUT $response->content;
+ close(OUT);
+ }
+ return $response->content;
+ }
+ if ($response) {
+ &Trace("read_href: Error reading $href: " . $response->code . " " .
+ $response->message) if $options{'TRACE'};
+ $PPM::PPMERR = "Error reading $href: " . $response->code . " " .
+ $response->message . "\n";
+ }
+ else {
+ &Trace("read_href: Error reading $href") if $options{'TRACE'};
+ $PPM::PPMERR = "Error reading $href\n";
+ }
+ return;
+}
+
+sub lwp_callback
+{
+ my ($data, $res, $protocol) = @_;
+ $response = $res;
+ $response->add_content($data);
+ $bytes_transferred += length($data);
+ print "Bytes transferred: $bytes_transferred\r"
+ if ($PPM::PPMShell && $options{'DOWNLOADSTATUS'});
+}
+
+sub reread_config
+{
+ %current_package = ();
+ %installed_packages = ();
+ $init = 0;
+ read_config();
+}
+
+# returns 0 on success, 1 and sets $PPMERR on error.
+sub PPMdat_add_package
+{
+ my ($location, $packlist, $inst_root) = @_;
+ my $package = $current_package{'NAME'};
+ my $time_str = localtime;
+
+ # If we already have this package installed, remove it from the PPM
+ # Configuration file so we can put the new one in.
+ if (defined $installed_packages{$package} ) {
+ # remove the existing entry for this package.
+ PPMdat_remove_package($package);
+ }
+
+ # Build the new SOFTPKG data structure for this package we're adding.
+ my $softpkg =
+ new PPM::XML::PPMConfig::SOFTPKG( NAME => $package,
+ VERSION => $current_package{VERSION}
+ );
+
+ if (defined $current_package{TITLE}) {
+ my $chardata = new PPM::XML::PPMConfig::Characters(
+ Text => $current_package{TITLE} );
+ my $newelem = new PPM::XML::PPMConfig::TITLE;
+ push( @{$newelem->{Kids}}, $chardata );
+ push( @{$softpkg->{Kids}}, $newelem );
+ }
+
+ if (defined $current_package{ABSTRACT}) {
+ my $chardata = new PPM::XML::PPMConfig::Characters(
+ Text => $current_package{ABSTRACT});
+ my $newelem = new PPM::XML::PPMConfig::ABSTRACT;
+ push( @{$newelem->{Kids}}, $chardata );
+ push( @{$softpkg->{Kids}}, $newelem );
+ }
+
+ if (defined $current_package{AUTHOR}) {
+ my $chardata = new PPM::XML::PPMConfig::Characters(
+ Text => $current_package{AUTHOR} );
+ my $newelem = new PPM::XML::PPMConfig::AUTHOR;
+ push( @{$newelem->{Kids}}, $chardata );
+ push( @{$softpkg->{Kids}}, $newelem );
+ }
+
+ if (defined $current_package{LICENSE}) {
+ my $chardata = new PPM::XML::PPMConfig::Characters(
+ Text => $current_package{LICENSE});
+ my $newelem = new PPM::XML::PPMConfig::LICENSE;
+ push( @{$newelem->{Kids}}, $chardata );
+ push( @{$softpkg->{Kids}}, $newelem );
+ }
+
+ my $impl = new PPM::XML::PPMConfig::IMPLEMENTATION;
+ push( @{$softpkg->{Kids}}, $impl );
+
+ if (defined $current_package{PERLCORE_VER}) {
+ my $newelem = new PPM::XML::PPMConfig::PERLCORE(
+ VERSION => $current_package{PERLCORE_VER} );
+ push( @{$impl->{Kids}}, $newelem );
+ }
+
+ foreach (keys %{$current_package{DEPEND}}) {
+ my $newelem = new PPM::XML::PPMConfig::DEPENDENCY(
+ NAME => $_, VERSION => $current_package{DEPEND}{$_} );
+ push( @{$impl->{Kids}}, $newelem );
+ }
+
+ my $codebase = new PPM::XML::PPMConfig::CODEBASE(
+ HREF => $current_package{CODEBASE} );
+ push( @{$impl->{Kids}}, $codebase );
+
+ my $inst = new PPM::XML::PPMConfig::INSTALL;
+ push( @{$impl->{Kids}}, $inst );
+ if (defined $current_package{INSTALL_EXEC})
+ { $inst->{EXEC} = $current_package{INSTALL_EXEC}; }
+ if (defined $current_package{INSTALL_HREF})
+ { $inst->{HREF} = $current_package{INSTALL_HREF}; }
+ if (defined $current_package{INSTALL_SCRIPT}) {
+ my $chardata = new PPM::XML::PPMConfig::Characters(
+ Text => $current_package{INSTALL_SCRIPT} );
+ push( @{$inst->{Kids}}, $chardata );
+ }
+
+ my $uninst = new PPM::XML::PPMConfig::UNINSTALL;
+ push( @{$impl->{Kids}}, $uninst );
+ if (defined $current_package{UNINSTALL_EXEC})
+ { $uninst->{EXEC} = $current_package{UNINSTALL_EXEC}; }
+ if (defined $current_package{UNINSTALL_HREF})
+ { $uninst->{HREF} = $current_package{UNINSTALL_HREF}; }
+ if (defined $current_package{UNINSTALL_SCRIPT}) {
+ my $chardata = new PPM::XML::PPMConfig::Characters(
+ Text => $current_package{UNINSTALL_SCRIPT} );
+ push( @{$uninst->{Kids}}, $chardata );
+ }
+
+ # Then, build the PACKAGE object and stick the SOFTPKG inside of it.
+ my $pkg = new PPM::XML::PPMConfig::PACKAGE( NAME => $package );
+
+ if ($location) {
+ my $chardata = new PPM::XML::PPMConfig::Characters( Text => $location );
+ my $newelem = new PPM::XML::PPMConfig::LOCATION;
+ push( @{$newelem->{Kids}}, $chardata );
+ push( @{$pkg->{Kids}}, $newelem );
+ }
+
+ if ($packlist) {
+ my $chardata = new PPM::XML::PPMConfig::Characters( Text => $packlist );
+ my $newelem = new PPM::XML::PPMConfig::INSTPACKLIST;
+ push( @{$newelem->{Kids}}, $chardata );
+ push( @{$pkg->{Kids}}, $newelem );
+ }
+
+ if ($inst_root) {
+ my $chardata = new PPM::XML::PPMConfig::Characters( Text => $inst_root );
+ my $newelem = new PPM::XML::PPMConfig::INSTROOT;
+ push( @{$newelem->{Kids}}, $chardata );
+ push( @{$pkg->{Kids}}, $newelem );
+ }
+
+ if ($time_str) {
+ my $chardata = new PPM::XML::PPMConfig::Characters( Text => $time_str);
+ my $newelem = new PPM::XML::PPMConfig::INSTDATE;
+ push( @{$newelem->{Kids}}, $chardata );
+ push( @{$pkg->{Kids}}, $newelem );
+ }
+
+ my $instppd = new PPM::XML::PPMConfig::INSTPPD;
+ push( @{$instppd->{Kids}}, $softpkg );
+ push( @{$pkg->{Kids}}, $instppd );
+
+ # Now that we've got the structure built, read in the existing PPM
+ # Configuration file, add this to it, and spit it back out.
+ my %PPMConfig;
+ return 1 unless (%PPMConfig = getPPDfile('package' => $PPM::PPMdat,
+ 'parsertype' => 'PPM::XML::PPMConfig'));
+ push( @{$PPMConfig{Kids}}, $pkg );
+ my $cfg = bless \%PPMConfig, 'PPM::XML::PPMConfig::PPMCONFIG';
+
+ unless (open( DAT, ">$PPM::PPMdat" )) {
+ &Trace("open of $PPM::PPMdat failed: $!") if $options{'TRACE'};
+ $PPM::PPMERR = "open of $PPM::PPMdat failed: $!\n";
+ return 1;
+ }
+ my $oldout = select DAT;
+ $cfg->output();
+ select $oldout;
+ close( DAT );
+ &Trace("PPMdat_add_package: wrote $PPM::PPMdat") if $options{'TRACE'} > 1;
+
+ return 0;
+}
+
+# returns 0 on success, 1 and sets $PPMERR on error.
+sub PPMdat_remove_package
+{
+ my $package = shift;
+
+ # Read in the existing PPM configuration file
+ my %PPMConfig;
+ return 1 unless (%PPMConfig = getPPDfile('package' => $PPM::PPMdat,
+ 'parsertype' => 'PPM::XML::PPMConfig'));
+
+ # Try to find the package that we're supposed to be removing, and yank it
+ # out of the list of installed packages.
+ foreach my $idx (0 .. @{$PPMConfig{Kids}}) {
+ my $elem = $PPMConfig{Kids}[$idx];
+ my $elem_type = ref $elem;
+ next if ($elem_type !~ /::PACKAGE$/o);
+ next if ($elem->{NAME} ne $package);
+ splice( @{$PPMConfig{Kids}}, $idx, 1 );
+ }
+
+ # Take the data structure we've got and bless it into a PPMCONFIG object so
+ # that we can output it again.
+ my $cfg = bless \%PPMConfig, 'PPM::XML::PPMConfig::PPMCONFIG';
+
+ # Now that we've removed the package, save the configuration file back out.
+ unless (open( DAT, ">$PPM::PPMdat" )) {
+ $PPM::PPMERR = "open of $PPM::PPMdat failed: $!\n";
+ return 1;
+ }
+ my $oldout = select DAT;
+ $cfg->output();
+ select $oldout;
+ close( DAT );
+ &Trace("PPMdat_remove_package: wrote $PPM::PPMdat")
+ if $options{'TRACE'} > 1;
+ return 0;
+}
+
+# Run $script using system(). If $scriptHREF is specified, its contents are
+# used as the script. If $exec is specified, the script is saved to a
+# temporary file and executed by $exec.
+sub run_script
+{
+ my %argv = @_;
+ my $script = $argv{'script'};
+ my $scriptHREF = $argv{'scriptHREF'};
+ my $exec = $argv{'exec'};
+ my $inst_root = $argv{'inst_root'};
+ my $inst_archlib = $argv{'inst_archlib'};
+ my (@commands, $tmpname);
+
+ if ($scriptHREF) {
+ if ($exec) {
+ # store in a temp file.
+ $tmpname = "$options{'BUILDDIR'}/PPM-" . time();
+ LWP::Simple::getstore($scriptHREF, $tmpname);
+ }
+ else {
+ my $doc = LWP::Simple::get $scriptHREF;
+ if (!defined $doc) {
+ &Trace("run_script: get $scriptHREF failed")
+ if $options{'TRACE'} > 1;
+ return 0;
+ }
+ @commands = split("\n", $doc);
+ }
+ }
+ else {
+ if (-f $script) {
+ $tmpname = $script;
+ }
+ else {
+ # change any escaped chars
+ $script =~ s/&lt;/</gi;
+ $script =~ s/&gt;/>/gi;
+
+ @commands = split(';;', $script);
+ if ($exec) {
+ # store in a temp file.
+ $tmpname = "$options{'BUILDDIR'}/PPM-" . time();
+ open(TMP, ">$tmpname");
+ foreach my $command (@commands) {
+ print TMP "$command\n";
+ }
+ close(TMP);
+ }
+ }
+ }
+ $ENV{'PPM_INSTROOT'} = $inst_root;
+ $ENV{'PPM_INSTARCHLIB'} = $inst_archlib;
+ if ($exec) {
+ $exec = $^X if ($exec =~ /^PPM_PERL$/i);
+ if ($Config{'osname'} eq 'MSWin32') {
+ $exec = Win32::GetShortPathName($exec) if $exec =~ / /;
+ $exec = "start $exec";
+ }
+ system("$exec $tmpname");
+ }
+ else {
+ for my $command (@commands) {
+ system($command);
+ }
+ }
+}
+
+sub parsePPD
+{
+ my %PPD = @_;
+ my $pkg;
+
+ %current_package = ();
+
+ # Get the package name and version from the attributes and stick it
+ # into the 'current package' global var
+ $current_package{NAME} = $PPD{NAME};
+ $current_package{VERSION} = $PPD{VERSION};
+
+ # Get all the information for this package and put it into the 'current
+ # package' global var.
+ my $got_implementation = 0;
+ my $elem;
+
+ foreach $elem (@{$PPD{Kids}}) {
+ my $elem_type = ref $elem;
+ $elem_type =~ s/.*:://;
+ next if ($elem_type eq 'Characters');
+
+ if ($elem_type eq 'TITLE') {
+ # Get the package title out of our _only_ char data child
+ $current_package{TITLE} = $elem->{Kids}[0]{Text};
+ }
+ elsif ($elem_type eq 'LICENSE') {
+ # Get the HREF for the license out of our attribute
+ $current_package{LICENSE} = $elem->{HREF};
+ }
+ elsif ($elem_type eq 'ABSTRACT') {
+ # Get the package abstract out of our _only_ char data child
+ $current_package{ABSTRACT} = $elem->{Kids}[0]{Text};
+ }
+ elsif ($elem_type eq 'AUTHOR') {
+ # Get the authors name out of our _only_ char data child
+ $current_package{AUTHOR} = $elem->{Kids}[0]{Text};
+ }
+ elsif ($elem_type eq 'IMPLEMENTATION') {
+ # If we don't have a valid implementation yet, check if this is
+ # it.
+ next if ($got_implementation);
+ $got_implementation = implementation( @{ $elem->{Kids} } );
+ }
+ elsif ($elem_type eq 'REQUIRE' or $elem_type eq 'PROVIDE') {
+ # we don't use these yet
+ next;
+ }
+ else {
+ &Trace("Unknown element '$elem_type' found inside SOFTPKG") if $options{'TRACE'};
+ die "Unknown element '$elem_type' found inside SOFTPKG.";
+ }
+ } # End of "for each child element inside the PPD"
+
+ if ($options{'TRACE'} > 3 and (%current_package) ) {
+ &Trace("Read a PPD:");
+ foreach my $elem (keys %current_package) {
+ &Trace("\t$elem:\t$current_package{$elem}");
+ }
+ }
+
+ if (($Debug & 2) and (%current_package)) {
+ print "Read a PPD...\n";
+ foreach my $elem (keys %current_package)
+ { print "\t$elem:\t$current_package{$elem}\n"; }
+ }
+}
+
+# Tests the passed IMPLEMENTATION for suitability on the current platform.
+# Fills in the CODEBASE, INSTALL_HREF, INSTALL_EXEC, INSTALL_SCRIPT,
+# UNINSTALL_HREF, UNINSTALL_EXEC, UNINSTALL_SCRIPT and DEPEND keys of
+# %current_package. Returns 1 on success, 0 otherwise.
+sub implementation
+{
+ my @impl = @_;
+
+ # Declare the tmp vars we're going to use to hold onto things.
+ my ($ImplProcessor, $ImplOS, $ImplOSVersion, $ImplLanguage, $ImplCodebase);
+ my ($ImplInstallHREF, $ImplInstallEXEC, $ImplInstallScript);
+ my ($ImplUninstallHREF, $ImplUninstallEXEC, $ImplUninstallScript);
+ my ($ImplArch, $ImplPerlCoreVer, %ImplDepend, %ImplRequire, %ImplProvide);
+
+ my $elem;
+ foreach $elem (@impl) {
+ my $elem_type = ref $elem;
+ $elem_type =~ s/.*:://;
+ next if ($elem_type eq 'Characters');
+
+ if ($elem_type eq 'CODEBASE') {
+ # Get the reference to the codebase out of our attributes.
+ $ImplCodebase = $elem->{HREF};
+ }
+ elsif ($elem_type eq 'DEPENDENCY') {
+ # Get the name of any dependencies we have out of our attributes.
+ # Dependencies in old PPDs might not have version info.
+ $ImplDepend{$elem->{NAME}} = (defined $elem->{VERSION} && $elem->{VERSION} ne "") ? $elem->{VERSION} : "0,0,0,0";
+ }
+ elsif ($elem_type eq 'PROVIDE') {
+ # Get the name of any provides we have out of our attributes.
+ # Provides in old PPDs might not have version info.
+ $ImplProvide{$elem->{NAME}} = (defined $elem->{VERSION} && $elem->{VERSION} ne "") ? $elem->{VERSION} : "0";
+ }
+ elsif ($elem_type eq 'REQUIRE') {
+ # Get the name of any provides we have out of our attributes.
+ # Provides in old PPDs might not have version info.
+ $ImplRequire{$elem->{NAME}} = (defined $elem->{VERSION} && $elem->{VERSION} ne "") ? $elem->{VERSION} : "0";
+ }
+ elsif ($elem_type eq 'LANGUAGE') {
+ # Get the language out of our attributes (if we don't already have
+ # the right one).
+ if ($ImplLanguage && ($ImplLanguage ne $LANGUAGE))
+ { $ImplLanguage = $elem->{VALUE}; }
+ }
+ elsif ($elem_type eq 'ARCHITECTURE') {
+ $ImplArch = $elem->{VALUE};
+ }
+ elsif ($elem_type eq 'OS') {
+ # Get the OS value out of our attribute.
+ $ImplOS = $elem->{VALUE};
+ }
+ elsif ($elem_type eq 'OSVERSION') {
+ # Get the OS version value out of our attribute
+ $ImplOSVersion = $elem->{VALUE};
+ }
+ elsif ($elem_type eq 'PERLCORE') {
+ # Get the compiled Perl core value out of our attributes
+ $ImplPerlCoreVer = $elem->{VERSION};
+ }
+ elsif ($elem_type eq 'PROCESSOR') {
+ # Get the processor value out of our attribute
+ $ImplProcessor = $elem->{VALUE};
+ }
+ elsif ($elem_type eq 'INSTALL') {
+ # Get anything which might have been an attribute
+ $ImplInstallHREF = $elem->{HREF};
+ $ImplInstallEXEC = $elem->{EXEC};
+ # Get any raw Perl script out of here (if we've got any)
+ if ( (exists $elem->{Kids}) and (exists $elem->{Kids}[0]{Text}) )
+ { $ImplInstallScript = $elem->{Kids}[0]{Text}; }
+ }
+ elsif ($elem_type eq 'UNINSTALL') {
+ # Get anything which might have been an attribute
+ $ImplUninstallHREF = $elem->{HREF};
+ $ImplUninstallEXEC = $elem->{EXEC};
+ # Get any raw Perl script out of here (if we've got any)
+ if ( (exists $elem->{Kids}) and (exists $elem->{Kids}[0]{Text}) )
+ { $ImplUninstallScript = $elem->{Kids}[0]{Text}; }
+ }
+ else {
+ die "Unknown element '$elem_type' found inside of IMPLEMENTATION.";
+ }
+ } # end of 'for every element inside IMPLEMENTATION'
+
+ # Check to see if we've found a valid IMPLEMENTATION for the target
+ # machine.
+ return 0 if ((defined $ImplArch) and ($ImplArch ne $varchname));
+ return 0 if ((defined $ImplProcessor) and ($ImplProcessor ne $CPU));
+ return 0 if ((defined $ImplLanguage) and ($ImplLanguage ne $LANGUAGE));
+ return 0 if ((defined $ImplOS) and ($ImplOS ne $OS_VALUE));
+ return 0 if ((defined $ImplOSVersion) and ($ImplOSVersion ne $OS_VERSION));
+
+ # Got a valid IMPLEMENTATION, stuff all the values we just read in into the
+ # 'current package' global var.
+ $current_package{PERLCORE_VER} = $ImplPerlCoreVer
+ if (defined $ImplPerlCoreVer);
+ $current_package{CODEBASE} = $ImplCodebase
+ if (defined $ImplCodebase);
+ $current_package{INSTALL_HREF} = $ImplInstallHREF
+ if (defined $ImplInstallHREF);
+ $current_package{INSTALL_EXEC} = $ImplInstallEXEC
+ if (defined $ImplInstallEXEC);
+ $current_package{INSTALL_SCRIPT} = $ImplInstallScript
+ if (defined $ImplInstallScript);
+ $current_package{UNINSTALL_HREF} = $ImplUninstallHREF
+ if (defined $ImplUninstallHREF);
+ $current_package{UNINSTALL_EXEC} = $ImplUninstallEXEC
+ if (defined $ImplUninstallEXEC);
+ $current_package{UNINSTALL_SCRIPT} = $ImplUninstallScript
+ if (defined $ImplUninstallScript);
+ %{$current_package{DEPEND}} = %ImplDepend
+ if (%ImplDepend);
+
+ return 1;
+}
+
+sub getPPDfile
+{
+ my %argv = @_;
+ my $package = $argv{'package'};
+ my $parsertype = $argv{'parsertype'} || 'PPM::XML::PPD';
+ my $location = $argv{'location'};
+ my $PPDfile = $argv{'PPDfile'};
+ my (%PPD, $contents);
+
+ if (defined($location)) {
+ if ($location =~ /[^\/]$/) { $location .= "/"; }
+ $package = $location . $package . ".ppd";
+ }
+
+ if ($package =~ /^file:\/\/.*\|/i) {
+ # $package is a local directory, let's avoid LWP by changing
+ # it to a pathname.
+ $package =~ s@^file://@@i;
+ $package =~ s@^localhost/@@i;
+ $package =~ s@\|@:@;
+ }
+ # full path to a file?
+ if (-f $package) {
+ local $/;
+ unless (open (DATAFILE, $package)) {
+ &Trace("getPPDfile: open of $package failed") if $options{'TRACE'};
+ $PPM::PPMERR = "open of $package failed: $!\n";
+ return;
+ }
+ $contents = <DATAFILE>;
+ close(DATAFILE);
+ $$PPDfile = $package;
+ }
+ # URL?
+ elsif ($package =~ m@^...*://@i) {
+ return unless ($contents = read_href("href" => $package,
+ "request" => 'GET'));
+ $$PPDfile = $package;
+ }
+ # does the package have a <LOCATION> in $PPM::PPMdat?
+ elsif ($installed_packages{$package}) {
+ $location = $installed_packages{$package}{'LOCATION'};
+ if ($location =~ /[^\/]$/) { $location .= "/"; }
+ $$PPDfile = $location . $package . ".ppd";
+ return %PPD if (%PPD = getPPDfile('package' => $$PPDfile,
+ 'parsertype' => $parsertype));
+ undef $$PPDfile;
+ }
+
+ # None of the above, search the repositories.
+ unless ($PPDfile && $$PPDfile) {
+ foreach (keys %repositories) {
+ my $location = $repositories{$_}{'LOCATION'};
+ if ($location =~ /[^\/]$/) { $location .= "/"; }
+ $$PPDfile = $location . $package . ".ppd";
+ return %PPD if (%PPD = getPPDfile('package' => $$PPDfile,
+ 'parsertype' => $parsertype, 'PPDfile' => \$$PPDfile));
+ undef $$PPDfile;
+ }
+ return unless $$PPDfile;
+ }
+
+ # take care of '&'
+ $contents =~ s/&(?!\w+;)/&amp;/go;
+
+ my $parser = new XML::Parser( Style => 'Objects', Pkg => $parsertype );
+ my @parsed;
+ eval { @parsed = @{ $parser->parse( $contents ) } };
+ if ($@) {
+ &Trace("getPPDfile: content of $$PPDfile is not valid") if $options{'TRACE'};
+ $PPM::PPMERR = "content of $$PPDfile is not valid: $!\n";
+ return;
+ }
+
+ return if (!$parsed[0]->rvalidate( \&PPM::parse_err ));
+
+ return %{$parsed[0]};
+}
+
+# Spits out the error from parsing, and sets our global error message
+# accordingly.
+sub parse_err
+{
+ &Trace("parse_err: @_") if $options{'TRACE'};
+ warn @_;
+ $PPM::PPMERR = 'Errors found while parsing document.';
+}
+
+# reads and parses the PPM data file $PPM::PPMdat. Stores config information in
+# $PPM_ver, $build_dir, %repositories, $CPU, $OS_VALUE, and $OS_VERSION.
+# Stores information about individual packages in the hash %installed_packages.
+sub read_config
+{
+ return if $init++;
+
+ my %PPMConfig;
+ return unless (%PPMConfig = getPPDfile('package' => $PPM::PPMdat,
+ 'parsertype' => 'PPM::XML::PPMConfig'));
+
+ foreach my $elem (@{$PPMConfig{Kids}}) {
+ my $subelem = ref $elem;
+ $subelem =~ s/.*:://;
+ next if ($subelem eq 'Characters');
+
+ if ($subelem eq 'PPMVER') {
+ # Get the value out of our _only_ character data element.
+ $PPM_ver = $elem->{Kids}[0]{Text};
+ }
+ elsif ($subelem eq 'PPMPRECIOUS') {
+ # Get the value out of our _only_ character data element.
+ @required_packages = split( ';', $elem->{Kids}[0]{Text} );
+ }
+ elsif ($subelem eq 'PLATFORM') {
+ # Get values out of our attributes
+ $CPU = $elem->{CPU};
+ $OS_VALUE = $elem->{OSVALUE};
+ $OS_VERSION = $elem->{OSVERSION};
+ $LANGUAGE = $elem->{LANGUAGE};
+ }
+ elsif ($subelem eq 'REPOSITORY') {
+ # Get a repository out of the element attributes
+ my ($name);
+ $name = $elem->{NAME};
+ $repositories{ $name }{'LOCATION'} = $elem->{LOCATION};
+ $repositories{ $name }{'USERNAME'} = $elem->{USERNAME};
+ $repositories{ $name }{'PASSWORD'} = $elem->{PASSWORD};
+ $repositories{ $name }{'SUMMARYFILE'} = $elem->{SUMMARYFILE};
+ }
+ elsif ($subelem eq 'OPTIONS') {
+ # Get our options out of the element attributes
+ #
+ # Previous versions of the ppm.xml had "Yes/No" values
+ # for some of these options. Change these to "1/0" if we
+ # encounter them.
+ $options{'IGNORECASE'} =
+ ($elem->{IGNORECASE} && $elem->{IGNORECASE} ne 'No');
+ $options{'CLEAN'} = ($elem->{CLEAN} && $elem->{CLEAN} ne 'No');
+ $options{'CONFIRM'} =
+ ($elem->{CONFIRM} && $elem->{CONFIRM} ne 'No');
+ $options{'DOWNLOADSTATUS'} =
+ defined $elem->{DOWNLOADSTATUS} ? $elem->{DOWNLOADSTATUS} : "0";
+ $options{'FORCE_INSTALL'} =
+ ($elem->{FORCEINSTALL} && $elem->{FORCEINSTALL} ne 'No');
+ $options{'ROOT'} = $elem->{ROOT};
+ $options{'MORE'} = $elem->{MORE};
+ $options{'TRACE'} = defined $elem->{TRACE} ? $elem->{TRACE} : "0";
+ $options{'TRACEFILE'} =
+ defined $elem->{TRACEFILE} ? $elem->{TRACEFILE} : "PPM.LOG";
+ $options{'VERBOSE'} =
+ defined $elem->{VERBOSE} ? $elem->{VERBOSE} : "1";
+
+ $options{'BUILDDIR'} = $elem->{BUILDDIR};
+ # Strip trailing separator
+ my $chr = substr( $options{'BUILDDIR'}, -1, 1 );
+ chop $options{'BUILDDIR'} if ($chr eq '/' || $chr eq '\\');
+ if ($options{'TRACE'} && !$TraceStarted) {
+ $options{'TRACEFILE'} = "PPM.log" if (!defined $options{'TRACEFILE'});
+ open(PPMTRACE, ">>$options{'TRACEFILE'}");
+ my $oldfh = select(PPMTRACE);
+ $| = 1;
+ select($oldfh);
+ &Trace("starting up...");
+ $TraceStarted = 1;
+ }
+ }
+ elsif ($subelem eq 'PACKAGE') {
+ # Get our package name out of our attributes
+ my $pkg = $elem->{NAME};
+
+ # Gather the information on this package from the child elements.
+ my ($loc, $instdate, $root, $packlist, $ppd);
+ foreach my $child (@{$elem->{Kids}}) {
+ my $child_type = ref $child;
+ $child_type =~ s/.*:://;
+ next if ($child_type eq 'Characters');
+
+ if ($child_type eq 'LOCATION')
+ { $loc = $child->{Kids}[0]{Text}; }
+ elsif ($child_type eq 'INSTDATE')
+ { $instdate = $child->{Kids}[0]{Text}; }
+ elsif ($child_type eq 'INSTROOT')
+ { $root = $child->{Kids}[0]{Text}; }
+ elsif ($child_type eq 'INSTPACKLIST')
+ { $packlist = $child->{Kids}[0]{Text}; }
+ elsif ($child_type eq 'INSTPPD')
+ {
+ # Find the SOFTPKG inside here and hang onto it
+ my $tmp;
+ foreach $tmp (@{$child->{Kids}})
+ {
+ if ((ref $tmp) =~ /::SOFTPKG$/o)
+ { $ppd = $tmp; }
+ }
+ }
+ else
+ {
+ die "Unknown element inside of $pkg PACKAGE; $child";
+ }
+ }
+
+ my %package_details = ( LOCATION => $loc,
+ INST_DATE => $instdate,
+ INST_ROOT => $root,
+ INST_PACKLIST => $packlist,
+ INST_PPD => $ppd);
+ $installed_packages{$pkg} = \%package_details;
+ }
+ else
+ {
+ die "Unknown element found in PPD_DAT file; $subelem";
+ }
+ }
+ if ($Debug & 1) {
+ print "This is ppm, version $PPM_ver.\nRepository locations:\n";
+ foreach (keys %repositories) {
+ print "\t$_: $repositories{$_}{'LOCATION'}\n"
+ }
+ print "Platform is $OS_VALUE version $OS_VERSION on a $CPU CPU.\n";
+ print "Packages will be built in $options{'BUILDDIR'}\n";
+ print "Commands will " . ($options{'CONFIRM'} ? "" : "not ") .
+ "be confirmed.\n";
+ print "Temporary files will " . ($options{'CLEAN'} ? "" : "not ") .
+ "be deleted.\n";
+ print "Installations will " . ($options{'FORCE_INSTALL'} ? "" : "not ")
+ . "continue if a dependency cannot be installed.\n";
+ print "Screens will " . ($options{'MORE'} > 0 ?
+ "pause after each $options{'MORE'} lines.\n" :
+ "not pause after the screen is full.\n");
+ print "Tracing info will " . ($options{'TRACE'} > 0 ?
+ "be written to $options{'TRACEFILE'}.\n" : "not be written.\n");
+ print "Case-" . ($options{'IGNORECASE'} ? "in" : "") .
+ "sensitive searches will be performed.\n";
+
+ foreach my $pkg (keys %installed_packages) {
+ print "\nFound installed package $pkg, " .
+ "installed on $installed_packages{$pkg}{INST_DATE}\n" .
+ "in directory root $installed_packages{$pkg}{INST_ROOT} " .
+ "from $installed_packages{$pkg}{'LOCATION'}.\n\n";
+ }
+ }
+}
+
+sub Trace
+{
+ print PPMTRACE "$0: @_ at ", scalar localtime(), "\n";
+}
+
+# Converts a cpan-type of version string (eg, I<1.23>) into a ppd one
+# of the form I<1,23,0,0>:
+
+sub cpan2ppd_version {
+ my $v = shift;
+ return $v if ($v =~ /,/);
+ return join ',', (split (/\./, $v), (0)x4)[0..3];
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ppm - PPM (Perl Package Management)
+
+=head1 SYNOPSIS
+
+ use PPM;
+
+ PPM::InstallPackage("package" => $package, "location" => $location, "root" => $root);
+ PPM::RemovePackage("package" => $package, "force" => $force);
+ PPM::VerifyPackage("package" => $package, "location" => $location, "upgrade" => $upgrade);
+ PPM::QueryInstalledPackages("searchRE" => $searchRE, "searchtag" => $searchtag, "ignorecase" => $ignorecase);
+ PPM::InstalledPackageProperties();
+
+ PPM::ListOfRepositories();
+ PPM::RemoveRepository("repository" => $repository, "save" => $save);
+ PPM::AddRepository("repository" => $repository, "location" => $location, "save" => $save, "summaryfile" => $summaryfile);
+ PPM::RepositoryPackages("location" => $location);
+ PPM::RepositoryPackageProperties("package" => $package, "location" => $location);
+ PPM::RepositorySummary("location" => $location);
+
+ PPM::GetPPMOptions();
+ PPM::SetPPMOptions("options" => %options, "save" => $save);
+
+=head1 DESCRIPTION
+
+PPM is a group of functions intended to simplify the tasks of locating,
+installing, upgrading and removing software 'packages'. It can determine
+if the most recent version of a software package is installed on a system,
+and can install or upgrade that package from a local or remote host.
+
+PPM uses files containing a modified form of the Open Software Distribution
+(OSD) specification for information about software packages.
+These description files, which are written in Extensible Markup
+Language (XML) code, are referred to as 'PPD' files. Information about
+OSD can be found at the W3C web site (at the time of this writing,
+http://www.w3.org/TR/NOTE-OSD.html). The modifications to OSD used by PPM
+are documented in PPM::ppd.
+
+PPD files for packages are generated from POD files using the pod2ppd
+command.
+
+=head1 USAGE
+
+=over 4
+
+=item PPM::InstallPackage("package" => $package, "location" => $location, "root" => $root);
+
+Installs the specified package onto the local system. 'package' may
+be a simple package name ('foo'), a pathname (P:\PACKAGES\FOO.PPD) or
+a URL (HTTP://www.ActiveState.com/packages/foo.ppd). In the case of a
+simple package name, the function will look for the package's PPD file
+at 'location', if provided; otherwise, it will use information stored
+in the PPM data file (see 'Files' section below) to locate the PPD file
+for the requested package. The package's files will be installed under
+the directory specified in 'root'; if not specified the default value
+of 'root' will be used.
+
+The function uses the values stored in the PPM data file to determine the
+local operating system, operating system version and CPU type. If the PPD
+for this package contains implementations for different platforms, these
+values will be used to determine which one is installed.
+
+InstallPackage() updates the PPM data file with information about the package
+installation. It stores a copy of the PPD used for installation, as well
+as the location from which this PPD was obtained. This location will
+become the default PPD location for this package.
+
+During an installation, the following actions are performed:
+
+ - the PPD file for the package is read
+ - a directory for this package is created in the directory specified in
+ <BUILDDIR> in the PPM data file.
+ - the file specified with the <CODEBASE> tag in the PPD file is
+ retrieved/copied into the directory created above.
+ - the package is unarchived in the directory created for this package
+ - individual files from the archive are installed in the appropriate
+ directories of the local Perl installation.
+ - perllocal.pod is updated with the install information.
+ - if provided, the <INSTALL> script from the PPD is executed in the
+ directory created above.
+ - information about the installation is stored in the PPM data file.
+
+=item PPM::RemovePackage("package" => $package, "force" => $force)
+
+Removes the specified package from the system. Reads the package's PPD
+(stored during installation) for removal details. If 'force' is
+specified, even a package required by PPM will be removed (useful
+when installing an upgrade).
+
+=item PPM::VerifyPackage("package" => $package, "location" => $location, "upgrade" => $upgrade)
+
+Reads a PPD file for 'package', and compares the currently installed
+version of 'package' to the version available according to the PPD.
+The PPD file is expected to be on a local directory or remote site
+specified either in the PPM data file or in the 'location' argument.
+The 'location' argument may be a directory location or a URL.
+The 'upgrade' argument forces an upgrade if the installed package is
+not up-to-date.
+
+The PPD file for each package will initially be searched for at
+'location', and if not found will then be searched for using the
+locations specified in the PPM data file.
+
+=item PPM::QueryInstalledPackages("searchRE" => $searchRE, "searchtag" => $searchtag, "ignorecase" => $ignorecase);
+
+Returns a hash containing information about all installed packages.
+By default, a list of all installed packages is returned. If a regular
+expression 'searchRE' is specified, only packages matching it are
+returned. If 'searchtag' is specified, the pattern match is applied
+to the appropriate tag (e.g., ABSTRACT).
+
+The data comes from the PPM data file, which contains installation
+information about each installed package.
+
+=item PPM::InstalledPackageProperties();
+
+Returns a hash with package names as keys, and package properties as
+attributes.
+
+=item PPM::RepositoryPackages("location" => $location);
+
+Returns a hash, with 'location' being the key, and arrays of all packages
+with package description (PPD) files available at 'location' as its
+elements. 'location' may be either a remote address or a directory path.
+If 'location' is not specified, the default location as specified in
+the PPM data file will be used.
+
+=item PPM::ListOfRepositories();
+
+Returns a hash containing the name of the repository and its location.
+These repositories will be searched if an explicit location is not
+provided in any function needing to locate a PPD.
+
+=item PPM::RemoveRepository("repository" => $repository, "save" => $save);
+
+Removes the repository named 'repository' from the list of available
+repositories. If 'save' is not specified, the change is for the current
+session only.
+
+=item PPM::AddRepository("repository" => $repository, "location" => $location, "save" => $save);
+
+Adds the repository named 'repository' to the list of available repositories.
+If 'save' is not specified, the change is for the current session only.
+
+=item PPM::RepositoryPackageProperties("package" => $package, "location" => $location);
+
+Reads the PPD file for 'package', from 'location' or the default repository,
+and returns a hash with keys being the various tags from the PPD (e.g.
+'ABSTRACT', 'AUTHOR', etc.).
+
+=item PPM::RepositorySummary("location" => $location);
+
+Attempts to retrieve the summary file associated with the specified repository,
+or from all repositories if 'location' is not specified. The return value
+is a hash with the key being the repository, and the data being another
+hash of package name keys, and package detail data.
+
+=item PPM::GetPPMOptions();
+
+Returns a hash containing values for all PPM internal options ('IGNORECASE',
+'CLEAN', 'CONFIRM', 'ROOT', 'BUILDDIR', 'DOWNLOADSTATUS').
+
+=item PPM::SetPPMOptions("options" => %options, "save" => $save);
+
+Sets internal PPM options as specified in the 'options' hash, which is
+expected to be the hash previously returned by a call to GetPPMOptions().
+
+=back
+
+=head1 EXAMPLES
+
+=over 4
+
+=item PPM::AddRepository("repository" => 'ActiveState', "location" => "http://www.ActiveState.com/packages", "save" => 1, "summaryfile" => "searchsummary.ppm");
+
+Adds a repository to the list of available repositories, and saves it in
+the PPM options file.
+
+=item PPM::InstallPackage("package" => 'http://www.ActiveState.com/packages/foo.ppd');
+
+Installs the software package 'foo' based on the information in the PPD
+obtained from the specified URL.
+
+=item PPM::VerifyPackage("package" => 'foo', "upgrade" => true)
+
+Compares the currently installed version of the software package 'foo' to
+the one available according to the PPD obtained from the package-specific
+location provided in the PPM data file, and upgrades to a newer
+version if available. If a location for this specific package is not
+given in PPM data file, a default location is searched.
+
+=item PPM::VerifyPackage("package" => 'foo', "location" => 'P:\PACKAGES', "upgrade" => true);
+
+Compares the currently installed version of the software package 'foo'
+to the one available according to the PPD obtained from the specified
+directory, and upgrades to a newer version if available.
+
+=item PPM::VerifyPackage("package" => 'PerlDB');
+
+Verifies that package 'PerlDB' is up to date, using package locations specified
+in the PPM data file.
+
+=item PPM::RepositoryPackages("location" => http://www.ActiveState.com/packages);
+
+Returns a hash keyed on 'location', with its elements being an array of
+packages with PPD files available at the specified location.
+
+=item %opts = PPM::GetPPMOptions();
+
+=item $options{'CONFIRM'} = '0';
+
+=item PPM::SetPPMOptions("options" => \%opts, "save" => 1);
+
+Sets and saves the value of the option 'CONFIRM' to '0'.
+
+=back
+
+=head1 ENVIRONMENT VARIABLES
+
+=over 4
+
+=item HTTP_proxy
+
+If the environment variable 'HTTP_proxy' is set, then it will
+be used as the address of a proxy for accessing the Internet.
+If the environment variables 'HTTP_proxy_user' and 'HTTP_proxy_pass'
+are set, they will be used as the login and password for the
+proxy server. If a proxy requires a certain User-Agent value
+(e.g. "Mozilla/5.0"), this can be set using the 'HTTP_proxy_agent'
+environment variable.
+
+=back
+
+=head1 FILES
+
+=over 4
+
+=item package.ppd
+
+A description of a software package, in Perl Package Distribution (PPD)
+format. More information on this file format can be found in L<PPM::XML::PPD>.
+PPM stores a copy of the PPD it uses to install or upgrade any software
+package.
+
+=item ppm.xml - PPM data file.
+
+The XML format file in which PPM stores configuration and package
+installation information. This file is created when PPM is installed,
+and under normal circumstances should never require modification other
+than by PPM itself. For more information on this file, refer to
+L<PPM::XML::PPMConfig>.
+
+=back
+
+=head1 AUTHOR
+
+Murray Nesbitt, E<lt>F<murray@cpan.org>E<gt>
+
+=head1 SEE ALSO
+
+L<PPM::XML::PPMConfig>
+.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Roadmap.pod b/Master/tlpkg/tlperl.straw/lib/Roadmap.pod
new file mode 100755
index 00000000000..69fd9d8d90a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Roadmap.pod
@@ -0,0 +1,394 @@
+=head1 NAME
+
+DBI::Roadmap - Planned Enhancements for the DBI
+
+Tim Bunce - 12th November 2004
+
+=head1 SYNOPSIS
+
+This document gives a high level overview of the future of the Perl
+DBI module.
+
+The DBI module is the standard database interface for Perl applications.
+It is used worldwide in countless applications, in every kind of
+business, and on platforms from clustered super-computers to PDAs.
+Database interface drivers are available for all common databases
+and many not-so-common ones.
+
+The planned enhancements cover testing, performance, high availability
+and load balancing, batch statements, Unicode, database portability,
+and more.
+
+Addressing these issues together, in coordinated way, will help
+ensure maximum future functionality with minimal disruptive
+(incompatible) upgrades.
+
+=head1 SCOPE
+
+Broad categories of changes are outlined here along with some
+rationale, but implementation details and minor planned enhancements
+are omitted. More details can be found in:
+L<http://svn.perl.org/modules/dbi/trunk/ToDo>
+
+
+=head1 CHANGES AND ENHANCEMENTS
+
+These are grouped into categories and are not listed in any particular order.
+
+=head2 Performance
+
+The DBI has always treated performance as a priority. Some parts
+of the implementation, however, remain unoptimized, especially in
+relation to threads.
+
+* When the DBI is used with a Perl built with thread support enabled
+(such as for Apache mod_perl 2, and some common Linux distributions)
+it runs significantly slower. There are two reasons for this and
+both can be fixed but require non-trivial changes to both the DBI
+and drivers.
+
+* Connection pooling in a threaded application, such as mod_perl,
+is difficult because DBI handles cannot be passed between threads.
+An alternative mechanism for passing connections between threads
+has been defined, and an experimental connection pool module
+implemented using it, but development has stalled.
+
+* The majority of DBI handle creation code is implemented in Perl.
+Moving most of this to C will speed up handle creation significantly.
+
+* The popular fetchrow_hashref() method is many times slower than
+fetchrow_arrayref(). It has to get the names of the columns, then
+create and load a new hash each time. A $h->{FetchHashReuse} attribute
+would allow the same hash to be reused each time making fetchrow_hashref()
+about the same speed as fetchrow_arrayref().
+
+* Support for asynchronous (non-blocking) DBI method calls would
+enable applications to continue processing in parallel with database
+activity. This is also relevant for GUI and other event-driven
+applications. The DBI needs to define a standard interface for
+this so drivers can implement it in a portable way, where possible.
+
+These changes would significantly enhance the performance of the
+DBI and many applications which use the DBI.
+
+
+=head2 Testing
+
+The DBI has a test suite. Every driver has a test suite. Each is
+limited in its scope. The driver test suite is testing for behavior
+that the driver author I<thinks> the DBI specifies, but may be
+subtly incorrect. These test suites are poorly maintained because
+the return on investment for a single driver is too low to provide
+sufficient incentive.
+
+A common test suite that can be reused by all the drivers is needed.
+It would:
+
+* Improve the quality of the DBI and drivers.
+
+* Ensure all drivers conform to the DBI specification. Easing the
+porting of applications between databases, and the implementation
+of database independent modules layered over the DBI.
+
+* Improve the DBI specification by clarifying unclear issues in
+order to implement test cases.
+
+* Encourage expansion of the test suite as driver authors and others
+will be motivated by the greater benefits of their contributions.
+
+* Detect and record optional functionality that a driver has not
+yet implemented.
+
+* Improve the testing of DBI subclassing, DBI::PurePerl and the
+various "transparent" drivers, such as DBD::Proxy and DBD::Multiplex,
+by automatically running the test suite through them.
+
+These changes would improve the quality of all applications using
+the DBI.
+
+
+=head2 High Availability and Load Balancing
+
+* The DBD::Multiplex driver provides a framework to enable a wide
+range of dynamic functionality, including support for high-availability,
+failover, load-balancing, caching, and access to distributed data.
+It is currently being enhanced but development has stalled.
+
+* The DBD::Proxy module is complex and relatively inefficient because
+it's trying to be a complete proxy for most DBI method calls. For
+many applications a simpler proxy architecture that operates with
+a single round-trip to the server would be simpler, faster, and more
+flexible.
+
+New proxy client and server classes are needed, which could be
+subclassed to support specific client to server transport mechanisms
+(such as HTTP and Spread::Queue). Apart from the efficiency gains,
+this would also enable the use of a load-balanced pool of stateless
+servers for greater scalability and reliability.
+
+* The DBI currently offers no support for distributed transactions.
+The most useful elements of the standard XA distributed transaction
+interface standard could be included in the DBI specification.
+Drivers for databases which support distributed transactions could
+then be extended to support it.
+
+These changes would enable new kinds of DBI applications for critical
+environments.
+
+
+=head2 Unicode
+
+Use of Unicode with the DBI is growing rapidly. The DBI should do
+more to help drivers support Unicode and help applications work
+with drivers that don't yet support Unicode directly.
+
+* Define expected behavior for fetching data and binding parameters.
+
+* Provide interfaces to support Unicode issues for XS and pure Perl
+drivers and applications.
+
+* Provide functions for applications to help diagnose inconsistencies
+between byte string contents and setting of the SvUTF8 flag.
+
+These changes would smooth the transition to Unicode for many
+applications and drivers.
+
+
+=head2 Batch Statements
+
+Batch statements are a sequence of SQL statements, or a stored
+procedure containing a sequence of SQL statements, which can be
+executed as a whole.
+
+Currently the DBI has no standard interface for dealing with multiple
+results from batch statements. After considerable discussion, an
+interface design has been agreed upon with driver authors, but has
+not yet been implemented.
+
+These changes would enable greater application portability between
+databases, and greater performance for databases that directly
+support batch statements.
+
+
+=head2 Introspection
+
+* The methods of the DBI API are installed dynamically when the DBI
+is loaded. The data structure used to define the methods and their
+dispatch behavior should be made part of the DBI API. This would
+enable more flexible and correct behavior by modules subclassing
+the DBI and by dynamic drivers such as DBD::Proxy and DBD::Multiplex.
+
+* Handle attribute information should also be made available, for
+the same reasons.
+
+* Currently is it not possible to discover all the child statement
+handles that belong to a database handle (or all database handles
+that belong to a driver handle). This makes certain tasks more
+difficult, especially some debugging scenarios. A cache of weak
+references to child handles would solve the problem without creating
+reference loops.
+
+* It is often useful to know which handle attributes have been
+changed since the handle was created (e.g., in mod_perl where a
+handle needs to be reset or cloned). This will become more important
+as developers start exploring use of the newly added
+$h1->swap_inner_handle($h2) method.
+
+These changes would simplify and improve the stability of many
+advanced uses of the DBI.
+
+
+=head2 Extensibility
+
+The DBI can be extended in three main dimensions: subclassing the
+DBI, subclassing a driver, and callback hooks. Each has different
+pros and cons, each is applicable in different situations, and
+all need enhancing.
+
+* Subclassing the DBI is functional but not well defined and some
+key elements are incomplete, particularly the DbTypeSubclass mechanism
+(that automatically subclasses to a class tree according to the
+type of database being used). It also needs more thorough testing.
+
+* Subclassing a driver is undocumented, poorly tested and very
+probably incomplete. However it's a powerful way to embed certain
+kinds of functionality 'below' applications while avoiding some of
+the side-effects of subclassing the DBI (especially in relation to
+error handling).
+
+* Callbacks are currently limited to error handling (the HandleError
+and HandleSetError attributes). Providing callback hooks for more
+events, such as a row being fetched, would enable utility modules,
+for example, to modify the behavior of a handle independent of any
+subclassing in use.
+
+These changes would enable cleaner and more powerful integration
+between applications, layered modules, and the DBI.
+
+
+=head2 Debugability
+
+* Enabling DBI trace output at a high level of detail causes a large
+volume of output, much of it probably unrelated to the problem being
+investigated. Trace output should be controlled by the new named-topic
+mechanism instead of just the trace level.
+
+* Calls to XS functions (such as many DBI and driver methods) don't
+normally appear in the call stack. Optionally enabling that would
+enable more useful diagnostics to be produced.
+
+* Integration with the Perl debugger would make it simpler to perform
+actions on a per-handle basis (such as breakpoint on execute,
+breakpoint on error).
+
+These changes would enable more rapid application development and
+fault finding.
+
+
+=head2 Database Portability
+
+* The DBI has not yet addressed the issue of portability among SQL
+dialects. This is the main hurdle limiting database portability
+for DBI applications.
+
+The goal is I<not> to fully parse the SQL and rewrite it in a
+different dialect. That's well beyond the scope of the DBI and
+should be left to layered modules. A simple token rewriting mechanism
+for five comment styles, two quoting styles, four placeholder styles,
+plus the ODBC "{foo ...}" escape syntax, is sufficient to significantly
+raise the level of SQL portability.
+
+* Another problem area is date/time formatting. Since version 1.41
+the DBI has defined a way to express that dates should be fetched
+in SQL standard date format (YYYY-MM-DD). This is one example of
+the more general case where bind_col() needs to be called with
+particular attributes on all columns of a particular type.
+
+A mechanism is needed whereby an application can specify default
+bind_col() attributes to be applied automatically for each column
+type. With a single step, all DATE type columns, for example, can
+be set to be returned in the standard format.
+
+These changes would enable greater database portability for
+applications and greater functionality for layered modules.
+
+
+=head2 Intellectual Property
+
+* Clarify current intellectual property status, including a review
+ of past contributions to ensure the DBI is unemcumbered.
+
+* Establish a procedure for vetting future contributions for any
+ intellectual property issues.
+
+These changes are important for companies taking a formal approach
+to assessing their risks in using Open Source software.
+
+
+=head2 Other Enhancements
+
+* Reduce the work needed to create new database interface drivers.
+
+* Definition of an interface to support scrollable cursors.
+
+
+=head2 Parrot and Perl 6
+
+The current DBI implementation in C code is unlikely to run on Perl 6.
+Perl 6 will target the Parrot virtual machine and so the internal
+architecture will be radically different from Perl 5.
+
+One of the goals of the Parrot project is to be a platform for many
+dynamic languages (including Python, PHP, Ruby, etc) and to enable
+those languages to reuse each others modules. A database interface
+for Parrot is also a database interface for any and all languages
+that run on Parrot.
+
+The Perl DBI would make an excellent base for a Parrot database
+interface because it has more functionality, and is more mature and
+extensible, than the database interfaces of the other dynamic
+languages.
+
+I plan to better define the API between the DBI and the drivers and
+use that API as the primary API for the 'raw' Parrot database
+interface. This project is known a Parrot DBDI (for "DataBase
+Driver Interface"). The announcement can be read in
+<http://groups.google.com/groups?selm=20040127225639.GF38394@dansat.data-plan.com>
+
+The bulk of the work will be translating the DBI C and Perl base
+class code into Parrot PIR, or a suitable language that generates
+PIR. The project stalled, due to Parrot not having key functionality
+at the time. That has been resolved but the project has not yet
+restarted.
+
+Each language targeting Parrot would implement their own small
+'thin' language-specific method dispatcher (a "Perl6 DBI", "Python
+DBI", "PHP DBI" etc) layered over the common Parrot DBDI interface
+and drivers.
+
+The major benefit of the DBDI project is that a much wider community
+of developers share the same database drivers. There would be more
+developers maintaining less code so the benefits of the Open Source
+model are magnified.
+
+
+=head1 PRIORITIES
+
+=head2 Transition Drivers
+
+The first priority is to make all the infrastructure changes that
+impact drivers and make an alpha release available for driver authors.
+
+As far as possible, the changes will be implemented in a way that
+enables driver authors use the same code base for DBI v1 and DBI v2.
+
+The main changes required by driver authors are:
+
+* Code changes for PERL_NO_GET_CONTEXT, plus removing PERL_POLLUTE
+and DBIS
+
+* Code changes in DBI/DBD interface (new way to create handles, new
+callbacks etc)
+
+* Common test suite infrastructure (driver-specific test base class)
+
+=head2 Transition Applications
+
+A small set of incompatible changes that may impact some applications
+will also be made in v2.0. See http://svn.perl.org/modules/dbi/trunk/ToDo
+
+=head2 Incremental Developments
+
+Once DBI v2.0 is available, the other enhancements can be implemented
+incrementally on the updated foundations. Priorities for those
+changes have not been set.
+
+=head2 DBI v1
+
+DBI v1 will continue to be maintained on a separate branch for
+bug fixes and any enhancements that ease the transition to DBI v2.
+
+=head1 RESOURCES AND CONTRIBUTIONS
+
+See L<http://dbi.perl.org/contributing> for I<how you can help>.
+
+If your company has benefited from the DBI, please consider if
+it could make a donation to The Perl Foundation "DBI Development"
+fund at L<http://dbi.perl.org/donate> to secure future development.
+
+Alternatively, if your company would benefit from a specific new
+DBI feature, please consider sponsoring its development through my
+consulting company, Data Plan Services. Work is performed rapidly
+on a fixed-price payment-on-delivery basis. Contact me for details.
+
+Using such targeted financing allows you to contribute to DBI
+development and rapidly get something specific and directly valuable
+to you in return.
+
+My company also offers annual support contracts for the DBI, which
+provide another way to support the DBI and get something specific
+in return. Contact me for details.
+
+Thank you.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Scalar/Util.pm b/Master/tlpkg/tlperl.straw/lib/Scalar/Util.pm
new file mode 100755
index 00000000000..24f146f2b3f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Scalar/Util.pm
@@ -0,0 +1,283 @@
+# Scalar::Util.pm
+#
+# Copyright (c) 1997-2007 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Scalar::Util;
+
+use strict;
+use vars qw(@ISA @EXPORT_OK $VERSION @EXPORT_FAIL);
+require Exporter;
+require List::Util; # List::Util loads the XS
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(blessed dualvar reftype weaken isweak tainted readonly openhandle refaddr isvstring looks_like_number set_prototype);
+$VERSION = "1.22";
+$VERSION = eval $VERSION;
+
+unless (defined &dualvar) {
+ # Load Pure Perl version if XS not loaded
+ require Scalar::Util::PP;
+ Scalar::Util::PP->import;
+ push @EXPORT_FAIL, qw(weaken isweak dualvar isvstring set_prototype);
+}
+
+sub export_fail {
+ if (grep { /dualvar/ } @EXPORT_FAIL) { # no XS loaded
+ my $pat = join("|", @EXPORT_FAIL);
+ if (my ($err) = grep { /^($pat)$/ } @_ ) {
+ require Carp;
+ Carp::croak("$err is only available with the XS version of Scalar::Util");
+ }
+ }
+
+ if (grep { /^(weaken|isweak)$/ } @_ ) {
+ require Carp;
+ Carp::croak("Weak references are not implemented in the version of perl");
+ }
+
+ if (grep { /^(isvstring)$/ } @_ ) {
+ require Carp;
+ Carp::croak("Vstrings are not implemented in the version of perl");
+ }
+
+ @_;
+}
+
+sub openhandle ($) {
+ my $fh = shift;
+ my $rt = reftype($fh) || '';
+
+ return defined(fileno($fh)) ? $fh : undef
+ if $rt eq 'IO';
+
+ if (reftype(\$fh) eq 'GLOB') { # handle openhandle(*DATA)
+ $fh = \(my $tmp=$fh);
+ }
+ elsif ($rt ne 'GLOB') {
+ return undef;
+ }
+
+ (tied(*$fh) or defined(fileno($fh)))
+ ? $fh : undef;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Scalar::Util - A selection of general-utility scalar subroutines
+
+=head1 SYNOPSIS
+
+ use Scalar::Util qw(blessed dualvar isweak readonly refaddr reftype tainted
+ weaken isvstring looks_like_number set_prototype);
+ # and other useful utils appearing below
+
+=head1 DESCRIPTION
+
+C<Scalar::Util> contains a selection of subroutines that people have
+expressed would be nice to have in the perl core, but the usage would
+not really be high enough to warrant the use of a keyword, and the size
+so small such that being individual extensions would be wasteful.
+
+By default C<Scalar::Util> does not export any subroutines. The
+subroutines defined are
+
+=over 4
+
+=item blessed EXPR
+
+If EXPR evaluates to a blessed reference the name of the package
+that it is blessed into is returned. Otherwise C<undef> is returned.
+
+ $scalar = "foo";
+ $class = blessed $scalar; # undef
+
+ $ref = [];
+ $class = blessed $ref; # undef
+
+ $obj = bless [], "Foo";
+ $class = blessed $obj; # "Foo"
+
+=item dualvar NUM, STRING
+
+Returns a scalar that has the value NUM in a numeric context and the
+value STRING in a string context.
+
+ $foo = dualvar 10, "Hello";
+ $num = $foo + 2; # 12
+ $str = $foo . " world"; # Hello world
+
+=item isvstring EXPR
+
+If EXPR is a scalar which was coded as a vstring the result is true.
+
+ $vs = v49.46.48;
+ $fmt = isvstring($vs) ? "%vd" : "%s"; #true
+ printf($fmt,$vs);
+
+=item isweak EXPR
+
+If EXPR is a scalar which is a weak reference the result is true.
+
+ $ref = \$foo;
+ $weak = isweak($ref); # false
+ weaken($ref);
+ $weak = isweak($ref); # true
+
+B<NOTE>: Copying a weak reference creates a normal, strong, reference.
+
+ $copy = $ref;
+ $weak = isweak($copy); # false
+
+=item looks_like_number EXPR
+
+Returns true if perl thinks EXPR is a number. See
+L<perlapi/looks_like_number>.
+
+=item openhandle FH
+
+Returns FH if FH may be used as a filehandle and is open, or FH is a tied
+handle. Otherwise C<undef> is returned.
+
+ $fh = openhandle(*STDIN); # \*STDIN
+ $fh = openhandle(\*STDIN); # \*STDIN
+ $fh = openhandle(*NOTOPEN); # undef
+ $fh = openhandle("scalar"); # undef
+
+=item readonly SCALAR
+
+Returns true if SCALAR is readonly.
+
+ sub foo { readonly($_[0]) }
+
+ $readonly = foo($bar); # false
+ $readonly = foo(0); # true
+
+=item refaddr EXPR
+
+If EXPR evaluates to a reference the internal memory address of
+the referenced value is returned. Otherwise C<undef> is returned.
+
+ $addr = refaddr "string"; # undef
+ $addr = refaddr \$var; # eg 12345678
+ $addr = refaddr []; # eg 23456784
+
+ $obj = bless {}, "Foo";
+ $addr = refaddr $obj; # eg 88123488
+
+=item reftype EXPR
+
+If EXPR evaluates to a reference the type of the variable referenced
+is returned. Otherwise C<undef> is returned.
+
+ $type = reftype "string"; # undef
+ $type = reftype \$var; # SCALAR
+ $type = reftype []; # ARRAY
+
+ $obj = bless {}, "Foo";
+ $type = reftype $obj; # HASH
+
+=item set_prototype CODEREF, PROTOTYPE
+
+Sets the prototype of the given function, or deletes it if PROTOTYPE is
+undef. Returns the CODEREF.
+
+ set_prototype \&foo, '$$';
+
+=item tainted EXPR
+
+Return true if the result of EXPR is tainted
+
+ $taint = tainted("constant"); # false
+ $taint = tainted($ENV{PWD}); # true if running under -T
+
+=item weaken REF
+
+REF will be turned into a weak reference. This means that it will not
+hold a reference count on the object it references. Also when the reference
+count on that object reaches zero, REF will be set to undef.
+
+This is useful for keeping copies of references , but you don't want to
+prevent the object being DESTROY-ed at its usual time.
+
+ {
+ my $var;
+ $ref = \$var;
+ weaken($ref); # Make $ref a weak reference
+ }
+ # $ref is now undef
+
+Note that if you take a copy of a scalar with a weakened reference,
+the copy will be a strong reference.
+
+ my $var;
+ my $foo = \$var;
+ weaken($foo); # Make $foo a weak reference
+ my $bar = $foo; # $bar is now a strong reference
+
+This may be less obvious in other situations, such as C<grep()>, for instance
+when grepping through a list of weakened references to objects that may have
+been destroyed already:
+
+ @object = grep { defined } @object;
+
+This will indeed remove all references to destroyed objects, but the remaining
+references to objects will be strong, causing the remaining objects to never
+be destroyed because there is now always a strong reference to them in the
+@object array.
+
+=back
+
+=head1 DIAGNOSTICS
+
+Module use may give one of the following errors during import.
+
+=over
+
+=item Weak references are not implemented in the version of perl
+
+The version of perl that you are using does not implement weak references, to use
+C<isweak> or C<weaken> you will need to use a newer release of perl.
+
+=item Vstrings are not implemented in the version of perl
+
+The version of perl that you are using does not implement Vstrings, to use
+C<isvstring> you will need to use a newer release of perl.
+
+=item C<NAME> is only available with the XS version of Scalar::Util
+
+C<Scalar::Util> contains both perl and C implementations of many of its functions
+so that those without access to a C compiler may still use it. However some of the functions
+are only available when a C compiler was available to compile the XS version of the extension.
+
+At present that list is: weaken, isweak, dualvar, isvstring, set_prototype
+
+=back
+
+=head1 KNOWN BUGS
+
+There is a bug in perl5.6.0 with UV's that are >= 1<<31. This will
+show up as tests 8 and 9 of dualvar.t failing
+
+=head1 SEE ALSO
+
+L<List::Util>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-2007 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Except weaken and isweak which are
+
+Copyright (c) 1999 Tuomas J. Lukka <lukka@iki.fi>. All rights reserved.
+This program is free software; you can redistribute it and/or modify it
+under the same terms as perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Scalar/Util/PP.pm b/Master/tlpkg/tlperl.straw/lib/Scalar/Util/PP.pm
new file mode 100755
index 00000000000..e94fe86f21c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Scalar/Util/PP.pm
@@ -0,0 +1,109 @@
+# Scalar::Util::PP.pm
+#
+# Copyright (c) 1997-2009 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+# This module is normally only loaded if the XS module is not available
+
+package Scalar::Util::PP;
+
+use strict;
+use warnings;
+use vars qw(@ISA @EXPORT $VERSION $recurse);
+require Exporter;
+use B qw(svref_2object);
+
+@ISA = qw(Exporter);
+@EXPORT = qw(blessed reftype tainted readonly refaddr looks_like_number);
+$VERSION = "1.22";
+$VERSION = eval $VERSION;
+
+sub blessed ($) {
+ return undef unless length(ref($_[0]));
+ my $b = svref_2object($_[0]);
+ return undef unless $b->isa('B::PVMG');
+ my $s = $b->SvSTASH;
+ return $s->isa('B::HV') ? $s->NAME : undef;
+}
+
+sub refaddr($) {
+ return undef unless length(ref($_[0]));
+
+ my $addr;
+ if(defined(my $pkg = blessed($_[0]))) {
+ $addr .= bless $_[0], 'Scalar::Util::Fake';
+ bless $_[0], $pkg;
+ }
+ else {
+ $addr .= $_[0]
+ }
+
+ $addr =~ /0x(\w+)/;
+ local $^W;
+ hex($1);
+}
+
+{
+ my %tmap = qw(
+ B::HV HASH
+ B::AV ARRAY
+ B::CV CODE
+ B::IO IO
+ B::NULL SCALAR
+ B::NV SCALAR
+ B::PV SCALAR
+ B::GV GLOB
+ B::RV REF
+ B::REGEXP REGEXP
+ );
+
+ sub reftype ($) {
+ my $r = shift;
+
+ return undef unless length(ref($r));
+
+ my $t = ref(svref_2object($r));
+
+ return
+ exists $tmap{$t} ? $tmap{$t}
+ : length(ref($$r)) ? 'REF'
+ : 'SCALAR';
+ }
+}
+
+sub tainted {
+ local($@, $SIG{__DIE__}, $SIG{__WARN__});
+ local $^W = 0;
+ no warnings;
+ eval { kill 0 * $_[0] };
+ $@ =~ /^Insecure/;
+}
+
+sub readonly {
+ return 0 if tied($_[0]) || (ref(\($_[0])) ne "SCALAR");
+
+ local($@, $SIG{__DIE__}, $SIG{__WARN__});
+ my $tmp = $_[0];
+
+ !eval { $_[0] = $tmp; 1 };
+}
+
+sub looks_like_number {
+ local $_ = shift;
+
+ # checks from perlfaq4
+ return 0 if !defined($_);
+ if (ref($_)) {
+ require overload;
+ return overload::Overloaded($_) ? defined(0 + $_) : 0;
+ }
+ return 1 if (/^[+-]?[0-9]+$/); # is a +/- integer
+ return 1 if (/^([+-]?)(?=[0-9]|\.[0-9])[0-9]*(\.[0-9]*)?([Ee]([+-]?[0-9]+))?$/); # a C float
+ return 1 if ($] >= 5.008 and /^(Inf(inity)?|NaN)$/i) or ($] >= 5.006001 and /^Inf$/i);
+
+ 0;
+}
+
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Search/Dict.pm b/Master/tlpkg/tlperl.straw/lib/Search/Dict.pm
new file mode 100755
index 00000000000..199fa5f9b41
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Search/Dict.pm
@@ -0,0 +1,108 @@
+package Search::Dict;
+require 5.000;
+require Exporter;
+
+use strict;
+
+our $VERSION = '1.02';
+our @ISA = qw(Exporter);
+our @EXPORT = qw(look);
+
+=head1 NAME
+
+Search::Dict, look - search for key in dictionary file
+
+=head1 SYNOPSIS
+
+ use Search::Dict;
+ look *FILEHANDLE, $key, $dict, $fold;
+
+ use Search::Dict;
+ look *FILEHANDLE, $params;
+
+=head1 DESCRIPTION
+
+Sets file position in FILEHANDLE to be first line greater than or equal
+(stringwise) to I<$key>. Returns the new file position, or -1 if an error
+occurs.
+
+The flags specify dictionary order and case folding:
+
+If I<$dict> is true, search by dictionary order (ignore anything but word
+characters and whitespace). The default is honour all characters.
+
+If I<$fold> is true, ignore case. The default is to honour case.
+
+If there are only three arguments and the third argument is a hash
+reference, the keys of that hash can have values C<dict>, C<fold>, and
+C<comp> or C<xfrm> (see below), and their correponding values will be
+used as the parameters.
+
+If a comparison subroutine (comp) is defined, it must return less than zero,
+zero, or greater than zero, if the first comparand is less than,
+equal, or greater than the second comparand.
+
+If a transformation subroutine (xfrm) is defined, its value is used to
+transform the lines read from the filehandle before their comparison.
+
+=cut
+
+sub look {
+ my($fh,$key,$dict,$fold) = @_;
+ my ($comp, $xfrm);
+ if (@_ == 3 && ref $dict eq 'HASH') {
+ my $params = $dict;
+ $dict = 0;
+ $dict = $params->{dict} if exists $params->{dict};
+ $fold = $params->{fold} if exists $params->{fold};
+ $comp = $params->{comp} if exists $params->{comp};
+ $xfrm = $params->{xfrm} if exists $params->{xfrm};
+ }
+ $comp = sub { $_[0] cmp $_[1] } unless defined $comp;
+ local($_);
+ my(@stat) = stat($fh)
+ or return -1;
+ my($size, $blksize) = @stat[7,11];
+ $blksize ||= 8192;
+ $key =~ s/[^\w\s]//g if $dict;
+ $key = lc $key if $fold;
+ # find the right block
+ my($min, $max) = (0, int($size / $blksize));
+ my $mid;
+ while ($max - $min > 1) {
+ $mid = int(($max + $min) / 2);
+ seek($fh, $mid * $blksize, 0)
+ or return -1;
+ <$fh> if $mid; # probably a partial line
+ $_ = <$fh>;
+ $_ = $xfrm->($_) if defined $xfrm;
+ chomp;
+ s/[^\w\s]//g if $dict;
+ $_ = lc $_ if $fold;
+ if (defined($_) && $comp->($_, $key) < 0) {
+ $min = $mid;
+ }
+ else {
+ $max = $mid;
+ }
+ }
+ # find the right line
+ $min *= $blksize;
+ seek($fh,$min,0)
+ or return -1;
+ <$fh> if $min;
+ for (;;) {
+ $min = tell($fh);
+ defined($_ = <$fh>)
+ or last;
+ $_ = $xfrm->($_) if defined $xfrm;
+ chomp;
+ s/[^\w\s]//g if $dict;
+ $_ = lc $_ if $fold;
+ last if $comp->($_, $key) >= 0;
+ }
+ seek($fh,$min,0);
+ $min;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/SelectSaver.pm b/Master/tlpkg/tlperl.straw/lib/SelectSaver.pm
new file mode 100755
index 00000000000..b67adff42bb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/SelectSaver.pm
@@ -0,0 +1,54 @@
+package SelectSaver;
+
+our $VERSION = '1.02';
+
+=head1 NAME
+
+SelectSaver - save and restore selected file handle
+
+=head1 SYNOPSIS
+
+ use SelectSaver;
+
+ {
+ my $saver = SelectSaver->new(FILEHANDLE);
+ # FILEHANDLE is selected
+ }
+ # previous handle is selected
+
+ {
+ my $saver = SelectSaver->new;
+ # new handle may be selected, or not
+ }
+ # previous handle is selected
+
+=head1 DESCRIPTION
+
+A C<SelectSaver> object contains a reference to the file handle that
+was selected when it was created. If its C<new> method gets an extra
+parameter, then that parameter is selected; otherwise, the selected
+file handle remains unchanged.
+
+When a C<SelectSaver> is destroyed, it re-selects the file handle
+that was selected when it was created.
+
+=cut
+
+require 5.000;
+use Carp;
+use Symbol;
+
+sub new {
+ @_ >= 1 && @_ <= 2 or croak 'usage: SelectSaver->new( [FILEHANDLE] )';
+ my $fh = select;
+ my $self = bless \$fh, $_[0];
+ select qualify($_[1], caller) if @_ > 1;
+ $self;
+}
+
+sub DESTROY {
+ my $self = $_[0];
+ select $$self;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Socket.pm b/Master/tlpkg/tlperl.straw/lib/Socket.pm
new file mode 100755
index 00000000000..0ceaf7c752b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Socket.pm
@@ -0,0 +1,414 @@
+package Socket;
+
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+$VERSION = "1.82";
+
+=head1 NAME
+
+Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load the C socket.h defines and structure manipulators
+
+=head1 SYNOPSIS
+
+ use Socket;
+
+ $proto = getprotobyname('udp');
+ socket(Socket_Handle, PF_INET, SOCK_DGRAM, $proto);
+ $iaddr = gethostbyname('hishost.com');
+ $port = getservbyname('time', 'udp');
+ $sin = sockaddr_in($port, $iaddr);
+ send(Socket_Handle, 0, 0, $sin);
+
+ $proto = getprotobyname('tcp');
+ socket(Socket_Handle, PF_INET, SOCK_STREAM, $proto);
+ $port = getservbyname('smtp', 'tcp');
+ $sin = sockaddr_in($port,inet_aton("127.1"));
+ $sin = sockaddr_in(7,inet_aton("localhost"));
+ $sin = sockaddr_in(7,INADDR_LOOPBACK);
+ connect(Socket_Handle,$sin);
+
+ ($port, $iaddr) = sockaddr_in(getpeername(Socket_Handle));
+ $peer_host = gethostbyaddr($iaddr, AF_INET);
+ $peer_addr = inet_ntoa($iaddr);
+
+ $proto = getprotobyname('tcp');
+ socket(Socket_Handle, PF_UNIX, SOCK_STREAM, $proto);
+ unlink('/var/run/usock');
+ $sun = sockaddr_un('/var/run/usock');
+ connect(Socket_Handle,$sun);
+
+=head1 DESCRIPTION
+
+This module is just a translation of the C F<socket.h> file.
+Unlike the old mechanism of requiring a translated F<socket.ph>
+file, this uses the B<h2xs> program (see the Perl source distribution)
+and your native C compiler. This means that it has a
+far more likely chance of getting the numbers right. This includes
+all of the commonly used pound-defines like AF_INET, SOCK_STREAM, etc.
+
+Also, some common socket "newline" constants are provided: the
+constants C<CR>, C<LF>, and C<CRLF>, as well as C<$CR>, C<$LF>, and
+C<$CRLF>, which map to C<\015>, C<\012>, and C<\015\012>. If you do
+not want to use the literal characters in your programs, then use
+the constants provided here. They are not exported by default, but can
+be imported individually, and with the C<:crlf> export tag:
+
+ use Socket qw(:DEFAULT :crlf);
+
+In addition, some structure manipulation functions are available:
+
+=over 4
+
+=item inet_aton HOSTNAME
+
+Takes a string giving the name of a host, and translates that to an
+opaque string (if programming in C, struct in_addr). Takes arguments
+of both the 'rtfm.mit.edu' type and '18.181.0.24'. If the host name
+cannot be resolved, returns undef. For multi-homed hosts (hosts with
+more than one address), the first address found is returned.
+
+For portability do not assume that the result of inet_aton() is 32
+bits wide, in other words, that it would contain only the IPv4 address
+in network order.
+
+=item inet_ntoa IP_ADDRESS
+
+Takes a string (an opaque string as returned by inet_aton(),
+or a v-string representing the four octets of the IPv4 address in
+network order) and translates it into a string of the form 'd.d.d.d'
+where the 'd's are numbers less than 256 (the normal human-readable
+four dotted number notation for Internet addresses).
+
+=item INADDR_ANY
+
+Note: does not return a number, but a packed string.
+
+Returns the 4-byte wildcard ip address which specifies any
+of the hosts ip addresses. (A particular machine can have
+more than one ip address, each address corresponding to
+a particular network interface. This wildcard address
+allows you to bind to all of them simultaneously.)
+Normally equivalent to inet_aton('0.0.0.0').
+
+=item INADDR_BROADCAST
+
+Note: does not return a number, but a packed string.
+
+Returns the 4-byte 'this-lan' ip broadcast address.
+This can be useful for some protocols to solicit information
+from all servers on the same LAN cable.
+Normally equivalent to inet_aton('255.255.255.255').
+
+=item INADDR_LOOPBACK
+
+Note - does not return a number.
+
+Returns the 4-byte loopback address. Normally equivalent
+to inet_aton('localhost').
+
+=item INADDR_NONE
+
+Note - does not return a number.
+
+Returns the 4-byte 'invalid' ip address. Normally equivalent
+to inet_aton('255.255.255.255').
+
+=item sockaddr_family SOCKADDR
+
+Takes a sockaddr structure (as returned by pack_sockaddr_in(),
+pack_sockaddr_un() or the perl builtin functions getsockname() and
+getpeername()) and returns the address family tag. It will match the
+constant AF_INET for a sockaddr_in and AF_UNIX for a sockaddr_un. It
+can be used to figure out what unpacker to use for a sockaddr of
+unknown type.
+
+=item sockaddr_in PORT, ADDRESS
+
+=item sockaddr_in SOCKADDR_IN
+
+In a list context, unpacks its SOCKADDR_IN argument and returns an array
+consisting of (PORT, ADDRESS). In a scalar context, packs its (PORT,
+ADDRESS) arguments as a SOCKADDR_IN and returns it. If this is confusing,
+use pack_sockaddr_in() and unpack_sockaddr_in() explicitly.
+
+=item pack_sockaddr_in PORT, IP_ADDRESS
+
+Takes two arguments, a port number and an opaque string, IP_ADDRESS
+(as returned by inet_aton(), or a v-string). Returns the sockaddr_in
+structure with those arguments packed in with AF_INET filled in. For
+Internet domain sockets, this structure is normally what you need for
+the arguments in bind(), connect(), and send(), and is also returned
+by getpeername(), getsockname() and recv().
+
+=item unpack_sockaddr_in SOCKADDR_IN
+
+Takes a sockaddr_in structure (as returned by pack_sockaddr_in()) and
+returns an array of two elements: the port and an opaque string
+representing the IP address (you can use inet_ntoa() to convert the
+address to the four-dotted numeric format). Will croak if the
+structure does not have AF_INET in the right place.
+
+=item sockaddr_un PATHNAME
+
+=item sockaddr_un SOCKADDR_UN
+
+In a list context, unpacks its SOCKADDR_UN argument and returns an array
+consisting of (PATHNAME). In a scalar context, packs its PATHNAME
+arguments as a SOCKADDR_UN and returns it. If this is confusing, use
+pack_sockaddr_un() and unpack_sockaddr_un() explicitly.
+These are only supported if your system has E<lt>F<sys/un.h>E<gt>.
+
+=item pack_sockaddr_un PATH
+
+Takes one argument, a pathname. Returns the sockaddr_un structure with
+that path packed in with AF_UNIX filled in. For unix domain sockets, this
+structure is normally what you need for the arguments in bind(),
+connect(), and send(), and is also returned by getpeername(),
+getsockname() and recv().
+
+=item unpack_sockaddr_un SOCKADDR_UN
+
+Takes a sockaddr_un structure (as returned by pack_sockaddr_un())
+and returns the pathname. Will croak if the structure does not
+have AF_UNIX in the right place.
+
+=back
+
+=cut
+
+use Carp;
+use warnings::register;
+
+require Exporter;
+use XSLoader ();
+@ISA = qw(Exporter);
+@EXPORT = qw(
+ inet_aton inet_ntoa
+ sockaddr_family
+ pack_sockaddr_in unpack_sockaddr_in
+ pack_sockaddr_un unpack_sockaddr_un
+ sockaddr_in sockaddr_un
+ INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_NONE
+ AF_802
+ AF_AAL
+ AF_APPLETALK
+ AF_CCITT
+ AF_CHAOS
+ AF_CTF
+ AF_DATAKIT
+ AF_DECnet
+ AF_DLI
+ AF_ECMA
+ AF_GOSIP
+ AF_HYLINK
+ AF_IMPLINK
+ AF_INET
+ AF_INET6
+ AF_ISO
+ AF_KEY
+ AF_LAST
+ AF_LAT
+ AF_LINK
+ AF_MAX
+ AF_NBS
+ AF_NIT
+ AF_NS
+ AF_OSI
+ AF_OSINET
+ AF_PUP
+ AF_ROUTE
+ AF_SNA
+ AF_UNIX
+ AF_UNSPEC
+ AF_USER
+ AF_WAN
+ AF_X25
+ IOV_MAX
+ IP_OPTIONS
+ IP_HDRINCL
+ IP_TOS
+ IP_TTL
+ IP_RECVOPTS
+ IP_RECVRETOPTS
+ IP_RETOPTS
+ MSG_BCAST
+ MSG_BTAG
+ MSG_CTLFLAGS
+ MSG_CTLIGNORE
+ MSG_CTRUNC
+ MSG_DONTROUTE
+ MSG_DONTWAIT
+ MSG_EOF
+ MSG_EOR
+ MSG_ERRQUEUE
+ MSG_ETAG
+ MSG_FIN
+ MSG_MAXIOVLEN
+ MSG_MCAST
+ MSG_NOSIGNAL
+ MSG_OOB
+ MSG_PEEK
+ MSG_PROXY
+ MSG_RST
+ MSG_SYN
+ MSG_TRUNC
+ MSG_URG
+ MSG_WAITALL
+ MSG_WIRE
+ PF_802
+ PF_AAL
+ PF_APPLETALK
+ PF_CCITT
+ PF_CHAOS
+ PF_CTF
+ PF_DATAKIT
+ PF_DECnet
+ PF_DLI
+ PF_ECMA
+ PF_GOSIP
+ PF_HYLINK
+ PF_IMPLINK
+ PF_INET
+ PF_INET6
+ PF_ISO
+ PF_KEY
+ PF_LAST
+ PF_LAT
+ PF_LINK
+ PF_MAX
+ PF_NBS
+ PF_NIT
+ PF_NS
+ PF_OSI
+ PF_OSINET
+ PF_PUP
+ PF_ROUTE
+ PF_SNA
+ PF_UNIX
+ PF_UNSPEC
+ PF_USER
+ PF_WAN
+ PF_X25
+ SCM_CONNECT
+ SCM_CREDENTIALS
+ SCM_CREDS
+ SCM_RIGHTS
+ SCM_TIMESTAMP
+ SHUT_RD
+ SHUT_RDWR
+ SHUT_WR
+ SOCK_DGRAM
+ SOCK_RAW
+ SOCK_RDM
+ SOCK_SEQPACKET
+ SOCK_STREAM
+ SOL_SOCKET
+ SOMAXCONN
+ SO_ACCEPTCONN
+ SO_ATTACH_FILTER
+ SO_BACKLOG
+ SO_BROADCAST
+ SO_CHAMELEON
+ SO_DEBUG
+ SO_DETACH_FILTER
+ SO_DGRAM_ERRIND
+ SO_DONTLINGER
+ SO_DONTROUTE
+ SO_ERROR
+ SO_FAMILY
+ SO_KEEPALIVE
+ SO_LINGER
+ SO_OOBINLINE
+ SO_PASSCRED
+ SO_PASSIFNAME
+ SO_PEERCRED
+ SO_PROTOCOL
+ SO_PROTOTYPE
+ SO_RCVBUF
+ SO_RCVLOWAT
+ SO_RCVTIMEO
+ SO_REUSEADDR
+ SO_REUSEPORT
+ SO_SECURITY_AUTHENTICATION
+ SO_SECURITY_ENCRYPTION_NETWORK
+ SO_SECURITY_ENCRYPTION_TRANSPORT
+ SO_SNDBUF
+ SO_SNDLOWAT
+ SO_SNDTIMEO
+ SO_STATE
+ SO_TYPE
+ SO_USELOOPBACK
+ SO_XOPEN
+ SO_XSE
+ UIO_MAXIOV
+);
+
+@EXPORT_OK = qw(CR LF CRLF $CR $LF $CRLF
+
+ IPPROTO_IP
+ IPPROTO_IPV6
+ IPPROTO_RAW
+ IPPROTO_ICMP
+ IPPROTO_TCP
+ IPPROTO_UDP
+
+ TCP_KEEPALIVE
+ TCP_MAXRT
+ TCP_MAXSEG
+ TCP_NODELAY
+ TCP_STDURG);
+
+%EXPORT_TAGS = (
+ crlf => [qw(CR LF CRLF $CR $LF $CRLF)],
+ all => [@EXPORT, @EXPORT_OK],
+);
+
+BEGIN {
+ sub CR () {"\015"}
+ sub LF () {"\012"}
+ sub CRLF () {"\015\012"}
+}
+
+*CR = \CR();
+*LF = \LF();
+*CRLF = \CRLF();
+
+sub sockaddr_in {
+ if (@_ == 6 && !wantarray) { # perl5.001m compat; use this && die
+ my($af, $port, @quad) = @_;
+ warnings::warn "6-ARG sockaddr_in call is deprecated"
+ if warnings::enabled();
+ pack_sockaddr_in($port, inet_aton(join('.', @quad)));
+ } elsif (wantarray) {
+ croak "usage: (port,iaddr) = sockaddr_in(sin_sv)" unless @_ == 1;
+ unpack_sockaddr_in(@_);
+ } else {
+ croak "usage: sin_sv = sockaddr_in(port,iaddr))" unless @_ == 2;
+ pack_sockaddr_in(@_);
+ }
+}
+
+sub sockaddr_un {
+ if (wantarray) {
+ croak "usage: (filename) = sockaddr_un(sun_sv)" unless @_ == 1;
+ unpack_sockaddr_un(@_);
+ } else {
+ croak "usage: sun_sv = sockaddr_un(filename)" unless @_ == 1;
+ pack_sockaddr_un(@_);
+ }
+}
+
+sub AUTOLOAD {
+ my($constname);
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ croak "&Socket::constant not defined" if $constname eq 'constant';
+ my ($error, $val) = constant($constname);
+ if ($error) {
+ croak $error;
+ }
+ *$AUTOLOAD = sub { $val };
+ goto &$AUTOLOAD;
+}
+
+XSLoader::load 'Socket', $VERSION;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/String/CRC32.pm b/Master/tlpkg/tlperl.straw/lib/String/CRC32.pm
new file mode 100755
index 00000000000..42687369ee8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/String/CRC32.pm
@@ -0,0 +1,19 @@
+
+package String::CRC32;
+
+require Exporter;
+require DynaLoader;
+
+@ISA = qw(Exporter DynaLoader);
+
+$VERSION = 1.4;
+
+# Items to export into callers namespace by default
+@EXPORT = qw(crc32);
+
+# Other items we are prepared to export if requested
+@EXPORT_OK = qw();
+
+bootstrap String::CRC32;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/String/CRC32.pod b/Master/tlpkg/tlperl.straw/lib/String/CRC32.pod
new file mode 100755
index 00000000000..ba0d1b09857
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/String/CRC32.pod
@@ -0,0 +1,61 @@
+=head1 NAME
+
+String::CRC32 - Perl interface for cyclic redundency check generation
+
+=head1 SYNOPSIS
+
+ use String::CRC32;
+
+ $crc = crc32("some string");
+ $crc = crc32("some string", initvalue);
+
+ $somestring = "some string";
+ $crc = crc32($somestring);
+
+ open(SOMEFILE, "location/of/some.file");
+ $crc = crc32(*SOMEFILE);
+ close(SOMEFILE);
+
+=head1 DESCRIPTION
+
+The B<CRC32> module calculates CRC sums of 32 bit lenghts.
+It generates the same CRC values as ZMODEM, PKZIP, PICCHECK and
+many others.
+
+Despite its name, this module is able to compute
+the checksum of files as well as strings.
+
+=head1 EXAMPLES
+
+ $crc = crc32("some string");
+
+ results in the same as
+
+ $crc = crc32(" string", crc32("some"));
+
+This is useful for subsequent CRC checking of substrings.
+
+You may even check files:
+
+ open(SOMEFILE, "location/of/some.file");
+ $crc = crc32(*SOMEFILE);
+ close(SOMEFILE);
+
+A init value may also been supplied in the above example.
+
+=head1 AUTHOR
+
+Soenke J. Peters <peters__perl@opcenter.de>
+
+Please be so kind as to report any bugs/suggestions to the above address.
+
+=head1 COPYRIGHT
+
+CRC algorithm code taken from CRC-32 by Craig Bruce.
+The module stuff is inspired by a similar perl module called
+String::CRC by David Sharnoff & Matthew Dillon.
+Horst Fickenscher told me that it could be useful to supply an init
+value to the crc checking function and so I included this possibility.
+
+The author of this package disclaims all copyrights and
+releases it into the public domain.
diff --git a/Master/tlpkg/tlperl.straw/lib/Sub/Uplevel.pm b/Master/tlpkg/tlperl.straw/lib/Sub/Uplevel.pm
new file mode 100755
index 00000000000..5b7cef97dda
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Sub/Uplevel.pm
@@ -0,0 +1,360 @@
+package Sub::Uplevel;
+
+use 5.006;
+use strict;
+our $VERSION = '0.22';
+$VERSION = eval $VERSION;
+
+# We must override *CORE::GLOBAL::caller if it hasn't already been
+# overridden or else Perl won't see our local override later.
+
+if ( not defined *CORE::GLOBAL::caller{CODE} ) {
+ *CORE::GLOBAL::caller = \&_normal_caller;
+}
+
+# modules to force reload if ":aggressive" is specified
+my @reload_list = qw/Exporter Exporter::Heavy/;
+
+sub import {
+ no strict 'refs';
+ my ($class, @args) = @_;
+ for my $tag ( @args, 'uplevel' ) {
+ if ( $tag eq 'uplevel' ) {
+ my $caller = caller(0);
+ *{"$caller\::uplevel"} = \&uplevel;
+ }
+ elsif( $tag eq ':aggressive' ) {
+ _force_reload( @reload_list );
+ }
+ else {
+ die qq{"$tag" is not exported by the $class module\n}
+ }
+ }
+ return;
+}
+
+sub _force_reload {
+ no warnings 'redefine';
+ local $^W = 0;
+ for my $m ( @_ ) {
+ $m =~ s{::}{/}g;
+ $m .= ".pm";
+ require $m if delete $INC{$m};
+ }
+}
+
+=head1 NAME
+
+Sub::Uplevel - apparently run a function in a higher stack frame
+
+=begin wikidoc
+
+= VERSION
+
+This documentation describes version %%VERSION%%
+
+=end wikidoc
+
+=head1 SYNOPSIS
+
+ use Sub::Uplevel;
+
+ sub foo {
+ print join " - ", caller;
+ }
+
+ sub bar {
+ uplevel 1, \&foo;
+ }
+
+ #line 11
+ bar(); # main - foo.plx - 11
+
+=head1 DESCRIPTION
+
+Like Tcl's uplevel() function, but not quite so dangerous. The idea
+is just to fool caller(). All the really naughty bits of Tcl's
+uplevel() are avoided.
+
+B<THIS IS NOT THE SORT OF THING YOU WANT TO DO EVERYDAY>
+
+=over 4
+
+=item B<uplevel>
+
+ uplevel $num_frames, \&func, @args;
+
+Makes the given function think it's being executed $num_frames higher
+than the current stack level. So when they use caller($frames) it
+will actually give caller($frames + $num_frames) for them.
+
+C<uplevel(1, \&some_func, @_)> is effectively C<goto &some_func> but
+you don't immediately exit the current subroutine. So while you can't
+do this:
+
+ sub wrapper {
+ print "Before\n";
+ goto &some_func;
+ print "After\n";
+ }
+
+you can do this:
+
+ sub wrapper {
+ print "Before\n";
+ my @out = uplevel 1, &some_func;
+ print "After\n";
+ return @out;
+ }
+
+C<uplevel> will issue a warning if C<$num_frames> is more than the current call
+stack depth.
+
+=cut
+
+# @Up_Frames -- uplevel stack
+# $Caller_Proxy -- whatever caller() override was in effect before uplevel
+our (@Up_Frames, $Caller_Proxy);
+
+sub _apparent_stack_height {
+ my $height = 1; # start above this function
+ while ( 1 ) {
+ last if ! defined scalar $Caller_Proxy->($height);
+ $height++;
+ }
+ return $height - 1; # subtract 1 for this function
+}
+
+sub uplevel {
+ my($num_frames, $func, @args) = @_;
+
+ # backwards compatible version of "no warnings 'redefine'"
+ my $old_W = $^W;
+ $^W = 0;
+
+ # Update the caller proxy if the uplevel override isn't in effect
+ local $Caller_Proxy = *CORE::GLOBAL::caller{CODE}
+ if *CORE::GLOBAL::caller{CODE} != \&_uplevel_caller;
+ local *CORE::GLOBAL::caller = \&_uplevel_caller;
+
+ # restore old warnings state
+ $^W = $old_W;
+
+ if ( $num_frames >= _apparent_stack_height() ) {
+ require Carp;
+ Carp::carp("uplevel $num_frames is more than the caller stack");
+ }
+
+ local @Up_Frames = ($num_frames, @Up_Frames );
+
+ return $func->(@args);
+}
+
+sub _normal_caller (;$) { ## no critic Prototypes
+ my $height = $_[0];
+ $height++;
+ if ( CORE::caller() eq 'DB' ) {
+ # passthrough the @DB::args trick
+ package DB;
+ if( wantarray and !@_ ) {
+ return (CORE::caller($height))[0..2];
+ }
+ else {
+ return CORE::caller($height);
+ }
+ }
+ else {
+ if( wantarray and !@_ ) {
+ return (CORE::caller($height))[0..2];
+ }
+ else {
+ return CORE::caller($height);
+ }
+ }
+}
+
+sub _uplevel_caller (;$) { ## no critic Prototypes
+ my $height = $_[0] || 0;
+
+ # shortcut if no uplevels have been called
+ # always add +1 to CORE::caller (proxy caller function)
+ # to skip this function's caller
+ return $Caller_Proxy->( $height + 1 ) if ! @Up_Frames;
+
+=begin _private
+
+So it has to work like this:
+
+ Call stack Actual uplevel 1
+CORE::GLOBAL::caller
+Carp::short_error_loc 0
+Carp::shortmess_heavy 1 0
+Carp::croak 2 1
+try_croak 3 2
+uplevel 4
+function_that_called_uplevel 5
+caller_we_want_to_see 6 3
+its_caller 7 4
+
+So when caller(X) winds up below uplevel(), it only has to use
+CORE::caller(X+1) (to skip CORE::GLOBAL::caller). But when caller(X)
+winds up no or above uplevel(), it's CORE::caller(X+1+uplevel+1).
+
+Which means I'm probably going to have to do something nasty like walk
+up the call stack on each caller() to see if I'm going to wind up
+before or after Sub::Uplevel::uplevel().
+
+=end _private
+
+=begin _dagolden
+
+I found the description above a bit confusing. Instead, this is the logic
+that I found clearer when CORE::GLOBAL::caller is invoked and we have to
+walk up the call stack:
+
+* if searching up to the requested height in the real call stack doesn't find
+a call to uplevel, then we can return the result at that height in the
+call stack
+
+* if we find a call to uplevel, we need to keep searching upwards beyond the
+requested height at least by the amount of upleveling requested for that
+call to uplevel (from the Up_Frames stack set during the uplevel call)
+
+* additionally, we need to hide the uplevel subroutine call, too, so we search
+upwards one more level for each call to uplevel
+
+* when we've reached the top of the search, we want to return that frame
+in the call stack, i.e. the requested height plus any uplevel adjustments
+found during the search
+
+=end _dagolden
+
+=cut
+
+ my $saw_uplevel = 0;
+ my $adjust = 0;
+
+ # walk up the call stack to fight the right package level to return;
+ # look one higher than requested for each call to uplevel found
+ # and adjust by the amount found in the Up_Frames stack for that call.
+ # We *must* use CORE::caller here since we need the real stack not what
+ # some other override says the stack looks like, just in case that other
+ # override breaks things in some horrible way
+
+ for ( my $up = 0; $up <= $height + $adjust; $up++ ) {
+ my @caller = CORE::caller($up + 1);
+ if( defined $caller[0] && $caller[0] eq __PACKAGE__ ) {
+ # add one for each uplevel call seen
+ # and look into the uplevel stack for the offset
+ $adjust += 1 + $Up_Frames[$saw_uplevel];
+ $saw_uplevel++;
+ }
+ }
+
+ # For returning values, we pass through the call to the proxy caller
+ # function, just at a higher stack level
+ my @caller;
+ if ( CORE::caller() eq 'DB' ) {
+ # passthrough the @DB::args trick
+ package DB;
+ @caller = $Sub::Uplevel::Caller_Proxy->($height + $adjust + 1);
+ }
+ else {
+ @caller = $Caller_Proxy->($height + $adjust + 1);
+ }
+
+ if( wantarray ) {
+ if( !@_ ) {
+ @caller = @caller[0..2];
+ }
+ return @caller;
+ }
+ else {
+ return $caller[0];
+ }
+}
+
+=back
+
+=head1 EXAMPLE
+
+The main reason I wrote this module is so I could write wrappers
+around functions and they wouldn't be aware they've been wrapped.
+
+ use Sub::Uplevel;
+
+ my $original_foo = \&foo;
+
+ *foo = sub {
+ my @output = uplevel 1, $original_foo;
+ print "foo() returned: @output";
+ return @output;
+ };
+
+If this code frightens you B<you should not use this module.>
+
+
+=head1 BUGS and CAVEATS
+
+Well, the bad news is uplevel() is about 5 times slower than a normal
+function call. XS implementation anyone? It also slows down every invocation
+of caller(), regardless of whether uplevel() is in effect.
+
+Sub::Uplevel overrides CORE::GLOBAL::caller temporarily for the scope of
+each uplevel call. It does its best to work with any previously existing
+CORE::GLOBAL::caller (both when Sub::Uplevel is first loaded and within
+each uplevel call) such as from Contextual::Return or Hook::LexWrap.
+
+However, if you are routinely using multiple modules that override
+CORE::GLOBAL::caller, you are probably asking for trouble.
+
+You B<should> load Sub::Uplevel as early as possible within your program. As
+with all CORE::GLOBAL overloading, the overload will not affect modules that
+have already been compiled prior to the overload. One module that often is
+unavoidably loaded prior to Sub::Uplevel is Exporter. To forceably recompile
+Exporter (and Exporter::Heavy) after loading Sub::Uplevel, use it with the
+":aggressive" tag:
+
+ use Sub::Uplevel qw/:aggressive/;
+
+The private function C<Sub::Uplevel::_force_reload()> may be passed a list of
+additional modules to reload if ":aggressive" is not aggressive enough.
+Reloading modules may break things, so only use this as a last resort.
+
+As of version 0.20, Sub::Uplevel requires Perl 5.6 or greater.
+
+=head1 HISTORY
+
+Those who do not learn from HISTORY are doomed to repeat it.
+
+The lesson here is simple: Don't sit next to a Tcl programmer at the
+dinner table.
+
+=head1 THANKS
+
+Thanks to Brent Welch, Damian Conway and Robin Houston.
+
+=head1 AUTHORS
+
+David A Golden E<lt>dagolden@cpan.orgE<gt> (current maintainer)
+
+Michael G Schwern E<lt>schwern@pobox.comE<gt> (original author)
+
+=head1 LICENSE
+
+Original code Copyright (c) 2001 to 2007 by Michael G Schwern.
+Additional code Copyright (c) 2006 to 2008 by David A Golden.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+See http://www.perl.com/perl/misc/Artistic.html
+
+=head1 SEE ALSO
+
+PadWalker (for the similar idea with lexicals), Hook::LexWrap,
+Tcl's uplevel() at http://www.scriptics.com/man/tcl8.4/TclCmd/uplevel.htm
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Sub/Uplevel.pod b/Master/tlpkg/tlperl.straw/lib/Sub/Uplevel.pod
new file mode 100755
index 00000000000..7ae447f9fb6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Sub/Uplevel.pod
@@ -0,0 +1,197 @@
+# Generated by Pod::WikiDoc version 0.18
+
+=pod
+
+=head1 NAME
+
+Sub::Uplevel - apparently run a function in a higher stack frame
+
+=head1 VERSION
+
+This documentation describes version 0.22
+
+
+=head1 SYNOPSIS
+
+ use Sub::Uplevel;
+
+ sub foo {
+ print join " - ", caller;
+ }
+
+ sub bar {
+ uplevel 1, \&foo;
+ }
+
+ #line 11
+ bar(); # main - foo.plx - 11
+
+=head1 DESCRIPTION
+
+Like Tcl's uplevel() function, but not quite so dangerous. The idea
+is just to fool caller(). All the really naughty bits of Tcl's
+uplevel() are avoided.
+
+B<THIS IS NOT THE SORT OF THING YOU WANT TO DO EVERYDAY>
+
+=over 4
+
+=item B<uplevel>
+
+ uplevel $num_frames, \&func, @args;
+
+Makes the given function think it's being executed $num_frames higher
+than the current stack level. So when they use caller($frames) it
+will actually give caller($frames + $num_frames) for them.
+
+C<uplevel(1, \&some_func, @_)> is effectively C<goto &some_func> but
+you don't immediately exit the current subroutine. So while you can't
+do this:
+
+ sub wrapper {
+ print "Before\n";
+ goto &some_func;
+ print "After\n";
+ }
+
+you can do this:
+
+ sub wrapper {
+ print "Before\n";
+ my @out = uplevel 1, &some_func;
+ print "After\n";
+ return @out;
+ }
+
+C<uplevel> will issue a warning if C<$num_frames> is more than the current call
+stack depth.
+
+=begin _private
+
+So it has to work like this:
+
+ Call stack Actual uplevel 1
+CORE::GLOBAL::caller
+Carp::short_error_loc 0
+Carp::shortmess_heavy 1 0
+Carp::croak 2 1
+try_croak 3 2
+uplevel 4
+function_that_called_uplevel 5
+caller_we_want_to_see 6 3
+its_caller 7 4
+
+So when caller(X) winds up below uplevel(), it only has to use
+CORE::caller(X+1) (to skip CORE::GLOBAL::caller). But when caller(X)
+winds up no or above uplevel(), it's CORE::caller(X+1+uplevel+1).
+
+Which means I'm probably going to have to do something nasty like walk
+up the call stack on each caller() to see if I'm going to wind up
+before or after Sub::Uplevel::uplevel().
+
+=end _private
+
+=begin _dagolden
+
+I found the description above a bit confusing. Instead, this is the logic
+that I found clearer when CORE::GLOBAL::caller is invoked and we have to
+walk up the call stack:
+
+* if searching up to the requested height in the real call stack doesn't find
+a call to uplevel, then we can return the result at that height in the
+call stack
+
+* if we find a call to uplevel, we need to keep searching upwards beyond the
+requested height at least by the amount of upleveling requested for that
+call to uplevel (from the Up_Frames stack set during the uplevel call)
+
+* additionally, we need to hide the uplevel subroutine call, too, so we search
+upwards one more level for each call to uplevel
+
+* when we've reached the top of the search, we want to return that frame
+in the call stack, i.e. the requested height plus any uplevel adjustments
+found during the search
+
+=end _dagolden
+
+=back
+
+=head1 EXAMPLE
+
+The main reason I wrote this module is so I could write wrappers
+around functions and they wouldn't be aware they've been wrapped.
+
+ use Sub::Uplevel;
+
+ my $original_foo = \&foo;
+
+ *foo = sub {
+ my @output = uplevel 1, $original_foo;
+ print "foo() returned: @output";
+ return @output;
+ };
+
+If this code frightens you B<you should not use this module.>
+
+
+=head1 BUGS and CAVEATS
+
+Well, the bad news is uplevel() is about 5 times slower than a normal
+function call. XS implementation anyone? It also slows down every invocation
+of caller(), regardless of whether uplevel() is in effect.
+
+Sub::Uplevel overrides CORE::GLOBAL::caller temporarily for the scope of
+each uplevel call. It does its best to work with any previously existing
+CORE::GLOBAL::caller (both when Sub::Uplevel is first loaded and within
+each uplevel call) such as from Contextual::Return or Hook::LexWrap.
+
+However, if you are routinely using multiple modules that override
+CORE::GLOBAL::caller, you are probably asking for trouble.
+
+You B<should> load Sub::Uplevel as early as possible within your program. As
+with all CORE::GLOBAL overloading, the overload will not affect modules that
+have already been compiled prior to the overload. One module that often is
+unavoidably loaded prior to Sub::Uplevel is Exporter. To forceably recompile
+Exporter (and Exporter::Heavy) after loading Sub::Uplevel, use it with the
+":aggressive" tag:
+
+ use Sub::Uplevel qw/:aggressive/;
+
+The private function C<Sub::Uplevel::_force_reload()> may be passed a list of
+additional modules to reload if ":aggressive" is not aggressive enough.
+Reloading modules may break things, so only use this as a last resort.
+
+As of version 0.20, Sub::Uplevel requires Perl 5.6 or greater.
+
+=head1 HISTORY
+
+Those who do not learn from HISTORY are doomed to repeat it.
+
+The lesson here is simple: Don't sit next to a Tcl programmer at the
+dinner table.
+
+=head1 THANKS
+
+Thanks to Brent Welch, Damian Conway and Robin Houston.
+
+=head1 AUTHORS
+
+David A Golden E<lt>dagolden@cpan.orgE<gt> (current maintainer)
+
+Michael G Schwern E<lt>schwern@pobox.comE<gt> (original author)
+
+=head1 LICENSE
+
+Original code Copyright (c) 2001 to 2007 by Michael G Schwern.
+Additional code Copyright (c) 2006 to 2008 by David A Golden.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+See http://www.perl.com/perl/misc/Artistic.html
+
+=head1 SEE ALSO
+
+PadWalker (for the similar idea with lexicals), Hook::LexWrap,
+Tcl's uplevel() at http://www.scriptics.com/man/tcl8.4/TclCmd/uplevel.htm
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Switch.pm b/Master/tlpkg/tlperl.straw/lib/Switch.pm
new file mode 100755
index 00000000000..2189ae06c6b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Switch.pm
@@ -0,0 +1,875 @@
+package Switch;
+
+use strict;
+use vars qw($VERSION);
+use Carp;
+
+use if $] >= 5.011, 'deprecate';
+
+$VERSION = '2.16';
+
+
+# LOAD FILTERING MODULE...
+use Filter::Util::Call;
+
+sub __();
+
+# CATCH ATTEMPTS TO CALL case OUTSIDE THE SCOPE OF ANY switch
+
+$::_S_W_I_T_C_H = sub { croak "case/when statement not in switch/given block" };
+
+my $offset;
+my $fallthrough;
+my ($Perl5, $Perl6) = (0,0);
+
+sub import
+{
+ $fallthrough = grep /\bfallthrough\b/, @_;
+ $offset = (caller)[2]+1;
+ filter_add({}) unless @_>1 && $_[1] eq 'noimport';
+ my $pkg = caller;
+ no strict 'refs';
+ for ( qw( on_defined on_exists ) )
+ {
+ *{"${pkg}::$_"} = \&$_;
+ }
+ *{"${pkg}::__"} = \&__ if grep /__/, @_;
+ $Perl6 = 1 if grep(/Perl\s*6/i, @_);
+ $Perl5 = 1 if grep(/Perl\s*5/i, @_) || !grep(/Perl\s*6/i, @_);
+ 1;
+}
+
+sub unimport
+{
+ filter_del()
+}
+
+sub filter
+{
+ my($self) = @_ ;
+ local $Switch::file = (caller)[1];
+
+ my $status = 1;
+ $status = filter_read(1_000_000);
+ return $status if $status<0;
+ $_ = filter_blocks($_,$offset);
+ $_ = "# line $offset\n" . $_ if $offset; undef $offset;
+ return $status;
+}
+
+use Text::Balanced ':ALL';
+
+sub line
+{
+ my ($pretext,$offset) = @_;
+ ($pretext=~tr/\n/\n/)+($offset||0);
+}
+
+sub is_block
+{
+ local $SIG{__WARN__}=sub{die$@};
+ local $^W=1;
+ my $ishash = defined eval 'my $hr='.$_[0];
+ undef $@;
+ return !$ishash;
+}
+
+my $pod_or_DATA = qr/ ^=[A-Za-z] .*? ^=cut (?![A-Za-z]) .*? $
+ | ^__(DATA|END)__\n.*
+ /smx;
+
+my $casecounter = 1;
+sub filter_blocks
+{
+ my ($source, $line) = @_;
+ return $source unless $Perl5 && $source =~ /case|switch/
+ || $Perl6 && $source =~ /when|given|default/;
+ pos $source = 0;
+ my $text = "";
+ component: while (pos $source < length $source)
+ {
+ if ($source =~ m/(\G\s*use\s+Switch\b)/gc)
+ {
+ $text .= q{use Switch 'noimport'};
+ next component;
+ }
+ my @pos = Text::Balanced::_match_quotelike(\$source,qr/\s*/,1,0);
+ if (defined $pos[0])
+ {
+ my $pre = substr($source,$pos[0],$pos[1]); # matched prefix
+ my $iEol;
+ if( substr($source,$pos[4],$pos[5]) eq '/' && # 1st delimiter
+ substr($source,$pos[2],$pos[3]) eq '' && # no op like 'm'
+ index( substr($source,$pos[16],$pos[17]), 'x' ) == -1 && # no //x
+ ($iEol = index( $source, "\n", $pos[4] )) > 0 &&
+ $iEol < $pos[8] ){ # embedded newlines
+ # If this is a pattern, it isn't compatible with Switch. Backup past 1st '/'.
+ pos( $source ) = $pos[6];
+ $text .= $pre . substr($source,$pos[2],$pos[6]-$pos[2]);
+ } else {
+ $text .= $pre . substr($source,$pos[2],$pos[18]-$pos[2]);
+ }
+ next component;
+ }
+ if ($source =~ m/(\G\s*$pod_or_DATA)/gc) {
+ $text .= $1;
+ next component;
+ }
+ @pos = Text::Balanced::_match_variable(\$source,qr/\s*/);
+ if (defined $pos[0])
+ {
+ $text .= " " if $pos[0] < $pos[2];
+ $text .= substr($source,$pos[0],$pos[4]-$pos[0]);
+ next component;
+ }
+
+ if ($Perl5 && $source =~ m/\G(\n*)(\s*)(switch)\b(?=\s*[(])/gc
+ || $Perl6 && $source =~ m/\G(\n*)(\s*)(given)\b(?=\s*[(])/gc
+ || $Perl6 && $source =~ m/\G(\n*)(\s*)(given)\b(.*)(?=\{)/gc)
+ {
+ my $keyword = $3;
+ my $arg = $4;
+ $text .= $1.$2.'S_W_I_T_C_H: while (1) ';
+ unless ($arg) {
+ @pos = Text::Balanced::_match_codeblock(\$source,qr/\s*/,qr/\(/,qr/\)/,qr/[[{(<]/,qr/[]})>]/,undef)
+ or do {
+ die "Bad $keyword statement (problem in the parentheses?) near $Switch::file line ", line(substr($source,0,pos $source),$line), "\n";
+ };
+ $arg = filter_blocks(substr($source,$pos[0],$pos[4]-$pos[0]),line(substr($source,0,$pos[0]),$line));
+ }
+ $arg =~ s {^\s*[(]\s*%} { ( \\\%} ||
+ $arg =~ s {^\s*[(]\s*m\b} { ( qr} ||
+ $arg =~ s {^\s*[(]\s*/} { ( qr/} ||
+ $arg =~ s {^\s*[(]\s*qw} { ( \\qw};
+ @pos = Text::Balanced::_match_codeblock(\$source,qr/\s*/,qr/\{/,qr/\}/,qr/\{/,qr/\}/,undef)
+ or do {
+ die "Bad $keyword statement (problem in the code block?) near $Switch::file line ", line(substr($source,0, pos $source), $line), "\n";
+ };
+ my $code = filter_blocks(substr($source,$pos[0],$pos[4]-$pos[0]),line(substr($source,0,$pos[0]),$line));
+ $code =~ s/{/{ local \$::_S_W_I_T_C_H; Switch::switch $arg;/;
+ $text .= $code . 'continue {last}';
+ next component;
+ }
+ elsif ($Perl5 && $source =~ m/\G(\s*)(case\b)(?!\s*=>)/gc
+ || $Perl6 && $source =~ m/\G(\s*)(when\b)(?!\s*=>)/gc
+ || $Perl6 && $source =~ m/\G(\s*)(default\b)(?=\s*\{)/gc)
+ {
+ my $keyword = $2;
+ $text .= $1 . ($keyword eq "default"
+ ? "if (1)"
+ : "if (Switch::case");
+
+ if ($keyword eq "default") {
+ # Nothing to do
+ }
+ elsif (@pos = Text::Balanced::_match_codeblock(\$source,qr/\s*/,qr/\{/,qr/\}/,qr/\{/,qr/\}/,undef)) {
+ my $code = substr($source,$pos[0],$pos[4]-$pos[0]);
+ $text .= " " if $pos[0] < $pos[2];
+ $text .= "sub " if is_block $code;
+ $text .= filter_blocks($code,line(substr($source,0,$pos[0]),$line)) . ")";
+ }
+ elsif (@pos = Text::Balanced::_match_codeblock(\$source,qr/\s*/,qr/[[(]/,qr/[])]/,qr/[[({]/,qr/[])}]/,undef)) {
+ my $code = filter_blocks(substr($source,$pos[0],$pos[4]-$pos[0]),line(substr($source,0,$pos[0]),$line));
+ $code =~ s {^\s*[(]\s*%} { ( \\\%} ||
+ $code =~ s {^\s*[(]\s*m\b} { ( qr} ||
+ $code =~ s {^\s*[(]\s*/} { ( qr/} ||
+ $code =~ s {^\s*[(]\s*qw} { ( \\qw};
+ $text .= " " if $pos[0] < $pos[2];
+ $text .= "$code)";
+ }
+ elsif ($Perl6 && do{@pos = Text::Balanced::_match_variable(\$source,qr/\s*/)}) {
+ my $code = filter_blocks(substr($source,$pos[0],$pos[4]-$pos[0]),line(substr($source,0,$pos[0]),$line));
+ $code =~ s {^\s*%} { \%} ||
+ $code =~ s {^\s*@} { \@};
+ $text .= " " if $pos[0] < $pos[2];
+ $text .= "$code)";
+ }
+ elsif ( @pos = Text::Balanced::_match_quotelike(\$source,qr/\s*/,1,0)) {
+ my $code = substr($source,$pos[2],$pos[18]-$pos[2]);
+ $code = filter_blocks($code,line(substr($source,0,$pos[2]),$line));
+ $code =~ s {^\s*m} { qr} ||
+ $code =~ s {^\s*/} { qr/} ||
+ $code =~ s {^\s*qw} { \\qw};
+ $text .= " " if $pos[0] < $pos[2];
+ $text .= "$code)";
+ }
+ elsif ($Perl5 && $source =~ m/\G\s*(([^\$\@{])[^\$\@{]*)(?=\s*{)/gc
+ || $Perl6 && $source =~ m/\G\s*([^;{]*)()/gc) {
+ my $code = filter_blocks($1,line(substr($source,0,pos $source),$line));
+ $text .= ' \\' if $2 eq '%';
+ $text .= " $code)";
+ }
+ else {
+ die "Bad $keyword statement (invalid $keyword value?) near $Switch::file line ", line(substr($source,0,pos $source), $line), "\n";
+ }
+
+ die "Missing opening brace or semi-colon after 'when' value near $Switch::file line ", line(substr($source,0,pos $source), $line), "\n"
+ unless !$Perl6 || $source =~ m/\G(\s*)(?=;|\{)/gc;
+
+ do{@pos = Text::Balanced::_match_codeblock(\$source,qr/\s*/,qr/\{/,qr/\}/,qr/\{/,qr/\}/,undef)}
+ or do {
+ if ($source =~ m/\G\s*(?=([};]|\Z))/gc) {
+ $casecounter++;
+ next component;
+ }
+ die "Bad $keyword statement (problem in the code block?) near $Switch::file line ", line(substr($source,0,pos $source),$line), "\n";
+ };
+ my $code = filter_blocks(substr($source,$pos[0],$pos[4]-$pos[0]),line(substr($source,0,$pos[0]),$line));
+ $code =~ s/}(?=\s*\Z)/;last S_W_I_T_C_H }/
+ unless $fallthrough;
+ $text .= "{ while (1) $code continue { goto C_A_S_E_$casecounter } last S_W_I_T_C_H; C_A_S_E_$casecounter: }";
+ $casecounter++;
+ next component;
+ }
+
+ $source =~ m/\G(\s*(-[sm]\s+|\w+|#.*\n|\W))/gc;
+ $text .= $1;
+ }
+ $text;
+}
+
+
+
+sub in
+{
+ my ($x,$y) = @_;
+ my @numy;
+ for my $nextx ( @$x )
+ {
+ my $numx = ref($nextx) || defined $nextx && (~$nextx&$nextx) eq 0;
+ for my $j ( 0..$#$y )
+ {
+ my $nexty = $y->[$j];
+ push @numy, ref($nexty) || defined $nexty && (~$nexty&$nexty) eq 0
+ if @numy <= $j;
+ return 1 if $numx && $numy[$j] && $nextx==$nexty
+ || $nextx eq $nexty;
+
+ }
+ }
+ return "";
+}
+
+sub on_exists
+{
+ my $ref = @_==1 && ref($_[0]) eq 'HASH' ? $_[0] : { @_ };
+ [ keys %$ref ]
+}
+
+sub on_defined
+{
+ my $ref = @_==1 && ref($_[0]) eq 'HASH' ? $_[0] : { @_ };
+ [ grep { defined $ref->{$_} } keys %$ref ]
+}
+
+sub switch(;$)
+{
+ my ($s_val) = @_ ? $_[0] : $_;
+ my $s_ref = ref $s_val;
+
+ if ($s_ref eq 'CODE')
+ {
+ $::_S_W_I_T_C_H =
+ sub { my $c_val = $_[0];
+ return $s_val == $c_val if ref $c_val eq 'CODE';
+ return $s_val->(@$c_val) if ref $c_val eq 'ARRAY';
+ return $s_val->($c_val);
+ };
+ }
+ elsif ($s_ref eq "" && defined $s_val && (~$s_val&$s_val) eq 0) # NUMERIC SCALAR
+ {
+ $::_S_W_I_T_C_H =
+ sub { my $c_val = $_[0];
+ my $c_ref = ref $c_val;
+ return $s_val == $c_val if $c_ref eq ""
+ && defined $c_val
+ && (~$c_val&$c_val) eq 0;
+ return $s_val eq $c_val if $c_ref eq "";
+ return in([$s_val],$c_val) if $c_ref eq 'ARRAY';
+ return $c_val->($s_val) if $c_ref eq 'CODE';
+ return $c_val->call($s_val) if $c_ref eq 'Switch';
+ return scalar $s_val=~/$c_val/
+ if $c_ref eq 'Regexp';
+ return scalar $c_val->{$s_val}
+ if $c_ref eq 'HASH';
+ return;
+ };
+ }
+ elsif ($s_ref eq "") # STRING SCALAR
+ {
+ $::_S_W_I_T_C_H =
+ sub { my $c_val = $_[0];
+ my $c_ref = ref $c_val;
+ return $s_val eq $c_val if $c_ref eq "";
+ return in([$s_val],$c_val) if $c_ref eq 'ARRAY';
+ return $c_val->($s_val) if $c_ref eq 'CODE';
+ return $c_val->call($s_val) if $c_ref eq 'Switch';
+ return scalar $s_val=~/$c_val/
+ if $c_ref eq 'Regexp';
+ return scalar $c_val->{$s_val}
+ if $c_ref eq 'HASH';
+ return;
+ };
+ }
+ elsif ($s_ref eq 'ARRAY')
+ {
+ $::_S_W_I_T_C_H =
+ sub { my $c_val = $_[0];
+ my $c_ref = ref $c_val;
+ return in($s_val,[$c_val]) if $c_ref eq "";
+ return in($s_val,$c_val) if $c_ref eq 'ARRAY';
+ return $c_val->(@$s_val) if $c_ref eq 'CODE';
+ return $c_val->call(@$s_val)
+ if $c_ref eq 'Switch';
+ return scalar grep {$_=~/$c_val/} @$s_val
+ if $c_ref eq 'Regexp';
+ return scalar grep {$c_val->{$_}} @$s_val
+ if $c_ref eq 'HASH';
+ return;
+ };
+ }
+ elsif ($s_ref eq 'Regexp')
+ {
+ $::_S_W_I_T_C_H =
+ sub { my $c_val = $_[0];
+ my $c_ref = ref $c_val;
+ return $c_val=~/s_val/ if $c_ref eq "";
+ return scalar grep {$_=~/s_val/} @$c_val
+ if $c_ref eq 'ARRAY';
+ return $c_val->($s_val) if $c_ref eq 'CODE';
+ return $c_val->call($s_val) if $c_ref eq 'Switch';
+ return $s_val eq $c_val if $c_ref eq 'Regexp';
+ return grep {$_=~/$s_val/ && $c_val->{$_}} keys %$c_val
+ if $c_ref eq 'HASH';
+ return;
+ };
+ }
+ elsif ($s_ref eq 'HASH')
+ {
+ $::_S_W_I_T_C_H =
+ sub { my $c_val = $_[0];
+ my $c_ref = ref $c_val;
+ return $s_val->{$c_val} if $c_ref eq "";
+ return scalar grep {$s_val->{$_}} @$c_val
+ if $c_ref eq 'ARRAY';
+ return $c_val->($s_val) if $c_ref eq 'CODE';
+ return $c_val->call($s_val) if $c_ref eq 'Switch';
+ return grep {$_=~/$c_val/ && $s_val->{"$_"}} keys %$s_val
+ if $c_ref eq 'Regexp';
+ return $s_val==$c_val if $c_ref eq 'HASH';
+ return;
+ };
+ }
+ elsif ($s_ref eq 'Switch')
+ {
+ $::_S_W_I_T_C_H =
+ sub { my $c_val = $_[0];
+ return $s_val == $c_val if ref $c_val eq 'Switch';
+ return $s_val->call(@$c_val)
+ if ref $c_val eq 'ARRAY';
+ return $s_val->call($c_val);
+ };
+ }
+ else
+ {
+ croak "Cannot switch on $s_ref";
+ }
+ return 1;
+}
+
+sub case($) { local $SIG{__WARN__} = \&carp;
+ $::_S_W_I_T_C_H->(@_); }
+
+# IMPLEMENT __
+
+my $placeholder = bless { arity=>1, impl=>sub{$_[1+$_[0]]} };
+
+sub __() { $placeholder }
+
+sub __arg($)
+{
+ my $index = $_[0]+1;
+ bless { arity=>0, impl=>sub{$_[$index]} };
+}
+
+sub hosub(&@)
+{
+ # WRITE THIS
+}
+
+sub call
+{
+ my ($self,@args) = @_;
+ return $self->{impl}->(0,@args);
+}
+
+sub meta_bop(&)
+{
+ my ($op) = @_;
+ sub
+ {
+ my ($left, $right, $reversed) = @_;
+ ($right,$left) = @_ if $reversed;
+
+ my $rop = ref $right eq 'Switch'
+ ? $right
+ : bless { arity=>0, impl=>sub{$right} };
+
+ my $lop = ref $left eq 'Switch'
+ ? $left
+ : bless { arity=>0, impl=>sub{$left} };
+
+ my $arity = $lop->{arity} + $rop->{arity};
+
+ return bless {
+ arity => $arity,
+ impl => sub { my $start = shift;
+ return $op->($lop->{impl}->($start,@_),
+ $rop->{impl}->($start+$lop->{arity},@_));
+ }
+ };
+ };
+}
+
+sub meta_uop(&)
+{
+ my ($op) = @_;
+ sub
+ {
+ my ($left) = @_;
+
+ my $lop = ref $left eq 'Switch'
+ ? $left
+ : bless { arity=>0, impl=>sub{$left} };
+
+ my $arity = $lop->{arity};
+
+ return bless {
+ arity => $arity,
+ impl => sub { $op->($lop->{impl}->(@_)) }
+ };
+ };
+}
+
+
+use overload
+ "+" => meta_bop {$_[0] + $_[1]},
+ "-" => meta_bop {$_[0] - $_[1]},
+ "*" => meta_bop {$_[0] * $_[1]},
+ "/" => meta_bop {$_[0] / $_[1]},
+ "%" => meta_bop {$_[0] % $_[1]},
+ "**" => meta_bop {$_[0] ** $_[1]},
+ "<<" => meta_bop {$_[0] << $_[1]},
+ ">>" => meta_bop {$_[0] >> $_[1]},
+ "x" => meta_bop {$_[0] x $_[1]},
+ "." => meta_bop {$_[0] . $_[1]},
+ "<" => meta_bop {$_[0] < $_[1]},
+ "<=" => meta_bop {$_[0] <= $_[1]},
+ ">" => meta_bop {$_[0] > $_[1]},
+ ">=" => meta_bop {$_[0] >= $_[1]},
+ "==" => meta_bop {$_[0] == $_[1]},
+ "!=" => meta_bop {$_[0] != $_[1]},
+ "<=>" => meta_bop {$_[0] <=> $_[1]},
+ "lt" => meta_bop {$_[0] lt $_[1]},
+ "le" => meta_bop {$_[0] le $_[1]},
+ "gt" => meta_bop {$_[0] gt $_[1]},
+ "ge" => meta_bop {$_[0] ge $_[1]},
+ "eq" => meta_bop {$_[0] eq $_[1]},
+ "ne" => meta_bop {$_[0] ne $_[1]},
+ "cmp" => meta_bop {$_[0] cmp $_[1]},
+ "\&" => meta_bop {$_[0] & $_[1]},
+ "^" => meta_bop {$_[0] ^ $_[1]},
+ "|" => meta_bop {$_[0] | $_[1]},
+ "atan2" => meta_bop {atan2 $_[0], $_[1]},
+
+ "neg" => meta_uop {-$_[0]},
+ "!" => meta_uop {!$_[0]},
+ "~" => meta_uop {~$_[0]},
+ "cos" => meta_uop {cos $_[0]},
+ "sin" => meta_uop {sin $_[0]},
+ "exp" => meta_uop {exp $_[0]},
+ "abs" => meta_uop {abs $_[0]},
+ "log" => meta_uop {log $_[0]},
+ "sqrt" => meta_uop {sqrt $_[0]},
+ "bool" => sub { croak "Can't use && or || in expression containing __" },
+
+ # "&()" => sub { $_[0]->{impl} },
+
+ # "||" => meta_bop {$_[0] || $_[1]},
+ # "&&" => meta_bop {$_[0] && $_[1]},
+ # fallback => 1,
+ ;
+1;
+
+__END__
+
+
+=head1 NAME
+
+Switch - A switch statement for Perl
+
+=head1 SYNOPSIS
+
+ use Switch;
+
+ switch ($val) {
+ case 1 { print "number 1" }
+ case "a" { print "string a" }
+ case [1..10,42] { print "number in list" }
+ case (\@array) { print "number in list" }
+ case /\w+/ { print "pattern" }
+ case qr/\w+/ { print "pattern" }
+ case (\%hash) { print "entry in hash" }
+ case (\&sub) { print "arg to subroutine" }
+ else { print "previous case not true" }
+ }
+
+=head1 BACKGROUND
+
+[Skip ahead to L<"DESCRIPTION"> if you don't care about the whys
+and wherefores of this control structure]
+
+In seeking to devise a "Swiss Army" case mechanism suitable for Perl,
+it is useful to generalize this notion of distributed conditional
+testing as far as possible. Specifically, the concept of "matching"
+between the switch value and the various case values need not be
+restricted to numeric (or string or referential) equality, as it is in other
+languages. Indeed, as Table 1 illustrates, Perl
+offers at least eighteen different ways in which two values could
+generate a match.
+
+ Table 1: Matching a switch value ($s) with a case value ($c)
+
+ Switch Case Type of Match Implied Matching Code
+ Value Value
+ ====== ===== ===================== =============
+
+ number same numeric or referential match if $s == $c;
+ or ref equality
+
+ object method result of method call match if $s->$c();
+ ref name match if defined $s->$c();
+ or ref
+
+ other other string equality match if $s eq $c;
+ non-ref non-ref
+ scalar scalar
+
+ string regexp pattern match match if $s =~ /$c/;
+
+ array scalar array entry existence match if 0<=$c && $c<@$s;
+ ref array entry definition match if defined $s->[$c];
+ array entry truth match if $s->[$c];
+
+ array array array intersection match if intersects(@$s, @$c);
+ ref ref (apply this table to
+ all pairs of elements
+ $s->[$i] and
+ $c->[$j])
+
+ array regexp array grep match if grep /$c/, @$s;
+ ref
+
+ hash scalar hash entry existence match if exists $s->{$c};
+ ref hash entry definition match if defined $s->{$c};
+ hash entry truth match if $s->{$c};
+
+ hash regexp hash grep match if grep /$c/, keys %$s;
+ ref
+
+ sub scalar return value defn match if defined $s->($c);
+ ref return value truth match if $s->($c);
+
+ sub array return value defn match if defined $s->(@$c);
+ ref ref return value truth match if $s->(@$c);
+
+
+In reality, Table 1 covers 31 alternatives, because only the equality and
+intersection tests are commutative; in all other cases, the roles of
+the C<$s> and C<$c> variables could be reversed to produce a
+different test. For example, instead of testing a single hash for
+the existence of a series of keys (C<match if exists $s-E<gt>{$c}>),
+one could test for the existence of a single key in a series of hashes
+(C<match if exists $c-E<gt>{$s}>).
+
+=head1 DESCRIPTION
+
+The Switch.pm module implements a generalized case mechanism that covers
+most (but not all) of the numerous possible combinations of switch and case
+values described above.
+
+The module augments the standard Perl syntax with two new control
+statements: C<switch> and C<case>. The C<switch> statement takes a
+single scalar argument of any type, specified in parentheses.
+C<switch> stores this value as the
+current switch value in a (localized) control variable.
+The value is followed by a block which may contain one or more
+Perl statements (including the C<case> statement described below).
+The block is unconditionally executed once the switch value has
+been cached.
+
+A C<case> statement takes a single scalar argument (in mandatory
+parentheses if it's a variable; otherwise the parens are optional) and
+selects the appropriate type of matching between that argument and the
+current switch value. The type of matching used is determined by the
+respective types of the switch value and the C<case> argument, as
+specified in Table 1. If the match is successful, the mandatory
+block associated with the C<case> statement is executed.
+
+In most other respects, the C<case> statement is semantically identical
+to an C<if> statement. For example, it can be followed by an C<else>
+clause, and can be used as a postfix statement qualifier.
+
+However, when a C<case> block has been executed control is automatically
+transferred to the statement after the immediately enclosing C<switch>
+block, rather than to the next statement within the block. In other
+words, the success of any C<case> statement prevents other cases in the
+same scope from executing. But see L<"Allowing fall-through"> below.
+
+Together these two new statements provide a fully generalized case
+mechanism:
+
+ use Switch;
+
+ # AND LATER...
+
+ %special = ( woohoo => 1, d'oh => 1 );
+
+ while (<>) {
+ chomp;
+ switch ($_) {
+ case (%special) { print "homer\n"; } # if $special{$_}
+ case /[a-z]/i { print "alpha\n"; } # if $_ =~ /a-z/i
+ case [1..9] { print "small num\n"; } # if $_ in [1..9]
+ case { $_[0] >= 10 } { print "big num\n"; } # if $_ >= 10
+ print "must be punctuation\n" case /\W/; # if $_ ~= /\W/
+ }
+ }
+
+Note that C<switch>es can be nested within C<case> (or any other) blocks,
+and a series of C<case> statements can try different types of matches
+-- hash membership, pattern match, array intersection, simple equality,
+etc. -- against the same switch value.
+
+The use of intersection tests against an array reference is particularly
+useful for aggregating integral cases:
+
+ sub classify_digit
+ {
+ switch ($_[0]) { case 0 { return 'zero' }
+ case [2,4,6,8] { return 'even' }
+ case [1,3,5,7,9] { return 'odd' }
+ case /[A-F]/i { return 'hex' }
+ }
+ }
+
+
+=head2 Allowing fall-through
+
+Fall-though (trying another case after one has already succeeded)
+is usually a Bad Idea in a switch statement. However, this
+is Perl, not a police state, so there I<is> a way to do it, if you must.
+
+If a C<case> block executes an untargeted C<next>, control is
+immediately transferred to the statement I<after> the C<case> statement
+(i.e. usually another case), rather than out of the surrounding
+C<switch> block.
+
+For example:
+
+ switch ($val) {
+ case 1 { handle_num_1(); next } # and try next case...
+ case "1" { handle_str_1(); next } # and try next case...
+ case [0..9] { handle_num_any(); } # and we're done
+ case /\d/ { handle_dig_any(); next } # and try next case...
+ case /.*/ { handle_str_any(); next } # and try next case...
+ }
+
+If $val held the number C<1>, the above C<switch> block would call the
+first three C<handle_...> subroutines, jumping to the next case test
+each time it encountered a C<next>. After the third C<case> block
+was executed, control would jump to the end of the enclosing
+C<switch> block.
+
+On the other hand, if $val held C<10>, then only the last two C<handle_...>
+subroutines would be called.
+
+Note that this mechanism allows the notion of I<conditional fall-through>.
+For example:
+
+ switch ($val) {
+ case [0..9] { handle_num_any(); next if $val < 7; }
+ case /\d/ { handle_dig_any(); }
+ }
+
+If an untargeted C<last> statement is executed in a case block, this
+immediately transfers control out of the enclosing C<switch> block
+(in other words, there is an implicit C<last> at the end of each
+normal C<case> block). Thus the previous example could also have been
+written:
+
+ switch ($val) {
+ case [0..9] { handle_num_any(); last if $val >= 7; next; }
+ case /\d/ { handle_dig_any(); }
+ }
+
+
+=head2 Automating fall-through
+
+In situations where case fall-through should be the norm, rather than an
+exception, an endless succession of terminal C<next>s is tedious and ugly.
+Hence, it is possible to reverse the default behaviour by specifying
+the string "fallthrough" when importing the module. For example, the
+following code is equivalent to the first example in L<"Allowing fall-through">:
+
+ use Switch 'fallthrough';
+
+ switch ($val) {
+ case 1 { handle_num_1(); }
+ case "1" { handle_str_1(); }
+ case [0..9] { handle_num_any(); last }
+ case /\d/ { handle_dig_any(); }
+ case /.*/ { handle_str_any(); }
+ }
+
+Note the explicit use of a C<last> to preserve the non-fall-through
+behaviour of the third case.
+
+
+
+=head2 Alternative syntax
+
+Perl 6 will provide a built-in switch statement with essentially the
+same semantics as those offered by Switch.pm, but with a different
+pair of keywords. In Perl 6 C<switch> will be spelled C<given>, and
+C<case> will be pronounced C<when>. In addition, the C<when> statement
+will not require switch or case values to be parenthesized.
+
+This future syntax is also (largely) available via the Switch.pm module, by
+importing it with the argument C<"Perl6">. For example:
+
+ use Switch 'Perl6';
+
+ given ($val) {
+ when 1 { handle_num_1(); }
+ when ($str1) { handle_str_1(); }
+ when [0..9] { handle_num_any(); last }
+ when /\d/ { handle_dig_any(); }
+ when /.*/ { handle_str_any(); }
+ default { handle anything else; }
+ }
+
+Note that scalars still need to be parenthesized, since they would be
+ambiguous in Perl 5.
+
+Note too that you can mix and match both syntaxes by importing the module
+with:
+
+ use Switch 'Perl5', 'Perl6';
+
+
+=head2 Higher-order Operations
+
+One situation in which C<switch> and C<case> do not provide a good
+substitute for a cascaded C<if>, is where a switch value needs to
+be tested against a series of conditions. For example:
+
+ sub beverage {
+ switch (shift) {
+ case { $_[0] < 10 } { return 'milk' }
+ case { $_[0] < 20 } { return 'coke' }
+ case { $_[0] < 30 } { return 'beer' }
+ case { $_[0] < 40 } { return 'wine' }
+ case { $_[0] < 50 } { return 'malt' }
+ case { $_[0] < 60 } { return 'Moet' }
+ else { return 'milk' }
+ }
+ }
+
+(This is equivalent to writing C<case (sub { $_[0] < 10 })>, etc.; C<$_[0]>
+is the argument to the anonymous subroutine.)
+
+The need to specify each condition as a subroutine block is tiresome. To
+overcome this, when importing Switch.pm, a special "placeholder"
+subroutine named C<__> [sic] may also be imported. This subroutine
+converts (almost) any expression in which it appears to a reference to a
+higher-order function. That is, the expression:
+
+ use Switch '__';
+
+ __ < 2
+
+is equivalent to:
+
+ sub { $_[0] < 2 }
+
+With C<__>, the previous ugly case statements can be rewritten:
+
+ case __ < 10 { return 'milk' }
+ case __ < 20 { return 'coke' }
+ case __ < 30 { return 'beer' }
+ case __ < 40 { return 'wine' }
+ case __ < 50 { return 'malt' }
+ case __ < 60 { return 'Moet' }
+ else { return 'milk' }
+
+The C<__> subroutine makes extensive use of operator overloading to
+perform its magic. All operations involving __ are overloaded to
+produce an anonymous subroutine that implements a lazy version
+of the original operation.
+
+The only problem is that operator overloading does not allow the
+boolean operators C<&&> and C<||> to be overloaded. So a case statement
+like this:
+
+ case 0 <= __ && __ < 10 { return 'digit' }
+
+doesn't act as expected, because when it is
+executed, it constructs two higher order subroutines
+and then treats the two resulting references as arguments to C<&&>:
+
+ sub { 0 <= $_[0] } && sub { $_[0] < 10 }
+
+This boolean expression is inevitably true, since both references are
+non-false. Fortunately, the overloaded C<'bool'> operator catches this
+situation and flags it as an error.
+
+=head1 DEPENDENCIES
+
+The module is implemented using Filter::Util::Call and Text::Balanced
+and requires both these modules to be installed.
+
+=head1 AUTHOR
+
+Damian Conway (damian@conway.org). This module is now maintained by Rafael
+Garcia-Suarez (rgarciasuarez@gmail.com) and more generally by the Perl 5
+Porters (perl5-porters@perl.org), as part of the Perl core.
+
+=head1 BUGS
+
+There are undoubtedly serious bugs lurking somewhere in code this funky :-)
+Bug reports and other feedback are most welcome.
+
+=head1 LIMITATIONS
+
+Due to the heuristic nature of Switch.pm's source parsing, the presence of
+regexes with embedded newlines that are specified with raw C</.../>
+delimiters and don't have a modifier C<//x> are indistinguishable from
+code chunks beginning with the division operator C</>. As a workaround
+you must use C<m/.../> or C<m?...?> for such patterns. Also, the presence
+of regexes specified with raw C<?...?> delimiters may cause mysterious
+errors. The workaround is to use C<m?...?> instead.
+
+Due to the way source filters work in Perl, you can't use Switch inside
+an string C<eval>.
+
+If your source file is longer then 1 million characters and you have a
+switch statement that crosses the 1 million (or 2 million, etc.)
+character boundary you will get mysterious errors. The workaround is to
+use smaller source files.
+
+=head1 COPYRIGHT
+
+ Copyright (c) 1997-2008, Damian Conway. All Rights Reserved.
+ This module is free software. It may be used, redistributed
+ and/or modified under the same terms as Perl itself.
diff --git a/Master/tlpkg/tlperl.straw/lib/Symbol.pm b/Master/tlpkg/tlperl.straw/lib/Symbol.pm
new file mode 100755
index 00000000000..1e408b59f71
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Symbol.pm
@@ -0,0 +1,170 @@
+package Symbol;
+
+=head1 NAME
+
+Symbol - manipulate Perl symbols and their names
+
+=head1 SYNOPSIS
+
+ use Symbol;
+
+ $sym = gensym;
+ open($sym, "filename");
+ $_ = <$sym>;
+ # etc.
+
+ ungensym $sym; # no effect
+
+ # replace *FOO{IO} handle but not $FOO, %FOO, etc.
+ *FOO = geniosym;
+
+ print qualify("x"), "\n"; # "main::x"
+ print qualify("x", "FOO"), "\n"; # "FOO::x"
+ print qualify("BAR::x"), "\n"; # "BAR::x"
+ print qualify("BAR::x", "FOO"), "\n"; # "BAR::x"
+ print qualify("STDOUT", "FOO"), "\n"; # "main::STDOUT" (global)
+ print qualify(\*x), "\n"; # returns \*x
+ print qualify(\*x, "FOO"), "\n"; # returns \*x
+
+ use strict refs;
+ print { qualify_to_ref $fh } "foo!\n";
+ $ref = qualify_to_ref $name, $pkg;
+
+ use Symbol qw(delete_package);
+ delete_package('Foo::Bar');
+ print "deleted\n" unless exists $Foo::{'Bar::'};
+
+=head1 DESCRIPTION
+
+C<Symbol::gensym> creates an anonymous glob and returns a reference
+to it. Such a glob reference can be used as a file or directory
+handle.
+
+For backward compatibility with older implementations that didn't
+support anonymous globs, C<Symbol::ungensym> is also provided.
+But it doesn't do anything.
+
+C<Symbol::geniosym> creates an anonymous IO handle. This can be
+assigned into an existing glob without affecting the non-IO portions
+of the glob.
+
+C<Symbol::qualify> turns unqualified symbol names into qualified
+variable names (e.g. "myvar" -E<gt> "MyPackage::myvar"). If it is given a
+second parameter, C<qualify> uses it as the default package;
+otherwise, it uses the package of its caller. Regardless, global
+variable names (e.g. "STDOUT", "ENV", "SIG") are always qualified with
+"main::".
+
+Qualification applies only to symbol names (strings). References are
+left unchanged under the assumption that they are glob references,
+which are qualified by their nature.
+
+C<Symbol::qualify_to_ref> is just like C<Symbol::qualify> except that it
+returns a glob ref rather than a symbol name, so you can use the result
+even if C<use strict 'refs'> is in effect.
+
+C<Symbol::delete_package> wipes out a whole package namespace. Note
+this routine is not exported by default--you may want to import it
+explicitly.
+
+=head1 BUGS
+
+C<Symbol::delete_package> is a bit too powerful. It undefines every symbol that
+lives in the specified package. Since perl, for performance reasons, does not
+perform a symbol table lookup each time a function is called or a global
+variable is accessed, some code that has already been loaded and that makes use
+of symbols in package C<Foo> may stop working after you delete C<Foo>, even if
+you reload the C<Foo> module afterwards.
+
+=cut
+
+BEGIN { require 5.005; }
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(gensym ungensym qualify qualify_to_ref);
+@EXPORT_OK = qw(delete_package geniosym);
+
+$VERSION = '1.07';
+
+my $genpkg = "Symbol::";
+my $genseq = 0;
+
+my %global = map {$_ => 1} qw(ARGV ARGVOUT ENV INC SIG STDERR STDIN STDOUT);
+
+#
+# Note that we never _copy_ the glob; we just make a ref to it.
+# If we did copy it, then SVf_FAKE would be set on the copy, and
+# glob-specific behaviors (e.g. C<*$ref = \&func>) wouldn't work.
+#
+sub gensym () {
+ my $name = "GEN" . $genseq++;
+ my $ref = \*{$genpkg . $name};
+ delete $$genpkg{$name};
+ $ref;
+}
+
+sub geniosym () {
+ my $sym = gensym();
+ # force the IO slot to be filled
+ select(select $sym);
+ *$sym{IO};
+}
+
+sub ungensym ($) {}
+
+sub qualify ($;$) {
+ my ($name) = @_;
+ if (!ref($name) && index($name, '::') == -1 && index($name, "'") == -1) {
+ my $pkg;
+ # Global names: special character, "^xyz", or other.
+ if ($name =~ /^(([^a-z])|(\^[a-z_]+))\z/i || $global{$name}) {
+ # RGS 2001-11-05 : translate leading ^X to control-char
+ $name =~ s/^\^([a-z_])/'qq(\c'.$1.')'/eei;
+ $pkg = "main";
+ }
+ else {
+ $pkg = (@_ > 1) ? $_[1] : caller;
+ }
+ $name = $pkg . "::" . $name;
+ }
+ $name;
+}
+
+sub qualify_to_ref ($;$) {
+ return \*{ qualify $_[0], @_ > 1 ? $_[1] : caller };
+}
+
+#
+# of Safe.pm lineage
+#
+sub delete_package ($) {
+ my $pkg = shift;
+
+ # expand to full symbol table name if needed
+
+ unless ($pkg =~ /^main::.*::$/) {
+ $pkg = "main$pkg" if $pkg =~ /^::/;
+ $pkg = "main::$pkg" unless $pkg =~ /^main::/;
+ $pkg .= '::' unless $pkg =~ /::$/;
+ }
+
+ my($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/;
+ my $stem_symtab = *{$stem}{HASH};
+ return unless defined $stem_symtab and exists $stem_symtab->{$leaf};
+
+
+ # free all the symbols in the package
+
+ my $leaf_symtab = *{$stem_symtab->{$leaf}}{HASH};
+ foreach my $name (keys %$leaf_symtab) {
+ undef *{$pkg . $name};
+ }
+
+ # delete the symbol table
+
+ %$leaf_symtab = ();
+ delete $stem_symtab->{$leaf};
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Test.pm b/Master/tlpkg/tlperl.straw/lib/Test.pm
new file mode 100755
index 00000000000..6ab54ab5601
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Test.pm
@@ -0,0 +1,954 @@
+
+require 5.004;
+package Test;
+
+use strict;
+
+use Carp;
+use vars (qw($VERSION @ISA @EXPORT @EXPORT_OK $ntest $TestLevel), #public-ish
+ qw($TESTOUT $TESTERR %Program_Lines $told_about_diff
+ $ONFAIL %todo %history $planned @FAILDETAIL) #private-ish
+ );
+
+# In case a test is run in a persistent environment.
+sub _reset_globals {
+ %todo = ();
+ %history = ();
+ @FAILDETAIL = ();
+ $ntest = 1;
+ $TestLevel = 0; # how many extra stack frames to skip
+ $planned = 0;
+}
+
+$VERSION = '1.25_02';
+require Exporter;
+@ISA=('Exporter');
+
+@EXPORT = qw(&plan &ok &skip);
+@EXPORT_OK = qw($ntest $TESTOUT $TESTERR);
+
+$|=1;
+$TESTOUT = *STDOUT{IO};
+$TESTERR = *STDERR{IO};
+
+# Use of this variable is strongly discouraged. It is set mainly to
+# help test coverage analyzers know which test is running.
+$ENV{REGRESSION_TEST} = $0;
+
+
+=head1 NAME
+
+Test - provides a simple framework for writing test scripts
+
+=head1 SYNOPSIS
+
+ use strict;
+ use Test;
+
+ # use a BEGIN block so we print our plan before MyModule is loaded
+ BEGIN { plan tests => 14, todo => [3,4] }
+
+ # load your module...
+ use MyModule;
+
+ # Helpful notes. All note-lines must start with a "#".
+ print "# I'm testing MyModule version $MyModule::VERSION\n";
+
+ ok(0); # failure
+ ok(1); # success
+
+ ok(0); # ok, expected failure (see todo list, above)
+ ok(1); # surprise success!
+
+ ok(0,1); # failure: '0' ne '1'
+ ok('broke','fixed'); # failure: 'broke' ne 'fixed'
+ ok('fixed','fixed'); # success: 'fixed' eq 'fixed'
+ ok('fixed',qr/x/); # success: 'fixed' =~ qr/x/
+
+ ok(sub { 1+1 }, 2); # success: '2' eq '2'
+ ok(sub { 1+1 }, 3); # failure: '2' ne '3'
+
+ my @list = (0,0);
+ ok @list, 3, "\@list=".join(',',@list); #extra notes
+ ok 'segmentation fault', '/(?i)success/'; #regex match
+
+ skip(
+ $^O =~ m/MSWin/ ? "Skip if MSWin" : 0, # whether to skip
+ $foo, $bar # arguments just like for ok(...)
+ );
+ skip(
+ $^O =~ m/MSWin/ ? 0 : "Skip unless MSWin", # whether to skip
+ $foo, $bar # arguments just like for ok(...)
+ );
+
+=head1 DESCRIPTION
+
+This module simplifies the task of writing test files for Perl modules,
+such that their output is in the format that
+L<Test::Harness|Test::Harness> expects to see.
+
+=head1 QUICK START GUIDE
+
+To write a test for your new (and probably not even done) module, create
+a new file called F<t/test.t> (in a new F<t> directory). If you have
+multiple test files, to test the "foo", "bar", and "baz" feature sets,
+then feel free to call your files F<t/foo.t>, F<t/bar.t>, and
+F<t/baz.t>
+
+=head2 Functions
+
+This module defines three public functions, C<plan(...)>, C<ok(...)>,
+and C<skip(...)>. By default, all three are exported by
+the C<use Test;> statement.
+
+=over 4
+
+=item C<plan(...)>
+
+ BEGIN { plan %theplan; }
+
+This should be the first thing you call in your test script. It
+declares your testing plan, how many there will be, if any of them
+should be allowed to fail, and so on.
+
+Typical usage is just:
+
+ use Test;
+ BEGIN { plan tests => 23 }
+
+These are the things that you can put in the parameters to plan:
+
+=over
+
+=item C<tests =E<gt> I<number>>
+
+The number of tests in your script.
+This means all ok() and skip() calls.
+
+=item C<todo =E<gt> [I<1,5,14>]>
+
+A reference to a list of tests which are allowed to fail.
+See L</TODO TESTS>.
+
+=item C<onfail =E<gt> sub { ... }>
+
+=item C<onfail =E<gt> \&some_sub>
+
+A subroutine reference to be run at the end of the test script, if
+any of the tests fail. See L</ONFAIL>.
+
+=back
+
+You must call C<plan(...)> once and only once. You should call it
+in a C<BEGIN {...}> block, like so:
+
+ BEGIN { plan tests => 23 }
+
+=cut
+
+sub plan {
+ croak "Test::plan(%args): odd number of arguments" if @_ & 1;
+ croak "Test::plan(): should not be called more than once" if $planned;
+
+ local($\, $,); # guard against -l and other things that screw with
+ # print
+
+ _reset_globals();
+
+ _read_program( (caller)[1] );
+
+ my $max=0;
+ while (@_) {
+ my ($k,$v) = splice(@_, 0, 2);
+ if ($k =~ /^test(s)?$/) { $max = $v; }
+ elsif ($k eq 'todo' or
+ $k eq 'failok') { for (@$v) { $todo{$_}=1; }; }
+ elsif ($k eq 'onfail') {
+ ref $v eq 'CODE' or croak "Test::plan(onfail => $v): must be CODE";
+ $ONFAIL = $v;
+ }
+ else { carp "Test::plan(): skipping unrecognized directive '$k'" }
+ }
+ my @todo = sort { $a <=> $b } keys %todo;
+ if (@todo) {
+ print $TESTOUT "1..$max todo ".join(' ', @todo).";\n";
+ } else {
+ print $TESTOUT "1..$max\n";
+ }
+ ++$planned;
+ print $TESTOUT "# Running under perl version $] for $^O",
+ (chr(65) eq 'A') ? "\n" : " in a non-ASCII world\n";
+
+ print $TESTOUT "# Win32::BuildNumber ", &Win32::BuildNumber(), "\n"
+ if defined(&Win32::BuildNumber) and defined &Win32::BuildNumber();
+
+ print $TESTOUT "# MacPerl version $MacPerl::Version\n"
+ if defined $MacPerl::Version;
+
+ printf $TESTOUT
+ "# Current time local: %s\n# Current time GMT: %s\n",
+ scalar(localtime($^T)), scalar(gmtime($^T));
+
+ print $TESTOUT "# Using Test.pm version $VERSION\n";
+
+ # Retval never used:
+ return undef;
+}
+
+sub _read_program {
+ my($file) = shift;
+ return unless defined $file and length $file
+ and -e $file and -f _ and -r _;
+ open(SOURCEFILE, "<$file") || return;
+ $Program_Lines{$file} = [<SOURCEFILE>];
+ close(SOURCEFILE);
+
+ foreach my $x (@{$Program_Lines{$file}})
+ { $x =~ tr/\cm\cj\n\r//d }
+
+ unshift @{$Program_Lines{$file}}, '';
+ return 1;
+}
+
+=begin _private
+
+=item B<_to_value>
+
+ my $value = _to_value($input);
+
+Converts an C<ok> parameter to its value. Typically this just means
+running it, if it's a code reference. You should run all inputted
+values through this.
+
+=cut
+
+sub _to_value {
+ my ($v) = @_;
+ return ref $v eq 'CODE' ? $v->() : $v;
+}
+
+sub _quote {
+ my $str = $_[0];
+ return "<UNDEF>" unless defined $str;
+ $str =~ s/\\/\\\\/g;
+ $str =~ s/"/\\"/g;
+ $str =~ s/\a/\\a/g;
+ $str =~ s/[\b]/\\b/g;
+ $str =~ s/\e/\\e/g;
+ $str =~ s/\f/\\f/g;
+ $str =~ s/\n/\\n/g;
+ $str =~ s/\r/\\r/g;
+ $str =~ s/\t/\\t/g;
+ $str =~ s/([\0-\037])(?!\d)/sprintf('\\%o',ord($1))/eg;
+ $str =~ s/([\0-\037\177-\377])/sprintf('\\x%02X',ord($1))/eg;
+ $str =~ s/([^\0-\176])/sprintf('\\x{%X}',ord($1))/eg;
+ #if( $_[1] ) {
+ # substr( $str , 218-3 ) = "..."
+ # if length($str) >= 218 and !$ENV{PERL_TEST_NO_TRUNC};
+ #}
+ return qq("$str");
+}
+
+
+=end _private
+
+=item C<ok(...)>
+
+ ok(1 + 1 == 2);
+ ok($have, $expect);
+ ok($have, $expect, $diagnostics);
+
+This function is the reason for C<Test>'s existence. It's
+the basic function that
+handles printing "C<ok>" or "C<not ok>", along with the
+current test number. (That's what C<Test::Harness> wants to see.)
+
+In its most basic usage, C<ok(...)> simply takes a single scalar
+expression. If its value is true, the test passes; if false,
+the test fails. Examples:
+
+ # Examples of ok(scalar)
+
+ ok( 1 + 1 == 2 ); # ok if 1 + 1 == 2
+ ok( $foo =~ /bar/ ); # ok if $foo contains 'bar'
+ ok( baz($x + $y) eq 'Armondo' ); # ok if baz($x + $y) returns
+ # 'Armondo'
+ ok( @a == @b ); # ok if @a and @b are the same length
+
+The expression is evaluated in scalar context. So the following will
+work:
+
+ ok( @stuff ); # ok if @stuff has any elements
+ ok( !grep !defined $_, @stuff ); # ok if everything in @stuff is
+ # defined.
+
+A special case is if the expression is a subroutine reference (in either
+C<sub {...}> syntax or C<\&foo> syntax). In
+that case, it is executed and its value (true or false) determines if
+the test passes or fails. For example,
+
+ ok( sub { # See whether sleep works at least passably
+ my $start_time = time;
+ sleep 5;
+ time() - $start_time >= 4
+ });
+
+In its two-argument form, C<ok(I<arg1>, I<arg2>)> compares the two
+scalar values to see if they match. They match if both are undefined,
+or if I<arg2> is a regex that matches I<arg1>, or if they compare equal
+with C<eq>.
+
+ # Example of ok(scalar, scalar)
+
+ ok( "this", "that" ); # not ok, 'this' ne 'that'
+ ok( "", undef ); # not ok, "" is defined
+
+The second argument is considered a regex if it is either a regex
+object or a string that looks like a regex. Regex objects are
+constructed with the qr// operator in recent versions of perl. A
+string is considered to look like a regex if its first and last
+characters are "/", or if the first character is "m"
+and its second and last characters are both the
+same non-alphanumeric non-whitespace character. These regexp
+
+Regex examples:
+
+ ok( 'JaffO', '/Jaff/' ); # ok, 'JaffO' =~ /Jaff/
+ ok( 'JaffO', 'm|Jaff|' ); # ok, 'JaffO' =~ m|Jaff|
+ ok( 'JaffO', qr/Jaff/ ); # ok, 'JaffO' =~ qr/Jaff/;
+ ok( 'JaffO', '/(?i)jaff/ ); # ok, 'JaffO' =~ /jaff/i;
+
+If either (or both!) is a subroutine reference, it is run and used
+as the value for comparing. For example:
+
+ ok sub {
+ open(OUT, ">x.dat") || die $!;
+ print OUT "\x{e000}";
+ close OUT;
+ my $bytecount = -s 'x.dat';
+ unlink 'x.dat' or warn "Can't unlink : $!";
+ return $bytecount;
+ },
+ 4
+ ;
+
+The above test passes two values to C<ok(arg1, arg2)> -- the first
+a coderef, and the second is the number 4. Before C<ok> compares them,
+it calls the coderef, and uses its return value as the real value of
+this parameter. Assuming that C<$bytecount> returns 4, C<ok> ends up
+testing C<4 eq 4>. Since that's true, this test passes.
+
+Finally, you can append an optional third argument, in
+C<ok(I<arg1>,I<arg2>, I<note>)>, where I<note> is a string value that
+will be printed if the test fails. This should be some useful
+information about the test, pertaining to why it failed, and/or
+a description of the test. For example:
+
+ ok( grep($_ eq 'something unique', @stuff), 1,
+ "Something that should be unique isn't!\n".
+ '@stuff = '.join ', ', @stuff
+ );
+
+Unfortunately, a note cannot be used with the single argument
+style of C<ok()>. That is, if you try C<ok(I<arg1>, I<note>)>, then
+C<Test> will interpret this as C<ok(I<arg1>, I<arg2>)>, and probably
+end up testing C<I<arg1> eq I<arg2>> -- and that's not what you want!
+
+All of the above special cases can occasionally cause some
+problems. See L</BUGS and CAVEATS>.
+
+=cut
+
+# A past maintainer of this module said:
+# <<ok(...)'s special handling of subroutine references is an unfortunate
+# "feature" that can't be removed due to compatibility.>>
+#
+
+sub ok ($;$$) {
+ croak "ok: plan before you test!" if !$planned;
+
+ local($\,$,); # guard against -l and other things that screw with
+ # print
+
+ my ($pkg,$file,$line) = caller($TestLevel);
+ my $repetition = ++$history{"$file:$line"};
+ my $context = ("$file at line $line".
+ ($repetition > 1 ? " fail \#$repetition" : ''));
+
+ # Are we comparing two values?
+ my $compare = 0;
+
+ my $ok=0;
+ my $result = _to_value(shift);
+ my ($expected, $isregex, $regex);
+ if (@_ == 0) {
+ $ok = $result;
+ } else {
+ $compare = 1;
+ $expected = _to_value(shift);
+ if (!defined $expected) {
+ $ok = !defined $result;
+ } elsif (!defined $result) {
+ $ok = 0;
+ } elsif (ref($expected) eq 'Regexp') {
+ $ok = $result =~ /$expected/;
+ $regex = $expected;
+ } elsif (($regex) = ($expected =~ m,^ / (.+) / $,sx) or
+ (undef, $regex) = ($expected =~ m,^ m([^\w\s]) (.+) \1 $,sx)) {
+ $ok = $result =~ /$regex/;
+ } else {
+ $ok = $result eq $expected;
+ }
+ }
+ my $todo = $todo{$ntest};
+ if ($todo and $ok) {
+ $context .= ' TODO?!' if $todo;
+ print $TESTOUT "ok $ntest # ($context)\n";
+ } else {
+ # Issuing two seperate prints() causes problems on VMS.
+ if (!$ok) {
+ print $TESTOUT "not ok $ntest\n";
+ }
+ else {
+ print $TESTOUT "ok $ntest\n";
+ }
+
+ $ok or _complain($result, $expected,
+ {
+ 'repetition' => $repetition, 'package' => $pkg,
+ 'result' => $result, 'todo' => $todo,
+ 'file' => $file, 'line' => $line,
+ 'context' => $context, 'compare' => $compare,
+ @_ ? ('diagnostic' => _to_value(shift)) : (),
+ });
+
+ }
+ ++ $ntest;
+ $ok;
+}
+
+
+sub _complain {
+ my($result, $expected, $detail) = @_;
+ $$detail{expected} = $expected if defined $expected;
+
+ # Get the user's diagnostic, protecting against multi-line
+ # diagnostics.
+ my $diag = $$detail{diagnostic};
+ $diag =~ s/\n/\n#/g if defined $diag;
+
+ $$detail{context} .= ' *TODO*' if $$detail{todo};
+ if (!$$detail{compare}) {
+ if (!$diag) {
+ print $TESTERR "# Failed test $ntest in $$detail{context}\n";
+ } else {
+ print $TESTERR "# Failed test $ntest in $$detail{context}: $diag\n";
+ }
+ } else {
+ my $prefix = "Test $ntest";
+
+ print $TESTERR "# $prefix got: " . _quote($result) .
+ " ($$detail{context})\n";
+ $prefix = ' ' x (length($prefix) - 5);
+ my $expected_quoted = (defined $$detail{regex})
+ ? 'qr{'.($$detail{regex}).'}' : _quote($expected);
+
+ print $TESTERR "# $prefix Expected: $expected_quoted",
+ $diag ? " ($diag)" : (), "\n";
+
+ _diff_complain( $result, $expected, $detail, $prefix )
+ if defined($expected) and 2 < ($expected =~ tr/\n//);
+ }
+
+ if(defined $Program_Lines{ $$detail{file} }[ $$detail{line} ]) {
+ print $TESTERR
+ "# $$detail{file} line $$detail{line} is: $Program_Lines{ $$detail{file} }[ $$detail{line} ]\n"
+ if $Program_Lines{ $$detail{file} }[ $$detail{line} ]
+ =~ m/[^\s\#\(\)\{\}\[\]\;]/; # Otherwise it's uninformative
+
+ undef $Program_Lines{ $$detail{file} }[ $$detail{line} ];
+ # So we won't repeat it.
+ }
+
+ push @FAILDETAIL, $detail;
+ return;
+}
+
+
+
+sub _diff_complain {
+ my($result, $expected, $detail, $prefix) = @_;
+ return _diff_complain_external(@_) if $ENV{PERL_TEST_DIFF};
+ return _diff_complain_algdiff(@_)
+ if eval { require Algorithm::Diff; Algorithm::Diff->VERSION(1.15); 1; };
+
+ $told_about_diff++ or print $TESTERR <<"EOT";
+# $prefix (Install the Algorithm::Diff module to have differences in multiline
+# $prefix output explained. You might also set the PERL_TEST_DIFF environment
+# $prefix variable to run a diff program on the output.)
+EOT
+ ;
+ return;
+}
+
+
+
+sub _diff_complain_external {
+ my($result, $expected, $detail, $prefix) = @_;
+ my $diff = $ENV{PERL_TEST_DIFF} || die "WHAAAA?";
+
+ require File::Temp;
+ my($got_fh, $got_filename) = File::Temp::tempfile("test-got-XXXXX");
+ my($exp_fh, $exp_filename) = File::Temp::tempfile("test-exp-XXXXX");
+ unless ($got_fh && $exp_fh) {
+ warn "Can't get tempfiles";
+ return;
+ }
+
+ print $got_fh $result;
+ print $exp_fh $expected;
+ if (close($got_fh) && close($exp_fh)) {
+ my $diff_cmd = "$diff $exp_filename $got_filename";
+ print $TESTERR "#\n# $prefix $diff_cmd\n";
+ if (open(DIFF, "$diff_cmd |")) {
+ local $_;
+ while (<DIFF>) {
+ print $TESTERR "# $prefix $_";
+ }
+ close(DIFF);
+ }
+ else {
+ warn "Can't run diff: $!";
+ }
+ } else {
+ warn "Can't write to tempfiles: $!";
+ }
+ unlink($got_filename);
+ unlink($exp_filename);
+ return;
+}
+
+
+
+sub _diff_complain_algdiff {
+ my($result, $expected, $detail, $prefix) = @_;
+
+ my @got = split(/^/, $result);
+ my @exp = split(/^/, $expected);
+
+ my $diff_kind;
+ my @diff_lines;
+
+ my $diff_flush = sub {
+ return unless $diff_kind;
+
+ my $count_lines = @diff_lines;
+ my $s = $count_lines == 1 ? "" : "s";
+ my $first_line = $diff_lines[0][0] + 1;
+
+ print $TESTERR "# $prefix ";
+ if ($diff_kind eq "GOT") {
+ print $TESTERR "Got $count_lines extra line$s at line $first_line:\n";
+ for my $i (@diff_lines) {
+ print $TESTERR "# $prefix + " . _quote($got[$i->[0]]) . "\n";
+ }
+ } elsif ($diff_kind eq "EXP") {
+ if ($count_lines > 1) {
+ my $last_line = $diff_lines[-1][0] + 1;
+ print $TESTERR "Lines $first_line-$last_line are";
+ }
+ else {
+ print $TESTERR "Line $first_line is";
+ }
+ print $TESTERR " missing:\n";
+ for my $i (@diff_lines) {
+ print $TESTERR "# $prefix - " . _quote($exp[$i->[1]]) . "\n";
+ }
+ } elsif ($diff_kind eq "CH") {
+ if ($count_lines > 1) {
+ my $last_line = $diff_lines[-1][0] + 1;
+ print $TESTERR "Lines $first_line-$last_line are";
+ }
+ else {
+ print $TESTERR "Line $first_line is";
+ }
+ print $TESTERR " changed:\n";
+ for my $i (@diff_lines) {
+ print $TESTERR "# $prefix - " . _quote($exp[$i->[1]]) . "\n";
+ print $TESTERR "# $prefix + " . _quote($got[$i->[0]]) . "\n";
+ }
+ }
+
+ # reset
+ $diff_kind = undef;
+ @diff_lines = ();
+ };
+
+ my $diff_collect = sub {
+ my $kind = shift;
+ &$diff_flush() if $diff_kind && $diff_kind ne $kind;
+ $diff_kind = $kind;
+ push(@diff_lines, [@_]);
+ };
+
+
+ Algorithm::Diff::traverse_balanced(
+ \@got, \@exp,
+ {
+ DISCARD_A => sub { &$diff_collect("GOT", @_) },
+ DISCARD_B => sub { &$diff_collect("EXP", @_) },
+ CHANGE => sub { &$diff_collect("CH", @_) },
+ MATCH => sub { &$diff_flush() },
+ },
+ );
+ &$diff_flush();
+
+ return;
+}
+
+
+
+
+#~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~
+
+
+=item C<skip(I<skip_if_true>, I<args...>)>
+
+This is used for tests that under some conditions can be skipped. It's
+basically equivalent to:
+
+ if( $skip_if_true ) {
+ ok(1);
+ } else {
+ ok( args... );
+ }
+
+...except that the C<ok(1)> emits not just "C<ok I<testnum>>" but
+actually "C<ok I<testnum> # I<skip_if_true_value>>".
+
+The arguments after the I<skip_if_true> are what is fed to C<ok(...)> if
+this test isn't skipped.
+
+Example usage:
+
+ my $if_MSWin =
+ $^O =~ m/MSWin/ ? 'Skip if under MSWin' : '';
+
+ # A test to be skipped if under MSWin (i.e., run except under MSWin)
+ skip($if_MSWin, thing($foo), thing($bar) );
+
+Or, going the other way:
+
+ my $unless_MSWin =
+ $^O =~ m/MSWin/ ? '' : 'Skip unless under MSWin';
+
+ # A test to be skipped unless under MSWin (i.e., run only under MSWin)
+ skip($unless_MSWin, thing($foo), thing($bar) );
+
+The tricky thing to remember is that the first parameter is true if
+you want to I<skip> the test, not I<run> it; and it also doubles as a
+note about why it's being skipped. So in the first codeblock above, read
+the code as "skip if MSWin -- (otherwise) test whether C<thing($foo)> is
+C<thing($bar)>" or for the second case, "skip unless MSWin...".
+
+Also, when your I<skip_if_reason> string is true, it really should (for
+backwards compatibility with older Test.pm versions) start with the
+string "Skip", as shown in the above examples.
+
+Note that in the above cases, C<thing($foo)> and C<thing($bar)>
+I<are> evaluated -- but as long as the C<skip_if_true> is true,
+then we C<skip(...)> just tosses out their value (i.e., not
+bothering to treat them like values to C<ok(...)>. But if
+you need to I<not> eval the arguments when skipping the
+test, use
+this format:
+
+ skip( $unless_MSWin,
+ sub {
+ # This code returns true if the test passes.
+ # (But it doesn't even get called if the test is skipped.)
+ thing($foo) eq thing($bar)
+ }
+ );
+
+or even this, which is basically equivalent:
+
+ skip( $unless_MSWin,
+ sub { thing($foo) }, sub { thing($bar) }
+ );
+
+That is, both are like this:
+
+ if( $unless_MSWin ) {
+ ok(1); # but it actually appends "# $unless_MSWin"
+ # so that Test::Harness can tell it's a skip
+ } else {
+ # Not skipping, so actually call and evaluate...
+ ok( sub { thing($foo) }, sub { thing($bar) } );
+ }
+
+=cut
+
+sub skip ($;$$$) {
+ local($\, $,); # guard against -l and other things that screw with
+ # print
+
+ my $whyskip = _to_value(shift);
+ if (!@_ or $whyskip) {
+ $whyskip = '' if $whyskip =~ m/^\d+$/;
+ $whyskip =~ s/^[Ss]kip(?:\s+|$)//; # backwards compatibility, old
+ # versions required the reason
+ # to start with 'skip'
+ # We print in one shot for VMSy reasons.
+ my $ok = "ok $ntest # skip";
+ $ok .= " $whyskip" if length $whyskip;
+ $ok .= "\n";
+ print $TESTOUT $ok;
+ ++ $ntest;
+ return 1;
+ } else {
+ # backwards compatibility (I think). skip() used to be
+ # called like ok(), which is weird. I haven't decided what to do with
+ # this yet.
+# warn <<WARN if $^W;
+#This looks like a skip() using the very old interface. Please upgrade to
+#the documented interface as this has been deprecated.
+#WARN
+
+ local($TestLevel) = $TestLevel+1; #to ignore this stack frame
+ return &ok(@_);
+ }
+}
+
+=back
+
+=cut
+
+END {
+ $ONFAIL->(\@FAILDETAIL) if @FAILDETAIL && $ONFAIL;
+}
+
+1;
+__END__
+
+=head1 TEST TYPES
+
+=over 4
+
+=item * NORMAL TESTS
+
+These tests are expected to succeed. Usually, most or all of your tests
+are in this category. If a normal test doesn't succeed, then that
+means that something is I<wrong>.
+
+=item * SKIPPED TESTS
+
+The C<skip(...)> function is for tests that might or might not be
+possible to run, depending
+on the availability of platform-specific features. The first argument
+should evaluate to true (think "yes, please skip") if the required
+feature is I<not> available. After the first argument, C<skip(...)> works
+exactly the same way as C<ok(...)> does.
+
+=item * TODO TESTS
+
+TODO tests are designed for maintaining an B<executable TODO list>.
+These tests are I<expected to fail.> If a TODO test does succeed,
+then the feature in question shouldn't be on the TODO list, now
+should it?
+
+Packages should NOT be released with succeeding TODO tests. As soon
+as a TODO test starts working, it should be promoted to a normal test,
+and the newly working feature should be documented in the release
+notes or in the change log.
+
+=back
+
+=head1 ONFAIL
+
+ BEGIN { plan test => 4, onfail => sub { warn "CALL 911!" } }
+
+Although test failures should be enough, extra diagnostics can be
+triggered at the end of a test run. C<onfail> is passed an array ref
+of hash refs that describe each test failure. Each hash will contain
+at least the following fields: C<package>, C<repetition>, and
+C<result>. (You shouldn't rely on any other fields being present.) If the test
+had an expected value or a diagnostic (or "note") string, these will also be
+included.
+
+The I<optional> C<onfail> hook might be used simply to print out the
+version of your package and/or how to report problems. It might also
+be used to generate extremely sophisticated diagnostics for a
+particularly bizarre test failure. However it's not a panacea. Core
+dumps or other unrecoverable errors prevent the C<onfail> hook from
+running. (It is run inside an C<END> block.) Besides, C<onfail> is
+probably over-kill in most cases. (Your test code should be simpler
+than the code it is testing, yes?)
+
+
+=head1 BUGS and CAVEATS
+
+=over
+
+=item *
+
+C<ok(...)>'s special handing of strings which look like they might be
+regexes can also cause unexpected behavior. An innocent:
+
+ ok( $fileglob, '/path/to/some/*stuff/' );
+
+will fail, since Test.pm considers the second argument to be a regex!
+The best bet is to use the one-argument form:
+
+ ok( $fileglob eq '/path/to/some/*stuff/' );
+
+=item *
+
+C<ok(...)>'s use of string C<eq> can sometimes cause odd problems
+when comparing
+numbers, especially if you're casting a string to a number:
+
+ $foo = "1.0";
+ ok( $foo, 1 ); # not ok, "1.0" ne 1
+
+Your best bet is to use the single argument form:
+
+ ok( $foo == 1 ); # ok "1.0" == 1
+
+=item *
+
+As you may have inferred from the above documentation and examples,
+C<ok>'s prototype is C<($;$$)> (and, incidentally, C<skip>'s is
+C<($;$$$)>). This means, for example, that you can do C<ok @foo, @bar>
+to compare the I<size> of the two arrays. But don't be fooled into
+thinking that C<ok @foo, @bar> means a comparison of the contents of two
+arrays -- you're comparing I<just> the number of elements of each. It's
+so easy to make that mistake in reading C<ok @foo, @bar> that you might
+want to be very explicit about it, and instead write C<ok scalar(@foo),
+scalar(@bar)>.
+
+=item *
+
+This almost definitely doesn't do what you expect:
+
+ ok $thingy->can('some_method');
+
+Why? Because C<can> returns a coderef to mean "yes it can (and the
+method is this...)", and then C<ok> sees a coderef and thinks you're
+passing a function that you want it to call and consider the truth of
+the result of! I.e., just like:
+
+ ok $thingy->can('some_method')->();
+
+What you probably want instead is this:
+
+ ok $thingy->can('some_method') && 1;
+
+If the C<can> returns false, then that is passed to C<ok>. If it
+returns true, then the larger expression S<< C<<
+$thingy->can('some_method') && 1 >> >> returns 1, which C<ok> sees as
+a simple signal of success, as you would expect.
+
+
+=item *
+
+The syntax for C<skip> is about the only way it can be, but it's still
+quite confusing. Just start with the above examples and you'll
+be okay.
+
+Moreover, users may expect this:
+
+ skip $unless_mswin, foo($bar), baz($quux);
+
+to not evaluate C<foo($bar)> and C<baz($quux)> when the test is being
+skipped. But in reality, they I<are> evaluated, but C<skip> just won't
+bother comparing them if C<$unless_mswin> is true.
+
+You could do this:
+
+ skip $unless_mswin, sub{foo($bar)}, sub{baz($quux)};
+
+But that's not terribly pretty. You may find it simpler or clearer in
+the long run to just do things like this:
+
+ if( $^O =~ m/MSWin/ ) {
+ print "# Yay, we're under $^O\n";
+ ok foo($bar), baz($quux);
+ ok thing($whatever), baz($stuff);
+ ok blorp($quux, $whatever);
+ ok foo($barzbarz), thang($quux);
+ } else {
+ print "# Feh, we're under $^O. Watch me skip some tests...\n";
+ for(1 .. 4) { skip "Skip unless under MSWin" }
+ }
+
+But be quite sure that C<ok> is called exactly as many times in the
+first block as C<skip> is called in the second block.
+
+=back
+
+
+=head1 ENVIRONMENT
+
+If C<PERL_TEST_DIFF> environment variable is set, it will be used as a
+command for comparing unexpected multiline results. If you have GNU
+diff installed, you might want to set C<PERL_TEST_DIFF> to C<diff -u>.
+If you don't have a suitable program, you might install the
+C<Text::Diff> module and then set C<PERL_TEST_DIFF> to be C<perl
+-MText::Diff -e 'print diff(@ARGV)'>. If C<PERL_TEST_DIFF> isn't set
+but the C<Algorithm::Diff> module is available, then it will be used
+to show the differences in multiline results.
+
+=for comment
+If C<PERL_TEST_NO_TRUNC> is set, then the initial "Got 'something' but
+expected 'something_else'" readings for long multiline output values aren't
+truncated at about the 230th column, as they normally could be in some
+cases. Normally you won't need to use this, unless you were carefully
+parsing the output of your test programs.
+
+
+=head1 NOTE
+
+A past developer of this module once said that it was no longer being
+actively developed. However, rumors of its demise were greatly
+exaggerated. Feedback and suggestions are quite welcome.
+
+Be aware that the main value of this module is its simplicity. Note
+that there are already more ambitious modules out there, such as
+L<Test::More> and L<Test::Unit>.
+
+Some earlier versions of this module had docs with some confusing
+typos in the description of C<skip(...)>.
+
+
+=head1 SEE ALSO
+
+L<Test::Harness>
+
+L<Test::Simple>, L<Test::More>, L<Devel::Cover>
+
+L<Test::Builder> for building your own testing library.
+
+L<Test::Unit> is an interesting XUnit-style testing library.
+
+L<Test::Inline> and L<SelfTest> let you embed tests in code.
+
+
+=head1 AUTHOR
+
+Copyright (c) 1998-2000 Joshua Nathaniel Pritikin.
+
+Copyright (c) 2001-2002 Michael G. Schwern.
+
+Copyright (c) 2002-2004 Sean M. Burke.
+
+Current maintainer: Jesse Vincent. E<lt>jesse@bestpractical.comE<gt>
+
+This package is free software and is provided "as is" without express
+or implied warranty. It may be used, redistributed and/or modified
+under the same terms as Perl itself.
+
+=cut
+
+# "Your mistake was a hidden intention."
+# -- /Oblique Strategies/, Brian Eno and Peter Schmidt
diff --git a/Master/tlpkg/tlperl.straw/lib/Text/Abbrev.pm b/Master/tlpkg/tlperl.straw/lib/Text/Abbrev.pm
new file mode 100755
index 00000000000..c6be63bcc60
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Text/Abbrev.pm
@@ -0,0 +1,84 @@
+package Text::Abbrev;
+require 5.005; # Probably works on earlier versions too.
+require Exporter;
+
+our $VERSION = '1.01';
+
+=head1 NAME
+
+abbrev - create an abbreviation table from a list
+
+=head1 SYNOPSIS
+
+ use Text::Abbrev;
+ abbrev $hashref, LIST
+
+
+=head1 DESCRIPTION
+
+Stores all unambiguous truncations of each element of LIST
+as keys in the associative array referenced by C<$hashref>.
+The values are the original list elements.
+
+=head1 EXAMPLE
+
+ $hashref = abbrev qw(list edit send abort gripe);
+
+ %hash = abbrev qw(list edit send abort gripe);
+
+ abbrev $hashref, qw(list edit send abort gripe);
+
+ abbrev(*hash, qw(list edit send abort gripe));
+
+=cut
+
+@ISA = qw(Exporter);
+@EXPORT = qw(abbrev);
+
+# Usage:
+# abbrev \%foo, LIST;
+# ...
+# $long = $foo{$short};
+
+sub abbrev {
+ my ($word, $hashref, $glob, %table, $returnvoid);
+
+ @_ or return; # So we don't autovivify onto @_ and trigger warning
+ if (ref($_[0])) { # hash reference preferably
+ $hashref = shift;
+ $returnvoid = 1;
+ } elsif (ref \$_[0] eq 'GLOB') { # is actually a glob (deprecated)
+ $hashref = \%{shift()};
+ $returnvoid = 1;
+ }
+ %{$hashref} = ();
+
+ WORD: foreach $word (@_) {
+ for (my $len = (length $word) - 1; $len > 0; --$len) {
+ my $abbrev = substr($word,0,$len);
+ my $seen = ++$table{$abbrev};
+ if ($seen == 1) { # We're the first word so far to have
+ # this abbreviation.
+ $hashref->{$abbrev} = $word;
+ } elsif ($seen == 2) { # We're the second word to have this
+ # abbreviation, so we can't use it.
+ delete $hashref->{$abbrev};
+ } else { # We're the third word to have this
+ # abbreviation, so skip to the next word.
+ next WORD;
+ }
+ }
+ }
+ # Non-abbreviations always get entered, even if they aren't unique
+ foreach $word (@_) {
+ $hashref->{$word} = $word;
+ }
+ return if $returnvoid;
+ if (wantarray) {
+ %{$hashref};
+ } else {
+ $hashref;
+ }
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Text/Balanced.pm b/Master/tlpkg/tlperl.straw/lib/Text/Balanced.pm
new file mode 100755
index 00000000000..07d956735c2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Text/Balanced.pm
@@ -0,0 +1,2281 @@
+package Text::Balanced;
+
+# EXTRACT VARIOUSLY DELIMITED TEXT SEQUENCES FROM STRINGS.
+# FOR FULL DOCUMENTATION SEE Balanced.pod
+
+use 5.005;
+use strict;
+use Exporter ();
+use SelfLoader;
+
+use vars qw { $VERSION @ISA %EXPORT_TAGS };
+BEGIN {
+ $VERSION = '2.02';
+ @ISA = 'Exporter';
+ %EXPORT_TAGS = (
+ ALL => [ qw{
+ &extract_delimited
+ &extract_bracketed
+ &extract_quotelike
+ &extract_codeblock
+ &extract_variable
+ &extract_tagged
+ &extract_multiple
+ &gen_delimited_pat
+ &gen_extract_tagged
+ &delimited_pat
+ } ],
+ );
+}
+
+Exporter::export_ok_tags('ALL');
+
+# PROTOTYPES
+
+sub _match_bracketed($$$$$$);
+sub _match_variable($$);
+sub _match_codeblock($$$$$$$);
+sub _match_quotelike($$$$);
+
+# HANDLE RETURN VALUES IN VARIOUS CONTEXTS
+
+sub _failmsg {
+ my ($message, $pos) = @_;
+ $@ = bless {
+ error => $message,
+ pos => $pos,
+ }, 'Text::Balanced::ErrorMsg';
+}
+
+sub _fail {
+ my ($wantarray, $textref, $message, $pos) = @_;
+ _failmsg $message, $pos if $message;
+ return (undef, $$textref, undef) if $wantarray;
+ return undef;
+}
+
+sub _succeed {
+ $@ = undef;
+ my ($wantarray,$textref) = splice @_, 0, 2;
+ my ($extrapos, $extralen) = @_ > 18
+ ? splice(@_, -2, 2)
+ : (0, 0);
+ my ($startlen, $oppos) = @_[5,6];
+ my $remainderpos = $_[2];
+ if ( $wantarray ) {
+ my @res;
+ while (my ($from, $len) = splice @_, 0, 2) {
+ push @res, substr($$textref, $from, $len);
+ }
+ if ( $extralen ) { # CORRECT FILLET
+ my $extra = substr($res[0], $extrapos-$oppos, $extralen, "\n");
+ $res[1] = "$extra$res[1]";
+ eval { substr($$textref,$remainderpos,0) = $extra;
+ substr($$textref,$extrapos,$extralen,"\n")} ;
+ #REARRANGE HERE DOC AND FILLET IF POSSIBLE
+ pos($$textref) = $remainderpos-$extralen+1; # RESET \G
+ } else {
+ pos($$textref) = $remainderpos; # RESET \G
+ }
+ return @res;
+ } else {
+ my $match = substr($$textref,$_[0],$_[1]);
+ substr($match,$extrapos-$_[0]-$startlen,$extralen,"") if $extralen;
+ my $extra = $extralen
+ ? substr($$textref, $extrapos, $extralen)."\n" : "";
+ eval {substr($$textref,$_[4],$_[1]+$_[5])=$extra} ; #CHOP OUT PREFIX & MATCH, IF POSSIBLE
+ pos($$textref) = $_[4]; # RESET \G
+ return $match;
+ }
+}
+
+# BUILD A PATTERN MATCHING A SIMPLE DELIMITED STRING
+
+sub gen_delimited_pat($;$) # ($delimiters;$escapes)
+{
+ my ($dels, $escs) = @_;
+ return "" unless $dels =~ /\S/;
+ $escs = '\\' unless $escs;
+ $escs .= substr($escs,-1) x (length($dels)-length($escs));
+ my @pat = ();
+ my $i;
+ for ($i=0; $i<length $dels; $i++)
+ {
+ my $del = quotemeta substr($dels,$i,1);
+ my $esc = quotemeta substr($escs,$i,1);
+ if ($del eq $esc)
+ {
+ push @pat, "$del(?:[^$del]*(?:(?:$del$del)[^$del]*)*)$del";
+ }
+ else
+ {
+ push @pat, "$del(?:[^$esc$del]*(?:$esc.[^$esc$del]*)*)$del";
+ }
+ }
+ my $pat = join '|', @pat;
+ return "(?:$pat)";
+}
+
+*delimited_pat = \&gen_delimited_pat;
+
+# THE EXTRACTION FUNCTIONS
+
+sub extract_delimited (;$$$$)
+{
+ my $textref = defined $_[0] ? \$_[0] : \$_;
+ my $wantarray = wantarray;
+ my $del = defined $_[1] ? $_[1] : qq{\'\"\`};
+ my $pre = defined $_[2] ? $_[2] : '\s*';
+ my $esc = defined $_[3] ? $_[3] : qq{\\};
+ my $pat = gen_delimited_pat($del, $esc);
+ my $startpos = pos $$textref || 0;
+ return _fail($wantarray, $textref, "Not a delimited pattern", 0)
+ unless $$textref =~ m/\G($pre)($pat)/gc;
+ my $prelen = length($1);
+ my $matchpos = $startpos+$prelen;
+ my $endpos = pos $$textref;
+ return _succeed $wantarray, $textref,
+ $matchpos, $endpos-$matchpos, # MATCH
+ $endpos, length($$textref)-$endpos, # REMAINDER
+ $startpos, $prelen; # PREFIX
+}
+
+sub extract_bracketed (;$$$)
+{
+ my $textref = defined $_[0] ? \$_[0] : \$_;
+ my $ldel = defined $_[1] ? $_[1] : '{([<';
+ my $pre = defined $_[2] ? $_[2] : '\s*';
+ my $wantarray = wantarray;
+ my $qdel = "";
+ my $quotelike;
+ $ldel =~ s/'//g and $qdel .= q{'};
+ $ldel =~ s/"//g and $qdel .= q{"};
+ $ldel =~ s/`//g and $qdel .= q{`};
+ $ldel =~ s/q//g and $quotelike = 1;
+ $ldel =~ tr/[](){}<>\0-\377/[[(({{<</ds;
+ my $rdel = $ldel;
+ unless ($rdel =~ tr/[({</])}>/)
+ {
+ return _fail $wantarray, $textref,
+ "Did not find a suitable bracket in delimiter: \"$_[1]\"",
+ 0;
+ }
+ my $posbug = pos;
+ $ldel = join('|', map { quotemeta $_ } split('', $ldel));
+ $rdel = join('|', map { quotemeta $_ } split('', $rdel));
+ pos = $posbug;
+
+ my $startpos = pos $$textref || 0;
+ my @match = _match_bracketed($textref,$pre, $ldel, $qdel, $quotelike, $rdel);
+
+ return _fail ($wantarray, $textref) unless @match;
+
+ return _succeed ( $wantarray, $textref,
+ $match[2], $match[5]+2, # MATCH
+ @match[8,9], # REMAINDER
+ @match[0,1], # PREFIX
+ );
+}
+
+sub _match_bracketed($$$$$$) # $textref, $pre, $ldel, $qdel, $quotelike, $rdel
+{
+ my ($textref, $pre, $ldel, $qdel, $quotelike, $rdel) = @_;
+ my ($startpos, $ldelpos, $endpos) = (pos $$textref = pos $$textref||0);
+ unless ($$textref =~ m/\G$pre/gc)
+ {
+ _failmsg "Did not find prefix: /$pre/", $startpos;
+ return;
+ }
+
+ $ldelpos = pos $$textref;
+
+ unless ($$textref =~ m/\G($ldel)/gc)
+ {
+ _failmsg "Did not find opening bracket after prefix: \"$pre\"",
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+
+ my @nesting = ( $1 );
+ my $textlen = length $$textref;
+ while (pos $$textref < $textlen)
+ {
+ next if $$textref =~ m/\G\\./gcs;
+
+ if ($$textref =~ m/\G($ldel)/gc)
+ {
+ push @nesting, $1;
+ }
+ elsif ($$textref =~ m/\G($rdel)/gc)
+ {
+ my ($found, $brackettype) = ($1, $1);
+ if ($#nesting < 0)
+ {
+ _failmsg "Unmatched closing bracket: \"$found\"",
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ my $expected = pop(@nesting);
+ $expected =~ tr/({[</)}]>/;
+ if ($expected ne $brackettype)
+ {
+ _failmsg qq{Mismatched closing bracket: expected "$expected" but found "$found"},
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ last if $#nesting < 0;
+ }
+ elsif ($qdel && $$textref =~ m/\G([$qdel])/gc)
+ {
+ $$textref =~ m/\G[^\\$1]*(?:\\.[^\\$1]*)*(\Q$1\E)/gsc and next;
+ _failmsg "Unmatched embedded quote ($1)",
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ elsif ($quotelike && _match_quotelike($textref,"",1,0))
+ {
+ next;
+ }
+
+ else { $$textref =~ m/\G(?:[a-zA-Z0-9]+|.)/gcs }
+ }
+ if ($#nesting>=0)
+ {
+ _failmsg "Unmatched opening bracket(s): "
+ . join("..",@nesting)."..",
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+
+ $endpos = pos $$textref;
+
+ return (
+ $startpos, $ldelpos-$startpos, # PREFIX
+ $ldelpos, 1, # OPENING BRACKET
+ $ldelpos+1, $endpos-$ldelpos-2, # CONTENTS
+ $endpos-1, 1, # CLOSING BRACKET
+ $endpos, length($$textref)-$endpos, # REMAINDER
+ );
+}
+
+sub _revbracket($)
+{
+ my $brack = reverse $_[0];
+ $brack =~ tr/[({</])}>/;
+ return $brack;
+}
+
+my $XMLNAME = q{[a-zA-Z_:][a-zA-Z0-9_:.-]*};
+
+sub extract_tagged (;$$$$$) # ($text, $opentag, $closetag, $pre, \%options)
+{
+ my $textref = defined $_[0] ? \$_[0] : \$_;
+ my $ldel = $_[1];
+ my $rdel = $_[2];
+ my $pre = defined $_[3] ? $_[3] : '\s*';
+ my %options = defined $_[4] ? %{$_[4]} : ();
+ my $omode = defined $options{fail} ? $options{fail} : '';
+ my $bad = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}})
+ : defined($options{reject}) ? $options{reject}
+ : ''
+ ;
+ my $ignore = ref($options{ignore}) eq 'ARRAY' ? join('|', @{$options{ignore}})
+ : defined($options{ignore}) ? $options{ignore}
+ : ''
+ ;
+
+ if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; }
+ $@ = undef;
+
+ my @match = _match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore);
+
+ return _fail(wantarray, $textref) unless @match;
+ return _succeed wantarray, $textref,
+ $match[2], $match[3]+$match[5]+$match[7], # MATCH
+ @match[8..9,0..1,2..7]; # REM, PRE, BITS
+}
+
+sub _match_tagged # ($$$$$$$)
+{
+ my ($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore) = @_;
+ my $rdelspec;
+
+ my ($startpos, $opentagpos, $textpos, $parapos, $closetagpos, $endpos) = ( pos($$textref) = pos($$textref)||0 );
+
+ unless ($$textref =~ m/\G($pre)/gc)
+ {
+ _failmsg "Did not find prefix: /$pre/", pos $$textref;
+ goto failed;
+ }
+
+ $opentagpos = pos($$textref);
+
+ unless ($$textref =~ m/\G$ldel/gc)
+ {
+ _failmsg "Did not find opening tag: /$ldel/", pos $$textref;
+ goto failed;
+ }
+
+ $textpos = pos($$textref);
+
+ if (!defined $rdel)
+ {
+ $rdelspec = substr($$textref, $-[0], $+[0] - $-[0]);
+ unless ($rdelspec =~ s/\A([[(<{]+)($XMLNAME).*/ quotemeta "$1\/$2". _revbracket($1) /oes)
+ {
+ _failmsg "Unable to construct closing tag to match: $rdel",
+ pos $$textref;
+ goto failed;
+ }
+ }
+ else
+ {
+ $rdelspec = eval "qq{$rdel}" || do {
+ my $del;
+ for (qw,~ ! ^ & * ) _ + - = } ] : " ; ' > . ? / | ',)
+ { next if $rdel =~ /\Q$_/; $del = $_; last }
+ unless ($del) {
+ use Carp;
+ croak "Can't interpolate right delimiter $rdel"
+ }
+ eval "qq$del$rdel$del";
+ };
+ }
+
+ while (pos($$textref) < length($$textref))
+ {
+ next if $$textref =~ m/\G\\./gc;
+
+ if ($$textref =~ m/\G(\n[ \t]*\n)/gc )
+ {
+ $parapos = pos($$textref) - length($1)
+ unless defined $parapos;
+ }
+ elsif ($$textref =~ m/\G($rdelspec)/gc )
+ {
+ $closetagpos = pos($$textref)-length($1);
+ goto matched;
+ }
+ elsif ($ignore && $$textref =~ m/\G(?:$ignore)/gc)
+ {
+ next;
+ }
+ elsif ($bad && $$textref =~ m/\G($bad)/gcs)
+ {
+ pos($$textref) -= length($1); # CUT OFF WHATEVER CAUSED THE SHORTNESS
+ goto short if ($omode eq 'PARA' || $omode eq 'MAX');
+ _failmsg "Found invalid nested tag: $1", pos $$textref;
+ goto failed;
+ }
+ elsif ($$textref =~ m/\G($ldel)/gc)
+ {
+ my $tag = $1;
+ pos($$textref) -= length($tag); # REWIND TO NESTED TAG
+ unless (_match_tagged(@_)) # MATCH NESTED TAG
+ {
+ goto short if $omode eq 'PARA' || $omode eq 'MAX';
+ _failmsg "Found unbalanced nested tag: $tag",
+ pos $$textref;
+ goto failed;
+ }
+ }
+ else { $$textref =~ m/./gcs }
+ }
+
+short:
+ $closetagpos = pos($$textref);
+ goto matched if $omode eq 'MAX';
+ goto failed unless $omode eq 'PARA';
+
+ if (defined $parapos) { pos($$textref) = $parapos }
+ else { $parapos = pos($$textref) }
+
+ return (
+ $startpos, $opentagpos-$startpos, # PREFIX
+ $opentagpos, $textpos-$opentagpos, # OPENING TAG
+ $textpos, $parapos-$textpos, # TEXT
+ $parapos, 0, # NO CLOSING TAG
+ $parapos, length($$textref)-$parapos, # REMAINDER
+ );
+
+matched:
+ $endpos = pos($$textref);
+ return (
+ $startpos, $opentagpos-$startpos, # PREFIX
+ $opentagpos, $textpos-$opentagpos, # OPENING TAG
+ $textpos, $closetagpos-$textpos, # TEXT
+ $closetagpos, $endpos-$closetagpos, # CLOSING TAG
+ $endpos, length($$textref)-$endpos, # REMAINDER
+ );
+
+failed:
+ _failmsg "Did not find closing tag", pos $$textref unless $@;
+ pos($$textref) = $startpos;
+ return;
+}
+
+sub extract_variable (;$$)
+{
+ my $textref = defined $_[0] ? \$_[0] : \$_;
+ return ("","","") unless defined $$textref;
+ my $pre = defined $_[1] ? $_[1] : '\s*';
+
+ my @match = _match_variable($textref,$pre);
+
+ return _fail wantarray, $textref unless @match;
+
+ return _succeed wantarray, $textref,
+ @match[2..3,4..5,0..1]; # MATCH, REMAINDER, PREFIX
+}
+
+sub _match_variable($$)
+{
+# $#
+# $^
+# $$
+ my ($textref, $pre) = @_;
+ my $startpos = pos($$textref) = pos($$textref)||0;
+ unless ($$textref =~ m/\G($pre)/gc)
+ {
+ _failmsg "Did not find prefix: /$pre/", pos $$textref;
+ return;
+ }
+ my $varpos = pos($$textref);
+ unless ($$textref =~ m{\G\$\s*(?!::)(\d+|[][&`'+*./|,";%=~:?!\@<>()-]|\^[a-z]?)}gci)
+ {
+ unless ($$textref =~ m/\G((\$#?|[*\@\%]|\\&)+)/gc)
+ {
+ _failmsg "Did not find leading dereferencer", pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ my $deref = $1;
+
+ unless ($$textref =~ m/\G\s*(?:::|')?(?:[_a-z]\w*(?:::|'))*[_a-z]\w*/gci
+ or _match_codeblock($textref, "", '\{', '\}', '\{', '\}', 0)
+ or $deref eq '$#' or $deref eq '$$' )
+ {
+ _failmsg "Bad identifier after dereferencer", pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ }
+
+ while (1)
+ {
+ next if $$textref =~ m/\G\s*(?:->)?\s*[{]\w+[}]/gc;
+ next if _match_codeblock($textref,
+ qr/\s*->\s*(?:[_a-zA-Z]\w+\s*)?/,
+ qr/[({[]/, qr/[)}\]]/,
+ qr/[({[]/, qr/[)}\]]/, 0);
+ next if _match_codeblock($textref,
+ qr/\s*/, qr/[{[]/, qr/[}\]]/,
+ qr/[{[]/, qr/[}\]]/, 0);
+ next if _match_variable($textref,'\s*->\s*');
+ next if $$textref =~ m/\G\s*->\s*\w+(?![{([])/gc;
+ last;
+ }
+
+ my $endpos = pos($$textref);
+ return ($startpos, $varpos-$startpos,
+ $varpos, $endpos-$varpos,
+ $endpos, length($$textref)-$endpos
+ );
+}
+
+sub extract_codeblock (;$$$$$)
+{
+ my $textref = defined $_[0] ? \$_[0] : \$_;
+ my $wantarray = wantarray;
+ my $ldel_inner = defined $_[1] ? $_[1] : '{';
+ my $pre = defined $_[2] ? $_[2] : '\s*';
+ my $ldel_outer = defined $_[3] ? $_[3] : $ldel_inner;
+ my $rd = $_[4];
+ my $rdel_inner = $ldel_inner;
+ my $rdel_outer = $ldel_outer;
+ my $posbug = pos;
+ for ($ldel_inner, $ldel_outer) { tr/[]()<>{}\0-\377/[[((<<{{/ds }
+ for ($rdel_inner, $rdel_outer) { tr/[]()<>{}\0-\377/]]))>>}}/ds }
+ for ($ldel_inner, $ldel_outer, $rdel_inner, $rdel_outer)
+ {
+ $_ = '('.join('|',map { quotemeta $_ } split('',$_)).')'
+ }
+ pos = $posbug;
+
+ my @match = _match_codeblock($textref, $pre,
+ $ldel_outer, $rdel_outer,
+ $ldel_inner, $rdel_inner,
+ $rd);
+ return _fail($wantarray, $textref) unless @match;
+ return _succeed($wantarray, $textref,
+ @match[2..3,4..5,0..1] # MATCH, REMAINDER, PREFIX
+ );
+
+}
+
+sub _match_codeblock($$$$$$$)
+{
+ my ($textref, $pre, $ldel_outer, $rdel_outer, $ldel_inner, $rdel_inner, $rd) = @_;
+ my $startpos = pos($$textref) = pos($$textref) || 0;
+ unless ($$textref =~ m/\G($pre)/gc)
+ {
+ _failmsg qq{Did not match prefix /$pre/ at"} .
+ substr($$textref,pos($$textref),20) .
+ q{..."},
+ pos $$textref;
+ return;
+ }
+ my $codepos = pos($$textref);
+ unless ($$textref =~ m/\G($ldel_outer)/gc) # OUTERMOST DELIMITER
+ {
+ _failmsg qq{Did not find expected opening bracket at "} .
+ substr($$textref,pos($$textref),20) .
+ q{..."},
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ my $closing = $1;
+ $closing =~ tr/([<{/)]>}/;
+ my $matched;
+ my $patvalid = 1;
+ while (pos($$textref) < length($$textref))
+ {
+ $matched = '';
+ if ($rd && $$textref =~ m#\G(\Q(?)\E|\Q(s?)\E|\Q(s)\E)#gc)
+ {
+ $patvalid = 0;
+ next;
+ }
+
+ if ($$textref =~ m/\G\s*#.*/gc)
+ {
+ next;
+ }
+
+ if ($$textref =~ m/\G\s*($rdel_outer)/gc)
+ {
+ unless ($matched = ($closing && $1 eq $closing) )
+ {
+ next if $1 eq '>'; # MIGHT BE A "LESS THAN"
+ _failmsg q{Mismatched closing bracket at "} .
+ substr($$textref,pos($$textref),20) .
+ qq{...". Expected '$closing'},
+ pos $$textref;
+ }
+ last;
+ }
+
+ if (_match_variable($textref,'\s*') ||
+ _match_quotelike($textref,'\s*',$patvalid,$patvalid) )
+ {
+ $patvalid = 0;
+ next;
+ }
+
+
+ # NEED TO COVER MANY MORE CASES HERE!!!
+ if ($$textref =~ m#\G\s*(?!$ldel_inner)
+ ( [-+*x/%^&|.]=?
+ | [!=]~
+ | =(?!>)
+ | (\*\*|&&|\|\||<<|>>)=?
+ | split|grep|map|return
+ | [([]
+ )#gcx)
+ {
+ $patvalid = 1;
+ next;
+ }
+
+ if ( _match_codeblock($textref, '\s*', $ldel_inner, $rdel_inner, $ldel_inner, $rdel_inner, $rd) )
+ {
+ $patvalid = 1;
+ next;
+ }
+
+ if ($$textref =~ m/\G\s*$ldel_outer/gc)
+ {
+ _failmsg q{Improperly nested codeblock at "} .
+ substr($$textref,pos($$textref),20) .
+ q{..."},
+ pos $$textref;
+ last;
+ }
+
+ $patvalid = 0;
+ $$textref =~ m/\G\s*(\w+|[-=>]>|.|\Z)/gc;
+ }
+ continue { $@ = undef }
+
+ unless ($matched)
+ {
+ _failmsg 'No match found for opening bracket', pos $$textref
+ unless $@;
+ return;
+ }
+
+ my $endpos = pos($$textref);
+ return ( $startpos, $codepos-$startpos,
+ $codepos, $endpos-$codepos,
+ $endpos, length($$textref)-$endpos,
+ );
+}
+
+
+my %mods = (
+ 'none' => '[cgimsox]*',
+ 'm' => '[cgimsox]*',
+ 's' => '[cegimsox]*',
+ 'tr' => '[cds]*',
+ 'y' => '[cds]*',
+ 'qq' => '',
+ 'qx' => '',
+ 'qw' => '',
+ 'qr' => '[imsx]*',
+ 'q' => '',
+ );
+
+sub extract_quotelike (;$$)
+{
+ my $textref = $_[0] ? \$_[0] : \$_;
+ my $wantarray = wantarray;
+ my $pre = defined $_[1] ? $_[1] : '\s*';
+
+ my @match = _match_quotelike($textref,$pre,1,0);
+ return _fail($wantarray, $textref) unless @match;
+ return _succeed($wantarray, $textref,
+ $match[2], $match[18]-$match[2], # MATCH
+ @match[18,19], # REMAINDER
+ @match[0,1], # PREFIX
+ @match[2..17], # THE BITS
+ @match[20,21], # ANY FILLET?
+ );
+};
+
+sub _match_quotelike($$$$) # ($textref, $prepat, $allow_raw_match)
+{
+ my ($textref, $pre, $rawmatch, $qmark) = @_;
+
+ my ($textlen,$startpos,
+ $oppos,
+ $preld1pos,$ld1pos,$str1pos,$rd1pos,
+ $preld2pos,$ld2pos,$str2pos,$rd2pos,
+ $modpos) = ( length($$textref), pos($$textref) = pos($$textref) || 0 );
+
+ unless ($$textref =~ m/\G($pre)/gc)
+ {
+ _failmsg qq{Did not find prefix /$pre/ at "} .
+ substr($$textref, pos($$textref), 20) .
+ q{..."},
+ pos $$textref;
+ return;
+ }
+ $oppos = pos($$textref);
+
+ my $initial = substr($$textref,$oppos,1);
+
+ if ($initial && $initial =~ m|^[\"\'\`]|
+ || $rawmatch && $initial =~ m|^/|
+ || $qmark && $initial =~ m|^\?|)
+ {
+ unless ($$textref =~ m/ \Q$initial\E [^\\$initial]* (\\.[^\\$initial]*)* \Q$initial\E /gcsx)
+ {
+ _failmsg qq{Did not find closing delimiter to match '$initial' at "} .
+ substr($$textref, $oppos, 20) .
+ q{..."},
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ $modpos= pos($$textref);
+ $rd1pos = $modpos-1;
+
+ if ($initial eq '/' || $initial eq '?')
+ {
+ $$textref =~ m/\G$mods{none}/gc
+ }
+
+ my $endpos = pos($$textref);
+ return (
+ $startpos, $oppos-$startpos, # PREFIX
+ $oppos, 0, # NO OPERATOR
+ $oppos, 1, # LEFT DEL
+ $oppos+1, $rd1pos-$oppos-1, # STR/PAT
+ $rd1pos, 1, # RIGHT DEL
+ $modpos, 0, # NO 2ND LDEL
+ $modpos, 0, # NO 2ND STR
+ $modpos, 0, # NO 2ND RDEL
+ $modpos, $endpos-$modpos, # MODIFIERS
+ $endpos, $textlen-$endpos, # REMAINDER
+ );
+ }
+
+ unless ($$textref =~ m{\G(\b(?:m|s|qq|qx|qw|q|qr|tr|y)\b(?=\s*\S)|<<)}gc)
+ {
+ _failmsg q{No quotelike operator found after prefix at "} .
+ substr($$textref, pos($$textref), 20) .
+ q{..."},
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+
+ my $op = $1;
+ $preld1pos = pos($$textref);
+ if ($op eq '<<') {
+ $ld1pos = pos($$textref);
+ my $label;
+ if ($$textref =~ m{\G([A-Za-z_]\w*)}gc) {
+ $label = $1;
+ }
+ elsif ($$textref =~ m{ \G ' ([^'\\]* (?:\\.[^'\\]*)*) '
+ | \G " ([^"\\]* (?:\\.[^"\\]*)*) "
+ | \G ` ([^`\\]* (?:\\.[^`\\]*)*) `
+ }gcsx) {
+ $label = $+;
+ }
+ else {
+ $label = "";
+ }
+ my $extrapos = pos($$textref);
+ $$textref =~ m{.*\n}gc;
+ $str1pos = pos($$textref)--;
+ unless ($$textref =~ m{.*?\n(?=\Q$label\E\n)}gc) {
+ _failmsg qq{Missing here doc terminator ('$label') after "} .
+ substr($$textref, $startpos, 20) .
+ q{..."},
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ $rd1pos = pos($$textref);
+ $$textref =~ m{\Q$label\E\n}gc;
+ $ld2pos = pos($$textref);
+ return (
+ $startpos, $oppos-$startpos, # PREFIX
+ $oppos, length($op), # OPERATOR
+ $ld1pos, $extrapos-$ld1pos, # LEFT DEL
+ $str1pos, $rd1pos-$str1pos, # STR/PAT
+ $rd1pos, $ld2pos-$rd1pos, # RIGHT DEL
+ $ld2pos, 0, # NO 2ND LDEL
+ $ld2pos, 0, # NO 2ND STR
+ $ld2pos, 0, # NO 2ND RDEL
+ $ld2pos, 0, # NO MODIFIERS
+ $ld2pos, $textlen-$ld2pos, # REMAINDER
+ $extrapos, $str1pos-$extrapos, # FILLETED BIT
+ );
+ }
+
+ $$textref =~ m/\G\s*/gc;
+ $ld1pos = pos($$textref);
+ $str1pos = $ld1pos+1;
+
+ unless ($$textref =~ m/\G(\S)/gc) # SHOULD USE LOOKAHEAD
+ {
+ _failmsg "No block delimiter found after quotelike $op",
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ pos($$textref) = $ld1pos; # HAVE TO DO THIS BECAUSE LOOKAHEAD BROKEN
+ my ($ldel1, $rdel1) = ("\Q$1","\Q$1");
+ if ($ldel1 =~ /[[(<{]/)
+ {
+ $rdel1 =~ tr/[({</])}>/;
+ defined(_match_bracketed($textref,"",$ldel1,"","",$rdel1))
+ || do { pos $$textref = $startpos; return };
+ $ld2pos = pos($$textref);
+ $rd1pos = $ld2pos-1;
+ }
+ else
+ {
+ $$textref =~ /\G$ldel1[^\\$ldel1]*(\\.[^\\$ldel1]*)*$ldel1/gcs
+ || do { pos $$textref = $startpos; return };
+ $ld2pos = $rd1pos = pos($$textref)-1;
+ }
+
+ my $second_arg = $op =~ /s|tr|y/ ? 1 : 0;
+ if ($second_arg)
+ {
+ my ($ldel2, $rdel2);
+ if ($ldel1 =~ /[[(<{]/)
+ {
+ unless ($$textref =~ /\G\s*(\S)/gc) # SHOULD USE LOOKAHEAD
+ {
+ _failmsg "Missing second block for quotelike $op",
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ $ldel2 = $rdel2 = "\Q$1";
+ $rdel2 =~ tr/[({</])}>/;
+ }
+ else
+ {
+ $ldel2 = $rdel2 = $ldel1;
+ }
+ $str2pos = $ld2pos+1;
+
+ if ($ldel2 =~ /[[(<{]/)
+ {
+ pos($$textref)--; # OVERCOME BROKEN LOOKAHEAD
+ defined(_match_bracketed($textref,"",$ldel2,"","",$rdel2))
+ || do { pos $$textref = $startpos; return };
+ }
+ else
+ {
+ $$textref =~ /[^\\$ldel2]*(\\.[^\\$ldel2]*)*$ldel2/gcs
+ || do { pos $$textref = $startpos; return };
+ }
+ $rd2pos = pos($$textref)-1;
+ }
+ else
+ {
+ $ld2pos = $str2pos = $rd2pos = $rd1pos;
+ }
+
+ $modpos = pos $$textref;
+
+ $$textref =~ m/\G($mods{$op})/gc;
+ my $endpos = pos $$textref;
+
+ return (
+ $startpos, $oppos-$startpos, # PREFIX
+ $oppos, length($op), # OPERATOR
+ $ld1pos, 1, # LEFT DEL
+ $str1pos, $rd1pos-$str1pos, # STR/PAT
+ $rd1pos, 1, # RIGHT DEL
+ $ld2pos, $second_arg, # 2ND LDEL (MAYBE)
+ $str2pos, $rd2pos-$str2pos, # 2ND STR (MAYBE)
+ $rd2pos, $second_arg, # 2ND RDEL (MAYBE)
+ $modpos, $endpos-$modpos, # MODIFIERS
+ $endpos, $textlen-$endpos, # REMAINDER
+ );
+}
+
+my $def_func = [
+ sub { extract_variable($_[0], '') },
+ sub { extract_quotelike($_[0],'') },
+ sub { extract_codeblock($_[0],'{}','') },
+];
+
+sub extract_multiple (;$$$$) # ($text, $functions_ref, $max_fields, $ignoreunknown)
+{
+ my $textref = defined($_[0]) ? \$_[0] : \$_;
+ my $posbug = pos;
+ my ($lastpos, $firstpos);
+ my @fields = ();
+
+ #for ($$textref)
+ {
+ my @func = defined $_[1] ? @{$_[1]} : @{$def_func};
+ my $max = defined $_[2] && $_[2]>0 ? $_[2] : 1_000_000_000;
+ my $igunk = $_[3];
+
+ pos $$textref ||= 0;
+
+ unless (wantarray)
+ {
+ use Carp;
+ carp "extract_multiple reset maximal count to 1 in scalar context"
+ if $^W && defined($_[2]) && $max > 1;
+ $max = 1
+ }
+
+ my $unkpos;
+ my $func;
+ my $class;
+
+ my @class;
+ foreach $func ( @func )
+ {
+ if (ref($func) eq 'HASH')
+ {
+ push @class, (keys %$func)[0];
+ $func = (values %$func)[0];
+ }
+ else
+ {
+ push @class, undef;
+ }
+ }
+
+ FIELD: while (pos($$textref) < length($$textref))
+ {
+ my ($field, $rem);
+ my @bits;
+ foreach my $i ( 0..$#func )
+ {
+ my $pref;
+ $func = $func[$i];
+ $class = $class[$i];
+ $lastpos = pos $$textref;
+ if (ref($func) eq 'CODE')
+ { ($field,$rem,$pref) = @bits = $func->($$textref) }
+ elsif (ref($func) eq 'Text::Balanced::Extractor')
+ { @bits = $field = $func->extract($$textref) }
+ elsif( $$textref =~ m/\G$func/gc )
+ { @bits = $field = defined($1)
+ ? $1
+ : substr($$textref, $-[0], $+[0] - $-[0])
+ }
+ $pref ||= "";
+ if (defined($field) && length($field))
+ {
+ if (!$igunk) {
+ $unkpos = $lastpos
+ if length($pref) && !defined($unkpos);
+ if (defined $unkpos)
+ {
+ push @fields, substr($$textref, $unkpos, $lastpos-$unkpos).$pref;
+ $firstpos = $unkpos unless defined $firstpos;
+ undef $unkpos;
+ last FIELD if @fields == $max;
+ }
+ }
+ push @fields, $class
+ ? bless (\$field, $class)
+ : $field;
+ $firstpos = $lastpos unless defined $firstpos;
+ $lastpos = pos $$textref;
+ last FIELD if @fields == $max;
+ next FIELD;
+ }
+ }
+ if ($$textref =~ /\G(.)/gcs)
+ {
+ $unkpos = pos($$textref)-1
+ unless $igunk || defined $unkpos;
+ }
+ }
+
+ if (defined $unkpos)
+ {
+ push @fields, substr($$textref, $unkpos);
+ $firstpos = $unkpos unless defined $firstpos;
+ $lastpos = length $$textref;
+ }
+ last;
+ }
+
+ pos $$textref = $lastpos;
+ return @fields if wantarray;
+
+ $firstpos ||= 0;
+ eval { substr($$textref,$firstpos,$lastpos-$firstpos)="";
+ pos $$textref = $firstpos };
+ return $fields[0];
+}
+
+sub gen_extract_tagged # ($opentag, $closetag, $pre, \%options)
+{
+ my $ldel = $_[0];
+ my $rdel = $_[1];
+ my $pre = defined $_[2] ? $_[2] : '\s*';
+ my %options = defined $_[3] ? %{$_[3]} : ();
+ my $omode = defined $options{fail} ? $options{fail} : '';
+ my $bad = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}})
+ : defined($options{reject}) ? $options{reject}
+ : ''
+ ;
+ my $ignore = ref($options{ignore}) eq 'ARRAY' ? join('|', @{$options{ignore}})
+ : defined($options{ignore}) ? $options{ignore}
+ : ''
+ ;
+
+ if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; }
+
+ my $posbug = pos;
+ for ($ldel, $pre, $bad, $ignore) { $_ = qr/$_/ if $_ }
+ pos = $posbug;
+
+ my $closure = sub
+ {
+ my $textref = defined $_[0] ? \$_[0] : \$_;
+ my @match = Text::Balanced::_match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore);
+
+ return _fail(wantarray, $textref) unless @match;
+ return _succeed wantarray, $textref,
+ $match[2], $match[3]+$match[5]+$match[7], # MATCH
+ @match[8..9,0..1,2..7]; # REM, PRE, BITS
+ };
+
+ bless $closure, 'Text::Balanced::Extractor';
+}
+
+package Text::Balanced::Extractor;
+
+sub extract($$) # ($self, $text)
+{
+ &{$_[0]}($_[1]);
+}
+
+package Text::Balanced::ErrorMsg;
+
+use overload '""' => sub { "$_[0]->{error}, detected at offset $_[0]->{pos}" };
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Text::Balanced - Extract delimited text sequences from strings.
+
+=head1 SYNOPSIS
+
+ use Text::Balanced qw (
+ extract_delimited
+ extract_bracketed
+ extract_quotelike
+ extract_codeblock
+ extract_variable
+ extract_tagged
+ extract_multiple
+ gen_delimited_pat
+ gen_extract_tagged
+ );
+
+ # Extract the initial substring of $text that is delimited by
+ # two (unescaped) instances of the first character in $delim.
+
+ ($extracted, $remainder) = extract_delimited($text,$delim);
+
+
+ # Extract the initial substring of $text that is bracketed
+ # with a delimiter(s) specified by $delim (where the string
+ # in $delim contains one or more of '(){}[]<>').
+
+ ($extracted, $remainder) = extract_bracketed($text,$delim);
+
+
+ # Extract the initial substring of $text that is bounded by
+ # an XML tag.
+
+ ($extracted, $remainder) = extract_tagged($text);
+
+
+ # Extract the initial substring of $text that is bounded by
+ # a C<BEGIN>...C<END> pair. Don't allow nested C<BEGIN> tags
+
+ ($extracted, $remainder) =
+ extract_tagged($text,"BEGIN","END",undef,{bad=>["BEGIN"]});
+
+
+ # Extract the initial substring of $text that represents a
+ # Perl "quote or quote-like operation"
+
+ ($extracted, $remainder) = extract_quotelike($text);
+
+
+ # Extract the initial substring of $text that represents a block
+ # of Perl code, bracketed by any of character(s) specified by $delim
+ # (where the string $delim contains one or more of '(){}[]<>').
+
+ ($extracted, $remainder) = extract_codeblock($text,$delim);
+
+
+ # Extract the initial substrings of $text that would be extracted by
+ # one or more sequential applications of the specified functions
+ # or regular expressions
+
+ @extracted = extract_multiple($text,
+ [ \&extract_bracketed,
+ \&extract_quotelike,
+ \&some_other_extractor_sub,
+ qr/[xyz]*/,
+ 'literal',
+ ]);
+
+# Create a string representing an optimized pattern (a la Friedl)
+# that matches a substring delimited by any of the specified characters
+# (in this case: any type of quote or a slash)
+
+ $patstring = gen_delimited_pat(q{'"`/});
+
+# Generate a reference to an anonymous sub that is just like extract_tagged
+# but pre-compiled and optimized for a specific pair of tags, and consequently
+# much faster (i.e. 3 times faster). It uses qr// for better performance on
+# repeated calls, so it only works under Perl 5.005 or later.
+
+ $extract_head = gen_extract_tagged('<HEAD>','</HEAD>');
+
+ ($extracted, $remainder) = $extract_head->($text);
+
+=head1 DESCRIPTION
+
+The various C<extract_...> subroutines may be used to
+extract a delimited substring, possibly after skipping a
+specified prefix string. By default, that prefix is
+optional whitespace (C</\s*/>), but you can change it to whatever
+you wish (see below).
+
+The substring to be extracted must appear at the
+current C<pos> location of the string's variable
+(or at index zero, if no C<pos> position is defined).
+In other words, the C<extract_...> subroutines I<don't>
+extract the first occurrence of a substring anywhere
+in a string (like an unanchored regex would). Rather,
+they extract an occurrence of the substring appearing
+immediately at the current matching position in the
+string (like a C<\G>-anchored regex would).
+
+=head2 General behaviour in list contexts
+
+In a list context, all the subroutines return a list, the first three
+elements of which are always:
+
+=over 4
+
+=item [0]
+
+The extracted string, including the specified delimiters.
+If the extraction fails C<undef> is returned.
+
+=item [1]
+
+The remainder of the input string (i.e. the characters after the
+extracted string). On failure, the entire string is returned.
+
+=item [2]
+
+The skipped prefix (i.e. the characters before the extracted string).
+On failure, C<undef> is returned.
+
+=back
+
+Note that in a list context, the contents of the original input text (the first
+argument) are not modified in any way.
+
+However, if the input text was passed in a variable, that variable's
+C<pos> value is updated to point at the first character after the
+extracted text. That means that in a list context the various
+subroutines can be used much like regular expressions. For example:
+
+ while ( $next = (extract_quotelike($text))[0] )
+ {
+ # process next quote-like (in $next)
+ }
+
+=head2 General behaviour in scalar and void contexts
+
+In a scalar context, the extracted string is returned, having first been
+removed from the input text. Thus, the following code also processes
+each quote-like operation, but actually removes them from $text:
+
+ while ( $next = extract_quotelike($text) )
+ {
+ # process next quote-like (in $next)
+ }
+
+Note that if the input text is a read-only string (i.e. a literal),
+no attempt is made to remove the extracted text.
+
+In a void context the behaviour of the extraction subroutines is
+exactly the same as in a scalar context, except (of course) that the
+extracted substring is not returned.
+
+=head2 A note about prefixes
+
+Prefix patterns are matched without any trailing modifiers (C</gimsox> etc.)
+This can bite you if you're expecting a prefix specification like
+'.*?(?=<H1>)' to skip everything up to the first <H1> tag. Such a prefix
+pattern will only succeed if the <H1> tag is on the current line, since
+. normally doesn't match newlines.
+
+To overcome this limitation, you need to turn on /s matching within
+the prefix pattern, using the C<(?s)> directive: '(?s).*?(?=<H1>)'
+
+=head2 C<extract_delimited>
+
+The C<extract_delimited> function formalizes the common idiom
+of extracting a single-character-delimited substring from the start of
+a string. For example, to extract a single-quote delimited string, the
+following code is typically used:
+
+ ($remainder = $text) =~ s/\A('(\\.|[^'])*')//s;
+ $extracted = $1;
+
+but with C<extract_delimited> it can be simplified to:
+
+ ($extracted,$remainder) = extract_delimited($text, "'");
+
+C<extract_delimited> takes up to four scalars (the input text, the
+delimiters, a prefix pattern to be skipped, and any escape characters)
+and extracts the initial substring of the text that
+is appropriately delimited. If the delimiter string has multiple
+characters, the first one encountered in the text is taken to delimit
+the substring.
+The third argument specifies a prefix pattern that is to be skipped
+(but must be present!) before the substring is extracted.
+The final argument specifies the escape character to be used for each
+delimiter.
+
+All arguments are optional. If the escape characters are not specified,
+every delimiter is escaped with a backslash (C<\>).
+If the prefix is not specified, the
+pattern C<'\s*'> - optional whitespace - is used. If the delimiter set
+is also not specified, the set C</["'`]/> is used. If the text to be processed
+is not specified either, C<$_> is used.
+
+In list context, C<extract_delimited> returns a array of three
+elements, the extracted substring (I<including the surrounding
+delimiters>), the remainder of the text, and the skipped prefix (if
+any). If a suitable delimited substring is not found, the first
+element of the array is the empty string, the second is the complete
+original text, and the prefix returned in the third element is an
+empty string.
+
+In a scalar context, just the extracted substring is returned. In
+a void context, the extracted substring (and any prefix) are simply
+removed from the beginning of the first argument.
+
+Examples:
+
+ # Remove a single-quoted substring from the very beginning of $text:
+
+ $substring = extract_delimited($text, "'", '');
+
+ # Remove a single-quoted Pascalish substring (i.e. one in which
+ # doubling the quote character escapes it) from the very
+ # beginning of $text:
+
+ $substring = extract_delimited($text, "'", '', "'");
+
+ # Extract a single- or double- quoted substring from the
+ # beginning of $text, optionally after some whitespace
+ # (note the list context to protect $text from modification):
+
+ ($substring) = extract_delimited $text, q{"'};
+
+ # Delete the substring delimited by the first '/' in $text:
+
+ $text = join '', (extract_delimited($text,'/','[^/]*')[2,1];
+
+Note that this last example is I<not> the same as deleting the first
+quote-like pattern. For instance, if C<$text> contained the string:
+
+ "if ('./cmd' =~ m/$UNIXCMD/s) { $cmd = $1; }"
+
+then after the deletion it would contain:
+
+ "if ('.$UNIXCMD/s) { $cmd = $1; }"
+
+not:
+
+ "if ('./cmd' =~ ms) { $cmd = $1; }"
+
+See L<"extract_quotelike"> for a (partial) solution to this problem.
+
+=head2 C<extract_bracketed>
+
+Like C<"extract_delimited">, the C<extract_bracketed> function takes
+up to three optional scalar arguments: a string to extract from, a delimiter
+specifier, and a prefix pattern. As before, a missing prefix defaults to
+optional whitespace and a missing text defaults to C<$_>. However, a missing
+delimiter specifier defaults to C<'{}()[]E<lt>E<gt>'> (see below).
+
+C<extract_bracketed> extracts a balanced-bracket-delimited
+substring (using any one (or more) of the user-specified delimiter
+brackets: '(..)', '{..}', '[..]', or '<..>'). Optionally it will also
+respect quoted unbalanced brackets (see below).
+
+A "delimiter bracket" is a bracket in list of delimiters passed as
+C<extract_bracketed>'s second argument. Delimiter brackets are
+specified by giving either the left or right (or both!) versions
+of the required bracket(s). Note that the order in which
+two or more delimiter brackets are specified is not significant.
+
+A "balanced-bracket-delimited substring" is a substring bounded by
+matched brackets, such that any other (left or right) delimiter
+bracket I<within> the substring is also matched by an opposite
+(right or left) delimiter bracket I<at the same level of nesting>. Any
+type of bracket not in the delimiter list is treated as an ordinary
+character.
+
+In other words, each type of bracket specified as a delimiter must be
+balanced and correctly nested within the substring, and any other kind of
+("non-delimiter") bracket in the substring is ignored.
+
+For example, given the string:
+
+ $text = "{ an '[irregularly :-(] {} parenthesized >:-)' string }";
+
+then a call to C<extract_bracketed> in a list context:
+
+ @result = extract_bracketed( $text, '{}' );
+
+would return:
+
+ ( "{ an '[irregularly :-(] {} parenthesized >:-)' string }" , "" , "" )
+
+since both sets of C<'{..}'> brackets are properly nested and evenly balanced.
+(In a scalar context just the first element of the array would be returned. In
+a void context, C<$text> would be replaced by an empty string.)
+
+Likewise the call in:
+
+ @result = extract_bracketed( $text, '{[' );
+
+would return the same result, since all sets of both types of specified
+delimiter brackets are correctly nested and balanced.
+
+However, the call in:
+
+ @result = extract_bracketed( $text, '{([<' );
+
+would fail, returning:
+
+ ( undef , "{ an '[irregularly :-(] {} parenthesized >:-)' string }" );
+
+because the embedded pairs of C<'(..)'>s and C<'[..]'>s are "cross-nested" and
+the embedded C<'E<gt>'> is unbalanced. (In a scalar context, this call would
+return an empty string. In a void context, C<$text> would be unchanged.)
+
+Note that the embedded single-quotes in the string don't help in this
+case, since they have not been specified as acceptable delimiters and are
+therefore treated as non-delimiter characters (and ignored).
+
+However, if a particular species of quote character is included in the
+delimiter specification, then that type of quote will be correctly handled.
+for example, if C<$text> is:
+
+ $text = '<A HREF=">>>>">link</A>';
+
+then
+
+ @result = extract_bracketed( $text, '<">' );
+
+returns:
+
+ ( '<A HREF=">>>>">', 'link</A>', "" )
+
+as expected. Without the specification of C<"> as an embedded quoter:
+
+ @result = extract_bracketed( $text, '<>' );
+
+the result would be:
+
+ ( '<A HREF=">', '>>>">link</A>', "" )
+
+In addition to the quote delimiters C<'>, C<">, and C<`>, full Perl quote-like
+quoting (i.e. q{string}, qq{string}, etc) can be specified by including the
+letter 'q' as a delimiter. Hence:
+
+ @result = extract_bracketed( $text, '<q>' );
+
+would correctly match something like this:
+
+ $text = '<leftop: conj /and/ conj>';
+
+See also: C<"extract_quotelike"> and C<"extract_codeblock">.
+
+=head2 C<extract_variable>
+
+C<extract_variable> extracts any valid Perl variable or
+variable-involved expression, including scalars, arrays, hashes, array
+accesses, hash look-ups, method calls through objects, subroutine calls
+through subroutine references, etc.
+
+The subroutine takes up to two optional arguments:
+
+=over 4
+
+=item 1.
+
+A string to be processed (C<$_> if the string is omitted or C<undef>)
+
+=item 2.
+
+A string specifying a pattern to be matched as a prefix (which is to be
+skipped). If omitted, optional whitespace is skipped.
+
+=back
+
+On success in a list context, an array of 3 elements is returned. The
+elements are:
+
+=over 4
+
+=item [0]
+
+the extracted variable, or variablish expression
+
+=item [1]
+
+the remainder of the input text,
+
+=item [2]
+
+the prefix substring (if any),
+
+=back
+
+On failure, all of these values (except the remaining text) are C<undef>.
+
+In a scalar context, C<extract_variable> returns just the complete
+substring that matched a variablish expression. C<undef> is returned on
+failure. In addition, the original input text has the returned substring
+(and any prefix) removed from it.
+
+In a void context, the input text just has the matched substring (and
+any specified prefix) removed.
+
+
+=head2 C<extract_tagged>
+
+C<extract_tagged> extracts and segments text between (balanced)
+specified tags.
+
+The subroutine takes up to five optional arguments:
+
+=over 4
+
+=item 1.
+
+A string to be processed (C<$_> if the string is omitted or C<undef>)
+
+=item 2.
+
+A string specifying a pattern to be matched as the opening tag.
+If the pattern string is omitted (or C<undef>) then a pattern
+that matches any standard XML tag is used.
+
+=item 3.
+
+A string specifying a pattern to be matched at the closing tag.
+If the pattern string is omitted (or C<undef>) then the closing
+tag is constructed by inserting a C</> after any leading bracket
+characters in the actual opening tag that was matched (I<not> the pattern
+that matched the tag). For example, if the opening tag pattern
+is specified as C<'{{\w+}}'> and actually matched the opening tag
+C<"{{DATA}}">, then the constructed closing tag would be C<"{{/DATA}}">.
+
+=item 4.
+
+A string specifying a pattern to be matched as a prefix (which is to be
+skipped). If omitted, optional whitespace is skipped.
+
+=item 5.
+
+A hash reference containing various parsing options (see below)
+
+=back
+
+The various options that can be specified are:
+
+=over 4
+
+=item C<reject =E<gt> $listref>
+
+The list reference contains one or more strings specifying patterns
+that must I<not> appear within the tagged text.
+
+For example, to extract
+an HTML link (which should not contain nested links) use:
+
+ extract_tagged($text, '<A>', '</A>', undef, {reject => ['<A>']} );
+
+=item C<ignore =E<gt> $listref>
+
+The list reference contains one or more strings specifying patterns
+that are I<not> be be treated as nested tags within the tagged text
+(even if they would match the start tag pattern).
+
+For example, to extract an arbitrary XML tag, but ignore "empty" elements:
+
+ extract_tagged($text, undef, undef, undef, {ignore => ['<[^>]*/>']} );
+
+(also see L<"gen_delimited_pat"> below).
+
+=item C<fail =E<gt> $str>
+
+The C<fail> option indicates the action to be taken if a matching end
+tag is not encountered (i.e. before the end of the string or some
+C<reject> pattern matches). By default, a failure to match a closing
+tag causes C<extract_tagged> to immediately fail.
+
+However, if the string value associated with <reject> is "MAX", then
+C<extract_tagged> returns the complete text up to the point of failure.
+If the string is "PARA", C<extract_tagged> returns only the first paragraph
+after the tag (up to the first line that is either empty or contains
+only whitespace characters).
+If the string is "", the the default behaviour (i.e. failure) is reinstated.
+
+For example, suppose the start tag "/para" introduces a paragraph, which then
+continues until the next "/endpara" tag or until another "/para" tag is
+encountered:
+
+ $text = "/para line 1\n\nline 3\n/para line 4";
+
+ extract_tagged($text, '/para', '/endpara', undef,
+ {reject => '/para', fail => MAX );
+
+ # EXTRACTED: "/para line 1\n\nline 3\n"
+
+Suppose instead, that if no matching "/endpara" tag is found, the "/para"
+tag refers only to the immediately following paragraph:
+
+ $text = "/para line 1\n\nline 3\n/para line 4";
+
+ extract_tagged($text, '/para', '/endpara', undef,
+ {reject => '/para', fail => MAX );
+
+ # EXTRACTED: "/para line 1\n"
+
+Note that the specified C<fail> behaviour applies to nested tags as well.
+
+=back
+
+On success in a list context, an array of 6 elements is returned. The elements are:
+
+=over 4
+
+=item [0]
+
+the extracted tagged substring (including the outermost tags),
+
+=item [1]
+
+the remainder of the input text,
+
+=item [2]
+
+the prefix substring (if any),
+
+=item [3]
+
+the opening tag
+
+=item [4]
+
+the text between the opening and closing tags
+
+=item [5]
+
+the closing tag (or "" if no closing tag was found)
+
+=back
+
+On failure, all of these values (except the remaining text) are C<undef>.
+
+In a scalar context, C<extract_tagged> returns just the complete
+substring that matched a tagged text (including the start and end
+tags). C<undef> is returned on failure. In addition, the original input
+text has the returned substring (and any prefix) removed from it.
+
+In a void context, the input text just has the matched substring (and
+any specified prefix) removed.
+
+=head2 C<gen_extract_tagged>
+
+(Note: This subroutine is only available under Perl5.005)
+
+C<gen_extract_tagged> generates a new anonymous subroutine which
+extracts text between (balanced) specified tags. In other words,
+it generates a function identical in function to C<extract_tagged>.
+
+The difference between C<extract_tagged> and the anonymous
+subroutines generated by
+C<gen_extract_tagged>, is that those generated subroutines:
+
+=over 4
+
+=item *
+
+do not have to reparse tag specification or parsing options every time
+they are called (whereas C<extract_tagged> has to effectively rebuild
+its tag parser on every call);
+
+=item *
+
+make use of the new qr// construct to pre-compile the regexes they use
+(whereas C<extract_tagged> uses standard string variable interpolation
+to create tag-matching patterns).
+
+=back
+
+The subroutine takes up to four optional arguments (the same set as
+C<extract_tagged> except for the string to be processed). It returns
+a reference to a subroutine which in turn takes a single argument (the text to
+be extracted from).
+
+In other words, the implementation of C<extract_tagged> is exactly
+equivalent to:
+
+ sub extract_tagged
+ {
+ my $text = shift;
+ $extractor = gen_extract_tagged(@_);
+ return $extractor->($text);
+ }
+
+(although C<extract_tagged> is not currently implemented that way, in order
+to preserve pre-5.005 compatibility).
+
+Using C<gen_extract_tagged> to create extraction functions for specific tags
+is a good idea if those functions are going to be called more than once, since
+their performance is typically twice as good as the more general-purpose
+C<extract_tagged>.
+
+
+=head2 C<extract_quotelike>
+
+C<extract_quotelike> attempts to recognize, extract, and segment any
+one of the various Perl quotes and quotelike operators (see
+L<perlop(3)>) Nested backslashed delimiters, embedded balanced bracket
+delimiters (for the quotelike operators), and trailing modifiers are
+all caught. For example, in:
+
+ extract_quotelike 'q # an octothorpe: \# (not the end of the q!) #'
+
+ extract_quotelike ' "You said, \"Use sed\"." '
+
+ extract_quotelike ' s{([A-Z]{1,8}\.[A-Z]{3})} /\L$1\E/; '
+
+ extract_quotelike ' tr/\\\/\\\\/\\\//ds; '
+
+the full Perl quotelike operations are all extracted correctly.
+
+Note too that, when using the /x modifier on a regex, any comment
+containing the current pattern delimiter will cause the regex to be
+immediately terminated. In other words:
+
+ 'm /
+ (?i) # CASE INSENSITIVE
+ [a-z_] # LEADING ALPHABETIC/UNDERSCORE
+ [a-z0-9]* # FOLLOWED BY ANY NUMBER OF ALPHANUMERICS
+ /x'
+
+will be extracted as if it were:
+
+ 'm /
+ (?i) # CASE INSENSITIVE
+ [a-z_] # LEADING ALPHABETIC/'
+
+This behaviour is identical to that of the actual compiler.
+
+C<extract_quotelike> takes two arguments: the text to be processed and
+a prefix to be matched at the very beginning of the text. If no prefix
+is specified, optional whitespace is the default. If no text is given,
+C<$_> is used.
+
+In a list context, an array of 11 elements is returned. The elements are:
+
+=over 4
+
+=item [0]
+
+the extracted quotelike substring (including trailing modifiers),
+
+=item [1]
+
+the remainder of the input text,
+
+=item [2]
+
+the prefix substring (if any),
+
+=item [3]
+
+the name of the quotelike operator (if any),
+
+=item [4]
+
+the left delimiter of the first block of the operation,
+
+=item [5]
+
+the text of the first block of the operation
+(that is, the contents of
+a quote, the regex of a match or substitution or the target list of a
+translation),
+
+=item [6]
+
+the right delimiter of the first block of the operation,
+
+=item [7]
+
+the left delimiter of the second block of the operation
+(that is, if it is a C<s>, C<tr>, or C<y>),
+
+=item [8]
+
+the text of the second block of the operation
+(that is, the replacement of a substitution or the translation list
+of a translation),
+
+=item [9]
+
+the right delimiter of the second block of the operation (if any),
+
+=item [10]
+
+the trailing modifiers on the operation (if any).
+
+=back
+
+For each of the fields marked "(if any)" the default value on success is
+an empty string.
+On failure, all of these values (except the remaining text) are C<undef>.
+
+In a scalar context, C<extract_quotelike> returns just the complete substring
+that matched a quotelike operation (or C<undef> on failure). In a scalar or
+void context, the input text has the same substring (and any specified
+prefix) removed.
+
+Examples:
+
+ # Remove the first quotelike literal that appears in text
+
+ $quotelike = extract_quotelike($text,'.*?');
+
+ # Replace one or more leading whitespace-separated quotelike
+ # literals in $_ with "<QLL>"
+
+ do { $_ = join '<QLL>', (extract_quotelike)[2,1] } until $@;
+
+
+ # Isolate the search pattern in a quotelike operation from $text
+
+ ($op,$pat) = (extract_quotelike $text)[3,5];
+ if ($op =~ /[ms]/)
+ {
+ print "search pattern: $pat\n";
+ }
+ else
+ {
+ print "$op is not a pattern matching operation\n";
+ }
+
+=head2 C<extract_quotelike> and "here documents"
+
+C<extract_quotelike> can successfully extract "here documents" from an input
+string, but with an important caveat in list contexts.
+
+Unlike other types of quote-like literals, a here document is rarely
+a contiguous substring. For example, a typical piece of code using
+here document might look like this:
+
+ <<'EOMSG' || die;
+ This is the message.
+ EOMSG
+ exit;
+
+Given this as an input string in a scalar context, C<extract_quotelike>
+would correctly return the string "<<'EOMSG'\nThis is the message.\nEOMSG",
+leaving the string " || die;\nexit;" in the original variable. In other words,
+the two separate pieces of the here document are successfully extracted and
+concatenated.
+
+In a list context, C<extract_quotelike> would return the list
+
+=over 4
+
+=item [0]
+
+"<<'EOMSG'\nThis is the message.\nEOMSG\n" (i.e. the full extracted here document,
+including fore and aft delimiters),
+
+=item [1]
+
+" || die;\nexit;" (i.e. the remainder of the input text, concatenated),
+
+=item [2]
+
+"" (i.e. the prefix substring -- trivial in this case),
+
+=item [3]
+
+"<<" (i.e. the "name" of the quotelike operator)
+
+=item [4]
+
+"'EOMSG'" (i.e. the left delimiter of the here document, including any quotes),
+
+=item [5]
+
+"This is the message.\n" (i.e. the text of the here document),
+
+=item [6]
+
+"EOMSG" (i.e. the right delimiter of the here document),
+
+=item [7..10]
+
+"" (a here document has no second left delimiter, second text, second right
+delimiter, or trailing modifiers).
+
+=back
+
+However, the matching position of the input variable would be set to
+"exit;" (i.e. I<after> the closing delimiter of the here document),
+which would cause the earlier " || die;\nexit;" to be skipped in any
+sequence of code fragment extractions.
+
+To avoid this problem, when it encounters a here document whilst
+extracting from a modifiable string, C<extract_quotelike> silently
+rearranges the string to an equivalent piece of Perl:
+
+ <<'EOMSG'
+ This is the message.
+ EOMSG
+ || die;
+ exit;
+
+in which the here document I<is> contiguous. It still leaves the
+matching position after the here document, but now the rest of the line
+on which the here document starts is not skipped.
+
+To prevent <extract_quotelike> from mucking about with the input in this way
+(this is the only case where a list-context C<extract_quotelike> does so),
+you can pass the input variable as an interpolated literal:
+
+ $quotelike = extract_quotelike("$var");
+
+=head2 C<extract_codeblock>
+
+C<extract_codeblock> attempts to recognize and extract a balanced
+bracket delimited substring that may contain unbalanced brackets
+inside Perl quotes or quotelike operations. That is, C<extract_codeblock>
+is like a combination of C<"extract_bracketed"> and
+C<"extract_quotelike">.
+
+C<extract_codeblock> takes the same initial three parameters as C<extract_bracketed>:
+a text to process, a set of delimiter brackets to look for, and a prefix to
+match first. It also takes an optional fourth parameter, which allows the
+outermost delimiter brackets to be specified separately (see below).
+
+Omitting the first argument (input text) means process C<$_> instead.
+Omitting the second argument (delimiter brackets) indicates that only C<'{'> is to be used.
+Omitting the third argument (prefix argument) implies optional whitespace at the start.
+Omitting the fourth argument (outermost delimiter brackets) indicates that the
+value of the second argument is to be used for the outermost delimiters.
+
+Once the prefix an dthe outermost opening delimiter bracket have been
+recognized, code blocks are extracted by stepping through the input text and
+trying the following alternatives in sequence:
+
+=over 4
+
+=item 1.
+
+Try and match a closing delimiter bracket. If the bracket was the same
+species as the last opening bracket, return the substring to that
+point. If the bracket was mismatched, return an error.
+
+=item 2.
+
+Try to match a quote or quotelike operator. If found, call
+C<extract_quotelike> to eat it. If C<extract_quotelike> fails, return
+the error it returned. Otherwise go back to step 1.
+
+=item 3.
+
+Try to match an opening delimiter bracket. If found, call
+C<extract_codeblock> recursively to eat the embedded block. If the
+recursive call fails, return an error. Otherwise, go back to step 1.
+
+=item 4.
+
+Unconditionally match a bareword or any other single character, and
+then go back to step 1.
+
+=back
+
+Examples:
+
+ # Find a while loop in the text
+
+ if ($text =~ s/.*?while\s*\{/{/)
+ {
+ $loop = "while " . extract_codeblock($text);
+ }
+
+ # Remove the first round-bracketed list (which may include
+ # round- or curly-bracketed code blocks or quotelike operators)
+
+ extract_codeblock $text, "(){}", '[^(]*';
+
+
+The ability to specify a different outermost delimiter bracket is useful
+in some circumstances. For example, in the Parse::RecDescent module,
+parser actions which are to be performed only on a successful parse
+are specified using a C<E<lt>defer:...E<gt>> directive. For example:
+
+ sentence: subject verb object
+ <defer: {$::theVerb = $item{verb}} >
+
+Parse::RecDescent uses C<extract_codeblock($text, '{}E<lt>E<gt>')> to extract the code
+within the C<E<lt>defer:...E<gt>> directive, but there's a problem.
+
+A deferred action like this:
+
+ <defer: {if ($count>10) {$count--}} >
+
+will be incorrectly parsed as:
+
+ <defer: {if ($count>
+
+because the "less than" operator is interpreted as a closing delimiter.
+
+But, by extracting the directive using
+S<C<extract_codeblock($text, '{}', undef, 'E<lt>E<gt>')>>
+the '>' character is only treated as a delimited at the outermost
+level of the code block, so the directive is parsed correctly.
+
+=head2 C<extract_multiple>
+
+The C<extract_multiple> subroutine takes a string to be processed and a
+list of extractors (subroutines or regular expressions) to apply to that string.
+
+In an array context C<extract_multiple> returns an array of substrings
+of the original string, as extracted by the specified extractors.
+In a scalar context, C<extract_multiple> returns the first
+substring successfully extracted from the original string. In both
+scalar and void contexts the original string has the first successfully
+extracted substring removed from it. In all contexts
+C<extract_multiple> starts at the current C<pos> of the string, and
+sets that C<pos> appropriately after it matches.
+
+Hence, the aim of of a call to C<extract_multiple> in a list context
+is to split the processed string into as many non-overlapping fields as
+possible, by repeatedly applying each of the specified extractors
+to the remainder of the string. Thus C<extract_multiple> is
+a generalized form of Perl's C<split> subroutine.
+
+The subroutine takes up to four optional arguments:
+
+=over 4
+
+=item 1.
+
+A string to be processed (C<$_> if the string is omitted or C<undef>)
+
+=item 2.
+
+A reference to a list of subroutine references and/or qr// objects and/or
+literal strings and/or hash references, specifying the extractors
+to be used to split the string. If this argument is omitted (or
+C<undef>) the list:
+
+ [
+ sub { extract_variable($_[0], '') },
+ sub { extract_quotelike($_[0],'') },
+ sub { extract_codeblock($_[0],'{}','') },
+ ]
+
+is used.
+
+=item 3.
+
+An number specifying the maximum number of fields to return. If this
+argument is omitted (or C<undef>), split continues as long as possible.
+
+If the third argument is I<N>, then extraction continues until I<N> fields
+have been successfully extracted, or until the string has been completely
+processed.
+
+Note that in scalar and void contexts the value of this argument is
+automatically reset to 1 (under C<-w>, a warning is issued if the argument
+has to be reset).
+
+=item 4.
+
+A value indicating whether unmatched substrings (see below) within the
+text should be skipped or returned as fields. If the value is true,
+such substrings are skipped. Otherwise, they are returned.
+
+=back
+
+The extraction process works by applying each extractor in
+sequence to the text string.
+
+If the extractor is a subroutine it is called in a list context and is
+expected to return a list of a single element, namely the extracted
+text. It may optionally also return two further arguments: a string
+representing the text left after extraction (like $' for a pattern
+match), and a string representing any prefix skipped before the
+extraction (like $` in a pattern match). Note that this is designed
+to facilitate the use of other Text::Balanced subroutines with
+C<extract_multiple>. Note too that the value returned by an extractor
+subroutine need not bear any relationship to the corresponding substring
+of the original text (see examples below).
+
+If the extractor is a precompiled regular expression or a string,
+it is matched against the text in a scalar context with a leading
+'\G' and the gc modifiers enabled. The extracted value is either
+$1 if that variable is defined after the match, or else the
+complete match (i.e. $&).
+
+If the extractor is a hash reference, it must contain exactly one element.
+The value of that element is one of the
+above extractor types (subroutine reference, regular expression, or string).
+The key of that element is the name of a class into which the successful
+return value of the extractor will be blessed.
+
+If an extractor returns a defined value, that value is immediately
+treated as the next extracted field and pushed onto the list of fields.
+If the extractor was specified in a hash reference, the field is also
+blessed into the appropriate class,
+
+If the extractor fails to match (in the case of a regex extractor), or returns an empty list or an undefined value (in the case of a subroutine extractor), it is
+assumed to have failed to extract.
+If none of the extractor subroutines succeeds, then one
+character is extracted from the start of the text and the extraction
+subroutines reapplied. Characters which are thus removed are accumulated and
+eventually become the next field (unless the fourth argument is true, in which
+case they are discarded).
+
+For example, the following extracts substrings that are valid Perl variables:
+
+ @fields = extract_multiple($text,
+ [ sub { extract_variable($_[0]) } ],
+ undef, 1);
+
+This example separates a text into fields which are quote delimited,
+curly bracketed, and anything else. The delimited and bracketed
+parts are also blessed to identify them (the "anything else" is unblessed):
+
+ @fields = extract_multiple($text,
+ [
+ { Delim => sub { extract_delimited($_[0],q{'"}) } },
+ { Brack => sub { extract_bracketed($_[0],'{}') } },
+ ]);
+
+This call extracts the next single substring that is a valid Perl quotelike
+operator (and removes it from $text):
+
+ $quotelike = extract_multiple($text,
+ [
+ sub { extract_quotelike($_[0]) },
+ ], undef, 1);
+
+Finally, here is yet another way to do comma-separated value parsing:
+
+ @fields = extract_multiple($csv_text,
+ [
+ sub { extract_delimited($_[0],q{'"}) },
+ qr/([^,]+)(.*)/,
+ ],
+ undef,1);
+
+The list in the second argument means:
+I<"Try and extract a ' or " delimited string, otherwise extract anything up to a comma...">.
+The undef third argument means:
+I<"...as many times as possible...">,
+and the true value in the fourth argument means
+I<"...discarding anything else that appears (i.e. the commas)">.
+
+If you wanted the commas preserved as separate fields (i.e. like split
+does if your split pattern has capturing parentheses), you would
+just make the last parameter undefined (or remove it).
+
+=head2 C<gen_delimited_pat>
+
+The C<gen_delimited_pat> subroutine takes a single (string) argument and
+ > builds a Friedl-style optimized regex that matches a string delimited
+by any one of the characters in the single argument. For example:
+
+ gen_delimited_pat(q{'"})
+
+returns the regex:
+
+ (?:\"(?:\\\"|(?!\").)*\"|\'(?:\\\'|(?!\').)*\')
+
+Note that the specified delimiters are automatically quotemeta'd.
+
+A typical use of C<gen_delimited_pat> would be to build special purpose tags
+for C<extract_tagged>. For example, to properly ignore "empty" XML elements
+(which might contain quoted strings):
+
+ my $empty_tag = '<(' . gen_delimited_pat(q{'"}) . '|.)+/>';
+
+ extract_tagged($text, undef, undef, undef, {ignore => [$empty_tag]} );
+
+C<gen_delimited_pat> may also be called with an optional second argument,
+which specifies the "escape" character(s) to be used for each delimiter.
+For example to match a Pascal-style string (where ' is the delimiter
+and '' is a literal ' within the string):
+
+ gen_delimited_pat(q{'},q{'});
+
+Different escape characters can be specified for different delimiters.
+For example, to specify that '/' is the escape for single quotes
+and '%' is the escape for double quotes:
+
+ gen_delimited_pat(q{'"},q{/%});
+
+If more delimiters than escape chars are specified, the last escape char
+is used for the remaining delimiters.
+If no escape char is specified for a given specified delimiter, '\' is used.
+
+=head2 C<delimited_pat>
+
+Note that C<gen_delimited_pat> was previously called C<delimited_pat>.
+That name may still be used, but is now deprecated.
+
+
+=head1 DIAGNOSTICS
+
+In a list context, all the functions return C<(undef,$original_text)>
+on failure. In a scalar context, failure is indicated by returning C<undef>
+(in this case the input text is not modified in any way).
+
+In addition, on failure in I<any> context, the C<$@> variable is set.
+Accessing C<$@-E<gt>{error}> returns one of the error diagnostics listed
+below.
+Accessing C<$@-E<gt>{pos}> returns the offset into the original string at
+which the error was detected (although not necessarily where it occurred!)
+Printing C<$@> directly produces the error message, with the offset appended.
+On success, the C<$@> variable is guaranteed to be C<undef>.
+
+The available diagnostics are:
+
+=over 4
+
+=item C<Did not find a suitable bracket: "%s">
+
+The delimiter provided to C<extract_bracketed> was not one of
+C<'()[]E<lt>E<gt>{}'>.
+
+=item C<Did not find prefix: /%s/>
+
+A non-optional prefix was specified but wasn't found at the start of the text.
+
+=item C<Did not find opening bracket after prefix: "%s">
+
+C<extract_bracketed> or C<extract_codeblock> was expecting a
+particular kind of bracket at the start of the text, and didn't find it.
+
+=item C<No quotelike operator found after prefix: "%s">
+
+C<extract_quotelike> didn't find one of the quotelike operators C<q>,
+C<qq>, C<qw>, C<qx>, C<s>, C<tr> or C<y> at the start of the substring
+it was extracting.
+
+=item C<Unmatched closing bracket: "%c">
+
+C<extract_bracketed>, C<extract_quotelike> or C<extract_codeblock> encountered
+a closing bracket where none was expected.
+
+=item C<Unmatched opening bracket(s): "%s">
+
+C<extract_bracketed>, C<extract_quotelike> or C<extract_codeblock> ran
+out of characters in the text before closing one or more levels of nested
+brackets.
+
+=item C<Unmatched embedded quote (%s)>
+
+C<extract_bracketed> attempted to match an embedded quoted substring, but
+failed to find a closing quote to match it.
+
+=item C<Did not find closing delimiter to match '%s'>
+
+C<extract_quotelike> was unable to find a closing delimiter to match the
+one that opened the quote-like operation.
+
+=item C<Mismatched closing bracket: expected "%c" but found "%s">
+
+C<extract_bracketed>, C<extract_quotelike> or C<extract_codeblock> found
+a valid bracket delimiter, but it was the wrong species. This usually
+indicates a nesting error, but may indicate incorrect quoting or escaping.
+
+=item C<No block delimiter found after quotelike "%s">
+
+C<extract_quotelike> or C<extract_codeblock> found one of the
+quotelike operators C<q>, C<qq>, C<qw>, C<qx>, C<s>, C<tr> or C<y>
+without a suitable block after it.
+
+=item C<Did not find leading dereferencer>
+
+C<extract_variable> was expecting one of '$', '@', or '%' at the start of
+a variable, but didn't find any of them.
+
+=item C<Bad identifier after dereferencer>
+
+C<extract_variable> found a '$', '@', or '%' indicating a variable, but that
+character was not followed by a legal Perl identifier.
+
+=item C<Did not find expected opening bracket at %s>
+
+C<extract_codeblock> failed to find any of the outermost opening brackets
+that were specified.
+
+=item C<Improperly nested codeblock at %s>
+
+A nested code block was found that started with a delimiter that was specified
+as being only to be used as an outermost bracket.
+
+=item C<Missing second block for quotelike "%s">
+
+C<extract_codeblock> or C<extract_quotelike> found one of the
+quotelike operators C<s>, C<tr> or C<y> followed by only one block.
+
+=item C<No match found for opening bracket>
+
+C<extract_codeblock> failed to find a closing bracket to match the outermost
+opening bracket.
+
+=item C<Did not find opening tag: /%s/>
+
+C<extract_tagged> did not find a suitable opening tag (after any specified
+prefix was removed).
+
+=item C<Unable to construct closing tag to match: /%s/>
+
+C<extract_tagged> matched the specified opening tag and tried to
+modify the matched text to produce a matching closing tag (because
+none was specified). It failed to generate the closing tag, almost
+certainly because the opening tag did not start with a
+bracket of some kind.
+
+=item C<Found invalid nested tag: %s>
+
+C<extract_tagged> found a nested tag that appeared in the "reject" list
+(and the failure mode was not "MAX" or "PARA").
+
+=item C<Found unbalanced nested tag: %s>
+
+C<extract_tagged> found a nested opening tag that was not matched by a
+corresponding nested closing tag (and the failure mode was not "MAX" or "PARA").
+
+=item C<Did not find closing tag>
+
+C<extract_tagged> reached the end of the text without finding a closing tag
+to match the original opening tag (and the failure mode was not
+"MAX" or "PARA").
+
+=back
+
+=head1 AUTHOR
+
+Damian Conway (damian@conway.org)
+
+=head1 BUGS AND IRRITATIONS
+
+There are undoubtedly serious bugs lurking somewhere in this code, if
+only because parts of it give the impression of understanding a great deal
+more about Perl than they really do.
+
+Bug reports and other feedback are most welcome.
+
+=head1 COPYRIGHT
+
+Copyright 1997 - 2001 Damian Conway. All Rights Reserved.
+
+Some (minor) parts copyright 2009 Adam Kennedy.
+
+This module is free software. It may be used, redistributed
+and/or modified under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Text/Diff.pm b/Master/tlpkg/tlperl.straw/lib/Text/Diff.pm
new file mode 100755
index 00000000000..8decbbdb407
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Text/Diff.pm
@@ -0,0 +1,713 @@
+package Text::Diff;
+
+use 5.00503;
+use strict;
+use Carp;
+use Exporter ();
+use Algorithm::Diff ();
+use vars qw{$VERSION @ISA @EXPORT};
+BEGIN {
+ $VERSION = '1.37';
+ @ISA = 'Exporter';
+ @EXPORT = 'diff';
+};
+
+## Hunks are made of ops. An op is the starting index for each
+## sequence and the opcode:
+use constant A => 0; # Array index before match/discard
+use constant B => 1;
+use constant OPCODE => 2; # "-", " ", "+"
+use constant FLAG => 3; # What to display if not OPCODE "!"
+
+my %internal_styles = (
+ Unified => undef,
+ Context => undef,
+ OldStyle => undef,
+ Table => undef, ## "internal", but in another module
+);
+
+sub diff {
+ my @seqs = ( shift, shift );
+ my $options = shift || {};
+
+ for my $i ( 0 .. 1 ) {
+ my $seq = $seqs[$i];
+ my $type = ref $seq;
+
+ while ( $type eq "CODE" ) {
+ $seqs[$i] = $seq = $seq->( $options );
+ $type = ref $seq;
+ }
+
+ my $AorB = !$i ? "A" : "B";
+
+ if ( $type eq "ARRAY" ) {
+ ## This is most efficient :)
+ $options->{"OFFSET_$AorB"} = 0
+ unless defined $options->{"OFFSET_$AorB"};
+ }
+ elsif ( $type eq "SCALAR" ) {
+ $seqs[$i] = [split( /^/m, $$seq )];
+ $options->{"OFFSET_$AorB"} = 1
+ unless defined $options->{"OFFSET_$AorB"};
+ }
+ elsif ( ! $type ) {
+ $options->{"OFFSET_$AorB"} = 1
+ unless defined $options->{"OFFSET_$AorB"};
+ $options->{"FILENAME_$AorB"} = $seq
+ unless defined $options->{"FILENAME_$AorB"};
+ $options->{"MTIME_$AorB"} = (stat($seq))[9]
+ unless defined $options->{"MTIME_$AorB"};
+
+ local $/ = "\n";
+ open F, "<$seq" or carp "$!: $seq";
+ $seqs[$i] = [<F>];
+ close F;
+
+ }
+ elsif ( $type eq "GLOB" || UNIVERSAL::isa( $seq, "IO::Handle" ) ) {
+ $options->{"OFFSET_$AorB"} = 1
+ unless defined $options->{"OFFSET_$AorB"};
+ local $/ = "\n";
+ $seqs[$i] = [<$seq>];
+ }
+ else {
+ confess "Can't handle input of type ", ref;
+ }
+ }
+
+ ## Config vars
+ my $output;
+ my $output_handler = $options->{OUTPUT};
+ my $type = ref $output_handler ;
+ if ( ! defined $output_handler ) {
+ $output = "";
+ $output_handler = sub { $output .= shift };
+ }
+ elsif ( $type eq "CODE" ) {
+ ## No problems, mate.
+ }
+ elsif ( $type eq "SCALAR" ) {
+ my $out_ref = $output_handler;
+ $output_handler = sub { $$out_ref .= shift };
+ }
+ elsif ( $type eq "ARRAY" ) {
+ my $out_ref = $output_handler;
+ $output_handler = sub { push @$out_ref, shift };
+ }
+ elsif ( $type eq "GLOB" || UNIVERSAL::isa $output_handler, "IO::Handle" ) {
+ my $output_handle = $output_handler;
+ $output_handler = sub { print $output_handle shift };
+ }
+ else {
+ croak "Unrecognized output type: $type";
+ }
+
+ my $style = $options->{STYLE};
+ $style = "Unified" unless defined $options->{STYLE};
+ $style = "Text::Diff::$style" if exists $internal_styles{$style};
+
+ if ( ! $style->can( "hunk" ) ) {
+ eval "require $style; 1" or die $@;
+ }
+
+ $style = $style->new
+ if ! ref $style && $style->can( "new" );
+
+ my $ctx_lines = $options->{CONTEXT};
+ $ctx_lines = 3 unless defined $ctx_lines;
+ $ctx_lines = 0 if $style->isa( "Text::Diff::OldStyle" );
+
+ my @keygen_args = $options->{KEYGEN_ARGS}
+ ? @{$options->{KEYGEN_ARGS}}
+ : ();
+
+ ## State vars
+ my $diffs = 0; ## Number of discards this hunk
+ my $ctx = 0; ## Number of " " (ctx_lines) ops pushed after last diff.
+ my @ops; ## ops (" ", +, -) in this hunk
+ my $hunks = 0; ## Number of hunks
+
+ my $emit_ops = sub {
+ $output_handler->( $style->file_header( @seqs, $options ) )
+ unless $hunks++;
+ $output_handler->( $style->hunk_header( @seqs, @_, $options ) );
+ $output_handler->( $style->hunk ( @seqs, @_, $options ) );
+ $output_handler->( $style->hunk_footer( @seqs, @_, $options ) );
+ };
+
+ ## We keep 2*ctx_lines so that if a diff occurs
+ ## at 2*ctx_lines we continue to grow the hunk instead
+ ## of emitting diffs and context as we go. We
+ ## need to know the total length of both of the two
+ ## subsequences so the line count can be printed in the
+ ## header.
+ my $dis_a = sub {push @ops, [@_[0,1],"-"]; ++$diffs ; $ctx = 0 };
+ my $dis_b = sub {push @ops, [@_[0,1],"+"]; ++$diffs ; $ctx = 0 };
+
+ Algorithm::Diff::traverse_sequences(
+ @seqs,
+ {
+ MATCH => sub {
+ push @ops, [@_[0,1]," "];
+
+ if ( $diffs && ++$ctx > $ctx_lines * 2 ) {
+ $emit_ops->( [ splice @ops, 0, $#ops - $ctx_lines ] );
+ $ctx = $diffs = 0;
+ }
+
+ ## throw away context lines that aren't needed any more
+ shift @ops if ! $diffs && @ops > $ctx_lines;
+ },
+ DISCARD_A => $dis_a,
+ DISCARD_B => $dis_b,
+ },
+ $options->{KEYGEN}, # pass in user arguments for key gen function
+ @keygen_args,
+ );
+
+ if ( $diffs ) {
+ $#ops -= $ctx - $ctx_lines if $ctx > $ctx_lines;
+ $emit_ops->( \@ops );
+ }
+
+ $output_handler->( $style->file_footer( @seqs, $options ) ) if $hunks;
+
+ return defined $output ? $output : $hunks;
+}
+
+sub _header {
+ my ( $h ) = @_;
+ my ( $p1, $fn1, $t1, $p2, $fn2, $t2 ) = @{$h}{
+ "FILENAME_PREFIX_A",
+ "FILENAME_A",
+ "MTIME_A",
+ "FILENAME_PREFIX_B",
+ "FILENAME_B",
+ "MTIME_B"
+ };
+
+ ## remember to change Text::Diff::Table if this logic is tweaked.
+ return "" unless defined $fn1 && defined $fn2;
+
+ return join( "",
+ $p1, " ", $fn1, defined $t1 ? "\t" . localtime $t1 : (), "\n",
+ $p2, " ", $fn2, defined $t2 ? "\t" . localtime $t2 : (), "\n",
+ );
+}
+
+## _range encapsulates the building of, well, ranges. Turns out there are
+## a few nuances.
+sub _range {
+ my ( $ops, $a_or_b, $format ) = @_;
+
+ my $start = $ops->[ 0]->[$a_or_b];
+ my $after = $ops->[-1]->[$a_or_b];
+
+ ## The sequence indexes in the lines are from *before* the OPCODE is
+ ## executed, so we bump the last index up unless the OP indicates
+ ## it didn't change.
+ ++$after
+ unless $ops->[-1]->[OPCODE] eq ( $a_or_b == A ? "+" : "-" );
+
+ ## convert from 0..n index to 1..(n+1) line number. The unless modifier
+ ## handles diffs with no context, where only one file is affected. In this
+ ## case $start == $after indicates an empty range, and the $start must
+ ## not be incremented.
+ my $empty_range = $start == $after;
+ ++$start unless $empty_range;
+
+ return
+ $start == $after
+ ? $format eq "unified" && $empty_range
+ ? "$start,0"
+ : $start
+ : $format eq "unified"
+ ? "$start,".($after-$start+1)
+ : "$start,$after";
+}
+
+sub _op_to_line {
+ my ( $seqs, $op, $a_or_b, $op_prefixes ) = @_;
+
+ my $opcode = $op->[OPCODE];
+ return () unless defined $op_prefixes->{$opcode};
+
+ my $op_sym = defined $op->[FLAG] ? $op->[FLAG] : $opcode;
+ $op_sym = $op_prefixes->{$op_sym};
+ return () unless defined $op_sym;
+
+ $a_or_b = $op->[OPCODE] ne "+" ? 0 : 1 unless defined $a_or_b;
+ return ( $op_sym, $seqs->[$a_or_b][$op->[$a_or_b]] );
+}
+
+SCOPE: {
+ package Text::Diff::Base;
+
+ sub new {
+ my $proto = shift;
+ return bless { @_ }, ref $proto || $proto;
+ }
+
+ sub file_header { return "" }
+
+ sub hunk_header { return "" }
+
+ sub hunk { return "" }
+
+ sub hunk_footer { return "" }
+
+ sub file_footer { return "" }
+}
+
+@Text::Diff::Unified::ISA = qw( Text::Diff::Base );
+
+sub Text::Diff::Unified::file_header {
+ shift; ## No instance data
+ my $options = pop ;
+
+ _header(
+ { FILENAME_PREFIX_A => "---", FILENAME_PREFIX_B => "+++", %$options }
+ );
+}
+
+sub Text::Diff::Unified::hunk_header {
+ shift; ## No instance data
+ pop; ## Ignore options
+ my $ops = pop;
+
+ return join( "",
+ "@@ -",
+ _range( $ops, A, "unified" ),
+ " +",
+ _range( $ops, B, "unified" ),
+ " @@\n",
+ );
+}
+
+sub Text::Diff::Unified::hunk {
+ shift; ## No instance data
+ pop; ## Ignore options
+ my $ops = pop;
+
+ my $prefixes = { "+" => "+", " " => " ", "-" => "-" };
+
+ return join "", map _op_to_line( \@_, $_, undef, $prefixes ), @$ops
+}
+
+@Text::Diff::Context::ISA = qw( Text::Diff::Base );
+
+sub Text::Diff::Context::file_header {
+ _header { FILENAME_PREFIX_A=>"***", FILENAME_PREFIX_B=>"---", %{$_[-1]} };
+}
+
+sub Text::Diff::Context::hunk_header {
+ return "***************\n";
+}
+
+sub Text::Diff::Context::hunk {
+ shift; ## No instance data
+ pop; ## Ignore options
+ my $ops = pop;
+ ## Leave the sequences in @_[0,1]
+
+ my $a_range = _range( $ops, A, "" );
+ my $b_range = _range( $ops, B, "" );
+
+ ## Sigh. Gotta make sure that differences that aren't adds/deletions
+ ## get prefixed with "!", and that the old opcodes are removed.
+ my $after;
+ for ( my $start = 0; $start <= $#$ops ; $start = $after ) {
+ ## Scan until next difference
+ $after = $start + 1;
+ my $opcode = $ops->[$start]->[OPCODE];
+ next if $opcode eq " ";
+
+ my $bang_it;
+ while ( $after <= $#$ops && $ops->[$after]->[OPCODE] ne " " ) {
+ $bang_it ||= $ops->[$after]->[OPCODE] ne $opcode;
+ ++$after;
+ }
+
+ if ( $bang_it ) {
+ for my $i ( $start..($after-1) ) {
+ $ops->[$i]->[FLAG] = "!";
+ }
+ }
+ }
+
+ my $b_prefixes = { "+" => "+ ", " " => " ", "-" => undef, "!" => "! " };
+ my $a_prefixes = { "+" => undef, " " => " ", "-" => "- ", "!" => "! " };
+
+ return join( "",
+ "*** ", $a_range, " ****\n",
+ map( _op_to_line( \@_, $_, A, $a_prefixes ), @$ops ),
+ "--- ", $b_range, " ----\n",
+ map( _op_to_line( \@_, $_, B, $b_prefixes ), @$ops ),
+ );
+}
+
+@Text::Diff::OldStyle::ISA = qw( Text::Diff::Base );
+
+sub _op {
+ my $ops = shift;
+ my $op = $ops->[0]->[OPCODE];
+ $op = "c" if grep $_->[OPCODE] ne $op, @$ops;
+ $op = "a" if $op eq "+";
+ $op = "d" if $op eq "-";
+ return $op;
+}
+
+sub Text::Diff::OldStyle::hunk_header {
+ shift; ## No instance data
+ pop; ## ignore options
+ my $ops = pop;
+
+ my $op = _op $ops;
+
+ return join "", _range( $ops, A, "" ), $op, _range( $ops, B, "" ), "\n";
+}
+
+sub Text::Diff::OldStyle::hunk {
+ shift; ## No instance data
+ pop; ## ignore options
+ my $ops = pop;
+ ## Leave the sequences in @_[0,1]
+
+ my $a_prefixes = { "+" => undef, " " => undef, "-" => "< " };
+ my $b_prefixes = { "+" => "> ", " " => undef, "-" => undef };
+
+ my $op = _op $ops;
+
+ return join( "",
+ map( _op_to_line( \@_, $_, A, $a_prefixes ), @$ops ),
+ $op eq "c" ? "---\n" : (),
+ map( _op_to_line( \@_, $_, B, $b_prefixes ), @$ops ),
+ );
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Text::Diff - Perform diffs on files and record sets
+
+=head1 SYNOPSIS
+
+ use Text::Diff;
+
+ ## Mix and match filenames, strings, file handles, producer subs,
+ ## or arrays of records; returns diff in a string.
+ ## WARNING: can return B<large> diffs for large files.
+ my $diff = diff "file1.txt", "file2.txt", { STYLE => "Context" };
+ my $diff = diff \$string1, \$string2, \%options;
+ my $diff = diff \*FH1, \*FH2;
+ my $diff = diff \&reader1, \&reader2;
+ my $diff = diff \@records1, \@records2;
+
+ ## May also mix input types:
+ my $diff = diff \@records1, "file_B.txt";
+
+=head1 DESCRIPTION
+
+C<diff()> provides a basic set of services akin to the GNU C<diff> utility. It
+is not anywhere near as feature complete as GNU C<diff>, but it is better
+integrated with Perl and available on all platforms. It is often faster than
+shelling out to a system's C<diff> executable for small files, and generally
+slower on larger files.
+
+Relies on L<Algorithm::Diff> for, well, the algorithm. This may not produce
+the same exact diff as a system's local C<diff> executable, but it will be a
+valid diff and comprehensible by C<patch>. We haven't seen any differences
+between Algorithm::Diff's logic and GNU diff's, but we have not examined them
+to make sure they are indeed identical.
+
+B<Note>: If you don't want to import the C<diff> function, do one of the
+following:
+
+ use Text::Diff ();
+
+ require Text::Diff;
+
+That's a pretty rare occurence, so C<diff()> is exported by default.
+=head1 OPTIONS
+
+diff() takes two parameters from which to draw input and a set of
+options to control it's output. The options are:
+
+=over
+
+=item FILENAME_A, MTIME_A, FILENAME_B, MTIME_B
+
+The name of the file and the modification time "files"
+
+These are filled in automatically for each file when diff() is passed a
+filename, unless a defined value is passed in.
+
+If a filename is not passed in and FILENAME_A and FILENAME_B are not provided
+or C<undef>, the header will not be printed.
+
+Unused on C<OldStyle> diffs.
+
+=item OFFSET_A, OFFSET_B
+
+The index of the first line / element. These default to 1 for all
+parameter types except ARRAY references, for which the default is 0. This
+is because ARRAY references are presumed to be data structures, while the
+others are line oriented text.
+
+=item STYLE
+
+"Unified", "Context", "OldStyle", or an object or class reference for a class
+providing C<file_header()>, C<hunk_header()>, C<hunk()>, C<hunk_footer()> and
+C<file_footer()> methods. The two footer() methods are provided for
+overloading only; none of the formats provide them.
+
+Defaults to "Unified" (unlike standard C<diff>, but Unified is what's most
+often used in submitting patches and is the most human readable of the three.
+
+If the package indicated by the STYLE has no hunk() method, c<diff()> will
+load it automatically (lazy loading). Since all such packages should inherit
+from Text::Diff::Base, this should be marvy.
+
+Styles may be specified as class names (C<STYLE => "Foo"), in which case they
+will be C<new()>ed with no parameters, or as objects (C<STYLE => Foo->new>).
+
+=item CONTEXT
+
+How many lines before and after each diff to display. Ignored on old-style
+diffs. Defaults to 3.
+
+=item OUTPUT
+
+Examples and their equivalent subroutines:
+
+ OUTPUT => \*FOOHANDLE, # like: sub { print FOOHANDLE shift() }
+ OUTPUT => \$output, # like: sub { $output .= shift }
+ OUTPUT => \@output, # like: sub { push @output, shift }
+ OUTPUT => sub { $output .= shift },
+
+If no C<OUTPUT> is supplied, returns the diffs in a string. If
+C<OUTPUT> is a C<CODE> ref, it will be called once with the (optional)
+file header, and once for each hunk body with the text to emit. If
+C<OUTPUT> is an L<IO::Handle>, output will be emitted to that handle.
+
+=item FILENAME_PREFIX_A, FILENAME_PREFIX_B
+
+The string to print before the filename in the header. Unused on C<OldStyle>
+diffs. Defaults are C<"---">, C<"+++"> for Unified and C<"***">, C<"+++"> for
+Context.
+
+=item KEYGEN, KEYGEN_ARGS
+
+These are passed to L<Algorithm::Diff/traverse_sequences>.
+
+=back
+
+B<Note>: if neither C<FILENAME_> option is defined, the header will not be
+printed. If at one is present, the other and both MTIME_ options must be
+present or "Use of undefined variable" warnings will be generated (except
+on C<OldStyle> diffs, which ignores these options).
+
+=head1 Formatting Classes
+
+These functions implement the output formats. They are grouped in to classes
+so diff() can use class names to call the correct set of output routines and so
+that you may inherit from them easily. There are no constructors or instance
+methods for these classes, though subclasses may provide them if need be.
+
+Each class has file_header(), hunk_header(), hunk(), and footer() methods
+identical to those documented in the Text::Diff::Unified section. header() is
+called before the hunk() is first called, footer() afterwards. The default
+footer function is an empty method provided for overloading:
+
+ sub footer { return "End of patch\n" }
+
+Some output formats are provided by external modules (which are loaded
+automatically), such as L<Text::Diff::Table>. These are
+are documented here to keep the documentation simple.
+
+=head2 Text::Diff::Base
+
+Returns "" for all methods (other than C<new()>).
+
+=head2 Text::Diff::Unified
+
+ --- A Mon Nov 12 23:49:30 2001
+ +++ B Mon Nov 12 23:49:30 2001
+ @@ -2,13 +2,13 @@
+ 2
+ 3
+ 4
+ -5d
+ +5a
+ 6
+ 7
+ 8
+ 9
+ +9a
+ 10
+ 11
+ -11d
+ 12
+ 13
+
+=over
+
+=item file_header
+
+ $s = Text::Diff::Unified->file_header( $options );
+
+Returns a string containing a unified header. The sole parameter is the
+options hash passed in to diff(), containing at least:
+
+ FILENAME_A => $fn1,
+ MTIME_A => $mtime1,
+ FILENAME_B => $fn2,
+ MTIME_B => $mtime2
+
+May also contain
+
+ FILENAME_PREFIX_A => "---",
+ FILENAME_PREFIX_B => "+++",
+
+to override the default prefixes (default values shown).
+
+=item hunk_header
+
+ Text::Diff::Unified->hunk_header( \@ops, $options );
+
+Returns a string containing the output of one hunk of unified diff.
+
+=item Text::Diff::Unified::hunk
+
+ Text::Diff::Unified->hunk( \@seq_a, \@seq_b, \@ops, $options );
+
+Returns a string containing the output of one hunk of unified diff.
+
+=back
+
+=head2 Text::Diff::Table
+
+ +--+----------------------------------+--+------------------------------+
+ | |../Test-Differences-0.2/MANIFEST | |../Test-Differences/MANIFEST |
+ | |Thu Dec 13 15:38:49 2001 | |Sat Dec 15 02:09:44 2001 |
+ +--+----------------------------------+--+------------------------------+
+ | | * 1|Changes *
+ | 1|Differences.pm | 2|Differences.pm |
+ | 2|MANIFEST | 3|MANIFEST |
+ | | * 4|MANIFEST.SKIP *
+ | 3|Makefile.PL | 5|Makefile.PL |
+ | | * 6|t/00escape.t *
+ | 4|t/00flatten.t | 7|t/00flatten.t |
+ | 5|t/01text_vs_data.t | 8|t/01text_vs_data.t |
+ | 6|t/10test.t | 9|t/10test.t |
+ +--+----------------------------------+--+------------------------------+
+
+This format also goes to some pains to highlight "invisible" characters on
+differing elements by selectively escaping whitespace:
+
+ +--+--------------------------+--------------------------+
+ | |demo_ws_A.txt |demo_ws_B.txt |
+ | |Fri Dec 21 08:36:32 2001 |Fri Dec 21 08:36:50 2001 |
+ +--+--------------------------+--------------------------+
+ | 1|identical |identical |
+ * 2| spaced in | also spaced in *
+ * 3|embedded space |embedded tab *
+ | 4|identical |identical |
+ * 5| spaced in |\ttabbed in *
+ * 6|trailing spaces\s\s\n |trailing tabs\t\t\n *
+ | 7|identical |identical |
+ * 8|lf line\n |crlf line\r\n *
+ * 9|embedded ws |embedded\tws *
+ +--+--------------------------+--------------------------+
+
+See L</Text::Diff::Table> for more details, including how the whitespace
+escaping works.
+
+=head2 Text::Diff::Context
+
+ *** A Mon Nov 12 23:49:30 2001
+ --- B Mon Nov 12 23:49:30 2001
+ ***************
+ *** 2,14 ****
+ 2
+ 3
+ 4
+ ! 5d
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ - 11d
+ 12
+ 13
+ --- 2,14 ----
+ 2
+ 3
+ 4
+ ! 5a
+ 6
+ 7
+ 8
+ 9
+ + 9a
+ 10
+ 11
+ 12
+ 13
+
+Note: hunk_header() returns only "***************\n".
+
+=head2 Text::Diff::OldStyle
+
+ 5c5
+ < 5d
+ ---
+ > 5a
+ 9a10
+ > 9a
+ 12d12
+ < 11d
+
+Note: no file_header().
+
+=head1 LIMITATIONS
+
+Must suck both input files entirely in to memory and store them with a normal
+amount of Perlish overhead (one array location) per record. This is implied by
+the implementation of Algorithm::Diff, which takes two arrays. If
+Algorithm::Diff ever offers an incremental mode, this can be changed (contact
+the maintainers of Algorithm::Diff and Text::Diff if you need this; it
+shouldn't be too terribly hard to tie arrays in this fashion).
+
+Does not provide most of the more refined GNU diff options: recursive directory
+tree scanning, ignoring blank lines / whitespace, etc., etc. These can all be
+added as time permits and need arises, many are rather easy; patches quite
+welcome.
+
+Uses closures internally, this may lead to leaks on C<perl> versions 5.6.1 and
+prior if used many times over a process' life time.
+
+=head1 AUTHOR
+
+Adam Kennedy E<lt>adamk@cpan.orgE<gt>
+
+Barrie Slaymaker E<lt>barries@slaysys.comE<gt>
+
+=head1 COPYRIGHT
+
+Some parts copyright 2009 Adam Kennedy.
+
+Copyright 2001 Barrie Slaymaker. All Rights Reserved.
+
+You may use this under the terms of either the Artistic License or GNU Public
+License v 2.0 or greater.
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Text/Diff/Table.pm b/Master/tlpkg/tlperl.straw/lib/Text/Diff/Table.pm
new file mode 100755
index 00000000000..c34ef2c9664
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Text/Diff/Table.pm
@@ -0,0 +1,408 @@
+package Text::Diff::Table;
+
+use 5.00503;
+use strict;
+use Carp;
+use vars qw{$VERSION @ISA @EXPORT_OK};
+BEGIN {
+ $VERSION = '1.37';
+ @ISA = qw( Text::Diff::Base Exporter );
+ @EXPORT_OK = qw( expand_tabs );
+}
+
+my %escapes = map {
+ my $c =
+ $_ eq '"' || $_ eq '$' ? qq{'$_'}
+ : $_ eq "\\" ? qq{"\\\\"}
+ : qq{"$_"};
+ ( ord eval $c => $_ )
+} (
+ map( chr, 32..126),
+ map( sprintf( "\\x%02x", $_ ), ( 0..31, 127..255 ) ),
+# map( "\\c$_", "A".."Z"),
+ "\\t", "\\n", "\\r", "\\f", "\\b", "\\a", "\\e"
+ ## NOTE: "\\\\" is not here because some things are explicitly
+ ## escaped before escape() is called and we don't want to
+ ## double-escape "\". Also, in most texts, leaving "\" more
+ ## readable makes sense.
+);
+
+sub expand_tabs($) {
+ my $s = shift;
+ my $count = 0;
+ $s =~ s{(\t)(\t*)|([^\t]+)}{
+ if ( $1 ) {
+ my $spaces = " " x ( 8 - $count % 8 + 8 * length $2 );
+ $count = 0;
+ $spaces;
+ }
+ else {
+ $count += length $3;
+ $3;
+ }
+ }ge;
+
+ return $s;
+}
+
+sub trim_trailing_line_ends($) {
+ my $s = shift;
+ $s =~ s/[\r\n]+(?!\n)$//;
+ return $s;
+}
+
+sub escape($);
+
+SCOPE: {
+ ## use utf8 if available. don't if not.
+ my $escaper = <<'EOCODE';
+ sub escape($) {
+ use utf8;
+ join "", map {
+ $_ = ord;
+ exists $escapes{$_}
+ ? $escapes{$_}
+ : sprintf( "\\x{%04x}", $_ );
+ } split //, shift;
+ }
+
+ 1;
+EOCODE
+ unless ( eval $escaper ) {
+ $escaper =~ s/ *use *utf8 *;\n// or die "Can't drop use utf8;";
+ eval $escaper or die $@;
+ }
+}
+
+sub new {
+ my $proto = shift;
+ return bless { @_ }, $proto
+}
+
+my $missing_elt = [ "", "" ];
+
+sub hunk {
+ my $self = shift;
+ my @seqs = ( shift, shift );
+ my $ops = shift; ## Leave sequences in @_[0,1]
+ my $options = shift;
+
+ my ( @A, @B );
+ for ( @$ops ) {
+ my $opcode = $_->[Text::Diff::OPCODE()];
+ if ( $opcode eq " " ) {
+ push @A, $missing_elt while @A < @B;
+ push @B, $missing_elt while @B < @A;
+ }
+ push @A, [ $_->[0] + ( $options->{OFFSET_A} || 0), $seqs[0][$_->[0]] ]
+ if $opcode eq " " || $opcode eq "-";
+ push @B, [ $_->[1] + ( $options->{OFFSET_B} || 0), $seqs[1][$_->[1]] ]
+ if $opcode eq " " || $opcode eq "+";
+ }
+
+ push @A, $missing_elt while @A < @B;
+ push @B, $missing_elt while @B < @A;
+ my @elts;
+ for ( 0..$#A ) {
+ my ( $A, $B ) = (shift @A, shift @B );
+
+ ## Do minimal cleaning on identical elts so these look "normal":
+ ## tabs are expanded, trailing newelts removed, etc. For differing
+ ## elts, make invisible characters visible if the invisible characters
+ ## differ.
+ my $elt_type = $B == $missing_elt ? "A" :
+ $A == $missing_elt ? "B" :
+ $A->[1] eq $B->[1] ? "="
+ : "*";
+ if ( $elt_type ne "*" ) {
+ if ( $elt_type eq "=" || $A->[1] =~ /\S/ || $B->[1] =~ /\S/ ) {
+ $A->[1] = escape trim_trailing_line_ends expand_tabs $A->[1];
+ $B->[1] = escape trim_trailing_line_ends expand_tabs $B->[1];
+ }
+ else {
+ $A->[1] = escape $A->[1];
+ $B->[1] = escape $B->[1];
+ }
+ }
+ else {
+ ## not using \z here for backcompat reasons.
+ $A->[1] =~ /^(\s*?)([^ \t].*?)?(\s*)(?![\n\r])$/s;
+ my ( $l_ws_A, $body_A, $t_ws_A ) = ( $1, $2, $3 );
+ $body_A = "" unless defined $body_A;
+ $B->[1] =~ /^(\s*?)([^ \t].*?)?(\s*)(?![\n\r])$/s;
+ my ( $l_ws_B, $body_B, $t_ws_B ) = ( $1, $2, $3 );
+ $body_B = "" unless defined $body_B;
+
+ my $added_escapes;
+
+ if ( $l_ws_A ne $l_ws_B ) {
+ ## Make leading tabs visible. Other non-' ' chars
+ ## will be dealt with in escape(), but this prevents
+ ## tab expansion from hiding tabs by making them
+ ## look like ' '.
+ $added_escapes = 1 if $l_ws_A =~ s/\t/\\t/g;
+ $added_escapes = 1 if $l_ws_B =~ s/\t/\\t/g;
+ }
+
+ if ( $t_ws_A ne $t_ws_B ) {
+ ## Only trailing whitespace gets the \s treatment
+ ## to make it obvious what's going on.
+ $added_escapes = 1 if $t_ws_A =~ s/ /\\s/g;
+ $added_escapes = 1 if $t_ws_B =~ s/ /\\s/g;
+ $added_escapes = 1 if $t_ws_A =~ s/\t/\\t/g;
+ $added_escapes = 1 if $t_ws_B =~ s/\t/\\t/g;
+ }
+ else {
+ $t_ws_A = $t_ws_B = "";
+ }
+
+ my $do_tab_escape = $added_escapes || do {
+ my $expanded_A = expand_tabs join( $body_A, $l_ws_A, $t_ws_A );
+ my $expanded_B = expand_tabs join( $body_B, $l_ws_B, $t_ws_B );
+ $expanded_A eq $expanded_B;
+ };
+
+ my $do_back_escape = $do_tab_escape || do {
+ my ( $unescaped_A, $escaped_A,
+ $unescaped_B, $escaped_B
+ ) =
+ map
+ join( "", /(\\.)/g ),
+ map {
+ ( $_, escape $_ )
+ }
+ expand_tabs join( $body_A, $l_ws_A, $t_ws_A ),
+ expand_tabs join( $body_B, $l_ws_B, $t_ws_B );
+ $unescaped_A ne $unescaped_B && $escaped_A eq $escaped_B;
+ };
+
+ if ( $do_back_escape ) {
+ $body_A =~ s/\\/\\\\/g;
+ $body_B =~ s/\\/\\\\/g;
+ }
+
+ my $line_A = join $body_A, $l_ws_A, $t_ws_A;
+ my $line_B = join $body_B, $l_ws_B, $t_ws_B;
+
+ unless ( $do_tab_escape ) {
+ $line_A = expand_tabs $line_A;
+ $line_B = expand_tabs $line_B;
+ }
+
+ $A->[1] = escape $line_A;
+ $B->[1] = escape $line_B;
+ }
+
+ push @elts, [ @$A, @$B, $elt_type ];
+ }
+
+ push @{$self->{ELTS}}, @elts, ["bar"];
+ return "";
+}
+
+sub _glean_formats {
+ my $self = shift;
+}
+
+sub file_footer {
+ my $self = shift;
+ my @seqs = (shift,shift);
+ my $options = pop;
+
+ my @heading_lines;
+
+ if ( defined $options->{FILENAME_A} || defined $options->{FILENAME_B} ) {
+ push @heading_lines, [
+ map(
+ {
+ ( "", escape( defined $_ ? $_ : "<undef>" ) );
+ }
+ ( @{$options}{qw( FILENAME_A FILENAME_B)} )
+ ),
+ "=",
+ ];
+ }
+
+ if ( defined $options->{MTIME_A} || defined $options->{MTIME_B} ) {
+ push @heading_lines, [
+ map( {
+ ( "",
+ escape(
+ ( defined $_ && length $_ )
+ ? localtime $_
+ : ""
+ )
+ );
+ }
+ @{$options}{qw( MTIME_A MTIME_B )}
+ ),
+ "=",
+ ];
+ }
+
+ if ( defined $options->{INDEX_LABEL} ) {
+ push @heading_lines, [ "", "", "", "", "=" ] unless @heading_lines;
+ $heading_lines[-1]->[0] = $heading_lines[-1]->[2] =
+ $options->{INDEX_LABEL};
+ }
+
+ ## Not ushifting on to @{$self->{ELTS}} in case it's really big. Want
+ ## to avoid the overhead.
+
+ my $four_column_mode = 0;
+ for my $cols ( @heading_lines, @{$self->{ELTS}} ) {
+ next if $cols->[-1] eq "bar";
+ if ( $cols->[0] ne $cols->[2] ) {
+ $four_column_mode = 1;
+ last;
+ }
+ }
+
+ unless ( $four_column_mode ) {
+ for my $cols ( @heading_lines, @{$self->{ELTS}} ) {
+ next if $cols->[-1] eq "bar";
+ splice @$cols, 2, 1;
+ }
+ }
+
+ my @w = (0,0,0,0);
+ for my $cols ( @heading_lines, @{$self->{ELTS}} ) {
+ next if $cols->[-1] eq "bar";
+ for my $i (0..($#$cols-1)) {
+ $w[$i] = length $cols->[$i]
+ if defined $cols->[$i] && length $cols->[$i] > $w[$i];
+ }
+ }
+
+ my %fmts = $four_column_mode
+ ? (
+ "=" => "| %$w[0]s|%-$w[1]s | %$w[2]s|%-$w[3]s |\n",
+ "A" => "* %$w[0]s|%-$w[1]s * %$w[2]s|%-$w[3]s |\n",
+ "B" => "| %$w[0]s|%-$w[1]s * %$w[2]s|%-$w[3]s *\n",
+ "*" => "* %$w[0]s|%-$w[1]s * %$w[2]s|%-$w[3]s *\n",
+ )
+ : (
+ "=" => "| %$w[0]s|%-$w[1]s |%-$w[2]s |\n",
+ "A" => "* %$w[0]s|%-$w[1]s |%-$w[2]s |\n",
+ "B" => "| %$w[0]s|%-$w[1]s |%-$w[2]s *\n",
+ "*" => "* %$w[0]s|%-$w[1]s |%-$w[2]s *\n",
+ );
+
+ $fmts{bar} = sprintf $fmts{"="}, "", "", "", "";
+ $fmts{bar} =~ s/\S/+/g;
+ $fmts{bar} =~ s/ /-/g;
+ return join( "",
+ map {
+ sprintf( $fmts{$_->[-1]}, @$_ )
+ } (
+ ["bar"],
+ @heading_lines,
+ @heading_lines ? ["bar"] : (),
+ @{$self->{ELTS}},
+ ),
+ );
+
+ @{$self->{ELTS}} = [];
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+ Text::Diff::Table - Text::Diff plugin to generate "table" format output
+
+=head1 SYNOPSIS
+
+ use Text::Diff;
+
+ diff \@a, $b { STYLE => "Table" };
+
+=head1 DESCRIPTION
+
+This is a plugin output formatter for Text::Diff that generates "table" style
+diffs:
+
+ +--+----------------------------------+--+------------------------------+
+ | |../Test-Differences-0.2/MANIFEST | |../Test-Differences/MANIFEST |
+ | |Thu Dec 13 15:38:49 2001 | |Sat Dec 15 02:09:44 2001 |
+ +--+----------------------------------+--+------------------------------+
+ | | * 1|Changes *
+ | 1|Differences.pm | 2|Differences.pm |
+ | 2|MANIFEST | 3|MANIFEST |
+ | | * 4|MANIFEST.SKIP *
+ | 3|Makefile.PL | 5|Makefile.PL |
+ | | * 6|t/00escape.t *
+ | 4|t/00flatten.t | 7|t/00flatten.t |
+ | 5|t/01text_vs_data.t | 8|t/01text_vs_data.t |
+ | 6|t/10test.t | 9|t/10test.t |
+ +--+----------------------------------+--+------------------------------+
+
+This format also goes to some pains to highlight "invisible" characters on
+differing elements by selectively escaping whitespace. Each element is split
+in to three segments (leading whitespace, body, trailing whitespace). If
+whitespace differs in a segement, that segment is whitespace escaped.
+
+Here is an example of the selective whitespace.
+
+ +--+--------------------------+--------------------------+
+ | |demo_ws_A.txt |demo_ws_B.txt |
+ | |Fri Dec 21 08:36:32 2001 |Fri Dec 21 08:36:50 2001 |
+ +--+--------------------------+--------------------------+
+ | 1|identical |identical |
+ * 2| spaced in | also spaced in *
+ * 3|embedded space |embedded tab *
+ | 4|identical |identical |
+ * 5| spaced in |\ttabbed in *
+ * 6|trailing spaces\s\s\n |trailing tabs\t\t\n *
+ | 7|identical |identical |
+ * 8|lf line\n |crlf line\r\n *
+ * 9|embedded ws |embedded\tws *
+ +--+--------------------------+--------------------------+
+
+Here's why the lines do or do not have whitespace escaped:
+
+=over
+
+=item lines 1, 4, 7 don't differ, no need.
+
+=item lines 2, 3 differ in non-whitespace, no need.
+
+=item lines 5, 6, 8, 9 all have subtle ws changes.
+
+=back
+
+Whether or not line 3 should have that tab character escaped is a judgement
+call; so far I'm choosing not to.
+
+=head1 LIMITATIONS
+
+Table formatting requires buffering the entire diff in memory in order to
+calculate column widths. This format should only be used for smaller
+diffs.
+
+Assumes tab stops every 8 characters, as $DIETY intended.
+
+Assumes all character codes >= 127 need to be escaped as hex codes, ie that the
+user's terminal is ASCII, and not even "high bit ASCII", capable. This can be
+made an option when the need arises.
+
+Assumes that control codes (character codes 0..31) that don't have slash-letter
+escapes ("\n", "\r", etc) in Perl are best presented as hex escapes ("\x01")
+instead of octal ("\001") or control-code ("\cA") escapes.
+
+=head1 AUTHOR
+
+Barrie Slaymaker E<lt>barries@slaysys.comE<gt>
+
+=head1 LICENSE
+
+Copyright 2001 Barrie Slaymaker, All Rights Reserved.
+
+You may use this software under the terms of the GNU public license, any
+version, or the Artistic license.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Text/Glob.pm b/Master/tlpkg/tlperl.straw/lib/Text/Glob.pm
new file mode 100755
index 00000000000..2d3436f1ac1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Text/Glob.pm
@@ -0,0 +1,195 @@
+package Text::Glob;
+use strict;
+use Exporter;
+use vars qw/$VERSION @ISA @EXPORT_OK
+ $strict_leading_dot $strict_wildcard_slash/;
+$VERSION = '0.08';
+@ISA = 'Exporter';
+@EXPORT_OK = qw( glob_to_regex glob_to_regex_string match_glob );
+
+$strict_leading_dot = 1;
+$strict_wildcard_slash = 1;
+
+use constant debug => 0;
+
+sub glob_to_regex {
+ my $glob = shift;
+ my $regex = glob_to_regex_string($glob);
+ return qr/^$regex$/;
+}
+
+sub glob_to_regex_string
+{
+ my $glob = shift;
+ my ($regex, $in_curlies, $escaping);
+ local $_;
+ my $first_byte = 1;
+ for ($glob =~ m/(.)/gs) {
+ if ($first_byte) {
+ if ($strict_leading_dot) {
+ $regex .= '(?=[^\.])' unless $_ eq '.';
+ }
+ $first_byte = 0;
+ }
+ if ($_ eq '/') {
+ $first_byte = 1;
+ }
+ if ($_ eq '.' || $_ eq '(' || $_ eq ')' || $_ eq '|' ||
+ $_ eq '+' || $_ eq '^' || $_ eq '$' || $_ eq '@' || $_ eq '%' ) {
+ $regex .= "\\$_";
+ }
+ elsif ($_ eq '*') {
+ $regex .= $escaping ? "\\*" :
+ $strict_wildcard_slash ? "[^/]*" : ".*";
+ }
+ elsif ($_ eq '?') {
+ $regex .= $escaping ? "\\?" :
+ $strict_wildcard_slash ? "[^/]" : ".";
+ }
+ elsif ($_ eq '{') {
+ $regex .= $escaping ? "\\{" : "(";
+ ++$in_curlies unless $escaping;
+ }
+ elsif ($_ eq '}' && $in_curlies) {
+ $regex .= $escaping ? "}" : ")";
+ --$in_curlies unless $escaping;
+ }
+ elsif ($_ eq ',' && $in_curlies) {
+ $regex .= $escaping ? "," : "|";
+ }
+ elsif ($_ eq "\\") {
+ if ($escaping) {
+ $regex .= "\\\\";
+ $escaping = 0;
+ }
+ else {
+ $escaping = 1;
+ }
+ next;
+ }
+ else {
+ $regex .= $_;
+ $escaping = 0;
+ }
+ $escaping = 0;
+ }
+ print "# $glob $regex\n" if debug;
+
+ return $regex;
+}
+
+sub match_glob {
+ print "# ", join(', ', map { "'$_'" } @_), "\n" if debug;
+ my $glob = shift;
+ my $regex = glob_to_regex $glob;
+ local $_;
+ grep { $_ =~ $regex } @_;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Text::Glob - match globbing patterns against text
+
+=head1 SYNOPSIS
+
+ use Text::Glob qw( match_glob glob_to_regex );
+
+ print "matched\n" if match_glob( "foo.*", "foo.bar" );
+
+ # prints foo.bar and foo.baz
+ my $regex = glob_to_regex( "foo.*" );
+ for ( qw( foo.bar foo.baz foo bar ) ) {
+ print "matched: $_\n" if /$regex/;
+ }
+
+=head1 DESCRIPTION
+
+Text::Glob implements glob(3) style matching that can be used to match
+against text, rather than fetching names from a filesystem. If you
+want to do full file globbing use the File::Glob module instead.
+
+=head2 Routines
+
+=over
+
+=item match_glob( $glob, @things_to_test )
+
+Returns the list of things which match the glob from the source list.
+
+=item glob_to_regex( $glob )
+
+Returns a compiled regex which is the equiavlent of the globbing
+pattern.
+
+=item glob_to_regex_string( $glob )
+
+Returns a regex string which is the equiavlent of the globbing
+pattern.
+
+=back
+
+=head1 SYNTAX
+
+The following metacharacters and rules are respected.
+
+=over
+
+=item C<*> - match zero or more characters
+
+C<a*> matches C<a>, C<aa>, C<aaaa> and many many more.
+
+=item C<?> - match exactly one character
+
+C<a?> matches C<aa>, but not C<a>, or C<aa>
+
+=item Character sets/ranges
+
+C<example.[ch]> matches C<example.c> and C<example.h>
+
+C<demo.[a-c]> matches C<demo.a>, C<demo.b>, and C<demo.c>
+
+=item alternation
+
+C<example.{foo,bar,baz}> matches C<example.foo>, C<example.bar>, and
+C<example.baz>
+
+=item leading . must be explictly matched
+
+C<*.foo> does not match C<.bar.foo>. For this you must either specify
+the leading . in the glob pattern (C<.*.foo>), or set
+C<$Text::Glob::strict_leading_dot> to a false value while compiling
+the regex.
+
+=item C<*> and C<?> do not match /
+
+C<*.foo> does not match C<bar/baz.foo>. For this you must either
+explicitly match the / in the glob (C<*/*.foo>), or set
+C<$Text::Glob::strict_wildcard_slash> to a false value with compiling
+the regex.
+
+=back
+
+=head1 BUGS
+
+The code uses qr// to produce compiled regexes, therefore this module
+requires perl version 5.005_03 or newer.
+
+=head1 AUTHOR
+
+Richard Clamp <richardc@unixbeard.net>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002, 2003, 2006, 2007 Richard Clamp. All Rights Reserved.
+
+This module is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<File::Glob>, glob(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Text/ParseWords.pm b/Master/tlpkg/tlperl.straw/lib/Text/ParseWords.pm
new file mode 100755
index 00000000000..f1b5937904e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Text/ParseWords.pm
@@ -0,0 +1,294 @@
+package Text::ParseWords;
+
+use strict;
+require 5.006;
+our $VERSION = "3.27";
+
+
+use Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT = qw(shellwords quotewords nested_quotewords parse_line);
+our @EXPORT_OK = qw(old_shellwords);
+our $PERL_SINGLE_QUOTE;
+
+
+sub shellwords {
+ my (@lines) = @_;
+ my @allwords;
+
+ foreach my $line (@lines) {
+ $line =~ s/^\s+//;
+ my @words = parse_line('\s+', 0, $line);
+ pop @words if (@words and !defined $words[-1]);
+ return() unless (@words || !length($line));
+ push(@allwords, @words);
+ }
+ return(@allwords);
+}
+
+
+
+sub quotewords {
+ my($delim, $keep, @lines) = @_;
+ my($line, @words, @allwords);
+
+ foreach $line (@lines) {
+ @words = parse_line($delim, $keep, $line);
+ return() unless (@words || !length($line));
+ push(@allwords, @words);
+ }
+ return(@allwords);
+}
+
+
+
+sub nested_quotewords {
+ my($delim, $keep, @lines) = @_;
+ my($i, @allwords);
+
+ for ($i = 0; $i < @lines; $i++) {
+ @{$allwords[$i]} = parse_line($delim, $keep, $lines[$i]);
+ return() unless (@{$allwords[$i]} || !length($lines[$i]));
+ }
+ return(@allwords);
+}
+
+
+
+sub parse_line {
+ my($delimiter, $keep, $line) = @_;
+ my($word, @pieces);
+
+ no warnings 'uninitialized'; # we will be testing undef strings
+
+ while (length($line)) {
+ # This pattern is optimised to be stack conservative on older perls.
+ # Do not refactor without being careful and testing it on very long strings.
+ # See Perl bug #42980 for an example of a stack busting input.
+ $line =~ s/^
+ (?:
+ # double quoted string
+ (") # $quote
+ ((?>[^\\"]*(?:\\.[^\\"]*)*))" # $quoted
+ | # --OR--
+ # singe quoted string
+ (') # $quote
+ ((?>[^\\']*(?:\\.[^\\']*)*))' # $quoted
+ | # --OR--
+ # unquoted string
+ ( # $unquoted
+ (?:\\.|[^\\"'])*?
+ )
+ # followed by
+ ( # $delim
+ \Z(?!\n) # EOL
+ | # --OR--
+ (?-x:$delimiter) # delimiter
+ | # --OR--
+ (?!^)(?=["']) # a quote
+ )
+ )//xs or return; # extended layout
+ my ($quote, $quoted, $unquoted, $delim) = (($1 ? ($1,$2) : ($3,$4)), $5, $6);
+
+
+ return() unless( defined($quote) || length($unquoted) || length($delim));
+
+ if ($keep) {
+ $quoted = "$quote$quoted$quote";
+ }
+ else {
+ $unquoted =~ s/\\(.)/$1/sg;
+ if (defined $quote) {
+ $quoted =~ s/\\(.)/$1/sg if ($quote eq '"');
+ $quoted =~ s/\\([\\'])/$1/g if ( $PERL_SINGLE_QUOTE && $quote eq "'");
+ }
+ }
+ $word .= substr($line, 0, 0); # leave results tainted
+ $word .= defined $quote ? $quoted : $unquoted;
+
+ if (length($delim)) {
+ push(@pieces, $word);
+ push(@pieces, $delim) if ($keep eq 'delimiters');
+ undef $word;
+ }
+ if (!length($line)) {
+ push(@pieces, $word);
+ }
+ }
+ return(@pieces);
+}
+
+
+
+sub old_shellwords {
+
+ # Usage:
+ # use ParseWords;
+ # @words = old_shellwords($line);
+ # or
+ # @words = old_shellwords(@lines);
+ # or
+ # @words = old_shellwords(); # defaults to $_ (and clobbers it)
+
+ no warnings 'uninitialized'; # we will be testing undef strings
+ local *_ = \join('', @_) if @_;
+ my (@words, $snippet);
+
+ s/\A\s+//;
+ while ($_ ne '') {
+ my $field = substr($_, 0, 0); # leave results tainted
+ for (;;) {
+ if (s/\A"(([^"\\]|\\.)*)"//s) {
+ ($snippet = $1) =~ s#\\(.)#$1#sg;
+ }
+ elsif (/\A"/) {
+ require Carp;
+ Carp::carp("Unmatched double quote: $_");
+ return();
+ }
+ elsif (s/\A'(([^'\\]|\\.)*)'//s) {
+ ($snippet = $1) =~ s#\\(.)#$1#sg;
+ }
+ elsif (/\A'/) {
+ require Carp;
+ Carp::carp("Unmatched single quote: $_");
+ return();
+ }
+ elsif (s/\A\\(.?)//s) {
+ $snippet = $1;
+ }
+ elsif (s/\A([^\s\\'"]+)//) {
+ $snippet = $1;
+ }
+ else {
+ s/\A\s+//;
+ last;
+ }
+ $field .= $snippet;
+ }
+ push(@words, $field);
+ }
+ return @words;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Text::ParseWords - parse text into an array of tokens or array of arrays
+
+=head1 SYNOPSIS
+
+ use Text::ParseWords;
+ @lists = nested_quotewords($delim, $keep, @lines);
+ @words = quotewords($delim, $keep, @lines);
+ @words = shellwords(@lines);
+ @words = parse_line($delim, $keep, $line);
+ @words = old_shellwords(@lines); # DEPRECATED!
+
+=head1 DESCRIPTION
+
+The &nested_quotewords() and &quotewords() functions accept a delimiter
+(which can be a regular expression)
+and a list of lines and then breaks those lines up into a list of
+words ignoring delimiters that appear inside quotes. &quotewords()
+returns all of the tokens in a single long list, while &nested_quotewords()
+returns a list of token lists corresponding to the elements of @lines.
+&parse_line() does tokenizing on a single string. The &*quotewords()
+functions simply call &parse_line(), so if you're only splitting
+one line you can call &parse_line() directly and save a function
+call.
+
+The $keep argument is a boolean flag. If true, then the tokens are
+split on the specified delimiter, but all other characters (quotes,
+backslashes, etc.) are kept in the tokens. If $keep is false then the
+&*quotewords() functions remove all quotes and backslashes that are
+not themselves backslash-escaped or inside of single quotes (i.e.,
+&quotewords() tries to interpret these characters just like the Bourne
+shell). NB: these semantics are significantly different from the
+original version of this module shipped with Perl 5.000 through 5.004.
+As an additional feature, $keep may be the keyword "delimiters" which
+causes the functions to preserve the delimiters in each string as
+tokens in the token lists, in addition to preserving quote and
+backslash characters.
+
+&shellwords() is written as a special case of &quotewords(), and it
+does token parsing with whitespace as a delimiter-- similar to most
+Unix shells.
+
+=head1 EXAMPLES
+
+The sample program:
+
+ use Text::ParseWords;
+ @words = quotewords('\s+', 0, q{this is "a test" of\ quotewords \"for you});
+ $i = 0;
+ foreach (@words) {
+ print "$i: <$_>\n";
+ $i++;
+ }
+
+produces:
+
+ 0: <this>
+ 1: <is>
+ 2: <a test>
+ 3: <of quotewords>
+ 4: <"for>
+ 5: <you>
+
+demonstrating:
+
+=over 4
+
+=item 0
+
+a simple word
+
+=item 1
+
+multiple spaces are skipped because of our $delim
+
+=item 2
+
+use of quotes to include a space in a word
+
+=item 3
+
+use of a backslash to include a space in a word
+
+=item 4
+
+use of a backslash to remove the special meaning of a double-quote
+
+=item 5
+
+another simple word (note the lack of effect of the
+backslashed double-quote)
+
+=back
+
+Replacing C<quotewords('\s+', 0, q{this is...})>
+with C<shellwords(q{this is...})>
+is a simpler way to accomplish the same thing.
+
+=head1 AUTHORS
+
+Maintainer: Alexandr Ciornii <alexchornyATgmail.com>.
+
+Previous maintainer: Hal Pomeranz <pomeranz@netcom.com>, 1994-1997 (Original
+author unknown). Much of the code for &parse_line() (including the
+primary regexp) from Joerk Behrends <jbehrends@multimediaproduzenten.de>.
+
+Examples section another documentation provided by John Heidemann
+<johnh@ISI.EDU>
+
+Bug reports, patches, and nagging provided by lots of folks-- thanks
+everybody! Special thanks to Michael Schwern <schwern@envirolink.org>
+for assuring me that a &nested_quotewords() would be useful, and to
+Jeff Friedl <jfriedl@yahoo-inc.com> for telling me not to worry about
+error-checking (sort of-- you had to be there).
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Text/Soundex.pm b/Master/tlpkg/tlperl.straw/lib/Text/Soundex.pm
new file mode 100755
index 00000000000..5d702200164
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Text/Soundex.pm
@@ -0,0 +1,260 @@
+# -*- perl -*-
+
+# (c) Copyright 1998-2007 by Mark Mielke
+#
+# Freedom to use these sources for whatever you want, as long as credit
+# is given where credit is due, is hereby granted. You may make modifications
+# where you see fit but leave this copyright somewhere visible. As well, try
+# to initial any changes you make so that if I like the changes I can
+# incorporate them into later versions.
+#
+# - Mark Mielke <mark@mielke.cc>
+#
+
+package Text::Soundex;
+require 5.006;
+
+use Exporter ();
+use XSLoader ();
+
+use strict;
+
+our $VERSION = '3.03';
+our @EXPORT_OK = qw(soundex soundex_unicode soundex_nara soundex_nara_unicode
+ $soundex_nocode);
+our @EXPORT = qw(soundex soundex_nara $soundex_nocode);
+our @ISA = qw(Exporter);
+
+our $nocode;
+
+# Previous releases of Text::Soundex made $nocode available as $soundex_nocode.
+# For now, this part of the interface is exported and maintained.
+# In the feature, $soundex_nocode will be deprecated.
+*Text::Soundex::soundex_nocode = \$nocode;
+
+sub soundex_noxs
+{
+ # Original Soundex algorithm
+
+ my @results = map {
+ my $code = uc($_);
+ $code =~ tr/AaEeHhIiOoUuWwYyBbFfPpVvCcGgJjKkQqSsXxZzDdTtLlMmNnRr//cd;
+
+ if (length($code)) {
+ my $firstchar = substr($code, 0, 1);
+ $code =~ tr[AaEeHhIiOoUuWwYyBbFfPpVvCcGgJjKkQqSsXxZzDdTtLlMmNnRr]
+ [0000000000000000111111112222222222222222333344555566]s;
+ ($code = substr($code, 1)) =~ tr/0//d;
+ substr($firstchar . $code . '000', 0, 4);
+ } else {
+ $nocode;
+ }
+ } @_;
+
+ wantarray ? @results : $results[0];
+}
+
+sub soundex_nara
+{
+ # US census (NARA) algorithm.
+
+ my @results = map {
+ my $code = uc($_);
+ $code =~ tr/AaEeHhIiOoUuWwYyBbFfPpVvCcGgJjKkQqSsXxZzDdTtLlMmNnRr//cd;
+
+ if (length($code)) {
+ my $firstchar = substr($code, 0, 1);
+ $code =~ tr[AaEeHhIiOoUuWwYyBbFfPpVvCcGgJjKkQqSsXxZzDdTtLlMmNnRr]
+ [0000990000009900111111112222222222222222333344555566]s;
+ $code =~ s/(.)9\1/$1/gs;
+ ($code = substr($code, 1)) =~ tr/09//d;
+ substr($firstchar . $code . '000', 0, 4);
+ } else {
+ $nocode
+ }
+ } @_;
+
+ wantarray ? @results : $results[0];
+}
+
+sub soundex_unicode
+{
+ require Text::Unidecode unless defined &Text::Unidecode::unidecode;
+ soundex(Text::Unidecode::unidecode(@_));
+}
+
+sub soundex_nara_unicode
+{
+ require Text::Unidecode unless defined &Text::Unidecode::unidecode;
+ soundex_nara(Text::Unidecode::unidecode(@_));
+}
+
+eval { XSLoader::load(__PACKAGE__, $VERSION) };
+
+if (defined(&soundex_xs)) {
+ *soundex = \&soundex_xs;
+} else {
+ *soundex = \&soundex_noxs;
+ *soundex_xs = sub {
+ require Carp;
+ Carp::croak("XS implementation of Text::Soundex::soundex_xs() ".
+ "could not be loaded");
+ };
+}
+
+1;
+
+__END__
+
+# Implementation of the soundex algorithm.
+#
+# Some of this documention was written by Mike Stok.
+#
+# Examples:
+#
+# Euler, Ellery -> E460
+# Gauss, Ghosh -> G200
+# Hilbert, Heilbronn -> H416
+# Knuth, Kant -> K530
+# Lloyd, Ladd -> L300
+# Lukasiewicz, Lissajous -> L222
+#
+
+=head1 NAME
+
+Text::Soundex - Implementation of the soundex algorithm.
+
+=head1 SYNOPSIS
+
+ use Text::Soundex;
+
+ # Original algorithm.
+ $code = soundex($name); # Get the soundex code for a name.
+ @codes = soundex(@names); # Get the list of codes for a list of names.
+
+ # American Soundex variant (NARA) - Used for US census data.
+ $code = soundex_nara($name); # Get the soundex code for a name.
+ @codes = soundex_nara(@names); # Get the list of codes for a list of names.
+
+ # Redefine the value that soundex() will return if the input string
+ # contains no identifiable sounds within it.
+ $Text::Soundex::nocode = 'Z000';
+
+=head1 DESCRIPTION
+
+Soundex is a phonetic algorithm for indexing names by sound, as
+pronounced in English. The goal is for names with the same
+pronunciation to be encoded to the same representation so that they
+can be matched despite minor differences in spelling. Soundex is the
+most widely known of all phonetic algorithms and is often used
+(incorrectly) as a synonym for "phonetic algorithm". Improvements to
+Soundex are the basis for many modern phonetic algorithms. (Wikipedia,
+2007)
+
+This module implements the original soundex algorithm developed by
+Robert Russell and Margaret Odell, patented in 1918 and 1922, as well
+as a variation called "American Soundex" used for US census data, and
+current maintained by the National Archives and Records Administration
+(NARA).
+
+The soundex algorithm may be recognized from Donald Knuth's
+B<The Art of Computer Programming>. The algorithm described by
+Knuth is the NARA algorithm.
+
+The value returned for strings which have no soundex encoding is
+defined using C<$Text::Soundex::nocode>. The default value is C<undef>,
+however values such as C<'Z000'> are commonly used alternatives.
+
+For backward compatibility with older versions of this module the
+C<$Text::Soundex::nocode> is exported into the caller's namespace as
+C<$soundex_nocode>.
+
+In scalar context, C<soundex()> returns the soundex code of its first
+argument. In list context, a list is returned in which each element is the
+soundex code for the corresponding argument passed to C<soundex()>. For
+example, the following code assigns @codes the value C<('M200', 'S320')>:
+
+ @codes = soundex qw(Mike Stok);
+
+To use C<Text::Soundex> to generate codes that can be used to search one
+of the publically available US Censuses, a variant of the soundex
+algorithm must be used:
+
+ use Text::Soundex;
+ $code = soundex_nara($name);
+
+An example of where these algorithm differ follows:
+
+ use Text::Soundex;
+ print soundex("Ashcraft"), "\n"; # prints: A226
+ print soundex_nara("Ashcraft"), "\n"; # prints: A261
+
+=head1 EXAMPLES
+
+Donald Knuth's examples of names and the soundex codes they map to
+are listed below:
+
+ Euler, Ellery -> E460
+ Gauss, Ghosh -> G200
+ Hilbert, Heilbronn -> H416
+ Knuth, Kant -> K530
+ Lloyd, Ladd -> L300
+ Lukasiewicz, Lissajous -> L222
+
+so:
+
+ $code = soundex 'Knuth'; # $code contains 'K530'
+ @list = soundex qw(Lloyd Gauss); # @list contains 'L300', 'G200'
+
+=head1 LIMITATIONS
+
+As the soundex algorithm was originally used a B<long> time ago in the US
+it considers only the English alphabet and pronunciation. In particular,
+non-ASCII characters will be ignored. The recommended method of dealing
+with characters that have accents, or other unicode characters, is to use
+the Text::Unidecode module available from CPAN. Either use the module
+explicitly:
+
+ use Text::Soundex;
+ use Text::Unidecode;
+
+ print soundex(unidecode("Fran\xE7ais")), "\n"; # Prints "F652\n"
+
+Or use the convenient wrapper routine:
+
+ use Text::Soundex 'soundex_unicode';
+
+ print soundex_unicode("Fran\xE7ais"), "\n"; # Prints "F652\n"
+
+Since the soundex algorithm maps a large space (strings of arbitrary
+length) onto a small space (single letter plus 3 digits) no inference
+can be made about the similarity of two strings which end up with the
+same soundex code. For example, both C<Hilbert> and C<Heilbronn> end
+up with a soundex code of C<H416>.
+
+=head1 MAINTAINER
+
+This module is currently maintain by Mark Mielke (C<mark@mielke.cc>).
+
+=head1 HISTORY
+
+Version 3 is a significant update to provide support for versions of
+Perl later than Perl 5.004. Specifically, the XS version of the
+soundex() subroutine understands strings that are encoded using UTF-8
+(unicode strings).
+
+Version 2 of this module was a re-write by Mark Mielke (C<mark@mielke.cc>)
+to improve the speed of the subroutines. The XS version of the soundex()
+subroutine was introduced in 2.00.
+
+Version 1 of this module was written by Mike Stok (C<mike@stok.co.uk>)
+and was included into the Perl core library set.
+
+Dave Carlsen (C<dcarlsen@csranet.com>) made the request for the NARA
+algorithm to be included. The NARA soundex page can be viewed at:
+C<http://www.nara.gov/genealogy/soundex/soundex.html>
+
+Ian Phillips (C<ian@pipex.net>) and Rich Pinder (C<rpinder@hsc.usc.edu>)
+supplied ideas and spotted mistakes for v1.x.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Text/Tabs.pm b/Master/tlpkg/tlperl.straw/lib/Text/Tabs.pm
new file mode 100755
index 00000000000..d3c06a08c10
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Text/Tabs.pm
@@ -0,0 +1,136 @@
+
+package Text::Tabs;
+
+require Exporter;
+
+@ISA = (Exporter);
+@EXPORT = qw(expand unexpand $tabstop);
+
+use vars qw($VERSION $tabstop $debug);
+$VERSION = 2009.0305;
+
+use strict;
+
+BEGIN {
+ $tabstop = 8;
+ $debug = 0;
+}
+
+sub expand {
+ my @l;
+ my $pad;
+ for ( @_ ) {
+ my $s = '';
+ for (split(/^/m, $_, -1)) {
+ my $offs = 0;
+ s{\t}{
+ $pad = $tabstop - (pos() + $offs) % $tabstop;
+ $offs += $pad - 1;
+ " " x $pad;
+ }eg;
+ $s .= $_;
+ }
+ push(@l, $s);
+ }
+ return @l if wantarray;
+ return $l[0];
+}
+
+sub unexpand
+{
+ my (@l) = @_;
+ my @e;
+ my $x;
+ my $line;
+ my @lines;
+ my $lastbit;
+ my $ts_as_space = " "x$tabstop;
+ for $x (@l) {
+ @lines = split("\n", $x, -1);
+ for $line (@lines) {
+ $line = expand($line);
+ @e = split(/(.{$tabstop})/,$line,-1);
+ $lastbit = pop(@e);
+ $lastbit = ''
+ unless defined $lastbit;
+ $lastbit = "\t"
+ if $lastbit eq $ts_as_space;
+ for $_ (@e) {
+ if ($debug) {
+ my $x = $_;
+ $x =~ s/\t/^I\t/gs;
+ print "sub on '$x'\n";
+ }
+ s/ +$/\t/;
+ }
+ $line = join('',@e, $lastbit);
+ }
+ $x = join("\n", @lines);
+ }
+ return @l if wantarray;
+ return $l[0];
+}
+
+1;
+__END__
+
+sub expand
+{
+ my (@l) = @_;
+ for $_ (@l) {
+ 1 while s/(^|\n)([^\t\n]*)(\t+)/
+ $1. $2 . (" " x
+ ($tabstop * length($3)
+ - (length($2) % $tabstop)))
+ /sex;
+ }
+ return @l if wantarray;
+ return $l[0];
+}
+
+
+=head1 NAME
+
+Text::Tabs -- expand and unexpand tabs per the unix expand(1) and unexpand(1)
+
+=head1 SYNOPSIS
+
+ use Text::Tabs;
+
+ $tabstop = 4; # default = 8
+ @lines_without_tabs = expand(@lines_with_tabs);
+ @lines_with_tabs = unexpand(@lines_without_tabs);
+
+=head1 DESCRIPTION
+
+Text::Tabs does about what the unix utilities expand(1) and unexpand(1)
+do. Given a line with tabs in it, expand will replace the tabs with
+the appropriate number of spaces. Given a line with or without tabs in
+it, unexpand will add tabs when it can save bytes by doing so (just
+like C<unexpand -a>). Invisible compression with plain ASCII!
+
+=head1 EXAMPLE
+
+ #!perl
+ # unexpand -a
+ use Text::Tabs;
+
+ while (<>) {
+ print unexpand $_;
+ }
+
+Instead of the C<expand> comand, use:
+
+ perl -MText::Tabs -n -e 'print expand $_'
+
+Instead of the C<unexpand -a> command, use:
+
+ perl -MText::Tabs -n -e 'print unexpand $_'
+
+=head1 LICENSE
+
+Copyright (C) 1996-2002,2005,2006 David Muir Sharnoff.
+Copyright (C) 2005 Aristotle Pagaltzis
+This module may be modified, used, copied, and redistributed at your own risk.
+Publicly redistributed modified versions must use a different name.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Text/Wrap.pm b/Master/tlpkg/tlperl.straw/lib/Text/Wrap.pm
new file mode 100755
index 00000000000..de8620247f2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Text/Wrap.pm
@@ -0,0 +1,265 @@
+package Text::Wrap;
+
+use warnings::register;
+require Exporter;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(wrap fill);
+@EXPORT_OK = qw($columns $break $huge);
+
+$VERSION = 2009.0305;
+
+use vars qw($VERSION $columns $debug $break $huge $unexpand $tabstop
+ $separator $separator2);
+use strict;
+
+BEGIN {
+ $columns = 76; # <= screen width
+ $debug = 0;
+ $break = '\s';
+ $huge = 'wrap'; # alternatively: 'die' or 'overflow'
+ $unexpand = 1;
+ $tabstop = 8;
+ $separator = "\n";
+ $separator2 = undef;
+}
+
+use Text::Tabs qw(expand unexpand);
+
+sub wrap
+{
+ my ($ip, $xp, @t) = @_;
+
+ local($Text::Tabs::tabstop) = $tabstop;
+ my $r = "";
+ my $tail = pop(@t);
+ my $t = expand(join("", (map { /\s+\z/ ? ( $_ ) : ($_, ' ') } @t), $tail));
+ my $lead = $ip;
+ my $nll = $columns - length(expand($xp)) - 1;
+ if ($nll <= 0 && $xp ne '') {
+ my $nc = length(expand($xp)) + 2;
+ warnings::warnif "Increasing \$Text::Wrap::columns from $columns to $nc to accommodate length of subsequent tab";
+ $columns = $nc;
+ $nll = 1;
+ }
+ my $ll = $columns - length(expand($ip)) - 1;
+ $ll = 0 if $ll < 0;
+ my $nl = "";
+ my $remainder = "";
+
+ use re 'taint';
+
+ pos($t) = 0;
+ while ($t !~ /\G(?:$break)*\Z/gc) {
+ if ($t =~ /\G([^\n]{0,$ll})($break|\n+|\z)/xmgc) {
+ $r .= $unexpand
+ ? unexpand($nl . $lead . $1)
+ : $nl . $lead . $1;
+ $remainder = $2;
+ } elsif ($huge eq 'wrap' && $t =~ /\G([^\n]{$ll})/gc) {
+ $r .= $unexpand
+ ? unexpand($nl . $lead . $1)
+ : $nl . $lead . $1;
+ $remainder = defined($separator2) ? $separator2 : $separator;
+ } elsif ($huge eq 'overflow' && $t =~ /\G([^\n]*?)($break|\n+|\z)/xmgc) {
+ $r .= $unexpand
+ ? unexpand($nl . $lead . $1)
+ : $nl . $lead . $1;
+ $remainder = $2;
+ } elsif ($huge eq 'die') {
+ die "couldn't wrap '$t'";
+ } elsif ($columns < 2) {
+ warnings::warnif "Increasing \$Text::Wrap::columns from $columns to 2";
+ $columns = 2;
+ return ($ip, $xp, @t);
+ } else {
+ die "This shouldn't happen";
+ }
+
+ $lead = $xp;
+ $ll = $nll;
+ $nl = defined($separator2)
+ ? ($remainder eq "\n"
+ ? "\n"
+ : $separator2)
+ : $separator;
+ }
+ $r .= $remainder;
+
+ print "-----------$r---------\n" if $debug;
+
+ print "Finish up with '$lead'\n" if $debug;
+
+ $r .= $lead . substr($t, pos($t), length($t)-pos($t))
+ if pos($t) ne length($t);
+
+ print "-----------$r---------\n" if $debug;;
+
+ return $r;
+}
+
+sub fill
+{
+ my ($ip, $xp, @raw) = @_;
+ my @para;
+ my $pp;
+
+ for $pp (split(/\n\s+/, join("\n",@raw))) {
+ $pp =~ s/\s+/ /g;
+ my $x = wrap($ip, $xp, $pp);
+ push(@para, $x);
+ }
+
+ # if paragraph_indent is the same as line_indent,
+ # separate paragraphs with blank lines
+
+ my $ps = ($ip eq $xp) ? "\n\n" : "\n";
+ return join ($ps, @para);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Text::Wrap - line wrapping to form simple paragraphs
+
+=head1 SYNOPSIS
+
+B<Example 1>
+
+ use Text::Wrap;
+
+ $initial_tab = "\t"; # Tab before first line
+ $subsequent_tab = ""; # All other lines flush left
+
+ print wrap($initial_tab, $subsequent_tab, @text);
+ print fill($initial_tab, $subsequent_tab, @text);
+
+ $lines = wrap($initial_tab, $subsequent_tab, @text);
+
+ @paragraphs = fill($initial_tab, $subsequent_tab, @text);
+
+B<Example 2>
+
+ use Text::Wrap qw(wrap $columns $huge);
+
+ $columns = 132; # Wrap at 132 characters
+ $huge = 'die';
+ $huge = 'wrap';
+ $huge = 'overflow';
+
+B<Example 3>
+
+ use Text::Wrap;
+
+ $Text::Wrap::columns = 72;
+ print wrap('', '', @text);
+
+=head1 DESCRIPTION
+
+C<Text::Wrap::wrap()> is a very simple paragraph formatter. It formats a
+single paragraph at a time by breaking lines at word boundaries.
+Indentation is controlled for the first line (C<$initial_tab>) and
+all subsequent lines (C<$subsequent_tab>) independently. Please note:
+C<$initial_tab> and C<$subsequent_tab> are the literal strings that will
+be used: it is unlikely you would want to pass in a number.
+
+Text::Wrap::fill() is a simple multi-paragraph formatter. It formats
+each paragraph separately and then joins them together when it's done. It
+will destroy any whitespace in the original text. It breaks text into
+paragraphs by looking for whitespace after a newline. In other respects
+it acts like wrap().
+
+Both C<wrap()> and C<fill()> return a single string.
+
+=head1 OVERRIDES
+
+C<Text::Wrap::wrap()> has a number of variables that control its behavior.
+Because other modules might be using C<Text::Wrap::wrap()> it is suggested
+that you leave these variables alone! If you can't do that, then
+use C<local($Text::Wrap::VARIABLE) = YOURVALUE> when you change the
+values so that the original value is restored. This C<local()> trick
+will not work if you import the variable into your own namespace.
+
+Lines are wrapped at C<$Text::Wrap::columns> columns (default value: 76).
+C<$Text::Wrap::columns> should be set to the full width of your output
+device. In fact, every resulting line will have length of no more than
+C<$columns - 1>.
+
+It is possible to control which characters terminate words by
+modifying C<$Text::Wrap::break>. Set this to a string such as
+C<'[\s:]'> (to break before spaces or colons) or a pre-compiled regexp
+such as C<qr/[\s']/> (to break before spaces or apostrophes). The
+default is simply C<'\s'>; that is, words are terminated by spaces.
+(This means, among other things, that trailing punctuation such as
+full stops or commas stay with the word they are "attached" to.)
+Setting C<$Text::Wrap::break> to a regular expression that doesn't
+eat any characters (perhaps just a forward look-ahead assertion) will
+cause warnings.
+
+Beginner note: In example 2, above C<$columns> is imported into
+the local namespace, and set locally. In example 3,
+C<$Text::Wrap::columns> is set in its own namespace without importing it.
+
+C<Text::Wrap::wrap()> starts its work by expanding all the tabs in its
+input into spaces. The last thing it does it to turn spaces back
+into tabs. If you do not want tabs in your results, set
+C<$Text::Wrap::unexpand> to a false value. Likewise if you do not
+want to use 8-character tabstops, set C<$Text::Wrap::tabstop> to
+the number of characters you do want for your tabstops.
+
+If you want to separate your lines with something other than C<\n>
+then set C<$Text::Wrap::separator> to your preference. This replaces
+all newlines with C<$Text::Wrap::separator>. If you just want to
+preserve existing newlines but add new breaks with something else, set
+C<$Text::Wrap::separator2> instead.
+
+When words that are longer than C<$columns> are encountered, they
+are broken up. C<wrap()> adds a C<"\n"> at column C<$columns>.
+This behavior can be overridden by setting C<$huge> to
+'die' or to 'overflow'. When set to 'die', large words will cause
+C<die()> to be called. When set to 'overflow', large words will be
+left intact.
+
+Historical notes: 'die' used to be the default value of
+C<$huge>. Now, 'wrap' is the default value.
+
+=head1 EXAMPLES
+
+Code:
+
+ print wrap("\t","",<<END);
+ This is a bit of text that forms
+ a normal book-style indented paragraph
+ END
+
+Result:
+
+ " This is a bit of text that forms
+ a normal book-style indented paragraph
+ "
+
+Code:
+
+ $Text::Wrap::columns=20;
+ $Text::Wrap::separator="|";
+ print wrap("","","This is a bit of text that forms a normal book-style paragraph");
+
+Result:
+
+ "This is a bit of|text that forms a|normal book-style|paragraph"
+
+=head1 SEE ALSO
+
+For wrapping multi-byte characters: L<Text::WrapI18N>.
+For more detailed controls: L<Text::Format>.
+
+=head1 LICENSE
+
+David Muir Sharnoff <muir@idiom.org> with help from Tim Pierce and
+many many others. Copyright (C) 1996-2009 David Muir Sharnoff.
+This module may be modified, used, copied, and redistributed at
+your own risk. Publicly redistributed versions that are modified
+must use a different name.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Thread.pm b/Master/tlpkg/tlperl.straw/lib/Thread.pm
new file mode 100755
index 00000000000..247f90ccc9e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Thread.pm
@@ -0,0 +1,273 @@
+package Thread;
+
+use strict;
+use warnings;
+no warnings 'redefine';
+
+our $VERSION = '3.02';
+$VERSION = eval $VERSION;
+
+BEGIN {
+ use Config;
+ if (! $Config{useithreads}) {
+ die("This Perl not built to support threads\n");
+ }
+}
+
+use threads 'yield';
+use threads::shared;
+
+require Exporter;
+our @ISA = qw(Exporter threads);
+our @EXPORT = qw(cond_wait cond_broadcast cond_signal);
+our @EXPORT_OK = qw(async yield);
+
+sub async (&;@) { return Thread->new(shift); }
+
+sub done { return ! shift->is_running(); }
+
+sub eval { die("'eval' not implemented with 'ithreads'\n"); };
+sub flags { die("'flags' not implemented with 'ithreads'\n"); };
+
+1;
+
+__END__
+
+=head1 NAME
+
+Thread - Manipulate threads in Perl (for old code only)
+
+=head1 DEPRECATED
+
+The C<Thread> module served as the frontend to the old-style thread model,
+called I<5005threads>, that was introduced in release 5.005. That model was
+deprecated, and has been removed in version 5.10.
+
+For old code and interim backwards compatibility, the C<Thread> module has
+been reworked to function as a frontend for the new interpreter threads
+(I<ithreads>) model. However, some previous functionality is not available.
+Further, the data sharing models between the two thread models are completely
+different, and anything to do with data sharing has to be thought differently.
+With I<ithreads>, you must explicitly C<share()> variables between the
+threads.
+
+You are strongly encouraged to migrate any existing threaded code to the new
+model (i.e., use the C<threads> and C<threads::shared> modules) as soon as
+possible.
+
+=head1 HISTORY
+
+In Perl 5.005, the thread model was that all data is implicitly shared, and
+shared access to data has to be explicitly synchronized. This model is called
+I<5005threads>.
+
+In Perl 5.6, a new model was introduced in which all is was thread local and
+shared access to data has to be explicitly declared. This model is called
+I<ithreads>, for "interpreter threads".
+
+In Perl 5.6, the I<ithreads> model was not available as a public API; only as
+an internal API that was available for extension writers, and to implement
+fork() emulation on Win32 platforms.
+
+In Perl 5.8, the I<ithreads> model became available through the C<threads>
+module, and the I<5005threads> model was deprecated.
+
+In Perl 5.10, the I<5005threads> model was removed from the Perl interpreter.
+
+=head1 SYNOPSIS
+
+ use Thread qw(:DEFAULT async yield);
+
+ my $t = Thread->new(\&start_sub, @start_args);
+
+ $result = $t->join;
+ $t->detach;
+
+ if ($t->done) {
+ $t->join;
+ }
+
+ if($t->equal($another_thread)) {
+ # ...
+ }
+
+ yield();
+
+ my $tid = Thread->self->tid;
+
+ lock($scalar);
+ lock(@array);
+ lock(%hash);
+
+ my @list = Thread->list;
+
+=head1 DESCRIPTION
+
+The C<Thread> module provides multithreading support for Perl.
+
+=head1 FUNCTIONS
+
+=over 8
+
+=item $thread = Thread->new(\&start_sub)
+
+=item $thread = Thread->new(\&start_sub, LIST)
+
+C<new> starts a new thread of execution in the referenced subroutine. The
+optional list is passed as parameters to the subroutine. Execution
+continues in both the subroutine and the code after the C<new> call.
+
+C<Thread-&gt;new> returns a thread object representing the newly created
+thread.
+
+=item lock VARIABLE
+
+C<lock> places a lock on a variable until the lock goes out of scope.
+
+If the variable is locked by another thread, the C<lock> call will
+block until it's available. C<lock> is recursive, so multiple calls
+to C<lock> are safe--the variable will remain locked until the
+outermost lock on the variable goes out of scope.
+
+Locks on variables only affect C<lock> calls--they do I<not> affect normal
+access to a variable. (Locks on subs are different, and covered in a bit.)
+If you really, I<really> want locks to block access, then go ahead and tie
+them to something and manage this yourself. This is done on purpose.
+While managing access to variables is a good thing, Perl doesn't force
+you out of its living room...
+
+If a container object, such as a hash or array, is locked, all the
+elements of that container are not locked. For example, if a thread
+does a C<lock @a>, any other thread doing a C<lock($a[12])> won't
+block.
+
+Finally, C<lock> will traverse up references exactly I<one> level.
+C<lock(\$a)> is equivalent to C<lock($a)>, while C<lock(\\$a)> is not.
+
+=item async BLOCK;
+
+C<async> creates a thread to execute the block immediately following
+it. This block is treated as an anonymous sub, and so must have a
+semi-colon after the closing brace. Like C<Thread-&gt;new>, C<async>
+returns a thread object.
+
+=item Thread->self
+
+The C<Thread-E<gt>self> function returns a thread object that represents
+the thread making the C<Thread-E<gt>self> call.
+
+=item Thread->list
+
+Returns a list of all non-joined, non-detached Thread objects.
+
+=item cond_wait VARIABLE
+
+The C<cond_wait> function takes a B<locked> variable as
+a parameter, unlocks the variable, and blocks until another thread
+does a C<cond_signal> or C<cond_broadcast> for that same locked
+variable. The variable that C<cond_wait> blocked on is relocked
+after the C<cond_wait> is satisfied. If there are multiple threads
+C<cond_wait>ing on the same variable, all but one will reblock waiting
+to reaquire the lock on the variable. (So if you're only using
+C<cond_wait> for synchronization, give up the lock as soon as
+possible.)
+
+=item cond_signal VARIABLE
+
+The C<cond_signal> function takes a locked variable as a parameter and
+unblocks one thread that's C<cond_wait>ing on that variable. If more than
+one thread is blocked in a C<cond_wait> on that variable, only one (and
+which one is indeterminate) will be unblocked.
+
+If there are no threads blocked in a C<cond_wait> on the variable,
+the signal is discarded.
+
+=item cond_broadcast VARIABLE
+
+The C<cond_broadcast> function works similarly to C<cond_signal>.
+C<cond_broadcast>, though, will unblock B<all> the threads that are
+blocked in a C<cond_wait> on the locked variable, rather than only
+one.
+
+=item yield
+
+The C<yield> function allows another thread to take control of the
+CPU. The exact results are implementation-dependent.
+
+=back
+
+=head1 METHODS
+
+=over 8
+
+=item join
+
+C<join> waits for a thread to end and returns any values the thread
+exited with. C<join> will block until the thread has ended, though
+it won't block if the thread has already terminated.
+
+If the thread being C<join>ed C<die>d, the error it died with will
+be returned at this time. If you don't want the thread performing
+the C<join> to die as well, you should either wrap the C<join> in
+an C<eval> or use the C<eval> thread method instead of C<join>.
+
+=item detach
+
+C<detach> tells a thread that it is never going to be joined i.e.
+that all traces of its existence can be removed once it stops running.
+Errors in detached threads will not be visible anywhere - if you want
+to catch them, you should use $SIG{__DIE__} or something like that.
+
+=item equal
+
+C<equal> tests whether two thread objects represent the same thread and
+returns true if they do.
+
+=item tid
+
+The C<tid> method returns the tid of a thread. The tid is
+a monotonically increasing integer assigned when a thread is
+created. The main thread of a program will have a tid of zero,
+while subsequent threads will have tids assigned starting with one.
+
+=item done
+
+The C<done> method returns true if the thread you're checking has
+finished, and false otherwise.
+
+=back
+
+=head1 DEFUNCT
+
+The following were implemented with I<5005threads>, but are no longer
+available with I<ithreads>.
+
+=over 8
+
+=item lock(\&sub)
+
+With 5005threads, you could also C<lock> a sub such that any calls to that sub
+from another thread would block until the lock was released.
+
+Also, subroutines could be declared with the C<:locked> attribute which would
+serialize access to the subroutine, but allowed different threads
+non-simultaneous access.
+
+=item eval
+
+The C<eval> method wrapped an C<eval> around a C<join>, and so waited for a
+thread to exit, passing along any values the thread might have returned and
+placing any errors into C<$@>.
+
+=item flags
+
+The C<flags> method returned the flags for the thread - an integer value
+corresponding to the internal flags for the thread.
+
+=back
+
+=head1 SEE ALSO
+
+L<threads>, L<threads::shared>, L<Thread::Queue>, L<Thread::Semaphore>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Tk.pm b/Master/tlpkg/tlperl.straw/lib/Tk.pm
new file mode 100755
index 00000000000..b5a029f1f04
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Tk.pm
@@ -0,0 +1,856 @@
+#
+# Copyright (c) 1992-1994 The Regents of the University of California.
+# Copyright (c) 1994 Sun Microsystems, Inc.
+# Copyright (c) 1995-2004 Nick Ing-Simmons. All rights reserved.
+# This program is free software; you can redistribute it and/or
+
+# modify it under the same terms as Perl itself, subject
+# to additional disclaimer in Tk/license.terms due to partial
+# derivation from Tk8.0 sources.
+#
+package Tk;
+require 5.007;
+use Tk::Event ();
+use AutoLoader qw(AUTOLOAD);
+use DynaLoader;
+use Cwd();
+use base qw(Exporter DynaLoader);
+use File::Spec qw();
+
+*fileevent = \&Tk::Event::IO::fileevent;
+
+use Encode;
+$Tk::encodeStopOnError = Encode::FB_QUIET();
+$Tk::encodeFallback = Encode::FB_PERLQQ(); # Encode::FB_DEFAULT();
+
+our %font_encoding = ('jis0208' => 'jis0208-raw',
+ 'jis0212' => 'jis0212-raw',
+ 'ksc5601' => 'ksc5601-raw',
+ 'gb2312' => 'gb2312-raw',
+ 'unicode' => 'ucs-2le',
+ );
+
+BEGIN {
+ if($^O eq 'cygwin')
+ {
+ require Tk::Config;
+ $Tk::platform = $Tk::Config::win_arch;
+ $Tk::platform = 'unix' if $Tk::platform eq 'x';
+ }
+ else
+ {
+ $Tk::platform = ($^O eq 'MSWin32') ? $^O : 'unix';
+ }
+};
+
+$Tk::tearoff = 1 if ($Tk::platform eq 'unix');
+
+
+@EXPORT = qw(Exists Ev exit MainLoop DoOneEvent tkinit);
+@EXPORT_OK = qw(NoOp after *widget *event lsearch catch $XS_VERSION
+ DONT_WAIT WINDOW_EVENTS FILE_EVENTS TIMER_EVENTS
+ IDLE_EVENTS ALL_EVENTS
+ NORMAL_BG ACTIVE_BG SELECT_BG
+ SELECT_FG TROUGH INDICATOR DISABLED BLACK WHITE);
+%EXPORT_TAGS = (eventtypes => [qw(DONT_WAIT WINDOW_EVENTS FILE_EVENTS
+ TIMER_EVENTS IDLE_EVENTS ALL_EVENTS)],
+ variables => [qw(*widget *event)],
+ colors => [qw(NORMAL_BG ACTIVE_BG SELECT_BG SELECT_FG
+ TROUGH INDICATOR DISABLED BLACK WHITE)],
+ );
+
+use strict;
+use Carp;
+
+# Record author's perforce depot record
+#$Tk::CHANGE = q$Change: 3279 $;
+$Tk::CHANGE = 'sfsvn-' . q$Change: 27 $;
+
+# $tk_version and $tk_patchLevel are reset by pTk when a mainwindow
+# is created, $VERSION is checked by bootstrap
+$Tk::version = '8.4';
+$Tk::patchLevel = '8.4';
+$Tk::VERSION = '804.028';
+$Tk::VERSION = eval $Tk::VERSION;
+$Tk::XS_VERSION = $Tk::VERSION;
+$Tk::strictMotif = 0;
+
+
+{($Tk::library) = __FILE__ =~ /^(.*)\.pm$/;}
+$Tk::library = Tk->findINC('.') unless (defined($Tk::library) && -d $Tk::library);
+
+$Tk::widget = undef;
+$Tk::event = undef;
+
+use vars qw($inMainLoop);
+
+bootstrap Tk;
+
+my $boot_time = timeofday();
+
+# This is a workround for Solaris X11 locale handling
+Preload(DynaLoader::dl_findfile('-L/usr/openwin/lib','-lX11'))
+ if (NeedPreload() && -d '/usr/openwin/lib');
+
+use Tk::Submethods ('option' => [qw(add get clear readfile)],
+ 'clipboard' => [qw(clear append)]
+ );
+
+#
+# Next few routines are here as perl code as doing caller()
+# in XS code is very complicated - so instead C code calls BackTrace
+#
+sub _backTrace
+{
+ my $w = shift;
+ my $i = 1;
+ my ($pack,$file,$line,$sub) = caller($i++);
+ while (1)
+ {
+ my $loc = "at $file line $line";
+ ($pack,$file,$line,$sub) = caller($i++);
+ last unless defined($sub);
+ return 1 if $sub eq '(eval)';
+ $w->AddErrorInfo("$sub $loc");
+ }
+ return 0;
+}
+
+sub BackTrace
+{
+ my $w = shift;
+ return unless (@_ || $@);
+ my $mess = (@_) ? shift : "$@";
+ die "$mess\n" if $w->_backTrace;
+ # if we get here we are not in an eval so report now
+ $w->Fail($mess);
+ $w->idletasks;
+ die "$mess\n";
+}
+
+#
+# This is a $SIG{__DIE__} handler which does not change the $@
+# string in the way 'croak' does, but rather add to Tk's ErrorInfo.
+# It stops at 1st enclosing eval on assumption that the eval
+# is part of Tk call process and will add its own context to ErrorInfo
+# and then pass on the error.
+#
+sub __DIE__
+{
+ my $mess = shift;
+ my $w = $Tk::widget;
+ # Note that if a __DIE__ handler returns it re-dies up the chain.
+ return unless defined($w) && Exists($w);
+ # This special message is for exit() as an exception see pTkCallback.c
+ return if $mess =~/^_TK_EXIT_\(\d+\)/;
+ return if $w->_backTrace;
+ # Not in an eval - should not happen
+}
+
+sub XEvent::xy { shift->Info('xy') }
+
+sub XEvent::AUTOLOAD
+{
+ my ($meth) = $XEvent::AUTOLOAD =~ /(\w)$/;
+ no strict 'refs';
+ *{$XEvent::AUTOLOAD} = sub { shift->Info($meth) };
+ goto &$XEvent::AUTOLOAD;
+}
+
+sub NoOp { }
+
+sub Ev
+{
+ if (@_ == 1)
+ {
+ my $arg = $_[0];
+ return bless (((ref $arg) ? $arg : \$arg), 'Tk::Ev');
+ }
+ else
+ {
+ return bless [@_],'Tk::Ev';
+ }
+}
+
+sub InitClass
+{
+ my ($package,$parent) = @_;
+ croak "Unexpected type of parent $parent" unless(ref $parent);
+ croak "$parent is not a widget" unless($parent->IsWidget);
+ my $mw = $parent->MainWindow;
+ my $hash = $mw->TkHash('_ClassInit_');
+ unless (exists $hash->{$package})
+ {
+ $package->Install($mw);
+ $hash->{$package} = $package->ClassInit($mw);
+ }
+}
+
+require Tk::Widget;
+require Tk::Image;
+require Tk::MainWindow;
+
+sub Exists
+{my $w = shift;
+ return defined($w) && ref($w) && $w->IsWidget && $w->exists;
+}
+
+sub Time_So_Far
+{
+ return timeofday() - $boot_time;
+}
+
+# Selection* are not autoloaded as names are too long.
+
+sub SelectionOwn
+{my $widget = shift;
+ selection('own',(@_,$widget));
+}
+
+sub SelectionOwner
+{
+ selection('own','-displayof',@_);
+}
+
+sub SelectionClear
+{
+ selection('clear','-displayof',@_);
+}
+
+sub SelectionExists
+{
+ selection('exists','-displayof',@_);
+}
+
+sub SelectionHandle
+{my $widget = shift;
+ my $command = pop;
+ selection('handle',@_,$widget,$command);
+}
+
+sub SplitString
+{
+ local $_ = shift;
+ my (@arr, $tmp);
+ while (/\{([^{}]*)\}|((?:[^\s\\]|\\.)+)/gs) {
+ if (defined $1) { push @arr, $1 }
+ else { $tmp = $2 ; $tmp =~ s/\\([\s\\])/$1/g; push @arr, $tmp }
+ }
+ # carp '('.join(',',@arr).")";
+ return @arr;
+}
+
+sub Methods
+{
+ my ($package) = caller;
+ no strict 'refs';
+ foreach my $meth (@_)
+ {
+ my $name = $meth;
+ *{$package."::$meth"} = sub { shift->WidgetMethod($name,@_) };
+ }
+}
+
+my %dialog = ( tk_chooseColor => 'ColorDialog',
+ tk_messageBox => 'MessageBox',
+ tk_getOpenFile => 'FDialog',
+ tk_getSaveFile => 'FDialog',
+ tk_chooseDirectory => 'FDialog'
+# Slaven claims NI-S's version above does not work
+# and provides this
+# tk_chooseDirectory => 'DirDialog'
+ );
+
+foreach my $dialog (keys %dialog)
+ {
+ no strict 'refs';
+ unless (defined &$dialog)
+ {
+ my $kind = $dialog;
+ my $code = \&{"Tk::$dialog{$dialog}"};
+ *$dialog = sub { &$code($kind,@_) };
+ }
+ }
+
+sub MessageBox {
+ my ($kind,%args) = @_;
+ require Tk::Dialog;
+ my $parent = delete $args{'-parent'};
+ my $args = \%args;
+
+ $args->{-bitmap} = delete $args->{-icon} if defined $args->{-icon};
+ $args->{-text} = delete $args->{-message} if defined $args->{-message};
+ $args->{-type} = 'OK' unless defined $args->{-type};
+
+ my $type;
+ if (defined($type = delete $args->{-type})) {
+ delete $args->{-type};
+ my @buttons = grep($_,map(ucfirst($_),
+ split(/(abort|retry|ignore|yes|no|cancel|ok)/,
+ lc($type))));
+ $args->{-buttons} = [@buttons];
+ $args->{-default_button} = ucfirst(delete $args->{-default}) if
+ defined $args->{-default};
+ if (not defined $args->{-default_button} and scalar(@buttons) == 1) {
+ $args->{-default_button} = $buttons[0];
+ }
+ my $md = $parent->Dialog(%$args);
+ my $an = $md->Show;
+ $md->destroy;
+ return $an;
+ }
+} # end messageBox
+
+sub messageBox
+{
+ my ($widget,%args) = @_;
+ # remove in a later version:
+ if (exists $args{'-text'})
+ {
+ warn "The -text option is deprecated. Please use -message instead";
+ if (!exists $args{'-message'})
+ {
+ $args{'-message'} = delete $args{'-text'};
+ }
+ }
+ $args{'-type'} = (exists $args{'-type'}) ? lc($args{'-type'}) : 'ok';
+ $args{'-default'} = lc($args{'-default'}) if (exists $args{'-default'});
+ ucfirst tk_messageBox(-parent => $widget, %args);
+}
+sub _adapt_path_to_os
+{
+ # adapting the path of -initalfile and -initialdir to the operating system
+ # (like that getOpenFile(-initialdir => 'c:/WINNT') will work, as it will
+ # be converted to c:\WINNT)
+ my %args = @_;
+ foreach my $option (qw(-initialfile -initialdir))
+ {
+ if ($args{$option})
+ {
+ $args{$option} = File::Spec->catfile($args{$option});
+ }
+ }
+ return %args;
+}
+sub getOpenFile
+{
+ tk_getOpenFile(-parent => shift,_adapt_path_to_os(@_));
+}
+
+sub getSaveFile
+{
+ tk_getSaveFile(-parent => shift,_adapt_path_to_os(@_));
+}
+
+sub chooseColor
+{
+ tk_chooseColor(-parent => shift,@_);
+}
+
+sub chooseDirectory
+{
+ tk_chooseDirectory(-parent => shift,_adapt_path_to_os(@_));
+}
+
+sub DialogWrapper
+{
+ my ($method,$kind,%args) = @_;
+ my $created = 0;
+ my $w = delete $args{'-parent'};
+ if (defined $w)
+ {
+ $args{'-popover'} = $w;
+ }
+ else
+ {
+ $w = MainWindow->new;
+ $w->withdraw;
+ $created = 1;
+ }
+ my $mw = $w->toplevel;
+ my $fs = $mw->{$kind};
+ unless (defined $fs)
+ {
+ $mw->{$kind} = $fs = $mw->$method(%args);
+ }
+ else
+ {
+ $fs->configure(%args);
+ }
+ my $val = $fs->Show;
+ $w->destroy if $created;
+ return $val;
+}
+
+sub ColorDialog
+{
+ require Tk::ColorEditor;
+ DialogWrapper('ColorDialog',@_);
+}
+
+sub FDialog
+{
+ require Tk::FBox;
+ my $cmd = shift;
+ if ($cmd =~ /Save/)
+ {
+ push @_, -type => 'save';
+ }
+ elsif ($cmd =~ /Directory/)
+ {
+ push @_, -type => 'dir';
+ }
+ DialogWrapper('FBox', $cmd, @_);
+}
+
+sub DirDialog
+{
+ require Tk::DirTree;
+ DialogWrapper('DirTreeDialog',@_);
+}
+
+*MotifFDialog = \&FDialog;
+
+*CORE::GLOBAL::exit = \&exit;
+
+sub MainLoop
+{
+ unless ($inMainLoop)
+ {
+ local $inMainLoop = 1;
+ while (Tk::MainWindow->Count)
+ {
+ DoOneEvent(0);
+ }
+ }
+}
+
+sub tkinit { return MainWindow->new(@_) }
+
+# a wrapper on eval which turns off user $SIG{__DIE__}
+sub catch (&)
+{
+ my $sub = shift;
+ eval {local $SIG{'__DIE__'}; &$sub };
+}
+
+my $Home;
+
+sub TranslateFileName
+{
+ local $_ = shift;
+ unless (defined $Home)
+ {
+ $Home = $ENV{'HOME'} || (defined $ENV{'HOMEDRIVE'} && defined $ENV{'HOMEPATH'} ? $ENV{'HOMEDRIVE'}.$ENV{'HOMEPATH'} : "");
+ $Home =~ s#\\#/#g;
+ $Home .= '/' unless $Home =~ m#/$#;
+ }
+ s#~/#$Home#g;
+ # warn $_;
+ return $_;
+}
+
+sub findINC
+{
+ my $file = join('/',@_);
+ my $dir;
+ $file =~ s,::,/,g;
+ foreach $dir (@INC)
+ {
+ my $path;
+ return $path if (-e ($path = "$dir/$file"));
+ }
+ return undef;
+}
+
+sub idletasks
+{
+ shift->update('idletasks');
+}
+
+sub backtrace
+{
+ my ($self,$msg,$i) = @_;
+ $i = 1 if @_ < 3;
+ while (1)
+ {
+ my ($pack,$file,$line,$sub) = caller($i++);
+ last unless defined($sub);
+ $msg .= "\n $sub at $file line $line";
+ }
+ return "$msg\n";
+}
+
+sub die_with_trace
+{
+ my ($self,$msg) = @_;
+ die $self->backtrace($msg,1);
+}
+
+
+
+1;
+
+__END__
+
+sub Error
+{my $w = shift;
+ my $error = shift;
+ if (Exists($w))
+ {
+ my $grab = $w->grab('current');
+ $grab->Unbusy if (defined $grab);
+ }
+ chomp($error);
+ warn "Tk::Error: $error\n " . join("\n ",@_)."\n";
+}
+
+sub CancelRepeat
+{
+ my $w = shift->MainWindow;
+ my $id = delete $w->{_afterId_};
+ $w->after('cancel',$id) if (defined $id);
+}
+
+sub RepeatId
+{
+ my ($w,$id) = @_;
+ $w = $w->MainWindow;
+ $w->CancelRepeat;
+ $w->{_afterId_} = $id;
+}
+
+
+
+#----------------------------------------------------------------------------
+# focus.tcl --
+#
+# This file defines several procedures for managing the input
+# focus.
+#
+# @(#) focus.tcl 1.6 94/12/19 17:06:46
+#
+# Copyright (c) 1994 Sun Microsystems, Inc.
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+
+sub FocusChildren { shift->children }
+
+#
+# focusNext --
+# This procedure is invoked to move the input focus to the next window
+# after a given one. "Next" is defined in terms of the window
+# stacking order, with all the windows underneath a given top-level
+# (no matter how deeply nested in the hierarchy) considered except
+# for frames and toplevels.
+#
+# Arguments:
+# w - Name of a window: the procedure will set the focus
+# to the next window after this one in the traversal
+# order.
+sub focusNext
+{
+ my $w = shift;
+ my $cur = $w->getNextFocus;
+ if ($cur)
+ {
+ $cur->tabFocus;
+ }
+}
+
+sub getNextFocus
+{
+ my $w = shift;
+ my $cur = $w;
+ while (1)
+ {
+ # Descend to just before the first child of the current widget.
+ my $parent = $cur;
+ my @children = $cur->FocusChildren();
+ my $i = -1;
+ # Look for the next sibling that isn't a top-level.
+ while (1)
+ {
+ $i += 1;
+ if ($i < @children)
+ {
+ $cur = $children[$i];
+ next if ($cur->toplevel == $cur);
+ last
+ }
+ # No more siblings, so go to the current widget's parent.
+ # If it's a top-level, break out of the loop, otherwise
+ # look for its next sibling.
+ $cur = $parent;
+ last if ($cur->toplevel() == $cur);
+ $parent = $parent->parent();
+ @children = $parent->FocusChildren();
+ $i = lsearch(\@children,$cur);
+ }
+ if ($cur == $w || $cur->FocusOK)
+ {
+ return $cur;
+ }
+ }
+}
+# focusPrev --
+# This procedure is invoked to move the input focus to the previous
+# window before a given one. "Previous" is defined in terms of the
+# window stacking order, with all the windows underneath a given
+# top-level (no matter how deeply nested in the hierarchy) considered.
+#
+# Arguments:
+# w - Name of a window: the procedure will set the focus
+# to the previous window before this one in the traversal
+# order.
+sub focusPrev
+{
+ my $w = shift;
+ my $cur = $w->getPrevFocus;
+ if ($cur)
+ {
+ $cur->tabFocus;
+ }
+}
+
+sub getPrevFocus
+{
+ my $w = shift;
+ my $cur = $w;
+ my @children;
+ my $i;
+ my $parent;
+ while (1)
+ {
+ # Collect information about the current window's position
+ # among its siblings. Also, if the window is a top-level,
+ # then reposition to just after the last child of the window.
+ if ($cur->toplevel() == $cur)
+ {
+ $parent = $cur;
+ @children = $cur->FocusChildren();
+ $i = @children;
+ }
+ else
+ {
+ $parent = $cur->parent();
+ @children = $parent->FocusChildren();
+ $i = lsearch(\@children,$cur);
+ }
+ # Go to the previous sibling, then descend to its last descendant
+ # (highest in stacking order. While doing this, ignore top-levels
+ # and their descendants. When we run out of descendants, go up
+ # one level to the parent.
+ while ($i > 0)
+ {
+ $i--;
+ $cur = $children[$i];
+ next if ($cur->toplevel() == $cur);
+ $parent = $cur;
+ @children = $parent->FocusChildren();
+ $i = @children;
+ }
+ $cur = $parent;
+ if ($cur == $w || $cur->FocusOK)
+ {
+ return $cur;
+ }
+ }
+
+}
+
+sub FocusOK
+{
+ my $w = shift;
+ my $value;
+ catch { $value = $w->cget('-takefocus') };
+ if (!$@ && defined($value))
+ {
+ return 0 if ($value eq '0');
+ return $w->viewable if ($value eq '1');
+ if ($value)
+ {
+ $value = $w->$value();
+ return $value if (defined $value);
+ }
+ }
+ if (!$w->viewable)
+ {
+ return 0;
+ }
+ catch { $value = $w->cget('-state') } ;
+ if (!$@ && defined($value) && $value eq 'disabled')
+ {
+ return 0;
+ }
+ $value = grep(/Key|Focus/,$w->Tk::bind(),$w->Tk::bind(ref($w)));
+ return $value;
+}
+
+
+# focusFollowsMouse
+#
+# If this procedure is invoked, Tk will enter "focus-follows-mouse"
+# mode, where the focus is always on whatever window contains the
+# mouse. If this procedure isn't invoked, then the user typically
+# has to click on a window to give it the focus.
+#
+# Arguments:
+# None.
+
+sub EnterFocus
+{
+ my $w = shift;
+ return unless $w;
+ my $Ev = $w->XEvent;
+ my $d = $Ev->d;
+ $w->Tk::focus() if ($d eq 'NotifyAncestor' || $d eq 'NotifyNonlinear' || $d eq 'NotifyInferior');
+}
+
+sub tabFocus
+{
+ shift->Tk::focus;
+}
+
+sub focusFollowsMouse
+{
+ my $widget = shift;
+ $widget->bind('all','<Enter>','EnterFocus');
+}
+
+# tkTraverseToMenu --
+# This procedure implements keyboard traversal of menus. Given an
+# ASCII character "char", it looks for a menubutton with that character
+# underlined. If one is found, it posts the menubutton's menu
+#
+# Arguments:
+# w - Window in which the key was typed (selects
+# a toplevel window).
+# char - Character that selects a menu. The case
+# is ignored. If an empty string, nothing
+# happens.
+sub TraverseToMenu
+{
+ my $w = shift;
+ my $char = shift;
+ return unless(defined $char && $char ne '');
+ $w = $w->toplevel->FindMenu($char);
+}
+# tkFirstMenu --
+# This procedure traverses to the first menubutton in the toplevel
+# for a given window, and posts that menubutton's menu.
+#
+# Arguments:
+# w - Name of a window. Selects which toplevel
+# to search for menubuttons.
+sub FirstMenu
+{
+ my $w = shift;
+ $w = $w->toplevel->FindMenu('');
+}
+
+# These wrappers don't use method syntax so need to live
+# in same package as raw Tk routines are newXS'ed into.
+
+sub Selection
+{my $widget = shift;
+ my $cmd = shift;
+ croak 'Use SelectionOwn/SelectionOwner' if ($cmd eq 'own');
+ croak "Use Selection\u$cmd()";
+}
+
+# If we have sub Clipboard in Tk then use base qw(Tk::Clipboard ....)
+# calls it when it does its eval "require $base"
+#sub Clipboard
+#{my $w = shift;
+# my $cmd = shift;
+# croak "Use clipboard\u$cmd()";
+#}
+
+sub Receive
+{
+ my $w = shift;
+ warn 'Receive(' . join(',',@_) .')';
+ die 'Tk rejects send(' . join(',',@_) .")\n";
+}
+
+sub break
+{
+ die "_TK_BREAK_\n";
+}
+
+sub updateWidgets
+{
+ my ($w) = @_;
+ while ($w->DoOneEvent(DONT_WAIT|IDLE_EVENTS|WINDOW_EVENTS))
+ {
+ }
+ $w;
+}
+
+sub ImageNames
+{
+ image('names');
+}
+
+sub ImageTypes
+{
+ image('types');
+}
+
+sub interps
+{
+ my $w = shift;
+ return $w->winfo('interps','-displayof');
+}
+
+sub lsearch
+{my $ar = shift;
+ my $x = shift;
+ my $i;
+ for ($i = 0; $i < scalar @$ar; $i++)
+ {
+ return $i if ($$ar[$i] eq $x);
+ }
+ return -1;
+}
+
+
+sub getEncoding
+{
+ my ($class,$name) = @_;
+ eval { require Encode };
+ if ($@)
+ {
+ require Tk::DummyEncode;
+ return Tk::DummyEncode->getEncoding($name);
+ }
+ $name = $Tk::font_encoding{$name} if exists $Tk::font_encoding{$name};
+ my $enc = Encode::find_encoding($name);
+
+ unless ($enc)
+ {
+ $enc = Encode::find_encoding($name) if ($name =~ s/[-_]\d+$//)
+ }
+# if ($enc)
+# {
+# print STDERR "Lookup '$name' => ".$enc->name."\n";
+# }
+# else
+# {
+# print STDERR "Failed '$name'\n";
+# }
+ unless ($enc)
+ {
+ if ($name eq 'X11ControlChars')
+ {
+ require Tk::DummyEncode;
+ $Encode::encoding{$name} = $enc = Tk::DummyEncode->getEncoding($name);
+ }
+ }
+ return $enc;
+}
+
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/Tk.pod b/Master/tlpkg/tlperl.straw/lib/Tk.pod
new file mode 100755
index 00000000000..1024b3b4c5b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Tk.pod
@@ -0,0 +1,862 @@
+=head1 NAME
+
+Tk - a graphical user interface toolkit for Perl
+
+=head1 SYNOPSIS
+
+ use Tk;
+ $top = new MainWindow;
+ MainLoop;
+
+=head1 DESCRIPTION
+
+The Perl/Tk manual is split up into a number of sections:
+
+=head2 Introduction
+
+=over 4
+
+=item *
+
+L<Tk::overview|Tk::overview>
+
+=item *
+
+L<Tk::UserGuide|Tk::UserGuide>
+
+=back
+
+=head2 Tk Geometry Management
+
+=over 4
+
+=item *
+
+L<Tk::Adjuster|Tk::Adjuster>
+
+=item *
+
+L<Tk::form|Tk::form>
+
+=item *
+
+L<Tk::grid|Tk::grid>
+
+=item *
+
+L<Tk::pack|Tk::pack>
+
+=item *
+
+L<Tk::place|Tk::place>
+
+=item *
+
+L<Tk::Table|Tk::Table>
+
+=item *
+
+L<Tk::Tiler|Tk::Tiler>
+
+=item *
+
+L<Tk::Wm|Tk::Wm>
+
+=back
+
+=head2 Binding Events and Callbacks
+
+=over 4
+
+=item *
+
+L<Tk::after|Tk::after>
+
+=item *
+
+L<Tk::bind|Tk::bind>
+
+=item *
+
+L<Tk::bindtags|Tk::bindtags>
+
+=item *
+
+L<Tk::callbacks|Tk::callbacks>
+
+=item *
+
+L<Tk::Error|Tk::Error>
+
+=item *
+
+L<Tk::event|Tk::event>
+
+=item *
+
+L<Tk::exit|Tk::exit>
+
+=item *
+
+L<Tk::fileevent|Tk::fileevent>
+
+=item *
+
+L<Tk::IO|Tk::IO>
+
+=back
+
+=head2 Tk Image Classes
+
+=over 4
+
+=item *
+
+L<Tk::Animation|Tk::Animation>
+
+=item *
+
+L<Tk::Bitmap|Tk::Bitmap>
+
+=item *
+
+L<Tk::Compound|Tk::Compound>
+
+=item *
+
+L<Tk::Image|Tk::Image>
+
+=item *
+
+L<Tk::JPEG|Tk::JPEG>
+
+=item *
+
+L<Tk::Photo|Tk::Photo>
+
+=item *
+
+L<Tk::Pixmap|Tk::Pixmap>
+
+=item *
+
+L<Tk::PNG|Tk::PNG>
+
+=back
+
+=head2 Tk Widget Classes
+
+=over 4
+
+=item *
+
+L<Tk::Button|Tk::Button>
+
+=item *
+
+L<Tk::Canvas|Tk::Canvas>
+
+=item *
+
+L<Tk::Checkbutton|Tk::Checkbutton>
+
+=item *
+
+L<Tk::Entry|Tk::Entry>
+
+=item *
+
+L<Tk::Frame|Tk::Frame>
+
+=item *
+
+L<Tk::HList|Tk::HList>
+
+=item *
+
+L<Tk::Label|Tk::Label>
+
+=item *
+
+L<Tk::Listbox|Tk::Listbox>
+
+=item *
+
+L<Tk::Menu|Tk::Menu>
+
+=item *
+
+L<Tk::Menubutton|Tk::Menubutton>
+
+=item *
+
+L<Tk::Message|Tk::Message>
+
+=item *
+
+L<Tk::Optionmenu|Tk::Optionmenu>
+
+=item *
+
+L<Tk::Radiobutton|Tk::Radiobutton>
+
+=item *
+
+L<Tk::Scale|Tk::Scale>
+
+=item *
+
+L<Tk::Scrollbar|Tk::Scrollbar>
+
+=item *
+
+L<Tk::Text|Tk::Text>
+
+=item *
+
+L<Tk::Toplevel|Tk::Toplevel>
+
+=back
+
+=head2 Tix Extensions
+
+=over 4
+
+=item *
+
+L<Tk::Balloon|Tk::Balloon>
+
+=item *
+
+L<Tk::BrowseEntry|Tk::BrowseEntry>
+
+=item *
+
+L<Tk::DialogBox|Tk::DialogBox>
+
+=item *
+
+L<Tk::DirTree|Tk::DirTree>
+
+=item *
+
+L<Tk::DItem|Tk::DItem>
+
+=item *
+
+L<Tk::InputO|Tk::InputO>
+
+=item *
+
+L<Tk::LabFrame|Tk::LabFrame>
+
+=item *
+
+L<Tk::Mwm|Tk::Mwm>
+
+=item *
+
+L<Tk::NoteBook|Tk::NoteBook>
+
+=item *
+
+L<Tk::TixGrid|Tk::TixGrid>
+
+=item *
+
+L<Tk::tixWm|Tk::tixWm>
+
+=item *
+
+L<Tk::TList|Tk::TList>
+
+=item *
+
+L<Tk::Tree|Tk::Tree>
+
+=back
+
+=head2 Tk Generic Methods
+
+=over 4
+
+=item *
+
+L<Tk::Font|Tk::Font>
+
+=item *
+
+L<Tk::send|Tk::send>
+
+=item *
+
+L<Tk::tkvars|Tk::tkvars>
+
+=item *
+
+L<Tk::Widget|Tk::Widget>
+
+=item *
+
+L<Tk::X11Font|Tk::X11Font>
+
+=back
+
+=head2 User Interaction
+
+=over 4
+
+=item *
+
+L<Tk::DropSite|Tk::DropSite>
+
+=item *
+
+L<Tk::Clipboard|Tk::Clipboard>
+
+=item *
+
+L<Tk::focus|Tk::focus>
+
+=item *
+
+L<Tk::grab|Tk::grab>
+
+=item *
+
+L<Tk::selection|Tk::selection>
+
+=back
+
+=head2 Creating and Configuring Widgets
+
+=over 4
+
+=item *
+
+L<Tk::CmdLine|Tk::CmdLine>
+
+=item *
+
+L<Tk::MainWindow|Tk::MainWindow>
+
+=item *
+
+L<Tk::option|Tk::option>
+
+=item *
+
+L<Tk::options|Tk::options>
+
+=item *
+
+L<Tk::palette|Tk::palette>
+
+=item *
+
+L<Tk::Xrm|Tk::Xrm>
+
+=back
+
+=head2 Popups and Dialogs
+
+=over 4
+
+=item *
+
+L<Tk::chooseColor|Tk::chooseColor>
+
+=item *
+
+L<Tk::chooseDirectory|Tk::chooseDirectory>
+
+=item *
+
+L<Tk::ColorEditor|Tk::ColorEditor>
+
+=item *
+
+L<Tk::Dialog|Tk::Dialog>
+
+=item *
+
+L<Tk::DialogBox|Tk::DialogBox>
+
+=item *
+
+L<Tk::FBox|Tk::FBox>
+
+=item *
+
+L<Tk::FileSelect|Tk::FileSelect>
+
+=item *
+
+L<Tk::getOpenFile|Tk::getOpenFile>
+
+=item *
+
+L<Tk::messageBox|Tk::messageBox>
+
+=item *
+
+L<Tk::MsgBox|Tk::MsgBox>
+
+=back
+
+=head2 Derived Widgets
+
+=over 4
+
+=item *
+
+L<Tk::composite|Tk::composite>
+
+=item *
+
+L<Tk::configspec|Tk::configspec>
+
+=item *
+
+L<Tk::Derived|Tk::Derived>
+
+=item *
+
+L<Tk::mega|Tk::mega>
+
+=item *
+
+L<Tk::ROText|Tk::ROText>
+
+=item *
+
+L<Tk::Scrolled|Tk::Scrolled>
+
+=item *
+
+L<Tk::TextUndo|Tk::TextUndo>
+
+=item *
+
+L<Tk::Reindex|Tk::Reindex>
+
+=item *
+
+L<Tk::Pane|Tk::Pane>
+
+=item *
+
+L<Tk::ProgressBar|Tk::ProgressBar>
+
+=back
+
+=head2 C Programming
+
+=over 4
+
+=item *
+
+Internals
+
+=item *
+
+pTk
+
+=item *
+
+3DBorder
+
+=item *
+
+BackgdErr
+
+=item *
+
+BindTable
+
+=item *
+
+CanvPsY
+
+=item *
+
+CanvTkwin
+
+=item *
+
+CanvTxtInfo
+
+=item *
+
+Clipboard
+
+=item *
+
+ClrSelect
+
+=item *
+
+ConfigWidg
+
+=item *
+
+ConfigWind
+
+=item *
+
+CoordToWin
+
+=item *
+
+CrtErrHdlr
+
+=item *
+
+CrtGenHdlr
+
+=item *
+
+CrtImgType
+
+=item *
+
+CrtItemType
+
+=item *
+
+CrtMainWin
+
+=item *
+
+CrtPhImgFmt
+
+=item *
+
+CrtSelHdlr
+
+=item *
+
+CrtWindow
+
+=item *
+
+DeleteImg
+
+=item *
+
+DoOneEvent
+
+=item *
+
+DoWhenIdle
+
+=item *
+
+DrawFocHlt
+
+=item *
+
+EventHndlr
+
+=item *
+
+EventInit
+
+=item *
+
+FileHndlr
+
+=item *
+
+FindPhoto
+
+=item *
+
+FontId
+
+=item *
+
+FreeXId
+
+=item *
+
+GeomReq
+
+=item *
+
+GetAnchor
+
+=item *
+
+GetBitmap
+
+=item *
+
+GetCapStyl
+
+=item *
+
+GetClrmap
+
+=item *
+
+GetColor
+
+=item *
+
+GetCursor
+
+=item *
+
+GetFont
+
+=item *
+
+GetFontStr
+
+=item *
+
+GetGC
+
+=item *
+
+GetImage
+
+=item *
+
+GetJoinStl
+
+=item *
+
+GetJustify
+
+=item *
+
+GetOption
+
+=item *
+
+GetPixels
+
+=item *
+
+GetPixmap
+
+=item *
+
+GetRelief
+
+=item *
+
+GetRootCrd
+
+=item *
+
+GetScroll
+
+=item *
+
+GetSelect
+
+=item *
+
+GetUid
+
+=item *
+
+GetVisual
+
+=item *
+
+GetVRoot
+
+=item *
+
+HandleEvent
+
+=item *
+
+IdToWindow
+
+=item *
+
+ImgChanged
+
+=item *
+
+InternAtom
+
+=item *
+
+MainLoop
+
+=item *
+
+MaintGeom
+
+=item *
+
+MainWin
+
+=item *
+
+ManageGeom
+
+=item *
+
+MapWindow
+
+=item *
+
+MeasureChar
+
+=item *
+
+MoveToplev
+
+=item *
+
+Name
+
+=item *
+
+NameOfImg
+
+=item *
+
+OwnSelect
+
+=item *
+
+ParseArgv
+
+=item *
+
+Preserve
+
+=item *
+
+QWinEvent
+
+=item *
+
+Restack
+
+=item *
+
+RestrictEv
+
+=item *
+
+SetAppName
+
+=item *
+
+SetClass
+
+=item *
+
+SetGrid
+
+=item *
+
+SetVisual
+
+=item *
+
+Sleep
+
+=item *
+
+StrictMotif
+
+=item *
+
+TextLayout
+
+=item *
+
+TimerHndlr
+
+=item *
+
+Tk_Init
+
+=item *
+
+WindowId
+
+=back
+
+=head2 Implementation
+
+=over 4
+
+=item *
+
+L<Tk::Eventloop|Tk::Eventloop>
+
+=item *
+
+L<Tk::Menu::Item|Tk::Menu::Item>
+
+=item *
+
+L<Tk::Submethods|Tk::Submethods>
+
+=item *
+
+L<Tk::WidgetDemo|Tk::WidgetDemo>
+
+=item *
+
+L<Tk::widgets|Tk::widgets>
+
+=back
+
+=head2 Experimental Modules
+
+=over 4
+
+=item *
+
+L<Tk::Common|Tk::Common>
+
+=item *
+
+L<Tk::SunConst|Tk::SunConst>
+
+=item *
+
+L<Tk::WinPhoto|Tk::WinPhoto>
+
+=back
+
+=head2 Other Modules and Languages
+
+=over 4
+
+=item *
+
+Tk::Compile
+
+=item *
+
+L<Tk::Tcl-perl|Tk::Tcl-perl>
+
+=item *
+
+L<Tk::X|Tk::X>
+
+=back
+
+
+=head1 AUTHOR
+
+Nick Ing-Simmons
+
+=head1 SEE ALSO
+
+L<perl>, L<wish(1)>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Tree/DAG_Node.pm b/Master/tlpkg/tlperl.straw/lib/Tree/DAG_Node.pm
new file mode 100755
index 00000000000..662e17d7988
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Tree/DAG_Node.pm
@@ -0,0 +1,2942 @@
+require 5;
+package Tree::DAG_Node;
+use Carp ();
+use strict;
+use vars qw(@ISA $Debug $VERSION);
+
+$Debug = 0;
+$VERSION = '1.06';
+
+=head1 NAME
+
+Tree::DAG_Node - (super)class for representing nodes in a tree
+
+=head1 SYNOPSIS
+
+Using as a base class:
+
+ package Game::Tree::Node; # or whatever you're doing
+ use Tree::DAG_Node;
+ @ISA = qw(Tree::DAG_Node);
+ ...your own methods overriding/extending
+ the methods in Tree::DAG_Node...
+
+Using as a class of its own:
+
+ use Tree::DAG_Node;
+ my $root = Tree::DAG_Node->new();
+ $root->name("I'm the tops");
+ my $new_daughter = $root->new_daughter;
+ $new_daughter->name("More");
+ ...
+
+=head1 DESCRIPTION
+
+This class encapsulates/makes/manipulates objects that represent nodes
+in a tree structure. The tree structure is not an object itself, but
+is emergent from the linkages you create between nodes. This class
+provides the methods for making linkages that can be used to build up
+a tree, while preventing you from ever making any kinds of linkages
+which are not allowed in a tree (such as having a node be its own
+mother or ancestor, or having a node have two mothers).
+
+This is what I mean by a "tree structure", a bit redundantly stated:
+
+* A tree is a special case of an acyclic directed graph.
+
+* A tree is a network of nodes where there's exactly one root
+node (i.e., 'the top'), and the only primary relationship between nodes
+is the mother-daugher relationship.
+
+* No node can be its own mother, or its mother's mother, etc.
+
+* Each node in the tree has exactly one "parent" (node in the "up"
+direction) -- except the root, which is parentless.
+
+* Each node can have any number (0 to any finite number) of daughter
+nodes. A given node's daughter nodes constitute an I<ordered> list.
+(However, you are free to consider this ordering irrelevant.
+Some applications do need daughters to be ordered, so I chose to
+consider this the general case.)
+
+* A node can appear in only one tree, and only once in that tree.
+Notably (notable because it doesn't follow from the two above points),
+a node cannot appear twice in its mother's daughter list.
+
+* In other words, there's an idea of up (toward the root) versus
+down (away from the root), and left (i.e., toward the start (index 0)
+of a given node's daughter list) versus right (toward the end of a
+given node's daughter list).
+
+Trees as described above have various applications, among them:
+representing syntactic constituency, in formal linguistics;
+representing contingencies in a game tree; representing abstract
+syntax in the parsing of any computer language -- whether in
+expression trees for programming languages, or constituency in the
+parse of a markup language document. (Some of these might not use the
+fact that daughters are ordered.)
+
+(Note: B-Trees are a very special case of the above kinds of trees,
+and are best treated with their own class. Check CPAN for modules
+encapsulating B-Trees; or if you actually want a database, and for
+some reason ended up looking here, go look at L<AnyDBM_File>.)
+
+Many base classes are not usable except as such -- but Tree::DAG_Node
+can be used as a normal class. You can go ahead and say:
+
+ use Tree::DAG_Node;
+ my $root = Tree::DAG_Node->new();
+ $root->name("I'm the tops");
+ $new_daughter = Tree::DAG_Node->new();
+ $new_daughter->name("More");
+ $root->add_daughter($new_daughter);
+
+and so on, constructing and linking objects from Tree::DAG_Node and
+making useful tree structures out of them.
+
+=head1 A NOTE TO THE READER
+
+This class is big and provides lots of methods. If your problem is
+simple (say, just representing a simple parse tree), this class might
+seem like using an atomic sledgehammer to swat a fly. But the
+complexity of this module's bells and whistles shouldn't detract from
+the efficiency of using this class for a simple purpose. In fact, I'd
+be very surprised if any one user ever had use for more that even a
+third of the methods in this class. And remember: an atomic
+sledgehammer B<will> kill that fly.
+
+=head1 OBJECT CONTENTS
+
+Implementationally, each node in a tree is an object, in the sense of
+being an arbitrarily complex data structure that belongs to a class
+(presumably Tree::DAG_Node, or ones derived from it) that provides
+methods.
+
+The attributes of a node-object are:
+
+=over
+
+=item mother -- this node's mother. undef if this is a root.
+
+=item daughters -- the (possibly empty) list of daughters of this node.
+
+=item name -- the name for this node.
+
+Need not be unique, or even printable. This is printed in some of the
+various dumper methods, but it's up to you if you don't put anything
+meaningful or printable here.
+
+=item attributes -- whatever the user wants to use it for.
+
+Presumably a hashref to whatever other attributes the user wants to
+store without risk of colliding with the object's real attributes.
+(Example usage: attributes to an SGML tag -- you definitely wouldn't
+want the existence of a "mother=foo" pair in such a tag to collide with
+a node object's 'mother' attribute.)
+
+Aside from (by default) initializing it to {}, and having the access
+method called "attributes" (described a ways below), I don't do
+anything with the "attributes" in this module. I basically intended
+this so that users who don't want/need to bother deriving a class
+from Tree::DAG_Node, could still attach whatever data they wanted in a
+node.
+
+=back
+
+"mother" and "daughters" are attributes that relate to linkage -- they
+are never written to directly, but are changed as appropriate by the
+"linkage methods", discussed below.
+
+The other two (and whatever others you may add in derived classes) are
+simply accessed thru the same-named methods, discussed further below.
+
+=head2 ABOUT THE DOCUMENTED INTERFACE
+
+Stick to the documented interface (and comments in the source --
+especially ones saying "undocumented!" and/or "disfavored!" -- do not
+count as documentation!), and don't rely on any behavior that's not in
+the documented interface.
+
+Specifically, unless the documentation for a particular method says
+"this method returns thus-and-such a value", then you should not rely on
+it returning anything meaningful.
+
+A I<passing> acquintance with at least the broader details of the source
+code for this class is assumed for anyone using this class as a base
+class -- especially if you're overriding existing methods, and
+B<definitely> if you're overriding linkage methods.
+
+=head1 MAIN CONSTRUCTOR, AND INITIALIZER
+
+=over
+
+=item the constructor CLASS->new() or CLASS->new({...options...})
+
+This creates a new node object, calls $object->_init({...options...})
+to provide it sane defaults (like: undef name, undef mother, no
+daughters, 'attributes' setting of a new empty hashref), and returns
+the object created. (If you just said "CLASS->new()" or "CLASS->new",
+then it pretends you called "CLASS->new({})".)
+
+Currently no options for putting in {...options...} are part
+of the documented interface, but the options is here in case
+you want to add such behavior in a derived class.
+
+Read on if you plan on using Tree::DAG_New as a base class.
+(Otherwise feel free to skip to the description of _init.)
+
+There are, in my mind, two ways to do object construction:
+
+Way 1: create an object, knowing that it'll have certain uninteresting
+sane default values, and then call methods to change those values to
+what you want. Example:
+
+ $node = Tree::DAG_Node->new;
+ $node->name('Supahnode!');
+ $root->add_daughter($node);
+ $node->add_daughters(@some_others)
+
+Way 2: be able to specify some/most/all the object's attributes in
+the call to the constructor. Something like:
+
+ $node = Tree::DAG_Node->new({
+ name => 'Supahnode!',
+ mother => $root,
+ daughters => \@some_others
+ });
+
+After some deliberation, I've decided that the second way is a Bad
+Thing. First off, it is B<not> markedly more concise than the first
+way. Second off, it often requires subtly different syntax (e.g.,
+\@some_others vs @some_others). It just complicates things for the
+programmer and the user, without making either appreciably happier.
+
+(This is not to say that options in general for a constructor are bad
+-- C<random_network>, discussed far below, necessarily takes options.
+But note that those are not options for the default values of
+attributes.)
+
+Anyway, if you use Tree::DAG_Node as a superclass, and you add
+attributes that need to be initialized, what you need to do is provide
+an _init method that calls $this->SUPER::_init($options) to use its
+superclass's _init method, and then initializes the new attributes:
+
+ sub _init {
+ my($this, $options) = @_[0,1];
+ $this->SUPER::_init($options); # call my superclass's _init to
+ # init all the attributes I'm inheriting
+
+ # Now init /my/ new attributes:
+ $this->{'amigos'} = []; # for example
+ }
+
+...or, as I prefer when I'm being a neat freak:
+
+ sub _init {
+ my($this, $options) = @_[0,1];
+ $this->SUPER::_init($options);
+
+ $this->_init_amigos($options);
+ }
+
+ sub _init_amigos {
+ my $this = $_[0];
+ # Or my($this,$options) = @_[0,1]; if I'm using $options
+ $this->{'amigos'} = [];
+ }
+
+
+In other words, I like to have each attribute initialized thru a
+method named _init_[attribute], which should expect the object as
+$_[0] and the the options hashref (or {} if none was given) as $_[1].
+If you insist on having your _init recognize options for setting
+attributes, you might as well have them dealt with by the appropriate
+_init_[attribute] method, like this:
+
+ sub _init {
+ my($this, $options) = @_[0,1];
+ $this->SUPER::_init($options);
+
+ $this->_init_amigos($options);
+ }
+
+ sub _init_amigos {
+ my($this,$options) = @_[0,1]; # I need options this time
+ $this->{'amigos'} = [];
+ $this->amigos(@{$options->{'amigos'}}) if $options->{'amigos'};
+ }
+
+All this bookkeeping looks silly with just one new attribute in a
+class derived straight from Tree::DAG_Node, but if there's lots of new
+attributes running around, and if you're deriving from a class derived
+from a class derived from Tree::DAG_Node, then tidy
+stratification/modularization like this can keep you sane.
+
+=item the constructor $obj->new() or $obj->new({...options...})
+
+Just another way to get at the C<new> method. This B<does not copy>
+$obj, but merely constructs a new object of the same class as it.
+Saves you the bother of going $class = ref $obj; $obj2 = $class->new;
+
+=cut
+
+sub new { # constructor
+ # Presumably you won't EVER need to override this -- _init is what
+ # you'd override in order to set an object's default attribute values.
+ my $class = shift;
+ $class = ref($class) if ref($class); # tchristic style. why not?
+
+ my $o = ref($_[0]) eq 'HASH' ? $_[0] : {}; # o for options hashref
+ my $it = bless( {}, $class );
+ print "Constructing $it in class $class\n" if $Debug;
+ $it->_init( $o );
+ return $it;
+}
+
+###########################################################################
+
+=item the method $node->_init({...options...})
+
+Initialize the object's attribute values. See the discussion above.
+Presumably this should be called only by the guts of the C<new>
+constructor -- never by the end user.
+
+Currently there are no documented options for putting in
+{...options...}, but (in case you want to disregard the above rant)
+the option exists for you to use {...options...} for something useful
+in a derived class.
+
+Please see the source for more information.
+
+=item see also (below) the constructors "new_daughter" and "new_daughter_left"
+
+=back
+
+=cut
+
+sub _init { # method
+ my $this = shift;
+ my $o = ref($_[0]) eq 'HASH' ? $_[0] : {};
+
+ # Sane initialization.
+ $this->_init_mother($o);
+ $this->_init_daughters($o);
+ $this->_init_name($o);
+ $this->_init_attributes($o);
+
+ return;
+}
+
+sub _init_mother { # to be called by an _init
+ my($this, $o) = @_[0,1];
+
+ $this->{'mother'} = undef;
+
+ # Undocumented and disfavored. Consider this just an example.
+ ( $o->{'mother'} )->add_daughter($this)
+ if defined($o->{'mother'}) && ref($o->{'mother'});
+ # DO NOT use this option (as implemented) with new_daughter or
+ # new_daughter_left!!!!!
+ # BAD THINGS MAY HAPPEN!!!
+}
+
+sub _init_daughters { # to be called by an _init
+ my($this, $o) = @_[0,1];
+
+ $this->{'daughters'} = [];
+
+ # Undocumented and disfavored. Consider this just an example.
+ $this->set_daughters( @{$o->{'daughters'}} )
+ if ref($o->{'daughters'}) && (@{$o->{'daughters'}});
+ # DO NOT use this option (as implemented) with new_daughter or
+ # new_daughter_left!!!!!
+ # BAD THINGS MAY HAPPEN!!!
+}
+
+sub _init_name { # to be called by an _init
+ my($this, $o) = @_[0,1];
+
+ $this->{'name'} = undef;
+
+ # Undocumented and disfavored. Consider this just an example.
+ $this->name( $o->{'name'} ) if exists $o->{'name'};
+}
+
+sub _init_attributes { # to be called by an _init
+ my($this, $o) = @_[0,1];
+
+ $this->{'attributes'} = {};
+
+ # Undocumented and disfavored. Consider this just an example.
+ $this->attributes( $o->{'attributes'} ) if exists $o->{'attributes'};
+}
+
+###########################################################################
+###########################################################################
+
+=head1 LINKAGE-RELATED METHODS
+
+=over
+
+=item $node->daughters
+
+This returns the (possibly empty) list of daughters for $node.
+
+=cut
+
+sub daughters { # read-only attrib-method: returns a list.
+ my $this = shift;
+
+ if(@_) { # undoc'd and disfavored to use as a write-method
+ Carp::croak "Don't set daughters with doughters anymore\n";
+ Carp::carp "my parameter must be a listref" unless ref($_[0]);
+ $this->{'daughters'} = $_[0];
+ $this->_update_daughter_links;
+ }
+ #return $this->{'daughters'};
+ return @{$this->{'daughters'} || []};
+}
+
+###########################################################################
+
+=item $node->mother
+
+This returns what node is $node's mother. This is undef if $node has
+no mother -- i.e., if it is a root.
+
+=cut
+
+sub mother { # read-only attrib-method: returns an object (the mother node)
+ my $this = shift;
+ Carp::croak "I'm a read-only method!" if @_;
+ return $this->{'mother'};
+}
+
+###########################################################################
+###########################################################################
+
+=item $mother->add_daughters( LIST )
+
+This method adds the node objects in LIST to the (right) end of
+$mother's C<daughter> list. Making a node N1 the daughter of another
+node N2 also means that N1's C<mother> attribute is "automatically" set
+to N2; it also means that N1 stops being anything else's daughter as
+it becomes N2's daughter.
+
+If you try to make a node its own mother, a fatal error results. If
+you try to take one of a a node N1's ancestors and make it also a
+daughter of N1, a fatal error results. A fatal error results if
+anything in LIST isn't a node object.
+
+If you try to make N1 a daughter of N2, but it's B<already> a daughter
+of N2, then this is a no-operation -- it won't move such nodes to the
+end of the list or anything; it just skips doing anything with them.
+
+=item $node->add_daughter( LIST )
+
+An exact synonym for $node->add_daughters(LIST)
+
+=cut
+
+sub add_daughters { # write-only method
+ my($mother, @daughters) = @_;
+ return unless @daughters; # no-op
+ return
+ $mother->_add_daughters_wrapper(
+ sub { push @{$_[0]}, $_[1]; },
+ @daughters
+ );
+}
+
+sub add_daughter { # alias
+ my($it,@them) = @_; $it->add_daughters(@them);
+}
+
+=item $mother->add_daughters_left( LIST )
+
+This method is just like C<add_daughters>, except that it adds the
+node objects in LIST to the (left) beginning of $mother's daughter
+list, instead of the (right) end of it.
+
+=item $node->add_daughter_left( LIST )
+
+An exact synonym for $node->add_daughters_left( LIST )
+
+=cut
+
+sub add_daughters_left { # write-only method
+ my($mother, @daughters) = @_;
+ return unless @daughters;
+ return
+ $mother->_add_daughters_wrapper(
+ sub { unshift @{$_[0]}, $_[1]; },
+ @daughters
+ );
+}
+
+sub add_daughter_left { # alias
+ my($it,@them) = @_; $it->add_daughters_left(@them);
+}
+
+=item Note:
+
+The above link-making methods perform basically an C<unshift> or
+C<push> on the mother node's daughter list. To get the full range of
+list-handling functionality, copy the daughter list, and change it,
+and then call C<set_daughters> on the result:
+
+ @them = $mother->daughters;
+ @removed = splice(@them, 0,2, @new_nodes);
+ $mother->set_daughters(@them);
+
+Or consider a structure like:
+
+ $mother->set_daughters(
+ grep($_->name =~ /NP/ ,
+ $mother->daughters
+ )
+ );
+
+=cut
+
+
+###
+## Used by the adding methods
+# (except maybe new_daughter, and new_daughter_left)
+
+sub _add_daughters_wrapper {
+ my($mother, $callback, @daughters) = @_;
+ return unless @daughters;
+
+ my %ancestors;
+ @ancestors{ $mother->ancestors } = undef;
+ # This could be made more efficient by not bothering to compile
+ # the ancestor list for $mother if all the nodes to add are
+ # daughterless.
+ # But then you have to CHECK if they're daughterless.
+ # If $mother is [big number] generations down, then it's worth checking.
+
+ foreach my $daughter (@daughters) { # which may be ()
+ Carp::croak "daughter must be a node object!" unless UNIVERSAL::can($daughter, 'is_node');
+
+ printf "Mother : %s (%s)\n", $mother, ref $mother if $Debug;
+ printf "Daughter: %s (%s)\n", $daughter, ref $daughter if $Debug;
+ printf "Adding %s to %s\n",
+ ($daughter->name() || $daughter),
+ ($mother->name() || $mother) if $Debug > 1;
+
+ Carp::croak "mother can't be its own daughter!" if $mother eq $daughter;
+
+ $daughter->cyclicity_fault(
+ "$daughter (" . ($daughter->name || 'no_name') .
+ ") is an ancestor of $mother (" . ($mother->name || 'no_name') .
+ "), so can't became its daughter."
+ ) if exists $ancestors{$daughter};
+
+ my $old_mother = $daughter->{'mother'};
+
+ next if defined($old_mother) && ref($old_mother) && $old_mother eq $mother;
+ # noop if $daughter is already $mother's daughter
+
+ $old_mother->remove_daughters($daughter)
+ if defined($old_mother) && ref($old_mother);
+
+ &{$callback}($mother->{'daughters'}, $daughter);
+ }
+ $mother->_update_daughter_links; # need only do this at the end
+
+ return;
+}
+
+###########################################################################
+###########################################################################
+
+sub _update_daughter_links {
+ # Eliminate any duplicates in my daughters list, and update
+ # all my daughters' links to myself.
+ my $this = shift;
+
+ my $them = $this->{'daughters'};
+
+ # Eliminate duplicate daughters.
+ my %seen = ();
+ @$them = grep { ref($_) && not($seen{$_}++) } @$them;
+ # not that there should ever be duplicate daughters anyhoo.
+
+ foreach my $one (@$them) { # linkage bookkeeping
+ Carp::croak "daughter <$one> isn't an object!" unless ref $one;
+ $one->{'mother'} = $this;
+ }
+ return;
+}
+
+###########################################################################
+
+# Currently unused.
+
+sub _update_links { # update all descendant links for ancestorship below
+ # this point
+ # note: it's "descendant", not "descendent"
+ # see <http://www.lenzo.com/~sburke/stuff/english_ant_and_ent.html>
+ my $this = shift;
+ # $this->no_cyclicity;
+ $this->walk_down({
+ 'callback' => sub {
+ my $this = $_[0];
+ $this->_update_daughter_links;
+ return 1;
+ },
+ });
+}
+
+###########################################################################
+###########################################################################
+
+=item the constructor $daughter = $mother->new_daughter, or
+
+=item the constructor $daughter = $mother->new_daughter({...options...})
+
+This B<constructs> a B<new> node (of the same class as $mother), and
+adds it to the (right) end of the daughter list of $mother. This is
+essentially the same as going
+
+ $daughter = $mother->new;
+ $mother->add_daughter($daughter);
+
+but is rather more efficient because (since $daughter is guaranteed new
+and isn't linked to/from anything), it doesn't have to check that
+$daughter isn't an ancestor of $mother, isn't already daughter to a
+mother it needs to be unlinked from, isn't already in $mother's
+daughter list, etc.
+
+As you'd expect for a constructor, it returns the node-object created.
+
+=cut
+
+# Note that if you radically change 'mother'/'daughters' bookkeeping,
+# you may have to change this routine, since it's one of the places
+# that directly writes to 'daughters' and 'mother'.
+
+sub new_daughter {
+ my($mother, @options) = @_;
+ my $daughter = $mother->new(@options);
+
+ push @{$mother->{'daughters'}}, $daughter;
+ $daughter->{'mother'} = $mother;
+
+ return $daughter;
+}
+
+=item the constructor $mother->new_daughter_left, or
+
+=item $mother->new_daughter_left({...options...})
+
+This is just like $mother->new_daughter, but adds the new daughter
+to the left (start) of $mother's daughter list.
+
+=cut
+
+# Note that if you radically change 'mother'/'daughters' bookkeeping,
+# you may have to change this routine, since it's one of the places
+# that directly writes to 'daughters' and 'mother'.
+
+sub new_daughter_left {
+ my($mother, @options) = @_;
+ my $daughter = $mother->new(@options);
+
+ unshift @{$mother->{'daughters'}}, $daughter;
+ $daughter->{'mother'} = $mother;
+
+ return $daughter;
+}
+
+###########################################################################
+
+=item $mother->remove_daughters( LIST )
+
+This removes the nodes listed in LIST from $mother's daughter list.
+This is a no-operation if LIST is empty. If there are things in LIST
+that aren't a current daughter of $mother, they are ignored.
+
+Not to be confused with $mother->clear_daughters.
+
+=cut
+
+sub remove_daughters { # write-only method
+ my($mother, @daughters) = @_;
+ Carp::croak "mother must be an object!" unless ref $mother;
+ return unless @daughters;
+
+ my %to_delete;
+ @daughters = grep {ref($_)
+ and defined($_->{'mother'})
+ and $mother eq $_->{'mother'}
+ } @daughters;
+ return unless @daughters;
+ @to_delete{ @daughters } = undef;
+
+ # This could be done better and more efficiently, I guess.
+ foreach my $daughter (@daughters) {
+ $daughter->{'mother'} = undef;
+ }
+ my $them = $mother->{'daughters'};
+ @$them = grep { !exists($to_delete{$_}) } @$them;
+
+ # $mother->_update_daughter_links; # unnecessary
+ return;
+}
+
+=item $node->remove_daughter( LIST )
+
+An exact synonym for $node->remove_daughters( LIST )
+
+=cut
+
+sub remove_daughter { # alias
+ my($it,@them) = @_; $it->remove_daughters(@them);
+}
+
+=item $node->unlink_from_mother
+
+This removes node from the daughter list of its mother. If it has no
+mother, this is a no-operation.
+
+Returns the mother unlinked from (if any).
+
+=cut
+
+sub unlink_from_mother {
+ my $node = $_[0];
+ my $mother = $node->{'mother'};
+ $mother->remove_daughters($node) if defined($mother) && ref($mother);
+ return $mother;
+}
+
+###########################################################################
+
+=item $mother->clear_daughters
+
+This unlinks all $mother's daughters.
+Returns the the list of what used to be $mother's daughters.
+
+Not to be confused with $mother->remove_daughters( LIST ).
+
+=cut
+
+sub clear_daughters { # write-only method
+ my($mother) = $_[0];
+ my @daughters = @{$mother->{'daughters'}};
+
+ @{$mother->{'daughters'}} = ();
+ foreach my $one (@daughters) {
+ next unless UNIVERSAL::can($one, 'is_node'); # sanity check
+ $one->{'mother'} = undef;
+ }
+ # Another, simpler, way to do it:
+ # $mother->remove_daughters($mother->daughters);
+
+ return @daughters; # NEW
+}
+#--------------------------------------------------------------------------
+
+=item $mother->set_daughters( LIST )
+
+This unlinks all $mother's daughters, and replaces them with the
+daughters in LIST.
+
+Currently implemented as just $mother->clear_daughters followed by
+$mother->add_daughters( LIST ).
+
+=cut
+
+sub set_daughters { # write-only method
+ my($mother, @them) = @_;
+ $mother->clear_daughters;
+ $mother->add_daughters(@them) if @them;
+ # yup, it's that simple
+}
+
+#--------------------------------------------------------------------------
+
+=item $node->replace_with( LIST )
+
+This replaces $node in its mother's daughter list, by unlinking $node
+and replacing it with the items in LIST. This returns a list consisting
+of $node followed by LIST, i.e., the nodes that replaced it.
+
+LIST can include $node itself (presumably at most once). LIST can
+also be empty-list. However, if any items in LIST are sisters to
+$node, they are ignored, and are not in the copy of LIST passed as the
+return value.
+
+As you might expect for any linking operation, the items in LIST
+cannot be $node's mother, or any ancestor to it; and items in LIST are,
+of course, unlinked from their mothers (if they have any) as they're
+linked to $node's mother.
+
+(In the special (and bizarre) case where $node is root, this simply calls
+$this->unlink_from_mother on all the items in LIST, making them roots of
+their own trees.)
+
+Note that the daughter-list of $node is not necessarily affected; nor
+are the daughter-lists of the items in LIST. I mention this in case you
+think replace_with switches one node for another, with respect to its
+mother list B<and> its daughter list, leaving the rest of the tree
+unchanged. If that's what you want, replacing $Old with $New, then you
+want:
+
+ $New->set_daughters($Old->clear_daughters);
+ $Old->replace_with($New);
+
+(I can't say $node's and LIST-items' daughter lists are B<never>
+affected my replace_with -- they can be affected in this case:
+
+ $N1 = ($node->daughters)[0]; # first daughter of $node
+ $N2 = ($N1->daughters)[0]; # first daughter of $N1;
+ $N3 = Tree::DAG_Node->random_network; # or whatever
+ $node->replace_with($N1, $N2, $N3);
+
+As a side affect of attaching $N1 and $N2 to $node's mother, they're
+unlinked from their parents ($node, and $N1, replectively).
+But N3's daughter list is unaffected.
+
+In other words, this method does what it has to, as you'd expect it
+to.
+
+=cut
+
+sub replace_with { # write-only method
+ my($this, @replacements) = @_;
+
+ if(not( defined($this->{'mother'}) && ref($this->{'mother'}) )) { # if root
+ foreach my $replacement (@replacements) {
+ $replacement->{'mother'}->remove_daughters($replacement)
+ if $replacement->{'mother'};
+ }
+ # make 'em roots
+ } else { # I have a mother
+ my $mother = $this->{'mother'};
+
+ #@replacements = grep(($_ eq $this || $_->{'mother'} ne $mother),
+ # @replacements);
+ @replacements = grep { $_ eq $this
+ || not(defined($_->{'mother'}) &&
+ ref($_->{'mother'}) &&
+ $_->{'mother'} eq $mother
+ )
+ }
+ @replacements;
+ # Eliminate sisters (but not self)
+ # i.e., I want myself or things NOT with the same mother as myself.
+
+ $mother->set_daughters( # old switcheroo
+ map($_ eq $this ? (@replacements) : $_ ,
+ @{$mother->{'daughters'}}
+ )
+ );
+ # and set_daughters does all the checking and possible
+ # unlinking
+ }
+ return($this, @replacements);
+}
+
+=item $node->replace_with_daughters
+
+This replaces $node in its mother's daughter list, by unlinking $node
+and replacing it with its daughters. In other words, $node becomes
+motherless and daughterless as its daughters move up and take its place.
+This returns a list consisting of $node followed by the nodes that were
+its daughters.
+
+In the special (and bizarre) case where $node is root, this simply
+unlinks its daughters from it, making them roots of their own trees.
+
+Effectively the same as $node->replace_with($node->daughters), but more
+efficient, since less checking has to be done. (And I also think
+$node->replace_with_daughters is a more common operation in
+tree-wrangling than $node->replace_with(LIST), so deserves a named
+method of its own, but that's just me.)
+
+=cut
+
+# Note that if you radically change 'mother'/'daughters' bookkeeping,
+# you may have to change this routine, since it's one of the places
+# that directly writes to 'daughters' and 'mother'.
+
+sub replace_with_daughters { # write-only method
+ my($this) = $_[0]; # takes no params other than the self
+ my $mother = $this->{'mother'};
+ return($this, $this->clear_daughters)
+ unless defined($mother) && ref($mother);
+
+ my @daughters = $this->clear_daughters;
+ my $sib_r = $mother->{'daughters'};
+ @$sib_r = map($_ eq $this ? (@daughters) : $_,
+ @$sib_r # old switcheroo
+ );
+ foreach my $daughter (@daughters) {
+ $daughter->{'mother'} = $mother;
+ }
+ return($this, @daughters);
+}
+
+#--------------------------------------------------------------------------
+
+=item $node->add_left_sisters( LIST )
+
+This adds the elements in LIST (in that order) as immediate left sisters of
+$node. In other words, given that B's mother's daughter-list is (A,B,C,D),
+calling B->add_left_sisters(X,Y) makes B's mother's daughter-list
+(A,X,Y,B,C,D).
+
+If LIST is empty, this is a no-op, and returns empty-list.
+
+This is basically implemented as a call to $node->replace_with(LIST,
+$node), and so all replace_with's limitations and caveats apply.
+
+The return value of $node->add_left_sisters( LIST ) is the elements of
+LIST that got added, as returned by replace_with -- minus the copies
+of $node you'd get from a straight call to $node->replace_with(LIST,
+$node).
+
+=cut
+
+sub add_left_sisters { # write-only method
+ my($this, @new) = @_;
+ return() unless @new;
+
+ @new = $this->replace_with(@new, $this);
+ shift @new; pop @new; # kill the copies of $this
+ return @new;
+}
+
+=item $node->add_left_sister( LIST )
+
+An exact synonym for $node->add_left_sisters(LIST)
+
+=cut
+
+sub add_left_sister { # alias
+ my($it,@them) = @_; $it->add_left_sisters(@them);
+}
+
+=item $node->add_right_sisters( LIST )
+
+Just like add_left_sisters (which see), except that the the elements
+in LIST (in that order) as immediate B<right> sisters of $node;
+
+In other words, given that B's mother's daughter-list is (A,B,C,D),
+calling B->add_right_sisters(X,Y) makes B's mother's daughter-list
+(A,B,X,Y,C,D).
+
+=cut
+
+sub add_right_sisters { # write-only method
+ my($this, @new) = @_;
+ return() unless @new;
+ @new = $this->replace_with($this, @new);
+ shift @new; shift @new; # kill the copies of $this
+ return @new;
+}
+
+=item $node->add_right_sister( LIST )
+
+An exact synonym for $node->add_right_sisters(LIST)
+
+=cut
+
+sub add_right_sister { # alias
+ my($it,@them) = @_; $it->add_right_sisters(@them);
+}
+
+###########################################################################
+
+=back
+
+=cut
+
+###########################################################################
+###########################################################################
+
+=head1 OTHER ATTRIBUTE METHODS
+
+=over
+
+=item $node->name or $node->name(SCALAR)
+
+In the first form, returns the value of the node object's "name"
+attribute. In the second form, sets it to the value of SCALAR.
+
+=cut
+
+sub name { # read/write attribute-method. returns/expects a scalar
+ my $this = shift;
+ $this->{'name'} = $_[0] if @_;
+ return $this->{'name'};
+}
+
+
+###########################################################################
+
+=item $node->attributes or $node->attributes(SCALAR)
+
+In the first form, returns the value of the node object's "attributes"
+attribute. In the second form, sets it to the value of SCALAR. I
+intend this to be used to store a reference to a (presumably
+anonymous) hash the user can use to store whatever attributes he
+doesn't want to have to store as object attributes. In this case, you
+needn't ever set the value of this. (_init has already initialized it
+to {}.) Instead you can just do...
+
+ $node->attributes->{'foo'} = 'bar';
+
+...to write foo => bar.
+
+=cut
+
+sub attributes { # read/write attribute-method
+ # expects a ref, presumably a hashref
+ my $this = shift;
+ if(@_) {
+ Carp::carp "my parameter must be a reference" unless ref($_[0]);
+ $this->{'attributes'} = $_[0];
+ }
+ return $this->{'attributes'};
+}
+
+=item $node->attribute or $node->attribute(SCALAR)
+
+An exact synonym for $node->attributes or $node->attributes(SCALAR)
+
+=cut
+
+sub attribute { # alias
+ my($it,@them) = @_; $it->attributes(@them);
+}
+
+###########################################################################
+# Secret Stuff.
+
+sub no_cyclicity { # croak iff I'm in a CYCLIC class.
+ my($it) = $_[0];
+ # If, God forbid, I use this to make a cyclic class, then I'd
+ # expand the functionality of this routine to actually look for
+ # cyclicity. Or something like that. Maybe.
+
+ $it->cyclicity_fault("You can't do that in a cyclic class!")
+ if $it->cyclicity_allowed;
+ return;
+}
+
+sub cyclicity_fault {
+ my($it, $bitch) = @_[0,1];
+ Carp::croak "Cyclicity fault: $bitch"; # never return
+}
+
+sub cyclicity_allowed {
+ return 0;
+}
+
+###########################################################################
+# More secret stuff. Currently unused.
+
+sub inaugurate_root { # no-op
+ my($it, $tree) = @_[0,1];
+ # flag this node as being the root of the tree $tree.
+ return;
+}
+
+sub decommission_root { # no-op
+ # flag this node as no longer being the root of the tree $tree.
+ return;
+}
+
+###########################################################################
+###########################################################################
+
+=back
+
+=head1 OTHER METHODS TO DO WITH RELATIONSHIPS
+
+=over
+
+=item $node->is_node
+
+This always returns true. More pertinently, $object->can('is_node')
+is true (regardless of what C<is_node> would do if called) for objects
+belonging to this class or for any class derived from it.
+
+=cut
+
+sub is_node { return 1; } # always true.
+# NEVER override this with anything that returns false in the belief
+# that this'd signal "not a node class". The existence of this method
+# is what I test for, with the various "can()" uses in this class.
+
+###########################################################################
+
+=item $node->ancestors
+
+Returns the list of this node's ancestors, starting with its mother,
+then grandmother, and ending at the root. It does this by simply
+following the 'mother' attributes up as far as it can. So if $item IS
+the root, this returns an empty list.
+
+Consider that scalar($node->ancestors) returns the ply of this node
+within the tree -- 2 for a granddaughter of the root, etc., and 0 for
+root itself.
+
+=cut
+
+sub ancestors {
+ my $this = shift;
+ my $mama = $this->{'mother'}; # initial condition
+ return () unless ref($mama); # I must be root!
+
+ # $this->no_cyclicity; # avoid infinite loops
+
+ # Could be defined recursively, as:
+ # if(ref($mama = $this->{'mother'})){
+ # return($mama, $mama->ancestors);
+ # } else {
+ # return ();
+ # }
+ # But I didn't think of that until I coded the stuff below, which is
+ # faster.
+
+ my @ancestors = ( $mama ); # start off with my mama
+ while(defined( $mama = $mama->{'mother'} ) && ref($mama)) {
+ # Walk up the tree
+ push(@ancestors, $mama);
+ # This turns into an infinite loop if someone gets stupid
+ # and makes this tree cyclic! Don't do it!
+ }
+ return @ancestors;
+}
+
+###########################################################################
+
+=item $node->root
+
+Returns the root of whatever tree $node is a member of. If $node is
+the root, then the result is $node itself.
+
+=cut
+
+sub root {
+ my $it = $_[0];
+ my @ancestors = ($it, $it->ancestors);
+ return $ancestors[-1];
+}
+
+###########################################################################
+
+=item $node->is_daughter_of($node2)
+
+Returns true iff $node is a daughter of $node2.
+Currently implemented as just a test of ($it->mother eq $node2).
+
+=cut
+
+sub is_daughter_of {
+ my($it,$mama) = @_[0,1];
+ return $it->{'mother'} eq $mama;
+}
+
+###########################################################################
+
+=item $node->self_and_descendants
+
+Returns a list consisting of itself (as element 0) and all the
+descendants of $node. Returns just itself if $node is a
+terminal_node.
+
+(Note that it's spelled "descendants", not "descendents".)
+
+=cut
+
+sub self_and_descendants {
+ # read-only method: return a list of myself and any/all descendants
+ my $node = shift;
+ my @List = ();
+ # $node->no_cyclicity;
+ $node->walk_down({ 'callback' => sub { push @List, $_[0]; return 1;}});
+ Carp::croak "Spork Error 919: \@List has no contents!?!?" unless @List;
+ # impossible
+ return @List;
+}
+
+###########################################################################
+
+=item $node->descendants
+
+Returns a list consisting of all the descendants of $node. Returns
+empty-list if $node is a terminal_node.
+
+(Note that it's spelled "descendants", not "descendents".)
+
+=cut
+
+sub descendants {
+ # read-only method: return a list of my descendants
+ my $node = shift;
+ my @list = $node->self_and_descendants;
+ shift @list; # lose myself.
+ return @list;
+}
+
+###########################################################################
+
+=item $node->leaves_under
+
+Returns a list (going left-to-right) of all the leaf nodes under
+$node. ("Leaf nodes" are also called "terminal nodes" -- i.e., nodes
+that have no daughters.) Returns $node in the degenerate case of
+$node being a leaf itself.
+
+=cut
+
+sub leaves_under {
+ # read-only method: return a list of all leaves under myself.
+ # Returns myself in the degenerate case of being a leaf myself.
+ my $node = shift;
+ my @List = ();
+ # $node->no_cyclicity;
+ $node->walk_down({ 'callback' =>
+ sub {
+ my $node = $_[0];
+ my @daughters = @{$node->{'daughters'}};
+ push(@List, $node) unless @daughters;
+ return 1;
+ }
+ });
+ Carp::croak "Spork Error 861: \@List has no contents!?!?" unless @List;
+ # impossible
+ return @List;
+}
+
+###########################################################################
+
+=item $node->depth_under
+
+Returns an integer representing the number of branches between this
+$node and the most distant leaf under it. (In other words, this
+returns the ply of subtree starting of $node. Consider
+scalar($it->ancestors) if you want the ply of a node within the whole
+tree.)
+
+=cut
+
+sub depth_under {
+ my $node = shift;
+ my $max_depth = 0;
+ $node->walk_down({
+ '_depth' => 0,
+ 'callback' => sub {
+ my $depth = $_[1]->{'_depth'};
+ $max_depth = $depth if $depth > $max_depth;
+ return 1;
+ },
+ });
+ return $max_depth;
+}
+
+###########################################################################
+
+=item $node->generation
+
+Returns a list of all nodes (going left-to-right) that are in $node's
+generation -- i.e., that are the some number of nodes down from
+the root. $root->generation is just $root.
+
+Of course, $node is always in its own generation.
+
+=item $node->generation_under(NODE2)
+
+Like $node->generation, but returns only the nodes in $node's generation
+that are also descendants of NODE2 -- in other words,
+
+ @us = $node->generation_under( $node->mother->mother );
+
+is all $node's first cousins (to borrow yet more kinship terminology) --
+assuming $node does indeed have a grandmother. Actually "cousins" isn't
+quite an apt word, because C<@us> ends up including $node's siblings and
+$node.
+
+Actually, C<generation_under> is just an alias to C<generation>, but I
+figure that this:
+
+ @us = $node->generation_under($way_upline);
+
+is a bit more readable than this:
+
+ @us = $node->generation($way_upline);
+
+But it's up to you.
+
+$node->generation_under($node) returns just $node.
+
+If you call $node->generation_under($node) but NODE2 is not $node or an
+ancestor of $node, it behaves as if you called just $node->generation().
+
+=cut
+
+sub generation {
+ my($node, $limit) = @_[0,1];
+ # $node->no_cyclicity;
+ return $node
+ if $node eq $limit || not(
+ defined($node->{'mother'}) &&
+ ref($node->{'mother'})
+ ); # bailout
+
+ return map(@{$_->{'daughters'}}, $node->{'mother'}->generation($limit));
+ # recurse!
+ # Yup, my generation is just all the daughters of my mom's generation.
+}
+
+sub generation_under {
+ my($node, @rest) = @_;
+ return $node->generation(@rest);
+}
+
+###########################################################################
+
+=item $node->self_and_sisters
+
+Returns a list of all nodes (going left-to-right) that have the same
+mother as $node -- including $node itself. This is just like
+$node->mother->daughters, except that that fails where $node is root,
+whereas $root->self_and_siblings, as a special case, returns $root.
+
+(Contrary to how you may interpret how this method is named, "self" is
+not (necessarily) the first element of what's returned.)
+
+=cut
+
+sub self_and_sisters {
+ my $node = $_[0];
+ my $mother = $node->{'mother'};
+ return $node unless defined($mother) && ref($mother); # special case
+ return @{$node->{'mother'}->{'daughters'}};
+}
+
+###########################################################################
+
+=item $node->sisters
+
+Returns a list of all nodes (going left-to-right) that have the same
+mother as $node -- B<not including> $node itself. If $node is root,
+this returns empty-list.
+
+=cut
+
+sub sisters {
+ my $node = $_[0];
+ my $mother = $node->{'mother'};
+ return() unless $mother; # special case
+ return grep($_ ne $node,
+ @{$node->{'mother'}->{'daughters'}}
+ );
+}
+
+###########################################################################
+
+=item $node->left_sister
+
+Returns the node that's the immediate left sister of $node. If $node
+is the leftmost (or only) daughter of its mother (or has no mother),
+then this returns undef.
+
+(See also $node->add_left_sisters(LIST).)
+
+=cut
+
+sub left_sister {
+ my $it = $_[0];
+ my $mother = $it->{'mother'};
+ return undef unless $mother;
+ my @sisters = @{$mother->{'daughters'}};
+
+ return undef if @sisters == 1; # I'm an only daughter
+
+ my $left = undef;
+ foreach my $one (@sisters) {
+ return $left if $one eq $it;
+ $left = $one;
+ }
+ die "SPORK ERROR 9757: I'm not in my mother's daughter list!?!?";
+}
+
+
+=item $node->left_sisters
+
+Returns a list of nodes that're sisters to the left of $node. If
+$node is the leftmost (or only) daughter of its mother (or has no
+mother), then this returns an empty list.
+
+(See also $node->add_left_sisters(LIST).)
+
+=cut
+
+sub left_sisters {
+ my $it = $_[0];
+ my $mother = $it->{'mother'};
+ return() unless $mother;
+ my @sisters = @{$mother->{'daughters'}};
+ return() if @sisters == 1; # I'm an only daughter
+
+ my @out = ();
+ foreach my $one (@sisters) {
+ return @out if $one eq $it;
+ push @out, $one;
+ }
+ die "SPORK ERROR 9767: I'm not in my mother's daughter list!?!?";
+}
+
+=item $node->right_sister
+
+Returns the node that's the immediate right sister of $node. If $node
+is the rightmost (or only) daughter of its mother (or has no mother),
+then this returns undef.
+
+(See also $node->add_right_sisters(LIST).)
+
+=cut
+
+sub right_sister {
+ my $it = $_[0];
+ my $mother = $it->{'mother'};
+ return undef unless $mother;
+ my @sisters = @{$mother->{'daughters'}};
+ return undef if @sisters == 1; # I'm an only daughter
+
+ my $seen = 0;
+ foreach my $one (@sisters) {
+ return $one if $seen;
+ $seen = 1 if $one eq $it;
+ }
+ die "SPORK ERROR 9777: I'm not in my mother's daughter list!?!?"
+ unless $seen;
+ return undef;
+}
+
+=item $node->right_sisters
+
+Returns a list of nodes that're sisters to the right of $node. If
+$node is the rightmost (or only) daughter of its mother (or has no
+mother), then this returns an empty list.
+
+(See also $node->add_right_sisters(LIST).)
+
+=cut
+
+sub right_sisters {
+ my $it = $_[0];
+ my $mother = $it->{'mother'};
+ return() unless $mother;
+ my @sisters = @{$mother->{'daughters'}};
+ return() if @sisters == 1; # I'm an only daughter
+
+ my @out;
+ my $seen = 0;
+ foreach my $one (@sisters) {
+ push @out, $one if $seen;
+ $seen = 1 if $one eq $it;
+ }
+ die "SPORK ERROR 9787: I'm not in my mother's daughter list!?!?"
+ unless $seen;
+ return @out;
+}
+
+###########################################################################
+
+=item $node->my_daughter_index
+
+Returns what index this daughter is, in its mother's C<daughter> list.
+In other words, if $node is ($node->mother->daughters)[3], then
+$node->my_daughter_index returns 3.
+
+As a special case, returns 0 if $node has no mother.
+
+=cut
+
+sub my_daughter_index {
+ # returns what number is my index in my mother's daughter list
+ # special case: 0 for root.
+ my $node = $_[0];
+ my $ord = -1;
+ my $mother = $node->{'mother'};
+
+ return 0 unless $mother;
+ my @sisters = @{$mother->{'daughters'}};
+
+ die "SPORK ERROR 6512: My mother has no kids!!!" unless @sisters;
+
+ Find_Self:
+ for(my $i = 0; $i < @sisters; $i++) {
+ if($sisters[$i] eq $node) {
+ $ord = $i;
+ last Find_Self;
+ }
+ }
+ die "SPORK ERROR 2837: I'm not a daughter of my mother?!?!" if $ord == -1;
+ return $ord;
+}
+
+###########################################################################
+
+=item $node->address or $anynode->address(ADDRESS)
+
+With the first syntax, returns the address of $node within its tree,
+based on its position within the tree. An address is formed by noting
+the path between the root and $node, and concatenating the
+daughter-indices of the nodes this passes thru (starting with 0 for
+the root, and ending with $node).
+
+For example, if to get from node ROOT to node $node, you pass thru
+ROOT, A, B, and $node, then the address is determined as:
+
+* ROOT's my_daughter_index is 0.
+
+* A's my_daughter_index is, suppose, 2. (A is index 2 in ROOT's
+daughter list.)
+
+* B's my_daughter_index is, suppose, 0. (B is index 0 in A's
+daughter list.)
+
+* $node's my_daughter_index is, suppose, 4. ($node is index 4 in
+B's daughter list.)
+
+The address of the above-described $node is, therefore, "0:2:0:4".
+
+(As a somewhat special case, the address of the root is always "0";
+and since addresses start from the root, all addresses start with a
+"0".)
+
+The second syntax, where you provide an address, starts from the root
+of the tree $anynode belongs to, and returns the node corresponding to
+that address. Returns undef if no node corresponds to that address.
+Note that this routine may be somewhat liberal in its interpretation
+of what can constitute an address; i.e., it accepts "0.2.0.4", besides
+"0:2:0:4".
+
+Also note that the address of a node in a tree is meaningful only in
+that tree as currently structured.
+
+(Consider how ($address1 cmp $address2) may be magically meaningful
+to you, if you mant to figure out what nodes are to the right of what
+other nodes.)
+
+=cut
+
+sub address {
+ my($it, $address) = @_[0,1];
+ if(defined($address) && length($address)) { # given the address, return the node.
+ # invalid addresses return undef
+ my $root = $it->root;
+ my @parts = map {$_ + 0}
+ $address =~ m/(\d+)/g; # generous!
+ Carp::croak "Address \"$address\" is an ill-formed address" unless @parts;
+ Carp::croak "Address \"$address\" must start with '0'" unless shift(@parts) == 0;
+
+ my $current_node = $root;
+ while(@parts) { # no-op for root
+ my $ord = shift @parts;
+ my @daughters = @{$current_node->{'daughters'}};
+
+ if($#daughters < $ord) { # illegal address
+ print "* $address has an out-of-range index ($ord)!" if $Debug;
+ return undef;
+ }
+ $current_node = $daughters[$ord];
+ unless(ref($current_node)) {
+ print "* $address points to or thru a non-node!" if $Debug;
+ return undef;
+ }
+ }
+ return $current_node;
+
+ } else { # given the node, return the address
+ my @parts = ();
+ my $current_node = $it;
+ my $mother;
+
+ while(defined( $mother = $current_node->{'mother'} ) && ref($mother)) {
+ unshift @parts, $current_node->my_daughter_index;
+ $current_node = $mother;
+ }
+ return join(':', 0, @parts);
+ }
+}
+
+###########################################################################
+
+=item $node->common(LIST)
+
+Returns the lowest node in the tree that is ancestor-or-self to the
+nodes $node and LIST.
+
+If the nodes are far enough apart in the tree, the answer is just the
+root.
+
+If the nodes aren't all in the same tree, the answer is undef.
+
+As a degenerate case, if LIST is empty, returns $node.
+
+=cut
+
+sub common { # Return the lowest node common to all these nodes...
+ # Called as $it->common($other) or $it->common(@others)
+ my @ones = @_; # all nodes I was given
+ my($first, @others) = @_;
+
+ return $first unless @others; # degenerate case
+
+ my %ones;
+ @ones{ @ones } = undef;
+
+ foreach my $node (@others) {
+ Carp::croak "TILT: node \"$node\" is not a node"
+ unless UNIVERSAL::can($node, 'is_node');
+ my %first_lineage;
+ @first_lineage{$first, $first->ancestors} = undef;
+ my $higher = undef; # the common of $first and $node
+ my @my_lineage = $node->ancestors;
+
+ Find_Common:
+ while(@my_lineage) {
+ if(exists $first_lineage{$my_lineage[0]}) {
+ $higher = $my_lineage[0];
+ last Find_Common;
+ }
+ shift @my_lineage;
+ }
+ return undef unless $higher;
+ $first = $higher;
+ }
+ return $first;
+}
+
+
+###########################################################################
+
+=item $node->common_ancestor(LIST)
+
+Returns the lowest node that is ancestor to all the nodes given (in
+nodes $node and LIST). In other words, it answers the question: "What
+node in the tree, as low as possible, is ancestor to the nodes given
+($node and LIST)?"
+
+If the nodes are far enough apart, the answer is just the root --
+except if any of the nodes are the root itself, in which case the
+answer is undef (since the root has no ancestor).
+
+If the nodes aren't all in the same tree, the answer is undef.
+
+As a degenerate case, if LIST is empty, returns $node's mother;
+that'll be undef if $node is root.
+
+=cut
+
+sub common_ancestor {
+ my @ones = @_; # all nodes I was given
+ my($first, @others) = @_;
+
+ return $first->{'mother'} unless @others;
+ # which may be undef if $first is the root!
+
+ my %ones;
+ @ones{ @ones } = undef; # my arguments
+
+ my $common = $first->common(@others);
+ if(exists($ones{$common})) { # if the common is one of my nodes...
+ return $common->{'mother'};
+ # and this might be undef, if $common is root!
+ } else {
+ return $common;
+ # which might be null if that's all common came up with
+ }
+}
+
+###########################################################################
+###########################################################################
+
+=back
+
+=head1 YET MORE METHODS
+
+=over
+
+=item $node->walk_down({ callback => \&foo, callbackback => \&foo, ... })
+
+Performs a depth-first traversal of the structure at and under $node.
+What it does at each node depends on the value of the options hashref,
+which you must provide. There are three options, "callback" and
+"callbackback" (at least one of which must be defined, as a sub
+reference), and "_depth". This is what C<walk_down> does, in
+pseudocode form:
+
+* Start at the $node given.
+
+* If there's a C<callback>, call it with $node as the first argument,
+and the options hashref as the second argument (which contains the
+potentially useful C<_depth>, remember). This function must return
+true or false -- if false, it will block the next step:
+
+* If $node has any daughter nodes, increment C<_depth>, and call
+$daughter->walk_down(options_hashref) for each daughter (in order, of
+course), where options_hashref is the same hashref it was called with.
+When this returns, decrements C<_depth>.
+
+* If there's a C<callbackback>, call just it as with C<callback> (but
+tossing out the return value). Note that C<callback> returning false
+blocks traversal below $node, but doesn't block calling callbackback
+for $node. (Incidentally, in the unlikely case that $node has stopped
+being a node object, C<callbackback> won't get called.)
+
+* Return.
+
+$node->walk_down is the way to recursively do things to a tree (if you
+start at the root) or part of a tree; if what you're doing is best done
+via pre-pre order traversal, use C<callback>; if what you're doing is
+best done with post-order traversal, use C<callbackback>.
+C<walk_down> is even the basis for plenty of the methods in this
+class. See the source code for examples both simple and horrific.
+
+Note that if you don't specify C<_depth>, it effectively defaults to
+0. You should set it to scalar($node->ancestors) if you want
+C<_depth> to reflect the true depth-in-the-tree for the nodes called,
+instead of just the depth below $node. (If $node is the root, there's
+difference, of course.)
+
+And B<by the way>, it's a bad idea to modify the tree from the callback.
+Unpredictable things may happen. I instead suggest having your callback
+add to a stack of things that need changing, and then, once C<walk_down>
+is all finished, changing those nodes from that stack.
+
+Note that the existence of C<walk_down> doesn't mean you can't write
+you own special-use traversers.
+
+=cut
+
+sub walk_down {
+ my($this, $o) = @_[0,1];
+
+ # All the can()s are in case an object changes class while I'm
+ # looking at it.
+
+ Carp::croak "I need options!" unless ref($o);
+ Carp::croak "I need a callback or a callbackback" unless
+ ( ref($o->{'callback'}) || ref($o->{'callbackback'}) );
+
+ # $this->no_cyclicity;
+ my $callback = ref($o->{'callback'}) ? $o->{'callback'} : undef;
+ my $callbackback = ref($o->{'callbackback'}) ? $o->{'callbackback'} : undef;
+ my $callback_status = 1;
+
+ print "Callback: $callback Callbackback: $callbackback\n" if $Debug;
+
+ printf "* Entering %s\n", ($this->name || $this) if $Debug;
+ $callback_status = &{ $callback }( $this, $o ) if $callback;
+
+ if($callback_status) {
+ # Keep recursing unless callback returned false... and if there's
+ # anything to recurse into, of course.
+ my @daughters = UNIVERSAL::can($this, 'is_node') ? @{$this->{'daughters'}} : ();
+ if(@daughters) {
+ $o->{'_depth'} += 1;
+ #print "Depth " , $o->{'_depth'}, "\n";
+ foreach my $one (@daughters) {
+ $one->walk_down($o) if UNIVERSAL::can($one, 'is_node');
+ # and if it can do "is_node", it should provide a walk_down!
+ }
+ $o->{'_depth'} -= 1;
+ }
+ } else {
+ printf "* Recursing below %s pruned\n", ($this->name || $this) if $Debug;
+ }
+
+ # Note that $callback_status doesn't block callbackback from being called
+ if($callbackback){
+ if(UNIVERSAL::can($this, 'is_node')) { # if it's still a node!
+ print "* Calling callbackback\n" if $Debug;
+ scalar( &{ $callbackback }( $this, $o ) );
+ # scalar to give it the same context as callback
+ } else {
+ print "* Can't call callbackback -- $this isn't a node anymore\n"
+ if $Debug;
+ }
+ }
+ if($Debug) {
+ if(UNIVERSAL::can($this, 'is_node')) { # if it's still a node!
+ printf "* Leaving %s\n", ($this->name || $this)
+ } else {
+ print "* Leaving [no longer a node]\n";
+ }
+ }
+ return;
+}
+
+###########################################################################
+
+=item @lines = $node->dump_names({ ...options... });
+
+Dumps, as an indented list, the names of the nodes starting at $node,
+and continuing under it. Options are:
+
+* _depth -- A nonnegative number. Indicating the depth to consider
+$node as being at (and so the generation under that is that plus one,
+etc.). Defaults to 0. You may choose to use set _depth =>
+scalar($node->ancestors).
+
+* tick -- a string to preface each entry with, between the
+indenting-spacing and the node's name. Defaults to empty-string. You
+may prefer "*" or "-> " or someting.
+
+* indent -- the string used to indent with. Defaults to " " (two
+spaces). Another sane value might be ". " (period, space). Setting it
+to empty-string suppresses indenting.
+
+The dump is not printed, but is returned as a list, where each
+item is a line, with a "\n" at the end.
+
+=cut
+
+sub dump_names {
+ my($it, $o) = @_[0,1];
+ $o = {} unless ref $o;
+ my @out = ();
+ $o->{'_depth'} ||= 0;
+ $o->{'indent'} ||= ' ';
+ $o->{'tick'} ||= '';
+
+ $o->{'callback'} = sub {
+ my($this, $o) = @_[0,1];
+ push(@out,
+ join('',
+ $o->{'indent'} x $o->{'_depth'},
+ $o->{'tick'},
+ &Tree::DAG_Node::_dump_quote($this->name || $this),
+ "\n"
+ )
+ );
+ return 1;
+ }
+ ;
+ $it->walk_down($o);
+ return @out;
+}
+
+###########################################################################
+###########################################################################
+
+=item the constructor CLASS->random_network({...options...})
+
+=item the method $node->random_network({...options...})
+
+In the first case, constructs a randomly arranged network under a new
+node, and returns the root node of that tree. In the latter case,
+constructs the network under $node.
+
+Currently, this is implemented a bit half-heartedly, and
+half-wittedly. I basically needed to make up random-looking networks
+to stress-test the various tree-dumper methods, and so wrote this. If
+you actually want to rely on this for any application more
+serious than that, I suggest examining the source code and seeing if
+this does really what you need (say, in reliability of randomness);
+and feel totally free to suggest changes to me (especially in the form
+of "I rewrote C<random_network>, here's the code...")
+
+It takes four options:
+
+* max_node_count -- maximum number of nodes this tree will be allowed
+to have (counting the root). Defaults to 25.
+
+* min_depth -- minimum depth for the tree. Defaults to 2. Leaves can
+be generated only after this depth is reached, so the tree will be at
+least this deep -- unless max_node_count is hit first.
+
+* max_depth -- maximum depth for the tree. Defaults to 3 plus
+min_depth. The tree will not be deeper than this.
+
+* max_children -- maximum number of children any mother in the tree
+can have. Defaults to 4.
+
+=cut
+
+sub random_network { # constructor or method.
+ my $class = $_[0];
+ my $o = ref($_[1]) ? $_[1] : {};
+ my $am_cons = 0;
+ my $root;
+
+ if(ref($class)){ # I'm a method.
+ $root = $_[0]; # build under the given node, from same class.
+ $class = ref $class;
+ $am_cons = 0;
+ } else { # I'm a constructor
+ $root = $class->new; # build under a new node, with class named.
+ $root->name("Root");
+ $am_cons = 1;
+ }
+
+ my $min_depth = $o->{'min_depth'} || 2;
+ my $max_depth = $o->{'max_depth'} || ($min_depth + 3);
+ my $max_children = $o->{'max_children'} || 4;
+ my $max_node_count = $o->{'max_node_count'} || 25;
+
+ Carp::croak "max_children has to be positive" if int($max_children) < 1;
+
+ my @mothers = ( $root );
+ my @children = ( );
+ my $node_count = 1; # the root
+
+ Gen:
+ foreach my $depth (1 .. $max_depth) {
+ last if $node_count > $max_node_count;
+ Mother:
+ foreach my $mother (@mothers) {
+ last Gen if $node_count > $max_node_count;
+ my $children_number;
+ if($depth <= $min_depth) {
+ until( $children_number = int(rand(1 + $max_children)) ) {}
+ } else {
+ $children_number = int(rand($max_children));
+ }
+ Beget:
+ foreach (1 .. $children_number) {
+ last Gen if $node_count > $max_node_count;
+ my $node = $mother->new_daughter;
+ $node->name("Node$node_count");
+ ++$node_count;
+ push(@children, $node);
+ }
+ }
+ @mothers = @children;
+ @children = ();
+ last unless @mothers;
+ }
+
+ return $root;
+}
+
+=item the constructor CLASS->lol_to_tree($lol);
+
+Converts something like bracket-notation for "Chomsky trees" (or
+rather, the closest you can come with Perl
+list-of-lists(-of-lists(-of-lists))) into a tree structure. Returns
+the root of the tree converted.
+
+The conversion rules are that: 1) if the last (possibly the only) item
+in a given list is a scalar, then that is used as the "name" attribute
+for the node based on this list. 2) All other items in the list
+represent daughter nodes of the current node -- recursively so, if
+they are list references; otherwise, (non-terminal) scalars are
+considered to denote nodes with that name. So ['Foo', 'Bar', 'N'] is
+an alternate way to represent [['Foo'], ['Bar'], 'N'].
+
+An example will illustrate:
+
+ use Tree::DAG_Node;
+ $lol =
+ [
+ [
+ [ [ 'Det:The' ],
+ [ [ 'dog' ], 'N'], 'NP'],
+ [ '/with rabies\\', 'PP'],
+ 'NP'
+ ],
+ [ 'died', 'VP'],
+ 'S'
+ ];
+ $tree = Tree::DAG_Node->lol_to_tree($lol);
+ $diagram = $tree->draw_ascii_tree;
+ print map "$_\n", @$diagram;
+
+...returns this tree:
+
+ |
+ <S>
+ |
+ /------------------\
+ | |
+ <NP> <VP>
+ | |
+ /---------------\ <died>
+ | |
+ <NP> <PP>
+ | |
+ /-------\ </with rabies\>
+ | |
+ <Det:The> <N>
+ |
+ <dog>
+
+By the way (and this rather follows from the above rules), when
+denoting a LoL tree consisting of just one node, this:
+
+ $tree = Tree::DAG_Node->lol_to_tree( 'Lonely' );
+
+is okay, although it'd probably occur to you to denote it only as:
+
+ $tree = Tree::DAG_Node->lol_to_tree( ['Lonely'] );
+
+which is of course fine, too.
+
+=cut
+
+sub lol_to_tree {
+ my($class, $lol, $seen_r) = @_[0,1,2];
+ $seen_r = {} unless ref($seen_r) eq 'HASH';
+ return if ref($lol) && $seen_r->{$lol}++; # catch circularity
+
+ $class = ref($class) || $class;
+ my $node = $class->new();
+
+ unless(ref($lol) eq 'ARRAY') { # It's a terminal node.
+ $node->name($lol) if defined $lol;
+ return $node;
+ }
+ return $node unless @$lol; # It's a terminal node, oddly represented
+
+ # It's a non-terminal node.
+
+ my @options = @$lol;
+ unless(ref($options[-1]) eq 'ARRAY') {
+ # This is what separates this method from simple_lol_to_tree
+ $node->name(pop(@options));
+ }
+
+ foreach my $d (@options) { # Scan daughters (whether scalars or listrefs)
+ $node->add_daughter( $class->lol_to_tree($d, $seen_r) ); # recurse!
+ }
+
+ return $node;
+}
+
+#--------------------------------------------------------------------------
+
+=item $node->tree_to_lol_notation({...options...})
+
+Dumps a tree (starting at $node) as the sort of LoL-like bracket
+notation you see in the above example code. Returns just one big
+block of text. The only option is "multiline" -- if true, it dumps
+the text as the sort of indented structure as seen above; if false
+(and it defaults to false), dumps it all on one line (with no
+indenting, of course).
+
+For example, starting with the tree from the above example,
+this:
+
+ print $tree->tree_to_lol_notation, "\n";
+
+prints the following (which I've broken over two lines for sake of
+printablitity of documentation):
+
+ [[[['Det:The'], [['dog'], 'N'], 'NP'], [["/with rabies\x5c"],
+ 'PP'], 'NP'], [['died'], 'VP'], 'S'],
+
+Doing this:
+
+ print $tree->tree_to_lol_notation({ multiline => 1 });
+
+prints the same content, just spread over many lines, and prettily
+indented.
+
+=cut
+
+#--------------------------------------------------------------------------
+
+sub tree_to_lol_notation {
+ my $root = $_[0];
+ my($it, $o) = @_[0,1];
+ $o = {} unless ref $o;
+ my @out = ();
+ $o->{'_depth'} ||= 0;
+ $o->{'multiline'} = 0 unless exists($o->{'multiline'});
+
+ my $line_end;
+ if($o->{'multiline'}) {
+ $o->{'indent'} ||= ' ';
+ $line_end = "\n";
+ } else {
+ $o->{'indent'} ||= '';
+ $line_end = '';
+ }
+
+ $o->{'callback'} = sub {
+ my($this, $o) = @_[0,1];
+ push(@out,
+ $o->{'indent'} x $o->{'_depth'},
+ "[$line_end",
+ );
+ return 1;
+ }
+ ;
+ $o->{'callbackback'} = sub {
+ my($this, $o) = @_[0,1];
+ my $name = $this->name;
+ if(!defined($name)) {
+ $name = 'undef';
+ } else {
+ $name = &Tree::DAG_Node::_dump_quote($name);
+ }
+ push(@out,
+ $o->{'indent'} x ($o->{'_depth'} + 1),
+ "$name$line_end",
+ $o->{'indent'} x $o->{'_depth'},
+ "], $line_end",
+ );
+ return 1;
+ }
+ ;
+ $it->walk_down($o);
+ return join('', @out);
+}
+
+#--------------------------------------------------------------------------
+
+=item $node->tree_to_lol
+
+Returns that tree (starting at $node) represented as a LoL, like what
+$lol, above, holds. (This is as opposed to C<tree_to_lol_notation>,
+which returns the viewable code like what gets evaluated and stored in
+$lol, above.)
+
+Lord only knows what you use this for -- maybe for feeding to
+Data::Dumper, in case C<tree_to_lol_notation> doesn't do just what you
+want?
+
+=cut
+
+sub tree_to_lol {
+ # I haven't /rigorously/ tested this.
+ my($it, $o) = @_[0,1]; # $o is currently unused anyway
+ $o = {} unless ref $o;
+
+ my $out = [];
+ my @lol_stack = ($out);
+ $o->{'callback'} = sub {
+ my($this, $o) = @_[0,1];
+ my $new = [];
+ push @{$lol_stack[-1]}, $new;
+ push(@lol_stack, $new);
+ return 1;
+ }
+ ;
+ $o->{'callbackback'} = sub {
+ my($this, $o) = @_[0,1];
+ push @{$lol_stack[-1]}, $this->name;
+ pop @lol_stack;
+ return 1;
+ }
+ ;
+ $it->walk_down($o);
+ die "totally bizarre error 12416" unless ref($out->[0]);
+ $out = $out->[0]; # the real root
+ return $out;
+}
+
+###########################################################################
+
+=item the constructor CLASS->simple_lol_to_tree($simple_lol);
+
+This is like lol_to_tree, except that rule 1 doesn't apply -- i.e.,
+all scalars (or really, anything not a listref) in the LoL-structure
+end up as named terminal nodes, and only terminal nodes get names
+(and, of course, that name comes from that scalar value). This method
+is useful for making things like expression trees, or at least
+starting them off. Consider that this:
+
+ $tree = Tree::DAG_Node->simple_lol_to_tree(
+ [ 'foo', ['bar', ['baz'], 'quux'], 'zaz', 'pati' ]
+ );
+
+converts from something like a Lispish or Iconish tree, if you pretend
+the brackets are parentheses.
+
+Note that there is a (possibly surprising) degenerate case of what I'm
+calling a "simple-LoL", and it's like this:
+
+ $tree = Tree::DAG_Node->simple_lol_to_tree('Lonely');
+
+This is the (only) way you can specify a tree consisting of only a
+single node, which here gets the name 'Lonely'.
+
+=cut
+
+sub simple_lol_to_tree {
+ my($class, $lol, $seen_r) = @_[0,1,2];
+ $class = ref($class) || $class;
+ $seen_r = {} unless ref($seen_r) eq 'HASH';
+ return if ref($lol) && $seen_r->{$lol}++; # catch circularity
+
+ my $node = $class->new();
+
+ unless(ref($lol) eq 'ARRAY') { # It's a terminal node.
+ $node->name($lol) if defined $lol;
+ return $node;
+ }
+
+ # It's a non-terminal node.
+ foreach my $d (@$lol) { # scan daughters (whether scalars or listrefs)
+ $node->add_daughter( $class->simple_lol_to_tree($d, $seen_r) ); # recurse!
+ }
+
+ return $node;
+}
+
+#--------------------------------------------------------------------------
+
+=item $node->tree_to_simple_lol
+
+Returns that tree (starting at $node) represented as a simple-LoL --
+i.e., one where non-terminal nodes are represented as listrefs, and
+terminal nodes are gotten from the contents of those nodes' "name'
+attributes.
+
+Note that in the case of $node being terminal, what you get back is
+the same as $node->name.
+
+Compare to tree_to_simple_lol_notation.
+
+=cut
+
+sub tree_to_simple_lol {
+ # I haven't /rigorously/ tested this.
+ my $root = $_[0];
+
+ return $root->name unless scalar($root->daughters);
+ # special case we have to nip in the bud
+
+ my($it, $o) = @_[0,1]; # $o is currently unused anyway
+ $o = {} unless ref $o;
+
+ my $out = [];
+ my @lol_stack = ($out);
+ $o->{'callback'} = sub {
+ my($this, $o) = @_[0,1];
+ my $new;
+ $new = scalar($this->daughters) ? [] : $this->name;
+ # Terminal nodes are scalars, the rest are listrefs we'll fill in
+ # as we recurse the tree below here.
+ push @{$lol_stack[-1]}, $new;
+ push(@lol_stack, $new);
+ return 1;
+ }
+ ;
+ $o->{'callbackback'} = sub { pop @lol_stack; return 1; };
+ $it->walk_down($o);
+ die "totally bizarre error 12416" unless ref($out->[0]);
+ $out = $out->[0]; # the real root
+ return $out;
+}
+
+#--------------------------------------------------------------------------
+
+=item $node->tree_to_simple_lol_notation({...options...})
+
+A simple-LoL version of tree_to_lol_notation (which see); takes the
+same options.
+
+=cut
+
+sub tree_to_simple_lol_notation {
+ my($it, $o) = @_[0,1];
+ $o = {} unless ref $o;
+ my @out = ();
+ $o->{'_depth'} ||= 0;
+ $o->{'multiline'} = 0 unless exists($o->{'multiline'});
+
+ my $line_end;
+ if($o->{'multiline'}) {
+ $o->{'indent'} ||= ' ';
+ $line_end = "\n";
+ } else {
+ $o->{'indent'} ||= '';
+ $line_end = '';
+ }
+
+ $o->{'callback'} = sub {
+ my($this, $o) = @_[0,1];
+ if(scalar($this->daughters)) { # Nonterminal
+ push(@out,
+ $o->{'indent'} x $o->{'_depth'},
+ "[$line_end",
+ );
+ } else { # Terminal
+ my $name = $this->name;
+ push @out,
+ $o->{'indent'} x $o->{'_depth'},
+ defined($name) ? &Tree::DAG_Node::_dump_quote($name) : 'undef',
+ ",$line_end";
+ }
+ return 1;
+ }
+ ;
+ $o->{'callbackback'} = sub {
+ my($this, $o) = @_[0,1];
+ push(@out,
+ $o->{'indent'} x $o->{'_depth'},
+ "], $line_end",
+ ) if scalar($this->daughters);
+ return 1;
+ }
+ ;
+
+ $it->walk_down($o);
+ return join('', @out);
+}
+
+###########################################################################
+# $list_r = $root_node->draw_ascii_tree({ h_compact => 1});
+# print map("$_\n", @$list_r);
+
+=item $list_r = $node->draw_ascii_tree({ ... options ... })
+
+Draws a nice ASCII-art representation of the tree structure
+at-and-under $node, with $node at the top. Returns a reference to the
+list of lines (with no "\n"s or anything at the end of them) that make
+up the picture.
+
+Example usage:
+
+ print map("$_\n", @{$tree->draw_ascii_tree});
+
+draw_ascii_tree takes parameters you set in the options hashref:
+
+* "no_name" -- if true, C<draw_ascii_tree> doesn't print the name of
+the node; simply prints a "*". Defaults to 0 (i.e., print the node
+name.)
+
+* "h_spacing" -- number 0 or greater. Sets the number of spaces
+inserted horizontally between nodes (and groups of nodes) in a tree.
+Defaults to 1.
+
+* "h_compact" -- number 0 or 1. Sets the extent to which
+C<draw_ascii_tree> tries to save horizontal space. Defaults to 1. If
+I think of a better scrunching algorithm, there'll be a "2" setting
+for this.
+
+* "v_compact" -- number 0, 1, or 2. Sets the degree to which
+C<draw_ascii_tree> tries to save vertical space. Defaults to 1.
+
+This occasionally returns trees that are a bit cock-eyed in parts; if
+anyone can suggest a better drawing algorithm, I'd be appreciative.
+
+=cut
+
+sub draw_ascii_tree {
+ # Make a "box" for this node and its possible daughters, recursively.
+
+ # The guts of this routine are horrific AND recursive!
+
+ # Feel free to send me better code. I worked on this until it
+ # gave me a headache and it worked passably, and then I stopped.
+
+ my $it = $_[0];
+ my $o = ref($_[1]) ? $_[1] : {};
+ my(@box, @daughter_boxes, $width, @daughters);
+ @daughters = @{$it->{'daughters'}};
+
+ # $it->no_cyclicity;
+
+ $o->{'no_name'} = 0 unless exists $o->{'no_name'};
+ $o->{'h_spacing'} = 1 unless exists $o->{'h_spacing'};
+ $o->{'h_compact'} = 1 unless exists $o->{'h_compact'};
+ $o->{'v_compact'} = 1 unless exists $o->{'v_compact'};
+
+ my $printable_name;
+ if($o->{'no_name'}) {
+ $printable_name = '*';
+ } else {
+ $printable_name = $it->name || $it;
+ $printable_name =~ tr<\cm\cj\t >< >s;
+ $printable_name = "<$printable_name>";
+ }
+
+ if(!scalar(@daughters)) { # I am a leaf!
+ # Now add the top parts, and return.
+ @box = ("|", $printable_name);
+ } else {
+ @daughter_boxes = map { &draw_ascii_tree($_, $o) } @daughters;
+
+ my $max_height = 0;
+ foreach my $box (@daughter_boxes) {
+ my $h = @$box;
+ $max_height = $h if $h > $max_height;
+ }
+
+ @box = ('') x $max_height; # establish the list
+
+ foreach my $one (@daughter_boxes) {
+ my $length = length($one->[0]);
+ my $height = @$one;
+
+ #now make all the same height.
+ my $deficit = $max_height - $height;
+ if($deficit > 0) {
+ push @$one, ( scalar( ' ' x $length ) ) x $deficit;
+ $height = scalar(@$one);
+ }
+
+
+ # Now tack 'em onto @box
+ ##########################################################
+ # This used to be a sub of its own. Ho-hum.
+
+ my($b1, $b2) = (\@box, $one);
+ my($h1, $h2) = (scalar(@$b1), scalar(@$b2));
+
+ my(@diffs, $to_chop);
+ if($o->{'h_compact'}) { # Try for h-scrunching.
+ my @diffs;
+ my $min_diff = length($b1->[0]); # just for starters
+ foreach my $line (0 .. ($h1 - 1)) {
+ my $size_l = 0; # length of terminal whitespace
+ my $size_r = 0; # length of initial whitespace
+ $size_l = length($1) if $b1->[$line] =~ /( +)$/s;
+ $size_r = length($1) if $b2->[$line] =~ /^( +)/s;
+ my $sum = $size_l + $size_r;
+
+ $min_diff = $sum if $sum < $min_diff;
+ push @diffs, [$sum, $size_l, $size_r];
+ }
+ $to_chop = $min_diff - $o->{'h_spacing'};
+ $to_chop = 0 if $to_chop < 0;
+ }
+
+ if(not( $o->{'h_compact'} and $to_chop )) {
+ # No H-scrunching needed/possible
+ foreach my $line (0 .. ($h1 - 1)) {
+ $b1->[ $line ] .= $b2->[ $line ] . (' ' x $o->{'h_spacing'});
+ }
+ } else {
+ # H-scrunching is called for.
+ foreach my $line (0 .. ($h1 - 1)) {
+ my $r = $b2->[$line]; # will be the new line
+ my $remaining = $to_chop;
+ if($remaining) {
+ my($l_chop, $r_chop) = @{$diffs[$line]}[1,2];
+
+ if($l_chop) {
+ if($l_chop > $remaining) {
+ $l_chop = $remaining;
+ $remaining = 0;
+ } elsif($l_chop == $remaining) {
+ $remaining = 0;
+ } else { # remaining > l_chop
+ $remaining -= $l_chop;
+ }
+ }
+ if($r_chop) {
+ if($r_chop > $remaining) {
+ $r_chop = $remaining;
+ $remaining = 0;
+ } elsif($r_chop == $remaining) {
+ $remaining = 0;
+ } else { # remaining > r_chop
+ $remaining -= $r_chop; # should never happen!
+ }
+ }
+
+ substr($b1->[$line], -$l_chop) = '' if $l_chop;
+ substr($r, 0, $r_chop) = '' if $r_chop;
+ } # else no-op
+ $b1->[ $line ] .= $r . (' ' x $o->{'h_spacing'});
+ }
+ # End of H-scrunching ickyness
+ }
+ # End of ye big tack-on
+
+ }
+ # End of the foreach daughter_box loop
+
+ # remove any fencepost h_spacing
+ if($o->{'h_spacing'}) {
+ foreach my $line (@box) {
+ substr($line, -$o->{'h_spacing'}) = '' if length($line);
+ }
+ }
+
+ # end of catenation
+ die "SPORK ERROR 958203: Freak!!!!!" unless @box;
+
+ # Now tweak the pipes
+ my $new_pipes = $box[0];
+ my $pipe_count = $new_pipes =~ tr<|><+>;
+ if($pipe_count < 2) {
+ $new_pipes = "|";
+ } else {
+ my($init_space, $end_space);
+
+ # Thanks to Gilles Lamiral for pointing out the need to set to '',
+ # to avoid -w warnings about undeffiness.
+
+ if( $new_pipes =~ s<^( +)><>s ) {
+ $init_space = $1;
+ } else {
+ $init_space = '';
+ }
+
+ if( $new_pipes =~ s<( +)$><>s ) {
+ $end_space = $1
+ } else {
+ $end_space = '';
+ }
+
+ $new_pipes =~ tr< ><->;
+ substr($new_pipes,0,1) = "/";
+ substr($new_pipes,-1,1) = "\\";
+
+ $new_pipes = $init_space . $new_pipes . $end_space;
+ # substr($new_pipes, int((length($new_pipes)), 1)) / 2) = "^"; # feh
+ }
+
+ # Now tack on the formatting for this node.
+ if($o->{'v_compact'} == 2) {
+ if(@daughters == 1) {
+ unshift @box, "|", $printable_name;
+ } else {
+ unshift @box, "|", $printable_name, $new_pipes;
+ }
+ } elsif ($o->{'v_compact'} == 1 and @daughters == 1) {
+ unshift @box, "|", $printable_name;
+ } else { # general case
+ unshift @box, "|", $printable_name, $new_pipes;
+ }
+ }
+
+ # Flush the edges:
+ my $max_width = 0;
+ foreach my $line (@box) {
+ my $w = length($line);
+ $max_width = $w if $w > $max_width;
+ }
+ foreach my $one (@box) {
+ my $space_to_add = $max_width - length($one);
+ next unless $space_to_add;
+ my $add_left = int($space_to_add / 2);
+ my $add_right = $space_to_add - $add_left;
+ $one = (' ' x $add_left) . $one . (' ' x $add_right);
+ }
+
+ return \@box; # must not return a null list!
+}
+
+###########################################################################
+
+=item $node->copy_tree or $node->copy_tree({...options...})
+
+This returns the root of a copy of the tree that $node is a member of.
+If you pass no options, copy_tree pretends you've passed {}.
+
+This method is currently implemented as just a call to
+$this->root->copy_at_and_under({...options...}), but magic may be
+added in the future.
+
+Options you specify are passed down to calls to $node->copy.
+
+=cut
+
+sub copy_tree {
+ my($this, $o) = @_[0,1];
+ my $root = $this->root;
+ $o = {} unless ref $o;
+
+ my $new_root = $root->copy_at_and_under($o);
+
+ return $new_root;
+}
+
+=item $node->copy_at_and_under or $node->copy_at_and_under({...options...})
+
+This returns a copy of the subtree consisting of $node and everything
+under it.
+
+If you pass no options, copy_at_and_under pretends you've passed {}.
+
+This works by recursively building up the new tree from the leaves,
+duplicating nodes using $orig_node->copy($options_ref) and then
+linking them up into a new tree of the same shape.
+
+Options you specify are passed down to calls to $node->copy.
+
+=cut
+
+sub copy_at_and_under {
+ my($from, $o) = @_[0,1];
+ $o = {} unless ref $o;
+ my @daughters = map($_->copy_at_and_under($o), @{$from->{'daughters'}});
+ my $to = $from->copy($o);
+ $to->set_daughters(@daughters) if @daughters;
+ return $to;
+}
+
+=item the constructor $node->copy or $node->copy({...options...})
+
+Returns a copy of $node, B<minus> its daughter or mother attributes
+(which are set back to default values).
+
+If you pass no options, C<copy> pretends you've passed {}.
+
+Magic happens with the 'attributes' attribute: if it's a hashref (and
+it usually is), the new node doesn't end up with the same hashref, but
+with ref to a hash with the content duplicated from the original's
+hashref. If 'attributes' is not a hashref, but instead an object that
+belongs to a class that provides a method called "copy", then that
+method is called, and the result saved in the clone's 'attribute'
+attribute. Both of these kinds of magic are disabled if the options
+you pass to C<copy> (maybe via C<copy_tree>, or C<copy_at_and_under>)
+includes (C<no_attribute_copy> => 1).
+
+The options hashref you pass to C<copy> (derictly or indirectly) gets
+changed slightly after you call C<copy> -- it gets an entry called
+"from_to" added to it. Chances are you would never know nor care, but
+this is reserved for possible future use. See the source if you are
+wildly curious.
+
+Note that if you are using $node->copy (whether directly or via
+$node->copy_tree or $node->copy_at_or_under), and it's not properly
+copying object attributes containing references, you probably
+shouldn't fight it or try to fix it -- simply override copy_tree with:
+
+ sub copy_tree {
+ use Storable qw(dclone);
+ my $this = $_[0];
+ return dclone($this->root);
+ # d for "deep"
+ }
+
+or
+
+ sub copy_tree {
+ use Data::Dumper;
+ my $this = $_[0];
+ $Data::Dumper::Purity = 1;
+ return eval(Dumper($this->root));
+ }
+
+Both of these avoid you having to reinvent the wheel.
+
+How to override copy_at_or_under with something that uses Storable
+or Data::Dumper is left as an exercise to the reader.
+
+Consider that if in a derived class, you add attributes with really
+bizarre contents (like a unique-for-all-time-ID), you may need to
+override C<copy>. Consider:
+
+ sub copy {
+ my($it, @etc) = @_;
+ $it->SUPER::copy(@etc);
+ $it->{'UID'} = &get_new_UID;
+ }
+
+...or the like. See the source of Tree::DAG_Node::copy for
+inspiration.
+
+=cut
+
+sub copy {
+ my($from,$o) = @_[0,1];
+ $o = {} unless ref $o;
+
+ # Straight dupe, and bless into same class:
+ my $to = bless { %$from }, ref($from);
+
+ # Null out linkages.
+ $to->_init_mother;
+ $to->_init_daughters;
+
+ # dupe the 'attributes' attribute:
+ unless($o->{'no_attribute_copy'}) {
+ my $attrib_copy = ref($to->{'attributes'});
+ if($attrib_copy) {
+ if($attrib_copy eq 'HASH') {
+ $to->{'attributes'} = { %{$to->{'attributes'}} };
+ # dupe the hashref
+ } elsif ($attrib_copy = UNIVERSAL::can($to->{'attributes'}, 'copy') ) {
+ # $attrib_copy now points to the copier method
+ $to->{'attributes'} = &{$attrib_copy}($from);
+ } # otherwise I don't know how to copy it; leave as is
+ }
+ }
+ $o->{'from_to'}->{$from} = $to; # SECRET VOODOO
+ # ...autovivifies an anon hashref for 'from_to' if need be
+ # This is here in case I later want/need a table corresponding
+ # old nodes to new.
+ return $to;
+}
+
+
+###########################################################################
+
+=item $node->delete_tree
+
+Destroys the entire tree that $node is a member of (starting at the
+root), by nulling out each node-object's attributes (including, most
+importantly, its linkage attributes -- hopefully this is more than
+sufficient to eliminate all circularity in the data structure), and
+then moving it into the class DEADNODE.
+
+Use this when you're finished with the tree in question, and want to
+free up its memory. (If you don't do this, it'll get freed up anyway
+when your program ends.)
+
+If you try calling any methods on any of the node objects in the tree
+you've destroyed, you'll get an error like:
+
+ Can't locate object method "leaves_under"
+ via package "DEADNODE".
+
+So if you see that, that's what you've done wrong. (Actually, the
+class DEADNODE does provide one method: a no-op method "delete_tree".
+So if you want to delete a tree, but think you may have deleted it
+already, it's safe to call $node->delete_tree on it (again).)
+
+The C<delete_tree> method is needed because Perl's garbage collector
+would never (as currently implemented) see that it was time to
+de-allocate the memory the tree uses -- until either you call
+$node->delete_tree, or until the program stops (at "global
+destruction" time, when B<everything> is unallocated).
+
+Incidentally, there are better ways to do garbage-collecting on a
+tree, ways which don't require the user to explicitly call a method
+like C<delete_tree> -- they involve dummy classes, as explained at
+C<http://mox.perl.com/misc/circle-destroy.pod>
+
+However, introducing a dummy class concept into Tree::DAG_Node would
+be rather a distraction. If you want to do this with your derived
+classes, via a DESTROY in a dummy class (or in a tree-metainformation
+class, maybe), then feel free to.
+
+The only case where I can imagine C<delete_tree> failing to totally
+void the tree, is if you use the hashref in the "attributes" attribute
+to store (presumably among other things) references to other nodes'
+"attributes" hashrefs -- which 1) is maybe a bit odd, and 2) is your
+problem, because it's your hash structure that's circular, not the
+tree's. Anyway, consider:
+
+ # null out all my "attributes" hashes
+ $anywhere->root->walk_down({
+ 'callback' => sub {
+ $hr = $_[0]->attributes; %$hr = (); return 1;
+ }
+ });
+ # And then:
+ $anywhere->delete_tree;
+
+(I suppose C<delete_tree> is a "destructor", or as close as you can
+meaningfully come for a circularity-rich data structure in Perl.)
+
+=cut
+
+sub delete_tree {
+ my $it = $_[0];
+ $it->root->walk_down({ # has to be callbackback, not callback
+ 'callbackback' => sub {
+ %{$_[0]} = ();
+ bless($_[0], 'DEADNODE'); # cause become dead! cause become dead!
+ return 1;
+ }
+ });
+ return;
+ # Why DEADNODE? Because of the nice error message:
+ # "Can't locate object method "leaves_under" via package "DEADNODE"."
+ # Moreover, DEADNODE doesn't provide is_node, so fails my can() tests.
+}
+
+sub DEADNODE::delete_tree { return; }
+ # in case you kill it AGAIN!!!!! AND AGAIN AND AGAIN!!!!!! OO-HAHAHAHA!
+
+###########################################################################
+# stolen from MIDI.pm
+
+sub _dump_quote {
+ my @stuff = @_;
+ return
+ join(", ",
+ map
+ { # the cleaner-upper function
+ if(!length($_)) { # empty string
+ "''";
+ } elsif( m/^-?\d+(?:\.\d+)?$/s ) { # a number
+ $_;
+ } elsif( # text with junk in it
+ s<([^\x20\x21\x23\x27-\x3F\x41-\x5B\x5D-\x7E])>
+ <'\\x'.(unpack("H2",$1))>eg
+ ) {
+ "\"$_\"";
+ } else { # text with no junk in it
+ s<'><\\'>g;
+ "\'$_\'";
+ }
+ }
+ @stuff
+ );
+}
+
+###########################################################################
+
+=back
+
+=head2 When and How to Destroy
+
+It should be clear to you that if you've built a big parse tree or
+something, and then you're finished with it, you should call
+$some_node->delete_tree on it if you want the memory back.
+
+But consider this case: you've got this tree:
+
+ A
+ / | \
+ B C D
+ | | \
+ E X Y
+
+Let's say you decide you don't want D or any of its descendants in the
+tree, so you call D->unlink_from_mother. This does NOT automagically
+destroy the tree D-X-Y. Instead it merely splits the tree into two:
+
+ A D
+ / \ / \
+ B C X Y
+ |
+ E
+
+To destroy D and its little tree, you have to explicitly call
+delete_tree on it.
+
+Note, however, that if you call C->unlink_from_mother, and if you don't
+have a link to C anywhere, then it B<does> magically go away. This is
+because nothing links to C -- whereas with the D-X-Y tree, D links to
+X and Y, and X and Y each link back to D. Note that calling
+C->delete_tree is harmless -- after all, a tree of only one node is
+still a tree.
+
+So, this is a surefire way of getting rid of all $node's children and
+freeing up the memory associated with them and their descendants:
+
+ foreach my $it ($node->clear_daughters) { $it->delete_tree }
+
+Just be sure not to do this:
+
+ foreach my $it ($node->daughters) { $it->delete_tree }
+ $node->clear_daughters;
+
+That's bad; the first call to $_->delete_tree will climb to the root
+of $node's tree, and nuke the whole tree, not just the bits under $node.
+You might as well have just called $node->delete_tree.
+(Moreavor, once $node is dead, you can't call clear_daughters on it,
+so you'll get an error there.)
+
+=head1 BUG REPORTS
+
+If you find a bug in this library, report it to me as soon as possible,
+at the address listed in the MAINTAINER section, below. Please try to
+be as specific as possible about how you got the bug to occur.
+
+=head1 HELP!
+
+If you develop a given routine for dealing with trees in some way, and
+use it a lot, then if you think it'd be of use to anyone else, do email
+me about it; it might be helpful to others to include that routine, or
+something based on it, in a later version of this module.
+
+It's occurred to me that you might like to (and might yourself develop
+routines to) draw trees in something other than ASCII art. If you do so
+-- say, for PostScript output, or for output interpretable by some
+external plotting program -- I'd be most interested in the results.
+
+=head1 RAMBLINGS
+
+This module uses "strict", but I never wrote it with -w warnings in
+mind -- so if you use -w, do not be surprised if you see complaints
+from the guts of DAG_Node. As long as there is no way to turn off -w
+for a given module (instead of having to do it in every single
+subroutine with a "local $^W"), I'm not going to change this. However,
+I do, at points, get bursts of ambition, and I try to fix code in
+DAG_Node that generates warnings, I<as I come across them> -- which is
+only occasionally. Feel free to email me any patches for any such
+fixes you come up with, tho.
+
+Currently I don't assume (or enforce) anything about the class
+membership of nodes being manipulated, other than by testing whether
+each one provides a method C<is_node>, a la:
+
+ die "Not a node!!!" unless UNIVERSAL::can($node, "is_node");
+
+So, as far as I'm concerned, a given tree's nodes are free to belong to
+different classes, just so long as they provide/inherit C<is_node>, the
+few methods that this class relies on to navigate the tree, and have the
+same internal object structure, or a superset of it. Presumably this
+would be the case for any object belonging to a class derived from
+C<Tree::DAG_Node>, or belonging to C<Tree::DAG_Node> itself.
+
+When routines in this class access a node's "mother" attribute, or its
+"daughters" attribute, they (generally) do so directly (via
+$node->{'mother'}, etc.), for sake of efficiency. But classes derived
+from this class should probably do this instead thru a method (via
+$node->mother, etc.), for sake of portability, abstraction, and general
+goodness.
+
+However, no routines in this class (aside from, necessarily, C<_init>,
+C<_init_name>, and C<name>) access the "name" attribute directly;
+routines (like the various tree draw/dump methods) get the "name" value
+thru a call to $obj->name(). So if you want the object's name to not be
+a real attribute, but instead have it derived dynamically from some feature
+of the object (say, based on some of its other attributes, or based on
+its address), you can to override the C<name> method, without causing
+problems. (Be sure to consider the case of $obj->name as a write
+method, as it's used in C<lol_to_tree> and C<random_network>.)
+
+=head1 SEE ALSO
+
+L<HTML::Element>
+
+Wirth, Niklaus. 1976. I<Algorithms + Data Structures = Programs>
+Prentice-Hall, Englewood Cliffs, NJ.
+
+Knuth, Donald Ervin. 1997. I<Art of Computer Programming, Volume 1,
+Third Edition: Fundamental Algorithms>. Addison-Wesley, Reading, MA.
+
+Wirth's classic, currently and lamentably out of print, has a good
+section on trees. I find it clearer than Knuth's (if not quite as
+encyclopedic), probably because Wirth's example code is in a
+block-structured high-level language (basically Pascal), instead
+of in assembler (MIX).
+
+Until some kind publisher brings out a new printing of Wirth's book,
+try poking around used bookstores (or C<www.abebooks.com>) for a copy.
+I think it was also republished in the 1980s under the title
+I<Algorithms and Data Structures>, and in a German edition called
+I<Algorithmen und Datenstrukturen>. (That is, I'm sure books by Knuth
+were published under those titles, but I'm I<assuming> that they're just
+later printings/editions of I<Algorithms + Data Structures =
+Programs>.)
+
+=head1 MAINTAINER
+
+David Hand, C<< <cogent@cpan.org> >>
+
+=head1 AUTHOR
+
+Sean M. Burke, C<< <sburke@cpan.org> >>
+
+=head1 COPYRIGHT, LICENSE, AND DISCLAIMER
+
+Copyright 1998-2001, 2004, 2007 by Sean M. Burke and David Hand.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=cut
+
+1;
+
+__END__
diff --git a/Master/tlpkg/tlperl.straw/lib/UNIVERSAL.pm b/Master/tlpkg/tlperl.straw/lib/UNIVERSAL.pm
new file mode 100755
index 00000000000..3a7b53ef61b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/UNIVERSAL.pm
@@ -0,0 +1,205 @@
+package UNIVERSAL;
+
+our $VERSION = '1.05';
+
+# UNIVERSAL should not contain any extra subs/methods beyond those
+# that it exists to define. The use of Exporter below is a historical
+# accident that can't be fixed without breaking code. Note that we
+# *don't* set @ISA here, as we don't want all classes/objects inheriting from
+# Exporter. It's bad enough that all classes have a import() method
+# whenever UNIVERSAL.pm is loaded.
+require Exporter;
+@EXPORT_OK = qw(isa can VERSION);
+
+# Make sure that even though the import method is called, it doesn't do
+# anything unless called on UNIVERSAL.
+sub import {
+ return unless $_[0] eq __PACKAGE__;
+ goto &Exporter::import;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+UNIVERSAL - base class for ALL classes (blessed references)
+
+=head1 SYNOPSIS
+
+ $is_io = $fd->isa("IO::Handle");
+ $is_io = Class->isa("IO::Handle");
+
+ $does_log = $obj->DOES("Logger");
+ $does_log = Class->DOES("Logger");
+
+ $sub = $obj->can("print");
+ $sub = Class->can("print");
+
+ $sub = eval { $ref->can("fandango") };
+ $ver = $obj->VERSION;
+
+ # but never do this!
+ $is_io = UNIVERSAL::isa($fd, "IO::Handle");
+ $sub = UNIVERSAL::can($obj, "print");
+
+=head1 DESCRIPTION
+
+C<UNIVERSAL> is the base class from which all blessed references inherit.
+See L<perlobj>.
+
+C<UNIVERSAL> provides the following methods:
+
+=over 4
+
+=item C<< $obj->isa( TYPE ) >>
+
+=item C<< CLASS->isa( TYPE ) >>
+
+=item C<< eval { VAL->isa( TYPE ) } >>
+
+Where
+
+=over 4
+
+=item C<TYPE>
+
+is a package name
+
+=item C<$obj>
+
+is a blessed reference or a package name
+
+=item C<CLASS>
+
+is a package name
+
+=item C<VAL>
+
+is any of the above or an unblessed reference
+
+=back
+
+When used as an instance or class method (C<< $obj->isa( TYPE ) >>),
+C<isa> returns I<true> if $obj is blessed into package C<TYPE> or
+inherits from package C<TYPE>.
+
+When used as a class method (C<< CLASS->isa( TYPE ) >>, sometimes
+referred to as a static method), C<isa> returns I<true> if C<CLASS>
+inherits from (or is itself) the name of the package C<TYPE> or
+inherits from package C<TYPE>.
+
+If you're not sure what you have (the C<VAL> case), wrap the method call in an
+C<eval> block to catch the exception if C<VAL> is undefined.
+
+If you want to be sure that you're calling C<isa> as a method, not a class,
+check the invocant with C<blessed> from L<Scalar::Util> first:
+
+ use Scalar::Util 'blessed';
+
+ if ( blessed( $obj ) && $obj->isa("Some::Class") {
+ ...
+ }
+
+=item C<< $obj->DOES( ROLE ) >>
+
+=item C<< CLASS->DOES( ROLE ) >>
+
+C<DOES> checks if the object or class performs the role C<ROLE>. A role is a
+named group of specific behavior (often methods of particular names and
+signatures), similar to a class, but not necessarily a complete class by
+itself. For example, logging or serialization may be roles.
+
+C<DOES> and C<isa> are similar, in that if either is true, you know that the
+object or class on which you call the method can perform specific behavior.
+However, C<DOES> is different from C<isa> in that it does not care I<how> the
+invocant performs the operations, merely that it does. (C<isa> of course
+mandates an inheritance relationship. Other relationships include aggregation,
+delegation, and mocking.)
+
+By default, classes in Perl only perform the C<UNIVERSAL> role, as well as the
+role of all classes in their inheritance. In other words, by default C<DOES>
+responds identically to C<isa>.
+
+There is a relationship between roles and classes, as each class implies the
+existence of a role of the same name. There is also a relationship between
+inheritance and roles, in that a subclass that inherits from an ancestor class
+implicitly performs any roles its parent performs. Thus you can use C<DOES> in
+place of C<isa> safely, as it will return true in all places where C<isa> will
+return true (provided that any overridden C<DOES> I<and> C<isa> methods behave
+appropriately).
+
+=item C<< $obj->can( METHOD ) >>
+
+=item C<< CLASS->can( METHOD ) >>
+
+=item C<< eval { VAL->can( METHOD ) } >>
+
+C<can> checks if the object or class has a method called C<METHOD>. If it does,
+then it returns a reference to the sub. If it does not, then it returns
+I<undef>. This includes methods inherited or imported by C<$obj>, C<CLASS>, or
+C<VAL>.
+
+C<can> cannot know whether an object will be able to provide a method through
+AUTOLOAD (unless the object's class has overriden C<can> appropriately), so a
+return value of I<undef> does not necessarily mean the object will not be able
+to handle the method call. To get around this some module authors use a forward
+declaration (see L<perlsub>) for methods they will handle via AUTOLOAD. For
+such 'dummy' subs, C<can> will still return a code reference, which, when
+called, will fall through to the AUTOLOAD. If no suitable AUTOLOAD is provided,
+calling the coderef will cause an error.
+
+You may call C<can> as a class (static) method or an object method.
+
+Again, the same rule about having a valid invocant applies -- use an C<eval>
+block or C<blessed> if you need to be extra paranoid.
+
+=item C<VERSION ( [ REQUIRE ] )>
+
+C<VERSION> will return the value of the variable C<$VERSION> in the
+package the object is blessed into. If C<REQUIRE> is given then
+it will do a comparison and die if the package version is not
+greater than or equal to C<REQUIRE>.
+
+C<VERSION> can be called as either a class (static) method or an object
+method.
+
+=back
+
+=head1 WARNINGS
+
+B<NOTE:> C<can> directly uses Perl's internal code for method lookup, and
+C<isa> uses a very similar method and cache-ing strategy. This may cause
+strange effects if the Perl code dynamically changes @ISA in any package.
+
+You may add other methods to the UNIVERSAL class via Perl or XS code.
+You do not need to C<use UNIVERSAL> to make these methods
+available to your program (and you should not do so).
+
+=head1 EXPORTS
+
+None by default.
+
+You may request the import of three functions (C<isa>, C<can>, and C<VERSION>),
+however it is usually harmful to do so. Please don't do this in new code.
+
+For example, previous versions of this documentation suggested using C<isa> as
+a function to determine the type of a reference:
+
+ use UNIVERSAL 'isa';
+
+ $yes = isa $h, "HASH";
+ $yes = isa "Foo", "Bar";
+
+The problem is that this code will I<never> call an overridden C<isa> method in
+any class. Instead, use C<reftype> from L<Scalar::Util> for the first case:
+
+ use Scalar::Util 'reftype';
+
+ $yes = reftype( $h ) eq "HASH";
+
+and the method form of C<isa> for the second:
+
+ $yes = Foo->isa("Bar");
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/Escape.pm b/Master/tlpkg/tlperl.straw/lib/URI/Escape.pm
new file mode 100755
index 00000000000..c2da23becac
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/Escape.pm
@@ -0,0 +1,218 @@
+package URI::Escape;
+use strict;
+
+=head1 NAME
+
+URI::Escape - Escape and unescape unsafe characters
+
+=head1 SYNOPSIS
+
+ use URI::Escape;
+ $safe = uri_escape("10% is enough\n");
+ $verysafe = uri_escape("foo", "\0-\377");
+ $str = uri_unescape($safe);
+
+=head1 DESCRIPTION
+
+This module provides functions to escape and unescape URI strings as
+defined by RFC 2396 (and updated by RFC 2732).
+A URI consists of a restricted set of characters,
+denoted as C<uric> in RFC 2396. The restricted set of characters
+consists of digits, letters, and a few graphic symbols chosen from
+those common to most of the character encodings and input facilities
+available to Internet users:
+
+ "A" .. "Z", "a" .. "z", "0" .. "9",
+ ";", "/", "?", ":", "@", "&", "=", "+", "$", ",", "[", "]", # reserved
+ "-", "_", ".", "!", "~", "*", "'", "(", ")"
+
+In addition, any byte (octet) can be represented in a URI by an escape
+sequence: a triplet consisting of the character "%" followed by two
+hexadecimal digits. A byte can also be represented directly by a
+character, using the US-ASCII character for that octet (iff the
+character is part of C<uric>).
+
+Some of the C<uric> characters are I<reserved> for use as delimiters
+or as part of certain URI components. These must be escaped if they are
+to be treated as ordinary data. Read RFC 2396 for further details.
+
+The functions provided (and exported by default) from this module are:
+
+=over 4
+
+=item uri_escape( $string )
+
+=item uri_escape( $string, $unsafe )
+
+Replaces each unsafe character in the $string with the corresponding
+escape sequence and returns the result. The $string argument should
+be a string of bytes. The uri_escape() function will croak if given a
+characters with code above 255. Use uri_escape_utf8() if you know you
+have such chars or/and want chars in the 128 .. 255 range treated as
+UTF-8.
+
+The uri_escape() function takes an optional second argument that
+overrides the set of characters that are to be escaped. The set is
+specified as a string that can be used in a regular expression
+character class (between [ ]). E.g.:
+
+ "\x00-\x1f\x7f-\xff" # all control and hi-bit characters
+ "a-z" # all lower case characters
+ "^A-Za-z" # everything not a letter
+
+The default set of characters to be escaped is all those which are
+I<not> part of the C<uric> character class shown above as well as the
+reserved characters. I.e. the default is:
+
+ "^A-Za-z0-9\-_.!~*'()"
+
+=item uri_escape_utf8( $string )
+
+=item uri_escape_utf8( $string, $unsafe )
+
+Works like uri_escape(), but will encode chars as UTF-8 before
+escaping them. This makes this function able do deal with characters
+with code above 255 in $string. Note that chars in the 128 .. 255
+range will be escaped differently by this function compared to what
+uri_escape() would. For chars in the 0 .. 127 range there is no
+difference.
+
+The call:
+
+ $uri = uri_escape_utf8($string);
+
+will be the same as:
+
+ use Encode qw(encode);
+ $uri = uri_escape(encode("UTF-8", $string));
+
+but will even work for perl-5.6 for chars in the 128 .. 255 range.
+
+Note: Javascript has a function called escape() that produces the
+sequence "%uXXXX" for chars in the 256 .. 65535 range. This function
+has really nothing to do with URI escaping but some folks got confused
+since it "does the right thing" in the 0 .. 255 range. Because of
+this you sometimes see "URIs" with these kind of escapes. The
+JavaScript encodeURIComponent() function is similar to uri_escape_utf8().
+
+=item uri_unescape($string,...)
+
+Returns a string with each %XX sequence replaced with the actual byte
+(octet).
+
+This does the same as:
+
+ $string =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+
+but does not modify the string in-place as this RE would. Using the
+uri_unescape() function instead of the RE might make the code look
+cleaner and is a few characters less to type.
+
+In a simple benchmark test I did,
+calling the function (instead of the inline RE above) if a few chars
+were unescaped was something like 40% slower, and something like 700% slower if none were. If
+you are going to unescape a lot of times it might be a good idea to
+inline the RE.
+
+If the uri_unescape() function is passed multiple strings, then each
+one is returned unescaped.
+
+=back
+
+The module can also export the C<%escapes> hash, which contains the
+mapping from all 256 bytes to the corresponding escape codes. Lookup
+in this hash is faster than evaluating C<sprintf("%%%02X", ord($byte))>
+each time.
+
+=head1 SEE ALSO
+
+L<URI>
+
+
+=head1 COPYRIGHT
+
+Copyright 1995-2004 Gisle Aas.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+use vars qw(%escapes);
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(uri_escape uri_unescape uri_escape_utf8);
+@EXPORT_OK = qw(%escapes);
+$VERSION = "3.29";
+
+use Carp ();
+
+# Build a char->hex map
+for (0..255) {
+ $escapes{chr($_)} = sprintf("%%%02X", $_);
+}
+
+my %subst; # compiled patternes
+
+sub uri_escape
+{
+ my($text, $patn) = @_;
+ return undef unless defined $text;
+ if (defined $patn){
+ unless (exists $subst{$patn}) {
+ # Because we can't compile the regex we fake it with a cached sub
+ (my $tmp = $patn) =~ s,/,\\/,g;
+ eval "\$subst{\$patn} = sub {\$_[0] =~ s/([$tmp])/\$escapes{\$1} || _fail_hi(\$1)/ge; }";
+ Carp::croak("uri_escape: $@") if $@;
+ }
+ &{$subst{$patn}}($text);
+ } else {
+ # Default unsafe characters. RFC 2732 ^(uric - reserved)
+ $text =~ s/([^A-Za-z0-9\-_.!~*'()])/$escapes{$1} || _fail_hi($1)/ge;
+ }
+ $text;
+}
+
+sub _fail_hi {
+ my $chr = shift;
+ Carp::croak(sprintf "Can't escape \\x{%04X}, try uri_escape_utf8() instead", ord($chr));
+}
+
+sub uri_escape_utf8
+{
+ my $text = shift;
+ if ($] < 5.008) {
+ $text =~ s/([^\0-\x7F])/do {my $o = ord($1); sprintf("%c%c", 0xc0 | ($o >> 6), 0x80 | ($o & 0x3f)) }/ge;
+ }
+ else {
+ utf8::encode($text);
+ }
+
+ return uri_escape($text, @_);
+}
+
+sub uri_unescape
+{
+ # Note from RFC1630: "Sequences which start with a percent sign
+ # but are not followed by two hexadecimal characters are reserved
+ # for future extension"
+ my $str = shift;
+ if (@_ && wantarray) {
+ # not executed for the common case of a single argument
+ my @str = ($str, @_); # need to copy
+ foreach (@str) {
+ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+ }
+ return @str;
+ }
+ $str =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg if defined $str;
+ $str;
+}
+
+sub escape_char {
+ return join '', @URI::Escape::escapes{$_[0] =~ /(\C)/g};
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/Heuristic.pm b/Master/tlpkg/tlperl.straw/lib/URI/Heuristic.pm
new file mode 100755
index 00000000000..eb000609b9d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/Heuristic.pm
@@ -0,0 +1,222 @@
+package URI::Heuristic;
+
+=head1 NAME
+
+URI::Heuristic - Expand URI using heuristics
+
+=head1 SYNOPSIS
+
+ use URI::Heuristic qw(uf_uristr);
+ $u = uf_uristr("perl"); # http://www.perl.com
+ $u = uf_uristr("www.sol.no/sol"); # http://www.sol.no/sol
+ $u = uf_uristr("aas"); # http://www.aas.no
+ $u = uf_uristr("ftp.funet.fi"); # ftp://ftp.funet.fi
+ $u = uf_uristr("/etc/passwd"); # file:/etc/passwd
+
+=head1 DESCRIPTION
+
+This module provides functions that expand strings into real absolute
+URIs using some built-in heuristics. Strings that already represent
+absolute URIs (i.e. that start with a C<scheme:> part) are never modified
+and are returned unchanged. The main use of these functions is to
+allow abbreviated URIs similar to what many web browsers allow for URIs
+typed in by the user.
+
+The following functions are provided:
+
+=over 4
+
+=item uf_uristr($str)
+
+Tries to make the argument string
+into a proper absolute URI string. The "uf_" prefix stands for "User
+Friendly". Under MacOS, it assumes that any string with a common URL
+scheme (http, ftp, etc.) is a URL rather than a local path. So don't name
+your volumes after common URL schemes and expect uf_uristr() to construct
+valid file: URL's on those volumes for you, because it won't.
+
+=item uf_uri($str)
+
+Works the same way as uf_uristr() but
+returns a C<URI> object.
+
+=back
+
+=head1 ENVIRONMENT
+
+If the hostname portion of a URI does not contain any dots, then
+certain qualified guesses are made. These guesses are governed by
+the following two environment variables:
+
+=over 10
+
+=item COUNTRY
+
+The two-letter country code (ISO 3166) for your location. If
+the domain name of your host ends with two letters, then it is taken
+to be the default country. See also L<Locale::Country>.
+
+=item URL_GUESS_PATTERN
+
+Contains a space-separated list of URL patterns to try. The string
+"ACME" is for some reason used as a placeholder for the host name in
+the URL provided. Example:
+
+ URL_GUESS_PATTERN="www.ACME.no www.ACME.se www.ACME.com"
+ export URL_GUESS_PATTERN
+
+Specifying URL_GUESS_PATTERN disables any guessing rules based on
+country. An empty URL_GUESS_PATTERN disables any guessing that
+involves host name lookups.
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 1997-1998, Gisle Aas
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
+use strict;
+
+use vars qw(@EXPORT_OK $VERSION $MY_COUNTRY %LOCAL_GUESSING $DEBUG);
+
+require Exporter;
+*import = \&Exporter::import;
+@EXPORT_OK = qw(uf_uri uf_uristr uf_url uf_urlstr);
+$VERSION = "4.18";
+
+sub MY_COUNTRY() {
+ for ($MY_COUNTRY) {
+ return $_ if defined;
+
+ # First try the environment.
+ $_ = $ENV{COUNTRY};
+ return $_ if defined;
+
+ # Could use LANG, LC_ALL, etc at this point, but probably too
+ # much of a wild guess. (Catalan != Canada, etc.)
+ #
+
+ # Last bit of domain name. This may access the network.
+ require Net::Domain;
+ my $fqdn = Net::Domain::hostfqdn();
+ $_ = lc($1) if $fqdn =~ /\.([a-zA-Z]{2})$/;
+ return $_ if defined;
+
+ # Give up. Defined but false.
+ return ($_ = 0);
+ }
+}
+
+%LOCAL_GUESSING =
+(
+ 'us' => [qw(www.ACME.gov www.ACME.mil)],
+ 'uk' => [qw(www.ACME.co.uk www.ACME.org.uk www.ACME.ac.uk)],
+ 'au' => [qw(www.ACME.com.au www.ACME.org.au www.ACME.edu.au)],
+ 'il' => [qw(www.ACME.co.il www.ACME.org.il www.ACME.net.il)],
+ # send corrections and new entries to <gisle@aas.no>
+);
+
+
+sub uf_uristr ($)
+{
+ local($_) = @_;
+ print STDERR "uf_uristr: resolving $_\n" if $DEBUG;
+ return unless defined;
+
+ s/^\s+//;
+ s/\s+$//;
+
+ if (/^(www|web|home)\./) {
+ $_ = "http://$_";
+
+ } elsif (/^(ftp|gopher|news|wais|http|https)\./) {
+ $_ = "$1://$_";
+
+ } elsif ($^O ne "MacOS" &&
+ (m,^/, || # absolute file name
+ m,^\.\.?/, || # relative file name
+ m,^[a-zA-Z]:[/\\],) # dosish file name
+ )
+ {
+ $_ = "file:$_";
+
+ } elsif ($^O eq "MacOS" && m/:/) {
+ # potential MacOS file name
+ unless (m/^(ftp|gopher|news|wais|http|https|mailto):/) {
+ require URI::file;
+ my $a = URI::file->new($_)->as_string;
+ $_ = ($a =~ m/^file:/) ? $a : "file:$a";
+ }
+ } elsif (/^\w+([\.\-]\w+)*\@(\w+\.)+\w{2,3}$/) {
+ $_ = "mailto:$_";
+
+ } elsif (!/^[a-zA-Z][a-zA-Z0-9.+\-]*:/) { # no scheme specified
+ if (s/^([-\w]+(?:\.[-\w]+)*)([\/:\?\#]|$)/$2/) {
+ my $host = $1;
+
+ if ($host !~ /\./ && $host ne "localhost") {
+ my @guess;
+ if (exists $ENV{URL_GUESS_PATTERN}) {
+ @guess = map { s/\bACME\b/$host/; $_ }
+ split(' ', $ENV{URL_GUESS_PATTERN});
+ } else {
+ if (MY_COUNTRY()) {
+ my $special = $LOCAL_GUESSING{MY_COUNTRY()};
+ if ($special) {
+ my @special = @$special;
+ push(@guess, map { s/\bACME\b/$host/; $_ }
+ @special);
+ } else {
+ push(@guess, "www.$host." . MY_COUNTRY());
+ }
+ }
+ push(@guess, map "www.$host.$_",
+ "com", "org", "net", "edu", "int");
+ }
+
+
+ my $guess;
+ for $guess (@guess) {
+ print STDERR "uf_uristr: gethostbyname('$guess.')..."
+ if $DEBUG;
+ if (gethostbyname("$guess.")) {
+ print STDERR "yes\n" if $DEBUG;
+ $host = $guess;
+ last;
+ }
+ print STDERR "no\n" if $DEBUG;
+ }
+ }
+ $_ = "http://$host$_";
+
+ } else {
+ # pure junk, just return it unchanged...
+
+ }
+ }
+ print STDERR "uf_uristr: ==> $_\n" if $DEBUG;
+
+ $_;
+}
+
+sub uf_uri ($)
+{
+ require URI;
+ URI->new(uf_uristr($_[0]));
+}
+
+# legacy
+*uf_urlstr = \*uf_uristr;
+
+sub uf_url ($)
+{
+ require URI::URL;
+ URI::URL->new(uf_uristr($_[0]));
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/IRI.pm b/Master/tlpkg/tlperl.straw/lib/URI/IRI.pm
new file mode 100755
index 00000000000..39336fce5ac
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/IRI.pm
@@ -0,0 +1,44 @@
+package URI::IRI;
+
+# Experimental
+
+use strict;
+use URI ();
+
+use overload '""' => sub { shift->as_string };
+
+sub new {
+ my($class, $uri, $scheme) = @_;
+ utf8::upgrade($uri);
+ return bless {
+ uri => URI->new($uri, $scheme),
+ }, $class;
+}
+
+sub clone {
+ my $self = shift;
+ return bless {
+ uri => $self->{uri}->clone,
+ }, ref($self);
+}
+
+sub as_string {
+ my $self = shift;
+ return $self->{uri}->as_iri;
+}
+
+sub AUTOLOAD
+{
+ use vars qw($AUTOLOAD);
+ my $method = substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);
+
+ # We create the function here so that it will not need to be
+ # autoloaded the next time.
+ no strict 'refs';
+ *$method = sub { shift->{uri}->$method(@_) };
+ goto &$method;
+}
+
+sub DESTROY {} # avoid AUTOLOADing it
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/QueryParam.pm b/Master/tlpkg/tlperl.straw/lib/URI/QueryParam.pm
new file mode 100755
index 00000000000..3f634b12b77
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/QueryParam.pm
@@ -0,0 +1,200 @@
+package URI::QueryParam;
+
+use strict;
+
+sub URI::_query::query_param {
+ my $self = shift;
+ my @old = $self->query_form;
+
+ if (@_ == 0) {
+ # get keys
+ my %seen;
+ my @keys;
+ for (my $i = 0; $i < @old; $i += 2) {
+ push(@keys, $old[$i]) unless $seen{$old[$i]}++;
+ }
+ return @keys;
+ }
+
+ my $key = shift;
+ my @i;
+
+ for (my $i = 0; $i < @old; $i += 2) {
+ push(@i, $i) if $old[$i] eq $key;
+ }
+
+ if (@_) {
+ my @new = @old;
+ my @new_i = @i;
+ my @vals = map { ref($_) eq 'ARRAY' ? @$_ : $_ } @_;
+ #print "VALS:@vals [@i]\n";
+ while (@new_i > @vals) {
+ #print "REMOVE $new_i[-1]\n";
+ splice(@new, pop(@new_i), 2);
+ }
+ while (@vals > @new_i) {
+ my $i = @new_i ? $new_i[-1] + 2 : @new;
+ #print "SPLICE $i\n";
+ splice(@new, $i, 0, $key => pop(@vals));
+ }
+ for (@vals) {
+ #print "SET $new_i[0]\n";
+ $new[shift(@new_i)+1] = $_;
+ }
+
+ $self->query_form(\@new);
+ }
+
+ return wantarray ? @old[map $_+1, @i] : @i ? $old[$i[0]+1] : undef;
+}
+
+sub URI::_query::query_param_append {
+ my $self = shift;
+ my $key = shift;
+ $self->query_form($self->query_form, $key => \@_); # XXX
+ return;
+}
+
+sub URI::_query::query_param_delete {
+ my $self = shift;
+ my $key = shift;
+ my @old = $self->query_form;
+ my @vals;
+
+ for (my $i = @old - 2; $i >= 0; $i -= 2) {
+ next if $old[$i] ne $key;
+ push(@vals, (splice(@old, $i, 2))[1]);
+ }
+ $self->query_form(\@old) if @vals;
+ return wantarray ? reverse @vals : $vals[-1];
+}
+
+sub URI::_query::query_form_hash {
+ my $self = shift;
+ my @old = $self->query_form;
+ if (@_) {
+ $self->query_form(@_ == 1 ? %{shift(@_)} : @_);
+ }
+ my %hash;
+ while (my($k, $v) = splice(@old, 0, 2)) {
+ if (exists $hash{$k}) {
+ for ($hash{$k}) {
+ $_ = [$_] unless ref($_) eq "ARRAY";
+ push(@$_, $v);
+ }
+ }
+ else {
+ $hash{$k} = $v;
+ }
+ }
+ return \%hash;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+URI::QueryParam - Additional query methods for URIs
+
+=head1 SYNOPSIS
+
+ use URI;
+ use URI::QueryParam;
+
+ $u = URI->new("", "http");
+ $u->query_param(foo => 1, 2, 3);
+ print $u->query; # prints foo=1&foo=2&foo=3
+
+ for my $key ($u->query_param) {
+ print "$key: ", join(", ", $u->query_param($key)), "\n";
+ }
+
+=head1 DESCRIPTION
+
+Loading the C<URI::QueryParam> module adds some extra methods to
+URIs that support query methods. These methods provide an alternative
+interface to the $u->query_form data.
+
+The query_param_* methods have deliberately been made identical to the
+interface of the corresponding C<CGI.pm> methods.
+
+The following additional methods are made available:
+
+=over
+
+=item @keys = $u->query_param
+
+=item @values = $u->query_param( $key )
+
+=item $first_value = $u->query_param( $key )
+
+=item $u->query_param( $key, $value,... )
+
+If $u->query_param is called with no arguments, it returns all the
+distinct parameter keys of the URI. In a scalar context it returns the
+number of distinct keys.
+
+When a $key argument is given, the method returns the parameter values with the
+given key. In a scalar context, only the first parameter value is
+returned.
+
+If additional arguments are given, they are used to update successive
+parameters with the given key. If any of the values provided are
+array references, then the array is dereferenced to get the actual
+values.
+
+=item $u->query_param_append($key, $value,...)
+
+Adds new parameters with the given
+key without touching any old parameters with the same key. It
+can be explained as a more efficient version of:
+
+ $u->query_param($key,
+ $u->query_param($key),
+ $value,...);
+
+One difference is that this expression would return the old values
+of $key, whereas the query_param_append() method does not.
+
+=item @values = $u->query_param_delete($key)
+
+=item $first_value = $u->query_param_delete($key)
+
+Deletes all key/value pairs with the given key.
+The old values are returned. In a scalar context, only the first value
+is returned.
+
+Using the query_param_delete() method is slightly more efficient than
+the equivalent:
+
+ $u->query_param($key, []);
+
+=item $hashref = $u->query_form_hash
+
+=item $u->query_form_hash( \%new_form )
+
+Returns a reference to a hash that represents the
+query form's key/value pairs. If a key occurs multiple times, then the hash
+value becomes an array reference.
+
+Note that sequence information is lost. This means that:
+
+ $u->query_form_hash($u->query_form_hash);
+
+is not necessarily a no-op, as it may reorder the key/value pairs.
+The values returned by the query_param() method should stay the same
+though.
+
+=back
+
+=head1 SEE ALSO
+
+L<URI>, L<CGI>
+
+=head1 COPYRIGHT
+
+Copyright 2002 Gisle Aas.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/Split.pm b/Master/tlpkg/tlperl.straw/lib/URI/Split.pm
new file mode 100755
index 00000000000..ad430b93277
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/Split.pm
@@ -0,0 +1,96 @@
+package URI::Split;
+
+use strict;
+
+use vars qw(@ISA @EXPORT_OK);
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(uri_split uri_join);
+
+use URI::Escape ();
+
+sub uri_split {
+ return $_[0] =~ m,(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?,;
+}
+
+sub uri_join {
+ my($scheme, $auth, $path, $query, $frag) = @_;
+ my $uri = defined($scheme) ? "$scheme:" : "";
+ $path = "" unless defined $path;
+ if (defined $auth) {
+ $auth =~ s,([/?\#]), URI::Escape::escape_char($1),eg;
+ $uri .= "//$auth";
+ $path = "/$path" if length($path) && $path !~ m,^/,;
+ }
+ elsif ($path =~ m,^//,) {
+ $uri .= "//"; # XXX force empty auth
+ }
+ unless (length $uri) {
+ $path =~ s,(:), URI::Escape::escape_char($1),e while $path =~ m,^[^:/?\#]+:,;
+ }
+ $path =~ s,([?\#]), URI::Escape::escape_char($1),eg;
+ $uri .= $path;
+ if (defined $query) {
+ $query =~ s,(\#), URI::Escape::escape_char($1),eg;
+ $uri .= "?$query";
+ }
+ $uri .= "#$frag" if defined $frag;
+ $uri;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+URI::Split - Parse and compose URI strings
+
+=head1 SYNOPSIS
+
+ use URI::Split qw(uri_split uri_join);
+ ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
+ $uri = uri_join($scheme, $auth, $path, $query, $frag);
+
+=head1 DESCRIPTION
+
+Provides functions to parse and compose URI
+strings. The following functions are provided:
+
+=over
+
+=item ($scheme, $auth, $path, $query, $frag) = uri_split($uri)
+
+Breaks up a URI string into its component
+parts. An C<undef> value is returned for those parts that are not
+present. The $path part is always present (but can be the empty
+string) and is thus never returned as C<undef>.
+
+No sensible value is returned if this function is called in a scalar
+context.
+
+=item $uri = uri_join($scheme, $auth, $path, $query, $frag)
+
+Puts together a URI string from its parts.
+Missing parts are signaled by passing C<undef> for the corresponding
+argument.
+
+Minimal escaping is applied to parts that contain reserved chars
+that would confuse a parser. For instance, any occurrence of '?' or '#'
+in $path is always escaped, as it would otherwise be parsed back
+as a query or fragment.
+
+=back
+
+=head1 SEE ALSO
+
+L<URI>, L<URI::Escape>
+
+=head1 COPYRIGHT
+
+Copyright 2003, Gisle Aas
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/URL.pm b/Master/tlpkg/tlperl.straw/lib/URI/URL.pm
new file mode 100755
index 00000000000..77354488c86
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/URL.pm
@@ -0,0 +1,305 @@
+package URI::URL;
+
+require URI::WithBase;
+@ISA=qw(URI::WithBase);
+
+use strict;
+use vars qw(@EXPORT $VERSION);
+
+$VERSION = "5.03";
+
+# Provide as much as possible of the old URI::URL interface for backwards
+# compatibility...
+
+require Exporter;
+*import = \&Exporter::import;
+@EXPORT = qw(url);
+
+# Easy to use constructor
+sub url ($;$) { URI::URL->new(@_); }
+
+use URI::Escape qw(uri_unescape);
+
+sub new
+{
+ my $class = shift;
+ my $self = $class->SUPER::new(@_);
+ $self->[0] = $self->[0]->canonical;
+ $self;
+}
+
+sub newlocal
+{
+ my $class = shift;
+ require URI::file;
+ bless [URI::file->new_abs(shift)], $class;
+}
+
+{package URI::_foreign;
+ sub _init # hope it is not defined
+ {
+ my $class = shift;
+ die "Unknown URI::URL scheme $_[1]:" if $URI::URL::STRICT;
+ $class->SUPER::_init(@_);
+ }
+}
+
+sub strict
+{
+ my $old = $URI::URL::STRICT;
+ $URI::URL::STRICT = shift if @_;
+ $old;
+}
+
+sub print_on
+{
+ my $self = shift;
+ require Data::Dumper;
+ print STDERR Data::Dumper::Dumper($self);
+}
+
+sub _try
+{
+ my $self = shift;
+ my $method = shift;
+ scalar(eval { $self->$method(@_) });
+}
+
+sub crack
+{
+ # should be overridden by subclasses
+ my $self = shift;
+ (scalar($self->scheme),
+ $self->_try("user"),
+ $self->_try("password"),
+ $self->_try("host"),
+ $self->_try("port"),
+ $self->_try("path"),
+ $self->_try("params"),
+ $self->_try("query"),
+ scalar($self->fragment),
+ )
+}
+
+sub full_path
+{
+ my $self = shift;
+ my $path = $self->path_query;
+ $path = "/" unless length $path;
+ $path;
+}
+
+sub netloc
+{
+ shift->authority(@_);
+}
+
+sub epath
+{
+ my $path = shift->SUPER::path(@_);
+ $path =~ s/;.*//;
+ $path;
+}
+
+sub eparams
+{
+ my $self = shift;
+ my @p = $self->path_segments;
+ return unless ref($p[-1]);
+ @p = @{$p[-1]};
+ shift @p;
+ join(";", @p);
+}
+
+sub params { shift->eparams(@_); }
+
+sub path {
+ my $self = shift;
+ my $old = $self->epath(@_);
+ return unless defined wantarray;
+ return '/' if !defined($old) || !length($old);
+ Carp::croak("Path components contain '/' (you must call epath)")
+ if $old =~ /%2[fF]/ and !@_;
+ $old = "/$old" if $old !~ m|^/| && defined $self->netloc;
+ return uri_unescape($old);
+}
+
+sub path_components {
+ shift->path_segments(@_);
+}
+
+sub query {
+ my $self = shift;
+ my $old = $self->equery(@_);
+ if (defined(wantarray) && defined($old)) {
+ if ($old =~ /%(?:26|2[bB]|3[dD])/) { # contains escaped '=' '&' or '+'
+ my $mess;
+ for ($old) {
+ $mess = "Query contains both '+' and '%2B'"
+ if /\+/ && /%2[bB]/;
+ $mess = "Form query contains escaped '=' or '&'"
+ if /=/ && /%(?:3[dD]|26)/;
+ }
+ if ($mess) {
+ Carp::croak("$mess (you must call equery)");
+ }
+ }
+ # Now it should be safe to unescape the string without loosing
+ # information
+ return uri_unescape($old);
+ }
+ undef;
+
+}
+
+sub abs
+{
+ my $self = shift;
+ my $base = shift;
+ my $allow_scheme = shift;
+ $allow_scheme = $URI::URL::ABS_ALLOW_RELATIVE_SCHEME
+ unless defined $allow_scheme;
+ local $URI::ABS_ALLOW_RELATIVE_SCHEME = $allow_scheme;
+ local $URI::ABS_REMOTE_LEADING_DOTS = $URI::URL::ABS_REMOTE_LEADING_DOTS;
+ $self->SUPER::abs($base);
+}
+
+sub frag { shift->fragment(@_); }
+sub keywords { shift->query_keywords(@_); }
+
+# file:
+sub local_path { shift->file; }
+sub unix_path { shift->file("unix"); }
+sub dos_path { shift->file("dos"); }
+sub mac_path { shift->file("mac"); }
+sub vms_path { shift->file("vms"); }
+
+# mailto:
+sub address { shift->to(@_); }
+sub encoded822addr { shift->to(@_); }
+sub URI::mailto::authority { shift->to(@_); } # make 'netloc' method work
+
+# news:
+sub groupart { shift->_group(@_); }
+sub article { shift->message(@_); }
+
+1;
+
+__END__
+
+=head1 NAME
+
+URI::URL - Uniform Resource Locators
+
+=head1 SYNOPSIS
+
+ $u1 = URI::URL->new($str, $base);
+ $u2 = $u1->abs;
+
+=head1 DESCRIPTION
+
+This module is provided for backwards compatibility with modules that
+depend on the interface provided by the C<URI::URL> class that used to
+be distributed with the libwww-perl library.
+
+The following differences exist compared to the C<URI> class interface:
+
+=over 3
+
+=item *
+
+The URI::URL module exports the url() function as an alternate
+constructor interface.
+
+=item *
+
+The constructor takes an optional $base argument. The C<URI::URL>
+class is a subclass of C<URI::WithBase>.
+
+=item *
+
+The URI::URL->newlocal class method is the same as URI::file->new_abs.
+
+=item *
+
+URI::URL::strict(1)
+
+=item *
+
+$url->print_on method
+
+=item *
+
+$url->crack method
+
+=item *
+
+$url->full_path: same as ($uri->abs_path || "/")
+
+=item *
+
+$url->netloc: same as $uri->authority
+
+=item *
+
+$url->epath, $url->equery: same as $uri->path, $uri->query
+
+=item *
+
+$url->path and $url->query pass unescaped strings.
+
+=item *
+
+$url->path_components: same as $uri->path_segments (if you don't
+consider path segment parameters)
+
+=item *
+
+$url->params and $url->eparams methods
+
+=item *
+
+$url->base method. See L<URI::WithBase>.
+
+=item *
+
+$url->abs and $url->rel have an optional $base argument. See
+L<URI::WithBase>.
+
+=item *
+
+$url->frag: same as $uri->fragment
+
+=item *
+
+$url->keywords: same as $uri->query_keywords
+
+=item *
+
+$url->localpath and friends map to $uri->file.
+
+=item *
+
+$url->address and $url->encoded822addr: same as $uri->to for mailto URI
+
+=item *
+
+$url->groupart method for news URI
+
+=item *
+
+$url->article: same as $uri->message
+
+=back
+
+
+
+=head1 SEE ALSO
+
+L<URI>, L<URI::WithBase>
+
+=head1 COPYRIGHT
+
+Copyright 1998-2000 Gisle Aas.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/WithBase.pm b/Master/tlpkg/tlperl.straw/lib/URI/WithBase.pm
new file mode 100755
index 00000000000..0337c6b6450
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/WithBase.pm
@@ -0,0 +1,171 @@
+package URI::WithBase;
+
+use strict;
+use vars qw($AUTOLOAD $VERSION);
+use URI;
+
+$VERSION = "2.19";
+
+use overload '""' => "as_string", fallback => 1;
+
+sub as_string; # help overload find it
+
+sub new
+{
+ my($class, $uri, $base) = @_;
+ my $ibase = $base;
+ if ($base && ref($base) && UNIVERSAL::isa($base, __PACKAGE__)) {
+ $base = $base->abs;
+ $ibase = $base->[0];
+ }
+ bless [URI->new($uri, $ibase), $base], $class;
+}
+
+sub new_abs
+{
+ my $class = shift;
+ my $self = $class->new(@_);
+ $self->abs;
+}
+
+sub _init
+{
+ my $class = shift;
+ my($str, $scheme) = @_;
+ bless [URI->new($str, $scheme), undef], $class;
+}
+
+sub eq
+{
+ my($self, $other) = @_;
+ $other = $other->[0] if UNIVERSAL::isa($other, __PACKAGE__);
+ $self->[0]->eq($other);
+}
+
+sub AUTOLOAD
+{
+ my $self = shift;
+ my $method = substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);
+ return if $method eq "DESTROY";
+ $self->[0]->$method(@_);
+}
+
+sub can { # override UNIVERSAL::can
+ my $self = shift;
+ $self->SUPER::can(@_) || (
+ ref($self)
+ ? $self->[0]->can(@_)
+ : undef
+ )
+}
+
+sub base {
+ my $self = shift;
+ my $base = $self->[1];
+
+ if (@_) { # set
+ my $new_base = shift;
+ # ensure absoluteness
+ $new_base = $new_base->abs if ref($new_base) && $new_base->isa(__PACKAGE__);
+ $self->[1] = $new_base;
+ }
+ return unless defined wantarray;
+
+ # The base attribute supports 'lazy' conversion from URL strings
+ # to URL objects. Strings may be stored but when a string is
+ # fetched it will automatically be converted to a URL object.
+ # The main benefit is to make it much cheaper to say:
+ # URI::WithBase->new($random_url_string, 'http:')
+ if (defined($base) && !ref($base)) {
+ $base = ref($self)->new($base);
+ $self->[1] = $base unless @_;
+ }
+ $base;
+}
+
+sub clone
+{
+ my $self = shift;
+ my $base = $self->[1];
+ $base = $base->clone if ref($base);
+ bless [$self->[0]->clone, $base], ref($self);
+}
+
+sub abs
+{
+ my $self = shift;
+ my $base = shift || $self->base || return $self->clone;
+ $base = $base->as_string if ref($base);
+ bless [$self->[0]->abs($base, @_), $base], ref($self);
+}
+
+sub rel
+{
+ my $self = shift;
+ my $base = shift || $self->base || return $self->clone;
+ $base = $base->as_string if ref($base);
+ bless [$self->[0]->rel($base, @_), $base], ref($self);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+URI::WithBase - URIs which remember their base
+
+=head1 SYNOPSIS
+
+ $u1 = URI::WithBase->new($str, $base);
+ $u2 = $u1->abs;
+
+ $base = $u1->base;
+ $u1->base( $new_base )
+
+=head1 DESCRIPTION
+
+This module provides the C<URI::WithBase> class. Objects of this class
+are like C<URI> objects, but can keep their base too. The base
+represents the context where this URI was found and can be used to
+absolutize or relativize the URI. All the methods described in L<URI>
+are supported for C<URI::WithBase> objects.
+
+The methods provided in addition to or modified from those of C<URI> are:
+
+=over 4
+
+=item $uri = URI::WithBase->new($str, [$base])
+
+The constructor takes an optional base URI as the second argument.
+If provided, this argument initializes the base attribute.
+
+=item $uri->base( [$new_base] )
+
+Can be used to get or set the value of the base attribute.
+The return value, which is the old value, is a URI object or C<undef>.
+
+=item $uri->abs( [$base_uri] )
+
+The $base_uri argument is now made optional as the object carries its
+base with it. A new object is returned even if $uri is already
+absolute (while plain URI objects simply return themselves in
+that case).
+
+=item $uri->rel( [$base_uri] )
+
+The $base_uri argument is now made optional as the object carries its
+base with it. A new object is always returned.
+
+=back
+
+
+=head1 SEE ALSO
+
+L<URI>
+
+=head1 COPYRIGHT
+
+Copyright 1998-2002 Gisle Aas.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/_foreign.pm b/Master/tlpkg/tlperl.straw/lib/URI/_foreign.pm
new file mode 100755
index 00000000000..075f0fd3417
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/_foreign.pm
@@ -0,0 +1,6 @@
+package URI::_foreign;
+
+require URI::_generic;
+@ISA=qw(URI::_generic);
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/_generic.pm b/Master/tlpkg/tlperl.straw/lib/URI/_generic.pm
new file mode 100755
index 00000000000..2a02332853c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/_generic.pm
@@ -0,0 +1,249 @@
+package URI::_generic;
+require URI;
+require URI::_query;
+@ISA=qw(URI URI::_query);
+
+use strict;
+use URI::Escape qw(uri_unescape);
+use Carp ();
+
+my $ACHAR = $URI::uric; $ACHAR =~ s,\\[/?],,g;
+my $PCHAR = $URI::uric; $PCHAR =~ s,\\[?],,g;
+
+sub _no_scheme_ok { 1 }
+
+sub authority
+{
+ my $self = shift;
+ $$self =~ m,^((?:$URI::scheme_re:)?)(?://([^/?\#]*))?(.*)$,os or die;
+
+ if (@_) {
+ my $auth = shift;
+ $$self = $1;
+ my $rest = $3;
+ if (defined $auth) {
+ $auth =~ s/([^$ACHAR])/ URI::Escape::escape_char($1)/ego;
+ $$self .= "//$auth";
+ }
+ _check_path($rest, $$self);
+ $$self .= $rest;
+ }
+ $2;
+}
+
+sub path
+{
+ my $self = shift;
+ $$self =~ m,^((?:[^:/?\#]+:)?(?://[^/?\#]*)?)([^?\#]*)(.*)$,s or die;
+
+ if (@_) {
+ $$self = $1;
+ my $rest = $3;
+ my $new_path = shift;
+ $new_path = "" unless defined $new_path;
+ $new_path =~ s/([^$PCHAR])/ URI::Escape::escape_char($1)/ego;
+ _check_path($new_path, $$self);
+ $$self .= $new_path . $rest;
+ }
+ $2;
+}
+
+sub path_query
+{
+ my $self = shift;
+ $$self =~ m,^((?:[^:/?\#]+:)?(?://[^/?\#]*)?)([^\#]*)(.*)$,s or die;
+
+ if (@_) {
+ $$self = $1;
+ my $rest = $3;
+ my $new_path = shift;
+ $new_path = "" unless defined $new_path;
+ $new_path =~ s/([^$URI::uric])/ URI::Escape::escape_char($1)/ego;
+ _check_path($new_path, $$self);
+ $$self .= $new_path . $rest;
+ }
+ $2;
+}
+
+sub _check_path
+{
+ my($path, $pre) = @_;
+ my $prefix;
+ if ($pre =~ m,/,) { # authority present
+ $prefix = "/" if length($path) && $path !~ m,^[/?\#],;
+ }
+ else {
+ if ($path =~ m,^//,) {
+ Carp::carp("Path starting with double slash is confusing")
+ if $^W;
+ }
+ elsif (!length($pre) && $path =~ m,^[^:/?\#]+:,) {
+ Carp::carp("Path might look like scheme, './' prepended")
+ if $^W;
+ $prefix = "./";
+ }
+ }
+ substr($_[0], 0, 0) = $prefix if defined $prefix;
+}
+
+sub path_segments
+{
+ my $self = shift;
+ my $path = $self->path;
+ if (@_) {
+ my @arg = @_; # make a copy
+ for (@arg) {
+ if (ref($_)) {
+ my @seg = @$_;
+ $seg[0] =~ s/%/%25/g;
+ for (@seg) { s/;/%3B/g; }
+ $_ = join(";", @seg);
+ }
+ else {
+ s/%/%25/g; s/;/%3B/g;
+ }
+ s,/,%2F,g;
+ }
+ $self->path(join("/", @arg));
+ }
+ return $path unless wantarray;
+ map {/;/ ? $self->_split_segment($_)
+ : uri_unescape($_) }
+ split('/', $path, -1);
+}
+
+
+sub _split_segment
+{
+ my $self = shift;
+ require URI::_segment;
+ URI::_segment->new(@_);
+}
+
+
+sub abs
+{
+ my $self = shift;
+ my $base = shift || Carp::croak("Missing base argument");
+
+ if (my $scheme = $self->scheme) {
+ return $self unless $URI::ABS_ALLOW_RELATIVE_SCHEME;
+ $base = URI->new($base) unless ref $base;
+ return $self unless $scheme eq $base->scheme;
+ }
+
+ $base = URI->new($base) unless ref $base;
+ my $abs = $self->clone;
+ $abs->scheme($base->scheme);
+ return $abs if $$self =~ m,^(?:$URI::scheme_re:)?//,o;
+ $abs->authority($base->authority);
+
+ my $path = $self->path;
+ return $abs if $path =~ m,^/,;
+
+ if (!length($path)) {
+ my $abs = $base->clone;
+ my $query = $self->query;
+ $abs->query($query) if defined $query;
+ $abs->fragment($self->fragment);
+ return $abs;
+ }
+
+ my $p = $base->path;
+ $p =~ s,[^/]+$,,;
+ $p .= $path;
+ my @p = split('/', $p, -1);
+ shift(@p) if @p && !length($p[0]);
+ my $i = 1;
+ while ($i < @p) {
+ #print "$i ", join("/", @p), " ($p[$i])\n";
+ if ($p[$i-1] eq ".") {
+ splice(@p, $i-1, 1);
+ $i-- if $i > 1;
+ }
+ elsif ($p[$i] eq ".." && $p[$i-1] ne "..") {
+ splice(@p, $i-1, 2);
+ if ($i > 1) {
+ $i--;
+ push(@p, "") if $i == @p;
+ }
+ }
+ else {
+ $i++;
+ }
+ }
+ $p[-1] = "" if @p && $p[-1] eq "."; # trailing "/."
+ if ($URI::ABS_REMOTE_LEADING_DOTS) {
+ shift @p while @p && $p[0] =~ /^\.\.?$/;
+ }
+ $abs->path("/" . join("/", @p));
+ $abs;
+}
+
+# The oposite of $url->abs. Return a URI which is as relative as possible
+sub rel {
+ my $self = shift;
+ my $base = shift || Carp::croak("Missing base argument");
+ my $rel = $self->clone;
+ $base = URI->new($base) unless ref $base;
+
+ #my($scheme, $auth, $path) = @{$rel}{qw(scheme authority path)};
+ my $scheme = $rel->scheme;
+ my $auth = $rel->canonical->authority;
+ my $path = $rel->path;
+
+ if (!defined($scheme) && !defined($auth)) {
+ # it is already relative
+ return $rel;
+ }
+
+ #my($bscheme, $bauth, $bpath) = @{$base}{qw(scheme authority path)};
+ my $bscheme = $base->scheme;
+ my $bauth = $base->canonical->authority;
+ my $bpath = $base->path;
+
+ for ($bscheme, $bauth, $auth) {
+ $_ = '' unless defined
+ }
+
+ unless ($scheme eq $bscheme && $auth eq $bauth) {
+ # different location, can't make it relative
+ return $rel;
+ }
+
+ for ($path, $bpath) { $_ = "/$_" unless m,^/,; }
+
+ # Make it relative by eliminating scheme and authority
+ $rel->scheme(undef);
+ $rel->authority(undef);
+
+ # This loop is based on code from Nicolai Langfeldt <janl@ifi.uio.no>.
+ # First we calculate common initial path components length ($li).
+ my $li = 1;
+ while (1) {
+ my $i = index($path, '/', $li);
+ last if $i < 0 ||
+ $i != index($bpath, '/', $li) ||
+ substr($path,$li,$i-$li) ne substr($bpath,$li,$i-$li);
+ $li=$i+1;
+ }
+ # then we nuke it from both paths
+ substr($path, 0,$li) = '';
+ substr($bpath,0,$li) = '';
+
+ if ($path eq $bpath &&
+ defined($rel->fragment) &&
+ !defined($rel->query)) {
+ $rel->path("");
+ }
+ else {
+ # Add one "../" for each path component left in the base path
+ $path = ('../' x $bpath =~ tr|/|/|) . $path;
+ $path = "./" if $path eq "";
+ $rel->path($path);
+ }
+
+ $rel;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/_idna.pm b/Master/tlpkg/tlperl.straw/lib/URI/_idna.pm
new file mode 100755
index 00000000000..39366e5b831
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/_idna.pm
@@ -0,0 +1,78 @@
+package URI::_idna;
+
+# This module implements the RFCs 3490 (IDNA) and 3491 (Nameprep)
+# based on Python-2.6.4/Lib/encodings/idna.py
+
+use strict;
+use URI::_punycode qw(encode_punycode decode_punycode);
+use Carp qw(croak);
+
+my $ASCII = qr/^[\x00-\x7F]*\z/;
+
+sub encode {
+ my $idomain = shift;
+ my @labels = split(/\./, $idomain, -1);
+ my @last_empty;
+ push(@last_empty, pop @labels) if @labels > 1 && $labels[-1] eq "";
+ for (@labels) {
+ $_ = ToASCII($_);
+ }
+ return join(".", @labels, @last_empty);
+}
+
+sub decode {
+ my $domain = shift;
+ return join(".", map ToUnicode($_), split(/\./, $domain, -1))
+}
+
+sub nameprep { # XXX real implementation missing
+ my $label = shift;
+ $label = lc($label);
+ return $label;
+}
+
+sub check_size {
+ my $label = shift;
+ croak "Label empty" if $label eq "";
+ croak "Label too long" if length($label) > 63;
+ return $label;
+}
+
+sub ToASCII {
+ my $label = shift;
+ return check_size($label) if $label =~ $ASCII;
+
+ # Step 2: nameprep
+ $label = nameprep($label);
+ # Step 3: UseSTD3ASCIIRules is false
+ # Step 4: try ASCII again
+ return check_size($label) if $label =~ $ASCII;
+
+ # Step 5: Check ACE prefix
+ if ($label =~ /^xn--/) {
+ croak "Label starts with ACE prefix";
+ }
+
+ # Step 6: Encode with PUNYCODE
+ $label = encode_punycode($label);
+
+ # Step 7: Prepend ACE prefix
+ $label = "xn--$label";
+
+ # Step 8: Check size
+ return check_size($label);
+}
+
+sub ToUnicode {
+ my $label = shift;
+ $label = nameprep($label) unless $label =~ $ASCII;
+ return $label unless $label =~ /^xn--/;
+ my $result = decode_punycode(substr($label, 4));
+ my $label2 = ToASCII($result);
+ if (lc($label) ne $label2) {
+ croak "IDNA does not round-trip: '\L$label\E' vs '$label2'";
+ }
+ return $result;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/_ldap.pm b/Master/tlpkg/tlperl.straw/lib/URI/_ldap.pm
new file mode 100755
index 00000000000..608dbd339a3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/_ldap.pm
@@ -0,0 +1,140 @@
+# Copyright (c) 1998 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package URI::_ldap;
+
+use strict;
+
+use vars qw($VERSION);
+$VERSION = "1.10";
+
+use URI::Escape qw(uri_unescape);
+
+sub _ldap_elem {
+ my $self = shift;
+ my $elem = shift;
+ my $query = $self->query;
+ my @bits = (split(/\?/,defined($query) ? $query : ""),("")x4);
+ my $old = $bits[$elem];
+
+ if (@_) {
+ my $new = shift;
+ $new =~ s/\?/%3F/g;
+ $bits[$elem] = $new;
+ $query = join("?",@bits);
+ $query =~ s/\?+$//;
+ $query = undef unless length($query);
+ $self->query($query);
+ }
+
+ $old;
+}
+
+sub dn {
+ my $old = shift->path(@_);
+ $old =~ s:^/::;
+ uri_unescape($old);
+}
+
+sub attributes {
+ my $self = shift;
+ my $old = _ldap_elem($self,0, @_ ? join(",", map { my $tmp = $_; $tmp =~ s/,/%2C/g; $tmp } @_) : ());
+ return $old unless wantarray;
+ map { uri_unescape($_) } split(/,/,$old);
+}
+
+sub _scope {
+ my $self = shift;
+ my $old = _ldap_elem($self,1, @_);
+ return unless defined wantarray && defined $old;
+ uri_unescape($old);
+}
+
+sub scope {
+ my $old = &_scope;
+ $old = "base" unless length $old;
+ $old;
+}
+
+sub _filter {
+ my $self = shift;
+ my $old = _ldap_elem($self,2, @_);
+ return unless defined wantarray && defined $old;
+ uri_unescape($old); # || "(objectClass=*)";
+}
+
+sub filter {
+ my $old = &_filter;
+ $old = "(objectClass=*)" unless length $old;
+ $old;
+}
+
+sub extensions {
+ my $self = shift;
+ my @ext;
+ while (@_) {
+ my $key = shift;
+ my $value = shift;
+ push(@ext, join("=", map { $_="" unless defined; s/,/%2C/g; $_ } $key, $value));
+ }
+ @ext = join(",", @ext) if @ext;
+ my $old = _ldap_elem($self,3, @ext);
+ return $old unless wantarray;
+ map { uri_unescape($_) } map { /^([^=]+)=(.*)$/ } split(/,/,$old);
+}
+
+sub canonical
+{
+ my $self = shift;
+ my $other = $self->_nonldap_canonical;
+
+ # The stuff below is not as efficient as one might hope...
+
+ $other = $other->clone if $other == $self;
+
+ $other->dn(_normalize_dn($other->dn));
+
+ # Should really know about mixed case "postalAddress", etc...
+ $other->attributes(map lc, $other->attributes);
+
+ # Lowecase scope, remove default
+ my $old_scope = $other->scope;
+ my $new_scope = lc($old_scope);
+ $new_scope = "" if $new_scope eq "base";
+ $other->scope($new_scope) if $new_scope ne $old_scope;
+
+ # Remove filter if default
+ my $old_filter = $other->filter;
+ $other->filter("") if lc($old_filter) eq "(objectclass=*)" ||
+ lc($old_filter) eq "objectclass=*";
+
+ # Lowercase extensions types and deal with known extension values
+ my @ext = $other->extensions;
+ for (my $i = 0; $i < @ext; $i += 2) {
+ my $etype = $ext[$i] = lc($ext[$i]);
+ if ($etype =~ /^!?bindname$/) {
+ $ext[$i+1] = _normalize_dn($ext[$i+1]);
+ }
+ }
+ $other->extensions(@ext) if @ext;
+
+ $other;
+}
+
+sub _normalize_dn # RFC 2253
+{
+ my $dn = shift;
+
+ return $dn;
+ # The code below will fail if the "+" or "," is embedding in a quoted
+ # string or simply escaped...
+
+ my @dn = split(/([+,])/, $dn);
+ for (@dn) {
+ s/^([a-zA-Z]+=)/lc($1)/e;
+ }
+ join("", @dn);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/_login.pm b/Master/tlpkg/tlperl.straw/lib/URI/_login.pm
new file mode 100755
index 00000000000..4583f20a9a6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/_login.pm
@@ -0,0 +1,10 @@
+package URI::_login;
+
+require URI::_server;
+require URI::_userpass;
+@ISA = qw(URI::_server URI::_userpass);
+
+# Generic terminal logins. This is used as a base class for 'telnet',
+# 'tn3270', and 'rlogin' URL schemes.
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/_punycode.pm b/Master/tlpkg/tlperl.straw/lib/URI/_punycode.pm
new file mode 100755
index 00000000000..e5600327a06
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/_punycode.pm
@@ -0,0 +1,203 @@
+package URI::_punycode;
+
+use strict;
+our $VERSION = 0.02;
+
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT = qw(encode_punycode decode_punycode);
+
+use integer;
+
+our $DEBUG = 0;
+
+use constant BASE => 36;
+use constant TMIN => 1;
+use constant TMAX => 26;
+use constant SKEW => 38;
+use constant DAMP => 700;
+use constant INITIAL_BIAS => 72;
+use constant INITIAL_N => 128;
+
+my $Delimiter = chr 0x2D;
+my $BasicRE = qr/[\x00-\x7f]/;
+
+sub _croak { require Carp; Carp::croak(@_); }
+
+sub digit_value {
+ my $code = shift;
+ return ord($code) - ord("A") if $code =~ /[A-Z]/;
+ return ord($code) - ord("a") if $code =~ /[a-z]/;
+ return ord($code) - ord("0") + 26 if $code =~ /[0-9]/;
+ return;
+}
+
+sub code_point {
+ my $digit = shift;
+ return $digit + ord('a') if 0 <= $digit && $digit <= 25;
+ return $digit + ord('0') - 26 if 26 <= $digit && $digit <= 36;
+ die 'NOT COME HERE';
+}
+
+sub adapt {
+ my($delta, $numpoints, $firsttime) = @_;
+ $delta = $firsttime ? $delta / DAMP : $delta / 2;
+ $delta += $delta / $numpoints;
+ my $k = 0;
+ while ($delta > ((BASE - TMIN) * TMAX) / 2) {
+ $delta /= BASE - TMIN;
+ $k += BASE;
+ }
+ return $k + (((BASE - TMIN + 1) * $delta) / ($delta + SKEW));
+}
+
+sub decode_punycode {
+ my $code = shift;
+
+ my $n = INITIAL_N;
+ my $i = 0;
+ my $bias = INITIAL_BIAS;
+ my @output;
+
+ if ($code =~ s/(.*)$Delimiter//o) {
+ push @output, map ord, split //, $1;
+ return _croak('non-basic code point') unless $1 =~ /^$BasicRE*$/o;
+ }
+
+ while ($code) {
+ my $oldi = $i;
+ my $w = 1;
+ LOOP:
+ for (my $k = BASE; 1; $k += BASE) {
+ my $cp = substr($code, 0, 1, '');
+ my $digit = digit_value($cp);
+ defined $digit or return _croak("invalid punycode input");
+ $i += $digit * $w;
+ my $t = ($k <= $bias) ? TMIN
+ : ($k >= $bias + TMAX) ? TMAX : $k - $bias;
+ last LOOP if $digit < $t;
+ $w *= (BASE - $t);
+ }
+ $bias = adapt($i - $oldi, @output + 1, $oldi == 0);
+ warn "bias becomes $bias" if $DEBUG;
+ $n += $i / (@output + 1);
+ $i = $i % (@output + 1);
+ splice(@output, $i, 0, $n);
+ warn join " ", map sprintf('%04x', $_), @output if $DEBUG;
+ $i++;
+ }
+ return join '', map chr, @output;
+}
+
+sub encode_punycode {
+ my $input = shift;
+ # my @input = split //, $input; # doesn't work in 5.6.x!
+ my @input = map substr($input, $_, 1), 0..length($input)-1;
+
+ my $n = INITIAL_N;
+ my $delta = 0;
+ my $bias = INITIAL_BIAS;
+
+ my @output;
+ my @basic = grep /$BasicRE/, @input;
+ my $h = my $b = @basic;
+ push @output, @basic;
+ push @output, $Delimiter if $b && $h < @input;
+ warn "basic codepoints: (@output)" if $DEBUG;
+
+ while ($h < @input) {
+ my $m = min(grep { $_ >= $n } map ord, @input);
+ warn sprintf "next code point to insert is %04x", $m if $DEBUG;
+ $delta += ($m - $n) * ($h + 1);
+ $n = $m;
+ for my $i (@input) {
+ my $c = ord($i);
+ $delta++ if $c < $n;
+ if ($c == $n) {
+ my $q = $delta;
+ LOOP:
+ for (my $k = BASE; 1; $k += BASE) {
+ my $t = ($k <= $bias) ? TMIN :
+ ($k >= $bias + TMAX) ? TMAX : $k - $bias;
+ last LOOP if $q < $t;
+ my $cp = code_point($t + (($q - $t) % (BASE - $t)));
+ push @output, chr($cp);
+ $q = ($q - $t) / (BASE - $t);
+ }
+ push @output, chr(code_point($q));
+ $bias = adapt($delta, $h + 1, $h == $b);
+ warn "bias becomes $bias" if $DEBUG;
+ $delta = 0;
+ $h++;
+ }
+ }
+ $delta++;
+ $n++;
+ }
+ return join '', @output;
+}
+
+sub min {
+ my $min = shift;
+ for (@_) { $min = $_ if $_ <= $min }
+ return $min;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+URI::_punycode - encodes Unicode string in Punycode
+
+=head1 SYNOPSIS
+
+ use URI::_punycode;
+ $punycode = encode_punycode($unicode);
+ $unicode = decode_punycode($punycode);
+
+=head1 DESCRIPTION
+
+URI::_punycode is a module to encode / decode Unicode strings into
+Punycode, an efficient encoding of Unicode for use with IDNA.
+
+This module requires Perl 5.6.0 or over to handle UTF8 flagged Unicode
+strings.
+
+=head1 FUNCTIONS
+
+This module exports following functions by default.
+
+=over 4
+
+=item encode_punycode
+
+ $punycode = encode_punycode($unicode);
+
+takes Unicode string (UTF8-flagged variable) and returns Punycode
+encoding for it.
+
+=item decode_punycode
+
+ $unicode = decode_punycode($punycode)
+
+takes Punycode encoding and returns original Unicode string.
+
+=back
+
+These functions throws exceptionsn on failure. You can catch 'em via
+C<eval>.
+
+=head1 AUTHOR
+
+Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt> is the author of
+IDNA::Punycode v0.02 which was the basis for this module.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<IDNA::Punycode>, RFC 3492
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/_query.pm b/Master/tlpkg/tlperl.straw/lib/URI/_query.pm
new file mode 100755
index 00000000000..0c6aa285e42
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/_query.pm
@@ -0,0 +1,92 @@
+package URI::_query;
+
+use strict;
+use URI ();
+use URI::Escape qw(uri_unescape);
+
+sub query
+{
+ my $self = shift;
+ $$self =~ m,^([^?\#]*)(?:\?([^\#]*))?(.*)$,s or die;
+
+ if (@_) {
+ my $q = shift;
+ $$self = $1;
+ if (defined $q) {
+ $q =~ s/([^$URI::uric])/ URI::Escape::escape_char($1)/ego;
+ $$self .= "?$q";
+ }
+ $$self .= $3;
+ }
+ $2;
+}
+
+# Handle ...?foo=bar&bar=foo type of query
+sub query_form {
+ my $self = shift;
+ my $old = $self->query;
+ if (@_) {
+ # Try to set query string
+ my $delim;
+ my $r = $_[0];
+ if (ref($r) eq "ARRAY") {
+ $delim = $_[1];
+ @_ = @$r;
+ }
+ elsif (ref($r) eq "HASH") {
+ $delim = $_[1];
+ @_ = %$r;
+ }
+ $delim = pop if @_ % 2;
+
+ my @query;
+ while (my($key,$vals) = splice(@_, 0, 2)) {
+ $key = '' unless defined $key;
+ $key =~ s/([;\/?:@&=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg;
+ $key =~ s/ /+/g;
+ $vals = [ref($vals) eq "ARRAY" ? @$vals : $vals];
+ for my $val (@$vals) {
+ $val = '' unless defined $val;
+ $val =~ s/([;\/?:@&=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg;
+ $val =~ s/ /+/g;
+ push(@query, "$key=$val");
+ }
+ }
+ if (@query) {
+ unless ($delim) {
+ $delim = $1 if $old && $old =~ /([&;])/;
+ $delim ||= $URI::DEFAULT_QUERY_FORM_DELIMITER || "&";
+ }
+ $self->query(join($delim, @query));
+ }
+ else {
+ $self->query(undef);
+ }
+ }
+ return if !defined($old) || !length($old) || !defined(wantarray);
+ return unless $old =~ /=/; # not a form
+ map { s/\+/ /g; uri_unescape($_) }
+ map { /=/ ? split(/=/, $_, 2) : ($_ => '')} split(/[&;]/, $old);
+}
+
+# Handle ...?dog+bones type of query
+sub query_keywords
+{
+ my $self = shift;
+ my $old = $self->query;
+ if (@_) {
+ # Try to set query string
+ my @copy = @_;
+ @copy = @{$copy[0]} if @copy == 1 && ref($copy[0]) eq "ARRAY";
+ for (@copy) { s/([;\/?:@&=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg; }
+ $self->query(@copy ? join('+', @copy) : undef);
+ }
+ return if !defined($old) || !defined(wantarray);
+ return if $old =~ /=/; # not keywords, but a form
+ map { uri_unescape($_) } split(/\+/, $old, -1);
+}
+
+# Some URI::URL compatibility stuff
+*equery = \&query;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/_segment.pm b/Master/tlpkg/tlperl.straw/lib/URI/_segment.pm
new file mode 100755
index 00000000000..c91b69608e3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/_segment.pm
@@ -0,0 +1,20 @@
+package URI::_segment;
+
+# Represents a generic path_segment so that it can be treated as
+# a string too.
+
+use strict;
+use URI::Escape qw(uri_unescape);
+
+use overload '""' => sub { $_[0]->[0] },
+ fallback => 1;
+
+sub new
+{
+ my $class = shift;
+ my @segment = split(';', shift, -1);
+ $segment[0] = uri_unescape($segment[0]);
+ bless \@segment, $class;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/_server.pm b/Master/tlpkg/tlperl.straw/lib/URI/_server.pm
new file mode 100755
index 00000000000..f72ec22657b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/_server.pm
@@ -0,0 +1,162 @@
+package URI::_server;
+require URI::_generic;
+@ISA=qw(URI::_generic);
+
+use strict;
+use URI::Escape qw(uri_unescape);
+
+sub _uric_escape {
+ my($class, $str) = @_;
+ if ($str =~ m,^((?:$URI::scheme_re:)?)//([^/?\#]*)(.*)$,os) {
+ my($scheme, $host, $rest) = ($1, $2, $3);
+ my $ui = $host =~ s/(.*@)// ? $1 : "";
+ my $port = $host =~ s/(:\d+)\z// ? $1 : "";
+ if (_host_escape($host)) {
+ $str = "$scheme//$ui$host$port$rest";
+ }
+ }
+ return $class->SUPER::_uric_escape($str);
+}
+
+sub _host_escape {
+ return unless $_[0] =~ /[^URI::uric]/;
+ eval {
+ require URI::_idna;
+ $_[0] = URI::_idna::encode($_[0]);
+ };
+ return 0 if $@;
+ return 1;
+}
+
+sub as_iri {
+ my $self = shift;
+ my $str = $self->SUPER::as_iri;
+ if ($str =~ /\bxn--/) {
+ if ($str =~ m,^((?:$URI::scheme_re:)?)//([^/?\#]*)(.*)$,os) {
+ my($scheme, $host, $rest) = ($1, $2, $3);
+ my $ui = $host =~ s/(.*@)// ? $1 : "";
+ my $port = $host =~ s/(:\d+)\z// ? $1 : "";
+ require URI::_idna;
+ $host = URI::_idna::decode($host);
+ $str = "$scheme//$ui$host$port$rest";
+ }
+ }
+ return $str;
+}
+
+sub userinfo
+{
+ my $self = shift;
+ my $old = $self->authority;
+
+ if (@_) {
+ my $new = $old;
+ $new = "" unless defined $new;
+ $new =~ s/.*@//; # remove old stuff
+ my $ui = shift;
+ if (defined $ui) {
+ $ui =~ s/@/%40/g; # protect @
+ $new = "$ui\@$new";
+ }
+ $self->authority($new);
+ }
+ return undef if !defined($old) || $old !~ /(.*)@/;
+ return $1;
+}
+
+sub host
+{
+ my $self = shift;
+ my $old = $self->authority;
+ if (@_) {
+ my $tmp = $old;
+ $tmp = "" unless defined $tmp;
+ my $ui = ($tmp =~ /(.*@)/) ? $1 : "";
+ my $port = ($tmp =~ /(:\d+)$/) ? $1 : "";
+ my $new = shift;
+ $new = "" unless defined $new;
+ if (length $new) {
+ $new =~ s/[@]/%40/g; # protect @
+ if ($new =~ /^[^:]*:\d*\z/ || $new =~ /]:\d*\z/) {
+ $new =~ s/(:\d*)\z// || die "Assert";
+ $port = $1;
+ }
+ $new = "[$new]" if $new =~ /:/ && $new !~ /^\[/; # IPv6 address
+ _host_escape($new);
+ }
+ $self->authority("$ui$new$port");
+ }
+ return undef unless defined $old;
+ $old =~ s/.*@//;
+ $old =~ s/:\d+$//; # remove the port
+ $old =~ s{^\[(.*)\]$}{$1}; # remove brackets around IPv6 (RFC 3986 3.2.2)
+ return uri_unescape($old);
+}
+
+sub ihost
+{
+ my $self = shift;
+ my $old = $self->host(@_);
+ if ($old =~ /(^|\.)xn--/) {
+ require URI::_idna;
+ $old = URI::_idna::decode($old);
+ }
+ return $old;
+}
+
+sub _port
+{
+ my $self = shift;
+ my $old = $self->authority;
+ if (@_) {
+ my $new = $old;
+ $new =~ s/:\d*$//;
+ my $port = shift;
+ $new .= ":$port" if defined $port;
+ $self->authority($new);
+ }
+ return $1 if defined($old) && $old =~ /:(\d*)$/;
+ return;
+}
+
+sub port
+{
+ my $self = shift;
+ my $port = $self->_port(@_);
+ $port = $self->default_port if !defined($port) || $port eq "";
+ $port;
+}
+
+sub host_port
+{
+ my $self = shift;
+ my $old = $self->authority;
+ $self->host(shift) if @_;
+ return undef unless defined $old;
+ $old =~ s/.*@//; # zap userinfo
+ $old =~ s/:$//; # empty port should be treated the same a no port
+ $old .= ":" . $self->port unless $old =~ /:\d+$/;
+ $old;
+}
+
+
+sub default_port { undef }
+
+sub canonical
+{
+ my $self = shift;
+ my $other = $self->SUPER::canonical;
+ my $host = $other->host || "";
+ my $port = $other->_port;
+ my $uc_host = $host =~ /[A-Z]/;
+ my $def_port = defined($port) && ($port eq "" ||
+ $port == $self->default_port);
+ if ($uc_host || $def_port) {
+ $other = $other->clone if $other == $self;
+ $other->host(lc $host) if $uc_host;
+ $other->port(undef) if $def_port;
+ }
+ $other;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/_userpass.pm b/Master/tlpkg/tlperl.straw/lib/URI/_userpass.pm
new file mode 100755
index 00000000000..a0361ae0dd7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/_userpass.pm
@@ -0,0 +1,51 @@
+package URI::_userpass;
+
+use strict;
+use URI::Escape qw(uri_unescape);
+
+sub user
+{
+ my $self = shift;
+ my $info = $self->userinfo;
+ if (@_) {
+ my $new = shift;
+ my $pass = defined($info) ? $info : "";
+ $pass =~ s/^[^:]*//;
+
+ if (!defined($new) && !length($pass)) {
+ $self->userinfo(undef);
+ } else {
+ $new = "" unless defined($new);
+ $new =~ s/%/%25/g;
+ $new =~ s/:/%3A/g;
+ $self->userinfo("$new$pass");
+ }
+ }
+ return unless defined $info;
+ $info =~ s/:.*//;
+ uri_unescape($info);
+}
+
+sub password
+{
+ my $self = shift;
+ my $info = $self->userinfo;
+ if (@_) {
+ my $new = shift;
+ my $user = defined($info) ? $info : "";
+ $user =~ s/:.*//;
+
+ if (!defined($new) && !length($user)) {
+ $self->userinfo(undef);
+ } else {
+ $new = "" unless defined($new);
+ $new =~ s/%/%25/g;
+ $self->userinfo("$user:$new");
+ }
+ }
+ return unless defined $info;
+ return unless $info =~ s/^[^:]*://;
+ uri_unescape($info);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/data.pm b/Master/tlpkg/tlperl.straw/lib/URI/data.pm
new file mode 100755
index 00000000000..dccd8181289
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/data.pm
@@ -0,0 +1,140 @@
+package URI::data; # RFC 2397
+
+require URI;
+@ISA=qw(URI);
+
+use strict;
+
+use MIME::Base64 qw(encode_base64 decode_base64);
+use URI::Escape qw(uri_unescape);
+
+sub media_type
+{
+ my $self = shift;
+ my $opaque = $self->opaque;
+ $opaque =~ /^([^,]*),?/ or die;
+ my $old = $1;
+ my $base64;
+ $base64 = $1 if $old =~ s/(;base64)$//i;
+ if (@_) {
+ my $new = shift;
+ $new = "" unless defined $new;
+ $new =~ s/%/%25/g;
+ $new =~ s/,/%2C/g;
+ $base64 = "" unless defined $base64;
+ $opaque =~ s/^[^,]*,?/$new$base64,/;
+ $self->opaque($opaque);
+ }
+ return uri_unescape($old) if $old; # media_type can't really be "0"
+ "text/plain;charset=US-ASCII"; # default type
+}
+
+sub data
+{
+ my $self = shift;
+ my($enc, $data) = split(",", $self->opaque, 2);
+ unless (defined $data) {
+ $data = "";
+ $enc = "" unless defined $enc;
+ }
+ my $base64 = ($enc =~ /;base64$/i);
+ if (@_) {
+ $enc =~ s/;base64$//i if $base64;
+ my $new = shift;
+ $new = "" unless defined $new;
+ my $uric_count = _uric_count($new);
+ my $urienc_len = $uric_count + (length($new) - $uric_count) * 3;
+ my $base64_len = int((length($new)+2) / 3) * 4;
+ $base64_len += 7; # because of ";base64" marker
+ if ($base64_len < $urienc_len || $_[0]) {
+ $enc .= ";base64";
+ $new = encode_base64($new, "");
+ } else {
+ $new =~ s/%/%25/g;
+ }
+ $self->opaque("$enc,$new");
+ }
+ return unless defined wantarray;
+ $data = uri_unescape($data);
+ return $base64 ? decode_base64($data) : $data;
+}
+
+# I could not find a better way to interpolate the tr/// chars from
+# a variable.
+my $ENC = $URI::uric;
+$ENC =~ s/%//;
+
+eval <<EOT; die $@ if $@;
+sub _uric_count
+{
+ \$_[0] =~ tr/$ENC//;
+}
+EOT
+
+1;
+
+__END__
+
+=head1 NAME
+
+URI::data - URI that contains immediate data
+
+=head1 SYNOPSIS
+
+ use URI;
+
+ $u = URI->new("data:");
+ $u->media_type("image/gif");
+ $u->data(scalar(`cat camel.gif`));
+ print "$u\n";
+ open(XV, "|xv -") and print XV $u->data;
+
+=head1 DESCRIPTION
+
+The C<URI::data> class supports C<URI> objects belonging to the I<data>
+URI scheme. The I<data> URI scheme is specified in RFC 2397. It
+allows inclusion of small data items as "immediate" data, as if it had
+been included externally. Examples:
+
+ data:,Perl%20is%20good
+
+ data:image/gif;base64,R0lGODdhIAAgAIAAAAAAAPj8+CwAAAAAI
+ AAgAAAClYyPqcu9AJyCjtIKc5w5xP14xgeO2tlY3nWcajmZZdeJcG
+ Kxrmimms1KMTa1Wg8UROx4MNUq1HrycMjHT9b6xKxaFLM6VRKzI+p
+ KS9XtXpcbdun6uWVxJXA8pNPkdkkxhxc21LZHFOgD2KMoQXa2KMWI
+ JtnE2KizVUkYJVZZ1nczBxXlFopZBtoJ2diXGdNUymmJdFMAADs=
+
+
+
+C<URI> objects belonging to the data scheme support the common methods
+(described in L<URI>) and the following two scheme-specific methods:
+
+=over 4
+
+=item $uri->media_type( [$new_media_type] )
+
+Can be used to get or set the media type specified in the
+URI. If no media type is specified, then the default
+C<"text/plain;charset=US-ASCII"> is returned.
+
+=item $uri->data( [$new_data] )
+
+Can be used to get or set the data contained in the URI.
+The data is passed unescaped (in binary form). The decision about
+whether to base64 encode the data in the URI is taken automatically,
+based on the encoding that produces the shorter URI string.
+
+=back
+
+=head1 SEE ALSO
+
+L<URI>
+
+=head1 COPYRIGHT
+
+Copyright 1995-1998 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/file.pm b/Master/tlpkg/tlperl.straw/lib/URI/file.pm
new file mode 100755
index 00000000000..0ce42529566
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/file.pm
@@ -0,0 +1,329 @@
+package URI::file;
+
+use strict;
+use vars qw(@ISA $VERSION $DEFAULT_AUTHORITY %OS_CLASS);
+
+require URI::_generic;
+@ISA = qw(URI::_generic);
+$VERSION = "4.20";
+
+use URI::Escape qw(uri_unescape);
+
+$DEFAULT_AUTHORITY = "";
+
+# Map from $^O values to implementation classes. The Unix
+# class is the default.
+%OS_CLASS = (
+ os2 => "OS2",
+ mac => "Mac",
+ MacOS => "Mac",
+ MSWin32 => "Win32",
+ win32 => "Win32",
+ msdos => "FAT",
+ dos => "FAT",
+ qnx => "QNX",
+);
+
+sub os_class
+{
+ my($OS) = shift || $^O;
+
+ my $class = "URI::file::" . ($OS_CLASS{$OS} || "Unix");
+ no strict 'refs';
+ unless (%{"$class\::"}) {
+ eval "require $class";
+ die $@ if $@;
+ }
+ $class;
+}
+
+sub path { shift->path_query(@_) }
+sub host { uri_unescape(shift->authority(@_)) }
+
+sub new
+{
+ my($class, $path, $os) = @_;
+ os_class($os)->new($path);
+}
+
+sub new_abs
+{
+ my $class = shift;
+ my $file = $class->new(@_);
+ return $file->abs($class->cwd) unless $$file =~ /^file:/;
+ $file;
+}
+
+sub cwd
+{
+ my $class = shift;
+ require Cwd;
+ my $cwd = Cwd::cwd();
+ $cwd = VMS::Filespec::unixpath($cwd) if $^O eq 'VMS';
+ $cwd = $class->new($cwd);
+ $cwd .= "/" unless substr($cwd, -1, 1) eq "/";
+ $cwd;
+}
+
+sub canonical {
+ my $self = shift;
+ my $other = $self->SUPER::canonical;
+
+ my $scheme = $other->scheme;
+ my $auth = $other->authority;
+ return $other if !defined($scheme) && !defined($auth); # relative
+
+ if (!defined($auth) ||
+ $auth eq "" ||
+ lc($auth) eq "localhost" ||
+ (defined($DEFAULT_AUTHORITY) && lc($auth) eq lc($DEFAULT_AUTHORITY))
+ )
+ {
+ # avoid cloning if $auth already match
+ if ((defined($auth) || defined($DEFAULT_AUTHORITY)) &&
+ (!defined($auth) || !defined($DEFAULT_AUTHORITY) || $auth ne $DEFAULT_AUTHORITY)
+ )
+ {
+ $other = $other->clone if $self == $other;
+ $other->authority($DEFAULT_AUTHORITY);
+ }
+ }
+
+ $other;
+}
+
+sub file
+{
+ my($self, $os) = @_;
+ os_class($os)->file($self);
+}
+
+sub dir
+{
+ my($self, $os) = @_;
+ os_class($os)->dir($self);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+URI::file - URI that maps to local file names
+
+=head1 SYNOPSIS
+
+ use URI::file;
+
+ $u1 = URI->new("file:/foo/bar");
+ $u2 = URI->new("foo/bar", "file");
+
+ $u3 = URI::file->new($path);
+ $u4 = URI::file->new("c:\\windows\\", "win32");
+
+ $u1->file;
+ $u1->file("mac");
+
+=head1 DESCRIPTION
+
+The C<URI::file> class supports C<URI> objects belonging to the I<file>
+URI scheme. This scheme allows us to map the conventional file names
+found on various computer systems to the URI name space. An old
+specification of the I<file> URI scheme is found in RFC 1738. Some
+older background information is also in RFC 1630. There are no newer
+specifications as far as I know.
+
+If you simply want to construct I<file> URI objects from URI strings,
+use the normal C<URI> constructor. If you want to construct I<file>
+URI objects from the actual file names used by various systems, then
+use one of the following C<URI::file> constructors:
+
+=over 4
+
+=item $u = URI::file->new( $filename, [$os] )
+
+Maps a file name to the I<file:> URI name space, creates a URI object
+and returns it. The $filename is interpreted as belonging to the
+indicated operating system ($os), which defaults to the value of the
+$^O variable. The $filename can be either absolute or relative, and
+the corresponding type of URI object for $os is returned.
+
+=item $u = URI::file->new_abs( $filename, [$os] )
+
+Same as URI::file->new, but makes sure that the URI returned
+represents an absolute file name. If the $filename argument is
+relative, then the name is resolved relative to the current directory,
+i.e. this constructor is really the same as:
+
+ URI::file->new($filename)->abs(URI::file->cwd);
+
+=item $u = URI::file->cwd
+
+Returns a I<file> URI that represents the current working directory.
+See L<Cwd>.
+
+=back
+
+The following methods are supported for I<file> URI (in addition to
+the common and generic methods described in L<URI>):
+
+=over 4
+
+=item $u->file( [$os] )
+
+Returns a file name. It maps from the URI name space
+to the file name space of the indicated operating system.
+
+It might return C<undef> if the name can not be represented in the
+indicated file system.
+
+=item $u->dir( [$os] )
+
+Some systems use a different form for names of directories than for plain
+files. Use this method if you know you want to use the name for
+a directory.
+
+=back
+
+The C<URI::file> module can be used to map generic file names to names
+suitable for the current system. As such, it can work as a nice
+replacement for the C<File::Spec> module. For instance, the following
+code translates the UNIX-style file name F<Foo/Bar.pm> to a name
+suitable for the local system:
+
+ $file = URI::file->new("Foo/Bar.pm", "unix")->file;
+ die "Can't map filename Foo/Bar.pm for $^O" unless defined $file;
+ open(FILE, $file) || die "Can't open '$file': $!";
+ # do something with FILE
+
+=head1 MAPPING NOTES
+
+Most computer systems today have hierarchically organized file systems.
+Mapping the names used in these systems to the generic URI syntax
+allows us to work with relative file URIs that behave as they should
+when resolved using the generic algorithm for URIs (specified in RFC
+2396). Mapping a file name to the generic URI syntax involves mapping
+the path separator character to "/" and encoding any reserved
+characters that appear in the path segments of the file name. If
+path segments consisting of the strings "." or ".." have a
+different meaning than what is specified for generic URIs, then these
+must be encoded as well.
+
+If the file system has device, volume or drive specifications as
+the root of the name space, then it makes sense to map them to the
+authority field of the generic URI syntax. This makes sure that
+relative URIs can not be resolved "above" them, i.e. generally how
+relative file names work in those systems.
+
+Another common use of the authority field is to encode the host on which
+this file name is valid. The host name "localhost" is special and
+generally has the same meaning as a missing or empty authority
+field. This use is in conflict with using it as a device
+specification, but can often be resolved for device specifications
+having characters not legal in plain host names.
+
+File name to URI mapping in normally not one-to-one. There are
+usually many URIs that map to any given file name. For instance, an
+authority of "localhost" maps the same as a URI with a missing or empty
+authority.
+
+Example 1: The Mac uses ":" as path separator, but not in the same way
+as a generic URI. ":foo" is a relative name. "foo:bar" is an absolute
+name. Also, path segments can contain the "/" character as well as the
+literal "." or "..". So the mapping looks like this:
+
+ Mac URI
+ ---------- -------------------
+ :foo:bar <==> foo/bar
+ : <==> ./
+ ::foo:bar <==> ../foo/bar
+ ::: <==> ../../
+ foo:bar <==> file:/foo/bar
+ foo:bar: <==> file:/foo/bar/
+ .. <==> %2E%2E
+ <undef> <== /
+ foo/ <== file:/foo%2F
+ ./foo.txt <== file:/.%2Ffoo.txt
+
+Note that if you want a relative URL, you *must* begin the path with a :. Any
+path that begins with [^:] is treated as absolute.
+
+Example 2: The UNIX file system is easy to map, as it uses the same path
+separator as URIs, has a single root, and segments of "." and ".."
+have the same meaning. URIs that have the character "\0" or "/" as
+part of any path segment can not be turned into valid UNIX file names.
+
+ UNIX URI
+ ---------- ------------------
+ foo/bar <==> foo/bar
+ /foo/bar <==> file:/foo/bar
+ /foo/bar <== file://localhost/foo/bar
+ file: ==> ./file:
+ <undef> <== file:/fo%00/bar
+ / <==> file:/
+
+=cut
+
+
+RFC 1630
+
+ [...]
+
+ There is clearly a danger of confusion that a link made to a local
+ file should be followed by someone on a different system, with
+ unexpected and possibly harmful results. Therefore, the convention
+ is that even a "file" URL is provided with a host part. This allows
+ a client on another system to know that it cannot access the file
+ system, or perhaps to use some other local mechanism to access the
+ file.
+
+ The special value "localhost" is used in the host field to indicate
+ that the filename should really be used on whatever host one is.
+ This for example allows links to be made to files which are
+ distributed on many machines, or to "your unix local password file"
+ subject of course to consistency across the users of the data.
+
+ A void host field is equivalent to "localhost".
+
+=head1 CONFIGURATION VARIABLES
+
+The following configuration variables influence how the class and its
+methods behave:
+
+=over
+
+=item %URI::file::OS_CLASS
+
+This hash maps OS identifiers to implementation classes. You might
+want to add or modify this if you want to plug in your own file
+handler class. Normally the keys should match the $^O values in use.
+
+If there is no mapping then the "Unix" implementation is used.
+
+=item $URI::file::DEFAULT_AUTHORITY
+
+This determine what "authority" string to include in absolute file
+URIs. It defaults to "". If you prefer verbose URIs you might set it
+to be "localhost".
+
+Setting this value to C<undef> force behaviour compatible to URI v1.31
+and earlier. In this mode host names in UNC paths and drive letters
+are mapped to the authority component on Windows, while we produce
+authority-less URIs on Unix.
+
+=back
+
+
+=head1 SEE ALSO
+
+L<URI>, L<File::Spec>, L<perlport>
+
+=head1 COPYRIGHT
+
+Copyright 1995-1998,2004 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/file/Base.pm b/Master/tlpkg/tlperl.straw/lib/URI/file/Base.pm
new file mode 100755
index 00000000000..941793b0f93
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/file/Base.pm
@@ -0,0 +1,80 @@
+package URI::file::Base;
+
+use strict;
+use URI::Escape qw();
+
+sub new
+{
+ my $class = shift;
+ my $path = shift;
+ $path = "" unless defined $path;
+
+ my($auth, $escaped_auth, $escaped_path);
+
+ ($auth, $escaped_auth) = $class->_file_extract_authority($path);
+ ($path, $escaped_path) = $class->_file_extract_path($path);
+
+ if (defined $auth) {
+ $auth =~ s,%,%25,g unless $escaped_auth;
+ $auth =~ s,([/?\#]), URI::Escape::escape_char($1),eg;
+ $auth = "//$auth";
+ if (defined $path) {
+ $path = "/$path" unless substr($path, 0, 1) eq "/";
+ } else {
+ $path = "";
+ }
+ } else {
+ return undef unless defined $path;
+ $auth = "";
+ }
+
+ $path =~ s,([%;?]), URI::Escape::escape_char($1),eg unless $escaped_path;
+ $path =~ s/\#/%23/g;
+
+ my $uri = $auth . $path;
+ $uri = "file:$uri" if substr($uri, 0, 1) eq "/";
+
+ URI->new($uri, "file");
+}
+
+sub _file_extract_authority
+{
+ my($class, $path) = @_;
+ return undef unless $class->_file_is_absolute($path);
+ return $URI::file::DEFAULT_AUTHORITY;
+}
+
+sub _file_extract_path
+{
+ return undef;
+}
+
+sub _file_is_absolute
+{
+ return 0;
+}
+
+sub _file_is_localhost
+{
+ shift; # class
+ my $host = lc(shift);
+ return 1 if $host eq "localhost";
+ eval {
+ require Net::Domain;
+ lc(Net::Domain::hostfqdn()) eq $host ||
+ lc(Net::Domain::hostname()) eq $host;
+ };
+}
+
+sub file
+{
+ undef;
+}
+
+sub dir
+{
+ my $self = shift;
+ $self->file(@_);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/file/FAT.pm b/Master/tlpkg/tlperl.straw/lib/URI/file/FAT.pm
new file mode 100755
index 00000000000..328169bd0bf
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/file/FAT.pm
@@ -0,0 +1,23 @@
+package URI::file::FAT;
+
+require URI::file::Win32;
+@ISA=qw(URI::file::Win32);
+
+sub fix_path
+{
+ shift; # class
+ for (@_) {
+ # turn it into 8.3 names
+ my @p = map uc, split(/\./, $_, -1);
+ return if @p > 2; # more than 1 dot is not allowed
+ @p = ("") unless @p; # split bug? (returns nothing when splitting "")
+ $_ = substr($p[0], 0, 8);
+ if (@p > 1) {
+ my $ext = substr($p[1], 0, 3);
+ $_ .= ".$ext" if length $ext;
+ }
+ }
+ 1; # ok
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/file/Mac.pm b/Master/tlpkg/tlperl.straw/lib/URI/file/Mac.pm
new file mode 100755
index 00000000000..6cfa78192e0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/file/Mac.pm
@@ -0,0 +1,120 @@
+package URI::file::Mac;
+
+require URI::file::Base;
+@ISA=qw(URI::file::Base);
+
+use strict;
+use URI::Escape qw(uri_unescape);
+
+
+
+sub _file_extract_path
+{
+ my $class = shift;
+ my $path = shift;
+
+ my @pre;
+ if ($path =~ s/^(:+)//) {
+ if (length($1) == 1) {
+ @pre = (".") unless length($path);
+ } else {
+ @pre = ("..") x (length($1) - 1);
+ }
+ } else { #absolute
+ $pre[0] = "";
+ }
+
+ my $isdir = ($path =~ s/:$//);
+ $path =~ s,([%/;]), URI::Escape::escape_char($1),eg;
+
+ my @path = split(/:/, $path, -1);
+ for (@path) {
+ if ($_ eq "." || $_ eq "..") {
+ $_ = "%2E" x length($_);
+ }
+ $_ = ".." unless length($_);
+ }
+ push (@path,"") if $isdir;
+ (join("/", @pre, @path), 1);
+}
+
+
+sub file
+{
+ my $class = shift;
+ my $uri = shift;
+ my @path;
+
+ my $auth = $uri->authority;
+ if (defined $auth) {
+ if (lc($auth) ne "localhost" && $auth ne "") {
+ my $u_auth = uri_unescape($auth);
+ if (!$class->_file_is_localhost($u_auth)) {
+ # some other host (use it as volume name)
+ @path = ("", $auth);
+ # XXX or just return to make it illegal;
+ }
+ }
+ }
+ my @ps = split("/", $uri->path, -1);
+ shift @ps if @path;
+ push(@path, @ps);
+
+ my $pre = "";
+ if (!@path) {
+ return; # empty path; XXX return ":" instead?
+ } elsif ($path[0] eq "") {
+ # absolute
+ shift(@path);
+ if (@path == 1) {
+ return if $path[0] eq ""; # not root directory
+ push(@path, ""); # volume only, effectively append ":"
+ }
+ @ps = @path;
+ @path = ();
+ my $part;
+ for (@ps) { #fix up "." and "..", including interior, in relatives
+ next if $_ eq ".";
+ $part = $_ eq ".." ? "" : $_;
+ push(@path,$part);
+ }
+ if ($ps[-1] eq "..") { #if this happens, we need another :
+ push(@path,"");
+ }
+
+ } else {
+ $pre = ":";
+ @ps = @path;
+ @path = ();
+ my $part;
+ for (@ps) { #fix up "." and "..", including interior, in relatives
+ next if $_ eq ".";
+ $part = $_ eq ".." ? "" : $_;
+ push(@path,$part);
+ }
+ if ($ps[-1] eq "..") { #if this happens, we need another :
+ push(@path,"");
+ }
+
+ }
+ return unless $pre || @path;
+ for (@path) {
+ s/;.*//; # get rid of parameters
+ #return unless length; # XXX
+ $_ = uri_unescape($_);
+ return if /\0/;
+ return if /:/; # Should we?
+ }
+ $pre . join(":", @path);
+}
+
+sub dir
+{
+ my $class = shift;
+ my $path = $class->file(@_);
+ return unless defined $path;
+ $path .= ":" unless $path =~ /:$/;
+ $path;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/file/OS2.pm b/Master/tlpkg/tlperl.straw/lib/URI/file/OS2.pm
new file mode 100755
index 00000000000..ad0a78ede52
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/file/OS2.pm
@@ -0,0 +1,28 @@
+package URI::file::OS2;
+
+require URI::file::Win32;
+@ISA=qw(URI::file::Win32);
+
+# The Win32 version translates k:/foo to file://k:/foo (?!)
+# We add an empty host
+
+sub _file_extract_authority
+{
+ my $class = shift;
+ return $1 if $_[0] =~ s,^\\\\([^\\]+),,; # UNC
+ return $1 if $_[0] =~ s,^//([^/]+),,; # UNC too?
+
+ if ($_[0] =~ m#^[a-zA-Z]{1,2}:#) { # allow for ab: drives
+ return "";
+ }
+ return;
+}
+
+sub file {
+ my $p = &URI::file::Win32::file;
+ return unless defined $p;
+ $p =~ s,\\,/,g;
+ $p;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/file/QNX.pm b/Master/tlpkg/tlperl.straw/lib/URI/file/QNX.pm
new file mode 100755
index 00000000000..93a4983d2bb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/file/QNX.pm
@@ -0,0 +1,18 @@
+package URI::file::QNX;
+
+require URI::file::Unix;
+@ISA=qw(URI::file::Unix);
+
+use strict;
+
+sub _file_extract_path
+{
+ my($class, $path) = @_;
+ # tidy path
+ $path =~ s,(.)//+,$1/,g; # ^// is correct
+ $path =~ s,(/\.)+/,/,g;
+ $path = "./$path" if $path =~ m,^[^:/]+:,,; # look like "scheme:"
+ $path;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/file/Unix.pm b/Master/tlpkg/tlperl.straw/lib/URI/file/Unix.pm
new file mode 100755
index 00000000000..5f8aaae9050
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/file/Unix.pm
@@ -0,0 +1,55 @@
+package URI::file::Unix;
+
+require URI::file::Base;
+@ISA=qw(URI::file::Base);
+
+use strict;
+use URI::Escape qw(uri_unescape);
+
+sub _file_extract_path
+{
+ my($class, $path) = @_;
+
+ # tidy path
+ $path =~ s,//+,/,g;
+ $path =~ s,(/\.)+/,/,g;
+ $path = "./$path" if $path =~ m,^[^:/]+:,,; # look like "scheme:"
+
+ return $path;
+}
+
+sub _file_is_absolute {
+ my($class, $path) = @_;
+ return $path =~ m,^/,;
+}
+
+sub file
+{
+ my $class = shift;
+ my $uri = shift;
+ my @path;
+
+ my $auth = $uri->authority;
+ if (defined($auth)) {
+ if (lc($auth) ne "localhost" && $auth ne "") {
+ $auth = uri_unescape($auth);
+ unless ($class->_file_is_localhost($auth)) {
+ push(@path, "", "", $auth);
+ }
+ }
+ }
+
+ my @ps = $uri->path_segments;
+ shift @ps if @path;
+ push(@path, @ps);
+
+ for (@path) {
+ # Unix file/directory names are not allowed to contain '\0' or '/'
+ return undef if /\0/;
+ return undef if /\//; # should we really?
+ }
+
+ return join("/", @path);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/file/Win32.pm b/Master/tlpkg/tlperl.straw/lib/URI/file/Win32.pm
new file mode 100755
index 00000000000..04593863a92
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/file/Win32.pm
@@ -0,0 +1,84 @@
+package URI::file::Win32;
+
+require URI::file::Base;
+@ISA=qw(URI::file::Base);
+
+use strict;
+use URI::Escape qw(uri_unescape);
+
+sub _file_extract_authority
+{
+ my $class = shift;
+
+ return $class->SUPER::_file_extract_authority($_[0])
+ if defined $URI::file::DEFAULT_AUTHORITY;
+
+ return $1 if $_[0] =~ s,^\\\\([^\\]+),,; # UNC
+ return $1 if $_[0] =~ s,^//([^/]+),,; # UNC too?
+
+ if ($_[0] =~ s,^([a-zA-Z]:),,) {
+ my $auth = $1;
+ $auth .= "relative" if $_[0] !~ m,^[\\/],;
+ return $auth;
+ }
+ return undef;
+}
+
+sub _file_extract_path
+{
+ my($class, $path) = @_;
+ $path =~ s,\\,/,g;
+ #$path =~ s,//+,/,g;
+ $path =~ s,(/\.)+/,/,g;
+
+ if (defined $URI::file::DEFAULT_AUTHORITY) {
+ $path =~ s,^([a-zA-Z]:),/$1,;
+ }
+
+ return $path;
+}
+
+sub _file_is_absolute {
+ my($class, $path) = @_;
+ return $path =~ m,^[a-zA-Z]:, || $path =~ m,^[/\\],;
+}
+
+sub file
+{
+ my $class = shift;
+ my $uri = shift;
+ my $auth = $uri->authority;
+ my $rel; # is filename relative to drive specified in authority
+ if (defined $auth) {
+ $auth = uri_unescape($auth);
+ if ($auth =~ /^([a-zA-Z])[:|](relative)?/) {
+ $auth = uc($1) . ":";
+ $rel++ if $2;
+ } elsif (lc($auth) eq "localhost") {
+ $auth = "";
+ } elsif (length $auth) {
+ $auth = "\\\\" . $auth; # UNC
+ }
+ } else {
+ $auth = "";
+ }
+
+ my @path = $uri->path_segments;
+ for (@path) {
+ return undef if /\0/;
+ return undef if /\//;
+ #return undef if /\\/; # URLs with "\" is not uncommon
+ }
+ return undef unless $class->fix_path(@path);
+
+ my $path = join("\\", @path);
+ $path =~ s/^\\// if $rel;
+ $path = $auth . $path;
+ $path =~ s,^\\([a-zA-Z])[:|],\u$1:,;
+
+ return $path;
+}
+
+sub fix_path { 1; }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/ftp.pm b/Master/tlpkg/tlperl.straw/lib/URI/ftp.pm
new file mode 100755
index 00000000000..89aeb07cdc9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/ftp.pm
@@ -0,0 +1,45 @@
+package URI::ftp;
+
+require URI::_server;
+require URI::_userpass;
+@ISA=qw(URI::_server URI::_userpass);
+
+use strict;
+
+sub default_port { 21 }
+
+sub path { shift->path_query(@_) } # XXX
+
+sub _user { shift->SUPER::user(@_); }
+sub _password { shift->SUPER::password(@_); }
+
+sub user
+{
+ my $self = shift;
+ my $user = $self->_user(@_);
+ $user = "anonymous" unless defined $user;
+ $user;
+}
+
+sub password
+{
+ my $self = shift;
+ my $pass = $self->_password(@_);
+ unless (defined $pass) {
+ my $user = $self->user;
+ if ($user eq 'anonymous' || $user eq 'ftp') {
+ # anonymous ftp login password
+ # If there is no ftp anonymous password specified
+ # then we'll just use 'anonymous@'
+ # We don't try to send the read e-mail address because:
+ # - We want to remain anonymous
+ # - We want to stop SPAM
+ # - We don't want to let ftp sites to discriminate by the user,
+ # host, country or ftp client being used.
+ $pass = 'anonymous@';
+ }
+ }
+ $pass;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/gopher.pm b/Master/tlpkg/tlperl.straw/lib/URI/gopher.pm
new file mode 100755
index 00000000000..ae6690423bc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/gopher.pm
@@ -0,0 +1,94 @@
+package URI::gopher; # <draft-murali-url-gopher>, Dec 4, 1996
+
+require URI::_server;
+@ISA=qw(URI::_server);
+
+use strict;
+use URI::Escape qw(uri_unescape);
+
+# A Gopher URL follows the common internet scheme syntax as defined in
+# section 4.3 of [RFC-URL-SYNTAX]:
+#
+# gopher://<host>[:<port>]/<gopher-path>
+#
+# where
+#
+# <gopher-path> := <gopher-type><selector> |
+# <gopher-type><selector>%09<search> |
+# <gopher-type><selector>%09<search>%09<gopher+_string>
+#
+# <gopher-type> := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7'
+# '8' | '9' | '+' | 'I' | 'g' | 'T'
+#
+# <selector> := *pchar Refer to RFC 1808 [4]
+# <search> := *pchar
+# <gopher+_string> := *uchar Refer to RFC 1738 [3]
+#
+# If the optional port is omitted, the port defaults to 70.
+
+sub default_port { 70 }
+
+sub _gopher_type
+{
+ my $self = shift;
+ my $path = $self->path_query;
+ $path =~ s,^/,,;
+ my $gtype = $1 if $path =~ s/^(.)//s;
+ if (@_) {
+ my $new_type = shift;
+ if (defined($new_type)) {
+ Carp::croak("Bad gopher type '$new_type'")
+ unless length($new_type) == 1;
+ substr($path, 0, 0) = $new_type;
+ $self->path_query($path);
+ } else {
+ Carp::croak("Can't delete gopher type when selector is present")
+ if length($path);
+ $self->path_query(undef);
+ }
+ }
+ return $gtype;
+}
+
+sub gopher_type
+{
+ my $self = shift;
+ my $gtype = $self->_gopher_type(@_);
+ $gtype = "1" unless defined $gtype;
+ $gtype;
+}
+
+*gtype = \&gopher_type; # URI::URL compatibility
+
+sub selector { shift->_gfield(0, @_) }
+sub search { shift->_gfield(1, @_) }
+sub string { shift->_gfield(2, @_) }
+
+sub _gfield
+{
+ my $self = shift;
+ my $fno = shift;
+ my $path = $self->path_query;
+
+ # not according to spec., but many popular browsers accept
+ # gopher URLs with a '?' before the search string.
+ $path =~ s/\?/\t/;
+ $path = uri_unescape($path);
+ $path =~ s,^/,,;
+ my $gtype = $1 if $path =~ s,^(.),,s;
+ my @path = split(/\t/, $path, 3);
+ if (@_) {
+ # modify
+ my $new = shift;
+ $path[$fno] = $new;
+ pop(@path) while @path && !defined($path[-1]);
+ for (@path) { $_="" unless defined }
+ $path = $gtype;
+ $path = "1" unless defined $path;
+ $path .= join("\t", @path);
+ $self->path_query($path);
+ }
+ $path[$fno];
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/http.pm b/Master/tlpkg/tlperl.straw/lib/URI/http.pm
new file mode 100755
index 00000000000..cb698224060
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/http.pm
@@ -0,0 +1,25 @@
+package URI::http;
+
+require URI::_server;
+@ISA=qw(URI::_server);
+
+use strict;
+
+sub default_port { 80 }
+
+sub canonical
+{
+ my $self = shift;
+ my $other = $self->SUPER::canonical;
+
+ my $slash_path = defined($other->authority) &&
+ !length($other->path) && !defined($other->query);
+
+ if ($slash_path) {
+ $other = $other->clone if $other == $self;
+ $other->path("/");
+ }
+ $other;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/https.pm b/Master/tlpkg/tlperl.straw/lib/URI/https.pm
new file mode 100755
index 00000000000..c39c67b5ec3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/https.pm
@@ -0,0 +1,7 @@
+package URI::https;
+require URI::http;
+@ISA=qw(URI::http);
+
+sub default_port { 443 }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/ldap.pm b/Master/tlpkg/tlperl.straw/lib/URI/ldap.pm
new file mode 100755
index 00000000000..8af504b269d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/ldap.pm
@@ -0,0 +1,122 @@
+# Copyright (c) 1998 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package URI::ldap;
+
+use strict;
+
+use vars qw(@ISA $VERSION);
+$VERSION = "1.11";
+
+require URI::_server;
+require URI::_ldap;
+@ISA=qw(URI::_ldap URI::_server);
+
+sub default_port { 389 }
+
+sub _nonldap_canonical {
+ my $self = shift;
+ $self->URI::_server::canonical(@_);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+URI::ldap - LDAP Uniform Resource Locators
+
+=head1 SYNOPSIS
+
+ use URI;
+
+ $uri = URI->new("ldap:$uri_string");
+ $dn = $uri->dn;
+ $filter = $uri->filter;
+ @attr = $uri->attributes;
+ $scope = $uri->scope;
+ %extn = $uri->extensions;
+
+ $uri = URI->new("ldap:"); # start empty
+ $uri->host("ldap.itd.umich.edu");
+ $uri->dn("o=University of Michigan,c=US");
+ $uri->attributes(qw(postalAddress));
+ $uri->scope('sub');
+ $uri->filter('(cn=Babs Jensen)');
+ print $uri->as_string,"\n";
+
+=head1 DESCRIPTION
+
+C<URI::ldap> provides an interface to parse an LDAP URI into its
+constituent parts and also to build a URI as described in
+RFC 2255.
+
+=head1 METHODS
+
+C<URI::ldap> supports all the generic and server methods defined by
+L<URI>, plus the following.
+
+Each of the following methods can be used to set or get the value in
+the URI. The values are passed in unescaped form. None of these
+return undefined values, but elements without a default can be empty.
+If arguments are given, then a new value is set for the given part
+of the URI.
+
+=over 4
+
+=item $uri->dn( [$new_dn] )
+
+Sets or gets the I<Distinguished Name> part of the URI. The DN
+identifies the base object of the LDAP search.
+
+=item $uri->attributes( [@new_attrs] )
+
+Sets or gets the list of attribute names which are
+returned by the search.
+
+=item $uri->scope( [$new_scope] )
+
+Sets or gets the scope to be used by the search. The value can be one of
+C<"base">, C<"one"> or C<"sub">. If none is given in the URI then the
+return value defaults to C<"base">.
+
+=item $uri->_scope( [$new_scope] )
+
+Same as scope(), but does not default to anything.
+
+=item $uri->filter( [$new_filter] )
+
+Sets or gets the filter to be used by the search. If none is given in
+the URI then the return value defaults to C<"(objectClass=*)">.
+
+=item $uri->_filter( [$new_filter] )
+
+Same as filter(), but does not default to anything.
+
+=item $uri->extensions( [$etype => $evalue,...] )
+
+Sets or gets the extensions used for the search. The list passed should
+be in the form etype1 => evalue1, etype2 => evalue2,... This is also
+the form of list that is returned.
+
+=back
+
+=head1 SEE ALSO
+
+L<RFC-2255|http://www.cis.ohio-state.edu/htbin/rfc/rfc2255.html>
+
+=head1 AUTHOR
+
+Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+
+Slightly modified by Gisle Aas to fit into the URI distribution.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1998 Graham Barr. All rights reserved. This program is
+free software; you can redistribute it and/or modify it under the same
+terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/ldapi.pm b/Master/tlpkg/tlperl.straw/lib/URI/ldapi.pm
new file mode 100755
index 00000000000..d92b13f3a49
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/ldapi.pm
@@ -0,0 +1,30 @@
+package URI::ldapi;
+
+use strict;
+
+use vars qw(@ISA);
+
+require URI::_generic;
+require URI::_ldap;
+@ISA=qw(URI::_ldap URI::_generic);
+
+require URI::Escape;
+
+sub un_path {
+ my $self = shift;
+ my $old = URI::Escape::uri_unescape($self->authority);
+ if (@_) {
+ my $p = shift;
+ $p =~ s/:/%3A/g;
+ $p =~ s/\@/%40/g;
+ $self->authority($p);
+ }
+ return $old;
+}
+
+sub _nonldap_canonical {
+ my $self = shift;
+ $self->URI::_generic::canonical(@_);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/ldaps.pm b/Master/tlpkg/tlperl.straw/lib/URI/ldaps.pm
new file mode 100755
index 00000000000..20180d55773
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/ldaps.pm
@@ -0,0 +1,7 @@
+package URI::ldaps;
+require URI::ldap;
+@ISA=qw(URI::ldap);
+
+sub default_port { 636 }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/mailto.pm b/Master/tlpkg/tlperl.straw/lib/URI/mailto.pm
new file mode 100755
index 00000000000..88761c40333
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/mailto.pm
@@ -0,0 +1,72 @@
+package URI::mailto; # RFC 2368
+
+require URI;
+require URI::_query;
+@ISA=qw(URI URI::_query);
+
+use strict;
+
+sub to
+{
+ my $self = shift;
+ my @old = $self->headers;
+ if (@_) {
+ my @new = @old;
+ # get rid of any other to: fields
+ for (my $i = 0; $i < @new; $i += 2) {
+ if (lc($new[$i] || '') eq "to") {
+ splice(@new, $i, 2);
+ redo;
+ }
+ }
+
+ my $to = shift;
+ $to = "" unless defined $to;
+ unshift(@new, "to" => $to);
+ $self->headers(@new);
+ }
+ return unless defined wantarray;
+
+ my @to;
+ while (@old) {
+ my $h = shift @old;
+ my $v = shift @old;
+ push(@to, $v) if lc($h) eq "to";
+ }
+ join(",", @to);
+}
+
+
+sub headers
+{
+ my $self = shift;
+
+ # The trick is to just treat everything as the query string...
+ my $opaque = "to=" . $self->opaque;
+ $opaque =~ s/\?/&/;
+
+ if (@_) {
+ my @new = @_;
+
+ # strip out any "to" fields
+ my @to;
+ for (my $i=0; $i < @new; $i += 2) {
+ if (lc($new[$i] || '') eq "to") {
+ push(@to, (splice(@new, $i, 2))[1]); # remove header
+ redo;
+ }
+ }
+
+ my $new = join(",",@to);
+ $new =~ s/%/%25/g;
+ $new =~ s/\?/%3F/g;
+ $self->opaque($new);
+ $self->query_form(@new) if @new;
+ }
+ return unless defined wantarray;
+
+ # I am lazy today...
+ URI->new("mailto:?$opaque")->query_form;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/mms.pm b/Master/tlpkg/tlperl.straw/lib/URI/mms.pm
new file mode 100755
index 00000000000..2f1015b61d9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/mms.pm
@@ -0,0 +1,8 @@
+package URI::mms;
+
+require URI::http;
+@ISA=qw(URI::http);
+
+sub default_port { 1755 }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/news.pm b/Master/tlpkg/tlperl.straw/lib/URI/news.pm
new file mode 100755
index 00000000000..1ffb419f673
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/news.pm
@@ -0,0 +1,68 @@
+package URI::news; # draft-gilman-news-url-01
+
+require URI::_server;
+@ISA=qw(URI::_server);
+
+use strict;
+use URI::Escape qw(uri_unescape);
+use Carp ();
+
+sub default_port { 119 }
+
+# newsURL = scheme ":" [ news-server ] [ refbygroup | message ]
+# scheme = "news" | "snews" | "nntp"
+# news-server = "//" server "/"
+# refbygroup = group [ "/" messageno [ "-" messageno ] ]
+# message = local-part "@" domain
+
+sub _group
+{
+ my $self = shift;
+ my $old = $self->path;
+ if (@_) {
+ my($group,$from,$to) = @_;
+ if ($group =~ /\@/) {
+ $group =~ s/^<(.*)>$/$1/; # "<" and ">" should not be part of it
+ }
+ $group =~ s,%,%25,g;
+ $group =~ s,/,%2F,g;
+ my $path = $group;
+ if (defined $from) {
+ $path .= "/$from";
+ $path .= "-$to" if defined $to;
+ }
+ $self->path($path);
+ }
+
+ $old =~ s,^/,,;
+ if ($old !~ /\@/ && $old =~ s,/(.*),, && wantarray) {
+ my $extra = $1;
+ return (uri_unescape($old), split(/-/, $extra));
+ }
+ uri_unescape($old);
+}
+
+
+sub group
+{
+ my $self = shift;
+ if (@_) {
+ Carp::croak("Group name can't contain '\@'") if $_[0] =~ /\@/;
+ }
+ my @old = $self->_group(@_);
+ return if $old[0] =~ /\@/;
+ wantarray ? @old : $old[0];
+}
+
+sub message
+{
+ my $self = shift;
+ if (@_) {
+ Carp::croak("Message must contain '\@'") unless $_[0] =~ /\@/;
+ }
+ my $old = $self->_group(@_);
+ return unless $old =~ /\@/;
+ return $old;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/nntp.pm b/Master/tlpkg/tlperl.straw/lib/URI/nntp.pm
new file mode 100755
index 00000000000..af61e036cc7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/nntp.pm
@@ -0,0 +1,6 @@
+package URI::nntp; # draft-gilman-news-url-01
+
+require URI::news;
+@ISA=qw(URI::news);
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/pop.pm b/Master/tlpkg/tlperl.straw/lib/URI/pop.pm
new file mode 100755
index 00000000000..50b8d6dd511
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/pop.pm
@@ -0,0 +1,68 @@
+package URI::pop; # RFC 2384
+
+require URI::_server;
+@ISA=qw(URI::_server);
+
+use strict;
+use URI::Escape qw(uri_unescape);
+
+sub default_port { 110 }
+
+#pop://<user>;auth=<auth>@<host>:<port>
+
+sub user
+{
+ my $self = shift;
+ my $old = $self->userinfo;
+
+ if (@_) {
+ my $new_info = $old;
+ $new_info = "" unless defined $new_info;
+ $new_info =~ s/^[^;]*//;
+
+ my $new = shift;
+ if (!defined($new) && !length($new_info)) {
+ $self->userinfo(undef);
+ } else {
+ $new = "" unless defined $new;
+ $new =~ s/%/%25/g;
+ $new =~ s/;/%3B/g;
+ $self->userinfo("$new$new_info");
+ }
+ }
+
+ return unless defined $old;
+ $old =~ s/;.*//;
+ return uri_unescape($old);
+}
+
+sub auth
+{
+ my $self = shift;
+ my $old = $self->userinfo;
+
+ if (@_) {
+ my $new = $old;
+ $new = "" unless defined $new;
+ $new =~ s/(^[^;]*)//;
+ my $user = $1;
+ $new =~ s/;auth=[^;]*//i;
+
+
+ my $auth = shift;
+ if (defined $auth) {
+ $auth =~ s/%/%25/g;
+ $auth =~ s/;/%3B/g;
+ $new = ";AUTH=$auth$new";
+ }
+ $self->userinfo("$user$new");
+
+ }
+
+ return unless defined $old;
+ $old =~ s/^[^;]*//;
+ return uri_unescape($1) if $old =~ /;auth=(.*)/i;
+ return;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/rlogin.pm b/Master/tlpkg/tlperl.straw/lib/URI/rlogin.pm
new file mode 100755
index 00000000000..18bb76272a4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/rlogin.pm
@@ -0,0 +1,7 @@
+package URI::rlogin;
+require URI::_login;
+@ISA = qw(URI::_login);
+
+sub default_port { 513 }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/rsync.pm b/Master/tlpkg/tlperl.straw/lib/URI/rsync.pm
new file mode 100755
index 00000000000..160d9d0c065
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/rsync.pm
@@ -0,0 +1,12 @@
+package URI::rsync; # http://rsync.samba.org/
+
+# rsync://[USER@]HOST[:PORT]/SRC
+
+require URI::_server;
+require URI::_userpass;
+
+@ISA=qw(URI::_server URI::_userpass);
+
+sub default_port { 873 }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/rtsp.pm b/Master/tlpkg/tlperl.straw/lib/URI/rtsp.pm
new file mode 100755
index 00000000000..982ca5ebf1e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/rtsp.pm
@@ -0,0 +1,8 @@
+package URI::rtsp;
+
+require URI::http;
+@ISA=qw(URI::http);
+
+sub default_port { 554 }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/rtspu.pm b/Master/tlpkg/tlperl.straw/lib/URI/rtspu.pm
new file mode 100755
index 00000000000..dbcf12bb2f4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/rtspu.pm
@@ -0,0 +1,8 @@
+package URI::rtspu;
+
+require URI::rtsp;
+@ISA=qw(URI::rtsp);
+
+sub default_port { 554 }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/sip.pm b/Master/tlpkg/tlperl.straw/lib/URI/sip.pm
new file mode 100755
index 00000000000..1ace52c4f58
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/sip.pm
@@ -0,0 +1,86 @@
+#
+# Written by Ryan Kereliuk <ryker@ryker.org>. This file may be
+# distributed under the same terms as Perl itself.
+#
+# The RFC 3261 sip URI is <scheme>:<authority>;<params>?<query>.
+#
+
+package URI::sip;
+
+require URI::_server;
+require URI::_userpass;
+@ISA=qw(URI::_server URI::_userpass);
+
+use strict;
+use vars qw(@ISA $VERSION);
+use URI::Escape qw(uri_unescape);
+
+$VERSION = "0.10";
+
+sub default_port { 5060 }
+
+sub authority
+{
+ my $self = shift;
+ $$self =~ m,^($URI::scheme_re:)?([^;?]*)(.*)$,os or die;
+ my $old = $2;
+
+ if (@_) {
+ my $auth = shift;
+ $$self = defined($1) ? $1 : "";
+ my $rest = $3;
+ if (defined $auth) {
+ $auth =~ s/([^$URI::uric])/ URI::Escape::escape_char($1)/ego;
+ $$self .= "$auth";
+ }
+ $$self .= $rest;
+ }
+ $old;
+}
+
+sub params_form
+{
+ my $self = shift;
+ $$self =~ m,^((?:$URI::scheme_re:)?)(?:([^;?]*))?(;[^?]*)?(.*)$,os or die;
+ my $paramstr = $3;
+
+ if (@_) {
+ my @args = @_;
+ $$self = $1 . $2;
+ my $rest = $4;
+ my @new;
+ for (my $i=0; $i < @args; $i += 2) {
+ push(@new, "$args[$i]=$args[$i+1]");
+ }
+ $paramstr = join(";", @new);
+ $$self .= ";" . $paramstr . $rest;
+ }
+ $paramstr =~ s/^;//o;
+ return split(/[;=]/, $paramstr);
+}
+
+sub params
+{
+ my $self = shift;
+ $$self =~ m,^((?:$URI::scheme_re:)?)(?:([^;?]*))?(;[^?]*)?(.*)$,os or die;
+ my $paramstr = $3;
+
+ if (@_) {
+ my $new = shift;
+ $$self = $1 . $2;
+ my $rest = $4;
+ $$self .= $paramstr . $rest;
+ }
+ $paramstr =~ s/^;//o;
+ return $paramstr;
+}
+
+# Inherited methods that make no sense for a SIP URI.
+sub path {}
+sub path_query {}
+sub path_segments {}
+sub abs { shift }
+sub rel { shift }
+sub query_keywords {}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/sips.pm b/Master/tlpkg/tlperl.straw/lib/URI/sips.pm
new file mode 100755
index 00000000000..b32e105e24b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/sips.pm
@@ -0,0 +1,7 @@
+package URI::sips;
+require URI::sip;
+@ISA=qw(URI::sip);
+
+sub default_port { 5061 }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/snews.pm b/Master/tlpkg/tlperl.straw/lib/URI/snews.pm
new file mode 100755
index 00000000000..7e5b0379e15
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/snews.pm
@@ -0,0 +1,8 @@
+package URI::snews; # draft-gilman-news-url-01
+
+require URI::news;
+@ISA=qw(URI::news);
+
+sub default_port { 563 }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/ssh.pm b/Master/tlpkg/tlperl.straw/lib/URI/ssh.pm
new file mode 100755
index 00000000000..5cd30fc3bfc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/ssh.pm
@@ -0,0 +1,9 @@
+package URI::ssh;
+require URI::_login;
+@ISA=qw(URI::_login);
+
+# ssh://[USER@]HOST[:PORT]/SRC
+
+sub default_port { 22 }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/telnet.pm b/Master/tlpkg/tlperl.straw/lib/URI/telnet.pm
new file mode 100755
index 00000000000..5f842d35787
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/telnet.pm
@@ -0,0 +1,7 @@
+package URI::telnet;
+require URI::_login;
+@ISA = qw(URI::_login);
+
+sub default_port { 23 }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/tn3270.pm b/Master/tlpkg/tlperl.straw/lib/URI/tn3270.pm
new file mode 100755
index 00000000000..dd1e648e713
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/tn3270.pm
@@ -0,0 +1,7 @@
+package URI::tn3270;
+require URI::_login;
+@ISA = qw(URI::_login);
+
+sub default_port { 23 }
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/urn.pm b/Master/tlpkg/tlperl.straw/lib/URI/urn.pm
new file mode 100755
index 00000000000..12d40b265bc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/urn.pm
@@ -0,0 +1,97 @@
+package URI::urn; # RFC 2141
+
+require URI;
+@ISA=qw(URI);
+
+use strict;
+use Carp qw(carp);
+
+use vars qw(%implementor);
+
+sub _init {
+ my $class = shift;
+ my $self = $class->SUPER::_init(@_);
+ my $nid = $self->nid;
+
+ my $impclass = $implementor{$nid};
+ return $impclass->_urn_init($self, $nid) if $impclass;
+
+ $impclass = "URI::urn";
+ if ($nid =~ /^[A-Za-z\d][A-Za-z\d\-]*\z/) {
+ my $id = $nid;
+ # make it a legal perl identifier
+ $id =~ s/-/_/g;
+ $id = "_$id" if $id =~ /^\d/;
+
+ $impclass = "URI::urn::$id";
+ no strict 'refs';
+ unless (@{"${impclass}::ISA"}) {
+ # Try to load it
+ eval "require $impclass";
+ die $@ if $@ && $@ !~ /Can\'t locate.*in \@INC/;
+ $impclass = "URI::urn" unless @{"${impclass}::ISA"};
+ }
+ }
+ else {
+ carp("Illegal namespace identifier '$nid' for URN '$self'") if $^W;
+ }
+ $implementor{$nid} = $impclass;
+
+ return $impclass->_urn_init($self, $nid);
+}
+
+sub _urn_init {
+ my($class, $self, $nid) = @_;
+ bless $self, $class;
+}
+
+sub _nid {
+ my $self = shift;
+ my $opaque = $self->opaque;
+ if (@_) {
+ my $v = $opaque;
+ my $new = shift;
+ $v =~ s/[^:]*/$new/;
+ $self->opaque($v);
+ # XXX possible rebless
+ }
+ $opaque =~ s/:.*//s;
+ return $opaque;
+}
+
+sub nid { # namespace identifier
+ my $self = shift;
+ my $nid = $self->_nid(@_);
+ $nid = lc($nid) if defined($nid);
+ return $nid;
+}
+
+sub nss { # namespace specific string
+ my $self = shift;
+ my $opaque = $self->opaque;
+ if (@_) {
+ my $v = $opaque;
+ my $new = shift;
+ if (defined $new) {
+ $v =~ s/(:|\z).*/:$new/;
+ }
+ else {
+ $v =~ s/:.*//s;
+ }
+ $self->opaque($v);
+ }
+ return undef unless $opaque =~ s/^[^:]*://;
+ return $opaque;
+}
+
+sub canonical {
+ my $self = shift;
+ my $nid = $self->_nid;
+ my $new = $self->SUPER::canonical;
+ return $new if $nid !~ /[A-Z]/ || $nid =~ /%/;
+ $new = $new->clone if $new == $self;
+ $new->nid(lc($nid));
+ return $new;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/urn/isbn.pm b/Master/tlpkg/tlperl.straw/lib/URI/urn/isbn.pm
new file mode 100755
index 00000000000..0da931bfb69
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/urn/isbn.pm
@@ -0,0 +1,102 @@
+package URI::urn::isbn; # RFC 3187
+
+require URI::urn;
+@ISA=qw(URI::urn);
+
+use strict;
+use Carp qw(carp);
+
+BEGIN {
+ require Business::ISBN;
+
+ local $^W = 0; # don't warn about dev versions, perl5.004 style
+ warn "Using Business::ISBN version " . Business::ISBN->VERSION .
+ " which is deprecated.\nUpgrade to Business::ISBN version 2\n"
+ if Business::ISBN->VERSION < 2;
+ }
+
+sub _isbn {
+ my $nss = shift;
+ $nss = $nss->nss if ref($nss);
+ my $isbn = Business::ISBN->new($nss);
+ $isbn = undef if $isbn && !$isbn->is_valid;
+ return $isbn;
+}
+
+sub _nss_isbn {
+ my $self = shift;
+ my $nss = $self->nss(@_);
+ my $isbn = _isbn($nss);
+ $isbn = $isbn->as_string if $isbn;
+ return($nss, $isbn);
+}
+
+sub isbn {
+ my $self = shift;
+ my $isbn;
+ (undef, $isbn) = $self->_nss_isbn(@_);
+ return $isbn;
+}
+
+sub isbn_publisher_code {
+ my $isbn = shift->_isbn || return undef;
+ return $isbn->publisher_code;
+}
+
+BEGIN {
+my $group_method = do {
+ local $^W = 0; # don't warn about dev versions, perl5.004 style
+ Business::ISBN->VERSION >= 2 ? 'group_code' : 'country_code';
+ };
+
+sub isbn_group_code {
+ my $isbn = shift->_isbn || return undef;
+ return $isbn->$group_method;
+}
+}
+
+sub isbn_country_code {
+ my $name = (caller(0))[3]; $name =~ s/.*:://;
+ carp "$name is DEPRECATED. Use isbn_group_code instead";
+
+ no strict 'refs';
+ &isbn_group_code;
+}
+
+BEGIN {
+my $isbn13_method = do {
+ local $^W = 0; # don't warn about dev versions, perl5.004 style
+ Business::ISBN->VERSION >= 2 ? 'as_isbn13' : 'as_ean';
+ };
+
+sub isbn13 {
+ my $isbn = shift->_isbn || return undef;
+
+ # Business::ISBN 1.x didn't put hyphens in the EAN, and it was just a string
+ # Business::ISBN 2.0 doesn't do EAN, but it does ISBN-13 objects
+ # and it uses the hyphens, so call as_string with an empty anon array
+ # or, adjust the test and features to say that it comes out with hyphens.
+ my $thingy = $isbn->$isbn13_method;
+ return eval { $thingy->can( 'as_string' ) } ? $thingy->as_string([]) : $thingy;
+}
+}
+
+sub isbn_as_ean {
+ my $name = (caller(0))[3]; $name =~ s/.*:://;
+ carp "$name is DEPRECATED. Use isbn13 instead";
+
+ no strict 'refs';
+ &isbn13;
+}
+
+sub canonical {
+ my $self = shift;
+ my($nss, $isbn) = $self->_nss_isbn;
+ my $new = $self->SUPER::canonical;
+ return $new unless $nss && $isbn && $nss ne $isbn;
+ $new = $new->clone if $new == $self;
+ $new->nss($isbn);
+ return $new;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/URI/urn/oid.pm b/Master/tlpkg/tlperl.straw/lib/URI/urn/oid.pm
new file mode 100755
index 00000000000..301b2bcd834
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/URI/urn/oid.pm
@@ -0,0 +1,18 @@
+package URI::urn::oid; # RFC 2061
+
+require URI::urn;
+@ISA=qw(URI::urn);
+
+use strict;
+
+sub oid {
+ my $self = shift;
+ my $old = $self->nss;
+ if (@_) {
+ $self->nss(join(".", @_));
+ }
+ return split(/\./, $old) if wantarray;
+ return $old;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/Unicode/Collate.pm b/Master/tlpkg/tlperl.straw/lib/Unicode/Collate.pm
new file mode 100755
index 00000000000..cd9b8e70e63
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Unicode/Collate.pm
@@ -0,0 +1,1877 @@
+package Unicode::Collate;
+
+BEGIN {
+ unless ("A" eq pack('U', 0x41)) {
+ die "Unicode::Collate cannot stringify a Unicode code point\n";
+ }
+}
+
+use 5.006;
+use strict;
+use warnings;
+use Carp;
+use File::Spec;
+
+no warnings 'utf8';
+
+our $VERSION = '0.52';
+our $PACKAGE = __PACKAGE__;
+
+my @Path = qw(Unicode Collate);
+my $KeyFile = "allkeys.txt";
+
+# Perl's boolean
+use constant TRUE => 1;
+use constant FALSE => "";
+use constant NOMATCHPOS => -1;
+
+# A coderef to get combining class imported from Unicode::Normalize
+# (i.e. \&Unicode::Normalize::getCombinClass).
+# This is also used as a HAS_UNICODE_NORMALIZE flag.
+my $CVgetCombinClass;
+
+# Supported Levels
+use constant MinLevel => 1;
+use constant MaxLevel => 4;
+
+# Minimum weights at level 2 and 3, respectively
+use constant Min2Wt => 0x20;
+use constant Min3Wt => 0x02;
+
+# Shifted weight at 4th level
+use constant Shift4Wt => 0xFFFF;
+
+# A boolean for Variable and 16-bit weights at 4 levels of Collation Element
+# PROBLEM: The Default Unicode Collation Element Table
+# has weights over 0xFFFF at the 4th level.
+# The tie-breaking in the variable weights
+# other than "shift" (as well as "shift-trimmed") is unreliable.
+use constant VCE_TEMPLATE => 'Cn4';
+
+# A sort key: 16-bit weights
+# See also the PROBLEM on VCE_TEMPLATE above.
+use constant KEY_TEMPLATE => 'n*';
+
+# Level separator in a sort key:
+# i.e. pack(KEY_TEMPLATE, 0)
+use constant LEVEL_SEP => "\0\0";
+
+# As Unicode code point separator for hash keys.
+# A joined code point string (denoted by JCPS below)
+# like "65;768" is used for internal processing
+# instead of Perl's Unicode string like "\x41\x{300}",
+# as the native code point is different from the Unicode code point
+# on EBCDIC platform.
+# This character must not be included in any stringified
+# representation of an integer.
+use constant CODE_SEP => ';';
+
+# boolean values of variable weights
+use constant NON_VAR => 0; # Non-Variable character
+use constant VAR => 1; # Variable character
+
+# specific code points
+use constant Hangul_LBase => 0x1100;
+use constant Hangul_LIni => 0x1100;
+use constant Hangul_LFin => 0x1159;
+use constant Hangul_LFill => 0x115F;
+use constant Hangul_VBase => 0x1161;
+use constant Hangul_VIni => 0x1160; # from Vowel Filler
+use constant Hangul_VFin => 0x11A2;
+use constant Hangul_TBase => 0x11A7; # from "no-final" codepoint
+use constant Hangul_TIni => 0x11A8;
+use constant Hangul_TFin => 0x11F9;
+use constant Hangul_TCount => 28;
+use constant Hangul_NCount => 588;
+use constant Hangul_SBase => 0xAC00;
+use constant Hangul_SIni => 0xAC00;
+use constant Hangul_SFin => 0xD7A3;
+use constant CJK_UidIni => 0x4E00;
+use constant CJK_UidFin => 0x9FA5;
+use constant CJK_UidF41 => 0x9FBB;
+use constant CJK_ExtAIni => 0x3400;
+use constant CJK_ExtAFin => 0x4DB5;
+use constant CJK_ExtBIni => 0x20000;
+use constant CJK_ExtBFin => 0x2A6D6;
+use constant BMP_Max => 0xFFFF;
+
+# Logical_Order_Exception in PropList.txt
+my $DefaultRearrange = [ 0x0E40..0x0E44, 0x0EC0..0x0EC4 ];
+
+sub UCA_Version { "14" }
+
+sub Base_Unicode_Version { "4.1.0" }
+
+######
+
+sub pack_U {
+ return pack('U*', @_);
+}
+
+sub unpack_U {
+ return unpack('U*', shift(@_).pack('U*'));
+}
+
+######
+
+my (%VariableOK);
+@VariableOK{ qw/
+ blanked non-ignorable shifted shift-trimmed
+ / } = (); # keys lowercased
+
+our @ChangeOK = qw/
+ alternate backwards level normalization rearrange
+ katakana_before_hiragana upper_before_lower
+ overrideHangul overrideCJK preprocess UCA_Version
+ hangul_terminator variable
+ /;
+
+our @ChangeNG = qw/
+ entry mapping table maxlength
+ ignoreChar ignoreName undefChar undefName variableTable
+ versionTable alternateTable backwardsTable forwardsTable rearrangeTable
+ derivCode normCode rearrangeHash
+ backwardsFlag
+ /;
+# The hash key 'ignored' is deleted at v 0.21.
+# The hash key 'isShift' is deleted at v 0.23.
+# The hash key 'combining' is deleted at v 0.24.
+# The hash key 'entries' is deleted at v 0.30.
+# The hash key 'L3_ignorable' is deleted at v 0.40.
+
+sub version {
+ my $self = shift;
+ return $self->{versionTable} || 'unknown';
+}
+
+my (%ChangeOK, %ChangeNG);
+@ChangeOK{ @ChangeOK } = ();
+@ChangeNG{ @ChangeNG } = ();
+
+sub change {
+ my $self = shift;
+ my %hash = @_;
+ my %old;
+ if (exists $hash{variable} && exists $hash{alternate}) {
+ delete $hash{alternate};
+ }
+ elsif (!exists $hash{variable} && exists $hash{alternate}) {
+ $hash{variable} = $hash{alternate};
+ }
+ foreach my $k (keys %hash) {
+ if (exists $ChangeOK{$k}) {
+ $old{$k} = $self->{$k};
+ $self->{$k} = $hash{$k};
+ }
+ elsif (exists $ChangeNG{$k}) {
+ croak "change of $k via change() is not allowed!";
+ }
+ # else => ignored
+ }
+ $self->checkCollator();
+ return wantarray ? %old : $self;
+}
+
+sub _checkLevel {
+ my $level = shift;
+ my $key = shift; # 'level' or 'backwards'
+ MinLevel <= $level or croak sprintf
+ "Illegal level %d (in value for key '%s') lower than %d.",
+ $level, $key, MinLevel;
+ $level <= MaxLevel or croak sprintf
+ "Unsupported level %d (in value for key '%s') higher than %d.",
+ $level, $key, MaxLevel;
+}
+
+my %DerivCode = (
+ 8 => \&_derivCE_8,
+ 9 => \&_derivCE_9,
+ 11 => \&_derivCE_9, # 11 == 9
+ 14 => \&_derivCE_14,
+);
+
+sub checkCollator {
+ my $self = shift;
+ _checkLevel($self->{level}, "level");
+
+ $self->{derivCode} = $DerivCode{ $self->{UCA_Version} }
+ or croak "Illegal UCA version (passed $self->{UCA_Version}).";
+
+ $self->{variable} ||= $self->{alternate} || $self->{variableTable} ||
+ $self->{alternateTable} || 'shifted';
+ $self->{variable} = $self->{alternate} = lc($self->{variable});
+ exists $VariableOK{ $self->{variable} }
+ or croak "$PACKAGE unknown variable parameter name: $self->{variable}";
+
+ if (! defined $self->{backwards}) {
+ $self->{backwardsFlag} = 0;
+ }
+ elsif (! ref $self->{backwards}) {
+ _checkLevel($self->{backwards}, "backwards");
+ $self->{backwardsFlag} = 1 << $self->{backwards};
+ }
+ else {
+ my %level;
+ $self->{backwardsFlag} = 0;
+ for my $b (@{ $self->{backwards} }) {
+ _checkLevel($b, "backwards");
+ $level{$b} = 1;
+ }
+ for my $v (sort keys %level) {
+ $self->{backwardsFlag} += 1 << $v;
+ }
+ }
+
+ defined $self->{rearrange} or $self->{rearrange} = [];
+ ref $self->{rearrange}
+ or croak "$PACKAGE: list for rearrangement must be store in ARRAYREF";
+
+ # keys of $self->{rearrangeHash} are $self->{rearrange}.
+ $self->{rearrangeHash} = undef;
+
+ if (@{ $self->{rearrange} }) {
+ @{ $self->{rearrangeHash} }{ @{ $self->{rearrange} } } = ();
+ }
+
+ $self->{normCode} = undef;
+
+ if (defined $self->{normalization}) {
+ eval { require Unicode::Normalize };
+ $@ and croak "Unicode::Normalize is required to normalize strings";
+
+ $CVgetCombinClass ||= \&Unicode::Normalize::getCombinClass;
+
+ if ($self->{normalization} =~ /^(?:NF)D\z/) { # tweak for default
+ $self->{normCode} = \&Unicode::Normalize::NFD;
+ }
+ elsif ($self->{normalization} ne 'prenormalized') {
+ my $norm = $self->{normalization};
+ $self->{normCode} = sub {
+ Unicode::Normalize::normalize($norm, shift);
+ };
+ eval { $self->{normCode}->("") }; # try
+ $@ and croak "$PACKAGE unknown normalization form name: $norm";
+ }
+ }
+ return;
+}
+
+sub new
+{
+ my $class = shift;
+ my $self = bless { @_ }, $class;
+
+ # If undef is passed explicitly, no file is read.
+ $self->{table} = $KeyFile if ! exists $self->{table};
+ $self->read_table() if defined $self->{table};
+
+ if ($self->{entry}) {
+ while ($self->{entry} =~ /([^\n]+)/g) {
+ $self->parseEntry($1);
+ }
+ }
+
+ $self->{level} ||= MaxLevel;
+ $self->{UCA_Version} ||= UCA_Version();
+
+ $self->{overrideHangul} = FALSE
+ if ! exists $self->{overrideHangul};
+ $self->{overrideCJK} = FALSE
+ if ! exists $self->{overrideCJK};
+ $self->{normalization} = 'NFD'
+ if ! exists $self->{normalization};
+ $self->{rearrange} = $self->{rearrangeTable} ||
+ ($self->{UCA_Version} <= 11 ? $DefaultRearrange : [])
+ if ! exists $self->{rearrange};
+ $self->{backwards} = $self->{backwardsTable}
+ if ! exists $self->{backwards};
+
+ $self->checkCollator();
+
+ return $self;
+}
+
+sub read_table {
+ my $self = shift;
+
+ my($f, $fh);
+ foreach my $d (@INC) {
+ $f = File::Spec->catfile($d, @Path, $self->{table});
+ last if open($fh, $f);
+ $f = undef;
+ }
+ if (!defined $f) {
+ $f = File::Spec->catfile(@Path, $self->{table});
+ croak("$PACKAGE: Can't locate $f in \@INC (\@INC contains: @INC)");
+ }
+
+ while (my $line = <$fh>) {
+ next if $line =~ /^\s*#/;
+ unless ($line =~ s/^\s*\@//) {
+ $self->parseEntry($line);
+ next;
+ }
+
+ # matched ^\s*\@
+ if ($line =~ /^version\s*(\S*)/) {
+ $self->{versionTable} ||= $1;
+ }
+ elsif ($line =~ /^variable\s+(\S*)/) { # since UTS #10-9
+ $self->{variableTable} ||= $1;
+ }
+ elsif ($line =~ /^alternate\s+(\S*)/) { # till UTS #10-8
+ $self->{alternateTable} ||= $1;
+ }
+ elsif ($line =~ /^backwards\s+(\S*)/) {
+ push @{ $self->{backwardsTable} }, $1;
+ }
+ elsif ($line =~ /^forwards\s+(\S*)/) { # parhaps no use
+ push @{ $self->{forwardsTable} }, $1;
+ }
+ elsif ($line =~ /^rearrange\s+(.*)/) { # (\S*) is NG
+ push @{ $self->{rearrangeTable} }, _getHexArray($1);
+ }
+ }
+ close $fh;
+}
+
+
+##
+## get $line, parse it, and write an entry in $self
+##
+sub parseEntry
+{
+ my $self = shift;
+ my $line = shift;
+ my($name, $entry, @uv, @key);
+
+ return if $line !~ /^\s*[0-9A-Fa-f]/;
+
+ # removes comment and gets name
+ $name = $1
+ if $line =~ s/[#%]\s*(.*)//;
+ return if defined $self->{undefName} && $name =~ /$self->{undefName}/;
+
+ # gets element
+ my($e, $k) = split /;/, $line;
+ croak "Wrong Entry: <charList> must be separated by ';' from <collElement>"
+ if ! $k;
+
+ @uv = _getHexArray($e);
+ return if !@uv;
+
+ $entry = join(CODE_SEP, @uv); # in JCPS
+
+ if (defined $self->{undefChar} || defined $self->{ignoreChar}) {
+ my $ele = pack_U(@uv);
+
+ # regarded as if it were not entried in the table
+ return
+ if defined $self->{undefChar} && $ele =~ /$self->{undefChar}/;
+
+ # replaced as completely ignorable
+ $k = '[.0000.0000.0000.0000]'
+ if defined $self->{ignoreChar} && $ele =~ /$self->{ignoreChar}/;
+ }
+
+ # replaced as completely ignorable
+ $k = '[.0000.0000.0000.0000]'
+ if defined $self->{ignoreName} && $name =~ /$self->{ignoreName}/;
+
+ my $is_L3_ignorable = TRUE;
+
+ foreach my $arr ($k =~ /\[([^\[\]]+)\]/g) { # SPACEs allowed
+ my $var = $arr =~ /\*/; # exactly /^\*/ but be lenient.
+ my @wt = _getHexArray($arr);
+ push @key, pack(VCE_TEMPLATE, $var, @wt);
+ $is_L3_ignorable = FALSE
+ if $wt[0] || $wt[1] || $wt[2];
+ # Conformance Test for 3.1.1 and 4.0.0 shows Level 3 ignorable
+ # is completely ignorable.
+ # For expansion, an entry $is_L3_ignorable
+ # if and only if "all" CEs are [.0000.0000.0000].
+ }
+
+ $self->{mapping}{$entry} = $is_L3_ignorable ? [] : \@key;
+
+ if (@uv > 1) {
+ (!$self->{maxlength}{$uv[0]} || $self->{maxlength}{$uv[0]} < @uv)
+ and $self->{maxlength}{$uv[0]} = @uv;
+ }
+}
+
+
+##
+## VCE = _varCE(variable term, VCE)
+##
+sub _varCE
+{
+ my $vbl = shift;
+ my $vce = shift;
+ if ($vbl eq 'non-ignorable') {
+ return $vce;
+ }
+ my ($var, @wt) = unpack VCE_TEMPLATE, $vce;
+
+ if ($var) {
+ return pack(VCE_TEMPLATE, $var, 0, 0, 0,
+ $vbl eq 'blanked' ? $wt[3] : $wt[0]);
+ }
+ elsif ($vbl eq 'blanked') {
+ return $vce;
+ }
+ else {
+ return pack(VCE_TEMPLATE, $var, @wt[0..2],
+ $vbl eq 'shifted' && $wt[0]+$wt[1]+$wt[2] ? Shift4Wt : 0);
+ }
+}
+
+sub viewSortKey
+{
+ my $self = shift;
+ $self->visualizeSortKey($self->getSortKey(@_));
+}
+
+sub visualizeSortKey
+{
+ my $self = shift;
+ my $view = join " ", map sprintf("%04X", $_), unpack(KEY_TEMPLATE, shift);
+
+ if ($self->{UCA_Version} <= 8) {
+ $view =~ s/ ?0000 ?/|/g;
+ } else {
+ $view =~ s/\b0000\b/|/g;
+ }
+ return "[$view]";
+}
+
+
+##
+## arrayref of JCPS = splitEnt(string to be collated)
+## arrayref of arrayref[JCPS, ini_pos, fin_pos] = splitEnt(string, true)
+##
+sub splitEnt
+{
+ my $self = shift;
+ my $wLen = $_[1];
+
+ my $code = $self->{preprocess};
+ my $norm = $self->{normCode};
+ my $map = $self->{mapping};
+ my $max = $self->{maxlength};
+ my $reH = $self->{rearrangeHash};
+ my $ver9 = $self->{UCA_Version} >= 9 && $self->{UCA_Version} <= 11;
+
+ my ($str, @buf);
+
+ if ($wLen) {
+ $code and croak "Preprocess breaks character positions. "
+ . "Don't use with index(), match(), etc.";
+ $norm and croak "Normalization breaks character positions. "
+ . "Don't use with index(), match(), etc.";
+ $str = $_[0];
+ }
+ else {
+ $str = $_[0];
+ $str = &$code($str) if ref $code;
+ $str = &$norm($str) if ref $norm;
+ }
+
+ # get array of Unicode code point of string.
+ my @src = unpack_U($str);
+
+ # rearrangement:
+ # Character positions are not kept if rearranged,
+ # then neglected if $wLen is true.
+ if ($reH && ! $wLen) {
+ for (my $i = 0; $i < @src; $i++) {
+ if (exists $reH->{ $src[$i] } && $i + 1 < @src) {
+ ($src[$i], $src[$i+1]) = ($src[$i+1], $src[$i]);
+ $i++;
+ }
+ }
+ }
+
+ # remove a code point marked as a completely ignorable.
+ for (my $i = 0; $i < @src; $i++) {
+ $src[$i] = undef
+ if _isIllegal($src[$i]) || ($ver9 &&
+ $map->{ $src[$i] } && @{ $map->{ $src[$i] } } == 0);
+ }
+
+ for (my $i = 0; $i < @src; $i++) {
+ my $jcps = $src[$i];
+
+ # skip removed code point
+ if (! defined $jcps) {
+ if ($wLen && @buf) {
+ $buf[-1][2] = $i + 1;
+ }
+ next;
+ }
+
+ my $i_orig = $i;
+
+ # find contraction
+ if ($max->{$jcps}) {
+ my $temp_jcps = $jcps;
+ my $jcpsLen = 1;
+ my $maxLen = $max->{$jcps};
+
+ for (my $p = $i + 1; $jcpsLen < $maxLen && $p < @src; $p++) {
+ next if ! defined $src[$p];
+ $temp_jcps .= CODE_SEP . $src[$p];
+ $jcpsLen++;
+ if ($map->{$temp_jcps}) {
+ $jcps = $temp_jcps;
+ $i = $p;
+ }
+ }
+
+ # not-contiguous contraction with Combining Char (cf. UTS#10, S2.1).
+ # This process requires Unicode::Normalize.
+ # If "normalization" is undef, here should be skipped *always*
+ # (in spite of bool value of $CVgetCombinClass),
+ # since canonical ordering cannot be expected.
+ # Blocked combining character should not be contracted.
+
+ if ($self->{normalization})
+ # $self->{normCode} is false in the case of "prenormalized".
+ {
+ my $preCC = 0;
+ my $curCC = 0;
+
+ for (my $p = $i + 1; $p < @src; $p++) {
+ next if ! defined $src[$p];
+ $curCC = $CVgetCombinClass->($src[$p]);
+ last unless $curCC;
+ my $tail = CODE_SEP . $src[$p];
+ if ($preCC != $curCC && $map->{$jcps.$tail}) {
+ $jcps .= $tail;
+ $src[$p] = undef;
+ } else {
+ $preCC = $curCC;
+ }
+ }
+ }
+ }
+
+ # skip completely ignorable
+ if ($map->{$jcps} && @{ $map->{$jcps} } == 0) {
+ if ($wLen && @buf) {
+ $buf[-1][2] = $i + 1;
+ }
+ next;
+ }
+
+ push @buf, $wLen ? [$jcps, $i_orig, $i + 1] : $jcps;
+ }
+ return \@buf;
+}
+
+
+##
+## list of VCE = getWt(JCPS)
+##
+sub getWt
+{
+ my $self = shift;
+ my $u = shift;
+ my $vbl = $self->{variable};
+ my $map = $self->{mapping};
+ my $der = $self->{derivCode};
+
+ return if !defined $u;
+ return map(_varCE($vbl, $_), @{ $map->{$u} })
+ if $map->{$u};
+
+ # JCPS must not be a contraction, then it's a code point.
+ if (Hangul_SIni <= $u && $u <= Hangul_SFin) {
+ my $hang = $self->{overrideHangul};
+ my @hangulCE;
+ if ($hang) {
+ @hangulCE = map(pack(VCE_TEMPLATE, NON_VAR, @$_), &$hang($u));
+ }
+ elsif (!defined $hang) {
+ @hangulCE = $der->($u);
+ }
+ else {
+ my $max = $self->{maxlength};
+ my @decH = _decompHangul($u);
+
+ if (@decH == 2) {
+ my $contract = join(CODE_SEP, @decH);
+ @decH = ($contract) if $map->{$contract};
+ } else { # must be <@decH == 3>
+ if ($max->{$decH[0]}) {
+ my $contract = join(CODE_SEP, @decH);
+ if ($map->{$contract}) {
+ @decH = ($contract);
+ } else {
+ $contract = join(CODE_SEP, @decH[0,1]);
+ $map->{$contract} and @decH = ($contract, $decH[2]);
+ }
+ # even if V's ignorable, LT contraction is not supported.
+ # If such a situatution were required, NFD should be used.
+ }
+ if (@decH == 3 && $max->{$decH[1]}) {
+ my $contract = join(CODE_SEP, @decH[1,2]);
+ $map->{$contract} and @decH = ($decH[0], $contract);
+ }
+ }
+
+ @hangulCE = map({
+ $map->{$_} ? @{ $map->{$_} } : $der->($_);
+ } @decH);
+ }
+ return map _varCE($vbl, $_), @hangulCE;
+ }
+ elsif (_isUIdeo($u, $self->{UCA_Version})) {
+ my $cjk = $self->{overrideCJK};
+ return map _varCE($vbl, $_),
+ $cjk
+ ? map(pack(VCE_TEMPLATE, NON_VAR, @$_), &$cjk($u))
+ : defined $cjk && $self->{UCA_Version} <= 8 && $u < 0x10000
+ ? _uideoCE_8($u)
+ : $der->($u);
+ }
+ else {
+ return map _varCE($vbl, $_), $der->($u);
+ }
+}
+
+
+##
+## string sortkey = getSortKey(string arg)
+##
+sub getSortKey
+{
+ my $self = shift;
+ my $lev = $self->{level};
+ my $rEnt = $self->splitEnt(shift); # get an arrayref of JCPS
+ my $v2i = $self->{UCA_Version} >= 9 &&
+ $self->{variable} ne 'non-ignorable';
+
+ my @buf; # weight arrays
+ if ($self->{hangul_terminator}) {
+ my $preHST = '';
+ foreach my $jcps (@$rEnt) {
+ # weird things like VL, TL-contraction are not considered!
+ my $curHST = '';
+ foreach my $u (split /;/, $jcps) {
+ $curHST .= getHST($u);
+ }
+ if ($preHST && !$curHST || # hangul before non-hangul
+ $preHST =~ /L\z/ && $curHST =~ /^T/ ||
+ $preHST =~ /V\z/ && $curHST =~ /^L/ ||
+ $preHST =~ /T\z/ && $curHST =~ /^[LV]/) {
+
+ push @buf, $self->getWtHangulTerm();
+ }
+ $preHST = $curHST;
+
+ push @buf, $self->getWt($jcps);
+ }
+ $preHST # end at hangul
+ and push @buf, $self->getWtHangulTerm();
+ }
+ else {
+ foreach my $jcps (@$rEnt) {
+ push @buf, $self->getWt($jcps);
+ }
+ }
+
+ # make sort key
+ my @ret = ([],[],[],[]);
+ my $last_is_variable;
+
+ foreach my $vwt (@buf) {
+ my($var, @wt) = unpack(VCE_TEMPLATE, $vwt);
+
+ # "Ignorable (L1, L2) after Variable" since track. v. 9
+ if ($v2i) {
+ if ($var) {
+ $last_is_variable = TRUE;
+ }
+ elsif (!$wt[0]) { # ignorable
+ next if $last_is_variable;
+ }
+ else {
+ $last_is_variable = FALSE;
+ }
+ }
+ foreach my $v (0..$lev-1) {
+ 0 < $wt[$v] and push @{ $ret[$v] }, $wt[$v];
+ }
+ }
+
+ # modification of tertiary weights
+ if ($self->{upper_before_lower}) {
+ foreach my $w (@{ $ret[2] }) {
+ if (0x8 <= $w && $w <= 0xC) { $w -= 6 } # lower
+ elsif (0x2 <= $w && $w <= 0x6) { $w += 6 } # upper
+ elsif ($w == 0x1C) { $w += 1 } # square upper
+ elsif ($w == 0x1D) { $w -= 1 } # square lower
+ }
+ }
+ if ($self->{katakana_before_hiragana}) {
+ foreach my $w (@{ $ret[2] }) {
+ if (0x0F <= $w && $w <= 0x13) { $w -= 2 } # katakana
+ elsif (0x0D <= $w && $w <= 0x0E) { $w += 5 } # hiragana
+ }
+ }
+
+ if ($self->{backwardsFlag}) {
+ for (my $v = MinLevel; $v <= MaxLevel; $v++) {
+ if ($self->{backwardsFlag} & (1 << $v)) {
+ @{ $ret[$v-1] } = reverse @{ $ret[$v-1] };
+ }
+ }
+ }
+
+ join LEVEL_SEP, map pack(KEY_TEMPLATE, @$_), @ret;
+}
+
+
+##
+## int compare = cmp(string a, string b)
+##
+sub cmp { $_[0]->getSortKey($_[1]) cmp $_[0]->getSortKey($_[2]) }
+sub eq { $_[0]->getSortKey($_[1]) eq $_[0]->getSortKey($_[2]) }
+sub ne { $_[0]->getSortKey($_[1]) ne $_[0]->getSortKey($_[2]) }
+sub lt { $_[0]->getSortKey($_[1]) lt $_[0]->getSortKey($_[2]) }
+sub le { $_[0]->getSortKey($_[1]) le $_[0]->getSortKey($_[2]) }
+sub gt { $_[0]->getSortKey($_[1]) gt $_[0]->getSortKey($_[2]) }
+sub ge { $_[0]->getSortKey($_[1]) ge $_[0]->getSortKey($_[2]) }
+
+##
+## list[strings] sorted = sort(list[strings] arg)
+##
+sub sort {
+ my $obj = shift;
+ return
+ map { $_->[1] }
+ sort{ $a->[0] cmp $b->[0] }
+ map [ $obj->getSortKey($_), $_ ], @_;
+}
+
+
+sub _derivCE_14 {
+ my $u = shift;
+ my $base =
+ (CJK_UidIni <= $u && $u <= CJK_UidF41)
+ ? 0xFB40 : # CJK
+ (CJK_ExtAIni <= $u && $u <= CJK_ExtAFin ||
+ CJK_ExtBIni <= $u && $u <= CJK_ExtBFin)
+ ? 0xFB80 # CJK ext.
+ : 0xFBC0; # others
+
+ my $aaaa = $base + ($u >> 15);
+ my $bbbb = ($u & 0x7FFF) | 0x8000;
+ return
+ pack(VCE_TEMPLATE, NON_VAR, $aaaa, Min2Wt, Min3Wt, $u),
+ pack(VCE_TEMPLATE, NON_VAR, $bbbb, 0, 0, $u);
+}
+
+sub _derivCE_9 {
+ my $u = shift;
+ my $base =
+ (CJK_UidIni <= $u && $u <= CJK_UidFin)
+ ? 0xFB40 : # CJK
+ (CJK_ExtAIni <= $u && $u <= CJK_ExtAFin ||
+ CJK_ExtBIni <= $u && $u <= CJK_ExtBFin)
+ ? 0xFB80 # CJK ext.
+ : 0xFBC0; # others
+
+ my $aaaa = $base + ($u >> 15);
+ my $bbbb = ($u & 0x7FFF) | 0x8000;
+ return
+ pack(VCE_TEMPLATE, NON_VAR, $aaaa, Min2Wt, Min3Wt, $u),
+ pack(VCE_TEMPLATE, NON_VAR, $bbbb, 0, 0, $u);
+}
+
+sub _derivCE_8 {
+ my $code = shift;
+ my $aaaa = 0xFF80 + ($code >> 15);
+ my $bbbb = ($code & 0x7FFF) | 0x8000;
+ return
+ pack(VCE_TEMPLATE, NON_VAR, $aaaa, 2, 1, $code),
+ pack(VCE_TEMPLATE, NON_VAR, $bbbb, 0, 0, $code);
+}
+
+sub _uideoCE_8 {
+ my $u = shift;
+ return pack(VCE_TEMPLATE, NON_VAR, $u, Min2Wt, Min3Wt, $u);
+}
+
+sub _isUIdeo {
+ my ($u, $uca_vers) = @_;
+ return(
+ (CJK_UidIni <= $u &&
+ ($uca_vers >= 14 ? ( $u <= CJK_UidF41) : ($u <= CJK_UidFin)))
+ ||
+ (CJK_ExtAIni <= $u && $u <= CJK_ExtAFin)
+ ||
+ (CJK_ExtBIni <= $u && $u <= CJK_ExtBFin)
+ );
+}
+
+
+sub getWtHangulTerm {
+ my $self = shift;
+ return _varCE($self->{variable},
+ pack(VCE_TEMPLATE, NON_VAR, $self->{hangul_terminator}, 0,0,0));
+}
+
+
+##
+## "hhhh hhhh hhhh" to (dddd, dddd, dddd)
+##
+sub _getHexArray { map hex, $_[0] =~ /([0-9a-fA-F]+)/g }
+
+#
+# $code *must* be in Hangul syllable.
+# Check it before you enter here.
+#
+sub _decompHangul {
+ my $code = shift;
+ my $si = $code - Hangul_SBase;
+ my $li = int( $si / Hangul_NCount);
+ my $vi = int(($si % Hangul_NCount) / Hangul_TCount);
+ my $ti = $si % Hangul_TCount;
+ return (
+ Hangul_LBase + $li,
+ Hangul_VBase + $vi,
+ $ti ? (Hangul_TBase + $ti) : (),
+ );
+}
+
+sub _isIllegal {
+ my $code = shift;
+ return ! defined $code # removed
+ || ($code < 0 || 0x10FFFF < $code) # out of range
+ || (($code & 0xFFFE) == 0xFFFE) # ??FFF[EF] (cf. utf8.c)
+ || (0xD800 <= $code && $code <= 0xDFFF) # unpaired surrogates
+ || (0xFDD0 <= $code && $code <= 0xFDEF) # other non-characters
+ ;
+}
+
+# Hangul Syllable Type
+sub getHST {
+ my $u = shift;
+ return
+ Hangul_LIni <= $u && $u <= Hangul_LFin || $u == Hangul_LFill ? "L" :
+ Hangul_VIni <= $u && $u <= Hangul_VFin ? "V" :
+ Hangul_TIni <= $u && $u <= Hangul_TFin ? "T" :
+ Hangul_SIni <= $u && $u <= Hangul_SFin ?
+ ($u - Hangul_SBase) % Hangul_TCount ? "LVT" : "LV" : "";
+}
+
+
+##
+## bool _nonIgnorAtLevel(arrayref weights, int level)
+##
+sub _nonIgnorAtLevel($$)
+{
+ my $wt = shift;
+ return if ! defined $wt;
+ my $lv = shift;
+ return grep($wt->[$_-1] != 0, MinLevel..$lv) ? TRUE : FALSE;
+}
+
+##
+## bool _eqArray(
+## arrayref of arrayref[weights] source,
+## arrayref of arrayref[weights] substr,
+## int level)
+## * comparison of graphemes vs graphemes.
+## @$source >= @$substr must be true (check it before call this);
+##
+sub _eqArray($$$)
+{
+ my $source = shift;
+ my $substr = shift;
+ my $lev = shift;
+
+ for my $g (0..@$substr-1){
+ # Do the $g'th graphemes have the same number of AV weigths?
+ return if @{ $source->[$g] } != @{ $substr->[$g] };
+
+ for my $w (0..@{ $substr->[$g] }-1) {
+ for my $v (0..$lev-1) {
+ return if $source->[$g][$w][$v] != $substr->[$g][$w][$v];
+ }
+ }
+ }
+ return 1;
+}
+
+##
+## (int position, int length)
+## int position = index(string, substring, position, [undoc'ed grobal])
+##
+## With "grobal" (only for the list context),
+## returns list of arrayref[position, length].
+##
+sub index
+{
+ my $self = shift;
+ my $str = shift;
+ my $len = length($str);
+ my $subE = $self->splitEnt(shift);
+ my $pos = @_ ? shift : 0;
+ $pos = 0 if $pos < 0;
+ my $grob = shift;
+
+ my $lev = $self->{level};
+ my $v2i = $self->{UCA_Version} >= 9 &&
+ $self->{variable} ne 'non-ignorable';
+
+ if (! @$subE) {
+ my $temp = $pos <= 0 ? 0 : $len <= $pos ? $len : $pos;
+ return $grob
+ ? map([$_, 0], $temp..$len)
+ : wantarray ? ($temp,0) : $temp;
+ }
+ $len < $pos
+ and return wantarray ? () : NOMATCHPOS;
+ my $strE = $self->splitEnt($pos ? substr($str, $pos) : $str, TRUE);
+ @$strE
+ or return wantarray ? () : NOMATCHPOS;
+
+ my(@strWt, @iniPos, @finPos, @subWt, @g_ret);
+
+ my $last_is_variable;
+ for my $vwt (map $self->getWt($_), @$subE) {
+ my($var, @wt) = unpack(VCE_TEMPLATE, $vwt);
+ my $to_be_pushed = _nonIgnorAtLevel(\@wt,$lev);
+
+ # "Ignorable (L1, L2) after Variable" since track. v. 9
+ if ($v2i) {
+ if ($var) {
+ $last_is_variable = TRUE;
+ }
+ elsif (!$wt[0]) { # ignorable
+ $to_be_pushed = FALSE if $last_is_variable;
+ }
+ else {
+ $last_is_variable = FALSE;
+ }
+ }
+
+ if (@subWt && !$var && !$wt[0]) {
+ push @{ $subWt[-1] }, \@wt if $to_be_pushed;
+ } else {
+ push @subWt, [ \@wt ];
+ }
+ }
+
+ my $count = 0;
+ my $end = @$strE - 1;
+
+ $last_is_variable = FALSE; # reuse
+ for (my $i = 0; $i <= $end; ) { # no $i++
+ my $found_base = 0;
+
+ # fetch a grapheme
+ while ($i <= $end && $found_base == 0) {
+ for my $vwt ($self->getWt($strE->[$i][0])) {
+ my($var, @wt) = unpack(VCE_TEMPLATE, $vwt);
+ my $to_be_pushed = _nonIgnorAtLevel(\@wt,$lev);
+
+ # "Ignorable (L1, L2) after Variable" since track. v. 9
+ if ($v2i) {
+ if ($var) {
+ $last_is_variable = TRUE;
+ }
+ elsif (!$wt[0]) { # ignorable
+ $to_be_pushed = FALSE if $last_is_variable;
+ }
+ else {
+ $last_is_variable = FALSE;
+ }
+ }
+
+ if (@strWt && !$var && !$wt[0]) {
+ push @{ $strWt[-1] }, \@wt if $to_be_pushed;
+ $finPos[-1] = $strE->[$i][2];
+ } elsif ($to_be_pushed) {
+ push @strWt, [ \@wt ];
+ push @iniPos, $found_base ? NOMATCHPOS : $strE->[$i][1];
+ $finPos[-1] = NOMATCHPOS if $found_base;
+ push @finPos, $strE->[$i][2];
+ $found_base++;
+ }
+ # else ===> no-op
+ }
+ $i++;
+ }
+
+ # try to match
+ while ( @strWt > @subWt || (@strWt == @subWt && $i > $end) ) {
+ if ($iniPos[0] != NOMATCHPOS &&
+ $finPos[$#subWt] != NOMATCHPOS &&
+ _eqArray(\@strWt, \@subWt, $lev)) {
+ my $temp = $iniPos[0] + $pos;
+
+ if ($grob) {
+ push @g_ret, [$temp, $finPos[$#subWt] - $iniPos[0]];
+ splice @strWt, 0, $#subWt;
+ splice @iniPos, 0, $#subWt;
+ splice @finPos, 0, $#subWt;
+ }
+ else {
+ return wantarray
+ ? ($temp, $finPos[$#subWt] - $iniPos[0])
+ : $temp;
+ }
+ }
+ shift @strWt;
+ shift @iniPos;
+ shift @finPos;
+ }
+ }
+
+ return $grob
+ ? @g_ret
+ : wantarray ? () : NOMATCHPOS;
+}
+
+##
+## scalarref to matching part = match(string, substring)
+##
+sub match
+{
+ my $self = shift;
+ if (my($pos,$len) = $self->index($_[0], $_[1])) {
+ my $temp = substr($_[0], $pos, $len);
+ return wantarray ? $temp : \$temp;
+ # An lvalue ref \substr should be avoided,
+ # since its value is affected by modification of its referent.
+ }
+ else {
+ return;
+ }
+}
+
+##
+## arrayref matching parts = gmatch(string, substring)
+##
+sub gmatch
+{
+ my $self = shift;
+ my $str = shift;
+ my $sub = shift;
+ return map substr($str, $_->[0], $_->[1]),
+ $self->index($str, $sub, 0, 'g');
+}
+
+##
+## bool subst'ed = subst(string, substring, replace)
+##
+sub subst
+{
+ my $self = shift;
+ my $code = ref $_[2] eq 'CODE' ? $_[2] : FALSE;
+
+ if (my($pos,$len) = $self->index($_[0], $_[1])) {
+ if ($code) {
+ my $mat = substr($_[0], $pos, $len);
+ substr($_[0], $pos, $len, $code->($mat));
+ } else {
+ substr($_[0], $pos, $len, $_[2]);
+ }
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
+}
+
+##
+## int count = gsubst(string, substring, replace)
+##
+sub gsubst
+{
+ my $self = shift;
+ my $code = ref $_[2] eq 'CODE' ? $_[2] : FALSE;
+ my $cnt = 0;
+
+ # Replacement is carried out from the end, then use reverse.
+ for my $pos_len (reverse $self->index($_[0], $_[1], 0, 'g')) {
+ if ($code) {
+ my $mat = substr($_[0], $pos_len->[0], $pos_len->[1]);
+ substr($_[0], $pos_len->[0], $pos_len->[1], $code->($mat));
+ } else {
+ substr($_[0], $pos_len->[0], $pos_len->[1], $_[2]);
+ }
+ $cnt++;
+ }
+ return $cnt;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Unicode::Collate - Unicode Collation Algorithm
+
+=head1 SYNOPSIS
+
+ use Unicode::Collate;
+
+ #construct
+ $Collator = Unicode::Collate->new(%tailoring);
+
+ #sort
+ @sorted = $Collator->sort(@not_sorted);
+
+ #compare
+ $result = $Collator->cmp($a, $b); # returns 1, 0, or -1.
+
+ # If %tailoring is false (i.e. empty),
+ # $Collator should do the default collation.
+
+=head1 DESCRIPTION
+
+This module is an implementation of Unicode Technical Standard #10
+(a.k.a. UTS #10) - Unicode Collation Algorithm (a.k.a. UCA).
+
+=head2 Constructor and Tailoring
+
+The C<new> method returns a collator object.
+
+ $Collator = Unicode::Collate->new(
+ UCA_Version => $UCA_Version,
+ alternate => $alternate, # deprecated: use of 'variable' is recommended.
+ backwards => $levelNumber, # or \@levelNumbers
+ entry => $element,
+ hangul_terminator => $term_primary_weight,
+ ignoreName => qr/$ignoreName/,
+ ignoreChar => qr/$ignoreChar/,
+ katakana_before_hiragana => $bool,
+ level => $collationLevel,
+ normalization => $normalization_form,
+ overrideCJK => \&overrideCJK,
+ overrideHangul => \&overrideHangul,
+ preprocess => \&preprocess,
+ rearrange => \@charList,
+ table => $filename,
+ undefName => qr/$undefName/,
+ undefChar => qr/$undefChar/,
+ upper_before_lower => $bool,
+ variable => $variable,
+ );
+
+=over 4
+
+=item UCA_Version
+
+If the tracking version number of UCA is given,
+behavior of that tracking version is emulated on collating.
+If omitted, the return value of C<UCA_Version()> is used.
+C<UCA_Version()> should return the latest tracking version supported.
+
+The supported tracking version: 8, 9, 11, or 14.
+
+ UCA Unicode Standard DUCET (@version)
+ ---------------------------------------------------
+ 8 3.1 3.0.1 (3.0.1d9)
+ 9 3.1 with Corrigendum 3 3.1.1 (3.1.1)
+ 11 4.0 4.0.0 (4.0.0)
+ 14 4.1.0 4.1.0 (4.1.0)
+
+Note: Recent UTS #10 renames "Tracking Version" to "Revision."
+
+=item alternate
+
+-- see 3.2.2 Alternate Weighting, version 8 of UTS #10
+
+For backward compatibility, C<alternate> (old name) can be used
+as an alias for C<variable>.
+
+=item backwards
+
+-- see 3.1.2 French Accents, UTS #10.
+
+ backwards => $levelNumber or \@levelNumbers
+
+Weights in reverse order; ex. level 2 (diacritic ordering) in French.
+If omitted, forwards at all the levels.
+
+=item entry
+
+-- see 3.1 Linguistic Features; 3.2.1 File Format, UTS #10.
+
+If the same character (or a sequence of characters) exists
+in the collation element table through C<table>,
+mapping to collation elements is overrided.
+If it does not exist, the mapping is defined additionally.
+
+ entry => <<'ENTRY', # for DUCET v4.0.0 (allkeys-4.0.0.txt)
+0063 0068 ; [.0E6A.0020.0002.0063] # ch
+0043 0068 ; [.0E6A.0020.0007.0043] # Ch
+0043 0048 ; [.0E6A.0020.0008.0043] # CH
+006C 006C ; [.0F4C.0020.0002.006C] # ll
+004C 006C ; [.0F4C.0020.0007.004C] # Ll
+004C 004C ; [.0F4C.0020.0008.004C] # LL
+00F1 ; [.0F7B.0020.0002.00F1] # n-tilde
+006E 0303 ; [.0F7B.0020.0002.00F1] # n-tilde
+00D1 ; [.0F7B.0020.0008.00D1] # N-tilde
+004E 0303 ; [.0F7B.0020.0008.00D1] # N-tilde
+ENTRY
+
+ entry => <<'ENTRY', # for DUCET v4.0.0 (allkeys-4.0.0.txt)
+00E6 ; [.0E33.0020.0002.00E6][.0E8B.0020.0002.00E6] # ae ligature as <a><e>
+00C6 ; [.0E33.0020.0008.00C6][.0E8B.0020.0008.00C6] # AE ligature as <A><E>
+ENTRY
+
+B<NOTE:> The code point in the UCA file format (before C<';'>)
+B<must> be a Unicode code point (defined as hexadecimal),
+but not a native code point.
+So C<0063> must always denote C<U+0063>,
+but not a character of C<"\x63">.
+
+Weighting may vary depending on collation element table.
+So ensure the weights defined in C<entry> will be consistent with
+those in the collation element table loaded via C<table>.
+
+In DUCET v4.0.0, primary weight of C<C> is C<0E60>
+and that of C<D> is C<0E6D>. So setting primary weight of C<CH> to C<0E6A>
+(as a value between C<0E60> and C<0E6D>)
+makes ordering as C<C E<lt> CH E<lt> D>.
+Exactly speaking DUCET already has some characters between C<C> and C<D>:
+C<small capital C> (C<U+1D04>) with primary weight C<0E64>,
+C<c-hook/C-hook> (C<U+0188/U+0187>) with C<0E65>,
+and C<c-curl> (C<U+0255>) with C<0E69>.
+Then primary weight C<0E6A> for C<CH> makes C<CH>
+ordered between C<c-curl> and C<D>.
+
+=item hangul_terminator
+
+-- see 7.1.4 Trailing Weights, UTS #10.
+
+If a true value is given (non-zero but should be positive),
+it will be added as a terminator primary weight to the end of
+every standard Hangul syllable. Secondary and any higher weights
+for terminator are set to zero.
+If the value is false or C<hangul_terminator> key does not exist,
+insertion of terminator weights will not be performed.
+
+Boundaries of Hangul syllables are determined
+according to conjoining Jamo behavior in F<the Unicode Standard>
+and F<HangulSyllableType.txt>.
+
+B<Implementation Note:>
+(1) For expansion mapping (Unicode character mapped
+to a sequence of collation elements), a terminator will not be added
+between collation elements, even if Hangul syllable boundary exists there.
+Addition of terminator is restricted to the next position
+to the last collation element.
+
+(2) Non-conjoining Hangul letters
+(Compatibility Jamo, halfwidth Jamo, and enclosed letters) are not
+automatically terminated with a terminator primary weight.
+These characters may need terminator included in a collation element
+table beforehand.
+
+=item ignoreChar
+
+=item ignoreName
+
+-- see 3.2.2 Variable Weighting, UTS #10.
+
+Makes the entry in the table completely ignorable;
+i.e. as if the weights were zero at all level.
+
+Through C<ignoreChar>, any character matching C<qr/$ignoreChar/>
+will be ignored. Through C<ignoreName>, any character whose name
+(given in the C<table> file as a comment) matches C<qr/$ignoreName/>
+will be ignored.
+
+E.g. when 'a' and 'e' are ignorable,
+'element' is equal to 'lament' (or 'lmnt').
+
+=item katakana_before_hiragana
+
+-- see 7.3.1 Tertiary Weight Table, UTS #10.
+
+By default, hiragana is before katakana.
+If the parameter is made true, this is reversed.
+
+B<NOTE>: This parameter simplemindedly assumes that any hiragana/katakana
+distinctions must occur in level 3, and their weights at level 3 must be
+same as those mentioned in 7.3.1, UTS #10.
+If you define your collation elements which violate this requirement,
+this parameter does not work validly.
+
+=item level
+
+-- see 4.3 Form Sort Key, UTS #10.
+
+Set the maximum level.
+Any higher levels than the specified one are ignored.
+
+ Level 1: alphabetic ordering
+ Level 2: diacritic ordering
+ Level 3: case ordering
+ Level 4: tie-breaking (e.g. in the case when variable is 'shifted')
+
+ ex.level => 2,
+
+If omitted, the maximum is the 4th.
+
+=item normalization
+
+-- see 4.1 Normalize, UTS #10.
+
+If specified, strings are normalized before preparation of sort keys
+(the normalization is executed after preprocess).
+
+A form name C<Unicode::Normalize::normalize()> accepts will be applied
+as C<$normalization_form>.
+Acceptable names include C<'NFD'>, C<'NFC'>, C<'NFKD'>, and C<'NFKC'>.
+See C<Unicode::Normalize::normalize()> for detail.
+If omitted, C<'NFD'> is used.
+
+C<normalization> is performed after C<preprocess> (if defined).
+
+Furthermore, special values, C<undef> and C<"prenormalized">, can be used,
+though they are not concerned with C<Unicode::Normalize::normalize()>.
+
+If C<undef> (not a string C<"undef">) is passed explicitly
+as the value for this key,
+any normalization is not carried out (this may make tailoring easier
+if any normalization is not desired). Under C<(normalization =E<gt> undef)>,
+only contiguous contractions are resolved;
+e.g. even if C<A-ring> (and C<A-ring-cedilla>) is ordered after C<Z>,
+C<A-cedilla-ring> would be primary equal to C<A>.
+In this point,
+C<(normalization =E<gt> undef, preprocess =E<gt> sub { NFD(shift) })>
+B<is not> equivalent to C<(normalization =E<gt> 'NFD')>.
+
+In the case of C<(normalization =E<gt> "prenormalized")>,
+any normalization is not performed, but
+non-contiguous contractions with combining characters are performed.
+Therefore
+C<(normalization =E<gt> 'prenormalized', preprocess =E<gt> sub { NFD(shift) })>
+B<is> equivalent to C<(normalization =E<gt> 'NFD')>.
+If source strings are finely prenormalized,
+C<(normalization =E<gt> 'prenormalized')> may save time for normalization.
+
+Except C<(normalization =E<gt> undef)>,
+B<Unicode::Normalize> is required (see also B<CAVEAT>).
+
+=item overrideCJK
+
+-- see 7.1 Derived Collation Elements, UTS #10.
+
+By default, CJK Unified Ideographs are ordered in Unicode codepoint order
+but C<CJK Unified Ideographs> (if C<UCA_Version> is 8 to 11, its range is
+C<U+4E00..U+9FA5>; if C<UCA_Version> is 14, its range is C<U+4E00..U+9FBB>)
+are lesser than C<CJK Unified Ideographs Extension> (its range is
+C<U+3400..U+4DB5> and C<U+20000..U+2A6D6>).
+
+Through C<overrideCJK>, ordering of CJK Unified Ideographs can be overrided.
+
+ex. CJK Unified Ideographs in the JIS code point order.
+
+ overrideCJK => sub {
+ my $u = shift; # get a Unicode codepoint
+ my $b = pack('n', $u); # to UTF-16BE
+ my $s = your_unicode_to_sjis_converter($b); # convert
+ my $n = unpack('n', $s); # convert sjis to short
+ [ $n, 0x20, 0x2, $u ]; # return the collation element
+ },
+
+ex. ignores all CJK Unified Ideographs.
+
+ overrideCJK => sub {()}, # CODEREF returning empty list
+
+ # where ->eq("Pe\x{4E00}rl", "Perl") is true
+ # as U+4E00 is a CJK Unified Ideograph and to be ignorable.
+
+If C<undef> is passed explicitly as the value for this key,
+weights for CJK Unified Ideographs are treated as undefined.
+But assignment of weight for CJK Unified Ideographs
+in table or C<entry> is still valid.
+
+=item overrideHangul
+
+-- see 7.1 Derived Collation Elements, UTS #10.
+
+By default, Hangul Syllables are decomposed into Hangul Jamo,
+even if C<(normalization =E<gt> undef)>.
+But the mapping of Hangul Syllables may be overrided.
+
+This parameter works like C<overrideCJK>, so see there for examples.
+
+If you want to override the mapping of Hangul Syllables,
+NFD, NFKD, and FCD are not appropriate,
+since they will decompose Hangul Syllables before overriding.
+
+If C<undef> is passed explicitly as the value for this key,
+weight for Hangul Syllables is treated as undefined
+without decomposition into Hangul Jamo.
+But definition of weight for Hangul Syllables
+in table or C<entry> is still valid.
+
+=item preprocess
+
+-- see 5.1 Preprocessing, UTS #10.
+
+If specified, the coderef is used to preprocess
+before the formation of sort keys.
+
+ex. dropping English articles, such as "a" or "the".
+Then, "the pen" is before "a pencil".
+
+ preprocess => sub {
+ my $str = shift;
+ $str =~ s/\b(?:an?|the)\s+//gi;
+ return $str;
+ },
+
+C<preprocess> is performed before C<normalization> (if defined).
+
+=item rearrange
+
+-- see 3.1.3 Rearrangement, UTS #10.
+
+Characters that are not coded in logical order and to be rearranged.
+If C<UCA_Version> is equal to or lesser than 11, default is:
+
+ rearrange => [ 0x0E40..0x0E44, 0x0EC0..0x0EC4 ],
+
+If you want to disallow any rearrangement, pass C<undef> or C<[]>
+(a reference to empty list) as the value for this key.
+
+If C<UCA_Version> is equal to 14, default is C<[]> (i.e. no rearrangement).
+
+B<According to the version 9 of UCA, this parameter shall not be used;
+but it is not warned at present.>
+
+=item table
+
+-- see 3.2 Default Unicode Collation Element Table, UTS #10.
+
+You can use another collation element table if desired.
+
+The table file should locate in the F<Unicode/Collate> directory
+on C<@INC>. Say, if the filename is F<Foo.txt>,
+the table file is searched as F<Unicode/Collate/Foo.txt> in C<@INC>.
+
+By default, F<allkeys.txt> (as the filename of DUCET) is used.
+If you will prepare your own table file, any name other than F<allkeys.txt>
+may be better to avoid namespace conflict.
+
+If C<undef> is passed explicitly as the value for this key,
+no file is read (but you can define collation elements via C<entry>).
+
+A typical way to define a collation element table
+without any file of table:
+
+ $onlyABC = Unicode::Collate->new(
+ table => undef,
+ entry => << 'ENTRIES',
+0061 ; [.0101.0020.0002.0061] # LATIN SMALL LETTER A
+0041 ; [.0101.0020.0008.0041] # LATIN CAPITAL LETTER A
+0062 ; [.0102.0020.0002.0062] # LATIN SMALL LETTER B
+0042 ; [.0102.0020.0008.0042] # LATIN CAPITAL LETTER B
+0063 ; [.0103.0020.0002.0063] # LATIN SMALL LETTER C
+0043 ; [.0103.0020.0008.0043] # LATIN CAPITAL LETTER C
+ENTRIES
+ );
+
+If C<ignoreName> or C<undefName> is used, character names should be
+specified as a comment (following C<#>) on each line.
+
+=item undefChar
+
+=item undefName
+
+-- see 6.3.4 Reducing the Repertoire, UTS #10.
+
+Undefines the collation element as if it were unassigned in the table.
+This reduces the size of the table.
+If an unassigned character appears in the string to be collated,
+the sort key is made from its codepoint
+as a single-character collation element,
+as it is greater than any other assigned collation elements
+(in the codepoint order among the unassigned characters).
+But, it'd be better to ignore characters
+unfamiliar to you and maybe never used.
+
+Through C<undefChar>, any character matching C<qr/$undefChar/>
+will be undefined. Through C<undefName>, any character whose name
+(given in the C<table> file as a comment) matches C<qr/$undefName/>
+will be undefined.
+
+ex. Collation weights for beyond-BMP characters are not stored in object:
+
+ undefChar => qr/[^\0-\x{fffd}]/,
+
+=item upper_before_lower
+
+-- see 6.6 Case Comparisons, UTS #10.
+
+By default, lowercase is before uppercase.
+If the parameter is made true, this is reversed.
+
+B<NOTE>: This parameter simplemindedly assumes that any lowercase/uppercase
+distinctions must occur in level 3, and their weights at level 3 must be
+same as those mentioned in 7.3.1, UTS #10.
+If you define your collation elements which differs from this requirement,
+this parameter doesn't work validly.
+
+=item variable
+
+-- see 3.2.2 Variable Weighting, UTS #10.
+
+This key allows to variable weighting for variable collation elements,
+which are marked with an ASTERISK in the table
+(NOTE: Many punction marks and symbols are variable in F<allkeys.txt>).
+
+ variable => 'blanked', 'non-ignorable', 'shifted', or 'shift-trimmed'.
+
+These names are case-insensitive.
+By default (if specification is omitted), 'shifted' is adopted.
+
+ 'Blanked' Variable elements are made ignorable at levels 1 through 3;
+ considered at the 4th level.
+
+ 'Non-Ignorable' Variable elements are not reset to ignorable.
+
+ 'Shifted' Variable elements are made ignorable at levels 1 through 3
+ their level 4 weight is replaced by the old level 1 weight.
+ Level 4 weight for Non-Variable elements is 0xFFFF.
+
+ 'Shift-Trimmed' Same as 'shifted', but all FFFF's at the 4th level
+ are trimmed.
+
+=back
+
+=head2 Methods for Collation
+
+=over 4
+
+=item C<@sorted = $Collator-E<gt>sort(@not_sorted)>
+
+Sorts a list of strings.
+
+=item C<$result = $Collator-E<gt>cmp($a, $b)>
+
+Returns 1 (when C<$a> is greater than C<$b>)
+or 0 (when C<$a> is equal to C<$b>)
+or -1 (when C<$a> is lesser than C<$b>).
+
+=item C<$result = $Collator-E<gt>eq($a, $b)>
+
+=item C<$result = $Collator-E<gt>ne($a, $b)>
+
+=item C<$result = $Collator-E<gt>lt($a, $b)>
+
+=item C<$result = $Collator-E<gt>le($a, $b)>
+
+=item C<$result = $Collator-E<gt>gt($a, $b)>
+
+=item C<$result = $Collator-E<gt>ge($a, $b)>
+
+They works like the same name operators as theirs.
+
+ eq : whether $a is equal to $b.
+ ne : whether $a is not equal to $b.
+ lt : whether $a is lesser than $b.
+ le : whether $a is lesser than $b or equal to $b.
+ gt : whether $a is greater than $b.
+ ge : whether $a is greater than $b or equal to $b.
+
+=item C<$sortKey = $Collator-E<gt>getSortKey($string)>
+
+-- see 4.3 Form Sort Key, UTS #10.
+
+Returns a sort key.
+
+You compare the sort keys using a binary comparison
+and get the result of the comparison of the strings using UCA.
+
+ $Collator->getSortKey($a) cmp $Collator->getSortKey($b)
+
+ is equivalent to
+
+ $Collator->cmp($a, $b)
+
+=item C<$sortKeyForm = $Collator-E<gt>viewSortKey($string)>
+
+Converts a sorting key into its representation form.
+If C<UCA_Version> is 8, the output is slightly different.
+
+ use Unicode::Collate;
+ my $c = Unicode::Collate->new();
+ print $c->viewSortKey("Perl"),"\n";
+
+ # output:
+ # [0B67 0A65 0B7F 0B03 | 0020 0020 0020 0020 | 0008 0002 0002 0002 | FFFF FFFF FFFF FFFF]
+ # Level 1 Level 2 Level 3 Level 4
+
+=back
+
+=head2 Methods for Searching
+
+B<DISCLAIMER:> If C<preprocess> or C<normalization> parameter is true
+for C<$Collator>, calling these methods (C<index>, C<match>, C<gmatch>,
+C<subst>, C<gsubst>) is croaked,
+as the position and the length might differ
+from those on the specified string.
+(And C<rearrange> and C<hangul_terminator> parameters are neglected.)
+
+The C<match>, C<gmatch>, C<subst>, C<gsubst> methods work
+like C<m//>, C<m//g>, C<s///>, C<s///g>, respectively,
+but they are not aware of any pattern, but only a literal substring.
+
+=over 4
+
+=item C<$position = $Collator-E<gt>index($string, $substring[, $position])>
+
+=item C<($position, $length) = $Collator-E<gt>index($string, $substring[, $position])>
+
+If C<$substring> matches a part of C<$string>, returns
+the position of the first occurrence of the matching part in scalar context;
+in list context, returns a two-element list of
+the position and the length of the matching part.
+
+If C<$substring> does not match any part of C<$string>,
+returns C<-1> in scalar context and
+an empty list in list context.
+
+e.g. you say
+
+ my $Collator = Unicode::Collate->new( normalization => undef, level => 1 );
+ # (normalization => undef) is REQUIRED.
+ my $str = "Ich muß studieren Perl.";
+ my $sub = "MÜSS";
+ my $match;
+ if (my($pos,$len) = $Collator->index($str, $sub)) {
+ $match = substr($str, $pos, $len);
+ }
+
+and get C<"muß"> in C<$match> since C<"muß">
+is primary equal to C<"MÜSS">.
+
+=item C<$match_ref = $Collator-E<gt>match($string, $substring)>
+
+=item C<($match) = $Collator-E<gt>match($string, $substring)>
+
+If C<$substring> matches a part of C<$string>, in scalar context, returns
+B<a reference to> the first occurrence of the matching part
+(C<$match_ref> is always true if matches,
+since every reference is B<true>);
+in list context, returns the first occurrence of the matching part.
+
+If C<$substring> does not match any part of C<$string>,
+returns C<undef> in scalar context and
+an empty list in list context.
+
+e.g.
+
+ if ($match_ref = $Collator->match($str, $sub)) { # scalar context
+ print "matches [$$match_ref].\n";
+ } else {
+ print "doesn't match.\n";
+ }
+
+ or
+
+ if (($match) = $Collator->match($str, $sub)) { # list context
+ print "matches [$match].\n";
+ } else {
+ print "doesn't match.\n";
+ }
+
+=item C<@match = $Collator-E<gt>gmatch($string, $substring)>
+
+If C<$substring> matches a part of C<$string>, returns
+all the matching parts (or matching count in scalar context).
+
+If C<$substring> does not match any part of C<$string>,
+returns an empty list.
+
+=item C<$count = $Collator-E<gt>subst($string, $substring, $replacement)>
+
+If C<$substring> matches a part of C<$string>,
+the first occurrence of the matching part is replaced by C<$replacement>
+(C<$string> is modified) and return C<$count> (always equals to C<1>).
+
+C<$replacement> can be a C<CODEREF>,
+taking the matching part as an argument,
+and returning a string to replace the matching part
+(a bit similar to C<s/(..)/$coderef-E<gt>($1)/e>).
+
+=item C<$count = $Collator-E<gt>gsubst($string, $substring, $replacement)>
+
+If C<$substring> matches a part of C<$string>,
+all the occurrences of the matching part is replaced by C<$replacement>
+(C<$string> is modified) and return C<$count>.
+
+C<$replacement> can be a C<CODEREF>,
+taking the matching part as an argument,
+and returning a string to replace the matching part
+(a bit similar to C<s/(..)/$coderef-E<gt>($1)/eg>).
+
+e.g.
+
+ my $Collator = Unicode::Collate->new( normalization => undef, level => 1 );
+ # (normalization => undef) is REQUIRED.
+ my $str = "Camel donkey zebra came\x{301}l CAMEL horse cAm\0E\0L...";
+ $Collator->gsubst($str, "camel", sub { "<b>$_[0]</b>" });
+
+ # now $str is "<b>Camel</b> donkey zebra <b>came\x{301}l</b> <b>CAMEL</b> horse <b>cAm\0E\0L</b>...";
+ # i.e., all the camels are made bold-faced.
+
+=back
+
+=head2 Other Methods
+
+=over 4
+
+=item C<%old_tailoring = $Collator-E<gt>change(%new_tailoring)>
+
+Change the value of specified keys and returns the changed part.
+
+ $Collator = Unicode::Collate->new(level => 4);
+
+ $Collator->eq("perl", "PERL"); # false
+
+ %old = $Collator->change(level => 2); # returns (level => 4).
+
+ $Collator->eq("perl", "PERL"); # true
+
+ $Collator->change(%old); # returns (level => 2).
+
+ $Collator->eq("perl", "PERL"); # false
+
+Not all C<(key,value)>s are allowed to be changed.
+See also C<@Unicode::Collate::ChangeOK> and C<@Unicode::Collate::ChangeNG>.
+
+In the scalar context, returns the modified collator
+(but it is B<not> a clone from the original).
+
+ $Collator->change(level => 2)->eq("perl", "PERL"); # true
+
+ $Collator->eq("perl", "PERL"); # true; now max level is 2nd.
+
+ $Collator->change(level => 4)->eq("perl", "PERL"); # false
+
+=item C<$version = $Collator-E<gt>version()>
+
+Returns the version number (a string) of the Unicode Standard
+which the C<table> file used by the collator object is based on.
+If the table does not include a version line (starting with C<@version>),
+returns C<"unknown">.
+
+=item C<UCA_Version()>
+
+Returns the tracking version number of UTS #10 this module consults.
+
+=item C<Base_Unicode_Version()>
+
+Returns the version number of UTS #10 this module consults.
+
+=back
+
+=head1 EXPORT
+
+No method will be exported.
+
+=head1 INSTALL
+
+Though this module can be used without any C<table> file,
+to use this module easily, it is recommended to install a table file
+in the UCA format, by copying it under the directory
+<a place in @INC>/Unicode/Collate.
+
+The most preferable one is "The Default Unicode Collation Element Table"
+(aka DUCET), available from the Unicode Consortium's website:
+
+ http://www.unicode.org/Public/UCA/
+
+ http://www.unicode.org/Public/UCA/latest/allkeys.txt (latest version)
+
+If DUCET is not installed, it is recommended to copy the file
+from http://www.unicode.org/Public/UCA/latest/allkeys.txt
+to <a place in @INC>/Unicode/Collate/allkeys.txt
+manually.
+
+=head1 CAVEATS
+
+=over 4
+
+=item Normalization
+
+Use of the C<normalization> parameter requires the B<Unicode::Normalize>
+module (see L<Unicode::Normalize>).
+
+If you need not it (say, in the case when you need not
+handle any combining characters),
+assign C<normalization =E<gt> undef> explicitly.
+
+-- see 6.5 Avoiding Normalization, UTS #10.
+
+=item Conformance Test
+
+The Conformance Test for the UCA is available
+under L<http://www.unicode.org/Public/UCA/>.
+
+For F<CollationTest_SHIFTED.txt>,
+a collator via C<Unicode::Collate-E<gt>new( )> should be used;
+for F<CollationTest_NON_IGNORABLE.txt>, a collator via
+C<Unicode::Collate-E<gt>new(variable =E<gt> "non-ignorable", level =E<gt> 3)>.
+
+B<Unicode::Normalize is required to try The Conformance Test.>
+
+=back
+
+=head1 AUTHOR, COPYRIGHT AND LICENSE
+
+The Unicode::Collate module for perl was written by SADAHIRO Tomoyuki,
+<SADAHIRO@cpan.org>. This module is Copyright(C) 2001-2005,
+SADAHIRO Tomoyuki. Japan. All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+The file Unicode/Collate/allkeys.txt was copied directly
+from L<http://www.unicode.org/Public/UCA/4.1.0/allkeys.txt>.
+This file is Copyright (c) 1991-2005 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in L<http://www.unicode.org/copyright.html>.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Unicode Collation Algorithm - UTS #10
+
+L<http://www.unicode.org/reports/tr10/>
+
+=item The Default Unicode Collation Element Table (DUCET)
+
+L<http://www.unicode.org/Public/UCA/latest/allkeys.txt>
+
+=item The conformance test for the UCA
+
+L<http://www.unicode.org/Public/UCA/latest/CollationTest.html>
+
+L<http://www.unicode.org/Public/UCA/latest/CollationTest.zip>
+
+=item Hangul Syllable Type
+
+L<http://www.unicode.org/Public/UNIDATA/HangulSyllableType.txt>
+
+=item Unicode Normalization Forms - UAX #15
+
+L<http://www.unicode.org/reports/tr15/>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Unicode/Collate/allkeys.txt b/Master/tlpkg/tlperl.straw/lib/Unicode/Collate/allkeys.txt
new file mode 100755
index 00000000000..f4c63f890c1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Unicode/Collate/allkeys.txt
@@ -0,0 +1,18191 @@
+# allkeys-5.0.0.txt
+# Date: 2006-06-09, 15:29:02 PDT [KW]
+#
+# This file defines the Default Unicode Collation Element Table
+# (DUCET) for the Unicode Collation Algorithm
+#
+# Copyright (c) 2001-2006 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# See UTS #10, Unicode Collation Algorithm, for more information.
+#
+# Diagnostic weight ranges
+# Primary weight range: 0200..2D56 (11095)
+# Secondary weight range: 0020..01BF (416)
+# Variant secondaries: 0199..019E (6)
+# Digit secondaries: 019F..01BF (33)
+# Tertiary weight range: 0002..001F (30)
+#
+@version 5.0.0
+
+0000 ; [.0000.0000.0000.0000] # [0000] NULL (in 6429)
+0001 ; [.0000.0000.0000.0000] # [0001] START OF HEADING (in 6429)
+0002 ; [.0000.0000.0000.0000] # [0002] START OF TEXT (in 6429)
+0003 ; [.0000.0000.0000.0000] # [0003] END OF TEXT (in 6429)
+0004 ; [.0000.0000.0000.0000] # [0004] END OF TRANSMISSION (in 6429)
+0005 ; [.0000.0000.0000.0000] # [0005] ENQUIRY (in 6429)
+0006 ; [.0000.0000.0000.0000] # [0006] ACKNOWLEDGE (in 6429)
+0007 ; [.0000.0000.0000.0000] # [0007] BELL (in 6429)
+0008 ; [.0000.0000.0000.0000] # [0008] BACKSPACE (in 6429)
+000E ; [.0000.0000.0000.0000] # [000E] SHIFT OUT (in 6429)
+000F ; [.0000.0000.0000.0000] # [000F] SHIFT IN (in 6429)
+0010 ; [.0000.0000.0000.0000] # [0010] DATA LINK ESCAPE (in 6429)
+0011 ; [.0000.0000.0000.0000] # [0011] DEVICE CONTROL ONE (in 6429)
+0012 ; [.0000.0000.0000.0000] # [0012] DEVICE CONTROL TWO (in 6429)
+0013 ; [.0000.0000.0000.0000] # [0013] DEVICE CONTROL THREE (in 6429)
+0014 ; [.0000.0000.0000.0000] # [0014] DEVICE CONTROL FOUR (in 6429)
+0015 ; [.0000.0000.0000.0000] # [0015] NEGATIVE ACKNOWLEDGE (in 6429)
+0016 ; [.0000.0000.0000.0000] # [0016] SYNCHRONOUS IDLE (in 6429)
+0017 ; [.0000.0000.0000.0000] # [0017] END OF TRANSMISSION BLOCK (in 6429)
+0018 ; [.0000.0000.0000.0000] # [0018] CANCEL (in 6429)
+0019 ; [.0000.0000.0000.0000] # [0019] END OF MEDIUM (in 6429)
+001A ; [.0000.0000.0000.0000] # [001A] SUBSTITUTE (in 6429)
+001B ; [.0000.0000.0000.0000] # [001B] ESCAPE (in 6429)
+001C ; [.0000.0000.0000.0000] # [001C] FILE SEPARATOR (in 6429)
+001D ; [.0000.0000.0000.0000] # [001D] GROUP SEPARATOR (in 6429)
+001E ; [.0000.0000.0000.0000] # [001E] RECORD SEPARATOR (in 6429)
+001F ; [.0000.0000.0000.0000] # [001F] UNIT SEPARATOR (in 6429)
+007F ; [.0000.0000.0000.0000] # [007F] DELETE (in 6429)
+0080 ; [.0000.0000.0000.0000] # [0080] <control>
+0081 ; [.0000.0000.0000.0000] # [0081] <control>
+0082 ; [.0000.0000.0000.0000] # [0082] BREAK PERMITTED HERE (in 6429)
+0083 ; [.0000.0000.0000.0000] # [0083] NO BREAK HERE (in 6429)
+0084 ; [.0000.0000.0000.0000] # [0084] <control>
+0086 ; [.0000.0000.0000.0000] # [0086] START OF SELECTED AREA (in 6429)
+0087 ; [.0000.0000.0000.0000] # [0087] END OF SELECTED AREA (in 6429)
+0088 ; [.0000.0000.0000.0000] # [0088] CHARACTER TABULATION SET (in 6429)
+0089 ; [.0000.0000.0000.0000] # [0089] CHARACTER TABULATION WITH JUSTIFICATION (in 6429)
+008A ; [.0000.0000.0000.0000] # [008A] LINE TABULATION SET (in 6429)
+008B ; [.0000.0000.0000.0000] # [008B] PARTIAL LINE FORWARD (in 6429)
+008C ; [.0000.0000.0000.0000] # [008C] PARTIAL LINE BACKWARD (in 6429)
+008D ; [.0000.0000.0000.0000] # [008D] PARTIAL LINE FEED (in 6429)
+008E ; [.0000.0000.0000.0000] # [008E] SINGLE SHIFT TWO (in 6429)
+008F ; [.0000.0000.0000.0000] # [008F] SINGLE SHIFT THREE (in 6429)
+0090 ; [.0000.0000.0000.0000] # [0090] DEVICE CONTROL STRING (in 6429)
+0091 ; [.0000.0000.0000.0000] # [0091] PRIVATE USE ONE (in 6429)
+0092 ; [.0000.0000.0000.0000] # [0092] PRIVATE USE TWO (in 6429)
+0093 ; [.0000.0000.0000.0000] # [0093] SET TRANSMIT STATE (in 6429)
+0094 ; [.0000.0000.0000.0000] # [0094] CANCEL CHARACTER (in 6429)
+0095 ; [.0000.0000.0000.0000] # [0095] MESSAGE WAITING (in 6429)
+0096 ; [.0000.0000.0000.0000] # [0096] START OF GUARDED AREA (in 6429)
+0097 ; [.0000.0000.0000.0000] # [0097] END OF GUARDED AREA (in 6429)
+0098 ; [.0000.0000.0000.0000] # [0098] START OF STRING (in 6429)
+0099 ; [.0000.0000.0000.0000] # [0099] <control>
+009A ; [.0000.0000.0000.0000] # [009A] SINGLE CHARACTER INTRODUCER (in 6429)
+009B ; [.0000.0000.0000.0000] # [009B] CONTROL SEQUENCE INTRODUCER (in 6429)
+009C ; [.0000.0000.0000.0000] # [009C] STRING TERMINATOR (in 6429)
+009D ; [.0000.0000.0000.0000] # [009D] OPERATING SYSTEM COMMAND (in 6429)
+009E ; [.0000.0000.0000.0000] # [009E] PRIVACY MESSAGE (in 6429)
+009F ; [.0000.0000.0000.0000] # [009F] APPLICATION PROGRAM COMMAND (in 6429)
+070F ; [.0000.0000.0000.0000] # [070F] SYRIAC ABBREVIATION MARK
+180B ; [.0000.0000.0000.0000] # [180B] MONGOLIAN FREE VARIATION SELECTOR ONE
+180C ; [.0000.0000.0000.0000] # [180C] MONGOLIAN FREE VARIATION SELECTOR TWO
+180D ; [.0000.0000.0000.0000] # [180D] MONGOLIAN FREE VARIATION SELECTOR THREE
+180E ; [.0000.0000.0000.0000] # [180E] MONGOLIAN VOWEL SEPARATOR
+200B ; [.0000.0000.0000.0000] # [200B] ZERO WIDTH SPACE
+200C ; [.0000.0000.0000.0000] # [200C] ZERO WIDTH NON-JOINER
+200D ; [.0000.0000.0000.0000] # [200D] ZERO WIDTH JOINER
+200E ; [.0000.0000.0000.0000] # [200E] LEFT-TO-RIGHT MARK
+200F ; [.0000.0000.0000.0000] # [200F] RIGHT-TO-LEFT MARK
+202A ; [.0000.0000.0000.0000] # [202A] LEFT-TO-RIGHT EMBEDDING
+202B ; [.0000.0000.0000.0000] # [202B] RIGHT-TO-LEFT EMBEDDING
+202C ; [.0000.0000.0000.0000] # [202C] POP DIRECTIONAL FORMATTING
+202D ; [.0000.0000.0000.0000] # [202D] LEFT-TO-RIGHT OVERRIDE
+202E ; [.0000.0000.0000.0000] # [202E] RIGHT-TO-LEFT OVERRIDE
+2060 ; [.0000.0000.0000.0000] # [2060] WORD JOINER
+206A ; [.0000.0000.0000.0000] # [206A] INHIBIT SYMMETRIC SWAPPING
+206B ; [.0000.0000.0000.0000] # [206B] ACTIVATE SYMMETRIC SWAPPING
+206C ; [.0000.0000.0000.0000] # [206C] INHIBIT ARABIC FORM SHAPING
+206D ; [.0000.0000.0000.0000] # [206D] ACTIVATE ARABIC FORM SHAPING
+206E ; [.0000.0000.0000.0000] # [206E] NATIONAL DIGIT SHAPES
+206F ; [.0000.0000.0000.0000] # [206F] NOMINAL DIGIT SHAPES
+FE00 ; [.0000.0000.0000.0000] # [FE00] VARIATION SELECTOR-1
+FE01 ; [.0000.0000.0000.0000] # [FE01] VARIATION SELECTOR-2
+FE02 ; [.0000.0000.0000.0000] # [FE02] VARIATION SELECTOR-3
+FE03 ; [.0000.0000.0000.0000] # [FE03] VARIATION SELECTOR-4
+FE04 ; [.0000.0000.0000.0000] # [FE04] VARIATION SELECTOR-5
+FE05 ; [.0000.0000.0000.0000] # [FE05] VARIATION SELECTOR-6
+FE06 ; [.0000.0000.0000.0000] # [FE06] VARIATION SELECTOR-7
+FE07 ; [.0000.0000.0000.0000] # [FE07] VARIATION SELECTOR-8
+FE08 ; [.0000.0000.0000.0000] # [FE08] VARIATION SELECTOR-9
+FE09 ; [.0000.0000.0000.0000] # [FE09] VARIATION SELECTOR-10
+FE0A ; [.0000.0000.0000.0000] # [FE0A] VARIATION SELECTOR-11
+FE0B ; [.0000.0000.0000.0000] # [FE0B] VARIATION SELECTOR-12
+FE0C ; [.0000.0000.0000.0000] # [FE0C] VARIATION SELECTOR-13
+FE0D ; [.0000.0000.0000.0000] # [FE0D] VARIATION SELECTOR-14
+FE0E ; [.0000.0000.0000.0000] # [FE0E] VARIATION SELECTOR-15
+FE0F ; [.0000.0000.0000.0000] # [FE0F] VARIATION SELECTOR-16
+FEFF ; [.0000.0000.0000.0000] # [FEFF] ZERO WIDTH NO-BREAK SPACE
+FFF9 ; [.0000.0000.0000.0000] # [FFF9] INTERLINEAR ANNOTATION ANCHOR
+FFFA ; [.0000.0000.0000.0000] # [FFFA] INTERLINEAR ANNOTATION SEPARATOR
+FFFB ; [.0000.0000.0000.0000] # [FFFB] INTERLINEAR ANNOTATION TERMINATOR
+1D173 ; [.0000.0000.0000.0000] # [1D173] MUSICAL SYMBOL BEGIN BEAM
+1D174 ; [.0000.0000.0000.0000] # [1D174] MUSICAL SYMBOL END BEAM
+1D175 ; [.0000.0000.0000.0000] # [1D175] MUSICAL SYMBOL BEGIN TIE
+1D176 ; [.0000.0000.0000.0000] # [1D176] MUSICAL SYMBOL END TIE
+1D177 ; [.0000.0000.0000.0000] # [1D177] MUSICAL SYMBOL BEGIN SLUR
+1D178 ; [.0000.0000.0000.0000] # [1D178] MUSICAL SYMBOL END SLUR
+1D179 ; [.0000.0000.0000.0000] # [1D179] MUSICAL SYMBOL BEGIN PHRASE
+1D17A ; [.0000.0000.0000.0000] # [1D17A] MUSICAL SYMBOL END PHRASE
+E0001 ; [.0000.0000.0000.0000] # [E0001] LANGUAGE TAG
+E0020 ; [.0000.0000.0000.0000] # [E0020] TAG SPACE
+E0021 ; [.0000.0000.0000.0000] # [E0021] TAG EXCLAMATION MARK
+E0022 ; [.0000.0000.0000.0000] # [E0022] TAG QUOTATION MARK
+E0023 ; [.0000.0000.0000.0000] # [E0023] TAG NUMBER SIGN
+E0024 ; [.0000.0000.0000.0000] # [E0024] TAG DOLLAR SIGN
+E0025 ; [.0000.0000.0000.0000] # [E0025] TAG PERCENT SIGN
+E0026 ; [.0000.0000.0000.0000] # [E0026] TAG AMPERSAND
+E0027 ; [.0000.0000.0000.0000] # [E0027] TAG APOSTROPHE
+E0028 ; [.0000.0000.0000.0000] # [E0028] TAG LEFT PARENTHESIS
+E0029 ; [.0000.0000.0000.0000] # [E0029] TAG RIGHT PARENTHESIS
+E002A ; [.0000.0000.0000.0000] # [E002A] TAG ASTERISK
+E002B ; [.0000.0000.0000.0000] # [E002B] TAG PLUS SIGN
+E002C ; [.0000.0000.0000.0000] # [E002C] TAG COMMA
+E002D ; [.0000.0000.0000.0000] # [E002D] TAG HYPHEN-MINUS
+E002E ; [.0000.0000.0000.0000] # [E002E] TAG FULL STOP
+E002F ; [.0000.0000.0000.0000] # [E002F] TAG SOLIDUS
+E0030 ; [.0000.0000.0000.0000] # [E0030] TAG DIGIT ZERO
+E0031 ; [.0000.0000.0000.0000] # [E0031] TAG DIGIT ONE
+E0032 ; [.0000.0000.0000.0000] # [E0032] TAG DIGIT TWO
+E0033 ; [.0000.0000.0000.0000] # [E0033] TAG DIGIT THREE
+E0034 ; [.0000.0000.0000.0000] # [E0034] TAG DIGIT FOUR
+E0035 ; [.0000.0000.0000.0000] # [E0035] TAG DIGIT FIVE
+E0036 ; [.0000.0000.0000.0000] # [E0036] TAG DIGIT SIX
+E0037 ; [.0000.0000.0000.0000] # [E0037] TAG DIGIT SEVEN
+E0038 ; [.0000.0000.0000.0000] # [E0038] TAG DIGIT EIGHT
+E0039 ; [.0000.0000.0000.0000] # [E0039] TAG DIGIT NINE
+E003A ; [.0000.0000.0000.0000] # [E003A] TAG COLON
+E003B ; [.0000.0000.0000.0000] # [E003B] TAG SEMICOLON
+E003C ; [.0000.0000.0000.0000] # [E003C] TAG LESS-THAN SIGN
+E003D ; [.0000.0000.0000.0000] # [E003D] TAG EQUALS SIGN
+E003E ; [.0000.0000.0000.0000] # [E003E] TAG GREATER-THAN SIGN
+E003F ; [.0000.0000.0000.0000] # [E003F] TAG QUESTION MARK
+E0040 ; [.0000.0000.0000.0000] # [E0040] TAG COMMERCIAL AT
+E0041 ; [.0000.0000.0000.0000] # [E0041] TAG LATIN CAPITAL LETTER A
+E0042 ; [.0000.0000.0000.0000] # [E0042] TAG LATIN CAPITAL LETTER B
+E0043 ; [.0000.0000.0000.0000] # [E0043] TAG LATIN CAPITAL LETTER C
+E0044 ; [.0000.0000.0000.0000] # [E0044] TAG LATIN CAPITAL LETTER D
+E0045 ; [.0000.0000.0000.0000] # [E0045] TAG LATIN CAPITAL LETTER E
+E0046 ; [.0000.0000.0000.0000] # [E0046] TAG LATIN CAPITAL LETTER F
+E0047 ; [.0000.0000.0000.0000] # [E0047] TAG LATIN CAPITAL LETTER G
+E0048 ; [.0000.0000.0000.0000] # [E0048] TAG LATIN CAPITAL LETTER H
+E0049 ; [.0000.0000.0000.0000] # [E0049] TAG LATIN CAPITAL LETTER I
+E004A ; [.0000.0000.0000.0000] # [E004A] TAG LATIN CAPITAL LETTER J
+E004B ; [.0000.0000.0000.0000] # [E004B] TAG LATIN CAPITAL LETTER K
+E004C ; [.0000.0000.0000.0000] # [E004C] TAG LATIN CAPITAL LETTER L
+E004D ; [.0000.0000.0000.0000] # [E004D] TAG LATIN CAPITAL LETTER M
+E004E ; [.0000.0000.0000.0000] # [E004E] TAG LATIN CAPITAL LETTER N
+E004F ; [.0000.0000.0000.0000] # [E004F] TAG LATIN CAPITAL LETTER O
+E0050 ; [.0000.0000.0000.0000] # [E0050] TAG LATIN CAPITAL LETTER P
+E0051 ; [.0000.0000.0000.0000] # [E0051] TAG LATIN CAPITAL LETTER Q
+E0052 ; [.0000.0000.0000.0000] # [E0052] TAG LATIN CAPITAL LETTER R
+E0053 ; [.0000.0000.0000.0000] # [E0053] TAG LATIN CAPITAL LETTER S
+E0054 ; [.0000.0000.0000.0000] # [E0054] TAG LATIN CAPITAL LETTER T
+E0055 ; [.0000.0000.0000.0000] # [E0055] TAG LATIN CAPITAL LETTER U
+E0056 ; [.0000.0000.0000.0000] # [E0056] TAG LATIN CAPITAL LETTER V
+E0057 ; [.0000.0000.0000.0000] # [E0057] TAG LATIN CAPITAL LETTER W
+E0058 ; [.0000.0000.0000.0000] # [E0058] TAG LATIN CAPITAL LETTER X
+E0059 ; [.0000.0000.0000.0000] # [E0059] TAG LATIN CAPITAL LETTER Y
+E005A ; [.0000.0000.0000.0000] # [E005A] TAG LATIN CAPITAL LETTER Z
+E005B ; [.0000.0000.0000.0000] # [E005B] TAG LEFT SQUARE BRACKET
+E005C ; [.0000.0000.0000.0000] # [E005C] TAG REVERSE SOLIDUS
+E005D ; [.0000.0000.0000.0000] # [E005D] TAG RIGHT SQUARE BRACKET
+E005E ; [.0000.0000.0000.0000] # [E005E] TAG CIRCUMFLEX ACCENT
+E005F ; [.0000.0000.0000.0000] # [E005F] TAG LOW LINE
+E0060 ; [.0000.0000.0000.0000] # [E0060] TAG GRAVE ACCENT
+E0061 ; [.0000.0000.0000.0000] # [E0061] TAG LATIN SMALL LETTER A
+E0062 ; [.0000.0000.0000.0000] # [E0062] TAG LATIN SMALL LETTER B
+E0063 ; [.0000.0000.0000.0000] # [E0063] TAG LATIN SMALL LETTER C
+E0064 ; [.0000.0000.0000.0000] # [E0064] TAG LATIN SMALL LETTER D
+E0065 ; [.0000.0000.0000.0000] # [E0065] TAG LATIN SMALL LETTER E
+E0066 ; [.0000.0000.0000.0000] # [E0066] TAG LATIN SMALL LETTER F
+E0067 ; [.0000.0000.0000.0000] # [E0067] TAG LATIN SMALL LETTER G
+E0068 ; [.0000.0000.0000.0000] # [E0068] TAG LATIN SMALL LETTER H
+E0069 ; [.0000.0000.0000.0000] # [E0069] TAG LATIN SMALL LETTER I
+E006A ; [.0000.0000.0000.0000] # [E006A] TAG LATIN SMALL LETTER J
+E006B ; [.0000.0000.0000.0000] # [E006B] TAG LATIN SMALL LETTER K
+E006C ; [.0000.0000.0000.0000] # [E006C] TAG LATIN SMALL LETTER L
+E006D ; [.0000.0000.0000.0000] # [E006D] TAG LATIN SMALL LETTER M
+E006E ; [.0000.0000.0000.0000] # [E006E] TAG LATIN SMALL LETTER N
+E006F ; [.0000.0000.0000.0000] # [E006F] TAG LATIN SMALL LETTER O
+E0070 ; [.0000.0000.0000.0000] # [E0070] TAG LATIN SMALL LETTER P
+E0071 ; [.0000.0000.0000.0000] # [E0071] TAG LATIN SMALL LETTER Q
+E0072 ; [.0000.0000.0000.0000] # [E0072] TAG LATIN SMALL LETTER R
+E0073 ; [.0000.0000.0000.0000] # [E0073] TAG LATIN SMALL LETTER S
+E0074 ; [.0000.0000.0000.0000] # [E0074] TAG LATIN SMALL LETTER T
+E0075 ; [.0000.0000.0000.0000] # [E0075] TAG LATIN SMALL LETTER U
+E0076 ; [.0000.0000.0000.0000] # [E0076] TAG LATIN SMALL LETTER V
+E0077 ; [.0000.0000.0000.0000] # [E0077] TAG LATIN SMALL LETTER W
+E0078 ; [.0000.0000.0000.0000] # [E0078] TAG LATIN SMALL LETTER X
+E0079 ; [.0000.0000.0000.0000] # [E0079] TAG LATIN SMALL LETTER Y
+E007A ; [.0000.0000.0000.0000] # [E007A] TAG LATIN SMALL LETTER Z
+E007B ; [.0000.0000.0000.0000] # [E007B] TAG LEFT CURLY BRACKET
+E007C ; [.0000.0000.0000.0000] # [E007C] TAG VERTICAL LINE
+E007D ; [.0000.0000.0000.0000] # [E007D] TAG RIGHT CURLY BRACKET
+E007E ; [.0000.0000.0000.0000] # [E007E] TAG TILDE
+E007F ; [.0000.0000.0000.0000] # [E007F] CANCEL TAG
+E0100 ; [.0000.0000.0000.0000] # [E0100] VARIATION SELECTOR-17
+E0101 ; [.0000.0000.0000.0000] # [E0101] VARIATION SELECTOR-18
+E0102 ; [.0000.0000.0000.0000] # [E0102] VARIATION SELECTOR-19
+E0103 ; [.0000.0000.0000.0000] # [E0103] VARIATION SELECTOR-20
+E0104 ; [.0000.0000.0000.0000] # [E0104] VARIATION SELECTOR-21
+E0105 ; [.0000.0000.0000.0000] # [E0105] VARIATION SELECTOR-22
+E0106 ; [.0000.0000.0000.0000] # [E0106] VARIATION SELECTOR-23
+E0107 ; [.0000.0000.0000.0000] # [E0107] VARIATION SELECTOR-24
+E0108 ; [.0000.0000.0000.0000] # [E0108] VARIATION SELECTOR-25
+E0109 ; [.0000.0000.0000.0000] # [E0109] VARIATION SELECTOR-26
+E010A ; [.0000.0000.0000.0000] # [E010A] VARIATION SELECTOR-27
+E010B ; [.0000.0000.0000.0000] # [E010B] VARIATION SELECTOR-28
+E010C ; [.0000.0000.0000.0000] # [E010C] VARIATION SELECTOR-29
+E010D ; [.0000.0000.0000.0000] # [E010D] VARIATION SELECTOR-30
+E010E ; [.0000.0000.0000.0000] # [E010E] VARIATION SELECTOR-31
+E010F ; [.0000.0000.0000.0000] # [E010F] VARIATION SELECTOR-32
+E0110 ; [.0000.0000.0000.0000] # [E0110] VARIATION SELECTOR-33
+E0111 ; [.0000.0000.0000.0000] # [E0111] VARIATION SELECTOR-34
+E0112 ; [.0000.0000.0000.0000] # [E0112] VARIATION SELECTOR-35
+E0113 ; [.0000.0000.0000.0000] # [E0113] VARIATION SELECTOR-36
+E0114 ; [.0000.0000.0000.0000] # [E0114] VARIATION SELECTOR-37
+E0115 ; [.0000.0000.0000.0000] # [E0115] VARIATION SELECTOR-38
+E0116 ; [.0000.0000.0000.0000] # [E0116] VARIATION SELECTOR-39
+E0117 ; [.0000.0000.0000.0000] # [E0117] VARIATION SELECTOR-40
+E0118 ; [.0000.0000.0000.0000] # [E0118] VARIATION SELECTOR-41
+E0119 ; [.0000.0000.0000.0000] # [E0119] VARIATION SELECTOR-42
+E011A ; [.0000.0000.0000.0000] # [E011A] VARIATION SELECTOR-43
+E011B ; [.0000.0000.0000.0000] # [E011B] VARIATION SELECTOR-44
+E011C ; [.0000.0000.0000.0000] # [E011C] VARIATION SELECTOR-45
+E011D ; [.0000.0000.0000.0000] # [E011D] VARIATION SELECTOR-46
+E011E ; [.0000.0000.0000.0000] # [E011E] VARIATION SELECTOR-47
+E011F ; [.0000.0000.0000.0000] # [E011F] VARIATION SELECTOR-48
+E0120 ; [.0000.0000.0000.0000] # [E0120] VARIATION SELECTOR-49
+E0121 ; [.0000.0000.0000.0000] # [E0121] VARIATION SELECTOR-50
+E0122 ; [.0000.0000.0000.0000] # [E0122] VARIATION SELECTOR-51
+E0123 ; [.0000.0000.0000.0000] # [E0123] VARIATION SELECTOR-52
+E0124 ; [.0000.0000.0000.0000] # [E0124] VARIATION SELECTOR-53
+E0125 ; [.0000.0000.0000.0000] # [E0125] VARIATION SELECTOR-54
+E0126 ; [.0000.0000.0000.0000] # [E0126] VARIATION SELECTOR-55
+E0127 ; [.0000.0000.0000.0000] # [E0127] VARIATION SELECTOR-56
+E0128 ; [.0000.0000.0000.0000] # [E0128] VARIATION SELECTOR-57
+E0129 ; [.0000.0000.0000.0000] # [E0129] VARIATION SELECTOR-58
+E012A ; [.0000.0000.0000.0000] # [E012A] VARIATION SELECTOR-59
+E012B ; [.0000.0000.0000.0000] # [E012B] VARIATION SELECTOR-60
+E012C ; [.0000.0000.0000.0000] # [E012C] VARIATION SELECTOR-61
+E012D ; [.0000.0000.0000.0000] # [E012D] VARIATION SELECTOR-62
+E012E ; [.0000.0000.0000.0000] # [E012E] VARIATION SELECTOR-63
+E012F ; [.0000.0000.0000.0000] # [E012F] VARIATION SELECTOR-64
+E0130 ; [.0000.0000.0000.0000] # [E0130] VARIATION SELECTOR-65
+E0131 ; [.0000.0000.0000.0000] # [E0131] VARIATION SELECTOR-66
+E0132 ; [.0000.0000.0000.0000] # [E0132] VARIATION SELECTOR-67
+E0133 ; [.0000.0000.0000.0000] # [E0133] VARIATION SELECTOR-68
+E0134 ; [.0000.0000.0000.0000] # [E0134] VARIATION SELECTOR-69
+E0135 ; [.0000.0000.0000.0000] # [E0135] VARIATION SELECTOR-70
+E0136 ; [.0000.0000.0000.0000] # [E0136] VARIATION SELECTOR-71
+E0137 ; [.0000.0000.0000.0000] # [E0137] VARIATION SELECTOR-72
+E0138 ; [.0000.0000.0000.0000] # [E0138] VARIATION SELECTOR-73
+E0139 ; [.0000.0000.0000.0000] # [E0139] VARIATION SELECTOR-74
+E013A ; [.0000.0000.0000.0000] # [E013A] VARIATION SELECTOR-75
+E013B ; [.0000.0000.0000.0000] # [E013B] VARIATION SELECTOR-76
+E013C ; [.0000.0000.0000.0000] # [E013C] VARIATION SELECTOR-77
+E013D ; [.0000.0000.0000.0000] # [E013D] VARIATION SELECTOR-78
+E013E ; [.0000.0000.0000.0000] # [E013E] VARIATION SELECTOR-79
+E013F ; [.0000.0000.0000.0000] # [E013F] VARIATION SELECTOR-80
+E0140 ; [.0000.0000.0000.0000] # [E0140] VARIATION SELECTOR-81
+E0141 ; [.0000.0000.0000.0000] # [E0141] VARIATION SELECTOR-82
+E0142 ; [.0000.0000.0000.0000] # [E0142] VARIATION SELECTOR-83
+E0143 ; [.0000.0000.0000.0000] # [E0143] VARIATION SELECTOR-84
+E0144 ; [.0000.0000.0000.0000] # [E0144] VARIATION SELECTOR-85
+E0145 ; [.0000.0000.0000.0000] # [E0145] VARIATION SELECTOR-86
+E0146 ; [.0000.0000.0000.0000] # [E0146] VARIATION SELECTOR-87
+E0147 ; [.0000.0000.0000.0000] # [E0147] VARIATION SELECTOR-88
+E0148 ; [.0000.0000.0000.0000] # [E0148] VARIATION SELECTOR-89
+E0149 ; [.0000.0000.0000.0000] # [E0149] VARIATION SELECTOR-90
+E014A ; [.0000.0000.0000.0000] # [E014A] VARIATION SELECTOR-91
+E014B ; [.0000.0000.0000.0000] # [E014B] VARIATION SELECTOR-92
+E014C ; [.0000.0000.0000.0000] # [E014C] VARIATION SELECTOR-93
+E014D ; [.0000.0000.0000.0000] # [E014D] VARIATION SELECTOR-94
+E014E ; [.0000.0000.0000.0000] # [E014E] VARIATION SELECTOR-95
+E014F ; [.0000.0000.0000.0000] # [E014F] VARIATION SELECTOR-96
+E0150 ; [.0000.0000.0000.0000] # [E0150] VARIATION SELECTOR-97
+E0151 ; [.0000.0000.0000.0000] # [E0151] VARIATION SELECTOR-98
+E0152 ; [.0000.0000.0000.0000] # [E0152] VARIATION SELECTOR-99
+E0153 ; [.0000.0000.0000.0000] # [E0153] VARIATION SELECTOR-100
+E0154 ; [.0000.0000.0000.0000] # [E0154] VARIATION SELECTOR-101
+E0155 ; [.0000.0000.0000.0000] # [E0155] VARIATION SELECTOR-102
+E0156 ; [.0000.0000.0000.0000] # [E0156] VARIATION SELECTOR-103
+E0157 ; [.0000.0000.0000.0000] # [E0157] VARIATION SELECTOR-104
+E0158 ; [.0000.0000.0000.0000] # [E0158] VARIATION SELECTOR-105
+E0159 ; [.0000.0000.0000.0000] # [E0159] VARIATION SELECTOR-106
+E015A ; [.0000.0000.0000.0000] # [E015A] VARIATION SELECTOR-107
+E015B ; [.0000.0000.0000.0000] # [E015B] VARIATION SELECTOR-108
+E015C ; [.0000.0000.0000.0000] # [E015C] VARIATION SELECTOR-109
+E015D ; [.0000.0000.0000.0000] # [E015D] VARIATION SELECTOR-110
+E015E ; [.0000.0000.0000.0000] # [E015E] VARIATION SELECTOR-111
+E015F ; [.0000.0000.0000.0000] # [E015F] VARIATION SELECTOR-112
+E0160 ; [.0000.0000.0000.0000] # [E0160] VARIATION SELECTOR-113
+E0161 ; [.0000.0000.0000.0000] # [E0161] VARIATION SELECTOR-114
+E0162 ; [.0000.0000.0000.0000] # [E0162] VARIATION SELECTOR-115
+E0163 ; [.0000.0000.0000.0000] # [E0163] VARIATION SELECTOR-116
+E0164 ; [.0000.0000.0000.0000] # [E0164] VARIATION SELECTOR-117
+E0165 ; [.0000.0000.0000.0000] # [E0165] VARIATION SELECTOR-118
+E0166 ; [.0000.0000.0000.0000] # [E0166] VARIATION SELECTOR-119
+E0167 ; [.0000.0000.0000.0000] # [E0167] VARIATION SELECTOR-120
+E0168 ; [.0000.0000.0000.0000] # [E0168] VARIATION SELECTOR-121
+E0169 ; [.0000.0000.0000.0000] # [E0169] VARIATION SELECTOR-122
+E016A ; [.0000.0000.0000.0000] # [E016A] VARIATION SELECTOR-123
+E016B ; [.0000.0000.0000.0000] # [E016B] VARIATION SELECTOR-124
+E016C ; [.0000.0000.0000.0000] # [E016C] VARIATION SELECTOR-125
+E016D ; [.0000.0000.0000.0000] # [E016D] VARIATION SELECTOR-126
+E016E ; [.0000.0000.0000.0000] # [E016E] VARIATION SELECTOR-127
+E016F ; [.0000.0000.0000.0000] # [E016F] VARIATION SELECTOR-128
+E0170 ; [.0000.0000.0000.0000] # [E0170] VARIATION SELECTOR-129
+E0171 ; [.0000.0000.0000.0000] # [E0171] VARIATION SELECTOR-130
+E0172 ; [.0000.0000.0000.0000] # [E0172] VARIATION SELECTOR-131
+E0173 ; [.0000.0000.0000.0000] # [E0173] VARIATION SELECTOR-132
+E0174 ; [.0000.0000.0000.0000] # [E0174] VARIATION SELECTOR-133
+E0175 ; [.0000.0000.0000.0000] # [E0175] VARIATION SELECTOR-134
+E0176 ; [.0000.0000.0000.0000] # [E0176] VARIATION SELECTOR-135
+E0177 ; [.0000.0000.0000.0000] # [E0177] VARIATION SELECTOR-136
+E0178 ; [.0000.0000.0000.0000] # [E0178] VARIATION SELECTOR-137
+E0179 ; [.0000.0000.0000.0000] # [E0179] VARIATION SELECTOR-138
+E017A ; [.0000.0000.0000.0000] # [E017A] VARIATION SELECTOR-139
+E017B ; [.0000.0000.0000.0000] # [E017B] VARIATION SELECTOR-140
+E017C ; [.0000.0000.0000.0000] # [E017C] VARIATION SELECTOR-141
+E017D ; [.0000.0000.0000.0000] # [E017D] VARIATION SELECTOR-142
+E017E ; [.0000.0000.0000.0000] # [E017E] VARIATION SELECTOR-143
+E017F ; [.0000.0000.0000.0000] # [E017F] VARIATION SELECTOR-144
+E0180 ; [.0000.0000.0000.0000] # [E0180] VARIATION SELECTOR-145
+E0181 ; [.0000.0000.0000.0000] # [E0181] VARIATION SELECTOR-146
+E0182 ; [.0000.0000.0000.0000] # [E0182] VARIATION SELECTOR-147
+E0183 ; [.0000.0000.0000.0000] # [E0183] VARIATION SELECTOR-148
+E0184 ; [.0000.0000.0000.0000] # [E0184] VARIATION SELECTOR-149
+E0185 ; [.0000.0000.0000.0000] # [E0185] VARIATION SELECTOR-150
+E0186 ; [.0000.0000.0000.0000] # [E0186] VARIATION SELECTOR-151
+E0187 ; [.0000.0000.0000.0000] # [E0187] VARIATION SELECTOR-152
+E0188 ; [.0000.0000.0000.0000] # [E0188] VARIATION SELECTOR-153
+E0189 ; [.0000.0000.0000.0000] # [E0189] VARIATION SELECTOR-154
+E018A ; [.0000.0000.0000.0000] # [E018A] VARIATION SELECTOR-155
+E018B ; [.0000.0000.0000.0000] # [E018B] VARIATION SELECTOR-156
+E018C ; [.0000.0000.0000.0000] # [E018C] VARIATION SELECTOR-157
+E018D ; [.0000.0000.0000.0000] # [E018D] VARIATION SELECTOR-158
+E018E ; [.0000.0000.0000.0000] # [E018E] VARIATION SELECTOR-159
+E018F ; [.0000.0000.0000.0000] # [E018F] VARIATION SELECTOR-160
+E0190 ; [.0000.0000.0000.0000] # [E0190] VARIATION SELECTOR-161
+E0191 ; [.0000.0000.0000.0000] # [E0191] VARIATION SELECTOR-162
+E0192 ; [.0000.0000.0000.0000] # [E0192] VARIATION SELECTOR-163
+E0193 ; [.0000.0000.0000.0000] # [E0193] VARIATION SELECTOR-164
+E0194 ; [.0000.0000.0000.0000] # [E0194] VARIATION SELECTOR-165
+E0195 ; [.0000.0000.0000.0000] # [E0195] VARIATION SELECTOR-166
+E0196 ; [.0000.0000.0000.0000] # [E0196] VARIATION SELECTOR-167
+E0197 ; [.0000.0000.0000.0000] # [E0197] VARIATION SELECTOR-168
+E0198 ; [.0000.0000.0000.0000] # [E0198] VARIATION SELECTOR-169
+E0199 ; [.0000.0000.0000.0000] # [E0199] VARIATION SELECTOR-170
+E019A ; [.0000.0000.0000.0000] # [E019A] VARIATION SELECTOR-171
+E019B ; [.0000.0000.0000.0000] # [E019B] VARIATION SELECTOR-172
+E019C ; [.0000.0000.0000.0000] # [E019C] VARIATION SELECTOR-173
+E019D ; [.0000.0000.0000.0000] # [E019D] VARIATION SELECTOR-174
+E019E ; [.0000.0000.0000.0000] # [E019E] VARIATION SELECTOR-175
+E019F ; [.0000.0000.0000.0000] # [E019F] VARIATION SELECTOR-176
+E01A0 ; [.0000.0000.0000.0000] # [E01A0] VARIATION SELECTOR-177
+E01A1 ; [.0000.0000.0000.0000] # [E01A1] VARIATION SELECTOR-178
+E01A2 ; [.0000.0000.0000.0000] # [E01A2] VARIATION SELECTOR-179
+E01A3 ; [.0000.0000.0000.0000] # [E01A3] VARIATION SELECTOR-180
+E01A4 ; [.0000.0000.0000.0000] # [E01A4] VARIATION SELECTOR-181
+E01A5 ; [.0000.0000.0000.0000] # [E01A5] VARIATION SELECTOR-182
+E01A6 ; [.0000.0000.0000.0000] # [E01A6] VARIATION SELECTOR-183
+E01A7 ; [.0000.0000.0000.0000] # [E01A7] VARIATION SELECTOR-184
+E01A8 ; [.0000.0000.0000.0000] # [E01A8] VARIATION SELECTOR-185
+E01A9 ; [.0000.0000.0000.0000] # [E01A9] VARIATION SELECTOR-186
+E01AA ; [.0000.0000.0000.0000] # [E01AA] VARIATION SELECTOR-187
+E01AB ; [.0000.0000.0000.0000] # [E01AB] VARIATION SELECTOR-188
+E01AC ; [.0000.0000.0000.0000] # [E01AC] VARIATION SELECTOR-189
+E01AD ; [.0000.0000.0000.0000] # [E01AD] VARIATION SELECTOR-190
+E01AE ; [.0000.0000.0000.0000] # [E01AE] VARIATION SELECTOR-191
+E01AF ; [.0000.0000.0000.0000] # [E01AF] VARIATION SELECTOR-192
+E01B0 ; [.0000.0000.0000.0000] # [E01B0] VARIATION SELECTOR-193
+E01B1 ; [.0000.0000.0000.0000] # [E01B1] VARIATION SELECTOR-194
+E01B2 ; [.0000.0000.0000.0000] # [E01B2] VARIATION SELECTOR-195
+E01B3 ; [.0000.0000.0000.0000] # [E01B3] VARIATION SELECTOR-196
+E01B4 ; [.0000.0000.0000.0000] # [E01B4] VARIATION SELECTOR-197
+E01B5 ; [.0000.0000.0000.0000] # [E01B5] VARIATION SELECTOR-198
+E01B6 ; [.0000.0000.0000.0000] # [E01B6] VARIATION SELECTOR-199
+E01B7 ; [.0000.0000.0000.0000] # [E01B7] VARIATION SELECTOR-200
+E01B8 ; [.0000.0000.0000.0000] # [E01B8] VARIATION SELECTOR-201
+E01B9 ; [.0000.0000.0000.0000] # [E01B9] VARIATION SELECTOR-202
+E01BA ; [.0000.0000.0000.0000] # [E01BA] VARIATION SELECTOR-203
+E01BB ; [.0000.0000.0000.0000] # [E01BB] VARIATION SELECTOR-204
+E01BC ; [.0000.0000.0000.0000] # [E01BC] VARIATION SELECTOR-205
+E01BD ; [.0000.0000.0000.0000] # [E01BD] VARIATION SELECTOR-206
+E01BE ; [.0000.0000.0000.0000] # [E01BE] VARIATION SELECTOR-207
+E01BF ; [.0000.0000.0000.0000] # [E01BF] VARIATION SELECTOR-208
+E01C0 ; [.0000.0000.0000.0000] # [E01C0] VARIATION SELECTOR-209
+E01C1 ; [.0000.0000.0000.0000] # [E01C1] VARIATION SELECTOR-210
+E01C2 ; [.0000.0000.0000.0000] # [E01C2] VARIATION SELECTOR-211
+E01C3 ; [.0000.0000.0000.0000] # [E01C3] VARIATION SELECTOR-212
+E01C4 ; [.0000.0000.0000.0000] # [E01C4] VARIATION SELECTOR-213
+E01C5 ; [.0000.0000.0000.0000] # [E01C5] VARIATION SELECTOR-214
+E01C6 ; [.0000.0000.0000.0000] # [E01C6] VARIATION SELECTOR-215
+E01C7 ; [.0000.0000.0000.0000] # [E01C7] VARIATION SELECTOR-216
+E01C8 ; [.0000.0000.0000.0000] # [E01C8] VARIATION SELECTOR-217
+E01C9 ; [.0000.0000.0000.0000] # [E01C9] VARIATION SELECTOR-218
+E01CA ; [.0000.0000.0000.0000] # [E01CA] VARIATION SELECTOR-219
+E01CB ; [.0000.0000.0000.0000] # [E01CB] VARIATION SELECTOR-220
+E01CC ; [.0000.0000.0000.0000] # [E01CC] VARIATION SELECTOR-221
+E01CD ; [.0000.0000.0000.0000] # [E01CD] VARIATION SELECTOR-222
+E01CE ; [.0000.0000.0000.0000] # [E01CE] VARIATION SELECTOR-223
+E01CF ; [.0000.0000.0000.0000] # [E01CF] VARIATION SELECTOR-224
+E01D0 ; [.0000.0000.0000.0000] # [E01D0] VARIATION SELECTOR-225
+E01D1 ; [.0000.0000.0000.0000] # [E01D1] VARIATION SELECTOR-226
+E01D2 ; [.0000.0000.0000.0000] # [E01D2] VARIATION SELECTOR-227
+E01D3 ; [.0000.0000.0000.0000] # [E01D3] VARIATION SELECTOR-228
+E01D4 ; [.0000.0000.0000.0000] # [E01D4] VARIATION SELECTOR-229
+E01D5 ; [.0000.0000.0000.0000] # [E01D5] VARIATION SELECTOR-230
+E01D6 ; [.0000.0000.0000.0000] # [E01D6] VARIATION SELECTOR-231
+E01D7 ; [.0000.0000.0000.0000] # [E01D7] VARIATION SELECTOR-232
+E01D8 ; [.0000.0000.0000.0000] # [E01D8] VARIATION SELECTOR-233
+E01D9 ; [.0000.0000.0000.0000] # [E01D9] VARIATION SELECTOR-234
+E01DA ; [.0000.0000.0000.0000] # [E01DA] VARIATION SELECTOR-235
+E01DB ; [.0000.0000.0000.0000] # [E01DB] VARIATION SELECTOR-236
+E01DC ; [.0000.0000.0000.0000] # [E01DC] VARIATION SELECTOR-237
+E01DD ; [.0000.0000.0000.0000] # [E01DD] VARIATION SELECTOR-238
+E01DE ; [.0000.0000.0000.0000] # [E01DE] VARIATION SELECTOR-239
+E01DF ; [.0000.0000.0000.0000] # [E01DF] VARIATION SELECTOR-240
+E01E0 ; [.0000.0000.0000.0000] # [E01E0] VARIATION SELECTOR-241
+E01E1 ; [.0000.0000.0000.0000] # [E01E1] VARIATION SELECTOR-242
+E01E2 ; [.0000.0000.0000.0000] # [E01E2] VARIATION SELECTOR-243
+E01E3 ; [.0000.0000.0000.0000] # [E01E3] VARIATION SELECTOR-244
+E01E4 ; [.0000.0000.0000.0000] # [E01E4] VARIATION SELECTOR-245
+E01E5 ; [.0000.0000.0000.0000] # [E01E5] VARIATION SELECTOR-246
+E01E6 ; [.0000.0000.0000.0000] # [E01E6] VARIATION SELECTOR-247
+E01E7 ; [.0000.0000.0000.0000] # [E01E7] VARIATION SELECTOR-248
+E01E8 ; [.0000.0000.0000.0000] # [E01E8] VARIATION SELECTOR-249
+E01E9 ; [.0000.0000.0000.0000] # [E01E9] VARIATION SELECTOR-250
+E01EA ; [.0000.0000.0000.0000] # [E01EA] VARIATION SELECTOR-251
+E01EB ; [.0000.0000.0000.0000] # [E01EB] VARIATION SELECTOR-252
+E01EC ; [.0000.0000.0000.0000] # [E01EC] VARIATION SELECTOR-253
+E01ED ; [.0000.0000.0000.0000] # [E01ED] VARIATION SELECTOR-254
+E01EE ; [.0000.0000.0000.0000] # [E01EE] VARIATION SELECTOR-255
+E01EF ; [.0000.0000.0000.0000] # [E01EF] VARIATION SELECTOR-256
+0009 ; [*0201.0020.0002.0009] # HORIZONTAL TABULATION (in 6429)
+000A ; [*0202.0020.0002.000A] # LINE FEED (in 6429)
+000B ; [*0203.0020.0002.000B] # VERTICAL TABULATION (in 6429)
+000C ; [*0204.0020.0002.000C] # FORM FEED (in 6429)
+000D ; [*0205.0020.0002.000D] # CARRIAGE RETURN (in 6429)
+0020 ; [*0209.0020.0002.0020] # SPACE
+0021 ; [*0257.0020.0002.0021] # EXCLAMATION MARK
+0022 ; [*02A7.0020.0002.0022] # QUOTATION MARK
+0023 ; [*0305.0020.0002.0023] # NUMBER SIGN
+0025 ; [*0306.0020.0002.0025] # PERCENT SIGN
+0026 ; [*0302.0020.0002.0026] # AMPERSAND
+0027 ; [*02A0.0020.0002.0027] # APOSTROPHE
+0028 ; [*02B1.0020.0002.0028] # LEFT PARENTHESIS
+0029 ; [*02B2.0020.0002.0029] # RIGHT PARENTHESIS
+002A ; [*02FB.0020.0002.002A] # ASTERISK
+002B ; [*04B8.0020.0002.002B] # PLUS SIGN
+002C ; [*0232.0020.0002.002C] # COMMA
+002D ; [*0222.0020.0002.002D] # HYPHEN-MINUS
+002E ; [*0266.0020.0002.002E] # FULL STOP
+002F ; [*02FF.0020.0002.002F] # SOLIDUS
+003A ; [*0241.0020.0002.003A] # COLON
+003B ; [*023E.0020.0002.003B] # SEMICOLON
+003C ; [*04BC.0020.0002.003C] # LESS-THAN SIGN
+003D ; [*04BD.0020.0002.003D] # EQUALS SIGN
+003E ; [*04BE.0020.0002.003E] # GREATER-THAN SIGN
+003F ; [*025C.0020.0002.003F] # QUESTION MARK
+0040 ; [*02FA.0020.0002.0040] # COMMERCIAL AT
+005B ; [*02B3.0020.0002.005B] # LEFT SQUARE BRACKET
+005C ; [*0301.0020.0002.005C] # REVERSE SOLIDUS
+005D ; [*02B4.0020.0002.005D] # RIGHT SQUARE BRACKET
+005E ; [*0210.0020.0002.005E] # CIRCUMFLEX ACCENT
+005F ; [*021C.0020.0002.005F] # LOW LINE
+0060 ; [*020D.0020.0002.0060] # GRAVE ACCENT
+007B ; [*02B5.0020.0002.007B] # LEFT CURLY BRACKET
+007C ; [*04C0.0020.0002.007C] # VERTICAL LINE
+007D ; [*02B6.0020.0002.007D] # RIGHT CURLY BRACKET
+007E ; [*04C3.0020.0002.007E] # TILDE
+0085 ; [*0206.0020.0002.0085] # NEXT LINE (in 6429)
+00A0 ; [*0209.0020.001B.00A0] # NO-BREAK SPACE; QQK
+00A1 ; [*0258.0020.0002.00A1] # INVERTED EXCLAMATION MARK
+00A6 ; [*04C1.0020.0002.00A6] # BROKEN BAR
+00A7 ; [*02F5.0020.0002.00A7] # SECTION SIGN
+00A8 ; [*0215.0020.0002.00A8] # DIAERESIS
+00A9 ; [*02F8.0020.0002.00A9] # COPYRIGHT SIGN
+00AB ; [*02AF.0020.0002.00AB] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC ; [*04BF.0020.0002.00AC] # NOT SIGN
+00AD ; [*0221.0020.0002.00AD] # SOFT HYPHEN
+00AE ; [*02F9.0020.0002.00AE] # REGISTERED SIGN
+00AF ; [*0211.0020.0002.00AF] # MACRON
+00B0 ; [*03BF.0020.0002.00B0] # DEGREE SIGN
+00B1 ; [*04B9.0020.0002.00B1] # PLUS-MINUS SIGN
+00B4 ; [*020E.0020.0002.00B4] # ACUTE ACCENT
+00B6 ; [*02F6.0020.0002.00B6] # PILCROW SIGN
+00B7 ; [*0273.0020.0002.00B7] # MIDDLE DOT
+00B8 ; [*021A.0020.0002.00B8] # CEDILLA
+00BB ; [*02B0.0020.0002.00BB] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BF ; [*025D.0020.0002.00BF] # INVERTED QUESTION MARK
+00D7 ; [*04BB.0020.0002.00D7] # MULTIPLICATION SIGN
+00F7 ; [*04BA.0020.0002.00F7] # DIVISION SIGN
+02B9 ; [*0365.0020.0002.02B9] # MODIFIER LETTER PRIME
+02BA ; [*0367.0020.0002.02BA] # MODIFIER LETTER DOUBLE PRIME
+02C2 ; [*0368.0020.0002.02C2] # MODIFIER LETTER LEFT ARROWHEAD
+02C3 ; [*0369.0020.0002.02C3] # MODIFIER LETTER RIGHT ARROWHEAD
+02C4 ; [*036A.0020.0002.02C4] # MODIFIER LETTER UP ARROWHEAD
+02C5 ; [*036B.0020.0002.02C5] # MODIFIER LETTER DOWN ARROWHEAD
+02C6 ; [*036C.0020.0002.02C6] # MODIFIER LETTER CIRCUMFLEX ACCENT
+02C7 ; [*036D.0020.0002.02C7] # CARON
+02C8 ; [*036E.0020.0002.02C8] # MODIFIER LETTER VERTICAL LINE
+02C9 ; [*036F.0020.0002.02C9] # MODIFIER LETTER MACRON
+02CA ; [*0370.0020.0002.02CA] # MODIFIER LETTER ACUTE ACCENT
+02CB ; [*0371.0020.0002.02CB] # MODIFIER LETTER GRAVE ACCENT
+02CC ; [*0372.0020.0002.02CC] # MODIFIER LETTER LOW VERTICAL LINE
+02CD ; [*0373.0020.0002.02CD] # MODIFIER LETTER LOW MACRON
+02CE ; [*0374.0020.0002.02CE] # MODIFIER LETTER LOW GRAVE ACCENT
+02CF ; [*0375.0020.0002.02CF] # MODIFIER LETTER LOW ACUTE ACCENT
+02D2 ; [*0376.0020.0002.02D2] # MODIFIER LETTER CENTRED RIGHT HALF RING
+02D3 ; [*0377.0020.0002.02D3] # MODIFIER LETTER CENTRED LEFT HALF RING
+02D4 ; [*0378.0020.0002.02D4] # MODIFIER LETTER UP TACK
+02D5 ; [*0379.0020.0002.02D5] # MODIFIER LETTER DOWN TACK
+02D6 ; [*037A.0020.0002.02D6] # MODIFIER LETTER PLUS SIGN
+02D7 ; [*037B.0020.0002.02D7] # MODIFIER LETTER MINUS SIGN
+02D8 ; [*0213.0020.0002.02D8] # BREVE
+02D9 ; [*0214.0020.0002.02D9] # DOT ABOVE
+02DA ; [*0216.0020.0002.02DA] # RING ABOVE
+02DB ; [*021B.0020.0002.02DB] # OGONEK
+02DC ; [*020F.0020.0002.02DC] # SMALL TILDE
+02DD ; [*0217.0020.0002.02DD] # DOUBLE ACUTE ACCENT
+02DE ; [*037C.0020.0002.02DE] # MODIFIER LETTER RHOTIC HOOK
+02DF ; [*037D.0020.0002.02DF] # MODIFIER LETTER CROSS ACCENT
+02E5 ; [*037E.0020.0002.02E5] # MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6 ; [*037F.0020.0002.02E6] # MODIFIER LETTER HIGH TONE BAR
+02E7 ; [*0380.0020.0002.02E7] # MODIFIER LETTER MID TONE BAR
+02E8 ; [*0381.0020.0002.02E8] # MODIFIER LETTER LOW TONE BAR
+02E9 ; [*0382.0020.0002.02E9] # MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA ; [*0383.0020.0002.02EA] # MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB ; [*0384.0020.0002.02EB] # MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC ; [*0385.0020.0002.02EC] # MODIFIER LETTER VOICING
+02ED ; [*0386.0020.0002.02ED] # MODIFIER LETTER UNASPIRATED
+02EF ; [*0387.0020.0002.02EF] # MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0 ; [*0388.0020.0002.02F0] # MODIFIER LETTER LOW UP ARROWHEAD
+02F1 ; [*0389.0020.0002.02F1] # MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2 ; [*038A.0020.0002.02F2] # MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3 ; [*038B.0020.0002.02F3] # MODIFIER LETTER LOW RING
+02F4 ; [*038C.0020.0002.02F4] # MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5 ; [*038D.0020.0002.02F5] # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6 ; [*038E.0020.0002.02F6] # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7 ; [*038F.0020.0002.02F7] # MODIFIER LETTER LOW TILDE
+02F8 ; [*0390.0020.0002.02F8] # MODIFIER LETTER RAISED COLON
+02F9 ; [*0391.0020.0002.02F9] # MODIFIER LETTER BEGIN HIGH TONE
+02FA ; [*0392.0020.0002.02FA] # MODIFIER LETTER END HIGH TONE
+02FB ; [*0393.0020.0002.02FB] # MODIFIER LETTER BEGIN LOW TONE
+02FC ; [*0394.0020.0002.02FC] # MODIFIER LETTER END LOW TONE
+02FD ; [*0395.0020.0002.02FD] # MODIFIER LETTER SHELF
+02FE ; [*0396.0020.0002.02FE] # MODIFIER LETTER OPEN SHELF
+02FF ; [*0397.0020.0002.02FF] # MODIFIER LETTER LOW LEFT ARROW
+034F ; [.0000.0000.0000.034F] # COMBINING GRAPHEME JOINER
+0374 ; [*0365.0020.0002.0374] # GREEK NUMERAL SIGN; QQC
+0375 ; [*0366.0020.0002.0375] # GREEK LOWER NUMERAL SIGN
+037E ; [*023E.0020.0002.037E] # GREEK QUESTION MARK; QQC
+0384 ; [*020E.0020.0002.0384] # GREEK TONOS; QQC
+0385 ; [*0215.0020.0002.00A8][.0000.0032.0002.0301] # GREEK DIALYTIKA TONOS; QQCM
+0387 ; [*0273.0020.0002.0387] # GREEK ANO TELEIA; QQC
+03F6 ; [*04B3.0020.0002.03F6] # GREEK REVERSED LUNATE EPSILON SYMBOL
+0482 ; [*03C0.0020.0002.0482] # CYRILLIC THOUSANDS SIGN
+0488 ; [.0000.0000.0000.0488] # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489 ; [.0000.0000.0000.0489] # COMBINING CYRILLIC MILLIONS SIGN
+055A ; [*032E.0020.0002.055A] # ARMENIAN APOSTROPHE
+055B ; [*032F.0020.0002.055B] # ARMENIAN EMPHASIS MARK
+055C ; [*0259.0020.0002.055C] # ARMENIAN EXCLAMATION MARK
+055D ; [*0233.0020.0002.055D] # ARMENIAN COMMA
+055E ; [*025E.0020.0002.055E] # ARMENIAN QUESTION MARK
+055F ; [*0330.0020.0002.055F] # ARMENIAN ABBREVIATION MARK
+0589 ; [*0242.0020.0002.0589] # ARMENIAN FULL STOP
+058A ; [*0223.0020.0002.058A] # ARMENIAN HYPHEN
+0591 ; [.0000.0000.0000.0591] # HEBREW ACCENT ETNAHTA
+0592 ; [.0000.0000.0000.0592] # HEBREW ACCENT SEGOL
+0593 ; [.0000.0000.0000.0593] # HEBREW ACCENT SHALSHELET
+0594 ; [.0000.0000.0000.0594] # HEBREW ACCENT ZAQEF QATAN
+0595 ; [.0000.0000.0000.0595] # HEBREW ACCENT ZAQEF GADOL
+0596 ; [.0000.0000.0000.0596] # HEBREW ACCENT TIPEHA
+0597 ; [.0000.0000.0000.0597] # HEBREW ACCENT REVIA
+0598 ; [.0000.0000.0000.0598] # HEBREW ACCENT ZARQA
+0599 ; [.0000.0000.0000.0599] # HEBREW ACCENT PASHTA
+059A ; [.0000.0000.0000.059A] # HEBREW ACCENT YETIV
+059B ; [.0000.0000.0000.059B] # HEBREW ACCENT TEVIR
+059C ; [.0000.0000.0000.059C] # HEBREW ACCENT GERESH
+059D ; [.0000.0000.0000.059D] # HEBREW ACCENT GERESH MUQDAM
+059E ; [.0000.0000.0000.059E] # HEBREW ACCENT GERSHAYIM
+059F ; [.0000.0000.0000.059F] # HEBREW ACCENT QARNEY PARA
+05A0 ; [.0000.0000.0000.05A0] # HEBREW ACCENT TELISHA GEDOLA
+05A1 ; [.0000.0000.0000.05A1] # HEBREW ACCENT PAZER
+05A2 ; [.0000.0000.0000.05A2] # HEBREW ACCENT ATNAH HAFUKH
+05A3 ; [.0000.0000.0000.05A3] # HEBREW ACCENT MUNAH
+05A4 ; [.0000.0000.0000.05A4] # HEBREW ACCENT MAHAPAKH
+05A5 ; [.0000.0000.0000.05A5] # HEBREW ACCENT MERKHA
+05A6 ; [.0000.0000.0000.05A6] # HEBREW ACCENT MERKHA KEFULA
+05A7 ; [.0000.0000.0000.05A7] # HEBREW ACCENT DARGA
+05A8 ; [.0000.0000.0000.05A8] # HEBREW ACCENT QADMA
+05A9 ; [.0000.0000.0000.05A9] # HEBREW ACCENT TELISHA QETANA
+05AA ; [.0000.0000.0000.05AA] # HEBREW ACCENT YERAH BEN YOMO
+05AB ; [.0000.0000.0000.05AB] # HEBREW ACCENT OLE
+05AC ; [.0000.0000.0000.05AC] # HEBREW ACCENT ILUY
+05AD ; [.0000.0000.0000.05AD] # HEBREW ACCENT DEHI
+05AE ; [.0000.0000.0000.05AE] # HEBREW ACCENT ZINOR
+05AF ; [.0000.0000.0000.05AF] # HEBREW MARK MASORA CIRCLE
+05BD ; [.0000.0000.0000.05BD] # HEBREW POINT METEG
+05BE ; [*0331.0020.0002.05BE] # HEBREW PUNCTUATION MAQAF
+05C0 ; [*0332.0020.0002.05C0] # HEBREW PUNCTUATION PASEQ
+05C3 ; [*0333.0020.0002.05C3] # HEBREW PUNCTUATION SOF PASUQ
+05C4 ; [.0000.0000.0000.05C4] # HEBREW MARK UPPER DOT
+05C5 ; [.0000.0000.0000.05C5] # HEBREW MARK LOWER DOT
+05C6 ; [*0334.0020.0002.05C6] # HEBREW PUNCTUATION NUN HAFUKHA
+05F3 ; [*0335.0020.0002.05F3] # HEBREW PUNCTUATION GERESH
+05F4 ; [*0336.0020.0002.05F4] # HEBREW PUNCTUATION GERSHAYIM
+0600 ; [.0000.0000.0000.0600] # ARABIC NUMBER SIGN
+0601 ; [.0000.0000.0000.0601] # ARABIC SIGN SANAH
+0602 ; [.0000.0000.0000.0602] # ARABIC FOOTNOTE MARKER
+0603 ; [.0000.0000.0000.0603] # ARABIC SIGN SAFHA
+060C ; [*0234.0020.0002.060C] # ARABIC COMMA
+060D ; [*0235.0020.0002.060D] # ARABIC DATE SEPARATOR
+060E ; [*03C1.0020.0002.060E] # ARABIC POETIC VERSE SIGN
+060F ; [*03C2.0020.0002.060F] # ARABIC SIGN MISRA
+0610 ; [.0000.0000.0000.0610] # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611 ; [.0000.0000.0000.0611] # ARABIC SIGN ALAYHE ASSALLAM
+0612 ; [.0000.0000.0000.0612] # ARABIC SIGN RAHMATULLAH ALAYHE
+0613 ; [.0000.0000.0000.0613] # ARABIC SIGN RADI ALLAHOU ANHU
+0614 ; [.0000.0000.0000.0614] # ARABIC SIGN TAKHALLUS
+0615 ; [.0000.0000.0000.0615] # ARABIC SMALL HIGH TAH
+061B ; [*023F.0020.0002.061B] # ARABIC SEMICOLON
+061E ; [*0243.0020.0002.061E] # ARABIC TRIPLE DOT PUNCTUATION MARK
+061F ; [*025F.0020.0002.061F] # ARABIC QUESTION MARK
+0640 ; [*020B.0020.0002.0640] # ARABIC TATWEEL
+066A ; [*0307.0020.0002.066A] # ARABIC PERCENT SIGN
+066B ; [*0236.0020.0002.066B] # ARABIC DECIMAL SEPARATOR
+066C ; [*0237.0020.0002.066C] # ARABIC THOUSANDS SEPARATOR
+066D ; [*02FE.0020.0002.066D] # ARABIC FIVE POINTED STAR
+06D4 ; [*0268.0020.0002.06D4] # ARABIC FULL STOP
+06D6 ; [.0000.0000.0000.06D6] # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7 ; [.0000.0000.0000.06D7] # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8 ; [.0000.0000.0000.06D8] # ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9 ; [.0000.0000.0000.06D9] # ARABIC SMALL HIGH LAM ALEF
+06DA ; [.0000.0000.0000.06DA] # ARABIC SMALL HIGH JEEM
+06DB ; [.0000.0000.0000.06DB] # ARABIC SMALL HIGH THREE DOTS
+06DC ; [.0000.0000.0000.06DC] # ARABIC SMALL HIGH SEEN
+06DD ; [.0000.0000.0000.06DD] # ARABIC END OF AYAH
+06DE ; [.0000.0000.0000.06DE] # ARABIC START OF RUB EL HIZB
+06DF ; [.0000.0000.0000.06DF] # ARABIC SMALL HIGH ROUNDED ZERO
+06E0 ; [.0000.0000.0000.06E0] # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1 ; [.0000.0000.0000.06E1] # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2 ; [.0000.0000.0000.06E2] # ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3 ; [.0000.0000.0000.06E3] # ARABIC SMALL LOW SEEN
+06E4 ; [.0000.0000.0000.06E4] # ARABIC SMALL HIGH MADDA
+06E7 ; [.0000.0000.0000.06E7] # ARABIC SMALL HIGH YEH
+06E8 ; [.0000.0000.0000.06E8] # ARABIC SMALL HIGH NOON
+06E9 ; [*03C3.0020.0002.06E9] # ARABIC PLACE OF SAJDAH
+06EA ; [.0000.0000.0000.06EA] # ARABIC EMPTY CENTRE LOW STOP
+06EB ; [.0000.0000.0000.06EB] # ARABIC EMPTY CENTRE HIGH STOP
+06EC ; [.0000.0000.0000.06EC] # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED ; [.0000.0000.0000.06ED] # ARABIC SMALL LOW MEEM
+0700 ; [*0282.0020.0002.0700] # SYRIAC END OF PARAGRAPH
+0701 ; [*0269.0020.0002.0701] # SYRIAC SUPRALINEAR FULL STOP
+0702 ; [*026A.0020.0002.0702] # SYRIAC SUBLINEAR FULL STOP
+0703 ; [*0244.0020.0002.0703] # SYRIAC SUPRALINEAR COLON
+0704 ; [*0245.0020.0002.0704] # SYRIAC SUBLINEAR COLON
+0705 ; [*0246.0020.0002.0705] # SYRIAC HORIZONTAL COLON
+0706 ; [*0247.0020.0002.0706] # SYRIAC COLON SKEWED LEFT
+0707 ; [*0248.0020.0002.0707] # SYRIAC COLON SKEWED RIGHT
+0708 ; [*0249.0020.0002.0708] # SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709 ; [*0260.0020.0002.0709] # SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070A ; [*0337.0020.0002.070A] # SYRIAC CONTRACTION
+070B ; [*0338.0020.0002.070B] # SYRIAC HARKLEAN OBELUS
+070C ; [*0339.0020.0002.070C] # SYRIAC HARKLEAN METOBELUS
+070D ; [*033A.0020.0002.070D] # SYRIAC HARKLEAN ASTERISCUS
+07F6 ; [*03C5.0020.0002.07F6] # NKO SYMBOL OO DENNEN
+07F7 ; [*0283.0020.0002.07F7] # NKO SYMBOL GBAKURUNEN
+07F8 ; [*0238.0020.0002.07F8] # NKO COMMA
+07F9 ; [*025A.0020.0002.07F9] # NKO EXCLAMATION MARK
+07FA ; [*020C.0020.0002.07FA] # NKO LAJANYALAN
+0964 ; [*0274.0020.0002.0964] # DEVANAGARI DANDA
+0965 ; [*0275.0020.0002.0965] # DEVANAGARI DOUBLE DANDA
+0970 ; [*033D.0020.0002.0970] # DEVANAGARI ABBREVIATION SIGN
+09F8 ; [*0F13.0020.0002.09F8] # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9 ; [*0F14.0020.0002.09F9] # BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA ; [*03C6.0020.0002.09FA] # BENGALI ISSHAR
+0B70 ; [*03C7.0020.0002.0B70] # ORIYA ISSHAR
+0BF0 ; [*0F15.0020.0002.0BF0] # TAMIL NUMBER TEN
+0BF1 ; [*0F16.0020.0002.0BF1] # TAMIL NUMBER ONE HUNDRED
+0BF2 ; [*0F17.0020.0002.0BF2] # TAMIL NUMBER ONE THOUSAND
+0BF3 ; [*03C8.0020.0002.0BF3] # TAMIL DAY SIGN
+0BF4 ; [*03C9.0020.0002.0BF4] # TAMIL MONTH SIGN
+0BF5 ; [*03CA.0020.0002.0BF5] # TAMIL YEAR SIGN
+0BF6 ; [*03CB.0020.0002.0BF6] # TAMIL DEBIT SIGN
+0BF7 ; [*03CC.0020.0002.0BF7] # TAMIL CREDIT SIGN
+0BF8 ; [*03CD.0020.0002.0BF8] # TAMIL AS ABOVE SIGN
+0BFA ; [*03CE.0020.0002.0BFA] # TAMIL NUMBER SIGN
+0CF1 ; [*03CF.0020.0002.0CF1] # KANNADA SIGN JIHVAMULIYA
+0CF2 ; [*03D0.0020.0002.0CF2] # KANNADA SIGN UPADHMANIYA
+0DF4 ; [*033E.0020.0002.0DF4] # SINHALA PUNCTUATION KUNDDALIYA
+0E4F ; [*03D5.0020.0002.0E4F] # THAI CHARACTER FONGMAN
+0E5A ; [*033F.0020.0002.0E5A] # THAI CHARACTER ANGKHANKHU
+0E5B ; [*0340.0020.0002.0E5B] # THAI CHARACTER KHOMUT
+0F01 ; [*03D6.0020.0002.0F01] # TIBETAN MARK GTER YIG MGO TRUNCATED A
+0F02 ; [*03D7.0020.0002.0F02] # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0F03 ; [*03D8.0020.0002.0F03] # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04 ; [*0341.0020.0002.0F04] # TIBETAN MARK INITIAL YIG MGO MDUN MA
+0F05 ; [*0342.0020.0002.0F05] # TIBETAN MARK CLOSING YIG MGO SGAB MA
+0F06 ; [*0343.0020.0002.0F06] # TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0F07 ; [*0344.0020.0002.0F07] # TIBETAN MARK YIG MGO TSHEG SHAD MA
+0F08 ; [*0345.0020.0002.0F08] # TIBETAN MARK SBRUL SHAD
+0F09 ; [*0346.0020.0002.0F09] # TIBETAN MARK BSKUR YIG MGO
+0F0A ; [*0347.0020.0002.0F0A] # TIBETAN MARK BKA- SHOG YIG MGO
+0F0B ; [*034A.0020.0002.0F0B] # TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C ; [*034A.0020.001B.0F0C] # TIBETAN MARK DELIMITER TSHEG BSTAR; QQK
+0F0D ; [*034B.0020.0002.0F0D] # TIBETAN MARK SHAD
+0F0E ; [*034C.0020.0002.0F0E] # TIBETAN MARK NYIS SHAD
+0F0F ; [*034D.0020.0002.0F0F] # TIBETAN MARK TSHEG SHAD
+0F10 ; [*034E.0020.0002.0F10] # TIBETAN MARK NYIS TSHEG SHAD
+0F11 ; [*034F.0020.0002.0F11] # TIBETAN MARK RIN CHEN SPUNGS SHAD
+0F12 ; [*0350.0020.0002.0F12] # TIBETAN MARK RGYA GRAM SHAD
+0F13 ; [*03D9.0020.0002.0F13] # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14 ; [*0251.0020.0002.0F14] # TIBETAN MARK GTER TSHEG
+0F15 ; [*03DA.0020.0002.0F15] # TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0F16 ; [*03DB.0020.0002.0F16] # TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0F17 ; [*03DC.0020.0002.0F17] # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18 ; [.0000.0000.0000.0F18] # TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0F19 ; [.0000.0000.0000.0F19] # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A ; [*03DD.0020.0002.0F1A] # TIBETAN SIGN RDEL DKAR GCIG
+0F1B ; [*03DE.0020.0002.0F1B] # TIBETAN SIGN RDEL DKAR GNYIS
+0F1C ; [*03DF.0020.0002.0F1C] # TIBETAN SIGN RDEL DKAR GSUM
+0F1D ; [*03E0.0020.0002.0F1D] # TIBETAN SIGN RDEL NAG GCIG
+0F1E ; [*03E1.0020.0002.0F1E] # TIBETAN SIGN RDEL NAG GNYIS
+0F1F ; [*03E2.0020.0002.0F1F] # TIBETAN SIGN RDEL DKAR RDEL NAG
+0F34 ; [*03E3.0020.0002.0F34] # TIBETAN MARK BSDUS RTAGS
+0F35 ; [.0000.0000.0000.0F35] # TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36 ; [*03E4.0020.0002.0F36] # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37 ; [.0000.0000.0000.0F37] # TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38 ; [*03E5.0020.0002.0F38] # TIBETAN MARK CHE MGO
+0F3A ; [*02B7.0020.0002.0F3A] # TIBETAN MARK GUG RTAGS GYON
+0F3B ; [*02B8.0020.0002.0F3B] # TIBETAN MARK GUG RTAGS GYAS
+0F3C ; [*02B9.0020.0002.0F3C] # TIBETAN MARK ANG KHANG GYON
+0F3D ; [*02BA.0020.0002.0F3D] # TIBETAN MARK ANG KHANG GYAS
+0F3E ; [*03E6.0020.0002.0F3E] # TIBETAN SIGN YAR TSHES
+0F3F ; [*03E7.0020.0002.0F3F] # TIBETAN SIGN MAR TSHES
+0F82 ; [.0000.0000.0000.0F82] # TIBETAN SIGN NYI ZLA NAA DA
+0F83 ; [.0000.0000.0000.0F83] # TIBETAN SIGN SNA LDAN
+0F85 ; [*0351.0020.0002.0F85] # TIBETAN MARK PALUTA
+0F86 ; [.0000.0000.0000.0F86] # TIBETAN SIGN LCI RTAGS
+0F87 ; [.0000.0000.0000.0F87] # TIBETAN SIGN YANG RTAGS
+0FBE ; [*03E8.0020.0002.0FBE] # TIBETAN KU RU KHA
+0FBF ; [*03E9.0020.0002.0FBF] # TIBETAN KU RU KHA BZHI MIG CAN
+0FC0 ; [*03EA.0020.0002.0FC0] # TIBETAN CANTILLATION SIGN HEAVY BEAT
+0FC1 ; [*03EB.0020.0002.0FC1] # TIBETAN CANTILLATION SIGN LIGHT BEAT
+0FC2 ; [*03EC.0020.0002.0FC2] # TIBETAN CANTILLATION SIGN CANG TE-U
+0FC3 ; [*03ED.0020.0002.0FC3] # TIBETAN CANTILLATION SIGN SBUB -CHAL
+0FC4 ; [*03EE.0020.0002.0FC4] # TIBETAN SYMBOL DRIL BU
+0FC5 ; [*03EF.0020.0002.0FC5] # TIBETAN SYMBOL RDO RJE
+0FC6 ; [.0000.0000.0000.0FC6] # TIBETAN SYMBOL PADMA GDAN
+0FC7 ; [*03F0.0020.0002.0FC7] # TIBETAN SYMBOL RDO RJE RGYA GRAM
+0FC8 ; [*03F1.0020.0002.0FC8] # TIBETAN SYMBOL PHUR PA
+0FC9 ; [*03F2.0020.0002.0FC9] # TIBETAN SYMBOL NOR BU
+0FCA ; [*03F3.0020.0002.0FCA] # TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0FCB ; [*03F4.0020.0002.0FCB] # TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0FCC ; [*03F5.0020.0002.0FCC] # TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCF ; [*03F6.0020.0002.0FCF] # TIBETAN SIGN RDEL NAG GSUM
+0FD0 ; [*0348.0020.0002.0FD0] # TIBETAN MARK BSKA- SHOG GI MGO RGYAN
+0FD1 ; [*0349.0020.0002.0FD1] # TIBETAN MARK MNYAM YIG GI MGO RGYAN
+104A ; [*027A.0020.0002.104A] # MYANMAR SIGN LITTLE SECTION
+104B ; [*027B.0020.0002.104B] # MYANMAR SIGN SECTION
+104C ; [*0353.0020.0002.104C] # MYANMAR SYMBOL LOCATIVE
+104D ; [*0354.0020.0002.104D] # MYANMAR SYMBOL COMPLETED
+104E ; [*0355.0020.0002.104E] # MYANMAR SYMBOL AFOREMENTIONED
+104F ; [*0356.0020.0002.104F] # MYANMAR SYMBOL GENITIVE
+10FB ; [*0284.0020.0002.10FB] # GEORGIAN PARAGRAPH SEPARATOR
+1360 ; [*0285.0020.0002.1360] # ETHIOPIC SECTION MARK
+1361 ; [*024A.0020.0002.1361] # ETHIOPIC WORDSPACE
+1362 ; [*026B.0020.0002.1362] # ETHIOPIC FULL STOP
+1363 ; [*024B.0020.0002.1363] # ETHIOPIC COMMA
+1364 ; [*024C.0020.0002.1364] # ETHIOPIC SEMICOLON
+1365 ; [*024D.0020.0002.1365] # ETHIOPIC COLON
+1366 ; [*024E.0020.0002.1366] # ETHIOPIC PREFACE COLON
+1367 ; [*0261.0020.0002.1367] # ETHIOPIC QUESTION MARK
+1368 ; [*0286.0020.0002.1368] # ETHIOPIC PARAGRAPH SEPARATOR
+1372 ; [*0F18.0020.0002.1372] # ETHIOPIC NUMBER TEN
+1373 ; [*0F19.0020.0002.1373] # ETHIOPIC NUMBER TWENTY
+1374 ; [*0F1A.0020.0002.1374] # ETHIOPIC NUMBER THIRTY
+1375 ; [*0F1B.0020.0002.1375] # ETHIOPIC NUMBER FORTY
+1376 ; [*0F1C.0020.0002.1376] # ETHIOPIC NUMBER FIFTY
+1377 ; [*0F1D.0020.0002.1377] # ETHIOPIC NUMBER SIXTY
+1378 ; [*0F1E.0020.0002.1378] # ETHIOPIC NUMBER SEVENTY
+1379 ; [*0F1F.0020.0002.1379] # ETHIOPIC NUMBER EIGHTY
+137A ; [*0F20.0020.0002.137A] # ETHIOPIC NUMBER NINETY
+137B ; [*0F21.0020.0002.137B] # ETHIOPIC NUMBER HUNDRED
+137C ; [*0F22.0020.0002.137C] # ETHIOPIC NUMBER TEN THOUSAND
+1390 ; [*0398.0020.0002.1390] # ETHIOPIC TONAL MARK YIZET
+1391 ; [*0399.0020.0002.1391] # ETHIOPIC TONAL MARK DERET
+1392 ; [*039A.0020.0002.1392] # ETHIOPIC TONAL MARK RIKRIK
+1393 ; [*039B.0020.0002.1393] # ETHIOPIC TONAL MARK SHORT RIKRIK
+1394 ; [*039C.0020.0002.1394] # ETHIOPIC TONAL MARK DIFAT
+1395 ; [*039D.0020.0002.1395] # ETHIOPIC TONAL MARK KENAT
+1396 ; [*039E.0020.0002.1396] # ETHIOPIC TONAL MARK CHIRET
+1397 ; [*039F.0020.0002.1397] # ETHIOPIC TONAL MARK HIDET
+1398 ; [*03A0.0020.0002.1398] # ETHIOPIC TONAL MARK DERET-HIDET
+1399 ; [*03A1.0020.0002.1399] # ETHIOPIC TONAL MARK KURT
+166D ; [*035B.0020.0002.166D] # CANADIAN SYLLABICS CHI SIGN
+166E ; [*026E.0020.0002.166E] # CANADIAN SYLLABICS FULL STOP
+1680 ; [*020A.0020.0002.1680] # OGHAM SPACE MARK
+169B ; [*02BB.0020.0002.169B] # OGHAM FEATHER MARK
+169C ; [*02BC.0020.0002.169C] # OGHAM REVERSED FEATHER MARK
+16EB ; [*0254.0020.0002.16EB] # RUNIC SINGLE PUNCTUATION
+16EC ; [*0255.0020.0002.16EC] # RUNIC MULTIPLE PUNCTUATION
+16ED ; [*0256.0020.0002.16ED] # RUNIC CROSS PUNCTUATION
+1735 ; [*0278.0020.0002.1735] # PHILIPPINE SINGLE PUNCTUATION
+1736 ; [*0279.0020.0002.1736] # PHILIPPINE DOUBLE PUNCTUATION
+17D4 ; [*027C.0020.0002.17D4] # KHMER SIGN KHAN
+17D5 ; [*027D.0020.0002.17D5] # KHMER SIGN BARIYOOSAN
+17D6 ; [*0252.0020.0002.17D6] # KHMER SIGN CAMNUC PII KUUH
+17D7 ; [*0357.0020.0002.17D7] # KHMER SIGN LEK TOO
+17D8 ; [*0358.0020.0002.17D8] # KHMER SIGN BEYYAL
+17D9 ; [*0359.0020.0002.17D9] # KHMER SIGN PHNAEK MUAN
+17DA ; [*035A.0020.0002.17DA] # KHMER SIGN KOOMUUT
+1800 ; [*033B.0020.0002.1800] # MONGOLIAN BIRGA
+1801 ; [*0267.0020.0002.1801] # MONGOLIAN ELLIPSIS
+1802 ; [*0239.0020.0002.1802] # MONGOLIAN COMMA
+1803 ; [*026C.0020.0002.1803] # MONGOLIAN FULL STOP
+1804 ; [*024F.0020.0002.1804] # MONGOLIAN COLON
+1805 ; [*0250.0020.0002.1805] # MONGOLIAN FOUR DOTS
+1806 ; [*0225.0020.0002.1806] # MONGOLIAN TODO SOFT HYPHEN
+1807 ; [*0226.0020.0002.1807] # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808 ; [*023A.0020.0002.1808] # MONGOLIAN MANCHU COMMA
+1809 ; [*026D.0020.0002.1809] # MONGOLIAN MANCHU FULL STOP
+180A ; [*033C.0020.0002.180A] # MONGOLIAN NIRUGU
+1940 ; [*0352.0020.0002.1940] # LIMBU SIGN LOO
+1944 ; [*025B.0020.0002.1944] # LIMBU EXCLAMATION MARK
+1945 ; [*0262.0020.0002.1945] # LIMBU QUESTION MARK
+19E0 ; [*03F7.0020.0002.19E0] # KHMER SYMBOL PATHAMASAT
+19E1 ; [*03F8.0020.0002.19E1] # KHMER SYMBOL MUOY KOET
+19E2 ; [*03F9.0020.0002.19E2] # KHMER SYMBOL PII KOET
+19E3 ; [*03FA.0020.0002.19E3] # KHMER SYMBOL BEI KOET
+19E4 ; [*03FB.0020.0002.19E4] # KHMER SYMBOL BUON KOET
+19E5 ; [*03FC.0020.0002.19E5] # KHMER SYMBOL PRAM KOET
+19E6 ; [*03FD.0020.0002.19E6] # KHMER SYMBOL PRAM-MUOY KOET
+19E7 ; [*03FE.0020.0002.19E7] # KHMER SYMBOL PRAM-PII KOET
+19E8 ; [*03FF.0020.0002.19E8] # KHMER SYMBOL PRAM-BEI KOET
+19E9 ; [*0400.0020.0002.19E9] # KHMER SYMBOL PRAM-BUON KOET
+19EA ; [*0401.0020.0002.19EA] # KHMER SYMBOL DAP KOET
+19EB ; [*0402.0020.0002.19EB] # KHMER SYMBOL DAP-MUOY KOET
+19EC ; [*0403.0020.0002.19EC] # KHMER SYMBOL DAP-PII KOET
+19ED ; [*0404.0020.0002.19ED] # KHMER SYMBOL DAP-BEI KOET
+19EE ; [*0405.0020.0002.19EE] # KHMER SYMBOL DAP-BUON KOET
+19EF ; [*0406.0020.0002.19EF] # KHMER SYMBOL DAP-PRAM KOET
+19F0 ; [*0407.0020.0002.19F0] # KHMER SYMBOL TUTEYASAT
+19F1 ; [*0408.0020.0002.19F1] # KHMER SYMBOL MUOY ROC
+19F2 ; [*0409.0020.0002.19F2] # KHMER SYMBOL PII ROC
+19F3 ; [*040A.0020.0002.19F3] # KHMER SYMBOL BEI ROC
+19F4 ; [*040B.0020.0002.19F4] # KHMER SYMBOL BUON ROC
+19F5 ; [*040C.0020.0002.19F5] # KHMER SYMBOL PRAM ROC
+19F6 ; [*040D.0020.0002.19F6] # KHMER SYMBOL PRAM-MUOY ROC
+19F7 ; [*040E.0020.0002.19F7] # KHMER SYMBOL PRAM-PII ROC
+19F8 ; [*040F.0020.0002.19F8] # KHMER SYMBOL PRAM-BEI ROC
+19F9 ; [*0410.0020.0002.19F9] # KHMER SYMBOL PRAM-BUON ROC
+19FA ; [*0411.0020.0002.19FA] # KHMER SYMBOL DAP ROC
+19FB ; [*0412.0020.0002.19FB] # KHMER SYMBOL DAP-MUOY ROC
+19FC ; [*0413.0020.0002.19FC] # KHMER SYMBOL DAP-PII ROC
+19FD ; [*0414.0020.0002.19FD] # KHMER SYMBOL DAP-BEI ROC
+19FE ; [*0415.0020.0002.19FE] # KHMER SYMBOL DAP-BUON ROC
+19FF ; [*0416.0020.0002.19FF] # KHMER SYMBOL DAP-PRAM ROC
+1A1E ; [*0287.0020.0002.1A1E] # BUGINESE PALLAWA
+1A1F ; [*0288.0020.0002.1A1F] # BUGINESE END OF SECTION
+1B5A ; [*0289.0020.0002.1B5A] # BALINESE PANTI
+1B5B ; [*028A.0020.0002.1B5B] # BALINESE PAMADA
+1B5C ; [*026F.0020.0002.1B5C] # BALINESE WINDU
+1B5D ; [*0253.0020.0002.1B5D] # BALINESE CARIK PAMUNGKAH
+1B5E ; [*027E.0020.0002.1B5E] # BALINESE CARIK SIKI
+1B5F ; [*027F.0020.0002.1B5F] # BALINESE CARIK PAREREN
+1B60 ; [*0224.0020.0002.1B60] # BALINESE PAMENENG
+1B61 ; [*0417.0020.0002.1B61] # BALINESE MUSICAL SYMBOL DONG
+1B62 ; [*0418.0020.0002.1B62] # BALINESE MUSICAL SYMBOL DENG
+1B63 ; [*0419.0020.0002.1B63] # BALINESE MUSICAL SYMBOL DUNG
+1B64 ; [*041A.0020.0002.1B64] # BALINESE MUSICAL SYMBOL DANG
+1B65 ; [*041B.0020.0002.1B65] # BALINESE MUSICAL SYMBOL DANG SURANG
+1B66 ; [*041C.0020.0002.1B66] # BALINESE MUSICAL SYMBOL DING
+1B67 ; [*041D.0020.0002.1B67] # BALINESE MUSICAL SYMBOL DAENG
+1B68 ; [*041E.0020.0002.1B68] # BALINESE MUSICAL SYMBOL DEUNG
+1B69 ; [*041F.0020.0002.1B69] # BALINESE MUSICAL SYMBOL DAING
+1B6A ; [*0420.0020.0002.1B6A] # BALINESE MUSICAL SYMBOL DANG GEDE
+1B6B ; [.0000.0000.0000.1B6B] # BALINESE MUSICAL SYMBOL COMBINING TEGEH
+1B6C ; [.0000.0000.0000.1B6C] # BALINESE MUSICAL SYMBOL COMBINING ENDEP
+1B6D ; [.0000.0000.0000.1B6D] # BALINESE MUSICAL SYMBOL COMBINING KEMPUL
+1B6E ; [.0000.0000.0000.1B6E] # BALINESE MUSICAL SYMBOL COMBINING KEMPLI
+1B6F ; [.0000.0000.0000.1B6F] # BALINESE MUSICAL SYMBOL COMBINING JEGOGAN
+1B70 ; [.0000.0000.0000.1B70] # BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN
+1B71 ; [.0000.0000.0000.1B71] # BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN
+1B72 ; [.0000.0000.0000.1B72] # BALINESE MUSICAL SYMBOL COMBINING BENDE
+1B73 ; [.0000.0000.0000.1B73] # BALINESE MUSICAL SYMBOL COMBINING GONG
+1B74 ; [*0421.0020.0002.1B74] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG
+1B75 ; [*0422.0020.0002.1B75] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG
+1B76 ; [*0423.0020.0002.1B76] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK
+1B77 ; [*0424.0020.0002.1B77] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK
+1B78 ; [*0425.0020.0002.1B78] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG
+1B79 ; [*0426.0020.0002.1B79] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG
+1B7A ; [*0427.0020.0002.1B7A] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK
+1B7B ; [*0428.0020.0002.1B7B] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK
+1B7C ; [*0429.0020.0002.1B7C] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+1FBD ; [*0218.0020.0002.1FBD] # GREEK KORONIS; QQC
+1FBF ; [*0218.0020.0002.1FBF] # GREEK PSILI
+1FC0 ; [*021E.0020.0002.1FC0] # GREEK PERISPOMENI
+1FC1 ; [*0215.0020.0002.00A8][.0000.0045.0002.0342] # GREEK DIALYTIKA AND PERISPOMENI; QQCM
+1FCD ; [*0218.0020.0002.1FBF][.0000.0035.0002.0300] # GREEK PSILI AND VARIA; QQCM
+1FCE ; [*0218.0020.0002.1FBF][.0000.0032.0002.0301] # GREEK PSILI AND OXIA; QQCM
+1FCF ; [*0218.0020.0002.1FBF][.0000.0045.0002.0342] # GREEK PSILI AND PERISPOMENI; QQCM
+1FDD ; [*0219.0020.0002.1FFE][.0000.0035.0002.0300] # GREEK DASIA AND VARIA; QQCM
+1FDE ; [*0219.0020.0002.1FFE][.0000.0032.0002.0301] # GREEK DASIA AND OXIA; QQCM
+1FDF ; [*0219.0020.0002.1FFE][.0000.0045.0002.0342] # GREEK DASIA AND PERISPOMENI; QQCM
+1FED ; [*0215.0020.0002.00A8][.0000.0035.0002.0300] # GREEK DIALYTIKA AND VARIA; QQCM
+1FEE ; [*0215.0020.0002.00A8][.0000.0032.0002.0301] # GREEK DIALYTIKA AND OXIA; QQCM
+1FEF ; [*020D.0020.0002.1FEF] # GREEK VARIA; QQC
+1FFD ; [*020E.0020.0002.1FFD] # GREEK OXIA; QQC
+1FFE ; [*0219.0020.0002.1FFE] # GREEK DASIA
+2000 ; [*0209.0020.0004.2000] # EN QUAD; QQK
+2001 ; [*0209.0020.0004.2001] # EM QUAD; QQK
+2002 ; [*0209.0020.0004.2002] # EN SPACE; QQK
+2003 ; [*0209.0020.0004.2003] # EM SPACE; QQK
+2004 ; [*0209.0020.0004.2004] # THREE-PER-EM SPACE; QQK
+2005 ; [*0209.0020.0004.2005] # FOUR-PER-EM SPACE; QQK
+2006 ; [*0209.0020.0004.2006] # SIX-PER-EM SPACE; QQK
+2007 ; [*0209.0020.001B.2007] # FIGURE SPACE; QQK
+2008 ; [*0209.0020.0004.2008] # PUNCTUATION SPACE; QQK
+2009 ; [*0209.0020.0004.2009] # THIN SPACE; QQK
+200A ; [*0209.0020.0004.200A] # HAIR SPACE; QQK
+2010 ; [*0227.0020.0002.2010] # HYPHEN
+2011 ; [*0227.0020.001B.2011] # NON-BREAKING HYPHEN; QQK
+2012 ; [*0228.0020.0002.2012] # FIGURE DASH
+2013 ; [*0229.0020.0002.2013] # EN DASH
+2014 ; [*022A.0020.0002.2014] # EM DASH
+2015 ; [*022B.0020.0002.2015] # HORIZONTAL BAR
+2016 ; [*04C2.0020.0002.2016] # DOUBLE VERTICAL LINE
+2017 ; [*021D.0020.0002.2017] # DOUBLE LOW LINE
+2018 ; [*02A1.0020.0002.2018] # LEFT SINGLE QUOTATION MARK
+2019 ; [*02A2.0020.0002.2019] # RIGHT SINGLE QUOTATION MARK
+201A ; [*02A3.0020.0002.201A] # SINGLE LOW-9 QUOTATION MARK
+201B ; [*02A4.0020.0002.201B] # SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C ; [*02A8.0020.0002.201C] # LEFT DOUBLE QUOTATION MARK
+201D ; [*02A9.0020.0002.201D] # RIGHT DOUBLE QUOTATION MARK
+201E ; [*02AA.0020.0002.201E] # DOUBLE LOW-9 QUOTATION MARK
+201F ; [*02AB.0020.0002.201F] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020 ; [*030B.0020.0002.2020] # DAGGER
+2021 ; [*030C.0020.0002.2021] # DOUBLE DAGGER
+2022 ; [*030D.0020.0002.2022] # BULLET
+2023 ; [*030E.0020.0002.2023] # TRIANGULAR BULLET
+2024 ; [*0266.0020.0004.2024] # ONE DOT LEADER; QQK
+2025 ; [*0266.0020.0004.2025][*0266.0020.0004.2025] # TWO DOT LEADER; QQKN
+2026 ; [*0266.0020.0004.2026][*0266.0020.0004.2026][*0266.0020.001F.2026] # HORIZONTAL ELLIPSIS; QQKN
+2027 ; [*030F.0020.0002.2027] # HYPHENATION POINT
+2028 ; [*0207.0020.0002.2028] # LINE SEPARATOR
+2029 ; [*0208.0020.0002.2029] # PARAGRAPH SEPARATOR
+202F ; [*0209.0020.001B.202F] # NARROW NO-BREAK SPACE; QQK
+2030 ; [*0308.0020.0002.2030] # PER MILLE SIGN
+2031 ; [*0309.0020.0002.2031] # PER TEN THOUSAND SIGN
+2032 ; [*0313.0020.0002.2032] # PRIME
+2033 ; [*0313.0020.0004.2033][*0313.0020.0004.2033] # DOUBLE PRIME; QQKN
+2034 ; [*0313.0020.0004.2034][*0313.0020.0004.2034][*0313.0020.001F.2034] # TRIPLE PRIME; QQKN
+2035 ; [*0314.0020.0002.2035] # REVERSED PRIME
+2036 ; [*0314.0020.0004.2036][*0314.0020.0004.2036] # REVERSED DOUBLE PRIME; QQKN
+2037 ; [*0314.0020.0004.2037][*0314.0020.0004.2037][*0314.0020.001F.2037] # REVERSED TRIPLE PRIME; QQKN
+2038 ; [*0317.0020.0002.2038] # CARET
+2039 ; [*02A5.0020.0002.2039] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; [*02A6.0020.0002.203A] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B ; [*0318.0020.0002.203B] # REFERENCE MARK
+203C ; [*0257.0020.0004.203C][*0257.0020.0004.203C] # DOUBLE EXCLAMATION MARK; QQKN
+203D ; [*0265.0020.0002.203D] # INTERROBANG
+203E ; [*0212.0020.0002.203E] # OVERLINE
+203F ; [*0319.0020.0002.203F] # UNDERTIE
+2040 ; [*031B.0020.0002.2040] # CHARACTER TIE
+2041 ; [*031D.0020.0002.2041] # CARET INSERTION POINT
+2042 ; [*031E.0020.0002.2042] # ASTERISM
+2043 ; [*0310.0020.0002.2043] # HYPHEN BULLET
+2044 ; [*0300.0020.0002.2044] # FRACTION SLASH
+2045 ; [*02BD.0020.0002.2045] # LEFT SQUARE BRACKET WITH QUILL
+2046 ; [*02BE.0020.0002.2046] # RIGHT SQUARE BRACKET WITH QUILL
+2047 ; [*025C.0020.0004.2047][*025C.0020.0004.2047] # DOUBLE QUESTION MARK; QQKN
+2048 ; [*025C.0020.0004.2048][*0257.0020.0004.2048] # QUESTION EXCLAMATION MARK; QQKN
+2049 ; [*0257.0020.0004.2049][*025C.0020.0004.2049] # EXCLAMATION QUESTION MARK; QQKN
+204A ; [*0304.0020.0002.204A] # TIRONIAN SIGN ET
+204B ; [*02F7.0020.0002.204B] # REVERSED PILCROW SIGN
+204C ; [*0311.0020.0002.204C] # BLACK LEFTWARDS BULLET
+204D ; [*0312.0020.0002.204D] # BLACK RIGHTWARDS BULLET
+204E ; [*02FC.0020.0002.204E] # LOW ASTERISK
+204F ; [*0240.0020.0002.204F] # REVERSED SEMICOLON
+2050 ; [*031C.0020.0002.2050] # CLOSE UP
+2051 ; [*02FD.0020.0002.2051] # TWO ASTERISKS ALIGNED VERTICALLY
+2052 ; [*030A.0020.0002.2052] # COMMERCIAL MINUS SIGN
+2053 ; [*022C.0020.0002.2053] # SWUNG DASH
+2054 ; [*031A.0020.0002.2054] # INVERTED UNDERTIE
+2055 ; [*028B.0020.0002.2055] # FLOWER PUNCTUATION MARK
+2056 ; [*028C.0020.0002.2056] # THREE DOT PUNCTUATION
+2057 ; [*0313.0020.0004.2057][*0313.0020.0004.2057][*0313.0020.001F.2057][*0313.0020.001F.2057] # QUADRUPLE PRIME; QQKN
+2058 ; [*028D.0020.0002.2058] # FOUR DOT PUNCTUATION
+2059 ; [*028E.0020.0002.2059] # FIVE DOT PUNCTUATION
+205A ; [*028F.0020.0002.205A] # TWO DOT PUNCTUATION
+205B ; [*0290.0020.0002.205B] # FOUR DOT MARK
+205C ; [*0291.0020.0002.205C] # DOTTED CROSS
+205D ; [*0292.0020.0002.205D] # TRICOLON
+205E ; [*0293.0020.0002.205E] # VERTICAL FOUR DOTS
+205F ; [*0209.0020.0004.205F] # MEDIUM MATHEMATICAL SPACE; QQK
+2061 ; [.0000.0000.0000.2061] # FUNCTION APPLICATION
+2062 ; [.0000.0000.0000.2062] # INVISIBLE TIMES
+2063 ; [.0000.0000.0000.2063] # INVISIBLE SEPARATOR
+207A ; [*04B8.0020.0014.207A] # SUPERSCRIPT PLUS SIGN; QQK
+207B ; [*04C4.0020.0014.207B] # SUPERSCRIPT MINUS; QQK
+207C ; [*04BD.0020.0014.207C] # SUPERSCRIPT EQUALS SIGN; QQK
+207D ; [*02B1.0020.0014.207D] # SUPERSCRIPT LEFT PARENTHESIS; QQK
+207E ; [*02B2.0020.0014.207E] # SUPERSCRIPT RIGHT PARENTHESIS; QQK
+208A ; [*04B8.0020.0015.208A] # SUBSCRIPT PLUS SIGN; QQK
+208B ; [*04C4.0020.0015.208B] # SUBSCRIPT MINUS; QQK
+208C ; [*04BD.0020.0015.208C] # SUBSCRIPT EQUALS SIGN; QQK
+208D ; [*02B1.0020.0015.208D] # SUBSCRIPT LEFT PARENTHESIS; QQK
+208E ; [*02B2.0020.0015.208E] # SUBSCRIPT RIGHT PARENTHESIS; QQK
+2104 ; [*042A.0020.0002.2104] # CENTRE LINE SYMBOL
+2108 ; [*042B.0020.0002.2108] # SCRUPLE
+2114 ; [*042C.0020.0002.2114] # L B BAR SYMBOL
+2117 ; [*042D.0020.0002.2117] # SOUND RECORDING COPYRIGHT
+2118 ; [*042E.0020.0002.2118] # SCRIPT CAPITAL P
+211E ; [*042F.0020.0002.211E] # PRESCRIPTION TAKE
+211F ; [*0430.0020.0002.211F] # RESPONSE
+2123 ; [*0431.0020.0002.2123] # VERSICLE
+2125 ; [*0432.0020.0002.2125] # OUNCE SIGN
+2127 ; [*0433.0020.0002.2127] # INVERTED OHM SIGN
+2129 ; [*0434.0020.0002.2129] # TURNED GREEK SMALL LETTER IOTA
+212E ; [*0435.0020.0002.212E] # ESTIMATED SYMBOL
+213A ; [*0436.0020.0002.213A] # ROTATED CAPITAL Q
+2140 ; [*04B7.0020.0005.2140] # DOUBLE-STRUCK N-ARY SUMMATION; QQK
+2141 ; [*0437.0020.0002.2141] # TURNED SANS-SERIF CAPITAL G
+2142 ; [*0438.0020.0002.2142] # TURNED SANS-SERIF CAPITAL L
+2143 ; [*0439.0020.0002.2143] # REVERSED SANS-SERIF CAPITAL L
+2144 ; [*043A.0020.0002.2144] # TURNED SANS-SERIF CAPITAL Y
+214A ; [*043B.0020.0002.214A] # PROPERTY LINE
+214B ; [*0303.0020.0002.214B] # TURNED AMPERSAND
+214C ; [*043C.0020.0002.214C] # PER SIGN
+214D ; [*043D.0020.0002.214D] # AKTIESELSKAB
+2180 ; [*0F23.0020.0002.2180] # ROMAN NUMERAL ONE THOUSAND C D
+2181 ; [*0F24.0020.0002.2181] # ROMAN NUMERAL FIVE THOUSAND
+2182 ; [*0F25.0020.0002.2182] # ROMAN NUMERAL TEN THOUSAND
+2190 ; [*043E.0020.0002.2190] # LEFTWARDS ARROW
+2191 ; [*0440.0020.0002.2191] # UPWARDS ARROW
+2192 ; [*043F.0020.0002.2192] # RIGHTWARDS ARROW
+2193 ; [*0441.0020.0002.2193] # DOWNWARDS ARROW
+2194 ; [*0442.0020.0002.2194] # LEFT RIGHT ARROW
+2195 ; [*0443.0020.0002.2195] # UP DOWN ARROW
+2196 ; [*0444.0020.0002.2196] # NORTH WEST ARROW
+2197 ; [*0445.0020.0002.2197] # NORTH EAST ARROW
+2198 ; [*0446.0020.0002.2198] # SOUTH EAST ARROW
+2199 ; [*0447.0020.0002.2199] # SOUTH WEST ARROW
+219A ; [*043E.0020.0002.2190][.0000.0054.0002.0338] # LEFTWARDS ARROW WITH STROKE; QQCM
+219B ; [*043F.0020.0002.2192][.0000.0054.0002.0338] # RIGHTWARDS ARROW WITH STROKE; QQCM
+219C ; [*0448.0020.0002.219C] # LEFTWARDS WAVE ARROW
+219D ; [*0449.0020.0002.219D] # RIGHTWARDS WAVE ARROW
+219E ; [*044A.0020.0002.219E] # LEFTWARDS TWO HEADED ARROW
+219F ; [*044B.0020.0002.219F] # UPWARDS TWO HEADED ARROW
+21A0 ; [*044C.0020.0002.21A0] # RIGHTWARDS TWO HEADED ARROW
+21A1 ; [*044D.0020.0002.21A1] # DOWNWARDS TWO HEADED ARROW
+21A2 ; [*044E.0020.0002.21A2] # LEFTWARDS ARROW WITH TAIL
+21A3 ; [*044F.0020.0002.21A3] # RIGHTWARDS ARROW WITH TAIL
+21A4 ; [*0450.0020.0002.21A4] # LEFTWARDS ARROW FROM BAR
+21A5 ; [*0451.0020.0002.21A5] # UPWARDS ARROW FROM BAR
+21A6 ; [*0452.0020.0002.21A6] # RIGHTWARDS ARROW FROM BAR
+21A7 ; [*0453.0020.0002.21A7] # DOWNWARDS ARROW FROM BAR
+21A8 ; [*0454.0020.0002.21A8] # UP DOWN ARROW WITH BASE
+21A9 ; [*0455.0020.0002.21A9] # LEFTWARDS ARROW WITH HOOK
+21AA ; [*0456.0020.0002.21AA] # RIGHTWARDS ARROW WITH HOOK
+21AB ; [*0457.0020.0002.21AB] # LEFTWARDS ARROW WITH LOOP
+21AC ; [*0458.0020.0002.21AC] # RIGHTWARDS ARROW WITH LOOP
+21AD ; [*0459.0020.0002.21AD] # LEFT RIGHT WAVE ARROW
+21AE ; [*0442.0020.0002.2194][.0000.0054.0002.0338] # LEFT RIGHT ARROW WITH STROKE; QQCM
+21AF ; [*045A.0020.0002.21AF] # DOWNWARDS ZIGZAG ARROW
+21B0 ; [*045B.0020.0002.21B0] # UPWARDS ARROW WITH TIP LEFTWARDS
+21B1 ; [*045C.0020.0002.21B1] # UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2 ; [*045D.0020.0002.21B2] # DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3 ; [*045E.0020.0002.21B3] # DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4 ; [*045F.0020.0002.21B4] # RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21B5 ; [*0460.0020.0002.21B5] # DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21B6 ; [*0461.0020.0002.21B6] # ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7 ; [*0462.0020.0002.21B7] # CLOCKWISE TOP SEMICIRCLE ARROW
+21B8 ; [*0463.0020.0002.21B8] # NORTH WEST ARROW TO LONG BAR
+21B9 ; [*0464.0020.0002.21B9] # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21BA ; [*0465.0020.0002.21BA] # ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB ; [*0466.0020.0002.21BB] # CLOCKWISE OPEN CIRCLE ARROW
+21BC ; [*0467.0020.0002.21BC] # LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD ; [*0468.0020.0002.21BD] # LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE ; [*0469.0020.0002.21BE] # UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF ; [*046A.0020.0002.21BF] # UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0 ; [*046B.0020.0002.21C0] # RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1 ; [*046C.0020.0002.21C1] # RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2 ; [*046D.0020.0002.21C2] # DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3 ; [*046E.0020.0002.21C3] # DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4 ; [*046F.0020.0002.21C4] # RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5 ; [*0470.0020.0002.21C5] # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6 ; [*0471.0020.0002.21C6] # LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7 ; [*0472.0020.0002.21C7] # LEFTWARDS PAIRED ARROWS
+21C8 ; [*0473.0020.0002.21C8] # UPWARDS PAIRED ARROWS
+21C9 ; [*0474.0020.0002.21C9] # RIGHTWARDS PAIRED ARROWS
+21CA ; [*0475.0020.0002.21CA] # DOWNWARDS PAIRED ARROWS
+21CB ; [*0476.0020.0002.21CB] # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC ; [*0477.0020.0002.21CC] # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD ; [*0478.0020.0002.21D0][.0000.0054.0002.0338] # LEFTWARDS DOUBLE ARROW WITH STROKE; QQCM
+21CE ; [*047C.0020.0002.21D4][.0000.0054.0002.0338] # LEFT RIGHT DOUBLE ARROW WITH STROKE; QQCM
+21CF ; [*047A.0020.0002.21D2][.0000.0054.0002.0338] # RIGHTWARDS DOUBLE ARROW WITH STROKE; QQCM
+21D0 ; [*0478.0020.0002.21D0] # LEFTWARDS DOUBLE ARROW
+21D1 ; [*0479.0020.0002.21D1] # UPWARDS DOUBLE ARROW
+21D2 ; [*047A.0020.0002.21D2] # RIGHTWARDS DOUBLE ARROW
+21D3 ; [*047B.0020.0002.21D3] # DOWNWARDS DOUBLE ARROW
+21D4 ; [*047C.0020.0002.21D4] # LEFT RIGHT DOUBLE ARROW
+21D5 ; [*047D.0020.0002.21D5] # UP DOWN DOUBLE ARROW
+21D6 ; [*047E.0020.0002.21D6] # NORTH WEST DOUBLE ARROW
+21D7 ; [*047F.0020.0002.21D7] # NORTH EAST DOUBLE ARROW
+21D8 ; [*0480.0020.0002.21D8] # SOUTH EAST DOUBLE ARROW
+21D9 ; [*0481.0020.0002.21D9] # SOUTH WEST DOUBLE ARROW
+21DA ; [*0482.0020.0002.21DA] # LEFTWARDS TRIPLE ARROW
+21DB ; [*0483.0020.0002.21DB] # RIGHTWARDS TRIPLE ARROW
+21DC ; [*0484.0020.0002.21DC] # LEFTWARDS SQUIGGLE ARROW
+21DD ; [*0485.0020.0002.21DD] # RIGHTWARDS SQUIGGLE ARROW
+21DE ; [*0486.0020.0002.21DE] # UPWARDS ARROW WITH DOUBLE STROKE
+21DF ; [*0487.0020.0002.21DF] # DOWNWARDS ARROW WITH DOUBLE STROKE
+21E0 ; [*0488.0020.0002.21E0] # LEFTWARDS DASHED ARROW
+21E1 ; [*0489.0020.0002.21E1] # UPWARDS DASHED ARROW
+21E2 ; [*048A.0020.0002.21E2] # RIGHTWARDS DASHED ARROW
+21E3 ; [*048B.0020.0002.21E3] # DOWNWARDS DASHED ARROW
+21E4 ; [*048C.0020.0002.21E4] # LEFTWARDS ARROW TO BAR
+21E5 ; [*048D.0020.0002.21E5] # RIGHTWARDS ARROW TO BAR
+21E6 ; [*048E.0020.0002.21E6] # LEFTWARDS WHITE ARROW
+21E7 ; [*048F.0020.0002.21E7] # UPWARDS WHITE ARROW
+21E8 ; [*0490.0020.0002.21E8] # RIGHTWARDS WHITE ARROW
+21E9 ; [*0491.0020.0002.21E9] # DOWNWARDS WHITE ARROW
+21EA ; [*0492.0020.0002.21EA] # UPWARDS WHITE ARROW FROM BAR
+21EB ; [*0493.0020.0002.21EB] # UPWARDS WHITE ARROW ON PEDESTAL
+21EC ; [*0494.0020.0002.21EC] # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ED ; [*0495.0020.0002.21ED] # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21EE ; [*0496.0020.0002.21EE] # UPWARDS WHITE DOUBLE ARROW
+21EF ; [*0497.0020.0002.21EF] # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21F0 ; [*0498.0020.0002.21F0] # RIGHTWARDS WHITE ARROW FROM WALL
+21F1 ; [*0499.0020.0002.21F1] # NORTH WEST ARROW TO CORNER
+21F2 ; [*049A.0020.0002.21F2] # SOUTH EAST ARROW TO CORNER
+21F3 ; [*049B.0020.0002.21F3] # UP DOWN WHITE ARROW
+21F4 ; [*049C.0020.0002.21F4] # RIGHT ARROW WITH SMALL CIRCLE
+21F5 ; [*049D.0020.0002.21F5] # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+21F6 ; [*049E.0020.0002.21F6] # THREE RIGHTWARDS ARROWS
+21F7 ; [*049F.0020.0002.21F7] # LEFTWARDS ARROW WITH VERTICAL STROKE
+21F8 ; [*04A0.0020.0002.21F8] # RIGHTWARDS ARROW WITH VERTICAL STROKE
+21F9 ; [*04A1.0020.0002.21F9] # LEFT RIGHT ARROW WITH VERTICAL STROKE
+21FA ; [*04A2.0020.0002.21FA] # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FB ; [*04A3.0020.0002.21FB] # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FC ; [*04A4.0020.0002.21FC] # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+21FD ; [*04A5.0020.0002.21FD] # LEFTWARDS OPEN-HEADED ARROW
+21FE ; [*04A6.0020.0002.21FE] # RIGHTWARDS OPEN-HEADED ARROW
+21FF ; [*04A7.0020.0002.21FF] # LEFT RIGHT OPEN-HEADED ARROW
+2200 ; [*04A8.0020.0002.2200] # FOR ALL
+2201 ; [*04A9.0020.0002.2201] # COMPLEMENT
+2202 ; [*04AA.0020.0002.2202] # PARTIAL DIFFERENTIAL
+2203 ; [*04AB.0020.0002.2203] # THERE EXISTS
+2204 ; [*04AB.0020.0002.2203][.0000.0054.0002.0338] # THERE DOES NOT EXIST; QQCM
+2205 ; [*04AC.0020.0002.2205] # EMPTY SET
+2206 ; [*04AD.0020.0002.2206] # INCREMENT
+2207 ; [*04AE.0020.0002.2207] # NABLA
+2208 ; [*04AF.0020.0002.2208] # ELEMENT OF
+2209 ; [*04AF.0020.0002.2208][.0000.0054.0002.0338] # NOT AN ELEMENT OF; QQCM
+220A ; [*04B0.0020.0002.220A] # SMALL ELEMENT OF
+220B ; [*04B1.0020.0002.220B] # CONTAINS AS MEMBER
+220C ; [*04B1.0020.0002.220B][.0000.0054.0002.0338] # DOES NOT CONTAIN AS MEMBER; QQCM
+220D ; [*04B2.0020.0002.220D] # SMALL CONTAINS AS MEMBER
+220E ; [*04B4.0020.0002.220E] # END OF PROOF
+220F ; [*04B5.0020.0002.220F] # N-ARY PRODUCT
+2210 ; [*04B6.0020.0002.2210] # N-ARY COPRODUCT
+2211 ; [*04B7.0020.0002.2211] # N-ARY SUMMATION
+2212 ; [*04C4.0020.0002.2212] # MINUS SIGN
+2213 ; [*04C5.0020.0002.2213] # MINUS-OR-PLUS SIGN
+2214 ; [*04C6.0020.0002.2214] # DOT PLUS
+2215 ; [*04C7.0020.0002.2215] # DIVISION SLASH
+2216 ; [*04C8.0020.0002.2216] # SET MINUS
+2217 ; [*04C9.0020.0002.2217] # ASTERISK OPERATOR
+2218 ; [*04CA.0020.0002.2218] # RING OPERATOR
+2219 ; [*04CB.0020.0002.2219] # BULLET OPERATOR
+221A ; [*04CC.0020.0002.221A] # SQUARE ROOT
+221B ; [*04CD.0020.0002.221B] # CUBE ROOT
+221C ; [*04CE.0020.0002.221C] # FOURTH ROOT
+221D ; [*04CF.0020.0002.221D] # PROPORTIONAL TO
+221E ; [*04D0.0020.0002.221E] # INFINITY
+221F ; [*04D1.0020.0002.221F] # RIGHT ANGLE
+2220 ; [*04D2.0020.0002.2220] # ANGLE
+2221 ; [*04D3.0020.0002.2221] # MEASURED ANGLE
+2222 ; [*04D4.0020.0002.2222] # SPHERICAL ANGLE
+2223 ; [*04D5.0020.0002.2223] # DIVIDES
+2224 ; [*04D5.0020.0002.2223][.0000.0054.0002.0338] # DOES NOT DIVIDE; QQCM
+2225 ; [*04D6.0020.0002.2225] # PARALLEL TO
+2226 ; [*04D6.0020.0002.2225][.0000.0054.0002.0338] # NOT PARALLEL TO; QQCM
+2227 ; [*04D7.0020.0002.2227] # LOGICAL AND
+2228 ; [*04D8.0020.0002.2228] # LOGICAL OR
+2229 ; [*04D9.0020.0002.2229] # INTERSECTION
+222A ; [*04DA.0020.0002.222A] # UNION
+222B ; [*04DB.0020.0002.222B] # INTEGRAL
+222C ; [*04DB.0020.0004.222C][*04DB.0020.0004.222C] # DOUBLE INTEGRAL; QQKN
+222D ; [*04DB.0020.0004.222D][*04DB.0020.0004.222D][*04DB.0020.001F.222D] # TRIPLE INTEGRAL; QQKN
+222E ; [*04DC.0020.0002.222E] # CONTOUR INTEGRAL
+222F ; [*04DC.0020.0004.222F][*04DC.0020.0004.222F] # SURFACE INTEGRAL; QQKN
+2230 ; [*04DC.0020.0004.2230][*04DC.0020.0004.2230][*04DC.0020.001F.2230] # VOLUME INTEGRAL; QQKN
+2231 ; [*04DD.0020.0002.2231] # CLOCKWISE INTEGRAL
+2232 ; [*04DE.0020.0002.2232] # CLOCKWISE CONTOUR INTEGRAL
+2233 ; [*04DF.0020.0002.2233] # ANTICLOCKWISE CONTOUR INTEGRAL
+2234 ; [*04E0.0020.0002.2234] # THEREFORE
+2235 ; [*04E1.0020.0002.2235] # BECAUSE
+2236 ; [*04E2.0020.0002.2236] # RATIO
+2237 ; [*04E3.0020.0002.2237] # PROPORTION
+2238 ; [*04E4.0020.0002.2238] # DOT MINUS
+2239 ; [*04E5.0020.0002.2239] # EXCESS
+223A ; [*04E6.0020.0002.223A] # GEOMETRIC PROPORTION
+223B ; [*04E7.0020.0002.223B] # HOMOTHETIC
+223C ; [*04E8.0020.0002.223C] # TILDE OPERATOR
+223D ; [*04E9.0020.0002.223D] # REVERSED TILDE
+223E ; [*04EA.0020.0002.223E] # INVERTED LAZY S
+223F ; [*04EB.0020.0002.223F] # SINE WAVE
+2240 ; [*04EC.0020.0002.2240] # WREATH PRODUCT
+2241 ; [*04E8.0020.0002.223C][.0000.0054.0002.0338] # NOT TILDE; QQCM
+2242 ; [*04ED.0020.0002.2242] # MINUS TILDE
+2243 ; [*04EE.0020.0002.2243] # ASYMPTOTICALLY EQUAL TO
+2244 ; [*04EE.0020.0002.2243][.0000.0054.0002.0338] # NOT ASYMPTOTICALLY EQUAL TO; QQCM
+2245 ; [*04EF.0020.0002.2245] # APPROXIMATELY EQUAL TO
+2246 ; [*04F0.0020.0002.2246] # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247 ; [*04EF.0020.0002.2245][.0000.0054.0002.0338] # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO; QQCM
+2248 ; [*04F1.0020.0002.2248] # ALMOST EQUAL TO
+2249 ; [*04F1.0020.0002.2248][.0000.0054.0002.0338] # NOT ALMOST EQUAL TO; QQCM
+224A ; [*04F2.0020.0002.224A] # ALMOST EQUAL OR EQUAL TO
+224B ; [*04F3.0020.0002.224B] # TRIPLE TILDE
+224C ; [*04F4.0020.0002.224C] # ALL EQUAL TO
+224D ; [*04F5.0020.0002.224D] # EQUIVALENT TO
+224E ; [*04F6.0020.0002.224E] # GEOMETRICALLY EQUIVALENT TO
+224F ; [*04F7.0020.0002.224F] # DIFFERENCE BETWEEN
+2250 ; [*04F8.0020.0002.2250] # APPROACHES THE LIMIT
+2251 ; [*04F9.0020.0002.2251] # GEOMETRICALLY EQUAL TO
+2252 ; [*04FA.0020.0002.2252] # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253 ; [*04FB.0020.0002.2253] # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254 ; [*04FC.0020.0002.2254] # COLON EQUALS
+2255 ; [*04FD.0020.0002.2255] # EQUALS COLON
+2256 ; [*04FE.0020.0002.2256] # RING IN EQUAL TO
+2257 ; [*04FF.0020.0002.2257] # RING EQUAL TO
+2258 ; [*0500.0020.0002.2258] # CORRESPONDS TO
+2259 ; [*0501.0020.0002.2259] # ESTIMATES
+225A ; [*0502.0020.0002.225A] # EQUIANGULAR TO
+225B ; [*0503.0020.0002.225B] # STAR EQUALS
+225C ; [*0504.0020.0002.225C] # DELTA EQUAL TO
+225D ; [*0505.0020.0002.225D] # EQUAL TO BY DEFINITION
+225E ; [*0506.0020.0002.225E] # MEASURED BY
+225F ; [*0507.0020.0002.225F] # QUESTIONED EQUAL TO
+2260 ; [*04BD.0020.0002.003D][.0000.0054.0002.0338] # NOT EQUAL TO; QQCM
+2261 ; [*0508.0020.0002.2261] # IDENTICAL TO
+2262 ; [*0508.0020.0002.2261][.0000.0054.0002.0338] # NOT IDENTICAL TO; QQCM
+2263 ; [*0509.0020.0002.2263] # STRICTLY EQUIVALENT TO
+2264 ; [*050A.0020.0002.2264] # LESS-THAN OR EQUAL TO
+2265 ; [*050B.0020.0002.2265] # GREATER-THAN OR EQUAL TO
+2266 ; [*050C.0020.0002.2266] # LESS-THAN OVER EQUAL TO
+2267 ; [*050D.0020.0002.2267] # GREATER-THAN OVER EQUAL TO
+2268 ; [*050E.0020.0002.2268] # LESS-THAN BUT NOT EQUAL TO
+2269 ; [*050F.0020.0002.2269] # GREATER-THAN BUT NOT EQUAL TO
+226A ; [*0510.0020.0002.226A] # MUCH LESS-THAN
+226B ; [*0511.0020.0002.226B] # MUCH GREATER-THAN
+226C ; [*0512.0020.0002.226C] # BETWEEN
+226D ; [*04F5.0020.0002.224D][.0000.0054.0002.0338] # NOT EQUIVALENT TO; QQCM
+226E ; [*04BC.0020.0002.003C][.0000.0054.0002.0338] # NOT LESS-THAN; QQCM
+226F ; [*04BE.0020.0002.003E][.0000.0054.0002.0338] # NOT GREATER-THAN; QQCM
+2270 ; [*050A.0020.0002.2264][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR EQUAL TO; QQCM
+2271 ; [*050B.0020.0002.2265][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR EQUAL TO; QQCM
+2272 ; [*0513.0020.0002.2272] # LESS-THAN OR EQUIVALENT TO
+2273 ; [*0514.0020.0002.2273] # GREATER-THAN OR EQUIVALENT TO
+2274 ; [*0513.0020.0002.2272][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR EQUIVALENT TO; QQCM
+2275 ; [*0514.0020.0002.2273][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR EQUIVALENT TO; QQCM
+2276 ; [*0515.0020.0002.2276] # LESS-THAN OR GREATER-THAN
+2277 ; [*0516.0020.0002.2277] # GREATER-THAN OR LESS-THAN
+2278 ; [*0515.0020.0002.2276][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR GREATER-THAN; QQCM
+2279 ; [*0516.0020.0002.2277][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR LESS-THAN; QQCM
+227A ; [*0517.0020.0002.227A] # PRECEDES
+227B ; [*0518.0020.0002.227B] # SUCCEEDS
+227C ; [*0519.0020.0002.227C] # PRECEDES OR EQUAL TO
+227D ; [*051A.0020.0002.227D] # SUCCEEDS OR EQUAL TO
+227E ; [*051B.0020.0002.227E] # PRECEDES OR EQUIVALENT TO
+227F ; [*051C.0020.0002.227F] # SUCCEEDS OR EQUIVALENT TO
+2280 ; [*0517.0020.0002.227A][.0000.0054.0002.0338] # DOES NOT PRECEDE; QQCM
+2281 ; [*0518.0020.0002.227B][.0000.0054.0002.0338] # DOES NOT SUCCEED; QQCM
+2282 ; [*051D.0020.0002.2282] # SUBSET OF
+2283 ; [*051E.0020.0002.2283] # SUPERSET OF
+2284 ; [*051D.0020.0002.2282][.0000.0054.0002.0338] # NOT A SUBSET OF; QQCM
+2285 ; [*051E.0020.0002.2283][.0000.0054.0002.0338] # NOT A SUPERSET OF; QQCM
+2286 ; [*051F.0020.0002.2286] # SUBSET OF OR EQUAL TO
+2287 ; [*0520.0020.0002.2287] # SUPERSET OF OR EQUAL TO
+2288 ; [*051F.0020.0002.2286][.0000.0054.0002.0338] # NEITHER A SUBSET OF NOR EQUAL TO; QQCM
+2289 ; [*0520.0020.0002.2287][.0000.0054.0002.0338] # NEITHER A SUPERSET OF NOR EQUAL TO; QQCM
+228A ; [*0521.0020.0002.228A] # SUBSET OF WITH NOT EQUAL TO
+228B ; [*0522.0020.0002.228B] # SUPERSET OF WITH NOT EQUAL TO
+228C ; [*0523.0020.0002.228C] # MULTISET
+228D ; [*0524.0020.0002.228D] # MULTISET MULTIPLICATION
+228E ; [*0525.0020.0002.228E] # MULTISET UNION
+228F ; [*0526.0020.0002.228F] # SQUARE IMAGE OF
+2290 ; [*0527.0020.0002.2290] # SQUARE ORIGINAL OF
+2291 ; [*0528.0020.0002.2291] # SQUARE IMAGE OF OR EQUAL TO
+2292 ; [*0529.0020.0002.2292] # SQUARE ORIGINAL OF OR EQUAL TO
+2293 ; [*052A.0020.0002.2293] # SQUARE CAP
+2294 ; [*052B.0020.0002.2294] # SQUARE CUP
+2295 ; [*052C.0020.0002.2295] # CIRCLED PLUS
+2296 ; [*052D.0020.0002.2296] # CIRCLED MINUS
+2297 ; [*052E.0020.0002.2297] # CIRCLED TIMES
+2298 ; [*052F.0020.0002.2298] # CIRCLED DIVISION SLASH
+2299 ; [*0530.0020.0002.2299] # CIRCLED DOT OPERATOR
+229A ; [*0531.0020.0002.229A] # CIRCLED RING OPERATOR
+229B ; [*0532.0020.0002.229B] # CIRCLED ASTERISK OPERATOR
+229C ; [*0533.0020.0002.229C] # CIRCLED EQUALS
+229D ; [*0534.0020.0002.229D] # CIRCLED DASH
+229E ; [*0535.0020.0002.229E] # SQUARED PLUS
+229F ; [*0536.0020.0002.229F] # SQUARED MINUS
+22A0 ; [*0537.0020.0002.22A0] # SQUARED TIMES
+22A1 ; [*0538.0020.0002.22A1] # SQUARED DOT OPERATOR
+22A2 ; [*0539.0020.0002.22A2] # RIGHT TACK
+22A3 ; [*053A.0020.0002.22A3] # LEFT TACK
+22A4 ; [*053B.0020.0002.22A4] # DOWN TACK
+22A5 ; [*053C.0020.0002.22A5] # UP TACK
+22A6 ; [*053D.0020.0002.22A6] # ASSERTION
+22A7 ; [*053E.0020.0002.22A7] # MODELS
+22A8 ; [*053F.0020.0002.22A8] # TRUE
+22A9 ; [*0540.0020.0002.22A9] # FORCES
+22AA ; [*0541.0020.0002.22AA] # TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB ; [*0542.0020.0002.22AB] # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC ; [*0539.0020.0002.22A2][.0000.0054.0002.0338] # DOES NOT PROVE; QQCM
+22AD ; [*053F.0020.0002.22A8][.0000.0054.0002.0338] # NOT TRUE; QQCM
+22AE ; [*0540.0020.0002.22A9][.0000.0054.0002.0338] # DOES NOT FORCE; QQCM
+22AF ; [*0542.0020.0002.22AB][.0000.0054.0002.0338] # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE; QQCM
+22B0 ; [*0543.0020.0002.22B0] # PRECEDES UNDER RELATION
+22B1 ; [*0544.0020.0002.22B1] # SUCCEEDS UNDER RELATION
+22B2 ; [*0545.0020.0002.22B2] # NORMAL SUBGROUP OF
+22B3 ; [*0546.0020.0002.22B3] # CONTAINS AS NORMAL SUBGROUP
+22B4 ; [*0547.0020.0002.22B4] # NORMAL SUBGROUP OF OR EQUAL TO
+22B5 ; [*0548.0020.0002.22B5] # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6 ; [*0549.0020.0002.22B6] # ORIGINAL OF
+22B7 ; [*054A.0020.0002.22B7] # IMAGE OF
+22B8 ; [*054B.0020.0002.22B8] # MULTIMAP
+22B9 ; [*054C.0020.0002.22B9] # HERMITIAN CONJUGATE MATRIX
+22BA ; [*054D.0020.0002.22BA] # INTERCALATE
+22BB ; [*054E.0020.0002.22BB] # XOR
+22BC ; [*054F.0020.0002.22BC] # NAND
+22BD ; [*0550.0020.0002.22BD] # NOR
+22BE ; [*0551.0020.0002.22BE] # RIGHT ANGLE WITH ARC
+22BF ; [*0552.0020.0002.22BF] # RIGHT TRIANGLE
+22C0 ; [*0553.0020.0002.22C0] # N-ARY LOGICAL AND
+22C1 ; [*0554.0020.0002.22C1] # N-ARY LOGICAL OR
+22C2 ; [*0555.0020.0002.22C2] # N-ARY INTERSECTION
+22C3 ; [*0556.0020.0002.22C3] # N-ARY UNION
+22C4 ; [*0557.0020.0002.22C4] # DIAMOND OPERATOR
+22C5 ; [*0558.0020.0002.22C5] # DOT OPERATOR
+22C6 ; [*0559.0020.0002.22C6] # STAR OPERATOR
+22C7 ; [*055A.0020.0002.22C7] # DIVISION TIMES
+22C8 ; [*055B.0020.0002.22C8] # BOWTIE
+22C9 ; [*055C.0020.0002.22C9] # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA ; [*055D.0020.0002.22CA] # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB ; [*055E.0020.0002.22CB] # LEFT SEMIDIRECT PRODUCT
+22CC ; [*055F.0020.0002.22CC] # RIGHT SEMIDIRECT PRODUCT
+22CD ; [*0560.0020.0002.22CD] # REVERSED TILDE EQUALS
+22CE ; [*0561.0020.0002.22CE] # CURLY LOGICAL OR
+22CF ; [*0562.0020.0002.22CF] # CURLY LOGICAL AND
+22D0 ; [*0563.0020.0002.22D0] # DOUBLE SUBSET
+22D1 ; [*0564.0020.0002.22D1] # DOUBLE SUPERSET
+22D2 ; [*0565.0020.0002.22D2] # DOUBLE INTERSECTION
+22D3 ; [*0566.0020.0002.22D3] # DOUBLE UNION
+22D4 ; [*0567.0020.0002.22D4] # PITCHFORK
+22D5 ; [*0568.0020.0002.22D5] # EQUAL AND PARALLEL TO
+22D6 ; [*0569.0020.0002.22D6] # LESS-THAN WITH DOT
+22D7 ; [*056A.0020.0002.22D7] # GREATER-THAN WITH DOT
+22D8 ; [*056B.0020.0002.22D8] # VERY MUCH LESS-THAN
+22D9 ; [*056C.0020.0002.22D9] # VERY MUCH GREATER-THAN
+22DA ; [*056D.0020.0002.22DA] # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB ; [*056E.0020.0002.22DB] # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC ; [*056F.0020.0002.22DC] # EQUAL TO OR LESS-THAN
+22DD ; [*0570.0020.0002.22DD] # EQUAL TO OR GREATER-THAN
+22DE ; [*0571.0020.0002.22DE] # EQUAL TO OR PRECEDES
+22DF ; [*0572.0020.0002.22DF] # EQUAL TO OR SUCCEEDS
+22E0 ; [*0519.0020.0002.227C][.0000.0054.0002.0338] # DOES NOT PRECEDE OR EQUAL; QQCM
+22E1 ; [*051A.0020.0002.227D][.0000.0054.0002.0338] # DOES NOT SUCCEED OR EQUAL; QQCM
+22E2 ; [*0528.0020.0002.2291][.0000.0054.0002.0338] # NOT SQUARE IMAGE OF OR EQUAL TO; QQCM
+22E3 ; [*0529.0020.0002.2292][.0000.0054.0002.0338] # NOT SQUARE ORIGINAL OF OR EQUAL TO; QQCM
+22E4 ; [*0573.0020.0002.22E4] # SQUARE IMAGE OF OR NOT EQUAL TO
+22E5 ; [*0574.0020.0002.22E5] # SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6 ; [*0575.0020.0002.22E6] # LESS-THAN BUT NOT EQUIVALENT TO
+22E7 ; [*0576.0020.0002.22E7] # GREATER-THAN BUT NOT EQUIVALENT TO
+22E8 ; [*0577.0020.0002.22E8] # PRECEDES BUT NOT EQUIVALENT TO
+22E9 ; [*0578.0020.0002.22E9] # SUCCEEDS BUT NOT EQUIVALENT TO
+22EA ; [*0545.0020.0002.22B2][.0000.0054.0002.0338] # NOT NORMAL SUBGROUP OF; QQCM
+22EB ; [*0546.0020.0002.22B3][.0000.0054.0002.0338] # DOES NOT CONTAIN AS NORMAL SUBGROUP; QQCM
+22EC ; [*0547.0020.0002.22B4][.0000.0054.0002.0338] # NOT NORMAL SUBGROUP OF OR EQUAL TO; QQCM
+22ED ; [*0548.0020.0002.22B5][.0000.0054.0002.0338] # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL; QQCM
+22EE ; [*0579.0020.0002.22EE] # VERTICAL ELLIPSIS
+22EF ; [*057A.0020.0002.22EF] # MIDLINE HORIZONTAL ELLIPSIS
+22F0 ; [*057B.0020.0002.22F0] # UP RIGHT DIAGONAL ELLIPSIS
+22F1 ; [*057C.0020.0002.22F1] # DOWN RIGHT DIAGONAL ELLIPSIS
+22F2 ; [*057D.0020.0002.22F2] # ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3 ; [*057E.0020.0002.22F3] # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4 ; [*057F.0020.0002.22F4] # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F5 ; [*0580.0020.0002.22F5] # ELEMENT OF WITH DOT ABOVE
+22F6 ; [*0581.0020.0002.22F6] # ELEMENT OF WITH OVERBAR
+22F7 ; [*0582.0020.0002.22F7] # SMALL ELEMENT OF WITH OVERBAR
+22F8 ; [*0583.0020.0002.22F8] # ELEMENT OF WITH UNDERBAR
+22F9 ; [*0584.0020.0002.22F9] # ELEMENT OF WITH TWO HORIZONTAL STROKES
+22FA ; [*0585.0020.0002.22FA] # CONTAINS WITH LONG HORIZONTAL STROKE
+22FB ; [*0586.0020.0002.22FB] # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC ; [*0587.0020.0002.22FC] # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD ; [*0588.0020.0002.22FD] # CONTAINS WITH OVERBAR
+22FE ; [*0589.0020.0002.22FE] # SMALL CONTAINS WITH OVERBAR
+22FF ; [*058A.0020.0002.22FF] # Z NOTATION BAG MEMBERSHIP
+2300 ; [*058B.0020.0002.2300] # DIAMETER SIGN
+2301 ; [*058C.0020.0002.2301] # ELECTRIC ARROW
+2302 ; [*058D.0020.0002.2302] # HOUSE
+2303 ; [*058E.0020.0002.2303] # UP ARROWHEAD
+2304 ; [*058F.0020.0002.2304] # DOWN ARROWHEAD
+2305 ; [*0590.0020.0002.2305] # PROJECTIVE
+2306 ; [*0591.0020.0002.2306] # PERSPECTIVE
+2307 ; [*0592.0020.0002.2307] # WAVY LINE
+2308 ; [*0593.0020.0002.2308] # LEFT CEILING
+2309 ; [*0594.0020.0002.2309] # RIGHT CEILING
+230A ; [*0595.0020.0002.230A] # LEFT FLOOR
+230B ; [*0596.0020.0002.230B] # RIGHT FLOOR
+230C ; [*0597.0020.0002.230C] # BOTTOM RIGHT CROP
+230D ; [*0598.0020.0002.230D] # BOTTOM LEFT CROP
+230E ; [*0599.0020.0002.230E] # TOP RIGHT CROP
+230F ; [*059A.0020.0002.230F] # TOP LEFT CROP
+2310 ; [*059B.0020.0002.2310] # REVERSED NOT SIGN
+2311 ; [*059C.0020.0002.2311] # SQUARE LOZENGE
+2312 ; [*059D.0020.0002.2312] # ARC
+2313 ; [*059E.0020.0002.2313] # SEGMENT
+2314 ; [*059F.0020.0002.2314] # SECTOR
+2315 ; [*05A0.0020.0002.2315] # TELEPHONE RECORDER
+2316 ; [*05A1.0020.0002.2316] # POSITION INDICATOR
+2317 ; [*05A2.0020.0002.2317] # VIEWDATA SQUARE
+2318 ; [*05A3.0020.0002.2318] # PLACE OF INTEREST SIGN
+2319 ; [*05A4.0020.0002.2319] # TURNED NOT SIGN
+231A ; [*05A5.0020.0002.231A] # WATCH
+231B ; [*05A6.0020.0002.231B] # HOURGLASS
+231C ; [*05A7.0020.0002.231C] # TOP LEFT CORNER
+231D ; [*05A8.0020.0002.231D] # TOP RIGHT CORNER
+231E ; [*05A9.0020.0002.231E] # BOTTOM LEFT CORNER
+231F ; [*05AA.0020.0002.231F] # BOTTOM RIGHT CORNER
+2320 ; [*05AB.0020.0002.2320] # TOP HALF INTEGRAL
+2321 ; [*05AC.0020.0002.2321] # BOTTOM HALF INTEGRAL
+2322 ; [*05AD.0020.0002.2322] # FROWN
+2323 ; [*05AE.0020.0002.2323] # SMILE
+2324 ; [*05AF.0020.0002.2324] # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325 ; [*05B0.0020.0002.2325] # OPTION KEY
+2326 ; [*05B1.0020.0002.2326] # ERASE TO THE RIGHT
+2327 ; [*05B2.0020.0002.2327] # X IN A RECTANGLE BOX
+2328 ; [*05B3.0020.0002.2328] # KEYBOARD
+2329 ; [*02E1.0020.0002.2329] # LEFT-POINTING ANGLE BRACKET; QQC
+232A ; [*02E2.0020.0002.232A] # RIGHT-POINTING ANGLE BRACKET; QQC
+232B ; [*05B4.0020.0002.232B] # ERASE TO THE LEFT
+232C ; [*05B5.0020.0002.232C] # BENZENE RING
+232D ; [*05B6.0020.0002.232D] # CYLINDRICITY
+232E ; [*05B7.0020.0002.232E] # ALL AROUND-PROFILE
+232F ; [*05B8.0020.0002.232F] # SYMMETRY
+2330 ; [*05B9.0020.0002.2330] # TOTAL RUNOUT
+2331 ; [*05BA.0020.0002.2331] # DIMENSION ORIGIN
+2332 ; [*05BB.0020.0002.2332] # CONICAL TAPER
+2333 ; [*05BC.0020.0002.2333] # SLOPE
+2334 ; [*05BD.0020.0002.2334] # COUNTERBORE
+2335 ; [*05BE.0020.0002.2335] # COUNTERSINK
+2336 ; [*05BF.0020.0002.2336] # APL FUNCTIONAL SYMBOL I-BEAM
+2337 ; [*05C0.0020.0002.2337] # APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338 ; [*05C1.0020.0002.2338] # APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339 ; [*05C2.0020.0002.2339] # APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A ; [*05C3.0020.0002.233A] # APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B ; [*05C4.0020.0002.233B] # APL FUNCTIONAL SYMBOL QUAD JOT
+233C ; [*05C5.0020.0002.233C] # APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D ; [*05C6.0020.0002.233D] # APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E ; [*05C7.0020.0002.233E] # APL FUNCTIONAL SYMBOL CIRCLE JOT
+233F ; [*05C8.0020.0002.233F] # APL FUNCTIONAL SYMBOL SLASH BAR
+2340 ; [*05C9.0020.0002.2340] # APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341 ; [*05CA.0020.0002.2341] # APL FUNCTIONAL SYMBOL QUAD SLASH
+2342 ; [*05CB.0020.0002.2342] # APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343 ; [*05CC.0020.0002.2343] # APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344 ; [*05CD.0020.0002.2344] # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345 ; [*05CE.0020.0002.2345] # APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346 ; [*05CF.0020.0002.2346] # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347 ; [*05D0.0020.0002.2347] # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348 ; [*05D1.0020.0002.2348] # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349 ; [*05D2.0020.0002.2349] # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A ; [*05D3.0020.0002.234A] # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234B ; [*05D4.0020.0002.234B] # APL FUNCTIONAL SYMBOL DELTA STILE
+234C ; [*05D5.0020.0002.234C] # APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D ; [*05D6.0020.0002.234D] # APL FUNCTIONAL SYMBOL QUAD DELTA
+234E ; [*05D7.0020.0002.234E] # APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234F ; [*05D8.0020.0002.234F] # APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350 ; [*05D9.0020.0002.2350] # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351 ; [*05DA.0020.0002.2351] # APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352 ; [*05DB.0020.0002.2352] # APL FUNCTIONAL SYMBOL DEL STILE
+2353 ; [*05DC.0020.0002.2353] # APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354 ; [*05DD.0020.0002.2354] # APL FUNCTIONAL SYMBOL QUAD DEL
+2355 ; [*05DE.0020.0002.2355] # APL FUNCTIONAL SYMBOL UP TACK JOT
+2356 ; [*05DF.0020.0002.2356] # APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357 ; [*05E0.0020.0002.2357] # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358 ; [*05E1.0020.0002.2358] # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359 ; [*05E2.0020.0002.2359] # APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A ; [*05E3.0020.0002.235A] # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B ; [*05E4.0020.0002.235B] # APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C ; [*05E5.0020.0002.235C] # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D ; [*05E6.0020.0002.235D] # APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E ; [*05E7.0020.0002.235E] # APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F ; [*05E8.0020.0002.235F] # APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360 ; [*05E9.0020.0002.2360] # APL FUNCTIONAL SYMBOL QUAD COLON
+2361 ; [*05EA.0020.0002.2361] # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362 ; [*05EB.0020.0002.2362] # APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363 ; [*05EC.0020.0002.2363] # APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364 ; [*05ED.0020.0002.2364] # APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365 ; [*05EE.0020.0002.2365] # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366 ; [*05EF.0020.0002.2366] # APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367 ; [*05F0.0020.0002.2367] # APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368 ; [*05F1.0020.0002.2368] # APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369 ; [*05F2.0020.0002.2369] # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A ; [*05F3.0020.0002.236A] # APL FUNCTIONAL SYMBOL COMMA BAR
+236B ; [*05F4.0020.0002.236B] # APL FUNCTIONAL SYMBOL DEL TILDE
+236C ; [*05F5.0020.0002.236C] # APL FUNCTIONAL SYMBOL ZILDE
+236D ; [*05F6.0020.0002.236D] # APL FUNCTIONAL SYMBOL STILE TILDE
+236E ; [*05F7.0020.0002.236E] # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F ; [*05F8.0020.0002.236F] # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370 ; [*05F9.0020.0002.2370] # APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371 ; [*05FA.0020.0002.2371] # APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372 ; [*05FB.0020.0002.2372] # APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373 ; [*05FC.0020.0002.2373] # APL FUNCTIONAL SYMBOL IOTA
+2374 ; [*05FD.0020.0002.2374] # APL FUNCTIONAL SYMBOL RHO
+2375 ; [*05FE.0020.0002.2375] # APL FUNCTIONAL SYMBOL OMEGA
+2376 ; [*05FF.0020.0002.2376] # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377 ; [*0600.0020.0002.2377] # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378 ; [*0601.0020.0002.2378] # APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379 ; [*0602.0020.0002.2379] # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A ; [*0603.0020.0002.237A] # APL FUNCTIONAL SYMBOL ALPHA
+237B ; [*0604.0020.0002.237B] # NOT CHECK MARK
+237C ; [*0605.0020.0002.237C] # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D ; [*0606.0020.0002.237D] # SHOULDERED OPEN BOX
+237E ; [*0607.0020.0002.237E] # BELL SYMBOL
+237F ; [*0608.0020.0002.237F] # VERTICAL LINE WITH MIDDLE DOT
+2380 ; [*0609.0020.0002.2380] # INSERTION SYMBOL
+2381 ; [*060A.0020.0002.2381] # CONTINUOUS UNDERLINE SYMBOL
+2382 ; [*060B.0020.0002.2382] # DISCONTINUOUS UNDERLINE SYMBOL
+2383 ; [*060C.0020.0002.2383] # EMPHASIS SYMBOL
+2384 ; [*060D.0020.0002.2384] # COMPOSITION SYMBOL
+2385 ; [*060E.0020.0002.2385] # WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386 ; [*060F.0020.0002.2386] # ENTER SYMBOL
+2387 ; [*0610.0020.0002.2387] # ALTERNATIVE KEY SYMBOL
+2388 ; [*0611.0020.0002.2388] # HELM SYMBOL
+2389 ; [*0612.0020.0002.2389] # CIRCLED HORIZONTAL BAR WITH NOTCH
+238A ; [*0613.0020.0002.238A] # CIRCLED TRIANGLE DOWN
+238B ; [*0614.0020.0002.238B] # BROKEN CIRCLE WITH NORTHWEST ARROW
+238C ; [*0615.0020.0002.238C] # UNDO SYMBOL
+238D ; [*0616.0020.0002.238D] # MONOSTABLE SYMBOL
+238E ; [*0617.0020.0002.238E] # HYSTERESIS SYMBOL
+238F ; [*0618.0020.0002.238F] # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390 ; [*0619.0020.0002.2390] # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391 ; [*061A.0020.0002.2391] # PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392 ; [*061B.0020.0002.2392] # PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393 ; [*061C.0020.0002.2393] # DIRECT CURRENT SYMBOL FORM TWO
+2394 ; [*061D.0020.0002.2394] # SOFTWARE-FUNCTION SYMBOL
+2395 ; [*061E.0020.0002.2395] # APL FUNCTIONAL SYMBOL QUAD
+2396 ; [*061F.0020.0002.2396] # DECIMAL SEPARATOR KEY SYMBOL
+2397 ; [*0620.0020.0002.2397] # PREVIOUS PAGE
+2398 ; [*0621.0020.0002.2398] # NEXT PAGE
+2399 ; [*0622.0020.0002.2399] # PRINT SCREEN SYMBOL
+239A ; [*0623.0020.0002.239A] # CLEAR SCREEN SYMBOL
+239B ; [*0624.0020.0002.239B] # LEFT PARENTHESIS UPPER HOOK
+239C ; [*0625.0020.0002.239C] # LEFT PARENTHESIS EXTENSION
+239D ; [*0626.0020.0002.239D] # LEFT PARENTHESIS LOWER HOOK
+239E ; [*0627.0020.0002.239E] # RIGHT PARENTHESIS UPPER HOOK
+239F ; [*0628.0020.0002.239F] # RIGHT PARENTHESIS EXTENSION
+23A0 ; [*0629.0020.0002.23A0] # RIGHT PARENTHESIS LOWER HOOK
+23A1 ; [*062A.0020.0002.23A1] # LEFT SQUARE BRACKET UPPER CORNER
+23A2 ; [*062B.0020.0002.23A2] # LEFT SQUARE BRACKET EXTENSION
+23A3 ; [*062C.0020.0002.23A3] # LEFT SQUARE BRACKET LOWER CORNER
+23A4 ; [*062D.0020.0002.23A4] # RIGHT SQUARE BRACKET UPPER CORNER
+23A5 ; [*062E.0020.0002.23A5] # RIGHT SQUARE BRACKET EXTENSION
+23A6 ; [*062F.0020.0002.23A6] # RIGHT SQUARE BRACKET LOWER CORNER
+23A7 ; [*0630.0020.0002.23A7] # LEFT CURLY BRACKET UPPER HOOK
+23A8 ; [*0631.0020.0002.23A8] # LEFT CURLY BRACKET MIDDLE PIECE
+23A9 ; [*0632.0020.0002.23A9] # LEFT CURLY BRACKET LOWER HOOK
+23AA ; [*0633.0020.0002.23AA] # CURLY BRACKET EXTENSION
+23AB ; [*0634.0020.0002.23AB] # RIGHT CURLY BRACKET UPPER HOOK
+23AC ; [*0635.0020.0002.23AC] # RIGHT CURLY BRACKET MIDDLE PIECE
+23AD ; [*0636.0020.0002.23AD] # RIGHT CURLY BRACKET LOWER HOOK
+23AE ; [*0637.0020.0002.23AE] # INTEGRAL EXTENSION
+23AF ; [*0638.0020.0002.23AF] # HORIZONTAL LINE EXTENSION
+23B0 ; [*0639.0020.0002.23B0] # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+23B1 ; [*063A.0020.0002.23B1] # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+23B2 ; [*063B.0020.0002.23B2] # SUMMATION TOP
+23B3 ; [*063C.0020.0002.23B3] # SUMMATION BOTTOM
+23B4 ; [*063D.0020.0002.23B4] # TOP SQUARE BRACKET
+23B5 ; [*063E.0020.0002.23B5] # BOTTOM SQUARE BRACKET
+23B6 ; [*063F.0020.0002.23B6] # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7 ; [*0640.0020.0002.23B7] # RADICAL SYMBOL BOTTOM
+23B8 ; [*0641.0020.0002.23B8] # LEFT VERTICAL BOX LINE
+23B9 ; [*0642.0020.0002.23B9] # RIGHT VERTICAL BOX LINE
+23BA ; [*0643.0020.0002.23BA] # HORIZONTAL SCAN LINE-1
+23BB ; [*0644.0020.0002.23BB] # HORIZONTAL SCAN LINE-3
+23BC ; [*0645.0020.0002.23BC] # HORIZONTAL SCAN LINE-7
+23BD ; [*0646.0020.0002.23BD] # HORIZONTAL SCAN LINE-9
+23BE ; [*0647.0020.0002.23BE] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+23BF ; [*0648.0020.0002.23BF] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+23C0 ; [*0649.0020.0002.23C0] # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
+23C1 ; [*064A.0020.0002.23C1] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
+23C2 ; [*064B.0020.0002.23C2] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
+23C3 ; [*064C.0020.0002.23C3] # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE
+23C4 ; [*064D.0020.0002.23C4] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE
+23C5 ; [*064E.0020.0002.23C5] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE
+23C6 ; [*064F.0020.0002.23C6] # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE
+23C7 ; [*0650.0020.0002.23C7] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
+23C8 ; [*0651.0020.0002.23C8] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
+23C9 ; [*0652.0020.0002.23C9] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+23CA ; [*0653.0020.0002.23CA] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+23CB ; [*0654.0020.0002.23CB] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+23CC ; [*0655.0020.0002.23CC] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+23CD ; [*0656.0020.0002.23CD] # SQUARE FOOT
+23CE ; [*0657.0020.0002.23CE] # RETURN SYMBOL
+23CF ; [*0658.0020.0002.23CF] # EJECT SYMBOL
+23D0 ; [*0659.0020.0002.23D0] # VERTICAL LINE EXTENSION
+23D1 ; [*065A.0020.0002.23D1] # METRICAL BREVE
+23D2 ; [*065B.0020.0002.23D2] # METRICAL LONG OVER SHORT
+23D3 ; [*065C.0020.0002.23D3] # METRICAL SHORT OVER LONG
+23D4 ; [*065D.0020.0002.23D4] # METRICAL LONG OVER TWO SHORTS
+23D5 ; [*065E.0020.0002.23D5] # METRICAL TWO SHORTS OVER LONG
+23D6 ; [*065F.0020.0002.23D6] # METRICAL TWO SHORTS JOINED
+23D7 ; [*0660.0020.0002.23D7] # METRICAL TRISEME
+23D8 ; [*0661.0020.0002.23D8] # METRICAL TETRASEME
+23D9 ; [*0662.0020.0002.23D9] # METRICAL PENTASEME
+23DA ; [*0663.0020.0002.23DA] # EARTH GROUND
+23DB ; [*0664.0020.0002.23DB] # FUSE
+23DC ; [*0665.0020.0002.23DC] # TOP PARENTHESIS
+23DD ; [*0666.0020.0002.23DD] # BOTTOM PARENTHESIS
+23DE ; [*0667.0020.0002.23DE] # TOP CURLY BRACKET
+23DF ; [*0668.0020.0002.23DF] # BOTTOM CURLY BRACKET
+23E0 ; [*0669.0020.0002.23E0] # TOP TORTOISE SHELL BRACKET
+23E1 ; [*066A.0020.0002.23E1] # BOTTOM TORTOISE SHELL BRACKET
+23E2 ; [*066B.0020.0002.23E2] # WHITE TRAPEZIUM
+23E3 ; [*066C.0020.0002.23E3] # BENZENE RING WITH CIRCLE
+23E4 ; [*066D.0020.0002.23E4] # STRAIGHTNESS
+23E5 ; [*066E.0020.0002.23E5] # FLATNESS
+23E6 ; [*066F.0020.0002.23E6] # AC CURRENT
+23E7 ; [*0670.0020.0002.23E7] # ELECTRICAL INTERSECTION
+2400 ; [*0671.0020.0002.2400] # SYMBOL FOR NULL
+2401 ; [*0672.0020.0002.2401] # SYMBOL FOR START OF HEADING
+2402 ; [*0673.0020.0002.2402] # SYMBOL FOR START OF TEXT
+2403 ; [*0674.0020.0002.2403] # SYMBOL FOR END OF TEXT
+2404 ; [*0675.0020.0002.2404] # SYMBOL FOR END OF TRANSMISSION
+2405 ; [*0676.0020.0002.2405] # SYMBOL FOR ENQUIRY
+2406 ; [*0677.0020.0002.2406] # SYMBOL FOR ACKNOWLEDGE
+2407 ; [*0678.0020.0002.2407] # SYMBOL FOR BELL
+2408 ; [*0679.0020.0002.2408] # SYMBOL FOR BACKSPACE
+2409 ; [*067A.0020.0002.2409] # SYMBOL FOR HORIZONTAL TABULATION
+240A ; [*067B.0020.0002.240A] # SYMBOL FOR LINE FEED
+240B ; [*067C.0020.0002.240B] # SYMBOL FOR VERTICAL TABULATION
+240C ; [*067D.0020.0002.240C] # SYMBOL FOR FORM FEED
+240D ; [*067E.0020.0002.240D] # SYMBOL FOR CARRIAGE RETURN
+240E ; [*067F.0020.0002.240E] # SYMBOL FOR SHIFT OUT
+240F ; [*0680.0020.0002.240F] # SYMBOL FOR SHIFT IN
+2410 ; [*0681.0020.0002.2410] # SYMBOL FOR DATA LINK ESCAPE
+2411 ; [*0682.0020.0002.2411] # SYMBOL FOR DEVICE CONTROL ONE
+2412 ; [*0683.0020.0002.2412] # SYMBOL FOR DEVICE CONTROL TWO
+2413 ; [*0684.0020.0002.2413] # SYMBOL FOR DEVICE CONTROL THREE
+2414 ; [*0685.0020.0002.2414] # SYMBOL FOR DEVICE CONTROL FOUR
+2415 ; [*0686.0020.0002.2415] # SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416 ; [*0687.0020.0002.2416] # SYMBOL FOR SYNCHRONOUS IDLE
+2417 ; [*0688.0020.0002.2417] # SYMBOL FOR END OF TRANSMISSION BLOCK
+2418 ; [*0689.0020.0002.2418] # SYMBOL FOR CANCEL
+2419 ; [*068A.0020.0002.2419] # SYMBOL FOR END OF MEDIUM
+241A ; [*068B.0020.0002.241A] # SYMBOL FOR SUBSTITUTE
+241B ; [*068C.0020.0002.241B] # SYMBOL FOR ESCAPE
+241C ; [*068D.0020.0002.241C] # SYMBOL FOR FILE SEPARATOR
+241D ; [*068E.0020.0002.241D] # SYMBOL FOR GROUP SEPARATOR
+241E ; [*068F.0020.0002.241E] # SYMBOL FOR RECORD SEPARATOR
+241F ; [*0690.0020.0002.241F] # SYMBOL FOR UNIT SEPARATOR
+2420 ; [*0691.0020.0002.2420] # SYMBOL FOR SPACE
+2421 ; [*0692.0020.0002.2421] # SYMBOL FOR DELETE
+2422 ; [*0693.0020.0002.2422] # BLANK SYMBOL
+2423 ; [*0694.0020.0002.2423] # OPEN BOX
+2424 ; [*0695.0020.0002.2424] # SYMBOL FOR NEWLINE
+2425 ; [*0696.0020.0002.2425] # SYMBOL FOR DELETE FORM TWO
+2426 ; [*0697.0020.0002.2426] # SYMBOL FOR SUBSTITUTE FORM TWO
+2440 ; [*0698.0020.0002.2440] # OCR HOOK
+2441 ; [*0699.0020.0002.2441] # OCR CHAIR
+2442 ; [*069A.0020.0002.2442] # OCR FORK
+2443 ; [*069B.0020.0002.2443] # OCR INVERTED FORK
+2444 ; [*069C.0020.0002.2444] # OCR BELT BUCKLE
+2445 ; [*069D.0020.0002.2445] # OCR BOW TIE
+2446 ; [*069E.0020.0002.2446] # OCR BRANCH BANK IDENTIFICATION
+2447 ; [*069F.0020.0002.2447] # OCR AMOUNT OF CHECK
+2448 ; [*06A0.0020.0002.2448] # OCR DASH
+2449 ; [*06A1.0020.0002.2449] # OCR CUSTOMER ACCOUNT NUMBER
+244A ; [*06A2.0020.0002.244A] # OCR DOUBLE BACKSLASH
+2500 ; [*06A3.0020.0002.2500] # BOX DRAWINGS LIGHT HORIZONTAL
+2501 ; [*06A4.0020.0002.2501] # BOX DRAWINGS HEAVY HORIZONTAL
+2502 ; [*06A5.0020.0002.2502] # BOX DRAWINGS LIGHT VERTICAL
+2503 ; [*06A6.0020.0002.2503] # BOX DRAWINGS HEAVY VERTICAL
+2504 ; [*06A7.0020.0002.2504] # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505 ; [*06A8.0020.0002.2505] # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506 ; [*06A9.0020.0002.2506] # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507 ; [*06AA.0020.0002.2507] # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508 ; [*06AB.0020.0002.2508] # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509 ; [*06AC.0020.0002.2509] # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A ; [*06AD.0020.0002.250A] # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B ; [*06AE.0020.0002.250B] # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C ; [*06AF.0020.0002.250C] # BOX DRAWINGS LIGHT DOWN AND RIGHT
+250D ; [*06B0.0020.0002.250D] # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E ; [*06B1.0020.0002.250E] # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F ; [*06B2.0020.0002.250F] # BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510 ; [*06B3.0020.0002.2510] # BOX DRAWINGS LIGHT DOWN AND LEFT
+2511 ; [*06B4.0020.0002.2511] # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512 ; [*06B5.0020.0002.2512] # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513 ; [*06B6.0020.0002.2513] # BOX DRAWINGS HEAVY DOWN AND LEFT
+2514 ; [*06B7.0020.0002.2514] # BOX DRAWINGS LIGHT UP AND RIGHT
+2515 ; [*06B8.0020.0002.2515] # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516 ; [*06B9.0020.0002.2516] # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517 ; [*06BA.0020.0002.2517] # BOX DRAWINGS HEAVY UP AND RIGHT
+2518 ; [*06BB.0020.0002.2518] # BOX DRAWINGS LIGHT UP AND LEFT
+2519 ; [*06BC.0020.0002.2519] # BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A ; [*06BD.0020.0002.251A] # BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B ; [*06BE.0020.0002.251B] # BOX DRAWINGS HEAVY UP AND LEFT
+251C ; [*06BF.0020.0002.251C] # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251D ; [*06C0.0020.0002.251D] # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251E ; [*06C1.0020.0002.251E] # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F ; [*06C2.0020.0002.251F] # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520 ; [*06C3.0020.0002.2520] # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521 ; [*06C4.0020.0002.2521] # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522 ; [*06C5.0020.0002.2522] # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523 ; [*06C6.0020.0002.2523] # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524 ; [*06C7.0020.0002.2524] # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525 ; [*06C8.0020.0002.2525] # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526 ; [*06C9.0020.0002.2526] # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527 ; [*06CA.0020.0002.2527] # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528 ; [*06CB.0020.0002.2528] # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529 ; [*06CC.0020.0002.2529] # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A ; [*06CD.0020.0002.252A] # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B ; [*06CE.0020.0002.252B] # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C ; [*06CF.0020.0002.252C] # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252D ; [*06D0.0020.0002.252D] # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E ; [*06D1.0020.0002.252E] # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F ; [*06D2.0020.0002.252F] # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530 ; [*06D3.0020.0002.2530] # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531 ; [*06D4.0020.0002.2531] # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532 ; [*06D5.0020.0002.2532] # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533 ; [*06D6.0020.0002.2533] # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534 ; [*06D7.0020.0002.2534] # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535 ; [*06D8.0020.0002.2535] # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536 ; [*06D9.0020.0002.2536] # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537 ; [*06DA.0020.0002.2537] # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538 ; [*06DB.0020.0002.2538] # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539 ; [*06DC.0020.0002.2539] # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A ; [*06DD.0020.0002.253A] # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B ; [*06DE.0020.0002.253B] # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C ; [*06DF.0020.0002.253C] # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253D ; [*06E0.0020.0002.253D] # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E ; [*06E1.0020.0002.253E] # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F ; [*06E2.0020.0002.253F] # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540 ; [*06E3.0020.0002.2540] # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541 ; [*06E4.0020.0002.2541] # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542 ; [*06E5.0020.0002.2542] # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543 ; [*06E6.0020.0002.2543] # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544 ; [*06E7.0020.0002.2544] # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545 ; [*06E8.0020.0002.2545] # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546 ; [*06E9.0020.0002.2546] # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547 ; [*06EA.0020.0002.2547] # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548 ; [*06EB.0020.0002.2548] # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549 ; [*06EC.0020.0002.2549] # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A ; [*06ED.0020.0002.254A] # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B ; [*06EE.0020.0002.254B] # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C ; [*06EF.0020.0002.254C] # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D ; [*06F0.0020.0002.254D] # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E ; [*06F1.0020.0002.254E] # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F ; [*06F2.0020.0002.254F] # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550 ; [*06F3.0020.0002.2550] # BOX DRAWINGS DOUBLE HORIZONTAL
+2551 ; [*06F4.0020.0002.2551] # BOX DRAWINGS DOUBLE VERTICAL
+2552 ; [*06F5.0020.0002.2552] # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553 ; [*06F6.0020.0002.2553] # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554 ; [*06F7.0020.0002.2554] # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555 ; [*06F8.0020.0002.2555] # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556 ; [*06F9.0020.0002.2556] # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557 ; [*06FA.0020.0002.2557] # BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558 ; [*06FB.0020.0002.2558] # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559 ; [*06FC.0020.0002.2559] # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A ; [*06FD.0020.0002.255A] # BOX DRAWINGS DOUBLE UP AND RIGHT
+255B ; [*06FE.0020.0002.255B] # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C ; [*06FF.0020.0002.255C] # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D ; [*0700.0020.0002.255D] # BOX DRAWINGS DOUBLE UP AND LEFT
+255E ; [*0701.0020.0002.255E] # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F ; [*0702.0020.0002.255F] # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560 ; [*0703.0020.0002.2560] # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561 ; [*0704.0020.0002.2561] # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562 ; [*0705.0020.0002.2562] # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563 ; [*0706.0020.0002.2563] # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564 ; [*0707.0020.0002.2564] # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565 ; [*0708.0020.0002.2565] # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566 ; [*0709.0020.0002.2566] # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567 ; [*070A.0020.0002.2567] # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568 ; [*070B.0020.0002.2568] # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569 ; [*070C.0020.0002.2569] # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A ; [*070D.0020.0002.256A] # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B ; [*070E.0020.0002.256B] # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C ; [*070F.0020.0002.256C] # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D ; [*0710.0020.0002.256D] # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E ; [*0711.0020.0002.256E] # BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F ; [*0712.0020.0002.256F] # BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570 ; [*0713.0020.0002.2570] # BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571 ; [*0714.0020.0002.2571] # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572 ; [*0715.0020.0002.2572] # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573 ; [*0716.0020.0002.2573] # BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574 ; [*0717.0020.0002.2574] # BOX DRAWINGS LIGHT LEFT
+2575 ; [*0718.0020.0002.2575] # BOX DRAWINGS LIGHT UP
+2576 ; [*0719.0020.0002.2576] # BOX DRAWINGS LIGHT RIGHT
+2577 ; [*071A.0020.0002.2577] # BOX DRAWINGS LIGHT DOWN
+2578 ; [*071B.0020.0002.2578] # BOX DRAWINGS HEAVY LEFT
+2579 ; [*071C.0020.0002.2579] # BOX DRAWINGS HEAVY UP
+257A ; [*071D.0020.0002.257A] # BOX DRAWINGS HEAVY RIGHT
+257B ; [*071E.0020.0002.257B] # BOX DRAWINGS HEAVY DOWN
+257C ; [*071F.0020.0002.257C] # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D ; [*0720.0020.0002.257D] # BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E ; [*0721.0020.0002.257E] # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F ; [*0722.0020.0002.257F] # BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580 ; [*0723.0020.0002.2580] # UPPER HALF BLOCK
+2581 ; [*0724.0020.0002.2581] # LOWER ONE EIGHTH BLOCK
+2582 ; [*0725.0020.0002.2582] # LOWER ONE QUARTER BLOCK
+2583 ; [*0726.0020.0002.2583] # LOWER THREE EIGHTHS BLOCK
+2584 ; [*0727.0020.0002.2584] # LOWER HALF BLOCK
+2585 ; [*0728.0020.0002.2585] # LOWER FIVE EIGHTHS BLOCK
+2586 ; [*0729.0020.0002.2586] # LOWER THREE QUARTERS BLOCK
+2587 ; [*072A.0020.0002.2587] # LOWER SEVEN EIGHTHS BLOCK
+2588 ; [*072B.0020.0002.2588] # FULL BLOCK
+2589 ; [*072C.0020.0002.2589] # LEFT SEVEN EIGHTHS BLOCK
+258A ; [*072D.0020.0002.258A] # LEFT THREE QUARTERS BLOCK
+258B ; [*072E.0020.0002.258B] # LEFT FIVE EIGHTHS BLOCK
+258C ; [*072F.0020.0002.258C] # LEFT HALF BLOCK
+258D ; [*0730.0020.0002.258D] # LEFT THREE EIGHTHS BLOCK
+258E ; [*0731.0020.0002.258E] # LEFT ONE QUARTER BLOCK
+258F ; [*0732.0020.0002.258F] # LEFT ONE EIGHTH BLOCK
+2590 ; [*0733.0020.0002.2590] # RIGHT HALF BLOCK
+2591 ; [*0734.0020.0002.2591] # LIGHT SHADE
+2592 ; [*0735.0020.0002.2592] # MEDIUM SHADE
+2593 ; [*0736.0020.0002.2593] # DARK SHADE
+2594 ; [*0737.0020.0002.2594] # UPPER ONE EIGHTH BLOCK
+2595 ; [*0738.0020.0002.2595] # RIGHT ONE EIGHTH BLOCK
+2596 ; [*0739.0020.0002.2596] # QUADRANT LOWER LEFT
+2597 ; [*073A.0020.0002.2597] # QUADRANT LOWER RIGHT
+2598 ; [*073B.0020.0002.2598] # QUADRANT UPPER LEFT
+2599 ; [*073C.0020.0002.2599] # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+259A ; [*073D.0020.0002.259A] # QUADRANT UPPER LEFT AND LOWER RIGHT
+259B ; [*073E.0020.0002.259B] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+259C ; [*073F.0020.0002.259C] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+259D ; [*0740.0020.0002.259D] # QUADRANT UPPER RIGHT
+259E ; [*0741.0020.0002.259E] # QUADRANT UPPER RIGHT AND LOWER LEFT
+259F ; [*0742.0020.0002.259F] # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+25A0 ; [*0743.0020.0002.25A0] # BLACK SQUARE
+25A1 ; [*0744.0020.0002.25A1] # WHITE SQUARE
+25A2 ; [*0745.0020.0002.25A2] # WHITE SQUARE WITH ROUNDED CORNERS
+25A3 ; [*0746.0020.0002.25A3] # WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4 ; [*0747.0020.0002.25A4] # SQUARE WITH HORIZONTAL FILL
+25A5 ; [*0748.0020.0002.25A5] # SQUARE WITH VERTICAL FILL
+25A6 ; [*0749.0020.0002.25A6] # SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7 ; [*074A.0020.0002.25A7] # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8 ; [*074B.0020.0002.25A8] # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9 ; [*074C.0020.0002.25A9] # SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA ; [*074D.0020.0002.25AA] # BLACK SMALL SQUARE
+25AB ; [*074E.0020.0002.25AB] # WHITE SMALL SQUARE
+25AC ; [*074F.0020.0002.25AC] # BLACK RECTANGLE
+25AD ; [*0750.0020.0002.25AD] # WHITE RECTANGLE
+25AE ; [*0751.0020.0002.25AE] # BLACK VERTICAL RECTANGLE
+25AF ; [*0752.0020.0002.25AF] # WHITE VERTICAL RECTANGLE
+25B0 ; [*0753.0020.0002.25B0] # BLACK PARALLELOGRAM
+25B1 ; [*0754.0020.0002.25B1] # WHITE PARALLELOGRAM
+25B2 ; [*0755.0020.0002.25B2] # BLACK UP-POINTING TRIANGLE
+25B3 ; [*0756.0020.0002.25B3] # WHITE UP-POINTING TRIANGLE
+25B4 ; [*0757.0020.0002.25B4] # BLACK UP-POINTING SMALL TRIANGLE
+25B5 ; [*0758.0020.0002.25B5] # WHITE UP-POINTING SMALL TRIANGLE
+25B6 ; [*0759.0020.0002.25B6] # BLACK RIGHT-POINTING TRIANGLE
+25B7 ; [*075A.0020.0002.25B7] # WHITE RIGHT-POINTING TRIANGLE
+25B8 ; [*075B.0020.0002.25B8] # BLACK RIGHT-POINTING SMALL TRIANGLE
+25B9 ; [*075C.0020.0002.25B9] # WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA ; [*075D.0020.0002.25BA] # BLACK RIGHT-POINTING POINTER
+25BB ; [*075E.0020.0002.25BB] # WHITE RIGHT-POINTING POINTER
+25BC ; [*075F.0020.0002.25BC] # BLACK DOWN-POINTING TRIANGLE
+25BD ; [*0760.0020.0002.25BD] # WHITE DOWN-POINTING TRIANGLE
+25BE ; [*0761.0020.0002.25BE] # BLACK DOWN-POINTING SMALL TRIANGLE
+25BF ; [*0762.0020.0002.25BF] # WHITE DOWN-POINTING SMALL TRIANGLE
+25C0 ; [*0763.0020.0002.25C0] # BLACK LEFT-POINTING TRIANGLE
+25C1 ; [*0764.0020.0002.25C1] # WHITE LEFT-POINTING TRIANGLE
+25C2 ; [*0765.0020.0002.25C2] # BLACK LEFT-POINTING SMALL TRIANGLE
+25C3 ; [*0766.0020.0002.25C3] # WHITE LEFT-POINTING SMALL TRIANGLE
+25C4 ; [*0767.0020.0002.25C4] # BLACK LEFT-POINTING POINTER
+25C5 ; [*0768.0020.0002.25C5] # WHITE LEFT-POINTING POINTER
+25C6 ; [*0769.0020.0002.25C6] # BLACK DIAMOND
+25C7 ; [*076A.0020.0002.25C7] # WHITE DIAMOND
+25C8 ; [*076B.0020.0002.25C8] # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9 ; [*076C.0020.0002.25C9] # FISHEYE
+25CA ; [*076D.0020.0002.25CA] # LOZENGE
+25CB ; [*076E.0020.0002.25CB] # WHITE CIRCLE
+25CC ; [*076F.0020.0002.25CC] # DOTTED CIRCLE
+25CD ; [*0770.0020.0002.25CD] # CIRCLE WITH VERTICAL FILL
+25CE ; [*0771.0020.0002.25CE] # BULLSEYE
+25CF ; [*0772.0020.0002.25CF] # BLACK CIRCLE
+25D0 ; [*0773.0020.0002.25D0] # CIRCLE WITH LEFT HALF BLACK
+25D1 ; [*0774.0020.0002.25D1] # CIRCLE WITH RIGHT HALF BLACK
+25D2 ; [*0775.0020.0002.25D2] # CIRCLE WITH LOWER HALF BLACK
+25D3 ; [*0776.0020.0002.25D3] # CIRCLE WITH UPPER HALF BLACK
+25D4 ; [*0777.0020.0002.25D4] # CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5 ; [*0778.0020.0002.25D5] # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6 ; [*0779.0020.0002.25D6] # LEFT HALF BLACK CIRCLE
+25D7 ; [*077A.0020.0002.25D7] # RIGHT HALF BLACK CIRCLE
+25D8 ; [*077B.0020.0002.25D8] # INVERSE BULLET
+25D9 ; [*077C.0020.0002.25D9] # INVERSE WHITE CIRCLE
+25DA ; [*077D.0020.0002.25DA] # UPPER HALF INVERSE WHITE CIRCLE
+25DB ; [*077E.0020.0002.25DB] # LOWER HALF INVERSE WHITE CIRCLE
+25DC ; [*077F.0020.0002.25DC] # UPPER LEFT QUADRANT CIRCULAR ARC
+25DD ; [*0780.0020.0002.25DD] # UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE ; [*0781.0020.0002.25DE] # LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF ; [*0782.0020.0002.25DF] # LOWER LEFT QUADRANT CIRCULAR ARC
+25E0 ; [*0783.0020.0002.25E0] # UPPER HALF CIRCLE
+25E1 ; [*0784.0020.0002.25E1] # LOWER HALF CIRCLE
+25E2 ; [*0785.0020.0002.25E2] # BLACK LOWER RIGHT TRIANGLE
+25E3 ; [*0786.0020.0002.25E3] # BLACK LOWER LEFT TRIANGLE
+25E4 ; [*0787.0020.0002.25E4] # BLACK UPPER LEFT TRIANGLE
+25E5 ; [*0788.0020.0002.25E5] # BLACK UPPER RIGHT TRIANGLE
+25E6 ; [*0789.0020.0002.25E6] # WHITE BULLET
+25E7 ; [*078A.0020.0002.25E7] # SQUARE WITH LEFT HALF BLACK
+25E8 ; [*078B.0020.0002.25E8] # SQUARE WITH RIGHT HALF BLACK
+25E9 ; [*078C.0020.0002.25E9] # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA ; [*078D.0020.0002.25EA] # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB ; [*078E.0020.0002.25EB] # WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC ; [*078F.0020.0002.25EC] # WHITE UP-POINTING TRIANGLE WITH DOT
+25ED ; [*0790.0020.0002.25ED] # UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE ; [*0791.0020.0002.25EE] # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF ; [*0792.0020.0002.25EF] # LARGE CIRCLE
+25F0 ; [*0793.0020.0002.25F0] # WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1 ; [*0794.0020.0002.25F1] # WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2 ; [*0795.0020.0002.25F2] # WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3 ; [*0796.0020.0002.25F3] # WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4 ; [*0797.0020.0002.25F4] # WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5 ; [*0798.0020.0002.25F5] # WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6 ; [*0799.0020.0002.25F6] # WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7 ; [*079A.0020.0002.25F7] # WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8 ; [*079B.0020.0002.25F8] # UPPER LEFT TRIANGLE
+25F9 ; [*079C.0020.0002.25F9] # UPPER RIGHT TRIANGLE
+25FA ; [*079D.0020.0002.25FA] # LOWER LEFT TRIANGLE
+25FB ; [*079E.0020.0002.25FB] # WHITE MEDIUM SQUARE
+25FC ; [*079F.0020.0002.25FC] # BLACK MEDIUM SQUARE
+25FD ; [*07A0.0020.0002.25FD] # WHITE MEDIUM SMALL SQUARE
+25FE ; [*07A1.0020.0002.25FE] # BLACK MEDIUM SMALL SQUARE
+25FF ; [*07A2.0020.0002.25FF] # LOWER RIGHT TRIANGLE
+2600 ; [*07A3.0020.0002.2600] # BLACK SUN WITH RAYS
+2601 ; [*07A4.0020.0002.2601] # CLOUD
+2602 ; [*07A5.0020.0002.2602] # UMBRELLA
+2603 ; [*07A6.0020.0002.2603] # SNOWMAN
+2604 ; [*07A7.0020.0002.2604] # COMET
+2605 ; [*07A8.0020.0002.2605] # BLACK STAR
+2606 ; [*07A9.0020.0002.2606] # WHITE STAR
+2607 ; [*07AA.0020.0002.2607] # LIGHTNING
+2608 ; [*07AB.0020.0002.2608] # THUNDERSTORM
+2609 ; [*07AC.0020.0002.2609] # SUN
+260A ; [*07AD.0020.0002.260A] # ASCENDING NODE
+260B ; [*07AE.0020.0002.260B] # DESCENDING NODE
+260C ; [*07AF.0020.0002.260C] # CONJUNCTION
+260D ; [*07B0.0020.0002.260D] # OPPOSITION
+260E ; [*07B1.0020.0002.260E] # BLACK TELEPHONE
+260F ; [*07B2.0020.0002.260F] # WHITE TELEPHONE
+2610 ; [*07B3.0020.0002.2610] # BALLOT BOX
+2611 ; [*07B4.0020.0002.2611] # BALLOT BOX WITH CHECK
+2612 ; [*07B5.0020.0002.2612] # BALLOT BOX WITH X
+2613 ; [*07B6.0020.0002.2613] # SALTIRE
+2614 ; [*07B7.0020.0002.2614] # UMBRELLA WITH RAIN DROPS
+2615 ; [*07B8.0020.0002.2615] # HOT BEVERAGE
+2616 ; [*07B9.0020.0002.2616] # WHITE SHOGI PIECE
+2617 ; [*07BA.0020.0002.2617] # BLACK SHOGI PIECE
+2618 ; [*07BB.0020.0002.2618] # SHAMROCK
+2619 ; [*07BC.0020.0002.2619] # REVERSED ROTATED FLORAL HEART BULLET
+261A ; [*07BD.0020.0002.261A] # BLACK LEFT POINTING INDEX
+261B ; [*07BE.0020.0002.261B] # BLACK RIGHT POINTING INDEX
+261C ; [*07BF.0020.0002.261C] # WHITE LEFT POINTING INDEX
+261D ; [*07C0.0020.0002.261D] # WHITE UP POINTING INDEX
+261E ; [*07C1.0020.0002.261E] # WHITE RIGHT POINTING INDEX
+261F ; [*07C2.0020.0002.261F] # WHITE DOWN POINTING INDEX
+2620 ; [*07C3.0020.0002.2620] # SKULL AND CROSSBONES
+2621 ; [*07C4.0020.0002.2621] # CAUTION SIGN
+2622 ; [*07C5.0020.0002.2622] # RADIOACTIVE SIGN
+2623 ; [*07C6.0020.0002.2623] # BIOHAZARD SIGN
+2624 ; [*07C7.0020.0002.2624] # CADUCEUS
+2625 ; [*07C8.0020.0002.2625] # ANKH
+2626 ; [*07C9.0020.0002.2626] # ORTHODOX CROSS
+2627 ; [*07CA.0020.0002.2627] # CHI RHO
+2628 ; [*07CB.0020.0002.2628] # CROSS OF LORRAINE
+2629 ; [*07CC.0020.0002.2629] # CROSS OF JERUSALEM
+262A ; [*07CD.0020.0002.262A] # STAR AND CRESCENT
+262B ; [*07CE.0020.0002.262B] # FARSI SYMBOL
+262C ; [*07CF.0020.0002.262C] # ADI SHAKTI
+262D ; [*07D0.0020.0002.262D] # HAMMER AND SICKLE
+262E ; [*07D1.0020.0002.262E] # PEACE SYMBOL
+262F ; [*07D2.0020.0002.262F] # YIN YANG
+2630 ; [*0C17.0020.0002.2630] # TRIGRAM FOR HEAVEN
+2631 ; [*0C18.0020.0002.2631] # TRIGRAM FOR LAKE
+2632 ; [*0C19.0020.0002.2632] # TRIGRAM FOR FIRE
+2633 ; [*0C1A.0020.0002.2633] # TRIGRAM FOR THUNDER
+2634 ; [*0C1B.0020.0002.2634] # TRIGRAM FOR WIND
+2635 ; [*0C1C.0020.0002.2635] # TRIGRAM FOR WATER
+2636 ; [*0C1D.0020.0002.2636] # TRIGRAM FOR MOUNTAIN
+2637 ; [*0C1E.0020.0002.2637] # TRIGRAM FOR EARTH
+2638 ; [*07D3.0020.0002.2638] # WHEEL OF DHARMA
+2639 ; [*07D4.0020.0002.2639] # WHITE FROWNING FACE
+263A ; [*07D5.0020.0002.263A] # WHITE SMILING FACE
+263B ; [*07D6.0020.0002.263B] # BLACK SMILING FACE
+263C ; [*07D7.0020.0002.263C] # WHITE SUN WITH RAYS
+263D ; [*07D8.0020.0002.263D] # FIRST QUARTER MOON
+263E ; [*07D9.0020.0002.263E] # LAST QUARTER MOON
+263F ; [*07DA.0020.0002.263F] # MERCURY
+2640 ; [*07DB.0020.0002.2640] # FEMALE SIGN
+2641 ; [*07DC.0020.0002.2641] # EARTH
+2642 ; [*07DD.0020.0002.2642] # MALE SIGN
+2643 ; [*07DE.0020.0002.2643] # JUPITER
+2644 ; [*07DF.0020.0002.2644] # SATURN
+2645 ; [*07E0.0020.0002.2645] # URANUS
+2646 ; [*07E1.0020.0002.2646] # NEPTUNE
+2647 ; [*07E2.0020.0002.2647] # PLUTO
+2648 ; [*07E3.0020.0002.2648] # ARIES
+2649 ; [*07E4.0020.0002.2649] # TAURUS
+264A ; [*07E5.0020.0002.264A] # GEMINI
+264B ; [*07E6.0020.0002.264B] # CANCER
+264C ; [*07E7.0020.0002.264C] # LEO
+264D ; [*07E8.0020.0002.264D] # VIRGO
+264E ; [*07E9.0020.0002.264E] # LIBRA
+264F ; [*07EA.0020.0002.264F] # SCORPIUS
+2650 ; [*07EB.0020.0002.2650] # SAGITTARIUS
+2651 ; [*07EC.0020.0002.2651] # CAPRICORN
+2652 ; [*07ED.0020.0002.2652] # AQUARIUS
+2653 ; [*07EE.0020.0002.2653] # PISCES
+2654 ; [*07EF.0020.0002.2654] # WHITE CHESS KING
+2655 ; [*07F0.0020.0002.2655] # WHITE CHESS QUEEN
+2656 ; [*07F1.0020.0002.2656] # WHITE CHESS ROOK
+2657 ; [*07F2.0020.0002.2657] # WHITE CHESS BISHOP
+2658 ; [*07F3.0020.0002.2658] # WHITE CHESS KNIGHT
+2659 ; [*07F4.0020.0002.2659] # WHITE CHESS PAWN
+265A ; [*07F5.0020.0002.265A] # BLACK CHESS KING
+265B ; [*07F6.0020.0002.265B] # BLACK CHESS QUEEN
+265C ; [*07F7.0020.0002.265C] # BLACK CHESS ROOK
+265D ; [*07F8.0020.0002.265D] # BLACK CHESS BISHOP
+265E ; [*07F9.0020.0002.265E] # BLACK CHESS KNIGHT
+265F ; [*07FA.0020.0002.265F] # BLACK CHESS PAWN
+2660 ; [*07FB.0020.0002.2660] # BLACK SPADE SUIT
+2661 ; [*07FC.0020.0002.2661] # WHITE HEART SUIT
+2662 ; [*07FD.0020.0002.2662] # WHITE DIAMOND SUIT
+2663 ; [*07FE.0020.0002.2663] # BLACK CLUB SUIT
+2664 ; [*07FF.0020.0002.2664] # WHITE SPADE SUIT
+2665 ; [*0800.0020.0002.2665] # BLACK HEART SUIT
+2666 ; [*0801.0020.0002.2666] # BLACK DIAMOND SUIT
+2667 ; [*0802.0020.0002.2667] # WHITE CLUB SUIT
+2668 ; [*0803.0020.0002.2668] # HOT SPRINGS
+2669 ; [*0804.0020.0002.2669] # QUARTER NOTE
+266A ; [*0805.0020.0002.266A] # EIGHTH NOTE
+266B ; [*0806.0020.0002.266B] # BEAMED EIGHTH NOTES
+266C ; [*0807.0020.0002.266C] # BEAMED SIXTEENTH NOTES
+266D ; [*0E24.0020.0002.266D] # MUSIC FLAT SIGN
+266E ; [*0E25.0020.0002.266E] # MUSIC NATURAL SIGN
+266F ; [*0E26.0020.0002.266F] # MUSIC SHARP SIGN
+2670 ; [*0808.0020.0002.2670] # WEST SYRIAC CROSS
+2671 ; [*0809.0020.0002.2671] # EAST SYRIAC CROSS
+2672 ; [*080A.0020.0002.2672] # UNIVERSAL RECYCLING SYMBOL
+2673 ; [*080B.0020.0002.2673] # RECYCLING SYMBOL FOR TYPE-1 PLASTICS
+2674 ; [*080C.0020.0002.2674] # RECYCLING SYMBOL FOR TYPE-2 PLASTICS
+2675 ; [*080D.0020.0002.2675] # RECYCLING SYMBOL FOR TYPE-3 PLASTICS
+2676 ; [*080E.0020.0002.2676] # RECYCLING SYMBOL FOR TYPE-4 PLASTICS
+2677 ; [*080F.0020.0002.2677] # RECYCLING SYMBOL FOR TYPE-5 PLASTICS
+2678 ; [*0810.0020.0002.2678] # RECYCLING SYMBOL FOR TYPE-6 PLASTICS
+2679 ; [*0811.0020.0002.2679] # RECYCLING SYMBOL FOR TYPE-7 PLASTICS
+267A ; [*0812.0020.0002.267A] # RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B ; [*0813.0020.0002.267B] # BLACK UNIVERSAL RECYCLING SYMBOL
+267C ; [*0814.0020.0002.267C] # RECYCLED PAPER SYMBOL
+267D ; [*0815.0020.0002.267D] # PARTIALLY-RECYCLED PAPER SYMBOL
+267E ; [*0816.0020.0002.267E] # PERMANENT PAPER SIGN
+267F ; [*0817.0020.0002.267F] # WHEELCHAIR SYMBOL
+2680 ; [*0818.0020.0002.2680] # DIE FACE-1
+2681 ; [*0819.0020.0002.2681] # DIE FACE-2
+2682 ; [*081A.0020.0002.2682] # DIE FACE-3
+2683 ; [*081B.0020.0002.2683] # DIE FACE-4
+2684 ; [*081C.0020.0002.2684] # DIE FACE-5
+2685 ; [*081D.0020.0002.2685] # DIE FACE-6
+2686 ; [*081E.0020.0002.2686] # WHITE CIRCLE WITH DOT RIGHT
+2687 ; [*081F.0020.0002.2687] # WHITE CIRCLE WITH TWO DOTS
+2688 ; [*0820.0020.0002.2688] # BLACK CIRCLE WITH WHITE DOT RIGHT
+2689 ; [*0821.0020.0002.2689] # BLACK CIRCLE WITH TWO WHITE DOTS
+268A ; [*0C11.0020.0002.268A] # MONOGRAM FOR YANG
+268B ; [*0C12.0020.0002.268B] # MONOGRAM FOR YIN
+268C ; [*0C13.0020.0002.268C] # DIGRAM FOR GREATER YANG
+268D ; [*0C14.0020.0002.268D] # DIGRAM FOR LESSER YIN
+268E ; [*0C15.0020.0002.268E] # DIGRAM FOR LESSER YANG
+268F ; [*0C16.0020.0002.268F] # DIGRAM FOR GREATER YIN
+2690 ; [*0822.0020.0002.2690] # WHITE FLAG
+2691 ; [*0823.0020.0002.2691] # BLACK FLAG
+2692 ; [*0824.0020.0002.2692] # HAMMER AND PICK
+2693 ; [*0825.0020.0002.2693] # ANCHOR
+2694 ; [*0826.0020.0002.2694] # CROSSED SWORDS
+2695 ; [*0827.0020.0002.2695] # STAFF OF AESCULAPIUS
+2696 ; [*0828.0020.0002.2696] # SCALES
+2697 ; [*0829.0020.0002.2697] # ALEMBIC
+2698 ; [*082A.0020.0002.2698] # FLOWER
+2699 ; [*082B.0020.0002.2699] # GEAR
+269A ; [*082C.0020.0002.269A] # STAFF OF HERMES
+269B ; [*082D.0020.0002.269B] # ATOM SYMBOL
+269C ; [*082E.0020.0002.269C] # FLEUR-DE-LIS
+26A0 ; [*082F.0020.0002.26A0] # WARNING SIGN
+26A1 ; [*0830.0020.0002.26A1] # HIGH VOLTAGE SIGN
+26A2 ; [*0831.0020.0002.26A2] # DOUBLED FEMALE SIGN
+26A3 ; [*0832.0020.0002.26A3] # DOUBLED MALE SIGN
+26A4 ; [*0833.0020.0002.26A4] # INTERLOCKED FEMALE AND MALE SIGN
+26A5 ; [*0834.0020.0002.26A5] # MALE AND FEMALE SIGN
+26A6 ; [*0835.0020.0002.26A6] # MALE WITH STROKE SIGN
+26A7 ; [*0836.0020.0002.26A7] # MALE WITH STROKE AND MALE AND FEMALE SIGN
+26A8 ; [*0837.0020.0002.26A8] # VERTICAL MALE WITH STROKE SIGN
+26A9 ; [*0838.0020.0002.26A9] # HORIZONTAL MALE WITH STROKE SIGN
+26AA ; [*0839.0020.0002.26AA] # MEDIUM WHITE CIRCLE
+26AB ; [*083A.0020.0002.26AB] # MEDIUM BLACK CIRCLE
+26AC ; [*083B.0020.0002.26AC] # MEDIUM SMALL WHITE CIRCLE
+26AD ; [*083C.0020.0002.26AD] # MARRIAGE SYMBOL
+26AE ; [*083D.0020.0002.26AE] # DIVORCE SYMBOL
+26AF ; [*083E.0020.0002.26AF] # UNMARRIED PARTNERSHIP SYMBOL
+26B0 ; [*083F.0020.0002.26B0] # COFFIN
+26B1 ; [*0840.0020.0002.26B1] # FUNERAL URN
+26B2 ; [*0841.0020.0002.26B2] # NEUTER
+2701 ; [*0842.0020.0002.2701] # UPPER BLADE SCISSORS
+2702 ; [*0843.0020.0002.2702] # BLACK SCISSORS
+2703 ; [*0844.0020.0002.2703] # LOWER BLADE SCISSORS
+2704 ; [*0845.0020.0002.2704] # WHITE SCISSORS
+2706 ; [*0846.0020.0002.2706] # TELEPHONE LOCATION SIGN
+2707 ; [*0847.0020.0002.2707] # TAPE DRIVE
+2708 ; [*0848.0020.0002.2708] # AIRPLANE
+2709 ; [*0849.0020.0002.2709] # ENVELOPE
+270C ; [*084A.0020.0002.270C] # VICTORY HAND
+270D ; [*084B.0020.0002.270D] # WRITING HAND
+270E ; [*084C.0020.0002.270E] # LOWER RIGHT PENCIL
+270F ; [*084D.0020.0002.270F] # PENCIL
+2710 ; [*084E.0020.0002.2710] # UPPER RIGHT PENCIL
+2711 ; [*084F.0020.0002.2711] # WHITE NIB
+2712 ; [*0850.0020.0002.2712] # BLACK NIB
+2713 ; [*0851.0020.0002.2713] # CHECK MARK
+2714 ; [*0852.0020.0002.2714] # HEAVY CHECK MARK
+2715 ; [*0853.0020.0002.2715] # MULTIPLICATION X
+2716 ; [*0854.0020.0002.2716] # HEAVY MULTIPLICATION X
+2717 ; [*0855.0020.0002.2717] # BALLOT X
+2718 ; [*0856.0020.0002.2718] # HEAVY BALLOT X
+2719 ; [*0857.0020.0002.2719] # OUTLINED GREEK CROSS
+271A ; [*0858.0020.0002.271A] # HEAVY GREEK CROSS
+271B ; [*0859.0020.0002.271B] # OPEN CENTRE CROSS
+271C ; [*085A.0020.0002.271C] # HEAVY OPEN CENTRE CROSS
+271D ; [*085B.0020.0002.271D] # LATIN CROSS
+271E ; [*085C.0020.0002.271E] # SHADOWED WHITE LATIN CROSS
+271F ; [*085D.0020.0002.271F] # OUTLINED LATIN CROSS
+2720 ; [*085E.0020.0002.2720] # MALTESE CROSS
+2721 ; [*085F.0020.0002.2721] # STAR OF DAVID
+2722 ; [*0860.0020.0002.2722] # FOUR TEARDROP-SPOKED ASTERISK
+2723 ; [*0861.0020.0002.2723] # FOUR BALLOON-SPOKED ASTERISK
+2724 ; [*0862.0020.0002.2724] # HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725 ; [*0863.0020.0002.2725] # FOUR CLUB-SPOKED ASTERISK
+2726 ; [*0864.0020.0002.2726] # BLACK FOUR POINTED STAR
+2727 ; [*0865.0020.0002.2727] # WHITE FOUR POINTED STAR
+2729 ; [*0866.0020.0002.2729] # STRESS OUTLINED WHITE STAR
+272A ; [*0867.0020.0002.272A] # CIRCLED WHITE STAR
+272B ; [*0868.0020.0002.272B] # OPEN CENTRE BLACK STAR
+272C ; [*0869.0020.0002.272C] # BLACK CENTRE WHITE STAR
+272D ; [*086A.0020.0002.272D] # OUTLINED BLACK STAR
+272E ; [*086B.0020.0002.272E] # HEAVY OUTLINED BLACK STAR
+272F ; [*086C.0020.0002.272F] # PINWHEEL STAR
+2730 ; [*086D.0020.0002.2730] # SHADOWED WHITE STAR
+2731 ; [*086E.0020.0002.2731] # HEAVY ASTERISK
+2732 ; [*086F.0020.0002.2732] # OPEN CENTRE ASTERISK
+2733 ; [*0870.0020.0002.2733] # EIGHT SPOKED ASTERISK
+2734 ; [*0871.0020.0002.2734] # EIGHT POINTED BLACK STAR
+2735 ; [*0872.0020.0002.2735] # EIGHT POINTED PINWHEEL STAR
+2736 ; [*0873.0020.0002.2736] # SIX POINTED BLACK STAR
+2737 ; [*0874.0020.0002.2737] # EIGHT POINTED RECTILINEAR BLACK STAR
+2738 ; [*0875.0020.0002.2738] # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739 ; [*0876.0020.0002.2739] # TWELVE POINTED BLACK STAR
+273A ; [*0877.0020.0002.273A] # SIXTEEN POINTED ASTERISK
+273B ; [*0878.0020.0002.273B] # TEARDROP-SPOKED ASTERISK
+273C ; [*0879.0020.0002.273C] # OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D ; [*087A.0020.0002.273D] # HEAVY TEARDROP-SPOKED ASTERISK
+273E ; [*087B.0020.0002.273E] # SIX PETALLED BLACK AND WHITE FLORETTE
+273F ; [*087C.0020.0002.273F] # BLACK FLORETTE
+2740 ; [*087D.0020.0002.2740] # WHITE FLORETTE
+2741 ; [*087E.0020.0002.2741] # EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742 ; [*087F.0020.0002.2742] # CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743 ; [*0880.0020.0002.2743] # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744 ; [*0881.0020.0002.2744] # SNOWFLAKE
+2745 ; [*0882.0020.0002.2745] # TIGHT TRIFOLIATE SNOWFLAKE
+2746 ; [*0883.0020.0002.2746] # HEAVY CHEVRON SNOWFLAKE
+2747 ; [*0884.0020.0002.2747] # SPARKLE
+2748 ; [*0885.0020.0002.2748] # HEAVY SPARKLE
+2749 ; [*0886.0020.0002.2749] # BALLOON-SPOKED ASTERISK
+274A ; [*0887.0020.0002.274A] # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B ; [*0888.0020.0002.274B] # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D ; [*0889.0020.0002.274D] # SHADOWED WHITE CIRCLE
+274F ; [*088A.0020.0002.274F] # LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750 ; [*088B.0020.0002.2750] # UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751 ; [*088C.0020.0002.2751] # LOWER RIGHT SHADOWED WHITE SQUARE
+2752 ; [*088D.0020.0002.2752] # UPPER RIGHT SHADOWED WHITE SQUARE
+2756 ; [*088E.0020.0002.2756] # BLACK DIAMOND MINUS WHITE X
+2758 ; [*088F.0020.0002.2758] # LIGHT VERTICAL BAR
+2759 ; [*0890.0020.0002.2759] # MEDIUM VERTICAL BAR
+275A ; [*0891.0020.0002.275A] # HEAVY VERTICAL BAR
+275B ; [*0892.0020.0002.275B] # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C ; [*0893.0020.0002.275C] # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D ; [*0894.0020.0002.275D] # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E ; [*0895.0020.0002.275E] # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761 ; [*0896.0020.0002.2761] # CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762 ; [*0897.0020.0002.2762] # HEAVY EXCLAMATION MARK ORNAMENT
+2763 ; [*0898.0020.0002.2763] # HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764 ; [*0899.0020.0002.2764] # HEAVY BLACK HEART
+2765 ; [*089A.0020.0002.2765] # ROTATED HEAVY BLACK HEART BULLET
+2766 ; [*089B.0020.0002.2766] # FLORAL HEART
+2767 ; [*089C.0020.0002.2767] # ROTATED FLORAL HEART BULLET
+2768 ; [*089D.0020.0002.2768] # MEDIUM LEFT PARENTHESIS ORNAMENT
+2769 ; [*089E.0020.0002.2769] # MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A ; [*089F.0020.0002.276A] # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B ; [*08A0.0020.0002.276B] # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C ; [*08A1.0020.0002.276C] # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D ; [*08A2.0020.0002.276D] # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E ; [*08A3.0020.0002.276E] # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F ; [*08A4.0020.0002.276F] # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770 ; [*08A5.0020.0002.2770] # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771 ; [*08A6.0020.0002.2771] # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772 ; [*08A7.0020.0002.2772] # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773 ; [*08A8.0020.0002.2773] # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774 ; [*08A9.0020.0002.2774] # MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775 ; [*08AA.0020.0002.2775] # MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2794 ; [*08AB.0020.0002.2794] # HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798 ; [*08AC.0020.0002.2798] # HEAVY SOUTH EAST ARROW
+2799 ; [*08AD.0020.0002.2799] # HEAVY RIGHTWARDS ARROW
+279A ; [*08AE.0020.0002.279A] # HEAVY NORTH EAST ARROW
+279B ; [*08AF.0020.0002.279B] # DRAFTING POINT RIGHTWARDS ARROW
+279C ; [*08B0.0020.0002.279C] # HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D ; [*08B1.0020.0002.279D] # TRIANGLE-HEADED RIGHTWARDS ARROW
+279E ; [*08B2.0020.0002.279E] # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F ; [*08B3.0020.0002.279F] # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0 ; [*08B4.0020.0002.27A0] # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1 ; [*08B5.0020.0002.27A1] # BLACK RIGHTWARDS ARROW
+27A2 ; [*08B6.0020.0002.27A2] # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3 ; [*08B7.0020.0002.27A3] # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4 ; [*08B8.0020.0002.27A4] # BLACK RIGHTWARDS ARROWHEAD
+27A5 ; [*08B9.0020.0002.27A5] # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6 ; [*08BA.0020.0002.27A6] # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7 ; [*08BB.0020.0002.27A7] # SQUAT BLACK RIGHTWARDS ARROW
+27A8 ; [*08BC.0020.0002.27A8] # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9 ; [*08BD.0020.0002.27A9] # RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA ; [*08BE.0020.0002.27AA] # LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB ; [*08BF.0020.0002.27AB] # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC ; [*08C0.0020.0002.27AC] # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD ; [*08C1.0020.0002.27AD] # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE ; [*08C2.0020.0002.27AE] # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF ; [*08C3.0020.0002.27AF] # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1 ; [*08C4.0020.0002.27B1] # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2 ; [*08C5.0020.0002.27B2] # CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3 ; [*08C6.0020.0002.27B3] # WHITE-FEATHERED RIGHTWARDS ARROW
+27B4 ; [*08C7.0020.0002.27B4] # BLACK-FEATHERED SOUTH EAST ARROW
+27B5 ; [*08C8.0020.0002.27B5] # BLACK-FEATHERED RIGHTWARDS ARROW
+27B6 ; [*08C9.0020.0002.27B6] # BLACK-FEATHERED NORTH EAST ARROW
+27B7 ; [*08CA.0020.0002.27B7] # HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8 ; [*08CB.0020.0002.27B8] # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9 ; [*08CC.0020.0002.27B9] # HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA ; [*08CD.0020.0002.27BA] # TEARDROP-BARBED RIGHTWARDS ARROW
+27BB ; [*08CE.0020.0002.27BB] # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC ; [*08CF.0020.0002.27BC] # WEDGE-TAILED RIGHTWARDS ARROW
+27BD ; [*08D0.0020.0002.27BD] # HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE ; [*08D1.0020.0002.27BE] # OPEN-OUTLINED RIGHTWARDS ARROW
+27C0 ; [*08D2.0020.0002.27C0] # THREE DIMENSIONAL ANGLE
+27C1 ; [*08D3.0020.0002.27C1] # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE
+27C2 ; [*08D4.0020.0002.27C2] # PERPENDICULAR
+27C3 ; [*08D5.0020.0002.27C3] # OPEN SUBSET
+27C4 ; [*08D6.0020.0002.27C4] # OPEN SUPERSET
+27C5 ; [*08D7.0020.0002.27C5] # LEFT S-SHAPED BAG DELIMITER
+27C6 ; [*08D8.0020.0002.27C6] # RIGHT S-SHAPED BAG DELIMITER
+27C7 ; [*08D9.0020.0002.27C7] # OR WITH DOT INSIDE
+27C8 ; [*08DA.0020.0002.27C8] # REVERSE SOLIDUS PRECEDING SUBSET
+27C9 ; [*08DB.0020.0002.27C9] # SUPERSET PRECEDING SOLIDUS
+27CA ; [*08DC.0020.0002.27CA] # VERTICAL BAR WITH HORIZONTAL STROKE
+27D0 ; [*08DD.0020.0002.27D0] # WHITE DIAMOND WITH CENTRED DOT
+27D1 ; [*08DE.0020.0002.27D1] # AND WITH DOT
+27D2 ; [*08DF.0020.0002.27D2] # ELEMENT OF OPENING UPWARDS
+27D3 ; [*08E0.0020.0002.27D3] # LOWER RIGHT CORNER WITH DOT
+27D4 ; [*08E1.0020.0002.27D4] # UPPER LEFT CORNER WITH DOT
+27D5 ; [*08E2.0020.0002.27D5] # LEFT OUTER JOIN
+27D6 ; [*08E3.0020.0002.27D6] # RIGHT OUTER JOIN
+27D7 ; [*08E4.0020.0002.27D7] # FULL OUTER JOIN
+27D8 ; [*08E5.0020.0002.27D8] # LARGE UP TACK
+27D9 ; [*08E6.0020.0002.27D9] # LARGE DOWN TACK
+27DA ; [*08E7.0020.0002.27DA] # LEFT AND RIGHT DOUBLE TURNSTILE
+27DB ; [*08E8.0020.0002.27DB] # LEFT AND RIGHT TACK
+27DC ; [*08E9.0020.0002.27DC] # LEFT MULTIMAP
+27DD ; [*08EA.0020.0002.27DD] # LONG RIGHT TACK
+27DE ; [*08EB.0020.0002.27DE] # LONG LEFT TACK
+27DF ; [*08EC.0020.0002.27DF] # UP TACK WITH CIRCLE ABOVE
+27E0 ; [*08ED.0020.0002.27E0] # LOZENGE DIVIDED BY HORIZONTAL RULE
+27E1 ; [*08EE.0020.0002.27E1] # WHITE CONCAVE-SIDED DIAMOND
+27E2 ; [*08EF.0020.0002.27E2] # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3 ; [*08F0.0020.0002.27E3] # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4 ; [*08F1.0020.0002.27E4] # WHITE SQUARE WITH LEFTWARDS TICK
+27E5 ; [*08F2.0020.0002.27E5] # WHITE SQUARE WITH RIGHTWARDS TICK
+27E6 ; [*08F3.0020.0002.27E6] # MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 ; [*08F4.0020.0002.27E7] # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 ; [*08F5.0020.0002.27E8] # MATHEMATICAL LEFT ANGLE BRACKET
+27E9 ; [*08F6.0020.0002.27E9] # MATHEMATICAL RIGHT ANGLE BRACKET
+27EA ; [*08F7.0020.0002.27EA] # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB ; [*08F8.0020.0002.27EB] # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27F0 ; [*08F9.0020.0002.27F0] # UPWARDS QUADRUPLE ARROW
+27F1 ; [*08FA.0020.0002.27F1] # DOWNWARDS QUADRUPLE ARROW
+27F2 ; [*08FB.0020.0002.27F2] # ANTICLOCKWISE GAPPED CIRCLE ARROW
+27F3 ; [*08FC.0020.0002.27F3] # CLOCKWISE GAPPED CIRCLE ARROW
+27F4 ; [*08FD.0020.0002.27F4] # RIGHT ARROW WITH CIRCLED PLUS
+27F5 ; [*08FE.0020.0002.27F5] # LONG LEFTWARDS ARROW
+27F6 ; [*08FF.0020.0002.27F6] # LONG RIGHTWARDS ARROW
+27F7 ; [*0900.0020.0002.27F7] # LONG LEFT RIGHT ARROW
+27F8 ; [*0901.0020.0002.27F8] # LONG LEFTWARDS DOUBLE ARROW
+27F9 ; [*0902.0020.0002.27F9] # LONG RIGHTWARDS DOUBLE ARROW
+27FA ; [*0903.0020.0002.27FA] # LONG LEFT RIGHT DOUBLE ARROW
+27FB ; [*0904.0020.0002.27FB] # LONG LEFTWARDS ARROW FROM BAR
+27FC ; [*0905.0020.0002.27FC] # LONG RIGHTWARDS ARROW FROM BAR
+27FD ; [*0906.0020.0002.27FD] # LONG LEFTWARDS DOUBLE ARROW FROM BAR
+27FE ; [*0907.0020.0002.27FE] # LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+27FF ; [*0908.0020.0002.27FF] # LONG RIGHTWARDS SQUIGGLE ARROW
+2800 ; [*0B11.0020.0002.2800] # BRAILLE PATTERN BLANK
+2801 ; [*0B12.0020.0002.2801] # BRAILLE PATTERN DOTS-1
+2802 ; [*0B13.0020.0002.2802] # BRAILLE PATTERN DOTS-2
+2803 ; [*0B14.0020.0002.2803] # BRAILLE PATTERN DOTS-12
+2804 ; [*0B15.0020.0002.2804] # BRAILLE PATTERN DOTS-3
+2805 ; [*0B16.0020.0002.2805] # BRAILLE PATTERN DOTS-13
+2806 ; [*0B17.0020.0002.2806] # BRAILLE PATTERN DOTS-23
+2807 ; [*0B18.0020.0002.2807] # BRAILLE PATTERN DOTS-123
+2808 ; [*0B19.0020.0002.2808] # BRAILLE PATTERN DOTS-4
+2809 ; [*0B1A.0020.0002.2809] # BRAILLE PATTERN DOTS-14
+280A ; [*0B1B.0020.0002.280A] # BRAILLE PATTERN DOTS-24
+280B ; [*0B1C.0020.0002.280B] # BRAILLE PATTERN DOTS-124
+280C ; [*0B1D.0020.0002.280C] # BRAILLE PATTERN DOTS-34
+280D ; [*0B1E.0020.0002.280D] # BRAILLE PATTERN DOTS-134
+280E ; [*0B1F.0020.0002.280E] # BRAILLE PATTERN DOTS-234
+280F ; [*0B20.0020.0002.280F] # BRAILLE PATTERN DOTS-1234
+2810 ; [*0B21.0020.0002.2810] # BRAILLE PATTERN DOTS-5
+2811 ; [*0B22.0020.0002.2811] # BRAILLE PATTERN DOTS-15
+2812 ; [*0B23.0020.0002.2812] # BRAILLE PATTERN DOTS-25
+2813 ; [*0B24.0020.0002.2813] # BRAILLE PATTERN DOTS-125
+2814 ; [*0B25.0020.0002.2814] # BRAILLE PATTERN DOTS-35
+2815 ; [*0B26.0020.0002.2815] # BRAILLE PATTERN DOTS-135
+2816 ; [*0B27.0020.0002.2816] # BRAILLE PATTERN DOTS-235
+2817 ; [*0B28.0020.0002.2817] # BRAILLE PATTERN DOTS-1235
+2818 ; [*0B29.0020.0002.2818] # BRAILLE PATTERN DOTS-45
+2819 ; [*0B2A.0020.0002.2819] # BRAILLE PATTERN DOTS-145
+281A ; [*0B2B.0020.0002.281A] # BRAILLE PATTERN DOTS-245
+281B ; [*0B2C.0020.0002.281B] # BRAILLE PATTERN DOTS-1245
+281C ; [*0B2D.0020.0002.281C] # BRAILLE PATTERN DOTS-345
+281D ; [*0B2E.0020.0002.281D] # BRAILLE PATTERN DOTS-1345
+281E ; [*0B2F.0020.0002.281E] # BRAILLE PATTERN DOTS-2345
+281F ; [*0B30.0020.0002.281F] # BRAILLE PATTERN DOTS-12345
+2820 ; [*0B31.0020.0002.2820] # BRAILLE PATTERN DOTS-6
+2821 ; [*0B32.0020.0002.2821] # BRAILLE PATTERN DOTS-16
+2822 ; [*0B33.0020.0002.2822] # BRAILLE PATTERN DOTS-26
+2823 ; [*0B34.0020.0002.2823] # BRAILLE PATTERN DOTS-126
+2824 ; [*0B35.0020.0002.2824] # BRAILLE PATTERN DOTS-36
+2825 ; [*0B36.0020.0002.2825] # BRAILLE PATTERN DOTS-136
+2826 ; [*0B37.0020.0002.2826] # BRAILLE PATTERN DOTS-236
+2827 ; [*0B38.0020.0002.2827] # BRAILLE PATTERN DOTS-1236
+2828 ; [*0B39.0020.0002.2828] # BRAILLE PATTERN DOTS-46
+2829 ; [*0B3A.0020.0002.2829] # BRAILLE PATTERN DOTS-146
+282A ; [*0B3B.0020.0002.282A] # BRAILLE PATTERN DOTS-246
+282B ; [*0B3C.0020.0002.282B] # BRAILLE PATTERN DOTS-1246
+282C ; [*0B3D.0020.0002.282C] # BRAILLE PATTERN DOTS-346
+282D ; [*0B3E.0020.0002.282D] # BRAILLE PATTERN DOTS-1346
+282E ; [*0B3F.0020.0002.282E] # BRAILLE PATTERN DOTS-2346
+282F ; [*0B40.0020.0002.282F] # BRAILLE PATTERN DOTS-12346
+2830 ; [*0B41.0020.0002.2830] # BRAILLE PATTERN DOTS-56
+2831 ; [*0B42.0020.0002.2831] # BRAILLE PATTERN DOTS-156
+2832 ; [*0B43.0020.0002.2832] # BRAILLE PATTERN DOTS-256
+2833 ; [*0B44.0020.0002.2833] # BRAILLE PATTERN DOTS-1256
+2834 ; [*0B45.0020.0002.2834] # BRAILLE PATTERN DOTS-356
+2835 ; [*0B46.0020.0002.2835] # BRAILLE PATTERN DOTS-1356
+2836 ; [*0B47.0020.0002.2836] # BRAILLE PATTERN DOTS-2356
+2837 ; [*0B48.0020.0002.2837] # BRAILLE PATTERN DOTS-12356
+2838 ; [*0B49.0020.0002.2838] # BRAILLE PATTERN DOTS-456
+2839 ; [*0B4A.0020.0002.2839] # BRAILLE PATTERN DOTS-1456
+283A ; [*0B4B.0020.0002.283A] # BRAILLE PATTERN DOTS-2456
+283B ; [*0B4C.0020.0002.283B] # BRAILLE PATTERN DOTS-12456
+283C ; [*0B4D.0020.0002.283C] # BRAILLE PATTERN DOTS-3456
+283D ; [*0B4E.0020.0002.283D] # BRAILLE PATTERN DOTS-13456
+283E ; [*0B4F.0020.0002.283E] # BRAILLE PATTERN DOTS-23456
+283F ; [*0B50.0020.0002.283F] # BRAILLE PATTERN DOTS-123456
+2840 ; [*0B51.0020.0002.2840] # BRAILLE PATTERN DOTS-7
+2841 ; [*0B52.0020.0002.2841] # BRAILLE PATTERN DOTS-17
+2842 ; [*0B53.0020.0002.2842] # BRAILLE PATTERN DOTS-27
+2843 ; [*0B54.0020.0002.2843] # BRAILLE PATTERN DOTS-127
+2844 ; [*0B55.0020.0002.2844] # BRAILLE PATTERN DOTS-37
+2845 ; [*0B56.0020.0002.2845] # BRAILLE PATTERN DOTS-137
+2846 ; [*0B57.0020.0002.2846] # BRAILLE PATTERN DOTS-237
+2847 ; [*0B58.0020.0002.2847] # BRAILLE PATTERN DOTS-1237
+2848 ; [*0B59.0020.0002.2848] # BRAILLE PATTERN DOTS-47
+2849 ; [*0B5A.0020.0002.2849] # BRAILLE PATTERN DOTS-147
+284A ; [*0B5B.0020.0002.284A] # BRAILLE PATTERN DOTS-247
+284B ; [*0B5C.0020.0002.284B] # BRAILLE PATTERN DOTS-1247
+284C ; [*0B5D.0020.0002.284C] # BRAILLE PATTERN DOTS-347
+284D ; [*0B5E.0020.0002.284D] # BRAILLE PATTERN DOTS-1347
+284E ; [*0B5F.0020.0002.284E] # BRAILLE PATTERN DOTS-2347
+284F ; [*0B60.0020.0002.284F] # BRAILLE PATTERN DOTS-12347
+2850 ; [*0B61.0020.0002.2850] # BRAILLE PATTERN DOTS-57
+2851 ; [*0B62.0020.0002.2851] # BRAILLE PATTERN DOTS-157
+2852 ; [*0B63.0020.0002.2852] # BRAILLE PATTERN DOTS-257
+2853 ; [*0B64.0020.0002.2853] # BRAILLE PATTERN DOTS-1257
+2854 ; [*0B65.0020.0002.2854] # BRAILLE PATTERN DOTS-357
+2855 ; [*0B66.0020.0002.2855] # BRAILLE PATTERN DOTS-1357
+2856 ; [*0B67.0020.0002.2856] # BRAILLE PATTERN DOTS-2357
+2857 ; [*0B68.0020.0002.2857] # BRAILLE PATTERN DOTS-12357
+2858 ; [*0B69.0020.0002.2858] # BRAILLE PATTERN DOTS-457
+2859 ; [*0B6A.0020.0002.2859] # BRAILLE PATTERN DOTS-1457
+285A ; [*0B6B.0020.0002.285A] # BRAILLE PATTERN DOTS-2457
+285B ; [*0B6C.0020.0002.285B] # BRAILLE PATTERN DOTS-12457
+285C ; [*0B6D.0020.0002.285C] # BRAILLE PATTERN DOTS-3457
+285D ; [*0B6E.0020.0002.285D] # BRAILLE PATTERN DOTS-13457
+285E ; [*0B6F.0020.0002.285E] # BRAILLE PATTERN DOTS-23457
+285F ; [*0B70.0020.0002.285F] # BRAILLE PATTERN DOTS-123457
+2860 ; [*0B71.0020.0002.2860] # BRAILLE PATTERN DOTS-67
+2861 ; [*0B72.0020.0002.2861] # BRAILLE PATTERN DOTS-167
+2862 ; [*0B73.0020.0002.2862] # BRAILLE PATTERN DOTS-267
+2863 ; [*0B74.0020.0002.2863] # BRAILLE PATTERN DOTS-1267
+2864 ; [*0B75.0020.0002.2864] # BRAILLE PATTERN DOTS-367
+2865 ; [*0B76.0020.0002.2865] # BRAILLE PATTERN DOTS-1367
+2866 ; [*0B77.0020.0002.2866] # BRAILLE PATTERN DOTS-2367
+2867 ; [*0B78.0020.0002.2867] # BRAILLE PATTERN DOTS-12367
+2868 ; [*0B79.0020.0002.2868] # BRAILLE PATTERN DOTS-467
+2869 ; [*0B7A.0020.0002.2869] # BRAILLE PATTERN DOTS-1467
+286A ; [*0B7B.0020.0002.286A] # BRAILLE PATTERN DOTS-2467
+286B ; [*0B7C.0020.0002.286B] # BRAILLE PATTERN DOTS-12467
+286C ; [*0B7D.0020.0002.286C] # BRAILLE PATTERN DOTS-3467
+286D ; [*0B7E.0020.0002.286D] # BRAILLE PATTERN DOTS-13467
+286E ; [*0B7F.0020.0002.286E] # BRAILLE PATTERN DOTS-23467
+286F ; [*0B80.0020.0002.286F] # BRAILLE PATTERN DOTS-123467
+2870 ; [*0B81.0020.0002.2870] # BRAILLE PATTERN DOTS-567
+2871 ; [*0B82.0020.0002.2871] # BRAILLE PATTERN DOTS-1567
+2872 ; [*0B83.0020.0002.2872] # BRAILLE PATTERN DOTS-2567
+2873 ; [*0B84.0020.0002.2873] # BRAILLE PATTERN DOTS-12567
+2874 ; [*0B85.0020.0002.2874] # BRAILLE PATTERN DOTS-3567
+2875 ; [*0B86.0020.0002.2875] # BRAILLE PATTERN DOTS-13567
+2876 ; [*0B87.0020.0002.2876] # BRAILLE PATTERN DOTS-23567
+2877 ; [*0B88.0020.0002.2877] # BRAILLE PATTERN DOTS-123567
+2878 ; [*0B89.0020.0002.2878] # BRAILLE PATTERN DOTS-4567
+2879 ; [*0B8A.0020.0002.2879] # BRAILLE PATTERN DOTS-14567
+287A ; [*0B8B.0020.0002.287A] # BRAILLE PATTERN DOTS-24567
+287B ; [*0B8C.0020.0002.287B] # BRAILLE PATTERN DOTS-124567
+287C ; [*0B8D.0020.0002.287C] # BRAILLE PATTERN DOTS-34567
+287D ; [*0B8E.0020.0002.287D] # BRAILLE PATTERN DOTS-134567
+287E ; [*0B8F.0020.0002.287E] # BRAILLE PATTERN DOTS-234567
+287F ; [*0B90.0020.0002.287F] # BRAILLE PATTERN DOTS-1234567
+2880 ; [*0B91.0020.0002.2880] # BRAILLE PATTERN DOTS-8
+2881 ; [*0B92.0020.0002.2881] # BRAILLE PATTERN DOTS-18
+2882 ; [*0B93.0020.0002.2882] # BRAILLE PATTERN DOTS-28
+2883 ; [*0B94.0020.0002.2883] # BRAILLE PATTERN DOTS-128
+2884 ; [*0B95.0020.0002.2884] # BRAILLE PATTERN DOTS-38
+2885 ; [*0B96.0020.0002.2885] # BRAILLE PATTERN DOTS-138
+2886 ; [*0B97.0020.0002.2886] # BRAILLE PATTERN DOTS-238
+2887 ; [*0B98.0020.0002.2887] # BRAILLE PATTERN DOTS-1238
+2888 ; [*0B99.0020.0002.2888] # BRAILLE PATTERN DOTS-48
+2889 ; [*0B9A.0020.0002.2889] # BRAILLE PATTERN DOTS-148
+288A ; [*0B9B.0020.0002.288A] # BRAILLE PATTERN DOTS-248
+288B ; [*0B9C.0020.0002.288B] # BRAILLE PATTERN DOTS-1248
+288C ; [*0B9D.0020.0002.288C] # BRAILLE PATTERN DOTS-348
+288D ; [*0B9E.0020.0002.288D] # BRAILLE PATTERN DOTS-1348
+288E ; [*0B9F.0020.0002.288E] # BRAILLE PATTERN DOTS-2348
+288F ; [*0BA0.0020.0002.288F] # BRAILLE PATTERN DOTS-12348
+2890 ; [*0BA1.0020.0002.2890] # BRAILLE PATTERN DOTS-58
+2891 ; [*0BA2.0020.0002.2891] # BRAILLE PATTERN DOTS-158
+2892 ; [*0BA3.0020.0002.2892] # BRAILLE PATTERN DOTS-258
+2893 ; [*0BA4.0020.0002.2893] # BRAILLE PATTERN DOTS-1258
+2894 ; [*0BA5.0020.0002.2894] # BRAILLE PATTERN DOTS-358
+2895 ; [*0BA6.0020.0002.2895] # BRAILLE PATTERN DOTS-1358
+2896 ; [*0BA7.0020.0002.2896] # BRAILLE PATTERN DOTS-2358
+2897 ; [*0BA8.0020.0002.2897] # BRAILLE PATTERN DOTS-12358
+2898 ; [*0BA9.0020.0002.2898] # BRAILLE PATTERN DOTS-458
+2899 ; [*0BAA.0020.0002.2899] # BRAILLE PATTERN DOTS-1458
+289A ; [*0BAB.0020.0002.289A] # BRAILLE PATTERN DOTS-2458
+289B ; [*0BAC.0020.0002.289B] # BRAILLE PATTERN DOTS-12458
+289C ; [*0BAD.0020.0002.289C] # BRAILLE PATTERN DOTS-3458
+289D ; [*0BAE.0020.0002.289D] # BRAILLE PATTERN DOTS-13458
+289E ; [*0BAF.0020.0002.289E] # BRAILLE PATTERN DOTS-23458
+289F ; [*0BB0.0020.0002.289F] # BRAILLE PATTERN DOTS-123458
+28A0 ; [*0BB1.0020.0002.28A0] # BRAILLE PATTERN DOTS-68
+28A1 ; [*0BB2.0020.0002.28A1] # BRAILLE PATTERN DOTS-168
+28A2 ; [*0BB3.0020.0002.28A2] # BRAILLE PATTERN DOTS-268
+28A3 ; [*0BB4.0020.0002.28A3] # BRAILLE PATTERN DOTS-1268
+28A4 ; [*0BB5.0020.0002.28A4] # BRAILLE PATTERN DOTS-368
+28A5 ; [*0BB6.0020.0002.28A5] # BRAILLE PATTERN DOTS-1368
+28A6 ; [*0BB7.0020.0002.28A6] # BRAILLE PATTERN DOTS-2368
+28A7 ; [*0BB8.0020.0002.28A7] # BRAILLE PATTERN DOTS-12368
+28A8 ; [*0BB9.0020.0002.28A8] # BRAILLE PATTERN DOTS-468
+28A9 ; [*0BBA.0020.0002.28A9] # BRAILLE PATTERN DOTS-1468
+28AA ; [*0BBB.0020.0002.28AA] # BRAILLE PATTERN DOTS-2468
+28AB ; [*0BBC.0020.0002.28AB] # BRAILLE PATTERN DOTS-12468
+28AC ; [*0BBD.0020.0002.28AC] # BRAILLE PATTERN DOTS-3468
+28AD ; [*0BBE.0020.0002.28AD] # BRAILLE PATTERN DOTS-13468
+28AE ; [*0BBF.0020.0002.28AE] # BRAILLE PATTERN DOTS-23468
+28AF ; [*0BC0.0020.0002.28AF] # BRAILLE PATTERN DOTS-123468
+28B0 ; [*0BC1.0020.0002.28B0] # BRAILLE PATTERN DOTS-568
+28B1 ; [*0BC2.0020.0002.28B1] # BRAILLE PATTERN DOTS-1568
+28B2 ; [*0BC3.0020.0002.28B2] # BRAILLE PATTERN DOTS-2568
+28B3 ; [*0BC4.0020.0002.28B3] # BRAILLE PATTERN DOTS-12568
+28B4 ; [*0BC5.0020.0002.28B4] # BRAILLE PATTERN DOTS-3568
+28B5 ; [*0BC6.0020.0002.28B5] # BRAILLE PATTERN DOTS-13568
+28B6 ; [*0BC7.0020.0002.28B6] # BRAILLE PATTERN DOTS-23568
+28B7 ; [*0BC8.0020.0002.28B7] # BRAILLE PATTERN DOTS-123568
+28B8 ; [*0BC9.0020.0002.28B8] # BRAILLE PATTERN DOTS-4568
+28B9 ; [*0BCA.0020.0002.28B9] # BRAILLE PATTERN DOTS-14568
+28BA ; [*0BCB.0020.0002.28BA] # BRAILLE PATTERN DOTS-24568
+28BB ; [*0BCC.0020.0002.28BB] # BRAILLE PATTERN DOTS-124568
+28BC ; [*0BCD.0020.0002.28BC] # BRAILLE PATTERN DOTS-34568
+28BD ; [*0BCE.0020.0002.28BD] # BRAILLE PATTERN DOTS-134568
+28BE ; [*0BCF.0020.0002.28BE] # BRAILLE PATTERN DOTS-234568
+28BF ; [*0BD0.0020.0002.28BF] # BRAILLE PATTERN DOTS-1234568
+28C0 ; [*0BD1.0020.0002.28C0] # BRAILLE PATTERN DOTS-78
+28C1 ; [*0BD2.0020.0002.28C1] # BRAILLE PATTERN DOTS-178
+28C2 ; [*0BD3.0020.0002.28C2] # BRAILLE PATTERN DOTS-278
+28C3 ; [*0BD4.0020.0002.28C3] # BRAILLE PATTERN DOTS-1278
+28C4 ; [*0BD5.0020.0002.28C4] # BRAILLE PATTERN DOTS-378
+28C5 ; [*0BD6.0020.0002.28C5] # BRAILLE PATTERN DOTS-1378
+28C6 ; [*0BD7.0020.0002.28C6] # BRAILLE PATTERN DOTS-2378
+28C7 ; [*0BD8.0020.0002.28C7] # BRAILLE PATTERN DOTS-12378
+28C8 ; [*0BD9.0020.0002.28C8] # BRAILLE PATTERN DOTS-478
+28C9 ; [*0BDA.0020.0002.28C9] # BRAILLE PATTERN DOTS-1478
+28CA ; [*0BDB.0020.0002.28CA] # BRAILLE PATTERN DOTS-2478
+28CB ; [*0BDC.0020.0002.28CB] # BRAILLE PATTERN DOTS-12478
+28CC ; [*0BDD.0020.0002.28CC] # BRAILLE PATTERN DOTS-3478
+28CD ; [*0BDE.0020.0002.28CD] # BRAILLE PATTERN DOTS-13478
+28CE ; [*0BDF.0020.0002.28CE] # BRAILLE PATTERN DOTS-23478
+28CF ; [*0BE0.0020.0002.28CF] # BRAILLE PATTERN DOTS-123478
+28D0 ; [*0BE1.0020.0002.28D0] # BRAILLE PATTERN DOTS-578
+28D1 ; [*0BE2.0020.0002.28D1] # BRAILLE PATTERN DOTS-1578
+28D2 ; [*0BE3.0020.0002.28D2] # BRAILLE PATTERN DOTS-2578
+28D3 ; [*0BE4.0020.0002.28D3] # BRAILLE PATTERN DOTS-12578
+28D4 ; [*0BE5.0020.0002.28D4] # BRAILLE PATTERN DOTS-3578
+28D5 ; [*0BE6.0020.0002.28D5] # BRAILLE PATTERN DOTS-13578
+28D6 ; [*0BE7.0020.0002.28D6] # BRAILLE PATTERN DOTS-23578
+28D7 ; [*0BE8.0020.0002.28D7] # BRAILLE PATTERN DOTS-123578
+28D8 ; [*0BE9.0020.0002.28D8] # BRAILLE PATTERN DOTS-4578
+28D9 ; [*0BEA.0020.0002.28D9] # BRAILLE PATTERN DOTS-14578
+28DA ; [*0BEB.0020.0002.28DA] # BRAILLE PATTERN DOTS-24578
+28DB ; [*0BEC.0020.0002.28DB] # BRAILLE PATTERN DOTS-124578
+28DC ; [*0BED.0020.0002.28DC] # BRAILLE PATTERN DOTS-34578
+28DD ; [*0BEE.0020.0002.28DD] # BRAILLE PATTERN DOTS-134578
+28DE ; [*0BEF.0020.0002.28DE] # BRAILLE PATTERN DOTS-234578
+28DF ; [*0BF0.0020.0002.28DF] # BRAILLE PATTERN DOTS-1234578
+28E0 ; [*0BF1.0020.0002.28E0] # BRAILLE PATTERN DOTS-678
+28E1 ; [*0BF2.0020.0002.28E1] # BRAILLE PATTERN DOTS-1678
+28E2 ; [*0BF3.0020.0002.28E2] # BRAILLE PATTERN DOTS-2678
+28E3 ; [*0BF4.0020.0002.28E3] # BRAILLE PATTERN DOTS-12678
+28E4 ; [*0BF5.0020.0002.28E4] # BRAILLE PATTERN DOTS-3678
+28E5 ; [*0BF6.0020.0002.28E5] # BRAILLE PATTERN DOTS-13678
+28E6 ; [*0BF7.0020.0002.28E6] # BRAILLE PATTERN DOTS-23678
+28E7 ; [*0BF8.0020.0002.28E7] # BRAILLE PATTERN DOTS-123678
+28E8 ; [*0BF9.0020.0002.28E8] # BRAILLE PATTERN DOTS-4678
+28E9 ; [*0BFA.0020.0002.28E9] # BRAILLE PATTERN DOTS-14678
+28EA ; [*0BFB.0020.0002.28EA] # BRAILLE PATTERN DOTS-24678
+28EB ; [*0BFC.0020.0002.28EB] # BRAILLE PATTERN DOTS-124678
+28EC ; [*0BFD.0020.0002.28EC] # BRAILLE PATTERN DOTS-34678
+28ED ; [*0BFE.0020.0002.28ED] # BRAILLE PATTERN DOTS-134678
+28EE ; [*0BFF.0020.0002.28EE] # BRAILLE PATTERN DOTS-234678
+28EF ; [*0C00.0020.0002.28EF] # BRAILLE PATTERN DOTS-1234678
+28F0 ; [*0C01.0020.0002.28F0] # BRAILLE PATTERN DOTS-5678
+28F1 ; [*0C02.0020.0002.28F1] # BRAILLE PATTERN DOTS-15678
+28F2 ; [*0C03.0020.0002.28F2] # BRAILLE PATTERN DOTS-25678
+28F3 ; [*0C04.0020.0002.28F3] # BRAILLE PATTERN DOTS-125678
+28F4 ; [*0C05.0020.0002.28F4] # BRAILLE PATTERN DOTS-35678
+28F5 ; [*0C06.0020.0002.28F5] # BRAILLE PATTERN DOTS-135678
+28F6 ; [*0C07.0020.0002.28F6] # BRAILLE PATTERN DOTS-235678
+28F7 ; [*0C08.0020.0002.28F7] # BRAILLE PATTERN DOTS-1235678
+28F8 ; [*0C09.0020.0002.28F8] # BRAILLE PATTERN DOTS-45678
+28F9 ; [*0C0A.0020.0002.28F9] # BRAILLE PATTERN DOTS-145678
+28FA ; [*0C0B.0020.0002.28FA] # BRAILLE PATTERN DOTS-245678
+28FB ; [*0C0C.0020.0002.28FB] # BRAILLE PATTERN DOTS-1245678
+28FC ; [*0C0D.0020.0002.28FC] # BRAILLE PATTERN DOTS-345678
+28FD ; [*0C0E.0020.0002.28FD] # BRAILLE PATTERN DOTS-1345678
+28FE ; [*0C0F.0020.0002.28FE] # BRAILLE PATTERN DOTS-2345678
+28FF ; [*0C10.0020.0002.28FF] # BRAILLE PATTERN DOTS-12345678
+2900 ; [*0909.0020.0002.2900] # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2901 ; [*090A.0020.0002.2901] # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2902 ; [*090B.0020.0002.2902] # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2903 ; [*090C.0020.0002.2903] # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2904 ; [*090D.0020.0002.2904] # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+2905 ; [*090E.0020.0002.2905] # RIGHTWARDS TWO-HEADED ARROW FROM BAR
+2906 ; [*090F.0020.0002.2906] # LEFTWARDS DOUBLE ARROW FROM BAR
+2907 ; [*0910.0020.0002.2907] # RIGHTWARDS DOUBLE ARROW FROM BAR
+2908 ; [*0911.0020.0002.2908] # DOWNWARDS ARROW WITH HORIZONTAL STROKE
+2909 ; [*0912.0020.0002.2909] # UPWARDS ARROW WITH HORIZONTAL STROKE
+290A ; [*0913.0020.0002.290A] # UPWARDS TRIPLE ARROW
+290B ; [*0914.0020.0002.290B] # DOWNWARDS TRIPLE ARROW
+290C ; [*0915.0020.0002.290C] # LEFTWARDS DOUBLE DASH ARROW
+290D ; [*0916.0020.0002.290D] # RIGHTWARDS DOUBLE DASH ARROW
+290E ; [*0917.0020.0002.290E] # LEFTWARDS TRIPLE DASH ARROW
+290F ; [*0918.0020.0002.290F] # RIGHTWARDS TRIPLE DASH ARROW
+2910 ; [*0919.0020.0002.2910] # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+2911 ; [*091A.0020.0002.2911] # RIGHTWARDS ARROW WITH DOTTED STEM
+2912 ; [*091B.0020.0002.2912] # UPWARDS ARROW TO BAR
+2913 ; [*091C.0020.0002.2913] # DOWNWARDS ARROW TO BAR
+2914 ; [*091D.0020.0002.2914] # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2915 ; [*091E.0020.0002.2915] # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2916 ; [*091F.0020.0002.2916] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+2917 ; [*0920.0020.0002.2917] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2918 ; [*0921.0020.0002.2918] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2919 ; [*0922.0020.0002.2919] # LEFTWARDS ARROW-TAIL
+291A ; [*0923.0020.0002.291A] # RIGHTWARDS ARROW-TAIL
+291B ; [*0924.0020.0002.291B] # LEFTWARDS DOUBLE ARROW-TAIL
+291C ; [*0925.0020.0002.291C] # RIGHTWARDS DOUBLE ARROW-TAIL
+291D ; [*0926.0020.0002.291D] # LEFTWARDS ARROW TO BLACK DIAMOND
+291E ; [*0927.0020.0002.291E] # RIGHTWARDS ARROW TO BLACK DIAMOND
+291F ; [*0928.0020.0002.291F] # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2920 ; [*0929.0020.0002.2920] # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2921 ; [*092A.0020.0002.2921] # NORTH WEST AND SOUTH EAST ARROW
+2922 ; [*092B.0020.0002.2922] # NORTH EAST AND SOUTH WEST ARROW
+2923 ; [*092C.0020.0002.2923] # NORTH WEST ARROW WITH HOOK
+2924 ; [*092D.0020.0002.2924] # NORTH EAST ARROW WITH HOOK
+2925 ; [*092E.0020.0002.2925] # SOUTH EAST ARROW WITH HOOK
+2926 ; [*092F.0020.0002.2926] # SOUTH WEST ARROW WITH HOOK
+2927 ; [*0930.0020.0002.2927] # NORTH WEST ARROW AND NORTH EAST ARROW
+2928 ; [*0931.0020.0002.2928] # NORTH EAST ARROW AND SOUTH EAST ARROW
+2929 ; [*0932.0020.0002.2929] # SOUTH EAST ARROW AND SOUTH WEST ARROW
+292A ; [*0933.0020.0002.292A] # SOUTH WEST ARROW AND NORTH WEST ARROW
+292B ; [*0934.0020.0002.292B] # RISING DIAGONAL CROSSING FALLING DIAGONAL
+292C ; [*0935.0020.0002.292C] # FALLING DIAGONAL CROSSING RISING DIAGONAL
+292D ; [*0936.0020.0002.292D] # SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+292E ; [*0937.0020.0002.292E] # NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+292F ; [*0938.0020.0002.292F] # FALLING DIAGONAL CROSSING NORTH EAST ARROW
+2930 ; [*0939.0020.0002.2930] # RISING DIAGONAL CROSSING SOUTH EAST ARROW
+2931 ; [*093A.0020.0002.2931] # NORTH EAST ARROW CROSSING NORTH WEST ARROW
+2932 ; [*093B.0020.0002.2932] # NORTH WEST ARROW CROSSING NORTH EAST ARROW
+2933 ; [*093C.0020.0002.2933] # WAVE ARROW POINTING DIRECTLY RIGHT
+2934 ; [*093D.0020.0002.2934] # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+2935 ; [*093E.0020.0002.2935] # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+2936 ; [*093F.0020.0002.2936] # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+2937 ; [*0940.0020.0002.2937] # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+2938 ; [*0941.0020.0002.2938] # RIGHT-SIDE ARC CLOCKWISE ARROW
+2939 ; [*0942.0020.0002.2939] # LEFT-SIDE ARC ANTICLOCKWISE ARROW
+293A ; [*0943.0020.0002.293A] # TOP ARC ANTICLOCKWISE ARROW
+293B ; [*0944.0020.0002.293B] # BOTTOM ARC ANTICLOCKWISE ARROW
+293C ; [*0945.0020.0002.293C] # TOP ARC CLOCKWISE ARROW WITH MINUS
+293D ; [*0946.0020.0002.293D] # TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+293E ; [*0947.0020.0002.293E] # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
+293F ; [*0948.0020.0002.293F] # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
+2940 ; [*0949.0020.0002.2940] # ANTICLOCKWISE CLOSED CIRCLE ARROW
+2941 ; [*094A.0020.0002.2941] # CLOCKWISE CLOSED CIRCLE ARROW
+2942 ; [*094B.0020.0002.2942] # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+2943 ; [*094C.0020.0002.2943] # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+2944 ; [*094D.0020.0002.2944] # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+2945 ; [*094E.0020.0002.2945] # RIGHTWARDS ARROW WITH PLUS BELOW
+2946 ; [*094F.0020.0002.2946] # LEFTWARDS ARROW WITH PLUS BELOW
+2947 ; [*0950.0020.0002.2947] # RIGHTWARDS ARROW THROUGH X
+2948 ; [*0951.0020.0002.2948] # LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+2949 ; [*0952.0020.0002.2949] # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+294A ; [*0953.0020.0002.294A] # LEFT BARB UP RIGHT BARB DOWN HARPOON
+294B ; [*0954.0020.0002.294B] # LEFT BARB DOWN RIGHT BARB UP HARPOON
+294C ; [*0955.0020.0002.294C] # UP BARB RIGHT DOWN BARB LEFT HARPOON
+294D ; [*0956.0020.0002.294D] # UP BARB LEFT DOWN BARB RIGHT HARPOON
+294E ; [*0957.0020.0002.294E] # LEFT BARB UP RIGHT BARB UP HARPOON
+294F ; [*0958.0020.0002.294F] # UP BARB RIGHT DOWN BARB RIGHT HARPOON
+2950 ; [*0959.0020.0002.2950] # LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+2951 ; [*095A.0020.0002.2951] # UP BARB LEFT DOWN BARB LEFT HARPOON
+2952 ; [*095B.0020.0002.2952] # LEFTWARDS HARPOON WITH BARB UP TO BAR
+2953 ; [*095C.0020.0002.2953] # RIGHTWARDS HARPOON WITH BARB UP TO BAR
+2954 ; [*095D.0020.0002.2954] # UPWARDS HARPOON WITH BARB RIGHT TO BAR
+2955 ; [*095E.0020.0002.2955] # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+2956 ; [*095F.0020.0002.2956] # LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+2957 ; [*0960.0020.0002.2957] # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+2958 ; [*0961.0020.0002.2958] # UPWARDS HARPOON WITH BARB LEFT TO BAR
+2959 ; [*0962.0020.0002.2959] # DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+295A ; [*0963.0020.0002.295A] # LEFTWARDS HARPOON WITH BARB UP FROM BAR
+295B ; [*0964.0020.0002.295B] # RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+295C ; [*0965.0020.0002.295C] # UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+295D ; [*0966.0020.0002.295D] # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+295E ; [*0967.0020.0002.295E] # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+295F ; [*0968.0020.0002.295F] # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+2960 ; [*0969.0020.0002.2960] # UPWARDS HARPOON WITH BARB LEFT FROM BAR
+2961 ; [*096A.0020.0002.2961] # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+2962 ; [*096B.0020.0002.2962] # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+2963 ; [*096C.0020.0002.2963] # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2964 ; [*096D.0020.0002.2964] # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2965 ; [*096E.0020.0002.2965] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+2966 ; [*096F.0020.0002.2966] # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+2967 ; [*0970.0020.0002.2967] # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2968 ; [*0971.0020.0002.2968] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+2969 ; [*0972.0020.0002.2969] # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+296A ; [*0973.0020.0002.296A] # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296B ; [*0974.0020.0002.296B] # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296C ; [*0975.0020.0002.296C] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296D ; [*0976.0020.0002.296D] # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296E ; [*0977.0020.0002.296E] # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+296F ; [*0978.0020.0002.296F] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2970 ; [*0979.0020.0002.2970] # RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+2971 ; [*097A.0020.0002.2971] # EQUALS SIGN ABOVE RIGHTWARDS ARROW
+2972 ; [*097B.0020.0002.2972] # TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2973 ; [*097C.0020.0002.2973] # LEFTWARDS ARROW ABOVE TILDE OPERATOR
+2974 ; [*097D.0020.0002.2974] # RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+2975 ; [*097E.0020.0002.2975] # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+2976 ; [*097F.0020.0002.2976] # LESS-THAN ABOVE LEFTWARDS ARROW
+2977 ; [*0980.0020.0002.2977] # LEFTWARDS ARROW THROUGH LESS-THAN
+2978 ; [*0981.0020.0002.2978] # GREATER-THAN ABOVE RIGHTWARDS ARROW
+2979 ; [*0982.0020.0002.2979] # SUBSET ABOVE RIGHTWARDS ARROW
+297A ; [*0983.0020.0002.297A] # LEFTWARDS ARROW THROUGH SUBSET
+297B ; [*0984.0020.0002.297B] # SUPERSET ABOVE LEFTWARDS ARROW
+297C ; [*0985.0020.0002.297C] # LEFT FISH TAIL
+297D ; [*0986.0020.0002.297D] # RIGHT FISH TAIL
+297E ; [*0987.0020.0002.297E] # UP FISH TAIL
+297F ; [*0988.0020.0002.297F] # DOWN FISH TAIL
+2980 ; [*0989.0020.0002.2980] # TRIPLE VERTICAL BAR DELIMITER
+2981 ; [*098A.0020.0002.2981] # Z NOTATION SPOT
+2982 ; [*098B.0020.0002.2982] # Z NOTATION TYPE COLON
+2983 ; [*02C1.0020.0002.2983] # LEFT WHITE CURLY BRACKET
+2984 ; [*02C2.0020.0002.2984] # RIGHT WHITE CURLY BRACKET
+2985 ; [*02C3.0020.0002.2985] # LEFT WHITE PARENTHESIS
+2986 ; [*02C4.0020.0002.2986] # RIGHT WHITE PARENTHESIS
+2987 ; [*02C5.0020.0002.2987] # Z NOTATION LEFT IMAGE BRACKET
+2988 ; [*02C6.0020.0002.2988] # Z NOTATION RIGHT IMAGE BRACKET
+2989 ; [*02C7.0020.0002.2989] # Z NOTATION LEFT BINDING BRACKET
+298A ; [*02C8.0020.0002.298A] # Z NOTATION RIGHT BINDING BRACKET
+298B ; [*02C9.0020.0002.298B] # LEFT SQUARE BRACKET WITH UNDERBAR
+298C ; [*02CA.0020.0002.298C] # RIGHT SQUARE BRACKET WITH UNDERBAR
+298D ; [*02CB.0020.0002.298D] # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E ; [*02CC.0020.0002.298E] # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F ; [*02CD.0020.0002.298F] # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 ; [*02CE.0020.0002.2990] # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 ; [*02CF.0020.0002.2991] # LEFT ANGLE BRACKET WITH DOT
+2992 ; [*02D0.0020.0002.2992] # RIGHT ANGLE BRACKET WITH DOT
+2993 ; [*02D1.0020.0002.2993] # LEFT ARC LESS-THAN BRACKET
+2994 ; [*02D2.0020.0002.2994] # RIGHT ARC GREATER-THAN BRACKET
+2995 ; [*02D3.0020.0002.2995] # DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 ; [*02D4.0020.0002.2996] # DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 ; [*02D5.0020.0002.2997] # LEFT BLACK TORTOISE SHELL BRACKET
+2998 ; [*02D6.0020.0002.2998] # RIGHT BLACK TORTOISE SHELL BRACKET
+2999 ; [*098C.0020.0002.2999] # DOTTED FENCE
+299A ; [*098D.0020.0002.299A] # VERTICAL ZIGZAG LINE
+299B ; [*098E.0020.0002.299B] # MEASURED ANGLE OPENING LEFT
+299C ; [*098F.0020.0002.299C] # RIGHT ANGLE VARIANT WITH SQUARE
+299D ; [*0990.0020.0002.299D] # MEASURED RIGHT ANGLE WITH DOT
+299E ; [*0991.0020.0002.299E] # ANGLE WITH S INSIDE
+299F ; [*0992.0020.0002.299F] # ACUTE ANGLE
+29A0 ; [*0993.0020.0002.29A0] # SPHERICAL ANGLE OPENING LEFT
+29A1 ; [*0994.0020.0002.29A1] # SPHERICAL ANGLE OPENING UP
+29A2 ; [*0995.0020.0002.29A2] # TURNED ANGLE
+29A3 ; [*0996.0020.0002.29A3] # REVERSED ANGLE
+29A4 ; [*0997.0020.0002.29A4] # ANGLE WITH UNDERBAR
+29A5 ; [*0998.0020.0002.29A5] # REVERSED ANGLE WITH UNDERBAR
+29A6 ; [*0999.0020.0002.29A6] # OBLIQUE ANGLE OPENING UP
+29A7 ; [*099A.0020.0002.29A7] # OBLIQUE ANGLE OPENING DOWN
+29A8 ; [*099B.0020.0002.29A8] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+29A9 ; [*099C.0020.0002.29A9] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+29AA ; [*099D.0020.0002.29AA] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+29AB ; [*099E.0020.0002.29AB] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+29AC ; [*099F.0020.0002.29AC] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+29AD ; [*09A0.0020.0002.29AD] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+29AE ; [*09A1.0020.0002.29AE] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+29AF ; [*09A2.0020.0002.29AF] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+29B0 ; [*09A3.0020.0002.29B0] # REVERSED EMPTY SET
+29B1 ; [*09A4.0020.0002.29B1] # EMPTY SET WITH OVERBAR
+29B2 ; [*09A5.0020.0002.29B2] # EMPTY SET WITH SMALL CIRCLE ABOVE
+29B3 ; [*09A6.0020.0002.29B3] # EMPTY SET WITH RIGHT ARROW ABOVE
+29B4 ; [*09A7.0020.0002.29B4] # EMPTY SET WITH LEFT ARROW ABOVE
+29B5 ; [*09A8.0020.0002.29B5] # CIRCLE WITH HORIZONTAL BAR
+29B6 ; [*09A9.0020.0002.29B6] # CIRCLED VERTICAL BAR
+29B7 ; [*09AA.0020.0002.29B7] # CIRCLED PARALLEL
+29B8 ; [*09AB.0020.0002.29B8] # CIRCLED REVERSE SOLIDUS
+29B9 ; [*09AC.0020.0002.29B9] # CIRCLED PERPENDICULAR
+29BA ; [*09AD.0020.0002.29BA] # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
+29BB ; [*09AE.0020.0002.29BB] # CIRCLE WITH SUPERIMPOSED X
+29BC ; [*09AF.0020.0002.29BC] # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+29BD ; [*09B0.0020.0002.29BD] # UP ARROW THROUGH CIRCLE
+29BE ; [*09B1.0020.0002.29BE] # CIRCLED WHITE BULLET
+29BF ; [*09B2.0020.0002.29BF] # CIRCLED BULLET
+29C0 ; [*09B3.0020.0002.29C0] # CIRCLED LESS-THAN
+29C1 ; [*09B4.0020.0002.29C1] # CIRCLED GREATER-THAN
+29C2 ; [*09B5.0020.0002.29C2] # CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+29C3 ; [*09B6.0020.0002.29C3] # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+29C4 ; [*09B7.0020.0002.29C4] # SQUARED RISING DIAGONAL SLASH
+29C5 ; [*09B8.0020.0002.29C5] # SQUARED FALLING DIAGONAL SLASH
+29C6 ; [*09B9.0020.0002.29C6] # SQUARED ASTERISK
+29C7 ; [*09BA.0020.0002.29C7] # SQUARED SMALL CIRCLE
+29C8 ; [*09BB.0020.0002.29C8] # SQUARED SQUARE
+29C9 ; [*09BC.0020.0002.29C9] # TWO JOINED SQUARES
+29CA ; [*09BD.0020.0002.29CA] # TRIANGLE WITH DOT ABOVE
+29CB ; [*09BE.0020.0002.29CB] # TRIANGLE WITH UNDERBAR
+29CC ; [*09BF.0020.0002.29CC] # S IN TRIANGLE
+29CD ; [*09C0.0020.0002.29CD] # TRIANGLE WITH SERIFS AT BOTTOM
+29CE ; [*09C1.0020.0002.29CE] # RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+29CF ; [*09C2.0020.0002.29CF] # LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0 ; [*09C3.0020.0002.29D0] # VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1 ; [*09C4.0020.0002.29D1] # BOWTIE WITH LEFT HALF BLACK
+29D2 ; [*09C5.0020.0002.29D2] # BOWTIE WITH RIGHT HALF BLACK
+29D3 ; [*09C6.0020.0002.29D3] # BLACK BOWTIE
+29D4 ; [*09C7.0020.0002.29D4] # TIMES WITH LEFT HALF BLACK
+29D5 ; [*09C8.0020.0002.29D5] # TIMES WITH RIGHT HALF BLACK
+29D6 ; [*09C9.0020.0002.29D6] # WHITE HOURGLASS
+29D7 ; [*09CA.0020.0002.29D7] # BLACK HOURGLASS
+29D8 ; [*09CB.0020.0002.29D8] # LEFT WIGGLY FENCE
+29D9 ; [*09CC.0020.0002.29D9] # RIGHT WIGGLY FENCE
+29DA ; [*09CD.0020.0002.29DA] # LEFT DOUBLE WIGGLY FENCE
+29DB ; [*09CE.0020.0002.29DB] # RIGHT DOUBLE WIGGLY FENCE
+29DC ; [*09CF.0020.0002.29DC] # INCOMPLETE INFINITY
+29DD ; [*09D0.0020.0002.29DD] # TIE OVER INFINITY
+29DE ; [*09D1.0020.0002.29DE] # INFINITY NEGATED WITH VERTICAL BAR
+29DF ; [*09D2.0020.0002.29DF] # DOUBLE-ENDED MULTIMAP
+29E0 ; [*09D3.0020.0002.29E0] # SQUARE WITH CONTOURED OUTLINE
+29E1 ; [*09D4.0020.0002.29E1] # INCREASES AS
+29E2 ; [*09D5.0020.0002.29E2] # SHUFFLE PRODUCT
+29E3 ; [*09D6.0020.0002.29E3] # EQUALS SIGN AND SLANTED PARALLEL
+29E4 ; [*09D7.0020.0002.29E4] # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+29E5 ; [*09D8.0020.0002.29E5] # IDENTICAL TO AND SLANTED PARALLEL
+29E6 ; [*09D9.0020.0002.29E6] # GLEICH STARK
+29E7 ; [*09DA.0020.0002.29E7] # THERMODYNAMIC
+29E8 ; [*09DB.0020.0002.29E8] # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+29E9 ; [*09DC.0020.0002.29E9] # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+29EA ; [*09DD.0020.0002.29EA] # BLACK DIAMOND WITH DOWN ARROW
+29EB ; [*09DE.0020.0002.29EB] # BLACK LOZENGE
+29EC ; [*09DF.0020.0002.29EC] # WHITE CIRCLE WITH DOWN ARROW
+29ED ; [*09E0.0020.0002.29ED] # BLACK CIRCLE WITH DOWN ARROW
+29EE ; [*09E1.0020.0002.29EE] # ERROR-BARRED WHITE SQUARE
+29EF ; [*09E2.0020.0002.29EF] # ERROR-BARRED BLACK SQUARE
+29F0 ; [*09E3.0020.0002.29F0] # ERROR-BARRED WHITE DIAMOND
+29F1 ; [*09E4.0020.0002.29F1] # ERROR-BARRED BLACK DIAMOND
+29F2 ; [*09E5.0020.0002.29F2] # ERROR-BARRED WHITE CIRCLE
+29F3 ; [*09E6.0020.0002.29F3] # ERROR-BARRED BLACK CIRCLE
+29F4 ; [*09E7.0020.0002.29F4] # RULE-DELAYED
+29F5 ; [*09E8.0020.0002.29F5] # REVERSE SOLIDUS OPERATOR
+29F6 ; [*09E9.0020.0002.29F6] # SOLIDUS WITH OVERBAR
+29F7 ; [*09EA.0020.0002.29F7] # REVERSE SOLIDUS WITH HORIZONTAL STROKE
+29F8 ; [*09EB.0020.0002.29F8] # BIG SOLIDUS
+29F9 ; [*09EC.0020.0002.29F9] # BIG REVERSE SOLIDUS
+29FA ; [*09ED.0020.0002.29FA] # DOUBLE PLUS
+29FB ; [*09EE.0020.0002.29FB] # TRIPLE PLUS
+29FC ; [*02BF.0020.0002.29FC] # LEFT-POINTING CURVED ANGLE BRACKET
+29FD ; [*02C0.0020.0002.29FD] # RIGHT-POINTING CURVED ANGLE BRACKET
+29FE ; [*09EF.0020.0002.29FE] # TINY
+29FF ; [*09F0.0020.0002.29FF] # MINY
+2A00 ; [*09F1.0020.0002.2A00] # N-ARY CIRCLED DOT OPERATOR
+2A01 ; [*09F2.0020.0002.2A01] # N-ARY CIRCLED PLUS OPERATOR
+2A02 ; [*09F3.0020.0002.2A02] # N-ARY CIRCLED TIMES OPERATOR
+2A03 ; [*09F4.0020.0002.2A03] # N-ARY UNION OPERATOR WITH DOT
+2A04 ; [*09F5.0020.0002.2A04] # N-ARY UNION OPERATOR WITH PLUS
+2A05 ; [*09F6.0020.0002.2A05] # N-ARY SQUARE INTERSECTION OPERATOR
+2A06 ; [*09F7.0020.0002.2A06] # N-ARY SQUARE UNION OPERATOR
+2A07 ; [*09F8.0020.0002.2A07] # TWO LOGICAL AND OPERATOR
+2A08 ; [*09F9.0020.0002.2A08] # TWO LOGICAL OR OPERATOR
+2A09 ; [*09FA.0020.0002.2A09] # N-ARY TIMES OPERATOR
+2A0A ; [*09FB.0020.0002.2A0A] # MODULO TWO SUM
+2A0B ; [*09FC.0020.0002.2A0B] # SUMMATION WITH INTEGRAL
+2A0C ; [*04DB.0020.0004.2A0C][*04DB.0020.0004.2A0C][*04DB.0020.001F.2A0C][*04DB.0020.001F.2A0C] # QUADRUPLE INTEGRAL OPERATOR; QQKN
+2A0D ; [*09FD.0020.0002.2A0D] # FINITE PART INTEGRAL
+2A0E ; [*09FE.0020.0002.2A0E] # INTEGRAL WITH DOUBLE STROKE
+2A0F ; [*09FF.0020.0002.2A0F] # INTEGRAL AVERAGE WITH SLASH
+2A10 ; [*0A00.0020.0002.2A10] # CIRCULATION FUNCTION
+2A11 ; [*0A01.0020.0002.2A11] # ANTICLOCKWISE INTEGRATION
+2A12 ; [*0A02.0020.0002.2A12] # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+2A13 ; [*0A03.0020.0002.2A13] # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+2A14 ; [*0A04.0020.0002.2A14] # LINE INTEGRATION NOT INCLUDING THE POLE
+2A15 ; [*0A05.0020.0002.2A15] # INTEGRAL AROUND A POINT OPERATOR
+2A16 ; [*0A06.0020.0002.2A16] # QUATERNION INTEGRAL OPERATOR
+2A17 ; [*0A07.0020.0002.2A17] # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+2A18 ; [*0A08.0020.0002.2A18] # INTEGRAL WITH TIMES SIGN
+2A19 ; [*0A09.0020.0002.2A19] # INTEGRAL WITH INTERSECTION
+2A1A ; [*0A0A.0020.0002.2A1A] # INTEGRAL WITH UNION
+2A1B ; [*0A0B.0020.0002.2A1B] # INTEGRAL WITH OVERBAR
+2A1C ; [*0A0C.0020.0002.2A1C] # INTEGRAL WITH UNDERBAR
+2A1D ; [*0A0D.0020.0002.2A1D] # JOIN
+2A1E ; [*0A0E.0020.0002.2A1E] # LARGE LEFT TRIANGLE OPERATOR
+2A1F ; [*0A0F.0020.0002.2A1F] # Z NOTATION SCHEMA COMPOSITION
+2A20 ; [*0A10.0020.0002.2A20] # Z NOTATION SCHEMA PIPING
+2A21 ; [*0A11.0020.0002.2A21] # Z NOTATION SCHEMA PROJECTION
+2A22 ; [*0A12.0020.0002.2A22] # PLUS SIGN WITH SMALL CIRCLE ABOVE
+2A23 ; [*0A13.0020.0002.2A23] # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+2A24 ; [*0A14.0020.0002.2A24] # PLUS SIGN WITH TILDE ABOVE
+2A25 ; [*0A15.0020.0002.2A25] # PLUS SIGN WITH DOT BELOW
+2A26 ; [*0A16.0020.0002.2A26] # PLUS SIGN WITH TILDE BELOW
+2A27 ; [*0A17.0020.0002.2A27] # PLUS SIGN WITH SUBSCRIPT TWO
+2A28 ; [*0A18.0020.0002.2A28] # PLUS SIGN WITH BLACK TRIANGLE
+2A29 ; [*0A19.0020.0002.2A29] # MINUS SIGN WITH COMMA ABOVE
+2A2A ; [*0A1A.0020.0002.2A2A] # MINUS SIGN WITH DOT BELOW
+2A2B ; [*0A1B.0020.0002.2A2B] # MINUS SIGN WITH FALLING DOTS
+2A2C ; [*0A1C.0020.0002.2A2C] # MINUS SIGN WITH RISING DOTS
+2A2D ; [*0A1D.0020.0002.2A2D] # PLUS SIGN IN LEFT HALF CIRCLE
+2A2E ; [*0A1E.0020.0002.2A2E] # PLUS SIGN IN RIGHT HALF CIRCLE
+2A2F ; [*0A1F.0020.0002.2A2F] # VECTOR OR CROSS PRODUCT
+2A30 ; [*0A20.0020.0002.2A30] # MULTIPLICATION SIGN WITH DOT ABOVE
+2A31 ; [*0A21.0020.0002.2A31] # MULTIPLICATION SIGN WITH UNDERBAR
+2A32 ; [*0A22.0020.0002.2A32] # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+2A33 ; [*0A23.0020.0002.2A33] # SMASH PRODUCT
+2A34 ; [*0A24.0020.0002.2A34] # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35 ; [*0A25.0020.0002.2A35] # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A36 ; [*0A26.0020.0002.2A36] # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+2A37 ; [*0A27.0020.0002.2A37] # MULTIPLICATION SIGN IN DOUBLE CIRCLE
+2A38 ; [*0A28.0020.0002.2A38] # CIRCLED DIVISION SIGN
+2A39 ; [*0A29.0020.0002.2A39] # PLUS SIGN IN TRIANGLE
+2A3A ; [*0A2A.0020.0002.2A3A] # MINUS SIGN IN TRIANGLE
+2A3B ; [*0A2B.0020.0002.2A3B] # MULTIPLICATION SIGN IN TRIANGLE
+2A3C ; [*0A2C.0020.0002.2A3C] # INTERIOR PRODUCT
+2A3D ; [*0A2D.0020.0002.2A3D] # RIGHTHAND INTERIOR PRODUCT
+2A3E ; [*0A2E.0020.0002.2A3E] # Z NOTATION RELATIONAL COMPOSITION
+2A3F ; [*0A2F.0020.0002.2A3F] # AMALGAMATION OR COPRODUCT
+2A40 ; [*0A30.0020.0002.2A40] # INTERSECTION WITH DOT
+2A41 ; [*0A31.0020.0002.2A41] # UNION WITH MINUS SIGN
+2A42 ; [*0A32.0020.0002.2A42] # UNION WITH OVERBAR
+2A43 ; [*0A33.0020.0002.2A43] # INTERSECTION WITH OVERBAR
+2A44 ; [*0A34.0020.0002.2A44] # INTERSECTION WITH LOGICAL AND
+2A45 ; [*0A35.0020.0002.2A45] # UNION WITH LOGICAL OR
+2A46 ; [*0A36.0020.0002.2A46] # UNION ABOVE INTERSECTION
+2A47 ; [*0A37.0020.0002.2A47] # INTERSECTION ABOVE UNION
+2A48 ; [*0A38.0020.0002.2A48] # UNION ABOVE BAR ABOVE INTERSECTION
+2A49 ; [*0A39.0020.0002.2A49] # INTERSECTION ABOVE BAR ABOVE UNION
+2A4A ; [*0A3A.0020.0002.2A4A] # UNION BESIDE AND JOINED WITH UNION
+2A4B ; [*0A3B.0020.0002.2A4B] # INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+2A4C ; [*0A3C.0020.0002.2A4C] # CLOSED UNION WITH SERIFS
+2A4D ; [*0A3D.0020.0002.2A4D] # CLOSED INTERSECTION WITH SERIFS
+2A4E ; [*0A3E.0020.0002.2A4E] # DOUBLE SQUARE INTERSECTION
+2A4F ; [*0A3F.0020.0002.2A4F] # DOUBLE SQUARE UNION
+2A50 ; [*0A40.0020.0002.2A50] # CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+2A51 ; [*0A41.0020.0002.2A51] # LOGICAL AND WITH DOT ABOVE
+2A52 ; [*0A42.0020.0002.2A52] # LOGICAL OR WITH DOT ABOVE
+2A53 ; [*0A43.0020.0002.2A53] # DOUBLE LOGICAL AND
+2A54 ; [*0A44.0020.0002.2A54] # DOUBLE LOGICAL OR
+2A55 ; [*0A45.0020.0002.2A55] # TWO INTERSECTING LOGICAL AND
+2A56 ; [*0A46.0020.0002.2A56] # TWO INTERSECTING LOGICAL OR
+2A57 ; [*0A47.0020.0002.2A57] # SLOPING LARGE OR
+2A58 ; [*0A48.0020.0002.2A58] # SLOPING LARGE AND
+2A59 ; [*0A49.0020.0002.2A59] # LOGICAL OR OVERLAPPING LOGICAL AND
+2A5A ; [*0A4A.0020.0002.2A5A] # LOGICAL AND WITH MIDDLE STEM
+2A5B ; [*0A4B.0020.0002.2A5B] # LOGICAL OR WITH MIDDLE STEM
+2A5C ; [*0A4C.0020.0002.2A5C] # LOGICAL AND WITH HORIZONTAL DASH
+2A5D ; [*0A4D.0020.0002.2A5D] # LOGICAL OR WITH HORIZONTAL DASH
+2A5E ; [*0A4E.0020.0002.2A5E] # LOGICAL AND WITH DOUBLE OVERBAR
+2A5F ; [*0A4F.0020.0002.2A5F] # LOGICAL AND WITH UNDERBAR
+2A60 ; [*0A50.0020.0002.2A60] # LOGICAL AND WITH DOUBLE UNDERBAR
+2A61 ; [*0A51.0020.0002.2A61] # SMALL VEE WITH UNDERBAR
+2A62 ; [*0A52.0020.0002.2A62] # LOGICAL OR WITH DOUBLE OVERBAR
+2A63 ; [*0A53.0020.0002.2A63] # LOGICAL OR WITH DOUBLE UNDERBAR
+2A64 ; [*0A54.0020.0002.2A64] # Z NOTATION DOMAIN ANTIRESTRICTION
+2A65 ; [*0A55.0020.0002.2A65] # Z NOTATION RANGE ANTIRESTRICTION
+2A66 ; [*0A56.0020.0002.2A66] # EQUALS SIGN WITH DOT BELOW
+2A67 ; [*0A57.0020.0002.2A67] # IDENTICAL WITH DOT ABOVE
+2A68 ; [*0A58.0020.0002.2A68] # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
+2A69 ; [*0A59.0020.0002.2A69] # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
+2A6A ; [*0A5A.0020.0002.2A6A] # TILDE OPERATOR WITH DOT ABOVE
+2A6B ; [*0A5B.0020.0002.2A6B] # TILDE OPERATOR WITH RISING DOTS
+2A6C ; [*0A5C.0020.0002.2A6C] # SIMILAR MINUS SIMILAR
+2A6D ; [*0A5D.0020.0002.2A6D] # CONGRUENT WITH DOT ABOVE
+2A6E ; [*0A5E.0020.0002.2A6E] # EQUALS WITH ASTERISK
+2A6F ; [*0A5F.0020.0002.2A6F] # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+2A70 ; [*0A60.0020.0002.2A70] # APPROXIMATELY EQUAL OR EQUAL TO
+2A71 ; [*0A61.0020.0002.2A71] # EQUALS SIGN ABOVE PLUS SIGN
+2A72 ; [*0A62.0020.0002.2A72] # PLUS SIGN ABOVE EQUALS SIGN
+2A73 ; [*0A63.0020.0002.2A73] # EQUALS SIGN ABOVE TILDE OPERATOR
+2A74 ; [*0241.0020.0004.2A74][*0241.0020.0004.2A74][*04BD.0020.001F.2A74] # DOUBLE COLON EQUAL; QQKN
+2A75 ; [*04BD.0020.0004.2A75][*04BD.0020.0004.2A75] # TWO CONSECUTIVE EQUALS SIGNS; QQKN
+2A76 ; [*04BD.0020.0004.2A76][*04BD.0020.0004.2A76][*04BD.0020.001F.2A76] # THREE CONSECUTIVE EQUALS SIGNS; QQKN
+2A77 ; [*0A64.0020.0002.2A77] # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+2A78 ; [*0A65.0020.0002.2A78] # EQUIVALENT WITH FOUR DOTS ABOVE
+2A79 ; [*0A66.0020.0002.2A79] # LESS-THAN WITH CIRCLE INSIDE
+2A7A ; [*0A67.0020.0002.2A7A] # GREATER-THAN WITH CIRCLE INSIDE
+2A7B ; [*0A68.0020.0002.2A7B] # LESS-THAN WITH QUESTION MARK ABOVE
+2A7C ; [*0A69.0020.0002.2A7C] # GREATER-THAN WITH QUESTION MARK ABOVE
+2A7D ; [*0A6A.0020.0002.2A7D] # LESS-THAN OR SLANTED EQUAL TO
+2A7E ; [*0A6B.0020.0002.2A7E] # GREATER-THAN OR SLANTED EQUAL TO
+2A7F ; [*0A6C.0020.0002.2A7F] # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80 ; [*0A6D.0020.0002.2A80] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81 ; [*0A6E.0020.0002.2A81] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82 ; [*0A6F.0020.0002.2A82] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83 ; [*0A70.0020.0002.2A83] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84 ; [*0A71.0020.0002.2A84] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A85 ; [*0A72.0020.0002.2A85] # LESS-THAN OR APPROXIMATE
+2A86 ; [*0A73.0020.0002.2A86] # GREATER-THAN OR APPROXIMATE
+2A87 ; [*0A74.0020.0002.2A87] # LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+2A88 ; [*0A75.0020.0002.2A88] # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+2A89 ; [*0A76.0020.0002.2A89] # LESS-THAN AND NOT APPROXIMATE
+2A8A ; [*0A77.0020.0002.2A8A] # GREATER-THAN AND NOT APPROXIMATE
+2A8B ; [*0A78.0020.0002.2A8B] # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C ; [*0A79.0020.0002.2A8C] # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A8D ; [*0A7A.0020.0002.2A8D] # LESS-THAN ABOVE SIMILAR OR EQUAL
+2A8E ; [*0A7B.0020.0002.2A8E] # GREATER-THAN ABOVE SIMILAR OR EQUAL
+2A8F ; [*0A7C.0020.0002.2A8F] # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+2A90 ; [*0A7D.0020.0002.2A90] # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+2A91 ; [*0A7E.0020.0002.2A91] # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92 ; [*0A7F.0020.0002.2A92] # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93 ; [*0A80.0020.0002.2A93] # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94 ; [*0A81.0020.0002.2A94] # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95 ; [*0A82.0020.0002.2A95] # SLANTED EQUAL TO OR LESS-THAN
+2A96 ; [*0A83.0020.0002.2A96] # SLANTED EQUAL TO OR GREATER-THAN
+2A97 ; [*0A84.0020.0002.2A97] # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98 ; [*0A85.0020.0002.2A98] # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99 ; [*0A86.0020.0002.2A99] # DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A ; [*0A87.0020.0002.2A9A] # DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B ; [*0A88.0020.0002.2A9B] # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C ; [*0A89.0020.0002.2A9C] # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2A9D ; [*0A8A.0020.0002.2A9D] # SIMILAR OR LESS-THAN
+2A9E ; [*0A8B.0020.0002.2A9E] # SIMILAR OR GREATER-THAN
+2A9F ; [*0A8C.0020.0002.2A9F] # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+2AA0 ; [*0A8D.0020.0002.2AA0] # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+2AA1 ; [*0A8E.0020.0002.2AA1] # DOUBLE NESTED LESS-THAN
+2AA2 ; [*0A8F.0020.0002.2AA2] # DOUBLE NESTED GREATER-THAN
+2AA3 ; [*0A90.0020.0002.2AA3] # DOUBLE NESTED LESS-THAN WITH UNDERBAR
+2AA4 ; [*0A91.0020.0002.2AA4] # GREATER-THAN OVERLAPPING LESS-THAN
+2AA5 ; [*0A92.0020.0002.2AA5] # GREATER-THAN BESIDE LESS-THAN
+2AA6 ; [*0A93.0020.0002.2AA6] # LESS-THAN CLOSED BY CURVE
+2AA7 ; [*0A94.0020.0002.2AA7] # GREATER-THAN CLOSED BY CURVE
+2AA8 ; [*0A95.0020.0002.2AA8] # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9 ; [*0A96.0020.0002.2AA9] # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA ; [*0A97.0020.0002.2AAA] # SMALLER THAN
+2AAB ; [*0A98.0020.0002.2AAB] # LARGER THAN
+2AAC ; [*0A99.0020.0002.2AAC] # SMALLER THAN OR EQUAL TO
+2AAD ; [*0A9A.0020.0002.2AAD] # LARGER THAN OR EQUAL TO
+2AAE ; [*0A9B.0020.0002.2AAE] # EQUALS SIGN WITH BUMPY ABOVE
+2AAF ; [*0A9C.0020.0002.2AAF] # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0 ; [*0A9D.0020.0002.2AB0] # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB1 ; [*0A9E.0020.0002.2AB1] # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+2AB2 ; [*0A9F.0020.0002.2AB2] # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+2AB3 ; [*0AA0.0020.0002.2AB3] # PRECEDES ABOVE EQUALS SIGN
+2AB4 ; [*0AA1.0020.0002.2AB4] # SUCCEEDS ABOVE EQUALS SIGN
+2AB5 ; [*0AA2.0020.0002.2AB5] # PRECEDES ABOVE NOT EQUAL TO
+2AB6 ; [*0AA3.0020.0002.2AB6] # SUCCEEDS ABOVE NOT EQUAL TO
+2AB7 ; [*0AA4.0020.0002.2AB7] # PRECEDES ABOVE ALMOST EQUAL TO
+2AB8 ; [*0AA5.0020.0002.2AB8] # SUCCEEDS ABOVE ALMOST EQUAL TO
+2AB9 ; [*0AA6.0020.0002.2AB9] # PRECEDES ABOVE NOT ALMOST EQUAL TO
+2ABA ; [*0AA7.0020.0002.2ABA] # SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+2ABB ; [*0AA8.0020.0002.2ABB] # DOUBLE PRECEDES
+2ABC ; [*0AA9.0020.0002.2ABC] # DOUBLE SUCCEEDS
+2ABD ; [*0AAA.0020.0002.2ABD] # SUBSET WITH DOT
+2ABE ; [*0AAB.0020.0002.2ABE] # SUPERSET WITH DOT
+2ABF ; [*0AAC.0020.0002.2ABF] # SUBSET WITH PLUS SIGN BELOW
+2AC0 ; [*0AAD.0020.0002.2AC0] # SUPERSET WITH PLUS SIGN BELOW
+2AC1 ; [*0AAE.0020.0002.2AC1] # SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2 ; [*0AAF.0020.0002.2AC2] # SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3 ; [*0AB0.0020.0002.2AC3] # SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4 ; [*0AB1.0020.0002.2AC4] # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5 ; [*0AB2.0020.0002.2AC5] # SUBSET OF ABOVE EQUALS SIGN
+2AC6 ; [*0AB3.0020.0002.2AC6] # SUPERSET OF ABOVE EQUALS SIGN
+2AC7 ; [*0AB4.0020.0002.2AC7] # SUBSET OF ABOVE TILDE OPERATOR
+2AC8 ; [*0AB5.0020.0002.2AC8] # SUPERSET OF ABOVE TILDE OPERATOR
+2AC9 ; [*0AB6.0020.0002.2AC9] # SUBSET OF ABOVE ALMOST EQUAL TO
+2ACA ; [*0AB7.0020.0002.2ACA] # SUPERSET OF ABOVE ALMOST EQUAL TO
+2ACB ; [*0AB8.0020.0002.2ACB] # SUBSET OF ABOVE NOT EQUAL TO
+2ACC ; [*0AB9.0020.0002.2ACC] # SUPERSET OF ABOVE NOT EQUAL TO
+2ACD ; [*0ABA.0020.0002.2ACD] # SQUARE LEFT OPEN BOX OPERATOR
+2ACE ; [*0ABB.0020.0002.2ACE] # SQUARE RIGHT OPEN BOX OPERATOR
+2ACF ; [*0ABC.0020.0002.2ACF] # CLOSED SUBSET
+2AD0 ; [*0ABD.0020.0002.2AD0] # CLOSED SUPERSET
+2AD1 ; [*0ABE.0020.0002.2AD1] # CLOSED SUBSET OR EQUAL TO
+2AD2 ; [*0ABF.0020.0002.2AD2] # CLOSED SUPERSET OR EQUAL TO
+2AD3 ; [*0AC0.0020.0002.2AD3] # SUBSET ABOVE SUPERSET
+2AD4 ; [*0AC1.0020.0002.2AD4] # SUPERSET ABOVE SUBSET
+2AD5 ; [*0AC2.0020.0002.2AD5] # SUBSET ABOVE SUBSET
+2AD6 ; [*0AC3.0020.0002.2AD6] # SUPERSET ABOVE SUPERSET
+2AD7 ; [*0AC4.0020.0002.2AD7] # SUPERSET BESIDE SUBSET
+2AD8 ; [*0AC5.0020.0002.2AD8] # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+2AD9 ; [*0AC6.0020.0002.2AD9] # ELEMENT OF OPENING DOWNWARDS
+2ADA ; [*0AC7.0020.0002.2ADA] # PITCHFORK WITH TEE TOP
+2ADB ; [*0AC8.0020.0002.2ADB] # TRANSVERSAL INTERSECTION
+2ADC ; [*0AC9.0020.0002.2ADD][.0000.0054.0002.0338] # FORKING; QQCM
+2ADD ; [*0AC9.0020.0002.2ADD] # NONFORKING
+2ADE ; [*0ACA.0020.0002.2ADE] # SHORT LEFT TACK
+2ADF ; [*0ACB.0020.0002.2ADF] # SHORT DOWN TACK
+2AE0 ; [*0ACC.0020.0002.2AE0] # SHORT UP TACK
+2AE1 ; [*0ACD.0020.0002.2AE1] # PERPENDICULAR WITH S
+2AE2 ; [*0ACE.0020.0002.2AE2] # VERTICAL BAR TRIPLE RIGHT TURNSTILE
+2AE3 ; [*0ACF.0020.0002.2AE3] # DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4 ; [*0AD0.0020.0002.2AE4] # VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5 ; [*0AD1.0020.0002.2AE5] # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE6 ; [*0AD2.0020.0002.2AE6] # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+2AE7 ; [*0AD3.0020.0002.2AE7] # SHORT DOWN TACK WITH OVERBAR
+2AE8 ; [*0AD4.0020.0002.2AE8] # SHORT UP TACK WITH UNDERBAR
+2AE9 ; [*0AD5.0020.0002.2AE9] # SHORT UP TACK ABOVE SHORT DOWN TACK
+2AEA ; [*0AD6.0020.0002.2AEA] # DOUBLE DOWN TACK
+2AEB ; [*0AD7.0020.0002.2AEB] # DOUBLE UP TACK
+2AEC ; [*0AD8.0020.0002.2AEC] # DOUBLE STROKE NOT SIGN
+2AED ; [*0AD9.0020.0002.2AED] # REVERSED DOUBLE STROKE NOT SIGN
+2AEE ; [*0ADA.0020.0002.2AEE] # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+2AEF ; [*0ADB.0020.0002.2AEF] # VERTICAL LINE WITH CIRCLE ABOVE
+2AF0 ; [*0ADC.0020.0002.2AF0] # VERTICAL LINE WITH CIRCLE BELOW
+2AF1 ; [*0ADD.0020.0002.2AF1] # DOWN TACK WITH CIRCLE BELOW
+2AF2 ; [*0ADE.0020.0002.2AF2] # PARALLEL WITH HORIZONTAL STROKE
+2AF3 ; [*0ADF.0020.0002.2AF3] # PARALLEL WITH TILDE OPERATOR
+2AF4 ; [*0AE0.0020.0002.2AF4] # TRIPLE VERTICAL BAR BINARY RELATION
+2AF5 ; [*0AE1.0020.0002.2AF5] # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
+2AF6 ; [*0AE2.0020.0002.2AF6] # TRIPLE COLON OPERATOR
+2AF7 ; [*0AE3.0020.0002.2AF7] # TRIPLE NESTED LESS-THAN
+2AF8 ; [*0AE4.0020.0002.2AF8] # TRIPLE NESTED GREATER-THAN
+2AF9 ; [*0AE5.0020.0002.2AF9] # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA ; [*0AE6.0020.0002.2AFA] # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+2AFB ; [*0AE7.0020.0002.2AFB] # TRIPLE SOLIDUS BINARY RELATION
+2AFC ; [*0AE8.0020.0002.2AFC] # LARGE TRIPLE VERTICAL BAR OPERATOR
+2AFD ; [*0AE9.0020.0002.2AFD] # DOUBLE SOLIDUS OPERATOR
+2AFE ; [*0AEA.0020.0002.2AFE] # WHITE VERTICAL BAR
+2AFF ; [*0AEB.0020.0002.2AFF] # N-ARY WHITE VERTICAL BAR
+2B00 ; [*0AEC.0020.0002.2B00] # NORTH EAST WHITE ARROW
+2B01 ; [*0AED.0020.0002.2B01] # NORTH WEST WHITE ARROW
+2B02 ; [*0AEE.0020.0002.2B02] # SOUTH EAST WHITE ARROW
+2B03 ; [*0AEF.0020.0002.2B03] # SOUTH WEST WHITE ARROW
+2B04 ; [*0AF0.0020.0002.2B04] # LEFT RIGHT WHITE ARROW
+2B05 ; [*0AF1.0020.0002.2B05] # LEFTWARDS BLACK ARROW
+2B06 ; [*0AF2.0020.0002.2B06] # UPWARDS BLACK ARROW
+2B07 ; [*0AF3.0020.0002.2B07] # DOWNWARDS BLACK ARROW
+2B08 ; [*0AF4.0020.0002.2B08] # NORTH EAST BLACK ARROW
+2B09 ; [*0AF5.0020.0002.2B09] # NORTH WEST BLACK ARROW
+2B0A ; [*0AF6.0020.0002.2B0A] # SOUTH EAST BLACK ARROW
+2B0B ; [*0AF7.0020.0002.2B0B] # SOUTH WEST BLACK ARROW
+2B0C ; [*0AF8.0020.0002.2B0C] # LEFT RIGHT BLACK ARROW
+2B0D ; [*0AF9.0020.0002.2B0D] # UP DOWN BLACK ARROW
+2B0E ; [*0AFA.0020.0002.2B0E] # RIGHTWARDS ARROW WITH TIP DOWNWARDS
+2B0F ; [*0AFB.0020.0002.2B0F] # RIGHTWARDS ARROW WITH TIP UPWARDS
+2B10 ; [*0AFC.0020.0002.2B10] # LEFTWARDS ARROW WITH TIP DOWNWARDS
+2B11 ; [*0AFD.0020.0002.2B11] # LEFTWARDS ARROW WITH TIP UPWARDS
+2B12 ; [*0AFE.0020.0002.2B12] # SQUARE WITH TOP HALF BLACK
+2B13 ; [*0AFF.0020.0002.2B13] # SQUARE WITH BOTTOM HALF BLACK
+2B14 ; [*0B00.0020.0002.2B14] # SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK
+2B15 ; [*0B01.0020.0002.2B15] # SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK
+2B16 ; [*0B02.0020.0002.2B16] # DIAMOND WITH LEFT HALF BLACK
+2B17 ; [*0B03.0020.0002.2B17] # DIAMOND WITH RIGHT HALF BLACK
+2B18 ; [*0B04.0020.0002.2B18] # DIAMOND WITH TOP HALF BLACK
+2B19 ; [*0B05.0020.0002.2B19] # DIAMOND WITH BOTTOM HALF BLACK
+2B1A ; [*0B06.0020.0002.2B1A] # DOTTED SQUARE
+2B20 ; [*0B07.0020.0002.2B20] # WHITE PENTAGON
+2B21 ; [*0B08.0020.0002.2B21] # WHITE HEXAGON
+2B22 ; [*0B09.0020.0002.2B22] # BLACK HEXAGON
+2B23 ; [*0B0A.0020.0002.2B23] # HORIZONTAL BLACK HEXAGON
+2CE5 ; [*0B0B.0020.0002.2CE5] # COPTIC SYMBOL MI RO
+2CE6 ; [*0B0C.0020.0002.2CE6] # COPTIC SYMBOL PI RO
+2CE7 ; [*0B0D.0020.0002.2CE7] # COPTIC SYMBOL STAUROS
+2CE8 ; [*0B0E.0020.0002.2CE8] # COPTIC SYMBOL TAU RO
+2CE9 ; [*0B0F.0020.0002.2CE9] # COPTIC SYMBOL KHI RO
+2CEA ; [*0B10.0020.0002.2CEA] # COPTIC SYMBOL SHIMA SIMA
+2CF9 ; [*0270.0020.0002.2CF9] # COPTIC OLD NUBIAN FULL STOP
+2CFA ; [*0263.0020.0002.2CFA] # COPTIC OLD NUBIAN DIRECT QUESTION MARK
+2CFB ; [*0264.0020.0002.2CFB] # COPTIC OLD NUBIAN INDIRECT QUESTION MARK
+2CFC ; [*0294.0020.0002.2CFC] # COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD ; [*0F26.0020.0002.2CFD] # COPTIC FRACTION ONE HALF
+2CFE ; [*0271.0020.0002.2CFE] # COPTIC FULL STOP
+2CFF ; [*0295.0020.0002.2CFF] # COPTIC MORPHOLOGICAL DIVIDER
+2E00 ; [*031F.0020.0002.2E00] # RIGHT ANGLE SUBSTITUTION MARKER
+2E01 ; [*0320.0020.0002.2E01] # RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02 ; [*02D7.0020.0002.2E02] # LEFT SUBSTITUTION BRACKET
+2E03 ; [*02D8.0020.0002.2E03] # RIGHT SUBSTITUTION BRACKET
+2E04 ; [*02D9.0020.0002.2E04] # LEFT DOTTED SUBSTITUTION BRACKET
+2E05 ; [*02DA.0020.0002.2E05] # RIGHT DOTTED SUBSTITUTION BRACKET
+2E06 ; [*0321.0020.0002.2E06] # RAISED INTERPOLATION MARKER
+2E07 ; [*0322.0020.0002.2E07] # RAISED DOTTED INTERPOLATION MARKER
+2E08 ; [*0323.0020.0002.2E08] # DOTTED TRANSPOSITION MARKER
+2E09 ; [*02DB.0020.0002.2E09] # LEFT TRANSPOSITION BRACKET
+2E0A ; [*02DC.0020.0002.2E0A] # RIGHT TRANSPOSITION BRACKET
+2E0B ; [*0324.0020.0002.2E0B] # RAISED SQUARE
+2E0C ; [*02DD.0020.0002.2E0C] # LEFT RAISED OMISSION BRACKET
+2E0D ; [*02DE.0020.0002.2E0D] # RIGHT RAISED OMISSION BRACKET
+2E0E ; [*0325.0020.0002.2E0E] # EDITORIAL CORONIS
+2E0F ; [*0326.0020.0002.2E0F] # PARAGRAPHOS
+2E10 ; [*0327.0020.0002.2E10] # FORKED PARAGRAPHOS
+2E11 ; [*0328.0020.0002.2E11] # REVERSED FORKED PARAGRAPHOS
+2E12 ; [*0329.0020.0002.2E12] # HYPODIASTOLE
+2E13 ; [*032A.0020.0002.2E13] # DOTTED OBELOS
+2E14 ; [*032B.0020.0002.2E14] # DOWNWARDS ANCORA
+2E15 ; [*032C.0020.0002.2E15] # UPWARDS ANCORA
+2E16 ; [*032D.0020.0002.2E16] # DOTTED RIGHT-POINTING ANGLE
+2E17 ; [*022D.0020.0002.2E17] # DOUBLE OBLIQUE HYPHEN
+2E1C ; [*02DF.0020.0002.2E1C] # LEFT LOW PARAPHRASE BRACKET
+2E1D ; [*02E0.0020.0002.2E1D] # RIGHT LOW PARAPHRASE BRACKET
+2FF0 ; [*0EEB.0020.0002.2FF0] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1 ; [*0EEC.0020.0002.2FF1] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2 ; [*0EED.0020.0002.2FF2] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3 ; [*0EEE.0020.0002.2FF3] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4 ; [*0EEF.0020.0002.2FF4] # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5 ; [*0EF0.0020.0002.2FF5] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6 ; [*0EF1.0020.0002.2FF6] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7 ; [*0EF2.0020.0002.2FF7] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8 ; [*0EF3.0020.0002.2FF8] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9 ; [*0EF4.0020.0002.2FF9] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA ; [*0EF5.0020.0002.2FFA] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB ; [*0EF6.0020.0002.2FFB] # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000 ; [*0209.0020.0003.3000] # IDEOGRAPHIC SPACE; QQK
+3001 ; [*023B.0020.0002.3001] # IDEOGRAPHIC COMMA
+3002 ; [*0272.0020.0002.3002] # IDEOGRAPHIC FULL STOP
+3003 ; [*0315.0020.0002.3003] # DITTO MARK
+3004 ; [*0F07.0020.0002.3004] # JAPANESE INDUSTRIAL STANDARD SYMBOL
+3008 ; [*02E1.0020.0002.3008] # LEFT ANGLE BRACKET
+3009 ; [*02E2.0020.0002.3009] # RIGHT ANGLE BRACKET
+300A ; [*02E3.0020.0002.300A] # LEFT DOUBLE ANGLE BRACKET
+300B ; [*02E4.0020.0002.300B] # RIGHT DOUBLE ANGLE BRACKET
+300C ; [*02E5.0020.0002.300C] # LEFT CORNER BRACKET
+300D ; [*02E6.0020.0002.300D] # RIGHT CORNER BRACKET
+300E ; [*02E7.0020.0002.300E] # LEFT WHITE CORNER BRACKET
+300F ; [*02E8.0020.0002.300F] # RIGHT WHITE CORNER BRACKET
+3010 ; [*02E9.0020.0002.3010] # LEFT BLACK LENTICULAR BRACKET
+3011 ; [*02EA.0020.0002.3011] # RIGHT BLACK LENTICULAR BRACKET
+3012 ; [*0F08.0020.0002.3012] # POSTAL MARK
+3013 ; [*0F09.0020.0002.3013] # GETA MARK
+3014 ; [*02EB.0020.0002.3014] # LEFT TORTOISE SHELL BRACKET
+3015 ; [*02EC.0020.0002.3015] # RIGHT TORTOISE SHELL BRACKET
+3016 ; [*02ED.0020.0002.3016] # LEFT WHITE LENTICULAR BRACKET
+3017 ; [*02EE.0020.0002.3017] # RIGHT WHITE LENTICULAR BRACKET
+3018 ; [*02EF.0020.0002.3018] # LEFT WHITE TORTOISE SHELL BRACKET
+3019 ; [*02F0.0020.0002.3019] # RIGHT WHITE TORTOISE SHELL BRACKET
+301A ; [*02F1.0020.0002.301A] # LEFT WHITE SQUARE BRACKET
+301B ; [*02F2.0020.0002.301B] # RIGHT WHITE SQUARE BRACKET
+301C ; [*022E.0020.0002.301C] # WAVE DASH
+301D ; [*02AC.0020.0002.301D] # REVERSED DOUBLE PRIME QUOTATION MARK
+301E ; [*02AD.0020.0002.301E] # DOUBLE PRIME QUOTATION MARK
+301F ; [*02AE.0020.0002.301F] # LOW DOUBLE PRIME QUOTATION MARK
+3020 ; [*0F0A.0020.0002.3020] # POSTAL MARK FACE
+3030 ; [*022F.0020.0002.3030] # WAVY DASH
+3036 ; [*0F08.0020.0004.3036] # CIRCLED POSTAL MARK; QQK
+3037 ; [*0F0B.0020.0002.3037] # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+303D ; [*0316.0020.0002.303D] # PART ALTERNATION MARK
+303E ; [*0F0C.0020.0002.303E] # IDEOGRAPHIC VARIATION INDICATOR
+303F ; [*0F0D.0020.0002.303F] # IDEOGRAPHIC HALF FILL SPACE
+309B ; [*021F.0020.0002.309B] # KATAKANA-HIRAGANA VOICED SOUND MARK
+309C ; [*0220.0020.0002.309C] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30A0 ; [*0230.0020.0002.30A0] # KATAKANA-HIRAGANA DOUBLE HYPHEN
+30FB ; [*0231.0020.0002.30FB] # KATAKANA MIDDLE DOT
+3190 ; [*0F0E.0020.0002.3190] # IDEOGRAPHIC ANNOTATION LINKING MARK
+3191 ; [*0F0F.0020.0002.3191] # IDEOGRAPHIC ANNOTATION REVERSE MARK
+31C0 ; [*0EF7.0020.0002.31C0] # CJK STROKE T
+31C1 ; [*0EF8.0020.0002.31C1] # CJK STROKE WG
+31C2 ; [*0EF9.0020.0002.31C2] # CJK STROKE XG
+31C3 ; [*0EFA.0020.0002.31C3] # CJK STROKE BXG
+31C4 ; [*0EFB.0020.0002.31C4] # CJK STROKE SW
+31C5 ; [*0EFC.0020.0002.31C5] # CJK STROKE HZZ
+31C6 ; [*0EFD.0020.0002.31C6] # CJK STROKE HZG
+31C7 ; [*0EFE.0020.0002.31C7] # CJK STROKE HP
+31C8 ; [*0EFF.0020.0002.31C8] # CJK STROKE HZWG
+31C9 ; [*0F00.0020.0002.31C9] # CJK STROKE SZWG
+31CA ; [*0F01.0020.0002.31CA] # CJK STROKE HZT
+31CB ; [*0F02.0020.0002.31CB] # CJK STROKE HZZP
+31CC ; [*0F03.0020.0002.31CC] # CJK STROKE HPWG
+31CD ; [*0F04.0020.0002.31CD] # CJK STROKE HZW
+31CE ; [*0F05.0020.0002.31CE] # CJK STROKE HZZZ
+31CF ; [*0F06.0020.0002.31CF] # CJK STROKE N
+327F ; [*0F10.0020.0002.327F] # KOREAN STANDARD SYMBOL
+4DC0 ; [*0C1F.0020.0002.4DC0] # HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1 ; [*0C20.0020.0002.4DC1] # HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2 ; [*0C21.0020.0002.4DC2] # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3 ; [*0C22.0020.0002.4DC3] # HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4 ; [*0C23.0020.0002.4DC4] # HEXAGRAM FOR WAITING
+4DC5 ; [*0C24.0020.0002.4DC5] # HEXAGRAM FOR CONFLICT
+4DC6 ; [*0C25.0020.0002.4DC6] # HEXAGRAM FOR THE ARMY
+4DC7 ; [*0C26.0020.0002.4DC7] # HEXAGRAM FOR HOLDING TOGETHER
+4DC8 ; [*0C27.0020.0002.4DC8] # HEXAGRAM FOR SMALL TAMING
+4DC9 ; [*0C28.0020.0002.4DC9] # HEXAGRAM FOR TREADING
+4DCA ; [*0C29.0020.0002.4DCA] # HEXAGRAM FOR PEACE
+4DCB ; [*0C2A.0020.0002.4DCB] # HEXAGRAM FOR STANDSTILL
+4DCC ; [*0C2B.0020.0002.4DCC] # HEXAGRAM FOR FELLOWSHIP
+4DCD ; [*0C2C.0020.0002.4DCD] # HEXAGRAM FOR GREAT POSSESSION
+4DCE ; [*0C2D.0020.0002.4DCE] # HEXAGRAM FOR MODESTY
+4DCF ; [*0C2E.0020.0002.4DCF] # HEXAGRAM FOR ENTHUSIASM
+4DD0 ; [*0C2F.0020.0002.4DD0] # HEXAGRAM FOR FOLLOWING
+4DD1 ; [*0C30.0020.0002.4DD1] # HEXAGRAM FOR WORK ON THE DECAYED
+4DD2 ; [*0C31.0020.0002.4DD2] # HEXAGRAM FOR APPROACH
+4DD3 ; [*0C32.0020.0002.4DD3] # HEXAGRAM FOR CONTEMPLATION
+4DD4 ; [*0C33.0020.0002.4DD4] # HEXAGRAM FOR BITING THROUGH
+4DD5 ; [*0C34.0020.0002.4DD5] # HEXAGRAM FOR GRACE
+4DD6 ; [*0C35.0020.0002.4DD6] # HEXAGRAM FOR SPLITTING APART
+4DD7 ; [*0C36.0020.0002.4DD7] # HEXAGRAM FOR RETURN
+4DD8 ; [*0C37.0020.0002.4DD8] # HEXAGRAM FOR INNOCENCE
+4DD9 ; [*0C38.0020.0002.4DD9] # HEXAGRAM FOR GREAT TAMING
+4DDA ; [*0C39.0020.0002.4DDA] # HEXAGRAM FOR MOUTH CORNERS
+4DDB ; [*0C3A.0020.0002.4DDB] # HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC ; [*0C3B.0020.0002.4DDC] # HEXAGRAM FOR THE ABYSMAL WATER
+4DDD ; [*0C3C.0020.0002.4DDD] # HEXAGRAM FOR THE CLINGING FIRE
+4DDE ; [*0C3D.0020.0002.4DDE] # HEXAGRAM FOR INFLUENCE
+4DDF ; [*0C3E.0020.0002.4DDF] # HEXAGRAM FOR DURATION
+4DE0 ; [*0C3F.0020.0002.4DE0] # HEXAGRAM FOR RETREAT
+4DE1 ; [*0C40.0020.0002.4DE1] # HEXAGRAM FOR GREAT POWER
+4DE2 ; [*0C41.0020.0002.4DE2] # HEXAGRAM FOR PROGRESS
+4DE3 ; [*0C42.0020.0002.4DE3] # HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4 ; [*0C43.0020.0002.4DE4] # HEXAGRAM FOR THE FAMILY
+4DE5 ; [*0C44.0020.0002.4DE5] # HEXAGRAM FOR OPPOSITION
+4DE6 ; [*0C45.0020.0002.4DE6] # HEXAGRAM FOR OBSTRUCTION
+4DE7 ; [*0C46.0020.0002.4DE7] # HEXAGRAM FOR DELIVERANCE
+4DE8 ; [*0C47.0020.0002.4DE8] # HEXAGRAM FOR DECREASE
+4DE9 ; [*0C48.0020.0002.4DE9] # HEXAGRAM FOR INCREASE
+4DEA ; [*0C49.0020.0002.4DEA] # HEXAGRAM FOR BREAKTHROUGH
+4DEB ; [*0C4A.0020.0002.4DEB] # HEXAGRAM FOR COMING TO MEET
+4DEC ; [*0C4B.0020.0002.4DEC] # HEXAGRAM FOR GATHERING TOGETHER
+4DED ; [*0C4C.0020.0002.4DED] # HEXAGRAM FOR PUSHING UPWARD
+4DEE ; [*0C4D.0020.0002.4DEE] # HEXAGRAM FOR OPPRESSION
+4DEF ; [*0C4E.0020.0002.4DEF] # HEXAGRAM FOR THE WELL
+4DF0 ; [*0C4F.0020.0002.4DF0] # HEXAGRAM FOR REVOLUTION
+4DF1 ; [*0C50.0020.0002.4DF1] # HEXAGRAM FOR THE CAULDRON
+4DF2 ; [*0C51.0020.0002.4DF2] # HEXAGRAM FOR THE AROUSING THUNDER
+4DF3 ; [*0C52.0020.0002.4DF3] # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4 ; [*0C53.0020.0002.4DF4] # HEXAGRAM FOR DEVELOPMENT
+4DF5 ; [*0C54.0020.0002.4DF5] # HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6 ; [*0C55.0020.0002.4DF6] # HEXAGRAM FOR ABUNDANCE
+4DF7 ; [*0C56.0020.0002.4DF7] # HEXAGRAM FOR THE WANDERER
+4DF8 ; [*0C57.0020.0002.4DF8] # HEXAGRAM FOR THE GENTLE WIND
+4DF9 ; [*0C58.0020.0002.4DF9] # HEXAGRAM FOR THE JOYOUS LAKE
+4DFA ; [*0C59.0020.0002.4DFA] # HEXAGRAM FOR DISPERSION
+4DFB ; [*0C5A.0020.0002.4DFB] # HEXAGRAM FOR LIMITATION
+4DFC ; [*0C5B.0020.0002.4DFC] # HEXAGRAM FOR INNER TRUTH
+4DFD ; [*0C5C.0020.0002.4DFD] # HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE ; [*0C5D.0020.0002.4DFE] # HEXAGRAM FOR AFTER COMPLETION
+4DFF ; [*0C5E.0020.0002.4DFF] # HEXAGRAM FOR BEFORE COMPLETION
+A490 ; [*0CB6.0020.0002.A490] # YI RADICAL QOT
+A491 ; [*0CB7.0020.0002.A491] # YI RADICAL LI
+A492 ; [*0CB8.0020.0002.A492] # YI RADICAL KIT
+A493 ; [*0CB9.0020.0002.A493] # YI RADICAL NYIP
+A494 ; [*0CBA.0020.0002.A494] # YI RADICAL CYP
+A495 ; [*0CBB.0020.0002.A495] # YI RADICAL SSI
+A496 ; [*0CBC.0020.0002.A496] # YI RADICAL GGOP
+A497 ; [*0CBD.0020.0002.A497] # YI RADICAL GEP
+A498 ; [*0CBE.0020.0002.A498] # YI RADICAL MI
+A499 ; [*0CBF.0020.0002.A499] # YI RADICAL HXIT
+A49A ; [*0CC0.0020.0002.A49A] # YI RADICAL LYR
+A49B ; [*0CC1.0020.0002.A49B] # YI RADICAL BBUT
+A49C ; [*0CC2.0020.0002.A49C] # YI RADICAL MOP
+A49D ; [*0CC3.0020.0002.A49D] # YI RADICAL YO
+A49E ; [*0CC4.0020.0002.A49E] # YI RADICAL PUT
+A49F ; [*0CC5.0020.0002.A49F] # YI RADICAL HXUO
+A4A0 ; [*0CC6.0020.0002.A4A0] # YI RADICAL TAT
+A4A1 ; [*0CC7.0020.0002.A4A1] # YI RADICAL GA
+A4A2 ; [*0CC8.0020.0002.A4A2] # YI RADICAL ZUP
+A4A3 ; [*0CC9.0020.0002.A4A3] # YI RADICAL CYT
+A4A4 ; [*0CCA.0020.0002.A4A4] # YI RADICAL DDUR
+A4A5 ; [*0CCB.0020.0002.A4A5] # YI RADICAL BUR
+A4A6 ; [*0CCC.0020.0002.A4A6] # YI RADICAL GGUO
+A4A7 ; [*0CCD.0020.0002.A4A7] # YI RADICAL NYOP
+A4A8 ; [*0CCE.0020.0002.A4A8] # YI RADICAL TU
+A4A9 ; [*0CCF.0020.0002.A4A9] # YI RADICAL OP
+A4AA ; [*0CD0.0020.0002.A4AA] # YI RADICAL JJUT
+A4AB ; [*0CD1.0020.0002.A4AB] # YI RADICAL ZOT
+A4AC ; [*0CD2.0020.0002.A4AC] # YI RADICAL PYT
+A4AD ; [*0CD3.0020.0002.A4AD] # YI RADICAL HMO
+A4AE ; [*0CD4.0020.0002.A4AE] # YI RADICAL YIT
+A4AF ; [*0CD5.0020.0002.A4AF] # YI RADICAL VUR
+A4B0 ; [*0CD6.0020.0002.A4B0] # YI RADICAL SHY
+A4B1 ; [*0CD7.0020.0002.A4B1] # YI RADICAL VEP
+A4B2 ; [*0CD8.0020.0002.A4B2] # YI RADICAL ZA
+A4B3 ; [*0CD9.0020.0002.A4B3] # YI RADICAL JO
+A4B4 ; [*0CDA.0020.0002.A4B4] # YI RADICAL NZUP
+A4B5 ; [*0CDB.0020.0002.A4B5] # YI RADICAL JJY
+A4B6 ; [*0CDC.0020.0002.A4B6] # YI RADICAL GOT
+A4B7 ; [*0CDD.0020.0002.A4B7] # YI RADICAL JJIE
+A4B8 ; [*0CDE.0020.0002.A4B8] # YI RADICAL WO
+A4B9 ; [*0CDF.0020.0002.A4B9] # YI RADICAL DU
+A4BA ; [*0CE0.0020.0002.A4BA] # YI RADICAL SHUR
+A4BB ; [*0CE1.0020.0002.A4BB] # YI RADICAL LIE
+A4BC ; [*0CE2.0020.0002.A4BC] # YI RADICAL CY
+A4BD ; [*0CE3.0020.0002.A4BD] # YI RADICAL CUOP
+A4BE ; [*0CE4.0020.0002.A4BE] # YI RADICAL CIP
+A4BF ; [*0CE5.0020.0002.A4BF] # YI RADICAL HXOP
+A4C0 ; [*0CE6.0020.0002.A4C0] # YI RADICAL SHAT
+A4C1 ; [*0CE7.0020.0002.A4C1] # YI RADICAL ZUR
+A4C2 ; [*0CE8.0020.0002.A4C2] # YI RADICAL SHOP
+A4C3 ; [*0CE9.0020.0002.A4C3] # YI RADICAL CHE
+A4C4 ; [*0CEA.0020.0002.A4C4] # YI RADICAL ZZIET
+A4C5 ; [*0CEB.0020.0002.A4C5] # YI RADICAL NBIE
+A4C6 ; [*0CEC.0020.0002.A4C6] # YI RADICAL KE
+A700 ; [*03A2.0020.0002.A700] # MODIFIER LETTER CHINESE TONE YIN PING
+A701 ; [*03A3.0020.0002.A701] # MODIFIER LETTER CHINESE TONE YANG PING
+A702 ; [*03A4.0020.0002.A702] # MODIFIER LETTER CHINESE TONE YIN SHANG
+A703 ; [*03A5.0020.0002.A703] # MODIFIER LETTER CHINESE TONE YANG SHANG
+A704 ; [*03A6.0020.0002.A704] # MODIFIER LETTER CHINESE TONE YIN QU
+A705 ; [*03A7.0020.0002.A705] # MODIFIER LETTER CHINESE TONE YANG QU
+A706 ; [*03A8.0020.0002.A706] # MODIFIER LETTER CHINESE TONE YIN RU
+A707 ; [*03A9.0020.0002.A707] # MODIFIER LETTER CHINESE TONE YANG RU
+A708 ; [*03AA.0020.0002.A708] # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR
+A709 ; [*03AB.0020.0002.A709] # MODIFIER LETTER HIGH DOTTED TONE BAR
+A70A ; [*03AC.0020.0002.A70A] # MODIFIER LETTER MID DOTTED TONE BAR
+A70B ; [*03AD.0020.0002.A70B] # MODIFIER LETTER LOW DOTTED TONE BAR
+A70C ; [*03AE.0020.0002.A70C] # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR
+A70D ; [*03AF.0020.0002.A70D] # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR
+A70E ; [*03B0.0020.0002.A70E] # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR
+A70F ; [*03B1.0020.0002.A70F] # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR
+A710 ; [*03B2.0020.0002.A710] # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR
+A711 ; [*03B3.0020.0002.A711] # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR
+A712 ; [*03B4.0020.0002.A712] # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR
+A713 ; [*03B5.0020.0002.A713] # MODIFIER LETTER HIGH LEFT-STEM TONE BAR
+A714 ; [*03B6.0020.0002.A714] # MODIFIER LETTER MID LEFT-STEM TONE BAR
+A715 ; [*03B7.0020.0002.A715] # MODIFIER LETTER LOW LEFT-STEM TONE BAR
+A716 ; [*03B8.0020.0002.A716] # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717 ; [*03B9.0020.0002.A717] # MODIFIER LETTER DOT VERTICAL BAR
+A718 ; [*03BA.0020.0002.A718] # MODIFIER LETTER DOT SLASH
+A719 ; [*03BB.0020.0002.A719] # MODIFIER LETTER DOT HORIZONTAL BAR
+A71A ; [*03BC.0020.0002.A71A] # MODIFIER LETTER LOWER RIGHT CORNER ANGLE
+A720 ; [*03BD.0020.0002.A720] # MODIFIER LETTER STRESS AND HIGH TONE
+A721 ; [*03BE.0020.0002.A721] # MODIFIER LETTER STRESS AND LOW TONE
+A828 ; [*03D1.0020.0002.A828] # SYLOTI NAGRI POETRY MARK-1
+A829 ; [*03D2.0020.0002.A829] # SYLOTI NAGRI POETRY MARK-2
+A82A ; [*03D3.0020.0002.A82A] # SYLOTI NAGRI POETRY MARK-3
+A82B ; [*03D4.0020.0002.A82B] # SYLOTI NAGRI POETRY MARK-4
+A874 ; [*035C.0020.0002.A874] # PHAGS-PA SINGLE HEAD MARK
+A875 ; [*035D.0020.0002.A875] # PHAGS-PA DOUBLE HEAD MARK
+A876 ; [*0276.0020.0002.A876] # PHAGS-PA MARK SHAD
+A877 ; [*0277.0020.0002.A877] # PHAGS-PA MARK DOUBLE SHAD
+FB29 ; [*04B8.0020.0005.FB29] # HEBREW LETTER ALTERNATIVE PLUS SIGN; QQK
+FD3E ; [*02F3.0020.0002.FD3E] # ORNATE LEFT PARENTHESIS
+FD3F ; [*02F4.0020.0002.FD3F] # ORNATE RIGHT PARENTHESIS
+FDFD ; [*03C4.0020.0002.FDFD] # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE10 ; [*0232.0020.0016.FE10] # PRESENTATION FORM FOR VERTICAL COMMA; QQK
+FE11 ; [*023B.0020.0016.FE11] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA; QQK
+FE12 ; [*0272.0020.0016.FE12] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP; QQK
+FE13 ; [*0241.0020.0016.FE13] # PRESENTATION FORM FOR VERTICAL COLON; QQK
+FE14 ; [*023E.0020.0016.FE14] # PRESENTATION FORM FOR VERTICAL SEMICOLON; QQK
+FE15 ; [*0257.0020.0016.FE15] # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK; QQK
+FE16 ; [*025C.0020.0016.FE16] # PRESENTATION FORM FOR VERTICAL QUESTION MARK; QQK
+FE17 ; [*02ED.0020.0016.FE17] # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET; QQK
+FE18 ; [*02EE.0020.0016.FE18] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET; QQK
+FE19 ; [*0266.0020.0016.FE19][*0266.0020.0016.FE19][*0266.0020.001F.FE19] # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS; QQKN
+FE21 ; [.0000.0000.0000.FE21] # COMBINING LIGATURE RIGHT HALF
+FE23 ; [.0000.0000.0000.FE23] # COMBINING DOUBLE TILDE RIGHT HALF
+FE30 ; [*0266.0020.0016.FE30][*0266.0020.0016.FE30] # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER; QQKN
+FE31 ; [*022A.0020.0016.FE31] # PRESENTATION FORM FOR VERTICAL EM DASH; QQK
+FE32 ; [*0229.0020.0016.FE32] # PRESENTATION FORM FOR VERTICAL EN DASH; QQK
+FE33 ; [*021C.0020.0016.FE33] # PRESENTATION FORM FOR VERTICAL LOW LINE; QQK
+FE34 ; [*021C.0020.0016.FE34] # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE; QQK
+FE35 ; [*02B1.0020.0016.FE35] # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS; QQK
+FE36 ; [*02B2.0020.0016.FE36] # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS; QQK
+FE37 ; [*02B5.0020.0016.FE37] # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET; QQK
+FE38 ; [*02B6.0020.0016.FE38] # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET; QQK
+FE39 ; [*02EB.0020.0016.FE39] # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET; QQK
+FE3A ; [*02EC.0020.0016.FE3A] # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET; QQK
+FE3B ; [*02E9.0020.0016.FE3B] # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET; QQK
+FE3C ; [*02EA.0020.0016.FE3C] # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET; QQK
+FE3D ; [*02E3.0020.0016.FE3D] # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET; QQK
+FE3E ; [*02E4.0020.0016.FE3E] # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET; QQK
+FE3F ; [*02E1.0020.0016.FE3F] # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET; QQK
+FE40 ; [*02E2.0020.0016.FE40] # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET; QQK
+FE41 ; [*02E5.0020.0016.FE41] # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET; QQK
+FE42 ; [*02E6.0020.0016.FE42] # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET; QQK
+FE43 ; [*02E7.0020.0016.FE43] # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET; QQK
+FE44 ; [*02E8.0020.0016.FE44] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET; QQK
+FE45 ; [*023C.0020.0002.FE45] # SESAME DOT
+FE46 ; [*023D.0020.0002.FE46] # WHITE SESAME DOT
+FE47 ; [*02B3.0020.0016.FE47] # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET; QQK
+FE48 ; [*02B4.0020.0016.FE48] # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET; QQK
+FE49 ; [*0212.0020.0004.FE49] # DASHED OVERLINE; QQK
+FE4A ; [*0212.0020.0004.FE4A] # CENTRELINE OVERLINE; QQK
+FE4B ; [*0212.0020.0004.FE4B] # WAVY OVERLINE; QQK
+FE4C ; [*0212.0020.0004.FE4C] # DOUBLE WAVY OVERLINE; QQK
+FE4D ; [*021C.0020.0004.FE4D] # DASHED LOW LINE; QQK
+FE4E ; [*021C.0020.0004.FE4E] # CENTRELINE LOW LINE; QQK
+FE4F ; [*021C.0020.0004.FE4F] # WAVY LOW LINE; QQK
+FE50 ; [*0232.0020.000F.FE50] # SMALL COMMA; QQK
+FE51 ; [*023B.0020.000F.FE51] # SMALL IDEOGRAPHIC COMMA; QQK
+FE52 ; [*0266.0020.000F.FE52] # SMALL FULL STOP; QQK
+FE54 ; [*023E.0020.000F.FE54] # SMALL SEMICOLON; QQK
+FE55 ; [*0241.0020.000F.FE55] # SMALL COLON; QQK
+FE56 ; [*025C.0020.000F.FE56] # SMALL QUESTION MARK; QQK
+FE57 ; [*0257.0020.000F.FE57] # SMALL EXCLAMATION MARK; QQK
+FE58 ; [*022A.0020.000F.FE58] # SMALL EM DASH; QQK
+FE59 ; [*02B1.0020.000F.FE59] # SMALL LEFT PARENTHESIS; QQK
+FE5A ; [*02B2.0020.000F.FE5A] # SMALL RIGHT PARENTHESIS; QQK
+FE5B ; [*02B5.0020.000F.FE5B] # SMALL LEFT CURLY BRACKET; QQK
+FE5C ; [*02B6.0020.000F.FE5C] # SMALL RIGHT CURLY BRACKET; QQK
+FE5D ; [*02EB.0020.000F.FE5D] # SMALL LEFT TORTOISE SHELL BRACKET; QQK
+FE5E ; [*02EC.0020.000F.FE5E] # SMALL RIGHT TORTOISE SHELL BRACKET; QQK
+FE5F ; [*0305.0020.000F.FE5F] # SMALL NUMBER SIGN; QQK
+FE60 ; [*0302.0020.000F.FE60] # SMALL AMPERSAND; QQK
+FE61 ; [*02FB.0020.000F.FE61] # SMALL ASTERISK; QQK
+FE62 ; [*04B8.0020.000F.FE62] # SMALL PLUS SIGN; QQK
+FE63 ; [*0222.0020.000F.FE63] # SMALL HYPHEN-MINUS; QQK
+FE64 ; [*04BC.0020.000F.FE64] # SMALL LESS-THAN SIGN; QQK
+FE65 ; [*04BE.0020.000F.FE65] # SMALL GREATER-THAN SIGN; QQK
+FE66 ; [*04BD.0020.000F.FE66] # SMALL EQUALS SIGN; QQK
+FE68 ; [*0301.0020.000F.FE68] # SMALL REVERSE SOLIDUS; QQK
+FE6A ; [*0306.0020.000F.FE6A] # SMALL PERCENT SIGN; QQK
+FE6B ; [*02FA.0020.000F.FE6B] # SMALL COMMERCIAL AT; QQK
+FE73 ; [.0000.0000.0000.FE73] # ARABIC TAIL FRAGMENT
+FF01 ; [*0257.0020.0003.FF01] # FULLWIDTH EXCLAMATION MARK; QQK
+FF02 ; [*02A7.0020.0003.FF02] # FULLWIDTH QUOTATION MARK; QQK
+FF03 ; [*0305.0020.0003.FF03] # FULLWIDTH NUMBER SIGN; QQK
+FF05 ; [*0306.0020.0003.FF05] # FULLWIDTH PERCENT SIGN; QQK
+FF06 ; [*0302.0020.0003.FF06] # FULLWIDTH AMPERSAND; QQK
+FF07 ; [*02A0.0020.0003.FF07] # FULLWIDTH APOSTROPHE; QQK
+FF08 ; [*02B1.0020.0003.FF08] # FULLWIDTH LEFT PARENTHESIS; QQK
+FF09 ; [*02B2.0020.0003.FF09] # FULLWIDTH RIGHT PARENTHESIS; QQK
+FF0A ; [*02FB.0020.0003.FF0A] # FULLWIDTH ASTERISK; QQK
+FF0B ; [*04B8.0020.0003.FF0B] # FULLWIDTH PLUS SIGN; QQK
+FF0C ; [*0232.0020.0003.FF0C] # FULLWIDTH COMMA; QQK
+FF0D ; [*0222.0020.0003.FF0D] # FULLWIDTH HYPHEN-MINUS; QQK
+FF0E ; [*0266.0020.0003.FF0E] # FULLWIDTH FULL STOP; QQK
+FF0F ; [*02FF.0020.0003.FF0F] # FULLWIDTH SOLIDUS; QQK
+FF1A ; [*0241.0020.0003.FF1A] # FULLWIDTH COLON; QQK
+FF1B ; [*023E.0020.0003.FF1B] # FULLWIDTH SEMICOLON; QQK
+FF1C ; [*04BC.0020.0003.FF1C] # FULLWIDTH LESS-THAN SIGN; QQK
+FF1D ; [*04BD.0020.0003.FF1D] # FULLWIDTH EQUALS SIGN; QQK
+FF1E ; [*04BE.0020.0003.FF1E] # FULLWIDTH GREATER-THAN SIGN; QQK
+FF1F ; [*025C.0020.0003.FF1F] # FULLWIDTH QUESTION MARK; QQK
+FF20 ; [*02FA.0020.0003.FF20] # FULLWIDTH COMMERCIAL AT; QQK
+FF3B ; [*02B3.0020.0003.FF3B] # FULLWIDTH LEFT SQUARE BRACKET; QQK
+FF3C ; [*0301.0020.0003.FF3C] # FULLWIDTH REVERSE SOLIDUS; QQK
+FF3D ; [*02B4.0020.0003.FF3D] # FULLWIDTH RIGHT SQUARE BRACKET; QQK
+FF3E ; [*0210.0020.0003.FF3E] # FULLWIDTH CIRCUMFLEX ACCENT; QQK
+FF3F ; [*021C.0020.0003.FF3F] # FULLWIDTH LOW LINE; QQK
+FF40 ; [*020D.0020.0003.FF40] # FULLWIDTH GRAVE ACCENT; QQK
+FF5B ; [*02B5.0020.0003.FF5B] # FULLWIDTH LEFT CURLY BRACKET; QQK
+FF5C ; [*04C0.0020.0003.FF5C] # FULLWIDTH VERTICAL LINE; QQK
+FF5D ; [*02B6.0020.0003.FF5D] # FULLWIDTH RIGHT CURLY BRACKET; QQK
+FF5E ; [*04C3.0020.0003.FF5E] # FULLWIDTH TILDE; QQK
+FF5F ; [*02C3.0020.0003.FF5F] # FULLWIDTH LEFT WHITE PARENTHESIS; QQK
+FF60 ; [*02C4.0020.0003.FF60] # FULLWIDTH RIGHT WHITE PARENTHESIS; QQK
+FF61 ; [*0272.0020.0012.FF61] # HALFWIDTH IDEOGRAPHIC FULL STOP; QQK
+FF62 ; [*02E5.0020.0012.FF62] # HALFWIDTH LEFT CORNER BRACKET; QQK
+FF63 ; [*02E6.0020.0012.FF63] # HALFWIDTH RIGHT CORNER BRACKET; QQK
+FF64 ; [*023B.0020.0012.FF64] # HALFWIDTH IDEOGRAPHIC COMMA; QQK
+FF65 ; [*0231.0020.0012.FF65] # HALFWIDTH KATAKANA MIDDLE DOT; QQK
+FFE2 ; [*04BF.0020.0003.FFE2] # FULLWIDTH NOT SIGN; QQK
+FFE3 ; [*0211.0020.0003.FFE3] # FULLWIDTH MACRON; QQK
+FFE4 ; [*04C1.0020.0003.FFE4] # FULLWIDTH BROKEN BAR; QQK
+FFE8 ; [*06A5.0020.0012.FFE8] # HALFWIDTH FORMS LIGHT VERTICAL; QQK
+FFE9 ; [*043E.0020.0012.FFE9] # HALFWIDTH LEFTWARDS ARROW; QQK
+FFEA ; [*0440.0020.0012.FFEA] # HALFWIDTH UPWARDS ARROW; QQK
+FFEB ; [*043F.0020.0012.FFEB] # HALFWIDTH RIGHTWARDS ARROW; QQK
+FFEC ; [*0441.0020.0012.FFEC] # HALFWIDTH DOWNWARDS ARROW; QQK
+FFED ; [*0743.0020.0012.FFED] # HALFWIDTH BLACK SQUARE; QQK
+FFEE ; [*076E.0020.0012.FFEE] # HALFWIDTH WHITE CIRCLE; QQK
+FFFC ; [*0F11.0020.0002.FFFC] # OBJECT REPLACEMENT CHARACTER
+FFFD ; [*0F12.0020.0002.FFFD] # REPLACEMENT CHARACTER
+10100 ; [*0296.0020.0002.10100] # AEGEAN WORD SEPARATOR LINE
+10101 ; [*0297.0020.0002.10101] # AEGEAN WORD SEPARATOR DOT
+10102 ; [*0298.0020.0002.10102] # AEGEAN CHECK MARK
+10110 ; [*0F29.0020.0002.10110] # AEGEAN NUMBER TEN
+10111 ; [*0F2A.0020.0002.10111] # AEGEAN NUMBER TWENTY
+10112 ; [*0F2B.0020.0002.10112] # AEGEAN NUMBER THIRTY
+10113 ; [*0F2C.0020.0002.10113] # AEGEAN NUMBER FORTY
+10114 ; [*0F2D.0020.0002.10114] # AEGEAN NUMBER FIFTY
+10115 ; [*0F2E.0020.0002.10115] # AEGEAN NUMBER SIXTY
+10116 ; [*0F2F.0020.0002.10116] # AEGEAN NUMBER SEVENTY
+10117 ; [*0F30.0020.0002.10117] # AEGEAN NUMBER EIGHTY
+10118 ; [*0F31.0020.0002.10118] # AEGEAN NUMBER NINETY
+10119 ; [*0F32.0020.0002.10119] # AEGEAN NUMBER ONE HUNDRED
+1011A ; [*0F33.0020.0002.1011A] # AEGEAN NUMBER TWO HUNDRED
+1011B ; [*0F34.0020.0002.1011B] # AEGEAN NUMBER THREE HUNDRED
+1011C ; [*0F35.0020.0002.1011C] # AEGEAN NUMBER FOUR HUNDRED
+1011D ; [*0F36.0020.0002.1011D] # AEGEAN NUMBER FIVE HUNDRED
+1011E ; [*0F37.0020.0002.1011E] # AEGEAN NUMBER SIX HUNDRED
+1011F ; [*0F38.0020.0002.1011F] # AEGEAN NUMBER SEVEN HUNDRED
+10120 ; [*0F39.0020.0002.10120] # AEGEAN NUMBER EIGHT HUNDRED
+10121 ; [*0F3A.0020.0002.10121] # AEGEAN NUMBER NINE HUNDRED
+10122 ; [*0F3B.0020.0002.10122] # AEGEAN NUMBER ONE THOUSAND
+10123 ; [*0F3C.0020.0002.10123] # AEGEAN NUMBER TWO THOUSAND
+10124 ; [*0F3D.0020.0002.10124] # AEGEAN NUMBER THREE THOUSAND
+10125 ; [*0F3E.0020.0002.10125] # AEGEAN NUMBER FOUR THOUSAND
+10126 ; [*0F3F.0020.0002.10126] # AEGEAN NUMBER FIVE THOUSAND
+10127 ; [*0F40.0020.0002.10127] # AEGEAN NUMBER SIX THOUSAND
+10128 ; [*0F41.0020.0002.10128] # AEGEAN NUMBER SEVEN THOUSAND
+10129 ; [*0F42.0020.0002.10129] # AEGEAN NUMBER EIGHT THOUSAND
+1012A ; [*0F43.0020.0002.1012A] # AEGEAN NUMBER NINE THOUSAND
+1012B ; [*0F44.0020.0002.1012B] # AEGEAN NUMBER TEN THOUSAND
+1012C ; [*0F45.0020.0002.1012C] # AEGEAN NUMBER TWENTY THOUSAND
+1012D ; [*0F46.0020.0002.1012D] # AEGEAN NUMBER THIRTY THOUSAND
+1012E ; [*0F47.0020.0002.1012E] # AEGEAN NUMBER FORTY THOUSAND
+1012F ; [*0F48.0020.0002.1012F] # AEGEAN NUMBER FIFTY THOUSAND
+10130 ; [*0F49.0020.0002.10130] # AEGEAN NUMBER SIXTY THOUSAND
+10131 ; [*0F4A.0020.0002.10131] # AEGEAN NUMBER SEVENTY THOUSAND
+10132 ; [*0F4B.0020.0002.10132] # AEGEAN NUMBER EIGHTY THOUSAND
+10133 ; [*0F4C.0020.0002.10133] # AEGEAN NUMBER NINETY THOUSAND
+10137 ; [*0CED.0020.0002.10137] # AEGEAN WEIGHT BASE UNIT
+10138 ; [*0CEE.0020.0002.10138] # AEGEAN WEIGHT FIRST SUBUNIT
+10139 ; [*0CEF.0020.0002.10139] # AEGEAN WEIGHT SECOND SUBUNIT
+1013A ; [*0CF0.0020.0002.1013A] # AEGEAN WEIGHT THIRD SUBUNIT
+1013B ; [*0CF1.0020.0002.1013B] # AEGEAN WEIGHT FOURTH SUBUNIT
+1013C ; [*0CF2.0020.0002.1013C] # AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D ; [*0CF3.0020.0002.1013D] # AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E ; [*0CF4.0020.0002.1013E] # AEGEAN MEASURE SECOND SUBUNIT
+1013F ; [*0CF5.0020.0002.1013F] # AEGEAN MEASURE THIRD SUBUNIT
+10140 ; [*0F4D.0020.0002.10140] # GREEK ACROPHONIC ATTIC ONE QUARTER
+10141 ; [*0F4E.0020.0002.10141] # GREEK ACROPHONIC ATTIC ONE HALF
+10144 ; [*0F4F.0020.0002.10144] # GREEK ACROPHONIC ATTIC FIFTY
+10145 ; [*0F50.0020.0002.10145] # GREEK ACROPHONIC ATTIC FIVE HUNDRED
+10146 ; [*0F51.0020.0002.10146] # GREEK ACROPHONIC ATTIC FIVE THOUSAND
+10147 ; [*0F52.0020.0002.10147] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND
+10149 ; [*0F53.0020.0002.10149] # GREEK ACROPHONIC ATTIC TEN TALENTS
+1014A ; [*0F54.0020.0002.1014A] # GREEK ACROPHONIC ATTIC FIFTY TALENTS
+1014B ; [*0F55.0020.0002.1014B] # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS
+1014C ; [*0F56.0020.0002.1014C] # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS
+1014D ; [*0F57.0020.0002.1014D] # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS
+1014E ; [*0F58.0020.0002.1014E] # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS
+10150 ; [*0F59.0020.0002.10150] # GREEK ACROPHONIC ATTIC TEN STATERS
+10151 ; [*0F5A.0020.0002.10151] # GREEK ACROPHONIC ATTIC FIFTY STATERS
+10152 ; [*0F5B.0020.0002.10152] # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS
+10153 ; [*0F5C.0020.0002.10153] # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS
+10154 ; [*0F5D.0020.0002.10154] # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS
+10155 ; [*0F5E.0020.0002.10155] # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS
+10156 ; [*0F5F.0020.0002.10156] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS
+10157 ; [*0F60.0020.0002.10157] # GREEK ACROPHONIC ATTIC TEN MNAS
+10160 ; [*0F61.0020.0002.10160] # GREEK ACROPHONIC TROEZENIAN TEN
+10161 ; [*0F62.0020.0002.10161] # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM
+10162 ; [*0F63.0020.0002.10162] # GREEK ACROPHONIC HERMIONIAN TEN
+10163 ; [*0F64.0020.0002.10163] # GREEK ACROPHONIC MESSENIAN TEN
+10164 ; [*0F65.0020.0002.10164] # GREEK ACROPHONIC THESPIAN TEN
+10165 ; [*0F66.0020.0002.10165] # GREEK ACROPHONIC THESPIAN THIRTY
+10166 ; [*0F67.0020.0002.10166] # GREEK ACROPHONIC TROEZENIAN FIFTY
+10167 ; [*0F68.0020.0002.10167] # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
+10168 ; [*0F69.0020.0002.10168] # GREEK ACROPHONIC HERMIONIAN FIFTY
+10169 ; [*0F6A.0020.0002.10169] # GREEK ACROPHONIC THESPIAN FIFTY
+1016A ; [*0F6B.0020.0002.1016A] # GREEK ACROPHONIC THESPIAN ONE HUNDRED
+1016B ; [*0F6C.0020.0002.1016B] # GREEK ACROPHONIC THESPIAN THREE HUNDRED
+1016C ; [*0F6D.0020.0002.1016C] # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED
+1016D ; [*0F6E.0020.0002.1016D] # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED
+1016E ; [*0F6F.0020.0002.1016E] # GREEK ACROPHONIC THESPIAN FIVE HUNDRED
+1016F ; [*0F70.0020.0002.1016F] # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED
+10170 ; [*0F71.0020.0002.10170] # GREEK ACROPHONIC NAXIAN FIVE HUNDRED
+10171 ; [*0F72.0020.0002.10171] # GREEK ACROPHONIC THESPIAN ONE THOUSAND
+10172 ; [*0F73.0020.0002.10172] # GREEK ACROPHONIC THESPIAN FIVE THOUSAND
+10174 ; [*0F74.0020.0002.10174] # GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175 ; [*0F75.0020.0002.10175] # GREEK ONE HALF SIGN
+10176 ; [*0F76.0020.0002.10176] # GREEK ONE HALF SIGN ALTERNATE FORM
+10177 ; [*0F77.0020.0002.10177] # GREEK TWO THIRDS SIGN
+10178 ; [*0F78.0020.0002.10178] # GREEK THREE QUARTERS SIGN
+10179 ; [*0CF6.0020.0002.10179] # GREEK YEAR SIGN
+1017A ; [*0CF7.0020.0002.1017A] # GREEK TALENT SIGN
+1017B ; [*0CF8.0020.0002.1017B] # GREEK DRACHMA SIGN
+1017C ; [*0CF9.0020.0002.1017C] # GREEK OBOL SIGN
+1017D ; [*0CFA.0020.0002.1017D] # GREEK TWO OBOLS SIGN
+1017E ; [*0CFB.0020.0002.1017E] # GREEK THREE OBOLS SIGN
+1017F ; [*0CFC.0020.0002.1017F] # GREEK FOUR OBOLS SIGN
+10180 ; [*0CFD.0020.0002.10180] # GREEK FIVE OBOLS SIGN
+10181 ; [*0CFE.0020.0002.10181] # GREEK METRETES SIGN
+10182 ; [*0CFF.0020.0002.10182] # GREEK KYATHOS BASE SIGN
+10183 ; [*0D00.0020.0002.10183] # GREEK LITRA SIGN
+10184 ; [*0D01.0020.0002.10184] # GREEK OUNKIA SIGN
+10185 ; [*0D02.0020.0002.10185] # GREEK XESTES SIGN
+10186 ; [*0D03.0020.0002.10186] # GREEK ARTABE SIGN
+10187 ; [*0D04.0020.0002.10187] # GREEK AROURA SIGN
+10188 ; [*0D05.0020.0002.10188] # GREEK GRAMMA SIGN
+10189 ; [*0D06.0020.0002.10189] # GREEK TRYBLION BASE SIGN
+10322 ; [*0F27.0020.0002.10322] # OLD ITALIC NUMERAL TEN
+10323 ; [*0F28.0020.0002.10323] # OLD ITALIC NUMERAL FIFTY
+1039F ; [*0299.0020.0002.1039F] # UGARITIC WORD DIVIDER
+103D0 ; [*029A.0020.0002.103D0] # OLD PERSIAN WORD DIVIDER
+103D3 ; [*0F79.0020.0002.103D3] # OLD PERSIAN NUMBER TEN
+103D4 ; [*0F7A.0020.0002.103D4] # OLD PERSIAN NUMBER TWENTY
+103D5 ; [*0F7B.0020.0002.103D5] # OLD PERSIAN NUMBER HUNDRED
+10917 ; [*0F7C.0020.0002.10917] # PHOENICIAN NUMBER TEN
+10918 ; [*0F7D.0020.0002.10918] # PHOENICIAN NUMBER TWENTY
+10919 ; [*0F7E.0020.0002.10919] # PHOENICIAN NUMBER ONE HUNDRED
+1091F ; [*029B.0020.0002.1091F] # PHOENICIAN WORD SEPARATOR
+10A44 ; [*0F7F.0020.0002.10A44] # KHAROSHTHI NUMBER TEN
+10A45 ; [*0F80.0020.0002.10A45] # KHAROSHTHI NUMBER TWENTY
+10A46 ; [*0F81.0020.0002.10A46] # KHAROSHTHI NUMBER ONE HUNDRED
+10A47 ; [*0F82.0020.0002.10A47] # KHAROSHTHI NUMBER ONE THOUSAND
+10A50 ; [*035E.0020.0002.10A50] # KHAROSHTHI PUNCTUATION DOT
+10A51 ; [*035F.0020.0002.10A51] # KHAROSHTHI PUNCTUATION SMALL CIRCLE
+10A52 ; [*0360.0020.0002.10A52] # KHAROSHTHI PUNCTUATION CIRCLE
+10A53 ; [*0361.0020.0002.10A53] # KHAROSHTHI PUNCTUATION CRESCENT BAR
+10A54 ; [*0362.0020.0002.10A54] # KHAROSHTHI PUNCTUATION MANGALAM
+10A55 ; [*0363.0020.0002.10A55] # KHAROSHTHI PUNCTUATION LOTUS
+10A56 ; [*0280.0020.0002.10A56] # KHAROSHTHI PUNCTUATION DANDA
+10A57 ; [*0281.0020.0002.10A57] # KHAROSHTHI PUNCTUATION DOUBLE DANDA
+10A58 ; [*0364.0020.0002.10A58] # KHAROSHTHI PUNCTUATION LINES
+12432 ; [*0F83.0020.0002.12432] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH
+12433 ; [*0F84.0020.0002.12433] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN
+12456 ; [*0F85.0020.0002.12456] # CUNEIFORM NUMERIC SIGN NIGIDAMIN
+12457 ; [*0F86.0020.0002.12457] # CUNEIFORM NUMERIC SIGN NIGIDAESH
+1245A ; [*0F87.0020.0002.1245A] # CUNEIFORM NUMERIC SIGN ONE THIRD DISH
+1245B ; [*0F88.0020.0002.1245B] # CUNEIFORM NUMERIC SIGN TWO THIRDS DISH
+1245C ; [*0F89.0020.0002.1245C] # CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH
+1245D ; [*0F8A.0020.0002.1245D] # CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A
+1245E ; [*0F8B.0020.0002.1245E] # CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A
+1245F ; [*0F8C.0020.0002.1245F] # CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH
+12460 ; [*0F8D.0020.0002.12460] # CUNEIFORM NUMERIC SIGN ONE QUARTER ASH
+12461 ; [*0F8E.0020.0002.12461] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH
+12462 ; [*0F8F.0020.0002.12462] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+12470 ; [*029C.0020.0002.12470] # CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER
+12471 ; [*029D.0020.0002.12471] # CUNEIFORM PUNCTUATION SIGN VERTICAL COLON
+12472 ; [*029E.0020.0002.12472] # CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON
+12473 ; [*029F.0020.0002.12473] # CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+1D000 ; [*0D07.0020.0002.1D000] # BYZANTINE MUSICAL SYMBOL PSILI
+1D001 ; [*0D08.0020.0002.1D001] # BYZANTINE MUSICAL SYMBOL DASEIA
+1D002 ; [*0D09.0020.0002.1D002] # BYZANTINE MUSICAL SYMBOL PERISPOMENI
+1D003 ; [*0D0A.0020.0002.1D003] # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON
+1D004 ; [*0D0B.0020.0002.1D004] # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI
+1D005 ; [*0D0C.0020.0002.1D005] # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON
+1D006 ; [*0D0D.0020.0002.1D006] # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI
+1D007 ; [*0D0E.0020.0002.1D007] # BYZANTINE MUSICAL SYMBOL KATHISTI
+1D008 ; [*0D0F.0020.0002.1D008] # BYZANTINE MUSICAL SYMBOL SYRMATIKI
+1D009 ; [*0D10.0020.0002.1D009] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI
+1D00A ; [*0D11.0020.0002.1D00A] # BYZANTINE MUSICAL SYMBOL YPOKRISIS
+1D00B ; [*0D12.0020.0002.1D00B] # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI
+1D00C ; [*0D13.0020.0002.1D00C] # BYZANTINE MUSICAL SYMBOL KREMASTI
+1D00D ; [*0D14.0020.0002.1D00D] # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON
+1D00E ; [*0D15.0020.0002.1D00E] # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON
+1D00F ; [*0D16.0020.0002.1D00F] # BYZANTINE MUSICAL SYMBOL TELEIA
+1D010 ; [*0D17.0020.0002.1D010] # BYZANTINE MUSICAL SYMBOL KENTIMATA
+1D011 ; [*0D18.0020.0002.1D011] # BYZANTINE MUSICAL SYMBOL APOSTROFOS
+1D012 ; [*0D19.0020.0002.1D012] # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI
+1D013 ; [*0D1A.0020.0002.1D013] # BYZANTINE MUSICAL SYMBOL SYNEVMA
+1D014 ; [*0D1B.0020.0002.1D014] # BYZANTINE MUSICAL SYMBOL THITA
+1D015 ; [*0D1C.0020.0002.1D015] # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION
+1D016 ; [*0D1D.0020.0002.1D016] # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION
+1D017 ; [*0D1E.0020.0002.1D017] # BYZANTINE MUSICAL SYMBOL PSILON
+1D018 ; [*0D1F.0020.0002.1D018] # BYZANTINE MUSICAL SYMBOL CHAMILON
+1D019 ; [*0D20.0020.0002.1D019] # BYZANTINE MUSICAL SYMBOL VATHY
+1D01A ; [*0D21.0020.0002.1D01A] # BYZANTINE MUSICAL SYMBOL ISON ARCHAION
+1D01B ; [*0D22.0020.0002.1D01B] # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION
+1D01C ; [*0D23.0020.0002.1D01C] # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION
+1D01D ; [*0D24.0020.0002.1D01D] # BYZANTINE MUSICAL SYMBOL SAXIMATA
+1D01E ; [*0D25.0020.0002.1D01E] # BYZANTINE MUSICAL SYMBOL PARICHON
+1D01F ; [*0D26.0020.0002.1D01F] # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA
+1D020 ; [*0D27.0020.0002.1D020] # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION
+1D021 ; [*0D28.0020.0002.1D021] # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION
+1D022 ; [*0D29.0020.0002.1D022] # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION
+1D023 ; [*0D2A.0020.0002.1D023] # BYZANTINE MUSICAL SYMBOL APOTHEMA
+1D024 ; [*0D2B.0020.0002.1D024] # BYZANTINE MUSICAL SYMBOL KLASMA
+1D025 ; [*0D2C.0020.0002.1D025] # BYZANTINE MUSICAL SYMBOL REVMA
+1D026 ; [*0D2D.0020.0002.1D026] # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION
+1D027 ; [*0D2E.0020.0002.1D027] # BYZANTINE MUSICAL SYMBOL TINAGMA
+1D028 ; [*0D2F.0020.0002.1D028] # BYZANTINE MUSICAL SYMBOL ANATRICHISMA
+1D029 ; [*0D30.0020.0002.1D029] # BYZANTINE MUSICAL SYMBOL SEISMA
+1D02A ; [*0D31.0020.0002.1D02A] # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION
+1D02B ; [*0D32.0020.0002.1D02B] # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU
+1D02C ; [*0D33.0020.0002.1D02C] # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION
+1D02D ; [*0D34.0020.0002.1D02D] # BYZANTINE MUSICAL SYMBOL THEMA
+1D02E ; [*0D35.0020.0002.1D02E] # BYZANTINE MUSICAL SYMBOL LEMOI
+1D02F ; [*0D36.0020.0002.1D02F] # BYZANTINE MUSICAL SYMBOL DYO
+1D030 ; [*0D37.0020.0002.1D030] # BYZANTINE MUSICAL SYMBOL TRIA
+1D031 ; [*0D38.0020.0002.1D031] # BYZANTINE MUSICAL SYMBOL TESSERA
+1D032 ; [*0D39.0020.0002.1D032] # BYZANTINE MUSICAL SYMBOL KRATIMATA
+1D033 ; [*0D3A.0020.0002.1D033] # BYZANTINE MUSICAL SYMBOL APESO EXO NEO
+1D034 ; [*0D3B.0020.0002.1D034] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION
+1D035 ; [*0D3C.0020.0002.1D035] # BYZANTINE MUSICAL SYMBOL IMIFTHORA
+1D036 ; [*0D3D.0020.0002.1D036] # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION
+1D037 ; [*0D3E.0020.0002.1D037] # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON
+1D038 ; [*0D3F.0020.0002.1D038] # BYZANTINE MUSICAL SYMBOL PELASTON
+1D039 ; [*0D40.0020.0002.1D039] # BYZANTINE MUSICAL SYMBOL PSIFISTON
+1D03A ; [*0D41.0020.0002.1D03A] # BYZANTINE MUSICAL SYMBOL KONTEVMA
+1D03B ; [*0D42.0020.0002.1D03B] # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION
+1D03C ; [*0D43.0020.0002.1D03C] # BYZANTINE MUSICAL SYMBOL RAPISMA
+1D03D ; [*0D44.0020.0002.1D03D] # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION
+1D03E ; [*0D45.0020.0002.1D03E] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION
+1D03F ; [*0D46.0020.0002.1D03F] # BYZANTINE MUSICAL SYMBOL ICHADIN
+1D040 ; [*0D47.0020.0002.1D040] # BYZANTINE MUSICAL SYMBOL NANA
+1D041 ; [*0D48.0020.0002.1D041] # BYZANTINE MUSICAL SYMBOL PETASMA
+1D042 ; [*0D49.0020.0002.1D042] # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO
+1D043 ; [*0D4A.0020.0002.1D043] # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO
+1D044 ; [*0D4B.0020.0002.1D044] # BYZANTINE MUSICAL SYMBOL STRAGGISMATA
+1D045 ; [*0D4C.0020.0002.1D045] # BYZANTINE MUSICAL SYMBOL GRONTHISMATA
+1D046 ; [*0D4D.0020.0002.1D046] # BYZANTINE MUSICAL SYMBOL ISON NEO
+1D047 ; [*0D4E.0020.0002.1D047] # BYZANTINE MUSICAL SYMBOL OLIGON NEO
+1D048 ; [*0D4F.0020.0002.1D048] # BYZANTINE MUSICAL SYMBOL OXEIA NEO
+1D049 ; [*0D50.0020.0002.1D049] # BYZANTINE MUSICAL SYMBOL PETASTI
+1D04A ; [*0D51.0020.0002.1D04A] # BYZANTINE MUSICAL SYMBOL KOUFISMA
+1D04B ; [*0D52.0020.0002.1D04B] # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA
+1D04C ; [*0D53.0020.0002.1D04C] # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA
+1D04D ; [*0D54.0020.0002.1D04D] # BYZANTINE MUSICAL SYMBOL PELASTON NEO
+1D04E ; [*0D55.0020.0002.1D04E] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO
+1D04F ; [*0D56.0020.0002.1D04F] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO
+1D050 ; [*0D57.0020.0002.1D050] # BYZANTINE MUSICAL SYMBOL YPSILI
+1D051 ; [*0D58.0020.0002.1D051] # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO
+1D052 ; [*0D59.0020.0002.1D052] # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO
+1D053 ; [*0D5A.0020.0002.1D053] # BYZANTINE MUSICAL SYMBOL YPORROI
+1D054 ; [*0D5B.0020.0002.1D054] # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON
+1D055 ; [*0D5C.0020.0002.1D055] # BYZANTINE MUSICAL SYMBOL ELAFRON
+1D056 ; [*0D5D.0020.0002.1D056] # BYZANTINE MUSICAL SYMBOL CHAMILI
+1D057 ; [*0D5E.0020.0002.1D057] # BYZANTINE MUSICAL SYMBOL MIKRON ISON
+1D058 ; [*0D5F.0020.0002.1D058] # BYZANTINE MUSICAL SYMBOL VAREIA NEO
+1D059 ; [*0D60.0020.0002.1D059] # BYZANTINE MUSICAL SYMBOL PIASMA NEO
+1D05A ; [*0D61.0020.0002.1D05A] # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO
+1D05B ; [*0D62.0020.0002.1D05B] # BYZANTINE MUSICAL SYMBOL OMALON
+1D05C ; [*0D63.0020.0002.1D05C] # BYZANTINE MUSICAL SYMBOL ANTIKENOMA
+1D05D ; [*0D64.0020.0002.1D05D] # BYZANTINE MUSICAL SYMBOL LYGISMA
+1D05E ; [*0D65.0020.0002.1D05E] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO
+1D05F ; [*0D66.0020.0002.1D05F] # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO
+1D060 ; [*0D67.0020.0002.1D060] # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA
+1D061 ; [*0D68.0020.0002.1D061] # BYZANTINE MUSICAL SYMBOL KYLISMA
+1D062 ; [*0D69.0020.0002.1D062] # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA
+1D063 ; [*0D6A.0020.0002.1D063] # BYZANTINE MUSICAL SYMBOL TROMIKON NEO
+1D064 ; [*0D6B.0020.0002.1D064] # BYZANTINE MUSICAL SYMBOL EKSTREPTON
+1D065 ; [*0D6C.0020.0002.1D065] # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO
+1D066 ; [*0D6D.0020.0002.1D066] # BYZANTINE MUSICAL SYMBOL SYRMA
+1D067 ; [*0D6E.0020.0002.1D067] # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO
+1D068 ; [*0D6F.0020.0002.1D068] # BYZANTINE MUSICAL SYMBOL EPEGERMA
+1D069 ; [*0D70.0020.0002.1D069] # BYZANTINE MUSICAL SYMBOL SEISMA NEO
+1D06A ; [*0D71.0020.0002.1D06A] # BYZANTINE MUSICAL SYMBOL XIRON KLASMA
+1D06B ; [*0D72.0020.0002.1D06B] # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON
+1D06C ; [*0D73.0020.0002.1D06C] # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA
+1D06D ; [*0D74.0020.0002.1D06D] # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA
+1D06E ; [*0D75.0020.0002.1D06E] # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA
+1D06F ; [*0D76.0020.0002.1D06F] # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA
+1D070 ; [*0D77.0020.0002.1D070] # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA
+1D071 ; [*0D78.0020.0002.1D071] # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA
+1D072 ; [*0D79.0020.0002.1D072] # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON
+1D073 ; [*0D7A.0020.0002.1D073] # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON
+1D074 ; [*0D7B.0020.0002.1D074] # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON
+1D075 ; [*0D7C.0020.0002.1D075] # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO
+1D076 ; [*0D7D.0020.0002.1D076] # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO
+1D077 ; [*0D7E.0020.0002.1D077] # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO
+1D078 ; [*0D7F.0020.0002.1D078] # BYZANTINE MUSICAL SYMBOL THEMA APLOUN
+1D079 ; [*0D80.0020.0002.1D079] # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES
+1D07A ; [*0D81.0020.0002.1D07A] # BYZANTINE MUSICAL SYMBOL KATAVASMA
+1D07B ; [*0D82.0020.0002.1D07B] # BYZANTINE MUSICAL SYMBOL ENDOFONON
+1D07C ; [*0D83.0020.0002.1D07C] # BYZANTINE MUSICAL SYMBOL YFEN KATO
+1D07D ; [*0D84.0020.0002.1D07D] # BYZANTINE MUSICAL SYMBOL YFEN ANO
+1D07E ; [*0D85.0020.0002.1D07E] # BYZANTINE MUSICAL SYMBOL STAVROS
+1D07F ; [*0D86.0020.0002.1D07F] # BYZANTINE MUSICAL SYMBOL KLASMA ANO
+1D080 ; [*0D87.0020.0002.1D080] # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION
+1D081 ; [*0D88.0020.0002.1D081] # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION
+1D082 ; [*0D89.0020.0002.1D082] # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO
+1D083 ; [*0D8A.0020.0002.1D083] # BYZANTINE MUSICAL SYMBOL KRATIMA NEO
+1D084 ; [*0D8B.0020.0002.1D084] # BYZANTINE MUSICAL SYMBOL APODERMA NEO
+1D085 ; [*0D8C.0020.0002.1D085] # BYZANTINE MUSICAL SYMBOL APLI
+1D086 ; [*0D8D.0020.0002.1D086] # BYZANTINE MUSICAL SYMBOL DIPLI
+1D087 ; [*0D8E.0020.0002.1D087] # BYZANTINE MUSICAL SYMBOL TRIPLI
+1D088 ; [*0D8F.0020.0002.1D088] # BYZANTINE MUSICAL SYMBOL TETRAPLI
+1D089 ; [*0D90.0020.0002.1D089] # BYZANTINE MUSICAL SYMBOL KORONIS
+1D08A ; [*0D91.0020.0002.1D08A] # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU
+1D08B ; [*0D92.0020.0002.1D08B] # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON
+1D08C ; [*0D93.0020.0002.1D08C] # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON
+1D08D ; [*0D94.0020.0002.1D08D] # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON
+1D08E ; [*0D95.0020.0002.1D08E] # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU
+1D08F ; [*0D96.0020.0002.1D08F] # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO
+1D090 ; [*0D97.0020.0002.1D090] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA
+1D091 ; [*0D98.0020.0002.1D091] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA
+1D092 ; [*0D99.0020.0002.1D092] # BYZANTINE MUSICAL SYMBOL DIGORGON
+1D093 ; [*0D9A.0020.0002.1D093] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO
+1D094 ; [*0D9B.0020.0002.1D094] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO
+1D095 ; [*0D9C.0020.0002.1D095] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA
+1D096 ; [*0D9D.0020.0002.1D096] # BYZANTINE MUSICAL SYMBOL TRIGORGON
+1D097 ; [*0D9E.0020.0002.1D097] # BYZANTINE MUSICAL SYMBOL ARGON
+1D098 ; [*0D9F.0020.0002.1D098] # BYZANTINE MUSICAL SYMBOL IMIDIARGON
+1D099 ; [*0DA0.0020.0002.1D099] # BYZANTINE MUSICAL SYMBOL DIARGON
+1D09A ; [*0DA1.0020.0002.1D09A] # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI
+1D09B ; [*0DA2.0020.0002.1D09B] # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI
+1D09C ; [*0DA3.0020.0002.1D09C] # BYZANTINE MUSICAL SYMBOL AGOGI ARGI
+1D09D ; [*0DA4.0020.0002.1D09D] # BYZANTINE MUSICAL SYMBOL AGOGI METRIA
+1D09E ; [*0DA5.0020.0002.1D09E] # BYZANTINE MUSICAL SYMBOL AGOGI MESI
+1D09F ; [*0DA6.0020.0002.1D09F] # BYZANTINE MUSICAL SYMBOL AGOGI GORGI
+1D0A0 ; [*0DA7.0020.0002.1D0A0] # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI
+1D0A1 ; [*0DA8.0020.0002.1D0A1] # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI
+1D0A2 ; [*0DA9.0020.0002.1D0A2] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS
+1D0A3 ; [*0DAA.0020.0002.1D0A3] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS
+1D0A4 ; [*0DAB.0020.0002.1D0A4] # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS
+1D0A5 ; [*0DAC.0020.0002.1D0A5] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS
+1D0A6 ; [*0DAD.0020.0002.1D0A6] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS
+1D0A7 ; [*0DAE.0020.0002.1D0A7] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS
+1D0A8 ; [*0DAF.0020.0002.1D0A8] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS
+1D0A9 ; [*0DB0.0020.0002.1D0A9] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA ; [*0DB1.0020.0002.1D0AA] # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS
+1D0AB ; [*0DB2.0020.0002.1D0AB] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS
+1D0AC ; [*0DB3.0020.0002.1D0AC] # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS
+1D0AD ; [*0DB4.0020.0002.1D0AD] # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS
+1D0AE ; [*0DB5.0020.0002.1D0AE] # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS
+1D0AF ; [*0DB6.0020.0002.1D0AF] # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS
+1D0B0 ; [*0DB7.0020.0002.1D0B0] # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS
+1D0B1 ; [*0DB8.0020.0002.1D0B1] # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS
+1D0B2 ; [*0DB9.0020.0002.1D0B2] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS
+1D0B3 ; [*0DBA.0020.0002.1D0B3] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4 ; [*0DBB.0020.0002.1D0B4] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN
+1D0B5 ; [*0DBC.0020.0002.1D0B5] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN
+1D0B6 ; [*0DBD.0020.0002.1D0B6] # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU
+1D0B7 ; [*0DBE.0020.0002.1D0B7] # BYZANTINE MUSICAL SYMBOL IMIFONON
+1D0B8 ; [*0DBF.0020.0002.1D0B8] # BYZANTINE MUSICAL SYMBOL IMIFTHORON
+1D0B9 ; [*0DC0.0020.0002.1D0B9] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU
+1D0BA ; [*0DC1.0020.0002.1D0BA] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA
+1D0BB ; [*0DC2.0020.0002.1D0BB] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA
+1D0BC ; [*0DC3.0020.0002.1D0BC] # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS
+1D0BD ; [*0DC4.0020.0002.1D0BD] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI
+1D0BE ; [*0DC5.0020.0002.1D0BE] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI
+1D0BF ; [*0DC6.0020.0002.1D0BF] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE
+1D0C0 ; [*0DC7.0020.0002.1D0C0] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO
+1D0C1 ; [*0DC8.0020.0002.1D0C1] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO
+1D0C2 ; [*0DC9.0020.0002.1D0C2] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO
+1D0C3 ; [*0DCA.0020.0002.1D0C3] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
+1D0C4 ; [*0DCB.0020.0002.1D0C4] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
+1D0C5 ; [*0DCC.0020.0002.1D0C5] # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+1D0C6 ; [*0DCD.0020.0002.1D0C6] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
+1D0C7 ; [*0DCE.0020.0002.1D0C7] # BYZANTINE MUSICAL SYMBOL FTHORA NENANO
+1D0C8 ; [*0DCF.0020.0002.1D0C8] # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
+1D0C9 ; [*0DD0.0020.0002.1D0C9] # BYZANTINE MUSICAL SYMBOL CHROA KLITON
+1D0CA ; [*0DD1.0020.0002.1D0CA] # BYZANTINE MUSICAL SYMBOL CHROA SPATHI
+1D0CB ; [*0DD2.0020.0002.1D0CB] # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION
+1D0CC ; [*0DD3.0020.0002.1D0CC] # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA
+1D0CD ; [*0DD4.0020.0002.1D0CD] # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION
+1D0CE ; [*0DD5.0020.0002.1D0CE] # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION
+1D0CF ; [*0DD6.0020.0002.1D0CF] # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION
+1D0D0 ; [*0DD7.0020.0002.1D0D0] # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA
+1D0D1 ; [*0DD8.0020.0002.1D0D1] # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2 ; [*0DD9.0020.0002.1D0D2] # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA
+1D0D3 ; [*0DDA.0020.0002.1D0D3] # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4 ; [*0DDB.0020.0002.1D0D4] # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA
+1D0D5 ; [*0DDC.0020.0002.1D0D5] # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6 ; [*0DDD.0020.0002.1D0D6] # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA
+1D0D7 ; [*0DDE.0020.0002.1D0D7] # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8 ; [*0DDF.0020.0002.1D0D8] # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS
+1D0D9 ; [*0DE0.0020.0002.1D0D9] # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS
+1D0DA ; [*0DE1.0020.0002.1D0DA] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI
+1D0DB ; [*0DE2.0020.0002.1D0DB] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI
+1D0DC ; [*0DE3.0020.0002.1D0DC] # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI
+1D0DD ; [*0DE4.0020.0002.1D0DD] # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS
+1D0DE ; [*0DE5.0020.0002.1D0DE] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS
+1D0DF ; [*0DE6.0020.0002.1D0DF] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU
+1D0E0 ; [*0DE7.0020.0002.1D0E0] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU
+1D0E1 ; [*0DE8.0020.0002.1D0E1] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU
+1D0E2 ; [*0DE9.0020.0002.1D0E2] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS
+1D0E3 ; [*0DEA.0020.0002.1D0E3] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU
+1D0E4 ; [*0DEB.0020.0002.1D0E4] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU
+1D0E5 ; [*0DEC.0020.0002.1D0E5] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU
+1D0E6 ; [*0DED.0020.0002.1D0E6] # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG
+1D0E7 ; [*0DEE.0020.0002.1D0E7] # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU
+1D0E8 ; [*0DEF.0020.0002.1D0E8] # BYZANTINE MUSICAL SYMBOL STIGMA
+1D0E9 ; [*0DF0.0020.0002.1D0E9] # BYZANTINE MUSICAL SYMBOL ARKTIKO PA
+1D0EA ; [*0DF1.0020.0002.1D0EA] # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU
+1D0EB ; [*0DF2.0020.0002.1D0EB] # BYZANTINE MUSICAL SYMBOL ARKTIKO GA
+1D0EC ; [*0DF3.0020.0002.1D0EC] # BYZANTINE MUSICAL SYMBOL ARKTIKO DI
+1D0ED ; [*0DF4.0020.0002.1D0ED] # BYZANTINE MUSICAL SYMBOL ARKTIKO KE
+1D0EE ; [*0DF5.0020.0002.1D0EE] # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO
+1D0EF ; [*0DF6.0020.0002.1D0EF] # BYZANTINE MUSICAL SYMBOL ARKTIKO NI
+1D0F0 ; [*0DF7.0020.0002.1D0F0] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO
+1D0F1 ; [*0DF8.0020.0002.1D0F1] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO
+1D0F2 ; [*0DF9.0020.0002.1D0F2] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO
+1D0F3 ; [*0DFA.0020.0002.1D0F3] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO
+1D0F4 ; [*0DFB.0020.0002.1D0F4] # BYZANTINE MUSICAL SYMBOL KLASMA KATO
+1D0F5 ; [*0DFC.0020.0002.1D0F5] # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100 ; [*0DFD.0020.0002.1D100] # MUSICAL SYMBOL SINGLE BARLINE
+1D101 ; [*0DFE.0020.0002.1D101] # MUSICAL SYMBOL DOUBLE BARLINE
+1D102 ; [*0DFF.0020.0002.1D102] # MUSICAL SYMBOL FINAL BARLINE
+1D103 ; [*0E00.0020.0002.1D103] # MUSICAL SYMBOL REVERSE FINAL BARLINE
+1D104 ; [*0E01.0020.0002.1D104] # MUSICAL SYMBOL DASHED BARLINE
+1D105 ; [*0E02.0020.0002.1D105] # MUSICAL SYMBOL SHORT BARLINE
+1D106 ; [*0E03.0020.0002.1D106] # MUSICAL SYMBOL LEFT REPEAT SIGN
+1D107 ; [*0E04.0020.0002.1D107] # MUSICAL SYMBOL RIGHT REPEAT SIGN
+1D108 ; [*0E05.0020.0002.1D108] # MUSICAL SYMBOL REPEAT DOTS
+1D109 ; [*0E06.0020.0002.1D109] # MUSICAL SYMBOL DAL SEGNO
+1D10A ; [*0E07.0020.0002.1D10A] # MUSICAL SYMBOL DA CAPO
+1D10B ; [*0E08.0020.0002.1D10B] # MUSICAL SYMBOL SEGNO
+1D10C ; [*0E09.0020.0002.1D10C] # MUSICAL SYMBOL CODA
+1D10D ; [*0E0A.0020.0002.1D10D] # MUSICAL SYMBOL REPEATED FIGURE-1
+1D10E ; [*0E0B.0020.0002.1D10E] # MUSICAL SYMBOL REPEATED FIGURE-2
+1D10F ; [*0E0C.0020.0002.1D10F] # MUSICAL SYMBOL REPEATED FIGURE-3
+1D110 ; [*0E0D.0020.0002.1D110] # MUSICAL SYMBOL FERMATA
+1D111 ; [*0E0E.0020.0002.1D111] # MUSICAL SYMBOL FERMATA BELOW
+1D112 ; [*0E0F.0020.0002.1D112] # MUSICAL SYMBOL BREATH MARK
+1D113 ; [*0E10.0020.0002.1D113] # MUSICAL SYMBOL CAESURA
+1D114 ; [*0E11.0020.0002.1D114] # MUSICAL SYMBOL BRACE
+1D115 ; [*0E12.0020.0002.1D115] # MUSICAL SYMBOL BRACKET
+1D116 ; [*0E13.0020.0002.1D116] # MUSICAL SYMBOL ONE-LINE STAFF
+1D117 ; [*0E14.0020.0002.1D117] # MUSICAL SYMBOL TWO-LINE STAFF
+1D118 ; [*0E15.0020.0002.1D118] # MUSICAL SYMBOL THREE-LINE STAFF
+1D119 ; [*0E16.0020.0002.1D119] # MUSICAL SYMBOL FOUR-LINE STAFF
+1D11A ; [*0E17.0020.0002.1D11A] # MUSICAL SYMBOL FIVE-LINE STAFF
+1D11B ; [*0E18.0020.0002.1D11B] # MUSICAL SYMBOL SIX-LINE STAFF
+1D11C ; [*0E19.0020.0002.1D11C] # MUSICAL SYMBOL SIX-STRING FRETBOARD
+1D11D ; [*0E1A.0020.0002.1D11D] # MUSICAL SYMBOL FOUR-STRING FRETBOARD
+1D11E ; [*0E1B.0020.0002.1D11E] # MUSICAL SYMBOL G CLEF
+1D11F ; [*0E1C.0020.0002.1D11F] # MUSICAL SYMBOL G CLEF OTTAVA ALTA
+1D120 ; [*0E1D.0020.0002.1D120] # MUSICAL SYMBOL G CLEF OTTAVA BASSA
+1D121 ; [*0E1E.0020.0002.1D121] # MUSICAL SYMBOL C CLEF
+1D122 ; [*0E1F.0020.0002.1D122] # MUSICAL SYMBOL F CLEF
+1D123 ; [*0E20.0020.0002.1D123] # MUSICAL SYMBOL F CLEF OTTAVA ALTA
+1D124 ; [*0E21.0020.0002.1D124] # MUSICAL SYMBOL F CLEF OTTAVA BASSA
+1D125 ; [*0E22.0020.0002.1D125] # MUSICAL SYMBOL DRUM CLEF-1
+1D126 ; [*0E23.0020.0002.1D126] # MUSICAL SYMBOL DRUM CLEF-2
+1D12A ; [*0E27.0020.0002.1D12A] # MUSICAL SYMBOL DOUBLE SHARP
+1D12B ; [*0E28.0020.0002.1D12B] # MUSICAL SYMBOL DOUBLE FLAT
+1D12C ; [*0E29.0020.0002.1D12C] # MUSICAL SYMBOL FLAT UP
+1D12D ; [*0E2A.0020.0002.1D12D] # MUSICAL SYMBOL FLAT DOWN
+1D12E ; [*0E2B.0020.0002.1D12E] # MUSICAL SYMBOL NATURAL UP
+1D12F ; [*0E2C.0020.0002.1D12F] # MUSICAL SYMBOL NATURAL DOWN
+1D130 ; [*0E2D.0020.0002.1D130] # MUSICAL SYMBOL SHARP UP
+1D131 ; [*0E2E.0020.0002.1D131] # MUSICAL SYMBOL SHARP DOWN
+1D132 ; [*0E2F.0020.0002.1D132] # MUSICAL SYMBOL QUARTER TONE SHARP
+1D133 ; [*0E30.0020.0002.1D133] # MUSICAL SYMBOL QUARTER TONE FLAT
+1D134 ; [*0E31.0020.0002.1D134] # MUSICAL SYMBOL COMMON TIME
+1D135 ; [*0E32.0020.0002.1D135] # MUSICAL SYMBOL CUT TIME
+1D136 ; [*0E33.0020.0002.1D136] # MUSICAL SYMBOL OTTAVA ALTA
+1D137 ; [*0E34.0020.0002.1D137] # MUSICAL SYMBOL OTTAVA BASSA
+1D138 ; [*0E35.0020.0002.1D138] # MUSICAL SYMBOL QUINDICESIMA ALTA
+1D139 ; [*0E36.0020.0002.1D139] # MUSICAL SYMBOL QUINDICESIMA BASSA
+1D13A ; [*0E37.0020.0002.1D13A] # MUSICAL SYMBOL MULTI REST
+1D13B ; [*0E38.0020.0002.1D13B] # MUSICAL SYMBOL WHOLE REST
+1D13C ; [*0E39.0020.0002.1D13C] # MUSICAL SYMBOL HALF REST
+1D13D ; [*0E3A.0020.0002.1D13D] # MUSICAL SYMBOL QUARTER REST
+1D13E ; [*0E3B.0020.0002.1D13E] # MUSICAL SYMBOL EIGHTH REST
+1D13F ; [*0E3C.0020.0002.1D13F] # MUSICAL SYMBOL SIXTEENTH REST
+1D140 ; [*0E3D.0020.0002.1D140] # MUSICAL SYMBOL THIRTY-SECOND REST
+1D141 ; [*0E3E.0020.0002.1D141] # MUSICAL SYMBOL SIXTY-FOURTH REST
+1D142 ; [*0E3F.0020.0002.1D142] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST
+1D143 ; [*0E40.0020.0002.1D143] # MUSICAL SYMBOL X NOTEHEAD
+1D144 ; [*0E41.0020.0002.1D144] # MUSICAL SYMBOL PLUS NOTEHEAD
+1D145 ; [*0E42.0020.0002.1D145] # MUSICAL SYMBOL CIRCLE X NOTEHEAD
+1D146 ; [*0E43.0020.0002.1D146] # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE
+1D147 ; [*0E44.0020.0002.1D147] # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK
+1D148 ; [*0E45.0020.0002.1D148] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE
+1D149 ; [*0E46.0020.0002.1D149] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK
+1D14A ; [*0E47.0020.0002.1D14A] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE
+1D14B ; [*0E48.0020.0002.1D14B] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK
+1D14C ; [*0E49.0020.0002.1D14C] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE
+1D14D ; [*0E4A.0020.0002.1D14D] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK
+1D14E ; [*0E4B.0020.0002.1D14E] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE
+1D14F ; [*0E4C.0020.0002.1D14F] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK
+1D150 ; [*0E4D.0020.0002.1D150] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE
+1D151 ; [*0E4E.0020.0002.1D151] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK
+1D152 ; [*0E4F.0020.0002.1D152] # MUSICAL SYMBOL MOON NOTEHEAD WHITE
+1D153 ; [*0E50.0020.0002.1D153] # MUSICAL SYMBOL MOON NOTEHEAD BLACK
+1D154 ; [*0E51.0020.0002.1D154] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE
+1D155 ; [*0E52.0020.0002.1D155] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK
+1D156 ; [*0E53.0020.0002.1D156] # MUSICAL SYMBOL PARENTHESIS NOTEHEAD
+1D157 ; [*0E54.0020.0002.1D157] # MUSICAL SYMBOL VOID NOTEHEAD
+1D158 ; [*0E55.0020.0002.1D158] # MUSICAL SYMBOL NOTEHEAD BLACK
+1D159 ; [*0E56.0020.0002.1D159] # MUSICAL SYMBOL NULL NOTEHEAD
+1D15A ; [*0E57.0020.0002.1D15A] # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE
+1D15B ; [*0E58.0020.0002.1D15B] # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK
+1D15C ; [*0E59.0020.0002.1D15C] # MUSICAL SYMBOL BREVE
+1D15D ; [*0E5A.0020.0002.1D15D] # MUSICAL SYMBOL WHOLE NOTE
+1D15E ; [*0E54.0020.0002.1D157][.0000.0000.0000.1D165] # MUSICAL SYMBOL HALF NOTE; QQCN
+1D15F ; [*0E55.0020.0002.1D158][.0000.0000.0000.1D165] # MUSICAL SYMBOL QUARTER NOTE; QQCN
+1D160 ; [*0E55.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL EIGHTH NOTE; QQCN
+1D161 ; [*0E55.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL SIXTEENTH NOTE; QQCN
+1D162 ; [*0E55.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D170] # MUSICAL SYMBOL THIRTY-SECOND NOTE; QQCN
+1D163 ; [*0E55.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D171] # MUSICAL SYMBOL SIXTY-FOURTH NOTE; QQCN
+1D164 ; [*0E55.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D172] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE; QQCN
+1D165 ; [.0000.0000.0000.1D165] # MUSICAL SYMBOL COMBINING STEM
+1D166 ; [.0000.0000.0000.1D166] # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167 ; [.0000.0000.0000.1D167] # MUSICAL SYMBOL COMBINING TREMOLO-1
+1D168 ; [.0000.0000.0000.1D168] # MUSICAL SYMBOL COMBINING TREMOLO-2
+1D169 ; [.0000.0000.0000.1D169] # MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A ; [*0E5B.0020.0002.1D16A] # MUSICAL SYMBOL FINGERED TREMOLO-1
+1D16B ; [*0E5C.0020.0002.1D16B] # MUSICAL SYMBOL FINGERED TREMOLO-2
+1D16C ; [*0E5D.0020.0002.1D16C] # MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D ; [.0000.0000.0000.1D16D] # MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+1D16E ; [.0000.0000.0000.1D16E] # MUSICAL SYMBOL COMBINING FLAG-1
+1D16F ; [.0000.0000.0000.1D16F] # MUSICAL SYMBOL COMBINING FLAG-2
+1D170 ; [.0000.0000.0000.1D170] # MUSICAL SYMBOL COMBINING FLAG-3
+1D171 ; [.0000.0000.0000.1D171] # MUSICAL SYMBOL COMBINING FLAG-4
+1D172 ; [.0000.0000.0000.1D172] # MUSICAL SYMBOL COMBINING FLAG-5
+1D17B ; [.0000.0000.0000.1D17B] # MUSICAL SYMBOL COMBINING ACCENT
+1D17C ; [.0000.0000.0000.1D17C] # MUSICAL SYMBOL COMBINING STACCATO
+1D17D ; [.0000.0000.0000.1D17D] # MUSICAL SYMBOL COMBINING TENUTO
+1D17E ; [.0000.0000.0000.1D17E] # MUSICAL SYMBOL COMBINING STACCATISSIMO
+1D17F ; [.0000.0000.0000.1D17F] # MUSICAL SYMBOL COMBINING MARCATO
+1D180 ; [.0000.0000.0000.1D180] # MUSICAL SYMBOL COMBINING MARCATO-STACCATO
+1D181 ; [.0000.0000.0000.1D181] # MUSICAL SYMBOL COMBINING ACCENT-STACCATO
+1D182 ; [.0000.0000.0000.1D182] # MUSICAL SYMBOL COMBINING LOURE
+1D183 ; [*0E5E.0020.0002.1D183] # MUSICAL SYMBOL ARPEGGIATO UP
+1D184 ; [*0E5F.0020.0002.1D184] # MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185 ; [.0000.0000.0000.1D185] # MUSICAL SYMBOL COMBINING DOIT
+1D186 ; [.0000.0000.0000.1D186] # MUSICAL SYMBOL COMBINING RIP
+1D187 ; [.0000.0000.0000.1D187] # MUSICAL SYMBOL COMBINING FLIP
+1D188 ; [.0000.0000.0000.1D188] # MUSICAL SYMBOL COMBINING SMEAR
+1D189 ; [.0000.0000.0000.1D189] # MUSICAL SYMBOL COMBINING BEND
+1D18A ; [.0000.0000.0000.1D18A] # MUSICAL SYMBOL COMBINING DOUBLE TONGUE
+1D18B ; [.0000.0000.0000.1D18B] # MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C ; [*0E60.0020.0002.1D18C] # MUSICAL SYMBOL RINFORZANDO
+1D18D ; [*0E61.0020.0002.1D18D] # MUSICAL SYMBOL SUBITO
+1D18E ; [*0E62.0020.0002.1D18E] # MUSICAL SYMBOL Z
+1D18F ; [*0E63.0020.0002.1D18F] # MUSICAL SYMBOL PIANO
+1D190 ; [*0E64.0020.0002.1D190] # MUSICAL SYMBOL MEZZO
+1D191 ; [*0E65.0020.0002.1D191] # MUSICAL SYMBOL FORTE
+1D192 ; [*0E66.0020.0002.1D192] # MUSICAL SYMBOL CRESCENDO
+1D193 ; [*0E67.0020.0002.1D193] # MUSICAL SYMBOL DECRESCENDO
+1D194 ; [*0E68.0020.0002.1D194] # MUSICAL SYMBOL GRACE NOTE SLASH
+1D195 ; [*0E69.0020.0002.1D195] # MUSICAL SYMBOL GRACE NOTE NO SLASH
+1D196 ; [*0E6A.0020.0002.1D196] # MUSICAL SYMBOL TR
+1D197 ; [*0E6B.0020.0002.1D197] # MUSICAL SYMBOL TURN
+1D198 ; [*0E6C.0020.0002.1D198] # MUSICAL SYMBOL INVERTED TURN
+1D199 ; [*0E6D.0020.0002.1D199] # MUSICAL SYMBOL TURN SLASH
+1D19A ; [*0E6E.0020.0002.1D19A] # MUSICAL SYMBOL TURN UP
+1D19B ; [*0E6F.0020.0002.1D19B] # MUSICAL SYMBOL ORNAMENT STROKE-1
+1D19C ; [*0E70.0020.0002.1D19C] # MUSICAL SYMBOL ORNAMENT STROKE-2
+1D19D ; [*0E71.0020.0002.1D19D] # MUSICAL SYMBOL ORNAMENT STROKE-3
+1D19E ; [*0E72.0020.0002.1D19E] # MUSICAL SYMBOL ORNAMENT STROKE-4
+1D19F ; [*0E73.0020.0002.1D19F] # MUSICAL SYMBOL ORNAMENT STROKE-5
+1D1A0 ; [*0E74.0020.0002.1D1A0] # MUSICAL SYMBOL ORNAMENT STROKE-6
+1D1A1 ; [*0E75.0020.0002.1D1A1] # MUSICAL SYMBOL ORNAMENT STROKE-7
+1D1A2 ; [*0E76.0020.0002.1D1A2] # MUSICAL SYMBOL ORNAMENT STROKE-8
+1D1A3 ; [*0E77.0020.0002.1D1A3] # MUSICAL SYMBOL ORNAMENT STROKE-9
+1D1A4 ; [*0E78.0020.0002.1D1A4] # MUSICAL SYMBOL ORNAMENT STROKE-10
+1D1A5 ; [*0E79.0020.0002.1D1A5] # MUSICAL SYMBOL ORNAMENT STROKE-11
+1D1A6 ; [*0E7A.0020.0002.1D1A6] # MUSICAL SYMBOL HAUPTSTIMME
+1D1A7 ; [*0E7B.0020.0002.1D1A7] # MUSICAL SYMBOL NEBENSTIMME
+1D1A8 ; [*0E7C.0020.0002.1D1A8] # MUSICAL SYMBOL END OF STIMME
+1D1A9 ; [*0E7D.0020.0002.1D1A9] # MUSICAL SYMBOL DEGREE SLASH
+1D1AA ; [.0000.0000.0000.1D1AA] # MUSICAL SYMBOL COMBINING DOWN BOW
+1D1AB ; [.0000.0000.0000.1D1AB] # MUSICAL SYMBOL COMBINING UP BOW
+1D1AC ; [.0000.0000.0000.1D1AC] # MUSICAL SYMBOL COMBINING HARMONIC
+1D1AD ; [.0000.0000.0000.1D1AD] # MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D1AE ; [*0E7E.0020.0002.1D1AE] # MUSICAL SYMBOL PEDAL MARK
+1D1AF ; [*0E7F.0020.0002.1D1AF] # MUSICAL SYMBOL PEDAL UP MARK
+1D1B0 ; [*0E80.0020.0002.1D1B0] # MUSICAL SYMBOL HALF PEDAL MARK
+1D1B1 ; [*0E81.0020.0002.1D1B1] # MUSICAL SYMBOL GLISSANDO UP
+1D1B2 ; [*0E82.0020.0002.1D1B2] # MUSICAL SYMBOL GLISSANDO DOWN
+1D1B3 ; [*0E83.0020.0002.1D1B3] # MUSICAL SYMBOL WITH FINGERNAILS
+1D1B4 ; [*0E84.0020.0002.1D1B4] # MUSICAL SYMBOL DAMP
+1D1B5 ; [*0E85.0020.0002.1D1B5] # MUSICAL SYMBOL DAMP ALL
+1D1B6 ; [*0E86.0020.0002.1D1B6] # MUSICAL SYMBOL MAXIMA
+1D1B7 ; [*0E87.0020.0002.1D1B7] # MUSICAL SYMBOL LONGA
+1D1B8 ; [*0E88.0020.0002.1D1B8] # MUSICAL SYMBOL BREVIS
+1D1B9 ; [*0E89.0020.0002.1D1B9] # MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA ; [*0E8A.0020.0002.1D1BA] # MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB ; [*0E89.0020.0002.1D1B9][.0000.0000.0000.1D165] # MUSICAL SYMBOL MINIMA; QQCN
+1D1BC ; [*0E8A.0020.0002.1D1BA][.0000.0000.0000.1D165] # MUSICAL SYMBOL MINIMA BLACK; QQCN
+1D1BD ; [*0E89.0020.0002.1D1B9][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL SEMIMINIMA WHITE; QQCN
+1D1BE ; [*0E8A.0020.0002.1D1BA][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL SEMIMINIMA BLACK; QQCN
+1D1BF ; [*0E89.0020.0002.1D1B9][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL FUSA WHITE; QQCN
+1D1C0 ; [*0E8A.0020.0002.1D1BA][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL FUSA BLACK; QQCN
+1D1C1 ; [*0E8B.0020.0002.1D1C1] # MUSICAL SYMBOL LONGA PERFECTA REST
+1D1C2 ; [*0E8C.0020.0002.1D1C2] # MUSICAL SYMBOL LONGA IMPERFECTA REST
+1D1C3 ; [*0E8D.0020.0002.1D1C3] # MUSICAL SYMBOL BREVIS REST
+1D1C4 ; [*0E8E.0020.0002.1D1C4] # MUSICAL SYMBOL SEMIBREVIS REST
+1D1C5 ; [*0E8F.0020.0002.1D1C5] # MUSICAL SYMBOL MINIMA REST
+1D1C6 ; [*0E90.0020.0002.1D1C6] # MUSICAL SYMBOL SEMIMINIMA REST
+1D1C7 ; [*0E91.0020.0002.1D1C7] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA
+1D1C8 ; [*0E92.0020.0002.1D1C8] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA
+1D1C9 ; [*0E93.0020.0002.1D1C9] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1
+1D1CA ; [*0E94.0020.0002.1D1CA] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA
+1D1CB ; [*0E95.0020.0002.1D1CB] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA
+1D1CC ; [*0E96.0020.0002.1D1CC] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1
+1D1CD ; [*0E97.0020.0002.1D1CD] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2
+1D1CE ; [*0E98.0020.0002.1D1CE] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3
+1D1CF ; [*0E99.0020.0002.1D1CF] # MUSICAL SYMBOL CROIX
+1D1D0 ; [*0E9A.0020.0002.1D1D0] # MUSICAL SYMBOL GREGORIAN C CLEF
+1D1D1 ; [*0E9B.0020.0002.1D1D1] # MUSICAL SYMBOL GREGORIAN F CLEF
+1D1D2 ; [*0E9C.0020.0002.1D1D2] # MUSICAL SYMBOL SQUARE B
+1D1D3 ; [*0E9D.0020.0002.1D1D3] # MUSICAL SYMBOL VIRGA
+1D1D4 ; [*0E9E.0020.0002.1D1D4] # MUSICAL SYMBOL PODATUS
+1D1D5 ; [*0E9F.0020.0002.1D1D5] # MUSICAL SYMBOL CLIVIS
+1D1D6 ; [*0EA0.0020.0002.1D1D6] # MUSICAL SYMBOL SCANDICUS
+1D1D7 ; [*0EA1.0020.0002.1D1D7] # MUSICAL SYMBOL CLIMACUS
+1D1D8 ; [*0EA2.0020.0002.1D1D8] # MUSICAL SYMBOL TORCULUS
+1D1D9 ; [*0EA3.0020.0002.1D1D9] # MUSICAL SYMBOL PORRECTUS
+1D1DA ; [*0EA4.0020.0002.1D1DA] # MUSICAL SYMBOL PORRECTUS FLEXUS
+1D1DB ; [*0EA5.0020.0002.1D1DB] # MUSICAL SYMBOL SCANDICUS FLEXUS
+1D1DC ; [*0EA6.0020.0002.1D1DC] # MUSICAL SYMBOL TORCULUS RESUPINUS
+1D1DD ; [*0EA7.0020.0002.1D1DD] # MUSICAL SYMBOL PES SUBPUNCTIS
+1D200 ; [*0EA8.0020.0002.1D200] # GREEK VOCAL NOTATION SYMBOL-1
+1D201 ; [*0EA9.0020.0002.1D201] # GREEK VOCAL NOTATION SYMBOL-2
+1D202 ; [*0EAA.0020.0002.1D202] # GREEK VOCAL NOTATION SYMBOL-3
+1D203 ; [*0EAB.0020.0002.1D203] # GREEK VOCAL NOTATION SYMBOL-4
+1D204 ; [*0EAC.0020.0002.1D204] # GREEK VOCAL NOTATION SYMBOL-5
+1D205 ; [*0EAD.0020.0002.1D205] # GREEK VOCAL NOTATION SYMBOL-6
+1D206 ; [*0EAE.0020.0002.1D206] # GREEK VOCAL NOTATION SYMBOL-7
+1D207 ; [*0EAF.0020.0002.1D207] # GREEK VOCAL NOTATION SYMBOL-8
+1D208 ; [*0EB0.0020.0002.1D208] # GREEK VOCAL NOTATION SYMBOL-9
+1D209 ; [*0EB1.0020.0002.1D209] # GREEK VOCAL NOTATION SYMBOL-10
+1D20A ; [*0EB2.0020.0002.1D20A] # GREEK VOCAL NOTATION SYMBOL-11
+1D20B ; [*0EB3.0020.0002.1D20B] # GREEK VOCAL NOTATION SYMBOL-12
+1D20C ; [*0EB4.0020.0002.1D20C] # GREEK VOCAL NOTATION SYMBOL-13
+1D20D ; [*0EB5.0020.0002.1D20D] # GREEK VOCAL NOTATION SYMBOL-14
+1D20E ; [*0EB6.0020.0002.1D20E] # GREEK VOCAL NOTATION SYMBOL-15
+1D20F ; [*0EB7.0020.0002.1D20F] # GREEK VOCAL NOTATION SYMBOL-16
+1D210 ; [*0EB8.0020.0002.1D210] # GREEK VOCAL NOTATION SYMBOL-17
+1D211 ; [*0EB9.0020.0002.1D211] # GREEK VOCAL NOTATION SYMBOL-18
+1D212 ; [*0EBA.0020.0002.1D212] # GREEK VOCAL NOTATION SYMBOL-19
+1D213 ; [*0EBB.0020.0002.1D213] # GREEK VOCAL NOTATION SYMBOL-20
+1D214 ; [*0EBC.0020.0002.1D214] # GREEK VOCAL NOTATION SYMBOL-21
+1D215 ; [*0EBD.0020.0002.1D215] # GREEK VOCAL NOTATION SYMBOL-22
+1D216 ; [*0EBE.0020.0002.1D216] # GREEK VOCAL NOTATION SYMBOL-23
+1D217 ; [*0EBF.0020.0002.1D217] # GREEK VOCAL NOTATION SYMBOL-24
+1D218 ; [*0EC0.0020.0002.1D218] # GREEK VOCAL NOTATION SYMBOL-50
+1D219 ; [*0EC1.0020.0002.1D219] # GREEK VOCAL NOTATION SYMBOL-51
+1D21A ; [*0EC2.0020.0002.1D21A] # GREEK VOCAL NOTATION SYMBOL-52
+1D21B ; [*0EC3.0020.0002.1D21B] # GREEK VOCAL NOTATION SYMBOL-53
+1D21C ; [*0EC4.0020.0002.1D21C] # GREEK VOCAL NOTATION SYMBOL-54
+1D21D ; [*0EC5.0020.0002.1D21D] # GREEK INSTRUMENTAL NOTATION SYMBOL-1
+1D21E ; [*0EC6.0020.0002.1D21E] # GREEK INSTRUMENTAL NOTATION SYMBOL-2
+1D21F ; [*0EC7.0020.0002.1D21F] # GREEK INSTRUMENTAL NOTATION SYMBOL-4
+1D220 ; [*0EC8.0020.0002.1D220] # GREEK INSTRUMENTAL NOTATION SYMBOL-5
+1D221 ; [*0EC9.0020.0002.1D221] # GREEK INSTRUMENTAL NOTATION SYMBOL-7
+1D222 ; [*0ECA.0020.0002.1D222] # GREEK INSTRUMENTAL NOTATION SYMBOL-8
+1D223 ; [*0ECB.0020.0002.1D223] # GREEK INSTRUMENTAL NOTATION SYMBOL-11
+1D224 ; [*0ECC.0020.0002.1D224] # GREEK INSTRUMENTAL NOTATION SYMBOL-12
+1D225 ; [*0ECD.0020.0002.1D225] # GREEK INSTRUMENTAL NOTATION SYMBOL-13
+1D226 ; [*0ECE.0020.0002.1D226] # GREEK INSTRUMENTAL NOTATION SYMBOL-14
+1D227 ; [*0ECF.0020.0002.1D227] # GREEK INSTRUMENTAL NOTATION SYMBOL-17
+1D228 ; [*0ED0.0020.0002.1D228] # GREEK INSTRUMENTAL NOTATION SYMBOL-18
+1D229 ; [*0ED1.0020.0002.1D229] # GREEK INSTRUMENTAL NOTATION SYMBOL-19
+1D22A ; [*0ED2.0020.0002.1D22A] # GREEK INSTRUMENTAL NOTATION SYMBOL-23
+1D22B ; [*0ED3.0020.0002.1D22B] # GREEK INSTRUMENTAL NOTATION SYMBOL-24
+1D22C ; [*0ED4.0020.0002.1D22C] # GREEK INSTRUMENTAL NOTATION SYMBOL-25
+1D22D ; [*0ED5.0020.0002.1D22D] # GREEK INSTRUMENTAL NOTATION SYMBOL-26
+1D22E ; [*0ED6.0020.0002.1D22E] # GREEK INSTRUMENTAL NOTATION SYMBOL-27
+1D22F ; [*0ED7.0020.0002.1D22F] # GREEK INSTRUMENTAL NOTATION SYMBOL-29
+1D230 ; [*0ED8.0020.0002.1D230] # GREEK INSTRUMENTAL NOTATION SYMBOL-30
+1D231 ; [*0ED9.0020.0002.1D231] # GREEK INSTRUMENTAL NOTATION SYMBOL-32
+1D232 ; [*0EDA.0020.0002.1D232] # GREEK INSTRUMENTAL NOTATION SYMBOL-36
+1D233 ; [*0EDB.0020.0002.1D233] # GREEK INSTRUMENTAL NOTATION SYMBOL-37
+1D234 ; [*0EDC.0020.0002.1D234] # GREEK INSTRUMENTAL NOTATION SYMBOL-38
+1D235 ; [*0EDD.0020.0002.1D235] # GREEK INSTRUMENTAL NOTATION SYMBOL-39
+1D236 ; [*0EDE.0020.0002.1D236] # GREEK INSTRUMENTAL NOTATION SYMBOL-40
+1D237 ; [*0EDF.0020.0002.1D237] # GREEK INSTRUMENTAL NOTATION SYMBOL-42
+1D238 ; [*0EE0.0020.0002.1D238] # GREEK INSTRUMENTAL NOTATION SYMBOL-43
+1D239 ; [*0EE1.0020.0002.1D239] # GREEK INSTRUMENTAL NOTATION SYMBOL-45
+1D23A ; [*0EE2.0020.0002.1D23A] # GREEK INSTRUMENTAL NOTATION SYMBOL-47
+1D23B ; [*0EE3.0020.0002.1D23B] # GREEK INSTRUMENTAL NOTATION SYMBOL-48
+1D23C ; [*0EE4.0020.0002.1D23C] # GREEK INSTRUMENTAL NOTATION SYMBOL-49
+1D23D ; [*0EE5.0020.0002.1D23D] # GREEK INSTRUMENTAL NOTATION SYMBOL-50
+1D23E ; [*0EE6.0020.0002.1D23E] # GREEK INSTRUMENTAL NOTATION SYMBOL-51
+1D23F ; [*0EE7.0020.0002.1D23F] # GREEK INSTRUMENTAL NOTATION SYMBOL-52
+1D240 ; [*0EE8.0020.0002.1D240] # GREEK INSTRUMENTAL NOTATION SYMBOL-53
+1D241 ; [*0EE9.0020.0002.1D241] # GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242 ; [.0000.0000.0000.1D242] # COMBINING GREEK MUSICAL TRISEME
+1D243 ; [.0000.0000.0000.1D243] # COMBINING GREEK MUSICAL TETRASEME
+1D244 ; [.0000.0000.0000.1D244] # COMBINING GREEK MUSICAL PENTASEME
+1D245 ; [*0EEA.0020.0002.1D245] # GREEK MUSICAL LEIMMA
+1D300 ; [*0C5F.0020.0002.1D300] # MONOGRAM FOR EARTH
+1D301 ; [*0C60.0020.0002.1D301] # DIGRAM FOR HEAVENLY EARTH
+1D302 ; [*0C61.0020.0002.1D302] # DIGRAM FOR HUMAN EARTH
+1D303 ; [*0C62.0020.0002.1D303] # DIGRAM FOR EARTHLY HEAVEN
+1D304 ; [*0C63.0020.0002.1D304] # DIGRAM FOR EARTHLY HUMAN
+1D305 ; [*0C64.0020.0002.1D305] # DIGRAM FOR EARTH
+1D306 ; [*0C65.0020.0002.1D306] # TETRAGRAM FOR CENTRE
+1D307 ; [*0C66.0020.0002.1D307] # TETRAGRAM FOR FULL CIRCLE
+1D308 ; [*0C67.0020.0002.1D308] # TETRAGRAM FOR MIRED
+1D309 ; [*0C68.0020.0002.1D309] # TETRAGRAM FOR BARRIER
+1D30A ; [*0C69.0020.0002.1D30A] # TETRAGRAM FOR KEEPING SMALL
+1D30B ; [*0C6A.0020.0002.1D30B] # TETRAGRAM FOR CONTRARIETY
+1D30C ; [*0C6B.0020.0002.1D30C] # TETRAGRAM FOR ASCENT
+1D30D ; [*0C6C.0020.0002.1D30D] # TETRAGRAM FOR OPPOSITION
+1D30E ; [*0C6D.0020.0002.1D30E] # TETRAGRAM FOR BRANCHING OUT
+1D30F ; [*0C6E.0020.0002.1D30F] # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310 ; [*0C6F.0020.0002.1D310] # TETRAGRAM FOR DIVERGENCE
+1D311 ; [*0C70.0020.0002.1D311] # TETRAGRAM FOR YOUTHFULNESS
+1D312 ; [*0C71.0020.0002.1D312] # TETRAGRAM FOR INCREASE
+1D313 ; [*0C72.0020.0002.1D313] # TETRAGRAM FOR PENETRATION
+1D314 ; [*0C73.0020.0002.1D314] # TETRAGRAM FOR REACH
+1D315 ; [*0C74.0020.0002.1D315] # TETRAGRAM FOR CONTACT
+1D316 ; [*0C75.0020.0002.1D316] # TETRAGRAM FOR HOLDING BACK
+1D317 ; [*0C76.0020.0002.1D317] # TETRAGRAM FOR WAITING
+1D318 ; [*0C77.0020.0002.1D318] # TETRAGRAM FOR FOLLOWING
+1D319 ; [*0C78.0020.0002.1D319] # TETRAGRAM FOR ADVANCE
+1D31A ; [*0C79.0020.0002.1D31A] # TETRAGRAM FOR RELEASE
+1D31B ; [*0C7A.0020.0002.1D31B] # TETRAGRAM FOR RESISTANCE
+1D31C ; [*0C7B.0020.0002.1D31C] # TETRAGRAM FOR EASE
+1D31D ; [*0C7C.0020.0002.1D31D] # TETRAGRAM FOR JOY
+1D31E ; [*0C7D.0020.0002.1D31E] # TETRAGRAM FOR CONTENTION
+1D31F ; [*0C7E.0020.0002.1D31F] # TETRAGRAM FOR ENDEAVOUR
+1D320 ; [*0C7F.0020.0002.1D320] # TETRAGRAM FOR DUTIES
+1D321 ; [*0C80.0020.0002.1D321] # TETRAGRAM FOR CHANGE
+1D322 ; [*0C81.0020.0002.1D322] # TETRAGRAM FOR DECISIVENESS
+1D323 ; [*0C82.0020.0002.1D323] # TETRAGRAM FOR BOLD RESOLUTION
+1D324 ; [*0C83.0020.0002.1D324] # TETRAGRAM FOR PACKING
+1D325 ; [*0C84.0020.0002.1D325] # TETRAGRAM FOR LEGION
+1D326 ; [*0C85.0020.0002.1D326] # TETRAGRAM FOR CLOSENESS
+1D327 ; [*0C86.0020.0002.1D327] # TETRAGRAM FOR KINSHIP
+1D328 ; [*0C87.0020.0002.1D328] # TETRAGRAM FOR GATHERING
+1D329 ; [*0C88.0020.0002.1D329] # TETRAGRAM FOR STRENGTH
+1D32A ; [*0C89.0020.0002.1D32A] # TETRAGRAM FOR PURITY
+1D32B ; [*0C8A.0020.0002.1D32B] # TETRAGRAM FOR FULLNESS
+1D32C ; [*0C8B.0020.0002.1D32C] # TETRAGRAM FOR RESIDENCE
+1D32D ; [*0C8C.0020.0002.1D32D] # TETRAGRAM FOR LAW OR MODEL
+1D32E ; [*0C8D.0020.0002.1D32E] # TETRAGRAM FOR RESPONSE
+1D32F ; [*0C8E.0020.0002.1D32F] # TETRAGRAM FOR GOING TO MEET
+1D330 ; [*0C8F.0020.0002.1D330] # TETRAGRAM FOR ENCOUNTERS
+1D331 ; [*0C90.0020.0002.1D331] # TETRAGRAM FOR STOVE
+1D332 ; [*0C91.0020.0002.1D332] # TETRAGRAM FOR GREATNESS
+1D333 ; [*0C92.0020.0002.1D333] # TETRAGRAM FOR ENLARGEMENT
+1D334 ; [*0C93.0020.0002.1D334] # TETRAGRAM FOR PATTERN
+1D335 ; [*0C94.0020.0002.1D335] # TETRAGRAM FOR RITUAL
+1D336 ; [*0C95.0020.0002.1D336] # TETRAGRAM FOR FLIGHT
+1D337 ; [*0C96.0020.0002.1D337] # TETRAGRAM FOR VASTNESS OR WASTING
+1D338 ; [*0C97.0020.0002.1D338] # TETRAGRAM FOR CONSTANCY
+1D339 ; [*0C98.0020.0002.1D339] # TETRAGRAM FOR MEASURE
+1D33A ; [*0C99.0020.0002.1D33A] # TETRAGRAM FOR ETERNITY
+1D33B ; [*0C9A.0020.0002.1D33B] # TETRAGRAM FOR UNITY
+1D33C ; [*0C9B.0020.0002.1D33C] # TETRAGRAM FOR DIMINISHMENT
+1D33D ; [*0C9C.0020.0002.1D33D] # TETRAGRAM FOR CLOSED MOUTH
+1D33E ; [*0C9D.0020.0002.1D33E] # TETRAGRAM FOR GUARDEDNESS
+1D33F ; [*0C9E.0020.0002.1D33F] # TETRAGRAM FOR GATHERING IN
+1D340 ; [*0C9F.0020.0002.1D340] # TETRAGRAM FOR MASSING
+1D341 ; [*0CA0.0020.0002.1D341] # TETRAGRAM FOR ACCUMULATION
+1D342 ; [*0CA1.0020.0002.1D342] # TETRAGRAM FOR EMBELLISHMENT
+1D343 ; [*0CA2.0020.0002.1D343] # TETRAGRAM FOR DOUBT
+1D344 ; [*0CA3.0020.0002.1D344] # TETRAGRAM FOR WATCH
+1D345 ; [*0CA4.0020.0002.1D345] # TETRAGRAM FOR SINKING
+1D346 ; [*0CA5.0020.0002.1D346] # TETRAGRAM FOR INNER
+1D347 ; [*0CA6.0020.0002.1D347] # TETRAGRAM FOR DEPARTURE
+1D348 ; [*0CA7.0020.0002.1D348] # TETRAGRAM FOR DARKENING
+1D349 ; [*0CA8.0020.0002.1D349] # TETRAGRAM FOR DIMMING
+1D34A ; [*0CA9.0020.0002.1D34A] # TETRAGRAM FOR EXHAUSTION
+1D34B ; [*0CAA.0020.0002.1D34B] # TETRAGRAM FOR SEVERANCE
+1D34C ; [*0CAB.0020.0002.1D34C] # TETRAGRAM FOR STOPPAGE
+1D34D ; [*0CAC.0020.0002.1D34D] # TETRAGRAM FOR HARDNESS
+1D34E ; [*0CAD.0020.0002.1D34E] # TETRAGRAM FOR COMPLETION
+1D34F ; [*0CAE.0020.0002.1D34F] # TETRAGRAM FOR CLOSURE
+1D350 ; [*0CAF.0020.0002.1D350] # TETRAGRAM FOR FAILURE
+1D351 ; [*0CB0.0020.0002.1D351] # TETRAGRAM FOR AGGRAVATION
+1D352 ; [*0CB1.0020.0002.1D352] # TETRAGRAM FOR COMPLIANCE
+1D353 ; [*0CB2.0020.0002.1D353] # TETRAGRAM FOR ON THE VERGE
+1D354 ; [*0CB3.0020.0002.1D354] # TETRAGRAM FOR DIFFICULTIES
+1D355 ; [*0CB4.0020.0002.1D355] # TETRAGRAM FOR LABOURING
+1D356 ; [*0CB5.0020.0002.1D356] # TETRAGRAM FOR FOSTERING
+1D369 ; [*0F90.0020.0002.1D369] # COUNTING ROD TENS DIGIT ONE
+1D36A ; [*0F91.0020.0002.1D36A] # COUNTING ROD TENS DIGIT TWO
+1D36B ; [*0F92.0020.0002.1D36B] # COUNTING ROD TENS DIGIT THREE
+1D36C ; [*0F93.0020.0002.1D36C] # COUNTING ROD TENS DIGIT FOUR
+1D36D ; [*0F94.0020.0002.1D36D] # COUNTING ROD TENS DIGIT FIVE
+1D36E ; [*0F95.0020.0002.1D36E] # COUNTING ROD TENS DIGIT SIX
+1D36F ; [*0F96.0020.0002.1D36F] # COUNTING ROD TENS DIGIT SEVEN
+1D370 ; [*0F97.0020.0002.1D370] # COUNTING ROD TENS DIGIT EIGHT
+1D371 ; [*0F98.0020.0002.1D371] # COUNTING ROD TENS DIGIT NINE
+1D6C1 ; [*04AE.0020.0005.1D6C1] # MATHEMATICAL BOLD NABLA; QQK
+1D6DB ; [*04AA.0020.0005.1D6DB] # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL; QQK
+1D6FB ; [*04AE.0020.0005.1D6FB] # MATHEMATICAL ITALIC NABLA; QQK
+1D715 ; [*04AA.0020.0005.1D715] # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL; QQK
+1D735 ; [*04AE.0020.0005.1D735] # MATHEMATICAL BOLD ITALIC NABLA; QQK
+1D74F ; [*04AA.0020.0005.1D74F] # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL; QQK
+1D76F ; [*04AE.0020.0005.1D76F] # MATHEMATICAL SANS-SERIF BOLD NABLA; QQK
+1D789 ; [*04AA.0020.0005.1D789] # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL; QQK
+1D7A9 ; [*04AE.0020.0005.1D7A9] # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA; QQK
+1D7C3 ; [*04AA.0020.0005.1D7C3] # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL; QQK
+0332 ; [.0000.0021.0002.0332] # COMBINING LOW LINE
+0313 ; [.0000.0022.0002.0313] # COMBINING COMMA ABOVE
+0343 ; [.0000.0022.0002.0343] # COMBINING GREEK KORONIS; QQC
+0314 ; [.0000.002A.0002.0314] # COMBINING REVERSED COMMA ABOVE
+0301 ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
+0341 ; [.0000.0032.0002.0341] # COMBINING ACUTE TONE MARK; QQC
+0300 ; [.0000.0035.0002.0300] # COMBINING GRAVE ACCENT
+0340 ; [.0000.0035.0002.0340] # COMBINING GRAVE TONE MARK; QQC
+0306 ; [.0000.0037.0002.0306] # COMBINING BREVE
+0302 ; [.0000.003C.0002.0302] # COMBINING CIRCUMFLEX ACCENT
+030C ; [.0000.0041.0002.030C] # COMBINING CARON
+030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
+0342 ; [.0000.0045.0002.0342] # COMBINING GREEK PERISPOMENI
+0308 ; [.0000.0047.0002.0308] # COMBINING DIAERESIS
+0344 ; [.0000.0047.0002.0308][.0000.0032.0002.0301] # COMBINING GREEK DIALYTIKA TONOS; QQCM
+030B ; [.0000.004D.0002.030B] # COMBINING DOUBLE ACUTE ACCENT
+0303 ; [.0000.004E.0002.0303] # COMBINING TILDE
+0307 ; [.0000.0052.0002.0307] # COMBINING DOT ABOVE
+0338 ; [.0000.0054.0002.0338] # COMBINING LONG SOLIDUS OVERLAY
+0327 ; [.0000.0056.0002.0327] # COMBINING CEDILLA
+0328 ; [.0000.0059.0002.0328] # COMBINING OGONEK
+0304 ; [.0000.005B.0002.0304] # COMBINING MACRON
+0305 ; [.0000.005F.0002.0305] # COMBINING OVERLINE
+0309 ; [.0000.0060.0002.0309] # COMBINING HOOK ABOVE
+030D ; [.0000.0061.0002.030D] # COMBINING VERTICAL LINE ABOVE
+030E ; [.0000.0062.0002.030E] # COMBINING DOUBLE VERTICAL LINE ABOVE
+030F ; [.0000.0063.0002.030F] # COMBINING DOUBLE GRAVE ACCENT
+0310 ; [.0000.0064.0002.0310] # COMBINING CANDRABINDU
+0311 ; [.0000.0065.0002.0311] # COMBINING INVERTED BREVE
+0312 ; [.0000.0066.0002.0312] # COMBINING TURNED COMMA ABOVE
+0315 ; [.0000.0067.0002.0315] # COMBINING COMMA ABOVE RIGHT
+0316 ; [.0000.0068.0002.0316] # COMBINING GRAVE ACCENT BELOW
+0317 ; [.0000.0069.0002.0317] # COMBINING ACUTE ACCENT BELOW
+0318 ; [.0000.006A.0002.0318] # COMBINING LEFT TACK BELOW
+0319 ; [.0000.006B.0002.0319] # COMBINING RIGHT TACK BELOW
+031A ; [.0000.006C.0002.031A] # COMBINING LEFT ANGLE ABOVE
+031B ; [.0000.006D.0002.031B] # COMBINING HORN
+031C ; [.0000.0073.0002.031C] # COMBINING LEFT HALF RING BELOW
+031D ; [.0000.0074.0002.031D] # COMBINING UP TACK BELOW
+031E ; [.0000.0075.0002.031E] # COMBINING DOWN TACK BELOW
+031F ; [.0000.0076.0002.031F] # COMBINING PLUS SIGN BELOW
+0320 ; [.0000.0077.0002.0320] # COMBINING MINUS SIGN BELOW
+0321 ; [.0000.0078.0002.0321] # COMBINING PALATALIZED HOOK BELOW
+0322 ; [.0000.0079.0002.0322] # COMBINING RETROFLEX HOOK BELOW
+0323 ; [.0000.007A.0002.0323] # COMBINING DOT BELOW
+0324 ; [.0000.007F.0002.0324] # COMBINING DIAERESIS BELOW
+0325 ; [.0000.0080.0002.0325] # COMBINING RING BELOW
+0326 ; [.0000.0081.0002.0326] # COMBINING COMMA BELOW
+0329 ; [.0000.0082.0002.0329] # COMBINING VERTICAL LINE BELOW
+032A ; [.0000.0083.0002.032A] # COMBINING BRIDGE BELOW
+032B ; [.0000.0084.0002.032B] # COMBINING INVERTED DOUBLE ARCH BELOW
+032C ; [.0000.0085.0002.032C] # COMBINING CARON BELOW
+032D ; [.0000.0086.0002.032D] # COMBINING CIRCUMFLEX ACCENT BELOW
+032E ; [.0000.0087.0002.032E] # COMBINING BREVE BELOW
+032F ; [.0000.0088.0002.032F] # COMBINING INVERTED BREVE BELOW
+0330 ; [.0000.0089.0002.0330] # COMBINING TILDE BELOW
+0331 ; [.0000.008A.0002.0331] # COMBINING MACRON BELOW
+0333 ; [.0000.008B.0002.0333] # COMBINING DOUBLE LOW LINE
+0334 ; [.0000.008C.0002.0334] # COMBINING TILDE OVERLAY
+0335 ; [.0000.008D.0002.0335] # COMBINING SHORT STROKE OVERLAY
+0336 ; [.0000.008E.0002.0336] # COMBINING LONG STROKE OVERLAY
+0337 ; [.0000.008F.0002.0337] # COMBINING SHORT SOLIDUS OVERLAY
+0339 ; [.0000.0090.0002.0339] # COMBINING RIGHT HALF RING BELOW
+033A ; [.0000.0091.0002.033A] # COMBINING INVERTED BRIDGE BELOW
+033B ; [.0000.0092.0002.033B] # COMBINING SQUARE BELOW
+033C ; [.0000.0093.0002.033C] # COMBINING SEAGULL BELOW
+033D ; [.0000.0094.0002.033D] # COMBINING X ABOVE
+033E ; [.0000.0095.0002.033E] # COMBINING VERTICAL TILDE
+033F ; [.0000.0096.0002.033F] # COMBINING DOUBLE OVERLINE
+0345 ; [.0000.0097.0002.0345] # COMBINING GREEK YPOGEGRAMMENI
+0346 ; [.0000.0098.0002.0346] # COMBINING BRIDGE ABOVE
+0347 ; [.0000.0099.0002.0347] # COMBINING EQUALS SIGN BELOW
+0348 ; [.0000.009A.0002.0348] # COMBINING DOUBLE VERTICAL LINE BELOW
+0349 ; [.0000.009B.0002.0349] # COMBINING LEFT ANGLE BELOW
+034A ; [.0000.009C.0002.034A] # COMBINING NOT TILDE ABOVE
+034B ; [.0000.009D.0002.034B] # COMBINING HOMOTHETIC ABOVE
+034C ; [.0000.009E.0002.034C] # COMBINING ALMOST EQUAL TO ABOVE
+034D ; [.0000.009F.0002.034D] # COMBINING LEFT RIGHT ARROW BELOW
+034E ; [.0000.00A0.0002.034E] # COMBINING UPWARDS ARROW BELOW
+0350 ; [.0000.00A1.0002.0350] # COMBINING RIGHT ARROWHEAD ABOVE
+0351 ; [.0000.00A2.0002.0351] # COMBINING LEFT HALF RING ABOVE
+0352 ; [.0000.00A3.0002.0352] # COMBINING FERMATA
+0353 ; [.0000.00A4.0002.0353] # COMBINING X BELOW
+0354 ; [.0000.00A5.0002.0354] # COMBINING LEFT ARROWHEAD BELOW
+0355 ; [.0000.00A6.0002.0355] # COMBINING RIGHT ARROWHEAD BELOW
+0356 ; [.0000.00A7.0002.0356] # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357 ; [.0000.00A8.0002.0357] # COMBINING RIGHT HALF RING ABOVE
+0358 ; [.0000.00A9.0002.0358] # COMBINING DOT ABOVE RIGHT
+0359 ; [.0000.00AA.0002.0359] # COMBINING ASTERISK BELOW
+035A ; [.0000.00AB.0002.035A] # COMBINING DOUBLE RING BELOW
+035B ; [.0000.00AC.0002.035B] # COMBINING ZIGZAG ABOVE
+035C ; [.0000.00AD.0002.035C] # COMBINING DOUBLE BREVE BELOW
+035D ; [.0000.00AE.0002.035D] # COMBINING DOUBLE BREVE
+035E ; [.0000.00AF.0002.035E] # COMBINING DOUBLE MACRON
+035F ; [.0000.00B0.0002.035F] # COMBINING DOUBLE MACRON BELOW
+0360 ; [.0000.00B1.0002.0360] # COMBINING DOUBLE TILDE
+FE22 ; [.0000.00B1.0002.FE22] # COMBINING DOUBLE TILDE LEFT HALF; QQC
+0361 ; [.0000.00B2.0002.0361] # COMBINING DOUBLE INVERTED BREVE
+FE20 ; [.0000.00B2.0002.FE20] # COMBINING LIGATURE LEFT HALF; QQC
+0362 ; [.0000.00B3.0002.0362] # COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+1DC0 ; [.0000.00B4.0002.1DC0] # COMBINING DOTTED GRAVE ACCENT
+1DC1 ; [.0000.00B5.0002.1DC1] # COMBINING DOTTED ACUTE ACCENT
+1DC2 ; [.0000.00B6.0002.1DC2] # COMBINING SNAKE BELOW
+1DC3 ; [.0000.00B7.0002.1DC3] # COMBINING SUSPENSION MARK
+1DC4 ; [.0000.00B8.0002.1DC4] # COMBINING MACRON-ACUTE
+1DC5 ; [.0000.00B9.0002.1DC5] # COMBINING GRAVE-MACRON
+1DC6 ; [.0000.00BA.0002.1DC6] # COMBINING MACRON-GRAVE
+1DC7 ; [.0000.00BB.0002.1DC7] # COMBINING ACUTE-MACRON
+1DC8 ; [.0000.00BC.0002.1DC8] # COMBINING GRAVE-ACUTE-GRAVE
+1DC9 ; [.0000.00BD.0002.1DC9] # COMBINING ACUTE-GRAVE-ACUTE
+1DCA ; [.0000.00BE.0002.1DCA] # COMBINING LATIN SMALL LETTER R BELOW
+1DFE ; [.0000.00BF.0002.1DFE] # COMBINING LEFT ARROWHEAD ABOVE
+1DFF ; [.0000.00C0.0002.1DFF] # COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+0483 ; [.0000.00C1.0002.0483] # COMBINING CYRILLIC TITLO
+0484 ; [.0000.00C2.0002.0484] # COMBINING CYRILLIC PALATALIZATION
+0485 ; [.0000.00C3.0002.0485] # COMBINING CYRILLIC DASIA PNEUMATA
+0486 ; [.0000.00C4.0002.0486] # COMBINING CYRILLIC PSILI PNEUMATA
+05B0 ; [.0000.00C5.0002.05B0] # HEBREW POINT SHEVA
+05B1 ; [.0000.00C6.0002.05B1] # HEBREW POINT HATAF SEGOL
+05B2 ; [.0000.00C7.0002.05B2] # HEBREW POINT HATAF PATAH
+05B3 ; [.0000.00C8.0002.05B3] # HEBREW POINT HATAF QAMATS
+05B4 ; [.0000.00C9.0002.05B4] # HEBREW POINT HIRIQ
+05B5 ; [.0000.00CA.0002.05B5] # HEBREW POINT TSERE
+05B6 ; [.0000.00CB.0002.05B6] # HEBREW POINT SEGOL
+05B7 ; [.0000.00CC.0002.05B7] # HEBREW POINT PATAH
+05B8 ; [.0000.00CD.0002.05B8] # HEBREW POINT QAMATS
+05C7 ; [.0000.00CE.0002.05C7] # HEBREW POINT QAMATS QATAN
+05B9 ; [.0000.00CF.0002.05B9] # HEBREW POINT HOLAM
+05BA ; [.0000.00D0.0002.05BA] # HEBREW POINT HOLAM HASER FOR VAV
+05BB ; [.0000.00D1.0002.05BB] # HEBREW POINT QUBUTS
+05C2 ; [.0000.00D2.0002.05C2] # HEBREW POINT SIN DOT
+05C1 ; [.0000.00D3.0002.05C1] # HEBREW POINT SHIN DOT
+05BC ; [.0000.00D4.0002.05BC] # HEBREW POINT DAGESH OR MAPIQ
+05BF ; [.0000.00D7.0002.05BF] # HEBREW POINT RAFE
+FB1E ; [.0000.00D8.0002.FB1E] # HEBREW POINT JUDEO-SPANISH VARIKA
+064B ; [.0000.00D9.0002.064B] # ARABIC FATHATAN
+FE71 ; [.0000.00D9.0018.FE71] # ARABIC TATWEEL WITH FATHATAN ABOVE; QQK
+FE70 ; [.0000.00D9.001A.FE70] # ARABIC FATHATAN ISOLATED FORM; QQK
+064C ; [.0000.00DA.0002.064C] # ARABIC DAMMATAN
+FE72 ; [.0000.00DA.001A.FE72] # ARABIC DAMMATAN ISOLATED FORM; QQK
+064D ; [.0000.00DC.0002.064D] # ARABIC KASRATAN
+FE74 ; [.0000.00DC.001A.FE74] # ARABIC KASRATAN ISOLATED FORM; QQK
+064E ; [.0000.00DE.0002.064E] # ARABIC FATHA
+FE77 ; [.0000.00DE.0018.FE77] # ARABIC FATHA MEDIAL FORM; QQK
+FE76 ; [.0000.00DE.001A.FE76] # ARABIC FATHA ISOLATED FORM; QQK
+064F ; [.0000.00E0.0002.064F] # ARABIC DAMMA
+FE79 ; [.0000.00E0.0018.FE79] # ARABIC DAMMA MEDIAL FORM; QQK
+FE78 ; [.0000.00E0.001A.FE78] # ARABIC DAMMA ISOLATED FORM; QQK
+0650 ; [.0000.00E2.0002.0650] # ARABIC KASRA
+FE7B ; [.0000.00E2.0018.FE7B] # ARABIC KASRA MEDIAL FORM; QQK
+FE7A ; [.0000.00E2.001A.FE7A] # ARABIC KASRA ISOLATED FORM; QQK
+0651 ; [.0000.00E4.0002.0651] # ARABIC SHADDA
+FCF2 ; [.0000.00E4.0018.FCF2] # ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM; QQKM
+FCF3 ; [.0000.00E4.0018.FCF3] # ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM; QQKM
+FCF4 ; [.0000.00E4.0018.FCF4] # ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM; QQKM
+FE7D ; [.0000.00E4.0018.FE7D] # ARABIC SHADDA MEDIAL FORM; QQK
+FC5E ; [.0000.00E4.001A.FC5E] # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM; QQKM
+FC5F ; [.0000.00E4.001A.FC5F] # ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM; QQKM
+FC60 ; [.0000.00E4.001A.FC60] # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM; QQKM
+FC61 ; [.0000.00E4.001A.FC61] # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM; QQKM
+FC62 ; [.0000.00E4.001A.FC62] # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM; QQKM
+FE7C ; [.0000.00E4.001A.FE7C] # ARABIC SHADDA ISOLATED FORM; QQK
+FC63 ; [.0000.00E4.001A.FC63][.0000.00F3.001A.FC63] # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+0652 ; [.0000.00E6.0002.0652] # ARABIC SUKUN
+FE7F ; [.0000.00E6.0018.FE7F] # ARABIC SUKUN MEDIAL FORM; QQK
+FE7E ; [.0000.00E6.001A.FE7E] # ARABIC SUKUN ISOLATED FORM; QQK
+0653 ; [.0000.00E7.0002.0653] # ARABIC MADDAH ABOVE
+0654 ; [.0000.00E8.0002.0654] # ARABIC HAMZA ABOVE
+0655 ; [.0000.00E9.0002.0655] # ARABIC HAMZA BELOW
+0656 ; [.0000.00EA.0002.0656] # ARABIC SUBSCRIPT ALEF
+0657 ; [.0000.00EB.0002.0657] # ARABIC INVERTED DAMMA
+0658 ; [.0000.00EC.0002.0658] # ARABIC MARK NOON GHUNNA
+0659 ; [.0000.00ED.0002.0659] # ARABIC ZWARAKAY
+065A ; [.0000.00EE.0002.065A] # ARABIC VOWEL SIGN SMALL V ABOVE
+065B ; [.0000.00EF.0002.065B] # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
+065C ; [.0000.00F0.0002.065C] # ARABIC VOWEL SIGN DOT BELOW
+065D ; [.0000.00F1.0002.065D] # ARABIC REVERSED DAMMA
+065E ; [.0000.00F2.0002.065E] # ARABIC FATHA WITH TWO DOTS
+0670 ; [.0000.00F3.0002.0670] # ARABIC LETTER SUPERSCRIPT ALEF
+0711 ; [.0000.00F4.0002.0711] # SYRIAC LETTER SUPERSCRIPT ALAPH
+0730 ; [.0000.00F5.0002.0730] # SYRIAC PTHAHA ABOVE
+0731 ; [.0000.00F6.0002.0731] # SYRIAC PTHAHA BELOW
+0732 ; [.0000.00F7.0002.0732] # SYRIAC PTHAHA DOTTED
+0733 ; [.0000.00F8.0002.0733] # SYRIAC ZQAPHA ABOVE
+0734 ; [.0000.00F9.0002.0734] # SYRIAC ZQAPHA BELOW
+0735 ; [.0000.00FA.0002.0735] # SYRIAC ZQAPHA DOTTED
+0736 ; [.0000.00FB.0002.0736] # SYRIAC RBASA ABOVE
+0737 ; [.0000.00FC.0002.0737] # SYRIAC RBASA BELOW
+0738 ; [.0000.00FD.0002.0738] # SYRIAC DOTTED ZLAMA HORIZONTAL
+0739 ; [.0000.00FE.0002.0739] # SYRIAC DOTTED ZLAMA ANGULAR
+073A ; [.0000.00FF.0002.073A] # SYRIAC HBASA ABOVE
+073B ; [.0000.0100.0002.073B] # SYRIAC HBASA BELOW
+073C ; [.0000.0101.0002.073C] # SYRIAC HBASA-ESASA DOTTED
+073D ; [.0000.0102.0002.073D] # SYRIAC ESASA ABOVE
+073E ; [.0000.0103.0002.073E] # SYRIAC ESASA BELOW
+073F ; [.0000.0104.0002.073F] # SYRIAC RWAHA
+0740 ; [.0000.0105.0002.0740] # SYRIAC FEMININE DOT
+0741 ; [.0000.0106.0002.0741] # SYRIAC QUSHSHAYA
+0742 ; [.0000.0107.0002.0742] # SYRIAC RUKKAKHA
+0743 ; [.0000.0108.0002.0743] # SYRIAC TWO VERTICAL DOTS ABOVE
+0744 ; [.0000.0109.0002.0744] # SYRIAC TWO VERTICAL DOTS BELOW
+0745 ; [.0000.010A.0002.0745] # SYRIAC THREE DOTS ABOVE
+0746 ; [.0000.010B.0002.0746] # SYRIAC THREE DOTS BELOW
+0747 ; [.0000.010C.0002.0747] # SYRIAC OBLIQUE LINE ABOVE
+0748 ; [.0000.010D.0002.0748] # SYRIAC OBLIQUE LINE BELOW
+0749 ; [.0000.010E.0002.0749] # SYRIAC MUSIC
+074A ; [.0000.010F.0002.074A] # SYRIAC BARREKH
+07EB ; [.0000.0110.0002.07EB] # NKO COMBINING SHORT HIGH TONE
+07EC ; [.0000.0111.0002.07EC] # NKO COMBINING SHORT LOW TONE
+07ED ; [.0000.0112.0002.07ED] # NKO COMBINING SHORT RISING TONE
+07EE ; [.0000.0113.0002.07EE] # NKO COMBINING LONG DESCENDING TONE
+07EF ; [.0000.0114.0002.07EF] # NKO COMBINING LONG HIGH TONE
+07F0 ; [.0000.0115.0002.07F0] # NKO COMBINING LONG LOW TONE
+07F1 ; [.0000.0116.0002.07F1] # NKO COMBINING LONG RISING TONE
+07F2 ; [.0000.0117.0002.07F2] # NKO COMBINING NASALIZATION MARK
+07F3 ; [.0000.0118.0002.07F3] # NKO COMBINING DOUBLE DOT ABOVE
+093C ; [.0000.0119.0002.093C] # DEVANAGARI SIGN NUKTA
+0901 ; [.0000.011A.0002.0901] # DEVANAGARI SIGN CANDRABINDU
+0902 ; [.0000.011B.0002.0902] # DEVANAGARI SIGN ANUSVARA
+0903 ; [.0000.011C.0002.0903] # DEVANAGARI SIGN VISARGA
+0951 ; [.0000.011D.0002.0951] # DEVANAGARI STRESS SIGN UDATTA
+0952 ; [.0000.011E.0002.0952] # DEVANAGARI STRESS SIGN ANUDATTA
+0953 ; [.0000.011F.0002.0953] # DEVANAGARI GRAVE ACCENT
+0954 ; [.0000.0120.0002.0954] # DEVANAGARI ACUTE ACCENT
+09BC ; [.0000.0121.0002.09BC] # BENGALI SIGN NUKTA
+0981 ; [.0000.0122.0002.0981] # BENGALI SIGN CANDRABINDU
+0982 ; [.0000.0123.0002.0982] # BENGALI SIGN ANUSVARA
+0983 ; [.0000.0124.0002.0983] # BENGALI SIGN VISARGA
+0A3C ; [.0000.0125.0002.0A3C] # GURMUKHI SIGN NUKTA
+0A01 ; [.0000.0126.0002.0A01] # GURMUKHI SIGN ADAK BINDI
+0A02 ; [.0000.0127.0002.0A02] # GURMUKHI SIGN BINDI
+0A03 ; [.0000.0128.0002.0A03] # GURMUKHI SIGN VISARGA
+0A70 ; [.0000.0129.0002.0A70] # GURMUKHI TIPPI
+0A71 ; [.0000.012A.0002.0A71] # GURMUKHI ADDAK
+0ABC ; [.0000.012B.0002.0ABC] # GUJARATI SIGN NUKTA
+0A81 ; [.0000.012C.0002.0A81] # GUJARATI SIGN CANDRABINDU
+0A82 ; [.0000.012D.0002.0A82] # GUJARATI SIGN ANUSVARA
+0A83 ; [.0000.012E.0002.0A83] # GUJARATI SIGN VISARGA
+0B3C ; [.0000.012F.0002.0B3C] # ORIYA SIGN NUKTA
+0B01 ; [.0000.0130.0002.0B01] # ORIYA SIGN CANDRABINDU
+0B02 ; [.0000.0131.0002.0B02] # ORIYA SIGN ANUSVARA
+0B03 ; [.0000.0132.0002.0B03] # ORIYA SIGN VISARGA
+0B82 ; [.0000.0133.0002.0B82] # TAMIL SIGN ANUSVARA
+0C01 ; [.0000.0134.0002.0C01] # TELUGU SIGN CANDRABINDU
+0C02 ; [.0000.0135.0002.0C02] # TELUGU SIGN ANUSVARA
+0C03 ; [.0000.0136.0002.0C03] # TELUGU SIGN VISARGA
+0CBC ; [.0000.0137.0002.0CBC] # KANNADA SIGN NUKTA
+0C82 ; [.0000.0138.0002.0C82] # KANNADA SIGN ANUSVARA
+0C83 ; [.0000.0139.0002.0C83] # KANNADA SIGN VISARGA
+0D02 ; [.0000.013A.0002.0D02] # MALAYALAM SIGN ANUSVARA
+0D03 ; [.0000.013B.0002.0D03] # MALAYALAM SIGN VISARGA
+0D82 ; [.0000.013C.0002.0D82] # SINHALA SIGN ANUSVARAYA
+0D83 ; [.0000.013D.0002.0D83] # SINHALA SIGN VISARGAYA
+1B34 ; [.0000.013E.0002.1B34] # BALINESE SIGN REREKAN
+1B00 ; [.0000.013F.0002.1B00] # BALINESE SIGN ULU RICEM
+1B01 ; [.0000.0140.0002.1B01] # BALINESE SIGN ULU CANDRA
+1B02 ; [.0000.0141.0002.1B02] # BALINESE SIGN CECEK
+1B03 ; [.0000.0142.0002.1B03] # BALINESE SIGN SURANG
+1B04 ; [.0000.0143.0002.1B04] # BALINESE SIGN BISAH
+A80B ; [.0000.0144.0002.A80B] # SYLOTI NAGRI SIGN ANUSVARA
+10A0D ; [.0000.0145.0002.10A0D] # KHAROSHTHI SIGN DOUBLE RING BELOW
+10A0E ; [.0000.0146.0002.10A0E] # KHAROSHTHI SIGN ANUSVARA
+10A0F ; [.0000.0147.0002.10A0F] # KHAROSHTHI SIGN VISARGA
+10A38 ; [.0000.0148.0002.10A38] # KHAROSHTHI SIGN BAR ABOVE
+10A39 ; [.0000.0149.0002.10A39] # KHAROSHTHI SIGN CAUDA
+10A3A ; [.0000.014A.0002.10A3A] # KHAROSHTHI SIGN DOT BELOW
+0E4E ; [.0000.014B.0002.0E4E] # THAI CHARACTER YAMAKKAN
+0E47 ; [.0000.014C.0002.0E47] # THAI CHARACTER MAITAIKHU
+0E48 ; [.0000.014D.0002.0E48] # THAI CHARACTER MAI EK
+0E49 ; [.0000.014E.0002.0E49] # THAI CHARACTER MAI THO
+0E4A ; [.0000.014F.0002.0E4A] # THAI CHARACTER MAI TRI
+0E4B ; [.0000.0150.0002.0E4B] # THAI CHARACTER MAI CHATTAWA
+0E4C ; [.0000.0151.0002.0E4C] # THAI CHARACTER THANTHAKHAT
+0E4D ; [.0000.0152.0002.0E4D] # THAI CHARACTER NIKHAHIT
+0EC8 ; [.0000.0153.0002.0EC8] # LAO TONE MAI EK
+0EC9 ; [.0000.0154.0002.0EC9] # LAO TONE MAI THO
+0ECA ; [.0000.0155.0002.0ECA] # LAO TONE MAI TI
+0ECB ; [.0000.0156.0002.0ECB] # LAO TONE MAI CATAWA
+0ECC ; [.0000.0157.0002.0ECC] # LAO CANCELLATION MARK
+0ECD ; [.0000.0158.0002.0ECD] # LAO NIGGAHITA
+0F39 ; [.0000.0159.0002.0F39] # TIBETAN MARK TSA -PHRU
+0F7E ; [.0000.015A.0002.0F7E] # TIBETAN SIGN RJES SU NGA RO
+0F7F ; [.0000.015B.0002.0F7F] # TIBETAN SIGN RNAM BCAD
+1036 ; [.0000.015C.0002.1036] # MYANMAR SIGN ANUSVARA
+1037 ; [.0000.015D.0002.1037] # MYANMAR SIGN DOT BELOW
+1038 ; [.0000.015E.0002.1038] # MYANMAR SIGN VISARGA
+135F ; [.0000.015F.0002.135F] # ETHIOPIC COMBINING GEMINATION MARK
+17C6 ; [.0000.0160.0002.17C6] # KHMER SIGN NIKAHIT
+17C7 ; [.0000.0161.0002.17C7] # KHMER SIGN REAHMUK
+17C8 ; [.0000.0162.0002.17C8] # KHMER SIGN YUUKALEAPINTU
+17C9 ; [.0000.0163.0002.17C9] # KHMER SIGN MUUSIKATOAN
+17CA ; [.0000.0164.0002.17CA] # KHMER SIGN TRIISAP
+17CB ; [.0000.0165.0002.17CB] # KHMER SIGN BANTOC
+17CC ; [.0000.0166.0002.17CC] # KHMER SIGN ROBAT
+17CD ; [.0000.0167.0002.17CD] # KHMER SIGN TOANDAKHIAT
+17CE ; [.0000.0168.0002.17CE] # KHMER SIGN KAKABAT
+17CF ; [.0000.0169.0002.17CF] # KHMER SIGN AHSDA
+17D0 ; [.0000.016A.0002.17D0] # KHMER SIGN SAMYOK SANNYA
+17D1 ; [.0000.016B.0002.17D1] # KHMER SIGN VIRIAM
+17D3 ; [.0000.016C.0002.17D3] # KHMER SIGN BATHAMASAT
+17DD ; [.0000.016D.0002.17DD] # KHMER SIGN ATTHACAN
+1939 ; [.0000.016E.0002.1939] # LIMBU SIGN MUKPHRENG
+193A ; [.0000.016F.0002.193A] # LIMBU SIGN KEMPHRENG
+193B ; [.0000.0170.0002.193B] # LIMBU SIGN SA-I
+302A ; [.0000.0171.0002.302A] # IDEOGRAPHIC LEVEL TONE MARK
+302B ; [.0000.0172.0002.302B] # IDEOGRAPHIC RISING TONE MARK
+302C ; [.0000.0173.0002.302C] # IDEOGRAPHIC DEPARTING TONE MARK
+302D ; [.0000.0174.0002.302D] # IDEOGRAPHIC ENTERING TONE MARK
+302E ; [.0000.0175.0002.302E] # HANGUL SINGLE DOT TONE MARK
+302F ; [.0000.0176.0002.302F] # HANGUL DOUBLE DOT TONE MARK
+3099 ; [.0000.0177.0002.3099] # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+FF9E ; [.0000.0177.0012.FF9E] # HALFWIDTH KATAKANA VOICED SOUND MARK; QQK
+309A ; [.0000.0178.0002.309A] # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+FF9F ; [.0000.0178.0012.FF9F] # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK; QQK
+20D0 ; [.0000.0179.0002.20D0] # COMBINING LEFT HARPOON ABOVE
+20D1 ; [.0000.017A.0002.20D1] # COMBINING RIGHT HARPOON ABOVE
+20D2 ; [.0000.017B.0002.20D2] # COMBINING LONG VERTICAL LINE OVERLAY
+20D3 ; [.0000.017C.0002.20D3] # COMBINING SHORT VERTICAL LINE OVERLAY
+20D4 ; [.0000.017D.0002.20D4] # COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5 ; [.0000.017E.0002.20D5] # COMBINING CLOCKWISE ARROW ABOVE
+20D6 ; [.0000.017F.0002.20D6] # COMBINING LEFT ARROW ABOVE
+20D7 ; [.0000.0180.0002.20D7] # COMBINING RIGHT ARROW ABOVE
+20D8 ; [.0000.0181.0002.20D8] # COMBINING RING OVERLAY
+20D9 ; [.0000.0182.0002.20D9] # COMBINING CLOCKWISE RING OVERLAY
+20DA ; [.0000.0183.0002.20DA] # COMBINING ANTICLOCKWISE RING OVERLAY
+20DB ; [.0000.0184.0002.20DB] # COMBINING THREE DOTS ABOVE
+20DC ; [.0000.0185.0002.20DC] # COMBINING FOUR DOTS ABOVE
+20DD ; [.0000.0186.0002.20DD] # COMBINING ENCLOSING CIRCLE
+20DE ; [.0000.0187.0002.20DE] # COMBINING ENCLOSING SQUARE
+20DF ; [.0000.0188.0002.20DF] # COMBINING ENCLOSING DIAMOND
+20E0 ; [.0000.0189.0002.20E0] # COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1 ; [.0000.018A.0002.20E1] # COMBINING LEFT RIGHT ARROW ABOVE
+20E2 ; [.0000.018B.0002.20E2] # COMBINING ENCLOSING SCREEN
+20E3 ; [.0000.018C.0002.20E3] # COMBINING ENCLOSING KEYCAP
+20E4 ; [.0000.018D.0002.20E4] # COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5 ; [.0000.018E.0002.20E5] # COMBINING REVERSE SOLIDUS OVERLAY
+20E6 ; [.0000.018F.0002.20E6] # COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20E7 ; [.0000.0190.0002.20E7] # COMBINING ANNUITY SYMBOL
+20E8 ; [.0000.0191.0002.20E8] # COMBINING TRIPLE UNDERDOT
+20E9 ; [.0000.0192.0002.20E9] # COMBINING WIDE BRIDGE ABOVE
+20EA ; [.0000.0193.0002.20EA] # COMBINING LEFTWARDS ARROW OVERLAY
+20EB ; [.0000.0194.0002.20EB] # COMBINING LONG DOUBLE SOLIDUS OVERLAY
+20EC ; [.0000.0195.0002.20EC] # COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+20ED ; [.0000.0196.0002.20ED] # COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS
+20EE ; [.0000.0197.0002.20EE] # COMBINING LEFT ARROW BELOW
+20EF ; [.0000.0198.0002.20EF] # COMBINING RIGHT ARROW BELOW
+02D0 ; [.0F99.0020.0002.02D0] # MODIFIER LETTER TRIANGULAR COLON
+02D1 ; [.0F9A.0020.0002.02D1] # MODIFIER LETTER HALF TRIANGULAR COLON
+0E46 ; [.0F9B.0020.0002.0E46] # THAI CHARACTER MAIYAMOK
+0EC6 ; [.0F9C.0020.0002.0EC6] # LAO KO LA
+3005 ; [.0F9D.0020.0002.3005] # IDEOGRAPHIC ITERATION MARK
+303B ; [.0F9E.0020.0002.303B] # VERTICAL IDEOGRAPHIC ITERATION MARK
+3031 ; [.0F9F.0020.0002.3031] # VERTICAL KANA REPEAT MARK
+3032 ; [.0F9F.0020.0002.3031][.0000.0177.0002.3099] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK; QQCM
+3033 ; [.0FA0.0020.0002.3033] # VERTICAL KANA REPEAT MARK UPPER HALF
+3034 ; [.0FA0.0020.0002.3033][.0000.0177.0002.3099] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF; QQCM
+3035 ; [.0FA1.0020.0002.3035] # VERTICAL KANA REPEAT MARK LOWER HALF
+309D ; [.0FA2.0020.0002.309D] # HIRAGANA ITERATION MARK
+309E ; [.0FA2.0020.0002.309D][.0000.0177.0002.3099] # HIRAGANA VOICED ITERATION MARK; QQCM
+30FC ; [.0FA3.0020.0002.30FC] # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF70 ; [.0FA3.0020.0012.FF70] # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK; QQK
+30FD ; [.0FA4.0020.0002.30FD] # KATAKANA ITERATION MARK
+30FE ; [.0FA4.0020.0002.30FD][.0000.0177.0002.3099] # KATAKANA VOICED ITERATION MARK; QQCM
+00A4 ; [.0FA5.0020.0002.00A4] # CURRENCY SIGN
+00A2 ; [.0FA6.0020.0002.00A2] # CENT SIGN
+FFE0 ; [.0FA6.0020.0003.FFE0] # FULLWIDTH CENT SIGN; QQK
+0024 ; [.0FA7.0020.0002.0024] # DOLLAR SIGN
+FF04 ; [.0FA7.0020.0003.FF04] # FULLWIDTH DOLLAR SIGN; QQK
+FE69 ; [.0FA7.0020.000F.FE69] # SMALL DOLLAR SIGN; QQK
+00A3 ; [.0FA8.0020.0002.00A3] # POUND SIGN
+FFE1 ; [.0FA8.0020.0003.FFE1] # FULLWIDTH POUND SIGN; QQK
+00A5 ; [.0FA9.0020.0002.00A5] # YEN SIGN
+FFE5 ; [.0FA9.0020.0003.FFE5] # FULLWIDTH YEN SIGN; QQK
+060B ; [.0FAA.0020.0002.060B] # AFGHANI SIGN
+09F2 ; [.0FAB.0020.0002.09F2] # BENGALI RUPEE MARK
+09F3 ; [.0FAC.0020.0002.09F3] # BENGALI RUPEE SIGN
+0AF1 ; [.0FAD.0020.0002.0AF1] # GUJARATI RUPEE SIGN
+0BF9 ; [.0FAE.0020.0002.0BF9] # TAMIL RUPEE SIGN
+0E3F ; [.0FAF.0020.0002.0E3F] # THAI CURRENCY SYMBOL BAHT
+17DB ; [.0FB0.0020.0002.17DB] # KHMER CURRENCY SYMBOL RIEL
+20A0 ; [.0FB1.0020.0002.20A0] # EURO-CURRENCY SIGN
+20A1 ; [.0FB2.0020.0002.20A1] # COLON SIGN
+20A2 ; [.0FB3.0020.0002.20A2] # CRUZEIRO SIGN
+20A3 ; [.0FB4.0020.0002.20A3] # FRENCH FRANC SIGN
+20A4 ; [.0FB5.0020.0002.20A4] # LIRA SIGN
+20A5 ; [.0FB6.0020.0002.20A5] # MILL SIGN
+20A6 ; [.0FB7.0020.0002.20A6] # NAIRA SIGN
+20A7 ; [.0FB8.0020.0002.20A7] # PESETA SIGN
+20A9 ; [.0FB9.0020.0002.20A9] # WON SIGN
+FFE6 ; [.0FB9.0020.0003.FFE6] # FULLWIDTH WON SIGN; QQK
+20AA ; [.0FBA.0020.0002.20AA] # NEW SHEQEL SIGN
+20AB ; [.0FBB.0020.0002.20AB] # DONG SIGN
+20AC ; [.0FBC.0020.0002.20AC] # EURO SIGN
+20AD ; [.0FBD.0020.0002.20AD] # KIP SIGN
+20AE ; [.0FBE.0020.0002.20AE] # TUGRIK SIGN
+20AF ; [.0FBF.0020.0002.20AF] # DRACHMA SIGN
+20B0 ; [.0FC0.0020.0002.20B0] # GERMAN PENNY SIGN
+20B1 ; [.0FC1.0020.0002.20B1] # PESO SIGN
+20B2 ; [.0FC2.0020.0002.20B2] # GUARANI SIGN
+20B3 ; [.0FC3.0020.0002.20B3] # AUSTRAL SIGN
+20B4 ; [.0FC4.0020.0002.20B4] # HRYVNIA SIGN
+20B5 ; [.0FC5.0020.0002.20B5] # CEDI SIGN
+0030 ; [.0FC6.0020.0002.0030] # DIGIT ZERO
+FF10 ; [.0FC6.0020.0003.FF10] # FULLWIDTH DIGIT ZERO; QQK
+1D7CE ; [.0FC6.0020.0005.1D7CE] # MATHEMATICAL BOLD DIGIT ZERO; QQK
+1D7D8 ; [.0FC6.0020.0005.1D7D8] # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO; QQK
+1D7E2 ; [.0FC6.0020.0005.1D7E2] # MATHEMATICAL SANS-SERIF DIGIT ZERO; QQK
+1D7EC ; [.0FC6.0020.0005.1D7EC] # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO; QQK
+1D7F6 ; [.0FC6.0020.0005.1D7F6] # MATHEMATICAL MONOSPACE DIGIT ZERO; QQK
+24EA ; [.0FC6.0020.0006.24EA] # CIRCLED DIGIT ZERO; QQK
+24FF ; [.0FC6.0020.0006.24FF] # NEGATIVE CIRCLED DIGIT ZERO; QQK
+2070 ; [.0FC6.0020.0014.2070] # SUPERSCRIPT ZERO; QQK
+2080 ; [.0FC6.0020.0015.2080] # SUBSCRIPT ZERO; QQK
+0660 ; [.0FC6.0020.0002.0660][.0000.019F.0002.0660] # ARABIC-INDIC DIGIT ZERO
+06F0 ; [.0FC6.0020.0002.06F0][.0000.01A0.0002.06F0] # EXTENDED ARABIC-INDIC DIGIT ZERO
+07C0 ; [.0FC6.0020.0002.07C0][.0000.01A1.0002.07C0] # NKO DIGIT ZERO
+104A0 ; [.0FC6.0020.0002.104A0][.0000.01A3.0002.104A0] # OSMANYA DIGIT ZERO
+0966 ; [.0FC6.0020.0002.0966][.0000.01A4.0002.0966] # DEVANAGARI DIGIT ZERO
+09E6 ; [.0FC6.0020.0002.09E6][.0000.01A5.0002.09E6] # BENGALI DIGIT ZERO
+0A66 ; [.0FC6.0020.0002.0A66][.0000.01A6.0002.0A66] # GURMUKHI DIGIT ZERO
+0AE6 ; [.0FC6.0020.0002.0AE6][.0000.01A7.0002.0AE6] # GUJARATI DIGIT ZERO
+0B66 ; [.0FC6.0020.0002.0B66][.0000.01A8.0002.0B66] # ORIYA DIGIT ZERO
+0BE6 ; [.0FC6.0020.0002.0BE6][.0000.01A9.0002.0BE6] # TAMIL DIGIT ZERO
+0C66 ; [.0FC6.0020.0002.0C66][.0000.01AA.0002.0C66] # TELUGU DIGIT ZERO
+0CE6 ; [.0FC6.0020.0002.0CE6][.0000.01AB.0002.0CE6] # KANNADA DIGIT ZERO
+0D66 ; [.0FC6.0020.0002.0D66][.0000.01AC.0002.0D66] # MALAYALAM DIGIT ZERO
+1946 ; [.0FC6.0020.0002.1946][.0000.01AD.0002.1946] # LIMBU DIGIT ZERO
+19D0 ; [.0FC6.0020.0002.19D0][.0000.01AE.0002.19D0] # NEW TAI LUE DIGIT ZERO
+0E50 ; [.0FC6.0020.0002.0E50][.0000.01AF.0002.0E50] # THAI DIGIT ZERO
+0ED0 ; [.0FC6.0020.0002.0ED0][.0000.01B0.0002.0ED0] # LAO DIGIT ZERO
+0F20 ; [.0FC6.0020.0002.0F20][.0000.01B1.0002.0F20] # TIBETAN DIGIT ZERO
+0F33 ; [.0FC6.0020.0004.0F33][.0000.01B1.0004.0F33] # TIBETAN DIGIT HALF ZERO; QQK
+1040 ; [.0FC6.0020.0002.1040][.0000.01B2.0002.1040] # MYANMAR DIGIT ZERO
+17E0 ; [.0FC6.0020.0002.17E0][.0000.01B3.0002.17E0] # KHMER DIGIT ZERO
+17F0 ; [.0FC6.0020.0002.17F0][.0000.01B4.0002.17F0] # KHMER SYMBOL LEK ATTAK SON
+1B50 ; [.0FC6.0020.0002.1B50][.0000.01B5.0002.1B50] # BALINESE DIGIT ZERO
+1810 ; [.0FC6.0020.0002.1810][.0000.01B6.0002.1810] # MONGOLIAN DIGIT ZERO
+3007 ; [.0FC6.0020.0002.3007][.0000.01B7.0002.3007] # IDEOGRAPHIC NUMBER ZERO
+1018A ; [.0FC6.0020.0002.1018A][.0000.01B9.0002.1018A] # GREEK ZERO SIGN
+3358 ; [.0FC6.0020.0004.3358][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO; QQKN
+0031 ; [.0FC7.0020.0002.0031] # DIGIT ONE
+FF11 ; [.0FC7.0020.0003.FF11] # FULLWIDTH DIGIT ONE; QQK
+2474 ; [*02B1.0020.0004.2474][.0FC7.0020.0004.2474][*02B2.0020.001F.2474] # PARENTHESIZED DIGIT ONE; QQKN
+2488 ; [.0FC7.0020.0004.2488][*0266.0020.0004.2488] # DIGIT ONE FULL STOP; QQKN
+1D7CF ; [.0FC7.0020.0005.1D7CF] # MATHEMATICAL BOLD DIGIT ONE; QQK
+1D7D9 ; [.0FC7.0020.0005.1D7D9] # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE; QQK
+1D7E3 ; [.0FC7.0020.0005.1D7E3] # MATHEMATICAL SANS-SERIF DIGIT ONE; QQK
+1D7ED ; [.0FC7.0020.0005.1D7ED] # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE; QQK
+1D7F7 ; [.0FC7.0020.0005.1D7F7] # MATHEMATICAL MONOSPACE DIGIT ONE; QQK
+2460 ; [.0FC7.0020.0006.2460] # CIRCLED DIGIT ONE; QQK
+24F5 ; [.0FC7.0020.0006.24F5] # DOUBLE CIRCLED DIGIT ONE; QQK
+2776 ; [.0FC7.0020.0006.2776] # DINGBAT NEGATIVE CIRCLED DIGIT ONE; QQK
+2780 ; [.0FC7.0020.0006.2780] # DINGBAT CIRCLED SANS-SERIF DIGIT ONE; QQK
+278A ; [.0FC7.0020.0006.278A] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE; QQK
+00B9 ; [.0FC7.0020.0014.00B9] # SUPERSCRIPT ONE; QQK
+2081 ; [.0FC7.0020.0015.2081] # SUBSCRIPT ONE; QQK
+215F ; [.0FC7.0020.001E.215F][*0300.0020.001E.215F] # FRACTION NUMERATOR ONE; QQKN
+0661 ; [.0FC7.0020.0002.0661][.0000.019F.0002.0661] # ARABIC-INDIC DIGIT ONE
+06F1 ; [.0FC7.0020.0002.06F1][.0000.01A0.0002.06F1] # EXTENDED ARABIC-INDIC DIGIT ONE
+07C1 ; [.0FC7.0020.0002.07C1][.0000.01A1.0002.07C1] # NKO DIGIT ONE
+1369 ; [.0FC7.0020.0002.1369][.0000.01A2.0002.1369] # ETHIOPIC DIGIT ONE
+104A1 ; [.0FC7.0020.0002.104A1][.0000.01A3.0002.104A1] # OSMANYA DIGIT ONE
+0967 ; [.0FC7.0020.0002.0967][.0000.01A4.0002.0967] # DEVANAGARI DIGIT ONE
+09E7 ; [.0FC7.0020.0002.09E7][.0000.01A5.0002.09E7] # BENGALI DIGIT ONE
+09F4 ; [.0FC7.0020.0002.09F4][.0000.01A5.0002.09F4] # BENGALI CURRENCY NUMERATOR ONE
+0A67 ; [.0FC7.0020.0002.0A67][.0000.01A6.0002.0A67] # GURMUKHI DIGIT ONE
+0AE7 ; [.0FC7.0020.0002.0AE7][.0000.01A7.0002.0AE7] # GUJARATI DIGIT ONE
+0B67 ; [.0FC7.0020.0002.0B67][.0000.01A8.0002.0B67] # ORIYA DIGIT ONE
+0BE7 ; [.0FC7.0020.0002.0BE7][.0000.01A9.0002.0BE7] # TAMIL DIGIT ONE
+0C67 ; [.0FC7.0020.0002.0C67][.0000.01AA.0002.0C67] # TELUGU DIGIT ONE
+0CE7 ; [.0FC7.0020.0002.0CE7][.0000.01AB.0002.0CE7] # KANNADA DIGIT ONE
+0D67 ; [.0FC7.0020.0002.0D67][.0000.01AC.0002.0D67] # MALAYALAM DIGIT ONE
+1947 ; [.0FC7.0020.0002.1947][.0000.01AD.0002.1947] # LIMBU DIGIT ONE
+19D1 ; [.0FC7.0020.0002.19D1][.0000.01AE.0002.19D1] # NEW TAI LUE DIGIT ONE
+0E51 ; [.0FC7.0020.0002.0E51][.0000.01AF.0002.0E51] # THAI DIGIT ONE
+0ED1 ; [.0FC7.0020.0002.0ED1][.0000.01B0.0002.0ED1] # LAO DIGIT ONE
+0F21 ; [.0FC7.0020.0002.0F21][.0000.01B1.0002.0F21] # TIBETAN DIGIT ONE
+0F2A ; [.0FC7.0020.0004.0F2A][.0000.01B1.0004.0F2A] # TIBETAN DIGIT HALF ONE; QQK
+1041 ; [.0FC7.0020.0002.1041][.0000.01B2.0002.1041] # MYANMAR DIGIT ONE
+17E1 ; [.0FC7.0020.0002.17E1][.0000.01B3.0002.17E1] # KHMER DIGIT ONE
+17F1 ; [.0FC7.0020.0002.17F1][.0000.01B4.0002.17F1] # KHMER SYMBOL LEK ATTAK MUOY
+1B51 ; [.0FC7.0020.0002.1B51][.0000.01B5.0002.1B51] # BALINESE DIGIT ONE
+1811 ; [.0FC7.0020.0002.1811][.0000.01B6.0002.1811] # MONGOLIAN DIGIT ONE
+3021 ; [.0FC7.0020.0002.3021][.0000.01B7.0002.3021] # HANGZHOU NUMERAL ONE
+10107 ; [.0FC7.0020.0002.10107][.0000.01B8.0002.10107] # AEGEAN NUMBER ONE
+10142 ; [.0FC7.0020.0002.10142][.0000.01B9.0002.10142] # GREEK ACROPHONIC ATTIC ONE DRACHMA
+10158 ; [.0FC7.0020.0002.10158][.0000.01B9.0002.10158] # GREEK ACROPHONIC HERAEUM ONE PLETHRON
+10159 ; [.0FC7.0020.0002.10159][.0000.01B9.0002.10159] # GREEK ACROPHONIC THESPIAN ONE
+1015A ; [.0FC7.0020.0002.1015A][.0000.01B9.0002.1015A] # GREEK ACROPHONIC HERMIONIAN ONE
+10320 ; [.0FC7.0020.0002.10320][.0000.01BA.0002.10320] # OLD ITALIC NUMERAL ONE
+103D1 ; [.0FC7.0020.0002.103D1][.0000.01BB.0002.103D1] # OLD PERSIAN NUMBER ONE
+12415 ; [.0FC7.0020.0002.12415][.0000.01BC.0002.12415] # CUNEIFORM NUMERIC SIGN ONE GESH2
+1241E ; [.0FC7.0020.0002.1241E][.0000.01BC.0002.1241E] # CUNEIFORM NUMERIC SIGN ONE GESHU
+1242C ; [.0FC7.0020.0002.1242C][.0000.01BC.0002.1242C] # CUNEIFORM NUMERIC SIGN ONE SHARU
+12434 ; [.0FC7.0020.0002.12434][.0000.01BC.0002.12434] # CUNEIFORM NUMERIC SIGN ONE BURU
+1244F ; [.0FC7.0020.0002.1244F][.0000.01BC.0002.1244F] # CUNEIFORM NUMERIC SIGN ONE BAN2
+12458 ; [.0FC7.0020.0002.12458][.0000.01BC.0002.12458] # CUNEIFORM NUMERIC SIGN ONE ESHE3
+10916 ; [.0FC7.0020.0002.10916][.0000.01BD.0002.10916] # PHOENICIAN NUMBER ONE
+10A40 ; [.0FC7.0020.0002.10A40][.0000.01BE.0002.10A40] # KHAROSHTHI DIGIT ONE
+1D360 ; [.0FC7.0020.0002.1D360][.0000.01BF.0002.1D360] # COUNTING ROD UNIT DIGIT ONE
+2491 ; [.0FC7.0020.0004.2491][.0FC6.0020.0004.2491][*0266.0020.001F.2491] # NUMBER TEN FULL STOP; QQKN
+247D ; [*02B1.0020.0004.247D][.0FC7.0020.0004.247D][.0FC6.0020.001F.247D][*02B2.0020.001F.247D] # PARENTHESIZED NUMBER TEN; QQKN
+2469 ; [.0FC7.0020.0006.2469][.0FC6.0020.0006.2469] # CIRCLED NUMBER TEN; QQKN
+24FE ; [.0FC7.0020.0006.24FE][.0FC6.0020.0006.24FE] # DOUBLE CIRCLED NUMBER TEN; QQKN
+277F ; [.0FC7.0020.0006.277F][.0FC6.0020.0006.277F] # DINGBAT NEGATIVE CIRCLED NUMBER TEN; QQKN
+2789 ; [.0FC7.0020.0006.2789][.0FC6.0020.0006.2789] # DINGBAT CIRCLED SANS-SERIF NUMBER TEN; QQKN
+2793 ; [.0FC7.0020.0006.2793][.0FC6.0020.0006.2793] # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN; QQKN
+33E9 ; [.0FC7.0020.0004.33E9][.0FC6.0020.0004.33E9][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN; QQKN
+32C9 ; [.0FC7.0020.0004.32C9][.0FC6.0020.0004.32C9][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER; QQKN
+3362 ; [.0FC7.0020.0004.3362][.0FC6.0020.0004.3362][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN; QQKN
+2492 ; [.0FC7.0020.0004.2492][.0FC7.0020.0004.2492][*0266.0020.001F.2492] # NUMBER ELEVEN FULL STOP; QQKN
+247E ; [*02B1.0020.0004.247E][.0FC7.0020.0004.247E][.0FC7.0020.001F.247E][*02B2.0020.001F.247E] # PARENTHESIZED NUMBER ELEVEN; QQKN
+246A ; [.0FC7.0020.0006.246A][.0FC7.0020.0006.246A] # CIRCLED NUMBER ELEVEN; QQKN
+24EB ; [.0FC7.0020.0006.24EB][.0FC7.0020.0006.24EB] # NEGATIVE CIRCLED NUMBER ELEVEN; QQKN
+33EA ; [.0FC7.0020.0004.33EA][.0FC7.0020.0004.33EA][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN; QQKN
+32CA ; [.0FC7.0020.0004.32CA][.0FC7.0020.0004.32CA][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER; QQKN
+3363 ; [.0FC7.0020.0004.3363][.0FC7.0020.0004.3363][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN; QQKN
+2493 ; [.0FC7.0020.0004.2493][.0FC8.0020.0004.2493][*0266.0020.001F.2493] # NUMBER TWELVE FULL STOP; QQKN
+247F ; [*02B1.0020.0004.247F][.0FC7.0020.0004.247F][.0FC8.0020.001F.247F][*02B2.0020.001F.247F] # PARENTHESIZED NUMBER TWELVE; QQKN
+246B ; [.0FC7.0020.0006.246B][.0FC8.0020.0006.246B] # CIRCLED NUMBER TWELVE; QQKN
+24EC ; [.0FC7.0020.0006.24EC][.0FC8.0020.0006.24EC] # NEGATIVE CIRCLED NUMBER TWELVE; QQKN
+00BD ; [.0FC7.0020.001E.00BD][*0300.0020.001E.00BD][.0FC8.0020.001F.00BD] # VULGAR FRACTION ONE HALF; QQKN
+33EB ; [.0FC7.0020.0004.33EB][.0FC8.0020.0004.33EB][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE; QQKN
+32CB ; [.0FC7.0020.0004.32CB][.0FC8.0020.0004.32CB][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER; QQKN
+3364 ; [.0FC7.0020.0004.3364][.0FC8.0020.0004.3364][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE; QQKN
+2494 ; [.0FC7.0020.0004.2494][.0FC9.0020.0004.2494][*0266.0020.001F.2494] # NUMBER THIRTEEN FULL STOP; QQKN
+2480 ; [*02B1.0020.0004.2480][.0FC7.0020.0004.2480][.0FC9.0020.001F.2480][*02B2.0020.001F.2480] # PARENTHESIZED NUMBER THIRTEEN; QQKN
+246C ; [.0FC7.0020.0006.246C][.0FC9.0020.0006.246C] # CIRCLED NUMBER THIRTEEN; QQKN
+24ED ; [.0FC7.0020.0006.24ED][.0FC9.0020.0006.24ED] # NEGATIVE CIRCLED NUMBER THIRTEEN; QQKN
+2153 ; [.0FC7.0020.001E.2153][*0300.0020.001E.2153][.0FC9.0020.001F.2153] # VULGAR FRACTION ONE THIRD; QQKN
+33EC ; [.0FC7.0020.0004.33EC][.0FC9.0020.0004.33EC][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN; QQKN
+3365 ; [.0FC7.0020.0004.3365][.0FC9.0020.0004.3365][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN; QQKN
+2495 ; [.0FC7.0020.0004.2495][.0FCA.0020.0004.2495][*0266.0020.001F.2495] # NUMBER FOURTEEN FULL STOP; QQKN
+2481 ; [*02B1.0020.0004.2481][.0FC7.0020.0004.2481][.0FCA.0020.001F.2481][*02B2.0020.001F.2481] # PARENTHESIZED NUMBER FOURTEEN; QQKN
+246D ; [.0FC7.0020.0006.246D][.0FCA.0020.0006.246D] # CIRCLED NUMBER FOURTEEN; QQKN
+24EE ; [.0FC7.0020.0006.24EE][.0FCA.0020.0006.24EE] # NEGATIVE CIRCLED NUMBER FOURTEEN; QQKN
+00BC ; [.0FC7.0020.001E.00BC][*0300.0020.001E.00BC][.0FCA.0020.001F.00BC] # VULGAR FRACTION ONE QUARTER; QQKN
+33ED ; [.0FC7.0020.0004.33ED][.0FCA.0020.0004.33ED][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN; QQKN
+3366 ; [.0FC7.0020.0004.3366][.0FCA.0020.0004.3366][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN; QQKN
+2496 ; [.0FC7.0020.0004.2496][.0FCB.0020.0004.2496][*0266.0020.001F.2496] # NUMBER FIFTEEN FULL STOP; QQKN
+2482 ; [*02B1.0020.0004.2482][.0FC7.0020.0004.2482][.0FCB.0020.001F.2482][*02B2.0020.001F.2482] # PARENTHESIZED NUMBER FIFTEEN; QQKN
+246E ; [.0FC7.0020.0006.246E][.0FCB.0020.0006.246E] # CIRCLED NUMBER FIFTEEN; QQKN
+24EF ; [.0FC7.0020.0006.24EF][.0FCB.0020.0006.24EF] # NEGATIVE CIRCLED NUMBER FIFTEEN; QQKN
+2155 ; [.0FC7.0020.001E.2155][*0300.0020.001E.2155][.0FCB.0020.001F.2155] # VULGAR FRACTION ONE FIFTH; QQKN
+33EE ; [.0FC7.0020.0004.33EE][.0FCB.0020.0004.33EE][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN; QQKN
+3367 ; [.0FC7.0020.0004.3367][.0FCB.0020.0004.3367][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN; QQKN
+2497 ; [.0FC7.0020.0004.2497][.0FCC.0020.0004.2497][*0266.0020.001F.2497] # NUMBER SIXTEEN FULL STOP; QQKN
+2483 ; [*02B1.0020.0004.2483][.0FC7.0020.0004.2483][.0FCC.0020.001F.2483][*02B2.0020.001F.2483] # PARENTHESIZED NUMBER SIXTEEN; QQKN
+246F ; [.0FC7.0020.0006.246F][.0FCC.0020.0006.246F] # CIRCLED NUMBER SIXTEEN; QQKN
+24F0 ; [.0FC7.0020.0006.24F0][.0FCC.0020.0006.24F0] # NEGATIVE CIRCLED NUMBER SIXTEEN; QQKN
+2159 ; [.0FC7.0020.001E.2159][*0300.0020.001E.2159][.0FCC.0020.001F.2159] # VULGAR FRACTION ONE SIXTH; QQKN
+33EF ; [.0FC7.0020.0004.33EF][.0FCC.0020.0004.33EF][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN; QQKN
+3368 ; [.0FC7.0020.0004.3368][.0FCC.0020.0004.3368][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN; QQKN
+2498 ; [.0FC7.0020.0004.2498][.0FCD.0020.0004.2498][*0266.0020.001F.2498] # NUMBER SEVENTEEN FULL STOP; QQKN
+2484 ; [*02B1.0020.0004.2484][.0FC7.0020.0004.2484][.0FCD.0020.001F.2484][*02B2.0020.001F.2484] # PARENTHESIZED NUMBER SEVENTEEN; QQKN
+2470 ; [.0FC7.0020.0006.2470][.0FCD.0020.0006.2470] # CIRCLED NUMBER SEVENTEEN; QQKN
+24F1 ; [.0FC7.0020.0006.24F1][.0FCD.0020.0006.24F1] # NEGATIVE CIRCLED NUMBER SEVENTEEN; QQKN
+33F0 ; [.0FC7.0020.0004.33F0][.0FCD.0020.0004.33F0][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN; QQKN
+3369 ; [.0FC7.0020.0004.3369][.0FCD.0020.0004.3369][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN; QQKN
+2499 ; [.0FC7.0020.0004.2499][.0FCE.0020.0004.2499][*0266.0020.001F.2499] # NUMBER EIGHTEEN FULL STOP; QQKN
+2485 ; [*02B1.0020.0004.2485][.0FC7.0020.0004.2485][.0FCE.0020.001F.2485][*02B2.0020.001F.2485] # PARENTHESIZED NUMBER EIGHTEEN; QQKN
+2471 ; [.0FC7.0020.0006.2471][.0FCE.0020.0006.2471] # CIRCLED NUMBER EIGHTEEN; QQKN
+24F2 ; [.0FC7.0020.0006.24F2][.0FCE.0020.0006.24F2] # NEGATIVE CIRCLED NUMBER EIGHTEEN; QQKN
+215B ; [.0FC7.0020.001E.215B][*0300.0020.001E.215B][.0FCE.0020.001F.215B] # VULGAR FRACTION ONE EIGHTH; QQKN
+33F1 ; [.0FC7.0020.0004.33F1][.0FCE.0020.0004.33F1][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN; QQKN
+336A ; [.0FC7.0020.0004.336A][.0FCE.0020.0004.336A][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN; QQKN
+249A ; [.0FC7.0020.0004.249A][.0FCF.0020.0004.249A][*0266.0020.001F.249A] # NUMBER NINETEEN FULL STOP; QQKN
+2486 ; [*02B1.0020.0004.2486][.0FC7.0020.0004.2486][.0FCF.0020.001F.2486][*02B2.0020.001F.2486] # PARENTHESIZED NUMBER NINETEEN; QQKN
+2472 ; [.0FC7.0020.0006.2472][.0FCF.0020.0006.2472] # CIRCLED NUMBER NINETEEN; QQKN
+24F3 ; [.0FC7.0020.0006.24F3][.0FCF.0020.0006.24F3] # NEGATIVE CIRCLED NUMBER NINETEEN; QQKN
+33F2 ; [.0FC7.0020.0004.33F2][.0FCF.0020.0004.33F2][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN; QQKN
+336B ; [.0FC7.0020.0004.336B][.0FCF.0020.0004.336B][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN; QQKN
+33E0 ; [.0FC7.0020.0004.33E0][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE; QQKN
+32C0 ; [.0FC7.0020.0004.32C0][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY; QQKN
+3359 ; [.0FC7.0020.0004.3359][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE; QQKN
+0032 ; [.0FC8.0020.0002.0032] # DIGIT TWO
+FF12 ; [.0FC8.0020.0003.FF12] # FULLWIDTH DIGIT TWO; QQK
+2475 ; [*02B1.0020.0004.2475][.0FC8.0020.0004.2475][*02B2.0020.001F.2475] # PARENTHESIZED DIGIT TWO; QQKN
+2489 ; [.0FC8.0020.0004.2489][*0266.0020.0004.2489] # DIGIT TWO FULL STOP; QQKN
+1D7D0 ; [.0FC8.0020.0005.1D7D0] # MATHEMATICAL BOLD DIGIT TWO; QQK
+1D7DA ; [.0FC8.0020.0005.1D7DA] # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO; QQK
+1D7E4 ; [.0FC8.0020.0005.1D7E4] # MATHEMATICAL SANS-SERIF DIGIT TWO; QQK
+1D7EE ; [.0FC8.0020.0005.1D7EE] # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO; QQK
+1D7F8 ; [.0FC8.0020.0005.1D7F8] # MATHEMATICAL MONOSPACE DIGIT TWO; QQK
+2461 ; [.0FC8.0020.0006.2461] # CIRCLED DIGIT TWO; QQK
+24F6 ; [.0FC8.0020.0006.24F6] # DOUBLE CIRCLED DIGIT TWO; QQK
+2777 ; [.0FC8.0020.0006.2777] # DINGBAT NEGATIVE CIRCLED DIGIT TWO; QQK
+2781 ; [.0FC8.0020.0006.2781] # DINGBAT CIRCLED SANS-SERIF DIGIT TWO; QQK
+278B ; [.0FC8.0020.0006.278B] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO; QQK
+00B2 ; [.0FC8.0020.0014.00B2] # SUPERSCRIPT TWO; QQK
+2082 ; [.0FC8.0020.0015.2082] # SUBSCRIPT TWO; QQK
+0662 ; [.0FC8.0020.0002.0662][.0000.019F.0002.0662] # ARABIC-INDIC DIGIT TWO
+06F2 ; [.0FC8.0020.0002.06F2][.0000.01A0.0002.06F2] # EXTENDED ARABIC-INDIC DIGIT TWO
+07C2 ; [.0FC8.0020.0002.07C2][.0000.01A1.0002.07C2] # NKO DIGIT TWO
+136A ; [.0FC8.0020.0002.136A][.0000.01A2.0002.136A] # ETHIOPIC DIGIT TWO
+104A2 ; [.0FC8.0020.0002.104A2][.0000.01A3.0002.104A2] # OSMANYA DIGIT TWO
+0968 ; [.0FC8.0020.0002.0968][.0000.01A4.0002.0968] # DEVANAGARI DIGIT TWO
+09E8 ; [.0FC8.0020.0002.09E8][.0000.01A5.0002.09E8] # BENGALI DIGIT TWO
+09F5 ; [.0FC8.0020.0002.09F5][.0000.01A5.0002.09F5] # BENGALI CURRENCY NUMERATOR TWO
+0A68 ; [.0FC8.0020.0002.0A68][.0000.01A6.0002.0A68] # GURMUKHI DIGIT TWO
+0AE8 ; [.0FC8.0020.0002.0AE8][.0000.01A7.0002.0AE8] # GUJARATI DIGIT TWO
+0B68 ; [.0FC8.0020.0002.0B68][.0000.01A8.0002.0B68] # ORIYA DIGIT TWO
+0BE8 ; [.0FC8.0020.0002.0BE8][.0000.01A9.0002.0BE8] # TAMIL DIGIT TWO
+0C68 ; [.0FC8.0020.0002.0C68][.0000.01AA.0002.0C68] # TELUGU DIGIT TWO
+0CE8 ; [.0FC8.0020.0002.0CE8][.0000.01AB.0002.0CE8] # KANNADA DIGIT TWO
+0D68 ; [.0FC8.0020.0002.0D68][.0000.01AC.0002.0D68] # MALAYALAM DIGIT TWO
+1948 ; [.0FC8.0020.0002.1948][.0000.01AD.0002.1948] # LIMBU DIGIT TWO
+19D2 ; [.0FC8.0020.0002.19D2][.0000.01AE.0002.19D2] # NEW TAI LUE DIGIT TWO
+0E52 ; [.0FC8.0020.0002.0E52][.0000.01AF.0002.0E52] # THAI DIGIT TWO
+0ED2 ; [.0FC8.0020.0002.0ED2][.0000.01B0.0002.0ED2] # LAO DIGIT TWO
+0F22 ; [.0FC8.0020.0002.0F22][.0000.01B1.0002.0F22] # TIBETAN DIGIT TWO
+0F2B ; [.0FC8.0020.0004.0F2B][.0000.01B1.0004.0F2B] # TIBETAN DIGIT HALF TWO; QQK
+1042 ; [.0FC8.0020.0002.1042][.0000.01B2.0002.1042] # MYANMAR DIGIT TWO
+17E2 ; [.0FC8.0020.0002.17E2][.0000.01B3.0002.17E2] # KHMER DIGIT TWO
+17F2 ; [.0FC8.0020.0002.17F2][.0000.01B4.0002.17F2] # KHMER SYMBOL LEK ATTAK PII
+1B52 ; [.0FC8.0020.0002.1B52][.0000.01B5.0002.1B52] # BALINESE DIGIT TWO
+1812 ; [.0FC8.0020.0002.1812][.0000.01B6.0002.1812] # MONGOLIAN DIGIT TWO
+3022 ; [.0FC8.0020.0002.3022][.0000.01B7.0002.3022] # HANGZHOU NUMERAL TWO
+10108 ; [.0FC8.0020.0002.10108][.0000.01B8.0002.10108] # AEGEAN NUMBER TWO
+1015B ; [.0FC8.0020.0002.1015B][.0000.01B9.0002.1015B] # GREEK ACROPHONIC EPIDAUREAN TWO
+1015C ; [.0FC8.0020.0002.1015C][.0000.01B9.0002.1015C] # GREEK ACROPHONIC THESPIAN TWO
+1015D ; [.0FC8.0020.0002.1015D][.0000.01B9.0002.1015D] # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS
+1015E ; [.0FC8.0020.0002.1015E][.0000.01B9.0002.1015E] # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS
+103D2 ; [.0FC8.0020.0002.103D2][.0000.01BB.0002.103D2] # OLD PERSIAN NUMBER TWO
+12400 ; [.0FC8.0020.0002.12400][.0000.01BC.0002.12400] # CUNEIFORM NUMERIC SIGN TWO ASH
+12416 ; [.0FC8.0020.0002.12416][.0000.01BC.0002.12416] # CUNEIFORM NUMERIC SIGN TWO GESH2
+1241F ; [.0FC8.0020.0002.1241F][.0000.01BC.0002.1241F] # CUNEIFORM NUMERIC SIGN TWO GESHU
+12423 ; [.0FC8.0020.0002.12423][.0000.01BC.0002.12423] # CUNEIFORM NUMERIC SIGN TWO SHAR2
+1242D ; [.0FC8.0020.0002.1242D][.0000.01BC.0002.1242D] # CUNEIFORM NUMERIC SIGN TWO SHARU
+12435 ; [.0FC8.0020.0002.12435][.0000.01BC.0002.12435] # CUNEIFORM NUMERIC SIGN TWO BURU
+1244A ; [.0FC8.0020.0002.1244A][.0000.01BC.0002.1244A] # CUNEIFORM NUMERIC SIGN TWO ASH TENU
+12450 ; [.0FC8.0020.0002.12450][.0000.01BC.0002.12450] # CUNEIFORM NUMERIC SIGN TWO BAN2
+12459 ; [.0FC8.0020.0002.12459][.0000.01BC.0002.12459] # CUNEIFORM NUMERIC SIGN TWO ESHE3
+10A41 ; [.0FC8.0020.0002.10A41][.0000.01BE.0002.10A41] # KHAROSHTHI DIGIT TWO
+1D361 ; [.0FC8.0020.0002.1D361][.0000.01BF.0002.1D361] # COUNTING ROD UNIT DIGIT TWO
+249B ; [.0FC8.0020.0004.249B][.0FC6.0020.0004.249B][*0266.0020.001F.249B] # NUMBER TWENTY FULL STOP; QQKN
+2487 ; [*02B1.0020.0004.2487][.0FC8.0020.0004.2487][.0FC6.0020.001F.2487][*02B2.0020.001F.2487] # PARENTHESIZED NUMBER TWENTY; QQKN
+2473 ; [.0FC8.0020.0006.2473][.0FC6.0020.0006.2473] # CIRCLED NUMBER TWENTY; QQKN
+24F4 ; [.0FC8.0020.0006.24F4][.0FC6.0020.0006.24F4] # NEGATIVE CIRCLED NUMBER TWENTY; QQKN
+33F3 ; [.0FC8.0020.0004.33F3][.0FC6.0020.0004.33F3][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY; QQKN
+336C ; [.0FC8.0020.0004.336C][.0FC6.0020.0004.336C][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY; QQKN
+3251 ; [.0FC8.0020.0006.3251][.0FC7.0020.0006.3251] # CIRCLED NUMBER TWENTY ONE; QQKN
+33F4 ; [.0FC8.0020.0004.33F4][.0FC7.0020.0004.33F4][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE; QQKN
+336D ; [.0FC8.0020.0004.336D][.0FC7.0020.0004.336D][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE; QQKN
+3252 ; [.0FC8.0020.0006.3252][.0FC8.0020.0006.3252] # CIRCLED NUMBER TWENTY TWO; QQKN
+33F5 ; [.0FC8.0020.0004.33F5][.0FC8.0020.0004.33F5][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO; QQKN
+336E ; [.0FC8.0020.0004.336E][.0FC8.0020.0004.336E][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO; QQKN
+3253 ; [.0FC8.0020.0006.3253][.0FC9.0020.0006.3253] # CIRCLED NUMBER TWENTY THREE; QQKN
+2154 ; [.0FC8.0020.001E.2154][*0300.0020.001E.2154][.0FC9.0020.001F.2154] # VULGAR FRACTION TWO THIRDS; QQKN
+33F6 ; [.0FC8.0020.0004.33F6][.0FC9.0020.0004.33F6][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE; QQKN
+336F ; [.0FC8.0020.0004.336F][.0FC9.0020.0004.336F][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE; QQKN
+3254 ; [.0FC8.0020.0006.3254][.0FCA.0020.0006.3254] # CIRCLED NUMBER TWENTY FOUR; QQKN
+33F7 ; [.0FC8.0020.0004.33F7][.0FCA.0020.0004.33F7][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR; QQKN
+3370 ; [.0FC8.0020.0004.3370][.0FCA.0020.0004.3370][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR; QQKN
+3255 ; [.0FC8.0020.0006.3255][.0FCB.0020.0006.3255] # CIRCLED NUMBER TWENTY FIVE; QQKN
+2156 ; [.0FC8.0020.001E.2156][*0300.0020.001E.2156][.0FCB.0020.001F.2156] # VULGAR FRACTION TWO FIFTHS; QQKN
+33F8 ; [.0FC8.0020.0004.33F8][.0FCB.0020.0004.33F8][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE; QQKN
+3256 ; [.0FC8.0020.0006.3256][.0FCC.0020.0006.3256] # CIRCLED NUMBER TWENTY SIX; QQKN
+33F9 ; [.0FC8.0020.0004.33F9][.0FCC.0020.0004.33F9][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX; QQKN
+3257 ; [.0FC8.0020.0006.3257][.0FCD.0020.0006.3257] # CIRCLED NUMBER TWENTY SEVEN; QQKN
+33FA ; [.0FC8.0020.0004.33FA][.0FCD.0020.0004.33FA][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN; QQKN
+3258 ; [.0FC8.0020.0006.3258][.0FCE.0020.0006.3258] # CIRCLED NUMBER TWENTY EIGHT; QQKN
+33FB ; [.0FC8.0020.0004.33FB][.0FCE.0020.0004.33FB][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT; QQKN
+3259 ; [.0FC8.0020.0006.3259][.0FCF.0020.0006.3259] # CIRCLED NUMBER TWENTY NINE; QQKN
+33FC ; [.0FC8.0020.0004.33FC][.0FCF.0020.0004.33FC][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE; QQKN
+33E1 ; [.0FC8.0020.0004.33E1][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO; QQKN
+32C1 ; [.0FC8.0020.0004.32C1][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY; QQKN
+335A ; [.0FC8.0020.0004.335A][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO; QQKN
+0033 ; [.0FC9.0020.0002.0033] # DIGIT THREE
+FF13 ; [.0FC9.0020.0003.FF13] # FULLWIDTH DIGIT THREE; QQK
+2476 ; [*02B1.0020.0004.2476][.0FC9.0020.0004.2476][*02B2.0020.001F.2476] # PARENTHESIZED DIGIT THREE; QQKN
+248A ; [.0FC9.0020.0004.248A][*0266.0020.0004.248A] # DIGIT THREE FULL STOP; QQKN
+1D7D1 ; [.0FC9.0020.0005.1D7D1] # MATHEMATICAL BOLD DIGIT THREE; QQK
+1D7DB ; [.0FC9.0020.0005.1D7DB] # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE; QQK
+1D7E5 ; [.0FC9.0020.0005.1D7E5] # MATHEMATICAL SANS-SERIF DIGIT THREE; QQK
+1D7EF ; [.0FC9.0020.0005.1D7EF] # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE; QQK
+1D7F9 ; [.0FC9.0020.0005.1D7F9] # MATHEMATICAL MONOSPACE DIGIT THREE; QQK
+2462 ; [.0FC9.0020.0006.2462] # CIRCLED DIGIT THREE; QQK
+24F7 ; [.0FC9.0020.0006.24F7] # DOUBLE CIRCLED DIGIT THREE; QQK
+2778 ; [.0FC9.0020.0006.2778] # DINGBAT NEGATIVE CIRCLED DIGIT THREE; QQK
+2782 ; [.0FC9.0020.0006.2782] # DINGBAT CIRCLED SANS-SERIF DIGIT THREE; QQK
+278C ; [.0FC9.0020.0006.278C] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE; QQK
+00B3 ; [.0FC9.0020.0014.00B3] # SUPERSCRIPT THREE; QQK
+2083 ; [.0FC9.0020.0015.2083] # SUBSCRIPT THREE; QQK
+0663 ; [.0FC9.0020.0002.0663][.0000.019F.0002.0663] # ARABIC-INDIC DIGIT THREE
+06F3 ; [.0FC9.0020.0002.06F3][.0000.01A0.0002.06F3] # EXTENDED ARABIC-INDIC DIGIT THREE
+07C3 ; [.0FC9.0020.0002.07C3][.0000.01A1.0002.07C3] # NKO DIGIT THREE
+136B ; [.0FC9.0020.0002.136B][.0000.01A2.0002.136B] # ETHIOPIC DIGIT THREE
+104A3 ; [.0FC9.0020.0002.104A3][.0000.01A3.0002.104A3] # OSMANYA DIGIT THREE
+0969 ; [.0FC9.0020.0002.0969][.0000.01A4.0002.0969] # DEVANAGARI DIGIT THREE
+09E9 ; [.0FC9.0020.0002.09E9][.0000.01A5.0002.09E9] # BENGALI DIGIT THREE
+09F6 ; [.0FC9.0020.0002.09F6][.0000.01A5.0002.09F6] # BENGALI CURRENCY NUMERATOR THREE
+0A69 ; [.0FC9.0020.0002.0A69][.0000.01A6.0002.0A69] # GURMUKHI DIGIT THREE
+0AE9 ; [.0FC9.0020.0002.0AE9][.0000.01A7.0002.0AE9] # GUJARATI DIGIT THREE
+0B69 ; [.0FC9.0020.0002.0B69][.0000.01A8.0002.0B69] # ORIYA DIGIT THREE
+0BE9 ; [.0FC9.0020.0002.0BE9][.0000.01A9.0002.0BE9] # TAMIL DIGIT THREE
+0C69 ; [.0FC9.0020.0002.0C69][.0000.01AA.0002.0C69] # TELUGU DIGIT THREE
+0CE9 ; [.0FC9.0020.0002.0CE9][.0000.01AB.0002.0CE9] # KANNADA DIGIT THREE
+0D69 ; [.0FC9.0020.0002.0D69][.0000.01AC.0002.0D69] # MALAYALAM DIGIT THREE
+1949 ; [.0FC9.0020.0002.1949][.0000.01AD.0002.1949] # LIMBU DIGIT THREE
+19D3 ; [.0FC9.0020.0002.19D3][.0000.01AE.0002.19D3] # NEW TAI LUE DIGIT THREE
+0E53 ; [.0FC9.0020.0002.0E53][.0000.01AF.0002.0E53] # THAI DIGIT THREE
+0ED3 ; [.0FC9.0020.0002.0ED3][.0000.01B0.0002.0ED3] # LAO DIGIT THREE
+0F23 ; [.0FC9.0020.0002.0F23][.0000.01B1.0002.0F23] # TIBETAN DIGIT THREE
+0F2C ; [.0FC9.0020.0004.0F2C][.0000.01B1.0004.0F2C] # TIBETAN DIGIT HALF THREE; QQK
+1043 ; [.0FC9.0020.0002.1043][.0000.01B2.0002.1043] # MYANMAR DIGIT THREE
+17E3 ; [.0FC9.0020.0002.17E3][.0000.01B3.0002.17E3] # KHMER DIGIT THREE
+17F3 ; [.0FC9.0020.0002.17F3][.0000.01B4.0002.17F3] # KHMER SYMBOL LEK ATTAK BEI
+1B53 ; [.0FC9.0020.0002.1B53][.0000.01B5.0002.1B53] # BALINESE DIGIT THREE
+1813 ; [.0FC9.0020.0002.1813][.0000.01B6.0002.1813] # MONGOLIAN DIGIT THREE
+3023 ; [.0FC9.0020.0002.3023][.0000.01B7.0002.3023] # HANGZHOU NUMERAL THREE
+10109 ; [.0FC9.0020.0002.10109][.0000.01B8.0002.10109] # AEGEAN NUMBER THREE
+12401 ; [.0FC9.0020.0002.12401][.0000.01BC.0002.12401] # CUNEIFORM NUMERIC SIGN THREE ASH
+12408 ; [.0FC9.0020.0002.12408][.0000.01BC.0002.12408] # CUNEIFORM NUMERIC SIGN THREE DISH
+12417 ; [.0FC9.0020.0002.12417][.0000.01BC.0002.12417] # CUNEIFORM NUMERIC SIGN THREE GESH2
+12420 ; [.0FC9.0020.0002.12420][.0000.01BC.0002.12420] # CUNEIFORM NUMERIC SIGN THREE GESHU
+12424 ; [.0FC9.0020.0002.12424][.0000.01BC.0002.12424] # CUNEIFORM NUMERIC SIGN THREE SHAR2
+12425 ; [.0FC9.0020.0002.12425][.0000.01BC.0002.12425] # CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM
+1242E ; [.0FC9.0020.0002.1242E][.0000.01BC.0002.1242E] # CUNEIFORM NUMERIC SIGN THREE SHARU
+1242F ; [.0FC9.0020.0002.1242F][.0000.01BC.0002.1242F] # CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM
+12436 ; [.0FC9.0020.0002.12436][.0000.01BC.0002.12436] # CUNEIFORM NUMERIC SIGN THREE BURU
+12437 ; [.0FC9.0020.0002.12437][.0000.01BC.0002.12437] # CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM
+1243A ; [.0FC9.0020.0002.1243A][.0000.01BC.0002.1243A] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16
+1243B ; [.0FC9.0020.0002.1243B][.0000.01BC.0002.1243B] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21
+1244B ; [.0FC9.0020.0002.1244B][.0000.01BC.0002.1244B] # CUNEIFORM NUMERIC SIGN THREE ASH TENU
+12451 ; [.0FC9.0020.0002.12451][.0000.01BC.0002.12451] # CUNEIFORM NUMERIC SIGN THREE BAN2
+10A42 ; [.0FC9.0020.0002.10A42][.0000.01BE.0002.10A42] # KHAROSHTHI DIGIT THREE
+1D362 ; [.0FC9.0020.0002.1D362][.0000.01BF.0002.1D362] # COUNTING ROD UNIT DIGIT THREE
+325A ; [.0FC9.0020.0006.325A][.0FC6.0020.0006.325A] # CIRCLED NUMBER THIRTY; QQKN
+33FD ; [.0FC9.0020.0004.33FD][.0FC6.0020.0004.33FD][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY; QQKN
+325B ; [.0FC9.0020.0006.325B][.0FC7.0020.0006.325B] # CIRCLED NUMBER THIRTY ONE; QQKN
+33FE ; [.0FC9.0020.0004.33FE][.0FC7.0020.0004.33FE][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE; QQKN
+325C ; [.0FC9.0020.0006.325C][.0FC8.0020.0006.325C] # CIRCLED NUMBER THIRTY TWO; QQKN
+325D ; [.0FC9.0020.0006.325D][.0FC9.0020.0006.325D] # CIRCLED NUMBER THIRTY THREE; QQKN
+325E ; [.0FC9.0020.0006.325E][.0FCA.0020.0006.325E] # CIRCLED NUMBER THIRTY FOUR; QQKN
+00BE ; [.0FC9.0020.001E.00BE][*0300.0020.001E.00BE][.0FCA.0020.001F.00BE] # VULGAR FRACTION THREE QUARTERS; QQKN
+325F ; [.0FC9.0020.0006.325F][.0FCB.0020.0006.325F] # CIRCLED NUMBER THIRTY FIVE; QQKN
+2157 ; [.0FC9.0020.001E.2157][*0300.0020.001E.2157][.0FCB.0020.001F.2157] # VULGAR FRACTION THREE FIFTHS; QQKN
+32B1 ; [.0FC9.0020.0006.32B1][.0FCC.0020.0006.32B1] # CIRCLED NUMBER THIRTY SIX; QQKN
+32B2 ; [.0FC9.0020.0006.32B2][.0FCD.0020.0006.32B2] # CIRCLED NUMBER THIRTY SEVEN; QQKN
+32B3 ; [.0FC9.0020.0006.32B3][.0FCE.0020.0006.32B3] # CIRCLED NUMBER THIRTY EIGHT; QQKN
+215C ; [.0FC9.0020.001E.215C][*0300.0020.001E.215C][.0FCE.0020.001F.215C] # VULGAR FRACTION THREE EIGHTHS; QQKN
+32B4 ; [.0FC9.0020.0006.32B4][.0FCF.0020.0006.32B4] # CIRCLED NUMBER THIRTY NINE; QQKN
+33E2 ; [.0FC9.0020.0004.33E2][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE; QQKN
+32C2 ; [.0FC9.0020.0004.32C2][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH; QQKN
+335B ; [.0FC9.0020.0004.335B][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE; QQKN
+0034 ; [.0FCA.0020.0002.0034] # DIGIT FOUR
+FF14 ; [.0FCA.0020.0003.FF14] # FULLWIDTH DIGIT FOUR; QQK
+2477 ; [*02B1.0020.0004.2477][.0FCA.0020.0004.2477][*02B2.0020.001F.2477] # PARENTHESIZED DIGIT FOUR; QQKN
+248B ; [.0FCA.0020.0004.248B][*0266.0020.0004.248B] # DIGIT FOUR FULL STOP; QQKN
+1D7D2 ; [.0FCA.0020.0005.1D7D2] # MATHEMATICAL BOLD DIGIT FOUR; QQK
+1D7DC ; [.0FCA.0020.0005.1D7DC] # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR; QQK
+1D7E6 ; [.0FCA.0020.0005.1D7E6] # MATHEMATICAL SANS-SERIF DIGIT FOUR; QQK
+1D7F0 ; [.0FCA.0020.0005.1D7F0] # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR; QQK
+1D7FA ; [.0FCA.0020.0005.1D7FA] # MATHEMATICAL MONOSPACE DIGIT FOUR; QQK
+2463 ; [.0FCA.0020.0006.2463] # CIRCLED DIGIT FOUR; QQK
+24F8 ; [.0FCA.0020.0006.24F8] # DOUBLE CIRCLED DIGIT FOUR; QQK
+2779 ; [.0FCA.0020.0006.2779] # DINGBAT NEGATIVE CIRCLED DIGIT FOUR; QQK
+2783 ; [.0FCA.0020.0006.2783] # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR; QQK
+278D ; [.0FCA.0020.0006.278D] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR; QQK
+2074 ; [.0FCA.0020.0014.2074] # SUPERSCRIPT FOUR; QQK
+2084 ; [.0FCA.0020.0015.2084] # SUBSCRIPT FOUR; QQK
+0664 ; [.0FCA.0020.0002.0664][.0000.019F.0002.0664] # ARABIC-INDIC DIGIT FOUR
+06F4 ; [.0FCA.0020.0002.06F4][.0000.01A0.0002.06F4] # EXTENDED ARABIC-INDIC DIGIT FOUR
+07C4 ; [.0FCA.0020.0002.07C4][.0000.01A1.0002.07C4] # NKO DIGIT FOUR
+136C ; [.0FCA.0020.0002.136C][.0000.01A2.0002.136C] # ETHIOPIC DIGIT FOUR
+104A4 ; [.0FCA.0020.0002.104A4][.0000.01A3.0002.104A4] # OSMANYA DIGIT FOUR
+096A ; [.0FCA.0020.0002.096A][.0000.01A4.0002.096A] # DEVANAGARI DIGIT FOUR
+09EA ; [.0FCA.0020.0002.09EA][.0000.01A5.0002.09EA] # BENGALI DIGIT FOUR
+09F7 ; [.0FCA.0020.0002.09F7][.0000.01A5.0002.09F7] # BENGALI CURRENCY NUMERATOR FOUR
+0A6A ; [.0FCA.0020.0002.0A6A][.0000.01A6.0002.0A6A] # GURMUKHI DIGIT FOUR
+0AEA ; [.0FCA.0020.0002.0AEA][.0000.01A7.0002.0AEA] # GUJARATI DIGIT FOUR
+0B6A ; [.0FCA.0020.0002.0B6A][.0000.01A8.0002.0B6A] # ORIYA DIGIT FOUR
+0BEA ; [.0FCA.0020.0002.0BEA][.0000.01A9.0002.0BEA] # TAMIL DIGIT FOUR
+0C6A ; [.0FCA.0020.0002.0C6A][.0000.01AA.0002.0C6A] # TELUGU DIGIT FOUR
+0CEA ; [.0FCA.0020.0002.0CEA][.0000.01AB.0002.0CEA] # KANNADA DIGIT FOUR
+0D6A ; [.0FCA.0020.0002.0D6A][.0000.01AC.0002.0D6A] # MALAYALAM DIGIT FOUR
+194A ; [.0FCA.0020.0002.194A][.0000.01AD.0002.194A] # LIMBU DIGIT FOUR
+19D4 ; [.0FCA.0020.0002.19D4][.0000.01AE.0002.19D4] # NEW TAI LUE DIGIT FOUR
+0E54 ; [.0FCA.0020.0002.0E54][.0000.01AF.0002.0E54] # THAI DIGIT FOUR
+0ED4 ; [.0FCA.0020.0002.0ED4][.0000.01B0.0002.0ED4] # LAO DIGIT FOUR
+0F24 ; [.0FCA.0020.0002.0F24][.0000.01B1.0002.0F24] # TIBETAN DIGIT FOUR
+0F2D ; [.0FCA.0020.0004.0F2D][.0000.01B1.0004.0F2D] # TIBETAN DIGIT HALF FOUR; QQK
+1044 ; [.0FCA.0020.0002.1044][.0000.01B2.0002.1044] # MYANMAR DIGIT FOUR
+17E4 ; [.0FCA.0020.0002.17E4][.0000.01B3.0002.17E4] # KHMER DIGIT FOUR
+17F4 ; [.0FCA.0020.0002.17F4][.0000.01B4.0002.17F4] # KHMER SYMBOL LEK ATTAK BUON
+1B54 ; [.0FCA.0020.0002.1B54][.0000.01B5.0002.1B54] # BALINESE DIGIT FOUR
+1814 ; [.0FCA.0020.0002.1814][.0000.01B6.0002.1814] # MONGOLIAN DIGIT FOUR
+3024 ; [.0FCA.0020.0002.3024][.0000.01B7.0002.3024] # HANGZHOU NUMERAL FOUR
+1010A ; [.0FCA.0020.0002.1010A][.0000.01B8.0002.1010A] # AEGEAN NUMBER FOUR
+12402 ; [.0FCA.0020.0002.12402][.0000.01BC.0002.12402] # CUNEIFORM NUMERIC SIGN FOUR ASH
+12409 ; [.0FCA.0020.0002.12409][.0000.01BC.0002.12409] # CUNEIFORM NUMERIC SIGN FOUR DISH
+1240F ; [.0FCA.0020.0002.1240F][.0000.01BC.0002.1240F] # CUNEIFORM NUMERIC SIGN FOUR U
+12418 ; [.0FCA.0020.0002.12418][.0000.01BC.0002.12418] # CUNEIFORM NUMERIC SIGN FOUR GESH2
+12421 ; [.0FCA.0020.0002.12421][.0000.01BC.0002.12421] # CUNEIFORM NUMERIC SIGN FOUR GESHU
+12426 ; [.0FCA.0020.0002.12426][.0000.01BC.0002.12426] # CUNEIFORM NUMERIC SIGN FOUR SHAR2
+12430 ; [.0FCA.0020.0002.12430][.0000.01BC.0002.12430] # CUNEIFORM NUMERIC SIGN FOUR SHARU
+12438 ; [.0FCA.0020.0002.12438][.0000.01BC.0002.12438] # CUNEIFORM NUMERIC SIGN FOUR BURU
+1243C ; [.0FCA.0020.0002.1243C][.0000.01BC.0002.1243C] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU
+1243D ; [.0FCA.0020.0002.1243D][.0000.01BC.0002.1243D] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4
+1243E ; [.0FCA.0020.0002.1243E][.0000.01BC.0002.1243E] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A
+1243F ; [.0FCA.0020.0002.1243F][.0000.01BC.0002.1243F] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B
+1244C ; [.0FCA.0020.0002.1244C][.0000.01BC.0002.1244C] # CUNEIFORM NUMERIC SIGN FOUR ASH TENU
+12452 ; [.0FCA.0020.0002.12452][.0000.01BC.0002.12452] # CUNEIFORM NUMERIC SIGN FOUR BAN2
+12453 ; [.0FCA.0020.0002.12453][.0000.01BC.0002.12453] # CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM
+10A43 ; [.0FCA.0020.0002.10A43][.0000.01BE.0002.10A43] # KHAROSHTHI DIGIT FOUR
+1D363 ; [.0FCA.0020.0002.1D363][.0000.01BF.0002.1D363] # COUNTING ROD UNIT DIGIT FOUR
+32B5 ; [.0FCA.0020.0006.32B5][.0FC6.0020.0006.32B5] # CIRCLED NUMBER FORTY; QQKN
+32B6 ; [.0FCA.0020.0006.32B6][.0FC7.0020.0006.32B6] # CIRCLED NUMBER FORTY ONE; QQKN
+32B7 ; [.0FCA.0020.0006.32B7][.0FC8.0020.0006.32B7] # CIRCLED NUMBER FORTY TWO; QQKN
+32B8 ; [.0FCA.0020.0006.32B8][.0FC9.0020.0006.32B8] # CIRCLED NUMBER FORTY THREE; QQKN
+32B9 ; [.0FCA.0020.0006.32B9][.0FCA.0020.0006.32B9] # CIRCLED NUMBER FORTY FOUR; QQKN
+32BA ; [.0FCA.0020.0006.32BA][.0FCB.0020.0006.32BA] # CIRCLED NUMBER FORTY FIVE; QQKN
+2158 ; [.0FCA.0020.001E.2158][*0300.0020.001E.2158][.0FCB.0020.001F.2158] # VULGAR FRACTION FOUR FIFTHS; QQKN
+32BB ; [.0FCA.0020.0006.32BB][.0FCC.0020.0006.32BB] # CIRCLED NUMBER FORTY SIX; QQKN
+32BC ; [.0FCA.0020.0006.32BC][.0FCD.0020.0006.32BC] # CIRCLED NUMBER FORTY SEVEN; QQKN
+32BD ; [.0FCA.0020.0006.32BD][.0FCE.0020.0006.32BD] # CIRCLED NUMBER FORTY EIGHT; QQKN
+32BE ; [.0FCA.0020.0006.32BE][.0FCF.0020.0006.32BE] # CIRCLED NUMBER FORTY NINE; QQKN
+33E3 ; [.0FCA.0020.0004.33E3][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR; QQKN
+32C3 ; [.0FCA.0020.0004.32C3][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL; QQKN
+335C ; [.0FCA.0020.0004.335C][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR; QQKN
+0035 ; [.0FCB.0020.0002.0035] # DIGIT FIVE
+FF15 ; [.0FCB.0020.0003.FF15] # FULLWIDTH DIGIT FIVE; QQK
+2478 ; [*02B1.0020.0004.2478][.0FCB.0020.0004.2478][*02B2.0020.001F.2478] # PARENTHESIZED DIGIT FIVE; QQKN
+248C ; [.0FCB.0020.0004.248C][*0266.0020.0004.248C] # DIGIT FIVE FULL STOP; QQKN
+1D7D3 ; [.0FCB.0020.0005.1D7D3] # MATHEMATICAL BOLD DIGIT FIVE; QQK
+1D7DD ; [.0FCB.0020.0005.1D7DD] # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE; QQK
+1D7E7 ; [.0FCB.0020.0005.1D7E7] # MATHEMATICAL SANS-SERIF DIGIT FIVE; QQK
+1D7F1 ; [.0FCB.0020.0005.1D7F1] # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE; QQK
+1D7FB ; [.0FCB.0020.0005.1D7FB] # MATHEMATICAL MONOSPACE DIGIT FIVE; QQK
+2464 ; [.0FCB.0020.0006.2464] # CIRCLED DIGIT FIVE; QQK
+24F9 ; [.0FCB.0020.0006.24F9] # DOUBLE CIRCLED DIGIT FIVE; QQK
+277A ; [.0FCB.0020.0006.277A] # DINGBAT NEGATIVE CIRCLED DIGIT FIVE; QQK
+2784 ; [.0FCB.0020.0006.2784] # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE; QQK
+278E ; [.0FCB.0020.0006.278E] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE; QQK
+2075 ; [.0FCB.0020.0014.2075] # SUPERSCRIPT FIVE; QQK
+2085 ; [.0FCB.0020.0015.2085] # SUBSCRIPT FIVE; QQK
+0665 ; [.0FCB.0020.0002.0665][.0000.019F.0002.0665] # ARABIC-INDIC DIGIT FIVE
+06F5 ; [.0FCB.0020.0002.06F5][.0000.01A0.0002.06F5] # EXTENDED ARABIC-INDIC DIGIT FIVE
+07C5 ; [.0FCB.0020.0002.07C5][.0000.01A1.0002.07C5] # NKO DIGIT FIVE
+136D ; [.0FCB.0020.0002.136D][.0000.01A2.0002.136D] # ETHIOPIC DIGIT FIVE
+104A5 ; [.0FCB.0020.0002.104A5][.0000.01A3.0002.104A5] # OSMANYA DIGIT FIVE
+096B ; [.0FCB.0020.0002.096B][.0000.01A4.0002.096B] # DEVANAGARI DIGIT FIVE
+09EB ; [.0FCB.0020.0002.09EB][.0000.01A5.0002.09EB] # BENGALI DIGIT FIVE
+0A6B ; [.0FCB.0020.0002.0A6B][.0000.01A6.0002.0A6B] # GURMUKHI DIGIT FIVE
+0AEB ; [.0FCB.0020.0002.0AEB][.0000.01A7.0002.0AEB] # GUJARATI DIGIT FIVE
+0B6B ; [.0FCB.0020.0002.0B6B][.0000.01A8.0002.0B6B] # ORIYA DIGIT FIVE
+0BEB ; [.0FCB.0020.0002.0BEB][.0000.01A9.0002.0BEB] # TAMIL DIGIT FIVE
+0C6B ; [.0FCB.0020.0002.0C6B][.0000.01AA.0002.0C6B] # TELUGU DIGIT FIVE
+0CEB ; [.0FCB.0020.0002.0CEB][.0000.01AB.0002.0CEB] # KANNADA DIGIT FIVE
+0D6B ; [.0FCB.0020.0002.0D6B][.0000.01AC.0002.0D6B] # MALAYALAM DIGIT FIVE
+194B ; [.0FCB.0020.0002.194B][.0000.01AD.0002.194B] # LIMBU DIGIT FIVE
+19D5 ; [.0FCB.0020.0002.19D5][.0000.01AE.0002.19D5] # NEW TAI LUE DIGIT FIVE
+0E55 ; [.0FCB.0020.0002.0E55][.0000.01AF.0002.0E55] # THAI DIGIT FIVE
+0ED5 ; [.0FCB.0020.0002.0ED5][.0000.01B0.0002.0ED5] # LAO DIGIT FIVE
+0F25 ; [.0FCB.0020.0002.0F25][.0000.01B1.0002.0F25] # TIBETAN DIGIT FIVE
+0F2E ; [.0FCB.0020.0004.0F2E][.0000.01B1.0004.0F2E] # TIBETAN DIGIT HALF FIVE; QQK
+1045 ; [.0FCB.0020.0002.1045][.0000.01B2.0002.1045] # MYANMAR DIGIT FIVE
+17E5 ; [.0FCB.0020.0002.17E5][.0000.01B3.0002.17E5] # KHMER DIGIT FIVE
+17F5 ; [.0FCB.0020.0002.17F5][.0000.01B4.0002.17F5] # KHMER SYMBOL LEK ATTAK PRAM
+1B55 ; [.0FCB.0020.0002.1B55][.0000.01B5.0002.1B55] # BALINESE DIGIT FIVE
+1815 ; [.0FCB.0020.0002.1815][.0000.01B6.0002.1815] # MONGOLIAN DIGIT FIVE
+3025 ; [.0FCB.0020.0002.3025][.0000.01B7.0002.3025] # HANGZHOU NUMERAL FIVE
+1010B ; [.0FCB.0020.0002.1010B][.0000.01B8.0002.1010B] # AEGEAN NUMBER FIVE
+10143 ; [.0FCB.0020.0002.10143][.0000.01B9.0002.10143] # GREEK ACROPHONIC ATTIC FIVE
+10148 ; [.0FCB.0020.0002.10148][.0000.01B9.0002.10148] # GREEK ACROPHONIC ATTIC FIVE TALENTS
+1014F ; [.0FCB.0020.0002.1014F][.0000.01B9.0002.1014F] # GREEK ACROPHONIC ATTIC FIVE STATERS
+1015F ; [.0FCB.0020.0002.1015F][.0000.01B9.0002.1015F] # GREEK ACROPHONIC TROEZENIAN FIVE
+10173 ; [.0FCB.0020.0002.10173][.0000.01B9.0002.10173] # GREEK ACROPHONIC DELPHIC FIVE MNAS
+10321 ; [.0FCB.0020.0002.10321][.0000.01BA.0002.10321] # OLD ITALIC NUMERAL FIVE
+12403 ; [.0FCB.0020.0002.12403][.0000.01BC.0002.12403] # CUNEIFORM NUMERIC SIGN FIVE ASH
+1240A ; [.0FCB.0020.0002.1240A][.0000.01BC.0002.1240A] # CUNEIFORM NUMERIC SIGN FIVE DISH
+12410 ; [.0FCB.0020.0002.12410][.0000.01BC.0002.12410] # CUNEIFORM NUMERIC SIGN FIVE U
+12419 ; [.0FCB.0020.0002.12419][.0000.01BC.0002.12419] # CUNEIFORM NUMERIC SIGN FIVE GESH2
+12422 ; [.0FCB.0020.0002.12422][.0000.01BC.0002.12422] # CUNEIFORM NUMERIC SIGN FIVE GESHU
+12427 ; [.0FCB.0020.0002.12427][.0000.01BC.0002.12427] # CUNEIFORM NUMERIC SIGN FIVE SHAR2
+12431 ; [.0FCB.0020.0002.12431][.0000.01BC.0002.12431] # CUNEIFORM NUMERIC SIGN FIVE SHARU
+12439 ; [.0FCB.0020.0002.12439][.0000.01BC.0002.12439] # CUNEIFORM NUMERIC SIGN FIVE BURU
+1244D ; [.0FCB.0020.0002.1244D][.0000.01BC.0002.1244D] # CUNEIFORM NUMERIC SIGN FIVE ASH TENU
+12454 ; [.0FCB.0020.0002.12454][.0000.01BC.0002.12454] # CUNEIFORM NUMERIC SIGN FIVE BAN2
+12455 ; [.0FCB.0020.0002.12455][.0000.01BC.0002.12455] # CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM
+1D364 ; [.0FCB.0020.0002.1D364][.0000.01BF.0002.1D364] # COUNTING ROD UNIT DIGIT FIVE
+32BF ; [.0FCB.0020.0006.32BF][.0FC6.0020.0006.32BF] # CIRCLED NUMBER FIFTY; QQKN
+215A ; [.0FCB.0020.001E.215A][*0300.0020.001E.215A][.0FCC.0020.001F.215A] # VULGAR FRACTION FIVE SIXTHS; QQKN
+215D ; [.0FCB.0020.001E.215D][*0300.0020.001E.215D][.0FCE.0020.001F.215D] # VULGAR FRACTION FIVE EIGHTHS; QQKN
+33E4 ; [.0FCB.0020.0004.33E4][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE; QQKN
+32C4 ; [.0FCB.0020.0004.32C4][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY; QQKN
+335D ; [.0FCB.0020.0004.335D][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE; QQKN
+0036 ; [.0FCC.0020.0002.0036] # DIGIT SIX
+FF16 ; [.0FCC.0020.0003.FF16] # FULLWIDTH DIGIT SIX; QQK
+2479 ; [*02B1.0020.0004.2479][.0FCC.0020.0004.2479][*02B2.0020.001F.2479] # PARENTHESIZED DIGIT SIX; QQKN
+248D ; [.0FCC.0020.0004.248D][*0266.0020.0004.248D] # DIGIT SIX FULL STOP; QQKN
+1D7D4 ; [.0FCC.0020.0005.1D7D4] # MATHEMATICAL BOLD DIGIT SIX; QQK
+1D7DE ; [.0FCC.0020.0005.1D7DE] # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX; QQK
+1D7E8 ; [.0FCC.0020.0005.1D7E8] # MATHEMATICAL SANS-SERIF DIGIT SIX; QQK
+1D7F2 ; [.0FCC.0020.0005.1D7F2] # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX; QQK
+1D7FC ; [.0FCC.0020.0005.1D7FC] # MATHEMATICAL MONOSPACE DIGIT SIX; QQK
+2465 ; [.0FCC.0020.0006.2465] # CIRCLED DIGIT SIX; QQK
+24FA ; [.0FCC.0020.0006.24FA] # DOUBLE CIRCLED DIGIT SIX; QQK
+277B ; [.0FCC.0020.0006.277B] # DINGBAT NEGATIVE CIRCLED DIGIT SIX; QQK
+2785 ; [.0FCC.0020.0006.2785] # DINGBAT CIRCLED SANS-SERIF DIGIT SIX; QQK
+278F ; [.0FCC.0020.0006.278F] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX; QQK
+2076 ; [.0FCC.0020.0014.2076] # SUPERSCRIPT SIX; QQK
+2086 ; [.0FCC.0020.0015.2086] # SUBSCRIPT SIX; QQK
+0666 ; [.0FCC.0020.0002.0666][.0000.019F.0002.0666] # ARABIC-INDIC DIGIT SIX
+06F6 ; [.0FCC.0020.0002.06F6][.0000.01A0.0002.06F6] # EXTENDED ARABIC-INDIC DIGIT SIX
+07C6 ; [.0FCC.0020.0002.07C6][.0000.01A1.0002.07C6] # NKO DIGIT SIX
+136E ; [.0FCC.0020.0002.136E][.0000.01A2.0002.136E] # ETHIOPIC DIGIT SIX
+104A6 ; [.0FCC.0020.0002.104A6][.0000.01A3.0002.104A6] # OSMANYA DIGIT SIX
+096C ; [.0FCC.0020.0002.096C][.0000.01A4.0002.096C] # DEVANAGARI DIGIT SIX
+09EC ; [.0FCC.0020.0002.09EC][.0000.01A5.0002.09EC] # BENGALI DIGIT SIX
+0A6C ; [.0FCC.0020.0002.0A6C][.0000.01A6.0002.0A6C] # GURMUKHI DIGIT SIX
+0AEC ; [.0FCC.0020.0002.0AEC][.0000.01A7.0002.0AEC] # GUJARATI DIGIT SIX
+0B6C ; [.0FCC.0020.0002.0B6C][.0000.01A8.0002.0B6C] # ORIYA DIGIT SIX
+0BEC ; [.0FCC.0020.0002.0BEC][.0000.01A9.0002.0BEC] # TAMIL DIGIT SIX
+0C6C ; [.0FCC.0020.0002.0C6C][.0000.01AA.0002.0C6C] # TELUGU DIGIT SIX
+0CEC ; [.0FCC.0020.0002.0CEC][.0000.01AB.0002.0CEC] # KANNADA DIGIT SIX
+0D6C ; [.0FCC.0020.0002.0D6C][.0000.01AC.0002.0D6C] # MALAYALAM DIGIT SIX
+194C ; [.0FCC.0020.0002.194C][.0000.01AD.0002.194C] # LIMBU DIGIT SIX
+19D6 ; [.0FCC.0020.0002.19D6][.0000.01AE.0002.19D6] # NEW TAI LUE DIGIT SIX
+0E56 ; [.0FCC.0020.0002.0E56][.0000.01AF.0002.0E56] # THAI DIGIT SIX
+0ED6 ; [.0FCC.0020.0002.0ED6][.0000.01B0.0002.0ED6] # LAO DIGIT SIX
+0F26 ; [.0FCC.0020.0002.0F26][.0000.01B1.0002.0F26] # TIBETAN DIGIT SIX
+0F2F ; [.0FCC.0020.0004.0F2F][.0000.01B1.0004.0F2F] # TIBETAN DIGIT HALF SIX; QQK
+1046 ; [.0FCC.0020.0002.1046][.0000.01B2.0002.1046] # MYANMAR DIGIT SIX
+17E6 ; [.0FCC.0020.0002.17E6][.0000.01B3.0002.17E6] # KHMER DIGIT SIX
+17F6 ; [.0FCC.0020.0002.17F6][.0000.01B4.0002.17F6] # KHMER SYMBOL LEK ATTAK PRAM-MUOY
+1B56 ; [.0FCC.0020.0002.1B56][.0000.01B5.0002.1B56] # BALINESE DIGIT SIX
+1816 ; [.0FCC.0020.0002.1816][.0000.01B6.0002.1816] # MONGOLIAN DIGIT SIX
+3026 ; [.0FCC.0020.0002.3026][.0000.01B7.0002.3026] # HANGZHOU NUMERAL SIX
+1010C ; [.0FCC.0020.0002.1010C][.0000.01B8.0002.1010C] # AEGEAN NUMBER SIX
+12404 ; [.0FCC.0020.0002.12404][.0000.01BC.0002.12404] # CUNEIFORM NUMERIC SIGN SIX ASH
+1240B ; [.0FCC.0020.0002.1240B][.0000.01BC.0002.1240B] # CUNEIFORM NUMERIC SIGN SIX DISH
+12411 ; [.0FCC.0020.0002.12411][.0000.01BC.0002.12411] # CUNEIFORM NUMERIC SIGN SIX U
+1241A ; [.0FCC.0020.0002.1241A][.0000.01BC.0002.1241A] # CUNEIFORM NUMERIC SIGN SIX GESH2
+12428 ; [.0FCC.0020.0002.12428][.0000.01BC.0002.12428] # CUNEIFORM NUMERIC SIGN SIX SHAR2
+12440 ; [.0FCC.0020.0002.12440][.0000.01BC.0002.12440] # CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9
+1244E ; [.0FCC.0020.0002.1244E][.0000.01BC.0002.1244E] # CUNEIFORM NUMERIC SIGN SIX ASH TENU
+1D365 ; [.0FCC.0020.0002.1D365][.0000.01BF.0002.1D365] # COUNTING ROD UNIT DIGIT SIX
+33E5 ; [.0FCC.0020.0004.33E5][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX; QQKN
+32C5 ; [.0FCC.0020.0004.32C5][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE; QQKN
+335E ; [.0FCC.0020.0004.335E][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX; QQKN
+0037 ; [.0FCD.0020.0002.0037] # DIGIT SEVEN
+FF17 ; [.0FCD.0020.0003.FF17] # FULLWIDTH DIGIT SEVEN; QQK
+247A ; [*02B1.0020.0004.247A][.0FCD.0020.0004.247A][*02B2.0020.001F.247A] # PARENTHESIZED DIGIT SEVEN; QQKN
+248E ; [.0FCD.0020.0004.248E][*0266.0020.0004.248E] # DIGIT SEVEN FULL STOP; QQKN
+1D7D5 ; [.0FCD.0020.0005.1D7D5] # MATHEMATICAL BOLD DIGIT SEVEN; QQK
+1D7DF ; [.0FCD.0020.0005.1D7DF] # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN; QQK
+1D7E9 ; [.0FCD.0020.0005.1D7E9] # MATHEMATICAL SANS-SERIF DIGIT SEVEN; QQK
+1D7F3 ; [.0FCD.0020.0005.1D7F3] # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN; QQK
+1D7FD ; [.0FCD.0020.0005.1D7FD] # MATHEMATICAL MONOSPACE DIGIT SEVEN; QQK
+2466 ; [.0FCD.0020.0006.2466] # CIRCLED DIGIT SEVEN; QQK
+24FB ; [.0FCD.0020.0006.24FB] # DOUBLE CIRCLED DIGIT SEVEN; QQK
+277C ; [.0FCD.0020.0006.277C] # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN; QQK
+2786 ; [.0FCD.0020.0006.2786] # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN; QQK
+2790 ; [.0FCD.0020.0006.2790] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN; QQK
+2077 ; [.0FCD.0020.0014.2077] # SUPERSCRIPT SEVEN; QQK
+2087 ; [.0FCD.0020.0015.2087] # SUBSCRIPT SEVEN; QQK
+0667 ; [.0FCD.0020.0002.0667][.0000.019F.0002.0667] # ARABIC-INDIC DIGIT SEVEN
+06F7 ; [.0FCD.0020.0002.06F7][.0000.01A0.0002.06F7] # EXTENDED ARABIC-INDIC DIGIT SEVEN
+07C7 ; [.0FCD.0020.0002.07C7][.0000.01A1.0002.07C7] # NKO DIGIT SEVEN
+136F ; [.0FCD.0020.0002.136F][.0000.01A2.0002.136F] # ETHIOPIC DIGIT SEVEN
+104A7 ; [.0FCD.0020.0002.104A7][.0000.01A3.0002.104A7] # OSMANYA DIGIT SEVEN
+096D ; [.0FCD.0020.0002.096D][.0000.01A4.0002.096D] # DEVANAGARI DIGIT SEVEN
+09ED ; [.0FCD.0020.0002.09ED][.0000.01A5.0002.09ED] # BENGALI DIGIT SEVEN
+0A6D ; [.0FCD.0020.0002.0A6D][.0000.01A6.0002.0A6D] # GURMUKHI DIGIT SEVEN
+0AED ; [.0FCD.0020.0002.0AED][.0000.01A7.0002.0AED] # GUJARATI DIGIT SEVEN
+0B6D ; [.0FCD.0020.0002.0B6D][.0000.01A8.0002.0B6D] # ORIYA DIGIT SEVEN
+0BED ; [.0FCD.0020.0002.0BED][.0000.01A9.0002.0BED] # TAMIL DIGIT SEVEN
+0C6D ; [.0FCD.0020.0002.0C6D][.0000.01AA.0002.0C6D] # TELUGU DIGIT SEVEN
+0CED ; [.0FCD.0020.0002.0CED][.0000.01AB.0002.0CED] # KANNADA DIGIT SEVEN
+0D6D ; [.0FCD.0020.0002.0D6D][.0000.01AC.0002.0D6D] # MALAYALAM DIGIT SEVEN
+194D ; [.0FCD.0020.0002.194D][.0000.01AD.0002.194D] # LIMBU DIGIT SEVEN
+19D7 ; [.0FCD.0020.0002.19D7][.0000.01AE.0002.19D7] # NEW TAI LUE DIGIT SEVEN
+0E57 ; [.0FCD.0020.0002.0E57][.0000.01AF.0002.0E57] # THAI DIGIT SEVEN
+0ED7 ; [.0FCD.0020.0002.0ED7][.0000.01B0.0002.0ED7] # LAO DIGIT SEVEN
+0F27 ; [.0FCD.0020.0002.0F27][.0000.01B1.0002.0F27] # TIBETAN DIGIT SEVEN
+0F30 ; [.0FCD.0020.0004.0F30][.0000.01B1.0004.0F30] # TIBETAN DIGIT HALF SEVEN; QQK
+1047 ; [.0FCD.0020.0002.1047][.0000.01B2.0002.1047] # MYANMAR DIGIT SEVEN
+17E7 ; [.0FCD.0020.0002.17E7][.0000.01B3.0002.17E7] # KHMER DIGIT SEVEN
+17F7 ; [.0FCD.0020.0002.17F7][.0000.01B4.0002.17F7] # KHMER SYMBOL LEK ATTAK PRAM-PII
+1B57 ; [.0FCD.0020.0002.1B57][.0000.01B5.0002.1B57] # BALINESE DIGIT SEVEN
+1817 ; [.0FCD.0020.0002.1817][.0000.01B6.0002.1817] # MONGOLIAN DIGIT SEVEN
+3027 ; [.0FCD.0020.0002.3027][.0000.01B7.0002.3027] # HANGZHOU NUMERAL SEVEN
+1010D ; [.0FCD.0020.0002.1010D][.0000.01B8.0002.1010D] # AEGEAN NUMBER SEVEN
+12405 ; [.0FCD.0020.0002.12405][.0000.01BC.0002.12405] # CUNEIFORM NUMERIC SIGN SEVEN ASH
+1240C ; [.0FCD.0020.0002.1240C][.0000.01BC.0002.1240C] # CUNEIFORM NUMERIC SIGN SEVEN DISH
+12412 ; [.0FCD.0020.0002.12412][.0000.01BC.0002.12412] # CUNEIFORM NUMERIC SIGN SEVEN U
+1241B ; [.0FCD.0020.0002.1241B][.0000.01BC.0002.1241B] # CUNEIFORM NUMERIC SIGN SEVEN GESH2
+12429 ; [.0FCD.0020.0002.12429][.0000.01BC.0002.12429] # CUNEIFORM NUMERIC SIGN SEVEN SHAR2
+12441 ; [.0FCD.0020.0002.12441][.0000.01BC.0002.12441] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3
+12442 ; [.0FCD.0020.0002.12442][.0000.01BC.0002.12442] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A
+12443 ; [.0FCD.0020.0002.12443][.0000.01BC.0002.12443] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B
+1D366 ; [.0FCD.0020.0002.1D366][.0000.01BF.0002.1D366] # COUNTING ROD UNIT DIGIT SEVEN
+215E ; [.0FCD.0020.001E.215E][*0300.0020.001E.215E][.0FCE.0020.001F.215E] # VULGAR FRACTION SEVEN EIGHTHS; QQKN
+33E6 ; [.0FCD.0020.0004.33E6][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN; QQKN
+32C6 ; [.0FCD.0020.0004.32C6][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY; QQKN
+335F ; [.0FCD.0020.0004.335F][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN; QQKN
+0038 ; [.0FCE.0020.0002.0038] # DIGIT EIGHT
+FF18 ; [.0FCE.0020.0003.FF18] # FULLWIDTH DIGIT EIGHT; QQK
+247B ; [*02B1.0020.0004.247B][.0FCE.0020.0004.247B][*02B2.0020.001F.247B] # PARENTHESIZED DIGIT EIGHT; QQKN
+248F ; [.0FCE.0020.0004.248F][*0266.0020.0004.248F] # DIGIT EIGHT FULL STOP; QQKN
+1D7D6 ; [.0FCE.0020.0005.1D7D6] # MATHEMATICAL BOLD DIGIT EIGHT; QQK
+1D7E0 ; [.0FCE.0020.0005.1D7E0] # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT; QQK
+1D7EA ; [.0FCE.0020.0005.1D7EA] # MATHEMATICAL SANS-SERIF DIGIT EIGHT; QQK
+1D7F4 ; [.0FCE.0020.0005.1D7F4] # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT; QQK
+1D7FE ; [.0FCE.0020.0005.1D7FE] # MATHEMATICAL MONOSPACE DIGIT EIGHT; QQK
+2467 ; [.0FCE.0020.0006.2467] # CIRCLED DIGIT EIGHT; QQK
+24FC ; [.0FCE.0020.0006.24FC] # DOUBLE CIRCLED DIGIT EIGHT; QQK
+277D ; [.0FCE.0020.0006.277D] # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT; QQK
+2787 ; [.0FCE.0020.0006.2787] # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT; QQK
+2791 ; [.0FCE.0020.0006.2791] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT; QQK
+2078 ; [.0FCE.0020.0014.2078] # SUPERSCRIPT EIGHT; QQK
+2088 ; [.0FCE.0020.0015.2088] # SUBSCRIPT EIGHT; QQK
+0668 ; [.0FCE.0020.0002.0668][.0000.019F.0002.0668] # ARABIC-INDIC DIGIT EIGHT
+06F8 ; [.0FCE.0020.0002.06F8][.0000.01A0.0002.06F8] # EXTENDED ARABIC-INDIC DIGIT EIGHT
+07C8 ; [.0FCE.0020.0002.07C8][.0000.01A1.0002.07C8] # NKO DIGIT EIGHT
+1370 ; [.0FCE.0020.0002.1370][.0000.01A2.0002.1370] # ETHIOPIC DIGIT EIGHT
+104A8 ; [.0FCE.0020.0002.104A8][.0000.01A3.0002.104A8] # OSMANYA DIGIT EIGHT
+096E ; [.0FCE.0020.0002.096E][.0000.01A4.0002.096E] # DEVANAGARI DIGIT EIGHT
+09EE ; [.0FCE.0020.0002.09EE][.0000.01A5.0002.09EE] # BENGALI DIGIT EIGHT
+0A6E ; [.0FCE.0020.0002.0A6E][.0000.01A6.0002.0A6E] # GURMUKHI DIGIT EIGHT
+0AEE ; [.0FCE.0020.0002.0AEE][.0000.01A7.0002.0AEE] # GUJARATI DIGIT EIGHT
+0B6E ; [.0FCE.0020.0002.0B6E][.0000.01A8.0002.0B6E] # ORIYA DIGIT EIGHT
+0BEE ; [.0FCE.0020.0002.0BEE][.0000.01A9.0002.0BEE] # TAMIL DIGIT EIGHT
+0C6E ; [.0FCE.0020.0002.0C6E][.0000.01AA.0002.0C6E] # TELUGU DIGIT EIGHT
+0CEE ; [.0FCE.0020.0002.0CEE][.0000.01AB.0002.0CEE] # KANNADA DIGIT EIGHT
+0D6E ; [.0FCE.0020.0002.0D6E][.0000.01AC.0002.0D6E] # MALAYALAM DIGIT EIGHT
+194E ; [.0FCE.0020.0002.194E][.0000.01AD.0002.194E] # LIMBU DIGIT EIGHT
+19D8 ; [.0FCE.0020.0002.19D8][.0000.01AE.0002.19D8] # NEW TAI LUE DIGIT EIGHT
+0E58 ; [.0FCE.0020.0002.0E58][.0000.01AF.0002.0E58] # THAI DIGIT EIGHT
+0ED8 ; [.0FCE.0020.0002.0ED8][.0000.01B0.0002.0ED8] # LAO DIGIT EIGHT
+0F28 ; [.0FCE.0020.0002.0F28][.0000.01B1.0002.0F28] # TIBETAN DIGIT EIGHT
+0F31 ; [.0FCE.0020.0004.0F31][.0000.01B1.0004.0F31] # TIBETAN DIGIT HALF EIGHT; QQK
+1048 ; [.0FCE.0020.0002.1048][.0000.01B2.0002.1048] # MYANMAR DIGIT EIGHT
+17E8 ; [.0FCE.0020.0002.17E8][.0000.01B3.0002.17E8] # KHMER DIGIT EIGHT
+17F8 ; [.0FCE.0020.0002.17F8][.0000.01B4.0002.17F8] # KHMER SYMBOL LEK ATTAK PRAM-BEI
+1B58 ; [.0FCE.0020.0002.1B58][.0000.01B5.0002.1B58] # BALINESE DIGIT EIGHT
+1818 ; [.0FCE.0020.0002.1818][.0000.01B6.0002.1818] # MONGOLIAN DIGIT EIGHT
+3028 ; [.0FCE.0020.0002.3028][.0000.01B7.0002.3028] # HANGZHOU NUMERAL EIGHT
+1010E ; [.0FCE.0020.0002.1010E][.0000.01B8.0002.1010E] # AEGEAN NUMBER EIGHT
+12406 ; [.0FCE.0020.0002.12406][.0000.01BC.0002.12406] # CUNEIFORM NUMERIC SIGN EIGHT ASH
+1240D ; [.0FCE.0020.0002.1240D][.0000.01BC.0002.1240D] # CUNEIFORM NUMERIC SIGN EIGHT DISH
+12413 ; [.0FCE.0020.0002.12413][.0000.01BC.0002.12413] # CUNEIFORM NUMERIC SIGN EIGHT U
+1241C ; [.0FCE.0020.0002.1241C][.0000.01BC.0002.1241C] # CUNEIFORM NUMERIC SIGN EIGHT GESH2
+1242A ; [.0FCE.0020.0002.1242A][.0000.01BC.0002.1242A] # CUNEIFORM NUMERIC SIGN EIGHT SHAR2
+12444 ; [.0FCE.0020.0002.12444][.0000.01BC.0002.12444] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU
+12445 ; [.0FCE.0020.0002.12445][.0000.01BC.0002.12445] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3
+1D367 ; [.0FCE.0020.0002.1D367][.0000.01BF.0002.1D367] # COUNTING ROD UNIT DIGIT EIGHT
+33E7 ; [.0FCE.0020.0004.33E7][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT; QQKN
+32C7 ; [.0FCE.0020.0004.32C7][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST; QQKN
+3360 ; [.0FCE.0020.0004.3360][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT; QQKN
+0039 ; [.0FCF.0020.0002.0039] # DIGIT NINE
+FF19 ; [.0FCF.0020.0003.FF19] # FULLWIDTH DIGIT NINE; QQK
+247C ; [*02B1.0020.0004.247C][.0FCF.0020.0004.247C][*02B2.0020.001F.247C] # PARENTHESIZED DIGIT NINE; QQKN
+2490 ; [.0FCF.0020.0004.2490][*0266.0020.0004.2490] # DIGIT NINE FULL STOP; QQKN
+1D7D7 ; [.0FCF.0020.0005.1D7D7] # MATHEMATICAL BOLD DIGIT NINE; QQK
+1D7E1 ; [.0FCF.0020.0005.1D7E1] # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE; QQK
+1D7EB ; [.0FCF.0020.0005.1D7EB] # MATHEMATICAL SANS-SERIF DIGIT NINE; QQK
+1D7F5 ; [.0FCF.0020.0005.1D7F5] # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE; QQK
+1D7FF ; [.0FCF.0020.0005.1D7FF] # MATHEMATICAL MONOSPACE DIGIT NINE; QQK
+2468 ; [.0FCF.0020.0006.2468] # CIRCLED DIGIT NINE; QQK
+24FD ; [.0FCF.0020.0006.24FD] # DOUBLE CIRCLED DIGIT NINE; QQK
+277E ; [.0FCF.0020.0006.277E] # DINGBAT NEGATIVE CIRCLED DIGIT NINE; QQK
+2788 ; [.0FCF.0020.0006.2788] # DINGBAT CIRCLED SANS-SERIF DIGIT NINE; QQK
+2792 ; [.0FCF.0020.0006.2792] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE; QQK
+2079 ; [.0FCF.0020.0014.2079] # SUPERSCRIPT NINE; QQK
+2089 ; [.0FCF.0020.0015.2089] # SUBSCRIPT NINE; QQK
+0669 ; [.0FCF.0020.0002.0669][.0000.019F.0002.0669] # ARABIC-INDIC DIGIT NINE
+06F9 ; [.0FCF.0020.0002.06F9][.0000.01A0.0002.06F9] # EXTENDED ARABIC-INDIC DIGIT NINE
+07C9 ; [.0FCF.0020.0002.07C9][.0000.01A1.0002.07C9] # NKO DIGIT NINE
+1371 ; [.0FCF.0020.0002.1371][.0000.01A2.0002.1371] # ETHIOPIC DIGIT NINE
+104A9 ; [.0FCF.0020.0002.104A9][.0000.01A3.0002.104A9] # OSMANYA DIGIT NINE
+096F ; [.0FCF.0020.0002.096F][.0000.01A4.0002.096F] # DEVANAGARI DIGIT NINE
+09EF ; [.0FCF.0020.0002.09EF][.0000.01A5.0002.09EF] # BENGALI DIGIT NINE
+0A6F ; [.0FCF.0020.0002.0A6F][.0000.01A6.0002.0A6F] # GURMUKHI DIGIT NINE
+0AEF ; [.0FCF.0020.0002.0AEF][.0000.01A7.0002.0AEF] # GUJARATI DIGIT NINE
+0B6F ; [.0FCF.0020.0002.0B6F][.0000.01A8.0002.0B6F] # ORIYA DIGIT NINE
+0BEF ; [.0FCF.0020.0002.0BEF][.0000.01A9.0002.0BEF] # TAMIL DIGIT NINE
+0C6F ; [.0FCF.0020.0002.0C6F][.0000.01AA.0002.0C6F] # TELUGU DIGIT NINE
+0CEF ; [.0FCF.0020.0002.0CEF][.0000.01AB.0002.0CEF] # KANNADA DIGIT NINE
+0D6F ; [.0FCF.0020.0002.0D6F][.0000.01AC.0002.0D6F] # MALAYALAM DIGIT NINE
+194F ; [.0FCF.0020.0002.194F][.0000.01AD.0002.194F] # LIMBU DIGIT NINE
+19D9 ; [.0FCF.0020.0002.19D9][.0000.01AE.0002.19D9] # NEW TAI LUE DIGIT NINE
+0E59 ; [.0FCF.0020.0002.0E59][.0000.01AF.0002.0E59] # THAI DIGIT NINE
+0ED9 ; [.0FCF.0020.0002.0ED9][.0000.01B0.0002.0ED9] # LAO DIGIT NINE
+0F29 ; [.0FCF.0020.0002.0F29][.0000.01B1.0002.0F29] # TIBETAN DIGIT NINE
+0F32 ; [.0FCF.0020.0004.0F32][.0000.01B1.0004.0F32] # TIBETAN DIGIT HALF NINE; QQK
+1049 ; [.0FCF.0020.0002.1049][.0000.01B2.0002.1049] # MYANMAR DIGIT NINE
+17E9 ; [.0FCF.0020.0002.17E9][.0000.01B3.0002.17E9] # KHMER DIGIT NINE
+17F9 ; [.0FCF.0020.0002.17F9][.0000.01B4.0002.17F9] # KHMER SYMBOL LEK ATTAK PRAM-BUON
+1B59 ; [.0FCF.0020.0002.1B59][.0000.01B5.0002.1B59] # BALINESE DIGIT NINE
+1819 ; [.0FCF.0020.0002.1819][.0000.01B6.0002.1819] # MONGOLIAN DIGIT NINE
+3029 ; [.0FCF.0020.0002.3029][.0000.01B7.0002.3029] # HANGZHOU NUMERAL NINE
+1010F ; [.0FCF.0020.0002.1010F][.0000.01B8.0002.1010F] # AEGEAN NUMBER NINE
+12407 ; [.0FCF.0020.0002.12407][.0000.01BC.0002.12407] # CUNEIFORM NUMERIC SIGN NINE ASH
+1240E ; [.0FCF.0020.0002.1240E][.0000.01BC.0002.1240E] # CUNEIFORM NUMERIC SIGN NINE DISH
+12414 ; [.0FCF.0020.0002.12414][.0000.01BC.0002.12414] # CUNEIFORM NUMERIC SIGN NINE U
+1241D ; [.0FCF.0020.0002.1241D][.0000.01BC.0002.1241D] # CUNEIFORM NUMERIC SIGN NINE GESH2
+1242B ; [.0FCF.0020.0002.1242B][.0000.01BC.0002.1242B] # CUNEIFORM NUMERIC SIGN NINE SHAR2
+12446 ; [.0FCF.0020.0002.12446][.0000.01BC.0002.12446] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU
+12447 ; [.0FCF.0020.0002.12447][.0000.01BC.0002.12447] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3
+12448 ; [.0FCF.0020.0002.12448][.0000.01BC.0002.12448] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4
+12449 ; [.0FCF.0020.0002.12449][.0000.01BC.0002.12449] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A
+1D368 ; [.0FCF.0020.0002.1D368][.0000.01BF.0002.1D368] # COUNTING ROD UNIT DIGIT NINE
+33E8 ; [.0FCF.0020.0004.33E8][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE; QQKN
+32C8 ; [.0FCF.0020.0004.32C8][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER; QQKN
+3361 ; [.0FCF.0020.0004.3361][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE; QQKN
+0061 ; [.0FD0.0020.0002.0061] # LATIN SMALL LETTER A
+FF41 ; [.0FD0.0020.0003.FF41] # FULLWIDTH LATIN SMALL LETTER A; QQK
+0363 ; [.0FD0.0020.0004.0363] # COMBINING LATIN SMALL LETTER A; QQK
+249C ; [*02B1.0020.0004.249C][.0FD0.0020.0004.249C][*02B2.0020.001F.249C] # PARENTHESIZED LATIN SMALL LETTER A; QQKN
+1D41A ; [.0FD0.0020.0005.1D41A] # MATHEMATICAL BOLD SMALL A; QQK
+1D44E ; [.0FD0.0020.0005.1D44E] # MATHEMATICAL ITALIC SMALL A; QQK
+1D482 ; [.0FD0.0020.0005.1D482] # MATHEMATICAL BOLD ITALIC SMALL A; QQK
+1D4B6 ; [.0FD0.0020.0005.1D4B6] # MATHEMATICAL SCRIPT SMALL A; QQK
+1D4EA ; [.0FD0.0020.0005.1D4EA] # MATHEMATICAL BOLD SCRIPT SMALL A; QQK
+1D51E ; [.0FD0.0020.0005.1D51E] # MATHEMATICAL FRAKTUR SMALL A; QQK
+1D552 ; [.0FD0.0020.0005.1D552] # MATHEMATICAL DOUBLE-STRUCK SMALL A; QQK
+1D586 ; [.0FD0.0020.0005.1D586] # MATHEMATICAL BOLD FRAKTUR SMALL A; QQK
+1D5BA ; [.0FD0.0020.0005.1D5BA] # MATHEMATICAL SANS-SERIF SMALL A; QQK
+1D5EE ; [.0FD0.0020.0005.1D5EE] # MATHEMATICAL SANS-SERIF BOLD SMALL A; QQK
+1D622 ; [.0FD0.0020.0005.1D622] # MATHEMATICAL SANS-SERIF ITALIC SMALL A; QQK
+1D656 ; [.0FD0.0020.0005.1D656] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A; QQK
+1D68A ; [.0FD0.0020.0005.1D68A] # MATHEMATICAL MONOSPACE SMALL A; QQK
+24D0 ; [.0FD0.0020.0006.24D0] # CIRCLED LATIN SMALL LETTER A; QQK
+0041 ; [.0FD0.0020.0008.0041] # LATIN CAPITAL LETTER A
+FF21 ; [.0FD0.0020.0009.FF21] # FULLWIDTH LATIN CAPITAL LETTER A; QQK
+1D400 ; [.0FD0.0020.000B.1D400] # MATHEMATICAL BOLD CAPITAL A; QQK
+1D434 ; [.0FD0.0020.000B.1D434] # MATHEMATICAL ITALIC CAPITAL A; QQK
+1D468 ; [.0FD0.0020.000B.1D468] # MATHEMATICAL BOLD ITALIC CAPITAL A; QQK
+1D49C ; [.0FD0.0020.000B.1D49C] # MATHEMATICAL SCRIPT CAPITAL A; QQK
+1D4D0 ; [.0FD0.0020.000B.1D4D0] # MATHEMATICAL BOLD SCRIPT CAPITAL A; QQK
+1D504 ; [.0FD0.0020.000B.1D504] # MATHEMATICAL FRAKTUR CAPITAL A; QQK
+1D538 ; [.0FD0.0020.000B.1D538] # MATHEMATICAL DOUBLE-STRUCK CAPITAL A; QQK
+1D56C ; [.0FD0.0020.000B.1D56C] # MATHEMATICAL BOLD FRAKTUR CAPITAL A; QQK
+1D5A0 ; [.0FD0.0020.000B.1D5A0] # MATHEMATICAL SANS-SERIF CAPITAL A; QQK
+1D5D4 ; [.0FD0.0020.000B.1D5D4] # MATHEMATICAL SANS-SERIF BOLD CAPITAL A; QQK
+1D608 ; [.0FD0.0020.000B.1D608] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A; QQK
+1D63C ; [.0FD0.0020.000B.1D63C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A; QQK
+1D670 ; [.0FD0.0020.000B.1D670] # MATHEMATICAL MONOSPACE CAPITAL A; QQK
+24B6 ; [.0FD0.0020.000C.24B6] # CIRCLED LATIN CAPITAL LETTER A; QQK
+00AA ; [.0FD0.0020.0014.00AA] # FEMININE ORDINAL INDICATOR; QQK
+1D43 ; [.0FD0.0020.0014.1D43] # MODIFIER LETTER SMALL A; QQK
+2090 ; [.0FD0.0020.0015.2090] # LATIN SUBSCRIPT SMALL LETTER A; QQK
+1D2C ; [.0FD0.0020.001D.1D2C] # MODIFIER LETTER CAPITAL A; QQK
+00E1 ; [.0FD0.0020.0002.0061][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH ACUTE; QQCM
+00C1 ; [.0FD0.0020.0008.0041][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH ACUTE; QQCM
+00E0 ; [.0FD0.0020.0002.0061][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH GRAVE; QQCM
+00C0 ; [.0FD0.0020.0008.0041][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH GRAVE; QQCM
+0103 ; [.0FD0.0020.0002.0061][.0000.0037.0002.0306] # LATIN SMALL LETTER A WITH BREVE; QQCM
+0102 ; [.0FD0.0020.0008.0041][.0000.0037.0002.0306] # LATIN CAPITAL LETTER A WITH BREVE; QQCM
+1EAF ; [.0FD0.0020.0002.0061][.0000.0037.0002.0306][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH BREVE AND ACUTE; QQCM
+1EAE ; [.0FD0.0020.0008.0041][.0000.0037.0002.0306][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE; QQCM
+1EB1 ; [.0FD0.0020.0002.0061][.0000.0037.0002.0306][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH BREVE AND GRAVE; QQCM
+1EB0 ; [.0FD0.0020.0008.0041][.0000.0037.0002.0306][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE; QQCM
+1EB5 ; [.0FD0.0020.0002.0061][.0000.0037.0002.0306][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH BREVE AND TILDE; QQCM
+1EB4 ; [.0FD0.0020.0008.0041][.0000.0037.0002.0306][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH BREVE AND TILDE; QQCM
+1EB3 ; [.0FD0.0020.0002.0061][.0000.0037.0002.0306][.0000.0060.0002.0309] # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE; QQCM
+1EB2 ; [.0FD0.0020.0008.0041][.0000.0037.0002.0306][.0000.0060.0002.0309] # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE; QQCM
+00E2 ; [.0FD0.0020.0002.0061][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX; QQCM
+00C2 ; [.0FD0.0020.0008.0041][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX; QQCM
+1EA5 ; [.0FD0.0020.0002.0061][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE; QQCM
+1EA4 ; [.0FD0.0020.0008.0041][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE; QQCM
+1EA7 ; [.0FD0.0020.0002.0061][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE; QQCM
+1EA6 ; [.0FD0.0020.0008.0041][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE; QQCM
+1EAB ; [.0FD0.0020.0002.0061][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE; QQCM
+1EAA ; [.0FD0.0020.0008.0041][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE; QQCM
+1EA9 ; [.0FD0.0020.0002.0061][.0000.003C.0002.0302][.0000.0060.0002.0309] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+1EA8 ; [.0FD0.0020.0008.0041][.0000.003C.0002.0302][.0000.0060.0002.0309] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+01CE ; [.0FD0.0020.0002.0061][.0000.0041.0002.030C] # LATIN SMALL LETTER A WITH CARON; QQCM
+01CD ; [.0FD0.0020.0008.0041][.0000.0041.0002.030C] # LATIN CAPITAL LETTER A WITH CARON; QQCM
+00E5 ; [.0FD0.0020.0002.0061][.0000.0043.0002.030A] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM
+00C5 ; [.0FD0.0020.0008.0041][.0000.0043.0002.030A] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM
+212B ; [.0FD0.0020.0008.0041][.0000.0043.0002.030A] # ANGSTROM SIGN; QQCM
+01FB ; [.0FD0.0020.0002.0061][.0000.0043.0002.030A][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE; QQCM
+01FA ; [.0FD0.0020.0008.0041][.0000.0043.0002.030A][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE; QQCM
+00E4 ; [.0FD0.0020.0002.0061][.0000.0047.0002.0308] # LATIN SMALL LETTER A WITH DIAERESIS; QQCM
+00C4 ; [.0FD0.0020.0008.0041][.0000.0047.0002.0308] # LATIN CAPITAL LETTER A WITH DIAERESIS; QQCM
+01DF ; [.0FD0.0020.0002.0061][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON; QQCM
+01DE ; [.0FD0.0020.0008.0041][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON; QQCM
+00E3 ; [.0FD0.0020.0002.0061][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH TILDE; QQCM
+00C3 ; [.0FD0.0020.0008.0041][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH TILDE; QQCM
+0227 ; [.0FD0.0020.0002.0061][.0000.0052.0002.0307] # LATIN SMALL LETTER A WITH DOT ABOVE; QQCM
+0226 ; [.0FD0.0020.0008.0041][.0000.0052.0002.0307] # LATIN CAPITAL LETTER A WITH DOT ABOVE; QQCM
+01E1 ; [.0FD0.0020.0002.0061][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON; QQCM
+01E0 ; [.0FD0.0020.0008.0041][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON; QQCM
+0105 ; [.0FD0.0020.0002.0061][.0000.0059.0002.0328] # LATIN SMALL LETTER A WITH OGONEK; QQCM
+0104 ; [.0FD0.0020.0008.0041][.0000.0059.0002.0328] # LATIN CAPITAL LETTER A WITH OGONEK; QQCM
+0101 ; [.0FD0.0020.0002.0061][.0000.005B.0002.0304] # LATIN SMALL LETTER A WITH MACRON; QQCM
+0100 ; [.0FD0.0020.0008.0041][.0000.005B.0002.0304] # LATIN CAPITAL LETTER A WITH MACRON; QQCM
+1EA3 ; [.0FD0.0020.0002.0061][.0000.0060.0002.0309] # LATIN SMALL LETTER A WITH HOOK ABOVE; QQCM
+1EA2 ; [.0FD0.0020.0008.0041][.0000.0060.0002.0309] # LATIN CAPITAL LETTER A WITH HOOK ABOVE; QQCM
+0201 ; [.0FD0.0020.0002.0061][.0000.0063.0002.030F] # LATIN SMALL LETTER A WITH DOUBLE GRAVE; QQCM
+0200 ; [.0FD0.0020.0008.0041][.0000.0063.0002.030F] # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE; QQCM
+0203 ; [.0FD0.0020.0002.0061][.0000.0065.0002.0311] # LATIN SMALL LETTER A WITH INVERTED BREVE; QQCM
+0202 ; [.0FD0.0020.0008.0041][.0000.0065.0002.0311] # LATIN CAPITAL LETTER A WITH INVERTED BREVE; QQCM
+1EA1 ; [.0FD0.0020.0002.0061][.0000.007A.0002.0323] # LATIN SMALL LETTER A WITH DOT BELOW; QQCM
+1EA0 ; [.0FD0.0020.0008.0041][.0000.007A.0002.0323] # LATIN CAPITAL LETTER A WITH DOT BELOW; QQCM
+1EB7 ; [.0FD0.0020.0002.0061][.0000.007A.0002.0323][.0000.0037.0002.0306] # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW; QQCM
+1EB6 ; [.0FD0.0020.0008.0041][.0000.007A.0002.0323][.0000.0037.0002.0306] # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW; QQCM
+1EAD ; [.0FD0.0020.0002.0061][.0000.007A.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1EAC ; [.0FD0.0020.0008.0041][.0000.007A.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1E01 ; [.0FD0.0020.0002.0061][.0000.0080.0002.0325] # LATIN SMALL LETTER A WITH RING BELOW; QQCM
+1E00 ; [.0FD0.0020.0008.0041][.0000.0080.0002.0325] # LATIN CAPITAL LETTER A WITH RING BELOW; QQCM
+2100 ; [.0FD0.0020.0004.2100][*02FF.0020.0004.2100][.0FFE.0020.001F.2100] # ACCOUNT OF; QQKN
+00E6 ; [.0FD0.0020.0004.00E6][.0000.0199.0004.00E6][.1029.0020.001F.00E6] # LATIN SMALL LETTER AE; QQKN
+00C6 ; [.0FD0.0020.000A.00C6][.0000.0199.0004.00C6][.1029.0020.001F.00C6] # LATIN CAPITAL LETTER AE; QQKN
+1D2D ; [.0FD0.0020.0014.1D2D][.0000.0199.0014.1D2D][.1029.0020.001F.1D2D] # MODIFIER LETTER CAPITAL AE; QQKN
+01FD ; [.0FD0.0020.0004.01FD][.0000.0199.0004.01FD][.1029.0020.001F.01FD][.0000.0032.0002.01FD] # LATIN SMALL LETTER AE WITH ACUTE; QQKN
+01FC ; [.0FD0.0020.000A.01FC][.0000.0199.0004.01FC][.1029.0020.001F.01FC][.0000.0032.0002.01FC] # LATIN CAPITAL LETTER AE WITH ACUTE; QQKN
+01E3 ; [.0FD0.0020.0004.01E3][.0000.0199.0004.01E3][.1029.0020.001F.01E3][.0000.005B.0002.01E3] # LATIN SMALL LETTER AE WITH MACRON; QQKN
+01E2 ; [.0FD0.0020.000A.01E2][.0000.0199.0004.01E2][.1029.0020.001F.01E2][.0000.005B.0002.01E2] # LATIN CAPITAL LETTER AE WITH MACRON; QQKN
+33C2 ; [.0FD0.0020.001C.33C2][*0266.0020.001C.33C2][.1110.0020.001F.33C2][*0266.0020.001F.33C2] # SQUARE AM; QQKN
+33DF ; [.0FD0.0020.001D.33DF][*04C7.0020.001C.33DF][.1110.0020.001F.33DF] # SQUARE A OVER M; QQKN
+2101 ; [.0FD0.0020.0004.2101][*02FF.0020.0004.2101][.11AF.0020.001F.2101] # ADDRESSED TO THE SUBJECT; QQKN
+3373 ; [.0FD0.0020.001D.3373][.11EE.0020.001D.3373] # SQUARE AU; QQKN
+1E9A ; [.0FD0.0020.0004.1E9A][.1298.0020.0004.1E9A] # LATIN SMALL LETTER A WITH RIGHT HALF RING; QQKN
+1D00 ; [.0FD4.0020.0002.1D00] # LATIN LETTER SMALL CAPITAL A
+2C65 ; [.0FD5.0020.0002.2C65] # LATIN SMALL LETTER A WITH STROKE
+023A ; [.0FD5.0020.0008.023A] # LATIN CAPITAL LETTER A WITH STROKE
+1D8F ; [.0FD6.0020.0002.1D8F] # LATIN SMALL LETTER A WITH RETROFLEX HOOK
+1D01 ; [.0FD7.0020.0002.1D01] # LATIN LETTER SMALL CAPITAL AE
+1D02 ; [.0FD8.0020.0002.1D02] # LATIN SMALL LETTER TURNED AE
+1D46 ; [.0FD8.0020.0014.1D46] # MODIFIER LETTER SMALL TURNED AE; QQK
+0250 ; [.0FD9.0020.0002.0250] # LATIN SMALL LETTER TURNED A
+1D44 ; [.0FD9.0020.0014.1D44] # MODIFIER LETTER SMALL TURNED A; QQK
+0251 ; [.0FDD.0020.0002.0251] # LATIN SMALL LETTER ALPHA
+1D45 ; [.0FDD.0020.0014.1D45] # MODIFIER LETTER SMALL ALPHA; QQK
+1D90 ; [.0FE1.0020.0002.1D90] # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK
+0252 ; [.0FE2.0020.0002.0252] # LATIN SMALL LETTER TURNED ALPHA
+1D9B ; [.0FE2.0020.0014.1D9B] # MODIFIER LETTER SMALL TURNED ALPHA; QQK
+0062 ; [.0FE6.0020.0002.0062] # LATIN SMALL LETTER B
+FF42 ; [.0FE6.0020.0003.FF42] # FULLWIDTH LATIN SMALL LETTER B; QQK
+249D ; [*02B1.0020.0004.249D][.0FE6.0020.0004.249D][*02B2.0020.001F.249D] # PARENTHESIZED LATIN SMALL LETTER B; QQKN
+1D41B ; [.0FE6.0020.0005.1D41B] # MATHEMATICAL BOLD SMALL B; QQK
+1D44F ; [.0FE6.0020.0005.1D44F] # MATHEMATICAL ITALIC SMALL B; QQK
+1D483 ; [.0FE6.0020.0005.1D483] # MATHEMATICAL BOLD ITALIC SMALL B; QQK
+1D4B7 ; [.0FE6.0020.0005.1D4B7] # MATHEMATICAL SCRIPT SMALL B; QQK
+1D4EB ; [.0FE6.0020.0005.1D4EB] # MATHEMATICAL BOLD SCRIPT SMALL B; QQK
+1D51F ; [.0FE6.0020.0005.1D51F] # MATHEMATICAL FRAKTUR SMALL B; QQK
+1D553 ; [.0FE6.0020.0005.1D553] # MATHEMATICAL DOUBLE-STRUCK SMALL B; QQK
+1D587 ; [.0FE6.0020.0005.1D587] # MATHEMATICAL BOLD FRAKTUR SMALL B; QQK
+1D5BB ; [.0FE6.0020.0005.1D5BB] # MATHEMATICAL SANS-SERIF SMALL B; QQK
+1D5EF ; [.0FE6.0020.0005.1D5EF] # MATHEMATICAL SANS-SERIF BOLD SMALL B; QQK
+1D623 ; [.0FE6.0020.0005.1D623] # MATHEMATICAL SANS-SERIF ITALIC SMALL B; QQK
+1D657 ; [.0FE6.0020.0005.1D657] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B; QQK
+1D68B ; [.0FE6.0020.0005.1D68B] # MATHEMATICAL MONOSPACE SMALL B; QQK
+24D1 ; [.0FE6.0020.0006.24D1] # CIRCLED LATIN SMALL LETTER B; QQK
+0042 ; [.0FE6.0020.0008.0042] # LATIN CAPITAL LETTER B
+FF22 ; [.0FE6.0020.0009.FF22] # FULLWIDTH LATIN CAPITAL LETTER B; QQK
+212C ; [.0FE6.0020.000B.212C] # SCRIPT CAPITAL B; QQK
+1D401 ; [.0FE6.0020.000B.1D401] # MATHEMATICAL BOLD CAPITAL B; QQK
+1D435 ; [.0FE6.0020.000B.1D435] # MATHEMATICAL ITALIC CAPITAL B; QQK
+1D469 ; [.0FE6.0020.000B.1D469] # MATHEMATICAL BOLD ITALIC CAPITAL B; QQK
+1D4D1 ; [.0FE6.0020.000B.1D4D1] # MATHEMATICAL BOLD SCRIPT CAPITAL B; QQK
+1D505 ; [.0FE6.0020.000B.1D505] # MATHEMATICAL FRAKTUR CAPITAL B; QQK
+1D539 ; [.0FE6.0020.000B.1D539] # MATHEMATICAL DOUBLE-STRUCK CAPITAL B; QQK
+1D56D ; [.0FE6.0020.000B.1D56D] # MATHEMATICAL BOLD FRAKTUR CAPITAL B; QQK
+1D5A1 ; [.0FE6.0020.000B.1D5A1] # MATHEMATICAL SANS-SERIF CAPITAL B; QQK
+1D5D5 ; [.0FE6.0020.000B.1D5D5] # MATHEMATICAL SANS-SERIF BOLD CAPITAL B; QQK
+1D609 ; [.0FE6.0020.000B.1D609] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B; QQK
+1D63D ; [.0FE6.0020.000B.1D63D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B; QQK
+1D671 ; [.0FE6.0020.000B.1D671] # MATHEMATICAL MONOSPACE CAPITAL B; QQK
+24B7 ; [.0FE6.0020.000C.24B7] # CIRCLED LATIN CAPITAL LETTER B; QQK
+1D47 ; [.0FE6.0020.0014.1D47] # MODIFIER LETTER SMALL B; QQK
+1D2E ; [.0FE6.0020.001D.1D2E] # MODIFIER LETTER CAPITAL B; QQK
+1E03 ; [.0FE6.0020.0002.0062][.0000.0052.0002.0307] # LATIN SMALL LETTER B WITH DOT ABOVE; QQCM
+1E02 ; [.0FE6.0020.0008.0042][.0000.0052.0002.0307] # LATIN CAPITAL LETTER B WITH DOT ABOVE; QQCM
+1E05 ; [.0FE6.0020.0002.0062][.0000.007A.0002.0323] # LATIN SMALL LETTER B WITH DOT BELOW; QQCM
+1E04 ; [.0FE6.0020.0008.0042][.0000.007A.0002.0323] # LATIN CAPITAL LETTER B WITH DOT BELOW; QQCM
+1E07 ; [.0FE6.0020.0002.0062][.0000.008A.0002.0331] # LATIN SMALL LETTER B WITH LINE BELOW; QQCM
+1E06 ; [.0FE6.0020.0008.0042][.0000.008A.0002.0331] # LATIN CAPITAL LETTER B WITH LINE BELOW; QQCM
+3374 ; [.0FE6.0020.001C.3374][.0FD0.0020.001C.3374][.117E.0020.001F.3374] # SQUARE BAR; QQKN
+33C3 ; [.0FE6.0020.001D.33C3][.116E.0020.001C.33C3] # SQUARE BQ; QQKN
+0299 ; [.0FEA.0020.0002.0299] # LATIN LETTER SMALL CAPITAL B
+0180 ; [.0FEE.0020.0002.0180] # LATIN SMALL LETTER B WITH STROKE
+0243 ; [.0FEE.0020.0008.0243] # LATIN CAPITAL LETTER B WITH STROKE
+1D2F ; [.0FF2.0020.0002.1D2F] # MODIFIER LETTER CAPITAL BARRED B
+1D03 ; [.0FF3.0020.0002.1D03] # LATIN LETTER SMALL CAPITAL BARRED B
+1D6C ; [.0FF4.0020.0002.1D6C] # LATIN SMALL LETTER B WITH MIDDLE TILDE
+1D80 ; [.0FF5.0020.0002.1D80] # LATIN SMALL LETTER B WITH PALATAL HOOK
+0253 ; [.0FF6.0020.0002.0253] # LATIN SMALL LETTER B WITH HOOK
+0181 ; [.0FF6.0020.0008.0181] # LATIN CAPITAL LETTER B WITH HOOK
+0183 ; [.0FFA.0020.0002.0183] # LATIN SMALL LETTER B WITH TOPBAR
+0182 ; [.0FFA.0020.0008.0182] # LATIN CAPITAL LETTER B WITH TOPBAR
+0063 ; [.0FFE.0020.0002.0063] # LATIN SMALL LETTER C
+FF43 ; [.0FFE.0020.0003.FF43] # FULLWIDTH LATIN SMALL LETTER C; QQK
+0368 ; [.0FFE.0020.0004.0368] # COMBINING LATIN SMALL LETTER C; QQK
+217D ; [.0FFE.0020.0004.217D] # SMALL ROMAN NUMERAL ONE HUNDRED; QQK
+249E ; [*02B1.0020.0004.249E][.0FFE.0020.0004.249E][*02B2.0020.001F.249E] # PARENTHESIZED LATIN SMALL LETTER C; QQKN
+1D41C ; [.0FFE.0020.0005.1D41C] # MATHEMATICAL BOLD SMALL C; QQK
+1D450 ; [.0FFE.0020.0005.1D450] # MATHEMATICAL ITALIC SMALL C; QQK
+1D484 ; [.0FFE.0020.0005.1D484] # MATHEMATICAL BOLD ITALIC SMALL C; QQK
+1D4B8 ; [.0FFE.0020.0005.1D4B8] # MATHEMATICAL SCRIPT SMALL C; QQK
+1D4EC ; [.0FFE.0020.0005.1D4EC] # MATHEMATICAL BOLD SCRIPT SMALL C; QQK
+1D520 ; [.0FFE.0020.0005.1D520] # MATHEMATICAL FRAKTUR SMALL C; QQK
+1D554 ; [.0FFE.0020.0005.1D554] # MATHEMATICAL DOUBLE-STRUCK SMALL C; QQK
+1D588 ; [.0FFE.0020.0005.1D588] # MATHEMATICAL BOLD FRAKTUR SMALL C; QQK
+1D5BC ; [.0FFE.0020.0005.1D5BC] # MATHEMATICAL SANS-SERIF SMALL C; QQK
+1D5F0 ; [.0FFE.0020.0005.1D5F0] # MATHEMATICAL SANS-SERIF BOLD SMALL C; QQK
+1D624 ; [.0FFE.0020.0005.1D624] # MATHEMATICAL SANS-SERIF ITALIC SMALL C; QQK
+1D658 ; [.0FFE.0020.0005.1D658] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C; QQK
+1D68C ; [.0FFE.0020.0005.1D68C] # MATHEMATICAL MONOSPACE SMALL C; QQK
+24D2 ; [.0FFE.0020.0006.24D2] # CIRCLED LATIN SMALL LETTER C; QQK
+0043 ; [.0FFE.0020.0008.0043] # LATIN CAPITAL LETTER C
+FF23 ; [.0FFE.0020.0009.FF23] # FULLWIDTH LATIN CAPITAL LETTER C; QQK
+2103 ; [*03BF.0020.0004.2103][.0FFE.0020.000A.2103] # DEGREE CELSIUS; QQKN
+216D ; [.0FFE.0020.000A.216D] # ROMAN NUMERAL ONE HUNDRED; QQK
+2102 ; [.0FFE.0020.000B.2102] # DOUBLE-STRUCK CAPITAL C; QQK
+212D ; [.0FFE.0020.000B.212D] # BLACK-LETTER CAPITAL C; QQK
+1D402 ; [.0FFE.0020.000B.1D402] # MATHEMATICAL BOLD CAPITAL C; QQK
+1D436 ; [.0FFE.0020.000B.1D436] # MATHEMATICAL ITALIC CAPITAL C; QQK
+1D46A ; [.0FFE.0020.000B.1D46A] # MATHEMATICAL BOLD ITALIC CAPITAL C; QQK
+1D49E ; [.0FFE.0020.000B.1D49E] # MATHEMATICAL SCRIPT CAPITAL C; QQK
+1D4D2 ; [.0FFE.0020.000B.1D4D2] # MATHEMATICAL BOLD SCRIPT CAPITAL C; QQK
+1D56E ; [.0FFE.0020.000B.1D56E] # MATHEMATICAL BOLD FRAKTUR CAPITAL C; QQK
+1D5A2 ; [.0FFE.0020.000B.1D5A2] # MATHEMATICAL SANS-SERIF CAPITAL C; QQK
+1D5D6 ; [.0FFE.0020.000B.1D5D6] # MATHEMATICAL SANS-SERIF BOLD CAPITAL C; QQK
+1D60A ; [.0FFE.0020.000B.1D60A] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C; QQK
+1D63E ; [.0FFE.0020.000B.1D63E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C; QQK
+1D672 ; [.0FFE.0020.000B.1D672] # MATHEMATICAL MONOSPACE CAPITAL C; QQK
+24B8 ; [.0FFE.0020.000C.24B8] # CIRCLED LATIN CAPITAL LETTER C; QQK
+1D9C ; [.0FFE.0020.0014.1D9C] # MODIFIER LETTER SMALL C; QQK
+0107 ; [.0FFE.0020.0002.0063][.0000.0032.0002.0301] # LATIN SMALL LETTER C WITH ACUTE; QQCM
+0106 ; [.0FFE.0020.0008.0043][.0000.0032.0002.0301] # LATIN CAPITAL LETTER C WITH ACUTE; QQCM
+0109 ; [.0FFE.0020.0002.0063][.0000.003C.0002.0302] # LATIN SMALL LETTER C WITH CIRCUMFLEX; QQCM
+0108 ; [.0FFE.0020.0008.0043][.0000.003C.0002.0302] # LATIN CAPITAL LETTER C WITH CIRCUMFLEX; QQCM
+010D ; [.0FFE.0020.0002.0063][.0000.0041.0002.030C] # LATIN SMALL LETTER C WITH CARON; QQCM
+010C ; [.0FFE.0020.0008.0043][.0000.0041.0002.030C] # LATIN CAPITAL LETTER C WITH CARON; QQCM
+010B ; [.0FFE.0020.0002.0063][.0000.0052.0002.0307] # LATIN SMALL LETTER C WITH DOT ABOVE; QQCM
+010A ; [.0FFE.0020.0008.0043][.0000.0052.0002.0307] # LATIN CAPITAL LETTER C WITH DOT ABOVE; QQCM
+00E7 ; [.0FFE.0020.0002.0063][.0000.0056.0002.0327] # LATIN SMALL LETTER C WITH CEDILLA; QQCM
+00C7 ; [.0FFE.0020.0008.0043][.0000.0056.0002.0327] # LATIN CAPITAL LETTER C WITH CEDILLA; QQCM
+1E09 ; [.0FFE.0020.0002.0063][.0000.0056.0002.0327][.0000.0032.0002.0301] # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE; QQCM
+1E08 ; [.0FFE.0020.0008.0043][.0000.0056.0002.0327][.0000.0032.0002.0301] # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE; QQCM
+3388 ; [.0FFE.0020.001C.3388][.0FD0.0020.001C.3388][.10E5.0020.001F.3388] # SQUARE CAL; QQKN
+33C4 ; [.0FFE.0020.001C.33C4][.0FFE.0020.001C.33C4] # SQUARE CC; QQKN
+33C5 ; [.0FFE.0020.001C.33C5][.1010.0020.001C.33C5] # SQUARE CD; QQKN
+33C6 ; [.0FFE.0020.001D.33C6][*04C7.0020.001C.33C6][.10D6.0020.001F.33C6][.106A.0020.001F.33C6] # SQUARE C OVER KG; QQKN
+339D ; [.0FFE.0020.001C.339D][.1110.0020.001C.339D] # SQUARE CM; QQKN
+33A0 ; [.0FFE.0020.001C.33A0][.1110.0020.001C.33A0][.0FC8.0020.001F.33A0] # SQUARE CM SQUARED; QQKN
+33A4 ; [.0FFE.0020.001C.33A4][.1110.0020.001C.33A4][.0FC9.0020.001F.33A4] # SQUARE CM CUBED; QQKN
+2105 ; [.0FFE.0020.0004.2105][*02FF.0020.0004.2105][.113B.0020.001F.2105] # CARE OF; QQKN
+33C7 ; [.0FFE.0020.001D.33C7][.113B.0020.001C.33C7][*0266.0020.001F.33C7] # SQUARE CO; QQKN
+2106 ; [.0FFE.0020.0004.2106][*02FF.0020.0004.2106][.11EE.0020.001F.2106] # CADA UNA; QQKN
+1D04 ; [.1002.0020.0002.1D04] # LATIN LETTER SMALL CAPITAL C
+023C ; [.1003.0020.0002.023C] # LATIN SMALL LETTER C WITH STROKE
+023B ; [.1003.0020.0008.023B] # LATIN CAPITAL LETTER C WITH STROKE
+0188 ; [.1007.0020.0002.0188] # LATIN SMALL LETTER C WITH HOOK
+0187 ; [.1007.0020.0008.0187] # LATIN CAPITAL LETTER C WITH HOOK
+0255 ; [.100B.0020.0002.0255] # LATIN SMALL LETTER C WITH CURL
+1D9D ; [.100B.0020.0014.1D9D] # MODIFIER LETTER SMALL C WITH CURL; QQK
+2184 ; [.100F.0020.0002.2184] # LATIN SMALL LETTER REVERSED C
+2183 ; [.100F.0020.0008.2183] # ROMAN NUMERAL REVERSED ONE HUNDRED
+0064 ; [.1010.0020.0002.0064] # LATIN SMALL LETTER D
+FF44 ; [.1010.0020.0003.FF44] # FULLWIDTH LATIN SMALL LETTER D; QQK
+0369 ; [.1010.0020.0004.0369] # COMBINING LATIN SMALL LETTER D; QQK
+217E ; [.1010.0020.0004.217E] # SMALL ROMAN NUMERAL FIVE HUNDRED; QQK
+249F ; [*02B1.0020.0004.249F][.1010.0020.0004.249F][*02B2.0020.001F.249F] # PARENTHESIZED LATIN SMALL LETTER D; QQKN
+2146 ; [.1010.0020.0005.2146] # DOUBLE-STRUCK ITALIC SMALL D; QQK
+1D41D ; [.1010.0020.0005.1D41D] # MATHEMATICAL BOLD SMALL D; QQK
+1D451 ; [.1010.0020.0005.1D451] # MATHEMATICAL ITALIC SMALL D; QQK
+1D485 ; [.1010.0020.0005.1D485] # MATHEMATICAL BOLD ITALIC SMALL D; QQK
+1D4B9 ; [.1010.0020.0005.1D4B9] # MATHEMATICAL SCRIPT SMALL D; QQK
+1D4ED ; [.1010.0020.0005.1D4ED] # MATHEMATICAL BOLD SCRIPT SMALL D; QQK
+1D521 ; [.1010.0020.0005.1D521] # MATHEMATICAL FRAKTUR SMALL D; QQK
+1D555 ; [.1010.0020.0005.1D555] # MATHEMATICAL DOUBLE-STRUCK SMALL D; QQK
+1D589 ; [.1010.0020.0005.1D589] # MATHEMATICAL BOLD FRAKTUR SMALL D; QQK
+1D5BD ; [.1010.0020.0005.1D5BD] # MATHEMATICAL SANS-SERIF SMALL D; QQK
+1D5F1 ; [.1010.0020.0005.1D5F1] # MATHEMATICAL SANS-SERIF BOLD SMALL D; QQK
+1D625 ; [.1010.0020.0005.1D625] # MATHEMATICAL SANS-SERIF ITALIC SMALL D; QQK
+1D659 ; [.1010.0020.0005.1D659] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D; QQK
+1D68D ; [.1010.0020.0005.1D68D] # MATHEMATICAL MONOSPACE SMALL D; QQK
+24D3 ; [.1010.0020.0006.24D3] # CIRCLED LATIN SMALL LETTER D; QQK
+0044 ; [.1010.0020.0008.0044] # LATIN CAPITAL LETTER D
+FF24 ; [.1010.0020.0009.FF24] # FULLWIDTH LATIN CAPITAL LETTER D; QQK
+216E ; [.1010.0020.000A.216E] # ROMAN NUMERAL FIVE HUNDRED; QQK
+2145 ; [.1010.0020.000B.2145] # DOUBLE-STRUCK ITALIC CAPITAL D; QQK
+1D403 ; [.1010.0020.000B.1D403] # MATHEMATICAL BOLD CAPITAL D; QQK
+1D437 ; [.1010.0020.000B.1D437] # MATHEMATICAL ITALIC CAPITAL D; QQK
+1D46B ; [.1010.0020.000B.1D46B] # MATHEMATICAL BOLD ITALIC CAPITAL D; QQK
+1D49F ; [.1010.0020.000B.1D49F] # MATHEMATICAL SCRIPT CAPITAL D; QQK
+1D4D3 ; [.1010.0020.000B.1D4D3] # MATHEMATICAL BOLD SCRIPT CAPITAL D; QQK
+1D507 ; [.1010.0020.000B.1D507] # MATHEMATICAL FRAKTUR CAPITAL D; QQK
+1D53B ; [.1010.0020.000B.1D53B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL D; QQK
+1D56F ; [.1010.0020.000B.1D56F] # MATHEMATICAL BOLD FRAKTUR CAPITAL D; QQK
+1D5A3 ; [.1010.0020.000B.1D5A3] # MATHEMATICAL SANS-SERIF CAPITAL D; QQK
+1D5D7 ; [.1010.0020.000B.1D5D7] # MATHEMATICAL SANS-SERIF BOLD CAPITAL D; QQK
+1D60B ; [.1010.0020.000B.1D60B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D; QQK
+1D63F ; [.1010.0020.000B.1D63F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D; QQK
+1D673 ; [.1010.0020.000B.1D673] # MATHEMATICAL MONOSPACE CAPITAL D; QQK
+24B9 ; [.1010.0020.000C.24B9] # CIRCLED LATIN CAPITAL LETTER D; QQK
+1D48 ; [.1010.0020.0014.1D48] # MODIFIER LETTER SMALL D; QQK
+1D30 ; [.1010.0020.001D.1D30] # MODIFIER LETTER CAPITAL D; QQK
+010F ; [.1010.0020.0002.0064][.0000.0041.0002.030C] # LATIN SMALL LETTER D WITH CARON; QQCM
+010E ; [.1010.0020.0008.0044][.0000.0041.0002.030C] # LATIN CAPITAL LETTER D WITH CARON; QQCM
+1E0B ; [.1010.0020.0002.0064][.0000.0052.0002.0307] # LATIN SMALL LETTER D WITH DOT ABOVE; QQCM
+1E0A ; [.1010.0020.0008.0044][.0000.0052.0002.0307] # LATIN CAPITAL LETTER D WITH DOT ABOVE; QQCM
+1E11 ; [.1010.0020.0002.0064][.0000.0056.0002.0327] # LATIN SMALL LETTER D WITH CEDILLA; QQCM
+1E10 ; [.1010.0020.0008.0044][.0000.0056.0002.0327] # LATIN CAPITAL LETTER D WITH CEDILLA; QQCM
+1E0D ; [.1010.0020.0002.0064][.0000.007A.0002.0323] # LATIN SMALL LETTER D WITH DOT BELOW; QQCM
+1E0C ; [.1010.0020.0008.0044][.0000.007A.0002.0323] # LATIN CAPITAL LETTER D WITH DOT BELOW; QQCM
+1E13 ; [.1010.0020.0002.0064][.0000.0086.0002.032D] # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW; QQCM
+1E12 ; [.1010.0020.0008.0044][.0000.0086.0002.032D] # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW; QQCM
+1E0F ; [.1010.0020.0002.0064][.0000.008A.0002.0331] # LATIN SMALL LETTER D WITH LINE BELOW; QQCM
+1E0E ; [.1010.0020.0008.0044][.0000.008A.0002.0331] # LATIN CAPITAL LETTER D WITH LINE BELOW; QQCM
+0111 ; [.1010.0020.0002.0064][.0000.008D.0002.0335] # LATIN SMALL LETTER D WITH STROKE; QQCM
+0110 ; [.1010.0020.0008.0044][.0000.008D.0002.0335] # LATIN CAPITAL LETTER D WITH STROKE; QQCM
+00F0 ; [.1010.0020.0004.00F0][.0000.0199.0004.00F0] # LATIN SMALL LETTER ETH; QQKN
+00D0 ; [.1010.0020.000A.00D0][.0000.0199.0004.00D0] # LATIN CAPITAL LETTER ETH; QQKN
+1D9E ; [.1010.0020.0014.1D9E][.0000.0199.0014.1D9E] # MODIFIER LETTER SMALL ETH; QQKN
+3372 ; [.1010.0020.001C.3372][.0FD0.0020.001C.3372] # SQUARE DA; QQKN
+0238 ; [.1010.0020.0004.0238][.0FE6.0020.0004.0238] # LATIN SMALL LETTER DB DIGRAPH; QQKN
+33C8 ; [.1010.0020.001C.33C8][.0FE6.0020.001D.33C8] # SQUARE DB; QQKN
+3397 ; [.1010.0020.001C.3397][.10E5.0020.001C.3397] # SQUARE DL; QQKN
+3377 ; [.1010.0020.001C.3377][.1110.0020.001C.3377] # SQUARE DM; QQKN
+3378 ; [.1010.0020.001C.3378][.1110.0020.001C.3378][.0FC8.0020.001F.3378] # SQUARE DM SQUARED; QQKN
+3379 ; [.1010.0020.001C.3379][.1110.0020.001C.3379][.0FC9.0020.001F.3379] # SQUARE DM CUBED; QQKN
+01F3 ; [.1010.0020.0004.01F3][.1243.0020.0004.01F3] # LATIN SMALL LETTER DZ; QQKN
+02A3 ; [.1010.0020.0004.02A3][.1243.0020.0004.02A3] # LATIN SMALL LETTER DZ DIGRAPH; QQKN
+01F2 ; [.1010.0020.000A.01F2][.1243.0020.0004.01F2] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z; QQKN
+01F1 ; [.1010.0020.000A.01F1][.1243.0020.000A.01F1] # LATIN CAPITAL LETTER DZ; QQKN
+01C6 ; [.1010.0020.0004.01C6][.1243.0020.0004.01C6][.0000.0041.001F.01C6] # LATIN SMALL LETTER DZ WITH CARON; QQKN
+01C5 ; [.1010.0020.000A.01C5][.1243.0020.0004.01C5][.0000.0041.001F.01C5] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON; QQKN
+01C4 ; [.1010.0020.000A.01C4][.1243.0020.000A.01C4][.0000.0041.001F.01C4] # LATIN CAPITAL LETTER DZ WITH CARON; QQKN
+02A5 ; [.1010.0020.0004.02A5][.1256.0020.0004.02A5] # LATIN SMALL LETTER DZ DIGRAPH WITH CURL; QQKN
+02A4 ; [.1010.0020.0004.02A4][.125F.0020.0004.02A4] # LATIN SMALL LETTER DEZH DIGRAPH; QQKN
+1D05 ; [.1014.0020.0002.1D05] # LATIN LETTER SMALL CAPITAL D
+1D06 ; [.1015.0020.0002.1D06] # LATIN LETTER SMALL CAPITAL ETH
+1D6D ; [.1016.0020.0002.1D6D] # LATIN SMALL LETTER D WITH MIDDLE TILDE
+1D81 ; [.1017.0020.0002.1D81] # LATIN SMALL LETTER D WITH PALATAL HOOK
+0256 ; [.1018.0020.0002.0256] # LATIN SMALL LETTER D WITH TAIL
+0189 ; [.1018.0020.0008.0189] # LATIN CAPITAL LETTER AFRICAN D
+0257 ; [.101C.0020.0002.0257] # LATIN SMALL LETTER D WITH HOOK
+018A ; [.101C.0020.0008.018A] # LATIN CAPITAL LETTER D WITH HOOK
+1D91 ; [.1020.0020.0002.1D91] # LATIN SMALL LETTER D WITH HOOK AND TAIL
+018C ; [.1021.0020.0002.018C] # LATIN SMALL LETTER D WITH TOPBAR
+018B ; [.1021.0020.0008.018B] # LATIN CAPITAL LETTER D WITH TOPBAR
+0221 ; [.1025.0020.0002.0221] # LATIN SMALL LETTER D WITH CURL
+0065 ; [.1029.0020.0002.0065] # LATIN SMALL LETTER E
+FF45 ; [.1029.0020.0003.FF45] # FULLWIDTH LATIN SMALL LETTER E; QQK
+0364 ; [.1029.0020.0004.0364] # COMBINING LATIN SMALL LETTER E; QQK
+24A0 ; [*02B1.0020.0004.24A0][.1029.0020.0004.24A0][*02B2.0020.001F.24A0] # PARENTHESIZED LATIN SMALL LETTER E; QQKN
+212F ; [.1029.0020.0005.212F] # SCRIPT SMALL E; QQK
+2147 ; [.1029.0020.0005.2147] # DOUBLE-STRUCK ITALIC SMALL E; QQK
+1D41E ; [.1029.0020.0005.1D41E] # MATHEMATICAL BOLD SMALL E; QQK
+1D452 ; [.1029.0020.0005.1D452] # MATHEMATICAL ITALIC SMALL E; QQK
+1D486 ; [.1029.0020.0005.1D486] # MATHEMATICAL BOLD ITALIC SMALL E; QQK
+1D4EE ; [.1029.0020.0005.1D4EE] # MATHEMATICAL BOLD SCRIPT SMALL E; QQK
+1D522 ; [.1029.0020.0005.1D522] # MATHEMATICAL FRAKTUR SMALL E; QQK
+1D556 ; [.1029.0020.0005.1D556] # MATHEMATICAL DOUBLE-STRUCK SMALL E; QQK
+1D58A ; [.1029.0020.0005.1D58A] # MATHEMATICAL BOLD FRAKTUR SMALL E; QQK
+1D5BE ; [.1029.0020.0005.1D5BE] # MATHEMATICAL SANS-SERIF SMALL E; QQK
+1D5F2 ; [.1029.0020.0005.1D5F2] # MATHEMATICAL SANS-SERIF BOLD SMALL E; QQK
+1D626 ; [.1029.0020.0005.1D626] # MATHEMATICAL SANS-SERIF ITALIC SMALL E; QQK
+1D65A ; [.1029.0020.0005.1D65A] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E; QQK
+1D68E ; [.1029.0020.0005.1D68E] # MATHEMATICAL MONOSPACE SMALL E; QQK
+24D4 ; [.1029.0020.0006.24D4] # CIRCLED LATIN SMALL LETTER E; QQK
+0045 ; [.1029.0020.0008.0045] # LATIN CAPITAL LETTER E
+FF25 ; [.1029.0020.0009.FF25] # FULLWIDTH LATIN CAPITAL LETTER E; QQK
+2130 ; [.1029.0020.000B.2130] # SCRIPT CAPITAL E; QQK
+1D404 ; [.1029.0020.000B.1D404] # MATHEMATICAL BOLD CAPITAL E; QQK
+1D438 ; [.1029.0020.000B.1D438] # MATHEMATICAL ITALIC CAPITAL E; QQK
+1D46C ; [.1029.0020.000B.1D46C] # MATHEMATICAL BOLD ITALIC CAPITAL E; QQK
+1D4D4 ; [.1029.0020.000B.1D4D4] # MATHEMATICAL BOLD SCRIPT CAPITAL E; QQK
+1D508 ; [.1029.0020.000B.1D508] # MATHEMATICAL FRAKTUR CAPITAL E; QQK
+1D53C ; [.1029.0020.000B.1D53C] # MATHEMATICAL DOUBLE-STRUCK CAPITAL E; QQK
+1D570 ; [.1029.0020.000B.1D570] # MATHEMATICAL BOLD FRAKTUR CAPITAL E; QQK
+1D5A4 ; [.1029.0020.000B.1D5A4] # MATHEMATICAL SANS-SERIF CAPITAL E; QQK
+1D5D8 ; [.1029.0020.000B.1D5D8] # MATHEMATICAL SANS-SERIF BOLD CAPITAL E; QQK
+1D60C ; [.1029.0020.000B.1D60C] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E; QQK
+1D640 ; [.1029.0020.000B.1D640] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E; QQK
+1D674 ; [.1029.0020.000B.1D674] # MATHEMATICAL MONOSPACE CAPITAL E; QQK
+24BA ; [.1029.0020.000C.24BA] # CIRCLED LATIN CAPITAL LETTER E; QQK
+1D49 ; [.1029.0020.0014.1D49] # MODIFIER LETTER SMALL E; QQK
+2091 ; [.1029.0020.0015.2091] # LATIN SUBSCRIPT SMALL LETTER E; QQK
+1D31 ; [.1029.0020.001D.1D31] # MODIFIER LETTER CAPITAL E; QQK
+00E9 ; [.1029.0020.0002.0065][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH ACUTE; QQCM
+00C9 ; [.1029.0020.0008.0045][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH ACUTE; QQCM
+00E8 ; [.1029.0020.0002.0065][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH GRAVE; QQCM
+00C8 ; [.1029.0020.0008.0045][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH GRAVE; QQCM
+0115 ; [.1029.0020.0002.0065][.0000.0037.0002.0306] # LATIN SMALL LETTER E WITH BREVE; QQCM
+0114 ; [.1029.0020.0008.0045][.0000.0037.0002.0306] # LATIN CAPITAL LETTER E WITH BREVE; QQCM
+00EA ; [.1029.0020.0002.0065][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX; QQCM
+00CA ; [.1029.0020.0008.0045][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX; QQCM
+1EBF ; [.1029.0020.0002.0065][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE; QQCM
+1EBE ; [.1029.0020.0008.0045][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE; QQCM
+1EC1 ; [.1029.0020.0002.0065][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE; QQCM
+1EC0 ; [.1029.0020.0008.0045][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE; QQCM
+1EC5 ; [.1029.0020.0002.0065][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE; QQCM
+1EC4 ; [.1029.0020.0008.0045][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE; QQCM
+1EC3 ; [.1029.0020.0002.0065][.0000.003C.0002.0302][.0000.0060.0002.0309] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+1EC2 ; [.1029.0020.0008.0045][.0000.003C.0002.0302][.0000.0060.0002.0309] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+011B ; [.1029.0020.0002.0065][.0000.0041.0002.030C] # LATIN SMALL LETTER E WITH CARON; QQCM
+011A ; [.1029.0020.0008.0045][.0000.0041.0002.030C] # LATIN CAPITAL LETTER E WITH CARON; QQCM
+00EB ; [.1029.0020.0002.0065][.0000.0047.0002.0308] # LATIN SMALL LETTER E WITH DIAERESIS; QQCM
+00CB ; [.1029.0020.0008.0045][.0000.0047.0002.0308] # LATIN CAPITAL LETTER E WITH DIAERESIS; QQCM
+1EBD ; [.1029.0020.0002.0065][.0000.004E.0002.0303] # LATIN SMALL LETTER E WITH TILDE; QQCM
+1EBC ; [.1029.0020.0008.0045][.0000.004E.0002.0303] # LATIN CAPITAL LETTER E WITH TILDE; QQCM
+0117 ; [.1029.0020.0002.0065][.0000.0052.0002.0307] # LATIN SMALL LETTER E WITH DOT ABOVE; QQCM
+0116 ; [.1029.0020.0008.0045][.0000.0052.0002.0307] # LATIN CAPITAL LETTER E WITH DOT ABOVE; QQCM
+0229 ; [.1029.0020.0002.0065][.0000.0056.0002.0327] # LATIN SMALL LETTER E WITH CEDILLA; QQCM
+0228 ; [.1029.0020.0008.0045][.0000.0056.0002.0327] # LATIN CAPITAL LETTER E WITH CEDILLA; QQCM
+1E1D ; [.1029.0020.0002.0065][.0000.0056.0002.0327][.0000.0037.0002.0306] # LATIN SMALL LETTER E WITH CEDILLA AND BREVE; QQCM
+1E1C ; [.1029.0020.0008.0045][.0000.0056.0002.0327][.0000.0037.0002.0306] # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE; QQCM
+0119 ; [.1029.0020.0002.0065][.0000.0059.0002.0328] # LATIN SMALL LETTER E WITH OGONEK; QQCM
+0118 ; [.1029.0020.0008.0045][.0000.0059.0002.0328] # LATIN CAPITAL LETTER E WITH OGONEK; QQCM
+0113 ; [.1029.0020.0002.0065][.0000.005B.0002.0304] # LATIN SMALL LETTER E WITH MACRON; QQCM
+0112 ; [.1029.0020.0008.0045][.0000.005B.0002.0304] # LATIN CAPITAL LETTER E WITH MACRON; QQCM
+1E17 ; [.1029.0020.0002.0065][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH MACRON AND ACUTE; QQCM
+1E16 ; [.1029.0020.0008.0045][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE; QQCM
+1E15 ; [.1029.0020.0002.0065][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH MACRON AND GRAVE; QQCM
+1E14 ; [.1029.0020.0008.0045][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE; QQCM
+1EBB ; [.1029.0020.0002.0065][.0000.0060.0002.0309] # LATIN SMALL LETTER E WITH HOOK ABOVE; QQCM
+1EBA ; [.1029.0020.0008.0045][.0000.0060.0002.0309] # LATIN CAPITAL LETTER E WITH HOOK ABOVE; QQCM
+0205 ; [.1029.0020.0002.0065][.0000.0063.0002.030F] # LATIN SMALL LETTER E WITH DOUBLE GRAVE; QQCM
+0204 ; [.1029.0020.0008.0045][.0000.0063.0002.030F] # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE; QQCM
+0207 ; [.1029.0020.0002.0065][.0000.0065.0002.0311] # LATIN SMALL LETTER E WITH INVERTED BREVE; QQCM
+0206 ; [.1029.0020.0008.0045][.0000.0065.0002.0311] # LATIN CAPITAL LETTER E WITH INVERTED BREVE; QQCM
+1EB9 ; [.1029.0020.0002.0065][.0000.007A.0002.0323] # LATIN SMALL LETTER E WITH DOT BELOW; QQCM
+1EB8 ; [.1029.0020.0008.0045][.0000.007A.0002.0323] # LATIN CAPITAL LETTER E WITH DOT BELOW; QQCM
+1EC7 ; [.1029.0020.0002.0065][.0000.007A.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1EC6 ; [.1029.0020.0008.0045][.0000.007A.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1E19 ; [.1029.0020.0002.0065][.0000.0086.0002.032D] # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW; QQCM
+1E18 ; [.1029.0020.0008.0045][.0000.0086.0002.032D] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW; QQCM
+1E1B ; [.1029.0020.0002.0065][.0000.0089.0002.0330] # LATIN SMALL LETTER E WITH TILDE BELOW; QQCM
+1E1A ; [.1029.0020.0008.0045][.0000.0089.0002.0330] # LATIN CAPITAL LETTER E WITH TILDE BELOW; QQCM
+32CD ; [.1029.0020.001C.32CD][.117E.0020.001C.32CD][.106A.0020.001F.32CD] # SQUARE ERG; QQKN
+32CE ; [.1029.0020.001C.32CE][.1216.0020.001D.32CE] # SQUARE EV; QQKN
+1D07 ; [.102D.0020.0002.1D07] # LATIN LETTER SMALL CAPITAL E
+0247 ; [.102E.0020.0002.0247] # LATIN SMALL LETTER E WITH STROKE
+0246 ; [.102E.0020.0008.0246] # LATIN CAPITAL LETTER E WITH STROKE
+1D92 ; [.1032.0020.0002.1D92] # LATIN SMALL LETTER E WITH RETROFLEX HOOK
+01DD ; [.1033.0020.0002.01DD] # LATIN SMALL LETTER TURNED E
+018E ; [.1033.0020.0008.018E] # LATIN CAPITAL LETTER REVERSED E
+1D32 ; [.1033.0020.001D.1D32] # MODIFIER LETTER CAPITAL REVERSED E; QQK
+0259 ; [.1037.0020.0002.0259] # LATIN SMALL LETTER SCHWA
+018F ; [.1037.0020.0008.018F] # LATIN CAPITAL LETTER SCHWA
+1D4A ; [.1037.0020.0014.1D4A] # MODIFIER LETTER SMALL SCHWA; QQK
+2094 ; [.1037.0020.0015.2094] # LATIN SUBSCRIPT SMALL LETTER SCHWA; QQK
+1D95 ; [.103B.0020.0002.1D95] # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK
+025B ; [.103C.0020.0002.025B] # LATIN SMALL LETTER OPEN E
+0190 ; [.103C.0020.0008.0190] # LATIN CAPITAL LETTER OPEN E
+2107 ; [.103C.0020.000A.2107] # EULER CONSTANT; QQK
+1D4B ; [.103C.0020.0014.1D4B] # MODIFIER LETTER SMALL OPEN E; QQK
+1D93 ; [.1040.0020.0002.1D93] # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
+0258 ; [.1041.0020.0002.0258] # LATIN SMALL LETTER REVERSED E
+025A ; [.1045.0020.0002.025A] # LATIN SMALL LETTER SCHWA WITH HOOK
+025C ; [.1049.0020.0002.025C] # LATIN SMALL LETTER REVERSED OPEN E
+1D9F ; [.1049.0020.0014.1D9F] # MODIFIER LETTER SMALL REVERSED OPEN E; QQK
+1D94 ; [.104D.0020.0002.1D94] # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK
+1D08 ; [.104E.0020.0002.1D08] # LATIN SMALL LETTER TURNED OPEN E
+1D4C ; [.104E.0020.0014.1D4C] # MODIFIER LETTER SMALL TURNED OPEN E; QQK
+025D ; [.104F.0020.0002.025D] # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025E ; [.1053.0020.0002.025E] # LATIN SMALL LETTER CLOSED REVERSED OPEN E
+029A ; [.1057.0020.0002.029A] # LATIN SMALL LETTER CLOSED OPEN E
+0264 ; [.105B.0020.0002.0264] # LATIN SMALL LETTER RAMS HORN
+0066 ; [.105F.0020.0002.0066] # LATIN SMALL LETTER F
+FF46 ; [.105F.0020.0003.FF46] # FULLWIDTH LATIN SMALL LETTER F; QQK
+24A1 ; [*02B1.0020.0004.24A1][.105F.0020.0004.24A1][*02B2.0020.001F.24A1] # PARENTHESIZED LATIN SMALL LETTER F; QQKN
+1D41F ; [.105F.0020.0005.1D41F] # MATHEMATICAL BOLD SMALL F; QQK
+1D453 ; [.105F.0020.0005.1D453] # MATHEMATICAL ITALIC SMALL F; QQK
+1D487 ; [.105F.0020.0005.1D487] # MATHEMATICAL BOLD ITALIC SMALL F; QQK
+1D4BB ; [.105F.0020.0005.1D4BB] # MATHEMATICAL SCRIPT SMALL F; QQK
+1D4EF ; [.105F.0020.0005.1D4EF] # MATHEMATICAL BOLD SCRIPT SMALL F; QQK
+1D523 ; [.105F.0020.0005.1D523] # MATHEMATICAL FRAKTUR SMALL F; QQK
+1D557 ; [.105F.0020.0005.1D557] # MATHEMATICAL DOUBLE-STRUCK SMALL F; QQK
+1D58B ; [.105F.0020.0005.1D58B] # MATHEMATICAL BOLD FRAKTUR SMALL F; QQK
+1D5BF ; [.105F.0020.0005.1D5BF] # MATHEMATICAL SANS-SERIF SMALL F; QQK
+1D5F3 ; [.105F.0020.0005.1D5F3] # MATHEMATICAL SANS-SERIF BOLD SMALL F; QQK
+1D627 ; [.105F.0020.0005.1D627] # MATHEMATICAL SANS-SERIF ITALIC SMALL F; QQK
+1D65B ; [.105F.0020.0005.1D65B] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F; QQK
+1D68F ; [.105F.0020.0005.1D68F] # MATHEMATICAL MONOSPACE SMALL F; QQK
+24D5 ; [.105F.0020.0006.24D5] # CIRCLED LATIN SMALL LETTER F; QQK
+0046 ; [.105F.0020.0008.0046] # LATIN CAPITAL LETTER F
+FF26 ; [.105F.0020.0009.FF26] # FULLWIDTH LATIN CAPITAL LETTER F; QQK
+2109 ; [*03BF.0020.0004.2109][.105F.0020.000A.2109] # DEGREE FAHRENHEIT; QQKN
+2131 ; [.105F.0020.000B.2131] # SCRIPT CAPITAL F; QQK
+1D405 ; [.105F.0020.000B.1D405] # MATHEMATICAL BOLD CAPITAL F; QQK
+1D439 ; [.105F.0020.000B.1D439] # MATHEMATICAL ITALIC CAPITAL F; QQK
+1D46D ; [.105F.0020.000B.1D46D] # MATHEMATICAL BOLD ITALIC CAPITAL F; QQK
+1D4D5 ; [.105F.0020.000B.1D4D5] # MATHEMATICAL BOLD SCRIPT CAPITAL F; QQK
+1D509 ; [.105F.0020.000B.1D509] # MATHEMATICAL FRAKTUR CAPITAL F; QQK
+1D53D ; [.105F.0020.000B.1D53D] # MATHEMATICAL DOUBLE-STRUCK CAPITAL F; QQK
+1D571 ; [.105F.0020.000B.1D571] # MATHEMATICAL BOLD FRAKTUR CAPITAL F; QQK
+1D5A5 ; [.105F.0020.000B.1D5A5] # MATHEMATICAL SANS-SERIF CAPITAL F; QQK
+1D5D9 ; [.105F.0020.000B.1D5D9] # MATHEMATICAL SANS-SERIF BOLD CAPITAL F; QQK
+1D60D ; [.105F.0020.000B.1D60D] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F; QQK
+1D641 ; [.105F.0020.000B.1D641] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F; QQK
+1D675 ; [.105F.0020.000B.1D675] # MATHEMATICAL MONOSPACE CAPITAL F; QQK
+24BB ; [.105F.0020.000C.24BB] # CIRCLED LATIN CAPITAL LETTER F; QQK
+1DA0 ; [.105F.0020.0014.1DA0] # MODIFIER LETTER SMALL F; QQK
+1E1F ; [.105F.0020.0002.0066][.0000.0052.0002.0307] # LATIN SMALL LETTER F WITH DOT ABOVE; QQCM
+1E1E ; [.105F.0020.0008.0046][.0000.0052.0002.0307] # LATIN CAPITAL LETTER F WITH DOT ABOVE; QQCM
+213B ; [.105F.0020.000A.213B][.0FD0.0020.000A.213B][.122E.0020.001F.213B] # FACSIMILE SIGN; QQKN
+FB00 ; [.105F.0020.0004.FB00][.105F.0020.0004.FB00] # LATIN SMALL LIGATURE FF; QQKN
+FB03 ; [.105F.0020.0004.FB03][.105F.0020.0004.FB03][.10A5.0020.001F.FB03] # LATIN SMALL LIGATURE FFI; QQKN
+FB04 ; [.105F.0020.0004.FB04][.105F.0020.0004.FB04][.10E5.0020.001F.FB04] # LATIN SMALL LIGATURE FFL; QQKN
+FB01 ; [.105F.0020.0004.FB01][.10A5.0020.0004.FB01] # LATIN SMALL LIGATURE FI; QQKN
+FB02 ; [.105F.0020.0004.FB02][.10E5.0020.0004.FB02] # LATIN SMALL LIGATURE FL; QQKN
+3399 ; [.105F.0020.001C.3399][.1110.0020.001C.3399] # SQUARE FM; QQKN
+02A9 ; [.105F.0020.0004.02A9][.1137.0020.0004.02A9] # LATIN SMALL LETTER FENG DIGRAPH; QQKN
+1D6E ; [.1063.0020.0002.1D6E] # LATIN SMALL LETTER F WITH MIDDLE TILDE
+1D82 ; [.1064.0020.0002.1D82] # LATIN SMALL LETTER F WITH PALATAL HOOK
+0192 ; [.1065.0020.0002.0192] # LATIN SMALL LETTER F WITH HOOK
+0191 ; [.1065.0020.0008.0191] # LATIN CAPITAL LETTER F WITH HOOK
+214E ; [.1069.0020.0002.214E] # TURNED SMALL F
+2132 ; [.1069.0020.0008.2132] # TURNED CAPITAL F
+0067 ; [.106A.0020.0002.0067] # LATIN SMALL LETTER G
+FF47 ; [.106A.0020.0003.FF47] # FULLWIDTH LATIN SMALL LETTER G; QQK
+24A2 ; [*02B1.0020.0004.24A2][.106A.0020.0004.24A2][*02B2.0020.001F.24A2] # PARENTHESIZED LATIN SMALL LETTER G; QQKN
+210A ; [.106A.0020.0005.210A] # SCRIPT SMALL G; QQK
+1D420 ; [.106A.0020.0005.1D420] # MATHEMATICAL BOLD SMALL G; QQK
+1D454 ; [.106A.0020.0005.1D454] # MATHEMATICAL ITALIC SMALL G; QQK
+1D488 ; [.106A.0020.0005.1D488] # MATHEMATICAL BOLD ITALIC SMALL G; QQK
+1D4F0 ; [.106A.0020.0005.1D4F0] # MATHEMATICAL BOLD SCRIPT SMALL G; QQK
+1D524 ; [.106A.0020.0005.1D524] # MATHEMATICAL FRAKTUR SMALL G; QQK
+1D558 ; [.106A.0020.0005.1D558] # MATHEMATICAL DOUBLE-STRUCK SMALL G; QQK
+1D58C ; [.106A.0020.0005.1D58C] # MATHEMATICAL BOLD FRAKTUR SMALL G; QQK
+1D5C0 ; [.106A.0020.0005.1D5C0] # MATHEMATICAL SANS-SERIF SMALL G; QQK
+1D5F4 ; [.106A.0020.0005.1D5F4] # MATHEMATICAL SANS-SERIF BOLD SMALL G; QQK
+1D628 ; [.106A.0020.0005.1D628] # MATHEMATICAL SANS-SERIF ITALIC SMALL G; QQK
+1D65C ; [.106A.0020.0005.1D65C] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G; QQK
+1D690 ; [.106A.0020.0005.1D690] # MATHEMATICAL MONOSPACE SMALL G; QQK
+24D6 ; [.106A.0020.0006.24D6] # CIRCLED LATIN SMALL LETTER G; QQK
+0047 ; [.106A.0020.0008.0047] # LATIN CAPITAL LETTER G
+FF27 ; [.106A.0020.0009.FF27] # FULLWIDTH LATIN CAPITAL LETTER G; QQK
+1D406 ; [.106A.0020.000B.1D406] # MATHEMATICAL BOLD CAPITAL G; QQK
+1D43A ; [.106A.0020.000B.1D43A] # MATHEMATICAL ITALIC CAPITAL G; QQK
+1D46E ; [.106A.0020.000B.1D46E] # MATHEMATICAL BOLD ITALIC CAPITAL G; QQK
+1D4A2 ; [.106A.0020.000B.1D4A2] # MATHEMATICAL SCRIPT CAPITAL G; QQK
+1D4D6 ; [.106A.0020.000B.1D4D6] # MATHEMATICAL BOLD SCRIPT CAPITAL G; QQK
+1D50A ; [.106A.0020.000B.1D50A] # MATHEMATICAL FRAKTUR CAPITAL G; QQK
+1D53E ; [.106A.0020.000B.1D53E] # MATHEMATICAL DOUBLE-STRUCK CAPITAL G; QQK
+1D572 ; [.106A.0020.000B.1D572] # MATHEMATICAL BOLD FRAKTUR CAPITAL G; QQK
+1D5A6 ; [.106A.0020.000B.1D5A6] # MATHEMATICAL SANS-SERIF CAPITAL G; QQK
+1D5DA ; [.106A.0020.000B.1D5DA] # MATHEMATICAL SANS-SERIF BOLD CAPITAL G; QQK
+1D60E ; [.106A.0020.000B.1D60E] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G; QQK
+1D642 ; [.106A.0020.000B.1D642] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G; QQK
+1D676 ; [.106A.0020.000B.1D676] # MATHEMATICAL MONOSPACE CAPITAL G; QQK
+24BC ; [.106A.0020.000C.24BC] # CIRCLED LATIN CAPITAL LETTER G; QQK
+1D4D ; [.106A.0020.0014.1D4D] # MODIFIER LETTER SMALL G; QQK
+1D33 ; [.106A.0020.001D.1D33] # MODIFIER LETTER CAPITAL G; QQK
+01F5 ; [.106A.0020.0002.0067][.0000.0032.0002.0301] # LATIN SMALL LETTER G WITH ACUTE; QQCM
+01F4 ; [.106A.0020.0008.0047][.0000.0032.0002.0301] # LATIN CAPITAL LETTER G WITH ACUTE; QQCM
+011F ; [.106A.0020.0002.0067][.0000.0037.0002.0306] # LATIN SMALL LETTER G WITH BREVE; QQCM
+011E ; [.106A.0020.0008.0047][.0000.0037.0002.0306] # LATIN CAPITAL LETTER G WITH BREVE; QQCM
+011D ; [.106A.0020.0002.0067][.0000.003C.0002.0302] # LATIN SMALL LETTER G WITH CIRCUMFLEX; QQCM
+011C ; [.106A.0020.0008.0047][.0000.003C.0002.0302] # LATIN CAPITAL LETTER G WITH CIRCUMFLEX; QQCM
+01E7 ; [.106A.0020.0002.0067][.0000.0041.0002.030C] # LATIN SMALL LETTER G WITH CARON; QQCM
+01E6 ; [.106A.0020.0008.0047][.0000.0041.0002.030C] # LATIN CAPITAL LETTER G WITH CARON; QQCM
+0121 ; [.106A.0020.0002.0067][.0000.0052.0002.0307] # LATIN SMALL LETTER G WITH DOT ABOVE; QQCM
+0120 ; [.106A.0020.0008.0047][.0000.0052.0002.0307] # LATIN CAPITAL LETTER G WITH DOT ABOVE; QQCM
+0123 ; [.106A.0020.0002.0067][.0000.0056.0002.0327] # LATIN SMALL LETTER G WITH CEDILLA; QQCM
+0122 ; [.106A.0020.0008.0047][.0000.0056.0002.0327] # LATIN CAPITAL LETTER G WITH CEDILLA; QQCM
+1E21 ; [.106A.0020.0002.0067][.0000.005B.0002.0304] # LATIN SMALL LETTER G WITH MACRON; QQCM
+1E20 ; [.106A.0020.0008.0047][.0000.005B.0002.0304] # LATIN CAPITAL LETTER G WITH MACRON; QQCM
+33FF ; [.106A.0020.001C.33FF][.0FD0.0020.001C.33FF][.10E5.0020.001F.33FF] # SQUARE GAL; QQKN
+3387 ; [.106A.0020.001D.3387][.0FE6.0020.001D.3387] # SQUARE GB; QQKN
+3393 ; [.106A.0020.001D.3393][.108D.0020.001D.3393][.1243.0020.001F.3393] # SQUARE GHZ; QQKN
+33AC ; [.106A.0020.001D.33AC][.115D.0020.001D.33AC][.0FD0.0020.001F.33AC] # SQUARE GPA; QQKN
+33C9 ; [.106A.0020.001D.33C9][.1233.0020.001C.33C9] # SQUARE GY; QQKN
+0261 ; [.106E.0020.0002.0261] # LATIN SMALL LETTER SCRIPT G
+1DA2 ; [.106E.0020.0014.1DA2] # MODIFIER LETTER SMALL SCRIPT G; QQK
+1D79 ; [.1072.0020.0002.1D79] # LATIN SMALL LETTER INSULAR G
+0262 ; [.1073.0020.0002.0262] # LATIN LETTER SMALL CAPITAL G
+01E5 ; [.1077.0020.0002.01E5] # LATIN SMALL LETTER G WITH STROKE
+01E4 ; [.1077.0020.0008.01E4] # LATIN CAPITAL LETTER G WITH STROKE
+1D83 ; [.107B.0020.0002.1D83] # LATIN SMALL LETTER G WITH PALATAL HOOK
+0260 ; [.107C.0020.0002.0260] # LATIN SMALL LETTER G WITH HOOK
+0193 ; [.107C.0020.0008.0193] # LATIN CAPITAL LETTER G WITH HOOK
+029B ; [.1080.0020.0002.029B] # LATIN LETTER SMALL CAPITAL G WITH HOOK
+1D77 ; [.1084.0020.0002.1D77] # LATIN SMALL LETTER TURNED G
+0263 ; [.1085.0020.0002.0263] # LATIN SMALL LETTER GAMMA
+0194 ; [.1085.0020.0008.0194] # LATIN CAPITAL LETTER GAMMA
+02E0 ; [.1085.0020.0014.02E0] # MODIFIER LETTER SMALL GAMMA; QQK
+01A3 ; [.1089.0020.0002.01A3] # LATIN SMALL LETTER OI
+01A2 ; [.1089.0020.0008.01A2] # LATIN CAPITAL LETTER OI
+0068 ; [.108D.0020.0002.0068] # LATIN SMALL LETTER H
+FF48 ; [.108D.0020.0003.FF48] # FULLWIDTH LATIN SMALL LETTER H; QQK
+036A ; [.108D.0020.0004.036A] # COMBINING LATIN SMALL LETTER H; QQK
+24A3 ; [*02B1.0020.0004.24A3][.108D.0020.0004.24A3][*02B2.0020.001F.24A3] # PARENTHESIZED LATIN SMALL LETTER H; QQKN
+210E ; [.108D.0020.0005.210E] # PLANCK CONSTANT; QQK
+1D421 ; [.108D.0020.0005.1D421] # MATHEMATICAL BOLD SMALL H; QQK
+1D489 ; [.108D.0020.0005.1D489] # MATHEMATICAL BOLD ITALIC SMALL H; QQK
+1D4BD ; [.108D.0020.0005.1D4BD] # MATHEMATICAL SCRIPT SMALL H; QQK
+1D4F1 ; [.108D.0020.0005.1D4F1] # MATHEMATICAL BOLD SCRIPT SMALL H; QQK
+1D525 ; [.108D.0020.0005.1D525] # MATHEMATICAL FRAKTUR SMALL H; QQK
+1D559 ; [.108D.0020.0005.1D559] # MATHEMATICAL DOUBLE-STRUCK SMALL H; QQK
+1D58D ; [.108D.0020.0005.1D58D] # MATHEMATICAL BOLD FRAKTUR SMALL H; QQK
+1D5C1 ; [.108D.0020.0005.1D5C1] # MATHEMATICAL SANS-SERIF SMALL H; QQK
+1D5F5 ; [.108D.0020.0005.1D5F5] # MATHEMATICAL SANS-SERIF BOLD SMALL H; QQK
+1D629 ; [.108D.0020.0005.1D629] # MATHEMATICAL SANS-SERIF ITALIC SMALL H; QQK
+1D65D ; [.108D.0020.0005.1D65D] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H; QQK
+1D691 ; [.108D.0020.0005.1D691] # MATHEMATICAL MONOSPACE SMALL H; QQK
+24D7 ; [.108D.0020.0006.24D7] # CIRCLED LATIN SMALL LETTER H; QQK
+0048 ; [.108D.0020.0008.0048] # LATIN CAPITAL LETTER H
+FF28 ; [.108D.0020.0009.FF28] # FULLWIDTH LATIN CAPITAL LETTER H; QQK
+210B ; [.108D.0020.000B.210B] # SCRIPT CAPITAL H; QQK
+210C ; [.108D.0020.000B.210C] # BLACK-LETTER CAPITAL H; QQK
+210D ; [.108D.0020.000B.210D] # DOUBLE-STRUCK CAPITAL H; QQK
+1D407 ; [.108D.0020.000B.1D407] # MATHEMATICAL BOLD CAPITAL H; QQK
+1D43B ; [.108D.0020.000B.1D43B] # MATHEMATICAL ITALIC CAPITAL H; QQK
+1D46F ; [.108D.0020.000B.1D46F] # MATHEMATICAL BOLD ITALIC CAPITAL H; QQK
+1D4D7 ; [.108D.0020.000B.1D4D7] # MATHEMATICAL BOLD SCRIPT CAPITAL H; QQK
+1D573 ; [.108D.0020.000B.1D573] # MATHEMATICAL BOLD FRAKTUR CAPITAL H; QQK
+1D5A7 ; [.108D.0020.000B.1D5A7] # MATHEMATICAL SANS-SERIF CAPITAL H; QQK
+1D5DB ; [.108D.0020.000B.1D5DB] # MATHEMATICAL SANS-SERIF BOLD CAPITAL H; QQK
+1D60F ; [.108D.0020.000B.1D60F] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H; QQK
+1D643 ; [.108D.0020.000B.1D643] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H; QQK
+1D677 ; [.108D.0020.000B.1D677] # MATHEMATICAL MONOSPACE CAPITAL H; QQK
+24BD ; [.108D.0020.000C.24BD] # CIRCLED LATIN CAPITAL LETTER H; QQK
+02B0 ; [.108D.0020.0014.02B0] # MODIFIER LETTER SMALL H; QQK
+1D34 ; [.108D.0020.001D.1D34] # MODIFIER LETTER CAPITAL H; QQK
+0125 ; [.108D.0020.0002.0068][.0000.003C.0002.0302] # LATIN SMALL LETTER H WITH CIRCUMFLEX; QQCM
+0124 ; [.108D.0020.0008.0048][.0000.003C.0002.0302] # LATIN CAPITAL LETTER H WITH CIRCUMFLEX; QQCM
+021F ; [.108D.0020.0002.0068][.0000.0041.0002.030C] # LATIN SMALL LETTER H WITH CARON; QQCM
+021E ; [.108D.0020.0008.0048][.0000.0041.0002.030C] # LATIN CAPITAL LETTER H WITH CARON; QQCM
+1E27 ; [.108D.0020.0002.0068][.0000.0047.0002.0308] # LATIN SMALL LETTER H WITH DIAERESIS; QQCM
+1E26 ; [.108D.0020.0008.0048][.0000.0047.0002.0308] # LATIN CAPITAL LETTER H WITH DIAERESIS; QQCM
+1E23 ; [.108D.0020.0002.0068][.0000.0052.0002.0307] # LATIN SMALL LETTER H WITH DOT ABOVE; QQCM
+1E22 ; [.108D.0020.0008.0048][.0000.0052.0002.0307] # LATIN CAPITAL LETTER H WITH DOT ABOVE; QQCM
+1E29 ; [.108D.0020.0002.0068][.0000.0056.0002.0327] # LATIN SMALL LETTER H WITH CEDILLA; QQCM
+1E28 ; [.108D.0020.0008.0048][.0000.0056.0002.0327] # LATIN CAPITAL LETTER H WITH CEDILLA; QQCM
+1E25 ; [.108D.0020.0002.0068][.0000.007A.0002.0323] # LATIN SMALL LETTER H WITH DOT BELOW; QQCM
+1E24 ; [.108D.0020.0008.0048][.0000.007A.0002.0323] # LATIN CAPITAL LETTER H WITH DOT BELOW; QQCM
+1E2B ; [.108D.0020.0002.0068][.0000.0087.0002.032E] # LATIN SMALL LETTER H WITH BREVE BELOW; QQCM
+1E2A ; [.108D.0020.0008.0048][.0000.0087.0002.032E] # LATIN CAPITAL LETTER H WITH BREVE BELOW; QQCM
+1E96 ; [.108D.0020.0002.0068][.0000.008A.0002.0331] # LATIN SMALL LETTER H WITH LINE BELOW; QQCM
+0127 ; [.108D.0020.0002.0068][.0000.008D.0002.0335] # LATIN SMALL LETTER H WITH STROKE; QQCM
+210F ; [.108D.0020.0002.210F][.0000.008D.0002.210F] # PLANCK CONSTANT OVER TWO PI; QQKN
+0126 ; [.108D.0020.0008.0048][.0000.008D.0002.0335] # LATIN CAPITAL LETTER H WITH STROKE; QQCM
+33CA ; [.108D.0020.001C.33CA][.0FD0.0020.001C.33CA] # SQUARE HA; QQKN
+32CC ; [.108D.0020.001D.32CC][.106A.0020.001C.32CC] # SQUARE HG; QQKN
+33CB ; [.108D.0020.001D.33CB][.115D.0020.001D.33CB] # SQUARE HP; QQKN
+3371 ; [.108D.0020.001C.3371][.115D.0020.001D.3371][.0FD0.0020.001F.3371] # SQUARE HPA; QQKN
+3390 ; [.108D.0020.001D.3390][.1243.0020.001C.3390] # SQUARE HZ; QQKN
+029C ; [.1091.0020.0002.029C] # LATIN LETTER SMALL CAPITAL H
+0195 ; [.1095.0020.0002.0195] # LATIN SMALL LETTER HV
+01F6 ; [.1095.0020.0008.01F6] # LATIN CAPITAL LETTER HWAIR
+0266 ; [.1099.0020.0002.0266] # LATIN SMALL LETTER H WITH HOOK
+02B1 ; [.1099.0020.0014.02B1] # MODIFIER LETTER SMALL H WITH HOOK; QQK
+2C68 ; [.109D.0020.0002.2C68] # LATIN SMALL LETTER H WITH DESCENDER
+2C67 ; [.109D.0020.0008.2C67] # LATIN CAPITAL LETTER H WITH DESCENDER
+2C76 ; [.109E.0020.0002.2C76] # LATIN SMALL LETTER HALF H
+2C75 ; [.109E.0020.0008.2C75] # LATIN CAPITAL LETTER HALF H
+0267 ; [.109F.0020.0002.0267] # LATIN SMALL LETTER HENG WITH HOOK
+02BB ; [.10A3.0020.0002.02BB] # MODIFIER LETTER TURNED COMMA
+02BD ; [.10A4.0020.0002.02BD] # MODIFIER LETTER REVERSED COMMA
+0069 ; [.10A5.0020.0002.0069] # LATIN SMALL LETTER I
+FF49 ; [.10A5.0020.0003.FF49] # FULLWIDTH LATIN SMALL LETTER I; QQK
+0365 ; [.10A5.0020.0004.0365] # COMBINING LATIN SMALL LETTER I; QQK
+2170 ; [.10A5.0020.0004.2170] # SMALL ROMAN NUMERAL ONE; QQK
+24A4 ; [*02B1.0020.0004.24A4][.10A5.0020.0004.24A4][*02B2.0020.001F.24A4] # PARENTHESIZED LATIN SMALL LETTER I; QQKN
+2139 ; [.10A5.0020.0005.2139] # INFORMATION SOURCE; QQK
+2148 ; [.10A5.0020.0005.2148] # DOUBLE-STRUCK ITALIC SMALL I; QQK
+1D422 ; [.10A5.0020.0005.1D422] # MATHEMATICAL BOLD SMALL I; QQK
+1D456 ; [.10A5.0020.0005.1D456] # MATHEMATICAL ITALIC SMALL I; QQK
+1D48A ; [.10A5.0020.0005.1D48A] # MATHEMATICAL BOLD ITALIC SMALL I; QQK
+1D4BE ; [.10A5.0020.0005.1D4BE] # MATHEMATICAL SCRIPT SMALL I; QQK
+1D4F2 ; [.10A5.0020.0005.1D4F2] # MATHEMATICAL BOLD SCRIPT SMALL I; QQK
+1D526 ; [.10A5.0020.0005.1D526] # MATHEMATICAL FRAKTUR SMALL I; QQK
+1D55A ; [.10A5.0020.0005.1D55A] # MATHEMATICAL DOUBLE-STRUCK SMALL I; QQK
+1D58E ; [.10A5.0020.0005.1D58E] # MATHEMATICAL BOLD FRAKTUR SMALL I; QQK
+1D5C2 ; [.10A5.0020.0005.1D5C2] # MATHEMATICAL SANS-SERIF SMALL I; QQK
+1D5F6 ; [.10A5.0020.0005.1D5F6] # MATHEMATICAL SANS-SERIF BOLD SMALL I; QQK
+1D62A ; [.10A5.0020.0005.1D62A] # MATHEMATICAL SANS-SERIF ITALIC SMALL I; QQK
+1D65E ; [.10A5.0020.0005.1D65E] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I; QQK
+1D692 ; [.10A5.0020.0005.1D692] # MATHEMATICAL MONOSPACE SMALL I; QQK
+24D8 ; [.10A5.0020.0006.24D8] # CIRCLED LATIN SMALL LETTER I; QQK
+0049 ; [.10A5.0020.0008.0049] # LATIN CAPITAL LETTER I
+FF29 ; [.10A5.0020.0009.FF29] # FULLWIDTH LATIN CAPITAL LETTER I; QQK
+2160 ; [.10A5.0020.000A.2160] # ROMAN NUMERAL ONE; QQK
+2110 ; [.10A5.0020.000B.2110] # SCRIPT CAPITAL I; QQK
+2111 ; [.10A5.0020.000B.2111] # BLACK-LETTER CAPITAL I; QQK
+1D408 ; [.10A5.0020.000B.1D408] # MATHEMATICAL BOLD CAPITAL I; QQK
+1D43C ; [.10A5.0020.000B.1D43C] # MATHEMATICAL ITALIC CAPITAL I; QQK
+1D470 ; [.10A5.0020.000B.1D470] # MATHEMATICAL BOLD ITALIC CAPITAL I; QQK
+1D4D8 ; [.10A5.0020.000B.1D4D8] # MATHEMATICAL BOLD SCRIPT CAPITAL I; QQK
+1D540 ; [.10A5.0020.000B.1D540] # MATHEMATICAL DOUBLE-STRUCK CAPITAL I; QQK
+1D574 ; [.10A5.0020.000B.1D574] # MATHEMATICAL BOLD FRAKTUR CAPITAL I; QQK
+1D5A8 ; [.10A5.0020.000B.1D5A8] # MATHEMATICAL SANS-SERIF CAPITAL I; QQK
+1D5DC ; [.10A5.0020.000B.1D5DC] # MATHEMATICAL SANS-SERIF BOLD CAPITAL I; QQK
+1D610 ; [.10A5.0020.000B.1D610] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I; QQK
+1D644 ; [.10A5.0020.000B.1D644] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I; QQK
+1D678 ; [.10A5.0020.000B.1D678] # MATHEMATICAL MONOSPACE CAPITAL I; QQK
+24BE ; [.10A5.0020.000C.24BE] # CIRCLED LATIN CAPITAL LETTER I; QQK
+2071 ; [.10A5.0020.0014.2071] # SUPERSCRIPT LATIN SMALL LETTER I; QQK
+1D62 ; [.10A5.0020.0015.1D62] # LATIN SUBSCRIPT SMALL LETTER I; QQK
+1D35 ; [.10A5.0020.001D.1D35] # MODIFIER LETTER CAPITAL I; QQK
+00ED ; [.10A5.0020.0002.0069][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH ACUTE; QQCM
+00CD ; [.10A5.0020.0008.0049][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH ACUTE; QQCM
+00EC ; [.10A5.0020.0002.0069][.0000.0035.0002.0300] # LATIN SMALL LETTER I WITH GRAVE; QQCM
+00CC ; [.10A5.0020.0008.0049][.0000.0035.0002.0300] # LATIN CAPITAL LETTER I WITH GRAVE; QQCM
+012D ; [.10A5.0020.0002.0069][.0000.0037.0002.0306] # LATIN SMALL LETTER I WITH BREVE; QQCM
+012C ; [.10A5.0020.0008.0049][.0000.0037.0002.0306] # LATIN CAPITAL LETTER I WITH BREVE; QQCM
+00EE ; [.10A5.0020.0002.0069][.0000.003C.0002.0302] # LATIN SMALL LETTER I WITH CIRCUMFLEX; QQCM
+00CE ; [.10A5.0020.0008.0049][.0000.003C.0002.0302] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX; QQCM
+01D0 ; [.10A5.0020.0002.0069][.0000.0041.0002.030C] # LATIN SMALL LETTER I WITH CARON; QQCM
+01CF ; [.10A5.0020.0008.0049][.0000.0041.0002.030C] # LATIN CAPITAL LETTER I WITH CARON; QQCM
+00EF ; [.10A5.0020.0002.0069][.0000.0047.0002.0308] # LATIN SMALL LETTER I WITH DIAERESIS; QQCM
+00CF ; [.10A5.0020.0008.0049][.0000.0047.0002.0308] # LATIN CAPITAL LETTER I WITH DIAERESIS; QQCM
+1E2F ; [.10A5.0020.0002.0069][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE; QQCM
+1E2E ; [.10A5.0020.0008.0049][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE; QQCM
+0129 ; [.10A5.0020.0002.0069][.0000.004E.0002.0303] # LATIN SMALL LETTER I WITH TILDE; QQCM
+0128 ; [.10A5.0020.0008.0049][.0000.004E.0002.0303] # LATIN CAPITAL LETTER I WITH TILDE; QQCM
+0130 ; [.10A5.0020.0008.0049][.0000.0052.0002.0307] # LATIN CAPITAL LETTER I WITH DOT ABOVE; QQCM
+012F ; [.10A5.0020.0002.0069][.0000.0059.0002.0328] # LATIN SMALL LETTER I WITH OGONEK; QQCM
+012E ; [.10A5.0020.0008.0049][.0000.0059.0002.0328] # LATIN CAPITAL LETTER I WITH OGONEK; QQCM
+012B ; [.10A5.0020.0002.0069][.0000.005B.0002.0304] # LATIN SMALL LETTER I WITH MACRON; QQCM
+012A ; [.10A5.0020.0008.0049][.0000.005B.0002.0304] # LATIN CAPITAL LETTER I WITH MACRON; QQCM
+1EC9 ; [.10A5.0020.0002.0069][.0000.0060.0002.0309] # LATIN SMALL LETTER I WITH HOOK ABOVE; QQCM
+1EC8 ; [.10A5.0020.0008.0049][.0000.0060.0002.0309] # LATIN CAPITAL LETTER I WITH HOOK ABOVE; QQCM
+0209 ; [.10A5.0020.0002.0069][.0000.0063.0002.030F] # LATIN SMALL LETTER I WITH DOUBLE GRAVE; QQCM
+0208 ; [.10A5.0020.0008.0049][.0000.0063.0002.030F] # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE; QQCM
+020B ; [.10A5.0020.0002.0069][.0000.0065.0002.0311] # LATIN SMALL LETTER I WITH INVERTED BREVE; QQCM
+020A ; [.10A5.0020.0008.0049][.0000.0065.0002.0311] # LATIN CAPITAL LETTER I WITH INVERTED BREVE; QQCM
+1ECB ; [.10A5.0020.0002.0069][.0000.007A.0002.0323] # LATIN SMALL LETTER I WITH DOT BELOW; QQCM
+1ECA ; [.10A5.0020.0008.0049][.0000.007A.0002.0323] # LATIN CAPITAL LETTER I WITH DOT BELOW; QQCM
+1E2D ; [.10A5.0020.0002.0069][.0000.0089.0002.0330] # LATIN SMALL LETTER I WITH TILDE BELOW; QQCM
+1E2C ; [.10A5.0020.0008.0049][.0000.0089.0002.0330] # LATIN CAPITAL LETTER I WITH TILDE BELOW; QQCM
+2171 ; [.10A5.0020.0004.2171][.10A5.0020.0004.2171] # SMALL ROMAN NUMERAL TWO; QQKN
+2161 ; [.10A5.0020.000A.2161][.10A5.0020.000A.2161] # ROMAN NUMERAL TWO; QQKN
+2172 ; [.10A5.0020.0004.2172][.10A5.0020.0004.2172][.10A5.0020.001F.2172] # SMALL ROMAN NUMERAL THREE; QQKN
+2162 ; [.10A5.0020.000A.2162][.10A5.0020.000A.2162][.10A5.0020.001F.2162] # ROMAN NUMERAL THREE; QQKN
+0133 ; [.10A5.0020.0004.0133][.10BD.0020.0004.0133] # LATIN SMALL LIGATURE IJ; QQKN
+0132 ; [.10A5.0020.000A.0132][.10BD.0020.000A.0132] # LATIN CAPITAL LIGATURE IJ; QQKN
+33CC ; [.10A5.0020.001C.33CC][.111B.0020.001C.33CC] # SQUARE IN; QQKN
+337A ; [.10A5.0020.001D.337A][.11EE.0020.001D.337A] # SQUARE IU; QQKN
+2173 ; [.10A5.0020.0004.2173][.1216.0020.0004.2173] # SMALL ROMAN NUMERAL FOUR; QQKN
+2163 ; [.10A5.0020.000A.2163][.1216.0020.000A.2163] # ROMAN NUMERAL FOUR; QQKN
+2178 ; [.10A5.0020.0004.2178][.122E.0020.0004.2178] # SMALL ROMAN NUMERAL NINE; QQKN
+2168 ; [.10A5.0020.000A.2168][.122E.0020.000A.2168] # ROMAN NUMERAL NINE; QQKN
+0131 ; [.10A9.0020.0002.0131] # LATIN SMALL LETTER DOTLESS I
+1D6A4 ; [.10A9.0020.0005.1D6A4] # MATHEMATICAL ITALIC SMALL DOTLESS I; QQK
+026A ; [.10AD.0020.0002.026A] # LATIN LETTER SMALL CAPITAL I
+1DA6 ; [.10AD.0020.0014.1DA6] # MODIFIER LETTER SMALL CAPITAL I; QQK
+1D09 ; [.10B1.0020.0002.1D09] # LATIN SMALL LETTER TURNED I
+1D4E ; [.10B1.0020.0014.1D4E] # MODIFIER LETTER SMALL TURNED I; QQK
+0268 ; [.10B2.0020.0002.0268] # LATIN SMALL LETTER I WITH STROKE
+0197 ; [.10B2.0020.0008.0197] # LATIN CAPITAL LETTER I WITH STROKE
+1DA4 ; [.10B2.0020.0014.1DA4] # MODIFIER LETTER SMALL I WITH STROKE; QQK
+1D7B ; [.10B6.0020.0002.1D7B] # LATIN SMALL CAPITAL LETTER I WITH STROKE
+1DA7 ; [.10B6.0020.0014.1DA7] # MODIFIER LETTER SMALL CAPITAL I WITH STROKE; QQK
+1D96 ; [.10B7.0020.0002.1D96] # LATIN SMALL LETTER I WITH RETROFLEX HOOK
+0269 ; [.10B8.0020.0002.0269] # LATIN SMALL LETTER IOTA
+0196 ; [.10B8.0020.0008.0196] # LATIN CAPITAL LETTER IOTA
+1DA5 ; [.10B8.0020.0014.1DA5] # MODIFIER LETTER SMALL IOTA; QQK
+1D7C ; [.10BC.0020.0002.1D7C] # LATIN SMALL LETTER IOTA WITH STROKE
+006A ; [.10BD.0020.0002.006A] # LATIN SMALL LETTER J
+FF4A ; [.10BD.0020.0003.FF4A] # FULLWIDTH LATIN SMALL LETTER J; QQK
+24A5 ; [*02B1.0020.0004.24A5][.10BD.0020.0004.24A5][*02B2.0020.001F.24A5] # PARENTHESIZED LATIN SMALL LETTER J; QQKN
+2149 ; [.10BD.0020.0005.2149] # DOUBLE-STRUCK ITALIC SMALL J; QQK
+1D423 ; [.10BD.0020.0005.1D423] # MATHEMATICAL BOLD SMALL J; QQK
+1D457 ; [.10BD.0020.0005.1D457] # MATHEMATICAL ITALIC SMALL J; QQK
+1D48B ; [.10BD.0020.0005.1D48B] # MATHEMATICAL BOLD ITALIC SMALL J; QQK
+1D4BF ; [.10BD.0020.0005.1D4BF] # MATHEMATICAL SCRIPT SMALL J; QQK
+1D4F3 ; [.10BD.0020.0005.1D4F3] # MATHEMATICAL BOLD SCRIPT SMALL J; QQK
+1D527 ; [.10BD.0020.0005.1D527] # MATHEMATICAL FRAKTUR SMALL J; QQK
+1D55B ; [.10BD.0020.0005.1D55B] # MATHEMATICAL DOUBLE-STRUCK SMALL J; QQK
+1D58F ; [.10BD.0020.0005.1D58F] # MATHEMATICAL BOLD FRAKTUR SMALL J; QQK
+1D5C3 ; [.10BD.0020.0005.1D5C3] # MATHEMATICAL SANS-SERIF SMALL J; QQK
+1D5F7 ; [.10BD.0020.0005.1D5F7] # MATHEMATICAL SANS-SERIF BOLD SMALL J; QQK
+1D62B ; [.10BD.0020.0005.1D62B] # MATHEMATICAL SANS-SERIF ITALIC SMALL J; QQK
+1D65F ; [.10BD.0020.0005.1D65F] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J; QQK
+1D693 ; [.10BD.0020.0005.1D693] # MATHEMATICAL MONOSPACE SMALL J; QQK
+24D9 ; [.10BD.0020.0006.24D9] # CIRCLED LATIN SMALL LETTER J; QQK
+004A ; [.10BD.0020.0008.004A] # LATIN CAPITAL LETTER J
+FF2A ; [.10BD.0020.0009.FF2A] # FULLWIDTH LATIN CAPITAL LETTER J; QQK
+1D409 ; [.10BD.0020.000B.1D409] # MATHEMATICAL BOLD CAPITAL J; QQK
+1D43D ; [.10BD.0020.000B.1D43D] # MATHEMATICAL ITALIC CAPITAL J; QQK
+1D471 ; [.10BD.0020.000B.1D471] # MATHEMATICAL BOLD ITALIC CAPITAL J; QQK
+1D4A5 ; [.10BD.0020.000B.1D4A5] # MATHEMATICAL SCRIPT CAPITAL J; QQK
+1D4D9 ; [.10BD.0020.000B.1D4D9] # MATHEMATICAL BOLD SCRIPT CAPITAL J; QQK
+1D50D ; [.10BD.0020.000B.1D50D] # MATHEMATICAL FRAKTUR CAPITAL J; QQK
+1D541 ; [.10BD.0020.000B.1D541] # MATHEMATICAL DOUBLE-STRUCK CAPITAL J; QQK
+1D575 ; [.10BD.0020.000B.1D575] # MATHEMATICAL BOLD FRAKTUR CAPITAL J; QQK
+1D5A9 ; [.10BD.0020.000B.1D5A9] # MATHEMATICAL SANS-SERIF CAPITAL J; QQK
+1D5DD ; [.10BD.0020.000B.1D5DD] # MATHEMATICAL SANS-SERIF BOLD CAPITAL J; QQK
+1D611 ; [.10BD.0020.000B.1D611] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J; QQK
+1D645 ; [.10BD.0020.000B.1D645] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J; QQK
+1D679 ; [.10BD.0020.000B.1D679] # MATHEMATICAL MONOSPACE CAPITAL J; QQK
+24BF ; [.10BD.0020.000C.24BF] # CIRCLED LATIN CAPITAL LETTER J; QQK
+02B2 ; [.10BD.0020.0014.02B2] # MODIFIER LETTER SMALL J; QQK
+1D36 ; [.10BD.0020.001D.1D36] # MODIFIER LETTER CAPITAL J; QQK
+0135 ; [.10BD.0020.0002.006A][.0000.003C.0002.0302] # LATIN SMALL LETTER J WITH CIRCUMFLEX; QQCM
+0134 ; [.10BD.0020.0008.004A][.0000.003C.0002.0302] # LATIN CAPITAL LETTER J WITH CIRCUMFLEX; QQCM
+01F0 ; [.10BD.0020.0002.006A][.0000.0041.0002.030C] # LATIN SMALL LETTER J WITH CARON; QQCM
+0237 ; [.10C1.0020.0002.0237] # LATIN SMALL LETTER DOTLESS J
+1D6A5 ; [.10C1.0020.0005.1D6A5] # MATHEMATICAL ITALIC SMALL DOTLESS J; QQK
+1D0A ; [.10C5.0020.0002.1D0A] # LATIN LETTER SMALL CAPITAL J
+0249 ; [.10C6.0020.0002.0249] # LATIN SMALL LETTER J WITH STROKE
+0248 ; [.10C6.0020.0008.0248] # LATIN CAPITAL LETTER J WITH STROKE
+029D ; [.10CA.0020.0002.029D] # LATIN SMALL LETTER J WITH CROSSED-TAIL
+1DA8 ; [.10CA.0020.0014.1DA8] # MODIFIER LETTER SMALL J WITH CROSSED-TAIL; QQK
+025F ; [.10CE.0020.0002.025F] # LATIN SMALL LETTER DOTLESS J WITH STROKE
+1DA1 ; [.10CE.0020.0014.1DA1] # MODIFIER LETTER SMALL DOTLESS J WITH STROKE; QQK
+0284 ; [.10D2.0020.0002.0284] # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+006B ; [.10D6.0020.0002.006B] # LATIN SMALL LETTER K
+FF4B ; [.10D6.0020.0003.FF4B] # FULLWIDTH LATIN SMALL LETTER K; QQK
+24A6 ; [*02B1.0020.0004.24A6][.10D6.0020.0004.24A6][*02B2.0020.001F.24A6] # PARENTHESIZED LATIN SMALL LETTER K; QQKN
+1D424 ; [.10D6.0020.0005.1D424] # MATHEMATICAL BOLD SMALL K; QQK
+1D458 ; [.10D6.0020.0005.1D458] # MATHEMATICAL ITALIC SMALL K; QQK
+1D48C ; [.10D6.0020.0005.1D48C] # MATHEMATICAL BOLD ITALIC SMALL K; QQK
+1D4C0 ; [.10D6.0020.0005.1D4C0] # MATHEMATICAL SCRIPT SMALL K; QQK
+1D4F4 ; [.10D6.0020.0005.1D4F4] # MATHEMATICAL BOLD SCRIPT SMALL K; QQK
+1D528 ; [.10D6.0020.0005.1D528] # MATHEMATICAL FRAKTUR SMALL K; QQK
+1D55C ; [.10D6.0020.0005.1D55C] # MATHEMATICAL DOUBLE-STRUCK SMALL K; QQK
+1D590 ; [.10D6.0020.0005.1D590] # MATHEMATICAL BOLD FRAKTUR SMALL K; QQK
+1D5C4 ; [.10D6.0020.0005.1D5C4] # MATHEMATICAL SANS-SERIF SMALL K; QQK
+1D5F8 ; [.10D6.0020.0005.1D5F8] # MATHEMATICAL SANS-SERIF BOLD SMALL K; QQK
+1D62C ; [.10D6.0020.0005.1D62C] # MATHEMATICAL SANS-SERIF ITALIC SMALL K; QQK
+1D660 ; [.10D6.0020.0005.1D660] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K; QQK
+1D694 ; [.10D6.0020.0005.1D694] # MATHEMATICAL MONOSPACE SMALL K; QQK
+24DA ; [.10D6.0020.0006.24DA] # CIRCLED LATIN SMALL LETTER K; QQK
+004B ; [.10D6.0020.0008.004B] # LATIN CAPITAL LETTER K
+212A ; [.10D6.0020.0008.212A] # KELVIN SIGN; QQC
+FF2B ; [.10D6.0020.0009.FF2B] # FULLWIDTH LATIN CAPITAL LETTER K; QQK
+1D40A ; [.10D6.0020.000B.1D40A] # MATHEMATICAL BOLD CAPITAL K; QQK
+1D43E ; [.10D6.0020.000B.1D43E] # MATHEMATICAL ITALIC CAPITAL K; QQK
+1D472 ; [.10D6.0020.000B.1D472] # MATHEMATICAL BOLD ITALIC CAPITAL K; QQK
+1D4A6 ; [.10D6.0020.000B.1D4A6] # MATHEMATICAL SCRIPT CAPITAL K; QQK
+1D4DA ; [.10D6.0020.000B.1D4DA] # MATHEMATICAL BOLD SCRIPT CAPITAL K; QQK
+1D50E ; [.10D6.0020.000B.1D50E] # MATHEMATICAL FRAKTUR CAPITAL K; QQK
+1D542 ; [.10D6.0020.000B.1D542] # MATHEMATICAL DOUBLE-STRUCK CAPITAL K; QQK
+1D576 ; [.10D6.0020.000B.1D576] # MATHEMATICAL BOLD FRAKTUR CAPITAL K; QQK
+1D5AA ; [.10D6.0020.000B.1D5AA] # MATHEMATICAL SANS-SERIF CAPITAL K; QQK
+1D5DE ; [.10D6.0020.000B.1D5DE] # MATHEMATICAL SANS-SERIF BOLD CAPITAL K; QQK
+1D612 ; [.10D6.0020.000B.1D612] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K; QQK
+1D646 ; [.10D6.0020.000B.1D646] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K; QQK
+1D67A ; [.10D6.0020.000B.1D67A] # MATHEMATICAL MONOSPACE CAPITAL K; QQK
+24C0 ; [.10D6.0020.000C.24C0] # CIRCLED LATIN CAPITAL LETTER K; QQK
+1D4F ; [.10D6.0020.0014.1D4F] # MODIFIER LETTER SMALL K; QQK
+1D37 ; [.10D6.0020.001D.1D37] # MODIFIER LETTER CAPITAL K; QQK
+1E31 ; [.10D6.0020.0002.006B][.0000.0032.0002.0301] # LATIN SMALL LETTER K WITH ACUTE; QQCM
+1E30 ; [.10D6.0020.0008.004B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER K WITH ACUTE; QQCM
+01E9 ; [.10D6.0020.0002.006B][.0000.0041.0002.030C] # LATIN SMALL LETTER K WITH CARON; QQCM
+01E8 ; [.10D6.0020.0008.004B][.0000.0041.0002.030C] # LATIN CAPITAL LETTER K WITH CARON; QQCM
+0137 ; [.10D6.0020.0002.006B][.0000.0056.0002.0327] # LATIN SMALL LETTER K WITH CEDILLA; QQCM
+0136 ; [.10D6.0020.0008.004B][.0000.0056.0002.0327] # LATIN CAPITAL LETTER K WITH CEDILLA; QQCM
+1E33 ; [.10D6.0020.0002.006B][.0000.007A.0002.0323] # LATIN SMALL LETTER K WITH DOT BELOW; QQCM
+1E32 ; [.10D6.0020.0008.004B][.0000.007A.0002.0323] # LATIN CAPITAL LETTER K WITH DOT BELOW; QQCM
+1E35 ; [.10D6.0020.0002.006B][.0000.008A.0002.0331] # LATIN SMALL LETTER K WITH LINE BELOW; QQCM
+1E34 ; [.10D6.0020.0008.004B][.0000.008A.0002.0331] # LATIN CAPITAL LETTER K WITH LINE BELOW; QQCM
+3384 ; [.10D6.0020.001C.3384][.0FD0.0020.001D.3384] # SQUARE KA; QQKN
+3385 ; [.10D6.0020.001D.3385][.0FE6.0020.001D.3385] # SQUARE KB; QQKN
+3389 ; [.10D6.0020.001C.3389][.0FFE.0020.001C.3389][.0FD0.0020.001F.3389][.10E5.0020.001F.3389] # SQUARE KCAL; QQKN
+338F ; [.10D6.0020.001C.338F][.106A.0020.001C.338F] # SQUARE KG; QQKN
+3391 ; [.10D6.0020.001C.3391][.108D.0020.001D.3391][.1243.0020.001F.3391] # SQUARE KHZ; QQKN
+33CD ; [.10D6.0020.001D.33CD][.10D6.0020.001D.33CD] # SQUARE KK; QQKN
+3398 ; [.10D6.0020.001C.3398][.10E5.0020.001C.3398] # SQUARE KL; QQKN
+339E ; [.10D6.0020.001C.339E][.1110.0020.001C.339E] # SQUARE KM; QQKN
+33CE ; [.10D6.0020.001D.33CE][.1110.0020.001D.33CE] # SQUARE KM CAPITAL; QQKN
+33A2 ; [.10D6.0020.001C.33A2][.1110.0020.001C.33A2][.0FC8.0020.001F.33A2] # SQUARE KM SQUARED; QQKN
+33A6 ; [.10D6.0020.001C.33A6][.1110.0020.001C.33A6][.0FC9.0020.001F.33A6] # SQUARE KM CUBED; QQKN
+33AA ; [.10D6.0020.001C.33AA][.115D.0020.001D.33AA][.0FD0.0020.001F.33AA] # SQUARE KPA; QQKN
+33CF ; [.10D6.0020.001C.33CF][.11CF.0020.001C.33CF] # SQUARE KT; QQKN
+33B8 ; [.10D6.0020.001C.33B8][.1216.0020.001D.33B8] # SQUARE KV; QQKN
+33BE ; [.10D6.0020.001C.33BE][.1225.0020.001D.33BE] # SQUARE KW; QQKN
+33C0 ; [.10D6.0020.001C.33C0][.12F3.0020.001D.33C0] # SQUARE K OHM; QQKN
+1D0B ; [.10DA.0020.0002.1D0B] # LATIN LETTER SMALL CAPITAL K
+1D84 ; [.10DB.0020.0002.1D84] # LATIN SMALL LETTER K WITH PALATAL HOOK
+0199 ; [.10DC.0020.0002.0199] # LATIN SMALL LETTER K WITH HOOK
+0198 ; [.10DC.0020.0008.0198] # LATIN CAPITAL LETTER K WITH HOOK
+2C6A ; [.10E0.0020.0002.2C6A] # LATIN SMALL LETTER K WITH DESCENDER
+2C69 ; [.10E0.0020.0008.2C69] # LATIN CAPITAL LETTER K WITH DESCENDER
+029E ; [.10E1.0020.0002.029E] # LATIN SMALL LETTER TURNED K
+006C ; [.10E5.0020.0002.006C] # LATIN SMALL LETTER L
+FF4C ; [.10E5.0020.0003.FF4C] # FULLWIDTH LATIN SMALL LETTER L; QQK
+217C ; [.10E5.0020.0004.217C] # SMALL ROMAN NUMERAL FIFTY; QQK
+24A7 ; [*02B1.0020.0004.24A7][.10E5.0020.0004.24A7][*02B2.0020.001F.24A7] # PARENTHESIZED LATIN SMALL LETTER L; QQKN
+2113 ; [.10E5.0020.0005.2113] # SCRIPT SMALL L; QQK
+1D425 ; [.10E5.0020.0005.1D425] # MATHEMATICAL BOLD SMALL L; QQK
+1D459 ; [.10E5.0020.0005.1D459] # MATHEMATICAL ITALIC SMALL L; QQK
+1D48D ; [.10E5.0020.0005.1D48D] # MATHEMATICAL BOLD ITALIC SMALL L; QQK
+1D4C1 ; [.10E5.0020.0005.1D4C1] # MATHEMATICAL SCRIPT SMALL L; QQK
+1D4F5 ; [.10E5.0020.0005.1D4F5] # MATHEMATICAL BOLD SCRIPT SMALL L; QQK
+1D529 ; [.10E5.0020.0005.1D529] # MATHEMATICAL FRAKTUR SMALL L; QQK
+1D55D ; [.10E5.0020.0005.1D55D] # MATHEMATICAL DOUBLE-STRUCK SMALL L; QQK
+1D591 ; [.10E5.0020.0005.1D591] # MATHEMATICAL BOLD FRAKTUR SMALL L; QQK
+1D5C5 ; [.10E5.0020.0005.1D5C5] # MATHEMATICAL SANS-SERIF SMALL L; QQK
+1D5F9 ; [.10E5.0020.0005.1D5F9] # MATHEMATICAL SANS-SERIF BOLD SMALL L; QQK
+1D62D ; [.10E5.0020.0005.1D62D] # MATHEMATICAL SANS-SERIF ITALIC SMALL L; QQK
+1D661 ; [.10E5.0020.0005.1D661] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L; QQK
+1D695 ; [.10E5.0020.0005.1D695] # MATHEMATICAL MONOSPACE SMALL L; QQK
+24DB ; [.10E5.0020.0006.24DB] # CIRCLED LATIN SMALL LETTER L; QQK
+004C ; [.10E5.0020.0008.004C] # LATIN CAPITAL LETTER L
+FF2C ; [.10E5.0020.0009.FF2C] # FULLWIDTH LATIN CAPITAL LETTER L; QQK
+216C ; [.10E5.0020.000A.216C] # ROMAN NUMERAL FIFTY; QQK
+2112 ; [.10E5.0020.000B.2112] # SCRIPT CAPITAL L; QQK
+1D40B ; [.10E5.0020.000B.1D40B] # MATHEMATICAL BOLD CAPITAL L; QQK
+1D43F ; [.10E5.0020.000B.1D43F] # MATHEMATICAL ITALIC CAPITAL L; QQK
+1D473 ; [.10E5.0020.000B.1D473] # MATHEMATICAL BOLD ITALIC CAPITAL L; QQK
+1D4DB ; [.10E5.0020.000B.1D4DB] # MATHEMATICAL BOLD SCRIPT CAPITAL L; QQK
+1D50F ; [.10E5.0020.000B.1D50F] # MATHEMATICAL FRAKTUR CAPITAL L; QQK
+1D543 ; [.10E5.0020.000B.1D543] # MATHEMATICAL DOUBLE-STRUCK CAPITAL L; QQK
+1D577 ; [.10E5.0020.000B.1D577] # MATHEMATICAL BOLD FRAKTUR CAPITAL L; QQK
+1D5AB ; [.10E5.0020.000B.1D5AB] # MATHEMATICAL SANS-SERIF CAPITAL L; QQK
+1D5DF ; [.10E5.0020.000B.1D5DF] # MATHEMATICAL SANS-SERIF BOLD CAPITAL L; QQK
+1D613 ; [.10E5.0020.000B.1D613] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L; QQK
+1D647 ; [.10E5.0020.000B.1D647] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L; QQK
+1D67B ; [.10E5.0020.000B.1D67B] # MATHEMATICAL MONOSPACE CAPITAL L; QQK
+24C1 ; [.10E5.0020.000C.24C1] # CIRCLED LATIN CAPITAL LETTER L; QQK
+02E1 ; [.10E5.0020.0014.02E1] # MODIFIER LETTER SMALL L; QQK
+1D38 ; [.10E5.0020.001D.1D38] # MODIFIER LETTER CAPITAL L; QQK
+013A ; [.10E5.0020.0002.006C][.0000.0032.0002.0301] # LATIN SMALL LETTER L WITH ACUTE; QQCM
+0139 ; [.10E5.0020.0008.004C][.0000.0032.0002.0301] # LATIN CAPITAL LETTER L WITH ACUTE; QQCM
+013E ; [.10E5.0020.0002.006C][.0000.0041.0002.030C] # LATIN SMALL LETTER L WITH CARON; QQCM
+013D ; [.10E5.0020.0008.004C][.0000.0041.0002.030C] # LATIN CAPITAL LETTER L WITH CARON; QQCM
+013C ; [.10E5.0020.0002.006C][.0000.0056.0002.0327] # LATIN SMALL LETTER L WITH CEDILLA; QQCM
+013B ; [.10E5.0020.0008.004C][.0000.0056.0002.0327] # LATIN CAPITAL LETTER L WITH CEDILLA; QQCM
+1E37 ; [.10E5.0020.0002.006C][.0000.007A.0002.0323] # LATIN SMALL LETTER L WITH DOT BELOW; QQCM
+1E36 ; [.10E5.0020.0008.004C][.0000.007A.0002.0323] # LATIN CAPITAL LETTER L WITH DOT BELOW; QQCM
+1E39 ; [.10E5.0020.0002.006C][.0000.007A.0002.0323][.0000.005B.0002.0304] # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON; QQCM
+1E38 ; [.10E5.0020.0008.004C][.0000.007A.0002.0323][.0000.005B.0002.0304] # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON; QQCM
+1E3D ; [.10E5.0020.0002.006C][.0000.0086.0002.032D] # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW; QQCM
+1E3C ; [.10E5.0020.0008.004C][.0000.0086.0002.032D] # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW; QQCM
+1E3B ; [.10E5.0020.0002.006C][.0000.008A.0002.0331] # LATIN SMALL LETTER L WITH LINE BELOW; QQCM
+1E3A ; [.10E5.0020.0008.004C][.0000.008A.0002.0331] # LATIN CAPITAL LETTER L WITH LINE BELOW; QQCM
+0142 ; [.10E5.0020.0002.006C][.0000.008D.0002.0335] # LATIN SMALL LETTER L WITH STROKE; QQCM
+0141 ; [.10E5.0020.0008.004C][.0000.008D.0002.0335] # LATIN CAPITAL LETTER L WITH STROKE; QQCM
+0140 ; [.10E5.0020.0004.0140][.0000.0199.0004.0140][*0273.0020.001F.0140] # LATIN SMALL LETTER L WITH MIDDLE DOT; QQKN
+013F ; [.10E5.0020.000A.013F][.0000.0199.0004.013F][*0273.0020.001F.013F] # LATIN CAPITAL LETTER L WITH MIDDLE DOT; QQKN
+01C9 ; [.10E5.0020.0004.01C9][.10BD.0020.0004.01C9] # LATIN SMALL LETTER LJ; QQKN
+01C8 ; [.10E5.0020.000A.01C8][.10BD.0020.0004.01C8] # LATIN CAPITAL LETTER L WITH SMALL LETTER J; QQKN
+01C7 ; [.10E5.0020.000A.01C7][.10BD.0020.000A.01C7] # LATIN CAPITAL LETTER LJ; QQKN
+33D0 ; [.10E5.0020.001C.33D0][.1110.0020.001C.33D0] # SQUARE LM; QQKN
+33D1 ; [.10E5.0020.001C.33D1][.111B.0020.001C.33D1] # SQUARE LN; QQKN
+33D2 ; [.10E5.0020.001C.33D2][.113B.0020.001C.33D2][.106A.0020.001F.33D2] # SQUARE LOG; QQKN
+02AA ; [.10E5.0020.0004.02AA][.11AF.0020.0004.02AA] # LATIN SMALL LETTER LS DIGRAPH; QQKN
+32CF ; [.10E5.0020.001D.32CF][.11CF.0020.001D.32CF][.1010.0020.001F.32CF] # LIMITED LIABILITY SIGN; QQKN
+33D3 ; [.10E5.0020.001C.33D3][.122E.0020.001C.33D3] # SQUARE LX; QQKN
+02AB ; [.10E5.0020.0004.02AB][.1243.0020.0004.02AB] # LATIN SMALL LETTER LZ DIGRAPH; QQKN
+029F ; [.10E9.0020.0002.029F] # LATIN LETTER SMALL CAPITAL L
+1DAB ; [.10E9.0020.0014.1DAB] # MODIFIER LETTER SMALL CAPITAL L; QQK
+1D0C ; [.10ED.0020.0002.1D0C] # LATIN LETTER SMALL CAPITAL L WITH STROKE
+019A ; [.10EE.0020.0002.019A] # LATIN SMALL LETTER L WITH BAR
+023D ; [.10EE.0020.0008.023D] # LATIN CAPITAL LETTER L WITH BAR
+2C61 ; [.10F2.0020.0002.2C61] # LATIN SMALL LETTER L WITH DOUBLE BAR
+2C60 ; [.10F2.0020.0008.2C60] # LATIN CAPITAL LETTER L WITH DOUBLE BAR
+026B ; [.10F3.0020.0002.026B] # LATIN SMALL LETTER L WITH MIDDLE TILDE
+2C62 ; [.10F3.0020.0008.2C62] # LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+026C ; [.10F7.0020.0002.026C] # LATIN SMALL LETTER L WITH BELT
+1D85 ; [.10FB.0020.0002.1D85] # LATIN SMALL LETTER L WITH PALATAL HOOK
+1DAA ; [.10FB.0020.0014.1DAA] # MODIFIER LETTER SMALL L WITH PALATAL HOOK; QQK
+026D ; [.10FC.0020.0002.026D] # LATIN SMALL LETTER L WITH RETROFLEX HOOK
+1DA9 ; [.10FC.0020.0014.1DA9] # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK; QQK
+0234 ; [.1100.0020.0002.0234] # LATIN SMALL LETTER L WITH CURL
+026E ; [.1104.0020.0002.026E] # LATIN SMALL LETTER LEZH
+019B ; [.1108.0020.0002.019B] # LATIN SMALL LETTER LAMBDA WITH STROKE
+028E ; [.110C.0020.0002.028E] # LATIN SMALL LETTER TURNED Y
+006D ; [.1110.0020.0002.006D] # LATIN SMALL LETTER M
+FF4D ; [.1110.0020.0003.FF4D] # FULLWIDTH LATIN SMALL LETTER M; QQK
+036B ; [.1110.0020.0004.036B] # COMBINING LATIN SMALL LETTER M; QQK
+217F ; [.1110.0020.0004.217F] # SMALL ROMAN NUMERAL ONE THOUSAND; QQK
+24A8 ; [*02B1.0020.0004.24A8][.1110.0020.0004.24A8][*02B2.0020.001F.24A8] # PARENTHESIZED LATIN SMALL LETTER M; QQKN
+1D426 ; [.1110.0020.0005.1D426] # MATHEMATICAL BOLD SMALL M; QQK
+1D45A ; [.1110.0020.0005.1D45A] # MATHEMATICAL ITALIC SMALL M; QQK
+1D48E ; [.1110.0020.0005.1D48E] # MATHEMATICAL BOLD ITALIC SMALL M; QQK
+1D4C2 ; [.1110.0020.0005.1D4C2] # MATHEMATICAL SCRIPT SMALL M; QQK
+1D4F6 ; [.1110.0020.0005.1D4F6] # MATHEMATICAL BOLD SCRIPT SMALL M; QQK
+1D52A ; [.1110.0020.0005.1D52A] # MATHEMATICAL FRAKTUR SMALL M; QQK
+1D55E ; [.1110.0020.0005.1D55E] # MATHEMATICAL DOUBLE-STRUCK SMALL M; QQK
+1D592 ; [.1110.0020.0005.1D592] # MATHEMATICAL BOLD FRAKTUR SMALL M; QQK
+1D5C6 ; [.1110.0020.0005.1D5C6] # MATHEMATICAL SANS-SERIF SMALL M; QQK
+1D5FA ; [.1110.0020.0005.1D5FA] # MATHEMATICAL SANS-SERIF BOLD SMALL M; QQK
+1D62E ; [.1110.0020.0005.1D62E] # MATHEMATICAL SANS-SERIF ITALIC SMALL M; QQK
+1D662 ; [.1110.0020.0005.1D662] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M; QQK
+1D696 ; [.1110.0020.0005.1D696] # MATHEMATICAL MONOSPACE SMALL M; QQK
+24DC ; [.1110.0020.0006.24DC] # CIRCLED LATIN SMALL LETTER M; QQK
+004D ; [.1110.0020.0008.004D] # LATIN CAPITAL LETTER M
+FF2D ; [.1110.0020.0009.FF2D] # FULLWIDTH LATIN CAPITAL LETTER M; QQK
+216F ; [.1110.0020.000A.216F] # ROMAN NUMERAL ONE THOUSAND; QQK
+2133 ; [.1110.0020.000B.2133] # SCRIPT CAPITAL M; QQK
+1D40C ; [.1110.0020.000B.1D40C] # MATHEMATICAL BOLD CAPITAL M; QQK
+1D440 ; [.1110.0020.000B.1D440] # MATHEMATICAL ITALIC CAPITAL M; QQK
+1D474 ; [.1110.0020.000B.1D474] # MATHEMATICAL BOLD ITALIC CAPITAL M; QQK
+1D4DC ; [.1110.0020.000B.1D4DC] # MATHEMATICAL BOLD SCRIPT CAPITAL M; QQK
+1D510 ; [.1110.0020.000B.1D510] # MATHEMATICAL FRAKTUR CAPITAL M; QQK
+1D544 ; [.1110.0020.000B.1D544] # MATHEMATICAL DOUBLE-STRUCK CAPITAL M; QQK
+1D578 ; [.1110.0020.000B.1D578] # MATHEMATICAL BOLD FRAKTUR CAPITAL M; QQK
+1D5AC ; [.1110.0020.000B.1D5AC] # MATHEMATICAL SANS-SERIF CAPITAL M; QQK
+1D5E0 ; [.1110.0020.000B.1D5E0] # MATHEMATICAL SANS-SERIF BOLD CAPITAL M; QQK
+1D614 ; [.1110.0020.000B.1D614] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M; QQK
+1D648 ; [.1110.0020.000B.1D648] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M; QQK
+1D67C ; [.1110.0020.000B.1D67C] # MATHEMATICAL MONOSPACE CAPITAL M; QQK
+24C2 ; [.1110.0020.000C.24C2] # CIRCLED LATIN CAPITAL LETTER M; QQK
+1D50 ; [.1110.0020.0014.1D50] # MODIFIER LETTER SMALL M; QQK
+1D39 ; [.1110.0020.001D.1D39] # MODIFIER LETTER CAPITAL M; QQK
+1E3F ; [.1110.0020.0002.006D][.0000.0032.0002.0301] # LATIN SMALL LETTER M WITH ACUTE; QQCM
+1E3E ; [.1110.0020.0008.004D][.0000.0032.0002.0301] # LATIN CAPITAL LETTER M WITH ACUTE; QQCM
+1E41 ; [.1110.0020.0002.006D][.0000.0052.0002.0307] # LATIN SMALL LETTER M WITH DOT ABOVE; QQCM
+1E40 ; [.1110.0020.0008.004D][.0000.0052.0002.0307] # LATIN CAPITAL LETTER M WITH DOT ABOVE; QQCM
+1E43 ; [.1110.0020.0002.006D][.0000.007A.0002.0323] # LATIN SMALL LETTER M WITH DOT BELOW; QQCM
+1E42 ; [.1110.0020.0008.004D][.0000.007A.0002.0323] # LATIN CAPITAL LETTER M WITH DOT BELOW; QQCM
+33A1 ; [.1110.0020.001C.33A1][.0FC8.0020.001C.33A1] # SQUARE M SQUARED; QQKN
+33A5 ; [.1110.0020.001C.33A5][.0FC9.0020.001C.33A5] # SQUARE M CUBED; QQKN
+3383 ; [.1110.0020.001C.3383][.0FD0.0020.001D.3383] # SQUARE MA; QQKN
+33D4 ; [.1110.0020.001C.33D4][.0FE6.0020.001C.33D4] # SQUARE MB SMALL; QQKN
+3386 ; [.1110.0020.001D.3386][.0FE6.0020.001D.3386] # SQUARE MB; QQKN
+338E ; [.1110.0020.001C.338E][.106A.0020.001C.338E] # SQUARE MG; QQKN
+3392 ; [.1110.0020.001D.3392][.108D.0020.001D.3392][.1243.0020.001F.3392] # SQUARE MHZ; QQKN
+33D5 ; [.1110.0020.001C.33D5][.10A5.0020.001C.33D5][.10E5.0020.001F.33D5] # SQUARE MIL; QQKN
+3396 ; [.1110.0020.001C.3396][.10E5.0020.001C.3396] # SQUARE ML; QQKN
+339C ; [.1110.0020.001C.339C][.1110.0020.001C.339C] # SQUARE MM; QQKN
+339F ; [.1110.0020.001C.339F][.1110.0020.001C.339F][.0FC8.0020.001F.339F] # SQUARE MM SQUARED; QQKN
+33A3 ; [.1110.0020.001C.33A3][.1110.0020.001C.33A3][.0FC9.0020.001F.33A3] # SQUARE MM CUBED; QQKN
+33D6 ; [.1110.0020.001C.33D6][.113B.0020.001C.33D6][.10E5.0020.001F.33D6] # SQUARE MOL; QQKN
+33AB ; [.1110.0020.001D.33AB][.115D.0020.001D.33AB][.0FD0.0020.001F.33AB] # SQUARE MPA; QQKN
+33B3 ; [.1110.0020.001C.33B3][.11AF.0020.001C.33B3] # SQUARE MS; QQKN
+33A7 ; [.1110.0020.001C.33A7][*04C7.0020.001C.33A7][.11AF.0020.001F.33A7] # SQUARE M OVER S; QQKN
+33A8 ; [.1110.0020.001C.33A8][*04C7.0020.001C.33A8][.11AF.0020.001F.33A8][.0FC8.0020.001F.33A8] # SQUARE M OVER S SQUARED; QQKN
+33B7 ; [.1110.0020.001C.33B7][.1216.0020.001D.33B7] # SQUARE MV; QQKN
+33B9 ; [.1110.0020.001D.33B9][.1216.0020.001D.33B9] # SQUARE MV MEGA; QQKN
+33BD ; [.1110.0020.001C.33BD][.1225.0020.001D.33BD] # SQUARE MW; QQKN
+33BF ; [.1110.0020.001D.33BF][.1225.0020.001D.33BF] # SQUARE MW MEGA; QQKN
+33C1 ; [.1110.0020.001D.33C1][.12F3.0020.001D.33C1] # SQUARE M OHM; QQKN
+1D0D ; [.1114.0020.0002.1D0D] # LATIN LETTER SMALL CAPITAL M
+1D6F ; [.1115.0020.0002.1D6F] # LATIN SMALL LETTER M WITH MIDDLE TILDE
+1D86 ; [.1116.0020.0002.1D86] # LATIN SMALL LETTER M WITH PALATAL HOOK
+0271 ; [.1117.0020.0002.0271] # LATIN SMALL LETTER M WITH HOOK
+1DAC ; [.1117.0020.0014.1DAC] # MODIFIER LETTER SMALL M WITH HOOK; QQK
+006E ; [.111B.0020.0002.006E] # LATIN SMALL LETTER N
+FF4E ; [.111B.0020.0003.FF4E] # FULLWIDTH LATIN SMALL LETTER N; QQK
+24A9 ; [*02B1.0020.0004.24A9][.111B.0020.0004.24A9][*02B2.0020.001F.24A9] # PARENTHESIZED LATIN SMALL LETTER N; QQKN
+1D427 ; [.111B.0020.0005.1D427] # MATHEMATICAL BOLD SMALL N; QQK
+1D45B ; [.111B.0020.0005.1D45B] # MATHEMATICAL ITALIC SMALL N; QQK
+1D48F ; [.111B.0020.0005.1D48F] # MATHEMATICAL BOLD ITALIC SMALL N; QQK
+1D4C3 ; [.111B.0020.0005.1D4C3] # MATHEMATICAL SCRIPT SMALL N; QQK
+1D4F7 ; [.111B.0020.0005.1D4F7] # MATHEMATICAL BOLD SCRIPT SMALL N; QQK
+1D52B ; [.111B.0020.0005.1D52B] # MATHEMATICAL FRAKTUR SMALL N; QQK
+1D55F ; [.111B.0020.0005.1D55F] # MATHEMATICAL DOUBLE-STRUCK SMALL N; QQK
+1D593 ; [.111B.0020.0005.1D593] # MATHEMATICAL BOLD FRAKTUR SMALL N; QQK
+1D5C7 ; [.111B.0020.0005.1D5C7] # MATHEMATICAL SANS-SERIF SMALL N; QQK
+1D5FB ; [.111B.0020.0005.1D5FB] # MATHEMATICAL SANS-SERIF BOLD SMALL N; QQK
+1D62F ; [.111B.0020.0005.1D62F] # MATHEMATICAL SANS-SERIF ITALIC SMALL N; QQK
+1D663 ; [.111B.0020.0005.1D663] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N; QQK
+1D697 ; [.111B.0020.0005.1D697] # MATHEMATICAL MONOSPACE SMALL N; QQK
+24DD ; [.111B.0020.0006.24DD] # CIRCLED LATIN SMALL LETTER N; QQK
+004E ; [.111B.0020.0008.004E] # LATIN CAPITAL LETTER N
+FF2E ; [.111B.0020.0009.FF2E] # FULLWIDTH LATIN CAPITAL LETTER N; QQK
+2115 ; [.111B.0020.000B.2115] # DOUBLE-STRUCK CAPITAL N; QQK
+1D40D ; [.111B.0020.000B.1D40D] # MATHEMATICAL BOLD CAPITAL N; QQK
+1D441 ; [.111B.0020.000B.1D441] # MATHEMATICAL ITALIC CAPITAL N; QQK
+1D475 ; [.111B.0020.000B.1D475] # MATHEMATICAL BOLD ITALIC CAPITAL N; QQK
+1D4A9 ; [.111B.0020.000B.1D4A9] # MATHEMATICAL SCRIPT CAPITAL N; QQK
+1D4DD ; [.111B.0020.000B.1D4DD] # MATHEMATICAL BOLD SCRIPT CAPITAL N; QQK
+1D511 ; [.111B.0020.000B.1D511] # MATHEMATICAL FRAKTUR CAPITAL N; QQK
+1D579 ; [.111B.0020.000B.1D579] # MATHEMATICAL BOLD FRAKTUR CAPITAL N; QQK
+1D5AD ; [.111B.0020.000B.1D5AD] # MATHEMATICAL SANS-SERIF CAPITAL N; QQK
+1D5E1 ; [.111B.0020.000B.1D5E1] # MATHEMATICAL SANS-SERIF BOLD CAPITAL N; QQK
+1D615 ; [.111B.0020.000B.1D615] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N; QQK
+1D649 ; [.111B.0020.000B.1D649] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N; QQK
+1D67D ; [.111B.0020.000B.1D67D] # MATHEMATICAL MONOSPACE CAPITAL N; QQK
+24C3 ; [.111B.0020.000C.24C3] # CIRCLED LATIN CAPITAL LETTER N; QQK
+207F ; [.111B.0020.0014.207F] # SUPERSCRIPT LATIN SMALL LETTER N; QQK
+1D3A ; [.111B.0020.001D.1D3A] # MODIFIER LETTER CAPITAL N; QQK
+0144 ; [.111B.0020.0002.006E][.0000.0032.0002.0301] # LATIN SMALL LETTER N WITH ACUTE; QQCM
+0143 ; [.111B.0020.0008.004E][.0000.0032.0002.0301] # LATIN CAPITAL LETTER N WITH ACUTE; QQCM
+01F9 ; [.111B.0020.0002.006E][.0000.0035.0002.0300] # LATIN SMALL LETTER N WITH GRAVE; QQCM
+01F8 ; [.111B.0020.0008.004E][.0000.0035.0002.0300] # LATIN CAPITAL LETTER N WITH GRAVE; QQCM
+0148 ; [.111B.0020.0002.006E][.0000.0041.0002.030C] # LATIN SMALL LETTER N WITH CARON; QQCM
+0147 ; [.111B.0020.0008.004E][.0000.0041.0002.030C] # LATIN CAPITAL LETTER N WITH CARON; QQCM
+00F1 ; [.111B.0020.0002.006E][.0000.004E.0002.0303] # LATIN SMALL LETTER N WITH TILDE; QQCM
+00D1 ; [.111B.0020.0008.004E][.0000.004E.0002.0303] # LATIN CAPITAL LETTER N WITH TILDE; QQCM
+1E45 ; [.111B.0020.0002.006E][.0000.0052.0002.0307] # LATIN SMALL LETTER N WITH DOT ABOVE; QQCM
+1E44 ; [.111B.0020.0008.004E][.0000.0052.0002.0307] # LATIN CAPITAL LETTER N WITH DOT ABOVE; QQCM
+0146 ; [.111B.0020.0002.006E][.0000.0056.0002.0327] # LATIN SMALL LETTER N WITH CEDILLA; QQCM
+0145 ; [.111B.0020.0008.004E][.0000.0056.0002.0327] # LATIN CAPITAL LETTER N WITH CEDILLA; QQCM
+1E47 ; [.111B.0020.0002.006E][.0000.007A.0002.0323] # LATIN SMALL LETTER N WITH DOT BELOW; QQCM
+1E46 ; [.111B.0020.0008.004E][.0000.007A.0002.0323] # LATIN CAPITAL LETTER N WITH DOT BELOW; QQCM
+1E4B ; [.111B.0020.0002.006E][.0000.0086.0002.032D] # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW; QQCM
+1E4A ; [.111B.0020.0008.004E][.0000.0086.0002.032D] # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW; QQCM
+1E49 ; [.111B.0020.0002.006E][.0000.008A.0002.0331] # LATIN SMALL LETTER N WITH LINE BELOW; QQCM
+1E48 ; [.111B.0020.0008.004E][.0000.008A.0002.0331] # LATIN CAPITAL LETTER N WITH LINE BELOW; QQCM
+3381 ; [.111B.0020.001C.3381][.0FD0.0020.001D.3381] # SQUARE NA; QQKN
+338B ; [.111B.0020.001C.338B][.105F.0020.001D.338B] # SQUARE NF; QQKN
+01CC ; [.111B.0020.0004.01CC][.10BD.0020.0004.01CC] # LATIN SMALL LETTER NJ; QQKN
+01CB ; [.111B.0020.000A.01CB][.10BD.0020.0004.01CB] # LATIN CAPITAL LETTER N WITH SMALL LETTER J; QQKN
+01CA ; [.111B.0020.000A.01CA][.10BD.0020.000A.01CA] # LATIN CAPITAL LETTER NJ; QQKN
+339A ; [.111B.0020.001C.339A][.1110.0020.001C.339A] # SQUARE NM; QQKN
+2116 ; [.111B.0020.000A.2116][.113B.0020.0004.2116] # NUMERO SIGN; QQKN
+33B1 ; [.111B.0020.001C.33B1][.11AF.0020.001C.33B1] # SQUARE NS; QQKN
+33B5 ; [.111B.0020.001C.33B5][.1216.0020.001D.33B5] # SQUARE NV; QQKN
+33BB ; [.111B.0020.001C.33BB][.1225.0020.001D.33BB] # SQUARE NW; QQKN
+0274 ; [.111F.0020.0002.0274] # LATIN LETTER SMALL CAPITAL N
+1DB0 ; [.111F.0020.0014.1DB0] # MODIFIER LETTER SMALL CAPITAL N; QQK
+1D3B ; [.1123.0020.0002.1D3B] # MODIFIER LETTER CAPITAL REVERSED N
+1D0E ; [.1124.0020.0002.1D0E] # LATIN LETTER SMALL CAPITAL REVERSED N
+1D70 ; [.1125.0020.0002.1D70] # LATIN SMALL LETTER N WITH MIDDLE TILDE
+0272 ; [.1126.0020.0002.0272] # LATIN SMALL LETTER N WITH LEFT HOOK
+019D ; [.1126.0020.0008.019D] # LATIN CAPITAL LETTER N WITH LEFT HOOK
+1DAE ; [.1126.0020.0014.1DAE] # MODIFIER LETTER SMALL N WITH LEFT HOOK; QQK
+019E ; [.112A.0020.0002.019E] # LATIN SMALL LETTER N WITH LONG RIGHT LEG
+0220 ; [.112A.0020.0008.0220] # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+1D87 ; [.112E.0020.0002.1D87] # LATIN SMALL LETTER N WITH PALATAL HOOK
+0273 ; [.112F.0020.0002.0273] # LATIN SMALL LETTER N WITH RETROFLEX HOOK
+1DAF ; [.112F.0020.0014.1DAF] # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK; QQK
+0235 ; [.1133.0020.0002.0235] # LATIN SMALL LETTER N WITH CURL
+014B ; [.1137.0020.0002.014B] # LATIN SMALL LETTER ENG
+014A ; [.1137.0020.0008.014A] # LATIN CAPITAL LETTER ENG
+1D51 ; [.1137.0020.0014.1D51] # MODIFIER LETTER SMALL ENG; QQK
+006F ; [.113B.0020.0002.006F] # LATIN SMALL LETTER O
+FF4F ; [.113B.0020.0003.FF4F] # FULLWIDTH LATIN SMALL LETTER O; QQK
+0366 ; [.113B.0020.0004.0366] # COMBINING LATIN SMALL LETTER O; QQK
+24AA ; [*02B1.0020.0004.24AA][.113B.0020.0004.24AA][*02B2.0020.001F.24AA] # PARENTHESIZED LATIN SMALL LETTER O; QQKN
+2134 ; [.113B.0020.0005.2134] # SCRIPT SMALL O; QQK
+1D428 ; [.113B.0020.0005.1D428] # MATHEMATICAL BOLD SMALL O; QQK
+1D45C ; [.113B.0020.0005.1D45C] # MATHEMATICAL ITALIC SMALL O; QQK
+1D490 ; [.113B.0020.0005.1D490] # MATHEMATICAL BOLD ITALIC SMALL O; QQK
+1D4F8 ; [.113B.0020.0005.1D4F8] # MATHEMATICAL BOLD SCRIPT SMALL O; QQK
+1D52C ; [.113B.0020.0005.1D52C] # MATHEMATICAL FRAKTUR SMALL O; QQK
+1D560 ; [.113B.0020.0005.1D560] # MATHEMATICAL DOUBLE-STRUCK SMALL O; QQK
+1D594 ; [.113B.0020.0005.1D594] # MATHEMATICAL BOLD FRAKTUR SMALL O; QQK
+1D5C8 ; [.113B.0020.0005.1D5C8] # MATHEMATICAL SANS-SERIF SMALL O; QQK
+1D5FC ; [.113B.0020.0005.1D5FC] # MATHEMATICAL SANS-SERIF BOLD SMALL O; QQK
+1D630 ; [.113B.0020.0005.1D630] # MATHEMATICAL SANS-SERIF ITALIC SMALL O; QQK
+1D664 ; [.113B.0020.0005.1D664] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O; QQK
+1D698 ; [.113B.0020.0005.1D698] # MATHEMATICAL MONOSPACE SMALL O; QQK
+24DE ; [.113B.0020.0006.24DE] # CIRCLED LATIN SMALL LETTER O; QQK
+004F ; [.113B.0020.0008.004F] # LATIN CAPITAL LETTER O
+FF2F ; [.113B.0020.0009.FF2F] # FULLWIDTH LATIN CAPITAL LETTER O; QQK
+1D40E ; [.113B.0020.000B.1D40E] # MATHEMATICAL BOLD CAPITAL O; QQK
+1D442 ; [.113B.0020.000B.1D442] # MATHEMATICAL ITALIC CAPITAL O; QQK
+1D476 ; [.113B.0020.000B.1D476] # MATHEMATICAL BOLD ITALIC CAPITAL O; QQK
+1D4AA ; [.113B.0020.000B.1D4AA] # MATHEMATICAL SCRIPT CAPITAL O; QQK
+1D4DE ; [.113B.0020.000B.1D4DE] # MATHEMATICAL BOLD SCRIPT CAPITAL O; QQK
+1D512 ; [.113B.0020.000B.1D512] # MATHEMATICAL FRAKTUR CAPITAL O; QQK
+1D546 ; [.113B.0020.000B.1D546] # MATHEMATICAL DOUBLE-STRUCK CAPITAL O; QQK
+1D57A ; [.113B.0020.000B.1D57A] # MATHEMATICAL BOLD FRAKTUR CAPITAL O; QQK
+1D5AE ; [.113B.0020.000B.1D5AE] # MATHEMATICAL SANS-SERIF CAPITAL O; QQK
+1D5E2 ; [.113B.0020.000B.1D5E2] # MATHEMATICAL SANS-SERIF BOLD CAPITAL O; QQK
+1D616 ; [.113B.0020.000B.1D616] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O; QQK
+1D64A ; [.113B.0020.000B.1D64A] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O; QQK
+1D67E ; [.113B.0020.000B.1D67E] # MATHEMATICAL MONOSPACE CAPITAL O; QQK
+24C4 ; [.113B.0020.000C.24C4] # CIRCLED LATIN CAPITAL LETTER O; QQK
+00BA ; [.113B.0020.0014.00BA] # MASCULINE ORDINAL INDICATOR; QQK
+1D52 ; [.113B.0020.0014.1D52] # MODIFIER LETTER SMALL O; QQK
+2092 ; [.113B.0020.0015.2092] # LATIN SUBSCRIPT SMALL LETTER O; QQK
+1D3C ; [.113B.0020.001D.1D3C] # MODIFIER LETTER CAPITAL O; QQK
+00F3 ; [.113B.0020.0002.006F][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH ACUTE; QQCM
+00D3 ; [.113B.0020.0008.004F][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH ACUTE; QQCM
+00F2 ; [.113B.0020.0002.006F][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH GRAVE; QQCM
+00D2 ; [.113B.0020.0008.004F][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH GRAVE; QQCM
+014F ; [.113B.0020.0002.006F][.0000.0037.0002.0306] # LATIN SMALL LETTER O WITH BREVE; QQCM
+014E ; [.113B.0020.0008.004F][.0000.0037.0002.0306] # LATIN CAPITAL LETTER O WITH BREVE; QQCM
+00F4 ; [.113B.0020.0002.006F][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX; QQCM
+00D4 ; [.113B.0020.0008.004F][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX; QQCM
+1ED1 ; [.113B.0020.0002.006F][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE; QQCM
+1ED0 ; [.113B.0020.0008.004F][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE; QQCM
+1ED3 ; [.113B.0020.0002.006F][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE; QQCM
+1ED2 ; [.113B.0020.0008.004F][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE; QQCM
+1ED7 ; [.113B.0020.0002.006F][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE; QQCM
+1ED6 ; [.113B.0020.0008.004F][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE; QQCM
+1ED5 ; [.113B.0020.0002.006F][.0000.003C.0002.0302][.0000.0060.0002.0309] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+1ED4 ; [.113B.0020.0008.004F][.0000.003C.0002.0302][.0000.0060.0002.0309] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+01D2 ; [.113B.0020.0002.006F][.0000.0041.0002.030C] # LATIN SMALL LETTER O WITH CARON; QQCM
+01D1 ; [.113B.0020.0008.004F][.0000.0041.0002.030C] # LATIN CAPITAL LETTER O WITH CARON; QQCM
+00F6 ; [.113B.0020.0002.006F][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH DIAERESIS; QQCM
+00D6 ; [.113B.0020.0008.004F][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH DIAERESIS; QQCM
+022B ; [.113B.0020.0002.006F][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON; QQCM
+022A ; [.113B.0020.0008.004F][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON; QQCM
+0151 ; [.113B.0020.0002.006F][.0000.004D.0002.030B] # LATIN SMALL LETTER O WITH DOUBLE ACUTE; QQCM
+0150 ; [.113B.0020.0008.004F][.0000.004D.0002.030B] # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE; QQCM
+00F5 ; [.113B.0020.0002.006F][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH TILDE; QQCM
+00D5 ; [.113B.0020.0008.004F][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH TILDE; QQCM
+1E4D ; [.113B.0020.0002.006F][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH TILDE AND ACUTE; QQCM
+1E4C ; [.113B.0020.0008.004F][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE; QQCM
+1E4F ; [.113B.0020.0002.006F][.0000.004E.0002.0303][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS; QQCM
+1E4E ; [.113B.0020.0008.004F][.0000.004E.0002.0303][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS; QQCM
+022D ; [.113B.0020.0002.006F][.0000.004E.0002.0303][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH TILDE AND MACRON; QQCM
+022C ; [.113B.0020.0008.004F][.0000.004E.0002.0303][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH TILDE AND MACRON; QQCM
+022F ; [.113B.0020.0002.006F][.0000.0052.0002.0307] # LATIN SMALL LETTER O WITH DOT ABOVE; QQCM
+022E ; [.113B.0020.0008.004F][.0000.0052.0002.0307] # LATIN CAPITAL LETTER O WITH DOT ABOVE; QQCM
+0231 ; [.113B.0020.0002.006F][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON; QQCM
+0230 ; [.113B.0020.0008.004F][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON; QQCM
+00F8 ; [.113B.0020.0002.006F][.0000.0054.0002.0338] # LATIN SMALL LETTER O WITH STROKE; QQCM
+00D8 ; [.113B.0020.0008.004F][.0000.0054.0002.0338] # LATIN CAPITAL LETTER O WITH STROKE; QQCM
+01FF ; [.113B.0020.0002.006F][.0000.0054.0002.0338][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH STROKE AND ACUTE; QQCM
+01FE ; [.113B.0020.0008.004F][.0000.0054.0002.0338][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE; QQCM
+01EB ; [.113B.0020.0002.006F][.0000.0059.0002.0328] # LATIN SMALL LETTER O WITH OGONEK; QQCM
+01EA ; [.113B.0020.0008.004F][.0000.0059.0002.0328] # LATIN CAPITAL LETTER O WITH OGONEK; QQCM
+01ED ; [.113B.0020.0002.006F][.0000.0059.0002.0328][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH OGONEK AND MACRON; QQCM
+01EC ; [.113B.0020.0008.004F][.0000.0059.0002.0328][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON; QQCM
+014D ; [.113B.0020.0002.006F][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH MACRON; QQCM
+014C ; [.113B.0020.0008.004F][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH MACRON; QQCM
+1E53 ; [.113B.0020.0002.006F][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH MACRON AND ACUTE; QQCM
+1E52 ; [.113B.0020.0008.004F][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE; QQCM
+1E51 ; [.113B.0020.0002.006F][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH MACRON AND GRAVE; QQCM
+1E50 ; [.113B.0020.0008.004F][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE; QQCM
+1ECF ; [.113B.0020.0002.006F][.0000.0060.0002.0309] # LATIN SMALL LETTER O WITH HOOK ABOVE; QQCM
+1ECE ; [.113B.0020.0008.004F][.0000.0060.0002.0309] # LATIN CAPITAL LETTER O WITH HOOK ABOVE; QQCM
+020D ; [.113B.0020.0002.006F][.0000.0063.0002.030F] # LATIN SMALL LETTER O WITH DOUBLE GRAVE; QQCM
+020C ; [.113B.0020.0008.004F][.0000.0063.0002.030F] # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE; QQCM
+020F ; [.113B.0020.0002.006F][.0000.0065.0002.0311] # LATIN SMALL LETTER O WITH INVERTED BREVE; QQCM
+020E ; [.113B.0020.0008.004F][.0000.0065.0002.0311] # LATIN CAPITAL LETTER O WITH INVERTED BREVE; QQCM
+01A1 ; [.113B.0020.0002.006F][.0000.006D.0002.031B] # LATIN SMALL LETTER O WITH HORN; QQCM
+01A0 ; [.113B.0020.0008.004F][.0000.006D.0002.031B] # LATIN CAPITAL LETTER O WITH HORN; QQCM
+1EDB ; [.113B.0020.0002.006F][.0000.006D.0002.031B][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH HORN AND ACUTE; QQCM
+1EDA ; [.113B.0020.0008.004F][.0000.006D.0002.031B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH HORN AND ACUTE; QQCM
+1EDD ; [.113B.0020.0002.006F][.0000.006D.0002.031B][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH HORN AND GRAVE; QQCM
+1EDC ; [.113B.0020.0008.004F][.0000.006D.0002.031B][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH HORN AND GRAVE; QQCM
+1EE1 ; [.113B.0020.0002.006F][.0000.006D.0002.031B][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH HORN AND TILDE; QQCM
+1EE0 ; [.113B.0020.0008.004F][.0000.006D.0002.031B][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH HORN AND TILDE; QQCM
+1EDF ; [.113B.0020.0002.006F][.0000.006D.0002.031B][.0000.0060.0002.0309] # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE; QQCM
+1EDE ; [.113B.0020.0008.004F][.0000.006D.0002.031B][.0000.0060.0002.0309] # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE; QQCM
+1EE3 ; [.113B.0020.0002.006F][.0000.006D.0002.031B][.0000.007A.0002.0323] # LATIN SMALL LETTER O WITH HORN AND DOT BELOW; QQCM
+1EE2 ; [.113B.0020.0008.004F][.0000.006D.0002.031B][.0000.007A.0002.0323] # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW; QQCM
+1ECD ; [.113B.0020.0002.006F][.0000.007A.0002.0323] # LATIN SMALL LETTER O WITH DOT BELOW; QQCM
+1ECC ; [.113B.0020.0008.004F][.0000.007A.0002.0323] # LATIN CAPITAL LETTER O WITH DOT BELOW; QQCM
+1ED9 ; [.113B.0020.0002.006F][.0000.007A.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1ED8 ; [.113B.0020.0008.004F][.0000.007A.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW; QQCM
+0153 ; [.113B.0020.0004.0153][.0000.0199.0004.0153][.1029.0020.001F.0153] # LATIN SMALL LIGATURE OE; QQKN
+0152 ; [.113B.0020.000A.0152][.0000.0199.0004.0152][.1029.0020.001F.0152] # LATIN CAPITAL LIGATURE OE; QQKN
+3375 ; [.113B.0020.001C.3375][.1216.0020.001D.3375] # SQUARE OV; QQKN
+1D0F ; [.113F.0020.0002.1D0F] # LATIN LETTER SMALL CAPITAL O
+1D11 ; [.1140.0020.0002.1D11] # LATIN SMALL LETTER SIDEWAYS O
+0276 ; [.1141.0020.0002.0276] # LATIN LETTER SMALL CAPITAL OE
+1D14 ; [.1145.0020.0002.1D14] # LATIN SMALL LETTER TURNED OE
+1D13 ; [.1146.0020.0002.1D13] # LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+0254 ; [.1147.0020.0002.0254] # LATIN SMALL LETTER OPEN O
+0186 ; [.1147.0020.0008.0186] # LATIN CAPITAL LETTER OPEN O
+1D53 ; [.1147.0020.0014.1D53] # MODIFIER LETTER SMALL OPEN O; QQK
+1D10 ; [.114B.0020.0002.1D10] # LATIN LETTER SMALL CAPITAL OPEN O
+1D12 ; [.114C.0020.0002.1D12] # LATIN SMALL LETTER SIDEWAYS OPEN O
+1D97 ; [.114D.0020.0002.1D97] # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
+1D16 ; [.114E.0020.0002.1D16] # LATIN SMALL LETTER TOP HALF O
+1D54 ; [.114E.0020.0014.1D54] # MODIFIER LETTER SMALL TOP HALF O; QQK
+1D17 ; [.114F.0020.0002.1D17] # LATIN SMALL LETTER BOTTOM HALF O
+1D55 ; [.114F.0020.0014.1D55] # MODIFIER LETTER SMALL BOTTOM HALF O; QQK
+0275 ; [.1150.0020.0002.0275] # LATIN SMALL LETTER BARRED O
+019F ; [.1150.0020.0008.019F] # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+1DB1 ; [.1150.0020.0014.1DB1] # MODIFIER LETTER SMALL BARRED O; QQK
+0277 ; [.1154.0020.0002.0277] # LATIN SMALL LETTER CLOSED OMEGA
+0223 ; [.1158.0020.0002.0223] # LATIN SMALL LETTER OU
+0222 ; [.1158.0020.0008.0222] # LATIN CAPITAL LETTER OU
+1D3D ; [.1158.0020.001D.1D3D] # MODIFIER LETTER CAPITAL OU; QQK
+1D15 ; [.115C.0020.0002.1D15] # LATIN LETTER SMALL CAPITAL OU
+0070 ; [.115D.0020.0002.0070] # LATIN SMALL LETTER P
+FF50 ; [.115D.0020.0003.FF50] # FULLWIDTH LATIN SMALL LETTER P; QQK
+24AB ; [*02B1.0020.0004.24AB][.115D.0020.0004.24AB][*02B2.0020.001F.24AB] # PARENTHESIZED LATIN SMALL LETTER P; QQKN
+1D429 ; [.115D.0020.0005.1D429] # MATHEMATICAL BOLD SMALL P; QQK
+1D45D ; [.115D.0020.0005.1D45D] # MATHEMATICAL ITALIC SMALL P; QQK
+1D491 ; [.115D.0020.0005.1D491] # MATHEMATICAL BOLD ITALIC SMALL P; QQK
+1D4C5 ; [.115D.0020.0005.1D4C5] # MATHEMATICAL SCRIPT SMALL P; QQK
+1D4F9 ; [.115D.0020.0005.1D4F9] # MATHEMATICAL BOLD SCRIPT SMALL P; QQK
+1D52D ; [.115D.0020.0005.1D52D] # MATHEMATICAL FRAKTUR SMALL P; QQK
+1D561 ; [.115D.0020.0005.1D561] # MATHEMATICAL DOUBLE-STRUCK SMALL P; QQK
+1D595 ; [.115D.0020.0005.1D595] # MATHEMATICAL BOLD FRAKTUR SMALL P; QQK
+1D5C9 ; [.115D.0020.0005.1D5C9] # MATHEMATICAL SANS-SERIF SMALL P; QQK
+1D5FD ; [.115D.0020.0005.1D5FD] # MATHEMATICAL SANS-SERIF BOLD SMALL P; QQK
+1D631 ; [.115D.0020.0005.1D631] # MATHEMATICAL SANS-SERIF ITALIC SMALL P; QQK
+1D665 ; [.115D.0020.0005.1D665] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P; QQK
+1D699 ; [.115D.0020.0005.1D699] # MATHEMATICAL MONOSPACE SMALL P; QQK
+24DF ; [.115D.0020.0006.24DF] # CIRCLED LATIN SMALL LETTER P; QQK
+0050 ; [.115D.0020.0008.0050] # LATIN CAPITAL LETTER P
+FF30 ; [.115D.0020.0009.FF30] # FULLWIDTH LATIN CAPITAL LETTER P; QQK
+2119 ; [.115D.0020.000B.2119] # DOUBLE-STRUCK CAPITAL P; QQK
+1D40F ; [.115D.0020.000B.1D40F] # MATHEMATICAL BOLD CAPITAL P; QQK
+1D443 ; [.115D.0020.000B.1D443] # MATHEMATICAL ITALIC CAPITAL P; QQK
+1D477 ; [.115D.0020.000B.1D477] # MATHEMATICAL BOLD ITALIC CAPITAL P; QQK
+1D4AB ; [.115D.0020.000B.1D4AB] # MATHEMATICAL SCRIPT CAPITAL P; QQK
+1D4DF ; [.115D.0020.000B.1D4DF] # MATHEMATICAL BOLD SCRIPT CAPITAL P; QQK
+1D513 ; [.115D.0020.000B.1D513] # MATHEMATICAL FRAKTUR CAPITAL P; QQK
+1D57B ; [.115D.0020.000B.1D57B] # MATHEMATICAL BOLD FRAKTUR CAPITAL P; QQK
+1D5AF ; [.115D.0020.000B.1D5AF] # MATHEMATICAL SANS-SERIF CAPITAL P; QQK
+1D5E3 ; [.115D.0020.000B.1D5E3] # MATHEMATICAL SANS-SERIF BOLD CAPITAL P; QQK
+1D617 ; [.115D.0020.000B.1D617] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P; QQK
+1D64B ; [.115D.0020.000B.1D64B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P; QQK
+1D67F ; [.115D.0020.000B.1D67F] # MATHEMATICAL MONOSPACE CAPITAL P; QQK
+24C5 ; [.115D.0020.000C.24C5] # CIRCLED LATIN CAPITAL LETTER P; QQK
+1D56 ; [.115D.0020.0014.1D56] # MODIFIER LETTER SMALL P; QQK
+1D3E ; [.115D.0020.001D.1D3E] # MODIFIER LETTER CAPITAL P; QQK
+1E55 ; [.115D.0020.0002.0070][.0000.0032.0002.0301] # LATIN SMALL LETTER P WITH ACUTE; QQCM
+1E54 ; [.115D.0020.0008.0050][.0000.0032.0002.0301] # LATIN CAPITAL LETTER P WITH ACUTE; QQCM
+1E57 ; [.115D.0020.0002.0070][.0000.0052.0002.0307] # LATIN SMALL LETTER P WITH DOT ABOVE; QQCM
+1E56 ; [.115D.0020.0008.0050][.0000.0052.0002.0307] # LATIN CAPITAL LETTER P WITH DOT ABOVE; QQCM
+3380 ; [.115D.0020.001C.3380][.0FD0.0020.001D.3380] # SQUARE PA AMPS; QQKN
+33A9 ; [.115D.0020.001D.33A9][.0FD0.0020.001C.33A9] # SQUARE PA; QQKN
+3376 ; [.115D.0020.001C.3376][.0FFE.0020.001C.3376] # SQUARE PC; QQKN
+338A ; [.115D.0020.001C.338A][.105F.0020.001D.338A] # SQUARE PF; QQKN
+33D7 ; [.115D.0020.001D.33D7][.108D.0020.001D.33D7] # SQUARE PH; QQKN
+33D8 ; [.115D.0020.001C.33D8][*0266.0020.001C.33D8][.1110.0020.001F.33D8][*0266.0020.001F.33D8] # SQUARE PM; QQKN
+33D9 ; [.115D.0020.001D.33D9][.115D.0020.001D.33D9][.1110.0020.001F.33D9] # SQUARE PPM; QQKN
+33DA ; [.115D.0020.001D.33DA][.117E.0020.001D.33DA] # SQUARE PR; QQKN
+33B0 ; [.115D.0020.001C.33B0][.11AF.0020.001C.33B0] # SQUARE PS; QQKN
+3250 ; [.115D.0020.001D.3250][.11CF.0020.001D.3250][.1029.0020.001F.3250] # PARTNERSHIP SIGN; QQKN
+33B4 ; [.115D.0020.001C.33B4][.1216.0020.001D.33B4] # SQUARE PV; QQKN
+33BA ; [.115D.0020.001C.33BA][.1225.0020.001D.33BA] # SQUARE PW; QQKN
+1D18 ; [.1161.0020.0002.1D18] # LATIN LETTER SMALL CAPITAL P
+1D7D ; [.1162.0020.0002.1D7D] # LATIN SMALL LETTER P WITH STROKE
+2C63 ; [.1162.0020.0008.2C63] # LATIN CAPITAL LETTER P WITH STROKE
+1D71 ; [.1163.0020.0002.1D71] # LATIN SMALL LETTER P WITH MIDDLE TILDE
+1D88 ; [.1164.0020.0002.1D88] # LATIN SMALL LETTER P WITH PALATAL HOOK
+01A5 ; [.1165.0020.0002.01A5] # LATIN SMALL LETTER P WITH HOOK
+01A4 ; [.1165.0020.0008.01A4] # LATIN CAPITAL LETTER P WITH HOOK
+0278 ; [.1169.0020.0002.0278] # LATIN SMALL LETTER PHI
+1DB2 ; [.1169.0020.0014.1DB2] # MODIFIER LETTER SMALL PHI; QQK
+2C77 ; [.116D.0020.0002.2C77] # LATIN SMALL LETTER TAILLESS PHI
+0071 ; [.116E.0020.0002.0071] # LATIN SMALL LETTER Q
+FF51 ; [.116E.0020.0003.FF51] # FULLWIDTH LATIN SMALL LETTER Q; QQK
+24AC ; [*02B1.0020.0004.24AC][.116E.0020.0004.24AC][*02B2.0020.001F.24AC] # PARENTHESIZED LATIN SMALL LETTER Q; QQKN
+1D42A ; [.116E.0020.0005.1D42A] # MATHEMATICAL BOLD SMALL Q; QQK
+1D45E ; [.116E.0020.0005.1D45E] # MATHEMATICAL ITALIC SMALL Q; QQK
+1D492 ; [.116E.0020.0005.1D492] # MATHEMATICAL BOLD ITALIC SMALL Q; QQK
+1D4C6 ; [.116E.0020.0005.1D4C6] # MATHEMATICAL SCRIPT SMALL Q; QQK
+1D4FA ; [.116E.0020.0005.1D4FA] # MATHEMATICAL BOLD SCRIPT SMALL Q; QQK
+1D52E ; [.116E.0020.0005.1D52E] # MATHEMATICAL FRAKTUR SMALL Q; QQK
+1D562 ; [.116E.0020.0005.1D562] # MATHEMATICAL DOUBLE-STRUCK SMALL Q; QQK
+1D596 ; [.116E.0020.0005.1D596] # MATHEMATICAL BOLD FRAKTUR SMALL Q; QQK
+1D5CA ; [.116E.0020.0005.1D5CA] # MATHEMATICAL SANS-SERIF SMALL Q; QQK
+1D5FE ; [.116E.0020.0005.1D5FE] # MATHEMATICAL SANS-SERIF BOLD SMALL Q; QQK
+1D632 ; [.116E.0020.0005.1D632] # MATHEMATICAL SANS-SERIF ITALIC SMALL Q; QQK
+1D666 ; [.116E.0020.0005.1D666] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q; QQK
+1D69A ; [.116E.0020.0005.1D69A] # MATHEMATICAL MONOSPACE SMALL Q; QQK
+24E0 ; [.116E.0020.0006.24E0] # CIRCLED LATIN SMALL LETTER Q; QQK
+0051 ; [.116E.0020.0008.0051] # LATIN CAPITAL LETTER Q
+FF31 ; [.116E.0020.0009.FF31] # FULLWIDTH LATIN CAPITAL LETTER Q; QQK
+211A ; [.116E.0020.000B.211A] # DOUBLE-STRUCK CAPITAL Q; QQK
+1D410 ; [.116E.0020.000B.1D410] # MATHEMATICAL BOLD CAPITAL Q; QQK
+1D444 ; [.116E.0020.000B.1D444] # MATHEMATICAL ITALIC CAPITAL Q; QQK
+1D478 ; [.116E.0020.000B.1D478] # MATHEMATICAL BOLD ITALIC CAPITAL Q; QQK
+1D4AC ; [.116E.0020.000B.1D4AC] # MATHEMATICAL SCRIPT CAPITAL Q; QQK
+1D4E0 ; [.116E.0020.000B.1D4E0] # MATHEMATICAL BOLD SCRIPT CAPITAL Q; QQK
+1D514 ; [.116E.0020.000B.1D514] # MATHEMATICAL FRAKTUR CAPITAL Q; QQK
+1D57C ; [.116E.0020.000B.1D57C] # MATHEMATICAL BOLD FRAKTUR CAPITAL Q; QQK
+1D5B0 ; [.116E.0020.000B.1D5B0] # MATHEMATICAL SANS-SERIF CAPITAL Q; QQK
+1D5E4 ; [.116E.0020.000B.1D5E4] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q; QQK
+1D618 ; [.116E.0020.000B.1D618] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q; QQK
+1D64C ; [.116E.0020.000B.1D64C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q; QQK
+1D680 ; [.116E.0020.000B.1D680] # MATHEMATICAL MONOSPACE CAPITAL Q; QQK
+24C6 ; [.116E.0020.000C.24C6] # CIRCLED LATIN CAPITAL LETTER Q; QQK
+0239 ; [.116E.0020.0004.0239][.115D.0020.0004.0239] # LATIN SMALL LETTER QP DIGRAPH; QQKN
+02A0 ; [.1172.0020.0002.02A0] # LATIN SMALL LETTER Q WITH HOOK
+024B ; [.1176.0020.0002.024B] # LATIN SMALL LETTER Q WITH HOOK TAIL
+024A ; [.1176.0020.0008.024A] # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+0138 ; [.117A.0020.0002.0138] # LATIN SMALL LETTER KRA
+0072 ; [.117E.0020.0002.0072] # LATIN SMALL LETTER R
+FF52 ; [.117E.0020.0003.FF52] # FULLWIDTH LATIN SMALL LETTER R; QQK
+036C ; [.117E.0020.0004.036C] # COMBINING LATIN SMALL LETTER R; QQK
+24AD ; [*02B1.0020.0004.24AD][.117E.0020.0004.24AD][*02B2.0020.001F.24AD] # PARENTHESIZED LATIN SMALL LETTER R; QQKN
+1D42B ; [.117E.0020.0005.1D42B] # MATHEMATICAL BOLD SMALL R; QQK
+1D45F ; [.117E.0020.0005.1D45F] # MATHEMATICAL ITALIC SMALL R; QQK
+1D493 ; [.117E.0020.0005.1D493] # MATHEMATICAL BOLD ITALIC SMALL R; QQK
+1D4C7 ; [.117E.0020.0005.1D4C7] # MATHEMATICAL SCRIPT SMALL R; QQK
+1D4FB ; [.117E.0020.0005.1D4FB] # MATHEMATICAL BOLD SCRIPT SMALL R; QQK
+1D52F ; [.117E.0020.0005.1D52F] # MATHEMATICAL FRAKTUR SMALL R; QQK
+1D563 ; [.117E.0020.0005.1D563] # MATHEMATICAL DOUBLE-STRUCK SMALL R; QQK
+1D597 ; [.117E.0020.0005.1D597] # MATHEMATICAL BOLD FRAKTUR SMALL R; QQK
+1D5CB ; [.117E.0020.0005.1D5CB] # MATHEMATICAL SANS-SERIF SMALL R; QQK
+1D5FF ; [.117E.0020.0005.1D5FF] # MATHEMATICAL SANS-SERIF BOLD SMALL R; QQK
+1D633 ; [.117E.0020.0005.1D633] # MATHEMATICAL SANS-SERIF ITALIC SMALL R; QQK
+1D667 ; [.117E.0020.0005.1D667] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R; QQK
+1D69B ; [.117E.0020.0005.1D69B] # MATHEMATICAL MONOSPACE SMALL R; QQK
+24E1 ; [.117E.0020.0006.24E1] # CIRCLED LATIN SMALL LETTER R; QQK
+0052 ; [.117E.0020.0008.0052] # LATIN CAPITAL LETTER R
+FF32 ; [.117E.0020.0009.FF32] # FULLWIDTH LATIN CAPITAL LETTER R; QQK
+211B ; [.117E.0020.000B.211B] # SCRIPT CAPITAL R; QQK
+211C ; [.117E.0020.000B.211C] # BLACK-LETTER CAPITAL R; QQK
+211D ; [.117E.0020.000B.211D] # DOUBLE-STRUCK CAPITAL R; QQK
+1D411 ; [.117E.0020.000B.1D411] # MATHEMATICAL BOLD CAPITAL R; QQK
+1D445 ; [.117E.0020.000B.1D445] # MATHEMATICAL ITALIC CAPITAL R; QQK
+1D479 ; [.117E.0020.000B.1D479] # MATHEMATICAL BOLD ITALIC CAPITAL R; QQK
+1D4E1 ; [.117E.0020.000B.1D4E1] # MATHEMATICAL BOLD SCRIPT CAPITAL R; QQK
+1D57D ; [.117E.0020.000B.1D57D] # MATHEMATICAL BOLD FRAKTUR CAPITAL R; QQK
+1D5B1 ; [.117E.0020.000B.1D5B1] # MATHEMATICAL SANS-SERIF CAPITAL R; QQK
+1D5E5 ; [.117E.0020.000B.1D5E5] # MATHEMATICAL SANS-SERIF BOLD CAPITAL R; QQK
+1D619 ; [.117E.0020.000B.1D619] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R; QQK
+1D64D ; [.117E.0020.000B.1D64D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R; QQK
+1D681 ; [.117E.0020.000B.1D681] # MATHEMATICAL MONOSPACE CAPITAL R; QQK
+24C7 ; [.117E.0020.000C.24C7] # CIRCLED LATIN CAPITAL LETTER R; QQK
+02B3 ; [.117E.0020.0014.02B3] # MODIFIER LETTER SMALL R; QQK
+1D63 ; [.117E.0020.0015.1D63] # LATIN SUBSCRIPT SMALL LETTER R; QQK
+1D3F ; [.117E.0020.001D.1D3F] # MODIFIER LETTER CAPITAL R; QQK
+0155 ; [.117E.0020.0002.0072][.0000.0032.0002.0301] # LATIN SMALL LETTER R WITH ACUTE; QQCM
+0154 ; [.117E.0020.0008.0052][.0000.0032.0002.0301] # LATIN CAPITAL LETTER R WITH ACUTE; QQCM
+0159 ; [.117E.0020.0002.0072][.0000.0041.0002.030C] # LATIN SMALL LETTER R WITH CARON; QQCM
+0158 ; [.117E.0020.0008.0052][.0000.0041.0002.030C] # LATIN CAPITAL LETTER R WITH CARON; QQCM
+1E59 ; [.117E.0020.0002.0072][.0000.0052.0002.0307] # LATIN SMALL LETTER R WITH DOT ABOVE; QQCM
+1E58 ; [.117E.0020.0008.0052][.0000.0052.0002.0307] # LATIN CAPITAL LETTER R WITH DOT ABOVE; QQCM
+0157 ; [.117E.0020.0002.0072][.0000.0056.0002.0327] # LATIN SMALL LETTER R WITH CEDILLA; QQCM
+0156 ; [.117E.0020.0008.0052][.0000.0056.0002.0327] # LATIN CAPITAL LETTER R WITH CEDILLA; QQCM
+0211 ; [.117E.0020.0002.0072][.0000.0063.0002.030F] # LATIN SMALL LETTER R WITH DOUBLE GRAVE; QQCM
+0210 ; [.117E.0020.0008.0052][.0000.0063.0002.030F] # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE; QQCM
+0213 ; [.117E.0020.0002.0072][.0000.0065.0002.0311] # LATIN SMALL LETTER R WITH INVERTED BREVE; QQCM
+0212 ; [.117E.0020.0008.0052][.0000.0065.0002.0311] # LATIN CAPITAL LETTER R WITH INVERTED BREVE; QQCM
+1E5B ; [.117E.0020.0002.0072][.0000.007A.0002.0323] # LATIN SMALL LETTER R WITH DOT BELOW; QQCM
+1E5A ; [.117E.0020.0008.0052][.0000.007A.0002.0323] # LATIN CAPITAL LETTER R WITH DOT BELOW; QQCM
+1E5D ; [.117E.0020.0002.0072][.0000.007A.0002.0323][.0000.005B.0002.0304] # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON; QQCM
+1E5C ; [.117E.0020.0008.0052][.0000.007A.0002.0323][.0000.005B.0002.0304] # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON; QQCM
+1E5F ; [.117E.0020.0002.0072][.0000.008A.0002.0331] # LATIN SMALL LETTER R WITH LINE BELOW; QQCM
+1E5E ; [.117E.0020.0008.0052][.0000.008A.0002.0331] # LATIN CAPITAL LETTER R WITH LINE BELOW; QQCM
+33AD ; [.117E.0020.001C.33AD][.0FD0.0020.001C.33AD][.1010.0020.001F.33AD] # SQUARE RAD; QQKN
+33AE ; [.117E.0020.001C.33AE][.0FD0.0020.001C.33AE][.1010.0020.001F.33AE][*04C7.0020.001F.33AE][.11AF.0020.001F.33AE] # SQUARE RAD OVER S; QQKN
+33AF ; [.117E.0020.001C.33AF][.0FD0.0020.001C.33AF][.1010.0020.001F.33AF][*04C7.0020.001F.33AF][.11AF.0020.001F.33AF][.0FC8.0020.001F.33AF] # SQUARE RAD OVER S SQUARED; QQKN
+20A8 ; [.117E.0020.000A.20A8][.11AF.0020.0004.20A8] # RUPEE SIGN; QQKN
+0280 ; [.1182.0020.0002.0280] # LATIN LETTER SMALL CAPITAL R
+01A6 ; [.1182.0020.0008.01A6] # LATIN LETTER YR
+1D19 ; [.1186.0020.0002.1D19] # LATIN LETTER SMALL CAPITAL REVERSED R
+024D ; [.1187.0020.0002.024D] # LATIN SMALL LETTER R WITH STROKE
+024C ; [.1187.0020.0008.024C] # LATIN CAPITAL LETTER R WITH STROKE
+1D72 ; [.118B.0020.0002.1D72] # LATIN SMALL LETTER R WITH MIDDLE TILDE
+0279 ; [.118C.0020.0002.0279] # LATIN SMALL LETTER TURNED R
+02B4 ; [.118C.0020.0014.02B4] # MODIFIER LETTER SMALL TURNED R; QQK
+1D1A ; [.1190.0020.0002.1D1A] # LATIN LETTER SMALL CAPITAL TURNED R
+027A ; [.1191.0020.0002.027A] # LATIN SMALL LETTER TURNED R WITH LONG LEG
+1D89 ; [.1195.0020.0002.1D89] # LATIN SMALL LETTER R WITH PALATAL HOOK
+027B ; [.1196.0020.0002.027B] # LATIN SMALL LETTER TURNED R WITH HOOK
+02B5 ; [.1196.0020.0014.02B5] # MODIFIER LETTER SMALL TURNED R WITH HOOK; QQK
+027C ; [.119A.0020.0002.027C] # LATIN SMALL LETTER R WITH LONG LEG
+027D ; [.119E.0020.0002.027D] # LATIN SMALL LETTER R WITH TAIL
+2C64 ; [.119E.0020.0008.2C64] # LATIN CAPITAL LETTER R WITH TAIL
+027E ; [.11A2.0020.0002.027E] # LATIN SMALL LETTER R WITH FISHHOOK
+1D73 ; [.11A6.0020.0002.1D73] # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
+027F ; [.11A7.0020.0002.027F] # LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0281 ; [.11AB.0020.0002.0281] # LATIN LETTER SMALL CAPITAL INVERTED R
+02B6 ; [.11AB.0020.0014.02B6] # MODIFIER LETTER SMALL CAPITAL INVERTED R; QQK
+0073 ; [.11AF.0020.0002.0073] # LATIN SMALL LETTER S
+FF53 ; [.11AF.0020.0003.FF53] # FULLWIDTH LATIN SMALL LETTER S; QQK
+24AE ; [*02B1.0020.0004.24AE][.11AF.0020.0004.24AE][*02B2.0020.001F.24AE] # PARENTHESIZED LATIN SMALL LETTER S; QQKN
+1D42C ; [.11AF.0020.0005.1D42C] # MATHEMATICAL BOLD SMALL S; QQK
+1D460 ; [.11AF.0020.0005.1D460] # MATHEMATICAL ITALIC SMALL S; QQK
+1D494 ; [.11AF.0020.0005.1D494] # MATHEMATICAL BOLD ITALIC SMALL S; QQK
+1D4C8 ; [.11AF.0020.0005.1D4C8] # MATHEMATICAL SCRIPT SMALL S; QQK
+1D4FC ; [.11AF.0020.0005.1D4FC] # MATHEMATICAL BOLD SCRIPT SMALL S; QQK
+1D530 ; [.11AF.0020.0005.1D530] # MATHEMATICAL FRAKTUR SMALL S; QQK
+1D564 ; [.11AF.0020.0005.1D564] # MATHEMATICAL DOUBLE-STRUCK SMALL S; QQK
+1D598 ; [.11AF.0020.0005.1D598] # MATHEMATICAL BOLD FRAKTUR SMALL S; QQK
+1D5CC ; [.11AF.0020.0005.1D5CC] # MATHEMATICAL SANS-SERIF SMALL S; QQK
+1D600 ; [.11AF.0020.0005.1D600] # MATHEMATICAL SANS-SERIF BOLD SMALL S; QQK
+1D634 ; [.11AF.0020.0005.1D634] # MATHEMATICAL SANS-SERIF ITALIC SMALL S; QQK
+1D668 ; [.11AF.0020.0005.1D668] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S; QQK
+1D69C ; [.11AF.0020.0005.1D69C] # MATHEMATICAL MONOSPACE SMALL S; QQK
+24E2 ; [.11AF.0020.0006.24E2] # CIRCLED LATIN SMALL LETTER S; QQK
+0053 ; [.11AF.0020.0008.0053] # LATIN CAPITAL LETTER S
+FF33 ; [.11AF.0020.0009.FF33] # FULLWIDTH LATIN CAPITAL LETTER S; QQK
+1D412 ; [.11AF.0020.000B.1D412] # MATHEMATICAL BOLD CAPITAL S; QQK
+1D446 ; [.11AF.0020.000B.1D446] # MATHEMATICAL ITALIC CAPITAL S; QQK
+1D47A ; [.11AF.0020.000B.1D47A] # MATHEMATICAL BOLD ITALIC CAPITAL S; QQK
+1D4AE ; [.11AF.0020.000B.1D4AE] # MATHEMATICAL SCRIPT CAPITAL S; QQK
+1D4E2 ; [.11AF.0020.000B.1D4E2] # MATHEMATICAL BOLD SCRIPT CAPITAL S; QQK
+1D516 ; [.11AF.0020.000B.1D516] # MATHEMATICAL FRAKTUR CAPITAL S; QQK
+1D54A ; [.11AF.0020.000B.1D54A] # MATHEMATICAL DOUBLE-STRUCK CAPITAL S; QQK
+1D57E ; [.11AF.0020.000B.1D57E] # MATHEMATICAL BOLD FRAKTUR CAPITAL S; QQK
+1D5B2 ; [.11AF.0020.000B.1D5B2] # MATHEMATICAL SANS-SERIF CAPITAL S; QQK
+1D5E6 ; [.11AF.0020.000B.1D5E6] # MATHEMATICAL SANS-SERIF BOLD CAPITAL S; QQK
+1D61A ; [.11AF.0020.000B.1D61A] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S; QQK
+1D64E ; [.11AF.0020.000B.1D64E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S; QQK
+1D682 ; [.11AF.0020.000B.1D682] # MATHEMATICAL MONOSPACE CAPITAL S; QQK
+24C8 ; [.11AF.0020.000C.24C8] # CIRCLED LATIN CAPITAL LETTER S; QQK
+02E2 ; [.11AF.0020.0014.02E2] # MODIFIER LETTER SMALL S; QQK
+015B ; [.11AF.0020.0002.0073][.0000.0032.0002.0301] # LATIN SMALL LETTER S WITH ACUTE; QQCM
+015A ; [.11AF.0020.0008.0053][.0000.0032.0002.0301] # LATIN CAPITAL LETTER S WITH ACUTE; QQCM
+1E65 ; [.11AF.0020.0002.0073][.0000.0032.0002.0301][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE; QQCM
+1E64 ; [.11AF.0020.0008.0053][.0000.0032.0002.0301][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE; QQCM
+015D ; [.11AF.0020.0002.0073][.0000.003C.0002.0302] # LATIN SMALL LETTER S WITH CIRCUMFLEX; QQCM
+015C ; [.11AF.0020.0008.0053][.0000.003C.0002.0302] # LATIN CAPITAL LETTER S WITH CIRCUMFLEX; QQCM
+0161 ; [.11AF.0020.0002.0073][.0000.0041.0002.030C] # LATIN SMALL LETTER S WITH CARON; QQCM
+0160 ; [.11AF.0020.0008.0053][.0000.0041.0002.030C] # LATIN CAPITAL LETTER S WITH CARON; QQCM
+1E67 ; [.11AF.0020.0002.0073][.0000.0041.0002.030C][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE; QQCM
+1E66 ; [.11AF.0020.0008.0053][.0000.0041.0002.030C][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE; QQCM
+1E61 ; [.11AF.0020.0002.0073][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH DOT ABOVE; QQCM
+1E60 ; [.11AF.0020.0008.0053][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH DOT ABOVE; QQCM
+015F ; [.11AF.0020.0002.0073][.0000.0056.0002.0327] # LATIN SMALL LETTER S WITH CEDILLA; QQCM
+015E ; [.11AF.0020.0008.0053][.0000.0056.0002.0327] # LATIN CAPITAL LETTER S WITH CEDILLA; QQCM
+1E63 ; [.11AF.0020.0002.0073][.0000.007A.0002.0323] # LATIN SMALL LETTER S WITH DOT BELOW; QQCM
+1E62 ; [.11AF.0020.0008.0053][.0000.007A.0002.0323] # LATIN CAPITAL LETTER S WITH DOT BELOW; QQCM
+1E69 ; [.11AF.0020.0002.0073][.0000.007A.0002.0323][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE; QQCM
+1E68 ; [.11AF.0020.0008.0053][.0000.007A.0002.0323][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE; QQCM
+0219 ; [.11AF.0020.0002.0073][.0000.0081.0002.0326] # LATIN SMALL LETTER S WITH COMMA BELOW; QQCM
+0218 ; [.11AF.0020.0008.0053][.0000.0081.0002.0326] # LATIN CAPITAL LETTER S WITH COMMA BELOW; QQCM
+017F ; [.11AF.0020.0004.017F][.0000.019A.0004.017F] # LATIN SMALL LETTER LONG S; QQKN
+1E9B ; [.11AF.0020.0004.1E9B][.0000.019A.0004.1E9B][.0000.0052.0002.1E9B] # LATIN SMALL LETTER LONG S WITH DOT ABOVE; QQKN
+2120 ; [.11AF.0020.0014.2120][.1110.0020.0014.2120] # SERVICE MARK; QQKN
+33DB ; [.11AF.0020.001C.33DB][.117E.0020.001C.33DB] # SQUARE SR; QQKN
+00DF ; [.11AF.0020.0004.00DF][.0000.0199.0004.00DF][.11AF.0020.001F.00DF] # LATIN SMALL LETTER SHARP S; QQKN
+FB06 ; [.11AF.0020.0004.FB06][.11CF.0020.0004.FB06] # LATIN SMALL LIGATURE ST; QQKN
+FB05 ; [.11AF.0020.0004.FB05][.0000.019A.0004.FB05][.11CF.0020.001F.FB05] # LATIN SMALL LIGATURE LONG S T; QQKN
+33DC ; [.11AF.0020.001D.33DC][.1216.0020.001C.33DC] # SQUARE SV; QQKN
+1D74 ; [.11B3.0020.0002.1D74] # LATIN SMALL LETTER S WITH MIDDLE TILDE
+1D8A ; [.11B4.0020.0002.1D8A] # LATIN SMALL LETTER S WITH PALATAL HOOK
+0282 ; [.11B5.0020.0002.0282] # LATIN SMALL LETTER S WITH HOOK
+1DB3 ; [.11B5.0020.0014.1DB3] # MODIFIER LETTER SMALL S WITH HOOK; QQK
+023F ; [.11B9.0020.0002.023F] # LATIN SMALL LETTER S WITH SWASH TAIL
+0283 ; [.11BD.0020.0002.0283] # LATIN SMALL LETTER ESH
+01A9 ; [.11BD.0020.0008.01A9] # LATIN CAPITAL LETTER ESH
+1DB4 ; [.11BD.0020.0014.1DB4] # MODIFIER LETTER SMALL ESH; QQK
+1D8B ; [.11C1.0020.0002.1D8B] # LATIN SMALL LETTER ESH WITH PALATAL HOOK
+01AA ; [.11C2.0020.0002.01AA] # LATIN LETTER REVERSED ESH LOOP
+0285 ; [.11C6.0020.0002.0285] # LATIN SMALL LETTER SQUAT REVERSED ESH
+1D98 ; [.11CA.0020.0002.1D98] # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK
+0286 ; [.11CB.0020.0002.0286] # LATIN SMALL LETTER ESH WITH CURL
+0074 ; [.11CF.0020.0002.0074] # LATIN SMALL LETTER T
+FF54 ; [.11CF.0020.0003.FF54] # FULLWIDTH LATIN SMALL LETTER T; QQK
+036D ; [.11CF.0020.0004.036D] # COMBINING LATIN SMALL LETTER T; QQK
+24AF ; [*02B1.0020.0004.24AF][.11CF.0020.0004.24AF][*02B2.0020.001F.24AF] # PARENTHESIZED LATIN SMALL LETTER T; QQKN
+1D42D ; [.11CF.0020.0005.1D42D] # MATHEMATICAL BOLD SMALL T; QQK
+1D461 ; [.11CF.0020.0005.1D461] # MATHEMATICAL ITALIC SMALL T; QQK
+1D495 ; [.11CF.0020.0005.1D495] # MATHEMATICAL BOLD ITALIC SMALL T; QQK
+1D4C9 ; [.11CF.0020.0005.1D4C9] # MATHEMATICAL SCRIPT SMALL T; QQK
+1D4FD ; [.11CF.0020.0005.1D4FD] # MATHEMATICAL BOLD SCRIPT SMALL T; QQK
+1D531 ; [.11CF.0020.0005.1D531] # MATHEMATICAL FRAKTUR SMALL T; QQK
+1D565 ; [.11CF.0020.0005.1D565] # MATHEMATICAL DOUBLE-STRUCK SMALL T; QQK
+1D599 ; [.11CF.0020.0005.1D599] # MATHEMATICAL BOLD FRAKTUR SMALL T; QQK
+1D5CD ; [.11CF.0020.0005.1D5CD] # MATHEMATICAL SANS-SERIF SMALL T; QQK
+1D601 ; [.11CF.0020.0005.1D601] # MATHEMATICAL SANS-SERIF BOLD SMALL T; QQK
+1D635 ; [.11CF.0020.0005.1D635] # MATHEMATICAL SANS-SERIF ITALIC SMALL T; QQK
+1D669 ; [.11CF.0020.0005.1D669] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T; QQK
+1D69D ; [.11CF.0020.0005.1D69D] # MATHEMATICAL MONOSPACE SMALL T; QQK
+24E3 ; [.11CF.0020.0006.24E3] # CIRCLED LATIN SMALL LETTER T; QQK
+0054 ; [.11CF.0020.0008.0054] # LATIN CAPITAL LETTER T
+FF34 ; [.11CF.0020.0009.FF34] # FULLWIDTH LATIN CAPITAL LETTER T; QQK
+1D413 ; [.11CF.0020.000B.1D413] # MATHEMATICAL BOLD CAPITAL T; QQK
+1D447 ; [.11CF.0020.000B.1D447] # MATHEMATICAL ITALIC CAPITAL T; QQK
+1D47B ; [.11CF.0020.000B.1D47B] # MATHEMATICAL BOLD ITALIC CAPITAL T; QQK
+1D4AF ; [.11CF.0020.000B.1D4AF] # MATHEMATICAL SCRIPT CAPITAL T; QQK
+1D4E3 ; [.11CF.0020.000B.1D4E3] # MATHEMATICAL BOLD SCRIPT CAPITAL T; QQK
+1D517 ; [.11CF.0020.000B.1D517] # MATHEMATICAL FRAKTUR CAPITAL T; QQK
+1D54B ; [.11CF.0020.000B.1D54B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL T; QQK
+1D57F ; [.11CF.0020.000B.1D57F] # MATHEMATICAL BOLD FRAKTUR CAPITAL T; QQK
+1D5B3 ; [.11CF.0020.000B.1D5B3] # MATHEMATICAL SANS-SERIF CAPITAL T; QQK
+1D5E7 ; [.11CF.0020.000B.1D5E7] # MATHEMATICAL SANS-SERIF BOLD CAPITAL T; QQK
+1D61B ; [.11CF.0020.000B.1D61B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T; QQK
+1D64F ; [.11CF.0020.000B.1D64F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T; QQK
+1D683 ; [.11CF.0020.000B.1D683] # MATHEMATICAL MONOSPACE CAPITAL T; QQK
+24C9 ; [.11CF.0020.000C.24C9] # CIRCLED LATIN CAPITAL LETTER T; QQK
+1D57 ; [.11CF.0020.0014.1D57] # MODIFIER LETTER SMALL T; QQK
+1D40 ; [.11CF.0020.001D.1D40] # MODIFIER LETTER CAPITAL T; QQK
+0165 ; [.11CF.0020.0002.0074][.0000.0041.0002.030C] # LATIN SMALL LETTER T WITH CARON; QQCM
+0164 ; [.11CF.0020.0008.0054][.0000.0041.0002.030C] # LATIN CAPITAL LETTER T WITH CARON; QQCM
+1E97 ; [.11CF.0020.0002.0074][.0000.0047.0002.0308] # LATIN SMALL LETTER T WITH DIAERESIS; QQCM
+1E6B ; [.11CF.0020.0002.0074][.0000.0052.0002.0307] # LATIN SMALL LETTER T WITH DOT ABOVE; QQCM
+1E6A ; [.11CF.0020.0008.0054][.0000.0052.0002.0307] # LATIN CAPITAL LETTER T WITH DOT ABOVE; QQCM
+0163 ; [.11CF.0020.0002.0074][.0000.0056.0002.0327] # LATIN SMALL LETTER T WITH CEDILLA; QQCM
+0162 ; [.11CF.0020.0008.0054][.0000.0056.0002.0327] # LATIN CAPITAL LETTER T WITH CEDILLA; QQCM
+1E6D ; [.11CF.0020.0002.0074][.0000.007A.0002.0323] # LATIN SMALL LETTER T WITH DOT BELOW; QQCM
+1E6C ; [.11CF.0020.0008.0054][.0000.007A.0002.0323] # LATIN CAPITAL LETTER T WITH DOT BELOW; QQCM
+021B ; [.11CF.0020.0002.0074][.0000.0081.0002.0326] # LATIN SMALL LETTER T WITH COMMA BELOW; QQCM
+021A ; [.11CF.0020.0008.0054][.0000.0081.0002.0326] # LATIN CAPITAL LETTER T WITH COMMA BELOW; QQCM
+1E71 ; [.11CF.0020.0002.0074][.0000.0086.0002.032D] # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW; QQCM
+1E70 ; [.11CF.0020.0008.0054][.0000.0086.0002.032D] # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW; QQCM
+1E6F ; [.11CF.0020.0002.0074][.0000.008A.0002.0331] # LATIN SMALL LETTER T WITH LINE BELOW; QQCM
+1E6E ; [.11CF.0020.0008.0054][.0000.008A.0002.0331] # LATIN CAPITAL LETTER T WITH LINE BELOW; QQCM
+02A8 ; [.11CF.0020.0004.02A8][.100B.0020.0004.02A8] # LATIN SMALL LETTER TC DIGRAPH WITH CURL; QQKN
+2121 ; [.11CF.0020.000A.2121][.1029.0020.000A.2121][.10E5.0020.001F.2121] # TELEPHONE SIGN; QQKN
+1D7A ; [.11CF.0020.0004.1D7A][.0000.019A.0004.1D7A][.108D.0020.001F.1D7A] # LATIN SMALL LETTER TH WITH STRIKETHROUGH; QQKN
+3394 ; [.11CF.0020.001D.3394][.108D.0020.001D.3394][.1243.0020.001F.3394] # SQUARE THZ; QQKN
+2122 ; [.11CF.0020.0014.2122][.1110.0020.0014.2122] # TRADE MARK SIGN; QQKN
+01BE ; [.11CF.0020.0004.01BE][.11AF.0020.0004.01BE] # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE; QQKN
+02A6 ; [.11CF.0020.0004.02A6][.11AF.0020.0004.02A6] # LATIN SMALL LETTER TS DIGRAPH; QQKN
+02A7 ; [.11CF.0020.0004.02A7][.11BD.0020.0004.02A7] # LATIN SMALL LETTER TESH DIGRAPH; QQKN
+1D1B ; [.11D3.0020.0002.1D1B] # LATIN LETTER SMALL CAPITAL T
+0167 ; [.11D4.0020.0002.0167] # LATIN SMALL LETTER T WITH STROKE
+0166 ; [.11D4.0020.0008.0166] # LATIN CAPITAL LETTER T WITH STROKE
+2C66 ; [.11D8.0020.0002.2C66] # LATIN SMALL LETTER T WITH DIAGONAL STROKE
+023E ; [.11D8.0020.0008.023E] # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+1D75 ; [.11D9.0020.0002.1D75] # LATIN SMALL LETTER T WITH MIDDLE TILDE
+01AB ; [.11DA.0020.0002.01AB] # LATIN SMALL LETTER T WITH PALATAL HOOK
+1DB5 ; [.11DA.0020.0014.1DB5] # MODIFIER LETTER SMALL T WITH PALATAL HOOK; QQK
+01AD ; [.11DE.0020.0002.01AD] # LATIN SMALL LETTER T WITH HOOK
+01AC ; [.11DE.0020.0008.01AC] # LATIN CAPITAL LETTER T WITH HOOK
+0288 ; [.11E2.0020.0002.0288] # LATIN SMALL LETTER T WITH RETROFLEX HOOK
+01AE ; [.11E2.0020.0008.01AE] # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+0236 ; [.11E6.0020.0002.0236] # LATIN SMALL LETTER T WITH CURL
+0287 ; [.11EA.0020.0002.0287] # LATIN SMALL LETTER TURNED T
+0075 ; [.11EE.0020.0002.0075] # LATIN SMALL LETTER U
+FF55 ; [.11EE.0020.0003.FF55] # FULLWIDTH LATIN SMALL LETTER U; QQK
+0367 ; [.11EE.0020.0004.0367] # COMBINING LATIN SMALL LETTER U; QQK
+24B0 ; [*02B1.0020.0004.24B0][.11EE.0020.0004.24B0][*02B2.0020.001F.24B0] # PARENTHESIZED LATIN SMALL LETTER U; QQKN
+1D42E ; [.11EE.0020.0005.1D42E] # MATHEMATICAL BOLD SMALL U; QQK
+1D462 ; [.11EE.0020.0005.1D462] # MATHEMATICAL ITALIC SMALL U; QQK
+1D496 ; [.11EE.0020.0005.1D496] # MATHEMATICAL BOLD ITALIC SMALL U; QQK
+1D4CA ; [.11EE.0020.0005.1D4CA] # MATHEMATICAL SCRIPT SMALL U; QQK
+1D4FE ; [.11EE.0020.0005.1D4FE] # MATHEMATICAL BOLD SCRIPT SMALL U; QQK
+1D532 ; [.11EE.0020.0005.1D532] # MATHEMATICAL FRAKTUR SMALL U; QQK
+1D566 ; [.11EE.0020.0005.1D566] # MATHEMATICAL DOUBLE-STRUCK SMALL U; QQK
+1D59A ; [.11EE.0020.0005.1D59A] # MATHEMATICAL BOLD FRAKTUR SMALL U; QQK
+1D5CE ; [.11EE.0020.0005.1D5CE] # MATHEMATICAL SANS-SERIF SMALL U; QQK
+1D602 ; [.11EE.0020.0005.1D602] # MATHEMATICAL SANS-SERIF BOLD SMALL U; QQK
+1D636 ; [.11EE.0020.0005.1D636] # MATHEMATICAL SANS-SERIF ITALIC SMALL U; QQK
+1D66A ; [.11EE.0020.0005.1D66A] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U; QQK
+1D69E ; [.11EE.0020.0005.1D69E] # MATHEMATICAL MONOSPACE SMALL U; QQK
+24E4 ; [.11EE.0020.0006.24E4] # CIRCLED LATIN SMALL LETTER U; QQK
+0055 ; [.11EE.0020.0008.0055] # LATIN CAPITAL LETTER U
+FF35 ; [.11EE.0020.0009.FF35] # FULLWIDTH LATIN CAPITAL LETTER U; QQK
+1D414 ; [.11EE.0020.000B.1D414] # MATHEMATICAL BOLD CAPITAL U; QQK
+1D448 ; [.11EE.0020.000B.1D448] # MATHEMATICAL ITALIC CAPITAL U; QQK
+1D47C ; [.11EE.0020.000B.1D47C] # MATHEMATICAL BOLD ITALIC CAPITAL U; QQK
+1D4B0 ; [.11EE.0020.000B.1D4B0] # MATHEMATICAL SCRIPT CAPITAL U; QQK
+1D4E4 ; [.11EE.0020.000B.1D4E4] # MATHEMATICAL BOLD SCRIPT CAPITAL U; QQK
+1D518 ; [.11EE.0020.000B.1D518] # MATHEMATICAL FRAKTUR CAPITAL U; QQK
+1D54C ; [.11EE.0020.000B.1D54C] # MATHEMATICAL DOUBLE-STRUCK CAPITAL U; QQK
+1D580 ; [.11EE.0020.000B.1D580] # MATHEMATICAL BOLD FRAKTUR CAPITAL U; QQK
+1D5B4 ; [.11EE.0020.000B.1D5B4] # MATHEMATICAL SANS-SERIF CAPITAL U; QQK
+1D5E8 ; [.11EE.0020.000B.1D5E8] # MATHEMATICAL SANS-SERIF BOLD CAPITAL U; QQK
+1D61C ; [.11EE.0020.000B.1D61C] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U; QQK
+1D650 ; [.11EE.0020.000B.1D650] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U; QQK
+1D684 ; [.11EE.0020.000B.1D684] # MATHEMATICAL MONOSPACE CAPITAL U; QQK
+24CA ; [.11EE.0020.000C.24CA] # CIRCLED LATIN CAPITAL LETTER U; QQK
+1D58 ; [.11EE.0020.0014.1D58] # MODIFIER LETTER SMALL U; QQK
+1D64 ; [.11EE.0020.0015.1D64] # LATIN SUBSCRIPT SMALL LETTER U; QQK
+1D41 ; [.11EE.0020.001D.1D41] # MODIFIER LETTER CAPITAL U; QQK
+00FA ; [.11EE.0020.0002.0075][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH ACUTE; QQCM
+00DA ; [.11EE.0020.0008.0055][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH ACUTE; QQCM
+00F9 ; [.11EE.0020.0002.0075][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH GRAVE; QQCM
+00D9 ; [.11EE.0020.0008.0055][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH GRAVE; QQCM
+016D ; [.11EE.0020.0002.0075][.0000.0037.0002.0306] # LATIN SMALL LETTER U WITH BREVE; QQCM
+016C ; [.11EE.0020.0008.0055][.0000.0037.0002.0306] # LATIN CAPITAL LETTER U WITH BREVE; QQCM
+00FB ; [.11EE.0020.0002.0075][.0000.003C.0002.0302] # LATIN SMALL LETTER U WITH CIRCUMFLEX; QQCM
+00DB ; [.11EE.0020.0008.0055][.0000.003C.0002.0302] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX; QQCM
+01D4 ; [.11EE.0020.0002.0075][.0000.0041.0002.030C] # LATIN SMALL LETTER U WITH CARON; QQCM
+01D3 ; [.11EE.0020.0008.0055][.0000.0041.0002.030C] # LATIN CAPITAL LETTER U WITH CARON; QQCM
+016F ; [.11EE.0020.0002.0075][.0000.0043.0002.030A] # LATIN SMALL LETTER U WITH RING ABOVE; QQCM
+016E ; [.11EE.0020.0008.0055][.0000.0043.0002.030A] # LATIN CAPITAL LETTER U WITH RING ABOVE; QQCM
+00FC ; [.11EE.0020.0002.0075][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH DIAERESIS; QQCM
+00DC ; [.11EE.0020.0008.0055][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH DIAERESIS; QQCM
+01D8 ; [.11EE.0020.0002.0075][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE; QQCM
+01D7 ; [.11EE.0020.0008.0055][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE; QQCM
+01DC ; [.11EE.0020.0002.0075][.0000.0047.0002.0308][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE; QQCM
+01DB ; [.11EE.0020.0008.0055][.0000.0047.0002.0308][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE; QQCM
+01DA ; [.11EE.0020.0002.0075][.0000.0047.0002.0308][.0000.0041.0002.030C] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON; QQCM
+01D9 ; [.11EE.0020.0008.0055][.0000.0047.0002.0308][.0000.0041.0002.030C] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON; QQCM
+01D6 ; [.11EE.0020.0002.0075][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON; QQCM
+01D5 ; [.11EE.0020.0008.0055][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON; QQCM
+0171 ; [.11EE.0020.0002.0075][.0000.004D.0002.030B] # LATIN SMALL LETTER U WITH DOUBLE ACUTE; QQCM
+0170 ; [.11EE.0020.0008.0055][.0000.004D.0002.030B] # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE; QQCM
+0169 ; [.11EE.0020.0002.0075][.0000.004E.0002.0303] # LATIN SMALL LETTER U WITH TILDE; QQCM
+0168 ; [.11EE.0020.0008.0055][.0000.004E.0002.0303] # LATIN CAPITAL LETTER U WITH TILDE; QQCM
+1E79 ; [.11EE.0020.0002.0075][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH TILDE AND ACUTE; QQCM
+1E78 ; [.11EE.0020.0008.0055][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE; QQCM
+0173 ; [.11EE.0020.0002.0075][.0000.0059.0002.0328] # LATIN SMALL LETTER U WITH OGONEK; QQCM
+0172 ; [.11EE.0020.0008.0055][.0000.0059.0002.0328] # LATIN CAPITAL LETTER U WITH OGONEK; QQCM
+016B ; [.11EE.0020.0002.0075][.0000.005B.0002.0304] # LATIN SMALL LETTER U WITH MACRON; QQCM
+016A ; [.11EE.0020.0008.0055][.0000.005B.0002.0304] # LATIN CAPITAL LETTER U WITH MACRON; QQCM
+1E7B ; [.11EE.0020.0002.0075][.0000.005B.0002.0304][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS; QQCM
+1E7A ; [.11EE.0020.0008.0055][.0000.005B.0002.0304][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS; QQCM
+1EE7 ; [.11EE.0020.0002.0075][.0000.0060.0002.0309] # LATIN SMALL LETTER U WITH HOOK ABOVE; QQCM
+1EE6 ; [.11EE.0020.0008.0055][.0000.0060.0002.0309] # LATIN CAPITAL LETTER U WITH HOOK ABOVE; QQCM
+0215 ; [.11EE.0020.0002.0075][.0000.0063.0002.030F] # LATIN SMALL LETTER U WITH DOUBLE GRAVE; QQCM
+0214 ; [.11EE.0020.0008.0055][.0000.0063.0002.030F] # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE; QQCM
+0217 ; [.11EE.0020.0002.0075][.0000.0065.0002.0311] # LATIN SMALL LETTER U WITH INVERTED BREVE; QQCM
+0216 ; [.11EE.0020.0008.0055][.0000.0065.0002.0311] # LATIN CAPITAL LETTER U WITH INVERTED BREVE; QQCM
+01B0 ; [.11EE.0020.0002.0075][.0000.006D.0002.031B] # LATIN SMALL LETTER U WITH HORN; QQCM
+01AF ; [.11EE.0020.0008.0055][.0000.006D.0002.031B] # LATIN CAPITAL LETTER U WITH HORN; QQCM
+1EE9 ; [.11EE.0020.0002.0075][.0000.006D.0002.031B][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH HORN AND ACUTE; QQCM
+1EE8 ; [.11EE.0020.0008.0055][.0000.006D.0002.031B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH HORN AND ACUTE; QQCM
+1EEB ; [.11EE.0020.0002.0075][.0000.006D.0002.031B][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH HORN AND GRAVE; QQCM
+1EEA ; [.11EE.0020.0008.0055][.0000.006D.0002.031B][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH HORN AND GRAVE; QQCM
+1EEF ; [.11EE.0020.0002.0075][.0000.006D.0002.031B][.0000.004E.0002.0303] # LATIN SMALL LETTER U WITH HORN AND TILDE; QQCM
+1EEE ; [.11EE.0020.0008.0055][.0000.006D.0002.031B][.0000.004E.0002.0303] # LATIN CAPITAL LETTER U WITH HORN AND TILDE; QQCM
+1EED ; [.11EE.0020.0002.0075][.0000.006D.0002.031B][.0000.0060.0002.0309] # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE; QQCM
+1EEC ; [.11EE.0020.0008.0055][.0000.006D.0002.031B][.0000.0060.0002.0309] # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE; QQCM
+1EF1 ; [.11EE.0020.0002.0075][.0000.006D.0002.031B][.0000.007A.0002.0323] # LATIN SMALL LETTER U WITH HORN AND DOT BELOW; QQCM
+1EF0 ; [.11EE.0020.0008.0055][.0000.006D.0002.031B][.0000.007A.0002.0323] # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW; QQCM
+1EE5 ; [.11EE.0020.0002.0075][.0000.007A.0002.0323] # LATIN SMALL LETTER U WITH DOT BELOW; QQCM
+1EE4 ; [.11EE.0020.0008.0055][.0000.007A.0002.0323] # LATIN CAPITAL LETTER U WITH DOT BELOW; QQCM
+1E73 ; [.11EE.0020.0002.0075][.0000.007F.0002.0324] # LATIN SMALL LETTER U WITH DIAERESIS BELOW; QQCM
+1E72 ; [.11EE.0020.0008.0055][.0000.007F.0002.0324] # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW; QQCM
+1E77 ; [.11EE.0020.0002.0075][.0000.0086.0002.032D] # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW; QQCM
+1E76 ; [.11EE.0020.0008.0055][.0000.0086.0002.032D] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW; QQCM
+1E75 ; [.11EE.0020.0002.0075][.0000.0089.0002.0330] # LATIN SMALL LETTER U WITH TILDE BELOW; QQCM
+1E74 ; [.11EE.0020.0008.0055][.0000.0089.0002.0330] # LATIN CAPITAL LETTER U WITH TILDE BELOW; QQCM
+1D1C ; [.11F2.0020.0002.1D1C] # LATIN LETTER SMALL CAPITAL U
+1DB8 ; [.11F2.0020.0014.1DB8] # MODIFIER LETTER SMALL CAPITAL U; QQK
+1D1D ; [.11F3.0020.0002.1D1D] # LATIN SMALL LETTER SIDEWAYS U
+1D59 ; [.11F3.0020.0014.1D59] # MODIFIER LETTER SMALL SIDEWAYS U; QQK
+1D1E ; [.11F4.0020.0002.1D1E] # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D6B ; [.11F5.0020.0002.1D6B] # LATIN SMALL LETTER UE
+0289 ; [.11F6.0020.0002.0289] # LATIN SMALL LETTER U BAR
+0244 ; [.11F6.0020.0008.0244] # LATIN CAPITAL LETTER U BAR
+1DB6 ; [.11F6.0020.0014.1DB6] # MODIFIER LETTER SMALL U BAR; QQK
+1D7E ; [.11FA.0020.0002.1D7E] # LATIN SMALL CAPITAL LETTER U WITH STROKE
+1D99 ; [.11FB.0020.0002.1D99] # LATIN SMALL LETTER U WITH RETROFLEX HOOK
+0265 ; [.11FC.0020.0002.0265] # LATIN SMALL LETTER TURNED H
+1DA3 ; [.11FC.0020.0014.1DA3] # MODIFIER LETTER SMALL TURNED H; QQK
+02AE ; [.1200.0020.0002.02AE] # LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF ; [.1204.0020.0002.02AF] # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+026F ; [.1208.0020.0002.026F] # LATIN SMALL LETTER TURNED M
+019C ; [.1208.0020.0008.019C] # LATIN CAPITAL LETTER TURNED M
+1D5A ; [.1208.0020.0014.1D5A] # MODIFIER LETTER SMALL TURNED M; QQK
+1D1F ; [.120C.0020.0002.1D1F] # LATIN SMALL LETTER SIDEWAYS TURNED M
+0270 ; [.120D.0020.0002.0270] # LATIN SMALL LETTER TURNED M WITH LONG LEG
+1DAD ; [.120D.0020.0014.1DAD] # MODIFIER LETTER SMALL TURNED M WITH LONG LEG; QQK
+028A ; [.1211.0020.0002.028A] # LATIN SMALL LETTER UPSILON
+01B1 ; [.1211.0020.0008.01B1] # LATIN CAPITAL LETTER UPSILON
+1DB7 ; [.1211.0020.0014.1DB7] # MODIFIER LETTER SMALL UPSILON; QQK
+1D7F ; [.1215.0020.0002.1D7F] # LATIN SMALL LETTER UPSILON WITH STROKE
+0076 ; [.1216.0020.0002.0076] # LATIN SMALL LETTER V
+FF56 ; [.1216.0020.0003.FF56] # FULLWIDTH LATIN SMALL LETTER V; QQK
+036E ; [.1216.0020.0004.036E] # COMBINING LATIN SMALL LETTER V; QQK
+2174 ; [.1216.0020.0004.2174] # SMALL ROMAN NUMERAL FIVE; QQK
+24B1 ; [*02B1.0020.0004.24B1][.1216.0020.0004.24B1][*02B2.0020.001F.24B1] # PARENTHESIZED LATIN SMALL LETTER V; QQKN
+1D42F ; [.1216.0020.0005.1D42F] # MATHEMATICAL BOLD SMALL V; QQK
+1D463 ; [.1216.0020.0005.1D463] # MATHEMATICAL ITALIC SMALL V; QQK
+1D497 ; [.1216.0020.0005.1D497] # MATHEMATICAL BOLD ITALIC SMALL V; QQK
+1D4CB ; [.1216.0020.0005.1D4CB] # MATHEMATICAL SCRIPT SMALL V; QQK
+1D4FF ; [.1216.0020.0005.1D4FF] # MATHEMATICAL BOLD SCRIPT SMALL V; QQK
+1D533 ; [.1216.0020.0005.1D533] # MATHEMATICAL FRAKTUR SMALL V; QQK
+1D567 ; [.1216.0020.0005.1D567] # MATHEMATICAL DOUBLE-STRUCK SMALL V; QQK
+1D59B ; [.1216.0020.0005.1D59B] # MATHEMATICAL BOLD FRAKTUR SMALL V; QQK
+1D5CF ; [.1216.0020.0005.1D5CF] # MATHEMATICAL SANS-SERIF SMALL V; QQK
+1D603 ; [.1216.0020.0005.1D603] # MATHEMATICAL SANS-SERIF BOLD SMALL V; QQK
+1D637 ; [.1216.0020.0005.1D637] # MATHEMATICAL SANS-SERIF ITALIC SMALL V; QQK
+1D66B ; [.1216.0020.0005.1D66B] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V; QQK
+1D69F ; [.1216.0020.0005.1D69F] # MATHEMATICAL MONOSPACE SMALL V; QQK
+24E5 ; [.1216.0020.0006.24E5] # CIRCLED LATIN SMALL LETTER V; QQK
+0056 ; [.1216.0020.0008.0056] # LATIN CAPITAL LETTER V
+FF36 ; [.1216.0020.0009.FF36] # FULLWIDTH LATIN CAPITAL LETTER V; QQK
+2164 ; [.1216.0020.000A.2164] # ROMAN NUMERAL FIVE; QQK
+1D415 ; [.1216.0020.000B.1D415] # MATHEMATICAL BOLD CAPITAL V; QQK
+1D449 ; [.1216.0020.000B.1D449] # MATHEMATICAL ITALIC CAPITAL V; QQK
+1D47D ; [.1216.0020.000B.1D47D] # MATHEMATICAL BOLD ITALIC CAPITAL V; QQK
+1D4B1 ; [.1216.0020.000B.1D4B1] # MATHEMATICAL SCRIPT CAPITAL V; QQK
+1D4E5 ; [.1216.0020.000B.1D4E5] # MATHEMATICAL BOLD SCRIPT CAPITAL V; QQK
+1D519 ; [.1216.0020.000B.1D519] # MATHEMATICAL FRAKTUR CAPITAL V; QQK
+1D54D ; [.1216.0020.000B.1D54D] # MATHEMATICAL DOUBLE-STRUCK CAPITAL V; QQK
+1D581 ; [.1216.0020.000B.1D581] # MATHEMATICAL BOLD FRAKTUR CAPITAL V; QQK
+1D5B5 ; [.1216.0020.000B.1D5B5] # MATHEMATICAL SANS-SERIF CAPITAL V; QQK
+1D5E9 ; [.1216.0020.000B.1D5E9] # MATHEMATICAL SANS-SERIF BOLD CAPITAL V; QQK
+1D61D ; [.1216.0020.000B.1D61D] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V; QQK
+1D651 ; [.1216.0020.000B.1D651] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V; QQK
+1D685 ; [.1216.0020.000B.1D685] # MATHEMATICAL MONOSPACE CAPITAL V; QQK
+24CB ; [.1216.0020.000C.24CB] # CIRCLED LATIN CAPITAL LETTER V; QQK
+1D5B ; [.1216.0020.0014.1D5B] # MODIFIER LETTER SMALL V; QQK
+1D65 ; [.1216.0020.0015.1D65] # LATIN SUBSCRIPT SMALL LETTER V; QQK
+1E7D ; [.1216.0020.0002.0076][.0000.004E.0002.0303] # LATIN SMALL LETTER V WITH TILDE; QQCM
+1E7C ; [.1216.0020.0008.0056][.0000.004E.0002.0303] # LATIN CAPITAL LETTER V WITH TILDE; QQCM
+1E7F ; [.1216.0020.0002.0076][.0000.007A.0002.0323] # LATIN SMALL LETTER V WITH DOT BELOW; QQCM
+1E7E ; [.1216.0020.0008.0056][.0000.007A.0002.0323] # LATIN CAPITAL LETTER V WITH DOT BELOW; QQCM
+2175 ; [.1216.0020.0004.2175][.10A5.0020.0004.2175] # SMALL ROMAN NUMERAL SIX; QQKN
+2165 ; [.1216.0020.000A.2165][.10A5.0020.000A.2165] # ROMAN NUMERAL SIX; QQKN
+2176 ; [.1216.0020.0004.2176][.10A5.0020.0004.2176][.10A5.0020.001F.2176] # SMALL ROMAN NUMERAL SEVEN; QQKN
+2166 ; [.1216.0020.000A.2166][.10A5.0020.000A.2166][.10A5.0020.001F.2166] # ROMAN NUMERAL SEVEN; QQKN
+2177 ; [.1216.0020.0004.2177][.10A5.0020.0004.2177][.10A5.0020.001F.2177][.10A5.0020.001F.2177] # SMALL ROMAN NUMERAL EIGHT; QQKN
+2167 ; [.1216.0020.000A.2167][.10A5.0020.000A.2167][.10A5.0020.001F.2167][.10A5.0020.001F.2167] # ROMAN NUMERAL EIGHT; QQKN
+33DE ; [.1216.0020.001D.33DE][*04C7.0020.001C.33DE][.1110.0020.001F.33DE] # SQUARE V OVER M; QQKN
+1D20 ; [.121A.0020.0002.1D20] # LATIN LETTER SMALL CAPITAL V
+1D8C ; [.121B.0020.0002.1D8C] # LATIN SMALL LETTER V WITH PALATAL HOOK
+028B ; [.121C.0020.0002.028B] # LATIN SMALL LETTER V WITH HOOK
+01B2 ; [.121C.0020.0008.01B2] # LATIN CAPITAL LETTER V WITH HOOK
+1DB9 ; [.121C.0020.0014.1DB9] # MODIFIER LETTER SMALL V WITH HOOK; QQK
+2C74 ; [.1220.0020.0002.2C74] # LATIN SMALL LETTER V WITH CURL
+028C ; [.1221.0020.0002.028C] # LATIN SMALL LETTER TURNED V
+0245 ; [.1221.0020.0008.0245] # LATIN CAPITAL LETTER TURNED V
+1DBA ; [.1221.0020.0014.1DBA] # MODIFIER LETTER SMALL TURNED V; QQK
+0077 ; [.1225.0020.0002.0077] # LATIN SMALL LETTER W
+FF57 ; [.1225.0020.0003.FF57] # FULLWIDTH LATIN SMALL LETTER W; QQK
+24B2 ; [*02B1.0020.0004.24B2][.1225.0020.0004.24B2][*02B2.0020.001F.24B2] # PARENTHESIZED LATIN SMALL LETTER W; QQKN
+1D430 ; [.1225.0020.0005.1D430] # MATHEMATICAL BOLD SMALL W; QQK
+1D464 ; [.1225.0020.0005.1D464] # MATHEMATICAL ITALIC SMALL W; QQK
+1D498 ; [.1225.0020.0005.1D498] # MATHEMATICAL BOLD ITALIC SMALL W; QQK
+1D4CC ; [.1225.0020.0005.1D4CC] # MATHEMATICAL SCRIPT SMALL W; QQK
+1D500 ; [.1225.0020.0005.1D500] # MATHEMATICAL BOLD SCRIPT SMALL W; QQK
+1D534 ; [.1225.0020.0005.1D534] # MATHEMATICAL FRAKTUR SMALL W; QQK
+1D568 ; [.1225.0020.0005.1D568] # MATHEMATICAL DOUBLE-STRUCK SMALL W; QQK
+1D59C ; [.1225.0020.0005.1D59C] # MATHEMATICAL BOLD FRAKTUR SMALL W; QQK
+1D5D0 ; [.1225.0020.0005.1D5D0] # MATHEMATICAL SANS-SERIF SMALL W; QQK
+1D604 ; [.1225.0020.0005.1D604] # MATHEMATICAL SANS-SERIF BOLD SMALL W; QQK
+1D638 ; [.1225.0020.0005.1D638] # MATHEMATICAL SANS-SERIF ITALIC SMALL W; QQK
+1D66C ; [.1225.0020.0005.1D66C] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W; QQK
+1D6A0 ; [.1225.0020.0005.1D6A0] # MATHEMATICAL MONOSPACE SMALL W; QQK
+24E6 ; [.1225.0020.0006.24E6] # CIRCLED LATIN SMALL LETTER W; QQK
+0057 ; [.1225.0020.0008.0057] # LATIN CAPITAL LETTER W
+FF37 ; [.1225.0020.0009.FF37] # FULLWIDTH LATIN CAPITAL LETTER W; QQK
+1D416 ; [.1225.0020.000B.1D416] # MATHEMATICAL BOLD CAPITAL W; QQK
+1D44A ; [.1225.0020.000B.1D44A] # MATHEMATICAL ITALIC CAPITAL W; QQK
+1D47E ; [.1225.0020.000B.1D47E] # MATHEMATICAL BOLD ITALIC CAPITAL W; QQK
+1D4B2 ; [.1225.0020.000B.1D4B2] # MATHEMATICAL SCRIPT CAPITAL W; QQK
+1D4E6 ; [.1225.0020.000B.1D4E6] # MATHEMATICAL BOLD SCRIPT CAPITAL W; QQK
+1D51A ; [.1225.0020.000B.1D51A] # MATHEMATICAL FRAKTUR CAPITAL W; QQK
+1D54E ; [.1225.0020.000B.1D54E] # MATHEMATICAL DOUBLE-STRUCK CAPITAL W; QQK
+1D582 ; [.1225.0020.000B.1D582] # MATHEMATICAL BOLD FRAKTUR CAPITAL W; QQK
+1D5B6 ; [.1225.0020.000B.1D5B6] # MATHEMATICAL SANS-SERIF CAPITAL W; QQK
+1D5EA ; [.1225.0020.000B.1D5EA] # MATHEMATICAL SANS-SERIF BOLD CAPITAL W; QQK
+1D61E ; [.1225.0020.000B.1D61E] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W; QQK
+1D652 ; [.1225.0020.000B.1D652] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W; QQK
+1D686 ; [.1225.0020.000B.1D686] # MATHEMATICAL MONOSPACE CAPITAL W; QQK
+24CC ; [.1225.0020.000C.24CC] # CIRCLED LATIN CAPITAL LETTER W; QQK
+02B7 ; [.1225.0020.0014.02B7] # MODIFIER LETTER SMALL W; QQK
+1D42 ; [.1225.0020.001D.1D42] # MODIFIER LETTER CAPITAL W; QQK
+1E83 ; [.1225.0020.0002.0077][.0000.0032.0002.0301] # LATIN SMALL LETTER W WITH ACUTE; QQCM
+1E82 ; [.1225.0020.0008.0057][.0000.0032.0002.0301] # LATIN CAPITAL LETTER W WITH ACUTE; QQCM
+1E81 ; [.1225.0020.0002.0077][.0000.0035.0002.0300] # LATIN SMALL LETTER W WITH GRAVE; QQCM
+1E80 ; [.1225.0020.0008.0057][.0000.0035.0002.0300] # LATIN CAPITAL LETTER W WITH GRAVE; QQCM
+0175 ; [.1225.0020.0002.0077][.0000.003C.0002.0302] # LATIN SMALL LETTER W WITH CIRCUMFLEX; QQCM
+0174 ; [.1225.0020.0008.0057][.0000.003C.0002.0302] # LATIN CAPITAL LETTER W WITH CIRCUMFLEX; QQCM
+1E98 ; [.1225.0020.0002.0077][.0000.0043.0002.030A] # LATIN SMALL LETTER W WITH RING ABOVE; QQCM
+1E85 ; [.1225.0020.0002.0077][.0000.0047.0002.0308] # LATIN SMALL LETTER W WITH DIAERESIS; QQCM
+1E84 ; [.1225.0020.0008.0057][.0000.0047.0002.0308] # LATIN CAPITAL LETTER W WITH DIAERESIS; QQCM
+1E87 ; [.1225.0020.0002.0077][.0000.0052.0002.0307] # LATIN SMALL LETTER W WITH DOT ABOVE; QQCM
+1E86 ; [.1225.0020.0008.0057][.0000.0052.0002.0307] # LATIN CAPITAL LETTER W WITH DOT ABOVE; QQCM
+1E89 ; [.1225.0020.0002.0077][.0000.007A.0002.0323] # LATIN SMALL LETTER W WITH DOT BELOW; QQCM
+1E88 ; [.1225.0020.0008.0057][.0000.007A.0002.0323] # LATIN CAPITAL LETTER W WITH DOT BELOW; QQCM
+33DD ; [.1225.0020.001D.33DD][.0FE6.0020.001C.33DD] # SQUARE WB; QQKN
+1D21 ; [.1229.0020.0002.1D21] # LATIN LETTER SMALL CAPITAL W
+028D ; [.122A.0020.0002.028D] # LATIN SMALL LETTER TURNED W
+0078 ; [.122E.0020.0002.0078] # LATIN SMALL LETTER X
+FF58 ; [.122E.0020.0003.FF58] # FULLWIDTH LATIN SMALL LETTER X; QQK
+036F ; [.122E.0020.0004.036F] # COMBINING LATIN SMALL LETTER X; QQK
+2179 ; [.122E.0020.0004.2179] # SMALL ROMAN NUMERAL TEN; QQK
+24B3 ; [*02B1.0020.0004.24B3][.122E.0020.0004.24B3][*02B2.0020.001F.24B3] # PARENTHESIZED LATIN SMALL LETTER X; QQKN
+1D431 ; [.122E.0020.0005.1D431] # MATHEMATICAL BOLD SMALL X; QQK
+1D465 ; [.122E.0020.0005.1D465] # MATHEMATICAL ITALIC SMALL X; QQK
+1D499 ; [.122E.0020.0005.1D499] # MATHEMATICAL BOLD ITALIC SMALL X; QQK
+1D4CD ; [.122E.0020.0005.1D4CD] # MATHEMATICAL SCRIPT SMALL X; QQK
+1D501 ; [.122E.0020.0005.1D501] # MATHEMATICAL BOLD SCRIPT SMALL X; QQK
+1D535 ; [.122E.0020.0005.1D535] # MATHEMATICAL FRAKTUR SMALL X; QQK
+1D569 ; [.122E.0020.0005.1D569] # MATHEMATICAL DOUBLE-STRUCK SMALL X; QQK
+1D59D ; [.122E.0020.0005.1D59D] # MATHEMATICAL BOLD FRAKTUR SMALL X; QQK
+1D5D1 ; [.122E.0020.0005.1D5D1] # MATHEMATICAL SANS-SERIF SMALL X; QQK
+1D605 ; [.122E.0020.0005.1D605] # MATHEMATICAL SANS-SERIF BOLD SMALL X; QQK
+1D639 ; [.122E.0020.0005.1D639] # MATHEMATICAL SANS-SERIF ITALIC SMALL X; QQK
+1D66D ; [.122E.0020.0005.1D66D] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X; QQK
+1D6A1 ; [.122E.0020.0005.1D6A1] # MATHEMATICAL MONOSPACE SMALL X; QQK
+24E7 ; [.122E.0020.0006.24E7] # CIRCLED LATIN SMALL LETTER X; QQK
+0058 ; [.122E.0020.0008.0058] # LATIN CAPITAL LETTER X
+FF38 ; [.122E.0020.0009.FF38] # FULLWIDTH LATIN CAPITAL LETTER X; QQK
+2169 ; [.122E.0020.000A.2169] # ROMAN NUMERAL TEN; QQK
+1D417 ; [.122E.0020.000B.1D417] # MATHEMATICAL BOLD CAPITAL X; QQK
+1D44B ; [.122E.0020.000B.1D44B] # MATHEMATICAL ITALIC CAPITAL X; QQK
+1D47F ; [.122E.0020.000B.1D47F] # MATHEMATICAL BOLD ITALIC CAPITAL X; QQK
+1D4B3 ; [.122E.0020.000B.1D4B3] # MATHEMATICAL SCRIPT CAPITAL X; QQK
+1D4E7 ; [.122E.0020.000B.1D4E7] # MATHEMATICAL BOLD SCRIPT CAPITAL X; QQK
+1D51B ; [.122E.0020.000B.1D51B] # MATHEMATICAL FRAKTUR CAPITAL X; QQK
+1D54F ; [.122E.0020.000B.1D54F] # MATHEMATICAL DOUBLE-STRUCK CAPITAL X; QQK
+1D583 ; [.122E.0020.000B.1D583] # MATHEMATICAL BOLD FRAKTUR CAPITAL X; QQK
+1D5B7 ; [.122E.0020.000B.1D5B7] # MATHEMATICAL SANS-SERIF CAPITAL X; QQK
+1D5EB ; [.122E.0020.000B.1D5EB] # MATHEMATICAL SANS-SERIF BOLD CAPITAL X; QQK
+1D61F ; [.122E.0020.000B.1D61F] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X; QQK
+1D653 ; [.122E.0020.000B.1D653] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X; QQK
+1D687 ; [.122E.0020.000B.1D687] # MATHEMATICAL MONOSPACE CAPITAL X; QQK
+24CD ; [.122E.0020.000C.24CD] # CIRCLED LATIN CAPITAL LETTER X; QQK
+02E3 ; [.122E.0020.0014.02E3] # MODIFIER LETTER SMALL X; QQK
+2093 ; [.122E.0020.0015.2093] # LATIN SUBSCRIPT SMALL LETTER X; QQK
+1E8D ; [.122E.0020.0002.0078][.0000.0047.0002.0308] # LATIN SMALL LETTER X WITH DIAERESIS; QQCM
+1E8C ; [.122E.0020.0008.0058][.0000.0047.0002.0308] # LATIN CAPITAL LETTER X WITH DIAERESIS; QQCM
+1E8B ; [.122E.0020.0002.0078][.0000.0052.0002.0307] # LATIN SMALL LETTER X WITH DOT ABOVE; QQCM
+1E8A ; [.122E.0020.0008.0058][.0000.0052.0002.0307] # LATIN CAPITAL LETTER X WITH DOT ABOVE; QQCM
+217A ; [.122E.0020.0004.217A][.10A5.0020.0004.217A] # SMALL ROMAN NUMERAL ELEVEN; QQKN
+216A ; [.122E.0020.000A.216A][.10A5.0020.000A.216A] # ROMAN NUMERAL ELEVEN; QQKN
+217B ; [.122E.0020.0004.217B][.10A5.0020.0004.217B][.10A5.0020.001F.217B] # SMALL ROMAN NUMERAL TWELVE; QQKN
+216B ; [.122E.0020.000A.216B][.10A5.0020.000A.216B][.10A5.0020.001F.216B] # ROMAN NUMERAL TWELVE; QQKN
+1D8D ; [.1232.0020.0002.1D8D] # LATIN SMALL LETTER X WITH PALATAL HOOK
+0079 ; [.1233.0020.0002.0079] # LATIN SMALL LETTER Y
+FF59 ; [.1233.0020.0003.FF59] # FULLWIDTH LATIN SMALL LETTER Y; QQK
+24B4 ; [*02B1.0020.0004.24B4][.1233.0020.0004.24B4][*02B2.0020.001F.24B4] # PARENTHESIZED LATIN SMALL LETTER Y; QQKN
+1D432 ; [.1233.0020.0005.1D432] # MATHEMATICAL BOLD SMALL Y; QQK
+1D466 ; [.1233.0020.0005.1D466] # MATHEMATICAL ITALIC SMALL Y; QQK
+1D49A ; [.1233.0020.0005.1D49A] # MATHEMATICAL BOLD ITALIC SMALL Y; QQK
+1D4CE ; [.1233.0020.0005.1D4CE] # MATHEMATICAL SCRIPT SMALL Y; QQK
+1D502 ; [.1233.0020.0005.1D502] # MATHEMATICAL BOLD SCRIPT SMALL Y; QQK
+1D536 ; [.1233.0020.0005.1D536] # MATHEMATICAL FRAKTUR SMALL Y; QQK
+1D56A ; [.1233.0020.0005.1D56A] # MATHEMATICAL DOUBLE-STRUCK SMALL Y; QQK
+1D59E ; [.1233.0020.0005.1D59E] # MATHEMATICAL BOLD FRAKTUR SMALL Y; QQK
+1D5D2 ; [.1233.0020.0005.1D5D2] # MATHEMATICAL SANS-SERIF SMALL Y; QQK
+1D606 ; [.1233.0020.0005.1D606] # MATHEMATICAL SANS-SERIF BOLD SMALL Y; QQK
+1D63A ; [.1233.0020.0005.1D63A] # MATHEMATICAL SANS-SERIF ITALIC SMALL Y; QQK
+1D66E ; [.1233.0020.0005.1D66E] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y; QQK
+1D6A2 ; [.1233.0020.0005.1D6A2] # MATHEMATICAL MONOSPACE SMALL Y; QQK
+24E8 ; [.1233.0020.0006.24E8] # CIRCLED LATIN SMALL LETTER Y; QQK
+0059 ; [.1233.0020.0008.0059] # LATIN CAPITAL LETTER Y
+FF39 ; [.1233.0020.0009.FF39] # FULLWIDTH LATIN CAPITAL LETTER Y; QQK
+1D418 ; [.1233.0020.000B.1D418] # MATHEMATICAL BOLD CAPITAL Y; QQK
+1D44C ; [.1233.0020.000B.1D44C] # MATHEMATICAL ITALIC CAPITAL Y; QQK
+1D480 ; [.1233.0020.000B.1D480] # MATHEMATICAL BOLD ITALIC CAPITAL Y; QQK
+1D4B4 ; [.1233.0020.000B.1D4B4] # MATHEMATICAL SCRIPT CAPITAL Y; QQK
+1D4E8 ; [.1233.0020.000B.1D4E8] # MATHEMATICAL BOLD SCRIPT CAPITAL Y; QQK
+1D51C ; [.1233.0020.000B.1D51C] # MATHEMATICAL FRAKTUR CAPITAL Y; QQK
+1D550 ; [.1233.0020.000B.1D550] # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y; QQK
+1D584 ; [.1233.0020.000B.1D584] # MATHEMATICAL BOLD FRAKTUR CAPITAL Y; QQK
+1D5B8 ; [.1233.0020.000B.1D5B8] # MATHEMATICAL SANS-SERIF CAPITAL Y; QQK
+1D5EC ; [.1233.0020.000B.1D5EC] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y; QQK
+1D620 ; [.1233.0020.000B.1D620] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y; QQK
+1D654 ; [.1233.0020.000B.1D654] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y; QQK
+1D688 ; [.1233.0020.000B.1D688] # MATHEMATICAL MONOSPACE CAPITAL Y; QQK
+24CE ; [.1233.0020.000C.24CE] # CIRCLED LATIN CAPITAL LETTER Y; QQK
+02B8 ; [.1233.0020.0014.02B8] # MODIFIER LETTER SMALL Y; QQK
+00FD ; [.1233.0020.0002.0079][.0000.0032.0002.0301] # LATIN SMALL LETTER Y WITH ACUTE; QQCM
+00DD ; [.1233.0020.0008.0059][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Y WITH ACUTE; QQCM
+1EF3 ; [.1233.0020.0002.0079][.0000.0035.0002.0300] # LATIN SMALL LETTER Y WITH GRAVE; QQCM
+1EF2 ; [.1233.0020.0008.0059][.0000.0035.0002.0300] # LATIN CAPITAL LETTER Y WITH GRAVE; QQCM
+0177 ; [.1233.0020.0002.0079][.0000.003C.0002.0302] # LATIN SMALL LETTER Y WITH CIRCUMFLEX; QQCM
+0176 ; [.1233.0020.0008.0059][.0000.003C.0002.0302] # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX; QQCM
+1E99 ; [.1233.0020.0002.0079][.0000.0043.0002.030A] # LATIN SMALL LETTER Y WITH RING ABOVE; QQCM
+00FF ; [.1233.0020.0002.0079][.0000.0047.0002.0308] # LATIN SMALL LETTER Y WITH DIAERESIS; QQCM
+0178 ; [.1233.0020.0008.0059][.0000.0047.0002.0308] # LATIN CAPITAL LETTER Y WITH DIAERESIS; QQCM
+1EF9 ; [.1233.0020.0002.0079][.0000.004E.0002.0303] # LATIN SMALL LETTER Y WITH TILDE; QQCM
+1EF8 ; [.1233.0020.0008.0059][.0000.004E.0002.0303] # LATIN CAPITAL LETTER Y WITH TILDE; QQCM
+1E8F ; [.1233.0020.0002.0079][.0000.0052.0002.0307] # LATIN SMALL LETTER Y WITH DOT ABOVE; QQCM
+1E8E ; [.1233.0020.0008.0059][.0000.0052.0002.0307] # LATIN CAPITAL LETTER Y WITH DOT ABOVE; QQCM
+0233 ; [.1233.0020.0002.0079][.0000.005B.0002.0304] # LATIN SMALL LETTER Y WITH MACRON; QQCM
+0232 ; [.1233.0020.0008.0059][.0000.005B.0002.0304] # LATIN CAPITAL LETTER Y WITH MACRON; QQCM
+1EF7 ; [.1233.0020.0002.0079][.0000.0060.0002.0309] # LATIN SMALL LETTER Y WITH HOOK ABOVE; QQCM
+1EF6 ; [.1233.0020.0008.0059][.0000.0060.0002.0309] # LATIN CAPITAL LETTER Y WITH HOOK ABOVE; QQCM
+1EF5 ; [.1233.0020.0002.0079][.0000.007A.0002.0323] # LATIN SMALL LETTER Y WITH DOT BELOW; QQCM
+1EF4 ; [.1233.0020.0008.0059][.0000.007A.0002.0323] # LATIN CAPITAL LETTER Y WITH DOT BELOW; QQCM
+028F ; [.1237.0020.0002.028F] # LATIN LETTER SMALL CAPITAL Y
+024F ; [.123B.0020.0002.024F] # LATIN SMALL LETTER Y WITH STROKE
+024E ; [.123B.0020.0008.024E] # LATIN CAPITAL LETTER Y WITH STROKE
+01B4 ; [.123F.0020.0002.01B4] # LATIN SMALL LETTER Y WITH HOOK
+01B3 ; [.123F.0020.0008.01B3] # LATIN CAPITAL LETTER Y WITH HOOK
+007A ; [.1243.0020.0002.007A] # LATIN SMALL LETTER Z
+FF5A ; [.1243.0020.0003.FF5A] # FULLWIDTH LATIN SMALL LETTER Z; QQK
+24B5 ; [*02B1.0020.0004.24B5][.1243.0020.0004.24B5][*02B2.0020.001F.24B5] # PARENTHESIZED LATIN SMALL LETTER Z; QQKN
+1D433 ; [.1243.0020.0005.1D433] # MATHEMATICAL BOLD SMALL Z; QQK
+1D467 ; [.1243.0020.0005.1D467] # MATHEMATICAL ITALIC SMALL Z; QQK
+1D49B ; [.1243.0020.0005.1D49B] # MATHEMATICAL BOLD ITALIC SMALL Z; QQK
+1D4CF ; [.1243.0020.0005.1D4CF] # MATHEMATICAL SCRIPT SMALL Z; QQK
+1D503 ; [.1243.0020.0005.1D503] # MATHEMATICAL BOLD SCRIPT SMALL Z; QQK
+1D537 ; [.1243.0020.0005.1D537] # MATHEMATICAL FRAKTUR SMALL Z; QQK
+1D56B ; [.1243.0020.0005.1D56B] # MATHEMATICAL DOUBLE-STRUCK SMALL Z; QQK
+1D59F ; [.1243.0020.0005.1D59F] # MATHEMATICAL BOLD FRAKTUR SMALL Z; QQK
+1D5D3 ; [.1243.0020.0005.1D5D3] # MATHEMATICAL SANS-SERIF SMALL Z; QQK
+1D607 ; [.1243.0020.0005.1D607] # MATHEMATICAL SANS-SERIF BOLD SMALL Z; QQK
+1D63B ; [.1243.0020.0005.1D63B] # MATHEMATICAL SANS-SERIF ITALIC SMALL Z; QQK
+1D66F ; [.1243.0020.0005.1D66F] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z; QQK
+1D6A3 ; [.1243.0020.0005.1D6A3] # MATHEMATICAL MONOSPACE SMALL Z; QQK
+24E9 ; [.1243.0020.0006.24E9] # CIRCLED LATIN SMALL LETTER Z; QQK
+005A ; [.1243.0020.0008.005A] # LATIN CAPITAL LETTER Z
+FF3A ; [.1243.0020.0009.FF3A] # FULLWIDTH LATIN CAPITAL LETTER Z; QQK
+2124 ; [.1243.0020.000B.2124] # DOUBLE-STRUCK CAPITAL Z; QQK
+2128 ; [.1243.0020.000B.2128] # BLACK-LETTER CAPITAL Z; QQK
+1D419 ; [.1243.0020.000B.1D419] # MATHEMATICAL BOLD CAPITAL Z; QQK
+1D44D ; [.1243.0020.000B.1D44D] # MATHEMATICAL ITALIC CAPITAL Z; QQK
+1D481 ; [.1243.0020.000B.1D481] # MATHEMATICAL BOLD ITALIC CAPITAL Z; QQK
+1D4B5 ; [.1243.0020.000B.1D4B5] # MATHEMATICAL SCRIPT CAPITAL Z; QQK
+1D4E9 ; [.1243.0020.000B.1D4E9] # MATHEMATICAL BOLD SCRIPT CAPITAL Z; QQK
+1D585 ; [.1243.0020.000B.1D585] # MATHEMATICAL BOLD FRAKTUR CAPITAL Z; QQK
+1D5B9 ; [.1243.0020.000B.1D5B9] # MATHEMATICAL SANS-SERIF CAPITAL Z; QQK
+1D5ED ; [.1243.0020.000B.1D5ED] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z; QQK
+1D621 ; [.1243.0020.000B.1D621] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z; QQK
+1D655 ; [.1243.0020.000B.1D655] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z; QQK
+1D689 ; [.1243.0020.000B.1D689] # MATHEMATICAL MONOSPACE CAPITAL Z; QQK
+24CF ; [.1243.0020.000C.24CF] # CIRCLED LATIN CAPITAL LETTER Z; QQK
+1DBB ; [.1243.0020.0014.1DBB] # MODIFIER LETTER SMALL Z; QQK
+017A ; [.1243.0020.0002.007A][.0000.0032.0002.0301] # LATIN SMALL LETTER Z WITH ACUTE; QQCM
+0179 ; [.1243.0020.0008.005A][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Z WITH ACUTE; QQCM
+1E91 ; [.1243.0020.0002.007A][.0000.003C.0002.0302] # LATIN SMALL LETTER Z WITH CIRCUMFLEX; QQCM
+1E90 ; [.1243.0020.0008.005A][.0000.003C.0002.0302] # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX; QQCM
+017E ; [.1243.0020.0002.007A][.0000.0041.0002.030C] # LATIN SMALL LETTER Z WITH CARON; QQCM
+017D ; [.1243.0020.0008.005A][.0000.0041.0002.030C] # LATIN CAPITAL LETTER Z WITH CARON; QQCM
+017C ; [.1243.0020.0002.007A][.0000.0052.0002.0307] # LATIN SMALL LETTER Z WITH DOT ABOVE; QQCM
+017B ; [.1243.0020.0008.005A][.0000.0052.0002.0307] # LATIN CAPITAL LETTER Z WITH DOT ABOVE; QQCM
+1E93 ; [.1243.0020.0002.007A][.0000.007A.0002.0323] # LATIN SMALL LETTER Z WITH DOT BELOW; QQCM
+1E92 ; [.1243.0020.0008.005A][.0000.007A.0002.0323] # LATIN CAPITAL LETTER Z WITH DOT BELOW; QQCM
+1E95 ; [.1243.0020.0002.007A][.0000.008A.0002.0331] # LATIN SMALL LETTER Z WITH LINE BELOW; QQCM
+1E94 ; [.1243.0020.0008.005A][.0000.008A.0002.0331] # LATIN CAPITAL LETTER Z WITH LINE BELOW; QQCM
+018D ; [.1243.0020.0004.018D][.1225.0020.0004.018D] # LATIN SMALL LETTER TURNED DELTA; QQKN
+1D22 ; [.1247.0020.0002.1D22] # LATIN LETTER SMALL CAPITAL Z
+01B6 ; [.1248.0020.0002.01B6] # LATIN SMALL LETTER Z WITH STROKE
+01B5 ; [.1248.0020.0008.01B5] # LATIN CAPITAL LETTER Z WITH STROKE
+1D76 ; [.124C.0020.0002.1D76] # LATIN SMALL LETTER Z WITH MIDDLE TILDE
+1D8E ; [.124D.0020.0002.1D8E] # LATIN SMALL LETTER Z WITH PALATAL HOOK
+0225 ; [.124E.0020.0002.0225] # LATIN SMALL LETTER Z WITH HOOK
+0224 ; [.124E.0020.0008.0224] # LATIN CAPITAL LETTER Z WITH HOOK
+0290 ; [.1252.0020.0002.0290] # LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+1DBC ; [.1252.0020.0014.1DBC] # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK; QQK
+0291 ; [.1256.0020.0002.0291] # LATIN SMALL LETTER Z WITH CURL
+1DBD ; [.1256.0020.0014.1DBD] # MODIFIER LETTER SMALL Z WITH CURL; QQK
+0240 ; [.125A.0020.0002.0240] # LATIN SMALL LETTER Z WITH SWASH TAIL
+2C6C ; [.125E.0020.0002.2C6C] # LATIN SMALL LETTER Z WITH DESCENDER
+2C6B ; [.125E.0020.0008.2C6B] # LATIN CAPITAL LETTER Z WITH DESCENDER
+0292 ; [.125F.0020.0002.0292] # LATIN SMALL LETTER EZH
+01B7 ; [.125F.0020.0008.01B7] # LATIN CAPITAL LETTER EZH
+1DBE ; [.125F.0020.0014.1DBE] # MODIFIER LETTER SMALL EZH; QQK
+01EF ; [.125F.0020.0002.0292][.0000.0041.0002.030C] # LATIN SMALL LETTER EZH WITH CARON; QQCM
+01EE ; [.125F.0020.0008.01B7][.0000.0041.0002.030C] # LATIN CAPITAL LETTER EZH WITH CARON; QQCM
+1D23 ; [.1263.0020.0002.1D23] # LATIN LETTER SMALL CAPITAL EZH
+01B9 ; [.1264.0020.0002.01B9] # LATIN SMALL LETTER EZH REVERSED
+01B8 ; [.1264.0020.0008.01B8] # LATIN CAPITAL LETTER EZH REVERSED
+1D9A ; [.1268.0020.0002.1D9A] # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+01BA ; [.1269.0020.0002.01BA] # LATIN SMALL LETTER EZH WITH TAIL
+0293 ; [.126D.0020.0002.0293] # LATIN SMALL LETTER EZH WITH CURL
+021D ; [.1271.0020.0002.021D] # LATIN SMALL LETTER YOGH
+021C ; [.1271.0020.0008.021C] # LATIN CAPITAL LETTER YOGH
+00FE ; [.1275.0020.0002.00FE] # LATIN SMALL LETTER THORN
+00DE ; [.1275.0020.0008.00DE] # LATIN CAPITAL LETTER THORN
+01BF ; [.1279.0020.0002.01BF] # LATIN LETTER WYNN
+01F7 ; [.1279.0020.0008.01F7] # LATIN CAPITAL LETTER WYNN
+01BB ; [.127D.0020.0002.01BB] # LATIN LETTER TWO WITH STROKE
+01A8 ; [.1281.0020.0002.01A8] # LATIN SMALL LETTER TONE TWO
+01A7 ; [.1281.0020.0008.01A7] # LATIN CAPITAL LETTER TONE TWO
+01BD ; [.1285.0020.0002.01BD] # LATIN SMALL LETTER TONE FIVE
+01BC ; [.1285.0020.0008.01BC] # LATIN CAPITAL LETTER TONE FIVE
+0185 ; [.1289.0020.0002.0185] # LATIN SMALL LETTER TONE SIX
+0184 ; [.1289.0020.0008.0184] # LATIN CAPITAL LETTER TONE SIX
+0294 ; [.128D.0020.0002.0294] # LATIN LETTER GLOTTAL STOP
+0242 ; [.1291.0020.0002.0242] # LATIN SMALL LETTER GLOTTAL STOP
+0241 ; [.1291.0020.0008.0241] # LATIN CAPITAL LETTER GLOTTAL STOP
+02C0 ; [.1295.0020.0002.02C0] # MODIFIER LETTER GLOTTAL STOP
+02BC ; [.1296.0020.0002.02BC] # MODIFIER LETTER APOSTROPHE
+0149 ; [.1296.0020.0004.0149][.111B.0020.0004.0149] # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE; QQKN
+02EE ; [.1297.0020.0002.02EE] # MODIFIER LETTER DOUBLE APOSTROPHE
+02BE ; [.1298.0020.0002.02BE] # MODIFIER LETTER RIGHT HALF RING
+0295 ; [.1299.0020.0002.0295] # LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+02E4 ; [.1299.0020.0014.02E4] # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP; QQK
+02BF ; [.129D.0020.0002.02BF] # MODIFIER LETTER LEFT HALF RING
+02C1 ; [.129E.0020.0002.02C1] # MODIFIER LETTER REVERSED GLOTTAL STOP
+1D24 ; [.129F.0020.0002.1D24] # LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25 ; [.12A0.0020.0002.1D25] # LATIN LETTER AIN
+1D5C ; [.12A0.0020.0014.1D5C] # MODIFIER LETTER SMALL AIN; QQK
+02A1 ; [.12A1.0020.0002.02A1] # LATIN LETTER GLOTTAL STOP WITH STROKE
+02A2 ; [.12A5.0020.0002.02A2] # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+0296 ; [.12A9.0020.0002.0296] # LATIN LETTER INVERTED GLOTTAL STOP
+01C0 ; [.12AD.0020.0002.01C0] # LATIN LETTER DENTAL CLICK
+01C1 ; [.12B1.0020.0002.01C1] # LATIN LETTER LATERAL CLICK
+01C2 ; [.12B5.0020.0002.01C2] # LATIN LETTER ALVEOLAR CLICK
+01C3 ; [.12B9.0020.0002.01C3] # LATIN LETTER RETROFLEX CLICK
+0297 ; [.12BD.0020.0002.0297] # LATIN LETTER STRETCHED C
+0298 ; [.12C1.0020.0002.0298] # LATIN LETTER BILABIAL CLICK
+02AC ; [.12C5.0020.0002.02AC] # LATIN LETTER BILABIAL PERCUSSIVE
+02AD ; [.12C9.0020.0002.02AD] # LATIN LETTER BIDENTAL PERCUSSIVE
+03B1 ; [.12CD.0020.0002.03B1] # GREEK SMALL LETTER ALPHA
+1D6C2 ; [.12CD.0020.0005.1D6C2] # MATHEMATICAL BOLD SMALL ALPHA; QQK
+1D6FC ; [.12CD.0020.0005.1D6FC] # MATHEMATICAL ITALIC SMALL ALPHA; QQK
+1D736 ; [.12CD.0020.0005.1D736] # MATHEMATICAL BOLD ITALIC SMALL ALPHA; QQK
+1D770 ; [.12CD.0020.0005.1D770] # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA; QQK
+1D7AA ; [.12CD.0020.0005.1D7AA] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA; QQK
+0391 ; [.12CD.0020.0008.0391] # GREEK CAPITAL LETTER ALPHA
+1D6A8 ; [.12CD.0020.000B.1D6A8] # MATHEMATICAL BOLD CAPITAL ALPHA; QQK
+1D6E2 ; [.12CD.0020.000B.1D6E2] # MATHEMATICAL ITALIC CAPITAL ALPHA; QQK
+1D71C ; [.12CD.0020.000B.1D71C] # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA; QQK
+1D756 ; [.12CD.0020.000B.1D756] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA; QQK
+1D790 ; [.12CD.0020.000B.1D790] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA; QQK
+1F00 ; [.12CD.0020.0002.03B1][.0000.0022.0002.0313] # GREEK SMALL LETTER ALPHA WITH PSILI; QQCM
+1F08 ; [.12CD.0020.0008.0391][.0000.0022.0002.0313] # GREEK CAPITAL LETTER ALPHA WITH PSILI; QQCM
+1F04 ; [.12CD.0020.0002.03B1][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA; QQCM
+1F0C ; [.12CD.0020.0008.0391][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA; QQCM
+1F84 ; [.12CD.0020.0002.03B1][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI; QQCM
+1F8C ; [.12CD.0020.0008.0391][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI; QQCM
+1F02 ; [.12CD.0020.0002.03B1][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA; QQCM
+1F0A ; [.12CD.0020.0008.0391][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA; QQCM
+1F82 ; [.12CD.0020.0002.03B1][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI; QQCM
+1F8A ; [.12CD.0020.0008.0391][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI; QQCM
+1F06 ; [.12CD.0020.0002.03B1][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI; QQCM
+1F0E ; [.12CD.0020.0008.0391][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI; QQCM
+1F86 ; [.12CD.0020.0002.03B1][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F8E ; [.12CD.0020.0008.0391][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F80 ; [.12CD.0020.0002.03B1][.0000.0022.0002.0313][.0000.0097.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI; QQCM
+1F88 ; [.12CD.0020.0008.0391][.0000.0022.0002.0313][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI; QQCM
+1F01 ; [.12CD.0020.0002.03B1][.0000.002A.0002.0314] # GREEK SMALL LETTER ALPHA WITH DASIA; QQCM
+1F09 ; [.12CD.0020.0008.0391][.0000.002A.0002.0314] # GREEK CAPITAL LETTER ALPHA WITH DASIA; QQCM
+1F05 ; [.12CD.0020.0002.03B1][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA; QQCM
+1F0D ; [.12CD.0020.0008.0391][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA; QQCM
+1F85 ; [.12CD.0020.0002.03B1][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI; QQCM
+1F8D ; [.12CD.0020.0008.0391][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI; QQCM
+1F03 ; [.12CD.0020.0002.03B1][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA; QQCM
+1F0B ; [.12CD.0020.0008.0391][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA; QQCM
+1F83 ; [.12CD.0020.0002.03B1][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI; QQCM
+1F8B ; [.12CD.0020.0008.0391][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI; QQCM
+1F07 ; [.12CD.0020.0002.03B1][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI; QQCM
+1F0F ; [.12CD.0020.0008.0391][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI; QQCM
+1F87 ; [.12CD.0020.0002.03B1][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F8F ; [.12CD.0020.0008.0391][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F81 ; [.12CD.0020.0002.03B1][.0000.002A.0002.0314][.0000.0097.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI; QQCM
+1F89 ; [.12CD.0020.0008.0391][.0000.002A.0002.0314][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI; QQCM
+03AC ; [.12CD.0020.0002.03B1][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH TONOS; QQCM
+1F71 ; [.12CD.0020.0002.03B1][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH OXIA; QQCM
+0386 ; [.12CD.0020.0008.0391][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH TONOS; QQCM
+1FBB ; [.12CD.0020.0008.0391][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH OXIA; QQCM
+1FB4 ; [.12CD.0020.0002.03B1][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI; QQCM
+1F70 ; [.12CD.0020.0002.03B1][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH VARIA; QQCM
+1FBA ; [.12CD.0020.0008.0391][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH VARIA; QQCM
+1FB2 ; [.12CD.0020.0002.03B1][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI; QQCM
+1FB0 ; [.12CD.0020.0002.03B1][.0000.0037.0002.0306] # GREEK SMALL LETTER ALPHA WITH VRACHY; QQCM
+1FB8 ; [.12CD.0020.0008.0391][.0000.0037.0002.0306] # GREEK CAPITAL LETTER ALPHA WITH VRACHY; QQCM
+1FB6 ; [.12CD.0020.0002.03B1][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI; QQCM
+1FB7 ; [.12CD.0020.0002.03B1][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FB1 ; [.12CD.0020.0002.03B1][.0000.005B.0002.0304] # GREEK SMALL LETTER ALPHA WITH MACRON; QQCM
+1FB9 ; [.12CD.0020.0008.0391][.0000.005B.0002.0304] # GREEK CAPITAL LETTER ALPHA WITH MACRON; QQCM
+1FB3 ; [.12CD.0020.0002.03B1][.0000.0097.0002.0345] # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI; QQCM
+1FBC ; [.12CD.0020.0008.0391][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI; QQCM
+03B2 ; [.12CE.0020.0002.03B2] # GREEK SMALL LETTER BETA
+03D0 ; [.12CE.0020.0004.03D0] # GREEK BETA SYMBOL; QQK
+1D6C3 ; [.12CE.0020.0005.1D6C3] # MATHEMATICAL BOLD SMALL BETA; QQK
+1D6FD ; [.12CE.0020.0005.1D6FD] # MATHEMATICAL ITALIC SMALL BETA; QQK
+1D737 ; [.12CE.0020.0005.1D737] # MATHEMATICAL BOLD ITALIC SMALL BETA; QQK
+1D771 ; [.12CE.0020.0005.1D771] # MATHEMATICAL SANS-SERIF BOLD SMALL BETA; QQK
+1D7AB ; [.12CE.0020.0005.1D7AB] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA; QQK
+0392 ; [.12CE.0020.0008.0392] # GREEK CAPITAL LETTER BETA
+1D6A9 ; [.12CE.0020.000B.1D6A9] # MATHEMATICAL BOLD CAPITAL BETA; QQK
+1D6E3 ; [.12CE.0020.000B.1D6E3] # MATHEMATICAL ITALIC CAPITAL BETA; QQK
+1D71D ; [.12CE.0020.000B.1D71D] # MATHEMATICAL BOLD ITALIC CAPITAL BETA; QQK
+1D757 ; [.12CE.0020.000B.1D757] # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA; QQK
+1D791 ; [.12CE.0020.000B.1D791] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA; QQK
+1D5D ; [.12CE.0020.0014.1D5D] # MODIFIER LETTER SMALL BETA; QQK
+1D66 ; [.12CE.0020.0015.1D66] # GREEK SUBSCRIPT SMALL LETTER BETA; QQK
+03B3 ; [.12CF.0020.0002.03B3] # GREEK SMALL LETTER GAMMA
+213D ; [.12CF.0020.0005.213D] # DOUBLE-STRUCK SMALL GAMMA; QQK
+1D6C4 ; [.12CF.0020.0005.1D6C4] # MATHEMATICAL BOLD SMALL GAMMA; QQK
+1D6FE ; [.12CF.0020.0005.1D6FE] # MATHEMATICAL ITALIC SMALL GAMMA; QQK
+1D738 ; [.12CF.0020.0005.1D738] # MATHEMATICAL BOLD ITALIC SMALL GAMMA; QQK
+1D772 ; [.12CF.0020.0005.1D772] # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA; QQK
+1D7AC ; [.12CF.0020.0005.1D7AC] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA; QQK
+0393 ; [.12CF.0020.0008.0393] # GREEK CAPITAL LETTER GAMMA
+213E ; [.12CF.0020.000B.213E] # DOUBLE-STRUCK CAPITAL GAMMA; QQK
+1D6AA ; [.12CF.0020.000B.1D6AA] # MATHEMATICAL BOLD CAPITAL GAMMA; QQK
+1D6E4 ; [.12CF.0020.000B.1D6E4] # MATHEMATICAL ITALIC CAPITAL GAMMA; QQK
+1D71E ; [.12CF.0020.000B.1D71E] # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA; QQK
+1D758 ; [.12CF.0020.000B.1D758] # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA; QQK
+1D792 ; [.12CF.0020.000B.1D792] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA; QQK
+1D5E ; [.12CF.0020.0014.1D5E] # MODIFIER LETTER SMALL GREEK GAMMA; QQK
+1D67 ; [.12CF.0020.0015.1D67] # GREEK SUBSCRIPT SMALL LETTER GAMMA; QQK
+1D26 ; [.12D0.0020.0002.1D26] # GREEK LETTER SMALL CAPITAL GAMMA
+03B4 ; [.12D1.0020.0002.03B4] # GREEK SMALL LETTER DELTA
+1D6C5 ; [.12D1.0020.0005.1D6C5] # MATHEMATICAL BOLD SMALL DELTA; QQK
+1D6FF ; [.12D1.0020.0005.1D6FF] # MATHEMATICAL ITALIC SMALL DELTA; QQK
+1D739 ; [.12D1.0020.0005.1D739] # MATHEMATICAL BOLD ITALIC SMALL DELTA; QQK
+1D773 ; [.12D1.0020.0005.1D773] # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA; QQK
+1D7AD ; [.12D1.0020.0005.1D7AD] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA; QQK
+0394 ; [.12D1.0020.0008.0394] # GREEK CAPITAL LETTER DELTA
+1D6AB ; [.12D1.0020.000B.1D6AB] # MATHEMATICAL BOLD CAPITAL DELTA; QQK
+1D6E5 ; [.12D1.0020.000B.1D6E5] # MATHEMATICAL ITALIC CAPITAL DELTA; QQK
+1D71F ; [.12D1.0020.000B.1D71F] # MATHEMATICAL BOLD ITALIC CAPITAL DELTA; QQK
+1D759 ; [.12D1.0020.000B.1D759] # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA; QQK
+1D793 ; [.12D1.0020.000B.1D793] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA; QQK
+1D5F ; [.12D1.0020.0014.1D5F] # MODIFIER LETTER SMALL DELTA; QQK
+03B5 ; [.12D2.0020.0002.03B5] # GREEK SMALL LETTER EPSILON
+03F5 ; [.12D2.0020.0004.03F5] # GREEK LUNATE EPSILON SYMBOL; QQK
+1D6C6 ; [.12D2.0020.0005.1D6C6] # MATHEMATICAL BOLD SMALL EPSILON; QQK
+1D6DC ; [.12D2.0020.0005.1D6DC] # MATHEMATICAL BOLD EPSILON SYMBOL; QQK
+1D700 ; [.12D2.0020.0005.1D700] # MATHEMATICAL ITALIC SMALL EPSILON; QQK
+1D716 ; [.12D2.0020.0005.1D716] # MATHEMATICAL ITALIC EPSILON SYMBOL; QQK
+1D73A ; [.12D2.0020.0005.1D73A] # MATHEMATICAL BOLD ITALIC SMALL EPSILON; QQK
+1D750 ; [.12D2.0020.0005.1D750] # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL; QQK
+1D774 ; [.12D2.0020.0005.1D774] # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON; QQK
+1D78A ; [.12D2.0020.0005.1D78A] # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL; QQK
+1D7AE ; [.12D2.0020.0005.1D7AE] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON; QQK
+1D7C4 ; [.12D2.0020.0005.1D7C4] # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL; QQK
+0395 ; [.12D2.0020.0008.0395] # GREEK CAPITAL LETTER EPSILON
+1D6AC ; [.12D2.0020.000B.1D6AC] # MATHEMATICAL BOLD CAPITAL EPSILON; QQK
+1D6E6 ; [.12D2.0020.000B.1D6E6] # MATHEMATICAL ITALIC CAPITAL EPSILON; QQK
+1D720 ; [.12D2.0020.000B.1D720] # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON; QQK
+1D75A ; [.12D2.0020.000B.1D75A] # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON; QQK
+1D794 ; [.12D2.0020.000B.1D794] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON; QQK
+1F10 ; [.12D2.0020.0002.03B5][.0000.0022.0002.0313] # GREEK SMALL LETTER EPSILON WITH PSILI; QQCM
+1F18 ; [.12D2.0020.0008.0395][.0000.0022.0002.0313] # GREEK CAPITAL LETTER EPSILON WITH PSILI; QQCM
+1F14 ; [.12D2.0020.0002.03B5][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA; QQCM
+1F1C ; [.12D2.0020.0008.0395][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA; QQCM
+1F12 ; [.12D2.0020.0002.03B5][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA; QQCM
+1F1A ; [.12D2.0020.0008.0395][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA; QQCM
+1F11 ; [.12D2.0020.0002.03B5][.0000.002A.0002.0314] # GREEK SMALL LETTER EPSILON WITH DASIA; QQCM
+1F19 ; [.12D2.0020.0008.0395][.0000.002A.0002.0314] # GREEK CAPITAL LETTER EPSILON WITH DASIA; QQCM
+1F15 ; [.12D2.0020.0002.03B5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA; QQCM
+1F1D ; [.12D2.0020.0008.0395][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA; QQCM
+1F13 ; [.12D2.0020.0002.03B5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA; QQCM
+1F1B ; [.12D2.0020.0008.0395][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA; QQCM
+03AD ; [.12D2.0020.0002.03B5][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH TONOS; QQCM
+1F73 ; [.12D2.0020.0002.03B5][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH OXIA; QQCM
+0388 ; [.12D2.0020.0008.0395][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH TONOS; QQCM
+1FC9 ; [.12D2.0020.0008.0395][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH OXIA; QQCM
+1F72 ; [.12D2.0020.0002.03B5][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH VARIA; QQCM
+1FC8 ; [.12D2.0020.0008.0395][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH VARIA; QQCM
+03DD ; [.12D3.0020.0002.03DD] # GREEK SMALL LETTER DIGAMMA
+1D7CB ; [.12D3.0020.0005.1D7CB] # MATHEMATICAL BOLD SMALL DIGAMMA; QQK
+03DC ; [.12D3.0020.0008.03DC] # GREEK LETTER DIGAMMA
+1D7CA ; [.12D3.0020.000B.1D7CA] # MATHEMATICAL BOLD CAPITAL DIGAMMA; QQK
+03DB ; [.12D4.0020.0002.03DB] # GREEK SMALL LETTER STIGMA
+03DA ; [.12D4.0020.0008.03DA] # GREEK LETTER STIGMA
+03B6 ; [.12D5.0020.0002.03B6] # GREEK SMALL LETTER ZETA
+1D6C7 ; [.12D5.0020.0005.1D6C7] # MATHEMATICAL BOLD SMALL ZETA; QQK
+1D701 ; [.12D5.0020.0005.1D701] # MATHEMATICAL ITALIC SMALL ZETA; QQK
+1D73B ; [.12D5.0020.0005.1D73B] # MATHEMATICAL BOLD ITALIC SMALL ZETA; QQK
+1D775 ; [.12D5.0020.0005.1D775] # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA; QQK
+1D7AF ; [.12D5.0020.0005.1D7AF] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA; QQK
+0396 ; [.12D5.0020.0008.0396] # GREEK CAPITAL LETTER ZETA
+1D6AD ; [.12D5.0020.000B.1D6AD] # MATHEMATICAL BOLD CAPITAL ZETA; QQK
+1D6E7 ; [.12D5.0020.000B.1D6E7] # MATHEMATICAL ITALIC CAPITAL ZETA; QQK
+1D721 ; [.12D5.0020.000B.1D721] # MATHEMATICAL BOLD ITALIC CAPITAL ZETA; QQK
+1D75B ; [.12D5.0020.000B.1D75B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA; QQK
+1D795 ; [.12D5.0020.000B.1D795] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA; QQK
+03B7 ; [.12D6.0020.0002.03B7] # GREEK SMALL LETTER ETA
+1D6C8 ; [.12D6.0020.0005.1D6C8] # MATHEMATICAL BOLD SMALL ETA; QQK
+1D702 ; [.12D6.0020.0005.1D702] # MATHEMATICAL ITALIC SMALL ETA; QQK
+1D73C ; [.12D6.0020.0005.1D73C] # MATHEMATICAL BOLD ITALIC SMALL ETA; QQK
+1D776 ; [.12D6.0020.0005.1D776] # MATHEMATICAL SANS-SERIF BOLD SMALL ETA; QQK
+1D7B0 ; [.12D6.0020.0005.1D7B0] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA; QQK
+0397 ; [.12D6.0020.0008.0397] # GREEK CAPITAL LETTER ETA
+1D6AE ; [.12D6.0020.000B.1D6AE] # MATHEMATICAL BOLD CAPITAL ETA; QQK
+1D6E8 ; [.12D6.0020.000B.1D6E8] # MATHEMATICAL ITALIC CAPITAL ETA; QQK
+1D722 ; [.12D6.0020.000B.1D722] # MATHEMATICAL BOLD ITALIC CAPITAL ETA; QQK
+1D75C ; [.12D6.0020.000B.1D75C] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA; QQK
+1D796 ; [.12D6.0020.000B.1D796] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA; QQK
+1F20 ; [.12D6.0020.0002.03B7][.0000.0022.0002.0313] # GREEK SMALL LETTER ETA WITH PSILI; QQCM
+1F28 ; [.12D6.0020.0008.0397][.0000.0022.0002.0313] # GREEK CAPITAL LETTER ETA WITH PSILI; QQCM
+1F24 ; [.12D6.0020.0002.03B7][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA; QQCM
+1F2C ; [.12D6.0020.0008.0397][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA; QQCM
+1F94 ; [.12D6.0020.0002.03B7][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI; QQCM
+1F9C ; [.12D6.0020.0008.0397][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI; QQCM
+1F22 ; [.12D6.0020.0002.03B7][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA; QQCM
+1F2A ; [.12D6.0020.0008.0397][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA; QQCM
+1F92 ; [.12D6.0020.0002.03B7][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI; QQCM
+1F9A ; [.12D6.0020.0008.0397][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI; QQCM
+1F26 ; [.12D6.0020.0002.03B7][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI; QQCM
+1F2E ; [.12D6.0020.0008.0397][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI; QQCM
+1F96 ; [.12D6.0020.0002.03B7][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F9E ; [.12D6.0020.0008.0397][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F90 ; [.12D6.0020.0002.03B7][.0000.0022.0002.0313][.0000.0097.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI; QQCM
+1F98 ; [.12D6.0020.0008.0397][.0000.0022.0002.0313][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI; QQCM
+1F21 ; [.12D6.0020.0002.03B7][.0000.002A.0002.0314] # GREEK SMALL LETTER ETA WITH DASIA; QQCM
+1F29 ; [.12D6.0020.0008.0397][.0000.002A.0002.0314] # GREEK CAPITAL LETTER ETA WITH DASIA; QQCM
+1F25 ; [.12D6.0020.0002.03B7][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA; QQCM
+1F2D ; [.12D6.0020.0008.0397][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA; QQCM
+1F95 ; [.12D6.0020.0002.03B7][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI; QQCM
+1F9D ; [.12D6.0020.0008.0397][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI; QQCM
+1F23 ; [.12D6.0020.0002.03B7][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA; QQCM
+1F2B ; [.12D6.0020.0008.0397][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA; QQCM
+1F93 ; [.12D6.0020.0002.03B7][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI; QQCM
+1F9B ; [.12D6.0020.0008.0397][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI; QQCM
+1F27 ; [.12D6.0020.0002.03B7][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI; QQCM
+1F2F ; [.12D6.0020.0008.0397][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI; QQCM
+1F97 ; [.12D6.0020.0002.03B7][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F9F ; [.12D6.0020.0008.0397][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F91 ; [.12D6.0020.0002.03B7][.0000.002A.0002.0314][.0000.0097.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI; QQCM
+1F99 ; [.12D6.0020.0008.0397][.0000.002A.0002.0314][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI; QQCM
+03AE ; [.12D6.0020.0002.03B7][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH TONOS; QQCM
+1F75 ; [.12D6.0020.0002.03B7][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH OXIA; QQCM
+0389 ; [.12D6.0020.0008.0397][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH TONOS; QQCM
+1FCB ; [.12D6.0020.0008.0397][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH OXIA; QQCM
+1FC4 ; [.12D6.0020.0002.03B7][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI; QQCM
+1F74 ; [.12D6.0020.0002.03B7][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH VARIA; QQCM
+1FCA ; [.12D6.0020.0008.0397][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH VARIA; QQCM
+1FC2 ; [.12D6.0020.0002.03B7][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI; QQCM
+1FC6 ; [.12D6.0020.0002.03B7][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH PERISPOMENI; QQCM
+1FC7 ; [.12D6.0020.0002.03B7][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FC3 ; [.12D6.0020.0002.03B7][.0000.0097.0002.0345] # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI; QQCM
+1FCC ; [.12D6.0020.0008.0397][.0000.0097.0002.0345] # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI; QQCM
+03B8 ; [.12D7.0020.0002.03B8] # GREEK SMALL LETTER THETA
+03D1 ; [.12D7.0020.0004.03D1] # GREEK THETA SYMBOL; QQK
+1D6C9 ; [.12D7.0020.0005.1D6C9] # MATHEMATICAL BOLD SMALL THETA; QQK
+1D6DD ; [.12D7.0020.0005.1D6DD] # MATHEMATICAL BOLD THETA SYMBOL; QQK
+1D703 ; [.12D7.0020.0005.1D703] # MATHEMATICAL ITALIC SMALL THETA; QQK
+1D717 ; [.12D7.0020.0005.1D717] # MATHEMATICAL ITALIC THETA SYMBOL; QQK
+1D73D ; [.12D7.0020.0005.1D73D] # MATHEMATICAL BOLD ITALIC SMALL THETA; QQK
+1D751 ; [.12D7.0020.0005.1D751] # MATHEMATICAL BOLD ITALIC THETA SYMBOL; QQK
+1D777 ; [.12D7.0020.0005.1D777] # MATHEMATICAL SANS-SERIF BOLD SMALL THETA; QQK
+1D78B ; [.12D7.0020.0005.1D78B] # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL; QQK
+1D7B1 ; [.12D7.0020.0005.1D7B1] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA; QQK
+1D7C5 ; [.12D7.0020.0005.1D7C5] # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL; QQK
+0398 ; [.12D7.0020.0008.0398] # GREEK CAPITAL LETTER THETA
+03F4 ; [.12D7.0020.000A.03F4] # GREEK CAPITAL THETA SYMBOL; QQK
+1D6AF ; [.12D7.0020.000B.1D6AF] # MATHEMATICAL BOLD CAPITAL THETA; QQK
+1D6B9 ; [.12D7.0020.000B.1D6B9] # MATHEMATICAL BOLD CAPITAL THETA SYMBOL; QQK
+1D6E9 ; [.12D7.0020.000B.1D6E9] # MATHEMATICAL ITALIC CAPITAL THETA; QQK
+1D6F3 ; [.12D7.0020.000B.1D6F3] # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL; QQK
+1D723 ; [.12D7.0020.000B.1D723] # MATHEMATICAL BOLD ITALIC CAPITAL THETA; QQK
+1D72D ; [.12D7.0020.000B.1D72D] # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL; QQK
+1D75D ; [.12D7.0020.000B.1D75D] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA; QQK
+1D767 ; [.12D7.0020.000B.1D767] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL; QQK
+1D797 ; [.12D7.0020.000B.1D797] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA; QQK
+1D7A1 ; [.12D7.0020.000B.1D7A1] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL; QQK
+1DBF ; [.12D7.0020.0014.1DBF] # MODIFIER LETTER SMALL THETA; QQK
+03B9 ; [.12D8.0020.0002.03B9] # GREEK SMALL LETTER IOTA
+1FBE ; [.12D8.0020.0002.1FBE] # GREEK PROSGEGRAMMENI; QQC
+037A ; [.12D8.0020.0004.037A] # GREEK YPOGEGRAMMENI; QQK
+1D6CA ; [.12D8.0020.0005.1D6CA] # MATHEMATICAL BOLD SMALL IOTA; QQK
+1D704 ; [.12D8.0020.0005.1D704] # MATHEMATICAL ITALIC SMALL IOTA; QQK
+1D73E ; [.12D8.0020.0005.1D73E] # MATHEMATICAL BOLD ITALIC SMALL IOTA; QQK
+1D778 ; [.12D8.0020.0005.1D778] # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA; QQK
+1D7B2 ; [.12D8.0020.0005.1D7B2] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA; QQK
+0399 ; [.12D8.0020.0008.0399] # GREEK CAPITAL LETTER IOTA
+1D6B0 ; [.12D8.0020.000B.1D6B0] # MATHEMATICAL BOLD CAPITAL IOTA; QQK
+1D6EA ; [.12D8.0020.000B.1D6EA] # MATHEMATICAL ITALIC CAPITAL IOTA; QQK
+1D724 ; [.12D8.0020.000B.1D724] # MATHEMATICAL BOLD ITALIC CAPITAL IOTA; QQK
+1D75E ; [.12D8.0020.000B.1D75E] # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA; QQK
+1D798 ; [.12D8.0020.000B.1D798] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA; QQK
+1F30 ; [.12D8.0020.0002.03B9][.0000.0022.0002.0313] # GREEK SMALL LETTER IOTA WITH PSILI; QQCM
+1F38 ; [.12D8.0020.0008.0399][.0000.0022.0002.0313] # GREEK CAPITAL LETTER IOTA WITH PSILI; QQCM
+1F34 ; [.12D8.0020.0002.03B9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA; QQCM
+1F3C ; [.12D8.0020.0008.0399][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA; QQCM
+1F32 ; [.12D8.0020.0002.03B9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA; QQCM
+1F3A ; [.12D8.0020.0008.0399][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA; QQCM
+1F36 ; [.12D8.0020.0002.03B9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI; QQCM
+1F3E ; [.12D8.0020.0008.0399][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI; QQCM
+1F31 ; [.12D8.0020.0002.03B9][.0000.002A.0002.0314] # GREEK SMALL LETTER IOTA WITH DASIA; QQCM
+1F39 ; [.12D8.0020.0008.0399][.0000.002A.0002.0314] # GREEK CAPITAL LETTER IOTA WITH DASIA; QQCM
+1F35 ; [.12D8.0020.0002.03B9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA; QQCM
+1F3D ; [.12D8.0020.0008.0399][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA; QQCM
+1F33 ; [.12D8.0020.0002.03B9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA; QQCM
+1F3B ; [.12D8.0020.0008.0399][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA; QQCM
+1F37 ; [.12D8.0020.0002.03B9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI; QQCM
+1F3F ; [.12D8.0020.0008.0399][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI; QQCM
+03AF ; [.12D8.0020.0002.03B9][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH TONOS; QQCM
+1F77 ; [.12D8.0020.0002.03B9][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH OXIA; QQCM
+038A ; [.12D8.0020.0008.0399][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH TONOS; QQCM
+1FDB ; [.12D8.0020.0008.0399][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH OXIA; QQCM
+1F76 ; [.12D8.0020.0002.03B9][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH VARIA; QQCM
+1FDA ; [.12D8.0020.0008.0399][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH VARIA; QQCM
+1FD0 ; [.12D8.0020.0002.03B9][.0000.0037.0002.0306] # GREEK SMALL LETTER IOTA WITH VRACHY; QQCM
+1FD8 ; [.12D8.0020.0008.0399][.0000.0037.0002.0306] # GREEK CAPITAL LETTER IOTA WITH VRACHY; QQCM
+1FD6 ; [.12D8.0020.0002.03B9][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH PERISPOMENI; QQCM
+03CA ; [.12D8.0020.0002.03B9][.0000.0047.0002.0308] # GREEK SMALL LETTER IOTA WITH DIALYTIKA; QQCM
+03AA ; [.12D8.0020.0008.0399][.0000.0047.0002.0308] # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA; QQCM
+0390 ; [.12D8.0020.0002.03B9][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS; QQCM
+1FD3 ; [.12D8.0020.0002.03B9][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA; QQCM
+1FD2 ; [.12D8.0020.0002.03B9][.0000.0047.0002.0308][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA; QQCM
+1FD7 ; [.12D8.0020.0002.03B9][.0000.0047.0002.0308][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI; QQCM
+1FD1 ; [.12D8.0020.0002.03B9][.0000.005B.0002.0304] # GREEK SMALL LETTER IOTA WITH MACRON; QQCM
+1FD9 ; [.12D8.0020.0008.0399][.0000.005B.0002.0304] # GREEK CAPITAL LETTER IOTA WITH MACRON; QQCM
+03F3 ; [.12D9.0020.0002.03F3] # GREEK LETTER YOT
+03BA ; [.12DA.0020.0002.03BA] # GREEK SMALL LETTER KAPPA
+03F0 ; [.12DA.0020.0004.03F0] # GREEK KAPPA SYMBOL; QQK
+1D6CB ; [.12DA.0020.0005.1D6CB] # MATHEMATICAL BOLD SMALL KAPPA; QQK
+1D6DE ; [.12DA.0020.0005.1D6DE] # MATHEMATICAL BOLD KAPPA SYMBOL; QQK
+1D705 ; [.12DA.0020.0005.1D705] # MATHEMATICAL ITALIC SMALL KAPPA; QQK
+1D718 ; [.12DA.0020.0005.1D718] # MATHEMATICAL ITALIC KAPPA SYMBOL; QQK
+1D73F ; [.12DA.0020.0005.1D73F] # MATHEMATICAL BOLD ITALIC SMALL KAPPA; QQK
+1D752 ; [.12DA.0020.0005.1D752] # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL; QQK
+1D779 ; [.12DA.0020.0005.1D779] # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA; QQK
+1D78C ; [.12DA.0020.0005.1D78C] # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL; QQK
+1D7B3 ; [.12DA.0020.0005.1D7B3] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA; QQK
+1D7C6 ; [.12DA.0020.0005.1D7C6] # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL; QQK
+039A ; [.12DA.0020.0008.039A] # GREEK CAPITAL LETTER KAPPA
+1D6B1 ; [.12DA.0020.000B.1D6B1] # MATHEMATICAL BOLD CAPITAL KAPPA; QQK
+1D6EB ; [.12DA.0020.000B.1D6EB] # MATHEMATICAL ITALIC CAPITAL KAPPA; QQK
+1D725 ; [.12DA.0020.000B.1D725] # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA; QQK
+1D75F ; [.12DA.0020.000B.1D75F] # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA; QQK
+1D799 ; [.12DA.0020.000B.1D799] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA; QQK
+03D7 ; [.12DA.0020.0004.03D7][.12CD.0020.0004.03D7][.12D8.0020.001F.03D7] # GREEK KAI SYMBOL; QQKN
+03BB ; [.12DB.0020.0002.03BB] # GREEK SMALL LETTER LAMDA
+1D6CC ; [.12DB.0020.0005.1D6CC] # MATHEMATICAL BOLD SMALL LAMDA; QQK
+1D706 ; [.12DB.0020.0005.1D706] # MATHEMATICAL ITALIC SMALL LAMDA; QQK
+1D740 ; [.12DB.0020.0005.1D740] # MATHEMATICAL BOLD ITALIC SMALL LAMDA; QQK
+1D77A ; [.12DB.0020.0005.1D77A] # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA; QQK
+1D7B4 ; [.12DB.0020.0005.1D7B4] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA; QQK
+039B ; [.12DB.0020.0008.039B] # GREEK CAPITAL LETTER LAMDA
+1D6B2 ; [.12DB.0020.000B.1D6B2] # MATHEMATICAL BOLD CAPITAL LAMDA; QQK
+1D6EC ; [.12DB.0020.000B.1D6EC] # MATHEMATICAL ITALIC CAPITAL LAMDA; QQK
+1D726 ; [.12DB.0020.000B.1D726] # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA; QQK
+1D760 ; [.12DB.0020.000B.1D760] # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA; QQK
+1D79A ; [.12DB.0020.000B.1D79A] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA; QQK
+1D27 ; [.12DC.0020.0002.1D27] # GREEK LETTER SMALL CAPITAL LAMDA
+03BC ; [.12DD.0020.0002.03BC] # GREEK SMALL LETTER MU
+00B5 ; [.12DD.0020.0004.00B5] # MICRO SIGN; QQK
+1D6CD ; [.12DD.0020.0005.1D6CD] # MATHEMATICAL BOLD SMALL MU; QQK
+1D707 ; [.12DD.0020.0005.1D707] # MATHEMATICAL ITALIC SMALL MU; QQK
+1D741 ; [.12DD.0020.0005.1D741] # MATHEMATICAL BOLD ITALIC SMALL MU; QQK
+1D77B ; [.12DD.0020.0005.1D77B] # MATHEMATICAL SANS-SERIF BOLD SMALL MU; QQK
+1D7B5 ; [.12DD.0020.0005.1D7B5] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU; QQK
+039C ; [.12DD.0020.0008.039C] # GREEK CAPITAL LETTER MU
+1D6B3 ; [.12DD.0020.000B.1D6B3] # MATHEMATICAL BOLD CAPITAL MU; QQK
+1D6ED ; [.12DD.0020.000B.1D6ED] # MATHEMATICAL ITALIC CAPITAL MU; QQK
+1D727 ; [.12DD.0020.000B.1D727] # MATHEMATICAL BOLD ITALIC CAPITAL MU; QQK
+1D761 ; [.12DD.0020.000B.1D761] # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU; QQK
+1D79B ; [.12DD.0020.000B.1D79B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU; QQK
+3382 ; [.12DD.0020.001C.3382][.0FD0.0020.001D.3382] # SQUARE MU A; QQKN
+338C ; [.12DD.0020.001C.338C][.105F.0020.001D.338C] # SQUARE MU F; QQKN
+338D ; [.12DD.0020.001C.338D][.106A.0020.001C.338D] # SQUARE MU G; QQKN
+3395 ; [.12DD.0020.001C.3395][.10E5.0020.001C.3395] # SQUARE MU L; QQKN
+339B ; [.12DD.0020.001C.339B][.1110.0020.001C.339B] # SQUARE MU M; QQKN
+33B2 ; [.12DD.0020.001C.33B2][.11AF.0020.001C.33B2] # SQUARE MU S; QQKN
+33B6 ; [.12DD.0020.001C.33B6][.1216.0020.001D.33B6] # SQUARE MU V; QQKN
+33BC ; [.12DD.0020.001C.33BC][.1225.0020.001D.33BC] # SQUARE MU W; QQKN
+03BD ; [.12DE.0020.0002.03BD] # GREEK SMALL LETTER NU
+1D6CE ; [.12DE.0020.0005.1D6CE] # MATHEMATICAL BOLD SMALL NU; QQK
+1D708 ; [.12DE.0020.0005.1D708] # MATHEMATICAL ITALIC SMALL NU; QQK
+1D742 ; [.12DE.0020.0005.1D742] # MATHEMATICAL BOLD ITALIC SMALL NU; QQK
+1D77C ; [.12DE.0020.0005.1D77C] # MATHEMATICAL SANS-SERIF BOLD SMALL NU; QQK
+1D7B6 ; [.12DE.0020.0005.1D7B6] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU; QQK
+039D ; [.12DE.0020.0008.039D] # GREEK CAPITAL LETTER NU
+1D6B4 ; [.12DE.0020.000B.1D6B4] # MATHEMATICAL BOLD CAPITAL NU; QQK
+1D6EE ; [.12DE.0020.000B.1D6EE] # MATHEMATICAL ITALIC CAPITAL NU; QQK
+1D728 ; [.12DE.0020.000B.1D728] # MATHEMATICAL BOLD ITALIC CAPITAL NU; QQK
+1D762 ; [.12DE.0020.000B.1D762] # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU; QQK
+1D79C ; [.12DE.0020.000B.1D79C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU; QQK
+03BE ; [.12DF.0020.0002.03BE] # GREEK SMALL LETTER XI
+1D6CF ; [.12DF.0020.0005.1D6CF] # MATHEMATICAL BOLD SMALL XI; QQK
+1D709 ; [.12DF.0020.0005.1D709] # MATHEMATICAL ITALIC SMALL XI; QQK
+1D743 ; [.12DF.0020.0005.1D743] # MATHEMATICAL BOLD ITALIC SMALL XI; QQK
+1D77D ; [.12DF.0020.0005.1D77D] # MATHEMATICAL SANS-SERIF BOLD SMALL XI; QQK
+1D7B7 ; [.12DF.0020.0005.1D7B7] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI; QQK
+039E ; [.12DF.0020.0008.039E] # GREEK CAPITAL LETTER XI
+1D6B5 ; [.12DF.0020.000B.1D6B5] # MATHEMATICAL BOLD CAPITAL XI; QQK
+1D6EF ; [.12DF.0020.000B.1D6EF] # MATHEMATICAL ITALIC CAPITAL XI; QQK
+1D729 ; [.12DF.0020.000B.1D729] # MATHEMATICAL BOLD ITALIC CAPITAL XI; QQK
+1D763 ; [.12DF.0020.000B.1D763] # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI; QQK
+1D79D ; [.12DF.0020.000B.1D79D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI; QQK
+03BF ; [.12E0.0020.0002.03BF] # GREEK SMALL LETTER OMICRON
+1D6D0 ; [.12E0.0020.0005.1D6D0] # MATHEMATICAL BOLD SMALL OMICRON; QQK
+1D70A ; [.12E0.0020.0005.1D70A] # MATHEMATICAL ITALIC SMALL OMICRON; QQK
+1D744 ; [.12E0.0020.0005.1D744] # MATHEMATICAL BOLD ITALIC SMALL OMICRON; QQK
+1D77E ; [.12E0.0020.0005.1D77E] # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON; QQK
+1D7B8 ; [.12E0.0020.0005.1D7B8] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON; QQK
+039F ; [.12E0.0020.0008.039F] # GREEK CAPITAL LETTER OMICRON
+1D6B6 ; [.12E0.0020.000B.1D6B6] # MATHEMATICAL BOLD CAPITAL OMICRON; QQK
+1D6F0 ; [.12E0.0020.000B.1D6F0] # MATHEMATICAL ITALIC CAPITAL OMICRON; QQK
+1D72A ; [.12E0.0020.000B.1D72A] # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON; QQK
+1D764 ; [.12E0.0020.000B.1D764] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON; QQK
+1D79E ; [.12E0.0020.000B.1D79E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON; QQK
+1F40 ; [.12E0.0020.0002.03BF][.0000.0022.0002.0313] # GREEK SMALL LETTER OMICRON WITH PSILI; QQCM
+1F48 ; [.12E0.0020.0008.039F][.0000.0022.0002.0313] # GREEK CAPITAL LETTER OMICRON WITH PSILI; QQCM
+1F44 ; [.12E0.0020.0002.03BF][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA; QQCM
+1F4C ; [.12E0.0020.0008.039F][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA; QQCM
+1F42 ; [.12E0.0020.0002.03BF][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA; QQCM
+1F4A ; [.12E0.0020.0008.039F][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA; QQCM
+1F41 ; [.12E0.0020.0002.03BF][.0000.002A.0002.0314] # GREEK SMALL LETTER OMICRON WITH DASIA; QQCM
+1F49 ; [.12E0.0020.0008.039F][.0000.002A.0002.0314] # GREEK CAPITAL LETTER OMICRON WITH DASIA; QQCM
+1F45 ; [.12E0.0020.0002.03BF][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA; QQCM
+1F4D ; [.12E0.0020.0008.039F][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA; QQCM
+1F43 ; [.12E0.0020.0002.03BF][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA; QQCM
+1F4B ; [.12E0.0020.0008.039F][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA; QQCM
+03CC ; [.12E0.0020.0002.03BF][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH TONOS; QQCM
+1F79 ; [.12E0.0020.0002.03BF][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH OXIA; QQCM
+038C ; [.12E0.0020.0008.039F][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH TONOS; QQCM
+1FF9 ; [.12E0.0020.0008.039F][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH OXIA; QQCM
+1F78 ; [.12E0.0020.0002.03BF][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH VARIA; QQCM
+1FF8 ; [.12E0.0020.0008.039F][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH VARIA; QQCM
+03C0 ; [.12E1.0020.0002.03C0] # GREEK SMALL LETTER PI
+03D6 ; [.12E1.0020.0004.03D6] # GREEK PI SYMBOL; QQK
+213C ; [.12E1.0020.0005.213C] # DOUBLE-STRUCK SMALL PI; QQK
+1D6D1 ; [.12E1.0020.0005.1D6D1] # MATHEMATICAL BOLD SMALL PI; QQK
+1D6E1 ; [.12E1.0020.0005.1D6E1] # MATHEMATICAL BOLD PI SYMBOL; QQK
+1D70B ; [.12E1.0020.0005.1D70B] # MATHEMATICAL ITALIC SMALL PI; QQK
+1D71B ; [.12E1.0020.0005.1D71B] # MATHEMATICAL ITALIC PI SYMBOL; QQK
+1D745 ; [.12E1.0020.0005.1D745] # MATHEMATICAL BOLD ITALIC SMALL PI; QQK
+1D755 ; [.12E1.0020.0005.1D755] # MATHEMATICAL BOLD ITALIC PI SYMBOL; QQK
+1D77F ; [.12E1.0020.0005.1D77F] # MATHEMATICAL SANS-SERIF BOLD SMALL PI; QQK
+1D78F ; [.12E1.0020.0005.1D78F] # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL; QQK
+1D7B9 ; [.12E1.0020.0005.1D7B9] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI; QQK
+1D7C9 ; [.12E1.0020.0005.1D7C9] # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL; QQK
+03A0 ; [.12E1.0020.0008.03A0] # GREEK CAPITAL LETTER PI
+213F ; [.12E1.0020.000B.213F] # DOUBLE-STRUCK CAPITAL PI; QQK
+1D6B7 ; [.12E1.0020.000B.1D6B7] # MATHEMATICAL BOLD CAPITAL PI; QQK
+1D6F1 ; [.12E1.0020.000B.1D6F1] # MATHEMATICAL ITALIC CAPITAL PI; QQK
+1D72B ; [.12E1.0020.000B.1D72B] # MATHEMATICAL BOLD ITALIC CAPITAL PI; QQK
+1D765 ; [.12E1.0020.000B.1D765] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI; QQK
+1D79F ; [.12E1.0020.000B.1D79F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI; QQK
+1D28 ; [.12E2.0020.0002.1D28] # GREEK LETTER SMALL CAPITAL PI
+03FB ; [.12E3.0020.0002.03FB] # GREEK SMALL LETTER SAN
+03FA ; [.12E3.0020.0008.03FA] # GREEK CAPITAL LETTER SAN
+03DF ; [.12E4.0020.0002.03DF] # GREEK SMALL LETTER KOPPA
+03DE ; [.12E4.0020.0008.03DE] # GREEK LETTER KOPPA
+03D9 ; [.12E5.0020.0002.03D9] # GREEK SMALL LETTER ARCHAIC KOPPA
+03D8 ; [.12E5.0020.0008.03D8] # GREEK LETTER ARCHAIC KOPPA
+03C1 ; [.12E6.0020.0002.03C1] # GREEK SMALL LETTER RHO
+03F1 ; [.12E6.0020.0004.03F1] # GREEK RHO SYMBOL; QQK
+1D6D2 ; [.12E6.0020.0005.1D6D2] # MATHEMATICAL BOLD SMALL RHO; QQK
+1D6E0 ; [.12E6.0020.0005.1D6E0] # MATHEMATICAL BOLD RHO SYMBOL; QQK
+1D70C ; [.12E6.0020.0005.1D70C] # MATHEMATICAL ITALIC SMALL RHO; QQK
+1D71A ; [.12E6.0020.0005.1D71A] # MATHEMATICAL ITALIC RHO SYMBOL; QQK
+1D746 ; [.12E6.0020.0005.1D746] # MATHEMATICAL BOLD ITALIC SMALL RHO; QQK
+1D754 ; [.12E6.0020.0005.1D754] # MATHEMATICAL BOLD ITALIC RHO SYMBOL; QQK
+1D780 ; [.12E6.0020.0005.1D780] # MATHEMATICAL SANS-SERIF BOLD SMALL RHO; QQK
+1D78E ; [.12E6.0020.0005.1D78E] # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL; QQK
+1D7BA ; [.12E6.0020.0005.1D7BA] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO; QQK
+1D7C8 ; [.12E6.0020.0005.1D7C8] # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL; QQK
+03A1 ; [.12E6.0020.0008.03A1] # GREEK CAPITAL LETTER RHO
+1D6B8 ; [.12E6.0020.000B.1D6B8] # MATHEMATICAL BOLD CAPITAL RHO; QQK
+1D6F2 ; [.12E6.0020.000B.1D6F2] # MATHEMATICAL ITALIC CAPITAL RHO; QQK
+1D72C ; [.12E6.0020.000B.1D72C] # MATHEMATICAL BOLD ITALIC CAPITAL RHO; QQK
+1D766 ; [.12E6.0020.000B.1D766] # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO; QQK
+1D7A0 ; [.12E6.0020.000B.1D7A0] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO; QQK
+1D68 ; [.12E6.0020.0015.1D68] # GREEK SUBSCRIPT SMALL LETTER RHO; QQK
+1FE4 ; [.12E6.0020.0002.03C1][.0000.0022.0002.0313] # GREEK SMALL LETTER RHO WITH PSILI; QQCM
+1FE5 ; [.12E6.0020.0002.03C1][.0000.002A.0002.0314] # GREEK SMALL LETTER RHO WITH DASIA; QQCM
+1FEC ; [.12E6.0020.0008.03A1][.0000.002A.0002.0314] # GREEK CAPITAL LETTER RHO WITH DASIA; QQCM
+1D29 ; [.12E7.0020.0002.1D29] # GREEK LETTER SMALL CAPITAL RHO
+03FC ; [.12E8.0020.0002.03FC] # GREEK RHO WITH STROKE SYMBOL
+03C3 ; [.12E9.0020.0002.03C3] # GREEK SMALL LETTER SIGMA
+03F2 ; [.12E9.0020.0004.03F2] # GREEK LUNATE SIGMA SYMBOL; QQK
+1D6D3 ; [.12E9.0020.0005.1D6D3] # MATHEMATICAL BOLD SMALL FINAL SIGMA; QQK
+1D6D4 ; [.12E9.0020.0005.1D6D4] # MATHEMATICAL BOLD SMALL SIGMA; QQK
+1D70D ; [.12E9.0020.0005.1D70D] # MATHEMATICAL ITALIC SMALL FINAL SIGMA; QQK
+1D70E ; [.12E9.0020.0005.1D70E] # MATHEMATICAL ITALIC SMALL SIGMA; QQK
+1D747 ; [.12E9.0020.0005.1D747] # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA; QQK
+1D748 ; [.12E9.0020.0005.1D748] # MATHEMATICAL BOLD ITALIC SMALL SIGMA; QQK
+1D781 ; [.12E9.0020.0005.1D781] # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA; QQK
+1D782 ; [.12E9.0020.0005.1D782] # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA; QQK
+1D7BB ; [.12E9.0020.0005.1D7BB] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA; QQK
+1D7BC ; [.12E9.0020.0005.1D7BC] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA; QQK
+03A3 ; [.12E9.0020.0008.03A3] # GREEK CAPITAL LETTER SIGMA
+03F9 ; [.12E9.0020.000A.03F9] # GREEK CAPITAL LUNATE SIGMA SYMBOL; QQK
+1D6BA ; [.12E9.0020.000B.1D6BA] # MATHEMATICAL BOLD CAPITAL SIGMA; QQK
+1D6F4 ; [.12E9.0020.000B.1D6F4] # MATHEMATICAL ITALIC CAPITAL SIGMA; QQK
+1D72E ; [.12E9.0020.000B.1D72E] # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA; QQK
+1D768 ; [.12E9.0020.000B.1D768] # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA; QQK
+1D7A2 ; [.12E9.0020.000B.1D7A2] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA; QQK
+03C2 ; [.12E9.0020.0019.03C2] # GREEK SMALL LETTER FINAL SIGMA; QQK
+037C ; [.12EA.0020.0002.037C] # GREEK SMALL DOTTED LUNATE SIGMA SYMBOL
+03FE ; [.12EA.0020.0008.03FE] # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+037B ; [.12EB.0020.0002.037B] # GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
+03FD ; [.12EB.0020.0008.03FD] # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+037D ; [.12EC.0020.0002.037D] # GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+03FF ; [.12EC.0020.0008.03FF] # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+03C4 ; [.12ED.0020.0002.03C4] # GREEK SMALL LETTER TAU
+1D6D5 ; [.12ED.0020.0005.1D6D5] # MATHEMATICAL BOLD SMALL TAU; QQK
+1D70F ; [.12ED.0020.0005.1D70F] # MATHEMATICAL ITALIC SMALL TAU; QQK
+1D749 ; [.12ED.0020.0005.1D749] # MATHEMATICAL BOLD ITALIC SMALL TAU; QQK
+1D783 ; [.12ED.0020.0005.1D783] # MATHEMATICAL SANS-SERIF BOLD SMALL TAU; QQK
+1D7BD ; [.12ED.0020.0005.1D7BD] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU; QQK
+03A4 ; [.12ED.0020.0008.03A4] # GREEK CAPITAL LETTER TAU
+1D6BB ; [.12ED.0020.000B.1D6BB] # MATHEMATICAL BOLD CAPITAL TAU; QQK
+1D6F5 ; [.12ED.0020.000B.1D6F5] # MATHEMATICAL ITALIC CAPITAL TAU; QQK
+1D72F ; [.12ED.0020.000B.1D72F] # MATHEMATICAL BOLD ITALIC CAPITAL TAU; QQK
+1D769 ; [.12ED.0020.000B.1D769] # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU; QQK
+1D7A3 ; [.12ED.0020.000B.1D7A3] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU; QQK
+03C5 ; [.12EE.0020.0002.03C5] # GREEK SMALL LETTER UPSILON
+1D6D6 ; [.12EE.0020.0005.1D6D6] # MATHEMATICAL BOLD SMALL UPSILON; QQK
+1D710 ; [.12EE.0020.0005.1D710] # MATHEMATICAL ITALIC SMALL UPSILON; QQK
+1D74A ; [.12EE.0020.0005.1D74A] # MATHEMATICAL BOLD ITALIC SMALL UPSILON; QQK
+1D784 ; [.12EE.0020.0005.1D784] # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON; QQK
+1D7BE ; [.12EE.0020.0005.1D7BE] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON; QQK
+03A5 ; [.12EE.0020.0008.03A5] # GREEK CAPITAL LETTER UPSILON
+03D2 ; [.12EE.0020.000A.03D2] # GREEK UPSILON WITH HOOK SYMBOL; QQK
+1D6BC ; [.12EE.0020.000B.1D6BC] # MATHEMATICAL BOLD CAPITAL UPSILON; QQK
+1D6F6 ; [.12EE.0020.000B.1D6F6] # MATHEMATICAL ITALIC CAPITAL UPSILON; QQK
+1D730 ; [.12EE.0020.000B.1D730] # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON; QQK
+1D76A ; [.12EE.0020.000B.1D76A] # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON; QQK
+1D7A4 ; [.12EE.0020.000B.1D7A4] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON; QQK
+1F50 ; [.12EE.0020.0002.03C5][.0000.0022.0002.0313] # GREEK SMALL LETTER UPSILON WITH PSILI; QQCM
+1F54 ; [.12EE.0020.0002.03C5][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA; QQCM
+1F52 ; [.12EE.0020.0002.03C5][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA; QQCM
+1F56 ; [.12EE.0020.0002.03C5][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI; QQCM
+1F51 ; [.12EE.0020.0002.03C5][.0000.002A.0002.0314] # GREEK SMALL LETTER UPSILON WITH DASIA; QQCM
+1F59 ; [.12EE.0020.0008.03A5][.0000.002A.0002.0314] # GREEK CAPITAL LETTER UPSILON WITH DASIA; QQCM
+1F55 ; [.12EE.0020.0002.03C5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA; QQCM
+1F5D ; [.12EE.0020.0008.03A5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA; QQCM
+1F53 ; [.12EE.0020.0002.03C5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA; QQCM
+1F5B ; [.12EE.0020.0008.03A5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA; QQCM
+1F57 ; [.12EE.0020.0002.03C5][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI; QQCM
+1F5F ; [.12EE.0020.0008.03A5][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI; QQCM
+03CD ; [.12EE.0020.0002.03C5][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH TONOS; QQCM
+1F7B ; [.12EE.0020.0002.03C5][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH OXIA; QQCM
+038E ; [.12EE.0020.0008.03A5][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH TONOS; QQCM
+1FEB ; [.12EE.0020.0008.03A5][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH OXIA; QQCM
+03D3 ; [.12EE.0020.000A.03D3][.0000.0032.0002.03D3] # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL; QQKN
+1F7A ; [.12EE.0020.0002.03C5][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH VARIA; QQCM
+1FEA ; [.12EE.0020.0008.03A5][.0000.0035.0002.0300] # GREEK CAPITAL LETTER UPSILON WITH VARIA; QQCM
+1FE0 ; [.12EE.0020.0002.03C5][.0000.0037.0002.0306] # GREEK SMALL LETTER UPSILON WITH VRACHY; QQCM
+1FE8 ; [.12EE.0020.0008.03A5][.0000.0037.0002.0306] # GREEK CAPITAL LETTER UPSILON WITH VRACHY; QQCM
+1FE6 ; [.12EE.0020.0002.03C5][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH PERISPOMENI; QQCM
+03CB ; [.12EE.0020.0002.03C5][.0000.0047.0002.0308] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA; QQCM
+03AB ; [.12EE.0020.0008.03A5][.0000.0047.0002.0308] # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA; QQCM
+03D4 ; [.12EE.0020.000A.03D4][.0000.0047.0002.03D4] # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL; QQKN
+03B0 ; [.12EE.0020.0002.03C5][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS; QQCM
+1FE3 ; [.12EE.0020.0002.03C5][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA; QQCM
+1FE2 ; [.12EE.0020.0002.03C5][.0000.0047.0002.0308][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA; QQCM
+1FE7 ; [.12EE.0020.0002.03C5][.0000.0047.0002.0308][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI; QQCM
+1FE1 ; [.12EE.0020.0002.03C5][.0000.005B.0002.0304] # GREEK SMALL LETTER UPSILON WITH MACRON; QQCM
+1FE9 ; [.12EE.0020.0008.03A5][.0000.005B.0002.0304] # GREEK CAPITAL LETTER UPSILON WITH MACRON; QQCM
+03C6 ; [.12EF.0020.0002.03C6] # GREEK SMALL LETTER PHI
+03D5 ; [.12EF.0020.0004.03D5] # GREEK PHI SYMBOL; QQK
+1D6D7 ; [.12EF.0020.0005.1D6D7] # MATHEMATICAL BOLD SMALL PHI; QQK
+1D6DF ; [.12EF.0020.0005.1D6DF] # MATHEMATICAL BOLD PHI SYMBOL; QQK
+1D711 ; [.12EF.0020.0005.1D711] # MATHEMATICAL ITALIC SMALL PHI; QQK
+1D719 ; [.12EF.0020.0005.1D719] # MATHEMATICAL ITALIC PHI SYMBOL; QQK
+1D74B ; [.12EF.0020.0005.1D74B] # MATHEMATICAL BOLD ITALIC SMALL PHI; QQK
+1D753 ; [.12EF.0020.0005.1D753] # MATHEMATICAL BOLD ITALIC PHI SYMBOL; QQK
+1D785 ; [.12EF.0020.0005.1D785] # MATHEMATICAL SANS-SERIF BOLD SMALL PHI; QQK
+1D78D ; [.12EF.0020.0005.1D78D] # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL; QQK
+1D7BF ; [.12EF.0020.0005.1D7BF] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI; QQK
+1D7C7 ; [.12EF.0020.0005.1D7C7] # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL; QQK
+03A6 ; [.12EF.0020.0008.03A6] # GREEK CAPITAL LETTER PHI
+1D6BD ; [.12EF.0020.000B.1D6BD] # MATHEMATICAL BOLD CAPITAL PHI; QQK
+1D6F7 ; [.12EF.0020.000B.1D6F7] # MATHEMATICAL ITALIC CAPITAL PHI; QQK
+1D731 ; [.12EF.0020.000B.1D731] # MATHEMATICAL BOLD ITALIC CAPITAL PHI; QQK
+1D76B ; [.12EF.0020.000B.1D76B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI; QQK
+1D7A5 ; [.12EF.0020.000B.1D7A5] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI; QQK
+1D60 ; [.12EF.0020.0014.1D60] # MODIFIER LETTER SMALL GREEK PHI; QQK
+1D69 ; [.12EF.0020.0015.1D69] # GREEK SUBSCRIPT SMALL LETTER PHI; QQK
+03C7 ; [.12F0.0020.0002.03C7] # GREEK SMALL LETTER CHI
+1D6D8 ; [.12F0.0020.0005.1D6D8] # MATHEMATICAL BOLD SMALL CHI; QQK
+1D712 ; [.12F0.0020.0005.1D712] # MATHEMATICAL ITALIC SMALL CHI; QQK
+1D74C ; [.12F0.0020.0005.1D74C] # MATHEMATICAL BOLD ITALIC SMALL CHI; QQK
+1D786 ; [.12F0.0020.0005.1D786] # MATHEMATICAL SANS-SERIF BOLD SMALL CHI; QQK
+1D7C0 ; [.12F0.0020.0005.1D7C0] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI; QQK
+03A7 ; [.12F0.0020.0008.03A7] # GREEK CAPITAL LETTER CHI
+1D6BE ; [.12F0.0020.000B.1D6BE] # MATHEMATICAL BOLD CAPITAL CHI; QQK
+1D6F8 ; [.12F0.0020.000B.1D6F8] # MATHEMATICAL ITALIC CAPITAL CHI; QQK
+1D732 ; [.12F0.0020.000B.1D732] # MATHEMATICAL BOLD ITALIC CAPITAL CHI; QQK
+1D76C ; [.12F0.0020.000B.1D76C] # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI; QQK
+1D7A6 ; [.12F0.0020.000B.1D7A6] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI; QQK
+1D61 ; [.12F0.0020.0014.1D61] # MODIFIER LETTER SMALL CHI; QQK
+1D6A ; [.12F0.0020.0015.1D6A] # GREEK SUBSCRIPT SMALL LETTER CHI; QQK
+03C8 ; [.12F1.0020.0002.03C8] # GREEK SMALL LETTER PSI
+1D6D9 ; [.12F1.0020.0005.1D6D9] # MATHEMATICAL BOLD SMALL PSI; QQK
+1D713 ; [.12F1.0020.0005.1D713] # MATHEMATICAL ITALIC SMALL PSI; QQK
+1D74D ; [.12F1.0020.0005.1D74D] # MATHEMATICAL BOLD ITALIC SMALL PSI; QQK
+1D787 ; [.12F1.0020.0005.1D787] # MATHEMATICAL SANS-SERIF BOLD SMALL PSI; QQK
+1D7C1 ; [.12F1.0020.0005.1D7C1] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI; QQK
+03A8 ; [.12F1.0020.0008.03A8] # GREEK CAPITAL LETTER PSI
+1D6BF ; [.12F1.0020.000B.1D6BF] # MATHEMATICAL BOLD CAPITAL PSI; QQK
+1D6F9 ; [.12F1.0020.000B.1D6F9] # MATHEMATICAL ITALIC CAPITAL PSI; QQK
+1D733 ; [.12F1.0020.000B.1D733] # MATHEMATICAL BOLD ITALIC CAPITAL PSI; QQK
+1D76D ; [.12F1.0020.000B.1D76D] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI; QQK
+1D7A7 ; [.12F1.0020.000B.1D7A7] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI; QQK
+1D2A ; [.12F2.0020.0002.1D2A] # GREEK LETTER SMALL CAPITAL PSI
+03C9 ; [.12F3.0020.0002.03C9] # GREEK SMALL LETTER OMEGA
+1D6DA ; [.12F3.0020.0005.1D6DA] # MATHEMATICAL BOLD SMALL OMEGA; QQK
+1D714 ; [.12F3.0020.0005.1D714] # MATHEMATICAL ITALIC SMALL OMEGA; QQK
+1D74E ; [.12F3.0020.0005.1D74E] # MATHEMATICAL BOLD ITALIC SMALL OMEGA; QQK
+1D788 ; [.12F3.0020.0005.1D788] # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA; QQK
+1D7C2 ; [.12F3.0020.0005.1D7C2] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA; QQK
+03A9 ; [.12F3.0020.0008.03A9] # GREEK CAPITAL LETTER OMEGA
+2126 ; [.12F3.0020.0008.2126] # OHM SIGN; QQC
+1D6C0 ; [.12F3.0020.000B.1D6C0] # MATHEMATICAL BOLD CAPITAL OMEGA; QQK
+1D6FA ; [.12F3.0020.000B.1D6FA] # MATHEMATICAL ITALIC CAPITAL OMEGA; QQK
+1D734 ; [.12F3.0020.000B.1D734] # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA; QQK
+1D76E ; [.12F3.0020.000B.1D76E] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA; QQK
+1D7A8 ; [.12F3.0020.000B.1D7A8] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA; QQK
+1F60 ; [.12F3.0020.0002.03C9][.0000.0022.0002.0313] # GREEK SMALL LETTER OMEGA WITH PSILI; QQCM
+1F68 ; [.12F3.0020.0008.03A9][.0000.0022.0002.0313] # GREEK CAPITAL LETTER OMEGA WITH PSILI; QQCM
+1F64 ; [.12F3.0020.0002.03C9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA; QQCM
+1F6C ; [.12F3.0020.0008.03A9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA; QQCM
+1FA4 ; [.12F3.0020.0002.03C9][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI; QQCM
+1FAC ; [.12F3.0020.0008.03A9][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI; QQCM
+1F62 ; [.12F3.0020.0002.03C9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA; QQCM
+1F6A ; [.12F3.0020.0008.03A9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA; QQCM
+1FA2 ; [.12F3.0020.0002.03C9][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI; QQCM
+1FAA ; [.12F3.0020.0008.03A9][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI; QQCM
+1F66 ; [.12F3.0020.0002.03C9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI; QQCM
+1F6E ; [.12F3.0020.0008.03A9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI; QQCM
+1FA6 ; [.12F3.0020.0002.03C9][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FAE ; [.12F3.0020.0008.03A9][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1FA0 ; [.12F3.0020.0002.03C9][.0000.0022.0002.0313][.0000.0097.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI; QQCM
+1FA8 ; [.12F3.0020.0008.03A9][.0000.0022.0002.0313][.0000.0097.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI; QQCM
+1F61 ; [.12F3.0020.0002.03C9][.0000.002A.0002.0314] # GREEK SMALL LETTER OMEGA WITH DASIA; QQCM
+1F69 ; [.12F3.0020.0008.03A9][.0000.002A.0002.0314] # GREEK CAPITAL LETTER OMEGA WITH DASIA; QQCM
+1F65 ; [.12F3.0020.0002.03C9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA; QQCM
+1F6D ; [.12F3.0020.0008.03A9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA; QQCM
+1FA5 ; [.12F3.0020.0002.03C9][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI; QQCM
+1FAD ; [.12F3.0020.0008.03A9][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI; QQCM
+1F63 ; [.12F3.0020.0002.03C9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA; QQCM
+1F6B ; [.12F3.0020.0008.03A9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA; QQCM
+1FA3 ; [.12F3.0020.0002.03C9][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI; QQCM
+1FAB ; [.12F3.0020.0008.03A9][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI; QQCM
+1F67 ; [.12F3.0020.0002.03C9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI; QQCM
+1F6F ; [.12F3.0020.0008.03A9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI; QQCM
+1FA7 ; [.12F3.0020.0002.03C9][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FAF ; [.12F3.0020.0008.03A9][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1FA1 ; [.12F3.0020.0002.03C9][.0000.002A.0002.0314][.0000.0097.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI; QQCM
+1FA9 ; [.12F3.0020.0008.03A9][.0000.002A.0002.0314][.0000.0097.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI; QQCM
+03CE ; [.12F3.0020.0002.03C9][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH TONOS; QQCM
+1F7D ; [.12F3.0020.0002.03C9][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH OXIA; QQCM
+038F ; [.12F3.0020.0008.03A9][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH TONOS; QQCM
+1FFB ; [.12F3.0020.0008.03A9][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH OXIA; QQCM
+1FF4 ; [.12F3.0020.0002.03C9][.0000.0032.0002.0301][.0000.0097.0002.0345] # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI; QQCM
+1F7C ; [.12F3.0020.0002.03C9][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH VARIA; QQCM
+1FFA ; [.12F3.0020.0008.03A9][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH VARIA; QQCM
+1FF2 ; [.12F3.0020.0002.03C9][.0000.0035.0002.0300][.0000.0097.0002.0345] # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI; QQCM
+1FF6 ; [.12F3.0020.0002.03C9][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI; QQCM
+1FF7 ; [.12F3.0020.0002.03C9][.0000.0045.0002.0342][.0000.0097.0002.0345] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FF3 ; [.12F3.0020.0002.03C9][.0000.0097.0002.0345] # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI; QQCM
+1FFC ; [.12F3.0020.0008.03A9][.0000.0097.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI; QQCM
+03E1 ; [.12F4.0020.0002.03E1] # GREEK SMALL LETTER SAMPI
+03E0 ; [.12F4.0020.0008.03E0] # GREEK LETTER SAMPI
+03F8 ; [.12F5.0020.0002.03F8] # GREEK SMALL LETTER SHO
+03F7 ; [.12F5.0020.0008.03F7] # GREEK CAPITAL LETTER SHO
+2C81 ; [.12F6.0020.0002.2C81] # COPTIC SMALL LETTER ALFA
+2C80 ; [.12F6.0020.0008.2C80] # COPTIC CAPITAL LETTER ALFA
+2C83 ; [.12F7.0020.0002.2C83] # COPTIC SMALL LETTER VIDA
+2C82 ; [.12F7.0020.0008.2C82] # COPTIC CAPITAL LETTER VIDA
+2C85 ; [.12F8.0020.0002.2C85] # COPTIC SMALL LETTER GAMMA
+2C84 ; [.12F8.0020.0008.2C84] # COPTIC CAPITAL LETTER GAMMA
+2C87 ; [.12F9.0020.0002.2C87] # COPTIC SMALL LETTER DALDA
+2C86 ; [.12F9.0020.0008.2C86] # COPTIC CAPITAL LETTER DALDA
+2C89 ; [.12FA.0020.0002.2C89] # COPTIC SMALL LETTER EIE
+2C88 ; [.12FA.0020.0008.2C88] # COPTIC CAPITAL LETTER EIE
+2CB7 ; [.12FB.0020.0002.2CB7] # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB6 ; [.12FB.0020.0008.2CB6] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2C8B ; [.12FC.0020.0002.2C8B] # COPTIC SMALL LETTER SOU
+2C8A ; [.12FC.0020.0008.2C8A] # COPTIC CAPITAL LETTER SOU
+2C8D ; [.12FD.0020.0002.2C8D] # COPTIC SMALL LETTER ZATA
+2C8C ; [.12FD.0020.0008.2C8C] # COPTIC CAPITAL LETTER ZATA
+2C8F ; [.12FE.0020.0002.2C8F] # COPTIC SMALL LETTER HATE
+2C8E ; [.12FE.0020.0008.2C8E] # COPTIC CAPITAL LETTER HATE
+2C91 ; [.12FF.0020.0002.2C91] # COPTIC SMALL LETTER THETHE
+2C90 ; [.12FF.0020.0008.2C90] # COPTIC CAPITAL LETTER THETHE
+2C93 ; [.1300.0020.0002.2C93] # COPTIC SMALL LETTER IAUDA
+2C92 ; [.1300.0020.0008.2C92] # COPTIC CAPITAL LETTER IAUDA
+2C95 ; [.1301.0020.0002.2C95] # COPTIC SMALL LETTER KAPA
+2C94 ; [.1301.0020.0008.2C94] # COPTIC CAPITAL LETTER KAPA
+2CE4 ; [.1301.0020.0004.2CE4][.12F6.0020.0004.2CE4][.1300.0020.001F.2CE4] # COPTIC SYMBOL KAI; QQKN
+2CB9 ; [.1302.0020.0002.2CB9] # COPTIC SMALL LETTER DIALECT-P KAPA
+2CB8 ; [.1302.0020.0008.2CB8] # COPTIC CAPITAL LETTER DIALECT-P KAPA
+2C97 ; [.1303.0020.0002.2C97] # COPTIC SMALL LETTER LAULA
+2C96 ; [.1303.0020.0008.2C96] # COPTIC CAPITAL LETTER LAULA
+2C99 ; [.1304.0020.0002.2C99] # COPTIC SMALL LETTER MI
+2C98 ; [.1304.0020.0008.2C98] # COPTIC CAPITAL LETTER MI
+2C9B ; [.1305.0020.0002.2C9B] # COPTIC SMALL LETTER NI
+2C9A ; [.1305.0020.0008.2C9A] # COPTIC CAPITAL LETTER NI
+2CBB ; [.1306.0020.0002.2CBB] # COPTIC SMALL LETTER DIALECT-P NI
+2CBA ; [.1306.0020.0008.2CBA] # COPTIC CAPITAL LETTER DIALECT-P NI
+2CBD ; [.1307.0020.0002.2CBD] # COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBC ; [.1307.0020.0008.2CBC] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2C9D ; [.1308.0020.0002.2C9D] # COPTIC SMALL LETTER KSI
+2C9C ; [.1308.0020.0008.2C9C] # COPTIC CAPITAL LETTER KSI
+2C9F ; [.1309.0020.0002.2C9F] # COPTIC SMALL LETTER O
+2C9E ; [.1309.0020.0008.2C9E] # COPTIC CAPITAL LETTER O
+2CA1 ; [.130A.0020.0002.2CA1] # COPTIC SMALL LETTER PI
+2CA0 ; [.130A.0020.0008.2CA0] # COPTIC CAPITAL LETTER PI
+2CA3 ; [.130B.0020.0002.2CA3] # COPTIC SMALL LETTER RO
+2CA2 ; [.130B.0020.0008.2CA2] # COPTIC CAPITAL LETTER RO
+2CA5 ; [.130C.0020.0002.2CA5] # COPTIC SMALL LETTER SIMA
+2CA4 ; [.130C.0020.0008.2CA4] # COPTIC CAPITAL LETTER SIMA
+2CA7 ; [.130D.0020.0002.2CA7] # COPTIC SMALL LETTER TAU
+2CA6 ; [.130D.0020.0008.2CA6] # COPTIC CAPITAL LETTER TAU
+2CA9 ; [.130E.0020.0002.2CA9] # COPTIC SMALL LETTER UA
+2CA8 ; [.130E.0020.0008.2CA8] # COPTIC CAPITAL LETTER UA
+2CAB ; [.130F.0020.0002.2CAB] # COPTIC SMALL LETTER FI
+2CAA ; [.130F.0020.0008.2CAA] # COPTIC CAPITAL LETTER FI
+2CAD ; [.1310.0020.0002.2CAD] # COPTIC SMALL LETTER KHI
+2CAC ; [.1310.0020.0008.2CAC] # COPTIC CAPITAL LETTER KHI
+2CAF ; [.1311.0020.0002.2CAF] # COPTIC SMALL LETTER PSI
+2CAE ; [.1311.0020.0008.2CAE] # COPTIC CAPITAL LETTER PSI
+2CB1 ; [.1312.0020.0002.2CB1] # COPTIC SMALL LETTER OOU
+2CB0 ; [.1312.0020.0008.2CB0] # COPTIC CAPITAL LETTER OOU
+2CBF ; [.1313.0020.0002.2CBF] # COPTIC SMALL LETTER OLD COPTIC OOU
+2CBE ; [.1313.0020.0008.2CBE] # COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CC1 ; [.1314.0020.0002.2CC1] # COPTIC SMALL LETTER SAMPI
+2CC0 ; [.1314.0020.0008.2CC0] # COPTIC CAPITAL LETTER SAMPI
+03E3 ; [.1315.0020.0002.03E3] # COPTIC SMALL LETTER SHEI
+03E2 ; [.1315.0020.0008.03E2] # COPTIC CAPITAL LETTER SHEI
+2CC3 ; [.1316.0020.0002.2CC3] # COPTIC SMALL LETTER CROSSED SHEI
+2CC2 ; [.1316.0020.0008.2CC2] # COPTIC CAPITAL LETTER CROSSED SHEI
+2CC5 ; [.1317.0020.0002.2CC5] # COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC4 ; [.1317.0020.0008.2CC4] # COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC7 ; [.1318.0020.0002.2CC7] # COPTIC SMALL LETTER OLD COPTIC ESH
+2CC6 ; [.1318.0020.0008.2CC6] # COPTIC CAPITAL LETTER OLD COPTIC ESH
+03E5 ; [.1319.0020.0002.03E5] # COPTIC SMALL LETTER FEI
+03E4 ; [.1319.0020.0008.03E4] # COPTIC CAPITAL LETTER FEI
+03E7 ; [.131A.0020.0002.03E7] # COPTIC SMALL LETTER KHEI
+03E6 ; [.131A.0020.0008.03E6] # COPTIC CAPITAL LETTER KHEI
+2CC9 ; [.131B.0020.0002.2CC9] # COPTIC SMALL LETTER AKHMIMIC KHEI
+2CC8 ; [.131B.0020.0008.2CC8] # COPTIC CAPITAL LETTER AKHMIMIC KHEI
+03E9 ; [.131C.0020.0002.03E9] # COPTIC SMALL LETTER HORI
+03E8 ; [.131C.0020.0008.03E8] # COPTIC CAPITAL LETTER HORI
+2CCB ; [.131D.0020.0002.2CCB] # COPTIC SMALL LETTER DIALECT-P HORI
+2CCA ; [.131D.0020.0008.2CCA] # COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCD ; [.131E.0020.0002.2CCD] # COPTIC SMALL LETTER OLD COPTIC HORI
+2CCC ; [.131E.0020.0008.2CCC] # COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCF ; [.131F.0020.0002.2CCF] # COPTIC SMALL LETTER OLD COPTIC HA
+2CCE ; [.131F.0020.0008.2CCE] # COPTIC CAPITAL LETTER OLD COPTIC HA
+2CD1 ; [.1320.0020.0002.2CD1] # COPTIC SMALL LETTER L-SHAPED HA
+2CD0 ; [.1320.0020.0008.2CD0] # COPTIC CAPITAL LETTER L-SHAPED HA
+2CD3 ; [.1321.0020.0002.2CD3] # COPTIC SMALL LETTER OLD COPTIC HEI
+2CD2 ; [.1321.0020.0008.2CD2] # COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD5 ; [.1322.0020.0002.2CD5] # COPTIC SMALL LETTER OLD COPTIC HAT
+2CD4 ; [.1322.0020.0008.2CD4] # COPTIC CAPITAL LETTER OLD COPTIC HAT
+03EB ; [.1323.0020.0002.03EB] # COPTIC SMALL LETTER GANGIA
+03EA ; [.1323.0020.0008.03EA] # COPTIC CAPITAL LETTER GANGIA
+2CD7 ; [.1324.0020.0002.2CD7] # COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD6 ; [.1324.0020.0008.2CD6] # COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+03ED ; [.1325.0020.0002.03ED] # COPTIC SMALL LETTER SHIMA
+03EC ; [.1325.0020.0008.03EC] # COPTIC CAPITAL LETTER SHIMA
+2CD9 ; [.1326.0020.0002.2CD9] # COPTIC SMALL LETTER OLD COPTIC DJA
+2CD8 ; [.1326.0020.0008.2CD8] # COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CDB ; [.1327.0020.0002.2CDB] # COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDA ; [.1327.0020.0008.2CDA] # COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDD ; [.1328.0020.0002.2CDD] # COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDC ; [.1328.0020.0008.2CDC] # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+03EF ; [.1329.0020.0002.03EF] # COPTIC SMALL LETTER DEI
+03EE ; [.1329.0020.0008.03EE] # COPTIC CAPITAL LETTER DEI
+2CB3 ; [.132A.0020.0002.2CB3] # COPTIC SMALL LETTER DIALECT-P ALEF
+2CB2 ; [.132A.0020.0008.2CB2] # COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB5 ; [.132B.0020.0002.2CB5] # COPTIC SMALL LETTER OLD COPTIC AIN
+2CB4 ; [.132B.0020.0008.2CB4] # COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CDF ; [.132C.0020.0002.2CDF] # COPTIC SMALL LETTER OLD NUBIAN NGI
+2CDE ; [.132C.0020.0008.2CDE] # COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CE1 ; [.132D.0020.0002.2CE1] # COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE0 ; [.132D.0020.0008.2CE0] # COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE3 ; [.132E.0020.0002.2CE3] # COPTIC SMALL LETTER OLD NUBIAN WAU
+2CE2 ; [.132E.0020.0008.2CE2] # COPTIC CAPITAL LETTER OLD NUBIAN WAU
+0430 ; [.132F.0020.0002.0430] # CYRILLIC SMALL LETTER A
+0410 ; [.132F.0020.0008.0410] # CYRILLIC CAPITAL LETTER A
+04D1 ; [.1333.0020.0002.04D1] # CYRILLIC SMALL LETTER A WITH BREVE
+0430 0306 ; [.1333.0020.0002.04D1] # CYRILLIC SMALL LETTER A WITH BREVE
+04D0 ; [.1333.0020.0008.04D0] # CYRILLIC CAPITAL LETTER A WITH BREVE
+0410 0306 ; [.1333.0020.0008.04D0] # CYRILLIC CAPITAL LETTER A WITH BREVE
+04D3 ; [.1337.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
+0430 0308 ; [.1337.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D2 ; [.1337.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+0410 0308 ; [.1337.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D9 ; [.133B.0020.0002.04D9] # CYRILLIC SMALL LETTER SCHWA
+04D8 ; [.133B.0020.0008.04D8] # CYRILLIC CAPITAL LETTER SCHWA
+04DB ; [.133F.0020.0002.04DB] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04D9 0308 ; [.133F.0020.0002.04DB] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DA ; [.133F.0020.0008.04DA] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04D8 0308 ; [.133F.0020.0008.04DA] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04D5 ; [.1343.0020.0002.04D5] # CYRILLIC SMALL LIGATURE A IE
+04D4 ; [.1343.0020.0008.04D4] # CYRILLIC CAPITAL LIGATURE A IE
+0431 ; [.1347.0020.0002.0431] # CYRILLIC SMALL LETTER BE
+0411 ; [.1347.0020.0008.0411] # CYRILLIC CAPITAL LETTER BE
+0432 ; [.134B.0020.0002.0432] # CYRILLIC SMALL LETTER VE
+0412 ; [.134B.0020.0008.0412] # CYRILLIC CAPITAL LETTER VE
+0433 ; [.134F.0020.0002.0433] # CYRILLIC SMALL LETTER GHE
+0413 ; [.134F.0020.0008.0413] # CYRILLIC CAPITAL LETTER GHE
+0491 ; [.134F.0020.0004.0491][.0000.019A.0004.0491] # CYRILLIC SMALL LETTER GHE WITH UPTURN; QQKN
+0490 ; [.134F.0020.000A.0490][.0000.019A.0004.0490] # CYRILLIC CAPITAL LETTER GHE WITH UPTURN; QQKN
+0493 ; [.1353.0020.0002.0493] # CYRILLIC SMALL LETTER GHE WITH STROKE
+0492 ; [.1353.0020.0008.0492] # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+04FB ; [.1357.0020.0002.04FB] # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+04FA ; [.1357.0020.0008.04FA] # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+0495 ; [.135B.0020.0002.0495] # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0494 ; [.135B.0020.0008.0494] # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+04F7 ; [.135F.0020.0002.04F7] # CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F6 ; [.135F.0020.0008.04F6] # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+0434 ; [.1363.0020.0002.0434] # CYRILLIC SMALL LETTER DE
+0414 ; [.1363.0020.0008.0414] # CYRILLIC CAPITAL LETTER DE
+0501 ; [.1367.0020.0002.0501] # CYRILLIC SMALL LETTER KOMI DE
+0500 ; [.1367.0020.0008.0500] # CYRILLIC CAPITAL LETTER KOMI DE
+0452 ; [.1368.0020.0002.0452] # CYRILLIC SMALL LETTER DJE
+0402 ; [.1368.0020.0008.0402] # CYRILLIC CAPITAL LETTER DJE
+0503 ; [.136C.0020.0002.0503] # CYRILLIC SMALL LETTER KOMI DJE
+0502 ; [.136C.0020.0008.0502] # CYRILLIC CAPITAL LETTER KOMI DJE
+0453 ; [.136D.0020.0002.0453] # CYRILLIC SMALL LETTER GJE
+0433 0301 ; [.136D.0020.0002.0453] # CYRILLIC SMALL LETTER GJE
+0433 0341 ; [.136D.0020.0002.0453] # CYRILLIC SMALL LETTER GJE
+0403 ; [.136D.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE
+0413 0301 ; [.136D.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE
+0413 0341 ; [.136D.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE
+0499 ; [.1371.0020.0002.0499] # CYRILLIC SMALL LETTER ZE WITH DESCENDER
+0498 ; [.1371.0020.0008.0498] # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0435 ; [.1375.0020.0002.0435] # CYRILLIC SMALL LETTER IE
+0415 ; [.1375.0020.0008.0415] # CYRILLIC CAPITAL LETTER IE
+0450 ; [.1375.0020.0002.0435][.0000.0035.0002.0300] # CYRILLIC SMALL LETTER IE WITH GRAVE; QQCM
+0400 ; [.1375.0020.0008.0415][.0000.0035.0002.0300] # CYRILLIC CAPITAL LETTER IE WITH GRAVE; QQCM
+0451 ; [.1375.0020.0002.0435][.0000.0047.0002.0308] # CYRILLIC SMALL LETTER IO; QQCM
+0401 ; [.1375.0020.0008.0415][.0000.0047.0002.0308] # CYRILLIC CAPITAL LETTER IO; QQCM
+04D7 ; [.1379.0020.0002.04D7] # CYRILLIC SMALL LETTER IE WITH BREVE
+0435 0306 ; [.1379.0020.0002.04D7] # CYRILLIC SMALL LETTER IE WITH BREVE
+04D6 ; [.1379.0020.0008.04D6] # CYRILLIC CAPITAL LETTER IE WITH BREVE
+0415 0306 ; [.1379.0020.0008.04D6] # CYRILLIC CAPITAL LETTER IE WITH BREVE
+0454 ; [.137D.0020.0002.0454] # CYRILLIC SMALL LETTER UKRAINIAN IE
+0404 ; [.137D.0020.0008.0404] # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0436 ; [.1381.0020.0002.0436] # CYRILLIC SMALL LETTER ZHE
+0416 ; [.1381.0020.0008.0416] # CYRILLIC CAPITAL LETTER ZHE
+04C2 ; [.1381.0020.0002.0436][.0000.0037.0002.0306] # CYRILLIC SMALL LETTER ZHE WITH BREVE; QQCM
+04C1 ; [.1381.0020.0008.0416][.0000.0037.0002.0306] # CYRILLIC CAPITAL LETTER ZHE WITH BREVE; QQCM
+04DD ; [.1385.0020.0002.04DD] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+0436 0308 ; [.1385.0020.0002.04DD] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DC ; [.1385.0020.0008.04DC] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+0416 0308 ; [.1385.0020.0008.04DC] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+0497 ; [.1389.0020.0002.0497] # CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0496 ; [.1389.0020.0008.0496] # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0437 ; [.138D.0020.0002.0437] # CYRILLIC SMALL LETTER ZE
+0417 ; [.138D.0020.0008.0417] # CYRILLIC CAPITAL LETTER ZE
+0505 ; [.1391.0020.0002.0505] # CYRILLIC SMALL LETTER KOMI ZJE
+0504 ; [.1391.0020.0008.0504] # CYRILLIC CAPITAL LETTER KOMI ZJE
+0511 ; [.1392.0020.0002.0511] # CYRILLIC SMALL LETTER REVERSED ZE
+0510 ; [.1392.0020.0008.0510] # CYRILLIC CAPITAL LETTER REVERSED ZE
+04DF ; [.1393.0020.0002.04DF] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+0437 0308 ; [.1393.0020.0002.04DF] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04DE ; [.1393.0020.0008.04DE] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+0417 0308 ; [.1393.0020.0008.04DE] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+0455 ; [.1397.0020.0002.0455] # CYRILLIC SMALL LETTER DZE
+0405 ; [.1397.0020.0008.0405] # CYRILLIC CAPITAL LETTER DZE
+04E1 ; [.139B.0020.0002.04E1] # CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E0 ; [.139B.0020.0008.04E0] # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+0507 ; [.139F.0020.0002.0507] # CYRILLIC SMALL LETTER KOMI DZJE
+0506 ; [.139F.0020.0008.0506] # CYRILLIC CAPITAL LETTER KOMI DZJE
+0438 ; [.13A0.0020.0002.0438] # CYRILLIC SMALL LETTER I
+0418 ; [.13A0.0020.0008.0418] # CYRILLIC CAPITAL LETTER I
+045D ; [.13A0.0020.0002.0438][.0000.0035.0002.0300] # CYRILLIC SMALL LETTER I WITH GRAVE; QQCM
+040D ; [.13A0.0020.0008.0418][.0000.0035.0002.0300] # CYRILLIC CAPITAL LETTER I WITH GRAVE; QQCM
+04E3 ; [.13A0.0020.0002.0438][.0000.005B.0002.0304] # CYRILLIC SMALL LETTER I WITH MACRON; QQCM
+04E2 ; [.13A0.0020.0008.0418][.0000.005B.0002.0304] # CYRILLIC CAPITAL LETTER I WITH MACRON; QQCM
+048B ; [.13A4.0020.0002.048B] # CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048A ; [.13A4.0020.0008.048A] # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+04E5 ; [.13A8.0020.0002.04E5] # CYRILLIC SMALL LETTER I WITH DIAERESIS
+0438 0308 ; [.13A8.0020.0002.04E5] # CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E4 ; [.13A8.0020.0008.04E4] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+0418 0308 ; [.13A8.0020.0008.04E4] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+0456 ; [.13AC.0020.0002.0456] # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0406 ; [.13AC.0020.0008.0406] # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0457 ; [.13B0.0020.0002.0457] # CYRILLIC SMALL LETTER YI
+0456 0308 ; [.13B0.0020.0002.0457] # CYRILLIC SMALL LETTER YI
+0407 ; [.13B0.0020.0008.0407] # CYRILLIC CAPITAL LETTER YI
+0406 0308 ; [.13B0.0020.0008.0407] # CYRILLIC CAPITAL LETTER YI
+0439 ; [.13B4.0020.0002.0439] # CYRILLIC SMALL LETTER SHORT I
+0438 0306 ; [.13B4.0020.0002.0439] # CYRILLIC SMALL LETTER SHORT I
+0419 ; [.13B4.0020.0008.0419] # CYRILLIC CAPITAL LETTER SHORT I
+0418 0306 ; [.13B4.0020.0008.0419] # CYRILLIC CAPITAL LETTER SHORT I
+0458 ; [.13B8.0020.0002.0458] # CYRILLIC SMALL LETTER JE
+0408 ; [.13B8.0020.0008.0408] # CYRILLIC CAPITAL LETTER JE
+043A ; [.13BC.0020.0002.043A] # CYRILLIC SMALL LETTER KA
+041A ; [.13BC.0020.0008.041A] # CYRILLIC CAPITAL LETTER KA
+049B ; [.13C0.0020.0002.049B] # CYRILLIC SMALL LETTER KA WITH DESCENDER
+049A ; [.13C0.0020.0008.049A] # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+04C4 ; [.13C4.0020.0002.04C4] # CYRILLIC SMALL LETTER KA WITH HOOK
+04C3 ; [.13C4.0020.0008.04C3] # CYRILLIC CAPITAL LETTER KA WITH HOOK
+04A1 ; [.13C8.0020.0002.04A1] # CYRILLIC SMALL LETTER BASHKIR KA
+04A0 ; [.13C8.0020.0008.04A0] # CYRILLIC CAPITAL LETTER BASHKIR KA
+049F ; [.13CC.0020.0002.049F] # CYRILLIC SMALL LETTER KA WITH STROKE
+049E ; [.13CC.0020.0008.049E] # CYRILLIC CAPITAL LETTER KA WITH STROKE
+049D ; [.13D0.0020.0002.049D] # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049C ; [.13D0.0020.0008.049C] # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+043B ; [.13D4.0020.0002.043B] # CYRILLIC SMALL LETTER EL
+041B ; [.13D4.0020.0008.041B] # CYRILLIC CAPITAL LETTER EL
+1D2B ; [.13D8.0020.0002.1D2B] # CYRILLIC LETTER SMALL CAPITAL EL
+04C6 ; [.13D9.0020.0002.04C6] # CYRILLIC SMALL LETTER EL WITH TAIL
+04C5 ; [.13D9.0020.0008.04C5] # CYRILLIC CAPITAL LETTER EL WITH TAIL
+0513 ; [.13DD.0020.0002.0513] # CYRILLIC SMALL LETTER EL WITH HOOK
+0512 ; [.13DD.0020.0008.0512] # CYRILLIC CAPITAL LETTER EL WITH HOOK
+0459 ; [.13DE.0020.0002.0459] # CYRILLIC SMALL LETTER LJE
+0409 ; [.13DE.0020.0008.0409] # CYRILLIC CAPITAL LETTER LJE
+0509 ; [.13E2.0020.0002.0509] # CYRILLIC SMALL LETTER KOMI LJE
+0508 ; [.13E2.0020.0008.0508] # CYRILLIC CAPITAL LETTER KOMI LJE
+043C ; [.13E3.0020.0002.043C] # CYRILLIC SMALL LETTER EM
+041C ; [.13E3.0020.0008.041C] # CYRILLIC CAPITAL LETTER EM
+04CE ; [.13E7.0020.0002.04CE] # CYRILLIC SMALL LETTER EM WITH TAIL
+04CD ; [.13E7.0020.0008.04CD] # CYRILLIC CAPITAL LETTER EM WITH TAIL
+043D ; [.13EB.0020.0002.043D] # CYRILLIC SMALL LETTER EN
+041D ; [.13EB.0020.0008.041D] # CYRILLIC CAPITAL LETTER EN
+1D78 ; [.13EB.0020.0014.1D78] # MODIFIER LETTER CYRILLIC EN; QQK
+04CA ; [.13EF.0020.0002.04CA] # CYRILLIC SMALL LETTER EN WITH TAIL
+04C9 ; [.13EF.0020.0008.04C9] # CYRILLIC CAPITAL LETTER EN WITH TAIL
+04A3 ; [.13F3.0020.0002.04A3] # CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A2 ; [.13F3.0020.0008.04A2] # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04C8 ; [.13F7.0020.0002.04C8] # CYRILLIC SMALL LETTER EN WITH HOOK
+04C7 ; [.13F7.0020.0008.04C7] # CYRILLIC CAPITAL LETTER EN WITH HOOK
+04A5 ; [.13FB.0020.0002.04A5] # CYRILLIC SMALL LIGATURE EN GHE
+04A4 ; [.13FB.0020.0008.04A4] # CYRILLIC CAPITAL LIGATURE EN GHE
+045A ; [.13FF.0020.0002.045A] # CYRILLIC SMALL LETTER NJE
+040A ; [.13FF.0020.0008.040A] # CYRILLIC CAPITAL LETTER NJE
+050B ; [.1403.0020.0002.050B] # CYRILLIC SMALL LETTER KOMI NJE
+050A ; [.1403.0020.0008.050A] # CYRILLIC CAPITAL LETTER KOMI NJE
+043E ; [.1404.0020.0002.043E] # CYRILLIC SMALL LETTER O
+041E ; [.1404.0020.0008.041E] # CYRILLIC CAPITAL LETTER O
+04E7 ; [.1408.0020.0002.04E7] # CYRILLIC SMALL LETTER O WITH DIAERESIS
+043E 0308 ; [.1408.0020.0002.04E7] # CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E6 ; [.1408.0020.0008.04E6] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+041E 0308 ; [.1408.0020.0008.04E6] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E9 ; [.140C.0020.0002.04E9] # CYRILLIC SMALL LETTER BARRED O
+04E8 ; [.140C.0020.0008.04E8] # CYRILLIC CAPITAL LETTER BARRED O
+04EB ; [.1410.0020.0002.04EB] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04E9 0308 ; [.1410.0020.0002.04EB] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EA ; [.1410.0020.0008.04EA] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04E8 0308 ; [.1410.0020.0008.04EA] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+043F ; [.1414.0020.0002.043F] # CYRILLIC SMALL LETTER PE
+041F ; [.1414.0020.0008.041F] # CYRILLIC CAPITAL LETTER PE
+04A7 ; [.1418.0020.0002.04A7] # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A6 ; [.1418.0020.0008.04A6] # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+0481 ; [.141C.0020.0002.0481] # CYRILLIC SMALL LETTER KOPPA
+0480 ; [.141C.0020.0008.0480] # CYRILLIC CAPITAL LETTER KOPPA
+0440 ; [.1420.0020.0002.0440] # CYRILLIC SMALL LETTER ER
+0420 ; [.1420.0020.0008.0420] # CYRILLIC CAPITAL LETTER ER
+048F ; [.1424.0020.0002.048F] # CYRILLIC SMALL LETTER ER WITH TICK
+048E ; [.1424.0020.0008.048E] # CYRILLIC CAPITAL LETTER ER WITH TICK
+0441 ; [.1428.0020.0002.0441] # CYRILLIC SMALL LETTER ES
+0421 ; [.1428.0020.0008.0421] # CYRILLIC CAPITAL LETTER ES
+050D ; [.142C.0020.0002.050D] # CYRILLIC SMALL LETTER KOMI SJE
+050C ; [.142C.0020.0008.050C] # CYRILLIC CAPITAL LETTER KOMI SJE
+04AB ; [.142D.0020.0002.04AB] # CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AA ; [.142D.0020.0008.04AA] # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+0442 ; [.1431.0020.0002.0442] # CYRILLIC SMALL LETTER TE
+0422 ; [.1431.0020.0008.0422] # CYRILLIC CAPITAL LETTER TE
+050F ; [.1435.0020.0002.050F] # CYRILLIC SMALL LETTER KOMI TJE
+050E ; [.1435.0020.0008.050E] # CYRILLIC CAPITAL LETTER KOMI TJE
+04AD ; [.1436.0020.0002.04AD] # CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AC ; [.1436.0020.0008.04AC] # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+045B ; [.143A.0020.0002.045B] # CYRILLIC SMALL LETTER TSHE
+040B ; [.143A.0020.0008.040B] # CYRILLIC CAPITAL LETTER TSHE
+045C ; [.143E.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+043A 0301 ; [.143E.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+043A 0341 ; [.143E.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+040C ; [.143E.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+041A 0301 ; [.143E.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+041A 0341 ; [.143E.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+0443 ; [.1442.0020.0002.0443] # CYRILLIC SMALL LETTER U
+0423 ; [.1442.0020.0008.0423] # CYRILLIC CAPITAL LETTER U
+04EF ; [.1442.0020.0002.0443][.0000.005B.0002.0304] # CYRILLIC SMALL LETTER U WITH MACRON; QQCM
+04EE ; [.1442.0020.0008.0423][.0000.005B.0002.0304] # CYRILLIC CAPITAL LETTER U WITH MACRON; QQCM
+045E ; [.1446.0020.0002.045E] # CYRILLIC SMALL LETTER SHORT U
+0443 0306 ; [.1446.0020.0002.045E] # CYRILLIC SMALL LETTER SHORT U
+040E ; [.1446.0020.0008.040E] # CYRILLIC CAPITAL LETTER SHORT U
+0423 0306 ; [.1446.0020.0008.040E] # CYRILLIC CAPITAL LETTER SHORT U
+04F1 ; [.144A.0020.0002.04F1] # CYRILLIC SMALL LETTER U WITH DIAERESIS
+0443 0308 ; [.144A.0020.0002.04F1] # CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F0 ; [.144A.0020.0008.04F0] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+0423 0308 ; [.144A.0020.0008.04F0] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F3 ; [.144E.0020.0002.04F3] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+0443 030B ; [.144E.0020.0002.04F3] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F2 ; [.144E.0020.0008.04F2] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+0423 030B ; [.144E.0020.0008.04F2] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04AF ; [.1452.0020.0002.04AF] # CYRILLIC SMALL LETTER STRAIGHT U
+04AE ; [.1452.0020.0008.04AE] # CYRILLIC CAPITAL LETTER STRAIGHT U
+04B1 ; [.1456.0020.0002.04B1] # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B0 ; [.1456.0020.0008.04B0] # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+0479 ; [.145A.0020.0002.0479] # CYRILLIC SMALL LETTER UK
+0478 ; [.145A.0020.0008.0478] # CYRILLIC CAPITAL LETTER UK
+0444 ; [.145E.0020.0002.0444] # CYRILLIC SMALL LETTER EF
+0424 ; [.145E.0020.0008.0424] # CYRILLIC CAPITAL LETTER EF
+0445 ; [.1462.0020.0002.0445] # CYRILLIC SMALL LETTER HA
+0425 ; [.1462.0020.0008.0425] # CYRILLIC CAPITAL LETTER HA
+04FD ; [.1466.0020.0002.04FD] # CYRILLIC SMALL LETTER HA WITH HOOK
+04FC ; [.1466.0020.0008.04FC] # CYRILLIC CAPITAL LETTER HA WITH HOOK
+04FF ; [.146A.0020.0002.04FF] # CYRILLIC SMALL LETTER HA WITH STROKE
+04FE ; [.146A.0020.0008.04FE] # CYRILLIC CAPITAL LETTER HA WITH STROKE
+04B3 ; [.146E.0020.0002.04B3] # CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B2 ; [.146E.0020.0008.04B2] # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04BB ; [.1472.0020.0002.04BB] # CYRILLIC SMALL LETTER SHHA
+04BA ; [.1472.0020.0008.04BA] # CYRILLIC CAPITAL LETTER SHHA
+0461 ; [.1476.0020.0002.0461] # CYRILLIC SMALL LETTER OMEGA
+0460 ; [.1476.0020.0008.0460] # CYRILLIC CAPITAL LETTER OMEGA
+047F ; [.147A.0020.0002.047F] # CYRILLIC SMALL LETTER OT
+047E ; [.147A.0020.0008.047E] # CYRILLIC CAPITAL LETTER OT
+047D ; [.147E.0020.0002.047D] # CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047C ; [.147E.0020.0008.047C] # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047B ; [.1482.0020.0002.047B] # CYRILLIC SMALL LETTER ROUND OMEGA
+047A ; [.1482.0020.0008.047A] # CYRILLIC CAPITAL LETTER ROUND OMEGA
+0446 ; [.1486.0020.0002.0446] # CYRILLIC SMALL LETTER TSE
+0426 ; [.1486.0020.0008.0426] # CYRILLIC CAPITAL LETTER TSE
+04B5 ; [.148A.0020.0002.04B5] # CYRILLIC SMALL LIGATURE TE TSE
+04B4 ; [.148A.0020.0008.04B4] # CYRILLIC CAPITAL LIGATURE TE TSE
+0447 ; [.148E.0020.0002.0447] # CYRILLIC SMALL LETTER CHE
+0427 ; [.148E.0020.0008.0427] # CYRILLIC CAPITAL LETTER CHE
+04F5 ; [.1492.0020.0002.04F5] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+0447 0308 ; [.1492.0020.0002.04F5] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F4 ; [.1492.0020.0008.04F4] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+0427 0308 ; [.1492.0020.0008.04F4] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04B7 ; [.1496.0020.0002.04B7] # CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B6 ; [.1496.0020.0008.04B6] # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04CC ; [.149A.0020.0002.04CC] # CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CB ; [.149A.0020.0008.04CB] # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04B9 ; [.149E.0020.0002.04B9] # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04B8 ; [.149E.0020.0008.04B8] # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04BD ; [.14A2.0020.0002.04BD] # CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BC ; [.14A2.0020.0008.04BC] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BF ; [.14A6.0020.0002.04BF] # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04BE ; [.14A6.0020.0008.04BE] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+045F ; [.14AA.0020.0002.045F] # CYRILLIC SMALL LETTER DZHE
+040F ; [.14AA.0020.0008.040F] # CYRILLIC CAPITAL LETTER DZHE
+0448 ; [.14AE.0020.0002.0448] # CYRILLIC SMALL LETTER SHA
+0428 ; [.14AE.0020.0008.0428] # CYRILLIC CAPITAL LETTER SHA
+0449 ; [.14B2.0020.0002.0449] # CYRILLIC SMALL LETTER SHCHA
+0429 ; [.14B2.0020.0008.0429] # CYRILLIC CAPITAL LETTER SHCHA
+044A ; [.14B6.0020.0002.044A] # CYRILLIC SMALL LETTER HARD SIGN
+042A ; [.14B6.0020.0008.042A] # CYRILLIC CAPITAL LETTER HARD SIGN
+044B ; [.14BA.0020.0002.044B] # CYRILLIC SMALL LETTER YERU
+042B ; [.14BA.0020.0008.042B] # CYRILLIC CAPITAL LETTER YERU
+04F9 ; [.14BE.0020.0002.04F9] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+044B 0308 ; [.14BE.0020.0002.04F9] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+04F8 ; [.14BE.0020.0008.04F8] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+042B 0308 ; [.14BE.0020.0008.04F8] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+044C ; [.14C2.0020.0002.044C] # CYRILLIC SMALL LETTER SOFT SIGN
+042C ; [.14C2.0020.0008.042C] # CYRILLIC CAPITAL LETTER SOFT SIGN
+048D ; [.14C6.0020.0002.048D] # CYRILLIC SMALL LETTER SEMISOFT SIGN
+048C ; [.14C6.0020.0008.048C] # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+0463 ; [.14CA.0020.0002.0463] # CYRILLIC SMALL LETTER YAT
+0462 ; [.14CA.0020.0008.0462] # CYRILLIC CAPITAL LETTER YAT
+044D ; [.14CE.0020.0002.044D] # CYRILLIC SMALL LETTER E
+042D ; [.14CE.0020.0008.042D] # CYRILLIC CAPITAL LETTER E
+04ED ; [.14D2.0020.0002.04ED] # CYRILLIC SMALL LETTER E WITH DIAERESIS
+044D 0308 ; [.14D2.0020.0002.04ED] # CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EC ; [.14D2.0020.0008.04EC] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+042D 0308 ; [.14D2.0020.0008.04EC] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+044E ; [.14D6.0020.0002.044E] # CYRILLIC SMALL LETTER YU
+042E ; [.14D6.0020.0008.042E] # CYRILLIC CAPITAL LETTER YU
+044F ; [.14DA.0020.0002.044F] # CYRILLIC SMALL LETTER YA
+042F ; [.14DA.0020.0008.042F] # CYRILLIC CAPITAL LETTER YA
+0465 ; [.14DE.0020.0002.0465] # CYRILLIC SMALL LETTER IOTIFIED E
+0464 ; [.14DE.0020.0008.0464] # CYRILLIC CAPITAL LETTER IOTIFIED E
+0467 ; [.14E2.0020.0002.0467] # CYRILLIC SMALL LETTER LITTLE YUS
+0466 ; [.14E2.0020.0008.0466] # CYRILLIC CAPITAL LETTER LITTLE YUS
+046B ; [.14E6.0020.0002.046B] # CYRILLIC SMALL LETTER BIG YUS
+046A ; [.14E6.0020.0008.046A] # CYRILLIC CAPITAL LETTER BIG YUS
+0469 ; [.14EA.0020.0002.0469] # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+0468 ; [.14EA.0020.0008.0468] # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+046D ; [.14EE.0020.0002.046D] # CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046C ; [.14EE.0020.0008.046C] # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046F ; [.14F2.0020.0002.046F] # CYRILLIC SMALL LETTER KSI
+046E ; [.14F2.0020.0008.046E] # CYRILLIC CAPITAL LETTER KSI
+0471 ; [.14F6.0020.0002.0471] # CYRILLIC SMALL LETTER PSI
+0470 ; [.14F6.0020.0008.0470] # CYRILLIC CAPITAL LETTER PSI
+0473 ; [.14FA.0020.0002.0473] # CYRILLIC SMALL LETTER FITA
+0472 ; [.14FA.0020.0008.0472] # CYRILLIC CAPITAL LETTER FITA
+0475 ; [.14FE.0020.0002.0475] # CYRILLIC SMALL LETTER IZHITSA
+0474 ; [.14FE.0020.0008.0474] # CYRILLIC CAPITAL LETTER IZHITSA
+0477 ; [.1502.0020.0002.0477] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0475 030F ; [.1502.0020.0002.0477] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0476 ; [.1502.0020.0008.0476] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0474 030F ; [.1502.0020.0008.0476] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+04A9 ; [.1506.0020.0002.04A9] # CYRILLIC SMALL LETTER ABKHASIAN HA
+04A8 ; [.1506.0020.0008.04A8] # CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04CF ; [.150A.0020.0002.04CF] # CYRILLIC SMALL LETTER PALOCHKA
+04C0 ; [.150A.0020.0008.04C0] # CYRILLIC LETTER PALOCHKA
+2C30 ; [.150E.0020.0002.2C30] # GLAGOLITIC SMALL LETTER AZU
+2C00 ; [.150E.0020.0008.2C00] # GLAGOLITIC CAPITAL LETTER AZU
+2C31 ; [.150F.0020.0002.2C31] # GLAGOLITIC SMALL LETTER BUKY
+2C01 ; [.150F.0020.0008.2C01] # GLAGOLITIC CAPITAL LETTER BUKY
+2C32 ; [.1510.0020.0002.2C32] # GLAGOLITIC SMALL LETTER VEDE
+2C02 ; [.1510.0020.0008.2C02] # GLAGOLITIC CAPITAL LETTER VEDE
+2C33 ; [.1511.0020.0002.2C33] # GLAGOLITIC SMALL LETTER GLAGOLI
+2C03 ; [.1511.0020.0008.2C03] # GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C34 ; [.1512.0020.0002.2C34] # GLAGOLITIC SMALL LETTER DOBRO
+2C04 ; [.1512.0020.0008.2C04] # GLAGOLITIC CAPITAL LETTER DOBRO
+2C35 ; [.1513.0020.0002.2C35] # GLAGOLITIC SMALL LETTER YESTU
+2C05 ; [.1513.0020.0008.2C05] # GLAGOLITIC CAPITAL LETTER YESTU
+2C36 ; [.1514.0020.0002.2C36] # GLAGOLITIC SMALL LETTER ZHIVETE
+2C06 ; [.1514.0020.0008.2C06] # GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C37 ; [.1515.0020.0002.2C37] # GLAGOLITIC SMALL LETTER DZELO
+2C07 ; [.1515.0020.0008.2C07] # GLAGOLITIC CAPITAL LETTER DZELO
+2C38 ; [.1516.0020.0002.2C38] # GLAGOLITIC SMALL LETTER ZEMLJA
+2C08 ; [.1516.0020.0008.2C08] # GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C39 ; [.1517.0020.0002.2C39] # GLAGOLITIC SMALL LETTER IZHE
+2C09 ; [.1517.0020.0008.2C09] # GLAGOLITIC CAPITAL LETTER IZHE
+2C3A ; [.1518.0020.0002.2C3A] # GLAGOLITIC SMALL LETTER INITIAL IZHE
+2C0A ; [.1518.0020.0008.2C0A] # GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C3B ; [.1519.0020.0002.2C3B] # GLAGOLITIC SMALL LETTER I
+2C0B ; [.1519.0020.0008.2C0B] # GLAGOLITIC CAPITAL LETTER I
+2C3C ; [.151A.0020.0002.2C3C] # GLAGOLITIC SMALL LETTER DJERVI
+2C0C ; [.151A.0020.0008.2C0C] # GLAGOLITIC CAPITAL LETTER DJERVI
+2C3D ; [.151B.0020.0002.2C3D] # GLAGOLITIC SMALL LETTER KAKO
+2C0D ; [.151B.0020.0008.2C0D] # GLAGOLITIC CAPITAL LETTER KAKO
+2C3E ; [.151C.0020.0002.2C3E] # GLAGOLITIC SMALL LETTER LJUDIJE
+2C0E ; [.151C.0020.0008.2C0E] # GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C3F ; [.151D.0020.0002.2C3F] # GLAGOLITIC SMALL LETTER MYSLITE
+2C0F ; [.151D.0020.0008.2C0F] # GLAGOLITIC CAPITAL LETTER MYSLITE
+2C40 ; [.151E.0020.0002.2C40] # GLAGOLITIC SMALL LETTER NASHI
+2C10 ; [.151E.0020.0008.2C10] # GLAGOLITIC CAPITAL LETTER NASHI
+2C41 ; [.151F.0020.0002.2C41] # GLAGOLITIC SMALL LETTER ONU
+2C11 ; [.151F.0020.0008.2C11] # GLAGOLITIC CAPITAL LETTER ONU
+2C42 ; [.1520.0020.0002.2C42] # GLAGOLITIC SMALL LETTER POKOJI
+2C12 ; [.1520.0020.0008.2C12] # GLAGOLITIC CAPITAL LETTER POKOJI
+2C43 ; [.1521.0020.0002.2C43] # GLAGOLITIC SMALL LETTER RITSI
+2C13 ; [.1521.0020.0008.2C13] # GLAGOLITIC CAPITAL LETTER RITSI
+2C44 ; [.1522.0020.0002.2C44] # GLAGOLITIC SMALL LETTER SLOVO
+2C14 ; [.1522.0020.0008.2C14] # GLAGOLITIC CAPITAL LETTER SLOVO
+2C45 ; [.1523.0020.0002.2C45] # GLAGOLITIC SMALL LETTER TVRIDO
+2C15 ; [.1523.0020.0008.2C15] # GLAGOLITIC CAPITAL LETTER TVRIDO
+2C46 ; [.1524.0020.0002.2C46] # GLAGOLITIC SMALL LETTER UKU
+2C16 ; [.1524.0020.0008.2C16] # GLAGOLITIC CAPITAL LETTER UKU
+2C47 ; [.1525.0020.0002.2C47] # GLAGOLITIC SMALL LETTER FRITU
+2C17 ; [.1525.0020.0008.2C17] # GLAGOLITIC CAPITAL LETTER FRITU
+2C48 ; [.1526.0020.0002.2C48] # GLAGOLITIC SMALL LETTER HERU
+2C18 ; [.1526.0020.0008.2C18] # GLAGOLITIC CAPITAL LETTER HERU
+2C49 ; [.1527.0020.0002.2C49] # GLAGOLITIC SMALL LETTER OTU
+2C19 ; [.1527.0020.0008.2C19] # GLAGOLITIC CAPITAL LETTER OTU
+2C4A ; [.1528.0020.0002.2C4A] # GLAGOLITIC SMALL LETTER PE
+2C1A ; [.1528.0020.0008.2C1A] # GLAGOLITIC CAPITAL LETTER PE
+2C4B ; [.1529.0020.0002.2C4B] # GLAGOLITIC SMALL LETTER SHTA
+2C1B ; [.1529.0020.0008.2C1B] # GLAGOLITIC CAPITAL LETTER SHTA
+2C4C ; [.152A.0020.0002.2C4C] # GLAGOLITIC SMALL LETTER TSI
+2C1C ; [.152A.0020.0008.2C1C] # GLAGOLITIC CAPITAL LETTER TSI
+2C4D ; [.152B.0020.0002.2C4D] # GLAGOLITIC SMALL LETTER CHRIVI
+2C1D ; [.152B.0020.0008.2C1D] # GLAGOLITIC CAPITAL LETTER CHRIVI
+2C4E ; [.152C.0020.0002.2C4E] # GLAGOLITIC SMALL LETTER SHA
+2C1E ; [.152C.0020.0008.2C1E] # GLAGOLITIC CAPITAL LETTER SHA
+2C4F ; [.152D.0020.0002.2C4F] # GLAGOLITIC SMALL LETTER YERU
+2C1F ; [.152D.0020.0008.2C1F] # GLAGOLITIC CAPITAL LETTER YERU
+2C50 ; [.152E.0020.0002.2C50] # GLAGOLITIC SMALL LETTER YERI
+2C20 ; [.152E.0020.0008.2C20] # GLAGOLITIC CAPITAL LETTER YERI
+2C51 ; [.152F.0020.0002.2C51] # GLAGOLITIC SMALL LETTER YATI
+2C21 ; [.152F.0020.0008.2C21] # GLAGOLITIC CAPITAL LETTER YATI
+2C52 ; [.1530.0020.0002.2C52] # GLAGOLITIC SMALL LETTER SPIDERY HA
+2C22 ; [.1530.0020.0008.2C22] # GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C53 ; [.1531.0020.0002.2C53] # GLAGOLITIC SMALL LETTER YU
+2C23 ; [.1531.0020.0008.2C23] # GLAGOLITIC CAPITAL LETTER YU
+2C54 ; [.1532.0020.0002.2C54] # GLAGOLITIC SMALL LETTER SMALL YUS
+2C24 ; [.1532.0020.0008.2C24] # GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C55 ; [.1533.0020.0002.2C55] # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+2C25 ; [.1533.0020.0008.2C25] # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C56 ; [.1534.0020.0002.2C56] # GLAGOLITIC SMALL LETTER YO
+2C26 ; [.1534.0020.0008.2C26] # GLAGOLITIC CAPITAL LETTER YO
+2C57 ; [.1535.0020.0002.2C57] # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+2C27 ; [.1535.0020.0008.2C27] # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C58 ; [.1536.0020.0002.2C58] # GLAGOLITIC SMALL LETTER BIG YUS
+2C28 ; [.1536.0020.0008.2C28] # GLAGOLITIC CAPITAL LETTER BIG YUS
+2C59 ; [.1537.0020.0002.2C59] # GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+2C29 ; [.1537.0020.0008.2C29] # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C5A ; [.1538.0020.0002.2C5A] # GLAGOLITIC SMALL LETTER FITA
+2C2A ; [.1538.0020.0008.2C2A] # GLAGOLITIC CAPITAL LETTER FITA
+2C5B ; [.1539.0020.0002.2C5B] # GLAGOLITIC SMALL LETTER IZHITSA
+2C2B ; [.1539.0020.0008.2C2B] # GLAGOLITIC CAPITAL LETTER IZHITSA
+2C5C ; [.153A.0020.0002.2C5C] # GLAGOLITIC SMALL LETTER SHTAPIC
+2C2C ; [.153A.0020.0008.2C2C] # GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C5D ; [.153B.0020.0002.2C5D] # GLAGOLITIC SMALL LETTER TROKUTASTI A
+2C2D ; [.153B.0020.0008.2C2D] # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C5E ; [.153C.0020.0002.2C5E] # GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C2E ; [.153C.0020.0008.2C2E] # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+10D0 ; [.153D.0020.0002.10D0] # GEORGIAN LETTER AN
+2D00 ; [.153E.0020.0002.2D00] # GEORGIAN SMALL LETTER AN
+10A0 ; [.153E.0020.0008.10A0] # GEORGIAN CAPITAL LETTER AN
+10D1 ; [.153F.0020.0002.10D1] # GEORGIAN LETTER BAN
+2D01 ; [.1540.0020.0002.2D01] # GEORGIAN SMALL LETTER BAN
+10A1 ; [.1540.0020.0008.10A1] # GEORGIAN CAPITAL LETTER BAN
+10D2 ; [.1541.0020.0002.10D2] # GEORGIAN LETTER GAN
+2D02 ; [.1542.0020.0002.2D02] # GEORGIAN SMALL LETTER GAN
+10A2 ; [.1542.0020.0008.10A2] # GEORGIAN CAPITAL LETTER GAN
+10D3 ; [.1543.0020.0002.10D3] # GEORGIAN LETTER DON
+2D03 ; [.1544.0020.0002.2D03] # GEORGIAN SMALL LETTER DON
+10A3 ; [.1544.0020.0008.10A3] # GEORGIAN CAPITAL LETTER DON
+10D4 ; [.1545.0020.0002.10D4] # GEORGIAN LETTER EN
+2D04 ; [.1546.0020.0002.2D04] # GEORGIAN SMALL LETTER EN
+10A4 ; [.1546.0020.0008.10A4] # GEORGIAN CAPITAL LETTER EN
+10D5 ; [.1547.0020.0002.10D5] # GEORGIAN LETTER VIN
+2D05 ; [.1548.0020.0002.2D05] # GEORGIAN SMALL LETTER VIN
+10A5 ; [.1548.0020.0008.10A5] # GEORGIAN CAPITAL LETTER VIN
+10D6 ; [.1549.0020.0002.10D6] # GEORGIAN LETTER ZEN
+2D06 ; [.154A.0020.0002.2D06] # GEORGIAN SMALL LETTER ZEN
+10A6 ; [.154A.0020.0008.10A6] # GEORGIAN CAPITAL LETTER ZEN
+10F1 ; [.154B.0020.0002.10F1] # GEORGIAN LETTER HE
+2D21 ; [.154C.0020.0002.2D21] # GEORGIAN SMALL LETTER HE
+10C1 ; [.154C.0020.0008.10C1] # GEORGIAN CAPITAL LETTER HE
+10D7 ; [.154D.0020.0002.10D7] # GEORGIAN LETTER TAN
+2D07 ; [.154E.0020.0002.2D07] # GEORGIAN SMALL LETTER TAN
+10A7 ; [.154E.0020.0008.10A7] # GEORGIAN CAPITAL LETTER TAN
+10D8 ; [.154F.0020.0002.10D8] # GEORGIAN LETTER IN
+2D08 ; [.1550.0020.0002.2D08] # GEORGIAN SMALL LETTER IN
+10A8 ; [.1550.0020.0008.10A8] # GEORGIAN CAPITAL LETTER IN
+10D9 ; [.1551.0020.0002.10D9] # GEORGIAN LETTER KAN
+2D09 ; [.1552.0020.0002.2D09] # GEORGIAN SMALL LETTER KAN
+10A9 ; [.1552.0020.0008.10A9] # GEORGIAN CAPITAL LETTER KAN
+10DA ; [.1553.0020.0002.10DA] # GEORGIAN LETTER LAS
+2D0A ; [.1554.0020.0002.2D0A] # GEORGIAN SMALL LETTER LAS
+10AA ; [.1554.0020.0008.10AA] # GEORGIAN CAPITAL LETTER LAS
+10DB ; [.1555.0020.0002.10DB] # GEORGIAN LETTER MAN
+2D0B ; [.1556.0020.0002.2D0B] # GEORGIAN SMALL LETTER MAN
+10AB ; [.1556.0020.0008.10AB] # GEORGIAN CAPITAL LETTER MAN
+10DC ; [.1557.0020.0002.10DC] # GEORGIAN LETTER NAR
+10FC ; [.1557.0020.0014.10FC] # MODIFIER LETTER GEORGIAN NAR; QQK
+2D0C ; [.1558.0020.0002.2D0C] # GEORGIAN SMALL LETTER NAR
+10AC ; [.1558.0020.0008.10AC] # GEORGIAN CAPITAL LETTER NAR
+10F2 ; [.1559.0020.0002.10F2] # GEORGIAN LETTER HIE
+2D22 ; [.155A.0020.0002.2D22] # GEORGIAN SMALL LETTER HIE
+10C2 ; [.155A.0020.0008.10C2] # GEORGIAN CAPITAL LETTER HIE
+10DD ; [.155B.0020.0002.10DD] # GEORGIAN LETTER ON
+2D0D ; [.155C.0020.0002.2D0D] # GEORGIAN SMALL LETTER ON
+10AD ; [.155C.0020.0008.10AD] # GEORGIAN CAPITAL LETTER ON
+10DE ; [.155D.0020.0002.10DE] # GEORGIAN LETTER PAR
+2D0E ; [.155E.0020.0002.2D0E] # GEORGIAN SMALL LETTER PAR
+10AE ; [.155E.0020.0008.10AE] # GEORGIAN CAPITAL LETTER PAR
+10DF ; [.155F.0020.0002.10DF] # GEORGIAN LETTER ZHAR
+2D0F ; [.1560.0020.0002.2D0F] # GEORGIAN SMALL LETTER ZHAR
+10AF ; [.1560.0020.0008.10AF] # GEORGIAN CAPITAL LETTER ZHAR
+10E0 ; [.1561.0020.0002.10E0] # GEORGIAN LETTER RAE
+2D10 ; [.1562.0020.0002.2D10] # GEORGIAN SMALL LETTER RAE
+10B0 ; [.1562.0020.0008.10B0] # GEORGIAN CAPITAL LETTER RAE
+10E1 ; [.1563.0020.0002.10E1] # GEORGIAN LETTER SAN
+2D11 ; [.1564.0020.0002.2D11] # GEORGIAN SMALL LETTER SAN
+10B1 ; [.1564.0020.0008.10B1] # GEORGIAN CAPITAL LETTER SAN
+10E2 ; [.1565.0020.0002.10E2] # GEORGIAN LETTER TAR
+2D12 ; [.1566.0020.0002.2D12] # GEORGIAN SMALL LETTER TAR
+10B2 ; [.1566.0020.0008.10B2] # GEORGIAN CAPITAL LETTER TAR
+10F3 ; [.1567.0020.0002.10F3] # GEORGIAN LETTER WE
+2D23 ; [.1568.0020.0002.2D23] # GEORGIAN SMALL LETTER WE
+10C3 ; [.1568.0020.0008.10C3] # GEORGIAN CAPITAL LETTER WE
+10E3 ; [.1569.0020.0002.10E3] # GEORGIAN LETTER UN
+2D13 ; [.156A.0020.0002.2D13] # GEORGIAN SMALL LETTER UN
+10B3 ; [.156A.0020.0008.10B3] # GEORGIAN CAPITAL LETTER UN
+10E4 ; [.156B.0020.0002.10E4] # GEORGIAN LETTER PHAR
+2D14 ; [.156C.0020.0002.2D14] # GEORGIAN SMALL LETTER PHAR
+10B4 ; [.156C.0020.0008.10B4] # GEORGIAN CAPITAL LETTER PHAR
+10E5 ; [.156D.0020.0002.10E5] # GEORGIAN LETTER KHAR
+2D15 ; [.156E.0020.0002.2D15] # GEORGIAN SMALL LETTER KHAR
+10B5 ; [.156E.0020.0008.10B5] # GEORGIAN CAPITAL LETTER KHAR
+10E6 ; [.156F.0020.0002.10E6] # GEORGIAN LETTER GHAN
+2D16 ; [.1570.0020.0002.2D16] # GEORGIAN SMALL LETTER GHAN
+10B6 ; [.1570.0020.0008.10B6] # GEORGIAN CAPITAL LETTER GHAN
+10E7 ; [.1571.0020.0002.10E7] # GEORGIAN LETTER QAR
+2D17 ; [.1572.0020.0002.2D17] # GEORGIAN SMALL LETTER QAR
+10B7 ; [.1572.0020.0008.10B7] # GEORGIAN CAPITAL LETTER QAR
+10E8 ; [.1573.0020.0002.10E8] # GEORGIAN LETTER SHIN
+2D18 ; [.1574.0020.0002.2D18] # GEORGIAN SMALL LETTER SHIN
+10B8 ; [.1574.0020.0008.10B8] # GEORGIAN CAPITAL LETTER SHIN
+10E9 ; [.1575.0020.0002.10E9] # GEORGIAN LETTER CHIN
+2D19 ; [.1576.0020.0002.2D19] # GEORGIAN SMALL LETTER CHIN
+10B9 ; [.1576.0020.0008.10B9] # GEORGIAN CAPITAL LETTER CHIN
+10EA ; [.1577.0020.0002.10EA] # GEORGIAN LETTER CAN
+2D1A ; [.1578.0020.0002.2D1A] # GEORGIAN SMALL LETTER CAN
+10BA ; [.1578.0020.0008.10BA] # GEORGIAN CAPITAL LETTER CAN
+10EB ; [.1579.0020.0002.10EB] # GEORGIAN LETTER JIL
+2D1B ; [.157A.0020.0002.2D1B] # GEORGIAN SMALL LETTER JIL
+10BB ; [.157A.0020.0008.10BB] # GEORGIAN CAPITAL LETTER JIL
+10EC ; [.157B.0020.0002.10EC] # GEORGIAN LETTER CIL
+2D1C ; [.157C.0020.0002.2D1C] # GEORGIAN SMALL LETTER CIL
+10BC ; [.157C.0020.0008.10BC] # GEORGIAN CAPITAL LETTER CIL
+10ED ; [.157D.0020.0002.10ED] # GEORGIAN LETTER CHAR
+2D1D ; [.157E.0020.0002.2D1D] # GEORGIAN SMALL LETTER CHAR
+10BD ; [.157E.0020.0008.10BD] # GEORGIAN CAPITAL LETTER CHAR
+10EE ; [.157F.0020.0002.10EE] # GEORGIAN LETTER XAN
+2D1E ; [.1580.0020.0002.2D1E] # GEORGIAN SMALL LETTER XAN
+10BE ; [.1580.0020.0008.10BE] # GEORGIAN CAPITAL LETTER XAN
+10F4 ; [.1581.0020.0002.10F4] # GEORGIAN LETTER HAR
+2D24 ; [.1582.0020.0002.2D24] # GEORGIAN SMALL LETTER HAR
+10C4 ; [.1582.0020.0008.10C4] # GEORGIAN CAPITAL LETTER HAR
+10EF ; [.1583.0020.0002.10EF] # GEORGIAN LETTER JHAN
+2D1F ; [.1584.0020.0002.2D1F] # GEORGIAN SMALL LETTER JHAN
+10BF ; [.1584.0020.0008.10BF] # GEORGIAN CAPITAL LETTER JHAN
+10F0 ; [.1585.0020.0002.10F0] # GEORGIAN LETTER HAE
+2D20 ; [.1586.0020.0002.2D20] # GEORGIAN SMALL LETTER HAE
+10C0 ; [.1586.0020.0008.10C0] # GEORGIAN CAPITAL LETTER HAE
+10F5 ; [.1587.0020.0002.10F5] # GEORGIAN LETTER HOE
+2D25 ; [.1588.0020.0002.2D25] # GEORGIAN SMALL LETTER HOE
+10C5 ; [.1588.0020.0008.10C5] # GEORGIAN CAPITAL LETTER HOE
+10F6 ; [.1589.0020.0002.10F6] # GEORGIAN LETTER FI
+10F7 ; [.158A.0020.0002.10F7] # GEORGIAN LETTER YN
+10F8 ; [.158B.0020.0002.10F8] # GEORGIAN LETTER ELIFI
+10F9 ; [.158C.0020.0002.10F9] # GEORGIAN LETTER TURNED GAN
+10FA ; [.158D.0020.0002.10FA] # GEORGIAN LETTER AIN
+0561 ; [.158E.0020.0002.0561] # ARMENIAN SMALL LETTER AYB
+0531 ; [.158E.0020.0008.0531] # ARMENIAN CAPITAL LETTER AYB
+0562 ; [.158F.0020.0002.0562] # ARMENIAN SMALL LETTER BEN
+0532 ; [.158F.0020.0008.0532] # ARMENIAN CAPITAL LETTER BEN
+0563 ; [.1590.0020.0002.0563] # ARMENIAN SMALL LETTER GIM
+0533 ; [.1590.0020.0008.0533] # ARMENIAN CAPITAL LETTER GIM
+0564 ; [.1591.0020.0002.0564] # ARMENIAN SMALL LETTER DA
+0534 ; [.1591.0020.0008.0534] # ARMENIAN CAPITAL LETTER DA
+0565 ; [.1592.0020.0002.0565] # ARMENIAN SMALL LETTER ECH
+0535 ; [.1592.0020.0008.0535] # ARMENIAN CAPITAL LETTER ECH
+0587 ; [.1592.0020.0004.0587][.15AF.0020.0004.0587] # ARMENIAN SMALL LIGATURE ECH YIWN; QQKN
+0566 ; [.1593.0020.0002.0566] # ARMENIAN SMALL LETTER ZA
+0536 ; [.1593.0020.0008.0536] # ARMENIAN CAPITAL LETTER ZA
+0567 ; [.1594.0020.0002.0567] # ARMENIAN SMALL LETTER EH
+0537 ; [.1594.0020.0008.0537] # ARMENIAN CAPITAL LETTER EH
+0568 ; [.1595.0020.0002.0568] # ARMENIAN SMALL LETTER ET
+0538 ; [.1595.0020.0008.0538] # ARMENIAN CAPITAL LETTER ET
+0569 ; [.1596.0020.0002.0569] # ARMENIAN SMALL LETTER TO
+0539 ; [.1596.0020.0008.0539] # ARMENIAN CAPITAL LETTER TO
+056A ; [.1597.0020.0002.056A] # ARMENIAN SMALL LETTER ZHE
+053A ; [.1597.0020.0008.053A] # ARMENIAN CAPITAL LETTER ZHE
+056B ; [.1598.0020.0002.056B] # ARMENIAN SMALL LETTER INI
+053B ; [.1598.0020.0008.053B] # ARMENIAN CAPITAL LETTER INI
+056C ; [.1599.0020.0002.056C] # ARMENIAN SMALL LETTER LIWN
+053C ; [.1599.0020.0008.053C] # ARMENIAN CAPITAL LETTER LIWN
+056D ; [.159A.0020.0002.056D] # ARMENIAN SMALL LETTER XEH
+053D ; [.159A.0020.0008.053D] # ARMENIAN CAPITAL LETTER XEH
+056E ; [.159B.0020.0002.056E] # ARMENIAN SMALL LETTER CA
+053E ; [.159B.0020.0008.053E] # ARMENIAN CAPITAL LETTER CA
+056F ; [.159C.0020.0002.056F] # ARMENIAN SMALL LETTER KEN
+053F ; [.159C.0020.0008.053F] # ARMENIAN CAPITAL LETTER KEN
+0570 ; [.159D.0020.0002.0570] # ARMENIAN SMALL LETTER HO
+0540 ; [.159D.0020.0008.0540] # ARMENIAN CAPITAL LETTER HO
+0571 ; [.159E.0020.0002.0571] # ARMENIAN SMALL LETTER JA
+0541 ; [.159E.0020.0008.0541] # ARMENIAN CAPITAL LETTER JA
+0572 ; [.159F.0020.0002.0572] # ARMENIAN SMALL LETTER GHAD
+0542 ; [.159F.0020.0008.0542] # ARMENIAN CAPITAL LETTER GHAD
+0573 ; [.15A0.0020.0002.0573] # ARMENIAN SMALL LETTER CHEH
+0543 ; [.15A0.0020.0008.0543] # ARMENIAN CAPITAL LETTER CHEH
+0574 ; [.15A1.0020.0002.0574] # ARMENIAN SMALL LETTER MEN
+0544 ; [.15A1.0020.0008.0544] # ARMENIAN CAPITAL LETTER MEN
+FB14 ; [.15A1.0020.0004.FB14][.1592.0020.0004.FB14] # ARMENIAN SMALL LIGATURE MEN ECH; QQKN
+FB15 ; [.15A1.0020.0004.FB15][.1598.0020.0004.FB15] # ARMENIAN SMALL LIGATURE MEN INI; QQKN
+FB17 ; [.15A1.0020.0004.FB17][.159A.0020.0004.FB17] # ARMENIAN SMALL LIGATURE MEN XEH; QQKN
+FB13 ; [.15A1.0020.0004.FB13][.15A3.0020.0004.FB13] # ARMENIAN SMALL LIGATURE MEN NOW; QQKN
+0575 ; [.15A2.0020.0002.0575] # ARMENIAN SMALL LETTER YI
+0545 ; [.15A2.0020.0008.0545] # ARMENIAN CAPITAL LETTER YI
+0576 ; [.15A3.0020.0002.0576] # ARMENIAN SMALL LETTER NOW
+0546 ; [.15A3.0020.0008.0546] # ARMENIAN CAPITAL LETTER NOW
+0577 ; [.15A4.0020.0002.0577] # ARMENIAN SMALL LETTER SHA
+0547 ; [.15A4.0020.0008.0547] # ARMENIAN CAPITAL LETTER SHA
+0578 ; [.15A5.0020.0002.0578] # ARMENIAN SMALL LETTER VO
+0548 ; [.15A5.0020.0008.0548] # ARMENIAN CAPITAL LETTER VO
+0579 ; [.15A6.0020.0002.0579] # ARMENIAN SMALL LETTER CHA
+0549 ; [.15A6.0020.0008.0549] # ARMENIAN CAPITAL LETTER CHA
+057A ; [.15A7.0020.0002.057A] # ARMENIAN SMALL LETTER PEH
+054A ; [.15A7.0020.0008.054A] # ARMENIAN CAPITAL LETTER PEH
+057B ; [.15A8.0020.0002.057B] # ARMENIAN SMALL LETTER JHEH
+054B ; [.15A8.0020.0008.054B] # ARMENIAN CAPITAL LETTER JHEH
+057C ; [.15A9.0020.0002.057C] # ARMENIAN SMALL LETTER RA
+054C ; [.15A9.0020.0008.054C] # ARMENIAN CAPITAL LETTER RA
+057D ; [.15AA.0020.0002.057D] # ARMENIAN SMALL LETTER SEH
+054D ; [.15AA.0020.0008.054D] # ARMENIAN CAPITAL LETTER SEH
+057E ; [.15AB.0020.0002.057E] # ARMENIAN SMALL LETTER VEW
+054E ; [.15AB.0020.0008.054E] # ARMENIAN CAPITAL LETTER VEW
+FB16 ; [.15AB.0020.0004.FB16][.15A3.0020.0004.FB16] # ARMENIAN SMALL LIGATURE VEW NOW; QQKN
+057F ; [.15AC.0020.0002.057F] # ARMENIAN SMALL LETTER TIWN
+054F ; [.15AC.0020.0008.054F] # ARMENIAN CAPITAL LETTER TIWN
+0580 ; [.15AD.0020.0002.0580] # ARMENIAN SMALL LETTER REH
+0550 ; [.15AD.0020.0008.0550] # ARMENIAN CAPITAL LETTER REH
+0581 ; [.15AE.0020.0002.0581] # ARMENIAN SMALL LETTER CO
+0551 ; [.15AE.0020.0008.0551] # ARMENIAN CAPITAL LETTER CO
+0582 ; [.15AF.0020.0002.0582] # ARMENIAN SMALL LETTER YIWN
+0552 ; [.15AF.0020.0008.0552] # ARMENIAN CAPITAL LETTER YIWN
+0583 ; [.15B0.0020.0002.0583] # ARMENIAN SMALL LETTER PIWR
+0553 ; [.15B0.0020.0008.0553] # ARMENIAN CAPITAL LETTER PIWR
+0584 ; [.15B1.0020.0002.0584] # ARMENIAN SMALL LETTER KEH
+0554 ; [.15B1.0020.0008.0554] # ARMENIAN CAPITAL LETTER KEH
+0585 ; [.15B2.0020.0002.0585] # ARMENIAN SMALL LETTER OH
+0555 ; [.15B2.0020.0008.0555] # ARMENIAN CAPITAL LETTER OH
+0586 ; [.15B3.0020.0002.0586] # ARMENIAN SMALL LETTER FEH
+0556 ; [.15B3.0020.0008.0556] # ARMENIAN CAPITAL LETTER FEH
+0559 ; [.15B4.0020.0002.0559] # ARMENIAN MODIFIER LETTER LEFT HALF RING
+05D0 ; [.15B5.0020.0002.05D0] # HEBREW LETTER ALEF
+2135 ; [.15B5.0020.0004.2135] # ALEF SYMBOL; QQK
+FB21 ; [.15B5.0020.0005.FB21] # HEBREW LETTER WIDE ALEF; QQK
+FB2E ; [.15B5.0020.0002.05D0][.0000.00CC.0002.05B7] # HEBREW LETTER ALEF WITH PATAH; QQCM
+FB2F ; [.15B5.0020.0002.05D0][.0000.00CD.0002.05B8] # HEBREW LETTER ALEF WITH QAMATS; QQCM
+FB30 ; [.15B5.0020.0002.05D0][.0000.00D4.0002.05BC] # HEBREW LETTER ALEF WITH MAPIQ; QQCM
+FB4F ; [.15B5.0020.0004.FB4F][.15C0.0020.0004.FB4F] # HEBREW LIGATURE ALEF LAMED; QQKN
+05D1 ; [.15B6.0020.0002.05D1] # HEBREW LETTER BET
+2136 ; [.15B6.0020.0004.2136] # BET SYMBOL; QQK
+FB31 ; [.15B6.0020.0002.05D1][.0000.00D4.0002.05BC] # HEBREW LETTER BET WITH DAGESH; QQCM
+FB4C ; [.15B6.0020.0002.05D1][.0000.00D7.0002.05BF] # HEBREW LETTER BET WITH RAFE; QQCM
+05D2 ; [.15B7.0020.0002.05D2] # HEBREW LETTER GIMEL
+2137 ; [.15B7.0020.0004.2137] # GIMEL SYMBOL; QQK
+FB32 ; [.15B7.0020.0002.05D2][.0000.00D4.0002.05BC] # HEBREW LETTER GIMEL WITH DAGESH; QQCM
+05D3 ; [.15B8.0020.0002.05D3] # HEBREW LETTER DALET
+2138 ; [.15B8.0020.0004.2138] # DALET SYMBOL; QQK
+FB22 ; [.15B8.0020.0005.FB22] # HEBREW LETTER WIDE DALET; QQK
+FB33 ; [.15B8.0020.0002.05D3][.0000.00D4.0002.05BC] # HEBREW LETTER DALET WITH DAGESH; QQCM
+05D4 ; [.15B9.0020.0002.05D4] # HEBREW LETTER HE
+FB23 ; [.15B9.0020.0005.FB23] # HEBREW LETTER WIDE HE; QQK
+FB34 ; [.15B9.0020.0002.05D4][.0000.00D4.0002.05BC] # HEBREW LETTER HE WITH MAPIQ; QQCM
+05D5 ; [.15BA.0020.0002.05D5] # HEBREW LETTER VAV
+FB4B ; [.15BA.0020.0002.05D5][.0000.00CF.0002.05B9] # HEBREW LETTER VAV WITH HOLAM; QQCM
+FB35 ; [.15BA.0020.0002.05D5][.0000.00D4.0002.05BC] # HEBREW LETTER VAV WITH DAGESH; QQCM
+05F0 ; [.15BA.0020.0004.05F0][.15BA.0020.0004.05F0] # HEBREW LIGATURE YIDDISH DOUBLE VAV; QQKN
+05F1 ; [.15BA.0020.0004.05F1][.15BE.0020.0004.05F1] # HEBREW LIGATURE YIDDISH VAV YOD; QQKN
+05D6 ; [.15BB.0020.0002.05D6] # HEBREW LETTER ZAYIN
+FB36 ; [.15BB.0020.0002.05D6][.0000.00D4.0002.05BC] # HEBREW LETTER ZAYIN WITH DAGESH; QQCM
+05D7 ; [.15BC.0020.0002.05D7] # HEBREW LETTER HET
+05D8 ; [.15BD.0020.0002.05D8] # HEBREW LETTER TET
+FB38 ; [.15BD.0020.0002.05D8][.0000.00D4.0002.05BC] # HEBREW LETTER TET WITH DAGESH; QQCM
+05D9 ; [.15BE.0020.0002.05D9] # HEBREW LETTER YOD
+FB1D ; [.15BE.0020.0002.05D9][.0000.00C9.0002.05B4] # HEBREW LETTER YOD WITH HIRIQ; QQCM
+FB39 ; [.15BE.0020.0002.05D9][.0000.00D4.0002.05BC] # HEBREW LETTER YOD WITH DAGESH; QQCM
+05F2 ; [.15BE.0020.0004.05F2][.15BE.0020.0004.05F2] # HEBREW LIGATURE YIDDISH DOUBLE YOD; QQKN
+FB1F ; [.15BE.0020.0004.FB1F][.15BE.0020.0004.FB1F][.0000.00CC.0002.FB1F] # HEBREW LIGATURE YIDDISH YOD YOD PATAH; QQKN
+05DB ; [.15BF.0020.0002.05DB] # HEBREW LETTER KAF
+FB24 ; [.15BF.0020.0005.FB24] # HEBREW LETTER WIDE KAF; QQK
+05DA ; [.15BF.0020.0019.05DA] # HEBREW LETTER FINAL KAF; QQK
+FB3B ; [.15BF.0020.0002.05DB][.0000.00D4.0002.05BC] # HEBREW LETTER KAF WITH DAGESH; QQCM
+FB3A ; [.15BF.0020.0019.FB3A][.0000.00D4.0002.FB3A] # HEBREW LETTER FINAL KAF WITH DAGESH; QQKN
+FB4D ; [.15BF.0020.0002.05DB][.0000.00D7.0002.05BF] # HEBREW LETTER KAF WITH RAFE; QQCM
+05DC ; [.15C0.0020.0002.05DC] # HEBREW LETTER LAMED
+FB25 ; [.15C0.0020.0005.FB25] # HEBREW LETTER WIDE LAMED; QQK
+FB3C ; [.15C0.0020.0002.05DC][.0000.00D4.0002.05BC] # HEBREW LETTER LAMED WITH DAGESH; QQCM
+05DE ; [.15C1.0020.0002.05DE] # HEBREW LETTER MEM
+FB26 ; [.15C1.0020.0005.FB26] # HEBREW LETTER WIDE FINAL MEM; QQK
+05DD ; [.15C1.0020.0019.05DD] # HEBREW LETTER FINAL MEM; QQK
+FB3E ; [.15C1.0020.0002.05DE][.0000.00D4.0002.05BC] # HEBREW LETTER MEM WITH DAGESH; QQCM
+05E0 ; [.15C2.0020.0002.05E0] # HEBREW LETTER NUN
+05DF ; [.15C2.0020.0019.05DF] # HEBREW LETTER FINAL NUN; QQK
+FB40 ; [.15C2.0020.0002.05E0][.0000.00D4.0002.05BC] # HEBREW LETTER NUN WITH DAGESH; QQCM
+05E1 ; [.15C3.0020.0002.05E1] # HEBREW LETTER SAMEKH
+FB41 ; [.15C3.0020.0002.05E1][.0000.00D4.0002.05BC] # HEBREW LETTER SAMEKH WITH DAGESH; QQCM
+05E2 ; [.15C4.0020.0002.05E2] # HEBREW LETTER AYIN
+FB20 ; [.15C4.0020.0005.FB20] # HEBREW LETTER ALTERNATIVE AYIN; QQK
+05E4 ; [.15C5.0020.0002.05E4] # HEBREW LETTER PE
+05E3 ; [.15C5.0020.0019.05E3] # HEBREW LETTER FINAL PE; QQK
+FB44 ; [.15C5.0020.0002.05E4][.0000.00D4.0002.05BC] # HEBREW LETTER PE WITH DAGESH; QQCM
+FB43 ; [.15C5.0020.0019.FB43][.0000.00D4.0002.FB43] # HEBREW LETTER FINAL PE WITH DAGESH; QQKN
+FB4E ; [.15C5.0020.0002.05E4][.0000.00D7.0002.05BF] # HEBREW LETTER PE WITH RAFE; QQCM
+05E6 ; [.15C6.0020.0002.05E6] # HEBREW LETTER TSADI
+05E5 ; [.15C6.0020.0019.05E5] # HEBREW LETTER FINAL TSADI; QQK
+FB46 ; [.15C6.0020.0002.05E6][.0000.00D4.0002.05BC] # HEBREW LETTER TSADI WITH DAGESH; QQCM
+05E7 ; [.15C7.0020.0002.05E7] # HEBREW LETTER QOF
+FB47 ; [.15C7.0020.0002.05E7][.0000.00D4.0002.05BC] # HEBREW LETTER QOF WITH DAGESH; QQCM
+05E8 ; [.15C8.0020.0002.05E8] # HEBREW LETTER RESH
+FB27 ; [.15C8.0020.0005.FB27] # HEBREW LETTER WIDE RESH; QQK
+FB48 ; [.15C8.0020.0002.05E8][.0000.00D4.0002.05BC] # HEBREW LETTER RESH WITH DAGESH; QQCM
+05E9 ; [.15C9.0020.0002.05E9] # HEBREW LETTER SHIN
+FB2B ; [.15C9.0020.0002.05E9][.0000.00D2.0002.05C2] # HEBREW LETTER SHIN WITH SIN DOT; QQCM
+FB2A ; [.15C9.0020.0002.05E9][.0000.00D3.0002.05C1] # HEBREW LETTER SHIN WITH SHIN DOT; QQCM
+FB49 ; [.15C9.0020.0002.05E9][.0000.00D4.0002.05BC] # HEBREW LETTER SHIN WITH DAGESH; QQCM
+FB2D ; [.15C9.0020.0002.05E9][.0000.00D4.0002.05BC][.0000.00D2.0002.05C2] # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT; QQCM
+FB2C ; [.15C9.0020.0002.05E9][.0000.00D4.0002.05BC][.0000.00D3.0002.05C1] # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT; QQCM
+05EA ; [.15CA.0020.0002.05EA] # HEBREW LETTER TAV
+FB28 ; [.15CA.0020.0005.FB28] # HEBREW LETTER WIDE TAV; QQK
+FB4A ; [.15CA.0020.0002.05EA][.0000.00D4.0002.05BC] # HEBREW LETTER TAV WITH DAGESH; QQCM
+10900 ; [.15CB.0020.0002.10900] # PHOENICIAN LETTER ALF
+10901 ; [.15CC.0020.0002.10901] # PHOENICIAN LETTER BET
+10902 ; [.15CD.0020.0002.10902] # PHOENICIAN LETTER GAML
+10903 ; [.15CE.0020.0002.10903] # PHOENICIAN LETTER DELT
+10904 ; [.15CF.0020.0002.10904] # PHOENICIAN LETTER HE
+10905 ; [.15D0.0020.0002.10905] # PHOENICIAN LETTER WAU
+10906 ; [.15D1.0020.0002.10906] # PHOENICIAN LETTER ZAI
+10907 ; [.15D2.0020.0002.10907] # PHOENICIAN LETTER HET
+10908 ; [.15D3.0020.0002.10908] # PHOENICIAN LETTER TET
+10909 ; [.15D4.0020.0002.10909] # PHOENICIAN LETTER YOD
+1090A ; [.15D5.0020.0002.1090A] # PHOENICIAN LETTER KAF
+1090B ; [.15D6.0020.0002.1090B] # PHOENICIAN LETTER LAMD
+1090C ; [.15D7.0020.0002.1090C] # PHOENICIAN LETTER MEM
+1090D ; [.15D8.0020.0002.1090D] # PHOENICIAN LETTER NUN
+1090E ; [.15D9.0020.0002.1090E] # PHOENICIAN LETTER SEMK
+1090F ; [.15DA.0020.0002.1090F] # PHOENICIAN LETTER AIN
+10910 ; [.15DB.0020.0002.10910] # PHOENICIAN LETTER PE
+10911 ; [.15DC.0020.0002.10911] # PHOENICIAN LETTER SADE
+10912 ; [.15DD.0020.0002.10912] # PHOENICIAN LETTER QOF
+10913 ; [.15DE.0020.0002.10913] # PHOENICIAN LETTER ROSH
+10914 ; [.15DF.0020.0002.10914] # PHOENICIAN LETTER SHIN
+10915 ; [.15E0.0020.0002.10915] # PHOENICIAN LETTER TAU
+0621 ; [.15E1.0020.0002.0621] # ARABIC LETTER HAMZA
+0674 ; [.15E1.0020.0004.0674] # ARABIC LETTER HIGH HAMZA; QQK
+FE80 ; [.15E1.0020.001A.FE80] # ARABIC LETTER HAMZA ISOLATED FORM; QQK
+06FD ; [.15E1.0020.0004.06FD][.0000.019A.0004.06FD] # ARABIC SIGN SINDHI AMPERSAND; QQKN
+0622 ; [.15E2.0020.0002.0622] # ARABIC LETTER ALEF WITH MADDA ABOVE
+0627 0653 ; [.15E2.0020.0002.0622] # ARABIC LETTER ALEF WITH MADDA ABOVE
+FE82 ; [.15E2.0020.0019.FE82] # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM; QQK
+FE81 ; [.15E2.0020.001A.FE81] # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM; QQK
+0623 ; [.15E3.0020.0002.0623] # ARABIC LETTER ALEF WITH HAMZA ABOVE
+0627 0654 ; [.15E3.0020.0002.0623] # ARABIC LETTER ALEF WITH HAMZA ABOVE
+FE84 ; [.15E3.0020.0019.FE84] # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM; QQK
+FE83 ; [.15E3.0020.001A.FE83] # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM; QQK
+0672 ; [.15E4.0020.0002.0672] # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0671 ; [.15E5.0020.0002.0671] # ARABIC LETTER ALEF WASLA
+FB51 ; [.15E5.0020.0019.FB51] # ARABIC LETTER ALEF WASLA FINAL FORM; QQK
+FB50 ; [.15E5.0020.001A.FB50] # ARABIC LETTER ALEF WASLA ISOLATED FORM; QQK
+0624 ; [.15E6.0020.0002.0624] # ARABIC LETTER WAW WITH HAMZA ABOVE
+0648 0654 ; [.15E6.0020.0002.0624] # ARABIC LETTER WAW WITH HAMZA ABOVE
+FE86 ; [.15E6.0020.0019.FE86] # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM; QQK
+FE85 ; [.15E6.0020.001A.FE85] # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM; QQK
+0625 ; [.15E7.0020.0002.0625] # ARABIC LETTER ALEF WITH HAMZA BELOW
+0627 0655 ; [.15E7.0020.0002.0625] # ARABIC LETTER ALEF WITH HAMZA BELOW
+FE88 ; [.15E7.0020.0019.FE88] # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM; QQK
+FE87 ; [.15E7.0020.001A.FE87] # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM; QQK
+0673 ; [.15E8.0020.0002.0673] # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0626 ; [.15E9.0020.0002.0626] # ARABIC LETTER YEH WITH HAMZA ABOVE
+064A 0654 ; [.15E9.0020.0002.0626] # ARABIC LETTER YEH WITH HAMZA ABOVE
+FE8B ; [.15E9.0020.0017.FE8B] # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM; QQK
+FE8C ; [.15E9.0020.0018.FE8C] # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM; QQK
+FE8A ; [.15E9.0020.0019.FE8A] # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM; QQK
+FE89 ; [.15E9.0020.001A.FE89] # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM; QQK
+FBEB ; [.15E9.0020.0019.FBEB][.15EA.0020.0019.FBEB] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM; QQKN
+FBEA ; [.15E9.0020.001A.FBEA][.15EA.0020.001A.FBEA] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM; QQKN
+FC97 ; [.15E9.0020.0017.FC97][.15FF.0020.0017.FC97] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM; QQKN
+FC00 ; [.15E9.0020.001A.FC00][.15FF.0020.001A.FC00] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM; QQKN
+FC98 ; [.15E9.0020.0017.FC98][.1605.0020.0017.FC98] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM; QQKN
+FC01 ; [.15E9.0020.001A.FC01][.1605.0020.001A.FC01] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM; QQKN
+FC99 ; [.15E9.0020.0017.FC99][.1606.0020.0017.FC99] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM; QQKN
+FC64 ; [.15E9.0020.0019.FC64][.161A.0020.0019.FC64] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM; QQKN
+FC65 ; [.15E9.0020.0019.FC65][.161B.0020.0019.FC65] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM; QQKN
+FC9A ; [.15E9.0020.0017.FC9A][.1663.0020.0017.FC9A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM; QQKN
+FCDF ; [.15E9.0020.0018.FCDF][.1663.0020.0018.FCDF] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM; QQKN
+FC66 ; [.15E9.0020.0019.FC66][.1663.0020.0019.FC66] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM; QQKN
+FC02 ; [.15E9.0020.001A.FC02][.1663.0020.001A.FC02] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM; QQKN
+FC67 ; [.15E9.0020.0019.FC67][.1666.0020.0019.FC67] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM; QQKN
+FC9B ; [.15E9.0020.0017.FC9B][.166F.0020.0017.FC9B] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM; QQKN
+FCE0 ; [.15E9.0020.0018.FCE0][.166F.0020.0018.FCE0] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM; QQKN
+FBED ; [.15E9.0020.0019.FBED][.1674.0020.0019.FBED] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM; QQKN
+FBEC ; [.15E9.0020.001A.FBEC][.1674.0020.001A.FBEC] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM; QQKN
+FBEF ; [.15E9.0020.0019.FBEF][.1675.0020.0019.FBEF] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM; QQKN
+FBEE ; [.15E9.0020.001A.FBEE][.1675.0020.001A.FBEE] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM; QQKN
+FBF3 ; [.15E9.0020.0019.FBF3][.1678.0020.0019.FBF3] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM; QQKN
+FBF2 ; [.15E9.0020.001A.FBF2][.1678.0020.001A.FBF2] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM; QQKN
+FBF1 ; [.15E9.0020.0019.FBF1][.1679.0020.0019.FBF1] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM; QQKN
+FBF0 ; [.15E9.0020.001A.FBF0][.1679.0020.001A.FBF0] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM; QQKN
+FBF5 ; [.15E9.0020.0019.FBF5][.167A.0020.0019.FBF5] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM; QQKN
+FBF4 ; [.15E9.0020.001A.FBF4][.167A.0020.001A.FBF4] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM; QQKN
+FBFB ; [.15E9.0020.0017.FBFB][.167F.0020.0017.FBFB] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM; QQKN
+FBFA ; [.15E9.0020.0019.FBFA][.167F.0020.0019.FBFA] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM; QQKN
+FC68 ; [.15E9.0020.0019.FC68][.167F.0020.0019.FC68] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM; QQKN
+FBF9 ; [.15E9.0020.001A.FBF9][.167F.0020.001A.FBF9] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC03 ; [.15E9.0020.001A.FC03][.167F.0020.001A.FC03] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC69 ; [.15E9.0020.0019.FC69][.1680.0020.0019.FC69] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM; QQKN
+FC04 ; [.15E9.0020.001A.FC04][.1680.0020.001A.FC04] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM; QQKN
+FBF8 ; [.15E9.0020.0017.FBF8][.1684.0020.0017.FBF8] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM; QQKN
+FBF7 ; [.15E9.0020.0019.FBF7][.1684.0020.0019.FBF7] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM; QQKN
+FBF6 ; [.15E9.0020.001A.FBF6][.1684.0020.001A.FBF6] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM; QQKN
+0627 ; [.15EA.0020.0002.0627] # ARABIC LETTER ALEF
+FE8E ; [.15EA.0020.0019.FE8E] # ARABIC LETTER ALEF FINAL FORM; QQK
+FE8D ; [.15EA.0020.001A.FE8D] # ARABIC LETTER ALEF ISOLATED FORM; QQK
+FD3C ; [.15EA.0020.0019.FD3C][.0000.00D9.0019.FD3C] # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM; QQKN
+FD3D ; [.15EA.0020.001A.FD3D][.0000.00D9.001A.FD3D] # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM; QQKN
+0675 ; [.15EA.0020.0004.0675][.15E1.0020.0004.0675] # ARABIC LETTER HIGH HAMZA ALEF; QQKN
+FDF3 ; [.15EA.0020.001A.FDF3][.164D.0020.001A.FDF3][.15EC.0020.001F.FDF3][.161A.0020.001F.FDF3] # ARABIC LIGATURE AKBAR ISOLATED FORM; QQKN
+FDF2 ; [.15EA.0020.001A.FDF2][.165D.0020.001A.FDF2][.165D.0020.001F.FDF2][.166F.0020.001F.FDF2] # ARABIC LIGATURE ALLAH ISOLATED FORM; QQKN
+066E ; [.15EB.0020.0002.066E] # ARABIC LETTER DOTLESS BEH
+0628 ; [.15EC.0020.0002.0628] # ARABIC LETTER BEH
+FE91 ; [.15EC.0020.0017.FE91] # ARABIC LETTER BEH INITIAL FORM; QQK
+FE92 ; [.15EC.0020.0018.FE92] # ARABIC LETTER BEH MEDIAL FORM; QQK
+FE90 ; [.15EC.0020.0019.FE90] # ARABIC LETTER BEH FINAL FORM; QQK
+FE8F ; [.15EC.0020.001A.FE8F] # ARABIC LETTER BEH ISOLATED FORM; QQK
+FC9C ; [.15EC.0020.0017.FC9C][.15FF.0020.0017.FC9C] # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM; QQKN
+FC05 ; [.15EC.0020.001A.FC05][.15FF.0020.001A.FC05] # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM; QQKN
+FC9D ; [.15EC.0020.0017.FC9D][.1605.0020.0017.FC9D] # ARABIC LIGATURE BEH WITH HAH INITIAL FORM; QQKN
+FC06 ; [.15EC.0020.001A.FC06][.1605.0020.001A.FC06] # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM; QQKN
+FDC2 ; [.15EC.0020.0019.FDC2][.1605.0020.0019.FDC2][.1680.0020.001F.FDC2] # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM; QQKN
+FC9E ; [.15EC.0020.0017.FC9E][.1606.0020.0017.FC9E] # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM; QQKN
+FC07 ; [.15EC.0020.001A.FC07][.1606.0020.001A.FC07] # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM; QQKN
+FD9E ; [.15EC.0020.0019.FD9E][.1606.0020.0019.FD9E][.1680.0020.001F.FD9E] # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM; QQKN
+FC6A ; [.15EC.0020.0019.FC6A][.161A.0020.0019.FC6A] # ARABIC LIGATURE BEH WITH REH FINAL FORM; QQKN
+FC6B ; [.15EC.0020.0019.FC6B][.161B.0020.0019.FC6B] # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM; QQKN
+FC9F ; [.15EC.0020.0017.FC9F][.1663.0020.0017.FC9F] # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM; QQKN
+FCE1 ; [.15EC.0020.0018.FCE1][.1663.0020.0018.FCE1] # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM; QQKN
+FC6C ; [.15EC.0020.0019.FC6C][.1663.0020.0019.FC6C] # ARABIC LIGATURE BEH WITH MEEM FINAL FORM; QQKN
+FC08 ; [.15EC.0020.001A.FC08][.1663.0020.001A.FC08] # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM; QQKN
+FC6D ; [.15EC.0020.0019.FC6D][.1666.0020.0019.FC6D] # ARABIC LIGATURE BEH WITH NOON FINAL FORM; QQKN
+FCA0 ; [.15EC.0020.0017.FCA0][.166F.0020.0017.FCA0] # ARABIC LIGATURE BEH WITH HEH INITIAL FORM; QQKN
+FCE2 ; [.15EC.0020.0018.FCE2][.166F.0020.0018.FCE2] # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM; QQKN
+FC6E ; [.15EC.0020.0019.FC6E][.167F.0020.0019.FC6E] # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC09 ; [.15EC.0020.001A.FC09][.167F.0020.001A.FC09] # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC6F ; [.15EC.0020.0019.FC6F][.1680.0020.0019.FC6F] # ARABIC LIGATURE BEH WITH YEH FINAL FORM; QQKN
+FC0A ; [.15EC.0020.001A.FC0A][.1680.0020.001A.FC0A] # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM; QQKN
+067B ; [.15ED.0020.0002.067B] # ARABIC LETTER BEEH
+FB54 ; [.15ED.0020.0017.FB54] # ARABIC LETTER BEEH INITIAL FORM; QQK
+FB55 ; [.15ED.0020.0018.FB55] # ARABIC LETTER BEEH MEDIAL FORM; QQK
+FB53 ; [.15ED.0020.0019.FB53] # ARABIC LETTER BEEH FINAL FORM; QQK
+FB52 ; [.15ED.0020.001A.FB52] # ARABIC LETTER BEEH ISOLATED FORM; QQK
+067E ; [.15EE.0020.0002.067E] # ARABIC LETTER PEH
+FB58 ; [.15EE.0020.0017.FB58] # ARABIC LETTER PEH INITIAL FORM; QQK
+FB59 ; [.15EE.0020.0018.FB59] # ARABIC LETTER PEH MEDIAL FORM; QQK
+FB57 ; [.15EE.0020.0019.FB57] # ARABIC LETTER PEH FINAL FORM; QQK
+FB56 ; [.15EE.0020.001A.FB56] # ARABIC LETTER PEH ISOLATED FORM; QQK
+0680 ; [.15EF.0020.0002.0680] # ARABIC LETTER BEHEH
+FB5C ; [.15EF.0020.0017.FB5C] # ARABIC LETTER BEHEH INITIAL FORM; QQK
+FB5D ; [.15EF.0020.0018.FB5D] # ARABIC LETTER BEHEH MEDIAL FORM; QQK
+FB5B ; [.15EF.0020.0019.FB5B] # ARABIC LETTER BEHEH FINAL FORM; QQK
+FB5A ; [.15EF.0020.001A.FB5A] # ARABIC LETTER BEHEH ISOLATED FORM; QQK
+0750 ; [.15F0.0020.0002.0750] # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW
+0751 ; [.15F1.0020.0002.0751] # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE
+0752 ; [.15F2.0020.0002.0752] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW
+0753 ; [.15F3.0020.0002.0753] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE
+0754 ; [.15F4.0020.0002.0754] # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE
+0755 ; [.15F5.0020.0002.0755] # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW
+0756 ; [.15F6.0020.0002.0756] # ARABIC LETTER BEH WITH SMALL V
+0629 ; [.15F7.0020.0002.0629] # ARABIC LETTER TEH MARBUTA
+FE94 ; [.15F7.0020.0019.FE94] # ARABIC LETTER TEH MARBUTA FINAL FORM; QQK
+FE93 ; [.15F7.0020.001A.FE93] # ARABIC LETTER TEH MARBUTA ISOLATED FORM; QQK
+062A ; [.15F8.0020.0002.062A] # ARABIC LETTER TEH
+FE97 ; [.15F8.0020.0017.FE97] # ARABIC LETTER TEH INITIAL FORM; QQK
+FE98 ; [.15F8.0020.0018.FE98] # ARABIC LETTER TEH MEDIAL FORM; QQK
+FE96 ; [.15F8.0020.0019.FE96] # ARABIC LETTER TEH FINAL FORM; QQK
+FE95 ; [.15F8.0020.001A.FE95] # ARABIC LETTER TEH ISOLATED FORM; QQK
+FCA1 ; [.15F8.0020.0017.FCA1][.15FF.0020.0017.FCA1] # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM; QQKN
+FC0B ; [.15F8.0020.001A.FC0B][.15FF.0020.001A.FC0B] # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM; QQKN
+FD50 ; [.15F8.0020.0017.FD50][.15FF.0020.0017.FD50][.1663.0020.001F.FD50] # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FDA0 ; [.15F8.0020.0019.FDA0][.15FF.0020.0019.FDA0][.167F.0020.001F.FDA0] # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD9F ; [.15F8.0020.0019.FD9F][.15FF.0020.0019.FD9F][.1680.0020.001F.FD9F] # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM; QQKN
+FCA2 ; [.15F8.0020.0017.FCA2][.1605.0020.0017.FCA2] # ARABIC LIGATURE TEH WITH HAH INITIAL FORM; QQKN
+FC0C ; [.15F8.0020.001A.FC0C][.1605.0020.001A.FC0C] # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM; QQKN
+FD52 ; [.15F8.0020.0017.FD52][.1605.0020.0017.FD52][.15FF.0020.001F.FD52] # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM; QQKN
+FD51 ; [.15F8.0020.0019.FD51][.1605.0020.0019.FD51][.15FF.0020.001F.FD51] # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM; QQKN
+FD53 ; [.15F8.0020.0017.FD53][.1605.0020.0017.FD53][.1663.0020.001F.FD53] # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM; QQKN
+FCA3 ; [.15F8.0020.0017.FCA3][.1606.0020.0017.FCA3] # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM; QQKN
+FC0D ; [.15F8.0020.001A.FC0D][.1606.0020.001A.FC0D] # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM; QQKN
+FD54 ; [.15F8.0020.0017.FD54][.1606.0020.0017.FD54][.1663.0020.001F.FD54] # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FDA2 ; [.15F8.0020.0019.FDA2][.1606.0020.0019.FDA2][.167F.0020.001F.FDA2] # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDA1 ; [.15F8.0020.0019.FDA1][.1606.0020.0019.FDA1][.1680.0020.001F.FDA1] # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM; QQKN
+FC70 ; [.15F8.0020.0019.FC70][.161A.0020.0019.FC70] # ARABIC LIGATURE TEH WITH REH FINAL FORM; QQKN
+FC71 ; [.15F8.0020.0019.FC71][.161B.0020.0019.FC71] # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM; QQKN
+FCA4 ; [.15F8.0020.0017.FCA4][.1663.0020.0017.FCA4] # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM; QQKN
+FCE3 ; [.15F8.0020.0018.FCE3][.1663.0020.0018.FCE3] # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM; QQKN
+FC72 ; [.15F8.0020.0019.FC72][.1663.0020.0019.FC72] # ARABIC LIGATURE TEH WITH MEEM FINAL FORM; QQKN
+FC0E ; [.15F8.0020.001A.FC0E][.1663.0020.001A.FC0E] # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM; QQKN
+FD55 ; [.15F8.0020.0017.FD55][.1663.0020.0017.FD55][.15FF.0020.001F.FD55] # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM; QQKN
+FD56 ; [.15F8.0020.0017.FD56][.1663.0020.0017.FD56][.1605.0020.001F.FD56] # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD57 ; [.15F8.0020.0017.FD57][.1663.0020.0017.FD57][.1606.0020.001F.FD57] # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM; QQKN
+FDA4 ; [.15F8.0020.0019.FDA4][.1663.0020.0019.FDA4][.167F.0020.001F.FDA4] # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDA3 ; [.15F8.0020.0019.FDA3][.1663.0020.0019.FDA3][.1680.0020.001F.FDA3] # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM; QQKN
+FC73 ; [.15F8.0020.0019.FC73][.1666.0020.0019.FC73] # ARABIC LIGATURE TEH WITH NOON FINAL FORM; QQKN
+FCA5 ; [.15F8.0020.0017.FCA5][.166F.0020.0017.FCA5] # ARABIC LIGATURE TEH WITH HEH INITIAL FORM; QQKN
+FCE4 ; [.15F8.0020.0018.FCE4][.166F.0020.0018.FCE4] # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM; QQKN
+FC74 ; [.15F8.0020.0019.FC74][.167F.0020.0019.FC74] # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC0F ; [.15F8.0020.001A.FC0F][.167F.0020.001A.FC0F] # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC75 ; [.15F8.0020.0019.FC75][.1680.0020.0019.FC75] # ARABIC LIGATURE TEH WITH YEH FINAL FORM; QQKN
+FC10 ; [.15F8.0020.001A.FC10][.1680.0020.001A.FC10] # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM; QQKN
+062B ; [.15F9.0020.0002.062B] # ARABIC LETTER THEH
+FE9B ; [.15F9.0020.0017.FE9B] # ARABIC LETTER THEH INITIAL FORM; QQK
+FE9C ; [.15F9.0020.0018.FE9C] # ARABIC LETTER THEH MEDIAL FORM; QQK
+FE9A ; [.15F9.0020.0019.FE9A] # ARABIC LETTER THEH FINAL FORM; QQK
+FE99 ; [.15F9.0020.001A.FE99] # ARABIC LETTER THEH ISOLATED FORM; QQK
+FC11 ; [.15F9.0020.001A.FC11][.15FF.0020.001A.FC11] # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM; QQKN
+FC76 ; [.15F9.0020.0019.FC76][.161A.0020.0019.FC76] # ARABIC LIGATURE THEH WITH REH FINAL FORM; QQKN
+FC77 ; [.15F9.0020.0019.FC77][.161B.0020.0019.FC77] # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM; QQKN
+FCA6 ; [.15F9.0020.0017.FCA6][.1663.0020.0017.FCA6] # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM; QQKN
+FCE5 ; [.15F9.0020.0018.FCE5][.1663.0020.0018.FCE5] # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM; QQKN
+FC78 ; [.15F9.0020.0019.FC78][.1663.0020.0019.FC78] # ARABIC LIGATURE THEH WITH MEEM FINAL FORM; QQKN
+FC12 ; [.15F9.0020.001A.FC12][.1663.0020.001A.FC12] # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM; QQKN
+FC79 ; [.15F9.0020.0019.FC79][.1666.0020.0019.FC79] # ARABIC LIGATURE THEH WITH NOON FINAL FORM; QQKN
+FCE6 ; [.15F9.0020.0018.FCE6][.166F.0020.0018.FCE6] # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM; QQKN
+FC7A ; [.15F9.0020.0019.FC7A][.167F.0020.0019.FC7A] # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC13 ; [.15F9.0020.001A.FC13][.167F.0020.001A.FC13] # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC7B ; [.15F9.0020.0019.FC7B][.1680.0020.0019.FC7B] # ARABIC LIGATURE THEH WITH YEH FINAL FORM; QQKN
+FC14 ; [.15F9.0020.001A.FC14][.1680.0020.001A.FC14] # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM; QQKN
+0679 ; [.15FA.0020.0002.0679] # ARABIC LETTER TTEH
+FB68 ; [.15FA.0020.0017.FB68] # ARABIC LETTER TTEH INITIAL FORM; QQK
+FB69 ; [.15FA.0020.0018.FB69] # ARABIC LETTER TTEH MEDIAL FORM; QQK
+FB67 ; [.15FA.0020.0019.FB67] # ARABIC LETTER TTEH FINAL FORM; QQK
+FB66 ; [.15FA.0020.001A.FB66] # ARABIC LETTER TTEH ISOLATED FORM; QQK
+067A ; [.15FB.0020.0002.067A] # ARABIC LETTER TTEHEH
+FB60 ; [.15FB.0020.0017.FB60] # ARABIC LETTER TTEHEH INITIAL FORM; QQK
+FB61 ; [.15FB.0020.0018.FB61] # ARABIC LETTER TTEHEH MEDIAL FORM; QQK
+FB5F ; [.15FB.0020.0019.FB5F] # ARABIC LETTER TTEHEH FINAL FORM; QQK
+FB5E ; [.15FB.0020.001A.FB5E] # ARABIC LETTER TTEHEH ISOLATED FORM; QQK
+067C ; [.15FC.0020.0002.067C] # ARABIC LETTER TEH WITH RING
+067D ; [.15FD.0020.0002.067D] # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067F ; [.15FE.0020.0002.067F] # ARABIC LETTER TEHEH
+FB64 ; [.15FE.0020.0017.FB64] # ARABIC LETTER TEHEH INITIAL FORM; QQK
+FB65 ; [.15FE.0020.0018.FB65] # ARABIC LETTER TEHEH MEDIAL FORM; QQK
+FB63 ; [.15FE.0020.0019.FB63] # ARABIC LETTER TEHEH FINAL FORM; QQK
+FB62 ; [.15FE.0020.001A.FB62] # ARABIC LETTER TEHEH ISOLATED FORM; QQK
+062C ; [.15FF.0020.0002.062C] # ARABIC LETTER JEEM
+FE9F ; [.15FF.0020.0017.FE9F] # ARABIC LETTER JEEM INITIAL FORM; QQK
+FEA0 ; [.15FF.0020.0018.FEA0] # ARABIC LETTER JEEM MEDIAL FORM; QQK
+FE9E ; [.15FF.0020.0019.FE9E] # ARABIC LETTER JEEM FINAL FORM; QQK
+FE9D ; [.15FF.0020.001A.FE9D] # ARABIC LETTER JEEM ISOLATED FORM; QQK
+FCA7 ; [.15FF.0020.0017.FCA7][.1605.0020.0017.FCA7] # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM; QQKN
+FC15 ; [.15FF.0020.001A.FC15][.1605.0020.001A.FC15] # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM; QQKN
+FDA6 ; [.15FF.0020.0019.FDA6][.1605.0020.0019.FDA6][.167F.0020.001F.FDA6] # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDBE ; [.15FF.0020.0019.FDBE][.1605.0020.0019.FDBE][.1680.0020.001F.FDBE] # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM; QQKN
+FDFB ; [.15FF.0020.001A.FDFB][.165D.0020.001A.FDFB][*0209.0020.001F.FDFB][.15FF.0020.001F.FDFB][.165D.0020.001F.FDFB][.15EA.0020.001F.FDFB][.165D.0020.001F.FDFB][.166F.0020.001F.FDFB] # ARABIC LIGATURE JALLAJALALOUHOU; QQKN
+FCA8 ; [.15FF.0020.0017.FCA8][.1663.0020.0017.FCA8] # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM; QQKN
+FC16 ; [.15FF.0020.001A.FC16][.1663.0020.001A.FC16] # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM; QQKN
+FD59 ; [.15FF.0020.0017.FD59][.1663.0020.0017.FD59][.1605.0020.001F.FD59] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD58 ; [.15FF.0020.0019.FD58][.1663.0020.0019.FD58][.1605.0020.001F.FD58] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM; QQKN
+FDA7 ; [.15FF.0020.0019.FDA7][.1663.0020.0019.FDA7][.167F.0020.001F.FDA7] # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDA5 ; [.15FF.0020.0019.FDA5][.1663.0020.0019.FDA5][.1680.0020.001F.FDA5] # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM; QQKN
+FD1D ; [.15FF.0020.0019.FD1D][.167F.0020.0019.FD1D] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD01 ; [.15FF.0020.001A.FD01][.167F.0020.001A.FD01] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD1E ; [.15FF.0020.0019.FD1E][.1680.0020.0019.FD1E] # ARABIC LIGATURE JEEM WITH YEH FINAL FORM; QQKN
+FD02 ; [.15FF.0020.001A.FD02][.1680.0020.001A.FD02] # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM; QQKN
+0683 ; [.1600.0020.0002.0683] # ARABIC LETTER NYEH
+FB78 ; [.1600.0020.0017.FB78] # ARABIC LETTER NYEH INITIAL FORM; QQK
+FB79 ; [.1600.0020.0018.FB79] # ARABIC LETTER NYEH MEDIAL FORM; QQK
+FB77 ; [.1600.0020.0019.FB77] # ARABIC LETTER NYEH FINAL FORM; QQK
+FB76 ; [.1600.0020.001A.FB76] # ARABIC LETTER NYEH ISOLATED FORM; QQK
+0684 ; [.1601.0020.0002.0684] # ARABIC LETTER DYEH
+FB74 ; [.1601.0020.0017.FB74] # ARABIC LETTER DYEH INITIAL FORM; QQK
+FB75 ; [.1601.0020.0018.FB75] # ARABIC LETTER DYEH MEDIAL FORM; QQK
+FB73 ; [.1601.0020.0019.FB73] # ARABIC LETTER DYEH FINAL FORM; QQK
+FB72 ; [.1601.0020.001A.FB72] # ARABIC LETTER DYEH ISOLATED FORM; QQK
+0686 ; [.1602.0020.0002.0686] # ARABIC LETTER TCHEH
+FB7C ; [.1602.0020.0017.FB7C] # ARABIC LETTER TCHEH INITIAL FORM; QQK
+FB7D ; [.1602.0020.0018.FB7D] # ARABIC LETTER TCHEH MEDIAL FORM; QQK
+FB7B ; [.1602.0020.0019.FB7B] # ARABIC LETTER TCHEH FINAL FORM; QQK
+FB7A ; [.1602.0020.001A.FB7A] # ARABIC LETTER TCHEH ISOLATED FORM; QQK
+06BF ; [.1603.0020.0002.06BF] # ARABIC LETTER TCHEH WITH DOT ABOVE
+0687 ; [.1604.0020.0002.0687] # ARABIC LETTER TCHEHEH
+FB80 ; [.1604.0020.0017.FB80] # ARABIC LETTER TCHEHEH INITIAL FORM; QQK
+FB81 ; [.1604.0020.0018.FB81] # ARABIC LETTER TCHEHEH MEDIAL FORM; QQK
+FB7F ; [.1604.0020.0019.FB7F] # ARABIC LETTER TCHEHEH FINAL FORM; QQK
+FB7E ; [.1604.0020.001A.FB7E] # ARABIC LETTER TCHEHEH ISOLATED FORM; QQK
+062D ; [.1605.0020.0002.062D] # ARABIC LETTER HAH
+FEA3 ; [.1605.0020.0017.FEA3] # ARABIC LETTER HAH INITIAL FORM; QQK
+FEA4 ; [.1605.0020.0018.FEA4] # ARABIC LETTER HAH MEDIAL FORM; QQK
+FEA2 ; [.1605.0020.0019.FEA2] # ARABIC LETTER HAH FINAL FORM; QQK
+FEA1 ; [.1605.0020.001A.FEA1] # ARABIC LETTER HAH ISOLATED FORM; QQK
+FCA9 ; [.1605.0020.0017.FCA9][.15FF.0020.0017.FCA9] # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM; QQKN
+FC17 ; [.1605.0020.001A.FC17][.15FF.0020.001A.FC17] # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM; QQKN
+FDBF ; [.1605.0020.0019.FDBF][.15FF.0020.0019.FDBF][.1680.0020.001F.FDBF] # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM; QQKN
+FCAA ; [.1605.0020.0017.FCAA][.1663.0020.0017.FCAA] # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM; QQKN
+FC18 ; [.1605.0020.001A.FC18][.1663.0020.001A.FC18] # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM; QQKN
+FD5B ; [.1605.0020.0019.FD5B][.1663.0020.0019.FD5B][.167F.0020.001F.FD5B] # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD5A ; [.1605.0020.0019.FD5A][.1663.0020.0019.FD5A][.1680.0020.001F.FD5A] # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM; QQKN
+FD1B ; [.1605.0020.0019.FD1B][.167F.0020.0019.FD1B] # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FCFF ; [.1605.0020.001A.FCFF][.167F.0020.001A.FCFF] # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD1C ; [.1605.0020.0019.FD1C][.1680.0020.0019.FD1C] # ARABIC LIGATURE HAH WITH YEH FINAL FORM; QQKN
+FD00 ; [.1605.0020.001A.FD00][.1680.0020.001A.FD00] # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM; QQKN
+062E ; [.1606.0020.0002.062E] # ARABIC LETTER KHAH
+FEA7 ; [.1606.0020.0017.FEA7] # ARABIC LETTER KHAH INITIAL FORM; QQK
+FEA8 ; [.1606.0020.0018.FEA8] # ARABIC LETTER KHAH MEDIAL FORM; QQK
+FEA6 ; [.1606.0020.0019.FEA6] # ARABIC LETTER KHAH FINAL FORM; QQK
+FEA5 ; [.1606.0020.001A.FEA5] # ARABIC LETTER KHAH ISOLATED FORM; QQK
+FCAB ; [.1606.0020.0017.FCAB][.15FF.0020.0017.FCAB] # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM; QQKN
+FC19 ; [.1606.0020.001A.FC19][.15FF.0020.001A.FC19] # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM; QQKN
+FC1A ; [.1606.0020.001A.FC1A][.1605.0020.001A.FC1A] # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM; QQKN
+FCAC ; [.1606.0020.0017.FCAC][.1663.0020.0017.FCAC] # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM; QQKN
+FC1B ; [.1606.0020.001A.FC1B][.1663.0020.001A.FC1B] # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM; QQKN
+FD1F ; [.1606.0020.0019.FD1F][.167F.0020.0019.FD1F] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FD03 ; [.1606.0020.001A.FD03][.167F.0020.001A.FD03] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD20 ; [.1606.0020.0019.FD20][.1680.0020.0019.FD20] # ARABIC LIGATURE KHAH WITH YEH FINAL FORM; QQKN
+FD04 ; [.1606.0020.001A.FD04][.1680.0020.001A.FD04] # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM; QQKN
+0681 ; [.1607.0020.0002.0681] # ARABIC LETTER HAH WITH HAMZA ABOVE
+0682 ; [.1608.0020.0002.0682] # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0685 ; [.1609.0020.0002.0685] # ARABIC LETTER HAH WITH THREE DOTS ABOVE
+0757 ; [.160A.0020.0002.0757] # ARABIC LETTER HAH WITH TWO DOTS ABOVE
+0758 ; [.160B.0020.0002.0758] # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW
+062F ; [.160C.0020.0002.062F] # ARABIC LETTER DAL
+FEAA ; [.160C.0020.0019.FEAA] # ARABIC LETTER DAL FINAL FORM; QQK
+FEA9 ; [.160C.0020.001A.FEA9] # ARABIC LETTER DAL ISOLATED FORM; QQK
+0630 ; [.160D.0020.0002.0630] # ARABIC LETTER THAL
+FEAC ; [.160D.0020.0019.FEAC] # ARABIC LETTER THAL FINAL FORM; QQK
+FEAB ; [.160D.0020.001A.FEAB] # ARABIC LETTER THAL ISOLATED FORM; QQK
+FC5B ; [.160D.0020.001A.FC5B][.0000.00F3.001A.FC5B] # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+0688 ; [.160E.0020.0002.0688] # ARABIC LETTER DDAL
+FB89 ; [.160E.0020.0019.FB89] # ARABIC LETTER DDAL FINAL FORM; QQK
+FB88 ; [.160E.0020.001A.FB88] # ARABIC LETTER DDAL ISOLATED FORM; QQK
+0689 ; [.160F.0020.0002.0689] # ARABIC LETTER DAL WITH RING
+068A ; [.1610.0020.0002.068A] # ARABIC LETTER DAL WITH DOT BELOW
+068B ; [.1611.0020.0002.068B] # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068C ; [.1612.0020.0002.068C] # ARABIC LETTER DAHAL
+FB85 ; [.1612.0020.0019.FB85] # ARABIC LETTER DAHAL FINAL FORM; QQK
+FB84 ; [.1612.0020.001A.FB84] # ARABIC LETTER DAHAL ISOLATED FORM; QQK
+068D ; [.1613.0020.0002.068D] # ARABIC LETTER DDAHAL
+FB83 ; [.1613.0020.0019.FB83] # ARABIC LETTER DDAHAL FINAL FORM; QQK
+FB82 ; [.1613.0020.001A.FB82] # ARABIC LETTER DDAHAL ISOLATED FORM; QQK
+068E ; [.1614.0020.0002.068E] # ARABIC LETTER DUL
+FB87 ; [.1614.0020.0019.FB87] # ARABIC LETTER DUL FINAL FORM; QQK
+FB86 ; [.1614.0020.001A.FB86] # ARABIC LETTER DUL ISOLATED FORM; QQK
+068F ; [.1615.0020.0002.068F] # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690 ; [.1616.0020.0002.0690] # ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+06EE ; [.1617.0020.0002.06EE] # ARABIC LETTER DAL WITH INVERTED V
+0759 ; [.1618.0020.0002.0759] # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH
+075A ; [.1619.0020.0002.075A] # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW
+0631 ; [.161A.0020.0002.0631] # ARABIC LETTER REH
+FEAE ; [.161A.0020.0019.FEAE] # ARABIC LETTER REH FINAL FORM; QQK
+FEAD ; [.161A.0020.001A.FEAD] # ARABIC LETTER REH ISOLATED FORM; QQK
+FC5C ; [.161A.0020.001A.FC5C][.0000.00F3.001A.FC5C] # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+FDF6 ; [.161A.0020.001A.FDF6][.1629.0020.001A.FDF6][.1675.0020.001F.FDF6][.165D.0020.001F.FDF6] # ARABIC LIGATURE RASOUL ISOLATED FORM; QQKN
+FDFC ; [.161A.0020.001A.FDFC][.1681.0020.001A.FDFC][.15EA.0020.001F.FDFC][.165D.0020.001F.FDFC] # RIAL SIGN; QQKN
+0632 ; [.161B.0020.0002.0632] # ARABIC LETTER ZAIN
+FEB0 ; [.161B.0020.0019.FEB0] # ARABIC LETTER ZAIN FINAL FORM; QQK
+FEAF ; [.161B.0020.001A.FEAF] # ARABIC LETTER ZAIN ISOLATED FORM; QQK
+0691 ; [.161C.0020.0002.0691] # ARABIC LETTER RREH
+FB8D ; [.161C.0020.0019.FB8D] # ARABIC LETTER RREH FINAL FORM; QQK
+FB8C ; [.161C.0020.001A.FB8C] # ARABIC LETTER RREH ISOLATED FORM; QQK
+0692 ; [.161D.0020.0002.0692] # ARABIC LETTER REH WITH SMALL V
+0693 ; [.161E.0020.0002.0693] # ARABIC LETTER REH WITH RING
+0694 ; [.161F.0020.0002.0694] # ARABIC LETTER REH WITH DOT BELOW
+0695 ; [.1620.0020.0002.0695] # ARABIC LETTER REH WITH SMALL V BELOW
+0696 ; [.1621.0020.0002.0696] # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697 ; [.1622.0020.0002.0697] # ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698 ; [.1623.0020.0002.0698] # ARABIC LETTER JEH
+FB8B ; [.1623.0020.0019.FB8B] # ARABIC LETTER JEH FINAL FORM; QQK
+FB8A ; [.1623.0020.001A.FB8A] # ARABIC LETTER JEH ISOLATED FORM; QQK
+0699 ; [.1624.0020.0002.0699] # ARABIC LETTER REH WITH FOUR DOTS ABOVE
+06EF ; [.1625.0020.0002.06EF] # ARABIC LETTER REH WITH INVERTED V
+075B ; [.1626.0020.0002.075B] # ARABIC LETTER REH WITH STROKE
+076B ; [.1627.0020.0002.076B] # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE
+076C ; [.1628.0020.0002.076C] # ARABIC LETTER REH WITH HAMZA ABOVE
+0633 ; [.1629.0020.0002.0633] # ARABIC LETTER SEEN
+FEB3 ; [.1629.0020.0017.FEB3] # ARABIC LETTER SEEN INITIAL FORM; QQK
+FEB4 ; [.1629.0020.0018.FEB4] # ARABIC LETTER SEEN MEDIAL FORM; QQK
+FEB2 ; [.1629.0020.0019.FEB2] # ARABIC LETTER SEEN FINAL FORM; QQK
+FEB1 ; [.1629.0020.001A.FEB1] # ARABIC LETTER SEEN ISOLATED FORM; QQK
+FCAD ; [.1629.0020.0017.FCAD][.15FF.0020.0017.FCAD] # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM; QQKN
+FD34 ; [.1629.0020.0018.FD34][.15FF.0020.0018.FD34] # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM; QQKN
+FC1C ; [.1629.0020.001A.FC1C][.15FF.0020.001A.FC1C] # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM; QQKN
+FD5D ; [.1629.0020.0017.FD5D][.15FF.0020.0017.FD5D][.1605.0020.001F.FD5D] # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM; QQKN
+FD5E ; [.1629.0020.0019.FD5E][.15FF.0020.0019.FD5E][.167F.0020.001F.FD5E] # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FCAE ; [.1629.0020.0017.FCAE][.1605.0020.0017.FCAE] # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM; QQKN
+FD35 ; [.1629.0020.0018.FD35][.1605.0020.0018.FD35] # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM; QQKN
+FC1D ; [.1629.0020.001A.FC1D][.1605.0020.001A.FC1D] # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM; QQKN
+FD5C ; [.1629.0020.0017.FD5C][.1605.0020.0017.FD5C][.15FF.0020.001F.FD5C] # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM; QQKN
+FCAF ; [.1629.0020.0017.FCAF][.1606.0020.0017.FCAF] # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM; QQKN
+FD36 ; [.1629.0020.0018.FD36][.1606.0020.0018.FD36] # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM; QQKN
+FC1E ; [.1629.0020.001A.FC1E][.1606.0020.001A.FC1E] # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM; QQKN
+FDA8 ; [.1629.0020.0019.FDA8][.1606.0020.0019.FDA8][.167F.0020.001F.FDA8] # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDC6 ; [.1629.0020.0019.FDC6][.1606.0020.0019.FDC6][.1680.0020.001F.FDC6] # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM; QQKN
+FD2A ; [.1629.0020.0019.FD2A][.161A.0020.0019.FD2A] # ARABIC LIGATURE SEEN WITH REH FINAL FORM; QQKN
+FD0E ; [.1629.0020.001A.FD0E][.161A.0020.001A.FD0E] # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM; QQKN
+FCB0 ; [.1629.0020.0017.FCB0][.1663.0020.0017.FCB0] # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM; QQKN
+FCE7 ; [.1629.0020.0018.FCE7][.1663.0020.0018.FCE7] # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM; QQKN
+FC1F ; [.1629.0020.001A.FC1F][.1663.0020.001A.FC1F] # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM; QQKN
+FD61 ; [.1629.0020.0017.FD61][.1663.0020.0017.FD61][.15FF.0020.001F.FD61] # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM; QQKN
+FD60 ; [.1629.0020.0017.FD60][.1663.0020.0017.FD60][.1605.0020.001F.FD60] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD5F ; [.1629.0020.0019.FD5F][.1663.0020.0019.FD5F][.1605.0020.001F.FD5F] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM; QQKN
+FD63 ; [.1629.0020.0017.FD63][.1663.0020.0017.FD63][.1663.0020.001F.FD63] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD62 ; [.1629.0020.0019.FD62][.1663.0020.0019.FD62][.1663.0020.001F.FD62] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD31 ; [.1629.0020.0017.FD31][.166F.0020.0017.FD31] # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM; QQKN
+FCE8 ; [.1629.0020.0018.FCE8][.166F.0020.0018.FCE8] # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM; QQKN
+FD17 ; [.1629.0020.0019.FD17][.167F.0020.0019.FD17] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCFB ; [.1629.0020.001A.FCFB][.167F.0020.001A.FCFB] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD18 ; [.1629.0020.0019.FD18][.1680.0020.0019.FD18] # ARABIC LIGATURE SEEN WITH YEH FINAL FORM; QQKN
+FCFC ; [.1629.0020.001A.FCFC][.1680.0020.001A.FCFC] # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM; QQKN
+0634 ; [.162A.0020.0002.0634] # ARABIC LETTER SHEEN
+FEB7 ; [.162A.0020.0017.FEB7] # ARABIC LETTER SHEEN INITIAL FORM; QQK
+FEB8 ; [.162A.0020.0018.FEB8] # ARABIC LETTER SHEEN MEDIAL FORM; QQK
+FEB6 ; [.162A.0020.0019.FEB6] # ARABIC LETTER SHEEN FINAL FORM; QQK
+FEB5 ; [.162A.0020.001A.FEB5] # ARABIC LETTER SHEEN ISOLATED FORM; QQK
+FD2D ; [.162A.0020.0017.FD2D][.15FF.0020.0017.FD2D] # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM; QQKN
+FD37 ; [.162A.0020.0018.FD37][.15FF.0020.0018.FD37] # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM; QQKN
+FD25 ; [.162A.0020.0019.FD25][.15FF.0020.0019.FD25] # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM; QQKN
+FD09 ; [.162A.0020.001A.FD09][.15FF.0020.001A.FD09] # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM; QQKN
+FD69 ; [.162A.0020.0019.FD69][.15FF.0020.0019.FD69][.1680.0020.001F.FD69] # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM; QQKN
+FD2E ; [.162A.0020.0017.FD2E][.1605.0020.0017.FD2E] # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM; QQKN
+FD38 ; [.162A.0020.0018.FD38][.1605.0020.0018.FD38] # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM; QQKN
+FD26 ; [.162A.0020.0019.FD26][.1605.0020.0019.FD26] # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM; QQKN
+FD0A ; [.162A.0020.001A.FD0A][.1605.0020.001A.FD0A] # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM; QQKN
+FD68 ; [.162A.0020.0017.FD68][.1605.0020.0017.FD68][.1663.0020.001F.FD68] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM; QQKN
+FD67 ; [.162A.0020.0019.FD67][.1605.0020.0019.FD67][.1663.0020.001F.FD67] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM; QQKN
+FDAA ; [.162A.0020.0019.FDAA][.1605.0020.0019.FDAA][.1680.0020.001F.FDAA] # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM; QQKN
+FD2F ; [.162A.0020.0017.FD2F][.1606.0020.0017.FD2F] # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM; QQKN
+FD39 ; [.162A.0020.0018.FD39][.1606.0020.0018.FD39] # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM; QQKN
+FD27 ; [.162A.0020.0019.FD27][.1606.0020.0019.FD27] # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM; QQKN
+FD0B ; [.162A.0020.001A.FD0B][.1606.0020.001A.FD0B] # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM; QQKN
+FD29 ; [.162A.0020.0019.FD29][.161A.0020.0019.FD29] # ARABIC LIGATURE SHEEN WITH REH FINAL FORM; QQKN
+FD0D ; [.162A.0020.001A.FD0D][.161A.0020.001A.FD0D] # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM; QQKN
+FD30 ; [.162A.0020.0017.FD30][.1663.0020.0017.FD30] # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM; QQKN
+FCE9 ; [.162A.0020.0018.FCE9][.1663.0020.0018.FCE9] # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM; QQKN
+FD28 ; [.162A.0020.0019.FD28][.1663.0020.0019.FD28] # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM; QQKN
+FD0C ; [.162A.0020.001A.FD0C][.1663.0020.001A.FD0C] # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM; QQKN
+FD6B ; [.162A.0020.0017.FD6B][.1663.0020.0017.FD6B][.1606.0020.001F.FD6B] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM; QQKN
+FD6A ; [.162A.0020.0019.FD6A][.1663.0020.0019.FD6A][.1606.0020.001F.FD6A] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM; QQKN
+FD6D ; [.162A.0020.0017.FD6D][.1663.0020.0017.FD6D][.1663.0020.001F.FD6D] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD6C ; [.162A.0020.0019.FD6C][.1663.0020.0019.FD6C][.1663.0020.001F.FD6C] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD32 ; [.162A.0020.0017.FD32][.166F.0020.0017.FD32] # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM; QQKN
+FCEA ; [.162A.0020.0018.FCEA][.166F.0020.0018.FCEA] # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM; QQKN
+FD19 ; [.162A.0020.0019.FD19][.167F.0020.0019.FD19] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCFD ; [.162A.0020.001A.FCFD][.167F.0020.001A.FCFD] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD1A ; [.162A.0020.0019.FD1A][.1680.0020.0019.FD1A] # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM; QQKN
+FCFE ; [.162A.0020.001A.FCFE][.1680.0020.001A.FCFE] # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM; QQKN
+069A ; [.162B.0020.0002.069A] # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069B ; [.162C.0020.0002.069B] # ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C ; [.162D.0020.0002.069C] # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+06FA ; [.162E.0020.0002.06FA] # ARABIC LETTER SHEEN WITH DOT BELOW
+075C ; [.162F.0020.0002.075C] # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE
+076D ; [.1630.0020.0002.076D] # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+0635 ; [.1631.0020.0002.0635] # ARABIC LETTER SAD
+FEBB ; [.1631.0020.0017.FEBB] # ARABIC LETTER SAD INITIAL FORM; QQK
+FEBC ; [.1631.0020.0018.FEBC] # ARABIC LETTER SAD MEDIAL FORM; QQK
+FEBA ; [.1631.0020.0019.FEBA] # ARABIC LETTER SAD FINAL FORM; QQK
+FEB9 ; [.1631.0020.001A.FEB9] # ARABIC LETTER SAD ISOLATED FORM; QQK
+FCB1 ; [.1631.0020.0017.FCB1][.1605.0020.0017.FCB1] # ARABIC LIGATURE SAD WITH HAH INITIAL FORM; QQKN
+FC20 ; [.1631.0020.001A.FC20][.1605.0020.001A.FC20] # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM; QQKN
+FD65 ; [.1631.0020.0017.FD65][.1605.0020.0017.FD65][.1605.0020.001F.FD65] # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM; QQKN
+FD64 ; [.1631.0020.0019.FD64][.1605.0020.0019.FD64][.1605.0020.001F.FD64] # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM; QQKN
+FDA9 ; [.1631.0020.0019.FDA9][.1605.0020.0019.FDA9][.1680.0020.001F.FDA9] # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM; QQKN
+FCB2 ; [.1631.0020.0017.FCB2][.1606.0020.0017.FCB2] # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM; QQKN
+FD2B ; [.1631.0020.0019.FD2B][.161A.0020.0019.FD2B] # ARABIC LIGATURE SAD WITH REH FINAL FORM; QQKN
+FD0F ; [.1631.0020.001A.FD0F][.161A.0020.001A.FD0F] # ARABIC LIGATURE SAD WITH REH ISOLATED FORM; QQKN
+FDF5 ; [.1631.0020.001A.FDF5][.165D.0020.001A.FDF5][.1639.0020.001F.FDF5][.1663.0020.001F.FDF5] # ARABIC LIGATURE SALAM ISOLATED FORM; QQKN
+FDF9 ; [.1631.0020.001A.FDF9][.165D.0020.001A.FDF9][.167F.0020.001F.FDF9] # ARABIC LIGATURE SALLA ISOLATED FORM; QQKN
+FDFA ; [.1631.0020.001A.FDFA][.165D.0020.001A.FDFA][.167F.0020.001F.FDFA][*0209.0020.001F.FDFA][.15EA.0020.001F.FDFA][.165D.0020.001F.FDFA][.165D.0020.001F.FDFA][.166F.0020.001F.FDFA][*0209.0020.001F.FDFA][.1639.0020.001F.FDFA][.165D.0020.001F.FDFA][.1680.0020.001F.FDFA][.166F.0020.001F.FDFA][*0209.0020.001F.FDFA][.1675.0020.001F.FDFA][.1629.0020.001F.FDFA][.165D.0020.001F.FDFA][.1663.0020.001F.FDFA] # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM; QQKN
+FDF0 ; [.1631.0020.001A.FDF0][.165D.0020.001A.FDF0][.1686.0020.001F.FDF0] # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM; QQKN
+FCB3 ; [.1631.0020.0017.FCB3][.1663.0020.0017.FCB3] # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM; QQKN
+FC21 ; [.1631.0020.001A.FC21][.1663.0020.001A.FC21] # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM; QQKN
+FDC5 ; [.1631.0020.0017.FDC5][.1663.0020.0017.FDC5][.1663.0020.001F.FDC5] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD66 ; [.1631.0020.0019.FD66][.1663.0020.0019.FD66][.1663.0020.001F.FD66] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD21 ; [.1631.0020.0019.FD21][.167F.0020.0019.FD21] # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM; QQKN
+FD05 ; [.1631.0020.001A.FD05][.167F.0020.001A.FD05] # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD22 ; [.1631.0020.0019.FD22][.1680.0020.0019.FD22] # ARABIC LIGATURE SAD WITH YEH FINAL FORM; QQKN
+FD06 ; [.1631.0020.001A.FD06][.1680.0020.001A.FD06] # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM; QQKN
+0636 ; [.1632.0020.0002.0636] # ARABIC LETTER DAD
+FEBF ; [.1632.0020.0017.FEBF] # ARABIC LETTER DAD INITIAL FORM; QQK
+FEC0 ; [.1632.0020.0018.FEC0] # ARABIC LETTER DAD MEDIAL FORM; QQK
+FEBE ; [.1632.0020.0019.FEBE] # ARABIC LETTER DAD FINAL FORM; QQK
+FEBD ; [.1632.0020.001A.FEBD] # ARABIC LETTER DAD ISOLATED FORM; QQK
+FCB4 ; [.1632.0020.0017.FCB4][.15FF.0020.0017.FCB4] # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM; QQKN
+FC22 ; [.1632.0020.001A.FC22][.15FF.0020.001A.FC22] # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM; QQKN
+FCB5 ; [.1632.0020.0017.FCB5][.1605.0020.0017.FCB5] # ARABIC LIGATURE DAD WITH HAH INITIAL FORM; QQKN
+FC23 ; [.1632.0020.001A.FC23][.1605.0020.001A.FC23] # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM; QQKN
+FD6E ; [.1632.0020.0019.FD6E][.1605.0020.0019.FD6E][.167F.0020.001F.FD6E] # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDAB ; [.1632.0020.0019.FDAB][.1605.0020.0019.FDAB][.1680.0020.001F.FDAB] # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM; QQKN
+FCB6 ; [.1632.0020.0017.FCB6][.1606.0020.0017.FCB6] # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM; QQKN
+FC24 ; [.1632.0020.001A.FC24][.1606.0020.001A.FC24] # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM; QQKN
+FD70 ; [.1632.0020.0017.FD70][.1606.0020.0017.FD70][.1663.0020.001F.FD70] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FD6F ; [.1632.0020.0019.FD6F][.1606.0020.0019.FD6F][.1663.0020.001F.FD6F] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM; QQKN
+FD2C ; [.1632.0020.0019.FD2C][.161A.0020.0019.FD2C] # ARABIC LIGATURE DAD WITH REH FINAL FORM; QQKN
+FD10 ; [.1632.0020.001A.FD10][.161A.0020.001A.FD10] # ARABIC LIGATURE DAD WITH REH ISOLATED FORM; QQKN
+FCB7 ; [.1632.0020.0017.FCB7][.1663.0020.0017.FCB7] # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM; QQKN
+FC25 ; [.1632.0020.001A.FC25][.1663.0020.001A.FC25] # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM; QQKN
+FD23 ; [.1632.0020.0019.FD23][.167F.0020.0019.FD23] # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM; QQKN
+FD07 ; [.1632.0020.001A.FD07][.167F.0020.001A.FD07] # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD24 ; [.1632.0020.0019.FD24][.1680.0020.0019.FD24] # ARABIC LIGATURE DAD WITH YEH FINAL FORM; QQKN
+FD08 ; [.1632.0020.001A.FD08][.1680.0020.001A.FD08] # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM; QQKN
+069D ; [.1633.0020.0002.069D] # ARABIC LETTER SAD WITH TWO DOTS BELOW
+069E ; [.1634.0020.0002.069E] # ARABIC LETTER SAD WITH THREE DOTS ABOVE
+06FB ; [.1635.0020.0002.06FB] # ARABIC LETTER DAD WITH DOT BELOW
+0637 ; [.1636.0020.0002.0637] # ARABIC LETTER TAH
+FEC3 ; [.1636.0020.0017.FEC3] # ARABIC LETTER TAH INITIAL FORM; QQK
+FEC4 ; [.1636.0020.0018.FEC4] # ARABIC LETTER TAH MEDIAL FORM; QQK
+FEC2 ; [.1636.0020.0019.FEC2] # ARABIC LETTER TAH FINAL FORM; QQK
+FEC1 ; [.1636.0020.001A.FEC1] # ARABIC LETTER TAH ISOLATED FORM; QQK
+FCB8 ; [.1636.0020.0017.FCB8][.1605.0020.0017.FCB8] # ARABIC LIGATURE TAH WITH HAH INITIAL FORM; QQKN
+FC26 ; [.1636.0020.001A.FC26][.1605.0020.001A.FC26] # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM; QQKN
+FD33 ; [.1636.0020.0017.FD33][.1663.0020.0017.FD33] # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM; QQKN
+FD3A ; [.1636.0020.0018.FD3A][.1663.0020.0018.FD3A] # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM; QQKN
+FC27 ; [.1636.0020.001A.FC27][.1663.0020.001A.FC27] # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM; QQKN
+FD72 ; [.1636.0020.0017.FD72][.1663.0020.0017.FD72][.1605.0020.001F.FD72] # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD71 ; [.1636.0020.0019.FD71][.1663.0020.0019.FD71][.1605.0020.001F.FD71] # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM; QQKN
+FD73 ; [.1636.0020.0017.FD73][.1663.0020.0017.FD73][.1663.0020.001F.FD73] # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD74 ; [.1636.0020.0019.FD74][.1663.0020.0019.FD74][.1680.0020.001F.FD74] # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM; QQKN
+FD11 ; [.1636.0020.0019.FD11][.167F.0020.0019.FD11] # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FCF5 ; [.1636.0020.001A.FCF5][.167F.0020.001A.FCF5] # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD12 ; [.1636.0020.0019.FD12][.1680.0020.0019.FD12] # ARABIC LIGATURE TAH WITH YEH FINAL FORM; QQKN
+FCF6 ; [.1636.0020.001A.FCF6][.1680.0020.001A.FCF6] # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM; QQKN
+0638 ; [.1637.0020.0002.0638] # ARABIC LETTER ZAH
+FEC7 ; [.1637.0020.0017.FEC7] # ARABIC LETTER ZAH INITIAL FORM; QQK
+FEC8 ; [.1637.0020.0018.FEC8] # ARABIC LETTER ZAH MEDIAL FORM; QQK
+FEC6 ; [.1637.0020.0019.FEC6] # ARABIC LETTER ZAH FINAL FORM; QQK
+FEC5 ; [.1637.0020.001A.FEC5] # ARABIC LETTER ZAH ISOLATED FORM; QQK
+FCB9 ; [.1637.0020.0017.FCB9][.1663.0020.0017.FCB9] # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM; QQKN
+FD3B ; [.1637.0020.0018.FD3B][.1663.0020.0018.FD3B] # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM; QQKN
+FC28 ; [.1637.0020.001A.FC28][.1663.0020.001A.FC28] # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM; QQKN
+069F ; [.1638.0020.0002.069F] # ARABIC LETTER TAH WITH THREE DOTS ABOVE
+0639 ; [.1639.0020.0002.0639] # ARABIC LETTER AIN
+FECB ; [.1639.0020.0017.FECB] # ARABIC LETTER AIN INITIAL FORM; QQK
+FECC ; [.1639.0020.0018.FECC] # ARABIC LETTER AIN MEDIAL FORM; QQK
+FECA ; [.1639.0020.0019.FECA] # ARABIC LETTER AIN FINAL FORM; QQK
+FEC9 ; [.1639.0020.001A.FEC9] # ARABIC LETTER AIN ISOLATED FORM; QQK
+FCBA ; [.1639.0020.0017.FCBA][.15FF.0020.0017.FCBA] # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM; QQKN
+FC29 ; [.1639.0020.001A.FC29][.15FF.0020.001A.FC29] # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM; QQKN
+FDC4 ; [.1639.0020.0017.FDC4][.15FF.0020.0017.FDC4][.1663.0020.001F.FDC4] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FD75 ; [.1639.0020.0019.FD75][.15FF.0020.0019.FD75][.1663.0020.001F.FD75] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM; QQKN
+FDF7 ; [.1639.0020.001A.FDF7][.165D.0020.001A.FDF7][.1680.0020.001F.FDF7][.166F.0020.001F.FDF7] # ARABIC LIGATURE ALAYHE ISOLATED FORM; QQKN
+FCBB ; [.1639.0020.0017.FCBB][.1663.0020.0017.FCBB] # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM; QQKN
+FC2A ; [.1639.0020.001A.FC2A][.1663.0020.001A.FC2A] # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM; QQKN
+FD77 ; [.1639.0020.0017.FD77][.1663.0020.0017.FD77][.1663.0020.001F.FD77] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD76 ; [.1639.0020.0019.FD76][.1663.0020.0019.FD76][.1663.0020.001F.FD76] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD78 ; [.1639.0020.0019.FD78][.1663.0020.0019.FD78][.167F.0020.001F.FD78] # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDB6 ; [.1639.0020.0019.FDB6][.1663.0020.0019.FDB6][.1680.0020.001F.FDB6] # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM; QQKN
+FD13 ; [.1639.0020.0019.FD13][.167F.0020.0019.FD13] # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCF7 ; [.1639.0020.001A.FCF7][.167F.0020.001A.FCF7] # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD14 ; [.1639.0020.0019.FD14][.1680.0020.0019.FD14] # ARABIC LIGATURE AIN WITH YEH FINAL FORM; QQKN
+FCF8 ; [.1639.0020.001A.FCF8][.1680.0020.001A.FCF8] # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM; QQKN
+063A ; [.163A.0020.0002.063A] # ARABIC LETTER GHAIN
+FECF ; [.163A.0020.0017.FECF] # ARABIC LETTER GHAIN INITIAL FORM; QQK
+FED0 ; [.163A.0020.0018.FED0] # ARABIC LETTER GHAIN MEDIAL FORM; QQK
+FECE ; [.163A.0020.0019.FECE] # ARABIC LETTER GHAIN FINAL FORM; QQK
+FECD ; [.163A.0020.001A.FECD] # ARABIC LETTER GHAIN ISOLATED FORM; QQK
+FCBC ; [.163A.0020.0017.FCBC][.15FF.0020.0017.FCBC] # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM; QQKN
+FC2B ; [.163A.0020.001A.FC2B][.15FF.0020.001A.FC2B] # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM; QQKN
+FCBD ; [.163A.0020.0017.FCBD][.1663.0020.0017.FCBD] # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM; QQKN
+FC2C ; [.163A.0020.001A.FC2C][.1663.0020.001A.FC2C] # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM; QQKN
+FD79 ; [.163A.0020.0019.FD79][.1663.0020.0019.FD79][.1663.0020.001F.FD79] # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD7B ; [.163A.0020.0019.FD7B][.1663.0020.0019.FD7B][.167F.0020.001F.FD7B] # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD7A ; [.163A.0020.0019.FD7A][.1663.0020.0019.FD7A][.1680.0020.001F.FD7A] # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM; QQKN
+FD15 ; [.163A.0020.0019.FD15][.167F.0020.0019.FD15] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCF9 ; [.163A.0020.001A.FCF9][.167F.0020.001A.FCF9] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD16 ; [.163A.0020.0019.FD16][.1680.0020.0019.FD16] # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM; QQKN
+FCFA ; [.163A.0020.001A.FCFA][.1680.0020.001A.FCFA] # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM; QQKN
+06A0 ; [.163B.0020.0002.06A0] # ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06FC ; [.163C.0020.0002.06FC] # ARABIC LETTER GHAIN WITH DOT BELOW
+075D ; [.163D.0020.0002.075D] # ARABIC LETTER AIN WITH TWO DOTS ABOVE
+075E ; [.163E.0020.0002.075E] # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE
+075F ; [.163F.0020.0002.075F] # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE
+0641 ; [.1640.0020.0002.0641] # ARABIC LETTER FEH
+FED3 ; [.1640.0020.0017.FED3] # ARABIC LETTER FEH INITIAL FORM; QQK
+FED4 ; [.1640.0020.0018.FED4] # ARABIC LETTER FEH MEDIAL FORM; QQK
+FED2 ; [.1640.0020.0019.FED2] # ARABIC LETTER FEH FINAL FORM; QQK
+FED1 ; [.1640.0020.001A.FED1] # ARABIC LETTER FEH ISOLATED FORM; QQK
+FCBE ; [.1640.0020.0017.FCBE][.15FF.0020.0017.FCBE] # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM; QQKN
+FC2D ; [.1640.0020.001A.FC2D][.15FF.0020.001A.FC2D] # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM; QQKN
+FCBF ; [.1640.0020.0017.FCBF][.1605.0020.0017.FCBF] # ARABIC LIGATURE FEH WITH HAH INITIAL FORM; QQKN
+FC2E ; [.1640.0020.001A.FC2E][.1605.0020.001A.FC2E] # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM; QQKN
+FCC0 ; [.1640.0020.0017.FCC0][.1606.0020.0017.FCC0] # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM; QQKN
+FC2F ; [.1640.0020.001A.FC2F][.1606.0020.001A.FC2F] # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM; QQKN
+FD7D ; [.1640.0020.0017.FD7D][.1606.0020.0017.FD7D][.1663.0020.001F.FD7D] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FD7C ; [.1640.0020.0019.FD7C][.1606.0020.0019.FD7C][.1663.0020.001F.FD7C] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM; QQKN
+FCC1 ; [.1640.0020.0017.FCC1][.1663.0020.0017.FCC1] # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM; QQKN
+FC30 ; [.1640.0020.001A.FC30][.1663.0020.001A.FC30] # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM; QQKN
+FDC1 ; [.1640.0020.0019.FDC1][.1663.0020.0019.FDC1][.1680.0020.001F.FDC1] # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM; QQKN
+FC7C ; [.1640.0020.0019.FC7C][.167F.0020.0019.FC7C] # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC31 ; [.1640.0020.001A.FC31][.167F.0020.001A.FC31] # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC7D ; [.1640.0020.0019.FC7D][.1680.0020.0019.FC7D] # ARABIC LIGATURE FEH WITH YEH FINAL FORM; QQKN
+FC32 ; [.1640.0020.001A.FC32][.1680.0020.001A.FC32] # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM; QQKN
+06A1 ; [.1641.0020.0002.06A1] # ARABIC LETTER DOTLESS FEH
+06A2 ; [.1642.0020.0002.06A2] # ARABIC LETTER FEH WITH DOT MOVED BELOW
+06A3 ; [.1643.0020.0002.06A3] # ARABIC LETTER FEH WITH DOT BELOW
+06A4 ; [.1644.0020.0002.06A4] # ARABIC LETTER VEH
+FB6C ; [.1644.0020.0017.FB6C] # ARABIC LETTER VEH INITIAL FORM; QQK
+FB6D ; [.1644.0020.0018.FB6D] # ARABIC LETTER VEH MEDIAL FORM; QQK
+FB6B ; [.1644.0020.0019.FB6B] # ARABIC LETTER VEH FINAL FORM; QQK
+FB6A ; [.1644.0020.001A.FB6A] # ARABIC LETTER VEH ISOLATED FORM; QQK
+06A5 ; [.1645.0020.0002.06A5] # ARABIC LETTER FEH WITH THREE DOTS BELOW
+06A6 ; [.1646.0020.0002.06A6] # ARABIC LETTER PEHEH
+FB70 ; [.1646.0020.0017.FB70] # ARABIC LETTER PEHEH INITIAL FORM; QQK
+FB71 ; [.1646.0020.0018.FB71] # ARABIC LETTER PEHEH MEDIAL FORM; QQK
+FB6F ; [.1646.0020.0019.FB6F] # ARABIC LETTER PEHEH FINAL FORM; QQK
+FB6E ; [.1646.0020.001A.FB6E] # ARABIC LETTER PEHEH ISOLATED FORM; QQK
+0760 ; [.1647.0020.0002.0760] # ARABIC LETTER FEH WITH TWO DOTS BELOW
+0761 ; [.1648.0020.0002.0761] # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW
+066F ; [.1649.0020.0002.066F] # ARABIC LETTER DOTLESS QAF
+0642 ; [.164A.0020.0002.0642] # ARABIC LETTER QAF
+FED7 ; [.164A.0020.0017.FED7] # ARABIC LETTER QAF INITIAL FORM; QQK
+FED8 ; [.164A.0020.0018.FED8] # ARABIC LETTER QAF MEDIAL FORM; QQK
+FED6 ; [.164A.0020.0019.FED6] # ARABIC LETTER QAF FINAL FORM; QQK
+FED5 ; [.164A.0020.001A.FED5] # ARABIC LETTER QAF ISOLATED FORM; QQK
+FCC2 ; [.164A.0020.0017.FCC2][.1605.0020.0017.FCC2] # ARABIC LIGATURE QAF WITH HAH INITIAL FORM; QQKN
+FC33 ; [.164A.0020.001A.FC33][.1605.0020.001A.FC33] # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM; QQKN
+FDF1 ; [.164A.0020.001A.FDF1][.165D.0020.001A.FDF1][.1686.0020.001F.FDF1] # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM; QQKN
+FCC3 ; [.164A.0020.0017.FCC3][.1663.0020.0017.FCC3] # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM; QQKN
+FC34 ; [.164A.0020.001A.FC34][.1663.0020.001A.FC34] # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM; QQKN
+FDB4 ; [.164A.0020.0017.FDB4][.1663.0020.0017.FDB4][.1605.0020.001F.FDB4] # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD7E ; [.164A.0020.0019.FD7E][.1663.0020.0019.FD7E][.1605.0020.001F.FD7E] # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM; QQKN
+FD7F ; [.164A.0020.0019.FD7F][.1663.0020.0019.FD7F][.1663.0020.001F.FD7F] # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM; QQKN
+FDB2 ; [.164A.0020.0019.FDB2][.1663.0020.0019.FDB2][.1680.0020.001F.FDB2] # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM; QQKN
+FC7E ; [.164A.0020.0019.FC7E][.167F.0020.0019.FC7E] # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM; QQKN
+FC35 ; [.164A.0020.001A.FC35][.167F.0020.001A.FC35] # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC7F ; [.164A.0020.0019.FC7F][.1680.0020.0019.FC7F] # ARABIC LIGATURE QAF WITH YEH FINAL FORM; QQKN
+FC36 ; [.164A.0020.001A.FC36][.1680.0020.001A.FC36] # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM; QQKN
+06A7 ; [.164B.0020.0002.06A7] # ARABIC LETTER QAF WITH DOT ABOVE
+06A8 ; [.164C.0020.0002.06A8] # ARABIC LETTER QAF WITH THREE DOTS ABOVE
+0643 ; [.164D.0020.0002.0643] # ARABIC LETTER KAF
+FEDB ; [.164D.0020.0017.FEDB] # ARABIC LETTER KAF INITIAL FORM; QQK
+FEDC ; [.164D.0020.0018.FEDC] # ARABIC LETTER KAF MEDIAL FORM; QQK
+FEDA ; [.164D.0020.0019.FEDA] # ARABIC LETTER KAF FINAL FORM; QQK
+FED9 ; [.164D.0020.001A.FED9] # ARABIC LETTER KAF ISOLATED FORM; QQK
+FC80 ; [.164D.0020.0019.FC80][.15EA.0020.0019.FC80] # ARABIC LIGATURE KAF WITH ALEF FINAL FORM; QQKN
+FC37 ; [.164D.0020.001A.FC37][.15EA.0020.001A.FC37] # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM; QQKN
+FCC4 ; [.164D.0020.0017.FCC4][.15FF.0020.0017.FCC4] # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM; QQKN
+FC38 ; [.164D.0020.001A.FC38][.15FF.0020.001A.FC38] # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM; QQKN
+FCC5 ; [.164D.0020.0017.FCC5][.1605.0020.0017.FCC5] # ARABIC LIGATURE KAF WITH HAH INITIAL FORM; QQKN
+FC39 ; [.164D.0020.001A.FC39][.1605.0020.001A.FC39] # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM; QQKN
+FCC6 ; [.164D.0020.0017.FCC6][.1606.0020.0017.FCC6] # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM; QQKN
+FC3A ; [.164D.0020.001A.FC3A][.1606.0020.001A.FC3A] # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM; QQKN
+FCC7 ; [.164D.0020.0017.FCC7][.165D.0020.0017.FCC7] # ARABIC LIGATURE KAF WITH LAM INITIAL FORM; QQKN
+FCEB ; [.164D.0020.0018.FCEB][.165D.0020.0018.FCEB] # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM; QQKN
+FC81 ; [.164D.0020.0019.FC81][.165D.0020.0019.FC81] # ARABIC LIGATURE KAF WITH LAM FINAL FORM; QQKN
+FC3B ; [.164D.0020.001A.FC3B][.165D.0020.001A.FC3B] # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM; QQKN
+FCC8 ; [.164D.0020.0017.FCC8][.1663.0020.0017.FCC8] # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM; QQKN
+FCEC ; [.164D.0020.0018.FCEC][.1663.0020.0018.FCEC] # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM; QQKN
+FC82 ; [.164D.0020.0019.FC82][.1663.0020.0019.FC82] # ARABIC LIGATURE KAF WITH MEEM FINAL FORM; QQKN
+FC3C ; [.164D.0020.001A.FC3C][.1663.0020.001A.FC3C] # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM; QQKN
+FDC3 ; [.164D.0020.0017.FDC3][.1663.0020.0017.FDC3][.1663.0020.001F.FDC3] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FDBB ; [.164D.0020.0019.FDBB][.1663.0020.0019.FDBB][.1663.0020.001F.FDBB] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM; QQKN
+FDB7 ; [.164D.0020.0019.FDB7][.1663.0020.0019.FDB7][.1680.0020.001F.FDB7] # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM; QQKN
+FC83 ; [.164D.0020.0019.FC83][.167F.0020.0019.FC83] # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM; QQKN
+FC3D ; [.164D.0020.001A.FC3D][.167F.0020.001A.FC3D] # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC84 ; [.164D.0020.0019.FC84][.1680.0020.0019.FC84] # ARABIC LIGATURE KAF WITH YEH FINAL FORM; QQKN
+FC3E ; [.164D.0020.001A.FC3E][.1680.0020.001A.FC3E] # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM; QQKN
+06A9 ; [.164E.0020.0002.06A9] # ARABIC LETTER KEHEH
+FB90 ; [.164E.0020.0017.FB90] # ARABIC LETTER KEHEH INITIAL FORM; QQK
+FB91 ; [.164E.0020.0018.FB91] # ARABIC LETTER KEHEH MEDIAL FORM; QQK
+FB8F ; [.164E.0020.0019.FB8F] # ARABIC LETTER KEHEH FINAL FORM; QQK
+FB8E ; [.164E.0020.001A.FB8E] # ARABIC LETTER KEHEH ISOLATED FORM; QQK
+06AA ; [.164F.0020.0002.06AA] # ARABIC LETTER SWASH KAF
+06AB ; [.1650.0020.0002.06AB] # ARABIC LETTER KAF WITH RING
+06AC ; [.1651.0020.0002.06AC] # ARABIC LETTER KAF WITH DOT ABOVE
+06AD ; [.1652.0020.0002.06AD] # ARABIC LETTER NG
+FBD5 ; [.1652.0020.0017.FBD5] # ARABIC LETTER NG INITIAL FORM; QQK
+FBD6 ; [.1652.0020.0018.FBD6] # ARABIC LETTER NG MEDIAL FORM; QQK
+FBD4 ; [.1652.0020.0019.FBD4] # ARABIC LETTER NG FINAL FORM; QQK
+FBD3 ; [.1652.0020.001A.FBD3] # ARABIC LETTER NG ISOLATED FORM; QQK
+06AE ; [.1653.0020.0002.06AE] # ARABIC LETTER KAF WITH THREE DOTS BELOW
+06AF ; [.1654.0020.0002.06AF] # ARABIC LETTER GAF
+FB94 ; [.1654.0020.0017.FB94] # ARABIC LETTER GAF INITIAL FORM; QQK
+FB95 ; [.1654.0020.0018.FB95] # ARABIC LETTER GAF MEDIAL FORM; QQK
+FB93 ; [.1654.0020.0019.FB93] # ARABIC LETTER GAF FINAL FORM; QQK
+FB92 ; [.1654.0020.001A.FB92] # ARABIC LETTER GAF ISOLATED FORM; QQK
+06B0 ; [.1655.0020.0002.06B0] # ARABIC LETTER GAF WITH RING
+06B1 ; [.1656.0020.0002.06B1] # ARABIC LETTER NGOEH
+FB9C ; [.1656.0020.0017.FB9C] # ARABIC LETTER NGOEH INITIAL FORM; QQK
+FB9D ; [.1656.0020.0018.FB9D] # ARABIC LETTER NGOEH MEDIAL FORM; QQK
+FB9B ; [.1656.0020.0019.FB9B] # ARABIC LETTER NGOEH FINAL FORM; QQK
+FB9A ; [.1656.0020.001A.FB9A] # ARABIC LETTER NGOEH ISOLATED FORM; QQK
+06B2 ; [.1657.0020.0002.06B2] # ARABIC LETTER GAF WITH TWO DOTS BELOW
+06B3 ; [.1658.0020.0002.06B3] # ARABIC LETTER GUEH
+FB98 ; [.1658.0020.0017.FB98] # ARABIC LETTER GUEH INITIAL FORM; QQK
+FB99 ; [.1658.0020.0018.FB99] # ARABIC LETTER GUEH MEDIAL FORM; QQK
+FB97 ; [.1658.0020.0019.FB97] # ARABIC LETTER GUEH FINAL FORM; QQK
+FB96 ; [.1658.0020.001A.FB96] # ARABIC LETTER GUEH ISOLATED FORM; QQK
+06B4 ; [.1659.0020.0002.06B4] # ARABIC LETTER GAF WITH THREE DOTS ABOVE
+0762 ; [.165A.0020.0002.0762] # ARABIC LETTER KEHEH WITH DOT ABOVE
+0763 ; [.165B.0020.0002.0763] # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE
+0764 ; [.165C.0020.0002.0764] # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW
+0644 ; [.165D.0020.0002.0644] # ARABIC LETTER LAM
+FEDF ; [.165D.0020.0017.FEDF] # ARABIC LETTER LAM INITIAL FORM; QQK
+FEE0 ; [.165D.0020.0018.FEE0] # ARABIC LETTER LAM MEDIAL FORM; QQK
+FEDE ; [.165D.0020.0019.FEDE] # ARABIC LETTER LAM FINAL FORM; QQK
+FEDD ; [.165D.0020.001A.FEDD] # ARABIC LETTER LAM ISOLATED FORM; QQK
+FEF6 ; [.165D.0020.0019.FEF6][.15E2.0020.0019.FEF6] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM; QQKN
+FEF5 ; [.165D.0020.001A.FEF5][.15E2.0020.001A.FEF5] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM; QQKN
+FEF8 ; [.165D.0020.0019.FEF8][.15E3.0020.0019.FEF8] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM; QQKN
+FEF7 ; [.165D.0020.001A.FEF7][.15E3.0020.001A.FEF7] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM; QQKN
+FEFA ; [.165D.0020.0019.FEFA][.15E7.0020.0019.FEFA] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM; QQKN
+FEF9 ; [.165D.0020.001A.FEF9][.15E7.0020.001A.FEF9] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM; QQKN
+FEFC ; [.165D.0020.0019.FEFC][.15EA.0020.0019.FEFC] # ARABIC LIGATURE LAM WITH ALEF FINAL FORM; QQKN
+FEFB ; [.165D.0020.001A.FEFB][.15EA.0020.001A.FEFB] # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM; QQKN
+FCC9 ; [.165D.0020.0017.FCC9][.15FF.0020.0017.FCC9] # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM; QQKN
+FC3F ; [.165D.0020.001A.FC3F][.15FF.0020.001A.FC3F] # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM; QQKN
+FD83 ; [.165D.0020.0017.FD83][.15FF.0020.0017.FD83][.15FF.0020.001F.FD83] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM; QQKN
+FD84 ; [.165D.0020.0019.FD84][.15FF.0020.0019.FD84][.15FF.0020.001F.FD84] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM; QQKN
+FDBA ; [.165D.0020.0017.FDBA][.15FF.0020.0017.FDBA][.1663.0020.001F.FDBA] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FDBC ; [.165D.0020.0019.FDBC][.15FF.0020.0019.FDBC][.1663.0020.001F.FDBC] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM; QQKN
+FDAC ; [.165D.0020.0019.FDAC][.15FF.0020.0019.FDAC][.1680.0020.001F.FDAC] # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM; QQKN
+FCCA ; [.165D.0020.0017.FCCA][.1605.0020.0017.FCCA] # ARABIC LIGATURE LAM WITH HAH INITIAL FORM; QQKN
+FC40 ; [.165D.0020.001A.FC40][.1605.0020.001A.FC40] # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM; QQKN
+FDB5 ; [.165D.0020.0017.FDB5][.1605.0020.0017.FDB5][.1663.0020.001F.FDB5] # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM; QQKN
+FD80 ; [.165D.0020.0019.FD80][.1605.0020.0019.FD80][.1663.0020.001F.FD80] # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM; QQKN
+FD82 ; [.165D.0020.0019.FD82][.1605.0020.0019.FD82][.167F.0020.001F.FD82] # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FD81 ; [.165D.0020.0019.FD81][.1605.0020.0019.FD81][.1680.0020.001F.FD81] # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM; QQKN
+FCCB ; [.165D.0020.0017.FCCB][.1606.0020.0017.FCCB] # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM; QQKN
+FC41 ; [.165D.0020.001A.FC41][.1606.0020.001A.FC41] # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM; QQKN
+FD86 ; [.165D.0020.0017.FD86][.1606.0020.0017.FD86][.1663.0020.001F.FD86] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FD85 ; [.165D.0020.0019.FD85][.1606.0020.0019.FD85][.1663.0020.001F.FD85] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM; QQKN
+FCCC ; [.165D.0020.0017.FCCC][.1663.0020.0017.FCCC] # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM; QQKN
+FCED ; [.165D.0020.0018.FCED][.1663.0020.0018.FCED] # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM; QQKN
+FC85 ; [.165D.0020.0019.FC85][.1663.0020.0019.FC85] # ARABIC LIGATURE LAM WITH MEEM FINAL FORM; QQKN
+FC42 ; [.165D.0020.001A.FC42][.1663.0020.001A.FC42] # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM; QQKN
+FD88 ; [.165D.0020.0017.FD88][.1663.0020.0017.FD88][.1605.0020.001F.FD88] # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD87 ; [.165D.0020.0019.FD87][.1663.0020.0019.FD87][.1605.0020.001F.FD87] # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM; QQKN
+FDAD ; [.165D.0020.0019.FDAD][.1663.0020.0019.FDAD][.1680.0020.001F.FDAD] # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM; QQKN
+FCCD ; [.165D.0020.0017.FCCD][.166F.0020.0017.FCCD] # ARABIC LIGATURE LAM WITH HEH INITIAL FORM; QQKN
+FC86 ; [.165D.0020.0019.FC86][.167F.0020.0019.FC86] # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM; QQKN
+FC43 ; [.165D.0020.001A.FC43][.167F.0020.001A.FC43] # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC87 ; [.165D.0020.0019.FC87][.1680.0020.0019.FC87] # ARABIC LIGATURE LAM WITH YEH FINAL FORM; QQKN
+FC44 ; [.165D.0020.001A.FC44][.1680.0020.001A.FC44] # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM; QQKN
+06B5 ; [.165E.0020.0002.06B5] # ARABIC LETTER LAM WITH SMALL V
+06B6 ; [.165F.0020.0002.06B6] # ARABIC LETTER LAM WITH DOT ABOVE
+06B7 ; [.1660.0020.0002.06B7] # ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06B8 ; [.1661.0020.0002.06B8] # ARABIC LETTER LAM WITH THREE DOTS BELOW
+076A ; [.1662.0020.0002.076A] # ARABIC LETTER LAM WITH BAR
+0645 ; [.1663.0020.0002.0645] # ARABIC LETTER MEEM
+FEE3 ; [.1663.0020.0017.FEE3] # ARABIC LETTER MEEM INITIAL FORM; QQK
+FEE4 ; [.1663.0020.0018.FEE4] # ARABIC LETTER MEEM MEDIAL FORM; QQK
+FEE2 ; [.1663.0020.0019.FEE2] # ARABIC LETTER MEEM FINAL FORM; QQK
+FEE1 ; [.1663.0020.001A.FEE1] # ARABIC LETTER MEEM ISOLATED FORM; QQK
+06FE ; [.1663.0020.0004.06FE][.0000.019A.0004.06FE] # ARABIC SIGN SINDHI POSTPOSITION MEN; QQKN
+FC88 ; [.1663.0020.0019.FC88][.15EA.0020.0019.FC88] # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM; QQKN
+FCCE ; [.1663.0020.0017.FCCE][.15FF.0020.0017.FCCE] # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM; QQKN
+FC45 ; [.1663.0020.001A.FC45][.15FF.0020.001A.FC45] # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM; QQKN
+FD8C ; [.1663.0020.0017.FD8C][.15FF.0020.0017.FD8C][.1605.0020.001F.FD8C] # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM; QQKN
+FD92 ; [.1663.0020.0017.FD92][.15FF.0020.0017.FD92][.1606.0020.001F.FD92] # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM; QQKN
+FD8D ; [.1663.0020.0017.FD8D][.15FF.0020.0017.FD8D][.1663.0020.001F.FD8D] # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FDC0 ; [.1663.0020.0019.FDC0][.15FF.0020.0019.FDC0][.1680.0020.001F.FDC0] # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM; QQKN
+FCCF ; [.1663.0020.0017.FCCF][.1605.0020.0017.FCCF] # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM; QQKN
+FC46 ; [.1663.0020.001A.FC46][.1605.0020.001A.FC46] # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM; QQKN
+FD89 ; [.1663.0020.0017.FD89][.1605.0020.0017.FD89][.15FF.0020.001F.FD89] # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM; QQKN
+FD8A ; [.1663.0020.0017.FD8A][.1605.0020.0017.FD8A][.1663.0020.001F.FD8A] # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM; QQKN
+FDF4 ; [.1663.0020.001A.FDF4][.1605.0020.001A.FDF4][.1663.0020.001F.FDF4][.160C.0020.001F.FDF4] # ARABIC LIGATURE MOHAMMAD ISOLATED FORM; QQKN
+FD8B ; [.1663.0020.0019.FD8B][.1605.0020.0019.FD8B][.1680.0020.001F.FD8B] # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM; QQKN
+FCD0 ; [.1663.0020.0017.FCD0][.1606.0020.0017.FCD0] # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM; QQKN
+FC47 ; [.1663.0020.001A.FC47][.1606.0020.001A.FC47] # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM; QQKN
+FD8E ; [.1663.0020.0017.FD8E][.1606.0020.0017.FD8E][.15FF.0020.001F.FD8E] # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM; QQKN
+FD8F ; [.1663.0020.0017.FD8F][.1606.0020.0017.FD8F][.1663.0020.001F.FD8F] # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FDB9 ; [.1663.0020.0019.FDB9][.1606.0020.0019.FDB9][.1680.0020.001F.FDB9] # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM; QQKN
+FCD1 ; [.1663.0020.0017.FCD1][.1663.0020.0017.FCD1] # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM; QQKN
+FC89 ; [.1663.0020.0019.FC89][.1663.0020.0019.FC89] # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM; QQKN
+FC48 ; [.1663.0020.001A.FC48][.1663.0020.001A.FC48] # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM; QQKN
+FDB1 ; [.1663.0020.0019.FDB1][.1663.0020.0019.FDB1][.1680.0020.001F.FDB1] # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM; QQKN
+FC49 ; [.1663.0020.001A.FC49][.167F.0020.001A.FC49] # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC4A ; [.1663.0020.001A.FC4A][.1680.0020.001A.FC4A] # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM; QQKN
+0765 ; [.1664.0020.0002.0765] # ARABIC LETTER MEEM WITH DOT ABOVE
+0766 ; [.1665.0020.0002.0766] # ARABIC LETTER MEEM WITH DOT BELOW
+0646 ; [.1666.0020.0002.0646] # ARABIC LETTER NOON
+FEE7 ; [.1666.0020.0017.FEE7] # ARABIC LETTER NOON INITIAL FORM; QQK
+FEE8 ; [.1666.0020.0018.FEE8] # ARABIC LETTER NOON MEDIAL FORM; QQK
+FEE6 ; [.1666.0020.0019.FEE6] # ARABIC LETTER NOON FINAL FORM; QQK
+FEE5 ; [.1666.0020.001A.FEE5] # ARABIC LETTER NOON ISOLATED FORM; QQK
+FCD2 ; [.1666.0020.0017.FCD2][.15FF.0020.0017.FCD2] # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM; QQKN
+FC4B ; [.1666.0020.001A.FC4B][.15FF.0020.001A.FC4B] # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM; QQKN
+FDB8 ; [.1666.0020.0017.FDB8][.15FF.0020.0017.FDB8][.1605.0020.001F.FDB8] # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM; QQKN
+FDBD ; [.1666.0020.0019.FDBD][.15FF.0020.0019.FDBD][.1605.0020.001F.FDBD] # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM; QQKN
+FD98 ; [.1666.0020.0017.FD98][.15FF.0020.0017.FD98][.1663.0020.001F.FD98] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FD97 ; [.1666.0020.0019.FD97][.15FF.0020.0019.FD97][.1663.0020.001F.FD97] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM; QQKN
+FD99 ; [.1666.0020.0019.FD99][.15FF.0020.0019.FD99][.167F.0020.001F.FD99] # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDC7 ; [.1666.0020.0019.FDC7][.15FF.0020.0019.FDC7][.1680.0020.001F.FDC7] # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM; QQKN
+FCD3 ; [.1666.0020.0017.FCD3][.1605.0020.0017.FCD3] # ARABIC LIGATURE NOON WITH HAH INITIAL FORM; QQKN
+FC4C ; [.1666.0020.001A.FC4C][.1605.0020.001A.FC4C] # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM; QQKN
+FD95 ; [.1666.0020.0017.FD95][.1605.0020.0017.FD95][.1663.0020.001F.FD95] # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM; QQKN
+FD96 ; [.1666.0020.0019.FD96][.1605.0020.0019.FD96][.167F.0020.001F.FD96] # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDB3 ; [.1666.0020.0019.FDB3][.1605.0020.0019.FDB3][.1680.0020.001F.FDB3] # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM; QQKN
+FCD4 ; [.1666.0020.0017.FCD4][.1606.0020.0017.FCD4] # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM; QQKN
+FC4D ; [.1666.0020.001A.FC4D][.1606.0020.001A.FC4D] # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM; QQKN
+FC8A ; [.1666.0020.0019.FC8A][.161A.0020.0019.FC8A] # ARABIC LIGATURE NOON WITH REH FINAL FORM; QQKN
+FC8B ; [.1666.0020.0019.FC8B][.161B.0020.0019.FC8B] # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM; QQKN
+FCD5 ; [.1666.0020.0017.FCD5][.1663.0020.0017.FCD5] # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM; QQKN
+FCEE ; [.1666.0020.0018.FCEE][.1663.0020.0018.FCEE] # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM; QQKN
+FC8C ; [.1666.0020.0019.FC8C][.1663.0020.0019.FC8C] # ARABIC LIGATURE NOON WITH MEEM FINAL FORM; QQKN
+FC4E ; [.1666.0020.001A.FC4E][.1663.0020.001A.FC4E] # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM; QQKN
+FD9B ; [.1666.0020.0019.FD9B][.1663.0020.0019.FD9B][.167F.0020.001F.FD9B] # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD9A ; [.1666.0020.0019.FD9A][.1663.0020.0019.FD9A][.1680.0020.001F.FD9A] # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM; QQKN
+FC8D ; [.1666.0020.0019.FC8D][.1666.0020.0019.FC8D] # ARABIC LIGATURE NOON WITH NOON FINAL FORM; QQKN
+FCD6 ; [.1666.0020.0017.FCD6][.166F.0020.0017.FCD6] # ARABIC LIGATURE NOON WITH HEH INITIAL FORM; QQKN
+FCEF ; [.1666.0020.0018.FCEF][.166F.0020.0018.FCEF] # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM; QQKN
+FC8E ; [.1666.0020.0019.FC8E][.167F.0020.0019.FC8E] # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM; QQKN
+FC4F ; [.1666.0020.001A.FC4F][.167F.0020.001A.FC4F] # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC8F ; [.1666.0020.0019.FC8F][.1680.0020.0019.FC8F] # ARABIC LIGATURE NOON WITH YEH FINAL FORM; QQKN
+FC50 ; [.1666.0020.001A.FC50][.1680.0020.001A.FC50] # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM; QQKN
+06BA ; [.1667.0020.0002.06BA] # ARABIC LETTER NOON GHUNNA
+FB9F ; [.1667.0020.0019.FB9F] # ARABIC LETTER NOON GHUNNA FINAL FORM; QQK
+FB9E ; [.1667.0020.001A.FB9E] # ARABIC LETTER NOON GHUNNA ISOLATED FORM; QQK
+06BB ; [.1668.0020.0002.06BB] # ARABIC LETTER RNOON
+FBA2 ; [.1668.0020.0017.FBA2] # ARABIC LETTER RNOON INITIAL FORM; QQK
+FBA3 ; [.1668.0020.0018.FBA3] # ARABIC LETTER RNOON MEDIAL FORM; QQK
+FBA1 ; [.1668.0020.0019.FBA1] # ARABIC LETTER RNOON FINAL FORM; QQK
+FBA0 ; [.1668.0020.001A.FBA0] # ARABIC LETTER RNOON ISOLATED FORM; QQK
+06BC ; [.1669.0020.0002.06BC] # ARABIC LETTER NOON WITH RING
+06BD ; [.166A.0020.0002.06BD] # ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06B9 ; [.166B.0020.0002.06B9] # ARABIC LETTER NOON WITH DOT BELOW
+0767 ; [.166C.0020.0002.0767] # ARABIC LETTER NOON WITH TWO DOTS BELOW
+0768 ; [.166D.0020.0002.0768] # ARABIC LETTER NOON WITH SMALL TAH
+0769 ; [.166E.0020.0002.0769] # ARABIC LETTER NOON WITH SMALL V
+0647 ; [.166F.0020.0002.0647] # ARABIC LETTER HEH
+FEEB ; [.166F.0020.0017.FEEB] # ARABIC LETTER HEH INITIAL FORM; QQK
+FEEC ; [.166F.0020.0018.FEEC] # ARABIC LETTER HEH MEDIAL FORM; QQK
+FEEA ; [.166F.0020.0019.FEEA] # ARABIC LETTER HEH FINAL FORM; QQK
+FEE9 ; [.166F.0020.001A.FEE9] # ARABIC LETTER HEH ISOLATED FORM; QQK
+FCD9 ; [.166F.0020.0017.FCD9][.0000.00F3.0017.FCD9] # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM; QQKN
+FCD7 ; [.166F.0020.0017.FCD7][.15FF.0020.0017.FCD7] # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM; QQKN
+FC51 ; [.166F.0020.001A.FC51][.15FF.0020.001A.FC51] # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM; QQKN
+FCD8 ; [.166F.0020.0017.FCD8][.1663.0020.0017.FCD8] # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM; QQKN
+FC52 ; [.166F.0020.001A.FC52][.1663.0020.001A.FC52] # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM; QQKN
+FD93 ; [.166F.0020.0017.FD93][.1663.0020.0017.FD93][.15FF.0020.001F.FD93] # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM; QQKN
+FD94 ; [.166F.0020.0017.FD94][.1663.0020.0017.FD94][.1663.0020.001F.FD94] # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FC53 ; [.166F.0020.001A.FC53][.167F.0020.001A.FC53] # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC54 ; [.166F.0020.001A.FC54][.1680.0020.001A.FC54] # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM; QQKN
+06BE ; [.1670.0020.0002.06BE] # ARABIC LETTER HEH DOACHASHMEE
+FBAC ; [.1670.0020.0017.FBAC] # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM; QQK
+FBAD ; [.1670.0020.0018.FBAD] # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM; QQK
+FBAB ; [.1670.0020.0019.FBAB] # ARABIC LETTER HEH DOACHASHMEE FINAL FORM; QQK
+FBAA ; [.1670.0020.001A.FBAA] # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM; QQK
+06C1 ; [.1671.0020.0002.06C1] # ARABIC LETTER HEH GOAL
+FBA8 ; [.1671.0020.0017.FBA8] # ARABIC LETTER HEH GOAL INITIAL FORM; QQK
+FBA9 ; [.1671.0020.0018.FBA9] # ARABIC LETTER HEH GOAL MEDIAL FORM; QQK
+FBA7 ; [.1671.0020.0019.FBA7] # ARABIC LETTER HEH GOAL FINAL FORM; QQK
+FBA6 ; [.1671.0020.001A.FBA6] # ARABIC LETTER HEH GOAL ISOLATED FORM; QQK
+06C2 ; [.1671.0020.0002.06C1][.0000.00E8.0002.0654] # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE; QQCM
+06C3 ; [.1672.0020.0002.06C3] # ARABIC LETTER TEH MARBUTA GOAL
+06FF ; [.1673.0020.0002.06FF] # ARABIC LETTER HEH WITH INVERTED V
+06D5 ; [.1674.0020.0002.06D5] # ARABIC LETTER AE
+06C0 ; [.1674.0020.0002.06D5][.0000.00E8.0002.0654] # ARABIC LETTER HEH WITH YEH ABOVE; QQCM
+FBA5 ; [.1674.0020.0019.FBA5][.0000.00E8.0019.FBA5] # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM; QQKN
+FBA4 ; [.1674.0020.001A.FBA4][.0000.00E8.001A.FBA4] # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM; QQKN
+0648 ; [.1675.0020.0002.0648] # ARABIC LETTER WAW
+06E5 ; [.1675.0020.0004.06E5] # ARABIC SMALL WAW; QQK
+FEEE ; [.1675.0020.0019.FEEE] # ARABIC LETTER WAW FINAL FORM; QQK
+FEED ; [.1675.0020.001A.FEED] # ARABIC LETTER WAW ISOLATED FORM; QQK
+0676 ; [.1675.0020.0004.0676][.15E1.0020.0004.0676] # ARABIC LETTER HIGH HAMZA WAW; QQKN
+FDF8 ; [.1675.0020.001A.FDF8][.1629.0020.001A.FDF8][.165D.0020.001F.FDF8][.1663.0020.001F.FDF8] # ARABIC LIGATURE WASALLAM ISOLATED FORM; QQKN
+06C4 ; [.1676.0020.0002.06C4] # ARABIC LETTER WAW WITH RING
+06C5 ; [.1677.0020.0002.06C5] # ARABIC LETTER KIRGHIZ OE
+FBE1 ; [.1677.0020.0019.FBE1] # ARABIC LETTER KIRGHIZ OE FINAL FORM; QQK
+FBE0 ; [.1677.0020.001A.FBE0] # ARABIC LETTER KIRGHIZ OE ISOLATED FORM; QQK
+06C6 ; [.1678.0020.0002.06C6] # ARABIC LETTER OE
+FBDA ; [.1678.0020.0019.FBDA] # ARABIC LETTER OE FINAL FORM; QQK
+FBD9 ; [.1678.0020.001A.FBD9] # ARABIC LETTER OE ISOLATED FORM; QQK
+06C7 ; [.1679.0020.0002.06C7] # ARABIC LETTER U
+FBD8 ; [.1679.0020.0019.FBD8] # ARABIC LETTER U FINAL FORM; QQK
+FBD7 ; [.1679.0020.001A.FBD7] # ARABIC LETTER U ISOLATED FORM; QQK
+0677 ; [.1679.0020.0004.0677][.15E1.0020.0004.0677] # ARABIC LETTER U WITH HAMZA ABOVE; QQKN
+FBDD ; [.1679.0020.001A.FBDD][.15E1.0020.001A.FBDD] # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM; QQKN
+06C8 ; [.167A.0020.0002.06C8] # ARABIC LETTER YU
+FBDC ; [.167A.0020.0019.FBDC] # ARABIC LETTER YU FINAL FORM; QQK
+FBDB ; [.167A.0020.001A.FBDB] # ARABIC LETTER YU ISOLATED FORM; QQK
+06C9 ; [.167B.0020.0002.06C9] # ARABIC LETTER KIRGHIZ YU
+FBE3 ; [.167B.0020.0019.FBE3] # ARABIC LETTER KIRGHIZ YU FINAL FORM; QQK
+FBE2 ; [.167B.0020.001A.FBE2] # ARABIC LETTER KIRGHIZ YU ISOLATED FORM; QQK
+06CA ; [.167C.0020.0002.06CA] # ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06CB ; [.167D.0020.0002.06CB] # ARABIC LETTER VE
+FBDF ; [.167D.0020.0019.FBDF] # ARABIC LETTER VE FINAL FORM; QQK
+FBDE ; [.167D.0020.001A.FBDE] # ARABIC LETTER VE ISOLATED FORM; QQK
+06CF ; [.167E.0020.0002.06CF] # ARABIC LETTER WAW WITH DOT ABOVE
+0649 ; [.167F.0020.0002.0649] # ARABIC LETTER ALEF MAKSURA
+FBE8 ; [.167F.0020.0017.FBE8] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM; QQK
+FBE9 ; [.167F.0020.0018.FBE9] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM; QQK
+FEF0 ; [.167F.0020.0019.FEF0] # ARABIC LETTER ALEF MAKSURA FINAL FORM; QQK
+FEEF ; [.167F.0020.001A.FEEF] # ARABIC LETTER ALEF MAKSURA ISOLATED FORM; QQK
+FC90 ; [.167F.0020.0019.FC90][.0000.00F3.0019.FC90] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM; QQKN
+FC5D ; [.167F.0020.001A.FC5D][.0000.00F3.001A.FC5D] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+064A ; [.1680.0020.0002.064A] # ARABIC LETTER YEH
+06E6 ; [.1680.0020.0004.06E6] # ARABIC SMALL YEH; QQK
+FEF3 ; [.1680.0020.0017.FEF3] # ARABIC LETTER YEH INITIAL FORM; QQK
+FEF4 ; [.1680.0020.0018.FEF4] # ARABIC LETTER YEH MEDIAL FORM; QQK
+FEF2 ; [.1680.0020.0019.FEF2] # ARABIC LETTER YEH FINAL FORM; QQK
+FEF1 ; [.1680.0020.001A.FEF1] # ARABIC LETTER YEH ISOLATED FORM; QQK
+0678 ; [.1680.0020.0004.0678][.15E1.0020.0004.0678] # ARABIC LETTER HIGH HAMZA YEH; QQKN
+FCDA ; [.1680.0020.0017.FCDA][.15FF.0020.0017.FCDA] # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM; QQKN
+FC55 ; [.1680.0020.001A.FC55][.15FF.0020.001A.FC55] # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM; QQKN
+FDAF ; [.1680.0020.0019.FDAF][.15FF.0020.0019.FDAF][.1680.0020.001F.FDAF] # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM; QQKN
+FCDB ; [.1680.0020.0017.FCDB][.1605.0020.0017.FCDB] # ARABIC LIGATURE YEH WITH HAH INITIAL FORM; QQKN
+FC56 ; [.1680.0020.001A.FC56][.1605.0020.001A.FC56] # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM; QQKN
+FDAE ; [.1680.0020.0019.FDAE][.1605.0020.0019.FDAE][.1680.0020.001F.FDAE] # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM; QQKN
+FCDC ; [.1680.0020.0017.FCDC][.1606.0020.0017.FCDC] # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM; QQKN
+FC57 ; [.1680.0020.001A.FC57][.1606.0020.001A.FC57] # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM; QQKN
+FC91 ; [.1680.0020.0019.FC91][.161A.0020.0019.FC91] # ARABIC LIGATURE YEH WITH REH FINAL FORM; QQKN
+FC92 ; [.1680.0020.0019.FC92][.161B.0020.0019.FC92] # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM; QQKN
+FCDD ; [.1680.0020.0017.FCDD][.1663.0020.0017.FCDD] # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM; QQKN
+FCF0 ; [.1680.0020.0018.FCF0][.1663.0020.0018.FCF0] # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM; QQKN
+FC93 ; [.1680.0020.0019.FC93][.1663.0020.0019.FC93] # ARABIC LIGATURE YEH WITH MEEM FINAL FORM; QQKN
+FC58 ; [.1680.0020.001A.FC58][.1663.0020.001A.FC58] # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM; QQKN
+FD9D ; [.1680.0020.0017.FD9D][.1663.0020.0017.FD9D][.1663.0020.001F.FD9D] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD9C ; [.1680.0020.0019.FD9C][.1663.0020.0019.FD9C][.1663.0020.001F.FD9C] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM; QQKN
+FDB0 ; [.1680.0020.0019.FDB0][.1663.0020.0019.FDB0][.1680.0020.001F.FDB0] # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM; QQKN
+FC94 ; [.1680.0020.0019.FC94][.1666.0020.0019.FC94] # ARABIC LIGATURE YEH WITH NOON FINAL FORM; QQKN
+FCDE ; [.1680.0020.0017.FCDE][.166F.0020.0017.FCDE] # ARABIC LIGATURE YEH WITH HEH INITIAL FORM; QQKN
+FCF1 ; [.1680.0020.0018.FCF1][.166F.0020.0018.FCF1] # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM; QQKN
+FC95 ; [.1680.0020.0019.FC95][.167F.0020.0019.FC95] # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC59 ; [.1680.0020.001A.FC59][.167F.0020.001A.FC59] # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC96 ; [.1680.0020.0019.FC96][.1680.0020.0019.FC96] # ARABIC LIGATURE YEH WITH YEH FINAL FORM; QQKN
+FC5A ; [.1680.0020.001A.FC5A][.1680.0020.001A.FC5A] # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM; QQKN
+06CC ; [.1681.0020.0002.06CC] # ARABIC LETTER FARSI YEH
+FBFE ; [.1681.0020.0017.FBFE] # ARABIC LETTER FARSI YEH INITIAL FORM; QQK
+FBFF ; [.1681.0020.0018.FBFF] # ARABIC LETTER FARSI YEH MEDIAL FORM; QQK
+FBFD ; [.1681.0020.0019.FBFD] # ARABIC LETTER FARSI YEH FINAL FORM; QQK
+FBFC ; [.1681.0020.001A.FBFC] # ARABIC LETTER FARSI YEH ISOLATED FORM; QQK
+06CD ; [.1682.0020.0002.06CD] # ARABIC LETTER YEH WITH TAIL
+06CE ; [.1683.0020.0002.06CE] # ARABIC LETTER YEH WITH SMALL V
+06D0 ; [.1684.0020.0002.06D0] # ARABIC LETTER E
+FBE6 ; [.1684.0020.0017.FBE6] # ARABIC LETTER E INITIAL FORM; QQK
+FBE7 ; [.1684.0020.0018.FBE7] # ARABIC LETTER E MEDIAL FORM; QQK
+FBE5 ; [.1684.0020.0019.FBE5] # ARABIC LETTER E FINAL FORM; QQK
+FBE4 ; [.1684.0020.001A.FBE4] # ARABIC LETTER E ISOLATED FORM; QQK
+06D1 ; [.1685.0020.0002.06D1] # ARABIC LETTER YEH WITH THREE DOTS BELOW
+06D2 ; [.1686.0020.0002.06D2] # ARABIC LETTER YEH BARREE
+FBAF ; [.1686.0020.0019.FBAF] # ARABIC LETTER YEH BARREE FINAL FORM; QQK
+FBAE ; [.1686.0020.001A.FBAE] # ARABIC LETTER YEH BARREE ISOLATED FORM; QQK
+06D3 ; [.1686.0020.0002.06D2][.0000.00E8.0002.0654] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE; QQCM
+FBB1 ; [.1686.0020.0019.FBB1][.0000.00E8.0019.FBB1] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM; QQKN
+FBB0 ; [.1686.0020.001A.FBB0][.0000.00E8.001A.FBB0] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM; QQKN
+0710 ; [.1687.0020.0002.0710] # SYRIAC LETTER ALAPH
+0712 ; [.1688.0020.0002.0712] # SYRIAC LETTER BETH
+072D ; [.1688.0020.0004.072D][.0000.019C.0004.072D] # SYRIAC LETTER PERSIAN BHETH; QQKN
+0713 ; [.1689.0020.0002.0713] # SYRIAC LETTER GAMAL
+0714 ; [.1689.0020.0004.0714][.0000.019A.0004.0714] # SYRIAC LETTER GAMAL GARSHUNI; QQKN
+072E ; [.1689.0020.0004.072E][.0000.019C.0004.072E] # SYRIAC LETTER PERSIAN GHAMAL; QQKN
+0716 ; [.168A.0020.0002.0716] # SYRIAC LETTER DOTLESS DALATH RISH
+0715 ; [.168B.0020.0002.0715] # SYRIAC LETTER DALATH
+072F ; [.168B.0020.0004.072F][.0000.019C.0004.072F] # SYRIAC LETTER PERSIAN DHALATH; QQKN
+0717 ; [.168C.0020.0002.0717] # SYRIAC LETTER HE
+0718 ; [.168D.0020.0002.0718] # SYRIAC LETTER WAW
+0719 ; [.168E.0020.0002.0719] # SYRIAC LETTER ZAIN
+074D ; [.168F.0020.0002.074D] # SYRIAC LETTER SOGDIAN ZHAIN
+071A ; [.1690.0020.0002.071A] # SYRIAC LETTER HETH
+071B ; [.1691.0020.0002.071B] # SYRIAC LETTER TETH
+071C ; [.1691.0020.0004.071C][.0000.019A.0004.071C] # SYRIAC LETTER TETH GARSHUNI; QQKN
+071D ; [.1692.0020.0002.071D] # SYRIAC LETTER YUDH
+071E ; [.1693.0020.0002.071E] # SYRIAC LETTER YUDH HE
+071F ; [.1694.0020.0002.071F] # SYRIAC LETTER KAPH
+074E ; [.1695.0020.0002.074E] # SYRIAC LETTER SOGDIAN KHAPH
+0720 ; [.1696.0020.0002.0720] # SYRIAC LETTER LAMADH
+0721 ; [.1697.0020.0002.0721] # SYRIAC LETTER MIM
+0722 ; [.1698.0020.0002.0722] # SYRIAC LETTER NUN
+0723 ; [.1699.0020.0002.0723] # SYRIAC LETTER SEMKATH
+0724 ; [.1699.0020.0019.0724] # SYRIAC LETTER FINAL SEMKATH; QQK
+0725 ; [.169A.0020.0002.0725] # SYRIAC LETTER E
+0726 ; [.169B.0020.0002.0726] # SYRIAC LETTER PE
+0727 ; [.169B.0020.0004.0727][.0000.019A.0004.0727] # SYRIAC LETTER REVERSED PE; QQKN
+074F ; [.169C.0020.0002.074F] # SYRIAC LETTER SOGDIAN FE
+0728 ; [.169D.0020.0002.0728] # SYRIAC LETTER SADHE
+0729 ; [.169E.0020.0002.0729] # SYRIAC LETTER QAPH
+072A ; [.169F.0020.0002.072A] # SYRIAC LETTER RISH
+072B ; [.16A0.0020.0002.072B] # SYRIAC LETTER SHIN
+072C ; [.16A1.0020.0002.072C] # SYRIAC LETTER TAW
+0780 ; [.16A2.0020.0002.0780] # THAANA LETTER HAA
+0799 ; [.16A3.0020.0002.0799] # THAANA LETTER HHAA
+079A ; [.16A4.0020.0002.079A] # THAANA LETTER KHAA
+0781 ; [.16A5.0020.0002.0781] # THAANA LETTER SHAVIYANI
+0782 ; [.16A6.0020.0002.0782] # THAANA LETTER NOONU
+0783 ; [.16A7.0020.0002.0783] # THAANA LETTER RAA
+079C ; [.16A8.0020.0002.079C] # THAANA LETTER ZAA
+0784 ; [.16A9.0020.0002.0784] # THAANA LETTER BAA
+0785 ; [.16AA.0020.0002.0785] # THAANA LETTER LHAVIYANI
+0786 ; [.16AB.0020.0002.0786] # THAANA LETTER KAAFU
+0787 ; [.16AC.0020.0002.0787] # THAANA LETTER ALIFU
+07A2 ; [.16AD.0020.0002.07A2] # THAANA LETTER AINU
+07A3 ; [.16AE.0020.0002.07A3] # THAANA LETTER GHAINU
+0788 ; [.16AF.0020.0002.0788] # THAANA LETTER VAAVU
+07A5 ; [.16B0.0020.0002.07A5] # THAANA LETTER WAAVU
+0789 ; [.16B1.0020.0002.0789] # THAANA LETTER MEEMU
+078A ; [.16B2.0020.0002.078A] # THAANA LETTER FAAFU
+078B ; [.16B3.0020.0002.078B] # THAANA LETTER DHAALU
+079B ; [.16B4.0020.0002.079B] # THAANA LETTER THAALU
+078C ; [.16B5.0020.0002.078C] # THAANA LETTER THAA
+0798 ; [.16B6.0020.0002.0798] # THAANA LETTER TTAA
+07A0 ; [.16B7.0020.0002.07A0] # THAANA LETTER TO
+07A1 ; [.16B8.0020.0002.07A1] # THAANA LETTER ZO
+078D ; [.16B9.0020.0002.078D] # THAANA LETTER LAAMU
+078E ; [.16BA.0020.0002.078E] # THAANA LETTER GAAFU
+07A4 ; [.16BB.0020.0002.07A4] # THAANA LETTER QAAFU
+078F ; [.16BC.0020.0002.078F] # THAANA LETTER GNAVIYANI
+0790 ; [.16BD.0020.0002.0790] # THAANA LETTER SEENU
+079D ; [.16BE.0020.0002.079D] # THAANA LETTER SHEENU
+079E ; [.16BF.0020.0002.079E] # THAANA LETTER SAADHU
+079F ; [.16C0.0020.0002.079F] # THAANA LETTER DAADHU
+0791 ; [.16C1.0020.0002.0791] # THAANA LETTER DAVIYANI
+0792 ; [.16C2.0020.0002.0792] # THAANA LETTER ZAVIYANI
+0793 ; [.16C3.0020.0002.0793] # THAANA LETTER TAVIYANI
+0794 ; [.16C4.0020.0002.0794] # THAANA LETTER YAA
+0795 ; [.16C5.0020.0002.0795] # THAANA LETTER PAVIYANI
+0796 ; [.16C6.0020.0002.0796] # THAANA LETTER JAVIYANI
+0797 ; [.16C7.0020.0002.0797] # THAANA LETTER CHAVIYANI
+07B1 ; [.16C8.0020.0002.07B1] # THAANA LETTER NAA
+07A6 ; [.16C9.0020.0002.07A6] # THAANA ABAFILI
+07A7 ; [.16CA.0020.0002.07A7] # THAANA AABAAFILI
+07A8 ; [.16CB.0020.0002.07A8] # THAANA IBIFILI
+07A9 ; [.16CC.0020.0002.07A9] # THAANA EEBEEFILI
+07AA ; [.16CD.0020.0002.07AA] # THAANA UBUFILI
+07AB ; [.16CE.0020.0002.07AB] # THAANA OOBOOFILI
+07AC ; [.16CF.0020.0002.07AC] # THAANA EBEFILI
+07AD ; [.16D0.0020.0002.07AD] # THAANA EYBEYFILI
+07AE ; [.16D1.0020.0002.07AE] # THAANA OBOFILI
+07AF ; [.16D2.0020.0002.07AF] # THAANA OABOAFILI
+07B0 ; [.16D3.0020.0002.07B0] # THAANA SUKUN
+07CA ; [.16D4.0020.0002.07CA] # NKO LETTER A
+07CB ; [.16D5.0020.0002.07CB] # NKO LETTER EE
+07CC ; [.16D6.0020.0002.07CC] # NKO LETTER I
+07CD ; [.16D7.0020.0002.07CD] # NKO LETTER E
+07CE ; [.16D8.0020.0002.07CE] # NKO LETTER U
+07CF ; [.16D9.0020.0002.07CF] # NKO LETTER OO
+07D0 ; [.16DA.0020.0002.07D0] # NKO LETTER O
+07D1 ; [.16DB.0020.0002.07D1] # NKO LETTER DAGBASINNA
+07D2 ; [.16DC.0020.0002.07D2] # NKO LETTER N
+07D3 ; [.16DD.0020.0002.07D3] # NKO LETTER BA
+07D4 ; [.16DE.0020.0002.07D4] # NKO LETTER PA
+07D5 ; [.16DF.0020.0002.07D5] # NKO LETTER TA
+07D6 ; [.16E0.0020.0002.07D6] # NKO LETTER JA
+07E8 ; [.16E0.0020.0004.07E8][.0000.0199.0004.07E8] # NKO LETTER JONA JA; QQKN
+07D7 ; [.16E1.0020.0002.07D7] # NKO LETTER CHA
+07E9 ; [.16E1.0020.0004.07E9][.0000.0199.0004.07E9] # NKO LETTER JONA CHA; QQKN
+07D8 ; [.16E2.0020.0002.07D8] # NKO LETTER DA
+07D9 ; [.16E3.0020.0002.07D9] # NKO LETTER RA
+07EA ; [.16E3.0020.0004.07EA][.0000.0199.0004.07EA] # NKO LETTER JONA RA; QQKN
+07DA ; [.16E4.0020.0002.07DA] # NKO LETTER RRA
+07DB ; [.16E5.0020.0002.07DB] # NKO LETTER SA
+07DC ; [.16E6.0020.0002.07DC] # NKO LETTER GBA
+07DD ; [.16E7.0020.0002.07DD] # NKO LETTER FA
+07DE ; [.16E8.0020.0002.07DE] # NKO LETTER KA
+07DF ; [.16E9.0020.0002.07DF] # NKO LETTER LA
+07E0 ; [.16EA.0020.0002.07E0] # NKO LETTER NA WOLOSO
+07E1 ; [.16EB.0020.0002.07E1] # NKO LETTER MA
+07E2 ; [.16EC.0020.0002.07E2] # NKO LETTER NYA
+07E3 ; [.16ED.0020.0002.07E3] # NKO LETTER NA
+07E4 ; [.16EE.0020.0002.07E4] # NKO LETTER HA
+07E5 ; [.16EF.0020.0002.07E5] # NKO LETTER WA
+07E6 ; [.16F0.0020.0002.07E6] # NKO LETTER YA
+07E7 ; [.16F1.0020.0002.07E7] # NKO LETTER NYA WOLOSO
+07F4 ; [.16F2.0020.0002.07F4] # NKO HIGH TONE APOSTROPHE
+07F5 ; [.16F3.0020.0002.07F5] # NKO LOW TONE APOSTROPHE
+2D30 ; [.16F4.0020.0002.2D30] # TIFINAGH LETTER YA
+2D31 ; [.16F5.0020.0002.2D31] # TIFINAGH LETTER YAB
+2D32 ; [.16F6.0020.0002.2D32] # TIFINAGH LETTER YABH
+2D33 ; [.16F7.0020.0002.2D33] # TIFINAGH LETTER YAG
+2D34 ; [.16F8.0020.0002.2D34] # TIFINAGH LETTER YAGHH
+2D35 ; [.16F9.0020.0002.2D35] # TIFINAGH LETTER BERBER ACADEMY YAJ
+2D36 ; [.16FA.0020.0002.2D36] # TIFINAGH LETTER YAJ
+2D37 ; [.16FB.0020.0002.2D37] # TIFINAGH LETTER YAD
+2D38 ; [.16FC.0020.0002.2D38] # TIFINAGH LETTER YADH
+2D39 ; [.16FD.0020.0002.2D39] # TIFINAGH LETTER YADD
+2D3A ; [.16FE.0020.0002.2D3A] # TIFINAGH LETTER YADDH
+2D3B ; [.16FF.0020.0002.2D3B] # TIFINAGH LETTER YEY
+2D3C ; [.1700.0020.0002.2D3C] # TIFINAGH LETTER YAF
+2D3D ; [.1701.0020.0002.2D3D] # TIFINAGH LETTER YAK
+2D3E ; [.1702.0020.0002.2D3E] # TIFINAGH LETTER TUAREG YAK
+2D3F ; [.1703.0020.0002.2D3F] # TIFINAGH LETTER YAKHH
+2D40 ; [.1704.0020.0002.2D40] # TIFINAGH LETTER YAH
+2D41 ; [.1705.0020.0002.2D41] # TIFINAGH LETTER BERBER ACADEMY YAH
+2D42 ; [.1706.0020.0002.2D42] # TIFINAGH LETTER TUAREG YAH
+2D43 ; [.1707.0020.0002.2D43] # TIFINAGH LETTER YAHH
+2D44 ; [.1708.0020.0002.2D44] # TIFINAGH LETTER YAA
+2D45 ; [.1709.0020.0002.2D45] # TIFINAGH LETTER YAKH
+2D46 ; [.170A.0020.0002.2D46] # TIFINAGH LETTER TUAREG YAKH
+2D47 ; [.170B.0020.0002.2D47] # TIFINAGH LETTER YAQ
+2D48 ; [.170C.0020.0002.2D48] # TIFINAGH LETTER TUAREG YAQ
+2D49 ; [.170D.0020.0002.2D49] # TIFINAGH LETTER YI
+2D4A ; [.170E.0020.0002.2D4A] # TIFINAGH LETTER YAZH
+2D4B ; [.170F.0020.0002.2D4B] # TIFINAGH LETTER AHAGGAR YAZH
+2D4C ; [.1710.0020.0002.2D4C] # TIFINAGH LETTER TUAREG YAZH
+2D4D ; [.1711.0020.0002.2D4D] # TIFINAGH LETTER YAL
+2D4E ; [.1712.0020.0002.2D4E] # TIFINAGH LETTER YAM
+2D4F ; [.1713.0020.0002.2D4F] # TIFINAGH LETTER YAN
+2D50 ; [.1714.0020.0002.2D50] # TIFINAGH LETTER TUAREG YAGN
+2D51 ; [.1715.0020.0002.2D51] # TIFINAGH LETTER TUAREG YANG
+2D52 ; [.1716.0020.0002.2D52] # TIFINAGH LETTER YAP
+2D53 ; [.1717.0020.0002.2D53] # TIFINAGH LETTER YU
+2D54 ; [.1718.0020.0002.2D54] # TIFINAGH LETTER YAR
+2D55 ; [.1719.0020.0002.2D55] # TIFINAGH LETTER YARR
+2D56 ; [.171A.0020.0002.2D56] # TIFINAGH LETTER YAGH
+2D57 ; [.171B.0020.0002.2D57] # TIFINAGH LETTER TUAREG YAGH
+2D58 ; [.171C.0020.0002.2D58] # TIFINAGH LETTER AYER YAGH
+2D59 ; [.171D.0020.0002.2D59] # TIFINAGH LETTER YAS
+2D5A ; [.171E.0020.0002.2D5A] # TIFINAGH LETTER YASS
+2D5B ; [.171F.0020.0002.2D5B] # TIFINAGH LETTER YASH
+2D5C ; [.1720.0020.0002.2D5C] # TIFINAGH LETTER YAT
+2D5D ; [.1721.0020.0002.2D5D] # TIFINAGH LETTER YATH
+2D5E ; [.1722.0020.0002.2D5E] # TIFINAGH LETTER YACH
+2D5F ; [.1723.0020.0002.2D5F] # TIFINAGH LETTER YATT
+2D60 ; [.1724.0020.0002.2D60] # TIFINAGH LETTER YAV
+2D61 ; [.1725.0020.0002.2D61] # TIFINAGH LETTER YAW
+2D62 ; [.1726.0020.0002.2D62] # TIFINAGH LETTER YAY
+2D63 ; [.1727.0020.0002.2D63] # TIFINAGH LETTER YAZ
+2D64 ; [.1728.0020.0002.2D64] # TIFINAGH LETTER TAWELLEMET YAZ
+2D65 ; [.1729.0020.0002.2D65] # TIFINAGH LETTER YAZZ
+2D6F ; [.172A.0020.0002.2D6F] # TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+1200 ; [.172B.0020.0002.1200] # ETHIOPIC SYLLABLE HA
+1201 ; [.172C.0020.0002.1201] # ETHIOPIC SYLLABLE HU
+1202 ; [.172D.0020.0002.1202] # ETHIOPIC SYLLABLE HI
+1203 ; [.172E.0020.0002.1203] # ETHIOPIC SYLLABLE HAA
+1204 ; [.172F.0020.0002.1204] # ETHIOPIC SYLLABLE HEE
+1205 ; [.1730.0020.0002.1205] # ETHIOPIC SYLLABLE HE
+1206 ; [.1731.0020.0002.1206] # ETHIOPIC SYLLABLE HO
+1207 ; [.1732.0020.0002.1207] # ETHIOPIC SYLLABLE HOA
+1208 ; [.1733.0020.0002.1208] # ETHIOPIC SYLLABLE LA
+1209 ; [.1734.0020.0002.1209] # ETHIOPIC SYLLABLE LU
+120A ; [.1735.0020.0002.120A] # ETHIOPIC SYLLABLE LI
+120B ; [.1736.0020.0002.120B] # ETHIOPIC SYLLABLE LAA
+120C ; [.1737.0020.0002.120C] # ETHIOPIC SYLLABLE LEE
+120D ; [.1738.0020.0002.120D] # ETHIOPIC SYLLABLE LE
+120E ; [.1739.0020.0002.120E] # ETHIOPIC SYLLABLE LO
+120F ; [.173A.0020.0002.120F] # ETHIOPIC SYLLABLE LWA
+2D80 ; [.173B.0020.0002.2D80] # ETHIOPIC SYLLABLE LOA
+1210 ; [.173C.0020.0002.1210] # ETHIOPIC SYLLABLE HHA
+1211 ; [.173D.0020.0002.1211] # ETHIOPIC SYLLABLE HHU
+1212 ; [.173E.0020.0002.1212] # ETHIOPIC SYLLABLE HHI
+1213 ; [.173F.0020.0002.1213] # ETHIOPIC SYLLABLE HHAA
+1214 ; [.1740.0020.0002.1214] # ETHIOPIC SYLLABLE HHEE
+1215 ; [.1741.0020.0002.1215] # ETHIOPIC SYLLABLE HHE
+1216 ; [.1742.0020.0002.1216] # ETHIOPIC SYLLABLE HHO
+1217 ; [.1743.0020.0002.1217] # ETHIOPIC SYLLABLE HHWA
+1218 ; [.1744.0020.0002.1218] # ETHIOPIC SYLLABLE MA
+1219 ; [.1745.0020.0002.1219] # ETHIOPIC SYLLABLE MU
+121A ; [.1746.0020.0002.121A] # ETHIOPIC SYLLABLE MI
+121B ; [.1747.0020.0002.121B] # ETHIOPIC SYLLABLE MAA
+121C ; [.1748.0020.0002.121C] # ETHIOPIC SYLLABLE MEE
+121D ; [.1749.0020.0002.121D] # ETHIOPIC SYLLABLE ME
+121E ; [.174A.0020.0002.121E] # ETHIOPIC SYLLABLE MO
+121F ; [.174B.0020.0002.121F] # ETHIOPIC SYLLABLE MWA
+1380 ; [.174C.0020.0002.1380] # ETHIOPIC SYLLABLE SEBATBEIT MWA
+1381 ; [.174D.0020.0002.1381] # ETHIOPIC SYLLABLE MWI
+1382 ; [.174E.0020.0002.1382] # ETHIOPIC SYLLABLE MWEE
+1383 ; [.174F.0020.0002.1383] # ETHIOPIC SYLLABLE MWE
+2D81 ; [.1750.0020.0002.2D81] # ETHIOPIC SYLLABLE MOA
+1220 ; [.1751.0020.0002.1220] # ETHIOPIC SYLLABLE SZA
+1221 ; [.1752.0020.0002.1221] # ETHIOPIC SYLLABLE SZU
+1222 ; [.1753.0020.0002.1222] # ETHIOPIC SYLLABLE SZI
+1223 ; [.1754.0020.0002.1223] # ETHIOPIC SYLLABLE SZAA
+1224 ; [.1755.0020.0002.1224] # ETHIOPIC SYLLABLE SZEE
+1225 ; [.1756.0020.0002.1225] # ETHIOPIC SYLLABLE SZE
+1226 ; [.1757.0020.0002.1226] # ETHIOPIC SYLLABLE SZO
+1227 ; [.1758.0020.0002.1227] # ETHIOPIC SYLLABLE SZWA
+1228 ; [.1759.0020.0002.1228] # ETHIOPIC SYLLABLE RA
+1229 ; [.175A.0020.0002.1229] # ETHIOPIC SYLLABLE RU
+122A ; [.175B.0020.0002.122A] # ETHIOPIC SYLLABLE RI
+122B ; [.175C.0020.0002.122B] # ETHIOPIC SYLLABLE RAA
+122C ; [.175D.0020.0002.122C] # ETHIOPIC SYLLABLE REE
+122D ; [.175E.0020.0002.122D] # ETHIOPIC SYLLABLE RE
+122E ; [.175F.0020.0002.122E] # ETHIOPIC SYLLABLE RO
+122F ; [.1760.0020.0002.122F] # ETHIOPIC SYLLABLE RWA
+2D82 ; [.1761.0020.0002.2D82] # ETHIOPIC SYLLABLE ROA
+1230 ; [.1762.0020.0002.1230] # ETHIOPIC SYLLABLE SA
+1231 ; [.1763.0020.0002.1231] # ETHIOPIC SYLLABLE SU
+1232 ; [.1764.0020.0002.1232] # ETHIOPIC SYLLABLE SI
+1233 ; [.1765.0020.0002.1233] # ETHIOPIC SYLLABLE SAA
+1234 ; [.1766.0020.0002.1234] # ETHIOPIC SYLLABLE SEE
+1235 ; [.1767.0020.0002.1235] # ETHIOPIC SYLLABLE SE
+1236 ; [.1768.0020.0002.1236] # ETHIOPIC SYLLABLE SO
+1237 ; [.1769.0020.0002.1237] # ETHIOPIC SYLLABLE SWA
+2D83 ; [.176A.0020.0002.2D83] # ETHIOPIC SYLLABLE SOA
+1238 ; [.176B.0020.0002.1238] # ETHIOPIC SYLLABLE SHA
+1239 ; [.176C.0020.0002.1239] # ETHIOPIC SYLLABLE SHU
+123A ; [.176D.0020.0002.123A] # ETHIOPIC SYLLABLE SHI
+123B ; [.176E.0020.0002.123B] # ETHIOPIC SYLLABLE SHAA
+123C ; [.176F.0020.0002.123C] # ETHIOPIC SYLLABLE SHEE
+123D ; [.1770.0020.0002.123D] # ETHIOPIC SYLLABLE SHE
+123E ; [.1771.0020.0002.123E] # ETHIOPIC SYLLABLE SHO
+123F ; [.1772.0020.0002.123F] # ETHIOPIC SYLLABLE SHWA
+2D84 ; [.1773.0020.0002.2D84] # ETHIOPIC SYLLABLE SHOA
+1240 ; [.1774.0020.0002.1240] # ETHIOPIC SYLLABLE QA
+1241 ; [.1775.0020.0002.1241] # ETHIOPIC SYLLABLE QU
+1242 ; [.1776.0020.0002.1242] # ETHIOPIC SYLLABLE QI
+1243 ; [.1777.0020.0002.1243] # ETHIOPIC SYLLABLE QAA
+1244 ; [.1778.0020.0002.1244] # ETHIOPIC SYLLABLE QEE
+1245 ; [.1779.0020.0002.1245] # ETHIOPIC SYLLABLE QE
+1246 ; [.177A.0020.0002.1246] # ETHIOPIC SYLLABLE QO
+1247 ; [.177B.0020.0002.1247] # ETHIOPIC SYLLABLE QOA
+1248 ; [.177C.0020.0002.1248] # ETHIOPIC SYLLABLE QWA
+124A ; [.177D.0020.0002.124A] # ETHIOPIC SYLLABLE QWI
+124B ; [.177E.0020.0002.124B] # ETHIOPIC SYLLABLE QWAA
+124C ; [.177F.0020.0002.124C] # ETHIOPIC SYLLABLE QWEE
+124D ; [.1780.0020.0002.124D] # ETHIOPIC SYLLABLE QWE
+1250 ; [.1781.0020.0002.1250] # ETHIOPIC SYLLABLE QHA
+1251 ; [.1782.0020.0002.1251] # ETHIOPIC SYLLABLE QHU
+1252 ; [.1783.0020.0002.1252] # ETHIOPIC SYLLABLE QHI
+1253 ; [.1784.0020.0002.1253] # ETHIOPIC SYLLABLE QHAA
+1254 ; [.1785.0020.0002.1254] # ETHIOPIC SYLLABLE QHEE
+1255 ; [.1786.0020.0002.1255] # ETHIOPIC SYLLABLE QHE
+1256 ; [.1787.0020.0002.1256] # ETHIOPIC SYLLABLE QHO
+1258 ; [.1788.0020.0002.1258] # ETHIOPIC SYLLABLE QHWA
+125A ; [.1789.0020.0002.125A] # ETHIOPIC SYLLABLE QHWI
+125B ; [.178A.0020.0002.125B] # ETHIOPIC SYLLABLE QHWAA
+125C ; [.178B.0020.0002.125C] # ETHIOPIC SYLLABLE QHWEE
+125D ; [.178C.0020.0002.125D] # ETHIOPIC SYLLABLE QHWE
+1260 ; [.178D.0020.0002.1260] # ETHIOPIC SYLLABLE BA
+1261 ; [.178E.0020.0002.1261] # ETHIOPIC SYLLABLE BU
+1262 ; [.178F.0020.0002.1262] # ETHIOPIC SYLLABLE BI
+1263 ; [.1790.0020.0002.1263] # ETHIOPIC SYLLABLE BAA
+1264 ; [.1791.0020.0002.1264] # ETHIOPIC SYLLABLE BEE
+1265 ; [.1792.0020.0002.1265] # ETHIOPIC SYLLABLE BE
+1266 ; [.1793.0020.0002.1266] # ETHIOPIC SYLLABLE BO
+1267 ; [.1794.0020.0002.1267] # ETHIOPIC SYLLABLE BWA
+1384 ; [.1795.0020.0002.1384] # ETHIOPIC SYLLABLE SEBATBEIT BWA
+1385 ; [.1796.0020.0002.1385] # ETHIOPIC SYLLABLE BWI
+1386 ; [.1797.0020.0002.1386] # ETHIOPIC SYLLABLE BWEE
+1387 ; [.1798.0020.0002.1387] # ETHIOPIC SYLLABLE BWE
+2D85 ; [.1799.0020.0002.2D85] # ETHIOPIC SYLLABLE BOA
+1268 ; [.179A.0020.0002.1268] # ETHIOPIC SYLLABLE VA
+1269 ; [.179B.0020.0002.1269] # ETHIOPIC SYLLABLE VU
+126A ; [.179C.0020.0002.126A] # ETHIOPIC SYLLABLE VI
+126B ; [.179D.0020.0002.126B] # ETHIOPIC SYLLABLE VAA
+126C ; [.179E.0020.0002.126C] # ETHIOPIC SYLLABLE VEE
+126D ; [.179F.0020.0002.126D] # ETHIOPIC SYLLABLE VE
+126E ; [.17A0.0020.0002.126E] # ETHIOPIC SYLLABLE VO
+126F ; [.17A1.0020.0002.126F] # ETHIOPIC SYLLABLE VWA
+1270 ; [.17A2.0020.0002.1270] # ETHIOPIC SYLLABLE TA
+1271 ; [.17A3.0020.0002.1271] # ETHIOPIC SYLLABLE TU
+1272 ; [.17A4.0020.0002.1272] # ETHIOPIC SYLLABLE TI
+1273 ; [.17A5.0020.0002.1273] # ETHIOPIC SYLLABLE TAA
+1274 ; [.17A6.0020.0002.1274] # ETHIOPIC SYLLABLE TEE
+1275 ; [.17A7.0020.0002.1275] # ETHIOPIC SYLLABLE TE
+1276 ; [.17A8.0020.0002.1276] # ETHIOPIC SYLLABLE TO
+1277 ; [.17A9.0020.0002.1277] # ETHIOPIC SYLLABLE TWA
+2D86 ; [.17AA.0020.0002.2D86] # ETHIOPIC SYLLABLE TOA
+1278 ; [.17AB.0020.0002.1278] # ETHIOPIC SYLLABLE CA
+1279 ; [.17AC.0020.0002.1279] # ETHIOPIC SYLLABLE CU
+127A ; [.17AD.0020.0002.127A] # ETHIOPIC SYLLABLE CI
+127B ; [.17AE.0020.0002.127B] # ETHIOPIC SYLLABLE CAA
+127C ; [.17AF.0020.0002.127C] # ETHIOPIC SYLLABLE CEE
+127D ; [.17B0.0020.0002.127D] # ETHIOPIC SYLLABLE CE
+127E ; [.17B1.0020.0002.127E] # ETHIOPIC SYLLABLE CO
+127F ; [.17B2.0020.0002.127F] # ETHIOPIC SYLLABLE CWA
+2D87 ; [.17B3.0020.0002.2D87] # ETHIOPIC SYLLABLE COA
+1280 ; [.17B4.0020.0002.1280] # ETHIOPIC SYLLABLE XA
+1281 ; [.17B5.0020.0002.1281] # ETHIOPIC SYLLABLE XU
+1282 ; [.17B6.0020.0002.1282] # ETHIOPIC SYLLABLE XI
+1283 ; [.17B7.0020.0002.1283] # ETHIOPIC SYLLABLE XAA
+1284 ; [.17B8.0020.0002.1284] # ETHIOPIC SYLLABLE XEE
+1285 ; [.17B9.0020.0002.1285] # ETHIOPIC SYLLABLE XE
+1286 ; [.17BA.0020.0002.1286] # ETHIOPIC SYLLABLE XO
+1287 ; [.17BB.0020.0002.1287] # ETHIOPIC SYLLABLE XOA
+1288 ; [.17BC.0020.0002.1288] # ETHIOPIC SYLLABLE XWA
+128A ; [.17BD.0020.0002.128A] # ETHIOPIC SYLLABLE XWI
+128B ; [.17BE.0020.0002.128B] # ETHIOPIC SYLLABLE XWAA
+128C ; [.17BF.0020.0002.128C] # ETHIOPIC SYLLABLE XWEE
+128D ; [.17C0.0020.0002.128D] # ETHIOPIC SYLLABLE XWE
+1290 ; [.17C1.0020.0002.1290] # ETHIOPIC SYLLABLE NA
+1291 ; [.17C2.0020.0002.1291] # ETHIOPIC SYLLABLE NU
+1292 ; [.17C3.0020.0002.1292] # ETHIOPIC SYLLABLE NI
+1293 ; [.17C4.0020.0002.1293] # ETHIOPIC SYLLABLE NAA
+1294 ; [.17C5.0020.0002.1294] # ETHIOPIC SYLLABLE NEE
+1295 ; [.17C6.0020.0002.1295] # ETHIOPIC SYLLABLE NE
+1296 ; [.17C7.0020.0002.1296] # ETHIOPIC SYLLABLE NO
+1297 ; [.17C8.0020.0002.1297] # ETHIOPIC SYLLABLE NWA
+2D88 ; [.17C9.0020.0002.2D88] # ETHIOPIC SYLLABLE NOA
+1298 ; [.17CA.0020.0002.1298] # ETHIOPIC SYLLABLE NYA
+1299 ; [.17CB.0020.0002.1299] # ETHIOPIC SYLLABLE NYU
+129A ; [.17CC.0020.0002.129A] # ETHIOPIC SYLLABLE NYI
+129B ; [.17CD.0020.0002.129B] # ETHIOPIC SYLLABLE NYAA
+129C ; [.17CE.0020.0002.129C] # ETHIOPIC SYLLABLE NYEE
+129D ; [.17CF.0020.0002.129D] # ETHIOPIC SYLLABLE NYE
+129E ; [.17D0.0020.0002.129E] # ETHIOPIC SYLLABLE NYO
+129F ; [.17D1.0020.0002.129F] # ETHIOPIC SYLLABLE NYWA
+2D89 ; [.17D2.0020.0002.2D89] # ETHIOPIC SYLLABLE NYOA
+12A0 ; [.17D3.0020.0002.12A0] # ETHIOPIC SYLLABLE GLOTTAL A
+12A1 ; [.17D4.0020.0002.12A1] # ETHIOPIC SYLLABLE GLOTTAL U
+12A2 ; [.17D5.0020.0002.12A2] # ETHIOPIC SYLLABLE GLOTTAL I
+12A3 ; [.17D6.0020.0002.12A3] # ETHIOPIC SYLLABLE GLOTTAL AA
+12A4 ; [.17D7.0020.0002.12A4] # ETHIOPIC SYLLABLE GLOTTAL EE
+12A5 ; [.17D8.0020.0002.12A5] # ETHIOPIC SYLLABLE GLOTTAL E
+12A6 ; [.17D9.0020.0002.12A6] # ETHIOPIC SYLLABLE GLOTTAL O
+12A7 ; [.17DA.0020.0002.12A7] # ETHIOPIC SYLLABLE GLOTTAL WA
+2D8A ; [.17DB.0020.0002.2D8A] # ETHIOPIC SYLLABLE GLOTTAL OA
+12A8 ; [.17DC.0020.0002.12A8] # ETHIOPIC SYLLABLE KA
+12A9 ; [.17DD.0020.0002.12A9] # ETHIOPIC SYLLABLE KU
+12AA ; [.17DE.0020.0002.12AA] # ETHIOPIC SYLLABLE KI
+12AB ; [.17DF.0020.0002.12AB] # ETHIOPIC SYLLABLE KAA
+12AC ; [.17E0.0020.0002.12AC] # ETHIOPIC SYLLABLE KEE
+12AD ; [.17E1.0020.0002.12AD] # ETHIOPIC SYLLABLE KE
+12AE ; [.17E2.0020.0002.12AE] # ETHIOPIC SYLLABLE KO
+12AF ; [.17E3.0020.0002.12AF] # ETHIOPIC SYLLABLE KOA
+12B0 ; [.17E4.0020.0002.12B0] # ETHIOPIC SYLLABLE KWA
+12B2 ; [.17E5.0020.0002.12B2] # ETHIOPIC SYLLABLE KWI
+12B3 ; [.17E6.0020.0002.12B3] # ETHIOPIC SYLLABLE KWAA
+12B4 ; [.17E7.0020.0002.12B4] # ETHIOPIC SYLLABLE KWEE
+12B5 ; [.17E8.0020.0002.12B5] # ETHIOPIC SYLLABLE KWE
+12B8 ; [.17E9.0020.0002.12B8] # ETHIOPIC SYLLABLE KXA
+12B9 ; [.17EA.0020.0002.12B9] # ETHIOPIC SYLLABLE KXU
+12BA ; [.17EB.0020.0002.12BA] # ETHIOPIC SYLLABLE KXI
+12BB ; [.17EC.0020.0002.12BB] # ETHIOPIC SYLLABLE KXAA
+12BC ; [.17ED.0020.0002.12BC] # ETHIOPIC SYLLABLE KXEE
+12BD ; [.17EE.0020.0002.12BD] # ETHIOPIC SYLLABLE KXE
+12BE ; [.17EF.0020.0002.12BE] # ETHIOPIC SYLLABLE KXO
+12C0 ; [.17F0.0020.0002.12C0] # ETHIOPIC SYLLABLE KXWA
+12C2 ; [.17F1.0020.0002.12C2] # ETHIOPIC SYLLABLE KXWI
+12C3 ; [.17F2.0020.0002.12C3] # ETHIOPIC SYLLABLE KXWAA
+12C4 ; [.17F3.0020.0002.12C4] # ETHIOPIC SYLLABLE KXWEE
+12C5 ; [.17F4.0020.0002.12C5] # ETHIOPIC SYLLABLE KXWE
+12C8 ; [.17F5.0020.0002.12C8] # ETHIOPIC SYLLABLE WA
+12C9 ; [.17F6.0020.0002.12C9] # ETHIOPIC SYLLABLE WU
+12CA ; [.17F7.0020.0002.12CA] # ETHIOPIC SYLLABLE WI
+12CB ; [.17F8.0020.0002.12CB] # ETHIOPIC SYLLABLE WAA
+12CC ; [.17F9.0020.0002.12CC] # ETHIOPIC SYLLABLE WEE
+12CD ; [.17FA.0020.0002.12CD] # ETHIOPIC SYLLABLE WE
+12CE ; [.17FB.0020.0002.12CE] # ETHIOPIC SYLLABLE WO
+12CF ; [.17FC.0020.0002.12CF] # ETHIOPIC SYLLABLE WOA
+12D0 ; [.17FD.0020.0002.12D0] # ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1 ; [.17FE.0020.0002.12D1] # ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2 ; [.17FF.0020.0002.12D2] # ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3 ; [.1800.0020.0002.12D3] # ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4 ; [.1801.0020.0002.12D4] # ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5 ; [.1802.0020.0002.12D5] # ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6 ; [.1803.0020.0002.12D6] # ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8 ; [.1804.0020.0002.12D8] # ETHIOPIC SYLLABLE ZA
+12D9 ; [.1805.0020.0002.12D9] # ETHIOPIC SYLLABLE ZU
+12DA ; [.1806.0020.0002.12DA] # ETHIOPIC SYLLABLE ZI
+12DB ; [.1807.0020.0002.12DB] # ETHIOPIC SYLLABLE ZAA
+12DC ; [.1808.0020.0002.12DC] # ETHIOPIC SYLLABLE ZEE
+12DD ; [.1809.0020.0002.12DD] # ETHIOPIC SYLLABLE ZE
+12DE ; [.180A.0020.0002.12DE] # ETHIOPIC SYLLABLE ZO
+12DF ; [.180B.0020.0002.12DF] # ETHIOPIC SYLLABLE ZWA
+2D8B ; [.180C.0020.0002.2D8B] # ETHIOPIC SYLLABLE ZOA
+12E0 ; [.180D.0020.0002.12E0] # ETHIOPIC SYLLABLE ZHA
+12E1 ; [.180E.0020.0002.12E1] # ETHIOPIC SYLLABLE ZHU
+12E2 ; [.180F.0020.0002.12E2] # ETHIOPIC SYLLABLE ZHI
+12E3 ; [.1810.0020.0002.12E3] # ETHIOPIC SYLLABLE ZHAA
+12E4 ; [.1811.0020.0002.12E4] # ETHIOPIC SYLLABLE ZHEE
+12E5 ; [.1812.0020.0002.12E5] # ETHIOPIC SYLLABLE ZHE
+12E6 ; [.1813.0020.0002.12E6] # ETHIOPIC SYLLABLE ZHO
+12E7 ; [.1814.0020.0002.12E7] # ETHIOPIC SYLLABLE ZHWA
+12E8 ; [.1815.0020.0002.12E8] # ETHIOPIC SYLLABLE YA
+12E9 ; [.1816.0020.0002.12E9] # ETHIOPIC SYLLABLE YU
+12EA ; [.1817.0020.0002.12EA] # ETHIOPIC SYLLABLE YI
+12EB ; [.1818.0020.0002.12EB] # ETHIOPIC SYLLABLE YAA
+12EC ; [.1819.0020.0002.12EC] # ETHIOPIC SYLLABLE YEE
+12ED ; [.181A.0020.0002.12ED] # ETHIOPIC SYLLABLE YE
+12EE ; [.181B.0020.0002.12EE] # ETHIOPIC SYLLABLE YO
+12EF ; [.181C.0020.0002.12EF] # ETHIOPIC SYLLABLE YOA
+12F0 ; [.181D.0020.0002.12F0] # ETHIOPIC SYLLABLE DA
+12F1 ; [.181E.0020.0002.12F1] # ETHIOPIC SYLLABLE DU
+12F2 ; [.181F.0020.0002.12F2] # ETHIOPIC SYLLABLE DI
+12F3 ; [.1820.0020.0002.12F3] # ETHIOPIC SYLLABLE DAA
+12F4 ; [.1821.0020.0002.12F4] # ETHIOPIC SYLLABLE DEE
+12F5 ; [.1822.0020.0002.12F5] # ETHIOPIC SYLLABLE DE
+12F6 ; [.1823.0020.0002.12F6] # ETHIOPIC SYLLABLE DO
+12F7 ; [.1824.0020.0002.12F7] # ETHIOPIC SYLLABLE DWA
+2D8C ; [.1825.0020.0002.2D8C] # ETHIOPIC SYLLABLE DOA
+12F8 ; [.1826.0020.0002.12F8] # ETHIOPIC SYLLABLE DDA
+12F9 ; [.1827.0020.0002.12F9] # ETHIOPIC SYLLABLE DDU
+12FA ; [.1828.0020.0002.12FA] # ETHIOPIC SYLLABLE DDI
+12FB ; [.1829.0020.0002.12FB] # ETHIOPIC SYLLABLE DDAA
+12FC ; [.182A.0020.0002.12FC] # ETHIOPIC SYLLABLE DDEE
+12FD ; [.182B.0020.0002.12FD] # ETHIOPIC SYLLABLE DDE
+12FE ; [.182C.0020.0002.12FE] # ETHIOPIC SYLLABLE DDO
+12FF ; [.182D.0020.0002.12FF] # ETHIOPIC SYLLABLE DDWA
+2D8D ; [.182E.0020.0002.2D8D] # ETHIOPIC SYLLABLE DDOA
+1300 ; [.182F.0020.0002.1300] # ETHIOPIC SYLLABLE JA
+1301 ; [.1830.0020.0002.1301] # ETHIOPIC SYLLABLE JU
+1302 ; [.1831.0020.0002.1302] # ETHIOPIC SYLLABLE JI
+1303 ; [.1832.0020.0002.1303] # ETHIOPIC SYLLABLE JAA
+1304 ; [.1833.0020.0002.1304] # ETHIOPIC SYLLABLE JEE
+1305 ; [.1834.0020.0002.1305] # ETHIOPIC SYLLABLE JE
+1306 ; [.1835.0020.0002.1306] # ETHIOPIC SYLLABLE JO
+1307 ; [.1836.0020.0002.1307] # ETHIOPIC SYLLABLE JWA
+2D8E ; [.1837.0020.0002.2D8E] # ETHIOPIC SYLLABLE JOA
+1308 ; [.1838.0020.0002.1308] # ETHIOPIC SYLLABLE GA
+1309 ; [.1839.0020.0002.1309] # ETHIOPIC SYLLABLE GU
+130A ; [.183A.0020.0002.130A] # ETHIOPIC SYLLABLE GI
+130B ; [.183B.0020.0002.130B] # ETHIOPIC SYLLABLE GAA
+130C ; [.183C.0020.0002.130C] # ETHIOPIC SYLLABLE GEE
+130D ; [.183D.0020.0002.130D] # ETHIOPIC SYLLABLE GE
+130E ; [.183E.0020.0002.130E] # ETHIOPIC SYLLABLE GO
+130F ; [.183F.0020.0002.130F] # ETHIOPIC SYLLABLE GOA
+1310 ; [.1840.0020.0002.1310] # ETHIOPIC SYLLABLE GWA
+1312 ; [.1841.0020.0002.1312] # ETHIOPIC SYLLABLE GWI
+1313 ; [.1842.0020.0002.1313] # ETHIOPIC SYLLABLE GWAA
+1314 ; [.1843.0020.0002.1314] # ETHIOPIC SYLLABLE GWEE
+1315 ; [.1844.0020.0002.1315] # ETHIOPIC SYLLABLE GWE
+1318 ; [.1845.0020.0002.1318] # ETHIOPIC SYLLABLE GGA
+1319 ; [.1846.0020.0002.1319] # ETHIOPIC SYLLABLE GGU
+131A ; [.1847.0020.0002.131A] # ETHIOPIC SYLLABLE GGI
+131B ; [.1848.0020.0002.131B] # ETHIOPIC SYLLABLE GGAA
+131C ; [.1849.0020.0002.131C] # ETHIOPIC SYLLABLE GGEE
+131D ; [.184A.0020.0002.131D] # ETHIOPIC SYLLABLE GGE
+131E ; [.184B.0020.0002.131E] # ETHIOPIC SYLLABLE GGO
+131F ; [.184C.0020.0002.131F] # ETHIOPIC SYLLABLE GGWAA
+2D93 ; [.184D.0020.0002.2D93] # ETHIOPIC SYLLABLE GGWA
+2D94 ; [.184E.0020.0002.2D94] # ETHIOPIC SYLLABLE GGWI
+2D95 ; [.184F.0020.0002.2D95] # ETHIOPIC SYLLABLE GGWEE
+2D96 ; [.1850.0020.0002.2D96] # ETHIOPIC SYLLABLE GGWE
+1320 ; [.1851.0020.0002.1320] # ETHIOPIC SYLLABLE THA
+1321 ; [.1852.0020.0002.1321] # ETHIOPIC SYLLABLE THU
+1322 ; [.1853.0020.0002.1322] # ETHIOPIC SYLLABLE THI
+1323 ; [.1854.0020.0002.1323] # ETHIOPIC SYLLABLE THAA
+1324 ; [.1855.0020.0002.1324] # ETHIOPIC SYLLABLE THEE
+1325 ; [.1856.0020.0002.1325] # ETHIOPIC SYLLABLE THE
+1326 ; [.1857.0020.0002.1326] # ETHIOPIC SYLLABLE THO
+1327 ; [.1858.0020.0002.1327] # ETHIOPIC SYLLABLE THWA
+2D8F ; [.1859.0020.0002.2D8F] # ETHIOPIC SYLLABLE THOA
+1328 ; [.185A.0020.0002.1328] # ETHIOPIC SYLLABLE CHA
+1329 ; [.185B.0020.0002.1329] # ETHIOPIC SYLLABLE CHU
+132A ; [.185C.0020.0002.132A] # ETHIOPIC SYLLABLE CHI
+132B ; [.185D.0020.0002.132B] # ETHIOPIC SYLLABLE CHAA
+132C ; [.185E.0020.0002.132C] # ETHIOPIC SYLLABLE CHEE
+132D ; [.185F.0020.0002.132D] # ETHIOPIC SYLLABLE CHE
+132E ; [.1860.0020.0002.132E] # ETHIOPIC SYLLABLE CHO
+132F ; [.1861.0020.0002.132F] # ETHIOPIC SYLLABLE CHWA
+2D90 ; [.1862.0020.0002.2D90] # ETHIOPIC SYLLABLE CHOA
+1330 ; [.1863.0020.0002.1330] # ETHIOPIC SYLLABLE PHA
+1331 ; [.1864.0020.0002.1331] # ETHIOPIC SYLLABLE PHU
+1332 ; [.1865.0020.0002.1332] # ETHIOPIC SYLLABLE PHI
+1333 ; [.1866.0020.0002.1333] # ETHIOPIC SYLLABLE PHAA
+1334 ; [.1867.0020.0002.1334] # ETHIOPIC SYLLABLE PHEE
+1335 ; [.1868.0020.0002.1335] # ETHIOPIC SYLLABLE PHE
+1336 ; [.1869.0020.0002.1336] # ETHIOPIC SYLLABLE PHO
+1337 ; [.186A.0020.0002.1337] # ETHIOPIC SYLLABLE PHWA
+2D91 ; [.186B.0020.0002.2D91] # ETHIOPIC SYLLABLE PHOA
+1338 ; [.186C.0020.0002.1338] # ETHIOPIC SYLLABLE TSA
+1339 ; [.186D.0020.0002.1339] # ETHIOPIC SYLLABLE TSU
+133A ; [.186E.0020.0002.133A] # ETHIOPIC SYLLABLE TSI
+133B ; [.186F.0020.0002.133B] # ETHIOPIC SYLLABLE TSAA
+133C ; [.1870.0020.0002.133C] # ETHIOPIC SYLLABLE TSEE
+133D ; [.1871.0020.0002.133D] # ETHIOPIC SYLLABLE TSE
+133E ; [.1872.0020.0002.133E] # ETHIOPIC SYLLABLE TSO
+133F ; [.1873.0020.0002.133F] # ETHIOPIC SYLLABLE TSWA
+1340 ; [.1874.0020.0002.1340] # ETHIOPIC SYLLABLE TZA
+1341 ; [.1875.0020.0002.1341] # ETHIOPIC SYLLABLE TZU
+1342 ; [.1876.0020.0002.1342] # ETHIOPIC SYLLABLE TZI
+1343 ; [.1877.0020.0002.1343] # ETHIOPIC SYLLABLE TZAA
+1344 ; [.1878.0020.0002.1344] # ETHIOPIC SYLLABLE TZEE
+1345 ; [.1879.0020.0002.1345] # ETHIOPIC SYLLABLE TZE
+1346 ; [.187A.0020.0002.1346] # ETHIOPIC SYLLABLE TZO
+1347 ; [.187B.0020.0002.1347] # ETHIOPIC SYLLABLE TZOA
+1348 ; [.187C.0020.0002.1348] # ETHIOPIC SYLLABLE FA
+1349 ; [.187D.0020.0002.1349] # ETHIOPIC SYLLABLE FU
+134A ; [.187E.0020.0002.134A] # ETHIOPIC SYLLABLE FI
+134B ; [.187F.0020.0002.134B] # ETHIOPIC SYLLABLE FAA
+134C ; [.1880.0020.0002.134C] # ETHIOPIC SYLLABLE FEE
+134D ; [.1881.0020.0002.134D] # ETHIOPIC SYLLABLE FE
+134E ; [.1882.0020.0002.134E] # ETHIOPIC SYLLABLE FO
+134F ; [.1883.0020.0002.134F] # ETHIOPIC SYLLABLE FWA
+1388 ; [.1884.0020.0002.1388] # ETHIOPIC SYLLABLE SEBATBEIT FWA
+1389 ; [.1885.0020.0002.1389] # ETHIOPIC SYLLABLE FWI
+138A ; [.1886.0020.0002.138A] # ETHIOPIC SYLLABLE FWEE
+138B ; [.1887.0020.0002.138B] # ETHIOPIC SYLLABLE FWE
+1350 ; [.1888.0020.0002.1350] # ETHIOPIC SYLLABLE PA
+1351 ; [.1889.0020.0002.1351] # ETHIOPIC SYLLABLE PU
+1352 ; [.188A.0020.0002.1352] # ETHIOPIC SYLLABLE PI
+1353 ; [.188B.0020.0002.1353] # ETHIOPIC SYLLABLE PAA
+1354 ; [.188C.0020.0002.1354] # ETHIOPIC SYLLABLE PEE
+1355 ; [.188D.0020.0002.1355] # ETHIOPIC SYLLABLE PE
+1356 ; [.188E.0020.0002.1356] # ETHIOPIC SYLLABLE PO
+1357 ; [.188F.0020.0002.1357] # ETHIOPIC SYLLABLE PWA
+138C ; [.1890.0020.0002.138C] # ETHIOPIC SYLLABLE SEBATBEIT PWA
+138D ; [.1891.0020.0002.138D] # ETHIOPIC SYLLABLE PWI
+138E ; [.1892.0020.0002.138E] # ETHIOPIC SYLLABLE PWEE
+138F ; [.1893.0020.0002.138F] # ETHIOPIC SYLLABLE PWE
+2D92 ; [.1894.0020.0002.2D92] # ETHIOPIC SYLLABLE POA
+1358 ; [.1895.0020.0002.1358] # ETHIOPIC SYLLABLE RYA
+1359 ; [.1896.0020.0002.1359] # ETHIOPIC SYLLABLE MYA
+135A ; [.1897.0020.0002.135A] # ETHIOPIC SYLLABLE FYA
+2DA0 ; [.1898.0020.0002.2DA0] # ETHIOPIC SYLLABLE SSA
+2DA1 ; [.1899.0020.0002.2DA1] # ETHIOPIC SYLLABLE SSU
+2DA2 ; [.189A.0020.0002.2DA2] # ETHIOPIC SYLLABLE SSI
+2DA3 ; [.189B.0020.0002.2DA3] # ETHIOPIC SYLLABLE SSAA
+2DA4 ; [.189C.0020.0002.2DA4] # ETHIOPIC SYLLABLE SSEE
+2DA5 ; [.189D.0020.0002.2DA5] # ETHIOPIC SYLLABLE SSE
+2DA6 ; [.189E.0020.0002.2DA6] # ETHIOPIC SYLLABLE SSO
+2DA8 ; [.189F.0020.0002.2DA8] # ETHIOPIC SYLLABLE CCA
+2DA9 ; [.18A0.0020.0002.2DA9] # ETHIOPIC SYLLABLE CCU
+2DAA ; [.18A1.0020.0002.2DAA] # ETHIOPIC SYLLABLE CCI
+2DAB ; [.18A2.0020.0002.2DAB] # ETHIOPIC SYLLABLE CCAA
+2DAC ; [.18A3.0020.0002.2DAC] # ETHIOPIC SYLLABLE CCEE
+2DAD ; [.18A4.0020.0002.2DAD] # ETHIOPIC SYLLABLE CCE
+2DAE ; [.18A5.0020.0002.2DAE] # ETHIOPIC SYLLABLE CCO
+2DB0 ; [.18A6.0020.0002.2DB0] # ETHIOPIC SYLLABLE ZZA
+2DB1 ; [.18A7.0020.0002.2DB1] # ETHIOPIC SYLLABLE ZZU
+2DB2 ; [.18A8.0020.0002.2DB2] # ETHIOPIC SYLLABLE ZZI
+2DB3 ; [.18A9.0020.0002.2DB3] # ETHIOPIC SYLLABLE ZZAA
+2DB4 ; [.18AA.0020.0002.2DB4] # ETHIOPIC SYLLABLE ZZEE
+2DB5 ; [.18AB.0020.0002.2DB5] # ETHIOPIC SYLLABLE ZZE
+2DB6 ; [.18AC.0020.0002.2DB6] # ETHIOPIC SYLLABLE ZZO
+2DB8 ; [.18AD.0020.0002.2DB8] # ETHIOPIC SYLLABLE CCHA
+2DB9 ; [.18AE.0020.0002.2DB9] # ETHIOPIC SYLLABLE CCHU
+2DBA ; [.18AF.0020.0002.2DBA] # ETHIOPIC SYLLABLE CCHI
+2DBB ; [.18B0.0020.0002.2DBB] # ETHIOPIC SYLLABLE CCHAA
+2DBC ; [.18B1.0020.0002.2DBC] # ETHIOPIC SYLLABLE CCHEE
+2DBD ; [.18B2.0020.0002.2DBD] # ETHIOPIC SYLLABLE CCHE
+2DBE ; [.18B3.0020.0002.2DBE] # ETHIOPIC SYLLABLE CCHO
+2DC0 ; [.18B4.0020.0002.2DC0] # ETHIOPIC SYLLABLE QYA
+2DC1 ; [.18B5.0020.0002.2DC1] # ETHIOPIC SYLLABLE QYU
+2DC2 ; [.18B6.0020.0002.2DC2] # ETHIOPIC SYLLABLE QYI
+2DC3 ; [.18B7.0020.0002.2DC3] # ETHIOPIC SYLLABLE QYAA
+2DC4 ; [.18B8.0020.0002.2DC4] # ETHIOPIC SYLLABLE QYEE
+2DC5 ; [.18B9.0020.0002.2DC5] # ETHIOPIC SYLLABLE QYE
+2DC6 ; [.18BA.0020.0002.2DC6] # ETHIOPIC SYLLABLE QYO
+2DC8 ; [.18BB.0020.0002.2DC8] # ETHIOPIC SYLLABLE KYA
+2DC9 ; [.18BC.0020.0002.2DC9] # ETHIOPIC SYLLABLE KYU
+2DCA ; [.18BD.0020.0002.2DCA] # ETHIOPIC SYLLABLE KYI
+2DCB ; [.18BE.0020.0002.2DCB] # ETHIOPIC SYLLABLE KYAA
+2DCC ; [.18BF.0020.0002.2DCC] # ETHIOPIC SYLLABLE KYEE
+2DCD ; [.18C0.0020.0002.2DCD] # ETHIOPIC SYLLABLE KYE
+2DCE ; [.18C1.0020.0002.2DCE] # ETHIOPIC SYLLABLE KYO
+2DD0 ; [.18C2.0020.0002.2DD0] # ETHIOPIC SYLLABLE XYA
+2DD1 ; [.18C3.0020.0002.2DD1] # ETHIOPIC SYLLABLE XYU
+2DD2 ; [.18C4.0020.0002.2DD2] # ETHIOPIC SYLLABLE XYI
+2DD3 ; [.18C5.0020.0002.2DD3] # ETHIOPIC SYLLABLE XYAA
+2DD4 ; [.18C6.0020.0002.2DD4] # ETHIOPIC SYLLABLE XYEE
+2DD5 ; [.18C7.0020.0002.2DD5] # ETHIOPIC SYLLABLE XYE
+2DD6 ; [.18C8.0020.0002.2DD6] # ETHIOPIC SYLLABLE XYO
+2DD8 ; [.18C9.0020.0002.2DD8] # ETHIOPIC SYLLABLE GYA
+2DD9 ; [.18CA.0020.0002.2DD9] # ETHIOPIC SYLLABLE GYU
+2DDA ; [.18CB.0020.0002.2DDA] # ETHIOPIC SYLLABLE GYI
+2DDB ; [.18CC.0020.0002.2DDB] # ETHIOPIC SYLLABLE GYAA
+2DDC ; [.18CD.0020.0002.2DDC] # ETHIOPIC SYLLABLE GYEE
+2DDD ; [.18CE.0020.0002.2DDD] # ETHIOPIC SYLLABLE GYE
+2DDE ; [.18CF.0020.0002.2DDE] # ETHIOPIC SYLLABLE GYO
+0950 ; [.18D0.0020.0002.0950] # DEVANAGARI OM
+0904 ; [.18D1.0020.0002.0904] # DEVANAGARI LETTER SHORT A
+0905 ; [.18D2.0020.0002.0905] # DEVANAGARI LETTER A
+0906 ; [.18D3.0020.0002.0906] # DEVANAGARI LETTER AA
+0907 ; [.18D4.0020.0002.0907] # DEVANAGARI LETTER I
+0908 ; [.18D5.0020.0002.0908] # DEVANAGARI LETTER II
+0909 ; [.18D6.0020.0002.0909] # DEVANAGARI LETTER U
+090A ; [.18D7.0020.0002.090A] # DEVANAGARI LETTER UU
+090B ; [.18D8.0020.0002.090B] # DEVANAGARI LETTER VOCALIC R
+0960 ; [.18D9.0020.0002.0960] # DEVANAGARI LETTER VOCALIC RR
+090C ; [.18DA.0020.0002.090C] # DEVANAGARI LETTER VOCALIC L
+0961 ; [.18DB.0020.0002.0961] # DEVANAGARI LETTER VOCALIC LL
+090D ; [.18DC.0020.0002.090D] # DEVANAGARI LETTER CANDRA E
+090E ; [.18DD.0020.0002.090E] # DEVANAGARI LETTER SHORT E
+090F ; [.18DE.0020.0002.090F] # DEVANAGARI LETTER E
+0910 ; [.18DF.0020.0002.0910] # DEVANAGARI LETTER AI
+0911 ; [.18E0.0020.0002.0911] # DEVANAGARI LETTER CANDRA O
+0912 ; [.18E1.0020.0002.0912] # DEVANAGARI LETTER SHORT O
+0913 ; [.18E2.0020.0002.0913] # DEVANAGARI LETTER O
+0914 ; [.18E3.0020.0002.0914] # DEVANAGARI LETTER AU
+0915 ; [.18E4.0020.0002.0915] # DEVANAGARI LETTER KA
+0958 ; [.18E4.0020.0002.0915][.0000.0119.0002.093C] # DEVANAGARI LETTER QA; QQCM
+0916 ; [.18E5.0020.0002.0916] # DEVANAGARI LETTER KHA
+0959 ; [.18E5.0020.0002.0916][.0000.0119.0002.093C] # DEVANAGARI LETTER KHHA; QQCM
+0917 ; [.18E6.0020.0002.0917] # DEVANAGARI LETTER GA
+095A ; [.18E6.0020.0002.0917][.0000.0119.0002.093C] # DEVANAGARI LETTER GHHA; QQCM
+097B ; [.18E7.0020.0002.097B] # DEVANAGARI LETTER GGA
+0918 ; [.18E8.0020.0002.0918] # DEVANAGARI LETTER GHA
+0919 ; [.18E9.0020.0002.0919] # DEVANAGARI LETTER NGA
+091A ; [.18EA.0020.0002.091A] # DEVANAGARI LETTER CA
+091B ; [.18EB.0020.0002.091B] # DEVANAGARI LETTER CHA
+091C ; [.18EC.0020.0002.091C] # DEVANAGARI LETTER JA
+095B ; [.18EC.0020.0002.091C][.0000.0119.0002.093C] # DEVANAGARI LETTER ZA; QQCM
+097C ; [.18ED.0020.0002.097C] # DEVANAGARI LETTER JJA
+091D ; [.18EE.0020.0002.091D] # DEVANAGARI LETTER JHA
+091E ; [.18EF.0020.0002.091E] # DEVANAGARI LETTER NYA
+091F ; [.18F0.0020.0002.091F] # DEVANAGARI LETTER TTA
+0920 ; [.18F1.0020.0002.0920] # DEVANAGARI LETTER TTHA
+0921 ; [.18F2.0020.0002.0921] # DEVANAGARI LETTER DDA
+095C ; [.18F2.0020.0002.0921][.0000.0119.0002.093C] # DEVANAGARI LETTER DDDHA; QQCM
+097E ; [.18F3.0020.0002.097E] # DEVANAGARI LETTER DDDA
+0922 ; [.18F4.0020.0002.0922] # DEVANAGARI LETTER DDHA
+095D ; [.18F4.0020.0002.0922][.0000.0119.0002.093C] # DEVANAGARI LETTER RHA; QQCM
+0923 ; [.18F5.0020.0002.0923] # DEVANAGARI LETTER NNA
+0924 ; [.18F6.0020.0002.0924] # DEVANAGARI LETTER TA
+0925 ; [.18F7.0020.0002.0925] # DEVANAGARI LETTER THA
+0926 ; [.18F8.0020.0002.0926] # DEVANAGARI LETTER DA
+0927 ; [.18F9.0020.0002.0927] # DEVANAGARI LETTER DHA
+0928 ; [.18FA.0020.0002.0928] # DEVANAGARI LETTER NA
+0929 ; [.18FA.0020.0002.0928][.0000.0119.0002.093C] # DEVANAGARI LETTER NNNA; QQCM
+092A ; [.18FB.0020.0002.092A] # DEVANAGARI LETTER PA
+092B ; [.18FC.0020.0002.092B] # DEVANAGARI LETTER PHA
+095E ; [.18FC.0020.0002.092B][.0000.0119.0002.093C] # DEVANAGARI LETTER FA; QQCM
+092C ; [.18FD.0020.0002.092C] # DEVANAGARI LETTER BA
+097F ; [.18FE.0020.0002.097F] # DEVANAGARI LETTER BBA
+092D ; [.18FF.0020.0002.092D] # DEVANAGARI LETTER BHA
+092E ; [.1900.0020.0002.092E] # DEVANAGARI LETTER MA
+092F ; [.1901.0020.0002.092F] # DEVANAGARI LETTER YA
+095F ; [.1901.0020.0002.092F][.0000.0119.0002.093C] # DEVANAGARI LETTER YYA; QQCM
+0930 ; [.1902.0020.0002.0930] # DEVANAGARI LETTER RA
+0931 ; [.1902.0020.0002.0930][.0000.0119.0002.093C] # DEVANAGARI LETTER RRA; QQCM
+0932 ; [.1903.0020.0002.0932] # DEVANAGARI LETTER LA
+0933 ; [.1904.0020.0002.0933] # DEVANAGARI LETTER LLA
+0934 ; [.1904.0020.0002.0933][.0000.0119.0002.093C] # DEVANAGARI LETTER LLLA; QQCM
+0935 ; [.1905.0020.0002.0935] # DEVANAGARI LETTER VA
+0936 ; [.1906.0020.0002.0936] # DEVANAGARI LETTER SHA
+0937 ; [.1907.0020.0002.0937] # DEVANAGARI LETTER SSA
+0938 ; [.1908.0020.0002.0938] # DEVANAGARI LETTER SA
+0939 ; [.1909.0020.0002.0939] # DEVANAGARI LETTER HA
+093D ; [.190A.0020.0002.093D] # DEVANAGARI SIGN AVAGRAHA
+097D ; [.190B.0020.0002.097D] # DEVANAGARI LETTER GLOTTAL STOP
+093E ; [.190C.0020.0002.093E] # DEVANAGARI VOWEL SIGN AA
+093F ; [.190D.0020.0002.093F] # DEVANAGARI VOWEL SIGN I
+0940 ; [.190E.0020.0002.0940] # DEVANAGARI VOWEL SIGN II
+0941 ; [.190F.0020.0002.0941] # DEVANAGARI VOWEL SIGN U
+0942 ; [.1910.0020.0002.0942] # DEVANAGARI VOWEL SIGN UU
+0943 ; [.1911.0020.0002.0943] # DEVANAGARI VOWEL SIGN VOCALIC R
+0944 ; [.1912.0020.0002.0944] # DEVANAGARI VOWEL SIGN VOCALIC RR
+0962 ; [.1913.0020.0002.0962] # DEVANAGARI VOWEL SIGN VOCALIC L
+0963 ; [.1914.0020.0002.0963] # DEVANAGARI VOWEL SIGN VOCALIC LL
+0945 ; [.1915.0020.0002.0945] # DEVANAGARI VOWEL SIGN CANDRA E
+0946 ; [.1916.0020.0002.0946] # DEVANAGARI VOWEL SIGN SHORT E
+0947 ; [.1917.0020.0002.0947] # DEVANAGARI VOWEL SIGN E
+0948 ; [.1918.0020.0002.0948] # DEVANAGARI VOWEL SIGN AI
+0949 ; [.1919.0020.0002.0949] # DEVANAGARI VOWEL SIGN CANDRA O
+094A ; [.191A.0020.0002.094A] # DEVANAGARI VOWEL SIGN SHORT O
+094B ; [.191B.0020.0002.094B] # DEVANAGARI VOWEL SIGN O
+094C ; [.191C.0020.0002.094C] # DEVANAGARI VOWEL SIGN AU
+094D ; [.191D.0020.0002.094D] # DEVANAGARI SIGN VIRAMA
+0985 ; [.191E.0020.0002.0985] # BENGALI LETTER A
+0986 ; [.191F.0020.0002.0986] # BENGALI LETTER AA
+0987 ; [.1920.0020.0002.0987] # BENGALI LETTER I
+0988 ; [.1921.0020.0002.0988] # BENGALI LETTER II
+0989 ; [.1922.0020.0002.0989] # BENGALI LETTER U
+098A ; [.1923.0020.0002.098A] # BENGALI LETTER UU
+098B ; [.1924.0020.0002.098B] # BENGALI LETTER VOCALIC R
+09E0 ; [.1925.0020.0002.09E0] # BENGALI LETTER VOCALIC RR
+098C ; [.1926.0020.0002.098C] # BENGALI LETTER VOCALIC L
+09E1 ; [.1927.0020.0002.09E1] # BENGALI LETTER VOCALIC LL
+098F ; [.1928.0020.0002.098F] # BENGALI LETTER E
+0990 ; [.1929.0020.0002.0990] # BENGALI LETTER AI
+0993 ; [.192A.0020.0002.0993] # BENGALI LETTER O
+0994 ; [.192B.0020.0002.0994] # BENGALI LETTER AU
+0995 ; [.192C.0020.0002.0995] # BENGALI LETTER KA
+0996 ; [.192D.0020.0002.0996] # BENGALI LETTER KHA
+0997 ; [.192E.0020.0002.0997] # BENGALI LETTER GA
+0998 ; [.192F.0020.0002.0998] # BENGALI LETTER GHA
+0999 ; [.1930.0020.0002.0999] # BENGALI LETTER NGA
+099A ; [.1931.0020.0002.099A] # BENGALI LETTER CA
+099B ; [.1932.0020.0002.099B] # BENGALI LETTER CHA
+099C ; [.1933.0020.0002.099C] # BENGALI LETTER JA
+099D ; [.1934.0020.0002.099D] # BENGALI LETTER JHA
+099E ; [.1935.0020.0002.099E] # BENGALI LETTER NYA
+099F ; [.1936.0020.0002.099F] # BENGALI LETTER TTA
+09A0 ; [.1937.0020.0002.09A0] # BENGALI LETTER TTHA
+09A1 ; [.1938.0020.0002.09A1] # BENGALI LETTER DDA
+09DC ; [.1938.0020.0002.09A1][.0000.0121.0002.09BC] # BENGALI LETTER RRA; QQCM
+09A2 ; [.1939.0020.0002.09A2] # BENGALI LETTER DDHA
+09DD ; [.1939.0020.0002.09A2][.0000.0121.0002.09BC] # BENGALI LETTER RHA; QQCM
+09A3 ; [.193A.0020.0002.09A3] # BENGALI LETTER NNA
+09A4 ; [.193B.0020.0002.09A4] # BENGALI LETTER TA
+09CE ; [.193B.0020.0004.09CE][.195C.0020.0004.09CE] # BENGALI LETTER KHANDA TA; QQKN
+09A5 ; [.193C.0020.0002.09A5] # BENGALI LETTER THA
+09A6 ; [.193D.0020.0002.09A6] # BENGALI LETTER DA
+09A7 ; [.193E.0020.0002.09A7] # BENGALI LETTER DHA
+09A8 ; [.193F.0020.0002.09A8] # BENGALI LETTER NA
+09AA ; [.1940.0020.0002.09AA] # BENGALI LETTER PA
+09AB ; [.1941.0020.0002.09AB] # BENGALI LETTER PHA
+09AC ; [.1942.0020.0002.09AC] # BENGALI LETTER BA
+09AD ; [.1943.0020.0002.09AD] # BENGALI LETTER BHA
+09AE ; [.1944.0020.0002.09AE] # BENGALI LETTER MA
+09AF ; [.1945.0020.0002.09AF] # BENGALI LETTER YA
+09DF ; [.1945.0020.0002.09AF][.0000.0121.0002.09BC] # BENGALI LETTER YYA; QQCM
+09B0 ; [.1946.0020.0002.09B0] # BENGALI LETTER RA
+09F0 ; [.1947.0020.0002.09F0] # BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09B2 ; [.1948.0020.0002.09B2] # BENGALI LETTER LA
+09F1 ; [.1949.0020.0002.09F1] # BENGALI LETTER RA WITH LOWER DIAGONAL
+09B6 ; [.194A.0020.0002.09B6] # BENGALI LETTER SHA
+09B7 ; [.194B.0020.0002.09B7] # BENGALI LETTER SSA
+09B8 ; [.194C.0020.0002.09B8] # BENGALI LETTER SA
+09B9 ; [.194D.0020.0002.09B9] # BENGALI LETTER HA
+09BD ; [.194E.0020.0002.09BD] # BENGALI SIGN AVAGRAHA
+09BE ; [.194F.0020.0002.09BE] # BENGALI VOWEL SIGN AA
+09BF ; [.1950.0020.0002.09BF] # BENGALI VOWEL SIGN I
+09C0 ; [.1951.0020.0002.09C0] # BENGALI VOWEL SIGN II
+09C1 ; [.1952.0020.0002.09C1] # BENGALI VOWEL SIGN U
+09C2 ; [.1953.0020.0002.09C2] # BENGALI VOWEL SIGN UU
+09C3 ; [.1954.0020.0002.09C3] # BENGALI VOWEL SIGN VOCALIC R
+09C4 ; [.1955.0020.0002.09C4] # BENGALI VOWEL SIGN VOCALIC RR
+09E2 ; [.1956.0020.0002.09E2] # BENGALI VOWEL SIGN VOCALIC L
+09E3 ; [.1957.0020.0002.09E3] # BENGALI VOWEL SIGN VOCALIC LL
+09C7 ; [.1958.0020.0002.09C7] # BENGALI VOWEL SIGN E
+09C8 ; [.1959.0020.0002.09C8] # BENGALI VOWEL SIGN AI
+09CB ; [.195A.0020.0002.09CB] # BENGALI VOWEL SIGN O
+09C7 09BE ; [.195A.0020.0002.09CB] # BENGALI VOWEL SIGN O
+09CC ; [.195B.0020.0002.09CC] # BENGALI VOWEL SIGN AU
+09C7 09D7 ; [.195B.0020.0002.09CC] # BENGALI VOWEL SIGN AU
+09CD ; [.195C.0020.0002.09CD] # BENGALI SIGN VIRAMA
+09D7 ; [.195D.0020.0002.09D7] # BENGALI AU LENGTH MARK
+0A74 ; [.195E.0020.0002.0A74] # GURMUKHI EK ONKAR
+0A73 ; [.195F.0020.0002.0A73] # GURMUKHI URA
+0A09 ; [.1960.0020.0002.0A09] # GURMUKHI LETTER U
+0A0A ; [.1961.0020.0002.0A0A] # GURMUKHI LETTER UU
+0A13 ; [.1962.0020.0002.0A13] # GURMUKHI LETTER OO
+0A05 ; [.1963.0020.0002.0A05] # GURMUKHI LETTER A
+0A06 ; [.1964.0020.0002.0A06] # GURMUKHI LETTER AA
+0A10 ; [.1965.0020.0002.0A10] # GURMUKHI LETTER AI
+0A14 ; [.1966.0020.0002.0A14] # GURMUKHI LETTER AU
+0A72 ; [.1967.0020.0002.0A72] # GURMUKHI IRI
+0A07 ; [.1968.0020.0002.0A07] # GURMUKHI LETTER I
+0A08 ; [.1969.0020.0002.0A08] # GURMUKHI LETTER II
+0A0F ; [.196A.0020.0002.0A0F] # GURMUKHI LETTER EE
+0A38 ; [.196B.0020.0002.0A38] # GURMUKHI LETTER SA
+0A36 ; [.196B.0020.0002.0A38][.0000.0125.0002.0A3C] # GURMUKHI LETTER SHA; QQCM
+0A39 ; [.196C.0020.0002.0A39] # GURMUKHI LETTER HA
+0A15 ; [.196D.0020.0002.0A15] # GURMUKHI LETTER KA
+0A16 ; [.196E.0020.0002.0A16] # GURMUKHI LETTER KHA
+0A59 ; [.196E.0020.0002.0A16][.0000.0125.0002.0A3C] # GURMUKHI LETTER KHHA; QQCM
+0A17 ; [.196F.0020.0002.0A17] # GURMUKHI LETTER GA
+0A5A ; [.196F.0020.0002.0A17][.0000.0125.0002.0A3C] # GURMUKHI LETTER GHHA; QQCM
+0A18 ; [.1970.0020.0002.0A18] # GURMUKHI LETTER GHA
+0A19 ; [.1971.0020.0002.0A19] # GURMUKHI LETTER NGA
+0A1A ; [.1972.0020.0002.0A1A] # GURMUKHI LETTER CA
+0A1B ; [.1973.0020.0002.0A1B] # GURMUKHI LETTER CHA
+0A1C ; [.1974.0020.0002.0A1C] # GURMUKHI LETTER JA
+0A5B ; [.1974.0020.0002.0A1C][.0000.0125.0002.0A3C] # GURMUKHI LETTER ZA; QQCM
+0A1D ; [.1975.0020.0002.0A1D] # GURMUKHI LETTER JHA
+0A1E ; [.1976.0020.0002.0A1E] # GURMUKHI LETTER NYA
+0A1F ; [.1977.0020.0002.0A1F] # GURMUKHI LETTER TTA
+0A20 ; [.1978.0020.0002.0A20] # GURMUKHI LETTER TTHA
+0A21 ; [.1979.0020.0002.0A21] # GURMUKHI LETTER DDA
+0A22 ; [.197A.0020.0002.0A22] # GURMUKHI LETTER DDHA
+0A23 ; [.197B.0020.0002.0A23] # GURMUKHI LETTER NNA
+0A24 ; [.197C.0020.0002.0A24] # GURMUKHI LETTER TA
+0A25 ; [.197D.0020.0002.0A25] # GURMUKHI LETTER THA
+0A26 ; [.197E.0020.0002.0A26] # GURMUKHI LETTER DA
+0A27 ; [.197F.0020.0002.0A27] # GURMUKHI LETTER DHA
+0A28 ; [.1980.0020.0002.0A28] # GURMUKHI LETTER NA
+0A2A ; [.1981.0020.0002.0A2A] # GURMUKHI LETTER PA
+0A2B ; [.1982.0020.0002.0A2B] # GURMUKHI LETTER PHA
+0A5E ; [.1982.0020.0002.0A2B][.0000.0125.0002.0A3C] # GURMUKHI LETTER FA; QQCM
+0A2C ; [.1983.0020.0002.0A2C] # GURMUKHI LETTER BA
+0A2D ; [.1984.0020.0002.0A2D] # GURMUKHI LETTER BHA
+0A2E ; [.1985.0020.0002.0A2E] # GURMUKHI LETTER MA
+0A2F ; [.1986.0020.0002.0A2F] # GURMUKHI LETTER YA
+0A30 ; [.1987.0020.0002.0A30] # GURMUKHI LETTER RA
+0A32 ; [.1988.0020.0002.0A32] # GURMUKHI LETTER LA
+0A33 ; [.1988.0020.0002.0A32][.0000.0125.0002.0A3C] # GURMUKHI LETTER LLA; QQCM
+0A35 ; [.1989.0020.0002.0A35] # GURMUKHI LETTER VA
+0A5C ; [.198A.0020.0002.0A5C] # GURMUKHI LETTER RRA
+0A3E ; [.198B.0020.0002.0A3E] # GURMUKHI VOWEL SIGN AA
+0A3F ; [.198C.0020.0002.0A3F] # GURMUKHI VOWEL SIGN I
+0A40 ; [.198D.0020.0002.0A40] # GURMUKHI VOWEL SIGN II
+0A41 ; [.198E.0020.0002.0A41] # GURMUKHI VOWEL SIGN U
+0A42 ; [.198F.0020.0002.0A42] # GURMUKHI VOWEL SIGN UU
+0A47 ; [.1990.0020.0002.0A47] # GURMUKHI VOWEL SIGN EE
+0A48 ; [.1991.0020.0002.0A48] # GURMUKHI VOWEL SIGN AI
+0A4B ; [.1992.0020.0002.0A4B] # GURMUKHI VOWEL SIGN OO
+0A4C ; [.1993.0020.0002.0A4C] # GURMUKHI VOWEL SIGN AU
+0A4D ; [.1994.0020.0002.0A4D] # GURMUKHI SIGN VIRAMA
+0AD0 ; [.1995.0020.0002.0AD0] # GUJARATI OM
+0A85 ; [.1996.0020.0002.0A85] # GUJARATI LETTER A
+0A86 ; [.1997.0020.0002.0A86] # GUJARATI LETTER AA
+0A87 ; [.1998.0020.0002.0A87] # GUJARATI LETTER I
+0A88 ; [.1999.0020.0002.0A88] # GUJARATI LETTER II
+0A89 ; [.199A.0020.0002.0A89] # GUJARATI LETTER U
+0A8A ; [.199B.0020.0002.0A8A] # GUJARATI LETTER UU
+0A8B ; [.199C.0020.0002.0A8B] # GUJARATI LETTER VOCALIC R
+0AE0 ; [.199D.0020.0002.0AE0] # GUJARATI LETTER VOCALIC RR
+0A8C ; [.199E.0020.0002.0A8C] # GUJARATI LETTER VOCALIC L
+0AE1 ; [.199F.0020.0002.0AE1] # GUJARATI LETTER VOCALIC LL
+0A8D ; [.19A0.0020.0002.0A8D] # GUJARATI VOWEL CANDRA E
+0A8F ; [.19A1.0020.0002.0A8F] # GUJARATI LETTER E
+0A90 ; [.19A2.0020.0002.0A90] # GUJARATI LETTER AI
+0A91 ; [.19A3.0020.0002.0A91] # GUJARATI VOWEL CANDRA O
+0A93 ; [.19A4.0020.0002.0A93] # GUJARATI LETTER O
+0A94 ; [.19A5.0020.0002.0A94] # GUJARATI LETTER AU
+0A95 ; [.19A6.0020.0002.0A95] # GUJARATI LETTER KA
+0A96 ; [.19A7.0020.0002.0A96] # GUJARATI LETTER KHA
+0A97 ; [.19A8.0020.0002.0A97] # GUJARATI LETTER GA
+0A98 ; [.19A9.0020.0002.0A98] # GUJARATI LETTER GHA
+0A99 ; [.19AA.0020.0002.0A99] # GUJARATI LETTER NGA
+0A9A ; [.19AB.0020.0002.0A9A] # GUJARATI LETTER CA
+0A9B ; [.19AC.0020.0002.0A9B] # GUJARATI LETTER CHA
+0A9C ; [.19AD.0020.0002.0A9C] # GUJARATI LETTER JA
+0A9D ; [.19AE.0020.0002.0A9D] # GUJARATI LETTER JHA
+0A9E ; [.19AF.0020.0002.0A9E] # GUJARATI LETTER NYA
+0A9F ; [.19B0.0020.0002.0A9F] # GUJARATI LETTER TTA
+0AA0 ; [.19B1.0020.0002.0AA0] # GUJARATI LETTER TTHA
+0AA1 ; [.19B2.0020.0002.0AA1] # GUJARATI LETTER DDA
+0AA2 ; [.19B3.0020.0002.0AA2] # GUJARATI LETTER DDHA
+0AA3 ; [.19B4.0020.0002.0AA3] # GUJARATI LETTER NNA
+0AA4 ; [.19B5.0020.0002.0AA4] # GUJARATI LETTER TA
+0AA5 ; [.19B6.0020.0002.0AA5] # GUJARATI LETTER THA
+0AA6 ; [.19B7.0020.0002.0AA6] # GUJARATI LETTER DA
+0AA7 ; [.19B8.0020.0002.0AA7] # GUJARATI LETTER DHA
+0AA8 ; [.19B9.0020.0002.0AA8] # GUJARATI LETTER NA
+0AAA ; [.19BA.0020.0002.0AAA] # GUJARATI LETTER PA
+0AAB ; [.19BB.0020.0002.0AAB] # GUJARATI LETTER PHA
+0AAC ; [.19BC.0020.0002.0AAC] # GUJARATI LETTER BA
+0AAD ; [.19BD.0020.0002.0AAD] # GUJARATI LETTER BHA
+0AAE ; [.19BE.0020.0002.0AAE] # GUJARATI LETTER MA
+0AAF ; [.19BF.0020.0002.0AAF] # GUJARATI LETTER YA
+0AB0 ; [.19C0.0020.0002.0AB0] # GUJARATI LETTER RA
+0AB2 ; [.19C1.0020.0002.0AB2] # GUJARATI LETTER LA
+0AB3 ; [.19C2.0020.0002.0AB3] # GUJARATI LETTER LLA
+0AB5 ; [.19C3.0020.0002.0AB5] # GUJARATI LETTER VA
+0AB6 ; [.19C4.0020.0002.0AB6] # GUJARATI LETTER SHA
+0AB7 ; [.19C5.0020.0002.0AB7] # GUJARATI LETTER SSA
+0AB8 ; [.19C6.0020.0002.0AB8] # GUJARATI LETTER SA
+0AB9 ; [.19C7.0020.0002.0AB9] # GUJARATI LETTER HA
+0ABD ; [.19C8.0020.0002.0ABD] # GUJARATI SIGN AVAGRAHA
+0ABE ; [.19C9.0020.0002.0ABE] # GUJARATI VOWEL SIGN AA
+0ABF ; [.19CA.0020.0002.0ABF] # GUJARATI VOWEL SIGN I
+0AC0 ; [.19CB.0020.0002.0AC0] # GUJARATI VOWEL SIGN II
+0AC1 ; [.19CC.0020.0002.0AC1] # GUJARATI VOWEL SIGN U
+0AC2 ; [.19CD.0020.0002.0AC2] # GUJARATI VOWEL SIGN UU
+0AC3 ; [.19CE.0020.0002.0AC3] # GUJARATI VOWEL SIGN VOCALIC R
+0AC4 ; [.19CF.0020.0002.0AC4] # GUJARATI VOWEL SIGN VOCALIC RR
+0AE2 ; [.19D0.0020.0002.0AE2] # GUJARATI VOWEL SIGN VOCALIC L
+0AE3 ; [.19D1.0020.0002.0AE3] # GUJARATI VOWEL SIGN VOCALIC LL
+0AC5 ; [.19D2.0020.0002.0AC5] # GUJARATI VOWEL SIGN CANDRA E
+0AC7 ; [.19D3.0020.0002.0AC7] # GUJARATI VOWEL SIGN E
+0AC8 ; [.19D4.0020.0002.0AC8] # GUJARATI VOWEL SIGN AI
+0AC9 ; [.19D5.0020.0002.0AC9] # GUJARATI VOWEL SIGN CANDRA O
+0ACB ; [.19D6.0020.0002.0ACB] # GUJARATI VOWEL SIGN O
+0ACC ; [.19D7.0020.0002.0ACC] # GUJARATI VOWEL SIGN AU
+0ACD ; [.19D8.0020.0002.0ACD] # GUJARATI SIGN VIRAMA
+0B05 ; [.19D9.0020.0002.0B05] # ORIYA LETTER A
+0B06 ; [.19DA.0020.0002.0B06] # ORIYA LETTER AA
+0B07 ; [.19DB.0020.0002.0B07] # ORIYA LETTER I
+0B08 ; [.19DC.0020.0002.0B08] # ORIYA LETTER II
+0B09 ; [.19DD.0020.0002.0B09] # ORIYA LETTER U
+0B0A ; [.19DE.0020.0002.0B0A] # ORIYA LETTER UU
+0B0B ; [.19DF.0020.0002.0B0B] # ORIYA LETTER VOCALIC R
+0B60 ; [.19E0.0020.0002.0B60] # ORIYA LETTER VOCALIC RR
+0B0C ; [.19E1.0020.0002.0B0C] # ORIYA LETTER VOCALIC L
+0B61 ; [.19E2.0020.0002.0B61] # ORIYA LETTER VOCALIC LL
+0B0F ; [.19E3.0020.0002.0B0F] # ORIYA LETTER E
+0B10 ; [.19E4.0020.0002.0B10] # ORIYA LETTER AI
+0B13 ; [.19E5.0020.0002.0B13] # ORIYA LETTER O
+0B14 ; [.19E6.0020.0002.0B14] # ORIYA LETTER AU
+0B15 ; [.19E7.0020.0002.0B15] # ORIYA LETTER KA
+0B16 ; [.19E8.0020.0002.0B16] # ORIYA LETTER KHA
+0B17 ; [.19E9.0020.0002.0B17] # ORIYA LETTER GA
+0B18 ; [.19EA.0020.0002.0B18] # ORIYA LETTER GHA
+0B19 ; [.19EB.0020.0002.0B19] # ORIYA LETTER NGA
+0B1A ; [.19EC.0020.0002.0B1A] # ORIYA LETTER CA
+0B1B ; [.19ED.0020.0002.0B1B] # ORIYA LETTER CHA
+0B1C ; [.19EE.0020.0002.0B1C] # ORIYA LETTER JA
+0B1D ; [.19EF.0020.0002.0B1D] # ORIYA LETTER JHA
+0B1E ; [.19F0.0020.0002.0B1E] # ORIYA LETTER NYA
+0B1F ; [.19F1.0020.0002.0B1F] # ORIYA LETTER TTA
+0B20 ; [.19F2.0020.0002.0B20] # ORIYA LETTER TTHA
+0B21 ; [.19F3.0020.0002.0B21] # ORIYA LETTER DDA
+0B5C ; [.19F3.0020.0002.0B21][.0000.012F.0002.0B3C] # ORIYA LETTER RRA; QQCM
+0B22 ; [.19F4.0020.0002.0B22] # ORIYA LETTER DDHA
+0B5D ; [.19F4.0020.0002.0B22][.0000.012F.0002.0B3C] # ORIYA LETTER RHA; QQCM
+0B23 ; [.19F5.0020.0002.0B23] # ORIYA LETTER NNA
+0B24 ; [.19F6.0020.0002.0B24] # ORIYA LETTER TA
+0B25 ; [.19F7.0020.0002.0B25] # ORIYA LETTER THA
+0B26 ; [.19F8.0020.0002.0B26] # ORIYA LETTER DA
+0B27 ; [.19F9.0020.0002.0B27] # ORIYA LETTER DHA
+0B28 ; [.19FA.0020.0002.0B28] # ORIYA LETTER NA
+0B2A ; [.19FB.0020.0002.0B2A] # ORIYA LETTER PA
+0B2B ; [.19FC.0020.0002.0B2B] # ORIYA LETTER PHA
+0B2C ; [.19FD.0020.0002.0B2C] # ORIYA LETTER BA
+0B2D ; [.19FE.0020.0002.0B2D] # ORIYA LETTER BHA
+0B2E ; [.19FF.0020.0002.0B2E] # ORIYA LETTER MA
+0B2F ; [.1A00.0020.0002.0B2F] # ORIYA LETTER YA
+0B5F ; [.1A01.0020.0002.0B5F] # ORIYA LETTER YYA
+0B30 ; [.1A02.0020.0002.0B30] # ORIYA LETTER RA
+0B32 ; [.1A03.0020.0002.0B32] # ORIYA LETTER LA
+0B33 ; [.1A04.0020.0002.0B33] # ORIYA LETTER LLA
+0B35 ; [.1A05.0020.0002.0B35] # ORIYA LETTER VA
+0B71 ; [.1A06.0020.0002.0B71] # ORIYA LETTER WA
+0B36 ; [.1A07.0020.0002.0B36] # ORIYA LETTER SHA
+0B37 ; [.1A08.0020.0002.0B37] # ORIYA LETTER SSA
+0B38 ; [.1A09.0020.0002.0B38] # ORIYA LETTER SA
+0B39 ; [.1A0A.0020.0002.0B39] # ORIYA LETTER HA
+0B3D ; [.1A0B.0020.0002.0B3D] # ORIYA SIGN AVAGRAHA
+0B3E ; [.1A0C.0020.0002.0B3E] # ORIYA VOWEL SIGN AA
+0B3F ; [.1A0D.0020.0002.0B3F] # ORIYA VOWEL SIGN I
+0B40 ; [.1A0E.0020.0002.0B40] # ORIYA VOWEL SIGN II
+0B41 ; [.1A0F.0020.0002.0B41] # ORIYA VOWEL SIGN U
+0B42 ; [.1A10.0020.0002.0B42] # ORIYA VOWEL SIGN UU
+0B43 ; [.1A11.0020.0002.0B43] # ORIYA VOWEL SIGN VOCALIC R
+0B47 ; [.1A12.0020.0002.0B47] # ORIYA VOWEL SIGN E
+0B48 ; [.1A13.0020.0002.0B48] # ORIYA VOWEL SIGN AI
+0B47 0B56 ; [.1A13.0020.0002.0B48] # ORIYA VOWEL SIGN AI
+0B4B ; [.1A14.0020.0002.0B4B] # ORIYA VOWEL SIGN O
+0B47 0B3E ; [.1A14.0020.0002.0B4B] # ORIYA VOWEL SIGN O
+0B4C ; [.1A15.0020.0002.0B4C] # ORIYA VOWEL SIGN AU
+0B47 0B57 ; [.1A15.0020.0002.0B4C] # ORIYA VOWEL SIGN AU
+0B4D ; [.1A16.0020.0002.0B4D] # ORIYA SIGN VIRAMA
+0B56 ; [.1A17.0020.0002.0B56] # ORIYA AI LENGTH MARK
+0B57 ; [.1A18.0020.0002.0B57] # ORIYA AU LENGTH MARK
+0B83 ; [.1A19.0020.0002.0B83] # TAMIL SIGN VISARGA
+0B85 ; [.1A1A.0020.0002.0B85] # TAMIL LETTER A
+0B86 ; [.1A1B.0020.0002.0B86] # TAMIL LETTER AA
+0B87 ; [.1A1C.0020.0002.0B87] # TAMIL LETTER I
+0B88 ; [.1A1D.0020.0002.0B88] # TAMIL LETTER II
+0B89 ; [.1A1E.0020.0002.0B89] # TAMIL LETTER U
+0B8A ; [.1A1F.0020.0002.0B8A] # TAMIL LETTER UU
+0B8E ; [.1A20.0020.0002.0B8E] # TAMIL LETTER E
+0B8F ; [.1A21.0020.0002.0B8F] # TAMIL LETTER EE
+0B90 ; [.1A22.0020.0002.0B90] # TAMIL LETTER AI
+0B92 ; [.1A23.0020.0002.0B92] # TAMIL LETTER O
+0B93 ; [.1A24.0020.0002.0B93] # TAMIL LETTER OO
+0B94 ; [.1A25.0020.0002.0B94] # TAMIL LETTER AU
+0B92 0BD7 ; [.1A25.0020.0002.0B94] # TAMIL LETTER AU
+0B95 ; [.1A26.0020.0002.0B95] # TAMIL LETTER KA
+0B99 ; [.1A27.0020.0002.0B99] # TAMIL LETTER NGA
+0B9A ; [.1A28.0020.0002.0B9A] # TAMIL LETTER CA
+0B9C ; [.1A29.0020.0002.0B9C] # TAMIL LETTER JA
+0B9E ; [.1A2A.0020.0002.0B9E] # TAMIL LETTER NYA
+0B9F ; [.1A2B.0020.0002.0B9F] # TAMIL LETTER TTA
+0BA3 ; [.1A2C.0020.0002.0BA3] # TAMIL LETTER NNA
+0BA4 ; [.1A2D.0020.0002.0BA4] # TAMIL LETTER TA
+0BA8 ; [.1A2E.0020.0002.0BA8] # TAMIL LETTER NA
+0BA9 ; [.1A2F.0020.0002.0BA9] # TAMIL LETTER NNNA
+0BAA ; [.1A30.0020.0002.0BAA] # TAMIL LETTER PA
+0BAE ; [.1A31.0020.0002.0BAE] # TAMIL LETTER MA
+0BAF ; [.1A32.0020.0002.0BAF] # TAMIL LETTER YA
+0BB0 ; [.1A33.0020.0002.0BB0] # TAMIL LETTER RA
+0BB1 ; [.1A34.0020.0002.0BB1] # TAMIL LETTER RRA
+0BB2 ; [.1A35.0020.0002.0BB2] # TAMIL LETTER LA
+0BB3 ; [.1A36.0020.0002.0BB3] # TAMIL LETTER LLA
+0BB4 ; [.1A37.0020.0002.0BB4] # TAMIL LETTER LLLA
+0BB5 ; [.1A38.0020.0002.0BB5] # TAMIL LETTER VA
+0BB6 ; [.1A39.0020.0002.0BB6] # TAMIL LETTER SHA
+0BB7 ; [.1A3A.0020.0002.0BB7] # TAMIL LETTER SSA
+0BB8 ; [.1A3B.0020.0002.0BB8] # TAMIL LETTER SA
+0BB9 ; [.1A3C.0020.0002.0BB9] # TAMIL LETTER HA
+0BBE ; [.1A3D.0020.0002.0BBE] # TAMIL VOWEL SIGN AA
+0BBF ; [.1A3E.0020.0002.0BBF] # TAMIL VOWEL SIGN I
+0BC0 ; [.1A3F.0020.0002.0BC0] # TAMIL VOWEL SIGN II
+0BC1 ; [.1A40.0020.0002.0BC1] # TAMIL VOWEL SIGN U
+0BC2 ; [.1A41.0020.0002.0BC2] # TAMIL VOWEL SIGN UU
+0BC6 ; [.1A42.0020.0002.0BC6] # TAMIL VOWEL SIGN E
+0BC7 ; [.1A43.0020.0002.0BC7] # TAMIL VOWEL SIGN EE
+0BC8 ; [.1A44.0020.0002.0BC8] # TAMIL VOWEL SIGN AI
+0BCA ; [.1A45.0020.0002.0BCA] # TAMIL VOWEL SIGN O
+0BC6 0BBE ; [.1A45.0020.0002.0BCA] # TAMIL VOWEL SIGN O
+0BCB ; [.1A46.0020.0002.0BCB] # TAMIL VOWEL SIGN OO
+0BC7 0BBE ; [.1A46.0020.0002.0BCB] # TAMIL VOWEL SIGN OO
+0BCC ; [.1A47.0020.0002.0BCC] # TAMIL VOWEL SIGN AU
+0BC6 0BD7 ; [.1A47.0020.0002.0BCC] # TAMIL VOWEL SIGN AU
+0BCD ; [.1A48.0020.0002.0BCD] # TAMIL SIGN VIRAMA
+0BD7 ; [.1A49.0020.0002.0BD7] # TAMIL AU LENGTH MARK
+0C05 ; [.1A4A.0020.0002.0C05] # TELUGU LETTER A
+0C06 ; [.1A4B.0020.0002.0C06] # TELUGU LETTER AA
+0C07 ; [.1A4C.0020.0002.0C07] # TELUGU LETTER I
+0C08 ; [.1A4D.0020.0002.0C08] # TELUGU LETTER II
+0C09 ; [.1A4E.0020.0002.0C09] # TELUGU LETTER U
+0C0A ; [.1A4F.0020.0002.0C0A] # TELUGU LETTER UU
+0C0B ; [.1A50.0020.0002.0C0B] # TELUGU LETTER VOCALIC R
+0C60 ; [.1A51.0020.0002.0C60] # TELUGU LETTER VOCALIC RR
+0C0C ; [.1A52.0020.0002.0C0C] # TELUGU LETTER VOCALIC L
+0C61 ; [.1A53.0020.0002.0C61] # TELUGU LETTER VOCALIC LL
+0C0E ; [.1A54.0020.0002.0C0E] # TELUGU LETTER E
+0C0F ; [.1A55.0020.0002.0C0F] # TELUGU LETTER EE
+0C10 ; [.1A56.0020.0002.0C10] # TELUGU LETTER AI
+0C12 ; [.1A57.0020.0002.0C12] # TELUGU LETTER O
+0C13 ; [.1A58.0020.0002.0C13] # TELUGU LETTER OO
+0C14 ; [.1A59.0020.0002.0C14] # TELUGU LETTER AU
+0C15 ; [.1A5A.0020.0002.0C15] # TELUGU LETTER KA
+0C16 ; [.1A5B.0020.0002.0C16] # TELUGU LETTER KHA
+0C17 ; [.1A5C.0020.0002.0C17] # TELUGU LETTER GA
+0C18 ; [.1A5D.0020.0002.0C18] # TELUGU LETTER GHA
+0C19 ; [.1A5E.0020.0002.0C19] # TELUGU LETTER NGA
+0C1A ; [.1A5F.0020.0002.0C1A] # TELUGU LETTER CA
+0C1B ; [.1A60.0020.0002.0C1B] # TELUGU LETTER CHA
+0C1C ; [.1A61.0020.0002.0C1C] # TELUGU LETTER JA
+0C1D ; [.1A62.0020.0002.0C1D] # TELUGU LETTER JHA
+0C1E ; [.1A63.0020.0002.0C1E] # TELUGU LETTER NYA
+0C1F ; [.1A64.0020.0002.0C1F] # TELUGU LETTER TTA
+0C20 ; [.1A65.0020.0002.0C20] # TELUGU LETTER TTHA
+0C21 ; [.1A66.0020.0002.0C21] # TELUGU LETTER DDA
+0C22 ; [.1A67.0020.0002.0C22] # TELUGU LETTER DDHA
+0C23 ; [.1A68.0020.0002.0C23] # TELUGU LETTER NNA
+0C24 ; [.1A69.0020.0002.0C24] # TELUGU LETTER TA
+0C25 ; [.1A6A.0020.0002.0C25] # TELUGU LETTER THA
+0C26 ; [.1A6B.0020.0002.0C26] # TELUGU LETTER DA
+0C27 ; [.1A6C.0020.0002.0C27] # TELUGU LETTER DHA
+0C28 ; [.1A6D.0020.0002.0C28] # TELUGU LETTER NA
+0C2A ; [.1A6E.0020.0002.0C2A] # TELUGU LETTER PA
+0C2B ; [.1A6F.0020.0002.0C2B] # TELUGU LETTER PHA
+0C2C ; [.1A70.0020.0002.0C2C] # TELUGU LETTER BA
+0C2D ; [.1A71.0020.0002.0C2D] # TELUGU LETTER BHA
+0C2E ; [.1A72.0020.0002.0C2E] # TELUGU LETTER MA
+0C2F ; [.1A73.0020.0002.0C2F] # TELUGU LETTER YA
+0C30 ; [.1A74.0020.0002.0C30] # TELUGU LETTER RA
+0C31 ; [.1A75.0020.0002.0C31] # TELUGU LETTER RRA
+0C32 ; [.1A76.0020.0002.0C32] # TELUGU LETTER LA
+0C33 ; [.1A77.0020.0002.0C33] # TELUGU LETTER LLA
+0C35 ; [.1A78.0020.0002.0C35] # TELUGU LETTER VA
+0C36 ; [.1A79.0020.0002.0C36] # TELUGU LETTER SHA
+0C37 ; [.1A7A.0020.0002.0C37] # TELUGU LETTER SSA
+0C38 ; [.1A7B.0020.0002.0C38] # TELUGU LETTER SA
+0C39 ; [.1A7C.0020.0002.0C39] # TELUGU LETTER HA
+0C3E ; [.1A7D.0020.0002.0C3E] # TELUGU VOWEL SIGN AA
+0C3F ; [.1A7E.0020.0002.0C3F] # TELUGU VOWEL SIGN I
+0C40 ; [.1A7F.0020.0002.0C40] # TELUGU VOWEL SIGN II
+0C41 ; [.1A80.0020.0002.0C41] # TELUGU VOWEL SIGN U
+0C42 ; [.1A81.0020.0002.0C42] # TELUGU VOWEL SIGN UU
+0C43 ; [.1A82.0020.0002.0C43] # TELUGU VOWEL SIGN VOCALIC R
+0C44 ; [.1A83.0020.0002.0C44] # TELUGU VOWEL SIGN VOCALIC RR
+0C46 ; [.1A84.0020.0002.0C46] # TELUGU VOWEL SIGN E
+0C47 ; [.1A85.0020.0002.0C47] # TELUGU VOWEL SIGN EE
+0C48 ; [.1A86.0020.0002.0C48] # TELUGU VOWEL SIGN AI
+0C46 0C56 ; [.1A86.0020.0002.0C48] # TELUGU VOWEL SIGN AI
+0C4A ; [.1A87.0020.0002.0C4A] # TELUGU VOWEL SIGN O
+0C4B ; [.1A88.0020.0002.0C4B] # TELUGU VOWEL SIGN OO
+0C4C ; [.1A89.0020.0002.0C4C] # TELUGU VOWEL SIGN AU
+0C4D ; [.1A8A.0020.0002.0C4D] # TELUGU SIGN VIRAMA
+0C55 ; [.1A8B.0020.0002.0C55] # TELUGU LENGTH MARK
+0C56 ; [.1A8C.0020.0002.0C56] # TELUGU AI LENGTH MARK
+0C85 ; [.1A8D.0020.0002.0C85] # KANNADA LETTER A
+0C86 ; [.1A8E.0020.0002.0C86] # KANNADA LETTER AA
+0C87 ; [.1A8F.0020.0002.0C87] # KANNADA LETTER I
+0C88 ; [.1A90.0020.0002.0C88] # KANNADA LETTER II
+0C89 ; [.1A91.0020.0002.0C89] # KANNADA LETTER U
+0C8A ; [.1A92.0020.0002.0C8A] # KANNADA LETTER UU
+0C8B ; [.1A93.0020.0002.0C8B] # KANNADA LETTER VOCALIC R
+0CE0 ; [.1A94.0020.0002.0CE0] # KANNADA LETTER VOCALIC RR
+0C8C ; [.1A95.0020.0002.0C8C] # KANNADA LETTER VOCALIC L
+0CE1 ; [.1A96.0020.0002.0CE1] # KANNADA LETTER VOCALIC LL
+0C8E ; [.1A97.0020.0002.0C8E] # KANNADA LETTER E
+0C8F ; [.1A98.0020.0002.0C8F] # KANNADA LETTER EE
+0C90 ; [.1A99.0020.0002.0C90] # KANNADA LETTER AI
+0C92 ; [.1A9A.0020.0002.0C92] # KANNADA LETTER O
+0C93 ; [.1A9B.0020.0002.0C93] # KANNADA LETTER OO
+0C94 ; [.1A9C.0020.0002.0C94] # KANNADA LETTER AU
+0C95 ; [.1A9D.0020.0002.0C95] # KANNADA LETTER KA
+0C96 ; [.1A9E.0020.0002.0C96] # KANNADA LETTER KHA
+0C97 ; [.1A9F.0020.0002.0C97] # KANNADA LETTER GA
+0C98 ; [.1AA0.0020.0002.0C98] # KANNADA LETTER GHA
+0C99 ; [.1AA1.0020.0002.0C99] # KANNADA LETTER NGA
+0C9A ; [.1AA2.0020.0002.0C9A] # KANNADA LETTER CA
+0C9B ; [.1AA3.0020.0002.0C9B] # KANNADA LETTER CHA
+0C9C ; [.1AA4.0020.0002.0C9C] # KANNADA LETTER JA
+0C9D ; [.1AA5.0020.0002.0C9D] # KANNADA LETTER JHA
+0C9E ; [.1AA6.0020.0002.0C9E] # KANNADA LETTER NYA
+0C9F ; [.1AA7.0020.0002.0C9F] # KANNADA LETTER TTA
+0CA0 ; [.1AA8.0020.0002.0CA0] # KANNADA LETTER TTHA
+0CA1 ; [.1AA9.0020.0002.0CA1] # KANNADA LETTER DDA
+0CA2 ; [.1AAA.0020.0002.0CA2] # KANNADA LETTER DDHA
+0CA3 ; [.1AAB.0020.0002.0CA3] # KANNADA LETTER NNA
+0CA4 ; [.1AAC.0020.0002.0CA4] # KANNADA LETTER TA
+0CA5 ; [.1AAD.0020.0002.0CA5] # KANNADA LETTER THA
+0CA6 ; [.1AAE.0020.0002.0CA6] # KANNADA LETTER DA
+0CA7 ; [.1AAF.0020.0002.0CA7] # KANNADA LETTER DHA
+0CA8 ; [.1AB0.0020.0002.0CA8] # KANNADA LETTER NA
+0CAA ; [.1AB1.0020.0002.0CAA] # KANNADA LETTER PA
+0CAB ; [.1AB2.0020.0002.0CAB] # KANNADA LETTER PHA
+0CAC ; [.1AB3.0020.0002.0CAC] # KANNADA LETTER BA
+0CAD ; [.1AB4.0020.0002.0CAD] # KANNADA LETTER BHA
+0CAE ; [.1AB5.0020.0002.0CAE] # KANNADA LETTER MA
+0CAF ; [.1AB6.0020.0002.0CAF] # KANNADA LETTER YA
+0CB0 ; [.1AB7.0020.0002.0CB0] # KANNADA LETTER RA
+0CB1 ; [.1AB8.0020.0002.0CB1] # KANNADA LETTER RRA
+0CB2 ; [.1AB9.0020.0002.0CB2] # KANNADA LETTER LA
+0CB5 ; [.1ABA.0020.0002.0CB5] # KANNADA LETTER VA
+0CB6 ; [.1ABB.0020.0002.0CB6] # KANNADA LETTER SHA
+0CB7 ; [.1ABC.0020.0002.0CB7] # KANNADA LETTER SSA
+0CB8 ; [.1ABD.0020.0002.0CB8] # KANNADA LETTER SA
+0CB9 ; [.1ABE.0020.0002.0CB9] # KANNADA LETTER HA
+0CB3 ; [.1ABF.0020.0002.0CB3] # KANNADA LETTER LLA
+0CDE ; [.1AC0.0020.0002.0CDE] # KANNADA LETTER FA
+0CBD ; [.1AC1.0020.0002.0CBD] # KANNADA SIGN AVAGRAHA
+0CBE ; [.1AC2.0020.0002.0CBE] # KANNADA VOWEL SIGN AA
+0CBF ; [.1AC3.0020.0002.0CBF] # KANNADA VOWEL SIGN I
+0CC0 ; [.1AC4.0020.0002.0CC0] # KANNADA VOWEL SIGN II
+0CBF 0CD5 ; [.1AC4.0020.0002.0CC0] # KANNADA VOWEL SIGN II
+0CC1 ; [.1AC5.0020.0002.0CC1] # KANNADA VOWEL SIGN U
+0CC2 ; [.1AC6.0020.0002.0CC2] # KANNADA VOWEL SIGN UU
+0CC3 ; [.1AC7.0020.0002.0CC3] # KANNADA VOWEL SIGN VOCALIC R
+0CC4 ; [.1AC8.0020.0002.0CC4] # KANNADA VOWEL SIGN VOCALIC RR
+0CE2 ; [.1AC9.0020.0002.0CE2] # KANNADA VOWEL SIGN VOCALIC L
+0CE3 ; [.1ACA.0020.0002.0CE3] # KANNADA VOWEL SIGN VOCALIC LL
+0CC6 ; [.1ACB.0020.0002.0CC6] # KANNADA VOWEL SIGN E
+0CC7 ; [.1ACC.0020.0002.0CC7] # KANNADA VOWEL SIGN EE
+0CC6 0CD5 ; [.1ACC.0020.0002.0CC7] # KANNADA VOWEL SIGN EE
+0CC8 ; [.1ACD.0020.0002.0CC8] # KANNADA VOWEL SIGN AI
+0CC6 0CD6 ; [.1ACD.0020.0002.0CC8] # KANNADA VOWEL SIGN AI
+0CCA ; [.1ACE.0020.0002.0CCA] # KANNADA VOWEL SIGN O
+0CC6 0CC2 ; [.1ACE.0020.0002.0CCA] # KANNADA VOWEL SIGN O
+0CCB ; [.1ACF.0020.0002.0CCB] # KANNADA VOWEL SIGN OO
+0CC6 0CC2 0CD5 ; [.1ACF.0020.0002.0CCB] # KANNADA VOWEL SIGN OO
+0CCA 0CD5 ; [.1ACF.0020.0002.0CCB] # KANNADA VOWEL SIGN OO
+0CCC ; [.1AD0.0020.0002.0CCC] # KANNADA VOWEL SIGN AU
+0CCD ; [.1AD1.0020.0002.0CCD] # KANNADA SIGN VIRAMA
+0CD5 ; [.1AD2.0020.0002.0CD5] # KANNADA LENGTH MARK
+0CD6 ; [.1AD3.0020.0002.0CD6] # KANNADA AI LENGTH MARK
+0D05 ; [.1AD4.0020.0002.0D05] # MALAYALAM LETTER A
+0D06 ; [.1AD5.0020.0002.0D06] # MALAYALAM LETTER AA
+0D07 ; [.1AD6.0020.0002.0D07] # MALAYALAM LETTER I
+0D08 ; [.1AD7.0020.0002.0D08] # MALAYALAM LETTER II
+0D09 ; [.1AD8.0020.0002.0D09] # MALAYALAM LETTER U
+0D0A ; [.1AD9.0020.0002.0D0A] # MALAYALAM LETTER UU
+0D0B ; [.1ADA.0020.0002.0D0B] # MALAYALAM LETTER VOCALIC R
+0D60 ; [.1ADB.0020.0002.0D60] # MALAYALAM LETTER VOCALIC RR
+0D0C ; [.1ADC.0020.0002.0D0C] # MALAYALAM LETTER VOCALIC L
+0D61 ; [.1ADD.0020.0002.0D61] # MALAYALAM LETTER VOCALIC LL
+0D0E ; [.1ADE.0020.0002.0D0E] # MALAYALAM LETTER E
+0D0F ; [.1ADF.0020.0002.0D0F] # MALAYALAM LETTER EE
+0D10 ; [.1AE0.0020.0002.0D10] # MALAYALAM LETTER AI
+0D12 ; [.1AE1.0020.0002.0D12] # MALAYALAM LETTER O
+0D13 ; [.1AE2.0020.0002.0D13] # MALAYALAM LETTER OO
+0D14 ; [.1AE3.0020.0002.0D14] # MALAYALAM LETTER AU
+0D15 ; [.1AE4.0020.0002.0D15] # MALAYALAM LETTER KA
+0D16 ; [.1AE5.0020.0002.0D16] # MALAYALAM LETTER KHA
+0D17 ; [.1AE6.0020.0002.0D17] # MALAYALAM LETTER GA
+0D18 ; [.1AE7.0020.0002.0D18] # MALAYALAM LETTER GHA
+0D19 ; [.1AE8.0020.0002.0D19] # MALAYALAM LETTER NGA
+0D1A ; [.1AE9.0020.0002.0D1A] # MALAYALAM LETTER CA
+0D1B ; [.1AEA.0020.0002.0D1B] # MALAYALAM LETTER CHA
+0D1C ; [.1AEB.0020.0002.0D1C] # MALAYALAM LETTER JA
+0D1D ; [.1AEC.0020.0002.0D1D] # MALAYALAM LETTER JHA
+0D1E ; [.1AED.0020.0002.0D1E] # MALAYALAM LETTER NYA
+0D1F ; [.1AEE.0020.0002.0D1F] # MALAYALAM LETTER TTA
+0D20 ; [.1AEF.0020.0002.0D20] # MALAYALAM LETTER TTHA
+0D21 ; [.1AF0.0020.0002.0D21] # MALAYALAM LETTER DDA
+0D22 ; [.1AF1.0020.0002.0D22] # MALAYALAM LETTER DDHA
+0D23 ; [.1AF2.0020.0002.0D23] # MALAYALAM LETTER NNA
+0D24 ; [.1AF3.0020.0002.0D24] # MALAYALAM LETTER TA
+0D25 ; [.1AF4.0020.0002.0D25] # MALAYALAM LETTER THA
+0D26 ; [.1AF5.0020.0002.0D26] # MALAYALAM LETTER DA
+0D27 ; [.1AF6.0020.0002.0D27] # MALAYALAM LETTER DHA
+0D28 ; [.1AF7.0020.0002.0D28] # MALAYALAM LETTER NA
+0D2A ; [.1AF8.0020.0002.0D2A] # MALAYALAM LETTER PA
+0D2B ; [.1AF9.0020.0002.0D2B] # MALAYALAM LETTER PHA
+0D2C ; [.1AFA.0020.0002.0D2C] # MALAYALAM LETTER BA
+0D2D ; [.1AFB.0020.0002.0D2D] # MALAYALAM LETTER BHA
+0D2E ; [.1AFC.0020.0002.0D2E] # MALAYALAM LETTER MA
+0D2F ; [.1AFD.0020.0002.0D2F] # MALAYALAM LETTER YA
+0D30 ; [.1AFE.0020.0002.0D30] # MALAYALAM LETTER RA
+0D31 ; [.1AFF.0020.0002.0D31] # MALAYALAM LETTER RRA
+0D32 ; [.1B00.0020.0002.0D32] # MALAYALAM LETTER LA
+0D33 ; [.1B01.0020.0002.0D33] # MALAYALAM LETTER LLA
+0D34 ; [.1B02.0020.0002.0D34] # MALAYALAM LETTER LLLA
+0D35 ; [.1B03.0020.0002.0D35] # MALAYALAM LETTER VA
+0D36 ; [.1B04.0020.0002.0D36] # MALAYALAM LETTER SHA
+0D37 ; [.1B05.0020.0002.0D37] # MALAYALAM LETTER SSA
+0D38 ; [.1B06.0020.0002.0D38] # MALAYALAM LETTER SA
+0D39 ; [.1B07.0020.0002.0D39] # MALAYALAM LETTER HA
+0D3E ; [.1B08.0020.0002.0D3E] # MALAYALAM VOWEL SIGN AA
+0D3F ; [.1B09.0020.0002.0D3F] # MALAYALAM VOWEL SIGN I
+0D40 ; [.1B0A.0020.0002.0D40] # MALAYALAM VOWEL SIGN II
+0D41 ; [.1B0B.0020.0002.0D41] # MALAYALAM VOWEL SIGN U
+0D42 ; [.1B0C.0020.0002.0D42] # MALAYALAM VOWEL SIGN UU
+0D43 ; [.1B0D.0020.0002.0D43] # MALAYALAM VOWEL SIGN VOCALIC R
+0D46 ; [.1B0E.0020.0002.0D46] # MALAYALAM VOWEL SIGN E
+0D47 ; [.1B0F.0020.0002.0D47] # MALAYALAM VOWEL SIGN EE
+0D48 ; [.1B10.0020.0002.0D48] # MALAYALAM VOWEL SIGN AI
+0D4A ; [.1B11.0020.0002.0D4A] # MALAYALAM VOWEL SIGN O
+0D46 0D3E ; [.1B11.0020.0002.0D4A] # MALAYALAM VOWEL SIGN O
+0D4B ; [.1B12.0020.0002.0D4B] # MALAYALAM VOWEL SIGN OO
+0D47 0D3E ; [.1B12.0020.0002.0D4B] # MALAYALAM VOWEL SIGN OO
+0D4C ; [.1B13.0020.0002.0D4C] # MALAYALAM VOWEL SIGN AU
+0D46 0D57 ; [.1B13.0020.0002.0D4C] # MALAYALAM VOWEL SIGN AU
+0D57 ; [.1B14.0020.0002.0D57] # MALAYALAM AU LENGTH MARK
+0D4D ; [.1B15.0020.0002.0D4D] # MALAYALAM SIGN VIRAMA
+0D85 ; [.1B16.0020.0002.0D85] # SINHALA LETTER AYANNA
+0D86 ; [.1B17.0020.0002.0D86] # SINHALA LETTER AAYANNA
+0D87 ; [.1B18.0020.0002.0D87] # SINHALA LETTER AEYANNA
+0D88 ; [.1B19.0020.0002.0D88] # SINHALA LETTER AEEYANNA
+0D89 ; [.1B1A.0020.0002.0D89] # SINHALA LETTER IYANNA
+0D8A ; [.1B1B.0020.0002.0D8A] # SINHALA LETTER IIYANNA
+0D8B ; [.1B1C.0020.0002.0D8B] # SINHALA LETTER UYANNA
+0D8C ; [.1B1D.0020.0002.0D8C] # SINHALA LETTER UUYANNA
+0D8D ; [.1B1E.0020.0002.0D8D] # SINHALA LETTER IRUYANNA
+0D8E ; [.1B1F.0020.0002.0D8E] # SINHALA LETTER IRUUYANNA
+0D8F ; [.1B20.0020.0002.0D8F] # SINHALA LETTER ILUYANNA
+0D90 ; [.1B21.0020.0002.0D90] # SINHALA LETTER ILUUYANNA
+0D91 ; [.1B22.0020.0002.0D91] # SINHALA LETTER EYANNA
+0D92 ; [.1B23.0020.0002.0D92] # SINHALA LETTER EEYANNA
+0D93 ; [.1B24.0020.0002.0D93] # SINHALA LETTER AIYANNA
+0D94 ; [.1B25.0020.0002.0D94] # SINHALA LETTER OYANNA
+0D95 ; [.1B26.0020.0002.0D95] # SINHALA LETTER OOYANNA
+0D96 ; [.1B27.0020.0002.0D96] # SINHALA LETTER AUYANNA
+0D9A ; [.1B28.0020.0002.0D9A] # SINHALA LETTER ALPAPRAANA KAYANNA
+0D9B ; [.1B29.0020.0002.0D9B] # SINHALA LETTER MAHAAPRAANA KAYANNA
+0D9C ; [.1B2A.0020.0002.0D9C] # SINHALA LETTER ALPAPRAANA GAYANNA
+0D9D ; [.1B2B.0020.0002.0D9D] # SINHALA LETTER MAHAAPRAANA GAYANNA
+0D9E ; [.1B2C.0020.0002.0D9E] # SINHALA LETTER KANTAJA NAASIKYAYA
+0D9F ; [.1B2D.0020.0002.0D9F] # SINHALA LETTER SANYAKA GAYANNA
+0DA0 ; [.1B2E.0020.0002.0DA0] # SINHALA LETTER ALPAPRAANA CAYANNA
+0DA1 ; [.1B2F.0020.0002.0DA1] # SINHALA LETTER MAHAAPRAANA CAYANNA
+0DA2 ; [.1B30.0020.0002.0DA2] # SINHALA LETTER ALPAPRAANA JAYANNA
+0DA3 ; [.1B31.0020.0002.0DA3] # SINHALA LETTER MAHAAPRAANA JAYANNA
+0DA4 ; [.1B32.0020.0002.0DA4] # SINHALA LETTER TAALUJA NAASIKYAYA
+0DA5 ; [.1B33.0020.0002.0DA5] # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6 ; [.1B34.0020.0002.0DA6] # SINHALA LETTER SANYAKA JAYANNA
+0DA7 ; [.1B35.0020.0002.0DA7] # SINHALA LETTER ALPAPRAANA TTAYANNA
+0DA8 ; [.1B36.0020.0002.0DA8] # SINHALA LETTER MAHAAPRAANA TTAYANNA
+0DA9 ; [.1B37.0020.0002.0DA9] # SINHALA LETTER ALPAPRAANA DDAYANNA
+0DAA ; [.1B38.0020.0002.0DAA] # SINHALA LETTER MAHAAPRAANA DDAYANNA
+0DAB ; [.1B39.0020.0002.0DAB] # SINHALA LETTER MUURDHAJA NAYANNA
+0DAC ; [.1B3A.0020.0002.0DAC] # SINHALA LETTER SANYAKA DDAYANNA
+0DAD ; [.1B3B.0020.0002.0DAD] # SINHALA LETTER ALPAPRAANA TAYANNA
+0DAE ; [.1B3C.0020.0002.0DAE] # SINHALA LETTER MAHAAPRAANA TAYANNA
+0DAF ; [.1B3D.0020.0002.0DAF] # SINHALA LETTER ALPAPRAANA DAYANNA
+0DB0 ; [.1B3E.0020.0002.0DB0] # SINHALA LETTER MAHAAPRAANA DAYANNA
+0DB1 ; [.1B3F.0020.0002.0DB1] # SINHALA LETTER DANTAJA NAYANNA
+0DB3 ; [.1B40.0020.0002.0DB3] # SINHALA LETTER SANYAKA DAYANNA
+0DB4 ; [.1B41.0020.0002.0DB4] # SINHALA LETTER ALPAPRAANA PAYANNA
+0DB5 ; [.1B42.0020.0002.0DB5] # SINHALA LETTER MAHAAPRAANA PAYANNA
+0DB6 ; [.1B43.0020.0002.0DB6] # SINHALA LETTER ALPAPRAANA BAYANNA
+0DB7 ; [.1B44.0020.0002.0DB7] # SINHALA LETTER MAHAAPRAANA BAYANNA
+0DB8 ; [.1B45.0020.0002.0DB8] # SINHALA LETTER MAYANNA
+0DB9 ; [.1B46.0020.0002.0DB9] # SINHALA LETTER AMBA BAYANNA
+0DBA ; [.1B47.0020.0002.0DBA] # SINHALA LETTER YAYANNA
+0DBB ; [.1B48.0020.0002.0DBB] # SINHALA LETTER RAYANNA
+0DBD ; [.1B49.0020.0002.0DBD] # SINHALA LETTER DANTAJA LAYANNA
+0DC0 ; [.1B4A.0020.0002.0DC0] # SINHALA LETTER VAYANNA
+0DC1 ; [.1B4B.0020.0002.0DC1] # SINHALA LETTER TAALUJA SAYANNA
+0DC2 ; [.1B4C.0020.0002.0DC2] # SINHALA LETTER MUURDHAJA SAYANNA
+0DC3 ; [.1B4D.0020.0002.0DC3] # SINHALA LETTER DANTAJA SAYANNA
+0DC4 ; [.1B4E.0020.0002.0DC4] # SINHALA LETTER HAYANNA
+0DC5 ; [.1B4F.0020.0002.0DC5] # SINHALA LETTER MUURDHAJA LAYANNA
+0DC6 ; [.1B50.0020.0002.0DC6] # SINHALA LETTER FAYANNA
+0DCA ; [.1B51.0020.0002.0DCA] # SINHALA SIGN AL-LAKUNA
+0DCF ; [.1B52.0020.0002.0DCF] # SINHALA VOWEL SIGN AELA-PILLA
+0DD0 ; [.1B53.0020.0002.0DD0] # SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0DD1 ; [.1B54.0020.0002.0DD1] # SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2 ; [.1B55.0020.0002.0DD2] # SINHALA VOWEL SIGN KETTI IS-PILLA
+0DD3 ; [.1B56.0020.0002.0DD3] # SINHALA VOWEL SIGN DIGA IS-PILLA
+0DD4 ; [.1B57.0020.0002.0DD4] # SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; [.1B58.0020.0002.0DD6] # SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8 ; [.1B59.0020.0002.0DD8] # SINHALA VOWEL SIGN GAETTA-PILLA
+0DD9 ; [.1B5A.0020.0002.0DD9] # SINHALA VOWEL SIGN KOMBUVA
+0DDA ; [.1B5B.0020.0002.0DDA] # SINHALA VOWEL SIGN DIGA KOMBUVA
+0DD9 0DCA ; [.1B5B.0020.0002.0DDA] # SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDB ; [.1B5C.0020.0002.0DDB] # SINHALA VOWEL SIGN KOMBU DEKA
+0DDC ; [.1B5D.0020.0002.0DDC] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DD9 0DCF ; [.1B5D.0020.0002.0DDC] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DDD ; [.1B5E.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DD9 0DCF 0DCA ; [.1B5E.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDC 0DCA ; [.1B5E.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDE ; [.1B5F.0020.0002.0DDE] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DD9 0DDF ; [.1B5F.0020.0002.0DDE] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DDF ; [.1B60.0020.0002.0DDF] # SINHALA VOWEL SIGN GAYANUKITTA
+0DF2 ; [.1B61.0020.0002.0DF2] # SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0DF3 ; [.1B62.0020.0002.0DF3] # SINHALA VOWEL SIGN DIGA GAYANUKITTA
+A800 ; [.1B63.0020.0002.A800] # SYLOTI NAGRI LETTER A
+A801 ; [.1B64.0020.0002.A801] # SYLOTI NAGRI LETTER I
+A802 ; [.1B65.0020.0002.A802] # SYLOTI NAGRI SIGN DVISVARA
+A803 ; [.1B66.0020.0002.A803] # SYLOTI NAGRI LETTER U
+A804 ; [.1B67.0020.0002.A804] # SYLOTI NAGRI LETTER E
+A805 ; [.1B68.0020.0002.A805] # SYLOTI NAGRI LETTER O
+A806 ; [.1B69.0020.0002.A806] # SYLOTI NAGRI SIGN HASANTA
+A807 ; [.1B6A.0020.0002.A807] # SYLOTI NAGRI LETTER KO
+A808 ; [.1B6B.0020.0002.A808] # SYLOTI NAGRI LETTER KHO
+A809 ; [.1B6C.0020.0002.A809] # SYLOTI NAGRI LETTER GO
+A80A ; [.1B6D.0020.0002.A80A] # SYLOTI NAGRI LETTER GHO
+A80C ; [.1B6E.0020.0002.A80C] # SYLOTI NAGRI LETTER CO
+A80D ; [.1B6F.0020.0002.A80D] # SYLOTI NAGRI LETTER CHO
+A80E ; [.1B70.0020.0002.A80E] # SYLOTI NAGRI LETTER JO
+A80F ; [.1B71.0020.0002.A80F] # SYLOTI NAGRI LETTER JHO
+A810 ; [.1B72.0020.0002.A810] # SYLOTI NAGRI LETTER TTO
+A811 ; [.1B73.0020.0002.A811] # SYLOTI NAGRI LETTER TTHO
+A812 ; [.1B74.0020.0002.A812] # SYLOTI NAGRI LETTER DDO
+A813 ; [.1B75.0020.0002.A813] # SYLOTI NAGRI LETTER DDHO
+A814 ; [.1B76.0020.0002.A814] # SYLOTI NAGRI LETTER TO
+A815 ; [.1B77.0020.0002.A815] # SYLOTI NAGRI LETTER THO
+A816 ; [.1B78.0020.0002.A816] # SYLOTI NAGRI LETTER DO
+A817 ; [.1B79.0020.0002.A817] # SYLOTI NAGRI LETTER DHO
+A818 ; [.1B7A.0020.0002.A818] # SYLOTI NAGRI LETTER NO
+A819 ; [.1B7B.0020.0002.A819] # SYLOTI NAGRI LETTER PO
+A81A ; [.1B7C.0020.0002.A81A] # SYLOTI NAGRI LETTER PHO
+A81B ; [.1B7D.0020.0002.A81B] # SYLOTI NAGRI LETTER BO
+A81C ; [.1B7E.0020.0002.A81C] # SYLOTI NAGRI LETTER BHO
+A81D ; [.1B7F.0020.0002.A81D] # SYLOTI NAGRI LETTER MO
+A81E ; [.1B80.0020.0002.A81E] # SYLOTI NAGRI LETTER RO
+A81F ; [.1B81.0020.0002.A81F] # SYLOTI NAGRI LETTER LO
+A820 ; [.1B82.0020.0002.A820] # SYLOTI NAGRI LETTER RRO
+A821 ; [.1B83.0020.0002.A821] # SYLOTI NAGRI LETTER SO
+A822 ; [.1B84.0020.0002.A822] # SYLOTI NAGRI LETTER HO
+A823 ; [.1B85.0020.0002.A823] # SYLOTI NAGRI VOWEL SIGN A
+A824 ; [.1B86.0020.0002.A824] # SYLOTI NAGRI VOWEL SIGN I
+A825 ; [.1B87.0020.0002.A825] # SYLOTI NAGRI VOWEL SIGN U
+A826 ; [.1B88.0020.0002.A826] # SYLOTI NAGRI VOWEL SIGN E
+A827 ; [.1B89.0020.0002.A827] # SYLOTI NAGRI VOWEL SIGN OO
+10A00 ; [.1B8A.0020.0002.10A00] # KHAROSHTHI LETTER A
+10A01 ; [.1B8B.0020.0002.10A01] # KHAROSHTHI VOWEL SIGN I
+10A02 ; [.1B8C.0020.0002.10A02] # KHAROSHTHI VOWEL SIGN U
+10A03 ; [.1B8D.0020.0002.10A03] # KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05 ; [.1B8E.0020.0002.10A05] # KHAROSHTHI VOWEL SIGN E
+10A06 ; [.1B8F.0020.0002.10A06] # KHAROSHTHI VOWEL SIGN O
+10A0C ; [.1B90.0020.0002.10A0C] # KHAROSHTHI VOWEL LENGTH MARK
+10A10 ; [.1B91.0020.0002.10A10] # KHAROSHTHI LETTER KA
+10A11 ; [.1B92.0020.0002.10A11] # KHAROSHTHI LETTER KHA
+10A12 ; [.1B93.0020.0002.10A12] # KHAROSHTHI LETTER GA
+10A13 ; [.1B94.0020.0002.10A13] # KHAROSHTHI LETTER GHA
+10A15 ; [.1B95.0020.0002.10A15] # KHAROSHTHI LETTER CA
+10A16 ; [.1B96.0020.0002.10A16] # KHAROSHTHI LETTER CHA
+10A17 ; [.1B97.0020.0002.10A17] # KHAROSHTHI LETTER JA
+10A19 ; [.1B98.0020.0002.10A19] # KHAROSHTHI LETTER NYA
+10A1A ; [.1B99.0020.0002.10A1A] # KHAROSHTHI LETTER TTA
+10A1B ; [.1B9A.0020.0002.10A1B] # KHAROSHTHI LETTER TTHA
+10A1C ; [.1B9B.0020.0002.10A1C] # KHAROSHTHI LETTER DDA
+10A1D ; [.1B9C.0020.0002.10A1D] # KHAROSHTHI LETTER DDHA
+10A1E ; [.1B9D.0020.0002.10A1E] # KHAROSHTHI LETTER NNA
+10A1F ; [.1B9E.0020.0002.10A1F] # KHAROSHTHI LETTER TA
+10A20 ; [.1B9F.0020.0002.10A20] # KHAROSHTHI LETTER THA
+10A21 ; [.1BA0.0020.0002.10A21] # KHAROSHTHI LETTER DA
+10A22 ; [.1BA1.0020.0002.10A22] # KHAROSHTHI LETTER DHA
+10A23 ; [.1BA2.0020.0002.10A23] # KHAROSHTHI LETTER NA
+10A24 ; [.1BA3.0020.0002.10A24] # KHAROSHTHI LETTER PA
+10A25 ; [.1BA4.0020.0002.10A25] # KHAROSHTHI LETTER PHA
+10A26 ; [.1BA5.0020.0002.10A26] # KHAROSHTHI LETTER BA
+10A27 ; [.1BA6.0020.0002.10A27] # KHAROSHTHI LETTER BHA
+10A28 ; [.1BA7.0020.0002.10A28] # KHAROSHTHI LETTER MA
+10A29 ; [.1BA8.0020.0002.10A29] # KHAROSHTHI LETTER YA
+10A2A ; [.1BA9.0020.0002.10A2A] # KHAROSHTHI LETTER RA
+10A2B ; [.1BAA.0020.0002.10A2B] # KHAROSHTHI LETTER LA
+10A2C ; [.1BAB.0020.0002.10A2C] # KHAROSHTHI LETTER VA
+10A2D ; [.1BAC.0020.0002.10A2D] # KHAROSHTHI LETTER SHA
+10A2E ; [.1BAD.0020.0002.10A2E] # KHAROSHTHI LETTER SSA
+10A2F ; [.1BAE.0020.0002.10A2F] # KHAROSHTHI LETTER SA
+10A30 ; [.1BAF.0020.0002.10A30] # KHAROSHTHI LETTER ZA
+10A31 ; [.1BB0.0020.0002.10A31] # KHAROSHTHI LETTER HA
+10A32 ; [.1BB1.0020.0002.10A32] # KHAROSHTHI LETTER KKA
+10A33 ; [.1BB2.0020.0002.10A33] # KHAROSHTHI LETTER TTTHA
+10A3F ; [.1BB3.0020.0002.10A3F] # KHAROSHTHI VIRAMA
+0E01 ; [.1BB4.0020.0002.0E01] # THAI CHARACTER KO KAI
+0E40 0E01 ; [.1BB4.0020.0002.0E01][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KO KAI>
+0E41 0E01 ; [.1BB4.0020.0002.0E01][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KO KAI>
+0E42 0E01 ; [.1BB4.0020.0002.0E01][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KO KAI>
+0E43 0E01 ; [.1BB4.0020.0002.0E01][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KO KAI>
+0E44 0E01 ; [.1BB4.0020.0002.0E01][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KO KAI>
+0E02 ; [.1BB5.0020.0002.0E02] # THAI CHARACTER KHO KHAI
+0E40 0E02 ; [.1BB5.0020.0002.0E02][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHAI>
+0E41 0E02 ; [.1BB5.0020.0002.0E02][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHAI>
+0E42 0E02 ; [.1BB5.0020.0002.0E02][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHAI>
+0E43 0E02 ; [.1BB5.0020.0002.0E02][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHAI>
+0E44 0E02 ; [.1BB5.0020.0002.0E02][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHAI>
+0E03 ; [.1BB6.0020.0002.0E03] # THAI CHARACTER KHO KHUAT
+0E40 0E03 ; [.1BB6.0020.0002.0E03][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHUAT>
+0E41 0E03 ; [.1BB6.0020.0002.0E03][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHUAT>
+0E42 0E03 ; [.1BB6.0020.0002.0E03][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHUAT>
+0E43 0E03 ; [.1BB6.0020.0002.0E03][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHUAT>
+0E44 0E03 ; [.1BB6.0020.0002.0E03][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHUAT>
+0E04 ; [.1BB7.0020.0002.0E04] # THAI CHARACTER KHO KHWAI
+0E40 0E04 ; [.1BB7.0020.0002.0E04][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHWAI>
+0E41 0E04 ; [.1BB7.0020.0002.0E04][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHWAI>
+0E42 0E04 ; [.1BB7.0020.0002.0E04][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHWAI>
+0E43 0E04 ; [.1BB7.0020.0002.0E04][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHWAI>
+0E44 0E04 ; [.1BB7.0020.0002.0E04][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHWAI>
+0E05 ; [.1BB8.0020.0002.0E05] # THAI CHARACTER KHO KHON
+0E40 0E05 ; [.1BB8.0020.0002.0E05][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHON>
+0E41 0E05 ; [.1BB8.0020.0002.0E05][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHON>
+0E42 0E05 ; [.1BB8.0020.0002.0E05][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHON>
+0E43 0E05 ; [.1BB8.0020.0002.0E05][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHON>
+0E44 0E05 ; [.1BB8.0020.0002.0E05][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHON>
+0E06 ; [.1BB9.0020.0002.0E06] # THAI CHARACTER KHO RAKHANG
+0E40 0E06 ; [.1BB9.0020.0002.0E06][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO RAKHANG>
+0E41 0E06 ; [.1BB9.0020.0002.0E06][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO RAKHANG>
+0E42 0E06 ; [.1BB9.0020.0002.0E06][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO RAKHANG>
+0E43 0E06 ; [.1BB9.0020.0002.0E06][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO RAKHANG>
+0E44 0E06 ; [.1BB9.0020.0002.0E06][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO RAKHANG>
+0E07 ; [.1BBA.0020.0002.0E07] # THAI CHARACTER NGO NGU
+0E40 0E07 ; [.1BBA.0020.0002.0E07][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER NGO NGU>
+0E41 0E07 ; [.1BBA.0020.0002.0E07][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER NGO NGU>
+0E42 0E07 ; [.1BBA.0020.0002.0E07][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER NGO NGU>
+0E43 0E07 ; [.1BBA.0020.0002.0E07][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NGO NGU>
+0E44 0E07 ; [.1BBA.0020.0002.0E07][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NGO NGU>
+0E08 ; [.1BBB.0020.0002.0E08] # THAI CHARACTER CHO CHAN
+0E40 0E08 ; [.1BBB.0020.0002.0E08][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHAN>
+0E41 0E08 ; [.1BBB.0020.0002.0E08][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHAN>
+0E42 0E08 ; [.1BBB.0020.0002.0E08][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHAN>
+0E43 0E08 ; [.1BBB.0020.0002.0E08][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHAN>
+0E44 0E08 ; [.1BBB.0020.0002.0E08][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHAN>
+0E09 ; [.1BBC.0020.0002.0E09] # THAI CHARACTER CHO CHING
+0E40 0E09 ; [.1BBC.0020.0002.0E09][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHING>
+0E41 0E09 ; [.1BBC.0020.0002.0E09][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHING>
+0E42 0E09 ; [.1BBC.0020.0002.0E09][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHING>
+0E43 0E09 ; [.1BBC.0020.0002.0E09][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHING>
+0E44 0E09 ; [.1BBC.0020.0002.0E09][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHING>
+0E0A ; [.1BBD.0020.0002.0E0A] # THAI CHARACTER CHO CHANG
+0E40 0E0A ; [.1BBD.0020.0002.0E0A][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHANG>
+0E41 0E0A ; [.1BBD.0020.0002.0E0A][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHANG>
+0E42 0E0A ; [.1BBD.0020.0002.0E0A][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHANG>
+0E43 0E0A ; [.1BBD.0020.0002.0E0A][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHANG>
+0E44 0E0A ; [.1BBD.0020.0002.0E0A][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHANG>
+0E0B ; [.1BBE.0020.0002.0E0B] # THAI CHARACTER SO SO
+0E40 0E0B ; [.1BBE.0020.0002.0E0B][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO SO>
+0E41 0E0B ; [.1BBE.0020.0002.0E0B][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SO>
+0E42 0E0B ; [.1BBE.0020.0002.0E0B][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO SO>
+0E43 0E0B ; [.1BBE.0020.0002.0E0B][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SO>
+0E44 0E0B ; [.1BBE.0020.0002.0E0B][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SO>
+0E0C ; [.1BBF.0020.0002.0E0C] # THAI CHARACTER CHO CHOE
+0E40 0E0C ; [.1BBF.0020.0002.0E0C][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHOE>
+0E41 0E0C ; [.1BBF.0020.0002.0E0C][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHOE>
+0E42 0E0C ; [.1BBF.0020.0002.0E0C][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHOE>
+0E43 0E0C ; [.1BBF.0020.0002.0E0C][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHOE>
+0E44 0E0C ; [.1BBF.0020.0002.0E0C][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHOE>
+0E0D ; [.1BC0.0020.0002.0E0D] # THAI CHARACTER YO YING
+0E40 0E0D ; [.1BC0.0020.0002.0E0D][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER YO YING>
+0E41 0E0D ; [.1BC0.0020.0002.0E0D][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YING>
+0E42 0E0D ; [.1BC0.0020.0002.0E0D][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER YO YING>
+0E43 0E0D ; [.1BC0.0020.0002.0E0D][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YING>
+0E44 0E0D ; [.1BC0.0020.0002.0E0D][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YING>
+0E0E ; [.1BC1.0020.0002.0E0E] # THAI CHARACTER DO CHADA
+0E40 0E0E ; [.1BC1.0020.0002.0E0E][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER DO CHADA>
+0E41 0E0E ; [.1BC1.0020.0002.0E0E][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER DO CHADA>
+0E42 0E0E ; [.1BC1.0020.0002.0E0E][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER DO CHADA>
+0E43 0E0E ; [.1BC1.0020.0002.0E0E][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO CHADA>
+0E44 0E0E ; [.1BC1.0020.0002.0E0E][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO CHADA>
+0E0F ; [.1BC2.0020.0002.0E0F] # THAI CHARACTER TO PATAK
+0E40 0E0F ; [.1BC2.0020.0002.0E0F][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER TO PATAK>
+0E41 0E0F ; [.1BC2.0020.0002.0E0F][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER TO PATAK>
+0E42 0E0F ; [.1BC2.0020.0002.0E0F][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER TO PATAK>
+0E43 0E0F ; [.1BC2.0020.0002.0E0F][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO PATAK>
+0E44 0E0F ; [.1BC2.0020.0002.0E0F][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO PATAK>
+0E10 ; [.1BC3.0020.0002.0E10] # THAI CHARACTER THO THAN
+0E40 0E10 ; [.1BC3.0020.0002.0E10][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAN>
+0E41 0E10 ; [.1BC3.0020.0002.0E10][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAN>
+0E42 0E10 ; [.1BC3.0020.0002.0E10][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAN>
+0E43 0E10 ; [.1BC3.0020.0002.0E10][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAN>
+0E44 0E10 ; [.1BC3.0020.0002.0E10][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAN>
+0E11 ; [.1BC4.0020.0002.0E11] # THAI CHARACTER THO NANGMONTHO
+0E40 0E11 ; [.1BC4.0020.0002.0E11][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO NANGMONTHO>
+0E41 0E11 ; [.1BC4.0020.0002.0E11][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO NANGMONTHO>
+0E42 0E11 ; [.1BC4.0020.0002.0E11][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO NANGMONTHO>
+0E43 0E11 ; [.1BC4.0020.0002.0E11][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO NANGMONTHO>
+0E44 0E11 ; [.1BC4.0020.0002.0E11][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO NANGMONTHO>
+0E12 ; [.1BC5.0020.0002.0E12] # THAI CHARACTER THO PHUTHAO
+0E40 0E12 ; [.1BC5.0020.0002.0E12][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO PHUTHAO>
+0E41 0E12 ; [.1BC5.0020.0002.0E12][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO PHUTHAO>
+0E42 0E12 ; [.1BC5.0020.0002.0E12][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO PHUTHAO>
+0E43 0E12 ; [.1BC5.0020.0002.0E12][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO PHUTHAO>
+0E44 0E12 ; [.1BC5.0020.0002.0E12][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO PHUTHAO>
+0E13 ; [.1BC6.0020.0002.0E13] # THAI CHARACTER NO NEN
+0E40 0E13 ; [.1BC6.0020.0002.0E13][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER NO NEN>
+0E41 0E13 ; [.1BC6.0020.0002.0E13][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NEN>
+0E42 0E13 ; [.1BC6.0020.0002.0E13][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER NO NEN>
+0E43 0E13 ; [.1BC6.0020.0002.0E13][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NEN>
+0E44 0E13 ; [.1BC6.0020.0002.0E13][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NEN>
+0E14 ; [.1BC7.0020.0002.0E14] # THAI CHARACTER DO DEK
+0E40 0E14 ; [.1BC7.0020.0002.0E14][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER DO DEK>
+0E41 0E14 ; [.1BC7.0020.0002.0E14][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER DO DEK>
+0E42 0E14 ; [.1BC7.0020.0002.0E14][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER DO DEK>
+0E43 0E14 ; [.1BC7.0020.0002.0E14][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO DEK>
+0E44 0E14 ; [.1BC7.0020.0002.0E14][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO DEK>
+0E15 ; [.1BC8.0020.0002.0E15] # THAI CHARACTER TO TAO
+0E40 0E15 ; [.1BC8.0020.0002.0E15][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER TO TAO>
+0E41 0E15 ; [.1BC8.0020.0002.0E15][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER TO TAO>
+0E42 0E15 ; [.1BC8.0020.0002.0E15][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER TO TAO>
+0E43 0E15 ; [.1BC8.0020.0002.0E15][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO TAO>
+0E44 0E15 ; [.1BC8.0020.0002.0E15][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO TAO>
+0E16 ; [.1BC9.0020.0002.0E16] # THAI CHARACTER THO THUNG
+0E40 0E16 ; [.1BC9.0020.0002.0E16][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THUNG>
+0E41 0E16 ; [.1BC9.0020.0002.0E16][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THUNG>
+0E42 0E16 ; [.1BC9.0020.0002.0E16][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THUNG>
+0E43 0E16 ; [.1BC9.0020.0002.0E16][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THUNG>
+0E44 0E16 ; [.1BC9.0020.0002.0E16][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THUNG>
+0E17 ; [.1BCA.0020.0002.0E17] # THAI CHARACTER THO THAHAN
+0E40 0E17 ; [.1BCA.0020.0002.0E17][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAHAN>
+0E41 0E17 ; [.1BCA.0020.0002.0E17][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAHAN>
+0E42 0E17 ; [.1BCA.0020.0002.0E17][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAHAN>
+0E43 0E17 ; [.1BCA.0020.0002.0E17][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAHAN>
+0E44 0E17 ; [.1BCA.0020.0002.0E17][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAHAN>
+0E18 ; [.1BCB.0020.0002.0E18] # THAI CHARACTER THO THONG
+0E40 0E18 ; [.1BCB.0020.0002.0E18][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THONG>
+0E41 0E18 ; [.1BCB.0020.0002.0E18][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THONG>
+0E42 0E18 ; [.1BCB.0020.0002.0E18][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THONG>
+0E43 0E18 ; [.1BCB.0020.0002.0E18][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THONG>
+0E44 0E18 ; [.1BCB.0020.0002.0E18][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THONG>
+0E19 ; [.1BCC.0020.0002.0E19] # THAI CHARACTER NO NU
+0E40 0E19 ; [.1BCC.0020.0002.0E19][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER NO NU>
+0E41 0E19 ; [.1BCC.0020.0002.0E19][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NU>
+0E42 0E19 ; [.1BCC.0020.0002.0E19][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER NO NU>
+0E43 0E19 ; [.1BCC.0020.0002.0E19][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NU>
+0E44 0E19 ; [.1BCC.0020.0002.0E19][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NU>
+0E1A ; [.1BCD.0020.0002.0E1A] # THAI CHARACTER BO BAIMAI
+0E40 0E1A ; [.1BCD.0020.0002.0E1A][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER BO BAIMAI>
+0E41 0E1A ; [.1BCD.0020.0002.0E1A][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER BO BAIMAI>
+0E42 0E1A ; [.1BCD.0020.0002.0E1A][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER BO BAIMAI>
+0E43 0E1A ; [.1BCD.0020.0002.0E1A][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER BO BAIMAI>
+0E44 0E1A ; [.1BCD.0020.0002.0E1A][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER BO BAIMAI>
+0E1B ; [.1BCE.0020.0002.0E1B] # THAI CHARACTER PO PLA
+0E40 0E1B ; [.1BCE.0020.0002.0E1B][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PO PLA>
+0E41 0E1B ; [.1BCE.0020.0002.0E1B][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PO PLA>
+0E42 0E1B ; [.1BCE.0020.0002.0E1B][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PO PLA>
+0E43 0E1B ; [.1BCE.0020.0002.0E1B][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PO PLA>
+0E44 0E1B ; [.1BCE.0020.0002.0E1B][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PO PLA>
+0E1C ; [.1BCF.0020.0002.0E1C] # THAI CHARACTER PHO PHUNG
+0E40 0E1C ; [.1BCF.0020.0002.0E1C][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHUNG>
+0E41 0E1C ; [.1BCF.0020.0002.0E1C][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHUNG>
+0E42 0E1C ; [.1BCF.0020.0002.0E1C][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHUNG>
+0E43 0E1C ; [.1BCF.0020.0002.0E1C][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHUNG>
+0E44 0E1C ; [.1BCF.0020.0002.0E1C][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHUNG>
+0E1D ; [.1BD0.0020.0002.0E1D] # THAI CHARACTER FO FA
+0E40 0E1D ; [.1BD0.0020.0002.0E1D][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER FO FA>
+0E41 0E1D ; [.1BD0.0020.0002.0E1D][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FA>
+0E42 0E1D ; [.1BD0.0020.0002.0E1D][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER FO FA>
+0E43 0E1D ; [.1BD0.0020.0002.0E1D][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FA>
+0E44 0E1D ; [.1BD0.0020.0002.0E1D][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FA>
+0E1E ; [.1BD1.0020.0002.0E1E] # THAI CHARACTER PHO PHAN
+0E40 0E1E ; [.1BD1.0020.0002.0E1E][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHAN>
+0E41 0E1E ; [.1BD1.0020.0002.0E1E][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHAN>
+0E42 0E1E ; [.1BD1.0020.0002.0E1E][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHAN>
+0E43 0E1E ; [.1BD1.0020.0002.0E1E][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHAN>
+0E44 0E1E ; [.1BD1.0020.0002.0E1E][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHAN>
+0E1F ; [.1BD2.0020.0002.0E1F] # THAI CHARACTER FO FAN
+0E40 0E1F ; [.1BD2.0020.0002.0E1F][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER FO FAN>
+0E41 0E1F ; [.1BD2.0020.0002.0E1F][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FAN>
+0E42 0E1F ; [.1BD2.0020.0002.0E1F][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER FO FAN>
+0E43 0E1F ; [.1BD2.0020.0002.0E1F][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FAN>
+0E44 0E1F ; [.1BD2.0020.0002.0E1F][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FAN>
+0E20 ; [.1BD3.0020.0002.0E20] # THAI CHARACTER PHO SAMPHAO
+0E40 0E20 ; [.1BD3.0020.0002.0E20][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PHO SAMPHAO>
+0E41 0E20 ; [.1BD3.0020.0002.0E20][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO SAMPHAO>
+0E42 0E20 ; [.1BD3.0020.0002.0E20][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PHO SAMPHAO>
+0E43 0E20 ; [.1BD3.0020.0002.0E20][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO SAMPHAO>
+0E44 0E20 ; [.1BD3.0020.0002.0E20][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO SAMPHAO>
+0E21 ; [.1BD4.0020.0002.0E21] # THAI CHARACTER MO MA
+0E40 0E21 ; [.1BD4.0020.0002.0E21][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER MO MA>
+0E41 0E21 ; [.1BD4.0020.0002.0E21][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER MO MA>
+0E42 0E21 ; [.1BD4.0020.0002.0E21][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER MO MA>
+0E43 0E21 ; [.1BD4.0020.0002.0E21][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER MO MA>
+0E44 0E21 ; [.1BD4.0020.0002.0E21][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER MO MA>
+0E22 ; [.1BD5.0020.0002.0E22] # THAI CHARACTER YO YAK
+0E40 0E22 ; [.1BD5.0020.0002.0E22][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER YO YAK>
+0E41 0E22 ; [.1BD5.0020.0002.0E22][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YAK>
+0E42 0E22 ; [.1BD5.0020.0002.0E22][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER YO YAK>
+0E43 0E22 ; [.1BD5.0020.0002.0E22][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YAK>
+0E44 0E22 ; [.1BD5.0020.0002.0E22][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YAK>
+0E23 ; [.1BD6.0020.0002.0E23] # THAI CHARACTER RO RUA
+0E40 0E23 ; [.1BD6.0020.0002.0E23][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER RO RUA>
+0E41 0E23 ; [.1BD6.0020.0002.0E23][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER RO RUA>
+0E42 0E23 ; [.1BD6.0020.0002.0E23][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER RO RUA>
+0E43 0E23 ; [.1BD6.0020.0002.0E23][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RO RUA>
+0E44 0E23 ; [.1BD6.0020.0002.0E23][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RO RUA>
+0E24 ; [.1BD7.0020.0002.0E24] # THAI CHARACTER RU
+0E40 0E24 ; [.1BD7.0020.0002.0E24][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER RU>
+0E41 0E24 ; [.1BD7.0020.0002.0E24][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER RU>
+0E42 0E24 ; [.1BD7.0020.0002.0E24][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER RU>
+0E43 0E24 ; [.1BD7.0020.0002.0E24][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RU>
+0E44 0E24 ; [.1BD7.0020.0002.0E24][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RU>
+0E25 ; [.1BD8.0020.0002.0E25] # THAI CHARACTER LO LING
+0E40 0E25 ; [.1BD8.0020.0002.0E25][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER LO LING>
+0E41 0E25 ; [.1BD8.0020.0002.0E25][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER LO LING>
+0E42 0E25 ; [.1BD8.0020.0002.0E25][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER LO LING>
+0E43 0E25 ; [.1BD8.0020.0002.0E25][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO LING>
+0E44 0E25 ; [.1BD8.0020.0002.0E25][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO LING>
+0E26 ; [.1BD9.0020.0002.0E26] # THAI CHARACTER LU
+0E40 0E26 ; [.1BD9.0020.0002.0E26][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER LU>
+0E41 0E26 ; [.1BD9.0020.0002.0E26][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER LU>
+0E42 0E26 ; [.1BD9.0020.0002.0E26][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER LU>
+0E43 0E26 ; [.1BD9.0020.0002.0E26][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LU>
+0E44 0E26 ; [.1BD9.0020.0002.0E26][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LU>
+0E27 ; [.1BDA.0020.0002.0E27] # THAI CHARACTER WO WAEN
+0E40 0E27 ; [.1BDA.0020.0002.0E27][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER WO WAEN>
+0E41 0E27 ; [.1BDA.0020.0002.0E27][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER WO WAEN>
+0E42 0E27 ; [.1BDA.0020.0002.0E27][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER WO WAEN>
+0E43 0E27 ; [.1BDA.0020.0002.0E27][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER WO WAEN>
+0E44 0E27 ; [.1BDA.0020.0002.0E27][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER WO WAEN>
+0E28 ; [.1BDB.0020.0002.0E28] # THAI CHARACTER SO SALA
+0E40 0E28 ; [.1BDB.0020.0002.0E28][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO SALA>
+0E41 0E28 ; [.1BDB.0020.0002.0E28][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SALA>
+0E42 0E28 ; [.1BDB.0020.0002.0E28][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO SALA>
+0E43 0E28 ; [.1BDB.0020.0002.0E28][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SALA>
+0E44 0E28 ; [.1BDB.0020.0002.0E28][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SALA>
+0E29 ; [.1BDC.0020.0002.0E29] # THAI CHARACTER SO RUSI
+0E40 0E29 ; [.1BDC.0020.0002.0E29][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO RUSI>
+0E41 0E29 ; [.1BDC.0020.0002.0E29][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO RUSI>
+0E42 0E29 ; [.1BDC.0020.0002.0E29][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO RUSI>
+0E43 0E29 ; [.1BDC.0020.0002.0E29][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO RUSI>
+0E44 0E29 ; [.1BDC.0020.0002.0E29][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO RUSI>
+0E2A ; [.1BDD.0020.0002.0E2A] # THAI CHARACTER SO SUA
+0E40 0E2A ; [.1BDD.0020.0002.0E2A][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO SUA>
+0E41 0E2A ; [.1BDD.0020.0002.0E2A][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SUA>
+0E42 0E2A ; [.1BDD.0020.0002.0E2A][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO SUA>
+0E43 0E2A ; [.1BDD.0020.0002.0E2A][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SUA>
+0E44 0E2A ; [.1BDD.0020.0002.0E2A][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SUA>
+0E2B ; [.1BDE.0020.0002.0E2B] # THAI CHARACTER HO HIP
+0E40 0E2B ; [.1BDE.0020.0002.0E2B][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER HO HIP>
+0E41 0E2B ; [.1BDE.0020.0002.0E2B][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER HO HIP>
+0E42 0E2B ; [.1BDE.0020.0002.0E2B][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER HO HIP>
+0E43 0E2B ; [.1BDE.0020.0002.0E2B][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO HIP>
+0E44 0E2B ; [.1BDE.0020.0002.0E2B][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO HIP>
+0E2C ; [.1BDF.0020.0002.0E2C] # THAI CHARACTER LO CHULA
+0E40 0E2C ; [.1BDF.0020.0002.0E2C][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER LO CHULA>
+0E41 0E2C ; [.1BDF.0020.0002.0E2C][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER LO CHULA>
+0E42 0E2C ; [.1BDF.0020.0002.0E2C][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER LO CHULA>
+0E43 0E2C ; [.1BDF.0020.0002.0E2C][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO CHULA>
+0E44 0E2C ; [.1BDF.0020.0002.0E2C][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO CHULA>
+0E2D ; [.1BE0.0020.0002.0E2D] # THAI CHARACTER O ANG
+0E40 0E2D ; [.1BE0.0020.0002.0E2D][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER O ANG>
+0E41 0E2D ; [.1BE0.0020.0002.0E2D][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER O ANG>
+0E42 0E2D ; [.1BE0.0020.0002.0E2D][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER O ANG>
+0E43 0E2D ; [.1BE0.0020.0002.0E2D][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER O ANG>
+0E44 0E2D ; [.1BE0.0020.0002.0E2D][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER O ANG>
+0E2E ; [.1BE1.0020.0002.0E2E] # THAI CHARACTER HO NOKHUK
+0E40 0E2E ; [.1BE1.0020.0002.0E2E][.1BEE.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER HO NOKHUK>
+0E41 0E2E ; [.1BE1.0020.0002.0E2E][.1BEF.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER HO NOKHUK>
+0E42 0E2E ; [.1BE1.0020.0002.0E2E][.1BF0.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER HO NOKHUK>
+0E43 0E2E ; [.1BE1.0020.0002.0E2E][.1BF1.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO NOKHUK>
+0E44 0E2E ; [.1BE1.0020.0002.0E2E][.1BF2.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO NOKHUK>
+0E2F ; [.1BE2.0020.0002.0E2F] # THAI CHARACTER PAIYANNOI
+0E30 ; [.1BE3.0020.0002.0E30] # THAI CHARACTER SARA A
+0E31 ; [.1BE4.0020.0002.0E31] # THAI CHARACTER MAI HAN-AKAT
+0E32 ; [.1BE5.0020.0002.0E32] # THAI CHARACTER SARA AA
+0E33 ; [.1BE6.0020.0002.0E33] # THAI CHARACTER SARA AM
+0E4D 0E32 ; [.1BE6.0020.0002.0E33] # THAI CHARACTER SARA AM
+0E34 ; [.1BE7.0020.0002.0E34] # THAI CHARACTER SARA I
+0E35 ; [.1BE8.0020.0002.0E35] # THAI CHARACTER SARA II
+0E36 ; [.1BE9.0020.0002.0E36] # THAI CHARACTER SARA UE
+0E37 ; [.1BEA.0020.0002.0E37] # THAI CHARACTER SARA UEE
+0E38 ; [.1BEB.0020.0002.0E38] # THAI CHARACTER SARA U
+0E39 ; [.1BEC.0020.0002.0E39] # THAI CHARACTER SARA UU
+0E3A ; [.1BED.0020.0002.0E3A] # THAI CHARACTER PHINTHU
+0E40 ; [.1BEE.0020.0002.0E40] # THAI CHARACTER SARA E
+0E41 ; [.1BEF.0020.0002.0E41] # THAI CHARACTER SARA AE
+0E42 ; [.1BF0.0020.0002.0E42] # THAI CHARACTER SARA O
+0E43 ; [.1BF1.0020.0002.0E43] # THAI CHARACTER SARA AI MAIMUAN
+0E44 ; [.1BF2.0020.0002.0E44] # THAI CHARACTER SARA AI MAIMALAI
+0E45 ; [.1BF3.0020.0002.0E45] # THAI CHARACTER LAKKHANGYAO
+0E81 ; [.1BF4.0020.0002.0E81] # LAO LETTER KO
+0EC0 0E81 ; [.1BF4.0020.0002.0E81][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER KO>
+0EC1 0E81 ; [.1BF4.0020.0002.0E81][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER KO>
+0EC2 0E81 ; [.1BF4.0020.0002.0E81][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER KO>
+0EC3 0E81 ; [.1BF4.0020.0002.0E81][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER KO>
+0EC4 0E81 ; [.1BF4.0020.0002.0E81][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER KO>
+0E82 ; [.1BF5.0020.0002.0E82] # LAO LETTER KHO SUNG
+0EC0 0E82 ; [.1BF5.0020.0002.0E82][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER KHO SUNG>
+0EC1 0E82 ; [.1BF5.0020.0002.0E82][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER KHO SUNG>
+0EC2 0E82 ; [.1BF5.0020.0002.0E82][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER KHO SUNG>
+0EC3 0E82 ; [.1BF5.0020.0002.0E82][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER KHO SUNG>
+0EC4 0E82 ; [.1BF5.0020.0002.0E82][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER KHO SUNG>
+0E84 ; [.1BF6.0020.0002.0E84] # LAO LETTER KHO TAM
+0EC0 0E84 ; [.1BF6.0020.0002.0E84][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER KHO TAM>
+0EC1 0E84 ; [.1BF6.0020.0002.0E84][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER KHO TAM>
+0EC2 0E84 ; [.1BF6.0020.0002.0E84][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER KHO TAM>
+0EC3 0E84 ; [.1BF6.0020.0002.0E84][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER KHO TAM>
+0EC4 0E84 ; [.1BF6.0020.0002.0E84][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER KHO TAM>
+0E87 ; [.1BF7.0020.0002.0E87] # LAO LETTER NGO
+0EC0 0E87 ; [.1BF7.0020.0002.0E87][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER NGO>
+0EC1 0E87 ; [.1BF7.0020.0002.0E87][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER NGO>
+0EC2 0E87 ; [.1BF7.0020.0002.0E87][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER NGO>
+0EC3 0E87 ; [.1BF7.0020.0002.0E87][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER NGO>
+0EC4 0E87 ; [.1BF7.0020.0002.0E87][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER NGO>
+0E88 ; [.1BF8.0020.0002.0E88] # LAO LETTER CO
+0EC0 0E88 ; [.1BF8.0020.0002.0E88][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER CO>
+0EC1 0E88 ; [.1BF8.0020.0002.0E88][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER CO>
+0EC2 0E88 ; [.1BF8.0020.0002.0E88][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER CO>
+0EC3 0E88 ; [.1BF8.0020.0002.0E88][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER CO>
+0EC4 0E88 ; [.1BF8.0020.0002.0E88][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER CO>
+0E8A ; [.1BF9.0020.0002.0E8A] # LAO LETTER SO TAM
+0EC0 0E8A ; [.1BF9.0020.0002.0E8A][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER SO TAM>
+0EC1 0E8A ; [.1BF9.0020.0002.0E8A][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER SO TAM>
+0EC2 0E8A ; [.1BF9.0020.0002.0E8A][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER SO TAM>
+0EC3 0E8A ; [.1BF9.0020.0002.0E8A][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER SO TAM>
+0EC4 0E8A ; [.1BF9.0020.0002.0E8A][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER SO TAM>
+0E8D ; [.1BFA.0020.0002.0E8D] # LAO LETTER NYO
+0EC0 0E8D ; [.1BFA.0020.0002.0E8D][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER NYO>
+0EC1 0E8D ; [.1BFA.0020.0002.0E8D][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER NYO>
+0EC2 0E8D ; [.1BFA.0020.0002.0E8D][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER NYO>
+0EC3 0E8D ; [.1BFA.0020.0002.0E8D][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER NYO>
+0EC4 0E8D ; [.1BFA.0020.0002.0E8D][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER NYO>
+0E94 ; [.1BFB.0020.0002.0E94] # LAO LETTER DO
+0EC0 0E94 ; [.1BFB.0020.0002.0E94][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER DO>
+0EC1 0E94 ; [.1BFB.0020.0002.0E94][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER DO>
+0EC2 0E94 ; [.1BFB.0020.0002.0E94][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER DO>
+0EC3 0E94 ; [.1BFB.0020.0002.0E94][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER DO>
+0EC4 0E94 ; [.1BFB.0020.0002.0E94][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER DO>
+0E95 ; [.1BFC.0020.0002.0E95] # LAO LETTER TO
+0EC0 0E95 ; [.1BFC.0020.0002.0E95][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER TO>
+0EC1 0E95 ; [.1BFC.0020.0002.0E95][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER TO>
+0EC2 0E95 ; [.1BFC.0020.0002.0E95][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER TO>
+0EC3 0E95 ; [.1BFC.0020.0002.0E95][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER TO>
+0EC4 0E95 ; [.1BFC.0020.0002.0E95][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER TO>
+0E96 ; [.1BFD.0020.0002.0E96] # LAO LETTER THO SUNG
+0EC0 0E96 ; [.1BFD.0020.0002.0E96][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER THO SUNG>
+0EC1 0E96 ; [.1BFD.0020.0002.0E96][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER THO SUNG>
+0EC2 0E96 ; [.1BFD.0020.0002.0E96][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER THO SUNG>
+0EC3 0E96 ; [.1BFD.0020.0002.0E96][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER THO SUNG>
+0EC4 0E96 ; [.1BFD.0020.0002.0E96][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER THO SUNG>
+0E97 ; [.1BFE.0020.0002.0E97] # LAO LETTER THO TAM
+0EC0 0E97 ; [.1BFE.0020.0002.0E97][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER THO TAM>
+0EC1 0E97 ; [.1BFE.0020.0002.0E97][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER THO TAM>
+0EC2 0E97 ; [.1BFE.0020.0002.0E97][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER THO TAM>
+0EC3 0E97 ; [.1BFE.0020.0002.0E97][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER THO TAM>
+0EC4 0E97 ; [.1BFE.0020.0002.0E97][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER THO TAM>
+0E99 ; [.1BFF.0020.0002.0E99] # LAO LETTER NO
+0EC0 0E99 ; [.1BFF.0020.0002.0E99][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER NO>
+0EC1 0E99 ; [.1BFF.0020.0002.0E99][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER NO>
+0EC2 0E99 ; [.1BFF.0020.0002.0E99][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER NO>
+0EC3 0E99 ; [.1BFF.0020.0002.0E99][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER NO>
+0EC4 0E99 ; [.1BFF.0020.0002.0E99][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER NO>
+0E9A ; [.1C00.0020.0002.0E9A] # LAO LETTER BO
+0EC0 0E9A ; [.1C00.0020.0002.0E9A][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER BO>
+0EC1 0E9A ; [.1C00.0020.0002.0E9A][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER BO>
+0EC2 0E9A ; [.1C00.0020.0002.0E9A][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER BO>
+0EC3 0E9A ; [.1C00.0020.0002.0E9A][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER BO>
+0EC4 0E9A ; [.1C00.0020.0002.0E9A][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER BO>
+0E9B ; [.1C01.0020.0002.0E9B] # LAO LETTER PO
+0EC0 0E9B ; [.1C01.0020.0002.0E9B][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER PO>
+0EC1 0E9B ; [.1C01.0020.0002.0E9B][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER PO>
+0EC2 0E9B ; [.1C01.0020.0002.0E9B][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER PO>
+0EC3 0E9B ; [.1C01.0020.0002.0E9B][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER PO>
+0EC4 0E9B ; [.1C01.0020.0002.0E9B][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER PO>
+0E9C ; [.1C02.0020.0002.0E9C] # LAO LETTER PHO SUNG
+0EC0 0E9C ; [.1C02.0020.0002.0E9C][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER PHO SUNG>
+0EC1 0E9C ; [.1C02.0020.0002.0E9C][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER PHO SUNG>
+0EC2 0E9C ; [.1C02.0020.0002.0E9C][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER PHO SUNG>
+0EC3 0E9C ; [.1C02.0020.0002.0E9C][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER PHO SUNG>
+0EC4 0E9C ; [.1C02.0020.0002.0E9C][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER PHO SUNG>
+0E9D ; [.1C03.0020.0002.0E9D] # LAO LETTER FO TAM
+0EC0 0E9D ; [.1C03.0020.0002.0E9D][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER FO TAM>
+0EC1 0E9D ; [.1C03.0020.0002.0E9D][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER FO TAM>
+0EC2 0E9D ; [.1C03.0020.0002.0E9D][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER FO TAM>
+0EC3 0E9D ; [.1C03.0020.0002.0E9D][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER FO TAM>
+0EC4 0E9D ; [.1C03.0020.0002.0E9D][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER FO TAM>
+0E9E ; [.1C04.0020.0002.0E9E] # LAO LETTER PHO TAM
+0EC0 0E9E ; [.1C04.0020.0002.0E9E][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER PHO TAM>
+0EC1 0E9E ; [.1C04.0020.0002.0E9E][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER PHO TAM>
+0EC2 0E9E ; [.1C04.0020.0002.0E9E][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER PHO TAM>
+0EC3 0E9E ; [.1C04.0020.0002.0E9E][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER PHO TAM>
+0EC4 0E9E ; [.1C04.0020.0002.0E9E][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER PHO TAM>
+0E9F ; [.1C05.0020.0002.0E9F] # LAO LETTER FO SUNG
+0EC0 0E9F ; [.1C05.0020.0002.0E9F][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER FO SUNG>
+0EC1 0E9F ; [.1C05.0020.0002.0E9F][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER FO SUNG>
+0EC2 0E9F ; [.1C05.0020.0002.0E9F][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER FO SUNG>
+0EC3 0E9F ; [.1C05.0020.0002.0E9F][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER FO SUNG>
+0EC4 0E9F ; [.1C05.0020.0002.0E9F][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER FO SUNG>
+0EA1 ; [.1C06.0020.0002.0EA1] # LAO LETTER MO
+0EC0 0EA1 ; [.1C06.0020.0002.0EA1][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER MO>
+0EC1 0EA1 ; [.1C06.0020.0002.0EA1][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER MO>
+0EC2 0EA1 ; [.1C06.0020.0002.0EA1][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER MO>
+0EC3 0EA1 ; [.1C06.0020.0002.0EA1][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER MO>
+0EC4 0EA1 ; [.1C06.0020.0002.0EA1][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER MO>
+0EA2 ; [.1C07.0020.0002.0EA2] # LAO LETTER YO
+0EC0 0EA2 ; [.1C07.0020.0002.0EA2][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER YO>
+0EC1 0EA2 ; [.1C07.0020.0002.0EA2][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER YO>
+0EC2 0EA2 ; [.1C07.0020.0002.0EA2][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER YO>
+0EC3 0EA2 ; [.1C07.0020.0002.0EA2][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER YO>
+0EC4 0EA2 ; [.1C07.0020.0002.0EA2][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER YO>
+0EA3 ; [.1C08.0020.0002.0EA3] # LAO LETTER LO LING
+0EC0 0EA3 ; [.1C08.0020.0002.0EA3][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER LO LING>
+0EC1 0EA3 ; [.1C08.0020.0002.0EA3][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER LO LING>
+0EC2 0EA3 ; [.1C08.0020.0002.0EA3][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER LO LING>
+0EC3 0EA3 ; [.1C08.0020.0002.0EA3][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER LO LING>
+0EC4 0EA3 ; [.1C08.0020.0002.0EA3][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER LO LING>
+0EA5 ; [.1C09.0020.0002.0EA5] # LAO LETTER LO LOOT
+0EC0 0EA5 ; [.1C09.0020.0002.0EA5][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER LO LOOT>
+0EC1 0EA5 ; [.1C09.0020.0002.0EA5][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER LO LOOT>
+0EC2 0EA5 ; [.1C09.0020.0002.0EA5][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER LO LOOT>
+0EC3 0EA5 ; [.1C09.0020.0002.0EA5][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER LO LOOT>
+0EC4 0EA5 ; [.1C09.0020.0002.0EA5][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER LO LOOT>
+0EA7 ; [.1C0A.0020.0002.0EA7] # LAO LETTER WO
+0EC0 0EA7 ; [.1C0A.0020.0002.0EA7][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER WO>
+0EC1 0EA7 ; [.1C0A.0020.0002.0EA7][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER WO>
+0EC2 0EA7 ; [.1C0A.0020.0002.0EA7][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER WO>
+0EC3 0EA7 ; [.1C0A.0020.0002.0EA7][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER WO>
+0EC4 0EA7 ; [.1C0A.0020.0002.0EA7][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER WO>
+0EAA ; [.1C0B.0020.0002.0EAA] # LAO LETTER SO SUNG
+0EC0 0EAA ; [.1C0B.0020.0002.0EAA][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER SO SUNG>
+0EC1 0EAA ; [.1C0B.0020.0002.0EAA][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER SO SUNG>
+0EC2 0EAA ; [.1C0B.0020.0002.0EAA][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER SO SUNG>
+0EC3 0EAA ; [.1C0B.0020.0002.0EAA][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER SO SUNG>
+0EC4 0EAA ; [.1C0B.0020.0002.0EAA][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER SO SUNG>
+0EAB ; [.1C0C.0020.0002.0EAB] # LAO LETTER HO SUNG
+0EDC ; [.1C0C.0020.0004.0EDC][.1BFF.0020.0004.0EDC] # LAO HO NO; QQKN
+0EC0 0EDC ; [.1C0C.0020.0004.0EDC][.1BFF.0020.0004.0EDC][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO HO NO>
+0EC1 0EDC ; [.1C0C.0020.0004.0EDC][.1BFF.0020.0004.0EDC][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO HO NO>
+0EC2 0EDC ; [.1C0C.0020.0004.0EDC][.1BFF.0020.0004.0EDC][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO HO NO>
+0EC3 0EDC ; [.1C0C.0020.0004.0EDC][.1BFF.0020.0004.0EDC][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO HO NO>
+0EC4 0EDC ; [.1C0C.0020.0004.0EDC][.1BFF.0020.0004.0EDC][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO HO NO>
+0EDD ; [.1C0C.0020.0004.0EDD][.1C06.0020.0004.0EDD] # LAO HO MO; QQKN
+0EC0 0EDD ; [.1C0C.0020.0004.0EDD][.1C06.0020.0004.0EDD][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO HO MO>
+0EC1 0EDD ; [.1C0C.0020.0004.0EDD][.1C06.0020.0004.0EDD][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO HO MO>
+0EC2 0EDD ; [.1C0C.0020.0004.0EDD][.1C06.0020.0004.0EDD][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO HO MO>
+0EC3 0EDD ; [.1C0C.0020.0004.0EDD][.1C06.0020.0004.0EDD][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO HO MO>
+0EC4 0EDD ; [.1C0C.0020.0004.0EDD][.1C06.0020.0004.0EDD][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO HO MO>
+0EC0 0EAB ; [.1C0C.0020.0002.0EAB][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER HO SUNG>
+0EC1 0EAB ; [.1C0C.0020.0002.0EAB][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER HO SUNG>
+0EC2 0EAB ; [.1C0C.0020.0002.0EAB][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER HO SUNG>
+0EC3 0EAB ; [.1C0C.0020.0002.0EAB][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER HO SUNG>
+0EC4 0EAB ; [.1C0C.0020.0002.0EAB][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER HO SUNG>
+0EAD ; [.1C0D.0020.0002.0EAD] # LAO LETTER O
+0EC0 0EAD ; [.1C0D.0020.0002.0EAD][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER O>
+0EC1 0EAD ; [.1C0D.0020.0002.0EAD][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER O>
+0EC2 0EAD ; [.1C0D.0020.0002.0EAD][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER O>
+0EC3 0EAD ; [.1C0D.0020.0002.0EAD][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER O>
+0EC4 0EAD ; [.1C0D.0020.0002.0EAD][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER O>
+0EAE ; [.1C0E.0020.0002.0EAE] # LAO LETTER HO TAM
+0EC0 0EAE ; [.1C0E.0020.0002.0EAE][.1C1D.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER HO TAM>
+0EC1 0EAE ; [.1C0E.0020.0002.0EAE][.1C1E.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER HO TAM>
+0EC2 0EAE ; [.1C0E.0020.0002.0EAE][.1C1F.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER HO TAM>
+0EC3 0EAE ; [.1C0E.0020.0002.0EAE][.1C20.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER HO TAM>
+0EC4 0EAE ; [.1C0E.0020.0002.0EAE][.1C21.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER HO TAM>
+0EAF ; [.1C0F.0020.0002.0EAF] # LAO ELLIPSIS
+0EB0 ; [.1C10.0020.0002.0EB0] # LAO VOWEL SIGN A
+0EB1 ; [.1C11.0020.0002.0EB1] # LAO VOWEL SIGN MAI KAN
+0EB2 ; [.1C12.0020.0002.0EB2] # LAO VOWEL SIGN AA
+0EB3 ; [.1C13.0020.0002.0EB3] # LAO VOWEL SIGN AM
+0ECD 0EB2 ; [.1C13.0020.0002.0EB3] # LAO VOWEL SIGN AM
+0EB4 ; [.1C14.0020.0002.0EB4] # LAO VOWEL SIGN I
+0EB5 ; [.1C15.0020.0002.0EB5] # LAO VOWEL SIGN II
+0EB6 ; [.1C16.0020.0002.0EB6] # LAO VOWEL SIGN Y
+0EB7 ; [.1C17.0020.0002.0EB7] # LAO VOWEL SIGN YY
+0EB8 ; [.1C18.0020.0002.0EB8] # LAO VOWEL SIGN U
+0EB9 ; [.1C19.0020.0002.0EB9] # LAO VOWEL SIGN UU
+0EBB ; [.1C1A.0020.0002.0EBB] # LAO VOWEL SIGN MAI KON
+0EBC ; [.1C1B.0020.0002.0EBC] # LAO SEMIVOWEL SIGN LO
+0EBD ; [.1C1C.0020.0002.0EBD] # LAO SEMIVOWEL SIGN NYO
+0EC0 ; [.1C1D.0020.0002.0EC0] # LAO VOWEL SIGN E
+0EC1 ; [.1C1E.0020.0002.0EC1] # LAO VOWEL SIGN EI
+0EC2 ; [.1C1F.0020.0002.0EC2] # LAO VOWEL SIGN O
+0EC3 ; [.1C20.0020.0002.0EC3] # LAO VOWEL SIGN AY
+0EC4 ; [.1C21.0020.0002.0EC4] # LAO VOWEL SIGN AI
+0F40 ; [.1C22.0020.0002.0F40] # TIBETAN LETTER KA
+0F69 ; [.1C22.0020.0002.0F40][.1C61.0020.0002.0FB5] # TIBETAN LETTER KSSA; QQCN
+0F90 ; [.1C23.0020.0002.0F90] # TIBETAN SUBJOINED LETTER KA
+0FB9 ; [.1C23.0020.0002.0F90][.1C61.0020.0002.0FB5] # TIBETAN SUBJOINED LETTER KSSA; QQCN
+0F41 ; [.1C24.0020.0002.0F41] # TIBETAN LETTER KHA
+0F91 ; [.1C25.0020.0002.0F91] # TIBETAN SUBJOINED LETTER KHA
+0F42 ; [.1C26.0020.0002.0F42] # TIBETAN LETTER GA
+0F43 ; [.1C26.0020.0002.0F42][.1C65.0020.0002.0FB7] # TIBETAN LETTER GHA; QQCN
+0F92 ; [.1C27.0020.0002.0F92] # TIBETAN SUBJOINED LETTER GA
+0F93 ; [.1C27.0020.0002.0F92][.1C65.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER GHA; QQCN
+0F44 ; [.1C28.0020.0002.0F44] # TIBETAN LETTER NGA
+0F94 ; [.1C29.0020.0002.0F94] # TIBETAN SUBJOINED LETTER NGA
+0F45 ; [.1C2A.0020.0002.0F45] # TIBETAN LETTER CA
+0F95 ; [.1C2B.0020.0002.0F95] # TIBETAN SUBJOINED LETTER CA
+0F46 ; [.1C2C.0020.0002.0F46] # TIBETAN LETTER CHA
+0F96 ; [.1C2D.0020.0002.0F96] # TIBETAN SUBJOINED LETTER CHA
+0F47 ; [.1C2E.0020.0002.0F47] # TIBETAN LETTER JA
+0F97 ; [.1C2F.0020.0002.0F97] # TIBETAN SUBJOINED LETTER JA
+0F49 ; [.1C30.0020.0002.0F49] # TIBETAN LETTER NYA
+0F99 ; [.1C31.0020.0002.0F99] # TIBETAN SUBJOINED LETTER NYA
+0F4A ; [.1C32.0020.0002.0F4A] # TIBETAN LETTER TTA
+0F9A ; [.1C33.0020.0002.0F9A] # TIBETAN SUBJOINED LETTER TTA
+0F4B ; [.1C34.0020.0002.0F4B] # TIBETAN LETTER TTHA
+0F9B ; [.1C35.0020.0002.0F9B] # TIBETAN SUBJOINED LETTER TTHA
+0F4C ; [.1C36.0020.0002.0F4C] # TIBETAN LETTER DDA
+0F4D ; [.1C36.0020.0002.0F4C][.1C65.0020.0002.0FB7] # TIBETAN LETTER DDHA; QQCN
+0F9C ; [.1C37.0020.0002.0F9C] # TIBETAN SUBJOINED LETTER DDA
+0F9D ; [.1C37.0020.0002.0F9C][.1C65.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DDHA; QQCN
+0F4E ; [.1C38.0020.0002.0F4E] # TIBETAN LETTER NNA
+0F9E ; [.1C39.0020.0002.0F9E] # TIBETAN SUBJOINED LETTER NNA
+0F4F ; [.1C3A.0020.0002.0F4F] # TIBETAN LETTER TA
+0F9F ; [.1C3B.0020.0002.0F9F] # TIBETAN SUBJOINED LETTER TA
+0F50 ; [.1C3C.0020.0002.0F50] # TIBETAN LETTER THA
+0FA0 ; [.1C3D.0020.0002.0FA0] # TIBETAN SUBJOINED LETTER THA
+0F51 ; [.1C3E.0020.0002.0F51] # TIBETAN LETTER DA
+0F52 ; [.1C3E.0020.0002.0F51][.1C65.0020.0002.0FB7] # TIBETAN LETTER DHA; QQCN
+0FA1 ; [.1C3F.0020.0002.0FA1] # TIBETAN SUBJOINED LETTER DA
+0FA2 ; [.1C3F.0020.0002.0FA1][.1C65.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DHA; QQCN
+0F53 ; [.1C40.0020.0002.0F53] # TIBETAN LETTER NA
+0FA3 ; [.1C41.0020.0002.0FA3] # TIBETAN SUBJOINED LETTER NA
+0F54 ; [.1C42.0020.0002.0F54] # TIBETAN LETTER PA
+0FA4 ; [.1C43.0020.0002.0FA4] # TIBETAN SUBJOINED LETTER PA
+0F55 ; [.1C44.0020.0002.0F55] # TIBETAN LETTER PHA
+0FA5 ; [.1C45.0020.0002.0FA5] # TIBETAN SUBJOINED LETTER PHA
+0F56 ; [.1C46.0020.0002.0F56] # TIBETAN LETTER BA
+0F57 ; [.1C46.0020.0002.0F56][.1C65.0020.0002.0FB7] # TIBETAN LETTER BHA; QQCN
+0FA6 ; [.1C47.0020.0002.0FA6] # TIBETAN SUBJOINED LETTER BA
+0FA7 ; [.1C47.0020.0002.0FA6][.1C65.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER BHA; QQCN
+0F58 ; [.1C48.0020.0002.0F58] # TIBETAN LETTER MA
+0FA8 ; [.1C49.0020.0002.0FA8] # TIBETAN SUBJOINED LETTER MA
+0F59 ; [.1C4A.0020.0002.0F59] # TIBETAN LETTER TSA
+0FA9 ; [.1C4B.0020.0002.0FA9] # TIBETAN SUBJOINED LETTER TSA
+0F5A ; [.1C4C.0020.0002.0F5A] # TIBETAN LETTER TSHA
+0FAA ; [.1C4D.0020.0002.0FAA] # TIBETAN SUBJOINED LETTER TSHA
+0F5B ; [.1C4E.0020.0002.0F5B] # TIBETAN LETTER DZA
+0F5C ; [.1C4E.0020.0002.0F5B][.1C65.0020.0002.0FB7] # TIBETAN LETTER DZHA; QQCN
+0FAB ; [.1C4F.0020.0002.0FAB] # TIBETAN SUBJOINED LETTER DZA
+0FAC ; [.1C4F.0020.0002.0FAB][.1C65.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DZHA; QQCN
+0F5D ; [.1C50.0020.0002.0F5D] # TIBETAN LETTER WA
+0FAD ; [.1C51.0020.0002.0FAD] # TIBETAN SUBJOINED LETTER WA
+0FBA ; [.1C51.0020.0004.0FBA][.0000.019A.0004.0FBA] # TIBETAN SUBJOINED LETTER FIXED-FORM WA; QQKN
+0F5E ; [.1C52.0020.0002.0F5E] # TIBETAN LETTER ZHA
+0FAE ; [.1C53.0020.0002.0FAE] # TIBETAN SUBJOINED LETTER ZHA
+0F5F ; [.1C54.0020.0002.0F5F] # TIBETAN LETTER ZA
+0FAF ; [.1C55.0020.0002.0FAF] # TIBETAN SUBJOINED LETTER ZA
+0F60 ; [.1C56.0020.0002.0F60] # TIBETAN LETTER -A
+0FB0 ; [.1C57.0020.0002.0FB0] # TIBETAN SUBJOINED LETTER -A
+0F61 ; [.1C58.0020.0002.0F61] # TIBETAN LETTER YA
+0FB1 ; [.1C59.0020.0002.0FB1] # TIBETAN SUBJOINED LETTER YA
+0FBB ; [.1C59.0020.0004.0FBB][.0000.019A.0004.0FBB] # TIBETAN SUBJOINED LETTER FIXED-FORM YA; QQKN
+0F62 ; [.1C5A.0020.0002.0F62] # TIBETAN LETTER RA
+0F6A ; [.1C5A.0020.0004.0F6A][.0000.019A.0004.0F6A] # TIBETAN LETTER FIXED-FORM RA; QQKN
+0FB2 ; [.1C5B.0020.0002.0FB2] # TIBETAN SUBJOINED LETTER RA
+0FBC ; [.1C5B.0020.0004.0FBC][.0000.019A.0004.0FBC] # TIBETAN SUBJOINED LETTER FIXED-FORM RA; QQKN
+0F63 ; [.1C5C.0020.0002.0F63] # TIBETAN LETTER LA
+0FB3 ; [.1C5D.0020.0002.0FB3] # TIBETAN SUBJOINED LETTER LA
+0F64 ; [.1C5E.0020.0002.0F64] # TIBETAN LETTER SHA
+0FB4 ; [.1C5F.0020.0002.0FB4] # TIBETAN SUBJOINED LETTER SHA
+0F65 ; [.1C60.0020.0002.0F65] # TIBETAN LETTER SSA
+0FB5 ; [.1C61.0020.0002.0FB5] # TIBETAN SUBJOINED LETTER SSA
+0F66 ; [.1C62.0020.0002.0F66] # TIBETAN LETTER SA
+0FB6 ; [.1C63.0020.0002.0FB6] # TIBETAN SUBJOINED LETTER SA
+0F67 ; [.1C64.0020.0002.0F67] # TIBETAN LETTER HA
+0FB7 ; [.1C65.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER HA
+0F68 ; [.1C66.0020.0002.0F68] # TIBETAN LETTER A
+0F00 ; [.1C66.0020.0004.0F00][.1C79.0020.0004.0F00][.0000.015A.001F.0F00] # TIBETAN SYLLABLE OM; QQKN
+0FB8 ; [.1C67.0020.0002.0FB8] # TIBETAN SUBJOINED LETTER A
+0F88 ; [.1C68.0020.0002.0F88] # TIBETAN SIGN LCE TSA CAN
+0F89 ; [.1C69.0020.0002.0F89] # TIBETAN SIGN MCHU CAN
+0F8A ; [.1C6A.0020.0002.0F8A] # TIBETAN SIGN GRU CAN RGYINGS
+0F8B ; [.1C6B.0020.0002.0F8B] # TIBETAN SIGN GRU MED RGYINGS
+0F71 ; [.1C6C.0020.0002.0F71] # TIBETAN VOWEL SIGN AA
+0F72 ; [.1C6D.0020.0002.0F72] # TIBETAN VOWEL SIGN I
+0F73 ; [.1C6E.0020.0002.0F73] # TIBETAN VOWEL SIGN II
+0F71 0F72 ; [.1C6E.0020.0002.0F73] # TIBETAN VOWEL SIGN II
+0F80 ; [.1C6F.0020.0002.0F80] # TIBETAN VOWEL SIGN REVERSED I
+0F81 ; [.1C70.0020.0002.0F81] # TIBETAN VOWEL SIGN REVERSED II
+0F71 0F80 ; [.1C70.0020.0002.0F81] # TIBETAN VOWEL SIGN REVERSED II
+0F74 ; [.1C71.0020.0002.0F74] # TIBETAN VOWEL SIGN U
+0F75 ; [.1C72.0020.0002.0F75] # TIBETAN VOWEL SIGN UU
+0F71 0F74 ; [.1C72.0020.0002.0F75] # TIBETAN VOWEL SIGN UU
+0F76 ; [.1C73.0020.0002.0F76] # TIBETAN VOWEL SIGN VOCALIC R
+0FB2 0F80 ; [.1C73.0020.0002.0F76] # TIBETAN VOWEL SIGN VOCALIC R
+0F77 ; [.1C74.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
+0FB2 0F71 0F80 ; [.1C74.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
+0FB2 0F81 ; [.1C74.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
+0F78 ; [.1C75.0020.0002.0F78] # TIBETAN VOWEL SIGN VOCALIC L
+0FB3 0F80 ; [.1C75.0020.0002.0F78] # TIBETAN VOWEL SIGN VOCALIC L
+0F79 ; [.1C76.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
+0FB3 0F71 0F80 ; [.1C76.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
+0FB3 0F81 ; [.1C76.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
+0F7A ; [.1C77.0020.0002.0F7A] # TIBETAN VOWEL SIGN E
+0F7B ; [.1C78.0020.0002.0F7B] # TIBETAN VOWEL SIGN EE
+0F7C ; [.1C79.0020.0002.0F7C] # TIBETAN VOWEL SIGN O
+0F7D ; [.1C7A.0020.0002.0F7D] # TIBETAN VOWEL SIGN OO
+0F84 ; [.1C7B.0020.0002.0F84] # TIBETAN MARK HALANTA
+A840 ; [.1C7C.0020.0002.A840] # PHAGS-PA LETTER KA
+A841 ; [.1C7D.0020.0002.A841] # PHAGS-PA LETTER KHA
+A842 ; [.1C7E.0020.0002.A842] # PHAGS-PA LETTER GA
+A843 ; [.1C7F.0020.0002.A843] # PHAGS-PA LETTER NGA
+A844 ; [.1C80.0020.0002.A844] # PHAGS-PA LETTER CA
+A845 ; [.1C81.0020.0002.A845] # PHAGS-PA LETTER CHA
+A846 ; [.1C82.0020.0002.A846] # PHAGS-PA LETTER JA
+A847 ; [.1C83.0020.0002.A847] # PHAGS-PA LETTER NYA
+A869 ; [.1C84.0020.0002.A869] # PHAGS-PA LETTER TTA
+A86A ; [.1C85.0020.0002.A86A] # PHAGS-PA LETTER TTHA
+A86B ; [.1C86.0020.0002.A86B] # PHAGS-PA LETTER DDA
+A86C ; [.1C87.0020.0002.A86C] # PHAGS-PA LETTER NNA
+A848 ; [.1C88.0020.0002.A848] # PHAGS-PA LETTER TA
+A849 ; [.1C89.0020.0002.A849] # PHAGS-PA LETTER THA
+A84A ; [.1C8A.0020.0002.A84A] # PHAGS-PA LETTER DA
+A84B ; [.1C8B.0020.0002.A84B] # PHAGS-PA LETTER NA
+A84C ; [.1C8C.0020.0002.A84C] # PHAGS-PA LETTER PA
+A84D ; [.1C8D.0020.0002.A84D] # PHAGS-PA LETTER PHA
+A84E ; [.1C8E.0020.0002.A84E] # PHAGS-PA LETTER BA
+A84F ; [.1C8F.0020.0002.A84F] # PHAGS-PA LETTER MA
+A850 ; [.1C90.0020.0002.A850] # PHAGS-PA LETTER TSA
+A851 ; [.1C91.0020.0002.A851] # PHAGS-PA LETTER TSHA
+A852 ; [.1C92.0020.0002.A852] # PHAGS-PA LETTER DZA
+A853 ; [.1C93.0020.0002.A853] # PHAGS-PA LETTER WA
+A867 ; [.1C94.0020.0002.A867] # PHAGS-PA SUBJOINED LETTER WA
+A854 ; [.1C95.0020.0002.A854] # PHAGS-PA LETTER ZHA
+A855 ; [.1C96.0020.0002.A855] # PHAGS-PA LETTER ZA
+A856 ; [.1C97.0020.0002.A856] # PHAGS-PA LETTER SMALL A
+A857 ; [.1C98.0020.0002.A857] # PHAGS-PA LETTER YA
+A868 ; [.1C99.0020.0002.A868] # PHAGS-PA SUBJOINED LETTER YA
+A86D ; [.1C9A.0020.0002.A86D] # PHAGS-PA LETTER ALTERNATE YA
+A858 ; [.1C9B.0020.0002.A858] # PHAGS-PA LETTER RA
+A871 ; [.1C9C.0020.0002.A871] # PHAGS-PA SUBJOINED LETTER RA
+A872 ; [.1C9D.0020.0002.A872] # PHAGS-PA SUPERFIXED LETTER RA
+A859 ; [.1C9E.0020.0002.A859] # PHAGS-PA LETTER LA
+A85A ; [.1C9F.0020.0002.A85A] # PHAGS-PA LETTER SHA
+A86E ; [.1CA0.0020.0002.A86E] # PHAGS-PA LETTER VOICELESS SHA
+A85B ; [.1CA1.0020.0002.A85B] # PHAGS-PA LETTER SA
+A85C ; [.1CA2.0020.0002.A85C] # PHAGS-PA LETTER HA
+A86F ; [.1CA3.0020.0002.A86F] # PHAGS-PA LETTER VOICED HA
+A870 ; [.1CA4.0020.0002.A870] # PHAGS-PA LETTER ASPIRATED FA
+A85D ; [.1CA5.0020.0002.A85D] # PHAGS-PA LETTER A
+A862 ; [.1CA6.0020.0002.A862] # PHAGS-PA LETTER QA
+A863 ; [.1CA7.0020.0002.A863] # PHAGS-PA LETTER XA
+A864 ; [.1CA8.0020.0002.A864] # PHAGS-PA LETTER FA
+A865 ; [.1CA9.0020.0002.A865] # PHAGS-PA LETTER GGA
+A85E ; [.1CAA.0020.0002.A85E] # PHAGS-PA LETTER I
+A85F ; [.1CAB.0020.0002.A85F] # PHAGS-PA LETTER U
+A860 ; [.1CAC.0020.0002.A860] # PHAGS-PA LETTER E
+A861 ; [.1CAD.0020.0002.A861] # PHAGS-PA LETTER O
+A866 ; [.1CAE.0020.0002.A866] # PHAGS-PA LETTER EE
+A873 ; [.1CAF.0020.0002.A873] # PHAGS-PA LETTER CANDRABINDU
+1900 ; [.1CB0.0020.0002.1900] # LIMBU VOWEL-CARRIER LETTER
+1901 ; [.1CB1.0020.0002.1901] # LIMBU LETTER KA
+1902 ; [.1CB2.0020.0002.1902] # LIMBU LETTER KHA
+1903 ; [.1CB3.0020.0002.1903] # LIMBU LETTER GA
+1904 ; [.1CB4.0020.0002.1904] # LIMBU LETTER GHA
+1905 ; [.1CB5.0020.0002.1905] # LIMBU LETTER NGA
+1906 ; [.1CB6.0020.0002.1906] # LIMBU LETTER CA
+1907 ; [.1CB7.0020.0002.1907] # LIMBU LETTER CHA
+1908 ; [.1CB8.0020.0002.1908] # LIMBU LETTER JA
+1909 ; [.1CB9.0020.0002.1909] # LIMBU LETTER JHA
+190A ; [.1CBA.0020.0002.190A] # LIMBU LETTER YAN
+190B ; [.1CBB.0020.0002.190B] # LIMBU LETTER TA
+190C ; [.1CBC.0020.0002.190C] # LIMBU LETTER THA
+190D ; [.1CBD.0020.0002.190D] # LIMBU LETTER DA
+190E ; [.1CBE.0020.0002.190E] # LIMBU LETTER DHA
+190F ; [.1CBF.0020.0002.190F] # LIMBU LETTER NA
+1910 ; [.1CC0.0020.0002.1910] # LIMBU LETTER PA
+1911 ; [.1CC1.0020.0002.1911] # LIMBU LETTER PHA
+1912 ; [.1CC2.0020.0002.1912] # LIMBU LETTER BA
+1913 ; [.1CC3.0020.0002.1913] # LIMBU LETTER BHA
+1914 ; [.1CC4.0020.0002.1914] # LIMBU LETTER MA
+1915 ; [.1CC5.0020.0002.1915] # LIMBU LETTER YA
+1916 ; [.1CC6.0020.0002.1916] # LIMBU LETTER RA
+1917 ; [.1CC7.0020.0002.1917] # LIMBU LETTER LA
+1918 ; [.1CC8.0020.0002.1918] # LIMBU LETTER WA
+1919 ; [.1CC9.0020.0002.1919] # LIMBU LETTER SHA
+191A ; [.1CCA.0020.0002.191A] # LIMBU LETTER SSA
+191B ; [.1CCB.0020.0002.191B] # LIMBU LETTER SA
+191C ; [.1CCC.0020.0002.191C] # LIMBU LETTER HA
+1920 ; [.1CCD.0020.0002.1920] # LIMBU VOWEL SIGN A
+1921 ; [.1CCE.0020.0002.1921] # LIMBU VOWEL SIGN I
+1922 ; [.1CCF.0020.0002.1922] # LIMBU VOWEL SIGN U
+1923 ; [.1CD0.0020.0002.1923] # LIMBU VOWEL SIGN EE
+1924 ; [.1CD1.0020.0002.1924] # LIMBU VOWEL SIGN AI
+1925 ; [.1CD2.0020.0002.1925] # LIMBU VOWEL SIGN OO
+1926 ; [.1CD3.0020.0002.1926] # LIMBU VOWEL SIGN AU
+1927 ; [.1CD4.0020.0002.1927] # LIMBU VOWEL SIGN E
+1928 ; [.1CD5.0020.0002.1928] # LIMBU VOWEL SIGN O
+1929 ; [.1CD6.0020.0002.1929] # LIMBU SUBJOINED LETTER YA
+192A ; [.1CD7.0020.0002.192A] # LIMBU SUBJOINED LETTER RA
+192B ; [.1CD8.0020.0002.192B] # LIMBU SUBJOINED LETTER WA
+1930 ; [.1CD9.0020.0002.1930] # LIMBU SMALL LETTER KA
+1931 ; [.1CDA.0020.0002.1931] # LIMBU SMALL LETTER NGA
+1932 ; [.1CDB.0020.0002.1932] # LIMBU SMALL LETTER ANUSVARA
+1933 ; [.1CDC.0020.0002.1933] # LIMBU SMALL LETTER TA
+1934 ; [.1CDD.0020.0002.1934] # LIMBU SMALL LETTER NA
+1935 ; [.1CDE.0020.0002.1935] # LIMBU SMALL LETTER PA
+1936 ; [.1CDF.0020.0002.1936] # LIMBU SMALL LETTER MA
+1937 ; [.1CE0.0020.0002.1937] # LIMBU SMALL LETTER RA
+1938 ; [.1CE1.0020.0002.1938] # LIMBU SMALL LETTER LA
+1700 ; [.1CE2.0020.0002.1700] # TAGALOG LETTER A
+1701 ; [.1CE3.0020.0002.1701] # TAGALOG LETTER I
+1702 ; [.1CE4.0020.0002.1702] # TAGALOG LETTER U
+1703 ; [.1CE5.0020.0002.1703] # TAGALOG LETTER KA
+1704 ; [.1CE6.0020.0002.1704] # TAGALOG LETTER GA
+1705 ; [.1CE7.0020.0002.1705] # TAGALOG LETTER NGA
+1706 ; [.1CE8.0020.0002.1706] # TAGALOG LETTER TA
+1707 ; [.1CE9.0020.0002.1707] # TAGALOG LETTER DA
+1708 ; [.1CEA.0020.0002.1708] # TAGALOG LETTER NA
+1709 ; [.1CEB.0020.0002.1709] # TAGALOG LETTER PA
+170A ; [.1CEC.0020.0002.170A] # TAGALOG LETTER BA
+170B ; [.1CED.0020.0002.170B] # TAGALOG LETTER MA
+170C ; [.1CEE.0020.0002.170C] # TAGALOG LETTER YA
+170E ; [.1CEF.0020.0002.170E] # TAGALOG LETTER LA
+170F ; [.1CF0.0020.0002.170F] # TAGALOG LETTER WA
+1710 ; [.1CF1.0020.0002.1710] # TAGALOG LETTER SA
+1711 ; [.1CF2.0020.0002.1711] # TAGALOG LETTER HA
+1712 ; [.1CF3.0020.0002.1712] # TAGALOG VOWEL SIGN I
+1713 ; [.1CF4.0020.0002.1713] # TAGALOG VOWEL SIGN U
+1714 ; [.1CF5.0020.0002.1714] # TAGALOG SIGN VIRAMA
+1720 ; [.1CF6.0020.0002.1720] # HANUNOO LETTER A
+1721 ; [.1CF7.0020.0002.1721] # HANUNOO LETTER I
+1722 ; [.1CF8.0020.0002.1722] # HANUNOO LETTER U
+1723 ; [.1CF9.0020.0002.1723] # HANUNOO LETTER KA
+1724 ; [.1CFA.0020.0002.1724] # HANUNOO LETTER GA
+1725 ; [.1CFB.0020.0002.1725] # HANUNOO LETTER NGA
+1726 ; [.1CFC.0020.0002.1726] # HANUNOO LETTER TA
+1727 ; [.1CFD.0020.0002.1727] # HANUNOO LETTER DA
+1728 ; [.1CFE.0020.0002.1728] # HANUNOO LETTER NA
+1729 ; [.1CFF.0020.0002.1729] # HANUNOO LETTER PA
+172A ; [.1D00.0020.0002.172A] # HANUNOO LETTER BA
+172B ; [.1D01.0020.0002.172B] # HANUNOO LETTER MA
+172C ; [.1D02.0020.0002.172C] # HANUNOO LETTER YA
+172D ; [.1D03.0020.0002.172D] # HANUNOO LETTER RA
+172E ; [.1D04.0020.0002.172E] # HANUNOO LETTER LA
+172F ; [.1D05.0020.0002.172F] # HANUNOO LETTER WA
+1730 ; [.1D06.0020.0002.1730] # HANUNOO LETTER SA
+1731 ; [.1D07.0020.0002.1731] # HANUNOO LETTER HA
+1732 ; [.1D08.0020.0002.1732] # HANUNOO VOWEL SIGN I
+1733 ; [.1D09.0020.0002.1733] # HANUNOO VOWEL SIGN U
+1734 ; [.1D0A.0020.0002.1734] # HANUNOO SIGN PAMUDPOD
+1740 ; [.1D0B.0020.0002.1740] # BUHID LETTER A
+1741 ; [.1D0C.0020.0002.1741] # BUHID LETTER I
+1742 ; [.1D0D.0020.0002.1742] # BUHID LETTER U
+1743 ; [.1D0E.0020.0002.1743] # BUHID LETTER KA
+1744 ; [.1D0F.0020.0002.1744] # BUHID LETTER GA
+1745 ; [.1D10.0020.0002.1745] # BUHID LETTER NGA
+1746 ; [.1D11.0020.0002.1746] # BUHID LETTER TA
+1747 ; [.1D12.0020.0002.1747] # BUHID LETTER DA
+1748 ; [.1D13.0020.0002.1748] # BUHID LETTER NA
+1749 ; [.1D14.0020.0002.1749] # BUHID LETTER PA
+174A ; [.1D15.0020.0002.174A] # BUHID LETTER BA
+174B ; [.1D16.0020.0002.174B] # BUHID LETTER MA
+174C ; [.1D17.0020.0002.174C] # BUHID LETTER YA
+174D ; [.1D18.0020.0002.174D] # BUHID LETTER RA
+174E ; [.1D19.0020.0002.174E] # BUHID LETTER LA
+174F ; [.1D1A.0020.0002.174F] # BUHID LETTER WA
+1750 ; [.1D1B.0020.0002.1750] # BUHID LETTER SA
+1751 ; [.1D1C.0020.0002.1751] # BUHID LETTER HA
+1752 ; [.1D1D.0020.0002.1752] # BUHID VOWEL SIGN I
+1753 ; [.1D1E.0020.0002.1753] # BUHID VOWEL SIGN U
+1760 ; [.1D1F.0020.0002.1760] # TAGBANWA LETTER A
+1761 ; [.1D20.0020.0002.1761] # TAGBANWA LETTER I
+1762 ; [.1D21.0020.0002.1762] # TAGBANWA LETTER U
+1763 ; [.1D22.0020.0002.1763] # TAGBANWA LETTER KA
+1764 ; [.1D23.0020.0002.1764] # TAGBANWA LETTER GA
+1765 ; [.1D24.0020.0002.1765] # TAGBANWA LETTER NGA
+1766 ; [.1D25.0020.0002.1766] # TAGBANWA LETTER TA
+1767 ; [.1D26.0020.0002.1767] # TAGBANWA LETTER DA
+1768 ; [.1D27.0020.0002.1768] # TAGBANWA LETTER NA
+1769 ; [.1D28.0020.0002.1769] # TAGBANWA LETTER PA
+176A ; [.1D29.0020.0002.176A] # TAGBANWA LETTER BA
+176B ; [.1D2A.0020.0002.176B] # TAGBANWA LETTER MA
+176C ; [.1D2B.0020.0002.176C] # TAGBANWA LETTER YA
+176E ; [.1D2C.0020.0002.176E] # TAGBANWA LETTER LA
+176F ; [.1D2D.0020.0002.176F] # TAGBANWA LETTER WA
+1770 ; [.1D2E.0020.0002.1770] # TAGBANWA LETTER SA
+1772 ; [.1D2F.0020.0002.1772] # TAGBANWA VOWEL SIGN I
+1773 ; [.1D30.0020.0002.1773] # TAGBANWA VOWEL SIGN U
+1A00 ; [.1D31.0020.0002.1A00] # BUGINESE LETTER KA
+1A01 ; [.1D32.0020.0002.1A01] # BUGINESE LETTER GA
+1A02 ; [.1D33.0020.0002.1A02] # BUGINESE LETTER NGA
+1A03 ; [.1D34.0020.0002.1A03] # BUGINESE LETTER NGKA
+1A04 ; [.1D35.0020.0002.1A04] # BUGINESE LETTER PA
+1A05 ; [.1D36.0020.0002.1A05] # BUGINESE LETTER BA
+1A06 ; [.1D37.0020.0002.1A06] # BUGINESE LETTER MA
+1A07 ; [.1D38.0020.0002.1A07] # BUGINESE LETTER MPA
+1A08 ; [.1D39.0020.0002.1A08] # BUGINESE LETTER TA
+1A09 ; [.1D3A.0020.0002.1A09] # BUGINESE LETTER DA
+1A0A ; [.1D3B.0020.0002.1A0A] # BUGINESE LETTER NA
+1A0B ; [.1D3C.0020.0002.1A0B] # BUGINESE LETTER NRA
+1A0C ; [.1D3D.0020.0002.1A0C] # BUGINESE LETTER CA
+1A0D ; [.1D3E.0020.0002.1A0D] # BUGINESE LETTER JA
+1A0E ; [.1D3F.0020.0002.1A0E] # BUGINESE LETTER NYA
+1A0F ; [.1D40.0020.0002.1A0F] # BUGINESE LETTER NYCA
+1A10 ; [.1D41.0020.0002.1A10] # BUGINESE LETTER YA
+1A11 ; [.1D42.0020.0002.1A11] # BUGINESE LETTER RA
+1A12 ; [.1D43.0020.0002.1A12] # BUGINESE LETTER LA
+1A13 ; [.1D44.0020.0002.1A13] # BUGINESE LETTER VA
+1A14 ; [.1D45.0020.0002.1A14] # BUGINESE LETTER SA
+1A15 ; [.1D46.0020.0002.1A15] # BUGINESE LETTER A
+1A16 ; [.1D47.0020.0002.1A16] # BUGINESE LETTER HA
+1A17 ; [.1D48.0020.0002.1A17] # BUGINESE VOWEL SIGN I
+1A18 ; [.1D49.0020.0002.1A18] # BUGINESE VOWEL SIGN U
+1A19 ; [.1D4A.0020.0002.1A19] # BUGINESE VOWEL SIGN E
+1A1A ; [.1D4B.0020.0002.1A1A] # BUGINESE VOWEL SIGN O
+1A1B ; [.1D4C.0020.0002.1A1B] # BUGINESE VOWEL SIGN AE
+1000 ; [.1D4D.0020.0002.1000] # MYANMAR LETTER KA
+1001 ; [.1D4E.0020.0002.1001] # MYANMAR LETTER KHA
+1002 ; [.1D4F.0020.0002.1002] # MYANMAR LETTER GA
+1003 ; [.1D50.0020.0002.1003] # MYANMAR LETTER GHA
+1004 ; [.1D51.0020.0002.1004] # MYANMAR LETTER NGA
+1005 ; [.1D52.0020.0002.1005] # MYANMAR LETTER CA
+1006 ; [.1D53.0020.0002.1006] # MYANMAR LETTER CHA
+1007 ; [.1D54.0020.0002.1007] # MYANMAR LETTER JA
+1008 ; [.1D55.0020.0002.1008] # MYANMAR LETTER JHA
+1009 ; [.1D56.0020.0002.1009] # MYANMAR LETTER NYA
+100A ; [.1D57.0020.0002.100A] # MYANMAR LETTER NNYA
+100B ; [.1D58.0020.0002.100B] # MYANMAR LETTER TTA
+100C ; [.1D59.0020.0002.100C] # MYANMAR LETTER TTHA
+100D ; [.1D5A.0020.0002.100D] # MYANMAR LETTER DDA
+100E ; [.1D5B.0020.0002.100E] # MYANMAR LETTER DDHA
+100F ; [.1D5C.0020.0002.100F] # MYANMAR LETTER NNA
+1010 ; [.1D5D.0020.0002.1010] # MYANMAR LETTER TA
+1011 ; [.1D5E.0020.0002.1011] # MYANMAR LETTER THA
+1012 ; [.1D5F.0020.0002.1012] # MYANMAR LETTER DA
+1013 ; [.1D60.0020.0002.1013] # MYANMAR LETTER DHA
+1014 ; [.1D61.0020.0002.1014] # MYANMAR LETTER NA
+1015 ; [.1D62.0020.0002.1015] # MYANMAR LETTER PA
+1016 ; [.1D63.0020.0002.1016] # MYANMAR LETTER PHA
+1017 ; [.1D64.0020.0002.1017] # MYANMAR LETTER BA
+1018 ; [.1D65.0020.0002.1018] # MYANMAR LETTER BHA
+1019 ; [.1D66.0020.0002.1019] # MYANMAR LETTER MA
+101A ; [.1D67.0020.0002.101A] # MYANMAR LETTER YA
+101B ; [.1D68.0020.0002.101B] # MYANMAR LETTER RA
+101C ; [.1D69.0020.0002.101C] # MYANMAR LETTER LA
+101D ; [.1D6A.0020.0002.101D] # MYANMAR LETTER WA
+1050 ; [.1D6B.0020.0002.1050] # MYANMAR LETTER SHA
+1051 ; [.1D6C.0020.0002.1051] # MYANMAR LETTER SSA
+101E ; [.1D6D.0020.0002.101E] # MYANMAR LETTER SA
+101F ; [.1D6E.0020.0002.101F] # MYANMAR LETTER HA
+1020 ; [.1D6F.0020.0002.1020] # MYANMAR LETTER LLA
+1021 ; [.1D70.0020.0002.1021] # MYANMAR LETTER A
+1023 ; [.1D71.0020.0002.1023] # MYANMAR LETTER I
+1024 ; [.1D72.0020.0002.1024] # MYANMAR LETTER II
+1025 ; [.1D73.0020.0002.1025] # MYANMAR LETTER U
+1026 ; [.1D74.0020.0002.1026] # MYANMAR LETTER UU
+1025 102E ; [.1D74.0020.0002.1026] # MYANMAR LETTER UU
+1027 ; [.1D75.0020.0002.1027] # MYANMAR LETTER E
+1029 ; [.1D76.0020.0002.1029] # MYANMAR LETTER O
+102A ; [.1D77.0020.0002.102A] # MYANMAR LETTER AU
+1052 ; [.1D78.0020.0002.1052] # MYANMAR LETTER VOCALIC R
+1053 ; [.1D79.0020.0002.1053] # MYANMAR LETTER VOCALIC RR
+1054 ; [.1D7A.0020.0002.1054] # MYANMAR LETTER VOCALIC L
+1055 ; [.1D7B.0020.0002.1055] # MYANMAR LETTER VOCALIC LL
+102C ; [.1D7C.0020.0002.102C] # MYANMAR VOWEL SIGN AA
+102D ; [.1D7D.0020.0002.102D] # MYANMAR VOWEL SIGN I
+102E ; [.1D7E.0020.0002.102E] # MYANMAR VOWEL SIGN II
+102F ; [.1D7F.0020.0002.102F] # MYANMAR VOWEL SIGN U
+1030 ; [.1D80.0020.0002.1030] # MYANMAR VOWEL SIGN UU
+1031 ; [.1D81.0020.0002.1031] # MYANMAR VOWEL SIGN E
+1032 ; [.1D82.0020.0002.1032] # MYANMAR VOWEL SIGN AI
+1056 ; [.1D83.0020.0002.1056] # MYANMAR VOWEL SIGN VOCALIC R
+1057 ; [.1D84.0020.0002.1057] # MYANMAR VOWEL SIGN VOCALIC RR
+1058 ; [.1D85.0020.0002.1058] # MYANMAR VOWEL SIGN VOCALIC L
+1059 ; [.1D86.0020.0002.1059] # MYANMAR VOWEL SIGN VOCALIC LL
+1039 ; [.1D87.0020.0002.1039] # MYANMAR SIGN VIRAMA
+1780 ; [.1D88.0020.0002.1780] # KHMER LETTER KA
+1781 ; [.1D89.0020.0002.1781] # KHMER LETTER KHA
+1782 ; [.1D8A.0020.0002.1782] # KHMER LETTER KO
+1783 ; [.1D8B.0020.0002.1783] # KHMER LETTER KHO
+1784 ; [.1D8C.0020.0002.1784] # KHMER LETTER NGO
+1785 ; [.1D8D.0020.0002.1785] # KHMER LETTER CA
+1786 ; [.1D8E.0020.0002.1786] # KHMER LETTER CHA
+1787 ; [.1D8F.0020.0002.1787] # KHMER LETTER CO
+1788 ; [.1D90.0020.0002.1788] # KHMER LETTER CHO
+1789 ; [.1D91.0020.0002.1789] # KHMER LETTER NYO
+178A ; [.1D92.0020.0002.178A] # KHMER LETTER DA
+178B ; [.1D93.0020.0002.178B] # KHMER LETTER TTHA
+178C ; [.1D94.0020.0002.178C] # KHMER LETTER DO
+178D ; [.1D95.0020.0002.178D] # KHMER LETTER TTHO
+178E ; [.1D96.0020.0002.178E] # KHMER LETTER NNO
+178F ; [.1D97.0020.0002.178F] # KHMER LETTER TA
+1790 ; [.1D98.0020.0002.1790] # KHMER LETTER THA
+1791 ; [.1D99.0020.0002.1791] # KHMER LETTER TO
+1792 ; [.1D9A.0020.0002.1792] # KHMER LETTER THO
+1793 ; [.1D9B.0020.0002.1793] # KHMER LETTER NO
+1794 ; [.1D9C.0020.0002.1794] # KHMER LETTER BA
+1795 ; [.1D9D.0020.0002.1795] # KHMER LETTER PHA
+1796 ; [.1D9E.0020.0002.1796] # KHMER LETTER PO
+1797 ; [.1D9F.0020.0002.1797] # KHMER LETTER PHO
+1798 ; [.1DA0.0020.0002.1798] # KHMER LETTER MO
+1799 ; [.1DA1.0020.0002.1799] # KHMER LETTER YO
+179A ; [.1DA2.0020.0002.179A] # KHMER LETTER RO
+179B ; [.1DA3.0020.0002.179B] # KHMER LETTER LO
+179C ; [.1DA4.0020.0002.179C] # KHMER LETTER VO
+179D ; [.1DA5.0020.0002.179D] # KHMER LETTER SHA
+179E ; [.1DA6.0020.0002.179E] # KHMER LETTER SSO
+179F ; [.1DA7.0020.0002.179F] # KHMER LETTER SA
+17A0 ; [.1DA8.0020.0002.17A0] # KHMER LETTER HA
+17A1 ; [.1DA9.0020.0002.17A1] # KHMER LETTER LA
+17A2 ; [.1DAA.0020.0002.17A2] # KHMER LETTER QA
+17DC ; [.1DAB.0020.0002.17DC] # KHMER SIGN AVAKRAHASANYA
+17A3 ; [.1DAC.0020.0002.17A3] # KHMER INDEPENDENT VOWEL QAQ
+17A4 ; [.1DAD.0020.0002.17A4] # KHMER INDEPENDENT VOWEL QAA
+17A5 ; [.1DAE.0020.0002.17A5] # KHMER INDEPENDENT VOWEL QI
+17A6 ; [.1DAF.0020.0002.17A6] # KHMER INDEPENDENT VOWEL QII
+17A7 ; [.1DB0.0020.0002.17A7] # KHMER INDEPENDENT VOWEL QU
+17A8 ; [.1DB1.0020.0002.17A8] # KHMER INDEPENDENT VOWEL QUK
+17A9 ; [.1DB2.0020.0002.17A9] # KHMER INDEPENDENT VOWEL QUU
+17AA ; [.1DB3.0020.0002.17AA] # KHMER INDEPENDENT VOWEL QUUV
+17AB ; [.1DB4.0020.0002.17AB] # KHMER INDEPENDENT VOWEL RY
+17AC ; [.1DB5.0020.0002.17AC] # KHMER INDEPENDENT VOWEL RYY
+17AD ; [.1DB6.0020.0002.17AD] # KHMER INDEPENDENT VOWEL LY
+17AE ; [.1DB7.0020.0002.17AE] # KHMER INDEPENDENT VOWEL LYY
+17AF ; [.1DB8.0020.0002.17AF] # KHMER INDEPENDENT VOWEL QE
+17B0 ; [.1DB9.0020.0002.17B0] # KHMER INDEPENDENT VOWEL QAI
+17B1 ; [.1DBA.0020.0002.17B1] # KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2 ; [.1DBB.0020.0002.17B2] # KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3 ; [.1DBC.0020.0002.17B3] # KHMER INDEPENDENT VOWEL QAU
+17B4 ; [.1DBD.0020.0002.17B4] # KHMER VOWEL INHERENT AQ
+17B5 ; [.1DBE.0020.0002.17B5] # KHMER VOWEL INHERENT AA
+17B6 ; [.1DBF.0020.0002.17B6] # KHMER VOWEL SIGN AA
+17B7 ; [.1DC0.0020.0002.17B7] # KHMER VOWEL SIGN I
+17B8 ; [.1DC1.0020.0002.17B8] # KHMER VOWEL SIGN II
+17B9 ; [.1DC2.0020.0002.17B9] # KHMER VOWEL SIGN Y
+17BA ; [.1DC3.0020.0002.17BA] # KHMER VOWEL SIGN YY
+17BB ; [.1DC4.0020.0002.17BB] # KHMER VOWEL SIGN U
+17BC ; [.1DC5.0020.0002.17BC] # KHMER VOWEL SIGN UU
+17BD ; [.1DC6.0020.0002.17BD] # KHMER VOWEL SIGN UA
+17BE ; [.1DC7.0020.0002.17BE] # KHMER VOWEL SIGN OE
+17BF ; [.1DC8.0020.0002.17BF] # KHMER VOWEL SIGN YA
+17C0 ; [.1DC9.0020.0002.17C0] # KHMER VOWEL SIGN IE
+17C1 ; [.1DCA.0020.0002.17C1] # KHMER VOWEL SIGN E
+17C2 ; [.1DCB.0020.0002.17C2] # KHMER VOWEL SIGN AE
+17C3 ; [.1DCC.0020.0002.17C3] # KHMER VOWEL SIGN AI
+17C4 ; [.1DCD.0020.0002.17C4] # KHMER VOWEL SIGN OO
+17C5 ; [.1DCE.0020.0002.17C5] # KHMER VOWEL SIGN AU
+17D2 ; [.1DCF.0020.0002.17D2] # KHMER SIGN COENG
+1950 ; [.1DD0.0020.0002.1950] # TAI LE LETTER KA
+1951 ; [.1DD1.0020.0002.1951] # TAI LE LETTER XA
+1952 ; [.1DD2.0020.0002.1952] # TAI LE LETTER NGA
+1953 ; [.1DD3.0020.0002.1953] # TAI LE LETTER TSA
+1954 ; [.1DD4.0020.0002.1954] # TAI LE LETTER SA
+1955 ; [.1DD5.0020.0002.1955] # TAI LE LETTER YA
+1956 ; [.1DD6.0020.0002.1956] # TAI LE LETTER TA
+1957 ; [.1DD7.0020.0002.1957] # TAI LE LETTER THA
+1958 ; [.1DD8.0020.0002.1958] # TAI LE LETTER LA
+1959 ; [.1DD9.0020.0002.1959] # TAI LE LETTER PA
+195A ; [.1DDA.0020.0002.195A] # TAI LE LETTER PHA
+195B ; [.1DDB.0020.0002.195B] # TAI LE LETTER MA
+195C ; [.1DDC.0020.0002.195C] # TAI LE LETTER FA
+195D ; [.1DDD.0020.0002.195D] # TAI LE LETTER VA
+195E ; [.1DDE.0020.0002.195E] # TAI LE LETTER HA
+195F ; [.1DDF.0020.0002.195F] # TAI LE LETTER QA
+1960 ; [.1DE0.0020.0002.1960] # TAI LE LETTER KHA
+1961 ; [.1DE1.0020.0002.1961] # TAI LE LETTER TSHA
+1962 ; [.1DE2.0020.0002.1962] # TAI LE LETTER NA
+1963 ; [.1DE3.0020.0002.1963] # TAI LE LETTER A
+1964 ; [.1DE4.0020.0002.1964] # TAI LE LETTER I
+1965 ; [.1DE5.0020.0002.1965] # TAI LE LETTER EE
+1966 ; [.1DE6.0020.0002.1966] # TAI LE LETTER EH
+1967 ; [.1DE7.0020.0002.1967] # TAI LE LETTER U
+1968 ; [.1DE8.0020.0002.1968] # TAI LE LETTER OO
+1969 ; [.1DE9.0020.0002.1969] # TAI LE LETTER O
+196A ; [.1DEA.0020.0002.196A] # TAI LE LETTER UE
+196B ; [.1DEB.0020.0002.196B] # TAI LE LETTER E
+196C ; [.1DEC.0020.0002.196C] # TAI LE LETTER AUE
+196D ; [.1DED.0020.0002.196D] # TAI LE LETTER AI
+1970 ; [.1DEE.0020.0002.1970] # TAI LE LETTER TONE-2
+1971 ; [.1DEF.0020.0002.1971] # TAI LE LETTER TONE-3
+1972 ; [.1DF0.0020.0002.1972] # TAI LE LETTER TONE-4
+1973 ; [.1DF1.0020.0002.1973] # TAI LE LETTER TONE-5
+1974 ; [.1DF2.0020.0002.1974] # TAI LE LETTER TONE-6
+1980 ; [.1DF3.0020.0002.1980] # NEW TAI LUE LETTER HIGH QA
+1981 ; [.1DF4.0020.0002.1981] # NEW TAI LUE LETTER LOW QA
+1982 ; [.1DF5.0020.0002.1982] # NEW TAI LUE LETTER HIGH KA
+1983 ; [.1DF6.0020.0002.1983] # NEW TAI LUE LETTER HIGH XA
+1984 ; [.1DF7.0020.0002.1984] # NEW TAI LUE LETTER HIGH NGA
+1985 ; [.1DF8.0020.0002.1985] # NEW TAI LUE LETTER LOW KA
+1986 ; [.1DF9.0020.0002.1986] # NEW TAI LUE LETTER LOW XA
+1987 ; [.1DFA.0020.0002.1987] # NEW TAI LUE LETTER LOW NGA
+1988 ; [.1DFB.0020.0002.1988] # NEW TAI LUE LETTER HIGH TSA
+1989 ; [.1DFC.0020.0002.1989] # NEW TAI LUE LETTER HIGH SA
+198A ; [.1DFD.0020.0002.198A] # NEW TAI LUE LETTER HIGH YA
+198B ; [.1DFE.0020.0002.198B] # NEW TAI LUE LETTER LOW TSA
+198C ; [.1DFF.0020.0002.198C] # NEW TAI LUE LETTER LOW SA
+198D ; [.1E00.0020.0002.198D] # NEW TAI LUE LETTER LOW YA
+198E ; [.1E01.0020.0002.198E] # NEW TAI LUE LETTER HIGH TA
+198F ; [.1E02.0020.0002.198F] # NEW TAI LUE LETTER HIGH THA
+1990 ; [.1E03.0020.0002.1990] # NEW TAI LUE LETTER HIGH NA
+1991 ; [.1E04.0020.0002.1991] # NEW TAI LUE LETTER LOW TA
+1992 ; [.1E05.0020.0002.1992] # NEW TAI LUE LETTER LOW THA
+1993 ; [.1E06.0020.0002.1993] # NEW TAI LUE LETTER LOW NA
+1994 ; [.1E07.0020.0002.1994] # NEW TAI LUE LETTER HIGH PA
+1995 ; [.1E08.0020.0002.1995] # NEW TAI LUE LETTER HIGH PHA
+1996 ; [.1E09.0020.0002.1996] # NEW TAI LUE LETTER HIGH MA
+1997 ; [.1E0A.0020.0002.1997] # NEW TAI LUE LETTER LOW PA
+1998 ; [.1E0B.0020.0002.1998] # NEW TAI LUE LETTER LOW PHA
+1999 ; [.1E0C.0020.0002.1999] # NEW TAI LUE LETTER LOW MA
+199A ; [.1E0D.0020.0002.199A] # NEW TAI LUE LETTER HIGH FA
+199B ; [.1E0E.0020.0002.199B] # NEW TAI LUE LETTER HIGH VA
+199C ; [.1E0F.0020.0002.199C] # NEW TAI LUE LETTER HIGH LA
+19DE ; [.1E0F.0020.0004.19DE][.1E23.0020.0004.19DE] # NEW TAI LUE SIGN LAE; QQKN
+19DF ; [.1E0F.0020.0004.19DF][.1E23.0020.0004.19DF][.1E2E.0020.001F.19DF] # NEW TAI LUE SIGN LAEV; QQKN
+199D ; [.1E10.0020.0002.199D] # NEW TAI LUE LETTER LOW FA
+199E ; [.1E11.0020.0002.199E] # NEW TAI LUE LETTER LOW VA
+199F ; [.1E12.0020.0002.199F] # NEW TAI LUE LETTER LOW LA
+19A0 ; [.1E13.0020.0002.19A0] # NEW TAI LUE LETTER HIGH HA
+19A1 ; [.1E14.0020.0002.19A1] # NEW TAI LUE LETTER HIGH DA
+19A2 ; [.1E15.0020.0002.19A2] # NEW TAI LUE LETTER HIGH BA
+19A3 ; [.1E16.0020.0002.19A3] # NEW TAI LUE LETTER LOW HA
+19A4 ; [.1E17.0020.0002.19A4] # NEW TAI LUE LETTER LOW DA
+19A5 ; [.1E18.0020.0002.19A5] # NEW TAI LUE LETTER LOW BA
+19A6 ; [.1E19.0020.0002.19A6] # NEW TAI LUE LETTER HIGH KVA
+19A7 ; [.1E1A.0020.0002.19A7] # NEW TAI LUE LETTER HIGH XVA
+19A8 ; [.1E1B.0020.0002.19A8] # NEW TAI LUE LETTER LOW KVA
+19A9 ; [.1E1C.0020.0002.19A9] # NEW TAI LUE LETTER LOW XVA
+19B0 ; [.1E1D.0020.0002.19B0] # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
+19B1 ; [.1E1E.0020.0002.19B1] # NEW TAI LUE VOWEL SIGN AA
+19B2 ; [.1E1F.0020.0002.19B2] # NEW TAI LUE VOWEL SIGN II
+19B3 ; [.1E20.0020.0002.19B3] # NEW TAI LUE VOWEL SIGN U
+19B4 ; [.1E21.0020.0002.19B4] # NEW TAI LUE VOWEL SIGN UU
+19B5 ; [.1E22.0020.0002.19B5] # NEW TAI LUE VOWEL SIGN E
+19B6 ; [.1E23.0020.0002.19B6] # NEW TAI LUE VOWEL SIGN AE
+19B7 ; [.1E24.0020.0002.19B7] # NEW TAI LUE VOWEL SIGN O
+19B8 ; [.1E25.0020.0002.19B8] # NEW TAI LUE VOWEL SIGN OA
+19B9 ; [.1E26.0020.0002.19B9] # NEW TAI LUE VOWEL SIGN UE
+19BA ; [.1E27.0020.0002.19BA] # NEW TAI LUE VOWEL SIGN AY
+19BB ; [.1E28.0020.0002.19BB] # NEW TAI LUE VOWEL SIGN AAY
+19BC ; [.1E29.0020.0002.19BC] # NEW TAI LUE VOWEL SIGN UY
+19BD ; [.1E2A.0020.0002.19BD] # NEW TAI LUE VOWEL SIGN OY
+19BE ; [.1E2B.0020.0002.19BE] # NEW TAI LUE VOWEL SIGN OAY
+19BF ; [.1E2C.0020.0002.19BF] # NEW TAI LUE VOWEL SIGN UEY
+19C0 ; [.1E2D.0020.0002.19C0] # NEW TAI LUE VOWEL SIGN IY
+19C1 ; [.1E2E.0020.0002.19C1] # NEW TAI LUE LETTER FINAL V
+19C2 ; [.1E2F.0020.0002.19C2] # NEW TAI LUE LETTER FINAL NG
+19C3 ; [.1E30.0020.0002.19C3] # NEW TAI LUE LETTER FINAL N
+19C4 ; [.1E31.0020.0002.19C4] # NEW TAI LUE LETTER FINAL M
+19C5 ; [.1E32.0020.0002.19C5] # NEW TAI LUE LETTER FINAL K
+19C6 ; [.1E33.0020.0002.19C6] # NEW TAI LUE LETTER FINAL D
+19C7 ; [.1E34.0020.0002.19C7] # NEW TAI LUE LETTER FINAL B
+19C8 ; [.1E35.0020.0002.19C8] # NEW TAI LUE TONE MARK-1
+19C9 ; [.1E36.0020.0002.19C9] # NEW TAI LUE TONE MARK-2
+1B05 ; [.1E37.0020.0002.1B05] # BALINESE LETTER AKARA
+1B06 ; [.1E38.0020.0002.1B06] # BALINESE LETTER AKARA TEDUNG
+1B05 1B35 ; [.1E38.0020.0002.1B06] # BALINESE LETTER AKARA TEDUNG
+1B07 ; [.1E39.0020.0002.1B07] # BALINESE LETTER IKARA
+1B08 ; [.1E3A.0020.0002.1B08] # BALINESE LETTER IKARA TEDUNG
+1B07 1B35 ; [.1E3A.0020.0002.1B08] # BALINESE LETTER IKARA TEDUNG
+1B09 ; [.1E3B.0020.0002.1B09] # BALINESE LETTER UKARA
+1B0A ; [.1E3C.0020.0002.1B0A] # BALINESE LETTER UKARA TEDUNG
+1B09 1B35 ; [.1E3C.0020.0002.1B0A] # BALINESE LETTER UKARA TEDUNG
+1B0B ; [.1E3D.0020.0002.1B0B] # BALINESE LETTER RA REPA
+1B0C ; [.1E3E.0020.0002.1B0C] # BALINESE LETTER RA REPA TEDUNG
+1B0B 1B35 ; [.1E3E.0020.0002.1B0C] # BALINESE LETTER RA REPA TEDUNG
+1B0D ; [.1E3F.0020.0002.1B0D] # BALINESE LETTER LA LENGA
+1B0E ; [.1E40.0020.0002.1B0E] # BALINESE LETTER LA LENGA TEDUNG
+1B0D 1B35 ; [.1E40.0020.0002.1B0E] # BALINESE LETTER LA LENGA TEDUNG
+1B0F ; [.1E41.0020.0002.1B0F] # BALINESE LETTER EKARA
+1B10 ; [.1E42.0020.0002.1B10] # BALINESE LETTER AIKARA
+1B11 ; [.1E43.0020.0002.1B11] # BALINESE LETTER OKARA
+1B12 ; [.1E44.0020.0002.1B12] # BALINESE LETTER OKARA TEDUNG
+1B11 1B35 ; [.1E44.0020.0002.1B12] # BALINESE LETTER OKARA TEDUNG
+1B13 ; [.1E45.0020.0002.1B13] # BALINESE LETTER KA
+1B45 ; [.1E46.0020.0002.1B45] # BALINESE LETTER KAF SASAK
+1B46 ; [.1E47.0020.0002.1B46] # BALINESE LETTER KHOT SASAK
+1B14 ; [.1E48.0020.0002.1B14] # BALINESE LETTER KA MAHAPRANA
+1B15 ; [.1E49.0020.0002.1B15] # BALINESE LETTER GA
+1B16 ; [.1E4A.0020.0002.1B16] # BALINESE LETTER GA GORA
+1B17 ; [.1E4B.0020.0002.1B17] # BALINESE LETTER NGA
+1B18 ; [.1E4C.0020.0002.1B18] # BALINESE LETTER CA
+1B19 ; [.1E4D.0020.0002.1B19] # BALINESE LETTER CA LACA
+1B1A ; [.1E4E.0020.0002.1B1A] # BALINESE LETTER JA
+1B1B ; [.1E4F.0020.0002.1B1B] # BALINESE LETTER JA JERA
+1B1C ; [.1E50.0020.0002.1B1C] # BALINESE LETTER NYA
+1B1D ; [.1E51.0020.0002.1B1D] # BALINESE LETTER TA LATIK
+1B1E ; [.1E52.0020.0002.1B1E] # BALINESE LETTER TA MURDA MAHAPRANA
+1B1F ; [.1E53.0020.0002.1B1F] # BALINESE LETTER DA MURDA ALPAPRANA
+1B20 ; [.1E54.0020.0002.1B20] # BALINESE LETTER DA MURDA MAHAPRANA
+1B21 ; [.1E55.0020.0002.1B21] # BALINESE LETTER NA RAMBAT
+1B22 ; [.1E56.0020.0002.1B22] # BALINESE LETTER TA
+1B47 ; [.1E57.0020.0002.1B47] # BALINESE LETTER TZIR SASAK
+1B23 ; [.1E58.0020.0002.1B23] # BALINESE LETTER TA TAWA
+1B24 ; [.1E59.0020.0002.1B24] # BALINESE LETTER DA
+1B25 ; [.1E5A.0020.0002.1B25] # BALINESE LETTER DA MADU
+1B26 ; [.1E5B.0020.0002.1B26] # BALINESE LETTER NA
+1B27 ; [.1E5C.0020.0002.1B27] # BALINESE LETTER PA
+1B48 ; [.1E5D.0020.0002.1B48] # BALINESE LETTER EF SASAK
+1B28 ; [.1E5E.0020.0002.1B28] # BALINESE LETTER PA KAPAL
+1B29 ; [.1E5F.0020.0002.1B29] # BALINESE LETTER BA
+1B2A ; [.1E60.0020.0002.1B2A] # BALINESE LETTER BA KEMBANG
+1B2B ; [.1E61.0020.0002.1B2B] # BALINESE LETTER MA
+1B2C ; [.1E62.0020.0002.1B2C] # BALINESE LETTER YA
+1B2D ; [.1E63.0020.0002.1B2D] # BALINESE LETTER RA
+1B2E ; [.1E64.0020.0002.1B2E] # BALINESE LETTER LA
+1B2F ; [.1E65.0020.0002.1B2F] # BALINESE LETTER WA
+1B49 ; [.1E66.0020.0002.1B49] # BALINESE LETTER VE SASAK
+1B30 ; [.1E67.0020.0002.1B30] # BALINESE LETTER SA SAGA
+1B31 ; [.1E68.0020.0002.1B31] # BALINESE LETTER SA SAPA
+1B32 ; [.1E69.0020.0002.1B32] # BALINESE LETTER SA
+1B4A ; [.1E6A.0020.0002.1B4A] # BALINESE LETTER ZAL SASAK
+1B4B ; [.1E6B.0020.0002.1B4B] # BALINESE LETTER ASYURA SASAK
+1B33 ; [.1E6C.0020.0002.1B33] # BALINESE LETTER HA
+1B35 ; [.1E6D.0020.0002.1B35] # BALINESE VOWEL SIGN TEDUNG
+1B36 ; [.1E6E.0020.0002.1B36] # BALINESE VOWEL SIGN ULU
+1B37 ; [.1E6F.0020.0002.1B37] # BALINESE VOWEL SIGN ULU SARI
+1B38 ; [.1E70.0020.0002.1B38] # BALINESE VOWEL SIGN SUKU
+1B39 ; [.1E71.0020.0002.1B39] # BALINESE VOWEL SIGN SUKU ILUT
+1B3A ; [.1E72.0020.0002.1B3A] # BALINESE VOWEL SIGN RA REPA
+1B3B ; [.1E73.0020.0002.1B3B] # BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3A 1B35 ; [.1E73.0020.0002.1B3B] # BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C ; [.1E74.0020.0002.1B3C] # BALINESE VOWEL SIGN LA LENGA
+1B3D ; [.1E75.0020.0002.1B3D] # BALINESE VOWEL SIGN LA LENGA TEDUNG
+1B3C 1B35 ; [.1E75.0020.0002.1B3D] # BALINESE VOWEL SIGN LA LENGA TEDUNG
+1B3E ; [.1E76.0020.0002.1B3E] # BALINESE VOWEL SIGN TALING
+1B3F ; [.1E77.0020.0002.1B3F] # BALINESE VOWEL SIGN TALING REPA
+1B40 ; [.1E78.0020.0002.1B40] # BALINESE VOWEL SIGN TALING TEDUNG
+1B3E 1B35 ; [.1E78.0020.0002.1B40] # BALINESE VOWEL SIGN TALING TEDUNG
+1B41 ; [.1E79.0020.0002.1B41] # BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B3F 1B35 ; [.1E79.0020.0002.1B41] # BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42 ; [.1E7A.0020.0002.1B42] # BALINESE VOWEL SIGN PEPET
+1B43 ; [.1E7B.0020.0002.1B43] # BALINESE VOWEL SIGN PEPET TEDUNG
+1B42 1B35 ; [.1E7B.0020.0002.1B43] # BALINESE VOWEL SIGN PEPET TEDUNG
+1B44 ; [.1E7C.0020.0002.1B44] # BALINESE ADEG ADEG
+1880 ; [.1E7D.0020.0002.1880] # MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881 ; [.1E7E.0020.0002.1881] # MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882 ; [.1E7F.0020.0002.1882] # MONGOLIAN LETTER ALI GALI DAMARU
+1883 ; [.1E80.0020.0002.1883] # MONGOLIAN LETTER ALI GALI UBADAMA
+1884 ; [.1E81.0020.0002.1884] # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885 ; [.1E82.0020.0002.1885] # MONGOLIAN LETTER ALI GALI BALUDA
+1886 ; [.1E83.0020.0002.1886] # MONGOLIAN LETTER ALI GALI THREE BALUDA
+1843 ; [.1E84.0020.0002.1843] # MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1820 ; [.1E85.0020.0002.1820] # MONGOLIAN LETTER A
+1887 ; [.1E86.0020.0002.1887] # MONGOLIAN LETTER ALI GALI A
+1821 ; [.1E87.0020.0002.1821] # MONGOLIAN LETTER E
+1844 ; [.1E88.0020.0002.1844] # MONGOLIAN LETTER TODO E
+185D ; [.1E89.0020.0002.185D] # MONGOLIAN LETTER SIBE E
+1822 ; [.1E8A.0020.0002.1822] # MONGOLIAN LETTER I
+1845 ; [.1E8B.0020.0002.1845] # MONGOLIAN LETTER TODO I
+185E ; [.1E8C.0020.0002.185E] # MONGOLIAN LETTER SIBE I
+1873 ; [.1E8D.0020.0002.1873] # MONGOLIAN LETTER MANCHU I
+1888 ; [.1E8E.0020.0002.1888] # MONGOLIAN LETTER ALI GALI I
+185F ; [.1E8F.0020.0002.185F] # MONGOLIAN LETTER SIBE IY
+1823 ; [.1E90.0020.0002.1823] # MONGOLIAN LETTER O
+1846 ; [.1E91.0020.0002.1846] # MONGOLIAN LETTER TODO O
+1824 ; [.1E92.0020.0002.1824] # MONGOLIAN LETTER U
+1847 ; [.1E93.0020.0002.1847] # MONGOLIAN LETTER TODO U
+1861 ; [.1E94.0020.0002.1861] # MONGOLIAN LETTER SIBE U
+1825 ; [.1E95.0020.0002.1825] # MONGOLIAN LETTER OE
+1848 ; [.1E96.0020.0002.1848] # MONGOLIAN LETTER TODO OE
+1826 ; [.1E97.0020.0002.1826] # MONGOLIAN LETTER UE
+1849 ; [.1E98.0020.0002.1849] # MONGOLIAN LETTER TODO UE
+1860 ; [.1E99.0020.0002.1860] # MONGOLIAN LETTER SIBE UE
+1827 ; [.1E9A.0020.0002.1827] # MONGOLIAN LETTER EE
+1828 ; [.1E9B.0020.0002.1828] # MONGOLIAN LETTER NA
+1829 ; [.1E9C.0020.0002.1829] # MONGOLIAN LETTER ANG
+184A ; [.1E9D.0020.0002.184A] # MONGOLIAN LETTER TODO ANG
+1862 ; [.1E9E.0020.0002.1862] # MONGOLIAN LETTER SIBE ANG
+188A ; [.1E9F.0020.0002.188A] # MONGOLIAN LETTER ALI GALI NGA
+189B ; [.1EA0.0020.0002.189B] # MONGOLIAN LETTER MANCHU ALI GALI NGA
+182A ; [.1EA1.0020.0002.182A] # MONGOLIAN LETTER BA
+184B ; [.1EA2.0020.0002.184B] # MONGOLIAN LETTER TODO BA
+182B ; [.1EA3.0020.0002.182B] # MONGOLIAN LETTER PA
+184C ; [.1EA4.0020.0002.184C] # MONGOLIAN LETTER TODO PA
+1866 ; [.1EA5.0020.0002.1866] # MONGOLIAN LETTER SIBE PA
+182C ; [.1EA6.0020.0002.182C] # MONGOLIAN LETTER QA
+184D ; [.1EA7.0020.0002.184D] # MONGOLIAN LETTER TODO QA
+182D ; [.1EA8.0020.0002.182D] # MONGOLIAN LETTER GA
+184E ; [.1EA9.0020.0002.184E] # MONGOLIAN LETTER TODO GA
+1864 ; [.1EAA.0020.0002.1864] # MONGOLIAN LETTER SIBE GA
+189A ; [.1EAB.0020.0002.189A] # MONGOLIAN LETTER MANCHU ALI GALI GHA
+1865 ; [.1EAC.0020.0002.1865] # MONGOLIAN LETTER SIBE HA
+182E ; [.1EAD.0020.0002.182E] # MONGOLIAN LETTER MA
+184F ; [.1EAE.0020.0002.184F] # MONGOLIAN LETTER TODO MA
+182F ; [.1EAF.0020.0002.182F] # MONGOLIAN LETTER LA
+1830 ; [.1EB0.0020.0002.1830] # MONGOLIAN LETTER SA
+1831 ; [.1EB1.0020.0002.1831] # MONGOLIAN LETTER SHA
+1867 ; [.1EB2.0020.0002.1867] # MONGOLIAN LETTER SIBE SHA
+189C ; [.1EB3.0020.0002.189C] # MONGOLIAN LETTER MANCHU ALI GALI CA
+189D ; [.1EB4.0020.0002.189D] # MONGOLIAN LETTER MANCHU ALI GALI JHA
+18A2 ; [.1EB5.0020.0002.18A2] # MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A4 ; [.1EB6.0020.0002.18A4] # MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5 ; [.1EB7.0020.0002.18A5] # MONGOLIAN LETTER MANCHU ALI GALI ZA
+1832 ; [.1EB8.0020.0002.1832] # MONGOLIAN LETTER TA
+1850 ; [.1EB9.0020.0002.1850] # MONGOLIAN LETTER TODO TA
+1868 ; [.1EBA.0020.0002.1868] # MONGOLIAN LETTER SIBE TA
+1833 ; [.1EBB.0020.0002.1833] # MONGOLIAN LETTER DA
+1851 ; [.1EBC.0020.0002.1851] # MONGOLIAN LETTER TODO DA
+1869 ; [.1EBD.0020.0002.1869] # MONGOLIAN LETTER SIBE DA
+1834 ; [.1EBE.0020.0002.1834] # MONGOLIAN LETTER CHA
+1852 ; [.1EBF.0020.0002.1852] # MONGOLIAN LETTER TODO CHA
+1871 ; [.1EC0.0020.0002.1871] # MONGOLIAN LETTER SIBE CHA
+185C ; [.1EC1.0020.0002.185C] # MONGOLIAN LETTER TODO DZA
+188B ; [.1EC2.0020.0002.188B] # MONGOLIAN LETTER ALI GALI CA
+1835 ; [.1EC3.0020.0002.1835] # MONGOLIAN LETTER JA
+1853 ; [.1EC4.0020.0002.1853] # MONGOLIAN LETTER TODO JA
+186A ; [.1EC5.0020.0002.186A] # MONGOLIAN LETTER SIBE JA
+1877 ; [.1EC6.0020.0002.1877] # MONGOLIAN LETTER MANCHU ZHA
+1836 ; [.1EC7.0020.0002.1836] # MONGOLIAN LETTER YA
+1855 ; [.1EC8.0020.0002.1855] # MONGOLIAN LETTER TODO YA
+1872 ; [.1EC9.0020.0002.1872] # MONGOLIAN LETTER SIBE ZHA
+1837 ; [.1ECA.0020.0002.1837] # MONGOLIAN LETTER RA
+1875 ; [.1ECB.0020.0002.1875] # MONGOLIAN LETTER MANCHU RA
+1838 ; [.1ECC.0020.0002.1838] # MONGOLIAN LETTER WA
+1856 ; [.1ECD.0020.0002.1856] # MONGOLIAN LETTER TODO WA
+1839 ; [.1ECE.0020.0002.1839] # MONGOLIAN LETTER FA
+186B ; [.1ECF.0020.0002.186B] # MONGOLIAN LETTER SIBE FA
+1876 ; [.1ED0.0020.0002.1876] # MONGOLIAN LETTER MANCHU FA
+183A ; [.1ED1.0020.0002.183A] # MONGOLIAN LETTER KA
+1857 ; [.1ED2.0020.0002.1857] # MONGOLIAN LETTER TODO KA
+1863 ; [.1ED3.0020.0002.1863] # MONGOLIAN LETTER SIBE KA
+1874 ; [.1ED4.0020.0002.1874] # MONGOLIAN LETTER MANCHU KA
+1889 ; [.1ED5.0020.0002.1889] # MONGOLIAN LETTER ALI GALI KA
+183B ; [.1ED6.0020.0002.183B] # MONGOLIAN LETTER KHA
+183C ; [.1ED7.0020.0002.183C] # MONGOLIAN LETTER TSA
+1854 ; [.1ED8.0020.0002.1854] # MONGOLIAN LETTER TODO TSA
+186E ; [.1ED9.0020.0002.186E] # MONGOLIAN LETTER SIBE TSA
+183D ; [.1EDA.0020.0002.183D] # MONGOLIAN LETTER ZA
+186F ; [.1EDB.0020.0002.186F] # MONGOLIAN LETTER SIBE ZA
+1858 ; [.1EDC.0020.0002.1858] # MONGOLIAN LETTER TODO GAA
+186C ; [.1EDD.0020.0002.186C] # MONGOLIAN LETTER SIBE GAA
+183E ; [.1EDE.0020.0002.183E] # MONGOLIAN LETTER HAA
+1859 ; [.1EDF.0020.0002.1859] # MONGOLIAN LETTER TODO HAA
+186D ; [.1EE0.0020.0002.186D] # MONGOLIAN LETTER SIBE HAA
+183F ; [.1EE1.0020.0002.183F] # MONGOLIAN LETTER ZRA
+1840 ; [.1EE2.0020.0002.1840] # MONGOLIAN LETTER LHA
+1841 ; [.1EE3.0020.0002.1841] # MONGOLIAN LETTER ZHI
+1842 ; [.1EE4.0020.0002.1842] # MONGOLIAN LETTER CHI
+185A ; [.1EE5.0020.0002.185A] # MONGOLIAN LETTER TODO JIA
+185B ; [.1EE6.0020.0002.185B] # MONGOLIAN LETTER TODO NIA
+1870 ; [.1EE7.0020.0002.1870] # MONGOLIAN LETTER SIBE RAA
+188C ; [.1EE8.0020.0002.188C] # MONGOLIAN LETTER ALI GALI TTA
+189E ; [.1EE9.0020.0002.189E] # MONGOLIAN LETTER MANCHU ALI GALI TTA
+188D ; [.1EEA.0020.0002.188D] # MONGOLIAN LETTER ALI GALI TTHA
+188E ; [.1EEB.0020.0002.188E] # MONGOLIAN LETTER ALI GALI DDA
+189F ; [.1EEC.0020.0002.189F] # MONGOLIAN LETTER MANCHU ALI GALI DDHA
+188F ; [.1EED.0020.0002.188F] # MONGOLIAN LETTER ALI GALI NNA
+1890 ; [.1EEE.0020.0002.1890] # MONGOLIAN LETTER ALI GALI TA
+1898 ; [.1EEF.0020.0002.1898] # MONGOLIAN LETTER TODO ALI GALI TA
+18A0 ; [.1EF0.0020.0002.18A0] # MONGOLIAN LETTER MANCHU ALI GALI TA
+1891 ; [.1EF1.0020.0002.1891] # MONGOLIAN LETTER ALI GALI DA
+18A1 ; [.1EF2.0020.0002.18A1] # MONGOLIAN LETTER MANCHU ALI GALI DHA
+1892 ; [.1EF3.0020.0002.1892] # MONGOLIAN LETTER ALI GALI PA
+1893 ; [.1EF4.0020.0002.1893] # MONGOLIAN LETTER ALI GALI PHA
+18A8 ; [.1EF5.0020.0002.18A8] # MONGOLIAN LETTER MANCHU ALI GALI BHA
+1894 ; [.1EF6.0020.0002.1894] # MONGOLIAN LETTER ALI GALI SSA
+18A3 ; [.1EF7.0020.0002.18A3] # MONGOLIAN LETTER MANCHU ALI GALI CYA
+1895 ; [.1EF8.0020.0002.1895] # MONGOLIAN LETTER ALI GALI ZHA
+1899 ; [.1EF9.0020.0002.1899] # MONGOLIAN LETTER TODO ALI GALI ZHA
+1896 ; [.1EFA.0020.0002.1896] # MONGOLIAN LETTER ALI GALI ZA
+1897 ; [.1EFB.0020.0002.1897] # MONGOLIAN LETTER ALI GALI AH
+18A6 ; [.1EFC.0020.0002.18A6] # MONGOLIAN LETTER ALI GALI HALF U
+18A7 ; [.1EFD.0020.0002.18A7] # MONGOLIAN LETTER ALI GALI HALF YA
+18A9 ; [.1EFE.0020.0002.18A9] # MONGOLIAN LETTER ALI GALI DAGALGA
+13A0 ; [.1EFF.0020.0002.13A0] # CHEROKEE LETTER A
+13A1 ; [.1F00.0020.0002.13A1] # CHEROKEE LETTER E
+13A2 ; [.1F01.0020.0002.13A2] # CHEROKEE LETTER I
+13A3 ; [.1F02.0020.0002.13A3] # CHEROKEE LETTER O
+13A4 ; [.1F03.0020.0002.13A4] # CHEROKEE LETTER U
+13A5 ; [.1F04.0020.0002.13A5] # CHEROKEE LETTER V
+13A6 ; [.1F05.0020.0002.13A6] # CHEROKEE LETTER GA
+13A7 ; [.1F06.0020.0002.13A7] # CHEROKEE LETTER KA
+13A8 ; [.1F07.0020.0002.13A8] # CHEROKEE LETTER GE
+13A9 ; [.1F08.0020.0002.13A9] # CHEROKEE LETTER GI
+13AA ; [.1F09.0020.0002.13AA] # CHEROKEE LETTER GO
+13AB ; [.1F0A.0020.0002.13AB] # CHEROKEE LETTER GU
+13AC ; [.1F0B.0020.0002.13AC] # CHEROKEE LETTER GV
+13AD ; [.1F0C.0020.0002.13AD] # CHEROKEE LETTER HA
+13AE ; [.1F0D.0020.0002.13AE] # CHEROKEE LETTER HE
+13AF ; [.1F0E.0020.0002.13AF] # CHEROKEE LETTER HI
+13B0 ; [.1F0F.0020.0002.13B0] # CHEROKEE LETTER HO
+13B1 ; [.1F10.0020.0002.13B1] # CHEROKEE LETTER HU
+13B2 ; [.1F11.0020.0002.13B2] # CHEROKEE LETTER HV
+13B3 ; [.1F12.0020.0002.13B3] # CHEROKEE LETTER LA
+13B4 ; [.1F13.0020.0002.13B4] # CHEROKEE LETTER LE
+13B5 ; [.1F14.0020.0002.13B5] # CHEROKEE LETTER LI
+13B6 ; [.1F15.0020.0002.13B6] # CHEROKEE LETTER LO
+13B7 ; [.1F16.0020.0002.13B7] # CHEROKEE LETTER LU
+13B8 ; [.1F17.0020.0002.13B8] # CHEROKEE LETTER LV
+13B9 ; [.1F18.0020.0002.13B9] # CHEROKEE LETTER MA
+13BA ; [.1F19.0020.0002.13BA] # CHEROKEE LETTER ME
+13BB ; [.1F1A.0020.0002.13BB] # CHEROKEE LETTER MI
+13BC ; [.1F1B.0020.0002.13BC] # CHEROKEE LETTER MO
+13BD ; [.1F1C.0020.0002.13BD] # CHEROKEE LETTER MU
+13BE ; [.1F1D.0020.0002.13BE] # CHEROKEE LETTER NA
+13BF ; [.1F1E.0020.0002.13BF] # CHEROKEE LETTER HNA
+13C0 ; [.1F1F.0020.0002.13C0] # CHEROKEE LETTER NAH
+13C1 ; [.1F20.0020.0002.13C1] # CHEROKEE LETTER NE
+13C2 ; [.1F21.0020.0002.13C2] # CHEROKEE LETTER NI
+13C3 ; [.1F22.0020.0002.13C3] # CHEROKEE LETTER NO
+13C4 ; [.1F23.0020.0002.13C4] # CHEROKEE LETTER NU
+13C5 ; [.1F24.0020.0002.13C5] # CHEROKEE LETTER NV
+13C6 ; [.1F25.0020.0002.13C6] # CHEROKEE LETTER QUA
+13C7 ; [.1F26.0020.0002.13C7] # CHEROKEE LETTER QUE
+13C8 ; [.1F27.0020.0002.13C8] # CHEROKEE LETTER QUI
+13C9 ; [.1F28.0020.0002.13C9] # CHEROKEE LETTER QUO
+13CA ; [.1F29.0020.0002.13CA] # CHEROKEE LETTER QUU
+13CB ; [.1F2A.0020.0002.13CB] # CHEROKEE LETTER QUV
+13CC ; [.1F2B.0020.0002.13CC] # CHEROKEE LETTER SA
+13CD ; [.1F2C.0020.0002.13CD] # CHEROKEE LETTER S
+13CE ; [.1F2D.0020.0002.13CE] # CHEROKEE LETTER SE
+13CF ; [.1F2E.0020.0002.13CF] # CHEROKEE LETTER SI
+13D0 ; [.1F2F.0020.0002.13D0] # CHEROKEE LETTER SO
+13D1 ; [.1F30.0020.0002.13D1] # CHEROKEE LETTER SU
+13D2 ; [.1F31.0020.0002.13D2] # CHEROKEE LETTER SV
+13D3 ; [.1F32.0020.0002.13D3] # CHEROKEE LETTER DA
+13D4 ; [.1F33.0020.0002.13D4] # CHEROKEE LETTER TA
+13D5 ; [.1F34.0020.0002.13D5] # CHEROKEE LETTER DE
+13D6 ; [.1F35.0020.0002.13D6] # CHEROKEE LETTER TE
+13D7 ; [.1F36.0020.0002.13D7] # CHEROKEE LETTER DI
+13D8 ; [.1F37.0020.0002.13D8] # CHEROKEE LETTER TI
+13D9 ; [.1F38.0020.0002.13D9] # CHEROKEE LETTER DO
+13DA ; [.1F39.0020.0002.13DA] # CHEROKEE LETTER DU
+13DB ; [.1F3A.0020.0002.13DB] # CHEROKEE LETTER DV
+13DC ; [.1F3B.0020.0002.13DC] # CHEROKEE LETTER DLA
+13DD ; [.1F3C.0020.0002.13DD] # CHEROKEE LETTER TLA
+13DE ; [.1F3D.0020.0002.13DE] # CHEROKEE LETTER TLE
+13DF ; [.1F3E.0020.0002.13DF] # CHEROKEE LETTER TLI
+13E0 ; [.1F3F.0020.0002.13E0] # CHEROKEE LETTER TLO
+13E1 ; [.1F40.0020.0002.13E1] # CHEROKEE LETTER TLU
+13E2 ; [.1F41.0020.0002.13E2] # CHEROKEE LETTER TLV
+13E3 ; [.1F42.0020.0002.13E3] # CHEROKEE LETTER TSA
+13E4 ; [.1F43.0020.0002.13E4] # CHEROKEE LETTER TSE
+13E5 ; [.1F44.0020.0002.13E5] # CHEROKEE LETTER TSI
+13E6 ; [.1F45.0020.0002.13E6] # CHEROKEE LETTER TSO
+13E7 ; [.1F46.0020.0002.13E7] # CHEROKEE LETTER TSU
+13E8 ; [.1F47.0020.0002.13E8] # CHEROKEE LETTER TSV
+13E9 ; [.1F48.0020.0002.13E9] # CHEROKEE LETTER WA
+13EA ; [.1F49.0020.0002.13EA] # CHEROKEE LETTER WE
+13EB ; [.1F4A.0020.0002.13EB] # CHEROKEE LETTER WI
+13EC ; [.1F4B.0020.0002.13EC] # CHEROKEE LETTER WO
+13ED ; [.1F4C.0020.0002.13ED] # CHEROKEE LETTER WU
+13EE ; [.1F4D.0020.0002.13EE] # CHEROKEE LETTER WV
+13EF ; [.1F4E.0020.0002.13EF] # CHEROKEE LETTER YA
+13F0 ; [.1F4F.0020.0002.13F0] # CHEROKEE LETTER YE
+13F1 ; [.1F50.0020.0002.13F1] # CHEROKEE LETTER YI
+13F2 ; [.1F51.0020.0002.13F2] # CHEROKEE LETTER YO
+13F3 ; [.1F52.0020.0002.13F3] # CHEROKEE LETTER YU
+13F4 ; [.1F53.0020.0002.13F4] # CHEROKEE LETTER YV
+1401 ; [.1F54.0020.0002.1401] # CANADIAN SYLLABICS E
+1402 ; [.1F55.0020.0002.1402] # CANADIAN SYLLABICS AAI
+1403 ; [.1F56.0020.0002.1403] # CANADIAN SYLLABICS I
+1404 ; [.1F57.0020.0002.1404] # CANADIAN SYLLABICS II
+1405 ; [.1F58.0020.0002.1405] # CANADIAN SYLLABICS O
+1406 ; [.1F59.0020.0002.1406] # CANADIAN SYLLABICS OO
+1407 ; [.1F5A.0020.0002.1407] # CANADIAN SYLLABICS Y-CREE OO
+1408 ; [.1F5B.0020.0002.1408] # CANADIAN SYLLABICS CARRIER EE
+1409 ; [.1F5C.0020.0002.1409] # CANADIAN SYLLABICS CARRIER I
+140A ; [.1F5D.0020.0002.140A] # CANADIAN SYLLABICS A
+140B ; [.1F5E.0020.0002.140B] # CANADIAN SYLLABICS AA
+140C ; [.1F5F.0020.0002.140C] # CANADIAN SYLLABICS WE
+140D ; [.1F60.0020.0002.140D] # CANADIAN SYLLABICS WEST-CREE WE
+140E ; [.1F61.0020.0002.140E] # CANADIAN SYLLABICS WI
+140F ; [.1F62.0020.0002.140F] # CANADIAN SYLLABICS WEST-CREE WI
+1410 ; [.1F63.0020.0002.1410] # CANADIAN SYLLABICS WII
+1411 ; [.1F64.0020.0002.1411] # CANADIAN SYLLABICS WEST-CREE WII
+1412 ; [.1F65.0020.0002.1412] # CANADIAN SYLLABICS WO
+1413 ; [.1F66.0020.0002.1413] # CANADIAN SYLLABICS WEST-CREE WO
+1414 ; [.1F67.0020.0002.1414] # CANADIAN SYLLABICS WOO
+1415 ; [.1F68.0020.0002.1415] # CANADIAN SYLLABICS WEST-CREE WOO
+1416 ; [.1F69.0020.0002.1416] # CANADIAN SYLLABICS NASKAPI WOO
+1417 ; [.1F6A.0020.0002.1417] # CANADIAN SYLLABICS WA
+1418 ; [.1F6B.0020.0002.1418] # CANADIAN SYLLABICS WEST-CREE WA
+1419 ; [.1F6C.0020.0002.1419] # CANADIAN SYLLABICS WAA
+141A ; [.1F6D.0020.0002.141A] # CANADIAN SYLLABICS WEST-CREE WAA
+141B ; [.1F6E.0020.0002.141B] # CANADIAN SYLLABICS NASKAPI WAA
+141C ; [.1F6F.0020.0002.141C] # CANADIAN SYLLABICS AI
+141D ; [.1F70.0020.0002.141D] # CANADIAN SYLLABICS Y-CREE W
+141E ; [.1F71.0020.0002.141E] # CANADIAN SYLLABICS GLOTTAL STOP
+141F ; [.1F72.0020.0002.141F] # CANADIAN SYLLABICS FINAL ACUTE
+1420 ; [.1F73.0020.0002.1420] # CANADIAN SYLLABICS FINAL GRAVE
+1421 ; [.1F74.0020.0002.1421] # CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422 ; [.1F75.0020.0002.1422] # CANADIAN SYLLABICS FINAL TOP HALF RING
+1423 ; [.1F76.0020.0002.1423] # CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424 ; [.1F77.0020.0002.1424] # CANADIAN SYLLABICS FINAL RING
+1425 ; [.1F78.0020.0002.1425] # CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426 ; [.1F79.0020.0002.1426] # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427 ; [.1F7A.0020.0002.1427] # CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428 ; [.1F7B.0020.0002.1428] # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429 ; [.1F7C.0020.0002.1429] # CANADIAN SYLLABICS FINAL PLUS
+142A ; [.1F7D.0020.0002.142A] # CANADIAN SYLLABICS FINAL DOWN TACK
+142B ; [.1F7E.0020.0002.142B] # CANADIAN SYLLABICS EN
+142C ; [.1F7F.0020.0002.142C] # CANADIAN SYLLABICS IN
+142D ; [.1F80.0020.0002.142D] # CANADIAN SYLLABICS ON
+142E ; [.1F81.0020.0002.142E] # CANADIAN SYLLABICS AN
+142F ; [.1F82.0020.0002.142F] # CANADIAN SYLLABICS PE
+1430 ; [.1F83.0020.0002.1430] # CANADIAN SYLLABICS PAAI
+1431 ; [.1F84.0020.0002.1431] # CANADIAN SYLLABICS PI
+1432 ; [.1F85.0020.0002.1432] # CANADIAN SYLLABICS PII
+1433 ; [.1F86.0020.0002.1433] # CANADIAN SYLLABICS PO
+1434 ; [.1F87.0020.0002.1434] # CANADIAN SYLLABICS POO
+1435 ; [.1F88.0020.0002.1435] # CANADIAN SYLLABICS Y-CREE POO
+1436 ; [.1F89.0020.0002.1436] # CANADIAN SYLLABICS CARRIER HEE
+1437 ; [.1F8A.0020.0002.1437] # CANADIAN SYLLABICS CARRIER HI
+1438 ; [.1F8B.0020.0002.1438] # CANADIAN SYLLABICS PA
+1439 ; [.1F8C.0020.0002.1439] # CANADIAN SYLLABICS PAA
+143A ; [.1F8D.0020.0002.143A] # CANADIAN SYLLABICS PWE
+143B ; [.1F8E.0020.0002.143B] # CANADIAN SYLLABICS WEST-CREE PWE
+143C ; [.1F8F.0020.0002.143C] # CANADIAN SYLLABICS PWI
+143D ; [.1F90.0020.0002.143D] # CANADIAN SYLLABICS WEST-CREE PWI
+143E ; [.1F91.0020.0002.143E] # CANADIAN SYLLABICS PWII
+143F ; [.1F92.0020.0002.143F] # CANADIAN SYLLABICS WEST-CREE PWII
+1440 ; [.1F93.0020.0002.1440] # CANADIAN SYLLABICS PWO
+1441 ; [.1F94.0020.0002.1441] # CANADIAN SYLLABICS WEST-CREE PWO
+1442 ; [.1F95.0020.0002.1442] # CANADIAN SYLLABICS PWOO
+1443 ; [.1F96.0020.0002.1443] # CANADIAN SYLLABICS WEST-CREE PWOO
+1444 ; [.1F97.0020.0002.1444] # CANADIAN SYLLABICS PWA
+1445 ; [.1F98.0020.0002.1445] # CANADIAN SYLLABICS WEST-CREE PWA
+1446 ; [.1F99.0020.0002.1446] # CANADIAN SYLLABICS PWAA
+1447 ; [.1F9A.0020.0002.1447] # CANADIAN SYLLABICS WEST-CREE PWAA
+1448 ; [.1F9B.0020.0002.1448] # CANADIAN SYLLABICS Y-CREE PWAA
+1449 ; [.1F9C.0020.0002.1449] # CANADIAN SYLLABICS P
+144A ; [.1F9D.0020.0002.144A] # CANADIAN SYLLABICS WEST-CREE P
+144B ; [.1F9E.0020.0002.144B] # CANADIAN SYLLABICS CARRIER H
+144C ; [.1F9F.0020.0002.144C] # CANADIAN SYLLABICS TE
+144D ; [.1FA0.0020.0002.144D] # CANADIAN SYLLABICS TAAI
+144E ; [.1FA1.0020.0002.144E] # CANADIAN SYLLABICS TI
+144F ; [.1FA2.0020.0002.144F] # CANADIAN SYLLABICS TII
+1450 ; [.1FA3.0020.0002.1450] # CANADIAN SYLLABICS TO
+1451 ; [.1FA4.0020.0002.1451] # CANADIAN SYLLABICS TOO
+1452 ; [.1FA5.0020.0002.1452] # CANADIAN SYLLABICS Y-CREE TOO
+1453 ; [.1FA6.0020.0002.1453] # CANADIAN SYLLABICS CARRIER DEE
+1454 ; [.1FA7.0020.0002.1454] # CANADIAN SYLLABICS CARRIER DI
+1455 ; [.1FA8.0020.0002.1455] # CANADIAN SYLLABICS TA
+1456 ; [.1FA9.0020.0002.1456] # CANADIAN SYLLABICS TAA
+1457 ; [.1FAA.0020.0002.1457] # CANADIAN SYLLABICS TWE
+1458 ; [.1FAB.0020.0002.1458] # CANADIAN SYLLABICS WEST-CREE TWE
+1459 ; [.1FAC.0020.0002.1459] # CANADIAN SYLLABICS TWI
+145A ; [.1FAD.0020.0002.145A] # CANADIAN SYLLABICS WEST-CREE TWI
+145B ; [.1FAE.0020.0002.145B] # CANADIAN SYLLABICS TWII
+145C ; [.1FAF.0020.0002.145C] # CANADIAN SYLLABICS WEST-CREE TWII
+145D ; [.1FB0.0020.0002.145D] # CANADIAN SYLLABICS TWO
+145E ; [.1FB1.0020.0002.145E] # CANADIAN SYLLABICS WEST-CREE TWO
+145F ; [.1FB2.0020.0002.145F] # CANADIAN SYLLABICS TWOO
+1460 ; [.1FB3.0020.0002.1460] # CANADIAN SYLLABICS WEST-CREE TWOO
+1461 ; [.1FB4.0020.0002.1461] # CANADIAN SYLLABICS TWA
+1462 ; [.1FB5.0020.0002.1462] # CANADIAN SYLLABICS WEST-CREE TWA
+1463 ; [.1FB6.0020.0002.1463] # CANADIAN SYLLABICS TWAA
+1464 ; [.1FB7.0020.0002.1464] # CANADIAN SYLLABICS WEST-CREE TWAA
+1465 ; [.1FB8.0020.0002.1465] # CANADIAN SYLLABICS NASKAPI TWAA
+1466 ; [.1FB9.0020.0002.1466] # CANADIAN SYLLABICS T
+1467 ; [.1FBA.0020.0002.1467] # CANADIAN SYLLABICS TTE
+1468 ; [.1FBB.0020.0002.1468] # CANADIAN SYLLABICS TTI
+1469 ; [.1FBC.0020.0002.1469] # CANADIAN SYLLABICS TTO
+146A ; [.1FBD.0020.0002.146A] # CANADIAN SYLLABICS TTA
+146B ; [.1FBE.0020.0002.146B] # CANADIAN SYLLABICS KE
+146C ; [.1FBF.0020.0002.146C] # CANADIAN SYLLABICS KAAI
+146D ; [.1FC0.0020.0002.146D] # CANADIAN SYLLABICS KI
+146E ; [.1FC1.0020.0002.146E] # CANADIAN SYLLABICS KII
+146F ; [.1FC2.0020.0002.146F] # CANADIAN SYLLABICS KO
+1470 ; [.1FC3.0020.0002.1470] # CANADIAN SYLLABICS KOO
+1471 ; [.1FC4.0020.0002.1471] # CANADIAN SYLLABICS Y-CREE KOO
+1472 ; [.1FC5.0020.0002.1472] # CANADIAN SYLLABICS KA
+1473 ; [.1FC6.0020.0002.1473] # CANADIAN SYLLABICS KAA
+1474 ; [.1FC7.0020.0002.1474] # CANADIAN SYLLABICS KWE
+1475 ; [.1FC8.0020.0002.1475] # CANADIAN SYLLABICS WEST-CREE KWE
+1476 ; [.1FC9.0020.0002.1476] # CANADIAN SYLLABICS KWI
+1477 ; [.1FCA.0020.0002.1477] # CANADIAN SYLLABICS WEST-CREE KWI
+1478 ; [.1FCB.0020.0002.1478] # CANADIAN SYLLABICS KWII
+1479 ; [.1FCC.0020.0002.1479] # CANADIAN SYLLABICS WEST-CREE KWII
+147A ; [.1FCD.0020.0002.147A] # CANADIAN SYLLABICS KWO
+147B ; [.1FCE.0020.0002.147B] # CANADIAN SYLLABICS WEST-CREE KWO
+147C ; [.1FCF.0020.0002.147C] # CANADIAN SYLLABICS KWOO
+147D ; [.1FD0.0020.0002.147D] # CANADIAN SYLLABICS WEST-CREE KWOO
+147E ; [.1FD1.0020.0002.147E] # CANADIAN SYLLABICS KWA
+147F ; [.1FD2.0020.0002.147F] # CANADIAN SYLLABICS WEST-CREE KWA
+1480 ; [.1FD3.0020.0002.1480] # CANADIAN SYLLABICS KWAA
+1481 ; [.1FD4.0020.0002.1481] # CANADIAN SYLLABICS WEST-CREE KWAA
+1482 ; [.1FD5.0020.0002.1482] # CANADIAN SYLLABICS NASKAPI KWAA
+1483 ; [.1FD6.0020.0002.1483] # CANADIAN SYLLABICS K
+1484 ; [.1FD7.0020.0002.1484] # CANADIAN SYLLABICS KW
+1485 ; [.1FD8.0020.0002.1485] # CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486 ; [.1FD9.0020.0002.1486] # CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487 ; [.1FDA.0020.0002.1487] # CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488 ; [.1FDB.0020.0002.1488] # CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489 ; [.1FDC.0020.0002.1489] # CANADIAN SYLLABICS CE
+148A ; [.1FDD.0020.0002.148A] # CANADIAN SYLLABICS CAAI
+148B ; [.1FDE.0020.0002.148B] # CANADIAN SYLLABICS CI
+148C ; [.1FDF.0020.0002.148C] # CANADIAN SYLLABICS CII
+148D ; [.1FE0.0020.0002.148D] # CANADIAN SYLLABICS CO
+148E ; [.1FE1.0020.0002.148E] # CANADIAN SYLLABICS COO
+148F ; [.1FE2.0020.0002.148F] # CANADIAN SYLLABICS Y-CREE COO
+1490 ; [.1FE3.0020.0002.1490] # CANADIAN SYLLABICS CA
+1491 ; [.1FE4.0020.0002.1491] # CANADIAN SYLLABICS CAA
+1492 ; [.1FE5.0020.0002.1492] # CANADIAN SYLLABICS CWE
+1493 ; [.1FE6.0020.0002.1493] # CANADIAN SYLLABICS WEST-CREE CWE
+1494 ; [.1FE7.0020.0002.1494] # CANADIAN SYLLABICS CWI
+1495 ; [.1FE8.0020.0002.1495] # CANADIAN SYLLABICS WEST-CREE CWI
+1496 ; [.1FE9.0020.0002.1496] # CANADIAN SYLLABICS CWII
+1497 ; [.1FEA.0020.0002.1497] # CANADIAN SYLLABICS WEST-CREE CWII
+1498 ; [.1FEB.0020.0002.1498] # CANADIAN SYLLABICS CWO
+1499 ; [.1FEC.0020.0002.1499] # CANADIAN SYLLABICS WEST-CREE CWO
+149A ; [.1FED.0020.0002.149A] # CANADIAN SYLLABICS CWOO
+149B ; [.1FEE.0020.0002.149B] # CANADIAN SYLLABICS WEST-CREE CWOO
+149C ; [.1FEF.0020.0002.149C] # CANADIAN SYLLABICS CWA
+149D ; [.1FF0.0020.0002.149D] # CANADIAN SYLLABICS WEST-CREE CWA
+149E ; [.1FF1.0020.0002.149E] # CANADIAN SYLLABICS CWAA
+149F ; [.1FF2.0020.0002.149F] # CANADIAN SYLLABICS WEST-CREE CWAA
+14A0 ; [.1FF3.0020.0002.14A0] # CANADIAN SYLLABICS NASKAPI CWAA
+14A1 ; [.1FF4.0020.0002.14A1] # CANADIAN SYLLABICS C
+14A2 ; [.1FF5.0020.0002.14A2] # CANADIAN SYLLABICS SAYISI TH
+14A3 ; [.1FF6.0020.0002.14A3] # CANADIAN SYLLABICS ME
+14A4 ; [.1FF7.0020.0002.14A4] # CANADIAN SYLLABICS MAAI
+14A5 ; [.1FF8.0020.0002.14A5] # CANADIAN SYLLABICS MI
+14A6 ; [.1FF9.0020.0002.14A6] # CANADIAN SYLLABICS MII
+14A7 ; [.1FFA.0020.0002.14A7] # CANADIAN SYLLABICS MO
+14A8 ; [.1FFB.0020.0002.14A8] # CANADIAN SYLLABICS MOO
+14A9 ; [.1FFC.0020.0002.14A9] # CANADIAN SYLLABICS Y-CREE MOO
+14AA ; [.1FFD.0020.0002.14AA] # CANADIAN SYLLABICS MA
+14AB ; [.1FFE.0020.0002.14AB] # CANADIAN SYLLABICS MAA
+14AC ; [.1FFF.0020.0002.14AC] # CANADIAN SYLLABICS MWE
+14AD ; [.2000.0020.0002.14AD] # CANADIAN SYLLABICS WEST-CREE MWE
+14AE ; [.2001.0020.0002.14AE] # CANADIAN SYLLABICS MWI
+14AF ; [.2002.0020.0002.14AF] # CANADIAN SYLLABICS WEST-CREE MWI
+14B0 ; [.2003.0020.0002.14B0] # CANADIAN SYLLABICS MWII
+14B1 ; [.2004.0020.0002.14B1] # CANADIAN SYLLABICS WEST-CREE MWII
+14B2 ; [.2005.0020.0002.14B2] # CANADIAN SYLLABICS MWO
+14B3 ; [.2006.0020.0002.14B3] # CANADIAN SYLLABICS WEST-CREE MWO
+14B4 ; [.2007.0020.0002.14B4] # CANADIAN SYLLABICS MWOO
+14B5 ; [.2008.0020.0002.14B5] # CANADIAN SYLLABICS WEST-CREE MWOO
+14B6 ; [.2009.0020.0002.14B6] # CANADIAN SYLLABICS MWA
+14B7 ; [.200A.0020.0002.14B7] # CANADIAN SYLLABICS WEST-CREE MWA
+14B8 ; [.200B.0020.0002.14B8] # CANADIAN SYLLABICS MWAA
+14B9 ; [.200C.0020.0002.14B9] # CANADIAN SYLLABICS WEST-CREE MWAA
+14BA ; [.200D.0020.0002.14BA] # CANADIAN SYLLABICS NASKAPI MWAA
+14BB ; [.200E.0020.0002.14BB] # CANADIAN SYLLABICS M
+14BC ; [.200F.0020.0002.14BC] # CANADIAN SYLLABICS WEST-CREE M
+14BD ; [.2010.0020.0002.14BD] # CANADIAN SYLLABICS MH
+14BE ; [.2011.0020.0002.14BE] # CANADIAN SYLLABICS ATHAPASCAN M
+14BF ; [.2012.0020.0002.14BF] # CANADIAN SYLLABICS SAYISI M
+14C0 ; [.2013.0020.0002.14C0] # CANADIAN SYLLABICS NE
+14C1 ; [.2014.0020.0002.14C1] # CANADIAN SYLLABICS NAAI
+14C2 ; [.2015.0020.0002.14C2] # CANADIAN SYLLABICS NI
+14C3 ; [.2016.0020.0002.14C3] # CANADIAN SYLLABICS NII
+14C4 ; [.2017.0020.0002.14C4] # CANADIAN SYLLABICS NO
+14C5 ; [.2018.0020.0002.14C5] # CANADIAN SYLLABICS NOO
+14C6 ; [.2019.0020.0002.14C6] # CANADIAN SYLLABICS Y-CREE NOO
+14C7 ; [.201A.0020.0002.14C7] # CANADIAN SYLLABICS NA
+14C8 ; [.201B.0020.0002.14C8] # CANADIAN SYLLABICS NAA
+14C9 ; [.201C.0020.0002.14C9] # CANADIAN SYLLABICS NWE
+14CA ; [.201D.0020.0002.14CA] # CANADIAN SYLLABICS WEST-CREE NWE
+14CB ; [.201E.0020.0002.14CB] # CANADIAN SYLLABICS NWA
+14CC ; [.201F.0020.0002.14CC] # CANADIAN SYLLABICS WEST-CREE NWA
+14CD ; [.2020.0020.0002.14CD] # CANADIAN SYLLABICS NWAA
+14CE ; [.2021.0020.0002.14CE] # CANADIAN SYLLABICS WEST-CREE NWAA
+14CF ; [.2022.0020.0002.14CF] # CANADIAN SYLLABICS NASKAPI NWAA
+14D0 ; [.2023.0020.0002.14D0] # CANADIAN SYLLABICS N
+14D1 ; [.2024.0020.0002.14D1] # CANADIAN SYLLABICS CARRIER NG
+14D2 ; [.2025.0020.0002.14D2] # CANADIAN SYLLABICS NH
+14D3 ; [.2026.0020.0002.14D3] # CANADIAN SYLLABICS LE
+14D4 ; [.2027.0020.0002.14D4] # CANADIAN SYLLABICS LAAI
+14D5 ; [.2028.0020.0002.14D5] # CANADIAN SYLLABICS LI
+14D6 ; [.2029.0020.0002.14D6] # CANADIAN SYLLABICS LII
+14D7 ; [.202A.0020.0002.14D7] # CANADIAN SYLLABICS LO
+14D8 ; [.202B.0020.0002.14D8] # CANADIAN SYLLABICS LOO
+14D9 ; [.202C.0020.0002.14D9] # CANADIAN SYLLABICS Y-CREE LOO
+14DA ; [.202D.0020.0002.14DA] # CANADIAN SYLLABICS LA
+14DB ; [.202E.0020.0002.14DB] # CANADIAN SYLLABICS LAA
+14DC ; [.202F.0020.0002.14DC] # CANADIAN SYLLABICS LWE
+14DD ; [.2030.0020.0002.14DD] # CANADIAN SYLLABICS WEST-CREE LWE
+14DE ; [.2031.0020.0002.14DE] # CANADIAN SYLLABICS LWI
+14DF ; [.2032.0020.0002.14DF] # CANADIAN SYLLABICS WEST-CREE LWI
+14E0 ; [.2033.0020.0002.14E0] # CANADIAN SYLLABICS LWII
+14E1 ; [.2034.0020.0002.14E1] # CANADIAN SYLLABICS WEST-CREE LWII
+14E2 ; [.2035.0020.0002.14E2] # CANADIAN SYLLABICS LWO
+14E3 ; [.2036.0020.0002.14E3] # CANADIAN SYLLABICS WEST-CREE LWO
+14E4 ; [.2037.0020.0002.14E4] # CANADIAN SYLLABICS LWOO
+14E5 ; [.2038.0020.0002.14E5] # CANADIAN SYLLABICS WEST-CREE LWOO
+14E6 ; [.2039.0020.0002.14E6] # CANADIAN SYLLABICS LWA
+14E7 ; [.203A.0020.0002.14E7] # CANADIAN SYLLABICS WEST-CREE LWA
+14E8 ; [.203B.0020.0002.14E8] # CANADIAN SYLLABICS LWAA
+14E9 ; [.203C.0020.0002.14E9] # CANADIAN SYLLABICS WEST-CREE LWAA
+14EA ; [.203D.0020.0002.14EA] # CANADIAN SYLLABICS L
+14EB ; [.203E.0020.0002.14EB] # CANADIAN SYLLABICS WEST-CREE L
+14EC ; [.203F.0020.0002.14EC] # CANADIAN SYLLABICS MEDIAL L
+14ED ; [.2040.0020.0002.14ED] # CANADIAN SYLLABICS SE
+14EE ; [.2041.0020.0002.14EE] # CANADIAN SYLLABICS SAAI
+14EF ; [.2042.0020.0002.14EF] # CANADIAN SYLLABICS SI
+14F0 ; [.2043.0020.0002.14F0] # CANADIAN SYLLABICS SII
+14F1 ; [.2044.0020.0002.14F1] # CANADIAN SYLLABICS SO
+14F2 ; [.2045.0020.0002.14F2] # CANADIAN SYLLABICS SOO
+14F3 ; [.2046.0020.0002.14F3] # CANADIAN SYLLABICS Y-CREE SOO
+14F4 ; [.2047.0020.0002.14F4] # CANADIAN SYLLABICS SA
+14F5 ; [.2048.0020.0002.14F5] # CANADIAN SYLLABICS SAA
+14F6 ; [.2049.0020.0002.14F6] # CANADIAN SYLLABICS SWE
+14F7 ; [.204A.0020.0002.14F7] # CANADIAN SYLLABICS WEST-CREE SWE
+14F8 ; [.204B.0020.0002.14F8] # CANADIAN SYLLABICS SWI
+14F9 ; [.204C.0020.0002.14F9] # CANADIAN SYLLABICS WEST-CREE SWI
+14FA ; [.204D.0020.0002.14FA] # CANADIAN SYLLABICS SWII
+14FB ; [.204E.0020.0002.14FB] # CANADIAN SYLLABICS WEST-CREE SWII
+14FC ; [.204F.0020.0002.14FC] # CANADIAN SYLLABICS SWO
+14FD ; [.2050.0020.0002.14FD] # CANADIAN SYLLABICS WEST-CREE SWO
+14FE ; [.2051.0020.0002.14FE] # CANADIAN SYLLABICS SWOO
+14FF ; [.2052.0020.0002.14FF] # CANADIAN SYLLABICS WEST-CREE SWOO
+1500 ; [.2053.0020.0002.1500] # CANADIAN SYLLABICS SWA
+1501 ; [.2054.0020.0002.1501] # CANADIAN SYLLABICS WEST-CREE SWA
+1502 ; [.2055.0020.0002.1502] # CANADIAN SYLLABICS SWAA
+1503 ; [.2056.0020.0002.1503] # CANADIAN SYLLABICS WEST-CREE SWAA
+1504 ; [.2057.0020.0002.1504] # CANADIAN SYLLABICS NASKAPI SWAA
+1505 ; [.2058.0020.0002.1505] # CANADIAN SYLLABICS S
+1506 ; [.2059.0020.0002.1506] # CANADIAN SYLLABICS ATHAPASCAN S
+1507 ; [.205A.0020.0002.1507] # CANADIAN SYLLABICS SW
+1508 ; [.205B.0020.0002.1508] # CANADIAN SYLLABICS BLACKFOOT S
+1509 ; [.205C.0020.0002.1509] # CANADIAN SYLLABICS MOOSE-CREE SK
+150A ; [.205D.0020.0002.150A] # CANADIAN SYLLABICS NASKAPI SKW
+150B ; [.205E.0020.0002.150B] # CANADIAN SYLLABICS NASKAPI S-W
+150C ; [.205F.0020.0002.150C] # CANADIAN SYLLABICS NASKAPI SPWA
+150D ; [.2060.0020.0002.150D] # CANADIAN SYLLABICS NASKAPI STWA
+150E ; [.2061.0020.0002.150E] # CANADIAN SYLLABICS NASKAPI SKWA
+150F ; [.2062.0020.0002.150F] # CANADIAN SYLLABICS NASKAPI SCWA
+1510 ; [.2063.0020.0002.1510] # CANADIAN SYLLABICS SHE
+1511 ; [.2064.0020.0002.1511] # CANADIAN SYLLABICS SHI
+1512 ; [.2065.0020.0002.1512] # CANADIAN SYLLABICS SHII
+1513 ; [.2066.0020.0002.1513] # CANADIAN SYLLABICS SHO
+1514 ; [.2067.0020.0002.1514] # CANADIAN SYLLABICS SHOO
+1515 ; [.2068.0020.0002.1515] # CANADIAN SYLLABICS SHA
+1516 ; [.2069.0020.0002.1516] # CANADIAN SYLLABICS SHAA
+1517 ; [.206A.0020.0002.1517] # CANADIAN SYLLABICS SHWE
+1518 ; [.206B.0020.0002.1518] # CANADIAN SYLLABICS WEST-CREE SHWE
+1519 ; [.206C.0020.0002.1519] # CANADIAN SYLLABICS SHWI
+151A ; [.206D.0020.0002.151A] # CANADIAN SYLLABICS WEST-CREE SHWI
+151B ; [.206E.0020.0002.151B] # CANADIAN SYLLABICS SHWII
+151C ; [.206F.0020.0002.151C] # CANADIAN SYLLABICS WEST-CREE SHWII
+151D ; [.2070.0020.0002.151D] # CANADIAN SYLLABICS SHWO
+151E ; [.2071.0020.0002.151E] # CANADIAN SYLLABICS WEST-CREE SHWO
+151F ; [.2072.0020.0002.151F] # CANADIAN SYLLABICS SHWOO
+1520 ; [.2073.0020.0002.1520] # CANADIAN SYLLABICS WEST-CREE SHWOO
+1521 ; [.2074.0020.0002.1521] # CANADIAN SYLLABICS SHWA
+1522 ; [.2075.0020.0002.1522] # CANADIAN SYLLABICS WEST-CREE SHWA
+1523 ; [.2076.0020.0002.1523] # CANADIAN SYLLABICS SHWAA
+1524 ; [.2077.0020.0002.1524] # CANADIAN SYLLABICS WEST-CREE SHWAA
+1525 ; [.2078.0020.0002.1525] # CANADIAN SYLLABICS SH
+1526 ; [.2079.0020.0002.1526] # CANADIAN SYLLABICS YE
+1527 ; [.207A.0020.0002.1527] # CANADIAN SYLLABICS YAAI
+1528 ; [.207B.0020.0002.1528] # CANADIAN SYLLABICS YI
+1529 ; [.207C.0020.0002.1529] # CANADIAN SYLLABICS YII
+152A ; [.207D.0020.0002.152A] # CANADIAN SYLLABICS YO
+152B ; [.207E.0020.0002.152B] # CANADIAN SYLLABICS YOO
+152C ; [.207F.0020.0002.152C] # CANADIAN SYLLABICS Y-CREE YOO
+152D ; [.2080.0020.0002.152D] # CANADIAN SYLLABICS YA
+152E ; [.2081.0020.0002.152E] # CANADIAN SYLLABICS YAA
+152F ; [.2082.0020.0002.152F] # CANADIAN SYLLABICS YWE
+1530 ; [.2083.0020.0002.1530] # CANADIAN SYLLABICS WEST-CREE YWE
+1531 ; [.2084.0020.0002.1531] # CANADIAN SYLLABICS YWI
+1532 ; [.2085.0020.0002.1532] # CANADIAN SYLLABICS WEST-CREE YWI
+1533 ; [.2086.0020.0002.1533] # CANADIAN SYLLABICS YWII
+1534 ; [.2087.0020.0002.1534] # CANADIAN SYLLABICS WEST-CREE YWII
+1535 ; [.2088.0020.0002.1535] # CANADIAN SYLLABICS YWO
+1536 ; [.2089.0020.0002.1536] # CANADIAN SYLLABICS WEST-CREE YWO
+1537 ; [.208A.0020.0002.1537] # CANADIAN SYLLABICS YWOO
+1538 ; [.208B.0020.0002.1538] # CANADIAN SYLLABICS WEST-CREE YWOO
+1539 ; [.208C.0020.0002.1539] # CANADIAN SYLLABICS YWA
+153A ; [.208D.0020.0002.153A] # CANADIAN SYLLABICS WEST-CREE YWA
+153B ; [.208E.0020.0002.153B] # CANADIAN SYLLABICS YWAA
+153C ; [.208F.0020.0002.153C] # CANADIAN SYLLABICS WEST-CREE YWAA
+153D ; [.2090.0020.0002.153D] # CANADIAN SYLLABICS NASKAPI YWAA
+153E ; [.2091.0020.0002.153E] # CANADIAN SYLLABICS Y
+153F ; [.2092.0020.0002.153F] # CANADIAN SYLLABICS BIBLE-CREE Y
+1540 ; [.2093.0020.0002.1540] # CANADIAN SYLLABICS WEST-CREE Y
+1541 ; [.2094.0020.0002.1541] # CANADIAN SYLLABICS SAYISI YI
+1542 ; [.2095.0020.0002.1542] # CANADIAN SYLLABICS RE
+1543 ; [.2096.0020.0002.1543] # CANADIAN SYLLABICS R-CREE RE
+1544 ; [.2097.0020.0002.1544] # CANADIAN SYLLABICS WEST-CREE LE
+1545 ; [.2098.0020.0002.1545] # CANADIAN SYLLABICS RAAI
+1546 ; [.2099.0020.0002.1546] # CANADIAN SYLLABICS RI
+1547 ; [.209A.0020.0002.1547] # CANADIAN SYLLABICS RII
+1548 ; [.209B.0020.0002.1548] # CANADIAN SYLLABICS RO
+1549 ; [.209C.0020.0002.1549] # CANADIAN SYLLABICS ROO
+154A ; [.209D.0020.0002.154A] # CANADIAN SYLLABICS WEST-CREE LO
+154B ; [.209E.0020.0002.154B] # CANADIAN SYLLABICS RA
+154C ; [.209F.0020.0002.154C] # CANADIAN SYLLABICS RAA
+154D ; [.20A0.0020.0002.154D] # CANADIAN SYLLABICS WEST-CREE LA
+154E ; [.20A1.0020.0002.154E] # CANADIAN SYLLABICS RWAA
+154F ; [.20A2.0020.0002.154F] # CANADIAN SYLLABICS WEST-CREE RWAA
+1550 ; [.20A3.0020.0002.1550] # CANADIAN SYLLABICS R
+1551 ; [.20A4.0020.0002.1551] # CANADIAN SYLLABICS WEST-CREE R
+1552 ; [.20A5.0020.0002.1552] # CANADIAN SYLLABICS MEDIAL R
+1553 ; [.20A6.0020.0002.1553] # CANADIAN SYLLABICS FE
+1554 ; [.20A7.0020.0002.1554] # CANADIAN SYLLABICS FAAI
+1555 ; [.20A8.0020.0002.1555] # CANADIAN SYLLABICS FI
+1556 ; [.20A9.0020.0002.1556] # CANADIAN SYLLABICS FII
+1557 ; [.20AA.0020.0002.1557] # CANADIAN SYLLABICS FO
+1558 ; [.20AB.0020.0002.1558] # CANADIAN SYLLABICS FOO
+1559 ; [.20AC.0020.0002.1559] # CANADIAN SYLLABICS FA
+155A ; [.20AD.0020.0002.155A] # CANADIAN SYLLABICS FAA
+155B ; [.20AE.0020.0002.155B] # CANADIAN SYLLABICS FWAA
+155C ; [.20AF.0020.0002.155C] # CANADIAN SYLLABICS WEST-CREE FWAA
+155D ; [.20B0.0020.0002.155D] # CANADIAN SYLLABICS F
+155E ; [.20B1.0020.0002.155E] # CANADIAN SYLLABICS THE
+155F ; [.20B2.0020.0002.155F] # CANADIAN SYLLABICS N-CREE THE
+1560 ; [.20B3.0020.0002.1560] # CANADIAN SYLLABICS THI
+1561 ; [.20B4.0020.0002.1561] # CANADIAN SYLLABICS N-CREE THI
+1562 ; [.20B5.0020.0002.1562] # CANADIAN SYLLABICS THII
+1563 ; [.20B6.0020.0002.1563] # CANADIAN SYLLABICS N-CREE THII
+1564 ; [.20B7.0020.0002.1564] # CANADIAN SYLLABICS THO
+1565 ; [.20B8.0020.0002.1565] # CANADIAN SYLLABICS THOO
+1566 ; [.20B9.0020.0002.1566] # CANADIAN SYLLABICS THA
+1567 ; [.20BA.0020.0002.1567] # CANADIAN SYLLABICS THAA
+1568 ; [.20BB.0020.0002.1568] # CANADIAN SYLLABICS THWAA
+1569 ; [.20BC.0020.0002.1569] # CANADIAN SYLLABICS WEST-CREE THWAA
+156A ; [.20BD.0020.0002.156A] # CANADIAN SYLLABICS TH
+156B ; [.20BE.0020.0002.156B] # CANADIAN SYLLABICS TTHE
+156C ; [.20BF.0020.0002.156C] # CANADIAN SYLLABICS TTHI
+156D ; [.20C0.0020.0002.156D] # CANADIAN SYLLABICS TTHO
+156E ; [.20C1.0020.0002.156E] # CANADIAN SYLLABICS TTHA
+156F ; [.20C2.0020.0002.156F] # CANADIAN SYLLABICS TTH
+1570 ; [.20C3.0020.0002.1570] # CANADIAN SYLLABICS TYE
+1571 ; [.20C4.0020.0002.1571] # CANADIAN SYLLABICS TYI
+1572 ; [.20C5.0020.0002.1572] # CANADIAN SYLLABICS TYO
+1573 ; [.20C6.0020.0002.1573] # CANADIAN SYLLABICS TYA
+1574 ; [.20C7.0020.0002.1574] # CANADIAN SYLLABICS NUNAVIK HE
+1575 ; [.20C8.0020.0002.1575] # CANADIAN SYLLABICS NUNAVIK HI
+1576 ; [.20C9.0020.0002.1576] # CANADIAN SYLLABICS NUNAVIK HII
+1577 ; [.20CA.0020.0002.1577] # CANADIAN SYLLABICS NUNAVIK HO
+1578 ; [.20CB.0020.0002.1578] # CANADIAN SYLLABICS NUNAVIK HOO
+1579 ; [.20CC.0020.0002.1579] # CANADIAN SYLLABICS NUNAVIK HA
+157A ; [.20CD.0020.0002.157A] # CANADIAN SYLLABICS NUNAVIK HAA
+157B ; [.20CE.0020.0002.157B] # CANADIAN SYLLABICS NUNAVIK H
+157D ; [.20CF.0020.0002.157D] # CANADIAN SYLLABICS HK
+166F ; [.20D0.0020.0002.166F] # CANADIAN SYLLABICS QAI
+157E ; [.20D1.0020.0002.157E] # CANADIAN SYLLABICS QAAI
+157F ; [.20D2.0020.0002.157F] # CANADIAN SYLLABICS QI
+1580 ; [.20D3.0020.0002.1580] # CANADIAN SYLLABICS QII
+1581 ; [.20D4.0020.0002.1581] # CANADIAN SYLLABICS QO
+1582 ; [.20D5.0020.0002.1582] # CANADIAN SYLLABICS QOO
+1583 ; [.20D6.0020.0002.1583] # CANADIAN SYLLABICS QA
+1584 ; [.20D7.0020.0002.1584] # CANADIAN SYLLABICS QAA
+1585 ; [.20D8.0020.0002.1585] # CANADIAN SYLLABICS Q
+1586 ; [.20D9.0020.0002.1586] # CANADIAN SYLLABICS TLHE
+1587 ; [.20DA.0020.0002.1587] # CANADIAN SYLLABICS TLHI
+1588 ; [.20DB.0020.0002.1588] # CANADIAN SYLLABICS TLHO
+1589 ; [.20DC.0020.0002.1589] # CANADIAN SYLLABICS TLHA
+158A ; [.20DD.0020.0002.158A] # CANADIAN SYLLABICS WEST-CREE RE
+158B ; [.20DE.0020.0002.158B] # CANADIAN SYLLABICS WEST-CREE RI
+158C ; [.20DF.0020.0002.158C] # CANADIAN SYLLABICS WEST-CREE RO
+158D ; [.20E0.0020.0002.158D] # CANADIAN SYLLABICS WEST-CREE RA
+1670 ; [.20E1.0020.0002.1670] # CANADIAN SYLLABICS NGAI
+158E ; [.20E2.0020.0002.158E] # CANADIAN SYLLABICS NGAAI
+158F ; [.20E3.0020.0002.158F] # CANADIAN SYLLABICS NGI
+1590 ; [.20E4.0020.0002.1590] # CANADIAN SYLLABICS NGII
+1591 ; [.20E5.0020.0002.1591] # CANADIAN SYLLABICS NGO
+1592 ; [.20E6.0020.0002.1592] # CANADIAN SYLLABICS NGOO
+1593 ; [.20E7.0020.0002.1593] # CANADIAN SYLLABICS NGA
+1594 ; [.20E8.0020.0002.1594] # CANADIAN SYLLABICS NGAA
+1595 ; [.20E9.0020.0002.1595] # CANADIAN SYLLABICS NG
+1671 ; [.20EA.0020.0002.1671] # CANADIAN SYLLABICS NNGI
+1672 ; [.20EB.0020.0002.1672] # CANADIAN SYLLABICS NNGII
+1673 ; [.20EC.0020.0002.1673] # CANADIAN SYLLABICS NNGO
+1674 ; [.20ED.0020.0002.1674] # CANADIAN SYLLABICS NNGOO
+1675 ; [.20EE.0020.0002.1675] # CANADIAN SYLLABICS NNGA
+1676 ; [.20EF.0020.0002.1676] # CANADIAN SYLLABICS NNGAA
+1596 ; [.20F0.0020.0002.1596] # CANADIAN SYLLABICS NNG
+1597 ; [.20F1.0020.0002.1597] # CANADIAN SYLLABICS SAYISI SHE
+1598 ; [.20F2.0020.0002.1598] # CANADIAN SYLLABICS SAYISI SHI
+1599 ; [.20F3.0020.0002.1599] # CANADIAN SYLLABICS SAYISI SHO
+159A ; [.20F4.0020.0002.159A] # CANADIAN SYLLABICS SAYISI SHA
+159B ; [.20F5.0020.0002.159B] # CANADIAN SYLLABICS WOODS-CREE THE
+159C ; [.20F6.0020.0002.159C] # CANADIAN SYLLABICS WOODS-CREE THI
+159D ; [.20F7.0020.0002.159D] # CANADIAN SYLLABICS WOODS-CREE THO
+159E ; [.20F8.0020.0002.159E] # CANADIAN SYLLABICS WOODS-CREE THA
+159F ; [.20F9.0020.0002.159F] # CANADIAN SYLLABICS WOODS-CREE TH
+15A0 ; [.20FA.0020.0002.15A0] # CANADIAN SYLLABICS LHI
+15A1 ; [.20FB.0020.0002.15A1] # CANADIAN SYLLABICS LHII
+15A2 ; [.20FC.0020.0002.15A2] # CANADIAN SYLLABICS LHO
+15A3 ; [.20FD.0020.0002.15A3] # CANADIAN SYLLABICS LHOO
+15A4 ; [.20FE.0020.0002.15A4] # CANADIAN SYLLABICS LHA
+15A5 ; [.20FF.0020.0002.15A5] # CANADIAN SYLLABICS LHAA
+15A6 ; [.2100.0020.0002.15A6] # CANADIAN SYLLABICS LH
+157C ; [.2101.0020.0002.157C] # CANADIAN SYLLABICS NUNAVUT H
+15A7 ; [.2102.0020.0002.15A7] # CANADIAN SYLLABICS TH-CREE THE
+15A8 ; [.2103.0020.0002.15A8] # CANADIAN SYLLABICS TH-CREE THI
+15A9 ; [.2104.0020.0002.15A9] # CANADIAN SYLLABICS TH-CREE THII
+15AA ; [.2105.0020.0002.15AA] # CANADIAN SYLLABICS TH-CREE THO
+15AB ; [.2106.0020.0002.15AB] # CANADIAN SYLLABICS TH-CREE THOO
+15AC ; [.2107.0020.0002.15AC] # CANADIAN SYLLABICS TH-CREE THA
+15AD ; [.2108.0020.0002.15AD] # CANADIAN SYLLABICS TH-CREE THAA
+15AE ; [.2109.0020.0002.15AE] # CANADIAN SYLLABICS TH-CREE TH
+15AF ; [.210A.0020.0002.15AF] # CANADIAN SYLLABICS AIVILIK B
+15B0 ; [.210B.0020.0002.15B0] # CANADIAN SYLLABICS BLACKFOOT E
+15B1 ; [.210C.0020.0002.15B1] # CANADIAN SYLLABICS BLACKFOOT I
+15B2 ; [.210D.0020.0002.15B2] # CANADIAN SYLLABICS BLACKFOOT O
+15B3 ; [.210E.0020.0002.15B3] # CANADIAN SYLLABICS BLACKFOOT A
+15B4 ; [.210F.0020.0002.15B4] # CANADIAN SYLLABICS BLACKFOOT WE
+15B5 ; [.2110.0020.0002.15B5] # CANADIAN SYLLABICS BLACKFOOT WI
+15B6 ; [.2111.0020.0002.15B6] # CANADIAN SYLLABICS BLACKFOOT WO
+15B7 ; [.2112.0020.0002.15B7] # CANADIAN SYLLABICS BLACKFOOT WA
+15B8 ; [.2113.0020.0002.15B8] # CANADIAN SYLLABICS BLACKFOOT NE
+15B9 ; [.2114.0020.0002.15B9] # CANADIAN SYLLABICS BLACKFOOT NI
+15BA ; [.2115.0020.0002.15BA] # CANADIAN SYLLABICS BLACKFOOT NO
+15BB ; [.2116.0020.0002.15BB] # CANADIAN SYLLABICS BLACKFOOT NA
+15BC ; [.2117.0020.0002.15BC] # CANADIAN SYLLABICS BLACKFOOT KE
+15BD ; [.2118.0020.0002.15BD] # CANADIAN SYLLABICS BLACKFOOT KI
+15BE ; [.2119.0020.0002.15BE] # CANADIAN SYLLABICS BLACKFOOT KO
+15BF ; [.211A.0020.0002.15BF] # CANADIAN SYLLABICS BLACKFOOT KA
+15C0 ; [.211B.0020.0002.15C0] # CANADIAN SYLLABICS SAYISI HE
+15C1 ; [.211C.0020.0002.15C1] # CANADIAN SYLLABICS SAYISI HI
+15C2 ; [.211D.0020.0002.15C2] # CANADIAN SYLLABICS SAYISI HO
+15C3 ; [.211E.0020.0002.15C3] # CANADIAN SYLLABICS SAYISI HA
+15C4 ; [.211F.0020.0002.15C4] # CANADIAN SYLLABICS CARRIER GHU
+15C5 ; [.2120.0020.0002.15C5] # CANADIAN SYLLABICS CARRIER GHO
+15C6 ; [.2121.0020.0002.15C6] # CANADIAN SYLLABICS CARRIER GHE
+15C7 ; [.2122.0020.0002.15C7] # CANADIAN SYLLABICS CARRIER GHEE
+15C8 ; [.2123.0020.0002.15C8] # CANADIAN SYLLABICS CARRIER GHI
+15C9 ; [.2124.0020.0002.15C9] # CANADIAN SYLLABICS CARRIER GHA
+15CA ; [.2125.0020.0002.15CA] # CANADIAN SYLLABICS CARRIER RU
+15CB ; [.2126.0020.0002.15CB] # CANADIAN SYLLABICS CARRIER RO
+15CC ; [.2127.0020.0002.15CC] # CANADIAN SYLLABICS CARRIER RE
+15CD ; [.2128.0020.0002.15CD] # CANADIAN SYLLABICS CARRIER REE
+15CE ; [.2129.0020.0002.15CE] # CANADIAN SYLLABICS CARRIER RI
+15CF ; [.212A.0020.0002.15CF] # CANADIAN SYLLABICS CARRIER RA
+15D0 ; [.212B.0020.0002.15D0] # CANADIAN SYLLABICS CARRIER WU
+15D1 ; [.212C.0020.0002.15D1] # CANADIAN SYLLABICS CARRIER WO
+15D2 ; [.212D.0020.0002.15D2] # CANADIAN SYLLABICS CARRIER WE
+15D3 ; [.212E.0020.0002.15D3] # CANADIAN SYLLABICS CARRIER WEE
+15D4 ; [.212F.0020.0002.15D4] # CANADIAN SYLLABICS CARRIER WI
+15D5 ; [.2130.0020.0002.15D5] # CANADIAN SYLLABICS CARRIER WA
+15D6 ; [.2131.0020.0002.15D6] # CANADIAN SYLLABICS CARRIER HWU
+15D7 ; [.2132.0020.0002.15D7] # CANADIAN SYLLABICS CARRIER HWO
+15D8 ; [.2133.0020.0002.15D8] # CANADIAN SYLLABICS CARRIER HWE
+15D9 ; [.2134.0020.0002.15D9] # CANADIAN SYLLABICS CARRIER HWEE
+15DA ; [.2135.0020.0002.15DA] # CANADIAN SYLLABICS CARRIER HWI
+15DB ; [.2136.0020.0002.15DB] # CANADIAN SYLLABICS CARRIER HWA
+15DC ; [.2137.0020.0002.15DC] # CANADIAN SYLLABICS CARRIER THU
+15DD ; [.2138.0020.0002.15DD] # CANADIAN SYLLABICS CARRIER THO
+15DE ; [.2139.0020.0002.15DE] # CANADIAN SYLLABICS CARRIER THE
+15DF ; [.213A.0020.0002.15DF] # CANADIAN SYLLABICS CARRIER THEE
+15E0 ; [.213B.0020.0002.15E0] # CANADIAN SYLLABICS CARRIER THI
+15E1 ; [.213C.0020.0002.15E1] # CANADIAN SYLLABICS CARRIER THA
+15E2 ; [.213D.0020.0002.15E2] # CANADIAN SYLLABICS CARRIER TTU
+15E3 ; [.213E.0020.0002.15E3] # CANADIAN SYLLABICS CARRIER TTO
+15E4 ; [.213F.0020.0002.15E4] # CANADIAN SYLLABICS CARRIER TTE
+15E5 ; [.2140.0020.0002.15E5] # CANADIAN SYLLABICS CARRIER TTEE
+15E6 ; [.2141.0020.0002.15E6] # CANADIAN SYLLABICS CARRIER TTI
+15E7 ; [.2142.0020.0002.15E7] # CANADIAN SYLLABICS CARRIER TTA
+15E8 ; [.2143.0020.0002.15E8] # CANADIAN SYLLABICS CARRIER PU
+15E9 ; [.2144.0020.0002.15E9] # CANADIAN SYLLABICS CARRIER PO
+15EA ; [.2145.0020.0002.15EA] # CANADIAN SYLLABICS CARRIER PE
+15EB ; [.2146.0020.0002.15EB] # CANADIAN SYLLABICS CARRIER PEE
+15EC ; [.2147.0020.0002.15EC] # CANADIAN SYLLABICS CARRIER PI
+15ED ; [.2148.0020.0002.15ED] # CANADIAN SYLLABICS CARRIER PA
+15EE ; [.2149.0020.0002.15EE] # CANADIAN SYLLABICS CARRIER P
+15EF ; [.214A.0020.0002.15EF] # CANADIAN SYLLABICS CARRIER GU
+15F0 ; [.214B.0020.0002.15F0] # CANADIAN SYLLABICS CARRIER GO
+15F1 ; [.214C.0020.0002.15F1] # CANADIAN SYLLABICS CARRIER GE
+15F2 ; [.214D.0020.0002.15F2] # CANADIAN SYLLABICS CARRIER GEE
+15F3 ; [.214E.0020.0002.15F3] # CANADIAN SYLLABICS CARRIER GI
+15F4 ; [.214F.0020.0002.15F4] # CANADIAN SYLLABICS CARRIER GA
+15F5 ; [.2150.0020.0002.15F5] # CANADIAN SYLLABICS CARRIER KHU
+15F6 ; [.2151.0020.0002.15F6] # CANADIAN SYLLABICS CARRIER KHO
+15F7 ; [.2152.0020.0002.15F7] # CANADIAN SYLLABICS CARRIER KHE
+15F8 ; [.2153.0020.0002.15F8] # CANADIAN SYLLABICS CARRIER KHEE
+15F9 ; [.2154.0020.0002.15F9] # CANADIAN SYLLABICS CARRIER KHI
+15FA ; [.2155.0020.0002.15FA] # CANADIAN SYLLABICS CARRIER KHA
+15FB ; [.2156.0020.0002.15FB] # CANADIAN SYLLABICS CARRIER KKU
+15FC ; [.2157.0020.0002.15FC] # CANADIAN SYLLABICS CARRIER KKO
+15FD ; [.2158.0020.0002.15FD] # CANADIAN SYLLABICS CARRIER KKE
+15FE ; [.2159.0020.0002.15FE] # CANADIAN SYLLABICS CARRIER KKEE
+15FF ; [.215A.0020.0002.15FF] # CANADIAN SYLLABICS CARRIER KKI
+1600 ; [.215B.0020.0002.1600] # CANADIAN SYLLABICS CARRIER KKA
+1601 ; [.215C.0020.0002.1601] # CANADIAN SYLLABICS CARRIER KK
+1602 ; [.215D.0020.0002.1602] # CANADIAN SYLLABICS CARRIER NU
+1603 ; [.215E.0020.0002.1603] # CANADIAN SYLLABICS CARRIER NO
+1604 ; [.215F.0020.0002.1604] # CANADIAN SYLLABICS CARRIER NE
+1605 ; [.2160.0020.0002.1605] # CANADIAN SYLLABICS CARRIER NEE
+1606 ; [.2161.0020.0002.1606] # CANADIAN SYLLABICS CARRIER NI
+1607 ; [.2162.0020.0002.1607] # CANADIAN SYLLABICS CARRIER NA
+1608 ; [.2163.0020.0002.1608] # CANADIAN SYLLABICS CARRIER MU
+1609 ; [.2164.0020.0002.1609] # CANADIAN SYLLABICS CARRIER MO
+160A ; [.2165.0020.0002.160A] # CANADIAN SYLLABICS CARRIER ME
+160B ; [.2166.0020.0002.160B] # CANADIAN SYLLABICS CARRIER MEE
+160C ; [.2167.0020.0002.160C] # CANADIAN SYLLABICS CARRIER MI
+160D ; [.2168.0020.0002.160D] # CANADIAN SYLLABICS CARRIER MA
+160E ; [.2169.0020.0002.160E] # CANADIAN SYLLABICS CARRIER YU
+160F ; [.216A.0020.0002.160F] # CANADIAN SYLLABICS CARRIER YO
+1610 ; [.216B.0020.0002.1610] # CANADIAN SYLLABICS CARRIER YE
+1611 ; [.216C.0020.0002.1611] # CANADIAN SYLLABICS CARRIER YEE
+1612 ; [.216D.0020.0002.1612] # CANADIAN SYLLABICS CARRIER YI
+1613 ; [.216E.0020.0002.1613] # CANADIAN SYLLABICS CARRIER YA
+1614 ; [.216F.0020.0002.1614] # CANADIAN SYLLABICS CARRIER JU
+1615 ; [.2170.0020.0002.1615] # CANADIAN SYLLABICS SAYISI JU
+1616 ; [.2171.0020.0002.1616] # CANADIAN SYLLABICS CARRIER JO
+1617 ; [.2172.0020.0002.1617] # CANADIAN SYLLABICS CARRIER JE
+1618 ; [.2173.0020.0002.1618] # CANADIAN SYLLABICS CARRIER JEE
+1619 ; [.2174.0020.0002.1619] # CANADIAN SYLLABICS CARRIER JI
+161A ; [.2175.0020.0002.161A] # CANADIAN SYLLABICS SAYISI JI
+161B ; [.2176.0020.0002.161B] # CANADIAN SYLLABICS CARRIER JA
+161C ; [.2177.0020.0002.161C] # CANADIAN SYLLABICS CARRIER JJU
+161D ; [.2178.0020.0002.161D] # CANADIAN SYLLABICS CARRIER JJO
+161E ; [.2179.0020.0002.161E] # CANADIAN SYLLABICS CARRIER JJE
+161F ; [.217A.0020.0002.161F] # CANADIAN SYLLABICS CARRIER JJEE
+1620 ; [.217B.0020.0002.1620] # CANADIAN SYLLABICS CARRIER JJI
+1621 ; [.217C.0020.0002.1621] # CANADIAN SYLLABICS CARRIER JJA
+1622 ; [.217D.0020.0002.1622] # CANADIAN SYLLABICS CARRIER LU
+1623 ; [.217E.0020.0002.1623] # CANADIAN SYLLABICS CARRIER LO
+1624 ; [.217F.0020.0002.1624] # CANADIAN SYLLABICS CARRIER LE
+1625 ; [.2180.0020.0002.1625] # CANADIAN SYLLABICS CARRIER LEE
+1626 ; [.2181.0020.0002.1626] # CANADIAN SYLLABICS CARRIER LI
+1627 ; [.2182.0020.0002.1627] # CANADIAN SYLLABICS CARRIER LA
+1628 ; [.2183.0020.0002.1628] # CANADIAN SYLLABICS CARRIER DLU
+1629 ; [.2184.0020.0002.1629] # CANADIAN SYLLABICS CARRIER DLO
+162A ; [.2185.0020.0002.162A] # CANADIAN SYLLABICS CARRIER DLE
+162B ; [.2186.0020.0002.162B] # CANADIAN SYLLABICS CARRIER DLEE
+162C ; [.2187.0020.0002.162C] # CANADIAN SYLLABICS CARRIER DLI
+162D ; [.2188.0020.0002.162D] # CANADIAN SYLLABICS CARRIER DLA
+162E ; [.2189.0020.0002.162E] # CANADIAN SYLLABICS CARRIER LHU
+162F ; [.218A.0020.0002.162F] # CANADIAN SYLLABICS CARRIER LHO
+1630 ; [.218B.0020.0002.1630] # CANADIAN SYLLABICS CARRIER LHE
+1631 ; [.218C.0020.0002.1631] # CANADIAN SYLLABICS CARRIER LHEE
+1632 ; [.218D.0020.0002.1632] # CANADIAN SYLLABICS CARRIER LHI
+1633 ; [.218E.0020.0002.1633] # CANADIAN SYLLABICS CARRIER LHA
+1634 ; [.218F.0020.0002.1634] # CANADIAN SYLLABICS CARRIER TLHU
+1635 ; [.2190.0020.0002.1635] # CANADIAN SYLLABICS CARRIER TLHO
+1636 ; [.2191.0020.0002.1636] # CANADIAN SYLLABICS CARRIER TLHE
+1637 ; [.2192.0020.0002.1637] # CANADIAN SYLLABICS CARRIER TLHEE
+1638 ; [.2193.0020.0002.1638] # CANADIAN SYLLABICS CARRIER TLHI
+1639 ; [.2194.0020.0002.1639] # CANADIAN SYLLABICS CARRIER TLHA
+163A ; [.2195.0020.0002.163A] # CANADIAN SYLLABICS CARRIER TLU
+163B ; [.2196.0020.0002.163B] # CANADIAN SYLLABICS CARRIER TLO
+163C ; [.2197.0020.0002.163C] # CANADIAN SYLLABICS CARRIER TLE
+163D ; [.2198.0020.0002.163D] # CANADIAN SYLLABICS CARRIER TLEE
+163E ; [.2199.0020.0002.163E] # CANADIAN SYLLABICS CARRIER TLI
+163F ; [.219A.0020.0002.163F] # CANADIAN SYLLABICS CARRIER TLA
+1640 ; [.219B.0020.0002.1640] # CANADIAN SYLLABICS CARRIER ZU
+1641 ; [.219C.0020.0002.1641] # CANADIAN SYLLABICS CARRIER ZO
+1642 ; [.219D.0020.0002.1642] # CANADIAN SYLLABICS CARRIER ZE
+1643 ; [.219E.0020.0002.1643] # CANADIAN SYLLABICS CARRIER ZEE
+1644 ; [.219F.0020.0002.1644] # CANADIAN SYLLABICS CARRIER ZI
+1645 ; [.21A0.0020.0002.1645] # CANADIAN SYLLABICS CARRIER ZA
+1646 ; [.21A1.0020.0002.1646] # CANADIAN SYLLABICS CARRIER Z
+1647 ; [.21A2.0020.0002.1647] # CANADIAN SYLLABICS CARRIER INITIAL Z
+1648 ; [.21A3.0020.0002.1648] # CANADIAN SYLLABICS CARRIER DZU
+1649 ; [.21A4.0020.0002.1649] # CANADIAN SYLLABICS CARRIER DZO
+164A ; [.21A5.0020.0002.164A] # CANADIAN SYLLABICS CARRIER DZE
+164B ; [.21A6.0020.0002.164B] # CANADIAN SYLLABICS CARRIER DZEE
+164C ; [.21A7.0020.0002.164C] # CANADIAN SYLLABICS CARRIER DZI
+164D ; [.21A8.0020.0002.164D] # CANADIAN SYLLABICS CARRIER DZA
+164E ; [.21A9.0020.0002.164E] # CANADIAN SYLLABICS CARRIER SU
+164F ; [.21AA.0020.0002.164F] # CANADIAN SYLLABICS CARRIER SO
+1650 ; [.21AB.0020.0002.1650] # CANADIAN SYLLABICS CARRIER SE
+1651 ; [.21AC.0020.0002.1651] # CANADIAN SYLLABICS CARRIER SEE
+1652 ; [.21AD.0020.0002.1652] # CANADIAN SYLLABICS CARRIER SI
+1653 ; [.21AE.0020.0002.1653] # CANADIAN SYLLABICS CARRIER SA
+1654 ; [.21AF.0020.0002.1654] # CANADIAN SYLLABICS CARRIER SHU
+1655 ; [.21B0.0020.0002.1655] # CANADIAN SYLLABICS CARRIER SHO
+1656 ; [.21B1.0020.0002.1656] # CANADIAN SYLLABICS CARRIER SHE
+1657 ; [.21B2.0020.0002.1657] # CANADIAN SYLLABICS CARRIER SHEE
+1658 ; [.21B3.0020.0002.1658] # CANADIAN SYLLABICS CARRIER SHI
+1659 ; [.21B4.0020.0002.1659] # CANADIAN SYLLABICS CARRIER SHA
+165A ; [.21B5.0020.0002.165A] # CANADIAN SYLLABICS CARRIER SH
+165B ; [.21B6.0020.0002.165B] # CANADIAN SYLLABICS CARRIER TSU
+165C ; [.21B7.0020.0002.165C] # CANADIAN SYLLABICS CARRIER TSO
+165D ; [.21B8.0020.0002.165D] # CANADIAN SYLLABICS CARRIER TSE
+165E ; [.21B9.0020.0002.165E] # CANADIAN SYLLABICS CARRIER TSEE
+165F ; [.21BA.0020.0002.165F] # CANADIAN SYLLABICS CARRIER TSI
+1660 ; [.21BB.0020.0002.1660] # CANADIAN SYLLABICS CARRIER TSA
+1661 ; [.21BC.0020.0002.1661] # CANADIAN SYLLABICS CARRIER CHU
+1662 ; [.21BD.0020.0002.1662] # CANADIAN SYLLABICS CARRIER CHO
+1663 ; [.21BE.0020.0002.1663] # CANADIAN SYLLABICS CARRIER CHE
+1664 ; [.21BF.0020.0002.1664] # CANADIAN SYLLABICS CARRIER CHEE
+1665 ; [.21C0.0020.0002.1665] # CANADIAN SYLLABICS CARRIER CHI
+1666 ; [.21C1.0020.0002.1666] # CANADIAN SYLLABICS CARRIER CHA
+1667 ; [.21C2.0020.0002.1667] # CANADIAN SYLLABICS CARRIER TTSU
+1668 ; [.21C3.0020.0002.1668] # CANADIAN SYLLABICS CARRIER TTSO
+1669 ; [.21C4.0020.0002.1669] # CANADIAN SYLLABICS CARRIER TTSE
+166A ; [.21C5.0020.0002.166A] # CANADIAN SYLLABICS CARRIER TTSEE
+166B ; [.21C6.0020.0002.166B] # CANADIAN SYLLABICS CARRIER TTSI
+166C ; [.21C7.0020.0002.166C] # CANADIAN SYLLABICS CARRIER TTSA
+1681 ; [.21C8.0020.0002.1681] # OGHAM LETTER BEITH
+1682 ; [.21C9.0020.0002.1682] # OGHAM LETTER LUIS
+1683 ; [.21CA.0020.0002.1683] # OGHAM LETTER FEARN
+1684 ; [.21CB.0020.0002.1684] # OGHAM LETTER SAIL
+1685 ; [.21CC.0020.0002.1685] # OGHAM LETTER NION
+1686 ; [.21CD.0020.0002.1686] # OGHAM LETTER UATH
+1687 ; [.21CE.0020.0002.1687] # OGHAM LETTER DAIR
+1688 ; [.21CF.0020.0002.1688] # OGHAM LETTER TINNE
+1689 ; [.21D0.0020.0002.1689] # OGHAM LETTER COLL
+168A ; [.21D1.0020.0002.168A] # OGHAM LETTER CEIRT
+168B ; [.21D2.0020.0002.168B] # OGHAM LETTER MUIN
+168C ; [.21D3.0020.0002.168C] # OGHAM LETTER GORT
+168D ; [.21D4.0020.0002.168D] # OGHAM LETTER NGEADAL
+168E ; [.21D5.0020.0002.168E] # OGHAM LETTER STRAIF
+168F ; [.21D6.0020.0002.168F] # OGHAM LETTER RUIS
+1690 ; [.21D7.0020.0002.1690] # OGHAM LETTER AILM
+1691 ; [.21D8.0020.0002.1691] # OGHAM LETTER ONN
+1692 ; [.21D9.0020.0002.1692] # OGHAM LETTER UR
+1693 ; [.21DA.0020.0002.1693] # OGHAM LETTER EADHADH
+1694 ; [.21DB.0020.0002.1694] # OGHAM LETTER IODHADH
+1695 ; [.21DC.0020.0002.1695] # OGHAM LETTER EABHADH
+1696 ; [.21DD.0020.0002.1696] # OGHAM LETTER OR
+1697 ; [.21DE.0020.0002.1697] # OGHAM LETTER UILLEANN
+1698 ; [.21DF.0020.0002.1698] # OGHAM LETTER IFIN
+1699 ; [.21E0.0020.0002.1699] # OGHAM LETTER EAMHANCHOLL
+169A ; [.21E1.0020.0002.169A] # OGHAM LETTER PEITH
+16A0 ; [.21E2.0020.0002.16A0] # RUNIC LETTER FEHU FEOH FE F
+16A1 ; [.21E2.0020.0004.16A1][.0000.0199.0004.16A1] # RUNIC LETTER V; QQKN
+16A2 ; [.21E3.0020.0002.16A2] # RUNIC LETTER URUZ UR U
+16A4 ; [.21E3.0020.0004.16A4][.0000.0199.0004.16A4] # RUNIC LETTER Y; QQKN
+16A5 ; [.21E3.0020.0004.16A5][.0000.019A.0004.16A5] # RUNIC LETTER W; QQKN
+16A6 ; [.21E4.0020.0002.16A6] # RUNIC LETTER THURISAZ THURS THORN
+16A7 ; [.21E4.0020.0004.16A7][.0000.0199.0004.16A7] # RUNIC LETTER ETH; QQKN
+16F0 ; [.21E4.0020.0004.16F0][.21E4.0020.0004.16F0] # RUNIC BELGTHOR SYMBOL; QQKN
+16A8 ; [.21E5.0020.0002.16A8] # RUNIC LETTER ANSUZ A
+16A9 ; [.21E5.0020.0004.16A9][.0000.0199.0004.16A9] # RUNIC LETTER OS O; QQKN
+16AC ; [.21E5.0020.0004.16AC][.0000.019A.0004.16AC] # RUNIC LETTER LONG-BRANCH-OSS O; QQKN
+16AD ; [.21E5.0020.0004.16AD][.0000.019C.0004.16AD] # RUNIC LETTER SHORT-TWIG-OSS O; QQKN
+16AE ; [.21E5.0020.0004.16AE][.0000.019D.0004.16AE] # RUNIC LETTER O; QQKN
+16AF ; [.21E6.0020.0002.16AF] # RUNIC LETTER OE
+16B0 ; [.21E7.0020.0002.16B0] # RUNIC LETTER ON
+16B1 ; [.21E8.0020.0002.16B1] # RUNIC LETTER RAIDO RAD REID R
+16B2 ; [.21E9.0020.0002.16B2] # RUNIC LETTER KAUNA
+16B3 ; [.21E9.0020.0004.16B3][.0000.0199.0004.16B3] # RUNIC LETTER CEN; QQKN
+16B4 ; [.21E9.0020.0004.16B4][.0000.019A.0004.16B4] # RUNIC LETTER KAUN K; QQKN
+16B5 ; [.21E9.0020.0004.16B5][.0000.019C.0004.16B5] # RUNIC LETTER G; QQKN
+16B6 ; [.21E9.0020.0004.16B6][.0000.019D.0004.16B6] # RUNIC LETTER ENG; QQKN
+16B7 ; [.21EA.0020.0002.16B7] # RUNIC LETTER GEBO GYFU G
+16B9 ; [.21EB.0020.0002.16B9] # RUNIC LETTER WUNJO WYNN W
+16E9 ; [.21EB.0020.0004.16E9][.0000.0199.0004.16E9] # RUNIC LETTER Q; QQKN
+16BA ; [.21EC.0020.0002.16BA] # RUNIC LETTER HAGLAZ H
+16BB ; [.21EC.0020.0004.16BB][.0000.0199.0004.16BB] # RUNIC LETTER HAEGL H; QQKN
+16BC ; [.21EC.0020.0004.16BC][.0000.019A.0004.16BC] # RUNIC LETTER LONG-BRANCH-HAGALL H; QQKN
+16BD ; [.21EC.0020.0004.16BD][.0000.019C.0004.16BD] # RUNIC LETTER SHORT-TWIG-HAGALL H; QQKN
+16BE ; [.21ED.0020.0002.16BE] # RUNIC LETTER NAUDIZ NYD NAUD N
+16BF ; [.21ED.0020.0004.16BF][.0000.0199.0004.16BF] # RUNIC LETTER SHORT-TWIG-NAUD N; QQKN
+16C0 ; [.21ED.0020.0004.16C0][.0000.019A.0004.16C0] # RUNIC LETTER DOTTED-N; QQKN
+16C1 ; [.21EE.0020.0002.16C1] # RUNIC LETTER ISAZ IS ISS I
+16C2 ; [.21EE.0020.0004.16C2][.0000.0199.0004.16C2] # RUNIC LETTER E; QQKN
+16C3 ; [.21EF.0020.0002.16C3] # RUNIC LETTER JERAN J
+16C4 ; [.21EF.0020.0004.16C4][.0000.0199.0004.16C4] # RUNIC LETTER GER; QQKN
+16C5 ; [.21F0.0020.0002.16C5] # RUNIC LETTER LONG-BRANCH-AR AE
+16C6 ; [.21F0.0020.0004.16C6][.0000.0199.0004.16C6] # RUNIC LETTER SHORT-TWIG-AR A; QQKN
+16EE ; [.21F0.0020.0004.16EE][.21F9.0020.0004.16EE] # RUNIC ARLAUG SYMBOL; QQKN
+16C7 ; [.21F1.0020.0002.16C7] # RUNIC LETTER IWAZ EOH
+16C8 ; [.21F2.0020.0002.16C8] # RUNIC LETTER PERTHO PEORTH P
+16D5 ; [.21F2.0020.0004.16D5][.0000.0199.0004.16D5] # RUNIC LETTER OPEN-P; QQKN
+16C9 ; [.21F3.0020.0002.16C9] # RUNIC LETTER ALGIZ EOLHX
+16CA ; [.21F4.0020.0002.16CA] # RUNIC LETTER SOWILO S
+16CB ; [.21F4.0020.0004.16CB][.0000.0199.0004.16CB] # RUNIC LETTER SIGEL LONG-BRANCH-SOL S; QQKN
+16EA ; [.21F4.0020.0004.16EA][.0000.019A.0004.16EA] # RUNIC LETTER X; QQKN
+16CC ; [.21F4.0020.0004.16CC][.0000.019C.0004.16CC] # RUNIC LETTER SHORT-TWIG-SOL S; QQKN
+16CD ; [.21F4.0020.0004.16CD][.0000.019D.0004.16CD] # RUNIC LETTER C; QQKN
+16CE ; [.21F4.0020.0004.16CE][.0000.019E.0004.16CE] # RUNIC LETTER Z; QQKN
+16CF ; [.21F5.0020.0002.16CF] # RUNIC LETTER TIWAZ TIR TYR T
+16D0 ; [.21F5.0020.0004.16D0][.0000.0199.0004.16D0] # RUNIC LETTER SHORT-TWIG-TYR T; QQKN
+16D1 ; [.21F5.0020.0004.16D1][.0000.019A.0004.16D1] # RUNIC LETTER D; QQKN
+16D2 ; [.21F6.0020.0002.16D2] # RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3 ; [.21F6.0020.0004.16D3][.0000.0199.0004.16D3] # RUNIC LETTER SHORT-TWIG-BJARKAN B; QQKN
+16D4 ; [.21F6.0020.0004.16D4][.0000.019A.0004.16D4] # RUNIC LETTER DOTTED-P; QQKN
+16D6 ; [.21F7.0020.0002.16D6] # RUNIC LETTER EHWAZ EH E
+16D7 ; [.21F8.0020.0002.16D7] # RUNIC LETTER MANNAZ MAN M
+16D8 ; [.21F8.0020.0004.16D8][.0000.0199.0004.16D8] # RUNIC LETTER LONG-BRANCH-MADR M; QQKN
+16D9 ; [.21F8.0020.0004.16D9][.0000.019A.0004.16D9] # RUNIC LETTER SHORT-TWIG-MADR M; QQKN
+16EF ; [.21F8.0020.0004.16EF][.0000.0199.0004.16EF][.21F8.0020.001F.16EF][.0000.0199.001F.16EF] # RUNIC TVIMADUR SYMBOL; QQKN
+16DA ; [.21F9.0020.0002.16DA] # RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB ; [.21F9.0020.0004.16DB][.0000.0199.0004.16DB] # RUNIC LETTER DOTTED-L; QQKN
+16DC ; [.21FA.0020.0002.16DC] # RUNIC LETTER INGWAZ
+16DD ; [.21FA.0020.0004.16DD][.0000.0199.0004.16DD] # RUNIC LETTER ING; QQKN
+16DE ; [.21FB.0020.0002.16DE] # RUNIC LETTER DAGAZ DAEG D
+16DF ; [.21FC.0020.0002.16DF] # RUNIC LETTER OTHALAN ETHEL O
+16AA ; [.21FD.0020.0002.16AA] # RUNIC LETTER AC A
+16AB ; [.21FE.0020.0002.16AB] # RUNIC LETTER AESC
+16A3 ; [.21FF.0020.0002.16A3] # RUNIC LETTER YR
+16E0 ; [.2200.0020.0002.16E0] # RUNIC LETTER EAR
+16E3 ; [.2201.0020.0002.16E3] # RUNIC LETTER CALC
+16B8 ; [.2202.0020.0002.16B8] # RUNIC LETTER GAR
+16E4 ; [.2203.0020.0002.16E4] # RUNIC LETTER CEALC
+16E1 ; [.2204.0020.0002.16E1] # RUNIC LETTER IOR
+16E2 ; [.2205.0020.0002.16E2] # RUNIC LETTER CWEORTH
+16E5 ; [.2206.0020.0002.16E5] # RUNIC LETTER STAN
+16E6 ; [.2207.0020.0002.16E6] # RUNIC LETTER LONG-BRANCH-YR
+16E7 ; [.2207.0020.0004.16E7][.0000.0199.0004.16E7] # RUNIC LETTER SHORT-TWIG-YR; QQKN
+16E8 ; [.2207.0020.0004.16E8][.0000.019A.0004.16E8] # RUNIC LETTER ICELANDIC-YR; QQKN
+1100 ; [.2208.0020.0002.1100] # HANGUL CHOSEONG KIYEOK
+3131 ; [.2208.0020.0004.3131] # HANGUL LETTER KIYEOK; QQK
+3200 ; [*02B1.0020.0004.3200][.2208.0020.0004.3200][*02B2.0020.001F.3200] # PARENTHESIZED HANGUL KIYEOK; QQKN
+3260 ; [.2208.0020.0006.3260] # CIRCLED HANGUL KIYEOK; QQK
+FFA1 ; [.2208.0020.0012.FFA1] # HALFWIDTH HANGUL LETTER KIYEOK; QQK
+320E ; [*02B1.0020.0004.320E][.2208.0020.0004.320E][.2264.0020.001F.320E][*02B2.0020.001F.320E] # PARENTHESIZED HANGUL KIYEOK A; QQKN
+326E ; [.2208.0020.0006.326E][.2264.0020.0006.326E] # CIRCLED HANGUL KIYEOK A; QQKN
+1101 ; [.2209.0020.0002.1101] # HANGUL CHOSEONG SSANGKIYEOK
+3132 ; [.2209.0020.0004.3132] # HANGUL LETTER SSANGKIYEOK; QQK
+FFA2 ; [.2209.0020.0012.FFA2] # HALFWIDTH HANGUL LETTER SSANGKIYEOK; QQK
+1102 ; [.220A.0020.0002.1102] # HANGUL CHOSEONG NIEUN
+3134 ; [.220A.0020.0004.3134] # HANGUL LETTER NIEUN; QQK
+3201 ; [*02B1.0020.0004.3201][.220A.0020.0004.3201][*02B2.0020.001F.3201] # PARENTHESIZED HANGUL NIEUN; QQKN
+3261 ; [.220A.0020.0006.3261] # CIRCLED HANGUL NIEUN; QQK
+FFA4 ; [.220A.0020.0012.FFA4] # HALFWIDTH HANGUL LETTER NIEUN; QQK
+320F ; [*02B1.0020.0004.320F][.220A.0020.0004.320F][.2264.0020.001F.320F][*02B2.0020.001F.320F] # PARENTHESIZED HANGUL NIEUN A; QQKN
+326F ; [.220A.0020.0006.326F][.2264.0020.0006.326F] # CIRCLED HANGUL NIEUN A; QQKN
+1103 ; [.220B.0020.0002.1103] # HANGUL CHOSEONG TIKEUT
+3137 ; [.220B.0020.0004.3137] # HANGUL LETTER TIKEUT; QQK
+3202 ; [*02B1.0020.0004.3202][.220B.0020.0004.3202][*02B2.0020.001F.3202] # PARENTHESIZED HANGUL TIKEUT; QQKN
+3262 ; [.220B.0020.0006.3262] # CIRCLED HANGUL TIKEUT; QQK
+FFA7 ; [.220B.0020.0012.FFA7] # HALFWIDTH HANGUL LETTER TIKEUT; QQK
+3210 ; [*02B1.0020.0004.3210][.220B.0020.0004.3210][.2264.0020.001F.3210][*02B2.0020.001F.3210] # PARENTHESIZED HANGUL TIKEUT A; QQKN
+3270 ; [.220B.0020.0006.3270][.2264.0020.0006.3270] # CIRCLED HANGUL TIKEUT A; QQKN
+1104 ; [.220C.0020.0002.1104] # HANGUL CHOSEONG SSANGTIKEUT
+3138 ; [.220C.0020.0004.3138] # HANGUL LETTER SSANGTIKEUT; QQK
+FFA8 ; [.220C.0020.0012.FFA8] # HALFWIDTH HANGUL LETTER SSANGTIKEUT; QQK
+1105 ; [.220D.0020.0002.1105] # HANGUL CHOSEONG RIEUL
+3139 ; [.220D.0020.0004.3139] # HANGUL LETTER RIEUL; QQK
+3203 ; [*02B1.0020.0004.3203][.220D.0020.0004.3203][*02B2.0020.001F.3203] # PARENTHESIZED HANGUL RIEUL; QQKN
+3263 ; [.220D.0020.0006.3263] # CIRCLED HANGUL RIEUL; QQK
+FFA9 ; [.220D.0020.0012.FFA9] # HALFWIDTH HANGUL LETTER RIEUL; QQK
+3211 ; [*02B1.0020.0004.3211][.220D.0020.0004.3211][.2264.0020.001F.3211][*02B2.0020.001F.3211] # PARENTHESIZED HANGUL RIEUL A; QQKN
+3271 ; [.220D.0020.0006.3271][.2264.0020.0006.3271] # CIRCLED HANGUL RIEUL A; QQKN
+1106 ; [.220E.0020.0002.1106] # HANGUL CHOSEONG MIEUM
+3141 ; [.220E.0020.0004.3141] # HANGUL LETTER MIEUM; QQK
+3204 ; [*02B1.0020.0004.3204][.220E.0020.0004.3204][*02B2.0020.001F.3204] # PARENTHESIZED HANGUL MIEUM; QQKN
+3264 ; [.220E.0020.0006.3264] # CIRCLED HANGUL MIEUM; QQK
+FFB1 ; [.220E.0020.0012.FFB1] # HALFWIDTH HANGUL LETTER MIEUM; QQK
+3212 ; [*02B1.0020.0004.3212][.220E.0020.0004.3212][.2264.0020.001F.3212][*02B2.0020.001F.3212] # PARENTHESIZED HANGUL MIEUM A; QQKN
+3272 ; [.220E.0020.0006.3272][.2264.0020.0006.3272] # CIRCLED HANGUL MIEUM A; QQKN
+1107 ; [.220F.0020.0002.1107] # HANGUL CHOSEONG PIEUP
+3142 ; [.220F.0020.0004.3142] # HANGUL LETTER PIEUP; QQK
+3205 ; [*02B1.0020.0004.3205][.220F.0020.0004.3205][*02B2.0020.001F.3205] # PARENTHESIZED HANGUL PIEUP; QQKN
+3265 ; [.220F.0020.0006.3265] # CIRCLED HANGUL PIEUP; QQK
+FFB2 ; [.220F.0020.0012.FFB2] # HALFWIDTH HANGUL LETTER PIEUP; QQK
+3213 ; [*02B1.0020.0004.3213][.220F.0020.0004.3213][.2264.0020.001F.3213][*02B2.0020.001F.3213] # PARENTHESIZED HANGUL PIEUP A; QQKN
+3273 ; [.220F.0020.0006.3273][.2264.0020.0006.3273] # CIRCLED HANGUL PIEUP A; QQKN
+1108 ; [.2210.0020.0002.1108] # HANGUL CHOSEONG SSANGPIEUP
+3143 ; [.2210.0020.0004.3143] # HANGUL LETTER SSANGPIEUP; QQK
+FFB3 ; [.2210.0020.0012.FFB3] # HALFWIDTH HANGUL LETTER SSANGPIEUP; QQK
+1109 ; [.2211.0020.0002.1109] # HANGUL CHOSEONG SIOS
+3145 ; [.2211.0020.0004.3145] # HANGUL LETTER SIOS; QQK
+3206 ; [*02B1.0020.0004.3206][.2211.0020.0004.3206][*02B2.0020.001F.3206] # PARENTHESIZED HANGUL SIOS; QQKN
+3266 ; [.2211.0020.0006.3266] # CIRCLED HANGUL SIOS; QQK
+FFB5 ; [.2211.0020.0012.FFB5] # HALFWIDTH HANGUL LETTER SIOS; QQK
+3214 ; [*02B1.0020.0004.3214][.2211.0020.0004.3214][.2264.0020.001F.3214][*02B2.0020.001F.3214] # PARENTHESIZED HANGUL SIOS A; QQKN
+3274 ; [.2211.0020.0006.3274][.2264.0020.0006.3274] # CIRCLED HANGUL SIOS A; QQKN
+110A ; [.2212.0020.0002.110A] # HANGUL CHOSEONG SSANGSIOS
+3146 ; [.2212.0020.0004.3146] # HANGUL LETTER SSANGSIOS; QQK
+FFB6 ; [.2212.0020.0012.FFB6] # HALFWIDTH HANGUL LETTER SSANGSIOS; QQK
+110B ; [.2213.0020.0002.110B] # HANGUL CHOSEONG IEUNG
+3147 ; [.2213.0020.0004.3147] # HANGUL LETTER IEUNG; QQK
+3207 ; [*02B1.0020.0004.3207][.2213.0020.0004.3207][*02B2.0020.001F.3207] # PARENTHESIZED HANGUL IEUNG; QQKN
+3267 ; [.2213.0020.0006.3267] # CIRCLED HANGUL IEUNG; QQK
+FFB7 ; [.2213.0020.0012.FFB7] # HALFWIDTH HANGUL LETTER IEUNG; QQK
+3215 ; [*02B1.0020.0004.3215][.2213.0020.0004.3215][.2264.0020.001F.3215][*02B2.0020.001F.3215] # PARENTHESIZED HANGUL IEUNG A; QQKN
+3275 ; [.2213.0020.0006.3275][.2264.0020.0006.3275] # CIRCLED HANGUL IEUNG A; QQKN
+321D ; [*02B1.0020.0004.321D][.2213.0020.0004.321D][.226C.0020.001F.321D][.2214.0020.001F.321D][.2268.0020.001F.321D][.22A9.0020.001F.321D][*02B2.0020.001F.321D] # PARENTHESIZED KOREAN CHARACTER OJEON; QQKN
+321E ; [*02B1.0020.0004.321E][.2213.0020.0004.321E][.226C.0020.001F.321E][.221A.0020.001F.321E][.2271.0020.001F.321E][*02B2.0020.001F.321E] # PARENTHESIZED KOREAN CHARACTER O HU; QQKN
+327E ; [.2213.0020.0006.327E][.2271.0020.0006.327E] # CIRCLED HANGUL IEUNG U; QQKN
+110C ; [.2214.0020.0002.110C] # HANGUL CHOSEONG CIEUC
+3148 ; [.2214.0020.0004.3148] # HANGUL LETTER CIEUC; QQK
+3208 ; [*02B1.0020.0004.3208][.2214.0020.0004.3208][*02B2.0020.001F.3208] # PARENTHESIZED HANGUL CIEUC; QQKN
+3268 ; [.2214.0020.0006.3268] # CIRCLED HANGUL CIEUC; QQK
+FFB8 ; [.2214.0020.0012.FFB8] # HALFWIDTH HANGUL LETTER CIEUC; QQK
+3216 ; [*02B1.0020.0004.3216][.2214.0020.0004.3216][.2264.0020.001F.3216][*02B2.0020.001F.3216] # PARENTHESIZED HANGUL CIEUC A; QQKN
+3276 ; [.2214.0020.0006.3276][.2264.0020.0006.3276] # CIRCLED HANGUL CIEUC A; QQKN
+321C ; [*02B1.0020.0004.321C][.2214.0020.0004.321C][.2271.0020.001F.321C][*02B2.0020.001F.321C] # PARENTHESIZED HANGUL CIEUC U; QQKN
+327D ; [.2214.0020.0006.327D][.2271.0020.0006.327D][.2213.0020.001F.327D][.2277.0020.001F.327D] # CIRCLED KOREAN CHARACTER JUEUI; QQKN
+110D ; [.2215.0020.0002.110D] # HANGUL CHOSEONG SSANGCIEUC
+3149 ; [.2215.0020.0004.3149] # HANGUL LETTER SSANGCIEUC; QQK
+FFB9 ; [.2215.0020.0012.FFB9] # HALFWIDTH HANGUL LETTER SSANGCIEUC; QQK
+110E ; [.2216.0020.0002.110E] # HANGUL CHOSEONG CHIEUCH
+314A ; [.2216.0020.0004.314A] # HANGUL LETTER CHIEUCH; QQK
+3209 ; [*02B1.0020.0004.3209][.2216.0020.0004.3209][*02B2.0020.001F.3209] # PARENTHESIZED HANGUL CHIEUCH; QQKN
+3269 ; [.2216.0020.0006.3269] # CIRCLED HANGUL CHIEUCH; QQK
+FFBA ; [.2216.0020.0012.FFBA] # HALFWIDTH HANGUL LETTER CHIEUCH; QQK
+3217 ; [*02B1.0020.0004.3217][.2216.0020.0004.3217][.2264.0020.001F.3217][*02B2.0020.001F.3217] # PARENTHESIZED HANGUL CHIEUCH A; QQKN
+3277 ; [.2216.0020.0006.3277][.2264.0020.0006.3277] # CIRCLED HANGUL CHIEUCH A; QQKN
+327C ; [.2216.0020.0006.327C][.2264.0020.0006.327C][.22B5.0020.001F.327C][.2208.0020.001F.327C][.226C.0020.001F.327C] # CIRCLED KOREAN CHARACTER CHAMKO; QQKN
+110F ; [.2217.0020.0002.110F] # HANGUL CHOSEONG KHIEUKH
+314B ; [.2217.0020.0004.314B] # HANGUL LETTER KHIEUKH; QQK
+320A ; [*02B1.0020.0004.320A][.2217.0020.0004.320A][*02B2.0020.001F.320A] # PARENTHESIZED HANGUL KHIEUKH; QQKN
+326A ; [.2217.0020.0006.326A] # CIRCLED HANGUL KHIEUKH; QQK
+FFBB ; [.2217.0020.0012.FFBB] # HALFWIDTH HANGUL LETTER KHIEUKH; QQK
+3218 ; [*02B1.0020.0004.3218][.2217.0020.0004.3218][.2264.0020.001F.3218][*02B2.0020.001F.3218] # PARENTHESIZED HANGUL KHIEUKH A; QQKN
+3278 ; [.2217.0020.0006.3278][.2264.0020.0006.3278] # CIRCLED HANGUL KHIEUKH A; QQKN
+1110 ; [.2218.0020.0002.1110] # HANGUL CHOSEONG THIEUTH
+314C ; [.2218.0020.0004.314C] # HANGUL LETTER THIEUTH; QQK
+320B ; [*02B1.0020.0004.320B][.2218.0020.0004.320B][*02B2.0020.001F.320B] # PARENTHESIZED HANGUL THIEUTH; QQKN
+326B ; [.2218.0020.0006.326B] # CIRCLED HANGUL THIEUTH; QQK
+FFBC ; [.2218.0020.0012.FFBC] # HALFWIDTH HANGUL LETTER THIEUTH; QQK
+3219 ; [*02B1.0020.0004.3219][.2218.0020.0004.3219][.2264.0020.001F.3219][*02B2.0020.001F.3219] # PARENTHESIZED HANGUL THIEUTH A; QQKN
+3279 ; [.2218.0020.0006.3279][.2264.0020.0006.3279] # CIRCLED HANGUL THIEUTH A; QQKN
+1111 ; [.2219.0020.0002.1111] # HANGUL CHOSEONG PHIEUPH
+314D ; [.2219.0020.0004.314D] # HANGUL LETTER PHIEUPH; QQK
+320C ; [*02B1.0020.0004.320C][.2219.0020.0004.320C][*02B2.0020.001F.320C] # PARENTHESIZED HANGUL PHIEUPH; QQKN
+326C ; [.2219.0020.0006.326C] # CIRCLED HANGUL PHIEUPH; QQK
+FFBD ; [.2219.0020.0012.FFBD] # HALFWIDTH HANGUL LETTER PHIEUPH; QQK
+321A ; [*02B1.0020.0004.321A][.2219.0020.0004.321A][.2264.0020.001F.321A][*02B2.0020.001F.321A] # PARENTHESIZED HANGUL PHIEUPH A; QQKN
+327A ; [.2219.0020.0006.327A][.2264.0020.0006.327A] # CIRCLED HANGUL PHIEUPH A; QQKN
+1112 ; [.221A.0020.0002.1112] # HANGUL CHOSEONG HIEUH
+314E ; [.221A.0020.0004.314E] # HANGUL LETTER HIEUH; QQK
+320D ; [*02B1.0020.0004.320D][.221A.0020.0004.320D][*02B2.0020.001F.320D] # PARENTHESIZED HANGUL HIEUH; QQKN
+326D ; [.221A.0020.0006.326D] # CIRCLED HANGUL HIEUH; QQK
+FFBE ; [.221A.0020.0012.FFBE] # HALFWIDTH HANGUL LETTER HIEUH; QQK
+321B ; [*02B1.0020.0004.321B][.221A.0020.0004.321B][.2264.0020.001F.321B][*02B2.0020.001F.321B] # PARENTHESIZED HANGUL HIEUH A; QQKN
+327B ; [.221A.0020.0006.327B][.2264.0020.0006.327B] # CIRCLED HANGUL HIEUH A; QQKN
+1113 ; [.221B.0020.0002.1113] # HANGUL CHOSEONG NIEUN-KIYEOK
+1114 ; [.221C.0020.0002.1114] # HANGUL CHOSEONG SSANGNIEUN
+3165 ; [.221C.0020.0004.3165] # HANGUL LETTER SSANGNIEUN; QQK
+1115 ; [.221D.0020.0002.1115] # HANGUL CHOSEONG NIEUN-TIKEUT
+3166 ; [.221D.0020.0004.3166] # HANGUL LETTER NIEUN-TIKEUT; QQK
+1116 ; [.221E.0020.0002.1116] # HANGUL CHOSEONG NIEUN-PIEUP
+1117 ; [.221F.0020.0002.1117] # HANGUL CHOSEONG TIKEUT-KIYEOK
+1118 ; [.2220.0020.0002.1118] # HANGUL CHOSEONG RIEUL-NIEUN
+1119 ; [.2221.0020.0002.1119] # HANGUL CHOSEONG SSANGRIEUL
+111A ; [.2222.0020.0002.111A] # HANGUL CHOSEONG RIEUL-HIEUH
+3140 ; [.2222.0020.0004.3140] # HANGUL LETTER RIEUL-HIEUH; QQK
+FFB0 ; [.2222.0020.0012.FFB0] # HALFWIDTH HANGUL LETTER RIEUL-HIEUH; QQK
+111B ; [.2223.0020.0002.111B] # HANGUL CHOSEONG KAPYEOUNRIEUL
+111C ; [.2224.0020.0002.111C] # HANGUL CHOSEONG MIEUM-PIEUP
+316E ; [.2224.0020.0004.316E] # HANGUL LETTER MIEUM-PIEUP; QQK
+111D ; [.2225.0020.0002.111D] # HANGUL CHOSEONG KAPYEOUNMIEUM
+3171 ; [.2225.0020.0004.3171] # HANGUL LETTER KAPYEOUNMIEUM; QQK
+111E ; [.2226.0020.0002.111E] # HANGUL CHOSEONG PIEUP-KIYEOK
+3172 ; [.2226.0020.0004.3172] # HANGUL LETTER PIEUP-KIYEOK; QQK
+111F ; [.2227.0020.0002.111F] # HANGUL CHOSEONG PIEUP-NIEUN
+1120 ; [.2228.0020.0002.1120] # HANGUL CHOSEONG PIEUP-TIKEUT
+3173 ; [.2228.0020.0004.3173] # HANGUL LETTER PIEUP-TIKEUT; QQK
+1121 ; [.2229.0020.0002.1121] # HANGUL CHOSEONG PIEUP-SIOS
+3144 ; [.2229.0020.0004.3144] # HANGUL LETTER PIEUP-SIOS; QQK
+FFB4 ; [.2229.0020.0012.FFB4] # HALFWIDTH HANGUL LETTER PIEUP-SIOS; QQK
+1122 ; [.222A.0020.0002.1122] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+3174 ; [.222A.0020.0004.3174] # HANGUL LETTER PIEUP-SIOS-KIYEOK; QQK
+1123 ; [.222B.0020.0002.1123] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+3175 ; [.222B.0020.0004.3175] # HANGUL LETTER PIEUP-SIOS-TIKEUT; QQK
+1124 ; [.222C.0020.0002.1124] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125 ; [.222D.0020.0002.1125] # HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126 ; [.222E.0020.0002.1126] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127 ; [.222F.0020.0002.1127] # HANGUL CHOSEONG PIEUP-CIEUC
+3176 ; [.222F.0020.0004.3176] # HANGUL LETTER PIEUP-CIEUC; QQK
+1128 ; [.2230.0020.0002.1128] # HANGUL CHOSEONG PIEUP-CHIEUCH
+1129 ; [.2231.0020.0002.1129] # HANGUL CHOSEONG PIEUP-THIEUTH
+3177 ; [.2231.0020.0004.3177] # HANGUL LETTER PIEUP-THIEUTH; QQK
+112A ; [.2232.0020.0002.112A] # HANGUL CHOSEONG PIEUP-PHIEUPH
+112B ; [.2233.0020.0002.112B] # HANGUL CHOSEONG KAPYEOUNPIEUP
+3178 ; [.2233.0020.0004.3178] # HANGUL LETTER KAPYEOUNPIEUP; QQK
+112C ; [.2234.0020.0002.112C] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+3179 ; [.2234.0020.0004.3179] # HANGUL LETTER KAPYEOUNSSANGPIEUP; QQK
+112D ; [.2235.0020.0002.112D] # HANGUL CHOSEONG SIOS-KIYEOK
+317A ; [.2235.0020.0004.317A] # HANGUL LETTER SIOS-KIYEOK; QQK
+112E ; [.2236.0020.0002.112E] # HANGUL CHOSEONG SIOS-NIEUN
+317B ; [.2236.0020.0004.317B] # HANGUL LETTER SIOS-NIEUN; QQK
+112F ; [.2237.0020.0002.112F] # HANGUL CHOSEONG SIOS-TIKEUT
+317C ; [.2237.0020.0004.317C] # HANGUL LETTER SIOS-TIKEUT; QQK
+1130 ; [.2238.0020.0002.1130] # HANGUL CHOSEONG SIOS-RIEUL
+1131 ; [.2239.0020.0002.1131] # HANGUL CHOSEONG SIOS-MIEUM
+1132 ; [.223A.0020.0002.1132] # HANGUL CHOSEONG SIOS-PIEUP
+317D ; [.223A.0020.0004.317D] # HANGUL LETTER SIOS-PIEUP; QQK
+1133 ; [.223B.0020.0002.1133] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134 ; [.223C.0020.0002.1134] # HANGUL CHOSEONG SIOS-SSANGSIOS
+1135 ; [.223D.0020.0002.1135] # HANGUL CHOSEONG SIOS-IEUNG
+1136 ; [.223E.0020.0002.1136] # HANGUL CHOSEONG SIOS-CIEUC
+317E ; [.223E.0020.0004.317E] # HANGUL LETTER SIOS-CIEUC; QQK
+1137 ; [.223F.0020.0002.1137] # HANGUL CHOSEONG SIOS-CHIEUCH
+1138 ; [.2240.0020.0002.1138] # HANGUL CHOSEONG SIOS-KHIEUKH
+1139 ; [.2241.0020.0002.1139] # HANGUL CHOSEONG SIOS-THIEUTH
+113A ; [.2242.0020.0002.113A] # HANGUL CHOSEONG SIOS-PHIEUPH
+113B ; [.2243.0020.0002.113B] # HANGUL CHOSEONG SIOS-HIEUH
+113C ; [.2244.0020.0002.113C] # HANGUL CHOSEONG CHITUEUMSIOS
+113D ; [.2245.0020.0002.113D] # HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E ; [.2246.0020.0002.113E] # HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F ; [.2247.0020.0002.113F] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140 ; [.2248.0020.0002.1140] # HANGUL CHOSEONG PANSIOS
+317F ; [.2248.0020.0004.317F] # HANGUL LETTER PANSIOS; QQK
+1141 ; [.2249.0020.0002.1141] # HANGUL CHOSEONG IEUNG-KIYEOK
+1142 ; [.224A.0020.0002.1142] # HANGUL CHOSEONG IEUNG-TIKEUT
+1143 ; [.224B.0020.0002.1143] # HANGUL CHOSEONG IEUNG-MIEUM
+1144 ; [.224C.0020.0002.1144] # HANGUL CHOSEONG IEUNG-PIEUP
+1145 ; [.224D.0020.0002.1145] # HANGUL CHOSEONG IEUNG-SIOS
+1146 ; [.224E.0020.0002.1146] # HANGUL CHOSEONG IEUNG-PANSIOS
+1147 ; [.224F.0020.0002.1147] # HANGUL CHOSEONG SSANGIEUNG
+3180 ; [.224F.0020.0004.3180] # HANGUL LETTER SSANGIEUNG; QQK
+1148 ; [.2250.0020.0002.1148] # HANGUL CHOSEONG IEUNG-CIEUC
+1149 ; [.2251.0020.0002.1149] # HANGUL CHOSEONG IEUNG-CHIEUCH
+114A ; [.2252.0020.0002.114A] # HANGUL CHOSEONG IEUNG-THIEUTH
+114B ; [.2253.0020.0002.114B] # HANGUL CHOSEONG IEUNG-PHIEUPH
+114C ; [.2254.0020.0002.114C] # HANGUL CHOSEONG YESIEUNG
+3181 ; [.2254.0020.0004.3181] # HANGUL LETTER YESIEUNG; QQK
+114D ; [.2255.0020.0002.114D] # HANGUL CHOSEONG CIEUC-IEUNG
+114E ; [.2256.0020.0002.114E] # HANGUL CHOSEONG CHITUEUMCIEUC
+114F ; [.2257.0020.0002.114F] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150 ; [.2258.0020.0002.1150] # HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151 ; [.2259.0020.0002.1151] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152 ; [.225A.0020.0002.1152] # HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153 ; [.225B.0020.0002.1153] # HANGUL CHOSEONG CHIEUCH-HIEUH
+1154 ; [.225C.0020.0002.1154] # HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155 ; [.225D.0020.0002.1155] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156 ; [.225E.0020.0002.1156] # HANGUL CHOSEONG PHIEUPH-PIEUP
+1157 ; [.225F.0020.0002.1157] # HANGUL CHOSEONG KAPYEOUNPHIEUPH
+3184 ; [.225F.0020.0004.3184] # HANGUL LETTER KAPYEOUNPHIEUPH; QQK
+1158 ; [.2260.0020.0002.1158] # HANGUL CHOSEONG SSANGHIEUH
+3185 ; [.2260.0020.0004.3185] # HANGUL LETTER SSANGHIEUH; QQK
+1159 ; [.2261.0020.0002.1159] # HANGUL CHOSEONG YEORINHIEUH
+3186 ; [.2261.0020.0004.3186] # HANGUL LETTER YEORINHIEUH; QQK
+115F ; [.2262.0020.0002.115F] # HANGUL CHOSEONG FILLER
+1160 ; [.2263.0020.0002.1160] # HANGUL JUNGSEONG FILLER
+3164 ; [.2263.0020.0004.3164] # HANGUL FILLER; QQK
+FFA0 ; [.2263.0020.0012.FFA0] # HALFWIDTH HANGUL FILLER; QQK
+1161 ; [.2264.0020.0002.1161] # HANGUL JUNGSEONG A
+314F ; [.2264.0020.0004.314F] # HANGUL LETTER A; QQK
+FFC2 ; [.2264.0020.0012.FFC2] # HALFWIDTH HANGUL LETTER A; QQK
+1162 ; [.2265.0020.0002.1162] # HANGUL JUNGSEONG AE
+3150 ; [.2265.0020.0004.3150] # HANGUL LETTER AE; QQK
+FFC3 ; [.2265.0020.0012.FFC3] # HALFWIDTH HANGUL LETTER AE; QQK
+1163 ; [.2266.0020.0002.1163] # HANGUL JUNGSEONG YA
+3151 ; [.2266.0020.0004.3151] # HANGUL LETTER YA; QQK
+FFC4 ; [.2266.0020.0012.FFC4] # HALFWIDTH HANGUL LETTER YA; QQK
+1164 ; [.2267.0020.0002.1164] # HANGUL JUNGSEONG YAE
+3152 ; [.2267.0020.0004.3152] # HANGUL LETTER YAE; QQK
+FFC5 ; [.2267.0020.0012.FFC5] # HALFWIDTH HANGUL LETTER YAE; QQK
+1165 ; [.2268.0020.0002.1165] # HANGUL JUNGSEONG EO
+3153 ; [.2268.0020.0004.3153] # HANGUL LETTER EO; QQK
+FFC6 ; [.2268.0020.0012.FFC6] # HALFWIDTH HANGUL LETTER EO; QQK
+1166 ; [.2269.0020.0002.1166] # HANGUL JUNGSEONG E
+3154 ; [.2269.0020.0004.3154] # HANGUL LETTER E; QQK
+FFC7 ; [.2269.0020.0012.FFC7] # HALFWIDTH HANGUL LETTER E; QQK
+1167 ; [.226A.0020.0002.1167] # HANGUL JUNGSEONG YEO
+3155 ; [.226A.0020.0004.3155] # HANGUL LETTER YEO; QQK
+FFCA ; [.226A.0020.0012.FFCA] # HALFWIDTH HANGUL LETTER YEO; QQK
+1168 ; [.226B.0020.0002.1168] # HANGUL JUNGSEONG YE
+3156 ; [.226B.0020.0004.3156] # HANGUL LETTER YE; QQK
+FFCB ; [.226B.0020.0012.FFCB] # HALFWIDTH HANGUL LETTER YE; QQK
+1169 ; [.226C.0020.0002.1169] # HANGUL JUNGSEONG O
+3157 ; [.226C.0020.0004.3157] # HANGUL LETTER O; QQK
+FFCC ; [.226C.0020.0012.FFCC] # HALFWIDTH HANGUL LETTER O; QQK
+116A ; [.226D.0020.0002.116A] # HANGUL JUNGSEONG WA
+3158 ; [.226D.0020.0004.3158] # HANGUL LETTER WA; QQK
+FFCD ; [.226D.0020.0012.FFCD] # HALFWIDTH HANGUL LETTER WA; QQK
+116B ; [.226E.0020.0002.116B] # HANGUL JUNGSEONG WAE
+3159 ; [.226E.0020.0004.3159] # HANGUL LETTER WAE; QQK
+FFCE ; [.226E.0020.0012.FFCE] # HALFWIDTH HANGUL LETTER WAE; QQK
+116C ; [.226F.0020.0002.116C] # HANGUL JUNGSEONG OE
+315A ; [.226F.0020.0004.315A] # HANGUL LETTER OE; QQK
+FFCF ; [.226F.0020.0012.FFCF] # HALFWIDTH HANGUL LETTER OE; QQK
+116D ; [.2270.0020.0002.116D] # HANGUL JUNGSEONG YO
+315B ; [.2270.0020.0004.315B] # HANGUL LETTER YO; QQK
+FFD2 ; [.2270.0020.0012.FFD2] # HALFWIDTH HANGUL LETTER YO; QQK
+116E ; [.2271.0020.0002.116E] # HANGUL JUNGSEONG U
+315C ; [.2271.0020.0004.315C] # HANGUL LETTER U; QQK
+FFD3 ; [.2271.0020.0012.FFD3] # HALFWIDTH HANGUL LETTER U; QQK
+116F ; [.2272.0020.0002.116F] # HANGUL JUNGSEONG WEO
+315D ; [.2272.0020.0004.315D] # HANGUL LETTER WEO; QQK
+FFD4 ; [.2272.0020.0012.FFD4] # HALFWIDTH HANGUL LETTER WEO; QQK
+1170 ; [.2273.0020.0002.1170] # HANGUL JUNGSEONG WE
+315E ; [.2273.0020.0004.315E] # HANGUL LETTER WE; QQK
+FFD5 ; [.2273.0020.0012.FFD5] # HALFWIDTH HANGUL LETTER WE; QQK
+1171 ; [.2274.0020.0002.1171] # HANGUL JUNGSEONG WI
+315F ; [.2274.0020.0004.315F] # HANGUL LETTER WI; QQK
+FFD6 ; [.2274.0020.0012.FFD6] # HALFWIDTH HANGUL LETTER WI; QQK
+1172 ; [.2275.0020.0002.1172] # HANGUL JUNGSEONG YU
+3160 ; [.2275.0020.0004.3160] # HANGUL LETTER YU; QQK
+FFD7 ; [.2275.0020.0012.FFD7] # HALFWIDTH HANGUL LETTER YU; QQK
+1173 ; [.2276.0020.0002.1173] # HANGUL JUNGSEONG EU
+3161 ; [.2276.0020.0004.3161] # HANGUL LETTER EU; QQK
+FFDA ; [.2276.0020.0012.FFDA] # HALFWIDTH HANGUL LETTER EU; QQK
+1174 ; [.2277.0020.0002.1174] # HANGUL JUNGSEONG YI
+3162 ; [.2277.0020.0004.3162] # HANGUL LETTER YI; QQK
+FFDB ; [.2277.0020.0012.FFDB] # HALFWIDTH HANGUL LETTER YI; QQK
+1175 ; [.2278.0020.0002.1175] # HANGUL JUNGSEONG I
+3163 ; [.2278.0020.0004.3163] # HANGUL LETTER I; QQK
+FFDC ; [.2278.0020.0012.FFDC] # HALFWIDTH HANGUL LETTER I; QQK
+1176 ; [.2279.0020.0002.1176] # HANGUL JUNGSEONG A-O
+1177 ; [.227A.0020.0002.1177] # HANGUL JUNGSEONG A-U
+1178 ; [.227B.0020.0002.1178] # HANGUL JUNGSEONG YA-O
+1179 ; [.227C.0020.0002.1179] # HANGUL JUNGSEONG YA-YO
+117A ; [.227D.0020.0002.117A] # HANGUL JUNGSEONG EO-O
+117B ; [.227E.0020.0002.117B] # HANGUL JUNGSEONG EO-U
+117C ; [.227F.0020.0002.117C] # HANGUL JUNGSEONG EO-EU
+117D ; [.2280.0020.0002.117D] # HANGUL JUNGSEONG YEO-O
+117E ; [.2281.0020.0002.117E] # HANGUL JUNGSEONG YEO-U
+117F ; [.2282.0020.0002.117F] # HANGUL JUNGSEONG O-EO
+1180 ; [.2283.0020.0002.1180] # HANGUL JUNGSEONG O-E
+1181 ; [.2284.0020.0002.1181] # HANGUL JUNGSEONG O-YE
+1182 ; [.2285.0020.0002.1182] # HANGUL JUNGSEONG O-O
+1183 ; [.2286.0020.0002.1183] # HANGUL JUNGSEONG O-U
+1184 ; [.2287.0020.0002.1184] # HANGUL JUNGSEONG YO-YA
+3187 ; [.2287.0020.0004.3187] # HANGUL LETTER YO-YA; QQK
+1185 ; [.2288.0020.0002.1185] # HANGUL JUNGSEONG YO-YAE
+3188 ; [.2288.0020.0004.3188] # HANGUL LETTER YO-YAE; QQK
+1186 ; [.2289.0020.0002.1186] # HANGUL JUNGSEONG YO-YEO
+1187 ; [.228A.0020.0002.1187] # HANGUL JUNGSEONG YO-O
+1188 ; [.228B.0020.0002.1188] # HANGUL JUNGSEONG YO-I
+3189 ; [.228B.0020.0004.3189] # HANGUL LETTER YO-I; QQK
+1189 ; [.228C.0020.0002.1189] # HANGUL JUNGSEONG U-A
+118A ; [.228D.0020.0002.118A] # HANGUL JUNGSEONG U-AE
+118B ; [.228E.0020.0002.118B] # HANGUL JUNGSEONG U-EO-EU
+118C ; [.228F.0020.0002.118C] # HANGUL JUNGSEONG U-YE
+118D ; [.2290.0020.0002.118D] # HANGUL JUNGSEONG U-U
+118E ; [.2291.0020.0002.118E] # HANGUL JUNGSEONG YU-A
+118F ; [.2292.0020.0002.118F] # HANGUL JUNGSEONG YU-EO
+1190 ; [.2293.0020.0002.1190] # HANGUL JUNGSEONG YU-E
+1191 ; [.2294.0020.0002.1191] # HANGUL JUNGSEONG YU-YEO
+318A ; [.2294.0020.0004.318A] # HANGUL LETTER YU-YEO; QQK
+1192 ; [.2295.0020.0002.1192] # HANGUL JUNGSEONG YU-YE
+318B ; [.2295.0020.0004.318B] # HANGUL LETTER YU-YE; QQK
+1193 ; [.2296.0020.0002.1193] # HANGUL JUNGSEONG YU-U
+1194 ; [.2297.0020.0002.1194] # HANGUL JUNGSEONG YU-I
+318C ; [.2297.0020.0004.318C] # HANGUL LETTER YU-I; QQK
+1195 ; [.2298.0020.0002.1195] # HANGUL JUNGSEONG EU-U
+1196 ; [.2299.0020.0002.1196] # HANGUL JUNGSEONG EU-EU
+1197 ; [.229A.0020.0002.1197] # HANGUL JUNGSEONG YI-U
+1198 ; [.229B.0020.0002.1198] # HANGUL JUNGSEONG I-A
+1199 ; [.229C.0020.0002.1199] # HANGUL JUNGSEONG I-YA
+119A ; [.229D.0020.0002.119A] # HANGUL JUNGSEONG I-O
+119B ; [.229E.0020.0002.119B] # HANGUL JUNGSEONG I-U
+119C ; [.229F.0020.0002.119C] # HANGUL JUNGSEONG I-EU
+119D ; [.22A0.0020.0002.119D] # HANGUL JUNGSEONG I-ARAEA
+119E ; [.22A1.0020.0002.119E] # HANGUL JUNGSEONG ARAEA
+318D ; [.22A1.0020.0004.318D] # HANGUL LETTER ARAEA; QQK
+119F ; [.22A2.0020.0002.119F] # HANGUL JUNGSEONG ARAEA-EO
+11A0 ; [.22A3.0020.0002.11A0] # HANGUL JUNGSEONG ARAEA-U
+11A1 ; [.22A4.0020.0002.11A1] # HANGUL JUNGSEONG ARAEA-I
+318E ; [.22A4.0020.0004.318E] # HANGUL LETTER ARAEAE; QQK
+11A2 ; [.22A5.0020.0002.11A2] # HANGUL JUNGSEONG SSANGARAEA
+11A8 ; [.22A6.0020.0002.11A8] # HANGUL JONGSEONG KIYEOK
+11A9 ; [.22A7.0020.0002.11A9] # HANGUL JONGSEONG SSANGKIYEOK
+11AA ; [.22A8.0020.0002.11AA] # HANGUL JONGSEONG KIYEOK-SIOS
+3133 ; [.22A8.0020.0004.3133] # HANGUL LETTER KIYEOK-SIOS; QQK
+FFA3 ; [.22A8.0020.0012.FFA3] # HALFWIDTH HANGUL LETTER KIYEOK-SIOS; QQK
+11AB ; [.22A9.0020.0002.11AB] # HANGUL JONGSEONG NIEUN
+11AC ; [.22AA.0020.0002.11AC] # HANGUL JONGSEONG NIEUN-CIEUC
+3135 ; [.22AA.0020.0004.3135] # HANGUL LETTER NIEUN-CIEUC; QQK
+FFA5 ; [.22AA.0020.0012.FFA5] # HALFWIDTH HANGUL LETTER NIEUN-CIEUC; QQK
+11AD ; [.22AB.0020.0002.11AD] # HANGUL JONGSEONG NIEUN-HIEUH
+3136 ; [.22AB.0020.0004.3136] # HANGUL LETTER NIEUN-HIEUH; QQK
+FFA6 ; [.22AB.0020.0012.FFA6] # HALFWIDTH HANGUL LETTER NIEUN-HIEUH; QQK
+11AE ; [.22AC.0020.0002.11AE] # HANGUL JONGSEONG TIKEUT
+11AF ; [.22AD.0020.0002.11AF] # HANGUL JONGSEONG RIEUL
+11B0 ; [.22AE.0020.0002.11B0] # HANGUL JONGSEONG RIEUL-KIYEOK
+313A ; [.22AE.0020.0004.313A] # HANGUL LETTER RIEUL-KIYEOK; QQK
+FFAA ; [.22AE.0020.0012.FFAA] # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK; QQK
+11B1 ; [.22AF.0020.0002.11B1] # HANGUL JONGSEONG RIEUL-MIEUM
+313B ; [.22AF.0020.0004.313B] # HANGUL LETTER RIEUL-MIEUM; QQK
+FFAB ; [.22AF.0020.0012.FFAB] # HALFWIDTH HANGUL LETTER RIEUL-MIEUM; QQK
+11B2 ; [.22B0.0020.0002.11B2] # HANGUL JONGSEONG RIEUL-PIEUP
+313C ; [.22B0.0020.0004.313C] # HANGUL LETTER RIEUL-PIEUP; QQK
+FFAC ; [.22B0.0020.0012.FFAC] # HALFWIDTH HANGUL LETTER RIEUL-PIEUP; QQK
+11B3 ; [.22B1.0020.0002.11B3] # HANGUL JONGSEONG RIEUL-SIOS
+313D ; [.22B1.0020.0004.313D] # HANGUL LETTER RIEUL-SIOS; QQK
+FFAD ; [.22B1.0020.0012.FFAD] # HALFWIDTH HANGUL LETTER RIEUL-SIOS; QQK
+11B4 ; [.22B2.0020.0002.11B4] # HANGUL JONGSEONG RIEUL-THIEUTH
+313E ; [.22B2.0020.0004.313E] # HANGUL LETTER RIEUL-THIEUTH; QQK
+FFAE ; [.22B2.0020.0012.FFAE] # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH; QQK
+11B5 ; [.22B3.0020.0002.11B5] # HANGUL JONGSEONG RIEUL-PHIEUPH
+313F ; [.22B3.0020.0004.313F] # HANGUL LETTER RIEUL-PHIEUPH; QQK
+FFAF ; [.22B3.0020.0012.FFAF] # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH; QQK
+11B6 ; [.22B4.0020.0002.11B6] # HANGUL JONGSEONG RIEUL-HIEUH
+11B7 ; [.22B5.0020.0002.11B7] # HANGUL JONGSEONG MIEUM
+11B8 ; [.22B6.0020.0002.11B8] # HANGUL JONGSEONG PIEUP
+11B9 ; [.22B7.0020.0002.11B9] # HANGUL JONGSEONG PIEUP-SIOS
+11BA ; [.22B8.0020.0002.11BA] # HANGUL JONGSEONG SIOS
+11BB ; [.22B9.0020.0002.11BB] # HANGUL JONGSEONG SSANGSIOS
+11BC ; [.22BA.0020.0002.11BC] # HANGUL JONGSEONG IEUNG
+11BD ; [.22BB.0020.0002.11BD] # HANGUL JONGSEONG CIEUC
+11BE ; [.22BC.0020.0002.11BE] # HANGUL JONGSEONG CHIEUCH
+11BF ; [.22BD.0020.0002.11BF] # HANGUL JONGSEONG KHIEUKH
+11C0 ; [.22BE.0020.0002.11C0] # HANGUL JONGSEONG THIEUTH
+11C1 ; [.22BF.0020.0002.11C1] # HANGUL JONGSEONG PHIEUPH
+11C2 ; [.22C0.0020.0002.11C2] # HANGUL JONGSEONG HIEUH
+11C3 ; [.22C1.0020.0002.11C3] # HANGUL JONGSEONG KIYEOK-RIEUL
+11C4 ; [.22C2.0020.0002.11C4] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5 ; [.22C3.0020.0002.11C5] # HANGUL JONGSEONG NIEUN-KIYEOK
+11C6 ; [.22C4.0020.0002.11C6] # HANGUL JONGSEONG NIEUN-TIKEUT
+11C7 ; [.22C5.0020.0002.11C7] # HANGUL JONGSEONG NIEUN-SIOS
+3167 ; [.22C5.0020.0004.3167] # HANGUL LETTER NIEUN-SIOS; QQK
+11C8 ; [.22C6.0020.0002.11C8] # HANGUL JONGSEONG NIEUN-PANSIOS
+3168 ; [.22C6.0020.0004.3168] # HANGUL LETTER NIEUN-PANSIOS; QQK
+11C9 ; [.22C7.0020.0002.11C9] # HANGUL JONGSEONG NIEUN-THIEUTH
+11CA ; [.22C8.0020.0002.11CA] # HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB ; [.22C9.0020.0002.11CB] # HANGUL JONGSEONG TIKEUT-RIEUL
+11CC ; [.22CA.0020.0002.11CC] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+3169 ; [.22CA.0020.0004.3169] # HANGUL LETTER RIEUL-KIYEOK-SIOS; QQK
+11CD ; [.22CB.0020.0002.11CD] # HANGUL JONGSEONG RIEUL-NIEUN
+11CE ; [.22CC.0020.0002.11CE] # HANGUL JONGSEONG RIEUL-TIKEUT
+316A ; [.22CC.0020.0004.316A] # HANGUL LETTER RIEUL-TIKEUT; QQK
+11CF ; [.22CD.0020.0002.11CF] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0 ; [.22CE.0020.0002.11D0] # HANGUL JONGSEONG SSANGRIEUL
+11D1 ; [.22CF.0020.0002.11D1] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2 ; [.22D0.0020.0002.11D2] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3 ; [.22D1.0020.0002.11D3] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+316B ; [.22D1.0020.0004.316B] # HANGUL LETTER RIEUL-PIEUP-SIOS; QQK
+11D4 ; [.22D2.0020.0002.11D4] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5 ; [.22D3.0020.0002.11D5] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6 ; [.22D4.0020.0002.11D6] # HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7 ; [.22D5.0020.0002.11D7] # HANGUL JONGSEONG RIEUL-PANSIOS
+316C ; [.22D5.0020.0004.316C] # HANGUL LETTER RIEUL-PANSIOS; QQK
+11D8 ; [.22D6.0020.0002.11D8] # HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9 ; [.22D7.0020.0002.11D9] # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+316D ; [.22D7.0020.0004.316D] # HANGUL LETTER RIEUL-YEORINHIEUH; QQK
+11DA ; [.22D8.0020.0002.11DA] # HANGUL JONGSEONG MIEUM-KIYEOK
+11DB ; [.22D9.0020.0002.11DB] # HANGUL JONGSEONG MIEUM-RIEUL
+11DC ; [.22DA.0020.0002.11DC] # HANGUL JONGSEONG MIEUM-PIEUP
+11DD ; [.22DB.0020.0002.11DD] # HANGUL JONGSEONG MIEUM-SIOS
+316F ; [.22DB.0020.0004.316F] # HANGUL LETTER MIEUM-SIOS; QQK
+11DE ; [.22DC.0020.0002.11DE] # HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF ; [.22DD.0020.0002.11DF] # HANGUL JONGSEONG MIEUM-PANSIOS
+3170 ; [.22DD.0020.0004.3170] # HANGUL LETTER MIEUM-PANSIOS; QQK
+11E0 ; [.22DE.0020.0002.11E0] # HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1 ; [.22DF.0020.0002.11E1] # HANGUL JONGSEONG MIEUM-HIEUH
+11E2 ; [.22E0.0020.0002.11E2] # HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3 ; [.22E1.0020.0002.11E3] # HANGUL JONGSEONG PIEUP-RIEUL
+11E4 ; [.22E2.0020.0002.11E4] # HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5 ; [.22E3.0020.0002.11E5] # HANGUL JONGSEONG PIEUP-HIEUH
+11E6 ; [.22E4.0020.0002.11E6] # HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7 ; [.22E5.0020.0002.11E7] # HANGUL JONGSEONG SIOS-KIYEOK
+11E8 ; [.22E6.0020.0002.11E8] # HANGUL JONGSEONG SIOS-TIKEUT
+11E9 ; [.22E7.0020.0002.11E9] # HANGUL JONGSEONG SIOS-RIEUL
+11EA ; [.22E8.0020.0002.11EA] # HANGUL JONGSEONG SIOS-PIEUP
+11EB ; [.22E9.0020.0002.11EB] # HANGUL JONGSEONG PANSIOS
+11EC ; [.22EA.0020.0002.11EC] # HANGUL JONGSEONG IEUNG-KIYEOK
+11ED ; [.22EB.0020.0002.11ED] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE ; [.22EC.0020.0002.11EE] # HANGUL JONGSEONG SSANGIEUNG
+11EF ; [.22ED.0020.0002.11EF] # HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0 ; [.22EE.0020.0002.11F0] # HANGUL JONGSEONG YESIEUNG
+11F1 ; [.22EF.0020.0002.11F1] # HANGUL JONGSEONG YESIEUNG-SIOS
+3182 ; [.22EF.0020.0004.3182] # HANGUL LETTER YESIEUNG-SIOS; QQK
+11F2 ; [.22F0.0020.0002.11F2] # HANGUL JONGSEONG YESIEUNG-PANSIOS
+3183 ; [.22F0.0020.0004.3183] # HANGUL LETTER YESIEUNG-PANSIOS; QQK
+11F3 ; [.22F1.0020.0002.11F3] # HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4 ; [.22F2.0020.0002.11F4] # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5 ; [.22F3.0020.0002.11F5] # HANGUL JONGSEONG HIEUH-NIEUN
+11F6 ; [.22F4.0020.0002.11F6] # HANGUL JONGSEONG HIEUH-RIEUL
+11F7 ; [.22F5.0020.0002.11F7] # HANGUL JONGSEONG HIEUH-MIEUM
+11F8 ; [.22F6.0020.0002.11F8] # HANGUL JONGSEONG HIEUH-PIEUP
+11F9 ; [.22F7.0020.0002.11F9] # HANGUL JONGSEONG YEORINHIEUH
+3041 ; [.22F8.0020.000D.3041] # HIRAGANA LETTER SMALL A
+3042 ; [.22F8.0020.000E.3042] # HIRAGANA LETTER A
+30A1 ; [.22F8.0020.000F.30A1] # KATAKANA LETTER SMALL A
+FF67 ; [.22F8.0020.0010.FF67] # HALFWIDTH KATAKANA LETTER SMALL A; QQK
+30A2 ; [.22F8.0020.0011.30A2] # KATAKANA LETTER A
+FF71 ; [.22F8.0020.0012.FF71] # HALFWIDTH KATAKANA LETTER A; QQK
+32D0 ; [.22F8.0020.0013.32D0] # CIRCLED KATAKANA A; QQK
+3303 ; [.22F8.0020.001C.3303][.0FA3.0020.001C.3303][.2320.0020.001F.3303] # SQUARE AARU; QQKN
+3300 ; [.22F8.0020.001C.3300][.2311.0020.001C.3300][.0000.0178.001F.3300][.0FA3.0020.001F.3300][.230B.0020.001F.3300] # SQUARE APAATO; QQKN
+3301 ; [.22F8.0020.001C.3301][.2320.0020.001C.3301][.2313.0020.001F.3301][.22F8.0020.001F.3301] # SQUARE ARUHUA; QQKN
+3302 ; [.22F8.0020.001C.3302][.2327.0020.001C.3302][.2314.0020.001F.3302][.0000.0178.001F.3302][.22F8.0020.001F.3302] # SQUARE ANPEA; QQKN
+3043 ; [.22F9.0020.000D.3043] # HIRAGANA LETTER SMALL I
+3044 ; [.22F9.0020.000E.3044] # HIRAGANA LETTER I
+30A3 ; [.22F9.0020.000F.30A3] # KATAKANA LETTER SMALL I
+FF68 ; [.22F9.0020.0010.FF68] # HALFWIDTH KATAKANA LETTER SMALL I; QQK
+30A4 ; [.22F9.0020.0011.30A4] # KATAKANA LETTER I
+FF72 ; [.22F9.0020.0012.FF72] # HALFWIDTH KATAKANA LETTER I; QQK
+32D1 ; [.22F9.0020.0013.32D1] # CIRCLED KATAKANA I; QQK
+3304 ; [.22F9.0020.001C.3304][.230D.0020.001C.3304][.2327.0020.001F.3304][.22FF.0020.001F.3304][.0000.0177.001F.3304] # SQUARE ININGU; QQKN
+3305 ; [.22F9.0020.001C.3305][.2327.0020.001C.3305][.2308.0020.001F.3305] # SQUARE INTI; QQKN
+3045 ; [.22FA.0020.000D.3045] # HIRAGANA LETTER SMALL U
+3046 ; [.22FA.0020.000E.3046] # HIRAGANA LETTER U
+30A5 ; [.22FA.0020.000F.30A5] # KATAKANA LETTER SMALL U
+FF69 ; [.22FA.0020.0010.FF69] # HALFWIDTH KATAKANA LETTER SMALL U; QQK
+30A6 ; [.22FA.0020.0011.30A6] # KATAKANA LETTER U
+FF73 ; [.22FA.0020.0012.FF73] # HALFWIDTH KATAKANA LETTER U; QQK
+32D2 ; [.22FA.0020.0013.32D2] # CIRCLED KATAKANA U; QQK
+3094 ; [.22FA.0020.000E.3046][.0000.0177.0002.3099] # HIRAGANA LETTER VU; QQCM
+30F4 ; [.22FA.0020.0011.30A6][.0000.0177.0002.3099] # KATAKANA LETTER VU; QQCM
+3306 ; [.22FA.0020.001C.3306][.22FC.0020.001C.3306][.2327.0020.001F.3306] # SQUARE UON; QQKN
+3047 ; [.22FB.0020.000D.3047] # HIRAGANA LETTER SMALL E
+3048 ; [.22FB.0020.000E.3048] # HIRAGANA LETTER E
+30A7 ; [.22FB.0020.000F.30A7] # KATAKANA LETTER SMALL E
+FF6A ; [.22FB.0020.0010.FF6A] # HALFWIDTH KATAKANA LETTER SMALL E; QQK
+30A8 ; [.22FB.0020.0011.30A8] # KATAKANA LETTER E
+FF74 ; [.22FB.0020.0012.FF74] # HALFWIDTH KATAKANA LETTER E; QQK
+32D3 ; [.22FB.0020.0013.32D3] # CIRCLED KATAKANA E; QQK
+3308 ; [.22FB.0020.001C.3308][.0FA3.0020.001C.3308][.22FD.0020.001F.3308][.0FA3.0020.001F.3308] # SQUARE EEKAA; QQKN
+3307 ; [.22FB.0020.001C.3307][.2304.0020.001C.3307][.22FF.0020.001F.3307][.0FA3.0020.001F.3307][.230B.0020.001F.3307][.0000.0177.001F.3307] # SQUARE ESUKUUDO; QQKN
+3049 ; [.22FC.0020.000D.3049] # HIRAGANA LETTER SMALL O
+304A ; [.22FC.0020.000E.304A] # HIRAGANA LETTER O
+30A9 ; [.22FC.0020.000F.30A9] # KATAKANA LETTER SMALL O
+FF6B ; [.22FC.0020.0010.FF6B] # HALFWIDTH KATAKANA LETTER SMALL O; QQK
+30AA ; [.22FC.0020.0011.30AA] # KATAKANA LETTER O
+FF75 ; [.22FC.0020.0012.FF75] # HALFWIDTH KATAKANA LETTER O; QQK
+32D4 ; [.22FC.0020.0013.32D4] # CIRCLED KATAKANA O; QQK
+330A ; [.22FC.0020.001C.330A][.0FA3.0020.001C.330A][.2318.0020.001F.330A] # SQUARE OOMU; QQKN
+3309 ; [.22FC.0020.001C.3309][.2327.0020.001C.3309][.2304.0020.001F.3309] # SQUARE ONSU; QQKN
+3095 ; [.22FD.0020.000D.3095] # HIRAGANA LETTER SMALL KA
+304B ; [.22FD.0020.000E.304B] # HIRAGANA LETTER KA
+30F5 ; [.22FD.0020.000F.30F5] # KATAKANA LETTER SMALL KA
+30AB ; [.22FD.0020.0011.30AB] # KATAKANA LETTER KA
+FF76 ; [.22FD.0020.0012.FF76] # HALFWIDTH KATAKANA LETTER KA; QQK
+32D5 ; [.22FD.0020.0013.32D5] # CIRCLED KATAKANA KA; QQK
+304C ; [.22FD.0020.000E.304B][.0000.0177.0002.3099] # HIRAGANA LETTER GA; QQCM
+30AC ; [.22FD.0020.0011.30AB][.0000.0177.0002.3099] # KATAKANA LETTER GA; QQCM
+330B ; [.22FD.0020.001C.330B][.22F9.0020.001C.330B][.231F.0020.001F.330B] # SQUARE KAIRI; QQKN
+330C ; [.22FD.0020.001C.330C][.231E.0020.001C.330C][.2309.0020.001F.330C][.230B.0020.001F.330C] # SQUARE KARATTO; QQKN
+330D ; [.22FD.0020.001C.330D][.2322.0020.001C.330D][.231F.0020.001F.330D][.0FA3.0020.001F.330D] # SQUARE KARORII; QQKN
+330E ; [.22FD.0020.001C.330E][.0000.0177.001C.330E][.2322.0020.001F.330E][.2327.0020.001F.330E] # SQUARE GARON; QQKN
+330F ; [.22FD.0020.001C.330F][.0000.0177.001C.330F][.2327.0020.001F.330F][.2316.0020.001F.330F] # SQUARE GANMA; QQKN
+304D ; [.22FE.0020.000E.304D] # HIRAGANA LETTER KI
+30AD ; [.22FE.0020.0011.30AD] # KATAKANA LETTER KI
+FF77 ; [.22FE.0020.0012.FF77] # HALFWIDTH KATAKANA LETTER KI; QQK
+32D6 ; [.22FE.0020.0013.32D6] # CIRCLED KATAKANA KI; QQK
+304E ; [.22FE.0020.000E.304D][.0000.0177.0002.3099] # HIRAGANA LETTER GI; QQCM
+30AE ; [.22FE.0020.0011.30AD][.0000.0177.0002.3099] # KATAKANA LETTER GI; QQCM
+3310 ; [.22FE.0020.001C.3310][.0000.0177.001C.3310][.22FD.0020.001F.3310][.0000.0177.001F.3310] # SQUARE GIGA; QQKN
+3311 ; [.22FE.0020.001C.3311][.0000.0177.001C.3311][.230D.0020.001F.3311][.0FA3.0020.001F.3311] # SQUARE GINII; QQKN
+3312 ; [.22FE.0020.001C.3312][.231C.0020.001C.3312][.231F.0020.001F.3312][.0FA3.0020.001F.3312] # SQUARE KYURII; QQKN
+3313 ; [.22FE.0020.001C.3313][.0000.0177.001C.3313][.2320.0020.001F.3313][.2307.0020.001F.3313][.0000.0177.001F.3313][.0FA3.0020.001F.3313] # SQUARE GIRUDAA; QQKN
+3314 ; [.22FE.0020.001C.3314][.2322.0020.001C.3314] # SQUARE KIRO; QQKN
+3315 ; [.22FE.0020.001C.3315][.2322.0020.001C.3315][.22FF.0020.001F.3315][.0000.0177.001F.3315][.231E.0020.001F.3315][.2318.0020.001F.3315] # SQUARE KIROGURAMU; QQKN
+3316 ; [.22FE.0020.001C.3316][.2322.0020.001C.3316][.2319.0020.001F.3316][.0FA3.0020.001F.3316][.230B.0020.001F.3316][.2320.0020.001F.3316] # SQUARE KIROMEETORU; QQKN
+3317 ; [.22FE.0020.001C.3317][.2322.0020.001C.3317][.2323.0020.001F.3317][.2309.0020.001F.3317][.230B.0020.001F.3317] # SQUARE KIROWATTO; QQKN
+304F ; [.22FF.0020.000E.304F] # HIRAGANA LETTER KU
+31F0 ; [.22FF.0020.000F.31F0] # KATAKANA LETTER SMALL KU
+30AF ; [.22FF.0020.0011.30AF] # KATAKANA LETTER KU
+FF78 ; [.22FF.0020.0012.FF78] # HALFWIDTH KATAKANA LETTER KU; QQK
+32D7 ; [.22FF.0020.0013.32D7] # CIRCLED KATAKANA KU; QQK
+3050 ; [.22FF.0020.000E.304F][.0000.0177.0002.3099] # HIRAGANA LETTER GU; QQCM
+30B0 ; [.22FF.0020.0011.30AF][.0000.0177.0002.3099] # KATAKANA LETTER GU; QQCM
+3318 ; [.22FF.0020.001C.3318][.0000.0177.001C.3318][.231E.0020.001F.3318][.2318.0020.001F.3318] # SQUARE GURAMU; QQKN
+3319 ; [.22FF.0020.001C.3319][.0000.0177.001C.3319][.231E.0020.001F.3319][.2318.0020.001F.3319][.230B.0020.001F.3319][.2327.0020.001F.3319] # SQUARE GURAMUTON; QQKN
+331A ; [.22FF.0020.001C.331A][.2320.0020.001C.331A][.2305.0020.001F.331A][.0000.0177.001F.331A][.22F9.0020.001F.331A][.2322.0020.001F.331A] # SQUARE KURUZEIRO; QQKN
+331B ; [.22FF.0020.001C.331B][.2322.0020.001C.331B][.0FA3.0020.001F.331B][.230F.0020.001F.331B] # SQUARE KUROONE; QQKN
+3096 ; [.2300.0020.000D.3096] # HIRAGANA LETTER SMALL KE
+3051 ; [.2300.0020.000E.3051] # HIRAGANA LETTER KE
+30F6 ; [.2300.0020.000F.30F6] # KATAKANA LETTER SMALL KE
+30B1 ; [.2300.0020.0011.30B1] # KATAKANA LETTER KE
+FF79 ; [.2300.0020.0012.FF79] # HALFWIDTH KATAKANA LETTER KE; QQK
+32D8 ; [.2300.0020.0013.32D8] # CIRCLED KATAKANA KE; QQK
+3052 ; [.2300.0020.000E.3051][.0000.0177.0002.3099] # HIRAGANA LETTER GE; QQCM
+30B2 ; [.2300.0020.0011.30B1][.0000.0177.0002.3099] # KATAKANA LETTER GE; QQCM
+331C ; [.2300.0020.001C.331C][.0FA3.0020.001C.331C][.2304.0020.001F.331C] # SQUARE KEESU; QQKN
+3053 ; [.2301.0020.000E.3053] # HIRAGANA LETTER KO
+30B3 ; [.2301.0020.0011.30B3] # KATAKANA LETTER KO
+FF7A ; [.2301.0020.0012.FF7A] # HALFWIDTH KATAKANA LETTER KO; QQK
+32D9 ; [.2301.0020.0013.32D9] # CIRCLED KATAKANA KO; QQK
+3054 ; [.2301.0020.000E.3053][.0000.0177.0002.3099] # HIRAGANA LETTER GO; QQCM
+30B4 ; [.2301.0020.0011.30B3][.0000.0177.0002.3099] # KATAKANA LETTER GO; QQCM
+331E ; [.2301.0020.001C.331E][.0FA3.0020.001C.331E][.2315.0020.001F.331E][.0000.0178.001F.331E] # SQUARE KOOPO; QQKN
+30FF ; [.2301.0020.0016.30FF][.230B.0020.0016.30FF] # KATAKANA DIGRAPH KOTO; QQKN
+331D ; [.2301.0020.001C.331D][.2320.0020.001C.331D][.230C.0020.001F.331D] # SQUARE KORUNA; QQKN
+3055 ; [.2302.0020.000E.3055] # HIRAGANA LETTER SA
+30B5 ; [.2302.0020.0011.30B5] # KATAKANA LETTER SA
+FF7B ; [.2302.0020.0012.FF7B] # HALFWIDTH KATAKANA LETTER SA; QQK
+32DA ; [.2302.0020.0013.32DA] # CIRCLED KATAKANA SA; QQK
+3056 ; [.2302.0020.000E.3055][.0000.0177.0002.3099] # HIRAGANA LETTER ZA; QQCM
+30B6 ; [.2302.0020.0011.30B5][.0000.0177.0002.3099] # KATAKANA LETTER ZA; QQCM
+331F ; [.2302.0020.001C.331F][.22F9.0020.001C.331F][.22FF.0020.001F.331F][.2320.0020.001F.331F] # SQUARE SAIKURU; QQKN
+3320 ; [.2302.0020.001C.3320][.2327.0020.001C.3320][.2308.0020.001F.3320][.0FA3.0020.001F.3320][.2318.0020.001F.3320] # SQUARE SANTIIMU; QQKN
+3057 ; [.2303.0020.000E.3057] # HIRAGANA LETTER SI
+31F1 ; [.2303.0020.000F.31F1] # KATAKANA LETTER SMALL SI
+30B7 ; [.2303.0020.0011.30B7] # KATAKANA LETTER SI
+FF7C ; [.2303.0020.0012.FF7C] # HALFWIDTH KATAKANA LETTER SI; QQK
+32DB ; [.2303.0020.0013.32DB] # CIRCLED KATAKANA SI; QQK
+3058 ; [.2303.0020.000E.3057][.0000.0177.0002.3099] # HIRAGANA LETTER ZI; QQCM
+30B8 ; [.2303.0020.0011.30B7][.0000.0177.0002.3099] # KATAKANA LETTER ZI; QQCM
+3006 ; [.2303.0020.0004.3006][.2319.0020.0004.3006] # IDEOGRAPHIC CLOSING MARK; QQKN
+3321 ; [.2303.0020.001C.3321][.231F.0020.001C.3321][.2327.0020.001F.3321][.22FF.0020.001F.3321][.0000.0177.001F.3321] # SQUARE SIRINGU; QQKN
+3059 ; [.2304.0020.000E.3059] # HIRAGANA LETTER SU
+31F2 ; [.2304.0020.000F.31F2] # KATAKANA LETTER SMALL SU
+30B9 ; [.2304.0020.0011.30B9] # KATAKANA LETTER SU
+FF7D ; [.2304.0020.0012.FF7D] # HALFWIDTH KATAKANA LETTER SU; QQK
+32DC ; [.2304.0020.0013.32DC] # CIRCLED KATAKANA SU; QQK
+305A ; [.2304.0020.000E.3059][.0000.0177.0002.3099] # HIRAGANA LETTER ZU; QQCM
+30BA ; [.2304.0020.0011.30B9][.0000.0177.0002.3099] # KATAKANA LETTER ZU; QQCM
+305B ; [.2305.0020.000E.305B] # HIRAGANA LETTER SE
+30BB ; [.2305.0020.0011.30BB] # KATAKANA LETTER SE
+FF7E ; [.2305.0020.0012.FF7E] # HALFWIDTH KATAKANA LETTER SE; QQK
+32DD ; [.2305.0020.0013.32DD] # CIRCLED KATAKANA SE; QQK
+305C ; [.2305.0020.000E.305B][.0000.0177.0002.3099] # HIRAGANA LETTER ZE; QQCM
+30BC ; [.2305.0020.0011.30BB][.0000.0177.0002.3099] # KATAKANA LETTER ZE; QQCM
+3322 ; [.2305.0020.001C.3322][.2327.0020.001C.3322][.2308.0020.001F.3322] # SQUARE SENTI; QQKN
+3323 ; [.2305.0020.001C.3323][.2327.0020.001C.3323][.230B.0020.001F.3323] # SQUARE SENTO; QQKN
+305D ; [.2306.0020.000E.305D] # HIRAGANA LETTER SO
+30BD ; [.2306.0020.0011.30BD] # KATAKANA LETTER SO
+FF7F ; [.2306.0020.0012.FF7F] # HALFWIDTH KATAKANA LETTER SO; QQK
+32DE ; [.2306.0020.0013.32DE] # CIRCLED KATAKANA SO; QQK
+305E ; [.2306.0020.000E.305D][.0000.0177.0002.3099] # HIRAGANA LETTER ZO; QQCM
+30BE ; [.2306.0020.0011.30BD][.0000.0177.0002.3099] # KATAKANA LETTER ZO; QQCM
+305F ; [.2307.0020.000E.305F] # HIRAGANA LETTER TA
+30BF ; [.2307.0020.0011.30BF] # KATAKANA LETTER TA
+FF80 ; [.2307.0020.0012.FF80] # HALFWIDTH KATAKANA LETTER TA; QQK
+32DF ; [.2307.0020.0013.32DF] # CIRCLED KATAKANA TA; QQK
+3060 ; [.2307.0020.000E.305F][.0000.0177.0002.3099] # HIRAGANA LETTER DA; QQCM
+30C0 ; [.2307.0020.0011.30BF][.0000.0177.0002.3099] # KATAKANA LETTER DA; QQCM
+3324 ; [.2307.0020.001C.3324][.0000.0177.001C.3324][.0FA3.0020.001F.3324][.2304.0020.001F.3324] # SQUARE DAASU; QQKN
+3061 ; [.2308.0020.000E.3061] # HIRAGANA LETTER TI
+30C1 ; [.2308.0020.0011.30C1] # KATAKANA LETTER TI
+FF81 ; [.2308.0020.0012.FF81] # HALFWIDTH KATAKANA LETTER TI; QQK
+32E0 ; [.2308.0020.0013.32E0] # CIRCLED KATAKANA TI; QQK
+3062 ; [.2308.0020.000E.3061][.0000.0177.0002.3099] # HIRAGANA LETTER DI; QQCM
+30C2 ; [.2308.0020.0011.30C1][.0000.0177.0002.3099] # KATAKANA LETTER DI; QQCM
+3063 ; [.2309.0020.000D.3063] # HIRAGANA LETTER SMALL TU
+3064 ; [.2309.0020.000E.3064] # HIRAGANA LETTER TU
+30C3 ; [.2309.0020.000F.30C3] # KATAKANA LETTER SMALL TU
+FF6F ; [.2309.0020.0010.FF6F] # HALFWIDTH KATAKANA LETTER SMALL TU; QQK
+30C4 ; [.2309.0020.0011.30C4] # KATAKANA LETTER TU
+FF82 ; [.2309.0020.0012.FF82] # HALFWIDTH KATAKANA LETTER TU; QQK
+32E1 ; [.2309.0020.0013.32E1] # CIRCLED KATAKANA TU; QQK
+3065 ; [.2309.0020.000E.3064][.0000.0177.0002.3099] # HIRAGANA LETTER DU; QQCM
+30C5 ; [.2309.0020.0011.30C4][.0000.0177.0002.3099] # KATAKANA LETTER DU; QQCM
+3066 ; [.230A.0020.000E.3066] # HIRAGANA LETTER TE
+30C6 ; [.230A.0020.0011.30C6] # KATAKANA LETTER TE
+FF83 ; [.230A.0020.0012.FF83] # HALFWIDTH KATAKANA LETTER TE; QQK
+32E2 ; [.230A.0020.0013.32E2] # CIRCLED KATAKANA TE; QQK
+3067 ; [.230A.0020.000E.3066][.0000.0177.0002.3099] # HIRAGANA LETTER DE; QQCM
+30C7 ; [.230A.0020.0011.30C6][.0000.0177.0002.3099] # KATAKANA LETTER DE; QQCM
+3325 ; [.230A.0020.001C.3325][.0000.0177.001C.3325][.2303.0020.001F.3325] # SQUARE DESI; QQKN
+3068 ; [.230B.0020.000E.3068] # HIRAGANA LETTER TO
+31F3 ; [.230B.0020.000F.31F3] # KATAKANA LETTER SMALL TO
+30C8 ; [.230B.0020.0011.30C8] # KATAKANA LETTER TO
+FF84 ; [.230B.0020.0012.FF84] # HALFWIDTH KATAKANA LETTER TO; QQK
+32E3 ; [.230B.0020.0013.32E3] # CIRCLED KATAKANA TO; QQK
+3069 ; [.230B.0020.000E.3068][.0000.0177.0002.3099] # HIRAGANA LETTER DO; QQCM
+30C9 ; [.230B.0020.0011.30C8][.0000.0177.0002.3099] # KATAKANA LETTER DO; QQCM
+3326 ; [.230B.0020.001C.3326][.0000.0177.001C.3326][.2320.0020.001F.3326] # SQUARE DORU; QQKN
+3327 ; [.230B.0020.001C.3327][.2327.0020.001C.3327] # SQUARE TON; QQKN
+306A ; [.230C.0020.000E.306A] # HIRAGANA LETTER NA
+30CA ; [.230C.0020.0011.30CA] # KATAKANA LETTER NA
+FF85 ; [.230C.0020.0012.FF85] # HALFWIDTH KATAKANA LETTER NA; QQK
+32E4 ; [.230C.0020.0013.32E4] # CIRCLED KATAKANA NA; QQK
+3328 ; [.230C.0020.001C.3328][.2310.0020.001C.3328] # SQUARE NANO; QQKN
+306B ; [.230D.0020.000E.306B] # HIRAGANA LETTER NI
+30CB ; [.230D.0020.0011.30CB] # KATAKANA LETTER NI
+FF86 ; [.230D.0020.0012.FF86] # HALFWIDTH KATAKANA LETTER NI; QQK
+32E5 ; [.230D.0020.0013.32E5] # CIRCLED KATAKANA NI; QQK
+306C ; [.230E.0020.000E.306C] # HIRAGANA LETTER NU
+31F4 ; [.230E.0020.000F.31F4] # KATAKANA LETTER SMALL NU
+30CC ; [.230E.0020.0011.30CC] # KATAKANA LETTER NU
+FF87 ; [.230E.0020.0012.FF87] # HALFWIDTH KATAKANA LETTER NU; QQK
+32E6 ; [.230E.0020.0013.32E6] # CIRCLED KATAKANA NU; QQK
+306D ; [.230F.0020.000E.306D] # HIRAGANA LETTER NE
+30CD ; [.230F.0020.0011.30CD] # KATAKANA LETTER NE
+FF88 ; [.230F.0020.0012.FF88] # HALFWIDTH KATAKANA LETTER NE; QQK
+32E7 ; [.230F.0020.0013.32E7] # CIRCLED KATAKANA NE; QQK
+306E ; [.2310.0020.000E.306E] # HIRAGANA LETTER NO
+30CE ; [.2310.0020.0011.30CE] # KATAKANA LETTER NO
+FF89 ; [.2310.0020.0012.FF89] # HALFWIDTH KATAKANA LETTER NO; QQK
+32E8 ; [.2310.0020.0013.32E8] # CIRCLED KATAKANA NO; QQK
+3329 ; [.2310.0020.001C.3329][.2309.0020.001C.3329][.230B.0020.001F.3329] # SQUARE NOTTO; QQKN
+306F ; [.2311.0020.000E.306F] # HIRAGANA LETTER HA
+31F5 ; [.2311.0020.000F.31F5] # KATAKANA LETTER SMALL HA
+30CF ; [.2311.0020.0011.30CF] # KATAKANA LETTER HA
+FF8A ; [.2311.0020.0012.FF8A] # HALFWIDTH KATAKANA LETTER HA; QQK
+32E9 ; [.2311.0020.0013.32E9] # CIRCLED KATAKANA HA; QQK
+3070 ; [.2311.0020.000E.306F][.0000.0177.0002.3099] # HIRAGANA LETTER BA; QQCM
+30D0 ; [.2311.0020.0011.30CF][.0000.0177.0002.3099] # KATAKANA LETTER BA; QQCM
+3071 ; [.2311.0020.000E.306F][.0000.0178.0002.309A] # HIRAGANA LETTER PA; QQCM
+30D1 ; [.2311.0020.0011.30CF][.0000.0178.0002.309A] # KATAKANA LETTER PA; QQCM
+332B ; [.2311.0020.001C.332B][.0000.0178.001C.332B][.0FA3.0020.001F.332B][.2305.0020.001F.332B][.2327.0020.001F.332B][.230B.0020.001F.332B] # SQUARE PAASENTO; QQKN
+332C ; [.2311.0020.001C.332C][.0000.0178.001C.332C][.0FA3.0020.001F.332C][.2309.0020.001F.332C] # SQUARE PAATU; QQKN
+332D ; [.2311.0020.001C.332D][.0000.0177.001C.332D][.0FA3.0020.001F.332D][.2321.0020.001F.332D][.2320.0020.001F.332D] # SQUARE BAARERU; QQKN
+332A ; [.2311.0020.001C.332A][.22F9.0020.001C.332A][.2309.0020.001F.332A] # SQUARE HAITU; QQKN
+3072 ; [.2312.0020.000E.3072] # HIRAGANA LETTER HI
+31F6 ; [.2312.0020.000F.31F6] # KATAKANA LETTER SMALL HI
+30D2 ; [.2312.0020.0011.30D2] # KATAKANA LETTER HI
+FF8B ; [.2312.0020.0012.FF8B] # HALFWIDTH KATAKANA LETTER HI; QQK
+32EA ; [.2312.0020.0013.32EA] # CIRCLED KATAKANA HI; QQK
+3073 ; [.2312.0020.000E.3072][.0000.0177.0002.3099] # HIRAGANA LETTER BI; QQCM
+30D3 ; [.2312.0020.0011.30D2][.0000.0177.0002.3099] # KATAKANA LETTER BI; QQCM
+3074 ; [.2312.0020.000E.3072][.0000.0178.0002.309A] # HIRAGANA LETTER PI; QQCM
+30D4 ; [.2312.0020.0011.30D2][.0000.0178.0002.309A] # KATAKANA LETTER PI; QQCM
+332E ; [.2312.0020.001C.332E][.0000.0178.001C.332E][.22F8.0020.001F.332E][.2304.0020.001F.332E][.230B.0020.001F.332E][.2320.0020.001F.332E] # SQUARE PIASUTORU; QQKN
+332F ; [.2312.0020.001C.332F][.0000.0178.001C.332F][.22FF.0020.001F.332F][.2320.0020.001F.332F] # SQUARE PIKURU; QQKN
+3330 ; [.2312.0020.001C.3330][.0000.0178.001C.3330][.2301.0020.001F.3330] # SQUARE PIKO; QQKN
+3331 ; [.2312.0020.001C.3331][.0000.0177.001C.3331][.2320.0020.001F.3331] # SQUARE BIRU; QQKN
+3075 ; [.2313.0020.000E.3075] # HIRAGANA LETTER HU
+31F7 ; [.2313.0020.000F.31F7] # KATAKANA LETTER SMALL HU
+30D5 ; [.2313.0020.0011.30D5] # KATAKANA LETTER HU
+FF8C ; [.2313.0020.0012.FF8C] # HALFWIDTH KATAKANA LETTER HU; QQK
+32EB ; [.2313.0020.0013.32EB] # CIRCLED KATAKANA HU; QQK
+3076 ; [.2313.0020.000E.3075][.0000.0177.0002.3099] # HIRAGANA LETTER BU; QQCM
+30D6 ; [.2313.0020.0011.30D5][.0000.0177.0002.3099] # KATAKANA LETTER BU; QQCM
+3077 ; [.2313.0020.000E.3075][.0000.0178.0002.309A] # HIRAGANA LETTER PU; QQCM
+30D7 ; [.2313.0020.0011.30D5][.0000.0178.0002.309A] # KATAKANA LETTER PU; QQCM
+3332 ; [.2313.0020.001C.3332][.22F8.0020.001C.3332][.231E.0020.001F.3332][.2309.0020.001F.3332][.230B.0020.001F.3332][.0000.0177.001F.3332] # SQUARE HUARADDO; QQKN
+3333 ; [.2313.0020.001C.3333][.22F9.0020.001C.3333][.0FA3.0020.001F.3333][.230B.0020.001F.3333] # SQUARE HUIITO; QQKN
+3334 ; [.2313.0020.001C.3334][.0000.0177.001C.3334][.2309.0020.001F.3334][.2303.0020.001F.3334][.22FB.0020.001F.3334][.2320.0020.001F.3334] # SQUARE BUSSYERU; QQKN
+3335 ; [.2313.0020.001C.3335][.231E.0020.001C.3335][.2327.0020.001F.3335] # SQUARE HURAN; QQKN
+3078 ; [.2314.0020.000E.3078] # HIRAGANA LETTER HE
+31F8 ; [.2314.0020.000F.31F8] # KATAKANA LETTER SMALL HE
+30D8 ; [.2314.0020.0011.30D8] # KATAKANA LETTER HE
+FF8D ; [.2314.0020.0012.FF8D] # HALFWIDTH KATAKANA LETTER HE; QQK
+32EC ; [.2314.0020.0013.32EC] # CIRCLED KATAKANA HE; QQK
+3079 ; [.2314.0020.000E.3078][.0000.0177.0002.3099] # HIRAGANA LETTER BE; QQCM
+30D9 ; [.2314.0020.0011.30D8][.0000.0177.0002.3099] # KATAKANA LETTER BE; QQCM
+307A ; [.2314.0020.000E.3078][.0000.0178.0002.309A] # HIRAGANA LETTER PE; QQCM
+30DA ; [.2314.0020.0011.30D8][.0000.0178.0002.309A] # KATAKANA LETTER PE; QQCM
+333B ; [.2314.0020.001C.333B][.0000.0178.001C.333B][.0FA3.0020.001F.333B][.2303.0020.001F.333B][.0000.0177.001F.333B] # SQUARE PEEZI; QQKN
+333C ; [.2314.0020.001C.333C][.0000.0177.001C.333C][.0FA3.0020.001F.333C][.2307.0020.001F.333C] # SQUARE BEETA; QQKN
+3336 ; [.2314.0020.001C.3336][.22FF.0020.001C.3336][.2307.0020.001F.3336][.0FA3.0020.001F.3336][.2320.0020.001F.3336] # SQUARE HEKUTAARU; QQKN
+3337 ; [.2314.0020.001C.3337][.0000.0178.001C.3337][.2306.0020.001F.3337] # SQUARE PESO; QQKN
+3338 ; [.2314.0020.001C.3338][.0000.0178.001C.3338][.230D.0020.001F.3338][.2312.0020.001F.3338] # SQUARE PENIHI; QQKN
+3339 ; [.2314.0020.001C.3339][.2320.0020.001C.3339][.2309.0020.001F.3339] # SQUARE HERUTU; QQKN
+333A ; [.2314.0020.001C.333A][.0000.0178.001C.333A][.2327.0020.001F.333A][.2304.0020.001F.333A] # SQUARE PENSU; QQKN
+307B ; [.2315.0020.000E.307B] # HIRAGANA LETTER HO
+31F9 ; [.2315.0020.000F.31F9] # KATAKANA LETTER SMALL HO
+30DB ; [.2315.0020.0011.30DB] # KATAKANA LETTER HO
+FF8E ; [.2315.0020.0012.FF8E] # HALFWIDTH KATAKANA LETTER HO; QQK
+32ED ; [.2315.0020.0013.32ED] # CIRCLED KATAKANA HO; QQK
+307C ; [.2315.0020.000E.307B][.0000.0177.0002.3099] # HIRAGANA LETTER BO; QQCM
+30DC ; [.2315.0020.0011.30DB][.0000.0177.0002.3099] # KATAKANA LETTER BO; QQCM
+307D ; [.2315.0020.000E.307B][.0000.0178.0002.309A] # HIRAGANA LETTER PO; QQCM
+30DD ; [.2315.0020.0011.30DB][.0000.0178.0002.309A] # KATAKANA LETTER PO; QQCM
+3341 ; [.2315.0020.001C.3341][.0FA3.0020.001C.3341][.2320.0020.001F.3341] # SQUARE HOORU; QQKN
+3342 ; [.2315.0020.001C.3342][.0FA3.0020.001C.3342][.2327.0020.001F.3342] # SQUARE HOON; QQKN
+333D ; [.2315.0020.001C.333D][.0000.0178.001C.333D][.22F9.0020.001F.333D][.2327.0020.001F.333D][.230B.0020.001F.333D] # SQUARE POINTO; QQKN
+333E ; [.2315.0020.001C.333E][.0000.0177.001C.333E][.2320.0020.001F.333E][.230B.0020.001F.333E] # SQUARE BORUTO; QQKN
+333F ; [.2315.0020.001C.333F][.2327.0020.001C.333F] # SQUARE HON; QQKN
+3340 ; [.2315.0020.001C.3340][.0000.0178.001C.3340][.2327.0020.001F.3340][.230B.0020.001F.3340][.0000.0177.001F.3340] # SQUARE PONDO; QQKN
+307E ; [.2316.0020.000E.307E] # HIRAGANA LETTER MA
+30DE ; [.2316.0020.0011.30DE] # KATAKANA LETTER MA
+FF8F ; [.2316.0020.0012.FF8F] # HALFWIDTH KATAKANA LETTER MA; QQK
+32EE ; [.2316.0020.0013.32EE] # CIRCLED KATAKANA MA; QQK
+3343 ; [.2316.0020.001C.3343][.22F9.0020.001C.3343][.22FF.0020.001F.3343][.2322.0020.001F.3343] # SQUARE MAIKURO; QQKN
+3344 ; [.2316.0020.001C.3344][.22F9.0020.001C.3344][.2320.0020.001F.3344] # SQUARE MAIRU; QQKN
+303C ; [.2316.0020.0004.303C][.2304.0020.0004.303C] # MASU MARK; QQKN
+3345 ; [.2316.0020.001C.3345][.2309.0020.001C.3345][.2311.0020.001F.3345] # SQUARE MAHHA; QQKN
+3346 ; [.2316.0020.001C.3346][.2320.0020.001C.3346][.22FF.0020.001F.3346] # SQUARE MARUKU; QQKN
+3347 ; [.2316.0020.001C.3347][.2327.0020.001C.3347][.2303.0020.001F.3347][.231D.0020.001F.3347][.2327.0020.001F.3347] # SQUARE MANSYON; QQKN
+307F ; [.2317.0020.000E.307F] # HIRAGANA LETTER MI
+30DF ; [.2317.0020.0011.30DF] # KATAKANA LETTER MI
+FF90 ; [.2317.0020.0012.FF90] # HALFWIDTH KATAKANA LETTER MI; QQK
+32EF ; [.2317.0020.0013.32EF] # CIRCLED KATAKANA MI; QQK
+3348 ; [.2317.0020.001C.3348][.22FF.0020.001C.3348][.2322.0020.001F.3348][.2327.0020.001F.3348] # SQUARE MIKURON; QQKN
+3349 ; [.2317.0020.001C.3349][.231F.0020.001C.3349] # SQUARE MIRI; QQKN
+334A ; [.2317.0020.001C.334A][.231F.0020.001C.334A][.2311.0020.001F.334A][.0000.0177.001F.334A][.0FA3.0020.001F.334A][.2320.0020.001F.334A] # SQUARE MIRIBAARU; QQKN
+3080 ; [.2318.0020.000E.3080] # HIRAGANA LETTER MU
+31FA ; [.2318.0020.000F.31FA] # KATAKANA LETTER SMALL MU
+30E0 ; [.2318.0020.0011.30E0] # KATAKANA LETTER MU
+FF91 ; [.2318.0020.0012.FF91] # HALFWIDTH KATAKANA LETTER MU; QQK
+32F0 ; [.2318.0020.0013.32F0] # CIRCLED KATAKANA MU; QQK
+3081 ; [.2319.0020.000E.3081] # HIRAGANA LETTER ME
+30E1 ; [.2319.0020.0011.30E1] # KATAKANA LETTER ME
+FF92 ; [.2319.0020.0012.FF92] # HALFWIDTH KATAKANA LETTER ME; QQK
+32F1 ; [.2319.0020.0013.32F1] # CIRCLED KATAKANA ME; QQK
+334D ; [.2319.0020.001C.334D][.0FA3.0020.001C.334D][.230B.0020.001F.334D][.2320.0020.001F.334D] # SQUARE MEETORU; QQKN
+334B ; [.2319.0020.001C.334B][.22FD.0020.001C.334B][.0000.0177.001F.334B] # SQUARE MEGA; QQKN
+334C ; [.2319.0020.001C.334C][.22FD.0020.001C.334C][.0000.0177.001F.334C][.230B.0020.001F.334C][.2327.0020.001F.334C] # SQUARE MEGATON; QQKN
+3082 ; [.231A.0020.000E.3082] # HIRAGANA LETTER MO
+30E2 ; [.231A.0020.0011.30E2] # KATAKANA LETTER MO
+FF93 ; [.231A.0020.0012.FF93] # HALFWIDTH KATAKANA LETTER MO; QQK
+32F2 ; [.231A.0020.0013.32F2] # CIRCLED KATAKANA MO; QQK
+3083 ; [.231B.0020.000D.3083] # HIRAGANA LETTER SMALL YA
+3084 ; [.231B.0020.000E.3084] # HIRAGANA LETTER YA
+30E3 ; [.231B.0020.000F.30E3] # KATAKANA LETTER SMALL YA
+FF6C ; [.231B.0020.0010.FF6C] # HALFWIDTH KATAKANA LETTER SMALL YA; QQK
+30E4 ; [.231B.0020.0011.30E4] # KATAKANA LETTER YA
+FF94 ; [.231B.0020.0012.FF94] # HALFWIDTH KATAKANA LETTER YA; QQK
+32F3 ; [.231B.0020.0013.32F3] # CIRCLED KATAKANA YA; QQK
+334E ; [.231B.0020.001C.334E][.0FA3.0020.001C.334E][.230B.0020.001F.334E][.0000.0177.001F.334E] # SQUARE YAADO; QQKN
+334F ; [.231B.0020.001C.334F][.0FA3.0020.001C.334F][.2320.0020.001F.334F] # SQUARE YAARU; QQKN
+3085 ; [.231C.0020.000D.3085] # HIRAGANA LETTER SMALL YU
+3086 ; [.231C.0020.000E.3086] # HIRAGANA LETTER YU
+30E5 ; [.231C.0020.000F.30E5] # KATAKANA LETTER SMALL YU
+FF6D ; [.231C.0020.0010.FF6D] # HALFWIDTH KATAKANA LETTER SMALL YU; QQK
+30E6 ; [.231C.0020.0011.30E6] # KATAKANA LETTER YU
+FF95 ; [.231C.0020.0012.FF95] # HALFWIDTH KATAKANA LETTER YU; QQK
+32F4 ; [.231C.0020.0013.32F4] # CIRCLED KATAKANA YU; QQK
+3350 ; [.231C.0020.001C.3350][.22F8.0020.001C.3350][.2327.0020.001F.3350] # SQUARE YUAN; QQKN
+3087 ; [.231D.0020.000D.3087] # HIRAGANA LETTER SMALL YO
+3088 ; [.231D.0020.000E.3088] # HIRAGANA LETTER YO
+30E7 ; [.231D.0020.000F.30E7] # KATAKANA LETTER SMALL YO
+FF6E ; [.231D.0020.0010.FF6E] # HALFWIDTH KATAKANA LETTER SMALL YO; QQK
+30E8 ; [.231D.0020.0011.30E8] # KATAKANA LETTER YO
+FF96 ; [.231D.0020.0012.FF96] # HALFWIDTH KATAKANA LETTER YO; QQK
+32F5 ; [.231D.0020.0013.32F5] # CIRCLED KATAKANA YO; QQK
+309F ; [.231D.0020.0016.309F][.231F.0020.0016.309F] # HIRAGANA DIGRAPH YORI; QQKN
+3089 ; [.231E.0020.000E.3089] # HIRAGANA LETTER RA
+31FB ; [.231E.0020.000F.31FB] # KATAKANA LETTER SMALL RA
+30E9 ; [.231E.0020.0011.30E9] # KATAKANA LETTER RA
+FF97 ; [.231E.0020.0012.FF97] # HALFWIDTH KATAKANA LETTER RA; QQK
+32F6 ; [.231E.0020.0013.32F6] # CIRCLED KATAKANA RA; QQK
+308A ; [.231F.0020.000E.308A] # HIRAGANA LETTER RI
+31FC ; [.231F.0020.000F.31FC] # KATAKANA LETTER SMALL RI
+30EA ; [.231F.0020.0011.30EA] # KATAKANA LETTER RI
+FF98 ; [.231F.0020.0012.FF98] # HALFWIDTH KATAKANA LETTER RI; QQK
+32F7 ; [.231F.0020.0013.32F7] # CIRCLED KATAKANA RI; QQK
+3351 ; [.231F.0020.001C.3351][.2309.0020.001C.3351][.230B.0020.001F.3351][.2320.0020.001F.3351] # SQUARE RITTORU; QQKN
+3352 ; [.231F.0020.001C.3352][.231E.0020.001C.3352] # SQUARE RIRA; QQKN
+308B ; [.2320.0020.000E.308B] # HIRAGANA LETTER RU
+31FD ; [.2320.0020.000F.31FD] # KATAKANA LETTER SMALL RU
+30EB ; [.2320.0020.0011.30EB] # KATAKANA LETTER RU
+FF99 ; [.2320.0020.0012.FF99] # HALFWIDTH KATAKANA LETTER RU; QQK
+32F8 ; [.2320.0020.0013.32F8] # CIRCLED KATAKANA RU; QQK
+3354 ; [.2320.0020.001C.3354][.0FA3.0020.001C.3354][.2313.0020.001F.3354][.0000.0177.001F.3354][.2320.0020.001F.3354] # SQUARE RUUBURU; QQKN
+3353 ; [.2320.0020.001C.3353][.2312.0020.001C.3353][.0000.0178.001F.3353][.0FA3.0020.001F.3353] # SQUARE RUPII; QQKN
+308C ; [.2321.0020.000E.308C] # HIRAGANA LETTER RE
+31FE ; [.2321.0020.000F.31FE] # KATAKANA LETTER SMALL RE
+30EC ; [.2321.0020.0011.30EC] # KATAKANA LETTER RE
+FF9A ; [.2321.0020.0012.FF9A] # HALFWIDTH KATAKANA LETTER RE; QQK
+32F9 ; [.2321.0020.0013.32F9] # CIRCLED KATAKANA RE; QQK
+3355 ; [.2321.0020.001C.3355][.2318.0020.001C.3355] # SQUARE REMU; QQKN
+3356 ; [.2321.0020.001C.3356][.2327.0020.001C.3356][.230B.0020.001F.3356][.2300.0020.001F.3356][.0000.0177.001F.3356][.2327.0020.001F.3356] # SQUARE RENTOGEN; QQKN
+308D ; [.2322.0020.000E.308D] # HIRAGANA LETTER RO
+31FF ; [.2322.0020.000F.31FF] # KATAKANA LETTER SMALL RO
+30ED ; [.2322.0020.0011.30ED] # KATAKANA LETTER RO
+FF9B ; [.2322.0020.0012.FF9B] # HALFWIDTH KATAKANA LETTER RO; QQK
+32FA ; [.2322.0020.0013.32FA] # CIRCLED KATAKANA RO; QQK
+308E ; [.2323.0020.000D.308E] # HIRAGANA LETTER SMALL WA
+308F ; [.2323.0020.000E.308F] # HIRAGANA LETTER WA
+30EE ; [.2323.0020.000F.30EE] # KATAKANA LETTER SMALL WA
+30EF ; [.2323.0020.0011.30EF] # KATAKANA LETTER WA
+FF9C ; [.2323.0020.0012.FF9C] # HALFWIDTH KATAKANA LETTER WA; QQK
+32FB ; [.2323.0020.0013.32FB] # CIRCLED KATAKANA WA; QQK
+30F7 ; [.2323.0020.0011.30EF][.0000.0177.0002.3099] # KATAKANA LETTER VA; QQCM
+3357 ; [.2323.0020.001C.3357][.2309.0020.001C.3357][.230B.0020.001F.3357] # SQUARE WATTO; QQKN
+3090 ; [.2324.0020.000E.3090] # HIRAGANA LETTER WI
+30F0 ; [.2324.0020.0011.30F0] # KATAKANA LETTER WI
+32FC ; [.2324.0020.0013.32FC] # CIRCLED KATAKANA WI; QQK
+30F8 ; [.2324.0020.0011.30F0][.0000.0177.0002.3099] # KATAKANA LETTER VI; QQCM
+3091 ; [.2325.0020.000E.3091] # HIRAGANA LETTER WE
+30F1 ; [.2325.0020.0011.30F1] # KATAKANA LETTER WE
+32FD ; [.2325.0020.0013.32FD] # CIRCLED KATAKANA WE; QQK
+30F9 ; [.2325.0020.0011.30F1][.0000.0177.0002.3099] # KATAKANA LETTER VE; QQCM
+3092 ; [.2326.0020.000E.3092] # HIRAGANA LETTER WO
+30F2 ; [.2326.0020.0011.30F2] # KATAKANA LETTER WO
+FF66 ; [.2326.0020.0012.FF66] # HALFWIDTH KATAKANA LETTER WO; QQK
+32FE ; [.2326.0020.0013.32FE] # CIRCLED KATAKANA WO; QQK
+30FA ; [.2326.0020.0011.30F2][.0000.0177.0002.3099] # KATAKANA LETTER VO; QQCM
+3093 ; [.2327.0020.000E.3093] # HIRAGANA LETTER N
+30F3 ; [.2327.0020.0011.30F3] # KATAKANA LETTER N
+FF9D ; [.2327.0020.0012.FF9D] # HALFWIDTH KATAKANA LETTER N; QQK
+3105 ; [.2328.0020.0002.3105] # BOPOMOFO LETTER B
+31A0 ; [.2328.0020.0004.31A0][.0000.019A.0004.31A0] # BOPOMOFO LETTER BU; QQKN
+3106 ; [.2329.0020.0002.3106] # BOPOMOFO LETTER P
+31B4 ; [.2329.0020.0019.31B4] # BOPOMOFO FINAL LETTER P; QQK
+3107 ; [.232A.0020.0002.3107] # BOPOMOFO LETTER M
+3108 ; [.232B.0020.0002.3108] # BOPOMOFO LETTER F
+312A ; [.232C.0020.0002.312A] # BOPOMOFO LETTER V
+3109 ; [.232D.0020.0002.3109] # BOPOMOFO LETTER D
+310A ; [.232E.0020.0002.310A] # BOPOMOFO LETTER T
+31B5 ; [.232E.0020.0019.31B5] # BOPOMOFO FINAL LETTER T; QQK
+310B ; [.232F.0020.0002.310B] # BOPOMOFO LETTER N
+310C ; [.2330.0020.0002.310C] # BOPOMOFO LETTER L
+310D ; [.2331.0020.0002.310D] # BOPOMOFO LETTER G
+31A3 ; [.2331.0020.0004.31A3][.0000.019A.0004.31A3] # BOPOMOFO LETTER GU; QQKN
+310E ; [.2332.0020.0002.310E] # BOPOMOFO LETTER K
+31B6 ; [.2332.0020.0019.31B6] # BOPOMOFO FINAL LETTER K; QQK
+312B ; [.2333.0020.0002.312B] # BOPOMOFO LETTER NG
+31AD ; [.2334.0020.0002.31AD] # BOPOMOFO LETTER NGG
+310F ; [.2335.0020.0002.310F] # BOPOMOFO LETTER H
+31B7 ; [.2335.0020.0019.31B7] # BOPOMOFO FINAL LETTER H; QQK
+3110 ; [.2336.0020.0002.3110] # BOPOMOFO LETTER J
+31A2 ; [.2336.0020.0004.31A2][.0000.019A.0004.31A2] # BOPOMOFO LETTER JI; QQKN
+3111 ; [.2337.0020.0002.3111] # BOPOMOFO LETTER Q
+3112 ; [.2338.0020.0002.3112] # BOPOMOFO LETTER X
+312C ; [.2339.0020.0002.312C] # BOPOMOFO LETTER GN
+3113 ; [.233A.0020.0002.3113] # BOPOMOFO LETTER ZH
+3114 ; [.233B.0020.0002.3114] # BOPOMOFO LETTER CH
+3115 ; [.233C.0020.0002.3115] # BOPOMOFO LETTER SH
+3116 ; [.233D.0020.0002.3116] # BOPOMOFO LETTER R
+3117 ; [.233E.0020.0002.3117] # BOPOMOFO LETTER Z
+31A1 ; [.233E.0020.0004.31A1][.0000.019A.0004.31A1] # BOPOMOFO LETTER ZI; QQKN
+3118 ; [.233F.0020.0002.3118] # BOPOMOFO LETTER C
+3119 ; [.2340.0020.0002.3119] # BOPOMOFO LETTER S
+311A ; [.2341.0020.0002.311A] # BOPOMOFO LETTER A
+31A9 ; [.2341.0020.0004.31A9][.0000.019A.0004.31A9] # BOPOMOFO LETTER ANN; QQKN
+311B ; [.2342.0020.0002.311B] # BOPOMOFO LETTER O
+31A7 ; [.2342.0020.0004.31A7][.0000.019A.0004.31A7] # BOPOMOFO LETTER ONN; QQKN
+31A6 ; [.2343.0020.0002.31A6] # BOPOMOFO LETTER OO
+311C ; [.2344.0020.0002.311C] # BOPOMOFO LETTER E
+311D ; [.2345.0020.0002.311D] # BOPOMOFO LETTER EH
+31A4 ; [.2346.0020.0002.31A4] # BOPOMOFO LETTER EE
+31A5 ; [.2346.0020.0004.31A5][.0000.019A.0004.31A5] # BOPOMOFO LETTER ENN; QQKN
+311E ; [.2347.0020.0002.311E] # BOPOMOFO LETTER AI
+31AE ; [.2347.0020.0004.31AE][.0000.019A.0004.31AE] # BOPOMOFO LETTER AINN; QQKN
+311F ; [.2348.0020.0002.311F] # BOPOMOFO LETTER EI
+3120 ; [.2349.0020.0002.3120] # BOPOMOFO LETTER AU
+31AF ; [.2349.0020.0004.31AF][.0000.019A.0004.31AF] # BOPOMOFO LETTER AUNN; QQKN
+3121 ; [.234A.0020.0002.3121] # BOPOMOFO LETTER OU
+3122 ; [.234B.0020.0002.3122] # BOPOMOFO LETTER AN
+3123 ; [.234C.0020.0002.3123] # BOPOMOFO LETTER EN
+3124 ; [.234D.0020.0002.3124] # BOPOMOFO LETTER ANG
+31B2 ; [.234E.0020.0002.31B2] # BOPOMOFO LETTER ONG
+3125 ; [.234F.0020.0002.3125] # BOPOMOFO LETTER ENG
+31B0 ; [.2350.0020.0002.31B0] # BOPOMOFO LETTER AM
+31B1 ; [.2351.0020.0002.31B1] # BOPOMOFO LETTER OM
+31AC ; [.2352.0020.0002.31AC] # BOPOMOFO LETTER IM
+3126 ; [.2353.0020.0002.3126] # BOPOMOFO LETTER ER
+3127 ; [.2354.0020.0002.3127] # BOPOMOFO LETTER I
+31AA ; [.2354.0020.0004.31AA][.0000.019A.0004.31AA] # BOPOMOFO LETTER INN; QQKN
+31B3 ; [.2354.0020.0016.31B3][.0000.019A.0016.31B3] # BOPOMOFO LETTER INNN; QQKN
+3128 ; [.2355.0020.0002.3128] # BOPOMOFO LETTER U
+31AB ; [.2355.0020.0004.31AB][.0000.019A.0004.31AB] # BOPOMOFO LETTER UNN; QQKN
+31A8 ; [.2355.0020.0004.31A8][.0000.019C.0004.31A8] # BOPOMOFO LETTER IR; QQKN
+3129 ; [.2356.0020.0002.3129] # BOPOMOFO LETTER IU
+A000 ; [.2357.0020.0002.A000] # YI SYLLABLE IT
+A001 ; [.2358.0020.0002.A001] # YI SYLLABLE IX
+A002 ; [.2359.0020.0002.A002] # YI SYLLABLE I
+A003 ; [.235A.0020.0002.A003] # YI SYLLABLE IP
+A004 ; [.235B.0020.0002.A004] # YI SYLLABLE IET
+A005 ; [.235C.0020.0002.A005] # YI SYLLABLE IEX
+A006 ; [.235D.0020.0002.A006] # YI SYLLABLE IE
+A007 ; [.235E.0020.0002.A007] # YI SYLLABLE IEP
+A008 ; [.235F.0020.0002.A008] # YI SYLLABLE AT
+A009 ; [.2360.0020.0002.A009] # YI SYLLABLE AX
+A00A ; [.2361.0020.0002.A00A] # YI SYLLABLE A
+A00B ; [.2362.0020.0002.A00B] # YI SYLLABLE AP
+A00C ; [.2363.0020.0002.A00C] # YI SYLLABLE UOX
+A00D ; [.2364.0020.0002.A00D] # YI SYLLABLE UO
+A00E ; [.2365.0020.0002.A00E] # YI SYLLABLE UOP
+A00F ; [.2366.0020.0002.A00F] # YI SYLLABLE OT
+A010 ; [.2367.0020.0002.A010] # YI SYLLABLE OX
+A011 ; [.2368.0020.0002.A011] # YI SYLLABLE O
+A012 ; [.2369.0020.0002.A012] # YI SYLLABLE OP
+A013 ; [.236A.0020.0002.A013] # YI SYLLABLE EX
+A014 ; [.236B.0020.0002.A014] # YI SYLLABLE E
+A015 ; [.236C.0020.0002.A015] # YI SYLLABLE WU
+A016 ; [.236D.0020.0002.A016] # YI SYLLABLE BIT
+A017 ; [.236E.0020.0002.A017] # YI SYLLABLE BIX
+A018 ; [.236F.0020.0002.A018] # YI SYLLABLE BI
+A019 ; [.2370.0020.0002.A019] # YI SYLLABLE BIP
+A01A ; [.2371.0020.0002.A01A] # YI SYLLABLE BIET
+A01B ; [.2372.0020.0002.A01B] # YI SYLLABLE BIEX
+A01C ; [.2373.0020.0002.A01C] # YI SYLLABLE BIE
+A01D ; [.2374.0020.0002.A01D] # YI SYLLABLE BIEP
+A01E ; [.2375.0020.0002.A01E] # YI SYLLABLE BAT
+A01F ; [.2376.0020.0002.A01F] # YI SYLLABLE BAX
+A020 ; [.2377.0020.0002.A020] # YI SYLLABLE BA
+A021 ; [.2378.0020.0002.A021] # YI SYLLABLE BAP
+A022 ; [.2379.0020.0002.A022] # YI SYLLABLE BUOX
+A023 ; [.237A.0020.0002.A023] # YI SYLLABLE BUO
+A024 ; [.237B.0020.0002.A024] # YI SYLLABLE BUOP
+A025 ; [.237C.0020.0002.A025] # YI SYLLABLE BOT
+A026 ; [.237D.0020.0002.A026] # YI SYLLABLE BOX
+A027 ; [.237E.0020.0002.A027] # YI SYLLABLE BO
+A028 ; [.237F.0020.0002.A028] # YI SYLLABLE BOP
+A029 ; [.2380.0020.0002.A029] # YI SYLLABLE BEX
+A02A ; [.2381.0020.0002.A02A] # YI SYLLABLE BE
+A02B ; [.2382.0020.0002.A02B] # YI SYLLABLE BEP
+A02C ; [.2383.0020.0002.A02C] # YI SYLLABLE BUT
+A02D ; [.2384.0020.0002.A02D] # YI SYLLABLE BUX
+A02E ; [.2385.0020.0002.A02E] # YI SYLLABLE BU
+A02F ; [.2386.0020.0002.A02F] # YI SYLLABLE BUP
+A030 ; [.2387.0020.0002.A030] # YI SYLLABLE BURX
+A031 ; [.2388.0020.0002.A031] # YI SYLLABLE BUR
+A032 ; [.2389.0020.0002.A032] # YI SYLLABLE BYT
+A033 ; [.238A.0020.0002.A033] # YI SYLLABLE BYX
+A034 ; [.238B.0020.0002.A034] # YI SYLLABLE BY
+A035 ; [.238C.0020.0002.A035] # YI SYLLABLE BYP
+A036 ; [.238D.0020.0002.A036] # YI SYLLABLE BYRX
+A037 ; [.238E.0020.0002.A037] # YI SYLLABLE BYR
+A038 ; [.238F.0020.0002.A038] # YI SYLLABLE PIT
+A039 ; [.2390.0020.0002.A039] # YI SYLLABLE PIX
+A03A ; [.2391.0020.0002.A03A] # YI SYLLABLE PI
+A03B ; [.2392.0020.0002.A03B] # YI SYLLABLE PIP
+A03C ; [.2393.0020.0002.A03C] # YI SYLLABLE PIEX
+A03D ; [.2394.0020.0002.A03D] # YI SYLLABLE PIE
+A03E ; [.2395.0020.0002.A03E] # YI SYLLABLE PIEP
+A03F ; [.2396.0020.0002.A03F] # YI SYLLABLE PAT
+A040 ; [.2397.0020.0002.A040] # YI SYLLABLE PAX
+A041 ; [.2398.0020.0002.A041] # YI SYLLABLE PA
+A042 ; [.2399.0020.0002.A042] # YI SYLLABLE PAP
+A043 ; [.239A.0020.0002.A043] # YI SYLLABLE PUOX
+A044 ; [.239B.0020.0002.A044] # YI SYLLABLE PUO
+A045 ; [.239C.0020.0002.A045] # YI SYLLABLE PUOP
+A046 ; [.239D.0020.0002.A046] # YI SYLLABLE POT
+A047 ; [.239E.0020.0002.A047] # YI SYLLABLE POX
+A048 ; [.239F.0020.0002.A048] # YI SYLLABLE PO
+A049 ; [.23A0.0020.0002.A049] # YI SYLLABLE POP
+A04A ; [.23A1.0020.0002.A04A] # YI SYLLABLE PUT
+A04B ; [.23A2.0020.0002.A04B] # YI SYLLABLE PUX
+A04C ; [.23A3.0020.0002.A04C] # YI SYLLABLE PU
+A04D ; [.23A4.0020.0002.A04D] # YI SYLLABLE PUP
+A04E ; [.23A5.0020.0002.A04E] # YI SYLLABLE PURX
+A04F ; [.23A6.0020.0002.A04F] # YI SYLLABLE PUR
+A050 ; [.23A7.0020.0002.A050] # YI SYLLABLE PYT
+A051 ; [.23A8.0020.0002.A051] # YI SYLLABLE PYX
+A052 ; [.23A9.0020.0002.A052] # YI SYLLABLE PY
+A053 ; [.23AA.0020.0002.A053] # YI SYLLABLE PYP
+A054 ; [.23AB.0020.0002.A054] # YI SYLLABLE PYRX
+A055 ; [.23AC.0020.0002.A055] # YI SYLLABLE PYR
+A056 ; [.23AD.0020.0002.A056] # YI SYLLABLE BBIT
+A057 ; [.23AE.0020.0002.A057] # YI SYLLABLE BBIX
+A058 ; [.23AF.0020.0002.A058] # YI SYLLABLE BBI
+A059 ; [.23B0.0020.0002.A059] # YI SYLLABLE BBIP
+A05A ; [.23B1.0020.0002.A05A] # YI SYLLABLE BBIET
+A05B ; [.23B2.0020.0002.A05B] # YI SYLLABLE BBIEX
+A05C ; [.23B3.0020.0002.A05C] # YI SYLLABLE BBIE
+A05D ; [.23B4.0020.0002.A05D] # YI SYLLABLE BBIEP
+A05E ; [.23B5.0020.0002.A05E] # YI SYLLABLE BBAT
+A05F ; [.23B6.0020.0002.A05F] # YI SYLLABLE BBAX
+A060 ; [.23B7.0020.0002.A060] # YI SYLLABLE BBA
+A061 ; [.23B8.0020.0002.A061] # YI SYLLABLE BBAP
+A062 ; [.23B9.0020.0002.A062] # YI SYLLABLE BBUOX
+A063 ; [.23BA.0020.0002.A063] # YI SYLLABLE BBUO
+A064 ; [.23BB.0020.0002.A064] # YI SYLLABLE BBUOP
+A065 ; [.23BC.0020.0002.A065] # YI SYLLABLE BBOT
+A066 ; [.23BD.0020.0002.A066] # YI SYLLABLE BBOX
+A067 ; [.23BE.0020.0002.A067] # YI SYLLABLE BBO
+A068 ; [.23BF.0020.0002.A068] # YI SYLLABLE BBOP
+A069 ; [.23C0.0020.0002.A069] # YI SYLLABLE BBEX
+A06A ; [.23C1.0020.0002.A06A] # YI SYLLABLE BBE
+A06B ; [.23C2.0020.0002.A06B] # YI SYLLABLE BBEP
+A06C ; [.23C3.0020.0002.A06C] # YI SYLLABLE BBUT
+A06D ; [.23C4.0020.0002.A06D] # YI SYLLABLE BBUX
+A06E ; [.23C5.0020.0002.A06E] # YI SYLLABLE BBU
+A06F ; [.23C6.0020.0002.A06F] # YI SYLLABLE BBUP
+A070 ; [.23C7.0020.0002.A070] # YI SYLLABLE BBURX
+A071 ; [.23C8.0020.0002.A071] # YI SYLLABLE BBUR
+A072 ; [.23C9.0020.0002.A072] # YI SYLLABLE BBYT
+A073 ; [.23CA.0020.0002.A073] # YI SYLLABLE BBYX
+A074 ; [.23CB.0020.0002.A074] # YI SYLLABLE BBY
+A075 ; [.23CC.0020.0002.A075] # YI SYLLABLE BBYP
+A076 ; [.23CD.0020.0002.A076] # YI SYLLABLE NBIT
+A077 ; [.23CE.0020.0002.A077] # YI SYLLABLE NBIX
+A078 ; [.23CF.0020.0002.A078] # YI SYLLABLE NBI
+A079 ; [.23D0.0020.0002.A079] # YI SYLLABLE NBIP
+A07A ; [.23D1.0020.0002.A07A] # YI SYLLABLE NBIEX
+A07B ; [.23D2.0020.0002.A07B] # YI SYLLABLE NBIE
+A07C ; [.23D3.0020.0002.A07C] # YI SYLLABLE NBIEP
+A07D ; [.23D4.0020.0002.A07D] # YI SYLLABLE NBAT
+A07E ; [.23D5.0020.0002.A07E] # YI SYLLABLE NBAX
+A07F ; [.23D6.0020.0002.A07F] # YI SYLLABLE NBA
+A080 ; [.23D7.0020.0002.A080] # YI SYLLABLE NBAP
+A081 ; [.23D8.0020.0002.A081] # YI SYLLABLE NBOT
+A082 ; [.23D9.0020.0002.A082] # YI SYLLABLE NBOX
+A083 ; [.23DA.0020.0002.A083] # YI SYLLABLE NBO
+A084 ; [.23DB.0020.0002.A084] # YI SYLLABLE NBOP
+A085 ; [.23DC.0020.0002.A085] # YI SYLLABLE NBUT
+A086 ; [.23DD.0020.0002.A086] # YI SYLLABLE NBUX
+A087 ; [.23DE.0020.0002.A087] # YI SYLLABLE NBU
+A088 ; [.23DF.0020.0002.A088] # YI SYLLABLE NBUP
+A089 ; [.23E0.0020.0002.A089] # YI SYLLABLE NBURX
+A08A ; [.23E1.0020.0002.A08A] # YI SYLLABLE NBUR
+A08B ; [.23E2.0020.0002.A08B] # YI SYLLABLE NBYT
+A08C ; [.23E3.0020.0002.A08C] # YI SYLLABLE NBYX
+A08D ; [.23E4.0020.0002.A08D] # YI SYLLABLE NBY
+A08E ; [.23E5.0020.0002.A08E] # YI SYLLABLE NBYP
+A08F ; [.23E6.0020.0002.A08F] # YI SYLLABLE NBYRX
+A090 ; [.23E7.0020.0002.A090] # YI SYLLABLE NBYR
+A091 ; [.23E8.0020.0002.A091] # YI SYLLABLE HMIT
+A092 ; [.23E9.0020.0002.A092] # YI SYLLABLE HMIX
+A093 ; [.23EA.0020.0002.A093] # YI SYLLABLE HMI
+A094 ; [.23EB.0020.0002.A094] # YI SYLLABLE HMIP
+A095 ; [.23EC.0020.0002.A095] # YI SYLLABLE HMIEX
+A096 ; [.23ED.0020.0002.A096] # YI SYLLABLE HMIE
+A097 ; [.23EE.0020.0002.A097] # YI SYLLABLE HMIEP
+A098 ; [.23EF.0020.0002.A098] # YI SYLLABLE HMAT
+A099 ; [.23F0.0020.0002.A099] # YI SYLLABLE HMAX
+A09A ; [.23F1.0020.0002.A09A] # YI SYLLABLE HMA
+A09B ; [.23F2.0020.0002.A09B] # YI SYLLABLE HMAP
+A09C ; [.23F3.0020.0002.A09C] # YI SYLLABLE HMUOX
+A09D ; [.23F4.0020.0002.A09D] # YI SYLLABLE HMUO
+A09E ; [.23F5.0020.0002.A09E] # YI SYLLABLE HMUOP
+A09F ; [.23F6.0020.0002.A09F] # YI SYLLABLE HMOT
+A0A0 ; [.23F7.0020.0002.A0A0] # YI SYLLABLE HMOX
+A0A1 ; [.23F8.0020.0002.A0A1] # YI SYLLABLE HMO
+A0A2 ; [.23F9.0020.0002.A0A2] # YI SYLLABLE HMOP
+A0A3 ; [.23FA.0020.0002.A0A3] # YI SYLLABLE HMUT
+A0A4 ; [.23FB.0020.0002.A0A4] # YI SYLLABLE HMUX
+A0A5 ; [.23FC.0020.0002.A0A5] # YI SYLLABLE HMU
+A0A6 ; [.23FD.0020.0002.A0A6] # YI SYLLABLE HMUP
+A0A7 ; [.23FE.0020.0002.A0A7] # YI SYLLABLE HMURX
+A0A8 ; [.23FF.0020.0002.A0A8] # YI SYLLABLE HMUR
+A0A9 ; [.2400.0020.0002.A0A9] # YI SYLLABLE HMYX
+A0AA ; [.2401.0020.0002.A0AA] # YI SYLLABLE HMY
+A0AB ; [.2402.0020.0002.A0AB] # YI SYLLABLE HMYP
+A0AC ; [.2403.0020.0002.A0AC] # YI SYLLABLE HMYRX
+A0AD ; [.2404.0020.0002.A0AD] # YI SYLLABLE HMYR
+A0AE ; [.2405.0020.0002.A0AE] # YI SYLLABLE MIT
+A0AF ; [.2406.0020.0002.A0AF] # YI SYLLABLE MIX
+A0B0 ; [.2407.0020.0002.A0B0] # YI SYLLABLE MI
+A0B1 ; [.2408.0020.0002.A0B1] # YI SYLLABLE MIP
+A0B2 ; [.2409.0020.0002.A0B2] # YI SYLLABLE MIEX
+A0B3 ; [.240A.0020.0002.A0B3] # YI SYLLABLE MIE
+A0B4 ; [.240B.0020.0002.A0B4] # YI SYLLABLE MIEP
+A0B5 ; [.240C.0020.0002.A0B5] # YI SYLLABLE MAT
+A0B6 ; [.240D.0020.0002.A0B6] # YI SYLLABLE MAX
+A0B7 ; [.240E.0020.0002.A0B7] # YI SYLLABLE MA
+A0B8 ; [.240F.0020.0002.A0B8] # YI SYLLABLE MAP
+A0B9 ; [.2410.0020.0002.A0B9] # YI SYLLABLE MUOT
+A0BA ; [.2411.0020.0002.A0BA] # YI SYLLABLE MUOX
+A0BB ; [.2412.0020.0002.A0BB] # YI SYLLABLE MUO
+A0BC ; [.2413.0020.0002.A0BC] # YI SYLLABLE MUOP
+A0BD ; [.2414.0020.0002.A0BD] # YI SYLLABLE MOT
+A0BE ; [.2415.0020.0002.A0BE] # YI SYLLABLE MOX
+A0BF ; [.2416.0020.0002.A0BF] # YI SYLLABLE MO
+A0C0 ; [.2417.0020.0002.A0C0] # YI SYLLABLE MOP
+A0C1 ; [.2418.0020.0002.A0C1] # YI SYLLABLE MEX
+A0C2 ; [.2419.0020.0002.A0C2] # YI SYLLABLE ME
+A0C3 ; [.241A.0020.0002.A0C3] # YI SYLLABLE MUT
+A0C4 ; [.241B.0020.0002.A0C4] # YI SYLLABLE MUX
+A0C5 ; [.241C.0020.0002.A0C5] # YI SYLLABLE MU
+A0C6 ; [.241D.0020.0002.A0C6] # YI SYLLABLE MUP
+A0C7 ; [.241E.0020.0002.A0C7] # YI SYLLABLE MURX
+A0C8 ; [.241F.0020.0002.A0C8] # YI SYLLABLE MUR
+A0C9 ; [.2420.0020.0002.A0C9] # YI SYLLABLE MYT
+A0CA ; [.2421.0020.0002.A0CA] # YI SYLLABLE MYX
+A0CB ; [.2422.0020.0002.A0CB] # YI SYLLABLE MY
+A0CC ; [.2423.0020.0002.A0CC] # YI SYLLABLE MYP
+A0CD ; [.2424.0020.0002.A0CD] # YI SYLLABLE FIT
+A0CE ; [.2425.0020.0002.A0CE] # YI SYLLABLE FIX
+A0CF ; [.2426.0020.0002.A0CF] # YI SYLLABLE FI
+A0D0 ; [.2427.0020.0002.A0D0] # YI SYLLABLE FIP
+A0D1 ; [.2428.0020.0002.A0D1] # YI SYLLABLE FAT
+A0D2 ; [.2429.0020.0002.A0D2] # YI SYLLABLE FAX
+A0D3 ; [.242A.0020.0002.A0D3] # YI SYLLABLE FA
+A0D4 ; [.242B.0020.0002.A0D4] # YI SYLLABLE FAP
+A0D5 ; [.242C.0020.0002.A0D5] # YI SYLLABLE FOX
+A0D6 ; [.242D.0020.0002.A0D6] # YI SYLLABLE FO
+A0D7 ; [.242E.0020.0002.A0D7] # YI SYLLABLE FOP
+A0D8 ; [.242F.0020.0002.A0D8] # YI SYLLABLE FUT
+A0D9 ; [.2430.0020.0002.A0D9] # YI SYLLABLE FUX
+A0DA ; [.2431.0020.0002.A0DA] # YI SYLLABLE FU
+A0DB ; [.2432.0020.0002.A0DB] # YI SYLLABLE FUP
+A0DC ; [.2433.0020.0002.A0DC] # YI SYLLABLE FURX
+A0DD ; [.2434.0020.0002.A0DD] # YI SYLLABLE FUR
+A0DE ; [.2435.0020.0002.A0DE] # YI SYLLABLE FYT
+A0DF ; [.2436.0020.0002.A0DF] # YI SYLLABLE FYX
+A0E0 ; [.2437.0020.0002.A0E0] # YI SYLLABLE FY
+A0E1 ; [.2438.0020.0002.A0E1] # YI SYLLABLE FYP
+A0E2 ; [.2439.0020.0002.A0E2] # YI SYLLABLE VIT
+A0E3 ; [.243A.0020.0002.A0E3] # YI SYLLABLE VIX
+A0E4 ; [.243B.0020.0002.A0E4] # YI SYLLABLE VI
+A0E5 ; [.243C.0020.0002.A0E5] # YI SYLLABLE VIP
+A0E6 ; [.243D.0020.0002.A0E6] # YI SYLLABLE VIET
+A0E7 ; [.243E.0020.0002.A0E7] # YI SYLLABLE VIEX
+A0E8 ; [.243F.0020.0002.A0E8] # YI SYLLABLE VIE
+A0E9 ; [.2440.0020.0002.A0E9] # YI SYLLABLE VIEP
+A0EA ; [.2441.0020.0002.A0EA] # YI SYLLABLE VAT
+A0EB ; [.2442.0020.0002.A0EB] # YI SYLLABLE VAX
+A0EC ; [.2443.0020.0002.A0EC] # YI SYLLABLE VA
+A0ED ; [.2444.0020.0002.A0ED] # YI SYLLABLE VAP
+A0EE ; [.2445.0020.0002.A0EE] # YI SYLLABLE VOT
+A0EF ; [.2446.0020.0002.A0EF] # YI SYLLABLE VOX
+A0F0 ; [.2447.0020.0002.A0F0] # YI SYLLABLE VO
+A0F1 ; [.2448.0020.0002.A0F1] # YI SYLLABLE VOP
+A0F2 ; [.2449.0020.0002.A0F2] # YI SYLLABLE VEX
+A0F3 ; [.244A.0020.0002.A0F3] # YI SYLLABLE VEP
+A0F4 ; [.244B.0020.0002.A0F4] # YI SYLLABLE VUT
+A0F5 ; [.244C.0020.0002.A0F5] # YI SYLLABLE VUX
+A0F6 ; [.244D.0020.0002.A0F6] # YI SYLLABLE VU
+A0F7 ; [.244E.0020.0002.A0F7] # YI SYLLABLE VUP
+A0F8 ; [.244F.0020.0002.A0F8] # YI SYLLABLE VURX
+A0F9 ; [.2450.0020.0002.A0F9] # YI SYLLABLE VUR
+A0FA ; [.2451.0020.0002.A0FA] # YI SYLLABLE VYT
+A0FB ; [.2452.0020.0002.A0FB] # YI SYLLABLE VYX
+A0FC ; [.2453.0020.0002.A0FC] # YI SYLLABLE VY
+A0FD ; [.2454.0020.0002.A0FD] # YI SYLLABLE VYP
+A0FE ; [.2455.0020.0002.A0FE] # YI SYLLABLE VYRX
+A0FF ; [.2456.0020.0002.A0FF] # YI SYLLABLE VYR
+A100 ; [.2457.0020.0002.A100] # YI SYLLABLE DIT
+A101 ; [.2458.0020.0002.A101] # YI SYLLABLE DIX
+A102 ; [.2459.0020.0002.A102] # YI SYLLABLE DI
+A103 ; [.245A.0020.0002.A103] # YI SYLLABLE DIP
+A104 ; [.245B.0020.0002.A104] # YI SYLLABLE DIEX
+A105 ; [.245C.0020.0002.A105] # YI SYLLABLE DIE
+A106 ; [.245D.0020.0002.A106] # YI SYLLABLE DIEP
+A107 ; [.245E.0020.0002.A107] # YI SYLLABLE DAT
+A108 ; [.245F.0020.0002.A108] # YI SYLLABLE DAX
+A109 ; [.2460.0020.0002.A109] # YI SYLLABLE DA
+A10A ; [.2461.0020.0002.A10A] # YI SYLLABLE DAP
+A10B ; [.2462.0020.0002.A10B] # YI SYLLABLE DUOX
+A10C ; [.2463.0020.0002.A10C] # YI SYLLABLE DUO
+A10D ; [.2464.0020.0002.A10D] # YI SYLLABLE DOT
+A10E ; [.2465.0020.0002.A10E] # YI SYLLABLE DOX
+A10F ; [.2466.0020.0002.A10F] # YI SYLLABLE DO
+A110 ; [.2467.0020.0002.A110] # YI SYLLABLE DOP
+A111 ; [.2468.0020.0002.A111] # YI SYLLABLE DEX
+A112 ; [.2469.0020.0002.A112] # YI SYLLABLE DE
+A113 ; [.246A.0020.0002.A113] # YI SYLLABLE DEP
+A114 ; [.246B.0020.0002.A114] # YI SYLLABLE DUT
+A115 ; [.246C.0020.0002.A115] # YI SYLLABLE DUX
+A116 ; [.246D.0020.0002.A116] # YI SYLLABLE DU
+A117 ; [.246E.0020.0002.A117] # YI SYLLABLE DUP
+A118 ; [.246F.0020.0002.A118] # YI SYLLABLE DURX
+A119 ; [.2470.0020.0002.A119] # YI SYLLABLE DUR
+A11A ; [.2471.0020.0002.A11A] # YI SYLLABLE TIT
+A11B ; [.2472.0020.0002.A11B] # YI SYLLABLE TIX
+A11C ; [.2473.0020.0002.A11C] # YI SYLLABLE TI
+A11D ; [.2474.0020.0002.A11D] # YI SYLLABLE TIP
+A11E ; [.2475.0020.0002.A11E] # YI SYLLABLE TIEX
+A11F ; [.2476.0020.0002.A11F] # YI SYLLABLE TIE
+A120 ; [.2477.0020.0002.A120] # YI SYLLABLE TIEP
+A121 ; [.2478.0020.0002.A121] # YI SYLLABLE TAT
+A122 ; [.2479.0020.0002.A122] # YI SYLLABLE TAX
+A123 ; [.247A.0020.0002.A123] # YI SYLLABLE TA
+A124 ; [.247B.0020.0002.A124] # YI SYLLABLE TAP
+A125 ; [.247C.0020.0002.A125] # YI SYLLABLE TUOT
+A126 ; [.247D.0020.0002.A126] # YI SYLLABLE TUOX
+A127 ; [.247E.0020.0002.A127] # YI SYLLABLE TUO
+A128 ; [.247F.0020.0002.A128] # YI SYLLABLE TUOP
+A129 ; [.2480.0020.0002.A129] # YI SYLLABLE TOT
+A12A ; [.2481.0020.0002.A12A] # YI SYLLABLE TOX
+A12B ; [.2482.0020.0002.A12B] # YI SYLLABLE TO
+A12C ; [.2483.0020.0002.A12C] # YI SYLLABLE TOP
+A12D ; [.2484.0020.0002.A12D] # YI SYLLABLE TEX
+A12E ; [.2485.0020.0002.A12E] # YI SYLLABLE TE
+A12F ; [.2486.0020.0002.A12F] # YI SYLLABLE TEP
+A130 ; [.2487.0020.0002.A130] # YI SYLLABLE TUT
+A131 ; [.2488.0020.0002.A131] # YI SYLLABLE TUX
+A132 ; [.2489.0020.0002.A132] # YI SYLLABLE TU
+A133 ; [.248A.0020.0002.A133] # YI SYLLABLE TUP
+A134 ; [.248B.0020.0002.A134] # YI SYLLABLE TURX
+A135 ; [.248C.0020.0002.A135] # YI SYLLABLE TUR
+A136 ; [.248D.0020.0002.A136] # YI SYLLABLE DDIT
+A137 ; [.248E.0020.0002.A137] # YI SYLLABLE DDIX
+A138 ; [.248F.0020.0002.A138] # YI SYLLABLE DDI
+A139 ; [.2490.0020.0002.A139] # YI SYLLABLE DDIP
+A13A ; [.2491.0020.0002.A13A] # YI SYLLABLE DDIEX
+A13B ; [.2492.0020.0002.A13B] # YI SYLLABLE DDIE
+A13C ; [.2493.0020.0002.A13C] # YI SYLLABLE DDIEP
+A13D ; [.2494.0020.0002.A13D] # YI SYLLABLE DDAT
+A13E ; [.2495.0020.0002.A13E] # YI SYLLABLE DDAX
+A13F ; [.2496.0020.0002.A13F] # YI SYLLABLE DDA
+A140 ; [.2497.0020.0002.A140] # YI SYLLABLE DDAP
+A141 ; [.2498.0020.0002.A141] # YI SYLLABLE DDUOX
+A142 ; [.2499.0020.0002.A142] # YI SYLLABLE DDUO
+A143 ; [.249A.0020.0002.A143] # YI SYLLABLE DDUOP
+A144 ; [.249B.0020.0002.A144] # YI SYLLABLE DDOT
+A145 ; [.249C.0020.0002.A145] # YI SYLLABLE DDOX
+A146 ; [.249D.0020.0002.A146] # YI SYLLABLE DDO
+A147 ; [.249E.0020.0002.A147] # YI SYLLABLE DDOP
+A148 ; [.249F.0020.0002.A148] # YI SYLLABLE DDEX
+A149 ; [.24A0.0020.0002.A149] # YI SYLLABLE DDE
+A14A ; [.24A1.0020.0002.A14A] # YI SYLLABLE DDEP
+A14B ; [.24A2.0020.0002.A14B] # YI SYLLABLE DDUT
+A14C ; [.24A3.0020.0002.A14C] # YI SYLLABLE DDUX
+A14D ; [.24A4.0020.0002.A14D] # YI SYLLABLE DDU
+A14E ; [.24A5.0020.0002.A14E] # YI SYLLABLE DDUP
+A14F ; [.24A6.0020.0002.A14F] # YI SYLLABLE DDURX
+A150 ; [.24A7.0020.0002.A150] # YI SYLLABLE DDUR
+A151 ; [.24A8.0020.0002.A151] # YI SYLLABLE NDIT
+A152 ; [.24A9.0020.0002.A152] # YI SYLLABLE NDIX
+A153 ; [.24AA.0020.0002.A153] # YI SYLLABLE NDI
+A154 ; [.24AB.0020.0002.A154] # YI SYLLABLE NDIP
+A155 ; [.24AC.0020.0002.A155] # YI SYLLABLE NDIEX
+A156 ; [.24AD.0020.0002.A156] # YI SYLLABLE NDIE
+A157 ; [.24AE.0020.0002.A157] # YI SYLLABLE NDAT
+A158 ; [.24AF.0020.0002.A158] # YI SYLLABLE NDAX
+A159 ; [.24B0.0020.0002.A159] # YI SYLLABLE NDA
+A15A ; [.24B1.0020.0002.A15A] # YI SYLLABLE NDAP
+A15B ; [.24B2.0020.0002.A15B] # YI SYLLABLE NDOT
+A15C ; [.24B3.0020.0002.A15C] # YI SYLLABLE NDOX
+A15D ; [.24B4.0020.0002.A15D] # YI SYLLABLE NDO
+A15E ; [.24B5.0020.0002.A15E] # YI SYLLABLE NDOP
+A15F ; [.24B6.0020.0002.A15F] # YI SYLLABLE NDEX
+A160 ; [.24B7.0020.0002.A160] # YI SYLLABLE NDE
+A161 ; [.24B8.0020.0002.A161] # YI SYLLABLE NDEP
+A162 ; [.24B9.0020.0002.A162] # YI SYLLABLE NDUT
+A163 ; [.24BA.0020.0002.A163] # YI SYLLABLE NDUX
+A164 ; [.24BB.0020.0002.A164] # YI SYLLABLE NDU
+A165 ; [.24BC.0020.0002.A165] # YI SYLLABLE NDUP
+A166 ; [.24BD.0020.0002.A166] # YI SYLLABLE NDURX
+A167 ; [.24BE.0020.0002.A167] # YI SYLLABLE NDUR
+A168 ; [.24BF.0020.0002.A168] # YI SYLLABLE HNIT
+A169 ; [.24C0.0020.0002.A169] # YI SYLLABLE HNIX
+A16A ; [.24C1.0020.0002.A16A] # YI SYLLABLE HNI
+A16B ; [.24C2.0020.0002.A16B] # YI SYLLABLE HNIP
+A16C ; [.24C3.0020.0002.A16C] # YI SYLLABLE HNIET
+A16D ; [.24C4.0020.0002.A16D] # YI SYLLABLE HNIEX
+A16E ; [.24C5.0020.0002.A16E] # YI SYLLABLE HNIE
+A16F ; [.24C6.0020.0002.A16F] # YI SYLLABLE HNIEP
+A170 ; [.24C7.0020.0002.A170] # YI SYLLABLE HNAT
+A171 ; [.24C8.0020.0002.A171] # YI SYLLABLE HNAX
+A172 ; [.24C9.0020.0002.A172] # YI SYLLABLE HNA
+A173 ; [.24CA.0020.0002.A173] # YI SYLLABLE HNAP
+A174 ; [.24CB.0020.0002.A174] # YI SYLLABLE HNUOX
+A175 ; [.24CC.0020.0002.A175] # YI SYLLABLE HNUO
+A176 ; [.24CD.0020.0002.A176] # YI SYLLABLE HNOT
+A177 ; [.24CE.0020.0002.A177] # YI SYLLABLE HNOX
+A178 ; [.24CF.0020.0002.A178] # YI SYLLABLE HNOP
+A179 ; [.24D0.0020.0002.A179] # YI SYLLABLE HNEX
+A17A ; [.24D1.0020.0002.A17A] # YI SYLLABLE HNE
+A17B ; [.24D2.0020.0002.A17B] # YI SYLLABLE HNEP
+A17C ; [.24D3.0020.0002.A17C] # YI SYLLABLE HNUT
+A17D ; [.24D4.0020.0002.A17D] # YI SYLLABLE NIT
+A17E ; [.24D5.0020.0002.A17E] # YI SYLLABLE NIX
+A17F ; [.24D6.0020.0002.A17F] # YI SYLLABLE NI
+A180 ; [.24D7.0020.0002.A180] # YI SYLLABLE NIP
+A181 ; [.24D8.0020.0002.A181] # YI SYLLABLE NIEX
+A182 ; [.24D9.0020.0002.A182] # YI SYLLABLE NIE
+A183 ; [.24DA.0020.0002.A183] # YI SYLLABLE NIEP
+A184 ; [.24DB.0020.0002.A184] # YI SYLLABLE NAX
+A185 ; [.24DC.0020.0002.A185] # YI SYLLABLE NA
+A186 ; [.24DD.0020.0002.A186] # YI SYLLABLE NAP
+A187 ; [.24DE.0020.0002.A187] # YI SYLLABLE NUOX
+A188 ; [.24DF.0020.0002.A188] # YI SYLLABLE NUO
+A189 ; [.24E0.0020.0002.A189] # YI SYLLABLE NUOP
+A18A ; [.24E1.0020.0002.A18A] # YI SYLLABLE NOT
+A18B ; [.24E2.0020.0002.A18B] # YI SYLLABLE NOX
+A18C ; [.24E3.0020.0002.A18C] # YI SYLLABLE NO
+A18D ; [.24E4.0020.0002.A18D] # YI SYLLABLE NOP
+A18E ; [.24E5.0020.0002.A18E] # YI SYLLABLE NEX
+A18F ; [.24E6.0020.0002.A18F] # YI SYLLABLE NE
+A190 ; [.24E7.0020.0002.A190] # YI SYLLABLE NEP
+A191 ; [.24E8.0020.0002.A191] # YI SYLLABLE NUT
+A192 ; [.24E9.0020.0002.A192] # YI SYLLABLE NUX
+A193 ; [.24EA.0020.0002.A193] # YI SYLLABLE NU
+A194 ; [.24EB.0020.0002.A194] # YI SYLLABLE NUP
+A195 ; [.24EC.0020.0002.A195] # YI SYLLABLE NURX
+A196 ; [.24ED.0020.0002.A196] # YI SYLLABLE NUR
+A197 ; [.24EE.0020.0002.A197] # YI SYLLABLE HLIT
+A198 ; [.24EF.0020.0002.A198] # YI SYLLABLE HLIX
+A199 ; [.24F0.0020.0002.A199] # YI SYLLABLE HLI
+A19A ; [.24F1.0020.0002.A19A] # YI SYLLABLE HLIP
+A19B ; [.24F2.0020.0002.A19B] # YI SYLLABLE HLIEX
+A19C ; [.24F3.0020.0002.A19C] # YI SYLLABLE HLIE
+A19D ; [.24F4.0020.0002.A19D] # YI SYLLABLE HLIEP
+A19E ; [.24F5.0020.0002.A19E] # YI SYLLABLE HLAT
+A19F ; [.24F6.0020.0002.A19F] # YI SYLLABLE HLAX
+A1A0 ; [.24F7.0020.0002.A1A0] # YI SYLLABLE HLA
+A1A1 ; [.24F8.0020.0002.A1A1] # YI SYLLABLE HLAP
+A1A2 ; [.24F9.0020.0002.A1A2] # YI SYLLABLE HLUOX
+A1A3 ; [.24FA.0020.0002.A1A3] # YI SYLLABLE HLUO
+A1A4 ; [.24FB.0020.0002.A1A4] # YI SYLLABLE HLUOP
+A1A5 ; [.24FC.0020.0002.A1A5] # YI SYLLABLE HLOX
+A1A6 ; [.24FD.0020.0002.A1A6] # YI SYLLABLE HLO
+A1A7 ; [.24FE.0020.0002.A1A7] # YI SYLLABLE HLOP
+A1A8 ; [.24FF.0020.0002.A1A8] # YI SYLLABLE HLEX
+A1A9 ; [.2500.0020.0002.A1A9] # YI SYLLABLE HLE
+A1AA ; [.2501.0020.0002.A1AA] # YI SYLLABLE HLEP
+A1AB ; [.2502.0020.0002.A1AB] # YI SYLLABLE HLUT
+A1AC ; [.2503.0020.0002.A1AC] # YI SYLLABLE HLUX
+A1AD ; [.2504.0020.0002.A1AD] # YI SYLLABLE HLU
+A1AE ; [.2505.0020.0002.A1AE] # YI SYLLABLE HLUP
+A1AF ; [.2506.0020.0002.A1AF] # YI SYLLABLE HLURX
+A1B0 ; [.2507.0020.0002.A1B0] # YI SYLLABLE HLUR
+A1B1 ; [.2508.0020.0002.A1B1] # YI SYLLABLE HLYT
+A1B2 ; [.2509.0020.0002.A1B2] # YI SYLLABLE HLYX
+A1B3 ; [.250A.0020.0002.A1B3] # YI SYLLABLE HLY
+A1B4 ; [.250B.0020.0002.A1B4] # YI SYLLABLE HLYP
+A1B5 ; [.250C.0020.0002.A1B5] # YI SYLLABLE HLYRX
+A1B6 ; [.250D.0020.0002.A1B6] # YI SYLLABLE HLYR
+A1B7 ; [.250E.0020.0002.A1B7] # YI SYLLABLE LIT
+A1B8 ; [.250F.0020.0002.A1B8] # YI SYLLABLE LIX
+A1B9 ; [.2510.0020.0002.A1B9] # YI SYLLABLE LI
+A1BA ; [.2511.0020.0002.A1BA] # YI SYLLABLE LIP
+A1BB ; [.2512.0020.0002.A1BB] # YI SYLLABLE LIET
+A1BC ; [.2513.0020.0002.A1BC] # YI SYLLABLE LIEX
+A1BD ; [.2514.0020.0002.A1BD] # YI SYLLABLE LIE
+A1BE ; [.2515.0020.0002.A1BE] # YI SYLLABLE LIEP
+A1BF ; [.2516.0020.0002.A1BF] # YI SYLLABLE LAT
+A1C0 ; [.2517.0020.0002.A1C0] # YI SYLLABLE LAX
+A1C1 ; [.2518.0020.0002.A1C1] # YI SYLLABLE LA
+A1C2 ; [.2519.0020.0002.A1C2] # YI SYLLABLE LAP
+A1C3 ; [.251A.0020.0002.A1C3] # YI SYLLABLE LUOT
+A1C4 ; [.251B.0020.0002.A1C4] # YI SYLLABLE LUOX
+A1C5 ; [.251C.0020.0002.A1C5] # YI SYLLABLE LUO
+A1C6 ; [.251D.0020.0002.A1C6] # YI SYLLABLE LUOP
+A1C7 ; [.251E.0020.0002.A1C7] # YI SYLLABLE LOT
+A1C8 ; [.251F.0020.0002.A1C8] # YI SYLLABLE LOX
+A1C9 ; [.2520.0020.0002.A1C9] # YI SYLLABLE LO
+A1CA ; [.2521.0020.0002.A1CA] # YI SYLLABLE LOP
+A1CB ; [.2522.0020.0002.A1CB] # YI SYLLABLE LEX
+A1CC ; [.2523.0020.0002.A1CC] # YI SYLLABLE LE
+A1CD ; [.2524.0020.0002.A1CD] # YI SYLLABLE LEP
+A1CE ; [.2525.0020.0002.A1CE] # YI SYLLABLE LUT
+A1CF ; [.2526.0020.0002.A1CF] # YI SYLLABLE LUX
+A1D0 ; [.2527.0020.0002.A1D0] # YI SYLLABLE LU
+A1D1 ; [.2528.0020.0002.A1D1] # YI SYLLABLE LUP
+A1D2 ; [.2529.0020.0002.A1D2] # YI SYLLABLE LURX
+A1D3 ; [.252A.0020.0002.A1D3] # YI SYLLABLE LUR
+A1D4 ; [.252B.0020.0002.A1D4] # YI SYLLABLE LYT
+A1D5 ; [.252C.0020.0002.A1D5] # YI SYLLABLE LYX
+A1D6 ; [.252D.0020.0002.A1D6] # YI SYLLABLE LY
+A1D7 ; [.252E.0020.0002.A1D7] # YI SYLLABLE LYP
+A1D8 ; [.252F.0020.0002.A1D8] # YI SYLLABLE LYRX
+A1D9 ; [.2530.0020.0002.A1D9] # YI SYLLABLE LYR
+A1DA ; [.2531.0020.0002.A1DA] # YI SYLLABLE GIT
+A1DB ; [.2532.0020.0002.A1DB] # YI SYLLABLE GIX
+A1DC ; [.2533.0020.0002.A1DC] # YI SYLLABLE GI
+A1DD ; [.2534.0020.0002.A1DD] # YI SYLLABLE GIP
+A1DE ; [.2535.0020.0002.A1DE] # YI SYLLABLE GIET
+A1DF ; [.2536.0020.0002.A1DF] # YI SYLLABLE GIEX
+A1E0 ; [.2537.0020.0002.A1E0] # YI SYLLABLE GIE
+A1E1 ; [.2538.0020.0002.A1E1] # YI SYLLABLE GIEP
+A1E2 ; [.2539.0020.0002.A1E2] # YI SYLLABLE GAT
+A1E3 ; [.253A.0020.0002.A1E3] # YI SYLLABLE GAX
+A1E4 ; [.253B.0020.0002.A1E4] # YI SYLLABLE GA
+A1E5 ; [.253C.0020.0002.A1E5] # YI SYLLABLE GAP
+A1E6 ; [.253D.0020.0002.A1E6] # YI SYLLABLE GUOT
+A1E7 ; [.253E.0020.0002.A1E7] # YI SYLLABLE GUOX
+A1E8 ; [.253F.0020.0002.A1E8] # YI SYLLABLE GUO
+A1E9 ; [.2540.0020.0002.A1E9] # YI SYLLABLE GUOP
+A1EA ; [.2541.0020.0002.A1EA] # YI SYLLABLE GOT
+A1EB ; [.2542.0020.0002.A1EB] # YI SYLLABLE GOX
+A1EC ; [.2543.0020.0002.A1EC] # YI SYLLABLE GO
+A1ED ; [.2544.0020.0002.A1ED] # YI SYLLABLE GOP
+A1EE ; [.2545.0020.0002.A1EE] # YI SYLLABLE GET
+A1EF ; [.2546.0020.0002.A1EF] # YI SYLLABLE GEX
+A1F0 ; [.2547.0020.0002.A1F0] # YI SYLLABLE GE
+A1F1 ; [.2548.0020.0002.A1F1] # YI SYLLABLE GEP
+A1F2 ; [.2549.0020.0002.A1F2] # YI SYLLABLE GUT
+A1F3 ; [.254A.0020.0002.A1F3] # YI SYLLABLE GUX
+A1F4 ; [.254B.0020.0002.A1F4] # YI SYLLABLE GU
+A1F5 ; [.254C.0020.0002.A1F5] # YI SYLLABLE GUP
+A1F6 ; [.254D.0020.0002.A1F6] # YI SYLLABLE GURX
+A1F7 ; [.254E.0020.0002.A1F7] # YI SYLLABLE GUR
+A1F8 ; [.254F.0020.0002.A1F8] # YI SYLLABLE KIT
+A1F9 ; [.2550.0020.0002.A1F9] # YI SYLLABLE KIX
+A1FA ; [.2551.0020.0002.A1FA] # YI SYLLABLE KI
+A1FB ; [.2552.0020.0002.A1FB] # YI SYLLABLE KIP
+A1FC ; [.2553.0020.0002.A1FC] # YI SYLLABLE KIEX
+A1FD ; [.2554.0020.0002.A1FD] # YI SYLLABLE KIE
+A1FE ; [.2555.0020.0002.A1FE] # YI SYLLABLE KIEP
+A1FF ; [.2556.0020.0002.A1FF] # YI SYLLABLE KAT
+A200 ; [.2557.0020.0002.A200] # YI SYLLABLE KAX
+A201 ; [.2558.0020.0002.A201] # YI SYLLABLE KA
+A202 ; [.2559.0020.0002.A202] # YI SYLLABLE KAP
+A203 ; [.255A.0020.0002.A203] # YI SYLLABLE KUOX
+A204 ; [.255B.0020.0002.A204] # YI SYLLABLE KUO
+A205 ; [.255C.0020.0002.A205] # YI SYLLABLE KUOP
+A206 ; [.255D.0020.0002.A206] # YI SYLLABLE KOT
+A207 ; [.255E.0020.0002.A207] # YI SYLLABLE KOX
+A208 ; [.255F.0020.0002.A208] # YI SYLLABLE KO
+A209 ; [.2560.0020.0002.A209] # YI SYLLABLE KOP
+A20A ; [.2561.0020.0002.A20A] # YI SYLLABLE KET
+A20B ; [.2562.0020.0002.A20B] # YI SYLLABLE KEX
+A20C ; [.2563.0020.0002.A20C] # YI SYLLABLE KE
+A20D ; [.2564.0020.0002.A20D] # YI SYLLABLE KEP
+A20E ; [.2565.0020.0002.A20E] # YI SYLLABLE KUT
+A20F ; [.2566.0020.0002.A20F] # YI SYLLABLE KUX
+A210 ; [.2567.0020.0002.A210] # YI SYLLABLE KU
+A211 ; [.2568.0020.0002.A211] # YI SYLLABLE KUP
+A212 ; [.2569.0020.0002.A212] # YI SYLLABLE KURX
+A213 ; [.256A.0020.0002.A213] # YI SYLLABLE KUR
+A214 ; [.256B.0020.0002.A214] # YI SYLLABLE GGIT
+A215 ; [.256C.0020.0002.A215] # YI SYLLABLE GGIX
+A216 ; [.256D.0020.0002.A216] # YI SYLLABLE GGI
+A217 ; [.256E.0020.0002.A217] # YI SYLLABLE GGIEX
+A218 ; [.256F.0020.0002.A218] # YI SYLLABLE GGIE
+A219 ; [.2570.0020.0002.A219] # YI SYLLABLE GGIEP
+A21A ; [.2571.0020.0002.A21A] # YI SYLLABLE GGAT
+A21B ; [.2572.0020.0002.A21B] # YI SYLLABLE GGAX
+A21C ; [.2573.0020.0002.A21C] # YI SYLLABLE GGA
+A21D ; [.2574.0020.0002.A21D] # YI SYLLABLE GGAP
+A21E ; [.2575.0020.0002.A21E] # YI SYLLABLE GGUOT
+A21F ; [.2576.0020.0002.A21F] # YI SYLLABLE GGUOX
+A220 ; [.2577.0020.0002.A220] # YI SYLLABLE GGUO
+A221 ; [.2578.0020.0002.A221] # YI SYLLABLE GGUOP
+A222 ; [.2579.0020.0002.A222] # YI SYLLABLE GGOT
+A223 ; [.257A.0020.0002.A223] # YI SYLLABLE GGOX
+A224 ; [.257B.0020.0002.A224] # YI SYLLABLE GGO
+A225 ; [.257C.0020.0002.A225] # YI SYLLABLE GGOP
+A226 ; [.257D.0020.0002.A226] # YI SYLLABLE GGET
+A227 ; [.257E.0020.0002.A227] # YI SYLLABLE GGEX
+A228 ; [.257F.0020.0002.A228] # YI SYLLABLE GGE
+A229 ; [.2580.0020.0002.A229] # YI SYLLABLE GGEP
+A22A ; [.2581.0020.0002.A22A] # YI SYLLABLE GGUT
+A22B ; [.2582.0020.0002.A22B] # YI SYLLABLE GGUX
+A22C ; [.2583.0020.0002.A22C] # YI SYLLABLE GGU
+A22D ; [.2584.0020.0002.A22D] # YI SYLLABLE GGUP
+A22E ; [.2585.0020.0002.A22E] # YI SYLLABLE GGURX
+A22F ; [.2586.0020.0002.A22F] # YI SYLLABLE GGUR
+A230 ; [.2587.0020.0002.A230] # YI SYLLABLE MGIEX
+A231 ; [.2588.0020.0002.A231] # YI SYLLABLE MGIE
+A232 ; [.2589.0020.0002.A232] # YI SYLLABLE MGAT
+A233 ; [.258A.0020.0002.A233] # YI SYLLABLE MGAX
+A234 ; [.258B.0020.0002.A234] # YI SYLLABLE MGA
+A235 ; [.258C.0020.0002.A235] # YI SYLLABLE MGAP
+A236 ; [.258D.0020.0002.A236] # YI SYLLABLE MGUOX
+A237 ; [.258E.0020.0002.A237] # YI SYLLABLE MGUO
+A238 ; [.258F.0020.0002.A238] # YI SYLLABLE MGUOP
+A239 ; [.2590.0020.0002.A239] # YI SYLLABLE MGOT
+A23A ; [.2591.0020.0002.A23A] # YI SYLLABLE MGOX
+A23B ; [.2592.0020.0002.A23B] # YI SYLLABLE MGO
+A23C ; [.2593.0020.0002.A23C] # YI SYLLABLE MGOP
+A23D ; [.2594.0020.0002.A23D] # YI SYLLABLE MGEX
+A23E ; [.2595.0020.0002.A23E] # YI SYLLABLE MGE
+A23F ; [.2596.0020.0002.A23F] # YI SYLLABLE MGEP
+A240 ; [.2597.0020.0002.A240] # YI SYLLABLE MGUT
+A241 ; [.2598.0020.0002.A241] # YI SYLLABLE MGUX
+A242 ; [.2599.0020.0002.A242] # YI SYLLABLE MGU
+A243 ; [.259A.0020.0002.A243] # YI SYLLABLE MGUP
+A244 ; [.259B.0020.0002.A244] # YI SYLLABLE MGURX
+A245 ; [.259C.0020.0002.A245] # YI SYLLABLE MGUR
+A246 ; [.259D.0020.0002.A246] # YI SYLLABLE HXIT
+A247 ; [.259E.0020.0002.A247] # YI SYLLABLE HXIX
+A248 ; [.259F.0020.0002.A248] # YI SYLLABLE HXI
+A249 ; [.25A0.0020.0002.A249] # YI SYLLABLE HXIP
+A24A ; [.25A1.0020.0002.A24A] # YI SYLLABLE HXIET
+A24B ; [.25A2.0020.0002.A24B] # YI SYLLABLE HXIEX
+A24C ; [.25A3.0020.0002.A24C] # YI SYLLABLE HXIE
+A24D ; [.25A4.0020.0002.A24D] # YI SYLLABLE HXIEP
+A24E ; [.25A5.0020.0002.A24E] # YI SYLLABLE HXAT
+A24F ; [.25A6.0020.0002.A24F] # YI SYLLABLE HXAX
+A250 ; [.25A7.0020.0002.A250] # YI SYLLABLE HXA
+A251 ; [.25A8.0020.0002.A251] # YI SYLLABLE HXAP
+A252 ; [.25A9.0020.0002.A252] # YI SYLLABLE HXUOT
+A253 ; [.25AA.0020.0002.A253] # YI SYLLABLE HXUOX
+A254 ; [.25AB.0020.0002.A254] # YI SYLLABLE HXUO
+A255 ; [.25AC.0020.0002.A255] # YI SYLLABLE HXUOP
+A256 ; [.25AD.0020.0002.A256] # YI SYLLABLE HXOT
+A257 ; [.25AE.0020.0002.A257] # YI SYLLABLE HXOX
+A258 ; [.25AF.0020.0002.A258] # YI SYLLABLE HXO
+A259 ; [.25B0.0020.0002.A259] # YI SYLLABLE HXOP
+A25A ; [.25B1.0020.0002.A25A] # YI SYLLABLE HXEX
+A25B ; [.25B2.0020.0002.A25B] # YI SYLLABLE HXE
+A25C ; [.25B3.0020.0002.A25C] # YI SYLLABLE HXEP
+A25D ; [.25B4.0020.0002.A25D] # YI SYLLABLE NGIEX
+A25E ; [.25B5.0020.0002.A25E] # YI SYLLABLE NGIE
+A25F ; [.25B6.0020.0002.A25F] # YI SYLLABLE NGIEP
+A260 ; [.25B7.0020.0002.A260] # YI SYLLABLE NGAT
+A261 ; [.25B8.0020.0002.A261] # YI SYLLABLE NGAX
+A262 ; [.25B9.0020.0002.A262] # YI SYLLABLE NGA
+A263 ; [.25BA.0020.0002.A263] # YI SYLLABLE NGAP
+A264 ; [.25BB.0020.0002.A264] # YI SYLLABLE NGUOT
+A265 ; [.25BC.0020.0002.A265] # YI SYLLABLE NGUOX
+A266 ; [.25BD.0020.0002.A266] # YI SYLLABLE NGUO
+A267 ; [.25BE.0020.0002.A267] # YI SYLLABLE NGOT
+A268 ; [.25BF.0020.0002.A268] # YI SYLLABLE NGOX
+A269 ; [.25C0.0020.0002.A269] # YI SYLLABLE NGO
+A26A ; [.25C1.0020.0002.A26A] # YI SYLLABLE NGOP
+A26B ; [.25C2.0020.0002.A26B] # YI SYLLABLE NGEX
+A26C ; [.25C3.0020.0002.A26C] # YI SYLLABLE NGE
+A26D ; [.25C4.0020.0002.A26D] # YI SYLLABLE NGEP
+A26E ; [.25C5.0020.0002.A26E] # YI SYLLABLE HIT
+A26F ; [.25C6.0020.0002.A26F] # YI SYLLABLE HIEX
+A270 ; [.25C7.0020.0002.A270] # YI SYLLABLE HIE
+A271 ; [.25C8.0020.0002.A271] # YI SYLLABLE HAT
+A272 ; [.25C9.0020.0002.A272] # YI SYLLABLE HAX
+A273 ; [.25CA.0020.0002.A273] # YI SYLLABLE HA
+A274 ; [.25CB.0020.0002.A274] # YI SYLLABLE HAP
+A275 ; [.25CC.0020.0002.A275] # YI SYLLABLE HUOT
+A276 ; [.25CD.0020.0002.A276] # YI SYLLABLE HUOX
+A277 ; [.25CE.0020.0002.A277] # YI SYLLABLE HUO
+A278 ; [.25CF.0020.0002.A278] # YI SYLLABLE HUOP
+A279 ; [.25D0.0020.0002.A279] # YI SYLLABLE HOT
+A27A ; [.25D1.0020.0002.A27A] # YI SYLLABLE HOX
+A27B ; [.25D2.0020.0002.A27B] # YI SYLLABLE HO
+A27C ; [.25D3.0020.0002.A27C] # YI SYLLABLE HOP
+A27D ; [.25D4.0020.0002.A27D] # YI SYLLABLE HEX
+A27E ; [.25D5.0020.0002.A27E] # YI SYLLABLE HE
+A27F ; [.25D6.0020.0002.A27F] # YI SYLLABLE HEP
+A280 ; [.25D7.0020.0002.A280] # YI SYLLABLE WAT
+A281 ; [.25D8.0020.0002.A281] # YI SYLLABLE WAX
+A282 ; [.25D9.0020.0002.A282] # YI SYLLABLE WA
+A283 ; [.25DA.0020.0002.A283] # YI SYLLABLE WAP
+A284 ; [.25DB.0020.0002.A284] # YI SYLLABLE WUOX
+A285 ; [.25DC.0020.0002.A285] # YI SYLLABLE WUO
+A286 ; [.25DD.0020.0002.A286] # YI SYLLABLE WUOP
+A287 ; [.25DE.0020.0002.A287] # YI SYLLABLE WOX
+A288 ; [.25DF.0020.0002.A288] # YI SYLLABLE WO
+A289 ; [.25E0.0020.0002.A289] # YI SYLLABLE WOP
+A28A ; [.25E1.0020.0002.A28A] # YI SYLLABLE WEX
+A28B ; [.25E2.0020.0002.A28B] # YI SYLLABLE WE
+A28C ; [.25E3.0020.0002.A28C] # YI SYLLABLE WEP
+A28D ; [.25E4.0020.0002.A28D] # YI SYLLABLE ZIT
+A28E ; [.25E5.0020.0002.A28E] # YI SYLLABLE ZIX
+A28F ; [.25E6.0020.0002.A28F] # YI SYLLABLE ZI
+A290 ; [.25E7.0020.0002.A290] # YI SYLLABLE ZIP
+A291 ; [.25E8.0020.0002.A291] # YI SYLLABLE ZIEX
+A292 ; [.25E9.0020.0002.A292] # YI SYLLABLE ZIE
+A293 ; [.25EA.0020.0002.A293] # YI SYLLABLE ZIEP
+A294 ; [.25EB.0020.0002.A294] # YI SYLLABLE ZAT
+A295 ; [.25EC.0020.0002.A295] # YI SYLLABLE ZAX
+A296 ; [.25ED.0020.0002.A296] # YI SYLLABLE ZA
+A297 ; [.25EE.0020.0002.A297] # YI SYLLABLE ZAP
+A298 ; [.25EF.0020.0002.A298] # YI SYLLABLE ZUOX
+A299 ; [.25F0.0020.0002.A299] # YI SYLLABLE ZUO
+A29A ; [.25F1.0020.0002.A29A] # YI SYLLABLE ZUOP
+A29B ; [.25F2.0020.0002.A29B] # YI SYLLABLE ZOT
+A29C ; [.25F3.0020.0002.A29C] # YI SYLLABLE ZOX
+A29D ; [.25F4.0020.0002.A29D] # YI SYLLABLE ZO
+A29E ; [.25F5.0020.0002.A29E] # YI SYLLABLE ZOP
+A29F ; [.25F6.0020.0002.A29F] # YI SYLLABLE ZEX
+A2A0 ; [.25F7.0020.0002.A2A0] # YI SYLLABLE ZE
+A2A1 ; [.25F8.0020.0002.A2A1] # YI SYLLABLE ZEP
+A2A2 ; [.25F9.0020.0002.A2A2] # YI SYLLABLE ZUT
+A2A3 ; [.25FA.0020.0002.A2A3] # YI SYLLABLE ZUX
+A2A4 ; [.25FB.0020.0002.A2A4] # YI SYLLABLE ZU
+A2A5 ; [.25FC.0020.0002.A2A5] # YI SYLLABLE ZUP
+A2A6 ; [.25FD.0020.0002.A2A6] # YI SYLLABLE ZURX
+A2A7 ; [.25FE.0020.0002.A2A7] # YI SYLLABLE ZUR
+A2A8 ; [.25FF.0020.0002.A2A8] # YI SYLLABLE ZYT
+A2A9 ; [.2600.0020.0002.A2A9] # YI SYLLABLE ZYX
+A2AA ; [.2601.0020.0002.A2AA] # YI SYLLABLE ZY
+A2AB ; [.2602.0020.0002.A2AB] # YI SYLLABLE ZYP
+A2AC ; [.2603.0020.0002.A2AC] # YI SYLLABLE ZYRX
+A2AD ; [.2604.0020.0002.A2AD] # YI SYLLABLE ZYR
+A2AE ; [.2605.0020.0002.A2AE] # YI SYLLABLE CIT
+A2AF ; [.2606.0020.0002.A2AF] # YI SYLLABLE CIX
+A2B0 ; [.2607.0020.0002.A2B0] # YI SYLLABLE CI
+A2B1 ; [.2608.0020.0002.A2B1] # YI SYLLABLE CIP
+A2B2 ; [.2609.0020.0002.A2B2] # YI SYLLABLE CIET
+A2B3 ; [.260A.0020.0002.A2B3] # YI SYLLABLE CIEX
+A2B4 ; [.260B.0020.0002.A2B4] # YI SYLLABLE CIE
+A2B5 ; [.260C.0020.0002.A2B5] # YI SYLLABLE CIEP
+A2B6 ; [.260D.0020.0002.A2B6] # YI SYLLABLE CAT
+A2B7 ; [.260E.0020.0002.A2B7] # YI SYLLABLE CAX
+A2B8 ; [.260F.0020.0002.A2B8] # YI SYLLABLE CA
+A2B9 ; [.2610.0020.0002.A2B9] # YI SYLLABLE CAP
+A2BA ; [.2611.0020.0002.A2BA] # YI SYLLABLE CUOX
+A2BB ; [.2612.0020.0002.A2BB] # YI SYLLABLE CUO
+A2BC ; [.2613.0020.0002.A2BC] # YI SYLLABLE CUOP
+A2BD ; [.2614.0020.0002.A2BD] # YI SYLLABLE COT
+A2BE ; [.2615.0020.0002.A2BE] # YI SYLLABLE COX
+A2BF ; [.2616.0020.0002.A2BF] # YI SYLLABLE CO
+A2C0 ; [.2617.0020.0002.A2C0] # YI SYLLABLE COP
+A2C1 ; [.2618.0020.0002.A2C1] # YI SYLLABLE CEX
+A2C2 ; [.2619.0020.0002.A2C2] # YI SYLLABLE CE
+A2C3 ; [.261A.0020.0002.A2C3] # YI SYLLABLE CEP
+A2C4 ; [.261B.0020.0002.A2C4] # YI SYLLABLE CUT
+A2C5 ; [.261C.0020.0002.A2C5] # YI SYLLABLE CUX
+A2C6 ; [.261D.0020.0002.A2C6] # YI SYLLABLE CU
+A2C7 ; [.261E.0020.0002.A2C7] # YI SYLLABLE CUP
+A2C8 ; [.261F.0020.0002.A2C8] # YI SYLLABLE CURX
+A2C9 ; [.2620.0020.0002.A2C9] # YI SYLLABLE CUR
+A2CA ; [.2621.0020.0002.A2CA] # YI SYLLABLE CYT
+A2CB ; [.2622.0020.0002.A2CB] # YI SYLLABLE CYX
+A2CC ; [.2623.0020.0002.A2CC] # YI SYLLABLE CY
+A2CD ; [.2624.0020.0002.A2CD] # YI SYLLABLE CYP
+A2CE ; [.2625.0020.0002.A2CE] # YI SYLLABLE CYRX
+A2CF ; [.2626.0020.0002.A2CF] # YI SYLLABLE CYR
+A2D0 ; [.2627.0020.0002.A2D0] # YI SYLLABLE ZZIT
+A2D1 ; [.2628.0020.0002.A2D1] # YI SYLLABLE ZZIX
+A2D2 ; [.2629.0020.0002.A2D2] # YI SYLLABLE ZZI
+A2D3 ; [.262A.0020.0002.A2D3] # YI SYLLABLE ZZIP
+A2D4 ; [.262B.0020.0002.A2D4] # YI SYLLABLE ZZIET
+A2D5 ; [.262C.0020.0002.A2D5] # YI SYLLABLE ZZIEX
+A2D6 ; [.262D.0020.0002.A2D6] # YI SYLLABLE ZZIE
+A2D7 ; [.262E.0020.0002.A2D7] # YI SYLLABLE ZZIEP
+A2D8 ; [.262F.0020.0002.A2D8] # YI SYLLABLE ZZAT
+A2D9 ; [.2630.0020.0002.A2D9] # YI SYLLABLE ZZAX
+A2DA ; [.2631.0020.0002.A2DA] # YI SYLLABLE ZZA
+A2DB ; [.2632.0020.0002.A2DB] # YI SYLLABLE ZZAP
+A2DC ; [.2633.0020.0002.A2DC] # YI SYLLABLE ZZOX
+A2DD ; [.2634.0020.0002.A2DD] # YI SYLLABLE ZZO
+A2DE ; [.2635.0020.0002.A2DE] # YI SYLLABLE ZZOP
+A2DF ; [.2636.0020.0002.A2DF] # YI SYLLABLE ZZEX
+A2E0 ; [.2637.0020.0002.A2E0] # YI SYLLABLE ZZE
+A2E1 ; [.2638.0020.0002.A2E1] # YI SYLLABLE ZZEP
+A2E2 ; [.2639.0020.0002.A2E2] # YI SYLLABLE ZZUX
+A2E3 ; [.263A.0020.0002.A2E3] # YI SYLLABLE ZZU
+A2E4 ; [.263B.0020.0002.A2E4] # YI SYLLABLE ZZUP
+A2E5 ; [.263C.0020.0002.A2E5] # YI SYLLABLE ZZURX
+A2E6 ; [.263D.0020.0002.A2E6] # YI SYLLABLE ZZUR
+A2E7 ; [.263E.0020.0002.A2E7] # YI SYLLABLE ZZYT
+A2E8 ; [.263F.0020.0002.A2E8] # YI SYLLABLE ZZYX
+A2E9 ; [.2640.0020.0002.A2E9] # YI SYLLABLE ZZY
+A2EA ; [.2641.0020.0002.A2EA] # YI SYLLABLE ZZYP
+A2EB ; [.2642.0020.0002.A2EB] # YI SYLLABLE ZZYRX
+A2EC ; [.2643.0020.0002.A2EC] # YI SYLLABLE ZZYR
+A2ED ; [.2644.0020.0002.A2ED] # YI SYLLABLE NZIT
+A2EE ; [.2645.0020.0002.A2EE] # YI SYLLABLE NZIX
+A2EF ; [.2646.0020.0002.A2EF] # YI SYLLABLE NZI
+A2F0 ; [.2647.0020.0002.A2F0] # YI SYLLABLE NZIP
+A2F1 ; [.2648.0020.0002.A2F1] # YI SYLLABLE NZIEX
+A2F2 ; [.2649.0020.0002.A2F2] # YI SYLLABLE NZIE
+A2F3 ; [.264A.0020.0002.A2F3] # YI SYLLABLE NZIEP
+A2F4 ; [.264B.0020.0002.A2F4] # YI SYLLABLE NZAT
+A2F5 ; [.264C.0020.0002.A2F5] # YI SYLLABLE NZAX
+A2F6 ; [.264D.0020.0002.A2F6] # YI SYLLABLE NZA
+A2F7 ; [.264E.0020.0002.A2F7] # YI SYLLABLE NZAP
+A2F8 ; [.264F.0020.0002.A2F8] # YI SYLLABLE NZUOX
+A2F9 ; [.2650.0020.0002.A2F9] # YI SYLLABLE NZUO
+A2FA ; [.2651.0020.0002.A2FA] # YI SYLLABLE NZOX
+A2FB ; [.2652.0020.0002.A2FB] # YI SYLLABLE NZOP
+A2FC ; [.2653.0020.0002.A2FC] # YI SYLLABLE NZEX
+A2FD ; [.2654.0020.0002.A2FD] # YI SYLLABLE NZE
+A2FE ; [.2655.0020.0002.A2FE] # YI SYLLABLE NZUX
+A2FF ; [.2656.0020.0002.A2FF] # YI SYLLABLE NZU
+A300 ; [.2657.0020.0002.A300] # YI SYLLABLE NZUP
+A301 ; [.2658.0020.0002.A301] # YI SYLLABLE NZURX
+A302 ; [.2659.0020.0002.A302] # YI SYLLABLE NZUR
+A303 ; [.265A.0020.0002.A303] # YI SYLLABLE NZYT
+A304 ; [.265B.0020.0002.A304] # YI SYLLABLE NZYX
+A305 ; [.265C.0020.0002.A305] # YI SYLLABLE NZY
+A306 ; [.265D.0020.0002.A306] # YI SYLLABLE NZYP
+A307 ; [.265E.0020.0002.A307] # YI SYLLABLE NZYRX
+A308 ; [.265F.0020.0002.A308] # YI SYLLABLE NZYR
+A309 ; [.2660.0020.0002.A309] # YI SYLLABLE SIT
+A30A ; [.2661.0020.0002.A30A] # YI SYLLABLE SIX
+A30B ; [.2662.0020.0002.A30B] # YI SYLLABLE SI
+A30C ; [.2663.0020.0002.A30C] # YI SYLLABLE SIP
+A30D ; [.2664.0020.0002.A30D] # YI SYLLABLE SIEX
+A30E ; [.2665.0020.0002.A30E] # YI SYLLABLE SIE
+A30F ; [.2666.0020.0002.A30F] # YI SYLLABLE SIEP
+A310 ; [.2667.0020.0002.A310] # YI SYLLABLE SAT
+A311 ; [.2668.0020.0002.A311] # YI SYLLABLE SAX
+A312 ; [.2669.0020.0002.A312] # YI SYLLABLE SA
+A313 ; [.266A.0020.0002.A313] # YI SYLLABLE SAP
+A314 ; [.266B.0020.0002.A314] # YI SYLLABLE SUOX
+A315 ; [.266C.0020.0002.A315] # YI SYLLABLE SUO
+A316 ; [.266D.0020.0002.A316] # YI SYLLABLE SUOP
+A317 ; [.266E.0020.0002.A317] # YI SYLLABLE SOT
+A318 ; [.266F.0020.0002.A318] # YI SYLLABLE SOX
+A319 ; [.2670.0020.0002.A319] # YI SYLLABLE SO
+A31A ; [.2671.0020.0002.A31A] # YI SYLLABLE SOP
+A31B ; [.2672.0020.0002.A31B] # YI SYLLABLE SEX
+A31C ; [.2673.0020.0002.A31C] # YI SYLLABLE SE
+A31D ; [.2674.0020.0002.A31D] # YI SYLLABLE SEP
+A31E ; [.2675.0020.0002.A31E] # YI SYLLABLE SUT
+A31F ; [.2676.0020.0002.A31F] # YI SYLLABLE SUX
+A320 ; [.2677.0020.0002.A320] # YI SYLLABLE SU
+A321 ; [.2678.0020.0002.A321] # YI SYLLABLE SUP
+A322 ; [.2679.0020.0002.A322] # YI SYLLABLE SURX
+A323 ; [.267A.0020.0002.A323] # YI SYLLABLE SUR
+A324 ; [.267B.0020.0002.A324] # YI SYLLABLE SYT
+A325 ; [.267C.0020.0002.A325] # YI SYLLABLE SYX
+A326 ; [.267D.0020.0002.A326] # YI SYLLABLE SY
+A327 ; [.267E.0020.0002.A327] # YI SYLLABLE SYP
+A328 ; [.267F.0020.0002.A328] # YI SYLLABLE SYRX
+A329 ; [.2680.0020.0002.A329] # YI SYLLABLE SYR
+A32A ; [.2681.0020.0002.A32A] # YI SYLLABLE SSIT
+A32B ; [.2682.0020.0002.A32B] # YI SYLLABLE SSIX
+A32C ; [.2683.0020.0002.A32C] # YI SYLLABLE SSI
+A32D ; [.2684.0020.0002.A32D] # YI SYLLABLE SSIP
+A32E ; [.2685.0020.0002.A32E] # YI SYLLABLE SSIEX
+A32F ; [.2686.0020.0002.A32F] # YI SYLLABLE SSIE
+A330 ; [.2687.0020.0002.A330] # YI SYLLABLE SSIEP
+A331 ; [.2688.0020.0002.A331] # YI SYLLABLE SSAT
+A332 ; [.2689.0020.0002.A332] # YI SYLLABLE SSAX
+A333 ; [.268A.0020.0002.A333] # YI SYLLABLE SSA
+A334 ; [.268B.0020.0002.A334] # YI SYLLABLE SSAP
+A335 ; [.268C.0020.0002.A335] # YI SYLLABLE SSOT
+A336 ; [.268D.0020.0002.A336] # YI SYLLABLE SSOX
+A337 ; [.268E.0020.0002.A337] # YI SYLLABLE SSO
+A338 ; [.268F.0020.0002.A338] # YI SYLLABLE SSOP
+A339 ; [.2690.0020.0002.A339] # YI SYLLABLE SSEX
+A33A ; [.2691.0020.0002.A33A] # YI SYLLABLE SSE
+A33B ; [.2692.0020.0002.A33B] # YI SYLLABLE SSEP
+A33C ; [.2693.0020.0002.A33C] # YI SYLLABLE SSUT
+A33D ; [.2694.0020.0002.A33D] # YI SYLLABLE SSUX
+A33E ; [.2695.0020.0002.A33E] # YI SYLLABLE SSU
+A33F ; [.2696.0020.0002.A33F] # YI SYLLABLE SSUP
+A340 ; [.2697.0020.0002.A340] # YI SYLLABLE SSYT
+A341 ; [.2698.0020.0002.A341] # YI SYLLABLE SSYX
+A342 ; [.2699.0020.0002.A342] # YI SYLLABLE SSY
+A343 ; [.269A.0020.0002.A343] # YI SYLLABLE SSYP
+A344 ; [.269B.0020.0002.A344] # YI SYLLABLE SSYRX
+A345 ; [.269C.0020.0002.A345] # YI SYLLABLE SSYR
+A346 ; [.269D.0020.0002.A346] # YI SYLLABLE ZHAT
+A347 ; [.269E.0020.0002.A347] # YI SYLLABLE ZHAX
+A348 ; [.269F.0020.0002.A348] # YI SYLLABLE ZHA
+A349 ; [.26A0.0020.0002.A349] # YI SYLLABLE ZHAP
+A34A ; [.26A1.0020.0002.A34A] # YI SYLLABLE ZHUOX
+A34B ; [.26A2.0020.0002.A34B] # YI SYLLABLE ZHUO
+A34C ; [.26A3.0020.0002.A34C] # YI SYLLABLE ZHUOP
+A34D ; [.26A4.0020.0002.A34D] # YI SYLLABLE ZHOT
+A34E ; [.26A5.0020.0002.A34E] # YI SYLLABLE ZHOX
+A34F ; [.26A6.0020.0002.A34F] # YI SYLLABLE ZHO
+A350 ; [.26A7.0020.0002.A350] # YI SYLLABLE ZHOP
+A351 ; [.26A8.0020.0002.A351] # YI SYLLABLE ZHET
+A352 ; [.26A9.0020.0002.A352] # YI SYLLABLE ZHEX
+A353 ; [.26AA.0020.0002.A353] # YI SYLLABLE ZHE
+A354 ; [.26AB.0020.0002.A354] # YI SYLLABLE ZHEP
+A355 ; [.26AC.0020.0002.A355] # YI SYLLABLE ZHUT
+A356 ; [.26AD.0020.0002.A356] # YI SYLLABLE ZHUX
+A357 ; [.26AE.0020.0002.A357] # YI SYLLABLE ZHU
+A358 ; [.26AF.0020.0002.A358] # YI SYLLABLE ZHUP
+A359 ; [.26B0.0020.0002.A359] # YI SYLLABLE ZHURX
+A35A ; [.26B1.0020.0002.A35A] # YI SYLLABLE ZHUR
+A35B ; [.26B2.0020.0002.A35B] # YI SYLLABLE ZHYT
+A35C ; [.26B3.0020.0002.A35C] # YI SYLLABLE ZHYX
+A35D ; [.26B4.0020.0002.A35D] # YI SYLLABLE ZHY
+A35E ; [.26B5.0020.0002.A35E] # YI SYLLABLE ZHYP
+A35F ; [.26B6.0020.0002.A35F] # YI SYLLABLE ZHYRX
+A360 ; [.26B7.0020.0002.A360] # YI SYLLABLE ZHYR
+A361 ; [.26B8.0020.0002.A361] # YI SYLLABLE CHAT
+A362 ; [.26B9.0020.0002.A362] # YI SYLLABLE CHAX
+A363 ; [.26BA.0020.0002.A363] # YI SYLLABLE CHA
+A364 ; [.26BB.0020.0002.A364] # YI SYLLABLE CHAP
+A365 ; [.26BC.0020.0002.A365] # YI SYLLABLE CHUOT
+A366 ; [.26BD.0020.0002.A366] # YI SYLLABLE CHUOX
+A367 ; [.26BE.0020.0002.A367] # YI SYLLABLE CHUO
+A368 ; [.26BF.0020.0002.A368] # YI SYLLABLE CHUOP
+A369 ; [.26C0.0020.0002.A369] # YI SYLLABLE CHOT
+A36A ; [.26C1.0020.0002.A36A] # YI SYLLABLE CHOX
+A36B ; [.26C2.0020.0002.A36B] # YI SYLLABLE CHO
+A36C ; [.26C3.0020.0002.A36C] # YI SYLLABLE CHOP
+A36D ; [.26C4.0020.0002.A36D] # YI SYLLABLE CHET
+A36E ; [.26C5.0020.0002.A36E] # YI SYLLABLE CHEX
+A36F ; [.26C6.0020.0002.A36F] # YI SYLLABLE CHE
+A370 ; [.26C7.0020.0002.A370] # YI SYLLABLE CHEP
+A371 ; [.26C8.0020.0002.A371] # YI SYLLABLE CHUX
+A372 ; [.26C9.0020.0002.A372] # YI SYLLABLE CHU
+A373 ; [.26CA.0020.0002.A373] # YI SYLLABLE CHUP
+A374 ; [.26CB.0020.0002.A374] # YI SYLLABLE CHURX
+A375 ; [.26CC.0020.0002.A375] # YI SYLLABLE CHUR
+A376 ; [.26CD.0020.0002.A376] # YI SYLLABLE CHYT
+A377 ; [.26CE.0020.0002.A377] # YI SYLLABLE CHYX
+A378 ; [.26CF.0020.0002.A378] # YI SYLLABLE CHY
+A379 ; [.26D0.0020.0002.A379] # YI SYLLABLE CHYP
+A37A ; [.26D1.0020.0002.A37A] # YI SYLLABLE CHYRX
+A37B ; [.26D2.0020.0002.A37B] # YI SYLLABLE CHYR
+A37C ; [.26D3.0020.0002.A37C] # YI SYLLABLE RRAX
+A37D ; [.26D4.0020.0002.A37D] # YI SYLLABLE RRA
+A37E ; [.26D5.0020.0002.A37E] # YI SYLLABLE RRUOX
+A37F ; [.26D6.0020.0002.A37F] # YI SYLLABLE RRUO
+A380 ; [.26D7.0020.0002.A380] # YI SYLLABLE RROT
+A381 ; [.26D8.0020.0002.A381] # YI SYLLABLE RROX
+A382 ; [.26D9.0020.0002.A382] # YI SYLLABLE RRO
+A383 ; [.26DA.0020.0002.A383] # YI SYLLABLE RROP
+A384 ; [.26DB.0020.0002.A384] # YI SYLLABLE RRET
+A385 ; [.26DC.0020.0002.A385] # YI SYLLABLE RREX
+A386 ; [.26DD.0020.0002.A386] # YI SYLLABLE RRE
+A387 ; [.26DE.0020.0002.A387] # YI SYLLABLE RREP
+A388 ; [.26DF.0020.0002.A388] # YI SYLLABLE RRUT
+A389 ; [.26E0.0020.0002.A389] # YI SYLLABLE RRUX
+A38A ; [.26E1.0020.0002.A38A] # YI SYLLABLE RRU
+A38B ; [.26E2.0020.0002.A38B] # YI SYLLABLE RRUP
+A38C ; [.26E3.0020.0002.A38C] # YI SYLLABLE RRURX
+A38D ; [.26E4.0020.0002.A38D] # YI SYLLABLE RRUR
+A38E ; [.26E5.0020.0002.A38E] # YI SYLLABLE RRYT
+A38F ; [.26E6.0020.0002.A38F] # YI SYLLABLE RRYX
+A390 ; [.26E7.0020.0002.A390] # YI SYLLABLE RRY
+A391 ; [.26E8.0020.0002.A391] # YI SYLLABLE RRYP
+A392 ; [.26E9.0020.0002.A392] # YI SYLLABLE RRYRX
+A393 ; [.26EA.0020.0002.A393] # YI SYLLABLE RRYR
+A394 ; [.26EB.0020.0002.A394] # YI SYLLABLE NRAT
+A395 ; [.26EC.0020.0002.A395] # YI SYLLABLE NRAX
+A396 ; [.26ED.0020.0002.A396] # YI SYLLABLE NRA
+A397 ; [.26EE.0020.0002.A397] # YI SYLLABLE NRAP
+A398 ; [.26EF.0020.0002.A398] # YI SYLLABLE NROX
+A399 ; [.26F0.0020.0002.A399] # YI SYLLABLE NRO
+A39A ; [.26F1.0020.0002.A39A] # YI SYLLABLE NROP
+A39B ; [.26F2.0020.0002.A39B] # YI SYLLABLE NRET
+A39C ; [.26F3.0020.0002.A39C] # YI SYLLABLE NREX
+A39D ; [.26F4.0020.0002.A39D] # YI SYLLABLE NRE
+A39E ; [.26F5.0020.0002.A39E] # YI SYLLABLE NREP
+A39F ; [.26F6.0020.0002.A39F] # YI SYLLABLE NRUT
+A3A0 ; [.26F7.0020.0002.A3A0] # YI SYLLABLE NRUX
+A3A1 ; [.26F8.0020.0002.A3A1] # YI SYLLABLE NRU
+A3A2 ; [.26F9.0020.0002.A3A2] # YI SYLLABLE NRUP
+A3A3 ; [.26FA.0020.0002.A3A3] # YI SYLLABLE NRURX
+A3A4 ; [.26FB.0020.0002.A3A4] # YI SYLLABLE NRUR
+A3A5 ; [.26FC.0020.0002.A3A5] # YI SYLLABLE NRYT
+A3A6 ; [.26FD.0020.0002.A3A6] # YI SYLLABLE NRYX
+A3A7 ; [.26FE.0020.0002.A3A7] # YI SYLLABLE NRY
+A3A8 ; [.26FF.0020.0002.A3A8] # YI SYLLABLE NRYP
+A3A9 ; [.2700.0020.0002.A3A9] # YI SYLLABLE NRYRX
+A3AA ; [.2701.0020.0002.A3AA] # YI SYLLABLE NRYR
+A3AB ; [.2702.0020.0002.A3AB] # YI SYLLABLE SHAT
+A3AC ; [.2703.0020.0002.A3AC] # YI SYLLABLE SHAX
+A3AD ; [.2704.0020.0002.A3AD] # YI SYLLABLE SHA
+A3AE ; [.2705.0020.0002.A3AE] # YI SYLLABLE SHAP
+A3AF ; [.2706.0020.0002.A3AF] # YI SYLLABLE SHUOX
+A3B0 ; [.2707.0020.0002.A3B0] # YI SYLLABLE SHUO
+A3B1 ; [.2708.0020.0002.A3B1] # YI SYLLABLE SHUOP
+A3B2 ; [.2709.0020.0002.A3B2] # YI SYLLABLE SHOT
+A3B3 ; [.270A.0020.0002.A3B3] # YI SYLLABLE SHOX
+A3B4 ; [.270B.0020.0002.A3B4] # YI SYLLABLE SHO
+A3B5 ; [.270C.0020.0002.A3B5] # YI SYLLABLE SHOP
+A3B6 ; [.270D.0020.0002.A3B6] # YI SYLLABLE SHET
+A3B7 ; [.270E.0020.0002.A3B7] # YI SYLLABLE SHEX
+A3B8 ; [.270F.0020.0002.A3B8] # YI SYLLABLE SHE
+A3B9 ; [.2710.0020.0002.A3B9] # YI SYLLABLE SHEP
+A3BA ; [.2711.0020.0002.A3BA] # YI SYLLABLE SHUT
+A3BB ; [.2712.0020.0002.A3BB] # YI SYLLABLE SHUX
+A3BC ; [.2713.0020.0002.A3BC] # YI SYLLABLE SHU
+A3BD ; [.2714.0020.0002.A3BD] # YI SYLLABLE SHUP
+A3BE ; [.2715.0020.0002.A3BE] # YI SYLLABLE SHURX
+A3BF ; [.2716.0020.0002.A3BF] # YI SYLLABLE SHUR
+A3C0 ; [.2717.0020.0002.A3C0] # YI SYLLABLE SHYT
+A3C1 ; [.2718.0020.0002.A3C1] # YI SYLLABLE SHYX
+A3C2 ; [.2719.0020.0002.A3C2] # YI SYLLABLE SHY
+A3C3 ; [.271A.0020.0002.A3C3] # YI SYLLABLE SHYP
+A3C4 ; [.271B.0020.0002.A3C4] # YI SYLLABLE SHYRX
+A3C5 ; [.271C.0020.0002.A3C5] # YI SYLLABLE SHYR
+A3C6 ; [.271D.0020.0002.A3C6] # YI SYLLABLE RAT
+A3C7 ; [.271E.0020.0002.A3C7] # YI SYLLABLE RAX
+A3C8 ; [.271F.0020.0002.A3C8] # YI SYLLABLE RA
+A3C9 ; [.2720.0020.0002.A3C9] # YI SYLLABLE RAP
+A3CA ; [.2721.0020.0002.A3CA] # YI SYLLABLE RUOX
+A3CB ; [.2722.0020.0002.A3CB] # YI SYLLABLE RUO
+A3CC ; [.2723.0020.0002.A3CC] # YI SYLLABLE RUOP
+A3CD ; [.2724.0020.0002.A3CD] # YI SYLLABLE ROT
+A3CE ; [.2725.0020.0002.A3CE] # YI SYLLABLE ROX
+A3CF ; [.2726.0020.0002.A3CF] # YI SYLLABLE RO
+A3D0 ; [.2727.0020.0002.A3D0] # YI SYLLABLE ROP
+A3D1 ; [.2728.0020.0002.A3D1] # YI SYLLABLE REX
+A3D2 ; [.2729.0020.0002.A3D2] # YI SYLLABLE RE
+A3D3 ; [.272A.0020.0002.A3D3] # YI SYLLABLE REP
+A3D4 ; [.272B.0020.0002.A3D4] # YI SYLLABLE RUT
+A3D5 ; [.272C.0020.0002.A3D5] # YI SYLLABLE RUX
+A3D6 ; [.272D.0020.0002.A3D6] # YI SYLLABLE RU
+A3D7 ; [.272E.0020.0002.A3D7] # YI SYLLABLE RUP
+A3D8 ; [.272F.0020.0002.A3D8] # YI SYLLABLE RURX
+A3D9 ; [.2730.0020.0002.A3D9] # YI SYLLABLE RUR
+A3DA ; [.2731.0020.0002.A3DA] # YI SYLLABLE RYT
+A3DB ; [.2732.0020.0002.A3DB] # YI SYLLABLE RYX
+A3DC ; [.2733.0020.0002.A3DC] # YI SYLLABLE RY
+A3DD ; [.2734.0020.0002.A3DD] # YI SYLLABLE RYP
+A3DE ; [.2735.0020.0002.A3DE] # YI SYLLABLE RYRX
+A3DF ; [.2736.0020.0002.A3DF] # YI SYLLABLE RYR
+A3E0 ; [.2737.0020.0002.A3E0] # YI SYLLABLE JIT
+A3E1 ; [.2738.0020.0002.A3E1] # YI SYLLABLE JIX
+A3E2 ; [.2739.0020.0002.A3E2] # YI SYLLABLE JI
+A3E3 ; [.273A.0020.0002.A3E3] # YI SYLLABLE JIP
+A3E4 ; [.273B.0020.0002.A3E4] # YI SYLLABLE JIET
+A3E5 ; [.273C.0020.0002.A3E5] # YI SYLLABLE JIEX
+A3E6 ; [.273D.0020.0002.A3E6] # YI SYLLABLE JIE
+A3E7 ; [.273E.0020.0002.A3E7] # YI SYLLABLE JIEP
+A3E8 ; [.273F.0020.0002.A3E8] # YI SYLLABLE JUOT
+A3E9 ; [.2740.0020.0002.A3E9] # YI SYLLABLE JUOX
+A3EA ; [.2741.0020.0002.A3EA] # YI SYLLABLE JUO
+A3EB ; [.2742.0020.0002.A3EB] # YI SYLLABLE JUOP
+A3EC ; [.2743.0020.0002.A3EC] # YI SYLLABLE JOT
+A3ED ; [.2744.0020.0002.A3ED] # YI SYLLABLE JOX
+A3EE ; [.2745.0020.0002.A3EE] # YI SYLLABLE JO
+A3EF ; [.2746.0020.0002.A3EF] # YI SYLLABLE JOP
+A3F0 ; [.2747.0020.0002.A3F0] # YI SYLLABLE JUT
+A3F1 ; [.2748.0020.0002.A3F1] # YI SYLLABLE JUX
+A3F2 ; [.2749.0020.0002.A3F2] # YI SYLLABLE JU
+A3F3 ; [.274A.0020.0002.A3F3] # YI SYLLABLE JUP
+A3F4 ; [.274B.0020.0002.A3F4] # YI SYLLABLE JURX
+A3F5 ; [.274C.0020.0002.A3F5] # YI SYLLABLE JUR
+A3F6 ; [.274D.0020.0002.A3F6] # YI SYLLABLE JYT
+A3F7 ; [.274E.0020.0002.A3F7] # YI SYLLABLE JYX
+A3F8 ; [.274F.0020.0002.A3F8] # YI SYLLABLE JY
+A3F9 ; [.2750.0020.0002.A3F9] # YI SYLLABLE JYP
+A3FA ; [.2751.0020.0002.A3FA] # YI SYLLABLE JYRX
+A3FB ; [.2752.0020.0002.A3FB] # YI SYLLABLE JYR
+A3FC ; [.2753.0020.0002.A3FC] # YI SYLLABLE QIT
+A3FD ; [.2754.0020.0002.A3FD] # YI SYLLABLE QIX
+A3FE ; [.2755.0020.0002.A3FE] # YI SYLLABLE QI
+A3FF ; [.2756.0020.0002.A3FF] # YI SYLLABLE QIP
+A400 ; [.2757.0020.0002.A400] # YI SYLLABLE QIET
+A401 ; [.2758.0020.0002.A401] # YI SYLLABLE QIEX
+A402 ; [.2759.0020.0002.A402] # YI SYLLABLE QIE
+A403 ; [.275A.0020.0002.A403] # YI SYLLABLE QIEP
+A404 ; [.275B.0020.0002.A404] # YI SYLLABLE QUOT
+A405 ; [.275C.0020.0002.A405] # YI SYLLABLE QUOX
+A406 ; [.275D.0020.0002.A406] # YI SYLLABLE QUO
+A407 ; [.275E.0020.0002.A407] # YI SYLLABLE QUOP
+A408 ; [.275F.0020.0002.A408] # YI SYLLABLE QOT
+A409 ; [.2760.0020.0002.A409] # YI SYLLABLE QOX
+A40A ; [.2761.0020.0002.A40A] # YI SYLLABLE QO
+A40B ; [.2762.0020.0002.A40B] # YI SYLLABLE QOP
+A40C ; [.2763.0020.0002.A40C] # YI SYLLABLE QUT
+A40D ; [.2764.0020.0002.A40D] # YI SYLLABLE QUX
+A40E ; [.2765.0020.0002.A40E] # YI SYLLABLE QU
+A40F ; [.2766.0020.0002.A40F] # YI SYLLABLE QUP
+A410 ; [.2767.0020.0002.A410] # YI SYLLABLE QURX
+A411 ; [.2768.0020.0002.A411] # YI SYLLABLE QUR
+A412 ; [.2769.0020.0002.A412] # YI SYLLABLE QYT
+A413 ; [.276A.0020.0002.A413] # YI SYLLABLE QYX
+A414 ; [.276B.0020.0002.A414] # YI SYLLABLE QY
+A415 ; [.276C.0020.0002.A415] # YI SYLLABLE QYP
+A416 ; [.276D.0020.0002.A416] # YI SYLLABLE QYRX
+A417 ; [.276E.0020.0002.A417] # YI SYLLABLE QYR
+A418 ; [.276F.0020.0002.A418] # YI SYLLABLE JJIT
+A419 ; [.2770.0020.0002.A419] # YI SYLLABLE JJIX
+A41A ; [.2771.0020.0002.A41A] # YI SYLLABLE JJI
+A41B ; [.2772.0020.0002.A41B] # YI SYLLABLE JJIP
+A41C ; [.2773.0020.0002.A41C] # YI SYLLABLE JJIET
+A41D ; [.2774.0020.0002.A41D] # YI SYLLABLE JJIEX
+A41E ; [.2775.0020.0002.A41E] # YI SYLLABLE JJIE
+A41F ; [.2776.0020.0002.A41F] # YI SYLLABLE JJIEP
+A420 ; [.2777.0020.0002.A420] # YI SYLLABLE JJUOX
+A421 ; [.2778.0020.0002.A421] # YI SYLLABLE JJUO
+A422 ; [.2779.0020.0002.A422] # YI SYLLABLE JJUOP
+A423 ; [.277A.0020.0002.A423] # YI SYLLABLE JJOT
+A424 ; [.277B.0020.0002.A424] # YI SYLLABLE JJOX
+A425 ; [.277C.0020.0002.A425] # YI SYLLABLE JJO
+A426 ; [.277D.0020.0002.A426] # YI SYLLABLE JJOP
+A427 ; [.277E.0020.0002.A427] # YI SYLLABLE JJUT
+A428 ; [.277F.0020.0002.A428] # YI SYLLABLE JJUX
+A429 ; [.2780.0020.0002.A429] # YI SYLLABLE JJU
+A42A ; [.2781.0020.0002.A42A] # YI SYLLABLE JJUP
+A42B ; [.2782.0020.0002.A42B] # YI SYLLABLE JJURX
+A42C ; [.2783.0020.0002.A42C] # YI SYLLABLE JJUR
+A42D ; [.2784.0020.0002.A42D] # YI SYLLABLE JJYT
+A42E ; [.2785.0020.0002.A42E] # YI SYLLABLE JJYX
+A42F ; [.2786.0020.0002.A42F] # YI SYLLABLE JJY
+A430 ; [.2787.0020.0002.A430] # YI SYLLABLE JJYP
+A431 ; [.2788.0020.0002.A431] # YI SYLLABLE NJIT
+A432 ; [.2789.0020.0002.A432] # YI SYLLABLE NJIX
+A433 ; [.278A.0020.0002.A433] # YI SYLLABLE NJI
+A434 ; [.278B.0020.0002.A434] # YI SYLLABLE NJIP
+A435 ; [.278C.0020.0002.A435] # YI SYLLABLE NJIET
+A436 ; [.278D.0020.0002.A436] # YI SYLLABLE NJIEX
+A437 ; [.278E.0020.0002.A437] # YI SYLLABLE NJIE
+A438 ; [.278F.0020.0002.A438] # YI SYLLABLE NJIEP
+A439 ; [.2790.0020.0002.A439] # YI SYLLABLE NJUOX
+A43A ; [.2791.0020.0002.A43A] # YI SYLLABLE NJUO
+A43B ; [.2792.0020.0002.A43B] # YI SYLLABLE NJOT
+A43C ; [.2793.0020.0002.A43C] # YI SYLLABLE NJOX
+A43D ; [.2794.0020.0002.A43D] # YI SYLLABLE NJO
+A43E ; [.2795.0020.0002.A43E] # YI SYLLABLE NJOP
+A43F ; [.2796.0020.0002.A43F] # YI SYLLABLE NJUX
+A440 ; [.2797.0020.0002.A440] # YI SYLLABLE NJU
+A441 ; [.2798.0020.0002.A441] # YI SYLLABLE NJUP
+A442 ; [.2799.0020.0002.A442] # YI SYLLABLE NJURX
+A443 ; [.279A.0020.0002.A443] # YI SYLLABLE NJUR
+A444 ; [.279B.0020.0002.A444] # YI SYLLABLE NJYT
+A445 ; [.279C.0020.0002.A445] # YI SYLLABLE NJYX
+A446 ; [.279D.0020.0002.A446] # YI SYLLABLE NJY
+A447 ; [.279E.0020.0002.A447] # YI SYLLABLE NJYP
+A448 ; [.279F.0020.0002.A448] # YI SYLLABLE NJYRX
+A449 ; [.27A0.0020.0002.A449] # YI SYLLABLE NJYR
+A44A ; [.27A1.0020.0002.A44A] # YI SYLLABLE NYIT
+A44B ; [.27A2.0020.0002.A44B] # YI SYLLABLE NYIX
+A44C ; [.27A3.0020.0002.A44C] # YI SYLLABLE NYI
+A44D ; [.27A4.0020.0002.A44D] # YI SYLLABLE NYIP
+A44E ; [.27A5.0020.0002.A44E] # YI SYLLABLE NYIET
+A44F ; [.27A6.0020.0002.A44F] # YI SYLLABLE NYIEX
+A450 ; [.27A7.0020.0002.A450] # YI SYLLABLE NYIE
+A451 ; [.27A8.0020.0002.A451] # YI SYLLABLE NYIEP
+A452 ; [.27A9.0020.0002.A452] # YI SYLLABLE NYUOX
+A453 ; [.27AA.0020.0002.A453] # YI SYLLABLE NYUO
+A454 ; [.27AB.0020.0002.A454] # YI SYLLABLE NYUOP
+A455 ; [.27AC.0020.0002.A455] # YI SYLLABLE NYOT
+A456 ; [.27AD.0020.0002.A456] # YI SYLLABLE NYOX
+A457 ; [.27AE.0020.0002.A457] # YI SYLLABLE NYO
+A458 ; [.27AF.0020.0002.A458] # YI SYLLABLE NYOP
+A459 ; [.27B0.0020.0002.A459] # YI SYLLABLE NYUT
+A45A ; [.27B1.0020.0002.A45A] # YI SYLLABLE NYUX
+A45B ; [.27B2.0020.0002.A45B] # YI SYLLABLE NYU
+A45C ; [.27B3.0020.0002.A45C] # YI SYLLABLE NYUP
+A45D ; [.27B4.0020.0002.A45D] # YI SYLLABLE XIT
+A45E ; [.27B5.0020.0002.A45E] # YI SYLLABLE XIX
+A45F ; [.27B6.0020.0002.A45F] # YI SYLLABLE XI
+A460 ; [.27B7.0020.0002.A460] # YI SYLLABLE XIP
+A461 ; [.27B8.0020.0002.A461] # YI SYLLABLE XIET
+A462 ; [.27B9.0020.0002.A462] # YI SYLLABLE XIEX
+A463 ; [.27BA.0020.0002.A463] # YI SYLLABLE XIE
+A464 ; [.27BB.0020.0002.A464] # YI SYLLABLE XIEP
+A465 ; [.27BC.0020.0002.A465] # YI SYLLABLE XUOX
+A466 ; [.27BD.0020.0002.A466] # YI SYLLABLE XUO
+A467 ; [.27BE.0020.0002.A467] # YI SYLLABLE XOT
+A468 ; [.27BF.0020.0002.A468] # YI SYLLABLE XOX
+A469 ; [.27C0.0020.0002.A469] # YI SYLLABLE XO
+A46A ; [.27C1.0020.0002.A46A] # YI SYLLABLE XOP
+A46B ; [.27C2.0020.0002.A46B] # YI SYLLABLE XYT
+A46C ; [.27C3.0020.0002.A46C] # YI SYLLABLE XYX
+A46D ; [.27C4.0020.0002.A46D] # YI SYLLABLE XY
+A46E ; [.27C5.0020.0002.A46E] # YI SYLLABLE XYP
+A46F ; [.27C6.0020.0002.A46F] # YI SYLLABLE XYRX
+A470 ; [.27C7.0020.0002.A470] # YI SYLLABLE XYR
+A471 ; [.27C8.0020.0002.A471] # YI SYLLABLE YIT
+A472 ; [.27C9.0020.0002.A472] # YI SYLLABLE YIX
+A473 ; [.27CA.0020.0002.A473] # YI SYLLABLE YI
+A474 ; [.27CB.0020.0002.A474] # YI SYLLABLE YIP
+A475 ; [.27CC.0020.0002.A475] # YI SYLLABLE YIET
+A476 ; [.27CD.0020.0002.A476] # YI SYLLABLE YIEX
+A477 ; [.27CE.0020.0002.A477] # YI SYLLABLE YIE
+A478 ; [.27CF.0020.0002.A478] # YI SYLLABLE YIEP
+A479 ; [.27D0.0020.0002.A479] # YI SYLLABLE YUOT
+A47A ; [.27D1.0020.0002.A47A] # YI SYLLABLE YUOX
+A47B ; [.27D2.0020.0002.A47B] # YI SYLLABLE YUO
+A47C ; [.27D3.0020.0002.A47C] # YI SYLLABLE YUOP
+A47D ; [.27D4.0020.0002.A47D] # YI SYLLABLE YOT
+A47E ; [.27D5.0020.0002.A47E] # YI SYLLABLE YOX
+A47F ; [.27D6.0020.0002.A47F] # YI SYLLABLE YO
+A480 ; [.27D7.0020.0002.A480] # YI SYLLABLE YOP
+A481 ; [.27D8.0020.0002.A481] # YI SYLLABLE YUT
+A482 ; [.27D9.0020.0002.A482] # YI SYLLABLE YUX
+A483 ; [.27DA.0020.0002.A483] # YI SYLLABLE YU
+A484 ; [.27DB.0020.0002.A484] # YI SYLLABLE YUP
+A485 ; [.27DC.0020.0002.A485] # YI SYLLABLE YURX
+A486 ; [.27DD.0020.0002.A486] # YI SYLLABLE YUR
+A487 ; [.27DE.0020.0002.A487] # YI SYLLABLE YYT
+A488 ; [.27DF.0020.0002.A488] # YI SYLLABLE YYX
+A489 ; [.27E0.0020.0002.A489] # YI SYLLABLE YY
+A48A ; [.27E1.0020.0002.A48A] # YI SYLLABLE YYP
+A48B ; [.27E2.0020.0002.A48B] # YI SYLLABLE YYRX
+A48C ; [.27E3.0020.0002.A48C] # YI SYLLABLE YYR
+10300 ; [.27E4.0020.0002.10300] # OLD ITALIC LETTER A
+10301 ; [.27E5.0020.0002.10301] # OLD ITALIC LETTER BE
+10302 ; [.27E6.0020.0002.10302] # OLD ITALIC LETTER KE
+10303 ; [.27E7.0020.0002.10303] # OLD ITALIC LETTER DE
+10304 ; [.27E8.0020.0002.10304] # OLD ITALIC LETTER E
+10305 ; [.27E9.0020.0002.10305] # OLD ITALIC LETTER VE
+10306 ; [.27EA.0020.0002.10306] # OLD ITALIC LETTER ZE
+10307 ; [.27EB.0020.0002.10307] # OLD ITALIC LETTER HE
+10308 ; [.27EC.0020.0002.10308] # OLD ITALIC LETTER THE
+10309 ; [.27ED.0020.0002.10309] # OLD ITALIC LETTER I
+1030A ; [.27EE.0020.0002.1030A] # OLD ITALIC LETTER KA
+1030B ; [.27EF.0020.0002.1030B] # OLD ITALIC LETTER EL
+1030C ; [.27F0.0020.0002.1030C] # OLD ITALIC LETTER EM
+1030D ; [.27F1.0020.0002.1030D] # OLD ITALIC LETTER EN
+1030E ; [.27F2.0020.0002.1030E] # OLD ITALIC LETTER ESH
+1030F ; [.27F3.0020.0002.1030F] # OLD ITALIC LETTER O
+10310 ; [.27F4.0020.0002.10310] # OLD ITALIC LETTER PE
+10311 ; [.27F5.0020.0002.10311] # OLD ITALIC LETTER SHE
+10312 ; [.27F6.0020.0002.10312] # OLD ITALIC LETTER KU
+10313 ; [.27F7.0020.0002.10313] # OLD ITALIC LETTER ER
+10314 ; [.27F8.0020.0002.10314] # OLD ITALIC LETTER ES
+10315 ; [.27F9.0020.0002.10315] # OLD ITALIC LETTER TE
+10316 ; [.27FA.0020.0002.10316] # OLD ITALIC LETTER U
+10317 ; [.27FB.0020.0002.10317] # OLD ITALIC LETTER EKS
+10318 ; [.27FC.0020.0002.10318] # OLD ITALIC LETTER PHE
+10319 ; [.27FD.0020.0002.10319] # OLD ITALIC LETTER KHE
+1031A ; [.27FE.0020.0002.1031A] # OLD ITALIC LETTER EF
+1031B ; [.27FF.0020.0002.1031B] # OLD ITALIC LETTER ERS
+1031C ; [.2800.0020.0002.1031C] # OLD ITALIC LETTER CHE
+1031D ; [.2801.0020.0002.1031D] # OLD ITALIC LETTER II
+1031E ; [.2802.0020.0002.1031E] # OLD ITALIC LETTER UU
+10330 ; [.2803.0020.0002.10330] # GOTHIC LETTER AHSA
+10331 ; [.2804.0020.0002.10331] # GOTHIC LETTER BAIRKAN
+10332 ; [.2805.0020.0002.10332] # GOTHIC LETTER GIBA
+10333 ; [.2806.0020.0002.10333] # GOTHIC LETTER DAGS
+10334 ; [.2807.0020.0002.10334] # GOTHIC LETTER AIHVUS
+10335 ; [.2808.0020.0002.10335] # GOTHIC LETTER QAIRTHRA
+10336 ; [.2809.0020.0002.10336] # GOTHIC LETTER IUJA
+10337 ; [.280A.0020.0002.10337] # GOTHIC LETTER HAGL
+10338 ; [.280B.0020.0002.10338] # GOTHIC LETTER THIUTH
+10339 ; [.280C.0020.0002.10339] # GOTHIC LETTER EIS
+1033A ; [.280D.0020.0002.1033A] # GOTHIC LETTER KUSMA
+1033B ; [.280E.0020.0002.1033B] # GOTHIC LETTER LAGUS
+1033C ; [.280F.0020.0002.1033C] # GOTHIC LETTER MANNA
+1033D ; [.2810.0020.0002.1033D] # GOTHIC LETTER NAUTHS
+1033E ; [.2811.0020.0002.1033E] # GOTHIC LETTER JER
+1033F ; [.2812.0020.0002.1033F] # GOTHIC LETTER URUS
+10340 ; [.2813.0020.0002.10340] # GOTHIC LETTER PAIRTHRA
+10341 ; [.2814.0020.0002.10341] # GOTHIC LETTER NINETY
+10342 ; [.2815.0020.0002.10342] # GOTHIC LETTER RAIDA
+10343 ; [.2816.0020.0002.10343] # GOTHIC LETTER SAUIL
+10344 ; [.2817.0020.0002.10344] # GOTHIC LETTER TEIWS
+10345 ; [.2818.0020.0002.10345] # GOTHIC LETTER WINJA
+10346 ; [.2819.0020.0002.10346] # GOTHIC LETTER FAIHU
+10347 ; [.281A.0020.0002.10347] # GOTHIC LETTER IGGWS
+10348 ; [.281B.0020.0002.10348] # GOTHIC LETTER HWAIR
+10349 ; [.281C.0020.0002.10349] # GOTHIC LETTER OTHAL
+1034A ; [.281D.0020.0002.1034A] # GOTHIC LETTER NINE HUNDRED
+10428 ; [.281E.0020.0002.10428] # DESERET SMALL LETTER LONG I
+10400 ; [.281E.0020.0008.10400] # DESERET CAPITAL LETTER LONG I
+10429 ; [.281F.0020.0002.10429] # DESERET SMALL LETTER LONG E
+10401 ; [.281F.0020.0008.10401] # DESERET CAPITAL LETTER LONG E
+1042A ; [.2820.0020.0002.1042A] # DESERET SMALL LETTER LONG A
+10402 ; [.2820.0020.0008.10402] # DESERET CAPITAL LETTER LONG A
+1042B ; [.2821.0020.0002.1042B] # DESERET SMALL LETTER LONG AH
+10403 ; [.2821.0020.0008.10403] # DESERET CAPITAL LETTER LONG AH
+1042C ; [.2822.0020.0002.1042C] # DESERET SMALL LETTER LONG O
+10404 ; [.2822.0020.0008.10404] # DESERET CAPITAL LETTER LONG O
+1042D ; [.2823.0020.0002.1042D] # DESERET SMALL LETTER LONG OO
+10405 ; [.2823.0020.0008.10405] # DESERET CAPITAL LETTER LONG OO
+1042E ; [.2824.0020.0002.1042E] # DESERET SMALL LETTER SHORT I
+10406 ; [.2824.0020.0008.10406] # DESERET CAPITAL LETTER SHORT I
+1042F ; [.2825.0020.0002.1042F] # DESERET SMALL LETTER SHORT E
+10407 ; [.2825.0020.0008.10407] # DESERET CAPITAL LETTER SHORT E
+10430 ; [.2826.0020.0002.10430] # DESERET SMALL LETTER SHORT A
+10408 ; [.2826.0020.0008.10408] # DESERET CAPITAL LETTER SHORT A
+10431 ; [.2827.0020.0002.10431] # DESERET SMALL LETTER SHORT AH
+10409 ; [.2827.0020.0008.10409] # DESERET CAPITAL LETTER SHORT AH
+10432 ; [.2828.0020.0002.10432] # DESERET SMALL LETTER SHORT O
+1040A ; [.2828.0020.0008.1040A] # DESERET CAPITAL LETTER SHORT O
+10433 ; [.2829.0020.0002.10433] # DESERET SMALL LETTER SHORT OO
+1040B ; [.2829.0020.0008.1040B] # DESERET CAPITAL LETTER SHORT OO
+10434 ; [.282A.0020.0002.10434] # DESERET SMALL LETTER AY
+1040C ; [.282A.0020.0008.1040C] # DESERET CAPITAL LETTER AY
+10435 ; [.282B.0020.0002.10435] # DESERET SMALL LETTER OW
+1040D ; [.282B.0020.0008.1040D] # DESERET CAPITAL LETTER OW
+10436 ; [.282C.0020.0002.10436] # DESERET SMALL LETTER WU
+1040E ; [.282C.0020.0008.1040E] # DESERET CAPITAL LETTER WU
+10437 ; [.282D.0020.0002.10437] # DESERET SMALL LETTER YEE
+1040F ; [.282D.0020.0008.1040F] # DESERET CAPITAL LETTER YEE
+10438 ; [.282E.0020.0002.10438] # DESERET SMALL LETTER H
+10410 ; [.282E.0020.0008.10410] # DESERET CAPITAL LETTER H
+10439 ; [.282F.0020.0002.10439] # DESERET SMALL LETTER PEE
+10411 ; [.282F.0020.0008.10411] # DESERET CAPITAL LETTER PEE
+1043A ; [.2830.0020.0002.1043A] # DESERET SMALL LETTER BEE
+10412 ; [.2830.0020.0008.10412] # DESERET CAPITAL LETTER BEE
+1043B ; [.2831.0020.0002.1043B] # DESERET SMALL LETTER TEE
+10413 ; [.2831.0020.0008.10413] # DESERET CAPITAL LETTER TEE
+1043C ; [.2832.0020.0002.1043C] # DESERET SMALL LETTER DEE
+10414 ; [.2832.0020.0008.10414] # DESERET CAPITAL LETTER DEE
+1043D ; [.2833.0020.0002.1043D] # DESERET SMALL LETTER CHEE
+10415 ; [.2833.0020.0008.10415] # DESERET CAPITAL LETTER CHEE
+1043E ; [.2834.0020.0002.1043E] # DESERET SMALL LETTER JEE
+10416 ; [.2834.0020.0008.10416] # DESERET CAPITAL LETTER JEE
+1043F ; [.2835.0020.0002.1043F] # DESERET SMALL LETTER KAY
+10417 ; [.2835.0020.0008.10417] # DESERET CAPITAL LETTER KAY
+10440 ; [.2836.0020.0002.10440] # DESERET SMALL LETTER GAY
+10418 ; [.2836.0020.0008.10418] # DESERET CAPITAL LETTER GAY
+10441 ; [.2837.0020.0002.10441] # DESERET SMALL LETTER EF
+10419 ; [.2837.0020.0008.10419] # DESERET CAPITAL LETTER EF
+10442 ; [.2838.0020.0002.10442] # DESERET SMALL LETTER VEE
+1041A ; [.2838.0020.0008.1041A] # DESERET CAPITAL LETTER VEE
+10443 ; [.2839.0020.0002.10443] # DESERET SMALL LETTER ETH
+1041B ; [.2839.0020.0008.1041B] # DESERET CAPITAL LETTER ETH
+10444 ; [.283A.0020.0002.10444] # DESERET SMALL LETTER THEE
+1041C ; [.283A.0020.0008.1041C] # DESERET CAPITAL LETTER THEE
+10445 ; [.283B.0020.0002.10445] # DESERET SMALL LETTER ES
+1041D ; [.283B.0020.0008.1041D] # DESERET CAPITAL LETTER ES
+10446 ; [.283C.0020.0002.10446] # DESERET SMALL LETTER ZEE
+1041E ; [.283C.0020.0008.1041E] # DESERET CAPITAL LETTER ZEE
+10447 ; [.283D.0020.0002.10447] # DESERET SMALL LETTER ESH
+1041F ; [.283D.0020.0008.1041F] # DESERET CAPITAL LETTER ESH
+10448 ; [.283E.0020.0002.10448] # DESERET SMALL LETTER ZHEE
+10420 ; [.283E.0020.0008.10420] # DESERET CAPITAL LETTER ZHEE
+10449 ; [.283F.0020.0002.10449] # DESERET SMALL LETTER ER
+10421 ; [.283F.0020.0008.10421] # DESERET CAPITAL LETTER ER
+1044A ; [.2840.0020.0002.1044A] # DESERET SMALL LETTER EL
+10422 ; [.2840.0020.0008.10422] # DESERET CAPITAL LETTER EL
+1044B ; [.2841.0020.0002.1044B] # DESERET SMALL LETTER EM
+10423 ; [.2841.0020.0008.10423] # DESERET CAPITAL LETTER EM
+1044C ; [.2842.0020.0002.1044C] # DESERET SMALL LETTER EN
+10424 ; [.2842.0020.0008.10424] # DESERET CAPITAL LETTER EN
+1044D ; [.2843.0020.0002.1044D] # DESERET SMALL LETTER ENG
+10425 ; [.2843.0020.0008.10425] # DESERET CAPITAL LETTER ENG
+1044E ; [.2844.0020.0002.1044E] # DESERET SMALL LETTER OI
+10426 ; [.2844.0020.0008.10426] # DESERET CAPITAL LETTER OI
+1044F ; [.2845.0020.0002.1044F] # DESERET SMALL LETTER EW
+10427 ; [.2845.0020.0008.10427] # DESERET CAPITAL LETTER EW
+10450 ; [.2846.0020.0002.10450] # SHAVIAN LETTER PEEP
+10451 ; [.2847.0020.0002.10451] # SHAVIAN LETTER TOT
+10452 ; [.2848.0020.0002.10452] # SHAVIAN LETTER KICK
+10453 ; [.2849.0020.0002.10453] # SHAVIAN LETTER FEE
+10454 ; [.284A.0020.0002.10454] # SHAVIAN LETTER THIGH
+10455 ; [.284B.0020.0002.10455] # SHAVIAN LETTER SO
+10456 ; [.284C.0020.0002.10456] # SHAVIAN LETTER SURE
+10457 ; [.284D.0020.0002.10457] # SHAVIAN LETTER CHURCH
+10458 ; [.284E.0020.0002.10458] # SHAVIAN LETTER YEA
+10459 ; [.284F.0020.0002.10459] # SHAVIAN LETTER HUNG
+1045A ; [.2850.0020.0002.1045A] # SHAVIAN LETTER BIB
+1045B ; [.2851.0020.0002.1045B] # SHAVIAN LETTER DEAD
+1045C ; [.2852.0020.0002.1045C] # SHAVIAN LETTER GAG
+1045D ; [.2853.0020.0002.1045D] # SHAVIAN LETTER VOW
+1045E ; [.2854.0020.0002.1045E] # SHAVIAN LETTER THEY
+1045F ; [.2855.0020.0002.1045F] # SHAVIAN LETTER ZOO
+10460 ; [.2856.0020.0002.10460] # SHAVIAN LETTER MEASURE
+10461 ; [.2857.0020.0002.10461] # SHAVIAN LETTER JUDGE
+10462 ; [.2858.0020.0002.10462] # SHAVIAN LETTER WOE
+10463 ; [.2859.0020.0002.10463] # SHAVIAN LETTER HA-HA
+10464 ; [.285A.0020.0002.10464] # SHAVIAN LETTER LOLL
+10465 ; [.285B.0020.0002.10465] # SHAVIAN LETTER MIME
+10466 ; [.285C.0020.0002.10466] # SHAVIAN LETTER IF
+10467 ; [.285D.0020.0002.10467] # SHAVIAN LETTER EGG
+10468 ; [.285E.0020.0002.10468] # SHAVIAN LETTER ASH
+10469 ; [.285F.0020.0002.10469] # SHAVIAN LETTER ADO
+1046A ; [.2860.0020.0002.1046A] # SHAVIAN LETTER ON
+1046B ; [.2861.0020.0002.1046B] # SHAVIAN LETTER WOOL
+1046C ; [.2862.0020.0002.1046C] # SHAVIAN LETTER OUT
+1046D ; [.2863.0020.0002.1046D] # SHAVIAN LETTER AH
+1046E ; [.2864.0020.0002.1046E] # SHAVIAN LETTER ROAR
+1046F ; [.2865.0020.0002.1046F] # SHAVIAN LETTER NUN
+10470 ; [.2866.0020.0002.10470] # SHAVIAN LETTER EAT
+10471 ; [.2867.0020.0002.10471] # SHAVIAN LETTER AGE
+10472 ; [.2868.0020.0002.10472] # SHAVIAN LETTER ICE
+10473 ; [.2869.0020.0002.10473] # SHAVIAN LETTER UP
+10474 ; [.286A.0020.0002.10474] # SHAVIAN LETTER OAK
+10475 ; [.286B.0020.0002.10475] # SHAVIAN LETTER OOZE
+10476 ; [.286C.0020.0002.10476] # SHAVIAN LETTER OIL
+10477 ; [.286D.0020.0002.10477] # SHAVIAN LETTER AWE
+10478 ; [.286E.0020.0002.10478] # SHAVIAN LETTER ARE
+10479 ; [.286F.0020.0002.10479] # SHAVIAN LETTER OR
+1047A ; [.2870.0020.0002.1047A] # SHAVIAN LETTER AIR
+1047B ; [.2871.0020.0002.1047B] # SHAVIAN LETTER ERR
+1047C ; [.2872.0020.0002.1047C] # SHAVIAN LETTER ARRAY
+1047D ; [.2873.0020.0002.1047D] # SHAVIAN LETTER EAR
+1047E ; [.2874.0020.0002.1047E] # SHAVIAN LETTER IAN
+1047F ; [.2875.0020.0002.1047F] # SHAVIAN LETTER YEW
+10480 ; [.2876.0020.0002.10480] # OSMANYA LETTER ALEF
+10481 ; [.2877.0020.0002.10481] # OSMANYA LETTER BA
+10482 ; [.2878.0020.0002.10482] # OSMANYA LETTER TA
+10483 ; [.2879.0020.0002.10483] # OSMANYA LETTER JA
+10484 ; [.287A.0020.0002.10484] # OSMANYA LETTER XA
+10485 ; [.287B.0020.0002.10485] # OSMANYA LETTER KHA
+10486 ; [.287C.0020.0002.10486] # OSMANYA LETTER DEEL
+10487 ; [.287D.0020.0002.10487] # OSMANYA LETTER RA
+10488 ; [.287E.0020.0002.10488] # OSMANYA LETTER SA
+10489 ; [.287F.0020.0002.10489] # OSMANYA LETTER SHIIN
+1048A ; [.2880.0020.0002.1048A] # OSMANYA LETTER DHA
+1048B ; [.2881.0020.0002.1048B] # OSMANYA LETTER CAYN
+1048C ; [.2882.0020.0002.1048C] # OSMANYA LETTER GA
+1048D ; [.2883.0020.0002.1048D] # OSMANYA LETTER FA
+1048E ; [.2884.0020.0002.1048E] # OSMANYA LETTER QAAF
+1048F ; [.2885.0020.0002.1048F] # OSMANYA LETTER KAAF
+10490 ; [.2886.0020.0002.10490] # OSMANYA LETTER LAAN
+10491 ; [.2887.0020.0002.10491] # OSMANYA LETTER MIIN
+10492 ; [.2888.0020.0002.10492] # OSMANYA LETTER NUUN
+10493 ; [.2889.0020.0002.10493] # OSMANYA LETTER WAW
+10494 ; [.288A.0020.0002.10494] # OSMANYA LETTER HA
+10495 ; [.288B.0020.0002.10495] # OSMANYA LETTER YA
+10496 ; [.288C.0020.0002.10496] # OSMANYA LETTER A
+10497 ; [.288D.0020.0002.10497] # OSMANYA LETTER E
+10498 ; [.288E.0020.0002.10498] # OSMANYA LETTER I
+10499 ; [.288F.0020.0002.10499] # OSMANYA LETTER O
+1049A ; [.2890.0020.0002.1049A] # OSMANYA LETTER U
+1049B ; [.2891.0020.0002.1049B] # OSMANYA LETTER AA
+1049C ; [.2892.0020.0002.1049C] # OSMANYA LETTER EE
+1049D ; [.2893.0020.0002.1049D] # OSMANYA LETTER OO
+10000 ; [.2894.0020.0002.10000] # LINEAR B SYLLABLE B008 A
+10001 ; [.2895.0020.0002.10001] # LINEAR B SYLLABLE B038 E
+10002 ; [.2896.0020.0002.10002] # LINEAR B SYLLABLE B028 I
+10003 ; [.2897.0020.0002.10003] # LINEAR B SYLLABLE B061 O
+10004 ; [.2898.0020.0002.10004] # LINEAR B SYLLABLE B010 U
+10005 ; [.2899.0020.0002.10005] # LINEAR B SYLLABLE B001 DA
+10006 ; [.289A.0020.0002.10006] # LINEAR B SYLLABLE B045 DE
+10007 ; [.289B.0020.0002.10007] # LINEAR B SYLLABLE B007 DI
+10008 ; [.289C.0020.0002.10008] # LINEAR B SYLLABLE B014 DO
+10009 ; [.289D.0020.0002.10009] # LINEAR B SYLLABLE B051 DU
+1000A ; [.289E.0020.0002.1000A] # LINEAR B SYLLABLE B057 JA
+1000B ; [.289F.0020.0002.1000B] # LINEAR B SYLLABLE B046 JE
+1000D ; [.28A0.0020.0002.1000D] # LINEAR B SYLLABLE B036 JO
+1000E ; [.28A1.0020.0002.1000E] # LINEAR B SYLLABLE B065 JU
+1000F ; [.28A2.0020.0002.1000F] # LINEAR B SYLLABLE B077 KA
+10010 ; [.28A3.0020.0002.10010] # LINEAR B SYLLABLE B044 KE
+10011 ; [.28A4.0020.0002.10011] # LINEAR B SYLLABLE B067 KI
+10012 ; [.28A5.0020.0002.10012] # LINEAR B SYLLABLE B070 KO
+10013 ; [.28A6.0020.0002.10013] # LINEAR B SYLLABLE B081 KU
+10014 ; [.28A7.0020.0002.10014] # LINEAR B SYLLABLE B080 MA
+10015 ; [.28A8.0020.0002.10015] # LINEAR B SYLLABLE B013 ME
+10016 ; [.28A9.0020.0002.10016] # LINEAR B SYLLABLE B073 MI
+10017 ; [.28AA.0020.0002.10017] # LINEAR B SYLLABLE B015 MO
+10018 ; [.28AB.0020.0002.10018] # LINEAR B SYLLABLE B023 MU
+10019 ; [.28AC.0020.0002.10019] # LINEAR B SYLLABLE B006 NA
+1001A ; [.28AD.0020.0002.1001A] # LINEAR B SYLLABLE B024 NE
+1001B ; [.28AE.0020.0002.1001B] # LINEAR B SYLLABLE B030 NI
+1001C ; [.28AF.0020.0002.1001C] # LINEAR B SYLLABLE B052 NO
+1001D ; [.28B0.0020.0002.1001D] # LINEAR B SYLLABLE B055 NU
+1001E ; [.28B1.0020.0002.1001E] # LINEAR B SYLLABLE B003 PA
+1001F ; [.28B2.0020.0002.1001F] # LINEAR B SYLLABLE B072 PE
+10020 ; [.28B3.0020.0002.10020] # LINEAR B SYLLABLE B039 PI
+10021 ; [.28B4.0020.0002.10021] # LINEAR B SYLLABLE B011 PO
+10022 ; [.28B5.0020.0002.10022] # LINEAR B SYLLABLE B050 PU
+10023 ; [.28B6.0020.0002.10023] # LINEAR B SYLLABLE B016 QA
+10024 ; [.28B7.0020.0002.10024] # LINEAR B SYLLABLE B078 QE
+10025 ; [.28B8.0020.0002.10025] # LINEAR B SYLLABLE B021 QI
+10026 ; [.28B9.0020.0002.10026] # LINEAR B SYLLABLE B032 QO
+10028 ; [.28BA.0020.0002.10028] # LINEAR B SYLLABLE B060 RA
+10029 ; [.28BB.0020.0002.10029] # LINEAR B SYLLABLE B027 RE
+1002A ; [.28BC.0020.0002.1002A] # LINEAR B SYLLABLE B053 RI
+1002B ; [.28BD.0020.0002.1002B] # LINEAR B SYLLABLE B002 RO
+1002C ; [.28BE.0020.0002.1002C] # LINEAR B SYLLABLE B026 RU
+1002D ; [.28BF.0020.0002.1002D] # LINEAR B SYLLABLE B031 SA
+1002E ; [.28C0.0020.0002.1002E] # LINEAR B SYLLABLE B009 SE
+1002F ; [.28C1.0020.0002.1002F] # LINEAR B SYLLABLE B041 SI
+10030 ; [.28C2.0020.0002.10030] # LINEAR B SYLLABLE B012 SO
+10031 ; [.28C3.0020.0002.10031] # LINEAR B SYLLABLE B058 SU
+10032 ; [.28C4.0020.0002.10032] # LINEAR B SYLLABLE B059 TA
+10033 ; [.28C5.0020.0002.10033] # LINEAR B SYLLABLE B004 TE
+10034 ; [.28C6.0020.0002.10034] # LINEAR B SYLLABLE B037 TI
+10035 ; [.28C7.0020.0002.10035] # LINEAR B SYLLABLE B005 TO
+10036 ; [.28C8.0020.0002.10036] # LINEAR B SYLLABLE B069 TU
+10037 ; [.28C9.0020.0002.10037] # LINEAR B SYLLABLE B054 WA
+10038 ; [.28CA.0020.0002.10038] # LINEAR B SYLLABLE B075 WE
+10039 ; [.28CB.0020.0002.10039] # LINEAR B SYLLABLE B040 WI
+1003A ; [.28CC.0020.0002.1003A] # LINEAR B SYLLABLE B042 WO
+1003C ; [.28CD.0020.0002.1003C] # LINEAR B SYLLABLE B017 ZA
+1003D ; [.28CE.0020.0002.1003D] # LINEAR B SYLLABLE B074 ZE
+1003F ; [.28CF.0020.0002.1003F] # LINEAR B SYLLABLE B020 ZO
+10040 ; [.28D0.0020.0002.10040] # LINEAR B SYLLABLE B025 A2
+10041 ; [.28D1.0020.0002.10041] # LINEAR B SYLLABLE B043 A3
+10042 ; [.28D2.0020.0002.10042] # LINEAR B SYLLABLE B085 AU
+10043 ; [.28D3.0020.0002.10043] # LINEAR B SYLLABLE B071 DWE
+10044 ; [.28D4.0020.0002.10044] # LINEAR B SYLLABLE B090 DWO
+10045 ; [.28D5.0020.0002.10045] # LINEAR B SYLLABLE B048 NWA
+10046 ; [.28D6.0020.0002.10046] # LINEAR B SYLLABLE B029 PU2
+10047 ; [.28D7.0020.0002.10047] # LINEAR B SYLLABLE B062 PTE
+10048 ; [.28D8.0020.0002.10048] # LINEAR B SYLLABLE B076 RA2
+10049 ; [.28D9.0020.0002.10049] # LINEAR B SYLLABLE B033 RA3
+1004A ; [.28DA.0020.0002.1004A] # LINEAR B SYLLABLE B068 RO2
+1004B ; [.28DB.0020.0002.1004B] # LINEAR B SYLLABLE B066 TA2
+1004C ; [.28DC.0020.0002.1004C] # LINEAR B SYLLABLE B087 TWE
+1004D ; [.28DD.0020.0002.1004D] # LINEAR B SYLLABLE B091 TWO
+10050 ; [.28DE.0020.0002.10050] # LINEAR B SYMBOL B018
+10051 ; [.28DF.0020.0002.10051] # LINEAR B SYMBOL B019
+10052 ; [.28E0.0020.0002.10052] # LINEAR B SYMBOL B022
+10053 ; [.28E1.0020.0002.10053] # LINEAR B SYMBOL B034
+10054 ; [.28E2.0020.0002.10054] # LINEAR B SYMBOL B047
+10055 ; [.28E3.0020.0002.10055] # LINEAR B SYMBOL B049
+10056 ; [.28E4.0020.0002.10056] # LINEAR B SYMBOL B056
+10057 ; [.28E5.0020.0002.10057] # LINEAR B SYMBOL B063
+10058 ; [.28E6.0020.0002.10058] # LINEAR B SYMBOL B064
+10059 ; [.28E7.0020.0002.10059] # LINEAR B SYMBOL B079
+1005A ; [.28E8.0020.0002.1005A] # LINEAR B SYMBOL B082
+1005B ; [.28E9.0020.0002.1005B] # LINEAR B SYMBOL B083
+1005C ; [.28EA.0020.0002.1005C] # LINEAR B SYMBOL B086
+1005D ; [.28EB.0020.0002.1005D] # LINEAR B SYMBOL B089
+10080 ; [.28EC.0020.0002.10080] # LINEAR B IDEOGRAM B100 MAN
+10081 ; [.28ED.0020.0002.10081] # LINEAR B IDEOGRAM B102 WOMAN
+10082 ; [.28EE.0020.0002.10082] # LINEAR B IDEOGRAM B104 DEER
+10083 ; [.28EF.0020.0002.10083] # LINEAR B IDEOGRAM B105 EQUID
+10084 ; [.28F0.0020.0002.10084] # LINEAR B IDEOGRAM B105F MARE
+10085 ; [.28F1.0020.0002.10085] # LINEAR B IDEOGRAM B105M STALLION
+10086 ; [.28F2.0020.0002.10086] # LINEAR B IDEOGRAM B106F EWE
+10087 ; [.28F3.0020.0002.10087] # LINEAR B IDEOGRAM B106M RAM
+10088 ; [.28F4.0020.0002.10088] # LINEAR B IDEOGRAM B107F SHE-GOAT
+10089 ; [.28F5.0020.0002.10089] # LINEAR B IDEOGRAM B107M HE-GOAT
+1008A ; [.28F6.0020.0002.1008A] # LINEAR B IDEOGRAM B108F SOW
+1008B ; [.28F7.0020.0002.1008B] # LINEAR B IDEOGRAM B108M BOAR
+1008C ; [.28F8.0020.0002.1008C] # LINEAR B IDEOGRAM B109F COW
+1008D ; [.28F9.0020.0002.1008D] # LINEAR B IDEOGRAM B109M BULL
+1008E ; [.28FA.0020.0002.1008E] # LINEAR B IDEOGRAM B120 WHEAT
+1008F ; [.28FB.0020.0002.1008F] # LINEAR B IDEOGRAM B121 BARLEY
+10090 ; [.28FC.0020.0002.10090] # LINEAR B IDEOGRAM B122 OLIVE
+10091 ; [.28FD.0020.0002.10091] # LINEAR B IDEOGRAM B123 SPICE
+10092 ; [.28FE.0020.0002.10092] # LINEAR B IDEOGRAM B125 CYPERUS
+10093 ; [.28FF.0020.0002.10093] # LINEAR B MONOGRAM B127 KAPO
+10094 ; [.2900.0020.0002.10094] # LINEAR B MONOGRAM B128 KANAKO
+10095 ; [.2901.0020.0002.10095] # LINEAR B IDEOGRAM B130 OIL
+10096 ; [.2902.0020.0002.10096] # LINEAR B IDEOGRAM B131 WINE
+10097 ; [.2903.0020.0002.10097] # LINEAR B IDEOGRAM B132
+10098 ; [.2904.0020.0002.10098] # LINEAR B MONOGRAM B133 AREPA
+10099 ; [.2905.0020.0002.10099] # LINEAR B MONOGRAM B135 MERI
+1009A ; [.2906.0020.0002.1009A] # LINEAR B IDEOGRAM B140 BRONZE
+1009B ; [.2907.0020.0002.1009B] # LINEAR B IDEOGRAM B141 GOLD
+1009C ; [.2908.0020.0002.1009C] # LINEAR B IDEOGRAM B142
+1009D ; [.2909.0020.0002.1009D] # LINEAR B IDEOGRAM B145 WOOL
+1009E ; [.290A.0020.0002.1009E] # LINEAR B IDEOGRAM B146
+1009F ; [.290B.0020.0002.1009F] # LINEAR B IDEOGRAM B150
+100A0 ; [.290C.0020.0002.100A0] # LINEAR B IDEOGRAM B151 HORN
+100A1 ; [.290D.0020.0002.100A1] # LINEAR B IDEOGRAM B152
+100A2 ; [.290E.0020.0002.100A2] # LINEAR B IDEOGRAM B153
+100A3 ; [.290F.0020.0002.100A3] # LINEAR B IDEOGRAM B154
+100A4 ; [.2910.0020.0002.100A4] # LINEAR B MONOGRAM B156 TURO2
+100A5 ; [.2911.0020.0002.100A5] # LINEAR B IDEOGRAM B157
+100A6 ; [.2912.0020.0002.100A6] # LINEAR B IDEOGRAM B158
+100A7 ; [.2913.0020.0002.100A7] # LINEAR B IDEOGRAM B159 CLOTH
+100A8 ; [.2914.0020.0002.100A8] # LINEAR B IDEOGRAM B160
+100A9 ; [.2915.0020.0002.100A9] # LINEAR B IDEOGRAM B161
+100AA ; [.2916.0020.0002.100AA] # LINEAR B IDEOGRAM B162 GARMENT
+100AB ; [.2917.0020.0002.100AB] # LINEAR B IDEOGRAM B163 ARMOUR
+100AC ; [.2918.0020.0002.100AC] # LINEAR B IDEOGRAM B164
+100AD ; [.2919.0020.0002.100AD] # LINEAR B IDEOGRAM B165
+100AE ; [.291A.0020.0002.100AE] # LINEAR B IDEOGRAM B166
+100AF ; [.291B.0020.0002.100AF] # LINEAR B IDEOGRAM B167
+100B0 ; [.291C.0020.0002.100B0] # LINEAR B IDEOGRAM B168
+100B1 ; [.291D.0020.0002.100B1] # LINEAR B IDEOGRAM B169
+100B2 ; [.291E.0020.0002.100B2] # LINEAR B IDEOGRAM B170
+100B3 ; [.291F.0020.0002.100B3] # LINEAR B IDEOGRAM B171
+100B4 ; [.2920.0020.0002.100B4] # LINEAR B IDEOGRAM B172
+100B5 ; [.2921.0020.0002.100B5] # LINEAR B IDEOGRAM B173 MONTH
+100B6 ; [.2922.0020.0002.100B6] # LINEAR B IDEOGRAM B174
+100B7 ; [.2923.0020.0002.100B7] # LINEAR B IDEOGRAM B176 TREE
+100B8 ; [.2924.0020.0002.100B8] # LINEAR B IDEOGRAM B177
+100B9 ; [.2925.0020.0002.100B9] # LINEAR B IDEOGRAM B178
+100BA ; [.2926.0020.0002.100BA] # LINEAR B IDEOGRAM B179
+100BB ; [.2927.0020.0002.100BB] # LINEAR B IDEOGRAM B180
+100BC ; [.2928.0020.0002.100BC] # LINEAR B IDEOGRAM B181
+100BD ; [.2929.0020.0002.100BD] # LINEAR B IDEOGRAM B182
+100BE ; [.292A.0020.0002.100BE] # LINEAR B IDEOGRAM B183
+100BF ; [.292B.0020.0002.100BF] # LINEAR B IDEOGRAM B184
+100C0 ; [.292C.0020.0002.100C0] # LINEAR B IDEOGRAM B185
+100C1 ; [.292D.0020.0002.100C1] # LINEAR B IDEOGRAM B189
+100C2 ; [.292E.0020.0002.100C2] # LINEAR B IDEOGRAM B190
+100C3 ; [.292F.0020.0002.100C3] # LINEAR B IDEOGRAM B191 HELMET
+100C4 ; [.2930.0020.0002.100C4] # LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5 ; [.2931.0020.0002.100C5] # LINEAR B IDEOGRAM B225 BATHTUB
+100C6 ; [.2932.0020.0002.100C6] # LINEAR B IDEOGRAM B230 SPEAR
+100C7 ; [.2933.0020.0002.100C7] # LINEAR B IDEOGRAM B231 ARROW
+100C8 ; [.2934.0020.0002.100C8] # LINEAR B IDEOGRAM B232
+100C9 ; [.2935.0020.0002.100C9] # LINEAR B IDEOGRAM B233 SWORD
+100CA ; [.2936.0020.0002.100CA] # LINEAR B IDEOGRAM B234
+100CB ; [.2937.0020.0002.100CB] # LINEAR B IDEOGRAM B236
+100CC ; [.2938.0020.0002.100CC] # LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD ; [.2939.0020.0002.100CD] # LINEAR B IDEOGRAM B241 CHARIOT
+100CE ; [.293A.0020.0002.100CE] # LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF ; [.293B.0020.0002.100CF] # LINEAR B IDEOGRAM B243 WHEEL
+100D0 ; [.293C.0020.0002.100D0] # LINEAR B IDEOGRAM B245
+100D1 ; [.293D.0020.0002.100D1] # LINEAR B IDEOGRAM B246
+100D2 ; [.293E.0020.0002.100D2] # LINEAR B MONOGRAM B247 DIPTE
+100D3 ; [.293F.0020.0002.100D3] # LINEAR B IDEOGRAM B248
+100D4 ; [.2940.0020.0002.100D4] # LINEAR B IDEOGRAM B249
+100D5 ; [.2941.0020.0002.100D5] # LINEAR B IDEOGRAM B251
+100D6 ; [.2942.0020.0002.100D6] # LINEAR B IDEOGRAM B252
+100D7 ; [.2943.0020.0002.100D7] # LINEAR B IDEOGRAM B253
+100D8 ; [.2944.0020.0002.100D8] # LINEAR B IDEOGRAM B254 DART
+100D9 ; [.2945.0020.0002.100D9] # LINEAR B IDEOGRAM B255
+100DA ; [.2946.0020.0002.100DA] # LINEAR B IDEOGRAM B256
+100DB ; [.2947.0020.0002.100DB] # LINEAR B IDEOGRAM B257
+100DC ; [.2948.0020.0002.100DC] # LINEAR B IDEOGRAM B258
+100DD ; [.2949.0020.0002.100DD] # LINEAR B IDEOGRAM B259
+100DE ; [.294A.0020.0002.100DE] # LINEAR B IDEOGRAM VESSEL B155
+100DF ; [.294B.0020.0002.100DF] # LINEAR B IDEOGRAM VESSEL B200
+100E0 ; [.294C.0020.0002.100E0] # LINEAR B IDEOGRAM VESSEL B201
+100E1 ; [.294D.0020.0002.100E1] # LINEAR B IDEOGRAM VESSEL B202
+100E2 ; [.294E.0020.0002.100E2] # LINEAR B IDEOGRAM VESSEL B203
+100E3 ; [.294F.0020.0002.100E3] # LINEAR B IDEOGRAM VESSEL B204
+100E4 ; [.2950.0020.0002.100E4] # LINEAR B IDEOGRAM VESSEL B205
+100E5 ; [.2951.0020.0002.100E5] # LINEAR B IDEOGRAM VESSEL B206
+100E6 ; [.2952.0020.0002.100E6] # LINEAR B IDEOGRAM VESSEL B207
+100E7 ; [.2953.0020.0002.100E7] # LINEAR B IDEOGRAM VESSEL B208
+100E8 ; [.2954.0020.0002.100E8] # LINEAR B IDEOGRAM VESSEL B209
+100E9 ; [.2955.0020.0002.100E9] # LINEAR B IDEOGRAM VESSEL B210
+100EA ; [.2956.0020.0002.100EA] # LINEAR B IDEOGRAM VESSEL B211
+100EB ; [.2957.0020.0002.100EB] # LINEAR B IDEOGRAM VESSEL B212
+100EC ; [.2958.0020.0002.100EC] # LINEAR B IDEOGRAM VESSEL B213
+100ED ; [.2959.0020.0002.100ED] # LINEAR B IDEOGRAM VESSEL B214
+100EE ; [.295A.0020.0002.100EE] # LINEAR B IDEOGRAM VESSEL B215
+100EF ; [.295B.0020.0002.100EF] # LINEAR B IDEOGRAM VESSEL B216
+100F0 ; [.295C.0020.0002.100F0] # LINEAR B IDEOGRAM VESSEL B217
+100F1 ; [.295D.0020.0002.100F1] # LINEAR B IDEOGRAM VESSEL B218
+100F2 ; [.295E.0020.0002.100F2] # LINEAR B IDEOGRAM VESSEL B219
+100F3 ; [.295F.0020.0002.100F3] # LINEAR B IDEOGRAM VESSEL B221
+100F4 ; [.2960.0020.0002.100F4] # LINEAR B IDEOGRAM VESSEL B222
+100F5 ; [.2961.0020.0002.100F5] # LINEAR B IDEOGRAM VESSEL B226
+100F6 ; [.2962.0020.0002.100F6] # LINEAR B IDEOGRAM VESSEL B227
+100F7 ; [.2963.0020.0002.100F7] # LINEAR B IDEOGRAM VESSEL B228
+100F8 ; [.2964.0020.0002.100F8] # LINEAR B IDEOGRAM VESSEL B229
+100F9 ; [.2965.0020.0002.100F9] # LINEAR B IDEOGRAM VESSEL B250
+100FA ; [.2966.0020.0002.100FA] # LINEAR B IDEOGRAM VESSEL B305
+10800 ; [.2967.0020.0002.10800] # CYPRIOT SYLLABLE A
+10801 ; [.2968.0020.0002.10801] # CYPRIOT SYLLABLE E
+10802 ; [.2969.0020.0002.10802] # CYPRIOT SYLLABLE I
+10803 ; [.296A.0020.0002.10803] # CYPRIOT SYLLABLE O
+10804 ; [.296B.0020.0002.10804] # CYPRIOT SYLLABLE U
+10805 ; [.296C.0020.0002.10805] # CYPRIOT SYLLABLE JA
+10808 ; [.296D.0020.0002.10808] # CYPRIOT SYLLABLE JO
+1080A ; [.296E.0020.0002.1080A] # CYPRIOT SYLLABLE KA
+1080B ; [.296F.0020.0002.1080B] # CYPRIOT SYLLABLE KE
+1080C ; [.2970.0020.0002.1080C] # CYPRIOT SYLLABLE KI
+1080D ; [.2971.0020.0002.1080D] # CYPRIOT SYLLABLE KO
+1080E ; [.2972.0020.0002.1080E] # CYPRIOT SYLLABLE KU
+1080F ; [.2973.0020.0002.1080F] # CYPRIOT SYLLABLE LA
+10810 ; [.2974.0020.0002.10810] # CYPRIOT SYLLABLE LE
+10811 ; [.2975.0020.0002.10811] # CYPRIOT SYLLABLE LI
+10812 ; [.2976.0020.0002.10812] # CYPRIOT SYLLABLE LO
+10813 ; [.2977.0020.0002.10813] # CYPRIOT SYLLABLE LU
+10814 ; [.2978.0020.0002.10814] # CYPRIOT SYLLABLE MA
+10815 ; [.2979.0020.0002.10815] # CYPRIOT SYLLABLE ME
+10816 ; [.297A.0020.0002.10816] # CYPRIOT SYLLABLE MI
+10817 ; [.297B.0020.0002.10817] # CYPRIOT SYLLABLE MO
+10818 ; [.297C.0020.0002.10818] # CYPRIOT SYLLABLE MU
+10819 ; [.297D.0020.0002.10819] # CYPRIOT SYLLABLE NA
+1081A ; [.297E.0020.0002.1081A] # CYPRIOT SYLLABLE NE
+1081B ; [.297F.0020.0002.1081B] # CYPRIOT SYLLABLE NI
+1081C ; [.2980.0020.0002.1081C] # CYPRIOT SYLLABLE NO
+1081D ; [.2981.0020.0002.1081D] # CYPRIOT SYLLABLE NU
+1081E ; [.2982.0020.0002.1081E] # CYPRIOT SYLLABLE PA
+1081F ; [.2983.0020.0002.1081F] # CYPRIOT SYLLABLE PE
+10820 ; [.2984.0020.0002.10820] # CYPRIOT SYLLABLE PI
+10821 ; [.2985.0020.0002.10821] # CYPRIOT SYLLABLE PO
+10822 ; [.2986.0020.0002.10822] # CYPRIOT SYLLABLE PU
+10823 ; [.2987.0020.0002.10823] # CYPRIOT SYLLABLE RA
+10824 ; [.2988.0020.0002.10824] # CYPRIOT SYLLABLE RE
+10825 ; [.2989.0020.0002.10825] # CYPRIOT SYLLABLE RI
+10826 ; [.298A.0020.0002.10826] # CYPRIOT SYLLABLE RO
+10827 ; [.298B.0020.0002.10827] # CYPRIOT SYLLABLE RU
+10828 ; [.298C.0020.0002.10828] # CYPRIOT SYLLABLE SA
+10829 ; [.298D.0020.0002.10829] # CYPRIOT SYLLABLE SE
+1082A ; [.298E.0020.0002.1082A] # CYPRIOT SYLLABLE SI
+1082B ; [.298F.0020.0002.1082B] # CYPRIOT SYLLABLE SO
+1082C ; [.2990.0020.0002.1082C] # CYPRIOT SYLLABLE SU
+1082D ; [.2991.0020.0002.1082D] # CYPRIOT SYLLABLE TA
+1082E ; [.2992.0020.0002.1082E] # CYPRIOT SYLLABLE TE
+1082F ; [.2993.0020.0002.1082F] # CYPRIOT SYLLABLE TI
+10830 ; [.2994.0020.0002.10830] # CYPRIOT SYLLABLE TO
+10831 ; [.2995.0020.0002.10831] # CYPRIOT SYLLABLE TU
+10832 ; [.2996.0020.0002.10832] # CYPRIOT SYLLABLE WA
+10833 ; [.2997.0020.0002.10833] # CYPRIOT SYLLABLE WE
+10834 ; [.2998.0020.0002.10834] # CYPRIOT SYLLABLE WI
+10835 ; [.2999.0020.0002.10835] # CYPRIOT SYLLABLE WO
+10837 ; [.299A.0020.0002.10837] # CYPRIOT SYLLABLE XA
+10838 ; [.299B.0020.0002.10838] # CYPRIOT SYLLABLE XE
+1083C ; [.299C.0020.0002.1083C] # CYPRIOT SYLLABLE ZA
+1083F ; [.299D.0020.0002.1083F] # CYPRIOT SYLLABLE ZO
+10380 ; [.299E.0020.0002.10380] # UGARITIC LETTER ALPA
+10381 ; [.299F.0020.0002.10381] # UGARITIC LETTER BETA
+10382 ; [.29A0.0020.0002.10382] # UGARITIC LETTER GAMLA
+10383 ; [.29A1.0020.0002.10383] # UGARITIC LETTER KHA
+10384 ; [.29A2.0020.0002.10384] # UGARITIC LETTER DELTA
+10385 ; [.29A3.0020.0002.10385] # UGARITIC LETTER HO
+10386 ; [.29A4.0020.0002.10386] # UGARITIC LETTER WO
+10387 ; [.29A5.0020.0002.10387] # UGARITIC LETTER ZETA
+10388 ; [.29A6.0020.0002.10388] # UGARITIC LETTER HOTA
+10389 ; [.29A7.0020.0002.10389] # UGARITIC LETTER TET
+1038A ; [.29A8.0020.0002.1038A] # UGARITIC LETTER YOD
+1038B ; [.29A9.0020.0002.1038B] # UGARITIC LETTER KAF
+1038C ; [.29AA.0020.0002.1038C] # UGARITIC LETTER SHIN
+1038D ; [.29AB.0020.0002.1038D] # UGARITIC LETTER LAMDA
+1038E ; [.29AC.0020.0002.1038E] # UGARITIC LETTER MEM
+1038F ; [.29AD.0020.0002.1038F] # UGARITIC LETTER DHAL
+10390 ; [.29AE.0020.0002.10390] # UGARITIC LETTER NUN
+10391 ; [.29AF.0020.0002.10391] # UGARITIC LETTER ZU
+10392 ; [.29B0.0020.0002.10392] # UGARITIC LETTER SAMKA
+10393 ; [.29B1.0020.0002.10393] # UGARITIC LETTER AIN
+10394 ; [.29B2.0020.0002.10394] # UGARITIC LETTER PU
+10395 ; [.29B3.0020.0002.10395] # UGARITIC LETTER SADE
+10396 ; [.29B4.0020.0002.10396] # UGARITIC LETTER QOPA
+10397 ; [.29B5.0020.0002.10397] # UGARITIC LETTER RASHA
+10398 ; [.29B6.0020.0002.10398] # UGARITIC LETTER THANNA
+10399 ; [.29B7.0020.0002.10399] # UGARITIC LETTER GHAIN
+1039A ; [.29B8.0020.0002.1039A] # UGARITIC LETTER TO
+1039B ; [.29B9.0020.0002.1039B] # UGARITIC LETTER I
+1039C ; [.29BA.0020.0002.1039C] # UGARITIC LETTER U
+1039D ; [.29BB.0020.0002.1039D] # UGARITIC LETTER SSU
+103A0 ; [.29BC.0020.0002.103A0] # OLD PERSIAN SIGN A
+103A1 ; [.29BD.0020.0002.103A1] # OLD PERSIAN SIGN I
+103A2 ; [.29BE.0020.0002.103A2] # OLD PERSIAN SIGN U
+103A3 ; [.29BF.0020.0002.103A3] # OLD PERSIAN SIGN KA
+103A4 ; [.29C0.0020.0002.103A4] # OLD PERSIAN SIGN KU
+103A5 ; [.29C1.0020.0002.103A5] # OLD PERSIAN SIGN GA
+103A6 ; [.29C2.0020.0002.103A6] # OLD PERSIAN SIGN GU
+103A7 ; [.29C3.0020.0002.103A7] # OLD PERSIAN SIGN XA
+103A8 ; [.29C4.0020.0002.103A8] # OLD PERSIAN SIGN CA
+103A9 ; [.29C5.0020.0002.103A9] # OLD PERSIAN SIGN JA
+103AA ; [.29C6.0020.0002.103AA] # OLD PERSIAN SIGN JI
+103AB ; [.29C7.0020.0002.103AB] # OLD PERSIAN SIGN TA
+103AC ; [.29C8.0020.0002.103AC] # OLD PERSIAN SIGN TU
+103AD ; [.29C9.0020.0002.103AD] # OLD PERSIAN SIGN DA
+103AE ; [.29CA.0020.0002.103AE] # OLD PERSIAN SIGN DI
+103AF ; [.29CB.0020.0002.103AF] # OLD PERSIAN SIGN DU
+103B0 ; [.29CC.0020.0002.103B0] # OLD PERSIAN SIGN THA
+103B1 ; [.29CD.0020.0002.103B1] # OLD PERSIAN SIGN PA
+103B2 ; [.29CE.0020.0002.103B2] # OLD PERSIAN SIGN BA
+103B3 ; [.29CF.0020.0002.103B3] # OLD PERSIAN SIGN FA
+103B4 ; [.29D0.0020.0002.103B4] # OLD PERSIAN SIGN NA
+103B5 ; [.29D1.0020.0002.103B5] # OLD PERSIAN SIGN NU
+103B6 ; [.29D2.0020.0002.103B6] # OLD PERSIAN SIGN MA
+103B7 ; [.29D3.0020.0002.103B7] # OLD PERSIAN SIGN MI
+103B8 ; [.29D4.0020.0002.103B8] # OLD PERSIAN SIGN MU
+103B9 ; [.29D5.0020.0002.103B9] # OLD PERSIAN SIGN YA
+103BA ; [.29D6.0020.0002.103BA] # OLD PERSIAN SIGN VA
+103BB ; [.29D7.0020.0002.103BB] # OLD PERSIAN SIGN VI
+103BC ; [.29D8.0020.0002.103BC] # OLD PERSIAN SIGN RA
+103BD ; [.29D9.0020.0002.103BD] # OLD PERSIAN SIGN RU
+103BE ; [.29DA.0020.0002.103BE] # OLD PERSIAN SIGN LA
+103BF ; [.29DB.0020.0002.103BF] # OLD PERSIAN SIGN SA
+103C0 ; [.29DC.0020.0002.103C0] # OLD PERSIAN SIGN ZA
+103C1 ; [.29DD.0020.0002.103C1] # OLD PERSIAN SIGN SHA
+103C2 ; [.29DE.0020.0002.103C2] # OLD PERSIAN SIGN SSA
+103C3 ; [.29DF.0020.0002.103C3] # OLD PERSIAN SIGN HA
+103C8 ; [.29E0.0020.0002.103C8] # OLD PERSIAN SIGN AURAMAZDAA
+103C9 ; [.29E1.0020.0002.103C9] # OLD PERSIAN SIGN AURAMAZDAA-2
+103CA ; [.29E2.0020.0002.103CA] # OLD PERSIAN SIGN AURAMAZDAAHA
+103CB ; [.29E3.0020.0002.103CB] # OLD PERSIAN SIGN XSHAAYATHIYA
+103CC ; [.29E4.0020.0002.103CC] # OLD PERSIAN SIGN DAHYAAUSH
+103CD ; [.29E5.0020.0002.103CD] # OLD PERSIAN SIGN DAHYAAUSH-2
+103CE ; [.29E6.0020.0002.103CE] # OLD PERSIAN SIGN BAGA
+103CF ; [.29E7.0020.0002.103CF] # OLD PERSIAN SIGN BUUMISH
+12000 ; [.29E8.0020.0002.12000] # CUNEIFORM SIGN A
+12001 ; [.29E9.0020.0002.12001] # CUNEIFORM SIGN A TIMES A
+12002 ; [.29EA.0020.0002.12002] # CUNEIFORM SIGN A TIMES BAD
+12003 ; [.29EB.0020.0002.12003] # CUNEIFORM SIGN A TIMES GAN2 TENU
+12004 ; [.29EC.0020.0002.12004] # CUNEIFORM SIGN A TIMES HA
+12005 ; [.29ED.0020.0002.12005] # CUNEIFORM SIGN A TIMES IGI
+12006 ; [.29EE.0020.0002.12006] # CUNEIFORM SIGN A TIMES LAGAR GUNU
+12007 ; [.29EF.0020.0002.12007] # CUNEIFORM SIGN A TIMES MUSH
+12008 ; [.29F0.0020.0002.12008] # CUNEIFORM SIGN A TIMES SAG
+12009 ; [.29F1.0020.0002.12009] # CUNEIFORM SIGN A2
+1200A ; [.29F2.0020.0002.1200A] # CUNEIFORM SIGN AB
+1200B ; [.29F3.0020.0002.1200B] # CUNEIFORM SIGN AB TIMES ASH2
+1200C ; [.29F4.0020.0002.1200C] # CUNEIFORM SIGN AB TIMES DUN3 GUNU
+1200D ; [.29F5.0020.0002.1200D] # CUNEIFORM SIGN AB TIMES GAL
+1200E ; [.29F6.0020.0002.1200E] # CUNEIFORM SIGN AB TIMES GAN2 TENU
+1200F ; [.29F7.0020.0002.1200F] # CUNEIFORM SIGN AB TIMES HA
+12010 ; [.29F8.0020.0002.12010] # CUNEIFORM SIGN AB TIMES IGI GUNU
+12011 ; [.29F9.0020.0002.12011] # CUNEIFORM SIGN AB TIMES IMIN
+12012 ; [.29FA.0020.0002.12012] # CUNEIFORM SIGN AB TIMES LAGAB
+12013 ; [.29FB.0020.0002.12013] # CUNEIFORM SIGN AB TIMES SHESH
+12014 ; [.29FC.0020.0002.12014] # CUNEIFORM SIGN AB TIMES U PLUS U PLUS U
+12015 ; [.29FD.0020.0002.12015] # CUNEIFORM SIGN AB GUNU
+12016 ; [.29FE.0020.0002.12016] # CUNEIFORM SIGN AB2
+12017 ; [.29FF.0020.0002.12017] # CUNEIFORM SIGN AB2 TIMES BALAG
+12018 ; [.2A00.0020.0002.12018] # CUNEIFORM SIGN AB2 TIMES GAN2 TENU
+12019 ; [.2A01.0020.0002.12019] # CUNEIFORM SIGN AB2 TIMES ME PLUS EN
+1201A ; [.2A02.0020.0002.1201A] # CUNEIFORM SIGN AB2 TIMES SHA3
+1201B ; [.2A03.0020.0002.1201B] # CUNEIFORM SIGN AB2 TIMES TAK4
+1201C ; [.2A04.0020.0002.1201C] # CUNEIFORM SIGN AD
+1201D ; [.2A05.0020.0002.1201D] # CUNEIFORM SIGN AK
+1201E ; [.2A06.0020.0002.1201E] # CUNEIFORM SIGN AK TIMES ERIN2
+1201F ; [.2A07.0020.0002.1201F] # CUNEIFORM SIGN AK TIMES SHITA PLUS GISH
+12020 ; [.2A08.0020.0002.12020] # CUNEIFORM SIGN AL
+12021 ; [.2A09.0020.0002.12021] # CUNEIFORM SIGN AL TIMES AL
+12022 ; [.2A0A.0020.0002.12022] # CUNEIFORM SIGN AL TIMES DIM2
+12023 ; [.2A0B.0020.0002.12023] # CUNEIFORM SIGN AL TIMES GISH
+12024 ; [.2A0C.0020.0002.12024] # CUNEIFORM SIGN AL TIMES HA
+12025 ; [.2A0D.0020.0002.12025] # CUNEIFORM SIGN AL TIMES KAD3
+12026 ; [.2A0E.0020.0002.12026] # CUNEIFORM SIGN AL TIMES KI
+12027 ; [.2A0F.0020.0002.12027] # CUNEIFORM SIGN AL TIMES SHE
+12028 ; [.2A10.0020.0002.12028] # CUNEIFORM SIGN AL TIMES USH
+12029 ; [.2A11.0020.0002.12029] # CUNEIFORM SIGN ALAN
+1202A ; [.2A12.0020.0002.1202A] # CUNEIFORM SIGN ALEPH
+1202B ; [.2A13.0020.0002.1202B] # CUNEIFORM SIGN AMAR
+1202C ; [.2A14.0020.0002.1202C] # CUNEIFORM SIGN AMAR TIMES SHE
+1202D ; [.2A15.0020.0002.1202D] # CUNEIFORM SIGN AN
+1202E ; [.2A16.0020.0002.1202E] # CUNEIFORM SIGN AN OVER AN
+1202F ; [.2A17.0020.0002.1202F] # CUNEIFORM SIGN AN THREE TIMES
+12030 ; [.2A18.0020.0002.12030] # CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA
+12031 ; [.2A19.0020.0002.12031] # CUNEIFORM SIGN AN PLUS NAGA SQUARED
+12032 ; [.2A1A.0020.0002.12032] # CUNEIFORM SIGN ANSHE
+12033 ; [.2A1B.0020.0002.12033] # CUNEIFORM SIGN APIN
+12034 ; [.2A1C.0020.0002.12034] # CUNEIFORM SIGN ARAD
+12035 ; [.2A1D.0020.0002.12035] # CUNEIFORM SIGN ARAD TIMES KUR
+12036 ; [.2A1E.0020.0002.12036] # CUNEIFORM SIGN ARKAB
+12037 ; [.2A1F.0020.0002.12037] # CUNEIFORM SIGN ASAL2
+12038 ; [.2A20.0020.0002.12038] # CUNEIFORM SIGN ASH
+12039 ; [.2A21.0020.0002.12039] # CUNEIFORM SIGN ASH ZIDA TENU
+1203A ; [.2A22.0020.0002.1203A] # CUNEIFORM SIGN ASH KABA TENU
+1203B ; [.2A23.0020.0002.1203B] # CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP
+1203C ; [.2A24.0020.0002.1203C] # CUNEIFORM SIGN ASH OVER ASH OVER ASH
+1203D ; [.2A25.0020.0002.1203D] # CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH
+1203E ; [.2A26.0020.0002.1203E] # CUNEIFORM SIGN ASH2
+1203F ; [.2A27.0020.0002.1203F] # CUNEIFORM SIGN ASHGAB
+12040 ; [.2A28.0020.0002.12040] # CUNEIFORM SIGN BA
+12041 ; [.2A29.0020.0002.12041] # CUNEIFORM SIGN BAD
+12042 ; [.2A2A.0020.0002.12042] # CUNEIFORM SIGN BAG3
+12043 ; [.2A2B.0020.0002.12043] # CUNEIFORM SIGN BAHAR2
+12044 ; [.2A2C.0020.0002.12044] # CUNEIFORM SIGN BAL
+12045 ; [.2A2D.0020.0002.12045] # CUNEIFORM SIGN BAL OVER BAL
+12046 ; [.2A2E.0020.0002.12046] # CUNEIFORM SIGN BALAG
+12047 ; [.2A2F.0020.0002.12047] # CUNEIFORM SIGN BAR
+12048 ; [.2A30.0020.0002.12048] # CUNEIFORM SIGN BARA2
+12049 ; [.2A31.0020.0002.12049] # CUNEIFORM SIGN BI
+1204A ; [.2A32.0020.0002.1204A] # CUNEIFORM SIGN BI TIMES A
+1204B ; [.2A33.0020.0002.1204B] # CUNEIFORM SIGN BI TIMES GAR
+1204C ; [.2A34.0020.0002.1204C] # CUNEIFORM SIGN BI TIMES IGI GUNU
+1204D ; [.2A35.0020.0002.1204D] # CUNEIFORM SIGN BU
+1204E ; [.2A36.0020.0002.1204E] # CUNEIFORM SIGN BU OVER BU AB
+1204F ; [.2A37.0020.0002.1204F] # CUNEIFORM SIGN BU OVER BU UN
+12050 ; [.2A38.0020.0002.12050] # CUNEIFORM SIGN BU CROSSING BU
+12051 ; [.2A39.0020.0002.12051] # CUNEIFORM SIGN BULUG
+12052 ; [.2A3A.0020.0002.12052] # CUNEIFORM SIGN BULUG OVER BULUG
+12053 ; [.2A3B.0020.0002.12053] # CUNEIFORM SIGN BUR
+12054 ; [.2A3C.0020.0002.12054] # CUNEIFORM SIGN BUR2
+12055 ; [.2A3D.0020.0002.12055] # CUNEIFORM SIGN DA
+12056 ; [.2A3E.0020.0002.12056] # CUNEIFORM SIGN DAG
+12057 ; [.2A3F.0020.0002.12057] # CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH
+12058 ; [.2A40.0020.0002.12058] # CUNEIFORM SIGN DAG KISIM5 TIMES AMAR
+12059 ; [.2A41.0020.0002.12059] # CUNEIFORM SIGN DAG KISIM5 TIMES BALAG
+1205A ; [.2A42.0020.0002.1205A] # CUNEIFORM SIGN DAG KISIM5 TIMES BI
+1205B ; [.2A43.0020.0002.1205B] # CUNEIFORM SIGN DAG KISIM5 TIMES GA
+1205C ; [.2A44.0020.0002.1205C] # CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH
+1205D ; [.2A45.0020.0002.1205D] # CUNEIFORM SIGN DAG KISIM5 TIMES GI
+1205E ; [.2A46.0020.0002.1205E] # CUNEIFORM SIGN DAG KISIM5 TIMES GIR2
+1205F ; [.2A47.0020.0002.1205F] # CUNEIFORM SIGN DAG KISIM5 TIMES GUD
+12060 ; [.2A48.0020.0002.12060] # CUNEIFORM SIGN DAG KISIM5 TIMES HA
+12061 ; [.2A49.0020.0002.12061] # CUNEIFORM SIGN DAG KISIM5 TIMES IR
+12062 ; [.2A4A.0020.0002.12062] # CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU
+12063 ; [.2A4B.0020.0002.12063] # CUNEIFORM SIGN DAG KISIM5 TIMES KAK
+12064 ; [.2A4C.0020.0002.12064] # CUNEIFORM SIGN DAG KISIM5 TIMES LA
+12065 ; [.2A4D.0020.0002.12065] # CUNEIFORM SIGN DAG KISIM5 TIMES LU
+12066 ; [.2A4E.0020.0002.12066] # CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2
+12067 ; [.2A4F.0020.0002.12067] # CUNEIFORM SIGN DAG KISIM5 TIMES LUM
+12068 ; [.2A50.0020.0002.12068] # CUNEIFORM SIGN DAG KISIM5 TIMES NE
+12069 ; [.2A51.0020.0002.12069] # CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP
+1206A ; [.2A52.0020.0002.1206A] # CUNEIFORM SIGN DAG KISIM5 TIMES SI
+1206B ; [.2A53.0020.0002.1206B] # CUNEIFORM SIGN DAG KISIM5 TIMES TAK4
+1206C ; [.2A54.0020.0002.1206C] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2
+1206D ; [.2A55.0020.0002.1206D] # CUNEIFORM SIGN DAG KISIM5 TIMES USH
+1206E ; [.2A56.0020.0002.1206E] # CUNEIFORM SIGN DAM
+1206F ; [.2A57.0020.0002.1206F] # CUNEIFORM SIGN DAR
+12070 ; [.2A58.0020.0002.12070] # CUNEIFORM SIGN DARA3
+12071 ; [.2A59.0020.0002.12071] # CUNEIFORM SIGN DARA4
+12072 ; [.2A5A.0020.0002.12072] # CUNEIFORM SIGN DI
+12073 ; [.2A5B.0020.0002.12073] # CUNEIFORM SIGN DIB
+12074 ; [.2A5C.0020.0002.12074] # CUNEIFORM SIGN DIM
+12075 ; [.2A5D.0020.0002.12075] # CUNEIFORM SIGN DIM TIMES SHE
+12076 ; [.2A5E.0020.0002.12076] # CUNEIFORM SIGN DIM2
+12077 ; [.2A5F.0020.0002.12077] # CUNEIFORM SIGN DIN
+12078 ; [.2A60.0020.0002.12078] # CUNEIFORM SIGN DIN KASKAL U GUNU DISH
+12079 ; [.2A61.0020.0002.12079] # CUNEIFORM SIGN DISH
+1207A ; [.2A62.0020.0002.1207A] # CUNEIFORM SIGN DU
+1207B ; [.2A63.0020.0002.1207B] # CUNEIFORM SIGN DU OVER DU
+1207C ; [.2A64.0020.0002.1207C] # CUNEIFORM SIGN DU GUNU
+1207D ; [.2A65.0020.0002.1207D] # CUNEIFORM SIGN DU SHESHIG
+1207E ; [.2A66.0020.0002.1207E] # CUNEIFORM SIGN DUB
+1207F ; [.2A67.0020.0002.1207F] # CUNEIFORM SIGN DUB TIMES ESH2
+12080 ; [.2A68.0020.0002.12080] # CUNEIFORM SIGN DUB2
+12081 ; [.2A69.0020.0002.12081] # CUNEIFORM SIGN DUG
+12082 ; [.2A6A.0020.0002.12082] # CUNEIFORM SIGN DUGUD
+12083 ; [.2A6B.0020.0002.12083] # CUNEIFORM SIGN DUH
+12084 ; [.2A6C.0020.0002.12084] # CUNEIFORM SIGN DUN
+12085 ; [.2A6D.0020.0002.12085] # CUNEIFORM SIGN DUN3
+12086 ; [.2A6E.0020.0002.12086] # CUNEIFORM SIGN DUN3 GUNU
+12087 ; [.2A6F.0020.0002.12087] # CUNEIFORM SIGN DUN3 GUNU GUNU
+12088 ; [.2A70.0020.0002.12088] # CUNEIFORM SIGN DUN4
+12089 ; [.2A71.0020.0002.12089] # CUNEIFORM SIGN DUR2
+1208A ; [.2A72.0020.0002.1208A] # CUNEIFORM SIGN E
+1208B ; [.2A73.0020.0002.1208B] # CUNEIFORM SIGN E TIMES PAP
+1208C ; [.2A74.0020.0002.1208C] # CUNEIFORM SIGN E OVER E NUN OVER NUN
+1208D ; [.2A75.0020.0002.1208D] # CUNEIFORM SIGN E2
+1208E ; [.2A76.0020.0002.1208E] # CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA
+1208F ; [.2A77.0020.0002.1208F] # CUNEIFORM SIGN E2 TIMES GAR
+12090 ; [.2A78.0020.0002.12090] # CUNEIFORM SIGN E2 TIMES MI
+12091 ; [.2A79.0020.0002.12091] # CUNEIFORM SIGN E2 TIMES SAL
+12092 ; [.2A7A.0020.0002.12092] # CUNEIFORM SIGN E2 TIMES SHE
+12093 ; [.2A7B.0020.0002.12093] # CUNEIFORM SIGN E2 TIMES U
+12094 ; [.2A7C.0020.0002.12094] # CUNEIFORM SIGN EDIN
+12095 ; [.2A7D.0020.0002.12095] # CUNEIFORM SIGN EGIR
+12096 ; [.2A7E.0020.0002.12096] # CUNEIFORM SIGN EL
+12097 ; [.2A7F.0020.0002.12097] # CUNEIFORM SIGN EN
+12098 ; [.2A80.0020.0002.12098] # CUNEIFORM SIGN EN TIMES GAN2
+12099 ; [.2A81.0020.0002.12099] # CUNEIFORM SIGN EN TIMES GAN2 TENU
+1209A ; [.2A82.0020.0002.1209A] # CUNEIFORM SIGN EN TIMES ME
+1209B ; [.2A83.0020.0002.1209B] # CUNEIFORM SIGN EN CROSSING EN
+1209C ; [.2A84.0020.0002.1209C] # CUNEIFORM SIGN EN OPPOSING EN
+1209D ; [.2A85.0020.0002.1209D] # CUNEIFORM SIGN EN SQUARED
+1209E ; [.2A86.0020.0002.1209E] # CUNEIFORM SIGN EREN
+1209F ; [.2A87.0020.0002.1209F] # CUNEIFORM SIGN ERIN2
+120A0 ; [.2A88.0020.0002.120A0] # CUNEIFORM SIGN ESH2
+120A1 ; [.2A89.0020.0002.120A1] # CUNEIFORM SIGN EZEN
+120A2 ; [.2A8A.0020.0002.120A2] # CUNEIFORM SIGN EZEN TIMES A
+120A3 ; [.2A8B.0020.0002.120A3] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL
+120A4 ; [.2A8C.0020.0002.120A4] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL
+120A5 ; [.2A8D.0020.0002.120A5] # CUNEIFORM SIGN EZEN TIMES AN
+120A6 ; [.2A8E.0020.0002.120A6] # CUNEIFORM SIGN EZEN TIMES BAD
+120A7 ; [.2A8F.0020.0002.120A7] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU
+120A8 ; [.2A90.0020.0002.120A8] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU
+120A9 ; [.2A91.0020.0002.120A9] # CUNEIFORM SIGN EZEN TIMES HA
+120AA ; [.2A92.0020.0002.120AA] # CUNEIFORM SIGN EZEN TIMES HA GUNU
+120AB ; [.2A93.0020.0002.120AB] # CUNEIFORM SIGN EZEN TIMES IGI GUNU
+120AC ; [.2A94.0020.0002.120AC] # CUNEIFORM SIGN EZEN TIMES KASKAL
+120AD ; [.2A95.0020.0002.120AD] # CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED
+120AE ; [.2A96.0020.0002.120AE] # CUNEIFORM SIGN EZEN TIMES KU3
+120AF ; [.2A97.0020.0002.120AF] # CUNEIFORM SIGN EZEN TIMES LA
+120B0 ; [.2A98.0020.0002.120B0] # CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL
+120B1 ; [.2A99.0020.0002.120B1] # CUNEIFORM SIGN EZEN TIMES LI
+120B2 ; [.2A9A.0020.0002.120B2] # CUNEIFORM SIGN EZEN TIMES LU
+120B3 ; [.2A9B.0020.0002.120B3] # CUNEIFORM SIGN EZEN TIMES U2
+120B4 ; [.2A9C.0020.0002.120B4] # CUNEIFORM SIGN EZEN TIMES UD
+120B5 ; [.2A9D.0020.0002.120B5] # CUNEIFORM SIGN GA
+120B6 ; [.2A9E.0020.0002.120B6] # CUNEIFORM SIGN GA GUNU
+120B7 ; [.2A9F.0020.0002.120B7] # CUNEIFORM SIGN GA2
+120B8 ; [.2AA0.0020.0002.120B8] # CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA
+120B9 ; [.2AA1.0020.0002.120B9] # CUNEIFORM SIGN GA2 TIMES A PLUS HA
+120BA ; [.2AA2.0020.0002.120BA] # CUNEIFORM SIGN GA2 TIMES A PLUS IGI
+120BB ; [.2AA3.0020.0002.120BB] # CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB
+120BC ; [.2AA4.0020.0002.120BC] # CUNEIFORM SIGN GA2 TIMES AN
+120BD ; [.2AA5.0020.0002.120BD] # CUNEIFORM SIGN GA2 TIMES ASH
+120BE ; [.2AA6.0020.0002.120BE] # CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL
+120BF ; [.2AA7.0020.0002.120BF] # CUNEIFORM SIGN GA2 TIMES BAD
+120C0 ; [.2AA8.0020.0002.120C0] # CUNEIFORM SIGN GA2 TIMES BAR PLUS RA
+120C1 ; [.2AA9.0020.0002.120C1] # CUNEIFORM SIGN GA2 TIMES BUR
+120C2 ; [.2AAA.0020.0002.120C2] # CUNEIFORM SIGN GA2 TIMES BUR PLUS RA
+120C3 ; [.2AAB.0020.0002.120C3] # CUNEIFORM SIGN GA2 TIMES DA
+120C4 ; [.2AAC.0020.0002.120C4] # CUNEIFORM SIGN GA2 TIMES DI
+120C5 ; [.2AAD.0020.0002.120C5] # CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE
+120C6 ; [.2AAE.0020.0002.120C6] # CUNEIFORM SIGN GA2 TIMES DUB
+120C7 ; [.2AAF.0020.0002.120C7] # CUNEIFORM SIGN GA2 TIMES EL
+120C8 ; [.2AB0.0020.0002.120C8] # CUNEIFORM SIGN GA2 TIMES EL PLUS LA
+120C9 ; [.2AB1.0020.0002.120C9] # CUNEIFORM SIGN GA2 TIMES EN
+120CA ; [.2AB2.0020.0002.120CA] # CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU
+120CB ; [.2AB3.0020.0002.120CB] # CUNEIFORM SIGN GA2 TIMES GAN2 TENU
+120CC ; [.2AB4.0020.0002.120CC] # CUNEIFORM SIGN GA2 TIMES GAR
+120CD ; [.2AB5.0020.0002.120CD] # CUNEIFORM SIGN GA2 TIMES GI
+120CE ; [.2AB6.0020.0002.120CE] # CUNEIFORM SIGN GA2 TIMES GI4
+120CF ; [.2AB7.0020.0002.120CF] # CUNEIFORM SIGN GA2 TIMES GI4 PLUS A
+120D0 ; [.2AB8.0020.0002.120D0] # CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU
+120D1 ; [.2AB9.0020.0002.120D1] # CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2
+120D2 ; [.2ABA.0020.0002.120D2] # CUNEIFORM SIGN GA2 TIMES HAL
+120D3 ; [.2ABB.0020.0002.120D3] # CUNEIFORM SIGN GA2 TIMES HAL PLUS LA
+120D4 ; [.2ABC.0020.0002.120D4] # CUNEIFORM SIGN GA2 TIMES HI PLUS LI
+120D5 ; [.2ABD.0020.0002.120D5] # CUNEIFORM SIGN GA2 TIMES HUB2
+120D6 ; [.2ABE.0020.0002.120D6] # CUNEIFORM SIGN GA2 TIMES IGI GUNU
+120D7 ; [.2ABF.0020.0002.120D7] # CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH
+120D8 ; [.2AC0.0020.0002.120D8] # CUNEIFORM SIGN GA2 TIMES KAK
+120D9 ; [.2AC1.0020.0002.120D9] # CUNEIFORM SIGN GA2 TIMES KASKAL
+120DA ; [.2AC2.0020.0002.120DA] # CUNEIFORM SIGN GA2 TIMES KID
+120DB ; [.2AC3.0020.0002.120DB] # CUNEIFORM SIGN GA2 TIMES KID PLUS LAL
+120DC ; [.2AC4.0020.0002.120DC] # CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN
+120DD ; [.2AC5.0020.0002.120DD] # CUNEIFORM SIGN GA2 TIMES LA
+120DE ; [.2AC6.0020.0002.120DE] # CUNEIFORM SIGN GA2 TIMES ME PLUS EN
+120DF ; [.2AC7.0020.0002.120DF] # CUNEIFORM SIGN GA2 TIMES MI
+120E0 ; [.2AC8.0020.0002.120E0] # CUNEIFORM SIGN GA2 TIMES NUN
+120E1 ; [.2AC9.0020.0002.120E1] # CUNEIFORM SIGN GA2 TIMES NUN OVER NUN
+120E2 ; [.2ACA.0020.0002.120E2] # CUNEIFORM SIGN GA2 TIMES PA
+120E3 ; [.2ACB.0020.0002.120E3] # CUNEIFORM SIGN GA2 TIMES SAL
+120E4 ; [.2ACC.0020.0002.120E4] # CUNEIFORM SIGN GA2 TIMES SAR
+120E5 ; [.2ACD.0020.0002.120E5] # CUNEIFORM SIGN GA2 TIMES SHE
+120E6 ; [.2ACE.0020.0002.120E6] # CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR
+120E7 ; [.2ACF.0020.0002.120E7] # CUNEIFORM SIGN GA2 TIMES SHID
+120E8 ; [.2AD0.0020.0002.120E8] # CUNEIFORM SIGN GA2 TIMES SUM
+120E9 ; [.2AD1.0020.0002.120E9] # CUNEIFORM SIGN GA2 TIMES TAK4
+120EA ; [.2AD2.0020.0002.120EA] # CUNEIFORM SIGN GA2 TIMES U
+120EB ; [.2AD3.0020.0002.120EB] # CUNEIFORM SIGN GA2 TIMES UD
+120EC ; [.2AD4.0020.0002.120EC] # CUNEIFORM SIGN GA2 TIMES UD PLUS DU
+120ED ; [.2AD5.0020.0002.120ED] # CUNEIFORM SIGN GA2 OVER GA2
+120EE ; [.2AD6.0020.0002.120EE] # CUNEIFORM SIGN GABA
+120EF ; [.2AD7.0020.0002.120EF] # CUNEIFORM SIGN GABA CROSSING GABA
+120F0 ; [.2AD8.0020.0002.120F0] # CUNEIFORM SIGN GAD
+120F1 ; [.2AD9.0020.0002.120F1] # CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR
+120F2 ; [.2ADA.0020.0002.120F2] # CUNEIFORM SIGN GAL
+120F3 ; [.2ADB.0020.0002.120F3] # CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR
+120F4 ; [.2ADC.0020.0002.120F4] # CUNEIFORM SIGN GALAM
+120F5 ; [.2ADD.0020.0002.120F5] # CUNEIFORM SIGN GAM
+120F6 ; [.2ADE.0020.0002.120F6] # CUNEIFORM SIGN GAN
+120F7 ; [.2ADF.0020.0002.120F7] # CUNEIFORM SIGN GAN2
+120F8 ; [.2AE0.0020.0002.120F8] # CUNEIFORM SIGN GAN2 TENU
+120F9 ; [.2AE1.0020.0002.120F9] # CUNEIFORM SIGN GAN2 OVER GAN2
+120FA ; [.2AE2.0020.0002.120FA] # CUNEIFORM SIGN GAN2 CROSSING GAN2
+120FB ; [.2AE3.0020.0002.120FB] # CUNEIFORM SIGN GAR
+120FC ; [.2AE4.0020.0002.120FC] # CUNEIFORM SIGN GAR3
+120FD ; [.2AE5.0020.0002.120FD] # CUNEIFORM SIGN GASHAN
+120FE ; [.2AE6.0020.0002.120FE] # CUNEIFORM SIGN GESHTIN
+120FF ; [.2AE7.0020.0002.120FF] # CUNEIFORM SIGN GESHTIN TIMES KUR
+12100 ; [.2AE8.0020.0002.12100] # CUNEIFORM SIGN GI
+12101 ; [.2AE9.0020.0002.12101] # CUNEIFORM SIGN GI TIMES E
+12102 ; [.2AEA.0020.0002.12102] # CUNEIFORM SIGN GI TIMES U
+12103 ; [.2AEB.0020.0002.12103] # CUNEIFORM SIGN GI CROSSING GI
+12104 ; [.2AEC.0020.0002.12104] # CUNEIFORM SIGN GI4
+12105 ; [.2AED.0020.0002.12105] # CUNEIFORM SIGN GI4 OVER GI4
+12106 ; [.2AEE.0020.0002.12106] # CUNEIFORM SIGN GI4 CROSSING GI4
+12107 ; [.2AEF.0020.0002.12107] # CUNEIFORM SIGN GIDIM
+12108 ; [.2AF0.0020.0002.12108] # CUNEIFORM SIGN GIR2
+12109 ; [.2AF1.0020.0002.12109] # CUNEIFORM SIGN GIR2 GUNU
+1210A ; [.2AF2.0020.0002.1210A] # CUNEIFORM SIGN GIR3
+1210B ; [.2AF3.0020.0002.1210B] # CUNEIFORM SIGN GIR3 TIMES A PLUS IGI
+1210C ; [.2AF4.0020.0002.1210C] # CUNEIFORM SIGN GIR3 TIMES GAN2 TENU
+1210D ; [.2AF5.0020.0002.1210D] # CUNEIFORM SIGN GIR3 TIMES IGI
+1210E ; [.2AF6.0020.0002.1210E] # CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI
+1210F ; [.2AF7.0020.0002.1210F] # CUNEIFORM SIGN GIR3 TIMES PA
+12110 ; [.2AF8.0020.0002.12110] # CUNEIFORM SIGN GISAL
+12111 ; [.2AF9.0020.0002.12111] # CUNEIFORM SIGN GISH
+12112 ; [.2AFA.0020.0002.12112] # CUNEIFORM SIGN GISH CROSSING GISH
+12113 ; [.2AFB.0020.0002.12113] # CUNEIFORM SIGN GISH TIMES BAD
+12114 ; [.2AFC.0020.0002.12114] # CUNEIFORM SIGN GISH TIMES TAK4
+12115 ; [.2AFD.0020.0002.12115] # CUNEIFORM SIGN GISH TENU
+12116 ; [.2AFE.0020.0002.12116] # CUNEIFORM SIGN GU
+12117 ; [.2AFF.0020.0002.12117] # CUNEIFORM SIGN GU CROSSING GU
+12118 ; [.2B00.0020.0002.12118] # CUNEIFORM SIGN GU2
+12119 ; [.2B01.0020.0002.12119] # CUNEIFORM SIGN GU2 TIMES KAK
+1211A ; [.2B02.0020.0002.1211A] # CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU
+1211B ; [.2B03.0020.0002.1211B] # CUNEIFORM SIGN GU2 TIMES NUN
+1211C ; [.2B04.0020.0002.1211C] # CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2
+1211D ; [.2B05.0020.0002.1211D] # CUNEIFORM SIGN GU2 GUNU
+1211E ; [.2B06.0020.0002.1211E] # CUNEIFORM SIGN GUD
+1211F ; [.2B07.0020.0002.1211F] # CUNEIFORM SIGN GUD TIMES A PLUS KUR
+12120 ; [.2B08.0020.0002.12120] # CUNEIFORM SIGN GUD TIMES KUR
+12121 ; [.2B09.0020.0002.12121] # CUNEIFORM SIGN GUD OVER GUD LUGAL
+12122 ; [.2B0A.0020.0002.12122] # CUNEIFORM SIGN GUL
+12123 ; [.2B0B.0020.0002.12123] # CUNEIFORM SIGN GUM
+12124 ; [.2B0C.0020.0002.12124] # CUNEIFORM SIGN GUM TIMES SHE
+12125 ; [.2B0D.0020.0002.12125] # CUNEIFORM SIGN GUR
+12126 ; [.2B0E.0020.0002.12126] # CUNEIFORM SIGN GUR7
+12127 ; [.2B0F.0020.0002.12127] # CUNEIFORM SIGN GURUN
+12128 ; [.2B10.0020.0002.12128] # CUNEIFORM SIGN GURUSH
+12129 ; [.2B11.0020.0002.12129] # CUNEIFORM SIGN HA
+1212A ; [.2B12.0020.0002.1212A] # CUNEIFORM SIGN HA TENU
+1212B ; [.2B13.0020.0002.1212B] # CUNEIFORM SIGN HA GUNU
+1212C ; [.2B14.0020.0002.1212C] # CUNEIFORM SIGN HAL
+1212D ; [.2B15.0020.0002.1212D] # CUNEIFORM SIGN HI
+1212E ; [.2B16.0020.0002.1212E] # CUNEIFORM SIGN HI TIMES ASH
+1212F ; [.2B17.0020.0002.1212F] # CUNEIFORM SIGN HI TIMES ASH2
+12130 ; [.2B18.0020.0002.12130] # CUNEIFORM SIGN HI TIMES BAD
+12131 ; [.2B19.0020.0002.12131] # CUNEIFORM SIGN HI TIMES DISH
+12132 ; [.2B1A.0020.0002.12132] # CUNEIFORM SIGN HI TIMES GAD
+12133 ; [.2B1B.0020.0002.12133] # CUNEIFORM SIGN HI TIMES KIN
+12134 ; [.2B1C.0020.0002.12134] # CUNEIFORM SIGN HI TIMES NUN
+12135 ; [.2B1D.0020.0002.12135] # CUNEIFORM SIGN HI TIMES SHE
+12136 ; [.2B1E.0020.0002.12136] # CUNEIFORM SIGN HI TIMES U
+12137 ; [.2B1F.0020.0002.12137] # CUNEIFORM SIGN HU
+12138 ; [.2B20.0020.0002.12138] # CUNEIFORM SIGN HUB2
+12139 ; [.2B21.0020.0002.12139] # CUNEIFORM SIGN HUB2 TIMES AN
+1213A ; [.2B22.0020.0002.1213A] # CUNEIFORM SIGN HUB2 TIMES HAL
+1213B ; [.2B23.0020.0002.1213B] # CUNEIFORM SIGN HUB2 TIMES KASKAL
+1213C ; [.2B24.0020.0002.1213C] # CUNEIFORM SIGN HUB2 TIMES LISH
+1213D ; [.2B25.0020.0002.1213D] # CUNEIFORM SIGN HUB2 TIMES UD
+1213E ; [.2B26.0020.0002.1213E] # CUNEIFORM SIGN HUL2
+1213F ; [.2B27.0020.0002.1213F] # CUNEIFORM SIGN I
+12140 ; [.2B28.0020.0002.12140] # CUNEIFORM SIGN I A
+12141 ; [.2B29.0020.0002.12141] # CUNEIFORM SIGN IB
+12142 ; [.2B2A.0020.0002.12142] # CUNEIFORM SIGN IDIM
+12143 ; [.2B2B.0020.0002.12143] # CUNEIFORM SIGN IDIM OVER IDIM BUR
+12144 ; [.2B2C.0020.0002.12144] # CUNEIFORM SIGN IDIM OVER IDIM SQUARED
+12145 ; [.2B2D.0020.0002.12145] # CUNEIFORM SIGN IG
+12146 ; [.2B2E.0020.0002.12146] # CUNEIFORM SIGN IGI
+12147 ; [.2B2F.0020.0002.12147] # CUNEIFORM SIGN IGI DIB
+12148 ; [.2B30.0020.0002.12148] # CUNEIFORM SIGN IGI RI
+12149 ; [.2B31.0020.0002.12149] # CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD
+1214A ; [.2B32.0020.0002.1214A] # CUNEIFORM SIGN IGI GUNU
+1214B ; [.2B33.0020.0002.1214B] # CUNEIFORM SIGN IL
+1214C ; [.2B34.0020.0002.1214C] # CUNEIFORM SIGN IL TIMES GAN2 TENU
+1214D ; [.2B35.0020.0002.1214D] # CUNEIFORM SIGN IL2
+1214E ; [.2B36.0020.0002.1214E] # CUNEIFORM SIGN IM
+1214F ; [.2B37.0020.0002.1214F] # CUNEIFORM SIGN IM TIMES TAK4
+12150 ; [.2B38.0020.0002.12150] # CUNEIFORM SIGN IM CROSSING IM
+12151 ; [.2B39.0020.0002.12151] # CUNEIFORM SIGN IM OPPOSING IM
+12152 ; [.2B3A.0020.0002.12152] # CUNEIFORM SIGN IM SQUARED
+12153 ; [.2B3B.0020.0002.12153] # CUNEIFORM SIGN IMIN
+12154 ; [.2B3C.0020.0002.12154] # CUNEIFORM SIGN IN
+12155 ; [.2B3D.0020.0002.12155] # CUNEIFORM SIGN IR
+12156 ; [.2B3E.0020.0002.12156] # CUNEIFORM SIGN ISH
+12157 ; [.2B3F.0020.0002.12157] # CUNEIFORM SIGN KA
+12158 ; [.2B40.0020.0002.12158] # CUNEIFORM SIGN KA TIMES A
+12159 ; [.2B41.0020.0002.12159] # CUNEIFORM SIGN KA TIMES AD
+1215A ; [.2B42.0020.0002.1215A] # CUNEIFORM SIGN KA TIMES AD PLUS KU3
+1215B ; [.2B43.0020.0002.1215B] # CUNEIFORM SIGN KA TIMES ASH2
+1215C ; [.2B44.0020.0002.1215C] # CUNEIFORM SIGN KA TIMES BAD
+1215D ; [.2B45.0020.0002.1215D] # CUNEIFORM SIGN KA TIMES BALAG
+1215E ; [.2B46.0020.0002.1215E] # CUNEIFORM SIGN KA TIMES BAR
+1215F ; [.2B47.0020.0002.1215F] # CUNEIFORM SIGN KA TIMES BI
+12160 ; [.2B48.0020.0002.12160] # CUNEIFORM SIGN KA TIMES ERIN2
+12161 ; [.2B49.0020.0002.12161] # CUNEIFORM SIGN KA TIMES ESH2
+12162 ; [.2B4A.0020.0002.12162] # CUNEIFORM SIGN KA TIMES GA
+12163 ; [.2B4B.0020.0002.12163] # CUNEIFORM SIGN KA TIMES GAL
+12164 ; [.2B4C.0020.0002.12164] # CUNEIFORM SIGN KA TIMES GAN2 TENU
+12165 ; [.2B4D.0020.0002.12165] # CUNEIFORM SIGN KA TIMES GAR
+12166 ; [.2B4E.0020.0002.12166] # CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A
+12167 ; [.2B4F.0020.0002.12167] # CUNEIFORM SIGN KA TIMES GI
+12168 ; [.2B50.0020.0002.12168] # CUNEIFORM SIGN KA TIMES GIR2
+12169 ; [.2B51.0020.0002.12169] # CUNEIFORM SIGN KA TIMES GISH PLUS SAR
+1216A ; [.2B52.0020.0002.1216A] # CUNEIFORM SIGN KA TIMES GISH CROSSING GISH
+1216B ; [.2B53.0020.0002.1216B] # CUNEIFORM SIGN KA TIMES GU
+1216C ; [.2B54.0020.0002.1216C] # CUNEIFORM SIGN KA TIMES GUR7
+1216D ; [.2B55.0020.0002.1216D] # CUNEIFORM SIGN KA TIMES IGI
+1216E ; [.2B56.0020.0002.1216E] # CUNEIFORM SIGN KA TIMES IM
+1216F ; [.2B57.0020.0002.1216F] # CUNEIFORM SIGN KA TIMES KAK
+12170 ; [.2B58.0020.0002.12170] # CUNEIFORM SIGN KA TIMES KI
+12171 ; [.2B59.0020.0002.12171] # CUNEIFORM SIGN KA TIMES KID
+12172 ; [.2B5A.0020.0002.12172] # CUNEIFORM SIGN KA TIMES LI
+12173 ; [.2B5B.0020.0002.12173] # CUNEIFORM SIGN KA TIMES LU
+12174 ; [.2B5C.0020.0002.12174] # CUNEIFORM SIGN KA TIMES ME
+12175 ; [.2B5D.0020.0002.12175] # CUNEIFORM SIGN KA TIMES ME PLUS DU
+12176 ; [.2B5E.0020.0002.12176] # CUNEIFORM SIGN KA TIMES ME PLUS GI
+12177 ; [.2B5F.0020.0002.12177] # CUNEIFORM SIGN KA TIMES ME PLUS TE
+12178 ; [.2B60.0020.0002.12178] # CUNEIFORM SIGN KA TIMES MI
+12179 ; [.2B61.0020.0002.12179] # CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ
+1217A ; [.2B62.0020.0002.1217A] # CUNEIFORM SIGN KA TIMES NE
+1217B ; [.2B63.0020.0002.1217B] # CUNEIFORM SIGN KA TIMES NUN
+1217C ; [.2B64.0020.0002.1217C] # CUNEIFORM SIGN KA TIMES PI
+1217D ; [.2B65.0020.0002.1217D] # CUNEIFORM SIGN KA TIMES RU
+1217E ; [.2B66.0020.0002.1217E] # CUNEIFORM SIGN KA TIMES SA
+1217F ; [.2B67.0020.0002.1217F] # CUNEIFORM SIGN KA TIMES SAR
+12180 ; [.2B68.0020.0002.12180] # CUNEIFORM SIGN KA TIMES SHA
+12181 ; [.2B69.0020.0002.12181] # CUNEIFORM SIGN KA TIMES SHE
+12182 ; [.2B6A.0020.0002.12182] # CUNEIFORM SIGN KA TIMES SHID
+12183 ; [.2B6B.0020.0002.12183] # CUNEIFORM SIGN KA TIMES SHU
+12184 ; [.2B6C.0020.0002.12184] # CUNEIFORM SIGN KA TIMES SIG
+12185 ; [.2B6D.0020.0002.12185] # CUNEIFORM SIGN KA TIMES SUHUR
+12186 ; [.2B6E.0020.0002.12186] # CUNEIFORM SIGN KA TIMES TAR
+12187 ; [.2B6F.0020.0002.12187] # CUNEIFORM SIGN KA TIMES U
+12188 ; [.2B70.0020.0002.12188] # CUNEIFORM SIGN KA TIMES U2
+12189 ; [.2B71.0020.0002.12189] # CUNEIFORM SIGN KA TIMES UD
+1218A ; [.2B72.0020.0002.1218A] # CUNEIFORM SIGN KA TIMES UMUM TIMES PA
+1218B ; [.2B73.0020.0002.1218B] # CUNEIFORM SIGN KA TIMES USH
+1218C ; [.2B74.0020.0002.1218C] # CUNEIFORM SIGN KA TIMES ZI
+1218D ; [.2B75.0020.0002.1218D] # CUNEIFORM SIGN KA2
+1218E ; [.2B76.0020.0002.1218E] # CUNEIFORM SIGN KA2 CROSSING KA2
+1218F ; [.2B77.0020.0002.1218F] # CUNEIFORM SIGN KAB
+12190 ; [.2B78.0020.0002.12190] # CUNEIFORM SIGN KAD2
+12191 ; [.2B79.0020.0002.12191] # CUNEIFORM SIGN KAD3
+12192 ; [.2B7A.0020.0002.12192] # CUNEIFORM SIGN KAD4
+12193 ; [.2B7B.0020.0002.12193] # CUNEIFORM SIGN KAD5
+12194 ; [.2B7C.0020.0002.12194] # CUNEIFORM SIGN KAD5 OVER KAD5
+12195 ; [.2B7D.0020.0002.12195] # CUNEIFORM SIGN KAK
+12196 ; [.2B7E.0020.0002.12196] # CUNEIFORM SIGN KAK TIMES IGI GUNU
+12197 ; [.2B7F.0020.0002.12197] # CUNEIFORM SIGN KAL
+12198 ; [.2B80.0020.0002.12198] # CUNEIFORM SIGN KAL TIMES BAD
+12199 ; [.2B81.0020.0002.12199] # CUNEIFORM SIGN KAL CROSSING KAL
+1219A ; [.2B82.0020.0002.1219A] # CUNEIFORM SIGN KAM2
+1219B ; [.2B83.0020.0002.1219B] # CUNEIFORM SIGN KAM4
+1219C ; [.2B84.0020.0002.1219C] # CUNEIFORM SIGN KASKAL
+1219D ; [.2B85.0020.0002.1219D] # CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219E ; [.2B86.0020.0002.1219E] # CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219F ; [.2B87.0020.0002.1219F] # CUNEIFORM SIGN KESH2
+121A0 ; [.2B88.0020.0002.121A0] # CUNEIFORM SIGN KI
+121A1 ; [.2B89.0020.0002.121A1] # CUNEIFORM SIGN KI TIMES BAD
+121A2 ; [.2B8A.0020.0002.121A2] # CUNEIFORM SIGN KI TIMES U
+121A3 ; [.2B8B.0020.0002.121A3] # CUNEIFORM SIGN KI TIMES UD
+121A4 ; [.2B8C.0020.0002.121A4] # CUNEIFORM SIGN KID
+121A5 ; [.2B8D.0020.0002.121A5] # CUNEIFORM SIGN KIN
+121A6 ; [.2B8E.0020.0002.121A6] # CUNEIFORM SIGN KISAL
+121A7 ; [.2B8F.0020.0002.121A7] # CUNEIFORM SIGN KISH
+121A8 ; [.2B90.0020.0002.121A8] # CUNEIFORM SIGN KISIM5
+121A9 ; [.2B91.0020.0002.121A9] # CUNEIFORM SIGN KISIM5 OVER KISIM5
+121AA ; [.2B92.0020.0002.121AA] # CUNEIFORM SIGN KU
+121AB ; [.2B93.0020.0002.121AB] # CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2
+121AC ; [.2B94.0020.0002.121AC] # CUNEIFORM SIGN KU3
+121AD ; [.2B95.0020.0002.121AD] # CUNEIFORM SIGN KU4
+121AE ; [.2B96.0020.0002.121AE] # CUNEIFORM SIGN KU4 VARIANT FORM
+121AF ; [.2B97.0020.0002.121AF] # CUNEIFORM SIGN KU7
+121B0 ; [.2B98.0020.0002.121B0] # CUNEIFORM SIGN KUL
+121B1 ; [.2B99.0020.0002.121B1] # CUNEIFORM SIGN KUL GUNU
+121B2 ; [.2B9A.0020.0002.121B2] # CUNEIFORM SIGN KUN
+121B3 ; [.2B9B.0020.0002.121B3] # CUNEIFORM SIGN KUR
+121B4 ; [.2B9C.0020.0002.121B4] # CUNEIFORM SIGN KUR OPPOSING KUR
+121B5 ; [.2B9D.0020.0002.121B5] # CUNEIFORM SIGN KUSHU2
+121B6 ; [.2B9E.0020.0002.121B6] # CUNEIFORM SIGN KWU318
+121B7 ; [.2B9F.0020.0002.121B7] # CUNEIFORM SIGN LA
+121B8 ; [.2BA0.0020.0002.121B8] # CUNEIFORM SIGN LAGAB
+121B9 ; [.2BA1.0020.0002.121B9] # CUNEIFORM SIGN LAGAB TIMES A
+121BA ; [.2BA2.0020.0002.121BA] # CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA
+121BB ; [.2BA3.0020.0002.121BB] # CUNEIFORM SIGN LAGAB TIMES A PLUS GAR
+121BC ; [.2BA4.0020.0002.121BC] # CUNEIFORM SIGN LAGAB TIMES A PLUS LAL
+121BD ; [.2BA5.0020.0002.121BD] # CUNEIFORM SIGN LAGAB TIMES AL
+121BE ; [.2BA6.0020.0002.121BE] # CUNEIFORM SIGN LAGAB TIMES AN
+121BF ; [.2BA7.0020.0002.121BF] # CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU
+121C0 ; [.2BA8.0020.0002.121C0] # CUNEIFORM SIGN LAGAB TIMES BAD
+121C1 ; [.2BA9.0020.0002.121C1] # CUNEIFORM SIGN LAGAB TIMES BI
+121C2 ; [.2BAA.0020.0002.121C2] # CUNEIFORM SIGN LAGAB TIMES DAR
+121C3 ; [.2BAB.0020.0002.121C3] # CUNEIFORM SIGN LAGAB TIMES EN
+121C4 ; [.2BAC.0020.0002.121C4] # CUNEIFORM SIGN LAGAB TIMES GA
+121C5 ; [.2BAD.0020.0002.121C5] # CUNEIFORM SIGN LAGAB TIMES GAR
+121C6 ; [.2BAE.0020.0002.121C6] # CUNEIFORM SIGN LAGAB TIMES GUD
+121C7 ; [.2BAF.0020.0002.121C7] # CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD
+121C8 ; [.2BB0.0020.0002.121C8] # CUNEIFORM SIGN LAGAB TIMES HA
+121C9 ; [.2BB1.0020.0002.121C9] # CUNEIFORM SIGN LAGAB TIMES HAL
+121CA ; [.2BB2.0020.0002.121CA] # CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN
+121CB ; [.2BB3.0020.0002.121CB] # CUNEIFORM SIGN LAGAB TIMES IGI GUNU
+121CC ; [.2BB4.0020.0002.121CC] # CUNEIFORM SIGN LAGAB TIMES IM
+121CD ; [.2BB5.0020.0002.121CD] # CUNEIFORM SIGN LAGAB TIMES IM PLUS HA
+121CE ; [.2BB6.0020.0002.121CE] # CUNEIFORM SIGN LAGAB TIMES IM PLUS LU
+121CF ; [.2BB7.0020.0002.121CF] # CUNEIFORM SIGN LAGAB TIMES KI
+121D0 ; [.2BB8.0020.0002.121D0] # CUNEIFORM SIGN LAGAB TIMES KIN
+121D1 ; [.2BB9.0020.0002.121D1] # CUNEIFORM SIGN LAGAB TIMES KU3
+121D2 ; [.2BBA.0020.0002.121D2] # CUNEIFORM SIGN LAGAB TIMES KUL
+121D3 ; [.2BBB.0020.0002.121D3] # CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A
+121D4 ; [.2BBC.0020.0002.121D4] # CUNEIFORM SIGN LAGAB TIMES LAGAB
+121D5 ; [.2BBD.0020.0002.121D5] # CUNEIFORM SIGN LAGAB TIMES LISH
+121D6 ; [.2BBE.0020.0002.121D6] # CUNEIFORM SIGN LAGAB TIMES LU
+121D7 ; [.2BBF.0020.0002.121D7] # CUNEIFORM SIGN LAGAB TIMES LUL
+121D8 ; [.2BC0.0020.0002.121D8] # CUNEIFORM SIGN LAGAB TIMES ME
+121D9 ; [.2BC1.0020.0002.121D9] # CUNEIFORM SIGN LAGAB TIMES ME PLUS EN
+121DA ; [.2BC2.0020.0002.121DA] # CUNEIFORM SIGN LAGAB TIMES MUSH
+121DB ; [.2BC3.0020.0002.121DB] # CUNEIFORM SIGN LAGAB TIMES NE
+121DC ; [.2BC4.0020.0002.121DC] # CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM
+121DD ; [.2BC5.0020.0002.121DD] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2
+121DE ; [.2BC6.0020.0002.121DE] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU
+121DF ; [.2BC7.0020.0002.121DF] # CUNEIFORM SIGN LAGAB TIMES SHU2
+121E0 ; [.2BC8.0020.0002.121E0] # CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2
+121E1 ; [.2BC9.0020.0002.121E1] # CUNEIFORM SIGN LAGAB TIMES SUM
+121E2 ; [.2BCA.0020.0002.121E2] # CUNEIFORM SIGN LAGAB TIMES TAG
+121E3 ; [.2BCB.0020.0002.121E3] # CUNEIFORM SIGN LAGAB TIMES TAK4
+121E4 ; [.2BCC.0020.0002.121E4] # CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA
+121E5 ; [.2BCD.0020.0002.121E5] # CUNEIFORM SIGN LAGAB TIMES U
+121E6 ; [.2BCE.0020.0002.121E6] # CUNEIFORM SIGN LAGAB TIMES U PLUS A
+121E7 ; [.2BCF.0020.0002.121E7] # CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U
+121E8 ; [.2BD0.0020.0002.121E8] # CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH
+121E9 ; [.2BD1.0020.0002.121E9] # CUNEIFORM SIGN LAGAB TIMES UD
+121EA ; [.2BD2.0020.0002.121EA] # CUNEIFORM SIGN LAGAB TIMES USH
+121EB ; [.2BD3.0020.0002.121EB] # CUNEIFORM SIGN LAGAB SQUARED
+121EC ; [.2BD4.0020.0002.121EC] # CUNEIFORM SIGN LAGAR
+121ED ; [.2BD5.0020.0002.121ED] # CUNEIFORM SIGN LAGAR TIMES SHE
+121EE ; [.2BD6.0020.0002.121EE] # CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM
+121EF ; [.2BD7.0020.0002.121EF] # CUNEIFORM SIGN LAGAR GUNU
+121F0 ; [.2BD8.0020.0002.121F0] # CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE
+121F1 ; [.2BD9.0020.0002.121F1] # CUNEIFORM SIGN LAHSHU
+121F2 ; [.2BDA.0020.0002.121F2] # CUNEIFORM SIGN LAL
+121F3 ; [.2BDB.0020.0002.121F3] # CUNEIFORM SIGN LAL TIMES LAL
+121F4 ; [.2BDC.0020.0002.121F4] # CUNEIFORM SIGN LAM
+121F5 ; [.2BDD.0020.0002.121F5] # CUNEIFORM SIGN LAM TIMES KUR
+121F6 ; [.2BDE.0020.0002.121F6] # CUNEIFORM SIGN LAM TIMES KUR PLUS RU
+121F7 ; [.2BDF.0020.0002.121F7] # CUNEIFORM SIGN LI
+121F8 ; [.2BE0.0020.0002.121F8] # CUNEIFORM SIGN LIL
+121F9 ; [.2BE1.0020.0002.121F9] # CUNEIFORM SIGN LIMMU2
+121FA ; [.2BE2.0020.0002.121FA] # CUNEIFORM SIGN LISH
+121FB ; [.2BE3.0020.0002.121FB] # CUNEIFORM SIGN LU
+121FC ; [.2BE4.0020.0002.121FC] # CUNEIFORM SIGN LU TIMES BAD
+121FD ; [.2BE5.0020.0002.121FD] # CUNEIFORM SIGN LU2
+121FE ; [.2BE6.0020.0002.121FE] # CUNEIFORM SIGN LU2 TIMES AL
+121FF ; [.2BE7.0020.0002.121FF] # CUNEIFORM SIGN LU2 TIMES BAD
+12200 ; [.2BE8.0020.0002.12200] # CUNEIFORM SIGN LU2 TIMES ESH2
+12201 ; [.2BE9.0020.0002.12201] # CUNEIFORM SIGN LU2 TIMES ESH2 TENU
+12202 ; [.2BEA.0020.0002.12202] # CUNEIFORM SIGN LU2 TIMES GAN2 TENU
+12203 ; [.2BEB.0020.0002.12203] # CUNEIFORM SIGN LU2 TIMES HI TIMES BAD
+12204 ; [.2BEC.0020.0002.12204] # CUNEIFORM SIGN LU2 TIMES IM
+12205 ; [.2BED.0020.0002.12205] # CUNEIFORM SIGN LU2 TIMES KAD2
+12206 ; [.2BEE.0020.0002.12206] # CUNEIFORM SIGN LU2 TIMES KAD3
+12207 ; [.2BEF.0020.0002.12207] # CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH
+12208 ; [.2BF0.0020.0002.12208] # CUNEIFORM SIGN LU2 TIMES KI
+12209 ; [.2BF1.0020.0002.12209] # CUNEIFORM SIGN LU2 TIMES LA PLUS ASH
+1220A ; [.2BF2.0020.0002.1220A] # CUNEIFORM SIGN LU2 TIMES LAGAB
+1220B ; [.2BF3.0020.0002.1220B] # CUNEIFORM SIGN LU2 TIMES ME PLUS EN
+1220C ; [.2BF4.0020.0002.1220C] # CUNEIFORM SIGN LU2 TIMES NE
+1220D ; [.2BF5.0020.0002.1220D] # CUNEIFORM SIGN LU2 TIMES NU
+1220E ; [.2BF6.0020.0002.1220E] # CUNEIFORM SIGN LU2 TIMES SI PLUS ASH
+1220F ; [.2BF7.0020.0002.1220F] # CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU
+12210 ; [.2BF8.0020.0002.12210] # CUNEIFORM SIGN LU2 TIMES TUG2
+12211 ; [.2BF9.0020.0002.12211] # CUNEIFORM SIGN LU2 TENU
+12212 ; [.2BFA.0020.0002.12212] # CUNEIFORM SIGN LU2 CROSSING LU2
+12213 ; [.2BFB.0020.0002.12213] # CUNEIFORM SIGN LU2 OPPOSING LU2
+12214 ; [.2BFC.0020.0002.12214] # CUNEIFORM SIGN LU2 SQUARED
+12215 ; [.2BFD.0020.0002.12215] # CUNEIFORM SIGN LU2 SHESHIG
+12216 ; [.2BFE.0020.0002.12216] # CUNEIFORM SIGN LU3
+12217 ; [.2BFF.0020.0002.12217] # CUNEIFORM SIGN LUGAL
+12218 ; [.2C00.0020.0002.12218] # CUNEIFORM SIGN LUGAL OVER LUGAL
+12219 ; [.2C01.0020.0002.12219] # CUNEIFORM SIGN LUGAL OPPOSING LUGAL
+1221A ; [.2C02.0020.0002.1221A] # CUNEIFORM SIGN LUGAL SHESHIG
+1221B ; [.2C03.0020.0002.1221B] # CUNEIFORM SIGN LUH
+1221C ; [.2C04.0020.0002.1221C] # CUNEIFORM SIGN LUL
+1221D ; [.2C05.0020.0002.1221D] # CUNEIFORM SIGN LUM
+1221E ; [.2C06.0020.0002.1221E] # CUNEIFORM SIGN LUM OVER LUM
+1221F ; [.2C07.0020.0002.1221F] # CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR
+12220 ; [.2C08.0020.0002.12220] # CUNEIFORM SIGN MA
+12221 ; [.2C09.0020.0002.12221] # CUNEIFORM SIGN MA TIMES TAK4
+12222 ; [.2C0A.0020.0002.12222] # CUNEIFORM SIGN MA GUNU
+12223 ; [.2C0B.0020.0002.12223] # CUNEIFORM SIGN MA2
+12224 ; [.2C0C.0020.0002.12224] # CUNEIFORM SIGN MAH
+12225 ; [.2C0D.0020.0002.12225] # CUNEIFORM SIGN MAR
+12226 ; [.2C0E.0020.0002.12226] # CUNEIFORM SIGN MASH
+12227 ; [.2C0F.0020.0002.12227] # CUNEIFORM SIGN MASH2
+12228 ; [.2C10.0020.0002.12228] # CUNEIFORM SIGN ME
+12229 ; [.2C11.0020.0002.12229] # CUNEIFORM SIGN MES
+1222A ; [.2C12.0020.0002.1222A] # CUNEIFORM SIGN MI
+1222B ; [.2C13.0020.0002.1222B] # CUNEIFORM SIGN MIN
+1222C ; [.2C14.0020.0002.1222C] # CUNEIFORM SIGN MU
+1222D ; [.2C15.0020.0002.1222D] # CUNEIFORM SIGN MU OVER MU
+1222E ; [.2C16.0020.0002.1222E] # CUNEIFORM SIGN MUG
+1222F ; [.2C17.0020.0002.1222F] # CUNEIFORM SIGN MUG GUNU
+12230 ; [.2C18.0020.0002.12230] # CUNEIFORM SIGN MUNSUB
+12231 ; [.2C19.0020.0002.12231] # CUNEIFORM SIGN MURGU2
+12232 ; [.2C1A.0020.0002.12232] # CUNEIFORM SIGN MUSH
+12233 ; [.2C1B.0020.0002.12233] # CUNEIFORM SIGN MUSH TIMES A
+12234 ; [.2C1C.0020.0002.12234] # CUNEIFORM SIGN MUSH TIMES KUR
+12235 ; [.2C1D.0020.0002.12235] # CUNEIFORM SIGN MUSH TIMES ZA
+12236 ; [.2C1E.0020.0002.12236] # CUNEIFORM SIGN MUSH OVER MUSH
+12237 ; [.2C1F.0020.0002.12237] # CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA
+12238 ; [.2C20.0020.0002.12238] # CUNEIFORM SIGN MUSH CROSSING MUSH
+12239 ; [.2C21.0020.0002.12239] # CUNEIFORM SIGN MUSH3
+1223A ; [.2C22.0020.0002.1223A] # CUNEIFORM SIGN MUSH3 TIMES A
+1223B ; [.2C23.0020.0002.1223B] # CUNEIFORM SIGN MUSH3 TIMES A PLUS DI
+1223C ; [.2C24.0020.0002.1223C] # CUNEIFORM SIGN MUSH3 TIMES DI
+1223D ; [.2C25.0020.0002.1223D] # CUNEIFORM SIGN MUSH3 GUNU
+1223E ; [.2C26.0020.0002.1223E] # CUNEIFORM SIGN NA
+1223F ; [.2C27.0020.0002.1223F] # CUNEIFORM SIGN NA2
+12240 ; [.2C28.0020.0002.12240] # CUNEIFORM SIGN NAGA
+12241 ; [.2C29.0020.0002.12241] # CUNEIFORM SIGN NAGA INVERTED
+12242 ; [.2C2A.0020.0002.12242] # CUNEIFORM SIGN NAGA TIMES SHU TENU
+12243 ; [.2C2B.0020.0002.12243] # CUNEIFORM SIGN NAGA OPPOSING NAGA
+12244 ; [.2C2C.0020.0002.12244] # CUNEIFORM SIGN NAGAR
+12245 ; [.2C2D.0020.0002.12245] # CUNEIFORM SIGN NAM NUTILLU
+12246 ; [.2C2E.0020.0002.12246] # CUNEIFORM SIGN NAM
+12247 ; [.2C2F.0020.0002.12247] # CUNEIFORM SIGN NAM2
+12248 ; [.2C30.0020.0002.12248] # CUNEIFORM SIGN NE
+12249 ; [.2C31.0020.0002.12249] # CUNEIFORM SIGN NE TIMES A
+1224A ; [.2C32.0020.0002.1224A] # CUNEIFORM SIGN NE TIMES UD
+1224B ; [.2C33.0020.0002.1224B] # CUNEIFORM SIGN NE SHESHIG
+1224C ; [.2C34.0020.0002.1224C] # CUNEIFORM SIGN NI
+1224D ; [.2C35.0020.0002.1224D] # CUNEIFORM SIGN NI TIMES E
+1224E ; [.2C36.0020.0002.1224E] # CUNEIFORM SIGN NI2
+1224F ; [.2C37.0020.0002.1224F] # CUNEIFORM SIGN NIM
+12250 ; [.2C38.0020.0002.12250] # CUNEIFORM SIGN NIM TIMES GAN2 TENU
+12251 ; [.2C39.0020.0002.12251] # CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU
+12252 ; [.2C3A.0020.0002.12252] # CUNEIFORM SIGN NINDA2
+12253 ; [.2C3B.0020.0002.12253] # CUNEIFORM SIGN NINDA2 TIMES AN
+12254 ; [.2C3C.0020.0002.12254] # CUNEIFORM SIGN NINDA2 TIMES ASH
+12255 ; [.2C3D.0020.0002.12255] # CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH
+12256 ; [.2C3E.0020.0002.12256] # CUNEIFORM SIGN NINDA2 TIMES GUD
+12257 ; [.2C3F.0020.0002.12257] # CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU
+12258 ; [.2C40.0020.0002.12258] # CUNEIFORM SIGN NINDA2 TIMES NE
+12259 ; [.2C41.0020.0002.12259] # CUNEIFORM SIGN NINDA2 TIMES NUN
+1225A ; [.2C42.0020.0002.1225A] # CUNEIFORM SIGN NINDA2 TIMES SHE
+1225B ; [.2C43.0020.0002.1225B] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN
+1225C ; [.2C44.0020.0002.1225C] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH
+1225D ; [.2C45.0020.0002.1225D] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH
+1225E ; [.2C46.0020.0002.1225E] # CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH
+1225F ; [.2C47.0020.0002.1225F] # CUNEIFORM SIGN NINDA2 TIMES USH
+12260 ; [.2C48.0020.0002.12260] # CUNEIFORM SIGN NISAG
+12261 ; [.2C49.0020.0002.12261] # CUNEIFORM SIGN NU
+12262 ; [.2C4A.0020.0002.12262] # CUNEIFORM SIGN NU11
+12263 ; [.2C4B.0020.0002.12263] # CUNEIFORM SIGN NUN
+12264 ; [.2C4C.0020.0002.12264] # CUNEIFORM SIGN NUN LAGAR TIMES GAR
+12265 ; [.2C4D.0020.0002.12265] # CUNEIFORM SIGN NUN LAGAR TIMES MASH
+12266 ; [.2C4E.0020.0002.12266] # CUNEIFORM SIGN NUN LAGAR TIMES SAL
+12267 ; [.2C4F.0020.0002.12267] # CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL
+12268 ; [.2C50.0020.0002.12268] # CUNEIFORM SIGN NUN LAGAR TIMES USH
+12269 ; [.2C51.0020.0002.12269] # CUNEIFORM SIGN NUN TENU
+1226A ; [.2C52.0020.0002.1226A] # CUNEIFORM SIGN NUN OVER NUN
+1226B ; [.2C53.0020.0002.1226B] # CUNEIFORM SIGN NUN CROSSING NUN
+1226C ; [.2C54.0020.0002.1226C] # CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR
+1226D ; [.2C55.0020.0002.1226D] # CUNEIFORM SIGN NUNUZ
+1226E ; [.2C56.0020.0002.1226E] # CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB
+1226F ; [.2C57.0020.0002.1226F] # CUNEIFORM SIGN NUNUZ AB2 TIMES BI
+12270 ; [.2C58.0020.0002.12270] # CUNEIFORM SIGN NUNUZ AB2 TIMES DUG
+12271 ; [.2C59.0020.0002.12271] # CUNEIFORM SIGN NUNUZ AB2 TIMES GUD
+12272 ; [.2C5A.0020.0002.12272] # CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU
+12273 ; [.2C5B.0020.0002.12273] # CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3
+12274 ; [.2C5C.0020.0002.12274] # CUNEIFORM SIGN NUNUZ AB2 TIMES LA
+12275 ; [.2C5D.0020.0002.12275] # CUNEIFORM SIGN NUNUZ AB2 TIMES NE
+12276 ; [.2C5E.0020.0002.12276] # CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3
+12277 ; [.2C5F.0020.0002.12277] # CUNEIFORM SIGN NUNUZ AB2 TIMES U2
+12278 ; [.2C60.0020.0002.12278] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI
+12279 ; [.2C61.0020.0002.12279] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U
+1227A ; [.2C62.0020.0002.1227A] # CUNEIFORM SIGN PA
+1227B ; [.2C63.0020.0002.1227B] # CUNEIFORM SIGN PAD
+1227C ; [.2C64.0020.0002.1227C] # CUNEIFORM SIGN PAN
+1227D ; [.2C65.0020.0002.1227D] # CUNEIFORM SIGN PAP
+1227E ; [.2C66.0020.0002.1227E] # CUNEIFORM SIGN PESH2
+1227F ; [.2C67.0020.0002.1227F] # CUNEIFORM SIGN PI
+12280 ; [.2C68.0020.0002.12280] # CUNEIFORM SIGN PI TIMES A
+12281 ; [.2C69.0020.0002.12281] # CUNEIFORM SIGN PI TIMES AB
+12282 ; [.2C6A.0020.0002.12282] # CUNEIFORM SIGN PI TIMES BI
+12283 ; [.2C6B.0020.0002.12283] # CUNEIFORM SIGN PI TIMES BU
+12284 ; [.2C6C.0020.0002.12284] # CUNEIFORM SIGN PI TIMES E
+12285 ; [.2C6D.0020.0002.12285] # CUNEIFORM SIGN PI TIMES I
+12286 ; [.2C6E.0020.0002.12286] # CUNEIFORM SIGN PI TIMES IB
+12287 ; [.2C6F.0020.0002.12287] # CUNEIFORM SIGN PI TIMES U
+12288 ; [.2C70.0020.0002.12288] # CUNEIFORM SIGN PI TIMES U2
+12289 ; [.2C71.0020.0002.12289] # CUNEIFORM SIGN PI CROSSING PI
+1228A ; [.2C72.0020.0002.1228A] # CUNEIFORM SIGN PIRIG
+1228B ; [.2C73.0020.0002.1228B] # CUNEIFORM SIGN PIRIG TIMES KAL
+1228C ; [.2C74.0020.0002.1228C] # CUNEIFORM SIGN PIRIG TIMES UD
+1228D ; [.2C75.0020.0002.1228D] # CUNEIFORM SIGN PIRIG TIMES ZA
+1228E ; [.2C76.0020.0002.1228E] # CUNEIFORM SIGN PIRIG OPPOSING PIRIG
+1228F ; [.2C77.0020.0002.1228F] # CUNEIFORM SIGN RA
+12290 ; [.2C78.0020.0002.12290] # CUNEIFORM SIGN RAB
+12291 ; [.2C79.0020.0002.12291] # CUNEIFORM SIGN RI
+12292 ; [.2C7A.0020.0002.12292] # CUNEIFORM SIGN RU
+12293 ; [.2C7B.0020.0002.12293] # CUNEIFORM SIGN SA
+12294 ; [.2C7C.0020.0002.12294] # CUNEIFORM SIGN SAG NUTILLU
+12295 ; [.2C7D.0020.0002.12295] # CUNEIFORM SIGN SAG
+12296 ; [.2C7E.0020.0002.12296] # CUNEIFORM SIGN SAG TIMES A
+12297 ; [.2C7F.0020.0002.12297] # CUNEIFORM SIGN SAG TIMES DU
+12298 ; [.2C80.0020.0002.12298] # CUNEIFORM SIGN SAG TIMES DUB
+12299 ; [.2C81.0020.0002.12299] # CUNEIFORM SIGN SAG TIMES HA
+1229A ; [.2C82.0020.0002.1229A] # CUNEIFORM SIGN SAG TIMES KAK
+1229B ; [.2C83.0020.0002.1229B] # CUNEIFORM SIGN SAG TIMES KUR
+1229C ; [.2C84.0020.0002.1229C] # CUNEIFORM SIGN SAG TIMES LUM
+1229D ; [.2C85.0020.0002.1229D] # CUNEIFORM SIGN SAG TIMES MI
+1229E ; [.2C86.0020.0002.1229E] # CUNEIFORM SIGN SAG TIMES NUN
+1229F ; [.2C87.0020.0002.1229F] # CUNEIFORM SIGN SAG TIMES SAL
+122A0 ; [.2C88.0020.0002.122A0] # CUNEIFORM SIGN SAG TIMES SHID
+122A1 ; [.2C89.0020.0002.122A1] # CUNEIFORM SIGN SAG TIMES TAB
+122A2 ; [.2C8A.0020.0002.122A2] # CUNEIFORM SIGN SAG TIMES U2
+122A3 ; [.2C8B.0020.0002.122A3] # CUNEIFORM SIGN SAG TIMES UB
+122A4 ; [.2C8C.0020.0002.122A4] # CUNEIFORM SIGN SAG TIMES UM
+122A5 ; [.2C8D.0020.0002.122A5] # CUNEIFORM SIGN SAG TIMES UR
+122A6 ; [.2C8E.0020.0002.122A6] # CUNEIFORM SIGN SAG TIMES USH
+122A7 ; [.2C8F.0020.0002.122A7] # CUNEIFORM SIGN SAG OVER SAG
+122A8 ; [.2C90.0020.0002.122A8] # CUNEIFORM SIGN SAG GUNU
+122A9 ; [.2C91.0020.0002.122A9] # CUNEIFORM SIGN SAL
+122AA ; [.2C92.0020.0002.122AA] # CUNEIFORM SIGN SAL LAGAB TIMES ASH2
+122AB ; [.2C93.0020.0002.122AB] # CUNEIFORM SIGN SANGA2
+122AC ; [.2C94.0020.0002.122AC] # CUNEIFORM SIGN SAR
+122AD ; [.2C95.0020.0002.122AD] # CUNEIFORM SIGN SHA
+122AE ; [.2C96.0020.0002.122AE] # CUNEIFORM SIGN SHA3
+122AF ; [.2C97.0020.0002.122AF] # CUNEIFORM SIGN SHA3 TIMES A
+122B0 ; [.2C98.0020.0002.122B0] # CUNEIFORM SIGN SHA3 TIMES BAD
+122B1 ; [.2C99.0020.0002.122B1] # CUNEIFORM SIGN SHA3 TIMES GISH
+122B2 ; [.2C9A.0020.0002.122B2] # CUNEIFORM SIGN SHA3 TIMES NE
+122B3 ; [.2C9B.0020.0002.122B3] # CUNEIFORM SIGN SHA3 TIMES SHU2
+122B4 ; [.2C9C.0020.0002.122B4] # CUNEIFORM SIGN SHA3 TIMES TUR
+122B5 ; [.2C9D.0020.0002.122B5] # CUNEIFORM SIGN SHA3 TIMES U
+122B6 ; [.2C9E.0020.0002.122B6] # CUNEIFORM SIGN SHA3 TIMES U PLUS A
+122B7 ; [.2C9F.0020.0002.122B7] # CUNEIFORM SIGN SHA6
+122B8 ; [.2CA0.0020.0002.122B8] # CUNEIFORM SIGN SHAB6
+122B9 ; [.2CA1.0020.0002.122B9] # CUNEIFORM SIGN SHAR2
+122BA ; [.2CA2.0020.0002.122BA] # CUNEIFORM SIGN SHE
+122BB ; [.2CA3.0020.0002.122BB] # CUNEIFORM SIGN SHE HU
+122BC ; [.2CA4.0020.0002.122BC] # CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR
+122BD ; [.2CA5.0020.0002.122BD] # CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR
+122BE ; [.2CA6.0020.0002.122BE] # CUNEIFORM SIGN SHEG9
+122BF ; [.2CA7.0020.0002.122BF] # CUNEIFORM SIGN SHEN
+122C0 ; [.2CA8.0020.0002.122C0] # CUNEIFORM SIGN SHESH
+122C1 ; [.2CA9.0020.0002.122C1] # CUNEIFORM SIGN SHESH2
+122C2 ; [.2CAA.0020.0002.122C2] # CUNEIFORM SIGN SHESHLAM
+122C3 ; [.2CAB.0020.0002.122C3] # CUNEIFORM SIGN SHID
+122C4 ; [.2CAC.0020.0002.122C4] # CUNEIFORM SIGN SHID TIMES A
+122C5 ; [.2CAD.0020.0002.122C5] # CUNEIFORM SIGN SHID TIMES IM
+122C6 ; [.2CAE.0020.0002.122C6] # CUNEIFORM SIGN SHIM
+122C7 ; [.2CAF.0020.0002.122C7] # CUNEIFORM SIGN SHIM TIMES A
+122C8 ; [.2CB0.0020.0002.122C8] # CUNEIFORM SIGN SHIM TIMES BAL
+122C9 ; [.2CB1.0020.0002.122C9] # CUNEIFORM SIGN SHIM TIMES BULUG
+122CA ; [.2CB2.0020.0002.122CA] # CUNEIFORM SIGN SHIM TIMES DIN
+122CB ; [.2CB3.0020.0002.122CB] # CUNEIFORM SIGN SHIM TIMES GAR
+122CC ; [.2CB4.0020.0002.122CC] # CUNEIFORM SIGN SHIM TIMES IGI
+122CD ; [.2CB5.0020.0002.122CD] # CUNEIFORM SIGN SHIM TIMES IGI GUNU
+122CE ; [.2CB6.0020.0002.122CE] # CUNEIFORM SIGN SHIM TIMES KUSHU2
+122CF ; [.2CB7.0020.0002.122CF] # CUNEIFORM SIGN SHIM TIMES LUL
+122D0 ; [.2CB8.0020.0002.122D0] # CUNEIFORM SIGN SHIM TIMES MUG
+122D1 ; [.2CB9.0020.0002.122D1] # CUNEIFORM SIGN SHIM TIMES SAL
+122D2 ; [.2CBA.0020.0002.122D2] # CUNEIFORM SIGN SHINIG
+122D3 ; [.2CBB.0020.0002.122D3] # CUNEIFORM SIGN SHIR
+122D4 ; [.2CBC.0020.0002.122D4] # CUNEIFORM SIGN SHIR TENU
+122D5 ; [.2CBD.0020.0002.122D5] # CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR
+122D6 ; [.2CBE.0020.0002.122D6] # CUNEIFORM SIGN SHITA
+122D7 ; [.2CBF.0020.0002.122D7] # CUNEIFORM SIGN SHU
+122D8 ; [.2CC0.0020.0002.122D8] # CUNEIFORM SIGN SHU OVER INVERTED SHU
+122D9 ; [.2CC1.0020.0002.122D9] # CUNEIFORM SIGN SHU2
+122DA ; [.2CC2.0020.0002.122DA] # CUNEIFORM SIGN SHUBUR
+122DB ; [.2CC3.0020.0002.122DB] # CUNEIFORM SIGN SI
+122DC ; [.2CC4.0020.0002.122DC] # CUNEIFORM SIGN SI GUNU
+122DD ; [.2CC5.0020.0002.122DD] # CUNEIFORM SIGN SIG
+122DE ; [.2CC6.0020.0002.122DE] # CUNEIFORM SIGN SIG4
+122DF ; [.2CC7.0020.0002.122DF] # CUNEIFORM SIGN SIG4 OVER SIG4 SHU2
+122E0 ; [.2CC8.0020.0002.122E0] # CUNEIFORM SIGN SIK2
+122E1 ; [.2CC9.0020.0002.122E1] # CUNEIFORM SIGN SILA3
+122E2 ; [.2CCA.0020.0002.122E2] # CUNEIFORM SIGN SU
+122E3 ; [.2CCB.0020.0002.122E3] # CUNEIFORM SIGN SU OVER SU
+122E4 ; [.2CCC.0020.0002.122E4] # CUNEIFORM SIGN SUD
+122E5 ; [.2CCD.0020.0002.122E5] # CUNEIFORM SIGN SUD2
+122E6 ; [.2CCE.0020.0002.122E6] # CUNEIFORM SIGN SUHUR
+122E7 ; [.2CCF.0020.0002.122E7] # CUNEIFORM SIGN SUM
+122E8 ; [.2CD0.0020.0002.122E8] # CUNEIFORM SIGN SUMASH
+122E9 ; [.2CD1.0020.0002.122E9] # CUNEIFORM SIGN SUR
+122EA ; [.2CD2.0020.0002.122EA] # CUNEIFORM SIGN SUR9
+122EB ; [.2CD3.0020.0002.122EB] # CUNEIFORM SIGN TA
+122EC ; [.2CD4.0020.0002.122EC] # CUNEIFORM SIGN TA ASTERISK
+122ED ; [.2CD5.0020.0002.122ED] # CUNEIFORM SIGN TA TIMES HI
+122EE ; [.2CD6.0020.0002.122EE] # CUNEIFORM SIGN TA TIMES MI
+122EF ; [.2CD7.0020.0002.122EF] # CUNEIFORM SIGN TA GUNU
+122F0 ; [.2CD8.0020.0002.122F0] # CUNEIFORM SIGN TAB
+122F1 ; [.2CD9.0020.0002.122F1] # CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH
+122F2 ; [.2CDA.0020.0002.122F2] # CUNEIFORM SIGN TAB SQUARED
+122F3 ; [.2CDB.0020.0002.122F3] # CUNEIFORM SIGN TAG
+122F4 ; [.2CDC.0020.0002.122F4] # CUNEIFORM SIGN TAG TIMES BI
+122F5 ; [.2CDD.0020.0002.122F5] # CUNEIFORM SIGN TAG TIMES GUD
+122F6 ; [.2CDE.0020.0002.122F6] # CUNEIFORM SIGN TAG TIMES SHE
+122F7 ; [.2CDF.0020.0002.122F7] # CUNEIFORM SIGN TAG TIMES SHU
+122F8 ; [.2CE0.0020.0002.122F8] # CUNEIFORM SIGN TAG TIMES TUG2
+122F9 ; [.2CE1.0020.0002.122F9] # CUNEIFORM SIGN TAG TIMES UD
+122FA ; [.2CE2.0020.0002.122FA] # CUNEIFORM SIGN TAK4
+122FB ; [.2CE3.0020.0002.122FB] # CUNEIFORM SIGN TAR
+122FC ; [.2CE4.0020.0002.122FC] # CUNEIFORM SIGN TE
+122FD ; [.2CE5.0020.0002.122FD] # CUNEIFORM SIGN TE GUNU
+122FE ; [.2CE6.0020.0002.122FE] # CUNEIFORM SIGN TI
+122FF ; [.2CE7.0020.0002.122FF] # CUNEIFORM SIGN TI TENU
+12300 ; [.2CE8.0020.0002.12300] # CUNEIFORM SIGN TIL
+12301 ; [.2CE9.0020.0002.12301] # CUNEIFORM SIGN TIR
+12302 ; [.2CEA.0020.0002.12302] # CUNEIFORM SIGN TIR TIMES TAK4
+12303 ; [.2CEB.0020.0002.12303] # CUNEIFORM SIGN TIR OVER TIR
+12304 ; [.2CEC.0020.0002.12304] # CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR
+12305 ; [.2CED.0020.0002.12305] # CUNEIFORM SIGN TU
+12306 ; [.2CEE.0020.0002.12306] # CUNEIFORM SIGN TUG2
+12307 ; [.2CEF.0020.0002.12307] # CUNEIFORM SIGN TUK
+12308 ; [.2CF0.0020.0002.12308] # CUNEIFORM SIGN TUM
+12309 ; [.2CF1.0020.0002.12309] # CUNEIFORM SIGN TUR
+1230A ; [.2CF2.0020.0002.1230A] # CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA
+1230B ; [.2CF3.0020.0002.1230B] # CUNEIFORM SIGN U
+1230C ; [.2CF4.0020.0002.1230C] # CUNEIFORM SIGN U GUD
+1230D ; [.2CF5.0020.0002.1230D] # CUNEIFORM SIGN U U U
+1230E ; [.2CF6.0020.0002.1230E] # CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR
+1230F ; [.2CF7.0020.0002.1230F] # CUNEIFORM SIGN U OVER U SUR OVER SUR
+12310 ; [.2CF8.0020.0002.12310] # CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED
+12311 ; [.2CF9.0020.0002.12311] # CUNEIFORM SIGN U2
+12312 ; [.2CFA.0020.0002.12312] # CUNEIFORM SIGN UB
+12313 ; [.2CFB.0020.0002.12313] # CUNEIFORM SIGN UD
+12314 ; [.2CFC.0020.0002.12314] # CUNEIFORM SIGN UD KUSHU2
+12315 ; [.2CFD.0020.0002.12315] # CUNEIFORM SIGN UD TIMES BAD
+12316 ; [.2CFE.0020.0002.12316] # CUNEIFORM SIGN UD TIMES MI
+12317 ; [.2CFF.0020.0002.12317] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U
+12318 ; [.2D00.0020.0002.12318] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU
+12319 ; [.2D01.0020.0002.12319] # CUNEIFORM SIGN UD GUNU
+1231A ; [.2D02.0020.0002.1231A] # CUNEIFORM SIGN UD SHESHIG
+1231B ; [.2D03.0020.0002.1231B] # CUNEIFORM SIGN UD SHESHIG TIMES BAD
+1231C ; [.2D04.0020.0002.1231C] # CUNEIFORM SIGN UDUG
+1231D ; [.2D05.0020.0002.1231D] # CUNEIFORM SIGN UM
+1231E ; [.2D06.0020.0002.1231E] # CUNEIFORM SIGN UM TIMES LAGAB
+1231F ; [.2D07.0020.0002.1231F] # CUNEIFORM SIGN UM TIMES ME PLUS DA
+12320 ; [.2D08.0020.0002.12320] # CUNEIFORM SIGN UM TIMES SHA3
+12321 ; [.2D09.0020.0002.12321] # CUNEIFORM SIGN UM TIMES U
+12322 ; [.2D0A.0020.0002.12322] # CUNEIFORM SIGN UMBIN
+12323 ; [.2D0B.0020.0002.12323] # CUNEIFORM SIGN UMUM
+12324 ; [.2D0C.0020.0002.12324] # CUNEIFORM SIGN UMUM TIMES KASKAL
+12325 ; [.2D0D.0020.0002.12325] # CUNEIFORM SIGN UMUM TIMES PA
+12326 ; [.2D0E.0020.0002.12326] # CUNEIFORM SIGN UN
+12327 ; [.2D0F.0020.0002.12327] # CUNEIFORM SIGN UN GUNU
+12328 ; [.2D10.0020.0002.12328] # CUNEIFORM SIGN UR
+12329 ; [.2D11.0020.0002.12329] # CUNEIFORM SIGN UR CROSSING UR
+1232A ; [.2D12.0020.0002.1232A] # CUNEIFORM SIGN UR SHESHIG
+1232B ; [.2D13.0020.0002.1232B] # CUNEIFORM SIGN UR2
+1232C ; [.2D14.0020.0002.1232C] # CUNEIFORM SIGN UR2 TIMES A PLUS HA
+1232D ; [.2D15.0020.0002.1232D] # CUNEIFORM SIGN UR2 TIMES A PLUS NA
+1232E ; [.2D16.0020.0002.1232E] # CUNEIFORM SIGN UR2 TIMES AL
+1232F ; [.2D17.0020.0002.1232F] # CUNEIFORM SIGN UR2 TIMES HA
+12330 ; [.2D18.0020.0002.12330] # CUNEIFORM SIGN UR2 TIMES NUN
+12331 ; [.2D19.0020.0002.12331] # CUNEIFORM SIGN UR2 TIMES U2
+12332 ; [.2D1A.0020.0002.12332] # CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH
+12333 ; [.2D1B.0020.0002.12333] # CUNEIFORM SIGN UR2 TIMES U2 PLUS BI
+12334 ; [.2D1C.0020.0002.12334] # CUNEIFORM SIGN UR4
+12335 ; [.2D1D.0020.0002.12335] # CUNEIFORM SIGN URI
+12336 ; [.2D1E.0020.0002.12336] # CUNEIFORM SIGN URI3
+12337 ; [.2D1F.0020.0002.12337] # CUNEIFORM SIGN URU
+12338 ; [.2D20.0020.0002.12338] # CUNEIFORM SIGN URU TIMES A
+12339 ; [.2D21.0020.0002.12339] # CUNEIFORM SIGN URU TIMES ASHGAB
+1233A ; [.2D22.0020.0002.1233A] # CUNEIFORM SIGN URU TIMES BAR
+1233B ; [.2D23.0020.0002.1233B] # CUNEIFORM SIGN URU TIMES DUN
+1233C ; [.2D24.0020.0002.1233C] # CUNEIFORM SIGN URU TIMES GA
+1233D ; [.2D25.0020.0002.1233D] # CUNEIFORM SIGN URU TIMES GAL
+1233E ; [.2D26.0020.0002.1233E] # CUNEIFORM SIGN URU TIMES GAN2 TENU
+1233F ; [.2D27.0020.0002.1233F] # CUNEIFORM SIGN URU TIMES GAR
+12340 ; [.2D28.0020.0002.12340] # CUNEIFORM SIGN URU TIMES GU
+12341 ; [.2D29.0020.0002.12341] # CUNEIFORM SIGN URU TIMES HA
+12342 ; [.2D2A.0020.0002.12342] # CUNEIFORM SIGN URU TIMES IGI
+12343 ; [.2D2B.0020.0002.12343] # CUNEIFORM SIGN URU TIMES IM
+12344 ; [.2D2C.0020.0002.12344] # CUNEIFORM SIGN URU TIMES ISH
+12345 ; [.2D2D.0020.0002.12345] # CUNEIFORM SIGN URU TIMES KI
+12346 ; [.2D2E.0020.0002.12346] # CUNEIFORM SIGN URU TIMES LUM
+12347 ; [.2D2F.0020.0002.12347] # CUNEIFORM SIGN URU TIMES MIN
+12348 ; [.2D30.0020.0002.12348] # CUNEIFORM SIGN URU TIMES PA
+12349 ; [.2D31.0020.0002.12349] # CUNEIFORM SIGN URU TIMES SHE
+1234A ; [.2D32.0020.0002.1234A] # CUNEIFORM SIGN URU TIMES SIG4
+1234B ; [.2D33.0020.0002.1234B] # CUNEIFORM SIGN URU TIMES TU
+1234C ; [.2D34.0020.0002.1234C] # CUNEIFORM SIGN URU TIMES U PLUS GUD
+1234D ; [.2D35.0020.0002.1234D] # CUNEIFORM SIGN URU TIMES UD
+1234E ; [.2D36.0020.0002.1234E] # CUNEIFORM SIGN URU TIMES URUDA
+1234F ; [.2D37.0020.0002.1234F] # CUNEIFORM SIGN URUDA
+12350 ; [.2D38.0020.0002.12350] # CUNEIFORM SIGN URUDA TIMES U
+12351 ; [.2D39.0020.0002.12351] # CUNEIFORM SIGN USH
+12352 ; [.2D3A.0020.0002.12352] # CUNEIFORM SIGN USH TIMES A
+12353 ; [.2D3B.0020.0002.12353] # CUNEIFORM SIGN USH TIMES KU
+12354 ; [.2D3C.0020.0002.12354] # CUNEIFORM SIGN USH TIMES KUR
+12355 ; [.2D3D.0020.0002.12355] # CUNEIFORM SIGN USH TIMES TAK4
+12356 ; [.2D3E.0020.0002.12356] # CUNEIFORM SIGN USHX
+12357 ; [.2D3F.0020.0002.12357] # CUNEIFORM SIGN USH2
+12358 ; [.2D40.0020.0002.12358] # CUNEIFORM SIGN USHUMX
+12359 ; [.2D41.0020.0002.12359] # CUNEIFORM SIGN UTUKI
+1235A ; [.2D42.0020.0002.1235A] # CUNEIFORM SIGN UZ3
+1235B ; [.2D43.0020.0002.1235B] # CUNEIFORM SIGN UZ3 TIMES KASKAL
+1235C ; [.2D44.0020.0002.1235C] # CUNEIFORM SIGN UZU
+1235D ; [.2D45.0020.0002.1235D] # CUNEIFORM SIGN ZA
+1235E ; [.2D46.0020.0002.1235E] # CUNEIFORM SIGN ZA TENU
+1235F ; [.2D47.0020.0002.1235F] # CUNEIFORM SIGN ZA SQUARED TIMES KUR
+12360 ; [.2D48.0020.0002.12360] # CUNEIFORM SIGN ZAG
+12361 ; [.2D49.0020.0002.12361] # CUNEIFORM SIGN ZAMX
+12362 ; [.2D4A.0020.0002.12362] # CUNEIFORM SIGN ZE2
+12363 ; [.2D4B.0020.0002.12363] # CUNEIFORM SIGN ZI
+12364 ; [.2D4C.0020.0002.12364] # CUNEIFORM SIGN ZI OVER ZI
+12365 ; [.2D4D.0020.0002.12365] # CUNEIFORM SIGN ZI3
+12366 ; [.2D4E.0020.0002.12366] # CUNEIFORM SIGN ZIB
+12367 ; [.2D4F.0020.0002.12367] # CUNEIFORM SIGN ZIB KABA TENU
+12368 ; [.2D50.0020.0002.12368] # CUNEIFORM SIGN ZIG
+12369 ; [.2D51.0020.0002.12369] # CUNEIFORM SIGN ZIZ2
+1236A ; [.2D52.0020.0002.1236A] # CUNEIFORM SIGN ZU
+1236B ; [.2D53.0020.0002.1236B] # CUNEIFORM SIGN ZU5
+1236C ; [.2D54.0020.0002.1236C] # CUNEIFORM SIGN ZU5 TIMES A
+1236D ; [.2D55.0020.0002.1236D] # CUNEIFORM SIGN ZUBUR
+1236E ; [.2D56.0020.0002.1236E] # CUNEIFORM SIGN ZUM
+2F00 ; [.FB40.0020.0004.4E00][.CE00.0000.0000.4E00] # KANGXI RADICAL ONE; QQK
+3220 ; [*02B1.0020.0004.3220][.FB40.0020.0004.4E00][.CE00.0000.0000.4E00][*02B2.0020.001F.3220] # PARENTHESIZED IDEOGRAPH ONE; QQKN
+3280 ; [.FB40.0020.0006.4E00][.CE00.0000.0000.4E00] # CIRCLED IDEOGRAPH ONE; QQK
+3192 ; [.FB40.0020.0014.4E00][.CE00.0000.0000.4E00] # IDEOGRAPHIC ANNOTATION ONE MARK; QQK
+319C ; [.FB40.0020.0014.4E01][.CE01.0000.0000.4E01] # IDEOGRAPHIC ANNOTATION FOURTH MARK; QQK
+3226 ; [*02B1.0020.0004.3226][.FB40.0020.0004.4E03][.CE03.0000.0000.4E03][*02B2.0020.001F.3226] # PARENTHESIZED IDEOGRAPH SEVEN; QQKN
+3286 ; [.FB40.0020.0006.4E03][.CE03.0000.0000.4E03] # CIRCLED IDEOGRAPH SEVEN; QQK
+3222 ; [*02B1.0020.0004.3222][.FB40.0020.0004.4E09][.CE09.0000.0000.4E09][*02B2.0020.001F.3222] # PARENTHESIZED IDEOGRAPH THREE; QQKN
+3282 ; [.FB40.0020.0006.4E09][.CE09.0000.0000.4E09] # CIRCLED IDEOGRAPH THREE; QQK
+3194 ; [.FB40.0020.0014.4E09][.CE09.0000.0000.4E09] # IDEOGRAPHIC ANNOTATION THREE MARK; QQK
+32A4 ; [.FB40.0020.0006.4E0A][.CE0A.0000.0000.4E0A] # CIRCLED IDEOGRAPH HIGH; QQK
+3196 ; [.FB40.0020.0014.4E0A][.CE0A.0000.0000.4E0A] # IDEOGRAPHIC ANNOTATION TOP MARK; QQK
+32A6 ; [.FB40.0020.0006.4E0B][.CE0B.0000.0000.4E0B] # CIRCLED IDEOGRAPH LOW; QQK
+3198 ; [.FB40.0020.0014.4E0B][.CE0B.0000.0000.4E0B] # IDEOGRAPHIC ANNOTATION BOTTOM MARK; QQK
+F967 ; [.FB40.0020.0002.4E0D][.CE0D.0000.0000.4E0D] # CJK COMPATIBILITY IDEOGRAPH-F967; QQC
+319B ; [.FB40.0020.0014.4E19][.CE19.0000.0000.4E19] # IDEOGRAPHIC ANNOTATION THIRD MARK; QQK
+FA70 ; [.FB40.0020.0002.4E26][.CE26.0000.0000.4E26] # CJK COMPATIBILITY IDEOGRAPH-FA70; QQC
+2F01 ; [.FB40.0020.0004.4E28][.CE28.0000.0000.4E28] # KANGXI RADICAL LINE; QQK
+2EA6 ; [.FB40.0020.0004.4E2C][.CE2C.0000.0000.4E2C] # CJK RADICAL SIMPLIFIED HALF TREE TRUNK; QQK
+32A5 ; [.FB40.0020.0006.4E2D][.CE2D.0000.0000.4E2D] # CIRCLED IDEOGRAPH CENTRE; QQK
+3197 ; [.FB40.0020.0014.4E2D][.CE2D.0000.0000.4E2D] # IDEOGRAPHIC ANNOTATION MIDDLE MARK; QQK
+F905 ; [.FB40.0020.0002.4E32][.CE32.0000.0000.4E32] # CJK COMPATIBILITY IDEOGRAPH-F905; QQC
+2F02 ; [.FB40.0020.0004.4E36][.CE36.0000.0000.4E36] # KANGXI RADICAL DOT; QQK
+2E80 ; [.FB40.0020.0004.4E36][.CE36.0000.0000.4E36][.0000.0199.001F.2E80] # CJK RADICAL REPEAT; QQKN
+2F801 ; [.FB40.0020.0002.4E38][.CE38.0000.0000.4E38] # CJK COMPATIBILITY IDEOGRAPH-2F801; QQC
+F95E ; [.FB40.0020.0002.4E39][.CE39.0000.0000.4E39] # CJK COMPATIBILITY IDEOGRAPH-F95E; QQC
+2F800 ; [.FB40.0020.0002.4E3D][.CE3D.0000.0000.4E3D] # CJK COMPATIBILITY IDEOGRAPH-2F800; QQC
+2F03 ; [.FB40.0020.0004.4E3F][.CE3F.0000.0000.4E3F] # KANGXI RADICAL SLASH; QQK
+2F802 ; [.FB40.0020.0002.4E41][.CE41.0000.0000.4E41] # CJK COMPATIBILITY IDEOGRAPH-2F802; QQC
+2F04 ; [.FB40.0020.0004.4E59][.CE59.0000.0000.4E59] # KANGXI RADICAL SECOND; QQK
+319A ; [.FB40.0020.0014.4E59][.CE59.0000.0000.4E59] # IDEOGRAPHIC ANNOTATION SECOND MARK; QQK
+2E84 ; [.FB40.0020.0004.4E59][.CE59.0000.0000.4E59][.0000.0199.001F.2E84] # CJK RADICAL SECOND THREE; QQKN
+2E83 ; [.FB40.0020.0004.4E5A][.CE5A.0000.0000.4E5A] # CJK RADICAL SECOND TWO; QQK
+2E82 ; [.FB40.0020.0004.4E5B][.CE5B.0000.0000.4E5B] # CJK RADICAL SECOND ONE; QQK
+3228 ; [*02B1.0020.0004.3228][.FB40.0020.0004.4E5D][.CE5D.0000.0000.4E5D][*02B2.0020.001F.3228] # PARENTHESIZED IDEOGRAPH NINE; QQKN
+3288 ; [.FB40.0020.0006.4E5D][.CE5D.0000.0000.4E5D] # CIRCLED IDEOGRAPH NINE; QQK
+F91B ; [.FB40.0020.0002.4E82][.CE82.0000.0000.4E82] # CJK COMPATIBILITY IDEOGRAPH-F91B; QQC
+2F05 ; [.FB40.0020.0004.4E85][.CE85.0000.0000.4E85] # KANGXI RADICAL HOOK; QQK
+F9BA ; [.FB40.0020.0002.4E86][.CE86.0000.0000.4E86] # CJK COMPATIBILITY IDEOGRAPH-F9BA; QQC
+2F06 ; [.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C] # KANGXI RADICAL TWO; QQK
+3221 ; [*02B1.0020.0004.3221][.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C][*02B2.0020.001F.3221] # PARENTHESIZED IDEOGRAPH TWO; QQKN
+3281 ; [.FB40.0020.0006.4E8C][.CE8C.0000.0000.4E8C] # CIRCLED IDEOGRAPH TWO; QQK
+3193 ; [.FB40.0020.0014.4E8C][.CE8C.0000.0000.4E8C] # IDEOGRAPHIC ANNOTATION TWO MARK; QQK
+3224 ; [*02B1.0020.0004.3224][.FB40.0020.0004.4E94][.CE94.0000.0000.4E94][*02B2.0020.001F.3224] # PARENTHESIZED IDEOGRAPH FIVE; QQKN
+3284 ; [.FB40.0020.0006.4E94][.CE94.0000.0000.4E94] # CIRCLED IDEOGRAPH FIVE; QQK
+2F07 ; [.FB40.0020.0004.4EA0][.CEA0.0000.0000.4EA0] # KANGXI RADICAL LID; QQK
+F977 ; [.FB40.0020.0002.4EAE][.CEAE.0000.0000.4EAE] # CJK COMPATIBILITY IDEOGRAPH-F977; QQC
+2F08 ; [.FB40.0020.0004.4EBA][.CEBA.0000.0000.4EBA] # KANGXI RADICAL MAN; QQK
+319F ; [.FB40.0020.0014.4EBA][.CEBA.0000.0000.4EBA] # IDEOGRAPHIC ANNOTATION MAN MARK; QQK
+2E85 ; [.FB40.0020.0004.4EBB][.CEBB.0000.0000.4EBB] # CJK RADICAL PERSON; QQK
+F9FD ; [.FB40.0020.0002.4EC0][.CEC0.0000.0000.4EC0] # CJK COMPATIBILITY IDEOGRAPH-F9FD; QQC
+2F819 ; [.FB40.0020.0002.4ECC][.CECC.0000.0000.4ECC] # CJK COMPATIBILITY IDEOGRAPH-2F819; QQC
+3239 ; [*02B1.0020.0004.3239][.FB40.0020.0004.4EE3][.CEE3.0000.0000.4EE3][*02B2.0020.001F.3239] # PARENTHESIZED IDEOGRAPH REPRESENT; QQKN
+F9A8 ; [.FB40.0020.0002.4EE4][.CEE4.0000.0000.4EE4] # CJK COMPATIBILITY IDEOGRAPH-F9A8; QQC
+323D ; [*02B1.0020.0004.323D][.FB40.0020.0004.4F01][.CF01.0000.0000.4F01][*02B2.0020.001F.323D] # PARENTHESIZED IDEOGRAPH ENTERPRISE; QQKN
+32AD ; [.FB40.0020.0006.4F01][.CF01.0000.0000.4F01] # CIRCLED IDEOGRAPH ENTERPRISE; QQK
+3241 ; [*02B1.0020.0004.3241][.FB40.0020.0004.4F11][.CF11.0000.0000.4F11][*02B2.0020.001F.3241] # PARENTHESIZED IDEOGRAPH REST; QQKN
+32A1 ; [.FB40.0020.0006.4F11][.CF11.0000.0000.4F11] # CIRCLED IDEOGRAPH REST; QQK
+2F804 ; [.FB40.0020.0002.4F60][.CF60.0000.0000.4F60] # CJK COMPATIBILITY IDEOGRAPH-2F804; QQC
+FA73 ; [.FB40.0020.0002.4F80][.CF80.0000.0000.4F80] # CJK COMPATIBILITY IDEOGRAPH-FA73; QQC
+F92D ; [.FB40.0020.0002.4F86][.CF86.0000.0000.4F86] # CJK COMPATIBILITY IDEOGRAPH-F92D; QQC
+F9B5 ; [.FB40.0020.0002.4F8B][.CF8B.0000.0000.4F8B] # CJK COMPATIBILITY IDEOGRAPH-F9B5; QQC
+FA30 ; [.FB40.0020.0002.4FAE][.CFAE.0000.0000.4FAE] # CJK COMPATIBILITY IDEOGRAPH-FA30; QQC
+2F805 ; [.FB40.0020.0002.4FAE][.CFAE.0000.0000.4FAE] # CJK COMPATIBILITY IDEOGRAPH-2F805; QQC
+2F806 ; [.FB40.0020.0002.4FBB][.CFBB.0000.0000.4FBB] # CJK COMPATIBILITY IDEOGRAPH-2F806; QQC
+F965 ; [.FB40.0020.0002.4FBF][.CFBF.0000.0000.4FBF] # CJK COMPATIBILITY IDEOGRAPH-F965; QQC
+2F807 ; [.FB40.0020.0002.5002][.D002.0000.0000.5002] # CJK COMPATIBILITY IDEOGRAPH-2F807; QQC
+F9D4 ; [.FB40.0020.0002.502B][.D02B.0000.0000.502B] # CJK COMPATIBILITY IDEOGRAPH-F9D4; QQC
+2F808 ; [.FB40.0020.0002.507A][.D07A.0000.0000.507A] # CJK COMPATIBILITY IDEOGRAPH-2F808; QQC
+2F809 ; [.FB40.0020.0002.5099][.D099.0000.0000.5099] # CJK COMPATIBILITY IDEOGRAPH-2F809; QQC
+2F80B ; [.FB40.0020.0002.50CF][.D0CF.0000.0000.50CF] # CJK COMPATIBILITY IDEOGRAPH-2F80B; QQC
+F9BB ; [.FB40.0020.0002.50DA][.D0DA.0000.0000.50DA] # CJK COMPATIBILITY IDEOGRAPH-F9BB; QQC
+FA31 ; [.FB40.0020.0002.50E7][.D0E7.0000.0000.50E7] # CJK COMPATIBILITY IDEOGRAPH-FA31; QQC
+2F80A ; [.FB40.0020.0002.50E7][.D0E7.0000.0000.50E7] # CJK COMPATIBILITY IDEOGRAPH-2F80A; QQC
+329D ; [.FB40.0020.0006.512A][.D12A.0000.0000.512A] # CIRCLED IDEOGRAPH EXCELLENT; QQK
+2F09 ; [.FB40.0020.0004.513F][.D13F.0000.0000.513F] # KANGXI RADICAL LEGS; QQK
+FA0C ; [.FB40.0020.0002.5140][.D140.0000.0000.5140] # CJK COMPATIBILITY IDEOGRAPH-FA0C; QQC
+FA74 ; [.FB40.0020.0002.5145][.D145.0000.0000.5145] # CJK COMPATIBILITY IDEOGRAPH-FA74; QQC
+FA32 ; [.FB40.0020.0002.514D][.D14D.0000.0000.514D] # CJK COMPATIBILITY IDEOGRAPH-FA32; QQC
+2F80E ; [.FB40.0020.0002.514D][.D14D.0000.0000.514D] # CJK COMPATIBILITY IDEOGRAPH-2F80E; QQC
+2F80F ; [.FB40.0020.0002.5154][.D154.0000.0000.5154] # CJK COMPATIBILITY IDEOGRAPH-2F80F; QQC
+2F810 ; [.FB40.0020.0002.5164][.D164.0000.0000.5164] # CJK COMPATIBILITY IDEOGRAPH-2F810; QQC
+2F0A ; [.FB40.0020.0004.5165][.D165.0000.0000.5165] # KANGXI RADICAL ENTER; QQK
+2F814 ; [.FB40.0020.0002.5167][.D167.0000.0000.5167] # CJK COMPATIBILITY IDEOGRAPH-2F814; QQC
+FA72 ; [.FB40.0020.0002.5168][.D168.0000.0000.5168] # CJK COMPATIBILITY IDEOGRAPH-FA72; QQC
+F978 ; [.FB40.0020.0002.5169][.D169.0000.0000.5169] # CJK COMPATIBILITY IDEOGRAPH-F978; QQC
+2F0B ; [.FB40.0020.0004.516B][.D16B.0000.0000.516B] # KANGXI RADICAL EIGHT; QQK
+3227 ; [*02B1.0020.0004.3227][.FB40.0020.0004.516B][.D16B.0000.0000.516B][*02B2.0020.001F.3227] # PARENTHESIZED IDEOGRAPH EIGHT; QQKN
+3287 ; [.FB40.0020.0006.516B][.D16B.0000.0000.516B] # CIRCLED IDEOGRAPH EIGHT; QQK
+F9D1 ; [.FB40.0020.0002.516D][.D16D.0000.0000.516D] # CJK COMPATIBILITY IDEOGRAPH-F9D1; QQC
+3225 ; [*02B1.0020.0004.3225][.FB40.0020.0004.516D][.D16D.0000.0000.516D][*02B2.0020.001F.3225] # PARENTHESIZED IDEOGRAPH SIX; QQKN
+3285 ; [.FB40.0020.0006.516D][.D16D.0000.0000.516D] # CIRCLED IDEOGRAPH SIX; QQK
+2F811 ; [.FB40.0020.0002.5177][.D177.0000.0000.5177] # CJK COMPATIBILITY IDEOGRAPH-2F811; QQC
+FA75 ; [.FB40.0020.0002.5180][.D180.0000.0000.5180] # CJK COMPATIBILITY IDEOGRAPH-FA75; QQC
+2F0C ; [.FB40.0020.0004.5182][.D182.0000.0000.5182] # KANGXI RADICAL DOWN BOX; QQK
+2E86 ; [.FB40.0020.0004.5182][.D182.0000.0000.5182][.0000.0199.001F.2E86] # CJK RADICAL BOX; QQKN
+2F815 ; [.FB40.0020.0002.518D][.D18D.0000.0000.518D] # CJK COMPATIBILITY IDEOGRAPH-2F815; QQC
+2F8D2 ; [.FB40.0020.0002.5192][.D192.0000.0000.5192] # CJK COMPATIBILITY IDEOGRAPH-2F8D2; QQC
+2F8D3 ; [.FB40.0020.0002.5195][.D195.0000.0000.5195] # CJK COMPATIBILITY IDEOGRAPH-2F8D3; QQC
+2F0D ; [.FB40.0020.0004.5196][.D196.0000.0000.5196] # KANGXI RADICAL COVER; QQK
+2F817 ; [.FB40.0020.0002.5197][.D197.0000.0000.5197] # CJK COMPATIBILITY IDEOGRAPH-2F817; QQC
+32A2 ; [.FB40.0020.0006.5199][.D199.0000.0000.5199] # CIRCLED IDEOGRAPH COPY; QQK
+2F818 ; [.FB40.0020.0002.51A4][.D1A4.0000.0000.51A4] # CJK COMPATIBILITY IDEOGRAPH-2F818; QQC
+2F0E ; [.FB40.0020.0004.51AB][.D1AB.0000.0000.51AB] # KANGXI RADICAL ICE; QQK
+2F81A ; [.FB40.0020.0002.51AC][.D1AC.0000.0000.51AC] # CJK COMPATIBILITY IDEOGRAPH-2F81A; QQC
+FA71 ; [.FB40.0020.0002.51B5][.D1B5.0000.0000.51B5] # CJK COMPATIBILITY IDEOGRAPH-FA71; QQC
+2F81B ; [.FB40.0020.0002.51B5][.D1B5.0000.0000.51B5] # CJK COMPATIBILITY IDEOGRAPH-2F81B; QQC
+F92E ; [.FB40.0020.0002.51B7][.D1B7.0000.0000.51B7] # CJK COMPATIBILITY IDEOGRAPH-F92E; QQC
+F979 ; [.FB40.0020.0002.51C9][.D1C9.0000.0000.51C9] # CJK COMPATIBILITY IDEOGRAPH-F979; QQC
+F955 ; [.FB40.0020.0002.51CC][.D1CC.0000.0000.51CC] # CJK COMPATIBILITY IDEOGRAPH-F955; QQC
+F954 ; [.FB40.0020.0002.51DC][.D1DC.0000.0000.51DC] # CJK COMPATIBILITY IDEOGRAPH-F954; QQC
+FA15 ; [.FB40.0020.0002.51DE][.D1DE.0000.0000.51DE] # CJK COMPATIBILITY IDEOGRAPH-FA15; QQC
+2F0F ; [.FB40.0020.0004.51E0][.D1E0.0000.0000.51E0] # KANGXI RADICAL TABLE; QQK
+2E87 ; [.FB40.0020.0004.51E0][.D1E0.0000.0000.51E0][.0000.0199.001F.2E87] # CJK RADICAL TABLE; QQKN
+2F81D ; [.FB40.0020.0002.51F5][.D1F5.0000.0000.51F5] # CJK COMPATIBILITY IDEOGRAPH-2F81D; QQC
+2F10 ; [.FB40.0020.0004.51F5][.D1F5.0000.0000.51F5] # KANGXI RADICAL OPEN BOX; QQK
+2F11 ; [.FB40.0020.0004.5200][.D200.0000.0000.5200] # KANGXI RADICAL KNIFE; QQK
+2E88 ; [.FB40.0020.0004.5200][.D200.0000.0000.5200][.0000.0199.001F.2E88] # CJK RADICAL KNIFE ONE; QQKN
+2E89 ; [.FB40.0020.0004.5202][.D202.0000.0000.5202] # CJK RADICAL KNIFE TWO; QQK
+2F81E ; [.FB40.0020.0002.5203][.D203.0000.0000.5203] # CJK COMPATIBILITY IDEOGRAPH-2F81E; QQC
+FA00 ; [.FB40.0020.0002.5207][.D207.0000.0000.5207] # CJK COMPATIBILITY IDEOGRAPH-FA00; QQC
+2F850 ; [.FB40.0020.0002.5207][.D207.0000.0000.5207] # CJK COMPATIBILITY IDEOGRAPH-2F850; QQC
+F99C ; [.FB40.0020.0002.5217][.D217.0000.0000.5217] # CJK COMPATIBILITY IDEOGRAPH-F99C; QQC
+F9DD ; [.FB40.0020.0002.5229][.D229.0000.0000.5229] # CJK COMPATIBILITY IDEOGRAPH-F9DD; QQC
+F9FF ; [.FB40.0020.0002.523A][.D23A.0000.0000.523A] # CJK COMPATIBILITY IDEOGRAPH-F9FF; QQC
+2F820 ; [.FB40.0020.0002.523B][.D23B.0000.0000.523B] # CJK COMPATIBILITY IDEOGRAPH-2F820; QQC
+2F821 ; [.FB40.0020.0002.5246][.D246.0000.0000.5246] # CJK COMPATIBILITY IDEOGRAPH-2F821; QQC
+2F822 ; [.FB40.0020.0002.5272][.D272.0000.0000.5272] # CJK COMPATIBILITY IDEOGRAPH-2F822; QQC
+2F823 ; [.FB40.0020.0002.5277][.D277.0000.0000.5277] # CJK COMPATIBILITY IDEOGRAPH-2F823; QQC
+F9C7 ; [.FB40.0020.0002.5289][.D289.0000.0000.5289] # CJK COMPATIBILITY IDEOGRAPH-F9C7; QQC
+F98A ; [.FB40.0020.0002.529B][.D29B.0000.0000.529B] # CJK COMPATIBILITY IDEOGRAPH-F98A; QQC
+2F12 ; [.FB40.0020.0004.529B][.D29B.0000.0000.529B] # KANGXI RADICAL POWER; QQK
+F99D ; [.FB40.0020.0002.52A3][.D2A3.0000.0000.52A3] # CJK COMPATIBILITY IDEOGRAPH-F99D; QQC
+2F992 ; [.FB40.0020.0002.52B3][.D2B3.0000.0000.52B3] # CJK COMPATIBILITY IDEOGRAPH-2F992; QQC
+3238 ; [*02B1.0020.0004.3238][.FB40.0020.0004.52B4][.D2B4.0000.0000.52B4][*02B2.0020.001F.3238] # PARENTHESIZED IDEOGRAPH LABOR; QQKN
+3298 ; [.FB40.0020.0006.52B4][.D2B4.0000.0000.52B4] # CIRCLED IDEOGRAPH LABOR; QQK
+FA76 ; [.FB40.0020.0002.52C7][.D2C7.0000.0000.52C7] # CJK COMPATIBILITY IDEOGRAPH-FA76; QQC
+2F825 ; [.FB40.0020.0002.52C7][.D2C7.0000.0000.52C7] # CJK COMPATIBILITY IDEOGRAPH-2F825; QQC
+FA33 ; [.FB40.0020.0002.52C9][.D2C9.0000.0000.52C9] # CJK COMPATIBILITY IDEOGRAPH-FA33; QQC
+2F826 ; [.FB40.0020.0002.52C9][.D2C9.0000.0000.52C9] # CJK COMPATIBILITY IDEOGRAPH-2F826; QQC
+F952 ; [.FB40.0020.0002.52D2][.D2D2.0000.0000.52D2] # CJK COMPATIBILITY IDEOGRAPH-F952; QQC
+F92F ; [.FB40.0020.0002.52DE][.D2DE.0000.0000.52DE] # CJK COMPATIBILITY IDEOGRAPH-F92F; QQC
+FA34 ; [.FB40.0020.0002.52E4][.D2E4.0000.0000.52E4] # CJK COMPATIBILITY IDEOGRAPH-FA34; QQC
+2F827 ; [.FB40.0020.0002.52E4][.D2E4.0000.0000.52E4] # CJK COMPATIBILITY IDEOGRAPH-2F827; QQC
+F97F ; [.FB40.0020.0002.52F5][.D2F5.0000.0000.52F5] # CJK COMPATIBILITY IDEOGRAPH-F97F; QQC
+2F13 ; [.FB40.0020.0004.52F9][.D2F9.0000.0000.52F9] # KANGXI RADICAL WRAP; QQK
+FA77 ; [.FB40.0020.0002.52FA][.D2FA.0000.0000.52FA] # CJK COMPATIBILITY IDEOGRAPH-FA77; QQC
+2F828 ; [.FB40.0020.0002.52FA][.D2FA.0000.0000.52FA] # CJK COMPATIBILITY IDEOGRAPH-2F828; QQC
+2F829 ; [.FB40.0020.0002.5305][.D305.0000.0000.5305] # CJK COMPATIBILITY IDEOGRAPH-2F829; QQC
+2F82A ; [.FB40.0020.0002.5306][.D306.0000.0000.5306] # CJK COMPATIBILITY IDEOGRAPH-2F82A; QQC
+2F14 ; [.FB40.0020.0004.5315][.D315.0000.0000.5315] # KANGXI RADICAL SPOON; QQK
+F963 ; [.FB40.0020.0002.5317][.D317.0000.0000.5317] # CJK COMPATIBILITY IDEOGRAPH-F963; QQC
+2F82B ; [.FB40.0020.0002.5317][.D317.0000.0000.5317] # CJK COMPATIBILITY IDEOGRAPH-2F82B; QQC
+2F15 ; [.FB40.0020.0004.531A][.D31A.0000.0000.531A] # KANGXI RADICAL RIGHT OPEN BOX; QQK
+2F16 ; [.FB40.0020.0004.5338][.D338.0000.0000.5338] # KANGXI RADICAL HIDING ENCLOSURE; QQK
+32A9 ; [.FB40.0020.0006.533B][.D33B.0000.0000.533B] # CIRCLED IDEOGRAPH MEDICINE; QQK
+F9EB ; [.FB40.0020.0002.533F][.D33F.0000.0000.533F] # CJK COMPATIBILITY IDEOGRAPH-F9EB; QQC
+2F17 ; [.FB40.0020.0004.5341][.D341.0000.0000.5341] # KANGXI RADICAL TEN; QQK
+3038 ; [.FB40.0020.0004.5341][.D341.0000.0000.5341] # HANGZHOU NUMERAL TEN; QQK
+3229 ; [*02B1.0020.0004.3229][.FB40.0020.0004.5341][.D341.0000.0000.5341][*02B2.0020.001F.3229] # PARENTHESIZED IDEOGRAPH TEN; QQKN
+3289 ; [.FB40.0020.0006.5341][.D341.0000.0000.5341] # CIRCLED IDEOGRAPH TEN; QQK
+3039 ; [.FB40.0020.0004.5344][.D344.0000.0000.5344] # HANGZHOU NUMERAL TWENTY; QQK
+303A ; [.FB40.0020.0004.5345][.D345.0000.0000.5345] # HANGZHOU NUMERAL THIRTY; QQK
+2F82C ; [.FB40.0020.0002.5349][.D349.0000.0000.5349] # CJK COMPATIBILITY IDEOGRAPH-2F82C; QQC
+FA35 ; [.FB40.0020.0002.5351][.D351.0000.0000.5351] # CJK COMPATIBILITY IDEOGRAPH-FA35; QQC
+2F82D ; [.FB40.0020.0002.5351][.D351.0000.0000.5351] # CJK COMPATIBILITY IDEOGRAPH-2F82D; QQC
+323F ; [*02B1.0020.0004.323F][.FB40.0020.0004.5354][.D354.0000.0000.5354][*02B2.0020.001F.323F] # PARENTHESIZED IDEOGRAPH ALLIANCE; QQKN
+32AF ; [.FB40.0020.0006.5354][.D354.0000.0000.5354] # CIRCLED IDEOGRAPH ALLIANCE; QQK
+2F82E ; [.FB40.0020.0002.535A][.D35A.0000.0000.535A] # CJK COMPATIBILITY IDEOGRAPH-2F82E; QQC
+2F18 ; [.FB40.0020.0004.535C][.D35C.0000.0000.535C] # KANGXI RADICAL DIVINATION; QQK
+2E8A ; [.FB40.0020.0004.535C][.D35C.0000.0000.535C][.0000.0199.001F.2E8A] # CJK RADICAL DIVINATION; QQKN
+2F19 ; [.FB40.0020.0004.5369][.D369.0000.0000.5369] # KANGXI RADICAL SEAL; QQK
+2E8B ; [.FB40.0020.0004.5369][.D369.0000.0000.5369][.0000.0199.001F.2E8B] # CJK RADICAL SEAL; QQKN
+329E ; [.FB40.0020.0006.5370][.D370.0000.0000.5370] # CIRCLED IDEOGRAPH PRINT; QQK
+2F82F ; [.FB40.0020.0002.5373][.D373.0000.0000.5373] # CJK COMPATIBILITY IDEOGRAPH-2F82F; QQC
+F91C ; [.FB40.0020.0002.5375][.D375.0000.0000.5375] # CJK COMPATIBILITY IDEOGRAPH-F91C; QQC
+2F830 ; [.FB40.0020.0002.537D][.D37D.0000.0000.537D] # CJK COMPATIBILITY IDEOGRAPH-2F830; QQC
+2F831 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F831; QQC
+2F832 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F832; QQC
+2F833 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F833; QQC
+2F1A ; [.FB40.0020.0004.5382][.D382.0000.0000.5382] # KANGXI RADICAL CLIFF; QQK
+2E81 ; [.FB40.0020.0004.5382][.D382.0000.0000.5382][.0000.0199.001F.2E81] # CJK RADICAL CLIFF; QQKN
+2F1B ; [.FB40.0020.0004.53B6][.D3B6.0000.0000.53B6] # KANGXI RADICAL PRIVATE; QQK
+F96B ; [.FB40.0020.0002.53C3][.D3C3.0000.0000.53C3] # CJK COMPATIBILITY IDEOGRAPH-F96B; QQC
+2F1C ; [.FB40.0020.0004.53C8][.D3C8.0000.0000.53C8] # KANGXI RADICAL AGAIN; QQK
+2F836 ; [.FB40.0020.0002.53CA][.D3CA.0000.0000.53CA] # CJK COMPATIBILITY IDEOGRAPH-2F836; QQC
+2F837 ; [.FB40.0020.0002.53DF][.D3DF.0000.0000.53DF] # CJK COMPATIBILITY IDEOGRAPH-2F837; QQC
+2F1D ; [.FB40.0020.0004.53E3][.D3E3.0000.0000.53E3] # KANGXI RADICAL MOUTH; QQK
+F906 ; [.FB40.0020.0002.53E5][.D3E5.0000.0000.53E5] # CJK COMPATIBILITY IDEOGRAPH-F906; QQC
+2F839 ; [.FB40.0020.0002.53EB][.D3EB.0000.0000.53EB] # CJK COMPATIBILITY IDEOGRAPH-2F839; QQC
+2F83A ; [.FB40.0020.0002.53F1][.D3F1.0000.0000.53F1] # CJK COMPATIBILITY IDEOGRAPH-2F83A; QQC
+32A8 ; [.FB40.0020.0006.53F3][.D3F3.0000.0000.53F3] # CIRCLED IDEOGRAPH RIGHT; QQK
+2F83B ; [.FB40.0020.0002.5406][.D406.0000.0000.5406] # CJK COMPATIBILITY IDEOGRAPH-2F83B; QQC
+3234 ; [*02B1.0020.0004.3234][.FB40.0020.0004.540D][.D40D.0000.0000.540D][*02B2.0020.001F.3234] # PARENTHESIZED IDEOGRAPH NAME; QQKN
+3294 ; [.FB40.0020.0006.540D][.D40D.0000.0000.540D] # CIRCLED IDEOGRAPH NAME; QQK
+F9DE ; [.FB40.0020.0002.540F][.D40F.0000.0000.540F] # CJK COMPATIBILITY IDEOGRAPH-F9DE; QQC
+F9ED ; [.FB40.0020.0002.541D][.D41D.0000.0000.541D] # CJK COMPATIBILITY IDEOGRAPH-F9ED; QQC
+2F83D ; [.FB40.0020.0002.5438][.D438.0000.0000.5438] # CJK COMPATIBILITY IDEOGRAPH-2F83D; QQC
+F980 ; [.FB40.0020.0002.5442][.D442.0000.0000.5442] # CJK COMPATIBILITY IDEOGRAPH-F980; QQC
+2F83E ; [.FB40.0020.0002.5448][.D448.0000.0000.5448] # CJK COMPATIBILITY IDEOGRAPH-2F83E; QQC
+2F83F ; [.FB40.0020.0002.5468][.D468.0000.0000.5468] # CJK COMPATIBILITY IDEOGRAPH-2F83F; QQC
+323A ; [*02B1.0020.0004.323A][.FB40.0020.0004.547C][.D47C.0000.0000.547C][*02B2.0020.001F.323A] # PARENTHESIZED IDEOGRAPH CALL; QQKN
+2F83C ; [.FB40.0020.0002.549E][.D49E.0000.0000.549E] # CJK COMPATIBILITY IDEOGRAPH-2F83C; QQC
+2F840 ; [.FB40.0020.0002.54A2][.D4A2.0000.0000.54A2] # CJK COMPATIBILITY IDEOGRAPH-2F840; QQC
+F99E ; [.FB40.0020.0002.54BD][.D4BD.0000.0000.54BD] # CJK COMPATIBILITY IDEOGRAPH-F99E; QQC
+2F841 ; [.FB40.0020.0002.54F6][.D4F6.0000.0000.54F6] # CJK COMPATIBILITY IDEOGRAPH-2F841; QQC
+2F842 ; [.FB40.0020.0002.5510][.D510.0000.0000.5510] # CJK COMPATIBILITY IDEOGRAPH-2F842; QQC
+2F843 ; [.FB40.0020.0002.5553][.D553.0000.0000.5553] # CJK COMPATIBILITY IDEOGRAPH-2F843; QQC
+FA79 ; [.FB40.0020.0002.5555][.D555.0000.0000.5555] # CJK COMPATIBILITY IDEOGRAPH-FA79; QQC
+2F844 ; [.FB40.0020.0002.5563][.D563.0000.0000.5563] # CJK COMPATIBILITY IDEOGRAPH-2F844; QQC
+2F845 ; [.FB40.0020.0002.5584][.D584.0000.0000.5584] # CJK COMPATIBILITY IDEOGRAPH-2F845; QQC
+2F846 ; [.FB40.0020.0002.5584][.D584.0000.0000.5584] # CJK COMPATIBILITY IDEOGRAPH-2F846; QQC
+F90B ; [.FB40.0020.0002.5587][.D587.0000.0000.5587] # CJK COMPATIBILITY IDEOGRAPH-F90B; QQC
+FA7A ; [.FB40.0020.0002.5599][.D599.0000.0000.5599] # CJK COMPATIBILITY IDEOGRAPH-FA7A; QQC
+2F847 ; [.FB40.0020.0002.5599][.D599.0000.0000.5599] # CJK COMPATIBILITY IDEOGRAPH-2F847; QQC
+FA36 ; [.FB40.0020.0002.559D][.D59D.0000.0000.559D] # CJK COMPATIBILITY IDEOGRAPH-FA36; QQC
+FA78 ; [.FB40.0020.0002.559D][.D59D.0000.0000.559D] # CJK COMPATIBILITY IDEOGRAPH-FA78; QQC
+2F848 ; [.FB40.0020.0002.55AB][.D5AB.0000.0000.55AB] # CJK COMPATIBILITY IDEOGRAPH-2F848; QQC
+2F849 ; [.FB40.0020.0002.55B3][.D5B3.0000.0000.55B3] # CJK COMPATIBILITY IDEOGRAPH-2F849; QQC
+FA0D ; [.FB40.0020.0002.55C0][.D5C0.0000.0000.55C0] # CJK COMPATIBILITY IDEOGRAPH-FA0D; QQC
+2F84A ; [.FB40.0020.0002.55C2][.D5C2.0000.0000.55C2] # CJK COMPATIBILITY IDEOGRAPH-2F84A; QQC
+FA7B ; [.FB40.0020.0002.55E2][.D5E2.0000.0000.55E2] # CJK COMPATIBILITY IDEOGRAPH-FA7B; QQC
+FA37 ; [.FB40.0020.0002.5606][.D606.0000.0000.5606] # CJK COMPATIBILITY IDEOGRAPH-FA37; QQC
+2F84C ; [.FB40.0020.0002.5606][.D606.0000.0000.5606] # CJK COMPATIBILITY IDEOGRAPH-2F84C; QQC
+2F84E ; [.FB40.0020.0002.5651][.D651.0000.0000.5651] # CJK COMPATIBILITY IDEOGRAPH-2F84E; QQC
+FA38 ; [.FB40.0020.0002.5668][.D668.0000.0000.5668] # CJK COMPATIBILITY IDEOGRAPH-FA38; QQC
+2F84F ; [.FB40.0020.0002.5674][.D674.0000.0000.5674] # CJK COMPATIBILITY IDEOGRAPH-2F84F; QQC
+2F1E ; [.FB40.0020.0004.56D7][.D6D7.0000.0000.56D7] # KANGXI RADICAL ENCLOSURE; QQK
+3223 ; [*02B1.0020.0004.3223][.FB40.0020.0004.56DB][.D6DB.0000.0000.56DB][*02B2.0020.001F.3223] # PARENTHESIZED IDEOGRAPH FOUR; QQKN
+3283 ; [.FB40.0020.0006.56DB][.D6DB.0000.0000.56DB] # CIRCLED IDEOGRAPH FOUR; QQK
+3195 ; [.FB40.0020.0014.56DB][.D6DB.0000.0000.56DB] # IDEOGRAPHIC ANNOTATION FOUR MARK; QQK
+F9A9 ; [.FB40.0020.0002.56F9][.D6F9.0000.0000.56F9] # CJK COMPATIBILITY IDEOGRAPH-F9A9; QQC
+2F84B ; [.FB40.0020.0002.5716][.D716.0000.0000.5716] # CJK COMPATIBILITY IDEOGRAPH-2F84B; QQC
+2F84D ; [.FB40.0020.0002.5717][.D717.0000.0000.5717] # CJK COMPATIBILITY IDEOGRAPH-2F84D; QQC
+2F1F ; [.FB40.0020.0004.571F][.D71F.0000.0000.571F] # KANGXI RADICAL EARTH; QQK
+322F ; [*02B1.0020.0004.322F][.FB40.0020.0004.571F][.D71F.0000.0000.571F][*02B2.0020.001F.322F] # PARENTHESIZED IDEOGRAPH EARTH; QQKN
+328F ; [.FB40.0020.0006.571F][.D71F.0000.0000.571F] # CIRCLED IDEOGRAPH EARTH; QQK
+319E ; [.FB40.0020.0014.5730][.D730.0000.0000.5730] # IDEOGRAPHIC ANNOTATION EARTH MARK; QQK
+2F855 ; [.FB40.0020.0002.578B][.D78B.0000.0000.578B] # CJK COMPATIBILITY IDEOGRAPH-2F855; QQC
+2F852 ; [.FB40.0020.0002.57CE][.D7CE.0000.0000.57CE] # CJK COMPATIBILITY IDEOGRAPH-2F852; QQC
+2F853 ; [.FB40.0020.0002.57F4][.D7F4.0000.0000.57F4] # CJK COMPATIBILITY IDEOGRAPH-2F853; QQC
+2F854 ; [.FB40.0020.0002.580D][.D80D.0000.0000.580D] # CJK COMPATIBILITY IDEOGRAPH-2F854; QQC
+2F857 ; [.FB40.0020.0002.5831][.D831.0000.0000.5831] # CJK COMPATIBILITY IDEOGRAPH-2F857; QQC
+2F856 ; [.FB40.0020.0002.5832][.D832.0000.0000.5832] # CJK COMPATIBILITY IDEOGRAPH-2F856; QQC
+FA39 ; [.FB40.0020.0002.5840][.D840.0000.0000.5840] # CJK COMPATIBILITY IDEOGRAPH-FA39; QQC
+FA10 ; [.FB40.0020.0002.585A][.D85A.0000.0000.585A] # CJK COMPATIBILITY IDEOGRAPH-FA10; QQC
+FA7C ; [.FB40.0020.0002.585A][.D85A.0000.0000.585A] # CJK COMPATIBILITY IDEOGRAPH-FA7C; QQC
+F96C ; [.FB40.0020.0002.585E][.D85E.0000.0000.585E] # CJK COMPATIBILITY IDEOGRAPH-F96C; QQC
+FA3A ; [.FB40.0020.0002.58A8][.D8A8.0000.0000.58A8] # CJK COMPATIBILITY IDEOGRAPH-FA3A; QQC
+2F858 ; [.FB40.0020.0002.58AC][.D8AC.0000.0000.58AC] # CJK COMPATIBILITY IDEOGRAPH-2F858; QQC
+FA7D ; [.FB40.0020.0002.58B3][.D8B3.0000.0000.58B3] # CJK COMPATIBILITY IDEOGRAPH-FA7D; QQC
+F94A ; [.FB40.0020.0002.58D8][.D8D8.0000.0000.58D8] # CJK COMPATIBILITY IDEOGRAPH-F94A; QQC
+F942 ; [.FB40.0020.0002.58DF][.D8DF.0000.0000.58DF] # CJK COMPATIBILITY IDEOGRAPH-F942; QQC
+2F20 ; [.FB40.0020.0004.58EB][.D8EB.0000.0000.58EB] # KANGXI RADICAL SCHOLAR; QQK
+2F851 ; [.FB40.0020.0002.58EE][.D8EE.0000.0000.58EE] # CJK COMPATIBILITY IDEOGRAPH-2F851; QQC
+2F85A ; [.FB40.0020.0002.58F2][.D8F2.0000.0000.58F2] # CJK COMPATIBILITY IDEOGRAPH-2F85A; QQC
+2F85B ; [.FB40.0020.0002.58F7][.D8F7.0000.0000.58F7] # CJK COMPATIBILITY IDEOGRAPH-2F85B; QQC
+2F21 ; [.FB40.0020.0004.5902][.D902.0000.0000.5902] # KANGXI RADICAL GO; QQK
+2F85C ; [.FB40.0020.0002.5906][.D906.0000.0000.5906] # CJK COMPATIBILITY IDEOGRAPH-2F85C; QQC
+2F22 ; [.FB40.0020.0004.590A][.D90A.0000.0000.590A] # KANGXI RADICAL GO SLOWLY; QQK
+2F23 ; [.FB40.0020.0004.5915][.D915.0000.0000.5915] # KANGXI RADICAL EVENING; QQK
+2F85D ; [.FB40.0020.0002.591A][.D91A.0000.0000.591A] # CJK COMPATIBILITY IDEOGRAPH-2F85D; QQC
+32B0 ; [.FB40.0020.0006.591C][.D91C.0000.0000.591C] # CIRCLED IDEOGRAPH NIGHT; QQK
+2F85E ; [.FB40.0020.0002.5922][.D922.0000.0000.5922] # CJK COMPATIBILITY IDEOGRAPH-2F85E; QQC
+2F24 ; [.FB40.0020.0004.5927][.D927.0000.0000.5927] # KANGXI RADICAL BIG; QQK
+337D ; [.FB40.0020.001C.5927][.D927.0000.0000.5927][.FB40.0020.001F.6B63][.EB63.0000.0000.6B63] # SQUARE ERA NAME TAISYOU; QQKN
+319D ; [.FB40.0020.0014.5929][.D929.0000.0000.5929] # IDEOGRAPHIC ANNOTATION HEAVEN MARK; QQK
+FA7E ; [.FB40.0020.0002.5944][.D944.0000.0000.5944] # CJK COMPATIBILITY IDEOGRAPH-FA7E; QQC
+F90C ; [.FB40.0020.0002.5948][.D948.0000.0000.5948] # CJK COMPATIBILITY IDEOGRAPH-F90C; QQC
+F909 ; [.FB40.0020.0002.5951][.D951.0000.0000.5951] # CJK COMPATIBILITY IDEOGRAPH-F909; QQC
+FA7F ; [.FB40.0020.0002.5954][.D954.0000.0000.5954] # CJK COMPATIBILITY IDEOGRAPH-FA7F; QQC
+2F85F ; [.FB40.0020.0002.5962][.D962.0000.0000.5962] # CJK COMPATIBILITY IDEOGRAPH-2F85F; QQC
+F981 ; [.FB40.0020.0002.5973][.D973.0000.0000.5973] # CJK COMPATIBILITY IDEOGRAPH-F981; QQC
+2F25 ; [.FB40.0020.0004.5973][.D973.0000.0000.5973] # KANGXI RADICAL WOMAN; QQK
+329B ; [.FB40.0020.0006.5973][.D973.0000.0000.5973] # CIRCLED IDEOGRAPH FEMALE; QQK
+2F865 ; [.FB40.0020.0002.59D8][.D9D8.0000.0000.59D8] # CJK COMPATIBILITY IDEOGRAPH-2F865; QQC
+2F862 ; [.FB40.0020.0002.59EC][.D9EC.0000.0000.59EC] # CJK COMPATIBILITY IDEOGRAPH-2F862; QQC
+2F863 ; [.FB40.0020.0002.5A1B][.DA1B.0000.0000.5A1B] # CJK COMPATIBILITY IDEOGRAPH-2F863; QQC
+2F864 ; [.FB40.0020.0002.5A27][.DA27.0000.0000.5A27] # CJK COMPATIBILITY IDEOGRAPH-2F864; QQC
+FA80 ; [.FB40.0020.0002.5A62][.DA62.0000.0000.5A62] # CJK COMPATIBILITY IDEOGRAPH-FA80; QQC
+2F866 ; [.FB40.0020.0002.5A66][.DA66.0000.0000.5A66] # CJK COMPATIBILITY IDEOGRAPH-2F866; QQC
+2F986 ; [.FB40.0020.0002.5AB5][.DAB5.0000.0000.5AB5] # CJK COMPATIBILITY IDEOGRAPH-2F986; QQC
+2F869 ; [.FB40.0020.0002.5B08][.DB08.0000.0000.5B08] # CJK COMPATIBILITY IDEOGRAPH-2F869; QQC
+FA81 ; [.FB40.0020.0002.5B28][.DB28.0000.0000.5B28] # CJK COMPATIBILITY IDEOGRAPH-FA81; QQC
+2F86A ; [.FB40.0020.0002.5B3E][.DB3E.0000.0000.5B3E] # CJK COMPATIBILITY IDEOGRAPH-2F86A; QQC
+2F86B ; [.FB40.0020.0002.5B3E][.DB3E.0000.0000.5B3E] # CJK COMPATIBILITY IDEOGRAPH-2F86B; QQC
+2F26 ; [.FB40.0020.0004.5B50][.DB50.0000.0000.5B50] # KANGXI RADICAL CHILD; QQK
+323B ; [*02B1.0020.0004.323B][.FB40.0020.0004.5B66][.DB66.0000.0000.5B66][*02B2.0020.001F.323B] # PARENTHESIZED IDEOGRAPH STUDY; QQKN
+32AB ; [.FB40.0020.0006.5B66][.DB66.0000.0000.5B66] # CIRCLED IDEOGRAPH STUDY; QQK
+2F27 ; [.FB40.0020.0004.5B80][.DB80.0000.0000.5B80] # KANGXI RADICAL ROOF; QQK
+FA04 ; [.FB40.0020.0002.5B85][.DB85.0000.0000.5B85] # CJK COMPATIBILITY IDEOGRAPH-FA04; QQC
+32AA ; [.FB40.0020.0006.5B97][.DB97.0000.0000.5B97] # CIRCLED IDEOGRAPH RELIGION; QQK
+2F86D ; [.FB40.0020.0002.5BC3][.DBC3.0000.0000.5BC3] # CJK COMPATIBILITY IDEOGRAPH-2F86D; QQC
+2F86E ; [.FB40.0020.0002.5BD8][.DBD8.0000.0000.5BD8] # CJK COMPATIBILITY IDEOGRAPH-2F86E; QQC
+F95F ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-F95F; QQC
+F9AA ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-F9AA; QQC
+2F86F ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-2F86F; QQC
+F9BC ; [.FB40.0020.0002.5BEE][.DBEE.0000.0000.5BEE] # CJK COMPATIBILITY IDEOGRAPH-F9BC; QQC
+2F870 ; [.FB40.0020.0002.5BF3][.DBF3.0000.0000.5BF3] # CJK COMPATIBILITY IDEOGRAPH-2F870; QQC
+2F28 ; [.FB40.0020.0004.5BF8][.DBF8.0000.0000.5BF8] # KANGXI RADICAL INCH; QQK
+2F872 ; [.FB40.0020.0002.5BFF][.DBFF.0000.0000.5BFF] # CJK COMPATIBILITY IDEOGRAPH-2F872; QQC
+2F873 ; [.FB40.0020.0002.5C06][.DC06.0000.0000.5C06] # CJK COMPATIBILITY IDEOGRAPH-2F873; QQC
+2F29 ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F] # KANGXI RADICAL SMALL; QQK
+2E8C ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F][.0000.0199.001F.2E8C] # CJK RADICAL SMALL ONE; QQKN
+2E8D ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F][.0000.019A.001F.2E8D] # CJK RADICAL SMALL TWO; QQKN
+2F875 ; [.FB40.0020.0002.5C22][.DC22.0000.0000.5C22] # CJK COMPATIBILITY IDEOGRAPH-2F875; QQC
+2E90 ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22] # CJK RADICAL LAME THREE; QQK
+2F2A ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22] # KANGXI RADICAL LAME; QQK
+2E8E ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22][.0000.0199.001F.2E8E] # CJK RADICAL LAME ONE; QQKN
+2E8F ; [.FB40.0020.0004.5C23][.DC23.0000.0000.5C23] # CJK RADICAL LAME TWO; QQK
+2E91 ; [.FB40.0020.0004.5C23][.DC23.0000.0000.5C23][.0000.0199.001F.2E91] # CJK RADICAL LAME FOUR; QQKN
+2F2B ; [.FB40.0020.0004.5C38][.DC38.0000.0000.5C38] # KANGXI RADICAL CORPSE; QQK
+F9BD ; [.FB40.0020.0002.5C3F][.DC3F.0000.0000.5C3F] # CJK COMPATIBILITY IDEOGRAPH-F9BD; QQC
+2F877 ; [.FB40.0020.0002.5C60][.DC60.0000.0000.5C60] # CJK COMPATIBILITY IDEOGRAPH-2F877; QQC
+F94B ; [.FB40.0020.0002.5C62][.DC62.0000.0000.5C62] # CJK COMPATIBILITY IDEOGRAPH-F94B; QQC
+FA3B ; [.FB40.0020.0002.5C64][.DC64.0000.0000.5C64] # CJK COMPATIBILITY IDEOGRAPH-FA3B; QQC
+F9DF ; [.FB40.0020.0002.5C65][.DC65.0000.0000.5C65] # CJK COMPATIBILITY IDEOGRAPH-F9DF; QQC
+FA3C ; [.FB40.0020.0002.5C6E][.DC6E.0000.0000.5C6E] # CJK COMPATIBILITY IDEOGRAPH-FA3C; QQC
+2F878 ; [.FB40.0020.0002.5C6E][.DC6E.0000.0000.5C6E] # CJK COMPATIBILITY IDEOGRAPH-2F878; QQC
+2F2C ; [.FB40.0020.0004.5C6E][.DC6E.0000.0000.5C6E] # KANGXI RADICAL SPROUT; QQK
+2F2D ; [.FB40.0020.0004.5C71][.DC71.0000.0000.5C71] # KANGXI RADICAL MOUNTAIN; QQK
+2F87A ; [.FB40.0020.0002.5C8D][.DC8D.0000.0000.5C8D] # CJK COMPATIBILITY IDEOGRAPH-2F87A; QQC
+2F879 ; [.FB40.0020.0002.5CC0][.DCC0.0000.0000.5CC0] # CJK COMPATIBILITY IDEOGRAPH-2F879; QQC
+F9D5 ; [.FB40.0020.0002.5D19][.DD19.0000.0000.5D19] # CJK COMPATIBILITY IDEOGRAPH-F9D5; QQC
+2F87C ; [.FB40.0020.0002.5D43][.DD43.0000.0000.5D43] # CJK COMPATIBILITY IDEOGRAPH-2F87C; QQC
+F921 ; [.FB40.0020.0002.5D50][.DD50.0000.0000.5D50] # CJK COMPATIBILITY IDEOGRAPH-F921; QQC
+2F87F ; [.FB40.0020.0002.5D6B][.DD6B.0000.0000.5D6B] # CJK COMPATIBILITY IDEOGRAPH-2F87F; QQC
+2F87E ; [.FB40.0020.0002.5D6E][.DD6E.0000.0000.5D6E] # CJK COMPATIBILITY IDEOGRAPH-2F87E; QQC
+2F880 ; [.FB40.0020.0002.5D7C][.DD7C.0000.0000.5D7C] # CJK COMPATIBILITY IDEOGRAPH-2F880; QQC
+2F9F4 ; [.FB40.0020.0002.5DB2][.DDB2.0000.0000.5DB2] # CJK COMPATIBILITY IDEOGRAPH-2F9F4; QQC
+F9AB ; [.FB40.0020.0002.5DBA][.DDBA.0000.0000.5DBA] # CJK COMPATIBILITY IDEOGRAPH-F9AB; QQC
+2F2E ; [.FB40.0020.0004.5DDB][.DDDB.0000.0000.5DDB] # KANGXI RADICAL RIVER; QQK
+2F881 ; [.FB40.0020.0002.5DE1][.DDE1.0000.0000.5DE1] # CJK COMPATIBILITY IDEOGRAPH-2F881; QQC
+2F882 ; [.FB40.0020.0002.5DE2][.DDE2.0000.0000.5DE2] # CJK COMPATIBILITY IDEOGRAPH-2F882; QQC
+2F2F ; [.FB40.0020.0004.5DE5][.DDE5.0000.0000.5DE5] # KANGXI RADICAL WORK; QQK
+32A7 ; [.FB40.0020.0006.5DE6][.DDE6.0000.0000.5DE6] # CIRCLED IDEOGRAPH LEFT; QQK
+2F30 ; [.FB40.0020.0004.5DF1][.DDF1.0000.0000.5DF1] # KANGXI RADICAL ONESELF; QQK
+2E92 ; [.FB40.0020.0004.5DF3][.DDF3.0000.0000.5DF3] # CJK RADICAL SNAKE; QQK
+2F884 ; [.FB40.0020.0002.5DFD][.DDFD.0000.0000.5DFD] # CJK COMPATIBILITY IDEOGRAPH-2F884; QQC
+2F31 ; [.FB40.0020.0004.5DFE][.DDFE.0000.0000.5DFE] # KANGXI RADICAL TURBAN; QQK
+2F885 ; [.FB40.0020.0002.5E28][.DE28.0000.0000.5E28] # CJK COMPATIBILITY IDEOGRAPH-2F885; QQC
+2F886 ; [.FB40.0020.0002.5E3D][.DE3D.0000.0000.5E3D] # CJK COMPATIBILITY IDEOGRAPH-2F886; QQC
+2F887 ; [.FB40.0020.0002.5E69][.DE69.0000.0000.5E69] # CJK COMPATIBILITY IDEOGRAPH-2F887; QQC
+2F32 ; [.FB40.0020.0004.5E72][.DE72.0000.0000.5E72] # KANGXI RADICAL DRY; QQK
+337B ; [.FB40.0020.001C.5E73][.DE73.0000.0000.5E73][.FB40.0020.001F.6210][.E210.0000.0000.6210] # SQUARE ERA NAME HEISEI; QQKN
+F98E ; [.FB40.0020.0002.5E74][.DE74.0000.0000.5E74] # CJK COMPATIBILITY IDEOGRAPH-F98E; QQC
+2E93 ; [.FB40.0020.0004.5E7A][.DE7A.0000.0000.5E7A] # CJK RADICAL THREAD; QQK
+2F33 ; [.FB40.0020.0004.5E7A][.DE7A.0000.0000.5E7A] # KANGXI RADICAL SHORT THREAD; QQK
+2F34 ; [.FB40.0020.0004.5E7F][.DE7F.0000.0000.5E7F] # KANGXI RADICAL DOTTED CLIFF; QQK
+FA01 ; [.FB40.0020.0002.5EA6][.DEA6.0000.0000.5EA6] # CJK COMPATIBILITY IDEOGRAPH-FA01; QQC
+2F88B ; [.FB40.0020.0002.5EB0][.DEB0.0000.0000.5EB0] # CJK COMPATIBILITY IDEOGRAPH-2F88B; QQC
+2F88C ; [.FB40.0020.0002.5EB3][.DEB3.0000.0000.5EB3] # CJK COMPATIBILITY IDEOGRAPH-2F88C; QQC
+2F88D ; [.FB40.0020.0002.5EB6][.DEB6.0000.0000.5EB6] # CJK COMPATIBILITY IDEOGRAPH-2F88D; QQC
+F9A2 ; [.FB40.0020.0002.5EC9][.DEC9.0000.0000.5EC9] # CJK COMPATIBILITY IDEOGRAPH-F9A2; QQC
+F928 ; [.FB40.0020.0002.5ECA][.DECA.0000.0000.5ECA] # CJK COMPATIBILITY IDEOGRAPH-F928; QQC
+2F88E ; [.FB40.0020.0002.5ECA][.DECA.0000.0000.5ECA] # CJK COMPATIBILITY IDEOGRAPH-2F88E; QQC
+FA82 ; [.FB40.0020.0002.5ED2][.DED2.0000.0000.5ED2] # CJK COMPATIBILITY IDEOGRAPH-FA82; QQC
+FA0B ; [.FB40.0020.0002.5ED3][.DED3.0000.0000.5ED3] # CJK COMPATIBILITY IDEOGRAPH-FA0B; QQC
+FA83 ; [.FB40.0020.0002.5ED9][.DED9.0000.0000.5ED9] # CJK COMPATIBILITY IDEOGRAPH-FA83; QQC
+F982 ; [.FB40.0020.0002.5EEC][.DEEC.0000.0000.5EEC] # CJK COMPATIBILITY IDEOGRAPH-F982; QQC
+2F35 ; [.FB40.0020.0004.5EF4][.DEF4.0000.0000.5EF4] # KANGXI RADICAL LONG STRIDE; QQK
+2F890 ; [.FB40.0020.0002.5EFE][.DEFE.0000.0000.5EFE] # CJK COMPATIBILITY IDEOGRAPH-2F890; QQC
+2F36 ; [.FB40.0020.0004.5EFE][.DEFE.0000.0000.5EFE] # KANGXI RADICAL TWO HANDS; QQK
+F943 ; [.FB40.0020.0002.5F04][.DF04.0000.0000.5F04] # CJK COMPATIBILITY IDEOGRAPH-F943; QQC
+2F37 ; [.FB40.0020.0004.5F0B][.DF0B.0000.0000.5F0B] # KANGXI RADICAL SHOOT; QQK
+2F38 ; [.FB40.0020.0004.5F13][.DF13.0000.0000.5F13] # KANGXI RADICAL BOW; QQK
+2F894 ; [.FB40.0020.0002.5F22][.DF22.0000.0000.5F22] # CJK COMPATIBILITY IDEOGRAPH-2F894; QQC
+2F895 ; [.FB40.0020.0002.5F22][.DF22.0000.0000.5F22] # CJK COMPATIBILITY IDEOGRAPH-2F895; QQC
+2F39 ; [.FB40.0020.0004.5F50][.DF50.0000.0000.5F50] # KANGXI RADICAL SNOUT; QQK
+2E95 ; [.FB40.0020.0004.5F50][.DF50.0000.0000.5F50][.0000.0199.001F.2E95] # CJK RADICAL SNOUT TWO; QQKN
+2E94 ; [.FB40.0020.0004.5F51][.DF51.0000.0000.5F51] # CJK RADICAL SNOUT ONE; QQK
+2F874 ; [.FB40.0020.0002.5F53][.DF53.0000.0000.5F53] # CJK COMPATIBILITY IDEOGRAPH-2F874; QQC
+2F3A ; [.FB40.0020.0004.5F61][.DF61.0000.0000.5F61] # KANGXI RADICAL BRISTLE; QQK
+2F899 ; [.FB40.0020.0002.5F62][.DF62.0000.0000.5F62] # CJK COMPATIBILITY IDEOGRAPH-2F899; QQC
+FA84 ; [.FB40.0020.0002.5F69][.DF69.0000.0000.5F69] # CJK COMPATIBILITY IDEOGRAPH-FA84; QQC
+2F89A ; [.FB40.0020.0002.5F6B][.DF6B.0000.0000.5F6B] # CJK COMPATIBILITY IDEOGRAPH-2F89A; QQC
+2F3B ; [.FB40.0020.0004.5F73][.DF73.0000.0000.5F73] # KANGXI RADICAL STEP; QQK
+F9D8 ; [.FB40.0020.0002.5F8B][.DF8B.0000.0000.5F8B] # CJK COMPATIBILITY IDEOGRAPH-F9D8; QQC
+2F89C ; [.FB40.0020.0002.5F9A][.DF9A.0000.0000.5F9A] # CJK COMPATIBILITY IDEOGRAPH-2F89C; QQC
+F966 ; [.FB40.0020.0002.5FA9][.DFA9.0000.0000.5FA9] # CJK COMPATIBILITY IDEOGRAPH-F966; QQC
+FA85 ; [.FB40.0020.0002.5FAD][.DFAD.0000.0000.5FAD] # CJK COMPATIBILITY IDEOGRAPH-FA85; QQC
+2F3C ; [.FB40.0020.0004.5FC3][.DFC3.0000.0000.5FC3] # KANGXI RADICAL HEART; QQK
+2E97 ; [.FB40.0020.0004.5FC3][.DFC3.0000.0000.5FC3][.0000.0199.001F.2E97] # CJK RADICAL HEART TWO; QQKN
+2E96 ; [.FB40.0020.0004.5FC4][.DFC4.0000.0000.5FC4] # CJK RADICAL HEART ONE; QQK
+2F89D ; [.FB40.0020.0002.5FCD][.DFCD.0000.0000.5FCD] # CJK COMPATIBILITY IDEOGRAPH-2F89D; QQC
+2F89E ; [.FB40.0020.0002.5FD7][.DFD7.0000.0000.5FD7] # CJK COMPATIBILITY IDEOGRAPH-2F89E; QQC
+F9A3 ; [.FB40.0020.0002.5FF5][.DFF5.0000.0000.5FF5] # CJK COMPATIBILITY IDEOGRAPH-F9A3; QQC
+2F89F ; [.FB40.0020.0002.5FF9][.DFF9.0000.0000.5FF9] # CJK COMPATIBILITY IDEOGRAPH-2F89F; QQC
+F960 ; [.FB40.0020.0002.6012][.E012.0000.0000.6012] # CJK COMPATIBILITY IDEOGRAPH-F960; QQC
+F9AC ; [.FB40.0020.0002.601C][.E01C.0000.0000.601C] # CJK COMPATIBILITY IDEOGRAPH-F9AC; QQC
+2F8A0 ; [.FB40.0020.0002.6081][.E081.0000.0000.6081] # CJK COMPATIBILITY IDEOGRAPH-2F8A0; QQC
+FA3D ; [.FB40.0020.0002.6094][.E094.0000.0000.6094] # CJK COMPATIBILITY IDEOGRAPH-FA3D; QQC
+2F8A3 ; [.FB40.0020.0002.6094][.E094.0000.0000.6094] # CJK COMPATIBILITY IDEOGRAPH-2F8A3; QQC
+2F8A5 ; [.FB40.0020.0002.60C7][.E0C7.0000.0000.60C7] # CJK COMPATIBILITY IDEOGRAPH-2F8A5; QQC
+FA86 ; [.FB40.0020.0002.60D8][.E0D8.0000.0000.60D8] # CJK COMPATIBILITY IDEOGRAPH-FA86; QQC
+F9B9 ; [.FB40.0020.0002.60E1][.E0E1.0000.0000.60E1] # CJK COMPATIBILITY IDEOGRAPH-F9B9; QQC
+FA88 ; [.FB40.0020.0002.6108][.E108.0000.0000.6108] # CJK COMPATIBILITY IDEOGRAPH-FA88; QQC
+F9D9 ; [.FB40.0020.0002.6144][.E144.0000.0000.6144] # CJK COMPATIBILITY IDEOGRAPH-F9D9; QQC
+2F8A6 ; [.FB40.0020.0002.6148][.E148.0000.0000.6148] # CJK COMPATIBILITY IDEOGRAPH-2F8A6; QQC
+2F8A7 ; [.FB40.0020.0002.614C][.E14C.0000.0000.614C] # CJK COMPATIBILITY IDEOGRAPH-2F8A7; QQC
+2F8A9 ; [.FB40.0020.0002.614C][.E14C.0000.0000.614C] # CJK COMPATIBILITY IDEOGRAPH-2F8A9; QQC
+FA87 ; [.FB40.0020.0002.614E][.E14E.0000.0000.614E] # CJK COMPATIBILITY IDEOGRAPH-FA87; QQC
+2F8A8 ; [.FB40.0020.0002.614E][.E14E.0000.0000.614E] # CJK COMPATIBILITY IDEOGRAPH-2F8A8; QQC
+FA8A ; [.FB40.0020.0002.6160][.E160.0000.0000.6160] # CJK COMPATIBILITY IDEOGRAPH-FA8A; QQC
+FA3E ; [.FB40.0020.0002.6168][.E168.0000.0000.6168] # CJK COMPATIBILITY IDEOGRAPH-FA3E; QQC
+2F8AA ; [.FB40.0020.0002.617A][.E17A.0000.0000.617A] # CJK COMPATIBILITY IDEOGRAPH-2F8AA; QQC
+FA3F ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-FA3F; QQC
+FA89 ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-FA89; QQC
+2F8AB ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-2F8AB; QQC
+F98F ; [.FB40.0020.0002.6190][.E190.0000.0000.6190] # CJK COMPATIBILITY IDEOGRAPH-F98F; QQC
+2F8AD ; [.FB40.0020.0002.61A4][.E1A4.0000.0000.61A4] # CJK COMPATIBILITY IDEOGRAPH-2F8AD; QQC
+2F8AE ; [.FB40.0020.0002.61AF][.E1AF.0000.0000.61AF] # CJK COMPATIBILITY IDEOGRAPH-2F8AE; QQC
+2F8AC ; [.FB40.0020.0002.61B2][.E1B2.0000.0000.61B2] # CJK COMPATIBILITY IDEOGRAPH-2F8AC; QQC
+2F8AF ; [.FB40.0020.0002.61DE][.E1DE.0000.0000.61DE] # CJK COMPATIBILITY IDEOGRAPH-2F8AF; QQC
+FA40 ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-FA40; QQC
+FA8B ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-FA8B; QQC
+2F8B0 ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-2F8B0; QQC
+F90D ; [.FB40.0020.0002.61F6][.E1F6.0000.0000.61F6] # CJK COMPATIBILITY IDEOGRAPH-F90D; QQC
+2F8B1 ; [.FB40.0020.0002.61F6][.E1F6.0000.0000.61F6] # CJK COMPATIBILITY IDEOGRAPH-2F8B1; QQC
+F990 ; [.FB40.0020.0002.6200][.E200.0000.0000.6200] # CJK COMPATIBILITY IDEOGRAPH-F990; QQC
+2F3D ; [.FB40.0020.0004.6208][.E208.0000.0000.6208] # KANGXI RADICAL HALBERD; QQK
+2F8B2 ; [.FB40.0020.0002.6210][.E210.0000.0000.6210] # CJK COMPATIBILITY IDEOGRAPH-2F8B2; QQC
+2F8B3 ; [.FB40.0020.0002.621B][.E21B.0000.0000.621B] # CJK COMPATIBILITY IDEOGRAPH-2F8B3; QQC
+F9D2 ; [.FB40.0020.0002.622E][.E22E.0000.0000.622E] # CJK COMPATIBILITY IDEOGRAPH-F9D2; QQC
+FA8C ; [.FB40.0020.0002.6234][.E234.0000.0000.6234] # CJK COMPATIBILITY IDEOGRAPH-FA8C; QQC
+2F3E ; [.FB40.0020.0004.6236][.E236.0000.0000.6236] # KANGXI RADICAL DOOR; QQK
+2F3F ; [.FB40.0020.0004.624B][.E24B.0000.0000.624B] # KANGXI RADICAL HAND; QQK
+2E98 ; [.FB40.0020.0004.624C][.E24C.0000.0000.624C] # CJK RADICAL HAND; QQK
+2F8B4 ; [.FB40.0020.0002.625D][.E25D.0000.0000.625D] # CJK COMPATIBILITY IDEOGRAPH-2F8B4; QQC
+2F8B5 ; [.FB40.0020.0002.62B1][.E2B1.0000.0000.62B1] # CJK COMPATIBILITY IDEOGRAPH-2F8B5; QQC
+F925 ; [.FB40.0020.0002.62C9][.E2C9.0000.0000.62C9] # CJK COMPATIBILITY IDEOGRAPH-F925; QQC
+F95B ; [.FB40.0020.0002.62CF][.E2CF.0000.0000.62CF] # CJK COMPATIBILITY IDEOGRAPH-F95B; QQC
+FA02 ; [.FB40.0020.0002.62D3][.E2D3.0000.0000.62D3] # CJK COMPATIBILITY IDEOGRAPH-FA02; QQC
+2F8B6 ; [.FB40.0020.0002.62D4][.E2D4.0000.0000.62D4] # CJK COMPATIBILITY IDEOGRAPH-2F8B6; QQC
+2F8BA ; [.FB40.0020.0002.62FC][.E2FC.0000.0000.62FC] # CJK COMPATIBILITY IDEOGRAPH-2F8BA; QQC
+F973 ; [.FB40.0020.0002.62FE][.E2FE.0000.0000.62FE] # CJK COMPATIBILITY IDEOGRAPH-F973; QQC
+2F8B9 ; [.FB40.0020.0002.633D][.E33D.0000.0000.633D] # CJK COMPATIBILITY IDEOGRAPH-2F8B9; QQC
+2F8B7 ; [.FB40.0020.0002.6350][.E350.0000.0000.6350] # CJK COMPATIBILITY IDEOGRAPH-2F8B7; QQC
+2F8BB ; [.FB40.0020.0002.6368][.E368.0000.0000.6368] # CJK COMPATIBILITY IDEOGRAPH-2F8BB; QQC
+F9A4 ; [.FB40.0020.0002.637B][.E37B.0000.0000.637B] # CJK COMPATIBILITY IDEOGRAPH-F9A4; QQC
+2F8BC ; [.FB40.0020.0002.6383][.E383.0000.0000.6383] # CJK COMPATIBILITY IDEOGRAPH-2F8BC; QQC
+F975 ; [.FB40.0020.0002.63A0][.E3A0.0000.0000.63A0] # CJK COMPATIBILITY IDEOGRAPH-F975; QQC
+2F8C1 ; [.FB40.0020.0002.63A9][.E3A9.0000.0000.63A9] # CJK COMPATIBILITY IDEOGRAPH-2F8C1; QQC
+FA8D ; [.FB40.0020.0002.63C4][.E3C4.0000.0000.63C4] # CJK COMPATIBILITY IDEOGRAPH-FA8D; QQC
+2F8C0 ; [.FB40.0020.0002.63C5][.E3C5.0000.0000.63C5] # CJK COMPATIBILITY IDEOGRAPH-2F8C0; QQC
+2F8BD ; [.FB40.0020.0002.63E4][.E3E4.0000.0000.63E4] # CJK COMPATIBILITY IDEOGRAPH-2F8BD; QQC
+FA8E ; [.FB40.0020.0002.641C][.E41C.0000.0000.641C] # CJK COMPATIBILITY IDEOGRAPH-FA8E; QQC
+2F8BF ; [.FB40.0020.0002.6422][.E422.0000.0000.6422] # CJK COMPATIBILITY IDEOGRAPH-2F8BF; QQC
+FA8F ; [.FB40.0020.0002.6452][.E452.0000.0000.6452] # CJK COMPATIBILITY IDEOGRAPH-FA8F; QQC
+2F8C3 ; [.FB40.0020.0002.6469][.E469.0000.0000.6469] # CJK COMPATIBILITY IDEOGRAPH-2F8C3; QQC
+2F8C6 ; [.FB40.0020.0002.6477][.E477.0000.0000.6477] # CJK COMPATIBILITY IDEOGRAPH-2F8C6; QQC
+2F8C4 ; [.FB40.0020.0002.647E][.E47E.0000.0000.647E] # CJK COMPATIBILITY IDEOGRAPH-2F8C4; QQC
+F991 ; [.FB40.0020.0002.649A][.E49A.0000.0000.649A] # CJK COMPATIBILITY IDEOGRAPH-F991; QQC
+2F8C5 ; [.FB40.0020.0002.649D][.E49D.0000.0000.649D] # CJK COMPATIBILITY IDEOGRAPH-2F8C5; QQC
+F930 ; [.FB40.0020.0002.64C4][.E4C4.0000.0000.64C4] # CJK COMPATIBILITY IDEOGRAPH-F930; QQC
+2F40 ; [.FB40.0020.0004.652F][.E52F.0000.0000.652F] # KANGXI RADICAL BRANCH; QQK
+2F41 ; [.FB40.0020.0004.6534][.E534.0000.0000.6534] # KANGXI RADICAL RAP; QQK
+2E99 ; [.FB40.0020.0004.6535][.E535.0000.0000.6535] # CJK RADICAL RAP; QQK
+FA41 ; [.FB40.0020.0002.654F][.E54F.0000.0000.654F] # CJK COMPATIBILITY IDEOGRAPH-FA41; QQC
+2F8C8 ; [.FB40.0020.0002.654F][.E54F.0000.0000.654F] # CJK COMPATIBILITY IDEOGRAPH-2F8C8; QQC
+FA90 ; [.FB40.0020.0002.6556][.E556.0000.0000.6556] # CJK COMPATIBILITY IDEOGRAPH-FA90; QQC
+2F8C9 ; [.FB40.0020.0002.656C][.E56C.0000.0000.656C] # CJK COMPATIBILITY IDEOGRAPH-2F8C9; QQC
+F969 ; [.FB40.0020.0002.6578][.E578.0000.0000.6578] # CJK COMPATIBILITY IDEOGRAPH-F969; QQC
+2F42 ; [.FB40.0020.0004.6587][.E587.0000.0000.6587] # KANGXI RADICAL SCRIPT; QQK
+2F43 ; [.FB40.0020.0004.6597][.E597.0000.0000.6597] # KANGXI RADICAL DIPPER; QQK
+F9BE ; [.FB40.0020.0002.6599][.E599.0000.0000.6599] # CJK COMPATIBILITY IDEOGRAPH-F9BE; QQC
+2F44 ; [.FB40.0020.0004.65A4][.E5A4.0000.0000.65A4] # KANGXI RADICAL AXE; QQK
+2F45 ; [.FB40.0020.0004.65B9][.E5B9.0000.0000.65B9] # KANGXI RADICAL SQUARE; QQK
+F983 ; [.FB40.0020.0002.65C5][.E5C5.0000.0000.65C5] # CJK COMPATIBILITY IDEOGRAPH-F983; QQC
+2F46 ; [.FB40.0020.0004.65E0][.E5E0.0000.0000.65E0] # KANGXI RADICAL NOT; QQK
+2E9B ; [.FB40.0020.0004.65E1][.E5E1.0000.0000.65E1] # CJK RADICAL CHOKE; QQK
+FA42 ; [.FB40.0020.0002.65E2][.E5E2.0000.0000.65E2] # CJK COMPATIBILITY IDEOGRAPH-FA42; QQC
+2F8CB ; [.FB40.0020.0002.65E3][.E5E3.0000.0000.65E3] # CJK COMPATIBILITY IDEOGRAPH-2F8CB; QQC
+2F47 ; [.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # KANGXI RADICAL SUN; QQK
+3230 ; [*02B1.0020.0004.3230][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5][*02B2.0020.001F.3230] # PARENTHESIZED IDEOGRAPH SUN; QQKN
+3290 ; [.FB40.0020.0006.65E5][.E5E5.0000.0000.65E5] # CIRCLED IDEOGRAPH SUN; QQK
+2E9C ; [.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5][.0000.0199.001F.2E9C] # CJK RADICAL SUN; QQKN
+337E ; [.FB40.0020.001C.660E][.E60E.0000.0000.660E][.FB40.0020.001F.6CBB][.ECBB.0000.0000.6CBB] # SQUARE ERA NAME MEIZI; QQKN
+F9E0 ; [.FB40.0020.0002.6613][.E613.0000.0000.6613] # CJK COMPATIBILITY IDEOGRAPH-F9E0; QQC
+337C ; [.FB40.0020.001C.662D][.E62D.0000.0000.662D][.FB40.0020.001F.548C][.D48C.0000.0000.548C] # SQUARE ERA NAME SYOUWA; QQKN
+2F8CD ; [.FB40.0020.0002.6649][.E649.0000.0000.6649] # CJK COMPATIBILITY IDEOGRAPH-2F8CD; QQC
+FA12 ; [.FB40.0020.0002.6674][.E674.0000.0000.6674] # CJK COMPATIBILITY IDEOGRAPH-FA12; QQC
+FA91 ; [.FB40.0020.0002.6674][.E674.0000.0000.6674] # CJK COMPATIBILITY IDEOGRAPH-FA91; QQC
+F9C5 ; [.FB40.0020.0002.6688][.E688.0000.0000.6688] # CJK COMPATIBILITY IDEOGRAPH-F9C5; QQC
+FA43 ; [.FB40.0020.0002.6691][.E691.0000.0000.6691] # CJK COMPATIBILITY IDEOGRAPH-FA43; QQC
+2F8CF ; [.FB40.0020.0002.6691][.E691.0000.0000.6691] # CJK COMPATIBILITY IDEOGRAPH-2F8CF; QQC
+2F8D5 ; [.FB40.0020.0002.669C][.E69C.0000.0000.669C] # CJK COMPATIBILITY IDEOGRAPH-2F8D5; QQC
+FA06 ; [.FB40.0020.0002.66B4][.E6B4.0000.0000.66B4] # CJK COMPATIBILITY IDEOGRAPH-FA06; QQC
+F98B ; [.FB40.0020.0002.66C6][.E6C6.0000.0000.66C6] # CJK COMPATIBILITY IDEOGRAPH-F98B; QQC
+2F48 ; [.FB40.0020.0004.66F0][.E6F0.0000.0000.66F0] # KANGXI RADICAL SAY; QQK
+F901 ; [.FB40.0020.0002.66F4][.E6F4.0000.0000.66F4] # CJK COMPATIBILITY IDEOGRAPH-F901; QQC
+2F8CC ; [.FB40.0020.0002.66F8][.E6F8.0000.0000.66F8] # CJK COMPATIBILITY IDEOGRAPH-2F8CC; QQC
+2F8D4 ; [.FB40.0020.0002.6700][.E700.0000.0000.6700] # CJK COMPATIBILITY IDEOGRAPH-2F8D4; QQC
+2F49 ; [.FB40.0020.0004.6708][.E708.0000.0000.6708] # KANGXI RADICAL MOON; QQK
+322A ; [*02B1.0020.0004.322A][.FB40.0020.0004.6708][.E708.0000.0000.6708][*02B2.0020.001F.322A] # PARENTHESIZED IDEOGRAPH MOON; QQKN
+328A ; [.FB40.0020.0006.6708][.E708.0000.0000.6708] # CIRCLED IDEOGRAPH MOON; QQK
+2E9D ; [.FB40.0020.0004.6708][.E708.0000.0000.6708][.0000.0199.001F.2E9D] # CJK RADICAL MOON; QQKN
+3232 ; [*02B1.0020.0004.3232][.FB40.0020.0004.6709][.E709.0000.0000.6709][*02B2.0020.001F.3232] # PARENTHESIZED IDEOGRAPH HAVE; QQKN
+3292 ; [.FB40.0020.0006.6709][.E709.0000.0000.6709] # CIRCLED IDEOGRAPH HAVE; QQK
+F929 ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-F929; QQC
+FA92 ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-FA92; QQC
+2F8D8 ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-2F8D8; QQC
+FA93 ; [.FB40.0020.0002.671B][.E71B.0000.0000.671B] # CJK COMPATIBILITY IDEOGRAPH-FA93; QQC
+2F8D9 ; [.FB40.0020.0002.671B][.E71B.0000.0000.671B] # CJK COMPATIBILITY IDEOGRAPH-2F8D9; QQC
+2F8DA ; [.FB40.0020.0002.6721][.E721.0000.0000.6721] # CJK COMPATIBILITY IDEOGRAPH-2F8DA; QQC
+2F4A ; [.FB40.0020.0004.6728][.E728.0000.0000.6728] # KANGXI RADICAL TREE; QQK
+322D ; [*02B1.0020.0004.322D][.FB40.0020.0004.6728][.E728.0000.0000.6728][*02B2.0020.001F.322D] # PARENTHESIZED IDEOGRAPH WOOD; QQKN
+328D ; [.FB40.0020.0006.6728][.E728.0000.0000.6728] # CIRCLED IDEOGRAPH WOOD; QQK
+F9E1 ; [.FB40.0020.0002.674E][.E74E.0000.0000.674E] # CJK COMPATIBILITY IDEOGRAPH-F9E1; QQC
+2F8DC ; [.FB40.0020.0002.6753][.E753.0000.0000.6753] # CJK COMPATIBILITY IDEOGRAPH-2F8DC; QQC
+FA94 ; [.FB40.0020.0002.6756][.E756.0000.0000.6756] # CJK COMPATIBILITY IDEOGRAPH-FA94; QQC
+2F8DB ; [.FB40.0020.0002.675E][.E75E.0000.0000.675E] # CJK COMPATIBILITY IDEOGRAPH-2F8DB; QQC
+F9C8 ; [.FB40.0020.0002.677B][.E77B.0000.0000.677B] # CJK COMPATIBILITY IDEOGRAPH-F9C8; QQC
+2F8E0 ; [.FB40.0020.0002.6785][.E785.0000.0000.6785] # CJK COMPATIBILITY IDEOGRAPH-2F8E0; QQC
+F9F4 ; [.FB40.0020.0002.6797][.E797.0000.0000.6797] # CJK COMPATIBILITY IDEOGRAPH-F9F4; QQC
+F9C9 ; [.FB40.0020.0002.67F3][.E7F3.0000.0000.67F3] # CJK COMPATIBILITY IDEOGRAPH-F9C9; QQC
+2F8DF ; [.FB40.0020.0002.67FA][.E7FA.0000.0000.67FA] # CJK COMPATIBILITY IDEOGRAPH-2F8DF; QQC
+F9DA ; [.FB40.0020.0002.6817][.E817.0000.0000.6817] # CJK COMPATIBILITY IDEOGRAPH-F9DA; QQC
+2F8E5 ; [.FB40.0020.0002.681F][.E81F.0000.0000.681F] # CJK COMPATIBILITY IDEOGRAPH-2F8E5; QQC
+3231 ; [*02B1.0020.0004.3231][.FB40.0020.0004.682A][.E82A.0000.0000.682A][*02B2.0020.001F.3231] # PARENTHESIZED IDEOGRAPH STOCK; QQKN
+3291 ; [.FB40.0020.0006.682A][.E82A.0000.0000.682A] # CIRCLED IDEOGRAPH STOCK; QQK
+337F ; [.FB40.0020.001C.682A][.E82A.0000.0000.682A][.FB40.0020.001F.5F0F][.DF0F.0000.0000.5F0F][.FB40.0020.001F.4F1A][.CF1A.0000.0000.4F1A][.FB40.0020.001F.793E][.F93E.0000.0000.793E] # SQUARE CORPORATION; QQKN
+2F8E1 ; [.FB40.0020.0002.6852][.E852.0000.0000.6852] # CJK COMPATIBILITY IDEOGRAPH-2F8E1; QQC
+F97A ; [.FB40.0020.0002.6881][.E881.0000.0000.6881] # CJK COMPATIBILITY IDEOGRAPH-F97A; QQC
+FA44 ; [.FB40.0020.0002.6885][.E885.0000.0000.6885] # CJK COMPATIBILITY IDEOGRAPH-FA44; QQC
+2F8E2 ; [.FB40.0020.0002.6885][.E885.0000.0000.6885] # CJK COMPATIBILITY IDEOGRAPH-2F8E2; QQC
+2F8E4 ; [.FB40.0020.0002.688E][.E88E.0000.0000.688E] # CJK COMPATIBILITY IDEOGRAPH-2F8E4; QQC
+F9E2 ; [.FB40.0020.0002.68A8][.E8A8.0000.0000.68A8] # CJK COMPATIBILITY IDEOGRAPH-F9E2; QQC
+2F8E6 ; [.FB40.0020.0002.6914][.E914.0000.0000.6914] # CJK COMPATIBILITY IDEOGRAPH-2F8E6; QQC
+2F8E8 ; [.FB40.0020.0002.6942][.E942.0000.0000.6942] # CJK COMPATIBILITY IDEOGRAPH-2F8E8; QQC
+2F8E9 ; [.FB40.0020.0002.69A3][.E9A3.0000.0000.69A3] # CJK COMPATIBILITY IDEOGRAPH-2F8E9; QQC
+2F8EA ; [.FB40.0020.0002.69EA][.E9EA.0000.0000.69EA] # CJK COMPATIBILITY IDEOGRAPH-2F8EA; QQC
+F914 ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F914; QQC
+F95C ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F95C; QQC
+F9BF ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F9BF; QQC
+F94C ; [.FB40.0020.0002.6A13][.EA13.0000.0000.6A13] # CJK COMPATIBILITY IDEOGRAPH-F94C; QQC
+2F8EB ; [.FB40.0020.0002.6AA8][.EAA8.0000.0000.6AA8] # CJK COMPATIBILITY IDEOGRAPH-2F8EB; QQC
+F931 ; [.FB40.0020.0002.6AD3][.EAD3.0000.0000.6AD3] # CJK COMPATIBILITY IDEOGRAPH-F931; QQC
+2F8ED ; [.FB40.0020.0002.6ADB][.EADB.0000.0000.6ADB] # CJK COMPATIBILITY IDEOGRAPH-2F8ED; QQC
+F91D ; [.FB40.0020.0002.6B04][.EB04.0000.0000.6B04] # CJK COMPATIBILITY IDEOGRAPH-F91D; QQC
+2F4B ; [.FB40.0020.0004.6B20][.EB20.0000.0000.6B20] # KANGXI RADICAL LACK; QQK
+2F8EF ; [.FB40.0020.0002.6B21][.EB21.0000.0000.6B21] # CJK COMPATIBILITY IDEOGRAPH-2F8EF; QQC
+2F8F1 ; [.FB40.0020.0002.6B54][.EB54.0000.0000.6B54] # CJK COMPATIBILITY IDEOGRAPH-2F8F1; QQC
+2F4C ; [.FB40.0020.0004.6B62][.EB62.0000.0000.6B62] # KANGXI RADICAL STOP; QQK
+32A3 ; [.FB40.0020.0006.6B63][.EB63.0000.0000.6B63] # CIRCLED IDEOGRAPH CORRECT; QQK
+2F8F3 ; [.FB40.0020.0002.6B72][.EB72.0000.0000.6B72] # CJK COMPATIBILITY IDEOGRAPH-2F8F3; QQC
+F98C ; [.FB40.0020.0002.6B77][.EB77.0000.0000.6B77] # CJK COMPATIBILITY IDEOGRAPH-F98C; QQC
+FA95 ; [.FB40.0020.0002.6B79][.EB79.0000.0000.6B79] # CJK COMPATIBILITY IDEOGRAPH-FA95; QQC
+2F4D ; [.FB40.0020.0004.6B79][.EB79.0000.0000.6B79] # KANGXI RADICAL DEATH; QQK
+2E9E ; [.FB40.0020.0004.6B7A][.EB7A.0000.0000.6B7A][.0000.0199.001F.2E9E] # CJK RADICAL DEATH; QQKN
+2F8F4 ; [.FB40.0020.0002.6B9F][.EB9F.0000.0000.6B9F] # CJK COMPATIBILITY IDEOGRAPH-2F8F4; QQC
+F9A5 ; [.FB40.0020.0002.6BAE][.EBAE.0000.0000.6BAE] # CJK COMPATIBILITY IDEOGRAPH-F9A5; QQC
+2F4E ; [.FB40.0020.0004.6BB3][.EBB3.0000.0000.6BB3] # KANGXI RADICAL WEAPON; QQK
+F970 ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-F970; QQC
+FA96 ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-FA96; QQC
+2F8F5 ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-2F8F5; QQC
+2F8F6 ; [.FB40.0020.0002.6BBB][.EBBB.0000.0000.6BBB] # CJK COMPATIBILITY IDEOGRAPH-2F8F6; QQC
+2F4F ; [.FB40.0020.0004.6BCB][.EBCB.0000.0000.6BCB] # KANGXI RADICAL DO NOT; QQK
+2E9F ; [.FB40.0020.0004.6BCD][.EBCD.0000.0000.6BCD] # CJK RADICAL MOTHER; QQK
+2F50 ; [.FB40.0020.0004.6BD4][.EBD4.0000.0000.6BD4] # KANGXI RADICAL COMPARE; QQK
+2F51 ; [.FB40.0020.0004.6BDB][.EBDB.0000.0000.6BDB] # KANGXI RADICAL FUR; QQK
+2F52 ; [.FB40.0020.0004.6C0F][.EC0F.0000.0000.6C0F] # KANGXI RADICAL CLAN; QQK
+2EA0 ; [.FB40.0020.0004.6C11][.EC11.0000.0000.6C11] # CJK RADICAL CIVILIAN; QQK
+2F53 ; [.FB40.0020.0004.6C14][.EC14.0000.0000.6C14] # KANGXI RADICAL STEAM; QQK
+2F54 ; [.FB40.0020.0004.6C34][.EC34.0000.0000.6C34] # KANGXI RADICAL WATER; QQK
+322C ; [*02B1.0020.0004.322C][.FB40.0020.0004.6C34][.EC34.0000.0000.6C34][*02B2.0020.001F.322C] # PARENTHESIZED IDEOGRAPH WATER; QQKN
+328C ; [.FB40.0020.0006.6C34][.EC34.0000.0000.6C34] # CIRCLED IDEOGRAPH WATER; QQK
+2EA1 ; [.FB40.0020.0004.6C35][.EC35.0000.0000.6C35] # CJK RADICAL WATER ONE; QQK
+2EA2 ; [.FB40.0020.0004.6C3A][.EC3A.0000.0000.6C3A] # CJK RADICAL WATER TWO; QQK
+2F8FA ; [.FB40.0020.0002.6C4E][.EC4E.0000.0000.6C4E] # CJK COMPATIBILITY IDEOGRAPH-2F8FA; QQC
+2F8FE ; [.FB40.0020.0002.6C67][.EC67.0000.0000.6C67] # CJK COMPATIBILITY IDEOGRAPH-2F8FE; QQC
+F972 ; [.FB40.0020.0002.6C88][.EC88.0000.0000.6C88] # CJK COMPATIBILITY IDEOGRAPH-F972; QQC
+2F8FC ; [.FB40.0020.0002.6CBF][.ECBF.0000.0000.6CBF] # CJK COMPATIBILITY IDEOGRAPH-2F8FC; QQC
+F968 ; [.FB40.0020.0002.6CCC][.ECCC.0000.0000.6CCC] # CJK COMPATIBILITY IDEOGRAPH-F968; QQC
+2F8FD ; [.FB40.0020.0002.6CCD][.ECCD.0000.0000.6CCD] # CJK COMPATIBILITY IDEOGRAPH-2F8FD; QQC
+F9E3 ; [.FB40.0020.0002.6CE5][.ECE5.0000.0000.6CE5] # CJK COMPATIBILITY IDEOGRAPH-F9E3; QQC
+329F ; [.FB40.0020.0006.6CE8][.ECE8.0000.0000.6CE8] # CIRCLED IDEOGRAPH ATTENTION; QQK
+2F8FF ; [.FB40.0020.0002.6D16][.ED16.0000.0000.6D16] # CJK COMPATIBILITY IDEOGRAPH-2F8FF; QQC
+F915 ; [.FB40.0020.0002.6D1B][.ED1B.0000.0000.6D1B] # CJK COMPATIBILITY IDEOGRAPH-F915; QQC
+FA05 ; [.FB40.0020.0002.6D1E][.ED1E.0000.0000.6D1E] # CJK COMPATIBILITY IDEOGRAPH-FA05; QQC
+2F907 ; [.FB40.0020.0002.6D34][.ED34.0000.0000.6D34] # CJK COMPATIBILITY IDEOGRAPH-2F907; QQC
+2F900 ; [.FB40.0020.0002.6D3E][.ED3E.0000.0000.6D3E] # CJK COMPATIBILITY IDEOGRAPH-2F900; QQC
+F9CA ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-F9CA; QQC
+FA97 ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-FA97; QQC
+2F902 ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-2F902; QQC
+2F903 ; [.FB40.0020.0002.6D69][.ED69.0000.0000.6D69] # CJK COMPATIBILITY IDEOGRAPH-2F903; QQC
+F92A ; [.FB40.0020.0002.6D6A][.ED6A.0000.0000.6D6A] # CJK COMPATIBILITY IDEOGRAPH-F92A; QQC
+FA45 ; [.FB40.0020.0002.6D77][.ED77.0000.0000.6D77] # CJK COMPATIBILITY IDEOGRAPH-FA45; QQC
+2F901 ; [.FB40.0020.0002.6D77][.ED77.0000.0000.6D77] # CJK COMPATIBILITY IDEOGRAPH-2F901; QQC
+2F904 ; [.FB40.0020.0002.6D78][.ED78.0000.0000.6D78] # CJK COMPATIBILITY IDEOGRAPH-2F904; QQC
+2F905 ; [.FB40.0020.0002.6D85][.ED85.0000.0000.6D85] # CJK COMPATIBILITY IDEOGRAPH-2F905; QQC
+F9F5 ; [.FB40.0020.0002.6DCB][.EDCB.0000.0000.6DCB] # CJK COMPATIBILITY IDEOGRAPH-F9F5; QQC
+F94D ; [.FB40.0020.0002.6DDA][.EDDA.0000.0000.6DDA] # CJK COMPATIBILITY IDEOGRAPH-F94D; QQC
+F9D6 ; [.FB40.0020.0002.6DEA][.EDEA.0000.0000.6DEA] # CJK COMPATIBILITY IDEOGRAPH-F9D6; QQC
+2F90E ; [.FB40.0020.0002.6DF9][.EDF9.0000.0000.6DF9] # CJK COMPATIBILITY IDEOGRAPH-2F90E; QQC
+FA46 ; [.FB40.0020.0002.6E1A][.EE1A.0000.0000.6E1A] # CJK COMPATIBILITY IDEOGRAPH-FA46; QQC
+2F908 ; [.FB40.0020.0002.6E2F][.EE2F.0000.0000.6E2F] # CJK COMPATIBILITY IDEOGRAPH-2F908; QQC
+2F909 ; [.FB40.0020.0002.6E6E][.EE6E.0000.0000.6E6E] # CJK COMPATIBILITY IDEOGRAPH-2F909; QQC
+F9CB ; [.FB40.0020.0002.6E9C][.EE9C.0000.0000.6E9C] # CJK COMPATIBILITY IDEOGRAPH-F9CB; QQC
+F9EC ; [.FB40.0020.0002.6EBA][.EEBA.0000.0000.6EBA] # CJK COMPATIBILITY IDEOGRAPH-F9EC; QQC
+2F90C ; [.FB40.0020.0002.6EC7][.EEC7.0000.0000.6EC7] # CJK COMPATIBILITY IDEOGRAPH-2F90C; QQC
+FA99 ; [.FB40.0020.0002.6ECB][.EECB.0000.0000.6ECB] # CJK COMPATIBILITY IDEOGRAPH-FA99; QQC
+2F90B ; [.FB40.0020.0002.6ECB][.EECB.0000.0000.6ECB] # CJK COMPATIBILITY IDEOGRAPH-2F90B; QQC
+F904 ; [.FB40.0020.0002.6ED1][.EED1.0000.0000.6ED1] # CJK COMPATIBILITY IDEOGRAPH-F904; QQC
+FA98 ; [.FB40.0020.0002.6EDB][.EEDB.0000.0000.6EDB] # CJK COMPATIBILITY IDEOGRAPH-FA98; QQC
+F94E ; [.FB40.0020.0002.6F0F][.EF0F.0000.0000.6F0F] # CJK COMPATIBILITY IDEOGRAPH-F94E; QQC
+FA47 ; [.FB40.0020.0002.6F22][.EF22.0000.0000.6F22] # CJK COMPATIBILITY IDEOGRAPH-FA47; QQC
+FA9A ; [.FB40.0020.0002.6F22][.EF22.0000.0000.6F22] # CJK COMPATIBILITY IDEOGRAPH-FA9A; QQC
+F992 ; [.FB40.0020.0002.6F23][.EF23.0000.0000.6F23] # CJK COMPATIBILITY IDEOGRAPH-F992; QQC
+2F90F ; [.FB40.0020.0002.6F6E][.EF6E.0000.0000.6F6E] # CJK COMPATIBILITY IDEOGRAPH-2F90F; QQC
+2F912 ; [.FB40.0020.0002.6FC6][.EFC6.0000.0000.6FC6] # CJK COMPATIBILITY IDEOGRAPH-2F912; QQC
+F922 ; [.FB40.0020.0002.6FEB][.EFEB.0000.0000.6FEB] # CJK COMPATIBILITY IDEOGRAPH-F922; QQC
+F984 ; [.FB40.0020.0002.6FFE][.EFFE.0000.0000.6FFE] # CJK COMPATIBILITY IDEOGRAPH-F984; QQC
+2F915 ; [.FB40.0020.0002.701B][.F01B.0000.0000.701B] # CJK COMPATIBILITY IDEOGRAPH-2F915; QQC
+FA9B ; [.FB40.0020.0002.701E][.F01E.0000.0000.701E] # CJK COMPATIBILITY IDEOGRAPH-FA9B; QQC
+2F914 ; [.FB40.0020.0002.701E][.F01E.0000.0000.701E] # CJK COMPATIBILITY IDEOGRAPH-2F914; QQC
+2F913 ; [.FB40.0020.0002.7039][.F039.0000.0000.7039] # CJK COMPATIBILITY IDEOGRAPH-2F913; QQC
+2F917 ; [.FB40.0020.0002.704A][.F04A.0000.0000.704A] # CJK COMPATIBILITY IDEOGRAPH-2F917; QQC
+2F55 ; [.FB40.0020.0004.706B][.F06B.0000.0000.706B] # KANGXI RADICAL FIRE; QQK
+322B ; [*02B1.0020.0004.322B][.FB40.0020.0004.706B][.F06B.0000.0000.706B][*02B2.0020.001F.322B] # PARENTHESIZED IDEOGRAPH FIRE; QQKN
+328B ; [.FB40.0020.0006.706B][.F06B.0000.0000.706B] # CIRCLED IDEOGRAPH FIRE; QQK
+2EA3 ; [.FB40.0020.0004.706C][.F06C.0000.0000.706C] # CJK RADICAL FIRE; QQK
+2F835 ; [.FB40.0020.0002.7070][.F070.0000.0000.7070] # CJK COMPATIBILITY IDEOGRAPH-2F835; QQC
+2F919 ; [.FB40.0020.0002.7077][.F077.0000.0000.7077] # CJK COMPATIBILITY IDEOGRAPH-2F919; QQC
+2F918 ; [.FB40.0020.0002.707D][.F07D.0000.0000.707D] # CJK COMPATIBILITY IDEOGRAPH-2F918; QQC
+F9FB ; [.FB40.0020.0002.7099][.F099.0000.0000.7099] # CJK COMPATIBILITY IDEOGRAPH-F9FB; QQC
+2F91A ; [.FB40.0020.0002.70AD][.F0AD.0000.0000.70AD] # CJK COMPATIBILITY IDEOGRAPH-2F91A; QQC
+F99F ; [.FB40.0020.0002.70C8][.F0C8.0000.0000.70C8] # CJK COMPATIBILITY IDEOGRAPH-F99F; QQC
+F916 ; [.FB40.0020.0002.70D9][.F0D9.0000.0000.70D9] # CJK COMPATIBILITY IDEOGRAPH-F916; QQC
+2F91C ; [.FB40.0020.0002.7145][.F145.0000.0000.7145] # CJK COMPATIBILITY IDEOGRAPH-2F91C; QQC
+F993 ; [.FB40.0020.0002.7149][.F149.0000.0000.7149] # CJK COMPATIBILITY IDEOGRAPH-F993; QQC
+FA48 ; [.FB40.0020.0002.716E][.F16E.0000.0000.716E] # CJK COMPATIBILITY IDEOGRAPH-FA48; QQC
+FA9C ; [.FB40.0020.0002.716E][.F16E.0000.0000.716E] # CJK COMPATIBILITY IDEOGRAPH-FA9C; QQC
+2F91E ; [.FB40.0020.0002.719C][.F19C.0000.0000.719C] # CJK COMPATIBILITY IDEOGRAPH-2F91E; QQC
+F9C0 ; [.FB40.0020.0002.71CE][.F1CE.0000.0000.71CE] # CJK COMPATIBILITY IDEOGRAPH-F9C0; QQC
+F9EE ; [.FB40.0020.0002.71D0][.F1D0.0000.0000.71D0] # CJK COMPATIBILITY IDEOGRAPH-F9EE; QQC
+F932 ; [.FB40.0020.0002.7210][.F210.0000.0000.7210] # CJK COMPATIBILITY IDEOGRAPH-F932; QQC
+F91E ; [.FB40.0020.0002.721B][.F21B.0000.0000.721B] # CJK COMPATIBILITY IDEOGRAPH-F91E; QQC
+2F920 ; [.FB40.0020.0002.7228][.F228.0000.0000.7228] # CJK COMPATIBILITY IDEOGRAPH-2F920; QQC
+2F56 ; [.FB40.0020.0004.722A][.F22A.0000.0000.722A] # KANGXI RADICAL CLAW; QQK
+FA49 ; [.FB40.0020.0002.722B][.F22B.0000.0000.722B] # CJK COMPATIBILITY IDEOGRAPH-FA49; QQC
+2EA4 ; [.FB40.0020.0004.722B][.F22B.0000.0000.722B] # CJK RADICAL PAW ONE; QQK
+2EA5 ; [.FB40.0020.0004.722B][.F22B.0000.0000.722B][.0000.0199.001F.2EA5] # CJK RADICAL PAW TWO; QQKN
+FA9E ; [.FB40.0020.0002.7235][.F235.0000.0000.7235] # CJK COMPATIBILITY IDEOGRAPH-FA9E; QQC
+2F921 ; [.FB40.0020.0002.7235][.F235.0000.0000.7235] # CJK COMPATIBILITY IDEOGRAPH-2F921; QQC
+2F57 ; [.FB40.0020.0004.7236][.F236.0000.0000.7236] # KANGXI RADICAL FATHER; QQK
+2F58 ; [.FB40.0020.0004.723B][.F23B.0000.0000.723B] # KANGXI RADICAL DOUBLE X; QQK
+2F59 ; [.FB40.0020.0004.723F][.F23F.0000.0000.723F] # KANGXI RADICAL HALF TREE TRUNK; QQK
+2F5A ; [.FB40.0020.0004.7247][.F247.0000.0000.7247] # KANGXI RADICAL SLICE; QQK
+2F922 ; [.FB40.0020.0002.7250][.F250.0000.0000.7250] # CJK COMPATIBILITY IDEOGRAPH-2F922; QQC
+2F5B ; [.FB40.0020.0004.7259][.F259.0000.0000.7259] # KANGXI RADICAL FANG; QQK
+2F5C ; [.FB40.0020.0004.725B][.F25B.0000.0000.725B] # KANGXI RADICAL COW; QQK
+2EA7 ; [.FB40.0020.0004.725B][.F25B.0000.0000.725B][.0000.0199.001F.2EA7] # CJK RADICAL COW; QQKN
+F946 ; [.FB40.0020.0002.7262][.F262.0000.0000.7262] # CJK COMPATIBILITY IDEOGRAPH-F946; QQC
+3235 ; [*02B1.0020.0004.3235][.FB40.0020.0004.7279][.F279.0000.0000.7279][*02B2.0020.001F.3235] # PARENTHESIZED IDEOGRAPH SPECIAL; QQKN
+3295 ; [.FB40.0020.0006.7279][.F279.0000.0000.7279] # CIRCLED IDEOGRAPH SPECIAL; QQK
+2F924 ; [.FB40.0020.0002.7280][.F280.0000.0000.7280] # CJK COMPATIBILITY IDEOGRAPH-2F924; QQC
+2F925 ; [.FB40.0020.0002.7295][.F295.0000.0000.7295] # CJK COMPATIBILITY IDEOGRAPH-2F925; QQC
+2F5D ; [.FB40.0020.0004.72AC][.F2AC.0000.0000.72AC] # KANGXI RADICAL DOG; QQK
+2EA8 ; [.FB40.0020.0004.72AD][.F2AD.0000.0000.72AD] # CJK RADICAL DOG; QQK
+FA9F ; [.FB40.0020.0002.72AF][.F2AF.0000.0000.72AF] # CJK COMPATIBILITY IDEOGRAPH-FA9F; QQC
+F9FA ; [.FB40.0020.0002.72C0][.F2C0.0000.0000.72C0] # CJK COMPATIBILITY IDEOGRAPH-F9FA; QQC
+F92B ; [.FB40.0020.0002.72FC][.F2FC.0000.0000.72FC] # CJK COMPATIBILITY IDEOGRAPH-F92B; QQC
+FA16 ; [.FB40.0020.0002.732A][.F32A.0000.0000.732A] # CJK COMPATIBILITY IDEOGRAPH-FA16; QQC
+FAA0 ; [.FB40.0020.0002.732A][.F32A.0000.0000.732A] # CJK COMPATIBILITY IDEOGRAPH-FAA0; QQC
+F9A7 ; [.FB40.0020.0002.7375][.F375.0000.0000.7375] # CJK COMPATIBILITY IDEOGRAPH-F9A7; QQC
+2F928 ; [.FB40.0020.0002.737A][.F37A.0000.0000.737A] # CJK COMPATIBILITY IDEOGRAPH-2F928; QQC
+2F5E ; [.FB40.0020.0004.7384][.F384.0000.0000.7384] # KANGXI RADICAL PROFOUND; QQK
+F961 ; [.FB40.0020.0002.7387][.F387.0000.0000.7387] # CJK COMPATIBILITY IDEOGRAPH-F961; QQC
+F9DB ; [.FB40.0020.0002.7387][.F387.0000.0000.7387] # CJK COMPATIBILITY IDEOGRAPH-F9DB; QQC
+2F5F ; [.FB40.0020.0004.7389][.F389.0000.0000.7389] # KANGXI RADICAL JADE; QQK
+2F929 ; [.FB40.0020.0002.738B][.F38B.0000.0000.738B] # CJK COMPATIBILITY IDEOGRAPH-2F929; QQC
+2EA9 ; [.FB40.0020.0004.738B][.F38B.0000.0000.738B][.0000.0199.001F.2EA9] # CJK RADICAL JADE; QQKN
+2F92B ; [.FB40.0020.0002.73A5][.F3A5.0000.0000.73A5] # CJK COMPATIBILITY IDEOGRAPH-2F92B; QQC
+F9AD ; [.FB40.0020.0002.73B2][.F3B2.0000.0000.73B2] # CJK COMPATIBILITY IDEOGRAPH-F9AD; QQC
+F917 ; [.FB40.0020.0002.73DE][.F3DE.0000.0000.73DE] # CJK COMPATIBILITY IDEOGRAPH-F917; QQC
+F9E4 ; [.FB40.0020.0002.7406][.F406.0000.0000.7406] # CJK COMPATIBILITY IDEOGRAPH-F9E4; QQC
+F9CC ; [.FB40.0020.0002.7409][.F409.0000.0000.7409] # CJK COMPATIBILITY IDEOGRAPH-F9CC; QQC
+FA4A ; [.FB40.0020.0002.7422][.F422.0000.0000.7422] # CJK COMPATIBILITY IDEOGRAPH-FA4A; QQC
+2F92E ; [.FB40.0020.0002.7447][.F447.0000.0000.7447] # CJK COMPATIBILITY IDEOGRAPH-2F92E; QQC
+2F92F ; [.FB40.0020.0002.745C][.F45C.0000.0000.745C] # CJK COMPATIBILITY IDEOGRAPH-2F92F; QQC
+F9AE ; [.FB40.0020.0002.7469][.F469.0000.0000.7469] # CJK COMPATIBILITY IDEOGRAPH-F9AE; QQC
+FAA1 ; [.FB40.0020.0002.7471][.F471.0000.0000.7471] # CJK COMPATIBILITY IDEOGRAPH-FAA1; QQC
+2F930 ; [.FB40.0020.0002.7471][.F471.0000.0000.7471] # CJK COMPATIBILITY IDEOGRAPH-2F930; QQC
+2F931 ; [.FB40.0020.0002.7485][.F485.0000.0000.7485] # CJK COMPATIBILITY IDEOGRAPH-2F931; QQC
+F994 ; [.FB40.0020.0002.7489][.F489.0000.0000.7489] # CJK COMPATIBILITY IDEOGRAPH-F994; QQC
+F9EF ; [.FB40.0020.0002.7498][.F498.0000.0000.7498] # CJK COMPATIBILITY IDEOGRAPH-F9EF; QQC
+2F932 ; [.FB40.0020.0002.74CA][.F4CA.0000.0000.74CA] # CJK COMPATIBILITY IDEOGRAPH-2F932; QQC
+2F60 ; [.FB40.0020.0004.74DC][.F4DC.0000.0000.74DC] # KANGXI RADICAL MELON; QQK
+2F61 ; [.FB40.0020.0004.74E6][.F4E6.0000.0000.74E6] # KANGXI RADICAL TILE; QQK
+FAA2 ; [.FB40.0020.0002.7506][.F506.0000.0000.7506] # CJK COMPATIBILITY IDEOGRAPH-FAA2; QQC
+2F62 ; [.FB40.0020.0004.7518][.F518.0000.0000.7518] # KANGXI RADICAL SWEET; QQK
+2F63 ; [.FB40.0020.0004.751F][.F51F.0000.0000.751F] # KANGXI RADICAL LIFE; QQK
+2F934 ; [.FB40.0020.0002.7524][.F524.0000.0000.7524] # CJK COMPATIBILITY IDEOGRAPH-2F934; QQC
+2F64 ; [.FB40.0020.0004.7528][.F528.0000.0000.7528] # KANGXI RADICAL USE; QQK
+2F65 ; [.FB40.0020.0004.7530][.F530.0000.0000.7530] # KANGXI RADICAL FIELD; QQK
+3199 ; [.FB40.0020.0014.7532][.F532.0000.0000.7532] # IDEOGRAPHIC ANNOTATION FIRST MARK; QQK
+329A ; [.FB40.0020.0006.7537][.F537.0000.0000.7537] # CIRCLED IDEOGRAPH MALE; QQK
+FAA3 ; [.FB40.0020.0002.753B][.F53B.0000.0000.753B] # CJK COMPATIBILITY IDEOGRAPH-FAA3; QQC
+2F936 ; [.FB40.0020.0002.753E][.F53E.0000.0000.753E] # CJK COMPATIBILITY IDEOGRAPH-2F936; QQC
+F9CD ; [.FB40.0020.0002.7559][.F559.0000.0000.7559] # CJK COMPATIBILITY IDEOGRAPH-F9CD; QQC
+F976 ; [.FB40.0020.0002.7565][.F565.0000.0000.7565] # CJK COMPATIBILITY IDEOGRAPH-F976; QQC
+F962 ; [.FB40.0020.0002.7570][.F570.0000.0000.7570] # CJK COMPATIBILITY IDEOGRAPH-F962; QQC
+2F938 ; [.FB40.0020.0002.7570][.F570.0000.0000.7570] # CJK COMPATIBILITY IDEOGRAPH-2F938; QQC
+2F66 ; [.FB40.0020.0004.758B][.F58B.0000.0000.758B] # KANGXI RADICAL BOLT OF CLOTH; QQK
+2EAA ; [.FB40.0020.0004.758B][.F58B.0000.0000.758B][.0000.0199.001F.2EAA] # CJK RADICAL BOLT OF CLOTH; QQKN
+2F67 ; [.FB40.0020.0004.7592][.F592.0000.0000.7592] # KANGXI RADICAL SICKNESS; QQK
+F9E5 ; [.FB40.0020.0002.75E2][.F5E2.0000.0000.75E2] # CJK COMPATIBILITY IDEOGRAPH-F9E5; QQC
+2F93A ; [.FB40.0020.0002.7610][.F610.0000.0000.7610] # CJK COMPATIBILITY IDEOGRAPH-2F93A; QQC
+FAA4 ; [.FB40.0020.0002.761D][.F61D.0000.0000.761D] # CJK COMPATIBILITY IDEOGRAPH-FAA4; QQC
+FAA5 ; [.FB40.0020.0002.761F][.F61F.0000.0000.761F] # CJK COMPATIBILITY IDEOGRAPH-FAA5; QQC
+F9C1 ; [.FB40.0020.0002.7642][.F642.0000.0000.7642] # CJK COMPATIBILITY IDEOGRAPH-F9C1; QQC
+F90E ; [.FB40.0020.0002.7669][.F669.0000.0000.7669] # CJK COMPATIBILITY IDEOGRAPH-F90E; QQC
+2F68 ; [.FB40.0020.0004.7676][.F676.0000.0000.7676] # KANGXI RADICAL DOTTED TENT; QQK
+2F69 ; [.FB40.0020.0004.767D][.F67D.0000.0000.767D] # KANGXI RADICAL WHITE; QQK
+2F6A ; [.FB40.0020.0004.76AE][.F6AE.0000.0000.76AE] # KANGXI RADICAL SKIN; QQK
+2F6B ; [.FB40.0020.0004.76BF][.F6BF.0000.0000.76BF] # KANGXI RADICAL DISH; QQK
+FA17 ; [.FB40.0020.0002.76CA][.F6CA.0000.0000.76CA] # CJK COMPATIBILITY IDEOGRAPH-FA17; QQC
+FAA6 ; [.FB40.0020.0002.76CA][.F6CA.0000.0000.76CA] # CJK COMPATIBILITY IDEOGRAPH-FAA6; QQC
+FAA7 ; [.FB40.0020.0002.76DB][.F6DB.0000.0000.76DB] # CJK COMPATIBILITY IDEOGRAPH-FAA7; QQC
+323C ; [*02B1.0020.0004.323C][.FB40.0020.0004.76E3][.F6E3.0000.0000.76E3][*02B2.0020.001F.323C] # PARENTHESIZED IDEOGRAPH SUPERVISE; QQKN
+32AC ; [.FB40.0020.0006.76E3][.F6E3.0000.0000.76E3] # CIRCLED IDEOGRAPH SUPERVISE; QQK
+F933 ; [.FB40.0020.0002.76E7][.F6E7.0000.0000.76E7] # CJK COMPATIBILITY IDEOGRAPH-F933; QQC
+2F6C ; [.FB40.0020.0004.76EE][.F6EE.0000.0000.76EE] # KANGXI RADICAL EYE; QQK
+2EAB ; [.FB40.0020.0004.76EE][.F6EE.0000.0000.76EE][.0000.0199.001F.2EAB] # CJK RADICAL EYE; QQKN
+FAA8 ; [.FB40.0020.0002.76F4][.F6F4.0000.0000.76F4] # CJK COMPATIBILITY IDEOGRAPH-FAA8; QQC
+2F940 ; [.FB40.0020.0002.76F4][.F6F4.0000.0000.76F4] # CJK COMPATIBILITY IDEOGRAPH-2F940; QQC
+F96D ; [.FB40.0020.0002.7701][.F701.0000.0000.7701] # CJK COMPATIBILITY IDEOGRAPH-F96D; QQC
+2F945 ; [.FB40.0020.0002.771E][.F71E.0000.0000.771E] # CJK COMPATIBILITY IDEOGRAPH-2F945; QQC
+2F946 ; [.FB40.0020.0002.771F][.F71F.0000.0000.771F] # CJK COMPATIBILITY IDEOGRAPH-2F946; QQC
+2F947 ; [.FB40.0020.0002.771F][.F71F.0000.0000.771F] # CJK COMPATIBILITY IDEOGRAPH-2F947; QQC
+FAAA ; [.FB40.0020.0002.7740][.F740.0000.0000.7740] # CJK COMPATIBILITY IDEOGRAPH-FAAA; QQC
+FAA9 ; [.FB40.0020.0002.774A][.F74A.0000.0000.774A] # CJK COMPATIBILITY IDEOGRAPH-FAA9; QQC
+2F948 ; [.FB40.0020.0002.774A][.F74A.0000.0000.774A] # CJK COMPATIBILITY IDEOGRAPH-2F948; QQC
+2F94A ; [.FB40.0020.0002.778B][.F78B.0000.0000.778B] # CJK COMPATIBILITY IDEOGRAPH-2F94A; QQC
+FA9D ; [.FB40.0020.0002.77A7][.F7A7.0000.0000.77A7] # CJK COMPATIBILITY IDEOGRAPH-FA9D; QQC
+2F6D ; [.FB40.0020.0004.77DB][.F7DB.0000.0000.77DB] # KANGXI RADICAL SPEAR; QQK
+2F6E ; [.FB40.0020.0004.77E2][.F7E2.0000.0000.77E2] # KANGXI RADICAL ARROW; QQK
+2F6F ; [.FB40.0020.0004.77F3][.F7F3.0000.0000.77F3] # KANGXI RADICAL STONE; QQK
+2F94E ; [.FB40.0020.0002.784E][.F84E.0000.0000.784E] # CJK COMPATIBILITY IDEOGRAPH-2F94E; QQC
+F9CE ; [.FB40.0020.0002.786B][.F86B.0000.0000.786B] # CJK COMPATIBILITY IDEOGRAPH-F9CE; QQC
+F93B ; [.FB40.0020.0002.788C][.F88C.0000.0000.788C] # CJK COMPATIBILITY IDEOGRAPH-F93B; QQC
+2F94F ; [.FB40.0020.0002.788C][.F88C.0000.0000.788C] # CJK COMPATIBILITY IDEOGRAPH-2F94F; QQC
+FA4B ; [.FB40.0020.0002.7891][.F891.0000.0000.7891] # CJK COMPATIBILITY IDEOGRAPH-FA4B; QQC
+F947 ; [.FB40.0020.0002.78CA][.F8CA.0000.0000.78CA] # CJK COMPATIBILITY IDEOGRAPH-F947; QQC
+FAAB ; [.FB40.0020.0002.78CC][.F8CC.0000.0000.78CC] # CJK COMPATIBILITY IDEOGRAPH-FAAB; QQC
+2F950 ; [.FB40.0020.0002.78CC][.F8CC.0000.0000.78CC] # CJK COMPATIBILITY IDEOGRAPH-2F950; QQC
+F964 ; [.FB40.0020.0002.78FB][.F8FB.0000.0000.78FB] # CJK COMPATIBILITY IDEOGRAPH-F964; QQC
+F985 ; [.FB40.0020.0002.792A][.F92A.0000.0000.792A] # CJK COMPATIBILITY IDEOGRAPH-F985; QQC
+2F70 ; [.FB40.0020.0004.793A][.F93A.0000.0000.793A] # KANGXI RADICAL SPIRIT; QQK
+2EAC ; [.FB40.0020.0004.793A][.F93A.0000.0000.793A][.0000.0199.001F.2EAC] # CJK RADICAL SPIRIT ONE; QQKN
+2EAD ; [.FB40.0020.0004.793B][.F93B.0000.0000.793B] # CJK RADICAL SPIRIT TWO; QQK
+FA18 ; [.FB40.0020.0002.793C][.F93C.0000.0000.793C] # CJK COMPATIBILITY IDEOGRAPH-FA18; QQC
+FA4C ; [.FB40.0020.0002.793E][.F93E.0000.0000.793E] # CJK COMPATIBILITY IDEOGRAPH-FA4C; QQC
+3233 ; [*02B1.0020.0004.3233][.FB40.0020.0004.793E][.F93E.0000.0000.793E][*02B2.0020.001F.3233] # PARENTHESIZED IDEOGRAPH SOCIETY; QQKN
+3293 ; [.FB40.0020.0006.793E][.F93E.0000.0000.793E] # CIRCLED IDEOGRAPH SOCIETY; QQK
+FA4E ; [.FB40.0020.0002.7948][.F948.0000.0000.7948] # CJK COMPATIBILITY IDEOGRAPH-FA4E; QQC
+FA4D ; [.FB40.0020.0002.7949][.F949.0000.0000.7949] # CJK COMPATIBILITY IDEOGRAPH-FA4D; QQC
+FA4F ; [.FB40.0020.0002.7950][.F950.0000.0000.7950] # CJK COMPATIBILITY IDEOGRAPH-FA4F; QQC
+FA50 ; [.FB40.0020.0002.7956][.F956.0000.0000.7956] # CJK COMPATIBILITY IDEOGRAPH-FA50; QQC
+2F953 ; [.FB40.0020.0002.7956][.F956.0000.0000.7956] # CJK COMPATIBILITY IDEOGRAPH-2F953; QQC
+FA51 ; [.FB40.0020.0002.795D][.F95D.0000.0000.795D] # CJK COMPATIBILITY IDEOGRAPH-FA51; QQC
+3237 ; [*02B1.0020.0004.3237][.FB40.0020.0004.795D][.F95D.0000.0000.795D][*02B2.0020.001F.3237] # PARENTHESIZED IDEOGRAPH CONGRATULATION; QQKN
+3297 ; [.FB40.0020.0006.795D][.F95D.0000.0000.795D] # CIRCLED IDEOGRAPH CONGRATULATION; QQK
+FA19 ; [.FB40.0020.0002.795E][.F95E.0000.0000.795E] # CJK COMPATIBILITY IDEOGRAPH-FA19; QQC
+FA1A ; [.FB40.0020.0002.7965][.F965.0000.0000.7965] # CJK COMPATIBILITY IDEOGRAPH-FA1A; QQC
+3240 ; [*02B1.0020.0004.3240][.FB40.0020.0004.796D][.F96D.0000.0000.796D][*02B2.0020.001F.3240] # PARENTHESIZED IDEOGRAPH FESTIVAL; QQKN
+F93C ; [.FB40.0020.0002.797F][.F97F.0000.0000.797F] # CJK COMPATIBILITY IDEOGRAPH-F93C; QQC
+FA52 ; [.FB40.0020.0002.798D][.F98D.0000.0000.798D] # CJK COMPATIBILITY IDEOGRAPH-FA52; QQC
+FA53 ; [.FB40.0020.0002.798E][.F98E.0000.0000.798E] # CJK COMPATIBILITY IDEOGRAPH-FA53; QQC
+FA1B ; [.FB40.0020.0002.798F][.F98F.0000.0000.798F] # CJK COMPATIBILITY IDEOGRAPH-FA1B; QQC
+2F956 ; [.FB40.0020.0002.798F][.F98F.0000.0000.798F] # CJK COMPATIBILITY IDEOGRAPH-2F956; QQC
+F9B6 ; [.FB40.0020.0002.79AE][.F9AE.0000.0000.79AE] # CJK COMPATIBILITY IDEOGRAPH-F9B6; QQC
+2F71 ; [.FB40.0020.0004.79B8][.F9B8.0000.0000.79B8] # KANGXI RADICAL TRACK; QQK
+2F72 ; [.FB40.0020.0004.79BE][.F9BE.0000.0000.79BE] # KANGXI RADICAL GRAIN; QQK
+F995 ; [.FB40.0020.0002.79CA][.F9CA.0000.0000.79CA] # CJK COMPATIBILITY IDEOGRAPH-F995; QQC
+3299 ; [.FB40.0020.0006.79D8][.F9D8.0000.0000.79D8] # CIRCLED IDEOGRAPH SECRET; QQK
+2F957 ; [.FB40.0020.0002.79EB][.F9EB.0000.0000.79EB] # CJK COMPATIBILITY IDEOGRAPH-2F957; QQC
+F956 ; [.FB40.0020.0002.7A1C][.FA1C.0000.0000.7A1C] # CJK COMPATIBILITY IDEOGRAPH-F956; QQC
+FA54 ; [.FB40.0020.0002.7A40][.FA40.0000.0000.7A40] # CJK COMPATIBILITY IDEOGRAPH-FA54; QQC
+2F959 ; [.FB40.0020.0002.7A40][.FA40.0000.0000.7A40] # CJK COMPATIBILITY IDEOGRAPH-2F959; QQC
+2F95A ; [.FB40.0020.0002.7A4A][.FA4A.0000.0000.7A4A] # CJK COMPATIBILITY IDEOGRAPH-2F95A; QQC
+2F95B ; [.FB40.0020.0002.7A4F][.FA4F.0000.0000.7A4F] # CJK COMPATIBILITY IDEOGRAPH-2F95B; QQC
+2F73 ; [.FB40.0020.0004.7A74][.FA74.0000.0000.7A74] # KANGXI RADICAL CAVE; QQK
+FA55 ; [.FB40.0020.0002.7A81][.FA81.0000.0000.7A81] # CJK COMPATIBILITY IDEOGRAPH-FA55; QQC
+FAAC ; [.FB40.0020.0002.7AB1][.FAB1.0000.0000.7AB1] # CJK COMPATIBILITY IDEOGRAPH-FAAC; QQC
+F9F7 ; [.FB40.0020.0002.7ACB][.FACB.0000.0000.7ACB] # CJK COMPATIBILITY IDEOGRAPH-F9F7; QQC
+2F74 ; [.FB40.0020.0004.7ACB][.FACB.0000.0000.7ACB] # KANGXI RADICAL STAND; QQK
+2F95F ; [.FB40.0020.0002.7AEE][.FAEE.0000.0000.7AEE] # CJK COMPATIBILITY IDEOGRAPH-2F95F; QQC
+2F75 ; [.FB40.0020.0004.7AF9][.FAF9.0000.0000.7AF9] # KANGXI RADICAL BAMBOO; QQK
+2EAE ; [.FB40.0020.0004.7AF9][.FAF9.0000.0000.7AF9][.0000.0199.001F.2EAE] # CJK RADICAL BAMBOO; QQKN
+F9F8 ; [.FB40.0020.0002.7B20][.FB20.0000.0000.7B20] # CJK COMPATIBILITY IDEOGRAPH-F9F8; QQC
+FA56 ; [.FB40.0020.0002.7BC0][.FBC0.0000.0000.7BC0] # CJK COMPATIBILITY IDEOGRAPH-FA56; QQC
+FAAD ; [.FB40.0020.0002.7BC0][.FBC0.0000.0000.7BC0] # CJK COMPATIBILITY IDEOGRAPH-FAAD; QQC
+2F962 ; [.FB40.0020.0002.7BC6][.FBC6.0000.0000.7BC6] # CJK COMPATIBILITY IDEOGRAPH-2F962; QQC
+2F963 ; [.FB40.0020.0002.7BC9][.FBC9.0000.0000.7BC9] # CJK COMPATIBILITY IDEOGRAPH-2F963; QQC
+F9A6 ; [.FB40.0020.0002.7C3E][.FC3E.0000.0000.7C3E] # CJK COMPATIBILITY IDEOGRAPH-F9A6; QQC
+F944 ; [.FB40.0020.0002.7C60][.FC60.0000.0000.7C60] # CJK COMPATIBILITY IDEOGRAPH-F944; QQC
+2F76 ; [.FB40.0020.0004.7C73][.FC73.0000.0000.7C73] # KANGXI RADICAL RICE; QQK
+FAAE ; [.FB40.0020.0002.7C7B][.FC7B.0000.0000.7C7B] # CJK COMPATIBILITY IDEOGRAPH-FAAE; QQC
+F9F9 ; [.FB40.0020.0002.7C92][.FC92.0000.0000.7C92] # CJK COMPATIBILITY IDEOGRAPH-F9F9; QQC
+FA1D ; [.FB40.0020.0002.7CBE][.FCBE.0000.0000.7CBE] # CJK COMPATIBILITY IDEOGRAPH-FA1D; QQC
+2F966 ; [.FB40.0020.0002.7CD2][.FCD2.0000.0000.7CD2] # CJK COMPATIBILITY IDEOGRAPH-2F966; QQC
+FA03 ; [.FB40.0020.0002.7CD6][.FCD6.0000.0000.7CD6] # CJK COMPATIBILITY IDEOGRAPH-FA03; QQC
+2F969 ; [.FB40.0020.0002.7CE3][.FCE3.0000.0000.7CE3] # CJK COMPATIBILITY IDEOGRAPH-2F969; QQC
+F97B ; [.FB40.0020.0002.7CE7][.FCE7.0000.0000.7CE7] # CJK COMPATIBILITY IDEOGRAPH-F97B; QQC
+2F968 ; [.FB40.0020.0002.7CE8][.FCE8.0000.0000.7CE8] # CJK COMPATIBILITY IDEOGRAPH-2F968; QQC
+2F77 ; [.FB40.0020.0004.7CF8][.FCF8.0000.0000.7CF8] # KANGXI RADICAL SILK; QQK
+2EAF ; [.FB40.0020.0004.7CF9][.FCF9.0000.0000.7CF9] # CJK RADICAL SILK; QQK
+2F96A ; [.FB40.0020.0002.7D00][.FD00.0000.0000.7D00] # CJK COMPATIBILITY IDEOGRAPH-2F96A; QQC
+F9CF ; [.FB40.0020.0002.7D10][.FD10.0000.0000.7D10] # CJK COMPATIBILITY IDEOGRAPH-F9CF; QQC
+F96A ; [.FB40.0020.0002.7D22][.FD22.0000.0000.7D22] # CJK COMPATIBILITY IDEOGRAPH-F96A; QQC
+F94F ; [.FB40.0020.0002.7D2F][.FD2F.0000.0000.7D2F] # CJK COMPATIBILITY IDEOGRAPH-F94F; QQC
+FAAF ; [.FB40.0020.0002.7D5B][.FD5B.0000.0000.7D5B] # CJK COMPATIBILITY IDEOGRAPH-FAAF; QQC
+2F96C ; [.FB40.0020.0002.7D63][.FD63.0000.0000.7D63] # CJK COMPATIBILITY IDEOGRAPH-2F96C; QQC
+F93D ; [.FB40.0020.0002.7DA0][.FDA0.0000.0000.7DA0] # CJK COMPATIBILITY IDEOGRAPH-F93D; QQC
+F957 ; [.FB40.0020.0002.7DBE][.FDBE.0000.0000.7DBE] # CJK COMPATIBILITY IDEOGRAPH-F957; QQC
+2F96E ; [.FB40.0020.0002.7DC7][.FDC7.0000.0000.7DC7] # CJK COMPATIBILITY IDEOGRAPH-2F96E; QQC
+F996 ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-F996; QQC
+FA57 ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-FA57; QQC
+FAB0 ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-FAB0; QQC
+2F96F ; [.FB40.0020.0002.7E02][.FE02.0000.0000.7E02] # CJK COMPATIBILITY IDEOGRAPH-2F96F; QQC
+FA58 ; [.FB40.0020.0002.7E09][.FE09.0000.0000.7E09] # CJK COMPATIBILITY IDEOGRAPH-FA58; QQC
+F950 ; [.FB40.0020.0002.7E37][.FE37.0000.0000.7E37] # CJK COMPATIBILITY IDEOGRAPH-F950; QQC
+FA59 ; [.FB40.0020.0002.7E41][.FE41.0000.0000.7E41] # CJK COMPATIBILITY IDEOGRAPH-FA59; QQC
+2F970 ; [.FB40.0020.0002.7E45][.FE45.0000.0000.7E45] # CJK COMPATIBILITY IDEOGRAPH-2F970; QQC
+2EB0 ; [.FB40.0020.0004.7E9F][.FE9F.0000.0000.7E9F] # CJK RADICAL C-SIMPLIFIED SILK; QQK
+2F78 ; [.FB40.0020.0004.7F36][.FF36.0000.0000.7F36] # KANGXI RADICAL JAR; QQK
+FAB1 ; [.FB40.0020.0002.7F3E][.FF3E.0000.0000.7F3E] # CJK COMPATIBILITY IDEOGRAPH-FAB1; QQC
+2F79 ; [.FB40.0020.0004.7F51][.FF51.0000.0000.7F51] # KANGXI RADICAL NET; QQK
+2EB2 ; [.FB40.0020.0004.7F52][.FF52.0000.0000.7F52] # CJK RADICAL NET TWO; QQK
+2EB5 ; [.FB40.0020.0004.7F52][.FF52.0000.0000.7F52][.0000.0199.001F.2EB5] # CJK RADICAL MESH; QQKN
+2EB1 ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53] # CJK RADICAL NET ONE; QQK
+2EB3 ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53][.0000.0199.001F.2EB3] # CJK RADICAL NET THREE; QQKN
+2EB4 ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53][.0000.019A.001F.2EB4] # CJK RADICAL NET FOUR; QQKN
+FA5A ; [.FB40.0020.0002.7F72][.FF72.0000.0000.7F72] # CJK COMPATIBILITY IDEOGRAPH-FA5A; QQC
+F9E6 ; [.FB40.0020.0002.7F79][.FF79.0000.0000.7F79] # CJK COMPATIBILITY IDEOGRAPH-F9E6; QQC
+2F976 ; [.FB40.0020.0002.7F7A][.FF7A.0000.0000.7F7A] # CJK COMPATIBILITY IDEOGRAPH-2F976; QQC
+F90F ; [.FB40.0020.0002.7F85][.FF85.0000.0000.7F85] # CJK COMPATIBILITY IDEOGRAPH-F90F; QQC
+2F7A ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A] # KANGXI RADICAL SHEEP; QQK
+2EB6 ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A][.0000.0199.001F.2EB6] # CJK RADICAL SHEEP; QQKN
+2EB7 ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A][.0000.019A.001F.2EB7] # CJK RADICAL RAM; QQKN
+2EB8 ; [.FB40.0020.0004.7F8B][.FF8B.0000.0000.7F8B] # CJK RADICAL EWE; QQK
+2F978 ; [.FB40.0020.0002.7F95][.FF95.0000.0000.7F95] # CJK COMPATIBILITY IDEOGRAPH-2F978; QQC
+F9AF ; [.FB40.0020.0002.7F9A][.FF9A.0000.0000.7F9A] # CJK COMPATIBILITY IDEOGRAPH-F9AF; QQC
+FA1E ; [.FB40.0020.0002.7FBD][.FFBD.0000.0000.7FBD] # CJK COMPATIBILITY IDEOGRAPH-FA1E; QQC
+2F7B ; [.FB40.0020.0004.7FBD][.FFBD.0000.0000.7FBD] # KANGXI RADICAL FEATHER; QQK
+2F979 ; [.FB40.0020.0002.7FFA][.FFFA.0000.0000.7FFA] # CJK COMPATIBILITY IDEOGRAPH-2F979; QQC
+F934 ; [.FB41.0020.0002.8001][.8001.0000.0000.8001] # CJK COMPATIBILITY IDEOGRAPH-F934; QQC
+2F7C ; [.FB41.0020.0004.8001][.8001.0000.0000.8001] # KANGXI RADICAL OLD; QQK
+2EB9 ; [.FB41.0020.0004.8002][.8002.0000.0000.8002] # CJK RADICAL OLD; QQK
+FA5B ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-FA5B; QQC
+FAB2 ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-FAB2; QQC
+2F97A ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-2F97A; QQC
+2F7D ; [.FB41.0020.0004.800C][.800C.0000.0000.800C] # KANGXI RADICAL AND; QQK
+2F7E ; [.FB41.0020.0004.8012][.8012.0000.0000.8012] # KANGXI RADICAL PLOW; QQK
+2F7F ; [.FB41.0020.0004.8033][.8033.0000.0000.8033] # KANGXI RADICAL EAR; QQK
+F9B0 ; [.FB41.0020.0002.8046][.8046.0000.0000.8046] # CJK COMPATIBILITY IDEOGRAPH-F9B0; QQC
+2F97D ; [.FB41.0020.0002.8060][.8060.0000.0000.8060] # CJK COMPATIBILITY IDEOGRAPH-2F97D; QQC
+F997 ; [.FB41.0020.0002.806F][.806F.0000.0000.806F] # CJK COMPATIBILITY IDEOGRAPH-F997; QQC
+2F97F ; [.FB41.0020.0002.8070][.8070.0000.0000.8070] # CJK COMPATIBILITY IDEOGRAPH-2F97F; QQC
+F945 ; [.FB41.0020.0002.807E][.807E.0000.0000.807E] # CJK COMPATIBILITY IDEOGRAPH-F945; QQC
+2F80 ; [.FB41.0020.0004.807F][.807F.0000.0000.807F] # KANGXI RADICAL BRUSH; QQK
+2EBB ; [.FB41.0020.0004.807F][.807F.0000.0000.807F][.0000.0199.001F.2EBB] # CJK RADICAL BRUSH TWO; QQKN
+2EBA ; [.FB41.0020.0004.8080][.8080.0000.0000.8080] # CJK RADICAL BRUSH ONE; QQK
+2F81 ; [.FB41.0020.0004.8089][.8089.0000.0000.8089] # KANGXI RADICAL MEAT; QQK
+2EBC ; [.FB41.0020.0004.8089][.8089.0000.0000.8089][.0000.0199.001F.2EBC] # CJK RADICAL MEAT; QQKN
+F953 ; [.FB41.0020.0002.808B][.808B.0000.0000.808B] # CJK COMPATIBILITY IDEOGRAPH-F953; QQC
+2F8D6 ; [.FB41.0020.0002.80AD][.80AD.0000.0000.80AD] # CJK COMPATIBILITY IDEOGRAPH-2F8D6; QQC
+2F982 ; [.FB41.0020.0002.80B2][.80B2.0000.0000.80B2] # CJK COMPATIBILITY IDEOGRAPH-2F982; QQC
+2F983 ; [.FB41.0020.0002.8103][.8103.0000.0000.8103] # CJK COMPATIBILITY IDEOGRAPH-2F983; QQC
+2F985 ; [.FB41.0020.0002.813E][.813E.0000.0000.813E] # CJK COMPATIBILITY IDEOGRAPH-2F985; QQC
+F926 ; [.FB41.0020.0002.81D8][.81D8.0000.0000.81D8] # CJK COMPATIBILITY IDEOGRAPH-F926; QQC
+2F82 ; [.FB41.0020.0004.81E3][.81E3.0000.0000.81E3] # KANGXI RADICAL MINISTER; QQK
+F9F6 ; [.FB41.0020.0002.81E8][.81E8.0000.0000.81E8] # CJK COMPATIBILITY IDEOGRAPH-F9F6; QQC
+2F83 ; [.FB41.0020.0004.81EA][.81EA.0000.0000.81EA] # KANGXI RADICAL SELF; QQK
+3242 ; [*02B1.0020.0004.3242][.FB41.0020.0004.81EA][.81EA.0000.0000.81EA][*02B2.0020.001F.3242] # PARENTHESIZED IDEOGRAPH SELF; QQKN
+FA5C ; [.FB41.0020.0002.81ED][.81ED.0000.0000.81ED] # CJK COMPATIBILITY IDEOGRAPH-FA5C; QQC
+2F84 ; [.FB41.0020.0004.81F3][.81F3.0000.0000.81F3] # KANGXI RADICAL ARRIVE; QQK
+3243 ; [*02B1.0020.0004.3243][.FB41.0020.0004.81F3][.81F3.0000.0000.81F3][*02B2.0020.001F.3243] # PARENTHESIZED IDEOGRAPH REACH; QQKN
+2F85 ; [.FB41.0020.0004.81FC][.81FC.0000.0000.81FC] # KANGXI RADICAL MORTAR; QQK
+2EBD ; [.FB41.0020.0004.81FC][.81FC.0000.0000.81FC][.0000.0199.001F.2EBD] # CJK RADICAL MORTAR; QQKN
+2F893 ; [.FB41.0020.0002.8201][.8201.0000.0000.8201] # CJK COMPATIBILITY IDEOGRAPH-2F893; QQC
+2F98B ; [.FB41.0020.0002.8201][.8201.0000.0000.8201] # CJK COMPATIBILITY IDEOGRAPH-2F98B; QQC
+2F98C ; [.FB41.0020.0002.8204][.8204.0000.0000.8204] # CJK COMPATIBILITY IDEOGRAPH-2F98C; QQC
+2F86 ; [.FB41.0020.0004.820C][.820C.0000.0000.820C] # KANGXI RADICAL TONGUE; QQK
+2F87 ; [.FB41.0020.0004.821B][.821B.0000.0000.821B] # KANGXI RADICAL OPPOSE; QQK
+2F88 ; [.FB41.0020.0004.821F][.821F.0000.0000.821F] # KANGXI RADICAL BOAT; QQK
+2F89 ; [.FB41.0020.0004.826E][.826E.0000.0000.826E] # KANGXI RADICAL STOPPING; QQK
+F97C ; [.FB41.0020.0002.826F][.826F.0000.0000.826F] # CJK COMPATIBILITY IDEOGRAPH-F97C; QQC
+2F8A ; [.FB41.0020.0004.8272][.8272.0000.0000.8272] # KANGXI RADICAL COLOR; QQK
+2F8B ; [.FB41.0020.0004.8278][.8278.0000.0000.8278] # KANGXI RADICAL GRASS; QQK
+FA5D ; [.FB41.0020.0002.8279][.8279.0000.0000.8279] # CJK COMPATIBILITY IDEOGRAPH-FA5D; QQC
+FA5E ; [.FB41.0020.0002.8279][.8279.0000.0000.8279] # CJK COMPATIBILITY IDEOGRAPH-FA5E; QQC
+2EBE ; [.FB41.0020.0004.8279][.8279.0000.0000.8279] # CJK RADICAL GRASS ONE; QQK
+2EBF ; [.FB41.0020.0004.8279][.8279.0000.0000.8279][.0000.0199.001F.2EBF] # CJK RADICAL GRASS TWO; QQKN
+2EC0 ; [.FB41.0020.0004.8279][.8279.0000.0000.8279][.0000.019A.001F.2EC0] # CJK RADICAL GRASS THREE; QQKN
+2F990 ; [.FB41.0020.0002.828B][.828B.0000.0000.828B] # CJK COMPATIBILITY IDEOGRAPH-2F990; QQC
+2F98F ; [.FB41.0020.0002.8291][.8291.0000.0000.8291] # CJK COMPATIBILITY IDEOGRAPH-2F98F; QQC
+2F991 ; [.FB41.0020.0002.829D][.829D.0000.0000.829D] # CJK COMPATIBILITY IDEOGRAPH-2F991; QQC
+2F993 ; [.FB41.0020.0002.82B1][.82B1.0000.0000.82B1] # CJK COMPATIBILITY IDEOGRAPH-2F993; QQC
+2F994 ; [.FB41.0020.0002.82B3][.82B3.0000.0000.82B3] # CJK COMPATIBILITY IDEOGRAPH-2F994; QQC
+2F995 ; [.FB41.0020.0002.82BD][.82BD.0000.0000.82BD] # CJK COMPATIBILITY IDEOGRAPH-2F995; QQC
+F974 ; [.FB41.0020.0002.82E5][.82E5.0000.0000.82E5] # CJK COMPATIBILITY IDEOGRAPH-F974; QQC
+2F998 ; [.FB41.0020.0002.82E5][.82E5.0000.0000.82E5] # CJK COMPATIBILITY IDEOGRAPH-2F998; QQC
+2F996 ; [.FB41.0020.0002.82E6][.82E6.0000.0000.82E6] # CJK COMPATIBILITY IDEOGRAPH-2F996; QQC
+2F999 ; [.FB41.0020.0002.831D][.831D.0000.0000.831D] # CJK COMPATIBILITY IDEOGRAPH-2F999; QQC
+2F99C ; [.FB41.0020.0002.8323][.8323.0000.0000.8323] # CJK COMPATIBILITY IDEOGRAPH-2F99C; QQC
+F9FE ; [.FB41.0020.0002.8336][.8336.0000.0000.8336] # CJK COMPATIBILITY IDEOGRAPH-F9FE; QQC
+FAB3 ; [.FB41.0020.0002.8352][.8352.0000.0000.8352] # CJK COMPATIBILITY IDEOGRAPH-FAB3; QQC
+2F9A0 ; [.FB41.0020.0002.8353][.8353.0000.0000.8353] # CJK COMPATIBILITY IDEOGRAPH-2F9A0; QQC
+2F99A ; [.FB41.0020.0002.8363][.8363.0000.0000.8363] # CJK COMPATIBILITY IDEOGRAPH-2F99A; QQC
+2F99B ; [.FB41.0020.0002.83AD][.83AD.0000.0000.83AD] # CJK COMPATIBILITY IDEOGRAPH-2F99B; QQC
+2F99D ; [.FB41.0020.0002.83BD][.83BD.0000.0000.83BD] # CJK COMPATIBILITY IDEOGRAPH-2F99D; QQC
+F93E ; [.FB41.0020.0002.83C9][.83C9.0000.0000.83C9] # CJK COMPATIBILITY IDEOGRAPH-F93E; QQC
+2F9A1 ; [.FB41.0020.0002.83CA][.83CA.0000.0000.83CA] # CJK COMPATIBILITY IDEOGRAPH-2F9A1; QQC
+2F9A2 ; [.FB41.0020.0002.83CC][.83CC.0000.0000.83CC] # CJK COMPATIBILITY IDEOGRAPH-2F9A2; QQC
+2F9A3 ; [.FB41.0020.0002.83DC][.83DC.0000.0000.83DC] # CJK COMPATIBILITY IDEOGRAPH-2F9A3; QQC
+2F99E ; [.FB41.0020.0002.83E7][.83E7.0000.0000.83E7] # CJK COMPATIBILITY IDEOGRAPH-2F99E; QQC
+FAB4 ; [.FB41.0020.0002.83EF][.83EF.0000.0000.83EF] # CJK COMPATIBILITY IDEOGRAPH-FAB4; QQC
+F958 ; [.FB41.0020.0002.83F1][.83F1.0000.0000.83F1] # CJK COMPATIBILITY IDEOGRAPH-F958; QQC
+F918 ; [.FB41.0020.0002.843D][.843D.0000.0000.843D] # CJK COMPATIBILITY IDEOGRAPH-F918; QQC
+F96E ; [.FB41.0020.0002.8449][.8449.0000.0000.8449] # CJK COMPATIBILITY IDEOGRAPH-F96E; QQC
+FA5F ; [.FB41.0020.0002.8457][.8457.0000.0000.8457] # CJK COMPATIBILITY IDEOGRAPH-FA5F; QQC
+2F99F ; [.FB41.0020.0002.8457][.8457.0000.0000.8457] # CJK COMPATIBILITY IDEOGRAPH-2F99F; QQC
+F999 ; [.FB41.0020.0002.84EE][.84EE.0000.0000.84EE] # CJK COMPATIBILITY IDEOGRAPH-F999; QQC
+2F9A8 ; [.FB41.0020.0002.84F1][.84F1.0000.0000.84F1] # CJK COMPATIBILITY IDEOGRAPH-2F9A8; QQC
+2F9A9 ; [.FB41.0020.0002.84F3][.84F3.0000.0000.84F3] # CJK COMPATIBILITY IDEOGRAPH-2F9A9; QQC
+F9C2 ; [.FB41.0020.0002.84FC][.84FC.0000.0000.84FC] # CJK COMPATIBILITY IDEOGRAPH-F9C2; QQC
+2F9AA ; [.FB41.0020.0002.8516][.8516.0000.0000.8516] # CJK COMPATIBILITY IDEOGRAPH-2F9AA; QQC
+2F9AC ; [.FB41.0020.0002.8564][.8564.0000.0000.8564] # CJK COMPATIBILITY IDEOGRAPH-2F9AC; QQC
+F923 ; [.FB41.0020.0002.85CD][.85CD.0000.0000.85CD] # CJK COMPATIBILITY IDEOGRAPH-F923; QQC
+F9F0 ; [.FB41.0020.0002.85FA][.85FA.0000.0000.85FA] # CJK COMPATIBILITY IDEOGRAPH-F9F0; QQC
+F935 ; [.FB41.0020.0002.8606][.8606.0000.0000.8606] # CJK COMPATIBILITY IDEOGRAPH-F935; QQC
+FA20 ; [.FB41.0020.0002.8612][.8612.0000.0000.8612] # CJK COMPATIBILITY IDEOGRAPH-FA20; QQC
+F91F ; [.FB41.0020.0002.862D][.862D.0000.0000.862D] # CJK COMPATIBILITY IDEOGRAPH-F91F; QQC
+F910 ; [.FB41.0020.0002.863F][.863F.0000.0000.863F] # CJK COMPATIBILITY IDEOGRAPH-F910; QQC
+2F8C ; [.FB41.0020.0004.864D][.864D.0000.0000.864D] # KANGXI RADICAL TIGER; QQK
+2EC1 ; [.FB41.0020.0004.864E][.864E.0000.0000.864E] # CJK RADICAL TIGER; QQK
+2F9B3 ; [.FB41.0020.0002.8650][.8650.0000.0000.8650] # CJK COMPATIBILITY IDEOGRAPH-2F9B3; QQC
+F936 ; [.FB41.0020.0002.865C][.865C.0000.0000.865C] # CJK COMPATIBILITY IDEOGRAPH-F936; QQC
+2F9B4 ; [.FB41.0020.0002.865C][.865C.0000.0000.865C] # CJK COMPATIBILITY IDEOGRAPH-2F9B4; QQC
+2F9B5 ; [.FB41.0020.0002.8667][.8667.0000.0000.8667] # CJK COMPATIBILITY IDEOGRAPH-2F9B5; QQC
+2F9B6 ; [.FB41.0020.0002.8669][.8669.0000.0000.8669] # CJK COMPATIBILITY IDEOGRAPH-2F9B6; QQC
+2F8D ; [.FB41.0020.0004.866B][.866B.0000.0000.866B] # KANGXI RADICAL INSECT; QQK
+2F9B8 ; [.FB41.0020.0002.8688][.8688.0000.0000.8688] # CJK COMPATIBILITY IDEOGRAPH-2F9B8; QQC
+2F9B7 ; [.FB41.0020.0002.86A9][.86A9.0000.0000.86A9] # CJK COMPATIBILITY IDEOGRAPH-2F9B7; QQC
+2F9BA ; [.FB41.0020.0002.86E2][.86E2.0000.0000.86E2] # CJK COMPATIBILITY IDEOGRAPH-2F9BA; QQC
+2F9B9 ; [.FB41.0020.0002.870E][.870E.0000.0000.870E] # CJK COMPATIBILITY IDEOGRAPH-2F9B9; QQC
+2F9BC ; [.FB41.0020.0002.8728][.8728.0000.0000.8728] # CJK COMPATIBILITY IDEOGRAPH-2F9BC; QQC
+2F9BD ; [.FB41.0020.0002.876B][.876B.0000.0000.876B] # CJK COMPATIBILITY IDEOGRAPH-2F9BD; QQC
+FAB5 ; [.FB41.0020.0002.8779][.8779.0000.0000.8779] # CJK COMPATIBILITY IDEOGRAPH-FAB5; QQC
+2F9BB ; [.FB41.0020.0002.8779][.8779.0000.0000.8779] # CJK COMPATIBILITY IDEOGRAPH-2F9BB; QQC
+2F9BE ; [.FB41.0020.0002.8786][.8786.0000.0000.8786] # CJK COMPATIBILITY IDEOGRAPH-2F9BE; QQC
+F911 ; [.FB41.0020.0002.87BA][.87BA.0000.0000.87BA] # CJK COMPATIBILITY IDEOGRAPH-F911; QQC
+2F9C0 ; [.FB41.0020.0002.87E1][.87E1.0000.0000.87E1] # CJK COMPATIBILITY IDEOGRAPH-2F9C0; QQC
+2F9C1 ; [.FB41.0020.0002.8801][.8801.0000.0000.8801] # CJK COMPATIBILITY IDEOGRAPH-2F9C1; QQC
+F927 ; [.FB41.0020.0002.881F][.881F.0000.0000.881F] # CJK COMPATIBILITY IDEOGRAPH-F927; QQC
+2F8E ; [.FB41.0020.0004.8840][.8840.0000.0000.8840] # KANGXI RADICAL BLOOD; QQK
+FA08 ; [.FB41.0020.0002.884C][.884C.0000.0000.884C] # CJK COMPATIBILITY IDEOGRAPH-FA08; QQC
+2F8F ; [.FB41.0020.0004.884C][.884C.0000.0000.884C] # KANGXI RADICAL WALK ENCLOSURE; QQK
+2F9C3 ; [.FB41.0020.0002.8860][.8860.0000.0000.8860] # CJK COMPATIBILITY IDEOGRAPH-2F9C3; QQC
+2F9C4 ; [.FB41.0020.0002.8863][.8863.0000.0000.8863] # CJK COMPATIBILITY IDEOGRAPH-2F9C4; QQC
+2F90 ; [.FB41.0020.0004.8863][.8863.0000.0000.8863] # KANGXI RADICAL CLOTHES; QQK
+2EC2 ; [.FB41.0020.0004.8864][.8864.0000.0000.8864] # CJK RADICAL CLOTHES; QQK
+F9A0 ; [.FB41.0020.0002.88C2][.88C2.0000.0000.88C2] # CJK COMPATIBILITY IDEOGRAPH-F9A0; QQC
+F9E7 ; [.FB41.0020.0002.88CF][.88CF.0000.0000.88CF] # CJK COMPATIBILITY IDEOGRAPH-F9E7; QQC
+2F9C6 ; [.FB41.0020.0002.88D7][.88D7.0000.0000.88D7] # CJK COMPATIBILITY IDEOGRAPH-2F9C6; QQC
+2F9C7 ; [.FB41.0020.0002.88DE][.88DE.0000.0000.88DE] # CJK COMPATIBILITY IDEOGRAPH-2F9C7; QQC
+F9E8 ; [.FB41.0020.0002.88E1][.88E1.0000.0000.88E1] # CJK COMPATIBILITY IDEOGRAPH-F9E8; QQC
+F912 ; [.FB41.0020.0002.88F8][.88F8.0000.0000.88F8] # CJK COMPATIBILITY IDEOGRAPH-F912; QQC
+2F9C9 ; [.FB41.0020.0002.88FA][.88FA.0000.0000.88FA] # CJK COMPATIBILITY IDEOGRAPH-2F9C9; QQC
+FA60 ; [.FB41.0020.0002.8910][.8910.0000.0000.8910] # CJK COMPATIBILITY IDEOGRAPH-FA60; QQC
+FAB6 ; [.FB41.0020.0002.8941][.8941.0000.0000.8941] # CJK COMPATIBILITY IDEOGRAPH-FAB6; QQC
+F924 ; [.FB41.0020.0002.8964][.8964.0000.0000.8964] # CJK COMPATIBILITY IDEOGRAPH-F924; QQC
+2F91 ; [.FB41.0020.0004.897E][.897E.0000.0000.897E] # KANGXI RADICAL WEST; QQK
+2EC4 ; [.FB41.0020.0004.897F][.897F.0000.0000.897F] # CJK RADICAL WEST TWO; QQK
+2EC3 ; [.FB41.0020.0004.8980][.8980.0000.0000.8980] # CJK RADICAL WEST ONE; QQK
+FAB7 ; [.FB41.0020.0002.8986][.8986.0000.0000.8986] # CJK COMPATIBILITY IDEOGRAPH-FAB7; QQC
+FA0A ; [.FB41.0020.0002.898B][.898B.0000.0000.898B] # CJK COMPATIBILITY IDEOGRAPH-FA0A; QQC
+2F92 ; [.FB41.0020.0004.898B][.898B.0000.0000.898B] # KANGXI RADICAL SEE; QQK
+FA61 ; [.FB41.0020.0002.8996][.8996.0000.0000.8996] # CJK COMPATIBILITY IDEOGRAPH-FA61; QQC
+FAB8 ; [.FB41.0020.0002.8996][.8996.0000.0000.8996] # CJK COMPATIBILITY IDEOGRAPH-FAB8; QQC
+2EC5 ; [.FB41.0020.0004.89C1][.89C1.0000.0000.89C1] # CJK RADICAL C-SIMPLIFIED SEE; QQK
+2EC6 ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2] # CJK RADICAL SIMPLIFIED HORN; QQK
+2F93 ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2] # KANGXI RADICAL HORN; QQK
+2EC7 ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2][.0000.0199.001F.2EC7] # CJK RADICAL HORN; QQKN
+2F94 ; [.FB41.0020.0004.8A00][.8A00.0000.0000.8A00] # KANGXI RADICAL SPEECH; QQK
+2F9CF ; [.FB41.0020.0002.8AA0][.8AA0.0000.0000.8AA0] # CJK COMPATIBILITY IDEOGRAPH-2F9CF; QQC
+F96F ; [.FB41.0020.0002.8AAA][.8AAA.0000.0000.8AAA] # CJK COMPATIBILITY IDEOGRAPH-F96F; QQC
+F9A1 ; [.FB41.0020.0002.8AAA][.8AAA.0000.0000.8AAA] # CJK COMPATIBILITY IDEOGRAPH-F9A1; QQC
+FAB9 ; [.FB41.0020.0002.8ABF][.8ABF.0000.0000.8ABF] # CJK COMPATIBILITY IDEOGRAPH-FAB9; QQC
+FABB ; [.FB41.0020.0002.8ACB][.8ACB.0000.0000.8ACB] # CJK COMPATIBILITY IDEOGRAPH-FABB; QQC
+F97D ; [.FB41.0020.0002.8AD2][.8AD2.0000.0000.8AD2] # CJK COMPATIBILITY IDEOGRAPH-F97D; QQC
+F941 ; [.FB41.0020.0002.8AD6][.8AD6.0000.0000.8AD6] # CJK COMPATIBILITY IDEOGRAPH-F941; QQC
+FABE ; [.FB41.0020.0002.8AED][.8AED.0000.0000.8AED] # CJK COMPATIBILITY IDEOGRAPH-FABE; QQC
+2F9D0 ; [.FB41.0020.0002.8AED][.8AED.0000.0000.8AED] # CJK COMPATIBILITY IDEOGRAPH-2F9D0; QQC
+FA22 ; [.FB41.0020.0002.8AF8][.8AF8.0000.0000.8AF8] # CJK COMPATIBILITY IDEOGRAPH-FA22; QQC
+FABA ; [.FB41.0020.0002.8AF8][.8AF8.0000.0000.8AF8] # CJK COMPATIBILITY IDEOGRAPH-FABA; QQC
+F95D ; [.FB41.0020.0002.8AFE][.8AFE.0000.0000.8AFE] # CJK COMPATIBILITY IDEOGRAPH-F95D; QQC
+FABD ; [.FB41.0020.0002.8AFE][.8AFE.0000.0000.8AFE] # CJK COMPATIBILITY IDEOGRAPH-FABD; QQC
+FA62 ; [.FB41.0020.0002.8B01][.8B01.0000.0000.8B01] # CJK COMPATIBILITY IDEOGRAPH-FA62; QQC
+FABC ; [.FB41.0020.0002.8B01][.8B01.0000.0000.8B01] # CJK COMPATIBILITY IDEOGRAPH-FABC; QQC
+FA63 ; [.FB41.0020.0002.8B39][.8B39.0000.0000.8B39] # CJK COMPATIBILITY IDEOGRAPH-FA63; QQC
+FABF ; [.FB41.0020.0002.8B39][.8B39.0000.0000.8B39] # CJK COMPATIBILITY IDEOGRAPH-FABF; QQC
+F9FC ; [.FB41.0020.0002.8B58][.8B58.0000.0000.8B58] # CJK COMPATIBILITY IDEOGRAPH-F9FC; QQC
+F95A ; [.FB41.0020.0002.8B80][.8B80.0000.0000.8B80] # CJK COMPATIBILITY IDEOGRAPH-F95A; QQC
+FAC0 ; [.FB41.0020.0002.8B8A][.8B8A.0000.0000.8B8A] # CJK COMPATIBILITY IDEOGRAPH-FAC0; QQC
+2F9D1 ; [.FB41.0020.0002.8B8A][.8B8A.0000.0000.8B8A] # CJK COMPATIBILITY IDEOGRAPH-2F9D1; QQC
+2EC8 ; [.FB41.0020.0004.8BA0][.8BA0.0000.0000.8BA0] # CJK RADICAL C-SIMPLIFIED SPEECH; QQK
+2F95 ; [.FB41.0020.0004.8C37][.8C37.0000.0000.8C37] # KANGXI RADICAL VALLEY; QQK
+2F96 ; [.FB41.0020.0004.8C46][.8C46.0000.0000.8C46] # KANGXI RADICAL BEAN; QQK
+F900 ; [.FB41.0020.0002.8C48][.8C48.0000.0000.8C48] # CJK COMPATIBILITY IDEOGRAPH-F900; QQC
+2F9D2 ; [.FB41.0020.0002.8C55][.8C55.0000.0000.8C55] # CJK COMPATIBILITY IDEOGRAPH-2F9D2; QQC
+2F97 ; [.FB41.0020.0004.8C55][.8C55.0000.0000.8C55] # KANGXI RADICAL PIG; QQK
+2F98 ; [.FB41.0020.0004.8C78][.8C78.0000.0000.8C78] # KANGXI RADICAL BADGER; QQK
+2F99 ; [.FB41.0020.0004.8C9D][.8C9D.0000.0000.8C9D] # KANGXI RADICAL SHELL; QQK
+3236 ; [*02B1.0020.0004.3236][.FB41.0020.0004.8CA1][.8CA1.0000.0000.8CA1][*02B2.0020.001F.3236] # PARENTHESIZED IDEOGRAPH FINANCIAL; QQKN
+3296 ; [.FB41.0020.0006.8CA1][.8CA1.0000.0000.8CA1] # CIRCLED IDEOGRAPH FINANCIAL; QQK
+2F9D4 ; [.FB41.0020.0002.8CAB][.8CAB.0000.0000.8CAB] # CJK COMPATIBILITY IDEOGRAPH-2F9D4; QQC
+2F9D5 ; [.FB41.0020.0002.8CC1][.8CC1.0000.0000.8CC1] # CJK COMPATIBILITY IDEOGRAPH-2F9D5; QQC
+F948 ; [.FB41.0020.0002.8CC2][.8CC2.0000.0000.8CC2] # CJK COMPATIBILITY IDEOGRAPH-F948; QQC
+323E ; [*02B1.0020.0004.323E][.FB41.0020.0004.8CC7][.8CC7.0000.0000.8CC7][*02B2.0020.001F.323E] # PARENTHESIZED IDEOGRAPH RESOURCE; QQKN
+32AE ; [.FB41.0020.0006.8CC7][.8CC7.0000.0000.8CC7] # CIRCLED IDEOGRAPH RESOURCE; QQK
+F903 ; [.FB41.0020.0002.8CC8][.8CC8.0000.0000.8CC8] # CJK COMPATIBILITY IDEOGRAPH-F903; QQC
+FA64 ; [.FB41.0020.0002.8CD3][.8CD3.0000.0000.8CD3] # CJK COMPATIBILITY IDEOGRAPH-FA64; QQC
+FA65 ; [.FB41.0020.0002.8D08][.8D08.0000.0000.8D08] # CJK COMPATIBILITY IDEOGRAPH-FA65; QQC
+FAC1 ; [.FB41.0020.0002.8D08][.8D08.0000.0000.8D08] # CJK COMPATIBILITY IDEOGRAPH-FAC1; QQC
+2F9D6 ; [.FB41.0020.0002.8D1B][.8D1B.0000.0000.8D1B] # CJK COMPATIBILITY IDEOGRAPH-2F9D6; QQC
+2EC9 ; [.FB41.0020.0004.8D1D][.8D1D.0000.0000.8D1D] # CJK RADICAL C-SIMPLIFIED SHELL; QQK
+2F9A ; [.FB41.0020.0004.8D64][.8D64.0000.0000.8D64] # KANGXI RADICAL RED; QQK
+2F9B ; [.FB41.0020.0004.8D70][.8D70.0000.0000.8D70] # KANGXI RADICAL RUN; QQK
+2F9D7 ; [.FB41.0020.0002.8D77][.8D77.0000.0000.8D77] # CJK COMPATIBILITY IDEOGRAPH-2F9D7; QQC
+2F9C ; [.FB41.0020.0004.8DB3][.8DB3.0000.0000.8DB3] # KANGXI RADICAL FOOT; QQK
+2ECA ; [.FB41.0020.0004.8DB3][.8DB3.0000.0000.8DB3][.0000.0199.001F.2ECA] # CJK RADICAL FOOT; QQKN
+2F9DB ; [.FB41.0020.0002.8DBC][.8DBC.0000.0000.8DBC] # CJK COMPATIBILITY IDEOGRAPH-2F9DB; QQC
+2F9DA ; [.FB41.0020.0002.8DCB][.8DCB.0000.0000.8DCB] # CJK COMPATIBILITY IDEOGRAPH-2F9DA; QQC
+F937 ; [.FB41.0020.0002.8DEF][.8DEF.0000.0000.8DEF] # CJK COMPATIBILITY IDEOGRAPH-F937; QQC
+2F9DC ; [.FB41.0020.0002.8DF0][.8DF0.0000.0000.8DF0] # CJK COMPATIBILITY IDEOGRAPH-2F9DC; QQC
+2F9D ; [.FB41.0020.0004.8EAB][.8EAB.0000.0000.8EAB] # KANGXI RADICAL BODY; QQK
+F902 ; [.FB41.0020.0002.8ECA][.8ECA.0000.0000.8ECA] # CJK COMPATIBILITY IDEOGRAPH-F902; QQC
+2F9E ; [.FB41.0020.0004.8ECA][.8ECA.0000.0000.8ECA] # KANGXI RADICAL CART; QQK
+2F9DE ; [.FB41.0020.0002.8ED4][.8ED4.0000.0000.8ED4] # CJK COMPATIBILITY IDEOGRAPH-2F9DE; QQC
+F998 ; [.FB41.0020.0002.8F26][.8F26.0000.0000.8F26] # CJK COMPATIBILITY IDEOGRAPH-F998; QQC
+F9D7 ; [.FB41.0020.0002.8F2A][.8F2A.0000.0000.8F2A] # CJK COMPATIBILITY IDEOGRAPH-F9D7; QQC
+FAC2 ; [.FB41.0020.0002.8F38][.8F38.0000.0000.8F38] # CJK COMPATIBILITY IDEOGRAPH-FAC2; QQC
+2F9DF ; [.FB41.0020.0002.8F38][.8F38.0000.0000.8F38] # CJK COMPATIBILITY IDEOGRAPH-2F9DF; QQC
+FA07 ; [.FB41.0020.0002.8F3B][.8F3B.0000.0000.8F3B] # CJK COMPATIBILITY IDEOGRAPH-FA07; QQC
+F98D ; [.FB41.0020.0002.8F62][.8F62.0000.0000.8F62] # CJK COMPATIBILITY IDEOGRAPH-F98D; QQC
+2ECB ; [.FB41.0020.0004.8F66][.8F66.0000.0000.8F66] # CJK RADICAL C-SIMPLIFIED CART; QQK
+2F9F ; [.FB41.0020.0004.8F9B][.8F9B.0000.0000.8F9B] # KANGXI RADICAL BITTER; QQK
+2F98D ; [.FB41.0020.0002.8F9E][.8F9E.0000.0000.8F9E] # CJK COMPATIBILITY IDEOGRAPH-2F98D; QQC
+F971 ; [.FB41.0020.0002.8FB0][.8FB0.0000.0000.8FB0] # CJK COMPATIBILITY IDEOGRAPH-F971; QQC
+2FA0 ; [.FB41.0020.0004.8FB0][.8FB0.0000.0000.8FB0] # KANGXI RADICAL MORNING; QQK
+2FA1 ; [.FB41.0020.0004.8FB5][.8FB5.0000.0000.8FB5] # KANGXI RADICAL WALK; QQK
+FA66 ; [.FB41.0020.0002.8FB6][.8FB6.0000.0000.8FB6] # CJK COMPATIBILITY IDEOGRAPH-FA66; QQC
+2ECC ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6] # CJK RADICAL SIMPLIFIED WALK; QQK
+2ECD ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6][.0000.0199.001F.2ECD] # CJK RADICAL WALK ONE; QQKN
+2ECE ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6][.0000.019A.001F.2ECE] # CJK RADICAL WALK TWO; QQKN
+F99A ; [.FB41.0020.0002.9023][.9023.0000.0000.9023] # CJK COMPATIBILITY IDEOGRAPH-F99A; QQC
+FA25 ; [.FB41.0020.0002.9038][.9038.0000.0000.9038] # CJK COMPATIBILITY IDEOGRAPH-FA25; QQC
+FA67 ; [.FB41.0020.0002.9038][.9038.0000.0000.9038] # CJK COMPATIBILITY IDEOGRAPH-FA67; QQC
+329C ; [.FB41.0020.0006.9069][.9069.0000.0000.9069] # CIRCLED IDEOGRAPH SUITABLE; QQK
+FAC3 ; [.FB41.0020.0002.9072][.9072.0000.0000.9072] # CJK COMPATIBILITY IDEOGRAPH-FAC3; QQC
+F9C3 ; [.FB41.0020.0002.907C][.907C.0000.0000.907C] # CJK COMPATIBILITY IDEOGRAPH-F9C3; QQC
+F913 ; [.FB41.0020.0002.908F][.908F.0000.0000.908F] # CJK COMPATIBILITY IDEOGRAPH-F913; QQC
+2FA2 ; [.FB41.0020.0004.9091][.9091.0000.0000.9091] # KANGXI RADICAL CITY; QQK
+2ECF ; [.FB41.0020.0004.9091][.9091.0000.0000.9091][.0000.0199.001F.2ECF] # CJK RADICAL CITY; QQKN
+2F9E2 ; [.FB41.0020.0002.9094][.9094.0000.0000.9094] # CJK COMPATIBILITY IDEOGRAPH-2F9E2; QQC
+F92C ; [.FB41.0020.0002.90CE][.90CE.0000.0000.90CE] # CJK COMPATIBILITY IDEOGRAPH-F92C; QQC
+2F9E3 ; [.FB41.0020.0002.90F1][.90F1.0000.0000.90F1] # CJK COMPATIBILITY IDEOGRAPH-2F9E3; QQC
+FA26 ; [.FB41.0020.0002.90FD][.90FD.0000.0000.90FD] # CJK COMPATIBILITY IDEOGRAPH-FA26; QQC
+2F9E4 ; [.FB41.0020.0002.9111][.9111.0000.0000.9111] # CJK COMPATIBILITY IDEOGRAPH-2F9E4; QQC
+2F9E6 ; [.FB41.0020.0002.911B][.911B.0000.0000.911B] # CJK COMPATIBILITY IDEOGRAPH-2F9E6; QQC
+2FA3 ; [.FB41.0020.0004.9149][.9149.0000.0000.9149] # KANGXI RADICAL WINE; QQK
+F919 ; [.FB41.0020.0002.916A][.916A.0000.0000.916A] # CJK COMPATIBILITY IDEOGRAPH-F919; QQC
+FAC4 ; [.FB41.0020.0002.9199][.9199.0000.0000.9199] # CJK COMPATIBILITY IDEOGRAPH-FAC4; QQC
+F9B7 ; [.FB41.0020.0002.91B4][.91B4.0000.0000.91B4] # CJK COMPATIBILITY IDEOGRAPH-F9B7; QQC
+2FA4 ; [.FB41.0020.0004.91C6][.91C6.0000.0000.91C6] # KANGXI RADICAL DISTINGUISH; QQK
+F9E9 ; [.FB41.0020.0002.91CC][.91CC.0000.0000.91CC] # CJK COMPATIBILITY IDEOGRAPH-F9E9; QQC
+2FA5 ; [.FB41.0020.0004.91CC][.91CC.0000.0000.91CC] # KANGXI RADICAL VILLAGE; QQK
+F97E ; [.FB41.0020.0002.91CF][.91CF.0000.0000.91CF] # CJK COMPATIBILITY IDEOGRAPH-F97E; QQC
+F90A ; [.FB41.0020.0002.91D1][.91D1.0000.0000.91D1] # CJK COMPATIBILITY IDEOGRAPH-F90A; QQC
+2FA6 ; [.FB41.0020.0004.91D1][.91D1.0000.0000.91D1] # KANGXI RADICAL GOLD; QQK
+322E ; [*02B1.0020.0004.322E][.FB41.0020.0004.91D1][.91D1.0000.0000.91D1][*02B2.0020.001F.322E] # PARENTHESIZED IDEOGRAPH METAL; QQKN
+328E ; [.FB41.0020.0006.91D1][.91D1.0000.0000.91D1] # CIRCLED IDEOGRAPH METAL; QQK
+F9B1 ; [.FB41.0020.0002.9234][.9234.0000.0000.9234] # CJK COMPATIBILITY IDEOGRAPH-F9B1; QQC
+2F9E7 ; [.FB41.0020.0002.9238][.9238.0000.0000.9238] # CJK COMPATIBILITY IDEOGRAPH-2F9E7; QQC
+FAC5 ; [.FB41.0020.0002.9276][.9276.0000.0000.9276] # CJK COMPATIBILITY IDEOGRAPH-FAC5; QQC
+2F9EA ; [.FB41.0020.0002.927C][.927C.0000.0000.927C] # CJK COMPATIBILITY IDEOGRAPH-2F9EA; QQC
+2F9E8 ; [.FB41.0020.0002.92D7][.92D7.0000.0000.92D7] # CJK COMPATIBILITY IDEOGRAPH-2F9E8; QQC
+2F9E9 ; [.FB41.0020.0002.92D8][.92D8.0000.0000.92D8] # CJK COMPATIBILITY IDEOGRAPH-2F9E9; QQC
+F93F ; [.FB41.0020.0002.9304][.9304.0000.0000.9304] # CJK COMPATIBILITY IDEOGRAPH-F93F; QQC
+F99B ; [.FB41.0020.0002.934A][.934A.0000.0000.934A] # CJK COMPATIBILITY IDEOGRAPH-F99B; QQC
+2F9EB ; [.FB41.0020.0002.93F9][.93F9.0000.0000.93F9] # CJK COMPATIBILITY IDEOGRAPH-2F9EB; QQC
+2F9EC ; [.FB41.0020.0002.9415][.9415.0000.0000.9415] # CJK COMPATIBILITY IDEOGRAPH-2F9EC; QQC
+2ED0 ; [.FB41.0020.0004.9485][.9485.0000.0000.9485] # CJK RADICAL C-SIMPLIFIED GOLD; QQK
+2ED1 ; [.FB41.0020.0004.9577][.9577.0000.0000.9577] # CJK RADICAL LONG ONE; QQK
+2FA7 ; [.FB41.0020.0004.9577][.9577.0000.0000.9577] # KANGXI RADICAL LONG; QQK
+2ED2 ; [.FB41.0020.0004.9578][.9578.0000.0000.9578] # CJK RADICAL LONG TWO; QQK
+2ED3 ; [.FB41.0020.0004.957F][.957F.0000.0000.957F] # CJK RADICAL C-SIMPLIFIED LONG; QQK
+2FA8 ; [.FB41.0020.0004.9580][.9580.0000.0000.9580] # KANGXI RADICAL GATE; QQK
+2F9EE ; [.FB41.0020.0002.958B][.958B.0000.0000.958B] # CJK COMPATIBILITY IDEOGRAPH-2F9EE; QQC
+F986 ; [.FB41.0020.0002.95AD][.95AD.0000.0000.95AD] # CJK COMPATIBILITY IDEOGRAPH-F986; QQC
+2F9F0 ; [.FB41.0020.0002.95B7][.95B7.0000.0000.95B7] # CJK COMPATIBILITY IDEOGRAPH-2F9F0; QQC
+2ED4 ; [.FB41.0020.0004.95E8][.95E8.0000.0000.95E8] # CJK RADICAL C-SIMPLIFIED GATE; QQK
+2FA9 ; [.FB41.0020.0004.961C][.961C.0000.0000.961C] # KANGXI RADICAL MOUND; QQK
+2ED5 ; [.FB41.0020.0004.961C][.961C.0000.0000.961C][.0000.0199.001F.2ED5] # CJK RADICAL MOUND ONE; QQKN
+2ED6 ; [.FB41.0020.0004.961D][.961D.0000.0000.961D] # CJK RADICAL MOUND TWO; QQK
+F9C6 ; [.FB41.0020.0002.962E][.962E.0000.0000.962E] # CJK COMPATIBILITY IDEOGRAPH-F9C6; QQC
+F951 ; [.FB41.0020.0002.964B][.964B.0000.0000.964B] # CJK COMPATIBILITY IDEOGRAPH-F951; QQC
+FA09 ; [.FB41.0020.0002.964D][.964D.0000.0000.964D] # CJK COMPATIBILITY IDEOGRAPH-FA09; QQC
+F959 ; [.FB41.0020.0002.9675][.9675.0000.0000.9675] # CJK COMPATIBILITY IDEOGRAPH-F959; QQC
+F9D3 ; [.FB41.0020.0002.9678][.9678.0000.0000.9678] # CJK COMPATIBILITY IDEOGRAPH-F9D3; QQC
+FAC6 ; [.FB41.0020.0002.967C][.967C.0000.0000.967C] # CJK COMPATIBILITY IDEOGRAPH-FAC6; QQC
+F9DC ; [.FB41.0020.0002.9686][.9686.0000.0000.9686] # CJK COMPATIBILITY IDEOGRAPH-F9DC; QQC
+F9F1 ; [.FB41.0020.0002.96A3][.96A3.0000.0000.96A3] # CJK COMPATIBILITY IDEOGRAPH-F9F1; QQC
+2FAA ; [.FB41.0020.0004.96B6][.96B6.0000.0000.96B6] # KANGXI RADICAL SLAVE; QQK
+F9B8 ; [.FB41.0020.0002.96B8][.96B8.0000.0000.96B8] # CJK COMPATIBILITY IDEOGRAPH-F9B8; QQC
+2FAB ; [.FB41.0020.0004.96B9][.96B9.0000.0000.96B9] # KANGXI RADICAL SHORT TAILED BIRD; QQK
+2F9F3 ; [.FB41.0020.0002.96C3][.96C3.0000.0000.96C3] # CJK COMPATIBILITY IDEOGRAPH-2F9F3; QQC
+F9EA ; [.FB41.0020.0002.96E2][.96E2.0000.0000.96E2] # CJK COMPATIBILITY IDEOGRAPH-F9EA; QQC
+FA68 ; [.FB41.0020.0002.96E3][.96E3.0000.0000.96E3] # CJK COMPATIBILITY IDEOGRAPH-FA68; QQC
+FAC7 ; [.FB41.0020.0002.96E3][.96E3.0000.0000.96E3] # CJK COMPATIBILITY IDEOGRAPH-FAC7; QQC
+2FAC ; [.FB41.0020.0004.96E8][.96E8.0000.0000.96E8] # KANGXI RADICAL RAIN; QQK
+2ED7 ; [.FB41.0020.0004.96E8][.96E8.0000.0000.96E8][.0000.0199.001F.2ED7] # CJK RADICAL RAIN; QQKN
+F9B2 ; [.FB41.0020.0002.96F6][.96F6.0000.0000.96F6] # CJK COMPATIBILITY IDEOGRAPH-F9B2; QQC
+F949 ; [.FB41.0020.0002.96F7][.96F7.0000.0000.96F7] # CJK COMPATIBILITY IDEOGRAPH-F949; QQC
+2F9F5 ; [.FB41.0020.0002.9723][.9723.0000.0000.9723] # CJK COMPATIBILITY IDEOGRAPH-2F9F5; QQC
+F938 ; [.FB41.0020.0002.9732][.9732.0000.0000.9732] # CJK COMPATIBILITY IDEOGRAPH-F938; QQC
+F9B3 ; [.FB41.0020.0002.9748][.9748.0000.0000.9748] # CJK COMPATIBILITY IDEOGRAPH-F9B3; QQC
+2FAD ; [.FB41.0020.0004.9751][.9751.0000.0000.9751] # KANGXI RADICAL BLUE; QQK
+2ED8 ; [.FB41.0020.0004.9752][.9752.0000.0000.9752] # CJK RADICAL BLUE; QQK
+FA1C ; [.FB41.0020.0002.9756][.9756.0000.0000.9756] # CJK COMPATIBILITY IDEOGRAPH-FA1C; QQC
+FAC8 ; [.FB41.0020.0002.9756][.9756.0000.0000.9756] # CJK COMPATIBILITY IDEOGRAPH-FAC8; QQC
+2FAE ; [.FB41.0020.0004.975E][.975E.0000.0000.975E] # KANGXI RADICAL WRONG; QQK
+2FAF ; [.FB41.0020.0004.9762][.9762.0000.0000.9762] # KANGXI RADICAL FACE; QQK
+2FB0 ; [.FB41.0020.0004.9769][.9769.0000.0000.9769] # KANGXI RADICAL LEATHER; QQK
+2FB1 ; [.FB41.0020.0004.97CB][.97CB.0000.0000.97CB] # KANGXI RADICAL TANNED LEATHER; QQK
+FAC9 ; [.FB41.0020.0002.97DB][.97DB.0000.0000.97DB] # CJK COMPATIBILITY IDEOGRAPH-FAC9; QQC
+2F9FA ; [.FB41.0020.0002.97E0][.97E0.0000.0000.97E0] # CJK COMPATIBILITY IDEOGRAPH-2F9FA; QQC
+2ED9 ; [.FB41.0020.0004.97E6][.97E6.0000.0000.97E6] # CJK RADICAL C-SIMPLIFIED TANNED LEATHER; QQK
+2FB2 ; [.FB41.0020.0004.97ED][.97ED.0000.0000.97ED] # KANGXI RADICAL LEEK; QQK
+2FB3 ; [.FB41.0020.0004.97F3][.97F3.0000.0000.97F3] # KANGXI RADICAL SOUND; QQK
+FA69 ; [.FB41.0020.0002.97FF][.97FF.0000.0000.97FF] # CJK COMPATIBILITY IDEOGRAPH-FA69; QQC
+FACA ; [.FB41.0020.0002.97FF][.97FF.0000.0000.97FF] # CJK COMPATIBILITY IDEOGRAPH-FACA; QQC
+2FB4 ; [.FB41.0020.0004.9801][.9801.0000.0000.9801] # KANGXI RADICAL LEAF; QQK
+32A0 ; [.FB41.0020.0006.9805][.9805.0000.0000.9805] # CIRCLED IDEOGRAPH ITEM; QQK
+FACB ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-FACB; QQC
+2F9FE ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-2F9FE; QQC
+2F9FF ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-2F9FF; QQC
+F9B4 ; [.FB41.0020.0002.9818][.9818.0000.0000.9818] # CJK COMPATIBILITY IDEOGRAPH-F9B4; QQC
+2FA00 ; [.FB41.0020.0002.9829][.9829.0000.0000.9829] # CJK COMPATIBILITY IDEOGRAPH-2FA00; QQC
+FA6A ; [.FB41.0020.0002.983B][.983B.0000.0000.983B] # CJK COMPATIBILITY IDEOGRAPH-FA6A; QQC
+FACC ; [.FB41.0020.0002.983B][.983B.0000.0000.983B] # CJK COMPATIBILITY IDEOGRAPH-FACC; QQC
+F9D0 ; [.FB41.0020.0002.985E][.985E.0000.0000.985E] # CJK COMPATIBILITY IDEOGRAPH-F9D0; QQC
+2EDA ; [.FB41.0020.0004.9875][.9875.0000.0000.9875] # CJK RADICAL C-SIMPLIFIED LEAF; QQK
+2FB5 ; [.FB41.0020.0004.98A8][.98A8.0000.0000.98A8] # KANGXI RADICAL WIND; QQK
+2EDB ; [.FB41.0020.0004.98CE][.98CE.0000.0000.98CE] # CJK RADICAL C-SIMPLIFIED WIND; QQK
+2FB6 ; [.FB41.0020.0004.98DB][.98DB.0000.0000.98DB] # KANGXI RADICAL FLY; QQK
+2EDC ; [.FB41.0020.0004.98DE][.98DE.0000.0000.98DE] # CJK RADICAL C-SIMPLIFIED FLY; QQK
+2EDD ; [.FB41.0020.0004.98DF][.98DF.0000.0000.98DF] # CJK RADICAL EAT ONE; QQK
+2FB7 ; [.FB41.0020.0004.98DF][.98DF.0000.0000.98DF] # KANGXI RADICAL EAT; QQK
+2EDF ; [.FB41.0020.0004.98E0][.98E0.0000.0000.98E0] # CJK RADICAL EAT THREE; QQK
+2EDE ; [.FB41.0020.0004.98E0][.98E0.0000.0000.98E0][.0000.0199.001F.2EDE] # CJK RADICAL EAT TWO; QQKN
+2FA02 ; [.FB41.0020.0002.98E2][.98E2.0000.0000.98E2] # CJK COMPATIBILITY IDEOGRAPH-2FA02; QQC
+FA2A ; [.FB41.0020.0002.98EF][.98EF.0000.0000.98EF] # CJK COMPATIBILITY IDEOGRAPH-FA2A; QQC
+FA2B ; [.FB41.0020.0002.98FC][.98FC.0000.0000.98FC] # CJK COMPATIBILITY IDEOGRAPH-FA2B; QQC
+FA2C ; [.FB41.0020.0002.9928][.9928.0000.0000.9928] # CJK COMPATIBILITY IDEOGRAPH-FA2C; QQC
+2FA04 ; [.FB41.0020.0002.9929][.9929.0000.0000.9929] # CJK COMPATIBILITY IDEOGRAPH-2FA04; QQC
+2EE0 ; [.FB41.0020.0004.9963][.9963.0000.0000.9963] # CJK RADICAL C-SIMPLIFIED EAT; QQK
+2FB8 ; [.FB41.0020.0004.9996][.9996.0000.0000.9996] # KANGXI RADICAL HEAD; QQK
+2EE1 ; [.FB41.0020.0004.9996][.9996.0000.0000.9996][.0000.0199.001F.2EE1] # CJK RADICAL HEAD; QQKN
+2FB9 ; [.FB41.0020.0004.9999][.9999.0000.0000.9999] # KANGXI RADICAL FRAGRANT; QQK
+2FA05 ; [.FB41.0020.0002.99A7][.99A7.0000.0000.99A7] # CJK COMPATIBILITY IDEOGRAPH-2FA05; QQC
+2FBA ; [.FB41.0020.0004.99AC][.99AC.0000.0000.99AC] # KANGXI RADICAL HORSE; QQK
+2FA06 ; [.FB41.0020.0002.99C2][.99C2.0000.0000.99C2] # CJK COMPATIBILITY IDEOGRAPH-2FA06; QQC
+F91A ; [.FB41.0020.0002.99F1][.99F1.0000.0000.99F1] # CJK COMPATIBILITY IDEOGRAPH-F91A; QQC
+2FA07 ; [.FB41.0020.0002.99FE][.99FE.0000.0000.99FE] # CJK COMPATIBILITY IDEOGRAPH-2FA07; QQC
+F987 ; [.FB41.0020.0002.9A6A][.9A6A.0000.0000.9A6A] # CJK COMPATIBILITY IDEOGRAPH-F987; QQC
+2EE2 ; [.FB41.0020.0004.9A6C][.9A6C.0000.0000.9A6C] # CJK RADICAL C-SIMPLIFIED HORSE; QQK
+2FBB ; [.FB41.0020.0004.9AA8][.9AA8.0000.0000.9AA8] # KANGXI RADICAL BONE; QQK
+2EE3 ; [.FB41.0020.0004.9AA8][.9AA8.0000.0000.9AA8][.0000.0199.001F.2EE3] # CJK RADICAL BONE; QQKN
+2FBC ; [.FB41.0020.0004.9AD8][.9AD8.0000.0000.9AD8] # KANGXI RADICAL TALL; QQK
+2FBD ; [.FB41.0020.0004.9ADF][.9ADF.0000.0000.9ADF] # KANGXI RADICAL HAIR; QQK
+FACD ; [.FB41.0020.0002.9B12][.9B12.0000.0000.9B12] # CJK COMPATIBILITY IDEOGRAPH-FACD; QQC
+2FA0A ; [.FB41.0020.0002.9B12][.9B12.0000.0000.9B12] # CJK COMPATIBILITY IDEOGRAPH-2FA0A; QQC
+2FBE ; [.FB41.0020.0004.9B25][.9B25.0000.0000.9B25] # KANGXI RADICAL FIGHT; QQK
+2FBF ; [.FB41.0020.0004.9B2F][.9B2F.0000.0000.9B2F] # KANGXI RADICAL SACRIFICIAL WINE; QQK
+2FC0 ; [.FB41.0020.0004.9B32][.9B32.0000.0000.9B32] # KANGXI RADICAL CAULDRON; QQK
+2FC1 ; [.FB41.0020.0004.9B3C][.9B3C.0000.0000.9B3C] # KANGXI RADICAL GHOST; QQK
+2EE4 ; [.FB41.0020.0004.9B3C][.9B3C.0000.0000.9B3C][.0000.0199.001F.2EE4] # CJK RADICAL GHOST; QQKN
+2FC2 ; [.FB41.0020.0004.9B5A][.9B5A.0000.0000.9B5A] # KANGXI RADICAL FISH; QQK
+F939 ; [.FB41.0020.0002.9B6F][.9B6F.0000.0000.9B6F] # CJK COMPATIBILITY IDEOGRAPH-F939; QQC
+2FA0B ; [.FB41.0020.0002.9C40][.9C40.0000.0000.9C40] # CJK COMPATIBILITY IDEOGRAPH-2FA0B; QQC
+F9F2 ; [.FB41.0020.0002.9C57][.9C57.0000.0000.9C57] # CJK COMPATIBILITY IDEOGRAPH-F9F2; QQC
+2EE5 ; [.FB41.0020.0004.9C7C][.9C7C.0000.0000.9C7C] # CJK RADICAL C-SIMPLIFIED FISH; QQK
+2FC3 ; [.FB41.0020.0004.9CE5][.9CE5.0000.0000.9CE5] # KANGXI RADICAL BIRD; QQK
+2FA0C ; [.FB41.0020.0002.9CFD][.9CFD.0000.0000.9CFD] # CJK COMPATIBILITY IDEOGRAPH-2FA0C; QQC
+2FA0F ; [.FB41.0020.0002.9D67][.9D67.0000.0000.9D67] # CJK COMPATIBILITY IDEOGRAPH-2FA0F; QQC
+FA2D ; [.FB41.0020.0002.9DB4][.9DB4.0000.0000.9DB4] # CJK COMPATIBILITY IDEOGRAPH-FA2D; QQC
+F93A ; [.FB41.0020.0002.9DFA][.9DFA.0000.0000.9DFA] # CJK COMPATIBILITY IDEOGRAPH-F93A; QQC
+F920 ; [.FB41.0020.0002.9E1E][.9E1E.0000.0000.9E1E] # CJK COMPATIBILITY IDEOGRAPH-F920; QQC
+2EE6 ; [.FB41.0020.0004.9E1F][.9E1F.0000.0000.9E1F] # CJK RADICAL C-SIMPLIFIED BIRD; QQK
+2FC4 ; [.FB41.0020.0004.9E75][.9E75.0000.0000.9E75] # KANGXI RADICAL SALT; QQK
+2EE7 ; [.FB41.0020.0004.9E75][.9E75.0000.0000.9E75][.0000.0199.001F.2EE7] # CJK RADICAL C-SIMPLIFIED SALT; QQKN
+F940 ; [.FB41.0020.0002.9E7F][.9E7F.0000.0000.9E7F] # CJK COMPATIBILITY IDEOGRAPH-F940; QQC
+2FC5 ; [.FB41.0020.0004.9E7F][.9E7F.0000.0000.9E7F] # KANGXI RADICAL DEER; QQK
+F988 ; [.FB41.0020.0002.9E97][.9E97.0000.0000.9E97] # CJK COMPATIBILITY IDEOGRAPH-F988; QQC
+F9F3 ; [.FB41.0020.0002.9E9F][.9E9F.0000.0000.9E9F] # CJK COMPATIBILITY IDEOGRAPH-F9F3; QQC
+2FC6 ; [.FB41.0020.0004.9EA5][.9EA5.0000.0000.9EA5] # KANGXI RADICAL WHEAT; QQK
+2EE8 ; [.FB41.0020.0004.9EA6][.9EA6.0000.0000.9EA6] # CJK RADICAL SIMPLIFIED WHEAT; QQK
+2FA15 ; [.FB41.0020.0002.9EBB][.9EBB.0000.0000.9EBB] # CJK COMPATIBILITY IDEOGRAPH-2FA15; QQC
+2FC7 ; [.FB41.0020.0004.9EBB][.9EBB.0000.0000.9EBB] # KANGXI RADICAL HEMP; QQK
+2FC8 ; [.FB41.0020.0004.9EC3][.9EC3.0000.0000.9EC3] # KANGXI RADICAL YELLOW; QQK
+2EE9 ; [.FB41.0020.0004.9EC4][.9EC4.0000.0000.9EC4] # CJK RADICAL SIMPLIFIED YELLOW; QQK
+2FC9 ; [.FB41.0020.0004.9ECD][.9ECD.0000.0000.9ECD] # KANGXI RADICAL MILLET; QQK
+F989 ; [.FB41.0020.0002.9ECE][.9ECE.0000.0000.9ECE] # CJK COMPATIBILITY IDEOGRAPH-F989; QQC
+2FCA ; [.FB41.0020.0004.9ED1][.9ED1.0000.0000.9ED1] # KANGXI RADICAL BLACK; QQK
+2FA17 ; [.FB41.0020.0002.9EF9][.9EF9.0000.0000.9EF9] # CJK COMPATIBILITY IDEOGRAPH-2FA17; QQC
+2FCB ; [.FB41.0020.0004.9EF9][.9EF9.0000.0000.9EF9] # KANGXI RADICAL EMBROIDERY; QQK
+2FCC ; [.FB41.0020.0004.9EFD][.9EFD.0000.0000.9EFD] # KANGXI RADICAL FROG; QQK
+2FA18 ; [.FB41.0020.0002.9EFE][.9EFE.0000.0000.9EFE] # CJK COMPATIBILITY IDEOGRAPH-2FA18; QQC
+2EEA ; [.FB41.0020.0004.9EFE][.9EFE.0000.0000.9EFE] # CJK RADICAL C-SIMPLIFIED FROG; QQK
+2FA19 ; [.FB41.0020.0002.9F05][.9F05.0000.0000.9F05] # CJK COMPATIBILITY IDEOGRAPH-2FA19; QQC
+2FCD ; [.FB41.0020.0004.9F0E][.9F0E.0000.0000.9F0E] # KANGXI RADICAL TRIPOD; QQK
+2FA1A ; [.FB41.0020.0002.9F0F][.9F0F.0000.0000.9F0F] # CJK COMPATIBILITY IDEOGRAPH-2FA1A; QQC
+2FCE ; [.FB41.0020.0004.9F13][.9F13.0000.0000.9F13] # KANGXI RADICAL DRUM; QQK
+2FA1B ; [.FB41.0020.0002.9F16][.9F16.0000.0000.9F16] # CJK COMPATIBILITY IDEOGRAPH-2FA1B; QQC
+2FCF ; [.FB41.0020.0004.9F20][.9F20.0000.0000.9F20] # KANGXI RADICAL RAT; QQK
+2FA1C ; [.FB41.0020.0002.9F3B][.9F3B.0000.0000.9F3B] # CJK COMPATIBILITY IDEOGRAPH-2FA1C; QQC
+2FD0 ; [.FB41.0020.0004.9F3B][.9F3B.0000.0000.9F3B] # KANGXI RADICAL NOSE; QQK
+FAD8 ; [.FB41.0020.0002.9F43][.9F43.0000.0000.9F43] # CJK COMPATIBILITY IDEOGRAPH-FAD8; QQC
+2FD1 ; [.FB41.0020.0004.9F4A][.9F4A.0000.0000.9F4A] # KANGXI RADICAL EVEN; QQK
+2EEB ; [.FB41.0020.0004.9F4A][.9F4A.0000.0000.9F4A][.0000.0199.001F.2EEB] # CJK RADICAL J-SIMPLIFIED EVEN; QQKN
+2EEC ; [.FB41.0020.0004.9F50][.9F50.0000.0000.9F50] # CJK RADICAL C-SIMPLIFIED EVEN; QQK
+2FD2 ; [.FB41.0020.0004.9F52][.9F52.0000.0000.9F52] # KANGXI RADICAL TOOTH; QQK
+2EED ; [.FB41.0020.0004.9F52][.9F52.0000.0000.9F52][.0000.0199.001F.2EED] # CJK RADICAL J-SIMPLIFIED TOOTH; QQKN
+2EEE ; [.FB41.0020.0004.9F7F][.9F7F.0000.0000.9F7F] # CJK RADICAL C-SIMPLIFIED TOOTH; QQK
+F9C4 ; [.FB41.0020.0002.9F8D][.9F8D.0000.0000.9F8D] # CJK COMPATIBILITY IDEOGRAPH-F9C4; QQC
+2FD3 ; [.FB41.0020.0004.9F8D][.9F8D.0000.0000.9F8D] # KANGXI RADICAL DRAGON; QQK
+2EEF ; [.FB41.0020.0004.9F8D][.9F8D.0000.0000.9F8D][.0000.0199.001F.2EEF] # CJK RADICAL J-SIMPLIFIED DRAGON; QQKN
+FAD9 ; [.FB41.0020.0002.9F8E][.9F8E.0000.0000.9F8E] # CJK COMPATIBILITY IDEOGRAPH-FAD9; QQC
+2EF0 ; [.FB41.0020.0004.9F99][.9F99.0000.0000.9F99] # CJK RADICAL C-SIMPLIFIED DRAGON; QQK
+F907 ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-F907; QQC
+F908 ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-F908; QQC
+FACE ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-FACE; QQC
+2FD4 ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C] # KANGXI RADICAL TURTLE; QQK
+2EF1 ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C][.0000.0199.001F.2EF1] # CJK RADICAL TURTLE; QQKN
+2EF2 ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C][.0000.019A.001F.2EF2] # CJK RADICAL J-SIMPLIFIED TURTLE; QQKN
+2EF3 ; [.FB41.0020.0004.9F9F][.9F9F.0000.0000.9F9F] # CJK RADICAL C-SIMPLIFIED TURTLE; QQK
+2FD5 ; [.FB41.0020.0004.9FA0][.9FA0.0000.0000.9FA0] # KANGXI RADICAL FLUTE; QQK
+FA0E ; [.FB41.0020.0002.FA0E][.FA0E.0000.0000.FA0E] # CJK COMPATIBILITY IDEOGRAPH-FA0E
+FA0F ; [.FB41.0020.0002.FA0F][.FA0F.0000.0000.FA0F] # CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA11 ; [.FB41.0020.0002.FA11][.FA11.0000.0000.FA11] # CJK COMPATIBILITY IDEOGRAPH-FA11
+FA13 ; [.FB41.0020.0002.FA13][.FA13.0000.0000.FA13] # CJK COMPATIBILITY IDEOGRAPH-FA13
+FA14 ; [.FB41.0020.0002.FA14][.FA14.0000.0000.FA14] # CJK COMPATIBILITY IDEOGRAPH-FA14
+FA1F ; [.FB41.0020.0002.FA1F][.FA1F.0000.0000.FA1F] # CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA21 ; [.FB41.0020.0002.FA21][.FA21.0000.0000.FA21] # CJK COMPATIBILITY IDEOGRAPH-FA21
+FA23 ; [.FB41.0020.0002.FA23][.FA23.0000.0000.FA23] # CJK COMPATIBILITY IDEOGRAPH-FA23
+FA24 ; [.FB41.0020.0002.FA24][.FA24.0000.0000.FA24] # CJK COMPATIBILITY IDEOGRAPH-FA24
+FA27 ; [.FB41.0020.0002.FA27][.FA27.0000.0000.FA27] # CJK COMPATIBILITY IDEOGRAPH-FA27
+FA28 ; [.FB41.0020.0002.FA28][.FA28.0000.0000.FA28] # CJK COMPATIBILITY IDEOGRAPH-FA28
+FA29 ; [.FB41.0020.0002.FA29][.FA29.0000.0000.FA29] # CJK COMPATIBILITY IDEOGRAPH-FA29
+2F80C ; [.FB80.0020.0002.349E][.B49E.0000.0000.349E] # CJK COMPATIBILITY IDEOGRAPH-2F80C; QQC
+2F813 ; [.FB80.0020.0002.34B9][.B4B9.0000.0000.34B9] # CJK COMPATIBILITY IDEOGRAPH-2F813; QQC
+2F9CA ; [.FB80.0020.0002.34BB][.B4BB.0000.0000.34BB] # CJK COMPATIBILITY IDEOGRAPH-2F9CA; QQC
+2F81F ; [.FB80.0020.0002.34DF][.B4DF.0000.0000.34DF] # CJK COMPATIBILITY IDEOGRAPH-2F81F; QQC
+2F824 ; [.FB80.0020.0002.3515][.B515.0000.0000.3515] # CJK COMPATIBILITY IDEOGRAPH-2F824; QQC
+2F867 ; [.FB80.0020.0002.36EE][.B6EE.0000.0000.36EE] # CJK COMPATIBILITY IDEOGRAPH-2F867; QQC
+2F868 ; [.FB80.0020.0002.36FC][.B6FC.0000.0000.36FC] # CJK COMPATIBILITY IDEOGRAPH-2F868; QQC
+2F876 ; [.FB80.0020.0002.3781][.B781.0000.0000.3781] # CJK COMPATIBILITY IDEOGRAPH-2F876; QQC
+2F883 ; [.FB80.0020.0002.382F][.B82F.0000.0000.382F] # CJK COMPATIBILITY IDEOGRAPH-2F883; QQC
+2F888 ; [.FB80.0020.0002.3862][.B862.0000.0000.3862] # CJK COMPATIBILITY IDEOGRAPH-2F888; QQC
+2F88A ; [.FB80.0020.0002.387C][.B87C.0000.0000.387C] # CJK COMPATIBILITY IDEOGRAPH-2F88A; QQC
+2F896 ; [.FB80.0020.0002.38C7][.B8C7.0000.0000.38C7] # CJK COMPATIBILITY IDEOGRAPH-2F896; QQC
+2F89B ; [.FB80.0020.0002.38E3][.B8E3.0000.0000.38E3] # CJK COMPATIBILITY IDEOGRAPH-2F89B; QQC
+2F8A2 ; [.FB80.0020.0002.391C][.B91C.0000.0000.391C] # CJK COMPATIBILITY IDEOGRAPH-2F8A2; QQC
+2F8A1 ; [.FB80.0020.0002.393A][.B93A.0000.0000.393A] # CJK COMPATIBILITY IDEOGRAPH-2F8A1; QQC
+2F8C2 ; [.FB80.0020.0002.3A2E][.BA2E.0000.0000.3A2E] # CJK COMPATIBILITY IDEOGRAPH-2F8C2; QQC
+2F8C7 ; [.FB80.0020.0002.3A6C][.BA6C.0000.0000.3A6C] # CJK COMPATIBILITY IDEOGRAPH-2F8C7; QQC
+2F8D1 ; [.FB80.0020.0002.3AE4][.BAE4.0000.0000.3AE4] # CJK COMPATIBILITY IDEOGRAPH-2F8D1; QQC
+2F8D0 ; [.FB80.0020.0002.3B08][.BB08.0000.0000.3B08] # CJK COMPATIBILITY IDEOGRAPH-2F8D0; QQC
+2F8CE ; [.FB80.0020.0002.3B19][.BB19.0000.0000.3B19] # CJK COMPATIBILITY IDEOGRAPH-2F8CE; QQC
+2F8DE ; [.FB80.0020.0002.3B49][.BB49.0000.0000.3B49] # CJK COMPATIBILITY IDEOGRAPH-2F8DE; QQC
+FAD2 ; [.FB80.0020.0002.3B9D][.BB9D.0000.0000.3B9D] # CJK COMPATIBILITY IDEOGRAPH-FAD2; QQC
+2F8E7 ; [.FB80.0020.0002.3B9D][.BB9D.0000.0000.3B9D] # CJK COMPATIBILITY IDEOGRAPH-2F8E7; QQC
+2F8EE ; [.FB80.0020.0002.3C18][.BC18.0000.0000.3C18] # CJK COMPATIBILITY IDEOGRAPH-2F8EE; QQC
+2F8F2 ; [.FB80.0020.0002.3C4E][.BC4E.0000.0000.3C4E] # CJK COMPATIBILITY IDEOGRAPH-2F8F2; QQC
+2F90A ; [.FB80.0020.0002.3D33][.BD33.0000.0000.3D33] # CJK COMPATIBILITY IDEOGRAPH-2F90A; QQC
+2F916 ; [.FB80.0020.0002.3D96][.BD96.0000.0000.3D96] # CJK COMPATIBILITY IDEOGRAPH-2F916; QQC
+2F92A ; [.FB80.0020.0002.3EAC][.BEAC.0000.0000.3EAC] # CJK COMPATIBILITY IDEOGRAPH-2F92A; QQC
+2F92C ; [.FB80.0020.0002.3EB8][.BEB8.0000.0000.3EB8] # CJK COMPATIBILITY IDEOGRAPH-2F92C; QQC
+2F92D ; [.FB80.0020.0002.3EB8][.BEB8.0000.0000.3EB8] # CJK COMPATIBILITY IDEOGRAPH-2F92D; QQC
+2F933 ; [.FB80.0020.0002.3F1B][.BF1B.0000.0000.3F1B] # CJK COMPATIBILITY IDEOGRAPH-2F933; QQC
+2F93E ; [.FB80.0020.0002.3FFC][.BFFC.0000.0000.3FFC] # CJK COMPATIBILITY IDEOGRAPH-2F93E; QQC
+2F93F ; [.FB80.0020.0002.4008][.C008.0000.0000.4008] # CJK COMPATIBILITY IDEOGRAPH-2F93F; QQC
+FAD3 ; [.FB80.0020.0002.4018][.C018.0000.0000.4018] # CJK COMPATIBILITY IDEOGRAPH-FAD3; QQC
+FAD4 ; [.FB80.0020.0002.4039][.C039.0000.0000.4039] # CJK COMPATIBILITY IDEOGRAPH-FAD4; QQC
+2F949 ; [.FB80.0020.0002.4039][.C039.0000.0000.4039] # CJK COMPATIBILITY IDEOGRAPH-2F949; QQC
+2F94B ; [.FB80.0020.0002.4046][.C046.0000.0000.4046] # CJK COMPATIBILITY IDEOGRAPH-2F94B; QQC
+2F94C ; [.FB80.0020.0002.4096][.C096.0000.0000.4096] # CJK COMPATIBILITY IDEOGRAPH-2F94C; QQC
+2F951 ; [.FB80.0020.0002.40E3][.C0E3.0000.0000.40E3] # CJK COMPATIBILITY IDEOGRAPH-2F951; QQC
+2F958 ; [.FB80.0020.0002.412F][.C12F.0000.0000.412F] # CJK COMPATIBILITY IDEOGRAPH-2F958; QQC
+2F960 ; [.FB80.0020.0002.4202][.C202.0000.0000.4202] # CJK COMPATIBILITY IDEOGRAPH-2F960; QQC
+2F964 ; [.FB80.0020.0002.4227][.C227.0000.0000.4227] # CJK COMPATIBILITY IDEOGRAPH-2F964; QQC
+2F967 ; [.FB80.0020.0002.42A0][.C2A0.0000.0000.42A0] # CJK COMPATIBILITY IDEOGRAPH-2F967; QQC
+2F96D ; [.FB80.0020.0002.4301][.C301.0000.0000.4301] # CJK COMPATIBILITY IDEOGRAPH-2F96D; QQC
+2F971 ; [.FB80.0020.0002.4334][.C334.0000.0000.4334] # CJK COMPATIBILITY IDEOGRAPH-2F971; QQC
+2F974 ; [.FB80.0020.0002.4359][.C359.0000.0000.4359] # CJK COMPATIBILITY IDEOGRAPH-2F974; QQC
+2F981 ; [.FB80.0020.0002.43D5][.C3D5.0000.0000.43D5] # CJK COMPATIBILITY IDEOGRAPH-2F981; QQC
+2F8D7 ; [.FB80.0020.0002.43D9][.C3D9.0000.0000.43D9] # CJK COMPATIBILITY IDEOGRAPH-2F8D7; QQC
+2F984 ; [.FB80.0020.0002.440B][.C40B.0000.0000.440B] # CJK COMPATIBILITY IDEOGRAPH-2F984; QQC
+2F98E ; [.FB80.0020.0002.446B][.C46B.0000.0000.446B] # CJK COMPATIBILITY IDEOGRAPH-2F98E; QQC
+2F9A7 ; [.FB80.0020.0002.452B][.C52B.0000.0000.452B] # CJK COMPATIBILITY IDEOGRAPH-2F9A7; QQC
+2F9AE ; [.FB80.0020.0002.455D][.C55D.0000.0000.455D] # CJK COMPATIBILITY IDEOGRAPH-2F9AE; QQC
+2F9AF ; [.FB80.0020.0002.4561][.C561.0000.0000.4561] # CJK COMPATIBILITY IDEOGRAPH-2F9AF; QQC
+2F9B2 ; [.FB80.0020.0002.456B][.C56B.0000.0000.456B] # CJK COMPATIBILITY IDEOGRAPH-2F9B2; QQC
+2F9BF ; [.FB80.0020.0002.45D7][.C5D7.0000.0000.45D7] # CJK COMPATIBILITY IDEOGRAPH-2F9BF; QQC
+2F9C2 ; [.FB80.0020.0002.45F9][.C5F9.0000.0000.45F9] # CJK COMPATIBILITY IDEOGRAPH-2F9C2; QQC
+2F9C8 ; [.FB80.0020.0002.4635][.C635.0000.0000.4635] # CJK COMPATIBILITY IDEOGRAPH-2F9C8; QQC
+2F9CD ; [.FB80.0020.0002.46BE][.C6BE.0000.0000.46BE] # CJK COMPATIBILITY IDEOGRAPH-2F9CD; QQC
+2F9CE ; [.FB80.0020.0002.46C7][.C6C7.0000.0000.46C7] # CJK COMPATIBILITY IDEOGRAPH-2F9CE; QQC
+2F9EF ; [.FB80.0020.0002.4995][.C995.0000.0000.4995] # CJK COMPATIBILITY IDEOGRAPH-2F9EF; QQC
+2F9F2 ; [.FB80.0020.0002.49E6][.C9E6.0000.0000.49E6] # CJK COMPATIBILITY IDEOGRAPH-2F9F2; QQC
+2F9F8 ; [.FB80.0020.0002.4A6E][.CA6E.0000.0000.4A6E] # CJK COMPATIBILITY IDEOGRAPH-2F9F8; QQC
+2F9F9 ; [.FB80.0020.0002.4A76][.CA76.0000.0000.4A76] # CJK COMPATIBILITY IDEOGRAPH-2F9F9; QQC
+2F9FC ; [.FB80.0020.0002.4AB2][.CAB2.0000.0000.4AB2] # CJK COMPATIBILITY IDEOGRAPH-2F9FC; QQC
+2FA03 ; [.FB80.0020.0002.4B33][.CB33.0000.0000.4B33] # CJK COMPATIBILITY IDEOGRAPH-2FA03; QQC
+2FA08 ; [.FB80.0020.0002.4BCE][.CBCE.0000.0000.4BCE] # CJK COMPATIBILITY IDEOGRAPH-2FA08; QQC
+2FA0D ; [.FB80.0020.0002.4CCE][.CCCE.0000.0000.4CCE] # CJK COMPATIBILITY IDEOGRAPH-2FA0D; QQC
+2FA0E ; [.FB80.0020.0002.4CED][.CCED.0000.0000.4CED] # CJK COMPATIBILITY IDEOGRAPH-2FA0E; QQC
+2FA11 ; [.FB80.0020.0002.4CF8][.CCF8.0000.0000.4CF8] # CJK COMPATIBILITY IDEOGRAPH-2FA11; QQC
+2FA16 ; [.FB80.0020.0002.4D56][.CD56.0000.0000.4D56] # CJK COMPATIBILITY IDEOGRAPH-2FA16; QQC
+2F803 ; [.FB84.0020.0002.20122][.8122.0000.0000.20122] # CJK COMPATIBILITY IDEOGRAPH-2F803; QQC
+2F812 ; [.FB84.0020.0002.2051C][.851C.0000.0000.2051C] # CJK COMPATIBILITY IDEOGRAPH-2F812; QQC
+2F91B ; [.FB84.0020.0002.20525][.8525.0000.0000.20525] # CJK COMPATIBILITY IDEOGRAPH-2F91B; QQC
+2F816 ; [.FB84.0020.0002.2054B][.854B.0000.0000.2054B] # CJK COMPATIBILITY IDEOGRAPH-2F816; QQC
+2F80D ; [.FB84.0020.0002.2063A][.863A.0000.0000.2063A] # CJK COMPATIBILITY IDEOGRAPH-2F80D; QQC
+2F9D9 ; [.FB84.0020.0002.20804][.8804.0000.0000.20804] # CJK COMPATIBILITY IDEOGRAPH-2F9D9; QQC
+2F9DD ; [.FB84.0020.0002.208DE][.88DE.0000.0000.208DE] # CJK COMPATIBILITY IDEOGRAPH-2F9DD; QQC
+2F834 ; [.FB84.0020.0002.20A2C][.8A2C.0000.0000.20A2C] # CJK COMPATIBILITY IDEOGRAPH-2F834; QQC
+2F838 ; [.FB84.0020.0002.20B63][.8B63.0000.0000.20B63] # CJK COMPATIBILITY IDEOGRAPH-2F838; QQC
+2F859 ; [.FB84.0020.0002.214E4][.94E4.0000.0000.214E4] # CJK COMPATIBILITY IDEOGRAPH-2F859; QQC
+2F860 ; [.FB84.0020.0002.216A8][.96A8.0000.0000.216A8] # CJK COMPATIBILITY IDEOGRAPH-2F860; QQC
+2F861 ; [.FB84.0020.0002.216EA][.96EA.0000.0000.216EA] # CJK COMPATIBILITY IDEOGRAPH-2F861; QQC
+2F86C ; [.FB84.0020.0002.219C8][.99C8.0000.0000.219C8] # CJK COMPATIBILITY IDEOGRAPH-2F86C; QQC
+2F871 ; [.FB84.0020.0002.21B18][.9B18.0000.0000.21B18] # CJK COMPATIBILITY IDEOGRAPH-2F871; QQC
+2F8F8 ; [.FB84.0020.0002.21D0B][.9D0B.0000.0000.21D0B] # CJK COMPATIBILITY IDEOGRAPH-2F8F8; QQC
+2F87B ; [.FB84.0020.0002.21DE4][.9DE4.0000.0000.21DE4] # CJK COMPATIBILITY IDEOGRAPH-2F87B; QQC
+2F87D ; [.FB84.0020.0002.21DE6][.9DE6.0000.0000.21DE6] # CJK COMPATIBILITY IDEOGRAPH-2F87D; QQC
+2F889 ; [.FB84.0020.0002.22183][.A183.0000.0000.22183] # CJK COMPATIBILITY IDEOGRAPH-2F889; QQC
+2F939 ; [.FB84.0020.0002.2219F][.A19F.0000.0000.2219F] # CJK COMPATIBILITY IDEOGRAPH-2F939; QQC
+2F891 ; [.FB84.0020.0002.22331][.A331.0000.0000.22331] # CJK COMPATIBILITY IDEOGRAPH-2F891; QQC
+2F892 ; [.FB84.0020.0002.22331][.A331.0000.0000.22331] # CJK COMPATIBILITY IDEOGRAPH-2F892; QQC
+2F8A4 ; [.FB84.0020.0002.226D4][.A6D4.0000.0000.226D4] # CJK COMPATIBILITY IDEOGRAPH-2F8A4; QQC
+FAD0 ; [.FB84.0020.0002.22844][.A844.0000.0000.22844] # CJK COMPATIBILITY IDEOGRAPH-FAD0; QQC
+FACF ; [.FB84.0020.0002.2284A][.A84A.0000.0000.2284A] # CJK COMPATIBILITY IDEOGRAPH-FACF; QQC
+2F8B8 ; [.FB84.0020.0002.22B0C][.AB0C.0000.0000.22B0C] # CJK COMPATIBILITY IDEOGRAPH-2F8B8; QQC
+2F8BE ; [.FB84.0020.0002.22BF1][.ABF1.0000.0000.22BF1] # CJK COMPATIBILITY IDEOGRAPH-2F8BE; QQC
+2F8CA ; [.FB84.0020.0002.2300A][.B00A.0000.0000.2300A] # CJK COMPATIBILITY IDEOGRAPH-2F8CA; QQC
+2F897 ; [.FB84.0020.0002.232B8][.B2B8.0000.0000.232B8] # CJK COMPATIBILITY IDEOGRAPH-2F897; QQC
+2F980 ; [.FB84.0020.0002.2335F][.B35F.0000.0000.2335F] # CJK COMPATIBILITY IDEOGRAPH-2F980; QQC
+2F989 ; [.FB84.0020.0002.23393][.B393.0000.0000.23393] # CJK COMPATIBILITY IDEOGRAPH-2F989; QQC
+2F98A ; [.FB84.0020.0002.2339C][.B39C.0000.0000.2339C] # CJK COMPATIBILITY IDEOGRAPH-2F98A; QQC
+2F8DD ; [.FB84.0020.0002.233C3][.B3C3.0000.0000.233C3] # CJK COMPATIBILITY IDEOGRAPH-2F8DD; QQC
+FAD1 ; [.FB84.0020.0002.233D5][.B3D5.0000.0000.233D5] # CJK COMPATIBILITY IDEOGRAPH-FAD1; QQC
+2F8E3 ; [.FB84.0020.0002.2346D][.B46D.0000.0000.2346D] # CJK COMPATIBILITY IDEOGRAPH-2F8E3; QQC
+2F8EC ; [.FB84.0020.0002.236A3][.B6A3.0000.0000.236A3] # CJK COMPATIBILITY IDEOGRAPH-2F8EC; QQC
+2F8F0 ; [.FB84.0020.0002.238A7][.B8A7.0000.0000.238A7] # CJK COMPATIBILITY IDEOGRAPH-2F8F0; QQC
+2F8F7 ; [.FB84.0020.0002.23A8D][.BA8D.0000.0000.23A8D] # CJK COMPATIBILITY IDEOGRAPH-2F8F7; QQC
+2F8F9 ; [.FB84.0020.0002.23AFA][.BAFA.0000.0000.23AFA] # CJK COMPATIBILITY IDEOGRAPH-2F8F9; QQC
+2F8FB ; [.FB84.0020.0002.23CBC][.BCBC.0000.0000.23CBC] # CJK COMPATIBILITY IDEOGRAPH-2F8FB; QQC
+2F906 ; [.FB84.0020.0002.23D1E][.BD1E.0000.0000.23D1E] # CJK COMPATIBILITY IDEOGRAPH-2F906; QQC
+2F90D ; [.FB84.0020.0002.23ED1][.BED1.0000.0000.23ED1] # CJK COMPATIBILITY IDEOGRAPH-2F90D; QQC
+2F910 ; [.FB84.0020.0002.23F5E][.BF5E.0000.0000.23F5E] # CJK COMPATIBILITY IDEOGRAPH-2F910; QQC
+2F911 ; [.FB84.0020.0002.23F8E][.BF8E.0000.0000.23F8E] # CJK COMPATIBILITY IDEOGRAPH-2F911; QQC
+2F91D ; [.FB84.0020.0002.24263][.C263.0000.0000.24263] # CJK COMPATIBILITY IDEOGRAPH-2F91D; QQC
+2F91F ; [.FB84.0020.0002.243AB][.C3AB.0000.0000.243AB] # CJK COMPATIBILITY IDEOGRAPH-2F91F; QQC
+2F923 ; [.FB84.0020.0002.24608][.C608.0000.0000.24608] # CJK COMPATIBILITY IDEOGRAPH-2F923; QQC
+2F926 ; [.FB84.0020.0002.24735][.C735.0000.0000.24735] # CJK COMPATIBILITY IDEOGRAPH-2F926; QQC
+2F927 ; [.FB84.0020.0002.24814][.C814.0000.0000.24814] # CJK COMPATIBILITY IDEOGRAPH-2F927; QQC
+2F935 ; [.FB84.0020.0002.24C36][.CC36.0000.0000.24C36] # CJK COMPATIBILITY IDEOGRAPH-2F935; QQC
+2F937 ; [.FB84.0020.0002.24C92][.CC92.0000.0000.24C92] # CJK COMPATIBILITY IDEOGRAPH-2F937; QQC
+2F93B ; [.FB84.0020.0002.24FA1][.CFA1.0000.0000.24FA1] # CJK COMPATIBILITY IDEOGRAPH-2F93B; QQC
+2F93C ; [.FB84.0020.0002.24FB8][.CFB8.0000.0000.24FB8] # CJK COMPATIBILITY IDEOGRAPH-2F93C; QQC
+2F93D ; [.FB84.0020.0002.25044][.D044.0000.0000.25044] # CJK COMPATIBILITY IDEOGRAPH-2F93D; QQC
+2F942 ; [.FB84.0020.0002.250F2][.D0F2.0000.0000.250F2] # CJK COMPATIBILITY IDEOGRAPH-2F942; QQC
+2F941 ; [.FB84.0020.0002.250F3][.D0F3.0000.0000.250F3] # CJK COMPATIBILITY IDEOGRAPH-2F941; QQC
+2F943 ; [.FB84.0020.0002.25119][.D119.0000.0000.25119] # CJK COMPATIBILITY IDEOGRAPH-2F943; QQC
+2F944 ; [.FB84.0020.0002.25133][.D133.0000.0000.25133] # CJK COMPATIBILITY IDEOGRAPH-2F944; QQC
+FAD5 ; [.FB84.0020.0002.25249][.D249.0000.0000.25249] # CJK COMPATIBILITY IDEOGRAPH-FAD5; QQC
+2F94D ; [.FB84.0020.0002.2541D][.D41D.0000.0000.2541D] # CJK COMPATIBILITY IDEOGRAPH-2F94D; QQC
+2F952 ; [.FB84.0020.0002.25626][.D626.0000.0000.25626] # CJK COMPATIBILITY IDEOGRAPH-2F952; QQC
+2F954 ; [.FB84.0020.0002.2569A][.D69A.0000.0000.2569A] # CJK COMPATIBILITY IDEOGRAPH-2F954; QQC
+2F955 ; [.FB84.0020.0002.256C5][.D6C5.0000.0000.256C5] # CJK COMPATIBILITY IDEOGRAPH-2F955; QQC
+2F95C ; [.FB84.0020.0002.2597C][.D97C.0000.0000.2597C] # CJK COMPATIBILITY IDEOGRAPH-2F95C; QQC
+2F95D ; [.FB84.0020.0002.25AA7][.DAA7.0000.0000.25AA7] # CJK COMPATIBILITY IDEOGRAPH-2F95D; QQC
+2F95E ; [.FB84.0020.0002.25AA7][.DAA7.0000.0000.25AA7] # CJK COMPATIBILITY IDEOGRAPH-2F95E; QQC
+2F961 ; [.FB84.0020.0002.25BAB][.DBAB.0000.0000.25BAB] # CJK COMPATIBILITY IDEOGRAPH-2F961; QQC
+2F965 ; [.FB84.0020.0002.25C80][.DC80.0000.0000.25C80] # CJK COMPATIBILITY IDEOGRAPH-2F965; QQC
+FAD6 ; [.FB84.0020.0002.25CD0][.DCD0.0000.0000.25CD0] # CJK COMPATIBILITY IDEOGRAPH-FAD6; QQC
+2F96B ; [.FB84.0020.0002.25F86][.DF86.0000.0000.25F86] # CJK COMPATIBILITY IDEOGRAPH-2F96B; QQC
+2F898 ; [.FB84.0020.0002.261DA][.E1DA.0000.0000.261DA] # CJK COMPATIBILITY IDEOGRAPH-2F898; QQC
+2F972 ; [.FB84.0020.0002.26228][.E228.0000.0000.26228] # CJK COMPATIBILITY IDEOGRAPH-2F972; QQC
+2F973 ; [.FB84.0020.0002.26247][.E247.0000.0000.26247] # CJK COMPATIBILITY IDEOGRAPH-2F973; QQC
+2F975 ; [.FB84.0020.0002.262D9][.E2D9.0000.0000.262D9] # CJK COMPATIBILITY IDEOGRAPH-2F975; QQC
+2F977 ; [.FB84.0020.0002.2633E][.E33E.0000.0000.2633E] # CJK COMPATIBILITY IDEOGRAPH-2F977; QQC
+2F97B ; [.FB84.0020.0002.264DA][.E4DA.0000.0000.264DA] # CJK COMPATIBILITY IDEOGRAPH-2F97B; QQC
+2F97C ; [.FB84.0020.0002.26523][.E523.0000.0000.26523] # CJK COMPATIBILITY IDEOGRAPH-2F97C; QQC
+2F97E ; [.FB84.0020.0002.265A8][.E5A8.0000.0000.265A8] # CJK COMPATIBILITY IDEOGRAPH-2F97E; QQC
+2F987 ; [.FB84.0020.0002.267A7][.E7A7.0000.0000.267A7] # CJK COMPATIBILITY IDEOGRAPH-2F987; QQC
+2F988 ; [.FB84.0020.0002.267B5][.E7B5.0000.0000.267B5] # CJK COMPATIBILITY IDEOGRAPH-2F988; QQC
+2F997 ; [.FB84.0020.0002.26B3C][.EB3C.0000.0000.26B3C] # CJK COMPATIBILITY IDEOGRAPH-2F997; QQC
+2F9A4 ; [.FB84.0020.0002.26C36][.EC36.0000.0000.26C36] # CJK COMPATIBILITY IDEOGRAPH-2F9A4; QQC
+2F9A6 ; [.FB84.0020.0002.26CD5][.ECD5.0000.0000.26CD5] # CJK COMPATIBILITY IDEOGRAPH-2F9A6; QQC
+2F9A5 ; [.FB84.0020.0002.26D6B][.ED6B.0000.0000.26D6B] # CJK COMPATIBILITY IDEOGRAPH-2F9A5; QQC
+2F9AD ; [.FB84.0020.0002.26F2C][.EF2C.0000.0000.26F2C] # CJK COMPATIBILITY IDEOGRAPH-2F9AD; QQC
+2F9B0 ; [.FB84.0020.0002.26FB1][.EFB1.0000.0000.26FB1] # CJK COMPATIBILITY IDEOGRAPH-2F9B0; QQC
+2F9B1 ; [.FB84.0020.0002.270D2][.F0D2.0000.0000.270D2] # CJK COMPATIBILITY IDEOGRAPH-2F9B1; QQC
+2F9AB ; [.FB84.0020.0002.273CA][.F3CA.0000.0000.273CA] # CJK COMPATIBILITY IDEOGRAPH-2F9AB; QQC
+2F9C5 ; [.FB84.0020.0002.27667][.F667.0000.0000.27667] # CJK COMPATIBILITY IDEOGRAPH-2F9C5; QQC
+2F9CB ; [.FB84.0020.0002.278AE][.F8AE.0000.0000.278AE] # CJK COMPATIBILITY IDEOGRAPH-2F9CB; QQC
+2F9CC ; [.FB84.0020.0002.27966][.F966.0000.0000.27966] # CJK COMPATIBILITY IDEOGRAPH-2F9CC; QQC
+2F9D3 ; [.FB84.0020.0002.27CA8][.FCA8.0000.0000.27CA8] # CJK COMPATIBILITY IDEOGRAPH-2F9D3; QQC
+FAD7 ; [.FB84.0020.0002.27ED3][.FED3.0000.0000.27ED3] # CJK COMPATIBILITY IDEOGRAPH-FAD7; QQC
+2F9D8 ; [.FB84.0020.0002.27F2F][.FF2F.0000.0000.27F2F] # CJK COMPATIBILITY IDEOGRAPH-2F9D8; QQC
+2F9E0 ; [.FB85.0020.0002.285D2][.85D2.0000.0000.285D2] # CJK COMPATIBILITY IDEOGRAPH-2F9E0; QQC
+2F9E1 ; [.FB85.0020.0002.285ED][.85ED.0000.0000.285ED] # CJK COMPATIBILITY IDEOGRAPH-2F9E1; QQC
+2F9E5 ; [.FB85.0020.0002.2872E][.872E.0000.0000.2872E] # CJK COMPATIBILITY IDEOGRAPH-2F9E5; QQC
+2F9ED ; [.FB85.0020.0002.28BFA][.8BFA.0000.0000.28BFA] # CJK COMPATIBILITY IDEOGRAPH-2F9ED; QQC
+2F9F1 ; [.FB85.0020.0002.28D77][.8D77.0000.0000.28D77] # CJK COMPATIBILITY IDEOGRAPH-2F9F1; QQC
+2F9F6 ; [.FB85.0020.0002.29145][.9145.0000.0000.29145] # CJK COMPATIBILITY IDEOGRAPH-2F9F6; QQC
+2F81C ; [.FB85.0020.0002.291DF][.91DF.0000.0000.291DF] # CJK COMPATIBILITY IDEOGRAPH-2F81C; QQC
+2F9F7 ; [.FB85.0020.0002.2921A][.921A.0000.0000.2921A] # CJK COMPATIBILITY IDEOGRAPH-2F9F7; QQC
+2F9FB ; [.FB85.0020.0002.2940A][.940A.0000.0000.2940A] # CJK COMPATIBILITY IDEOGRAPH-2F9FB; QQC
+2F9FD ; [.FB85.0020.0002.29496][.9496.0000.0000.29496] # CJK COMPATIBILITY IDEOGRAPH-2F9FD; QQC
+2FA01 ; [.FB85.0020.0002.295B6][.95B6.0000.0000.295B6] # CJK COMPATIBILITY IDEOGRAPH-2FA01; QQC
+2FA09 ; [.FB85.0020.0002.29B30][.9B30.0000.0000.29B30] # CJK COMPATIBILITY IDEOGRAPH-2FA09; QQC
+2FA10 ; [.FB85.0020.0002.2A0CE][.A0CE.0000.0000.2A0CE] # CJK COMPATIBILITY IDEOGRAPH-2FA10; QQC
+2FA12 ; [.FB85.0020.0002.2A105][.A105.0000.0000.2A105] # CJK COMPATIBILITY IDEOGRAPH-2FA12; QQC
+2FA13 ; [.FB85.0020.0002.2A20E][.A20E.0000.0000.2A20E] # CJK COMPATIBILITY IDEOGRAPH-2FA13; QQC
+2FA14 ; [.FB85.0020.0002.2A291][.A291.0000.0000.2A291] # CJK COMPATIBILITY IDEOGRAPH-2FA14; QQC
+2F88F ; [.FB85.0020.0002.2A392][.A392.0000.0000.2A392] # CJK COMPATIBILITY IDEOGRAPH-2F88F; QQC
+2FA1D ; [.FB85.0020.0002.2A600][.A600.0000.0000.2A600] # CJK COMPATIBILITY IDEOGRAPH-2FA1D; QQC
diff --git a/Master/tlpkg/tlperl.straw/lib/Unicode/Collate/keys.txt b/Master/tlpkg/tlperl.straw/lib/Unicode/Collate/keys.txt
new file mode 100755
index 00000000000..aaa2d2a5a77
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Unicode/Collate/keys.txt
@@ -0,0 +1,864 @@
+#### This file is generated from allkeys-3.1.1.txt (unicode.org)
+#### by deleting many many entries.
+####
+#### This table is intended ONLY for doing a test
+#### of Unicode/Collate.pm, a Perl module.
+####
+#### The entries contained here ARE:
+#### 0000..007F # Basic Latin
+#### 0080..00FF # Latin-1 Supplement
+#### 0300..036F # Combining Diacritical Marks
+#### 1100..11FF # Hangul Jamo
+#### 2000..206F # General Punctuation
+#### 3040..309F # Hiragana
+#### 30A0..30FF # Katakana
+####
+#### To fetch the original file, access to this:
+#### http://www.unicode.org/reports/tr10/allkeys.txt
+####
+@version 3.1.1
+0000 ; [.0000.0000.0000.0000] # [0000] NULL (in 6429)
+0001 ; [.0000.0000.0000.0000] # [0001] START OF HEADING (in 6429)
+0002 ; [.0000.0000.0000.0000] # [0002] START OF TEXT (in 6429)
+0003 ; [.0000.0000.0000.0000] # [0003] END OF TEXT (in 6429)
+0004 ; [.0000.0000.0000.0000] # [0004] END OF TRANSMISSION (in 6429)
+0005 ; [.0000.0000.0000.0000] # [0005] ENQUIRY (in 6429)
+0006 ; [.0000.0000.0000.0000] # [0006] ACKNOWLEDGE (in 6429)
+0007 ; [.0000.0000.0000.0000] # [0007] BELL (in 6429)
+0008 ; [.0000.0000.0000.0000] # [0008] BACKSPACE (in 6429)
+000E ; [.0000.0000.0000.0000] # [000E] SHIFT OUT (in 6429)
+000F ; [.0000.0000.0000.0000] # [000F] SHIFT IN (in 6429)
+0010 ; [.0000.0000.0000.0000] # [0010] DATA LINK ESCAPE (in 6429)
+0011 ; [.0000.0000.0000.0000] # [0011] DEVICE CONTROL ONE (in 6429)
+0012 ; [.0000.0000.0000.0000] # [0012] DEVICE CONTROL TWO (in 6429)
+0013 ; [.0000.0000.0000.0000] # [0013] DEVICE CONTROL THREE (in 6429)
+0014 ; [.0000.0000.0000.0000] # [0014] DEVICE CONTROL FOUR (in 6429)
+0015 ; [.0000.0000.0000.0000] # [0015] NEGATIVE ACKNOWLEDGE (in 6429)
+0016 ; [.0000.0000.0000.0000] # [0016] SYNCHRONOUS IDLE (in 6429)
+0017 ; [.0000.0000.0000.0000] # [0017] END OF TRANSMISSION BLOCK (in 6429)
+0018 ; [.0000.0000.0000.0000] # [0018] CANCEL (in 6429)
+0019 ; [.0000.0000.0000.0000] # [0019] END OF MEDIUM (in 6429)
+001A ; [.0000.0000.0000.0000] # [001A] SUBSTITUTE (in 6429)
+001B ; [.0000.0000.0000.0000] # [001B] ESCAPE (in 6429)
+001C ; [.0000.0000.0000.0000] # [001C] FILE SEPARATOR (in 6429)
+001D ; [.0000.0000.0000.0000] # [001D] GROUP SEPARATOR (in 6429)
+001E ; [.0000.0000.0000.0000] # [001E] RECORD SEPARATOR (in 6429)
+001F ; [.0000.0000.0000.0000] # [001F] UNIT SEPARATOR (in 6429)
+007F ; [.0000.0000.0000.0000] # [007F] DELETE (in 6429)
+0080 ; [.0000.0000.0000.0000] # [0080] <control>
+0081 ; [.0000.0000.0000.0000] # [0081] <control>
+0082 ; [.0000.0000.0000.0000] # [0082] BREAK PERMITTED HERE (in 6429)
+0083 ; [.0000.0000.0000.0000] # [0083] NO BREAK HERE (in 6429)
+0084 ; [.0000.0000.0000.0000] # [0084] <control>
+0086 ; [.0000.0000.0000.0000] # [0086] START OF SELECTED AREA (in 6429)
+0087 ; [.0000.0000.0000.0000] # [0087] END OF SELECTED AREA (in 6429)
+0088 ; [.0000.0000.0000.0000] # [0088] CHARACTER TABULATION SET (in 6429)
+0089 ; [.0000.0000.0000.0000] # [0089] CHARACTER TABULATION WITH JUSTIFICATION (in 6429)
+008A ; [.0000.0000.0000.0000] # [008A] LINE TABULATION SET (in 6429)
+008B ; [.0000.0000.0000.0000] # [008B] PARTIAL LINE FORWARD (in 6429)
+008C ; [.0000.0000.0000.0000] # [008C] PARTIAL LINE BACKWARD (in 6429)
+008D ; [.0000.0000.0000.0000] # [008D] PARTIAL LINE FEED (in 6429)
+008E ; [.0000.0000.0000.0000] # [008E] SINGLE SHIFT TWO (in 6429)
+008F ; [.0000.0000.0000.0000] # [008F] SINGLE SHIFT THREE (in 6429)
+0090 ; [.0000.0000.0000.0000] # [0090] DEVICE CONTROL STRING (in 6429)
+0091 ; [.0000.0000.0000.0000] # [0091] PRIVATE USE ONE (in 6429)
+0092 ; [.0000.0000.0000.0000] # [0092] PRIVATE USE TWO (in 6429)
+0093 ; [.0000.0000.0000.0000] # [0093] SET TRANSMIT STATE (in 6429)
+0094 ; [.0000.0000.0000.0000] # [0094] CANCEL CHARACTER (in 6429)
+0095 ; [.0000.0000.0000.0000] # [0095] MESSAGE WAITING (in 6429)
+0096 ; [.0000.0000.0000.0000] # [0096] START OF GUARDED AREA (in 6429)
+0097 ; [.0000.0000.0000.0000] # [0097] END OF GUARDED AREA (in 6429)
+0098 ; [.0000.0000.0000.0000] # [0098] START OF STRING (in 6429)
+0099 ; [.0000.0000.0000.0000] # [0099] <control>
+009A ; [.0000.0000.0000.0000] # [009A] SINGLE CHARACTER INTRODUCER (in 6429)
+009B ; [.0000.0000.0000.0000] # [009B] CONTROL SEQUENCE INTRODUCER (in 6429)
+009C ; [.0000.0000.0000.0000] # [009C] STRING TERMINATOR (in 6429)
+009D ; [.0000.0000.0000.0000] # [009D] OPERATING SYSTEM COMMAND (in 6429)
+009E ; [.0000.0000.0000.0000] # [009E] PRIVACY MESSAGE (in 6429)
+009F ; [.0000.0000.0000.0000] # [009F] APPLICATION PROGRAM COMMAND (in 6429)
+200B ; [.0000.0000.0000.0000] # [200B] ZERO WIDTH SPACE
+200C ; [.0000.0000.0000.0000] # [200C] ZERO WIDTH NON-JOINER
+200D ; [.0000.0000.0000.0000] # [200D] ZERO WIDTH JOINER
+200E ; [.0000.0000.0000.0000] # [200E] LEFT-TO-RIGHT MARK
+200F ; [.0000.0000.0000.0000] # [200F] RIGHT-TO-LEFT MARK
+202A ; [.0000.0000.0000.0000] # [202A] LEFT-TO-RIGHT EMBEDDING
+202B ; [.0000.0000.0000.0000] # [202B] RIGHT-TO-LEFT EMBEDDING
+202C ; [.0000.0000.0000.0000] # [202C] POP DIRECTIONAL FORMATTING
+202D ; [.0000.0000.0000.0000] # [202D] LEFT-TO-RIGHT OVERRIDE
+202E ; [.0000.0000.0000.0000] # [202E] RIGHT-TO-LEFT OVERRIDE
+206A ; [.0000.0000.0000.0000] # [206A] INHIBIT SYMMETRIC SWAPPING
+206B ; [.0000.0000.0000.0000] # [206B] ACTIVATE SYMMETRIC SWAPPING
+206C ; [.0000.0000.0000.0000] # [206C] INHIBIT ARABIC FORM SHAPING
+206D ; [.0000.0000.0000.0000] # [206D] ACTIVATE ARABIC FORM SHAPING
+206E ; [.0000.0000.0000.0000] # [206E] NATIONAL DIGIT SHAPES
+206F ; [.0000.0000.0000.0000] # [206F] NOMINAL DIGIT SHAPES
+0009 ; [*0201.0020.0002.0009] # HORIZONTAL TABULATION (in 6429)
+000A ; [*0202.0020.0002.000A] # LINE FEED (in 6429)
+000B ; [*0203.0020.0002.000B] # VERTICAL TABULATION (in 6429)
+000C ; [*0204.0020.0002.000C] # FORM FEED (in 6429)
+000D ; [*0205.0020.0002.000D] # CARRIAGE RETURN (in 6429)
+0020 ; [*0209.0020.0002.0020] # SPACE
+0021 ; [*024B.0020.0002.0021] # EXCLAMATION MARK
+0022 ; [*0270.0020.0002.0022] # QUOTATION MARK
+0023 ; [*02A9.0020.0002.0023] # NUMBER SIGN
+0025 ; [*02AA.0020.0002.0025] # PERCENT SIGN
+0026 ; [*02A7.0020.0002.0026] # AMPERSAND
+0027 ; [*0269.0020.0002.0027] # APOSTROPHE
+0028 ; [*027A.0020.0002.0028] # LEFT PARENTHESIS
+0029 ; [*027B.0020.0002.0029] # RIGHT PARENTHESIS
+002A ; [*02A2.0020.0002.002A] # ASTERISK
+002B ; [*039F.0020.0002.002B] # PLUS SIGN
+002C ; [*022D.0020.0002.002C] # COMMA
+002D ; [*0221.0020.0002.002D] # HYPHEN-MINUS
+002E ; [*0255.0020.0002.002E] # FULL STOP
+002F ; [*02A4.0020.0002.002F] # SOLIDUS
+003A ; [*0237.0020.0002.003A] # COLON
+003B ; [*0235.0020.0002.003B] # SEMICOLON
+003C ; [*03A3.0020.0002.003C] # LESS-THAN SIGN
+003D ; [*03A4.0020.0002.003D] # EQUALS SIGN
+003E ; [*03A5.0020.0002.003E] # GREATER-THAN SIGN
+003F ; [*024E.0020.0002.003F] # QUESTION MARK
+0040 ; [*02A1.0020.0002.0040] # COMMERCIAL AT
+005B ; [*027C.0020.0002.005B] # LEFT SQUARE BRACKET
+005C ; [*02A6.0020.0002.005C] # REVERSE SOLIDUS
+005D ; [*027D.0020.0002.005D] # RIGHT SQUARE BRACKET
+005E ; [*020F.0020.0002.005E] # CIRCUMFLEX ACCENT
+005F ; [*021B.0020.0002.005F] # LOW LINE
+0060 ; [*020C.0020.0002.0060] # GRAVE ACCENT
+007B ; [*027E.0020.0002.007B] # LEFT CURLY BRACKET
+007C ; [*03A7.0020.0002.007C] # VERTICAL LINE
+007D ; [*027F.0020.0002.007D] # RIGHT CURLY BRACKET
+007E ; [*03AA.0020.0002.007E] # TILDE
+0085 ; [*0206.0020.0002.0085] # NEXT LINE (in 6429)
+00A0 ; [*0209.0020.001B.00A0] # NO-BREAK SPACE; QQK
+00A1 ; [*024C.0020.0002.00A1] # INVERTED EXCLAMATION MARK
+00A6 ; [*03A8.0020.0002.00A6] # BROKEN BAR
+00A7 ; [*029C.0020.0002.00A7] # SECTION SIGN
+00A8 ; [*0214.0020.0002.00A8] # DIAERESIS
+00A9 ; [*029F.0020.0002.00A9] # COPYRIGHT SIGN
+00AB ; [*0278.0020.0002.00AB] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC ; [*03A6.0020.0002.00AC] # NOT SIGN
+00AD ; [*0220.0020.0002.00AD] # SOFT HYPHEN
+00AE ; [*02A0.0020.0002.00AE] # REGISTERED SIGN
+00AF ; [*0210.0020.0002.00AF] # MACRON
+00B0 ; [*030A.0020.0002.00B0] # DEGREE SIGN
+00B1 ; [*03A0.0020.0002.00B1] # PLUS-MINUS SIGN
+00B4 ; [*020D.0020.0002.00B4] # ACUTE ACCENT
+00B6 ; [*029D.0020.0002.00B6] # PILCROW SIGN
+00B7 ; [*025F.0020.0002.00B7] # MIDDLE DOT
+00B8 ; [*0219.0020.0002.00B8] # CEDILLA
+00BB ; [*0279.0020.0002.00BB] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BF ; [*024F.0020.0002.00BF] # INVERTED QUESTION MARK
+00D7 ; [*03A2.0020.0002.00D7] # MULTIPLICATION SIGN
+00F7 ; [*03A1.0020.0002.00F7] # DIVISION SIGN
+2000 ; [*0209.0020.0004.2000] # EN QUAD; QQK
+2001 ; [*0209.0020.0004.2001] # EM QUAD; QQK
+2002 ; [*0209.0020.0004.2002] # EN SPACE; QQK
+2003 ; [*0209.0020.0004.2003] # EM SPACE; QQK
+2004 ; [*0209.0020.0004.2004] # THREE-PER-EM SPACE; QQK
+2005 ; [*0209.0020.0004.2005] # FOUR-PER-EM SPACE; QQK
+2006 ; [*0209.0020.0004.2006] # SIX-PER-EM SPACE; QQK
+2007 ; [*0209.0020.001B.2007] # FIGURE SPACE; QQK
+2008 ; [*0209.0020.0004.2008] # PUNCTUATION SPACE; QQK
+2009 ; [*0209.0020.0004.2009] # THIN SPACE; QQK
+200A ; [*0209.0020.0004.200A] # HAIR SPACE; QQK
+2010 ; [*0225.0020.0002.2010] # HYPHEN
+2011 ; [*0225.0020.001B.2011] # NON-BREAKING HYPHEN; QQK
+2012 ; [*0226.0020.0002.2012] # FIGURE DASH
+2013 ; [*0227.0020.0002.2013] # EN DASH
+2014 ; [*0228.0020.0002.2014] # EM DASH
+2015 ; [*0229.0020.0002.2015] # HORIZONTAL BAR
+2016 ; [*03A9.0020.0002.2016] # DOUBLE VERTICAL LINE
+2017 ; [*021C.0020.0002.2017] # DOUBLE LOW LINE
+2018 ; [*026A.0020.0002.2018] # LEFT SINGLE QUOTATION MARK
+2019 ; [*026B.0020.0002.2019] # RIGHT SINGLE QUOTATION MARK
+201A ; [*026C.0020.0002.201A] # SINGLE LOW-9 QUOTATION MARK
+201B ; [*026D.0020.0002.201B] # SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C ; [*0271.0020.0002.201C] # LEFT DOUBLE QUOTATION MARK
+201D ; [*0272.0020.0002.201D] # RIGHT DOUBLE QUOTATION MARK
+201E ; [*0273.0020.0002.201E] # DOUBLE LOW-9 QUOTATION MARK
+201F ; [*0274.0020.0002.201F] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020 ; [*02AE.0020.0002.2020] # DAGGER
+2021 ; [*02AF.0020.0002.2021] # DOUBLE DAGGER
+2022 ; [*02B0.0020.0002.2022] # BULLET
+2023 ; [*02B1.0020.0002.2023] # TRIANGULAR BULLET
+2024 ; [*0255.0020.0004.2024] # ONE DOT LEADER; QQK
+2025 ; [*0255.0020.0004.2025][*0255.0020.0004.2025] # TWO DOT LEADER; QQKN
+2026 ; [*0255.0020.0004.2026][*0255.0020.0004.2026][*0255.0020.001F.2026] # HORIZONTAL ELLIPSIS; QQKN
+2027 ; [*02B2.0020.0002.2027] # HYPHENATION POINT
+2028 ; [*0207.0020.0002.2028] # LINE SEPARATOR
+2029 ; [*0208.0020.0002.2029] # PARAGRAPH SEPARATOR
+202F ; [*0209.0020.001B.202F] # NARROW NO-BREAK SPACE; QQK
+2030 ; [*02AC.0020.0002.2030] # PER MILLE SIGN
+2031 ; [*02AD.0020.0002.2031] # PER TEN THOUSAND SIGN
+2032 ; [*02B6.0020.0002.2032] # PRIME
+2033 ; [*02B6.0020.0004.2033][*02B6.0020.0004.2033] # DOUBLE PRIME; QQKN
+2034 ; [*02B6.0020.0004.2034][*02B6.0020.0004.2034][*02B6.0020.001F.2034] # TRIPLE PRIME; QQKN
+2035 ; [*02B7.0020.0002.2035] # REVERSED PRIME
+2036 ; [*02B7.0020.0004.2036][*02B7.0020.0004.2036] # REVERSED DOUBLE PRIME; QQKN
+2037 ; [*02B7.0020.0004.2037][*02B7.0020.0004.2037][*02B7.0020.001F.2037] # REVERSED TRIPLE PRIME; QQKN
+2038 ; [*02B9.0020.0002.2038] # CARET
+2039 ; [*026E.0020.0002.2039] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; [*026F.0020.0002.203A] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B ; [*02BA.0020.0002.203B] # REFERENCE MARK
+203C ; [*024B.0020.0004.203C][*024B.0020.0004.203C] # DOUBLE EXCLAMATION MARK; QQKN
+203D ; [*0254.0020.0002.203D] # INTERROBANG
+203E ; [*0211.0020.0002.203E] # OVERLINE
+203F ; [*02BB.0020.0002.203F] # UNDERTIE
+2040 ; [*02BC.0020.0002.2040] # CHARACTER TIE
+2041 ; [*02BD.0020.0002.2041] # CARET INSERTION POINT
+2042 ; [*02BE.0020.0002.2042] # ASTERISM
+2043 ; [*02B3.0020.0002.2043] # HYPHEN BULLET
+2044 ; [*02A5.0020.0002.2044] # FRACTION SLASH
+2045 ; [*0286.0020.0002.2045] # LEFT SQUARE BRACKET WITH QUILL
+2046 ; [*0287.0020.0002.2046] # RIGHT SQUARE BRACKET WITH QUILL
+2048 ; [*024E.0020.0004.2048][*024B.0020.0004.2048] # QUESTION EXCLAMATION MARK; QQKN
+2049 ; [*024B.0020.0004.2049][*024E.0020.0004.2049] # EXCLAMATION QUESTION MARK; QQKN
+204A ; [*02A8.0020.0002.204A] # TIRONIAN SIGN ET
+204B ; [*029E.0020.0002.204B] # REVERSED PILCROW SIGN
+204C ; [*02B4.0020.0002.204C] # BLACK LEFTWARDS BULLET
+204D ; [*02B5.0020.0002.204D] # BLACK RIGHTWARDS BULLET
+309B ; [*021E.0020.0002.309B] # KATAKANA-HIRAGANA VOICED SOUND MARK
+309C ; [*021F.0020.0002.309C] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30FB ; [*022C.0020.0002.30FB] # KATAKANA MIDDLE DOT
+0332 ; [.0000.0021.0002.0332] # COMBINING LOW LINE
+0313 ; [.0000.0022.0002.0313] # COMBINING COMMA ABOVE
+0343 ; [.0000.0022.0002.0343] # COMBINING GREEK KORONIS; QQC
+0314 ; [.0000.002A.0002.0314] # COMBINING REVERSED COMMA ABOVE
+0301 ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
+0341 ; [.0000.0032.0002.0341] # COMBINING ACUTE TONE MARK; QQC
+0300 ; [.0000.0035.0002.0300] # COMBINING GRAVE ACCENT
+0340 ; [.0000.0035.0002.0340] # COMBINING GRAVE TONE MARK; QQC
+0306 ; [.0000.0037.0002.0306] # COMBINING BREVE
+0302 ; [.0000.003C.0002.0302] # COMBINING CIRCUMFLEX ACCENT
+030C ; [.0000.0041.0002.030C] # COMBINING CARON
+030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
+0342 ; [.0000.0045.0002.0342] # COMBINING GREEK PERISPOMENI
+0308 ; [.0000.0047.0002.0308] # COMBINING DIAERESIS
+0344 ; [.0000.0047.0002.0308][.0000.0032.0002.0301] # COMBINING GREEK DIALYTIKA TONOS; QQCM
+030B ; [.0000.004D.0002.030B] # COMBINING DOUBLE ACUTE ACCENT
+0303 ; [.0000.004E.0002.0303] # COMBINING TILDE
+0307 ; [.0000.0052.0002.0307] # COMBINING DOT ABOVE
+0338 ; [.0000.0054.0002.0338] # COMBINING LONG SOLIDUS OVERLAY
+0327 ; [.0000.0055.0002.0327] # COMBINING CEDILLA
+0328 ; [.0000.0058.0002.0328] # COMBINING OGONEK
+0304 ; [.0000.005A.0002.0304] # COMBINING MACRON
+0305 ; [.0000.005E.0002.0305] # COMBINING OVERLINE
+0309 ; [.0000.005F.0002.0309] # COMBINING HOOK ABOVE
+030D ; [.0000.0060.0002.030D] # COMBINING VERTICAL LINE ABOVE
+030E ; [.0000.0061.0002.030E] # COMBINING DOUBLE VERTICAL LINE ABOVE
+030F ; [.0000.0062.0002.030F] # COMBINING DOUBLE GRAVE ACCENT
+0310 ; [.0000.0063.0002.0310] # COMBINING CANDRABINDU
+0311 ; [.0000.0064.0002.0311] # COMBINING INVERTED BREVE
+0312 ; [.0000.0065.0002.0312] # COMBINING TURNED COMMA ABOVE
+0315 ; [.0000.0066.0002.0315] # COMBINING COMMA ABOVE RIGHT
+0316 ; [.0000.0067.0002.0316] # COMBINING GRAVE ACCENT BELOW
+0317 ; [.0000.0068.0002.0317] # COMBINING ACUTE ACCENT BELOW
+0318 ; [.0000.0069.0002.0318] # COMBINING LEFT TACK BELOW
+0319 ; [.0000.006A.0002.0319] # COMBINING RIGHT TACK BELOW
+031A ; [.0000.006B.0002.031A] # COMBINING LEFT ANGLE ABOVE
+031B ; [.0000.006C.0002.031B] # COMBINING HORN
+031C ; [.0000.0072.0002.031C] # COMBINING LEFT HALF RING BELOW
+031D ; [.0000.0073.0002.031D] # COMBINING UP TACK BELOW
+031E ; [.0000.0074.0002.031E] # COMBINING DOWN TACK BELOW
+031F ; [.0000.0075.0002.031F] # COMBINING PLUS SIGN BELOW
+0320 ; [.0000.0076.0002.0320] # COMBINING MINUS SIGN BELOW
+0321 ; [.0000.0077.0002.0321] # COMBINING PALATALIZED HOOK BELOW
+0322 ; [.0000.0078.0002.0322] # COMBINING RETROFLEX HOOK BELOW
+0323 ; [.0000.0079.0002.0323] # COMBINING DOT BELOW
+0324 ; [.0000.007E.0002.0324] # COMBINING DIAERESIS BELOW
+0325 ; [.0000.007F.0002.0325] # COMBINING RING BELOW
+0326 ; [.0000.0080.0002.0326] # COMBINING COMMA BELOW
+0329 ; [.0000.0081.0002.0329] # COMBINING VERTICAL LINE BELOW
+032A ; [.0000.0082.0002.032A] # COMBINING BRIDGE BELOW
+032B ; [.0000.0083.0002.032B] # COMBINING INVERTED DOUBLE ARCH BELOW
+032C ; [.0000.0084.0002.032C] # COMBINING CARON BELOW
+032D ; [.0000.0085.0002.032D] # COMBINING CIRCUMFLEX ACCENT BELOW
+032E ; [.0000.0086.0002.032E] # COMBINING BREVE BELOW
+032F ; [.0000.0087.0002.032F] # COMBINING INVERTED BREVE BELOW
+0330 ; [.0000.0088.0002.0330] # COMBINING TILDE BELOW
+0331 ; [.0000.0089.0002.0331] # COMBINING MACRON BELOW
+0333 ; [.0000.008A.0002.0333] # COMBINING DOUBLE LOW LINE
+0334 ; [.0000.008B.0002.0334] # COMBINING TILDE OVERLAY
+0335 ; [.0000.008C.0002.0335] # COMBINING SHORT STROKE OVERLAY
+0336 ; [.0000.008D.0002.0336] # COMBINING LONG STROKE OVERLAY
+0337 ; [.0000.008E.0002.0337] # COMBINING SHORT SOLIDUS OVERLAY
+0339 ; [.0000.008F.0002.0339] # COMBINING RIGHT HALF RING BELOW
+033A ; [.0000.0090.0002.033A] # COMBINING INVERTED BRIDGE BELOW
+033B ; [.0000.0091.0002.033B] # COMBINING SQUARE BELOW
+033C ; [.0000.0092.0002.033C] # COMBINING SEAGULL BELOW
+033D ; [.0000.0093.0002.033D] # COMBINING X ABOVE
+033E ; [.0000.0094.0002.033E] # COMBINING VERTICAL TILDE
+033F ; [.0000.0095.0002.033F] # COMBINING DOUBLE OVERLINE
+0345 ; [.0000.0096.0002.0345] # COMBINING GREEK YPOGEGRAMMENI
+0346 ; [.0000.0097.0002.0346] # COMBINING BRIDGE ABOVE
+0347 ; [.0000.0098.0002.0347] # COMBINING EQUALS SIGN BELOW
+0348 ; [.0000.0099.0002.0348] # COMBINING DOUBLE VERTICAL LINE BELOW
+0349 ; [.0000.009A.0002.0349] # COMBINING LEFT ANGLE BELOW
+034A ; [.0000.009B.0002.034A] # COMBINING NOT TILDE ABOVE
+034B ; [.0000.009C.0002.034B] # COMBINING HOMOTHETIC ABOVE
+034C ; [.0000.009D.0002.034C] # COMBINING ALMOST EQUAL TO ABOVE
+034D ; [.0000.009E.0002.034D] # COMBINING LEFT RIGHT ARROW BELOW
+034E ; [.0000.009F.0002.034E] # COMBINING UPWARDS ARROW BELOW
+0360 ; [.0000.00A0.0002.0360] # COMBINING DOUBLE TILDE
+0361 ; [.0000.00A1.0002.0361] # COMBINING DOUBLE INVERTED BREVE
+0362 ; [.0000.00A2.0002.0362] # COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+3099 ; [.0000.013D.0002.3099] # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A ; [.0000.013E.0002.309A] # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D ; [.09DB.0020.0002.309D] # HIRAGANA ITERATION MARK
+309E ; [.09DB.0020.0002.309D][.0000.013D.0002.3099] # HIRAGANA VOICED ITERATION MARK; QQCM
+30FC ; [.09DC.0020.0002.30FC] # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FD ; [.09DD.0020.0002.30FD] # KATAKANA ITERATION MARK
+30FE ; [.09DD.0020.0002.30FD][.0000.013D.0002.3099] # KATAKANA VOICED ITERATION MARK; QQCM
+00A4 ; [.09DE.0020.0002.00A4] # CURRENCY SIGN
+00A2 ; [.09DF.0020.0002.00A2] # CENT SIGN
+0024 ; [.09E0.0020.0002.0024] # DOLLAR SIGN
+00A3 ; [.09E1.0020.0002.00A3] # POUND SIGN
+00A5 ; [.09E2.0020.0002.00A5] # YEN SIGN
+0030 ; [.0A0B.0020.0002.0030] # DIGIT ZERO
+0031 ; [.0A0C.0020.0002.0031] # DIGIT ONE
+00B9 ; [.0A0C.0020.0014.00B9] # SUPERSCRIPT ONE; QQK
+00BD ; [.0A0C.0020.001E.00BD][*02A5.0020.001E.00BD][.0A0D.0020.001F.00BD] # VULGAR FRACTION ONE HALF; QQKN
+00BC ; [.0A0C.0020.001E.00BC][*02A5.0020.001E.00BC][.0A0F.0020.001F.00BC] # VULGAR FRACTION ONE QUARTER; QQKN
+0032 ; [.0A0D.0020.0002.0032] # DIGIT TWO
+00B2 ; [.0A0D.0020.0014.00B2] # SUPERSCRIPT TWO; QQK
+0033 ; [.0A0E.0020.0002.0033] # DIGIT THREE
+00B3 ; [.0A0E.0020.0014.00B3] # SUPERSCRIPT THREE; QQK
+00BE ; [.0A0E.0020.001E.00BE][*02A5.0020.001E.00BE][.0A0F.0020.001F.00BE] # VULGAR FRACTION THREE QUARTERS; QQKN
+0034 ; [.0A0F.0020.0002.0034] # DIGIT FOUR
+0035 ; [.0A10.0020.0002.0035] # DIGIT FIVE
+0036 ; [.0A11.0020.0002.0036] # DIGIT SIX
+0037 ; [.0A12.0020.0002.0037] # DIGIT SEVEN
+0038 ; [.0A13.0020.0002.0038] # DIGIT EIGHT
+0039 ; [.0A14.0020.0002.0039] # DIGIT NINE
+0061 ; [.0A15.0020.0002.0061] # LATIN SMALL LETTER A
+0041 ; [.0A15.0020.0008.0041] # LATIN CAPITAL LETTER A
+00AA ; [.0A15.0020.0014.00AA] # FEMININE ORDINAL INDICATOR; QQK
+00E1 ; [.0A15.0020.0002.0061][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH ACUTE; QQCM
+00C1 ; [.0A15.0020.0008.0041][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH ACUTE; QQCM
+00E0 ; [.0A15.0020.0002.0061][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH GRAVE; QQCM
+00C0 ; [.0A15.0020.0008.0041][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH GRAVE; QQCM
+00E2 ; [.0A15.0020.0002.0061][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX; QQCM
+00C2 ; [.0A15.0020.0008.0041][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX; QQCM
+00E5 ; [.0A15.0020.0002.0061][.0000.0043.0002.030A] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM
+00C5 ; [.0A15.0020.0008.0041][.0000.0043.0002.030A] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM
+00E4 ; [.0A15.0020.0002.0061][.0000.0047.0002.0308] # LATIN SMALL LETTER A WITH DIAERESIS; QQCM
+00C4 ; [.0A15.0020.0008.0041][.0000.0047.0002.0308] # LATIN CAPITAL LETTER A WITH DIAERESIS; QQCM
+00E3 ; [.0A15.0020.0002.0061][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH TILDE; QQCM
+00C3 ; [.0A15.0020.0008.0041][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH TILDE; QQCM
+00E6 ; [.0A19.0020.0002.00E6] # LATIN SMALL LETTER AE
+00C6 ; [.0A19.0020.0008.00C6] # LATIN CAPITAL LETTER AE
+0062 ; [.0A29.0020.0002.0062] # LATIN SMALL LETTER B
+0042 ; [.0A29.0020.0008.0042] # LATIN CAPITAL LETTER B
+0063 ; [.0A3D.0020.0002.0063] # LATIN SMALL LETTER C
+0043 ; [.0A3D.0020.0008.0043] # LATIN CAPITAL LETTER C
+00E7 ; [.0A3D.0020.0002.0063][.0000.0055.0002.0327] # LATIN SMALL LETTER C WITH CEDILLA; QQCM
+00C7 ; [.0A3D.0020.0008.0043][.0000.0055.0002.0327] # LATIN CAPITAL LETTER C WITH CEDILLA; QQCM
+0064 ; [.0A49.0020.0002.0064] # LATIN SMALL LETTER D
+0044 ; [.0A49.0020.0008.0044] # LATIN CAPITAL LETTER D
+00F0 ; [.0A5D.0020.0002.00F0] # LATIN SMALL LETTER ETH
+00D0 ; [.0A5D.0020.0008.00D0] # LATIN CAPITAL LETTER ETH
+0065 ; [.0A65.0020.0002.0065] # LATIN SMALL LETTER E
+0045 ; [.0A65.0020.0008.0045] # LATIN CAPITAL LETTER E
+00E9 ; [.0A65.0020.0002.0065][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH ACUTE; QQCM
+00C9 ; [.0A65.0020.0008.0045][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH ACUTE; QQCM
+00E8 ; [.0A65.0020.0002.0065][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH GRAVE; QQCM
+00C8 ; [.0A65.0020.0008.0045][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH GRAVE; QQCM
+00EA ; [.0A65.0020.0002.0065][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX; QQCM
+00CA ; [.0A65.0020.0008.0045][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX; QQCM
+00EB ; [.0A65.0020.0002.0065][.0000.0047.0002.0308] # LATIN SMALL LETTER E WITH DIAERESIS; QQCM
+00CB ; [.0A65.0020.0008.0045][.0000.0047.0002.0308] # LATIN CAPITAL LETTER E WITH DIAERESIS; QQCM
+0066 ; [.0A91.0020.0002.0066] # LATIN SMALL LETTER F
+0046 ; [.0A91.0020.0008.0046] # LATIN CAPITAL LETTER F
+0067 ; [.0A99.0020.0002.0067] # LATIN SMALL LETTER G
+0047 ; [.0A99.0020.0008.0047] # LATIN CAPITAL LETTER G
+0068 ; [.0AB9.0020.0002.0068] # LATIN SMALL LETTER H
+0048 ; [.0AB9.0020.0008.0048] # LATIN CAPITAL LETTER H
+0069 ; [.0AD3.0020.0002.0069] # LATIN SMALL LETTER I
+0049 ; [.0AD3.0020.0008.0049] # LATIN CAPITAL LETTER I
+00ED ; [.0AD3.0020.0002.0069][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH ACUTE; QQCM
+00CD ; [.0AD3.0020.0008.0049][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH ACUTE; QQCM
+00EC ; [.0AD3.0020.0002.0069][.0000.0035.0002.0300] # LATIN SMALL LETTER I WITH GRAVE; QQCM
+00CC ; [.0AD3.0020.0008.0049][.0000.0035.0002.0300] # LATIN CAPITAL LETTER I WITH GRAVE; QQCM
+00EE ; [.0AD3.0020.0002.0069][.0000.003C.0002.0302] # LATIN SMALL LETTER I WITH CIRCUMFLEX; QQCM
+00CE ; [.0AD3.0020.0008.0049][.0000.003C.0002.0302] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX; QQCM
+00EF ; [.0AD3.0020.0002.0069][.0000.0047.0002.0308] # LATIN SMALL LETTER I WITH DIAERESIS; QQCM
+00CF ; [.0AD3.0020.0008.0049][.0000.0047.0002.0308] # LATIN CAPITAL LETTER I WITH DIAERESIS; QQCM
+006A ; [.0AE7.0020.0002.006A] # LATIN SMALL LETTER J
+004A ; [.0AE7.0020.0008.004A] # LATIN CAPITAL LETTER J
+006B ; [.0AF7.0020.0002.006B] # LATIN SMALL LETTER K
+004B ; [.0AF7.0020.0008.004B] # LATIN CAPITAL LETTER K
+006C ; [.0B03.0020.0002.006C] # LATIN SMALL LETTER L
+004C ; [.0B03.0020.0008.004C] # LATIN CAPITAL LETTER L
+006D ; [.0B2B.0020.0002.006D] # LATIN SMALL LETTER M
+004D ; [.0B2B.0020.0008.004D] # LATIN CAPITAL LETTER M
+006E ; [.0B33.0020.0002.006E] # LATIN SMALL LETTER N
+004E ; [.0B33.0020.0008.004E] # LATIN CAPITAL LETTER N
+00F1 ; [.0B33.0020.0002.006E][.0000.004E.0002.0303] # LATIN SMALL LETTER N WITH TILDE; QQCM
+00D1 ; [.0B33.0020.0008.004E][.0000.004E.0002.0303] # LATIN CAPITAL LETTER N WITH TILDE; QQCM
+006F ; [.0B4B.0020.0002.006F] # LATIN SMALL LETTER O
+004F ; [.0B4B.0020.0008.004F] # LATIN CAPITAL LETTER O
+00BA ; [.0B4B.0020.0014.00BA] # MASCULINE ORDINAL INDICATOR; QQK
+00F3 ; [.0B4B.0020.0002.006F][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH ACUTE; QQCM
+00D3 ; [.0B4B.0020.0008.004F][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH ACUTE; QQCM
+00F2 ; [.0B4B.0020.0002.006F][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH GRAVE; QQCM
+00D2 ; [.0B4B.0020.0008.004F][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH GRAVE; QQCM
+00F4 ; [.0B4B.0020.0002.006F][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX; QQCM
+00D4 ; [.0B4B.0020.0008.004F][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX; QQCM
+00F6 ; [.0B4B.0020.0002.006F][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH DIAERESIS; QQCM
+00D6 ; [.0B4B.0020.0008.004F][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH DIAERESIS; QQCM
+00F5 ; [.0B4B.0020.0002.006F][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH TILDE; QQCM
+00D5 ; [.0B4B.0020.0008.004F][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH TILDE; QQCM
+00F8 ; [.0B53.0020.0002.00F8] # LATIN SMALL LETTER O WITH STROKE
+00D8 ; [.0B53.0020.0008.00D8] # LATIN CAPITAL LETTER O WITH STROKE
+0070 ; [.0B67.0020.0002.0070] # LATIN SMALL LETTER P
+0050 ; [.0B67.0020.0008.0050] # LATIN CAPITAL LETTER P
+0071 ; [.0B73.0020.0002.0071] # LATIN SMALL LETTER Q
+0051 ; [.0B73.0020.0008.0051] # LATIN CAPITAL LETTER Q
+0072 ; [.0B7F.0020.0002.0072] # LATIN SMALL LETTER R
+0052 ; [.0B7F.0020.0008.0052] # LATIN CAPITAL LETTER R
+0073 ; [.0BA7.0020.0002.0073] # LATIN SMALL LETTER S
+0053 ; [.0BA7.0020.0008.0053] # LATIN CAPITAL LETTER S
+00DF ; [.0BA7.0020.0004.00DF][.0000.0153.0004.00DF][.0BA7.0020.001F.00DF] # LATIN SMALL LETTER SHARP S; QQKN
+0074 ; [.0BBF.0020.0002.0074] # LATIN SMALL LETTER T
+0054 ; [.0BBF.0020.0008.0054] # LATIN CAPITAL LETTER T
+0075 ; [.0BD7.0020.0002.0075] # LATIN SMALL LETTER U
+0055 ; [.0BD7.0020.0008.0055] # LATIN CAPITAL LETTER U
+00FA ; [.0BD7.0020.0002.0075][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH ACUTE; QQCM
+00DA ; [.0BD7.0020.0008.0055][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH ACUTE; QQCM
+00F9 ; [.0BD7.0020.0002.0075][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH GRAVE; QQCM
+00D9 ; [.0BD7.0020.0008.0055][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH GRAVE; QQCM
+00FB ; [.0BD7.0020.0002.0075][.0000.003C.0002.0302] # LATIN SMALL LETTER U WITH CIRCUMFLEX; QQCM
+00DB ; [.0BD7.0020.0008.0055][.0000.003C.0002.0302] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX; QQCM
+00FC ; [.0BD7.0020.0002.0075][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH DIAERESIS; QQCM
+00DC ; [.0BD7.0020.0008.0055][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH DIAERESIS; QQCM
+0076 ; [.0BEF.0020.0002.0076] # LATIN SMALL LETTER V
+0056 ; [.0BEF.0020.0008.0056] # LATIN CAPITAL LETTER V
+0077 ; [.0BFB.0020.0002.0077] # LATIN SMALL LETTER W
+0057 ; [.0BFB.0020.0008.0057] # LATIN CAPITAL LETTER W
+0078 ; [.0C03.0020.0002.0078] # LATIN SMALL LETTER X
+0058 ; [.0C03.0020.0008.0058] # LATIN CAPITAL LETTER X
+0079 ; [.0C07.0020.0002.0079] # LATIN SMALL LETTER Y
+0059 ; [.0C07.0020.0008.0059] # LATIN CAPITAL LETTER Y
+00FD ; [.0C07.0020.0002.0079][.0000.0032.0002.0301] # LATIN SMALL LETTER Y WITH ACUTE; QQCM
+00DD ; [.0C07.0020.0008.0059][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Y WITH ACUTE; QQCM
+00FF ; [.0C07.0020.0002.0079][.0000.0047.0002.0308] # LATIN SMALL LETTER Y WITH DIAERESIS; QQCM
+007A ; [.0C13.0020.0002.007A] # LATIN SMALL LETTER Z
+005A ; [.0C13.0020.0008.005A] # LATIN CAPITAL LETTER Z
+00FE ; [.0C3B.0020.0002.00FE] # LATIN SMALL LETTER THORN
+00DE ; [.0C3B.0020.0008.00DE] # LATIN CAPITAL LETTER THORN
+00B5 ; [.0C9F.0020.0004.00B5] # MICRO SIGN; QQK
+1100 ; [.1831.0020.0002.1100] # HANGUL CHOSEONG KIYEOK
+1101 ; [.1832.0020.0002.1101] # HANGUL CHOSEONG SSANGKIYEOK
+1102 ; [.1833.0020.0002.1102] # HANGUL CHOSEONG NIEUN
+1103 ; [.1834.0020.0002.1103] # HANGUL CHOSEONG TIKEUT
+1104 ; [.1835.0020.0002.1104] # HANGUL CHOSEONG SSANGTIKEUT
+1105 ; [.1836.0020.0002.1105] # HANGUL CHOSEONG RIEUL
+1106 ; [.1837.0020.0002.1106] # HANGUL CHOSEONG MIEUM
+1107 ; [.1838.0020.0002.1107] # HANGUL CHOSEONG PIEUP
+1108 ; [.1839.0020.0002.1108] # HANGUL CHOSEONG SSANGPIEUP
+1109 ; [.183A.0020.0002.1109] # HANGUL CHOSEONG SIOS
+110A ; [.183B.0020.0002.110A] # HANGUL CHOSEONG SSANGSIOS
+110B ; [.183C.0020.0002.110B] # HANGUL CHOSEONG IEUNG
+110C ; [.183D.0020.0002.110C] # HANGUL CHOSEONG CIEUC
+110D ; [.183E.0020.0002.110D] # HANGUL CHOSEONG SSANGCIEUC
+110E ; [.183F.0020.0002.110E] # HANGUL CHOSEONG CHIEUCH
+110F ; [.1840.0020.0002.110F] # HANGUL CHOSEONG KHIEUKH
+1110 ; [.1841.0020.0002.1110] # HANGUL CHOSEONG THIEUTH
+1111 ; [.1842.0020.0002.1111] # HANGUL CHOSEONG PHIEUPH
+1112 ; [.1843.0020.0002.1112] # HANGUL CHOSEONG HIEUH
+1113 ; [.1844.0020.0002.1113] # HANGUL CHOSEONG NIEUN-KIYEOK
+1114 ; [.1845.0020.0002.1114] # HANGUL CHOSEONG SSANGNIEUN
+1115 ; [.1846.0020.0002.1115] # HANGUL CHOSEONG NIEUN-TIKEUT
+1116 ; [.1847.0020.0002.1116] # HANGUL CHOSEONG NIEUN-PIEUP
+1117 ; [.1848.0020.0002.1117] # HANGUL CHOSEONG TIKEUT-KIYEOK
+1118 ; [.1849.0020.0002.1118] # HANGUL CHOSEONG RIEUL-NIEUN
+1119 ; [.184A.0020.0002.1119] # HANGUL CHOSEONG SSANGRIEUL
+111A ; [.184B.0020.0002.111A] # HANGUL CHOSEONG RIEUL-HIEUH
+111B ; [.184C.0020.0002.111B] # HANGUL CHOSEONG KAPYEOUNRIEUL
+111C ; [.184D.0020.0002.111C] # HANGUL CHOSEONG MIEUM-PIEUP
+111D ; [.184E.0020.0002.111D] # HANGUL CHOSEONG KAPYEOUNMIEUM
+111E ; [.184F.0020.0002.111E] # HANGUL CHOSEONG PIEUP-KIYEOK
+111F ; [.1850.0020.0002.111F] # HANGUL CHOSEONG PIEUP-NIEUN
+1120 ; [.1851.0020.0002.1120] # HANGUL CHOSEONG PIEUP-TIKEUT
+1121 ; [.1852.0020.0002.1121] # HANGUL CHOSEONG PIEUP-SIOS
+1122 ; [.1853.0020.0002.1122] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123 ; [.1854.0020.0002.1123] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124 ; [.1855.0020.0002.1124] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125 ; [.1856.0020.0002.1125] # HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126 ; [.1857.0020.0002.1126] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127 ; [.1858.0020.0002.1127] # HANGUL CHOSEONG PIEUP-CIEUC
+1128 ; [.1859.0020.0002.1128] # HANGUL CHOSEONG PIEUP-CHIEUCH
+1129 ; [.185A.0020.0002.1129] # HANGUL CHOSEONG PIEUP-THIEUTH
+112A ; [.185B.0020.0002.112A] # HANGUL CHOSEONG PIEUP-PHIEUPH
+112B ; [.185C.0020.0002.112B] # HANGUL CHOSEONG KAPYEOUNPIEUP
+112C ; [.185D.0020.0002.112C] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D ; [.185E.0020.0002.112D] # HANGUL CHOSEONG SIOS-KIYEOK
+112E ; [.185F.0020.0002.112E] # HANGUL CHOSEONG SIOS-NIEUN
+112F ; [.1860.0020.0002.112F] # HANGUL CHOSEONG SIOS-TIKEUT
+1130 ; [.1861.0020.0002.1130] # HANGUL CHOSEONG SIOS-RIEUL
+1131 ; [.1862.0020.0002.1131] # HANGUL CHOSEONG SIOS-MIEUM
+1132 ; [.1863.0020.0002.1132] # HANGUL CHOSEONG SIOS-PIEUP
+1133 ; [.1864.0020.0002.1133] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134 ; [.1865.0020.0002.1134] # HANGUL CHOSEONG SIOS-SSANGSIOS
+1135 ; [.1866.0020.0002.1135] # HANGUL CHOSEONG SIOS-IEUNG
+1136 ; [.1867.0020.0002.1136] # HANGUL CHOSEONG SIOS-CIEUC
+1137 ; [.1868.0020.0002.1137] # HANGUL CHOSEONG SIOS-CHIEUCH
+1138 ; [.1869.0020.0002.1138] # HANGUL CHOSEONG SIOS-KHIEUKH
+1139 ; [.186A.0020.0002.1139] # HANGUL CHOSEONG SIOS-THIEUTH
+113A ; [.186B.0020.0002.113A] # HANGUL CHOSEONG SIOS-PHIEUPH
+113B ; [.186C.0020.0002.113B] # HANGUL CHOSEONG SIOS-HIEUH
+113C ; [.186D.0020.0002.113C] # HANGUL CHOSEONG CHITUEUMSIOS
+113D ; [.186E.0020.0002.113D] # HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E ; [.186F.0020.0002.113E] # HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F ; [.1870.0020.0002.113F] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140 ; [.1871.0020.0002.1140] # HANGUL CHOSEONG PANSIOS
+1141 ; [.1872.0020.0002.1141] # HANGUL CHOSEONG IEUNG-KIYEOK
+1142 ; [.1873.0020.0002.1142] # HANGUL CHOSEONG IEUNG-TIKEUT
+1143 ; [.1874.0020.0002.1143] # HANGUL CHOSEONG IEUNG-MIEUM
+1144 ; [.1875.0020.0002.1144] # HANGUL CHOSEONG IEUNG-PIEUP
+1145 ; [.1876.0020.0002.1145] # HANGUL CHOSEONG IEUNG-SIOS
+1146 ; [.1877.0020.0002.1146] # HANGUL CHOSEONG IEUNG-PANSIOS
+1147 ; [.1878.0020.0002.1147] # HANGUL CHOSEONG SSANGIEUNG
+1148 ; [.1879.0020.0002.1148] # HANGUL CHOSEONG IEUNG-CIEUC
+1149 ; [.187A.0020.0002.1149] # HANGUL CHOSEONG IEUNG-CHIEUCH
+114A ; [.187B.0020.0002.114A] # HANGUL CHOSEONG IEUNG-THIEUTH
+114B ; [.187C.0020.0002.114B] # HANGUL CHOSEONG IEUNG-PHIEUPH
+114C ; [.187D.0020.0002.114C] # HANGUL CHOSEONG YESIEUNG
+114D ; [.187E.0020.0002.114D] # HANGUL CHOSEONG CIEUC-IEUNG
+114E ; [.187F.0020.0002.114E] # HANGUL CHOSEONG CHITUEUMCIEUC
+114F ; [.1880.0020.0002.114F] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150 ; [.1881.0020.0002.1150] # HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151 ; [.1882.0020.0002.1151] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152 ; [.1883.0020.0002.1152] # HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153 ; [.1884.0020.0002.1153] # HANGUL CHOSEONG CHIEUCH-HIEUH
+1154 ; [.1885.0020.0002.1154] # HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155 ; [.1886.0020.0002.1155] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156 ; [.1887.0020.0002.1156] # HANGUL CHOSEONG PHIEUPH-PIEUP
+1157 ; [.1888.0020.0002.1157] # HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158 ; [.1889.0020.0002.1158] # HANGUL CHOSEONG SSANGHIEUH
+1159 ; [.188A.0020.0002.1159] # HANGUL CHOSEONG YEORINHIEUH
+115F ; [.188B.0020.0002.115F] # HANGUL CHOSEONG FILLER
+1160 ; [.188C.0020.0002.1160] # HANGUL JUNGSEONG FILLER
+1161 ; [.188D.0020.0002.1161] # HANGUL JUNGSEONG A
+1162 ; [.188E.0020.0002.1162] # HANGUL JUNGSEONG AE
+1163 ; [.188F.0020.0002.1163] # HANGUL JUNGSEONG YA
+1164 ; [.1890.0020.0002.1164] # HANGUL JUNGSEONG YAE
+1165 ; [.1891.0020.0002.1165] # HANGUL JUNGSEONG EO
+1166 ; [.1892.0020.0002.1166] # HANGUL JUNGSEONG E
+1167 ; [.1893.0020.0002.1167] # HANGUL JUNGSEONG YEO
+1168 ; [.1894.0020.0002.1168] # HANGUL JUNGSEONG YE
+1169 ; [.1895.0020.0002.1169] # HANGUL JUNGSEONG O
+116A ; [.1896.0020.0002.116A] # HANGUL JUNGSEONG WA
+116B ; [.1897.0020.0002.116B] # HANGUL JUNGSEONG WAE
+116C ; [.1898.0020.0002.116C] # HANGUL JUNGSEONG OE
+116D ; [.1899.0020.0002.116D] # HANGUL JUNGSEONG YO
+116E ; [.189A.0020.0002.116E] # HANGUL JUNGSEONG U
+116F ; [.189B.0020.0002.116F] # HANGUL JUNGSEONG WEO
+1170 ; [.189C.0020.0002.1170] # HANGUL JUNGSEONG WE
+1171 ; [.189D.0020.0002.1171] # HANGUL JUNGSEONG WI
+1172 ; [.189E.0020.0002.1172] # HANGUL JUNGSEONG YU
+1173 ; [.189F.0020.0002.1173] # HANGUL JUNGSEONG EU
+1174 ; [.18A0.0020.0002.1174] # HANGUL JUNGSEONG YI
+1175 ; [.18A1.0020.0002.1175] # HANGUL JUNGSEONG I
+1176 ; [.18A2.0020.0002.1176] # HANGUL JUNGSEONG A-O
+1177 ; [.18A3.0020.0002.1177] # HANGUL JUNGSEONG A-U
+1178 ; [.18A4.0020.0002.1178] # HANGUL JUNGSEONG YA-O
+1179 ; [.18A5.0020.0002.1179] # HANGUL JUNGSEONG YA-YO
+117A ; [.18A6.0020.0002.117A] # HANGUL JUNGSEONG EO-O
+117B ; [.18A7.0020.0002.117B] # HANGUL JUNGSEONG EO-U
+117C ; [.18A8.0020.0002.117C] # HANGUL JUNGSEONG EO-EU
+117D ; [.18A9.0020.0002.117D] # HANGUL JUNGSEONG YEO-O
+117E ; [.18AA.0020.0002.117E] # HANGUL JUNGSEONG YEO-U
+117F ; [.18AB.0020.0002.117F] # HANGUL JUNGSEONG O-EO
+1180 ; [.18AC.0020.0002.1180] # HANGUL JUNGSEONG O-E
+1181 ; [.18AD.0020.0002.1181] # HANGUL JUNGSEONG O-YE
+1182 ; [.18AE.0020.0002.1182] # HANGUL JUNGSEONG O-O
+1183 ; [.18AF.0020.0002.1183] # HANGUL JUNGSEONG O-U
+1184 ; [.18B0.0020.0002.1184] # HANGUL JUNGSEONG YO-YA
+1185 ; [.18B1.0020.0002.1185] # HANGUL JUNGSEONG YO-YAE
+1186 ; [.18B2.0020.0002.1186] # HANGUL JUNGSEONG YO-YEO
+1187 ; [.18B3.0020.0002.1187] # HANGUL JUNGSEONG YO-O
+1188 ; [.18B4.0020.0002.1188] # HANGUL JUNGSEONG YO-I
+1189 ; [.18B5.0020.0002.1189] # HANGUL JUNGSEONG U-A
+118A ; [.18B6.0020.0002.118A] # HANGUL JUNGSEONG U-AE
+118B ; [.18B7.0020.0002.118B] # HANGUL JUNGSEONG U-EO-EU
+118C ; [.18B8.0020.0002.118C] # HANGUL JUNGSEONG U-YE
+118D ; [.18B9.0020.0002.118D] # HANGUL JUNGSEONG U-U
+118E ; [.18BA.0020.0002.118E] # HANGUL JUNGSEONG YU-A
+118F ; [.18BB.0020.0002.118F] # HANGUL JUNGSEONG YU-EO
+1190 ; [.18BC.0020.0002.1190] # HANGUL JUNGSEONG YU-E
+1191 ; [.18BD.0020.0002.1191] # HANGUL JUNGSEONG YU-YEO
+1192 ; [.18BE.0020.0002.1192] # HANGUL JUNGSEONG YU-YE
+1193 ; [.18BF.0020.0002.1193] # HANGUL JUNGSEONG YU-U
+1194 ; [.18C0.0020.0002.1194] # HANGUL JUNGSEONG YU-I
+1195 ; [.18C1.0020.0002.1195] # HANGUL JUNGSEONG EU-U
+1196 ; [.18C2.0020.0002.1196] # HANGUL JUNGSEONG EU-EU
+1197 ; [.18C3.0020.0002.1197] # HANGUL JUNGSEONG YI-U
+1198 ; [.18C4.0020.0002.1198] # HANGUL JUNGSEONG I-A
+1199 ; [.18C5.0020.0002.1199] # HANGUL JUNGSEONG I-YA
+119A ; [.18C6.0020.0002.119A] # HANGUL JUNGSEONG I-O
+119B ; [.18C7.0020.0002.119B] # HANGUL JUNGSEONG I-U
+119C ; [.18C8.0020.0002.119C] # HANGUL JUNGSEONG I-EU
+119D ; [.18C9.0020.0002.119D] # HANGUL JUNGSEONG I-ARAEA
+119E ; [.18CA.0020.0002.119E] # HANGUL JUNGSEONG ARAEA
+119F ; [.18CB.0020.0002.119F] # HANGUL JUNGSEONG ARAEA-EO
+11A0 ; [.18CC.0020.0002.11A0] # HANGUL JUNGSEONG ARAEA-U
+11A1 ; [.18CD.0020.0002.11A1] # HANGUL JUNGSEONG ARAEA-I
+11A2 ; [.18CE.0020.0002.11A2] # HANGUL JUNGSEONG SSANGARAEA
+11A8 ; [.18CF.0020.0002.11A8] # HANGUL JONGSEONG KIYEOK
+11A9 ; [.18D0.0020.0002.11A9] # HANGUL JONGSEONG SSANGKIYEOK
+11AA ; [.18D1.0020.0002.11AA] # HANGUL JONGSEONG KIYEOK-SIOS
+11AB ; [.18D2.0020.0002.11AB] # HANGUL JONGSEONG NIEUN
+11AC ; [.18D3.0020.0002.11AC] # HANGUL JONGSEONG NIEUN-CIEUC
+11AD ; [.18D4.0020.0002.11AD] # HANGUL JONGSEONG NIEUN-HIEUH
+11AE ; [.18D5.0020.0002.11AE] # HANGUL JONGSEONG TIKEUT
+11AF ; [.18D6.0020.0002.11AF] # HANGUL JONGSEONG RIEUL
+11B0 ; [.18D7.0020.0002.11B0] # HANGUL JONGSEONG RIEUL-KIYEOK
+11B1 ; [.18D8.0020.0002.11B1] # HANGUL JONGSEONG RIEUL-MIEUM
+11B2 ; [.18D9.0020.0002.11B2] # HANGUL JONGSEONG RIEUL-PIEUP
+11B3 ; [.18DA.0020.0002.11B3] # HANGUL JONGSEONG RIEUL-SIOS
+11B4 ; [.18DB.0020.0002.11B4] # HANGUL JONGSEONG RIEUL-THIEUTH
+11B5 ; [.18DC.0020.0002.11B5] # HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6 ; [.18DD.0020.0002.11B6] # HANGUL JONGSEONG RIEUL-HIEUH
+11B7 ; [.18DE.0020.0002.11B7] # HANGUL JONGSEONG MIEUM
+11B8 ; [.18DF.0020.0002.11B8] # HANGUL JONGSEONG PIEUP
+11B9 ; [.18E0.0020.0002.11B9] # HANGUL JONGSEONG PIEUP-SIOS
+11BA ; [.18E1.0020.0002.11BA] # HANGUL JONGSEONG SIOS
+11BB ; [.18E2.0020.0002.11BB] # HANGUL JONGSEONG SSANGSIOS
+11BC ; [.18E3.0020.0002.11BC] # HANGUL JONGSEONG IEUNG
+11BD ; [.18E4.0020.0002.11BD] # HANGUL JONGSEONG CIEUC
+11BE ; [.18E5.0020.0002.11BE] # HANGUL JONGSEONG CHIEUCH
+11BF ; [.18E6.0020.0002.11BF] # HANGUL JONGSEONG KHIEUKH
+11C0 ; [.18E7.0020.0002.11C0] # HANGUL JONGSEONG THIEUTH
+11C1 ; [.18E8.0020.0002.11C1] # HANGUL JONGSEONG PHIEUPH
+11C2 ; [.18E9.0020.0002.11C2] # HANGUL JONGSEONG HIEUH
+11C3 ; [.18EA.0020.0002.11C3] # HANGUL JONGSEONG KIYEOK-RIEUL
+11C4 ; [.18EB.0020.0002.11C4] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5 ; [.18EC.0020.0002.11C5] # HANGUL JONGSEONG NIEUN-KIYEOK
+11C6 ; [.18ED.0020.0002.11C6] # HANGUL JONGSEONG NIEUN-TIKEUT
+11C7 ; [.18EE.0020.0002.11C7] # HANGUL JONGSEONG NIEUN-SIOS
+11C8 ; [.18EF.0020.0002.11C8] # HANGUL JONGSEONG NIEUN-PANSIOS
+11C9 ; [.18F0.0020.0002.11C9] # HANGUL JONGSEONG NIEUN-THIEUTH
+11CA ; [.18F1.0020.0002.11CA] # HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB ; [.18F2.0020.0002.11CB] # HANGUL JONGSEONG TIKEUT-RIEUL
+11CC ; [.18F3.0020.0002.11CC] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD ; [.18F4.0020.0002.11CD] # HANGUL JONGSEONG RIEUL-NIEUN
+11CE ; [.18F5.0020.0002.11CE] # HANGUL JONGSEONG RIEUL-TIKEUT
+11CF ; [.18F6.0020.0002.11CF] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0 ; [.18F7.0020.0002.11D0] # HANGUL JONGSEONG SSANGRIEUL
+11D1 ; [.18F8.0020.0002.11D1] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2 ; [.18F9.0020.0002.11D2] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3 ; [.18FA.0020.0002.11D3] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4 ; [.18FB.0020.0002.11D4] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5 ; [.18FC.0020.0002.11D5] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6 ; [.18FD.0020.0002.11D6] # HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7 ; [.18FE.0020.0002.11D7] # HANGUL JONGSEONG RIEUL-PANSIOS
+11D8 ; [.18FF.0020.0002.11D8] # HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9 ; [.1900.0020.0002.11D9] # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA ; [.1901.0020.0002.11DA] # HANGUL JONGSEONG MIEUM-KIYEOK
+11DB ; [.1902.0020.0002.11DB] # HANGUL JONGSEONG MIEUM-RIEUL
+11DC ; [.1903.0020.0002.11DC] # HANGUL JONGSEONG MIEUM-PIEUP
+11DD ; [.1904.0020.0002.11DD] # HANGUL JONGSEONG MIEUM-SIOS
+11DE ; [.1905.0020.0002.11DE] # HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF ; [.1906.0020.0002.11DF] # HANGUL JONGSEONG MIEUM-PANSIOS
+11E0 ; [.1907.0020.0002.11E0] # HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1 ; [.1908.0020.0002.11E1] # HANGUL JONGSEONG MIEUM-HIEUH
+11E2 ; [.1909.0020.0002.11E2] # HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3 ; [.190A.0020.0002.11E3] # HANGUL JONGSEONG PIEUP-RIEUL
+11E4 ; [.190B.0020.0002.11E4] # HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5 ; [.190C.0020.0002.11E5] # HANGUL JONGSEONG PIEUP-HIEUH
+11E6 ; [.190D.0020.0002.11E6] # HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7 ; [.190E.0020.0002.11E7] # HANGUL JONGSEONG SIOS-KIYEOK
+11E8 ; [.190F.0020.0002.11E8] # HANGUL JONGSEONG SIOS-TIKEUT
+11E9 ; [.1910.0020.0002.11E9] # HANGUL JONGSEONG SIOS-RIEUL
+11EA ; [.1911.0020.0002.11EA] # HANGUL JONGSEONG SIOS-PIEUP
+11EB ; [.1912.0020.0002.11EB] # HANGUL JONGSEONG PANSIOS
+11EC ; [.1913.0020.0002.11EC] # HANGUL JONGSEONG IEUNG-KIYEOK
+11ED ; [.1914.0020.0002.11ED] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE ; [.1915.0020.0002.11EE] # HANGUL JONGSEONG SSANGIEUNG
+11EF ; [.1916.0020.0002.11EF] # HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0 ; [.1917.0020.0002.11F0] # HANGUL JONGSEONG YESIEUNG
+11F1 ; [.1918.0020.0002.11F1] # HANGUL JONGSEONG YESIEUNG-SIOS
+11F2 ; [.1919.0020.0002.11F2] # HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3 ; [.191A.0020.0002.11F3] # HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4 ; [.191B.0020.0002.11F4] # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5 ; [.191C.0020.0002.11F5] # HANGUL JONGSEONG HIEUH-NIEUN
+11F6 ; [.191D.0020.0002.11F6] # HANGUL JONGSEONG HIEUH-RIEUL
+11F7 ; [.191E.0020.0002.11F7] # HANGUL JONGSEONG HIEUH-MIEUM
+11F8 ; [.191F.0020.0002.11F8] # HANGUL JONGSEONG HIEUH-PIEUP
+11F9 ; [.1920.0020.0002.11F9] # HANGUL JONGSEONG YEORINHIEUH
+3041 ; [.1921.0020.000D.3041] # HIRAGANA LETTER SMALL A
+3042 ; [.1921.0020.000E.3042] # HIRAGANA LETTER A
+30A1 ; [.1921.0020.000F.30A1] # KATAKANA LETTER SMALL A
+30A2 ; [.1921.0020.0011.30A2] # KATAKANA LETTER A
+3043 ; [.1922.0020.000D.3043] # HIRAGANA LETTER SMALL I
+3044 ; [.1922.0020.000E.3044] # HIRAGANA LETTER I
+30A3 ; [.1922.0020.000F.30A3] # KATAKANA LETTER SMALL I
+30A4 ; [.1922.0020.0011.30A4] # KATAKANA LETTER I
+3045 ; [.1923.0020.000D.3045] # HIRAGANA LETTER SMALL U
+3046 ; [.1923.0020.000E.3046] # HIRAGANA LETTER U
+30A5 ; [.1923.0020.000F.30A5] # KATAKANA LETTER SMALL U
+30A6 ; [.1923.0020.0011.30A6] # KATAKANA LETTER U
+3094 ; [.1923.0020.000E.3046][.0000.013D.0002.3099] # HIRAGANA LETTER VU; QQCM
+30F4 ; [.1923.0020.0011.30A6][.0000.013D.0002.3099] # KATAKANA LETTER VU; QQCM
+3047 ; [.1924.0020.000D.3047] # HIRAGANA LETTER SMALL E
+3048 ; [.1924.0020.000E.3048] # HIRAGANA LETTER E
+30A7 ; [.1924.0020.000F.30A7] # KATAKANA LETTER SMALL E
+30A8 ; [.1924.0020.0011.30A8] # KATAKANA LETTER E
+3049 ; [.1925.0020.000D.3049] # HIRAGANA LETTER SMALL O
+304A ; [.1925.0020.000E.304A] # HIRAGANA LETTER O
+30A9 ; [.1925.0020.000F.30A9] # KATAKANA LETTER SMALL O
+30AA ; [.1925.0020.0011.30AA] # KATAKANA LETTER O
+304B ; [.1926.0020.000E.304B] # HIRAGANA LETTER KA
+30F5 ; [.1926.0020.000F.30F5] # KATAKANA LETTER SMALL KA
+30AB ; [.1926.0020.0011.30AB] # KATAKANA LETTER KA
+304C ; [.1926.0020.000E.304B][.0000.013D.0002.3099] # HIRAGANA LETTER GA; QQCM
+30AC ; [.1926.0020.0011.30AB][.0000.013D.0002.3099] # KATAKANA LETTER GA; QQCM
+304D ; [.1927.0020.000E.304D] # HIRAGANA LETTER KI
+30AD ; [.1927.0020.0011.30AD] # KATAKANA LETTER KI
+304E ; [.1927.0020.000E.304D][.0000.013D.0002.3099] # HIRAGANA LETTER GI; QQCM
+30AE ; [.1927.0020.0011.30AD][.0000.013D.0002.3099] # KATAKANA LETTER GI; QQCM
+304F ; [.1928.0020.000E.304F] # HIRAGANA LETTER KU
+30AF ; [.1928.0020.0011.30AF] # KATAKANA LETTER KU
+3050 ; [.1928.0020.000E.304F][.0000.013D.0002.3099] # HIRAGANA LETTER GU; QQCM
+30B0 ; [.1928.0020.0011.30AF][.0000.013D.0002.3099] # KATAKANA LETTER GU; QQCM
+3051 ; [.1929.0020.000E.3051] # HIRAGANA LETTER KE
+30F6 ; [.1929.0020.000F.30F6] # KATAKANA LETTER SMALL KE
+30B1 ; [.1929.0020.0011.30B1] # KATAKANA LETTER KE
+3052 ; [.1929.0020.000E.3051][.0000.013D.0002.3099] # HIRAGANA LETTER GE; QQCM
+30B2 ; [.1929.0020.0011.30B1][.0000.013D.0002.3099] # KATAKANA LETTER GE; QQCM
+3053 ; [.192A.0020.000E.3053] # HIRAGANA LETTER KO
+30B3 ; [.192A.0020.0011.30B3] # KATAKANA LETTER KO
+3054 ; [.192A.0020.000E.3053][.0000.013D.0002.3099] # HIRAGANA LETTER GO; QQCM
+30B4 ; [.192A.0020.0011.30B3][.0000.013D.0002.3099] # KATAKANA LETTER GO; QQCM
+3055 ; [.192B.0020.000E.3055] # HIRAGANA LETTER SA
+30B5 ; [.192B.0020.0011.30B5] # KATAKANA LETTER SA
+3056 ; [.192B.0020.000E.3055][.0000.013D.0002.3099] # HIRAGANA LETTER ZA; QQCM
+30B6 ; [.192B.0020.0011.30B5][.0000.013D.0002.3099] # KATAKANA LETTER ZA; QQCM
+3057 ; [.192C.0020.000E.3057] # HIRAGANA LETTER SI
+30B7 ; [.192C.0020.0011.30B7] # KATAKANA LETTER SI
+3058 ; [.192C.0020.000E.3057][.0000.013D.0002.3099] # HIRAGANA LETTER ZI; QQCM
+30B8 ; [.192C.0020.0011.30B7][.0000.013D.0002.3099] # KATAKANA LETTER ZI; QQCM
+3059 ; [.192D.0020.000E.3059] # HIRAGANA LETTER SU
+30B9 ; [.192D.0020.0011.30B9] # KATAKANA LETTER SU
+305A ; [.192D.0020.000E.3059][.0000.013D.0002.3099] # HIRAGANA LETTER ZU; QQCM
+30BA ; [.192D.0020.0011.30B9][.0000.013D.0002.3099] # KATAKANA LETTER ZU; QQCM
+305B ; [.192E.0020.000E.305B] # HIRAGANA LETTER SE
+30BB ; [.192E.0020.0011.30BB] # KATAKANA LETTER SE
+305C ; [.192E.0020.000E.305B][.0000.013D.0002.3099] # HIRAGANA LETTER ZE; QQCM
+30BC ; [.192E.0020.0011.30BB][.0000.013D.0002.3099] # KATAKANA LETTER ZE; QQCM
+305D ; [.192F.0020.000E.305D] # HIRAGANA LETTER SO
+30BD ; [.192F.0020.0011.30BD] # KATAKANA LETTER SO
+305E ; [.192F.0020.000E.305D][.0000.013D.0002.3099] # HIRAGANA LETTER ZO; QQCM
+30BE ; [.192F.0020.0011.30BD][.0000.013D.0002.3099] # KATAKANA LETTER ZO; QQCM
+305F ; [.1930.0020.000E.305F] # HIRAGANA LETTER TA
+30BF ; [.1930.0020.0011.30BF] # KATAKANA LETTER TA
+3060 ; [.1930.0020.000E.305F][.0000.013D.0002.3099] # HIRAGANA LETTER DA; QQCM
+30C0 ; [.1930.0020.0011.30BF][.0000.013D.0002.3099] # KATAKANA LETTER DA; QQCM
+3061 ; [.1931.0020.000E.3061] # HIRAGANA LETTER TI
+30C1 ; [.1931.0020.0011.30C1] # KATAKANA LETTER TI
+3062 ; [.1931.0020.000E.3061][.0000.013D.0002.3099] # HIRAGANA LETTER DI; QQCM
+30C2 ; [.1931.0020.0011.30C1][.0000.013D.0002.3099] # KATAKANA LETTER DI; QQCM
+3063 ; [.1932.0020.000D.3063] # HIRAGANA LETTER SMALL TU
+3064 ; [.1932.0020.000E.3064] # HIRAGANA LETTER TU
+30C3 ; [.1932.0020.000F.30C3] # KATAKANA LETTER SMALL TU
+30C4 ; [.1932.0020.0011.30C4] # KATAKANA LETTER TU
+3065 ; [.1932.0020.000E.3064][.0000.013D.0002.3099] # HIRAGANA LETTER DU; QQCM
+30C5 ; [.1932.0020.0011.30C4][.0000.013D.0002.3099] # KATAKANA LETTER DU; QQCM
+3066 ; [.1933.0020.000E.3066] # HIRAGANA LETTER TE
+30C6 ; [.1933.0020.0011.30C6] # KATAKANA LETTER TE
+3067 ; [.1933.0020.000E.3066][.0000.013D.0002.3099] # HIRAGANA LETTER DE; QQCM
+30C7 ; [.1933.0020.0011.30C6][.0000.013D.0002.3099] # KATAKANA LETTER DE; QQCM
+3068 ; [.1934.0020.000E.3068] # HIRAGANA LETTER TO
+30C8 ; [.1934.0020.0011.30C8] # KATAKANA LETTER TO
+3069 ; [.1934.0020.000E.3068][.0000.013D.0002.3099] # HIRAGANA LETTER DO; QQCM
+30C9 ; [.1934.0020.0011.30C8][.0000.013D.0002.3099] # KATAKANA LETTER DO; QQCM
+306A ; [.1935.0020.000E.306A] # HIRAGANA LETTER NA
+30CA ; [.1935.0020.0011.30CA] # KATAKANA LETTER NA
+306B ; [.1936.0020.000E.306B] # HIRAGANA LETTER NI
+30CB ; [.1936.0020.0011.30CB] # KATAKANA LETTER NI
+306C ; [.1937.0020.000E.306C] # HIRAGANA LETTER NU
+30CC ; [.1937.0020.0011.30CC] # KATAKANA LETTER NU
+306D ; [.1938.0020.000E.306D] # HIRAGANA LETTER NE
+30CD ; [.1938.0020.0011.30CD] # KATAKANA LETTER NE
+306E ; [.1939.0020.000E.306E] # HIRAGANA LETTER NO
+30CE ; [.1939.0020.0011.30CE] # KATAKANA LETTER NO
+306F ; [.193A.0020.000E.306F] # HIRAGANA LETTER HA
+30CF ; [.193A.0020.0011.30CF] # KATAKANA LETTER HA
+3070 ; [.193A.0020.000E.306F][.0000.013D.0002.3099] # HIRAGANA LETTER BA; QQCM
+30D0 ; [.193A.0020.0011.30CF][.0000.013D.0002.3099] # KATAKANA LETTER BA; QQCM
+3071 ; [.193A.0020.000E.306F][.0000.013E.0002.309A] # HIRAGANA LETTER PA; QQCM
+30D1 ; [.193A.0020.0011.30CF][.0000.013E.0002.309A] # KATAKANA LETTER PA; QQCM
+3072 ; [.193B.0020.000E.3072] # HIRAGANA LETTER HI
+30D2 ; [.193B.0020.0011.30D2] # KATAKANA LETTER HI
+3073 ; [.193B.0020.000E.3072][.0000.013D.0002.3099] # HIRAGANA LETTER BI; QQCM
+30D3 ; [.193B.0020.0011.30D2][.0000.013D.0002.3099] # KATAKANA LETTER BI; QQCM
+3074 ; [.193B.0020.000E.3072][.0000.013E.0002.309A] # HIRAGANA LETTER PI; QQCM
+30D4 ; [.193B.0020.0011.30D2][.0000.013E.0002.309A] # KATAKANA LETTER PI; QQCM
+3075 ; [.193C.0020.000E.3075] # HIRAGANA LETTER HU
+30D5 ; [.193C.0020.0011.30D5] # KATAKANA LETTER HU
+3076 ; [.193C.0020.000E.3075][.0000.013D.0002.3099] # HIRAGANA LETTER BU; QQCM
+30D6 ; [.193C.0020.0011.30D5][.0000.013D.0002.3099] # KATAKANA LETTER BU; QQCM
+3077 ; [.193C.0020.000E.3075][.0000.013E.0002.309A] # HIRAGANA LETTER PU; QQCM
+30D7 ; [.193C.0020.0011.30D5][.0000.013E.0002.309A] # KATAKANA LETTER PU; QQCM
+3078 ; [.193D.0020.000E.3078] # HIRAGANA LETTER HE
+30D8 ; [.193D.0020.0011.30D8] # KATAKANA LETTER HE
+3079 ; [.193D.0020.000E.3078][.0000.013D.0002.3099] # HIRAGANA LETTER BE; QQCM
+30D9 ; [.193D.0020.0011.30D8][.0000.013D.0002.3099] # KATAKANA LETTER BE; QQCM
+307A ; [.193D.0020.000E.3078][.0000.013E.0002.309A] # HIRAGANA LETTER PE; QQCM
+30DA ; [.193D.0020.0011.30D8][.0000.013E.0002.309A] # KATAKANA LETTER PE; QQCM
+307B ; [.193E.0020.000E.307B] # HIRAGANA LETTER HO
+30DB ; [.193E.0020.0011.30DB] # KATAKANA LETTER HO
+307C ; [.193E.0020.000E.307B][.0000.013D.0002.3099] # HIRAGANA LETTER BO; QQCM
+30DC ; [.193E.0020.0011.30DB][.0000.013D.0002.3099] # KATAKANA LETTER BO; QQCM
+307D ; [.193E.0020.000E.307B][.0000.013E.0002.309A] # HIRAGANA LETTER PO; QQCM
+30DD ; [.193E.0020.0011.30DB][.0000.013E.0002.309A] # KATAKANA LETTER PO; QQCM
+307E ; [.193F.0020.000E.307E] # HIRAGANA LETTER MA
+30DE ; [.193F.0020.0011.30DE] # KATAKANA LETTER MA
+307F ; [.1940.0020.000E.307F] # HIRAGANA LETTER MI
+30DF ; [.1940.0020.0011.30DF] # KATAKANA LETTER MI
+3080 ; [.1941.0020.000E.3080] # HIRAGANA LETTER MU
+30E0 ; [.1941.0020.0011.30E0] # KATAKANA LETTER MU
+3081 ; [.1942.0020.000E.3081] # HIRAGANA LETTER ME
+30E1 ; [.1942.0020.0011.30E1] # KATAKANA LETTER ME
+3082 ; [.1943.0020.000E.3082] # HIRAGANA LETTER MO
+30E2 ; [.1943.0020.0011.30E2] # KATAKANA LETTER MO
+3083 ; [.1944.0020.000D.3083] # HIRAGANA LETTER SMALL YA
+3084 ; [.1944.0020.000E.3084] # HIRAGANA LETTER YA
+30E3 ; [.1944.0020.000F.30E3] # KATAKANA LETTER SMALL YA
+30E4 ; [.1944.0020.0011.30E4] # KATAKANA LETTER YA
+3085 ; [.1945.0020.000D.3085] # HIRAGANA LETTER SMALL YU
+3086 ; [.1945.0020.000E.3086] # HIRAGANA LETTER YU
+30E5 ; [.1945.0020.000F.30E5] # KATAKANA LETTER SMALL YU
+30E6 ; [.1945.0020.0011.30E6] # KATAKANA LETTER YU
+3087 ; [.1946.0020.000D.3087] # HIRAGANA LETTER SMALL YO
+3088 ; [.1946.0020.000E.3088] # HIRAGANA LETTER YO
+30E7 ; [.1946.0020.000F.30E7] # KATAKANA LETTER SMALL YO
+30E8 ; [.1946.0020.0011.30E8] # KATAKANA LETTER YO
+3089 ; [.1947.0020.000E.3089] # HIRAGANA LETTER RA
+30E9 ; [.1947.0020.0011.30E9] # KATAKANA LETTER RA
+308A ; [.1948.0020.000E.308A] # HIRAGANA LETTER RI
+30EA ; [.1948.0020.0011.30EA] # KATAKANA LETTER RI
+308B ; [.1949.0020.000E.308B] # HIRAGANA LETTER RU
+30EB ; [.1949.0020.0011.30EB] # KATAKANA LETTER RU
+308C ; [.194A.0020.000E.308C] # HIRAGANA LETTER RE
+30EC ; [.194A.0020.0011.30EC] # KATAKANA LETTER RE
+308D ; [.194B.0020.000E.308D] # HIRAGANA LETTER RO
+30ED ; [.194B.0020.0011.30ED] # KATAKANA LETTER RO
+308E ; [.194C.0020.000D.308E] # HIRAGANA LETTER SMALL WA
+308F ; [.194C.0020.000E.308F] # HIRAGANA LETTER WA
+30EE ; [.194C.0020.000F.30EE] # KATAKANA LETTER SMALL WA
+30EF ; [.194C.0020.0011.30EF] # KATAKANA LETTER WA
+30F7 ; [.194C.0020.0011.30EF][.0000.013D.0002.3099] # KATAKANA LETTER VA; QQCM
+3090 ; [.194D.0020.000E.3090] # HIRAGANA LETTER WI
+30F0 ; [.194D.0020.0011.30F0] # KATAKANA LETTER WI
+30F8 ; [.194D.0020.0011.30F0][.0000.013D.0002.3099] # KATAKANA LETTER VI; QQCM
+3091 ; [.194E.0020.000E.3091] # HIRAGANA LETTER WE
+30F1 ; [.194E.0020.0011.30F1] # KATAKANA LETTER WE
+30F9 ; [.194E.0020.0011.30F1][.0000.013D.0002.3099] # KATAKANA LETTER VE; QQCM
+3092 ; [.194F.0020.000E.3092] # HIRAGANA LETTER WO
+30F2 ; [.194F.0020.0011.30F2] # KATAKANA LETTER WO
+30FA ; [.194F.0020.0011.30F2][.0000.013D.0002.3099] # KATAKANA LETTER VO; QQCM
+3093 ; [.1950.0020.000E.3093] # HIRAGANA LETTER N
+30F3 ; [.1950.0020.0011.30F3] # KATAKANA LETTER N
diff --git a/Master/tlpkg/tlperl.straw/lib/Unicode/Normalize.pm b/Master/tlpkg/tlperl.straw/lib/Unicode/Normalize.pm
new file mode 100755
index 00000000000..ad5ff82a836
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Unicode/Normalize.pm
@@ -0,0 +1,520 @@
+package Unicode::Normalize;
+
+BEGIN {
+ unless ("A" eq pack('U', 0x41)) {
+ die "Unicode::Normalize cannot stringify a Unicode code point\n";
+ }
+}
+
+use 5.006;
+use strict;
+use warnings;
+use Carp;
+
+no warnings 'utf8';
+
+our $VERSION = '1.03';
+our $PACKAGE = __PACKAGE__;
+
+require Exporter;
+require DynaLoader;
+
+our @ISA = qw(Exporter DynaLoader);
+our @EXPORT = qw( NFC NFD NFKC NFKD );
+our @EXPORT_OK = qw(
+ normalize decompose reorder compose
+ checkNFD checkNFKD checkNFC checkNFKC check
+ getCanon getCompat getComposite getCombinClass
+ isExclusion isSingleton isNonStDecomp isComp2nd isComp_Ex
+ isNFD_NO isNFC_NO isNFC_MAYBE isNFKD_NO isNFKC_NO isNFKC_MAYBE
+ FCD checkFCD FCC checkFCC composeContiguous
+ splitOnLastStarter
+);
+our %EXPORT_TAGS = (
+ all => [ @EXPORT, @EXPORT_OK ],
+ normalize => [ @EXPORT, qw/normalize decompose reorder compose/ ],
+ check => [ qw/checkNFD checkNFKD checkNFC checkNFKC check/ ],
+ fast => [ qw/FCD checkFCD FCC checkFCC composeContiguous/ ],
+);
+
+######
+
+bootstrap Unicode::Normalize $VERSION;
+
+######
+
+##
+## utilites for tests
+##
+
+sub pack_U {
+ return pack('U*', @_);
+}
+
+sub unpack_U {
+ return unpack('U*', shift(@_).pack('U*'));
+}
+
+
+##
+## normalization forms
+##
+
+sub FCD ($) {
+ my $str = shift;
+ return checkFCD($str) ? $str : NFD($str);
+}
+
+our %formNorm = (
+ NFC => \&NFC, C => \&NFC,
+ NFD => \&NFD, D => \&NFD,
+ NFKC => \&NFKC, KC => \&NFKC,
+ NFKD => \&NFKD, KD => \&NFKD,
+ FCD => \&FCD, FCC => \&FCC,
+);
+
+sub normalize($$)
+{
+ my $form = shift;
+ my $str = shift;
+ if (exists $formNorm{$form}) {
+ return $formNorm{$form}->($str);
+ }
+ croak($PACKAGE."::normalize: invalid form name: $form");
+}
+
+
+##
+## quick check
+##
+
+our %formCheck = (
+ NFC => \&checkNFC, C => \&checkNFC,
+ NFD => \&checkNFD, D => \&checkNFD,
+ NFKC => \&checkNFKC, KC => \&checkNFKC,
+ NFKD => \&checkNFKD, KD => \&checkNFKD,
+ FCD => \&checkFCD, FCC => \&checkFCC,
+);
+
+sub check($$)
+{
+ my $form = shift;
+ my $str = shift;
+ if (exists $formCheck{$form}) {
+ return $formCheck{$form}->($str);
+ }
+ croak($PACKAGE."::check: invalid form name: $form");
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Unicode::Normalize - Unicode Normalization Forms
+
+=head1 SYNOPSIS
+
+(1) using function names exported by default:
+
+ use Unicode::Normalize;
+
+ $NFD_string = NFD($string); # Normalization Form D
+ $NFC_string = NFC($string); # Normalization Form C
+ $NFKD_string = NFKD($string); # Normalization Form KD
+ $NFKC_string = NFKC($string); # Normalization Form KC
+
+(2) using function names exported on request:
+
+ use Unicode::Normalize 'normalize';
+
+ $NFD_string = normalize('D', $string); # Normalization Form D
+ $NFC_string = normalize('C', $string); # Normalization Form C
+ $NFKD_string = normalize('KD', $string); # Normalization Form KD
+ $NFKC_string = normalize('KC', $string); # Normalization Form KC
+
+=head1 DESCRIPTION
+
+Parameters:
+
+C<$string> is used as a string under character semantics (see F<perlunicode>).
+
+C<$code_point> should be an unsigned integer representing a Unicode code point.
+
+Note: Between XSUB and pure Perl, there is an incompatibility
+about the interpretation of C<$code_point> as a decimal number.
+XSUB converts C<$code_point> to an unsigned integer, but pure Perl does not.
+Do not use a floating point nor a negative sign in C<$code_point>.
+
+=head2 Normalization Forms
+
+=over 4
+
+=item C<$NFD_string = NFD($string)>
+
+It returns the Normalization Form D (formed by canonical decomposition).
+
+=item C<$NFC_string = NFC($string)>
+
+It returns the Normalization Form C (formed by canonical decomposition
+followed by canonical composition).
+
+=item C<$NFKD_string = NFKD($string)>
+
+It returns the Normalization Form KD (formed by compatibility decomposition).
+
+=item C<$NFKC_string = NFKC($string)>
+
+It returns the Normalization Form KC (formed by compatibility decomposition
+followed by B<canonical> composition).
+
+=item C<$FCD_string = FCD($string)>
+
+If the given string is in FCD ("Fast C or D" form; cf. UTN #5),
+it returns the string without modification; otherwise it returns an FCD string.
+
+Note: FCD is not always unique, then plural forms may be equivalent
+each other. C<FCD()> will return one of these equivalent forms.
+
+=item C<$FCC_string = FCC($string)>
+
+It returns the FCC form ("Fast C Contiguous"; cf. UTN #5).
+
+Note: FCC is unique, as well as four normalization forms (NF*).
+
+=item C<$normalized_string = normalize($form_name, $string)>
+
+It returns the normalization form of C<$form_name>.
+
+As C<$form_name>, one of the following names must be given.
+
+ 'C' or 'NFC' for Normalization Form C (UAX #15)
+ 'D' or 'NFD' for Normalization Form D (UAX #15)
+ 'KC' or 'NFKC' for Normalization Form KC (UAX #15)
+ 'KD' or 'NFKD' for Normalization Form KD (UAX #15)
+
+ 'FCD' for "Fast C or D" Form (UTN #5)
+ 'FCC' for "Fast C Contiguous" (UTN #5)
+
+=back
+
+=head2 Decomposition and Composition
+
+=over 4
+
+=item C<$decomposed_string = decompose($string [, $useCompatMapping])>
+
+It returns the concatenation of the decomposition of each character
+in the string.
+
+If the second parameter (a boolean) is omitted or false,
+the decomposition is canonical decomposition;
+if the second parameter (a boolean) is true,
+the decomposition is compatibility decomposition.
+
+The string returned is not always in NFD/NFKD. Reordering may be required.
+
+ $NFD_string = reorder(decompose($string)); # eq. to NFD()
+ $NFKD_string = reorder(decompose($string, TRUE)); # eq. to NFKD()
+
+=item C<$reordered_string = reorder($string)>
+
+It returns the result of reordering the combining characters
+according to Canonical Ordering Behavior.
+
+For example, when you have a list of NFD/NFKD strings,
+you can get the concatenated NFD/NFKD string from them, by saying
+
+ $concat_NFD = reorder(join '', @NFD_strings);
+ $concat_NFKD = reorder(join '', @NFKD_strings);
+
+=item C<$composed_string = compose($string)>
+
+It returns the result of canonical composition
+without applying any decomposition.
+
+For example, when you have a NFD/NFKD string,
+you can get its NFC/NFKC string, by saying
+
+ $NFC_string = compose($NFD_string);
+ $NFKC_string = compose($NFKD_string);
+
+=back
+
+=head2 Quick Check
+
+(see Annex 8, UAX #15; and F<DerivedNormalizationProps.txt>)
+
+The following functions check whether the string is in that normalization form.
+
+The result returned will be one of the following:
+
+ YES The string is in that normalization form.
+ NO The string is not in that normalization form.
+ MAYBE Dubious. Maybe yes, maybe no.
+
+=over 4
+
+=item C<$result = checkNFD($string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>.
+
+=item C<$result = checkNFC($string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>;
+C<undef> if C<MAYBE>.
+
+=item C<$result = checkNFKD($string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>.
+
+=item C<$result = checkNFKC($string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>;
+C<undef> if C<MAYBE>.
+
+=item C<$result = checkFCD($string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>.
+
+=item C<$result = checkFCC($string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>;
+C<undef> if C<MAYBE>.
+
+Note: If a string is not in FCD, it must not be in FCC.
+So C<checkFCC($not_FCD_string)> should return C<NO>.
+
+=item C<$result = check($form_name, $string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>;
+C<undef> if C<MAYBE>.
+
+As C<$form_name>, one of the following names must be given.
+
+ 'C' or 'NFC' for Normalization Form C (UAX #15)
+ 'D' or 'NFD' for Normalization Form D (UAX #15)
+ 'KC' or 'NFKC' for Normalization Form KC (UAX #15)
+ 'KD' or 'NFKD' for Normalization Form KD (UAX #15)
+
+ 'FCD' for "Fast C or D" Form (UTN #5)
+ 'FCC' for "Fast C Contiguous" (UTN #5)
+
+=back
+
+B<Note>
+
+In the cases of NFD, NFKD, and FCD, the answer must be
+either C<YES> or C<NO>. The answer C<MAYBE> may be returned
+in the cases of NFC, NFKC, and FCC.
+
+A C<MAYBE> string should contain at least one combining character
+or the like. For example, C<COMBINING ACUTE ACCENT> has
+the MAYBE_NFC/MAYBE_NFKC property.
+
+Both C<checkNFC("A\N{COMBINING ACUTE ACCENT}")>
+and C<checkNFC("B\N{COMBINING ACUTE ACCENT}")> will return C<MAYBE>.
+C<"A\N{COMBINING ACUTE ACCENT}"> is not in NFC
+(its NFC is C<"\N{LATIN CAPITAL LETTER A WITH ACUTE}">),
+while C<"B\N{COMBINING ACUTE ACCENT}"> is in NFC.
+
+If you want to check exactly, compare the string with its NFC/NFKC/FCC.
+
+ if ($string eq NFC($string)) {
+ # $string is exactly normalized in NFC;
+ } else {
+ # $string is not normalized in NFC;
+ }
+
+ if ($string eq NFKC($string)) {
+ # $string is exactly normalized in NFKC;
+ } else {
+ # $string is not normalized in NFKC;
+ }
+
+=head2 Character Data
+
+These functions are interface of character data used internally.
+If you want only to get Unicode normalization forms, you don't need
+call them yourself.
+
+=over 4
+
+=item C<$canonical_decomposition = getCanon($code_point)>
+
+If the character is canonically decomposable (including Hangul Syllables),
+it returns the (full) canonical decomposition as a string.
+Otherwise it returns C<undef>.
+
+B<Note:> According to the Unicode standard, the canonical decomposition
+of the character that is not canonically decomposable is same as
+the character itself.
+
+=item C<$compatibility_decomposition = getCompat($code_point)>
+
+If the character is compatibility decomposable (including Hangul Syllables),
+it returns the (full) compatibility decomposition as a string.
+Otherwise it returns C<undef>.
+
+B<Note:> According to the Unicode standard, the compatibility decomposition
+of the character that is not compatibility decomposable is same as
+the character itself.
+
+=item C<$code_point_composite = getComposite($code_point_here, $code_point_next)>
+
+If two characters here and next (as code points) are composable
+(including Hangul Jamo/Syllables and Composition Exclusions),
+it returns the code point of the composite.
+
+If they are not composable, it returns C<undef>.
+
+=item C<$combining_class = getCombinClass($code_point)>
+
+It returns the combining class (as an integer) of the character.
+
+=item C<$may_be_composed_with_prev_char = isComp2nd($code_point)>
+
+It returns a boolean whether the character of the specified codepoint
+may be composed with the previous one in a certain composition
+(including Hangul Compositions, but excluding
+Composition Exclusions and Non-Starter Decompositions).
+
+=item C<$is_exclusion = isExclusion($code_point)>
+
+It returns a boolean whether the code point is a composition exclusion.
+
+=item C<$is_singleton = isSingleton($code_point)>
+
+It returns a boolean whether the code point is a singleton
+
+=item C<$is_non_starter_decomposition = isNonStDecomp($code_point)>
+
+It returns a boolean whether the code point has Non-Starter Decomposition.
+
+=item C<$is_Full_Composition_Exclusion = isComp_Ex($code_point)>
+
+It returns a boolean of the derived property Comp_Ex
+(Full_Composition_Exclusion). This property is generated from
+Composition Exclusions + Singletons + Non-Starter Decompositions.
+
+=item C<$NFD_is_NO = isNFD_NO($code_point)>
+
+It returns a boolean of the derived property NFD_NO
+(NFD_Quick_Check=No).
+
+=item C<$NFC_is_NO = isNFC_NO($code_point)>
+
+It returns a boolean of the derived property NFC_NO
+(NFC_Quick_Check=No).
+
+=item C<$NFC_is_MAYBE = isNFC_MAYBE($code_point)>
+
+It returns a boolean of the derived property NFC_MAYBE
+(NFC_Quick_Check=Maybe).
+
+=item C<$NFKD_is_NO = isNFKD_NO($code_point)>
+
+It returns a boolean of the derived property NFKD_NO
+(NFKD_Quick_Check=No).
+
+=item C<$NFKC_is_NO = isNFKC_NO($code_point)>
+
+It returns a boolean of the derived property NFKC_NO
+(NFKC_Quick_Check=No).
+
+=item C<$NFKC_is_MAYBE = isNFKC_MAYBE($code_point)>
+
+It returns a boolean of the derived property NFKC_MAYBE
+(NFKC_Quick_Check=Maybe).
+
+=back
+
+=head1 EXPORT
+
+C<NFC>, C<NFD>, C<NFKC>, C<NFKD>: by default.
+
+C<normalize> and other some functions: on request.
+
+=head1 CAVEATS
+
+=over 4
+
+=item Perl's version vs. Unicode version
+
+Since this module refers to perl core's Unicode database in the directory
+F</lib/unicore> (or formerly F</lib/unicode>), the Unicode version of
+normalization implemented by this module depends on your perl's version.
+
+ perl's version implemented Unicode version
+ 5.6.1 3.0.1
+ 5.7.2 3.1.0
+ 5.7.3 3.1.1 (normalization is same as 3.1.0)
+ 5.8.0 3.2.0
+ 5.8.1-5.8.3 4.0.0
+ 5.8.4-5.8.6 4.0.1 (normalization is same as 4.0.0)
+ 5.8.7-5.8.8 4.1.0
+ 5.10.0 5.0.0
+ 5.8.9 5.1.0
+
+=item Correction of decomposition mapping
+
+In older Unicode versions, a small number of characters (all of which are
+CJK compatibility ideographs as far as they have been found) may have
+an erroneous decomposition mapping (see F<NormalizationCorrections.txt>).
+Anyhow, this module will neither refer to F<NormalizationCorrections.txt>
+nor provide any specific version of normalization. Therefore this module
+running on an older perl with an older Unicode database may use
+the erroneous decomposition mapping blindly conforming to the Unicode database.
+
+=item Revised definition of canonical composition
+
+In Unicode 4.1.0, the definition D2 of canonical composition (which
+affects NFC and NFKC) has been changed (see Public Review Issue #29
+and recent UAX #15). This module has used the newer definition
+since the version 0.07 (Oct 31, 2001).
+This module will not support the normalization according to the older
+definition, even if the Unicode version implemented by perl is
+lower than 4.1.0.
+
+=back
+
+=head1 AUTHOR
+
+SADAHIRO Tomoyuki <SADAHIRO@cpan.org>
+
+Copyright(C) 2001-2007, SADAHIRO Tomoyuki. Japan. All rights reserved.
+
+This module is free software; you can redistribute it
+and/or modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item http://www.unicode.org/reports/tr15/
+
+Unicode Normalization Forms - UAX #15
+
+=item http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt
+
+Composition Exclusion Table
+
+=item http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt
+
+Derived Normalization Properties
+
+=item http://www.unicode.org/Public/UNIDATA/NormalizationCorrections.txt
+
+Normalization Corrections
+
+=item http://www.unicode.org/review/pr-29.html
+
+Public Review Issue #29: Normalization Issue
+
+=item http://www.unicode.org/notes/tn5/
+
+Canonical Equivalence in Applications - UTN #5
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/Unicode/UCD.pm b/Master/tlpkg/tlperl.straw/lib/Unicode/UCD.pm
new file mode 100755
index 00000000000..c6ee8e05fe2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Unicode/UCD.pm
@@ -0,0 +1,1230 @@
+package Unicode::UCD;
+
+use strict;
+use warnings;
+
+our $VERSION = '0.27';
+
+use Storable qw(dclone);
+
+require Exporter;
+
+our @ISA = qw(Exporter);
+
+our @EXPORT_OK = qw(charinfo
+ charblock charscript
+ charblocks charscripts
+ charinrange
+ general_categories bidi_types
+ compexcl
+ casefold casespec
+ namedseq);
+
+use Carp;
+
+=head1 NAME
+
+Unicode::UCD - Unicode character database
+
+=head1 SYNOPSIS
+
+ use Unicode::UCD 'charinfo';
+ my $charinfo = charinfo($codepoint);
+
+ use Unicode::UCD 'casefold';
+ my $casefold = casefold(0xFB00);
+
+ use Unicode::UCD 'casespec';
+ my $casespec = casespec(0xFB00);
+
+ use Unicode::UCD 'charblock';
+ my $charblock = charblock($codepoint);
+
+ use Unicode::UCD 'charscript';
+ my $charscript = charscript($codepoint);
+
+ use Unicode::UCD 'charblocks';
+ my $charblocks = charblocks();
+
+ use Unicode::UCD 'charscripts';
+ my $charscripts = charscripts();
+
+ use Unicode::UCD qw(charscript charinrange);
+ my $range = charscript($script);
+ print "looks like $script\n" if charinrange($range, $codepoint);
+
+ use Unicode::UCD qw(general_categories bidi_types);
+ my $categories = general_categories();
+ my $types = bidi_types();
+
+ use Unicode::UCD 'compexcl';
+ my $compexcl = compexcl($codepoint);
+
+ use Unicode::UCD 'namedseq';
+ my $namedseq = namedseq($named_sequence_name);
+
+ my $unicode_version = Unicode::UCD::UnicodeVersion();
+
+=head1 DESCRIPTION
+
+The Unicode::UCD module offers a series of functions that
+provide a simple interface to the Unicode
+Character Database.
+
+=head2 code point argument
+
+Some of the functions are called with a I<code point argument>, which is either
+a decimal or a hexadecimal scalar designating a Unicode code point, or C<U+>
+followed by hexadecimals designating a Unicode code point. In other words, if
+you want a code point to be interpreted as a hexadecimal number, you must
+prefix it with either C<0x> or C<U+>, because a string like e.g. C<123> will be
+interpreted as a decimal code point. Also note that Unicode is B<not> limited
+to 16 bits (the number of Unicode code points is open-ended, in theory
+unlimited): you may have more than 4 hexdigits.
+=cut
+
+my $UNICODEFH;
+my $BLOCKSFH;
+my $SCRIPTSFH;
+my $VERSIONFH;
+my $COMPEXCLFH;
+my $CASEFOLDFH;
+my $CASESPECFH;
+my $NAMEDSEQFH;
+
+sub openunicode {
+ my ($rfh, @path) = @_;
+ my $f;
+ unless (defined $$rfh) {
+ for my $d (@INC) {
+ use File::Spec;
+ $f = File::Spec->catfile($d, "unicore", @path);
+ last if open($$rfh, $f);
+ undef $f;
+ }
+ croak __PACKAGE__, ": failed to find ",
+ File::Spec->catfile(@path), " in @INC"
+ unless defined $f;
+ }
+ return $f;
+}
+
+=head2 B<charinfo()>
+
+ use Unicode::UCD 'charinfo';
+
+ my $charinfo = charinfo(0x41);
+
+This returns information about the input L</code point argument>
+as a reference to a hash of fields as defined by the Unicode
+standard. If the L</code point argument> is not assigned in the standard
+(i.e., has the general category C<Cn> meaning C<Unassigned>)
+or is a non-character (meaning it is guaranteed to never be assigned in
+the standard),
+B<undef> is returned.
+
+Fields that aren't applicable to the particular code point argument exist in the
+returned hash, and are empty.
+
+The keys in the hash with the meanings of their values are:
+
+=over
+
+=item B<code>
+
+the input L</code point argument> expressed in hexadecimal, with leading zeros
+added if necessary to make it contain at least four hexdigits
+
+=item B<name>
+
+name of I<code>, all IN UPPER CASE.
+Some control-type code points do not have names.
+This field will be empty for C<Surrogate> and C<Private Use> code points,
+and for the others without a name,
+it will contain a description enclosed in angle brackets, like
+C<E<lt>controlE<gt>>.
+
+
+=item B<category>
+
+The short name of the general category of I<code>.
+This will match one of the keys in the hash returned by L</general_categories()>.
+
+=item B<combining>
+
+the combining class number for I<code> used in the Canonical Ordering Algorithm.
+For Unicode 5.1, this is described in Section 3.11 C<Canonical Ordering Behavior>
+available at
+L<http://www.unicode.org/versions/Unicode5.1.0/>
+
+=item B<bidi>
+
+bidirectional type of I<code>.
+This will match one of the keys in the hash returned by L</bidi_types()>.
+
+=item B<decomposition>
+
+is empty if I<code> has no decomposition; or is one or more codes
+(separated by spaces) that taken in order represent a decomposition for
+I<code>. Each has at least four hexdigits.
+The codes may be preceded by a word enclosed in angle brackets then a space,
+like C<E<lt>compatE<gt> >, giving the type of decomposition
+
+=item B<decimal>
+
+if I<code> is a decimal digit this is its integer numeric value
+
+=item B<digit>
+
+if I<code> represents a whole number, this is its integer numeric value
+
+=item B<numeric>
+
+if I<code> represents a whole or rational number, this is its numeric value.
+Rational values are expressed as a string like C<1/4>.
+
+=item B<mirrored>
+
+C<Y> or C<N> designating if I<code> is mirrored in bidirectional text
+
+=item B<unicode10>
+
+name of I<code> in the Unicode 1.0 standard if one
+existed for this code point and is different from the current name
+
+=item B<comment>
+
+ISO 10646 comment field.
+It appears in parentheses in the ISO 10646 names list,
+or contains an asterisk to indicate there is
+a note for this code point in Annex P of that standard.
+
+=item B<upper>
+
+is empty if there is no single code point uppercase mapping for I<code>;
+otherwise it is that mapping expressed as at least four hexdigits.
+(L</casespec()> should be used in addition to B<charinfo()>
+for case mappings when the calling program can cope with multiple code point
+mappings.)
+
+=item B<lower>
+
+is empty if there is no single code point lowercase mapping for I<code>;
+otherwise it is that mapping expressed as at least four hexdigits.
+(L</casespec()> should be used in addition to B<charinfo()>
+for case mappings when the calling program can cope with multiple code point
+mappings.)
+
+=item B<title>
+
+is empty if there is no single code point titlecase mapping for I<code>;
+otherwise it is that mapping expressed as at least four hexdigits.
+(L</casespec()> should be used in addition to B<charinfo()>
+for case mappings when the calling program can cope with multiple code point
+mappings.)
+
+=item B<block>
+
+block I<code> belongs to (used in \p{In...}).
+See L</Blocks versus Scripts>.
+
+
+=item B<script>
+
+script I<code> belongs to.
+See L</Blocks versus Scripts>.
+
+=back
+
+Note that you cannot do (de)composition and casing based solely on the
+I<decomposition>, I<combining>, I<lower>, I<upper>, and I<title> fields;
+you will need also the L</compexcl()>, and L</casespec()> functions.
+
+=cut
+
+# NB: This function is duplicated in charnames.pm
+sub _getcode {
+ my $arg = shift;
+
+ if ($arg =~ /^[1-9]\d*$/) {
+ return $arg;
+ } elsif ($arg =~ /^(?:[Uu]\+|0[xX])?([[:xdigit:]]+)$/) {
+ return hex($1);
+ }
+
+ return;
+}
+
+# Lingua::KO::Hangul::Util not part of the standard distribution
+# but it will be used if available.
+
+eval { require Lingua::KO::Hangul::Util };
+my $hasHangulUtil = ! $@;
+if ($hasHangulUtil) {
+ Lingua::KO::Hangul::Util->import();
+}
+
+sub hangul_decomp { # internal: called from charinfo
+ if ($hasHangulUtil) {
+ my @tmp = decomposeHangul(shift);
+ return sprintf("%04X %04X", @tmp) if @tmp == 2;
+ return sprintf("%04X %04X %04X", @tmp) if @tmp == 3;
+ }
+ return;
+}
+
+sub hangul_charname { # internal: called from charinfo
+ return sprintf("HANGUL SYLLABLE-%04X", shift);
+}
+
+sub han_charname { # internal: called from charinfo
+ return sprintf("CJK UNIFIED IDEOGRAPH-%04X", shift);
+}
+
+# Overwritten by data in file
+my %first_last = (
+ 'CJK Ideograph Extension A' => [ 0x3400, 0x4DB5 ],
+ 'CJK Ideograph' => [ 0x4E00, 0x9FA5 ],
+ 'CJK Ideograph Extension B' => [ 0x20000, 0x2A6D6 ],
+);
+
+get_charinfo_ranges();
+
+sub get_charinfo_ranges {
+ my @blocks = keys %first_last;
+
+ my $fh;
+ openunicode( \$fh, 'UnicodeData.txt' );
+ if( defined $fh ){
+ while( my $line = <$fh> ){
+ next unless $line =~ /(?:First|Last)/;
+ if( grep{ $line =~ /[^;]+;<$_\s*,\s*(?:First|Last)>/ }@blocks ){
+ my ($number,$block,$type);
+ ($number,$block) = split /;/, $line;
+ $block =~ s/<|>//g;
+ ($block,$type) = split /, /, $block;
+ my $index = $type eq 'First' ? 0 : 1;
+ $first_last{ $block }->[$index] = hex $number;
+ }
+ }
+ }
+}
+
+my @CharinfoRanges = (
+# block name
+# [ first, last, coderef to name, coderef to decompose ],
+# CJK Ideographs Extension A
+ [ @{ $first_last{'CJK Ideograph Extension A'} }, \&han_charname, undef ],
+# CJK Ideographs
+ [ @{ $first_last{'CJK Ideograph'} }, \&han_charname, undef ],
+# Hangul Syllables
+ [ 0xAC00, 0xD7A3, $hasHangulUtil ? \&getHangulName : \&hangul_charname, \&hangul_decomp ],
+# Non-Private Use High Surrogates
+ [ 0xD800, 0xDB7F, undef, undef ],
+# Private Use High Surrogates
+ [ 0xDB80, 0xDBFF, undef, undef ],
+# Low Surrogates
+ [ 0xDC00, 0xDFFF, undef, undef ],
+# The Private Use Area
+ [ 0xE000, 0xF8FF, undef, undef ],
+# CJK Ideographs Extension B
+ [ @{ $first_last{'CJK Ideograph Extension B'} }, \&han_charname, undef ],
+# Plane 15 Private Use Area
+ [ 0xF0000, 0xFFFFD, undef, undef ],
+# Plane 16 Private Use Area
+ [ 0x100000, 0x10FFFD, undef, undef ],
+);
+
+sub charinfo {
+ my $arg = shift;
+ my $code = _getcode($arg);
+ croak __PACKAGE__, "::charinfo: unknown code '$arg'"
+ unless defined $code;
+ my $hexk = sprintf("%06X", $code);
+ my($rcode,$rname,$rdec);
+ foreach my $range (@CharinfoRanges){
+ if ($range->[0] <= $code && $code <= $range->[1]) {
+ $rcode = $hexk;
+ $rcode =~ s/^0+//;
+ $rcode = sprintf("%04X", hex($rcode));
+ $rname = $range->[2] ? $range->[2]->($code) : '';
+ $rdec = $range->[3] ? $range->[3]->($code) : '';
+ $hexk = sprintf("%06X", $range->[0]); # replace by the first
+ last;
+ }
+ }
+ openunicode(\$UNICODEFH, "UnicodeData.txt");
+ if (defined $UNICODEFH) {
+ use Search::Dict 1.02;
+ if (look($UNICODEFH, "$hexk;", { xfrm => sub { $_[0] =~ /^([^;]+);(.+)/; sprintf "%06X;$2", hex($1) } } ) >= 0) {
+ my $line = <$UNICODEFH>;
+ return unless defined $line;
+ chomp $line;
+ my %prop;
+ @prop{qw(
+ code name category
+ combining bidi decomposition
+ decimal digit numeric
+ mirrored unicode10 comment
+ upper lower title
+ )} = split(/;/, $line, -1);
+ $hexk =~ s/^0+//;
+ $hexk = sprintf("%04X", hex($hexk));
+ if ($prop{code} eq $hexk) {
+ $prop{block} = charblock($code);
+ $prop{script} = charscript($code);
+ if(defined $rname){
+ $prop{code} = $rcode;
+ $prop{name} = $rname;
+ $prop{decomposition} = $rdec;
+ }
+ return \%prop;
+ }
+ }
+ }
+ return;
+}
+
+sub _search { # Binary search in a [[lo,hi,prop],[...],...] table.
+ my ($table, $lo, $hi, $code) = @_;
+
+ return if $lo > $hi;
+
+ my $mid = int(($lo+$hi) / 2);
+
+ if ($table->[$mid]->[0] < $code) {
+ if ($table->[$mid]->[1] >= $code) {
+ return $table->[$mid]->[2];
+ } else {
+ _search($table, $mid + 1, $hi, $code);
+ }
+ } elsif ($table->[$mid]->[0] > $code) {
+ _search($table, $lo, $mid - 1, $code);
+ } else {
+ return $table->[$mid]->[2];
+ }
+}
+
+sub charinrange {
+ my ($range, $arg) = @_;
+ my $code = _getcode($arg);
+ croak __PACKAGE__, "::charinrange: unknown code '$arg'"
+ unless defined $code;
+ _search($range, 0, $#$range, $code);
+}
+
+=head2 B<charblock()>
+
+ use Unicode::UCD 'charblock';
+
+ my $charblock = charblock(0x41);
+ my $charblock = charblock(1234);
+ my $charblock = charblock(0x263a);
+ my $charblock = charblock("U+263a");
+
+ my $range = charblock('Armenian');
+
+With a L</code point argument> charblock() returns the I<block> the code point
+belongs to, e.g. C<Basic Latin>.
+If the code point is unassigned, this returns the block it would belong to if
+it were assigned (which it may in future versions of the Unicode Standard).
+
+See also L</Blocks versus Scripts>.
+
+If supplied with an argument that can't be a code point, charblock() tries
+to do the opposite and interpret the argument as a code point block. The
+return value is a I<range>: an anonymous list of lists that contain
+I<start-of-range>, I<end-of-range> code point pairs. You can test whether
+a code point is in a range using the L</charinrange()> function. If the
+argument is not a known code point block, B<undef> is returned.
+
+=cut
+
+my @BLOCKS;
+my %BLOCKS;
+
+sub _charblocks {
+ unless (@BLOCKS) {
+ if (openunicode(\$BLOCKSFH, "Blocks.txt")) {
+ local $_;
+ while (<$BLOCKSFH>) {
+ if (/^([0-9A-F]+)\.\.([0-9A-F]+);\s+(.+)/) {
+ my ($lo, $hi) = (hex($1), hex($2));
+ my $subrange = [ $lo, $hi, $3 ];
+ push @BLOCKS, $subrange;
+ push @{$BLOCKS{$3}}, $subrange;
+ }
+ }
+ close($BLOCKSFH);
+ }
+ }
+}
+
+sub charblock {
+ my $arg = shift;
+
+ _charblocks() unless @BLOCKS;
+
+ my $code = _getcode($arg);
+
+ if (defined $code) {
+ _search(\@BLOCKS, 0, $#BLOCKS, $code);
+ } else {
+ if (exists $BLOCKS{$arg}) {
+ return dclone $BLOCKS{$arg};
+ } else {
+ return;
+ }
+ }
+}
+
+=head2 B<charscript()>
+
+ use Unicode::UCD 'charscript';
+
+ my $charscript = charscript(0x41);
+ my $charscript = charscript(1234);
+ my $charscript = charscript("U+263a");
+
+ my $range = charscript('Thai');
+
+With a L</code point argument> charscript() returns the I<script> the
+code point belongs to, e.g. C<Latin>, C<Greek>, C<Han>.
+If the code point is unassigned, it returns B<undef>
+
+If supplied with an argument that can't be a code point, charscript() tries
+to do the opposite and interpret the argument as a code point script. The
+return value is a I<range>: an anonymous list of lists that contain
+I<start-of-range>, I<end-of-range> code point pairs. You can test whether a
+code point is in a range using the L</charinrange()> function. If the
+argument is not a known code point script, B<undef> is returned.
+
+See also L</Blocks versus Scripts>.
+
+=cut
+
+my @SCRIPTS;
+my %SCRIPTS;
+
+sub _charscripts {
+ unless (@SCRIPTS) {
+ if (openunicode(\$SCRIPTSFH, "Scripts.txt")) {
+ local $_;
+ while (<$SCRIPTSFH>) {
+ if (/^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s+;\s+(\w+)/) {
+ my ($lo, $hi) = (hex($1), $2 ? hex($2) : hex($1));
+ my $script = lc($3);
+ $script =~ s/\b(\w)/uc($1)/ge;
+ my $subrange = [ $lo, $hi, $script ];
+ push @SCRIPTS, $subrange;
+ push @{$SCRIPTS{$script}}, $subrange;
+ }
+ }
+ close($SCRIPTSFH);
+ @SCRIPTS = sort { $a->[0] <=> $b->[0] } @SCRIPTS;
+ }
+ }
+}
+
+sub charscript {
+ my $arg = shift;
+
+ _charscripts() unless @SCRIPTS;
+
+ my $code = _getcode($arg);
+
+ if (defined $code) {
+ _search(\@SCRIPTS, 0, $#SCRIPTS, $code);
+ } else {
+ if (exists $SCRIPTS{$arg}) {
+ return dclone $SCRIPTS{$arg};
+ } else {
+ return;
+ }
+ }
+}
+
+=head2 B<charblocks()>
+
+ use Unicode::UCD 'charblocks';
+
+ my $charblocks = charblocks();
+
+charblocks() returns a reference to a hash with the known block names
+as the keys, and the code point ranges (see L</charblock()>) as the values.
+
+See also L</Blocks versus Scripts>.
+
+=cut
+
+sub charblocks {
+ _charblocks() unless %BLOCKS;
+ return dclone \%BLOCKS;
+}
+
+=head2 B<charscripts()>
+
+ use Unicode::UCD 'charscripts';
+
+ my $charscripts = charscripts();
+
+charscripts() returns a reference to a hash with the known script
+names as the keys, and the code point ranges (see L</charscript()>) as
+the values.
+
+See also L</Blocks versus Scripts>.
+
+=cut
+
+sub charscripts {
+ _charscripts() unless %SCRIPTS;
+ return dclone \%SCRIPTS;
+}
+
+=head2 B<charinrange()>
+
+In addition to using the C<\p{In...}> and C<\P{In...}> constructs, you
+can also test whether a code point is in the I<range> as returned by
+L</charblock()> and L</charscript()> or as the values of the hash returned
+by L</charblocks()> and L</charscripts()> by using charinrange():
+
+ use Unicode::UCD qw(charscript charinrange);
+
+ $range = charscript('Hiragana');
+ print "looks like hiragana\n" if charinrange($range, $codepoint);
+
+=cut
+
+my %GENERAL_CATEGORIES =
+ (
+ 'L' => 'Letter',
+ 'LC' => 'CasedLetter',
+ 'Lu' => 'UppercaseLetter',
+ 'Ll' => 'LowercaseLetter',
+ 'Lt' => 'TitlecaseLetter',
+ 'Lm' => 'ModifierLetter',
+ 'Lo' => 'OtherLetter',
+ 'M' => 'Mark',
+ 'Mn' => 'NonspacingMark',
+ 'Mc' => 'SpacingMark',
+ 'Me' => 'EnclosingMark',
+ 'N' => 'Number',
+ 'Nd' => 'DecimalNumber',
+ 'Nl' => 'LetterNumber',
+ 'No' => 'OtherNumber',
+ 'P' => 'Punctuation',
+ 'Pc' => 'ConnectorPunctuation',
+ 'Pd' => 'DashPunctuation',
+ 'Ps' => 'OpenPunctuation',
+ 'Pe' => 'ClosePunctuation',
+ 'Pi' => 'InitialPunctuation',
+ 'Pf' => 'FinalPunctuation',
+ 'Po' => 'OtherPunctuation',
+ 'S' => 'Symbol',
+ 'Sm' => 'MathSymbol',
+ 'Sc' => 'CurrencySymbol',
+ 'Sk' => 'ModifierSymbol',
+ 'So' => 'OtherSymbol',
+ 'Z' => 'Separator',
+ 'Zs' => 'SpaceSeparator',
+ 'Zl' => 'LineSeparator',
+ 'Zp' => 'ParagraphSeparator',
+ 'C' => 'Other',
+ 'Cc' => 'Control',
+ 'Cf' => 'Format',
+ 'Cs' => 'Surrogate',
+ 'Co' => 'PrivateUse',
+ 'Cn' => 'Unassigned',
+ );
+
+sub general_categories {
+ return dclone \%GENERAL_CATEGORIES;
+}
+
+=head2 B<general_categories()>
+
+ use Unicode::UCD 'general_categories';
+
+ my $categories = general_categories();
+
+This returns a reference to a hash which has short
+general category names (such as C<Lu>, C<Nd>, C<Zs>, C<S>) as keys and long
+names (such as C<UppercaseLetter>, C<DecimalNumber>, C<SpaceSeparator>,
+C<Symbol>) as values. The hash is reversible in case you need to go
+from the long names to the short names. The general category is the
+one returned from
+L</charinfo()> under the C<category> key.
+
+=cut
+
+my %BIDI_TYPES =
+ (
+ 'L' => 'Left-to-Right',
+ 'LRE' => 'Left-to-Right Embedding',
+ 'LRO' => 'Left-to-Right Override',
+ 'R' => 'Right-to-Left',
+ 'AL' => 'Right-to-Left Arabic',
+ 'RLE' => 'Right-to-Left Embedding',
+ 'RLO' => 'Right-to-Left Override',
+ 'PDF' => 'Pop Directional Format',
+ 'EN' => 'European Number',
+ 'ES' => 'European Number Separator',
+ 'ET' => 'European Number Terminator',
+ 'AN' => 'Arabic Number',
+ 'CS' => 'Common Number Separator',
+ 'NSM' => 'Non-Spacing Mark',
+ 'BN' => 'Boundary Neutral',
+ 'B' => 'Paragraph Separator',
+ 'S' => 'Segment Separator',
+ 'WS' => 'Whitespace',
+ 'ON' => 'Other Neutrals',
+ );
+
+=head2 B<bidi_types()>
+
+ use Unicode::UCD 'bidi_types';
+
+ my $categories = bidi_types();
+
+This returns a reference to a hash which has the short
+bidi (bidirectional) type names (such as C<L>, C<R>) as keys and long
+names (such as C<Left-to-Right>, C<Right-to-Left>) as values. The
+hash is reversible in case you need to go from the long names to the
+short names. The bidi type is the one returned from
+L</charinfo()>
+under the C<bidi> key. For the exact meaning of the various bidi classes
+the Unicode TR9 is recommended reading:
+L<http://www.unicode.org/reports/tr9/>
+(as of Unicode 5.0.0)
+
+=cut
+
+sub bidi_types {
+ return dclone \%BIDI_TYPES;
+}
+
+=head2 B<compexcl()>
+
+ use Unicode::UCD 'compexcl';
+
+ my $compexcl = compexcl(0x09dc);
+
+This returns B<true> if the
+L</code point argument> should not be produced by composition normalization,
+B<AND> if that fact is not otherwise determinable from the Unicode data base.
+It currently does not return B<true> if the code point has a decomposition
+consisting of another single code point, nor if its decomposition starts
+with a code point whose combining class is non-zero. Code points that meet
+either of these conditions should also not be produced by composition
+normalization.
+
+It returns B<false> otherwise.
+
+=cut
+
+my %COMPEXCL;
+
+sub _compexcl {
+ unless (%COMPEXCL) {
+ if (openunicode(\$COMPEXCLFH, "CompositionExclusions.txt")) {
+ local $_;
+ while (<$COMPEXCLFH>) {
+ if (/^([0-9A-F]+)\s+\#\s+/) {
+ my $code = hex($1);
+ $COMPEXCL{$code} = undef;
+ }
+ }
+ close($COMPEXCLFH);
+ }
+ }
+}
+
+sub compexcl {
+ my $arg = shift;
+ my $code = _getcode($arg);
+ croak __PACKAGE__, "::compexcl: unknown code '$arg'"
+ unless defined $code;
+
+ _compexcl() unless %COMPEXCL;
+
+ return exists $COMPEXCL{$code};
+}
+
+=head2 B<casefold()>
+
+ use Unicode::UCD 'casefold';
+
+ my $casefold = casefold(0xDF);
+ if (defined $casefold) {
+ my @full_fold_hex = split / /, $casefold->{'full'};
+ my $full_fold_string =
+ join "", map {chr(hex($_))} @full_fold_hex;
+ my @turkic_fold_hex =
+ split / /, ($casefold->{'turkic'} ne "")
+ ? $casefold->{'turkic'}
+ : $casefold->{'full'};
+ my $turkic_fold_string =
+ join "", map {chr(hex($_))} @turkic_fold_hex;
+ }
+ if (defined $casefold && $casefold->{'simple'} ne "") {
+ my $simple_fold_hex = $casefold->{'simple'};
+ my $simple_fold_string = chr(hex($simple_fold_hex));
+ }
+
+This returns the (almost) locale-independent case folding of the
+character specified by the L</code point argument>.
+
+If there is no case folding for that code point, B<undef> is returned.
+
+If there is a case folding for that code point, a reference to a hash
+with the following fields is returned:
+
+=over
+
+=item B<code>
+
+the input L</code point argument> expressed in hexadecimal, with leading zeros
+added if necessary to make it contain at least four hexdigits
+
+=item B<full>
+
+one or more codes (separated by spaces) that taken in order give the
+code points for the case folding for I<code>.
+Each has at least four hexdigits.
+
+=item B<simple>
+
+is empty, or is exactly one code with at least four hexdigits which can be used
+as an alternative case folding when the calling program cannot cope with the
+fold being a sequence of multiple code points. If I<full> is just one code
+point, then I<simple> equals I<full>. If there is no single code point folding
+defined for I<code>, then I<simple> is the empty string. Otherwise, it is an
+inferior, but still better-than-nothing alternative folding to I<full>.
+
+=item B<mapping>
+
+is the same as I<simple> if I<simple> is not empty, and it is the same as I<full>
+otherwise. It can be considered to be the simplest possible folding for
+I<code>. It is defined primarily for backwards compatibility.
+
+=item B<status>
+
+is C<C> (for C<common>) if the best possible fold is a single code point
+(I<simple> equals I<full> equals I<mapping>). It is C<S> if there are distinct
+folds, I<simple> and I<full> (I<mapping> equals I<simple>). And it is C<F> if
+there only a I<full> fold (I<mapping> equals I<full>; I<simple> is empty). Note
+that this
+describes the contents of I<mapping>. It is defined primarily for backwards
+compatibility.
+
+On versions 3.1 and earlier of Unicode, I<status> can also be
+C<I> which is the same as C<C> but is a special case for dotted uppercase I and
+dotless lowercase i:
+
+=over
+
+=item B<*>
+
+If you use this C<I> mapping, the result is case-insensitive,
+but dotless and dotted I's are not distinguished
+
+=item B<*>
+
+If you exclude this C<I> mapping, the result is not fully case-insensitive, but
+dotless and dotted I's are distinguished
+
+=back
+
+=item B<turkic>
+
+contains any special folding for Turkic languages. For versions of Unicode
+starting with 3.2, this field is empty unless I<code> has a different folding
+in Turkic languages, in which case it is one or more codes (separated by
+spaces) that taken in order give the code points for the case folding for
+I<code> in those languages.
+Each code has at least four hexdigits.
+Note that this folding does not maintain canonical equivalence without
+additional processing.
+
+For versions of Unicode 3.1 and earlier, this field is empty unless there is a
+special folding for Turkic languages, in which case I<status> is C<I>, and
+I<mapping>, I<full>, I<simple>, and I<turkic> are all equal.
+
+=back
+
+Programs that want complete generality and the best folding results should use
+the folding contained in the I<full> field. But note that the fold for some
+code points will be a sequence of multiple code points.
+
+Programs that can't cope with the fold mapping being multiple code points can
+use the folding contained in the I<simple> field, with the loss of some
+generality. In Unicode 5.1, about 7% of the defined foldings have no single
+code point folding.
+
+The I<mapping> and I<status> fields are provided for backwards compatibility for
+existing programs. They contain the same values as in previous versions of
+this function.
+
+Locale is not completely independent. The I<turkic> field contains results to
+use when the locale is a Turkic language.
+
+For more information about case mappings see
+L<http://www.unicode.org/unicode/reports/tr21>
+
+=cut
+
+my %CASEFOLD;
+
+sub _casefold {
+ unless (%CASEFOLD) {
+ if (openunicode(\$CASEFOLDFH, "CaseFolding.txt")) {
+ local $_;
+ while (<$CASEFOLDFH>) {
+ if (/^([0-9A-F]+); ([CFIST]); ([0-9A-F]+(?: [0-9A-F]+)*);/) {
+ my $code = hex($1);
+ $CASEFOLD{$code}{'code'} = $1;
+ $CASEFOLD{$code}{'turkic'} = "" unless
+ defined $CASEFOLD{$code}{'turkic'};
+ if ($2 eq 'C' || $2 eq 'I') { # 'I' is only on 3.1 and
+ # earlier Unicodes
+ # Both entries there (I
+ # only checked 3.1) are
+ # the same as C, and
+ # there are no other
+ # entries for those
+ # codepoints, so treat
+ # as if C, but override
+ # the turkic one for
+ # 'I'.
+ $CASEFOLD{$code}{'status'} = $2;
+ $CASEFOLD{$code}{'full'} = $CASEFOLD{$code}{'simple'} =
+ $CASEFOLD{$code}{'mapping'} = $3;
+ $CASEFOLD{$code}{'turkic'} = $3 if $2 eq 'I';
+ } elsif ($2 eq 'F') {
+ $CASEFOLD{$code}{'full'} = $3;
+ unless (defined $CASEFOLD{$code}{'simple'}) {
+ $CASEFOLD{$code}{'simple'} = "";
+ $CASEFOLD{$code}{'mapping'} = $3;
+ $CASEFOLD{$code}{'status'} = $2;
+ }
+ } elsif ($2 eq 'S') {
+
+
+ # There can't be a simple without a full, and simple
+ # overrides all but full
+
+ $CASEFOLD{$code}{'simple'} = $3;
+ $CASEFOLD{$code}{'mapping'} = $3;
+ $CASEFOLD{$code}{'status'} = $2;
+ } elsif ($2 eq 'T') {
+ $CASEFOLD{$code}{'turkic'} = $3;
+ } # else can't happen because only [CIFST] are possible
+ }
+ }
+ close($CASEFOLDFH);
+ }
+ }
+}
+
+sub casefold {
+ my $arg = shift;
+ my $code = _getcode($arg);
+ croak __PACKAGE__, "::casefold: unknown code '$arg'"
+ unless defined $code;
+
+ _casefold() unless %CASEFOLD;
+
+ return $CASEFOLD{$code};
+}
+
+=head2 B<casespec()>
+
+ use Unicode::UCD 'casespec';
+
+ my $casespec = casespec(0xFB00);
+
+This returns the potentially locale-dependent case mappings of the L</code point
+argument>. The mappings may be longer than a single code point (which the basic
+Unicode case mappings as returned by L</charinfo()> never are).
+
+If there are no case mappings for the L</code point argument>, or if all three
+possible mappings (I<lower>, I<title> and I<upper>) result in single code
+points and are locale independent and unconditional, B<undef> is returned
+(which means that the case mappings, if any, for the code point are those
+returned by L</charinfo()>).
+
+Otherwise, a reference to a hash giving the mappings (or a reference to a hash
+of such hashes, explained below) is returned with the following keys and their
+meanings:
+
+The keys in the bottom layer hash with the meanings of their values are:
+
+=over
+
+=item B<code>
+
+the input L</code point argument> expressed in hexadecimal, with leading zeros
+added if necessary to make it contain at least four hexdigits
+
+=item B<lower>
+
+one or more codes (separated by spaces) that taken in order give the
+code points for the lower case of I<code>.
+Each has at least four hexdigits.
+
+=item B<title>
+
+one or more codes (separated by spaces) that taken in order give the
+code points for the title case of I<code>.
+Each has at least four hexdigits.
+
+=item B<lower>
+
+one or more codes (separated by spaces) that taken in order give the
+code points for the upper case of I<code>.
+Each has at least four hexdigits.
+
+=item B<condition>
+
+the conditions for the mappings to be valid.
+If B<undef>, the mappings are always valid.
+When defined, this field is a list of conditions,
+all of which must be true for the mappings to be valid.
+The list consists of one or more
+I<locales> (see below)
+and/or I<contexts> (explained in the next paragraph),
+separated by spaces.
+(Other than as used to separate elements, spaces are to be ignored.)
+Case distinctions in the condition list are not significant.
+Conditions preceded by "NON_" represent the negation of the condition.
+
+A I<context> is one of those defined in the Unicode standard.
+For Unicode 5.1, they are defined in Section 3.13 C<Default Case Operations>
+available at
+L<http://www.unicode.org/versions/Unicode5.1.0/>.
+These are for context-sensitive casing.
+
+=back
+
+The hash described above is returned for locale-independent casing, where
+at least one of the mappings has length longer than one. If B<undef> is
+returned, the code point may have mappings, but if so, all are length one,
+and are returned by L</charinfo()>.
+Note that when this function does return a value, it will be for the complete
+set of mappings for a code point, even those whose length is one.
+
+If there are additional casing rules that apply only in certain locales,
+an additional key for each will be defined in the returned hash. Each such key
+will be its locale name, defined as a 2-letter ISO 3166 country code, possibly
+followed by a "_" and a 2-letter ISO language code (possibly followed by a "_"
+and a variant code). You can find the lists of all possible locales, see
+L<Locale::Country> and L<Locale::Language>.
+(In Unicode 5.1, the only locales returned by this function
+are C<lt>, C<tr>, and C<az>.)
+
+Each locale key is a reference to a hash that has the form above, and gives
+the casing rules for that particular locale, which take precedence over the
+locale-independent ones when in that locale.
+
+If the only casing for a code point is locale-dependent, then the returned
+hash will not have any of the base keys, like C<code>, C<upper>, etc., but
+will contain only locale keys.
+
+For more information about case mappings see
+L<http://www.unicode.org/unicode/reports/tr21/>
+
+=cut
+
+my %CASESPEC;
+
+sub _casespec {
+ unless (%CASESPEC) {
+ if (openunicode(\$CASESPECFH, "SpecialCasing.txt")) {
+ local $_;
+ while (<$CASESPECFH>) {
+ if (/^([0-9A-F]+); ([0-9A-F]+(?: [0-9A-F]+)*)?; ([0-9A-F]+(?: [0-9A-F]+)*)?; ([0-9A-F]+(?: [0-9A-F]+)*)?; (\w+(?: \w+)*)?/) {
+ my ($hexcode, $lower, $title, $upper, $condition) =
+ ($1, $2, $3, $4, $5);
+ my $code = hex($hexcode);
+ if (exists $CASESPEC{$code}) {
+ if (exists $CASESPEC{$code}->{code}) {
+ my ($oldlower,
+ $oldtitle,
+ $oldupper,
+ $oldcondition) =
+ @{$CASESPEC{$code}}{qw(lower
+ title
+ upper
+ condition)};
+ if (defined $oldcondition) {
+ my ($oldlocale) =
+ ($oldcondition =~ /^([a-z][a-z](?:_\S+)?)/);
+ delete $CASESPEC{$code};
+ $CASESPEC{$code}->{$oldlocale} =
+ { code => $hexcode,
+ lower => $oldlower,
+ title => $oldtitle,
+ upper => $oldupper,
+ condition => $oldcondition };
+ }
+ }
+ my ($locale) =
+ ($condition =~ /^([a-z][a-z](?:_\S+)?)/);
+ $CASESPEC{$code}->{$locale} =
+ { code => $hexcode,
+ lower => $lower,
+ title => $title,
+ upper => $upper,
+ condition => $condition };
+ } else {
+ $CASESPEC{$code} =
+ { code => $hexcode,
+ lower => $lower,
+ title => $title,
+ upper => $upper,
+ condition => $condition };
+ }
+ }
+ }
+ close($CASESPECFH);
+ }
+ }
+}
+
+sub casespec {
+ my $arg = shift;
+ my $code = _getcode($arg);
+ croak __PACKAGE__, "::casespec: unknown code '$arg'"
+ unless defined $code;
+
+ _casespec() unless %CASESPEC;
+
+ return ref $CASESPEC{$code} ? dclone $CASESPEC{$code} : $CASESPEC{$code};
+}
+
+=head2 B<namedseq()>
+
+ use Unicode::UCD 'namedseq';
+
+ my $namedseq = namedseq("KATAKANA LETTER AINU P");
+ my @namedseq = namedseq("KATAKANA LETTER AINU P");
+ my %namedseq = namedseq();
+
+If used with a single argument in a scalar context, returns the string
+consisting of the code points of the named sequence, or B<undef> if no
+named sequence by that name exists. If used with a single argument in
+a list context, it returns the list of the ordinals of the code points. If used
+with no
+arguments in a list context, returns a hash with the names of the
+named sequences as the keys and the named sequences as strings as
+the values. Otherwise, it returns B<undef> or an empty list depending
+on the context.
+
+This function only operates on officially approved (not provisional) named
+sequences.
+
+=cut
+
+my %NAMEDSEQ;
+
+sub _namedseq {
+ unless (%NAMEDSEQ) {
+ if (openunicode(\$NAMEDSEQFH, "NamedSequences.txt")) {
+ local $_;
+ while (<$NAMEDSEQFH>) {
+ if (/^(.+)\s*;\s*([0-9A-F]+(?: [0-9A-F]+)*)$/) {
+ my ($n, $s) = ($1, $2);
+ my @s = map { chr(hex($_)) } split(' ', $s);
+ $NAMEDSEQ{$n} = join("", @s);
+ }
+ }
+ close($NAMEDSEQFH);
+ }
+ }
+}
+
+sub namedseq {
+ _namedseq() unless %NAMEDSEQ;
+ my $wantarray = wantarray();
+ if (defined $wantarray) {
+ if ($wantarray) {
+ if (@_ == 0) {
+ return %NAMEDSEQ;
+ } elsif (@_ == 1) {
+ my $s = $NAMEDSEQ{ $_[0] };
+ return defined $s ? map { ord($_) } split('', $s) : ();
+ }
+ } elsif (@_ == 1) {
+ return $NAMEDSEQ{ $_[0] };
+ }
+ }
+ return;
+}
+
+=head2 Unicode::UCD::UnicodeVersion
+
+This returns the version of the Unicode Character Database, in other words, the
+version of the Unicode standard the database implements. The version is a
+string of numbers delimited by dots (C<'.'>).
+
+=cut
+
+my $UNICODEVERSION;
+
+sub UnicodeVersion {
+ unless (defined $UNICODEVERSION) {
+ openunicode(\$VERSIONFH, "version");
+ chomp($UNICODEVERSION = <$VERSIONFH>);
+ close($VERSIONFH);
+ croak __PACKAGE__, "::VERSION: strange version '$UNICODEVERSION'"
+ unless $UNICODEVERSION =~ /^\d+(?:\.\d+)+$/;
+ }
+ return $UNICODEVERSION;
+}
+
+=head2 B<Blocks versus Scripts>
+
+The difference between a block and a script is that scripts are closer
+to the linguistic notion of a set of code points required to present
+languages, while block is more of an artifact of the Unicode code point
+numbering and separation into blocks of (mostly) 256 code points.
+
+For example the Latin B<script> is spread over several B<blocks>, such
+as C<Basic Latin>, C<Latin 1 Supplement>, C<Latin Extended-A>, and
+C<Latin Extended-B>. On the other hand, the Latin script does not
+contain all the characters of the C<Basic Latin> block (also known as
+ASCII): it includes only the letters, and not, for example, the digits
+or the punctuation.
+
+For blocks see L<http://www.unicode.org/Public/UNIDATA/Blocks.txt>
+
+For scripts see UTR #24: L<http://www.unicode.org/unicode/reports/tr24/>
+
+=head2 B<Matching Scripts and Blocks>
+
+Scripts are matched with the regular-expression construct
+C<\p{...}> (e.g. C<\p{Tibetan}> matches characters of the Tibetan script),
+while C<\p{In...}> is used for blocks (e.g. C<\p{InTibetan}> matches
+any of the 256 code points in the Tibetan block).
+
+
+=head2 Implementation Note
+
+The first use of charinfo() opens a read-only filehandle to the Unicode
+Character Database (the database is included in the Perl distribution).
+The filehandle is then kept open for further queries. In other words,
+if you are wondering where one of your filehandles went, that's where.
+
+=head1 BUGS
+
+Does not yet support EBCDIC platforms.
+
+L</compexcl()> should give a complete list of excluded code points.
+
+=head1 AUTHOR
+
+Jarkko Hietaniemi
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/WWW/RobotRules.pm b/Master/tlpkg/tlperl.straw/lib/WWW/RobotRules.pm
new file mode 100755
index 00000000000..0b9fda3b768
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/WWW/RobotRules.pm
@@ -0,0 +1,445 @@
+package WWW::RobotRules;
+
+$VERSION = "5.832";
+sub Version { $VERSION; }
+
+use strict;
+use URI ();
+
+
+
+sub new {
+ my($class, $ua) = @_;
+
+ # This ugly hack is needed to ensure backwards compatibility.
+ # The "WWW::RobotRules" class is now really abstract.
+ $class = "WWW::RobotRules::InCore" if $class eq "WWW::RobotRules";
+
+ my $self = bless { }, $class;
+ $self->agent($ua);
+ $self;
+}
+
+
+sub parse {
+ my($self, $robot_txt_uri, $txt, $fresh_until) = @_;
+ $robot_txt_uri = URI->new("$robot_txt_uri");
+ my $netloc = $robot_txt_uri->host . ":" . $robot_txt_uri->port;
+
+ $self->clear_rules($netloc);
+ $self->fresh_until($netloc, $fresh_until || (time + 365*24*3600));
+
+ my $ua;
+ my $is_me = 0; # 1 iff this record is for me
+ my $is_anon = 0; # 1 iff this record is for *
+ my $seen_disallow = 0; # watch for missing record separators
+ my @me_disallowed = (); # rules disallowed for me
+ my @anon_disallowed = (); # rules disallowed for *
+
+ # blank lines are significant, so turn CRLF into LF to avoid generating
+ # false ones
+ $txt =~ s/\015\012/\012/g;
+
+ # split at \012 (LF) or \015 (CR) (Mac text files have just CR for EOL)
+ for(split(/[\012\015]/, $txt)) {
+
+ # Lines containing only a comment are discarded completely, and
+ # therefore do not indicate a record boundary.
+ next if /^\s*\#/;
+
+ s/\s*\#.*//; # remove comments at end-of-line
+
+ if (/^\s*$/) { # blank line
+ last if $is_me; # That was our record. No need to read the rest.
+ $is_anon = 0;
+ $seen_disallow = 0;
+ }
+ elsif (/^\s*User-Agent\s*:\s*(.*)/i) {
+ $ua = $1;
+ $ua =~ s/\s+$//;
+
+ if ($seen_disallow) {
+ # treat as start of a new record
+ $seen_disallow = 0;
+ last if $is_me; # That was our record. No need to read the rest.
+ $is_anon = 0;
+ }
+
+ if ($is_me) {
+ # This record already had a User-agent that
+ # we matched, so just continue.
+ }
+ elsif ($ua eq '*') {
+ $is_anon = 1;
+ }
+ elsif($self->is_me($ua)) {
+ $is_me = 1;
+ }
+ }
+ elsif (/^\s*Disallow\s*:\s*(.*)/i) {
+ unless (defined $ua) {
+ warn "RobotRules <$robot_txt_uri>: Disallow without preceding User-agent\n" if $^W;
+ $is_anon = 1; # assume that User-agent: * was intended
+ }
+ my $disallow = $1;
+ $disallow =~ s/\s+$//;
+ $seen_disallow = 1;
+ if (length $disallow) {
+ my $ignore;
+ eval {
+ my $u = URI->new_abs($disallow, $robot_txt_uri);
+ $ignore++ if $u->scheme ne $robot_txt_uri->scheme;
+ $ignore++ if lc($u->host) ne lc($robot_txt_uri->host);
+ $ignore++ if $u->port ne $robot_txt_uri->port;
+ $disallow = $u->path_query;
+ $disallow = "/" unless length $disallow;
+ };
+ next if $@;
+ next if $ignore;
+ }
+
+ if ($is_me) {
+ push(@me_disallowed, $disallow);
+ }
+ elsif ($is_anon) {
+ push(@anon_disallowed, $disallow);
+ }
+ }
+ elsif (/\S\s*:/) {
+ # ignore
+ }
+ else {
+ warn "RobotRules <$robot_txt_uri>: Malformed record: <$_>\n" if $^W;
+ }
+ }
+
+ if ($is_me) {
+ $self->push_rules($netloc, @me_disallowed);
+ }
+ else {
+ $self->push_rules($netloc, @anon_disallowed);
+ }
+}
+
+
+#
+# Returns TRUE if the given name matches the
+# name of this robot
+#
+sub is_me {
+ my($self, $ua_line) = @_;
+ my $me = $self->agent;
+
+ # See whether my short-name is a substring of the
+ # "User-Agent: ..." line that we were passed:
+
+ if(index(lc($me), lc($ua_line)) >= 0) {
+ return 1;
+ }
+ else {
+ return '';
+ }
+}
+
+
+sub allowed {
+ my($self, $uri) = @_;
+ $uri = URI->new("$uri");
+
+ return 1 unless $uri->scheme eq 'http' or $uri->scheme eq 'https';
+ # Robots.txt applies to only those schemes.
+
+ my $netloc = $uri->host . ":" . $uri->port;
+
+ my $fresh_until = $self->fresh_until($netloc);
+ return -1 if !defined($fresh_until) || $fresh_until < time;
+
+ my $str = $uri->path_query;
+ my $rule;
+ for $rule ($self->rules($netloc)) {
+ return 1 unless length $rule;
+ return 0 if index($str, $rule) == 0;
+ }
+ return 1;
+}
+
+
+# The following methods must be provided by the subclass.
+sub agent;
+sub visit;
+sub no_visits;
+sub last_visits;
+sub fresh_until;
+sub push_rules;
+sub clear_rules;
+sub rules;
+sub dump;
+
+
+
+package WWW::RobotRules::InCore;
+
+use vars qw(@ISA);
+@ISA = qw(WWW::RobotRules);
+
+
+
+sub agent {
+ my ($self, $name) = @_;
+ my $old = $self->{'ua'};
+ if ($name) {
+ # Strip it so that it's just the short name.
+ # I.e., "FooBot" => "FooBot"
+ # "FooBot/1.2" => "FooBot"
+ # "FooBot/1.2 [http://foobot.int; foo@bot.int]" => "FooBot"
+
+ $name = $1 if $name =~ m/(\S+)/; # get first word
+ $name =~ s!/.*!!; # get rid of version
+ unless ($old && $old eq $name) {
+ delete $self->{'loc'}; # all old info is now stale
+ $self->{'ua'} = $name;
+ }
+ }
+ $old;
+}
+
+
+sub visit {
+ my($self, $netloc, $time) = @_;
+ return unless $netloc;
+ $time ||= time;
+ $self->{'loc'}{$netloc}{'last'} = $time;
+ my $count = \$self->{'loc'}{$netloc}{'count'};
+ if (!defined $$count) {
+ $$count = 1;
+ }
+ else {
+ $$count++;
+ }
+}
+
+
+sub no_visits {
+ my ($self, $netloc) = @_;
+ $self->{'loc'}{$netloc}{'count'};
+}
+
+
+sub last_visit {
+ my ($self, $netloc) = @_;
+ $self->{'loc'}{$netloc}{'last'};
+}
+
+
+sub fresh_until {
+ my ($self, $netloc, $fresh_until) = @_;
+ my $old = $self->{'loc'}{$netloc}{'fresh'};
+ if (defined $fresh_until) {
+ $self->{'loc'}{$netloc}{'fresh'} = $fresh_until;
+ }
+ $old;
+}
+
+
+sub push_rules {
+ my($self, $netloc, @rules) = @_;
+ push (@{$self->{'loc'}{$netloc}{'rules'}}, @rules);
+}
+
+
+sub clear_rules {
+ my($self, $netloc) = @_;
+ delete $self->{'loc'}{$netloc}{'rules'};
+}
+
+
+sub rules {
+ my($self, $netloc) = @_;
+ if (defined $self->{'loc'}{$netloc}{'rules'}) {
+ return @{$self->{'loc'}{$netloc}{'rules'}};
+ }
+ else {
+ return ();
+ }
+}
+
+
+sub dump
+{
+ my $self = shift;
+ for (keys %$self) {
+ next if $_ eq 'loc';
+ print "$_ = $self->{$_}\n";
+ }
+ for (keys %{$self->{'loc'}}) {
+ my @rules = $self->rules($_);
+ print "$_: ", join("; ", @rules), "\n";
+ }
+}
+
+
+1;
+
+__END__
+
+
+# Bender: "Well, I don't have anything else
+# planned for today. Let's get drunk!"
+
+=head1 NAME
+
+WWW::RobotRules - database of robots.txt-derived permissions
+
+=head1 SYNOPSIS
+
+ use WWW::RobotRules;
+ my $rules = WWW::RobotRules->new('MOMspider/1.0');
+
+ use LWP::Simple qw(get);
+
+ {
+ my $url = "http://some.place/robots.txt";
+ my $robots_txt = get $url;
+ $rules->parse($url, $robots_txt) if defined $robots_txt;
+ }
+
+ {
+ my $url = "http://some.other.place/robots.txt";
+ my $robots_txt = get $url;
+ $rules->parse($url, $robots_txt) if defined $robots_txt;
+ }
+
+ # Now we can check if a URL is valid for those servers
+ # whose "robots.txt" files we've gotten and parsed:
+ if($rules->allowed($url)) {
+ $c = get $url;
+ ...
+ }
+
+=head1 DESCRIPTION
+
+This module parses F</robots.txt> files as specified in
+"A Standard for Robot Exclusion", at
+<http://www.robotstxt.org/wc/norobots.html>
+Webmasters can use the F</robots.txt> file to forbid conforming
+robots from accessing parts of their web site.
+
+The parsed files are kept in a WWW::RobotRules object, and this object
+provides methods to check if access to a given URL is prohibited. The
+same WWW::RobotRules object can be used for one or more parsed
+F</robots.txt> files on any number of hosts.
+
+The following methods are provided:
+
+=over 4
+
+=item $rules = WWW::RobotRules->new($robot_name)
+
+This is the constructor for WWW::RobotRules objects. The first
+argument given to new() is the name of the robot.
+
+=item $rules->parse($robot_txt_url, $content, $fresh_until)
+
+The parse() method takes as arguments the URL that was used to
+retrieve the F</robots.txt> file, and the contents of the file.
+
+=item $rules->allowed($uri)
+
+Returns TRUE if this robot is allowed to retrieve this URL.
+
+=item $rules->agent([$name])
+
+Get/set the agent name. NOTE: Changing the agent name will clear the robots.txt
+rules and expire times out of the cache.
+
+=back
+
+=head1 ROBOTS.TXT
+
+The format and semantics of the "/robots.txt" file are as follows
+(this is an edited abstract of
+<http://www.robotstxt.org/wc/norobots.html>):
+
+The file consists of one or more records separated by one or more
+blank lines. Each record contains lines of the form
+
+ <field-name>: <value>
+
+The field name is case insensitive. Text after the '#' character on a
+line is ignored during parsing. This is used for comments. The
+following <field-names> can be used:
+
+=over 3
+
+=item User-Agent
+
+The value of this field is the name of the robot the record is
+describing access policy for. If more than one I<User-Agent> field is
+present the record describes an identical access policy for more than
+one robot. At least one field needs to be present per record. If the
+value is '*', the record describes the default access policy for any
+robot that has not not matched any of the other records.
+
+The I<User-Agent> fields must occur before the I<Disallow> fields. If a
+record contains a I<User-Agent> field after a I<Disallow> field, that
+constitutes a malformed record. This parser will assume that a blank
+line should have been placed before that I<User-Agent> field, and will
+break the record into two. All the fields before the I<User-Agent> field
+will constitute a record, and the I<User-Agent> field will be the first
+field in a new record.
+
+=item Disallow
+
+The value of this field specifies a partial URL that is not to be
+visited. This can be a full path, or a partial path; any URL that
+starts with this value will not be retrieved
+
+=back
+
+Unrecognized records are ignored.
+
+=head1 ROBOTS.TXT EXAMPLES
+
+The following example "/robots.txt" file specifies that no robots
+should visit any URL starting with "/cyberworld/map/" or "/tmp/":
+
+ User-agent: *
+ Disallow: /cyberworld/map/ # This is an infinite virtual URL space
+ Disallow: /tmp/ # these will soon disappear
+
+This example "/robots.txt" file specifies that no robots should visit
+any URL starting with "/cyberworld/map/", except the robot called
+"cybermapper":
+
+ User-agent: *
+ Disallow: /cyberworld/map/ # This is an infinite virtual URL space
+
+ # Cybermapper knows where to go.
+ User-agent: cybermapper
+ Disallow:
+
+This example indicates that no robots should visit this site further:
+
+ # go away
+ User-agent: *
+ Disallow: /
+
+This is an example of a malformed robots.txt file.
+
+ # robots.txt for ancientcastle.example.com
+ # I've locked myself away.
+ User-agent: *
+ Disallow: /
+ # The castle is your home now, so you can go anywhere you like.
+ User-agent: Belle
+ Disallow: /west-wing/ # except the west wing!
+ # It's good to be the Prince...
+ User-agent: Beast
+ Disallow:
+
+This file is missing the required blank lines between records.
+However, the intention is clear.
+
+=head1 SEE ALSO
+
+L<LWP::RobotUA>, L<WWW::RobotRules::AnyDBM_File>
diff --git a/Master/tlpkg/tlperl.straw/lib/WWW/RobotRules/AnyDBM_File.pm b/Master/tlpkg/tlperl.straw/lib/WWW/RobotRules/AnyDBM_File.pm
new file mode 100755
index 00000000000..415a3239a88
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/WWW/RobotRules/AnyDBM_File.pm
@@ -0,0 +1,170 @@
+package WWW::RobotRules::AnyDBM_File;
+
+require WWW::RobotRules;
+@ISA = qw(WWW::RobotRules);
+$VERSION = "5.810";
+
+use Carp ();
+use AnyDBM_File;
+use Fcntl;
+use strict;
+
+=head1 NAME
+
+WWW::RobotRules::AnyDBM_File - Persistent RobotRules
+
+=head1 SYNOPSIS
+
+ require WWW::RobotRules::AnyDBM_File;
+ require LWP::RobotUA;
+
+ # Create a robot useragent that uses a diskcaching RobotRules
+ my $rules = new WWW::RobotRules::AnyDBM_File 'my-robot/1.0', 'cachefile';
+ my $ua = new WWW::RobotUA 'my-robot/1.0', 'me@foo.com', $rules;
+
+ # Then just use $ua as usual
+ $res = $ua->request($req);
+
+=head1 DESCRIPTION
+
+This is a subclass of I<WWW::RobotRules> that uses the AnyDBM_File
+package to implement persistent diskcaching of F<robots.txt> and host
+visit information.
+
+The constructor (the new() method) takes an extra argument specifying
+the name of the DBM file to use. If the DBM file already exists, then
+you can specify undef as agent name as the name can be obtained from
+the DBM database.
+
+=cut
+
+sub new
+{
+ my ($class, $ua, $file) = @_;
+ Carp::croak('WWW::RobotRules::AnyDBM_File filename required') unless $file;
+
+ my $self = bless { }, $class;
+ $self->{'filename'} = $file;
+ tie %{$self->{'dbm'}}, 'AnyDBM_File', $file, O_CREAT|O_RDWR, 0640
+ or Carp::croak("Can't open $file: $!");
+
+ if ($ua) {
+ $self->agent($ua);
+ }
+ else {
+ # Try to obtain name from DBM file
+ $ua = $self->{'dbm'}{"|ua-name|"};
+ Carp::croak("No agent name specified") unless $ua;
+ }
+
+ $self;
+}
+
+sub agent {
+ my($self, $newname) = @_;
+ my $old = $self->{'dbm'}{"|ua-name|"};
+ if (defined $newname) {
+ $newname =~ s!/?\s*\d+.\d+\s*$!!; # loose version
+ unless ($old && $old eq $newname) {
+ # Old info is now stale.
+ my $file = $self->{'filename'};
+ untie %{$self->{'dbm'}};
+ tie %{$self->{'dbm'}}, 'AnyDBM_File', $file, O_TRUNC|O_RDWR, 0640;
+ %{$self->{'dbm'}} = ();
+ $self->{'dbm'}{"|ua-name|"} = $newname;
+ }
+ }
+ $old;
+}
+
+sub no_visits {
+ my ($self, $netloc) = @_;
+ my $t = $self->{'dbm'}{"$netloc|vis"};
+ return 0 unless $t;
+ (split(/;\s*/, $t))[0];
+}
+
+sub last_visit {
+ my ($self, $netloc) = @_;
+ my $t = $self->{'dbm'}{"$netloc|vis"};
+ return undef unless $t;
+ (split(/;\s*/, $t))[1];
+}
+
+sub fresh_until {
+ my ($self, $netloc, $fresh) = @_;
+ my $old = $self->{'dbm'}{"$netloc|exp"};
+ if ($old) {
+ $old =~ s/;.*//; # remove cleartext
+ }
+ if (defined $fresh) {
+ $fresh .= "; " . localtime($fresh);
+ $self->{'dbm'}{"$netloc|exp"} = $fresh;
+ }
+ $old;
+}
+
+sub visit {
+ my($self, $netloc, $time) = @_;
+ $time ||= time;
+
+ my $count = 0;
+ my $old = $self->{'dbm'}{"$netloc|vis"};
+ if ($old) {
+ my $last;
+ ($count,$last) = split(/;\s*/, $old);
+ $time = $last if $last > $time;
+ }
+ $count++;
+ $self->{'dbm'}{"$netloc|vis"} = "$count; $time; " . localtime($time);
+}
+
+sub push_rules {
+ my($self, $netloc, @rules) = @_;
+ my $cnt = 1;
+ $cnt++ while $self->{'dbm'}{"$netloc|r$cnt"};
+
+ foreach (@rules) {
+ $self->{'dbm'}{"$netloc|r$cnt"} = $_;
+ $cnt++;
+ }
+}
+
+sub clear_rules {
+ my($self, $netloc) = @_;
+ my $cnt = 1;
+ while ($self->{'dbm'}{"$netloc|r$cnt"}) {
+ delete $self->{'dbm'}{"$netloc|r$cnt"};
+ $cnt++;
+ }
+}
+
+sub rules {
+ my($self, $netloc) = @_;
+ my @rules = ();
+ my $cnt = 1;
+ while (1) {
+ my $rule = $self->{'dbm'}{"$netloc|r$cnt"};
+ last unless $rule;
+ push(@rules, $rule);
+ $cnt++;
+ }
+ @rules;
+}
+
+sub dump
+{
+}
+
+1;
+
+=head1 SEE ALSO
+
+L<WWW::RobotRules>, L<LWP::RobotUA>
+
+=head1 AUTHORS
+
+Hakan Ardo E<lt>hakan@munin.ub2.lu.se>, Gisle Aas E<lt>aas@sn.no>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/XSLoader.pm b/Master/tlpkg/tlperl.straw/lib/XSLoader.pm
new file mode 100755
index 00000000000..98ed299d8b3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/XSLoader.pm
@@ -0,0 +1,358 @@
+# Generated from XSLoader.pm.PL (resolved %Config::Config value)
+
+package XSLoader;
+
+$VERSION = "0.10";
+
+#use strict;
+
+# enable debug/trace messages from DynaLoader perl code
+# $dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug;
+
+ my $dl_dlext = 'dll';
+
+package DynaLoader;
+
+# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here.
+# NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB
+boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) &&
+ !defined(&dl_error);
+package XSLoader;
+
+sub load {
+ package DynaLoader;
+
+ die q{XSLoader::load('Your::Module', $Your::Module::VERSION)} unless @_;
+
+ my($module) = $_[0];
+
+ # work with static linking too
+ my $boots = "$module\::bootstrap";
+ goto &$boots if defined &$boots;
+
+ goto retry unless $module and defined &dl_load_file;
+
+ my @modparts = split(/::/,$module);
+ my $modfname = $modparts[-1];
+
+ my $modpname = join('/',@modparts);
+ my $modlibname = (caller())[1];
+ my $c = @modparts;
+ $modlibname =~ s,[\\/][^\\/]+$,, while $c--; # Q&D basename
+ my $file = "$modlibname/auto/$modpname/$modfname.$dl_dlext";
+
+# print STDERR "XSLoader::load for $module ($file)\n" if $dl_debug;
+
+ my $bs = $file;
+ $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library
+
+ if (-s $bs) { # only read file if it's not empty
+# print STDERR "BS: $bs ($^O, $dlsrc)\n" if $dl_debug;
+ eval { do $bs; };
+ warn "$bs: $@\n" if $@;
+ }
+
+ goto retry if not -f $file or -s $bs;
+
+ my $bootname = "boot_$module";
+ $bootname =~ s/\W/_/g;
+ @DynaLoader::dl_require_symbols = ($bootname);
+
+ my $boot_symbol_ref;
+
+ # Many dynamic extension loading problems will appear to come from
+ # this section of code: XYZ failed at line 123 of DynaLoader.pm.
+ # Often these errors are actually occurring in the initialisation
+ # C code of the extension XS file. Perl reports the error as being
+ # in this perl code simply because this was the last perl code
+ # it executed.
+
+ my $libref = dl_load_file($file, 0) or do {
+ require Carp;
+ Carp::croak("Can't load '$file' for module $module: " . dl_error());
+ };
+ push(@DynaLoader::dl_librefs,$libref); # record loaded object
+
+ my @unresolved = dl_undef_symbols();
+ if (@unresolved) {
+ require Carp;
+ Carp::carp("Undefined symbols present after loading $file: @unresolved\n");
+ }
+
+ $boot_symbol_ref = dl_find_symbol($libref, $bootname) or do {
+ require Carp;
+ Carp::croak("Can't find '$bootname' symbol in $file\n");
+ };
+
+ push(@DynaLoader::dl_modules, $module); # record loaded module
+
+ boot:
+ my $xs = dl_install_xsub($boots, $boot_symbol_ref, $file);
+
+ # See comment block above
+ push(@DynaLoader::dl_shared_objects, $file); # record files loaded
+ return &$xs(@_);
+
+ retry:
+ my $bootstrap_inherit = DynaLoader->can('bootstrap_inherit') ||
+ XSLoader->can('bootstrap_inherit');
+ goto &$bootstrap_inherit;
+}
+
+# Versions of DynaLoader prior to 5.6.0 don't have this function.
+sub bootstrap_inherit {
+ package DynaLoader;
+
+ my $module = $_[0];
+ local *DynaLoader::isa = *{"$module\::ISA"};
+ local @DynaLoader::isa = (@DynaLoader::isa, 'DynaLoader');
+ # Cannot goto due to delocalization. Will report errors on a wrong line?
+ require DynaLoader;
+ DynaLoader::bootstrap(@_);
+}
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+XSLoader - Dynamically load C libraries into Perl code
+
+=head1 VERSION
+
+Version 0.10
+
+=head1 SYNOPSIS
+
+ package YourPackage;
+ use XSLoader;
+
+ XSLoader::load 'YourPackage', $YourPackage::VERSION;
+
+=head1 DESCRIPTION
+
+This module defines a standard I<simplified> interface to the dynamic
+linking mechanisms available on many platforms. Its primary purpose is
+to implement cheap automatic dynamic loading of Perl modules.
+
+For a more complicated interface, see L<DynaLoader>. Many (most)
+features of C<DynaLoader> are not implemented in C<XSLoader>, like for
+example the C<dl_load_flags>, not honored by C<XSLoader>.
+
+=head2 Migration from C<DynaLoader>
+
+A typical module using L<DynaLoader|DynaLoader> starts like this:
+
+ package YourPackage;
+ require DynaLoader;
+
+ our @ISA = qw( OnePackage OtherPackage DynaLoader );
+ our $VERSION = '0.01';
+ bootstrap YourPackage $VERSION;
+
+Change this to
+
+ package YourPackage;
+ use XSLoader;
+
+ our @ISA = qw( OnePackage OtherPackage );
+ our $VERSION = '0.01';
+ XSLoader::load 'YourPackage', $VERSION;
+
+In other words: replace C<require DynaLoader> by C<use XSLoader>, remove
+C<DynaLoader> from C<@ISA>, change C<bootstrap> by C<XSLoader::load>. Do not
+forget to quote the name of your package on the C<XSLoader::load> line,
+and add comma (C<,>) before the arguments (C<$VERSION> above).
+
+Of course, if C<@ISA> contained only C<DynaLoader>, there is no need to have
+the C<@ISA> assignment at all; moreover, if instead of C<our> one uses the
+more backward-compatible
+
+ use vars qw($VERSION @ISA);
+
+one can remove this reference to C<@ISA> together with the C<@ISA> assignment.
+
+If no C<$VERSION> was specified on the C<bootstrap> line, the last line becomes
+
+ XSLoader::load 'YourPackage';
+
+=head2 Backward compatible boilerplate
+
+If you want to have your cake and eat it too, you need a more complicated
+boilerplate.
+
+ package YourPackage;
+ use vars qw($VERSION @ISA);
+
+ @ISA = qw( OnePackage OtherPackage );
+ $VERSION = '0.01';
+ eval {
+ require XSLoader;
+ XSLoader::load('YourPackage', $VERSION);
+ 1;
+ } or do {
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ bootstrap YourPackage $VERSION;
+ };
+
+The parentheses about C<XSLoader::load()> arguments are needed since we replaced
+C<use XSLoader> by C<require>, so the compiler does not know that a function
+C<XSLoader::load()> is present.
+
+This boilerplate uses the low-overhead C<XSLoader> if present; if used with
+an antic Perl which has no C<XSLoader>, it falls back to using C<DynaLoader>.
+
+=head1 Order of initialization: early load()
+
+I<Skip this section if the XSUB functions are supposed to be called from other
+modules only; read it only if you call your XSUBs from the code in your module,
+or have a C<BOOT:> section in your XS file (see L<perlxs/"The BOOT: Keyword">).
+What is described here is equally applicable to the L<DynaLoader|DynaLoader>
+interface.>
+
+A sufficiently complicated module using XS would have both Perl code (defined
+in F<YourPackage.pm>) and XS code (defined in F<YourPackage.xs>). If this
+Perl code makes calls into this XS code, and/or this XS code makes calls to
+the Perl code, one should be careful with the order of initialization.
+
+The call to C<XSLoader::load()> (or C<bootstrap()>) has three side effects:
+
+=over
+
+=item *
+
+if C<$VERSION> was specified, a sanity check is done to ensure that the
+versions of the F<.pm> and the (compiled) F<.xs> parts are compatible;
+
+=item *
+
+the XSUBs are made accessible from Perl;
+
+=item *
+
+if a C<BOOT:> section was present in the F<.xs> file, the code there is called.
+
+=back
+
+Consequently, if the code in the F<.pm> file makes calls to these XSUBs, it is
+convenient to have XSUBs installed before the Perl code is defined; for
+example, this makes prototypes for XSUBs visible to this Perl code.
+Alternatively, if the C<BOOT:> section makes calls to Perl functions (or
+uses Perl variables) defined in the F<.pm> file, they must be defined prior to
+the call to C<XSLoader::load()> (or C<bootstrap()>).
+
+The first situation being much more frequent, it makes sense to rewrite the
+boilerplate as
+
+ package YourPackage;
+ use XSLoader;
+ use vars qw($VERSION @ISA);
+
+ BEGIN {
+ @ISA = qw( OnePackage OtherPackage );
+ $VERSION = '0.01';
+
+ # Put Perl code used in the BOOT: section here
+
+ XSLoader::load 'YourPackage', $VERSION;
+ }
+
+ # Put Perl code making calls into XSUBs here
+
+=head2 The most hairy case
+
+If the interdependence of your C<BOOT:> section and Perl code is
+more complicated than this (e.g., the C<BOOT:> section makes calls to Perl
+functions which make calls to XSUBs with prototypes), get rid of the C<BOOT:>
+section altogether. Replace it with a function C<onBOOT()>, and call it like
+this:
+
+ package YourPackage;
+ use XSLoader;
+ use vars qw($VERSION @ISA);
+
+ BEGIN {
+ @ISA = qw( OnePackage OtherPackage );
+ $VERSION = '0.01';
+ XSLoader::load 'YourPackage', $VERSION;
+ }
+
+ # Put Perl code used in onBOOT() function here; calls to XSUBs are
+ # prototype-checked.
+
+ onBOOT;
+
+ # Put Perl initialization code assuming that XS is initialized here
+
+
+=head1 DIAGNOSTICS
+
+=over
+
+=item C<Can't find '%s' symbol in %s>
+
+B<(F)> The bootstrap symbol could not be found in the extension module.
+
+=item C<Can't load '%s' for module %s: %s>
+
+B<(F)> The loading or initialisation of the extension module failed.
+The detailed error follows.
+
+=item C<Undefined symbols present after loading %s: %s>
+
+B<(W)> As the message says, some symbols stay undefined although the
+extension module was correctly loaded and initialised. The list of undefined
+symbols follows.
+
+=item C<XSLoader::load('Your::Module', $Your::Module::VERSION)>
+
+B<(F)> You tried to invoke C<load()> without any argument. You must supply
+a module name, and optionally its version.
+
+=back
+
+
+=head1 LIMITATIONS
+
+To reduce the overhead as much as possible, only one possible location
+is checked to find the extension DLL (this location is where C<make install>
+would put the DLL). If not found, the search for the DLL is transparently
+delegated to C<DynaLoader>, which looks for the DLL along the C<@INC> list.
+
+In particular, this is applicable to the structure of C<@INC> used for testing
+not-yet-installed extensions. This means that running uninstalled extensions
+may have much more overhead than running the same extensions after
+C<make install>.
+
+
+=head1 BUGS
+
+Please report any bugs or feature requests via the perlbug(1) utility.
+
+
+=head1 SEE ALSO
+
+L<DynaLoader>
+
+
+=head1 AUTHORS
+
+Ilya Zakharevich originally extracted C<XSLoader> from C<DynaLoader>.
+
+CPAN version is currently maintained by SE<eacute>bastien Aperghis-Tramoni
+E<lt>sebastien@aperghis.netE<gt>.
+
+Previous maintainer was Michael G Schwern <schwern@pobox.com>.
+
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright (C) 1990-2007 by Larry Wall and others.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/abbrev.pl b/Master/tlpkg/tlperl.straw/lib/abbrev.pl
new file mode 100755
index 00000000000..c505a6f28bd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/abbrev.pl
@@ -0,0 +1,43 @@
+;# Usage:
+;# %foo = ();
+;# &abbrev(*foo,LIST);
+;# ...
+;# $long = $foo{$short};
+
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Text::Abbrev
+#
+
+package abbrev;
+
+sub main'abbrev {
+ local(*domain) = @_;
+ shift(@_);
+ @cmp = @_;
+ local($[) = 0;
+ foreach $name (@_) {
+ @extra = split(//,$name);
+ $abbrev = shift(@extra);
+ $len = 1;
+ foreach $cmp (@cmp) {
+ next if $cmp eq $name;
+ while (@extra && substr($cmp,0,$len) eq $abbrev) {
+ $abbrev .= shift(@extra);
+ ++$len;
+ }
+ }
+ $domain{$abbrev} = $name;
+ while ($#extra >= 0) {
+ $abbrev .= shift(@extra);
+ $domain{$abbrev} = $name;
+ }
+ }
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/attrs.pm b/Master/tlpkg/tlperl.straw/lib/attrs.pm
new file mode 100755
index 00000000000..3c00f61328e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/attrs.pm
@@ -0,0 +1,58 @@
+package attrs;
+use XSLoader ();
+
+$VERSION = "1.03";
+
+=head1 NAME
+
+attrs - set/get attributes of a subroutine (deprecated)
+
+=head1 SYNOPSIS
+
+ sub foo {
+ use attrs qw(locked method);
+ ...
+ }
+
+ @a = attrs::get(\&foo);
+
+=head1 DESCRIPTION
+
+NOTE: Use of this pragma is deprecated. Use the syntax
+
+ sub foo : locked method { }
+
+to declare attributes instead. See also L<attributes>.
+
+This pragma lets you set and get attributes for subroutines.
+Setting attributes takes place at compile time; trying to set
+invalid attribute names causes a compile-time error. Calling
+C<attrs::get> on a subroutine reference or name returns its list
+of attribute names. Notice that C<attrs::get> is not exported.
+Valid attributes are as follows.
+
+=over 4
+
+=item method
+
+Indicates that the invoking subroutine is a method.
+
+=item locked
+
+Setting this attribute is only meaningful when the subroutine or
+method is to be called by multiple threads. When set on a method
+subroutine (i.e. one marked with the B<method> attribute above),
+perl ensures that any invocation of it implicitly locks its first
+argument before execution. When set on a non-method subroutine,
+perl ensures that a lock is taken on the subroutine itself before
+execution. The semantics of the lock are exactly those of one
+explicitly taken with the C<lock> operator immediately after the
+subroutine is entered.
+
+=back
+
+=cut
+
+XSLoader::load 'attrs', $VERSION;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/autodie.pm b/Master/tlpkg/tlperl.straw/lib/autodie.pm
new file mode 100755
index 00000000000..8e8e7094c7c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/autodie.pm
@@ -0,0 +1,424 @@
+package autodie;
+use 5.008;
+use strict;
+use warnings;
+
+use Fatal ();
+our @ISA = qw(Fatal);
+our $VERSION;
+
+BEGIN {
+ $VERSION = '2.06_01';
+}
+
+use constant ERROR_WRONG_FATAL => q{
+Incorrect version of Fatal.pm loaded by autodie.
+
+The autodie pragma uses an updated version of Fatal to do its
+heavy lifting. We seem to have loaded Fatal version %s, which is
+probably the version that came with your version of Perl. However
+autodie needs version %s, which would have come bundled with
+autodie.
+
+You may be able to solve this problem by adding the following
+line of code to your main program, before any use of Fatal or
+autodie.
+
+ use lib "%s";
+
+};
+
+# We have to check we've got the right version of Fatal before we
+# try to compile the rest of our code, lest we use a constant
+# that doesn't exist.
+
+BEGIN {
+
+ # If we have the wrong Fatal, then we've probably loaded the system
+ # one, not our own. Complain, and give a useful hint. ;)
+
+ if ($Fatal::VERSION ne $VERSION) {
+ my $autodie_path = $INC{'autodie.pm'};
+
+ $autodie_path =~ s/autodie\.pm//;
+
+ require Carp;
+
+ Carp::croak sprintf(
+ ERROR_WRONG_FATAL, $Fatal::VERSION, $VERSION, $autodie_path
+ );
+ }
+}
+
+# When passing args to Fatal we want to keep the first arg
+# (our package) in place. Hence the splice.
+
+sub import {
+ splice(@_,1,0,Fatal::LEXICAL_TAG);
+ goto &Fatal::import;
+}
+
+sub unimport {
+ splice(@_,1,0,Fatal::LEXICAL_TAG);
+ goto &Fatal::unimport;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+autodie - Replace functions with ones that succeed or die with lexical scope
+
+=head1 SYNOPSIS
+
+ use autodie; # Recommended: implies 'use autodie qw(:default)'
+
+ use autodie qw(:all); # Recommended more: defaults and system/exec.
+
+ use autodie qw(open close); # open/close succeed or die
+
+ open(my $fh, "<", $filename); # No need to check!
+
+ {
+ no autodie qw(open); # open failures won't die
+ open(my $fh, "<", $filename); # Could fail silently!
+ no autodie; # disable all autodies
+ }
+
+=head1 DESCRIPTION
+
+ bIlujDI' yIchegh()Qo'; yIHegh()!
+
+ It is better to die() than to return() in failure.
+
+ -- Klingon programming proverb.
+
+The C<autodie> pragma provides a convenient way to replace functions
+that normally return false on failure with equivalents that throw
+an exception on failure.
+
+The C<autodie> pragma has I<lexical scope>, meaning that functions
+and subroutines altered with C<autodie> will only change their behaviour
+until the end of the enclosing block, file, or C<eval>.
+
+If C<system> is specified as an argument to C<autodie>, then it
+uses L<IPC::System::Simple> to do the heavy lifting. See the
+description of that module for more information.
+
+=head1 EXCEPTIONS
+
+Exceptions produced by the C<autodie> pragma are members of the
+L<autodie::exception> class. The preferred way to work with
+these exceptions under Perl 5.10 is as follows:
+
+ use feature qw(switch);
+
+ eval {
+ use autodie;
+
+ open(my $fh, '<', $some_file);
+
+ my @records = <$fh>;
+
+ # Do things with @records...
+
+ close($fh);
+
+ };
+
+ given ($@) {
+ when (undef) { say "No error"; }
+ when ('open') { say "Error from open"; }
+ when (':io') { say "Non-open, IO error."; }
+ when (':all') { say "All other autodie errors." }
+ default { say "Not an autodie error at all." }
+ }
+
+Under Perl 5.8, the C<given/when> structure is not available, so the
+following structure may be used:
+
+ eval {
+ use autodie;
+
+ open(my $fh, '<', $some_file);
+
+ my @records = <$fh>;
+
+ # Do things with @records...
+
+ close($fh);
+ };
+
+ if ($@ and $@->isa('autodie::exception')) {
+ if ($@->matches('open')) { print "Error from open\n"; }
+ if ($@->matches(':io' )) { print "Non-open, IO error."; }
+ } elsif ($@) {
+ # A non-autodie exception.
+ }
+
+See L<autodie::exception> for further information on interrogating
+exceptions.
+
+=head1 CATEGORIES
+
+Autodie uses a simple set of categories to group together similar
+built-ins. Requesting a category type (starting with a colon) will
+enable autodie for all built-ins beneath that category. For example,
+requesting C<:file> will enable autodie for C<close>, C<fcntl>,
+C<fileno>, C<open> and C<sysopen>.
+
+The categories are currently:
+
+ :all
+ :default
+ :io
+ read
+ seek
+ sysread
+ sysseek
+ syswrite
+ :dbm
+ dbmclose
+ dbmopen
+ :file
+ binmode
+ close
+ fcntl
+ fileno
+ flock
+ ioctl
+ open
+ sysopen
+ truncate
+ :filesys
+ chdir
+ closedir
+ opendir
+ link
+ mkdir
+ readlink
+ rename
+ rmdir
+ symlink
+ unlink
+ :ipc
+ pipe
+ :msg
+ msgctl
+ msgget
+ msgrcv
+ msgsnd
+ :semaphore
+ semctl
+ semget
+ semop
+ :shm
+ shmctl
+ shmget
+ shmread
+ :socket
+ accept
+ bind
+ connect
+ getsockopt
+ listen
+ recv
+ send
+ setsockopt
+ shutdown
+ socketpair
+ :threads
+ fork
+ :system
+ system
+ exec
+
+
+Note that while the above category system is presently a strict
+hierarchy, this should not be assumed.
+
+A plain C<use autodie> implies C<use autodie qw(:default)>. Note that
+C<system> and C<exec> are not enabled by default. C<system> requires
+the optional L<IPC::System::Simple> module to be installed, and enabling
+C<system> or C<exec> will invalidate their exotic forms. See L</BUGS>
+below for more details.
+
+The syntax:
+
+ use autodie qw(:1.994);
+
+allows the C<:default> list from a particular version to be used. This
+provides the convenience of using the default methods, but the surety
+that no behavorial changes will occur if the C<autodie> module is
+upgraded.
+
+C<autodie> can be enabled for all of Perl's built-ins, including
+C<system> and C<exec> with:
+
+ use autodie qw(:all);
+
+=head1 FUNCTION SPECIFIC NOTES
+
+=head2 flock
+
+It is not considered an error for C<flock> to return false if it fails
+to an C<EWOULDBLOCK> (or equivalent) condition. This means one can
+still use the common convention of testing the return value of
+C<flock> when called with the C<LOCK_NB> option:
+
+ use autodie;
+
+ if ( flock($fh, LOCK_EX | LOCK_NB) ) {
+ # We have a lock
+ }
+
+Autodying C<flock> will generate an exception if C<flock> returns
+false with any other error.
+
+=head2 system/exec
+
+The C<system> built-in is considered to have failed in the following
+circumstances:
+
+=over 4
+
+=item *
+
+The command does not start.
+
+=item *
+
+The command is killed by a signal.
+
+=item *
+
+The command returns a non-zero exit value (but see below).
+
+=back
+
+On success, the autodying form of C<system> returns the I<exit value>
+rather than the contents of C<$?>.
+
+Additional allowable exit values can be supplied as an optional first
+argument to autodying C<system>:
+
+ system( [ 0, 1, 2 ], $cmd, @args); # 0,1,2 are good exit values
+
+C<autodie> uses the L<IPC::System::Simple> module to change C<system>.
+See its documentation for further information.
+
+Applying C<autodie> to C<system> or C<exec> causes the exotic
+forms C<system { $cmd } @args > or C<exec { $cmd } @args>
+to be considered a syntax error until the end of the lexical scope.
+If you really need to use the exotic form, you can call C<CORE::system>
+or C<CORE::exec> instead, or use C<no autodie qw(system exec)> before
+calling the exotic form.
+
+=head1 GOTCHAS
+
+Functions called in list context are assumed to have failed if they
+return an empty list, or a list consisting only of a single undef
+element.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item :void cannot be used with lexical scope
+
+The C<:void> option is supported in L<Fatal>, but not
+C<autodie>. To workaround this, C<autodie> may be explicitly disabled until
+the end of the current block with C<no autodie>.
+To disable autodie for only a single function (eg, open)
+use C<no autodie qw(open)>.
+
+=item No user hints defined for %s
+
+You've insisted on hints for user-subroutines, either by pre-pending
+a C<!> to the subroutine name itself, or earlier in the list of arguments
+to C<autodie>. However the subroutine in question does not have
+any hints available.
+
+=back
+
+See also L<Fatal/DIAGNOSTICS>.
+
+=head1 BUGS
+
+"Used only once" warnings can be generated when C<autodie> or C<Fatal>
+is used with package filehandles (eg, C<FILE>). Scalar filehandles are
+strongly recommended instead.
+
+When using C<autodie> or C<Fatal> with user subroutines, the
+declaration of those subroutines must appear before the first use of
+C<Fatal> or C<autodie>, or have been exported from a module.
+Attempting to use C<Fatal> or C<autodie> on other user subroutines will
+result in a compile-time error.
+
+Due to a bug in Perl, C<autodie> may "lose" any format which has the
+same name as an autodying built-in or function.
+
+C<autodie> may not work correctly if used inside a file with a
+name that looks like a string eval, such as F<eval (3)>.
+
+=head2 autodie and string eval
+
+Due to the current implementation of C<autodie>, unexpected results
+may be seen when used near or with the string version of eval.
+I<None of these bugs exist when using block eval>.
+
+Under Perl 5.8 only, C<autodie> I<does not> propagate into string C<eval>
+statements, although it can be explicitly enabled inside a string
+C<eval>.
+
+Under Perl 5.10 only, using a string eval when C<autodie> is in
+effect can cause the autodie behaviour to leak into the surrounding
+scope. This can be worked around by using a C<no autodie> at the
+end of the scope to explicitly remove autodie's effects, or by
+avoiding the use of string eval.
+
+I<None of these bugs exist when using block eval>. The use of
+C<autodie> with block eval is considered good practice.
+
+=head2 REPORTING BUGS
+
+Please report bugs via the CPAN Request Tracker at
+L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie>.
+
+=head1 FEEDBACK
+
+If you find this module useful, please consider rating it on the
+CPAN Ratings service at
+L<http://cpanratings.perl.org/rate?distribution=autodie> .
+
+The module author loves to hear how C<autodie> has made your life
+better (or worse). Feedback can be sent to
+E<lt>pjf@perltraining.com.auE<gt>.
+
+=head1 AUTHOR
+
+Copyright 2008-2009, Paul Fenwick E<lt>pjf@perltraining.com.auE<gt>
+
+=head1 LICENSE
+
+This module is free software. You may distribute it under the
+same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Fatal>, L<autodie::exception>, L<autodie::hints>, L<IPC::System::Simple>
+
+I<Perl tips, autodie> at
+L<http://perltraining.com.au/tips/2008-08-20.html>
+
+=head1 ACKNOWLEDGEMENTS
+
+Mark Reed and Roland Giersig -- Klingon translators.
+
+See the F<AUTHORS> file for full credits. The latest version of this
+file can be found at
+L<http://github.com/pfenwick/autodie/tree/master/AUTHORS> .
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/autodie/exception.pm b/Master/tlpkg/tlperl.straw/lib/autodie/exception.pm
new file mode 100755
index 00000000000..8646099c4c8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/autodie/exception.pm
@@ -0,0 +1,741 @@
+package autodie::exception;
+use 5.008;
+use strict;
+use warnings;
+use Carp qw(croak);
+
+our $DEBUG = 0;
+
+use overload
+ q{""} => "stringify"
+;
+
+# Overload smart-match only if we're using 5.10
+
+use if ($] >= 5.010), overload => '~~' => "matches";
+
+our $VERSION = '2.06_01';
+
+my $PACKAGE = __PACKAGE__; # Useful to have a scalar for hash keys.
+
+=head1 NAME
+
+autodie::exception - Exceptions from autodying functions.
+
+=head1 SYNOPSIS
+
+ eval {
+ use autodie;
+
+ open(my $fh, '<', 'some_file.txt');
+
+ ...
+ };
+
+ if (my $E = $@) {
+ say "Ooops! ",$E->caller," had problems: $@";
+ }
+
+
+=head1 DESCRIPTION
+
+When an L<autodie> enabled function fails, it generates an
+C<autodie::exception> object. This can be interrogated to
+determine further information about the error that occurred.
+
+This document is broken into two sections; those methods that
+are most useful to the end-developer, and those methods for
+anyone wishing to subclass or get very familiar with
+C<autodie::exception>.
+
+=head2 Common Methods
+
+These methods are intended to be used in the everyday dealing
+of exceptions.
+
+The following assume that the error has been copied into
+a separate scalar:
+
+ if ($E = $@) {
+ ...
+ }
+
+This is not required, but is recommended in case any code
+is called which may reset or alter C<$@>.
+
+=cut
+
+=head3 args
+
+ my $array_ref = $E->args;
+
+Provides a reference to the arguments passed to the subroutine
+that died.
+
+=cut
+
+sub args { return $_[0]->{$PACKAGE}{args}; }
+
+=head3 function
+
+ my $sub = $E->function;
+
+The subroutine (including package) that threw the exception.
+
+=cut
+
+sub function { return $_[0]->{$PACKAGE}{function}; }
+
+=head3 file
+
+ my $file = $E->file;
+
+The file in which the error occurred (eg, C<myscript.pl> or
+C<MyTest.pm>).
+
+=cut
+
+sub file { return $_[0]->{$PACKAGE}{file}; }
+
+=head3 package
+
+ my $package = $E->package;
+
+The package from which the exceptional subroutine was called.
+
+=cut
+
+sub package { return $_[0]->{$PACKAGE}{package}; }
+
+=head3 caller
+
+ my $caller = $E->caller;
+
+The subroutine that I<called> the exceptional code.
+
+=cut
+
+sub caller { return $_[0]->{$PACKAGE}{caller}; }
+
+=head3 line
+
+ my $line = $E->line;
+
+The line in C<< $E->file >> where the exceptional code was called.
+
+=cut
+
+sub line { return $_[0]->{$PACKAGE}{line}; }
+
+=head3 context
+
+ my $context = $E->context;
+
+The context in which the subroutine was called. This can be
+'list', 'scalar', or undefined (unknown). It will never be 'void', as
+C<autodie> always captures the return value in one way or another.
+
+=cut
+
+sub context { return $_[0]->{$PACKAGE}{context} }
+
+=head3 return
+
+ my $return_value = $E->return;
+
+The value(s) returned by the failed subroutine. When the subroutine
+was called in a list context, this will always be a reference to an
+array containing the results. When the subroutine was called in
+a scalar context, this will be the actual scalar returned.
+
+=cut
+
+sub return { return $_[0]->{$PACKAGE}{return} }
+
+=head3 errno
+
+ my $errno = $E->errno;
+
+The value of C<$!> at the time when the exception occurred.
+
+B<NOTE>: This method will leave the main C<autodie::exception> class
+and become part of a role in the future. You should only call
+C<errno> for exceptions where C<$!> would reasonably have been
+set on failure.
+
+=cut
+
+# TODO: Make errno part of a role. It doesn't make sense for
+# everything.
+
+sub errno { return $_[0]->{$PACKAGE}{errno}; }
+
+=head3 eval_error
+
+ my $old_eval_error = $E->eval_error;
+
+The contents of C<$@> immediately after autodie triggered an
+exception. This may be useful when dealing with modules such
+as L<Text::Balanced> that set (but do not throw) C<$@> on error.
+
+=cut
+
+sub eval_error { return $_[0]->{$PACKAGE}{eval_error}; }
+
+=head3 matches
+
+ if ( $e->matches('open') ) { ... }
+
+ if ( $e ~~ 'open' ) { ... }
+
+C<matches> is used to determine whether a
+given exception matches a particular role. On Perl 5.10,
+using smart-match (C<~~>) with an C<autodie::exception> object
+will use C<matches> underneath.
+
+An exception is considered to match a string if:
+
+=over 4
+
+=item *
+
+For a string not starting with a colon, the string exactly matches the
+package and subroutine that threw the exception. For example,
+C<MyModule::log>. If the string does not contain a package name,
+C<CORE::> is assumed.
+
+=item *
+
+For a string that does start with a colon, if the subroutine
+throwing the exception I<does> that behaviour. For example, the
+C<CORE::open> subroutine does C<:file>, C<:io> and C<:all>.
+
+See L<autodie/CATEGORIES> for futher information.
+
+=back
+
+=cut
+
+{
+ my (%cache);
+
+ sub matches {
+ my ($this, $that) = @_;
+
+ # TODO - Handle references
+ croak "UNIMPLEMENTED" if ref $that;
+
+ my $sub = $this->function;
+
+ if ($DEBUG) {
+ my $sub2 = $this->function;
+ warn "Smart-matching $that against $sub / $sub2\n";
+ }
+
+ # Direct subname match.
+ return 1 if $that eq $sub;
+ return 1 if $that !~ /:/ and "CORE::$that" eq $sub;
+ return 0 if $that !~ /^:/;
+
+ # Cached match / check tags.
+ require Fatal;
+
+ if (exists $cache{$sub}{$that}) {
+ return $cache{$sub}{$that};
+ }
+
+ # This rather awful looking line checks to see if our sub is in the
+ # list of expanded tags, caches it, and returns the result.
+
+ return $cache{$sub}{$that} = grep { $_ eq $sub } @{ $this->_expand_tag($that) };
+ }
+}
+
+# This exists primarily so that child classes can override or
+# augment it if they wish.
+
+sub _expand_tag {
+ my ($this, @args) = @_;
+
+ return Fatal->_expand_tag(@args);
+}
+
+=head2 Advanced methods
+
+The following methods, while usable from anywhere, are primarily
+intended for developers wishing to subclass C<autodie::exception>,
+write code that registers custom error messages, or otherwise
+work closely with the C<autodie::exception> model.
+
+=cut
+
+# The table below records customer formatters.
+# TODO - Should this be a package var instead?
+# TODO - Should these be in a completely different file, or
+# perhaps loaded on demand? Most formatters will never
+# get used in most programs.
+
+my %formatter_of = (
+ 'CORE::close' => \&_format_close,
+ 'CORE::open' => \&_format_open,
+ 'CORE::dbmopen' => \&_format_dbmopen,
+ 'CORE::flock' => \&_format_flock,
+);
+
+# TODO: Our tests only check LOCK_EX | LOCK_NB is properly
+# formatted. Try other combinations and ensure they work
+# correctly.
+
+sub _format_flock {
+ my ($this) = @_;
+
+ require Fcntl;
+
+ my $filehandle = $this->args->[0];
+ my $raw_mode = $this->args->[1];
+
+ my $mode_type;
+ my $lock_unlock;
+
+ if ($raw_mode & Fcntl::LOCK_EX() ) {
+ $lock_unlock = "lock";
+ $mode_type = "for exclusive access";
+ }
+ elsif ($raw_mode & Fcntl::LOCK_SH() ) {
+ $lock_unlock = "lock";
+ $mode_type = "for shared access";
+ }
+ elsif ($raw_mode & Fcntl::LOCK_UN() ) {
+ $lock_unlock = "unlock";
+ $mode_type = "";
+ }
+ else {
+ # I've got no idea what they're trying to do.
+ $lock_unlock = "lock";
+ $mode_type = "with mode $raw_mode";
+ }
+
+ my $cooked_filehandle;
+
+ if ($filehandle and not ref $filehandle) {
+
+ # A package filehandle with a name!
+
+ $cooked_filehandle = " $filehandle";
+ }
+ else {
+ # Otherwise we have a scalar filehandle.
+
+ $cooked_filehandle = '';
+
+ }
+
+ local $! = $this->errno;
+
+ return "Can't $lock_unlock filehandle$cooked_filehandle $mode_type: $!";
+
+}
+
+# Default formatter for CORE::dbmopen
+sub _format_dbmopen {
+ my ($this) = @_;
+ my @args = @{$this->args};
+
+ # TODO: Presently, $args flattens out the (usually empty) hash
+ # which is passed as the first argument to dbmopen. This is
+ # a bug in our args handling code (taking a reference to it would
+ # be better), but for the moment we'll just examine the end of
+ # our arguments list for message formatting.
+
+ my $mode = $args[-1];
+ my $file = $args[-2];
+
+ # If we have a mask, then display it in octal, not decimal.
+ # We don't do this if it already looks octalish, or doesn't
+ # look like a number.
+
+ if ($mode =~ /^[^\D0]\d+$/) {
+ $mode = sprintf("0%lo", $mode);
+ };
+
+ local $! = $this->errno;
+
+ return "Can't dbmopen(%hash, '$file', $mode): '$!'";
+}
+
+# Default formatter for CORE::close
+
+sub _format_close {
+ my ($this) = @_;
+ my $close_arg = $this->args->[0];
+
+ local $! = $this->errno;
+
+ # If we've got an old-style filehandle, mention it.
+ if ($close_arg and not ref $close_arg) {
+ return "Can't close filehandle '$close_arg': '$!'";
+ }
+
+ # TODO - This will probably produce an ugly error. Test and fix.
+ return "Can't close($close_arg) filehandle: '$!'";
+
+}
+
+# Default formatter for CORE::open
+
+use constant _FORMAT_OPEN => "Can't open '%s' for %s: '%s'";
+
+sub _format_open_with_mode {
+ my ($this, $mode, $file, $error) = @_;
+
+ my $wordy_mode;
+
+ if ($mode eq '<') { $wordy_mode = 'reading'; }
+ elsif ($mode eq '>') { $wordy_mode = 'writing'; }
+ elsif ($mode eq '>>') { $wordy_mode = 'appending'; }
+
+ return sprintf _FORMAT_OPEN, $file, $wordy_mode, $error if $wordy_mode;
+
+ Carp::confess("Internal autodie::exception error: Don't know how to format mode '$mode'.");
+
+}
+
+sub _format_open {
+ my ($this) = @_;
+
+ my @open_args = @{$this->args};
+
+ # Use the default formatter for single-arg and many-arg open
+ if (@open_args <= 1 or @open_args >= 4) {
+ return $this->format_default;
+ }
+
+ # For two arg open, we have to extract the mode
+ if (@open_args == 2) {
+ my ($fh, $file) = @open_args;
+
+ if (ref($fh) eq "GLOB") {
+ $fh = '$fh';
+ }
+
+ my ($mode) = $file =~ m{
+ ^\s* # Spaces before mode
+ (
+ (?> # Non-backtracking subexp.
+ < # Reading
+ |>>? # Writing/appending
+ )
+ )
+ [^&] # Not an ampersand (which means a dup)
+ }x;
+
+ if (not $mode) {
+ # Maybe it's a 2-arg open without any mode at all?
+ # Detect the most simple case for this, where our
+ # file consists only of word characters.
+
+ if ( $file =~ m{^\s*\w+\s*$} ) {
+ $mode = '<'
+ }
+ else {
+ # Otherwise, we've got no idea what's going on.
+ # Use the default.
+ return $this->format_default;
+ }
+ }
+
+ # Localising $! means perl make make it a pretty error for us.
+ local $! = $this->errno;
+
+ return $this->_format_open_with_mode($mode, $file, $!);
+ }
+
+ # Here we must be using three arg open.
+
+ my $file = $open_args[2];
+
+ local $! = $this->errno;
+
+ my $mode = $open_args[1];
+
+ local $@;
+
+ my $msg = eval { $this->_format_open_with_mode($mode, $file, $!); };
+
+ return $msg if $msg;
+
+ # Default message (for pipes and odd things)
+
+ return "Can't open '$file' with mode '$open_args[1]': '$!'";
+}
+
+=head3 register
+
+ autodie::exception->register( 'CORE::open' => \&mysub );
+
+The C<register> method allows for the registration of a message
+handler for a given subroutine. The full subroutine name including
+the package should be used.
+
+Registered message handlers will receive the C<autodie::exception>
+object as the first parameter.
+
+=cut
+
+sub register {
+ my ($class, $symbol, $handler) = @_;
+
+ croak "Incorrect call to autodie::register" if @_ != 3;
+
+ $formatter_of{$symbol} = $handler;
+
+}
+
+=head3 add_file_and_line
+
+ say "Problem occurred",$@->add_file_and_line;
+
+Returns the string C< at %s line %d>, where C<%s> is replaced with
+the filename, and C<%d> is replaced with the line number.
+
+Primarily intended for use by format handlers.
+
+=cut
+
+# Simply produces the file and line number; intended to be added
+# to the end of error messages.
+
+sub add_file_and_line {
+ my ($this) = @_;
+
+ return sprintf(" at %s line %d\n", $this->file, $this->line);
+}
+
+=head3 stringify
+
+ say "The error was: ",$@->stringify;
+
+Formats the error as a human readable string. Usually there's no
+reason to call this directly, as it is used automatically if an
+C<autodie::exception> object is ever used as a string.
+
+Child classes can override this method to change how they're
+stringified.
+
+=cut
+
+sub stringify {
+ my ($this) = @_;
+
+ my $call = $this->function;
+
+ if ($DEBUG) {
+ my $dying_pkg = $this->package;
+ my $sub = $this->function;
+ my $caller = $this->caller;
+ warn "Stringifing exception for $dying_pkg :: $sub / $caller / $call\n";
+ }
+
+ # TODO - This isn't using inheritance. Should it?
+ if ( my $sub = $formatter_of{$call} ) {
+ return $sub->($this) . $this->add_file_and_line;
+ }
+
+ return $this->format_default . $this->add_file_and_line;
+
+}
+
+=head3 format_default
+
+ my $error_string = $E->format_default;
+
+This produces the default error string for the given exception,
+I<without using any registered message handlers>. It is primarily
+intended to be called from a message handler when they have
+been passed an exception they don't want to format.
+
+Child classes can override this method to change how default
+messages are formatted.
+
+=cut
+
+# TODO: This produces ugly errors. Is there any way we can
+# dig around to find the actual variable names? I know perl 5.10
+# does some dark and terrible magicks to find them for undef warnings.
+
+sub format_default {
+ my ($this) = @_;
+
+ my $call = $this->function;
+
+ local $! = $this->errno;
+
+ # TODO: This is probably a good idea for CORE, is it
+ # a good idea for other subs?
+
+ # Trim package name off dying sub for error messages.
+ $call =~ s/.*:://;
+
+ # Walk through all our arguments, and...
+ #
+ # * Replace undef with the word 'undef'
+ # * Replace globs with the string '$fh'
+ # * Quote all other args.
+
+ my @args = @{ $this->args() };
+
+ foreach my $arg (@args) {
+ if (not defined($arg)) { $arg = 'undef' }
+ elsif (ref($arg) eq "GLOB") { $arg = '$fh' }
+ else { $arg = qq{'$arg'} }
+ }
+
+ # Format our beautiful error.
+
+ return "Can't $call(". join(q{, }, @args) . "): $!" ;
+
+ # TODO - Handle user-defined errors from hash.
+
+ # TODO - Handle default error messages.
+
+}
+
+=head3 new
+
+ my $error = autodie::exception->new(
+ args => \@_,
+ function => "CORE::open",
+ errno => $!,
+ context => 'scalar',
+ return => undef,
+ );
+
+
+Creates a new C<autodie::exception> object. Normally called
+directly from an autodying function. The C<function> argument
+is required, its the function we were trying to call that
+generated the exception. The C<args> parameter is optional.
+
+The C<errno> value is optional. In versions of C<autodie::exception>
+1.99 and earlier the code would try to automatically use the
+current value of C<$!>, but this was unreliable and is no longer
+supported.
+
+Atrributes such as package, file, and caller are determined
+automatically, and cannot be specified.
+
+=cut
+
+sub new {
+ my ($class, @args) = @_;
+
+ my $this = {};
+
+ bless($this,$class);
+
+ # I'd love to use EVERY here, but it causes our code to die
+ # because it wants to stringify our objects before they're
+ # initialised, causing everything to explode.
+
+ $this->_init(@args);
+
+ return $this;
+}
+
+sub _init {
+
+ my ($this, %args) = @_;
+
+ # Capturing errno here is not necessarily reliable.
+ my $original_errno = $!;
+
+ our $init_called = 1;
+
+ my $class = ref $this;
+
+ # We're going to walk up our call stack, looking for the
+ # first thing that doesn't look like our exception
+ # code, autodie/Fatal, or some whacky eval.
+
+ my ($package, $file, $line, $sub);
+
+ my $depth = 0;
+
+ while (1) {
+ $depth++;
+
+ ($package, $file, $line, $sub) = CORE::caller($depth);
+
+ # Skip up the call stack until we find something outside
+ # of the Fatal/autodie/eval space.
+
+ next if $package->isa('Fatal');
+ next if $package->isa($class);
+ next if $package->isa(__PACKAGE__);
+ next if $file =~ /^\(eval\s\d+\)$/;
+
+ last;
+
+ }
+
+ # We now have everything correct, *except* for our subroutine
+ # name. If it's __ANON__ or (eval), then we need to keep on
+ # digging deeper into our stack to find the real name. However we
+ # don't update our other information, since that will be correct
+ # for our current exception.
+
+ my $first_guess_subroutine = $sub;
+
+ while (defined $sub and $sub =~ /^\(eval\)$|::__ANON__$/) {
+ $depth++;
+
+ $sub = (CORE::caller($depth))[3];
+ }
+
+ # If we end up falling out the bottom of our stack, then our
+ # __ANON__ guess is the best we can get. This includes situations
+ # where we were called from the top level of a program.
+
+ if (not defined $sub) {
+ $sub = $first_guess_subroutine;
+ }
+
+ $this->{$PACKAGE}{package} = $package;
+ $this->{$PACKAGE}{file} = $file;
+ $this->{$PACKAGE}{line} = $line;
+ $this->{$PACKAGE}{caller} = $sub;
+ $this->{$PACKAGE}{package} = $package;
+
+ $this->{$PACKAGE}{errno} = $args{errno} || 0;
+
+ $this->{$PACKAGE}{context} = $args{context};
+ $this->{$PACKAGE}{return} = $args{return};
+ $this->{$PACKAGE}{eval_error} = $args{eval_error};
+
+ $this->{$PACKAGE}{args} = $args{args} || [];
+ $this->{$PACKAGE}{function}= $args{function} or
+ croak("$class->new() called without function arg");
+
+ return $this;
+
+}
+
+1;
+
+__END__
+
+=head1 SEE ALSO
+
+L<autodie>, L<autodie::exception::system>
+
+=head1 LICENSE
+
+Copyright (C)2008 Paul Fenwick
+
+This is free software. You may modify and/or redistribute this
+code under the same terms as Perl 5.10 itself, or, at your option,
+any later version of Perl 5.
+
+=head1 AUTHOR
+
+Paul Fenwick E<lt>pjf@perltraining.com.auE<gt>
diff --git a/Master/tlpkg/tlperl.straw/lib/autodie/exception/system.pm b/Master/tlpkg/tlperl.straw/lib/autodie/exception/system.pm
new file mode 100755
index 00000000000..07cd1c9a038
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/autodie/exception/system.pm
@@ -0,0 +1,81 @@
+package autodie::exception::system;
+use 5.008;
+use strict;
+use warnings;
+use base 'autodie::exception';
+use Carp qw(croak);
+
+our $VERSION = '2.06_01';
+
+my $PACKAGE = __PACKAGE__;
+
+=head1 NAME
+
+autodie::exception::system - Exceptions from autodying system().
+
+=head1 SYNOPSIS
+
+ eval {
+ use autodie qw(system);
+
+ system($cmd, @args);
+
+ };
+
+ if (my $E = $@) {
+ say "Ooops! ",$E->caller," had problems: $@";
+ }
+
+
+=head1 DESCRIPTION
+
+This is a L<autodie::exception> class for failures from the
+C<system> command.
+
+Presently there is no way to interrogate an C<autodie::exception::system>
+object for the command, exit status, and other information you'd expect
+such an object to hold. The interface will be expanded to accommodate
+this in the future.
+
+=cut
+
+sub _init {
+ my ($this, %args) = @_;
+
+ $this->{$PACKAGE}{message} = $args{message}
+ || croak "'message' arg not supplied to autodie::exception::system->new";
+
+ return $this->SUPER::_init(%args);
+
+}
+
+=head2 stringify
+
+When stringified, C<autodie::exception::system> objects currently
+use the message generated by L<IPC::System::Simple>.
+
+=cut
+
+sub stringify {
+
+ my ($this) = @_;
+
+ return $this->{$PACKAGE}{message} . $this->add_file_and_line;
+
+}
+
+1;
+
+__END__
+
+=head1 LICENSE
+
+Copyright (C)2008 Paul Fenwick
+
+This is free software. You may modify and/or redistribute this
+code under the same terms as Perl 5.10 itself, or, at your option,
+any later version of Perl 5.
+
+=head1 AUTHOR
+
+Paul Fenwick E<lt>pjf@perltraining.com.auE<gt>
diff --git a/Master/tlpkg/tlperl.straw/lib/autodie/hints.pm b/Master/tlpkg/tlperl.straw/lib/autodie/hints.pm
new file mode 100755
index 00000000000..e7be03a047a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/autodie/hints.pm
@@ -0,0 +1,598 @@
+package autodie::hints;
+
+use strict;
+use warnings;
+
+use constant PERL58 => ( $] < 5.009 );
+
+our $VERSION = '2.06_01';
+
+=head1 NAME
+
+autodie::hints - Provide hints about user subroutines to autodie
+
+=head1 SYNOPSIS
+
+ package Your::Module;
+
+ our %DOES = ( 'autodie::hints::provider' => 1 );
+
+ sub AUTODIE_HINTS {
+ return {
+ foo => { scalar => HINTS, list => SOME_HINTS },
+ bar => { scalar => HINTS, list => MORE_HINTS },
+ }
+ }
+
+ # Later, in your main program...
+
+ use Your::Module qw(foo bar);
+ use autodie qw(:default foo bar);
+
+ foo(); # succeeds or dies based on scalar hints
+
+ # Alternatively, hints can be set on subroutines we've
+ # imported.
+
+ use autodie::hints;
+ use Some::Module qw(think_positive);
+
+ BEGIN {
+ autodie::hints->set_hints_for(
+ \&think_positive,
+ {
+ fail => sub { $_[0] <= 0 }
+ }
+ )
+ }
+ use autodie qw(think_positive);
+
+ think_positive(...); # Returns positive or dies.
+
+
+=head1 DESCRIPTION
+
+=head2 Introduction
+
+The L<autodie> pragma is very smart when it comes to working with
+Perl's built-in functions. The behaviour for these functions are
+fixed, and C<autodie> knows exactly how they try to signal failure.
+
+But what about user-defined subroutines from modules? If you use
+C<autodie> on a user-defined subroutine then it assumes the following
+behaviour to demonstrate failure:
+
+=over
+
+=item *
+
+A false value, in scalar context
+
+=item *
+
+An empty list, in list context
+
+=item *
+
+A list containing a single undef, in list context
+
+=back
+
+All other return values (including the list of the single zero, and the
+list containing a single empty string) are considered successful. However,
+real-world code isn't always that easy. Perhaps the code you're working
+with returns a string containing the word "FAIL" upon failure, or a
+two element list containing C<(undef, "human error message")>. To make
+autodie work with these sorts of subroutines, we have
+the I<hinting interface>.
+
+The hinting interface allows I<hints> to be provided to C<autodie>
+on how it should detect failure from user-defined subroutines. While
+these I<can> be provided by the end-user of C<autodie>, they are ideally
+written into the module itself, or into a helper module or sub-class
+of C<autodie> itself.
+
+=head2 What are hints?
+
+A I<hint> is a subroutine or value that is checked against the
+return value of an autodying subroutine. If the match returns true,
+C<autodie> considers the subroutine to have failed.
+
+If the hint provided is a subroutine, then C<autodie> will pass
+the complete return value to that subroutine. If the hint is
+any other value, then C<autodie> will smart-match against the
+value provided. In Perl 5.8.x there is no smart-match operator, and as such
+only subroutine hints are supported in these versions.
+
+Hints can be provided for both scalar and list contexts. Note
+that an autodying subroutine will never see a void context, as
+C<autodie> always needs to capture the return value for examination.
+Autodying subroutines called in void context act as if they're called
+in a scalar context, but their return value is discarded after it
+has been checked.
+
+=head2 Example hints
+
+Hints may consist of scalars, array references, regular expressions and
+subroutine references. You can specify different hints for how
+failure should be identified in scalar and list contexts.
+
+These examples apply for use in the C<AUTODIE_HINTS> subroutine and when
+calling C<autodie::hints->set_hints_for()>.
+
+The most common context-specific hints are:
+
+ # Scalar failures always return undef:
+ { scalar => undef }
+
+ # Scalar failures return any false value [default expectation]:
+ { scalar => sub { ! $_[0] } }
+
+ # Scalar failures always return zero explicitly:
+ { scalar => '0' }
+
+ # List failures always return an empty list:
+ { list => [] }
+
+ # List failures return () or (undef) [default expectation]:
+ { list => sub { ! @_ || @_ == 1 && !defined $_[0] } }
+
+ # List failures return () or a single false value:
+ { list => sub { ! @_ || @_ == 1 && !$_[0] } }
+
+ # List failures return (undef, "some string")
+ { list => sub { @_ == 2 && !defined $_[0] } }
+
+ # Unsuccessful foo() returns 'FAIL' or '_FAIL' in scalar context,
+ # returns (-1) in list context...
+ autodie::hints->set_hints_for(
+ \&foo,
+ {
+ scalar => qr/^ _? FAIL $/xms,
+ list => [-1],
+ }
+ );
+
+ # Unsuccessful foo() returns 0 in all contexts...
+ autodie::hints->set_hints_for(
+ \&foo,
+ {
+ scalar => 0,
+ list => [0],
+ }
+ );
+
+This "in all contexts" construction is very common, and can be
+abbreviated, using the 'fail' key. This sets both the C<scalar>
+and C<list> hints to the same value:
+
+ # Unsuccessful foo() returns 0 in all contexts...
+ autodie::hints->set_hints_for(
+ \&foo,
+ {
+ fail => sub { @_ == 1 and defined $_[0] and $_[0] == 0 }
+ }
+ );
+
+ # Unsuccessful think_positive() returns negative number on failure...
+ autodie::hints->set_hints_for(
+ \&think_positive,
+ {
+ fail => sub { $_[0] < 0 }
+ }
+ );
+
+ # Unsuccessful my_system() returns non-zero on failure...
+ autodie::hints->set_hints_for(
+ \&my_system,
+ {
+ fail => sub { $_[0] != 0 }
+ }
+ );
+
+=head1 Manually setting hints from within your program
+
+If you are using a module which returns something special on failure, then
+you can manually create hints for each of the desired subroutines. Once
+the hints are specified, they are available for all files and modules loaded
+thereafter, thus you can move this work into a module and it will still
+work.
+
+ use Some::Module qw(foo bar);
+ use autodie::hints;
+
+ autodie::hints->set_hints_for(
+ \&foo,
+ {
+ scalar => SCALAR_HINT,
+ list => LIST_HINT,
+ }
+ );
+ autodie::hints->set_hints_for(
+ \&bar,
+ { fail => SOME_HINT, }
+ );
+
+It is possible to pass either a subroutine reference (recommended) or a fully
+qualified subroutine name as the first argument. This means you can set hints
+on modules that I<might> get loaded:
+
+ use autodie::hints;
+ autodie::hints->set_hints_for(
+ 'Some::Module:bar', { fail => SCALAR_HINT, }
+ );
+
+This technique is most useful when you have a project that uses a
+lot of third-party modules. You can define all your possible hints
+in one-place. This can even be in a sub-class of autodie. For
+example:
+
+ package my::autodie;
+
+ use parent qw(autodie);
+ use autodie::hints;
+
+ autodie::hints->set_hints_for(...);
+
+ 1;
+
+You can now C<use my::autodie>, which will work just like the standard
+C<autodie>, but is now aware of any hints that you've set.
+
+=head1 Adding hints to your module
+
+C<autodie> provides a passive interface to allow you to declare hints for
+your module. These hints will be found and used by C<autodie> if it
+is loaded, but otherwise have no effect (or dependencies) without autodie.
+To set these, your module needs to declare that it I<does> the
+C<autodie::hints::provider> role. This can be done by writing your
+own C<DOES> method, using a system such as C<Class::DOES> to handle
+the heavy-lifting for you, or declaring a C<%DOES> package variable
+with a C<autodie::hints::provider> key and a corresponding true value.
+
+Note that checking for a C<%DOES> hash is an C<autodie>-only
+short-cut. Other modules do not use this mechanism for checking
+roles, although you can use the C<Class::DOES> module from the
+CPAN to allow it.
+
+In addition, you must define a C<AUTODIE_HINTS> subroutine that returns
+a hash-reference containing the hints for your subroutines:
+
+ package Your::Module;
+
+ # We can use the Class::DOES from the CPAN to declare adherence
+ # to a role.
+
+ use Class::DOES 'autodie::hints::provider' => 1;
+
+ # Alternatively, we can declare the role in %DOES. Note that
+ # this is an autodie specific optimisation, although Class::DOES
+ # can be used to promote this to a true role declaration.
+
+ our %DOES = ( 'autodie::hints::provider' => 1 );
+
+ # Finally, we must define the hints themselves.
+
+ sub AUTODIE_HINTS {
+ return {
+ foo => { scalar => HINTS, list => SOME_HINTS },
+ bar => { scalar => HINTS, list => MORE_HINTS },
+ baz => { fail => HINTS },
+ }
+ }
+
+This allows your code to set hints without relying on C<autodie> and
+C<autodie::hints> being loaded, or even installed. In this way your
+code can do the right thing when C<autodie> is installed, but does not
+need to depend upon it to function.
+
+=head1 Insisting on hints
+
+When a user-defined subroutine is wrapped by C<autodie>, it will
+use hints if they are available, and otherwise reverts to the
+I<default behaviour> described in the introduction of this document.
+This can be problematic if we expect a hint to exist, but (for
+whatever reason) it has not been loaded.
+
+We can ask autodie to I<insist> that a hint be used by prefixing
+an exclamation mark to the start of the subroutine name. A lone
+exclamation mark indicates that I<all> subroutines after it must
+have hints declared.
+
+ # foo() and bar() must have their hints defined
+ use autodie qw( !foo !bar baz );
+
+ # Everything must have hints (recommended).
+ use autodie qw( ! foo bar baz );
+
+ # bar() and baz() must have their hints defined
+ use autodie qw( foo ! bar baz );
+
+ # Enable autodie for all of Perl's supported built-ins,
+ # as well as for foo(), bar() and baz(). Everything must
+ # have hints.
+ use autodie qw( ! :all foo bar baz );
+
+If hints are not available for the specified subroutines, this will cause a
+compile-time error. Insisting on hints for Perl's built-in functions
+(eg, C<open> and C<close>) is always successful.
+
+Insisting on hints is I<strongly> recommended.
+
+=cut
+
+# TODO: implement regular expression hints
+
+use constant UNDEF_ONLY => sub { not defined $_[0] };
+use constant EMPTY_OR_UNDEF => sub {
+ ! @_ or
+ @_==1 && !defined $_[0]
+};
+
+use constant EMPTY_ONLY => sub { @_ == 0 };
+use constant EMPTY_OR_FALSE => sub {
+ ! @_ or
+ @_==1 && !$_[0]
+};
+
+use constant SINGLE_TRUE => sub { @_ == 1 and not $_[0] };
+
+use constant DEFAULT_HINTS => {
+ scalar => UNDEF_ONLY,
+ list => EMPTY_OR_UNDEF,
+};
+
+
+use constant HINTS_PROVIDER => 'autodie::hints::provider';
+
+use base qw(Exporter);
+
+our $DEBUG = 0;
+
+# Only ( undef ) is a strange but possible situation for very
+# badly written code. It's not supported yet.
+
+my %Hints = (
+ 'File::Copy::copy' => { scalar => SINGLE_TRUE, list => SINGLE_TRUE },
+ 'File::Copy::move' => { scalar => SINGLE_TRUE, list => SINGLE_TRUE },
+ 'File::Copy::cp' => { scalar => SINGLE_TRUE, list => SINGLE_TRUE },
+ 'File::Copy::mv' => { scalar => SINGLE_TRUE, list => SINGLE_TRUE },
+);
+
+# Start by using Sub::Identify if it exists on this system.
+
+eval { require Sub::Identify; Sub::Identify->import('get_code_info'); };
+
+# If it doesn't exist, we'll define our own. This code is directly
+# taken from Rafael Garcia's Sub::Identify 0.04, used under the same
+# license as Perl itself.
+
+if ($@) {
+ require B;
+
+ no warnings 'once';
+
+ *get_code_info = sub ($) {
+
+ my ($coderef) = @_;
+ ref $coderef or return;
+ my $cv = B::svref_2object($coderef);
+ $cv->isa('B::CV') or return;
+ # bail out if GV is undefined
+ $cv->GV->isa('B::SPECIAL') and return;
+
+ return ($cv->GV->STASH->NAME, $cv->GV->NAME);
+ };
+
+}
+
+sub sub_fullname {
+ return join( '::', get_code_info( $_[1] ) );
+}
+
+my %Hints_loaded = ();
+
+sub load_hints {
+ my ($class, $sub) = @_;
+
+ my ($package) = ( $sub =~ /(.*)::/ );
+
+ if (not defined $package) {
+ require Carp;
+ Carp::croak(
+ "Internal error in autodie::hints::load_hints - no package found.
+ ");
+ }
+
+ # Do nothing if we've already tried to load hints for
+ # this package.
+ return if $Hints_loaded{$package}++;
+
+ my $hints_available = 0;
+
+ {
+ no strict 'refs'; ## no critic
+
+ if ($package->can('DOES') and $package->DOES(HINTS_PROVIDER) ) {
+ $hints_available = 1;
+ }
+ elsif ( PERL58 and $package->isa(HINTS_PROVIDER) ) {
+ $hints_available = 1;
+ }
+ elsif ( ${"${package}::DOES"}{HINTS_PROVIDER.""} ) {
+ $hints_available = 1;
+ }
+ }
+
+ return if not $hints_available;
+
+ my %package_hints = %{ $package->AUTODIE_HINTS };
+
+ foreach my $sub (keys %package_hints) {
+
+ my $hint = $package_hints{$sub};
+
+ # Ensure we have a package name.
+ $sub = "${package}::$sub" if $sub !~ /::/;
+
+ # TODO - Currently we don't check for conflicts, should we?
+ $Hints{$sub} = $hint;
+
+ $class->normalise_hints(\%Hints, $sub);
+ }
+
+ return;
+
+}
+
+sub normalise_hints {
+ my ($class, $hints, $sub) = @_;
+
+ if ( exists $hints->{$sub}->{fail} ) {
+
+ if ( exists $hints->{$sub}->{scalar} or
+ exists $hints->{$sub}->{list}
+ ) {
+ # TODO: Turn into a proper diagnostic.
+ require Carp;
+ local $Carp::CarpLevel = 1;
+ Carp::croak("fail hints cannot be provided with either scalar or list hints for $sub");
+ }
+
+ # Set our scalar and list hints.
+
+ $hints->{$sub}->{scalar} =
+ $hints->{$sub}->{list} = delete $hints->{$sub}->{fail};
+
+ return;
+
+ }
+
+ # Check to make sure all our hints exist.
+
+ foreach my $hint (qw(scalar list)) {
+ if ( not exists $hints->{$sub}->{$hint} ) {
+ # TODO: Turn into a proper diagnostic.
+ require Carp;
+ local $Carp::CarpLevel = 1;
+ Carp::croak("$hint hint missing for $sub");
+ }
+ }
+
+ return;
+}
+
+sub get_hints_for {
+ my ($class, $sub) = @_;
+
+ my $subname = $class->sub_fullname( $sub );
+
+ # If we have hints loaded for a sub, then return them.
+
+ if ( exists $Hints{ $subname } ) {
+ return $Hints{ $subname };
+ }
+
+ # If not, we try to load them...
+
+ $class->load_hints( $subname );
+
+ # ...and try again!
+
+ if ( exists $Hints{ $subname } ) {
+ return $Hints{ $subname };
+ }
+
+ # It's the caller's responsibility to use defaults if desired.
+ # This allows on autodie to insist on hints if needed.
+
+ return;
+
+}
+
+sub set_hints_for {
+ my ($class, $sub, $hints) = @_;
+
+ if (ref $sub) {
+ $sub = $class->sub_fullname( $sub );
+
+ require Carp;
+
+ $sub or Carp::croak("Attempts to set_hints_for unidentifiable subroutine");
+ }
+
+ if ($DEBUG) {
+ warn "autodie::hints: Setting $sub to hints: $hints\n";
+ }
+
+ $Hints{ $sub } = $hints;
+
+ $class->normalise_hints(\%Hints, $sub);
+
+ return;
+}
+
+1;
+
+__END__
+
+
+=head1 Diagnostics
+
+=over 4
+
+=item Attempts to set_hints_for unidentifiable subroutine
+
+You've called C<< autodie::hints->set_hints_for() >> using a subroutine
+reference, but that reference could not be resolved back to a
+subroutine name. It may be an anonymous subroutine (which can't
+be made autodying), or may lack a name for other reasons.
+
+If you receive this error with a subroutine that has a real name,
+then you may have found a bug in autodie. See L<autodie/BUGS>
+for how to report this.
+
+=item fail hints cannot be provided with either scalar or list hints for %s
+
+When defining hints, you can either supply both C<list> and
+C<scalar> keywords, I<or> you can provide a single C<fail> keyword.
+You can't mix and match them.
+
+=item %s hint missing for %s
+
+You've provided either a C<scalar> hint without supplying
+a C<list> hint, or vice-versa. You I<must> supply both C<scalar>
+and C<list> hints, I<or> a single C<fail> hint.
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+=over
+
+=item *
+
+Dr Damian Conway for suggesting the hinting interface and providing the
+example usage.
+
+=item *
+
+Jacinta Richardson for translating much of my ideas into this
+documentation.
+
+=back
+
+=head1 AUTHOR
+
+Copyright 2009, Paul Fenwick E<lt>pjf@perltraining.com.auE<gt>
+
+=head1 LICENSE
+
+This module is free software. You may distribute it under the
+same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<autodie>, L<Class::DOES>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/base.pm b/Master/tlpkg/tlperl.straw/lib/base.pm
new file mode 100755
index 00000000000..574925fb603
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/base.pm
@@ -0,0 +1,265 @@
+package base;
+
+use strict 'vars';
+use vars qw($VERSION);
+$VERSION = '2.14';
+$VERSION = eval $VERSION;
+
+# constant.pm is slow
+sub SUCCESS () { 1 }
+
+sub PUBLIC () { 2**0 }
+sub PRIVATE () { 2**1 }
+sub INHERITED () { 2**2 }
+sub PROTECTED () { 2**3 }
+
+
+my $Fattr = \%fields::attr;
+
+sub has_fields {
+ my($base) = shift;
+ my $fglob = ${"$base\::"}{FIELDS};
+ return( ($fglob && 'GLOB' eq ref($fglob) && *$fglob{HASH}) ? 1 : 0 );
+}
+
+sub has_version {
+ my($base) = shift;
+ my $vglob = ${$base.'::'}{VERSION};
+ return( ($vglob && *$vglob{SCALAR}) ? 1 : 0 );
+}
+
+sub has_attr {
+ my($proto) = shift;
+ my($class) = ref $proto || $proto;
+ return exists $Fattr->{$class};
+}
+
+sub get_attr {
+ $Fattr->{$_[0]} = [1] unless $Fattr->{$_[0]};
+ return $Fattr->{$_[0]};
+}
+
+if ($] < 5.009) {
+ *get_fields = sub {
+ # Shut up a possible typo warning.
+ () = \%{$_[0].'::FIELDS'};
+ my $f = \%{$_[0].'::FIELDS'};
+
+ # should be centralized in fields? perhaps
+ # fields::mk_FIELDS_be_OK. Peh. As long as %{ $package . '::FIELDS' }
+ # is used here anyway, it doesn't matter.
+ bless $f, 'pseudohash' if (ref($f) ne 'pseudohash');
+
+ return $f;
+ }
+}
+else {
+ *get_fields = sub {
+ # Shut up a possible typo warning.
+ () = \%{$_[0].'::FIELDS'};
+ return \%{$_[0].'::FIELDS'};
+ }
+}
+
+sub import {
+ my $class = shift;
+
+ return SUCCESS unless @_;
+
+ # List of base classes from which we will inherit %FIELDS.
+ my $fields_base;
+
+ my $inheritor = caller(0);
+ my @isa_classes;
+
+ my @bases;
+ foreach my $base (@_) {
+ if ( $inheritor eq $base ) {
+ warn "Class '$inheritor' tried to inherit from itself\n";
+ }
+
+ next if grep $_->isa($base), ($inheritor, @bases);
+
+ if (has_version($base)) {
+ ${$base.'::VERSION'} = '-1, set by base.pm'
+ unless defined ${$base.'::VERSION'};
+ }
+ else {
+ my $sigdie;
+ {
+ local $SIG{__DIE__};
+ eval "require $base";
+ # Only ignore "Can't locate" errors from our eval require.
+ # Other fatal errors (syntax etc) must be reported.
+ die if $@ && $@ !~ /^Can't locate .*? at \(eval /;
+ unless (%{"$base\::"}) {
+ require Carp;
+ local $" = " ";
+ Carp::croak(<<ERROR);
+Base class package "$base" is empty.
+ (Perhaps you need to 'use' the module which defines that package first,
+ or make that module available in \@INC (\@INC contains: @INC).
+ERROR
+ }
+ $sigdie = $SIG{__DIE__} || undef;
+ }
+ # Make sure a global $SIG{__DIE__} makes it out of the localization.
+ $SIG{__DIE__} = $sigdie if defined $sigdie;
+ ${$base.'::VERSION'} = "-1, set by base.pm"
+ unless defined ${$base.'::VERSION'};
+ }
+ push @bases, $base;
+
+ if ( has_fields($base) || has_attr($base) ) {
+ # No multiple fields inheritance *suck*
+ if ($fields_base) {
+ require Carp;
+ Carp::croak("Can't multiply inherit fields");
+ } else {
+ $fields_base = $base;
+ }
+ }
+ }
+ # Save this until the end so it's all or nothing if the above loop croaks.
+ push @{"$inheritor\::ISA"}, @isa_classes;
+
+ push @{"$inheritor\::ISA"}, @bases;
+
+ if( defined $fields_base ) {
+ inherit_fields($inheritor, $fields_base);
+ }
+}
+
+
+sub inherit_fields {
+ my($derived, $base) = @_;
+
+ return SUCCESS unless $base;
+
+ my $battr = get_attr($base);
+ my $dattr = get_attr($derived);
+ my $dfields = get_fields($derived);
+ my $bfields = get_fields($base);
+
+ $dattr->[0] = @$battr;
+
+ if( keys %$dfields ) {
+ warn <<"END";
+$derived is inheriting from $base but already has its own fields!
+This will cause problems. Be sure you use base BEFORE declaring fields.
+END
+
+ }
+
+ # Iterate through the base's fields adding all the non-private
+ # ones to the derived class. Hang on to the original attribute
+ # (Public, Private, etc...) and add Inherited.
+ # This is all too complicated to do efficiently with add_fields().
+ while (my($k,$v) = each %$bfields) {
+ my $fno;
+ if ($fno = $dfields->{$k} and $fno != $v) {
+ require Carp;
+ Carp::croak ("Inherited fields can't override existing fields");
+ }
+
+ if( $battr->[$v] & PRIVATE ) {
+ $dattr->[$v] = PRIVATE | INHERITED;
+ }
+ else {
+ $dattr->[$v] = INHERITED | $battr->[$v];
+ $dfields->{$k} = $v;
+ }
+ }
+
+ foreach my $idx (1..$#{$battr}) {
+ next if defined $dattr->[$idx];
+ $dattr->[$idx] = $battr->[$idx] & INHERITED;
+ }
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+base - Establish an ISA relationship with base classes at compile time
+
+=head1 SYNOPSIS
+
+ package Baz;
+ use base qw(Foo Bar);
+
+=head1 DESCRIPTION
+
+Unless you are using the C<fields> pragma, consider this module discouraged
+in favor of the lighter-weight C<parent>.
+
+Allows you to both load one or more modules, while setting up inheritance from
+those modules at the same time. Roughly similar in effect to
+
+ package Baz;
+ BEGIN {
+ require Foo;
+ require Bar;
+ push @ISA, qw(Foo Bar);
+ }
+
+C<base> employs some heuristics to determine if a module has already been
+loaded, if it has it doesn't try again. If C<base> tries to C<require> the
+module it will not die if it cannot find the module's file, but will die on any
+other error. After all this, should your base class be empty, containing no
+symbols, it will die. This is useful for inheriting from classes in the same
+file as yourself, like so:
+
+ package Foo;
+ sub exclaim { "I can have such a thing?!" }
+
+ package Bar;
+ use base "Foo";
+
+If $VERSION is not detected even after loading it, <base> will define $VERSION
+in the base package, setting it to the string C<-1, set by base.pm>.
+
+C<base> will also initialize the fields if one of the base classes has it.
+Multiple inheritance of fields is B<NOT> supported, if two or more base classes
+each have inheritable fields the 'base' pragma will croak. See L<fields>,
+L<public> and L<protected> for a description of this feature.
+
+The base class' C<import> method is B<not> called.
+
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item Base class package "%s" is empty.
+
+base.pm was unable to require the base package, because it was not
+found in your path.
+
+=item Class 'Foo' tried to inherit from itself
+
+Attempting to inherit from yourself generates a warning.
+
+ use Foo;
+ use base 'Foo';
+
+=back
+
+=head1 HISTORY
+
+This module was introduced with Perl 5.004_04.
+
+=head1 CAVEATS
+
+Due to the limitations of the implementation, you must use
+base I<before> you declare any of your own fields.
+
+
+=head1 SEE ALSO
+
+L<fields>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/bigint.pl b/Master/tlpkg/tlperl.straw/lib/bigint.pl
new file mode 100755
index 00000000000..bd1d91f8229
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/bigint.pl
@@ -0,0 +1,320 @@
+package bigint;
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Math::BigInt
+#
+# arbitrary size integer math package
+#
+# by Mark Biggar
+#
+# Canonical Big integer value are strings of the form
+# /^[+-]\d+$/ with leading zeros suppressed
+# Input values to these routines may be strings of the form
+# /^\s*[+-]?[\d\s]+$/.
+# Examples:
+# '+0' canonical zero value
+# ' -123 123 123' canonical value '-123123123'
+# '1 23 456 7890' canonical value '+1234567890'
+# Output values always in canonical form
+#
+# Actual math is done in an internal format consisting of an array
+# whose first element is the sign (/^[+-]$/) and whose remaining
+# elements are base 100000 digits with the least significant digit first.
+# The string 'NaN' is used to represent the result when input arguments
+# are not numbers, as well as the result of dividing by zero
+#
+# routines provided are:
+#
+# bneg(BINT) return BINT negation
+# babs(BINT) return BINT absolute value
+# bcmp(BINT,BINT) return CODE compare numbers (undef,<0,=0,>0)
+# badd(BINT,BINT) return BINT addition
+# bsub(BINT,BINT) return BINT subtraction
+# bmul(BINT,BINT) return BINT multiplication
+# bdiv(BINT,BINT) return (BINT,BINT) division (quo,rem) just quo if scalar
+# bmod(BINT,BINT) return BINT modulus
+# bgcd(BINT,BINT) return BINT greatest common divisor
+# bnorm(BINT) return BINT normalization
+#
+
+# overcome a floating point problem on certain osnames (posix-bc, os390)
+BEGIN {
+ my $x = 100000.0;
+ my $use_mult = int($x*1e-5)*1e5 == $x ? 1 : 0;
+}
+
+$zero = 0;
+
+
+# normalize string form of number. Strip leading zeros. Strip any
+# white space and add a sign, if missing.
+# Strings that are not numbers result the value 'NaN'.
+
+sub main'bnorm { #(num_str) return num_str
+ local($_) = @_;
+ s/\s+//g; # strip white space
+ if (s/^([+-]?)0*(\d+)$/$1$2/) { # test if number
+ substr($_,$[,0) = '+' unless $1; # Add missing sign
+ s/^-0/+0/;
+ $_;
+ } else {
+ 'NaN';
+ }
+}
+
+# Convert a number from string format to internal base 100000 format.
+# Assumes normalized value as input.
+sub internal { #(num_str) return int_num_array
+ local($d) = @_;
+ ($is,$il) = (substr($d,$[,1),length($d)-2);
+ substr($d,$[,1) = '';
+ ($is, reverse(unpack("a" . ($il%5+1) . ("a5" x ($il/5)), $d)));
+}
+
+# Convert a number from internal base 100000 format to string format.
+# This routine scribbles all over input array.
+sub external { #(int_num_array) return num_str
+ $es = shift;
+ grep($_ > 9999 || ($_ = substr('0000'.$_,-5)), @_); # zero pad
+ &'bnorm(join('', $es, reverse(@_))); # reverse concat and normalize
+}
+
+# Negate input value.
+sub main'bneg { #(num_str) return num_str
+ local($_) = &'bnorm(@_);
+ vec($_,0,8) ^= ord('+') ^ ord('-') unless $_ eq '+0';
+ s/^./N/ unless /^[-+]/; # works both in ASCII and EBCDIC
+ $_;
+}
+
+# Returns the absolute value of the input.
+sub main'babs { #(num_str) return num_str
+ &abs(&'bnorm(@_));
+}
+
+sub abs { # post-normalized abs for internal use
+ local($_) = @_;
+ s/^-/+/;
+ $_;
+}
+
+# Compares 2 values. Returns one of undef, <0, =0, >0. (suitable for sort)
+sub main'bcmp { #(num_str, num_str) return cond_code
+ local($x,$y) = (&'bnorm($_[$[]),&'bnorm($_[$[+1]));
+ if ($x eq 'NaN') {
+ undef;
+ } elsif ($y eq 'NaN') {
+ undef;
+ } else {
+ &cmp($x,$y);
+ }
+}
+
+sub cmp { # post-normalized compare for internal use
+ local($cx, $cy) = @_;
+ return 0 if ($cx eq $cy);
+
+ local($sx, $sy) = (substr($cx, 0, 1), substr($cy, 0, 1));
+ local($ld);
+
+ if ($sx eq '+') {
+ return 1 if ($sy eq '-' || $cy eq '+0');
+ $ld = length($cx) - length($cy);
+ return $ld if ($ld);
+ return $cx cmp $cy;
+ } else { # $sx eq '-'
+ return -1 if ($sy eq '+');
+ $ld = length($cy) - length($cx);
+ return $ld if ($ld);
+ return $cy cmp $cx;
+ }
+
+}
+
+sub main'badd { #(num_str, num_str) return num_str
+ local(*x, *y); ($x, $y) = (&'bnorm($_[$[]),&'bnorm($_[$[+1]));
+ if ($x eq 'NaN') {
+ 'NaN';
+ } elsif ($y eq 'NaN') {
+ 'NaN';
+ } else {
+ @x = &internal($x); # convert to internal form
+ @y = &internal($y);
+ local($sx, $sy) = (shift @x, shift @y); # get signs
+ if ($sx eq $sy) {
+ &external($sx, &add(*x, *y)); # if same sign add
+ } else {
+ ($x, $y) = (&abs($x),&abs($y)); # make abs
+ if (&cmp($y,$x) > 0) {
+ &external($sy, &sub(*y, *x));
+ } else {
+ &external($sx, &sub(*x, *y));
+ }
+ }
+ }
+}
+
+sub main'bsub { #(num_str, num_str) return num_str
+ &'badd($_[$[],&'bneg($_[$[+1]));
+}
+
+# GCD -- Euclids algorithm Knuth Vol 2 pg 296
+sub main'bgcd { #(num_str, num_str) return num_str
+ local($x,$y) = (&'bnorm($_[$[]),&'bnorm($_[$[+1]));
+ if ($x eq 'NaN' || $y eq 'NaN') {
+ 'NaN';
+ } else {
+ ($x, $y) = ($y,&'bmod($x,$y)) while $y ne '+0';
+ $x;
+ }
+}
+
+# routine to add two base 1e5 numbers
+# stolen from Knuth Vol 2 Algorithm A pg 231
+# there are separate routines to add and sub as per Kunth pg 233
+sub add { #(int_num_array, int_num_array) return int_num_array
+ local(*x, *y) = @_;
+ $car = 0;
+ for $x (@x) {
+ last unless @y || $car;
+ $x -= 1e5 if $car = (($x += shift(@y) + $car) >= 1e5) ? 1 : 0;
+ }
+ for $y (@y) {
+ last unless $car;
+ $y -= 1e5 if $car = (($y += $car) >= 1e5) ? 1 : 0;
+ }
+ (@x, @y, $car);
+}
+
+# subtract base 1e5 numbers -- stolen from Knuth Vol 2 pg 232, $x > $y
+sub sub { #(int_num_array, int_num_array) return int_num_array
+ local(*sx, *sy) = @_;
+ $bar = 0;
+ for $sx (@sx) {
+ last unless @y || $bar;
+ $sx += 1e5 if $bar = (($sx -= shift(@sy) + $bar) < 0);
+ }
+ @sx;
+}
+
+# multiply two numbers -- stolen from Knuth Vol 2 pg 233
+sub main'bmul { #(num_str, num_str) return num_str
+ local(*x, *y); ($x, $y) = (&'bnorm($_[$[]), &'bnorm($_[$[+1]));
+ if ($x eq 'NaN') {
+ 'NaN';
+ } elsif ($y eq 'NaN') {
+ 'NaN';
+ } else {
+ @x = &internal($x);
+ @y = &internal($y);
+ local($signr) = (shift @x ne shift @y) ? '-' : '+';
+ @prod = ();
+ for $x (@x) {
+ ($car, $cty) = (0, $[);
+ for $y (@y) {
+ $prod = $x * $y + $prod[$cty] + $car;
+ if ($use_mult) {
+ $prod[$cty++] =
+ $prod - ($car = int($prod * 1e-5)) * 1e5;
+ }
+ else {
+ $prod[$cty++] =
+ $prod - ($car = int($prod / 1e5)) * 1e5;
+ }
+ }
+ $prod[$cty] += $car if $car;
+ $x = shift @prod;
+ }
+ &external($signr, @x, @prod);
+ }
+}
+
+# modulus
+sub main'bmod { #(num_str, num_str) return num_str
+ (&'bdiv(@_))[$[+1];
+}
+
+sub main'bdiv { #(dividend: num_str, divisor: num_str) return num_str
+ local (*x, *y); ($x, $y) = (&'bnorm($_[$[]), &'bnorm($_[$[+1]));
+ return wantarray ? ('NaN','NaN') : 'NaN'
+ if ($x eq 'NaN' || $y eq 'NaN' || $y eq '+0');
+ return wantarray ? ('+0',$x) : '+0' if (&cmp(&abs($x),&abs($y)) < 0);
+ @x = &internal($x); @y = &internal($y);
+ $srem = $y[$[];
+ $sr = (shift @x ne shift @y) ? '-' : '+';
+ $car = $bar = $prd = 0;
+ if (($dd = int(1e5/($y[$#y]+1))) != 1) {
+ for $x (@x) {
+ $x = $x * $dd + $car;
+ if ($use_mult) {
+ $x -= ($car = int($x * 1e-5)) * 1e5;
+ }
+ else {
+ $x -= ($car = int($x / 1e5)) * 1e5;
+ }
+ }
+ push(@x, $car); $car = 0;
+ for $y (@y) {
+ $y = $y * $dd + $car;
+ if ($use_mult) {
+ $y -= ($car = int($y * 1e-5)) * 1e5;
+ }
+ else {
+ $y -= ($car = int($y / 1e5)) * 1e5;
+ }
+ }
+ }
+ else {
+ push(@x, 0);
+ }
+ @q = (); ($v2,$v1) = @y[-2,-1];
+ while ($#x > $#y) {
+ ($u2,$u1,$u0) = @x[-3..-1];
+ $q = (($u0 == $v1) ? 99999 : int(($u0*1e5+$u1)/$v1));
+ --$q while ($v2*$q > ($u0*1e5+$u1-$q*$v1)*1e5+$u2);
+ if ($q) {
+ ($car, $bar) = (0,0);
+ for ($y = $[, $x = $#x-$#y+$[-1; $y <= $#y; ++$y,++$x) {
+ $prd = $q * $y[$y] + $car;
+ if ($use_mult) {
+ $prd -= ($car = int($prd * 1e-5)) * 1e5;
+ }
+ else {
+ $prd -= ($car = int($prd / 1e5)) * 1e5;
+ }
+ $x[$x] += 1e5 if ($bar = (($x[$x] -= $prd + $bar) < 0));
+ }
+ if ($x[$#x] < $car + $bar) {
+ $car = 0; --$q;
+ for ($y = $[, $x = $#x-$#y+$[-1; $y <= $#y; ++$y,++$x) {
+ $x[$x] -= 1e5
+ if ($car = (($x[$x] += $y[$y] + $car) > 1e5));
+ }
+ }
+ }
+ pop(@x); unshift(@q, $q);
+ }
+ if (wantarray) {
+ @d = ();
+ if ($dd != 1) {
+ $car = 0;
+ for $x (reverse @x) {
+ $prd = $car * 1e5 + $x;
+ $car = $prd - ($tmp = int($prd / $dd)) * $dd;
+ unshift(@d, $tmp);
+ }
+ }
+ else {
+ @d = @x;
+ }
+ (&external($sr, @q), &external($srem, @d, $zero));
+ } else {
+ &external($sr, @q);
+ }
+}
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/bignum.pm b/Master/tlpkg/tlperl.straw/lib/bignum.pm
new file mode 100755
index 00000000000..2e075c8b5a7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/bignum.pm
@@ -0,0 +1,681 @@
+package bignum;
+use 5.006;
+
+$VERSION = '0.23';
+use Exporter;
+@ISA = qw( bigint );
+@EXPORT_OK = qw( PI e bexp bpi );
+@EXPORT = qw( inf NaN );
+
+use strict;
+use overload;
+require bigint; # no "use" to avoid import being called
+
+##############################################################################
+
+BEGIN
+ {
+ *inf = \&bigint::inf;
+ *NaN = \&bigint::NaN;
+ }
+
+# These are all alike, and thus faked by AUTOLOAD
+
+my @faked = qw/round_mode accuracy precision div_scale/;
+use vars qw/$VERSION $AUTOLOAD $_lite/; # _lite for testsuite
+
+sub AUTOLOAD
+ {
+ my $name = $AUTOLOAD;
+
+ $name =~ s/.*:://; # split package
+ no strict 'refs';
+ foreach my $n (@faked)
+ {
+ if ($n eq $name)
+ {
+ *{"bignum::$name"} = sub
+ {
+ my $self = shift;
+ no strict 'refs';
+ if (defined $_[0])
+ {
+ Math::BigInt->$name($_[0]);
+ return Math::BigFloat->$name($_[0]);
+ }
+ return Math::BigInt->$name();
+ };
+ return &$name;
+ }
+ }
+
+ # delayed load of Carp and avoid recursion
+ require Carp;
+ Carp::croak ("Can't call bignum\-\>$name, not a valid method");
+ }
+
+sub unimport
+ {
+ $^H{bignum} = undef; # no longer in effect
+ overload::remove_constant('binary','','float','','integer');
+ }
+
+sub in_effect
+ {
+ my $level = shift || 0;
+ my $hinthash = (caller($level))[10];
+ $hinthash->{bignum};
+ }
+
+#############################################################################
+# the following two routines are for Perl 5.9.4 or later and are lexical
+
+sub _hex
+ {
+ return CORE::hex($_[0]) unless in_effect(1);
+ my $i = $_[0];
+ $i = '0x'.$i unless $i =~ /^0x/;
+ Math::BigInt->new($i);
+ }
+
+sub _oct
+ {
+ return CORE::oct($_[0]) unless in_effect(1);
+ my $i = $_[0];
+ return Math::BigInt->from_oct($i) if $i =~ /^0[0-7]/;
+ Math::BigInt->new($i);
+ }
+
+sub import
+ {
+ my $self = shift;
+
+ $^H{bignum} = 1; # we are in effect
+
+ my ($hex,$oct);
+
+ # for newer Perls override hex() and oct() with a lexical version:
+ if ($] > 5.009003)
+ {
+ $hex = \&_hex;
+ $oct = \&_oct;
+ }
+
+ # some defaults
+ my $lib = ''; my $lib_kind = 'try';
+ my $upgrade = 'Math::BigFloat';
+ my $downgrade = 'Math::BigInt';
+
+ my @import = ( ':constant' ); # drive it w/ constant
+ my @a = @_; my $l = scalar @_; my $j = 0;
+ my ($ver,$trace); # version? trace?
+ my ($a,$p); # accuracy, precision
+ for ( my $i = 0; $i < $l ; $i++,$j++ )
+ {
+ if ($_[$i] eq 'upgrade')
+ {
+ # this causes upgrading
+ $upgrade = $_[$i+1]; # or undef to disable
+ my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
+ splice @a, $j, $s; $j -= $s; $i++;
+ }
+ elsif ($_[$i] eq 'downgrade')
+ {
+ # this causes downgrading
+ $downgrade = $_[$i+1]; # or undef to disable
+ my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
+ splice @a, $j, $s; $j -= $s; $i++;
+ }
+ elsif ($_[$i] =~ /^(l|lib|try|only)$/)
+ {
+ # this causes a different low lib to take care...
+ $lib_kind = $1; $lib_kind = 'lib' if $lib_kind eq 'l';
+ $lib = $_[$i+1] || '';
+ my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
+ splice @a, $j, $s; $j -= $s; $i++;
+ }
+ elsif ($_[$i] =~ /^(a|accuracy)$/)
+ {
+ $a = $_[$i+1];
+ my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
+ splice @a, $j, $s; $j -= $s; $i++;
+ }
+ elsif ($_[$i] =~ /^(p|precision)$/)
+ {
+ $p = $_[$i+1];
+ my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
+ splice @a, $j, $s; $j -= $s; $i++;
+ }
+ elsif ($_[$i] =~ /^(v|version)$/)
+ {
+ $ver = 1;
+ splice @a, $j, 1; $j --;
+ }
+ elsif ($_[$i] =~ /^(t|trace)$/)
+ {
+ $trace = 1;
+ splice @a, $j, 1; $j --;
+ }
+ elsif ($_[$i] eq 'hex')
+ {
+ splice @a, $j, 1; $j --;
+ $hex = \&bigint::_hex_global;
+ }
+ elsif ($_[$i] eq 'oct')
+ {
+ splice @a, $j, 1; $j --;
+ $oct = \&bigint::_oct_global;
+ }
+ elsif ($_[$i] !~ /^(PI|e|bexp|bpi)\z/)
+ {
+ die ("unknown option $_[$i]");
+ }
+ }
+ my $class;
+ $_lite = 0; # using M::BI::L ?
+ if ($trace)
+ {
+ require Math::BigInt::Trace; $class = 'Math::BigInt::Trace';
+ $upgrade = 'Math::BigFloat::Trace';
+ }
+ else
+ {
+ # see if we can find Math::BigInt::Lite
+ if (!defined $a && !defined $p) # rounding won't work to well
+ {
+ eval 'require Math::BigInt::Lite;';
+ if ($@ eq '')
+ {
+ @import = ( ); # :constant in Lite, not MBI
+ Math::BigInt::Lite->import( ':constant' );
+ $_lite= 1; # signal okay
+ }
+ }
+ require Math::BigInt if $_lite == 0; # not already loaded?
+ $class = 'Math::BigInt'; # regardless of MBIL or not
+ }
+ push @import, $lib_kind => $lib if $lib ne '';
+ # Math::BigInt::Trace or plain Math::BigInt
+ $class->import(@import, upgrade => $upgrade);
+
+ if ($trace)
+ {
+ require Math::BigFloat::Trace; $class = 'Math::BigFloat::Trace';
+ $downgrade = 'Math::BigInt::Trace';
+ }
+ else
+ {
+ require Math::BigFloat; $class = 'Math::BigFloat';
+ }
+ $class->import(':constant','downgrade',$downgrade);
+
+ bignum->accuracy($a) if defined $a;
+ bignum->precision($p) if defined $p;
+ if ($ver)
+ {
+ print "bignum\t\t\t v$VERSION\n";
+ print "Math::BigInt::Lite\t v$Math::BigInt::Lite::VERSION\n" if $_lite;
+ print "Math::BigInt\t\t v$Math::BigInt::VERSION";
+ my $config = Math::BigInt->config();
+ print " lib => $config->{lib} v$config->{lib_version}\n";
+ print "Math::BigFloat\t\t v$Math::BigFloat::VERSION\n";
+ exit;
+ }
+
+ # Take care of octal/hexadecimal constants
+ overload::constant binary => sub { bigint::_binary_constant(shift) };
+
+ # if another big* was already loaded:
+ my ($package) = caller();
+
+ no strict 'refs';
+ if (!defined *{"${package}::inf"})
+ {
+ $self->export_to_level(1,$self,@a); # export inf and NaN
+ }
+ {
+ no warnings 'redefine';
+ *CORE::GLOBAL::oct = $oct if $oct;
+ *CORE::GLOBAL::hex = $hex if $hex;
+ }
+ }
+
+sub PI () { Math::BigFloat->new('3.141592653589793238462643383279502884197'); }
+sub e () { Math::BigFloat->new('2.718281828459045235360287471352662497757'); }
+sub bpi ($) { Math::BigFloat::bpi(@_); }
+sub bexp ($$) { my $x = Math::BigFloat->new($_[0]); $x->bexp($_[1]); }
+
+1;
+
+__END__
+
+=head1 NAME
+
+bignum - Transparent BigNumber support for Perl
+
+=head1 SYNOPSIS
+
+ use bignum;
+
+ $x = 2 + 4.5,"\n"; # BigFloat 6.5
+ print 2 ** 512 * 0.1,"\n"; # really is what you think it is
+ print inf * inf,"\n"; # prints inf
+ print NaN * 3,"\n"; # prints NaN
+
+ {
+ no bignum;
+ print 2 ** 256,"\n"; # a normal Perl scalar now
+ }
+
+ # for older Perls, note that this will be global:
+ use bignum qw/hex oct/;
+ print hex("0x1234567890123490"),"\n";
+ print oct("01234567890123490"),"\n";
+
+=head1 DESCRIPTION
+
+All operators (including basic math operations) are overloaded. Integer and
+floating-point constants are created as proper BigInts or BigFloats,
+respectively.
+
+If you do
+
+ use bignum;
+
+at the top of your script, Math::BigFloat and Math::BigInt will be loaded
+and any constant number will be converted to an object (Math::BigFloat for
+floats like 3.1415 and Math::BigInt for integers like 1234).
+
+So, the following line:
+
+ $x = 1234;
+
+creates actually a Math::BigInt and stores a reference to in $x.
+This happens transparently and behind your back, so to speak.
+
+You can see this with the following:
+
+ perl -Mbignum -le 'print ref(1234)'
+
+Don't worry if it says Math::BigInt::Lite, bignum and friends will use Lite
+if it is installed since it is faster for some operations. It will be
+automatically upgraded to BigInt whenever necessary:
+
+ perl -Mbignum -le 'print ref(2**255)'
+
+This also means it is a bad idea to check for some specific package, since
+the actual contents of $x might be something unexpected. Due to the
+transparent way of bignum C<ref()> should not be necessary, anyway.
+
+Since Math::BigInt and BigFloat also overload the normal math operations,
+the following line will still work:
+
+ perl -Mbignum -le 'print ref(1234+1234)'
+
+Since numbers are actually objects, you can call all the usual methods from
+BigInt/BigFloat on them. This even works to some extent on expressions:
+
+ perl -Mbignum -le '$x = 1234; print $x->bdec()'
+ perl -Mbignum -le 'print 1234->copy()->binc();'
+ perl -Mbignum -le 'print 1234->copy()->binc->badd(6);'
+ perl -Mbignum -le 'print +(1234)->copy()->binc()'
+
+(Note that print doesn't do what you expect if the expression starts with
+'(' hence the C<+>)
+
+You can even chain the operations together as usual:
+
+ perl -Mbignum -le 'print 1234->copy()->binc->badd(6);'
+ 1241
+
+Under bignum (or bigint or bigrat), Perl will "upgrade" the numbers
+appropriately. This means that:
+
+ perl -Mbignum -le 'print 1234+4.5'
+ 1238.5
+
+will work correctly. These mixed cases don't do always work when using
+Math::BigInt or Math::BigFloat alone, or at least not in the way normal Perl
+scalars work.
+
+If you do want to work with large integers like under C<use integer;>, try
+C<use bigint;>:
+
+ perl -Mbigint -le 'print 1234.5+4.5'
+ 1238
+
+There is also C<use bigrat;> which gives you big rationals:
+
+ perl -Mbigrat -le 'print 1234+4.1'
+ 12381/10
+
+The entire upgrading/downgrading is still experimental and might not work
+as you expect or may even have bugs. You might get errors like this:
+
+ Can't use an undefined value as an ARRAY reference at
+ /usr/local/lib/perl5/5.8.0/Math/BigInt/Calc.pm line 864
+
+This means somewhere a routine got a BigFloat/Lite but expected a BigInt (or
+vice versa) and the upgrade/downgrad path was missing. This is a bug, please
+report it so that we can fix it.
+
+You might consider using just Math::BigInt or Math::BigFloat, since they
+allow you finer control over what get's done in which module/space. For
+instance, simple loop counters will be Math::BigInts under C<use bignum;> and
+this is slower than keeping them as Perl scalars:
+
+ perl -Mbignum -le 'for ($i = 0; $i < 10; $i++) { print ref($i); }'
+
+Please note the following does not work as expected (prints nothing), since
+overloading of '..' is not yet possible in Perl (as of v5.8.0):
+
+ perl -Mbignum -le 'for (1..2) { print ref($_); }'
+
+=head2 Options
+
+bignum recognizes some options that can be passed while loading it via use.
+The options can (currently) be either a single letter form, or the long form.
+The following options exist:
+
+=over 2
+
+=item a or accuracy
+
+This sets the accuracy for all math operations. The argument must be greater
+than or equal to zero. See Math::BigInt's bround() function for details.
+
+ perl -Mbignum=a,50 -le 'print sqrt(20)'
+
+Note that setting precision and accurary at the same time is not possible.
+
+=item p or precision
+
+This sets the precision for all math operations. The argument can be any
+integer. Negative values mean a fixed number of digits after the dot, while
+a positive value rounds to this digit left from the dot. 0 or 1 mean round to
+integer. See Math::BigInt's bfround() function for details.
+
+ perl -Mbignum=p,-50 -le 'print sqrt(20)'
+
+Note that setting precision and accurary at the same time is not possible.
+
+=item t or trace
+
+This enables a trace mode and is primarily for debugging bignum or
+Math::BigInt/Math::BigFloat.
+
+=item l or lib
+
+Load a different math lib, see L<MATH LIBRARY>.
+
+ perl -Mbignum=l,GMP -e 'print 2 ** 512'
+
+Currently there is no way to specify more than one library on the command
+line. This means the following does not work:
+
+ perl -Mbignum=l,GMP,Pari -e 'print 2 ** 512'
+
+This will be hopefully fixed soon ;)
+
+=item hex
+
+Override the built-in hex() method with a version that can handle big
+integers. Note that under Perl older than v5.9.4, this will be global
+and cannot be disabled with "no bigint;".
+
+=item oct
+
+Override the built-in oct() method with a version that can handle big
+integers. Note that under Perl older than v5.9.4, this will be global
+and cannot be disabled with "no bigint;".
+
+=item v or version
+
+This prints out the name and version of all modules used and then exits.
+
+ perl -Mbignum=v
+
+=back
+
+=head2 Methods
+
+Beside import() and AUTOLOAD() there are only a few other methods.
+
+Since all numbers are now objects, you can use all functions that are part of
+the BigInt or BigFloat API. It is wise to use only the bxxx() notation, and not
+the fxxx() notation, though. This makes it possible that the underlying object
+might morph into a different class than BigFloat.
+
+=head2 Caveats
+
+But a warning is in order. When using the following to make a copy of a number,
+only a shallow copy will be made.
+
+ $x = 9; $y = $x;
+ $x = $y = 7;
+
+If you want to make a real copy, use the following:
+
+ $y = $x->copy();
+
+Using the copy or the original with overloaded math is okay, e.g. the
+following work:
+
+ $x = 9; $y = $x;
+ print $x + 1, " ", $y,"\n"; # prints 10 9
+
+but calling any method that modifies the number directly will result in
+B<both> the original and the copy being destroyed:
+
+ $x = 9; $y = $x;
+ print $x->badd(1), " ", $y,"\n"; # prints 10 10
+
+ $x = 9; $y = $x;
+ print $x->binc(1), " ", $y,"\n"; # prints 10 10
+
+ $x = 9; $y = $x;
+ print $x->bmul(2), " ", $y,"\n"; # prints 18 18
+
+Using methods that do not modify, but test the contents works:
+
+ $x = 9; $y = $x;
+ $z = 9 if $x->is_zero(); # works fine
+
+See the documentation about the copy constructor and C<=> in overload, as
+well as the documentation in BigInt for further details.
+
+=over 2
+
+=item inf()
+
+A shortcut to return Math::BigInt->binf(). Useful because Perl does not always
+handle bareword C<inf> properly.
+
+=item NaN()
+
+A shortcut to return Math::BigInt->bnan(). Useful because Perl does not always
+handle bareword C<NaN> properly.
+
+=item e
+
+ # perl -Mbignum=e -wle 'print e'
+
+Returns Euler's number C<e>, aka exp(1).
+
+=item PI()
+
+ # perl -Mbignum=PI -wle 'print PI'
+
+Returns PI.
+
+=item bexp()
+
+ bexp($power,$accuracy);
+
+Returns Euler's number C<e> raised to the appropriate power, to
+the wanted accuracy.
+
+Example:
+
+ # perl -Mbignum=bexp -wle 'print bexp(1,80)'
+
+=item bpi()
+
+ bpi($accuracy);
+
+Returns PI to the wanted accuracy.
+
+Example:
+
+ # perl -Mbignum=bpi -wle 'print bpi(80)'
+
+=item upgrade()
+
+Return the class that numbers are upgraded to, is in fact returning
+C<$Math::BigInt::upgrade>.
+
+=item in_effect()
+
+ use bignum;
+
+ print "in effect\n" if bignum::in_effect; # true
+ {
+ no bignum;
+ print "in effect\n" if bignum::in_effect; # false
+ }
+
+Returns true or false if C<bignum> is in effect in the current scope.
+
+This method only works on Perl v5.9.4 or later.
+
+=back
+
+=head2 Math Library
+
+Math with the numbers is done (by default) by a module called
+Math::BigInt::Calc. This is equivalent to saying:
+
+ use bignum lib => 'Calc';
+
+You can change this by using:
+
+ use bignum lib => 'GMP';
+
+The following would first try to find Math::BigInt::Foo, then
+Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
+
+ use bignum lib => 'Foo,Math::BigInt::Bar';
+
+Please see respective module documentation for further details.
+
+Using C<lib> warns if none of the specified libraries can be found and
+L<Math::BigInt> did fall back to one of the default libraries.
+To supress this warning, use C<try> instead:
+
+ use bignum try => 'GMP';
+
+If you want the code to die instead of falling back, use C<only> instead:
+
+ use bignum only => 'GMP';
+
+=head2 INTERNAL FORMAT
+
+The numbers are stored as objects, and their internals might change at anytime,
+especially between math operations. The objects also might belong to different
+classes, like Math::BigInt, or Math::BigFLoat. Mixing them together, even
+with normal scalars is not extraordinary, but normal and expected.
+
+You should not depend on the internal format, all accesses must go through
+accessor methods. E.g. looking at $x->{sign} is not a bright idea since there
+is no guaranty that the object in question has such a hashkey, nor is a hash
+underneath at all.
+
+=head2 SIGN
+
+The sign is either '+', '-', 'NaN', '+inf' or '-inf' and stored seperately.
+You can access it with the sign() method.
+
+A sign of 'NaN' is used to represent the result when input arguments are not
+numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively
+minus infinity. You will get '+inf' when dividing a positive number by 0, and
+'-inf' when dividing any negative number by 0.
+
+=head1 CAVAETS
+
+=over 2
+
+=item in_effect()
+
+This method only works on Perl v5.9.4 or later.
+
+=item hex()/oct()
+
+C<bigint> overrides these routines with versions that can also handle
+big integer values. Under Perl prior to version v5.9.4, however, this
+will not happen unless you specifically ask for it with the two
+import tags "hex" and "oct" - and then it will be global and cannot be
+disabled inside a scope with "no bigint":
+
+ use bigint qw/hex oct/;
+
+ print hex("0x1234567890123456");
+ {
+ no bigint;
+ print hex("0x1234567890123456");
+ }
+
+The second call to hex() will warn about a non-portable constant.
+
+Compare this to:
+
+ use bigint;
+
+ # will warn only under older than v5.9.4
+ print hex("0x1234567890123456");
+
+=back
+
+=head1 MODULES USED
+
+C<bignum> is just a thin wrapper around various modules of the Math::BigInt
+family. Think of it as the head of the family, who runs the shop, and orders
+the others to do the work.
+
+The following modules are currently used by bignum:
+
+ Math::BigInt::Lite (for speed, and only if it is loadable)
+ Math::BigInt
+ Math::BigFloat
+
+=head1 EXAMPLES
+
+Some cool command line examples to impress the Python crowd ;)
+
+ perl -Mbignum -le 'print sqrt(33)'
+ perl -Mbignum -le 'print 2*255'
+ perl -Mbignum -le 'print 4.5+2*255'
+ perl -Mbignum -le 'print 3/7 + 5/7 + 8/3'
+ perl -Mbignum -le 'print 123->is_odd()'
+ perl -Mbignum -le 'print log(2)'
+ perl -Mbignum -le 'print exp(1)'
+ perl -Mbignum -le 'print 2 ** 0.5'
+ perl -Mbignum=a,65 -le 'print 2 ** 0.2'
+ perl -Mbignum=a,65,l,GMP -le 'print 7 ** 7777'
+
+=head1 LICENSE
+
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+Especially L<bigrat> as in C<perl -Mbigrat -le 'print 1/3+1/4'>.
+
+L<Math::BigFloat>, L<Math::BigInt>, L<Math::BigRat> and L<Math::Big> as well
+as L<Math::BigInt::BitVect>, L<Math::BigInt::Pari> and L<Math::BigInt::GMP>.
+
+=head1 AUTHORS
+
+(C) by Tels L<http://bloodgate.com/> in early 2002 - 2007.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/bigrat.pl b/Master/tlpkg/tlperl.straw/lib/bigrat.pl
new file mode 100755
index 00000000000..2d3738f805b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/bigrat.pl
@@ -0,0 +1,155 @@
+package bigrat;
+require "bigint.pl";
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Arbitrary size rational math package
+#
+# by Mark Biggar
+#
+# Input values to these routines consist of strings of the form
+# m|^\s*[+-]?[\d\s]+(/[\d\s]+)?$|.
+# Examples:
+# "+0/1" canonical zero value
+# "3" canonical value "+3/1"
+# " -123/123 123" canonical value "-1/1001"
+# "123 456/7890" canonical value "+20576/1315"
+# Output values always include a sign and no leading zeros or
+# white space.
+# This package makes use of the bigint package.
+# The string 'NaN' is used to represent the result when input arguments
+# that are not numbers, as well as the result of dividing by zero and
+# the sqrt of a negative number.
+# Extreamly naive algorthims are used.
+#
+# Routines provided are:
+#
+# rneg(RAT) return RAT negation
+# rabs(RAT) return RAT absolute value
+# rcmp(RAT,RAT) return CODE compare numbers (undef,<0,=0,>0)
+# radd(RAT,RAT) return RAT addition
+# rsub(RAT,RAT) return RAT subtraction
+# rmul(RAT,RAT) return RAT multiplication
+# rdiv(RAT,RAT) return RAT division
+# rmod(RAT) return (RAT,RAT) integer and fractional parts
+# rnorm(RAT) return RAT normalization
+# rsqrt(RAT, cycles) return RAT square root
+
+# Convert a number to the canonical string form m|^[+-]\d+/\d+|.
+sub main'rnorm { #(string) return rat_num
+ local($_) = @_;
+ s/\s+//g;
+ if (m#^([+-]?\d+)(/(\d*[1-9]0*))?$#) {
+ &norm($1, $3 ? $3 : '+1');
+ } else {
+ 'NaN';
+ }
+}
+
+# Normalize by reducing to lowest terms
+sub norm { #(bint, bint) return rat_num
+ local($num,$dom) = @_;
+ if ($num eq 'NaN') {
+ 'NaN';
+ } elsif ($dom eq 'NaN') {
+ 'NaN';
+ } elsif ($dom =~ /^[+-]?0+$/) {
+ 'NaN';
+ } else {
+ local($gcd) = &'bgcd($num,$dom);
+ $gcd =~ s/^-/+/;
+ if ($gcd ne '+1') {
+ $num = &'bdiv($num,$gcd);
+ $dom = &'bdiv($dom,$gcd);
+ } else {
+ $num = &'bnorm($num);
+ $dom = &'bnorm($dom);
+ }
+ substr($dom,$[,1) = '';
+ "$num/$dom";
+ }
+}
+
+# negation
+sub main'rneg { #(rat_num) return rat_num
+ local($_) = &'rnorm(@_);
+ tr/-+/+-/ if ($_ ne '+0/1');
+ $_;
+}
+
+# absolute value
+sub main'rabs { #(rat_num) return $rat_num
+ local($_) = &'rnorm(@_);
+ substr($_,$[,1) = '+' unless $_ eq 'NaN';
+ $_;
+}
+
+# multipication
+sub main'rmul { #(rat_num, rat_num) return rat_num
+ local($xn,$xd) = split('/',&'rnorm($_[$[]));
+ local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
+ &norm(&'bmul($xn,$yn),&'bmul($xd,$yd));
+}
+
+# division
+sub main'rdiv { #(rat_num, rat_num) return rat_num
+ local($xn,$xd) = split('/',&'rnorm($_[$[]));
+ local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
+ &norm(&'bmul($xn,$yd),&'bmul($xd,$yn));
+}
+
+# addition
+sub main'radd { #(rat_num, rat_num) return rat_num
+ local($xn,$xd) = split('/',&'rnorm($_[$[]));
+ local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
+ &norm(&'badd(&'bmul($xn,$yd),&'bmul($yn,$xd)),&'bmul($xd,$yd));
+}
+
+# subtraction
+sub main'rsub { #(rat_num, rat_num) return rat_num
+ local($xn,$xd) = split('/',&'rnorm($_[$[]));
+ local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
+ &norm(&'bsub(&'bmul($xn,$yd),&'bmul($yn,$xd)),&'bmul($xd,$yd));
+}
+
+# comparison
+sub main'rcmp { #(rat_num, rat_num) return cond_code
+ local($xn,$xd) = split('/',&'rnorm($_[$[]));
+ local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
+ &bigint'cmp(&'bmul($xn,$yd),&'bmul($yn,$xd));
+}
+
+# int and frac parts
+sub main'rmod { #(rat_num) return (rat_num,rat_num)
+ local($xn,$xd) = split('/',&'rnorm(@_));
+ local($i,$f) = &'bdiv($xn,$xd);
+ if (wantarray) {
+ ("$i/1", "$f/$xd");
+ } else {
+ "$i/1";
+ }
+}
+
+# square root by Newtons method.
+# cycles specifies the number of iterations default: 5
+sub main'rsqrt { #(fnum_str[, cycles]) return fnum_str
+ local($x, $scale) = (&'rnorm($_[$[]), $_[$[+1]);
+ if ($x eq 'NaN') {
+ 'NaN';
+ } elsif ($x =~ /^-/) {
+ 'NaN';
+ } else {
+ local($gscale, $guess) = (0, '+1/1');
+ $scale = 5 if (!$scale);
+ while ($gscale++ < $scale) {
+ $guess = &'rmul(&'radd($guess,&'rdiv($x,$guess)),"+1/2");
+ }
+ "$guess"; # quotes necessary due to perl bug
+ }
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/bigrat.pm b/Master/tlpkg/tlperl.straw/lib/bigrat.pm
new file mode 100755
index 00000000000..10e8057abd0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/bigrat.pm
@@ -0,0 +1,566 @@
+package bigrat;
+use 5.006;
+
+$VERSION = '0.23';
+require Exporter;
+@ISA = qw( bigint );
+@EXPORT_OK = qw( PI e bpi bexp );
+@EXPORT = qw( inf NaN );
+
+use strict;
+use overload;
+require bigint; # no "use" to avoid callind import
+
+##############################################################################
+
+BEGIN
+ {
+ *inf = \&bigint::inf;
+ *NaN = \&bigint::NaN;
+ }
+
+# These are all alike, and thus faked by AUTOLOAD
+
+my @faked = qw/round_mode accuracy precision div_scale/;
+use vars qw/$VERSION $AUTOLOAD $_lite/; # _lite for testsuite
+
+sub AUTOLOAD
+ {
+ my $name = $AUTOLOAD;
+
+ $name =~ s/.*:://; # split package
+ no strict 'refs';
+ foreach my $n (@faked)
+ {
+ if ($n eq $name)
+ {
+ *{"bigrat::$name"} = sub
+ {
+ my $self = shift;
+ no strict 'refs';
+ if (defined $_[0])
+ {
+ Math::BigInt->$name($_[0]);
+ Math::BigFloat->$name($_[0]);
+ return Math::BigRat->$name($_[0]);
+ }
+ return Math::BigInt->$name();
+ };
+ return &$name;
+ }
+ }
+
+ # delayed load of Carp and avoid recursion
+ require Carp;
+ Carp::croak ("Can't call bigrat\-\>$name, not a valid method");
+ }
+
+sub unimport
+ {
+ $^H{bigrat} = undef; # no longer in effect
+ overload::remove_constant('binary','','float','','integer');
+ }
+
+sub in_effect
+ {
+ my $level = shift || 0;
+ my $hinthash = (caller($level))[10];
+ $hinthash->{bigrat};
+ }
+
+#############################################################################
+# the following two routines are for Perl 5.9.4 or later and are lexical
+
+sub _hex
+ {
+ return CORE::hex($_[0]) unless in_effect(1);
+ my $i = $_[0];
+ $i = '0x'.$i unless $i =~ /^0x/;
+ Math::BigInt->new($i);
+ }
+
+sub _oct
+ {
+ return CORE::oct($_[0]) unless in_effect(1);
+ my $i = $_[0];
+ return Math::BigInt->from_oct($i) if $i =~ /^0[0-7]/;
+ Math::BigInt->new($i);
+ }
+
+sub import
+ {
+ my $self = shift;
+
+ # see also bignum->import() for additional comments
+
+ $^H{bigrat} = 1; # we are in effect
+
+ my ($hex,$oct);
+ # for newer Perls always override hex() and oct() with a lexical version:
+ if ($] > 5.009004)
+ {
+ $oct = \&_oct;
+ $hex = \&_hex;
+ }
+ # some defaults
+ my $lib = ''; my $lib_kind = 'try'; my $upgrade = 'Math::BigFloat';
+
+ my @import = ( ':constant' ); # drive it w/ constant
+ my @a = @_; my $l = scalar @_; my $j = 0;
+ my ($a,$p);
+ my ($ver,$trace); # version? trace?
+ for ( my $i = 0; $i < $l ; $i++,$j++ )
+ {
+ if ($_[$i] eq 'upgrade')
+ {
+ # this causes upgrading
+ $upgrade = $_[$i+1]; # or undef to disable
+ my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
+ splice @a, $j, $s; $j -= $s;
+ }
+ elsif ($_[$i] =~ /^(l|lib|try|only)$/)
+ {
+ # this causes a different low lib to take care...
+ $lib_kind = $1; $lib_kind = 'lib' if $lib_kind eq 'l';
+ $lib = $_[$i+1] || '';
+ my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
+ splice @a, $j, $s; $j -= $s; $i++;
+ }
+ elsif ($_[$i] =~ /^(a|accuracy)$/)
+ {
+ $a = $_[$i+1];
+ my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
+ splice @a, $j, $s; $j -= $s; $i++;
+ }
+ elsif ($_[$i] =~ /^(p|precision)$/)
+ {
+ $p = $_[$i+1];
+ my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
+ splice @a, $j, $s; $j -= $s; $i++;
+ }
+ elsif ($_[$i] =~ /^(v|version)$/)
+ {
+ $ver = 1;
+ splice @a, $j, 1; $j --;
+ }
+ elsif ($_[$i] =~ /^(t|trace)$/)
+ {
+ $trace = 1;
+ splice @a, $j, 1; $j --;
+ }
+ elsif ($_[$i] eq 'hex')
+ {
+ splice @a, $j, 1; $j --;
+ $hex = \&bigint::_hex_global;
+ }
+ elsif ($_[$i] eq 'oct')
+ {
+ splice @a, $j, 1; $j --;
+ $oct = \&bigint::_oct_global;
+ }
+ elsif ($_[$i] !~ /^(PI|e|bpi|bexp)\z/)
+ {
+ die ("unknown option $_[$i]");
+ }
+ }
+ my $class;
+ $_lite = 0; # using M::BI::L ?
+ if ($trace)
+ {
+ require Math::BigInt::Trace; $class = 'Math::BigInt::Trace';
+ $upgrade = 'Math::BigFloat::Trace';
+ }
+ else
+ {
+ # see if we can find Math::BigInt::Lite
+ if (!defined $a && !defined $p) # rounding won't work to well
+ {
+ eval 'require Math::BigInt::Lite;';
+ if ($@ eq '')
+ {
+ @import = ( ); # :constant in Lite, not MBI
+ Math::BigInt::Lite->import( ':constant' );
+ $_lite= 1; # signal okay
+ }
+ }
+ require Math::BigInt if $_lite == 0; # not already loaded?
+ $class = 'Math::BigInt'; # regardless of MBIL or not
+ }
+ push @import, $lib_kind => $lib if $lib ne '';
+ # Math::BigInt::Trace or plain Math::BigInt
+ $class->import(@import, upgrade => $upgrade);
+
+ require Math::BigFloat;
+ Math::BigFloat->import( upgrade => 'Math::BigRat', ':constant' );
+ require Math::BigRat;
+
+ bigrat->accuracy($a) if defined $a;
+ bigrat->precision($p) if defined $p;
+ if ($ver)
+ {
+ print "bigrat\t\t\t v$VERSION\n";
+ print "Math::BigInt::Lite\t v$Math::BigInt::Lite::VERSION\n" if $_lite;
+ print "Math::BigInt\t\t v$Math::BigInt::VERSION";
+ my $config = Math::BigInt->config();
+ print " lib => $config->{lib} v$config->{lib_version}\n";
+ print "Math::BigFloat\t\t v$Math::BigFloat::VERSION\n";
+ print "Math::BigRat\t\t v$Math::BigRat::VERSION\n";
+ exit;
+ }
+
+ # Take care of octal/hexadecimal constants
+ overload::constant binary => sub { bigint::_binary_constant(shift) };
+
+ # if another big* was already loaded:
+ my ($package) = caller();
+
+ no strict 'refs';
+ if (!defined *{"${package}::inf"})
+ {
+ $self->export_to_level(1,$self,@a); # export inf and NaN
+ }
+ {
+ no warnings 'redefine';
+ *CORE::GLOBAL::oct = $oct if $oct;
+ *CORE::GLOBAL::hex = $hex if $hex;
+ }
+ }
+
+sub PI () { Math::BigFloat->new('3.141592653589793238462643383279502884197'); }
+sub e () { Math::BigFloat->new('2.718281828459045235360287471352662497757'); }
+
+sub bpi ($) { local $Math::BigFloat::upgrade; Math::BigFloat::bpi(@_); }
+
+sub bexp ($$)
+ {
+ local $Math::BigFloat::upgrade;
+ my $x = Math::BigFloat->new($_[0]); $x->bexp($_[1]);
+ }
+
+1;
+
+__END__
+
+=head1 NAME
+
+bigrat - Transparent BigNumber/BigRational support for Perl
+
+=head1 SYNOPSIS
+
+ use bigrat;
+
+ print 2 + 4.5,"\n"; # BigFloat 6.5
+ print 1/3 + 1/4,"\n"; # produces 7/12
+
+ {
+ no bigrat;
+ print 1/3,"\n"; # 0.33333...
+ }
+
+ # Note that this will make hex() and oct() be globally overriden:
+ use bigrat qw/hex oct/;
+ print hex("0x1234567890123490"),"\n";
+ print oct("01234567890123490"),"\n";
+
+=head1 DESCRIPTION
+
+All operators (including basic math operations) are overloaded. Integer and
+floating-point constants are created as proper BigInts or BigFloats,
+respectively.
+
+Other than L<bignum>, this module upgrades to Math::BigRat, meaning that
+instead of 2.5 you will get 2+1/2 as output.
+
+=head2 Modules Used
+
+C<bigrat> is just a thin wrapper around various modules of the Math::BigInt
+family. Think of it as the head of the family, who runs the shop, and orders
+the others to do the work.
+
+The following modules are currently used by bignum:
+
+ Math::BigInt::Lite (for speed, and only if it is loadable)
+ Math::BigInt
+ Math::BigFloat
+ Math::BigRat
+
+=head2 Math Library
+
+Math with the numbers is done (by default) by a module called
+Math::BigInt::Calc. This is equivalent to saying:
+
+ use bigrat lib => 'Calc';
+
+You can change this by using:
+
+ use bignum lib => 'GMP';
+
+The following would first try to find Math::BigInt::Foo, then
+Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
+
+ use bigrat lib => 'Foo,Math::BigInt::Bar';
+
+Using C<lib> warns if none of the specified libraries can be found and
+L<Math::BigInt> did fall back to one of the default libraries.
+To supress this warning, use C<try> instead:
+
+ use bignum try => 'GMP';
+
+If you want the code to die instead of falling back, use C<only> instead:
+
+ use bignum only => 'GMP';
+
+Please see respective module documentation for further details.
+
+=head2 Sign
+
+The sign is either '+', '-', 'NaN', '+inf' or '-inf'.
+
+A sign of 'NaN' is used to represent the result when input arguments are not
+numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively
+minus infinity. You will get '+inf' when dividing a positive number by 0, and
+'-inf' when dividing any negative number by 0.
+
+=head2 Methods
+
+Since all numbers are not objects, you can use all functions that are part of
+the BigInt or BigFloat API. It is wise to use only the bxxx() notation, and not
+the fxxx() notation, though. This makes you independed on the fact that the
+underlying object might morph into a different class than BigFloat.
+
+=over 2
+
+=item inf()
+
+A shortcut to return Math::BigInt->binf(). Useful because Perl does not always
+handle bareword C<inf> properly.
+
+=item NaN()
+
+A shortcut to return Math::BigInt->bnan(). Useful because Perl does not always
+handle bareword C<NaN> properly.
+
+=item e
+
+ # perl -Mbigrat=e -wle 'print e'
+
+Returns Euler's number C<e>, aka exp(1).
+
+=item PI
+
+ # perl -Mbigrat=PI -wle 'print PI'
+
+Returns PI.
+
+=item bexp()
+
+ bexp($power,$accuracy);
+
+
+Returns Euler's number C<e> raised to the appropriate power, to
+the wanted accuracy.
+
+Example:
+
+ # perl -Mbigrat=bexp -wle 'print bexp(1,80)'
+
+=item bpi()
+
+ bpi($accuracy);
+
+Returns PI to the wanted accuracy.
+
+Example:
+
+ # perl -Mbigrat=bpi -wle 'print bpi(80)'
+
+=item upgrade()
+
+Return the class that numbers are upgraded to, is in fact returning
+C<$Math::BigInt::upgrade>.
+
+=item in_effect()
+
+ use bigrat;
+
+ print "in effect\n" if bigrat::in_effect; # true
+ {
+ no bigrat;
+ print "in effect\n" if bigrat::in_effect; # false
+ }
+
+Returns true or false if C<bigrat> is in effect in the current scope.
+
+This method only works on Perl v5.9.4 or later.
+
+=back
+
+=head2 MATH LIBRARY
+
+Math with the numbers is done (by default) by a module called
+
+=head2 Cavaet
+
+But a warning is in order. When using the following to make a copy of a number,
+only a shallow copy will be made.
+
+ $x = 9; $y = $x;
+ $x = $y = 7;
+
+If you want to make a real copy, use the following:
+
+ $y = $x->copy();
+
+Using the copy or the original with overloaded math is okay, e.g. the
+following work:
+
+ $x = 9; $y = $x;
+ print $x + 1, " ", $y,"\n"; # prints 10 9
+
+but calling any method that modifies the number directly will result in
+B<both> the original and the copy being destroyed:
+
+ $x = 9; $y = $x;
+ print $x->badd(1), " ", $y,"\n"; # prints 10 10
+
+ $x = 9; $y = $x;
+ print $x->binc(1), " ", $y,"\n"; # prints 10 10
+
+ $x = 9; $y = $x;
+ print $x->bmul(2), " ", $y,"\n"; # prints 18 18
+
+Using methods that do not modify, but testthe contents works:
+
+ $x = 9; $y = $x;
+ $z = 9 if $x->is_zero(); # works fine
+
+See the documentation about the copy constructor and C<=> in overload, as
+well as the documentation in BigInt for further details.
+
+=head2 Options
+
+bignum recognizes some options that can be passed while loading it via use.
+The options can (currently) be either a single letter form, or the long form.
+The following options exist:
+
+=over 2
+
+=item a or accuracy
+
+This sets the accuracy for all math operations. The argument must be greater
+than or equal to zero. See Math::BigInt's bround() function for details.
+
+ perl -Mbigrat=a,50 -le 'print sqrt(20)'
+
+Note that setting precision and accurary at the same time is not possible.
+
+=item p or precision
+
+This sets the precision for all math operations. The argument can be any
+integer. Negative values mean a fixed number of digits after the dot, while
+a positive value rounds to this digit left from the dot. 0 or 1 mean round to
+integer. See Math::BigInt's bfround() function for details.
+
+ perl -Mbigrat=p,-50 -le 'print sqrt(20)'
+
+Note that setting precision and accurary at the same time is not possible.
+
+=item t or trace
+
+This enables a trace mode and is primarily for debugging bignum or
+Math::BigInt/Math::BigFloat.
+
+=item l or lib
+
+Load a different math lib, see L<MATH LIBRARY>.
+
+ perl -Mbigrat=l,GMP -e 'print 2 ** 512'
+
+Currently there is no way to specify more than one library on the command
+line. This means the following does not work:
+
+ perl -Mbignum=l,GMP,Pari -e 'print 2 ** 512'
+
+This will be hopefully fixed soon ;)
+
+=item hex
+
+Override the built-in hex() method with a version that can handle big
+integers. Note that under Perl v5.9.4 or ealier, this will be global
+and cannot be disabled with "no bigint;".
+
+=item oct
+
+Override the built-in oct() method with a version that can handle big
+integers. Note that under Perl v5.9.4 or ealier, this will be global
+and cannot be disabled with "no bigint;".
+
+=item v or version
+
+This prints out the name and version of all modules used and then exits.
+
+ perl -Mbigrat=v
+
+=back
+
+=head1 CAVAETS
+
+=over 2
+
+=item in_effect()
+
+This method only works on Perl v5.9.4 or later.
+
+=item hex()/oct()
+
+C<bigint> overrides these routines with versions that can also handle
+big integer values. Under Perl prior to version v5.9.4, however, this
+will not happen unless you specifically ask for it with the two
+import tags "hex" and "oct" - and then it will be global and cannot be
+disabled inside a scope with "no bigint":
+
+ use bigint qw/hex oct/;
+
+ print hex("0x1234567890123456");
+ {
+ no bigint;
+ print hex("0x1234567890123456");
+ }
+
+The second call to hex() will warn about a non-portable constant.
+
+Compare this to:
+
+ use bigint;
+
+ # will warn only under Perl older than v5.9.4
+ print hex("0x1234567890123456");
+
+=back
+
+=head1 EXAMPLES
+
+ perl -Mbigrat -le 'print sqrt(33)'
+ perl -Mbigrat -le 'print 2*255'
+ perl -Mbigrat -le 'print 4.5+2*255'
+ perl -Mbigrat -le 'print 3/7 + 5/7 + 8/3'
+ perl -Mbigrat -le 'print 12->is_odd()';
+ perl -Mbignum=l,GMP -le 'print 7 ** 7777'
+
+=head1 LICENSE
+
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+Especially L<bignum>.
+
+L<Math::BigFloat>, L<Math::BigInt>, L<Math::BigRat> and L<Math::Big> as well
+as L<Math::BigInt::BitVect>, L<Math::BigInt::Pari> and L<Math::BigInt::GMP>.
+
+=head1 AUTHORS
+
+(C) by Tels L<http://bloodgate.com/> in early 2002 - 2007.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/bytes_heavy.pl b/Master/tlpkg/tlperl.straw/lib/bytes_heavy.pl
new file mode 100755
index 00000000000..680c66ce921
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/bytes_heavy.pl
@@ -0,0 +1,40 @@
+package bytes;
+
+sub length (_) {
+ BEGIN { bytes::import() }
+ return CORE::length($_[0]);
+}
+
+sub substr ($$;$$) {
+ BEGIN { bytes::import() }
+ return
+ @_ == 2 ? CORE::substr($_[0], $_[1]) :
+ @_ == 3 ? CORE::substr($_[0], $_[1], $_[2]) :
+ CORE::substr($_[0], $_[1], $_[2], $_[3]) ;
+}
+
+sub ord (_) {
+ BEGIN { bytes::import() }
+ return CORE::ord($_[0]);
+}
+
+sub chr (_) {
+ BEGIN { bytes::import() }
+ return CORE::chr($_[0]);
+}
+
+sub index ($$;$) {
+ BEGIN { bytes::import() }
+ return
+ @_ == 2 ? CORE::index($_[0], $_[1]) :
+ CORE::index($_[0], $_[1], $_[2]) ;
+}
+
+sub rindex ($$;$) {
+ BEGIN { bytes::import() }
+ return
+ @_ == 2 ? CORE::rindex($_[0], $_[1]) :
+ CORE::rindex($_[0], $_[1], $_[2]) ;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/cacheout.pl b/Master/tlpkg/tlperl.straw/lib/cacheout.pl
new file mode 100755
index 00000000000..d2669a1cfa8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/cacheout.pl
@@ -0,0 +1,55 @@
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: FileCache
+
+# Open in their package.
+
+sub cacheout'open {
+ open($_[0], $_[1]);
+}
+
+# Close as well
+
+sub cacheout'close {
+ close($_[0]);
+}
+
+# But only this sub name is visible to them.
+
+sub cacheout {
+ package cacheout;
+
+ ($file) = @_;
+ if (!$isopen{$file}) {
+ if (++$numopen > $maxopen) {
+ local(@lru) = sort {$isopen{$a} <=> $isopen{$b};} keys(%isopen);
+ splice(@lru, $maxopen / 3);
+ $numopen -= @lru;
+ for (@lru) { &close($_); delete $isopen{$_}; }
+ }
+ &open($file, ($saw{$file}++ ? '>>' : '>') . $file)
+ || die "Can't create $file: $!\n";
+ }
+ $isopen{$file} = ++$seq;
+}
+
+package cacheout;
+
+$seq = 0;
+$numopen = 0;
+
+if (open(PARAM,'/usr/include/sys/param.h')) {
+ local($_, $.);
+ while (<PARAM>) {
+ $maxopen = $1 - 4 if /^\s*#\s*define\s+NOFILE\s+(\d+)/;
+ }
+ close PARAM;
+}
+$maxopen = 16 unless $maxopen;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/dbixs_rev.pl b/Master/tlpkg/tlperl.straw/lib/dbixs_rev.pl
new file mode 100755
index 00000000000..9e83eb10a13
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/dbixs_rev.pl
@@ -0,0 +1,51 @@
+#!perl -w
+use strict;
+
+my $dbixs_rev_file = "dbixs_rev.h";
+
+my $is_make_dist;
+my $svnversion;
+
+if (is_dbi_svn_dir(".")) {
+ $svnversion = `svnversion -n`;
+}
+elsif (is_dbi_svn_dir("..")) {
+ # presumably we're in a subdirectory because the user is doing a 'make dist'
+ $svnversion = `svnversion -n ..`;
+ $is_make_dist = 1;
+}
+else {
+ # presumably we're being run by an end-user because their file timestamps
+ # got messed up
+ print "Skipping regeneration of $dbixs_rev_file\n";
+ utime(time(), time(), $dbixs_rev_file); # update modification time
+ exit 0;
+}
+
+my @warn;
+die "Neither current directory nor parent directory are an svn working copy\n"
+ unless $svnversion and $svnversion =~ m/^\d+/;
+push @warn, "Mixed revision working copy ($svnversion:$1)"
+ if $svnversion =~ s/:(\d+)//;
+push @warn, "Code modified since last checkin"
+ if $svnversion =~ s/[MS]+$//;
+warn "$dbixs_rev_file warning: $_\n" for @warn;
+die "$0 failed\n" if $is_make_dist && @warn;
+
+write_header($dbixs_rev_file, DBIXS_REVISION => $svnversion, \@warn);
+
+sub write_header {
+ my ($file, $macro, $version, $comments_ref) = @_;
+ open my $fh, ">$file" or die "Can't open $file: $!\n";
+ unshift @$comments_ref, scalar localtime(time);
+ print $fh "/* $_ */\n" for @$comments_ref;
+ print $fh "#define $macro $version\n";
+ close $fh or die "Error closing $file: $!\n";
+ print "Wrote $macro $version to $file\n";
+}
+
+sub is_dbi_svn_dir {
+ my ($dir) = @_;
+ return (-d "$dir/.svn" && -f "$dir/MANIFEST.SKIP");
+}
+
diff --git a/Master/tlpkg/tlperl.straw/lib/dotsh.pl b/Master/tlpkg/tlperl.straw/lib/dotsh.pl
new file mode 100755
index 00000000000..810ebc4d605
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/dotsh.pl
@@ -0,0 +1,74 @@
+#
+# @(#)dotsh.pl 03/19/94
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+#
+# Author: Charles Collins
+#
+# Description:
+# This routine takes a shell script and 'dots' it into the current perl
+# environment. This makes it possible to use existing system scripts
+# to alter environment variables on the fly.
+#
+# Usage:
+# &dotsh ('ShellScript', 'DependentVariable(s)');
+#
+# where
+#
+# 'ShellScript' is the full name of the shell script to be dotted
+#
+# 'DependentVariable(s)' is an optional list of shell variables in the
+# form VARIABLE=VALUE,VARIABLE=VALUE,... that 'ShellScript' is
+# dependent upon. These variables MUST be defined using shell syntax.
+#
+# Example:
+# &dotsh ('/foo/bar', 'arg1');
+# &dotsh ('/foo/bar');
+# &dotsh ('/foo/bar arg1 ... argN');
+#
+sub dotsh {
+ local(@sh) = @_;
+ local($tmp,$key,$shell,$command,$args,$vars) = '';
+ local(*dotsh);
+ undef *dotsh;
+ $dotsh = shift(@sh);
+ @dotsh = split (/\s/, $dotsh);
+ $command = shift (@dotsh);
+ $args = join (" ", @dotsh);
+ $vars = join ("\n", @sh);
+ open (_SH_ENV, "$command") || die "Could not open $dotsh!\n";
+ chop($_ = <_SH_ENV>);
+ $shell = "$1 -c" if ($_ =~ /^\#\!\s*(\S+(\/sh|\/ksh|\/zsh|\/csh))\s*$/);
+ close (_SH_ENV);
+ if (!$shell) {
+ if ($ENV{'SHELL'} =~ /\/sh$|\/ksh$|\/zsh$|\/bash$|\/csh$/) {
+ $shell = "$ENV{'SHELL'} -c";
+ } else {
+ print "SHELL not recognized!\nUsing /bin/sh...\n";
+ $shell = "/bin/sh -c";
+ }
+ }
+ if (length($vars) > 0) {
+ open (_SH_ENV, "$shell \"$vars && . $command $args && set \" |") || die;
+ } else {
+ open (_SH_ENV, "$shell \". $command $args && set \" |") || die;
+ }
+
+ while (<_SH_ENV>) {
+ chop;
+ m/^([^=]*)=(.*)/s;
+ $ENV{$1} = $2;
+ }
+ close (_SH_ENV);
+
+ foreach $key (keys(%ENV)) {
+ $tmp .= "\$$key = \$ENV{'$key'};" if $key =~ /^[A-Za-z]\w*$/;
+ }
+ eval $tmp;
+}
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/dumpvar.pl b/Master/tlpkg/tlperl.straw/lib/dumpvar.pl
new file mode 100755
index 00000000000..0268cea8bc8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/dumpvar.pl
@@ -0,0 +1,552 @@
+require 5.002; # For (defined ref)
+package dumpvar;
+
+# Needed for PrettyPrinter only:
+
+# require 5.001; # Well, it coredumps anyway undef DB in 5.000 (not now)
+
+# translate control chars to ^X - Randal Schwartz
+# Modifications to print types by Peter Gordon v1.0
+
+# Ilya Zakharevich -- patches after 5.001 (and some before ;-)
+
+# Won't dump symbol tables and contents of debugged files by default
+
+$winsize = 80 unless defined $winsize;
+
+
+# Defaults
+
+# $globPrint = 1;
+$printUndef = 1 unless defined $printUndef;
+$tick = "auto" unless defined $tick;
+$unctrl = 'quote' unless defined $unctrl;
+$subdump = 1;
+$dumpReused = 0 unless defined $dumpReused;
+$bareStringify = 1 unless defined $bareStringify;
+
+sub main::dumpValue {
+ local %address;
+ local $^W=0;
+ (print "undef\n"), return unless defined $_[0];
+ (print &stringify($_[0]), "\n"), return unless ref $_[0];
+ push @_, -1 if @_ == 1;
+ dumpvar::unwrap($_[0], 0, $_[1]);
+}
+
+# This one is good for variable names:
+
+sub unctrl {
+ local($_) = @_;
+ local($v) ;
+
+ return \$_ if ref \$_ eq "GLOB";
+ if (ord('A') == 193) { # EBCDIC.
+ # EBCDIC has no concept of "\cA" or "A" being related
+ # to each other by a linear/boolean mapping.
+ } else {
+ s/([\001-\037\177])/'^'.pack('c',ord($1)^64)/eg;
+ }
+ $_;
+}
+
+sub uniescape {
+ join("",
+ map { $_ > 255 ? sprintf("\\x{%04X}", $_) : chr($_) }
+ unpack("U*", $_[0]));
+}
+
+sub stringify {
+ local($_,$noticks) = @_;
+ local($v) ;
+ my $tick = $tick;
+
+ return 'undef' unless defined $_ or not $printUndef;
+ return $_ . "" if ref \$_ eq 'GLOB';
+ $_ = &{'overload::StrVal'}($_)
+ if $bareStringify and ref $_
+ and %overload:: and defined &{'overload::StrVal'};
+
+ if ($tick eq 'auto') {
+ if (ord('A') == 193) {
+ if (/[\000-\011]/ or /[\013-\024\31-\037\177]/) {
+ $tick = '"';
+ } else {
+ $tick = "'";
+ }
+ } else {
+ if (/[\000-\011\013-\037\177]/) {
+ $tick = '"';
+ } else {
+ $tick = "'";
+ }
+ }
+ }
+ if ($tick eq "'") {
+ s/([\'\\])/\\$1/g;
+ } elsif ($unctrl eq 'unctrl') {
+ s/([\"\\])/\\$1/g ;
+ s/([\000-\037\177])/'^'.pack('c',ord($1)^64)/eg;
+ # uniescape?
+ s/([\200-\377])/'\\0x'.sprintf('%2X',ord($1))/eg
+ if $quoteHighBit;
+ } elsif ($unctrl eq 'quote') {
+ s/([\"\\\$\@])/\\$1/g if $tick eq '"';
+ s/\033/\\e/g;
+ if (ord('A') == 193) { # EBCDIC.
+ s/([\000-\037\177])/'\\c'.chr(193)/eg; # Unfinished.
+ } else {
+ s/([\000-\037\177])/'\\c'._escaped_ord($1)/eg;
+ }
+ }
+ $_ = uniescape($_);
+ s/([\200-\377])/'\\'.sprintf('%3o',ord($1))/eg if $quoteHighBit;
+ ($noticks || /^\d+(\.\d*)?\Z/)
+ ? $_
+ : $tick . $_ . $tick;
+}
+
+# Ensure a resulting \ is escaped to be \\
+sub _escaped_ord {
+ my $chr = shift;
+ $chr = chr(ord($chr)^64);
+ $chr =~ s{\\}{\\\\}g;
+ return $chr;
+}
+
+sub ShortArray {
+ my $tArrayDepth = $#{$_[0]} ;
+ $tArrayDepth = $#{$_[0]} < $arrayDepth-1 ? $#{$_[0]} : $arrayDepth-1
+ unless $arrayDepth eq '' ;
+ my $shortmore = "";
+ $shortmore = " ..." if $tArrayDepth < $#{$_[0]} ;
+ if (!grep(ref $_, @{$_[0]})) {
+ $short = "0..$#{$_[0]} '" .
+ join("' '", @{$_[0]}[0..$tArrayDepth]) . "'$shortmore";
+ return $short if length $short <= $compactDump;
+ }
+ undef;
+}
+
+sub DumpElem {
+ my $short = &stringify($_[0], ref $_[0]);
+ if ($veryCompact && ref $_[0]
+ && (ref $_[0] eq 'ARRAY' and !grep(ref $_, @{$_[0]}) )) {
+ my $end = "0..$#{$v} '" .
+ join("' '", @{$_[0]}[0..$tArrayDepth]) . "'$shortmore";
+ } elsif ($veryCompact && ref $_[0]
+ && (ref $_[0] eq 'HASH') and !grep(ref $_, values %{$_[0]})) {
+ my $end = 1;
+ $short = $sp . "0..$#{$v} '" .
+ join("' '", @{$v}[0..$tArrayDepth]) . "'$shortmore";
+ } else {
+ print "$short\n";
+ unwrap($_[0],$_[1],$_[2]) if ref $_[0];
+ }
+}
+
+sub unwrap {
+ return if $DB::signal;
+ local($v) = shift ;
+ local($s) = shift ; # extra no of spaces
+ local($m) = shift ; # maximum recursion depth
+ return if $m == 0;
+ local(%v,@v,$sp,$value,$key,@sortKeys,$more,$shortmore,$short) ;
+ local($tHashDepth,$tArrayDepth) ;
+
+ $sp = " " x $s ;
+ $s += 3 ;
+
+ # Check for reused addresses
+ if (ref $v) {
+ my $val = $v;
+ $val = &{'overload::StrVal'}($v)
+ if %overload:: and defined &{'overload::StrVal'};
+ # Match type and address.
+ # Unblessed references will look like TYPE(0x...)
+ # Blessed references will look like Class=TYPE(0x...)
+ ($start_part, $val) = split /=/,$val;
+ $val = $start_part unless defined $val;
+ ($item_type, $address) =
+ $val =~ /([^\(]+) # Keep stuff that's
+ # not an open paren
+ \( # Skip open paren
+ (0x[0-9a-f]+) # Save the address
+ \) # Skip close paren
+ $/x; # Should be at end now
+
+ if (!$dumpReused && defined $address) {
+ $address{$address}++ ;
+ if ( $address{$address} > 1 ) {
+ print "${sp}-> REUSED_ADDRESS\n" ;
+ return ;
+ }
+ }
+ } elsif (ref \$v eq 'GLOB') {
+ # This is a raw glob. Special handling for that.
+ $address = "$v" . ""; # To avoid a bug with globs
+ $address{$address}++ ;
+ if ( $address{$address} > 1 ) {
+ print "${sp}*DUMPED_GLOB*\n" ;
+ return ;
+ }
+ }
+
+ if (ref $v eq 'Regexp') {
+ # Reformat the regexp to look the standard way.
+ my $re = "$v";
+ $re =~ s,/,\\/,g;
+ print "$sp-> qr/$re/\n";
+ return;
+ }
+
+ if ( $item_type eq 'HASH' ) {
+ # Hash ref or hash-based object.
+ my @sortKeys = sort keys(%$v) ;
+ undef $more ;
+ $tHashDepth = $#sortKeys ;
+ $tHashDepth = $#sortKeys < $hashDepth-1 ? $#sortKeys : $hashDepth-1
+ unless $hashDepth eq '' ;
+ $more = "....\n" if $tHashDepth < $#sortKeys ;
+ $shortmore = "";
+ $shortmore = ", ..." if $tHashDepth < $#sortKeys ;
+ $#sortKeys = $tHashDepth ;
+ if ($compactDump && !grep(ref $_, values %{$v})) {
+ #$short = $sp .
+ # (join ', ',
+# Next row core dumps during require from DB on 5.000, even with map {"_"}
+ # map {&stringify($_) . " => " . &stringify($v->{$_})}
+ # @sortKeys) . "'$shortmore";
+ $short = $sp;
+ my @keys;
+ for (@sortKeys) {
+ push @keys, &stringify($_) . " => " . &stringify($v->{$_});
+ }
+ $short .= join ', ', @keys;
+ $short .= $shortmore;
+ (print "$short\n"), return if length $short <= $compactDump;
+ }
+ for $key (@sortKeys) {
+ return if $DB::signal;
+ $value = $ {$v}{$key} ;
+ print "$sp", &stringify($key), " => ";
+ DumpElem $value, $s, $m-1;
+ }
+ print "$sp empty hash\n" unless @sortKeys;
+ print "$sp$more" if defined $more ;
+ } elsif ( $item_type eq 'ARRAY' ) {
+ # Array ref or array-based object. Also: undef.
+ # See how big the array is.
+ $tArrayDepth = $#{$v} ;
+ undef $more ;
+ # Bigger than the max?
+ $tArrayDepth = $#{$v} < $arrayDepth-1 ? $#{$v} : $arrayDepth-1
+ if defined $arrayDepth && $arrayDepth ne '';
+ # Yep. Don't show it all.
+ $more = "....\n" if $tArrayDepth < $#{$v} ;
+ $shortmore = "";
+ $shortmore = " ..." if $tArrayDepth < $#{$v} ;
+
+ if ($compactDump && !grep(ref $_, @{$v})) {
+ if ($#$v >= 0) {
+ $short = $sp . "0..$#{$v} " .
+ join(" ",
+ map {exists $v->[$_] ? stringify $v->[$_] : "empty"} ($[..$tArrayDepth)
+ ) . "$shortmore";
+ } else {
+ $short = $sp . "empty array";
+ }
+ (print "$short\n"), return if length $short <= $compactDump;
+ }
+ #if ($compactDump && $short = ShortArray($v)) {
+ # print "$short\n";
+ # return;
+ #}
+ for $num ($[ .. $tArrayDepth) {
+ return if $DB::signal;
+ print "$sp$num ";
+ if (exists $v->[$num]) {
+ if (defined $v->[$num]) {
+ DumpElem $v->[$num], $s, $m-1;
+ }
+ else {
+ print "undef\n";
+ }
+ } else {
+ print "empty slot\n";
+ }
+ }
+ print "$sp empty array\n" unless @$v;
+ print "$sp$more" if defined $more ;
+ } elsif ( $item_type eq 'SCALAR' ) {
+ unless (defined $$v) {
+ print "$sp-> undef\n";
+ return;
+ }
+ print "$sp-> ";
+ DumpElem $$v, $s, $m-1;
+ } elsif ( $item_type eq 'REF' ) {
+ print "$sp-> $$v\n";
+ return unless defined $$v;
+ unwrap($$v, $s+3, $m-1);
+ } elsif ( $item_type eq 'CODE' ) {
+ # Code object or reference.
+ print "$sp-> ";
+ dumpsub (0, $v);
+ } elsif ( $item_type eq 'GLOB' ) {
+ # Glob object or reference.
+ print "$sp-> ",&stringify($$v,1),"\n";
+ if ($globPrint) {
+ $s += 3;
+ dumpglob($s, "{$$v}", $$v, 1, $m-1);
+ } elsif (defined ($fileno = eval {fileno($v)})) {
+ print( (' ' x ($s+3)) . "FileHandle({$$v}) => fileno($fileno)\n" );
+ }
+ } elsif (ref \$v eq 'GLOB') {
+ # Raw glob (again?)
+ if ($globPrint) {
+ dumpglob($s, "{$v}", $v, 1, $m-1) if $globPrint;
+ } elsif (defined ($fileno = eval {fileno(\$v)})) {
+ print( (' ' x $s) . "FileHandle({$v}) => fileno($fileno)\n" );
+ }
+ }
+}
+
+sub matchlex {
+ (my $var = $_[0]) =~ s/.//;
+ $var eq $_[1] or
+ ($_[1] =~ /^([!~])(.)([\x00-\xff]*)/) and
+ ($1 eq '!') ^ (eval { $var =~ /$2$3/ });
+}
+
+sub matchvar {
+ $_[0] eq $_[1] or
+ ($_[1] =~ /^([!~])(.)([\x00-\xff]*)/) and
+ ($1 eq '!') ^ (eval {($_[2] . "::" . $_[0]) =~ /$2$3/});
+}
+
+sub compactDump {
+ $compactDump = shift if @_;
+ $compactDump = 6*80-1 if $compactDump and $compactDump < 2;
+ $compactDump;
+}
+
+sub veryCompact {
+ $veryCompact = shift if @_;
+ compactDump(1) if !$compactDump and $veryCompact;
+ $veryCompact;
+}
+
+sub unctrlSet {
+ if (@_) {
+ my $in = shift;
+ if ($in eq 'unctrl' or $in eq 'quote') {
+ $unctrl = $in;
+ } else {
+ print "Unknown value for `unctrl'.\n";
+ }
+ }
+ $unctrl;
+}
+
+sub quote {
+ if (@_ and $_[0] eq '"') {
+ $tick = '"';
+ $unctrl = 'quote';
+ } elsif (@_ and $_[0] eq 'auto') {
+ $tick = 'auto';
+ $unctrl = 'quote';
+ } elsif (@_) { # Need to set
+ $tick = "'";
+ $unctrl = 'unctrl';
+ }
+ $tick;
+}
+
+sub dumpglob {
+ return if $DB::signal;
+ my ($off,$key, $val, $all, $m) = @_;
+ local(*entry) = $val;
+ my $fileno;
+ if (($key !~ /^_</ or $dumpDBFiles) and defined $entry) {
+ print( (' ' x $off) . "\$", &unctrl($key), " = " );
+ DumpElem $entry, 3+$off, $m;
+ }
+ if (($key !~ /^_</ or $dumpDBFiles) and @entry) {
+ print( (' ' x $off) . "\@$key = (\n" );
+ unwrap(\@entry,3+$off,$m) ;
+ print( (' ' x $off) . ")\n" );
+ }
+ if ($key ne "main::" && $key ne "DB::" && %entry
+ && ($dumpPackages or $key !~ /::$/)
+ && ($key !~ /^_</ or $dumpDBFiles)
+ && !($package eq "dumpvar" and $key eq "stab")) {
+ print( (' ' x $off) . "\%$key = (\n" );
+ unwrap(\%entry,3+$off,$m) ;
+ print( (' ' x $off) . ")\n" );
+ }
+ if (defined ($fileno = eval{fileno(*entry)})) {
+ print( (' ' x $off) . "FileHandle($key) => fileno($fileno)\n" );
+ }
+ if ($all) {
+ if (defined &entry) {
+ dumpsub($off, $key);
+ }
+ }
+}
+
+sub dumplex {
+ return if $DB::signal;
+ my ($key, $val, $m, @vars) = @_;
+ return if @vars && !grep( matchlex($key, $_), @vars );
+ local %address;
+ my $off = 0; # It reads better this way
+ my $fileno;
+ if (UNIVERSAL::isa($val,'ARRAY')) {
+ print( (' ' x $off) . "$key = (\n" );
+ unwrap($val,3+$off,$m) ;
+ print( (' ' x $off) . ")\n" );
+ }
+ elsif (UNIVERSAL::isa($val,'HASH')) {
+ print( (' ' x $off) . "$key = (\n" );
+ unwrap($val,3+$off,$m) ;
+ print( (' ' x $off) . ")\n" );
+ }
+ elsif (UNIVERSAL::isa($val,'IO')) {
+ print( (' ' x $off) . "FileHandle($key) => fileno($fileno)\n" );
+ }
+ # No lexical subroutines yet...
+ # elsif (UNIVERSAL::isa($val,'CODE')) {
+ # dumpsub($off, $$val);
+ # }
+ else {
+ print( (' ' x $off) . &unctrl($key), " = " );
+ DumpElem $$val, 3+$off, $m;
+ }
+}
+
+sub CvGV_name_or_bust {
+ my $in = shift;
+ return if $skipCvGV; # Backdoor to avoid problems if XS broken...
+ $in = \&$in; # Hard reference...
+ eval {require Devel::Peek; 1} or return;
+ my $gv = Devel::Peek::CvGV($in) or return;
+ *$gv{PACKAGE} . '::' . *$gv{NAME};
+}
+
+sub dumpsub {
+ my ($off,$sub) = @_;
+ my $ini = $sub;
+ my $s;
+ $sub = $1 if $sub =~ /^\{\*(.*)\}$/;
+ my $subref = defined $1 ? \&$sub : \&$ini;
+ my $place = $DB::sub{$sub} || (($s = $subs{"$subref"}) && $DB::sub{$s})
+ || (($s = CvGV_name_or_bust($subref)) && $DB::sub{$s})
+ || ($subdump && ($s = findsubs("$subref")) && $DB::sub{$s});
+ $place = '???' unless defined $place;
+ $s = $sub unless defined $s;
+ print( (' ' x $off) . "&$s in $place\n" );
+}
+
+sub findsubs {
+ return undef unless %DB::sub;
+ my ($addr, $name, $loc);
+ while (($name, $loc) = each %DB::sub) {
+ $addr = \&$name;
+ $subs{"$addr"} = $name;
+ }
+ $subdump = 0;
+ $subs{ shift() };
+}
+
+sub main::dumpvar {
+ my ($package,$m,@vars) = @_;
+ local(%address,$key,$val,$^W);
+ $package .= "::" unless $package =~ /::$/;
+ *stab = *{"main::"};
+ while ($package =~ /(\w+?::)/g){
+ *stab = $ {stab}{$1};
+ }
+ local $TotalStrings = 0;
+ local $Strings = 0;
+ local $CompleteTotal = 0;
+ while (($key,$val) = each(%stab)) {
+ return if $DB::signal;
+ next if @vars && !grep( matchvar($key, $_), @vars );
+ if ($usageOnly) {
+ globUsage(\$val, $key)
+ if ($package ne 'dumpvar' or $key ne 'stab')
+ and ref(\$val) eq 'GLOB';
+ } else {
+ dumpglob(0,$key, $val, 0, $m);
+ }
+ }
+ if ($usageOnly) {
+ print "String space: $TotalStrings bytes in $Strings strings.\n";
+ $CompleteTotal += $TotalStrings;
+ print "Grand total = $CompleteTotal bytes (1 level deep) + overhead.\n";
+ }
+}
+
+sub scalarUsage {
+ my $size = length($_[0]);
+ $TotalStrings += $size;
+ $Strings++;
+ $size;
+}
+
+sub arrayUsage { # array ref, name
+ my $size = 0;
+ map {$size += scalarUsage($_)} @{$_[0]};
+ my $len = @{$_[0]};
+ print "\@$_[1] = $len item", ($len > 1 ? "s" : ""),
+ " (data: $size bytes)\n"
+ if defined $_[1];
+ $CompleteTotal += $size;
+ $size;
+}
+
+sub hashUsage { # hash ref, name
+ my @keys = keys %{$_[0]};
+ my @values = values %{$_[0]};
+ my $keys = arrayUsage \@keys;
+ my $values = arrayUsage \@values;
+ my $len = @keys;
+ my $total = $keys + $values;
+ print "\%$_[1] = $len item", ($len > 1 ? "s" : ""),
+ " (keys: $keys; values: $values; total: $total bytes)\n"
+ if defined $_[1];
+ $total;
+}
+
+sub globUsage { # glob ref, name
+ local *name = *{$_[0]};
+ $total = 0;
+ $total += scalarUsage $name if defined $name;
+ $total += arrayUsage \@name, $_[1] if @name;
+ $total += hashUsage \%name, $_[1] if %name and $_[1] ne "main::"
+ and $_[1] ne "DB::"; #and !($package eq "dumpvar" and $key eq "stab"));
+ $total;
+}
+
+sub packageUsage {
+ my ($package,@vars) = @_;
+ $package .= "::" unless $package =~ /::$/;
+ local *stab = *{"main::"};
+ while ($package =~ /(\w+?::)/g){
+ *stab = $ {stab}{$1};
+ }
+ local $TotalStrings = 0;
+ local $CompleteTotal = 0;
+ my ($key,$val);
+ while (($key,$val) = each(%stab)) {
+ next if @vars && !grep($key eq $_,@vars);
+ globUsage \$val, $key unless $package eq 'dumpvar' and $key eq 'stab';
+ }
+ print "String space: $TotalStrings.\n";
+ $CompleteTotal += $TotalStrings;
+ print "\nGrand total = $CompleteTotal bytes\n";
+}
+
+1;
+
diff --git a/Master/tlpkg/tlperl.straw/lib/encoding/warnings.pm b/Master/tlpkg/tlperl.straw/lib/encoding/warnings.pm
new file mode 100755
index 00000000000..5e6aec0c8fe
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/encoding/warnings.pm
@@ -0,0 +1,239 @@
+package encoding::warnings;
+$encoding::warnings::VERSION = '0.11';
+
+use strict;
+use 5.007;
+
+=head1 NAME
+
+encoding::warnings - Warn on implicit encoding conversions
+
+=head1 VERSION
+
+This document describes version 0.11 of encoding::warnings, released
+June 5, 2007.
+
+=head1 SYNOPSIS
+
+ use encoding::warnings; # or 'FATAL' to raise fatal exceptions
+
+ utf8::encode($a = chr(20000)); # a byte-string (raw bytes)
+ $b = chr(20000); # a unicode-string (wide characters)
+
+ # "Bytes implicitly upgraded into wide characters as iso-8859-1"
+ $c = $a . $b;
+
+=head1 DESCRIPTION
+
+=head2 Overview of the problem
+
+By default, there is a fundamental asymmetry in Perl's unicode model:
+implicit upgrading from byte-strings to unicode-strings assumes that
+they were encoded in I<ISO 8859-1 (Latin-1)>, but unicode-strings are
+downgraded with UTF-8 encoding. This happens because the first 256
+codepoints in Unicode happens to agree with Latin-1.
+
+However, this silent upgrading can easily cause problems, if you happen
+to mix unicode strings with non-Latin1 data -- i.e. byte-strings encoded
+in UTF-8 or other encodings. The error will not manifest until the
+combined string is written to output, at which time it would be impossible
+to see where did the silent upgrading occur.
+
+=head2 Detecting the problem
+
+This module simplifies the process of diagnosing such problems. Just put
+this line on top of your main program:
+
+ use encoding::warnings;
+
+Afterwards, implicit upgrading of high-bit bytes will raise a warning.
+Ex.: C<Bytes implicitly upgraded into wide characters as iso-8859-1 at
+- line 7>.
+
+However, strings composed purely of ASCII code points (C<0x00>..C<0x7F>)
+will I<not> trigger this warning.
+
+You can also make the warnings fatal by importing this module as:
+
+ use encoding::warnings 'FATAL';
+
+=head2 Solving the problem
+
+Most of the time, this warning occurs when a byte-string is concatenated
+with a unicode-string. There are a number of ways to solve it:
+
+=over 4
+
+=item * Upgrade both sides to unicode-strings
+
+If your program does not need compatibility for Perl 5.6 and earlier,
+the recommended approach is to apply appropriate IO disciplines, so all
+data in your program become unicode-strings. See L<encoding>, L<open> and
+L<perlfunc/binmode> for how.
+
+=item * Downgrade both sides to byte-strings
+
+The other way works too, especially if you are sure that all your data
+are under the same encoding, or if compatibility with older versions
+of Perl is desired.
+
+You may downgrade strings with C<Encode::encode> and C<utf8::encode>.
+See L<Encode> and L<utf8> for details.
+
+=item * Specify the encoding for implicit byte-string upgrading
+
+If you are confident that all byte-strings will be in a specific
+encoding like UTF-8, I<and> need not support older versions of Perl,
+use the C<encoding> pragma:
+
+ use encoding 'utf8';
+
+Similarly, this will silence warnings from this module, and preserve the
+default behaviour:
+
+ use encoding 'iso-8859-1';
+
+However, note that C<use encoding> actually had three distinct effects:
+
+=over 4
+
+=item * PerlIO layers for B<STDIN> and B<STDOUT>
+
+This is similar to what L<open> pragma does.
+
+=item * Literal conversions
+
+This turns I<all> literal string in your program into unicode-strings
+(equivalent to a C<use utf8>), by decoding them using the specified
+encoding.
+
+=item * Implicit upgrading for byte-strings
+
+This will silence warnings from this module, as shown above.
+
+=back
+
+Because literal conversions also work on empty strings, it may surprise
+some people:
+
+ use encoding 'big5';
+
+ my $byte_string = pack("C*", 0xA4, 0x40);
+ print length $a; # 2 here.
+ $a .= ""; # concatenating with a unicode string...
+ print length $a; # 1 here!
+
+In other words, do not C<use encoding> unless you are certain that the
+program will not deal with any raw, 8-bit binary data at all.
+
+However, the C<Filter =E<gt> 1> flavor of C<use encoding> will I<not>
+affect implicit upgrading for byte-strings, and is thus incapable of
+silencing warnings from this module. See L<encoding> for more details.
+
+=back
+
+=head1 CAVEATS
+
+For Perl 5.9.4 or later, this module's effect is lexical.
+
+For Perl versions prior to 5.9.4, this module affects the whole script,
+instead of inside its lexical block.
+
+=cut
+
+# Constants.
+sub ASCII () { 0 }
+sub LATIN1 () { 1 }
+sub FATAL () { 2 }
+
+# Install a ${^ENCODING} handler if no other one are already in place.
+sub import {
+ my $class = shift;
+ my $fatal = shift || '';
+
+ local $@;
+ return if ${^ENCODING} and ref(${^ENCODING}) ne $class;
+ return unless eval { require Encode; 1 };
+
+ my $ascii = Encode::find_encoding('us-ascii') or return;
+ my $latin1 = Encode::find_encoding('iso-8859-1') or return;
+
+ # Have to undef explicitly here
+ undef ${^ENCODING};
+
+ # Install a warning handler for decode()
+ my $decoder = bless(
+ [
+ $ascii,
+ $latin1,
+ (($fatal eq 'FATAL') ? 'Carp::croak' : 'Carp::carp'),
+ ], $class,
+ );
+
+ ${^ENCODING} = $decoder;
+ $^H{$class} = 1;
+}
+
+sub unimport {
+ my $class = shift;
+ $^H{$class} = undef;
+ undef ${^ENCODING};
+}
+
+# Don't worry about source code literals.
+sub cat_decode {
+ my $self = shift;
+ return $self->[LATIN1]->cat_decode(@_);
+}
+
+# Warn if the data is not purely US-ASCII.
+sub decode {
+ my $self = shift;
+
+ DO_WARN: {
+ if ($] >= 5.009004) {
+ my $hints = (caller(0))[10];
+ $hints->{ref($self)} or last DO_WARN;
+ }
+
+ local $@;
+ my $rv = eval { $self->[ASCII]->decode($_[0], Encode::FB_CROAK()) };
+ return $rv unless $@;
+
+ require Carp;
+ no strict 'refs';
+ $self->[FATAL]->(
+ "Bytes implicitly upgraded into wide characters as iso-8859-1"
+ );
+
+ }
+
+ return $self->[LATIN1]->decode(@_);
+}
+
+sub name { 'iso-8859-1' }
+
+1;
+
+__END__
+
+=head1 SEE ALSO
+
+L<perlunicode>, L<perluniintro>
+
+L<open>, L<utf8>, L<encoding>, L<Encode>
+
+=head1 AUTHORS
+
+Audrey Tang
+
+=head1 COPYRIGHT
+
+Copyright 2004, 2005, 2006, 2007 by Audrey Tang E<lt>cpan@audreyt.orgE<gt>.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/exceptions.pl b/Master/tlpkg/tlperl.straw/lib/exceptions.pl
new file mode 100755
index 00000000000..ed1f927d270
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/exceptions.pl
@@ -0,0 +1,61 @@
+# exceptions.pl
+# tchrist@convex.com
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+#
+# Here's a little code I use for exception handling. It's really just
+# glorfied eval/die. The way to use use it is when you might otherwise
+# exit, use &throw to raise an exception. The first enclosing &catch
+# handler looks at the exception and decides whether it can catch this kind
+# (catch takes a list of regexps to catch), and if so, it returns the one it
+# caught. If it *can't* catch it, then it will reraise the exception
+# for someone else to possibly see, or to die otherwise.
+#
+# I use oddly named variables in order to make darn sure I don't conflict
+# with my caller. I also hide in my own package, and eval the code in his.
+#
+# The EXCEPTION: prefix is so you can tell whether it's a user-raised
+# exception or a perl-raised one (eval error).
+#
+# --tom
+#
+# examples:
+# if (&catch('/$user_input/', 'regexp', 'syntax error') {
+# warn "oops try again";
+# redo;
+# }
+#
+# if ($error = &catch('&subroutine()')) { # catches anything
+#
+# &throw('bad input') if /^$/;
+
+sub catch {
+ package exception;
+ local($__code__, @__exceptions__) = @_;
+ local($__package__) = caller;
+ local($__exception__);
+
+ eval "package $__package__; $__code__";
+ if ($__exception__ = &'thrown) {
+ for (@__exceptions__) {
+ return $__exception__ if /$__exception__/;
+ }
+ &'throw($__exception__);
+ }
+}
+
+sub throw {
+ local($exception) = @_;
+ die "EXCEPTION: $exception\n";
+}
+
+sub thrown {
+ $@ =~ /^(EXCEPTION: )+(.+)/ && $2;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/fastcwd.pl b/Master/tlpkg/tlperl.straw/lib/fastcwd.pl
new file mode 100755
index 00000000000..ecd87c8a035
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/fastcwd.pl
@@ -0,0 +1,43 @@
+# By John Bazik
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Cwd
+#
+# Usage: $cwd = &fastcwd;
+#
+# This is a faster version of getcwd. It's also more dangerous because
+# you might chdir out of a directory that you can't chdir back into.
+
+sub fastcwd {
+ local($odev, $oino, $cdev, $cino, $tdev, $tino);
+ local(@path, $path);
+ local(*DIR);
+
+ ($cdev, $cino) = stat('.');
+ for (;;) {
+ ($odev, $oino) = ($cdev, $cino);
+ chdir('..');
+ ($cdev, $cino) = stat('.');
+ last if $odev == $cdev && $oino == $cino;
+ opendir(DIR, '.');
+ for (;;) {
+ $_ = readdir(DIR);
+ next if $_ eq '.';
+ next if $_ eq '..';
+
+ last unless $_;
+ ($tdev, $tino) = lstat($_);
+ last unless $tdev != $odev || $tino != $oino;
+ }
+ closedir(DIR);
+ unshift(@path, $_);
+ }
+ chdir($path = '/' . join('/', @path));
+ $path;
+}
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/feature.pm b/Master/tlpkg/tlperl.straw/lib/feature.pm
new file mode 100755
index 00000000000..8fde4c34c4b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/feature.pm
@@ -0,0 +1,218 @@
+package feature;
+
+our $VERSION = '1.13';
+
+# (feature name) => (internal name, used in %^H)
+my %feature = (
+ switch => 'feature_switch',
+ say => "feature_say",
+ state => "feature_state",
+);
+
+# NB. the latest bundle must be loaded by the -E switch (see toke.c)
+
+my %feature_bundle = (
+ "5.10" => [qw(switch say state)],
+### "5.11" => [qw(switch say state)],
+);
+
+# special case
+$feature_bundle{"5.9.5"} = $feature_bundle{"5.10"};
+
+# TODO:
+# - think about versioned features (use feature switch => 2)
+
+=head1 NAME
+
+feature - Perl pragma to enable new syntactic features
+
+=head1 SYNOPSIS
+
+ use feature qw(switch say);
+ given ($foo) {
+ when (1) { say "\$foo == 1" }
+ when ([2,3]) { say "\$foo == 2 || \$foo == 3" }
+ when (/^a[bc]d$/) { say "\$foo eq 'abd' || \$foo eq 'acd'" }
+ when ($_ > 100) { say "\$foo > 100" }
+ default { say "None of the above" }
+ }
+
+ use feature ':5.10'; # loads all features available in perl 5.10
+
+=head1 DESCRIPTION
+
+It is usually impossible to add new syntax to Perl without breaking
+some existing programs. This pragma provides a way to minimize that
+risk. New syntactic constructs can be enabled by C<use feature 'foo'>,
+and will be parsed only when the appropriate feature pragma is in
+scope.
+
+=head2 Lexical effect
+
+Like other pragmas (C<use strict>, for example), features have a lexical
+effect. C<use feature qw(foo)> will only make the feature "foo" available
+from that point to the end of the enclosing block.
+
+ {
+ use feature 'say';
+ say "say is available here";
+ }
+ print "But not here.\n";
+
+=head2 C<no feature>
+
+Features can also be turned off by using C<no feature "foo">. This too
+has lexical effect.
+
+ use feature 'say';
+ say "say is available here";
+ {
+ no feature 'say';
+ print "But not here.\n";
+ }
+ say "Yet it is here.";
+
+C<no feature> with no features specified will turn off all features.
+
+=head2 The 'switch' feature
+
+C<use feature 'switch'> tells the compiler to enable the Perl 6
+given/when construct.
+
+See L<perlsyn/"Switch statements"> for details.
+
+=head2 The 'say' feature
+
+C<use feature 'say'> tells the compiler to enable the Perl 6
+C<say> function.
+
+See L<perlfunc/say> for details.
+
+=head2 the 'state' feature
+
+C<use feature 'state'> tells the compiler to enable C<state>
+variables.
+
+See L<perlsub/"Persistent Private Variables"> for details.
+
+=head1 FEATURE BUNDLES
+
+It's possible to load a whole slew of features in one go, using
+a I<feature bundle>. The name of a feature bundle is prefixed with
+a colon, to distinguish it from an actual feature. At present, the
+only feature bundle is C<use feature ":5.10"> which is equivalent
+to C<use feature qw(switch say state)>.
+
+Specifying sub-versions such as the C<0> in C<5.10.0> in feature bundles has
+no effect: feature bundles are guaranteed to be the same for all sub-versions.
+
+=head1 IMPLICIT LOADING
+
+There are two ways to load the C<feature> pragma implicitly :
+
+=over 4
+
+=item *
+
+By using the C<-E> switch on the command-line instead of C<-e>. It enables
+all available features in the main compilation unit (that is, the one-liner.)
+
+=item *
+
+By requiring explicitly a minimal Perl version number for your program, with
+the C<use VERSION> construct, and when the version is higher than or equal to
+5.10.0. That is,
+
+ use 5.10.0;
+
+will do an implicit
+
+ use feature ':5.10';
+
+and so on. Note how the trailing sub-version is automatically stripped from the
+version.
+
+But to avoid portability warnings (see L<perlfunc/use>), you may prefer:
+
+ use 5.010;
+
+with the same effect.
+
+=back
+
+=cut
+
+sub import {
+ my $class = shift;
+ if (@_ == 0) {
+ croak("No features specified");
+ }
+ while (@_) {
+ my $name = shift(@_);
+ if (substr($name, 0, 1) eq ":") {
+ my $v = substr($name, 1);
+ if (!exists $feature_bundle{$v}) {
+ $v =~ s/^([0-9]+)\.([0-9]+).[0-9]+$/$1.$2/;
+ if (!exists $feature_bundle{$v}) {
+ unknown_feature_bundle(substr($name, 1));
+ }
+ }
+ unshift @_, @{$feature_bundle{$v}};
+ next;
+ }
+ if (!exists $feature{$name}) {
+ unknown_feature($name);
+ }
+ $^H{$feature{$name}} = 1;
+ }
+}
+
+sub unimport {
+ my $class = shift;
+
+ # A bare C<no feature> should disable *all* features
+ if (!@_) {
+ delete @^H{ values(%feature) };
+ return;
+ }
+
+ while (@_) {
+ my $name = shift;
+ if (substr($name, 0, 1) eq ":") {
+ my $v = substr($name, 1);
+ if (!exists $feature_bundle{$v}) {
+ $v =~ s/^([0-9]+)\.([0-9]+).[0-9]+$/$1.$2/;
+ if (!exists $feature_bundle{$v}) {
+ unknown_feature_bundle(substr($name, 1));
+ }
+ }
+ unshift @_, @{$feature_bundle{$v}};
+ next;
+ }
+ if (!exists($feature{$name})) {
+ unknown_feature($name);
+ }
+ else {
+ delete $^H{$feature{$name}};
+ }
+ }
+}
+
+sub unknown_feature {
+ my $feature = shift;
+ croak(sprintf('Feature "%s" is not supported by Perl %vd',
+ $feature, $^V));
+}
+
+sub unknown_feature_bundle {
+ my $feature = shift;
+ croak(sprintf('Feature bundle "%s" is not supported by Perl %vd',
+ $feature, $^V));
+}
+
+sub croak {
+ require Carp;
+ Carp::croak(@_);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/find.pl b/Master/tlpkg/tlperl.straw/lib/find.pl
new file mode 100755
index 00000000000..ee5dc5d1506
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/find.pl
@@ -0,0 +1,47 @@
+# Usage:
+# require "find.pl";
+#
+# &find('/foo','/bar');
+#
+# sub wanted { ... }
+# where wanted does whatever you want. $dir contains the
+# current directory name, and $_ the current filename within
+# that directory. $name contains "$dir/$_". You are cd'ed
+# to $dir when the function is called. The function may
+# set $prune to prune the tree.
+#
+# This library is primarily for find2perl, which, when fed
+#
+# find2perl / -name .nfs\* -mtime +7 -exec rm -f {} \; -o -fstype nfs -prune
+#
+# spits out something like this
+#
+# sub wanted {
+# /^\.nfs.*$/ &&
+# (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
+# int(-M _) > 7 &&
+# unlink($_)
+# ||
+# ($nlink || (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_))) &&
+# $dev < 0 &&
+# ($prune = 1);
+# }
+#
+# Set the variable $dont_use_nlink if you're using AFS, since AFS cheats.
+
+use File::Find ();
+
+*name = *File::Find::name;
+*prune = *File::Find::prune;
+*dir = *File::Find::dir;
+*topdir = *File::Find::topdir;
+*topdev = *File::Find::topdev;
+*topino = *File::Find::topino;
+*topmode = *File::Find::topmode;
+*topnlink = *File::Find::topnlink;
+
+sub find {
+ &File::Find::find(\&wanted, @_);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/flush.pl b/Master/tlpkg/tlperl.straw/lib/flush.pl
new file mode 100755
index 00000000000..8aa6d5580c9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/flush.pl
@@ -0,0 +1,32 @@
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: IO::Handle
+#
+;# Usage: &flush(FILEHANDLE)
+;# flushes the named filehandle
+
+;# Usage: &printflush(FILEHANDLE, "prompt: ")
+;# prints arguments and flushes filehandle
+
+sub flush {
+ local($old) = select(shift);
+ $| = 1;
+ print "";
+ $| = 0;
+ select($old);
+}
+
+sub printflush {
+ local($old) = select(shift);
+ $| = 1;
+ print @_;
+ $| = 0;
+ select($old);
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/getcwd.pl b/Master/tlpkg/tlperl.straw/lib/getcwd.pl
new file mode 100755
index 00000000000..eca6ba1127e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/getcwd.pl
@@ -0,0 +1,71 @@
+# By Brandon S. Allbery
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Cwd
+#
+#
+# Usage: $cwd = &getcwd;
+
+sub getcwd
+{
+ local($dotdots, $cwd, @pst, @cst, $dir, @tst);
+
+ unless (@cst = stat('.'))
+ {
+ warn "stat(.): $!";
+ return '';
+ }
+ $cwd = '';
+ do
+ {
+ $dotdots .= '/' if $dotdots;
+ $dotdots .= '..';
+ @pst = @cst;
+ unless (opendir(getcwd'PARENT, $dotdots)) #'))
+ {
+ warn "opendir($dotdots): $!";
+ return '';
+ }
+ unless (@cst = stat($dotdots))
+ {
+ warn "stat($dotdots): $!";
+ closedir(getcwd'PARENT); #');
+ return '';
+ }
+ if ($pst[$[] == $cst[$[] && $pst[$[ + 1] == $cst[$[ + 1])
+ {
+ $dir = '';
+ }
+ else
+ {
+ do
+ {
+ unless (defined ($dir = readdir(getcwd'PARENT))) #'))
+ {
+ warn "readdir($dotdots): $!";
+ closedir(getcwd'PARENT); #');
+ return '';
+ }
+ unless (@tst = lstat("$dotdots/$dir"))
+ {
+ # warn "lstat($dotdots/$dir): $!";
+ # closedir(getcwd'PARENT); #');
+ # return '';
+ }
+ }
+ while ($dir eq '.' || $dir eq '..' || $tst[$[] != $pst[$[] ||
+ $tst[$[ + 1] != $pst[$[ + 1]);
+ }
+ $cwd = "$dir/$cwd";
+ closedir(getcwd'PARENT); #');
+ } while ($dir ne '');
+ chop($cwd);
+ $cwd;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/getopts.pl b/Master/tlpkg/tlperl.straw/lib/getopts.pl
new file mode 100755
index 00000000000..e30820a3189
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/getopts.pl
@@ -0,0 +1,66 @@
+;# getopts.pl - a better getopt.pl
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternatives: Getopt::Long or Getopt::Std
+#
+;# Usage:
+;# do Getopts('a:bc'); # -a takes arg. -b & -c not. Sets opt_* as a
+;# # side effect.
+
+sub Getopts {
+ local($argumentative) = @_;
+ local(@args,$_,$first,$rest);
+ local($errs) = 0;
+ local($[) = 0;
+
+ @args = split( / */, $argumentative );
+ while(@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) {
+ ($first,$rest) = ($1,$2);
+ $pos = index($argumentative,$first);
+ if($pos >= $[) {
+ if($args[$pos+1] eq ':') {
+ shift(@ARGV);
+ if($rest eq '') {
+ ++$errs unless(@ARGV);
+ $rest = shift(@ARGV);
+ }
+ eval "
+ push(\@opt_$first, \$rest);
+ if (!defined \$opt_$first or \$opt_$first eq '') {
+ \$opt_$first = \$rest;
+ }
+ else {
+ \$opt_$first .= ' ' . \$rest;
+ }
+ ";
+ }
+ else {
+ eval "\$opt_$first = 1";
+ if($rest eq '') {
+ shift(@ARGV);
+ }
+ else {
+ $ARGV[0] = "-$rest";
+ }
+ }
+ }
+ else {
+ print STDERR "Unknown option: $first\n";
+ ++$errs;
+ if($rest ne '') {
+ $ARGV[0] = "-$rest";
+ }
+ else {
+ shift(@ARGV);
+ }
+ }
+ }
+ $errs == 0;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/hostname.pl b/Master/tlpkg/tlperl.straw/lib/hostname.pl
new file mode 100755
index 00000000000..63eea8fee45
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/hostname.pl
@@ -0,0 +1,31 @@
+# From: asherman@fmrco.com (Aaron Sherman)
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Sys::Hostname
+#
+sub hostname
+{
+ local(*P,@tmp,$hostname,$_);
+ if (open(P,"hostname 2>&1 |") && (@tmp = <P>) && close(P))
+ {
+ chop($hostname = $tmp[$#tmp]);
+ }
+ elsif (open(P,"uname -n 2>&1 |") && (@tmp = <P>) && close(P))
+ {
+ chop($hostname = $tmp[$#tmp]);
+ }
+ else
+ {
+ die "$0: Cannot get hostname from 'hostname' or 'uname -n'\n";
+ }
+ @tmp = ();
+ close P; # Just in case we failed in an odd spot....
+ $hostname;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/importenv.pl b/Master/tlpkg/tlperl.straw/lib/importenv.pl
new file mode 100755
index 00000000000..0401127f186
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/importenv.pl
@@ -0,0 +1,14 @@
+;# This file, when interpreted, pulls the environment into normal variables.
+;# Usage:
+;# require 'importenv.pl';
+;# or
+;# #include <importenv.pl>
+
+local($tmp,$key) = '';
+
+foreach $key (keys(%ENV)) {
+ $tmp .= "\$$key = \$ENV{'$key'};" if $key =~ /^[A-Za-z]\w*$/;
+}
+eval $tmp;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/integer.pm b/Master/tlpkg/tlperl.straw/lib/integer.pm
new file mode 100755
index 00000000000..caa1ea6951f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/integer.pm
@@ -0,0 +1,93 @@
+package integer;
+
+our $VERSION = '1.00';
+
+=head1 NAME
+
+integer - Perl pragma to use integer arithmetic instead of floating point
+
+=head1 SYNOPSIS
+
+ use integer;
+ $x = 10/3;
+ # $x is now 3, not 3.33333333333333333
+
+=head1 DESCRIPTION
+
+This tells the compiler to use integer operations from here to the end
+of the enclosing BLOCK. On many machines, this doesn't matter a great
+deal for most computations, but on those without floating point
+hardware, it can make a big difference in performance.
+
+Note that this only affects how most of the arithmetic and relational
+B<operators> handle their operands and results, and B<not> how all
+numbers everywhere are treated. Specifically, C<use integer;> has the
+effect that before computing the results of the arithmetic operators
+(+, -, *, /, %, +=, -=, *=, /=, %=, and unary minus), the comparison
+operators (<, <=, >, >=, ==, !=, <=>), and the bitwise operators (|, &,
+^, <<, >>, |=, &=, ^=, <<=, >>=), the operands have their fractional
+portions truncated (or floored), and the result will have its
+fractional portion truncated as well. In addition, the range of
+operands and results is restricted to that of familiar two's complement
+integers, i.e., -(2**31) .. (2**31-1) on 32-bit architectures, and
+-(2**63) .. (2**63-1) on 64-bit architectures. For example, this code
+
+ use integer;
+ $x = 5.8;
+ $y = 2.5;
+ $z = 2.7;
+ $a = 2**31 - 1; # Largest positive integer on 32-bit machines
+ $, = ", ";
+ print $x, -$x, $x + $y, $x - $y, $x / $y, $x * $y, $y == $z, $a, $a + 1;
+
+will print: 5.8, -5, 7, 3, 2, 10, 1, 2147483647, -2147483648
+
+Note that $x is still printed as having its true non-integer value of
+5.8 since it wasn't operated on. And note too the wrap-around from the
+largest positive integer to the largest negative one. Also, arguments
+passed to functions and the values returned by them are B<not> affected
+by C<use integer;>. E.g.,
+
+ srand(1.5);
+ $, = ", ";
+ print sin(.5), cos(.5), atan2(1,2), sqrt(2), rand(10);
+
+will give the same result with or without C<use integer;> The power
+operator C<**> is also not affected, so that 2 ** .5 is always the
+square root of 2. Now, it so happens that the pre- and post- increment
+and decrement operators, ++ and --, are not affected by C<use integer;>
+either. Some may rightly consider this to be a bug -- but at least it's
+a long-standing one.
+
+Finally, C<use integer;> also has an additional affect on the bitwise
+operators. Normally, the operands and results are treated as
+B<unsigned> integers, but with C<use integer;> the operands and results
+are B<signed>. This means, among other things, that ~0 is -1, and -2 &
+-5 is -6.
+
+Internally, native integer arithmetic (as provided by your C compiler)
+is used. This means that Perl's own semantics for arithmetic
+operations may not be preserved. One common source of trouble is the
+modulus of negative numbers, which Perl does one way, but your hardware
+may do another.
+
+ % perl -le 'print (4 % -3)'
+ -2
+ % perl -Minteger -le 'print (4 % -3)'
+ 1
+
+See L<perlmodlib/"Pragmatic Modules">, L<perlop/"Integer Arithmetic">
+
+=cut
+
+$integer::hint_bits = 0x1;
+
+sub import {
+ $^H |= $integer::hint_bits;
+}
+
+sub unimport {
+ $^H &= ~$integer::hint_bits;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/less.pm b/Master/tlpkg/tlperl.straw/lib/less.pm
new file mode 100755
index 00000000000..970b97a80c6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/less.pm
@@ -0,0 +1,155 @@
+package less;
+use strict;
+use warnings;
+
+our $VERSION = '0.02';
+
+sub _pack_tags {
+ return join ' ', @_;
+}
+
+sub _unpack_tags {
+ return grep { defined and length }
+ map { split ' ' }
+ grep {defined} @_;
+}
+
+sub of {
+ my $class = shift @_;
+
+ # If no one wants the result, don't bother computing it.
+ return unless defined wantarray;
+
+ my $hinthash = ( caller 0 )[10];
+ my %tags;
+ @tags{ _unpack_tags( $hinthash->{$class} ) } = ();
+
+ if (@_) {
+ exists $tags{$_} and return !!1 for @_;
+ return;
+ }
+ else {
+ return keys %tags;
+ }
+}
+
+sub import {
+ my $class = shift @_;
+
+ @_ = 'please' if not @_;
+ my %tags;
+ @tags{ _unpack_tags( @_, $^H{$class} ) } = ();
+
+ $^H{$class} = _pack_tags( keys %tags );
+ return;
+}
+
+sub unimport {
+ my $class = shift @_;
+
+ if (@_) {
+ my %tags;
+ @tags{ _unpack_tags( $^H{$class} ) } = ();
+ delete @tags{ _unpack_tags(@_) };
+ my $new = _pack_tags( keys %tags );
+
+ if ( not length $new ) {
+ delete $^H{$class};
+ }
+ else {
+ $^H{$class} = $new;
+ }
+ }
+ else {
+ delete $^H{$class};
+ }
+
+ return;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+less - perl pragma to request less of something
+
+=head1 SYNOPSIS
+
+ use less 'CPU';
+
+=head1 DESCRIPTION
+
+This is a user-pragma. If you're very lucky some code you're using
+will know that you asked for less CPU usage or ram or fat or... we
+just can't know. Consult your documentation on everything you're
+currently using.
+
+For general suggestions, try requesting C<CPU> or C<memory>.
+
+ use less 'memory';
+ use less 'CPU';
+ use less 'fat';
+
+If you ask for nothing in particular, you'll be asking for C<less
+'please'>.
+
+ use less 'please';
+
+=head1 FOR MODULE AUTHORS
+
+L<less> has been in the core as a "joke" module for ages now and it
+hasn't had any real way to communicating any information to
+anything. Thanks to Nicholas Clark we have user pragmas (see
+L<perlpragma>) and now C<less> can do something.
+
+You can probably expect your users to be able to guess that they can
+request less CPU or memory or just "less" overall.
+
+If the user didn't specify anything, it's interpreted as having used
+the C<please> tag. It's up to you to make this useful.
+
+ # equivalent
+ use less;
+ use less 'please';
+
+=head2 C<< BOOLEAN = less->of( FEATURE ) >>
+
+The class method C<< less->of( NAME ) >> returns a boolean to tell you
+whether your user requested less of something.
+
+ if ( less->of( 'CPU' ) ) {
+ ...
+ }
+ elsif ( less->of( 'memory' ) ) {
+
+ }
+
+=head2 C<< FEATURES = less->of() >>
+
+If you don't ask for any feature, you get the list of features that
+the user requested you to be nice to. This has the nice side effect
+that if you don't respect anything in particular then you can just ask
+for it and use it like a boolean.
+
+ if ( less->of ) {
+ ...
+ }
+ else {
+ ...
+ }
+
+=head1 CAVEATS
+
+=over
+
+=item This probably does nothing.
+
+=item This works only on 5.10+
+
+At least it's backwards compatible in not doing much.
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/lib.pm b/Master/tlpkg/tlperl.straw/lib/lib.pm
new file mode 100755
index 00000000000..471d381bb7c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/lib.pm
@@ -0,0 +1,242 @@
+package lib;
+
+# THIS FILE IS AUTOMATICALLY GENERATED FROM lib_pm.PL.
+# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN BY THE NEXT PERL BUILD.
+
+use Config;
+
+use strict;
+
+my $archname = $Config{archname};
+my $version = $Config{version};
+my @inc_version_list = reverse split / /, $Config{inc_version_list};
+
+
+our @ORIG_INC = @INC; # take a handy copy of 'original' value
+our $VERSION = '0.62';
+my $Is_MacOS = $^O eq 'MacOS';
+my $Mac_FS;
+if ($Is_MacOS) {
+ require File::Spec;
+ $Mac_FS = eval { require Mac::FileSpec::Unixish };
+}
+
+sub import {
+ shift;
+
+ my %names;
+ foreach (reverse @_) {
+ my $path = $_; # we'll be modifying it, so break the alias
+ if ($path eq '') {
+ require Carp;
+ Carp::carp("Empty compile time value given to use lib");
+ }
+
+ $path = _nativize($path);
+
+ if ($path !~ /\.par$/i && -e $path && ! -d _) {
+ require Carp;
+ Carp::carp("Parameter to use lib must be directory, not file");
+ }
+ unshift(@INC, $path);
+ # Add any previous version directories we found at configure time
+ foreach my $incver (@inc_version_list)
+ {
+ my $dir = $Is_MacOS
+ ? File::Spec->catdir( $path, $incver )
+ : "$path/$incver";
+ unshift(@INC, $dir) if -d $dir;
+ }
+ # Put a corresponding archlib directory in front of $path if it
+ # looks like $path has an archlib directory below it.
+ my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir)
+ = _get_dirs($path);
+ unshift(@INC, $arch_dir) if -d $arch_auto_dir;
+ unshift(@INC, $version_dir) if -d $version_dir;
+ unshift(@INC, $version_arch_dir) if -d $version_arch_dir;
+ }
+
+ # remove trailing duplicates
+ @INC = grep { ++$names{$_} == 1 } @INC;
+ return;
+}
+
+
+sub unimport {
+ shift;
+
+ my %names;
+ foreach (@_) {
+ my $path = _nativize($_);
+
+ my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir)
+ = _get_dirs($path);
+ ++$names{$path};
+ ++$names{$arch_dir} if -d $arch_auto_dir;
+ ++$names{$version_dir} if -d $version_dir;
+ ++$names{$version_arch_dir} if -d $version_arch_dir;
+ }
+
+ # Remove ALL instances of each named directory.
+ @INC = grep { !exists $names{$_} } @INC;
+ return;
+}
+
+sub _get_dirs {
+ my($dir) = @_;
+ my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir);
+
+ # we could use this for all platforms in the future, but leave it
+ # Mac-only for now, until there is more time for testing it.
+ if ($Is_MacOS) {
+ $arch_auto_dir = File::Spec->catdir( $dir, $archname, 'auto' );
+ $arch_dir = File::Spec->catdir( $dir, $archname, );
+ $version_dir = File::Spec->catdir( $dir, $version );
+ $version_arch_dir = File::Spec->catdir( $dir, $version, $archname );
+ } else {
+ $arch_auto_dir = "$dir/$archname/auto";
+ $arch_dir = "$dir/$archname";
+ $version_dir = "$dir/$version";
+ $version_arch_dir = "$dir/$version/$archname";
+ }
+ return($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir);
+}
+
+sub _nativize {
+ my($dir) = @_;
+
+ if ($Is_MacOS && $Mac_FS && ! -d $dir) {
+ $dir = Mac::FileSpec::Unixish::nativize($dir);
+ $dir .= ":" unless $dir =~ /:$/;
+ }
+
+ return $dir;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+lib - manipulate @INC at compile time
+
+=head1 SYNOPSIS
+
+ use lib LIST;
+
+ no lib LIST;
+
+=head1 DESCRIPTION
+
+This is a small simple module which simplifies the manipulation of @INC
+at compile time.
+
+It is typically used to add extra directories to perl's search path so
+that later C<use> or C<require> statements will find modules which are
+not located on perl's default search path.
+
+=head2 Adding directories to @INC
+
+The parameters to C<use lib> are added to the start of the perl search
+path. Saying
+
+ use lib LIST;
+
+is I<almost> the same as saying
+
+ BEGIN { unshift(@INC, LIST) }
+
+For each directory in LIST (called $dir here) the lib module also
+checks to see if a directory called $dir/$archname/auto exists.
+If so the $dir/$archname directory is assumed to be a corresponding
+architecture specific directory and is added to @INC in front of $dir.
+lib.pm also checks if directories called $dir/$version and $dir/$version/$archname
+exist and adds these directories to @INC.
+
+The current value of C<$archname> can be found with this command:
+
+ perl -V:archname
+
+The corresponding command to get the current value of C<$version> is:
+
+ perl -V:version
+
+To avoid memory leaks, all trailing duplicate entries in @INC are
+removed.
+
+=head2 Deleting directories from @INC
+
+You should normally only add directories to @INC. If you need to
+delete directories from @INC take care to only delete those which you
+added yourself or which you are certain are not needed by other modules
+in your script. Other modules may have added directories which they
+need for correct operation.
+
+The C<no lib> statement deletes all instances of each named directory
+from @INC.
+
+For each directory in LIST (called $dir here) the lib module also
+checks to see if a directory called $dir/$archname/auto exists.
+If so the $dir/$archname directory is assumed to be a corresponding
+architecture specific directory and is also deleted from @INC.
+
+=head2 Restoring original @INC
+
+When the lib module is first loaded it records the current value of @INC
+in an array C<@lib::ORIG_INC>. To restore @INC to that value you
+can say
+
+ @INC = @lib::ORIG_INC;
+
+=head1 CAVEATS
+
+In order to keep lib.pm small and simple, it only works with Unix
+filepaths. This doesn't mean it only works on Unix, but non-Unix
+users must first translate their file paths to Unix conventions.
+
+ # VMS users wanting to put [.stuff.moo] into
+ # their @INC would write
+ use lib 'stuff/moo';
+
+=head1 NOTES
+
+In the future, this module will likely use File::Spec for determining
+paths, as it does now for Mac OS (where Unix-style or Mac-style paths
+work, and Unix-style paths are converted properly to Mac-style paths
+before being added to @INC).
+
+If you try to add a file to @INC as follows:
+
+ use lib 'this_is_a_file.txt';
+
+C<lib> will warn about this. The sole exceptions are files with the
+C<.par> extension which are intended to be used as libraries.
+
+=head1 SEE ALSO
+
+FindBin - optional module which deals with paths relative to the source file.
+
+PAR - optional module which can treat C<.par> files as Perl libraries.
+
+=head1 AUTHOR
+
+Tim Bunce, 2nd June 1995.
+
+C<lib> is maintained by the perl5-porters. Please direct
+any questions to the canonical mailing list. Anything that
+is applicable to the CPAN release can be sent to its maintainer,
+though.
+
+Maintainer: The Perl5-Porters <perl5-porters@perl.org>
+
+Maintainer of the CPAN release: Steffen Mueller <smueller@cpan.org>
+
+=head1 COPYRIGHT AND LICENSE
+
+This package has been part of the perl core since perl 5.001.
+It has been released separately to CPAN so older installations
+can benefit from bug fixes.
+
+This package has the same copyright and license as the perl core.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/locale.pm b/Master/tlpkg/tlperl.straw/lib/locale.pm
new file mode 100755
index 00000000000..a51e2b1c097
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/locale.pm
@@ -0,0 +1,40 @@
+package locale;
+
+our $VERSION = '1.00';
+
+=head1 NAME
+
+locale - Perl pragma to use and avoid POSIX locales for built-in operations
+
+=head1 SYNOPSIS
+
+ @x = sort @y; # ASCII sorting order
+ {
+ use locale;
+ @x = sort @y; # Locale-defined sorting order
+ }
+ @x = sort @y; # ASCII sorting order again
+
+=head1 DESCRIPTION
+
+This pragma tells the compiler to enable (or disable) the use of POSIX
+locales for built-in operations (LC_CTYPE for regular expressions, and
+LC_COLLATE for string comparison). Each "use locale" or "no locale"
+affects statements to the end of the enclosing BLOCK.
+
+See L<perllocale> for more detailed information on how Perl supports
+locales.
+
+=cut
+
+$locale::hint_bits = 0x4;
+
+sub import {
+ $^H |= $locale::hint_bits;
+}
+
+sub unimport {
+ $^H &= ~$locale::hint_bits;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/look.pl b/Master/tlpkg/tlperl.straw/lib/look.pl
new file mode 100755
index 00000000000..ccc9b6162ae
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/look.pl
@@ -0,0 +1,50 @@
+;# Usage: &look(*FILEHANDLE,$key,$dict,$fold)
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+;# Sets file position in FILEHANDLE to be first line greater than or equal
+;# (stringwise) to $key. Pass flags for dictionary order and case folding.
+
+sub look {
+ local(*FH,$key,$dict,$fold) = @_;
+ local($max,$min,$mid,$_);
+ local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
+ $blksize,$blocks) = stat(FH);
+ $blksize = 8192 unless $blksize;
+ $key =~ s/[^\w\s]//g if $dict;
+ $key = lc $key if $fold;
+ $max = int($size / $blksize);
+ while ($max - $min > 1) {
+ $mid = int(($max + $min) / 2);
+ seek(FH,$mid * $blksize,0);
+ $_ = <FH> if $mid; # probably a partial line
+ $_ = <FH>;
+ chop;
+ s/[^\w\s]//g if $dict;
+ $_ = lc $_ if $fold;
+ if ($_ lt $key) {
+ $min = $mid;
+ }
+ else {
+ $max = $mid;
+ }
+ }
+ $min *= $blksize;
+ seek(FH,$min,0);
+ <FH> if $min;
+ while (<FH>) {
+ chop;
+ s/[^\w\s]//g if $dict;
+ $_ = lc $_ if $fold;
+ last if $_ ge $key;
+ $min = tell(FH);
+ }
+ seek(FH,$min,0);
+ $min;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/lwpcook.pod b/Master/tlpkg/tlperl.straw/lib/lwpcook.pod
new file mode 100755
index 00000000000..172c819fe17
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/lwpcook.pod
@@ -0,0 +1,309 @@
+=head1 NAME
+
+lwpcook - The libwww-perl cookbook
+
+=head1 DESCRIPTION
+
+This document contain some examples that show typical usage of the
+libwww-perl library. You should consult the documentation for the
+individual modules for more detail.
+
+All examples should be runnable programs. You can, in most cases, test
+the code sections by piping the program text directly to perl.
+
+
+
+=head1 GET
+
+It is very easy to use this library to just fetch documents from the
+net. The LWP::Simple module provides the get() function that return
+the document specified by its URL argument:
+
+ use LWP::Simple;
+ $doc = get 'http://www.linpro.no/lwp/';
+
+or, as a perl one-liner using the getprint() function:
+
+ perl -MLWP::Simple -e 'getprint "http://www.linpro.no/lwp/"'
+
+or, how about fetching the latest perl by running this command:
+
+ perl -MLWP::Simple -e '
+ getstore "ftp://ftp.sunet.se/pub/lang/perl/CPAN/src/latest.tar.gz",
+ "perl.tar.gz"'
+
+You will probably first want to find a CPAN site closer to you by
+running something like the following command:
+
+ perl -MLWP::Simple -e 'getprint "http://www.perl.com/perl/CPAN/CPAN.html"'
+
+Enough of this simple stuff! The LWP object oriented interface gives
+you more control over the request sent to the server. Using this
+interface you have full control over headers sent and how you want to
+handle the response returned.
+
+ use LWP::UserAgent;
+ $ua = LWP::UserAgent->new;
+ $ua->agent("$0/0.1 " . $ua->agent);
+ # $ua->agent("Mozilla/8.0") # pretend we are very capable browser
+
+ $req = HTTP::Request->new(GET => 'http://www.linpro.no/lwp');
+ $req->header('Accept' => 'text/html');
+
+ # send request
+ $res = $ua->request($req);
+
+ # check the outcome
+ if ($res->is_success) {
+ print $res->decoded_content;
+ }
+ else {
+ print "Error: " . $res->status_line . "\n";
+ }
+
+The lwp-request program (alias GET) that is distributed with the
+library can also be used to fetch documents from WWW servers.
+
+
+
+=head1 HEAD
+
+If you just want to check if a document is present (i.e. the URL is
+valid) try to run code that looks like this:
+
+ use LWP::Simple;
+
+ if (head($url)) {
+ # ok document exists
+ }
+
+The head() function really returns a list of meta-information about
+the document. The first three values of the list returned are the
+document type, the size of the document, and the age of the document.
+
+More control over the request or access to all header values returned
+require that you use the object oriented interface described for GET
+above. Just s/GET/HEAD/g.
+
+
+=head1 POST
+
+There is no simple procedural interface for posting data to a WWW server. You
+must use the object oriented interface for this. The most common POST
+operation is to access a WWW form application:
+
+ use LWP::UserAgent;
+ $ua = LWP::UserAgent->new;
+
+ my $req = HTTP::Request->new(POST => 'http://www.perl.com/cgi-bin/BugGlimpse');
+ $req->content_type('application/x-www-form-urlencoded');
+ $req->content('match=www&errors=0');
+
+ my $res = $ua->request($req);
+ print $res->as_string;
+
+Lazy people use the HTTP::Request::Common module to set up a suitable
+POST request message (it handles all the escaping issues) and has a
+suitable default for the content_type:
+
+ use HTTP::Request::Common qw(POST);
+ use LWP::UserAgent;
+ $ua = LWP::UserAgent->new;
+
+ my $req = POST 'http://www.perl.com/cgi-bin/BugGlimpse',
+ [ search => 'www', errors => 0 ];
+
+ print $ua->request($req)->as_string;
+
+The lwp-request program (alias POST) that is distributed with the
+library can also be used for posting data.
+
+
+
+=head1 PROXIES
+
+Some sites use proxies to go through fire wall machines, or just as
+cache in order to improve performance. Proxies can also be used for
+accessing resources through protocols not supported directly (or
+supported badly :-) by the libwww-perl library.
+
+You should initialize your proxy setting before you start sending
+requests:
+
+ use LWP::UserAgent;
+ $ua = LWP::UserAgent->new;
+ $ua->env_proxy; # initialize from environment variables
+ # or
+ $ua->proxy(ftp => 'http://proxy.myorg.com');
+ $ua->proxy(wais => 'http://proxy.myorg.com');
+ $ua->no_proxy(qw(no se fi));
+
+ my $req = HTTP::Request->new(GET => 'wais://xxx.com/');
+ print $ua->request($req)->as_string;
+
+The LWP::Simple interface will call env_proxy() for you automatically.
+Applications that use the $ua->env_proxy() method will normally not
+use the $ua->proxy() and $ua->no_proxy() methods.
+
+Some proxies also require that you send it a username/password in
+order to let requests through. You should be able to add the
+required header, with something like this:
+
+ use LWP::UserAgent;
+
+ $ua = LWP::UserAgent->new;
+ $ua->proxy(['http', 'ftp'] => 'http://username:password@proxy.myorg.com');
+
+ $req = HTTP::Request->new('GET',"http://www.perl.com");
+
+ $res = $ua->request($req);
+ print $res->decoded_content if $res->is_success;
+
+Replace C<proxy.myorg.com>, C<username> and
+C<password> with something suitable for your site.
+
+
+=head1 ACCESS TO PROTECTED DOCUMENTS
+
+Documents protected by basic authorization can easily be accessed
+like this:
+
+ use LWP::UserAgent;
+ $ua = LWP::UserAgent->new;
+ $req = HTTP::Request->new(GET => 'http://www.linpro.no/secret/');
+ $req->authorization_basic('aas', 'mypassword');
+ print $ua->request($req)->as_string;
+
+The other alternative is to provide a subclass of I<LWP::UserAgent> that
+overrides the get_basic_credentials() method. Study the I<lwp-request>
+program for an example of this.
+
+
+=head1 COOKIES
+
+Some sites like to play games with cookies. By default LWP ignores
+cookies provided by the servers it visits. LWP will collect cookies
+and respond to cookie requests if you set up a cookie jar.
+
+ use LWP::UserAgent;
+ use HTTP::Cookies;
+
+ $ua = LWP::UserAgent->new;
+ $ua->cookie_jar(HTTP::Cookies->new(file => "lwpcookies.txt",
+ autosave => 1));
+
+ # and then send requests just as you used to do
+ $res = $ua->request(HTTP::Request->new(GET => "http://www.yahoo.no"));
+ print $res->status_line, "\n";
+
+As you visit sites that send you cookies to keep, then the file
+F<lwpcookies.txt"> will grow.
+
+=head1 HTTPS
+
+URLs with https scheme are accessed in exactly the same way as with
+http scheme, provided that an SSL interface module for LWP has been
+properly installed (see the F<README.SSL> file found in the
+libwww-perl distribution for more details). If no SSL interface is
+installed for LWP to use, then you will get "501 Protocol scheme
+'https' is not supported" errors when accessing such URLs.
+
+Here's an example of fetching and printing a WWW page using SSL:
+
+ use LWP::UserAgent;
+
+ my $ua = LWP::UserAgent->new;
+ my $req = HTTP::Request->new(GET => 'https://www.helsinki.fi/');
+ my $res = $ua->request($req);
+ if ($res->is_success) {
+ print $res->as_string;
+ }
+ else {
+ print "Failed: ", $res->status_line, "\n";
+ }
+
+=head1 MIRRORING
+
+If you want to mirror documents from a WWW server, then try to run
+code similar to this at regular intervals:
+
+ use LWP::Simple;
+
+ %mirrors = (
+ 'http://www.sn.no/' => 'sn.html',
+ 'http://www.perl.com/' => 'perl.html',
+ 'http://www.sn.no/libwww-perl/' => 'lwp.html',
+ 'gopher://gopher.sn.no/' => 'gopher.html',
+ );
+
+ while (($url, $localfile) = each(%mirrors)) {
+ mirror($url, $localfile);
+ }
+
+Or, as a perl one-liner:
+
+ perl -MLWP::Simple -e 'mirror("http://www.perl.com/", "perl.html")';
+
+The document will not be transferred unless it has been updated.
+
+
+
+=head1 LARGE DOCUMENTS
+
+If the document you want to fetch is too large to be kept in memory,
+then you have two alternatives. You can instruct the library to write
+the document content to a file (second $ua->request() argument is a file
+name):
+
+ use LWP::UserAgent;
+ $ua = LWP::UserAgent->new;
+
+ my $req = HTTP::Request->new(GET =>
+ 'http://www.linpro.no/lwp/libwww-perl-5.46.tar.gz');
+ $res = $ua->request($req, "libwww-perl.tar.gz");
+ if ($res->is_success) {
+ print "ok\n";
+ }
+ else {
+ print $res->status_line, "\n";
+ }
+
+
+Or you can process the document as it arrives (second $ua->request()
+argument is a code reference):
+
+ use LWP::UserAgent;
+ $ua = LWP::UserAgent->new;
+ $URL = 'ftp://ftp.unit.no/pub/rfc/rfc-index.txt';
+
+ my $expected_length;
+ my $bytes_received = 0;
+ my $res =
+ $ua->request(HTTP::Request->new(GET => $URL),
+ sub {
+ my($chunk, $res) = @_;
+ $bytes_received += length($chunk);
+ unless (defined $expected_length) {
+ $expected_length = $res->content_length || 0;
+ }
+ if ($expected_length) {
+ printf STDERR "%d%% - ",
+ 100 * $bytes_received / $expected_length;
+ }
+ print STDERR "$bytes_received bytes received\n";
+
+ # XXX Should really do something with the chunk itself
+ # print $chunk;
+ });
+ print $res->status_line, "\n";
+
+
+
+=head1 COPYRIGHT
+
+Copyright 1996-2001, Gisle Aas
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/open2.pl b/Master/tlpkg/tlperl.straw/lib/open2.pl
new file mode 100755
index 00000000000..8cf08c2e8bd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/open2.pl
@@ -0,0 +1,12 @@
+# This is a compatibility interface to IPC::Open2. New programs should
+# do
+#
+# use IPC::Open2;
+#
+# instead of
+#
+# require 'open2.pl';
+
+package main;
+use IPC::Open2 'open2';
+1
diff --git a/Master/tlpkg/tlperl.straw/lib/overload.pm b/Master/tlpkg/tlperl.straw/lib/overload.pm
new file mode 100755
index 00000000000..f83191b5cd0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/overload.pm
@@ -0,0 +1,1499 @@
+package overload;
+
+our $VERSION = '1.07';
+
+sub nil {}
+
+sub OVERLOAD {
+ $package = shift;
+ my %arg = @_;
+ my ($sub, $fb);
+ $ {$package . "::OVERLOAD"}{dummy}++; # Register with magic by touching.
+ *{$package . "::()"} = \&nil; # Make it findable via fetchmethod.
+ for (keys %arg) {
+ if ($_ eq 'fallback') {
+ $fb = $arg{$_};
+ } else {
+ $sub = $arg{$_};
+ if (not ref $sub and $sub !~ /::/) {
+ $ {$package . "::(" . $_} = $sub;
+ $sub = \&nil;
+ }
+ #print STDERR "Setting `$ {'package'}::\cO$_' to \\&`$sub'.\n";
+ *{$package . "::(" . $_} = \&{ $sub };
+ }
+ }
+ ${$package . "::()"} = $fb; # Make it findable too (fallback only).
+}
+
+sub import {
+ $package = (caller())[0];
+ # *{$package . "::OVERLOAD"} = \&OVERLOAD;
+ shift;
+ $package->overload::OVERLOAD(@_);
+}
+
+sub unimport {
+ $package = (caller())[0];
+ ${$package . "::OVERLOAD"}{dummy}++; # Upgrade the table
+ shift;
+ for (@_) {
+ if ($_ eq 'fallback') {
+ undef $ {$package . "::()"};
+ } else {
+ delete $ {$package . "::"}{"(" . $_};
+ }
+ }
+}
+
+sub Overloaded {
+ my $package = shift;
+ $package = ref $package if ref $package;
+ $package->can('()');
+}
+
+sub ov_method {
+ my $globref = shift;
+ return undef unless $globref;
+ my $sub = \&{*$globref};
+ return $sub if $sub ne \&nil;
+ return shift->can($ {*$globref});
+}
+
+sub OverloadedStringify {
+ my $package = shift;
+ $package = ref $package if ref $package;
+ #$package->can('(""')
+ ov_method mycan($package, '(""'), $package
+ or ov_method mycan($package, '(0+'), $package
+ or ov_method mycan($package, '(bool'), $package
+ or ov_method mycan($package, '(nomethod'), $package;
+}
+
+sub Method {
+ my $package = shift;
+ if(ref $package) {
+ local $@;
+ local $!;
+ require Scalar::Util;
+ $package = Scalar::Util::blessed($package);
+ return undef if !defined $package;
+ }
+ #my $meth = $package->can('(' . shift);
+ ov_method mycan($package, '(' . shift), $package;
+ #return $meth if $meth ne \&nil;
+ #return $ {*{$meth}};
+}
+
+sub AddrRef {
+ my $package = ref $_[0];
+ return "$_[0]" unless $package;
+
+ local $@;
+ local $!;
+ require Scalar::Util;
+ my $class = Scalar::Util::blessed($_[0]);
+ my $class_prefix = defined($class) ? "$class=" : "";
+ my $type = Scalar::Util::reftype($_[0]);
+ my $addr = Scalar::Util::refaddr($_[0]);
+ return sprintf("$class_prefix$type(0x%x)", $addr);
+}
+
+*StrVal = *AddrRef;
+
+sub mycan { # Real can would leave stubs.
+ my ($package, $meth) = @_;
+
+ my $mro = mro::get_linear_isa($package);
+ foreach my $p (@$mro) {
+ my $fqmeth = $p . q{::} . $meth;
+ return \*{$fqmeth} if defined &{$fqmeth};
+ }
+
+ return undef;
+}
+
+%constants = (
+ 'integer' => 0x1000, # HINT_NEW_INTEGER
+ 'float' => 0x2000, # HINT_NEW_FLOAT
+ 'binary' => 0x4000, # HINT_NEW_BINARY
+ 'q' => 0x8000, # HINT_NEW_STRING
+ 'qr' => 0x10000, # HINT_NEW_RE
+ );
+
+%ops = ( with_assign => "+ - * / % ** << >> x .",
+ assign => "+= -= *= /= %= **= <<= >>= x= .=",
+ num_comparison => "< <= > >= == !=",
+ '3way_comparison'=> "<=> cmp",
+ str_comparison => "lt le gt ge eq ne",
+ binary => '& &= | |= ^ ^=',
+ unary => "neg ! ~",
+ mutators => '++ --',
+ func => "atan2 cos sin exp abs log sqrt int",
+ conversion => 'bool "" 0+',
+ iterators => '<>',
+ dereferencing => '${} @{} %{} &{} *{}',
+ matching => '~~',
+ special => 'nomethod fallback =');
+
+use warnings::register;
+sub constant {
+ # Arguments: what, sub
+ while (@_) {
+ if (@_ == 1) {
+ warnings::warnif ("Odd number of arguments for overload::constant");
+ last;
+ }
+ elsif (!exists $constants {$_ [0]}) {
+ warnings::warnif ("`$_[0]' is not an overloadable type");
+ }
+ elsif (!ref $_ [1] || "$_[1]" !~ /(^|=)CODE\(0x[0-9a-f]+\)$/) {
+ # Can't use C<ref $_[1] eq "CODE"> above as code references can be
+ # blessed, and C<ref> would return the package the ref is blessed into.
+ if (warnings::enabled) {
+ $_ [1] = "undef" unless defined $_ [1];
+ warnings::warn ("`$_[1]' is not a code reference");
+ }
+ }
+ else {
+ $^H{$_[0]} = $_[1];
+ $^H |= $constants{$_[0]};
+ }
+ shift, shift;
+ }
+}
+
+sub remove_constant {
+ # Arguments: what, sub
+ while (@_) {
+ delete $^H{$_[0]};
+ $^H &= ~ $constants{$_[0]};
+ shift, shift;
+ }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+overload - Package for overloading Perl operations
+
+=head1 SYNOPSIS
+
+ package SomeThing;
+
+ use overload
+ '+' => \&myadd,
+ '-' => \&mysub;
+ # etc
+ ...
+
+ package main;
+ $a = SomeThing->new( 57 );
+ $b=5+$a;
+ ...
+ if (overload::Overloaded $b) {...}
+ ...
+ $strval = overload::StrVal $b;
+
+=head1 DESCRIPTION
+
+This pragma allows overloading of Perl's operators for a class.
+To overload built-in functions, see L<perlsub/Overriding Built-in Functions> instead.
+
+=head2 Declaration of overloaded functions
+
+The compilation directive
+
+ package Number;
+ use overload
+ "+" => \&add,
+ "*=" => "muas";
+
+declares function Number::add() for addition, and method muas() in
+the "class" C<Number> (or one of its base classes)
+for the assignment form C<*=> of multiplication.
+
+Arguments of this directive come in (key, value) pairs. Legal values
+are values legal inside a C<&{ ... }> call, so the name of a
+subroutine, a reference to a subroutine, or an anonymous subroutine
+will all work. Note that values specified as strings are
+interpreted as methods, not subroutines. Legal keys are listed below.
+
+The subroutine C<add> will be called to execute C<$a+$b> if $a
+is a reference to an object blessed into the package C<Number>, or if $a is
+not an object from a package with defined mathemagic addition, but $b is a
+reference to a C<Number>. It can also be called in other situations, like
+C<$a+=7>, or C<$a++>. See L<MAGIC AUTOGENERATION>. (Mathemagical
+methods refer to methods triggered by an overloaded mathematical
+operator.)
+
+Since overloading respects inheritance via the @ISA hierarchy, the
+above declaration would also trigger overloading of C<+> and C<*=> in
+all the packages which inherit from C<Number>.
+
+=head2 Calling Conventions for Binary Operations
+
+The functions specified in the C<use overload ...> directive are called
+with three (in one particular case with four, see L<Last Resort>)
+arguments. If the corresponding operation is binary, then the first
+two arguments are the two arguments of the operation. However, due to
+general object calling conventions, the first argument should always be
+an object in the package, so in the situation of C<7+$a>, the
+order of the arguments is interchanged. It probably does not matter
+when implementing the addition method, but whether the arguments
+are reversed is vital to the subtraction method. The method can
+query this information by examining the third argument, which can take
+three different values:
+
+=over 7
+
+=item FALSE
+
+the order of arguments is as in the current operation.
+
+=item TRUE
+
+the arguments are reversed.
+
+=item C<undef>
+
+the current operation is an assignment variant (as in
+C<$a+=7>), but the usual function is called instead. This additional
+information can be used to generate some optimizations. Compare
+L<Calling Conventions for Mutators>.
+
+=back
+
+=head2 Calling Conventions for Unary Operations
+
+Unary operation are considered binary operations with the second
+argument being C<undef>. Thus the functions that overloads C<{"++"}>
+is called with arguments C<($a,undef,'')> when $a++ is executed.
+
+=head2 Calling Conventions for Mutators
+
+Two types of mutators have different calling conventions:
+
+=over
+
+=item C<++> and C<-->
+
+The routines which implement these operators are expected to actually
+I<mutate> their arguments. So, assuming that $obj is a reference to a
+number,
+
+ sub incr { my $n = $ {$_[0]}; ++$n; $_[0] = bless \$n}
+
+is an appropriate implementation of overloaded C<++>. Note that
+
+ sub incr { ++$ {$_[0]} ; shift }
+
+is OK if used with preincrement and with postincrement. (In the case
+of postincrement a copying will be performed, see L<Copy Constructor>.)
+
+=item C<x=> and other assignment versions
+
+There is nothing special about these methods. They may change the
+value of their arguments, and may leave it as is. The result is going
+to be assigned to the value in the left-hand-side if different from
+this value.
+
+This allows for the same method to be used as overloaded C<+=> and
+C<+>. Note that this is I<allowed>, but not recommended, since by the
+semantic of L<"Fallback"> Perl will call the method for C<+> anyway,
+if C<+=> is not overloaded.
+
+=back
+
+B<Warning.> Due to the presence of assignment versions of operations,
+routines which may be called in assignment context may create
+self-referential structures. Currently Perl will not free self-referential
+structures until cycles are C<explicitly> broken. You may get problems
+when traversing your structures too.
+
+Say,
+
+ use overload '+' => sub { bless [ \$_[0], \$_[1] ] };
+
+is asking for trouble, since for code C<$obj += $foo> the subroutine
+is called as C<$obj = add($obj, $foo, undef)>, or C<$obj = [\$obj,
+\$foo]>. If using such a subroutine is an important optimization, one
+can overload C<+=> explicitly by a non-"optimized" version, or switch
+to non-optimized version if C<not defined $_[2]> (see
+L<Calling Conventions for Binary Operations>).
+
+Even if no I<explicit> assignment-variants of operators are present in
+the script, they may be generated by the optimizer. Say, C<",$obj,"> or
+C<',' . $obj . ','> may be both optimized to
+
+ my $tmp = ',' . $obj; $tmp .= ',';
+
+=head2 Overloadable Operations
+
+The following symbols can be specified in C<use overload> directive:
+
+=over 5
+
+=item * I<Arithmetic operations>
+
+ "+", "+=", "-", "-=", "*", "*=", "/", "/=", "%", "%=",
+ "**", "**=", "<<", "<<=", ">>", ">>=", "x", "x=", ".", ".=",
+
+For these operations a substituted non-assignment variant can be called if
+the assignment variant is not available. Methods for operations C<+>,
+C<->, C<+=>, and C<-=> can be called to automatically generate
+increment and decrement methods. The operation C<-> can be used to
+autogenerate missing methods for unary minus or C<abs>.
+
+See L<"MAGIC AUTOGENERATION">, L<"Calling Conventions for Mutators"> and
+L<"Calling Conventions for Binary Operations">) for details of these
+substitutions.
+
+=item * I<Comparison operations>
+
+ "<", "<=", ">", ">=", "==", "!=", "<=>",
+ "lt", "le", "gt", "ge", "eq", "ne", "cmp",
+
+If the corresponding "spaceship" variant is available, it can be
+used to substitute for the missing operation. During C<sort>ing
+arrays, C<cmp> is used to compare values subject to C<use overload>.
+
+=item * I<Bit operations>
+
+ "&", "&=", "^", "^=", "|", "|=", "neg", "!", "~",
+
+C<neg> stands for unary minus. If the method for C<neg> is not
+specified, it can be autogenerated using the method for
+subtraction. If the method for C<!> is not specified, it can be
+autogenerated using the methods for C<bool>, or C<"">, or C<0+>.
+
+The same remarks in L<"Arithmetic operations"> about
+assignment-variants and autogeneration apply for
+bit operations C<"&">, C<"^">, and C<"|"> as well.
+
+=item * I<Increment and decrement>
+
+ "++", "--",
+
+If undefined, addition and subtraction methods can be
+used instead. These operations are called both in prefix and
+postfix form.
+
+=item * I<Transcendental functions>
+
+ "atan2", "cos", "sin", "exp", "abs", "log", "sqrt", "int"
+
+If C<abs> is unavailable, it can be autogenerated using methods
+for "E<lt>" or "E<lt>=E<gt>" combined with either unary minus or subtraction.
+
+Note that traditionally the Perl function L<int> rounds to 0, thus for
+floating-point-like types one should follow the same semantic. If
+C<int> is unavailable, it can be autogenerated using the overloading of
+C<0+>.
+
+=item * I<Boolean, string and numeric conversion>
+
+ 'bool', '""', '0+',
+
+If one or two of these operations are not overloaded, the remaining ones can
+be used instead. C<bool> is used in the flow control operators
+(like C<while>) and for the ternary C<?:> operation. These functions can
+return any arbitrary Perl value. If the corresponding operation for this value
+is overloaded too, that operation will be called again with this value.
+
+As a special case if the overload returns the object itself then it will
+be used directly. An overloaded conversion returning the object is
+probably a bug, because you're likely to get something that looks like
+C<YourPackage=HASH(0x8172b34)>.
+
+=item * I<Iteration>
+
+ "<>"
+
+If not overloaded, the argument will be converted to a filehandle or
+glob (which may require a stringification). The same overloading
+happens both for the I<read-filehandle> syntax C<E<lt>$varE<gt>> and
+I<globbing> syntax C<E<lt>${var}E<gt>>.
+
+B<BUGS> Even in list context, the iterator is currently called only
+once and with scalar context.
+
+=item * I<Matching>
+
+The key C<"~~"> allows you to override the smart matching logic used by
+the C<~~> operator and the switch construct (C<given>/C<when>). See
+L<perlsyn/switch> and L<feature>.
+
+Unusually, overloading of the smart match operator does not automatically
+take precedence over normal smart match behaviour. In particular, in the
+following code:
+
+ package Foo;
+ use overload '~~' => 'match';
+
+ my $obj = Foo->new();
+ $obj ~~ [ 1,2,3 ];
+
+the smart match does I<not> invoke the method call like this:
+
+ $obj->match([1,2,3],0);
+
+rather, the smart match distributive rule takes precedence, so $obj is
+smart matched against each array element in turn until a match is found,
+so you may see between one and three of these calls instead:
+
+ $obj->match(1,0);
+ $obj->match(2,0);
+ $obj->match(3,0);
+
+Consult the match table in L<perlsyn/"Smart matching in detail"> for
+details of when overloading is invoked.
+
+=item * I<Dereferencing>
+
+ '${}', '@{}', '%{}', '&{}', '*{}'.
+
+If not overloaded, the argument will be dereferenced I<as is>, thus
+should be of correct type. These functions should return a reference
+of correct type, or another object with overloaded dereferencing.
+
+As a special case if the overload returns the object itself then it
+will be used directly (provided it is the correct type).
+
+The dereference operators must be specified explicitly they will not be passed to
+"nomethod".
+
+=item * I<Special>
+
+ "nomethod", "fallback", "=".
+
+see L<SPECIAL SYMBOLS FOR C<use overload>>.
+
+=back
+
+See L<"Fallback"> for an explanation of when a missing method can be
+autogenerated.
+
+A computer-readable form of the above table is available in the hash
+%overload::ops, with values being space-separated lists of names:
+
+ with_assign => '+ - * / % ** << >> x .',
+ assign => '+= -= *= /= %= **= <<= >>= x= .=',
+ num_comparison => '< <= > >= == !=',
+ '3way_comparison'=> '<=> cmp',
+ str_comparison => 'lt le gt ge eq ne',
+ binary => '& &= | |= ^ ^=',
+ unary => 'neg ! ~',
+ mutators => '++ --',
+ func => 'atan2 cos sin exp abs log sqrt',
+ conversion => 'bool "" 0+',
+ iterators => '<>',
+ dereferencing => '${} @{} %{} &{} *{}',
+ matching => '~~',
+ special => 'nomethod fallback ='
+
+=head2 Inheritance and overloading
+
+Inheritance interacts with overloading in two ways.
+
+=over
+
+=item Strings as values of C<use overload> directive
+
+If C<value> in
+
+ use overload key => value;
+
+is a string, it is interpreted as a method name.
+
+=item Overloading of an operation is inherited by derived classes
+
+Any class derived from an overloaded class is also overloaded. The
+set of overloaded methods is the union of overloaded methods of all
+the ancestors. If some method is overloaded in several ancestor, then
+which description will be used is decided by the usual inheritance
+rules:
+
+If C<A> inherits from C<B> and C<C> (in this order), C<B> overloads
+C<+> with C<\&D::plus_sub>, and C<C> overloads C<+> by C<"plus_meth">,
+then the subroutine C<D::plus_sub> will be called to implement
+operation C<+> for an object in package C<A>.
+
+=back
+
+Note that since the value of the C<fallback> key is not a subroutine,
+its inheritance is not governed by the above rules. In the current
+implementation, the value of C<fallback> in the first overloaded
+ancestor is used, but this is accidental and subject to change.
+
+=head1 SPECIAL SYMBOLS FOR C<use overload>
+
+Three keys are recognized by Perl that are not covered by the above
+description.
+
+=head2 Last Resort
+
+C<"nomethod"> should be followed by a reference to a function of four
+parameters. If defined, it is called when the overloading mechanism
+cannot find a method for some operation. The first three arguments of
+this function coincide with the arguments for the corresponding method if
+it were found, the fourth argument is the symbol
+corresponding to the missing method. If several methods are tried,
+the last one is used. Say, C<1-$a> can be equivalent to
+
+ &nomethodMethod($a,1,1,"-")
+
+if the pair C<"nomethod" =E<gt> "nomethodMethod"> was specified in the
+C<use overload> directive.
+
+The C<"nomethod"> mechanism is I<not> used for the dereference operators
+( ${} @{} %{} &{} *{} ).
+
+
+If some operation cannot be resolved, and there is no function
+assigned to C<"nomethod">, then an exception will be raised via die()--
+unless C<"fallback"> was specified as a key in C<use overload> directive.
+
+
+=head2 Fallback
+
+The key C<"fallback"> governs what to do if a method for a particular
+operation is not found. Three different cases are possible depending on
+the value of C<"fallback">:
+
+=over 16
+
+=item * C<undef>
+
+Perl tries to use a
+substituted method (see L<MAGIC AUTOGENERATION>). If this fails, it
+then tries to calls C<"nomethod"> value; if missing, an exception
+will be raised.
+
+=item * TRUE
+
+The same as for the C<undef> value, but no exception is raised. Instead,
+it silently reverts to what it would have done were there no C<use overload>
+present.
+
+=item * defined, but FALSE
+
+No autogeneration is tried. Perl tries to call
+C<"nomethod"> value, and if this is missing, raises an exception.
+
+=back
+
+B<Note.> C<"fallback"> inheritance via @ISA is not carved in stone
+yet, see L<"Inheritance and overloading">.
+
+=head2 Copy Constructor
+
+The value for C<"="> is a reference to a function with three
+arguments, i.e., it looks like the other values in C<use
+overload>. However, it does not overload the Perl assignment
+operator. This would go against Camel hair.
+
+This operation is called in the situations when a mutator is applied
+to a reference that shares its object with some other reference, such
+as
+
+ $a=$b;
+ ++$a;
+
+To make this change $a and not change $b, a copy of C<$$a> is made,
+and $a is assigned a reference to this new object. This operation is
+done during execution of the C<++$a>, and not during the assignment,
+(so before the increment C<$$a> coincides with C<$$b>). This is only
+done if C<++> is expressed via a method for C<'++'> or C<'+='> (or
+C<nomethod>). Note that if this operation is expressed via C<'+'>
+a nonmutator, i.e., as in
+
+ $a=$b;
+ $a=$a+1;
+
+then C<$a> does not reference a new copy of C<$$a>, since $$a does not
+appear as lvalue when the above code is executed.
+
+If the copy constructor is required during the execution of some mutator,
+but a method for C<'='> was not specified, it can be autogenerated as a
+string copy if the object is a plain scalar or a simple assignment if it
+is not.
+
+=over 5
+
+=item B<Example>
+
+The actually executed code for
+
+ $a=$b;
+ Something else which does not modify $a or $b....
+ ++$a;
+
+may be
+
+ $a=$b;
+ Something else which does not modify $a or $b....
+ $a = $a->clone(undef,"");
+ $a->incr(undef,"");
+
+if $b was mathemagical, and C<'++'> was overloaded with C<\&incr>,
+C<'='> was overloaded with C<\&clone>.
+
+=back
+
+Same behaviour is triggered by C<$b = $a++>, which is consider a synonym for
+C<$b = $a; ++$a>.
+
+=head1 MAGIC AUTOGENERATION
+
+If a method for an operation is not found, and the value for C<"fallback"> is
+TRUE or undefined, Perl tries to autogenerate a substitute method for
+the missing operation based on the defined operations. Autogenerated method
+substitutions are possible for the following operations:
+
+=over 16
+
+=item I<Assignment forms of arithmetic operations>
+
+C<$a+=$b> can use the method for C<"+"> if the method for C<"+=">
+is not defined.
+
+=item I<Conversion operations>
+
+String, numeric, and boolean conversion are calculated in terms of one
+another if not all of them are defined.
+
+=item I<Increment and decrement>
+
+The C<++$a> operation can be expressed in terms of C<$a+=1> or C<$a+1>,
+and C<$a--> in terms of C<$a-=1> and C<$a-1>.
+
+=item C<abs($a)>
+
+can be expressed in terms of C<$aE<lt>0> and C<-$a> (or C<0-$a>).
+
+=item I<Unary minus>
+
+can be expressed in terms of subtraction.
+
+=item I<Negation>
+
+C<!> and C<not> can be expressed in terms of boolean conversion, or
+string or numerical conversion.
+
+=item I<Concatenation>
+
+can be expressed in terms of string conversion.
+
+=item I<Comparison operations>
+
+can be expressed in terms of its "spaceship" counterpart: either
+C<E<lt>=E<gt>> or C<cmp>:
+
+ <, >, <=, >=, ==, != in terms of <=>
+ lt, gt, le, ge, eq, ne in terms of cmp
+
+=item I<Iterator>
+
+ <> in terms of builtin operations
+
+=item I<Dereferencing>
+
+ ${} @{} %{} &{} *{} in terms of builtin operations
+
+=item I<Copy operator>
+
+can be expressed in terms of an assignment to the dereferenced value, if this
+value is a scalar and not a reference, or simply a reference assignment
+otherwise.
+
+=back
+
+=head1 Minimal set of overloaded operations
+
+Since some operations can be automatically generated from others, there is
+a minimal set of operations that need to be overloaded in order to have
+the complete set of overloaded operations at one's disposal.
+Of course, the autogenerated operations may not do exactly what the user
+expects. See L<MAGIC AUTOGENERATION> above. The minimal set is:
+
+ + - * / % ** << >> x
+ <=> cmp
+ & | ^ ~
+ atan2 cos sin exp log sqrt int
+
+Additionally, you need to define at least one of string, boolean or
+numeric conversions because any one can be used to emulate the others.
+The string conversion can also be used to emulate concatenation.
+
+=head1 Losing overloading
+
+The restriction for the comparison operation is that even if, for example,
+`C<cmp>' should return a blessed reference, the autogenerated `C<lt>'
+function will produce only a standard logical value based on the
+numerical value of the result of `C<cmp>'. In particular, a working
+numeric conversion is needed in this case (possibly expressed in terms of
+other conversions).
+
+Similarly, C<.=> and C<x=> operators lose their mathemagical properties
+if the string conversion substitution is applied.
+
+When you chop() a mathemagical object it is promoted to a string and its
+mathemagical properties are lost. The same can happen with other
+operations as well.
+
+=head1 Run-time Overloading
+
+Since all C<use> directives are executed at compile-time, the only way to
+change overloading during run-time is to
+
+ eval 'use overload "+" => \&addmethod';
+
+You can also use
+
+ eval 'no overload "+", "--", "<="';
+
+though the use of these constructs during run-time is questionable.
+
+=head1 Public functions
+
+Package C<overload.pm> provides the following public functions:
+
+=over 5
+
+=item overload::StrVal(arg)
+
+Gives string value of C<arg> as in absence of stringify overloading. If you
+are using this to get the address of a reference (useful for checking if two
+references point to the same thing) then you may be better off using
+C<Scalar::Util::refaddr()>, which is faster.
+
+=item overload::Overloaded(arg)
+
+Returns true if C<arg> is subject to overloading of some operations.
+
+=item overload::Method(obj,op)
+
+Returns C<undef> or a reference to the method that implements C<op>.
+
+=back
+
+=head1 Overloading constants
+
+For some applications, the Perl parser mangles constants too much.
+It is possible to hook into this process via C<overload::constant()>
+and C<overload::remove_constant()> functions.
+
+These functions take a hash as an argument. The recognized keys of this hash
+are:
+
+=over 8
+
+=item integer
+
+to overload integer constants,
+
+=item float
+
+to overload floating point constants,
+
+=item binary
+
+to overload octal and hexadecimal constants,
+
+=item q
+
+to overload C<q>-quoted strings, constant pieces of C<qq>- and C<qx>-quoted
+strings and here-documents,
+
+=item qr
+
+to overload constant pieces of regular expressions.
+
+=back
+
+The corresponding values are references to functions which take three arguments:
+the first one is the I<initial> string form of the constant, the second one
+is how Perl interprets this constant, the third one is how the constant is used.
+Note that the initial string form does not
+contain string delimiters, and has backslashes in backslash-delimiter
+combinations stripped (thus the value of delimiter is not relevant for
+processing of this string). The return value of this function is how this
+constant is going to be interpreted by Perl. The third argument is undefined
+unless for overloaded C<q>- and C<qr>- constants, it is C<q> in single-quote
+context (comes from strings, regular expressions, and single-quote HERE
+documents), it is C<tr> for arguments of C<tr>/C<y> operators,
+it is C<s> for right-hand side of C<s>-operator, and it is C<qq> otherwise.
+
+Since an expression C<"ab$cd,,"> is just a shortcut for C<'ab' . $cd . ',,'>,
+it is expected that overloaded constant strings are equipped with reasonable
+overloaded catenation operator, otherwise absurd results will result.
+Similarly, negative numbers are considered as negations of positive constants.
+
+Note that it is probably meaningless to call the functions overload::constant()
+and overload::remove_constant() from anywhere but import() and unimport() methods.
+From these methods they may be called as
+
+ sub import {
+ shift;
+ return unless @_;
+ die "unknown import: @_" unless @_ == 1 and $_[0] eq ':constant';
+ overload::constant integer => sub {Math::BigInt->new(shift)};
+ }
+
+=head1 IMPLEMENTATION
+
+What follows is subject to change RSN.
+
+The table of methods for all operations is cached in magic for the
+symbol table hash for the package. The cache is invalidated during
+processing of C<use overload>, C<no overload>, new function
+definitions, and changes in @ISA. However, this invalidation remains
+unprocessed until the next C<bless>ing into the package. Hence if you
+want to change overloading structure dynamically, you'll need an
+additional (fake) C<bless>ing to update the table.
+
+(Every SVish thing has a magic queue, and magic is an entry in that
+queue. This is how a single variable may participate in multiple
+forms of magic simultaneously. For instance, environment variables
+regularly have two forms at once: their %ENV magic and their taint
+magic. However, the magic which implements overloading is applied to
+the stashes, which are rarely used directly, thus should not slow down
+Perl.)
+
+If an object belongs to a package using overload, it carries a special
+flag. Thus the only speed penalty during arithmetic operations without
+overloading is the checking of this flag.
+
+In fact, if C<use overload> is not present, there is almost no overhead
+for overloadable operations, so most programs should not suffer
+measurable performance penalties. A considerable effort was made to
+minimize the overhead when overload is used in some package, but the
+arguments in question do not belong to packages using overload. When
+in doubt, test your speed with C<use overload> and without it. So far
+there have been no reports of substantial speed degradation if Perl is
+compiled with optimization turned on.
+
+There is no size penalty for data if overload is not used. The only
+size penalty if overload is used in some package is that I<all> the
+packages acquire a magic during the next C<bless>ing into the
+package. This magic is three-words-long for packages without
+overloading, and carries the cache table if the package is overloaded.
+
+Copying (C<$a=$b>) is shallow; however, a one-level-deep copying is
+carried out before any operation that can imply an assignment to the
+object $a (or $b) refers to, like C<$a++>. You can override this
+behavior by defining your own copy constructor (see L<"Copy Constructor">).
+
+It is expected that arguments to methods that are not explicitly supposed
+to be changed are constant (but this is not enforced).
+
+=head1 Metaphor clash
+
+One may wonder why the semantic of overloaded C<=> is so counter intuitive.
+If it I<looks> counter intuitive to you, you are subject to a metaphor
+clash.
+
+Here is a Perl object metaphor:
+
+I< object is a reference to blessed data>
+
+and an arithmetic metaphor:
+
+I< object is a thing by itself>.
+
+The I<main> problem of overloading C<=> is the fact that these metaphors
+imply different actions on the assignment C<$a = $b> if $a and $b are
+objects. Perl-think implies that $a becomes a reference to whatever
+$b was referencing. Arithmetic-think implies that the value of "object"
+$a is changed to become the value of the object $b, preserving the fact
+that $a and $b are separate entities.
+
+The difference is not relevant in the absence of mutators. After
+a Perl-way assignment an operation which mutates the data referenced by $a
+would change the data referenced by $b too. Effectively, after
+C<$a = $b> values of $a and $b become I<indistinguishable>.
+
+On the other hand, anyone who has used algebraic notation knows the
+expressive power of the arithmetic metaphor. Overloading works hard
+to enable this metaphor while preserving the Perlian way as far as
+possible. Since it is not possible to freely mix two contradicting
+metaphors, overloading allows the arithmetic way to write things I<as
+far as all the mutators are called via overloaded access only>. The
+way it is done is described in L<Copy Constructor>.
+
+If some mutator methods are directly applied to the overloaded values,
+one may need to I<explicitly unlink> other values which references the
+same value:
+
+ $a = Data->new(23);
+ ...
+ $b = $a; # $b is "linked" to $a
+ ...
+ $a = $a->clone; # Unlink $b from $a
+ $a->increment_by(4);
+
+Note that overloaded access makes this transparent:
+
+ $a = Data->new(23);
+ $b = $a; # $b is "linked" to $a
+ $a += 4; # would unlink $b automagically
+
+However, it would not make
+
+ $a = Data->new(23);
+ $a = 4; # Now $a is a plain 4, not 'Data'
+
+preserve "objectness" of $a. But Perl I<has> a way to make assignments
+to an object do whatever you want. It is just not the overload, but
+tie()ing interface (see L<perlfunc/tie>). Adding a FETCH() method
+which returns the object itself, and STORE() method which changes the
+value of the object, one can reproduce the arithmetic metaphor in its
+completeness, at least for variables which were tie()d from the start.
+
+(Note that a workaround for a bug may be needed, see L<"BUGS">.)
+
+=head1 Cookbook
+
+Please add examples to what follows!
+
+=head2 Two-face scalars
+
+Put this in F<two_face.pm> in your Perl library directory:
+
+ package two_face; # Scalars with separate string and
+ # numeric values.
+ sub new { my $p = shift; bless [@_], $p }
+ use overload '""' => \&str, '0+' => \&num, fallback => 1;
+ sub num {shift->[1]}
+ sub str {shift->[0]}
+
+Use it as follows:
+
+ require two_face;
+ my $seven = two_face->new("vii", 7);
+ printf "seven=$seven, seven=%d, eight=%d\n", $seven, $seven+1;
+ print "seven contains `i'\n" if $seven =~ /i/;
+
+(The second line creates a scalar which has both a string value, and a
+numeric value.) This prints:
+
+ seven=vii, seven=7, eight=8
+ seven contains `i'
+
+=head2 Two-face references
+
+Suppose you want to create an object which is accessible as both an
+array reference and a hash reference.
+
+ package two_refs;
+ use overload '%{}' => \&gethash, '@{}' => sub { $ {shift()} };
+ sub new {
+ my $p = shift;
+ bless \ [@_], $p;
+ }
+ sub gethash {
+ my %h;
+ my $self = shift;
+ tie %h, ref $self, $self;
+ \%h;
+ }
+
+ sub TIEHASH { my $p = shift; bless \ shift, $p }
+ my %fields;
+ my $i = 0;
+ $fields{$_} = $i++ foreach qw{zero one two three};
+ sub STORE {
+ my $self = ${shift()};
+ my $key = $fields{shift()};
+ defined $key or die "Out of band access";
+ $$self->[$key] = shift;
+ }
+ sub FETCH {
+ my $self = ${shift()};
+ my $key = $fields{shift()};
+ defined $key or die "Out of band access";
+ $$self->[$key];
+ }
+
+Now one can access an object using both the array and hash syntax:
+
+ my $bar = two_refs->new(3,4,5,6);
+ $bar->[2] = 11;
+ $bar->{two} == 11 or die 'bad hash fetch';
+
+Note several important features of this example. First of all, the
+I<actual> type of $bar is a scalar reference, and we do not overload
+the scalar dereference. Thus we can get the I<actual> non-overloaded
+contents of $bar by just using C<$$bar> (what we do in functions which
+overload dereference). Similarly, the object returned by the
+TIEHASH() method is a scalar reference.
+
+Second, we create a new tied hash each time the hash syntax is used.
+This allows us not to worry about a possibility of a reference loop,
+which would lead to a memory leak.
+
+Both these problems can be cured. Say, if we want to overload hash
+dereference on a reference to an object which is I<implemented> as a
+hash itself, the only problem one has to circumvent is how to access
+this I<actual> hash (as opposed to the I<virtual> hash exhibited by the
+overloaded dereference operator). Here is one possible fetching routine:
+
+ sub access_hash {
+ my ($self, $key) = (shift, shift);
+ my $class = ref $self;
+ bless $self, 'overload::dummy'; # Disable overloading of %{}
+ my $out = $self->{$key};
+ bless $self, $class; # Restore overloading
+ $out;
+ }
+
+To remove creation of the tied hash on each access, one may an extra
+level of indirection which allows a non-circular structure of references:
+
+ package two_refs1;
+ use overload '%{}' => sub { ${shift()}->[1] },
+ '@{}' => sub { ${shift()}->[0] };
+ sub new {
+ my $p = shift;
+ my $a = [@_];
+ my %h;
+ tie %h, $p, $a;
+ bless \ [$a, \%h], $p;
+ }
+ sub gethash {
+ my %h;
+ my $self = shift;
+ tie %h, ref $self, $self;
+ \%h;
+ }
+
+ sub TIEHASH { my $p = shift; bless \ shift, $p }
+ my %fields;
+ my $i = 0;
+ $fields{$_} = $i++ foreach qw{zero one two three};
+ sub STORE {
+ my $a = ${shift()};
+ my $key = $fields{shift()};
+ defined $key or die "Out of band access";
+ $a->[$key] = shift;
+ }
+ sub FETCH {
+ my $a = ${shift()};
+ my $key = $fields{shift()};
+ defined $key or die "Out of band access";
+ $a->[$key];
+ }
+
+Now if $baz is overloaded like this, then C<$baz> is a reference to a
+reference to the intermediate array, which keeps a reference to an
+actual array, and the access hash. The tie()ing object for the access
+hash is a reference to a reference to the actual array, so
+
+=over
+
+=item *
+
+There are no loops of references.
+
+=item *
+
+Both "objects" which are blessed into the class C<two_refs1> are
+references to a reference to an array, thus references to a I<scalar>.
+Thus the accessor expression C<$$foo-E<gt>[$ind]> involves no
+overloaded operations.
+
+=back
+
+=head2 Symbolic calculator
+
+Put this in F<symbolic.pm> in your Perl library directory:
+
+ package symbolic; # Primitive symbolic calculator
+ use overload nomethod => \&wrap;
+
+ sub new { shift; bless ['n', @_] }
+ sub wrap {
+ my ($obj, $other, $inv, $meth) = @_;
+ ($obj, $other) = ($other, $obj) if $inv;
+ bless [$meth, $obj, $other];
+ }
+
+This module is very unusual as overloaded modules go: it does not
+provide any usual overloaded operators, instead it provides the L<Last
+Resort> operator C<nomethod>. In this example the corresponding
+subroutine returns an object which encapsulates operations done over
+the objects: C<< symbolic->new(3) >> contains C<['n', 3]>, C<< 2 +
+symbolic->new(3) >> contains C<['+', 2, ['n', 3]]>.
+
+Here is an example of the script which "calculates" the side of
+circumscribed octagon using the above package:
+
+ require symbolic;
+ my $iter = 1; # 2**($iter+2) = 8
+ my $side = symbolic->new(1);
+ my $cnt = $iter;
+
+ while ($cnt--) {
+ $side = (sqrt(1 + $side**2) - 1)/$side;
+ }
+ print "OK\n";
+
+The value of $side is
+
+ ['/', ['-', ['sqrt', ['+', 1, ['**', ['n', 1], 2]],
+ undef], 1], ['n', 1]]
+
+Note that while we obtained this value using a nice little script,
+there is no simple way to I<use> this value. In fact this value may
+be inspected in debugger (see L<perldebug>), but only if
+C<bareStringify> B<O>ption is set, and not via C<p> command.
+
+If one attempts to print this value, then the overloaded operator
+C<""> will be called, which will call C<nomethod> operator. The
+result of this operator will be stringified again, but this result is
+again of type C<symbolic>, which will lead to an infinite loop.
+
+Add a pretty-printer method to the module F<symbolic.pm>:
+
+ sub pretty {
+ my ($meth, $a, $b) = @{+shift};
+ $a = 'u' unless defined $a;
+ $b = 'u' unless defined $b;
+ $a = $a->pretty if ref $a;
+ $b = $b->pretty if ref $b;
+ "[$meth $a $b]";
+ }
+
+Now one can finish the script by
+
+ print "side = ", $side->pretty, "\n";
+
+The method C<pretty> is doing object-to-string conversion, so it
+is natural to overload the operator C<""> using this method. However,
+inside such a method it is not necessary to pretty-print the
+I<components> $a and $b of an object. In the above subroutine
+C<"[$meth $a $b]"> is a catenation of some strings and components $a
+and $b. If these components use overloading, the catenation operator
+will look for an overloaded operator C<.>; if not present, it will
+look for an overloaded operator C<"">. Thus it is enough to use
+
+ use overload nomethod => \&wrap, '""' => \&str;
+ sub str {
+ my ($meth, $a, $b) = @{+shift};
+ $a = 'u' unless defined $a;
+ $b = 'u' unless defined $b;
+ "[$meth $a $b]";
+ }
+
+Now one can change the last line of the script to
+
+ print "side = $side\n";
+
+which outputs
+
+ side = [/ [- [sqrt [+ 1 [** [n 1 u] 2]] u] 1] [n 1 u]]
+
+and one can inspect the value in debugger using all the possible
+methods.
+
+Something is still amiss: consider the loop variable $cnt of the
+script. It was a number, not an object. We cannot make this value of
+type C<symbolic>, since then the loop will not terminate.
+
+Indeed, to terminate the cycle, the $cnt should become false.
+However, the operator C<bool> for checking falsity is overloaded (this
+time via overloaded C<"">), and returns a long string, thus any object
+of type C<symbolic> is true. To overcome this, we need a way to
+compare an object to 0. In fact, it is easier to write a numeric
+conversion routine.
+
+Here is the text of F<symbolic.pm> with such a routine added (and
+slightly modified str()):
+
+ package symbolic; # Primitive symbolic calculator
+ use overload
+ nomethod => \&wrap, '""' => \&str, '0+' => \&num;
+
+ sub new { shift; bless ['n', @_] }
+ sub wrap {
+ my ($obj, $other, $inv, $meth) = @_;
+ ($obj, $other) = ($other, $obj) if $inv;
+ bless [$meth, $obj, $other];
+ }
+ sub str {
+ my ($meth, $a, $b) = @{+shift};
+ $a = 'u' unless defined $a;
+ if (defined $b) {
+ "[$meth $a $b]";
+ } else {
+ "[$meth $a]";
+ }
+ }
+ my %subr = ( n => sub {$_[0]},
+ sqrt => sub {sqrt $_[0]},
+ '-' => sub {shift() - shift()},
+ '+' => sub {shift() + shift()},
+ '/' => sub {shift() / shift()},
+ '*' => sub {shift() * shift()},
+ '**' => sub {shift() ** shift()},
+ );
+ sub num {
+ my ($meth, $a, $b) = @{+shift};
+ my $subr = $subr{$meth}
+ or die "Do not know how to ($meth) in symbolic";
+ $a = $a->num if ref $a eq __PACKAGE__;
+ $b = $b->num if ref $b eq __PACKAGE__;
+ $subr->($a,$b);
+ }
+
+All the work of numeric conversion is done in %subr and num(). Of
+course, %subr is not complete, it contains only operators used in the
+example below. Here is the extra-credit question: why do we need an
+explicit recursion in num()? (Answer is at the end of this section.)
+
+Use this module like this:
+
+ require symbolic;
+ my $iter = symbolic->new(2); # 16-gon
+ my $side = symbolic->new(1);
+ my $cnt = $iter;
+
+ while ($cnt) {
+ $cnt = $cnt - 1; # Mutator `--' not implemented
+ $side = (sqrt(1 + $side**2) - 1)/$side;
+ }
+ printf "%s=%f\n", $side, $side;
+ printf "pi=%f\n", $side*(2**($iter+2));
+
+It prints (without so many line breaks)
+
+ [/ [- [sqrt [+ 1 [** [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1]
+ [n 1]] 2]]] 1]
+ [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1] [n 1]]]=0.198912
+ pi=3.182598
+
+The above module is very primitive. It does not implement
+mutator methods (C<++>, C<-=> and so on), does not do deep copying
+(not required without mutators!), and implements only those arithmetic
+operations which are used in the example.
+
+To implement most arithmetic operations is easy; one should just use
+the tables of operations, and change the code which fills %subr to
+
+ my %subr = ( 'n' => sub {$_[0]} );
+ foreach my $op (split " ", $overload::ops{with_assign}) {
+ $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}";
+ }
+ my @bins = qw(binary 3way_comparison num_comparison str_comparison);
+ foreach my $op (split " ", "@overload::ops{ @bins }") {
+ $subr{$op} = eval "sub {shift() $op shift()}";
+ }
+ foreach my $op (split " ", "@overload::ops{qw(unary func)}") {
+ print "defining `$op'\n";
+ $subr{$op} = eval "sub {$op shift()}";
+ }
+
+Due to L<Calling Conventions for Mutators>, we do not need anything
+special to make C<+=> and friends work, except filling C<+=> entry of
+%subr, and defining a copy constructor (needed since Perl has no
+way to know that the implementation of C<'+='> does not mutate
+the argument, compare L<Copy Constructor>).
+
+To implement a copy constructor, add C<< '=' => \&cpy >> to C<use overload>
+line, and code (this code assumes that mutators change things one level
+deep only, so recursive copying is not needed):
+
+ sub cpy {
+ my $self = shift;
+ bless [@$self], ref $self;
+ }
+
+To make C<++> and C<--> work, we need to implement actual mutators,
+either directly, or in C<nomethod>. We continue to do things inside
+C<nomethod>, thus add
+
+ if ($meth eq '++' or $meth eq '--') {
+ @$obj = ($meth, (bless [@$obj]), 1); # Avoid circular reference
+ return $obj;
+ }
+
+after the first line of wrap(). This is not a most effective
+implementation, one may consider
+
+ sub inc { $_[0] = bless ['++', shift, 1]; }
+
+instead.
+
+As a final remark, note that one can fill %subr by
+
+ my %subr = ( 'n' => sub {$_[0]} );
+ foreach my $op (split " ", $overload::ops{with_assign}) {
+ $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}";
+ }
+ my @bins = qw(binary 3way_comparison num_comparison str_comparison);
+ foreach my $op (split " ", "@overload::ops{ @bins }") {
+ $subr{$op} = eval "sub {shift() $op shift()}";
+ }
+ foreach my $op (split " ", "@overload::ops{qw(unary func)}") {
+ $subr{$op} = eval "sub {$op shift()}";
+ }
+ $subr{'++'} = $subr{'+'};
+ $subr{'--'} = $subr{'-'};
+
+This finishes implementation of a primitive symbolic calculator in
+50 lines of Perl code. Since the numeric values of subexpressions
+are not cached, the calculator is very slow.
+
+Here is the answer for the exercise: In the case of str(), we need no
+explicit recursion since the overloaded C<.>-operator will fall back
+to an existing overloaded operator C<"">. Overloaded arithmetic
+operators I<do not> fall back to numeric conversion if C<fallback> is
+not explicitly requested. Thus without an explicit recursion num()
+would convert C<['+', $a, $b]> to C<$a + $b>, which would just rebuild
+the argument of num().
+
+If you wonder why defaults for conversion are different for str() and
+num(), note how easy it was to write the symbolic calculator. This
+simplicity is due to an appropriate choice of defaults. One extra
+note: due to the explicit recursion num() is more fragile than sym():
+we need to explicitly check for the type of $a and $b. If components
+$a and $b happen to be of some related type, this may lead to problems.
+
+=head2 I<Really> symbolic calculator
+
+One may wonder why we call the above calculator symbolic. The reason
+is that the actual calculation of the value of expression is postponed
+until the value is I<used>.
+
+To see it in action, add a method
+
+ sub STORE {
+ my $obj = shift;
+ $#$obj = 1;
+ @$obj->[0,1] = ('=', shift);
+ }
+
+to the package C<symbolic>. After this change one can do
+
+ my $a = symbolic->new(3);
+ my $b = symbolic->new(4);
+ my $c = sqrt($a**2 + $b**2);
+
+and the numeric value of $c becomes 5. However, after calling
+
+ $a->STORE(12); $b->STORE(5);
+
+the numeric value of $c becomes 13. There is no doubt now that the module
+symbolic provides a I<symbolic> calculator indeed.
+
+To hide the rough edges under the hood, provide a tie()d interface to the
+package C<symbolic> (compare with L<Metaphor clash>). Add methods
+
+ sub TIESCALAR { my $pack = shift; $pack->new(@_) }
+ sub FETCH { shift }
+ sub nop { } # Around a bug
+
+(the bug is described in L<"BUGS">). One can use this new interface as
+
+ tie $a, 'symbolic', 3;
+ tie $b, 'symbolic', 4;
+ $a->nop; $b->nop; # Around a bug
+
+ my $c = sqrt($a**2 + $b**2);
+
+Now numeric value of $c is 5. After C<$a = 12; $b = 5> the numeric value
+of $c becomes 13. To insulate the user of the module add a method
+
+ sub vars { my $p = shift; tie($_, $p), $_->nop foreach @_; }
+
+Now
+
+ my ($a, $b);
+ symbolic->vars($a, $b);
+ my $c = sqrt($a**2 + $b**2);
+
+ $a = 3; $b = 4;
+ printf "c5 %s=%f\n", $c, $c;
+
+ $a = 12; $b = 5;
+ printf "c13 %s=%f\n", $c, $c;
+
+shows that the numeric value of $c follows changes to the values of $a
+and $b.
+
+=head1 AUTHOR
+
+Ilya Zakharevich E<lt>F<ilya@math.mps.ohio-state.edu>E<gt>.
+
+=head1 SEE ALSO
+
+The L<overloading> pragma can be used to enable or disable overloaded
+operations within a lexical scope.
+
+=head1 DIAGNOSTICS
+
+When Perl is run with the B<-Do> switch or its equivalent, overloading
+induces diagnostic messages.
+
+Using the C<m> command of Perl debugger (see L<perldebug>) one can
+deduce which operations are overloaded (and which ancestor triggers
+this overloading). Say, if C<eq> is overloaded, then the method C<(eq>
+is shown by debugger. The method C<()> corresponds to the C<fallback>
+key (in fact a presence of this method shows that this package has
+overloading enabled, and it is what is used by the C<Overloaded>
+function of module C<overload>).
+
+The module might issue the following warnings:
+
+=over 4
+
+=item Odd number of arguments for overload::constant
+
+(W) The call to overload::constant contained an odd number of arguments.
+The arguments should come in pairs.
+
+=item `%s' is not an overloadable type
+
+(W) You tried to overload a constant type the overload package is unaware of.
+
+=item `%s' is not a code reference
+
+(W) The second (fourth, sixth, ...) argument of overload::constant needs
+to be a code reference. Either an anonymous subroutine, or a reference
+to a subroutine.
+
+=back
+
+=head1 BUGS
+
+Because it is used for overloading, the per-package hash %OVERLOAD now
+has a special meaning in Perl. The symbol table is filled with names
+looking like line-noise.
+
+For the purpose of inheritance every overloaded package behaves as if
+C<fallback> is present (possibly undefined). This may create
+interesting effects if some package is not overloaded, but inherits
+from two overloaded packages.
+
+Relation between overloading and tie()ing is broken. Overloading is
+triggered or not basing on the I<previous> class of tie()d value.
+
+This happens because the presence of overloading is checked too early,
+before any tie()d access is attempted. If the FETCH()ed class of the
+tie()d value does not change, a simple workaround is to access the value
+immediately after tie()ing, so that after this call the I<previous> class
+coincides with the current one.
+
+B<Needed:> a way to fix this without a speed penalty.
+
+Barewords are not covered by overloaded string constants.
+
+This document is confusing. There are grammos and misleading language
+used in places. It would seem a total rewrite is needed.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/overloading.pm b/Master/tlpkg/tlperl.straw/lib/overloading.pm
new file mode 100755
index 00000000000..d1ca5664b6c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/overloading.pm
@@ -0,0 +1,101 @@
+package overloading;
+use warnings;
+
+use Carp ();
+
+our $VERSION = '0.01';
+
+my $HINT_NO_AMAGIC = 0x01000000; # see perl.h
+
+require 5.010001;
+
+sub _ops_to_nums {
+ require overload::numbers;
+
+ map { exists $overload::numbers::names{"($_"}
+ ? $overload::numbers::names{"($_"}
+ : Carp::croak("'$_' is not a valid overload")
+ } @_;
+}
+
+sub import {
+ my ( $class, @ops ) = @_;
+
+ if ( @ops ) {
+ if ( $^H{overloading} ) {
+ vec($^H{overloading} , $_, 1) = 0 for _ops_to_nums(@ops);
+ }
+
+ if ( $^H{overloading} !~ /[^\0]/ ) {
+ delete $^H{overloading};
+ $^H &= ~$HINT_NO_AMAGIC;
+ }
+ } else {
+ delete $^H{overloading};
+ $^H &= ~$HINT_NO_AMAGIC;
+ }
+}
+
+sub unimport {
+ my ( $class, @ops ) = @_;
+
+ if ( exists $^H{overloading} or not $^H & $HINT_NO_AMAGIC ) {
+ if ( @ops ) {
+ vec($^H{overloading} ||= '', $_, 1) = 1 for _ops_to_nums(@ops);
+ } else {
+ delete $^H{overloading};
+ }
+ }
+
+ $^H |= $HINT_NO_AMAGIC;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+overloading - perl pragma to lexically control overloading
+
+=head1 SYNOPSIS
+
+ {
+ no overloading;
+ my $str = "$object"; # doesn't call stringification overload
+ }
+
+ # it's lexical, so this stringifies:
+ warn "$object";
+
+ # it can be enabled per op
+ no overloading qw("");
+ warn "$object";
+
+ # and also reenabled
+ use overloading;
+
+=head1 DESCRIPTION
+
+This pragma allows you to lexically disable or enable overloading.
+
+=over 6
+
+=item C<no overloading>
+
+Disables overloading entirely in the current lexical scope.
+
+=item C<no overloading @ops>
+
+Disables only specific overloads in the current lexical scope.
+
+=item C<use overloading>
+
+Reenables overloading in the current lexical scope.
+
+=item C<use overloading @ops>
+
+Reenables overloading only for specific ops in the current lexical scope.
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/perllocal.pod b/Master/tlpkg/tlperl.straw/lib/perllocal.pod
new file mode 100755
index 00000000000..1a2a26ef6ef
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/perllocal.pod
@@ -0,0 +1,3454 @@
+=head2 Wed Jan 27 23:39:49 2010: C<Module> L<ExtUtils::MakeMaker|ExtUtils::MakeMaker>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 6.56>
+
+=item *
+
+C<EXE_FILES: bin/instmodsh>
+
+=back
+
+=head2 Wed Jan 27 23:39:53 2010: C<Module> L<File::Path|File::Path>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.08>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:40:06 2010: C<Module> L<Test::Simple|Test::Simple>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.94>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:40:11 2010: C<Module> L<ExtUtils::CBuilder|ExtUtils::CBuilder>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.27>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:40:23 2010: C<Module> L<version|version>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.80>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:40:29 2010: C<Module> L<List::Util|List::Util>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.22>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:40:40 2010: C<Module> L<Compress::Raw::Zlib|Compress::Raw::Zlib>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.024>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:40:50 2010: C<Module> L<Compress::Raw::Bzip2|Compress::Raw::Bzip2>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.024>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:40:55 2010: C<Module> L<IO::Compress|IO::Compress>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.024>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:41:07 2010: C<Module> L<Compress::Bzip2|Compress::Bzip2>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.09>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:41:10 2010: C<Module> L<IO::Zlib|IO::Zlib>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.10>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:41:17 2010: C<Module> L<Cwd|Cwd>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 3.31>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:41:27 2010: C<Module> L<Win32::WinError|Win32::WinError>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.03>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:41:38 2010: C<Module> L<Win32API::Registry|Win32API::Registry>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.30>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:41:42 2010: C<Module> L<Win32::TieRegistry|Win32::TieRegistry>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.26>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:41:45 2010: C<Module> L<File::HomeDir|File::HomeDir>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.89>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:41:49 2010: C<Module> L<IPC::Run3|IPC::Run3>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.043>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:41:55 2010: C<Module> L<Test::Script|Test::Script>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.07>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:41:59 2010: C<Module> L<File::Which|File::Which>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.09>
+
+=item *
+
+C<EXE_FILES: script/pwhich>
+
+=back
+
+=head2 Wed Jan 27 23:42:04 2010: C<Module> L<Archive::Zip|Archive::Zip>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.30>
+
+=item *
+
+C<EXE_FILES: script/crc32>
+
+=back
+
+=head2 Wed Jan 27 23:42:08 2010: C<Module> L<IO::String|IO::String>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.08>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:42:13 2010: C<Module> L<Archive::Tar|Archive::Tar>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.54>
+
+=item *
+
+C<EXE_FILES: bin/ptar bin/ptardiff>
+
+=back
+
+=head2 Wed Jan 27 23:42:18 2010: C<Module> L<Compress::unLZMA|Compress::unLZMA>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.03>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:42:22 2010: C<Module> L<Parse::CPAN::Meta|Parse::CPAN::Meta>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.40>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:42:26 2010: C<Module> L<YAML|YAML>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.71>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:42:33 2010: C<Module> L<Digest::SHA1|Digest::SHA1>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.12>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:42:40 2010: C<Module> L<Digest::SHA|Digest::SHA>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 5.48>
+
+=item *
+
+C<EXE_FILES: shasum>
+
+=back
+
+=head2 Wed Jan 27 23:42:48 2010: C<Module> L<Term::ReadKey|Term::ReadKey>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.30.01>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:42:51 2010: C<Module> L<Term::ReadLine|Term::ReadLine>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.0303>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:42:59 2010: C<Module> L<Data::Dumper|Data::Dumper>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.125>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:43:03 2010: C<Module> L<URI|URI>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.52>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:43:07 2010: C<Module> L<HTML::Tagset|HTML::Tagset>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 3.20>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:43:13 2010: C<Module> L<HTML::Parser|HTML::Parser>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 3.64>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:43:20 2010: C<Module> L<LWP|LWP>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 5.834>
+
+=item *
+
+C<EXE_FILES: bin/lwp-request bin/lwp-mirror bin/lwp-rget bin/lwp-download bin/lwp-dump>
+
+=back
+
+=head2 Wed Jan 27 23:44:12 2010: C<Module> L<Archive::Extract|Archive::Extract>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.38>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:44:16 2010: C<Module> L<Attribute::Handlers|Attribute::Handlers>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.87>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:44:19 2010: C<Module> L<AutoLoader|AutoLoader>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 5.70>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:44:28 2010: C<Module> L<CPANPLUS|CPANPLUS>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.9001>
+
+=item *
+
+C<EXE_FILES: bin/cpan2dist bin/cpanp bin/cpanp-run-perl>
+
+=back
+
+=head2 Wed Jan 27 23:44:32 2010: C<Module> L<Class::ISA|Class::ISA>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.36>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:45:50 2010: C<Module> L<Encode|Encode>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.39>
+
+=item *
+
+C<EXE_FILES: bin/enc2xs bin/piconv>
+
+=back
+
+=head2 Wed Jan 27 23:45:54 2010: C<Module> L<IPC::Cmd|IPC::Cmd>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.54>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:45:58 2010: C<Module> L<Locale::Maketext::Simple|Locale::Maketext::Simple>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.21>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:46:02 2010: C<Module> L<Log::Message::Simple|Log::Message::Simple>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.06>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:46:07 2010: C<Module> L<MIME::Base64|MIME::Base64>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 3.09>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:46:12 2010: C<Module> L<Math::BigRat|Math::BigRat>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.24>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:46:17 2010: C<Module> L<Module::CoreList|Module::CoreList>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.25>
+
+=item *
+
+C<EXE_FILES: corelist>
+
+=back
+
+=head2 Wed Jan 27 23:46:20 2010: C<Module> L<Module::Load::Conditional|Module::Load::Conditional>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.34>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:46:24 2010: C<Module> L<Module::Loaded|Module::Loaded>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.06>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:46:28 2010: C<Module> L<Object::Accessor|Object::Accessor>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.36>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:46:32 2010: C<Module> L<Pod::Perldoc|Pod::Perldoc>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 3.15>
+
+=item *
+
+C<EXE_FILES: perldoc>
+
+=back
+
+=head2 Wed Jan 27 23:46:35 2010: C<Module> L<Pod::Plainer|Pod::Plainer>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.01>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:46:40 2010: C<Module> L<Pod::Simple|Pod::Simple>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 3.13>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:46:44 2010: C<Module> L<Safe|Safe>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.21>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:46:51 2010: C<Module> L<Storable|Storable>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.21>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:46:55 2010: C<Module> L<Switch|Switch>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.16>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:47:00 2010: C<Module> L<Text::Balanced|Text::Balanced>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.02>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:47:06 2010: C<Module> L<Time::Piece|Time::Piece>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.16>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:47:11 2010: C<Module> L<parent|parent>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.223>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:47:17 2010: C<Module> L<threads|threads>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.75>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:47:23 2010: C<Module> L<threads::shared|threads::shared>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.32>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:47:50 2010: C<Module> L<FCGI|FCGI>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.68>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:47:56 2010: C<Module> L<CGI|CGI>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 3.48>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:48:01 2010: C<Module> L<Pod|Pod>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.3.0>
+
+=item *
+
+C<EXE_FILES: scripts\pod2text scripts\pod2man>
+
+=back
+
+=head2 Wed Jan 27 23:48:05 2010: C<Module> L<Term::ANSIColor|Term::ANSIColor>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 3.00>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:48:09 2010: C<Module> L<File::Fetch|File::Fetch>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.24>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:48:13 2010: C<Module> L<CPANPLUS::Dist::Build|CPANPLUS::Dist::Build>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.46>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:48:38 2010: C<Module> L<Win32::Process|Win32::Process>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.14>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:49:00 2010: C<Module> L<IPC::System::Simple|IPC::System::Simple>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.20>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:49:12 2010: C<Module> L<CPAN|CPAN>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.94_54>
+
+=item *
+
+C<EXE_FILES: scripts/cpan>
+
+=back
+
+=head2 Wed Jan 27 23:49:16 2010: C<Module> L<LWP::Online|LWP::Online>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.07>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:49:40 2010: C<Module> L<Win32::File|Win32::File>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.06>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:50:03 2010: C<Module> L<File::Remove|File::Remove>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.42>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:50:26 2010: C<Module> L<Win32::File::Object|Win32::File::Object>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.02>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:50:54 2010: C<Module> L<Win32::API|Win32::API>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.59>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:51:16 2010: C<Module> L<Parse::Binary|Parse::Binary>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.11>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:51:40 2010: C<Module> L<Win32::Exe|Win32::Exe>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.11>
+
+=item *
+
+C<EXE_FILES: script/exe_update.pl>
+
+=back
+
+=head2 Wed Jan 27 23:52:04 2010: C<Module> L<Win32::EventLog|Win32::EventLog>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.076>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:52:31 2010: C<Module> L<Math::BigInt::GMP|Math::BigInt::GMP>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.24>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:52:41 2010: C<Module> L<XML::Parser|XML::Parser>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.36>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:53:03 2010: C<Module> L<XML::NamespaceSupport|XML::NamespaceSupport>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.10>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:53:28 2010: C<Module> L<XML::SAX|XML::SAX>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.96>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:54:11 2010: C<Module> L<XML::LibXML|XML::LibXML>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.70>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:54:48 2010: C<Module> L<XML::LibXSLT|XML::LibXSLT>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.70>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:55:11 2010: C<Module> L<PAR::Dist|PAR::Dist>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.47>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:55:34 2010: C<Module> L<PAR::Dist::FromPPD|PAR::Dist::FromPPD>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.03>
+
+=item *
+
+C<EXE_FILES: bin/ppd2par>
+
+=back
+
+=head2 Wed Jan 27 23:55:58 2010: C<Module> L<PAR::Dist::InstallPPD|PAR::Dist::InstallPPD>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.02>
+
+=item *
+
+C<EXE_FILES: bin/parinstallppd>
+
+=back
+
+=head2 Wed Jan 27 23:56:20 2010: C<Module> L<Tree::DAG_Node|Tree::DAG_Node>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.06>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:57:03 2010: C<Module> L<Test::Warn|Test::Warn>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.21>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:57:25 2010: C<Module> L<Test::Tester|Test::Tester>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.107>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:57:47 2010: C<Module> L<Test::NoWarnings|Test::NoWarnings>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.01>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:58:11 2010: C<Module> L<Test::Deep|Test::Deep>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.106>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:58:33 2010: C<Module> L<IO::Stringy|IO::Stringy>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.110>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:58:57 2010: C<Module> L<YAML::Tiny|YAML::Tiny>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.41>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:59:21 2010: C<Module> L<PAR|PAR>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.994>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Jan 27 23:59:43 2010: C<Module> L<PAR::Repository::Query|PAR::Repository::Query>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.14>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:00:05 2010: C<Module> L<PAR::Repository::Client|PAR::Repository::Client>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.25>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:00:12 2010: C<Module> L<PPM|PPM>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.01_01>
+
+=item *
+
+C<EXE_FILES: bin/ppm.pl>
+
+=back
+
+=head2 Thu Jan 28 00:00:34 2010: C<Module> L<Number::Compare|Number::Compare>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.01>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:00:57 2010: C<Module> L<File::Find::Rule|File::Find::Rule>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.32>
+
+=item *
+
+C<EXE_FILES: findrule>
+
+=back
+
+=head2 Thu Jan 28 00:01:19 2010: C<Module> L<Data::Compare|Data::Compare>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.2101>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:01:42 2010: C<Module> L<File::chmod|File::chmod>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.32>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:02:07 2010: C<Module> L<Params::Util|Params::Util>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.00>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:02:29 2010: C<Module> L<CPAN::Checksums|CPAN::Checksums>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.05>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:02:53 2010: C<Module> L<CPAN::Inject|CPAN::Inject>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.11>
+
+=item *
+
+C<EXE_FILES: script/cpaninject>
+
+=back
+
+=head2 Thu Jan 28 00:03:36 2010: C<Module> L<pler|pler>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.05>
+
+=item *
+
+C<EXE_FILES: script/pler>
+
+=back
+
+=head2 Thu Jan 28 00:04:00 2010: C<Module> L<pip|pip>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.16>
+
+=item *
+
+C<EXE_FILES: script/pip>
+
+=back
+
+=head2 Thu Jan 28 00:04:37 2010: C<Module> L<DBI|DBI>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.609>
+
+=item *
+
+C<EXE_FILES: dbiproxy dbiprof dbilogstrip>
+
+=back
+
+=head2 Thu Jan 28 00:05:24 2010: C<Module> L<DBD::SQLite|DBD::SQLite>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.29>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:05:47 2010: C<Module> L<CPAN::DistnameInfo|CPAN::DistnameInfo>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.09>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:06:30 2010: C<Module> L<DBIx::Simple|DBIx::Simple>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.32>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:06:58 2010: C<Module> L<DB_File|DB_File>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.820>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:07:28 2010: C<Module> L<BerkeleyDB|BerkeleyDB>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.41>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:07:56 2010: C<Module> L<DBD::ODBC|DBD::ODBC>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.23>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:08:29 2010: C<Module> L<DBD::Pg|DBD::Pg>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.16.1>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:08:51 2010: C<Module> L<common::sense|common::sense>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 3.0>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:09:19 2010: C<Module> L<JSON::XS|JSON::XS>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.27>
+
+=item *
+
+C<EXE_FILES: bin/json_xs>
+
+=back
+
+=head2 Thu Jan 28 00:09:44 2010: C<Module> L<JSON|JSON>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.17>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:10:07 2010: C<Module> L<local::lib|local::lib>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.004009>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:11:20 2010: C<Module> L<Imager|Imager>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.72>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:11:49 2010: C<Module> L<GD|GD>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.44>
+
+=item *
+
+C<EXE_FILES: bdf_scripts/bdf2gdfont.pl>
+
+=back
+
+=head2 Thu Jan 28 00:11:57 2010: C<Module> L<Crypt::SSLeay|Crypt::SSLeay>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.57>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:12:27 2010: C<Module> L<Net::SSLeay|Net::SSLeay>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.35>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:12:50 2010: C<Module> L<Digest::HMAC|Digest::HMAC>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.02>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:13:13 2010: C<Module> L<IO::Socket::SSL|IO::Socket::SSL>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.31>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:13:35 2010: C<Module> L<Net::SMTP::TLS|Net::SMTP::TLS>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.12>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:13:58 2010: C<Module> L<Data::Random|Data::Random>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.05>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:14:23 2010: C<Module> L<Math::GMP|Math::GMP>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.06>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:14:45 2010: C<Module> L<Data::Buffer|Data::Buffer>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.04>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:15:09 2010: C<Module> L<Crypt::DSA|Crypt::DSA>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.16>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:15:52 2010: C<Module> L<Convert::ASN1|Convert::ASN1>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.22>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:16:15 2010: C<Module> L<Crypt::CBC|Crypt::CBC>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.30>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:16:39 2010: C<Module> L<Crypt::DES|Crypt::DES>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.05>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:17:01 2010: C<Module> L<Crypt::DES_EDE3|Crypt::DES_EDE3>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.01>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:17:25 2010: C<Module> L<Convert::PEM|Convert::PEM>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.07>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:17:47 2010: C<Module> L<Crypt::DH|Crypt::DH>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.06>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:18:12 2010: C<Module> L<Crypt::Blowfish|Crypt::Blowfish>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.10>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:18:34 2010: C<Module> L<Tie::EncryptedHash|Tie::EncryptedHash>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.24>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:18:57 2010: C<Module> L<Class::Loader|Class::Loader>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.03>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:19:21 2010: C<Module> L<Crypt::Random|Crypt::Random>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.25>
+
+=item *
+
+C<EXE_FILES: bin/makerandom>
+
+=back
+
+=head2 Thu Jan 28 00:19:44 2010: C<Module> L<Convert::ASCII::Armour|Convert::ASCII::Armour>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.4>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:20:07 2010: C<Module> L<Digest::MD2|Digest::MD2>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.03>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:20:30 2010: C<Module> L<Sort::Versions|Sort::Versions>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.5>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:20:54 2010: C<Module> L<Crypt::Primes|Crypt::Primes>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.50>
+
+=item *
+
+C<EXE_FILES: bin/largeprimes>
+
+=back
+
+=head2 Thu Jan 28 00:21:16 2010: C<Module> L<Crypt::RSA|Crypt::RSA>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.99>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:21:39 2010: C<Module> L<Digest::BubbleBabble|Digest::BubbleBabble>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.01>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:22:03 2010: C<Module> L<Crypt::IDEA|Crypt::IDEA>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.08>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:22:27 2010: C<Module> L<String::CRC32|String::CRC32>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.4>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:22:50 2010: C<Module> L<Test::Manifest|Test::Manifest>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.23>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:23:15 2010: C<Module> L<Crypt::Rijndael|Crypt::Rijndael>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.09>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:23:37 2010: C<Module> L<Crypt::CAST5_PP|Crypt::CAST5_PP>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.04>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:24:02 2010: C<Module> L<Crypt::RIPEMD160|Crypt::RIPEMD160>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.04>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:24:26 2010: C<Module> L<Crypt::Twofish|Crypt::Twofish>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.13>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:25:12 2010: C<Module> L<Crypt::OpenPGP|Crypt::OpenPGP>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.04>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:25:35 2010: C<Module> L<Algorithm::Diff|Algorithm::Diff>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.1902>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:25:58 2010: C<Module> L<Text::Diff|Text::Diff>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.37>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Thu Jan 28 00:26:23 2010: C<Module> L<Module::Signature|Module::Signature>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\vendor\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 0.61>
+
+=item *
+
+C<EXE_FILES: script/cpansign>
+
+=back
+
+=head2 Thu Feb 18 14:59:36 2010: C<Module> L<Tk|Tk>
+
+=over 4
+
+=item *
+
+C<installed into: C:\strawberry\perl\site\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 804.028>
+
+=item *
+
+C<EXE_FILES: ptksh ptked gedi>
+
+=back
+
diff --git a/Master/tlpkg/tlperl.straw/lib/perlpod.pod b/Master/tlpkg/tlperl.straw/lib/perlpod.pod
new file mode 100755
index 00000000000..55ea57ea5a8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/perlpod.pod
@@ -0,0 +1,732 @@
+
+=for comment
+This document is in Pod format. To read this, use a Pod formatter,
+like "perldoc perlpod".
+
+=head1 NAME
+X<POD> X<plain old documentation>
+
+perlpod - the Plain Old Documentation format
+
+=head1 DESCRIPTION
+
+Pod is a simple-to-use markup language used for writing documentation
+for Perl, Perl programs, and Perl modules.
+
+Translators are available for converting Pod to various formats
+like plain text, HTML, man pages, and more.
+
+Pod markup consists of three basic kinds of paragraphs:
+L<ordinary|/"Ordinary Paragraph">,
+L<verbatim|/"Verbatim Paragraph">, and
+L<command|/"Command Paragraph">.
+
+
+=head2 Ordinary Paragraph
+X<POD, ordinary paragraph>
+
+Most paragraphs in your documentation will be ordinary blocks
+of text, like this one. You can simply type in your text without
+any markup whatsoever, and with just a blank line before and
+after. When it gets formatted, it will undergo minimal formatting,
+like being rewrapped, probably put into a proportionally spaced
+font, and maybe even justified.
+
+You can use formatting codes in ordinary paragraphs, for B<bold>,
+I<italic>, C<code-style>, L<hyperlinks|perlfaq>, and more. Such
+codes are explained in the "L<Formatting Codes|/"Formatting Codes">"
+section, below.
+
+
+=head2 Verbatim Paragraph
+X<POD, verbatim paragraph> X<verbatim>
+
+Verbatim paragraphs are usually used for presenting a codeblock or
+other text which does not require any special parsing or formatting,
+and which shouldn't be wrapped.
+
+A verbatim paragraph is distinguished by having its first character
+be a space or a tab. (And commonly, all its lines begin with spaces
+and/or tabs.) It should be reproduced exactly, with tabs assumed to
+be on 8-column boundaries. There are no special formatting codes,
+so you can't italicize or anything like that. A \ means \, and
+nothing else.
+
+
+=head2 Command Paragraph
+X<POD, command>
+
+A command paragraph is used for special treatment of whole chunks
+of text, usually as headings or parts of lists.
+
+All command paragraphs (which are typically only one line long) start
+with "=", followed by an identifier, followed by arbitrary text that
+the command can use however it pleases. Currently recognized commands
+are
+
+ =pod
+ =head1 Heading Text
+ =head2 Heading Text
+ =head3 Heading Text
+ =head4 Heading Text
+ =over indentlevel
+ =item stuff
+ =back
+ =begin format
+ =end format
+ =for format text...
+ =encoding type
+ =cut
+
+To explain them each in detail:
+
+=over
+
+=item C<=head1 I<Heading Text>>
+X<=head1> X<=head2> X<=head3> X<=head4>
+X<head1> X<head2> X<head3> X<head4>
+
+=item C<=head2 I<Heading Text>>
+
+=item C<=head3 I<Heading Text>>
+
+=item C<=head4 I<Heading Text>>
+
+Head1 through head4 produce headings, head1 being the highest
+level. The text in the rest of this paragraph is the content of the
+heading. For example:
+
+ =head2 Object Attributes
+
+The text "Object Attributes" comprises the heading there. (Note that
+head3 and head4 are recent additions, not supported in older Pod
+translators.) The text in these heading commands can use
+formatting codes, as seen here:
+
+ =head2 Possible Values for C<$/>
+
+Such commands are explained in the
+"L<Formatting Codes|/"Formatting Codes">" section, below.
+
+=item C<=over I<indentlevel>>
+X<=over> X<=item> X<=back> X<over> X<item> X<back>
+
+=item C<=item I<stuff...>>
+
+=item C<=back>
+
+Item, over, and back require a little more explanation: "=over" starts
+a region specifically for the generation of a list using "=item"
+commands, or for indenting (groups of) normal paragraphs. At the end
+of your list, use "=back" to end it. The I<indentlevel> option to
+"=over" indicates how far over to indent, generally in ems (where
+one em is the width of an "M" in the document's base font) or roughly
+comparable units; if there is no I<indentlevel> option, it defaults
+to four. (And some formatters may just ignore whatever I<indentlevel>
+you provide.) In the I<stuff> in C<=item I<stuff...>>, you may
+use formatting codes, as seen here:
+
+ =item Using C<$|> to Control Buffering
+
+Such commands are explained in the
+"L<Formatting Codes|/"Formatting Codes">" section, below.
+
+Note also that there are some basic rules to using "=over" ...
+"=back" regions:
+
+=over
+
+=item *
+
+Don't use "=item"s outside of an "=over" ... "=back" region.
+
+=item *
+
+The first thing after the "=over" command should be an "=item", unless
+there aren't going to be any items at all in this "=over" ... "=back"
+region.
+
+=item *
+
+Don't put "=headI<n>" commands inside an "=over" ... "=back" region.
+
+=item *
+
+And perhaps most importantly, keep the items consistent: either use
+"=item *" for all of them, to produce bullets; or use "=item 1.",
+"=item 2.", etc., to produce numbered lists; or use "=item foo",
+"=item bar", etc. -- namely, things that look nothing like bullets or
+numbers.
+
+If you start with bullets or numbers, stick with them, as
+formatters use the first "=item" type to decide how to format the
+list.
+
+=back
+
+=item C<=cut>
+X<=cut> X<cut>
+
+To end a Pod block, use a blank line,
+then a line beginning with "=cut", and a blank
+line after it. This lets Perl (and the Pod formatter) know that
+this is where Perl code is resuming. (The blank line before the "=cut"
+is not technically necessary, but many older Pod processors require it.)
+
+=item C<=pod>
+X<=pod> X<pod>
+
+The "=pod" command by itself doesn't do much of anything, but it
+signals to Perl (and Pod formatters) that a Pod block starts here. A
+Pod block starts with I<any> command paragraph, so a "=pod" command is
+usually used just when you want to start a Pod block with an ordinary
+paragraph or a verbatim paragraph. For example:
+
+ =item stuff()
+
+ This function does stuff.
+
+ =cut
+
+ sub stuff {
+ ...
+ }
+
+ =pod
+
+ Remember to check its return value, as in:
+
+ stuff() || die "Couldn't do stuff!";
+
+ =cut
+
+=item C<=begin I<formatname>>
+X<=begin> X<=end> X<=for> X<begin> X<end> X<for>
+
+=item C<=end I<formatname>>
+
+=item C<=for I<formatname> I<text...>>
+
+For, begin, and end will let you have regions of text/code/data that
+are not generally interpreted as normal Pod text, but are passed
+directly to particular formatters, or are otherwise special. A
+formatter that can use that format will use the region, otherwise it
+will be completely ignored.
+
+A command "=begin I<formatname>", some paragraphs, and a
+command "=end I<formatname>", mean that the text/data in between
+is meant for formatters that understand the special format
+called I<formatname>. For example,
+
+ =begin html
+
+ <hr> <img src="thang.png">
+ <p> This is a raw HTML paragraph </p>
+
+ =end html
+
+The command "=for I<formatname> I<text...>"
+specifies that the remainder of just this paragraph (starting
+right after I<formatname>) is in that special format.
+
+ =for html <hr> <img src="thang.png">
+ <p> This is a raw HTML paragraph </p>
+
+This means the same thing as the above "=begin html" ... "=end html"
+region.
+
+That is, with "=for", you can have only one paragraph's worth
+of text (i.e., the text in "=foo targetname text..."), but with
+"=begin targetname" ... "=end targetname", you can have any amount
+of stuff inbetween. (Note that there still must be a blank line
+after the "=begin" command and a blank line before the "=end"
+command.
+
+Here are some examples of how to use these:
+
+ =begin html
+
+ <br>Figure 1.<br><IMG SRC="figure1.png"><br>
+
+ =end html
+
+ =begin text
+
+ ---------------
+ | foo |
+ | bar |
+ ---------------
+
+ ^^^^ Figure 1. ^^^^
+
+ =end text
+
+Some format names that formatters currently are known to accept
+include "roff", "man", "latex", "tex", "text", and "html". (Some
+formatters will treat some of these as synonyms.)
+
+A format name of "comment" is common for just making notes (presumably
+to yourself) that won't appear in any formatted version of the Pod
+document:
+
+ =for comment
+ Make sure that all the available options are documented!
+
+Some I<formatnames> will require a leading colon (as in
+C<"=for :formatname">, or
+C<"=begin :formatname" ... "=end :formatname">),
+to signal that the text is not raw data, but instead I<is> Pod text
+(i.e., possibly containing formatting codes) that's just not for
+normal formatting (e.g., may not be a normal-use paragraph, but might
+be for formatting as a footnote).
+
+=item C<=encoding I<encodingname>>
+X<=encoding> X<encoding>
+
+This command is used for declaring the encoding of a document. Most
+users won't need this; but if your encoding isn't US-ASCII or Latin-1,
+then put a C<=encoding I<encodingname>> command early in the document so
+that pod formatters will know how to decode the document. For
+I<encodingname>, use a name recognized by the L<Encode::Supported>
+module. Examples:
+
+ =encoding utf8
+
+ =encoding koi8-r
+
+ =encoding ShiftJIS
+
+ =encoding big5
+
+=back
+
+C<=encoding> affects the whole document, and must occur only once.
+
+And don't forget, when using any other command, that the command lasts up
+until the end of its I<paragraph>, not its line. So in the
+examples below, you can see that every command needs the blank
+line after it, to end its paragraph.
+
+Some examples of lists include:
+
+ =over
+
+ =item *
+
+ First item
+
+ =item *
+
+ Second item
+
+ =back
+
+ =over
+
+ =item Foo()
+
+ Description of Foo function
+
+ =item Bar()
+
+ Description of Bar function
+
+ =back
+
+
+=head2 Formatting Codes
+X<POD, formatting code> X<formatting code>
+X<POD, interior sequence> X<interior sequence>
+
+In ordinary paragraphs and in some command paragraphs, various
+formatting codes (a.k.a. "interior sequences") can be used:
+
+=for comment
+ "interior sequences" is such an opaque term.
+ Prefer "formatting codes" instead.
+
+=over
+
+=item C<IE<lt>textE<gt>> -- italic text
+X<I> X<< IZ<><> >> X<POD, formatting code, italic> X<italic>
+
+Used for emphasis ("C<be IE<lt>careful!E<gt>>") and parameters
+("C<redo IE<lt>LABELE<gt>>")
+
+=item C<BE<lt>textE<gt>> -- bold text
+X<B> X<< BZ<><> >> X<POD, formatting code, bold> X<bold>
+
+Used for switches ("C<perl's BE<lt>-nE<gt> switch>"), programs
+("C<some systems provide a BE<lt>chfnE<gt> for that>"),
+emphasis ("C<be BE<lt>careful!E<gt>>"), and so on
+("C<and that feature is known as BE<lt>autovivificationE<gt>>").
+
+=item C<CE<lt>codeE<gt>> -- code text
+X<C> X<< CZ<><> >> X<POD, formatting code, code> X<code>
+
+Renders code in a typewriter font, or gives some other indication that
+this represents program text ("C<CE<lt>gmtime($^T)E<gt>>") or some other
+form of computerese ("C<CE<lt>drwxr-xr-xE<gt>>").
+
+=item C<LE<lt>nameE<gt>> -- a hyperlink
+X<L> X<< LZ<><> >> X<POD, formatting code, hyperlink> X<hyperlink>
+
+There are various syntaxes, listed below. In the syntaxes given,
+C<text>, C<name>, and C<section> cannot contain the characters
+'/' and '|'; and any '<' or '>' should be matched.
+
+=over
+
+=item *
+
+C<LE<lt>nameE<gt>>
+
+Link to a Perl manual page (e.g., C<LE<lt>Net::PingE<gt>>). Note
+that C<name> should not contain spaces. This syntax
+is also occasionally used for references to UNIX man pages, as in
+C<LE<lt>crontab(5)E<gt>>.
+
+=item *
+
+C<LE<lt>name/"sec"E<gt>> or C<LE<lt>name/secE<gt>>
+
+Link to a section in other manual page. E.g.,
+C<LE<lt>perlsyn/"For Loops"E<gt>>
+
+=item *
+
+C<LE<lt>/"sec"E<gt>> or C<LE<lt>/secE<gt>>
+
+Link to a section in this manual page. E.g.,
+C<LE<lt>/"Object Methods"E<gt>>
+
+=back
+
+A section is started by the named heading or item. For
+example, C<LE<lt>perlvar/$.E<gt>> or C<LE<lt>perlvar/"$."E<gt>> both
+link to the section started by "C<=item $.>" in perlvar. And
+C<LE<lt>perlsyn/For LoopsE<gt>> or C<LE<lt>perlsyn/"For Loops"E<gt>>
+both link to the section started by "C<=head2 For Loops>"
+in perlsyn.
+
+To control what text is used for display, you
+use "C<LE<lt>text|...E<gt>>", as in:
+
+=over
+
+=item *
+
+C<LE<lt>text|nameE<gt>>
+
+Link this text to that manual page. E.g.,
+C<LE<lt>Perl Error Messages|perldiagE<gt>>
+
+=item *
+
+C<LE<lt>text|name/"sec"E<gt>> or C<LE<lt>text|name/secE<gt>>
+
+Link this text to that section in that manual page. E.g.,
+C<LE<lt>postfix "if"|perlsyn/"Statement Modifiers"E<gt>>
+
+=item *
+
+C<LE<lt>text|/"sec"E<gt>> or C<LE<lt>text|/secE<gt>>
+or C<LE<lt>text|"sec"E<gt>>
+
+Link this text to that section in this manual page. E.g.,
+C<LE<lt>the various attributes|/"Member Data"E<gt>>
+
+=back
+
+Or you can link to a web page:
+
+=over
+
+=item *
+
+C<LE<lt>scheme:...E<gt>>
+
+C<LE<lt>text|scheme:...E<gt>>
+
+Links to an absolute URL. For example, C<LE<lt>http://www.perl.org/E<gt>> or
+C<LE<lt>The Perl Home Page|http://www.perl.org/E<gt>>.
+
+=back
+
+=item C<EE<lt>escapeE<gt>> -- a character escape
+X<E> X<< EZ<><> >> X<POD, formatting code, escape> X<escape>
+
+Very similar to HTML/XML C<&I<foo>;> "entity references":
+
+=over
+
+=item *
+
+C<EE<lt>ltE<gt>> -- a literal E<lt> (less than)
+
+=item *
+
+C<EE<lt>gtE<gt>> -- a literal E<gt> (greater than)
+
+=item *
+
+C<EE<lt>verbarE<gt>> -- a literal | (I<ver>tical I<bar>)
+
+=item *
+
+C<EE<lt>solE<gt>> = a literal / (I<sol>idus)
+
+The above four are optional except in other formatting codes,
+notably C<LE<lt>...E<gt>>, and when preceded by a
+capital letter.
+
+=item *
+
+C<EE<lt>htmlnameE<gt>>
+
+Some non-numeric HTML entity name, such as C<EE<lt>eacuteE<gt>>,
+meaning the same thing as C<&eacute;> in HTML -- i.e., a lowercase
+e with an acute (/-shaped) accent.
+
+=item *
+
+C<EE<lt>numberE<gt>>
+
+The ASCII/Latin-1/Unicode character with that number. A
+leading "0x" means that I<number> is hex, as in
+C<EE<lt>0x201EE<gt>>. A leading "0" means that I<number> is octal,
+as in C<EE<lt>075E<gt>>. Otherwise I<number> is interpreted as being
+in decimal, as in C<EE<lt>181E<gt>>.
+
+Note that older Pod formatters might not recognize octal or
+hex numeric escapes, and that many formatters cannot reliably
+render characters above 255. (Some formatters may even have
+to use compromised renderings of Latin-1 characters, like
+rendering C<EE<lt>eacuteE<gt>> as just a plain "e".)
+
+=back
+
+=item C<FE<lt>filenameE<gt>> -- used for filenames
+X<F> X<< FZ<><> >> X<POD, formatting code, filename> X<filename>
+
+Typically displayed in italics. Example: "C<FE<lt>.cshrcE<gt>>"
+
+=item C<SE<lt>textE<gt>> -- text contains non-breaking spaces
+X<S> X<< SZ<><> >> X<POD, formatting code, non-breaking space>
+X<non-breaking space>
+
+This means that the words in I<text> should not be broken
+across lines. Example: S<C<SE<lt>$x ? $y : $zE<gt>>>.
+
+=item C<XE<lt>topic nameE<gt>> -- an index entry
+X<X> X<< XZ<><> >> X<POD, formatting code, index entry> X<index entry>
+
+This is ignored by most formatters, but some may use it for building
+indexes. It always renders as empty-string.
+Example: C<XE<lt>absolutizing relative URLsE<gt>>
+
+=item C<ZE<lt>E<gt>> -- a null (zero-effect) formatting code
+X<Z> X<< ZZ<><> >> X<POD, formatting code, null> X<null>
+
+This is rarely used. It's one way to get around using an
+EE<lt>...E<gt> code sometimes. For example, instead of
+"C<NEE<lt>ltE<gt>3>" (for "NE<lt>3") you could write
+"C<NZE<lt>E<gt>E<lt>3>" (the "ZE<lt>E<gt>" breaks up the "N" and
+the "E<lt>" so they can't be considered
+the part of a (fictitious) "NE<lt>...E<gt>" code.
+
+=for comment
+ This was formerly explained as a "zero-width character". But it in
+ most parser models, it parses to nothing at all, as opposed to parsing
+ as if it were a E<zwnj> or E<zwj>, which are REAL zero-width characters.
+ So "width" and "character" are exactly the wrong words.
+
+=back
+
+Most of the time, you will need only a single set of angle brackets to
+delimit the beginning and end of formatting codes. However,
+sometimes you will want to put a real right angle bracket (a
+greater-than sign, '>') inside of a formatting code. This is particularly
+common when using a formatting code to provide a different font-type for a
+snippet of code. As with all things in Perl, there is more than
+one way to do it. One way is to simply escape the closing bracket
+using an C<E> code:
+
+ C<$a E<lt>=E<gt> $b>
+
+This will produce: "C<$a E<lt>=E<gt> $b>"
+
+A more readable, and perhaps more "plain" way is to use an alternate
+set of delimiters that doesn't require a single ">" to be escaped. With
+the Pod formatters that are standard starting with perl5.5.660, doubled
+angle brackets ("<<" and ">>") may be used I<if and only if there is
+whitespace right after the opening delimiter and whitespace right
+before the closing delimiter!> For example, the following will
+do the trick:
+X<POD, formatting code, escaping with multiple brackets>
+
+ C<< $a <=> $b >>
+
+In fact, you can use as many repeated angle-brackets as you like so
+long as you have the same number of them in the opening and closing
+delimiters, and make sure that whitespace immediately follows the last
+'<' of the opening delimiter, and immediately precedes the first '>'
+of the closing delimiter. (The whitespace is ignored.) So the
+following will also work:
+X<POD, formatting code, escaping with multiple brackets>
+
+ C<<< $a <=> $b >>>
+ C<<<< $a <=> $b >>>>
+
+And they all mean exactly the same as this:
+
+ C<$a E<lt>=E<gt> $b>
+
+As a further example, this means that if you wanted to put these bits of
+code in C<C> (code) style:
+
+ open(X, ">>thing.dat") || die $!
+ $foo->bar();
+
+you could do it like so:
+
+ C<<< open(X, ">>thing.dat") || die $! >>>
+ C<< $foo->bar(); >>
+
+which is presumably easier to read than the old way:
+
+ C<open(X, "E<gt>E<gt>thing.dat") || die $!>
+ C<$foo-E<gt>bar();>
+
+This is currently supported by pod2text (Pod::Text), pod2man (Pod::Man),
+and any other pod2xxx or Pod::Xxxx translators that use
+Pod::Parser 1.093 or later, or Pod::Tree 1.02 or later.
+
+=head2 The Intent
+X<POD, intent of>
+
+The intent is simplicity of use, not power of expression. Paragraphs
+look like paragraphs (block format), so that they stand out
+visually, and so that I could run them through C<fmt> easily to reformat
+them (that's F7 in my version of B<vi>, or Esc Q in my version of
+B<emacs>). I wanted the translator to always leave the C<'> and C<`> and
+C<"> quotes alone, in verbatim mode, so I could slurp in a
+working program, shift it over four spaces, and have it print out, er,
+verbatim. And presumably in a monospace font.
+
+The Pod format is not necessarily sufficient for writing a book. Pod
+is just meant to be an idiot-proof common source for nroff, HTML,
+TeX, and other markup languages, as used for online
+documentation. Translators exist for B<pod2text>, B<pod2html>,
+B<pod2man> (that's for nroff(1) and troff(1)), B<pod2latex>, and
+B<pod2fm>. Various others are available in CPAN.
+
+
+=head2 Embedding Pods in Perl Modules
+X<POD, embedding>
+
+You can embed Pod documentation in your Perl modules and scripts.
+Start your documentation with an empty line, a "=head1" command at the
+beginning, and end it with a "=cut" command and an empty line. Perl
+will ignore the Pod text. See any of the supplied library modules for
+examples. If you're going to put your Pod at the end of the file, and
+you're using an __END__ or __DATA__ cut mark, make sure to put an
+empty line there before the first Pod command.
+
+ __END__
+
+ =head1 NAME
+
+ Time::Local - efficiently compute time from local and GMT time
+
+Without that empty line before the "=head1", many translators wouldn't
+have recognized the "=head1" as starting a Pod block.
+
+=head2 Hints for Writing Pod
+
+=over
+
+=item *
+X<podchecker> X<POD, validating>
+
+The B<podchecker> command is provided for checking Pod syntax for errors
+and warnings. For example, it checks for completely blank lines in
+Pod blocks and for unknown commands and formatting codes. You should
+still also pass your document through one or more translators and proofread
+the result, or print out the result and proofread that. Some of the
+problems found may be bugs in the translators, which you may or may not
+wish to work around.
+
+=item *
+
+If you're more familiar with writing in HTML than with writing in Pod, you
+can try your hand at writing documentation in simple HTML, and converting
+it to Pod with the experimental L<Pod::HTML2Pod|Pod::HTML2Pod> module,
+(available in CPAN), and looking at the resulting code. The experimental
+L<Pod::PXML|Pod::PXML> module in CPAN might also be useful.
+
+=item *
+
+Many older Pod translators require the lines before every Pod
+command and after every Pod command (including "=cut"!) to be a blank
+line. Having something like this:
+
+ # - - - - - - - - - - - -
+ =item $firecracker->boom()
+
+ This noisily detonates the firecracker object.
+ =cut
+ sub boom {
+ ...
+
+...will make such Pod translators completely fail to see the Pod block
+at all.
+
+Instead, have it like this:
+
+ # - - - - - - - - - - - -
+
+ =item $firecracker->boom()
+
+ This noisily detonates the firecracker object.
+
+ =cut
+
+ sub boom {
+ ...
+
+=item *
+
+Some older Pod translators require paragraphs (including command
+paragraphs like "=head2 Functions") to be separated by I<completely>
+empty lines. If you have an apparently empty line with some spaces
+on it, this might not count as a separator for those translators, and
+that could cause odd formatting.
+
+=item *
+
+Older translators might add wording around an LE<lt>E<gt> link, so that
+C<LE<lt>Foo::BarE<gt>> may become "the Foo::Bar manpage", for example.
+So you shouldn't write things like C<the LE<lt>fooE<gt>
+documentation>, if you want the translated document to read sensibly
+-- instead write C<the LE<lt>Foo::Bar|Foo::BarE<gt> documentation> or
+C<LE<lt>the Foo::Bar documentation|Foo::BarE<gt>>, to control how the
+link comes out.
+
+=item *
+
+Going past the 70th column in a verbatim block might be ungracefully
+wrapped by some formatters.
+
+=back
+
+=head1 SEE ALSO
+
+L<perlpodspec>, L<perlsyn/"PODs: Embedded Documentation">,
+L<perlnewmod>, L<perldoc>, L<pod2html>, L<pod2man>, L<podchecker>.
+
+=head1 AUTHOR
+
+Larry Wall, Sean M. Burke
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/perlpodspec.pod b/Master/tlpkg/tlperl.straw/lib/perlpodspec.pod
new file mode 100755
index 00000000000..7ab56598ae5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/perlpodspec.pod
@@ -0,0 +1,1912 @@
+
+=head1 NAME
+
+perlpodspec - Plain Old Documentation: format specification and notes
+
+=head1 DESCRIPTION
+
+This document is detailed notes on the Pod markup language. Most
+people will only have to read L<perlpod|perlpod> to know how to write
+in Pod, but this document may answer some incidental questions to do
+with parsing and rendering Pod.
+
+In this document, "must" / "must not", "should" /
+"should not", and "may" have their conventional (cf. RFC 2119)
+meanings: "X must do Y" means that if X doesn't do Y, it's against
+this specification, and should really be fixed. "X should do Y"
+means that it's recommended, but X may fail to do Y, if there's a
+good reason. "X may do Y" is merely a note that X can do Y at
+will (although it is up to the reader to detect any connotation of
+"and I think it would be I<nice> if X did Y" versus "it wouldn't
+really I<bother> me if X did Y").
+
+Notably, when I say "the parser should do Y", the
+parser may fail to do Y, if the calling application explicitly
+requests that the parser I<not> do Y. I often phrase this as
+"the parser should, by default, do Y." This doesn't I<require>
+the parser to provide an option for turning off whatever
+feature Y is (like expanding tabs in verbatim paragraphs), although
+it implicates that such an option I<may> be provided.
+
+=head1 Pod Definitions
+
+Pod is embedded in files, typically Perl source files -- although you
+can write a file that's nothing but Pod.
+
+A B<line> in a file consists of zero or more non-newline characters,
+terminated by either a newline or the end of the file.
+
+A B<newline sequence> is usually a platform-dependent concept, but
+Pod parsers should understand it to mean any of CR (ASCII 13), LF
+(ASCII 10), or a CRLF (ASCII 13 followed immediately by ASCII 10), in
+addition to any other system-specific meaning. The first CR/CRLF/LF
+sequence in the file may be used as the basis for identifying the
+newline sequence for parsing the rest of the file.
+
+A B<blank line> is a line consisting entirely of zero or more spaces
+(ASCII 32) or tabs (ASCII 9), and terminated by a newline or end-of-file.
+A B<non-blank line> is a line containing one or more characters other
+than space or tab (and terminated by a newline or end-of-file).
+
+(I<Note:> Many older Pod parsers did not accept a line consisting of
+spaces/tabs and then a newline as a blank line -- the only lines they
+considered blank were lines consisting of I<no characters at all>,
+terminated by a newline.)
+
+B<Whitespace> is used in this document as a blanket term for spaces,
+tabs, and newline sequences. (By itself, this term usually refers
+to literal whitespace. That is, sequences of whitespace characters
+in Pod source, as opposed to "EE<lt>32>", which is a formatting
+code that I<denotes> a whitespace character.)
+
+A B<Pod parser> is a module meant for parsing Pod (regardless of
+whether this involves calling callbacks or building a parse tree or
+directly formatting it). A B<Pod formatter> (or B<Pod translator>)
+is a module or program that converts Pod to some other format (HTML,
+plaintext, TeX, PostScript, RTF). A B<Pod processor> might be a
+formatter or translator, or might be a program that does something
+else with the Pod (like counting words, scanning for index points,
+etc.).
+
+Pod content is contained in B<Pod blocks>. A Pod block starts with a
+line that matches <m/\A=[a-zA-Z]/>, and continues up to the next line
+that matches C<m/\A=cut/> -- or up to the end of the file, if there is
+no C<m/\A=cut/> line.
+
+=for comment
+ The current perlsyn says:
+ [beginquote]
+ Note that pod translators should look at only paragraphs beginning
+ with a pod directive (it makes parsing easier), whereas the compiler
+ actually knows to look for pod escapes even in the middle of a
+ paragraph. This means that the following secret stuff will be ignored
+ by both the compiler and the translators.
+ $a=3;
+ =secret stuff
+ warn "Neither POD nor CODE!?"
+ =cut back
+ print "got $a\n";
+ You probably shouldn't rely upon the warn() being podded out forever.
+ Not all pod translators are well-behaved in this regard, and perhaps
+ the compiler will become pickier.
+ [endquote]
+ I think that those paragraphs should just be removed; paragraph-based
+ parsing seems to have been largely abandoned, because of the hassle
+ with non-empty blank lines messing up what people meant by "paragraph".
+ Even if the "it makes parsing easier" bit were especially true,
+ it wouldn't be worth the confusion of having perl and pod2whatever
+ actually disagree on what can constitute a Pod block.
+
+Within a Pod block, there are B<Pod paragraphs>. A Pod paragraph
+consists of non-blank lines of text, separated by one or more blank
+lines.
+
+For purposes of Pod processing, there are four types of paragraphs in
+a Pod block:
+
+=over
+
+=item *
+
+A command paragraph (also called a "directive"). The first line of
+this paragraph must match C<m/\A=[a-zA-Z]/>. Command paragraphs are
+typically one line, as in:
+
+ =head1 NOTES
+
+ =item *
+
+But they may span several (non-blank) lines:
+
+ =for comment
+ Hm, I wonder what it would look like if
+ you tried to write a BNF for Pod from this.
+
+ =head3 Dr. Strangelove, or: How I Learned to
+ Stop Worrying and Love the Bomb
+
+I<Some> command paragraphs allow formatting codes in their content
+(i.e., after the part that matches C<m/\A=[a-zA-Z]\S*\s*/>), as in:
+
+ =head1 Did You Remember to C<use strict;>?
+
+In other words, the Pod processing handler for "head1" will apply the
+same processing to "Did You Remember to CE<lt>use strict;>?" that it
+would to an ordinary paragraph -- i.e., formatting codes (like
+"CE<lt>...>") are parsed and presumably formatted appropriately, and
+whitespace in the form of literal spaces and/or tabs is not
+significant.
+
+=item *
+
+A B<verbatim paragraph>. The first line of this paragraph must be a
+literal space or tab, and this paragraph must not be inside a "=begin
+I<identifier>", ... "=end I<identifier>" sequence unless
+"I<identifier>" begins with a colon (":"). That is, if a paragraph
+starts with a literal space or tab, but I<is> inside a
+"=begin I<identifier>", ... "=end I<identifier>" region, then it's
+a data paragraph, unless "I<identifier>" begins with a colon.
+
+Whitespace I<is> significant in verbatim paragraphs (although, in
+processing, tabs are probably expanded).
+
+=item *
+
+An B<ordinary paragraph>. A paragraph is an ordinary paragraph
+if its first line matches neither C<m/\A=[a-zA-Z]/> nor
+C<m/\A[ \t]/>, I<and> if it's not inside a "=begin I<identifier>",
+... "=end I<identifier>" sequence unless "I<identifier>" begins with
+a colon (":").
+
+=item *
+
+A B<data paragraph>. This is a paragraph that I<is> inside a "=begin
+I<identifier>" ... "=end I<identifier>" sequence where
+"I<identifier>" does I<not> begin with a literal colon (":"). In
+some sense, a data paragraph is not part of Pod at all (i.e.,
+effectively it's "out-of-band"), since it's not subject to most kinds
+of Pod parsing; but it is specified here, since Pod
+parsers need to be able to call an event for it, or store it in some
+form in a parse tree, or at least just parse I<around> it.
+
+=back
+
+For example: consider the following paragraphs:
+
+ # <- that's the 0th column
+
+ =head1 Foo
+
+ Stuff
+
+ $foo->bar
+
+ =cut
+
+Here, "=head1 Foo" and "=cut" are command paragraphs because the first
+line of each matches C<m/\A=[a-zA-Z]/>. "I<[space][space]>$foo->bar"
+is a verbatim paragraph, because its first line starts with a literal
+whitespace character (and there's no "=begin"..."=end" region around).
+
+The "=begin I<identifier>" ... "=end I<identifier>" commands stop
+paragraphs that they surround from being parsed as ordinary or verbatim
+paragraphs, if I<identifier> doesn't begin with a colon. This
+is discussed in detail in the section
+L</About Data Paragraphs and "=beginE<sol>=end" Regions>.
+
+=head1 Pod Commands
+
+This section is intended to supplement and clarify the discussion in
+L<perlpod/"Command Paragraph">. These are the currently recognized
+Pod commands:
+
+=over
+
+=item "=head1", "=head2", "=head3", "=head4"
+
+This command indicates that the text in the remainder of the paragraph
+is a heading. That text may contain formatting codes. Examples:
+
+ =head1 Object Attributes
+
+ =head3 What B<Not> to Do!
+
+=item "=pod"
+
+This command indicates that this paragraph begins a Pod block. (If we
+are already in the middle of a Pod block, this command has no effect at
+all.) If there is any text in this command paragraph after "=pod",
+it must be ignored. Examples:
+
+ =pod
+
+ This is a plain Pod paragraph.
+
+ =pod This text is ignored.
+
+=item "=cut"
+
+This command indicates that this line is the end of this previously
+started Pod block. If there is any text after "=cut" on the line, it must be
+ignored. Examples:
+
+ =cut
+
+ =cut The documentation ends here.
+
+ =cut
+ # This is the first line of program text.
+ sub foo { # This is the second.
+
+It is an error to try to I<start> a Pod block with a "=cut" command. In
+that case, the Pod processor must halt parsing of the input file, and
+must by default emit a warning.
+
+=item "=over"
+
+This command indicates that this is the start of a list/indent
+region. If there is any text following the "=over", it must consist
+of only a nonzero positive numeral. The semantics of this numeral is
+explained in the L</"About =over...=back Regions"> section, further
+below. Formatting codes are not expanded. Examples:
+
+ =over 3
+
+ =over 3.5
+
+ =over
+
+=item "=item"
+
+This command indicates that an item in a list begins here. Formatting
+codes are processed. The semantics of the (optional) text in the
+remainder of this paragraph are
+explained in the L</"About =over...=back Regions"> section, further
+below. Examples:
+
+ =item
+
+ =item *
+
+ =item *
+
+ =item 14
+
+ =item 3.
+
+ =item C<< $thing->stuff(I<dodad>) >>
+
+ =item For transporting us beyond seas to be tried for pretended
+ offenses
+
+ =item He is at this time transporting large armies of foreign
+ mercenaries to complete the works of death, desolation and
+ tyranny, already begun with circumstances of cruelty and perfidy
+ scarcely paralleled in the most barbarous ages, and totally
+ unworthy the head of a civilized nation.
+
+=item "=back"
+
+This command indicates that this is the end of the region begun
+by the most recent "=over" command. It permits no text after the
+"=back" command.
+
+=item "=begin formatname"
+
+=item "=begin formatname parameter"
+
+This marks the following paragraphs (until the matching "=end
+formatname") as being for some special kind of processing. Unless
+"formatname" begins with a colon, the contained non-command
+paragraphs are data paragraphs. But if "formatname" I<does> begin
+with a colon, then non-command paragraphs are ordinary paragraphs
+or data paragraphs. This is discussed in detail in the section
+L</About Data Paragraphs and "=beginE<sol>=end" Regions>.
+
+It is advised that formatnames match the regexp
+C<m/\A:?[−a−zA−Z0−9_]+\z/>. Everything following whitespace after the
+formatname is a parameter that may be used by the formatter when dealing
+with this region. This parameter must not be repeated in the "=end"
+paragraph. Implementors should anticipate future expansion in the
+semantics and syntax of the first parameter to "=begin"/"=end"/"=for".
+
+=item "=end formatname"
+
+This marks the end of the region opened by the matching
+"=begin formatname" region. If "formatname" is not the formatname
+of the most recent open "=begin formatname" region, then this
+is an error, and must generate an error message. This
+is discussed in detail in the section
+L</About Data Paragraphs and "=beginE<sol>=end" Regions>.
+
+=item "=for formatname text..."
+
+This is synonymous with:
+
+ =begin formatname
+
+ text...
+
+ =end formatname
+
+That is, it creates a region consisting of a single paragraph; that
+paragraph is to be treated as a normal paragraph if "formatname"
+begins with a ":"; if "formatname" I<doesn't> begin with a colon,
+then "text..." will constitute a data paragraph. There is no way
+to use "=for formatname text..." to express "text..." as a verbatim
+paragraph.
+
+=item "=encoding encodingname"
+
+This command, which should occur early in the document (at least
+before any non-US-ASCII data!), declares that this document is
+encoded in the encoding I<encodingname>, which must be
+an encoding name that L<Encode> recognizes. (Encode's list
+of supported encodings, in L<Encode::Supported>, is useful here.)
+If the Pod parser cannot decode the declared encoding, it
+should emit a warning and may abort parsing the document
+altogether.
+
+A document having more than one "=encoding" line should be
+considered an error. Pod processors may silently tolerate this if
+the not-first "=encoding" lines are just duplicates of the
+first one (e.g., if there's a "=encoding utf8" line, and later on
+another "=encoding utf8" line). But Pod processors should complain if
+there are contradictory "=encoding" lines in the same document
+(e.g., if there is a "=encoding utf8" early in the document and
+"=encoding big5" later). Pod processors that recognize BOMs
+may also complain if they see an "=encoding" line
+that contradicts the BOM (e.g., if a document with a UTF-16LE
+BOM has an "=encoding shiftjis" line).
+
+=back
+
+If a Pod processor sees any command other than the ones listed
+above (like "=head", or "=haed1", or "=stuff", or "=cuttlefish",
+or "=w123"), that processor must by default treat this as an
+error. It must not process the paragraph beginning with that
+command, must by default warn of this as an error, and may
+abort the parse. A Pod parser may allow a way for particular
+applications to add to the above list of known commands, and to
+stipulate, for each additional command, whether formatting
+codes should be processed.
+
+Future versions of this specification may add additional
+commands.
+
+
+
+=head1 Pod Formatting Codes
+
+(Note that in previous drafts of this document and of perlpod,
+formatting codes were referred to as "interior sequences", and
+this term may still be found in the documentation for Pod parsers,
+and in error messages from Pod processors.)
+
+There are two syntaxes for formatting codes:
+
+=over
+
+=item *
+
+A formatting code starts with a capital letter (just US-ASCII [A-Z])
+followed by a "<", any number of characters, and ending with the first
+matching ">". Examples:
+
+ That's what I<you> think!
+
+ What's C<dump()> for?
+
+ X<C<chmod> and C<unlink()> Under Different Operating Systems>
+
+=item *
+
+A formatting code starts with a capital letter (just US-ASCII [A-Z])
+followed by two or more "<"'s, one or more whitespace characters,
+any number of characters, one or more whitespace characters,
+and ending with the first matching sequence of two or more ">"'s, where
+the number of ">"'s equals the number of "<"'s in the opening of this
+formatting code. Examples:
+
+ That's what I<< you >> think!
+
+ C<<< open(X, ">>thing.dat") || die $! >>>
+
+ B<< $foo->bar(); >>
+
+With this syntax, the whitespace character(s) after the "CE<lt><<"
+and before the ">>" (or whatever letter) are I<not> renderable -- they
+do not signify whitespace, are merely part of the formatting codes
+themselves. That is, these are all synonymous:
+
+ C<thing>
+ C<< thing >>
+ C<< thing >>
+ C<<< thing >>>
+ C<<<<
+ thing
+ >>>>
+
+and so on.
+
+=back
+
+In parsing Pod, a notably tricky part is the correct parsing of
+(potentially nested!) formatting codes. Implementors should
+consult the code in the C<parse_text> routine in Pod::Parser as an
+example of a correct implementation.
+
+=over
+
+=item C<IE<lt>textE<gt>> -- italic text
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+=item C<BE<lt>textE<gt>> -- bold text
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+=item C<CE<lt>codeE<gt>> -- code text
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+=item C<FE<lt>filenameE<gt>> -- style for filenames
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+=item C<XE<lt>topic nameE<gt>> -- an index entry
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+This code is unusual in that most formatters completely discard
+this code and its content. Other formatters will render it with
+invisible codes that can be used in building an index of
+the current document.
+
+=item C<ZE<lt>E<gt>> -- a null (zero-effect) formatting code
+
+Discussed briefly in L<perlpod/"Formatting Codes">.
+
+This code is unusual is that it should have no content. That is,
+a processor may complain if it sees C<ZE<lt>potatoesE<gt>>. Whether
+or not it complains, the I<potatoes> text should ignored.
+
+=item C<LE<lt>nameE<gt>> -- a hyperlink
+
+The complicated syntaxes of this code are discussed at length in
+L<perlpod/"Formatting Codes">, and implementation details are
+discussed below, in L</"About LE<lt>...E<gt> Codes">. Parsing the
+contents of LE<lt>content> is tricky. Notably, the content has to be
+checked for whether it looks like a URL, or whether it has to be split
+on literal "|" and/or "/" (in the right order!), and so on,
+I<before> EE<lt>...> codes are resolved.
+
+=item C<EE<lt>escapeE<gt>> -- a character escape
+
+See L<perlpod/"Formatting Codes">, and several points in
+L</Notes on Implementing Pod Processors>.
+
+=item C<SE<lt>textE<gt>> -- text contains non-breaking spaces
+
+This formatting code is syntactically simple, but semantically
+complex. What it means is that each space in the printable
+content of this code signifies a non-breaking space.
+
+Consider:
+
+ C<$x ? $y : $z>
+
+ S<C<$x ? $y : $z>>
+
+Both signify the monospace (c[ode] style) text consisting of
+"$x", one space, "?", one space, ":", one space, "$z". The
+difference is that in the latter, with the S code, those spaces
+are not "normal" spaces, but instead are non-breaking spaces.
+
+=back
+
+
+If a Pod processor sees any formatting code other than the ones
+listed above (as in "NE<lt>...>", or "QE<lt>...>", etc.), that
+processor must by default treat this as an error.
+A Pod parser may allow a way for particular
+applications to add to the above list of known formatting codes;
+a Pod parser might even allow a way to stipulate, for each additional
+command, whether it requires some form of special processing, as
+LE<lt>...> does.
+
+Future versions of this specification may add additional
+formatting codes.
+
+Historical note: A few older Pod processors would not see a ">" as
+closing a "CE<lt>" code, if the ">" was immediately preceded by
+a "-". This was so that this:
+
+ C<$foo->bar>
+
+would parse as equivalent to this:
+
+ C<$foo-E<gt>bar>
+
+instead of as equivalent to a "C" formatting code containing
+only "$foo-", and then a "bar>" outside the "C" formatting code. This
+problem has since been solved by the addition of syntaxes like this:
+
+ C<< $foo->bar >>
+
+Compliant parsers must not treat "->" as special.
+
+Formatting codes absolutely cannot span paragraphs. If a code is
+opened in one paragraph, and no closing code is found by the end of
+that paragraph, the Pod parser must close that formatting code,
+and should complain (as in "Unterminated I code in the paragraph
+starting at line 123: 'Time objects are not...'"). So these
+two paragraphs:
+
+ I<I told you not to do this!
+
+ Don't make me say it again!>
+
+...must I<not> be parsed as two paragraphs in italics (with the I
+code starting in one paragraph and starting in another.) Instead,
+the first paragraph should generate a warning, but that aside, the
+above code must parse as if it were:
+
+ I<I told you not to do this!>
+
+ Don't make me say it again!E<gt>
+
+(In SGMLish jargon, all Pod commands are like block-level
+elements, whereas all Pod formatting codes are like inline-level
+elements.)
+
+
+
+=head1 Notes on Implementing Pod Processors
+
+The following is a long section of miscellaneous requirements
+and suggestions to do with Pod processing.
+
+=over
+
+=item *
+
+Pod formatters should tolerate lines in verbatim blocks that are of
+any length, even if that means having to break them (possibly several
+times, for very long lines) to avoid text running off the side of the
+page. Pod formatters may warn of such line-breaking. Such warnings
+are particularly appropriate for lines are over 100 characters long, which
+are usually not intentional.
+
+=item *
+
+Pod parsers must recognize I<all> of the three well-known newline
+formats: CR, LF, and CRLF. See L<perlport|perlport>.
+
+=item *
+
+Pod parsers should accept input lines that are of any length.
+
+=item *
+
+Since Perl recognizes a Unicode Byte Order Mark at the start of files
+as signaling that the file is Unicode encoded as in UTF-16 (whether
+big-endian or little-endian) or UTF-8, Pod parsers should do the
+same. Otherwise, the character encoding should be understood as
+being UTF-8 if the first highbit byte sequence in the file seems
+valid as a UTF-8 sequence, or otherwise as Latin-1.
+
+Future versions of this specification may specify
+how Pod can accept other encodings. Presumably treatment of other
+encodings in Pod parsing would be as in XML parsing: whatever the
+encoding declared by a particular Pod file, content is to be
+stored in memory as Unicode characters.
+
+=item *
+
+The well known Unicode Byte Order Marks are as follows: if the
+file begins with the two literal byte values 0xFE 0xFF, this is
+the BOM for big-endian UTF-16. If the file begins with the two
+literal byte value 0xFF 0xFE, this is the BOM for little-endian
+UTF-16. If the file begins with the three literal byte values
+0xEF 0xBB 0xBF, this is the BOM for UTF-8.
+
+=for comment
+ use bytes; print map sprintf(" 0x%02X", ord $_), split '', "\x{feff}";
+ 0xEF 0xBB 0xBF
+
+=for comment
+ If toke.c is modified to support UTF-32, add mention of those here.
+
+=item *
+
+A naive but sufficient heuristic for testing the first highbit
+byte-sequence in a BOM-less file (whether in code or in Pod!), to see
+whether that sequence is valid as UTF-8 (RFC 2279) is to check whether
+that the first byte in the sequence is in the range 0xC0 - 0xFD
+I<and> whether the next byte is in the range
+0x80 - 0xBF. If so, the parser may conclude that this file is in
+UTF-8, and all highbit sequences in the file should be assumed to
+be UTF-8. Otherwise the parser should treat the file as being
+in Latin-1. In the unlikely circumstance that the first highbit
+sequence in a truly non-UTF-8 file happens to appear to be UTF-8, one
+can cater to our heuristic (as well as any more intelligent heuristic)
+by prefacing that line with a comment line containing a highbit
+sequence that is clearly I<not> valid as UTF-8. A line consisting
+of simply "#", an e-acute, and any non-highbit byte,
+is sufficient to establish this file's encoding.
+
+=for comment
+ If/WHEN some brave soul makes these heuristics into a generic
+ text-file class (or PerlIO layer?), we can presumably delete
+ mention of these icky details from this file, and can instead
+ tell people to just use appropriate class/layer.
+ Auto-recognition of newline sequences would be another desirable
+ feature of such a class/layer.
+ HINT HINT HINT.
+
+=for comment
+ "The probability that a string of characters
+ in any other encoding appears as valid UTF-8 is low" - RFC2279
+
+=item *
+
+This document's requirements and suggestions about encodings
+do not apply to Pod processors running on non-ASCII platforms,
+notably EBCDIC platforms.
+
+=item *
+
+Pod processors must treat a "=for [label] [content...]" paragraph as
+meaning the same thing as a "=begin [label]" paragraph, content, and
+an "=end [label]" paragraph. (The parser may conflate these two
+constructs, or may leave them distinct, in the expectation that the
+formatter will nevertheless treat them the same.)
+
+=item *
+
+When rendering Pod to a format that allows comments (i.e., to nearly
+any format other than plaintext), a Pod formatter must insert comment
+text identifying its name and version number, and the name and
+version numbers of any modules it might be using to process the Pod.
+Minimal examples:
+
+ %% POD::Pod2PS v3.14159, using POD::Parser v1.92
+
+ <!-- Pod::HTML v3.14159, using POD::Parser v1.92 -->
+
+ {\doccomm generated by Pod::Tree::RTF 3.14159 using Pod::Tree 1.08}
+
+ .\" Pod::Man version 3.14159, using POD::Parser version 1.92
+
+Formatters may also insert additional comments, including: the
+release date of the Pod formatter program, the contact address for
+the author(s) of the formatter, the current time, the name of input
+file, the formatting options in effect, version of Perl used, etc.
+
+Formatters may also choose to note errors/warnings as comments,
+besides or instead of emitting them otherwise (as in messages to
+STDERR, or C<die>ing).
+
+=item *
+
+Pod parsers I<may> emit warnings or error messages ("Unknown E code
+EE<lt>zslig>!") to STDERR (whether through printing to STDERR, or
+C<warn>ing/C<carp>ing, or C<die>ing/C<croak>ing), but I<must> allow
+suppressing all such STDERR output, and instead allow an option for
+reporting errors/warnings
+in some other way, whether by triggering a callback, or noting errors
+in some attribute of the document object, or some similarly unobtrusive
+mechanism -- or even by appending a "Pod Errors" section to the end of
+the parsed form of the document.
+
+=item *
+
+In cases of exceptionally aberrant documents, Pod parsers may abort the
+parse. Even then, using C<die>ing/C<croak>ing is to be avoided; where
+possible, the parser library may simply close the input file
+and add text like "*** Formatting Aborted ***" to the end of the
+(partial) in-memory document.
+
+=item *
+
+In paragraphs where formatting codes (like EE<lt>...>, BE<lt>...>)
+are understood (i.e., I<not> verbatim paragraphs, but I<including>
+ordinary paragraphs, and command paragraphs that produce renderable
+text, like "=head1"), literal whitespace should generally be considered
+"insignificant", in that one literal space has the same meaning as any
+(nonzero) number of literal spaces, literal newlines, and literal tabs
+(as long as this produces no blank lines, since those would terminate
+the paragraph). Pod parsers should compact literal whitespace in each
+processed paragraph, but may provide an option for overriding this
+(since some processing tasks do not require it), or may follow
+additional special rules (for example, specially treating
+period-space-space or period-newline sequences).
+
+=item *
+
+Pod parsers should not, by default, try to coerce apostrophe (') and
+quote (") into smart quotes (little 9's, 66's, 99's, etc), nor try to
+turn backtick (`) into anything else but a single backtick character
+(distinct from an open quote character!), nor "--" into anything but
+two minus signs. They I<must never> do any of those things to text
+in CE<lt>...> formatting codes, and never I<ever> to text in verbatim
+paragraphs.
+
+=item *
+
+When rendering Pod to a format that has two kinds of hyphens (-), one
+that's a non-breaking hyphen, and another that's a breakable hyphen
+(as in "object-oriented", which can be split across lines as
+"object-", newline, "oriented"), formatters are encouraged to
+generally translate "-" to non-breaking hyphen, but may apply
+heuristics to convert some of these to breaking hyphens.
+
+=item *
+
+Pod formatters should make reasonable efforts to keep words of Perl
+code from being broken across lines. For example, "Foo::Bar" in some
+formatting systems is seen as eligible for being broken across lines
+as "Foo::" newline "Bar" or even "Foo::-" newline "Bar". This should
+be avoided where possible, either by disabling all line-breaking in
+mid-word, or by wrapping particular words with internal punctuation
+in "don't break this across lines" codes (which in some formats may
+not be a single code, but might be a matter of inserting non-breaking
+zero-width spaces between every pair of characters in a word.)
+
+=item *
+
+Pod parsers should, by default, expand tabs in verbatim paragraphs as
+they are processed, before passing them to the formatter or other
+processor. Parsers may also allow an option for overriding this.
+
+=item *
+
+Pod parsers should, by default, remove newlines from the end of
+ordinary and verbatim paragraphs before passing them to the
+formatter. For example, while the paragraph you're reading now
+could be considered, in Pod source, to end with (and contain)
+the newline(s) that end it, it should be processed as ending with
+(and containing) the period character that ends this sentence.
+
+=item *
+
+Pod parsers, when reporting errors, should make some effort to report
+an approximate line number ("Nested EE<lt>>'s in Paragraph #52, near
+line 633 of Thing/Foo.pm!"), instead of merely noting the paragraph
+number ("Nested EE<lt>>'s in Paragraph #52 of Thing/Foo.pm!"). Where
+this is problematic, the paragraph number should at least be
+accompanied by an excerpt from the paragraph ("Nested EE<lt>>'s in
+Paragraph #52 of Thing/Foo.pm, which begins 'Read/write accessor for
+the CE<lt>interest rate> attribute...'").
+
+=item *
+
+Pod parsers, when processing a series of verbatim paragraphs one
+after another, should consider them to be one large verbatim
+paragraph that happens to contain blank lines. I.e., these two
+lines, which have a blank line between them:
+
+ use Foo;
+
+ print Foo->VERSION
+
+should be unified into one paragraph ("\tuse Foo;\n\n\tprint
+Foo->VERSION") before being passed to the formatter or other
+processor. Parsers may also allow an option for overriding this.
+
+While this might be too cumbersome to implement in event-based Pod
+parsers, it is straightforward for parsers that return parse trees.
+
+=item *
+
+Pod formatters, where feasible, are advised to avoid splitting short
+verbatim paragraphs (under twelve lines, say) across pages.
+
+=item *
+
+Pod parsers must treat a line with only spaces and/or tabs on it as a
+"blank line" such as separates paragraphs. (Some older parsers
+recognized only two adjacent newlines as a "blank line" but would not
+recognize a newline, a space, and a newline, as a blank line. This
+is noncompliant behavior.)
+
+=item *
+
+Authors of Pod formatters/processors should make every effort to
+avoid writing their own Pod parser. There are already several in
+CPAN, with a wide range of interface styles -- and one of them,
+Pod::Parser, comes with modern versions of Perl.
+
+=item *
+
+Characters in Pod documents may be conveyed either as literals, or by
+number in EE<lt>n> codes, or by an equivalent mnemonic, as in
+EE<lt>eacute> which is exactly equivalent to EE<lt>233>.
+
+Characters in the range 32-126 refer to those well known US-ASCII
+characters (also defined there by Unicode, with the same meaning),
+which all Pod formatters must render faithfully. Characters
+in the ranges 0-31 and 127-159 should not be used (neither as
+literals, nor as EE<lt>number> codes), except for the
+literal byte-sequences for newline (13, 13 10, or 10), and tab (9).
+
+Characters in the range 160-255 refer to Latin-1 characters (also
+defined there by Unicode, with the same meaning). Characters above
+255 should be understood to refer to Unicode characters.
+
+=item *
+
+Be warned
+that some formatters cannot reliably render characters outside 32-126;
+and many are able to handle 32-126 and 160-255, but nothing above
+255.
+
+=item *
+
+Besides the well-known "EE<lt>lt>" and "EE<lt>gt>" codes for
+less-than and greater-than, Pod parsers must understand "EE<lt>sol>"
+for "/" (solidus, slash), and "EE<lt>verbar>" for "|" (vertical bar,
+pipe). Pod parsers should also understand "EE<lt>lchevron>" and
+"EE<lt>rchevron>" as legacy codes for characters 171 and 187, i.e.,
+"left-pointing double angle quotation mark" = "left pointing
+guillemet" and "right-pointing double angle quotation mark" = "right
+pointing guillemet". (These look like little "<<" and ">>", and they
+are now preferably expressed with the HTML/XHTML codes "EE<lt>laquo>"
+and "EE<lt>raquo>".)
+
+=item *
+
+Pod parsers should understand all "EE<lt>html>" codes as defined
+in the entity declarations in the most recent XHTML specification at
+C<www.W3.org>. Pod parsers must understand at least the entities
+that define characters in the range 160-255 (Latin-1). Pod parsers,
+when faced with some unknown "EE<lt>I<identifier>>" code,
+shouldn't simply replace it with nullstring (by default, at least),
+but may pass it through as a string consisting of the literal characters
+E, less-than, I<identifier>, greater-than. Or Pod parsers may offer the
+alternative option of processing such unknown
+"EE<lt>I<identifier>>" codes by firing an event especially
+for such codes, or by adding a special node-type to the in-memory
+document tree. Such "EE<lt>I<identifier>>" may have special meaning
+to some processors, or some processors may choose to add them to
+a special error report.
+
+=item *
+
+Pod parsers must also support the XHTML codes "EE<lt>quot>" for
+character 34 (doublequote, "), "EE<lt>amp>" for character 38
+(ampersand, &), and "EE<lt>apos>" for character 39 (apostrophe, ').
+
+=item *
+
+Note that in all cases of "EE<lt>whatever>", I<whatever> (whether
+an htmlname, or a number in any base) must consist only of
+alphanumeric characters -- that is, I<whatever> must watch
+C<m/\A\w+\z/>. So "EE<lt> 0 1 2 3 >" is invalid, because
+it contains spaces, which aren't alphanumeric characters. This
+presumably does not I<need> special treatment by a Pod processor;
+" 0 1 2 3 " doesn't look like a number in any base, so it would
+presumably be looked up in the table of HTML-like names. Since
+there isn't (and cannot be) an HTML-like entity called " 0 1 2 3 ",
+this will be treated as an error. However, Pod processors may
+treat "EE<lt> 0 1 2 3 >" or "EE<lt>e-acute>" as I<syntactically>
+invalid, potentially earning a different error message than the
+error message (or warning, or event) generated by a merely unknown
+(but theoretically valid) htmlname, as in "EE<lt>qacute>"
+[sic]. However, Pod parsers are not required to make this
+distinction.
+
+=item *
+
+Note that EE<lt>number> I<must not> be interpreted as simply
+"codepoint I<number> in the current/native character set". It always
+means only "the character represented by codepoint I<number> in
+Unicode." (This is identical to the semantics of &#I<number>; in XML.)
+
+This will likely require many formatters to have tables mapping from
+treatable Unicode codepoints (such as the "\xE9" for the e-acute
+character) to the escape sequences or codes necessary for conveying
+such sequences in the target output format. A converter to *roff
+would, for example know that "\xE9" (whether conveyed literally, or via
+a EE<lt>...> sequence) is to be conveyed as "e\\*'".
+Similarly, a program rendering Pod in a Mac OS application window, would
+presumably need to know that "\xE9" maps to codepoint 142 in MacRoman
+encoding that (at time of writing) is native for Mac OS. Such
+Unicode2whatever mappings are presumably already widely available for
+common output formats. (Such mappings may be incomplete! Implementers
+are not expected to bend over backwards in an attempt to render
+Cherokee syllabics, Etruscan runes, Byzantine musical symbols, or any
+of the other weird things that Unicode can encode.) And
+if a Pod document uses a character not found in such a mapping, the
+formatter should consider it an unrenderable character.
+
+=item *
+
+If, surprisingly, the implementor of a Pod formatter can't find a
+satisfactory pre-existing table mapping from Unicode characters to
+escapes in the target format (e.g., a decent table of Unicode
+characters to *roff escapes), it will be necessary to build such a
+table. If you are in this circumstance, you should begin with the
+characters in the range 0x00A0 - 0x00FF, which is mostly the heavily
+used accented characters. Then proceed (as patience permits and
+fastidiousness compels) through the characters that the (X)HTML
+standards groups judged important enough to merit mnemonics
+for. These are declared in the (X)HTML specifications at the
+www.W3.org site. At time of writing (September 2001), the most recent
+entity declaration files are:
+
+ http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent
+ http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent
+ http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent
+
+Then you can progress through any remaining notable Unicode characters
+in the range 0x2000-0x204D (consult the character tables at
+www.unicode.org), and whatever else strikes your fancy. For example,
+in F<xhtml-symbol.ent>, there is the entry:
+
+ <!ENTITY infin "&#8734;"> <!-- infinity, U+221E ISOtech -->
+
+While the mapping "infin" to the character "\x{221E}" will (hopefully)
+have been already handled by the Pod parser, the presence of the
+character in this file means that it's reasonably important enough to
+include in a formatter's table that maps from notable Unicode characters
+to the codes necessary for rendering them. So for a Unicode-to-*roff
+mapping, for example, this would merit the entry:
+
+ "\x{221E}" => '\(in',
+
+It is eagerly hoped that in the future, increasing numbers of formats
+(and formatters) will support Unicode characters directly (as (X)HTML
+does with C<&infin;>, C<&#8734;>, or C<&#x221E;>), reducing the need
+for idiosyncratic mappings of Unicode-to-I<my_escapes>.
+
+=item *
+
+It is up to individual Pod formatter to display good judgement when
+confronted with an unrenderable character (which is distinct from an
+unknown EE<lt>thing> sequence that the parser couldn't resolve to
+anything, renderable or not). It is good practice to map Latin letters
+with diacritics (like "EE<lt>eacute>"/"EE<lt>233>") to the corresponding
+unaccented US-ASCII letters (like a simple character 101, "e"), but
+clearly this is often not feasible, and an unrenderable character may
+be represented as "?", or the like. In attempting a sane fallback
+(as from EE<lt>233> to "e"), Pod formatters may use the
+%Latin1Code_to_fallback table in L<Pod::Escapes|Pod::Escapes>, or
+L<Text::Unidecode|Text::Unidecode>, if available.
+
+For example, this Pod text:
+
+ magic is enabled if you set C<$Currency> to 'E<euro>'.
+
+may be rendered as:
+"magic is enabled if you set C<$Currency> to 'I<?>'" or as
+"magic is enabled if you set C<$Currency> to 'B<[euro]>'", or as
+"magic is enabled if you set C<$Currency> to '[x20AC]', etc.
+
+A Pod formatter may also note, in a comment or warning, a list of what
+unrenderable characters were encountered.
+
+=item *
+
+EE<lt>...> may freely appear in any formatting code (other than
+in another EE<lt>...> or in an ZE<lt>>). That is, "XE<lt>The
+EE<lt>euro>1,000,000 Solution>" is valid, as is "LE<lt>The
+EE<lt>euro>1,000,000 Solution|Million::Euros>".
+
+=item *
+
+Some Pod formatters output to formats that implement non-breaking
+spaces as an individual character (which I'll call "NBSP"), and
+others output to formats that implement non-breaking spaces just as
+spaces wrapped in a "don't break this across lines" code. Note that
+at the level of Pod, both sorts of codes can occur: Pod can contain a
+NBSP character (whether as a literal, or as a "EE<lt>160>" or
+"EE<lt>nbsp>" code); and Pod can contain "SE<lt>foo
+IE<lt>barE<gt> baz>" codes, where "mere spaces" (character 32) in
+such codes are taken to represent non-breaking spaces. Pod
+parsers should consider supporting the optional parsing of "SE<lt>foo
+IE<lt>barE<gt> baz>" as if it were
+"fooI<NBSP>IE<lt>barE<gt>I<NBSP>baz", and, going the other way, the
+optional parsing of groups of words joined by NBSP's as if each group
+were in a SE<lt>...> code, so that formatters may use the
+representation that maps best to what the output format demands.
+
+=item *
+
+Some processors may find that the C<SE<lt>...E<gt>> code is easiest to
+implement by replacing each space in the parse tree under the content
+of the S, with an NBSP. But note: the replacement should apply I<not> to
+spaces in I<all> text, but I<only> to spaces in I<printable> text. (This
+distinction may or may not be evident in the particular tree/event
+model implemented by the Pod parser.) For example, consider this
+unusual case:
+
+ S<L</Autoloaded Functions>>
+
+This means that the space in the middle of the visible link text must
+not be broken across lines. In other words, it's the same as this:
+
+ L<"AutoloadedE<160>Functions"/Autoloaded Functions>
+
+However, a misapplied space-to-NBSP replacement could (wrongly)
+produce something equivalent to this:
+
+ L<"AutoloadedE<160>Functions"/AutoloadedE<160>Functions>
+
+...which is almost definitely not going to work as a hyperlink (assuming
+this formatter outputs a format supporting hypertext).
+
+Formatters may choose to just not support the S format code,
+especially in cases where the output format simply has no NBSP
+character/code and no code for "don't break this stuff across lines".
+
+=item *
+
+Besides the NBSP character discussed above, implementors are reminded
+of the existence of the other "special" character in Latin-1, the
+"soft hyphen" character, also known as "discretionary hyphen",
+i.e. C<EE<lt>173E<gt>> = C<EE<lt>0xADE<gt>> =
+C<EE<lt>shyE<gt>>). This character expresses an optional hyphenation
+point. That is, it normally renders as nothing, but may render as a
+"-" if a formatter breaks the word at that point. Pod formatters
+should, as appropriate, do one of the following: 1) render this with
+a code with the same meaning (e.g., "\-" in RTF), 2) pass it through
+in the expectation that the formatter understands this character as
+such, or 3) delete it.
+
+For example:
+
+ sigE<shy>action
+ manuE<shy>script
+ JarkE<shy>ko HieE<shy>taE<shy>nieE<shy>mi
+
+These signal to a formatter that if it is to hyphenate "sigaction"
+or "manuscript", then it should be done as
+"sig-I<[linebreak]>action" or "manu-I<[linebreak]>script"
+(and if it doesn't hyphenate it, then the C<EE<lt>shyE<gt>> doesn't
+show up at all). And if it is
+to hyphenate "Jarkko" and/or "Hietaniemi", it can do
+so only at the points where there is a C<EE<lt>shyE<gt>> code.
+
+In practice, it is anticipated that this character will not be used
+often, but formatters should either support it, or delete it.
+
+=item *
+
+If you think that you want to add a new command to Pod (like, say, a
+"=biblio" command), consider whether you could get the same
+effect with a for or begin/end sequence: "=for biblio ..." or "=begin
+biblio" ... "=end biblio". Pod processors that don't understand
+"=for biblio", etc, will simply ignore it, whereas they may complain
+loudly if they see "=biblio".
+
+=item *
+
+Throughout this document, "Pod" has been the preferred spelling for
+the name of the documentation format. One may also use "POD" or
+"pod". For the documentation that is (typically) in the Pod
+format, you may use "pod", or "Pod", or "POD". Understanding these
+distinctions is useful; but obsessing over how to spell them, usually
+is not.
+
+=back
+
+
+
+
+
+=head1 About LE<lt>...E<gt> Codes
+
+As you can tell from a glance at L<perlpod|perlpod>, the LE<lt>...>
+code is the most complex of the Pod formatting codes. The points below
+will hopefully clarify what it means and how processors should deal
+with it.
+
+=over
+
+=item *
+
+In parsing an LE<lt>...> code, Pod parsers must distinguish at least
+four attributes:
+
+=over
+
+=item First:
+
+The link-text. If there is none, this must be undef. (E.g., in
+"LE<lt>Perl Functions|perlfunc>", the link-text is "Perl Functions".
+In "LE<lt>Time::HiRes>" and even "LE<lt>|Time::HiRes>", there is no
+link text. Note that link text may contain formatting.)
+
+=item Second:
+
+The possibly inferred link-text -- i.e., if there was no real link
+text, then this is the text that we'll infer in its place. (E.g., for
+"LE<lt>Getopt::Std>", the inferred link text is "Getopt::Std".)
+
+=item Third:
+
+The name or URL, or undef if none. (E.g., in "LE<lt>Perl
+Functions|perlfunc>", the name -- also sometimes called the page --
+is "perlfunc". In "LE<lt>/CAVEATS>", the name is undef.)
+
+=item Fourth:
+
+The section (AKA "item" in older perlpods), or undef if none. E.g.,
+in "LE<lt>Getopt::Std/DESCRIPTIONE<gt>", "DESCRIPTION" is the section. (Note
+that this is not the same as a manpage section like the "5" in "man 5
+crontab". "Section Foo" in the Pod sense means the part of the text
+that's introduced by the heading or item whose text is "Foo".)
+
+=back
+
+Pod parsers may also note additional attributes including:
+
+=over
+
+=item Fifth:
+
+A flag for whether item 3 (if present) is a URL (like
+"http://lists.perl.org" is), in which case there should be no section
+attribute; a Pod name (like "perldoc" and "Getopt::Std" are); or
+possibly a man page name (like "crontab(5)" is).
+
+=item Sixth:
+
+The raw original LE<lt>...> content, before text is split on
+"|", "/", etc, and before EE<lt>...> codes are expanded.
+
+=back
+
+(The above were numbered only for concise reference below. It is not
+a requirement that these be passed as an actual list or array.)
+
+For example:
+
+ L<Foo::Bar>
+ => undef, # link text
+ "Foo::Bar", # possibly inferred link text
+ "Foo::Bar", # name
+ undef, # section
+ 'pod', # what sort of link
+ "Foo::Bar" # original content
+
+ L<Perlport's section on NL's|perlport/Newlines>
+ => "Perlport's section on NL's", # link text
+ "Perlport's section on NL's", # possibly inferred link text
+ "perlport", # name
+ "Newlines", # section
+ 'pod', # what sort of link
+ "Perlport's section on NL's|perlport/Newlines" # orig. content
+
+ L<perlport/Newlines>
+ => undef, # link text
+ '"Newlines" in perlport', # possibly inferred link text
+ "perlport", # name
+ "Newlines", # section
+ 'pod', # what sort of link
+ "perlport/Newlines" # original content
+
+ L<crontab(5)/"DESCRIPTION">
+ => undef, # link text
+ '"DESCRIPTION" in crontab(5)', # possibly inferred link text
+ "crontab(5)", # name
+ "DESCRIPTION", # section
+ 'man', # what sort of link
+ 'crontab(5)/"DESCRIPTION"' # original content
+
+ L</Object Attributes>
+ => undef, # link text
+ '"Object Attributes"', # possibly inferred link text
+ undef, # name
+ "Object Attributes", # section
+ 'pod', # what sort of link
+ "/Object Attributes" # original content
+
+ L<http://www.perl.org/>
+ => undef, # link text
+ "http://www.perl.org/", # possibly inferred link text
+ "http://www.perl.org/", # name
+ undef, # section
+ 'url', # what sort of link
+ "http://www.perl.org/" # original content
+
+ L<Perl.org|http://www.perl.org/>
+ => "Perl.org", # link text
+ "http://www.perl.org/", # possibly inferred link text
+ "http://www.perl.org/", # name
+ undef, # section
+ 'url', # what sort of link
+ "Perl.org|http://www.perl.org/" # original content
+
+Note that you can distinguish URL-links from anything else by the
+fact that they match C<m/\A\w+:[^:\s]\S*\z/>. So
+C<LE<lt>http://www.perl.comE<gt>> is a URL, but
+C<LE<lt>HTTP::ResponseE<gt>> isn't.
+
+=item *
+
+In case of LE<lt>...> codes with no "text|" part in them,
+older formatters have exhibited great variation in actually displaying
+the link or cross reference. For example, LE<lt>crontab(5)> would render
+as "the C<crontab(5)> manpage", or "in the C<crontab(5)> manpage"
+or just "C<crontab(5)>".
+
+Pod processors must now treat "text|"-less links as follows:
+
+ L<name> => L<name|name>
+ L</section> => L<"section"|/section>
+ L<name/section> => L<"section" in name|name/section>
+
+=item *
+
+Note that section names might contain markup. I.e., if a section
+starts with:
+
+ =head2 About the C<-M> Operator
+
+or with:
+
+ =item About the C<-M> Operator
+
+then a link to it would look like this:
+
+ L<somedoc/About the C<-M> Operator>
+
+Formatters may choose to ignore the markup for purposes of resolving
+the link and use only the renderable characters in the section name,
+as in:
+
+ <h1><a name="About_the_-M_Operator">About the <code>-M</code>
+ Operator</h1>
+
+ ...
+
+ <a href="somedoc#About_the_-M_Operator">About the <code>-M</code>
+ Operator" in somedoc</a>
+
+=item *
+
+Previous versions of perlpod distinguished C<LE<lt>name/"section"E<gt>>
+links from C<LE<lt>name/itemE<gt>> links (and their targets). These
+have been merged syntactically and semantically in the current
+specification, and I<section> can refer either to a "=headI<n> Heading
+Content" command or to a "=item Item Content" command. This
+specification does not specify what behavior should be in the case
+of a given document having several things all seeming to produce the
+same I<section> identifier (e.g., in HTML, several things all producing
+the same I<anchorname> in <a name="I<anchorname>">...</a>
+elements). Where Pod processors can control this behavior, they should
+use the first such anchor. That is, C<LE<lt>Foo/BarE<gt>> refers to the
+I<first> "Bar" section in Foo.
+
+But for some processors/formats this cannot be easily controlled; as
+with the HTML example, the behavior of multiple ambiguous
+<a name="I<anchorname>">...</a> is most easily just left up to
+browsers to decide.
+
+=item *
+
+Authors wanting to link to a particular (absolute) URL, must do so
+only with "LE<lt>scheme:...>" codes (like
+LE<lt>http://www.perl.org>), and must not attempt "LE<lt>Some Site
+Name|scheme:...>" codes. This restriction avoids many problems
+in parsing and rendering LE<lt>...> codes.
+
+=item *
+
+In a C<LE<lt>text|...E<gt>> code, text may contain formatting codes
+for formatting or for EE<lt>...> escapes, as in:
+
+ L<B<ummE<234>stuff>|...>
+
+For C<LE<lt>...E<gt>> codes without a "name|" part, only
+C<EE<lt>...E<gt>> and C<ZE<lt>E<gt>> codes may occur -- no
+other formatting codes. That is, authors should not use
+"C<LE<lt>BE<lt>Foo::BarE<gt>E<gt>>".
+
+Note, however, that formatting codes and ZE<lt>>'s can occur in any
+and all parts of an LE<lt>...> (i.e., in I<name>, I<section>, I<text>,
+and I<url>).
+
+Authors must not nest LE<lt>...> codes. For example, "LE<lt>The
+LE<lt>Foo::Bar> man page>" should be treated as an error.
+
+=item *
+
+Note that Pod authors may use formatting codes inside the "text"
+part of "LE<lt>text|name>" (and so on for LE<lt>text|/"sec">).
+
+In other words, this is valid:
+
+ Go read L<the docs on C<$.>|perlvar/"$.">
+
+Some output formats that do allow rendering "LE<lt>...>" codes as
+hypertext, might not allow the link-text to be formatted; in
+that case, formatters will have to just ignore that formatting.
+
+=item *
+
+At time of writing, C<LE<lt>nameE<gt>> values are of two types:
+either the name of a Pod page like C<LE<lt>Foo::BarE<gt>> (which
+might be a real Perl module or program in an @INC / PATH
+directory, or a .pod file in those places); or the name of a UNIX
+man page, like C<LE<lt>crontab(5)E<gt>>. In theory, C<LE<lt>chmodE<gt>>
+in ambiguous between a Pod page called "chmod", or the Unix man page
+"chmod" (in whatever man-section). However, the presence of a string
+in parens, as in "crontab(5)", is sufficient to signal that what
+is being discussed is not a Pod page, and so is presumably a
+UNIX man page. The distinction is of no importance to many
+Pod processors, but some processors that render to hypertext formats
+may need to distinguish them in order to know how to render a
+given C<LE<lt>fooE<gt>> code.
+
+=item *
+
+Previous versions of perlpod allowed for a C<LE<lt>sectionE<gt>> syntax (as in
+C<LE<lt>Object AttributesE<gt>>), which was not easily distinguishable from
+C<LE<lt>nameE<gt>> syntax and for C<LE<lt>"section"E<gt>> which was only
+slightly less ambiguous. This syntax is no longer in the specification, and
+has been replaced by the C<LE<lt>/sectionE<gt>> syntax (where the slash was
+formerly optional). Pod parsers should tolerate the C<LE<lt>"section"E<gt>>
+syntax, for a while at least. The suggested heuristic for distinguishing
+C<LE<lt>sectionE<gt>> from C<LE<lt>nameE<gt>> is that if it contains any
+whitespace, it's a I<section>. Pod processors should warn about this being
+deprecated syntax.
+
+=back
+
+=head1 About =over...=back Regions
+
+"=over"..."=back" regions are used for various kinds of list-like
+structures. (I use the term "region" here simply as a collective
+term for everything from the "=over" to the matching "=back".)
+
+=over
+
+=item *
+
+The non-zero numeric I<indentlevel> in "=over I<indentlevel>" ...
+"=back" is used for giving the formatter a clue as to how many
+"spaces" (ems, or roughly equivalent units) it should tab over,
+although many formatters will have to convert this to an absolute
+measurement that may not exactly match with the size of spaces (or M's)
+in the document's base font. Other formatters may have to completely
+ignore the number. The lack of any explicit I<indentlevel> parameter is
+equivalent to an I<indentlevel> value of 4. Pod processors may
+complain if I<indentlevel> is present but is not a positive number
+matching C<m/\A(\d*\.)?\d+\z/>.
+
+=item *
+
+Authors of Pod formatters are reminded that "=over" ... "=back" may
+map to several different constructs in your output format. For
+example, in converting Pod to (X)HTML, it can map to any of
+<ul>...</ul>, <ol>...</ol>, <dl>...</dl>, or
+<blockquote>...</blockquote>. Similarly, "=item" can map to <li> or
+<dt>.
+
+=item *
+
+Each "=over" ... "=back" region should be one of the following:
+
+=over
+
+=item *
+
+An "=over" ... "=back" region containing only "=item *" commands,
+each followed by some number of ordinary/verbatim paragraphs, other
+nested "=over" ... "=back" regions, "=for..." paragraphs, and
+"=begin"..."=end" regions.
+
+(Pod processors must tolerate a bare "=item" as if it were "=item
+*".) Whether "*" is rendered as a literal asterisk, an "o", or as
+some kind of real bullet character, is left up to the Pod formatter,
+and may depend on the level of nesting.
+
+=item *
+
+An "=over" ... "=back" region containing only
+C<m/\A=item\s+\d+\.?\s*\z/> paragraphs, each one (or each group of them)
+followed by some number of ordinary/verbatim paragraphs, other nested
+"=over" ... "=back" regions, "=for..." paragraphs, and/or
+"=begin"..."=end" codes. Note that the numbers must start at 1
+in each section, and must proceed in order and without skipping
+numbers.
+
+(Pod processors must tolerate lines like "=item 1" as if they were
+"=item 1.", with the period.)
+
+=item *
+
+An "=over" ... "=back" region containing only "=item [text]"
+commands, each one (or each group of them) followed by some number of
+ordinary/verbatim paragraphs, other nested "=over" ... "=back"
+regions, or "=for..." paragraphs, and "=begin"..."=end" regions.
+
+The "=item [text]" paragraph should not match
+C<m/\A=item\s+\d+\.?\s*\z/> or C<m/\A=item\s+\*\s*\z/>, nor should it
+match just C<m/\A=item\s*\z/>.
+
+=item *
+
+An "=over" ... "=back" region containing no "=item" paragraphs at
+all, and containing only some number of
+ordinary/verbatim paragraphs, and possibly also some nested "=over"
+... "=back" regions, "=for..." paragraphs, and "=begin"..."=end"
+regions. Such an itemless "=over" ... "=back" region in Pod is
+equivalent in meaning to a "<blockquote>...</blockquote>" element in
+HTML.
+
+=back
+
+Note that with all the above cases, you can determine which type of
+"=over" ... "=back" you have, by examining the first (non-"=cut",
+non-"=pod") Pod paragraph after the "=over" command.
+
+=item *
+
+Pod formatters I<must> tolerate arbitrarily large amounts of text
+in the "=item I<text...>" paragraph. In practice, most such
+paragraphs are short, as in:
+
+ =item For cutting off our trade with all parts of the world
+
+But they may be arbitrarily long:
+
+ =item For transporting us beyond seas to be tried for pretended
+ offenses
+
+ =item He is at this time transporting large armies of foreign
+ mercenaries to complete the works of death, desolation and
+ tyranny, already begun with circumstances of cruelty and perfidy
+ scarcely paralleled in the most barbarous ages, and totally
+ unworthy the head of a civilized nation.
+
+=item *
+
+Pod processors should tolerate "=item *" / "=item I<number>" commands
+with no accompanying paragraph. The middle item is an example:
+
+ =over
+
+ =item 1
+
+ Pick up dry cleaning.
+
+ =item 2
+
+ =item 3
+
+ Stop by the store. Get Abba Zabas, Stoli, and cheap lawn chairs.
+
+ =back
+
+=item *
+
+No "=over" ... "=back" region can contain headings. Processors may
+treat such a heading as an error.
+
+=item *
+
+Note that an "=over" ... "=back" region should have some
+content. That is, authors should not have an empty region like this:
+
+ =over
+
+ =back
+
+Pod processors seeing such a contentless "=over" ... "=back" region,
+may ignore it, or may report it as an error.
+
+=item *
+
+Processors must tolerate an "=over" list that goes off the end of the
+document (i.e., which has no matching "=back"), but they may warn
+about such a list.
+
+=item *
+
+Authors of Pod formatters should note that this construct:
+
+ =item Neque
+
+ =item Porro
+
+ =item Quisquam Est
+
+ Qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+ velit, sed quia non numquam eius modi tempora incidunt ut
+ labore et dolore magnam aliquam quaerat voluptatem.
+
+ =item Ut Enim
+
+is semantically ambiguous, in a way that makes formatting decisions
+a bit difficult. On the one hand, it could be mention of an item
+"Neque", mention of another item "Porro", and mention of another
+item "Quisquam Est", with just the last one requiring the explanatory
+paragraph "Qui dolorem ipsum quia dolor..."; and then an item
+"Ut Enim". In that case, you'd want to format it like so:
+
+ Neque
+
+ Porro
+
+ Quisquam Est
+ Qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+ velit, sed quia non numquam eius modi tempora incidunt ut
+ labore et dolore magnam aliquam quaerat voluptatem.
+
+ Ut Enim
+
+But it could equally well be a discussion of three (related or equivalent)
+items, "Neque", "Porro", and "Quisquam Est", followed by a paragraph
+explaining them all, and then a new item "Ut Enim". In that case, you'd
+probably want to format it like so:
+
+ Neque
+ Porro
+ Quisquam Est
+ Qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+ velit, sed quia non numquam eius modi tempora incidunt ut
+ labore et dolore magnam aliquam quaerat voluptatem.
+
+ Ut Enim
+
+But (for the foreseeable future), Pod does not provide any way for Pod
+authors to distinguish which grouping is meant by the above
+"=item"-cluster structure. So formatters should format it like so:
+
+ Neque
+
+ Porro
+
+ Quisquam Est
+
+ Qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+ velit, sed quia non numquam eius modi tempora incidunt ut
+ labore et dolore magnam aliquam quaerat voluptatem.
+
+ Ut Enim
+
+That is, there should be (at least roughly) equal spacing between
+items as between paragraphs (although that spacing may well be less
+than the full height of a line of text). This leaves it to the reader
+to use (con)textual cues to figure out whether the "Qui dolorem
+ipsum..." paragraph applies to the "Quisquam Est" item or to all three
+items "Neque", "Porro", and "Quisquam Est". While not an ideal
+situation, this is preferable to providing formatting cues that may
+be actually contrary to the author's intent.
+
+=back
+
+
+
+=head1 About Data Paragraphs and "=begin/=end" Regions
+
+Data paragraphs are typically used for inlining non-Pod data that is
+to be used (typically passed through) when rendering the document to
+a specific format:
+
+ =begin rtf
+
+ \par{\pard\qr\sa4500{\i Printed\~\chdate\~\chtime}\par}
+
+ =end rtf
+
+The exact same effect could, incidentally, be achieved with a single
+"=for" paragraph:
+
+ =for rtf \par{\pard\qr\sa4500{\i Printed\~\chdate\~\chtime}\par}
+
+(Although that is not formally a data paragraph, it has the same
+meaning as one, and Pod parsers may parse it as one.)
+
+Another example of a data paragraph:
+
+ =begin html
+
+ I like <em>PIE</em>!
+
+ <hr>Especially pecan pie!
+
+ =end html
+
+If these were ordinary paragraphs, the Pod parser would try to
+expand the "EE<lt>/em>" (in the first paragraph) as a formatting
+code, just like "EE<lt>lt>" or "EE<lt>eacute>". But since this
+is in a "=begin I<identifier>"..."=end I<identifier>" region I<and>
+the identifier "html" doesn't begin have a ":" prefix, the contents
+of this region are stored as data paragraphs, instead of being
+processed as ordinary paragraphs (or if they began with a spaces
+and/or tabs, as verbatim paragraphs).
+
+As a further example: At time of writing, no "biblio" identifier is
+supported, but suppose some processor were written to recognize it as
+a way of (say) denoting a bibliographic reference (necessarily
+containing formatting codes in ordinary paragraphs). The fact that
+"biblio" paragraphs were meant for ordinary processing would be
+indicated by prefacing each "biblio" identifier with a colon:
+
+ =begin :biblio
+
+ Wirth, Niklaus. 1976. I<Algorithms + Data Structures =
+ Programs.> Prentice-Hall, Englewood Cliffs, NJ.
+
+ =end :biblio
+
+This would signal to the parser that paragraphs in this begin...end
+region are subject to normal handling as ordinary/verbatim paragraphs
+(while still tagged as meant only for processors that understand the
+"biblio" identifier). The same effect could be had with:
+
+ =for :biblio
+ Wirth, Niklaus. 1976. I<Algorithms + Data Structures =
+ Programs.> Prentice-Hall, Englewood Cliffs, NJ.
+
+The ":" on these identifiers means simply "process this stuff
+normally, even though the result will be for some special target".
+I suggest that parser APIs report "biblio" as the target identifier,
+but also report that it had a ":" prefix. (And similarly, with the
+above "html", report "html" as the target identifier, and note the
+I<lack> of a ":" prefix.)
+
+Note that a "=begin I<identifier>"..."=end I<identifier>" region where
+I<identifier> begins with a colon, I<can> contain commands. For example:
+
+ =begin :biblio
+
+ Wirth's classic is available in several editions, including:
+
+ =for comment
+ hm, check abebooks.com for how much used copies cost.
+
+ =over
+
+ =item
+
+ Wirth, Niklaus. 1975. I<Algorithmen und Datenstrukturen.>
+ Teubner, Stuttgart. [Yes, it's in German.]
+
+ =item
+
+ Wirth, Niklaus. 1976. I<Algorithms + Data Structures =
+ Programs.> Prentice-Hall, Englewood Cliffs, NJ.
+
+ =back
+
+ =end :biblio
+
+Note, however, a "=begin I<identifier>"..."=end I<identifier>"
+region where I<identifier> does I<not> begin with a colon, should not
+directly contain "=head1" ... "=head4" commands, nor "=over", nor "=back",
+nor "=item". For example, this may be considered invalid:
+
+ =begin somedata
+
+ This is a data paragraph.
+
+ =head1 Don't do this!
+
+ This is a data paragraph too.
+
+ =end somedata
+
+A Pod processor may signal that the above (specifically the "=head1"
+paragraph) is an error. Note, however, that the following should
+I<not> be treated as an error:
+
+ =begin somedata
+
+ This is a data paragraph.
+
+ =cut
+
+ # Yup, this isn't Pod anymore.
+ sub excl { (rand() > .5) ? "hoo!" : "hah!" }
+
+ =pod
+
+ This is a data paragraph too.
+
+ =end somedata
+
+And this too is valid:
+
+ =begin someformat
+
+ This is a data paragraph.
+
+ And this is a data paragraph.
+
+ =begin someotherformat
+
+ This is a data paragraph too.
+
+ And this is a data paragraph too.
+
+ =begin :yetanotherformat
+
+ =head2 This is a command paragraph!
+
+ This is an ordinary paragraph!
+
+ And this is a verbatim paragraph!
+
+ =end :yetanotherformat
+
+ =end someotherformat
+
+ Another data paragraph!
+
+ =end someformat
+
+The contents of the above "=begin :yetanotherformat" ...
+"=end :yetanotherformat" region I<aren't> data paragraphs, because
+the immediately containing region's identifier (":yetanotherformat")
+begins with a colon. In practice, most regions that contain
+data paragraphs will contain I<only> data paragraphs; however,
+the above nesting is syntactically valid as Pod, even if it is
+rare. However, the handlers for some formats, like "html",
+will accept only data paragraphs, not nested regions; and they may
+complain if they see (targeted for them) nested regions, or commands,
+other than "=end", "=pod", and "=cut".
+
+Also consider this valid structure:
+
+ =begin :biblio
+
+ Wirth's classic is available in several editions, including:
+
+ =over
+
+ =item
+
+ Wirth, Niklaus. 1975. I<Algorithmen und Datenstrukturen.>
+ Teubner, Stuttgart. [Yes, it's in German.]
+
+ =item
+
+ Wirth, Niklaus. 1976. I<Algorithms + Data Structures =
+ Programs.> Prentice-Hall, Englewood Cliffs, NJ.
+
+ =back
+
+ Buy buy buy!
+
+ =begin html
+
+ <img src='wirth_spokesmodeling_book.png'>
+
+ <hr>
+
+ =end html
+
+ Now now now!
+
+ =end :biblio
+
+There, the "=begin html"..."=end html" region is nested inside
+the larger "=begin :biblio"..."=end :biblio" region. Note that the
+content of the "=begin html"..."=end html" region is data
+paragraph(s), because the immediately containing region's identifier
+("html") I<doesn't> begin with a colon.
+
+Pod parsers, when processing a series of data paragraphs one
+after another (within a single region), should consider them to
+be one large data paragraph that happens to contain blank lines. So
+the content of the above "=begin html"..."=end html" I<may> be stored
+as two data paragraphs (one consisting of
+"<img src='wirth_spokesmodeling_book.png'>\n"
+and another consisting of "<hr>\n"), but I<should> be stored as
+a single data paragraph (consisting of
+"<img src='wirth_spokesmodeling_book.png'>\n\n<hr>\n").
+
+Pod processors should tolerate empty
+"=begin I<something>"..."=end I<something>" regions,
+empty "=begin :I<something>"..."=end :I<something>" regions, and
+contentless "=for I<something>" and "=for :I<something>"
+paragraphs. I.e., these should be tolerated:
+
+ =for html
+
+ =begin html
+
+ =end html
+
+ =begin :biblio
+
+ =end :biblio
+
+Incidentally, note that there's no easy way to express a data
+paragraph starting with something that looks like a command. Consider:
+
+ =begin stuff
+
+ =shazbot
+
+ =end stuff
+
+There, "=shazbot" will be parsed as a Pod command "shazbot", not as a data
+paragraph "=shazbot\n". However, you can express a data paragraph consisting
+of "=shazbot\n" using this code:
+
+ =for stuff =shazbot
+
+The situation where this is necessary, is presumably quite rare.
+
+Note that =end commands must match the currently open =begin command. That
+is, they must properly nest. For example, this is valid:
+
+ =begin outer
+
+ X
+
+ =begin inner
+
+ Y
+
+ =end inner
+
+ Z
+
+ =end outer
+
+while this is invalid:
+
+ =begin outer
+
+ X
+
+ =begin inner
+
+ Y
+
+ =end outer
+
+ Z
+
+ =end inner
+
+This latter is improper because when the "=end outer" command is seen, the
+currently open region has the formatname "inner", not "outer". (It just
+happens that "outer" is the format name of a higher-up region.) This is
+an error. Processors must by default report this as an error, and may halt
+processing the document containing that error. A corollary of this is that
+regions cannot "overlap" -- i.e., the latter block above does not represent
+a region called "outer" which contains X and Y, overlapping a region called
+"inner" which contains Y and Z. But because it is invalid (as all
+apparently overlapping regions would be), it doesn't represent that, or
+anything at all.
+
+Similarly, this is invalid:
+
+ =begin thing
+
+ =end hting
+
+This is an error because the region is opened by "thing", and the "=end"
+tries to close "hting" [sic].
+
+This is also invalid:
+
+ =begin thing
+
+ =end
+
+This is invalid because every "=end" command must have a formatname
+parameter.
+
+=head1 SEE ALSO
+
+L<perlpod>, L<perlsyn/"PODs: Embedded Documentation">,
+L<podchecker>
+
+=head1 AUTHOR
+
+Sean M. Burke
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pip.pm b/Master/tlpkg/tlperl.straw/lib/pip.pm
new file mode 100755
index 00000000000..eda1540419c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pip.pm
@@ -0,0 +1,375 @@
+package pip;
+
+use 5.00503;
+use strict;
+use File::Spec ();
+use File::Temp ();
+use File::Which ();
+use Getopt::Long ();
+use URI::file ();
+use Module::Plan::Base ();
+
+use vars qw{$VERSION};
+BEGIN {
+ $VERSION = '1.16';
+}
+
+
+
+
+
+#####################################################################
+# Main Function
+
+# Save a copy of @ARGV for error messages
+my $install = 0;
+Getopt::Long::GetOptions(
+ install => \$install,
+);
+
+sub main {
+ unless ( @ARGV ) {
+ error("Did not provide a command");
+ }
+
+ # If the first argument is a file, install it
+ if ( $ARGV[0] =~ /^https?\:\/\// ) {
+ return fetch_any($ARGV[0]);
+ }
+ if ( -f $ARGV[0] ) {
+ return install_any($ARGV[0]);
+ }
+
+ error("Unknown or unsupported command '$ARGV[0]'");
+}
+
+sub fetch_any {
+ my $uri = $_[0];
+
+ # Handle tarballs via a custom Module::Plan::Lite object.
+ # Also handle PAR archives
+ if ( $uri =~ /\.(?:par|zip|tar\.gz)$/ ) {
+ require Module::Plan::Lite;
+ my $plan = Module::Plan::Lite->new(
+ p5i => 'default.p5i',
+ lines => [ '', $uri ],
+ );
+ $plan->run;
+ return 1;
+ }
+
+ # P5I files can have a plan created for the remote URI
+ if ( $uri =~ /\.p5i$/ ) {
+ require Module::Plan::Lite;
+ my $plan = Module::Plan::Lite->new(
+ p5i => $uri,
+ );
+ $plan->run;
+ return 1;
+ }
+
+ # We don't yet support remote p5z files
+ if ( $uri =~ /\.p5z$/ ) {
+ error("Remote p5z installation is not yet supported");
+ }
+
+ error("Unknown or unsupported uri '$uri'");
+}
+
+sub install_any {
+ # Load the plan
+ my $plan = read_any(@_);
+
+ # Run it
+ $plan->run;
+
+ return 1;
+}
+
+sub read_any {
+ my $param = $_[0];
+
+ # If the first argument is a tar.gz file, hand off to install
+ if ( $param =~ /\.(?:zip|tar\.gz)$/ ) {
+ return read_archive(@_);
+ }
+
+ # If the first argument is a par file, hand off to install
+ if ( $param =~ /\.par$/ ) {
+ return read_archive(@_);
+ }
+
+ # If the first argument is a p5i file, hand off to read
+ if ( $param =~ /\.p5i$/ ) {
+ return read_p5i(@_);
+ }
+
+ # If the first argument is a p5z file, hand off to instal
+ if ( $param =~ /\.p5z$/ ) {
+ return read_p5z(@_);
+ }
+
+ error("Unknown or unsupported file '$param'");
+}
+
+# Create the plan object from a file
+sub read_p5i {
+ my $pip = @_
+ ? shift
+ : File::Spec->curdir;
+ if ( -d $pip ) {
+ $pip = File::Spec->catfile( $pip, 'default.p5i' );
+ }
+ $pip = File::Spec->rel2abs( $pip );
+ unless ( -f $pip ) {
+ error( "The plan file $pip does not exist" );
+ }
+
+ # Create the plan object
+ my $plan = eval {
+ Module::Plan::Base->read( $pip );
+ };
+ if ( $@ ) {
+ unless ( $@ =~ /The sources directory is not owned by the current user/ ) {
+ # Rethrow the error
+ die $@;
+ }
+
+ # Generate an appropriate error
+ my @msg = (
+ "The current user does not control the default CPAN client",
+ );
+ if ( File::Which::which('sudo') ) {
+ my $cmd = join(' ', 'sudo', '-H', $0, @_);
+ push @msg, "You may need to try again with the following command:";
+ push @msg, "";
+ push @msg, " $cmd";
+ }
+ error( @msg );
+ }
+
+ return $plan;
+}
+
+sub read_archive {
+ my $archive = File::Spec->rel2abs(shift);
+ unless ( -f $archive ) {
+ error("Filed does no exist: $archive");
+ }
+ require Module::Plan::Lite;
+ Module::Plan::Lite->new(
+ p5i => 'default.p5i',
+ lines => [ '', URI::file->new($archive)->as_string ],
+ );
+}
+
+sub read_p5z {
+ my $p5z = File::Spec->rel2abs(shift);
+ unless ( -f $p5z ) {
+ error("File does not exist: $p5z");
+ }
+
+ # Create the temp directory
+ my $dir = File::Temp::tempdir( CLEANUP => 1 );
+ my $pushd = File::pushd::pushd( $dir );
+
+ # Extract the tarball
+ require Archive::Tar;
+ my @files = Archive::Tar->extract_archive( $p5z, 1 );
+ unless ( @files ) {
+ error( "Failed to extract P5Z file: " . Archive::Tar->error );
+ }
+
+ # Find the plan
+ my $path = File::Spec->catfile( $dir, 'default.p5i' );
+ unless ( -f $path ) {
+ error("P5Z file did not contain a default.p5i");
+ }
+
+ # Load the plan
+ return read_p5i( $path );
+}
+
+
+
+
+
+#####################################################################
+# Support Functions
+
+sub error {
+ print "\n";
+ print map { $_ . "\n" } @_;
+ exit(255);
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+pip - The Perl Installation Program, for scripted and third-party
+distribution installation.
+
+=head1 DESCRIPTION
+
+The B<pip> ("Perl Installation Program") console application is used to
+install Perl distributions in a wide variety of formats, both from CPAN
+and from external third-party locations, while supporting module
+dependencies that go across the boundary from third-party to CPAN.
+
+Using B<pip> you can install CPAN modules, arbitrary tarballs from both
+the local file-system or across the internet from arbitrary URIs.
+
+You can use B<pip> to ensure that specific versions of CPAN modules are
+installed I<instead> of the most current version.
+
+And beyond just single installations, you script script a series of
+these installations by creating a "P5I" (Perl 5 Installation) file.
+
+A Perl 5 Installation (P5I) file is a small script-like file that
+describes a set of distributions to install, and integrates the
+installation of these distributions with the CPAN installer.
+
+The primary use of P5I files are for installing proprietary or
+non-CPAN software that may still require the installation of a
+number of CPAN dependencies in order to function.
+
+P5I files are also extensible, with the first line of the file
+specifying the name of the Perl class that implements the plan.
+
+For the moment, the class described at the top of the P5I file
+must be installed.
+
+The simple L<Module::Plan::Lite> plan class is bundled with the main
+distribution, and additional types can be installed if needed.
+
+=head2 Future Additions
+
+Also on the development schedule for B<pip> is the creation and
+installation of distributions via "P5Z" files, which are tarballs
+containing a P5I file, as well as all the distribution tarballs
+referenced by the P5I file.
+
+It is also anticipated that B<pip> will gain support for L<PAR>
+binary packages and potentially also for ActivePerl L<PPM> files.
+
+=head1 USAGE
+
+The primary use of F<pip> is to install from a P5I script, with the
+canonical use case as follows:
+
+ pip directory/myplan.p5i
+
+This command will load the plan file F<directory/myplan.p5i>, create
+the plan, and then execute it.
+
+If only a directory name is given, F<pip> will look for a F<default.p5i>
+plan in the directory. Thus, all of the following are equivalent
+
+ pip directory
+ pip directory/
+ pip directory/default.p5i
+
+If no target is provided at all, then the current directory will be used.
+Thus, the following are equivalent
+
+ pip
+ pip .
+ pip default.p5i
+ pip ./default.p5i
+
+=head2 Syntax of a plan file
+
+Initially, the only plan is available is the L<Module::Plan::Lite>
+(MPL) plan.
+
+A typical MPL plan will look like the following
+
+ # myplan.p5i
+ Module::Plan::Lite
+
+ Process-0.17.tar.gz
+ YAML-Tiny-0.10.tar.gz
+
+=head2 Direct installation of a single tarball
+
+With the functionality available in F<pip>, you can find that sometimes
+you don't even want to make a file at all, you just want to install a
+single tarball.
+
+The C<-i> option lets you pass the name of a single file and it will treat
+it as an installer for that single file. Further, if the extention of the
+tarball is .tar.gz, the B<-i> option is implied.
+
+For example, the following are equivalent.
+
+ # Installing with the -i|--install option
+ > pip Process-0.17.tar.gz
+ > pip -i Process-0.17.tar.gz
+ > pip --install Process-0.17.tar.gz
+
+ # Installing from the file as normal
+ > pip ./default.p5i
+
+ # myplan.p5i
+ Module::Plan::Lite
+
+ Process-0.17.tar.gz
+
+The C<-i> option can be used with any single value supported by
+L<Module::Plan::Lite> (see above).
+
+This means you can also use B<pip> to install a distribution from any
+arbitrary URI, including installing direct from a subversion repository.
+
+ > pip http://svn.ali.as/cpan/release/Process-0.17.tar.gz
+
+=head1 SUPPORT
+
+This module is stored in an Open Repository at the following address.
+
+L<http://svn.ali.as/cpan/trunk/pip>
+
+Write access to the repository is made available automatically to any
+published CPAN author, and to most other volunteers on request.
+
+If you are able to submit your bug report in the form of new (failing)
+unit tests, or can apply your fix directly instead of submitting a patch,
+you are B<strongly> encouraged to do so. The author currently maintains
+over 100 modules and it may take some time to deal with non-Critical bug
+reports or patches.
+
+This will guarentee that your issue will be addressed in the next
+release of the module.
+
+If you cannot provide a direct test or fix, or don't have time to do so,
+then regular bug reports are still accepted and appreciated via the CPAN
+bug tracker.
+
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=pip>
+
+For other issues, for commercial enhancement and support, or to have your
+write access enabled for the repository, contact the author at the email
+address above.
+
+=head1 AUTHORS
+
+Adam Kennedy E<lt>adamk@cpan.orgE<gt>
+
+=head1 SEE ALSO
+
+L<Module::Plan::Base>, L<Module::Plan::Lite>, L<Module::Plan>
+
+=head1 COPYRIGHT
+
+Copyright 2006 - 2009 Adam Kennedy.
+
+This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+The full text of the license can be found in the
+LICENSE file included with this module.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/a2p.pod b/Master/tlpkg/tlperl.straw/lib/pods/a2p.pod
new file mode 100755
index 00000000000..4b66771b361
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/a2p.pod
@@ -0,0 +1,179 @@
+=head1 NAME
+
+a2p - Awk to Perl translator
+
+=head1 SYNOPSIS
+
+B<a2p> [I<options>] [I<filename>]
+
+=head1 DESCRIPTION
+
+I<A2p> takes an awk script specified on the command line (or from
+standard input) and produces a comparable I<perl> script on the
+standard output.
+
+=head2 OPTIONS
+
+Options include:
+
+=over 5
+
+=item B<-DE<lt>numberE<gt>>
+
+sets debugging flags.
+
+=item B<-FE<lt>characterE<gt>>
+
+tells a2p that this awk script is always invoked with this B<-F>
+switch.
+
+=item B<-nE<lt>fieldlistE<gt>>
+
+specifies the names of the input fields if input does not have to be
+split into an array. If you were translating an awk script that
+processes the password file, you might say:
+
+ a2p -7 -nlogin.password.uid.gid.gcos.shell.home
+
+Any delimiter can be used to separate the field names.
+
+=item B<-E<lt>numberE<gt>>
+
+causes a2p to assume that input will always have that many fields.
+
+=item B<-o>
+
+tells a2p to use old awk behavior. The only current differences are:
+
+=over 5
+
+=item *
+
+Old awk always has a line loop, even if there are no line
+actions, whereas new awk does not.
+
+=item *
+
+In old awk, sprintf is extremely greedy about its arguments.
+For example, given the statement
+
+ print sprintf(some_args), extra_args;
+
+old awk considers I<extra_args> to be arguments to C<sprintf>; new awk
+considers them arguments to C<print>.
+
+=back
+
+=back
+
+=head2 "Considerations"
+
+A2p cannot do as good a job translating as a human would, but it
+usually does pretty well. There are some areas where you may want to
+examine the perl script produced and tweak it some. Here are some of
+them, in no particular order.
+
+There is an awk idiom of putting int() around a string expression to
+force numeric interpretation, even though the argument is always
+integer anyway. This is generally unneeded in perl, but a2p can't
+tell if the argument is always going to be integer, so it leaves it
+in. You may wish to remove it.
+
+Perl differentiates numeric comparison from string comparison. Awk
+has one operator for both that decides at run time which comparison to
+do. A2p does not try to do a complete job of awk emulation at this
+point. Instead it guesses which one you want. It's almost always
+right, but it can be spoofed. All such guesses are marked with the
+comment "C<#???>". You should go through and check them. You might
+want to run at least once with the B<-w> switch to perl, which will
+warn you if you use == where you should have used eq.
+
+Perl does not attempt to emulate the behavior of awk in which
+nonexistent array elements spring into existence simply by being
+referenced. If somehow you are relying on this mechanism to create
+null entries for a subsequent for...in, they won't be there in perl.
+
+If a2p makes a split line that assigns to a list of variables that
+looks like (Fld1, Fld2, Fld3...) you may want to rerun a2p using the
+B<-n> option mentioned above. This will let you name the fields
+throughout the script. If it splits to an array instead, the script
+is probably referring to the number of fields somewhere.
+
+The exit statement in awk doesn't necessarily exit; it goes to the END
+block if there is one. Awk scripts that do contortions within the END
+block to bypass the block under such circumstances can be simplified
+by removing the conditional in the END block and just exiting directly
+from the perl script.
+
+Perl has two kinds of array, numerically-indexed and associative.
+Perl associative arrays are called "hashes". Awk arrays are usually
+translated to hashes, but if you happen to know that the index is
+always going to be numeric you could change the {...} to [...].
+Iteration over a hash is done using the keys() function, but iteration
+over an array is NOT. You might need to modify any loop that iterates
+over such an array.
+
+Awk starts by assuming OFMT has the value %.6g. Perl starts by
+assuming its equivalent, $#, to have the value %.20g. You'll want to
+set $# explicitly if you use the default value of OFMT.
+
+Near the top of the line loop will be the split operation that is
+implicit in the awk script. There are times when you can move this
+down past some conditionals that test the entire record so that the
+split is not done as often.
+
+For aesthetic reasons you may wish to change the array base $[ from 1
+back to perl's default of 0, but remember to change all array
+subscripts AND all substr() and index() operations to match.
+
+Cute comments that say "# Here is a workaround because awk is dumb"
+are passed through unmodified.
+
+Awk scripts are often embedded in a shell script that pipes stuff into
+and out of awk. Often the shell script wrapper can be incorporated
+into the perl script, since perl can start up pipes into and out of
+itself, and can do other things that awk can't do by itself.
+
+Scripts that refer to the special variables RSTART and RLENGTH can
+often be simplified by referring to the variables $`, $& and $', as
+long as they are within the scope of the pattern match that sets them.
+
+The produced perl script may have subroutines defined to deal with
+awk's semantics regarding getline and print. Since a2p usually picks
+correctness over efficiency. it is almost always possible to rewrite
+such code to be more efficient by discarding the semantic sugar.
+
+For efficiency, you may wish to remove the keyword from any return
+statement that is the last statement executed in a subroutine. A2p
+catches the most common case, but doesn't analyze embedded blocks for
+subtler cases.
+
+ARGV[0] translates to $ARGV0, but ARGV[n] translates to $ARGV[$n]. A
+loop that tries to iterate over ARGV[0] won't find it.
+
+=head1 ENVIRONMENT
+
+A2p uses no environment variables.
+
+=head1 AUTHOR
+
+Larry Wall E<lt>F<larry@wall.org>E<gt>
+
+=head1 FILES
+
+=head1 SEE ALSO
+
+ perl The perl compiler/interpreter
+
+ s2p sed to perl translator
+
+=head1 DIAGNOSTICS
+
+=head1 BUGS
+
+It would be possible to emulate awk's behavior in selecting string
+versus numeric operations at run time by inspection of the operands,
+but it would be gross and inefficient. Besides, a2p almost always
+guesses right.
+
+Storage for the awk syntax tree is currently static, and can run out.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl.pod
new file mode 100755
index 00000000000..939c6834655
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl.pod
@@ -0,0 +1,468 @@
+=head1 NAME
+
+perl - Practical Extraction and Report Language
+
+=head1 SYNOPSIS
+
+B<perl> S<[ B<-sTtuUWX> ]>
+ S<[ B<-hv> ] [ B<-V>[:I<configvar>] ]>
+ S<[ B<-cw> ] [ B<-d>[B<t>][:I<debugger>] ] [ B<-D>[I<number/list>] ]>
+ S<[ B<-pna> ] [ B<-F>I<pattern> ] [ B<-l>[I<octal>] ] [ B<-0>[I<octal/hexadecimal>] ]>
+ S<[ B<-I>I<dir> ] [ B<-m>[B<->]I<module> ] [ B<-M>[B<->]I<'module...'> ] [ B<-f> ]>
+ S<[ B<-C [I<number/list>] >]>
+ S<[ B<-P> ]>
+ S<[ B<-S> ]>
+ S<[ B<-x>[I<dir>] ]>
+ S<[ B<-i>[I<extension>] ]>
+ S<[ [B<-e>|B<-E>] I<'command'> ] [ B<--> ] [ I<programfile> ] [ I<argument> ]...>
+
+If you're new to Perl, you should start with L<perlintro>, which is a
+general intro for beginners and provides some background to help you
+navigate the rest of Perl's extensive documentation.
+
+For ease of access, the Perl manual has been split up into several sections.
+
+=head2 Overview
+
+ perl Perl overview (this section)
+ perlintro Perl introduction for beginners
+ perltoc Perl documentation table of contents
+
+=head2 Tutorials
+
+ perlreftut Perl references short introduction
+ perldsc Perl data structures intro
+ perllol Perl data structures: arrays of arrays
+
+ perlrequick Perl regular expressions quick start
+ perlretut Perl regular expressions tutorial
+
+ perlboot Perl OO tutorial for beginners
+ perltoot Perl OO tutorial, part 1
+ perltooc Perl OO tutorial, part 2
+ perlbot Perl OO tricks and examples
+
+ perlperf Perl Performance and Optimization Techniques
+
+ perlstyle Perl style guide
+
+ perlcheat Perl cheat sheet
+ perltrap Perl traps for the unwary
+ perldebtut Perl debugging tutorial
+
+ perlfaq Perl frequently asked questions
+ perlfaq1 General Questions About Perl
+ perlfaq2 Obtaining and Learning about Perl
+ perlfaq3 Programming Tools
+ perlfaq4 Data Manipulation
+ perlfaq5 Files and Formats
+ perlfaq6 Regexes
+ perlfaq7 Perl Language Issues
+ perlfaq8 System Interaction
+ perlfaq9 Networking
+
+=head2 Reference Manual
+
+ perlsyn Perl syntax
+ perldata Perl data structures
+ perlop Perl operators and precedence
+ perlsub Perl subroutines
+ perlfunc Perl built-in functions
+ perlopentut Perl open() tutorial
+ perlpacktut Perl pack() and unpack() tutorial
+ perlpod Perl plain old documentation
+ perlpodspec Perl plain old documentation format specification
+ perlrun Perl execution and options
+ perldiag Perl diagnostic messages
+ perllexwarn Perl warnings and their control
+ perldebug Perl debugging
+ perlvar Perl predefined variables
+ perlre Perl regular expressions, the rest of the story
+ perlrebackslash Perl regular expression backslash sequences
+ perlrecharclass Perl regular expression character classes
+ perlreref Perl regular expressions quick reference
+ perlref Perl references, the rest of the story
+ perlform Perl formats
+ perlobj Perl objects
+ perltie Perl objects hidden behind simple variables
+ perldbmfilter Perl DBM filters
+
+ perlipc Perl interprocess communication
+ perlfork Perl fork() information
+ perlnumber Perl number semantics
+
+ perlthrtut Perl threads tutorial
+ perlothrtut Old Perl threads tutorial
+
+ perlport Perl portability guide
+ perllocale Perl locale support
+ perluniintro Perl Unicode introduction
+ perlunicode Perl Unicode support
+ perlunifaq Perl Unicode FAQ
+ perlunitut Perl Unicode tutorial
+ perlebcdic Considerations for running Perl on EBCDIC platforms
+
+ perlsec Perl security
+
+ perlmod Perl modules: how they work
+ perlmodlib Perl modules: how to write and use
+ perlmodstyle Perl modules: how to write modules with style
+ perlmodinstall Perl modules: how to install from CPAN
+ perlnewmod Perl modules: preparing a new module for distribution
+ perlpragma Perl modules: writing a user pragma
+
+ perlutil utilities packaged with the Perl distribution
+
+ perlcompile Perl compiler suite intro
+
+ perlfilter Perl source filters
+
+ perlglossary Perl Glossary
+
+=head2 Internals and C Language Interface
+
+ perlembed Perl ways to embed perl in your C or C++ application
+ perldebguts Perl debugging guts and tips
+ perlxstut Perl XS tutorial
+ perlxs Perl XS application programming interface
+ perlclib Internal replacements for standard C library functions
+ perlguts Perl internal functions for those doing extensions
+ perlcall Perl calling conventions from C
+ perlmroapi Perl method resolution plugin interface
+ perlreapi Perl regular expression plugin interface
+ perlreguts Perl regular expression engine internals
+
+ perlapi Perl API listing (autogenerated)
+ perlintern Perl internal functions (autogenerated)
+ perliol C API for Perl's implementation of IO in Layers
+ perlapio Perl internal IO abstraction interface
+
+ perlhack Perl hackers guide
+ perlrepository Perl source repository
+
+=head2 Miscellaneous
+
+ perlbook Perl book information
+ perlcommunity Perl community information
+ perltodo Perl things to do
+
+ perldoc Look up Perl documentation in Pod format
+
+ perlhist Perl history records
+ perldelta Perl changes since previous version
+ perl5100delta Perl changes in version 5.10.0
+ perl595delta Perl changes in version 5.9.5
+ perl594delta Perl changes in version 5.9.4
+ perl593delta Perl changes in version 5.9.3
+ perl592delta Perl changes in version 5.9.2
+ perl591delta Perl changes in version 5.9.1
+ perl590delta Perl changes in version 5.9.0
+ perl588delta Perl changes in version 5.8.8
+ perl589delta Perl changes in version 5.8.9
+ perl587delta Perl changes in version 5.8.7
+ perl586delta Perl changes in version 5.8.6
+ perl585delta Perl changes in version 5.8.5
+ perl584delta Perl changes in version 5.8.4
+ perl583delta Perl changes in version 5.8.3
+ perl582delta Perl changes in version 5.8.2
+ perl581delta Perl changes in version 5.8.1
+ perl58delta Perl changes in version 5.8.0
+ perl573delta Perl changes in version 5.7.3
+ perl572delta Perl changes in version 5.7.2
+ perl571delta Perl changes in version 5.7.1
+ perl570delta Perl changes in version 5.7.0
+ perl561delta Perl changes in version 5.6.1
+ perl56delta Perl changes in version 5.6
+ perl5005delta Perl changes in version 5.005
+ perl5004delta Perl changes in version 5.004
+
+ perlartistic Perl Artistic License
+ perlgpl GNU General Public License
+
+=head2 Language-Specific
+
+ perlcn Perl for Simplified Chinese (in EUC-CN)
+ perljp Perl for Japanese (in EUC-JP)
+ perlko Perl for Korean (in EUC-KR)
+ perltw Perl for Traditional Chinese (in Big5)
+
+=head2 Platform-Specific
+
+ perlaix Perl notes for AIX
+ perlamiga Perl notes for AmigaOS
+ perlapollo Perl notes for Apollo DomainOS
+ perlbeos Perl notes for BeOS
+ perlbs2000 Perl notes for POSIX-BC BS2000
+ perlce Perl notes for WinCE
+ perlcygwin Perl notes for Cygwin
+ perldgux Perl notes for DG/UX
+ perldos Perl notes for DOS
+ perlepoc Perl notes for EPOC
+ perlfreebsd Perl notes for FreeBSD
+ perlhaiku Perl notes for Haiku
+ perlhpux Perl notes for HP-UX
+ perlhurd Perl notes for Hurd
+ perlirix Perl notes for Irix
+ perllinux Perl notes for Linux
+ perlmachten Perl notes for Power MachTen
+ perlmacos Perl notes for Mac OS (Classic)
+ perlmacosx Perl notes for Mac OS X
+ perlmint Perl notes for MiNT
+ perlmpeix Perl notes for MPE/iX
+ perlnetware Perl notes for NetWare
+ perlopenbsd Perl notes for OpenBSD
+ perlos2 Perl notes for OS/2
+ perlos390 Perl notes for OS/390
+ perlos400 Perl notes for OS/400
+ perlplan9 Perl notes for Plan 9
+ perlqnx Perl notes for QNX
+ perlriscos Perl notes for RISC OS
+ perlsolaris Perl notes for Solaris
+ perlsymbian Perl notes for Symbian
+ perltru64 Perl notes for Tru64
+ perluts Perl notes for UTS
+ perlvmesa Perl notes for VM/ESA
+ perlvms Perl notes for VMS
+ perlvos Perl notes for Stratus VOS
+ perlwin32 Perl notes for Windows
+
+
+By default, the manpages listed above are installed in the
+F</usr/local/man/> directory.
+
+Extensive additional documentation for Perl modules is available. The
+default configuration for perl will place this additional documentation
+in the F</usr/local/lib/perl5/man> directory (or else in the F<man>
+subdirectory of the Perl library directory). Some of this additional
+documentation is distributed standard with Perl, but you'll also find
+documentation for third-party modules there.
+
+You should be able to view Perl's documentation with your man(1)
+program by including the proper directories in the appropriate start-up
+files, or in the MANPATH environment variable. To find out where the
+configuration has installed the manpages, type:
+
+ perl -V:man.dir
+
+If the directories have a common stem, such as F</usr/local/man/man1>
+and F</usr/local/man/man3>, you need only to add that stem
+(F</usr/local/man>) to your man(1) configuration files or your MANPATH
+environment variable. If they do not share a stem, you'll have to add
+both stems.
+
+If that doesn't work for some reason, you can still use the
+supplied F<perldoc> script to view module information. You might
+also look into getting a replacement man program.
+
+If something strange has gone wrong with your program and you're not
+sure where you should look for help, try the B<-w> switch first. It
+will often point out exactly where the trouble is.
+
+=head1 DESCRIPTION
+
+Perl is a language optimized for scanning arbitrary
+text files, extracting information from those text files, and printing
+reports based on that information. It's also a good language for many
+system management tasks. The language is intended to be practical
+(easy to use, efficient, complete) rather than beautiful (tiny,
+elegant, minimal).
+
+Perl combines (in the author's opinion, anyway) some of the best
+features of C, B<sed>, B<awk>, and B<sh>, so people familiar with
+those languages should have little difficulty with it. (Language
+historians will also note some vestiges of B<csh>, Pascal, and even
+BASIC-PLUS.) Expression syntax corresponds closely to C
+expression syntax. Unlike most Unix utilities, Perl does not
+arbitrarily limit the size of your data--if you've got the memory,
+Perl can slurp in your whole file as a single string. Recursion is of
+unlimited depth. And the tables used by hashes (sometimes called
+"associative arrays") grow as necessary to prevent degraded
+performance. Perl can use sophisticated pattern matching techniques to
+scan large amounts of data quickly. Although optimized for
+scanning text, Perl can also deal with binary data, and can make dbm
+files look like hashes. Setuid Perl scripts are safer than C programs
+through a dataflow tracing mechanism that prevents many stupid
+security holes.
+
+If you have a problem that would ordinarily use B<sed> or B<awk> or
+B<sh>, but it exceeds their capabilities or must run a little faster,
+and you don't want to write the silly thing in C, then Perl may be for
+you. There are also translators to turn your B<sed> and B<awk>
+scripts into Perl scripts.
+
+But wait, there's more...
+
+Begun in 1993 (see L<perlhist>), Perl version 5 is nearly a complete
+rewrite that provides the following additional benefits:
+
+=over 4
+
+=item *
+
+modularity and reusability using innumerable modules
+
+Described in L<perlmod>, L<perlmodlib>, and L<perlmodinstall>.
+
+=item *
+
+embeddable and extensible
+
+Described in L<perlembed>, L<perlxstut>, L<perlxs>, L<perlcall>,
+L<perlguts>, and L<xsubpp>.
+
+=item *
+
+roll-your-own magic variables (including multiple simultaneous DBM
+implementations)
+
+Described in L<perltie> and L<AnyDBM_File>.
+
+=item *
+
+subroutines can now be overridden, autoloaded, and prototyped
+
+Described in L<perlsub>.
+
+=item *
+
+arbitrarily nested data structures and anonymous functions
+
+Described in L<perlreftut>, L<perlref>, L<perldsc>, and L<perllol>.
+
+=item *
+
+object-oriented programming
+
+Described in L<perlobj>, L<perlboot>, L<perltoot>, L<perltooc>,
+and L<perlbot>.
+
+=item *
+
+support for light-weight processes (threads)
+
+Described in L<perlthrtut> and L<threads>.
+
+=item *
+
+support for Unicode, internationalization, and localization
+
+Described in L<perluniintro>, L<perllocale> and L<Locale::Maketext>.
+
+=item *
+
+lexical scoping
+
+Described in L<perlsub>.
+
+=item *
+
+regular expression enhancements
+
+Described in L<perlre>, with additional examples in L<perlop>.
+
+=item *
+
+enhanced debugger and interactive Perl environment,
+with integrated editor support
+
+Described in L<perldebtut>, L<perldebug> and L<perldebguts>.
+
+=item *
+
+POSIX 1003.1 compliant library
+
+Described in L<POSIX>.
+
+=back
+
+Okay, that's I<definitely> enough hype.
+
+=head1 AVAILABILITY
+
+Perl is available for most operating systems, including virtually
+all Unix-like platforms. See L<perlport/"Supported Platforms">
+for a listing.
+
+=head1 ENVIRONMENT
+
+See L<perlrun>.
+
+=head1 AUTHOR
+
+Larry Wall <larry@wall.org>, with the help of oodles of other folks.
+
+If your Perl success stories and testimonials may be of help to others
+who wish to advocate the use of Perl in their applications,
+or if you wish to simply express your gratitude to Larry and the
+Perl developers, please write to perl-thanks@perl.org .
+
+=head1 FILES
+
+ "@INC" locations of perl libraries
+
+=head1 SEE ALSO
+
+ a2p awk to perl translator
+ s2p sed to perl translator
+
+ http://www.perl.org/ the Perl homepage
+ http://www.perl.com/ Perl articles (O'Reilly)
+ http://www.cpan.org/ the Comprehensive Perl Archive
+ http://www.pm.org/ the Perl Mongers
+
+=head1 DIAGNOSTICS
+
+The C<use warnings> pragma (and the B<-w> switch) produces some
+lovely diagnostics.
+
+See L<perldiag> for explanations of all Perl's diagnostics. The C<use
+diagnostics> pragma automatically turns Perl's normally terse warnings
+and errors into these longer forms.
+
+Compilation errors will tell you the line number of the error, with an
+indication of the next token or token type that was to be examined.
+(In a script passed to Perl via B<-e> switches, each
+B<-e> is counted as one line.)
+
+Setuid scripts have additional constraints that can produce error
+messages such as "Insecure dependency". See L<perlsec>.
+
+Did we mention that you should definitely consider using the B<-w>
+switch?
+
+=head1 BUGS
+
+The B<-w> switch is not mandatory.
+
+Perl is at the mercy of your machine's definitions of various
+operations such as type casting, atof(), and floating-point
+output with sprintf().
+
+If your stdio requires a seek or eof between reads and writes on a
+particular stream, so does Perl. (This doesn't apply to sysread()
+and syswrite().)
+
+While none of the built-in data types have any arbitrary size limits
+(apart from memory size), there are still a few arbitrary limits: a
+given variable name may not be longer than 251 characters. Line numbers
+displayed by diagnostics are internally stored as short integers,
+so they are limited to a maximum of 65535 (higher numbers usually being
+affected by wraparound).
+
+You may mail your bug reports (be sure to include full configuration
+information as output by the myconfig program in the perl source
+tree, or by C<perl -V>) to perlbug@perl.org . If you've succeeded
+in compiling perl, the B<perlbug> script in the F<utils/> subdirectory
+can be used to help mail in a bug report.
+
+Perl actually stands for Pathologically Eclectic Rubbish Lister, but
+don't tell anyone I said that.
+
+=head1 NOTES
+
+The Perl motto is "There's more than one way to do it." Divining
+how many more is left as an exercise to the reader.
+
+The three principal virtues of a programmer are Laziness,
+Impatience, and Hubris. See the Camel Book for why.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl5004delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl5004delta.pod
new file mode 100755
index 00000000000..572c2b5a6f8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl5004delta.pod
@@ -0,0 +1,1612 @@
+=head1 NAME
+
+perl5004delta - what's new for perl5.004
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.003 release (as
+documented in I<Programming Perl>, second edition--the Camel Book) and
+this one.
+
+=head1 Supported Environments
+
+Perl5.004 builds out of the box on Unix, Plan 9, LynxOS, VMS, OS/2,
+QNX, AmigaOS, and Windows NT. Perl runs on Windows 95 as well, but it
+cannot be built there, for lack of a reasonable command interpreter.
+
+=head1 Core Changes
+
+Most importantly, many bugs were fixed, including several security
+problems. See the F<Changes> file in the distribution for details.
+
+=head2 List assignment to %ENV works
+
+C<%ENV = ()> and C<%ENV = @list> now work as expected (except on VMS
+where it generates a fatal error).
+
+=head2 Change to "Can't locate Foo.pm in @INC" error
+
+The error "Can't locate Foo.pm in @INC" now lists the contents of @INC
+for easier debugging.
+
+=head2 Compilation option: Binary compatibility with 5.003
+
+There is a new Configure question that asks if you want to maintain
+binary compatibility with Perl 5.003. If you choose binary
+compatibility, you do not have to recompile your extensions, but you
+might have symbol conflicts if you embed Perl in another application,
+just as in the 5.003 release. By default, binary compatibility
+is preserved at the expense of symbol table pollution.
+
+=head2 $PERL5OPT environment variable
+
+You may now put Perl options in the $PERL5OPT environment variable.
+Unless Perl is running with taint checks, it will interpret this
+variable as if its contents had appeared on a "#!perl" line at the
+beginning of your script, except that hyphens are optional. PERL5OPT
+may only be used to set the following switches: B<-[DIMUdmw]>.
+
+=head2 Limitations on B<-M>, B<-m>, and B<-T> options
+
+The C<-M> and C<-m> options are no longer allowed on the C<#!> line of
+a script. If a script needs a module, it should invoke it with the
+C<use> pragma.
+
+The B<-T> option is also forbidden on the C<#!> line of a script,
+unless it was present on the Perl command line. Due to the way C<#!>
+works, this usually means that B<-T> must be in the first argument.
+Thus:
+
+ #!/usr/bin/perl -T -w
+
+will probably work for an executable script invoked as C<scriptname>,
+while:
+
+ #!/usr/bin/perl -w -T
+
+will probably fail under the same conditions. (Non-Unix systems will
+probably not follow this rule.) But C<perl scriptname> is guaranteed
+to fail, since then there is no chance of B<-T> being found on the
+command line before it is found on the C<#!> line.
+
+=head2 More precise warnings
+
+If you removed the B<-w> option from your Perl 5.003 scripts because it
+made Perl too verbose, we recommend that you try putting it back when
+you upgrade to Perl 5.004. Each new perl version tends to remove some
+undesirable warnings, while adding new warnings that may catch bugs in
+your scripts.
+
+=head2 Deprecated: Inherited C<AUTOLOAD> for non-methods
+
+Before Perl 5.004, C<AUTOLOAD> functions were looked up as methods
+(using the C<@ISA> hierarchy), even when the function to be autoloaded
+was called as a plain function (e.g. C<Foo::bar()>), not a method
+(e.g. C<< Foo->bar() >> or C<< $obj->bar() >>).
+
+Perl 5.005 will use method lookup only for methods' C<AUTOLOAD>s.
+However, there is a significant base of existing code that may be using
+the old behavior. So, as an interim step, Perl 5.004 issues an optional
+warning when a non-method uses an inherited C<AUTOLOAD>.
+
+The simple rule is: Inheritance will not work when autoloading
+non-methods. The simple fix for old code is: In any module that used to
+depend on inheriting C<AUTOLOAD> for non-methods from a base class named
+C<BaseClass>, execute C<*AUTOLOAD = \&BaseClass::AUTOLOAD> during startup.
+
+=head2 Previously deprecated %OVERLOAD is no longer usable
+
+Using %OVERLOAD to define overloading was deprecated in 5.003.
+Overloading is now defined using the overload pragma. %OVERLOAD is
+still used internally but should not be used by Perl scripts. See
+L<overload> for more details.
+
+=head2 Subroutine arguments created only when they're modified
+
+In Perl 5.004, nonexistent array and hash elements used as subroutine
+parameters are brought into existence only if they are actually
+assigned to (via C<@_>).
+
+Earlier versions of Perl vary in their handling of such arguments.
+Perl versions 5.002 and 5.003 always brought them into existence.
+Perl versions 5.000 and 5.001 brought them into existence only if
+they were not the first argument (which was almost certainly a bug).
+Earlier versions of Perl never brought them into existence.
+
+For example, given this code:
+
+ undef @a; undef %a;
+ sub show { print $_[0] };
+ sub change { $_[0]++ };
+ show($a[2]);
+ change($a{b});
+
+After this code executes in Perl 5.004, $a{b} exists but $a[2] does
+not. In Perl 5.002 and 5.003, both $a{b} and $a[2] would have existed
+(but $a[2]'s value would have been undefined).
+
+=head2 Group vector changeable with C<$)>
+
+The C<$)> special variable has always (well, in Perl 5, at least)
+reflected not only the current effective group, but also the group list
+as returned by the C<getgroups()> C function (if there is one).
+However, until this release, there has not been a way to call the
+C<setgroups()> C function from Perl.
+
+In Perl 5.004, assigning to C<$)> is exactly symmetrical with examining
+it: The first number in its string value is used as the effective gid;
+if there are any numbers after the first one, they are passed to the
+C<setgroups()> C function (if there is one).
+
+=head2 Fixed parsing of $$<digit>, &$<digit>, etc.
+
+Perl versions before 5.004 misinterpreted any type marker followed by
+"$" and a digit. For example, "$$0" was incorrectly taken to mean
+"${$}0" instead of "${$0}". This bug is (mostly) fixed in Perl 5.004.
+
+However, the developers of Perl 5.004 could not fix this bug completely,
+because at least two widely-used modules depend on the old meaning of
+"$$0" in a string. So Perl 5.004 still interprets "$$<digit>" in the
+old (broken) way inside strings; but it generates this message as a
+warning. And in Perl 5.005, this special treatment will cease.
+
+=head2 Fixed localization of $<digit>, $&, etc.
+
+Perl versions before 5.004 did not always properly localize the
+regex-related special variables. Perl 5.004 does localize them, as
+the documentation has always said it should. This may result in $1,
+$2, etc. no longer being set where existing programs use them.
+
+=head2 No resetting of $. on implicit close
+
+The documentation for Perl 5.0 has always stated that C<$.> is I<not>
+reset when an already-open file handle is reopened with no intervening
+call to C<close>. Due to a bug, perl versions 5.000 through 5.003
+I<did> reset C<$.> under that circumstance; Perl 5.004 does not.
+
+=head2 C<wantarray> may return undef
+
+The C<wantarray> operator returns true if a subroutine is expected to
+return a list, and false otherwise. In Perl 5.004, C<wantarray> can
+also return the undefined value if a subroutine's return value will
+not be used at all, which allows subroutines to avoid a time-consuming
+calculation of a return value if it isn't going to be used.
+
+=head2 C<eval EXPR> determines value of EXPR in scalar context
+
+Perl (version 5) used to determine the value of EXPR inconsistently,
+sometimes incorrectly using the surrounding context for the determination.
+Now, the value of EXPR (before being parsed by eval) is always determined in
+a scalar context. Once parsed, it is executed as before, by providing
+the context that the scope surrounding the eval provided. This change
+makes the behavior Perl4 compatible, besides fixing bugs resulting from
+the inconsistent behavior. This program:
+
+ @a = qw(time now is time);
+ print eval @a;
+ print '|', scalar eval @a;
+
+used to print something like "timenowis881399109|4", but now (and in perl4)
+prints "4|4".
+
+=head2 Changes to tainting checks
+
+A bug in previous versions may have failed to detect some insecure
+conditions when taint checks are turned on. (Taint checks are used
+in setuid or setgid scripts, or when explicitly turned on with the
+C<-T> invocation option.) Although it's unlikely, this may cause a
+previously-working script to now fail -- which should be construed
+as a blessing, since that indicates a potentially-serious security
+hole was just plugged.
+
+The new restrictions when tainting include:
+
+=over 4
+
+=item No glob() or <*>
+
+These operators may spawn the C shell (csh), which cannot be made
+safe. This restriction will be lifted in a future version of Perl
+when globbing is implemented without the use of an external program.
+
+=item No spawning if tainted $CDPATH, $ENV, $BASH_ENV
+
+These environment variables may alter the behavior of spawned programs
+(especially shells) in ways that subvert security. So now they are
+treated as dangerous, in the manner of $IFS and $PATH.
+
+=item No spawning if tainted $TERM doesn't look like a terminal name
+
+Some termcap libraries do unsafe things with $TERM. However, it would be
+unnecessarily harsh to treat all $TERM values as unsafe, since only shell
+metacharacters can cause trouble in $TERM. So a tainted $TERM is
+considered to be safe if it contains only alphanumerics, underscores,
+dashes, and colons, and unsafe if it contains other characters (including
+whitespace).
+
+=back
+
+=head2 New Opcode module and revised Safe module
+
+A new Opcode module supports the creation, manipulation and
+application of opcode masks. The revised Safe module has a new API
+and is implemented using the new Opcode module. Please read the new
+Opcode and Safe documentation.
+
+=head2 Embedding improvements
+
+In older versions of Perl it was not possible to create more than one
+Perl interpreter instance inside a single process without leaking like a
+sieve and/or crashing. The bugs that caused this behavior have all been
+fixed. However, you still must take care when embedding Perl in a C
+program. See the updated perlembed manpage for tips on how to manage
+your interpreters.
+
+=head2 Internal change: FileHandle class based on IO::* classes
+
+File handles are now stored internally as type IO::Handle. The
+FileHandle module is still supported for backwards compatibility, but
+it is now merely a front end to the IO::* modules -- specifically,
+IO::Handle, IO::Seekable, and IO::File. We suggest, but do not
+require, that you use the IO::* modules in new code.
+
+In harmony with this change, C<*GLOB{FILEHANDLE}> is now just a
+backward-compatible synonym for C<*GLOB{IO}>.
+
+=head2 Internal change: PerlIO abstraction interface
+
+It is now possible to build Perl with AT&T's sfio IO package
+instead of stdio. See L<perlapio> for more details, and
+the F<INSTALL> file for how to use it.
+
+=head2 New and changed syntax
+
+=over 4
+
+=item $coderef->(PARAMS)
+
+A subroutine reference may now be suffixed with an arrow and a
+(possibly empty) parameter list. This syntax denotes a call of the
+referenced subroutine, with the given parameters (if any).
+
+This new syntax follows the pattern of S<C<< $hashref->{FOO} >>> and
+S<C<< $aryref->[$foo] >>>: You may now write S<C<&$subref($foo)>> as
+S<C<< $subref->($foo) >>>. All these arrow terms may be chained;
+thus, S<C<< &{$table->{FOO}}($bar) >>> may now be written
+S<C<< $table->{FOO}->($bar) >>>.
+
+=back
+
+=head2 New and changed builtin constants
+
+=over 4
+
+=item __PACKAGE__
+
+The current package name at compile time, or the undefined value if
+there is no current package (due to a C<package;> directive). Like
+C<__FILE__> and C<__LINE__>, C<__PACKAGE__> does I<not> interpolate
+into strings.
+
+=back
+
+=head2 New and changed builtin variables
+
+=over 4
+
+=item $^E
+
+Extended error message on some platforms. (Also known as
+$EXTENDED_OS_ERROR if you C<use English>).
+
+=item $^H
+
+The current set of syntax checks enabled by C<use strict>. See the
+documentation of C<strict> for more details. Not actually new, but
+newly documented.
+Because it is intended for internal use by Perl core components,
+there is no C<use English> long name for this variable.
+
+=item $^M
+
+By default, running out of memory it is not trappable. However, if
+compiled for this, Perl may use the contents of C<$^M> as an emergency
+pool after die()ing with this message. Suppose that your Perl were
+compiled with -DPERL_EMERGENCY_SBRK and used Perl's malloc. Then
+
+ $^M = 'a' x (1<<16);
+
+would allocate a 64K buffer for use when in emergency.
+See the F<INSTALL> file for information on how to enable this option.
+As a disincentive to casual use of this advanced feature,
+there is no C<use English> long name for this variable.
+
+=back
+
+=head2 New and changed builtin functions
+
+=over 4
+
+=item delete on slices
+
+This now works. (e.g. C<delete @ENV{'PATH', 'MANPATH'}>)
+
+=item flock
+
+is now supported on more platforms, prefers fcntl to lockf when
+emulating, and always flushes before (un)locking.
+
+=item printf and sprintf
+
+Perl now implements these functions itself; it doesn't use the C
+library function sprintf() any more, except for floating-point
+numbers, and even then only known flags are allowed. As a result, it
+is now possible to know which conversions and flags will work, and
+what they will do.
+
+The new conversions in Perl's sprintf() are:
+
+ %i a synonym for %d
+ %p a pointer (the address of the Perl value, in hexadecimal)
+ %n special: *stores* the number of characters output so far
+ into the next variable in the parameter list
+
+The new flags that go between the C<%> and the conversion are:
+
+ # prefix octal with "0", hex with "0x"
+ h interpret integer as C type "short" or "unsigned short"
+ V interpret integer as Perl's standard integer type
+
+Also, where a number would appear in the flags, an asterisk ("*") may
+be used instead, in which case Perl uses the next item in the
+parameter list as the given number (that is, as the field width or
+precision). If a field width obtained through "*" is negative, it has
+the same effect as the '-' flag: left-justification.
+
+See L<perlfunc/sprintf> for a complete list of conversion and flags.
+
+=item keys as an lvalue
+
+As an lvalue, C<keys> allows you to increase the number of hash buckets
+allocated for the given hash. This can gain you a measure of efficiency if
+you know the hash is going to get big. (This is similar to pre-extending
+an array by assigning a larger number to $#array.) If you say
+
+ keys %hash = 200;
+
+then C<%hash> will have at least 200 buckets allocated for it. These
+buckets will be retained even if you do C<%hash = ()>; use C<undef
+%hash> if you want to free the storage while C<%hash> is still in scope.
+You can't shrink the number of buckets allocated for the hash using
+C<keys> in this way (but you needn't worry about doing this by accident,
+as trying has no effect).
+
+=item my() in Control Structures
+
+You can now use my() (with or without the parentheses) in the control
+expressions of control structures such as:
+
+ while (defined(my $line = <>)) {
+ $line = lc $line;
+ } continue {
+ print $line;
+ }
+
+ if ((my $answer = <STDIN>) =~ /^y(es)?$/i) {
+ user_agrees();
+ } elsif ($answer =~ /^n(o)?$/i) {
+ user_disagrees();
+ } else {
+ chomp $answer;
+ die "`$answer' is neither `yes' nor `no'";
+ }
+
+Also, you can declare a foreach loop control variable as lexical by
+preceding it with the word "my". For example, in:
+
+ foreach my $i (1, 2, 3) {
+ some_function();
+ }
+
+$i is a lexical variable, and the scope of $i extends to the end of
+the loop, but not beyond it.
+
+Note that you still cannot use my() on global punctuation variables
+such as $_ and the like.
+
+=item pack() and unpack()
+
+A new format 'w' represents a BER compressed integer (as defined in
+ASN.1). Its format is a sequence of one or more bytes, each of which
+provides seven bits of the total value, with the most significant
+first. Bit eight of each byte is set, except for the last byte, in
+which bit eight is clear.
+
+If 'p' or 'P' are given undef as values, they now generate a NULL
+pointer.
+
+Both pack() and unpack() now fail when their templates contain invalid
+types. (Invalid types used to be ignored.)
+
+=item sysseek()
+
+The new sysseek() operator is a variant of seek() that sets and gets the
+file's system read/write position, using the lseek(2) system call. It is
+the only reliable way to seek before using sysread() or syswrite(). Its
+return value is the new position, or the undefined value on failure.
+
+=item use VERSION
+
+If the first argument to C<use> is a number, it is treated as a version
+number instead of a module name. If the version of the Perl interpreter
+is less than VERSION, then an error message is printed and Perl exits
+immediately. Because C<use> occurs at compile time, this check happens
+immediately during the compilation process, unlike C<require VERSION>,
+which waits until runtime for the check. This is often useful if you
+need to check the current Perl version before C<use>ing library modules
+which have changed in incompatible ways from older versions of Perl.
+(We try not to do this more than we have to.)
+
+=item use Module VERSION LIST
+
+If the VERSION argument is present between Module and LIST, then the
+C<use> will call the VERSION method in class Module with the given
+version as an argument. The default VERSION method, inherited from
+the UNIVERSAL class, croaks if the given version is larger than the
+value of the variable $Module::VERSION. (Note that there is not a
+comma after VERSION!)
+
+This version-checking mechanism is similar to the one currently used
+in the Exporter module, but it is faster and can be used with modules
+that don't use the Exporter. It is the recommended method for new
+code.
+
+=item prototype(FUNCTION)
+
+Returns the prototype of a function as a string (or C<undef> if the
+function has no prototype). FUNCTION is a reference to or the name of the
+function whose prototype you want to retrieve.
+(Not actually new; just never documented before.)
+
+=item srand
+
+The default seed for C<srand>, which used to be C<time>, has been changed.
+Now it's a heady mix of difficult-to-predict system-dependent values,
+which should be sufficient for most everyday purposes.
+
+Previous to version 5.004, calling C<rand> without first calling C<srand>
+would yield the same sequence of random numbers on most or all machines.
+Now, when perl sees that you're calling C<rand> and haven't yet called
+C<srand>, it calls C<srand> with the default seed. You should still call
+C<srand> manually if your code might ever be run on a pre-5.004 system,
+of course, or if you want a seed other than the default.
+
+=item $_ as Default
+
+Functions documented in the Camel to default to $_ now in
+fact do, and all those that do are so documented in L<perlfunc>.
+
+=item C<m//gc> does not reset search position on failure
+
+The C<m//g> match iteration construct has always reset its target
+string's search position (which is visible through the C<pos> operator)
+when a match fails; as a result, the next C<m//g> match after a failure
+starts again at the beginning of the string. With Perl 5.004, this
+reset may be disabled by adding the "c" (for "continue") modifier,
+i.e. C<m//gc>. This feature, in conjunction with the C<\G> zero-width
+assertion, makes it possible to chain matches together. See L<perlop>
+and L<perlre>.
+
+=item C<m//x> ignores whitespace before ?*+{}
+
+The C<m//x> construct has always been intended to ignore all unescaped
+whitespace. However, before Perl 5.004, whitespace had the effect of
+escaping repeat modifiers like "*" or "?"; for example, C</a *b/x> was
+(mis)interpreted as C</a\*b/x>. This bug has been fixed in 5.004.
+
+=item nested C<sub{}> closures work now
+
+Prior to the 5.004 release, nested anonymous functions didn't work
+right. They do now.
+
+=item formats work right on changing lexicals
+
+Just like anonymous functions that contain lexical variables
+that change (like a lexical index variable for a C<foreach> loop),
+formats now work properly. For example, this silently failed
+before (printed only zeros), but is fine now:
+
+ my $i;
+ foreach $i ( 1 .. 10 ) {
+ write;
+ }
+ format =
+ my i is @#
+ $i
+ .
+
+However, it still fails (without a warning) if the foreach is within a
+subroutine:
+
+ my $i;
+ sub foo {
+ foreach $i ( 1 .. 10 ) {
+ write;
+ }
+ }
+ foo;
+ format =
+ my i is @#
+ $i
+ .
+
+=back
+
+=head2 New builtin methods
+
+The C<UNIVERSAL> package automatically contains the following methods that
+are inherited by all other classes:
+
+=over 4
+
+=item isa(CLASS)
+
+C<isa> returns I<true> if its object is blessed into a subclass of C<CLASS>
+
+C<isa> is also exportable and can be called as a sub with two arguments. This
+allows the ability to check what a reference points to. Example:
+
+ use UNIVERSAL qw(isa);
+
+ if(isa($ref, 'ARRAY')) {
+ ...
+ }
+
+=item can(METHOD)
+
+C<can> checks to see if its object has a method called C<METHOD>,
+if it does then a reference to the sub is returned; if it does not then
+I<undef> is returned.
+
+=item VERSION( [NEED] )
+
+C<VERSION> returns the version number of the class (package). If the
+NEED argument is given then it will check that the current version (as
+defined by the $VERSION variable in the given package) not less than
+NEED; it will die if this is not the case. This method is normally
+called as a class method. This method is called automatically by the
+C<VERSION> form of C<use>.
+
+ use A 1.2 qw(some imported subs);
+ # implies:
+ A->VERSION(1.2);
+
+=back
+
+B<NOTE:> C<can> directly uses Perl's internal code for method lookup, and
+C<isa> uses a very similar method and caching strategy. This may cause
+strange effects if the Perl code dynamically changes @ISA in any package.
+
+You may add other methods to the UNIVERSAL class via Perl or XS code.
+You do not need to C<use UNIVERSAL> in order to make these methods
+available to your program. This is necessary only if you wish to
+have C<isa> available as a plain subroutine in the current package.
+
+=head2 TIEHANDLE now supported
+
+See L<perltie> for other kinds of tie()s.
+
+=over 4
+
+=item TIEHANDLE classname, LIST
+
+This is the constructor for the class. That means it is expected to
+return an object of some sort. The reference can be used to
+hold some internal information.
+
+ sub TIEHANDLE {
+ print "<shout>\n";
+ my $i;
+ return bless \$i, shift;
+ }
+
+=item PRINT this, LIST
+
+This method will be triggered every time the tied handle is printed to.
+Beyond its self reference it also expects the list that was passed to
+the print function.
+
+ sub PRINT {
+ $r = shift;
+ $$r++;
+ return print join( $, => map {uc} @_), $\;
+ }
+
+=item PRINTF this, LIST
+
+This method will be triggered every time the tied handle is printed to
+with the C<printf()> function.
+Beyond its self reference it also expects the format and list that was
+passed to the printf function.
+
+ sub PRINTF {
+ shift;
+ my $fmt = shift;
+ print sprintf($fmt, @_)."\n";
+ }
+
+=item READ this LIST
+
+This method will be called when the handle is read from via the C<read>
+or C<sysread> functions.
+
+ sub READ {
+ $r = shift;
+ my($buf,$len,$offset) = @_;
+ print "READ called, \$buf=$buf, \$len=$len, \$offset=$offset";
+ }
+
+=item READLINE this
+
+This method will be called when the handle is read from. The method
+should return undef when there is no more data.
+
+ sub READLINE {
+ $r = shift;
+ return "PRINT called $$r times\n"
+ }
+
+=item GETC this
+
+This method will be called when the C<getc> function is called.
+
+ sub GETC { print "Don't GETC, Get Perl"; return "a"; }
+
+=item DESTROY this
+
+As with the other types of ties, this method will be called when the
+tied handle is about to be destroyed. This is useful for debugging and
+possibly for cleaning up.
+
+ sub DESTROY {
+ print "</shout>\n";
+ }
+
+=back
+
+=head2 Malloc enhancements
+
+If perl is compiled with the malloc included with the perl distribution
+(that is, if C<perl -V:d_mymalloc> is 'define') then you can print
+memory statistics at runtime by running Perl thusly:
+
+ env PERL_DEBUG_MSTATS=2 perl your_script_here
+
+The value of 2 means to print statistics after compilation and on
+exit; with a value of 1, the statistics are printed only on exit.
+(If you want the statistics at an arbitrary time, you'll need to
+install the optional module Devel::Peek.)
+
+Three new compilation flags are recognized by malloc.c. (They have no
+effect if perl is compiled with system malloc().)
+
+=over 4
+
+=item -DPERL_EMERGENCY_SBRK
+
+If this macro is defined, running out of memory need not be a fatal
+error: a memory pool can allocated by assigning to the special
+variable C<$^M>. See L<"$^M">.
+
+=item -DPACK_MALLOC
+
+Perl memory allocation is by bucket with sizes close to powers of two.
+Because of these malloc overhead may be big, especially for data of
+size exactly a power of two. If C<PACK_MALLOC> is defined, perl uses
+a slightly different algorithm for small allocations (up to 64 bytes
+long), which makes it possible to have overhead down to 1 byte for
+allocations which are powers of two (and appear quite often).
+
+Expected memory savings (with 8-byte alignment in C<alignbytes>) is
+about 20% for typical Perl usage. Expected slowdown due to additional
+malloc overhead is in fractions of a percent (hard to measure, because
+of the effect of saved memory on speed).
+
+=item -DTWO_POT_OPTIMIZE
+
+Similarly to C<PACK_MALLOC>, this macro improves allocations of data
+with size close to a power of two; but this works for big allocations
+(starting with 16K by default). Such allocations are typical for big
+hashes and special-purpose scripts, especially image processing.
+
+On recent systems, the fact that perl requires 2M from system for 1M
+allocation will not affect speed of execution, since the tail of such
+a chunk is not going to be touched (and thus will not require real
+memory). However, it may result in a premature out-of-memory error.
+So if you will be manipulating very large blocks with sizes close to
+powers of two, it would be wise to define this macro.
+
+Expected saving of memory is 0-100% (100% in applications which
+require most memory in such 2**n chunks); expected slowdown is
+negligible.
+
+=back
+
+=head2 Miscellaneous efficiency enhancements
+
+Functions that have an empty prototype and that do nothing but return
+a fixed value are now inlined (e.g. C<sub PI () { 3.14159 }>).
+
+Each unique hash key is only allocated once, no matter how many hashes
+have an entry with that key. So even if you have 100 copies of the
+same hash, the hash keys never have to be reallocated.
+
+=head1 Support for More Operating Systems
+
+Support for the following operating systems is new in Perl 5.004.
+
+=head2 Win32
+
+Perl 5.004 now includes support for building a "native" perl under
+Windows NT, using the Microsoft Visual C++ compiler (versions 2.0
+and above) or the Borland C++ compiler (versions 5.02 and above).
+The resulting perl can be used under Windows 95 (if it
+is installed in the same directory locations as it got installed
+in Windows NT). This port includes support for perl extension
+building tools like L<MakeMaker> and L<h2xs>, so that many extensions
+available on the Comprehensive Perl Archive Network (CPAN) can now be
+readily built under Windows NT. See http://www.perl.com/ for more
+information on CPAN and F<README.win32> in the perl distribution for more
+details on how to get started with building this port.
+
+There is also support for building perl under the Cygwin32 environment.
+Cygwin32 is a set of GNU tools that make it possible to compile and run
+many Unix programs under Windows NT by providing a mostly Unix-like
+interface for compilation and execution. See F<README.cygwin32> in the
+perl distribution for more details on this port and how to obtain the
+Cygwin32 toolkit.
+
+=head2 Plan 9
+
+See F<README.plan9> in the perl distribution.
+
+=head2 QNX
+
+See F<README.qnx> in the perl distribution.
+
+=head2 AmigaOS
+
+See F<README.amigaos> in the perl distribution.
+
+=head1 Pragmata
+
+Six new pragmatic modules exist:
+
+=over 4
+
+=item use autouse MODULE => qw(sub1 sub2 sub3)
+
+Defers C<require MODULE> until someone calls one of the specified
+subroutines (which must be exported by MODULE). This pragma should be
+used with caution, and only when necessary.
+
+=item use blib
+
+=item use blib 'dir'
+
+Looks for MakeMaker-like I<'blib'> directory structure starting in
+I<dir> (or current directory) and working back up to five levels of
+parent directories.
+
+Intended for use on command line with B<-M> option as a way of testing
+arbitrary scripts against an uninstalled version of a package.
+
+=item use constant NAME => VALUE
+
+Provides a convenient interface for creating compile-time constants,
+See L<perlsub/"Constant Functions">.
+
+=item use locale
+
+Tells the compiler to enable (or disable) the use of POSIX locales for
+builtin operations.
+
+When C<use locale> is in effect, the current LC_CTYPE locale is used
+for regular expressions and case mapping; LC_COLLATE for string
+ordering; and LC_NUMERIC for numeric formatting in printf and sprintf
+(but B<not> in print). LC_NUMERIC is always used in write, since
+lexical scoping of formats is problematic at best.
+
+Each C<use locale> or C<no locale> affects statements to the end of
+the enclosing BLOCK or, if not inside a BLOCK, to the end of the
+current file. Locales can be switched and queried with
+POSIX::setlocale().
+
+See L<perllocale> for more information.
+
+=item use ops
+
+Disable unsafe opcodes, or any named opcodes, when compiling Perl code.
+
+=item use vmsish
+
+Enable VMS-specific language features. Currently, there are three
+VMS-specific features available: 'status', which makes C<$?> and
+C<system> return genuine VMS status values instead of emulating POSIX;
+'exit', which makes C<exit> take a genuine VMS status value instead of
+assuming that C<exit 1> is an error; and 'time', which makes all times
+relative to the local time zone, in the VMS tradition.
+
+=back
+
+=head1 Modules
+
+=head2 Required Updates
+
+Though Perl 5.004 is compatible with almost all modules that work
+with Perl 5.003, there are a few exceptions:
+
+ Module Required Version for Perl 5.004
+ ------ -------------------------------
+ Filter Filter-1.12
+ LWP libwww-perl-5.08
+ Tk Tk400.202 (-w makes noise)
+
+Also, the majordomo mailing list program, version 1.94.1, doesn't work
+with Perl 5.004 (nor with perl 4), because it executes an invalid
+regular expression. This bug is fixed in majordomo version 1.94.2.
+
+=head2 Installation directories
+
+The I<installperl> script now places the Perl source files for
+extensions in the architecture-specific library directory, which is
+where the shared libraries for extensions have always been. This
+change is intended to allow administrators to keep the Perl 5.004
+library directory unchanged from a previous version, without running
+the risk of binary incompatibility between extensions' Perl source and
+shared libraries.
+
+=head2 Module information summary
+
+Brand new modules, arranged by topic rather than strictly
+alphabetically:
+
+ CGI.pm Web server interface ("Common Gateway Interface")
+ CGI/Apache.pm Support for Apache's Perl module
+ CGI/Carp.pm Log server errors with helpful context
+ CGI/Fast.pm Support for FastCGI (persistent server process)
+ CGI/Push.pm Support for server push
+ CGI/Switch.pm Simple interface for multiple server types
+
+ CPAN Interface to Comprehensive Perl Archive Network
+ CPAN::FirstTime Utility for creating CPAN configuration file
+ CPAN::Nox Runs CPAN while avoiding compiled extensions
+
+ IO.pm Top-level interface to IO::* classes
+ IO/File.pm IO::File extension Perl module
+ IO/Handle.pm IO::Handle extension Perl module
+ IO/Pipe.pm IO::Pipe extension Perl module
+ IO/Seekable.pm IO::Seekable extension Perl module
+ IO/Select.pm IO::Select extension Perl module
+ IO/Socket.pm IO::Socket extension Perl module
+
+ Opcode.pm Disable named opcodes when compiling Perl code
+
+ ExtUtils/Embed.pm Utilities for embedding Perl in C programs
+ ExtUtils/testlib.pm Fixes up @INC to use just-built extension
+
+ FindBin.pm Find path of currently executing program
+
+ Class/Struct.pm Declare struct-like datatypes as Perl classes
+ File/stat.pm By-name interface to Perl's builtin stat
+ Net/hostent.pm By-name interface to Perl's builtin gethost*
+ Net/netent.pm By-name interface to Perl's builtin getnet*
+ Net/protoent.pm By-name interface to Perl's builtin getproto*
+ Net/servent.pm By-name interface to Perl's builtin getserv*
+ Time/gmtime.pm By-name interface to Perl's builtin gmtime
+ Time/localtime.pm By-name interface to Perl's builtin localtime
+ Time/tm.pm Internal object for Time::{gm,local}time
+ User/grent.pm By-name interface to Perl's builtin getgr*
+ User/pwent.pm By-name interface to Perl's builtin getpw*
+
+ Tie/RefHash.pm Base class for tied hashes with references as keys
+
+ UNIVERSAL.pm Base class for *ALL* classes
+
+=head2 Fcntl
+
+New constants in the existing Fcntl modules are now supported,
+provided that your operating system happens to support them:
+
+ F_GETOWN F_SETOWN
+ O_ASYNC O_DEFER O_DSYNC O_FSYNC O_SYNC
+ O_EXLOCK O_SHLOCK
+
+These constants are intended for use with the Perl operators sysopen()
+and fcntl() and the basic database modules like SDBM_File. For the
+exact meaning of these and other Fcntl constants please refer to your
+operating system's documentation for fcntl() and open().
+
+In addition, the Fcntl module now provides these constants for use
+with the Perl operator flock():
+
+ LOCK_SH LOCK_EX LOCK_NB LOCK_UN
+
+These constants are defined in all environments (because where there is
+no flock() system call, Perl emulates it). However, for historical
+reasons, these constants are not exported unless they are explicitly
+requested with the ":flock" tag (e.g. C<use Fcntl ':flock'>).
+
+=head2 IO
+
+The IO module provides a simple mechanism to load all the IO modules at one
+go. Currently this includes:
+
+ IO::Handle
+ IO::Seekable
+ IO::File
+ IO::Pipe
+ IO::Socket
+
+For more information on any of these modules, please see its
+respective documentation.
+
+=head2 Math::Complex
+
+The Math::Complex module has been totally rewritten, and now supports
+more operations. These are overloaded:
+
+ + - * / ** <=> neg ~ abs sqrt exp log sin cos atan2 "" (stringify)
+
+And these functions are now exported:
+
+ pi i Re Im arg
+ log10 logn ln cbrt root
+ tan
+ csc sec cot
+ asin acos atan
+ acsc asec acot
+ sinh cosh tanh
+ csch sech coth
+ asinh acosh atanh
+ acsch asech acoth
+ cplx cplxe
+
+=head2 Math::Trig
+
+This new module provides a simpler interface to parts of Math::Complex for
+those who need trigonometric functions only for real numbers.
+
+=head2 DB_File
+
+There have been quite a few changes made to DB_File. Here are a few of
+the highlights:
+
+=over 4
+
+=item *
+
+Fixed a handful of bugs.
+
+=item *
+
+By public demand, added support for the standard hash function exists().
+
+=item *
+
+Made it compatible with Berkeley DB 1.86.
+
+=item *
+
+Made negative subscripts work with RECNO interface.
+
+=item *
+
+Changed the default flags from O_RDWR to O_CREAT|O_RDWR and the default
+mode from 0640 to 0666.
+
+=item *
+
+Made DB_File automatically import the open() constants (O_RDWR,
+O_CREAT etc.) from Fcntl, if available.
+
+=item *
+
+Updated documentation.
+
+=back
+
+Refer to the HISTORY section in DB_File.pm for a complete list of
+changes. Everything after DB_File 1.01 has been added since 5.003.
+
+=head2 Net::Ping
+
+Major rewrite - support added for both udp echo and real icmp pings.
+
+=head2 Object-oriented overrides for builtin operators
+
+Many of the Perl builtins returning lists now have
+object-oriented overrides. These are:
+
+ File::stat
+ Net::hostent
+ Net::netent
+ Net::protoent
+ Net::servent
+ Time::gmtime
+ Time::localtime
+ User::grent
+ User::pwent
+
+For example, you can now say
+
+ use File::stat;
+ use User::pwent;
+ $his = (stat($filename)->st_uid == pwent($whoever)->pw_uid);
+
+=head1 Utility Changes
+
+=head2 pod2html
+
+=over 4
+
+=item Sends converted HTML to standard output
+
+The I<pod2html> utility included with Perl 5.004 is entirely new.
+By default, it sends the converted HTML to its standard output,
+instead of writing it to a file like Perl 5.003's I<pod2html> did.
+Use the B<--outfile=FILENAME> option to write to a file.
+
+=back
+
+=head2 xsubpp
+
+=over 4
+
+=item C<void> XSUBs now default to returning nothing
+
+Due to a documentation/implementation bug in previous versions of
+Perl, XSUBs with a return type of C<void> have actually been
+returning one value. Usually that value was the GV for the XSUB,
+but sometimes it was some already freed or reused value, which would
+sometimes lead to program failure.
+
+In Perl 5.004, if an XSUB is declared as returning C<void>, it
+actually returns no value, i.e. an empty list (though there is a
+backward-compatibility exception; see below). If your XSUB really
+does return an SV, you should give it a return type of C<SV *>.
+
+For backward compatibility, I<xsubpp> tries to guess whether a
+C<void> XSUB is really C<void> or if it wants to return an C<SV *>.
+It does so by examining the text of the XSUB: if I<xsubpp> finds
+what looks like an assignment to C<ST(0)>, it assumes that the
+XSUB's return type is really C<SV *>.
+
+=back
+
+=head1 C Language API Changes
+
+=over 4
+
+=item C<gv_fetchmethod> and C<perl_call_sv>
+
+The C<gv_fetchmethod> function finds a method for an object, just like
+in Perl 5.003. The GV it returns may be a method cache entry.
+However, in Perl 5.004, method cache entries are not visible to users;
+therefore, they can no longer be passed directly to C<perl_call_sv>.
+Instead, you should use the C<GvCV> macro on the GV to extract its CV,
+and pass the CV to C<perl_call_sv>.
+
+The most likely symptom of passing the result of C<gv_fetchmethod> to
+C<perl_call_sv> is Perl's producing an "Undefined subroutine called"
+error on the I<second> call to a given method (since there is no cache
+on the first call).
+
+=item C<perl_eval_pv>
+
+A new function handy for eval'ing strings of Perl code inside C code.
+This function returns the value from the eval statement, which can
+be used instead of fetching globals from the symbol table. See
+L<perlguts>, L<perlembed> and L<perlcall> for details and examples.
+
+=item Extended API for manipulating hashes
+
+Internal handling of hash keys has changed. The old hashtable API is
+still fully supported, and will likely remain so. The additions to the
+API allow passing keys as C<SV*>s, so that C<tied> hashes can be given
+real scalars as keys rather than plain strings (nontied hashes still
+can only use strings as keys). New extensions must use the new hash
+access functions and macros if they wish to use C<SV*> keys. These
+additions also make it feasible to manipulate C<HE*>s (hash entries),
+which can be more efficient. See L<perlguts> for details.
+
+=back
+
+=head1 Documentation Changes
+
+Many of the base and library pods were updated. These
+new pods are included in section 1:
+
+=over 4
+
+=item L<perldelta>
+
+This document.
+
+=item L<perlfaq>
+
+Frequently asked questions.
+
+=item L<perllocale>
+
+Locale support (internationalization and localization).
+
+=item L<perltoot>
+
+Tutorial on Perl OO programming.
+
+=item L<perlapio>
+
+Perl internal IO abstraction interface.
+
+=item L<perlmodlib>
+
+Perl module library and recommended practice for module creation.
+Extracted from L<perlmod> (which is much smaller as a result).
+
+=item L<perldebug>
+
+Although not new, this has been massively updated.
+
+=item L<perlsec>
+
+Although not new, this has been massively updated.
+
+=back
+
+=head1 New Diagnostics
+
+Several new conditions will trigger warnings that were
+silent before. Some only affect certain platforms.
+The following new warnings and errors outline these.
+These messages are classified as follows (listed in
+increasing order of desperation):
+
+ (W) A warning (optional).
+ (D) A deprecation (optional).
+ (S) A severe warning (mandatory).
+ (F) A fatal error (trappable).
+ (P) An internal error you should never see (trappable).
+ (X) A very fatal error (nontrappable).
+ (A) An alien error message (not generated by Perl).
+
+=over 4
+
+=item "my" variable %s masks earlier declaration in same scope
+
+(W) A lexical variable has been redeclared in the same scope, effectively
+eliminating all access to the previous instance. This is almost always
+a typographical error. Note that the earlier variable will still exist
+until the end of the scope or until all closure referents to it are
+destroyed.
+
+=item %s argument is not a HASH element or slice
+
+(F) The argument to delete() must be either a hash element, such as
+
+ $foo{$bar}
+ $ref->[12]->{"susie"}
+
+or a hash slice, such as
+
+ @foo{$bar, $baz, $xyzzy}
+ @{$ref->[12]}{"susie", "queue"}
+
+=item Allocation too large: %lx
+
+(X) You can't allocate more than 64K on an MS-DOS machine.
+
+=item Allocation too large
+
+(F) You can't allocate more than 2^31+"small amount" bytes.
+
+=item Applying %s to %s will act on scalar(%s)
+
+(W) The pattern match (//), substitution (s///), and transliteration (tr///)
+operators work on scalar values. If you apply one of them to an array
+or a hash, it will convert the array or hash to a scalar value -- the
+length of an array, or the population info of a hash -- and then work on
+that scalar value. This is probably not what you meant to do. See
+L<perlfunc/grep> and L<perlfunc/map> for alternatives.
+
+=item Attempt to free nonexistent shared string
+
+(P) Perl maintains a reference counted internal table of strings to
+optimize the storage and access of hash keys and other strings. This
+indicates someone tried to decrement the reference count of a string
+that can no longer be found in the table.
+
+=item Attempt to use reference as lvalue in substr
+
+(W) You supplied a reference as the first argument to substr() used
+as an lvalue, which is pretty strange. Perhaps you forgot to
+dereference it first. See L<perlfunc/substr>.
+
+=item Bareword "%s" refers to nonexistent package
+
+(W) You used a qualified bareword of the form C<Foo::>, but
+the compiler saw no other uses of that namespace before that point.
+Perhaps you need to predeclare a package?
+
+=item Can't redefine active sort subroutine %s
+
+(F) Perl optimizes the internal handling of sort subroutines and keeps
+pointers into them. You tried to redefine one such sort subroutine when it
+was currently active, which is not allowed. If you really want to do
+this, you should write C<sort { &func } @x> instead of C<sort func @x>.
+
+=item Can't use bareword ("%s") as %s ref while "strict refs" in use
+
+(F) Only hard references are allowed by "strict refs". Symbolic references
+are disallowed. See L<perlref>.
+
+=item Cannot resolve method `%s' overloading `%s' in package `%s'
+
+(P) Internal error trying to resolve overloading specified by a method
+name (as opposed to a subroutine reference).
+
+=item Constant subroutine %s redefined
+
+(S) You redefined a subroutine which had previously been eligible for
+inlining. See L<perlsub/"Constant Functions"> for commentary and
+workarounds.
+
+=item Constant subroutine %s undefined
+
+(S) You undefined a subroutine which had previously been eligible for
+inlining. See L<perlsub/"Constant Functions"> for commentary and
+workarounds.
+
+=item Copy method did not return a reference
+
+(F) The method which overloads "=" is buggy. See L<overload/Copy Constructor>.
+
+=item Died
+
+(F) You passed die() an empty string (the equivalent of C<die "">) or
+you called it with no args and both C<$@> and C<$_> were empty.
+
+=item Exiting pseudo-block via %s
+
+(W) You are exiting a rather special block construct (like a sort block or
+subroutine) by unconventional means, such as a goto, or a loop control
+statement. See L<perlfunc/sort>.
+
+=item Identifier too long
+
+(F) Perl limits identifiers (names for variables, functions, etc.) to
+252 characters for simple names, somewhat more for compound names (like
+C<$A::B>). You've exceeded Perl's limits. Future versions of Perl are
+likely to eliminate these arbitrary limitations.
+
+=item Illegal character %s (carriage return)
+
+(F) A carriage return character was found in the input. This is an
+error, and not a warning, because carriage return characters can break
+multi-line strings, including here documents (e.g., C<print <<EOF;>).
+
+=item Illegal switch in PERL5OPT: %s
+
+(X) The PERL5OPT environment variable may only be used to set the
+following switches: B<-[DIMUdmw]>.
+
+=item Integer overflow in hex number
+
+(S) The literal hex number you have specified is too big for your
+architecture. On a 32-bit architecture the largest hex literal is
+0xFFFFFFFF.
+
+=item Integer overflow in octal number
+
+(S) The literal octal number you have specified is too big for your
+architecture. On a 32-bit architecture the largest octal literal is
+037777777777.
+
+=item internal error: glob failed
+
+(P) Something went wrong with the external program(s) used for C<glob>
+and C<< <*.c> >>. This may mean that your csh (C shell) is
+broken. If so, you should change all of the csh-related variables in
+config.sh: If you have tcsh, make the variables refer to it as if it
+were csh (e.g. C<full_csh='/usr/bin/tcsh'>); otherwise, make them all
+empty (except that C<d_csh> should be C<'undef'>) so that Perl will
+think csh is missing. In either case, after editing config.sh, run
+C<./Configure -S> and rebuild Perl.
+
+=item Invalid conversion in %s: "%s"
+
+(W) Perl does not understand the given format conversion.
+See L<perlfunc/sprintf>.
+
+=item Invalid type in pack: '%s'
+
+(F) The given character is not a valid pack type. See L<perlfunc/pack>.
+
+=item Invalid type in unpack: '%s'
+
+(F) The given character is not a valid unpack type. See L<perlfunc/unpack>.
+
+=item Name "%s::%s" used only once: possible typo
+
+(W) Typographical errors often show up as unique variable names.
+If you had a good reason for having a unique name, then just mention
+it again somehow to suppress the message (the C<use vars> pragma is
+provided for just this purpose).
+
+=item Null picture in formline
+
+(F) The first argument to formline must be a valid format picture
+specification. It was found to be empty, which probably means you
+supplied it an uninitialized value. See L<perlform>.
+
+=item Offset outside string
+
+(F) You tried to do a read/write/send/recv operation with an offset
+pointing outside the buffer. This is difficult to imagine.
+The sole exception to this is that C<sysread()>ing past the buffer
+will extend the buffer and zero pad the new area.
+
+=item Out of memory!
+
+(X|F) The malloc() function returned 0, indicating there was insufficient
+remaining memory (or virtual memory) to satisfy the request.
+
+The request was judged to be small, so the possibility to trap it
+depends on the way Perl was compiled. By default it is not trappable.
+However, if compiled for this, Perl may use the contents of C<$^M> as
+an emergency pool after die()ing with this message. In this case the
+error is trappable I<once>.
+
+=item Out of memory during request for %s
+
+(F) The malloc() function returned 0, indicating there was insufficient
+remaining memory (or virtual memory) to satisfy the request. However,
+the request was judged large enough (compile-time default is 64K), so
+a possibility to shut down by trapping this error is granted.
+
+=item panic: frexp
+
+(P) The library function frexp() failed, making printf("%f") impossible.
+
+=item Possible attempt to put comments in qw() list
+
+(W) qw() lists contain items separated by whitespace; as with literal
+strings, comment characters are not ignored, but are instead treated
+as literal data. (You may have used different delimiters than the
+parentheses shown here; braces are also frequently used.)
+
+You probably wrote something like this:
+
+ @list = qw(
+ a # a comment
+ b # another comment
+ );
+
+when you should have written this:
+
+ @list = qw(
+ a
+ b
+ );
+
+If you really want comments, build your list the
+old-fashioned way, with quotes and commas:
+
+ @list = (
+ 'a', # a comment
+ 'b', # another comment
+ );
+
+=item Possible attempt to separate words with commas
+
+(W) qw() lists contain items separated by whitespace; therefore commas
+aren't needed to separate the items. (You may have used different
+delimiters than the parentheses shown here; braces are also frequently
+used.)
+
+You probably wrote something like this:
+
+ qw! a, b, c !;
+
+which puts literal commas into some of the list items. Write it without
+commas if you don't want them to appear in your data:
+
+ qw! a b c !;
+
+=item Scalar value @%s{%s} better written as $%s{%s}
+
+(W) You've used a hash slice (indicated by @) to select a single element of
+a hash. Generally it's better to ask for a scalar value (indicated by $).
+The difference is that C<$foo{&bar}> always behaves like a scalar, both when
+assigning to it and when evaluating its argument, while C<@foo{&bar}> behaves
+like a list when you assign to it, and provides a list context to its
+subscript, which can do weird things if you're expecting only one subscript.
+
+=item Stub found while resolving method `%s' overloading `%s' in %s
+
+(P) Overloading resolution over @ISA tree may be broken by importing stubs.
+Stubs should never be implicitly created, but explicit calls to C<can>
+may break this.
+
+=item Too late for "B<-T>" option
+
+(X) The #! line (or local equivalent) in a Perl script contains the
+B<-T> option, but Perl was not invoked with B<-T> in its argument
+list. This is an error because, by the time Perl discovers a B<-T> in
+a script, it's too late to properly taint everything from the
+environment. So Perl gives up.
+
+=item untie attempted while %d inner references still exist
+
+(W) A copy of the object returned from C<tie> (or C<tied>) was still
+valid when C<untie> was called.
+
+=item Unrecognized character %s
+
+(F) The Perl parser has no idea what to do with the specified character
+in your Perl script (or eval). Perhaps you tried to run a compressed
+script, a binary program, or a directory as a Perl program.
+
+=item Unsupported function fork
+
+(F) Your version of executable does not support forking.
+
+Note that under some systems, like OS/2, there may be different flavors of
+Perl executables, some of which may support fork, some not. Try changing
+the name you call Perl by to C<perl_>, C<perl__>, and so on.
+
+=item Use of "$$<digit>" to mean "${$}<digit>" is deprecated
+
+(D) Perl versions before 5.004 misinterpreted any type marker followed
+by "$" and a digit. For example, "$$0" was incorrectly taken to mean
+"${$}0" instead of "${$0}". This bug is (mostly) fixed in Perl 5.004.
+
+However, the developers of Perl 5.004 could not fix this bug completely,
+because at least two widely-used modules depend on the old meaning of
+"$$0" in a string. So Perl 5.004 still interprets "$$<digit>" in the
+old (broken) way inside strings; but it generates this message as a
+warning. And in Perl 5.005, this special treatment will cease.
+
+=item Value of %s can be "0"; test with defined()
+
+(W) In a conditional expression, you used <HANDLE>, <*> (glob), C<each()>,
+or C<readdir()> as a boolean value. Each of these constructs can return a
+value of "0"; that would make the conditional expression false, which is
+probably not what you intended. When using these constructs in conditional
+expressions, test their values with the C<defined> operator.
+
+=item Variable "%s" may be unavailable
+
+(W) An inner (nested) I<anonymous> subroutine is inside a I<named>
+subroutine, and outside that is another subroutine; and the anonymous
+(innermost) subroutine is referencing a lexical variable defined in
+the outermost subroutine. For example:
+
+ sub outermost { my $a; sub middle { sub { $a } } }
+
+If the anonymous subroutine is called or referenced (directly or
+indirectly) from the outermost subroutine, it will share the variable
+as you would expect. But if the anonymous subroutine is called or
+referenced when the outermost subroutine is not active, it will see
+the value of the shared variable as it was before and during the
+*first* call to the outermost subroutine, which is probably not what
+you want.
+
+In these circumstances, it is usually best to make the middle
+subroutine anonymous, using the C<sub {}> syntax. Perl has specific
+support for shared variables in nested anonymous subroutines; a named
+subroutine in between interferes with this feature.
+
+=item Variable "%s" will not stay shared
+
+(W) An inner (nested) I<named> subroutine is referencing a lexical
+variable defined in an outer subroutine.
+
+When the inner subroutine is called, it will probably see the value of
+the outer subroutine's variable as it was before and during the
+*first* call to the outer subroutine; in this case, after the first
+call to the outer subroutine is complete, the inner and outer
+subroutines will no longer share a common value for the variable. In
+other words, the variable will no longer be shared.
+
+Furthermore, if the outer subroutine is anonymous and references a
+lexical variable outside itself, then the outer and inner subroutines
+will I<never> share the given variable.
+
+This problem can usually be solved by making the inner subroutine
+anonymous, using the C<sub {}> syntax. When inner anonymous subs that
+reference variables in outer subroutines are called or referenced,
+they are automatically rebound to the current values of such
+variables.
+
+=item Warning: something's wrong
+
+(W) You passed warn() an empty string (the equivalent of C<warn "">) or
+you called it with no args and C<$_> was empty.
+
+=item Ill-formed logical name |%s| in prime_env_iter
+
+(W) A warning peculiar to VMS. A logical name was encountered when preparing
+to iterate over %ENV which violates the syntactic rules governing logical
+names. Since it cannot be translated normally, it is skipped, and will not
+appear in %ENV. This may be a benign occurrence, as some software packages
+might directly modify logical name tables and introduce nonstandard names,
+or it may indicate that a logical name table has been corrupted.
+
+=item Got an error from DosAllocMem
+
+(P) An error peculiar to OS/2. Most probably you're using an obsolete
+version of Perl, and this should not happen anyway.
+
+=item Malformed PERLLIB_PREFIX
+
+(F) An error peculiar to OS/2. PERLLIB_PREFIX should be of the form
+
+ prefix1;prefix2
+
+or
+
+ prefix1 prefix2
+
+with nonempty prefix1 and prefix2. If C<prefix1> is indeed a prefix
+of a builtin library search path, prefix2 is substituted. The error
+may appear if components are not found, or are too long. See
+"PERLLIB_PREFIX" in F<README.os2>.
+
+=item PERL_SH_DIR too long
+
+(F) An error peculiar to OS/2. PERL_SH_DIR is the directory to find the
+C<sh>-shell in. See "PERL_SH_DIR" in F<README.os2>.
+
+=item Process terminated by SIG%s
+
+(W) This is a standard message issued by OS/2 applications, while *nix
+applications die in silence. It is considered a feature of the OS/2
+port. One can easily disable this by appropriate sighandlers, see
+L<perlipc/"Signals">. See also "Process terminated by SIGTERM/SIGINT"
+in F<README.os2>.
+
+=back
+
+=head1 BUGS
+
+If you find what you think is a bug, you might check the headers of
+recently posted articles in the comp.lang.perl.misc newsgroup.
+There may also be information at http://www.perl.com/perl/ , the Perl
+Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Make sure you trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to <F<perlbug@perl.com>> to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl. This file has been
+significantly updated for 5.004, so even veteran users should
+look through it.
+
+The F<README> file for general stuff.
+
+The F<Copying> file for copyright information.
+
+=head1 HISTORY
+
+Constructed by Tom Christiansen, grabbing material with permission
+from innumerable contributors, with kibitzing by more than a few Perl
+porters.
+
+Last update: Wed May 14 11:14:09 EDT 1997
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl5005delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl5005delta.pod
new file mode 100755
index 00000000000..6420f87fa95
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl5005delta.pod
@@ -0,0 +1,993 @@
+=head1 NAME
+
+perl5005delta - what's new for perl5.005
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.004 release and this one.
+
+=head1 About the new versioning system
+
+Perl is now developed on two tracks: a maintenance track that makes
+small, safe updates to released production versions with emphasis on
+compatibility; and a development track that pursues more aggressive
+evolution. Maintenance releases (which should be considered production
+quality) have subversion numbers that run from C<1> to C<49>, and
+development releases (which should be considered "alpha" quality) run
+from C<50> to C<99>.
+
+Perl 5.005 is the combined product of the new dual-track development
+scheme.
+
+=head1 Incompatible Changes
+
+=head2 WARNING: This version is not binary compatible with Perl 5.004.
+
+Starting with Perl 5.004_50 there were many deep and far-reaching changes
+to the language internals. If you have dynamically loaded extensions
+that you built under perl 5.003 or 5.004, you can continue to use them
+with 5.004, but you will need to rebuild and reinstall those extensions
+to use them 5.005. See F<INSTALL> for detailed instructions on how to
+upgrade.
+
+=head2 Default installation structure has changed
+
+The new Configure defaults are designed to allow a smooth upgrade from
+5.004 to 5.005, but you should read F<INSTALL> for a detailed
+discussion of the changes in order to adapt them to your system.
+
+=head2 Perl Source Compatibility
+
+When none of the experimental features are enabled, there should be
+very few user-visible Perl source compatibility issues.
+
+If threads are enabled, then some caveats apply. C<@_> and C<$_> become
+lexical variables. The effect of this should be largely transparent to
+the user, but there are some boundary conditions under which user will
+need to be aware of the issues. For example, C<local(@_)> results in
+a "Can't localize lexical variable @_ ..." message. This may be enabled
+in a future version.
+
+Some new keywords have been introduced. These are generally expected to
+have very little impact on compatibility. See L<New C<INIT> keyword>,
+L<New C<lock> keyword>, and L<New C<qrE<sol>E<sol>> operator>.
+
+Certain barewords are now reserved. Use of these will provoke a warning
+if you have asked for them with the C<-w> switch.
+See L<C<our> is now a reserved word>.
+
+=head2 C Source Compatibility
+
+There have been a large number of changes in the internals to support
+the new features in this release.
+
+=over 4
+
+=item *
+
+Core sources now require ANSI C compiler
+
+An ANSI C compiler is now B<required> to build perl. See F<INSTALL>.
+
+=item *
+
+All Perl global variables must now be referenced with an explicit prefix
+
+All Perl global variables that are visible for use by extensions now
+have a C<PL_> prefix. New extensions should C<not> refer to perl globals
+by their unqualified names. To preserve sanity, we provide limited
+backward compatibility for globals that are being widely used like
+C<sv_undef> and C<na> (which should now be written as C<PL_sv_undef>,
+C<PL_na> etc.)
+
+If you find that your XS extension does not compile anymore because a
+perl global is not visible, try adding a C<PL_> prefix to the global
+and rebuild.
+
+It is strongly recommended that all functions in the Perl API that don't
+begin with C<perl> be referenced with a C<Perl_> prefix. The bare function
+names without the C<Perl_> prefix are supported with macros, but this
+support may cease in a future release.
+
+See L<perlapi>.
+
+=item *
+
+Enabling threads has source compatibility issues
+
+Perl built with threading enabled requires extensions to use the new
+C<dTHR> macro to initialize the handle to access per-thread data.
+If you see a compiler error that talks about the variable C<thr> not
+being declared (when building a module that has XS code), you need
+to add C<dTHR;> at the beginning of the block that elicited the error.
+
+The API function C<perl_get_sv("@",GV_ADD)> should be used instead of
+directly accessing perl globals as C<GvSV(errgv)>. The API call is
+backward compatible with existing perls and provides source compatibility
+with threading is enabled.
+
+See L<"C Source Compatibility"> for more information.
+
+=back
+
+=head2 Binary Compatibility
+
+This version is NOT binary compatible with older versions. All extensions
+will need to be recompiled. Further binaries built with threads enabled
+are incompatible with binaries built without. This should largely be
+transparent to the user, as all binary incompatible configurations have
+their own unique architecture name, and extension binaries get installed at
+unique locations. This allows coexistence of several configurations in
+the same directory hierarchy. See F<INSTALL>.
+
+=head2 Security fixes may affect compatibility
+
+A few taint leaks and taint omissions have been corrected. This may lead
+to "failure" of scripts that used to work with older versions. Compiling
+with -DINCOMPLETE_TAINTS provides a perl with minimal amounts of changes
+to the tainting behavior. But note that the resulting perl will have
+known insecurities.
+
+Oneliners with the C<-e> switch do not create temporary files anymore.
+
+=head2 Relaxed new mandatory warnings introduced in 5.004
+
+Many new warnings that were introduced in 5.004 have been made
+optional. Some of these warnings are still present, but perl's new
+features make them less often a problem. See L<New Diagnostics>.
+
+=head2 Licensing
+
+Perl has a new Social Contract for contributors. See F<Porting/Contract>.
+
+The license included in much of the Perl documentation has changed.
+Most of the Perl documentation was previously under the implicit GNU
+General Public License or the Artistic License (at the user's choice).
+Now much of the documentation unambiguously states the terms under which
+it may be distributed. Those terms are in general much less restrictive
+than the GNU GPL. See L<perl> and the individual perl manpages listed
+therein.
+
+=head1 Core Changes
+
+
+=head2 Threads
+
+WARNING: Threading is considered an B<experimental> feature. Details of the
+implementation may change without notice. There are known limitations
+and some bugs. These are expected to be fixed in future versions.
+
+See F<README.threads>.
+
+=head2 Compiler
+
+WARNING: The Compiler and related tools are considered B<experimental>.
+Features may change without notice, and there are known limitations
+and bugs. Since the compiler is fully external to perl, the default
+configuration will build and install it.
+
+The Compiler produces three different types of transformations of a
+perl program. The C backend generates C code that captures perl's state
+just before execution begins. It eliminates the compile-time overheads
+of the regular perl interpreter, but the run-time performance remains
+comparatively the same. The CC backend generates optimized C code
+equivalent to the code path at run-time. The CC backend has greater
+potential for big optimizations, but only a few optimizations are
+implemented currently. The Bytecode backend generates a platform
+independent bytecode representation of the interpreter's state
+just before execution. Thus, the Bytecode back end also eliminates
+much of the compilation overhead of the interpreter.
+
+The compiler comes with several valuable utilities.
+
+C<B::Lint> is an experimental module to detect and warn about suspicious
+code, especially the cases that the C<-w> switch does not detect.
+
+C<B::Deparse> can be used to demystify perl code, and understand
+how perl optimizes certain constructs.
+
+C<B::Xref> generates cross reference reports of all definition and use
+of variables, subroutines and formats in a program.
+
+C<B::Showlex> show the lexical variables used by a subroutine or file
+at a glance.
+
+C<perlcc> is a simple frontend for compiling perl.
+
+See C<ext/B/README>, L<B>, and the respective compiler modules.
+
+=head2 Regular Expressions
+
+Perl's regular expression engine has been seriously overhauled, and
+many new constructs are supported. Several bugs have been fixed.
+
+Here is an itemized summary:
+
+=over 4
+
+=item Many new and improved optimizations
+
+Changes in the RE engine:
+
+ Unneeded nodes removed;
+ Substrings merged together;
+ New types of nodes to process (SUBEXPR)* and similar expressions
+ quickly, used if the SUBEXPR has no side effects and matches
+ strings of the same length;
+ Better optimizations by lookup for constant substrings;
+ Better search for constants substrings anchored by $ ;
+
+Changes in Perl code using RE engine:
+
+ More optimizations to s/longer/short/;
+ study() was not working;
+ /blah/ may be optimized to an analogue of index() if $& $` $' not seen;
+ Unneeded copying of matched-against string removed;
+ Only matched part of the string is copying if $` $' were not seen;
+
+=item Many bug fixes
+
+Note that only the major bug fixes are listed here. See F<Changes> for others.
+
+ Backtracking might not restore start of $3.
+ No feedback if max count for * or + on "complex" subexpression
+ was reached, similarly (but at compile time) for {3,34567}
+ Primitive restrictions on max count introduced to decrease a
+ possibility of a segfault;
+ (ZERO-LENGTH)* could segfault;
+ (ZERO-LENGTH)* was prohibited;
+ Long REs were not allowed;
+ /RE/g could skip matches at the same position after a
+ zero-length match;
+
+=item New regular expression constructs
+
+The following new syntax elements are supported:
+
+ (?<=RE)
+ (?<!RE)
+ (?{ CODE })
+ (?i-x)
+ (?i:RE)
+ (?(COND)YES_RE|NO_RE)
+ (?>RE)
+ \z
+
+=item New operator for precompiled regular expressions
+
+See L<New C<qrE<sol>E<sol>> operator>.
+
+=item Other improvements
+
+ Better debugging output (possibly with colors),
+ even from non-debugging Perl;
+ RE engine code now looks like C, not like assembler;
+ Behaviour of RE modifiable by `use re' directive;
+ Improved documentation;
+ Test suite significantly extended;
+ Syntax [:^upper:] etc., reserved inside character classes;
+
+=item Incompatible changes
+
+ (?i) localized inside enclosing group;
+ $( is not interpolated into RE any more;
+ /RE/g may match at the same position (with non-zero length)
+ after a zero-length match (bug fix).
+
+=back
+
+See L<perlre> and L<perlop>.
+
+=head2 Improved malloc()
+
+See banner at the beginning of C<malloc.c> for details.
+
+=head2 Quicksort is internally implemented
+
+Perl now contains its own highly optimized qsort() routine. The new qsort()
+is resistant to inconsistent comparison functions, so Perl's C<sort()> will
+not provoke coredumps any more when given poorly written sort subroutines.
+(Some C library C<qsort()>s that were being used before used to have this
+problem.) In our testing, the new C<qsort()> required the minimal number
+of pair-wise compares on average, among all known C<qsort()> implementations.
+
+See C<perlfunc/sort>.
+
+=head2 Reliable signals
+
+Perl's signal handling is susceptible to random crashes, because signals
+arrive asynchronously, and the Perl runtime is not reentrant at arbitrary
+times.
+
+However, one experimental implementation of reliable signals is available
+when threads are enabled. See C<Thread::Signal>. Also see F<INSTALL> for
+how to build a Perl capable of threads.
+
+=head2 Reliable stack pointers
+
+The internals now reallocate the perl stack only at predictable times.
+In particular, magic calls never trigger reallocations of the stack,
+because all reentrancy of the runtime is handled using a "stack of stacks".
+This should improve reliability of cached stack pointers in the internals
+and in XSUBs.
+
+=head2 More generous treatment of carriage returns
+
+Perl used to complain if it encountered literal carriage returns in
+scripts. Now they are mostly treated like whitespace within program text.
+Inside string literals and here documents, literal carriage returns are
+ignored if they occur paired with linefeeds, or get interpreted as whitespace
+if they stand alone. This behavior means that literal carriage returns
+in files should be avoided. You can get the older, more compatible (but
+less generous) behavior by defining the preprocessor symbol
+C<PERL_STRICT_CR> when building perl. Of course, all this has nothing
+whatever to do with how escapes like C<\r> are handled within strings.
+
+Note that this doesn't somehow magically allow you to keep all text files
+in DOS format. The generous treatment only applies to files that perl
+itself parses. If your C compiler doesn't allow carriage returns in
+files, you may still be unable to build modules that need a C compiler.
+
+=head2 Memory leaks
+
+C<substr>, C<pos> and C<vec> don't leak memory anymore when used in lvalue
+context. Many small leaks that impacted applications that embed multiple
+interpreters have been fixed.
+
+=head2 Better support for multiple interpreters
+
+The build-time option C<-DMULTIPLICITY> has had many of the details
+reworked. Some previously global variables that should have been
+per-interpreter now are. With care, this allows interpreters to call
+each other. See the C<PerlInterp> extension on CPAN.
+
+=head2 Behavior of local() on array and hash elements is now well-defined
+
+See L<perlsub/"Temporary Values via local()">.
+
+=head2 C<%!> is transparently tied to the L<Errno> module
+
+See L<perlvar>, and L<Errno>.
+
+=head2 Pseudo-hashes are supported
+
+See L<perlref>.
+
+=head2 C<EXPR foreach EXPR> is supported
+
+See L<perlsyn>.
+
+=head2 Keywords can be globally overridden
+
+See L<perlsub>.
+
+=head2 C<$^E> is meaningful on Win32
+
+See L<perlvar>.
+
+=head2 C<foreach (1..1000000)> optimized
+
+C<foreach (1..1000000)> is now optimized into a counting loop. It does
+not try to allocate a 1000000-size list anymore.
+
+=head2 C<Foo::> can be used as implicitly quoted package name
+
+Barewords caused unintuitive behavior when a subroutine with the same
+name as a package happened to be defined. Thus, C<new Foo @args>,
+use the result of the call to C<Foo()> instead of C<Foo> being treated
+as a literal. The recommended way to write barewords in the indirect
+object slot is C<new Foo:: @args>. Note that the method C<new()> is
+called with a first argument of C<Foo>, not C<Foo::> when you do that.
+
+=head2 C<exists $Foo::{Bar::}> tests existence of a package
+
+It was impossible to test for the existence of a package without
+actually creating it before. Now C<exists $Foo::{Bar::}> can be
+used to test if the C<Foo::Bar> namespace has been created.
+
+=head2 Better locale support
+
+See L<perllocale>.
+
+=head2 Experimental support for 64-bit platforms
+
+Perl5 has always had 64-bit support on systems with 64-bit longs.
+Starting with 5.005, the beginnings of experimental support for systems
+with 32-bit long and 64-bit 'long long' integers has been added.
+If you add -DUSE_LONG_LONG to your ccflags in config.sh (or manually
+define it in perl.h) then perl will be built with 'long long' support.
+There will be many compiler warnings, and the resultant perl may not
+work on all systems. There are many other issues related to
+third-party extensions and libraries. This option exists to allow
+people to work on those issues.
+
+=head2 prototype() returns useful results on builtins
+
+See L<perlfunc/prototype>.
+
+=head2 Extended support for exception handling
+
+C<die()> now accepts a reference value, and C<$@> gets set to that
+value in exception traps. This makes it possible to propagate
+exception objects. This is an undocumented B<experimental> feature.
+
+=head2 Re-blessing in DESTROY() supported for chaining DESTROY() methods
+
+See L<perlobj/Destructors>.
+
+=head2 All C<printf> format conversions are handled internally
+
+See L<perlfunc/printf>.
+
+=head2 New C<INIT> keyword
+
+C<INIT> subs are like C<BEGIN> and C<END>, but they get run just before
+the perl runtime begins execution. e.g., the Perl Compiler makes use of
+C<INIT> blocks to initialize and resolve pointers to XSUBs.
+
+=head2 New C<lock> keyword
+
+The C<lock> keyword is the fundamental synchronization primitive
+in threaded perl. When threads are not enabled, it is currently a noop.
+
+To minimize impact on source compatibility this keyword is "weak", i.e., any
+user-defined subroutine of the same name overrides it, unless a C<use Thread>
+has been seen.
+
+=head2 New C<qr//> operator
+
+The C<qr//> operator, which is syntactically similar to the other quote-like
+operators, is used to create precompiled regular expressions. This compiled
+form can now be explicitly passed around in variables, and interpolated in
+other regular expressions. See L<perlop>.
+
+=head2 C<our> is now a reserved word
+
+Calling a subroutine with the name C<our> will now provoke a warning when
+using the C<-w> switch.
+
+=head2 Tied arrays are now fully supported
+
+See L<Tie::Array>.
+
+=head2 Tied handles support is better
+
+Several missing hooks have been added. There is also a new base class for
+TIEARRAY implementations. See L<Tie::Array>.
+
+=head2 4th argument to substr
+
+substr() can now both return and replace in one operation. The optional
+4th argument is the replacement string. See L<perlfunc/substr>.
+
+=head2 Negative LENGTH argument to splice
+
+splice() with a negative LENGTH argument now work similar to what the
+LENGTH did for substr(). Previously a negative LENGTH was treated as
+0. See L<perlfunc/splice>.
+
+=head2 Magic lvalues are now more magical
+
+When you say something like C<substr($x, 5) = "hi">, the scalar returned
+by substr() is special, in that any modifications to it affect $x.
+(This is called a 'magic lvalue' because an 'lvalue' is something on
+the left side of an assignment.) Normally, this is exactly what you
+would expect to happen, but Perl uses the same magic if you use substr(),
+pos(), or vec() in a context where they might be modified, like taking
+a reference with C<\> or as an argument to a sub that modifies C<@_>.
+In previous versions, this 'magic' only went one way, but now changes
+to the scalar the magic refers to ($x in the above example) affect the
+magic lvalue too. For instance, this code now acts differently:
+
+ $x = "hello";
+ sub printit {
+ $x = "g'bye";
+ print $_[0], "\n";
+ }
+ printit(substr($x, 0, 5));
+
+In previous versions, this would print "hello", but it now prints "g'bye".
+
+=head2 <> now reads in records
+
+If C<$/> is a reference to an integer, or a scalar that holds an integer,
+<> will read in records instead of lines. For more info, see
+L<perlvar/$E<sol>>.
+
+=head1 Supported Platforms
+
+Configure has many incremental improvements. Site-wide policy for building
+perl can now be made persistent, via Policy.sh. Configure also records
+the command-line arguments used in F<config.sh>.
+
+=head2 New Platforms
+
+BeOS is now supported. See F<README.beos>.
+
+DOS is now supported under the DJGPP tools. See F<README.dos> (installed
+as L<perldos> on some systems).
+
+MiNT is now supported. See F<README.mint>.
+
+MPE/iX is now supported. See F<README.mpeix>.
+
+MVS (aka OS390, aka Open Edition) is now supported. See F<README.os390>
+(installed as L<perlos390> on some systems).
+
+Stratus VOS is now supported. See F<README.vos>.
+
+=head2 Changes in existing support
+
+Win32 support has been vastly enhanced. Support for Perl Object, a C++
+encapsulation of Perl. GCC and EGCS are now supported on Win32.
+See F<README.win32>, aka L<perlwin32>.
+
+VMS configuration system has been rewritten. See F<README.vms> (installed
+as L<README_vms> on some systems).
+
+The hints files for most Unix platforms have seen incremental improvements.
+
+=head1 Modules and Pragmata
+
+=head2 New Modules
+
+=over 4
+
+=item B
+
+Perl compiler and tools. See L<B>.
+
+=item Data::Dumper
+
+A module to pretty print Perl data. See L<Data::Dumper>.
+
+=item Dumpvalue
+
+A module to dump perl values to the screen. See L<Dumpvalue>.
+
+=item Errno
+
+A module to look up errors more conveniently. See L<Errno>.
+
+=item File::Spec
+
+A portable API for file operations.
+
+=item ExtUtils::Installed
+
+Query and manage installed modules.
+
+=item ExtUtils::Packlist
+
+Manipulate .packlist files.
+
+=item Fatal
+
+Make functions/builtins succeed or die.
+
+=item IPC::SysV
+
+Constants and other support infrastructure for System V IPC operations
+in perl.
+
+=item Test
+
+A framework for writing test suites.
+
+=item Tie::Array
+
+Base class for tied arrays.
+
+=item Tie::Handle
+
+Base class for tied handles.
+
+=item Thread
+
+Perl thread creation, manipulation, and support.
+
+=item attrs
+
+Set subroutine attributes.
+
+=item fields
+
+Compile-time class fields.
+
+=item re
+
+Various pragmata to control behavior of regular expressions.
+
+=back
+
+=head2 Changes in existing modules
+
+=over 4
+
+=item Benchmark
+
+You can now run tests for I<x> seconds instead of guessing the right
+number of tests to run.
+
+Keeps better time.
+
+=item Carp
+
+Carp has a new function cluck(). cluck() warns, like carp(), but also adds
+a stack backtrace to the error message, like confess().
+
+=item CGI
+
+CGI has been updated to version 2.42.
+
+=item Fcntl
+
+More Fcntl constants added: F_SETLK64, F_SETLKW64, O_LARGEFILE for
+large (more than 4G) file access (the 64-bit support is not yet
+working, though, so no need to get overly excited), Free/Net/OpenBSD
+locking behaviour flags F_FLOCK, F_POSIX, Linux F_SHLCK, and
+O_ACCMODE: the mask of O_RDONLY, O_WRONLY, and O_RDWR.
+
+=item Math::Complex
+
+The accessors methods Re, Im, arg, abs, rho, theta, methods can
+($z->Re()) now also act as mutators ($z->Re(3)).
+
+=item Math::Trig
+
+A little bit of radial trigonometry (cylindrical and spherical) added,
+for example the great circle distance.
+
+=item POSIX
+
+POSIX now has its own platform-specific hints files.
+
+=item DB_File
+
+DB_File supports version 2.x of Berkeley DB. See C<ext/DB_File/Changes>.
+
+=item MakeMaker
+
+MakeMaker now supports writing empty makefiles, provides a way to
+specify that site umask() policy should be honored. There is also
+better support for manipulation of .packlist files, and getting
+information about installed modules.
+
+Extensions that have both architecture-dependent and
+architecture-independent files are now always installed completely in
+the architecture-dependent locations. Previously, the shareable parts
+were shared both across architectures and across perl versions and were
+therefore liable to be overwritten with newer versions that might have
+subtle incompatibilities.
+
+=item CPAN
+
+See L<perlmodinstall> and L<CPAN>.
+
+=item Cwd
+
+Cwd::cwd is faster on most platforms.
+
+=back
+
+=head1 Utility Changes
+
+C<h2ph> and related utilities have been vastly overhauled.
+
+C<perlcc>, a new experimental front end for the compiler is available.
+
+The crude GNU C<configure> emulator is now called C<configure.gnu> to
+avoid trampling on C<Configure> under case-insensitive filesystems.
+
+C<perldoc> used to be rather slow. The slower features are now optional.
+In particular, case-insensitive searches need the C<-i> switch, and
+recursive searches need C<-r>. You can set these switches in the
+C<PERLDOC> environment variable to get the old behavior.
+
+=head1 Documentation Changes
+
+Config.pm now has a glossary of variables.
+
+F<Porting/patching.pod> has detailed instructions on how to create and
+submit patches for perl.
+
+L<perlport> specifies guidelines on how to write portably.
+
+L<perlmodinstall> describes how to fetch and install modules from C<CPAN>
+sites.
+
+Some more Perl traps are documented now. See L<perltrap>.
+
+L<perlopentut> gives a tutorial on using open().
+
+L<perlreftut> gives a tutorial on references.
+
+L<perlthrtut> gives a tutorial on threads.
+
+=head1 New Diagnostics
+
+=over 4
+
+=item Ambiguous call resolved as CORE::%s(), qualify as such or use &
+
+(W) A subroutine you have declared has the same name as a Perl keyword,
+and you have used the name without qualification for calling one or the
+other. Perl decided to call the builtin because the subroutine is
+not imported.
+
+To force interpretation as a subroutine call, either put an ampersand
+before the subroutine name, or qualify the name with its package.
+Alternatively, you can import the subroutine (or pretend that it's
+imported with the C<use subs> pragma).
+
+To silently interpret it as the Perl operator, use the C<CORE::> prefix
+on the operator (e.g. C<CORE::log($x)>) or by declaring the subroutine
+to be an object method (see L<attrs>).
+
+=item Bad index while coercing array into hash
+
+(F) The index looked up in the hash found as the 0'th element of a
+pseudo-hash is not legal. Index values must be at 1 or greater.
+See L<perlref>.
+
+=item Bareword "%s" refers to nonexistent package
+
+(W) You used a qualified bareword of the form C<Foo::>, but
+the compiler saw no other uses of that namespace before that point.
+Perhaps you need to predeclare a package?
+
+=item Can't call method "%s" on an undefined value
+
+(F) You used the syntax of a method call, but the slot filled by the
+object reference or package name contains an undefined value.
+Something like this will reproduce the error:
+
+ $BADREF = 42;
+ process $BADREF 1,2,3;
+ $BADREF->process(1,2,3);
+
+=item Can't check filesystem of script "%s" for nosuid
+
+(P) For some reason you can't check the filesystem of the script for nosuid.
+
+=item Can't coerce array into hash
+
+(F) You used an array where a hash was expected, but the array has no
+information on how to map from keys to array indices. You can do that
+only with arrays that have a hash reference at index 0.
+
+=item Can't goto subroutine from an eval-string
+
+(F) The "goto subroutine" call can't be used to jump out of an eval "string".
+(You can use it to jump out of an eval {BLOCK}, but you probably don't want to.)
+
+=item Can't localize pseudo-hash element
+
+(F) You said something like C<< local $ar->{'key'} >>, where $ar is
+a reference to a pseudo-hash. That hasn't been implemented yet, but
+you can get a similar effect by localizing the corresponding array
+element directly -- C<< local $ar->[$ar->[0]{'key'}] >>.
+
+=item Can't use %%! because Errno.pm is not available
+
+(F) The first time the %! hash is used, perl automatically loads the
+Errno.pm module. The Errno module is expected to tie the %! hash to
+provide symbolic names for C<$!> errno values.
+
+=item Cannot find an opnumber for "%s"
+
+(F) A string of a form C<CORE::word> was given to prototype(), but
+there is no builtin with the name C<word>.
+
+=item Character class syntax [. .] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax beginning
+with "[." and ending with ".]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[." and ".\]".
+
+=item Character class syntax [: :] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax beginning
+with "[:" and ending with ":]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[:" and ":\]".
+
+=item Character class syntax [= =] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax
+beginning with "[=" and ending with "=]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[=" and "=\]".
+
+=item %s: Eval-group in insecure regular expression
+
+(F) Perl detected tainted data when trying to compile a regular expression
+that contains the C<(?{ ... })> zero-width assertion, which is unsafe.
+See L<perlre/(?{ code })>, and L<perlsec>.
+
+=item %s: Eval-group not allowed, use re 'eval'
+
+(F) A regular expression contained the C<(?{ ... })> zero-width assertion,
+but that construct is only allowed when the C<use re 'eval'> pragma is
+in effect. See L<perlre/(?{ code })>.
+
+=item %s: Eval-group not allowed at run time
+
+(F) Perl tried to compile a regular expression containing the C<(?{ ... })>
+zero-width assertion at run time, as it would when the pattern contains
+interpolated values. Since that is a security risk, it is not allowed.
+If you insist, you may still do this by explicitly building the pattern
+from an interpolated string at run time and using that in an eval().
+See L<perlre/(?{ code })>.
+
+=item Explicit blessing to '' (assuming package main)
+
+(W) You are blessing a reference to a zero length string. This has
+the effect of blessing the reference into the package main. This is
+usually not what you want. Consider providing a default target
+package, e.g. bless($ref, $p || 'MyPackage');
+
+=item Illegal hex digit ignored
+
+(W) You may have tried to use a character other than 0 - 9 or A - F in a
+hexadecimal number. Interpretation of the hexadecimal number stopped
+before the illegal character.
+
+=item No such array field
+
+(F) You tried to access an array as a hash, but the field name used is
+not defined. The hash at index 0 should map all valid field names to
+array indices for that to work.
+
+=item No such field "%s" in variable %s of type %s
+
+(F) You tried to access a field of a typed variable where the type
+does not know about the field name. The field names are looked up in
+the %FIELDS hash in the type package at compile time. The %FIELDS hash
+is usually set up with the 'fields' pragma.
+
+=item Out of memory during ridiculously large request
+
+(F) You can't allocate more than 2^31+"small amount" bytes. This error
+is most likely to be caused by a typo in the Perl program. e.g., C<$arr[time]>
+instead of C<$arr[$time]>.
+
+=item Range iterator outside integer range
+
+(F) One (or both) of the numeric arguments to the range operator ".."
+are outside the range which can be represented by integers internally.
+One possible workaround is to force Perl to use magical string
+increment by prepending "0" to your numbers.
+
+=item Recursive inheritance detected while looking for method '%s' %s
+
+(F) More than 100 levels of inheritance were encountered while invoking a
+method. Probably indicates an unintended loop in your inheritance hierarchy.
+
+=item Reference found where even-sized list expected
+
+(W) You gave a single reference where Perl was expecting a list with
+an even number of elements (for assignment to a hash). This
+usually means that you used the anon hash constructor when you meant
+to use parens. In any case, a hash requires key/value B<pairs>.
+
+ %hash = { one => 1, two => 2, }; # WRONG
+ %hash = [ qw/ an anon array / ]; # WRONG
+ %hash = ( one => 1, two => 2, ); # right
+ %hash = qw( one 1 two 2 ); # also fine
+
+=item Undefined value assigned to typeglob
+
+(W) An undefined value was assigned to a typeglob, a la C<*foo = undef>.
+This does nothing. It's possible that you really mean C<undef *foo>.
+
+=item Use of reserved word "%s" is deprecated
+
+(D) The indicated bareword is a reserved word. Future versions of perl
+may use it as a keyword, so you're better off either explicitly quoting
+the word in a manner appropriate for its context of use, or using a
+different name altogether. The warning can be suppressed for subroutine
+names by either adding a C<&> prefix, or using a package qualifier,
+e.g. C<&our()>, or C<Foo::our()>.
+
+=item perl: warning: Setting locale failed.
+
+(S) The whole warning message will look something like:
+
+ perl: warning: Setting locale failed.
+ perl: warning: Please check that your locale settings:
+ LC_ALL = "En_US",
+ LANG = (unset)
+ are supported and installed on your system.
+ perl: warning: Falling back to the standard locale ("C").
+
+Exactly what were the failed locale settings varies. In the above the
+settings were that the LC_ALL was "En_US" and the LANG had no value.
+This error means that Perl detected that you and/or your system
+administrator have set up the so-called variable system but Perl could
+not use those settings. This was not dead serious, fortunately: there
+is a "default locale" called "C" that Perl can and will use, the
+script will be run. Before you really fix the problem, however, you
+will get the same error message each time you run Perl. How to really
+fix the problem can be found in L<perllocale/"LOCALE PROBLEMS">.
+
+=back
+
+
+=head1 Obsolete Diagnostics
+
+=over 4
+
+=item Can't mktemp()
+
+(F) The mktemp() routine failed for some reason while trying to process
+a B<-e> switch. Maybe your /tmp partition is full, or clobbered.
+
+Removed because B<-e> doesn't use temporary files any more.
+
+=item Can't write to temp file for B<-e>: %s
+
+(F) The write routine failed for some reason while trying to process
+a B<-e> switch. Maybe your /tmp partition is full, or clobbered.
+
+Removed because B<-e> doesn't use temporary files any more.
+
+=item Cannot open temporary file
+
+(F) The create routine failed for some reason while trying to process
+a B<-e> switch. Maybe your /tmp partition is full, or clobbered.
+
+Removed because B<-e> doesn't use temporary files any more.
+
+=item regexp too big
+
+(F) The current implementation of regular expressions uses shorts as
+address offsets within a string. Unfortunately this means that if
+the regular expression compiles to longer than 32767, it'll blow up.
+Usually when you want a regular expression this big, there is a better
+way to do it with multiple statements. See L<perlre>.
+
+=back
+
+=head1 Configuration Changes
+
+You can use "Configure -Uinstallusrbinperl" which causes installperl
+to skip installing perl also as /usr/bin/perl. This is useful if you
+prefer not to modify /usr/bin for some reason or another but harmful
+because many scripts assume to find Perl in /usr/bin/perl.
+
+=head1 BUGS
+
+If you find what you think is a bug, you might check the headers of
+recently posted articles in the comp.lang.perl.misc newsgroup.
+There may also be information at http://www.perl.com/perl/ , the Perl
+Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Make sure you trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to <F<perlbug@perl.com>> to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Gurusamy Sarathy <F<gsar@activestate.com>>, with many contributions
+from The Perl Porters.
+
+Send omissions or corrections to <F<perlbug@perl.com>>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl5100delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl5100delta.pod
new file mode 100755
index 00000000000..fe9f02ee43b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl5100delta.pod
@@ -0,0 +1,1591 @@
+=encoding utf8
+
+=head1 NAME
+
+perl5100delta - what is new for perl 5.10.0
+
+=head1 DESCRIPTION
+
+This document describes the differences between the 5.8.8 release and
+the 5.10.0 release.
+
+Many of the bug fixes in 5.10.0 were already seen in the 5.8.X maintenance
+releases; they are not duplicated here and are documented in the set of
+man pages named perl58[1-8]?delta.
+
+=head1 Core Enhancements
+
+=head2 The C<feature> pragma
+
+The C<feature> pragma is used to enable new syntax that would break Perl's
+backwards-compatibility with older releases of the language. It's a lexical
+pragma, like C<strict> or C<warnings>.
+
+Currently the following new features are available: C<switch> (adds a
+switch statement), C<say> (adds a C<say> built-in function), and C<state>
+(adds a C<state> keyword for declaring "static" variables). Those
+features are described in their own sections of this document.
+
+The C<feature> pragma is also implicitly loaded when you require a minimal
+perl version (with the C<use VERSION> construct) greater than, or equal
+to, 5.9.5. See L<feature> for details.
+
+=head2 New B<-E> command-line switch
+
+B<-E> is equivalent to B<-e>, but it implicitly enables all
+optional features (like C<use feature ":5.10">).
+
+=head2 Defined-or operator
+
+A new operator C<//> (defined-or) has been implemented.
+The following expression:
+
+ $a // $b
+
+is merely equivalent to
+
+ defined $a ? $a : $b
+
+and the statement
+
+ $c //= $d;
+
+can now be used instead of
+
+ $c = $d unless defined $c;
+
+The C<//> operator has the same precedence and associativity as C<||>.
+Special care has been taken to ensure that this operator Do What You Mean
+while not breaking old code, but some edge cases involving the empty
+regular expression may now parse differently. See L<perlop> for
+details.
+
+=head2 Switch and Smart Match operator
+
+Perl 5 now has a switch statement. It's available when C<use feature
+'switch'> is in effect. This feature introduces three new keywords,
+C<given>, C<when>, and C<default>:
+
+ given ($foo) {
+ when (/^abc/) { $abc = 1; }
+ when (/^def/) { $def = 1; }
+ when (/^xyz/) { $xyz = 1; }
+ default { $nothing = 1; }
+ }
+
+A more complete description of how Perl matches the switch variable
+against the C<when> conditions is given in L<perlsyn/"Switch statements">.
+
+This kind of match is called I<smart match>, and it's also possible to use
+it outside of switch statements, via the new C<~~> operator. See
+L<perlsyn/"Smart matching in detail">.
+
+This feature was contributed by Robin Houston.
+
+=head2 Regular expressions
+
+=over 4
+
+=item Recursive Patterns
+
+It is now possible to write recursive patterns without using the C<(??{})>
+construct. This new way is more efficient, and in many cases easier to
+read.
+
+Each capturing parenthesis can now be treated as an independent pattern
+that can be entered by using the C<(?PARNO)> syntax (C<PARNO> standing for
+"parenthesis number"). For example, the following pattern will match
+nested balanced angle brackets:
+
+ /
+ ^ # start of line
+ ( # start capture buffer 1
+ < # match an opening angle bracket
+ (?: # match one of:
+ (?> # don't backtrack over the inside of this group
+ [^<>]+ # one or more non angle brackets
+ ) # end non backtracking group
+ | # ... or ...
+ (?1) # recurse to bracket 1 and try it again
+ )* # 0 or more times.
+ > # match a closing angle bracket
+ ) # end capture buffer one
+ $ # end of line
+ /x
+
+PCRE users should note that Perl's recursive regex feature allows
+backtracking into a recursed pattern, whereas in PCRE the recursion is
+atomic or "possessive" in nature. As in the example above, you can
+add (?>) to control this selectively. (Yves Orton)
+
+=item Named Capture Buffers
+
+It is now possible to name capturing parenthesis in a pattern and refer to
+the captured contents by name. The naming syntax is C<< (?<NAME>....) >>.
+It's possible to backreference to a named buffer with the C<< \k<NAME> >>
+syntax. In code, the new magical hashes C<%+> and C<%-> can be used to
+access the contents of the capture buffers.
+
+Thus, to replace all doubled chars with a single copy, one could write
+
+ s/(?<letter>.)\k<letter>/$+{letter}/g
+
+Only buffers with defined contents will be "visible" in the C<%+> hash, so
+it's possible to do something like
+
+ foreach my $name (keys %+) {
+ print "content of buffer '$name' is $+{$name}\n";
+ }
+
+The C<%-> hash is a bit more complete, since it will contain array refs
+holding values from all capture buffers similarly named, if there should
+be many of them.
+
+C<%+> and C<%-> are implemented as tied hashes through the new module
+C<Tie::Hash::NamedCapture>.
+
+Users exposed to the .NET regex engine will find that the perl
+implementation differs in that the numerical ordering of the buffers
+is sequential, and not "unnamed first, then named". Thus in the pattern
+
+ /(A)(?<B>B)(C)(?<D>D)/
+
+$1 will be 'A', $2 will be 'B', $3 will be 'C' and $4 will be 'D' and not
+$1 is 'A', $2 is 'C' and $3 is 'B' and $4 is 'D' that a .NET programmer
+would expect. This is considered a feature. :-) (Yves Orton)
+
+=item Possessive Quantifiers
+
+Perl now supports the "possessive quantifier" syntax of the "atomic match"
+pattern. Basically a possessive quantifier matches as much as it can and never
+gives any back. Thus it can be used to control backtracking. The syntax is
+similar to non-greedy matching, except instead of using a '?' as the modifier
+the '+' is used. Thus C<?+>, C<*+>, C<++>, C<{min,max}+> are now legal
+quantifiers. (Yves Orton)
+
+=item Backtracking control verbs
+
+The regex engine now supports a number of special-purpose backtrack
+control verbs: (*THEN), (*PRUNE), (*MARK), (*SKIP), (*COMMIT), (*FAIL)
+and (*ACCEPT). See L<perlre> for their descriptions. (Yves Orton)
+
+=item Relative backreferences
+
+A new syntax C<\g{N}> or C<\gN> where "N" is a decimal integer allows a
+safer form of back-reference notation as well as allowing relative
+backreferences. This should make it easier to generate and embed patterns
+that contain backreferences. See L<perlre/"Capture buffers">. (Yves Orton)
+
+=item C<\K> escape
+
+The functionality of Jeff Pinyan's module Regexp::Keep has been added to
+the core. In regular expressions you can now use the special escape C<\K>
+as a way to do something like floating length positive lookbehind. It is
+also useful in substitutions like:
+
+ s/(foo)bar/$1/g
+
+that can now be converted to
+
+ s/foo\Kbar//g
+
+which is much more efficient. (Yves Orton)
+
+=item Vertical and horizontal whitespace, and linebreak
+
+Regular expressions now recognize the C<\v> and C<\h> escapes that match
+vertical and horizontal whitespace, respectively. C<\V> and C<\H>
+logically match their complements.
+
+C<\R> matches a generic linebreak, that is, vertical whitespace, plus
+the multi-character sequence C<"\x0D\x0A">.
+
+=back
+
+=head2 C<say()>
+
+say() is a new built-in, only available when C<use feature 'say'> is in
+effect, that is similar to print(), but that implicitly appends a newline
+to the printed string. See L<perlfunc/say>. (Robin Houston)
+
+=head2 Lexical C<$_>
+
+The default variable C<$_> can now be lexicalized, by declaring it like
+any other lexical variable, with a simple
+
+ my $_;
+
+The operations that default on C<$_> will use the lexically-scoped
+version of C<$_> when it exists, instead of the global C<$_>.
+
+In a C<map> or a C<grep> block, if C<$_> was previously my'ed, then the
+C<$_> inside the block is lexical as well (and scoped to the block).
+
+In a scope where C<$_> has been lexicalized, you can still have access to
+the global version of C<$_> by using C<$::_>, or, more simply, by
+overriding the lexical declaration with C<our $_>. (Rafael Garcia-Suarez)
+
+=head2 The C<_> prototype
+
+A new prototype character has been added. C<_> is equivalent to C<$> but
+defaults to C<$_> if the corresponding argument isn't supplied (both C<$>
+and C<_> denote a scalar). Due to the optional nature of the argument,
+you can only use it at the end of a prototype, or before a semicolon.
+
+This has a small incompatible consequence: the prototype() function has
+been adjusted to return C<_> for some built-ins in appropriate cases (for
+example, C<prototype('CORE::rmdir')>). (Rafael Garcia-Suarez)
+
+=head2 UNITCHECK blocks
+
+C<UNITCHECK>, a new special code block has been introduced, in addition to
+C<BEGIN>, C<CHECK>, C<INIT> and C<END>.
+
+C<CHECK> and C<INIT> blocks, while useful for some specialized purposes,
+are always executed at the transition between the compilation and the
+execution of the main program, and thus are useless whenever code is
+loaded at runtime. On the other hand, C<UNITCHECK> blocks are executed
+just after the unit which defined them has been compiled. See L<perlmod>
+for more information. (Alex Gough)
+
+=head2 New Pragma, C<mro>
+
+A new pragma, C<mro> (for Method Resolution Order) has been added. It
+permits to switch, on a per-class basis, the algorithm that perl uses to
+find inherited methods in case of a multiple inheritance hierarchy. The
+default MRO hasn't changed (DFS, for Depth First Search). Another MRO is
+available: the C3 algorithm. See L<mro> for more information.
+(Brandon Black)
+
+Note that, due to changes in the implementation of class hierarchy search,
+code that used to undef the C<*ISA> glob will most probably break. Anyway,
+undef'ing C<*ISA> had the side-effect of removing the magic on the @ISA
+array and should not have been done in the first place. Also, the
+cache C<*::ISA::CACHE::> no longer exists; to force reset the @ISA cache,
+you now need to use the C<mro> API, or more simply to assign to @ISA
+(e.g. with C<@ISA = @ISA>).
+
+=head2 readdir() may return a "short filename" on Windows
+
+The readdir() function may return a "short filename" when the long
+filename contains characters outside the ANSI codepage. Similarly
+Cwd::cwd() may return a short directory name, and glob() may return short
+names as well. On the NTFS file system these short names can always be
+represented in the ANSI codepage. This will not be true for all other file
+system drivers; e.g. the FAT filesystem stores short filenames in the OEM
+codepage, so some files on FAT volumes remain unaccessible through the
+ANSI APIs.
+
+Similarly, $^X, @INC, and $ENV{PATH} are preprocessed at startup to make
+sure all paths are valid in the ANSI codepage (if possible).
+
+The Win32::GetLongPathName() function now returns the UTF-8 encoded
+correct long file name instead of using replacement characters to force
+the name into the ANSI codepage. The new Win32::GetANSIPathName()
+function can be used to turn a long pathname into a short one only if the
+long one cannot be represented in the ANSI codepage.
+
+Many other functions in the C<Win32> module have been improved to accept
+UTF-8 encoded arguments. Please see L<Win32> for details.
+
+=head2 readpipe() is now overridable
+
+The built-in function readpipe() is now overridable. Overriding it permits
+also to override its operator counterpart, C<qx//> (a.k.a. C<``>).
+Moreover, it now defaults to C<$_> if no argument is provided. (Rafael
+Garcia-Suarez)
+
+=head2 Default argument for readline()
+
+readline() now defaults to C<*ARGV> if no argument is provided. (Rafael
+Garcia-Suarez)
+
+=head2 state() variables
+
+A new class of variables has been introduced. State variables are similar
+to C<my> variables, but are declared with the C<state> keyword in place of
+C<my>. They're visible only in their lexical scope, but their value is
+persistent: unlike C<my> variables, they're not undefined at scope entry,
+but retain their previous value. (Rafael Garcia-Suarez, Nicholas Clark)
+
+To use state variables, one needs to enable them by using
+
+ use feature 'state';
+
+or by using the C<-E> command-line switch in one-liners.
+See L<perlsub/"Persistent Private Variables">.
+
+=head2 Stacked filetest operators
+
+As a new form of syntactic sugar, it's now possible to stack up filetest
+operators. You can now write C<-f -w -x $file> in a row to mean
+C<-x $file && -w _ && -f _>. See L<perlfunc/-X>.
+
+=head2 UNIVERSAL::DOES()
+
+The C<UNIVERSAL> class has a new method, C<DOES()>. It has been added to
+solve semantic problems with the C<isa()> method. C<isa()> checks for
+inheritance, while C<DOES()> has been designed to be overridden when
+module authors use other types of relations between classes (in addition
+to inheritance). (chromatic)
+
+See L<< UNIVERSAL/"$obj->DOES( ROLE )" >>.
+
+=head2 Formats
+
+Formats were improved in several ways. A new field, C<^*>, can be used for
+variable-width, one-line-at-a-time text. Null characters are now handled
+correctly in picture lines. Using C<@#> and C<~~> together will now
+produce a compile-time error, as those format fields are incompatible.
+L<perlform> has been improved, and miscellaneous bugs fixed.
+
+=head2 Byte-order modifiers for pack() and unpack()
+
+There are two new byte-order modifiers, C<E<gt>> (big-endian) and C<E<lt>>
+(little-endian), that can be appended to most pack() and unpack() template
+characters and groups to force a certain byte-order for that type or group.
+See L<perlfunc/pack> and L<perlpacktut> for details.
+
+=head2 C<no VERSION>
+
+You can now use C<no> followed by a version number to specify that you
+want to use a version of perl older than the specified one.
+
+=head2 C<chdir>, C<chmod> and C<chown> on filehandles
+
+C<chdir>, C<chmod> and C<chown> can now work on filehandles as well as
+filenames, if the system supports respectively C<fchdir>, C<fchmod> and
+C<fchown>, thanks to a patch provided by Gisle Aas.
+
+=head2 OS groups
+
+C<$(> and C<$)> now return groups in the order where the OS returns them,
+thanks to Gisle Aas. This wasn't previously the case.
+
+=head2 Recursive sort subs
+
+You can now use recursive subroutines with sort(), thanks to Robin Houston.
+
+=head2 Exceptions in constant folding
+
+The constant folding routine is now wrapped in an exception handler, and
+if folding throws an exception (such as attempting to evaluate 0/0), perl
+now retains the current optree, rather than aborting the whole program.
+Without this change, programs would not compile if they had expressions that
+happened to generate exceptions, even though those expressions were in code
+that could never be reached at runtime. (Nicholas Clark, Dave Mitchell)
+
+=head2 Source filters in @INC
+
+It's possible to enhance the mechanism of subroutine hooks in @INC by
+adding a source filter on top of the filehandle opened and returned by the
+hook. This feature was planned a long time ago, but wasn't quite working
+until now. See L<perlfunc/require> for details. (Nicholas Clark)
+
+=head2 New internal variables
+
+=over 4
+
+=item C<${^RE_DEBUG_FLAGS}>
+
+This variable controls what debug flags are in effect for the regular
+expression engine when running under C<use re "debug">. See L<re> for
+details.
+
+=item C<${^CHILD_ERROR_NATIVE}>
+
+This variable gives the native status returned by the last pipe close,
+backtick command, successful call to wait() or waitpid(), or from the
+system() operator. See L<perlvar> for details. (Contributed by Gisle Aas.)
+
+=item C<${^RE_TRIE_MAXBUF}>
+
+See L</"Trie optimisation of literal string alternations">.
+
+=item C<${^WIN32_SLOPPY_STAT}>
+
+See L</"Sloppy stat on Windows">.
+
+=back
+
+=head2 Miscellaneous
+
+C<unpack()> now defaults to unpacking the C<$_> variable.
+
+C<mkdir()> without arguments now defaults to C<$_>.
+
+The internal dump output has been improved, so that non-printable characters
+such as newline and backspace are output in C<\x> notation, rather than
+octal.
+
+The B<-C> option can no longer be used on the C<#!> line. It wasn't
+working there anyway, since the standard streams are already set up
+at this point in the execution of the perl interpreter. You can use
+binmode() instead to get the desired behaviour.
+
+=head2 UCD 5.0.0
+
+The copy of the Unicode Character Database included in Perl 5 has
+been updated to version 5.0.0.
+
+=head2 MAD
+
+MAD, which stands for I<Miscellaneous Attribute Decoration>, is a
+still-in-development work leading to a Perl 5 to Perl 6 converter. To
+enable it, it's necessary to pass the argument C<-Dmad> to Configure. The
+obtained perl isn't binary compatible with a regular perl 5.10, and has
+space and speed penalties; moreover not all regression tests still pass
+with it. (Larry Wall, Nicholas Clark)
+
+=head2 kill() on Windows
+
+On Windows platforms, C<kill(-9, $pid)> now kills a process tree.
+(On UNIX, this delivers the signal to all processes in the same process
+group.)
+
+=head1 Incompatible Changes
+
+=head2 Packing and UTF-8 strings
+
+The semantics of pack() and unpack() regarding UTF-8-encoded data has been
+changed. Processing is now by default character per character instead of
+byte per byte on the underlying encoding. Notably, code that used things
+like C<pack("a*", $string)> to see through the encoding of string will now
+simply get back the original $string. Packed strings can also get upgraded
+during processing when you store upgraded characters. You can get the old
+behaviour by using C<use bytes>.
+
+To be consistent with pack(), the C<C0> in unpack() templates indicates
+that the data is to be processed in character mode, i.e. character by
+character; on the contrary, C<U0> in unpack() indicates UTF-8 mode, where
+the packed string is processed in its UTF-8-encoded Unicode form on a byte
+by byte basis. This is reversed with regard to perl 5.8.X, but now consistent
+between pack() and unpack().
+
+Moreover, C<C0> and C<U0> can also be used in pack() templates to specify
+respectively character and byte modes.
+
+C<C0> and C<U0> in the middle of a pack or unpack format now switch to the
+specified encoding mode, honoring parens grouping. Previously, parens were
+ignored.
+
+Also, there is a new pack() character format, C<W>, which is intended to
+replace the old C<C>. C<C> is kept for unsigned chars coded as bytes in
+the strings internal representation. C<W> represents unsigned (logical)
+character values, which can be greater than 255. It is therefore more
+robust when dealing with potentially UTF-8-encoded data (as C<C> will wrap
+values outside the range 0..255, and not respect the string encoding).
+
+In practice, that means that pack formats are now encoding-neutral, except
+C<C>.
+
+For consistency, C<A> in unpack() format now trims all Unicode whitespace
+from the end of the string. Before perl 5.9.2, it used to strip only the
+classical ASCII space characters.
+
+=head2 Byte/character count feature in unpack()
+
+A new unpack() template character, C<".">, returns the number of bytes or
+characters (depending on the selected encoding mode, see above) read so far.
+
+=head2 The C<$*> and C<$#> variables have been removed
+
+C<$*>, which was deprecated in favor of the C</s> and C</m> regexp
+modifiers, has been removed.
+
+The deprecated C<$#> variable (output format for numbers) has been
+removed.
+
+Two new severe warnings, C<$#/$* is no longer supported>, have been added.
+
+=head2 substr() lvalues are no longer fixed-length
+
+The lvalues returned by the three argument form of substr() used to be a
+"fixed length window" on the original string. In some cases this could
+cause surprising action at distance or other undefined behaviour. Now the
+length of the window adjusts itself to the length of the string assigned to
+it.
+
+=head2 Parsing of C<-f _>
+
+The identifier C<_> is now forced to be a bareword after a filetest
+operator. This solves a number of misparsing issues when a global C<_>
+subroutine is defined.
+
+=head2 C<:unique>
+
+The C<:unique> attribute has been made a no-op, since its current
+implementation was fundamentally flawed and not threadsafe.
+
+=head2 Effect of pragmas in eval
+
+The compile-time value of the C<%^H> hint variable can now propagate into
+eval("")uated code. This makes it more useful to implement lexical
+pragmas.
+
+As a side-effect of this, the overloaded-ness of constants now propagates
+into eval("").
+
+=head2 chdir FOO
+
+A bareword argument to chdir() is now recognized as a file handle.
+Earlier releases interpreted the bareword as a directory name.
+(Gisle Aas)
+
+=head2 Handling of .pmc files
+
+An old feature of perl was that before C<require> or C<use> look for a
+file with a F<.pm> extension, they will first look for a similar filename
+with a F<.pmc> extension. If this file is found, it will be loaded in
+place of any potentially existing file ending in a F<.pm> extension.
+
+Previously, F<.pmc> files were loaded only if more recent than the
+matching F<.pm> file. Starting with 5.9.4, they'll be always loaded if
+they exist.
+
+=head2 $^V is now a C<version> object instead of a v-string
+
+$^V can still be used with the C<%vd> format in printf, but any
+character-level operations will now access the string representation
+of the C<version> object and not the ordinals of a v-string.
+Expressions like C<< substr($^V, 0, 2) >> or C<< split //, $^V >>
+no longer work and must be rewritten.
+
+=head2 @- and @+ in patterns
+
+The special arrays C<@-> and C<@+> are no longer interpolated in regular
+expressions. (Sadahiro Tomoyuki)
+
+=head2 $AUTOLOAD can now be tainted
+
+If you call a subroutine by a tainted name, and if it defers to an
+AUTOLOAD function, then $AUTOLOAD will be (correctly) tainted.
+(Rick Delaney)
+
+=head2 Tainting and printf
+
+When perl is run under taint mode, C<printf()> and C<sprintf()> will now
+reject any tainted format argument. (Rafael Garcia-Suarez)
+
+=head2 undef and signal handlers
+
+Undefining or deleting a signal handler via C<undef $SIG{FOO}> is now
+equivalent to setting it to C<'DEFAULT'>. (Rafael Garcia-Suarez)
+
+=head2 strictures and dereferencing in defined()
+
+C<use strict 'refs'> was ignoring taking a hard reference in an argument
+to defined(), as in :
+
+ use strict 'refs';
+ my $x = 'foo';
+ if (defined $$x) {...}
+
+This now correctly produces the run-time error C<Can't use string as a
+SCALAR ref while "strict refs" in use>.
+
+C<defined @$foo> and C<defined %$bar> are now also subject to C<strict
+'refs'> (that is, C<$foo> and C<$bar> shall be proper references there.)
+(C<defined(@foo)> and C<defined(%bar)> are discouraged constructs anyway.)
+(Nicholas Clark)
+
+=head2 C<(?p{})> has been removed
+
+The regular expression construct C<(?p{})>, which was deprecated in perl
+5.8, has been removed. Use C<(??{})> instead. (Rafael Garcia-Suarez)
+
+=head2 Pseudo-hashes have been removed
+
+Support for pseudo-hashes has been removed from Perl 5.9. (The C<fields>
+pragma remains here, but uses an alternate implementation.)
+
+=head2 Removal of the bytecode compiler and of perlcc
+
+C<perlcc>, the byteloader and the supporting modules (B::C, B::CC,
+B::Bytecode, etc.) are no longer distributed with the perl sources. Those
+experimental tools have never worked reliably, and, due to the lack of
+volunteers to keep them in line with the perl interpreter developments, it
+was decided to remove them instead of shipping a broken version of those.
+The last version of those modules can be found with perl 5.9.4.
+
+However the B compiler framework stays supported in the perl core, as with
+the more useful modules it has permitted (among others, B::Deparse and
+B::Concise).
+
+=head2 Removal of the JPL
+
+The JPL (Java-Perl Lingo) has been removed from the perl sources tarball.
+
+=head2 Recursive inheritance detected earlier
+
+Perl will now immediately throw an exception if you modify any package's
+C<@ISA> in such a way that it would cause recursive inheritance.
+
+Previously, the exception would not occur until Perl attempted to make
+use of the recursive inheritance while resolving a method or doing a
+C<$foo-E<gt>isa($bar)> lookup.
+
+=head1 Modules and Pragmata
+
+=head2 Upgrading individual core modules
+
+Even more core modules are now also available separately through the
+CPAN. If you wish to update one of these modules, you don't need to
+wait for a new perl release. From within the cpan shell, running the
+'r' command will report on modules with upgrades available. See
+C<perldoc CPAN> for more information.
+
+=head2 Pragmata Changes
+
+=over 4
+
+=item C<feature>
+
+The new pragma C<feature> is used to enable new features that might break
+old code. See L</"The C<feature> pragma"> above.
+
+=item C<mro>
+
+This new pragma enables to change the algorithm used to resolve inherited
+methods. See L</"New Pragma, C<mro>"> above.
+
+=item Scoping of the C<sort> pragma
+
+The C<sort> pragma is now lexically scoped. Its effect used to be global.
+
+=item Scoping of C<bignum>, C<bigint>, C<bigrat>
+
+The three numeric pragmas C<bignum>, C<bigint> and C<bigrat> are now
+lexically scoped. (Tels)
+
+=item C<base>
+
+The C<base> pragma now warns if a class tries to inherit from itself.
+(Curtis "Ovid" Poe)
+
+=item C<strict> and C<warnings>
+
+C<strict> and C<warnings> will now complain loudly if they are loaded via
+incorrect casing (as in C<use Strict;>). (Johan Vromans)
+
+=item C<version>
+
+The C<version> module provides support for version objects.
+
+=item C<warnings>
+
+The C<warnings> pragma doesn't load C<Carp> anymore. That means that code
+that used C<Carp> routines without having loaded it at compile time might
+need to be adjusted; typically, the following (faulty) code won't work
+anymore, and will require parentheses to be added after the function name:
+
+ use warnings;
+ require Carp;
+ Carp::confess 'argh';
+
+=item C<less>
+
+C<less> now does something useful (or at least it tries to). In fact, it
+has been turned into a lexical pragma. So, in your modules, you can now
+test whether your users have requested to use less CPU, or less memory,
+less magic, or maybe even less fat. See L<less> for more. (Joshua ben
+Jore)
+
+=back
+
+=head2 New modules
+
+=over 4
+
+=item *
+
+C<encoding::warnings>, by Audrey Tang, is a module to emit warnings
+whenever an ASCII character string containing high-bit bytes is implicitly
+converted into UTF-8. It's a lexical pragma since Perl 5.9.4; on older
+perls, its effect is global.
+
+=item *
+
+C<Module::CoreList>, by Richard Clamp, is a small handy module that tells
+you what versions of core modules ship with any versions of Perl 5. It
+comes with a command-line frontend, C<corelist>.
+
+=item *
+
+C<Math::BigInt::FastCalc> is an XS-enabled, and thus faster, version of
+C<Math::BigInt::Calc>.
+
+=item *
+
+C<Compress::Zlib> is an interface to the zlib compression library. It
+comes with a bundled version of zlib, so having a working zlib is not a
+prerequisite to install it. It's used by C<Archive::Tar> (see below).
+
+=item *
+
+C<IO::Zlib> is an C<IO::>-style interface to C<Compress::Zlib>.
+
+=item *
+
+C<Archive::Tar> is a module to manipulate C<tar> archives.
+
+=item *
+
+C<Digest::SHA> is a module used to calculate many types of SHA digests,
+has been included for SHA support in the CPAN module.
+
+=item *
+
+C<ExtUtils::CBuilder> and C<ExtUtils::ParseXS> have been added.
+
+=item *
+
+C<Hash::Util::FieldHash>, by Anno Siegel, has been added. This module
+provides support for I<field hashes>: hashes that maintain an association
+of a reference with a value, in a thread-safe garbage-collected way.
+Such hashes are useful to implement inside-out objects.
+
+=item *
+
+C<Module::Build>, by Ken Williams, has been added. It's an alternative to
+C<ExtUtils::MakeMaker> to build and install perl modules.
+
+=item *
+
+C<Module::Load>, by Jos Boumans, has been added. It provides a single
+interface to load Perl modules and F<.pl> files.
+
+=item *
+
+C<Module::Loaded>, by Jos Boumans, has been added. It's used to mark
+modules as loaded or unloaded.
+
+=item *
+
+C<Package::Constants>, by Jos Boumans, has been added. It's a simple
+helper to list all constants declared in a given package.
+
+=item *
+
+C<Win32API::File>, by Tye McQueen, has been added (for Windows builds).
+This module provides low-level access to Win32 system API calls for
+files/dirs.
+
+=item *
+
+C<Locale::Maketext::Simple>, needed by CPANPLUS, is a simple wrapper around
+C<Locale::Maketext::Lexicon>. Note that C<Locale::Maketext::Lexicon> isn't
+included in the perl core; the behaviour of C<Locale::Maketext::Simple>
+gracefully degrades when the later isn't present.
+
+=item *
+
+C<Params::Check> implements a generic input parsing/checking mechanism. It
+is used by CPANPLUS.
+
+=item *
+
+C<Term::UI> simplifies the task to ask questions at a terminal prompt.
+
+=item *
+
+C<Object::Accessor> provides an interface to create per-object accessors.
+
+=item *
+
+C<Module::Pluggable> is a simple framework to create modules that accept
+pluggable sub-modules.
+
+=item *
+
+C<Module::Load::Conditional> provides simple ways to query and possibly
+load installed modules.
+
+=item *
+
+C<Time::Piece> provides an object oriented interface to time functions,
+overriding the built-ins localtime() and gmtime().
+
+=item *
+
+C<IPC::Cmd> helps to find and run external commands, possibly
+interactively.
+
+=item *
+
+C<File::Fetch> provide a simple generic file fetching mechanism.
+
+=item *
+
+C<Log::Message> and C<Log::Message::Simple> are used by the log facility
+of C<CPANPLUS>.
+
+=item *
+
+C<Archive::Extract> is a generic archive extraction mechanism
+for F<.tar> (plain, gziped or bzipped) or F<.zip> files.
+
+=item *
+
+C<CPANPLUS> provides an API and a command-line tool to access the CPAN
+mirrors.
+
+=item *
+
+C<Pod::Escapes> provides utilities that are useful in decoding Pod
+EE<lt>...E<gt> sequences.
+
+=item *
+
+C<Pod::Simple> is now the backend for several of the Pod-related modules
+included with Perl.
+
+=back
+
+=head2 Selected Changes to Core Modules
+
+=over 4
+
+=item C<Attribute::Handlers>
+
+C<Attribute::Handlers> can now report the caller's file and line number.
+(David Feldman)
+
+All interpreted attributes are now passed as array references. (Damian
+Conway)
+
+=item C<B::Lint>
+
+C<B::Lint> is now based on C<Module::Pluggable>, and so can be extended
+with plugins. (Joshua ben Jore)
+
+=item C<B>
+
+It's now possible to access the lexical pragma hints (C<%^H>) by using the
+method B::COP::hints_hash(). It returns a C<B::RHE> object, which in turn
+can be used to get a hash reference via the method B::RHE::HASH(). (Joshua
+ben Jore)
+
+=item C<Thread>
+
+As the old 5005thread threading model has been removed, in favor of the
+ithreads scheme, the C<Thread> module is now a compatibility wrapper, to
+be used in old code only. It has been removed from the default list of
+dynamic extensions.
+
+=back
+
+=head1 Utility Changes
+
+=over 4
+
+=item perl -d
+
+The Perl debugger can now save all debugger commands for sourcing later;
+notably, it can now emulate stepping backwards, by restarting and
+rerunning all bar the last command from a saved command history.
+
+It can also display the parent inheritance tree of a given class, with the
+C<i> command.
+
+=item ptar
+
+C<ptar> is a pure perl implementation of C<tar> that comes with
+C<Archive::Tar>.
+
+=item ptardiff
+
+C<ptardiff> is a small utility used to generate a diff between the contents
+of a tar archive and a directory tree. Like C<ptar>, it comes with
+C<Archive::Tar>.
+
+=item shasum
+
+C<shasum> is a command-line utility, used to print or to check SHA
+digests. It comes with the new C<Digest::SHA> module.
+
+=item corelist
+
+The C<corelist> utility is now installed with perl (see L</"New modules">
+above).
+
+=item h2ph and h2xs
+
+C<h2ph> and C<h2xs> have been made more robust with regard to
+"modern" C code.
+
+C<h2xs> implements a new option C<--use-xsloader> to force use of
+C<XSLoader> even in backwards compatible modules.
+
+The handling of authors' names that had apostrophes has been fixed.
+
+Any enums with negative values are now skipped.
+
+=item perlivp
+
+C<perlivp> no longer checks for F<*.ph> files by default. Use the new C<-a>
+option to run I<all> tests.
+
+=item find2perl
+
+C<find2perl> now assumes C<-print> as a default action. Previously, it
+needed to be specified explicitly.
+
+Several bugs have been fixed in C<find2perl>, regarding C<-exec> and
+C<-eval>. Also the options C<-path>, C<-ipath> and C<-iname> have been
+added.
+
+=item config_data
+
+C<config_data> is a new utility that comes with C<Module::Build>. It
+provides a command-line interface to the configuration of Perl modules
+that use Module::Build's framework of configurability (that is,
+C<*::ConfigData> modules that contain local configuration information for
+their parent modules.)
+
+=item cpanp
+
+C<cpanp>, the CPANPLUS shell, has been added. (C<cpanp-run-perl>, a
+helper for CPANPLUS operation, has been added too, but isn't intended for
+direct use).
+
+=item cpan2dist
+
+C<cpan2dist> is a new utility that comes with CPANPLUS. It's a tool to
+create distributions (or packages) from CPAN modules.
+
+=item pod2html
+
+The output of C<pod2html> has been enhanced to be more customizable via
+CSS. Some formatting problems were also corrected. (Jari Aalto)
+
+=back
+
+=head1 New Documentation
+
+The L<perlpragma> manpage documents how to write one's own lexical
+pragmas in pure Perl (something that is possible starting with 5.9.4).
+
+The new L<perlglossary> manpage is a glossary of terms used in the Perl
+documentation, technical and otherwise, kindly provided by O'Reilly Media,
+Inc.
+
+The L<perlreguts> manpage, courtesy of Yves Orton, describes internals of the
+Perl regular expression engine.
+
+The L<perlreapi> manpage describes the interface to the perl interpreter
+used to write pluggable regular expression engines (by Ævar Arnfjörð
+Bjarmason).
+
+The L<perlunitut> manpage is an tutorial for programming with Unicode and
+string encodings in Perl, courtesy of Juerd Waalboer.
+
+A new manual page, L<perlunifaq> (the Perl Unicode FAQ), has been added
+(Juerd Waalboer).
+
+The L<perlcommunity> manpage gives a description of the Perl community
+on the Internet and in real life. (Edgar "Trizor" Bering)
+
+The L<CORE> manual page documents the C<CORE::> namespace. (Tels)
+
+The long-existing feature of C</(?{...})/> regexps setting C<$_> and pos()
+is now documented.
+
+=head1 Performance Enhancements
+
+=head2 In-place sorting
+
+Sorting arrays in place (C<@a = sort @a>) is now optimized to avoid
+making a temporary copy of the array.
+
+Likewise, C<reverse sort ...> is now optimized to sort in reverse,
+avoiding the generation of a temporary intermediate list.
+
+=head2 Lexical array access
+
+Access to elements of lexical arrays via a numeric constant between 0 and
+255 is now faster. (This used to be only the case for global arrays.)
+
+=head2 XS-assisted SWASHGET
+
+Some pure-perl code that perl was using to retrieve Unicode properties and
+transliteration mappings has been reimplemented in XS.
+
+=head2 Constant subroutines
+
+The interpreter internals now support a far more memory efficient form of
+inlineable constants. Storing a reference to a constant value in a symbol
+table is equivalent to a full typeglob referencing a constant subroutine,
+but using about 400 bytes less memory. This proxy constant subroutine is
+automatically upgraded to a real typeglob with subroutine if necessary.
+The approach taken is analogous to the existing space optimisation for
+subroutine stub declarations, which are stored as plain scalars in place
+of the full typeglob.
+
+Several of the core modules have been converted to use this feature for
+their system dependent constants - as a result C<use POSIX;> now takes about
+200K less memory.
+
+=head2 C<PERL_DONT_CREATE_GVSV>
+
+The new compilation flag C<PERL_DONT_CREATE_GVSV>, introduced as an option
+in perl 5.8.8, is turned on by default in perl 5.9.3. It prevents perl
+from creating an empty scalar with every new typeglob. See L<perl589delta>
+for details.
+
+=head2 Weak references are cheaper
+
+Weak reference creation is now I<O(1)> rather than I<O(n)>, courtesy of
+Nicholas Clark. Weak reference deletion remains I<O(n)>, but if deletion only
+happens at program exit, it may be skipped completely.
+
+=head2 sort() enhancements
+
+Salvador Fandiño provided improvements to reduce the memory usage of C<sort>
+and to speed up some cases.
+
+=head2 Memory optimisations
+
+Several internal data structures (typeglobs, GVs, CVs, formats) have been
+restructured to use less memory. (Nicholas Clark)
+
+=head2 UTF-8 cache optimisation
+
+The UTF-8 caching code is now more efficient, and used more often.
+(Nicholas Clark)
+
+=head2 Sloppy stat on Windows
+
+On Windows, perl's stat() function normally opens the file to determine
+the link count and update attributes that may have been changed through
+hard links. Setting ${^WIN32_SLOPPY_STAT} to a true value speeds up
+stat() by not performing this operation. (Jan Dubois)
+
+=head2 Regular expressions optimisations
+
+=over 4
+
+=item Engine de-recursivised
+
+The regular expression engine is no longer recursive, meaning that
+patterns that used to overflow the stack will either die with useful
+explanations, or run to completion, which, since they were able to blow
+the stack before, will likely take a very long time to happen. If you were
+experiencing the occasional stack overflow (or segfault) and upgrade to
+discover that now perl apparently hangs instead, look for a degenerate
+regex. (Dave Mitchell)
+
+=item Single char char-classes treated as literals
+
+Classes of a single character are now treated the same as if the character
+had been used as a literal, meaning that code that uses char-classes as an
+escaping mechanism will see a speedup. (Yves Orton)
+
+=item Trie optimisation of literal string alternations
+
+Alternations, where possible, are optimised into more efficient matching
+structures. String literal alternations are merged into a trie and are
+matched simultaneously. This means that instead of O(N) time for matching
+N alternations at a given point, the new code performs in O(1) time.
+A new special variable, ${^RE_TRIE_MAXBUF}, has been added to fine-tune
+this optimization. (Yves Orton)
+
+B<Note:> Much code exists that works around perl's historic poor
+performance on alternations. Often the tricks used to do so will disable
+the new optimisations. Hopefully the utility modules used for this purpose
+will be educated about these new optimisations.
+
+=item Aho-Corasick start-point optimisation
+
+When a pattern starts with a trie-able alternation and there aren't
+better optimisations available, the regex engine will use Aho-Corasick
+matching to find the start point. (Yves Orton)
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+=head2 Configuration improvements
+
+=over 4
+
+=item C<-Dusesitecustomize>
+
+Run-time customization of @INC can be enabled by passing the
+C<-Dusesitecustomize> flag to Configure. When enabled, this will make perl
+run F<$sitelibexp/sitecustomize.pl> before anything else. This script can
+then be set up to add additional entries to @INC.
+
+=item Relocatable installations
+
+There is now Configure support for creating a relocatable perl tree. If
+you Configure with C<-Duserelocatableinc>, then the paths in @INC (and
+everything else in %Config) can be optionally located via the path of the
+perl executable.
+
+That means that, if the string C<".../"> is found at the start of any
+path, it's substituted with the directory of $^X. So, the relocation can
+be configured on a per-directory basis, although the default with
+C<-Duserelocatableinc> is that everything is relocated. The initial
+install is done to the original configured prefix.
+
+=item strlcat() and strlcpy()
+
+The configuration process now detects whether strlcat() and strlcpy() are
+available. When they are not available, perl's own version is used (from
+Russ Allbery's public domain implementation). Various places in the perl
+interpreter now use them. (Steve Peters)
+
+=item C<d_pseudofork> and C<d_printf_format_null>
+
+A new configuration variable, available as C<$Config{d_pseudofork}> in
+the L<Config> module, has been added, to distinguish real fork() support
+from fake pseudofork used on Windows platforms.
+
+A new configuration variable, C<d_printf_format_null>, has been added,
+to see if printf-like formats are allowed to be NULL.
+
+=item Configure help
+
+C<Configure -h> has been extended with the most commonly used options.
+
+=back
+
+=head2 Compilation improvements
+
+=over 4
+
+=item Parallel build
+
+Parallel makes should work properly now, although there may still be problems
+if C<make test> is instructed to run in parallel.
+
+=item Borland's compilers support
+
+Building with Borland's compilers on Win32 should work more smoothly. In
+particular Steve Hay has worked to side step many warnings emitted by their
+compilers and at least one C compiler internal error.
+
+=item Static build on Windows
+
+Perl extensions on Windows now can be statically built into the Perl DLL.
+
+Also, it's now possible to build a C<perl-static.exe> that doesn't depend
+on the Perl DLL on Win32. See the Win32 makefiles for details.
+(Vadim Konovalov)
+
+=item ppport.h files
+
+All F<ppport.h> files in the XS modules bundled with perl are now
+autogenerated at build time. (Marcus Holland-Moritz)
+
+=item C++ compatibility
+
+Efforts have been made to make perl and the core XS modules compilable
+with various C++ compilers (although the situation is not perfect with
+some of the compilers on some of the platforms tested.)
+
+=item Support for Microsoft 64-bit compiler
+
+Support for building perl with Microsoft's 64-bit compiler has been
+improved. (ActiveState)
+
+=item Visual C++
+
+Perl can now be compiled with Microsoft Visual C++ 2005 (and 2008 Beta 2).
+
+=item Win32 builds
+
+All win32 builds (MS-Win, WinCE) have been merged and cleaned up.
+
+=back
+
+=head2 Installation improvements
+
+=over 4
+
+=item Module auxiliary files
+
+README files and changelogs for CPAN modules bundled with perl are no
+longer installed.
+
+=back
+
+=head2 New Or Improved Platforms
+
+Perl has been reported to work on Symbian OS. See L<perlsymbian> for more
+information.
+
+Many improvements have been made towards making Perl work correctly on
+z/OS.
+
+Perl has been reported to work on DragonFlyBSD and MidnightBSD.
+
+Perl has also been reported to work on NexentaOS
+( http://www.gnusolaris.org/ ).
+
+The VMS port has been improved. See L<perlvms>.
+
+Support for Cray XT4 Catamount/Qk has been added. See
+F<hints/catamount.sh> in the source code distribution for more
+information.
+
+Vendor patches have been merged for RedHat and Gentoo.
+
+DynaLoader::dl_unload_file() now works on Windows.
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item strictures in regexp-eval blocks
+
+C<strict> wasn't in effect in regexp-eval blocks (C</(?{...})/>).
+
+=item Calling CORE::require()
+
+CORE::require() and CORE::do() were always parsed as require() and do()
+when they were overridden. This is now fixed.
+
+=item Subscripts of slices
+
+You can now use a non-arrowed form for chained subscripts after a list
+slice, like in:
+
+ ({foo => "bar"})[0]{foo}
+
+This used to be a syntax error; a C<< -> >> was required.
+
+=item C<no warnings 'category'> works correctly with -w
+
+Previously when running with warnings enabled globally via C<-w>, selective
+disabling of specific warning categories would actually turn off all warnings.
+This is now fixed; now C<no warnings 'io';> will only turn off warnings in the
+C<io> class. Previously it would erroneously turn off all warnings.
+
+=item threads improvements
+
+Several memory leaks in ithreads were closed. Also, ithreads were made
+less memory-intensive.
+
+C<threads> is now a dual-life module, also available on CPAN. It has been
+expanded in many ways. A kill() method is available for thread signalling.
+One can get thread status, or the list of running or joinable threads.
+
+A new C<< threads->exit() >> method is used to exit from the application
+(this is the default for the main thread) or from the current thread only
+(this is the default for all other threads). On the other hand, the exit()
+built-in now always causes the whole application to terminate. (Jerry
+D. Hedden)
+
+=item chr() and negative values
+
+chr() on a negative value now gives C<\x{FFFD}>, the Unicode replacement
+character, unless when the C<bytes> pragma is in effect, where the low
+eight bits of the value are used.
+
+=item PERL5SHELL and tainting
+
+On Windows, the PERL5SHELL environment variable is now checked for
+taintedness. (Rafael Garcia-Suarez)
+
+=item Using *FILE{IO}
+
+C<stat()> and C<-X> filetests now treat *FILE{IO} filehandles like *FILE
+filehandles. (Steve Peters)
+
+=item Overloading and reblessing
+
+Overloading now works when references are reblessed into another class.
+Internally, this has been implemented by moving the flag for "overloading"
+from the reference to the referent, which logically is where it should
+always have been. (Nicholas Clark)
+
+=item Overloading and UTF-8
+
+A few bugs related to UTF-8 handling with objects that have
+stringification overloaded have been fixed. (Nicholas Clark)
+
+=item eval memory leaks fixed
+
+Traditionally, C<eval 'syntax error'> has leaked badly. Many (but not all)
+of these leaks have now been eliminated or reduced. (Dave Mitchell)
+
+=item Random device on Windows
+
+In previous versions, perl would read the file F</dev/urandom> if it
+existed when seeding its random number generator. That file is unlikely
+to exist on Windows, and if it did would probably not contain appropriate
+data, so perl no longer tries to read it on Windows. (Alex Davies)
+
+=item PERLIO_DEBUG
+
+The C<PERLIO_DEBUG> environment variable no longer has any effect for
+setuid scripts and for scripts run with B<-T>.
+
+Moreover, with a thread-enabled perl, using C<PERLIO_DEBUG> could lead to
+an internal buffer overflow. This has been fixed.
+
+=item PerlIO::scalar and read-only scalars
+
+PerlIO::scalar will now prevent writing to read-only scalars. Moreover,
+seek() is now supported with PerlIO::scalar-based filehandles, the
+underlying string being zero-filled as needed. (Rafael, Jarkko Hietaniemi)
+
+=item study() and UTF-8
+
+study() never worked for UTF-8 strings, but could lead to false results.
+It's now a no-op on UTF-8 data. (Yves Orton)
+
+=item Critical signals
+
+The signals SIGILL, SIGBUS and SIGSEGV are now always delivered in an
+"unsafe" manner (contrary to other signals, that are deferred until the
+perl interpreter reaches a reasonably stable state; see
+L<perlipc/"Deferred Signals (Safe Signals)">). (Rafael)
+
+=item @INC-hook fix
+
+When a module or a file is loaded through an @INC-hook, and when this hook
+has set a filename entry in %INC, __FILE__ is now set for this module
+accordingly to the contents of that %INC entry. (Rafael)
+
+=item C<-t> switch fix
+
+The C<-w> and C<-t> switches can now be used together without messing
+up which categories of warnings are activated. (Rafael)
+
+=item Duping UTF-8 filehandles
+
+Duping a filehandle which has the C<:utf8> PerlIO layer set will now
+properly carry that layer on the duped filehandle. (Rafael)
+
+=item Localisation of hash elements
+
+Localizing a hash element whose key was given as a variable didn't work
+correctly if the variable was changed while the local() was in effect (as
+in C<local $h{$x}; ++$x>). (Bo Lindbergh)
+
+=back
+
+=head1 New or Changed Diagnostics
+
+=over 4
+
+=item Use of uninitialized value
+
+Perl will now try to tell you the name of the variable (if any) that was
+undefined.
+
+=item Deprecated use of my() in false conditional
+
+A new deprecation warning, I<Deprecated use of my() in false conditional>,
+has been added, to warn against the use of the dubious and deprecated
+construct
+
+ my $x if 0;
+
+See L<perldiag>. Use C<state> variables instead.
+
+=item !=~ should be !~
+
+A new warning, C<!=~ should be !~>, is emitted to prevent this misspelling
+of the non-matching operator.
+
+=item Newline in left-justified string
+
+The warning I<Newline in left-justified string> has been removed.
+
+=item Too late for "-T" option
+
+The error I<Too late for "-T" option> has been reformulated to be more
+descriptive.
+
+=item "%s" variable %s masks earlier declaration
+
+This warning is now emitted in more consistent cases; in short, when one
+of the declarations involved is a C<my> variable:
+
+ my $x; my $x; # warns
+ my $x; our $x; # warns
+ our $x; my $x; # warns
+
+On the other hand, the following:
+
+ our $x; our $x;
+
+now gives a C<"our" variable %s redeclared> warning.
+
+=item readdir()/closedir()/etc. attempted on invalid dirhandle
+
+These new warnings are now emitted when a dirhandle is used but is
+either closed or not really a dirhandle.
+
+=item Opening dirhandle/filehandle %s also as a file/directory
+
+Two deprecation warnings have been added: (Rafael)
+
+ Opening dirhandle %s also as a file
+ Opening filehandle %s also as a directory
+
+=item Use of -P is deprecated
+
+Perl's command-line switch C<-P> is now deprecated.
+
+=item v-string in use/require is non-portable
+
+Perl will warn you against potential backwards compatibility problems with
+the C<use VERSION> syntax.
+
+=item perl -V
+
+C<perl -V> has several improvements, making it more useable from shell
+scripts to get the value of configuration variables. See L<perlrun> for
+details.
+
+=back
+
+=head1 Changed Internals
+
+In general, the source code of perl has been refactored, tidied up,
+and optimized in many places. Also, memory management and allocation
+has been improved in several points.
+
+When compiling the perl core with gcc, as many gcc warning flags are
+turned on as is possible on the platform. (This quest for cleanliness
+doesn't extend to XS code because we cannot guarantee the tidiness of
+code we didn't write.) Similar strictness flags have been added or
+tightened for various other C compilers.
+
+=head2 Reordering of SVt_* constants
+
+The relative ordering of constants that define the various types of C<SV>
+have changed; in particular, C<SVt_PVGV> has been moved before C<SVt_PVLV>,
+C<SVt_PVAV>, C<SVt_PVHV> and C<SVt_PVCV>. This is unlikely to make any
+difference unless you have code that explicitly makes assumptions about that
+ordering. (The inheritance hierarchy of C<B::*> objects has been changed
+to reflect this.)
+
+=head2 Elimination of SVt_PVBM
+
+Related to this, the internal type C<SVt_PVBM> has been been removed. This
+dedicated type of C<SV> was used by the C<index> operator and parts of the
+regexp engine to facilitate fast Boyer-Moore matches. Its use internally has
+been replaced by C<SV>s of type C<SVt_PVGV>.
+
+=head2 New type SVt_BIND
+
+A new type C<SVt_BIND> has been added, in readiness for the project to
+implement Perl 6 on 5. There deliberately is no implementation yet, and
+they cannot yet be created or destroyed.
+
+=head2 Removal of CPP symbols
+
+The C preprocessor symbols C<PERL_PM_APIVERSION> and
+C<PERL_XS_APIVERSION>, which were supposed to give the version number of
+the oldest perl binary-compatible (resp. source-compatible) with the
+present one, were not used, and sometimes had misleading values. They have
+been removed.
+
+=head2 Less space is used by ops
+
+The C<BASEOP> structure now uses less space. The C<op_seq> field has been
+removed and replaced by a single bit bit-field C<op_opt>. C<op_type> is now 9
+bits long. (Consequently, the C<B::OP> class doesn't provide an C<seq>
+method anymore.)
+
+=head2 New parser
+
+perl's parser is now generated by bison (it used to be generated by
+byacc.) As a result, it seems to be a bit more robust.
+
+Also, Dave Mitchell improved the lexer debugging output under C<-DT>.
+
+=head2 Use of C<const>
+
+Andy Lester supplied many improvements to determine which function
+parameters and local variables could actually be declared C<const> to the C
+compiler. Steve Peters provided new C<*_set> macros and reworked the core to
+use these rather than assigning to macros in LVALUE context.
+
+=head2 Mathoms
+
+A new file, F<mathoms.c>, has been added. It contains functions that are
+no longer used in the perl core, but that remain available for binary or
+source compatibility reasons. However, those functions will not be
+compiled in if you add C<-DNO_MATHOMS> in the compiler flags.
+
+=head2 C<AvFLAGS> has been removed
+
+The C<AvFLAGS> macro has been removed.
+
+=head2 C<av_*> changes
+
+The C<av_*()> functions, used to manipulate arrays, no longer accept null
+C<AV*> parameters.
+
+=head2 $^H and %^H
+
+The implementation of the special variables $^H and %^H has changed, to
+allow implementing lexical pragmas in pure Perl.
+
+=head2 B:: modules inheritance changed
+
+The inheritance hierarchy of C<B::> modules has changed; C<B::NV> now
+inherits from C<B::SV> (it used to inherit from C<B::IV>).
+
+=head2 Anonymous hash and array constructors
+
+The anonymous hash and array constructors now take 1 op in the optree
+instead of 3, now that pp_anonhash and pp_anonlist return a reference to
+an hash/array when the op is flagged with OPf_SPECIAL. (Nicholas Clark)
+
+=head1 Known Problems
+
+There's still a remaining problem in the implementation of the lexical
+C<$_>: it doesn't work inside C</(?{...})/> blocks. (See the TODO test in
+F<t/op/mydef.t>.)
+
+Stacked filetest operators won't work when the C<filetest> pragma is in
+effect, because they rely on the stat() buffer C<_> being populated, and
+filetest bypasses stat().
+
+=head2 UTF-8 problems
+
+The handling of Unicode still is unclean in several places, where it's
+dependent on whether a string is internally flagged as UTF-8. This will
+be made more consistent in perl 5.12, but that won't be possible without
+a certain amount of backwards incompatibility.
+
+=head1 Platform Specific Problems
+
+When compiled with g++ and thread support on Linux, it's reported that the
+C<$!> stops working correctly. This is related to the fact that the glibc
+provides two strerror_r(3) implementation, and perl selects the wrong
+one.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://rt.perl.org/rt3/ . There may also be
+information at http://www.perl.org/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file and the perl590delta to perl595delta man pages for
+exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl5101delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl5101delta.pod
new file mode 100755
index 00000000000..508990c7aac
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl5101delta.pod
@@ -0,0 +1,1772 @@
+=head1 NAME
+
+perldelta - what is new for perl v5.10.1
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.10.0 release and
+the 5.10.1 release.
+
+If you are upgrading from an earlier release such as 5.8.8, first read
+the L<perl5100delta>, which describes differences between 5.8.8 and
+5.10.0
+
+=head1 Incompatible Changes
+
+=head2 Switch statement changes
+
+The handling of complex expressions by the C<given>/C<when> switch
+statement has been enhanced. There are two new cases where C<when> now
+interprets its argument as a boolean, instead of an expression to be used
+in a smart match:
+
+=over 4
+
+=item flip-flop operators
+
+The C<..> and C<...> flip-flop operators are now evaluated in boolean
+context, following their usual semantics; see L<perlop/"Range Operators">.
+
+Note that, as in perl 5.10.0, C<when (1..10)> will not work to test
+whether a given value is an integer between 1 and 10; you should use
+C<when ([1..10])> instead (note the array reference).
+
+However, contrary to 5.10.0, evaluating the flip-flop operators in boolean
+context ensures it can now be useful in a C<when()>, notably for
+implementing bistable conditions, like in:
+
+ when (/^=begin/ .. /^=end/) {
+ # do something
+ }
+
+=item defined-or operator
+
+A compound expression involving the defined-or operator, as in
+C<when (expr1 // expr2)>, will be treated as boolean if the first
+expression is boolean. (This just extends the existing rule that applies
+to the regular or operator, as in C<when (expr1 || expr2)>.)
+
+=back
+
+The next section details more changes brought to the semantics to
+the smart match operator, that naturally also modify the behaviour
+of the switch statements where smart matching is implicitly used.
+
+=head2 Smart match changes
+
+=head3 Changes to type-based dispatch
+
+The smart match operator C<~~> is no longer commutative. The behaviour of
+a smart match now depends primarily on the type of its right hand
+argument. Moreover, its semantics have been adjusted for greater
+consistency or usefulness in several cases. While the general backwards
+compatibility is maintained, several changes must be noted:
+
+=over 4
+
+=item *
+
+Code references with an empty prototype are no longer treated specially.
+They are passed an argument like the other code references (even if they
+choose to ignore it).
+
+=item *
+
+C<%hash ~~ sub {}> and C<@array ~~ sub {}> now test that the subroutine
+returns a true value for each key of the hash (or element of the
+array), instead of passing the whole hash or array as a reference to
+the subroutine.
+
+=item *
+
+Due to the commutativity breakage, code references are no longer
+treated specially when appearing on the left of the C<~~> operator,
+but like any vulgar scalar.
+
+=item *
+
+C<undef ~~ %hash> is always false (since C<undef> can't be a key in a
+hash). No implicit conversion to C<""> is done (as was the case in perl
+5.10.0).
+
+=item *
+
+C<$scalar ~~ @array> now always distributes the smart match across the
+elements of the array. It's true if one element in @array verifies
+C<$scalar ~~ $element>. This is a generalization of the old behaviour
+that tested whether the array contained the scalar.
+
+=back
+
+The full dispatch table for the smart match operator is given in
+L<perlsyn/"Smart matching in detail">.
+
+=head3 Smart match and overloading
+
+According to the rule of dispatch based on the rightmost argument type,
+when an object overloading C<~~> appears on the right side of the
+operator, the overload routine will always be called (with a 3rd argument
+set to a true value, see L<overload>.) However, when the object will
+appear on the left, the overload routine will be called only when the
+rightmost argument is a simple scalar. This way distributivity of smart match
+across arrays is not broken, as well as the other behaviours with complex
+types (coderefs, hashes, regexes). Thus, writers of overloading routines
+for smart match mostly need to worry only with comparing against a scalar,
+and possibly with stringification overloading; the other common cases
+will be automatically handled consistently.
+
+C<~~> will now refuse to work on objects that do not overload it (in order
+to avoid relying on the object's underlying structure). (However, if the
+object overloads the stringification or the numification operators, and
+if overload fallback is active, it will be used instead, as usual.)
+
+=head2 Other incompatible changes
+
+=over 4
+
+=item *
+
+The semantics of C<use feature :5.10*> have changed slightly.
+See L<"Modules and Pragmata"> for more information.
+
+=item *
+
+It is now a run-time error to use the smart match operator C<~~>
+with an object that has no overload defined for it. (This way
+C<~~> will not break encapsulation by matching against the
+object's internal representation as a reference.)
+
+=item *
+
+The version control system used for the development of the perl
+interpreter has been switched from Perforce to git. This is mainly an
+internal issue that only affects people actively working on the perl core;
+but it may have minor external visibility, for example in some of details
+of the output of C<perl -V>. See L<perlrepository> for more information.
+
+=item *
+
+The internal structure of the C<ext/> directory in the perl source has
+been reorganised. In general, a module C<Foo::Bar> whose source was
+stored under F<ext/Foo/Bar/> is now located under F<ext/Foo-Bar/>. Also,
+some modules have been moved from F<lib/> to F<ext/>. This is purely a
+source tarball change, and should make no difference to the compilation or
+installation of perl, unless you have a very customised build process that
+explicitly relies on this structure, or which hard-codes the C<nonxs_ext>
+F<Configure> parameter. Specifically, this change does not by default
+alter the location of any files in the final installation.
+
+=item *
+
+As part of the C<Test::Harness> 2.x to 3.x upgrade, the experimental
+C<Test::Harness::Straps> module has been removed.
+See L</"Updated Modules"> for more details.
+
+=item *
+
+As part of the C<ExtUtils::MakeMaker> upgrade, the
+C<ExtUtils::MakeMaker::bytes> and C<ExtUtils::MakeMaker::vmsish> modules
+have been removed from this distribution.
+
+=item *
+
+C<Module::CoreList> no longer contains the C<%:patchlevel> hash.
+
+=item *
+
+This one is actually a change introduced in 5.10.0, but it was missed
+from that release's perldelta, so it is mentioned here instead.
+
+A bugfix related to the handling of the C</m> modifier and C<qr> resulted
+in a change of behaviour between 5.8.x and 5.10.0:
+
+ # matches in 5.8.x, doesn't match in 5.10.0
+ $re = qr/^bar/; "foo\nbar" =~ /$re/m;
+
+=back
+
+=head1 Core Enhancements
+
+=head2 Unicode Character Database 5.1.0
+
+The copy of the Unicode Character Database included in Perl 5.10.1 has
+been updated to 5.1.0 from 5.0.0. See
+L<http://www.unicode.org/versions/Unicode5.1.0/#NotableChanges> for the
+notable changes.
+
+=head2 A proper interface for pluggable Method Resolution Orders
+
+As of Perl 5.10.1 there is a new interface for plugging and using method
+resolution orders other than the default (linear depth first search).
+The C3 method resolution order added in 5.10.0 has been re-implemented as
+a plugin, without changing its Perl-space interface. See L<perlmroapi> for
+more information.
+
+=head2 The C<overloading> pragma
+
+This pragma allows you to lexically disable or enable overloading
+for some or all operations. (Yuval Kogman)
+
+=head2 Parallel tests
+
+The core distribution can now run its regression tests in parallel on
+Unix-like platforms. Instead of running C<make test>, set C<TEST_JOBS> in
+your environment to the number of tests to run in parallel, and run
+C<make test_harness>. On a Bourne-like shell, this can be done as
+
+ TEST_JOBS=3 make test_harness # Run 3 tests in parallel
+
+An environment variable is used, rather than parallel make itself, because
+L<TAP::Harness> needs to be able to schedule individual non-conflicting test
+scripts itself, and there is no standard interface to C<make> utilities to
+interact with their job schedulers.
+
+Note that currently some test scripts may fail when run in parallel (most
+notably C<ext/IO/t/io_dir.t>). If necessary run just the failing scripts
+again sequentially and see if the failures go away.
+
+=head2 DTrace support
+
+Some support for DTrace has been added. See "DTrace support" in F<INSTALL>.
+
+=head2 Support for C<configure_requires> in CPAN module metadata
+
+Both C<CPAN> and C<CPANPLUS> now support the C<configure_requires> keyword
+in the C<META.yml> metadata file included in most recent CPAN distributions.
+This allows distribution authors to specify configuration prerequisites that
+must be installed before running F<Makefile.PL> or F<Build.PL>.
+
+See the documentation for C<ExtUtils::MakeMaker> or C<Module::Build> for more
+on how to specify C<configure_requires> when creating a distribution for CPAN.
+
+=head1 Modules and Pragmata
+
+=head2 New Modules and Pragmata
+
+=over 4
+
+=item C<autodie>
+
+This is a new lexically-scoped alternative for the C<Fatal> module.
+The bundled version is 2.06_01. Note that in this release, using a string
+eval when C<autodie> is in effect can cause the autodie behaviour to leak
+into the surrounding scope. See L<autodie/"BUGS"> for more details.
+
+=item C<Compress::Raw::Bzip2>
+
+This has been added to the core (version 2.020).
+
+=item C<parent>
+
+This pragma establishes an ISA relationship with base classes at compile
+time. It provides the key feature of C<base> without the feature creep.
+
+=item C<Parse::CPAN::Meta>
+
+This has been added to the core (version 1.39).
+
+=back
+
+=head2 Pragmata Changes
+
+=over 4
+
+=item C<attributes>
+
+Upgraded from version 0.08 to 0.09.
+
+=item C<attrs>
+
+Upgraded from version 1.02 to 1.03.
+
+=item C<base>
+
+Upgraded from version 2.13 to 2.14. See L<parent> for a replacement.
+
+=item C<bigint>
+
+Upgraded from version 0.22 to 0.23.
+
+=item C<bignum>
+
+Upgraded from version 0.22 to 0.23.
+
+=item C<bigrat>
+
+Upgraded from version 0.22 to 0.23.
+
+=item C<charnames>
+
+Upgraded from version 1.06 to 1.07.
+
+The Unicode F<NameAliases.txt> database file has been added. This has the
+effect of adding some extra C<\N> character names that formerly wouldn't
+have been recognised; for example, C<"\N{LATIN CAPITAL LETTER GHA}">.
+
+=item C<constant>
+
+Upgraded from version 1.13 to 1.17.
+
+=item C<feature>
+
+The meaning of the C<:5.10> and C<:5.10.X> feature bundles has
+changed slightly. The last component, if any (i.e. C<X>) is simply ignored.
+This is predicated on the assumption that new features will not, in
+general, be added to maintenance releases. So C<:5.10> and C<:5.10.X>
+have identical effect. This is a change to the behaviour documented for
+5.10.0.
+
+=item C<fields>
+
+Upgraded from version 2.13 to 2.14 (this was just a version bump; there
+were no functional changes).
+
+=item C<lib>
+
+Upgraded from version 0.5565 to 0.62.
+
+=item C<open>
+
+Upgraded from version 1.06 to 1.07.
+
+=item C<overload>
+
+Upgraded from version 1.06 to 1.07.
+
+=item C<overloading>
+
+See L</"The C<overloading> pragma"> above.
+
+=item C<version>
+
+Upgraded from version 0.74 to 0.77.
+
+=back
+
+=head2 Updated Modules
+
+=over 4
+
+=item C<Archive::Extract>
+
+Upgraded from version 0.24 to 0.34.
+
+=item C<Archive::Tar>
+
+Upgraded from version 1.38 to 1.52.
+
+=item C<Attribute::Handlers>
+
+Upgraded from version 0.79 to 0.85.
+
+=item C<AutoLoader>
+
+Upgraded from version 5.63 to 5.68.
+
+=item C<AutoSplit>
+
+Upgraded from version 1.05 to 1.06.
+
+=item C<B>
+
+Upgraded from version 1.17 to 1.22.
+
+=item C<B::Debug>
+
+Upgraded from version 1.05 to 1.11.
+
+=item C<B::Deparse>
+
+Upgraded from version 0.83 to 0.89.
+
+=item C<B::Lint>
+
+Upgraded from version 1.09 to 1.11.
+
+=item C<B::Xref>
+
+Upgraded from version 1.01 to 1.02.
+
+=item C<Benchmark>
+
+Upgraded from version 1.10 to 1.11.
+
+=item C<Carp>
+
+Upgraded from version 1.08 to 1.11.
+
+=item C<CGI>
+
+Upgraded from version 3.29 to 3.43.
+(also includes the "default_value for popup_menu()" fix from 3.45).
+
+=item C<Compress::Zlib>
+
+Upgraded from version 2.008 to 2.020.
+
+=item C<CPAN>
+
+Upgraded from version 1.9205 to 1.9402. C<CPAN::FTP> has a local fix to
+stop it being too verbose on download failure.
+
+=item C<CPANPLUS>
+
+Upgraded from version 0.84 to 0.88.
+
+=item C<CPANPLUS::Dist::Build>
+
+Upgraded from version 0.06_02 to 0.36.
+
+=item C<Cwd>
+
+Upgraded from version 3.25_01 to 3.30.
+
+=item C<Data::Dumper>
+
+Upgraded from version 2.121_14 to 2.124.
+
+=item C<DB>
+
+Upgraded from version 1.01 to 1.02.
+
+=item C<DB_File>
+
+Upgraded from version 1.816_1 to 1.820.
+
+=item C<Devel::PPPort>
+
+Upgraded from version 3.13 to 3.19.
+
+=item C<Digest::MD5>
+
+Upgraded from version 2.36_01 to 2.39.
+
+=item C<Digest::SHA>
+
+Upgraded from version 5.45 to 5.47.
+
+=item C<DirHandle>
+
+Upgraded from version 1.01 to 1.03.
+
+=item C<Dumpvalue>
+
+Upgraded from version 1.12 to 1.13.
+
+=item C<DynaLoader>
+
+Upgraded from version 1.08 to 1.10.
+
+=item C<Encode>
+
+Upgraded from version 2.23 to 2.35.
+
+=item C<Errno>
+
+Upgraded from version 1.10 to 1.11.
+
+=item C<Exporter>
+
+Upgraded from version 5.62 to 5.63.
+
+=item C<ExtUtils::CBuilder>
+
+Upgraded from version 0.21 to 0.2602.
+
+=item C<ExtUtils::Command>
+
+Upgraded from version 1.13 to 1.16.
+
+=item C<ExtUtils::Constant>
+
+Upgraded from 0.20 to 0.22. (Note that neither of these versions are
+available on CPAN.)
+
+=item C<ExtUtils::Embed>
+
+Upgraded from version 1.27 to 1.28.
+
+=item C<ExtUtils::Install>
+
+Upgraded from version 1.44 to 1.54.
+
+=item C<ExtUtils::MakeMaker>
+
+Upgraded from version 6.42 to 6.55_02.
+
+Note that C<ExtUtils::MakeMaker::bytes> and C<ExtUtils::MakeMaker::vmsish>
+have been removed from this distribution.
+
+=item C<ExtUtils::Manifest>
+
+Upgraded from version 1.51_01 to 1.56.
+
+=item C<ExtUtils::ParseXS>
+
+Upgraded from version 2.18_02 to 2.2002.
+
+=item C<Fatal>
+
+Upgraded from version 1.05 to 2.06_01. See also the new pragma C<autodie>.
+
+=item C<File::Basename>
+
+Upgraded from version 2.76 to 2.77.
+
+=item C<File::Compare>
+
+Upgraded from version 1.1005 to 1.1006.
+
+=item C<File::Copy>
+
+Upgraded from version 2.11 to 2.14.
+
+=item C<File::Fetch>
+
+Upgraded from version 0.14 to 0.20.
+
+=item C<File::Find>
+
+Upgraded from version 1.12 to 1.14.
+
+=item C<File::Path>
+
+Upgraded from version 2.04 to 2.07_03.
+
+=item C<File::Spec>
+
+Upgraded from version 3.2501 to 3.30.
+
+=item C<File::stat>
+
+Upgraded from version 1.00 to 1.01.
+
+=item C<File::Temp>
+
+Upgraded from version 0.18 to 0.22.
+
+=item C<FileCache>
+
+Upgraded from version 1.07 to 1.08.
+
+=item C<FileHandle>
+
+Upgraded from version 2.01 to 2.02.
+
+=item C<Filter::Simple>
+
+Upgraded from version 0.82 to 0.84.
+
+=item C<Filter::Util::Call>
+
+Upgraded from version 1.07 to 1.08.
+
+=item C<FindBin>
+
+Upgraded from version 1.49 to 1.50.
+
+=item C<GDBM_File>
+
+Upgraded from version 1.08 to 1.09.
+
+=item C<Getopt::Long>
+
+Upgraded from version 2.37 to 2.38.
+
+=item C<Hash::Util::FieldHash>
+
+Upgraded from version 1.03 to 1.04. This fixes a memory leak.
+
+=item C<I18N::Collate>
+
+Upgraded from version 1.00 to 1.01.
+
+=item C<IO>
+
+Upgraded from version 1.23_01 to 1.25.
+
+This makes non-blocking mode work on Windows in C<IO::Socket::INET>
+[CPAN #43573].
+
+=item C<IO::Compress::*>
+
+Upgraded from version 2.008 to 2.020.
+
+=item C<IO::Dir>
+
+Upgraded from version 1.06 to 1.07.
+
+=item C<IO::Handle>
+
+Upgraded from version 1.27 to 1.28.
+
+=item C<IO::Socket>
+
+Upgraded from version 1.30_01 to 1.31.
+
+=item C<IO::Zlib>
+
+Upgraded from version 1.07 to 1.09.
+
+=item C<IPC::Cmd>
+
+Upgraded from version 0.40_1 to 0.46.
+
+=item C<IPC::Open3>
+
+Upgraded from version 1.02 to 1.04.
+
+=item C<IPC::SysV>
+
+Upgraded from version 1.05 to 2.01.
+
+=item C<lib>
+
+Upgraded from version 0.5565 to 0.62.
+
+=item C<List::Util>
+
+Upgraded from version 1.19 to 1.21.
+
+=item C<Locale::MakeText>
+
+Upgraded from version 1.12 to 1.13.
+
+=item C<Log::Message>
+
+Upgraded from version 0.01 to 0.02.
+
+=item C<Math::BigFloat>
+
+Upgraded from version 1.59 to 1.60.
+
+=item C<Math::BigInt>
+
+Upgraded from version 1.88 to 1.89.
+
+=item C<Math::BigInt::FastCalc>
+
+Upgraded from version 0.16 to 0.19.
+
+=item C<Math::BigRat>
+
+Upgraded from version 0.21 to 0.22.
+
+=item C<Math::Complex>
+
+Upgraded from version 1.37 to 1.56.
+
+=item C<Math::Trig>
+
+Upgraded from version 1.04 to 1.20.
+
+=item C<Memoize>
+
+Upgraded from version 1.01_02 to 1.01_03 (just a minor documentation
+change).
+
+=item C<Module::Build>
+
+Upgraded from version 0.2808_01 to 0.34_02.
+
+=item C<Module::CoreList>
+
+Upgraded from version 2.13 to 2.18. This release no longer contains the
+C<%Module::CoreList::patchlevel> hash.
+
+=item C<Module::Load>
+
+Upgraded from version 0.12 to 0.16.
+
+=item C<Module::Load::Conditional>
+
+Upgraded from version 0.22 to 0.30.
+
+=item C<Module::Loaded>
+
+Upgraded from version 0.01 to 0.02.
+
+=item C<Module::Pluggable>
+
+Upgraded from version 3.6 to 3.9.
+
+=item C<NDBM_File>
+
+Upgraded from version 1.07 to 1.08.
+
+=item C<Net::Ping>
+
+Upgraded from version 2.33 to 2.36.
+
+=item C<NEXT>
+
+Upgraded from version 0.60_01 to 0.64.
+
+=item C<Object::Accessor>
+
+Upgraded from version 0.32 to 0.34.
+
+=item C<OS2::REXX>
+
+Upgraded from version 1.03 to 1.04.
+
+=item C<Package::Constants>
+
+Upgraded from version 0.01 to 0.02.
+
+=item C<PerlIO>
+
+Upgraded from version 1.04 to 1.06.
+
+=item C<PerlIO::via>
+
+Upgraded from version 0.04 to 0.07.
+
+=item C<Pod::Man>
+
+Upgraded from version 2.16 to 2.22.
+
+=item C<Pod::Parser>
+
+Upgraded from version 1.35 to 1.37.
+
+=item C<Pod::Simple>
+
+Upgraded from version 3.05 to 3.07.
+
+=item C<Pod::Text>
+
+Upgraded from version 3.08 to 3.13.
+
+=item C<POSIX>
+
+Upgraded from version 1.13 to 1.17.
+
+=item C<Safe>
+
+Upgraded from 2.12 to 2.18.
+
+=item C<Scalar::Util>
+
+Upgraded from version 1.19 to 1.21.
+
+=item C<SelectSaver>
+
+Upgraded from 1.01 to 1.02.
+
+=item C<SelfLoader>
+
+Upgraded from 1.11 to 1.17.
+
+=item C<Socket>
+
+Upgraded from 1.80 to 1.82.
+
+=item C<Storable>
+
+Upgraded from 2.18 to 2.20.
+
+=item C<Switch>
+
+Upgraded from version 2.13 to 2.14. Please see L</Deprecations>.
+
+=item C<Symbol>
+
+Upgraded from version 1.06 to 1.07.
+
+=item C<Sys::Syslog>
+
+Upgraded from version 0.22 to 0.27.
+
+=item C<Term::ANSIColor>
+
+Upgraded from version 1.12 to 2.00.
+
+=item C<Term::ReadLine>
+
+Upgraded from version 1.03 to 1.04.
+
+=item C<Term::UI>
+
+Upgraded from version 0.18 to 0.20.
+
+=item C<Test::Harness>
+
+Upgraded from version 2.64 to 3.17.
+
+Note that one side-effect of the 2.x to 3.x upgrade is that the
+experimental C<Test::Harness::Straps> module (and its supporting
+C<Assert>, C<Iterator>, C<Point> and C<Results> modules) have been
+removed. If you still need this, then they are available in the
+(unmaintained) C<Test-Harness-Straps> distribution on CPAN.
+
+=item C<Test::Simple>
+
+Upgraded from version 0.72 to 0.92.
+
+=item C<Text::ParseWords>
+
+Upgraded from version 3.26 to 3.27.
+
+=item C<Text::Tabs>
+
+Upgraded from version 2007.1117 to 2009.0305.
+
+=item C<Text::Wrap>
+
+Upgraded from version 2006.1117 to 2009.0305.
+
+=item C<Thread::Queue>
+
+Upgraded from version 2.00 to 2.11.
+
+=item C<Thread::Semaphore>
+
+Upgraded from version 2.01 to 2.09.
+
+=item C<threads>
+
+Upgraded from version 1.67 to 1.72.
+
+=item C<threads::shared>
+
+Upgraded from version 1.14 to 1.29.
+
+=item C<Tie::RefHash>
+
+Upgraded from version 1.37 to 1.38.
+
+=item C<Tie::StdHandle>
+
+This has documentation changes, and has been assigned a version for the
+first time: version 4.2.
+
+=item C<Time::HiRes>
+
+Upgraded from version 1.9711 to 1.9719.
+
+=item C<Time::Local>
+
+Upgraded from version 1.18 to 1.1901.
+
+=item C<Time::Piece>
+
+Upgraded from version 1.12 to 1.15.
+
+=item C<Unicode::Normalize>
+
+Upgraded from version 1.02 to 1.03.
+
+=item C<Unicode::UCD>
+
+Upgraded from version 0.25 to 0.27.
+
+C<charinfo()> now works on Unified CJK code points added to later versions
+of Unicode.
+
+C<casefold()> has new fields returned to provide both a simpler interface
+and previously missing information. The old fields are retained for
+backwards compatibility. Information about Turkic-specific code points is
+now returned.
+
+The documentation has been corrected and expanded.
+
+=item C<UNIVERSAL>
+
+Upgraded from version 1.04 to 1.05.
+
+=item C<Win32>
+
+Upgraded from version 0.34 to 0.39.
+
+=item C<Win32API::File>
+
+Upgraded from version 0.1001_01 to 0.1101.
+
+=item C<XSLoader>
+
+Upgraded from version 0.08 to 0.10.
+
+=back
+
+=head1 Utility Changes
+
+=over 4
+
+=item F<h2ph>
+
+Now looks in C<include-fixed> too, which is a recent addition to gcc's
+search path.
+
+=item F<h2xs>
+
+No longer incorrectly treats enum values like macros (Daniel Burr).
+
+Now handles C++ style constants (C<//>) properly in enums. (A patch from
+Rainer Weikusat was used; Daniel Burr also proposed a similar fix).
+
+=item F<perl5db.pl>
+
+C<LVALUE> subroutines now work under the debugger.
+
+The debugger now correctly handles proxy constant subroutines, and
+subroutine stubs.
+
+=item F<perlthanks>
+
+Perl 5.10.1 adds a new utility F<perlthanks>, which is a variant of
+F<perlbug>, but for sending non-bug-reports to the authors and maintainers
+of Perl. Getting nothing but bug reports can become a bit demoralising:
+we'll see if this changes things.
+
+=back
+
+=head1 New Documentation
+
+=over 4
+
+=item L<perlhaiku>
+
+This contains instructions on how to build perl for the Haiku platform.
+
+=item L<perlmroapi>
+
+This describes the new interface for pluggable Method Resolution Orders.
+
+=item L<perlperf>
+
+This document, by Richard Foley, provides an introduction to the use of
+performance and optimization techniques which can be used with particular
+reference to perl programs.
+
+=item L<perlrepository>
+
+This describes how to access the perl source using the I<git> version
+control system.
+
+=item L<perlthanks>
+
+This describes the new F<perlthanks> utility.
+
+=back
+
+=head1 Changes to Existing Documentation
+
+The various large C<Changes*> files (which listed every change made to perl
+over the last 18 years) have been removed, and replaced by a small file,
+also called C<Changes>, which just explains how that same information may
+be extracted from the git version control system.
+
+The file F<Porting/patching.pod> has been deleted, as it mainly described
+interacting with the old Perforce-based repository, which is now obsolete.
+Information still relevant has been moved to L<perlrepository>.
+
+L<perlapi>, L<perlintern>, L<perlmodlib> and L<perltoc> are now all
+generated at build time, rather than being shipped as part of the release.
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+A new internal cache means that C<isa()> will often be faster.
+
+=item *
+
+Under C<use locale>, the locale-relevant information is now cached on
+read-only values, such as the list returned by C<keys %hash>. This makes
+operations such as C<sort keys %hash> in the scope of C<use locale> much
+faster.
+
+=item *
+
+Empty C<DESTROY> methods are no longer called.
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+=head2 F<ext/> reorganisation
+
+The layout of directories in F<ext> has been revised. Specifically, all
+extensions are now flat, and at the top level, with C</> in pathnames
+replaced by C<->, so that F<ext/Data/Dumper/> is now F<ext/Data-Dumper/>,
+etc. The names of the extensions as specified to F<Configure>, and as
+reported by C<%Config::Config> under the keys C<dynamic_ext>,
+C<known_extensions>, C<nonxs_ext> and C<static_ext> have not changed, and
+still use C</>. Hence this change will not have any affect once perl is
+installed. However, C<Attribute::Handlers>, C<Safe> and C<mro> have now
+become extensions in their own right, so if you run F<Configure> with
+options to specify an exact list of extensions to build, you will need to
+change it to account for this.
+
+For 5.10.2, it is planned that many dual-life modules will have been moved
+from F<lib> to F<ext>; again this will have no effect on an installed
+perl, but will matter if you invoke F<Configure> with a pre-canned list of
+extensions to build.
+
+=head2 Configuration improvements
+
+If C<vendorlib> and C<vendorarch> are the same, then they are only added to
+C<@INC> once.
+
+C<$Config{usedevel}> and the C-level C<PERL_USE_DEVEL> are now defined if
+perl is built with C<-Dusedevel>.
+
+F<Configure> will enable use of C<-fstack-protector>, to provide protection
+against stack-smashing attacks, if the compiler supports it.
+
+F<Configure> will now determine the correct prototypes for re-entrant
+functions, and for C<gconvert>, if you are using a C++ compiler rather
+than a C compiler.
+
+On Unix, if you build from a tree containing a git repository, the
+configuration process will note the commit hash you have checked out, for
+display in the output of C<perl -v> and C<perl -V>. Unpushed local commits
+are automatically added to the list of local patches displayed by
+C<perl -V>.
+
+=head2 Compilation improvements
+
+As part of the flattening of F<ext>, all extensions on all platforms are
+built by F<make_ext.pl>. This replaces the Unix-specific
+F<ext/util/make_ext>, VMS-specific F<make_ext.com> and Win32-specific
+F<win32/buildext.pl>.
+
+=head2 Platform Specific Changes
+
+=over 4
+
+=item AIX
+
+Removed F<libbsd> for AIX 5L and 6.1. Only flock() was used from F<libbsd>.
+
+Removed F<libgdbm> for AIX 5L and 6.1. The F<libgdbm> is delivered as an
+optional package with the AIX Toolbox. Unfortunately the 64 bit version
+is broken.
+
+Hints changes mean that AIX 4.2 should work again.
+
+=item Cygwin
+
+On Cygwin we now strip the last number from the DLL. This has been the
+behaviour in the cygwin.com build for years. The hints files have been
+updated.
+
+=item FreeBSD
+
+The hints files now identify the correct threading libraries on FreeBSD 7
+and later.
+
+=item Irix
+
+We now work around a bizarre preprocessor bug in the Irix 6.5 compiler:
+C<cc -E -> unfortunately goes into K&R mode, but C<cc -E file.c> doesn't.
+
+=item Haiku
+
+Patches from the Haiku maintainers have been merged in. Perl should now
+build on Haiku.
+
+=item MirOS BSD
+
+Perl should now build on MirOS BSD.
+
+=item NetBSD
+
+Hints now supports versions 5.*.
+
+=item Stratus VOS
+
+Various changes from Stratus have been merged in.
+
+=item Symbian
+
+There is now support for Symbian S60 3.2 SDK and S60 5.0 SDK.
+
+=item Win32
+
+Improved message window handling means that C<alarm> and C<kill> messages
+will no longer be dropped under race conditions.
+
+=item VMS
+
+Reads from the in-memory temporary files of C<PerlIO::scalar> used to fail
+if C<$/> was set to a numeric reference (to indicate record-style reads).
+This is now fixed.
+
+VMS now supports C<getgrgid>.
+
+Many improvements and cleanups have been made to the VMS file name handling
+and conversion code.
+
+Enabling the C<PERL_VMS_POSIX_EXIT> logical name now encodes a POSIX exit
+status in a VMS condition value for better interaction with GNV's bash
+shell and other utilities that depend on POSIX exit values. See
+L<perlvms/"$?"> for details.
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+5.10.0 inadvertently disabled an optimisation, which caused a measurable
+performance drop in list assignment, such as is often used to assign
+function parameters from C<@_>. The optimisation has been re-instated, and
+the performance regression fixed.
+
+=item *
+
+Fixed memory leak on C<while (1) { map 1, 1 }> [RT #53038].
+
+=item *
+
+Some potential coredumps in PerlIO fixed [RT #57322,54828].
+
+=item *
+
+The debugger now works with lvalue subroutines.
+
+=item *
+
+The debugger's C<m> command was broken on modules that defined constants
+[RT #61222].
+
+=item *
+
+C<crypt()> and string complement could return tainted values for untainted
+arguments [RT #59998].
+
+=item *
+
+The C<-i.suffix> command-line switch now recreates the file using
+restricted permissions, before changing its mode to match the original
+file. This eliminates a potential race condition [RT #60904].
+
+=item *
+
+On some UNIX systems, the value in C<$?> would not have the top bit set
+(C<$? & 128>) even if the child core dumped.
+
+=item *
+
+Under some circumstances, $^R could incorrectly become undefined
+[RT #57042].
+
+=item *
+
+(XS) In various hash functions, passing a pre-computed hash to when the
+key is UTF-8 might result in an incorrect lookup.
+
+=item *
+
+(XS) Including F<XSUB.h> before F<perl.h> gave a compile-time error
+[RT #57176].
+
+=item *
+
+C<< $object->isa('Foo') >> would report false if the package C<Foo> didn't
+exist, even if the object's C<@ISA> contained C<Foo>.
+
+=item *
+
+Various bugs in the new-to 5.10.0 mro code, triggered by manipulating
+C<@ISA>, have been found and fixed.
+
+=item *
+
+Bitwise operations on references could crash the interpreter, e.g.
+C<$x=\$y; $x |= "foo"> [RT #54956].
+
+=item *
+
+Patterns including alternation might be sensitive to the internal UTF-8
+representation, e.g.
+
+ my $byte = chr(192);
+ my $utf8 = chr(192); utf8::upgrade($utf8);
+ $utf8 =~ /$byte|X}/i; # failed in 5.10.0
+
+=item *
+
+Within UTF8-encoded Perl source files (i.e. where C<use utf8> is in
+effect), double-quoted literal strings could be corrupted where a C<\xNN>,
+C<\0NNN> or C<\N{}> is followed by a literal character with ordinal value
+greater than 255 [RT #59908].
+
+=item *
+
+C<B::Deparse> failed to correctly deparse various constructs:
+C<readpipe STRING> [RT #62428], C<CORE::require(STRING)> [RT #62488],
+C<sub foo(_)> [RT #62484].
+
+=item *
+
+Using C<setpgrp()> with no arguments could corrupt the perl stack.
+
+=item *
+
+The block form of C<eval> is now specifically trappable by C<Safe> and
+C<ops>. Previously it was erroneously treated like string C<eval>.
+
+=item *
+
+In 5.10.0, the two characters C<[~> were sometimes parsed as the smart
+match operator (C<~~>) [RT #63854].
+
+=item *
+
+In 5.10.0, the C<*> quantifier in patterns was sometimes treated as
+C<{0,32767}> [RT #60034, #60464]. For example, this match would fail:
+
+ ("ab" x 32768) =~ /^(ab)*$/
+
+=item *
+
+C<shmget> was limited to a 32 bit segment size on a 64 bit OS [RT #63924].
+
+=item *
+
+Using C<next> or C<last> to exit a C<given> block no longer produces a
+spurious warning like the following:
+
+ Exiting given via last at foo.pl line 123
+
+=item *
+
+On Windows, C<'.\foo'> and C<'..\foo'> were treated differently than
+C<'./foo'> and C<'../foo'> by C<do> and C<require> [RT #63492].
+
+=item *
+
+Assigning a format to a glob could corrupt the format; e.g.:
+
+ *bar=*foo{FORMAT}; # foo format now bad
+
+=item *
+
+Attempting to coerce a typeglob to a string or number could cause an
+assertion failure. The correct error message is now generated,
+C<Can't coerce GLOB to I<$type>>.
+
+=item *
+
+Under C<use filetest 'access'>, C<-x> was using the wrong access mode. This
+has been fixed [RT #49003].
+
+=item *
+
+C<length> on a tied scalar that returned a Unicode value would not be
+correct the first time. This has been fixed.
+
+=item *
+
+Using an array C<tie> inside in array C<tie> could SEGV. This has been
+fixed. [RT #51636]
+
+=item *
+
+A race condition inside C<PerlIOStdio_close()> has been identified and
+fixed. This used to cause various threading issues, including SEGVs.
+
+=item *
+
+In C<unpack>, the use of C<()> groups in scalar context was internally
+placing a list on the interpreter's stack, which manifested in various
+ways, including SEGVs. This is now fixed [RT #50256].
+
+=item *
+
+Magic was called twice in C<substr>, C<\&$x>, C<tie $x, $m> and C<chop>.
+These have all been fixed.
+
+=item *
+
+A 5.10.0 optimisation to clear the temporary stack within the implicit
+loop of C<s///ge> has been reverted, as it turned out to be the cause of
+obscure bugs in seemingly unrelated parts of the interpreter [commit
+ef0d4e17921ee3de].
+
+=item *
+
+The line numbers for warnings inside C<elsif> are now correct.
+
+=item *
+
+The C<..> operator now works correctly with ranges whose ends are at or
+close to the values of the smallest and largest integers.
+
+=item *
+
+C<binmode STDIN, ':raw'> could lead to segmentation faults on some platforms.
+This has been fixed [RT #54828].
+
+=item *
+
+An off-by-one error meant that C<index $str, ...> was effectively being
+executed as C<index "$str\0", ...>. This has been fixed [RT #53746].
+
+=item *
+
+Various leaks associated with named captures in regexes have been fixed
+[RT #57024].
+
+=item *
+
+A weak reference to a hash would leak. This was affecting C<DBI>
+[RT #56908].
+
+=item *
+
+Using (?|) in a regex could cause a segfault [RT #59734].
+
+=item *
+
+Use of a UTF-8 C<tr//> within a closure could cause a segfault [RT #61520].
+
+=item *
+
+Calling C<sv_chop()> or otherwise upgrading an SV could result in an
+unaligned 64-bit access on the SPARC architecture [RT #60574].
+
+=item *
+
+In the 5.10.0 release, C<inc_version_list> would incorrectly list
+C<5.10.*> after C<5.8.*>; this affected the C<@INC> search order
+[RT #67628].
+
+=item *
+
+In 5.10.0, C<pack "a*", $tainted_value> returned a non-tainted value
+[RT #52552].
+
+=item *
+
+In 5.10.0, C<printf> and C<sprintf> could produce the fatal error
+C<panic: utf8_mg_pos_cache_update> when printing UTF-8 strings
+[RT #62666].
+
+=item *
+
+In the 5.10.0 release, a dynamically created C<AUTOLOAD> method might be
+missed (method cache issue) [RT #60220,60232].
+
+=item *
+
+In the 5.10.0 release, a combination of C<use feature> and C<//ee> could
+cause a memory leak [RT #63110].
+
+=item *
+
+C<-C> on the shebang (C<#!>) line is once more permitted if it is also
+specified on the command line. C<-C> on the shebang line used to be a
+silent no-op I<if> it was not also on the command line, so perl 5.10.0
+disallowed it, which broke some scripts. Now perl checks whether it is
+also on the command line and only dies if it is not [RT #67880].
+
+=item *
+
+In 5.10.0, certain types of re-entrant regular expression could crash,
+or cause the following assertion failure [RT #60508]:
+
+ Assertion rx->sublen >= (s - rx->subbeg) + i failed
+
+
+=back
+
+=head1 New or Changed Diagnostics
+
+=over 4
+
+=item C<panic: sv_chop %s>
+
+This new fatal error occurs when the C routine C<Perl_sv_chop()> was
+passed a position that is not within the scalar's string buffer. This
+could be caused by buggy XS code, and at this point recovery is not
+possible.
+
+=item C<Can't locate package %s for the parents of %s>
+
+This warning has been removed. In general, it only got produced in
+conjunction with other warnings, and removing it allowed an ISA lookup
+optimisation to be added.
+
+=item C<v-string in use/require is non-portable>
+
+This warning has been removed.
+
+=item C<Deep recursion on subroutine "%s">
+
+It is now possible to change the depth threshold for this warning from the
+default of 100, by recompiling the F<perl> binary, setting the C
+pre-processor macro C<PERL_SUB_DEPTH_WARN> to the desired value.
+
+=back
+
+=head1 Changed Internals
+
+=over 4
+
+=item *
+
+The J.R.R. Tolkien quotes at the head of C source file have been checked and
+proper citations added, thanks to a patch from Tom Christiansen.
+
+=item *
+
+C<vcroak()> now accepts a null first argument. In addition, a full audit
+was made of the "not NULL" compiler annotations, and those for several
+other internal functions were corrected.
+
+=item *
+
+New macros C<dSAVEDERRNO>, C<dSAVE_ERRNO>, C<SAVE_ERRNO>, C<RESTORE_ERRNO>
+have been added to formalise the temporary saving of the C<errno>
+variable.
+
+=item *
+
+The function C<Perl_sv_insert_flags> has been added to augment
+C<Perl_sv_insert>.
+
+=item *
+
+The function C<Perl_newSV_type(type)> has been added, equivalent to
+C<Perl_newSV()> followed by C<Perl_sv_upgrade(type)>.
+
+=item *
+
+The function C<Perl_newSVpvn_flags()> has been added, equivalent to
+C<Perl_newSVpvn()> and then performing the action relevant to the flag.
+
+Two flag bits are currently supported.
+
+=over 4
+
+=item C<SVf_UTF8>
+
+This will call C<SvUTF8_on()> for you. (Note that this does not convert an
+sequence of ISO 8859-1 characters to UTF-8). A wrapper, C<newSVpvn_utf8()>
+is available for this.
+
+=item C<SVs_TEMP>
+
+Call C<sv_2mortal()> on the new SV.
+
+=back
+
+There is also a wrapper that takes constant strings, C<newSVpvs_flags()>.
+
+=item *
+
+The function C<Perl_croak_xs_usage> has been added as a wrapper to
+C<Perl_croak>.
+
+=item *
+
+The functions C<PerlIO_find_layer> and C<PerlIO_list_alloc> are now
+exported.
+
+=item *
+
+C<PL_na> has been exterminated from the core code, replaced by local STRLEN
+temporaries, or C<*_nolen()> calls. Either approach is faster than C<PL_na>,
+which is a pointer deference into the interpreter structure under ithreads,
+and a global variable otherwise.
+
+=item *
+
+C<Perl_mg_free()> used to leave freed memory accessible via SvMAGIC() on
+the scalar. It now updates the linked list to remove each piece of magic
+as it is freed.
+
+=item *
+
+Under ithreads, the regex in C<PL_reg_curpm> is now reference counted. This
+eliminates a lot of hackish workarounds to cope with it not being reference
+counted.
+
+=item *
+
+C<Perl_mg_magical()> would sometimes incorrectly turn on C<SvRMAGICAL()>.
+This has been fixed.
+
+=item *
+
+The I<public> IV and NV flags are now not set if the string value has
+trailing "garbage". This behaviour is consistent with not setting the
+public IV or NV flags if the value is out of range for the type.
+
+=item *
+
+SV allocation tracing has been added to the diagnostics enabled by C<-Dm>.
+The tracing can alternatively output via the C<PERL_MEM_LOG> mechanism, if
+that was enabled when the F<perl> binary was compiled.
+
+=item *
+
+Uses of C<Nullav>, C<Nullcv>, C<Nullhv>, C<Nullop>, C<Nullsv> etc have been
+replaced by C<NULL> in the core code, and non-dual-life modules, as C<NULL>
+is clearer to those unfamiliar with the core code.
+
+=item *
+
+A macro C<MUTABLE_PTR(p)> has been added, which on (non-pedantic) gcc will
+not cast away C<const>, returning a C<void *>. Macros C<MUTABLE_SV(av)>,
+C<MUTABLE_SV(cv)> etc build on this, casting to C<AV *> etc without
+casting away C<const>. This allows proper compile-time auditing of
+C<const> correctness in the core, and helped picked up some errors (now
+fixed).
+
+=item *
+
+Macros C<mPUSHs()> and C<mXPUSHs()> have been added, for pushing SVs on the
+stack and mortalizing them.
+
+=item *
+
+Use of the private structure C<mro_meta> has changed slightly. Nothing
+outside the core should be accessing this directly anyway.
+
+=item *
+
+A new tool, C<Porting/expand-macro.pl> has been added, that allows you
+to view how a C preprocessor macro would be expanded when compiled.
+This is handy when trying to decode the macro hell that is the perl
+guts.
+
+=back
+
+=head1 New Tests
+
+Many modules updated from CPAN incorporate new tests.
+
+Several tests that have the potential to hang forever if they fail now
+incorporate a "watchdog" functionality that will kill them after a timeout,
+which helps ensure that C<make test> and C<make test_harness> run to
+completion automatically. (Jerry Hedden).
+
+Some core-specific tests have been added:
+
+=over 4
+
+=item t/comp/retainedlines.t
+
+Check that the debugger can retain source lines from C<eval>.
+
+=item t/io/perlio_fail.t
+
+Check that bad layers fail.
+
+=item t/io/perlio_leaks.t
+
+Check that PerlIO layers are not leaking.
+
+=item t/io/perlio_open.t
+
+Check that certain special forms of open work.
+
+=item t/io/perlio.t
+
+General PerlIO tests.
+
+=item t/io/pvbm.t
+
+Check that there is no unexpected interaction between the internal types
+C<PVBM> and C<PVGV>.
+
+=item t/mro/package_aliases.t
+
+Check that mro works properly in the presence of aliased packages.
+
+=item t/op/dbm.t
+
+Tests for C<dbmopen> and C<dbmclose>.
+
+=item t/op/index_thr.t
+
+Tests for the interaction of C<index> and threads.
+
+=item t/op/pat_thr.t
+
+Tests for the interaction of esoteric patterns and threads.
+
+=item t/op/qr_gc.t
+
+Test that C<qr> doesn't leak.
+
+=item t/op/reg_email_thr.t
+
+Tests for the interaction of regex recursion and threads.
+
+=item t/op/regexp_qr_embed_thr.t
+
+Tests for the interaction of patterns with embedded C<qr//> and threads.
+
+=item t/op/regexp_unicode_prop.t
+
+Tests for Unicode properties in regular expressions.
+
+=item t/op/regexp_unicode_prop_thr.t
+
+Tests for the interaction of Unicode properties and threads.
+
+=item t/op/reg_nc_tie.t
+
+Test the tied methods of C<Tie::Hash::NamedCapture>.
+
+=item t/op/reg_posixcc.t
+
+Check that POSIX character classes behave consistently.
+
+=item t/op/re.t
+
+Check that exportable C<re> functions in F<universal.c> work.
+
+=item t/op/setpgrpstack.t
+
+Check that C<setpgrp> works.
+
+=item t/op/substr_thr.t
+
+Tests for the interaction of C<substr> and threads.
+
+=item t/op/upgrade.t
+
+Check that upgrading and assigning scalars works.
+
+=item t/uni/lex_utf8.t
+
+Check that Unicode in the lexer works.
+
+=item t/uni/tie.t
+
+Check that Unicode and C<tie> work.
+
+=back
+
+=head1 Known Problems
+
+This is a list of some significant unfixed bugs, which are regressions
+from either 5.10.0 or 5.8.x.
+
+=over 4
+
+=item *
+
+C<List::Util::first> misbehaves in the presence of a lexical C<$_>
+(typically introduced by C<my $_> or implicitly by C<given>). The variable
+which gets set for each iteration is the package variable C<$_>, not the
+lexical C<$_> [RT #67694].
+
+A similar issue may occur in other modules that provide functions which
+take a block as their first argument, like
+
+ foo { ... $_ ...} list
+
+=item *
+
+The C<charnames> pragma may generate a run-time error when a regex is
+interpolated [RT #56444]:
+
+ use charnames ':full';
+ my $r1 = qr/\N{THAI CHARACTER SARA I}/;
+ "foo" =~ $r1; # okay
+ "foo" =~ /$r1+/; # runtime error
+
+A workaround is to generate the character outside of the regex:
+
+ my $a = "\N{THAI CHARACTER SARA I}";
+ my $r1 = qr/$a/;
+
+=item *
+
+Some regexes may run much more slowly when run in a child thread compared
+with the thread the pattern was compiled into [RT #55600].
+
+
+=back
+
+=head1 Deprecations
+
+The following items are now deprecated.
+
+=over 4
+
+=item *
+
+C<Switch> is buggy and should be avoided. From perl 5.11.0 onwards, it is
+intended that any use of the core version of this module will emit a
+warning, and that the module will eventually be removed from the core
+(probably in perl 5.14.0). See L<perlsyn/"Switch statements"> for its
+replacement.
+
+=item *
+
+C<suidperl> will be removed in 5.12.0. This provides a mechanism to
+emulate setuid permission bits on systems that don't support it properly.
+
+=back
+
+=head1 Acknowledgements
+
+Some of the work in this release was funded by a TPF grant.
+
+Nicholas Clark officially retired from maintenance pumpking duty at the
+end of 2008; however in reality he has put much effort in since then to
+help get 5.10.1 into a fit state to be released, including writing a
+considerable chunk of this perldelta.
+
+Steffen Mueller and David Golden in particular helped getting CPAN modules
+polished and synchronised with their in-core equivalents.
+
+Craig Berry was tireless in getting maint to run under VMS, no matter how
+many times we broke it for him.
+
+The other core committers contributed most of the changes, and applied most
+of the patches sent in by the hundreds of contributors listed in F<AUTHORS>.
+
+(Sorry to all the people I haven't mentioned by name).
+
+Finally, thanks to Larry Wall, without whom none of this would be
+necessary.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://rt.perl.org/perlbug/ . There may also be
+information at http://www.perl.org/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+If the bug you are reporting has security implications, which make it
+inappropriate to send to a publicly archived mailing list, then please send
+it to perl5-security-report@perl.org. This points to a closed subscription
+unarchived mailing list, which includes all the core committers, who be able
+to help assess the impact of issues, figure out a resolution, and help
+co-ordinate the release of patches to mitigate or fix the problem across all
+platforms on which Perl is supported. Please only use this address for
+security issues in the Perl core, not for modules independently
+distributed on CPAN.
+
+=head1 SEE ALSO
+
+The F<Changes> file for an explanation of how to view exhaustive details
+on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl561delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl561delta.pod
new file mode 100755
index 00000000000..4aa947488d5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl561delta.pod
@@ -0,0 +1,3661 @@
+=head1 NAME
+
+perl561delta - what's new for perl v5.6.x
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.005 release and the 5.6.1
+release.
+
+=head1 Summary of changes between 5.6.0 and 5.6.1
+
+This section contains a summary of the changes between the 5.6.0 release
+and the 5.6.1 release. More details about the changes mentioned here
+may be found in the F<Changes> files that accompany the Perl source
+distribution. See L<perlhack> for pointers to online resources where you
+can inspect the individual patches described by these changes.
+
+=head2 Security Issues
+
+suidperl will not run /bin/mail anymore, because some platforms have
+a /bin/mail that is vulnerable to buffer overflow attacks.
+
+Note that suidperl is neither built nor installed by default in
+any recent version of perl. Use of suidperl is highly discouraged.
+If you think you need it, try alternatives such as sudo first.
+See http://www.courtesan.com/sudo/ .
+
+=head2 Core bug fixes
+
+This is not an exhaustive list. It is intended to cover only the
+significant user-visible changes.
+
+=over
+
+=item C<UNIVERSAL::isa()>
+
+A bug in the caching mechanism used by C<UNIVERSAL::isa()> that affected
+base.pm has been fixed. The bug has existed since the 5.005 releases,
+but wasn't tickled by base.pm in those releases.
+
+=item Memory leaks
+
+Various cases of memory leaks and attempts to access uninitialized memory
+have been cured. See L</"Known Problems"> below for further issues.
+
+=item Numeric conversions
+
+Numeric conversions did not recognize changes in the string value
+properly in certain circumstances.
+
+In other situations, large unsigned numbers (those above 2**31) could
+sometimes lose their unsignedness, causing bogus results in arithmetic
+operations.
+
+Integer modulus on large unsigned integers sometimes returned
+incorrect values.
+
+Perl 5.6.0 generated "not a number" warnings on certain conversions where
+previous versions didn't.
+
+These problems have all been rectified.
+
+Infinity is now recognized as a number.
+
+=item qw(a\\b)
+
+In Perl 5.6.0, qw(a\\b) produced a string with two backslashes instead
+of one, in a departure from the behavior in previous versions. The
+older behavior has been reinstated.
+
+=item caller()
+
+caller() could cause core dumps in certain situations. Carp was sometimes
+affected by this problem.
+
+=item Bugs in regular expressions
+
+Pattern matches on overloaded values are now handled correctly.
+
+Perl 5.6.0 parsed m/\x{ab}/ incorrectly, leading to spurious warnings.
+This has been corrected.
+
+The RE engine found in Perl 5.6.0 accidentally pessimised certain kinds
+of simple pattern matches. These are now handled better.
+
+Regular expression debug output (whether through C<use re 'debug'>
+or via C<-Dr>) now looks better.
+
+Multi-line matches like C<"a\nxb\n" =~ /(?!\A)x/m> were flawed. The
+bug has been fixed.
+
+Use of $& could trigger a core dump under some situations. This
+is now avoided.
+
+Match variables $1 et al., weren't being unset when a pattern match
+was backtracking, and the anomaly showed up inside C</...(?{ ... }).../>
+etc. These variables are now tracked correctly.
+
+pos() did not return the correct value within s///ge in earlier
+versions. This is now handled correctly.
+
+=item "slurp" mode
+
+readline() on files opened in "slurp" mode could return an extra "" at
+the end in certain situations. This has been corrected.
+
+=item Autovivification of symbolic references to special variables
+
+Autovivification of symbolic references of special variables described
+in L<perlvar> (as in C<${$num}>) was accidentally disabled. This works
+again now.
+
+=item Lexical warnings
+
+Lexical warnings now propagate correctly into C<eval "...">.
+
+C<use warnings qw(FATAL all)> did not work as intended. This has been
+corrected.
+
+Lexical warnings could leak into other scopes in some situations.
+This is now fixed.
+
+warnings::enabled() now reports the state of $^W correctly if the caller
+isn't using lexical warnings.
+
+=item Spurious warnings and errors
+
+Perl 5.6.0 could emit spurious warnings about redefinition of dl_error()
+when statically building extensions into perl. This has been corrected.
+
+"our" variables could result in bogus "Variable will not stay shared"
+warnings. This is now fixed.
+
+"our" variables of the same name declared in two sibling blocks
+resulted in bogus warnings about "redeclaration" of the variables.
+The problem has been corrected.
+
+=item glob()
+
+Compatibility of the builtin glob() with old csh-based glob has been
+improved with the addition of GLOB_ALPHASORT option. See C<File::Glob>.
+
+File::Glob::glob() has been renamed to File::Glob::bsd_glob()
+because the name clashes with the builtin glob(). The older
+name is still available for compatibility, but is deprecated.
+
+Spurious syntax errors generated in certain situations, when glob()
+caused File::Glob to be loaded for the first time, have been fixed.
+
+=item Tainting
+
+Some cases of inconsistent taint propagation (such as within hash
+values) have been fixed.
+
+The tainting behavior of sprintf() has been rationalized. It does
+not taint the result of floating point formats anymore, making the
+behavior consistent with that of string interpolation.
+
+=item sort()
+
+Arguments to sort() weren't being provided the right wantarray() context.
+The comparison block is now run in scalar context, and the arguments to
+be sorted are always provided list context.
+
+sort() is also fully reentrant, in the sense that the sort function
+can itself call sort(). This did not work reliably in previous releases.
+
+=item #line directives
+
+#line directives now work correctly when they appear at the very
+beginning of C<eval "...">.
+
+=item Subroutine prototypes
+
+The (\&) prototype now works properly.
+
+=item map()
+
+map() could get pathologically slow when the result list it generates
+is larger than the source list. The performance has been improved for
+common scenarios.
+
+=item Debugger
+
+Debugger exit code now reflects the script exit code.
+
+Condition C<"0"> in breakpoints is now treated correctly.
+
+The C<d> command now checks the line number.
+
+C<$.> is no longer corrupted by the debugger.
+
+All debugger output now correctly goes to the socket if RemotePort
+is set.
+
+=item PERL5OPT
+
+PERL5OPT can be set to more than one switch group. Previously,
+it used to be limited to one group of options only.
+
+=item chop()
+
+chop(@list) in list context returned the characters chopped in reverse
+order. This has been reversed to be in the right order.
+
+=item Unicode support
+
+Unicode support has seen a large number of incremental improvements,
+but continues to be highly experimental. It is not expected to be
+fully supported in the 5.6.x maintenance releases.
+
+substr(), join(), repeat(), reverse(), quotemeta() and string
+concatenation were all handling Unicode strings incorrectly in
+Perl 5.6.0. This has been corrected.
+
+Support for C<tr///CU> and C<tr///UC> etc., have been removed since
+we realized the interface is broken. For similar functionality,
+see L<perlfunc/pack>.
+
+The Unicode Character Database has been updated to version 3.0.1
+with additions made available to the public as of August 30, 2000.
+
+The Unicode character classes \p{Blank} and \p{SpacePerl} have been
+added. "Blank" is like C isblank(), that is, it contains only
+"horizontal whitespace" (the space character is, the newline isn't),
+and the "SpacePerl" is the Unicode equivalent of C<\s> (\p{Space}
+isn't, since that includes the vertical tabulator character, whereas
+C<\s> doesn't.)
+
+If you are experimenting with Unicode support in perl, the development
+versions of Perl may have more to offer. In particular, I/O layers
+are now available in the development track, but not in the maintenance
+track, primarily to do backward compatibility issues. Unicode support
+is also evolving rapidly on a daily basis in the development track--the
+maintenance track only reflects the most conservative of these changes.
+
+=item 64-bit support
+
+Support for 64-bit platforms has been improved, but continues to be
+experimental. The level of support varies greatly among platforms.
+
+=item Compiler
+
+The B Compiler and its various backends have had many incremental
+improvements, but they continue to remain highly experimental. Use in
+production environments is discouraged.
+
+The perlcc tool has been rewritten so that the user interface is much
+more like that of a C compiler.
+
+The perlbc tools has been removed. Use C<perlcc -B> instead.
+
+=item Lvalue subroutines
+
+There have been various bugfixes to support lvalue subroutines better.
+However, the feature still remains experimental.
+
+=item IO::Socket
+
+IO::Socket::INET failed to open the specified port if the service
+name was not known. It now correctly uses the supplied port number
+as is.
+
+=item File::Find
+
+File::Find now chdir()s correctly when chasing symbolic links.
+
+=item xsubpp
+
+xsubpp now tolerates embedded POD sections.
+
+=item C<no Module;>
+
+C<no Module;> does not produce an error even if Module does not have an
+unimport() method. This parallels the behavior of C<use> vis-a-vis
+C<import>.
+
+=item Tests
+
+A large number of tests have been added.
+
+=back
+
+=head2 Core features
+
+untie() will now call an UNTIE() hook if it exists. See L<perltie>
+for details.
+
+The C<-DT> command line switch outputs copious tokenizing information.
+See L<perlrun>.
+
+Arrays are now always interpolated in double-quotish strings. Previously,
+C<"foo@bar.com"> used to be a fatal error at compile time, if an array
+C<@bar> was not used or declared. This transitional behavior was
+intended to help migrate perl4 code, and is deemed to be no longer useful.
+See L</"Arrays now always interpolate into double-quoted strings">.
+
+keys(), each(), pop(), push(), shift(), splice() and unshift()
+can all be overridden now.
+
+C<my __PACKAGE__ $obj> now does the expected thing.
+
+=head2 Configuration issues
+
+On some systems (IRIX and Solaris among them) the system malloc is demonstrably
+better. While the defaults haven't been changed in order to retain binary
+compatibility with earlier releases, you may be better off building perl
+with C<Configure -Uusemymalloc ...> as discussed in the F<INSTALL> file.
+
+C<Configure> has been enhanced in various ways:
+
+=over
+
+=item *
+
+Minimizes use of temporary files.
+
+=item *
+
+By default, does not link perl with libraries not used by it, such as
+the various dbm libraries. SunOS 4.x hints preserve behavior on that
+platform.
+
+=item *
+
+Support for pdp11-style memory models has been removed due to obsolescence.
+
+=item *
+
+Building outside the source tree is supported on systems that have
+symbolic links. This is done by running
+
+ sh /path/to/source/Configure -Dmksymlinks ...
+ make all test install
+
+in a directory other than the perl source directory. See F<INSTALL>.
+
+=item *
+
+C<Configure -S> can be run non-interactively.
+
+=back
+
+=head2 Documentation
+
+README.aix, README.solaris and README.macos have been added.
+README.posix-bc has been renamed to README.bs2000. These are
+installed as L<perlaix>, L<perlsolaris>, L<perlmacos>, and
+L<perlbs2000> respectively.
+
+The following pod documents are brand new:
+
+ perlclib Internal replacements for standard C library functions
+ perldebtut Perl debugging tutorial
+ perlebcdic Considerations for running Perl on EBCDIC platforms
+ perlnewmod Perl modules: preparing a new module for distribution
+ perlrequick Perl regular expressions quick start
+ perlretut Perl regular expressions tutorial
+ perlutil utilities packaged with the Perl distribution
+
+The F<INSTALL> file has been expanded to cover various issues, such as
+64-bit support.
+
+A longer list of contributors has been added to the source distribution.
+See the file C<AUTHORS>.
+
+Numerous other changes have been made to the included documentation and FAQs.
+
+=head2 Bundled modules
+
+The following modules have been added.
+
+=over
+
+=item B::Concise
+
+Walks Perl syntax tree, printing concise info about ops. See L<B::Concise>.
+
+=item File::Temp
+
+Returns name and handle of a temporary file safely. See L<File::Temp>.
+
+=item Pod::LaTeX
+
+Converts Pod data to formatted LaTeX. See L<Pod::LaTeX>.
+
+=item Pod::Text::Overstrike
+
+Converts POD data to formatted overstrike text. See L<Pod::Text::Overstrike>.
+
+=back
+
+The following modules have been upgraded.
+
+=over
+
+=item CGI
+
+CGI v2.752 is now included.
+
+=item CPAN
+
+CPAN v1.59_54 is now included.
+
+=item Class::Struct
+
+Various bugfixes have been added.
+
+=item DB_File
+
+DB_File v1.75 supports newer Berkeley DB versions, among other
+improvements.
+
+=item Devel::Peek
+
+Devel::Peek has been enhanced to support dumping of memory statistics,
+when perl is built with the included malloc().
+
+=item File::Find
+
+File::Find now supports pre and post-processing of the files in order
+to sort() them, etc.
+
+=item Getopt::Long
+
+Getopt::Long v2.25 is included.
+
+=item IO::Poll
+
+Various bug fixes have been included.
+
+=item IPC::Open3
+
+IPC::Open3 allows use of numeric file descriptors.
+
+=item Math::BigFloat
+
+The fmod() function supports modulus operations. Various bug fixes
+have also been included.
+
+=item Math::Complex
+
+Math::Complex handles inf, NaN etc., better.
+
+=item Net::Ping
+
+ping() could fail on odd number of data bytes, and when the echo service
+isn't running. This has been corrected.
+
+=item Opcode
+
+A memory leak has been fixed.
+
+=item Pod::Parser
+
+Version 1.13 of the Pod::Parser suite is included.
+
+=item Pod::Text
+
+Pod::Text and related modules have been upgraded to the versions
+in podlators suite v2.08.
+
+=item SDBM_File
+
+On dosish platforms, some keys went missing because of lack of support for
+files with "holes". A workaround for the problem has been added.
+
+=item Sys::Syslog
+
+Various bug fixes have been included.
+
+=item Tie::RefHash
+
+Now supports Tie::RefHash::Nestable to automagically tie hashref values.
+
+=item Tie::SubstrHash
+
+Various bug fixes have been included.
+
+=back
+
+=head2 Platform-specific improvements
+
+The following new ports are now available.
+
+=over
+
+=item NCR MP-RAS
+
+=item NonStop-UX
+
+=back
+
+Perl now builds under Amdahl UTS.
+
+Perl has also been verified to build under Amiga OS.
+
+Support for EPOC has been much improved. See README.epoc.
+
+Building perl with -Duseithreads or -Duse5005threads now works
+under HP-UX 10.20 (previously it only worked under 10.30 or later).
+You will need a thread library package installed. See README.hpux.
+
+Long doubles should now work under Linux.
+
+Mac OS Classic is now supported in the mainstream source package.
+See README.macos.
+
+Support for MPE/iX has been updated. See README.mpeix.
+
+Support for OS/2 has been improved. See C<os2/Changes> and README.os2.
+
+Dynamic loading on z/OS (formerly OS/390) has been improved. See
+README.os390.
+
+Support for VMS has seen many incremental improvements, including
+better support for operators like backticks and system(), and better
+%ENV handling. See C<README.vms> and L<perlvms>.
+
+Support for Stratus VOS has been improved. See C<vos/Changes> and README.vos.
+
+Support for Windows has been improved.
+
+=over
+
+=item *
+
+fork() emulation has been improved in various ways, but still continues
+to be experimental. See L<perlfork> for known bugs and caveats.
+
+=item *
+
+%SIG has been enabled under USE_ITHREADS, but its use is completely
+unsupported under all configurations.
+
+=item *
+
+Borland C++ v5.5 is now a supported compiler that can build Perl.
+However, the generated binaries continue to be incompatible with those
+generated by the other supported compilers (GCC and Visual C++).
+
+=item *
+
+Non-blocking waits for child processes (or pseudo-processes) are
+supported via C<waitpid($pid, &POSIX::WNOHANG)>.
+
+=item *
+
+A memory leak in accept() has been fixed.
+
+=item *
+
+wait(), waitpid() and backticks now return the correct exit status under
+Windows 9x.
+
+=item *
+
+Trailing new %ENV entries weren't propagated to child processes. This
+is now fixed.
+
+=item *
+
+Current directory entries in %ENV are now correctly propagated to child
+processes.
+
+=item *
+
+Duping socket handles with open(F, ">&MYSOCK") now works under Windows 9x.
+
+=item *
+
+The makefiles now provide a single switch to bulk-enable all the features
+enabled in ActiveState ActivePerl (a popular binary distribution).
+
+=item *
+
+Win32::GetCwd() correctly returns C:\ instead of C: when at the drive root.
+Other bugs in chdir() and Cwd::cwd() have also been fixed.
+
+=item *
+
+fork() correctly returns undef and sets EAGAIN when it runs out of
+pseudo-process handles.
+
+=item *
+
+ExtUtils::MakeMaker now uses $ENV{LIB} to search for libraries.
+
+=item *
+
+UNC path handling is better when perl is built to support fork().
+
+=item *
+
+A handle leak in socket handling has been fixed.
+
+=item *
+
+send() works from within a pseudo-process.
+
+=back
+
+Unless specifically qualified otherwise, the remainder of this document
+covers changes between the 5.005 and 5.6.0 releases.
+
+=head1 Core Enhancements
+
+=head2 Interpreter cloning, threads, and concurrency
+
+Perl 5.6.0 introduces the beginnings of support for running multiple
+interpreters concurrently in different threads. In conjunction with
+the perl_clone() API call, which can be used to selectively duplicate
+the state of any given interpreter, it is possible to compile a
+piece of code once in an interpreter, clone that interpreter
+one or more times, and run all the resulting interpreters in distinct
+threads.
+
+On the Windows platform, this feature is used to emulate fork() at the
+interpreter level. See L<perlfork> for details about that.
+
+This feature is still in evolution. It is eventually meant to be used
+to selectively clone a subroutine and data reachable from that
+subroutine in a separate interpreter and run the cloned subroutine
+in a separate thread. Since there is no shared data between the
+interpreters, little or no locking will be needed (unless parts of
+the symbol table are explicitly shared). This is obviously intended
+to be an easy-to-use replacement for the existing threads support.
+
+Support for cloning interpreters and interpreter concurrency can be
+enabled using the -Dusethreads Configure option (see win32/Makefile for
+how to enable it on Windows.) The resulting perl executable will be
+functionally identical to one that was built with -Dmultiplicity, but
+the perl_clone() API call will only be available in the former.
+
+-Dusethreads enables the cpp macro USE_ITHREADS by default, which in turn
+enables Perl source code changes that provide a clear separation between
+the op tree and the data it operates with. The former is immutable, and
+can therefore be shared between an interpreter and all of its clones,
+while the latter is considered local to each interpreter, and is therefore
+copied for each clone.
+
+Note that building Perl with the -Dusemultiplicity Configure option
+is adequate if you wish to run multiple B<independent> interpreters
+concurrently in different threads. -Dusethreads only provides the
+additional functionality of the perl_clone() API call and other
+support for running B<cloned> interpreters concurrently.
+
+ NOTE: This is an experimental feature. Implementation details are
+ subject to change.
+
+=head2 Lexically scoped warning categories
+
+You can now control the granularity of warnings emitted by perl at a finer
+level using the C<use warnings> pragma. L<warnings> and L<perllexwarn>
+have copious documentation on this feature.
+
+=head2 Unicode and UTF-8 support
+
+Perl now uses UTF-8 as its internal representation for character
+strings. The C<utf8> and C<bytes> pragmas are used to control this support
+in the current lexical scope. See L<perlunicode>, L<utf8> and L<bytes> for
+more information.
+
+This feature is expected to evolve quickly to support some form of I/O
+disciplines that can be used to specify the kind of input and output data
+(bytes or characters). Until that happens, additional modules from CPAN
+will be needed to complete the toolkit for dealing with Unicode.
+
+ NOTE: This should be considered an experimental feature. Implementation
+ details are subject to change.
+
+=head2 Support for interpolating named characters
+
+The new C<\N> escape interpolates named characters within strings.
+For example, C<"Hi! \N{WHITE SMILING FACE}"> evaluates to a string
+with a Unicode smiley face at the end.
+
+=head2 "our" declarations
+
+An "our" declaration introduces a value that can be best understood
+as a lexically scoped symbolic alias to a global variable in the
+package that was current where the variable was declared. This is
+mostly useful as an alternative to the C<vars> pragma, but also provides
+the opportunity to introduce typing and other attributes for such
+variables. See L<perlfunc/our>.
+
+=head2 Support for strings represented as a vector of ordinals
+
+Literals of the form C<v1.2.3.4> are now parsed as a string composed
+of characters with the specified ordinals. This is an alternative, more
+readable way to construct (possibly Unicode) strings instead of
+interpolating characters, as in C<"\x{1}\x{2}\x{3}\x{4}">. The leading
+C<v> may be omitted if there are more than two ordinals, so C<1.2.3> is
+parsed the same as C<v1.2.3>.
+
+Strings written in this form are also useful to represent version "numbers".
+It is easy to compare such version "numbers" (which are really just plain
+strings) using any of the usual string comparison operators C<eq>, C<ne>,
+C<lt>, C<gt>, etc., or perform bitwise string operations on them using C<|>,
+C<&>, etc.
+
+In conjunction with the new C<$^V> magic variable (which contains
+the perl version as a string), such literals can be used as a readable way
+to check if you're running a particular version of Perl:
+
+ # this will parse in older versions of Perl also
+ if ($^V and $^V gt v5.6.0) {
+ # new features supported
+ }
+
+C<require> and C<use> also have some special magic to support such literals.
+They will be interpreted as a version rather than as a module name:
+
+ require v5.6.0; # croak if $^V lt v5.6.0
+ use v5.6.0; # same, but croaks at compile-time
+
+Alternatively, the C<v> may be omitted if there is more than one dot:
+
+ require 5.6.0;
+ use 5.6.0;
+
+Also, C<sprintf> and C<printf> support the Perl-specific format flag C<%v>
+to print ordinals of characters in arbitrary strings:
+
+ printf "v%vd", $^V; # prints current version, such as "v5.5.650"
+ printf "%*vX", ":", $addr; # formats IPv6 address
+ printf "%*vb", " ", $bits; # displays bitstring
+
+See L<perldata/"Scalar value constructors"> for additional information.
+
+=head2 Improved Perl version numbering system
+
+Beginning with Perl version 5.6.0, the version number convention has been
+changed to a "dotted integer" scheme that is more commonly found in open
+source projects.
+
+Maintenance versions of v5.6.0 will be released as v5.6.1, v5.6.2 etc.
+The next development series following v5.6.0 will be numbered v5.7.x,
+beginning with v5.7.0, and the next major production release following
+v5.6.0 will be v5.8.0.
+
+The English module now sets $PERL_VERSION to $^V (a string value) rather
+than C<$]> (a numeric value). (This is a potential incompatibility.
+Send us a report via perlbug if you are affected by this.)
+
+The v1.2.3 syntax is also now legal in Perl.
+See L<Support for strings represented as a vector of ordinals> for more on that.
+
+To cope with the new versioning system's use of at least three significant
+digits for each version component, the method used for incrementing the
+subversion number has also changed slightly. We assume that versions older
+than v5.6.0 have been incrementing the subversion component in multiples of
+10. Versions after v5.6.0 will increment them by 1. Thus, using the new
+notation, 5.005_03 is the "same" as v5.5.30, and the first maintenance
+version following v5.6.0 will be v5.6.1 (which should be read as being
+equivalent to a floating point value of 5.006_001 in the older format,
+stored in C<$]>).
+
+=head2 New syntax for declaring subroutine attributes
+
+Formerly, if you wanted to mark a subroutine as being a method call or
+as requiring an automatic lock() when it is entered, you had to declare
+that with a C<use attrs> pragma in the body of the subroutine.
+That can now be accomplished with declaration syntax, like this:
+
+ sub mymethod : locked method;
+ ...
+ sub mymethod : locked method {
+ ...
+ }
+
+ sub othermethod :locked :method;
+ ...
+ sub othermethod :locked :method {
+ ...
+ }
+
+
+(Note how only the first C<:> is mandatory, and whitespace surrounding
+the C<:> is optional.)
+
+F<AutoSplit.pm> and F<SelfLoader.pm> have been updated to keep the attributes
+with the stubs they provide. See L<attributes>.
+
+=head2 File and directory handles can be autovivified
+
+Similar to how constructs such as C<< $x->[0] >> autovivify a reference,
+handle constructors (open(), opendir(), pipe(), socketpair(), sysopen(),
+socket(), and accept()) now autovivify a file or directory handle
+if the handle passed to them is an uninitialized scalar variable. This
+allows the constructs such as C<open(my $fh, ...)> and C<open(local $fh,...)>
+to be used to create filehandles that will conveniently be closed
+automatically when the scope ends, provided there are no other references
+to them. This largely eliminates the need for typeglobs when opening
+filehandles that must be passed around, as in the following example:
+
+ sub myopen {
+ open my $fh, "@_"
+ or die "Can't open '@_': $!";
+ return $fh;
+ }
+
+ {
+ my $f = myopen("</etc/motd");
+ print <$f>;
+ # $f implicitly closed here
+ }
+
+=head2 open() with more than two arguments
+
+If open() is passed three arguments instead of two, the second argument
+is used as the mode and the third argument is taken to be the file name.
+This is primarily useful for protecting against unintended magic behavior
+of the traditional two-argument form. See L<perlfunc/open>.
+
+=head2 64-bit support
+
+Any platform that has 64-bit integers either
+
+ (1) natively as longs or ints
+ (2) via special compiler flags
+ (3) using long long or int64_t
+
+is able to use "quads" (64-bit integers) as follows:
+
+=over 4
+
+=item *
+
+constants (decimal, hexadecimal, octal, binary) in the code
+
+=item *
+
+arguments to oct() and hex()
+
+=item *
+
+arguments to print(), printf() and sprintf() (flag prefixes ll, L, q)
+
+=item *
+
+printed as such
+
+=item *
+
+pack() and unpack() "q" and "Q" formats
+
+=item *
+
+in basic arithmetics: + - * / % (NOTE: operating close to the limits
+of the integer values may produce surprising results)
+
+=item *
+
+in bit arithmetics: & | ^ ~ << >> (NOTE: these used to be forced
+to be 32 bits wide but now operate on the full native width.)
+
+=item *
+
+vec()
+
+=back
+
+Note that unless you have the case (a) you will have to configure
+and compile Perl using the -Duse64bitint Configure flag.
+
+ NOTE: The Configure flags -Duselonglong and -Duse64bits have been
+ deprecated. Use -Duse64bitint instead.
+
+There are actually two modes of 64-bitness: the first one is achieved
+using Configure -Duse64bitint and the second one using Configure
+-Duse64bitall. The difference is that the first one is minimal and
+the second one maximal. The first works in more places than the second.
+
+The C<use64bitint> does only as much as is required to get 64-bit
+integers into Perl (this may mean, for example, using "long longs")
+while your memory may still be limited to 2 gigabytes (because your
+pointers could still be 32-bit). Note that the name C<64bitint> does
+not imply that your C compiler will be using 64-bit C<int>s (it might,
+but it doesn't have to): the C<use64bitint> means that you will be
+able to have 64 bits wide scalar values.
+
+The C<use64bitall> goes all the way by attempting to switch also
+integers (if it can), longs (and pointers) to being 64-bit. This may
+create an even more binary incompatible Perl than -Duse64bitint: the
+resulting executable may not run at all in a 32-bit box, or you may
+have to reboot/reconfigure/rebuild your operating system to be 64-bit
+aware.
+
+Natively 64-bit systems like Alpha and Cray need neither -Duse64bitint
+nor -Duse64bitall.
+
+Last but not least: note that due to Perl's habit of always using
+floating point numbers, the quads are still not true integers.
+When quads overflow their limits (0...18_446_744_073_709_551_615 unsigned,
+-9_223_372_036_854_775_808...9_223_372_036_854_775_807 signed), they
+are silently promoted to floating point numbers, after which they will
+start losing precision (in their lower digits).
+
+ NOTE: 64-bit support is still experimental on most platforms.
+ Existing support only covers the LP64 data model. In particular, the
+ LLP64 data model is not yet supported. 64-bit libraries and system
+ APIs on many platforms have not stabilized--your mileage may vary.
+
+=head2 Large file support
+
+If you have filesystems that support "large files" (files larger than
+2 gigabytes), you may now also be able to create and access them from
+Perl.
+
+ NOTE: The default action is to enable large file support, if
+ available on the platform.
+
+If the large file support is on, and you have a Fcntl constant
+O_LARGEFILE, the O_LARGEFILE is automatically added to the flags
+of sysopen().
+
+Beware that unless your filesystem also supports "sparse files" seeking
+to umpteen petabytes may be inadvisable.
+
+Note that in addition to requiring a proper file system to do large
+files you may also need to adjust your per-process (or your
+per-system, or per-process-group, or per-user-group) maximum filesize
+limits before running Perl scripts that try to handle large files,
+especially if you intend to write such files.
+
+Finally, in addition to your process/process group maximum filesize
+limits, you may have quota limits on your filesystems that stop you
+(your user id or your user group id) from using large files.
+
+Adjusting your process/user/group/file system/operating system limits
+is outside the scope of Perl core language. For process limits, you
+may try increasing the limits using your shell's limits/limit/ulimit
+command before running Perl. The BSD::Resource extension (not
+included with the standard Perl distribution) may also be of use, it
+offers the getrlimit/setrlimit interface that can be used to adjust
+process resource usage limits, including the maximum filesize limit.
+
+=head2 Long doubles
+
+In some systems you may be able to use long doubles to enhance the
+range and precision of your double precision floating point numbers
+(that is, Perl's numbers). Use Configure -Duselongdouble to enable
+this support (if it is available).
+
+=head2 "more bits"
+
+You can "Configure -Dusemorebits" to turn on both the 64-bit support
+and the long double support.
+
+=head2 Enhanced support for sort() subroutines
+
+Perl subroutines with a prototype of C<($$)>, and XSUBs in general, can
+now be used as sort subroutines. In either case, the two elements to
+be compared are passed as normal parameters in @_. See L<perlfunc/sort>.
+
+For unprototyped sort subroutines, the historical behavior of passing
+the elements to be compared as the global variables $a and $b remains
+unchanged.
+
+=head2 C<sort $coderef @foo> allowed
+
+sort() did not accept a subroutine reference as the comparison
+function in earlier versions. This is now permitted.
+
+=head2 File globbing implemented internally
+
+Perl now uses the File::Glob implementation of the glob() operator
+automatically. This avoids using an external csh process and the
+problems associated with it.
+
+ NOTE: This is currently an experimental feature. Interfaces and
+ implementation are subject to change.
+
+=head2 Support for CHECK blocks
+
+In addition to C<BEGIN>, C<INIT>, C<END>, C<DESTROY> and C<AUTOLOAD>,
+subroutines named C<CHECK> are now special. These are queued up during
+compilation and behave similar to END blocks, except they are called at
+the end of compilation rather than at the end of execution. They cannot
+be called directly.
+
+=head2 POSIX character class syntax [: :] supported
+
+For example to match alphabetic characters use /[[:alpha:]]/.
+See L<perlre> for details.
+
+=head2 Better pseudo-random number generator
+
+In 5.005_0x and earlier, perl's rand() function used the C library
+rand(3) function. As of 5.005_52, Configure tests for drand48(),
+random(), and rand() (in that order) and picks the first one it finds.
+
+These changes should result in better random numbers from rand().
+
+=head2 Improved C<qw//> operator
+
+The C<qw//> operator is now evaluated at compile time into a true list
+instead of being replaced with a run time call to C<split()>. This
+removes the confusing misbehaviour of C<qw//> in scalar context, which
+had inherited that behaviour from split().
+
+Thus:
+
+ $foo = ($bar) = qw(a b c); print "$foo|$bar\n";
+
+now correctly prints "3|a", instead of "2|a".
+
+=head2 Better worst-case behavior of hashes
+
+Small changes in the hashing algorithm have been implemented in
+order to improve the distribution of lower order bits in the
+hashed value. This is expected to yield better performance on
+keys that are repeated sequences.
+
+=head2 pack() format 'Z' supported
+
+The new format type 'Z' is useful for packing and unpacking null-terminated
+strings. See L<perlfunc/"pack">.
+
+=head2 pack() format modifier '!' supported
+
+The new format type modifier '!' is useful for packing and unpacking
+native shorts, ints, and longs. See L<perlfunc/"pack">.
+
+=head2 pack() and unpack() support counted strings
+
+The template character '/' can be used to specify a counted string
+type to be packed or unpacked. See L<perlfunc/"pack">.
+
+=head2 Comments in pack() templates
+
+The '#' character in a template introduces a comment up to
+end of the line. This facilitates documentation of pack()
+templates.
+
+=head2 Weak references
+
+In previous versions of Perl, you couldn't cache objects so as
+to allow them to be deleted if the last reference from outside
+the cache is deleted. The reference in the cache would hold a
+reference count on the object and the objects would never be
+destroyed.
+
+Another familiar problem is with circular references. When an
+object references itself, its reference count would never go
+down to zero, and it would not get destroyed until the program
+is about to exit.
+
+Weak references solve this by allowing you to "weaken" any
+reference, that is, make it not count towards the reference count.
+When the last non-weak reference to an object is deleted, the object
+is destroyed and all the weak references to the object are
+automatically undef-ed.
+
+To use this feature, you need the Devel::WeakRef package from CPAN, which
+contains additional documentation.
+
+ NOTE: This is an experimental feature. Details are subject to change.
+
+=head2 Binary numbers supported
+
+Binary numbers are now supported as literals, in s?printf formats, and
+C<oct()>:
+
+ $answer = 0b101010;
+ printf "The answer is: %b\n", oct("0b101010");
+
+=head2 Lvalue subroutines
+
+Subroutines can now return modifiable lvalues.
+See L<perlsub/"Lvalue subroutines">.
+
+ NOTE: This is an experimental feature. Details are subject to change.
+
+=head2 Some arrows may be omitted in calls through references
+
+Perl now allows the arrow to be omitted in many constructs
+involving subroutine calls through references. For example,
+C<< $foo[10]->('foo') >> may now be written C<$foo[10]('foo')>.
+This is rather similar to how the arrow may be omitted from
+C<< $foo[10]->{'foo'} >>. Note however, that the arrow is still
+required for C<< foo(10)->('bar') >>.
+
+=head2 Boolean assignment operators are legal lvalues
+
+Constructs such as C<($a ||= 2) += 1> are now allowed.
+
+=head2 exists() is supported on subroutine names
+
+The exists() builtin now works on subroutine names. A subroutine
+is considered to exist if it has been declared (even if implicitly).
+See L<perlfunc/exists> for examples.
+
+=head2 exists() and delete() are supported on array elements
+
+The exists() and delete() builtins now work on simple arrays as well.
+The behavior is similar to that on hash elements.
+
+exists() can be used to check whether an array element has been
+initialized. This avoids autovivifying array elements that don't exist.
+If the array is tied, the EXISTS() method in the corresponding tied
+package will be invoked.
+
+delete() may be used to remove an element from the array and return
+it. The array element at that position returns to its uninitialized
+state, so that testing for the same element with exists() will return
+false. If the element happens to be the one at the end, the size of
+the array also shrinks up to the highest element that tests true for
+exists(), or 0 if none such is found. If the array is tied, the DELETE()
+method in the corresponding tied package will be invoked.
+
+See L<perlfunc/exists> and L<perlfunc/delete> for examples.
+
+=head2 Pseudo-hashes work better
+
+Dereferencing some types of reference values in a pseudo-hash,
+such as C<< $ph->{foo}[1] >>, was accidentally disallowed. This has
+been corrected.
+
+When applied to a pseudo-hash element, exists() now reports whether
+the specified value exists, not merely if the key is valid.
+
+delete() now works on pseudo-hashes. When given a pseudo-hash element
+or slice it deletes the values corresponding to the keys (but not the keys
+themselves). See L<perlref/"Pseudo-hashes: Using an array as a hash">.
+
+Pseudo-hash slices with constant keys are now optimized to array lookups
+at compile-time.
+
+List assignments to pseudo-hash slices are now supported.
+
+The C<fields> pragma now provides ways to create pseudo-hashes, via
+fields::new() and fields::phash(). See L<fields>.
+
+ NOTE: The pseudo-hash data type continues to be experimental.
+ Limiting oneself to the interface elements provided by the
+ fields pragma will provide protection from any future changes.
+
+=head2 Automatic flushing of output buffers
+
+fork(), exec(), system(), qx//, and pipe open()s now flush buffers
+of all files opened for output when the operation was attempted. This
+mostly eliminates confusing buffering mishaps suffered by users unaware
+of how Perl internally handles I/O.
+
+This is not supported on some platforms like Solaris where a suitably
+correct implementation of fflush(NULL) isn't available.
+
+=head2 Better diagnostics on meaningless filehandle operations
+
+Constructs such as C<< open(<FH>) >> and C<< close(<FH>) >>
+are compile time errors. Attempting to read from filehandles that
+were opened only for writing will now produce warnings (just as
+writing to read-only filehandles does).
+
+=head2 Where possible, buffered data discarded from duped input filehandle
+
+C<< open(NEW, "<&OLD") >> now attempts to discard any data that
+was previously read and buffered in C<OLD> before duping the handle.
+On platforms where doing this is allowed, the next read operation
+on C<NEW> will return the same data as the corresponding operation
+on C<OLD>. Formerly, it would have returned the data from the start
+of the following disk block instead.
+
+=head2 eof() has the same old magic as <>
+
+C<eof()> would return true if no attempt to read from C<< <> >> had
+yet been made. C<eof()> has been changed to have a little magic of its
+own, it now opens the C<< <> >> files.
+
+=head2 binmode() can be used to set :crlf and :raw modes
+
+binmode() now accepts a second argument that specifies a discipline
+for the handle in question. The two pseudo-disciplines ":raw" and
+":crlf" are currently supported on DOS-derivative platforms.
+See L<perlfunc/"binmode"> and L<open>.
+
+=head2 C<-T> filetest recognizes UTF-8 encoded files as "text"
+
+The algorithm used for the C<-T> filetest has been enhanced to
+correctly identify UTF-8 content as "text".
+
+=head2 system(), backticks and pipe open now reflect exec() failure
+
+On Unix and similar platforms, system(), qx() and open(FOO, "cmd |")
+etc., are implemented via fork() and exec(). When the underlying
+exec() fails, earlier versions did not report the error properly,
+since the exec() happened to be in a different process.
+
+The child process now communicates with the parent about the
+error in launching the external command, which allows these
+constructs to return with their usual error value and set $!.
+
+=head2 Improved diagnostics
+
+Line numbers are no longer suppressed (under most likely circumstances)
+during the global destruction phase.
+
+Diagnostics emitted from code running in threads other than the main
+thread are now accompanied by the thread ID.
+
+Embedded null characters in diagnostics now actually show up. They
+used to truncate the message in prior versions.
+
+$foo::a and $foo::b are now exempt from "possible typo" warnings only
+if sort() is encountered in package C<foo>.
+
+Unrecognized alphabetic escapes encountered when parsing quote
+constructs now generate a warning, since they may take on new
+semantics in later versions of Perl.
+
+Many diagnostics now report the internal operation in which the warning
+was provoked, like so:
+
+ Use of uninitialized value in concatenation (.) at (eval 1) line 1.
+ Use of uninitialized value in print at (eval 1) line 1.
+
+Diagnostics that occur within eval may also report the file and line
+number where the eval is located, in addition to the eval sequence
+number and the line number within the evaluated text itself. For
+example:
+
+ Not enough arguments for scalar at (eval 4)[newlib/perl5db.pl:1411] line 2, at EOF
+
+=head2 Diagnostics follow STDERR
+
+Diagnostic output now goes to whichever file the C<STDERR> handle
+is pointing at, instead of always going to the underlying C runtime
+library's C<stderr>.
+
+=head2 More consistent close-on-exec behavior
+
+On systems that support a close-on-exec flag on filehandles, the
+flag is now set for any handles created by pipe(), socketpair(),
+socket(), and accept(), if that is warranted by the value of $^F
+that may be in effect. Earlier versions neglected to set the flag
+for handles created with these operators. See L<perlfunc/pipe>,
+L<perlfunc/socketpair>, L<perlfunc/socket>, L<perlfunc/accept>,
+and L<perlvar/$^F>.
+
+=head2 syswrite() ease-of-use
+
+The length argument of C<syswrite()> has become optional.
+
+=head2 Better syntax checks on parenthesized unary operators
+
+Expressions such as:
+
+ print defined(&foo,&bar,&baz);
+ print uc("foo","bar","baz");
+ undef($foo,&bar);
+
+used to be accidentally allowed in earlier versions, and produced
+unpredictable behaviour. Some produced ancillary warnings
+when used in this way; others silently did the wrong thing.
+
+The parenthesized forms of most unary operators that expect a single
+argument now ensure that they are not called with more than one
+argument, making the cases shown above syntax errors. The usual
+behaviour of:
+
+ print defined &foo, &bar, &baz;
+ print uc "foo", "bar", "baz";
+ undef $foo, &bar;
+
+remains unchanged. See L<perlop>.
+
+=head2 Bit operators support full native integer width
+
+The bit operators (& | ^ ~ << >>) now operate on the full native
+integral width (the exact size of which is available in $Config{ivsize}).
+For example, if your platform is either natively 64-bit or if Perl
+has been configured to use 64-bit integers, these operations apply
+to 8 bytes (as opposed to 4 bytes on 32-bit platforms).
+For portability, be sure to mask off the excess bits in the result of
+unary C<~>, e.g., C<~$x & 0xffffffff>.
+
+=head2 Improved security features
+
+More potentially unsafe operations taint their results for improved
+security.
+
+The C<passwd> and C<shell> fields returned by the getpwent(), getpwnam(),
+and getpwuid() are now tainted, because the user can affect their own
+encrypted password and login shell.
+
+The variable modified by shmread(), and messages returned by msgrcv()
+(and its object-oriented interface IPC::SysV::Msg::rcv) are also tainted,
+because other untrusted processes can modify messages and shared memory
+segments for their own nefarious purposes.
+
+=head2 More functional bareword prototype (*)
+
+Bareword prototypes have been rationalized to enable them to be used
+to override builtins that accept barewords and interpret them in
+a special way, such as C<require> or C<do>.
+
+Arguments prototyped as C<*> will now be visible within the subroutine
+as either a simple scalar or as a reference to a typeglob.
+See L<perlsub/Prototypes>.
+
+=head2 C<require> and C<do> may be overridden
+
+C<require> and C<do 'file'> operations may be overridden locally
+by importing subroutines of the same name into the current package
+(or globally by importing them into the CORE::GLOBAL:: namespace).
+Overriding C<require> will also affect C<use>, provided the override
+is visible at compile-time.
+See L<perlsub/"Overriding Built-in Functions">.
+
+=head2 $^X variables may now have names longer than one character
+
+Formerly, $^X was synonymous with ${"\cX"}, but $^XY was a syntax
+error. Now variable names that begin with a control character may be
+arbitrarily long. However, for compatibility reasons, these variables
+I<must> be written with explicit braces, as C<${^XY}> for example.
+C<${^XYZ}> is synonymous with ${"\cXYZ"}. Variable names with more
+than one control character, such as C<${^XY^Z}>, are illegal.
+
+The old syntax has not changed. As before, `^X' may be either a
+literal control-X character or the two-character sequence `caret' plus
+`X'. When braces are omitted, the variable name stops after the
+control character. Thus C<"$^XYZ"> continues to be synonymous with
+C<$^X . "YZ"> as before.
+
+As before, lexical variables may not have names beginning with control
+characters. As before, variables whose names begin with a control
+character are always forced to be in package `main'. All such variables
+are reserved for future extensions, except those that begin with
+C<^_>, which may be used by user programs and are guaranteed not to
+acquire special meaning in any future version of Perl.
+
+=head2 New variable $^C reflects C<-c> switch
+
+C<$^C> has a boolean value that reflects whether perl is being run
+in compile-only mode (i.e. via the C<-c> switch). Since
+BEGIN blocks are executed under such conditions, this variable
+enables perl code to determine whether actions that make sense
+only during normal running are warranted. See L<perlvar>.
+
+=head2 New variable $^V contains Perl version as a string
+
+C<$^V> contains the Perl version number as a string composed of
+characters whose ordinals match the version numbers, i.e. v5.6.0.
+This may be used in string comparisons.
+
+See C<Support for strings represented as a vector of ordinals> for an
+example.
+
+=head2 Optional Y2K warnings
+
+If Perl is built with the cpp macro C<PERL_Y2KWARN> defined,
+it emits optional warnings when concatenating the number 19
+with another number.
+
+This behavior must be specifically enabled when running Configure.
+See F<INSTALL> and F<README.Y2K>.
+
+=head2 Arrays now always interpolate into double-quoted strings
+
+In double-quoted strings, arrays now interpolate, no matter what. The
+behavior in earlier versions of perl 5 was that arrays would interpolate
+into strings if the array had been mentioned before the string was
+compiled, and otherwise Perl would raise a fatal compile-time error.
+In versions 5.000 through 5.003, the error was
+
+ Literal @example now requires backslash
+
+In versions 5.004_01 through 5.6.0, the error was
+
+ In string, @example now must be written as \@example
+
+The idea here was to get people into the habit of writing
+C<"fred\@example.com"> when they wanted a literal C<@> sign, just as
+they have always written C<"Give me back my \$5"> when they wanted a
+literal C<$> sign.
+
+Starting with 5.6.1, when Perl now sees an C<@> sign in a
+double-quoted string, it I<always> attempts to interpolate an array,
+regardless of whether or not the array has been used or declared
+already. The fatal error has been downgraded to an optional warning:
+
+ Possible unintended interpolation of @example in string
+
+This warns you that C<"fred@example.com"> is going to turn into
+C<fred.com> if you don't backslash the C<@>.
+See http://www.plover.com/~mjd/perl/at-error.html for more details
+about the history here.
+
+=head2 @- and @+ provide starting/ending offsets of regex submatches
+
+The new magic variables @- and @+ provide the starting and ending
+offsets, respectively, of $&, $1, $2, etc. See L<perlvar> for
+details.
+
+=head1 Modules and Pragmata
+
+=head2 Modules
+
+=over 4
+
+=item attributes
+
+While used internally by Perl as a pragma, this module also
+provides a way to fetch subroutine and variable attributes.
+See L<attributes>.
+
+=item B
+
+The Perl Compiler suite has been extensively reworked for this
+release. More of the standard Perl test suite passes when run
+under the Compiler, but there is still a significant way to
+go to achieve production quality compiled executables.
+
+ NOTE: The Compiler suite remains highly experimental. The
+ generated code may not be correct, even when it manages to execute
+ without errors.
+
+=item Benchmark
+
+Overall, Benchmark results exhibit lower average error and better timing
+accuracy.
+
+You can now run tests for I<n> seconds instead of guessing the right
+number of tests to run: e.g., timethese(-5, ...) will run each
+code for at least 5 CPU seconds. Zero as the "number of repetitions"
+means "for at least 3 CPU seconds". The output format has also
+changed. For example:
+
+ use Benchmark;$x=3;timethese(-5,{a=>sub{$x*$x},b=>sub{$x**2}})
+
+will now output something like this:
+
+ Benchmark: running a, b, each for at least 5 CPU seconds...
+ a: 5 wallclock secs ( 5.77 usr + 0.00 sys = 5.77 CPU) @ 200551.91/s (n=1156516)
+ b: 4 wallclock secs ( 5.00 usr + 0.02 sys = 5.02 CPU) @ 159605.18/s (n=800686)
+
+New features: "each for at least N CPU seconds...", "wallclock secs",
+and the "@ operations/CPU second (n=operations)".
+
+timethese() now returns a reference to a hash of Benchmark objects containing
+the test results, keyed on the names of the tests.
+
+timethis() now returns the iterations field in the Benchmark result object
+instead of 0.
+
+timethese(), timethis(), and the new cmpthese() (see below) can also take
+a format specifier of 'none' to suppress output.
+
+A new function countit() is just like timeit() except that it takes a
+TIME instead of a COUNT.
+
+A new function cmpthese() prints a chart comparing the results of each test
+returned from a timethese() call. For each possible pair of tests, the
+percentage speed difference (iters/sec or seconds/iter) is shown.
+
+For other details, see L<Benchmark>.
+
+=item ByteLoader
+
+The ByteLoader is a dedicated extension to generate and run
+Perl bytecode. See L<ByteLoader>.
+
+=item constant
+
+References can now be used.
+
+The new version also allows a leading underscore in constant names, but
+disallows a double leading underscore (as in "__LINE__"). Some other names
+are disallowed or warned against, including BEGIN, END, etc. Some names
+which were forced into main:: used to fail silently in some cases; now they're
+fatal (outside of main::) and an optional warning (inside of main::).
+The ability to detect whether a constant had been set with a given name has
+been added.
+
+See L<constant>.
+
+=item charnames
+
+This pragma implements the C<\N> string escape. See L<charnames>.
+
+=item Data::Dumper
+
+A C<Maxdepth> setting can be specified to avoid venturing
+too deeply into deep data structures. See L<Data::Dumper>.
+
+The XSUB implementation of Dump() is now automatically called if the
+C<Useqq> setting is not in use.
+
+Dumping C<qr//> objects works correctly.
+
+=item DB
+
+C<DB> is an experimental module that exposes a clean abstraction
+to Perl's debugging API.
+
+=item DB_File
+
+DB_File can now be built with Berkeley DB versions 1, 2 or 3.
+See C<ext/DB_File/Changes>.
+
+=item Devel::DProf
+
+Devel::DProf, a Perl source code profiler has been added. See
+L<Devel::DProf> and L<dprofpp>.
+
+=item Devel::Peek
+
+The Devel::Peek module provides access to the internal representation
+of Perl variables and data. It is a data debugging tool for the XS programmer.
+
+=item Dumpvalue
+
+The Dumpvalue module provides screen dumps of Perl data.
+
+=item DynaLoader
+
+DynaLoader now supports a dl_unload_file() function on platforms that
+support unloading shared objects using dlclose().
+
+Perl can also optionally arrange to unload all extension shared objects
+loaded by Perl. To enable this, build Perl with the Configure option
+C<-Accflags=-DDL_UNLOAD_ALL_AT_EXIT>. (This maybe useful if you are
+using Apache with mod_perl.)
+
+=item English
+
+$PERL_VERSION now stands for C<$^V> (a string value) rather than for C<$]>
+(a numeric value).
+
+=item Env
+
+Env now supports accessing environment variables like PATH as array
+variables.
+
+=item Fcntl
+
+More Fcntl constants added: F_SETLK64, F_SETLKW64, O_LARGEFILE for
+large file (more than 4GB) access (NOTE: the O_LARGEFILE is
+automatically added to sysopen() flags if large file support has been
+configured, as is the default), Free/Net/OpenBSD locking behaviour
+flags F_FLOCK, F_POSIX, Linux F_SHLCK, and O_ACCMODE: the combined
+mask of O_RDONLY, O_WRONLY, and O_RDWR. The seek()/sysseek()
+constants SEEK_SET, SEEK_CUR, and SEEK_END are available via the
+C<:seek> tag. The chmod()/stat() S_IF* constants and S_IS* functions
+are available via the C<:mode> tag.
+
+=item File::Compare
+
+A compare_text() function has been added, which allows custom
+comparison functions. See L<File::Compare>.
+
+=item File::Find
+
+File::Find now works correctly when the wanted() function is either
+autoloaded or is a symbolic reference.
+
+A bug that caused File::Find to lose track of the working directory
+when pruning top-level directories has been fixed.
+
+File::Find now also supports several other options to control its
+behavior. It can follow symbolic links if the C<follow> option is
+specified. Enabling the C<no_chdir> option will make File::Find skip
+changing the current directory when walking directories. The C<untaint>
+flag can be useful when running with taint checks enabled.
+
+See L<File::Find>.
+
+=item File::Glob
+
+This extension implements BSD-style file globbing. By default,
+it will also be used for the internal implementation of the glob()
+operator. See L<File::Glob>.
+
+=item File::Spec
+
+New methods have been added to the File::Spec module: devnull() returns
+the name of the null device (/dev/null on Unix) and tmpdir() the name of
+the temp directory (normally /tmp on Unix). There are now also methods
+to convert between absolute and relative filenames: abs2rel() and
+rel2abs(). For compatibility with operating systems that specify volume
+names in file paths, the splitpath(), splitdir(), and catdir() methods
+have been added.
+
+=item File::Spec::Functions
+
+The new File::Spec::Functions modules provides a function interface
+to the File::Spec module. Allows shorthand
+
+ $fullname = catfile($dir1, $dir2, $file);
+
+instead of
+
+ $fullname = File::Spec->catfile($dir1, $dir2, $file);
+
+=item Getopt::Long
+
+Getopt::Long licensing has changed to allow the Perl Artistic License
+as well as the GPL. It used to be GPL only, which got in the way of
+non-GPL applications that wanted to use Getopt::Long.
+
+Getopt::Long encourages the use of Pod::Usage to produce help
+messages. For example:
+
+ use Getopt::Long;
+ use Pod::Usage;
+ my $man = 0;
+ my $help = 0;
+ GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
+ pod2usage(1) if $help;
+ pod2usage(-exitstatus => 0, -verbose => 2) if $man;
+
+ __END__
+
+ =head1 NAME
+
+ sample - Using Getopt::Long and Pod::Usage
+
+ =head1 SYNOPSIS
+
+ sample [options] [file ...]
+
+ Options:
+ -help brief help message
+ -man full documentation
+
+ =head1 OPTIONS
+
+ =over 8
+
+ =item B<-help>
+
+ Print a brief help message and exits.
+
+ =item B<-man>
+
+ Prints the manual page and exits.
+
+ =back
+
+ =head1 DESCRIPTION
+
+ B<This program> will read the given input file(s) and do something
+ useful with the contents thereof.
+
+ =cut
+
+See L<Pod::Usage> for details.
+
+A bug that prevented the non-option call-back <> from being
+specified as the first argument has been fixed.
+
+To specify the characters < and > as option starters, use ><. Note,
+however, that changing option starters is strongly deprecated.
+
+=item IO
+
+write() and syswrite() will now accept a single-argument
+form of the call, for consistency with Perl's syswrite().
+
+You can now create a TCP-based IO::Socket::INET without forcing
+a connect attempt. This allows you to configure its options
+(like making it non-blocking) and then call connect() manually.
+
+A bug that prevented the IO::Socket::protocol() accessor
+from ever returning the correct value has been corrected.
+
+IO::Socket::connect now uses non-blocking IO instead of alarm()
+to do connect timeouts.
+
+IO::Socket::accept now uses select() instead of alarm() for doing
+timeouts.
+
+IO::Socket::INET->new now sets $! correctly on failure. $@ is
+still set for backwards compatibility.
+
+=item JPL
+
+Java Perl Lingo is now distributed with Perl. See jpl/README
+for more information.
+
+=item lib
+
+C<use lib> now weeds out any trailing duplicate entries.
+C<no lib> removes all named entries.
+
+=item Math::BigInt
+
+The bitwise operations C<<< << >>>, C<<< >> >>>, C<&>, C<|>,
+and C<~> are now supported on bigints.
+
+=item Math::Complex
+
+The accessor methods Re, Im, arg, abs, rho, and theta can now also
+act as mutators (accessor $z->Re(), mutator $z->Re(3)).
+
+The class method C<display_format> and the corresponding object method
+C<display_format>, in addition to accepting just one argument, now can
+also accept a parameter hash. Recognized keys of a parameter hash are
+C<"style">, which corresponds to the old one parameter case, and two
+new parameters: C<"format">, which is a printf()-style format string
+(defaults usually to C<"%.15g">, you can revert to the default by
+setting the format string to C<undef>) used for both parts of a
+complex number, and C<"polar_pretty_print"> (defaults to true),
+which controls whether an attempt is made to try to recognize small
+multiples and rationals of pi (2pi, pi/2) at the argument (angle) of a
+polar complex number.
+
+The potentially disruptive change is that in list context both methods
+now I<return the parameter hash>, instead of only the value of the
+C<"style"> parameter.
+
+=item Math::Trig
+
+A little bit of radial trigonometry (cylindrical and spherical),
+radial coordinate conversions, and the great circle distance were added.
+
+=item Pod::Parser, Pod::InputObjects
+
+Pod::Parser is a base class for parsing and selecting sections of
+pod documentation from an input stream. This module takes care of
+identifying pod paragraphs and commands in the input and hands off the
+parsed paragraphs and commands to user-defined methods which are free
+to interpret or translate them as they see fit.
+
+Pod::InputObjects defines some input objects needed by Pod::Parser, and
+for advanced users of Pod::Parser that need more about a command besides
+its name and text.
+
+As of release 5.6.0 of Perl, Pod::Parser is now the officially sanctioned
+"base parser code" recommended for use by all pod2xxx translators.
+Pod::Text (pod2text) and Pod::Man (pod2man) have already been converted
+to use Pod::Parser and efforts to convert Pod::HTML (pod2html) are already
+underway. For any questions or comments about pod parsing and translating
+issues and utilities, please use the pod-people@perl.org mailing list.
+
+For further information, please see L<Pod::Parser> and L<Pod::InputObjects>.
+
+=item Pod::Checker, podchecker
+
+This utility checks pod files for correct syntax, according to
+L<perlpod>. Obvious errors are flagged as such, while warnings are
+printed for mistakes that can be handled gracefully. The checklist is
+not complete yet. See L<Pod::Checker>.
+
+=item Pod::ParseUtils, Pod::Find
+
+These modules provide a set of gizmos that are useful mainly for pod
+translators. L<Pod::Find|Pod::Find> traverses directory structures and
+returns found pod files, along with their canonical names (like
+C<File::Spec::Unix>). L<Pod::ParseUtils|Pod::ParseUtils> contains
+B<Pod::List> (useful for storing pod list information), B<Pod::Hyperlink>
+(for parsing the contents of C<LE<lt>E<gt>> sequences) and B<Pod::Cache>
+(for caching information about pod files, e.g., link nodes).
+
+=item Pod::Select, podselect
+
+Pod::Select is a subclass of Pod::Parser which provides a function
+named "podselect()" to filter out user-specified sections of raw pod
+documentation from an input stream. podselect is a script that provides
+access to Pod::Select from other scripts to be used as a filter.
+See L<Pod::Select>.
+
+=item Pod::Usage, pod2usage
+
+Pod::Usage provides the function "pod2usage()" to print usage messages for
+a Perl script based on its embedded pod documentation. The pod2usage()
+function is generally useful to all script authors since it lets them
+write and maintain a single source (the pods) for documentation, thus
+removing the need to create and maintain redundant usage message text
+consisting of information already in the pods.
+
+There is also a pod2usage script which can be used from other kinds of
+scripts to print usage messages from pods (even for non-Perl scripts
+with pods embedded in comments).
+
+For details and examples, please see L<Pod::Usage>.
+
+=item Pod::Text and Pod::Man
+
+Pod::Text has been rewritten to use Pod::Parser. While pod2text() is
+still available for backwards compatibility, the module now has a new
+preferred interface. See L<Pod::Text> for the details. The new Pod::Text
+module is easily subclassed for tweaks to the output, and two such
+subclasses (Pod::Text::Termcap for man-page-style bold and underlining
+using termcap information, and Pod::Text::Color for markup with ANSI color
+sequences) are now standard.
+
+pod2man has been turned into a module, Pod::Man, which also uses
+Pod::Parser. In the process, several outstanding bugs related to quotes
+in section headers, quoting of code escapes, and nested lists have been
+fixed. pod2man is now a wrapper script around this module.
+
+=item SDBM_File
+
+An EXISTS method has been added to this module (and sdbm_exists() has
+been added to the underlying sdbm library), so one can now call exists
+on an SDBM_File tied hash and get the correct result, rather than a
+runtime error.
+
+A bug that may have caused data loss when more than one disk block
+happens to be read from the database in a single FETCH() has been
+fixed.
+
+=item Sys::Syslog
+
+Sys::Syslog now uses XSUBs to access facilities from syslog.h so it
+no longer requires syslog.ph to exist.
+
+=item Sys::Hostname
+
+Sys::Hostname now uses XSUBs to call the C library's gethostname() or
+uname() if they exist.
+
+=item Term::ANSIColor
+
+Term::ANSIColor is a very simple module to provide easy and readable
+access to the ANSI color and highlighting escape sequences, supported by
+most ANSI terminal emulators. It is now included standard.
+
+=item Time::Local
+
+The timelocal() and timegm() functions used to silently return bogus
+results when the date fell outside the machine's integer range. They
+now consistently croak() if the date falls in an unsupported range.
+
+=item Win32
+
+The error return value in list context has been changed for all functions
+that return a list of values. Previously these functions returned a list
+with a single element C<undef> if an error occurred. Now these functions
+return the empty list in these situations. This applies to the following
+functions:
+
+ Win32::FsType
+ Win32::GetOSVersion
+
+The remaining functions are unchanged and continue to return C<undef> on
+error even in list context.
+
+The Win32::SetLastError(ERROR) function has been added as a complement
+to the Win32::GetLastError() function.
+
+The new Win32::GetFullPathName(FILENAME) returns the full absolute
+pathname for FILENAME in scalar context. In list context it returns
+a two-element list containing the fully qualified directory name and
+the filename. See L<Win32>.
+
+=item XSLoader
+
+The XSLoader extension is a simpler alternative to DynaLoader.
+See L<XSLoader>.
+
+=item DBM Filters
+
+A new feature called "DBM Filters" has been added to all the
+DBM modules--DB_File, GDBM_File, NDBM_File, ODBM_File, and SDBM_File.
+DBM Filters add four new methods to each DBM module:
+
+ filter_store_key
+ filter_store_value
+ filter_fetch_key
+ filter_fetch_value
+
+These can be used to filter key-value pairs before the pairs are
+written to the database or just after they are read from the database.
+See L<perldbmfilter> for further information.
+
+=back
+
+=head2 Pragmata
+
+C<use attrs> is now obsolete, and is only provided for
+backward-compatibility. It's been replaced by the C<sub : attributes>
+syntax. See L<perlsub/"Subroutine Attributes"> and L<attributes>.
+
+Lexical warnings pragma, C<use warnings;>, to control optional warnings.
+See L<perllexwarn>.
+
+C<use filetest> to control the behaviour of filetests (C<-r> C<-w>
+...). Currently only one subpragma implemented, "use filetest
+'access';", that uses access(2) or equivalent to check permissions
+instead of using stat(2) as usual. This matters in filesystems
+where there are ACLs (access control lists): the stat(2) might lie,
+but access(2) knows better.
+
+The C<open> pragma can be used to specify default disciplines for
+handle constructors (e.g. open()) and for qx//. The two
+pseudo-disciplines C<:raw> and C<:crlf> are currently supported on
+DOS-derivative platforms (i.e. where binmode is not a no-op).
+See also L</"binmode() can be used to set :crlf and :raw modes">.
+
+=head1 Utility Changes
+
+=head2 dprofpp
+
+C<dprofpp> is used to display profile data generated using C<Devel::DProf>.
+See L<dprofpp>.
+
+=head2 find2perl
+
+The C<find2perl> utility now uses the enhanced features of the File::Find
+module. The -depth and -follow options are supported. Pod documentation
+is also included in the script.
+
+=head2 h2xs
+
+The C<h2xs> tool can now work in conjunction with C<C::Scan> (available
+from CPAN) to automatically parse real-life header files. The C<-M>,
+C<-a>, C<-k>, and C<-o> options are new.
+
+=head2 perlcc
+
+C<perlcc> now supports the C and Bytecode backends. By default,
+it generates output from the simple C backend rather than the
+optimized C backend.
+
+Support for non-Unix platforms has been improved.
+
+=head2 perldoc
+
+C<perldoc> has been reworked to avoid possible security holes.
+It will not by default let itself be run as the superuser, but you
+may still use the B<-U> switch to try to make it drop privileges
+first.
+
+=head2 The Perl Debugger
+
+Many bug fixes and enhancements were added to F<perl5db.pl>, the
+Perl debugger. The help documentation was rearranged. New commands
+include C<< < ? >>, C<< > ? >>, and C<< { ? >> to list out current
+actions, C<man I<docpage>> to run your doc viewer on some perl
+docset, and support for quoted options. The help information was
+rearranged, and should be viewable once again if you're using B<less>
+as your pager. A serious security hole was plugged--you should
+immediately remove all older versions of the Perl debugger as
+installed in previous releases, all the way back to perl3, from
+your system to avoid being bitten by this.
+
+=head1 Improved Documentation
+
+Many of the platform-specific README files are now part of the perl
+installation. See L<perl> for the complete list.
+
+=over 4
+
+=item perlapi.pod
+
+The official list of public Perl API functions.
+
+=item perlboot.pod
+
+A tutorial for beginners on object-oriented Perl.
+
+=item perlcompile.pod
+
+An introduction to using the Perl Compiler suite.
+
+=item perldbmfilter.pod
+
+A howto document on using the DBM filter facility.
+
+=item perldebug.pod
+
+All material unrelated to running the Perl debugger, plus all
+low-level guts-like details that risked crushing the casual user
+of the debugger, have been relocated from the old manpage to the
+next entry below.
+
+=item perldebguts.pod
+
+This new manpage contains excessively low-level material not related
+to the Perl debugger, but slightly related to debugging Perl itself.
+It also contains some arcane internal details of how the debugging
+process works that may only be of interest to developers of Perl
+debuggers.
+
+=item perlfork.pod
+
+Notes on the fork() emulation currently available for the Windows platform.
+
+=item perlfilter.pod
+
+An introduction to writing Perl source filters.
+
+=item perlhack.pod
+
+Some guidelines for hacking the Perl source code.
+
+=item perlintern.pod
+
+A list of internal functions in the Perl source code.
+(List is currently empty.)
+
+=item perllexwarn.pod
+
+Introduction and reference information about lexically scoped
+warning categories.
+
+=item perlnumber.pod
+
+Detailed information about numbers as they are represented in Perl.
+
+=item perlopentut.pod
+
+A tutorial on using open() effectively.
+
+=item perlreftut.pod
+
+A tutorial that introduces the essentials of references.
+
+=item perltootc.pod
+
+A tutorial on managing class data for object modules.
+
+=item perltodo.pod
+
+Discussion of the most often wanted features that may someday be
+supported in Perl.
+
+=item perlunicode.pod
+
+An introduction to Unicode support features in Perl.
+
+=back
+
+=head1 Performance enhancements
+
+=head2 Simple sort() using { $a <=> $b } and the like are optimized
+
+Many common sort() operations using a simple inlined block are now
+optimized for faster performance.
+
+=head2 Optimized assignments to lexical variables
+
+Certain operations in the RHS of assignment statements have been
+optimized to directly set the lexical variable on the LHS,
+eliminating redundant copying overheads.
+
+=head2 Faster subroutine calls
+
+Minor changes in how subroutine calls are handled internally
+provide marginal improvements in performance.
+
+=head2 delete(), each(), values() and hash iteration are faster
+
+The hash values returned by delete(), each(), values() and hashes in a
+list context are the actual values in the hash, instead of copies.
+This results in significantly better performance, because it eliminates
+needless copying in most situations.
+
+=head1 Installation and Configuration Improvements
+
+=head2 -Dusethreads means something different
+
+The -Dusethreads flag now enables the experimental interpreter-based thread
+support by default. To get the flavor of experimental threads that was in
+5.005 instead, you need to run Configure with "-Dusethreads -Duse5005threads".
+
+As of v5.6.0, interpreter-threads support is still lacking a way to
+create new threads from Perl (i.e., C<use Thread;> will not work with
+interpreter threads). C<use Thread;> continues to be available when you
+specify the -Duse5005threads option to Configure, bugs and all.
+
+ NOTE: Support for threads continues to be an experimental feature.
+ Interfaces and implementation are subject to sudden and drastic changes.
+
+=head2 New Configure flags
+
+The following new flags may be enabled on the Configure command line
+by running Configure with C<-Dflag>.
+
+ usemultiplicity
+ usethreads useithreads (new interpreter threads: no Perl API yet)
+ usethreads use5005threads (threads as they were in 5.005)
+
+ use64bitint (equal to now deprecated 'use64bits')
+ use64bitall
+
+ uselongdouble
+ usemorebits
+ uselargefiles
+ usesocks (only SOCKS v5 supported)
+
+=head2 Threadedness and 64-bitness now more daring
+
+The Configure options enabling the use of threads and the use of
+64-bitness are now more daring in the sense that they no more have an
+explicit list of operating systems of known threads/64-bit
+capabilities. In other words: if your operating system has the
+necessary APIs and datatypes, you should be able just to go ahead and
+use them, for threads by Configure -Dusethreads, and for 64 bits
+either explicitly by Configure -Duse64bitint or implicitly if your
+system has 64-bit wide datatypes. See also L<"64-bit support">.
+
+=head2 Long Doubles
+
+Some platforms have "long doubles", floating point numbers of even
+larger range than ordinary "doubles". To enable using long doubles for
+Perl's scalars, use -Duselongdouble.
+
+=head2 -Dusemorebits
+
+You can enable both -Duse64bitint and -Duselongdouble with -Dusemorebits.
+See also L<"64-bit support">.
+
+=head2 -Duselargefiles
+
+Some platforms support system APIs that are capable of handling large files
+(typically, files larger than two gigabytes). Perl will try to use these
+APIs if you ask for -Duselargefiles.
+
+See L<"Large file support"> for more information.
+
+=head2 installusrbinperl
+
+You can use "Configure -Uinstallusrbinperl" which causes installperl
+to skip installing perl also as /usr/bin/perl. This is useful if you
+prefer not to modify /usr/bin for some reason or another but harmful
+because many scripts assume to find Perl in /usr/bin/perl.
+
+=head2 SOCKS support
+
+You can use "Configure -Dusesocks" which causes Perl to probe
+for the SOCKS proxy protocol library (v5, not v4). For more information
+on SOCKS, see:
+
+ http://www.socks.nec.com/
+
+=head2 C<-A> flag
+
+You can "post-edit" the Configure variables using the Configure C<-A>
+switch. The editing happens immediately after the platform specific
+hints files have been processed but before the actual configuration
+process starts. Run C<Configure -h> to find out the full C<-A> syntax.
+
+=head2 Enhanced Installation Directories
+
+The installation structure has been enriched to improve the support
+for maintaining multiple versions of perl, to provide locations for
+vendor-supplied modules, scripts, and manpages, and to ease maintenance
+of locally-added modules, scripts, and manpages. See the section on
+Installation Directories in the INSTALL file for complete details.
+For most users building and installing from source, the defaults should
+be fine.
+
+If you previously used C<Configure -Dsitelib> or C<-Dsitearch> to set
+special values for library directories, you might wish to consider using
+the new C<-Dsiteprefix> setting instead. Also, if you wish to re-use a
+config.sh file from an earlier version of perl, you should be sure to
+check that Configure makes sensible choices for the new directories.
+See INSTALL for complete details.
+
+=head2 gcc automatically tried if 'cc' does not seem to be working
+
+In many platforms the vendor-supplied 'cc' is too stripped-down to
+build Perl (basically, the 'cc' doesn't do ANSI C). If this seems
+to be the case and the 'cc' does not seem to be the GNU C compiler
+'gcc', an automatic attempt is made to find and use 'gcc' instead.
+
+=head1 Platform specific changes
+
+=head2 Supported platforms
+
+=over 4
+
+=item *
+
+The Mach CThreads (NEXTSTEP, OPENSTEP) are now supported by the Thread
+extension.
+
+=item *
+
+GNU/Hurd is now supported.
+
+=item *
+
+Rhapsody/Darwin is now supported.
+
+=item *
+
+EPOC is now supported (on Psion 5).
+
+=item *
+
+The cygwin port (formerly cygwin32) has been greatly improved.
+
+=back
+
+=head2 DOS
+
+=over 4
+
+=item *
+
+Perl now works with djgpp 2.02 (and 2.03 alpha).
+
+=item *
+
+Environment variable names are not converted to uppercase any more.
+
+=item *
+
+Incorrect exit codes from backticks have been fixed.
+
+=item *
+
+This port continues to use its own builtin globbing (not File::Glob).
+
+=back
+
+=head2 OS390 (OpenEdition MVS)
+
+Support for this EBCDIC platform has not been renewed in this release.
+There are difficulties in reconciling Perl's standardization on UTF-8
+as its internal representation for characters with the EBCDIC character
+set, because the two are incompatible.
+
+It is unclear whether future versions will renew support for this
+platform, but the possibility exists.
+
+=head2 VMS
+
+Numerous revisions and extensions to configuration, build, testing, and
+installation process to accommodate core changes and VMS-specific options.
+
+Expand %ENV-handling code to allow runtime mapping to logical names,
+CLI symbols, and CRTL environ array.
+
+Extension of subprocess invocation code to accept filespecs as command
+"verbs".
+
+Add to Perl command line processing the ability to use default file types and
+to recognize Unix-style C<2E<gt>&1>.
+
+Expansion of File::Spec::VMS routines, and integration into ExtUtils::MM_VMS.
+
+Extension of ExtUtils::MM_VMS to handle complex extensions more flexibly.
+
+Barewords at start of Unix-syntax paths may be treated as text rather than
+only as logical names.
+
+Optional secure translation of several logical names used internally by Perl.
+
+Miscellaneous bugfixing and porting of new core code to VMS.
+
+Thanks are gladly extended to the many people who have contributed VMS
+patches, testing, and ideas.
+
+=head2 Win32
+
+Perl can now emulate fork() internally, using multiple interpreters running
+in different concurrent threads. This support must be enabled at build
+time. See L<perlfork> for detailed information.
+
+When given a pathname that consists only of a drivename, such as C<A:>,
+opendir() and stat() now use the current working directory for the drive
+rather than the drive root.
+
+The builtin XSUB functions in the Win32:: namespace are documented. See
+L<Win32>.
+
+$^X now contains the full path name of the running executable.
+
+A Win32::GetLongPathName() function is provided to complement
+Win32::GetFullPathName() and Win32::GetShortPathName(). See L<Win32>.
+
+POSIX::uname() is supported.
+
+system(1,...) now returns true process IDs rather than process
+handles. kill() accepts any real process id, rather than strictly
+return values from system(1,...).
+
+For better compatibility with Unix, C<kill(0, $pid)> can now be used to
+test whether a process exists.
+
+The C<Shell> module is supported.
+
+Better support for building Perl under command.com in Windows 95
+has been added.
+
+Scripts are read in binary mode by default to allow ByteLoader (and
+the filter mechanism in general) to work properly. For compatibility,
+the DATA filehandle will be set to text mode if a carriage return is
+detected at the end of the line containing the __END__ or __DATA__
+token; if not, the DATA filehandle will be left open in binary mode.
+Earlier versions always opened the DATA filehandle in text mode.
+
+The glob() operator is implemented via the C<File::Glob> extension,
+which supports glob syntax of the C shell. This increases the flexibility
+of the glob() operator, but there may be compatibility issues for
+programs that relied on the older globbing syntax. If you want to
+preserve compatibility with the older syntax, you might want to run
+perl with C<-MFile::DosGlob>. For details and compatibility information,
+see L<File::Glob>.
+
+=head1 Significant bug fixes
+
+=head2 <HANDLE> on empty files
+
+With C<$/> set to C<undef>, "slurping" an empty file returns a string of
+zero length (instead of C<undef>, as it used to) the first time the
+HANDLE is read after C<$/> is set to C<undef>. Further reads yield
+C<undef>.
+
+This means that the following will append "foo" to an empty file (it used
+to do nothing):
+
+ perl -0777 -pi -e 's/^/foo/' empty_file
+
+The behaviour of:
+
+ perl -pi -e 's/^/foo/' empty_file
+
+is unchanged (it continues to leave the file empty).
+
+=head2 C<eval '...'> improvements
+
+Line numbers (as reflected by caller() and most diagnostics) within
+C<eval '...'> were often incorrect where here documents were involved.
+This has been corrected.
+
+Lexical lookups for variables appearing in C<eval '...'> within
+functions that were themselves called within an C<eval '...'> were
+searching the wrong place for lexicals. The lexical search now
+correctly ends at the subroutine's block boundary.
+
+The use of C<return> within C<eval {...}> caused $@ not to be reset
+correctly when no exception occurred within the eval. This has
+been fixed.
+
+Parsing of here documents used to be flawed when they appeared as
+the replacement expression in C<eval 's/.../.../e'>. This has
+been fixed.
+
+=head2 All compilation errors are true errors
+
+Some "errors" encountered at compile time were by necessity
+generated as warnings followed by eventual termination of the
+program. This enabled more such errors to be reported in a
+single run, rather than causing a hard stop at the first error
+that was encountered.
+
+The mechanism for reporting such errors has been reimplemented
+to queue compile-time errors and report them at the end of the
+compilation as true errors rather than as warnings. This fixes
+cases where error messages leaked through in the form of warnings
+when code was compiled at run time using C<eval STRING>, and
+also allows such errors to be reliably trapped using C<eval "...">.
+
+=head2 Implicitly closed filehandles are safer
+
+Sometimes implicitly closed filehandles (as when they are localized,
+and Perl automatically closes them on exiting the scope) could
+inadvertently set $? or $!. This has been corrected.
+
+
+=head2 Behavior of list slices is more consistent
+
+When taking a slice of a literal list (as opposed to a slice of
+an array or hash), Perl used to return an empty list if the
+result happened to be composed of all undef values.
+
+The new behavior is to produce an empty list if (and only if)
+the original list was empty. Consider the following example:
+
+ @a = (1,undef,undef,2)[2,1,2];
+
+The old behavior would have resulted in @a having no elements.
+The new behavior ensures it has three undefined elements.
+
+Note in particular that the behavior of slices of the following
+cases remains unchanged:
+
+ @a = ()[1,2];
+ @a = (getpwent)[7,0];
+ @a = (anything_returning_empty_list())[2,1,2];
+ @a = @b[2,1,2];
+ @a = @c{'a','b','c'};
+
+See L<perldata>.
+
+=head2 C<(\$)> prototype and C<$foo{a}>
+
+A scalar reference prototype now correctly allows a hash or
+array element in that slot.
+
+=head2 C<goto &sub> and AUTOLOAD
+
+The C<goto &sub> construct works correctly when C<&sub> happens
+to be autoloaded.
+
+=head2 C<-bareword> allowed under C<use integer>
+
+The autoquoting of barewords preceded by C<-> did not work
+in prior versions when the C<integer> pragma was enabled.
+This has been fixed.
+
+=head2 Failures in DESTROY()
+
+When code in a destructor threw an exception, it went unnoticed
+in earlier versions of Perl, unless someone happened to be
+looking in $@ just after the point the destructor happened to
+run. Such failures are now visible as warnings when warnings are
+enabled.
+
+=head2 Locale bugs fixed
+
+printf() and sprintf() previously reset the numeric locale
+back to the default "C" locale. This has been fixed.
+
+Numbers formatted according to the local numeric locale
+(such as using a decimal comma instead of a decimal dot) caused
+"isn't numeric" warnings, even while the operations accessing
+those numbers produced correct results. These warnings have been
+discontinued.
+
+=head2 Memory leaks
+
+The C<eval 'return sub {...}'> construct could sometimes leak
+memory. This has been fixed.
+
+Operations that aren't filehandle constructors used to leak memory
+when used on invalid filehandles. This has been fixed.
+
+Constructs that modified C<@_> could fail to deallocate values
+in C<@_> and thus leak memory. This has been corrected.
+
+=head2 Spurious subroutine stubs after failed subroutine calls
+
+Perl could sometimes create empty subroutine stubs when a
+subroutine was not found in the package. Such cases stopped
+later method lookups from progressing into base packages.
+This has been corrected.
+
+=head2 Taint failures under C<-U>
+
+When running in unsafe mode, taint violations could sometimes
+cause silent failures. This has been fixed.
+
+=head2 END blocks and the C<-c> switch
+
+Prior versions used to run BEGIN B<and> END blocks when Perl was
+run in compile-only mode. Since this is typically not the expected
+behavior, END blocks are not executed anymore when the C<-c> switch
+is used, or if compilation fails.
+
+See L</"Support for CHECK blocks"> for how to run things when the compile
+phase ends.
+
+=head2 Potential to leak DATA filehandles
+
+Using the C<__DATA__> token creates an implicit filehandle to
+the file that contains the token. It is the program's
+responsibility to close it when it is done reading from it.
+
+This caveat is now better explained in the documentation.
+See L<perldata>.
+
+=head1 New or Changed Diagnostics
+
+=over 4
+
+=item "%s" variable %s masks earlier declaration in same %s
+
+(W misc) A "my" or "our" variable has been redeclared in the current scope or statement,
+effectively eliminating all access to the previous instance. This is almost
+always a typographical error. Note that the earlier variable will still exist
+until the end of the scope or until all closure referents to it are
+destroyed.
+
+=item "my sub" not yet implemented
+
+(F) Lexically scoped subroutines are not yet implemented. Don't try that
+yet.
+
+=item "our" variable %s redeclared
+
+(W misc) You seem to have already declared the same global once before in the
+current lexical scope.
+
+=item '!' allowed only after types %s
+
+(F) The '!' is allowed in pack() and unpack() only after certain types.
+See L<perlfunc/pack>.
+
+=item / cannot take a count
+
+(F) You had an unpack template indicating a counted-length string,
+but you have also specified an explicit size for the string.
+See L<perlfunc/pack>.
+
+=item / must be followed by a, A or Z
+
+(F) You had an unpack template indicating a counted-length string,
+which must be followed by one of the letters a, A or Z
+to indicate what sort of string is to be unpacked.
+See L<perlfunc/pack>.
+
+=item / must be followed by a*, A* or Z*
+
+(F) You had a pack template indicating a counted-length string,
+Currently the only things that can have their length counted are a*, A* or Z*.
+See L<perlfunc/pack>.
+
+=item / must follow a numeric type
+
+(F) You had an unpack template that contained a '#',
+but this did not follow some numeric unpack specification.
+See L<perlfunc/pack>.
+
+=item /%s/: Unrecognized escape \\%c passed through
+
+(W regexp) You used a backslash-character combination which is not recognized
+by Perl. This combination appears in an interpolated variable or a
+C<'>-delimited regular expression. The character was understood literally.
+
+=item /%s/: Unrecognized escape \\%c in character class passed through
+
+(W regexp) You used a backslash-character combination which is not recognized
+by Perl inside character classes. The character was understood literally.
+
+=item /%s/ should probably be written as "%s"
+
+(W syntax) You have used a pattern where Perl expected to find a string,
+as in the first argument to C<join>. Perl will treat the true
+or false result of matching the pattern against $_ as the string,
+which is probably not what you had in mind.
+
+=item %s() called too early to check prototype
+
+(W prototype) You've called a function that has a prototype before the parser saw a
+definition or declaration for it, and Perl could not check that the call
+conforms to the prototype. You need to either add an early prototype
+declaration for the subroutine in question, or move the subroutine
+definition ahead of the call to get proper prototype checking. Alternatively,
+if you are certain that you're calling the function correctly, you may put
+an ampersand before the name to avoid the warning. See L<perlsub>.
+
+=item %s argument is not a HASH or ARRAY element
+
+(F) The argument to exists() must be a hash or array element, such as:
+
+ $foo{$bar}
+ $ref->{"susie"}[12]
+
+=item %s argument is not a HASH or ARRAY element or slice
+
+(F) The argument to delete() must be either a hash or array element, such as:
+
+ $foo{$bar}
+ $ref->{"susie"}[12]
+
+or a hash or array slice, such as:
+
+ @foo[$bar, $baz, $xyzzy]
+ @{$ref->[12]}{"susie", "queue"}
+
+=item %s argument is not a subroutine name
+
+(F) The argument to exists() for C<exists &sub> must be a subroutine
+name, and not a subroutine call. C<exists &sub()> will generate this error.
+
+=item %s package attribute may clash with future reserved word: %s
+
+(W reserved) A lowercase attribute name was used that had a package-specific handler.
+That name might have a meaning to Perl itself some day, even though it
+doesn't yet. Perhaps you should use a mixed-case attribute name, instead.
+See L<attributes>.
+
+=item (in cleanup) %s
+
+(W misc) This prefix usually indicates that a DESTROY() method raised
+the indicated exception. Since destructors are usually called by
+the system at arbitrary points during execution, and often a vast
+number of times, the warning is issued only once for any number
+of failures that would otherwise result in the same message being
+repeated.
+
+Failure of user callbacks dispatched using the C<G_KEEPERR> flag
+could also result in this warning. See L<perlcall/G_KEEPERR>.
+
+=item <> should be quotes
+
+(F) You wrote C<< require <file> >> when you should have written
+C<require 'file'>.
+
+=item Attempt to join self
+
+(F) You tried to join a thread from within itself, which is an
+impossible task. You may be joining the wrong thread, or you may
+need to move the join() to some other thread.
+
+=item Bad evalled substitution pattern
+
+(F) You've used the /e switch to evaluate the replacement for a
+substitution, but perl found a syntax error in the code to evaluate,
+most likely an unexpected right brace '}'.
+
+=item Bad realloc() ignored
+
+(S) An internal routine called realloc() on something that had never been
+malloc()ed in the first place. Mandatory, but can be disabled by
+setting environment variable C<PERL_BADFREE> to 1.
+
+=item Bareword found in conditional
+
+(W bareword) The compiler found a bareword where it expected a conditional,
+which often indicates that an || or && was parsed as part of the
+last argument of the previous construct, for example:
+
+ open FOO || die;
+
+It may also indicate a misspelled constant that has been interpreted
+as a bareword:
+
+ use constant TYPO => 1;
+ if (TYOP) { print "foo" }
+
+The C<strict> pragma is useful in avoiding such errors.
+
+=item Binary number > 0b11111111111111111111111111111111 non-portable
+
+(W portable) The binary number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems. See
+L<perlport> for more on portability concerns.
+
+=item Bit vector size > 32 non-portable
+
+(W portable) Using bit vector sizes larger than 32 is non-portable.
+
+=item Buffer overflow in prime_env_iter: %s
+
+(W internal) A warning peculiar to VMS. While Perl was preparing to iterate over
+%ENV, it encountered a logical name or symbol definition which was too long,
+so it was truncated to the string shown.
+
+=item Can't check filesystem of script "%s"
+
+(P) For some reason you can't check the filesystem of the script for nosuid.
+
+=item Can't declare class for non-scalar %s in "%s"
+
+(S) Currently, only scalar variables can declared with a specific class
+qualifier in a "my" or "our" declaration. The semantics may be extended
+for other types of variables in future.
+
+=item Can't declare %s in "%s"
+
+(F) Only scalar, array, and hash variables may be declared as "my" or
+"our" variables. They must have ordinary identifiers as names.
+
+=item Can't ignore signal CHLD, forcing to default
+
+(W signal) Perl has detected that it is being run with the SIGCHLD signal
+(sometimes known as SIGCLD) disabled. Since disabling this signal
+will interfere with proper determination of exit status of child
+processes, Perl has reset the signal to its default value.
+This situation typically indicates that the parent program under
+which Perl may be running (e.g., cron) is being very careless.
+
+=item Can't modify non-lvalue subroutine call
+
+(F) Subroutines meant to be used in lvalue context should be declared as
+such, see L<perlsub/"Lvalue subroutines">.
+
+=item Can't read CRTL environ
+
+(S) A warning peculiar to VMS. Perl tried to read an element of %ENV
+from the CRTL's internal environment array and discovered the array was
+missing. You need to figure out where your CRTL misplaced its environ
+or define F<PERL_ENV_TABLES> (see L<perlvms>) so that environ is not searched.
+
+=item Can't remove %s: %s, skipping file
+
+(S) You requested an inplace edit without creating a backup file. Perl
+was unable to remove the original file to replace it with the modified
+file. The file was left unmodified.
+
+=item Can't return %s from lvalue subroutine
+
+(F) Perl detected an attempt to return illegal lvalues (such
+as temporary or readonly values) from a subroutine used as an lvalue.
+This is not allowed.
+
+=item Can't weaken a nonreference
+
+(F) You attempted to weaken something that was not a reference. Only
+references can be weakened.
+
+=item Character class [:%s:] unknown
+
+(F) The class in the character class [: :] syntax is unknown.
+See L<perlre>.
+
+=item Character class syntax [%s] belongs inside character classes
+
+(W unsafe) The character class constructs [: :], [= =], and [. .] go
+I<inside> character classes, the [] are part of the construct,
+for example: /[012[:alpha:]345]/. Note that [= =] and [. .]
+are not currently implemented; they are simply placeholders for
+future extensions.
+
+=item Constant is not %s reference
+
+(F) A constant value (perhaps declared using the C<use constant> pragma)
+is being dereferenced, but it amounts to the wrong type of reference. The
+message indicates the type of reference that was expected. This usually
+indicates a syntax error in dereferencing the constant value.
+See L<perlsub/"Constant Functions"> and L<constant>.
+
+=item constant(%s): %s
+
+(F) The parser found inconsistencies either while attempting to define an
+overloaded constant, or when trying to find the character name specified
+in the C<\N{...}> escape. Perhaps you forgot to load the corresponding
+C<overload> or C<charnames> pragma? See L<charnames> and L<overload>.
+
+=item CORE::%s is not a keyword
+
+(F) The CORE:: namespace is reserved for Perl keywords.
+
+=item defined(@array) is deprecated
+
+(D) defined() is not usually useful on arrays because it checks for an
+undefined I<scalar> value. If you want to see if the array is empty,
+just use C<if (@array) { # not empty }> for example.
+
+=item defined(%hash) is deprecated
+
+(D) defined() is not usually useful on hashes because it checks for an
+undefined I<scalar> value. If you want to see if the hash is empty,
+just use C<if (%hash) { # not empty }> for example.
+
+=item Did not produce a valid header
+
+See Server error.
+
+=item (Did you mean "local" instead of "our"?)
+
+(W misc) Remember that "our" does not localize the declared global variable.
+You have declared it again in the same lexical scope, which seems superfluous.
+
+=item Document contains no data
+
+See Server error.
+
+=item entering effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item false [] range "%s" in regexp
+
+(W regexp) A character class range must start and end at a literal character, not
+another character class like C<\d> or C<[:alpha:]>. The "-" in your false
+range is interpreted as a literal "-". Consider quoting the "-", "\-".
+See L<perlre>.
+
+=item Filehandle %s opened only for output
+
+(W io) You tried to read from a filehandle opened only for writing. If you
+intended it to be a read/write filehandle, you needed to open it with
+"+<" or "+>" or "+>>" instead of with "<" or nothing. If
+you intended only to read from the file, use "<". See
+L<perlfunc/open>.
+
+=item flock() on closed filehandle %s
+
+(W closed) The filehandle you're attempting to flock() got itself closed some
+time before now. Check your logic flow. flock() operates on filehandles.
+Are you attempting to call flock() on a dirhandle by the same name?
+
+=item Global symbol "%s" requires explicit package name
+
+(F) You've said "use strict vars", which indicates that all variables
+must either be lexically scoped (using "my"), declared beforehand using
+"our", or explicitly qualified to say which package the global variable
+is in (using "::").
+
+=item Hexadecimal number > 0xffffffff non-portable
+
+(W portable) The hexadecimal number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems. See
+L<perlport> for more on portability concerns.
+
+=item Ill-formed CRTL environ value "%s"
+
+(W internal) A warning peculiar to VMS. Perl tried to read the CRTL's internal
+environ array, and encountered an element without the C<=> delimiter
+used to separate keys from values. The element is ignored.
+
+=item Ill-formed message in prime_env_iter: |%s|
+
+(W internal) A warning peculiar to VMS. Perl tried to read a logical name
+or CLI symbol definition when preparing to iterate over %ENV, and
+didn't see the expected delimiter between key and value, so the
+line was ignored.
+
+=item Illegal binary digit %s
+
+(F) You used a digit other than 0 or 1 in a binary number.
+
+=item Illegal binary digit %s ignored
+
+(W digit) You may have tried to use a digit other than 0 or 1 in a binary number.
+Interpretation of the binary number stopped before the offending digit.
+
+=item Illegal number of bits in vec
+
+(F) The number of bits in vec() (the third argument) must be a power of
+two from 1 to 32 (or 64, if your platform supports that).
+
+=item Integer overflow in %s number
+
+(W overflow) The hexadecimal, octal or binary number you have specified either
+as a literal or as an argument to hex() or oct() is too big for your
+architecture, and has been converted to a floating point number. On a
+32-bit architecture the largest hexadecimal, octal or binary number
+representable without overflow is 0xFFFFFFFF, 037777777777, or
+0b11111111111111111111111111111111 respectively. Note that Perl
+transparently promotes all numbers to a floating point representation
+internally--subject to loss of precision errors in subsequent
+operations.
+
+=item Invalid %s attribute: %s
+
+The indicated attribute for a subroutine or variable was not recognized
+by Perl or by a user-supplied handler. See L<attributes>.
+
+=item Invalid %s attributes: %s
+
+The indicated attributes for a subroutine or variable were not recognized
+by Perl or by a user-supplied handler. See L<attributes>.
+
+=item invalid [] range "%s" in regexp
+
+The offending range is now explicitly displayed.
+
+=item Invalid separator character %s in attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of an attribute list. If the previous attribute
+had a parenthesised parameter list, perhaps that list was terminated
+too soon. See L<attributes>.
+
+=item Invalid separator character %s in subroutine attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of a subroutine attribute list. If the previous attribute
+had a parenthesised parameter list, perhaps that list was terminated
+too soon.
+
+=item leaving effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item Lvalue subs returning %s not implemented yet
+
+(F) Due to limitations in the current implementation, array and hash
+values cannot be returned in subroutines used in lvalue context.
+See L<perlsub/"Lvalue subroutines">.
+
+=item Method %s not permitted
+
+See Server error.
+
+=item Missing %sbrace%s on \N{}
+
+(F) Wrong syntax of character name literal C<\N{charname}> within
+double-quotish context.
+
+=item Missing command in piped open
+
+(W pipe) You used the C<open(FH, "| command")> or C<open(FH, "command |")>
+construction, but the command was missing or blank.
+
+=item Missing name in "my sub"
+
+(F) The reserved syntax for lexically scoped subroutines requires that they
+have a name with which they can be found.
+
+=item No %s specified for -%c
+
+(F) The indicated command line switch needs a mandatory argument, but
+you haven't specified one.
+
+=item No package name allowed for variable %s in "our"
+
+(F) Fully qualified variable names are not allowed in "our" declarations,
+because that doesn't make much sense under existing semantics. Such
+syntax is reserved for future extensions.
+
+=item No space allowed after -%c
+
+(F) The argument to the indicated command line switch must follow immediately
+after the switch, without intervening spaces.
+
+=item no UTC offset information; assuming local time is UTC
+
+(S) A warning peculiar to VMS. Perl was unable to find the local
+timezone offset, so it's assuming that local system time is equivalent
+to UTC. If it's not, define the logical name F<SYS$TIMEZONE_DIFFERENTIAL>
+to translate to the number of seconds which need to be added to UTC to
+get local time.
+
+=item Octal number > 037777777777 non-portable
+
+(W portable) The octal number you specified is larger than 2**32-1 (4294967295)
+and therefore non-portable between systems. See L<perlport> for more
+on portability concerns.
+
+See also L<perlport> for writing portable code.
+
+=item panic: del_backref
+
+(P) Failed an internal consistency check while trying to reset a weak
+reference.
+
+=item panic: kid popen errno read
+
+(F) forked child returned an incomprehensible message about its errno.
+
+=item panic: magic_killbackrefs
+
+(P) Failed an internal consistency check while trying to reset all weak
+references to an object.
+
+=item Parentheses missing around "%s" list
+
+(W parenthesis) You said something like
+
+ my $foo, $bar = @_;
+
+when you meant
+
+ my ($foo, $bar) = @_;
+
+Remember that "my", "our", and "local" bind tighter than comma.
+
+=item Possible unintended interpolation of %s in string
+
+(W ambiguous) It used to be that Perl would try to guess whether you
+wanted an array interpolated or a literal @. It no longer does this;
+arrays are now I<always> interpolated into strings. This means that
+if you try something like:
+
+ print "fred@example.com";
+
+and the array C<@example> doesn't exist, Perl is going to print
+C<fred.com>, which is probably not what you wanted. To get a literal
+C<@> sign in a string, put a backslash before it, just as you would
+to get a literal C<$> sign.
+
+=item Possible Y2K bug: %s
+
+(W y2k) You are concatenating the number 19 with another number, which
+could be a potential Year 2000 problem.
+
+=item pragma "attrs" is deprecated, use "sub NAME : ATTRS" instead
+
+(W deprecated) You have written something like this:
+
+ sub doit
+ {
+ use attrs qw(locked);
+ }
+
+You should use the new declaration syntax instead.
+
+ sub doit : locked
+ {
+ ...
+
+The C<use attrs> pragma is now obsolete, and is only provided for
+backward-compatibility. See L<perlsub/"Subroutine Attributes">.
+
+
+=item Premature end of script headers
+
+See Server error.
+
+=item Repeat count in pack overflows
+
+(F) You can't specify a repeat count so large that it overflows
+your signed integers. See L<perlfunc/pack>.
+
+=item Repeat count in unpack overflows
+
+(F) You can't specify a repeat count so large that it overflows
+your signed integers. See L<perlfunc/unpack>.
+
+=item realloc() of freed memory ignored
+
+(S) An internal routine called realloc() on something that had already
+been freed.
+
+=item Reference is already weak
+
+(W misc) You have attempted to weaken a reference that is already weak.
+Doing so has no effect.
+
+=item setpgrp can't take arguments
+
+(F) Your system has the setpgrp() from BSD 4.2, which takes no arguments,
+unlike POSIX setpgid(), which takes a process ID and process group ID.
+
+=item Strange *+?{} on zero-length expression
+
+(W regexp) You applied a regular expression quantifier in a place where it
+makes no sense, such as on a zero-width assertion.
+Try putting the quantifier inside the assertion instead. For example,
+the way to match "abc" provided that it is followed by three
+repetitions of "xyz" is C</abc(?=(?:xyz){3})/>, not C</abc(?=xyz){3}/>.
+
+=item switching effective %s is not implemented
+
+(F) While under the C<use filetest> pragma, we cannot switch the
+real and effective uids or gids.
+
+=item This Perl can't reset CRTL environ elements (%s)
+
+=item This Perl can't set CRTL environ elements (%s=%s)
+
+(W internal) Warnings peculiar to VMS. You tried to change or delete an element
+of the CRTL's internal environ array, but your copy of Perl wasn't
+built with a CRTL that contained the setenv() function. You'll need to
+rebuild Perl with a CRTL that does, or redefine F<PERL_ENV_TABLES> (see
+L<perlvms>) so that the environ array isn't the target of the change to
+%ENV which produced the warning.
+
+=item Too late to run %s block
+
+(W void) A CHECK or INIT block is being defined during run time proper,
+when the opportunity to run them has already passed. Perhaps you are
+loading a file with C<require> or C<do> when you should be using
+C<use> instead. Or perhaps you should put the C<require> or C<do>
+inside a BEGIN block.
+
+=item Unknown open() mode '%s'
+
+(F) The second argument of 3-argument open() is not among the list
+of valid modes: C<< < >>, C<< > >>, C<<< >> >>>, C<< +< >>,
+C<< +> >>, C<<< +>> >>>, C<-|>, C<|->.
+
+=item Unknown process %x sent message to prime_env_iter: %s
+
+(P) An error peculiar to VMS. Perl was reading values for %ENV before
+iterating over it, and someone else stuck a message in the stream of
+data Perl expected. Someone's very confused, or perhaps trying to
+subvert Perl's population of %ENV for nefarious purposes.
+
+=item Unrecognized escape \\%c passed through
+
+(W misc) You used a backslash-character combination which is not recognized
+by Perl. The character was understood literally.
+
+=item Unterminated attribute parameter in attribute list
+
+(F) The lexer saw an opening (left) parenthesis character while parsing an
+attribute list, but the matching closing (right) parenthesis
+character was not found. You may need to add (or remove) a backslash
+character to get your parentheses to balance. See L<attributes>.
+
+=item Unterminated attribute list
+
+(F) The lexer found something other than a simple identifier at the start
+of an attribute, and it wasn't a semicolon or the start of a
+block. Perhaps you terminated the parameter list of the previous attribute
+too soon. See L<attributes>.
+
+=item Unterminated attribute parameter in subroutine attribute list
+
+(F) The lexer saw an opening (left) parenthesis character while parsing a
+subroutine attribute list, but the matching closing (right) parenthesis
+character was not found. You may need to add (or remove) a backslash
+character to get your parentheses to balance.
+
+=item Unterminated subroutine attribute list
+
+(F) The lexer found something other than a simple identifier at the start
+of a subroutine attribute, and it wasn't a semicolon or the start of a
+block. Perhaps you terminated the parameter list of the previous attribute
+too soon.
+
+=item Value of CLI symbol "%s" too long
+
+(W misc) A warning peculiar to VMS. Perl tried to read the value of an %ENV
+element from a CLI symbol table, and found a resultant string longer
+than 1024 characters. The return value has been truncated to 1024
+characters.
+
+=item Version number must be a constant number
+
+(P) The attempt to translate a C<use Module n.n LIST> statement into
+its equivalent C<BEGIN> block found an internal inconsistency with
+the version number.
+
+=back
+
+=head1 New tests
+
+=over 4
+
+=item lib/attrs
+
+Compatibility tests for C<sub : attrs> vs the older C<use attrs>.
+
+=item lib/env
+
+Tests for new environment scalar capability (e.g., C<use Env qw($BAR);>).
+
+=item lib/env-array
+
+Tests for new environment array capability (e.g., C<use Env qw(@PATH);>).
+
+=item lib/io_const
+
+IO constants (SEEK_*, _IO*).
+
+=item lib/io_dir
+
+Directory-related IO methods (new, read, close, rewind, tied delete).
+
+=item lib/io_multihomed
+
+INET sockets with multi-homed hosts.
+
+=item lib/io_poll
+
+IO poll().
+
+=item lib/io_unix
+
+UNIX sockets.
+
+=item op/attrs
+
+Regression tests for C<my ($x,@y,%z) : attrs> and <sub : attrs>.
+
+=item op/filetest
+
+File test operators.
+
+=item op/lex_assign
+
+Verify operations that access pad objects (lexicals and temporaries).
+
+=item op/exists_sub
+
+Verify C<exists &sub> operations.
+
+=back
+
+=head1 Incompatible Changes
+
+=head2 Perl Source Incompatibilities
+
+Beware that any new warnings that have been added or old ones
+that have been enhanced are B<not> considered incompatible changes.
+
+Since all new warnings must be explicitly requested via the C<-w>
+switch or the C<warnings> pragma, it is ultimately the programmer's
+responsibility to ensure that warnings are enabled judiciously.
+
+=over 4
+
+=item CHECK is a new keyword
+
+All subroutine definitions named CHECK are now special. See
+C</"Support for CHECK blocks"> for more information.
+
+=item Treatment of list slices of undef has changed
+
+There is a potential incompatibility in the behavior of list slices
+that are comprised entirely of undefined values.
+See L</"Behavior of list slices is more consistent">.
+
+=item Format of $English::PERL_VERSION is different
+
+The English module now sets $PERL_VERSION to $^V (a string value) rather
+than C<$]> (a numeric value). This is a potential incompatibility.
+Send us a report via perlbug if you are affected by this.
+
+See L</"Improved Perl version numbering system"> for the reasons for
+this change.
+
+=item Literals of the form C<1.2.3> parse differently
+
+Previously, numeric literals with more than one dot in them were
+interpreted as a floating point number concatenated with one or more
+numbers. Such "numbers" are now parsed as strings composed of the
+specified ordinals.
+
+For example, C<print 97.98.99> used to output C<97.9899> in earlier
+versions, but now prints C<abc>.
+
+See L</"Support for strings represented as a vector of ordinals">.
+
+=item Possibly changed pseudo-random number generator
+
+Perl programs that depend on reproducing a specific set of pseudo-random
+numbers may now produce different output due to improvements made to the
+rand() builtin. You can use C<sh Configure -Drandfunc=rand> to obtain
+the old behavior.
+
+See L</"Better pseudo-random number generator">.
+
+=item Hashing function for hash keys has changed
+
+Even though Perl hashes are not order preserving, the apparently
+random order encountered when iterating on the contents of a hash
+is actually determined by the hashing algorithm used. Improvements
+in the algorithm may yield a random order that is B<different> from
+that of previous versions, especially when iterating on hashes.
+
+See L</"Better worst-case behavior of hashes"> for additional
+information.
+
+=item C<undef> fails on read only values
+
+Using the C<undef> operator on a readonly value (such as $1) has
+the same effect as assigning C<undef> to the readonly value--it
+throws an exception.
+
+=item Close-on-exec bit may be set on pipe and socket handles
+
+Pipe and socket handles are also now subject to the close-on-exec
+behavior determined by the special variable $^F.
+
+See L</"More consistent close-on-exec behavior">.
+
+=item Writing C<"$$1"> to mean C<"${$}1"> is unsupported
+
+Perl 5.004 deprecated the interpretation of C<$$1> and
+similar within interpolated strings to mean C<$$ . "1">,
+but still allowed it.
+
+In Perl 5.6.0 and later, C<"$$1"> always means C<"${$1}">.
+
+=item delete(), each(), values() and C<\(%h)>
+
+operate on aliases to values, not copies
+
+delete(), each(), values() and hashes (e.g. C<\(%h)>)
+in a list context return the actual
+values in the hash, instead of copies (as they used to in earlier
+versions). Typical idioms for using these constructs copy the
+returned values, but this can make a significant difference when
+creating references to the returned values. Keys in the hash are still
+returned as copies when iterating on a hash.
+
+See also L</"delete(), each(), values() and hash iteration are faster">.
+
+=item vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS
+
+vec() generates a run-time error if the BITS argument is not
+a valid power-of-two integer.
+
+=item Text of some diagnostic output has changed
+
+Most references to internal Perl operations in diagnostics
+have been changed to be more descriptive. This may be an
+issue for programs that may incorrectly rely on the exact
+text of diagnostics for proper functioning.
+
+=item C<%@> has been removed
+
+The undocumented special variable C<%@> that used to accumulate
+"background" errors (such as those that happen in DESTROY())
+has been removed, because it could potentially result in memory
+leaks.
+
+=item Parenthesized not() behaves like a list operator
+
+The C<not> operator now falls under the "if it looks like a function,
+it behaves like a function" rule.
+
+As a result, the parenthesized form can be used with C<grep> and C<map>.
+The following construct used to be a syntax error before, but it works
+as expected now:
+
+ grep not($_), @things;
+
+On the other hand, using C<not> with a literal list slice may not
+work. The following previously allowed construct:
+
+ print not (1,2,3)[0];
+
+needs to be written with additional parentheses now:
+
+ print not((1,2,3)[0]);
+
+The behavior remains unaffected when C<not> is not followed by parentheses.
+
+=item Semantics of bareword prototype C<(*)> have changed
+
+The semantics of the bareword prototype C<*> have changed. Perl 5.005
+always coerced simple scalar arguments to a typeglob, which wasn't useful
+in situations where the subroutine must distinguish between a simple
+scalar and a typeglob. The new behavior is to not coerce bareword
+arguments to a typeglob. The value will always be visible as either
+a simple scalar or as a reference to a typeglob.
+
+See L</"More functional bareword prototype (*)">.
+
+=item Semantics of bit operators may have changed on 64-bit platforms
+
+If your platform is either natively 64-bit or if Perl has been
+configured to used 64-bit integers, i.e., $Config{ivsize} is 8,
+there may be a potential incompatibility in the behavior of bitwise
+numeric operators (& | ^ ~ << >>). These operators used to strictly
+operate on the lower 32 bits of integers in previous versions, but now
+operate over the entire native integral width. In particular, note
+that unary C<~> will produce different results on platforms that have
+different $Config{ivsize}. For portability, be sure to mask off
+the excess bits in the result of unary C<~>, e.g., C<~$x & 0xffffffff>.
+
+See L</"Bit operators support full native integer width">.
+
+=item More builtins taint their results
+
+As described in L</"Improved security features">, there may be more
+sources of taint in a Perl program.
+
+To avoid these new tainting behaviors, you can build Perl with the
+Configure option C<-Accflags=-DINCOMPLETE_TAINTS>. Beware that the
+ensuing perl binary may be insecure.
+
+=back
+
+=head2 C Source Incompatibilities
+
+=over 4
+
+=item C<PERL_POLLUTE>
+
+Release 5.005 grandfathered old global symbol names by providing preprocessor
+macros for extension source compatibility. As of release 5.6.0, these
+preprocessor definitions are not available by default. You need to explicitly
+compile perl with C<-DPERL_POLLUTE> to get these definitions. For
+extensions still using the old symbols, this option can be
+specified via MakeMaker:
+
+ perl Makefile.PL POLLUTE=1
+
+=item C<PERL_IMPLICIT_CONTEXT>
+
+This new build option provides a set of macros for all API functions
+such that an implicit interpreter/thread context argument is passed to
+every API function. As a result of this, something like C<sv_setsv(foo,bar)>
+amounts to a macro invocation that actually translates to something like
+C<Perl_sv_setsv(my_perl,foo,bar)>. While this is generally expected
+to not have any significant source compatibility issues, the difference
+between a macro and a real function call will need to be considered.
+
+This means that there B<is> a source compatibility issue as a result of
+this if your extensions attempt to use pointers to any of the Perl API
+functions.
+
+Note that the above issue is not relevant to the default build of
+Perl, whose interfaces continue to match those of prior versions
+(but subject to the other options described here).
+
+See L<perlguts/"The Perl API"> for detailed information on the
+ramifications of building Perl with this option.
+
+ NOTE: PERL_IMPLICIT_CONTEXT is automatically enabled whenever Perl is built
+ with one of -Dusethreads, -Dusemultiplicity, or both. It is not
+ intended to be enabled by users at this time.
+
+=item C<PERL_POLLUTE_MALLOC>
+
+Enabling Perl's malloc in release 5.005 and earlier caused the namespace of
+the system's malloc family of functions to be usurped by the Perl versions,
+since by default they used the same names. Besides causing problems on
+platforms that do not allow these functions to be cleanly replaced, this
+also meant that the system versions could not be called in programs that
+used Perl's malloc. Previous versions of Perl have allowed this behaviour
+to be suppressed with the HIDEMYMALLOC and EMBEDMYMALLOC preprocessor
+definitions.
+
+As of release 5.6.0, Perl's malloc family of functions have default names
+distinct from the system versions. You need to explicitly compile perl with
+C<-DPERL_POLLUTE_MALLOC> to get the older behaviour. HIDEMYMALLOC
+and EMBEDMYMALLOC have no effect, since the behaviour they enabled is now
+the default.
+
+Note that these functions do B<not> constitute Perl's memory allocation API.
+See L<perlguts/"Memory Allocation"> for further information about that.
+
+=back
+
+=head2 Compatible C Source API Changes
+
+=over 4
+
+=item C<PATCHLEVEL> is now C<PERL_VERSION>
+
+The cpp macros C<PERL_REVISION>, C<PERL_VERSION>, and C<PERL_SUBVERSION>
+are now available by default from perl.h, and reflect the base revision,
+patchlevel, and subversion respectively. C<PERL_REVISION> had no
+prior equivalent, while C<PERL_VERSION> and C<PERL_SUBVERSION> were
+previously available as C<PATCHLEVEL> and C<SUBVERSION>.
+
+The new names cause less pollution of the B<cpp> namespace and reflect what
+the numbers have come to stand for in common practice. For compatibility,
+the old names are still supported when F<patchlevel.h> is explicitly
+included (as required before), so there is no source incompatibility
+from the change.
+
+=back
+
+=head2 Binary Incompatibilities
+
+In general, the default build of this release is expected to be binary
+compatible for extensions built with the 5.005 release or its maintenance
+versions. However, specific platforms may have broken binary compatibility
+due to changes in the defaults used in hints files. Therefore, please be
+sure to always check the platform-specific README files for any notes to
+the contrary.
+
+The usethreads or usemultiplicity builds are B<not> binary compatible
+with the corresponding builds in 5.005.
+
+On platforms that require an explicit list of exports (AIX, OS/2 and Windows,
+among others), purely internal symbols such as parser functions and the
+run time opcodes are not exported by default. Perl 5.005 used to export
+all functions irrespective of whether they were considered part of the
+public API or not.
+
+For the full list of public API functions, see L<perlapi>.
+
+=head1 Known Problems
+
+=head2 Localizing a tied hash element may leak memory
+
+As of the 5.6.1 release, there is a known leak when code such as this
+is executed:
+
+ use Tie::Hash;
+ tie my %tie_hash => 'Tie::StdHash';
+
+ ...
+
+ local($tie_hash{Foo}) = 1; # leaks
+
+=head2 Known test failures
+
+=over
+
+=item *
+
+64-bit builds
+
+Subtest #15 of lib/b.t may fail under 64-bit builds on platforms such
+as HP-UX PA64 and Linux IA64. The issue is still being investigated.
+
+The lib/io_multihomed test may hang in HP-UX if Perl has been
+configured to be 64-bit. Because other 64-bit platforms do not
+hang in this test, HP-UX is suspect. All other tests pass
+in 64-bit HP-UX. The test attempts to create and connect to
+"multihomed" sockets (sockets which have multiple IP addresses).
+
+Note that 64-bit support is still experimental.
+
+=item *
+
+Failure of Thread tests
+
+The subtests 19 and 20 of lib/thr5005.t test are known to fail due to
+fundamental problems in the 5.005 threading implementation. These are
+not new failures--Perl 5.005_0x has the same bugs, but didn't have these
+tests. (Note that support for 5.005-style threading remains experimental.)
+
+=item *
+
+NEXTSTEP 3.3 POSIX test failure
+
+In NEXTSTEP 3.3p2 the implementation of the strftime(3) in the
+operating system libraries is buggy: the %j format numbers the days of
+a month starting from zero, which, while being logical to programmers,
+will cause the subtests 19 to 27 of the lib/posix test may fail.
+
+=item *
+
+Tru64 (aka Digital UNIX, aka DEC OSF/1) lib/sdbm test failure with gcc
+
+If compiled with gcc 2.95 the lib/sdbm test will fail (dump core).
+The cure is to use the vendor cc, it comes with the operating system
+and produces good code.
+
+=back
+
+=head2 EBCDIC platforms not fully supported
+
+In earlier releases of Perl, EBCDIC environments like OS390 (also
+known as Open Edition MVS) and VM-ESA were supported. Due to changes
+required by the UTF-8 (Unicode) support, the EBCDIC platforms are not
+supported in Perl 5.6.0.
+
+The 5.6.1 release improves support for EBCDIC platforms, but they
+are not fully supported yet.
+
+=head2 UNICOS/mk CC failures during Configure run
+
+In UNICOS/mk the following errors may appear during the Configure run:
+
+ Guessing which symbols your C compiler and preprocessor define...
+ CC-20 cc: ERROR File = try.c, Line = 3
+ ...
+ bad switch yylook 79bad switch yylook 79bad switch yylook 79bad switch yylook 79#ifdef A29K
+ ...
+ 4 errors detected in the compilation of "try.c".
+
+The culprit is the broken awk of UNICOS/mk. The effect is fortunately
+rather mild: Perl itself is not adversely affected by the error, only
+the h2ph utility coming with Perl, and that is rather rarely needed
+these days.
+
+=head2 Arrow operator and arrays
+
+When the left argument to the arrow operator C<< -> >> is an array, or
+the C<scalar> operator operating on an array, the result of the
+operation must be considered erroneous. For example:
+
+ @x->[2]
+ scalar(@x)->[2]
+
+These expressions will get run-time errors in some future release of
+Perl.
+
+=head2 Experimental features
+
+As discussed above, many features are still experimental. Interfaces and
+implementation of these features are subject to change, and in extreme cases,
+even subject to removal in some future release of Perl. These features
+include the following:
+
+=over 4
+
+=item Threads
+
+=item Unicode
+
+=item 64-bit support
+
+=item Lvalue subroutines
+
+=item Weak references
+
+=item The pseudo-hash data type
+
+=item The Compiler suite
+
+=item Internal implementation of file globbing
+
+=item The DB module
+
+=item The regular expression code constructs:
+
+C<(?{ code })> and C<(??{ code })>
+
+=back
+
+=head1 Obsolete Diagnostics
+
+=over 4
+
+=item Character class syntax [: :] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax beginning
+with "[:" and ending with ":]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[:" and ":\]".
+
+=item Ill-formed logical name |%s| in prime_env_iter
+
+(W) A warning peculiar to VMS. A logical name was encountered when preparing
+to iterate over %ENV which violates the syntactic rules governing logical
+names. Because it cannot be translated normally, it is skipped, and will not
+appear in %ENV. This may be a benign occurrence, as some software packages
+might directly modify logical name tables and introduce nonstandard names,
+or it may indicate that a logical name table has been corrupted.
+
+=item In string, @%s now must be written as \@%s
+
+The description of this error used to say:
+
+ (Someday it will simply assume that an unbackslashed @
+ interpolates an array.)
+
+That day has come, and this fatal error has been removed. It has been
+replaced by a non-fatal warning instead.
+See L</Arrays now always interpolate into double-quoted strings> for
+details.
+
+=item Probable precedence problem on %s
+
+(W) The compiler found a bareword where it expected a conditional,
+which often indicates that an || or && was parsed as part of the
+last argument of the previous construct, for example:
+
+ open FOO || die;
+
+=item regexp too big
+
+(F) The current implementation of regular expressions uses shorts as
+address offsets within a string. Unfortunately this means that if
+the regular expression compiles to longer than 32767, it'll blow up.
+Usually when you want a regular expression this big, there is a better
+way to do it with multiple statements. See L<perlre>.
+
+=item Use of "$$<digit>" to mean "${$}<digit>" is deprecated
+
+(D) Perl versions before 5.004 misinterpreted any type marker followed
+by "$" and a digit. For example, "$$0" was incorrectly taken to mean
+"${$}0" instead of "${$0}". This bug is (mostly) fixed in Perl 5.004.
+
+However, the developers of Perl 5.004 could not fix this bug completely,
+because at least two widely-used modules depend on the old meaning of
+"$$0" in a string. So Perl 5.004 still interprets "$$<digit>" in the
+old (broken) way inside strings; but it generates this message as a
+warning. And in Perl 5.005, this special treatment will cease.
+
+=back
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the
+articles recently posted to the comp.lang.perl.misc newsgroup.
+There may also be information at http://www.perl.com/ , the Perl
+Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Gurusamy Sarathy <F<gsar@ActiveState.com>>, with many
+contributions from The Perl Porters.
+
+Send omissions or corrections to <F<perlbug@perl.org>>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl56delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl56delta.pod
new file mode 100755
index 00000000000..0ee586f80e5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl56delta.pod
@@ -0,0 +1,3022 @@
+=head1 NAME
+
+perl56delta - what's new for perl v5.6.0
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.005 release and the 5.6.0
+release.
+
+=head1 Core Enhancements
+
+=head2 Interpreter cloning, threads, and concurrency
+
+Perl 5.6.0 introduces the beginnings of support for running multiple
+interpreters concurrently in different threads. In conjunction with
+the perl_clone() API call, which can be used to selectively duplicate
+the state of any given interpreter, it is possible to compile a
+piece of code once in an interpreter, clone that interpreter
+one or more times, and run all the resulting interpreters in distinct
+threads.
+
+On the Windows platform, this feature is used to emulate fork() at the
+interpreter level. See L<perlfork> for details about that.
+
+This feature is still in evolution. It is eventually meant to be used
+to selectively clone a subroutine and data reachable from that
+subroutine in a separate interpreter and run the cloned subroutine
+in a separate thread. Since there is no shared data between the
+interpreters, little or no locking will be needed (unless parts of
+the symbol table are explicitly shared). This is obviously intended
+to be an easy-to-use replacement for the existing threads support.
+
+Support for cloning interpreters and interpreter concurrency can be
+enabled using the -Dusethreads Configure option (see win32/Makefile for
+how to enable it on Windows.) The resulting perl executable will be
+functionally identical to one that was built with -Dmultiplicity, but
+the perl_clone() API call will only be available in the former.
+
+-Dusethreads enables the cpp macro USE_ITHREADS by default, which in turn
+enables Perl source code changes that provide a clear separation between
+the op tree and the data it operates with. The former is immutable, and
+can therefore be shared between an interpreter and all of its clones,
+while the latter is considered local to each interpreter, and is therefore
+copied for each clone.
+
+Note that building Perl with the -Dusemultiplicity Configure option
+is adequate if you wish to run multiple B<independent> interpreters
+concurrently in different threads. -Dusethreads only provides the
+additional functionality of the perl_clone() API call and other
+support for running B<cloned> interpreters concurrently.
+
+ NOTE: This is an experimental feature. Implementation details are
+ subject to change.
+
+=head2 Lexically scoped warning categories
+
+You can now control the granularity of warnings emitted by perl at a finer
+level using the C<use warnings> pragma. L<warnings> and L<perllexwarn>
+have copious documentation on this feature.
+
+=head2 Unicode and UTF-8 support
+
+Perl now uses UTF-8 as its internal representation for character
+strings. The C<utf8> and C<bytes> pragmas are used to control this support
+in the current lexical scope. See L<perlunicode>, L<utf8> and L<bytes> for
+more information.
+
+This feature is expected to evolve quickly to support some form of I/O
+disciplines that can be used to specify the kind of input and output data
+(bytes or characters). Until that happens, additional modules from CPAN
+will be needed to complete the toolkit for dealing with Unicode.
+
+ NOTE: This should be considered an experimental feature. Implementation
+ details are subject to change.
+
+=head2 Support for interpolating named characters
+
+The new C<\N> escape interpolates named characters within strings.
+For example, C<"Hi! \N{WHITE SMILING FACE}"> evaluates to a string
+with a unicode smiley face at the end.
+
+=head2 "our" declarations
+
+An "our" declaration introduces a value that can be best understood
+as a lexically scoped symbolic alias to a global variable in the
+package that was current where the variable was declared. This is
+mostly useful as an alternative to the C<vars> pragma, but also provides
+the opportunity to introduce typing and other attributes for such
+variables. See L<perlfunc/our>.
+
+=head2 Support for strings represented as a vector of ordinals
+
+Literals of the form C<v1.2.3.4> are now parsed as a string composed
+of characters with the specified ordinals. This is an alternative, more
+readable way to construct (possibly unicode) strings instead of
+interpolating characters, as in C<"\x{1}\x{2}\x{3}\x{4}">. The leading
+C<v> may be omitted if there are more than two ordinals, so C<1.2.3> is
+parsed the same as C<v1.2.3>.
+
+Strings written in this form are also useful to represent version "numbers".
+It is easy to compare such version "numbers" (which are really just plain
+strings) using any of the usual string comparison operators C<eq>, C<ne>,
+C<lt>, C<gt>, etc., or perform bitwise string operations on them using C<|>,
+C<&>, etc.
+
+In conjunction with the new C<$^V> magic variable (which contains
+the perl version as a string), such literals can be used as a readable way
+to check if you're running a particular version of Perl:
+
+ # this will parse in older versions of Perl also
+ if ($^V and $^V gt v5.6.0) {
+ # new features supported
+ }
+
+C<require> and C<use> also have some special magic to support such
+literals, but this particular usage should be avoided because it leads to
+misleading error messages under versions of Perl which don't support vector
+strings. Using a true version number will ensure correct behavior in all
+versions of Perl:
+
+ require 5.006; # run time check for v5.6
+ use 5.006_001; # compile time check for v5.6.1
+
+Also, C<sprintf> and C<printf> support the Perl-specific format flag C<%v>
+to print ordinals of characters in arbitrary strings:
+
+ printf "v%vd", $^V; # prints current version, such as "v5.5.650"
+ printf "%*vX", ":", $addr; # formats IPv6 address
+ printf "%*vb", " ", $bits; # displays bitstring
+
+See L<perldata/"Scalar value constructors"> for additional information.
+
+=head2 Improved Perl version numbering system
+
+Beginning with Perl version 5.6.0, the version number convention has been
+changed to a "dotted integer" scheme that is more commonly found in open
+source projects.
+
+Maintenance versions of v5.6.0 will be released as v5.6.1, v5.6.2 etc.
+The next development series following v5.6.0 will be numbered v5.7.x,
+beginning with v5.7.0, and the next major production release following
+v5.6.0 will be v5.8.0.
+
+The English module now sets $PERL_VERSION to $^V (a string value) rather
+than C<$]> (a numeric value). (This is a potential incompatibility.
+Send us a report via perlbug if you are affected by this.)
+
+The v1.2.3 syntax is also now legal in Perl.
+See L<Support for strings represented as a vector of ordinals> for more on that.
+
+To cope with the new versioning system's use of at least three significant
+digits for each version component, the method used for incrementing the
+subversion number has also changed slightly. We assume that versions older
+than v5.6.0 have been incrementing the subversion component in multiples of
+10. Versions after v5.6.0 will increment them by 1. Thus, using the new
+notation, 5.005_03 is the "same" as v5.5.30, and the first maintenance
+version following v5.6.0 will be v5.6.1 (which should be read as being
+equivalent to a floating point value of 5.006_001 in the older format,
+stored in C<$]>).
+
+=head2 New syntax for declaring subroutine attributes
+
+Formerly, if you wanted to mark a subroutine as being a method call or
+as requiring an automatic lock() when it is entered, you had to declare
+that with a C<use attrs> pragma in the body of the subroutine.
+That can now be accomplished with declaration syntax, like this:
+
+ sub mymethod : locked method;
+ ...
+ sub mymethod : locked method {
+ ...
+ }
+
+ sub othermethod :locked :method;
+ ...
+ sub othermethod :locked :method {
+ ...
+ }
+
+
+(Note how only the first C<:> is mandatory, and whitespace surrounding
+the C<:> is optional.)
+
+F<AutoSplit.pm> and F<SelfLoader.pm> have been updated to keep the attributes
+with the stubs they provide. See L<attributes>.
+
+=head2 File and directory handles can be autovivified
+
+Similar to how constructs such as C<< $x->[0] >> autovivify a reference,
+handle constructors (open(), opendir(), pipe(), socketpair(), sysopen(),
+socket(), and accept()) now autovivify a file or directory handle
+if the handle passed to them is an uninitialized scalar variable. This
+allows the constructs such as C<open(my $fh, ...)> and C<open(local $fh,...)>
+to be used to create filehandles that will conveniently be closed
+automatically when the scope ends, provided there are no other references
+to them. This largely eliminates the need for typeglobs when opening
+filehandles that must be passed around, as in the following example:
+
+ sub myopen {
+ open my $fh, "@_"
+ or die "Can't open '@_': $!";
+ return $fh;
+ }
+
+ {
+ my $f = myopen("</etc/motd");
+ print <$f>;
+ # $f implicitly closed here
+ }
+
+=head2 open() with more than two arguments
+
+If open() is passed three arguments instead of two, the second argument
+is used as the mode and the third argument is taken to be the file name.
+This is primarily useful for protecting against unintended magic behavior
+of the traditional two-argument form. See L<perlfunc/open>.
+
+=head2 64-bit support
+
+Any platform that has 64-bit integers either
+
+ (1) natively as longs or ints
+ (2) via special compiler flags
+ (3) using long long or int64_t
+
+is able to use "quads" (64-bit integers) as follows:
+
+=over 4
+
+=item *
+
+constants (decimal, hexadecimal, octal, binary) in the code
+
+=item *
+
+arguments to oct() and hex()
+
+=item *
+
+arguments to print(), printf() and sprintf() (flag prefixes ll, L, q)
+
+=item *
+
+printed as such
+
+=item *
+
+pack() and unpack() "q" and "Q" formats
+
+=item *
+
+in basic arithmetics: + - * / % (NOTE: operating close to the limits
+of the integer values may produce surprising results)
+
+=item *
+
+in bit arithmetics: & | ^ ~ << >> (NOTE: these used to be forced
+to be 32 bits wide but now operate on the full native width.)
+
+=item *
+
+vec()
+
+=back
+
+Note that unless you have the case (a) you will have to configure
+and compile Perl using the -Duse64bitint Configure flag.
+
+ NOTE: The Configure flags -Duselonglong and -Duse64bits have been
+ deprecated. Use -Duse64bitint instead.
+
+There are actually two modes of 64-bitness: the first one is achieved
+using Configure -Duse64bitint and the second one using Configure
+-Duse64bitall. The difference is that the first one is minimal and
+the second one maximal. The first works in more places than the second.
+
+The C<use64bitint> does only as much as is required to get 64-bit
+integers into Perl (this may mean, for example, using "long longs")
+while your memory may still be limited to 2 gigabytes (because your
+pointers could still be 32-bit). Note that the name C<64bitint> does
+not imply that your C compiler will be using 64-bit C<int>s (it might,
+but it doesn't have to): the C<use64bitint> means that you will be
+able to have 64 bits wide scalar values.
+
+The C<use64bitall> goes all the way by attempting to switch also
+integers (if it can), longs (and pointers) to being 64-bit. This may
+create an even more binary incompatible Perl than -Duse64bitint: the
+resulting executable may not run at all in a 32-bit box, or you may
+have to reboot/reconfigure/rebuild your operating system to be 64-bit
+aware.
+
+Natively 64-bit systems like Alpha and Cray need neither -Duse64bitint
+nor -Duse64bitall.
+
+Last but not least: note that due to Perl's habit of always using
+floating point numbers, the quads are still not true integers.
+When quads overflow their limits (0...18_446_744_073_709_551_615 unsigned,
+-9_223_372_036_854_775_808...9_223_372_036_854_775_807 signed), they
+are silently promoted to floating point numbers, after which they will
+start losing precision (in their lower digits).
+
+ NOTE: 64-bit support is still experimental on most platforms.
+ Existing support only covers the LP64 data model. In particular, the
+ LLP64 data model is not yet supported. 64-bit libraries and system
+ APIs on many platforms have not stabilized--your mileage may vary.
+
+=head2 Large file support
+
+If you have filesystems that support "large files" (files larger than
+2 gigabytes), you may now also be able to create and access them from
+Perl.
+
+ NOTE: The default action is to enable large file support, if
+ available on the platform.
+
+If the large file support is on, and you have a Fcntl constant
+O_LARGEFILE, the O_LARGEFILE is automatically added to the flags
+of sysopen().
+
+Beware that unless your filesystem also supports "sparse files" seeking
+to umpteen petabytes may be inadvisable.
+
+Note that in addition to requiring a proper file system to do large
+files you may also need to adjust your per-process (or your
+per-system, or per-process-group, or per-user-group) maximum filesize
+limits before running Perl scripts that try to handle large files,
+especially if you intend to write such files.
+
+Finally, in addition to your process/process group maximum filesize
+limits, you may have quota limits on your filesystems that stop you
+(your user id or your user group id) from using large files.
+
+Adjusting your process/user/group/file system/operating system limits
+is outside the scope of Perl core language. For process limits, you
+may try increasing the limits using your shell's limits/limit/ulimit
+command before running Perl. The BSD::Resource extension (not
+included with the standard Perl distribution) may also be of use, it
+offers the getrlimit/setrlimit interface that can be used to adjust
+process resource usage limits, including the maximum filesize limit.
+
+=head2 Long doubles
+
+In some systems you may be able to use long doubles to enhance the
+range and precision of your double precision floating point numbers
+(that is, Perl's numbers). Use Configure -Duselongdouble to enable
+this support (if it is available).
+
+=head2 "more bits"
+
+You can "Configure -Dusemorebits" to turn on both the 64-bit support
+and the long double support.
+
+=head2 Enhanced support for sort() subroutines
+
+Perl subroutines with a prototype of C<($$)>, and XSUBs in general, can
+now be used as sort subroutines. In either case, the two elements to
+be compared are passed as normal parameters in @_. See L<perlfunc/sort>.
+
+For unprototyped sort subroutines, the historical behavior of passing
+the elements to be compared as the global variables $a and $b remains
+unchanged.
+
+=head2 C<sort $coderef @foo> allowed
+
+sort() did not accept a subroutine reference as the comparison
+function in earlier versions. This is now permitted.
+
+=head2 File globbing implemented internally
+
+Perl now uses the File::Glob implementation of the glob() operator
+automatically. This avoids using an external csh process and the
+problems associated with it.
+
+ NOTE: This is currently an experimental feature. Interfaces and
+ implementation are subject to change.
+
+=head2 Support for CHECK blocks
+
+In addition to C<BEGIN>, C<INIT>, C<END>, C<DESTROY> and C<AUTOLOAD>,
+subroutines named C<CHECK> are now special. These are queued up during
+compilation and behave similar to END blocks, except they are called at
+the end of compilation rather than at the end of execution. They cannot
+be called directly.
+
+=head2 POSIX character class syntax [: :] supported
+
+For example to match alphabetic characters use /[[:alpha:]]/.
+See L<perlre> for details.
+
+=head2 Better pseudo-random number generator
+
+In 5.005_0x and earlier, perl's rand() function used the C library
+rand(3) function. As of 5.005_52, Configure tests for drand48(),
+random(), and rand() (in that order) and picks the first one it finds.
+
+These changes should result in better random numbers from rand().
+
+=head2 Improved C<qw//> operator
+
+The C<qw//> operator is now evaluated at compile time into a true list
+instead of being replaced with a run time call to C<split()>. This
+removes the confusing misbehaviour of C<qw//> in scalar context, which
+had inherited that behaviour from split().
+
+Thus:
+
+ $foo = ($bar) = qw(a b c); print "$foo|$bar\n";
+
+now correctly prints "3|a", instead of "2|a".
+
+=head2 Better worst-case behavior of hashes
+
+Small changes in the hashing algorithm have been implemented in
+order to improve the distribution of lower order bits in the
+hashed value. This is expected to yield better performance on
+keys that are repeated sequences.
+
+=head2 pack() format 'Z' supported
+
+The new format type 'Z' is useful for packing and unpacking null-terminated
+strings. See L<perlfunc/"pack">.
+
+=head2 pack() format modifier '!' supported
+
+The new format type modifier '!' is useful for packing and unpacking
+native shorts, ints, and longs. See L<perlfunc/"pack">.
+
+=head2 pack() and unpack() support counted strings
+
+The template character '/' can be used to specify a counted string
+type to be packed or unpacked. See L<perlfunc/"pack">.
+
+=head2 Comments in pack() templates
+
+The '#' character in a template introduces a comment up to
+end of the line. This facilitates documentation of pack()
+templates.
+
+=head2 Weak references
+
+In previous versions of Perl, you couldn't cache objects so as
+to allow them to be deleted if the last reference from outside
+the cache is deleted. The reference in the cache would hold a
+reference count on the object and the objects would never be
+destroyed.
+
+Another familiar problem is with circular references. When an
+object references itself, its reference count would never go
+down to zero, and it would not get destroyed until the program
+is about to exit.
+
+Weak references solve this by allowing you to "weaken" any
+reference, that is, make it not count towards the reference count.
+When the last non-weak reference to an object is deleted, the object
+is destroyed and all the weak references to the object are
+automatically undef-ed.
+
+To use this feature, you need the Devel::WeakRef package from CPAN, which
+contains additional documentation.
+
+ NOTE: This is an experimental feature. Details are subject to change.
+
+=head2 Binary numbers supported
+
+Binary numbers are now supported as literals, in s?printf formats, and
+C<oct()>:
+
+ $answer = 0b101010;
+ printf "The answer is: %b\n", oct("0b101010");
+
+=head2 Lvalue subroutines
+
+Subroutines can now return modifiable lvalues.
+See L<perlsub/"Lvalue subroutines">.
+
+ NOTE: This is an experimental feature. Details are subject to change.
+
+=head2 Some arrows may be omitted in calls through references
+
+Perl now allows the arrow to be omitted in many constructs
+involving subroutine calls through references. For example,
+C<< $foo[10]->('foo') >> may now be written C<$foo[10]('foo')>.
+This is rather similar to how the arrow may be omitted from
+C<< $foo[10]->{'foo'} >>. Note however, that the arrow is still
+required for C<< foo(10)->('bar') >>.
+
+=head2 Boolean assignment operators are legal lvalues
+
+Constructs such as C<($a ||= 2) += 1> are now allowed.
+
+=head2 exists() is supported on subroutine names
+
+The exists() builtin now works on subroutine names. A subroutine
+is considered to exist if it has been declared (even if implicitly).
+See L<perlfunc/exists> for examples.
+
+=head2 exists() and delete() are supported on array elements
+
+The exists() and delete() builtins now work on simple arrays as well.
+The behavior is similar to that on hash elements.
+
+exists() can be used to check whether an array element has been
+initialized. This avoids autovivifying array elements that don't exist.
+If the array is tied, the EXISTS() method in the corresponding tied
+package will be invoked.
+
+delete() may be used to remove an element from the array and return
+it. The array element at that position returns to its uninitialized
+state, so that testing for the same element with exists() will return
+false. If the element happens to be the one at the end, the size of
+the array also shrinks up to the highest element that tests true for
+exists(), or 0 if none such is found. If the array is tied, the DELETE()
+method in the corresponding tied package will be invoked.
+
+See L<perlfunc/exists> and L<perlfunc/delete> for examples.
+
+=head2 Pseudo-hashes work better
+
+Dereferencing some types of reference values in a pseudo-hash,
+such as C<< $ph->{foo}[1] >>, was accidentally disallowed. This has
+been corrected.
+
+When applied to a pseudo-hash element, exists() now reports whether
+the specified value exists, not merely if the key is valid.
+
+delete() now works on pseudo-hashes. When given a pseudo-hash element
+or slice it deletes the values corresponding to the keys (but not the keys
+themselves). See L<perlref/"Pseudo-hashes: Using an array as a hash">.
+
+Pseudo-hash slices with constant keys are now optimized to array lookups
+at compile-time.
+
+List assignments to pseudo-hash slices are now supported.
+
+The C<fields> pragma now provides ways to create pseudo-hashes, via
+fields::new() and fields::phash(). See L<fields>.
+
+ NOTE: The pseudo-hash data type continues to be experimental.
+ Limiting oneself to the interface elements provided by the
+ fields pragma will provide protection from any future changes.
+
+=head2 Automatic flushing of output buffers
+
+fork(), exec(), system(), qx//, and pipe open()s now flush buffers
+of all files opened for output when the operation was attempted. This
+mostly eliminates confusing buffering mishaps suffered by users unaware
+of how Perl internally handles I/O.
+
+This is not supported on some platforms like Solaris where a suitably
+correct implementation of fflush(NULL) isn't available.
+
+=head2 Better diagnostics on meaningless filehandle operations
+
+Constructs such as C<< open(<FH>) >> and C<< close(<FH>) >>
+are compile time errors. Attempting to read from filehandles that
+were opened only for writing will now produce warnings (just as
+writing to read-only filehandles does).
+
+=head2 Where possible, buffered data discarded from duped input filehandle
+
+C<< open(NEW, "<&OLD") >> now attempts to discard any data that
+was previously read and buffered in C<OLD> before duping the handle.
+On platforms where doing this is allowed, the next read operation
+on C<NEW> will return the same data as the corresponding operation
+on C<OLD>. Formerly, it would have returned the data from the start
+of the following disk block instead.
+
+=head2 eof() has the same old magic as <>
+
+C<eof()> would return true if no attempt to read from C<< <> >> had
+yet been made. C<eof()> has been changed to have a little magic of its
+own, it now opens the C<< <> >> files.
+
+=head2 binmode() can be used to set :crlf and :raw modes
+
+binmode() now accepts a second argument that specifies a discipline
+for the handle in question. The two pseudo-disciplines ":raw" and
+":crlf" are currently supported on DOS-derivative platforms.
+See L<perlfunc/"binmode"> and L<open>.
+
+=head2 C<-T> filetest recognizes UTF-8 encoded files as "text"
+
+The algorithm used for the C<-T> filetest has been enhanced to
+correctly identify UTF-8 content as "text".
+
+=head2 system(), backticks and pipe open now reflect exec() failure
+
+On Unix and similar platforms, system(), qx() and open(FOO, "cmd |")
+etc., are implemented via fork() and exec(). When the underlying
+exec() fails, earlier versions did not report the error properly,
+since the exec() happened to be in a different process.
+
+The child process now communicates with the parent about the
+error in launching the external command, which allows these
+constructs to return with their usual error value and set $!.
+
+=head2 Improved diagnostics
+
+Line numbers are no longer suppressed (under most likely circumstances)
+during the global destruction phase.
+
+Diagnostics emitted from code running in threads other than the main
+thread are now accompanied by the thread ID.
+
+Embedded null characters in diagnostics now actually show up. They
+used to truncate the message in prior versions.
+
+$foo::a and $foo::b are now exempt from "possible typo" warnings only
+if sort() is encountered in package C<foo>.
+
+Unrecognized alphabetic escapes encountered when parsing quote
+constructs now generate a warning, since they may take on new
+semantics in later versions of Perl.
+
+Many diagnostics now report the internal operation in which the warning
+was provoked, like so:
+
+ Use of uninitialized value in concatenation (.) at (eval 1) line 1.
+ Use of uninitialized value in print at (eval 1) line 1.
+
+Diagnostics that occur within eval may also report the file and line
+number where the eval is located, in addition to the eval sequence
+number and the line number within the evaluated text itself. For
+example:
+
+ Not enough arguments for scalar at (eval 4)[newlib/perl5db.pl:1411] line 2, at EOF
+
+=head2 Diagnostics follow STDERR
+
+Diagnostic output now goes to whichever file the C<STDERR> handle
+is pointing at, instead of always going to the underlying C runtime
+library's C<stderr>.
+
+=head2 More consistent close-on-exec behavior
+
+On systems that support a close-on-exec flag on filehandles, the
+flag is now set for any handles created by pipe(), socketpair(),
+socket(), and accept(), if that is warranted by the value of $^F
+that may be in effect. Earlier versions neglected to set the flag
+for handles created with these operators. See L<perlfunc/pipe>,
+L<perlfunc/socketpair>, L<perlfunc/socket>, L<perlfunc/accept>,
+and L<perlvar/$^F>.
+
+=head2 syswrite() ease-of-use
+
+The length argument of C<syswrite()> has become optional.
+
+=head2 Better syntax checks on parenthesized unary operators
+
+Expressions such as:
+
+ print defined(&foo,&bar,&baz);
+ print uc("foo","bar","baz");
+ undef($foo,&bar);
+
+used to be accidentally allowed in earlier versions, and produced
+unpredictable behaviour. Some produced ancillary warnings
+when used in this way; others silently did the wrong thing.
+
+The parenthesized forms of most unary operators that expect a single
+argument now ensure that they are not called with more than one
+argument, making the cases shown above syntax errors. The usual
+behaviour of:
+
+ print defined &foo, &bar, &baz;
+ print uc "foo", "bar", "baz";
+ undef $foo, &bar;
+
+remains unchanged. See L<perlop>.
+
+=head2 Bit operators support full native integer width
+
+The bit operators (& | ^ ~ << >>) now operate on the full native
+integral width (the exact size of which is available in $Config{ivsize}).
+For example, if your platform is either natively 64-bit or if Perl
+has been configured to use 64-bit integers, these operations apply
+to 8 bytes (as opposed to 4 bytes on 32-bit platforms).
+For portability, be sure to mask off the excess bits in the result of
+unary C<~>, e.g., C<~$x & 0xffffffff>.
+
+=head2 Improved security features
+
+More potentially unsafe operations taint their results for improved
+security.
+
+The C<passwd> and C<shell> fields returned by the getpwent(), getpwnam(),
+and getpwuid() are now tainted, because the user can affect their own
+encrypted password and login shell.
+
+The variable modified by shmread(), and messages returned by msgrcv()
+(and its object-oriented interface IPC::SysV::Msg::rcv) are also tainted,
+because other untrusted processes can modify messages and shared memory
+segments for their own nefarious purposes.
+
+=head2 More functional bareword prototype (*)
+
+Bareword prototypes have been rationalized to enable them to be used
+to override builtins that accept barewords and interpret them in
+a special way, such as C<require> or C<do>.
+
+Arguments prototyped as C<*> will now be visible within the subroutine
+as either a simple scalar or as a reference to a typeglob.
+See L<perlsub/Prototypes>.
+
+=head2 C<require> and C<do> may be overridden
+
+C<require> and C<do 'file'> operations may be overridden locally
+by importing subroutines of the same name into the current package
+(or globally by importing them into the CORE::GLOBAL:: namespace).
+Overriding C<require> will also affect C<use>, provided the override
+is visible at compile-time.
+See L<perlsub/"Overriding Built-in Functions">.
+
+=head2 $^X variables may now have names longer than one character
+
+Formerly, $^X was synonymous with ${"\cX"}, but $^XY was a syntax
+error. Now variable names that begin with a control character may be
+arbitrarily long. However, for compatibility reasons, these variables
+I<must> be written with explicit braces, as C<${^XY}> for example.
+C<${^XYZ}> is synonymous with ${"\cXYZ"}. Variable names with more
+than one control character, such as C<${^XY^Z}>, are illegal.
+
+The old syntax has not changed. As before, `^X' may be either a
+literal control-X character or the two-character sequence `caret' plus
+`X'. When braces are omitted, the variable name stops after the
+control character. Thus C<"$^XYZ"> continues to be synonymous with
+C<$^X . "YZ"> as before.
+
+As before, lexical variables may not have names beginning with control
+characters. As before, variables whose names begin with a control
+character are always forced to be in package `main'. All such variables
+are reserved for future extensions, except those that begin with
+C<^_>, which may be used by user programs and are guaranteed not to
+acquire special meaning in any future version of Perl.
+
+=head2 New variable $^C reflects C<-c> switch
+
+C<$^C> has a boolean value that reflects whether perl is being run
+in compile-only mode (i.e. via the C<-c> switch). Since
+BEGIN blocks are executed under such conditions, this variable
+enables perl code to determine whether actions that make sense
+only during normal running are warranted. See L<perlvar>.
+
+=head2 New variable $^V contains Perl version as a string
+
+C<$^V> contains the Perl version number as a string composed of
+characters whose ordinals match the version numbers, i.e. v5.6.0.
+This may be used in string comparisons.
+
+See C<Support for strings represented as a vector of ordinals> for an
+example.
+
+=head2 Optional Y2K warnings
+
+If Perl is built with the cpp macro C<PERL_Y2KWARN> defined,
+it emits optional warnings when concatenating the number 19
+with another number.
+
+This behavior must be specifically enabled when running Configure.
+See F<INSTALL> and F<README.Y2K>.
+
+=head2 Arrays now always interpolate into double-quoted strings
+
+In double-quoted strings, arrays now interpolate, no matter what. The
+behavior in earlier versions of perl 5 was that arrays would interpolate
+into strings if the array had been mentioned before the string was
+compiled, and otherwise Perl would raise a fatal compile-time error.
+In versions 5.000 through 5.003, the error was
+
+ Literal @example now requires backslash
+
+In versions 5.004_01 through 5.6.0, the error was
+
+ In string, @example now must be written as \@example
+
+The idea here was to get people into the habit of writing
+C<"fred\@example.com"> when they wanted a literal C<@> sign, just as
+they have always written C<"Give me back my \$5"> when they wanted a
+literal C<$> sign.
+
+Starting with 5.6.1, when Perl now sees an C<@> sign in a
+double-quoted string, it I<always> attempts to interpolate an array,
+regardless of whether or not the array has been used or declared
+already. The fatal error has been downgraded to an optional warning:
+
+ Possible unintended interpolation of @example in string
+
+This warns you that C<"fred@example.com"> is going to turn into
+C<fred.com> if you don't backslash the C<@>.
+See http://www.plover.com/~mjd/perl/at-error.html for more details
+about the history here.
+
+=head2 @- and @+ provide starting/ending offsets of regex matches
+
+The new magic variables @- and @+ provide the starting and ending
+offsets, respectively, of $&, $1, $2, etc. See L<perlvar> for
+details.
+
+=head1 Modules and Pragmata
+
+=head2 Modules
+
+=over 4
+
+=item attributes
+
+While used internally by Perl as a pragma, this module also
+provides a way to fetch subroutine and variable attributes.
+See L<attributes>.
+
+=item B
+
+The Perl Compiler suite has been extensively reworked for this
+release. More of the standard Perl test suite passes when run
+under the Compiler, but there is still a significant way to
+go to achieve production quality compiled executables.
+
+ NOTE: The Compiler suite remains highly experimental. The
+ generated code may not be correct, even when it manages to execute
+ without errors.
+
+=item Benchmark
+
+Overall, Benchmark results exhibit lower average error and better timing
+accuracy.
+
+You can now run tests for I<n> seconds instead of guessing the right
+number of tests to run: e.g., timethese(-5, ...) will run each
+code for at least 5 CPU seconds. Zero as the "number of repetitions"
+means "for at least 3 CPU seconds". The output format has also
+changed. For example:
+
+ use Benchmark;$x=3;timethese(-5,{a=>sub{$x*$x},b=>sub{$x**2}})
+
+will now output something like this:
+
+ Benchmark: running a, b, each for at least 5 CPU seconds...
+ a: 5 wallclock secs ( 5.77 usr + 0.00 sys = 5.77 CPU) @ 200551.91/s (n=1156516)
+ b: 4 wallclock secs ( 5.00 usr + 0.02 sys = 5.02 CPU) @ 159605.18/s (n=800686)
+
+New features: "each for at least N CPU seconds...", "wallclock secs",
+and the "@ operations/CPU second (n=operations)".
+
+timethese() now returns a reference to a hash of Benchmark objects containing
+the test results, keyed on the names of the tests.
+
+timethis() now returns the iterations field in the Benchmark result object
+instead of 0.
+
+timethese(), timethis(), and the new cmpthese() (see below) can also take
+a format specifier of 'none' to suppress output.
+
+A new function countit() is just like timeit() except that it takes a
+TIME instead of a COUNT.
+
+A new function cmpthese() prints a chart comparing the results of each test
+returned from a timethese() call. For each possible pair of tests, the
+percentage speed difference (iters/sec or seconds/iter) is shown.
+
+For other details, see L<Benchmark>.
+
+=item ByteLoader
+
+The ByteLoader is a dedicated extension to generate and run
+Perl bytecode. See L<ByteLoader>.
+
+=item constant
+
+References can now be used.
+
+The new version also allows a leading underscore in constant names, but
+disallows a double leading underscore (as in "__LINE__"). Some other names
+are disallowed or warned against, including BEGIN, END, etc. Some names
+which were forced into main:: used to fail silently in some cases; now they're
+fatal (outside of main::) and an optional warning (inside of main::).
+The ability to detect whether a constant had been set with a given name has
+been added.
+
+See L<constant>.
+
+=item charnames
+
+This pragma implements the C<\N> string escape. See L<charnames>.
+
+=item Data::Dumper
+
+A C<Maxdepth> setting can be specified to avoid venturing
+too deeply into deep data structures. See L<Data::Dumper>.
+
+The XSUB implementation of Dump() is now automatically called if the
+C<Useqq> setting is not in use.
+
+Dumping C<qr//> objects works correctly.
+
+=item DB
+
+C<DB> is an experimental module that exposes a clean abstraction
+to Perl's debugging API.
+
+=item DB_File
+
+DB_File can now be built with Berkeley DB versions 1, 2 or 3.
+See C<ext/DB_File/Changes>.
+
+=item Devel::DProf
+
+Devel::DProf, a Perl source code profiler has been added. See
+L<Devel::DProf> and L<dprofpp>.
+
+=item Devel::Peek
+
+The Devel::Peek module provides access to the internal representation
+of Perl variables and data. It is a data debugging tool for the XS programmer.
+
+=item Dumpvalue
+
+The Dumpvalue module provides screen dumps of Perl data.
+
+=item DynaLoader
+
+DynaLoader now supports a dl_unload_file() function on platforms that
+support unloading shared objects using dlclose().
+
+Perl can also optionally arrange to unload all extension shared objects
+loaded by Perl. To enable this, build Perl with the Configure option
+C<-Accflags=-DDL_UNLOAD_ALL_AT_EXIT>. (This maybe useful if you are
+using Apache with mod_perl.)
+
+=item English
+
+$PERL_VERSION now stands for C<$^V> (a string value) rather than for C<$]>
+(a numeric value).
+
+=item Env
+
+Env now supports accessing environment variables like PATH as array
+variables.
+
+=item Fcntl
+
+More Fcntl constants added: F_SETLK64, F_SETLKW64, O_LARGEFILE for
+large file (more than 4GB) access (NOTE: the O_LARGEFILE is
+automatically added to sysopen() flags if large file support has been
+configured, as is the default), Free/Net/OpenBSD locking behaviour
+flags F_FLOCK, F_POSIX, Linux F_SHLCK, and O_ACCMODE: the combined
+mask of O_RDONLY, O_WRONLY, and O_RDWR. The seek()/sysseek()
+constants SEEK_SET, SEEK_CUR, and SEEK_END are available via the
+C<:seek> tag. The chmod()/stat() S_IF* constants and S_IS* functions
+are available via the C<:mode> tag.
+
+=item File::Compare
+
+A compare_text() function has been added, which allows custom
+comparison functions. See L<File::Compare>.
+
+=item File::Find
+
+File::Find now works correctly when the wanted() function is either
+autoloaded or is a symbolic reference.
+
+A bug that caused File::Find to lose track of the working directory
+when pruning top-level directories has been fixed.
+
+File::Find now also supports several other options to control its
+behavior. It can follow symbolic links if the C<follow> option is
+specified. Enabling the C<no_chdir> option will make File::Find skip
+changing the current directory when walking directories. The C<untaint>
+flag can be useful when running with taint checks enabled.
+
+See L<File::Find>.
+
+=item File::Glob
+
+This extension implements BSD-style file globbing. By default,
+it will also be used for the internal implementation of the glob()
+operator. See L<File::Glob>.
+
+=item File::Spec
+
+New methods have been added to the File::Spec module: devnull() returns
+the name of the null device (/dev/null on Unix) and tmpdir() the name of
+the temp directory (normally /tmp on Unix). There are now also methods
+to convert between absolute and relative filenames: abs2rel() and
+rel2abs(). For compatibility with operating systems that specify volume
+names in file paths, the splitpath(), splitdir(), and catdir() methods
+have been added.
+
+=item File::Spec::Functions
+
+The new File::Spec::Functions modules provides a function interface
+to the File::Spec module. Allows shorthand
+
+ $fullname = catfile($dir1, $dir2, $file);
+
+instead of
+
+ $fullname = File::Spec->catfile($dir1, $dir2, $file);
+
+=item Getopt::Long
+
+Getopt::Long licensing has changed to allow the Perl Artistic License
+as well as the GPL. It used to be GPL only, which got in the way of
+non-GPL applications that wanted to use Getopt::Long.
+
+Getopt::Long encourages the use of Pod::Usage to produce help
+messages. For example:
+
+ use Getopt::Long;
+ use Pod::Usage;
+ my $man = 0;
+ my $help = 0;
+ GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
+ pod2usage(1) if $help;
+ pod2usage(-exitstatus => 0, -verbose => 2) if $man;
+
+ __END__
+
+ =head1 NAME
+
+ sample - Using Getopt::Long and Pod::Usage
+
+ =head1 SYNOPSIS
+
+ sample [options] [file ...]
+
+ Options:
+ -help brief help message
+ -man full documentation
+
+ =head1 OPTIONS
+
+ =over 8
+
+ =item B<-help>
+
+ Print a brief help message and exits.
+
+ =item B<-man>
+
+ Prints the manual page and exits.
+
+ =back
+
+ =head1 DESCRIPTION
+
+ B<This program> will read the given input file(s) and do something
+ useful with the contents thereof.
+
+ =cut
+
+See L<Pod::Usage> for details.
+
+A bug that prevented the non-option call-back <> from being
+specified as the first argument has been fixed.
+
+To specify the characters < and > as option starters, use ><. Note,
+however, that changing option starters is strongly deprecated.
+
+=item IO
+
+write() and syswrite() will now accept a single-argument
+form of the call, for consistency with Perl's syswrite().
+
+You can now create a TCP-based IO::Socket::INET without forcing
+a connect attempt. This allows you to configure its options
+(like making it non-blocking) and then call connect() manually.
+
+A bug that prevented the IO::Socket::protocol() accessor
+from ever returning the correct value has been corrected.
+
+IO::Socket::connect now uses non-blocking IO instead of alarm()
+to do connect timeouts.
+
+IO::Socket::accept now uses select() instead of alarm() for doing
+timeouts.
+
+IO::Socket::INET->new now sets $! correctly on failure. $@ is
+still set for backwards compatibility.
+
+=item JPL
+
+Java Perl Lingo is now distributed with Perl. See jpl/README
+for more information.
+
+=item lib
+
+C<use lib> now weeds out any trailing duplicate entries.
+C<no lib> removes all named entries.
+
+=item Math::BigInt
+
+The bitwise operations C<<< << >>>, C<<< >> >>>, C<&>, C<|>,
+and C<~> are now supported on bigints.
+
+=item Math::Complex
+
+The accessor methods Re, Im, arg, abs, rho, and theta can now also
+act as mutators (accessor $z->Re(), mutator $z->Re(3)).
+
+The class method C<display_format> and the corresponding object method
+C<display_format>, in addition to accepting just one argument, now can
+also accept a parameter hash. Recognized keys of a parameter hash are
+C<"style">, which corresponds to the old one parameter case, and two
+new parameters: C<"format">, which is a printf()-style format string
+(defaults usually to C<"%.15g">, you can revert to the default by
+setting the format string to C<undef>) used for both parts of a
+complex number, and C<"polar_pretty_print"> (defaults to true),
+which controls whether an attempt is made to try to recognize small
+multiples and rationals of pi (2pi, pi/2) at the argument (angle) of a
+polar complex number.
+
+The potentially disruptive change is that in list context both methods
+now I<return the parameter hash>, instead of only the value of the
+C<"style"> parameter.
+
+=item Math::Trig
+
+A little bit of radial trigonometry (cylindrical and spherical),
+radial coordinate conversions, and the great circle distance were added.
+
+=item Pod::Parser, Pod::InputObjects
+
+Pod::Parser is a base class for parsing and selecting sections of
+pod documentation from an input stream. This module takes care of
+identifying pod paragraphs and commands in the input and hands off the
+parsed paragraphs and commands to user-defined methods which are free
+to interpret or translate them as they see fit.
+
+Pod::InputObjects defines some input objects needed by Pod::Parser, and
+for advanced users of Pod::Parser that need more about a command besides
+its name and text.
+
+As of release 5.6.0 of Perl, Pod::Parser is now the officially sanctioned
+"base parser code" recommended for use by all pod2xxx translators.
+Pod::Text (pod2text) and Pod::Man (pod2man) have already been converted
+to use Pod::Parser and efforts to convert Pod::HTML (pod2html) are already
+underway. For any questions or comments about pod parsing and translating
+issues and utilities, please use the pod-people@perl.org mailing list.
+
+For further information, please see L<Pod::Parser> and L<Pod::InputObjects>.
+
+=item Pod::Checker, podchecker
+
+This utility checks pod files for correct syntax, according to
+L<perlpod>. Obvious errors are flagged as such, while warnings are
+printed for mistakes that can be handled gracefully. The checklist is
+not complete yet. See L<Pod::Checker>.
+
+=item Pod::ParseUtils, Pod::Find
+
+These modules provide a set of gizmos that are useful mainly for pod
+translators. L<Pod::Find|Pod::Find> traverses directory structures and
+returns found pod files, along with their canonical names (like
+C<File::Spec::Unix>). L<Pod::ParseUtils|Pod::ParseUtils> contains
+B<Pod::List> (useful for storing pod list information), B<Pod::Hyperlink>
+(for parsing the contents of C<LE<lt>E<gt>> sequences) and B<Pod::Cache>
+(for caching information about pod files, e.g., link nodes).
+
+=item Pod::Select, podselect
+
+Pod::Select is a subclass of Pod::Parser which provides a function
+named "podselect()" to filter out user-specified sections of raw pod
+documentation from an input stream. podselect is a script that provides
+access to Pod::Select from other scripts to be used as a filter.
+See L<Pod::Select>.
+
+=item Pod::Usage, pod2usage
+
+Pod::Usage provides the function "pod2usage()" to print usage messages for
+a Perl script based on its embedded pod documentation. The pod2usage()
+function is generally useful to all script authors since it lets them
+write and maintain a single source (the pods) for documentation, thus
+removing the need to create and maintain redundant usage message text
+consisting of information already in the pods.
+
+There is also a pod2usage script which can be used from other kinds of
+scripts to print usage messages from pods (even for non-Perl scripts
+with pods embedded in comments).
+
+For details and examples, please see L<Pod::Usage>.
+
+=item Pod::Text and Pod::Man
+
+Pod::Text has been rewritten to use Pod::Parser. While pod2text() is
+still available for backwards compatibility, the module now has a new
+preferred interface. See L<Pod::Text> for the details. The new Pod::Text
+module is easily subclassed for tweaks to the output, and two such
+subclasses (Pod::Text::Termcap for man-page-style bold and underlining
+using termcap information, and Pod::Text::Color for markup with ANSI color
+sequences) are now standard.
+
+pod2man has been turned into a module, Pod::Man, which also uses
+Pod::Parser. In the process, several outstanding bugs related to quotes
+in section headers, quoting of code escapes, and nested lists have been
+fixed. pod2man is now a wrapper script around this module.
+
+=item SDBM_File
+
+An EXISTS method has been added to this module (and sdbm_exists() has
+been added to the underlying sdbm library), so one can now call exists
+on an SDBM_File tied hash and get the correct result, rather than a
+runtime error.
+
+A bug that may have caused data loss when more than one disk block
+happens to be read from the database in a single FETCH() has been
+fixed.
+
+=item Sys::Syslog
+
+Sys::Syslog now uses XSUBs to access facilities from syslog.h so it
+no longer requires syslog.ph to exist.
+
+=item Sys::Hostname
+
+Sys::Hostname now uses XSUBs to call the C library's gethostname() or
+uname() if they exist.
+
+=item Term::ANSIColor
+
+Term::ANSIColor is a very simple module to provide easy and readable
+access to the ANSI color and highlighting escape sequences, supported by
+most ANSI terminal emulators. It is now included standard.
+
+=item Time::Local
+
+The timelocal() and timegm() functions used to silently return bogus
+results when the date fell outside the machine's integer range. They
+now consistently croak() if the date falls in an unsupported range.
+
+=item Win32
+
+The error return value in list context has been changed for all functions
+that return a list of values. Previously these functions returned a list
+with a single element C<undef> if an error occurred. Now these functions
+return the empty list in these situations. This applies to the following
+functions:
+
+ Win32::FsType
+ Win32::GetOSVersion
+
+The remaining functions are unchanged and continue to return C<undef> on
+error even in list context.
+
+The Win32::SetLastError(ERROR) function has been added as a complement
+to the Win32::GetLastError() function.
+
+The new Win32::GetFullPathName(FILENAME) returns the full absolute
+pathname for FILENAME in scalar context. In list context it returns
+a two-element list containing the fully qualified directory name and
+the filename. See L<Win32>.
+
+=item XSLoader
+
+The XSLoader extension is a simpler alternative to DynaLoader.
+See L<XSLoader>.
+
+=item DBM Filters
+
+A new feature called "DBM Filters" has been added to all the
+DBM modules--DB_File, GDBM_File, NDBM_File, ODBM_File, and SDBM_File.
+DBM Filters add four new methods to each DBM module:
+
+ filter_store_key
+ filter_store_value
+ filter_fetch_key
+ filter_fetch_value
+
+These can be used to filter key-value pairs before the pairs are
+written to the database or just after they are read from the database.
+See L<perldbmfilter> for further information.
+
+=back
+
+=head2 Pragmata
+
+C<use attrs> is now obsolete, and is only provided for
+backward-compatibility. It's been replaced by the C<sub : attributes>
+syntax. See L<perlsub/"Subroutine Attributes"> and L<attributes>.
+
+Lexical warnings pragma, C<use warnings;>, to control optional warnings.
+See L<perllexwarn>.
+
+C<use filetest> to control the behaviour of filetests (C<-r> C<-w>
+...). Currently only one subpragma implemented, "use filetest
+'access';", that uses access(2) or equivalent to check permissions
+instead of using stat(2) as usual. This matters in filesystems
+where there are ACLs (access control lists): the stat(2) might lie,
+but access(2) knows better.
+
+The C<open> pragma can be used to specify default disciplines for
+handle constructors (e.g. open()) and for qx//. The two
+pseudo-disciplines C<:raw> and C<:crlf> are currently supported on
+DOS-derivative platforms (i.e. where binmode is not a no-op).
+See also L</"binmode() can be used to set :crlf and :raw modes">.
+
+=head1 Utility Changes
+
+=head2 dprofpp
+
+C<dprofpp> is used to display profile data generated using C<Devel::DProf>.
+See L<dprofpp>.
+
+=head2 find2perl
+
+The C<find2perl> utility now uses the enhanced features of the File::Find
+module. The -depth and -follow options are supported. Pod documentation
+is also included in the script.
+
+=head2 h2xs
+
+The C<h2xs> tool can now work in conjunction with C<C::Scan> (available
+from CPAN) to automatically parse real-life header files. The C<-M>,
+C<-a>, C<-k>, and C<-o> options are new.
+
+=head2 perlcc
+
+C<perlcc> now supports the C and Bytecode backends. By default,
+it generates output from the simple C backend rather than the
+optimized C backend.
+
+Support for non-Unix platforms has been improved.
+
+=head2 perldoc
+
+C<perldoc> has been reworked to avoid possible security holes.
+It will not by default let itself be run as the superuser, but you
+may still use the B<-U> switch to try to make it drop privileges
+first.
+
+=head2 The Perl Debugger
+
+Many bug fixes and enhancements were added to F<perl5db.pl>, the
+Perl debugger. The help documentation was rearranged. New commands
+include C<< < ? >>, C<< > ? >>, and C<< { ? >> to list out current
+actions, C<man I<docpage>> to run your doc viewer on some perl
+docset, and support for quoted options. The help information was
+rearranged, and should be viewable once again if you're using B<less>
+as your pager. A serious security hole was plugged--you should
+immediately remove all older versions of the Perl debugger as
+installed in previous releases, all the way back to perl3, from
+your system to avoid being bitten by this.
+
+=head1 Improved Documentation
+
+Many of the platform-specific README files are now part of the perl
+installation. See L<perl> for the complete list.
+
+=over 4
+
+=item perlapi.pod
+
+The official list of public Perl API functions.
+
+=item perlboot.pod
+
+A tutorial for beginners on object-oriented Perl.
+
+=item perlcompile.pod
+
+An introduction to using the Perl Compiler suite.
+
+=item perldbmfilter.pod
+
+A howto document on using the DBM filter facility.
+
+=item perldebug.pod
+
+All material unrelated to running the Perl debugger, plus all
+low-level guts-like details that risked crushing the casual user
+of the debugger, have been relocated from the old manpage to the
+next entry below.
+
+=item perldebguts.pod
+
+This new manpage contains excessively low-level material not related
+to the Perl debugger, but slightly related to debugging Perl itself.
+It also contains some arcane internal details of how the debugging
+process works that may only be of interest to developers of Perl
+debuggers.
+
+=item perlfork.pod
+
+Notes on the fork() emulation currently available for the Windows platform.
+
+=item perlfilter.pod
+
+An introduction to writing Perl source filters.
+
+=item perlhack.pod
+
+Some guidelines for hacking the Perl source code.
+
+=item perlintern.pod
+
+A list of internal functions in the Perl source code.
+(List is currently empty.)
+
+=item perllexwarn.pod
+
+Introduction and reference information about lexically scoped
+warning categories.
+
+=item perlnumber.pod
+
+Detailed information about numbers as they are represented in Perl.
+
+=item perlopentut.pod
+
+A tutorial on using open() effectively.
+
+=item perlreftut.pod
+
+A tutorial that introduces the essentials of references.
+
+=item perltootc.pod
+
+A tutorial on managing class data for object modules.
+
+=item perltodo.pod
+
+Discussion of the most often wanted features that may someday be
+supported in Perl.
+
+=item perlunicode.pod
+
+An introduction to Unicode support features in Perl.
+
+=back
+
+=head1 Performance enhancements
+
+=head2 Simple sort() using { $a <=> $b } and the like are optimized
+
+Many common sort() operations using a simple inlined block are now
+optimized for faster performance.
+
+=head2 Optimized assignments to lexical variables
+
+Certain operations in the RHS of assignment statements have been
+optimized to directly set the lexical variable on the LHS,
+eliminating redundant copying overheads.
+
+=head2 Faster subroutine calls
+
+Minor changes in how subroutine calls are handled internally
+provide marginal improvements in performance.
+
+=head2 delete(), each(), values() and hash iteration are faster
+
+The hash values returned by delete(), each(), values() and hashes in a
+list context are the actual values in the hash, instead of copies.
+This results in significantly better performance, because it eliminates
+needless copying in most situations.
+
+=head1 Installation and Configuration Improvements
+
+=head2 -Dusethreads means something different
+
+The -Dusethreads flag now enables the experimental interpreter-based thread
+support by default. To get the flavor of experimental threads that was in
+5.005 instead, you need to run Configure with "-Dusethreads -Duse5005threads".
+
+As of v5.6.0, interpreter-threads support is still lacking a way to
+create new threads from Perl (i.e., C<use Thread;> will not work with
+interpreter threads). C<use Thread;> continues to be available when you
+specify the -Duse5005threads option to Configure, bugs and all.
+
+ NOTE: Support for threads continues to be an experimental feature.
+ Interfaces and implementation are subject to sudden and drastic changes.
+
+=head2 New Configure flags
+
+The following new flags may be enabled on the Configure command line
+by running Configure with C<-Dflag>.
+
+ usemultiplicity
+ usethreads useithreads (new interpreter threads: no Perl API yet)
+ usethreads use5005threads (threads as they were in 5.005)
+
+ use64bitint (equal to now deprecated 'use64bits')
+ use64bitall
+
+ uselongdouble
+ usemorebits
+ uselargefiles
+ usesocks (only SOCKS v5 supported)
+
+=head2 Threadedness and 64-bitness now more daring
+
+The Configure options enabling the use of threads and the use of
+64-bitness are now more daring in the sense that they no more have an
+explicit list of operating systems of known threads/64-bit
+capabilities. In other words: if your operating system has the
+necessary APIs and datatypes, you should be able just to go ahead and
+use them, for threads by Configure -Dusethreads, and for 64 bits
+either explicitly by Configure -Duse64bitint or implicitly if your
+system has 64-bit wide datatypes. See also L<"64-bit support">.
+
+=head2 Long Doubles
+
+Some platforms have "long doubles", floating point numbers of even
+larger range than ordinary "doubles". To enable using long doubles for
+Perl's scalars, use -Duselongdouble.
+
+=head2 -Dusemorebits
+
+You can enable both -Duse64bitint and -Duselongdouble with -Dusemorebits.
+See also L<"64-bit support">.
+
+=head2 -Duselargefiles
+
+Some platforms support system APIs that are capable of handling large files
+(typically, files larger than two gigabytes). Perl will try to use these
+APIs if you ask for -Duselargefiles.
+
+See L<"Large file support"> for more information.
+
+=head2 installusrbinperl
+
+You can use "Configure -Uinstallusrbinperl" which causes installperl
+to skip installing perl also as /usr/bin/perl. This is useful if you
+prefer not to modify /usr/bin for some reason or another but harmful
+because many scripts assume to find Perl in /usr/bin/perl.
+
+=head2 SOCKS support
+
+You can use "Configure -Dusesocks" which causes Perl to probe
+for the SOCKS proxy protocol library (v5, not v4). For more information
+on SOCKS, see:
+
+ http://www.socks.nec.com/
+
+=head2 C<-A> flag
+
+You can "post-edit" the Configure variables using the Configure C<-A>
+switch. The editing happens immediately after the platform specific
+hints files have been processed but before the actual configuration
+process starts. Run C<Configure -h> to find out the full C<-A> syntax.
+
+=head2 Enhanced Installation Directories
+
+The installation structure has been enriched to improve the support
+for maintaining multiple versions of perl, to provide locations for
+vendor-supplied modules, scripts, and manpages, and to ease maintenance
+of locally-added modules, scripts, and manpages. See the section on
+Installation Directories in the INSTALL file for complete details.
+For most users building and installing from source, the defaults should
+be fine.
+
+If you previously used C<Configure -Dsitelib> or C<-Dsitearch> to set
+special values for library directories, you might wish to consider using
+the new C<-Dsiteprefix> setting instead. Also, if you wish to re-use a
+config.sh file from an earlier version of perl, you should be sure to
+check that Configure makes sensible choices for the new directories.
+See INSTALL for complete details.
+
+=head1 Platform specific changes
+
+=head2 Supported platforms
+
+=over 4
+
+=item *
+
+The Mach CThreads (NEXTSTEP, OPENSTEP) are now supported by the Thread
+extension.
+
+=item *
+
+GNU/Hurd is now supported.
+
+=item *
+
+Rhapsody/Darwin is now supported.
+
+=item *
+
+EPOC is now supported (on Psion 5).
+
+=item *
+
+The cygwin port (formerly cygwin32) has been greatly improved.
+
+=back
+
+=head2 DOS
+
+=over 4
+
+=item *
+
+Perl now works with djgpp 2.02 (and 2.03 alpha).
+
+=item *
+
+Environment variable names are not converted to uppercase any more.
+
+=item *
+
+Incorrect exit codes from backticks have been fixed.
+
+=item *
+
+This port continues to use its own builtin globbing (not File::Glob).
+
+=back
+
+=head2 OS390 (OpenEdition MVS)
+
+Support for this EBCDIC platform has not been renewed in this release.
+There are difficulties in reconciling Perl's standardization on UTF-8
+as its internal representation for characters with the EBCDIC character
+set, because the two are incompatible.
+
+It is unclear whether future versions will renew support for this
+platform, but the possibility exists.
+
+=head2 VMS
+
+Numerous revisions and extensions to configuration, build, testing, and
+installation process to accommodate core changes and VMS-specific options.
+
+Expand %ENV-handling code to allow runtime mapping to logical names,
+CLI symbols, and CRTL environ array.
+
+Extension of subprocess invocation code to accept filespecs as command
+"verbs".
+
+Add to Perl command line processing the ability to use default file types and
+to recognize Unix-style C<2E<gt>&1>.
+
+Expansion of File::Spec::VMS routines, and integration into ExtUtils::MM_VMS.
+
+Extension of ExtUtils::MM_VMS to handle complex extensions more flexibly.
+
+Barewords at start of Unix-syntax paths may be treated as text rather than
+only as logical names.
+
+Optional secure translation of several logical names used internally by Perl.
+
+Miscellaneous bugfixing and porting of new core code to VMS.
+
+Thanks are gladly extended to the many people who have contributed VMS
+patches, testing, and ideas.
+
+=head2 Win32
+
+Perl can now emulate fork() internally, using multiple interpreters running
+in different concurrent threads. This support must be enabled at build
+time. See L<perlfork> for detailed information.
+
+When given a pathname that consists only of a drivename, such as C<A:>,
+opendir() and stat() now use the current working directory for the drive
+rather than the drive root.
+
+The builtin XSUB functions in the Win32:: namespace are documented. See
+L<Win32>.
+
+$^X now contains the full path name of the running executable.
+
+A Win32::GetLongPathName() function is provided to complement
+Win32::GetFullPathName() and Win32::GetShortPathName(). See L<Win32>.
+
+POSIX::uname() is supported.
+
+system(1,...) now returns true process IDs rather than process
+handles. kill() accepts any real process id, rather than strictly
+return values from system(1,...).
+
+For better compatibility with Unix, C<kill(0, $pid)> can now be used to
+test whether a process exists.
+
+The C<Shell> module is supported.
+
+Better support for building Perl under command.com in Windows 95
+has been added.
+
+Scripts are read in binary mode by default to allow ByteLoader (and
+the filter mechanism in general) to work properly. For compatibility,
+the DATA filehandle will be set to text mode if a carriage return is
+detected at the end of the line containing the __END__ or __DATA__
+token; if not, the DATA filehandle will be left open in binary mode.
+Earlier versions always opened the DATA filehandle in text mode.
+
+The glob() operator is implemented via the C<File::Glob> extension,
+which supports glob syntax of the C shell. This increases the flexibility
+of the glob() operator, but there may be compatibility issues for
+programs that relied on the older globbing syntax. If you want to
+preserve compatibility with the older syntax, you might want to run
+perl with C<-MFile::DosGlob>. For details and compatibility information,
+see L<File::Glob>.
+
+=head1 Significant bug fixes
+
+=head2 <HANDLE> on empty files
+
+With C<$/> set to C<undef>, "slurping" an empty file returns a string of
+zero length (instead of C<undef>, as it used to) the first time the
+HANDLE is read after C<$/> is set to C<undef>. Further reads yield
+C<undef>.
+
+This means that the following will append "foo" to an empty file (it used
+to do nothing):
+
+ perl -0777 -pi -e 's/^/foo/' empty_file
+
+The behaviour of:
+
+ perl -pi -e 's/^/foo/' empty_file
+
+is unchanged (it continues to leave the file empty).
+
+=head2 C<eval '...'> improvements
+
+Line numbers (as reflected by caller() and most diagnostics) within
+C<eval '...'> were often incorrect where here documents were involved.
+This has been corrected.
+
+Lexical lookups for variables appearing in C<eval '...'> within
+functions that were themselves called within an C<eval '...'> were
+searching the wrong place for lexicals. The lexical search now
+correctly ends at the subroutine's block boundary.
+
+The use of C<return> within C<eval {...}> caused $@ not to be reset
+correctly when no exception occurred within the eval. This has
+been fixed.
+
+Parsing of here documents used to be flawed when they appeared as
+the replacement expression in C<eval 's/.../.../e'>. This has
+been fixed.
+
+=head2 All compilation errors are true errors
+
+Some "errors" encountered at compile time were by necessity
+generated as warnings followed by eventual termination of the
+program. This enabled more such errors to be reported in a
+single run, rather than causing a hard stop at the first error
+that was encountered.
+
+The mechanism for reporting such errors has been reimplemented
+to queue compile-time errors and report them at the end of the
+compilation as true errors rather than as warnings. This fixes
+cases where error messages leaked through in the form of warnings
+when code was compiled at run time using C<eval STRING>, and
+also allows such errors to be reliably trapped using C<eval "...">.
+
+=head2 Implicitly closed filehandles are safer
+
+Sometimes implicitly closed filehandles (as when they are localized,
+and Perl automatically closes them on exiting the scope) could
+inadvertently set $? or $!. This has been corrected.
+
+
+=head2 Behavior of list slices is more consistent
+
+When taking a slice of a literal list (as opposed to a slice of
+an array or hash), Perl used to return an empty list if the
+result happened to be composed of all undef values.
+
+The new behavior is to produce an empty list if (and only if)
+the original list was empty. Consider the following example:
+
+ @a = (1,undef,undef,2)[2,1,2];
+
+The old behavior would have resulted in @a having no elements.
+The new behavior ensures it has three undefined elements.
+
+Note in particular that the behavior of slices of the following
+cases remains unchanged:
+
+ @a = ()[1,2];
+ @a = (getpwent)[7,0];
+ @a = (anything_returning_empty_list())[2,1,2];
+ @a = @b[2,1,2];
+ @a = @c{'a','b','c'};
+
+See L<perldata>.
+
+=head2 C<(\$)> prototype and C<$foo{a}>
+
+A scalar reference prototype now correctly allows a hash or
+array element in that slot.
+
+=head2 C<goto &sub> and AUTOLOAD
+
+The C<goto &sub> construct works correctly when C<&sub> happens
+to be autoloaded.
+
+=head2 C<-bareword> allowed under C<use integer>
+
+The autoquoting of barewords preceded by C<-> did not work
+in prior versions when the C<integer> pragma was enabled.
+This has been fixed.
+
+=head2 Failures in DESTROY()
+
+When code in a destructor threw an exception, it went unnoticed
+in earlier versions of Perl, unless someone happened to be
+looking in $@ just after the point the destructor happened to
+run. Such failures are now visible as warnings when warnings are
+enabled.
+
+=head2 Locale bugs fixed
+
+printf() and sprintf() previously reset the numeric locale
+back to the default "C" locale. This has been fixed.
+
+Numbers formatted according to the local numeric locale
+(such as using a decimal comma instead of a decimal dot) caused
+"isn't numeric" warnings, even while the operations accessing
+those numbers produced correct results. These warnings have been
+discontinued.
+
+=head2 Memory leaks
+
+The C<eval 'return sub {...}'> construct could sometimes leak
+memory. This has been fixed.
+
+Operations that aren't filehandle constructors used to leak memory
+when used on invalid filehandles. This has been fixed.
+
+Constructs that modified C<@_> could fail to deallocate values
+in C<@_> and thus leak memory. This has been corrected.
+
+=head2 Spurious subroutine stubs after failed subroutine calls
+
+Perl could sometimes create empty subroutine stubs when a
+subroutine was not found in the package. Such cases stopped
+later method lookups from progressing into base packages.
+This has been corrected.
+
+=head2 Taint failures under C<-U>
+
+When running in unsafe mode, taint violations could sometimes
+cause silent failures. This has been fixed.
+
+=head2 END blocks and the C<-c> switch
+
+Prior versions used to run BEGIN B<and> END blocks when Perl was
+run in compile-only mode. Since this is typically not the expected
+behavior, END blocks are not executed anymore when the C<-c> switch
+is used, or if compilation fails.
+
+See L</"Support for CHECK blocks"> for how to run things when the compile
+phase ends.
+
+=head2 Potential to leak DATA filehandles
+
+Using the C<__DATA__> token creates an implicit filehandle to
+the file that contains the token. It is the program's
+responsibility to close it when it is done reading from it.
+
+This caveat is now better explained in the documentation.
+See L<perldata>.
+
+=head1 New or Changed Diagnostics
+
+=over 4
+
+=item "%s" variable %s masks earlier declaration in same %s
+
+(W misc) A "my" or "our" variable has been redeclared in the current scope or statement,
+effectively eliminating all access to the previous instance. This is almost
+always a typographical error. Note that the earlier variable will still exist
+until the end of the scope or until all closure referents to it are
+destroyed.
+
+=item "my sub" not yet implemented
+
+(F) Lexically scoped subroutines are not yet implemented. Don't try that
+yet.
+
+=item "our" variable %s redeclared
+
+(W misc) You seem to have already declared the same global once before in the
+current lexical scope.
+
+=item '!' allowed only after types %s
+
+(F) The '!' is allowed in pack() and unpack() only after certain types.
+See L<perlfunc/pack>.
+
+=item / cannot take a count
+
+(F) You had an unpack template indicating a counted-length string,
+but you have also specified an explicit size for the string.
+See L<perlfunc/pack>.
+
+=item / must be followed by a, A or Z
+
+(F) You had an unpack template indicating a counted-length string,
+which must be followed by one of the letters a, A or Z
+to indicate what sort of string is to be unpacked.
+See L<perlfunc/pack>.
+
+=item / must be followed by a*, A* or Z*
+
+(F) You had a pack template indicating a counted-length string,
+Currently the only things that can have their length counted are a*, A* or Z*.
+See L<perlfunc/pack>.
+
+=item / must follow a numeric type
+
+(F) You had an unpack template that contained a '#',
+but this did not follow some numeric unpack specification.
+See L<perlfunc/pack>.
+
+=item /%s/: Unrecognized escape \\%c passed through
+
+(W regexp) You used a backslash-character combination which is not recognized
+by Perl. This combination appears in an interpolated variable or a
+C<'>-delimited regular expression. The character was understood literally.
+
+=item /%s/: Unrecognized escape \\%c in character class passed through
+
+(W regexp) You used a backslash-character combination which is not recognized
+by Perl inside character classes. The character was understood literally.
+
+=item /%s/ should probably be written as "%s"
+
+(W syntax) You have used a pattern where Perl expected to find a string,
+as in the first argument to C<join>. Perl will treat the true
+or false result of matching the pattern against $_ as the string,
+which is probably not what you had in mind.
+
+=item %s() called too early to check prototype
+
+(W prototype) You've called a function that has a prototype before the parser saw a
+definition or declaration for it, and Perl could not check that the call
+conforms to the prototype. You need to either add an early prototype
+declaration for the subroutine in question, or move the subroutine
+definition ahead of the call to get proper prototype checking. Alternatively,
+if you are certain that you're calling the function correctly, you may put
+an ampersand before the name to avoid the warning. See L<perlsub>.
+
+=item %s argument is not a HASH or ARRAY element
+
+(F) The argument to exists() must be a hash or array element, such as:
+
+ $foo{$bar}
+ $ref->{"susie"}[12]
+
+=item %s argument is not a HASH or ARRAY element or slice
+
+(F) The argument to delete() must be either a hash or array element, such as:
+
+ $foo{$bar}
+ $ref->{"susie"}[12]
+
+or a hash or array slice, such as:
+
+ @foo[$bar, $baz, $xyzzy]
+ @{$ref->[12]}{"susie", "queue"}
+
+=item %s argument is not a subroutine name
+
+(F) The argument to exists() for C<exists &sub> must be a subroutine
+name, and not a subroutine call. C<exists &sub()> will generate this error.
+
+=item %s package attribute may clash with future reserved word: %s
+
+(W reserved) A lowercase attribute name was used that had a package-specific handler.
+That name might have a meaning to Perl itself some day, even though it
+doesn't yet. Perhaps you should use a mixed-case attribute name, instead.
+See L<attributes>.
+
+=item (in cleanup) %s
+
+(W misc) This prefix usually indicates that a DESTROY() method raised
+the indicated exception. Since destructors are usually called by
+the system at arbitrary points during execution, and often a vast
+number of times, the warning is issued only once for any number
+of failures that would otherwise result in the same message being
+repeated.
+
+Failure of user callbacks dispatched using the C<G_KEEPERR> flag
+could also result in this warning. See L<perlcall/G_KEEPERR>.
+
+=item <> should be quotes
+
+(F) You wrote C<< require <file> >> when you should have written
+C<require 'file'>.
+
+=item Attempt to join self
+
+(F) You tried to join a thread from within itself, which is an
+impossible task. You may be joining the wrong thread, or you may
+need to move the join() to some other thread.
+
+=item Bad evalled substitution pattern
+
+(F) You've used the /e switch to evaluate the replacement for a
+substitution, but perl found a syntax error in the code to evaluate,
+most likely an unexpected right brace '}'.
+
+=item Bad realloc() ignored
+
+(S) An internal routine called realloc() on something that had never been
+malloc()ed in the first place. Mandatory, but can be disabled by
+setting environment variable C<PERL_BADFREE> to 1.
+
+=item Bareword found in conditional
+
+(W bareword) The compiler found a bareword where it expected a conditional,
+which often indicates that an || or && was parsed as part of the
+last argument of the previous construct, for example:
+
+ open FOO || die;
+
+It may also indicate a misspelled constant that has been interpreted
+as a bareword:
+
+ use constant TYPO => 1;
+ if (TYOP) { print "foo" }
+
+The C<strict> pragma is useful in avoiding such errors.
+
+=item Binary number > 0b11111111111111111111111111111111 non-portable
+
+(W portable) The binary number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems. See
+L<perlport> for more on portability concerns.
+
+=item Bit vector size > 32 non-portable
+
+(W portable) Using bit vector sizes larger than 32 is non-portable.
+
+=item Buffer overflow in prime_env_iter: %s
+
+(W internal) A warning peculiar to VMS. While Perl was preparing to iterate over
+%ENV, it encountered a logical name or symbol definition which was too long,
+so it was truncated to the string shown.
+
+=item Can't check filesystem of script "%s"
+
+(P) For some reason you can't check the filesystem of the script for nosuid.
+
+=item Can't declare class for non-scalar %s in "%s"
+
+(S) Currently, only scalar variables can declared with a specific class
+qualifier in a "my" or "our" declaration. The semantics may be extended
+for other types of variables in future.
+
+=item Can't declare %s in "%s"
+
+(F) Only scalar, array, and hash variables may be declared as "my" or
+"our" variables. They must have ordinary identifiers as names.
+
+=item Can't ignore signal CHLD, forcing to default
+
+(W signal) Perl has detected that it is being run with the SIGCHLD signal
+(sometimes known as SIGCLD) disabled. Since disabling this signal
+will interfere with proper determination of exit status of child
+processes, Perl has reset the signal to its default value.
+This situation typically indicates that the parent program under
+which Perl may be running (e.g., cron) is being very careless.
+
+=item Can't modify non-lvalue subroutine call
+
+(F) Subroutines meant to be used in lvalue context should be declared as
+such, see L<perlsub/"Lvalue subroutines">.
+
+=item Can't read CRTL environ
+
+(S) A warning peculiar to VMS. Perl tried to read an element of %ENV
+from the CRTL's internal environment array and discovered the array was
+missing. You need to figure out where your CRTL misplaced its environ
+or define F<PERL_ENV_TABLES> (see L<perlvms>) so that environ is not searched.
+
+=item Can't remove %s: %s, skipping file
+
+(S) You requested an inplace edit without creating a backup file. Perl
+was unable to remove the original file to replace it with the modified
+file. The file was left unmodified.
+
+=item Can't return %s from lvalue subroutine
+
+(F) Perl detected an attempt to return illegal lvalues (such
+as temporary or readonly values) from a subroutine used as an lvalue.
+This is not allowed.
+
+=item Can't weaken a nonreference
+
+(F) You attempted to weaken something that was not a reference. Only
+references can be weakened.
+
+=item Character class [:%s:] unknown
+
+(F) The class in the character class [: :] syntax is unknown.
+See L<perlre>.
+
+=item Character class syntax [%s] belongs inside character classes
+
+(W unsafe) The character class constructs [: :], [= =], and [. .] go
+I<inside> character classes, the [] are part of the construct,
+for example: /[012[:alpha:]345]/. Note that [= =] and [. .]
+are not currently implemented; they are simply placeholders for
+future extensions.
+
+=item Constant is not %s reference
+
+(F) A constant value (perhaps declared using the C<use constant> pragma)
+is being dereferenced, but it amounts to the wrong type of reference. The
+message indicates the type of reference that was expected. This usually
+indicates a syntax error in dereferencing the constant value.
+See L<perlsub/"Constant Functions"> and L<constant>.
+
+=item constant(%s): %s
+
+(F) The parser found inconsistencies either while attempting to define an
+overloaded constant, or when trying to find the character name specified
+in the C<\N{...}> escape. Perhaps you forgot to load the corresponding
+C<overload> or C<charnames> pragma? See L<charnames> and L<overload>.
+
+=item CORE::%s is not a keyword
+
+(F) The CORE:: namespace is reserved for Perl keywords.
+
+=item defined(@array) is deprecated
+
+(D) defined() is not usually useful on arrays because it checks for an
+undefined I<scalar> value. If you want to see if the array is empty,
+just use C<if (@array) { # not empty }> for example.
+
+=item defined(%hash) is deprecated
+
+(D) defined() is not usually useful on hashes because it checks for an
+undefined I<scalar> value. If you want to see if the hash is empty,
+just use C<if (%hash) { # not empty }> for example.
+
+=item Did not produce a valid header
+
+See Server error.
+
+=item (Did you mean "local" instead of "our"?)
+
+(W misc) Remember that "our" does not localize the declared global variable.
+You have declared it again in the same lexical scope, which seems superfluous.
+
+=item Document contains no data
+
+See Server error.
+
+=item entering effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item false [] range "%s" in regexp
+
+(W regexp) A character class range must start and end at a literal character, not
+another character class like C<\d> or C<[:alpha:]>. The "-" in your false
+range is interpreted as a literal "-". Consider quoting the "-", "\-".
+See L<perlre>.
+
+=item Filehandle %s opened only for output
+
+(W io) You tried to read from a filehandle opened only for writing. If you
+intended it to be a read/write filehandle, you needed to open it with
+"+<" or "+>" or "+>>" instead of with "<" or nothing. If
+you intended only to read from the file, use "<". See
+L<perlfunc/open>.
+
+=item flock() on closed filehandle %s
+
+(W closed) The filehandle you're attempting to flock() got itself closed some
+time before now. Check your logic flow. flock() operates on filehandles.
+Are you attempting to call flock() on a dirhandle by the same name?
+
+=item Global symbol "%s" requires explicit package name
+
+(F) You've said "use strict vars", which indicates that all variables
+must either be lexically scoped (using "my"), declared beforehand using
+"our", or explicitly qualified to say which package the global variable
+is in (using "::").
+
+=item Hexadecimal number > 0xffffffff non-portable
+
+(W portable) The hexadecimal number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems. See
+L<perlport> for more on portability concerns.
+
+=item Ill-formed CRTL environ value "%s"
+
+(W internal) A warning peculiar to VMS. Perl tried to read the CRTL's internal
+environ array, and encountered an element without the C<=> delimiter
+used to separate keys from values. The element is ignored.
+
+=item Ill-formed message in prime_env_iter: |%s|
+
+(W internal) A warning peculiar to VMS. Perl tried to read a logical name
+or CLI symbol definition when preparing to iterate over %ENV, and
+didn't see the expected delimiter between key and value, so the
+line was ignored.
+
+=item Illegal binary digit %s
+
+(F) You used a digit other than 0 or 1 in a binary number.
+
+=item Illegal binary digit %s ignored
+
+(W digit) You may have tried to use a digit other than 0 or 1 in a binary number.
+Interpretation of the binary number stopped before the offending digit.
+
+=item Illegal number of bits in vec
+
+(F) The number of bits in vec() (the third argument) must be a power of
+two from 1 to 32 (or 64, if your platform supports that).
+
+=item Integer overflow in %s number
+
+(W overflow) The hexadecimal, octal or binary number you have specified either
+as a literal or as an argument to hex() or oct() is too big for your
+architecture, and has been converted to a floating point number. On a
+32-bit architecture the largest hexadecimal, octal or binary number
+representable without overflow is 0xFFFFFFFF, 037777777777, or
+0b11111111111111111111111111111111 respectively. Note that Perl
+transparently promotes all numbers to a floating point representation
+internally--subject to loss of precision errors in subsequent
+operations.
+
+=item Invalid %s attribute: %s
+
+The indicated attribute for a subroutine or variable was not recognized
+by Perl or by a user-supplied handler. See L<attributes>.
+
+=item Invalid %s attributes: %s
+
+The indicated attributes for a subroutine or variable were not recognized
+by Perl or by a user-supplied handler. See L<attributes>.
+
+=item invalid [] range "%s" in regexp
+
+The offending range is now explicitly displayed.
+
+=item Invalid separator character %s in attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of an attribute list. If the previous attribute
+had a parenthesised parameter list, perhaps that list was terminated
+too soon. See L<attributes>.
+
+=item Invalid separator character %s in subroutine attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of a subroutine attribute list. If the previous attribute
+had a parenthesised parameter list, perhaps that list was terminated
+too soon.
+
+=item leaving effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item Lvalue subs returning %s not implemented yet
+
+(F) Due to limitations in the current implementation, array and hash
+values cannot be returned in subroutines used in lvalue context.
+See L<perlsub/"Lvalue subroutines">.
+
+=item Method %s not permitted
+
+See Server error.
+
+=item Missing %sbrace%s on \N{}
+
+(F) Wrong syntax of character name literal C<\N{charname}> within
+double-quotish context.
+
+=item Missing command in piped open
+
+(W pipe) You used the C<open(FH, "| command")> or C<open(FH, "command |")>
+construction, but the command was missing or blank.
+
+=item Missing name in "my sub"
+
+(F) The reserved syntax for lexically scoped subroutines requires that they
+have a name with which they can be found.
+
+=item No %s specified for -%c
+
+(F) The indicated command line switch needs a mandatory argument, but
+you haven't specified one.
+
+=item No package name allowed for variable %s in "our"
+
+(F) Fully qualified variable names are not allowed in "our" declarations,
+because that doesn't make much sense under existing semantics. Such
+syntax is reserved for future extensions.
+
+=item No space allowed after -%c
+
+(F) The argument to the indicated command line switch must follow immediately
+after the switch, without intervening spaces.
+
+=item no UTC offset information; assuming local time is UTC
+
+(S) A warning peculiar to VMS. Perl was unable to find the local
+timezone offset, so it's assuming that local system time is equivalent
+to UTC. If it's not, define the logical name F<SYS$TIMEZONE_DIFFERENTIAL>
+to translate to the number of seconds which need to be added to UTC to
+get local time.
+
+=item Octal number > 037777777777 non-portable
+
+(W portable) The octal number you specified is larger than 2**32-1 (4294967295)
+and therefore non-portable between systems. See L<perlport> for more
+on portability concerns.
+
+See also L<perlport> for writing portable code.
+
+=item panic: del_backref
+
+(P) Failed an internal consistency check while trying to reset a weak
+reference.
+
+=item panic: kid popen errno read
+
+(F) forked child returned an incomprehensible message about its errno.
+
+=item panic: magic_killbackrefs
+
+(P) Failed an internal consistency check while trying to reset all weak
+references to an object.
+
+=item Parentheses missing around "%s" list
+
+(W parenthesis) You said something like
+
+ my $foo, $bar = @_;
+
+when you meant
+
+ my ($foo, $bar) = @_;
+
+Remember that "my", "our", and "local" bind tighter than comma.
+
+=item Possible unintended interpolation of %s in string
+
+(W ambiguous) It used to be that Perl would try to guess whether you
+wanted an array interpolated or a literal @. It no longer does this;
+arrays are now I<always> interpolated into strings. This means that
+if you try something like:
+
+ print "fred@example.com";
+
+and the array C<@example> doesn't exist, Perl is going to print
+C<fred.com>, which is probably not what you wanted. To get a literal
+C<@> sign in a string, put a backslash before it, just as you would
+to get a literal C<$> sign.
+
+=item Possible Y2K bug: %s
+
+(W y2k) You are concatenating the number 19 with another number, which
+could be a potential Year 2000 problem.
+
+=item pragma "attrs" is deprecated, use "sub NAME : ATTRS" instead
+
+(W deprecated) You have written something like this:
+
+ sub doit
+ {
+ use attrs qw(locked);
+ }
+
+You should use the new declaration syntax instead.
+
+ sub doit : locked
+ {
+ ...
+
+The C<use attrs> pragma is now obsolete, and is only provided for
+backward-compatibility. See L<perlsub/"Subroutine Attributes">.
+
+
+=item Premature end of script headers
+
+See Server error.
+
+=item Repeat count in pack overflows
+
+(F) You can't specify a repeat count so large that it overflows
+your signed integers. See L<perlfunc/pack>.
+
+=item Repeat count in unpack overflows
+
+(F) You can't specify a repeat count so large that it overflows
+your signed integers. See L<perlfunc/unpack>.
+
+=item realloc() of freed memory ignored
+
+(S) An internal routine called realloc() on something that had already
+been freed.
+
+=item Reference is already weak
+
+(W misc) You have attempted to weaken a reference that is already weak.
+Doing so has no effect.
+
+=item setpgrp can't take arguments
+
+(F) Your system has the setpgrp() from BSD 4.2, which takes no arguments,
+unlike POSIX setpgid(), which takes a process ID and process group ID.
+
+=item Strange *+?{} on zero-length expression
+
+(W regexp) You applied a regular expression quantifier in a place where it
+makes no sense, such as on a zero-width assertion.
+Try putting the quantifier inside the assertion instead. For example,
+the way to match "abc" provided that it is followed by three
+repetitions of "xyz" is C</abc(?=(?:xyz){3})/>, not C</abc(?=xyz){3}/>.
+
+=item switching effective %s is not implemented
+
+(F) While under the C<use filetest> pragma, we cannot switch the
+real and effective uids or gids.
+
+=item This Perl can't reset CRTL environ elements (%s)
+
+=item This Perl can't set CRTL environ elements (%s=%s)
+
+(W internal) Warnings peculiar to VMS. You tried to change or delete an element
+of the CRTL's internal environ array, but your copy of Perl wasn't
+built with a CRTL that contained the setenv() function. You'll need to
+rebuild Perl with a CRTL that does, or redefine F<PERL_ENV_TABLES> (see
+L<perlvms>) so that the environ array isn't the target of the change to
+%ENV which produced the warning.
+
+=item Too late to run %s block
+
+(W void) A CHECK or INIT block is being defined during run time proper,
+when the opportunity to run them has already passed. Perhaps you are
+loading a file with C<require> or C<do> when you should be using
+C<use> instead. Or perhaps you should put the C<require> or C<do>
+inside a BEGIN block.
+
+=item Unknown open() mode '%s'
+
+(F) The second argument of 3-argument open() is not among the list
+of valid modes: C<< < >>, C<< > >>, C<<< >> >>>, C<< +< >>,
+C<< +> >>, C<<< +>> >>>, C<-|>, C<|->.
+
+=item Unknown process %x sent message to prime_env_iter: %s
+
+(P) An error peculiar to VMS. Perl was reading values for %ENV before
+iterating over it, and someone else stuck a message in the stream of
+data Perl expected. Someone's very confused, or perhaps trying to
+subvert Perl's population of %ENV for nefarious purposes.
+
+=item Unrecognized escape \\%c passed through
+
+(W misc) You used a backslash-character combination which is not recognized
+by Perl. The character was understood literally.
+
+=item Unterminated attribute parameter in attribute list
+
+(F) The lexer saw an opening (left) parenthesis character while parsing an
+attribute list, but the matching closing (right) parenthesis
+character was not found. You may need to add (or remove) a backslash
+character to get your parentheses to balance. See L<attributes>.
+
+=item Unterminated attribute list
+
+(F) The lexer found something other than a simple identifier at the start
+of an attribute, and it wasn't a semicolon or the start of a
+block. Perhaps you terminated the parameter list of the previous attribute
+too soon. See L<attributes>.
+
+=item Unterminated attribute parameter in subroutine attribute list
+
+(F) The lexer saw an opening (left) parenthesis character while parsing a
+subroutine attribute list, but the matching closing (right) parenthesis
+character was not found. You may need to add (or remove) a backslash
+character to get your parentheses to balance.
+
+=item Unterminated subroutine attribute list
+
+(F) The lexer found something other than a simple identifier at the start
+of a subroutine attribute, and it wasn't a semicolon or the start of a
+block. Perhaps you terminated the parameter list of the previous attribute
+too soon.
+
+=item Value of CLI symbol "%s" too long
+
+(W misc) A warning peculiar to VMS. Perl tried to read the value of an %ENV
+element from a CLI symbol table, and found a resultant string longer
+than 1024 characters. The return value has been truncated to 1024
+characters.
+
+=item Version number must be a constant number
+
+(P) The attempt to translate a C<use Module n.n LIST> statement into
+its equivalent C<BEGIN> block found an internal inconsistency with
+the version number.
+
+=back
+
+=head1 New tests
+
+=over 4
+
+=item lib/attrs
+
+Compatibility tests for C<sub : attrs> vs the older C<use attrs>.
+
+=item lib/env
+
+Tests for new environment scalar capability (e.g., C<use Env qw($BAR);>).
+
+=item lib/env-array
+
+Tests for new environment array capability (e.g., C<use Env qw(@PATH);>).
+
+=item lib/io_const
+
+IO constants (SEEK_*, _IO*).
+
+=item lib/io_dir
+
+Directory-related IO methods (new, read, close, rewind, tied delete).
+
+=item lib/io_multihomed
+
+INET sockets with multi-homed hosts.
+
+=item lib/io_poll
+
+IO poll().
+
+=item lib/io_unix
+
+UNIX sockets.
+
+=item op/attrs
+
+Regression tests for C<my ($x,@y,%z) : attrs> and <sub : attrs>.
+
+=item op/filetest
+
+File test operators.
+
+=item op/lex_assign
+
+Verify operations that access pad objects (lexicals and temporaries).
+
+=item op/exists_sub
+
+Verify C<exists &sub> operations.
+
+=back
+
+=head1 Incompatible Changes
+
+=head2 Perl Source Incompatibilities
+
+Beware that any new warnings that have been added or old ones
+that have been enhanced are B<not> considered incompatible changes.
+
+Since all new warnings must be explicitly requested via the C<-w>
+switch or the C<warnings> pragma, it is ultimately the programmer's
+responsibility to ensure that warnings are enabled judiciously.
+
+=over 4
+
+=item CHECK is a new keyword
+
+All subroutine definitions named CHECK are now special. See
+C</"Support for CHECK blocks"> for more information.
+
+=item Treatment of list slices of undef has changed
+
+There is a potential incompatibility in the behavior of list slices
+that are comprised entirely of undefined values.
+See L</"Behavior of list slices is more consistent">.
+
+=item Format of $English::PERL_VERSION is different
+
+The English module now sets $PERL_VERSION to $^V (a string value) rather
+than C<$]> (a numeric value). This is a potential incompatibility.
+Send us a report via perlbug if you are affected by this.
+
+See L</"Improved Perl version numbering system"> for the reasons for
+this change.
+
+=item Literals of the form C<1.2.3> parse differently
+
+Previously, numeric literals with more than one dot in them were
+interpreted as a floating point number concatenated with one or more
+numbers. Such "numbers" are now parsed as strings composed of the
+specified ordinals.
+
+For example, C<print 97.98.99> used to output C<97.9899> in earlier
+versions, but now prints C<abc>.
+
+See L</"Support for strings represented as a vector of ordinals">.
+
+=item Possibly changed pseudo-random number generator
+
+Perl programs that depend on reproducing a specific set of pseudo-random
+numbers may now produce different output due to improvements made to the
+rand() builtin. You can use C<sh Configure -Drandfunc=rand> to obtain
+the old behavior.
+
+See L</"Better pseudo-random number generator">.
+
+=item Hashing function for hash keys has changed
+
+Even though Perl hashes are not order preserving, the apparently
+random order encountered when iterating on the contents of a hash
+is actually determined by the hashing algorithm used. Improvements
+in the algorithm may yield a random order that is B<different> from
+that of previous versions, especially when iterating on hashes.
+
+See L</"Better worst-case behavior of hashes"> for additional
+information.
+
+=item C<undef> fails on read only values
+
+Using the C<undef> operator on a readonly value (such as $1) has
+the same effect as assigning C<undef> to the readonly value--it
+throws an exception.
+
+=item Close-on-exec bit may be set on pipe and socket handles
+
+Pipe and socket handles are also now subject to the close-on-exec
+behavior determined by the special variable $^F.
+
+See L</"More consistent close-on-exec behavior">.
+
+=item Writing C<"$$1"> to mean C<"${$}1"> is unsupported
+
+Perl 5.004 deprecated the interpretation of C<$$1> and
+similar within interpolated strings to mean C<$$ . "1">,
+but still allowed it.
+
+In Perl 5.6.0 and later, C<"$$1"> always means C<"${$1}">.
+
+=item delete(), each(), values() and C<\(%h)>
+
+operate on aliases to values, not copies
+
+delete(), each(), values() and hashes (e.g. C<\(%h)>)
+in a list context return the actual
+values in the hash, instead of copies (as they used to in earlier
+versions). Typical idioms for using these constructs copy the
+returned values, but this can make a significant difference when
+creating references to the returned values. Keys in the hash are still
+returned as copies when iterating on a hash.
+
+See also L</"delete(), each(), values() and hash iteration are faster">.
+
+=item vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS
+
+vec() generates a run-time error if the BITS argument is not
+a valid power-of-two integer.
+
+=item Text of some diagnostic output has changed
+
+Most references to internal Perl operations in diagnostics
+have been changed to be more descriptive. This may be an
+issue for programs that may incorrectly rely on the exact
+text of diagnostics for proper functioning.
+
+=item C<%@> has been removed
+
+The undocumented special variable C<%@> that used to accumulate
+"background" errors (such as those that happen in DESTROY())
+has been removed, because it could potentially result in memory
+leaks.
+
+=item Parenthesized not() behaves like a list operator
+
+The C<not> operator now falls under the "if it looks like a function,
+it behaves like a function" rule.
+
+As a result, the parenthesized form can be used with C<grep> and C<map>.
+The following construct used to be a syntax error before, but it works
+as expected now:
+
+ grep not($_), @things;
+
+On the other hand, using C<not> with a literal list slice may not
+work. The following previously allowed construct:
+
+ print not (1,2,3)[0];
+
+needs to be written with additional parentheses now:
+
+ print not((1,2,3)[0]);
+
+The behavior remains unaffected when C<not> is not followed by parentheses.
+
+=item Semantics of bareword prototype C<(*)> have changed
+
+The semantics of the bareword prototype C<*> have changed. Perl 5.005
+always coerced simple scalar arguments to a typeglob, which wasn't useful
+in situations where the subroutine must distinguish between a simple
+scalar and a typeglob. The new behavior is to not coerce bareword
+arguments to a typeglob. The value will always be visible as either
+a simple scalar or as a reference to a typeglob.
+
+See L</"More functional bareword prototype (*)">.
+
+=item Semantics of bit operators may have changed on 64-bit platforms
+
+If your platform is either natively 64-bit or if Perl has been
+configured to used 64-bit integers, i.e., $Config{ivsize} is 8,
+there may be a potential incompatibility in the behavior of bitwise
+numeric operators (& | ^ ~ << >>). These operators used to strictly
+operate on the lower 32 bits of integers in previous versions, but now
+operate over the entire native integral width. In particular, note
+that unary C<~> will produce different results on platforms that have
+different $Config{ivsize}. For portability, be sure to mask off
+the excess bits in the result of unary C<~>, e.g., C<~$x & 0xffffffff>.
+
+See L</"Bit operators support full native integer width">.
+
+=item More builtins taint their results
+
+As described in L</"Improved security features">, there may be more
+sources of taint in a Perl program.
+
+To avoid these new tainting behaviors, you can build Perl with the
+Configure option C<-Accflags=-DINCOMPLETE_TAINTS>. Beware that the
+ensuing perl binary may be insecure.
+
+=back
+
+=head2 C Source Incompatibilities
+
+=over 4
+
+=item C<PERL_POLLUTE>
+
+Release 5.005 grandfathered old global symbol names by providing preprocessor
+macros for extension source compatibility. As of release 5.6.0, these
+preprocessor definitions are not available by default. You need to explicitly
+compile perl with C<-DPERL_POLLUTE> to get these definitions. For
+extensions still using the old symbols, this option can be
+specified via MakeMaker:
+
+ perl Makefile.PL POLLUTE=1
+
+=item C<PERL_IMPLICIT_CONTEXT>
+
+This new build option provides a set of macros for all API functions
+such that an implicit interpreter/thread context argument is passed to
+every API function. As a result of this, something like C<sv_setsv(foo,bar)>
+amounts to a macro invocation that actually translates to something like
+C<Perl_sv_setsv(my_perl,foo,bar)>. While this is generally expected
+to not have any significant source compatibility issues, the difference
+between a macro and a real function call will need to be considered.
+
+This means that there B<is> a source compatibility issue as a result of
+this if your extensions attempt to use pointers to any of the Perl API
+functions.
+
+Note that the above issue is not relevant to the default build of
+Perl, whose interfaces continue to match those of prior versions
+(but subject to the other options described here).
+
+See L<perlguts/"The Perl API"> for detailed information on the
+ramifications of building Perl with this option.
+
+ NOTE: PERL_IMPLICIT_CONTEXT is automatically enabled whenever Perl is built
+ with one of -Dusethreads, -Dusemultiplicity, or both. It is not
+ intended to be enabled by users at this time.
+
+=item C<PERL_POLLUTE_MALLOC>
+
+Enabling Perl's malloc in release 5.005 and earlier caused the namespace of
+the system's malloc family of functions to be usurped by the Perl versions,
+since by default they used the same names. Besides causing problems on
+platforms that do not allow these functions to be cleanly replaced, this
+also meant that the system versions could not be called in programs that
+used Perl's malloc. Previous versions of Perl have allowed this behaviour
+to be suppressed with the HIDEMYMALLOC and EMBEDMYMALLOC preprocessor
+definitions.
+
+As of release 5.6.0, Perl's malloc family of functions have default names
+distinct from the system versions. You need to explicitly compile perl with
+C<-DPERL_POLLUTE_MALLOC> to get the older behaviour. HIDEMYMALLOC
+and EMBEDMYMALLOC have no effect, since the behaviour they enabled is now
+the default.
+
+Note that these functions do B<not> constitute Perl's memory allocation API.
+See L<perlguts/"Memory Allocation"> for further information about that.
+
+=back
+
+=head2 Compatible C Source API Changes
+
+=over 4
+
+=item C<PATCHLEVEL> is now C<PERL_VERSION>
+
+The cpp macros C<PERL_REVISION>, C<PERL_VERSION>, and C<PERL_SUBVERSION>
+are now available by default from perl.h, and reflect the base revision,
+patchlevel, and subversion respectively. C<PERL_REVISION> had no
+prior equivalent, while C<PERL_VERSION> and C<PERL_SUBVERSION> were
+previously available as C<PATCHLEVEL> and C<SUBVERSION>.
+
+The new names cause less pollution of the B<cpp> namespace and reflect what
+the numbers have come to stand for in common practice. For compatibility,
+the old names are still supported when F<patchlevel.h> is explicitly
+included (as required before), so there is no source incompatibility
+from the change.
+
+=back
+
+=head2 Binary Incompatibilities
+
+In general, the default build of this release is expected to be binary
+compatible for extensions built with the 5.005 release or its maintenance
+versions. However, specific platforms may have broken binary compatibility
+due to changes in the defaults used in hints files. Therefore, please be
+sure to always check the platform-specific README files for any notes to
+the contrary.
+
+The usethreads or usemultiplicity builds are B<not> binary compatible
+with the corresponding builds in 5.005.
+
+On platforms that require an explicit list of exports (AIX, OS/2 and Windows,
+among others), purely internal symbols such as parser functions and the
+run time opcodes are not exported by default. Perl 5.005 used to export
+all functions irrespective of whether they were considered part of the
+public API or not.
+
+For the full list of public API functions, see L<perlapi>.
+
+=head1 Known Problems
+
+=head2 Thread test failures
+
+The subtests 19 and 20 of lib/thr5005.t test are known to fail due to
+fundamental problems in the 5.005 threading implementation. These are
+not new failures--Perl 5.005_0x has the same bugs, but didn't have these
+tests.
+
+=head2 EBCDIC platforms not supported
+
+In earlier releases of Perl, EBCDIC environments like OS390 (also
+known as Open Edition MVS) and VM-ESA were supported. Due to changes
+required by the UTF-8 (Unicode) support, the EBCDIC platforms are not
+supported in Perl 5.6.0.
+
+=head2 In 64-bit HP-UX the lib/io_multihomed test may hang
+
+The lib/io_multihomed test may hang in HP-UX if Perl has been
+configured to be 64-bit. Because other 64-bit platforms do not
+hang in this test, HP-UX is suspect. All other tests pass
+in 64-bit HP-UX. The test attempts to create and connect to
+"multihomed" sockets (sockets which have multiple IP addresses).
+
+=head2 NEXTSTEP 3.3 POSIX test failure
+
+In NEXTSTEP 3.3p2 the implementation of the strftime(3) in the
+operating system libraries is buggy: the %j format numbers the days of
+a month starting from zero, which, while being logical to programmers,
+will cause the subtests 19 to 27 of the lib/posix test may fail.
+
+=head2 Tru64 (aka Digital UNIX, aka DEC OSF/1) lib/sdbm test failure with gcc
+
+If compiled with gcc 2.95 the lib/sdbm test will fail (dump core).
+The cure is to use the vendor cc, it comes with the operating system
+and produces good code.
+
+=head2 UNICOS/mk CC failures during Configure run
+
+In UNICOS/mk the following errors may appear during the Configure run:
+
+ Guessing which symbols your C compiler and preprocessor define...
+ CC-20 cc: ERROR File = try.c, Line = 3
+ ...
+ bad switch yylook 79bad switch yylook 79bad switch yylook 79bad switch yylook 79#ifdef A29K
+ ...
+ 4 errors detected in the compilation of "try.c".
+
+The culprit is the broken awk of UNICOS/mk. The effect is fortunately
+rather mild: Perl itself is not adversely affected by the error, only
+the h2ph utility coming with Perl, and that is rather rarely needed
+these days.
+
+=head2 Arrow operator and arrays
+
+When the left argument to the arrow operator C<< -> >> is an array, or
+the C<scalar> operator operating on an array, the result of the
+operation must be considered erroneous. For example:
+
+ @x->[2]
+ scalar(@x)->[2]
+
+These expressions will get run-time errors in some future release of
+Perl.
+
+=head2 Experimental features
+
+As discussed above, many features are still experimental. Interfaces and
+implementation of these features are subject to change, and in extreme cases,
+even subject to removal in some future release of Perl. These features
+include the following:
+
+=over 4
+
+=item Threads
+
+=item Unicode
+
+=item 64-bit support
+
+=item Lvalue subroutines
+
+=item Weak references
+
+=item The pseudo-hash data type
+
+=item The Compiler suite
+
+=item Internal implementation of file globbing
+
+=item The DB module
+
+=item The regular expression code constructs:
+
+C<(?{ code })> and C<(??{ code })>
+
+=back
+
+=head1 Obsolete Diagnostics
+
+=over 4
+
+=item Character class syntax [: :] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax beginning
+with "[:" and ending with ":]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[:" and ":\]".
+
+=item Ill-formed logical name |%s| in prime_env_iter
+
+(W) A warning peculiar to VMS. A logical name was encountered when preparing
+to iterate over %ENV which violates the syntactic rules governing logical
+names. Because it cannot be translated normally, it is skipped, and will not
+appear in %ENV. This may be a benign occurrence, as some software packages
+might directly modify logical name tables and introduce nonstandard names,
+or it may indicate that a logical name table has been corrupted.
+
+=item In string, @%s now must be written as \@%s
+
+The description of this error used to say:
+
+ (Someday it will simply assume that an unbackslashed @
+ interpolates an array.)
+
+That day has come, and this fatal error has been removed. It has been
+replaced by a non-fatal warning instead.
+See L</Arrays now always interpolate into double-quoted strings> for
+details.
+
+=item Probable precedence problem on %s
+
+(W) The compiler found a bareword where it expected a conditional,
+which often indicates that an || or && was parsed as part of the
+last argument of the previous construct, for example:
+
+ open FOO || die;
+
+=item regexp too big
+
+(F) The current implementation of regular expressions uses shorts as
+address offsets within a string. Unfortunately this means that if
+the regular expression compiles to longer than 32767, it'll blow up.
+Usually when you want a regular expression this big, there is a better
+way to do it with multiple statements. See L<perlre>.
+
+=item Use of "$$<digit>" to mean "${$}<digit>" is deprecated
+
+(D) Perl versions before 5.004 misinterpreted any type marker followed
+by "$" and a digit. For example, "$$0" was incorrectly taken to mean
+"${$}0" instead of "${$0}". This bug is (mostly) fixed in Perl 5.004.
+
+However, the developers of Perl 5.004 could not fix this bug completely,
+because at least two widely-used modules depend on the old meaning of
+"$$0" in a string. So Perl 5.004 still interprets "$$<digit>" in the
+old (broken) way inside strings; but it generates this message as a
+warning. And in Perl 5.005, this special treatment will cease.
+
+=back
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the
+articles recently posted to the comp.lang.perl.misc newsgroup.
+There may also be information at http://www.perl.com/perl/ , the Perl
+Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Gurusamy Sarathy <F<gsar@activestate.com>>, with many
+contributions from The Perl Porters.
+
+Send omissions or corrections to <F<perlbug@perl.org>>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl570delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl570delta.pod
new file mode 100755
index 00000000000..20abcd6b9ce
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl570delta.pod
@@ -0,0 +1,899 @@
+=head1 NAME
+
+perl570delta - what's new for perl v5.7.0
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.6.0 release and
+the 5.7.0 release.
+
+=head1 Security Vulnerability Closed
+
+A potential security vulnerability in the optional suidperl component
+of Perl has been identified. suidperl is neither built nor installed
+by default. As of September the 2nd, 2000, the only known vulnerable
+platform is Linux, most likely all Linux distributions. CERT and
+various vendors have been alerted about the vulnerability.
+
+The problem was caused by Perl trying to report a suspected security
+exploit attempt using an external program, /bin/mail. On Linux
+platforms the /bin/mail program had an undocumented feature which
+when combined with suidperl gave access to a root shell, resulting in
+a serious compromise instead of reporting the exploit attempt. If you
+don't have /bin/mail, or if you have 'safe setuid scripts', or if
+suidperl is not installed, you are safe.
+
+The exploit attempt reporting feature has been completely removed from
+the Perl 5.7.0 release, so that particular vulnerability isn't there
+anymore. However, further security vulnerabilities are,
+unfortunately, always possible. The suidperl code is being reviewed
+and if deemed too risky to continue to be supported, it may be
+completely removed from future releases. In any case, suidperl should
+only be used by security experts who know exactly what they are doing
+and why they are using suidperl instead of some other solution such as
+sudo ( see http://www.courtesan.com/sudo/ ).
+
+=head1 Incompatible Changes
+
+=over 4
+
+=item *
+
+Arrays now always interpolate into double-quoted strings:
+constructs like "foo@bar" now always assume C<@bar> is an array,
+whether or not the compiler has seen use of C<@bar>.
+
+=item *
+
+The semantics of bless(REF, REF) were unclear and until someone proves
+it to make some sense, it is forbidden.
+
+=item *
+
+A reference to a reference now stringify as "REF(0x81485ec)" instead
+of "SCALAR(0x81485ec)" in order to be more consistent with the return
+value of ref().
+
+=item *
+
+The very dusty examples in the eg/ directory have been removed.
+Suggestions for new shiny examples welcome but the main issue is that
+the examples need to be documented, tested and (most importantly)
+maintained.
+
+=item *
+
+The obsolete chat2 library that should never have been allowed
+to escape the laboratory has been decommissioned.
+
+=item *
+
+The unimplemented POSIX regex features [[.cc.]] and [[=c=]] are still
+recognised but now cause fatal errors. The previous behaviour of
+ignoring them by default and warning if requested was unacceptable
+since it, in a way, falsely promised that the features could be used.
+
+=item *
+
+The (bogus) escape sequences \8 and \9 now give an optional warning
+("Unrecognized escape passed through"). There is no need to \-escape
+any C<\w> character.
+
+=item *
+
+lstat(FILEHANDLE) now gives a warning because the operation makes no sense.
+In future releases this may become a fatal error.
+
+=item *
+
+The long deprecated uppercase aliases for the string comparison
+operators (EQ, NE, LT, LE, GE, GT) have now been removed.
+
+=item *
+
+The regular expression captured submatches ($1, $2, ...) are now
+more consistently unset if the match fails, instead of leaving false
+data lying around in them.
+
+=item *
+
+The tr///C and tr///U features have been removed and will not return;
+the interface was a mistake. Sorry about that. For similar
+functionality, see pack('U0', ...) and pack('C0', ...).
+
+=back
+
+=head1 Core Enhancements
+
+=over 4
+
+=item *
+
+C<perl -d:Module=arg,arg,arg> now works (previously one couldn't pass
+in multiple arguments.)
+
+=item *
+
+my __PACKAGE__ $obj now works.
+
+=item *
+
+C<no Module;> now works even if there is no "sub unimport" in the Module.
+
+=item *
+
+The numerical comparison operators return C<undef> if either operand
+is a NaN. Previously the behaviour was unspecified.
+
+=item *
+
+C<pack('U0a*', ...)> can now be used to force a string to UTF-8.
+
+=item *
+
+prototype(\&) is now available.
+
+=item *
+
+There is now an UNTIE method.
+
+=back
+
+=head1 Modules and Pragmata
+
+=head2 New Modules
+
+=over 4
+
+=item *
+
+File::Temp allows one to create temporary files and directories in an
+easy, portable, and secure way.
+
+=item *
+
+Storable gives persistence to Perl data structures by allowing the
+storage and retrieval of Perl data to and from files in a fast and
+compact binary format.
+
+=back
+
+=head2 Updated And Improved Modules and Pragmata
+
+=over 4
+
+=item *
+
+The following independently supported modules have been updated to
+newer versions from CPAN: CGI, CPAN, DB_File, File::Spec, Getopt::Long,
+the podlators bundle, Pod::LaTeX, Pod::Parser, Term::ANSIColor, Test.
+
+=item *
+
+Bug fixes and minor enhancements have been applied to B::Deparse,
+Data::Dumper, IO::Poll, IO::Socket::INET, Math::BigFloat,
+Math::Complex, Math::Trig, Net::protoent, the re pragma, SelfLoader,
+Sys::SysLog, Test::Harness, Text::Wrap, UNIVERSAL, and the warnings
+pragma.
+
+=item *
+
+The attributes::reftype() now works on tied arguments.
+
+=item *
+
+AutoLoader can now be disabled with C<no AutoLoader;>,
+
+=item *
+
+The English module can now be used without the infamous performance
+hit by saying
+
+ use English '-no_performance_hit';
+
+(Assuming, of course, that one doesn't need the troublesome variables
+C<$`>, C<$&>, or C<$'>.) Also, introduced C<@LAST_MATCH_START> and
+C<@LAST_MATCH_END> English aliases for C<@-> and C<@+>.
+
+=item *
+
+File::Find now has pre- and post-processing callbacks. It also
+correctly changes directories when chasing symbolic links. Callbacks
+(naughtily) exiting with "next;" instead of "return;" now work.
+
+=item *
+
+File::Glob::glob() renamed to File::Glob::bsd_glob() to avoid
+prototype mismatch with CORE::glob().
+
+=item *
+
+IPC::Open3 now allows the use of numeric file descriptors.
+
+=item *
+
+use lib now works identically to @INC. Removing directories
+with 'no lib' now works.
+
+=item *
+
+C<%INC> now localised in a Safe compartment so that use/require work.
+
+=item *
+
+The Shell module now has an OO interface.
+
+=back
+
+=head1 Utility Changes
+
+=over 4
+
+=item *
+
+The Emacs perl mode (emacs/cperl-mode.el) has been updated to version
+4.31.
+
+=item *
+
+Perlbug is now much more robust. It also sends the bug report to
+perl.org, not perl.com.
+
+=item *
+
+The perlcc utility has been rewritten and its user interface (that is,
+command line) is much more like that of the UNIX C compiler, cc.
+
+=item *
+
+The xsubpp utility for extension writers now understands POD
+documentation embedded in the *.xs files.
+
+=back
+
+=head1 New Documentation
+
+=over 4
+
+=item *
+
+perl56delta details the changes between the 5.005 release and the
+5.6.0 release.
+
+=item *
+
+perldebtut is a Perl debugging tutorial.
+
+=item *
+
+perlebcdic contains considerations for running Perl on EBCDIC platforms.
+Note that unfortunately EBCDIC platforms that used to supported back in
+Perl 5.005 are still unsupported by Perl 5.7.0; the plan, however, is to
+bring them back to the fold.
+
+=item *
+
+perlnewmod tells about writing and submitting a new module.
+
+=item *
+
+perlposix-bc explains using Perl on the POSIX-BC platform
+(an EBCDIC mainframe platform).
+
+=item *
+
+perlretut is a regular expression tutorial.
+
+=item *
+
+perlrequick is a regular expressions quick-start guide.
+Yes, much quicker than perlretut.
+
+=item *
+
+perlutil explains the command line utilities packaged with the Perl
+distribution.
+
+=back
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+map() that changes the size of the list should now work faster.
+
+=item *
+
+sort() has been changed to use mergesort internally as opposed to the
+earlier quicksort. For very small lists this may result in slightly
+slower sorting times, but in general the speedup should be at least
+20%. Additional bonuses are that the worst case behaviour of sort()
+is now better (in computer science terms it now runs in time O(N log N),
+as opposed to quicksort's Theta(N**2) worst-case run time behaviour),
+and that sort() is now stable (meaning that elements with identical
+keys will stay ordered as they were before the sort).
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+=head2 Generic Improvements
+
+=over 4
+
+=item *
+
+INSTALL now explains how you can configure Perl to use 64-bit
+integers even on non-64-bit platforms.
+
+=item *
+
+Policy.sh policy change: if you are reusing a Policy.sh file
+(see INSTALL) and you use Configure -Dprefix=/foo/bar and in the old
+Policy $prefix eq $siteprefix and $prefix eq $vendorprefix, all of
+them will now be changed to the new prefix, /foo/bar. (Previously
+only $prefix changed.) If you do not like this new behaviour,
+specify prefix, siteprefix, and vendorprefix explicitly.
+
+=item *
+
+A new optional location for Perl libraries, otherlibdirs, is available.
+It can be used for example for vendor add-ons without disturbing Perl's
+own library directories.
+
+=item *
+
+In many platforms the vendor-supplied 'cc' is too stripped-down to
+build Perl (basically, 'cc' doesn't do ANSI C). If this seems
+to be the case and 'cc' does not seem to be the GNU C compiler
+'gcc', an automatic attempt is made to find and use 'gcc' instead.
+
+=item *
+
+gcc needs to closely track the operating system release to avoid
+build problems. If Configure finds that gcc was built for a different
+operating system release than is running, it now gives a clearly visible
+warning that there may be trouble ahead.
+
+=item *
+
+If binary compatibility with the 5.005 release is not wanted, Configure
+no longer suggests including the 5.005 modules in @INC.
+
+=item *
+
+Configure C<-S> can now run non-interactively.
+
+=item *
+
+configure.gnu now works with options with whitespace in them.
+
+=item *
+
+installperl now outputs everything to STDERR.
+
+=item *
+
+$Config{byteorder} is now computed dynamically (this is more robust
+with "fat binaries" where an executable image contains binaries for
+more than one binary platform.)
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+Several debugger fixes: exit code now reflects the script exit code,
+condition C<"0"> now treated correctly, the C<d> command now checks
+line number, the C<$.> no longer gets corrupted, all debugger output now
+goes correctly to the socket if RemotePort is set.
+
+=item *
+
+C<*foo{FORMAT}> now works.
+
+=item *
+
+Lexical warnings now propagating correctly between scopes.
+
+=item *
+
+Line renumbering with eval and C<#line> now works.
+
+=item *
+
+Fixed numerous memory leaks, especially in eval "".
+
+=item *
+
+Modulus of unsigned numbers now works (4063328477 % 65535 used to
+return 27406, instead of 27047).
+
+=item *
+
+Some "not a number" warnings introduced in 5.6.0 eliminated to be
+more compatible with 5.005. Infinity is now recognised as a number.
+
+=item *
+
+our() variables will not cause "will not stay shared" warnings.
+
+=item *
+
+pack "Z" now correctly terminates the string with "\0".
+
+=item *
+
+Fix password routines which in some shadow password platforms
+(e.g. HP-UX) caused getpwent() to return every other entry.
+
+=item *
+
+printf() no longer resets the numeric locale to "C".
+
+=item *
+
+C<q(a\\b)> now parses correctly as C<'a\\b'>.
+
+=item *
+
+Printing quads (64-bit integers) with printf/sprintf now works
+without the q L ll prefixes (assuming you are on a quad-capable platform).
+
+=item *
+
+Regular expressions on references and overloaded scalars now work.
+
+=item *
+
+scalar() now forces scalar context even when used in void context.
+
+=item *
+
+sort() arguments are now compiled in the right wantarray context
+(they were accidentally using the context of the sort() itself).
+
+=item *
+
+Changed the POSIX character class C<[[:space:]]> to include the (very
+rare) vertical tab character. Added a new POSIX-ish character class
+C<[[:blank:]]> which stands for horizontal whitespace (currently,
+the space and the tab).
+
+=item *
+
+$AUTOLOAD, sort(), lock(), and spawning subprocesses
+in multiple threads simultaneously are now thread-safe.
+
+=item *
+
+Allow read-only string on left hand side of non-modifying tr///.
+
+=item *
+
+Several Unicode fixes (but still not perfect).
+
+=over 8
+
+=item *
+
+BOMs (byte order marks) in the beginning of Perl files
+(scripts, modules) should now be transparently skipped.
+UTF-16 (UCS-2) encoded Perl files should now be read correctly.
+
+=item *
+
+The character tables have been updated to Unicode 3.0.1.
+
+=item *
+
+chr() for values greater than 127 now create utf8 when under use
+utf8.
+
+=item *
+
+Comparing with utf8 data does not magically upgrade non-utf8 data into
+utf8.
+
+=item *
+
+C<IsAlnum>, C<IsAlpha>, and C<IsWord> now match titlecase.
+
+=item *
+
+Concatenation with the C<.> operator or via variable interpolation,
+C<eq>, C<substr>, C<reverse>, C<quotemeta>, the C<x> operator,
+substitution with C<s///>, single-quoted UTF-8, should now work--in
+theory.
+
+=item *
+
+The C<tr///> operator now works I<slightly> better but is still rather
+broken. Note that the C<tr///CU> functionality has been removed (but
+see pack('U0', ...)).
+
+=item *
+
+vec() now refuses to deal with characters >255.
+
+=item *
+
+Zero entries were missing from the Unicode classes like C<IsDigit>.
+
+=back
+
+=item *
+
+UNIVERSAL::isa no longer caches methods incorrectly. (This broke
+the Tk extension with 5.6.0.)
+
+=back
+
+=head2 Platform Specific Changes and Fixes
+
+=over 4
+
+=item *
+
+BSDI 4.*
+
+Perl now works on post-4.0 BSD/OSes.
+
+=item *
+
+All BSDs
+
+Setting C<$0> now works (as much as possible; see perlvar for details).
+
+=item *
+
+Cygwin
+
+Numerous updates; currently synchronised with Cygwin 1.1.4.
+
+=item *
+
+EPOC
+
+EPOC update after Perl 5.6.0. See README.epoc.
+
+=item *
+
+FreeBSD 3.*
+
+Perl now works on post-3.0 FreeBSDs.
+
+=item *
+
+HP-UX
+
+README.hpux updated; C<Configure -Duse64bitall> now almost works.
+
+=item *
+
+IRIX
+
+Numerous compilation flag and hint enhancements; accidental mixing
+of 32-bit and 64-bit libraries (a doomed attempt) made much harder.
+
+=item *
+
+Linux
+
+Long doubles should now work (see INSTALL).
+
+=item *
+
+Mac OS Classic
+
+Compilation of the standard Perl distribution in Mac OS Classic should
+now work if you have the Metrowerks development environment and the
+missing Mac-specific toolkit bits. Contact the macperl mailing list
+for details.
+
+=item *
+
+MPE/iX
+
+MPE/iX update after Perl 5.6.0. See README.mpeix.
+
+=item *
+
+NetBSD/sparc
+
+Perl now works on NetBSD/sparc.
+
+=item *
+
+OS/2
+
+Now works with usethreads (see INSTALL).
+
+=item *
+
+Solaris
+
+64-bitness using the Sun Workshop compiler now works.
+
+=item *
+
+Tru64 (aka Digital UNIX, aka DEC OSF/1)
+
+The operating system version letter now recorded in $Config{osvers}.
+Allow compiling with gcc (previously explicitly forbidden). Compiling
+with gcc still not recommended because buggy code results, even with
+gcc 2.95.2.
+
+=item *
+
+Unicos
+
+Fixed various alignment problems that lead into core dumps either
+during build or later; no longer dies on math errors at runtime;
+now using full quad integers (64 bits), previously was using
+only 46 bit integers for speed.
+
+=item *
+
+VMS
+
+chdir() now works better despite a CRT bug; now works with MULTIPLICITY
+(see INSTALL); now works with Perl's malloc.
+
+=item *
+
+Windows
+
+=over 8
+
+=item *
+
+accept() no longer leaks memory.
+
+=item *
+
+Better chdir() return value for a non-existent directory.
+
+=item *
+
+New %ENV entries now propagate to subprocesses.
+
+=item *
+
+$ENV{LIB} now used to search for libs under Visual C.
+
+=item *
+
+A failed (pseudo)fork now returns undef and sets errno to EAGAIN.
+
+=item *
+
+Allow REG_EXPAND_SZ keys in the registry.
+
+=item *
+
+Can now send() from all threads, not just the first one.
+
+=item *
+
+Fake signal handling reenabled, bugs and all.
+
+=item *
+
+Less stack reserved per thread so that more threads can run
+concurrently. (Still 16M per thread.)
+
+=item *
+
+C<< File::Spec->tmpdir() >> now prefers C:/temp over /tmp
+(works better when perl is running as service).
+
+=item *
+
+Better UNC path handling under ithreads.
+
+=item *
+
+wait() and waitpid() now work much better.
+
+=item *
+
+winsock handle leak fixed.
+
+=back
+
+=back
+
+=head1 New or Changed Diagnostics
+
+All regular expression compilation error messages are now hopefully
+easier to understand both because the error message now comes before
+the failed regex and because the point of failure is now clearly
+marked.
+
+The various "opened only for", "on closed", "never opened" warnings
+drop the C<main::> prefix for filehandles in the C<main> package,
+for example C<STDIN> instead of <main::STDIN>.
+
+The "Unrecognized escape" warning has been extended to include C<\8>,
+C<\9>, and C<\_>. There is no need to escape any of the C<\w> characters.
+
+=head1 Changed Internals
+
+=over 4
+
+=item *
+
+perlapi.pod (a companion to perlguts) now attempts to document the
+internal API.
+
+=item *
+
+You can now build a really minimal perl called microperl.
+Building microperl does not require even running Configure;
+C<make -f Makefile.micro> should be enough. Beware: microperl makes
+many assumptions, some of which may be too bold; the resulting
+executable may crash or otherwise misbehave in wondrous ways.
+For careful hackers only.
+
+=item *
+
+Added rsignal(), whichsig(), do_join() to the publicised API.
+
+=item *
+
+Made possible to propagate customised exceptions via croak()ing.
+
+=item *
+
+Added is_utf8_char(), is_utf8_string(), bytes_to_utf8(), and utf8_to_bytes().
+
+=item *
+
+Now xsubs can have attributes just like subs.
+
+=back
+
+=head1 Known Problems
+
+=head2 Unicode Support Still Far From Perfect
+
+We're working on it. Stay tuned.
+
+=head2 EBCDIC Still A Lost Platform
+
+The plan is to bring them back.
+
+=head2 Building Extensions Can Fail Because Of Largefiles
+
+Certain extensions like mod_perl and BSD::Resource are known to have
+issues with `largefiles', a change brought by Perl 5.6.0 in which file
+offsets default to 64 bits wide, where supported. Modules may fail to
+compile at all or compile and work incorrectly. Currently there is no
+good solution for the problem, but Configure now provides appropriate
+non-largefile ccflags, ldflags, libswanted, and libs in the %Config
+hash (e.g., $Config{ccflags_nolargefiles}) so the extensions that are
+having problems can try configuring themselves without the
+largefileness. This is admittedly not a clean solution, and the
+solution may not even work at all. One potential failure is whether
+one can (or, if one can, whether it's a good idea) link together at
+all binaries with different ideas about file offsets, all this is
+platform-dependent.
+
+=head2 ftmp-security tests warn 'system possibly insecure'
+
+Don't panic. Read INSTALL 'make test' section instead.
+
+=head2 Test lib/posix Subtest 9 Fails In LP64-Configured HP-UX
+
+If perl is configured with -Duse64bitall, the successful result of the
+subtest 10 of lib/posix may arrive before the successful result of the
+subtest 9, which confuses the test harness so much that it thinks the
+subtest 9 failed.
+
+=head2 Long Doubles Still Don't Work In Solaris
+
+The experimental long double support is still very much so in Solaris.
+(Other platforms like Linux and Tru64 are beginning to solidify in
+this area.)
+
+=head2 Linux With Sfio Fails op/misc Test 48
+
+No known fix.
+
+=head2 Storable tests fail in some platforms
+
+If any Storable tests fail the use of Storable is not advisable.
+
+=over 4
+
+=item *
+
+Many Storable tests fail on AIX configured with 64 bit integers.
+
+So far unidentified problems break Storable in AIX if Perl is
+configured to use 64 bit integers. AIX in 32-bit mode works and
+other 64-bit platforms work with Storable.
+
+=item *
+
+DOS DJGPP may hang when testing Storable.
+
+=item *
+
+st-06compat fails in UNICOS and UNICOS/mk.
+
+This means that you cannot read old (pre-Storable-0.7) Storable images
+made in other platforms.
+
+=item *
+
+st-store.t and st-retrieve may fail with Compaq C 6.2 on OpenVMS Alpha 7.2.
+
+=back
+
+=head2 Threads Are Still Experimental
+
+Multithreading is still an experimental feature. Some platforms
+emit the following message for lib/thr5005
+
+ #
+ # This is a KNOWN FAILURE, and one of the reasons why threading
+ # is still an experimental feature. It is here to stop people
+ # from deploying threads in production. ;-)
+ #
+
+and another known thread-related warning is
+
+ pragma/overload......Unbalanced saves: 3 more saves than restores
+ panic: magic_mutexfree during global destruction.
+ ok
+ lib/selfloader.......Unbalanced saves: 3 more saves than restores
+ panic: magic_mutexfree during global destruction.
+ ok
+ lib/st-dclone........Unbalanced saves: 3 more saves than restores
+ panic: magic_mutexfree during global destruction.
+ ok
+
+=head2 The Compiler Suite Is Still Experimental
+
+The compiler suite is slowly getting better but is nowhere near
+working order yet. The backend part that has seen perhaps the most
+progress is the bytecode compiler.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/ There may also be
+information at http://www.perl.com/perl/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Jarkko Hietaniemi <F<jhi@iki.fi>>, with many contributions
+from The Perl Porters and Perl Users submitting feedback and patches.
+
+Send omissions or corrections to <F<perlbug@perl.org>>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl571delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl571delta.pod
new file mode 100755
index 00000000000..56eb74f4b58
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl571delta.pod
@@ -0,0 +1,1075 @@
+=head1 NAME
+
+perl571delta - what's new for perl v5.7.1
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.7.0 release and the
+5.7.1 release.
+
+(To view the differences between the 5.6.0 release and the 5.7.0
+release, see L<perl570delta>.)
+
+=head1 Security Vulnerability Closed
+
+(This change was already made in 5.7.0 but bears repeating here.)
+
+A potential security vulnerability in the optional suidperl component
+of Perl was identified in August 2000. suidperl is neither built nor
+installed by default. As of April 2001 the only known vulnerable
+platform is Linux, most likely all Linux distributions. CERT and
+various vendors and distributors have been alerted about the vulnerability.
+See http://www.cpan.org/src/5.0/sperl-2000-08-05/sperl-2000-08-05.txt
+for more information.
+
+The problem was caused by Perl trying to report a suspected security
+exploit attempt using an external program, /bin/mail. On Linux
+platforms the /bin/mail program had an undocumented feature which
+when combined with suidperl gave access to a root shell, resulting in
+a serious compromise instead of reporting the exploit attempt. If you
+don't have /bin/mail, or if you have 'safe setuid scripts', or if
+suidperl is not installed, you are safe.
+
+The exploit attempt reporting feature has been completely removed from
+all the Perl 5.7 releases (and will be gone also from the maintenance
+release 5.6.1), so that particular vulnerability isn't there anymore.
+However, further security vulnerabilities are, unfortunately, always
+possible. The suidperl code is being reviewed and if deemed too risky
+to continue to be supported, it may be completely removed from future
+releases. In any case, suidperl should only be used by security
+experts who know exactly what they are doing and why they are using
+suidperl instead of some other solution such as sudo
+( see http://www.courtesan.com/sudo/ ).
+
+=head1 Incompatible Changes
+
+=over 4
+
+=item *
+
+Although "you shouldn't do that", it was possible to write code that
+depends on Perl's hashed key order (Data::Dumper does this). The new
+algorithm "One-at-a-Time" produces a different hashed key order.
+More details are in L</"Performance Enhancements">.
+
+=item *
+
+The list of filenames from glob() (or <...>) is now by default sorted
+alphabetically to be csh-compliant. (bsd_glob() does still sort platform
+natively, ASCII or EBCDIC, unless GLOB_ALPHASORT is specified.)
+
+=back
+
+=head1 Core Enhancements
+
+=head2 AUTOLOAD Is Now Lvaluable
+
+AUTOLOAD is now lvaluable, meaning that you can add the :lvalue attribute
+to AUTOLOAD subroutines and you can assign to the AUTOLOAD return value.
+
+=head2 PerlIO is Now The Default
+
+=over 4
+
+=item *
+
+IO is now by default done via PerlIO rather than system's "stdio".
+PerlIO allows "layers" to be "pushed" onto a file handle to alter the
+handle's behaviour. Layers can be specified at open time via 3-arg
+form of open:
+
+ open($fh,'>:crlf :utf8', $path) || ...
+
+or on already opened handles via extended C<binmode>:
+
+ binmode($fh,':encoding(iso-8859-7)');
+
+The built-in layers are: unix (low level read/write), stdio (as in
+previous Perls), perlio (re-implementation of stdio buffering in a
+portable manner), crlf (does CRLF <=> "\n" translation as on Win32,
+but available on any platform). A mmap layer may be available if
+platform supports it (mostly UNIXes).
+
+Layers to be applied by default may be specified via the 'open' pragma.
+
+See L</"Installation and Configuration Improvements"> for the effects
+of PerlIO on your architecture name.
+
+=item *
+
+File handles can be marked as accepting Perl's internal encoding of Unicode
+(UTF-8 or UTF-EBCDIC depending on platform) by a pseudo layer ":utf8" :
+
+ open($fh,">:utf8","Uni.txt");
+
+Note for EBCDIC users: the pseudo layer ":utf8" is erroneously named
+for you since it's not UTF-8 what you will be getting but instead
+UTF-EBCDIC. See L<perlunicode>, L<utf8>, and
+http://www.unicode.org/unicode/reports/tr16/ for more information.
+In future releases this naming may change.
+
+=item *
+
+File handles can translate character encodings from/to Perl's internal
+Unicode form on read/write via the ":encoding()" layer.
+
+=item *
+
+File handles can be opened to "in memory" files held in Perl scalars via:
+
+ open($fh,'>', \$variable) || ...
+
+=item *
+
+Anonymous temporary files are available without need to
+'use FileHandle' or other module via
+
+ open($fh,"+>", undef) || ...
+
+That is a literal undef, not an undefined value.
+
+=item *
+
+The list form of C<open> is now implemented for pipes (at least on UNIX):
+
+ open($fh,"-|", 'cat', '/etc/motd')
+
+creates a pipe, and runs the equivalent of exec('cat', '/etc/motd') in
+the child process.
+
+=item *
+
+The following builtin functions are now overridable: chop(), chomp(),
+each(), keys(), pop(), push(), shift(), splice(), unshift().
+
+=item *
+
+Formats now support zero-padded decimal fields.
+
+=item *
+
+Perl now tries internally to use integer values in numeric conversions
+and basic arithmetics (+ - * /) if the arguments are integers, and
+tries also to keep the results stored internally as integers.
+This change leads into often slightly faster and always less lossy
+arithmetics. (Previously Perl always preferred floating point numbers
+in its math.)
+
+=item *
+
+The printf() and sprintf() now support parameter reordering using the
+C<%\d+\$> and C<*\d+\$> syntaxes. For example
+
+ print "%2\$s %1\$s\n", "foo", "bar";
+
+will print "bar foo\n"; This feature helps in writing
+internationalised software.
+
+=item *
+
+Unicode in general should be now much more usable. Unicode can be
+used in hash keys, Unicode in regular expressions should work now,
+Unicode in tr/// should work now (though tr/// seems to be a
+particularly tricky to get right, so you have been warned)
+
+=item *
+
+The Unicode Character Database coming with Perl has been upgraded
+to Unicode 3.1. For more information, see http://www.unicode.org/ ,
+and http://www.unicode.org/unicode/reports/tr27/
+
+For developers interested in enhancing Perl's Unicode capabilities:
+almost all the UCD files are included with the Perl distribution in
+the lib/unicode subdirectory. The most notable omission, for space
+considerations, is the Unihan database.
+
+=item *
+
+The Unicode character classes \p{Blank} and \p{SpacePerl} have been
+added. "Blank" is like C isblank(), that is, it contains only
+"horizontal whitespace" (the space character is, the newline isn't),
+and the "SpacePerl" is the Unicode equivalent of C<\s> (\p{Space}
+isn't, since that includes the vertical tabulator character, whereas
+C<\s> doesn't.)
+
+=back
+
+=head2 Signals Are Now Safe
+
+Perl used to be fragile in that signals arriving at inopportune moments
+could corrupt Perl's internal state.
+
+=head1 Modules and Pragmata
+
+=head2 New Modules
+
+=over 4
+
+=item *
+
+B::Concise, by Stephen McCamant, is a new compiler backend for
+walking the Perl syntax tree, printing concise info about ops.
+The output is highly customisable.
+
+See L<B::Concise> for more information.
+
+=item *
+
+Class::ISA, by Sean Burke, for reporting the search path for a
+class's ISA tree, has been added.
+
+See L<Class::ISA> for more information.
+
+=item *
+
+Cwd has now a split personality: if possible, an extension is used,
+(this will hopefully be both faster and more secure and robust) but
+if not possible, the familiar Perl library implementation is used.
+
+=item *
+
+Digest, a frontend module for calculating digests (checksums),
+from Gisle Aas, has been added.
+
+See L<Digest> for more information.
+
+=item *
+
+Digest::MD5 for calculating MD5 digests (checksums), by Gisle Aas,
+has been added.
+
+ use Digest::MD5 'md5_hex';
+
+ $digest = md5_hex("Thirsty Camel");
+
+ print $digest, "\n"; # 01d19d9d2045e005c3f1b80e8b164de1
+
+NOTE: the MD5 backward compatibility module is deliberately not
+included since its use is discouraged.
+
+See L<Digest::MD5> for more information.
+
+=item *
+
+Encode, by Nick Ing-Simmons, provides a mechanism to translate
+between different character encodings. Support for Unicode,
+ISO-8859-*, ASCII, CP*, KOI8-R, and three variants of EBCDIC are
+compiled in to the module. Several other encodings (like Japanese,
+Chinese, and MacIntosh encodings) are included and will be loaded at
+runtime.
+
+Any encoding supported by Encode module is also available to the
+":encoding()" layer if PerlIO is used.
+
+See L<Encode> for more information.
+
+=item *
+
+Filter::Simple is an easy-to-use frontend to Filter::Util::Call,
+from Damian Conway.
+
+ # in MyFilter.pm:
+
+ package MyFilter;
+
+ use Filter::Simple sub {
+ while (my ($from, $to) = splice @_, 0, 2) {
+ s/$from/$to/g;
+ }
+ };
+
+ 1;
+
+ # in user's code:
+
+ use MyFilter qr/red/ => 'green';
+
+ print "red\n"; # this code is filtered, will print "green\n"
+ print "bored\n"; # this code is filtered, will print "bogreen\n"
+
+ no MyFilter;
+
+ print "red\n"; # this code is not filtered, will print "red\n"
+
+See L<Filter::Simple> for more information.
+
+=item *
+
+Filter::Util::Call, by Paul Marquess, provides you with the
+framework to write I<Source Filters> in Perl. For most uses
+the frontend Filter::Simple is to be preferred.
+See L<Filter::Util::Call> for more information.
+
+=item *
+
+Locale::Constants, Locale::Country, Locale::Currency, and Locale::Language,
+from Neil Bowers, have been added. They provide the codes for various
+locale standards, such as "fr" for France, "usd" for US Dollar, and
+"jp" for Japanese.
+
+ use Locale::Country;
+
+ $country = code2country('jp'); # $country gets 'Japan'
+ $code = country2code('Norway'); # $code gets 'no'
+
+See L<Locale::Constants>, L<Locale::Country>, L<Locale::Currency>,
+and L<Locale::Language> for more information.
+
+=item *
+
+MIME::Base64, by Gisle Aas, allows you to encode data in base64.
+
+ use MIME::Base64;
+
+ $encoded = encode_base64('Aladdin:open sesame');
+ $decoded = decode_base64($encoded);
+
+ print $encoded, "\n"; # "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
+
+See L<MIME::Base64> for more information.
+
+=item *
+
+MIME::QuotedPrint, by Gisle Aas, allows you to encode data in
+quoted-printable encoding.
+
+ use MIME::QuotedPrint;
+
+ $encoded = encode_qp("Smiley in Unicode: \x{263a}");
+ $decoded = decode_qp($encoded);
+
+ print $encoded, "\n"; # "Smiley in Unicode: =263A"
+
+MIME::QuotedPrint has been enhanced to provide the basic methods
+necessary to use it with PerlIO::Via as in :
+
+ use MIME::QuotedPrint;
+ open($fh,">Via(MIME::QuotedPrint)",$path)
+
+See L<MIME::QuotedPrint> for more information.
+
+=item *
+
+PerlIO::Scalar, by Nick Ing-Simmons, provides the implementation of
+IO to "in memory" Perl scalars as discussed above. It also serves as
+an example of a loadable layer. Other future possibilities include
+PerlIO::Array and PerlIO::Code. See L<PerlIO::Scalar> for more
+information.
+
+=item *
+
+PerlIO::Via, by Nick Ing-Simmons, acts as a PerlIO layer and wraps
+PerlIO layer functionality provided by a class (typically implemented
+in perl code).
+
+ use MIME::QuotedPrint;
+ open($fh,">Via(MIME::QuotedPrint)",$path)
+
+This will automatically convert everything output to C<$fh>
+to Quoted-Printable. See L<PerlIO::Via> for more information.
+
+=item *
+
+Pod::Text::Overstrike, by Joe Smith, has been added.
+It converts POD data to formatted overstrike text.
+See L<Pod::Text::Overstrike> for more information.
+
+=item *
+
+Switch from Damian Conway has been added. Just by saying
+
+ use Switch;
+
+you have C<switch> and C<case> available in Perl.
+
+ use Switch;
+
+ switch ($val) {
+
+ case 1 { print "number 1" }
+ case "a" { print "string a" }
+ case [1..10,42] { print "number in list" }
+ case (@array) { print "number in list" }
+ case /\w+/ { print "pattern" }
+ case qr/\w+/ { print "pattern" }
+ case (%hash) { print "entry in hash" }
+ case (\%hash) { print "entry in hash" }
+ case (\&sub) { print "arg to subroutine" }
+ else { print "previous case not true" }
+ }
+
+See L<Switch> for more information.
+
+=item *
+
+Text::Balanced from Damian Conway has been added, for
+extracting delimited text sequences from strings.
+
+ use Text::Balanced 'extract_delimited';
+
+ ($a, $b) = extract_delimited("'never say never', he never said", "'", '');
+
+$a will be "'never say never'", $b will be ', he never said'.
+
+In addition to extract_delimited() there are also extract_bracketed(),
+extract_quotelike(), extract_codeblock(), extract_variable(),
+extract_tagged(), extract_multiple(), gen_delimited_pat(), and
+gen_extract_tagged(). With these you can implement rather advanced
+parsing algorithms. See L<Text::Balanced> for more information.
+
+=item *
+
+Tie::RefHash::Nestable, by Edward Avis, allows storing hash references
+(unlike the standard Tie::RefHash) The module is contained within
+Tie::RefHash.
+
+=item *
+
+XS::Typemap, by Tim Jenness, is a test extension that exercises XS
+typemaps. Nothing gets installed but for extension writers the code
+is worth studying.
+
+=back
+
+=head2 Updated And Improved Modules and Pragmata
+
+=over 4
+
+=item *
+
+B::Deparse should be now more robust. It still far from providing a full
+round trip for any random piece of Perl code, though, and is under active
+development: expect more robustness in 5.7.2.
+
+=item *
+
+Class::Struct can now define the classes in compile time.
+
+=item *
+
+Math::BigFloat has undergone much fixing, and in addition the fmod()
+function now supports modulus operations.
+
+( The fixed Math::BigFloat module is also available in CPAN for those
+who can't upgrade their Perl: http://www.cpan.org/authors/id/J/JP/JPEACOCK/ )
+
+=item *
+
+Devel::Peek now has an interface for the Perl memory statistics
+(this works only if you are using perl's malloc, and if you have
+compiled with debugging).
+
+=item *
+
+IO::Socket has now atmark() method, which returns true if the socket
+is positioned at the out-of-band mark. The method is also exportable
+as a sockatmark() function.
+
+=item *
+
+IO::Socket::INET has support for ReusePort option (if your platform
+supports it). The Reuse option now has an alias, ReuseAddr. For clarity
+you may want to prefer ReuseAddr.
+
+=item *
+
+Net::Ping has been enhanced. There is now "external" protocol which
+uses Net::Ping::External module which runs external ping(1) and parses
+the output. An alpha version of Net::Ping::External is available in
+CPAN and in 5.7.2 the Net::Ping::External may be integrated to Perl.
+
+=item *
+
+The C<open> pragma allows layers other than ":raw" and ":crlf" when
+using PerlIO.
+
+=item *
+
+POSIX::sigaction() is now much more flexible and robust.
+You can now install coderef handlers, 'DEFAULT', and 'IGNORE'
+handlers, installing new handlers was not atomic.
+
+=item *
+
+The Test module has been significantly enhanced. Its use is
+greatly recommended for module writers.
+
+=item *
+
+The utf8:: name space (as in the pragma) provides various
+Perl-callable functions to provide low level access to Perl's
+internal Unicode representation. At the moment only length()
+has been implemented.
+
+=back
+
+The following modules have been upgraded from the versions at CPAN:
+CPAN, CGI, DB_File, File::Temp, Getopt::Long, Pod::Man, Pod::Text,
+Storable, Text-Tabs+Wrap.
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+Hashes now use Bob Jenkins "One-at-a-Time" hashing key algorithm
+( http://burtleburtle.net/bob/hash/doobs.html ). This algorithm is
+reasonably fast while producing a much better spread of values than
+the old hashing algorithm (originally by Chris Torek, later tweaked by
+Ilya Zakharevich). Hash values output from the algorithm on a hash of
+all 3-char printable ASCII keys comes much closer to passing the
+DIEHARD random number generation tests. According to perlbench, this
+change has not affected the overall speed of Perl.
+
+=item *
+
+unshift() should now be noticeably faster.
+
+=back
+
+=head1 Utility Changes
+
+=over 4
+
+=item *
+
+h2xs now produces template README.
+
+=item *
+
+s2p has been completely rewritten in Perl. (It is in fact a full
+implementation of sed in Perl.)
+
+=item *
+
+xsubpp now supports OUT keyword.
+
+=back
+
+=head1 New Documentation
+
+=head2 perlclib
+
+Internal replacements for standard C library functions.
+(Interesting only for extension writers and Perl core hackers.)
+
+=head2 perliol
+
+Internals of PerlIO with layers.
+
+=head2 README.aix
+
+Documentation on compiling Perl on AIX has been added. AIX has
+several different C compilers and getting the right patch level
+is essential. On install README.aix will be installed as L<perlaix>.
+
+=head2 README.bs2000
+
+Documentation on compiling Perl on the POSIX-BC platform (an EBCDIC
+mainframe environment) has been added.
+
+This was formerly known as README.posix-bc but the name was considered
+to be too confusing (it has nothing to do with the POSIX module or the
+POSIX standard). On install README.bs2000 will be installed as L<perlbs2000>.
+
+=head2 README.macos
+
+In perl 5.7.1 (and in the 5.6.1) the MacPerl sources have been
+synchronised with the standard Perl sources. To compile MacPerl
+some additional steps are required, and this file documents those
+steps. On install README.macos will be installed as L<perlmacos>.
+
+=head2 README.mpeix
+
+The README.mpeix has been podified, which means that this information
+about compiling and using Perl on the MPE/iX miniframe platform will
+be installed as L<perlmpeix>.
+
+=head2 README.solaris
+
+README.solaris has been created and Solaris wisdom from elsewhere
+in the Perl documentation has been collected there. On install
+README.solaris will be installed as L<perlsolaris>.
+
+=head2 README.vos
+
+The README.vos has been podified, which means that this information
+about compiling and using Perl on the Stratus VOS miniframe platform
+will be installed as L<perlvos>.
+
+=head2 Porting/repository.pod
+
+Documentation on how to use the Perl source repository has been added.
+
+=head1 Installation and Configuration Improvements
+
+=over 4
+
+=item *
+
+Because PerlIO is now the default on most platforms, "-perlio" doesn't
+get appended to the $Config{archname} (also known as $^O) anymore.
+Instead, if you explicitly choose not to use perlio (Configure command
+line option -Uuseperlio), you will get "-stdio" appended.
+
+=item *
+
+Another change related to the architecture name is that "-64all"
+(-Duse64bitall, or "maximally 64-bit") is appended only if your
+pointers are 64 bits wide. (To be exact, the use64bitall is ignored.)
+
+=item *
+
+APPLLIB_EXP, a less-know configuration-time definition, has been
+documented. It can be used to prepend site-specific directories
+to Perl's default search path (@INC), see INSTALL for information.
+
+=item *
+
+Building Berkeley DB3 for compatibility modes for DB, NDBM, and ODBM
+has been documented in INSTALL.
+
+=item *
+
+If you are on IRIX or Tru64 platforms, new profiling/debugging options
+have been added, see L<perlhack> for more information about pixie and
+Third Degree.
+
+=back
+
+=head2 New Or Improved Platforms
+
+For the list of platforms known to support Perl,
+see L<perlport/"Supported Platforms">.
+
+=over 4
+
+=item *
+
+AIX dynamic loading should be now better supported.
+
+=item *
+
+After a long pause, AmigaOS has been verified to be happy with Perl.
+
+=item *
+
+EBCDIC platforms (z/OS, also known as OS/390, POSIX-BC, and VM/ESA)
+have been regained. Many test suite tests still fail and the
+co-existence of Unicode and EBCDIC isn't quite settled, but the
+situation is much better than with Perl 5.6. See L<perlos390>,
+L<perlbs2000> (for POSIX-BC), and L<perlvmesa> for more information.
+
+=item *
+
+Building perl with -Duseithreads or -Duse5005threads now works under
+HP-UX 10.20 (previously it only worked under 10.30 or later). You will
+need a thread library package installed. See README.hpux.
+
+=item *
+
+Mac OS Classic (MacPerl has of course been available since
+perl 5.004 but now the source code bases of standard Perl
+and MacPerl have been synchronised)
+
+=item *
+
+NCR MP-RAS is now supported.
+
+=item *
+
+NonStop-UX is now supported.
+
+=item *
+
+Amdahl UTS is now supported.
+
+=item *
+
+z/OS (formerly known as OS/390, formerly known as MVS OE) has now
+support for dynamic loading. This is not selected by default,
+however, you must specify -Dusedl in the arguments of Configure.
+
+=back
+
+=head2 Generic Improvements
+
+=over 4
+
+=item *
+
+Configure no longer includes the DBM libraries (dbm, gdbm, db, ndbm)
+when building the Perl binary. The only exception to this is SunOS 4.x,
+which needs them.
+
+=item *
+
+Some new Configure symbols, useful for extension writers:
+
+=over 8
+
+=item d_cmsghdr
+
+For struct cmsghdr.
+
+=item d_fcntl_can_lock
+
+Whether fcntl() can be used for file locking.
+
+=item d_fsync
+
+=item d_getitimer
+
+=item d_getpagsz
+
+For getpagesize(), though you should prefer POSIX::sysconf(_SC_PAGE_SIZE))
+
+=item d_msghdr_s
+
+For struct msghdr.
+
+=item need_va_copy
+
+Whether one needs to use Perl_va_copy() to copy varargs.
+
+=item d_readv
+
+=item d_recvmsg
+
+=item d_sendmsg
+
+=item sig_size
+
+The number of elements in an array needed to hold all the available signals.
+
+=item d_sockatmark
+
+=item d_strtoq
+
+=item d_u32align
+
+Whether one needs to access character data aligned by U32 sized pointers.
+
+=item d_ualarm
+
+=item d_usleep
+
+=back
+
+=item *
+
+Removed Configure symbols: the PDP-11 memory model settings: huge,
+large, medium, models.
+
+=item *
+
+SOCKS support is now much more robust.
+
+=item *
+
+If your file system supports symbolic links you can build Perl outside
+of the source directory by
+
+ mkdir perl/build/directory
+ cd perl/build/directory
+ sh /path/to/perl/source/Configure -Dmksymlinks ...
+
+This will create in perl/build/directory a tree of symbolic links
+pointing to files in /path/to/perl/source. The original files are left
+unaffected. After Configure has finished you can just say
+
+ make all test
+
+and Perl will be built and tested, all in perl/build/directory.
+
+=back
+
+=head1 Selected Bug Fixes
+
+Numerous memory leaks and uninitialized memory accesses have been hunted down.
+Most importantly anonymous subs used to leak quite a bit.
+
+=over 4
+
+=item *
+
+chop(@list) in list context returned the characters chopped in
+reverse order. This has been reversed to be in the right order.
+
+=item *
+
+The order of DESTROYs has been made more predictable.
+
+=item *
+
+mkdir() now ignores trailing slashes in the directory name,
+as mandated by POSIX.
+
+=item *
+
+Attributes (like :shared) didn't work with our().
+
+=item *
+
+The PERL5OPT environment variable (for passing command line arguments
+to Perl) didn't work for more than a single group of options.
+
+=item *
+
+The tainting behaviour of sprintf() has been rationalized. It does
+not taint the result of floating point formats anymore, making the
+behaviour consistent with that of string interpolation.
+
+=item *
+
+All but the first argument of the IO syswrite() method are now optional.
+
+=item *
+
+Tie::ARRAY SPLICE method was broken.
+
+=item *
+
+vec() now tries to work with characters <= 255 when possible, but it leaves
+higher character values in place. In that case, if vec() was used to modify
+the string, it is no longer considered to be utf8-encoded.
+
+=back
+
+=head2 Platform Specific Changes and Fixes
+
+=over 4
+
+=item *
+
+Linux previously had problems related to sockaddrlen when using
+accept(), revcfrom() (in Perl: recv()), getpeername(), and getsockname().
+
+=item *
+
+Previously DYNIX/ptx had problems in its Configure probe for non-blocking I/O.
+
+=item *
+
+Windows
+
+=over 8
+
+=item *
+
+Borland C++ v5.5 is now a supported compiler that can build Perl.
+However, the generated binaries continue to be incompatible with those
+generated by the other supported compilers (GCC and Visual C++).
+
+=item *
+
+Win32::GetCwd() correctly returns C:\ instead of C: when at the drive root.
+Other bugs in chdir() and Cwd::cwd() have also been fixed.
+
+=item *
+
+Duping socket handles with open(F, ">&MYSOCK") now works under Windows 9x.
+
+=item *
+
+HTML files will be installed in c:\perl\html instead of c:\perl\lib\pod\html
+
+=item *
+
+The makefiles now provide a single switch to bulk-enable all the features
+enabled in ActiveState ActivePerl (a popular binary distribution).
+
+=back
+
+=back
+
+=head1 New or Changed Diagnostics
+
+Two new debugging options have been added: if you have compiled your
+Perl with debugging, you can use the -DT and -DR options to trace
+tokenising and to add reference counts to displaying variables,
+respectively.
+
+=over 4
+
+=item *
+
+If an attempt to use a (non-blessed) reference as an array index
+is made, a warning is given.
+
+=item *
+
+C<push @a;> and C<unshift @a;> (with no values to push or unshift)
+now give a warning. This may be a problem for generated and eval'ed
+code.
+
+=back
+
+=head1 Changed Internals
+
+=over 4
+
+=item *
+
+Some new APIs: ptr_table_clear(), ptr_table_free(), sv_setref_uv().
+For the full list of the available APIs see L<perlapi>.
+
+=item *
+
+dTHR and djSP have been obsoleted; the former removed (because it's
+a no-op) and the latter replaced with dSP.
+
+=item *
+
+Perl now uses system malloc instead of Perl malloc on all 64-bit
+platforms, and even in some not-always-64-bit platforms like AIX,
+IRIX, and Solaris. This change breaks backward compatibility but
+Perl's malloc has problems with large address spaces and also the
+speed of vendors' malloc is generally better in large address space
+machines (Perl's malloc is mostly tuned for space).
+
+=back
+
+=head1 New Tests
+
+Many new tests have been added. The most notable is probably the
+lib/1_compile: it is very notable because running it takes quite a
+long time -- it test compiles all the Perl modules in the distribution.
+Please be patient.
+
+=head1 Known Problems
+
+Note that unlike other sections in this document (which describe
+changes since 5.7.0) this section is cumulative containing known
+problems for all the 5.7 releases.
+
+=head2 AIX vac 5.0.0.0 May Produce Buggy Code For Perl
+
+The AIX C compiler vac version 5.0.0.0 may produce buggy code,
+resulting in few random tests failing, but when the failing tests
+are run by hand, they succeed. We suggest upgrading to at least
+vac version 5.0.1.0, that has been known to compile Perl correctly.
+"lslpp -L|grep vac.C" will tell you the vac version.
+
+=head2 lib/ftmp-security tests warn 'system possibly insecure'
+
+Don't panic. Read INSTALL 'make test' section instead.
+
+=head2 lib/io_multihomed Fails In LP64-Configured HP-UX
+
+The lib/io_multihomed test may hang in HP-UX if Perl has been
+configured to be 64-bit. Because other 64-bit platforms do not hang in
+this test, HP-UX is suspect. All other tests pass in 64-bit HP-UX. The
+test attempts to create and connect to "multihomed" sockets (sockets
+which have multiple IP addresses).
+
+=head2 Test lib/posix Subtest 9 Fails In LP64-Configured HP-UX
+
+If perl is configured with -Duse64bitall, the successful result of the
+subtest 10 of lib/posix may arrive before the successful result of the
+subtest 9, which confuses the test harness so much that it thinks the
+subtest 9 failed.
+
+=head2 lib/b test 19
+
+The test fails on various platforms (PA64 and IA64 are known), but the
+exact cause is still being investigated.
+
+=head2 Linux With Sfio Fails op/misc Test 48
+
+No known fix.
+
+=head2 sigaction test 13 in VMS
+
+The test is known to fail; whether it's because of VMS of because
+of faulty test is not known.
+
+=head2 sprintf tests 129 and 130
+
+The op/sprintf tests 129 and 130 are known to fail on some platforms.
+Examples include any platform using sfio, and Compaq/Tandem's NonStop-UX.
+The failing platforms do not comply with the ANSI C Standard, line
+19ff on page 134 of ANSI X3.159 1989 to be exact. (They produce
+something else than "1" and "-1" when formatting 0.6 and -0.6 using
+the printf format "%.0f", most often they produce "0" and "-0".)
+
+=head2 Failure of Thread tests
+
+The subtests 19 and 20 of lib/thr5005.t test are known to fail due to
+fundamental problems in the 5.005 threading implementation. These are
+not new failures--Perl 5.005_0x has the same bugs, but didn't have
+these tests. (Note that support for 5.005-style threading remains
+experimental.)
+
+=head2 Localising a Tied Variable Leaks Memory
+
+ use Tie::Hash;
+ tie my %tie_hash => 'Tie::StdHash';
+
+ ...
+
+ local($tie_hash{Foo}) = 1; # leaks
+
+Code like the above is known to leak memory every time the local()
+is executed.
+
+=head2 Self-tying of Arrays and Hashes Is Forbidden
+
+Self-tying of arrays and hashes is broken in rather deep and
+hard-to-fix ways. As a stop-gap measure to avoid people from getting
+frustrated at the mysterious results (core dumps, most often) it is
+for now forbidden (you will get a fatal error even from an attempt).
+
+=head2 Building Extensions Can Fail Because Of Largefiles
+
+Some extensions like mod_perl are known to have issues with
+`largefiles', a change brought by Perl 5.6.0 in which file offsets
+default to 64 bits wide, where supported. Modules may fail to compile
+at all or compile and work incorrectly. Currently there is no good
+solution for the problem, but Configure now provides appropriate
+non-largefile ccflags, ldflags, libswanted, and libs in the %Config
+hash (e.g., $Config{ccflags_nolargefiles}) so the extensions that are
+having problems can try configuring themselves without the
+largefileness. This is admittedly not a clean solution, and the
+solution may not even work at all. One potential failure is whether
+one can (or, if one can, whether it's a good idea) link together at
+all binaries with different ideas about file offsets, all this is
+platform-dependent.
+
+=head2 The Compiler Suite Is Still Experimental
+
+The compiler suite is slowly getting better but is nowhere near
+working order yet.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/ There may also be
+information at http://www.perl.com/perl/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Jarkko Hietaniemi <F<jhi@iki.fi>>, with many contributions
+from The Perl Porters and Perl Users submitting feedback and patches.
+
+Send omissions or corrections to <F<perlbug@perl.org>>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl572delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl572delta.pod
new file mode 100755
index 00000000000..fc5c392976c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl572delta.pod
@@ -0,0 +1,831 @@
+=head1 NAME
+
+perl572delta - what's new for perl v5.7.2
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.7.1 release and the
+5.7.2 release.
+
+(To view the differences between the 5.6.0 release and the 5.7.0
+release, see L<perl570delta>. To view the differences between the
+5.7.0 release and the 5.7.1 release, see L<perl571delta>.)
+
+=head1 Security Vulnerability Closed
+
+(This change was already made in 5.7.0 but bears repeating here.)
+
+A security vulnerability affecting all Perl versions prior to 5.6.1
+was found in August 2000. The vulnerability does not affect default
+installations and as far as is known affects only the Linux platform.
+
+You should upgrade your Perl to 5.6.1 as soon as possible. Patches
+for earlier releases exist but using the patches require full
+recompilation from the source code anyway, so 5.6.1 is your best
+choice.
+
+See http://www.cpan.org/src/5.0/sperl-2000-08-05/sperl-2000-08-05.txt
+for more information.
+
+=head1 Incompatible Changes
+
+=head2 64-bit platforms and malloc
+
+If your pointers are 64 bits wide, the Perl malloc is no more being
+used because it simply does not work with 8-byte pointers. Also,
+usually the system malloc on such platforms are much better optimized
+for such large memory models than the Perl malloc.
+
+=head2 AIX Dynaloading
+
+The AIX dynaloading now uses in AIX releases 4.3 and newer the native
+dlopen interface of AIX instead of the old emulated interface. This
+change will probably break backward compatibility with compiled
+modules. The change was made to make Perl more compliant with other
+applications like modperl which are using the AIX native interface.
+
+=head2 Socket Extension Dynamic in VMS
+
+The Socket extension is now dynamically loaded instead of being
+statically built in. This may or may not be a problem with ancient
+TCP/IP stacks of VMS: we do not know since we weren't able to test
+Perl in such configurations.
+
+=head2 Different Definition of the Unicode Character Classes \p{In...}
+
+As suggested by the Unicode consortium, the Unicode character classes
+now prefer I<scripts> as opposed to I<blocks> (as defined by Unicode);
+in Perl, when the C<\p{In....}> and the C<\p{In....}> regular expression
+constructs are used. This has changed the definition of some of those
+character classes.
+
+The difference between scripts and blocks is that scripts are the
+glyphs used by a language or a group of languages, while the blocks
+are more artificial groupings of 256 characters based on the Unicode
+numbering.
+
+In general this change results in more inclusive Unicode character
+classes, but changes to the other direction also do take place:
+for example while the script C<Latin> includes all the Latin
+characters and their various diacritic-adorned versions, it
+does not include the various punctuation or digits (since they
+are not solely C<Latin>).
+
+Changes in the character class semantics may have happened if a script
+and a block happen to have the same name, for example C<Hebrew>.
+In such cases the script wins and C<\p{InHebrew}> now means the script
+definition of Hebrew. The block definition in still available,
+though, by appending C<Block> to the name: C<\p{InHebrewBlock}> means
+what C<\p{InHebrew}> meant in perl 5.6.0. For the full list
+of affected character classes, see L<perlunicode/Blocks>.
+
+=head2 Deprecations
+
+The current user-visible implementation of pseudo-hashes (the weird
+use of the first array element) is deprecated starting from Perl 5.8.0
+and will be removed in Perl 5.10.0, and the feature will be
+implemented differently. Not only is the current interface rather
+ugly, but the current implementation slows down normal array and hash
+use quite noticeably. The C<fields> pragma interface will remain
+available.
+
+The syntaxes C<< @a->[...] >> and C<< @h->{...} >> have now been deprecated.
+
+The suidperl is also considered to be too much a risk to continue
+maintaining and the suidperl code is likely to be removed in a future
+release.
+
+The C<package;> syntax (C<package> without an argument has been
+deprecated. Its semantics were never that clear and its
+implementation even less so. If you have used that feature to
+disallow all but fully qualified variables, C<use strict;> instead.
+
+The chdir(undef) and chdir('') behaviors to match chdir() has been
+deprecated. In future versions, chdir(undef) and chdir('') will
+simply fail.
+
+=head1 Core Enhancements
+
+In general a lot of fixing has happened in the area of Perl's
+understanding of numbers, both integer and floating point. Since in
+many systems the standard number parsing functions like C<strtoul()>
+and C<atof()> seem to have bugs, Perl tries to work around their
+deficiencies. This results hopefully in more accurate numbers.
+
+=over 4
+
+=item *
+
+The rules for allowing underscores (underbars) in numeric constants
+have been relaxed and simplified: now you can have an underscore
+B<between digits>.
+
+=item *
+
+GMAGIC (right-hand side magic) could in many cases such as string
+concatenation be invoked too many times.
+
+=item *
+
+Lexicals I: lexicals outside an eval "" weren't resolved
+correctly inside a subroutine definition inside the eval "" if they
+were not already referenced in the top level of the eval""ed code.
+
+=item *
+
+Lexicals II: lexicals leaked at file scope into subroutines that
+were declared before the lexicals.
+
+=item *
+
+Lvalue subroutines can now return C<undef> in list context.
+
+=item *
+
+The C<op_clear> and C<op_null> are now exported.
+
+=item *
+
+A new special regular expression variable has been introduced:
+C<$^N>, which contains the most-recently closed group (submatch).
+
+=item *
+
+L<utime> now supports C<utime undef, undef, @files> to change the
+file timestamps to the current time.
+
+=item *
+
+The Perl parser has been stress tested using both random input and
+Markov chain input.
+
+=item *
+
+C<eval "v200"> now works.
+
+=item *
+
+VMS now works under PerlIO.
+
+=item *
+
+END blocks are now run even if you exit/die in a BEGIN block.
+The execution of END blocks is now controlled by
+PL_exit_flags & PERL_EXIT_DESTRUCT_END. This enables the new
+behaviour for perl embedders. This will default in 5.10. See
+L<perlembed>.
+
+=back
+
+=head1 Modules and Pragmata
+
+=head2 New Modules and Distributions
+
+=over 4
+
+=item *
+
+L<Attribute::Handlers> - Simpler definition of attribute handlers
+
+=item *
+
+L<ExtUtils::Constant> - generate XS code to import C header constants
+
+=item *
+
+L<I18N::Langinfo> - query locale information
+
+=item *
+
+L<I18N::LangTags> - functions for dealing with RFC3066-style language tags
+
+=item *
+
+L<libnet> - a collection of perl5 modules related to network programming
+
+Perl installation leaves libnet unconfigured, use F<libnetcfg> to configure.
+
+=item *
+
+L<List::Util> - selection of general-utility list subroutines
+
+=item *
+
+L<Locale::Maketext> - framework for localization
+
+=item *
+
+L<Memoize> - Make your functions faster by trading space for time
+
+=item *
+
+L<NEXT> - pseudo-class for method redispatch
+
+=item *
+
+L<Scalar::Util> - selection of general-utility scalar subroutines
+
+=item *
+
+L<Test::More> - yet another framework for writing test scripts
+
+=item *
+
+L<Test::Simple> - Basic utilities for writing tests
+
+=item *
+
+L<Time::HiRes> - high resolution ualarm, usleep, and gettimeofday
+
+=item *
+
+L<Time::Piece> - Object Oriented time objects
+
+(Previously known as L<Time::Object>.)
+
+=item *
+
+L<Time::Seconds> - a simple API to convert seconds to other date values
+
+=item *
+
+L<UnicodeCD> - Unicode Character Database
+
+=back
+
+=head2 Updated And Improved Modules and Pragmata
+
+=over 4
+
+=item *
+
+L<B::Deparse> module has been significantly enhanced. It now
+can deparse almost all of the standard test suite (so that the
+tests still succeed). There is a make target "test.deparse"
+for trying this out.
+
+=item *
+
+L<Class::Struct> now assigns the array/hash element if the accessor
+is called with an array/hash element as the B<sole> argument.
+
+=item *
+
+L<Cwd> extension is now (even) faster.
+
+=item *
+
+L<DB_File> extension has been updated to version 1.77.
+
+=item *
+
+L<Fcntl>, L<Socket>, and L<Sys::Syslog> have been rewritten to use the
+new-style constant dispatch section (see L<ExtUtils::Constant>).
+
+=item *
+
+L<File::Find> is now (again) reentrant. It also has been made
+more portable.
+
+=item *
+
+L<File::Glob> now supports C<GLOB_LIMIT> constant to limit the
+size of the returned list of filenames.
+
+=item *
+
+L<IO::Socket::INET> now supports C<LocalPort> of zero (usually meaning
+that the operating system will make one up.)
+
+=item *
+
+The L<vars> pragma now supports declaring fully qualified variables.
+(Something that C<our()> does not and will not support.)
+
+=back
+
+=head1 Utility Changes
+
+=over 4
+
+=item *
+
+The F<emacs/e2ctags.pl> is now much faster.
+
+=item *
+
+L<h2ph> now supports C trigraphs.
+
+=item *
+
+L<h2xs> uses the new L<ExtUtils::Constant> module which will affect
+newly created extensions that define constants. Since the new code is
+more correct (if you have two constants where the first one is a
+prefix of the second one, the first constant B<never> gets defined),
+less lossy (it uses integers for integer constant, as opposed to the
+old code that used floating point numbers even for integer constants),
+and slightly faster, you might want to consider regenerating your
+extension code (the new scheme makes regenerating easy).
+L<h2xs> now also supports C trigraphs.
+
+=item *
+
+L<libnetcfg> has been added to configure the libnet.
+
+=item *
+
+The F<Pod::Html> (and thusly L<pod2html>) now allows specifying
+a cache directory.
+
+=back
+
+=head1 New Documentation
+
+=over 4
+
+=item *
+
+L<Locale::Maketext::TPJ13> is an article about software localization,
+originally published in The Perl Journal #13, republished here with
+kind permission.
+
+=item *
+
+More README.$PLATFORM files have been converted into pod, which also
+means that they also be installed as perl$PLATFORM documentation
+files. The new files are L<perlapollo>, L<perlbeos>, L<perldgux>,
+L<perlhurd>, L<perlmint>, L<perlnetware>, L<perlplan9>, L<perlqnx>,
+and L<perltru64>.
+
+=item *
+
+The F<Todo> and F<Todo-5.6> files have been merged into L<perltodo>.
+
+=item *
+
+Use of the F<gprof> tool to profile Perl has been documented in
+L<perlhack>. There is a make target "perl.gprof" for generating a
+gprofiled Perl executable.
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+=head2 New Or Improved Platforms
+
+=over 4
+
+=item *
+
+AIX should now work better with gcc, threads, and 64-bitness. Also the
+long doubles support in AIX should be better now. See L<perlaix>.
+
+=item *
+
+AtheOS ( http://www.atheos.cx/ ) is a new platform.
+
+=item *
+
+DG/UX platform now supports the 5.005-style threads. See L<perldgux>.
+
+=item *
+
+DYNIX/ptx platform (a.k.a. dynixptx) is supported at or near osvers 4.5.2.
+
+=item *
+
+Several Mac OS (Classic) portability patches have been applied. We
+hope to get a fully working port by 5.8.0. (The remaining problems
+relate to the changed IO model of Perl.) See L<perlmacos>.
+
+=item *
+
+Mac OS X (or Darwin) should now be able to build Perl even on HFS+
+filesystems. (The case-insensitivity confused the Perl build process.)
+
+=item *
+
+NetWare from Novell is now supported. See L<perlnetware>.
+
+=item *
+
+The Amdahl UTS UNIX mainframe platform is now supported.
+
+=back
+
+=head2 Generic Improvements
+
+=over 4
+
+=item *
+
+In AFS installations one can configure the root of the AFS to be
+somewhere else than the default F</afs> by using the Configure
+parameter C<-Dafsroot=/some/where/else>.
+
+=item *
+
+The version of Berkeley DB used when the Perl (and, presumably, the
+DB_File extension) was built is now available as
+C<@Config{qw(db_version_major db_version_minor db_version_patch)}>
+from Perl and as C<DB_VERSION_MAJOR_CFG DB_VERSION_MINOR_CFG
+DB_VERSION_PATCH_CFG> from C.
+
+=item *
+
+The Thread extension is now not built at all under ithreads
+(C<Configure -Duseithreads>) because it wouldn't work anyway (the
+Thread extension requires being Configured with C<-Duse5005threads>).
+
+=item *
+
+The C<B::Deparse> compiler backend has been so significantly improved
+that almost the whole Perl test suite passes after being deparsed. A
+make target has been added to help in further testing: C<make test.deparse>.
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 5
+
+=item *
+
+The autouse pragma didn't work for Multi::Part::Function::Names.
+
+=item *
+
+The behaviour of non-decimal but numeric string constants such as
+"0x23" was platform-dependent: in some platforms that was seen as 35,
+in some as 0, in some as a floating point number (don't ask). This
+was caused by Perl using the operating system libraries in a situation
+where the result of the string to number conversion is undefined: now
+Perl consistently handles such strings as zero in numeric contexts.
+
+=item *
+
+L<dprofpp> -R didn't work.
+
+=item *
+
+PERL5OPT with embedded spaces didn't work.
+
+=item *
+
+L<Sys::Syslog> ignored the C<LOG_AUTH> constant.
+
+=back
+
+=head2 Platform Specific Changes and Fixes
+
+=over 4
+
+=item *
+
+Some versions of glibc have a broken modfl(). This affects builds
+with C<-Duselongdouble>. This version of Perl detects this brokenness
+and has a workaround for it. The glibc release 2.2.2 is known to have
+fixed the modfl() bug.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+=over 4
+
+=item *
+
+In the regular expression diagnostics the C<E<lt>E<lt> HERE> marker
+introduced in 5.7.0 has been changed to be C<E<lt>-- HERE> since too
+many people found the C<E<lt>E<lt>> to be too similar to here-document
+starters.
+
+=item *
+
+If you try to L<perlfunc/pack> a number less than 0 or larger than 255
+using the C<"C"> format you will get an optional warning. Similarly
+for the C<"c"> format and a number less than -128 or more than 127.
+
+=item *
+
+Certain regex modifiers such as C<(?o)> make sense only if applied to
+the entire regex. You will an optional warning if you try to do otherwise.
+
+=item *
+
+Using arrays or hashes as references (e.g. C<< %foo->{bar} >> has been
+deprecated for a while. Now you will get an optional warning.
+
+=back
+
+=head1 Source Code Enhancements
+
+=head2 MAGIC constants
+
+The MAGIC constants (e.g. C<'P'>) have been macrofied
+(e.g. C<PERL_MAGIC_TIED>) for better source code readability
+and maintainability.
+
+=head2 Better commented code
+
+F<perly.c>, F<sv.c>, and F<sv.h> have now been extensively commented.
+
+=head2 Regex pre-/post-compilation items matched up
+
+The regex compiler now maintains a structure that identifies nodes in
+the compiled bytecode with the corresponding syntactic features of the
+original regex expression. The information is attached to the new
+C<offsets> member of the C<struct regexp>. See L<perldebguts> for more
+complete information.
+
+=head2 gcc -Wall
+
+The C code has been made much more C<gcc -Wall> clean. Some warning
+messages still remain, though, so if you are compiling with gcc you
+will see some warnings about dubious practices. The warnings are
+being worked on.
+
+=head1 New Tests
+
+Several new tests have been added, especially for the F<lib> subsection.
+
+The tests are now reported in a different order than in earlier Perls.
+(This happens because the test scripts from under t/lib have been moved
+to be closer to the library/extension they are testing.)
+
+=head1 Known Problems
+
+Note that unlike other sections in this document (which describe
+changes since 5.7.0) this section is cumulative containing known
+problems for all the 5.7 releases.
+
+=head2 AIX
+
+=over 4
+
+=item *
+
+In AIX 4.2 Perl extensions that use C++ functions that use statics
+may have problems in that the statics are not getting initialized.
+In newer AIX releases this has been solved by linking Perl with
+the libC_r library, but unfortunately in AIX 4.2 the said library
+has an obscure bug where the various functions related to time
+(such as time() and gettimeofday()) return broken values, and
+therefore in AIX 4.2 Perl is not linked against the libC_r.
+
+=item *
+
+vac 5.0.0.0 May Produce Buggy Code For Perl
+
+The AIX C compiler vac version 5.0.0.0 may produce buggy code,
+resulting in few random tests failing, but when the failing tests
+are run by hand, they succeed. We suggest upgrading to at least
+vac version 5.0.1.0, that has been known to compile Perl correctly.
+"lslpp -L|grep vac.C" will tell you the vac version.
+
+=back
+
+=head2 Amiga Perl Invoking Mystery
+
+One cannot call Perl using the C<volume:> syntax, that is, C<perl -v>
+works, but for example C<bin:perl -v> doesn't. The exact reason is
+known but the current suspect is the F<ixemul> library.
+
+=head2 lib/ftmp-security tests warn 'system possibly insecure'
+
+Don't panic. Read INSTALL 'make test' section instead.
+
+=head2 Cygwin intermittent failures of lib/Memoize/t/expire_file 11 and 12
+
+The subtests 11 and 12 sometimes fail and sometimes work.
+
+=head2 HP-UX lib/io_multihomed Fails When LP64-Configured
+
+The lib/io_multihomed test may hang in HP-UX if Perl has been
+configured to be 64-bit. Because other 64-bit platforms do not hang in
+this test, HP-UX is suspect. All other tests pass in 64-bit HP-UX. The
+test attempts to create and connect to "multihomed" sockets (sockets
+which have multiple IP addresses).
+
+=head2 HP-UX lib/posix Subtest 9 Fails When LP64-Configured
+
+If perl is configured with -Duse64bitall, the successful result of the
+subtest 10 of lib/posix may arrive before the successful result of the
+subtest 9, which confuses the test harness so much that it thinks the
+subtest 9 failed.
+
+=head2 Linux With Sfio Fails op/misc Test 48
+
+No known fix.
+
+=head2 OS/390
+
+OS/390 has rather many test failures but the situation is actually
+better than it was in 5.6.0, it's just that so many new modules and
+tests have been added.
+
+ Failed Test Stat Wstat Total Fail Failed List of Failed
+ -----------------------------------------------------------------------------
+ ../ext/B/Deparse.t 14 1 7.14% 14
+ ../ext/B/Showlex.t 1 1 100.00% 1
+ ../ext/Encode/Encode/Tcl.t 610 13 2.13% 592 594 596 598
+ 600 602 604-610
+ ../ext/IO/lib/IO/t/io_unix.t 113 28928 5 3 60.00% 3-5
+ ../ext/POSIX/POSIX.t 29 1 3.45% 14
+ ../ext/Storable/t/lock.t 255 65280 5 3 60.00% 3-5
+ ../lib/locale.t 129 33024 117 19 16.24% 99-117
+ ../lib/warnings.t 434 1 0.23% 75
+ ../lib/ExtUtils.t 27 1 3.70% 25
+ ../lib/Math/BigInt/t/bigintpm.t 1190 1 0.08% 1145
+ ../lib/Unicode/UCD.t 81 48 59.26% 1-16 49-64 66-81
+ ../lib/User/pwent.t 9 1 11.11% 4
+ op/pat.t 660 6 0.91% 242-243 424-425
+ 626-627
+ op/split.t 0 9 ?? ?? % ??
+ op/taint.t 174 3 1.72% 156 162 168
+ op/tr.t 70 3 4.29% 50 58-59
+ Failed 16/422 test scripts, 96.21% okay. 105/23251 subtests failed, 99.55% okay.
+
+=head2 op/sprintf tests 129 and 130
+
+The op/sprintf tests 129 and 130 are known to fail on some platforms.
+Examples include any platform using sfio, and Compaq/Tandem's NonStop-UX.
+The failing platforms do not comply with the ANSI C Standard, line
+19ff on page 134 of ANSI X3.159 1989 to be exact. (They produce
+something other than "1" and "-1" when formatting 0.6 and -0.6 using
+the printf format "%.0f", most often they produce "0" and "-0".)
+
+=head2 Failure of Thread tests
+
+B<Note that support for 5.005-style threading remains experimental.>
+
+The following tests are known to fail due to fundamental problems in
+the 5.005 threading implementation. These are not new failures--Perl
+5.005_0x has the same bugs, but didn't have these tests.
+
+ lib/autouse.t 4
+ t/lib/thr5005.t 19-20
+
+=head2 UNICOS
+
+=over 4
+
+=item *
+
+ext/POSIX/sigaction subtests 6 and 13 may fail.
+
+=item *
+
+lib/ExtUtils may spuriously claim that subtest 28 failed,
+which is interesting since the test only has 27 tests.
+
+=item *
+
+Numerous numerical test failures
+
+ op/numconvert 209,210,217,218
+ op/override 7
+ ext/Time/HiRes/HiRes 9
+ lib/Math/BigInt/t/bigintpm 1145
+ lib/Math/Trig 25
+
+These tests fail because of yet unresolved floating point inaccuracies.
+
+=back
+
+=head2 UTS
+
+There are a few known test failures, see L<perluts>.
+
+=head2 VMS
+
+Rather many tests are failing in VMS but that actually more tests
+succeed in VMS than they used to, it's just that there are many,
+many more tests than there used to be.
+
+Here are the known failures from some compiler/platform combinations.
+
+DEC C V5.3-006 on OpenVMS VAX V6.2
+
+ [-.ext.list.util.t]tainted..............FAILED on test 3
+ [-.ext.posix]sigaction..................FAILED on test 7
+ [-.ext.time.hires]hires.................FAILED on test 14
+ [-.lib.file.find]taint..................FAILED on test 17
+ [-.lib.math.bigint.t]bigintpm...........FAILED on test 1183
+ [-.lib.test.simple.t]exit...............FAILED on test 1
+ [.lib]vmsish............................FAILED on test 13
+ [.op]sprintf............................FAILED on test 12
+ Failed 8/399 tests, 91.23% okay.
+
+DEC C V6.0-001 on OpenVMS Alpha V7.2-1 and
+Compaq C V6.2-008 on OpenVMS Alpha V7.1
+
+ [-.ext.list.util.t]tainted..............FAILED on test 3
+ [-.lib.file.find]taint..................FAILED on test 17
+ [-.lib.test.simple.t]exit...............FAILED on test 1
+ [.lib]vmsish............................FAILED on test 13
+ Failed 4/399 tests, 92.48% okay.
+
+Compaq C V6.4-005 on OpenVMS Alpha 7.2.1
+
+ [-.ext.b]showlex........................FAILED on test 1
+ [-.ext.list.util.t]tainted..............FAILED on test 3
+ [-.lib.file.find]taint..................FAILED on test 17
+ [-.lib.test.simple.t]exit...............FAILED on test 1
+ [.lib]vmsish............................FAILED on test 13
+ [.op]misc...............................FAILED on test 49
+ Failed 6/401 tests, 92.77% okay.
+
+=head2 Win32
+
+In multi-CPU boxes there are some problems with the I/O buffering:
+some output may appear twice.
+
+=head2 Localising a Tied Variable Leaks Memory
+
+ use Tie::Hash;
+ tie my %tie_hash => 'Tie::StdHash';
+
+ ...
+
+ local($tie_hash{Foo}) = 1; # leaks
+
+Code like the above is known to leak memory every time the local()
+is executed.
+
+=head2 Self-tying of Arrays and Hashes Is Forbidden
+
+Self-tying of arrays and hashes is broken in rather deep and
+hard-to-fix ways. As a stop-gap measure to avoid people from getting
+frustrated at the mysterious results (core dumps, most often) it is
+for now forbidden (you will get a fatal error even from an attempt).
+
+=head2 Variable Attributes are not Currently Usable for Tieing
+
+This limitation will hopefully be fixed in future. (Subroutine
+attributes work fine for tieing, see L<Attribute::Handlers>).
+
+=head2 Building Extensions Can Fail Because Of Largefiles
+
+Some extensions like mod_perl are known to have issues with
+`largefiles', a change brought by Perl 5.6.0 in which file offsets
+default to 64 bits wide, where supported. Modules may fail to compile
+at all or compile and work incorrectly. Currently there is no good
+solution for the problem, but Configure now provides appropriate
+non-largefile ccflags, ldflags, libswanted, and libs in the %Config
+hash (e.g., $Config{ccflags_nolargefiles}) so the extensions that are
+having problems can try configuring themselves without the
+largefileness. This is admittedly not a clean solution, and the
+solution may not even work at all. One potential failure is whether
+one can (or, if one can, whether it's a good idea) link together at
+all binaries with different ideas about file offsets, all this is
+platform-dependent.
+
+=head2 The Compiler Suite Is Still Experimental
+
+The compiler suite is slowly getting better but is nowhere near
+working order yet.
+
+=head2 The Long Double Support is Still Experimental
+
+The ability to configure Perl's numbers to use "long doubles",
+floating point numbers of hopefully better accuracy, is still
+experimental. The implementations of long doubles are not yet
+widespread and the existing implementations are not quite mature
+or standardised, therefore trying to support them is a rare
+and moving target. The gain of more precision may also be offset
+by slowdown in computations (more bits to move around, and the
+operations are more likely to be executed by less optimised
+libraries).
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/ There may also be
+information at http://www.perl.com/perl/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Jarkko Hietaniemi <F<jhi@iki.fi>>, with many contributions
+from The Perl Porters and Perl Users submitting feedback and patches.
+
+Send omissions or corrections to <F<perlbug@perl.org>>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl573delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl573delta.pod
new file mode 100755
index 00000000000..42ed2615613
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl573delta.pod
@@ -0,0 +1,246 @@
+=head1 NAME
+
+perl573delta - what's new for perl v5.7.3
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.7.2 release and the
+5.7.3 release.
+
+(To view the differences between the 5.6.0 release and the 5.7.0
+release, see L<perl570delta>. To view the differences between the
+5.7.0 release and the 5.7.1 release, see L<perl571delta>. To view
+the differences between the 5.7.1 release and the 5.7.2 release,
+see L<perl572delta>.)
+
+=head1 Changes
+
+This is just a selected list of some of the more notable changes.
+The numbers refer to the Perl repository change numbers; see
+L<Changes58> (or L<Changes> in Perl 5.8.1). In addition to these
+changes, lots of work took place in integrating threads, PerlIO, and
+Unicode; general code cleanup; and last but not least porting to
+non-UNIX lands such as Win32, VMS, Cygwin, DJGPP, VOS, MacOS Classic,
+and EBCDIC.
+
+=over 4
+
+=item 11362
+
+add LC_MESSAGES to POSIX :locale_h export tag
+
+=item 11371
+
+add DEL to [:cntrl:]
+
+=item 11375
+
+make h2ph understand constants like 1234L and 5678LL
+
+=item 11405
+
+Win32: fix bugs in handling of the virtualized environment
+
+=item 11410
+
+fix a bug in the security taint checking of open()
+
+=item 11423
+
+make perl fork() safe even on platforms that don't have pthread_atfork()
+
+=item 11459
+
+make switching optimization and debugging levels during Perl builds
+easier via the OPTIMIZE environment variable
+
+=item 11475
+
+make split()'s unused captures to be undef, not ''
+
+=item 11485
+
+Search::Dict: allow transforming lines before comparing
+
+=item 11490
+
+allow installing extra modules or bundles when building Perl
+
+=item 11516
+
+add -Wall in cflags when compiling with gcc to weed out dubious
+C practices
+
+=item 11541
+
+pluggable optimizer
+
+=item 11549
+
+WinCE: integrate the port
+
+=item 11589
+
+Win32: 4-arg select was broken
+
+=item 11594
+
+introduce the perlivp utility for verifying the Perl installation
+(IVP = Installation Verification Procedure)
+
+=item 11623
+
+rename lib/unicode to lib/unicore to avoid case-insensitivity problems
+with lib/Unicode
+
+=item 111631
+
+remove Time::Piece
+
+=item 11643
+
+document that use utf8 is not the right way most of the time
+
+=item 11656
+
+allow building perl with -DUSE_UTF8_SCRIPTS which makes UTF-8
+the default script encoding (not the default since that would
+break all scripts having legacy eight-bit data in them)
+
+=item 11725
+
+division preserving 64-bit integers
+
+=item 11743
+
+document the coderef-in-@INC feature
+
+=item 11794
+
+modulo (%) preserving 64-bit integers
+
+=item 11825
+
+update to Unicode 3.1.1
+
+=item 11865
+
+add the \[$@%&*] prototype support
+
+=item 11874
+
+oct() and hex() in glorious 64 bit
+
+=item 11877
+
+Class::Struct: allow recursive classes
+
+=item 11993
+
+fix unpack U to be the reverse of pack U
+
+=item 12056
+
+VMS: waitpid enhancements
+
+=item 12180
+
+unpack("Z*Z*", pack("Z*Z*", ..)) was broken
+
+=item 12243
+
+Devel::Peek: display UTF-8 SVs also as \x{...}
+
+=item 12288
+
+Data::Dumper: option to sort hashes
+
+=item 12542
+
+add perlpodspec
+
+=item 12652
+
+threadsafe DynaLoader, re, Opcode, File::Glob, and B
+
+=item 12756
+
+support BeOS better
+
+=item 12874
+
+read-only hashes (user-level interface is Hash::Util)
+
+=item 13162
+
+add Devel::PPPort
+
+=item 13179
+
+add the sort pragma
+
+=item 13326
+
+VMS: fix perl -P
+
+=item 13358
+
+add perlpacktut
+
+=item 13452
+
+SUPER-UX: add hints file
+
+=item 13575
+
+Win32: non-blocking waitpid(-1,WNOHANG)
+
+=item 13684
+
+introduce the -t option for gentler taint checking
+
+=item 14694
+
+add the if pragma
+
+=item 14832
+
+implement IV/UV/NV/long double un/packing with j/J/F/D
+
+=item 14854
+
+document the new taint behaviour of exec LIST and system LIST
+
+=back
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org. There may also be
+information at http://www.perl.com/, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Jarkko Hietaniemi <F<jhi@iki.fi>>, with many contributions
+from The Perl Porters and Perl Users submitting feedback and patches.
+
+Send omissions or corrections to <F<perlbug@perl.org>>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl581delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl581delta.pod
new file mode 100755
index 00000000000..ecefbf7a1c7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl581delta.pod
@@ -0,0 +1,1102 @@
+=head1 NAME
+
+perl581delta - what is new for perl v5.8.1
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.0 release and
+the 5.8.1 release.
+
+If you are upgrading from an earlier release such as 5.6.1, first read
+the L<perl58delta>, which describes differences between 5.6.0 and
+5.8.0.
+
+In case you are wondering about 5.6.1, it was bug-fix-wise rather
+identical to the development release 5.7.1. Confused? This timeline
+hopefully helps a bit: it lists the new major releases, their maintenance
+releases, and the development releases.
+
+ New Maintenance Development
+
+ 5.6.0 2000-Mar-22
+ 5.7.0 2000-Sep-02
+ 5.6.1 2001-Apr-08
+ 5.7.1 2001-Apr-09
+ 5.7.2 2001-Jul-13
+ 5.7.3 2002-Mar-05
+ 5.8.0 2002-Jul-18
+ 5.8.1 2003-Sep-25
+
+=head1 Incompatible Changes
+
+=head2 Hash Randomisation
+
+Mainly due to security reasons, the "random ordering" of hashes
+has been made even more random. Previously while the order of hash
+elements from keys(), values(), and each() was essentially random,
+it was still repeatable. Now, however, the order varies between
+different runs of Perl.
+
+B<Perl has never guaranteed any ordering of the hash keys>, and the
+ordering has already changed several times during the lifetime of
+Perl 5. Also, the ordering of hash keys has always been, and
+continues to be, affected by the insertion order.
+
+The added randomness may affect applications.
+
+One possible scenario is when output of an application has included
+hash data. For example, if you have used the Data::Dumper module to
+dump data into different files, and then compared the files to see
+whether the data has changed, now you will have false positives since
+the order in which hashes are dumped will vary. In general the cure
+is to sort the keys (or the values); in particular for Data::Dumper to
+use the C<Sortkeys> option. If some particular order is really
+important, use tied hashes: for example the Tie::IxHash module
+which by default preserves the order in which the hash elements
+were added.
+
+More subtle problem is reliance on the order of "global destruction".
+That is what happens at the end of execution: Perl destroys all data
+structures, including user data. If your destructors (the DESTROY
+subroutines) have assumed any particular ordering to the global
+destruction, there might be problems ahead. For example, in a
+destructor of one object you cannot assume that objects of any other
+class are still available, unless you hold a reference to them.
+If the environment variable PERL_DESTRUCT_LEVEL is set to a non-zero
+value, or if Perl is exiting a spawned thread, it will also destruct
+the ordinary references and the symbol tables that are no longer in use.
+You can't call a class method or an ordinary function on a class that
+has been collected that way.
+
+The hash randomisation is certain to reveal hidden assumptions about
+some particular ordering of hash elements, and outright bugs: it
+revealed a few bugs in the Perl core and core modules.
+
+To disable the hash randomisation in runtime, set the environment
+variable PERL_HASH_SEED to 0 (zero) before running Perl (for more
+information see L<perlrun/PERL_HASH_SEED>), or to disable the feature
+completely in compile time, compile with C<-DNO_HASH_SEED> (see F<INSTALL>).
+
+See L<perlsec/"Algorithmic Complexity Attacks"> for the original
+rationale behind this change.
+
+=head2 UTF-8 On Filehandles No Longer Activated By Locale
+
+In Perl 5.8.0 all filehandles, including the standard filehandles,
+were implicitly set to be in Unicode UTF-8 if the locale settings
+indicated the use of UTF-8. This feature caused too many problems,
+so the feature was turned off and redesigned: see L</"Core Enhancements">.
+
+=head2 Single-number v-strings are no longer v-strings before "=>"
+
+The version strings or v-strings (see L<perldata/"Version Strings">)
+feature introduced in Perl 5.6.0 has been a source of some confusion--
+especially when the user did not want to use it, but Perl thought it
+knew better. Especially troublesome has been the feature that before
+a "=>" a version string (a "v" followed by digits) has been interpreted
+as a v-string instead of a string literal. In other words:
+
+ %h = ( v65 => 42 );
+
+has meant since Perl 5.6.0
+
+ %h = ( 'A' => 42 );
+
+(at least in platforms of ASCII progeny) Perl 5.8.1 restores the
+more natural interpretation
+
+ %h = ( 'v65' => 42 );
+
+The multi-number v-strings like v65.66 and 65.66.67 still continue to
+be v-strings in Perl 5.8.
+
+=head2 (Win32) The -C Switch Has Been Repurposed
+
+The -C switch has changed in an incompatible way. The old semantics
+of this switch only made sense in Win32 and only in the "use utf8"
+universe in 5.6.x releases, and do not make sense for the Unicode
+implementation in 5.8.0. Since this switch could not have been used
+by anyone, it has been repurposed. The behavior that this switch
+enabled in 5.6.x releases may be supported in a transparent,
+data-dependent fashion in a future release.
+
+For the new life of this switch, see L<"UTF-8 no longer default under
+UTF-8 locales">, and L<perlrun/-C>.
+
+=head2 (Win32) The /d Switch Of cmd.exe
+
+Perl 5.8.1 uses the /d switch when running the cmd.exe shell
+internally for system(), backticks, and when opening pipes to external
+programs. The extra switch disables the execution of AutoRun commands
+from the registry, which is generally considered undesirable when
+running external programs. If you wish to retain compatibility with
+the older behavior, set PERL5SHELL in your environment to C<cmd /x/c>.
+
+=head1 Core Enhancements
+
+=head2 UTF-8 no longer default under UTF-8 locales
+
+In Perl 5.8.0 many Unicode features were introduced. One of them
+was found to be of more nuisance than benefit: the automagic
+(and silent) "UTF-8-ification" of filehandles, including the
+standard filehandles, if the user's locale settings indicated
+use of UTF-8.
+
+For example, if you had C<en_US.UTF-8> as your locale, your STDIN and
+STDOUT were automatically "UTF-8", in other words an implicit
+binmode(..., ":utf8") was made. This meant that trying to print, say,
+chr(0xff), ended up printing the bytes 0xc3 0xbf. Hardly what
+you had in mind unless you were aware of this feature of Perl 5.8.0.
+The problem is that the vast majority of people weren't: for example
+in RedHat releases 8 and 9 the B<default> locale setting is UTF-8, so
+all RedHat users got UTF-8 filehandles, whether they wanted it or not.
+The pain was intensified by the Unicode implementation of Perl 5.8.0
+(still) having nasty bugs, especially related to the use of s/// and
+tr///. (Bugs that have been fixed in 5.8.1)
+
+Therefore a decision was made to backtrack the feature and change it
+from implicit silent default to explicit conscious option. The new
+Perl command line option C<-C> and its counterpart environment
+variable PERL_UNICODE can now be used to control how Perl and Unicode
+interact at interfaces like I/O and for example the command line
+arguments. See L<perlrun/-C> and L<perlrun/PERL_UNICODE> for more
+information.
+
+=head2 Unsafe signals again available
+
+In Perl 5.8.0 the so-called "safe signals" were introduced. This
+means that Perl no longer handles signals immediately but instead
+"between opcodes", when it is safe to do so. The earlier immediate
+handling easily could corrupt the internal state of Perl, resulting
+in mysterious crashes.
+
+However, the new safer model has its problems too. Because now an
+opcode, a basic unit of Perl execution, is never interrupted but
+instead let to run to completion, certain operations that can take a
+long time now really do take a long time. For example, certain
+network operations have their own blocking and timeout mechanisms, and
+being able to interrupt them immediately would be nice.
+
+Therefore perl 5.8.1 introduces a "backdoor" to restore the pre-5.8.0
+(pre-5.7.3, really) signal behaviour. Just set the environment variable
+PERL_SIGNALS to C<unsafe>, and the old immediate (and unsafe)
+signal handling behaviour returns. See L<perlrun/PERL_SIGNALS>
+and L<perlipc/"Deferred Signals (Safe Signals)">.
+
+In completely unrelated news, you can now use safe signals with
+POSIX::SigAction. See L<POSIX/POSIX::SigAction>.
+
+=head2 Tied Arrays with Negative Array Indices
+
+Formerly, the indices passed to C<FETCH>, C<STORE>, C<EXISTS>, and
+C<DELETE> methods in tied array class were always non-negative. If
+the actual argument was negative, Perl would call FETCHSIZE implicitly
+and add the result to the index before passing the result to the tied
+array method. This behaviour is now optional. If the tied array class
+contains a package variable named C<$NEGATIVE_INDICES> which is set to
+a true value, negative values will be passed to C<FETCH>, C<STORE>,
+C<EXISTS>, and C<DELETE> unchanged.
+
+=head2 local ${$x}
+
+The syntaxes
+
+ local ${$x}
+ local @{$x}
+ local %{$x}
+
+now do localise variables, given that the $x is a valid variable name.
+
+=head2 Unicode Character Database 4.0.0
+
+The copy of the Unicode Character Database included in Perl 5.8 has
+been updated to 4.0.0 from 3.2.0. This means for example that the
+Unicode character properties are as in Unicode 4.0.0.
+
+=head2 Deprecation Warnings
+
+There is one new feature deprecation. Perl 5.8.0 forgot to add
+some deprecation warnings, these warnings have now been added.
+Finally, a reminder of an impending feature removal.
+
+=head3 (Reminder) Pseudo-hashes are deprecated (really)
+
+Pseudo-hashes were deprecated in Perl 5.8.0 and will be removed in
+Perl 5.10.0, see L<perl58delta> for details. Each attempt to access
+pseudo-hashes will trigger the warning C<Pseudo-hashes are deprecated>.
+If you really want to continue using pseudo-hashes but not to see the
+deprecation warnings, use:
+
+ no warnings 'deprecated';
+
+Or you can continue to use the L<fields> pragma, but please don't
+expect the data structures to be pseudohashes any more.
+
+=head3 (Reminder) 5.005-style threads are deprecated (really)
+
+5.005-style threads (activated by C<use Thread;>) were deprecated in
+Perl 5.8.0 and will be removed after Perl 5.8, see L<perl58delta> for
+details. Each 5.005-style thread creation will trigger the warning
+C<5.005 threads are deprecated>. If you really want to continue
+using the 5.005 threads but not to see the deprecation warnings, use:
+
+ no warnings 'deprecated';
+
+=head3 (Reminder) The $* variable is deprecated (really)
+
+The C<$*> variable controlling multi-line matching has been deprecated
+and will be removed after 5.8. The variable has been deprecated for a
+long time, and a deprecation warning C<Use of $* is deprecated> is given,
+now the variable will just finally be removed. The functionality has
+been supplanted by the C</s> and C</m> modifiers on pattern matching.
+If you really want to continue using the C<$*>-variable but not to see
+the deprecation warnings, use:
+
+ no warnings 'deprecated';
+
+=head2 Miscellaneous Enhancements
+
+C<map> in void context is no longer expensive. C<map> is now context
+aware, and will not construct a list if called in void context.
+
+If a socket gets closed by the server while printing to it, the client
+now gets a SIGPIPE. While this new feature was not planned, it fell
+naturally out of PerlIO changes, and is to be considered an accidental
+feature.
+
+PerlIO::get_layers(FH) returns the names of the PerlIO layers
+active on a filehandle.
+
+PerlIO::via layers can now have an optional UTF8 method to
+indicate whether the layer wants to "auto-:utf8" the stream.
+
+utf8::is_utf8() has been added as a quick way to test whether
+a scalar is encoded internally in UTF-8 (Unicode).
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules And Pragmata
+
+The following modules and pragmata have been updated since Perl 5.8.0:
+
+=over 4
+
+=item base
+
+=item B::Bytecode
+
+In much better shape than it used to be. Still far from perfect, but
+maybe worth a try.
+
+=item B::Concise
+
+=item B::Deparse
+
+=item Benchmark
+
+An optional feature, C<:hireswallclock>, now allows for high
+resolution wall clock times (uses Time::HiRes).
+
+=item ByteLoader
+
+See B::Bytecode.
+
+=item bytes
+
+Now has bytes::substr.
+
+=item CGI
+
+=item charnames
+
+One can now have custom character name aliases.
+
+=item CPAN
+
+There is now a simple command line frontend to the CPAN.pm
+module called F<cpan>.
+
+=item Data::Dumper
+
+A new option, Pair, allows choosing the separator between hash keys
+and values.
+
+=item DB_File
+
+=item Devel::PPPort
+
+=item Digest::MD5
+
+=item Encode
+
+Significant updates on the encoding pragma functionality
+(tr/// and the DATA filehandle, formats).
+
+If a filehandle has been marked as to have an encoding, unmappable
+characters are detected already during input, not later (when the
+corrupted data is being used).
+
+The ISO 8859-6 conversion table has been corrected (the 0x30..0x39
+erroneously mapped to U+0660..U+0669, instead of U+0030..U+0039). The
+GSM 03.38 conversion did not handle escape sequences correctly. The
+UTF-7 encoding has been added (making Encode feature-complete with
+Unicode::String).
+
+=item fields
+
+=item libnet
+
+=item Math::BigInt
+
+A lot of bugs have been fixed since v1.60, the version included in Perl
+v5.8.0. Especially noteworthy are the bug in Calc that caused div and mod to
+fail for some large values, and the fixes to the handling of bad inputs.
+
+Some new features were added, e.g. the broot() method, you can now pass
+parameters to config() to change some settings at runtime, and it is now
+possible to trap the creation of NaN and infinity.
+
+As usual, some optimizations took place and made the math overall a tad
+faster. In some cases, quite a lot faster, actually. Especially alternative
+libraries like Math::BigInt::GMP benefit from this. In addition, a lot of the
+quite clunky routines like fsqrt() and flog() are now much much faster.
+
+=item MIME::Base64
+
+=item NEXT
+
+Diamond inheritance now works.
+
+=item Net::Ping
+
+=item PerlIO::scalar
+
+Reading from non-string scalars (like the special variables, see
+L<perlvar>) now works.
+
+=item podlators
+
+=item Pod::LaTeX
+
+=item PodParsers
+
+=item Pod::Perldoc
+
+Complete rewrite. As a side-effect, no longer refuses to startup when
+run by root.
+
+=item Scalar::Util
+
+New utilities: refaddr, isvstring, looks_like_number, set_prototype.
+
+=item Storable
+
+Can now store code references (via B::Deparse, so not foolproof).
+
+=item strict
+
+Earlier versions of the strict pragma did not check the parameters
+implicitly passed to its "import" (use) and "unimport" (no) routine.
+This caused the false idiom such as:
+
+ use strict qw(@ISA);
+ @ISA = qw(Foo);
+
+This however (probably) raised the false expectation that the strict
+refs, vars and subs were being enforced (and that @ISA was somehow
+"declared"). But the strict refs, vars, and subs are B<not> enforced
+when using this false idiom.
+
+Starting from Perl 5.8.1, the above B<will> cause an error to be
+raised. This may cause programs which used to execute seemingly
+correctly without warnings and errors to fail when run under 5.8.1.
+This happens because
+
+ use strict qw(@ISA);
+
+will now fail with the error:
+
+ Unknown 'strict' tag(s) '@ISA'
+
+The remedy to this problem is to replace this code with the correct idiom:
+
+ use strict;
+ use vars qw(@ISA);
+ @ISA = qw(Foo);
+
+=item Term::ANSIcolor
+
+=item Test::Harness
+
+Now much more picky about extra or missing output from test scripts.
+
+=item Test::More
+
+=item Test::Simple
+
+=item Text::Balanced
+
+=item Time::HiRes
+
+Use of nanosleep(), if available, allows mixing subsecond sleeps with
+alarms.
+
+=item threads
+
+Several fixes, for example for join() problems and memory
+leaks. In some platforms (like Linux) that use glibc the minimum memory
+footprint of one ithread has been reduced by several hundred kilobytes.
+
+=item threads::shared
+
+Many memory leaks have been fixed.
+
+=item Unicode::Collate
+
+=item Unicode::Normalize
+
+=item Win32::GetFolderPath
+
+=item Win32::GetOSVersion
+
+Now returns extra information.
+
+=back
+
+=head1 Utility Changes
+
+The C<h2xs> utility now produces a more modern layout:
+F<Foo-Bar/lib/Foo/Bar.pm> instead of F<Foo/Bar/Bar.pm>.
+Also, the boilerplate test is now called F<t/Foo-Bar.t>
+instead of F<t/1.t>.
+
+The Perl debugger (F<lib/perl5db.pl>) has now been extensively
+documented and bugs found while documenting have been fixed.
+
+C<perldoc> has been rewritten from scratch to be more robust and
+feature rich.
+
+C<perlcc -B> works now at least somewhat better, while C<perlcc -c>
+is rather more broken. (The Perl compiler suite as a whole continues
+to be experimental.)
+
+=head1 New Documentation
+
+perl573delta has been added to list the differences between the
+(now quite obsolete) development releases 5.7.2 and 5.7.3.
+
+perl58delta has been added: it is the perldelta of 5.8.0, detailing
+the differences between 5.6.0 and 5.8.0.
+
+perlartistic has been added: it is the Artistic License in pod format,
+making it easier for modules to refer to it.
+
+perlcheat has been added: it is a Perl cheat sheet.
+
+perlgpl has been added: it is the GNU General Public License in pod
+format, making it easier for modules to refer to it.
+
+perlmacosx has been added to tell about the installation and use
+of Perl in Mac OS X.
+
+perlos400 has been added to tell about the installation and use
+of Perl in OS/400 PASE.
+
+perlreref has been added: it is a regular expressions quick reference.
+
+=head1 Installation and Configuration Improvements
+
+The UNIX standard Perl location, F</usr/bin/perl>, is no longer
+overwritten by default if it exists. This change was very prudent
+because so many UNIX vendors already provide a F</usr/bin/perl>,
+but simultaneously many system utilities may depend on that
+exact version of Perl, so better not to overwrite it.
+
+One can now specify installation directories for site and vendor man
+and HTML pages, and site and vendor scripts. See F<INSTALL>.
+
+One can now specify a destination directory for Perl installation
+by specifying the DESTDIR variable for C<make install>. (This feature
+is slightly different from the previous C<Configure -Dinstallprefix=...>.)
+See F<INSTALL>.
+
+gcc versions 3.x introduced a new warning that caused a lot of noise
+during Perl compilation: C<gcc -Ialreadyknowndirectory (warning:
+changing search order)>. This warning has now been avoided by
+Configure weeding out such directories before the compilation.
+
+One can now build subsets of Perl core modules by using the
+Configure flags C<-Dnoextensions=...> and C<-Donlyextensions=...>,
+see F<INSTALL>.
+
+=head2 Platform-specific enhancements
+
+In Cygwin Perl can now be built with threads (C<Configure -Duseithreads>).
+This works with both Cygwin 1.3.22 and Cygwin 1.5.3.
+
+In newer FreeBSD releases Perl 5.8.0 compilation failed because of
+trying to use F<malloc.h>, which in FreeBSD is just a dummy file, and
+a fatal error to even try to use. Now F<malloc.h> is not used.
+
+Perl is now known to build also in Hitachi HI-UXMPP.
+
+Perl is now known to build again in LynxOS.
+
+Mac OS X now installs with Perl version number embedded in
+installation directory names for easier upgrading of user-compiled
+Perl, and the installation directories in general are more standard.
+In other words, the default installation no longer breaks the
+Apple-provided Perl. On the other hand, with C<Configure -Dprefix=/usr>
+you can now really replace the Apple-supplied Perl (B<please be careful>).
+
+Mac OS X now builds Perl statically by default. This change was done
+mainly for faster startup times. The Apple-provided Perl is still
+dynamically linked and shared, and you can enable the sharedness for
+your own Perl builds by C<Configure -Duseshrplib>.
+
+Perl has been ported to IBM's OS/400 PASE environment. The best way
+to build a Perl for PASE is to use an AIX host as a cross-compilation
+environment. See README.os400.
+
+Yet another cross-compilation option has been added: now Perl builds
+on OpenZaurus, an Linux distribution based on Mandrake + Embedix for
+the Sharp Zaurus PDA. See the Cross/README file.
+
+Tru64 when using gcc 3 drops the optimisation for F<toke.c> to C<-O2>
+because of gigantic memory use with the default C<-O3>.
+
+Tru64 can now build Perl with the newer Berkeley DBs.
+
+Building Perl on WinCE has been much enhanced, see F<README.ce>
+and F<README.perlce>.
+
+=head1 Selected Bug Fixes
+
+=head2 Closures, eval and lexicals
+
+There have been many fixes in the area of anonymous subs, lexicals and
+closures. Although this means that Perl is now more "correct", it is
+possible that some existing code will break that happens to rely on
+the faulty behaviour. In practice this is unlikely unless your code
+contains a very complex nesting of anonymous subs, evals and lexicals.
+
+=head2 Generic fixes
+
+If an input filehandle is marked C<:utf8> and Perl sees illegal UTF-8
+coming in when doing C<< <FH> >>, if warnings are enabled a warning is
+immediately given - instead of being silent about it and Perl being
+unhappy about the broken data later. (The C<:encoding(utf8)> layer
+also works the same way.)
+
+binmode(SOCKET, ":utf8") only worked on the input side, not on the
+output side of the socket. Now it works both ways.
+
+For threaded Perls certain system database functions like getpwent()
+and getgrent() now grow their result buffer dynamically, instead of
+failing. This means that at sites with lots of users and groups the
+functions no longer fail by returning only partial results.
+
+Perl 5.8.0 had accidentally broken the capability for users
+to define their own uppercase<->lowercase Unicode mappings
+(as advertised by the Camel). This feature has been fixed and
+is also documented better.
+
+In 5.8.0 this
+
+ $some_unicode .= <FH>;
+
+didn't work correctly but instead corrupted the data. This has now
+been fixed.
+
+Tied methods like FETCH etc. may now safely access tied values, i.e.
+resulting in a recursive call to FETCH etc. Remember to break the
+recursion, though.
+
+At startup Perl blocks the SIGFPE signal away since there isn't much
+Perl can do about it. Previously this blocking was in effect also for
+programs executed from within Perl. Now Perl restores the original
+SIGFPE handling routine, whatever it was, before running external
+programs.
+
+Linenumbers in Perl scripts may now be greater than 65536, or 2**16.
+(Perl scripts have always been able to be larger than that, it's just
+that the linenumber for reported errors and warnings have "wrapped
+around".) While scripts that large usually indicate a need to rethink
+your code a bit, such Perl scripts do exist, for example as results
+from generated code. Now linenumbers can go all the way to
+4294967296, or 2**32.
+
+=head2 Platform-specific fixes
+
+Linux
+
+=over 4
+
+=item *
+
+Setting $0 works again (with certain limitations that
+Perl cannot do much about: see L<perlvar/$0>)
+
+=back
+
+HP-UX
+
+=over 4
+
+=item *
+
+Setting $0 now works.
+
+=back
+
+VMS
+
+=over 4
+
+=item *
+
+Configuration now tests for the presence of C<poll()>, and IO::Poll
+now uses the vendor-supplied function if detected.
+
+=item *
+
+A rare access violation at Perl start-up could occur if the Perl image was
+installed with privileges or if there was an identifier with the
+subsystem attribute set in the process's rightslist. Either of these
+circumstances triggered tainting code that contained a pointer bug.
+The faulty pointer arithmetic has been fixed.
+
+=item *
+
+The length limit on values (not keys) in the %ENV hash has been raised
+from 255 bytes to 32640 bytes (except when the PERL_ENV_TABLES setting
+overrides the default use of logical names for %ENV). If it is
+necessary to access these long values from outside Perl, be aware that
+they are implemented using search list logical names that store the
+value in pieces, each 255-byte piece (up to 128 of them) being an
+element in the search list. When doing a lookup in %ENV from within
+Perl, the elements are combined into a single value. The existing
+VMS-specific ability to access individual elements of a search list
+logical name via the $ENV{'foo;N'} syntax (where N is the search list
+index) is unimpaired.
+
+=item *
+
+The piping implementation now uses local rather than global DCL
+symbols for inter-process communication.
+
+=item *
+
+File::Find could become confused when navigating to a relative
+directory whose name collided with a logical name. This problem has
+been corrected by adding directory syntax to relative path names, thus
+preventing logical name translation.
+
+=back
+
+Win32
+
+=over 4
+
+=item *
+
+A memory leak in the fork() emulation has been fixed.
+
+=item *
+
+The return value of the ioctl() built-in function was accidentally
+broken in 5.8.0. This has been corrected.
+
+=item *
+
+The internal message loop executed by perl during blocking operations
+sometimes interfered with messages that were external to Perl.
+This often resulted in blocking operations terminating prematurely or
+returning incorrect results, when Perl was executing under environments
+that could generate Windows messages. This has been corrected.
+
+=item *
+
+Pipes and sockets are now automatically in binary mode.
+
+=item *
+
+The four-argument form of select() did not preserve $! (errno) properly
+when there were errors in the underlying call. This is now fixed.
+
+=item *
+
+The "CR CR LF" problem of has been fixed, binmode(FH, ":crlf")
+is now effectively a no-op.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+All the warnings related to pack() and unpack() were made more
+informative and consistent.
+
+=head2 Changed "A thread exited while %d threads were running"
+
+The old version
+
+ A thread exited while %d other threads were still running
+
+was misleading because the "other" included also the thread giving
+the warning.
+
+=head2 Removed "Attempt to clear a restricted hash"
+
+It is not illegal to clear a restricted hash, so the warning
+was removed.
+
+=head2 New "Illegal declaration of anonymous subroutine"
+
+You must specify the block of code for C<sub>.
+
+=head2 Changed "Invalid range "%s" in transliteration operator"
+
+The old version
+
+ Invalid [] range "%s" in transliteration operator
+
+was simply wrong because there are no "[] ranges" in tr///.
+
+=head2 New "Missing control char name in \c"
+
+Self-explanatory.
+
+=head2 New "Newline in left-justified string for %s"
+
+The padding spaces would appear after the newline, which is
+probably not what you had in mind.
+
+=head2 New "Possible precedence problem on bitwise %c operator"
+
+If you think this
+
+ $x & $y == 0
+
+tests whether the bitwise AND of $x and $y is zero,
+you will like this warning.
+
+=head2 New "Pseudo-hashes are deprecated"
+
+This warning should have been already in 5.8.0, since they are.
+
+=head2 New "read() on %s filehandle %s"
+
+You cannot read() (or sysread()) from a closed or unopened filehandle.
+
+=head2 New "5.005 threads are deprecated"
+
+This warning should have been already in 5.8.0, since they are.
+
+=head2 New "Tied variable freed while still in use"
+
+Something pulled the plug on a live tied variable, Perl plays
+safe by bailing out.
+
+=head2 New "To%s: illegal mapping '%s'"
+
+An illegal user-defined Unicode casemapping was specified.
+
+=head2 New "Use of freed value in iteration"
+
+Something modified the values being iterated over. This is not good.
+
+=head1 Changed Internals
+
+These news matter to you only if you either write XS code or like to
+know about or hack Perl internals (using Devel::Peek or any of the
+C<B::> modules counts), or like to run Perl with the C<-D> option.
+
+The embedding examples of L<perlembed> have been reviewed to be
+up to date and consistent: for example, the correct use of
+PERL_SYS_INIT3() and PERL_SYS_TERM().
+
+Extensive reworking of the pad code (the code responsible
+for lexical variables) has been conducted by Dave Mitchell.
+
+Extensive work on the v-strings by John Peacock.
+
+UTF-8 length and position cache: to speed up the handling of Unicode
+(UTF-8) scalars, a cache was introduced. Potential problems exist if
+an extension bypasses the official APIs and directly modifies the PV
+of an SV: the UTF-8 cache does not get cleared as it should.
+
+APIs obsoleted in Perl 5.8.0, like sv_2pv, sv_catpvn, sv_catsv,
+sv_setsv, are again available.
+
+Certain Perl core C APIs like cxinc and regatom are no longer
+available at all to code outside the Perl core of the Perl core
+extensions. This is intentional. They never should have been
+available with the shorter names, and if you application depends on
+them, you should (be ashamed and) contact perl5-porters to discuss
+what are the proper APIs.
+
+Certain Perl core C APIs like C<Perl_list> are no longer available
+without their C<Perl_> prefix. If your XS module stops working
+because some functions cannot be found, in many cases a simple fix is
+to add the C<Perl_> prefix to the function and the thread context
+C<aTHX_> as the first argument of the function call. This is also how
+it should always have been done: letting the Perl_-less forms to leak
+from the core was an accident. For cleaner embedding you can also
+force this for all APIs by defining at compile time the cpp define
+PERL_NO_SHORT_NAMES.
+
+Perl_save_bool() has been added.
+
+Regexp objects (those created with C<qr>) now have S-magic rather than
+R-magic. This fixed regexps of the form /...(??{...;$x})/ to no
+longer ignore changes made to $x. The S-magic avoids dropping
+the caching optimization and making (??{...}) constructs obscenely
+slow (and consequently useless). See also L<perlguts/"Magic Variables">.
+Regexp::Copy was affected by this change.
+
+The Perl internal debugging macros DEBUG() and DEB() have been renamed
+to PERL_DEBUG() and PERL_DEB() to avoid namespace conflicts.
+
+C<-DL> removed (the leaktest had been broken and unsupported for years,
+use alternative debugging mallocs or tools like valgrind and Purify).
+
+Verbose modifier C<v> added for C<-DXv> and C<-Dsv>, see L<perlrun>.
+
+=head1 New Tests
+
+In Perl 5.8.0 there were about 69000 separate tests in about 700 test files,
+in Perl 5.8.1 there are about 77000 separate tests in about 780 test files.
+The exact numbers depend on the Perl configuration and on the operating
+system platform.
+
+=head1 Known Problems
+
+The hash randomisation mentioned in L</Incompatible Changes> is definitely
+problematic: it will wake dormant bugs and shake out bad assumptions.
+
+If you want to use mod_perl 2.x with Perl 5.8.1, you will need
+mod_perl-1.99_10 or higher. Earlier versions of mod_perl 2.x
+do not work with the randomised hashes. (mod_perl 1.x works fine.)
+You will also need Apache::Test 1.04 or higher.
+
+Many of the rarer platforms that worked 100% or pretty close to it
+with perl 5.8.0 have been left a little bit untended since their
+maintainers have been otherwise busy lately, and therefore there will
+be more failures on those platforms. Such platforms include Mac OS
+Classic, IBM z/OS (and other EBCDIC platforms), and NetWare. The most
+common Perl platforms (Unix and Unix-like, Microsoft platforms, and
+VMS) have large enough testing and expert population that they are
+doing well.
+
+=head2 Tied hashes in scalar context
+
+Tied hashes do not currently return anything useful in scalar context,
+for example when used as boolean tests:
+
+ if (%tied_hash) { ... }
+
+The current nonsensical behaviour is always to return false,
+regardless of whether the hash is empty or has elements.
+
+The root cause is that there is no interface for the implementors of
+tied hashes to implement the behaviour of a hash in scalar context.
+
+=head2 Net::Ping 450_service and 510_ping_udp failures
+
+The subtests 9 and 18 of lib/Net/Ping/t/450_service.t, and the
+subtest 2 of lib/Net/Ping/t/510_ping_udp.t might fail if you have
+an unusual networking setup. For example in the latter case the
+test is trying to send a UDP ping to the IP address 127.0.0.1.
+
+=head2 B::C
+
+The C-generating compiler backend B::C (the frontend being
+C<perlcc -c>) is even more broken than it used to be because of
+the extensive lexical variable changes. (The good news is that
+B::Bytecode and ByteLoader are better than they used to be.)
+
+=head1 Platform Specific Problems
+
+=head2 EBCDIC Platforms
+
+IBM z/OS and other EBCDIC platforms continue to be problematic
+regarding Unicode support. Many Unicode tests are skipped when
+they really should be fixed.
+
+=head2 Cygwin 1.5 problems
+
+In Cygwin 1.5 the F<io/tell> and F<op/sysio> tests have failures for
+some yet unknown reason. In 1.5.5 the threads tests stress_cv,
+stress_re, and stress_string are failing unless the environment
+variable PERLIO is set to "perlio" (which makes also the io/tell
+failure go away).
+
+Perl 5.8.1 does build and work well with Cygwin 1.3: with (uname -a)
+C<CYGWIN_NT-5.0 ... 1.3.22(0.78/3/2) 2003-03-18 09:20 i686 ...>
+a 100% "make test" was achieved with C<Configure -des -Duseithreads>.
+
+=head2 HP-UX: HP cc warnings about sendfile and sendpath
+
+With certain HP C compiler releases (e.g. B.11.11.02) you will
+get many warnings like this (lines wrapped for easier reading):
+
+ cc: "/usr/include/sys/socket.h", line 504: warning 562:
+ Redeclaration of "sendfile" with a different storage class specifier:
+ "sendfile" will have internal linkage.
+ cc: "/usr/include/sys/socket.h", line 505: warning 562:
+ Redeclaration of "sendpath" with a different storage class specifier:
+ "sendpath" will have internal linkage.
+
+The warnings show up both during the build of Perl and during certain
+lib/ExtUtils tests that invoke the C compiler. The warning, however,
+is not serious and can be ignored.
+
+=head2 IRIX: t/uni/tr_7jis.t falsely failing
+
+The test t/uni/tr_7jis.t is known to report failure under 'make test'
+or the test harness with certain releases of IRIX (at least IRIX 6.5
+and MIPSpro Compilers Version 7.3.1.1m), but if run manually the test
+fully passes.
+
+=head2 Mac OS X: no usemymalloc
+
+The Perl malloc (C<-Dusemymalloc>) does not work at all in Mac OS X.
+This is not that serious, though, since the native malloc works just
+fine.
+
+=head2 Tru64: No threaded builds with GNU cc (gcc)
+
+In the latest Tru64 releases (e.g. v5.1B or later) gcc cannot be used
+to compile a threaded Perl (-Duseithreads) because the system
+C<< <pthread.h> >> file doesn't know about gcc.
+
+=head2 Win32: sysopen, sysread, syswrite
+
+As of the 5.8.0 release, sysopen()/sysread()/syswrite() do not behave
+like they used to in 5.6.1 and earlier with respect to "text" mode.
+These built-ins now always operate in "binary" mode (even if sysopen()
+was passed the O_TEXT flag, or if binmode() was used on the file
+handle). Note that this issue should only make a difference for disk
+files, as sockets and pipes have always been in "binary" mode in the
+Windows port. As this behavior is currently considered a bug,
+compatible behavior may be re-introduced in a future release. Until
+then, the use of sysopen(), sysread() and syswrite() is not supported
+for "text" mode operations.
+
+=head1 Future Directions
+
+The following things B<might> happen in future. The first publicly
+available releases having these characteristics will be the developer
+releases Perl 5.9.x, culminating in the Perl 5.10.0 release. These
+are our best guesses at the moment: we reserve the right to rethink.
+
+=over 4
+
+=item *
+
+PerlIO will become The Default. Currently (in Perl 5.8.x) the stdio
+library is still used if Perl thinks it can use certain tricks to
+make stdio go B<really> fast. For future releases our goal is to
+make PerlIO go even faster.
+
+=item *
+
+A new feature called I<assertions> will be available. This means that
+one can have code called assertions sprinkled in the code: usually
+they are optimised away, but they can be enabled with the C<-A> option.
+
+=item *
+
+A new operator C<//> (defined-or) will be available. This means that
+one will be able to say
+
+ $a // $b
+
+instead of
+
+ defined $a ? $a : $b
+
+and
+
+ $c //= $d;
+
+instead of
+
+ $c = $d unless defined $c;
+
+The operator will have the same precedence and associativity as C<||>.
+A source code patch against the Perl 5.8.1 sources will be available
+in CPAN as F<authors/id/H/HM/HMBRAND/dor-5.8.1.diff>.
+
+=item *
+
+C<unpack()> will default to unpacking the C<$_>.
+
+=item *
+
+Various Copy-On-Write techniques will be investigated in hopes
+of speeding up Perl.
+
+=item *
+
+CPANPLUS, Inline, and Module::Build will become core modules.
+
+=item *
+
+The ability to write true lexically scoped pragmas will be introduced.
+
+=item *
+
+Work will continue on the bytecompiler and byteloader.
+
+=item *
+
+v-strings as they currently exist are scheduled to be deprecated. The
+v-less form (1.2.3) will become a "version object" when used with C<use>,
+C<require>, and C<$VERSION>. $^V will also be a "version object" so the
+printf("%vd",...) construct will no longer be needed. The v-ful version
+(v1.2.3) will become obsolete. The equivalence of strings and v-strings (e.g.
+that currently 5.8.0 is equal to "\5\8\0") will go away. B<There may be no
+deprecation warning for v-strings>, though: it is quite hard to detect when
+v-strings are being used safely, and when they are not.
+
+=item *
+
+5.005 Threads Will Be Removed
+
+=item *
+
+The C<$*> Variable Will Be Removed
+(it was deprecated a long time ago)
+
+=item *
+
+Pseudohashes Will Be Removed
+
+=back
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/ . There may also be
+information at http://www.perl.com/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team. You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl582delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl582delta.pod
new file mode 100755
index 00000000000..87080702ac8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl582delta.pod
@@ -0,0 +1,162 @@
+=head1 NAME
+
+perl582delta - what is new for perl v5.8.2
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.1 release and
+the 5.8.2 release.
+
+If you are upgrading from an earlier release such as 5.6.1, first read
+the L<perl58delta>, which describes differences between 5.6.0 and
+5.8.0, and the L<perl581delta>, which describes differences between
+5.8.0 and 5.8.1.
+
+=head1 Incompatible Changes
+
+For threaded builds for modules calling certain re-entrant system calls,
+binary compatibility was accidentally lost between 5.8.0 and 5.8.1.
+Binary compatibility with 5.8.0 has been restored in 5.8.2, which
+necessitates breaking compatibility with 5.8.1. We see this as the
+lesser of two evils.
+
+This will only affect people who have a threaded perl 5.8.1, and compiled
+modules which use these calls, and now attempt to run the compiled modules
+with 5.8.2. The fix is to re-compile and re-install the modules using 5.8.2.
+
+=head1 Core Enhancements
+
+=head2 Hash Randomisation
+
+The hash randomisation introduced with 5.8.1 has been amended. It
+transpired that although the implementation introduced in 5.8.1 was source
+compatible with 5.8.0, it was not binary compatible in certain cases. 5.8.2
+contains an improved implementation which is both source and binary
+compatible with both 5.8.0 and 5.8.1, and remains robust against the form of
+attack which prompted the change for 5.8.1.
+
+We are grateful to the Debian project for their input in this area.
+See L<perlsec/"Algorithmic Complexity Attacks"> for the original
+rationale behind this change.
+
+=head2 Threading
+
+Several memory leaks associated with variables shared between threads
+have been fixed.
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules And Pragmata
+
+The following modules and pragmata have been updated since Perl 5.8.1:
+
+=over 4
+
+=item Devel::PPPort
+
+=item Digest::MD5
+
+=item I18N::LangTags
+
+=item libnet
+
+=item MIME::Base64
+
+=item Pod::Perldoc
+
+=item strict
+
+Documentation improved
+
+=item Tie::Hash
+
+Documentation improved
+
+=item Time::HiRes
+
+=item Unicode::Collate
+
+=item Unicode::Normalize
+
+=item UNIVERSAL
+
+Documentation improved
+
+=back
+
+=head1 Selected Bug Fixes
+
+Some syntax errors involving unrecognized filetest operators are now handled
+correctly by the parser.
+
+=head1 Changed Internals
+
+Interpreter initialization is more complete when -DMULTIPLICITY is off.
+This should resolve problems with initializing and destroying the Perl
+interpreter more than once in a single process.
+
+=head1 Platform Specific Problems
+
+Dynamic linker flags have been tweaked for Solaris and OS X, which should
+solve problems seen while building some XS modules.
+
+Bugs in OS/2 sockets and tmpfile have been fixed.
+
+In OS X C<setreuid> and friends are troublesome - perl will now work
+around their problems as best possible.
+
+=head1 Future Directions
+
+Starting with 5.8.3 we intend to make more frequent maintenance releases,
+with a smaller number of changes in each. The intent is to propagate
+bug fixes out to stable releases more rapidly and make upgrading stable
+releases less of an upheaval. This should give end users more
+flexibility in their choice of upgrade timing, and allow them easier
+assessment of the impact of upgrades. The current plan is for code freezes
+as follows
+
+=over 4
+
+=item *
+
+5.8.3 23:59:59 GMT, Wednesday December 31st 2003
+
+=item *
+
+5.8.4 23:59:59 GMT, Wednesday March 31st 2004
+
+=item *
+
+5.8.5 23:59:59 GMT, Wednesday June 30th 2004
+
+=back
+
+with the release following soon after, when testing is complete.
+
+See L<perl581delta/"Future Directions"> for more soothsaying.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/. There may also be
+information at http://www.perl.com/, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team. You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl583delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl583delta.pod
new file mode 100755
index 00000000000..2981a9834a8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl583delta.pod
@@ -0,0 +1,210 @@
+=head1 NAME
+
+perl583delta - what is new for perl v5.8.3
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.2 release and
+the 5.8.3 release.
+
+If you are upgrading from an earlier release such as 5.6.1, first read
+the L<perl58delta>, which describes differences between 5.6.0 and
+5.8.0, and the L<perl581delta> and L<perl582delta>, which describe differences
+between 5.8.0, 5.8.1 and 5.8.2
+
+=head1 Incompatible Changes
+
+There are no changes incompatible with 5.8.2.
+
+=head1 Core Enhancements
+
+A C<SCALAR> method is now available for tied hashes. This is called when
+a tied hash is used in scalar context, such as
+
+ if (%tied_hash) {
+ ...
+ }
+
+
+The old behaviour was that %tied_hash would return whatever would have been
+returned for that hash before the hash was tied (so usually 0). The new
+behaviour in the absence of a SCALAR method is to return TRUE if in the
+middle of an C<each> iteration, and otherwise call FIRSTKEY to check if the
+hash is empty (making sure that a subsequent C<each> will also begin by
+calling FIRSTKEY). Please see L<perltie/SCALAR> for the full details and
+caveats.
+
+=head1 Modules and Pragmata
+
+=over 4
+
+=item CGI
+
+=item Cwd
+
+=item Digest
+
+=item Digest::MD5
+
+=item Encode
+
+=item File::Spec
+
+=item FindBin
+
+A function C<again> is provided to resolve problems where modules in different
+directories wish to use FindBin.
+
+=item List::Util
+
+You can now weaken references to read only values.
+
+=item Math::BigInt
+
+=item PodParser
+
+=item Pod::Perldoc
+
+=item POSIX
+
+=item Unicode::Collate
+
+=item Unicode::Normalize
+
+=item Test::Harness
+
+=item threads::shared
+
+C<cond_wait> has a new two argument form. C<cond_timedwait> has been added.
+
+=back
+
+=head1 Utility Changes
+
+C<find2perl> now assumes C<-print> as a default action. Previously, it
+needed to be specified explicitly.
+
+A new utility, C<prove>, makes it easy to run an individual regression test
+at the command line. C<prove> is part of Test::Harness, which users of earlier
+Perl versions can install from CPAN.
+
+=head1 New Documentation
+
+The documentation has been revised in places to produce more standard manpages.
+
+The documentation for the special code blocks (BEGIN, CHECK, INIT, END)
+has been improved.
+
+=head1 Installation and Configuration Improvements
+
+Perl now builds on OpenVMS I64
+
+=head1 Selected Bug Fixes
+
+Using substr() on a UTF8 string could cause subsequent accesses on that
+string to return garbage. This was due to incorrect UTF8 offsets being
+cached, and is now fixed.
+
+join() could return garbage when the same join() statement was used to
+process 8 bit data having earlier processed UTF8 data, due to the flags
+on that statement's temporary workspace not being reset correctly. This
+is now fixed.
+
+C<$a .. $b> will now work as expected when either $a or $b is C<undef>
+
+Using Unicode keys with tied hashes should now work correctly.
+
+Reading $^E now preserves $!. Previously, the C code implementing $^E
+did not preserve C<errno>, so reading $^E could cause C<errno> and therefore
+C<$!> to change unexpectedly.
+
+Reentrant functions will (once more) work with C++. 5.8.2 introduced a bugfix
+which accidentally broke the compilation of Perl extensions written in C++
+
+=head1 New or Changed Diagnostics
+
+The fatal error "DESTROY created new reference to dead object" is now
+documented in L<perldiag>.
+
+=head1 Changed Internals
+
+The hash code has been refactored to reduce source duplication. The
+external interface is unchanged, and aside from the bug fixes described
+above, there should be no change in behaviour.
+
+C<hv_clear_placeholders> is now part of the perl API
+
+Some C macros have been tidied. In particular macros which create temporary
+local variables now name these variables more defensively, which should
+avoid bugs where names clash.
+
+<signal.h> is now always included.
+
+=head1 Configuration and Building
+
+C<Configure> now invokes callbacks regardless of the value of the variable
+they are called for. Previously callbacks were only invoked in the
+C<case $variable $define)> branch. This change should only affect platform
+maintainers writing configuration hints files.
+
+=head1 Platform Specific Problems
+
+The regression test ext/threads/shared/t/wait.t fails on early RedHat 9
+and HP-UX 10.20 due to bugs in their threading implementations.
+RedHat users should see https://rhn.redhat.com/errata/RHBA-2003-136.html
+and consider upgrading their glibc.
+
+=head1 Known Problems
+
+Detached threads aren't supported on Windows yet, as they may lead to
+memory access violation problems.
+
+There is a known race condition opening scripts in C<suidperl>. C<suidperl>
+is neither built nor installed by default, and has been deprecated since
+perl 5.8.0. You are advised to replace use of suidperl with tools such
+as sudo ( http://www.courtesan.com/sudo/ )
+
+We have a backlog of unresolved bugs. Dealing with bugs and bug reports
+is unglamorous work; not something ideally suited to volunteer labour,
+but that is all that we have.
+
+The perl5 development team are implementing changes to help address this
+problem, which should go live in early 2004.
+
+=head1 Future Directions
+
+Code freeze for the next maintenance release (5.8.4) is on March 31st 2004,
+with release expected by mid April. Similarly 5.8.5's freeze will be at
+the end of June, with release by mid July.
+
+=head1 Obituary
+
+Iain 'Spoon' Truskett, Perl hacker, author of L<perlreref> and
+contributor to CPAN, died suddenly on 29th December 2003, aged 24.
+He will be missed.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org. There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team. You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl584delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl584delta.pod
new file mode 100755
index 00000000000..b2cdcc6b822
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl584delta.pod
@@ -0,0 +1,263 @@
+=head1 NAME
+
+perl584delta - what is new for perl v5.8.4
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.3 release and
+the 5.8.4 release.
+
+=head1 Incompatible Changes
+
+Many minor bugs have been fixed. Scripts which happen to rely on previously
+erroneous behaviour will consider these fixes as incompatible changes :-)
+You are advised to perform sufficient acceptance testing on this release
+to satisfy yourself that this does not affect you, before putting this
+release into production.
+
+The diagnostic output of Carp has been changed slightly, to add a space after
+the comma between arguments. This makes it much easier for tools such as
+web browsers to wrap it, but might confuse any automatic tools which perform
+detailed parsing of Carp output.
+
+The internal dump output has been improved, so that non-printable characters
+such as newline and backspace are output in C<\x> notation, rather than
+octal. This might just confuse non-robust tools which parse the output of
+modules such as Devel::Peek.
+
+=head1 Core Enhancements
+
+=head2 Malloc wrapping
+
+Perl can now be built to detect attempts to assign pathologically large chunks
+of memory. Previously such assignments would suffer from integer wrap-around
+during size calculations causing a misallocation, which would crash perl, and
+could theoretically be used for "stack smashing" attacks. The wrapping
+defaults to enabled on platforms where we know it works (most AIX
+configurations, BSDi, Darwin, DEC OSF/1, FreeBSD, HP/UX, GNU Linux, OpenBSD,
+Solaris, VMS and most Win32 compilers) and defaults to disabled on other
+platforms.
+
+=head2 Unicode Character Database 4.0.1
+
+The copy of the Unicode Character Database included in Perl 5.8 has
+been updated to 4.0.1 from 4.0.0.
+
+=head2 suidperl less insecure
+
+Paul Szabo has analysed and patched C<suidperl> to remove existing known
+insecurities. Currently there are no known holes in C<suidperl>, but previous
+experience shows that we cannot be confident that these were the last. You may
+no longer invoke the set uid perl directly, so to preserve backwards
+compatibility with scripts that invoke #!/usr/bin/suidperl the only set uid
+binary is now C<sperl5.8.>I<n> (C<sperl5.8.4> for this release). C<suidperl>
+is installed as a hard link to C<perl>; both C<suidperl> and C<perl> will
+invoke C<sperl5.8.4> automatically the set uid binary, so this change should
+be completely transparent.
+
+For new projects the core perl team would strongly recommend that you use
+dedicated, single purpose security tools such as C<sudo> in preference to
+C<suidperl>.
+
+=head2 format
+
+In addition to bug fixes, C<format>'s features have been enhanced. See
+L<perlform>
+
+=head1 Modules and Pragmata
+
+The (mis)use of C</tmp> in core modules and documentation has been tidied up.
+Some modules available both within the perl core and independently from CPAN
+("dual-life modules") have not yet had these changes applied; the changes
+will be integrated into future stable perl releases as the modules are
+updated on CPAN.
+
+=head2 Updated modules
+
+=over 4
+
+=item Attribute::Handlers
+
+=item B
+
+=item Benchmark
+
+=item CGI
+
+=item Carp
+
+=item Cwd
+
+=item Exporter
+
+=item File::Find
+
+=item IO
+
+=item IPC::Open3
+
+=item Local::Maketext
+
+=item Math::BigFloat
+
+=item Math::BigInt
+
+=item Math::BigRat
+
+=item MIME::Base64
+
+=item ODBM_File
+
+=item POSIX
+
+=item Shell
+
+=item Socket
+
+There is experimental support for Linux abstract Unix domain sockets.
+
+=item Storable
+
+=item Switch
+
+Synced with its CPAN version 2.10
+
+=item Sys::Syslog
+
+C<syslog()> can now use numeric constants for facility names and priorities,
+in addition to strings.
+
+=item Term::ANSIColor
+
+=item Time::HiRes
+
+=item Unicode::UCD
+
+=item Win32
+
+Win32.pm/Win32.xs has moved from the libwin32 module to core Perl
+
+=item base
+
+=item open
+
+=item threads
+
+Detached threads are now also supported on Windows.
+
+=item utf8
+
+=back
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+Accelerated Unicode case mappings (C</i>, C<lc>, C<uc>, etc).
+
+=item *
+
+In place sort optimised (eg C<@a = sort @a>)
+
+=item *
+
+Unnecessary assignment optimised away in
+
+ my $s = undef;
+ my @a = ();
+ my %h = ();
+
+=item *
+
+Optimised C<map> in scalar context
+
+=back
+
+=head1 Utility Changes
+
+The Perl debugger (F<lib/perl5db.pl>) can now save all debugger commands for
+sourcing later, and can display the parent inheritance tree of a given class.
+
+=head1 Installation and Configuration Improvements
+
+The build process on both VMS and Windows has had several minor improvements
+made. On Windows Borland's C compiler can now compile perl with PerlIO and/or
+USE_LARGE_FILES enabled.
+
+C<perl.exe> on Windows now has a "Camel" logo icon. The use of a camel with
+the topic of Perl is a trademark of O'Reilly and Associates Inc., and is used
+with their permission (ie distribution of the source, compiling a Windows
+executable from it, and using that executable locally). Use of the supplied
+camel for anything other than a perl executable's icon is specifically not
+covered, and anyone wishing to redistribute perl binaries I<with> the icon
+should check directly with O'Reilly beforehand.
+
+Perl should build cleanly on Stratus VOS once more.
+
+=head1 Selected Bug Fixes
+
+More utf8 bugs fixed, notably in how C<chomp>, C<chop>, C<send>, and
+C<syswrite> and interact with utf8 data. Concatenation now works correctly
+when C<use bytes;> is in scope.
+
+Pragmata are now correctly propagated into (?{...}) constructions in regexps.
+Code such as
+
+ my $x = qr{ ... (??{ $x }) ... };
+
+will now (correctly) fail under use strict. (As the inner C<$x> is and
+has always referred to C<$::x>)
+
+The "const in void context" warning has been suppressed for a constant in an
+optimised-away boolean expression such as C<5 || print;>
+
+C<perl -i> could C<fchmod(stdin)> by mistake. This is serious if stdin is
+attached to a terminal, and perl is running as root. Now fixed.
+
+=head1 New or Changed Diagnostics
+
+C<Carp> and the internal diagnostic routines used by C<Devel::Peek> have been
+made clearer, as described in L</Incompatible Changes>
+
+=head1 Changed Internals
+
+Some bugs have been fixed in the hash internals. Restricted hashes and
+their place holders are now allocated and deleted at slightly different times,
+but this should not be visible to user code.
+
+=head1 Future Directions
+
+Code freeze for the next maintenance release (5.8.5) will be on 30th June
+2004, with release by mid July.
+
+=head1 Platform Specific Problems
+
+This release is known not to build on Windows 95.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org. There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team. You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl585delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl585delta.pod
new file mode 100755
index 00000000000..1717c74e028
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl585delta.pod
@@ -0,0 +1,257 @@
+=head1 NAME
+
+perl585delta - what is new for perl v5.8.5
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.4 release and
+the 5.8.5 release.
+
+=head1 Incompatible Changes
+
+There are no changes incompatible with 5.8.4.
+
+=head1 Core Enhancements
+
+Perl's regular expression engine now contains support for matching on the
+intersection of two Unicode character classes. You can also now refer to
+user-defined character classes from within other user defined character
+classes.
+
+=head1 Modules and Pragmata
+
+=over 4
+
+=item *
+
+Carp improved to work nicely with Safe. Carp's message reporting should now
+be anomaly free - it will always print out line number information.
+
+=item *
+
+CGI upgraded to version 3.05
+
+=item *
+
+charnames now avoids clobbering $_
+
+=item *
+
+Digest upgraded to version 1.08
+
+=item *
+
+Encode upgraded to version 2.01
+
+=item *
+
+FileCache upgraded to version 1.04
+
+=item *
+
+libnet upgraded to version 1.19
+
+=item *
+
+Pod::Parser upgraded to version 1.28
+
+=item *
+
+Pod::Perldoc upgraded to version 3.13
+
+=item *
+
+Pod::LaTeX upgraded to version 0.57
+
+=item *
+
+Safe now works properly with Carp
+
+=item *
+
+Scalar-List-Utils upgraded to version 1.14
+
+=item *
+
+Shell's documentation has been re-written, and its historical partial
+auto-quoting of command arguments can now be disabled.
+
+=item *
+
+Test upgraded to version 1.25
+
+=item *
+
+Test::Harness upgraded to version 2.42
+
+=item *
+
+Time::Local upgraded to version 1.10
+
+=item *
+
+Unicode::Collate upgraded to version 0.40
+
+=item *
+
+Unicode::Normalize upgraded to version 0.30
+
+=back
+
+=head1 Utility Changes
+
+=head2 Perl's debugger
+
+The debugger can now emulate stepping backwards, by restarting and rerunning
+all bar the last command from a saved command history.
+
+=head2 h2ph
+
+F<h2ph> is now able to understand a very limited set of C inline functions
+-- basically, the inline functions that look like CPP macros. This has
+been introduced to deal with some of the headers of the newest versions of
+the glibc. The standard warning still applies; to quote F<h2ph>'s
+documentation, I<you may need to dicker with the files produced>.
+
+=head1 Installation and Configuration Improvements
+
+Perl 5.8.5 should build cleanly from source on LynxOS.
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+The in-place sort optimisation introduced in 5.8.4 had a bug. For example,
+in code such as
+
+ @a = sort ($b, @a)
+
+the result would omit the value $b. This is now fixed.
+
+=item *
+
+The optimisation for unnecessary assignments introduced in 5.8.4 could give
+spurious warnings. This has been fixed.
+
+=item *
+
+Perl should now correctly detect and read BOM-marked and (BOMless) UTF-16
+scripts of either endianness.
+
+=item *
+
+Creating a new thread when weak references exist was buggy, and would often
+cause warnings at interpreter destruction time. The known bug is now fixed.
+
+=item *
+
+Several obscure bugs involving manipulating Unicode strings with C<substr> have
+been fixed.
+
+=item *
+
+Previously if Perl's file globbing function encountered a directory that it
+did not have permission to open it would return immediately, leading to
+unexpected truncation of the list of results. This has been fixed, to be
+consistent with Unix shells' globbing behaviour.
+
+=item *
+
+Thread creation time could vary wildly between identical runs. This was caused
+by a poor hashing algorithm in the thread cloning routines, which has now
+been fixed.
+
+=item *
+
+The internals of the ithreads implementation were not checking if OS-level
+thread creation had failed. threads->create() now returns C<undef> in if
+thread creation fails instead of crashing perl.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+=over 4
+
+=item *
+
+Perl -V has several improvements
+
+=over 4
+
+=item *
+
+correctly outputs local patch names that contain embedded code snippets
+or other characters that used to confuse it.
+
+=item *
+
+arguments to -V that look like regexps will give multiple lines of output.
+
+=item *
+
+a trailing colon suppresses the linefeed and ';' terminator, allowing
+embedding of queries into shell commands.
+
+=item *
+
+a leading colon removes the 'name=' part of the response, allowing mapping to
+any name.
+
+=back
+
+=item *
+
+When perl fails to find the specified script, it now outputs a second line
+suggesting that the user use the C<-S> flag:
+
+ $ perl5.8.5 missing.pl
+ Can't open perl script "missing.pl": No such file or directory.
+ Use -S to search $PATH for it.
+
+=back
+
+=head1 Changed Internals
+
+The Unicode character class files used by the regular expression engine are
+now built at build time from the supplied Unicode consortium data files,
+instead of being shipped prebuilt. This makes the compressed Perl source
+tarball about 200K smaller. A side effect is that the layout of files inside
+lib/unicore has changed.
+
+=head1 Known Problems
+
+The regression test F<t/uni/class.t> is now performing considerably more
+tests, and can take several minutes to run even on a fast machine.
+
+=head1 Platform Specific Problems
+
+This release is known not to build on Windows 95.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org. There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team. You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl586delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl586delta.pod
new file mode 100755
index 00000000000..6cd0fa85496
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl586delta.pod
@@ -0,0 +1,170 @@
+=head1 NAME
+
+perl586delta - what is new for perl v5.8.6
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.5 release and
+the 5.8.6 release.
+
+=head1 Incompatible Changes
+
+There are no changes incompatible with 5.8.5.
+
+=head1 Core Enhancements
+
+The perl interpreter is now more tolerant of UTF-16-encoded scripts.
+
+On Win32, Perl can now use non-IFS compatible LSPs, which allows Perl to
+work in conjunction with firewalls such as McAfee Guardian. For full details
+see the file F<README.win32>, particularly if you're running Win95.
+
+=head1 Modules and Pragmata
+
+=over 4
+
+=item *
+
+With the C<base> pragma, an intermediate class with no fields used to messes
+up private fields in the base class. This has been fixed.
+
+=item *
+
+Cwd upgraded to version 3.01 (as part of the new PathTools distribution)
+
+=item *
+
+Devel::PPPort upgraded to version 3.03
+
+=item *
+
+File::Spec upgraded to version 3.01 (as part of the new PathTools distribution)
+
+=item *
+
+Encode upgraded to version 2.08
+
+=item *
+
+ExtUtils::MakeMaker remains at version 6.17, as later stable releases currently
+available on CPAN have some issues with core modules on some core platforms.
+
+=item *
+
+I18N::LangTags upgraded to version 0.35
+
+=item *
+
+Math::BigInt upgraded to version 1.73
+
+=item *
+
+Math::BigRat upgraded to version 0.13
+
+=item *
+
+MIME::Base64 upgraded to version 3.05
+
+=item *
+
+POSIX::sigprocmask function can now retrieve the current signal mask without
+also setting it.
+
+=item *
+
+Time::HiRes upgraded to version 1.65
+
+=back
+
+=head1 Utility Changes
+
+Perl has a new -dt command-line flag, which enables threads support in the
+debugger.
+
+=head1 Performance Enhancements
+
+C<reverse sort ...> is now optimized to sort in reverse, avoiding the
+generation of a temporary intermediate list.
+
+C<for (reverse @foo)> now iterates in reverse, avoiding the generation of a
+temporary reversed list.
+
+=head1 Selected Bug Fixes
+
+The regexp engine is now more robust when given invalid utf8 input, as is
+sometimes generated by buggy XS modules.
+
+C<foreach> on threads::shared array used to be able to crash Perl. This bug
+has now been fixed.
+
+A regexp in C<STDOUT>'s destructor used to coredump, because the regexp pad
+was already freed. This has been fixed.
+
+C<goto &> is now more robust - bugs in deep recursion and chained C<goto &>
+have been fixed.
+
+Using C<delete> on an array no longer leaks memory. A C<pop> of an item from a
+shared array reference no longer causes a leak.
+
+C<eval_sv()> failing a taint test could corrupt the stack - this has been
+fixed.
+
+On platforms with 64 bit pointers numeric comparison operators used to
+erroneously compare the addresses of references that are overloaded, rather
+than using the overloaded values. This has been fixed.
+
+C<read> into a UTF8-encoded buffer with an offset off the end of the buffer
+no longer mis-calculates buffer lengths.
+
+Although Perl has promised since version 5.8 that C<sort()> would be
+stable, the two cases C<sort {$b cmp $a}> and C<< sort {$b <=> $a} >> could
+produce non-stable sorts. This is corrected in perl5.8.6.
+
+Localising C<$^D> no longer generates a diagnostic message about valid -D
+flags.
+
+=head1 New or Changed Diagnostics
+
+For -t and -T,
+ Too late for "-T" option
+has been changed to the more informative
+ "-T" is on the #! line, it must also be used on the command line
+
+=head1 Changed Internals
+
+From now on all applications embedding perl will behave as if perl
+were compiled with -DPERL_USE_SAFE_PUTENV. See "Environment access" in
+the F<INSTALL> file for details.
+
+Most C<C> source files now have comments at the top explaining their purpose,
+which should help anyone wishing to get an overview of the implementation.
+
+=head1 New Tests
+
+There are significantly more tests for the C<B> suite of modules.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org. There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team. You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl587delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl587delta.pod
new file mode 100755
index 00000000000..34ee8f21724
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl587delta.pod
@@ -0,0 +1,379 @@
+=head1 NAME
+
+perl587delta - what is new for perl v5.8.7
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.6 release and
+the 5.8.7 release.
+
+=head1 Incompatible Changes
+
+There are no changes incompatible with 5.8.6.
+
+=head1 Core Enhancements
+
+=head2 Unicode Character Database 4.1.0
+
+The copy of the Unicode Character Database included in Perl 5.8 has
+been updated to 4.1.0 from 4.0.1. See
+L<http://www.unicode.org/versions/Unicode4.1.0/#NotableChanges> for the
+notable changes.
+
+=head2 suidperl less insecure
+
+A pair of exploits in C<suidperl> involving debugging code have been closed.
+
+For new projects the core perl team strongly recommends that you use
+dedicated, single purpose security tools such as C<sudo> in preference to
+C<suidperl>.
+
+=head2 Optional site customization script
+
+The perl interpreter can be built to allow the use of a site customization
+script. By default this is not enabled, to be consistent with previous perl
+releases. To use this, add C<-Dusesitecustomize> to the command line flags
+when running the C<Configure> script. See also L<perlrun/-f>.
+
+=head2 C<Config.pm> is now much smaller.
+
+C<Config.pm> is now about 3K rather than 32K, with the infrequently used
+code and C<%Config> values loaded on demand. This is transparent to the
+programmer, but means that most code will save parsing and loading 29K of
+script (for example, code that uses C<File::Find>).
+
+=head1 Modules and Pragmata
+
+=over 4
+
+=item *
+
+B upgraded to version 1.09
+
+=item *
+
+base upgraded to version 2.07
+
+=item *
+
+bignum upgraded to version 0.17
+
+=item *
+
+bytes upgraded to version 1.02
+
+=item *
+
+Carp upgraded to version 1.04
+
+=item *
+
+CGI upgraded to version 3.10
+
+=item *
+
+Class::ISA upgraded to version 0.33
+
+=item *
+
+Data::Dumper upgraded to version 2.121_02
+
+=item *
+
+DB_File upgraded to version 1.811
+
+=item *
+
+Devel::PPPort upgraded to version 3.06
+
+=item *
+
+Digest upgraded to version 1.10
+
+=item *
+
+Encode upgraded to version 2.10
+
+=item *
+
+FileCache upgraded to version 1.05
+
+=item *
+
+File::Path upgraded to version 1.07
+
+=item *
+
+File::Temp upgraded to version 0.16
+
+=item *
+
+IO::File upgraded to version 1.11
+
+=item *
+
+IO::Socket upgraded to version 1.28
+
+=item *
+
+Math::BigInt upgraded to version 1.77
+
+=item *
+
+Math::BigRat upgraded to version 0.15
+
+=item *
+
+overload upgraded to version 1.03
+
+=item *
+
+PathTools upgraded to version 3.05
+
+=item *
+
+Pod::HTML upgraded to version 1.0503
+
+=item *
+
+Pod::Perldoc upgraded to version 3.14
+
+=item *
+
+Pod::LaTeX upgraded to version 0.58
+
+=item *
+
+Pod::Parser upgraded to version 1.30
+
+=item *
+
+Symbol upgraded to version 1.06
+
+=item *
+
+Term::ANSIColor upgraded to version 1.09
+
+=item *
+
+Test::Harness upgraded to version 2.48
+
+=item *
+
+Test::Simple upgraded to version 0.54
+
+=item *
+
+Text::Wrap upgraded to version 2001.09293, to fix a bug when wrap() was
+called with a non-space separator.
+
+=item *
+
+threads::shared upgraded to version 0.93
+
+=item *
+
+Time::HiRes upgraded to version 1.66
+
+=item *
+
+Time::Local upgraded to version 1.11
+
+=item *
+
+Unicode::Normalize upgraded to version 0.32
+
+=item *
+
+utf8 upgraded to version 1.05
+
+=item *
+
+Win32 upgraded to version 0.24, which provides Win32::GetFileVersion
+
+=back
+
+=head1 Utility Changes
+
+=head2 find2perl enhancements
+
+C<find2perl> has new options C<-iname>, C<-path> and C<-ipath>.
+
+=head1 Performance Enhancements
+
+The internal pointer mapping hash used during ithreads cloning now uses an
+arena for memory allocation. In tests this reduced ithreads cloning time by
+about 10%.
+
+=head1 Installation and Configuration Improvements
+
+=over 4
+
+=item *
+
+The Win32 "dmake" makefile.mk has been updated to make it compatible
+with the latest versions of dmake.
+
+=item *
+
+C<PERL_MALLOC>, C<DEBUG_MSTATS>, C<PERL_HASH_SEED_EXPLICIT> and C<NO_HASH_SEED>
+should now work in Win32 makefiles.
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+The socket() function on Win32 has been fixed so that it is able to use
+transport providers which specify a protocol of 0 (meaning any protocol
+is allowed) once more. (This was broken in 5.8.6, and typically caused
+the use of ICMP sockets to fail.)
+
+=item *
+
+Another obscure bug involving C<substr> and UTF-8 caused by bad internal
+offset caching has been identified and fixed.
+
+=item *
+
+A bug involving the loading of UTF-8 tables by the regexp engine has been
+fixed - code such as C<"\x{100}" =~ /[[:print:]]/> will no longer give
+corrupt results.
+
+=item *
+
+Case conversion operations such as C<uc> on a long Unicode string could
+exhaust memory. This has been fixed.
+
+=item *
+
+C<index>/C<rindex> were buggy for some combinations of Unicode and
+non-Unicode data. This has been fixed.
+
+=item *
+
+C<read> (and presumably C<sysread>) would expose the UTF-8 internals when
+reading from a byte oriented file handle into a UTF-8 scalar. This has
+been fixed.
+
+=item *
+
+Several C<pack>/C<unpack> bug fixes:
+
+=over 4
+
+=item *
+
+Checksums with C<b> or C<B> formats were broken.
+
+=item *
+
+C<unpack> checksums could overflow with the C<C> format.
+
+=item *
+
+C<U0> and C<C0> are now scoped to C<()> C<pack> sub-templates.
+
+=item *
+
+Counted length prefixes now don't change C<C0>/C<U0> mode.
+
+=item *
+
+C<pack> C<Z0> used to destroy the preceding character.
+
+=item *
+
+C<P>/C<p> C<pack> formats used to only recognise literal C<undef>
+
+=back
+
+=item *
+
+Using closures with ithreads could cause perl to crash. This was due to
+failure to correctly lock internal OP structures, and has been fixed.
+
+=item *
+
+The return value of C<close> now correctly reflects any file errors that
+occur while flushing the handle's data, instead of just giving failure if
+the actual underlying file close operation failed.
+
+=item *
+
+C<not() || 1> used to segfault. C<not()> now behaves like C<not(0)>, which was
+the pre 5.6.0 behaviour.
+
+=item *
+
+C<h2ph> has various enhancements to cope with constructs in header files that
+used to result in incorrect or invalid output.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+There is a new taint error, "%ENV is aliased to %s". This error is thrown
+when taint checks are enabled and when C<*ENV> has been aliased, so that
+C<%ENV> has no env-magic anymore and hence the environment cannot be verified
+as taint-free.
+
+The internals of C<pack> and C<unpack> have been updated. All legitimate
+templates should work as before, but there may be some changes in the error
+reported for complex failure cases. Any behaviour changes for non-error cases
+are bugs, and should be reported.
+
+=head1 Changed Internals
+
+There has been a fair amount of refactoring of the C<C> source code, partly to
+make it tidier and more maintainable. The resulting object code and the
+C<perl> binary may well be smaller than 5.8.6, and hopefully faster in some
+cases, but apart from this there should be no user-detectable changes.
+
+C<${^UTF8LOCALE}> has been added to give perl space access to C<PL_utf8locale>.
+
+The size of the arenas used to allocate SV heads and most SV bodies can now
+be changed at compile time. The old size was 1008 bytes, the new default size
+is 4080 bytes.
+
+=head1 Known Problems
+
+Unicode strings returned from overloaded operators can be buggy. This is a
+long standing bug reported since 5.8.6 was released, but we do not yet have
+a suitable fix for it.
+
+=head1 Platform Specific Problems
+
+On UNICOS, lib/Math/BigInt/t/bigintc.t hangs burning CPU.
+ext/B/t/bytecode.t and ext/Socket/t/socketpair.t both fail tests.
+These are unlikely to be resolved, as our valiant UNICOS porter's last
+Cray is being decommissioned.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org. There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team. You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl588delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl588delta.pod
new file mode 100755
index 00000000000..8dbdc7bc009
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl588delta.pod
@@ -0,0 +1,1632 @@
+=head1 NAME
+
+perl588delta - what is new for perl v5.8.8
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.7 release and
+the 5.8.8 release.
+
+=head1 Incompatible Changes
+
+There are no changes intentionally incompatible with 5.8.7. If any exist,
+they are bugs and reports are welcome.
+
+=head1 Core Enhancements
+
+=over
+
+=item *
+
+C<chdir>, C<chmod> and C<chown> can now work on filehandles as well as
+filenames, if the system supports respectively C<fchdir>, C<fchmod> and
+C<fchown>, thanks to a patch provided by Gisle Aas.
+
+=back
+
+=head1 Modules and Pragmata
+
+=over
+
+=item *
+
+C<Attribute::Handlers> upgraded to version 0.78_02
+
+=over
+
+=item *
+
+Documentation typo fix
+
+=back
+
+=item *
+
+C<attrs> upgraded to version 1.02
+
+=over
+
+=item *
+
+Internal cleanup only
+
+=back
+
+=item *
+
+C<autouse> upgraded to version 1.05
+
+=over
+
+=item *
+
+Simplified implementation
+
+=back
+
+=item *
+
+C<B> upgraded to version 1.09_01
+
+=over
+
+=item *
+
+The inheritance hierarchy of the C<B::> modules has been corrected;
+C<B::NV> now inherits from C<B::SV> (instead of C<B::IV>).
+
+=back
+
+=item *
+
+C<blib> upgraded to version 1.03
+
+=over
+
+=item *
+
+Documentation typo fix
+
+=back
+
+=item *
+
+C<ByteLoader> upgraded to version 0.06
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<CGI> upgraded to version 3.15
+
+=over
+
+=item *
+
+Extraneous "?" from C<self_url()> removed
+
+=item *
+
+C<scrolling_list()> select attribute fixed
+
+=item *
+
+C<virtual_port> now works properly with the https protocol
+
+=item *
+
+C<upload_hook()> and C<append()> now works in function-oriented mode
+
+=item *
+
+C<POST_MAX> doesn't cause the client to hang any more
+
+=item *
+
+Automatic tab indexes are now disabled and new C<-tabindex> pragma has
+been added to turn automatic indexes back on
+
+=item *
+
+C<end_form()> doesn't emit empty (and non-validating) C<< <div> >>
+
+=item *
+
+C<CGI::Carp> works better in certain mod_perl configurations
+
+=item *
+
+Setting C<$CGI::TMPDIRECTORY> is now effective
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<charnames> upgraded to version 1.05
+
+=over
+
+=item *
+
+C<viacode()> now accept hex strings and has been optimized.
+
+=back
+
+=item *
+
+C<CPAN> upgraded to version 1.76_02
+
+=over
+
+=item *
+
+1 minor bug fix for Win32
+
+=back
+
+=item *
+
+C<Cwd> upgraded to version 3.12
+
+=over
+
+=item *
+
+C<canonpath()> on Win32 now collapses F<foo\..> sections correctly.
+
+=item *
+
+Improved behaviour on Symbian OS.
+
+=item *
+
+Enhanced documentation and typo fixes
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Data::Dumper> upgraded to version 2.121_08
+
+=over
+
+=item *
+
+A problem where C<Data::Dumper> would sometimes update the iterator state
+of hashes has been fixed
+
+=item *
+
+Numeric labels now work
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<DB> upgraded to version 1.01
+
+=over
+
+=item *
+
+A problem where the state of the regexp engine would sometimes get clobbered when running
+under the debugger has been fixed.
+
+=back
+
+=item *
+
+C<DB_File> upgraded to version 1.814
+
+=over
+
+=item *
+
+Adds support for Berkeley DB 4.4.
+
+=back
+
+=item *
+
+C<Devel::DProf> upgraded to version 20050603.00
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Devel::Peek> upgraded to version 1.03
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Devel::PPPort> upgraded to version 3.06_01
+
+=over
+
+=item *
+
+C<--compat-version> argument checking has been improved
+
+=item *
+
+Files passed on the command line are filtered by default
+
+=item *
+
+C<--nofilter> option to override the filtering has been added
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<diagnostics> upgraded to version 1.15
+
+=over
+
+=item *
+
+Documentation typo fix
+
+=back
+
+=item *
+
+C<Digest> upgraded to version 1.14
+
+=over
+
+=item *
+
+The constructor now knows which module implements SHA-224
+
+=item *
+
+Documentation tweaks and typo fixes
+
+=back
+
+=item *
+
+C<Digest::MD5> upgraded to version 2.36
+
+=over
+
+=item *
+
+C<XSLoader> is now used for faster loading
+
+=item *
+
+Enhanced documentation including MD5 weaknesses discovered lately
+
+=back
+
+=item *
+
+C<Dumpvalue> upgraded to version 1.12
+
+=over
+
+=item *
+
+Documentation fix
+
+=back
+
+=item *
+
+C<DynaLoader> upgraded but unfortunately we're not able to increment its version number :-(
+
+=over
+
+=item *
+
+Implements C<dl_unload_file> on Win32
+
+=item *
+
+Internal cleanup
+
+=item *
+
+C<XSLoader> 0.06 incorporated; small optimisation for calling
+C<bootstrap_inherit()> and documentation enhancements.
+
+=back
+
+=item *
+
+C<Encode> upgraded to version 2.12
+
+=over
+
+=item *
+
+A coderef is now acceptable for C<CHECK>!
+
+=item *
+
+3 new characters added to the ISO-8859-7 encoding
+
+=item *
+
+New encoding C<MIME-Header-ISO_2022_JP> added
+
+=item *
+
+Problem with partial characters and C<< encoding(utf-8-strict) >> fixed.
+
+=item *
+
+Documentation enhancements and typo fixes
+
+=back
+
+=item *
+
+C<English> upgraded to version 1.02
+
+=over
+
+=item *
+
+the C<< $COMPILING >> variable has been added
+
+=back
+
+=item *
+
+C<ExtUtils::Constant> upgraded to version 0.17
+
+=over
+
+=item *
+
+Improved compatibility with older versions of perl
+
+=back
+
+=item *
+
+C<ExtUtils::MakeMaker> upgraded to version 6.30 (was 6.17)
+
+=over
+
+=item *
+
+Too much to list here; see L<http://search.cpan.org/src/MSCHWERN/ExtUtils-MakeMaker-6.30/Changes>
+
+=back
+
+=item *
+
+C<File::Basename> upgraded to version 2.74, with changes contributed by Michael Schwern.
+
+=over
+
+=item *
+
+Documentation clarified and errors corrected.
+
+=item *
+
+C<basename> now strips trailing path separators before processing the name.
+
+=item *
+
+C<basename> now returns C</> for parameter C</>, to make C<basename>
+consistent with the shell utility of the same name.
+
+=item *
+
+The suffix is no longer stripped if it is identical to the remaining characters
+in the name, again for consistency with the shell utility.
+
+=item *
+
+Some internal code cleanup.
+
+=back
+
+=item *
+
+C<File::Copy> upgraded to version 2.09
+
+=over
+
+=item *
+
+Copying a file onto itself used to fail.
+
+=item *
+
+Moving a file between file systems now preserves the access and
+modification time stamps
+
+=back
+
+=item *
+
+C<File::Find> upgraded to version 1.10
+
+=over
+
+=item *
+
+Win32 portability fixes
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<File::Glob> upgraded to version 1.05
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<File::Path> upgraded to version 1.08
+
+=over
+
+=item *
+
+C<mkpath> now preserves C<errno> when C<mkdir> fails
+
+=back
+
+=item *
+
+C<File::Spec> upgraded to version 3.12
+
+=over
+
+=item *
+
+C<File::Spec->rootdir()> now returns C<\> on Win32, instead of C</>
+
+=item *
+
+C<$^O> could sometimes become tainted. This has been fixed.
+
+=item *
+
+C<canonpath> on Win32 now collapses C<foo/..> (or C<foo\..>) sections
+correctly, rather than doing the "misguided" work it was previously doing.
+Note that C<canonpath> on Unix still does B<not> collapse these sections, as
+doing so would be incorrect.
+
+=item *
+
+Some documentation improvements
+
+=item *
+
+Some internal code cleanup
+
+=back
+
+=item *
+
+C<FileCache> upgraded to version 1.06
+
+=over
+
+=item *
+
+POD formatting errors in the documentation fixed
+
+=back
+
+=item *
+
+C<Filter::Simple> upgraded to version 0.82
+
+=item *
+
+C<FindBin> upgraded to version 1.47
+
+=over
+
+=item *
+
+Now works better with directories where access rights are more
+restrictive than usual.
+
+=back
+
+=item *
+
+C<GDBM_File> upgraded to version 1.08
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Getopt::Long> upgraded to version 2.35
+
+=over
+
+=item *
+
+C<prefix_pattern> has now been complemented by a new configuration
+option C<long_prefix_pattern> that allows the user to specify what
+prefix patterns should have long option style semantics applied.
+
+=item *
+
+Options can now take multiple values at once (experimental)
+
+=item *
+
+Various bug fixes
+
+=back
+
+=item *
+
+C<if> upgraded to version 0.05
+
+=over
+
+=item *
+
+Give more meaningful error messages from C<if> when invoked with a
+condition in list context.
+
+=item *
+
+Restore backwards compatibility with earlier versions of perl
+
+=back
+
+=item *
+
+C<IO> upgraded to version 1.22
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<IPC::Open2> upgraded to version 1.02
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<IPC::Open3> upgraded to version 1.02
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<List::Util> upgraded to version 1.18 (was 1.14)
+
+=over
+
+=item *
+
+Fix pure-perl version of C<refaddr> to avoid blessing an un-blessed reference
+
+=item *
+
+Use C<XSLoader> for faster loading
+
+=item *
+
+Fixed various memory leaks
+
+=item *
+
+Internal cleanup and portability fixes
+
+=back
+
+=item *
+
+C<Math::Complex> upgraded to version 1.35
+
+=over
+
+=item *
+
+C<atan2(0, i)> now works, as do all the (computable) complex argument cases
+
+=item *
+
+Fixes for certain bugs in C<make> and C<emake>
+
+=item *
+
+Support returning the I<k>th root directly
+
+=item *
+
+Support C<[2,-3pi/8]> in C<emake>
+
+=item *
+
+Support C<inf> for C<make>/C<emake>
+
+=item *
+
+Document C<make>/C<emake> more visibly
+
+=back
+
+=item *
+
+C<Math::Trig> upgraded to version 1.03
+
+=over
+
+=item *
+
+Add more great circle routines: C<great_circle_waypoint> and
+C<great_circle_destination>
+
+=back
+
+=item *
+
+C<MIME::Base64> upgraded to version 3.07
+
+=over
+
+=item *
+
+Use C<XSLoader> for faster loading
+
+=item *
+
+Enhanced documentation
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<NDBM_File> upgraded to version 1.06
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<ODBM_File> upgraded to version 1.06
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Opcode> upgraded to version 1.06
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<open> upgraded to version 1.05
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<overload> upgraded to version 1.04
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<PerlIO> upgraded to version 1.04
+
+=over
+
+=item *
+
+C<PerlIO::via> iterate over layers properly now
+
+=item *
+
+C<PerlIO::scalar> understands C<< $/ = "" >> now
+
+=item *
+
+C<encoding(utf-8-strict)> with partial characters now works
+
+=item *
+
+Enhanced documentation
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Pod::Functions> upgraded to version 1.03
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<Pod::Html> upgraded to version 1.0504
+
+=over
+
+=item *
+
+HTML output will now correctly link
+to C<=item>s on the same page, and should be valid XHTML.
+
+=item *
+
+Variable names are recognized as intended
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<Pod::Parser> upgraded to version 1.32
+
+=over
+
+=item *
+
+Allow files that start with C<=head> on the first line
+
+=item *
+
+Win32 portability fix
+
+=item *
+
+Exit status of C<pod2usage> fixed
+
+=item *
+
+New C<-noperldoc> switch for C<pod2usage>
+
+=item *
+
+Arbitrary URL schemes now allowed
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<POSIX> upgraded to version 1.09
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<re> upgraded to version 0.05
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=back
+
+=item *
+
+C<Safe> upgraded to version 2.12
+
+=over
+
+=item *
+
+Minor documentation enhancement
+
+=back
+
+=item *
+
+C<SDBM_File> upgraded to version 1.05
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Socket> upgraded to version 1.78
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Storable> upgraded to version 2.15
+
+=over
+
+=item *
+
+This includes the C<STORABLE_attach> hook functionality added by
+Adam Kennedy, and more frugal memory requirements when storing under C<ithreads>, by
+using the C<ithreads> cloning tracking code.
+
+=back
+
+=item *
+
+C<Switch> upgraded to version 2.10_01
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<Sys::Syslog> upgraded to version 0.13
+
+=over
+
+=item *
+
+Now provides numeric macros and meaningful C<Exporter> tags.
+
+=item *
+
+No longer uses C<Sys::Hostname> as it may provide useless values in
+unconfigured network environments, so instead uses C<INADDR_LOOPBACK> directly.
+
+=item *
+
+C<syslog()> now uses local timestamp.
+
+=item *
+
+C<setlogmask()> now behaves like its C counterpart.
+
+=item *
+
+C<setlogsock()> will now C<croak()> as documented.
+
+=item *
+
+Improved error and warnings messages.
+
+=item *
+
+Improved documentation.
+
+=back
+
+=item *
+
+C<Term::ANSIColor> upgraded to version 1.10
+
+=over
+
+=item *
+
+Fixes a bug in C<colored> when C<$EACHLINE> is set that caused it to not color
+lines consisting solely of 0 (literal zero).
+
+=item *
+
+Improved tests.
+
+=back
+
+=item *
+
+C<Term::ReadLine> upgraded to version 1.02
+
+=over
+
+=item *
+
+Documentation tweaks
+
+=back
+
+=item *
+
+C<Test::Harness> upgraded to version 2.56 (was 2.48)
+
+=over
+
+=item *
+
+The C<Test::Harness> timer is now off by default.
+
+=item *
+
+Now shows elapsed time in milliseconds.
+
+=item *
+
+Various bug fixes
+
+=back
+
+=item *
+
+C<Test::Simple> upgraded to version 0.62 (was 0.54)
+
+=over
+
+=item *
+
+C<is_deeply()> no longer fails to work for many cases
+
+=item *
+
+Various minor bug fixes
+
+=item *
+
+Documentation enhancements
+
+=back
+
+=item *
+
+C<Text::Tabs> upgraded to version 2005.0824
+
+=over
+
+=item *
+
+Provides a faster implementation of C<expand>
+
+=back
+
+=item *
+
+C<Text::Wrap> upgraded to version 2005.082401
+
+=over
+
+=item *
+
+Adds C<$Text::Wrap::separator2>, which allows you to preserve existing newlines
+but add line-breaks with some other string.
+
+=back
+
+=item *
+
+C<threads> upgraded to version 1.07
+
+=over
+
+=item *
+
+C<threads> will now honour C<no warnings 'threads'>
+
+=item *
+
+A thread's interpreter is now freed after C<< $t->join() >> rather than after
+C<undef $t>, which should fix some C<ithreads> memory leaks. (Fixed by Dave
+Mitchell)
+
+=item *
+
+Some documentation typo fixes.
+
+=back
+
+=item *
+
+C<threads::shared> upgraded to version 0.94
+
+=over
+
+=item *
+
+Documentation changes only
+
+=item *
+
+Note: An improved implementation of C<threads::shared> is available on
+CPAN - this will be merged into 5.8.9 if it proves stable.
+
+=back
+
+=item *
+
+C<Tie::Hash> upgraded to version 1.02
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=back
+
+=item *
+
+C<Time::HiRes> upgraded to version 1.86 (was 1.66)
+
+=over
+
+=item *
+
+C<clock_nanosleep()> and C<clock()> functions added
+
+=item *
+
+Support for the POSIX C<clock_gettime()> and C<clock_getres()> has been added
+
+=item *
+
+Return C<undef> or an empty list if the C C<gettimeofday()> function fails
+
+=item *
+
+Improved C<nanosleep> detection
+
+=item *
+
+Internal cleanup
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<Unicode::Collate> upgraded to version 0.52
+
+=over
+
+=item *
+
+Now implements UCA Revision 14 (based on Unicode 4.1.0).
+
+=item *
+
+C<Unicode::Collate->new> method no longer overwrites user's C<$_>
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<Unicode::UCD> upgraded to version 0.24
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<User::grent> upgraded to version 1.01
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=back
+
+=item *
+
+C<utf8> upgraded to version 1.06
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<vmsish> upgraded to version 1.02
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<warnings> upgraded to version 1.05
+
+=over
+
+=item *
+
+Gentler messing with C<Carp::> internals
+
+=item *
+
+Internal cleanup
+
+=item *
+
+Documentation update
+
+=back
+
+=item *
+
+C<Win32> upgraded to version 0.2601
+
+=for cynics And how many perl 5.8.x versions can I release ahead of Vista?
+
+=over
+
+=item *
+
+Provides Windows Vista support to C<Win32::GetOSName>
+
+=item *
+
+Documentation enhancements
+
+=back
+
+=item *
+
+C<XS::Typemap> upgraded to version 0.02
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=back
+
+=head1 Utility Changes
+
+=head2 C<h2xs> enhancements
+
+C<h2xs> implements new option C<--use-xsloader> to force use of
+C<XSLoader> even in backwards compatible modules.
+
+The handling of authors' names that had apostrophes has been fixed.
+
+Any enums with negative values are now skipped.
+
+=head2 C<perlivp> enhancements
+
+C<perlivp> implements new option C<-a> and will not check for F<*.ph>
+files by default any more. Use the C<-a> option to run I<all> tests.
+
+=head1 New Documentation
+
+The L<perlglossary> manpage is a glossary of terms used in the Perl
+documentation, technical and otherwise, kindly provided by O'Reilly Media,
+inc.
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+Weak reference creation is now I<O(1)> rather than I<O(n)>, courtesy of
+Nicholas Clark. Weak reference deletion remains I<O(n)>, but if deletion only
+happens at program exit, it may be skipped completely.
+
+=item *
+
+Salvador Fandiño provided improvements to reduce the memory usage of C<sort>
+and to speed up some cases.
+
+=item *
+
+Jarkko Hietaniemi and Andy Lester worked to mark as much data as possible in
+the C source files as C<static>, to increase the proportion of the executable
+file that the operating system can share between process, and thus reduce
+real memory usage on multi-user systems.
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+Parallel makes should work properly now, although there may still be problems
+if C<make test> is instructed to run in parallel.
+
+Building with Borland's compilers on Win32 should work more smoothly. In
+particular Steve Hay has worked to side step many warnings emitted by their
+compilers and at least one C compiler internal error.
+
+C<Configure> will now detect C<clearenv> and C<unsetenv>, thanks to a patch
+from Alan Burlison. It will also probe for C<futimes> and whether C<sprintf>
+correctly returns the length of the formatted string, which will both be used
+in perl 5.8.9.
+
+There are improved hints for next-3.0, vmesa, IX, Darwin, Solaris, Linux,
+DEC/OSF, HP-UX and MPE/iX
+
+Perl extensions on Windows now can be statically built into the Perl DLL,
+thanks to a work by Vadim Konovalov. (This improvement was actually in 5.8.7,
+but was accidentally omitted from L<perl587delta>).
+
+=head1 Selected Bug Fixes
+
+=head2 no warnings 'category' works correctly with -w
+
+Previously when running with warnings enabled globally via C<-w>, selective
+disabling of specific warning categories would actually turn off all warnings.
+This is now fixed; now C<no warnings 'io';> will only turn off warnings in the
+C<io> class. Previously it would erroneously turn off all warnings.
+
+This bug fix may cause some programs to start correctly issuing warnings.
+
+=head2 Remove over-optimisation
+
+Perl 5.8.4 introduced a change so that assignments of C<undef> to a
+scalar, or of an empty list to an array or a hash, were optimised away. As
+this could cause problems when C<goto> jumps were involved, this change
+has been backed out.
+
+=head2 sprintf() fixes
+
+Using the sprintf() function with some formats could lead to a buffer
+overflow in some specific cases. This has been fixed, along with several
+other bugs, notably in bounds checking.
+
+In related fixes, it was possible for badly written code that did not follow
+the documentation of C<Sys::Syslog> to have formatting vulnerabilities.
+C<Sys::Syslog> has been changed to protect people from poor quality third
+party code.
+
+=head2 Debugger and Unicode slowdown
+
+It had been reported that running under perl's debugger when processing
+Unicode data could cause unexpectedly large slowdowns. The most likely cause
+of this was identified and fixed by Nicholas Clark.
+
+=head2 Smaller fixes
+
+=over 4
+
+=item *
+
+C<FindBin> now works better with directories where access rights are more
+restrictive than usual.
+
+=item *
+
+Several memory leaks in ithreads were closed. An improved implementation of
+C<threads::shared> is available on CPAN - this will be merged into 5.8.9 if
+it proves stable.
+
+=item *
+
+Trailing spaces are now trimmed from C<$!> and C<$^E>.
+
+=item *
+
+Operations that require perl to read a process' list of groups, such as reads
+of C<$(> and C<$)>, now dynamically allocate memory rather than using a
+fixed sized array. The fixed size array could cause C stack exhaustion on
+systems configured to use large numbers of groups.
+
+=item *
+
+C<PerlIO::scalar> now works better with non-default C<$/> settings.
+
+=item *
+
+You can now use the C<x> operator to repeat a C<qw//> list. This used
+to raise a syntax error.
+
+=item *
+
+The debugger now traces correctly execution in eval("")uated code that
+contains #line directives.
+
+=item *
+
+The value of the C<open> pragma is no longer ignored for three-argument
+opens.
+
+=item *
+
+The optimisation of C<for (reverse @a)> introduced in perl 5.8.6 could
+misbehave when the array had undefined elements and was used in LVALUE
+context. Dave Mitchell provided a fix.
+
+=item *
+
+Some case insensitive matches between UTF-8 encoded data and 8 bit regexps,
+and vice versa, could give malformed character warnings. These have been
+fixed by Dave Mitchell and Yves Orton.
+
+=item *
+
+C<lcfirst> and C<ucfirst> could corrupt the string for certain cases where
+the length UTF-8 encoding of the string in lower case, upper case or title
+case differed. This was fixed by Nicholas Clark.
+
+=item *
+
+Perl will now use the C library calls C<unsetenv> and C<clearenv> if present
+to delete keys from C<%ENV> and delete C<%ENV> entirely, thanks to a patch
+from Alan Burlison.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+=head2 Attempt to set length of freed array
+
+This is a new warning, produced in situations such as this:
+
+ $r = do {my @a; \$#a};
+ $$r = 503;
+
+=head2 Non-string passed as bitmask
+
+This is a new warning, produced when number has been passed as a argument to
+select(), instead of a bitmask.
+
+ # Wrong, will now warn
+ $rin = fileno(STDIN);
+ ($nfound,$timeleft) = select($rout=$rin, undef, undef, $timeout);
+
+ # Should be
+ $rin = '';
+ vec($rin,fileno(STDIN),1) = 1;
+ ($nfound,$timeleft) = select($rout=$rin, undef, undef, $timeout);
+
+=head2 Search pattern not terminated or ternary operator parsed as search pattern
+
+This syntax error indicates that the lexer couldn't find the final
+delimiter of a C<?PATTERN?> construct. Mentioning the ternary operator in
+this error message makes it easier to diagnose syntax errors.
+
+=head1 Changed Internals
+
+There has been a fair amount of refactoring of the C<C> source code, partly to
+make it tidier and more maintainable. The resulting object code and the
+C<perl> binary may well be smaller than 5.8.7, in particular due to a change
+contributed by Dave Mitchell which reworked the warnings code to be
+significantly smaller. Apart from being smaller and possibly faster, there
+should be no user-detectable changes.
+
+Andy Lester supplied many improvements to determine which function
+parameters and local variables could actually be declared C<const> to the C
+compiler. Steve Peters provided new C<*_set> macros and reworked the core to
+use these rather than assigning to macros in LVALUE context.
+
+Dave Mitchell improved the lexer debugging output under C<-DT>
+
+Nicholas Clark changed the string buffer allocation so that it is now rounded
+up to the next multiple of 4 (or 8 on platforms with 64 bit pointers). This
+should reduce the number of calls to C<realloc> without actually using any
+extra memory.
+
+The C<HV>'s array of C<HE*>s is now allocated at the correct (minimal) size,
+thanks to another change by Nicholas Clark. Compile with
+C<-DPERL_USE_LARGE_HV_ALLOC> to use the old, sloppier, default.
+
+For XS or embedding debugging purposes, if perl is compiled with
+C<-DDEBUG_LEAKING_SCALARS_FORK_DUMP> in addition to
+C<-DDEBUG_LEAKING_SCALARS> then a child process is C<fork>ed just before
+global destruction, which is used to display the values of any scalars
+found to have leaked at the end of global destruction. Without this, the
+scalars have already been freed sufficiently at the point of detection that
+it is impossible to produce any meaningful dump of their contents. This
+feature was implemented by the indefatigable Nicholas Clark, based on an idea
+by Mike Giroux.
+
+=head1 Platform Specific Problems
+
+The optimiser on HP-UX 11.23 (Itanium 2) is currently partly disabled (scaled
+down to +O1) when using HP C-ANSI-C; the cause of problems at higher
+optimisation levels is still unclear.
+
+There are a handful of remaining test failures on VMS, mostly due to
+test fixes and minor module tweaks with too many dependencies to
+integrate into this release from the development stream, where they have
+all been corrected. The following is a list of expected failures with
+the patch number of the fix where that is known:
+
+ ext/Devel/PPPort/t/ppphtest.t #26913
+ ext/List/Util/t/p_tainted.t #26912
+ lib/ExtUtils/t/PL_FILES.t #26813
+ lib/ExtUtils/t/basic.t #26813
+ t/io/fs.t
+ t/op/cmp.t
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org. There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team. You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl589delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl589delta.pod
new file mode 100755
index 00000000000..d4bafa1d190
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl589delta.pod
@@ -0,0 +1,2336 @@
+=head1 NAME
+
+perl589delta - what is new for perl v5.8.9
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.8 release and
+the 5.8.9 release.
+
+=head1 Notice
+
+The 5.8.9 release will be the last significant release of the 5.8.x
+series. Any future releases of 5.8.x will likely only be to deal with
+security issues, and platform build failures. Hence you should look to
+migrating to 5.10.x, if you have not started already.
+See L</"Known Problems"> for more information.
+
+=head1 Incompatible Changes
+
+A particular construction in the source code of extensions written in C++
+may need changing. See L</"Changed Internals"> for more details. All
+extensions written in C, most written in C++, and all existing compiled
+extensions are unaffected. This was necessary to improve C++ support.
+
+Other than this, there are no changes intentionally incompatible with 5.8.8.
+If any exist, they are bugs and reports are welcome.
+
+=head1 Core Enhancements
+
+=head2 Unicode Character Database 5.1.0.
+
+The copy of the Unicode Character Database included in Perl 5.8 has
+been updated to 5.1.0 from 4.1.0. See
+L<http://www.unicode.org/versions/Unicode5.1.0/#NotableChanges> for the
+notable changes.
+
+=head2 stat and -X on directory handles
+
+It is now possible to call C<stat> and the C<-X> filestat operators on
+directory handles. As both directory and file handles are barewords, there
+can be ambiguities over which was intended. In these situations the file
+handle semantics are preferred. Both also treat C<*FILE{IO}> filehandles
+like C<*FILE> filehandles.
+
+=head2 Source filters in @INC
+
+It's possible to enhance the mechanism of subroutine hooks in @INC by
+adding a source filter on top of the filehandle opened and returned by the
+hook. This feature was planned a long time ago, but wasn't quite working
+until now. See L<perlfunc/require> for details. (Nicholas Clark)
+
+=head2 Exceptions in constant folding
+
+The constant folding routine is now wrapped in an exception handler, and
+if folding throws an exception (such as attempting to evaluate 0/0), perl
+now retains the current optree, rather than aborting the whole program.
+Without this change, programs would not compile if they had expressions that
+happened to generate exceptions, even though those expressions were in code
+that could never be reached at runtime. (Nicholas Clark, Dave Mitchell)
+
+=head2 C<no VERSION>
+
+You can now use C<no> followed by a version number to specify that you
+want to use a version of perl older than the specified one.
+
+=head2 Improved internal UTF-8 caching code
+
+The code that caches calculated UTF-8 byte offsets for character offsets for
+a string has been re-written. Several bugs have been located and eliminated,
+and the code now makes better use of the information it has, so should be
+faster. In particular, it doesn't scan to the end of a string before
+calculating an offset within the string, which should speed up some operations
+on long strings. It is now possible to disable the caching code at run time,
+to verify that it is not the cause of suspected problems.
+
+=head2 Runtime relocatable installations
+
+There is now F<Configure> support for creating a perl tree that is relocatable
+at run time. see L</Relocatable installations>.
+
+=head2 New internal variables
+
+=over 4
+
+=item C<${^CHILD_ERROR_NATIVE}>
+
+This variable gives the native status returned by the last pipe close,
+backtick command, successful call to C<wait> or C<waitpid>, or from the
+C<system> operator. See L<perlvar> for details. (Contributed by Gisle Aas.)
+
+=item C<${^UTF8CACHE}>
+
+This variable controls the state of the internal UTF-8 offset caching code.
+1 for on (the default), 0 for off, -1 to debug the caching code by checking
+all its results against linear scans, and panicing on any discrepancy.
+
+=back
+
+=head2 C<readpipe> is now overridable
+
+The built-in function C<readpipe> is now overridable. Overriding it permits
+also to override its operator counterpart, C<qx//> (also known as C<``>).
+
+=head2 simple exception handling macros
+
+Perl 5.8.9 (and 5.10.0 onwards) now provides a couple of macros to do very
+basic exception handling in XS modules. You can use these macros if you call
+code that may C<croak>, but you need to do some cleanup before giving control
+back to Perl. See L<perlguts/Exception Handling> for more details.
+
+=head2 -D option enhancements
+
+=over
+
+=item *
+
+C<-Dq> suppresses the I<EXECUTING...> message when running under C<-D>
+
+=item *
+
+C<-Dl> logs runops loop entry and exit, and jump level popping.
+
+=item *
+
+C<-Dv> displays the process id as part of the trace output.
+
+=back
+
+=head2 XS-assisted SWASHGET
+
+Some pure-perl code that the regexp engine was using to retrieve Unicode
+properties and transliteration mappings has been reimplemented in XS
+for faster execution.
+(SADAHIRO Tomoyuki)
+
+=head2 Constant subroutines
+
+The interpreter internals now support a far more memory efficient form of
+inlineable constants. Storing a reference to a constant value in a symbol
+table is equivalent to a full typeglob referencing a constant subroutine,
+but using about 400 bytes less memory. This proxy constant subroutine is
+automatically upgraded to a real typeglob with subroutine if necessary.
+The approach taken is analogous to the existing space optimisation for
+subroutine stub declarations, which are stored as plain scalars in place
+of the full typeglob.
+
+However, to aid backwards compatibility of existing code, which (wrongly)
+does not expect anything other than typeglobs in symbol tables, nothing in
+core uses this feature, other than the regression tests.
+
+Stubs for prototyped subroutines have been stored in symbol tables as plain
+strings, and stubs for unprototyped subroutines as the number -1, since 5.005,
+so code which assumes that the core only places typeglobs in symbol tables
+has been making incorrect assumptions for over 10 years.
+
+=head1 New Platforms
+
+Compile support added for:
+
+=over
+
+=item *
+
+DragonFlyBSD
+
+=item *
+
+MidnightBSD
+
+=item *
+
+MirOS BSD
+
+=item *
+
+RISC OS
+
+=item *
+
+Cray XT4/Catamount
+
+=back
+
+=head1 Modules and Pragmata
+
+=head2 New Modules
+
+=over
+
+=item *
+
+C<Module::Pluggable> is a simple framework to create modules that accept
+pluggable sub-modules. The bundled version is 3.8
+
+=item *
+
+C<Module::CoreList> is a hash of hashes that is keyed on perl version as
+indicated in C<$]>. The bundled version is 2.17
+
+=item *
+
+C<Win32API::File> now available in core on Microsoft Windows. The bundled
+version is 0.1001_01
+
+=item *
+
+C<Devel::InnerPackage> finds all the packages defined by a single file. It is
+part of the C<Module::Pluggable> distribution. The bundled version is 0.3
+
+=back
+
+=head2 Updated Modules
+
+=over
+
+=item *
+
+C<attributes> upgraded to version 0.09
+
+=item *
+
+C<AutoLoader> upgraded to version 5.67
+
+=item *
+
+C<AutoSplit> upgraded to 1.06
+
+=item *
+
+C<autouse> upgraded to version 1.06
+
+=item *
+
+C<B> upgraded from 1.09_01 to 1.19
+
+=over
+
+=item *
+
+provides new pad related abstraction macros C<B::NV::COP_SEQ_RANGE_LOW>,
+C<B::NV::COP_SEQ_RANGE_HIGH>, C<B::NV::PARENT_PAD_INDEX>,
+C<B::NV::PARENT_FAKELEX_FLAGS>, which hides the difference in storage in
+5.10.0 and later.
+
+=item *
+
+provides C<B::sub_generation>, which exposes C<PL_sub_generation>
+
+=item *
+
+provides C<B::GV::isGV_with_GP>, which on pre-5.10 perls always returns true.
+
+=item *
+
+New type C<B::HE> added with methods C<VAL>, C<HASH> and C<SVKEY_force>
+
+=item *
+
+The C<B::GVf_IMPORTED_CV> flag is now set correctly when a proxy
+constant subroutine is imported.
+
+=item *
+
+bugs fixed in the handling of C<PMOP>s.
+
+=item *
+
+C<B::BM::PREVIOUS> returns now C<U32>, not C<U16>.
+C<B::CV::START> and C<B:CV::ROOT> return now C<NULL> on an XSUB,
+C<B::CV::XSUB> and C<B::CV::XSUBANY> return 0 on a non-XSUB.
+
+=back
+
+=item *
+
+C<B::C> upgraded to 1.05
+
+=item *
+
+C<B::Concise> upgraded to 0.76
+
+=over
+
+=item *
+
+new option C<-src> causes the rendering of each statement (starting with
+the nextstate OP) to be preceded by the first line of source code that
+generates it.
+
+=item *
+
+new option C<-stash="somepackage">, C<require>s "somepackage", and then renders
+each function defined in its namespace.
+
+=item *
+
+now has documentation of detailed hint symbols.
+
+=back
+
+=item *
+
+C<B::Debug> upgraded to version 1.05
+
+=item *
+
+C<B::Deparse> upgraded to version 0.87
+
+=over 4
+
+=item *
+
+properly deparse C<print readpipe $x, $y>.
+
+=item *
+
+now handles C<''->()>, C<::()>, C<sub :: {}>, I<etc.> correctly [RT #43010].
+All bugs in parsing these kinds of syntax are now fixed:
+
+ perl -MO=Deparse -e '"my %h = "->()'
+ perl -MO=Deparse -e '::->()'
+ perl -MO=Deparse -e 'sub :: {}'
+ perl -MO=Deparse -e 'package a; sub a::b::c {}'
+ perl -MO=Deparse -e 'sub the::main::road {}'
+
+=item *
+
+does B<not> deparse C<$^H{v_string}>, which is automatically set by the
+internals.
+
+=back
+
+=item *
+
+C<B::Lint> upgraded to version 1.11
+
+=item *
+
+C<B::Terse> upgraded to version 1.05
+
+=item *
+
+C<base> upgraded to version 2.13
+
+=over 4
+
+=item *
+
+loading a module via base.pm would mask a global C<$SIG{__DIE__}> in that
+module.
+
+=item *
+
+push all classes at once in C<@ISA>
+
+=back
+
+=item *
+
+C<Benchmark> upgraded to version 1.10
+
+=item *
+
+C<bigint> upgraded to 0.23
+
+=item *
+
+C<bignum> upgraded to 0.23
+
+=item *
+
+C<bigrat> upgraded to 0.23
+
+=item *
+
+C<blib> upgraded to 0.04
+
+=item *
+
+C<Carp> upgraded to version 1.10
+
+The argument backtrace code now shows C<undef> as C<undef>,
+instead of a string I<"undef">.
+
+=item *
+
+C<CGI> upgraded to version 3.42
+
+=item *
+
+C<charnames> upgraded to 1.06
+
+=item *
+
+C<constant> upgraded to version 1.17
+
+=item *
+
+C<CPAN> upgraded to version 1.9301
+
+=item *
+
+C<Cwd> upgraded to version 3.29 with some platform specific
+improvements (including for VMS).
+
+=item *
+
+C<Data::Dumper> upgraded to version 2.121_17
+
+=over
+
+=item *
+
+Fixes hash iterator current position with the pure Perl version [RT #40668]
+
+=item *
+
+Performance enhancements, which will be most evident on platforms where
+repeated calls to C's C<realloc()> are slow, such as Win32.
+
+=back
+
+=item *
+
+C<DB_File> upgraded to version 1.817
+
+=item *
+
+C<DB_Filter> upgraded to version 0.02
+
+=item *
+
+C<Devel::DProf> upgraded to version 20080331.00
+
+=item *
+
+C<Devel::Peek> upgraded to version 1.04
+
+=item *
+
+C<Devel::PPPort> upgraded to version 3.14
+
+=item *
+
+C<diagnostics> upgraded to version 1.16
+
+=item *
+
+C<Digest> upgraded to version 1.15
+
+=item *
+
+C<Digest::MD5> upgraded to version 2.37
+
+=item *
+
+C<DirHandle> upgraded to version 1.02
+
+=over
+
+=item *
+
+now localises C<$.>, C<$@>, C<$!>, C<$^E>, and C<$?> before closing the
+directory handle to suppress leaking any side effects of warnings about it
+already being closed.
+
+=back
+
+=item *
+
+C<DynaLoader> upgraded to version 1.09
+
+C<DynaLoader> can now dynamically load a loadable object from a file with a
+non-default file extension.
+
+=item *
+
+C<Encode> upgraded to version 2.26
+
+C<Encode::Alias> includes a fix for encoding "646" on Solaris (better known as
+ASCII).
+
+=item *
+
+C<English> upgraded to version 1.03
+
+=item *
+
+C<Errno> upgraded to version 1.10
+
+=item *
+
+C<Exporter> upgraded to version 5.63
+
+=item *
+
+C<ExtUtils::Command> upgraded to version 1.15
+
+=item *
+
+C<ExtUtils::Constant> upgraded to version 0.21
+
+=item *
+
+C<ExtUtils::Embed> upgraded to version 1.28
+
+=item *
+
+C<ExtUtils::Install> upgraded to version 1.50_01
+
+=item *
+
+C<ExtUtils::Installed> upgraded to version 1.43
+
+=item *
+
+C<ExtUtils::MakeMaker> upgraded to version 6.48
+
+=over
+
+=item *
+
+support for C<INSTALLSITESCRIPT> and C<INSTALLVENDORSCRIPT>
+configuration.
+
+=back
+
+=item *
+
+C<ExtUtils::Manifest> upgraded to version 1.55
+
+=item *
+
+C<ExtUtils::ParseXS> upgraded to version 2.19
+
+=item *
+
+C<Fatal> upgraded to version 1.06
+
+=over
+
+=item *
+
+allows built-ins in C<CORE::GLOBAL> to be made fatal.
+
+=back
+
+=item *
+
+C<Fcntl> upgraded to version 1.06
+
+=item *
+
+C<fields> upgraded to version 2.12
+
+=item *
+
+C<File::Basename> upgraded to version 2.77
+
+=item *
+
+C<FileCache> upgraded to version 1.07
+
+=item *
+
+C<File::Compare> upgraded to 1.1005
+
+=item *
+
+C<File::Copy> upgraded to 2.13
+
+=over 4
+
+=item *
+
+now uses 3-arg open.
+
+=back
+
+=item *
+
+C<File::DosGlob> upgraded to 1.01
+
+=item *
+
+C<File::Find> upgraded to version 1.13
+
+=item *
+
+C<File::Glob> upgraded to version 1.06
+
+=over
+
+=item *
+
+fixes spurious results with brackets inside braces.
+
+=back
+
+=item *
+
+C<File::Path> upgraded to version 2.07_02
+
+=item *
+
+C<File::Spec> upgraded to version 3.29
+
+=over 4
+
+=item *
+
+improved handling of bad arguments.
+
+=item *
+
+some platform specific improvements (including for VMS and Cygwin), with
+an optimisation on C<abs2rel> when handling both relative arguments.
+
+=back
+
+=item *
+
+C<File::stat> upgraded to version 1.01
+
+=item *
+
+C<File::Temp> upgraded to version 0.20
+
+=item *
+
+C<filetest> upgraded to version 1.02
+
+=item *
+
+C<Filter::Util::Call> upgraded to version 1.07
+
+=item *
+
+C<Filter::Simple> upgraded to version 0.83
+
+=item *
+
+C<FindBin> upgraded to version 1.49
+
+=item *
+
+C<GDBM_File> upgraded to version 1.09
+
+=item *
+
+C<Getopt::Long> upgraded to version 2.37
+
+=item *
+
+C<Getopt::Std> upgraded to version 1.06
+
+=item *
+
+C<Hash::Util> upgraded to version 0.06
+
+=item *
+
+C<if> upgraded to version 0.05
+
+=item *
+
+C<IO> upgraded to version 1.23
+
+Reduced number of calls to C<getpeername> in C<IO::Socket>
+
+=item *
+
+C<IPC::Open> upgraded to version 1.03
+
+=item *
+
+C<IPC::Open3> upgraded to version 1.03
+
+=item *
+
+C<IPC::SysV> upgraded to version 2.00
+
+=item *
+
+C<lib> upgraded to version 0.61
+
+=over
+
+=item *
+
+avoid warning about loading F<.par> files.
+
+=back
+
+=item *
+
+C<libnet> upgraded to version 1.22
+
+=item *
+
+C<List::Util> upgraded to 1.19
+
+=item *
+
+C<Locale::Maketext> upgraded to 1.13
+
+=item *
+
+C<Math::BigFloat> upgraded to version 1.60
+
+=item *
+
+C<Math::BigInt> upgraded to version 1.89
+
+=item *
+
+C<Math::BigRat> upgraded to version 0.22
+
+=over 4
+
+=item *
+
+implements new C<as_float> method.
+
+=back
+
+=item *
+
+C<Math::Complex> upgraded to version 1.54.
+
+=item *
+
+C<Math::Trig> upgraded to version 1.18.
+
+=item *
+
+C<NDBM_File> upgraded to version 1.07
+
+=over
+
+=item *
+
+improve F<g++> handling for systems using GDBM compatibility headers.
+
+=back
+
+=item *
+
+C<Net::Ping> upgraded to version 2.35
+
+=item *
+
+C<NEXT> upgraded to version 0.61
+
+=over
+
+=item *
+
+fix several bugs with C<NEXT> when working with C<AUTOLOAD>, C<eval> block, and
+within overloaded stringification.
+
+=back
+
+=item *
+
+C<ODBM_File> upgraded to 1.07
+
+=item *
+
+C<open> upgraded to 1.06
+
+=item *
+
+C<ops> upgraded to 1.02
+
+=item *
+
+C<PerlIO::encoding> upgraded to version 0.11
+
+=item *
+
+C<PerlIO::scalar> upgraded to version 0.06
+
+=over 4
+
+=item *
+
+[RT #40267] C<PerlIO::scalar> doesn't respect readonly-ness.
+
+=back
+
+=item *
+
+C<PerlIO::via> upgraded to version 0.05
+
+=item *
+
+C<Pod::Html> upgraded to version 1.09
+
+=item *
+
+C<Pod::Parser> upgraded to version 1.35
+
+=item *
+
+C<Pod::Usage> upgraded to version 1.35
+
+=item *
+
+C<POSIX> upgraded to version 1.15
+
+=over
+
+=item *
+
+C<POSIX> constants that duplicate those in C<Fcntl> are now imported from
+C<Fcntl> and re-exported, rather than being duplicated by C<POSIX>
+
+=item *
+
+C<POSIX::remove> can remove empty directories.
+
+=item *
+
+C<POSIX::setlocale> safer to call multiple times.
+
+=item *
+
+C<POSIX::SigRt> added, which provides access to POSIX realtime signal
+functionality on systems that support it.
+
+=back
+
+=item *
+
+C<re> upgraded to version 0.06_01
+
+=item *
+
+C<Safe> upgraded to version 2.16
+
+=item *
+
+C<Scalar::Util> upgraded to 1.19
+
+=item *
+
+C<SDBM_File> upgraded to version 1.06
+
+=item *
+
+C<SelfLoader> upgraded to version 1.17
+
+=item *
+
+C<Shell> upgraded to version 0.72
+
+=item *
+
+C<sigtrap> upgraded to version 1.04
+
+=item *
+
+C<Socket> upgraded to version 1.81
+
+=over
+
+=item *
+
+this fixes an optimistic use of C<gethostbyname>
+
+=back
+
+=item *
+
+C<Storable> upgraded to 2.19
+
+=item *
+
+C<Switch> upgraded to version 2.13
+
+=item *
+
+C<Sys::Syslog> upgraded to version 0.27
+
+=item *
+
+C<Term::ANSIColor> upgraded to version 1.12
+
+=item *
+
+C<Term::Cap> upgraded to version 1.12
+
+=item *
+
+C<Term::ReadLine> upgraded to version 1.03
+
+=item *
+
+C<Test::Builder> upgraded to version 0.80
+
+=item *
+
+C<Test::Harness> upgraded version to 2.64
+
+=over
+
+=item *
+
+this makes it able to handle newlines.
+
+=back
+
+=item *
+
+C<Test::More> upgraded to version 0.80
+
+=item *
+
+C<Test::Simple> upgraded to version 0.80
+
+=item *
+
+C<Text::Balanced> upgraded to version 1.98
+
+=item *
+
+C<Text::ParseWords> upgraded to version 3.27
+
+=item *
+
+C<Text::Soundex> upgraded to version 3.03
+
+=item *
+
+C<Text::Tabs> upgraded to version 2007.1117
+
+=item *
+
+C<Text::Wrap> upgraded to version 2006.1117
+
+=item *
+
+C<Thread> upgraded to version 2.01
+
+=item *
+
+C<Thread::Semaphore> upgraded to version 2.09
+
+=item *
+
+C<Thread::Queue> upgraded to version 2.11
+
+=over
+
+=item *
+
+added capability to add complex structures (e.g., hash of hashes) to queues.
+
+=item *
+
+added capability to dequeue multiple items at once.
+
+=item *
+
+added new methods to inspect and manipulate queues: C<peek>, C<insert> and
+C<extract>
+
+=back
+
+=item *
+
+C<Tie::Handle> upgraded to version 4.2
+
+=item *
+
+C<Tie::Hash> upgraded to version 1.03
+
+=item *
+
+C<Tie::Memoize> upgraded to version 1.1
+
+=over
+
+=item *
+
+C<Tie::Memoize::EXISTS> now correctly caches its results.
+
+=back
+
+=item *
+
+C<Tie::RefHash> upgraded to version 1.38
+
+=item *
+
+C<Tie::Scalar> upgraded to version 1.01
+
+=item *
+
+C<Tie::StdHandle> upgraded to version 4.2
+
+=item *
+
+C<Time::gmtime> upgraded to version 1.03
+
+=item *
+
+C<Time::Local> upgraded to version 1.1901
+
+=item *
+
+C<Time::HiRes> upgraded to version 1.9715 with various build improvements
+(including VMS) and minor platform-specific bug fixes (including
+for HP-UX 11 ia64).
+
+=item *
+
+C<threads> upgraded to 1.71
+
+=over
+
+=item *
+
+new thread state information methods: C<is_running>, C<is_detached>
+and C<is_joinable>. C<list> method enhanced to return running or joinable
+threads.
+
+=item *
+
+new thread signal method: C<kill>
+
+=item *
+
+added capability to specify thread stack size.
+
+=item *
+
+added capability to control thread exiting behavior. Added a new C<exit>
+method.
+
+=back
+
+=item *
+
+C<threads::shared> upgraded to version 1.27
+
+=over
+
+=item *
+
+smaller and faster implementation that eliminates one internal structure and
+the consequent level of indirection.
+
+=item *
+
+user locks are now stored in a safer manner.
+
+=item *
+
+new function C<shared_clone> creates a copy of an object leaving
+shared elements as-is and deep-cloning non-shared elements.
+
+=item *
+
+added new C<is_shared> method.
+
+=back
+
+=item *
+
+C<Unicode::Normalize> upgraded to version 1.02
+
+=item *
+
+C<Unicode::UCD> upgraded to version 0.25
+
+=item *
+
+C<warnings> upgraded to version 1.05_01
+
+=item *
+
+C<Win32> upgraded to version 0.38
+
+=over 4
+
+=item *
+
+added new function C<GetCurrentProcessId> which returns the regular Windows
+process identifier of the current process, even when called from within a fork.
+
+=back
+
+=item *
+
+C<XSLoader> upgraded to version 0.10
+
+=item *
+
+C<XS::APItest> and C<XS::Typemap> are for internal use only and hence
+no longer installed. Many more tests have been added to C<XS::APItest>.
+
+=back
+
+=head1 Utility Changes
+
+=head2 debugger upgraded to version 1.31
+
+=over 4
+
+=item *
+
+Andreas KE<ouml>nig contributed two functions to save and load the debugger
+history.
+
+=item *
+
+C<NEXT::AUTOLOAD> no longer emits warnings under the debugger.
+
+=item *
+
+The debugger should now correctly find tty the device on OS X 10.5 and VMS
+when the program C<fork>s.
+
+=item *
+
+LVALUE subs now work inside the debugger.
+
+=back
+
+=head2 F<perlthanks>
+
+Perl 5.8.9 adds a new utility F<perlthanks>, which is a variant of F<perlbug>,
+but for sending non-bug-reports to the authors and maintainers of Perl.
+Getting nothing but bug reports can become a bit demoralising - we'll see if
+this changes things.
+
+=head2 F<perlbug>
+
+F<perlbug> now checks if you're reporting about a non-core module and suggests
+you report it to the CPAN author instead.
+
+=head2 F<h2xs>
+
+=over
+
+=item *
+
+won't define an empty string as a constant [RT #25366]
+
+=item *
+
+has examples for C<h2xs -X>
+
+=back
+
+=head2 F<h2ph>
+
+=over 4
+
+=item *
+
+now attempts to deal sensibly with the difference in path implications
+between C<""> and C<< E<lt>E<gt> >> quoting in C<#include> statements.
+
+=item *
+
+now generates correct correct code for C<#if defined A || defined B>
+[RT #39130]
+
+=back
+
+=head1 New Documentation
+
+As usual, the documentation received its share of corrections, clarifications
+and other nitfixes. More C<< X<...> >> tags were added for indexing.
+
+L<perlunitut> is a tutorial written by Juerd Waalboer on Unicode-related
+terminology and how to correctly handle Unicode in Perl scripts.
+
+L<perlunicode> is updated in section user defined properties.
+
+L<perluniintro> has been updated in the example of detecting data that is not
+valid in particular encoding.
+
+L<perlcommunity> provides an overview of the Perl Community along with further
+resources.
+
+L<CORE> documents the pseudo-namespace for Perl's core routines.
+
+=head1 Changes to Existing Documentation
+
+L<perlglossary> adds I<deprecated modules and features> and I<to be dropped modules>.
+
+L<perlhack> has been updated and added resources on smoke testing.
+
+The Perl FAQs (F<perlfaq1>..F<perlfaq9>) have been updated.
+
+L<perlcheat> is updated with better details on C<\w>, C<\d>, and C<\s>.
+
+L<perldebug> is updated with information on how to call the debugger.
+
+L<perldiag> documentation updated with I<subroutine with an ampersand> on the
+argument to C<exists> and C<delete> and also several terminology updates on
+warnings.
+
+L<perlfork> documents the limitation of C<exec> inside pseudo-processes.
+
+L<perlfunc>:
+
+=over
+
+=item *
+
+Documentation is fixed in section C<caller> and C<pop>.
+
+=item *
+
+Function C<alarm> now mentions C<Time::HiRes::ualarm> in preference
+to C<select>.
+
+=item *
+
+Regarding precedence in C<-X>, filetest operators are the same as unary
+operators, but not regarding parsing and parentheses (spotted by Eirik Berg
+Hanssen).
+
+=item *
+
+L<reverse> function documentation received scalar context examples.
+
+=back
+
+L<perllocale> documentation is adjusted for number localization and
+C<POSIX::setlocale> to fix Debian bug #379463.
+
+L<perlmodlib> is updated with C<CPAN::API::HOWTO> and
+C<Sys::Syslog::win32::Win32>
+
+L<perlre> documentation updated to reflect the differences between
+C<[[:xxxxx:]]> and C<\p{IsXxxxx}> matches. Also added section on C</g> and
+C</c> modifiers.
+
+L<perlreguts> describe the internals of the regular expressions engine. It has
+been contributed by Yves Orton.
+
+L<perlrebackslash> describes all perl regular expression backslash and escape
+sequences.
+
+L<perlrecharclass> describes the syntax and use of character classes in
+Perl Regular Expressions.
+
+L<perlrun> is updated to clarify on the hash seed I<PERL_HASH_SEED>. Also more
+information in options C<-x> and C<-u>.
+
+L<perlsub> example is updated to use a lexical variable for C<opendir> syntax.
+
+L<perlvar> fixes confusion about real GID C<$(> and effective GID C<$)>.
+
+Perl thread tutorial example is fixed in section
+L<perlthrtut/Queues: Passing Data Around> and L<perlothrtut>.
+
+L<perlhack> documentation extensively improved by Jarkko Hietaniemi and others.
+
+L<perltoot> provides information on modifying C<@UNIVERSAL::ISA>.
+
+L<perlport> documentation extended to include different C<kill(-9, ...)>
+semantics on Windows. It also clearly states C<dump> is not supported on Win32
+and cygwin.
+
+F<INSTALL> has been updated and modernised.
+
+=head1 Performance Enhancements
+
+=over
+
+=item *
+
+The default since perl 5.000 has been for perl to create an empty scalar
+with every new typeglob. The increased use of lexical variables means that
+most are now unused. Thanks to Nicholas Clark's efforts, Perl can now be
+compiled with C<-DPERL_DONT_CREATE_GVSV> to avoid creating these empty scalars.
+This will significantly decrease the number of scalars allocated for all
+configurations, and the number of scalars that need to be copied for ithread
+creation. Whilst this option is binary compatible with existing perl
+installations, it does change a long-standing assumption about the
+internals, hence it is not enabled by default, as some third party code may
+rely on the old behaviour.
+
+We would recommend testing with this configuration on new deployments of
+perl, particularly for multi-threaded servers, to see whether all third party
+code is compatible with it, as this configuration may give useful performance
+improvements. For existing installations we would not recommend changing to
+this configuration unless thorough testing is performed before deployment.
+
+=item *
+
+C<diagnostics> no longer uses C<$&>, which results in large speedups
+for regexp matching in all code using it.
+
+=item *
+
+Regular expressions classes of a single character are now treated the same as
+if the character had been used as a literal, meaning that code that uses
+char-classes as an escaping mechanism will see a speedup. (Yves Orton)
+
+=item *
+
+Creating anonymous array and hash references (ie. C<[]> and C<{}>) now incurs
+no more overhead than creating an anonymous list or hash. Nicholas Clark
+provided changes with a saving of two ops and one stack push, which was measured
+as a slightly better than 5% improvement for these operations.
+
+=item *
+
+Many calls to C<strlen()> have been eliminated, either because the length was
+already known, or by adopting or enhancing APIs that pass lengths. This has
+been aided by the adoption of a C<my_sprintf()> wrapper, which returns the
+correct C89 value - the length of the formatted string. Previously we could
+not rely on the return value of C<sprintf()>, because on some ancient but
+extant platforms it still returns C<char *>.
+
+=item *
+
+C<index> is now faster if the search string is stored in UTF-8 but only contains
+characters in the Latin-1 range.
+
+=item *
+
+The Unicode swatch cache inside the regexp engine is now used. (the lookup had
+a key mismatch, present since the initial implementation). [RT #42839]
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+=head2 Relocatable installations
+
+There is now F<Configure> support for creating a relocatable perl tree. If
+you F<Configure> with C<-Duserelocatableinc>, then the paths in C<@INC> (and
+everything else in C<%Config>) can be optionally located via the path of the
+F<perl> executable.
+
+At start time, if any paths in C<@INC> or C<Config> that F<Configure> marked
+as relocatable (by starting them with C<".../">), then they are prefixed the
+directory of C<$^X>. This allows the relocation can be configured on a
+per-directory basis, although the default with C<-Duserelocatableinc> is that
+everything is relocated. The initial install is done to the original configured
+prefix.
+
+=head2 Configuration improvements
+
+F<Configure> is now better at removing temporary files. Tom Callaway
+(from RedHat) also contributed patches that complete the set of flags
+passed to the compiler and the linker, in particular that C<-fPIC> is now
+enabled on Linux. It will also croak when your F</dev/null> isn't a device.
+
+A new configuration variable C<d_pseudofork> has been to F<Configure>, and is
+available as C<$Config{d_pseudofork}> in the C<Config> module. This
+distinguishes real C<fork> support from the pseudofork emulation used on
+Windows platforms.
+
+F<Config.pod> and F<config.sh> are now placed correctly for cross-compilation.
+
+C<$Config{useshrplib}> is now 'true' rather than 'yes' when using a shared perl
+library.
+
+=head2 Compilation improvements
+
+Parallel makes should work properly now, although there may still be problems
+if C<make test> is instructed to run in parallel.
+
+Many compilation warnings have been cleaned up. A very stubborn compiler
+warning in C<S_emulate_eaccess()> was killed after six attempts.
+F<g++> support has been tuned, especially for FreeBSD.
+
+F<mkppport> has been integrated, and all F<ppport.h> files in the core will now
+be autogenerated at build time (and removed during cleanup).
+
+=head2 Installation improvements.
+
+F<installman> now works with C<-Duserelocatableinc> and C<DESTDIR>.
+
+F<installperl> no longer installs:
+
+=over 4
+
+=item *
+
+static library files of statically linked extensions when a shared perl library
+is being used. (They are not needed. See L</Windows> below).
+
+=item *
+
+F<SIGNATURE> and F<PAUSE*.pub> (CPAN files)
+
+=item *
+
+F<NOTES> and F<PATCHING> (ExtUtils files)
+
+=item *
+
+F<perlld> and F<ld2> (Cygwin files)
+
+=back
+
+=head2 Platform Specific Changes
+
+There are improved hints for AIX, Cygwin, DEC/OSF, FreeBSD, HP/UX, Irix 6
+Linux, MachTen, NetBSD, OS/390, QNX, SCO, Solaris, SunOS, System V Release 5.x
+(UnixWare 7, OpenUNIX 8), Ultrix, UMIPS, uts and VOS.
+
+=head3 FreeBSD
+
+=over 4
+
+=item *
+
+Drop C<-std=c89> and C<-ansi> if using C<long long> as the main integral type,
+else in FreeBSD 6.2 (and perhaps other releases), system headers do not
+declare some functions required by perl.
+
+=back
+
+=head3 Solaris
+
+=over 4
+
+=item *
+
+Starting with Solaris 10, we do not want versioned shared libraries, because
+those often indicate a private use only library. These problems could often
+be triggered when L<SUNWbdb> (Berkeley DB) was installed. Hence if Solaris 10
+is detected set C<ignore_versioned_solibs=y>.
+
+=back
+
+=head3 VMS
+
+=over 4
+
+=item *
+
+Allow IEEE math to be deselected on OpenVMS I64 (but it remains the default).
+
+=item *
+
+Record IEEE usage in C<config.h>
+
+=item *
+
+Help older VMS compilers by using C<ccflags> when building C<munchconfig.exe>.
+
+=item *
+
+Don't try to build old C<Thread> extension on VMS when C<-Duseithreads> has
+been chosen.
+
+=item *
+
+Passing a raw string of "NaN" to F<nawk> causes a core dump - so the string
+has been changed to "*NaN*"
+
+=item *
+
+F<t/op/stat.t> tests will now test hard links on VMS if they are supported.
+
+=back
+
+=head3 Windows
+
+=over 4
+
+=item *
+
+When using a shared perl library F<installperl> no longer installs static
+library files, import library files and export library files (of statically
+linked extensions) and empty bootstrap files (of dynamically linked
+extensions). This fixes a problem building PAR-Packer on Win32 with a debug
+build of perl.
+
+=item *
+
+Various improvements to the win32 build process, including support for Visual
+C++ 2005 Express Edition (aka Visual C++ 8.x).
+
+=item *
+
+F<perl.exe> will now have an icon if built with MinGW or Borland.
+
+=item *
+
+Improvements to the perl-static.exe build process.
+
+=item *
+
+Add Win32 makefile option to link all extensions statically.
+
+=item *
+
+The F<WinCE> directory has been merged into the F<Win32> directory.
+
+=item *
+
+C<setlocale> tests have been re-enabled for Windows XP onwards.
+
+=back
+
+=head1 Selected Bug Fixes
+
+=head2 Unicode
+
+Many many bugs related to the internal Unicode implementation (UTF-8) have
+been fixed. In particular, long standing bugs related to returning Unicode
+via C<tie>, overloading or C<$@> are now gone, some of which were never
+reported.
+
+C<unpack> will internally convert the string back from UTF-8 on numeric types.
+This is a compromise between the full consistency now in 5.10, and the current
+behaviour, which is often used as a "feature" on string types.
+
+Using C<:crlf> and C<UTF-16> IO layers together will now work.
+
+Fixed problems with C<split>, Unicode C</\s+/> and C</ \0/>.
+
+Fixed bug RT #40641 - encoding of Unicode characters in regular expressions.
+
+Fixed a bug where using certain patterns in a regexp led to a panic.
+[RT #45337]
+
+Perl no longer segfaults (due to infinite internal recursion) if the locale's
+character is not UTF-8 [RT #41442]:
+
+ use open ':locale';
+ print STDERR "\x{201e}"; # &bdquo;
+
+=head2 PerlIO
+
+Inconsistencies have been fixed in the reference counting PerlIO uses to keep
+track of Unix file descriptors, and the API used by XS code to manage getting
+and releasing C<FILE *>s
+
+=head2 Magic
+
+Several bugs have been fixed in Magic, the internal system used to implement
+features such as C<tie>, tainting and threads sharing.
+
+C<undef @array> on a tied array now correctly calls the C<CLEAR> method.
+
+Some of the bitwise ops were not checking whether their arguments were magical
+before using them. [RT #24816]
+
+Magic is no longer invoked twice by the expression C<\&$x>
+
+A bug with assigning large numbers and tainting has been resolved.
+[RT #40708]
+
+A new entry has been added to the MAGIC vtable - C<svt_local>. This is used
+when copying magic to the new value during C<local>, allowing certain problems
+with localising shared variables to be resolved.
+
+For the implementation details, see L<perlguts/Magic Virtual Tables>.
+
+=head2 Reblessing overloaded objects now works
+
+Internally, perl object-ness is on the referent, not the reference, even
+though methods can only be called via a reference. However, the original
+implementation of overloading stored flags related to overloading on the
+reference, relying on the flags being copied when the reference was copied,
+or set at the creation of a new reference. This manifests in a bug - if you
+rebless an object from a class that has overloading, into one that does not,
+then any other existing references think that they (still) point to an
+overloaded object, choose these C code paths, and then throw errors.
+Analogously, blessing into an overloaded class when other references exist will
+result in them not using overloading.
+
+The implementation has been fixed for 5.10, but this fix changes the semantics
+of flag bits, so is not binary compatible, so can't be applied to 5.8.9.
+However, 5.8.9 has a work-around that implements the same bug fix. If the
+referent has multiple references, then all the other references are located and
+corrected. A full search is avoided whenever possible by scanning lexicals
+outwards from the current subroutine, and the argument stack.
+
+A certain well known Linux vendor applied incomplete versions of this bug fix
+to their F</usr/bin/perl> and then prematurely closed bug reports about
+performance issues without consulting back upstream. This not being enough,
+they then proceeded to ignore the necessary fixes to these unreleased changes
+for 11 months, until massive pressure was applied by their long-suffering
+paying customers, catalysed by the failings being featured on a prominent blog
+and Slashdot.
+
+=head2 C<strict> now propagates correctly into string evals
+
+Under 5.8.8 and earlier:
+
+ $ perl5.8.8 -e 'use strict; eval "use foo bar" or die $@'
+ Can't locate foo.pm in @INC (@INC contains: ... .) at (eval 1) line 2.
+ BEGIN failed--compilation aborted at (eval 1) line 2.
+
+Under 5.8.9 and later:
+
+ $ perl5.8.9 -e 'use strict; eval "use foo bar" or die $@'
+ Bareword "bar" not allowed while "strict subs" in use at (eval 1) line 1.
+
+This may cause problems with programs that parse the error message and rely
+on the buggy behaviour.
+
+=head2 Other fixes
+
+=over
+
+=item *
+
+The tokenizer no longer treats C<=cute> (and other words beginning
+with C<=cut>) as a synonym for C<=cut>.
+
+=item *
+
+Calling C<CORE::require>
+
+C<CORE::require> and C<CORE::do> were always parsed as C<require> and C<do>
+when they were overridden. This is now fixed.
+
+=item *
+
+Stopped memory leak on long F</etc/groups> entries.
+
+=item *
+
+C<while (my $x ...) { ...; redo }> shouldn't C<undef $x>.
+
+In the presence of C<my> in the conditional of a C<while()>, C<until()>,
+or C<for(;;)> loop, we now add an extra scope to the body so that C<redo>
+doesn't C<undef> the lexical.
+
+=item *
+
+The C<encoding> pragma now correctly ignores anything following an C<@>
+character in the C<LC_ALL> and C<LANG> environment variables. [RT # 49646]
+
+=item *
+
+A segfault observed with some F<gcc> 3.3 optimisations is resolved.
+
+=item *
+
+A possible segfault when C<unpack> used in scalar context with C<()> groups
+is resolved. [RT #50256]
+
+=item *
+
+Resolved issue where C<$!> could be changed by a signal handler interrupting
+a C<system> call.
+
+=item *
+
+Fixed bug RT #37886, symbolic deferencing was allowed in the argument of
+C<defined> even under the influence of C<use strict 'refs'>.
+
+=item *
+
+Fixed bug RT #43207, where C<lc>/C<uc> inside C<sort> affected the return
+value.
+
+=item *
+
+Fixed bug RT #45607, where C<*{"BONK"} = \&{"BONK"}> didn't work correctly.
+
+=item *
+
+Fixed bug RT #35878, croaking from a XSUB called via C<goto &xsub> corrupts perl
+internals.
+
+=item *
+
+Fixed bug RT #32539, F<DynaLoader.o> is moved into F<libperl.so> to avoid the
+need to statically link DynaLoader into the stub perl executable. With this
+F<libperl.so> provides everything needed to get a functional embedded perl
+interpreter to run.
+
+=item *
+
+Fix bug RT #36267 so that assigning to a tied hash doesn't change the
+underlying hash.
+
+=item *
+
+Fix bug RT #6006, regexp replaces using large replacement variables
+fail some of the time, I<i.e.> when substitution contains something
+like C<${10}> (note the bracket) instead of just C<$10>.
+
+=item *
+
+Fix bug RT #45053, C<Perl_newCONSTSUB()> is now thread safe.
+
+=back
+
+=head2 Platform Specific Fixes
+
+=head3 Darwin / MacOS X
+
+=over 4
+
+=item *
+
+Various improvements to 64 bit builds.
+
+=item *
+
+Mutex protection added in C<PerlIOStdio_close()> to avoid race conditions.
+Hopefully this fixes failures in the threads tests F<free.t> and F<blocks.t>.
+
+=item *
+
+Added forked terminal support to the debugger, with the ability to update the
+window title.
+
+=back
+
+=head3 OS/2
+
+=over 4
+
+=item *
+
+A build problem with specifying C<USE_MULTI> and C<USE_ITHREADS> but without
+C<USE_IMP_SYS> has been fixed.
+
+=item *
+
+C<OS2::REXX> upgraded to version 1.04
+
+=back
+
+=head3 Tru64
+
+=over 4
+
+=item *
+
+Aligned floating point build policies for F<cc> and F<gcc>.
+
+=back
+
+=head3 RedHat Linux
+
+=over 4
+
+=item *
+
+Revisited a patch from 5.6.1 for RH7.2 for Intel's F<icc> [RT #7916], added an
+additional check for C<$Config{gccversion}>.
+
+=back
+
+=head3 Solaris/i386
+
+=over 4
+
+=item *
+
+Use C<-DPTR_IS_LONG> when using 64 bit integers
+
+=back
+
+=head3 VMS
+
+=over 4
+
+=item *
+
+Fixed C<PerlIO::Scalar> in-memory file record-style reads.
+
+=item *
+
+pipe shutdown at process exit should now be more robust.
+
+=item *
+
+Bugs in VMS exit handling tickled by C<Test::Harness> 2.64 have been fixed.
+
+=item *
+
+Fix C<fcntl()> locking capability test in F<configure.com>.
+
+=item *
+
+Replaced C<shrplib='define'> with C<useshrplib='true'> on VMS.
+
+=back
+
+=head3 Windows
+
+=over 4
+
+=item *
+
+C<File::Find> used to fail when the target directory is a bare drive letter and
+C<no_chdir> is 1 (the default is 0). [RT #41555]
+
+=item *
+
+A build problem with specifying C<USE_MULTI> and C<USE_ITHREADS> but without
+C<USE_IMP_SYS> has been fixed.
+
+=item *
+
+The process id is no longer truncated to 16 bits on some Windows platforms
+( http://bugs.activestate.com/show_bug.cgi?id=72443 )
+
+=item *
+
+Fixed bug RT #54828 in F<perlio.c> where calling C<binmode> on Win32 and Cgywin
+may cause a segmentation fault.
+
+=back
+
+=head2 Smaller fixes
+
+=over 4
+
+=item *
+
+It is now possible to overload C<eq> when using C<nomethod>.
+
+=item *
+
+Various problems using C<overload> with 64 bit integers corrected.
+
+=item *
+
+The reference count of C<PerlIO> file descriptors is now correctly handled.
+
+=item *
+
+On VMS, escaped dots will be preserved when converted to UNIX syntax.
+
+=item *
+
+C<keys %+> no longer throws an C<'ambiguous'> warning.
+
+=item *
+
+Using C<#!perl -d> could trigger an assertion, which has been fixed.
+
+=item *
+
+Don't stringify tied code references in C<@INC> when calling C<require>.
+
+=item *
+
+Code references in C<@INC> report the correct file name when C<__FILE__> is
+used.
+
+=item *
+
+Width and precision in sprintf didn't handle characters above 255 correctly.
+[RT #40473]
+
+=item *
+
+List slices with indices out of range now work more consistently.
+[RT #39882]
+
+=item *
+
+A change introduced with perl 5.8.1 broke the parsing of arguments of the form
+C<-foo=bar> with the C<-s> on the <#!> line. This has been fixed. See
+http://bugs.activestate.com/show_bug.cgi?id=43483
+
+=item *
+
+C<tr///> is now threadsafe. Previously it was storing a swash inside its OP,
+rather than in a pad.
+
+=item *
+
+F<pod2html> labels anchors more consistently and handles nested definition
+lists better.
+
+=item *
+
+C<threads> cleanup veto has been extended to include C<perl_free()> and
+C<perl_destruct()>
+
+=item *
+
+On some systems, changes to C<$ENV{TZ}> would not always be
+respected by the underlying calls to C<localtime_r()>. Perl now
+forces the inspection of the environment on these systems.
+
+=item *
+
+The special variable C<$^R> is now more consistently set when executing
+regexps using the C<(?{...})> construct. In particular, it will still
+be set even if backreferences or optional sub-patterns C<(?:...)?> are
+used.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+=head2 panic: sv_chop %s
+
+This new fatal error occurs when the C routine C<Perl_sv_chop()> was passed a
+position that is not within the scalar's string buffer. This is caused by
+buggy XS code, and at this point recovery is not possible.
+
+=head2 Maximal count of pending signals (%s) exceeded
+
+This new fatal error occurs when the perl process has to abort due to
+too many pending signals, which is bound to prevent perl from being
+able to handle further incoming signals safely.
+
+=head2 panic: attempt to call %s in %s
+
+This new fatal error occurs when the ACL version file test operator is used
+where it is not available on the current platform. Earlier checks mean that
+it should never be possible to get this.
+
+=head2 FETCHSIZE returned a negative value
+
+New error indicating that a tied array has claimed to have a negative
+number of elements.
+
+=head2 Can't upgrade %s (%d) to %d
+
+Previously the internal error from the SV upgrade code was the less informative
+I<Can't upgrade that kind of scalar>. It now reports the current internal type,
+and the new type requested.
+
+=head2 %s argument is not a HASH or ARRAY element or a subroutine
+
+This error, thrown if an invalid argument is provided to C<exists> now
+correctly includes "or a subroutine". [RT #38955]
+
+=head2 Cannot make the non-overridable builtin %s fatal
+
+This error in C<Fatal> previously did not show the name of the builtin in
+question (now represented by %s above).
+
+=head2 Unrecognized character '%s' in column %d
+
+This error previously did not state the column.
+
+=head2 Offset outside string
+
+This can now also be generated by a C<seek> on a file handle using
+C<PerlIO::scalar>.
+
+=head2 Invalid escape in the specified encoding in regexp; marked by <-- HERE in m/%s/
+
+New error, introduced as part of the fix to RT #40641 to handle encoding
+of Unicode characters in regular expression comments.
+
+=head2 Your machine doesn't support dump/undump.
+
+A more informative fatal error issued when calling C<dump> on Win32 and
+Cygwin. (Given that the purpose of C<dump> is to abort with a core dump,
+and core dumps can't be produced on these platforms, this is more useful than
+silently exiting.)
+
+=head1 Changed Internals
+
+The perl sources can now be compiled with a C++ compiler instead of a C
+compiler. A necessary implementation details is that under C++, the macro
+C<XS> used to define XSUBs now includes an C<extern "C"> definition. A side
+effect of this is that B<C++> code that used the construction
+
+ typedef XS(SwigPerlWrapper);
+
+now needs to be written
+
+ typedef XSPROTO(SwigPerlWrapper);
+
+using the new C<XSPROTO> macro, in order to compile. C extensions are
+unaffected, although C extensions are encouraged to use C<XSPROTO> too.
+This change was present in the 5.10.0 release of perl, so any actively
+maintained code that happened to use this construction should already have
+been adapted. Code that needs changing will fail with a compilation error.
+
+C<set> magic on localizing/assigning to a magic variable will now only
+trigger for I<container magics>, i.e. it will for C<%ENV> or C<%SIG>
+but not for C<$#array>.
+
+The new API macro C<newSVpvs()> can be used in place of constructions such as
+C<newSVpvn("ISA", 3)>. It takes a single string constant, and at C compile
+time determines its length.
+
+The new API function C<Perl_newSV_type()> can be used as a more efficient
+replacement of the common idiom
+
+ sv = newSV(0);
+ sv_upgrade(sv, type);
+
+Similarly C<Perl_newSVpvn_flags()> can be used to combine
+C<Perl_newSVpv()> with C<Perl_sv_2mortal()> or the equivalent
+C<Perl_sv_newmortal()> with C<Perl_sv_setpvn()>
+
+Two new macros C<mPUSHs()> and C<mXPUSHs()> are added, to make it easier to
+push mortal SVs onto the stack. They were then used to fix several bugs where
+values on the stack had not been mortalised.
+
+A C<Perl_signbit()> function was added to test the sign of an C<NV>. It
+maps to the system one when available.
+
+C<Perl_av_reify()>, C<Perl_lex_end()>, C<Perl_mod()>, C<Perl_op_clear()>,
+C<Perl_pop_return()>, C<Perl_qerror()>, C<Perl_setdefout()>,
+C<Perl_vivify_defelem()> and C<Perl_yylex()> are now visible to extensions.
+This was required to allow C<Data::Alias> to work on Windows.
+
+C<Perl_find_runcv()> is now visible to perl core extensions. This was required
+to allow C<Sub::Current> to work on Windows.
+
+C<ptr_table*> functions are now available in unthreaded perl. C<Storable>
+takes advantage of this.
+
+There have been many small cleanups made to the internals. In particular,
+C<Perl_sv_upgrade()> has been simplified considerably, with a straight-through
+code path that uses C<memset()> and C<memcpy()> to initialise the new body,
+rather than assignment via multiple temporary variables. It has also
+benefited from simplification and de-duplication of the arena management
+code.
+
+A lot of small improvements in the code base were made due to reports from
+the Coverity static code analyzer.
+
+Corrected use and documentation of C<Perl_gv_stashpv()>, C<Perl_gv_stashpvn()>,
+C<Perl_gv_stashsv()> functions (last parameter is a bitmask, not boolean).
+
+C<PERL_SYS_INIT>, C<PERL_SYS_INIT3> and C<PERL_SYS_TERM> macros have been
+changed into functions.
+
+C<PERLSYS_TERM> no longer requires a context. C<PerlIO_teardown()>
+is now called without a context, and debugging output in this function has
+been disabled because that required that an interpreter was present, an invalid
+assumption at termination time.
+
+All compile time options which affect binary compatibility have been grouped
+together into a global variable (C<PL_bincompat_options>).
+
+The values of C<PERL_REVISION>, C<PERL_VERSION> and C<PERL_SUBVERSION> are
+now baked into global variables (and hence into any shared perl library).
+Additionally under C<MULTIPLICITY>, the perl executable now records the size of
+the interpreter structure (total, and for this version). Coupled with
+C<PL_bincompat_options> this will allow 5.8.10 (and later), when compiled with a
+shared perl library, to perform sanity checks in C<main()> to verify that the
+shared library is indeed binary compatible.
+
+Symbolic references can now have embedded NULs. The new public function
+C<Perl_get_cvn_flags()> can be used in extensions if you have to handle them.
+
+=head2 Macro cleanups
+
+The core code, and XS code in F<ext> that is not dual-lived on CPAN, no longer
+uses the macros C<PL_na>, C<NEWSV()>, C<Null()>, C<Nullav>, C<Nullcv>,
+C<Nullhv>, C<Nullhv> I<etc>. Their use is discouraged in new code,
+particularly C<PL_na>, which is a small performance hit.
+
+=head1 New Tests
+
+Many modules updated from CPAN incorporate new tests. Some core specific
+tests have been added:
+
+=over 4
+
+=item ext/DynaLoader/t/DynaLoader.t
+
+Tests for the C<DynaLoader> module.
+
+=item t/comp/fold.t
+
+Tests for compile-time constant folding.
+
+=item t/io/pvbm.t
+
+Tests incorporated from 5.10.0 which check that there is no unexpected
+interaction between the internal types C<PVBM> and C<PVGV>.
+
+=item t/lib/proxy_constant_subs.t
+
+Tests for the new form of constant subroutines.
+
+=item t/op/attrhand.t
+
+Tests for C<Attribute::Handlers>.
+
+=item t/op/dbm.t
+
+Tests for C<dbmopen>.
+
+=item t/op/inccode-tie.t
+
+Calls all tests in F<t/op/inccode.t> after first tying C<@INC>.
+
+=item t/op/incfilter.t
+
+Tests for for source filters returned from code references in C<@INC>.
+
+=item t/op/kill0.t
+
+Tests for RT #30970.
+
+=item t/op/qrstack.t
+
+Tests for RT #41484.
+
+=item t/op/qr.t
+
+Tests for the C<qr//> construct.
+
+=item t/op/regexp_qr_embed.t
+
+Tests for the C<qr//> construct within another regexp.
+
+=item t/op/regexp_qr.t
+
+Tests for the C<qr//> construct.
+
+=item t/op/rxcode.t
+
+Tests for RT #32840.
+
+=item t/op/studytied.t
+
+Tests for C<study> on tied scalars.
+
+=item t/op/substT.t
+
+Tests for C<subst> run under C<-T> mode.
+
+=item t/op/symbolcache.t
+
+Tests for C<undef> and C<delete> on stash entries that are bound to
+subroutines or methods.
+
+=item t/op/upgrade.t
+
+Tests for C<Perl_sv_upgrade()>.
+
+=item t/mro/package_aliases.t
+
+MRO tests for C<isa> and package aliases.
+
+=item t/pod/twice.t
+
+Tests for calling C<Pod::Parser> twice.
+
+=item t/run/cloexec.t
+
+Tests for inheriting file descriptors across C<exec> (close-on-exec).
+
+=item t/uni/cache.t
+
+Tests for the UTF-8 caching code.
+
+=item t/uni/chr.t
+
+Test that strange encodings do not upset C<Perl_pp_chr()>.
+
+=item t/uni/greek.t
+
+Tests for RT #40641.
+
+=item t/uni/latin2.t
+
+Tests for RT #40641.
+
+=item t/uni/overload.t
+
+Tests for returning Unicode from overloaded values.
+
+=item t/uni/tie.t
+
+Tests for returning Unicode from tied variables.
+
+=back
+
+=head1 Known Problems
+
+There are no known new bugs.
+
+However, programs that rely on bugs that have been fixed will have problems.
+Also, many bug fixes present in 5.10.0 can't be back-ported to the 5.8.x
+branch, because they require changes that are binary incompatible, or because
+the code changes are too large and hence too risky to incorporate.
+
+We have only limited volunteer labour, and the maintenance burden is
+getting increasingly complex. Hence this will be the last significant
+release of the 5.8.x series. Any future releases of 5.8.x will likely
+only be to deal with security issues, and platform build
+failures. Hence you should look to migrating to 5.10.x, if you have
+not started already. Alternatively, if business requirements constrain
+you to continue to use 5.8.x, you may wish to consider commercial
+support from firms such as ActiveState.
+
+=head1 Platform Specific Notes
+
+=head2 Win32
+
+C<readdir()>, C<cwd()>, C<$^X> and C<@INC> now use the alternate (short)
+filename if the long name is outside the current codepage (Jan Dubois).
+
+=head3 Updated Modules
+
+=over 4
+
+=item *
+
+C<Win32> upgraded to version 0.38. Now has a documented 'WinVista' response
+from C<GetOSName> and support for Vista's privilege elevation in C<IsAdminUser>.
+Support for Unicode characters in path names. Improved cygwin and Win64
+compatibility.
+
+=item *
+
+C<Win32API> updated to 0.1001_01
+
+=item *
+
+C<killpg()> support added to C<MSWin32> (Jan Dubois).
+
+=item *
+
+C<File::Spec::Win32> upgraded to version 3.2701
+
+=back
+
+=head2 OS/2
+
+=head3 Updated Modules
+
+=over 4
+
+=item *
+
+C<OS2::Process> upgraded to 1.03
+
+Ilya Zakharevich has added and documented several C<Window*> and C<Clipbrd*>
+functions.
+
+=item *
+
+C<OS2::REXX::DLL>, C<OS2::REXX> updated to version 1.03
+
+=back
+
+=head2 VMS
+
+=head3 Updated Modules
+
+=over 4
+
+=item *
+
+C<DCLsym> upgraded to version 1.03
+
+=item *
+
+C<Stdio> upgraded to version 2.4
+
+=item *
+
+C<VMS::XSSymSet> upgraded to 1.1.
+
+=back
+
+=head1 Obituary
+
+Nick Ing-Simmons, long time Perl hacker, author of the C<Tk> and C<Encode>
+modules, F<perlio.c> in the core, and 5.003_02 pumpking, died of a heart
+attack on 25th September 2006. He will be missed.
+
+=head1 Acknowledgements
+
+Some of the work in this release was funded by a TPF grant.
+
+Steve Hay worked behind the scenes working out the causes of the differences
+between core modules, their CPAN releases, and previous core releases, and
+the best way to rectify them. He doesn't want to do it again. I know this
+feeling, and I'm very glad he did it this time, instead of me.
+
+Paul Fenwick assembled a team of 18 volunteers, who broke the back of writing
+this document. In particular, Bradley Dean, Eddy Tan, and Vincent Pit
+provided half the team's contribution.
+
+Schwern verified the list of updated module versions, correcting quite a few
+errors that I (and everyone else) had missed, both wrongly stated module
+versions, and changed modules that had not been listed.
+
+The crack Berlin-based QA team of Andreas KE<ouml>nig and Slaven Rezic
+tirelessly re-built snapshots, tested most everything CPAN against
+them, and then identified the changes responsible for any module regressions,
+ensuring that several show-stopper bugs were stomped before the first release
+candidate was cut.
+
+The other core committers contributed most of the changes, and applied most
+of the patches sent in by the hundreds of contributors listed in F<AUTHORS>.
+
+And obviously, Larry Wall, without whom we wouldn't have Perl.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org. There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team. You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+If the bug you are reporting has security implications, which make it
+inappropriate to send to a publicly archived mailing list, then please send
+it to perl5-security-report@perl.org. This points to a closed subscription
+unarchived mailing list, which includes all the core committers, who be able
+to help assess the impact of issues, figure out a resolution, and help
+co-ordinate the release of patches to mitigate or fix the problem across all
+platforms on which Perl is supported. Please only use this address for security
+issues in the Perl core, not for modules independently distributed on CPAN.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl58delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl58delta.pod
new file mode 100755
index 00000000000..6bfdfb670b9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl58delta.pod
@@ -0,0 +1,3746 @@
+=head1 NAME
+
+perl58delta - what is new for perl v5.8.0
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.6.0 release and
+the 5.8.0 release.
+
+Many of the bug fixes in 5.8.0 were already seen in the 5.6.1
+maintenance release since the two releases were kept closely
+coordinated (while 5.8.0 was still called 5.7.something).
+
+Changes that were integrated into the 5.6.1 release are marked C<[561]>.
+Many of these changes have been further developed since 5.6.1 was released,
+those are marked C<[561+]>.
+
+You can see the list of changes in the 5.6.1 release (both from the
+5.005_03 release and the 5.6.0 release) by reading L<perl561delta>.
+
+=head1 Highlights In 5.8.0
+
+=over 4
+
+=item *
+
+Better Unicode support
+
+=item *
+
+New IO Implementation
+
+=item *
+
+New Thread Implementation
+
+=item *
+
+Better Numeric Accuracy
+
+=item *
+
+Safe Signals
+
+=item *
+
+Many New Modules
+
+=item *
+
+More Extensive Regression Testing
+
+=back
+
+=head1 Incompatible Changes
+
+=head2 Binary Incompatibility
+
+B<Perl 5.8 is not binary compatible with earlier releases of Perl.>
+
+B<You have to recompile your XS modules.>
+
+(Pure Perl modules should continue to work.)
+
+The major reason for the discontinuity is the new IO architecture
+called PerlIO. PerlIO is the default configuration because without
+it many new features of Perl 5.8 cannot be used. In other words:
+you just have to recompile your modules containing XS code, sorry
+about that.
+
+In future releases of Perl, non-PerlIO aware XS modules may become
+completely unsupported. This shouldn't be too difficult for module
+authors, however: PerlIO has been designed as a drop-in replacement
+(at the source code level) for the stdio interface.
+
+Depending on your platform, there are also other reasons why
+we decided to break binary compatibility, please read on.
+
+=head2 64-bit platforms and malloc
+
+If your pointers are 64 bits wide, the Perl malloc is no longer being
+used because it does not work well with 8-byte pointers. Also,
+usually the system mallocs on such platforms are much better optimized
+for such large memory models than the Perl malloc. Some memory-hungry
+Perl applications like the PDL don't work well with Perl's malloc.
+Finally, other applications than Perl (such as mod_perl) tend to prefer
+the system malloc. Such platforms include Alpha and 64-bit HPPA,
+MIPS, PPC, and Sparc.
+
+=head2 AIX Dynaloading
+
+The AIX dynaloading now uses in AIX releases 4.3 and newer the native
+dlopen interface of AIX instead of the old emulated interface. This
+change will probably break backward compatibility with compiled
+modules. The change was made to make Perl more compliant with other
+applications like mod_perl which are using the AIX native interface.
+
+=head2 Attributes for C<my> variables now handled at run-time
+
+The C<my EXPR : ATTRS> syntax now applies variable attributes at
+run-time. (Subroutine and C<our> variables still get attributes applied
+at compile-time.) See L<attributes> for additional details. In particular,
+however, this allows variable attributes to be useful for C<tie> interfaces,
+which was a deficiency of earlier releases. Note that the new semantics
+doesn't work with the Attribute::Handlers module (as of version 0.76).
+
+=head2 Socket Extension Dynamic in VMS
+
+The Socket extension is now dynamically loaded instead of being
+statically built in. This may or may not be a problem with ancient
+TCP/IP stacks of VMS: we do not know since we weren't able to test
+Perl in such configurations.
+
+=head2 IEEE-format Floating Point Default on OpenVMS Alpha
+
+Perl now uses IEEE format (T_FLOAT) as the default internal floating
+point format on OpenVMS Alpha, potentially breaking binary compatibility
+with external libraries or existing data. G_FLOAT is still available as
+a configuration option. The default on VAX (D_FLOAT) has not changed.
+
+=head2 New Unicode Semantics (no more C<use utf8>, almost)
+
+Previously in Perl 5.6 to use Unicode one would say "use utf8" and
+then the operations (like string concatenation) were Unicode-aware
+in that lexical scope.
+
+This was found to be an inconvenient interface, and in Perl 5.8 the
+Unicode model has completely changed: now the "Unicodeness" is bound
+to the data itself, and for most of the time "use utf8" is not needed
+at all. The only remaining use of "use utf8" is when the Perl script
+itself has been written in the UTF-8 encoding of Unicode. (UTF-8 has
+not been made the default since there are many Perl scripts out there
+that are using various national eight-bit character sets, which would
+be illegal in UTF-8.)
+
+See L<perluniintro> for the explanation of the current model,
+and L<utf8> for the current use of the utf8 pragma.
+
+=head2 New Unicode Properties
+
+Unicode I<scripts> are now supported. Scripts are similar to (and superior
+to) Unicode I<blocks>. The difference between scripts and blocks is that
+scripts are the glyphs used by a language or a group of languages, while
+the blocks are more artificial groupings of (mostly) 256 characters based
+on the Unicode numbering.
+
+In general, scripts are more inclusive, but not universally so. For
+example, while the script C<Latin> includes all the Latin characters and
+their various diacritic-adorned versions, it does not include the various
+punctuation or digits (since they are not solely C<Latin>).
+
+A number of other properties are now supported, including C<\p{L&}>,
+C<\p{Any}> C<\p{Assigned}>, C<\p{Unassigned}>, C<\p{Blank}> [561] and
+C<\p{SpacePerl}> [561] (along with their C<\P{...}> versions, of course).
+See L<perlunicode> for details, and more additions.
+
+The C<In> or C<Is> prefix to names used with the C<\p{...}> and C<\P{...}>
+are now almost always optional. The only exception is that a C<In> prefix
+is required to signify a Unicode block when a block name conflicts with a
+script name. For example, C<\p{Tibetan}> refers to the script, while
+C<\p{InTibetan}> refers to the block. When there is no name conflict, you
+can omit the C<In> from the block name (e.g. C<\p{BraillePatterns}>), but
+to be safe, it's probably best to always use the C<In>).
+
+=head2 REF(...) Instead Of SCALAR(...)
+
+A reference to a reference now stringifies as "REF(0x81485ec)" instead
+of "SCALAR(0x81485ec)" in order to be more consistent with the return
+value of ref().
+
+=head2 pack/unpack D/F recycled
+
+The undocumented pack/unpack template letters D/F have been recycled
+for better use: now they stand for long double (if supported by the
+platform) and NV (Perl internal floating point type). (They used
+to be aliases for d/f, but you never knew that.)
+
+=head2 glob() now returns filenames in alphabetical order
+
+The list of filenames from glob() (or <...>) is now by default sorted
+alphabetically to be csh-compliant (which is what happened before
+in most UNIX platforms). (bsd_glob() does still sort platform
+natively, ASCII or EBCDIC, unless GLOB_ALPHASORT is specified.) [561]
+
+=head2 Deprecations
+
+=over 4
+
+=item *
+
+The semantics of bless(REF, REF) were unclear and until someone proves
+it to make some sense, it is forbidden.
+
+=item *
+
+The obsolete chat2 library that should never have been allowed
+to escape the laboratory has been decommissioned.
+
+=item *
+
+Using chdir("") or chdir(undef) instead of explicit chdir() is
+doubtful. A failure (think chdir(some_function()) can lead into
+unintended chdir() to the home directory, therefore this behaviour
+is deprecated.
+
+=item *
+
+The builtin dump() function has probably outlived most of its
+usefulness. The core-dumping functionality will remain in future
+available as an explicit call to C<CORE::dump()>, but in future
+releases the behaviour of an unqualified C<dump()> call may change.
+
+=item *
+
+The very dusty examples in the eg/ directory have been removed.
+Suggestions for new shiny examples welcome but the main issue is that
+the examples need to be documented, tested and (most importantly)
+maintained.
+
+=item *
+
+The (bogus) escape sequences \8 and \9 now give an optional warning
+("Unrecognized escape passed through"). There is no need to \-escape
+any C<\w> character.
+
+=item *
+
+The *glob{FILEHANDLE} is deprecated, use *glob{IO} instead.
+
+=item *
+
+The C<package;> syntax (C<package> without an argument) has been
+deprecated. Its semantics were never that clear and its
+implementation even less so. If you have used that feature to
+disallow all but fully qualified variables, C<use strict;> instead.
+
+=item *
+
+The unimplemented POSIX regex features [[.cc.]] and [[=c=]] are still
+recognised but now cause fatal errors. The previous behaviour of
+ignoring them by default and warning if requested was unacceptable
+since it, in a way, falsely promised that the features could be used.
+
+=item *
+
+In future releases, non-PerlIO aware XS modules may become completely
+unsupported. Since PerlIO is a drop-in replacement for stdio at the
+source code level, this shouldn't be that drastic a change.
+
+=item *
+
+Previous versions of perl and some readings of some sections of Camel
+III implied that the C<:raw> "discipline" was the inverse of C<:crlf>.
+Turning off "clrfness" is no longer enough to make a stream truly
+binary. So the PerlIO C<:raw> layer (or "discipline", to use the Camel
+book's older terminology) is now formally defined as being equivalent
+to binmode(FH) - which is in turn defined as doing whatever is
+necessary to pass each byte as-is without any translation. In
+particular binmode(FH) - and hence C<:raw> - will now turn off both
+CRLF and UTF-8 translation and remove other layers (e.g. :encoding())
+which would modify byte stream.
+
+=item *
+
+The current user-visible implementation of pseudo-hashes (the weird
+use of the first array element) is deprecated starting from Perl 5.8.0
+and will be removed in Perl 5.10.0, and the feature will be
+implemented differently. Not only is the current interface rather
+ugly, but the current implementation slows down normal array and hash
+use quite noticeably. The C<fields> pragma interface will remain
+available. The I<restricted hashes> interface is expected to
+be the replacement interface (see L<Hash::Util>). If your existing
+programs depends on the underlying implementation, consider using
+L<Class::PseudoHash> from CPAN.
+
+=item *
+
+The syntaxes C<< @a->[...] >> and C<< %h->{...} >> have now been deprecated.
+
+=item *
+
+After years of trying, suidperl is considered to be too complex to
+ever be considered truly secure. The suidperl functionality is likely
+to be removed in a future release.
+
+=item *
+
+The 5.005 threads model (module C<Thread>) is deprecated and expected
+to be removed in Perl 5.10. Multithreaded code should be migrated to
+the new ithreads model (see L<threads>, L<threads::shared> and
+L<perlthrtut>).
+
+=item *
+
+The long deprecated uppercase aliases for the string comparison
+operators (EQ, NE, LT, LE, GE, GT) have now been removed.
+
+=item *
+
+The tr///C and tr///U features have been removed and will not return;
+the interface was a mistake. Sorry about that. For similar
+functionality, see pack('U0', ...) and pack('C0', ...). [561]
+
+=item *
+
+Earlier Perls treated "sub foo (@bar)" as equivalent to "sub foo (@)".
+The prototypes are now checked better at compile-time for invalid
+syntax. An optional warning is generated ("Illegal character in
+prototype...") but this may be upgraded to a fatal error in a future
+release.
+
+=item *
+
+The C<exec LIST> and C<system LIST> operations now produce warnings on
+tainted data and in some future release they will produce fatal errors.
+
+=item *
+
+The existing behaviour when localising tied arrays and hashes is wrong,
+and will be changed in a future release, so do not rely on the existing
+behaviour. See L<"Localising Tied Arrays and Hashes Is Broken">.
+
+=back
+
+=head1 Core Enhancements
+
+=head2 Unicode Overhaul
+
+Unicode in general should be now much more usable than in Perl 5.6.0
+(or even in 5.6.1). Unicode can be used in hash keys, Unicode in
+regular expressions should work now, Unicode in tr/// should work now,
+Unicode in I/O should work now. See L<perluniintro> for introduction
+and L<perlunicode> for details.
+
+=over 4
+
+=item *
+
+The Unicode Character Database coming with Perl has been upgraded
+to Unicode 3.2.0. For more information, see http://www.unicode.org/ .
+[561+] (5.6.1 has UCD 3.0.1.)
+
+=item *
+
+For developers interested in enhancing Perl's Unicode capabilities:
+almost all the UCD files are included with the Perl distribution in
+the F<lib/unicore> subdirectory. The most notable omission, for space
+considerations, is the Unihan database.
+
+=item *
+
+The properties \p{Blank} and \p{SpacePerl} have been added. "Blank" is like
+C isblank(), that is, it contains only "horizontal whitespace" (the space
+character is, the newline isn't), and the "SpacePerl" is the Unicode
+equivalent of C<\s> (\p{Space} isn't, since that includes the vertical
+tabulator character, whereas C<\s> doesn't.)
+
+See "New Unicode Properties" earlier in this document for additional
+information on changes with Unicode properties.
+
+=back
+
+=head2 PerlIO is Now The Default
+
+=over 4
+
+=item *
+
+IO is now by default done via PerlIO rather than system's "stdio".
+PerlIO allows "layers" to be "pushed" onto a file handle to alter the
+handle's behaviour. Layers can be specified at open time via 3-arg
+form of open:
+
+ open($fh,'>:crlf :utf8', $path) || ...
+
+or on already opened handles via extended C<binmode>:
+
+ binmode($fh,':encoding(iso-8859-7)');
+
+The built-in layers are: unix (low level read/write), stdio (as in
+previous Perls), perlio (re-implementation of stdio buffering in a
+portable manner), crlf (does CRLF <=> "\n" translation as on Win32,
+but available on any platform). A mmap layer may be available if
+platform supports it (mostly UNIXes).
+
+Layers to be applied by default may be specified via the 'open' pragma.
+
+See L</"Installation and Configuration Improvements"> for the effects
+of PerlIO on your architecture name.
+
+=item *
+
+If your platform supports fork(), you can use the list form of C<open>
+for pipes. For example:
+
+ open KID_PS, "-|", "ps", "aux" or die $!;
+
+forks the ps(1) command (without spawning a shell, as there are more
+than three arguments to open()), and reads its standard output via the
+C<KID_PS> filehandle. See L<perlipc>.
+
+=item *
+
+File handles can be marked as accepting Perl's internal encoding of Unicode
+(UTF-8 or UTF-EBCDIC depending on platform) by a pseudo layer ":utf8" :
+
+ open($fh,">:utf8","Uni.txt");
+
+Note for EBCDIC users: the pseudo layer ":utf8" is erroneously named
+for you since it's not UTF-8 what you will be getting but instead
+UTF-EBCDIC. See L<perlunicode>, L<utf8>, and
+http://www.unicode.org/unicode/reports/tr16/ for more information.
+In future releases this naming may change. See L<perluniintro>
+for more information about UTF-8.
+
+=item *
+
+If your environment variables (LC_ALL, LC_CTYPE, LANG) look like you
+want to use UTF-8 (any of the variables match C</utf-?8/i>), your
+STDIN, STDOUT, STDERR handles and the default open layer (see L<open>)
+are marked as UTF-8. (This feature, like other new features that
+combine Unicode and I/O, work only if you are using PerlIO, but that's
+the default.)
+
+Note that after this Perl really does assume that everything is UTF-8:
+for example if some input handle is not, Perl will probably very soon
+complain about the input data like this "Malformed UTF-8 ..." since
+any old eight-bit data is not legal UTF-8.
+
+Note for code authors: if you want to enable your users to use UTF-8
+as their default encoding but in your code still have eight-bit I/O streams
+(such as images or zip files), you need to explicitly open() or binmode()
+with C<:bytes> (see L<perlfunc/open> and L<perlfunc/binmode>), or you
+can just use C<binmode(FH)> (nice for pre-5.8.0 backward compatibility).
+
+=item *
+
+File handles can translate character encodings from/to Perl's internal
+Unicode form on read/write via the ":encoding()" layer.
+
+=item *
+
+File handles can be opened to "in memory" files held in Perl scalars via:
+
+ open($fh,'>', \$variable) || ...
+
+=item *
+
+Anonymous temporary files are available without need to
+'use FileHandle' or other module via
+
+ open($fh,"+>", undef) || ...
+
+That is a literal undef, not an undefined value.
+
+=back
+
+=head2 ithreads
+
+The new interpreter threads ("ithreads" for short) implementation of
+multithreading, by Arthur Bergman, replaces the old "5.005 threads"
+implementation. In the ithreads model any data sharing between
+threads must be explicit, as opposed to the model where data sharing
+was implicit. See L<threads> and L<threads::shared>, and
+L<perlthrtut>.
+
+As a part of the ithreads implementation Perl will also use
+any necessary and detectable reentrant libc interfaces.
+
+=head2 Restricted Hashes
+
+A restricted hash is restricted to a certain set of keys, no keys
+outside the set can be added. Also individual keys can be restricted
+so that the key cannot be deleted and the value cannot be changed.
+No new syntax is involved: the Hash::Util module is the interface.
+
+=head2 Safe Signals
+
+Perl used to be fragile in that signals arriving at inopportune moments
+could corrupt Perl's internal state. Now Perl postpones handling of
+signals until it's safe (between opcodes).
+
+This change may have surprising side effects because signals no longer
+interrupt Perl instantly. Perl will now first finish whatever it was
+doing, like finishing an internal operation (like sort()) or an
+external operation (like an I/O operation), and only then look at any
+arrived signals (and before starting the next operation). No more corrupt
+internal state since the current operation is always finished first,
+but the signal may take more time to get heard. Note that breaking
+out from potentially blocking operations should still work, though.
+
+=head2 Understanding of Numbers
+
+In general a lot of fixing has happened in the area of Perl's
+understanding of numbers, both integer and floating point. Since in
+many systems the standard number parsing functions like C<strtoul()>
+and C<atof()> seem to have bugs, Perl tries to work around their
+deficiencies. This results hopefully in more accurate numbers.
+
+Perl now tries internally to use integer values in numeric conversions
+and basic arithmetics (+ - * /) if the arguments are integers, and
+tries also to keep the results stored internally as integers.
+This change leads to often slightly faster and always less lossy
+arithmetics. (Previously Perl always preferred floating point numbers
+in its math.)
+
+=head2 Arrays now always interpolate into double-quoted strings [561]
+
+In double-quoted strings, arrays now interpolate, no matter what. The
+behavior in earlier versions of perl 5 was that arrays would interpolate
+into strings if the array had been mentioned before the string was
+compiled, and otherwise Perl would raise a fatal compile-time error.
+In versions 5.000 through 5.003, the error was
+
+ Literal @example now requires backslash
+
+In versions 5.004_01 through 5.6.0, the error was
+
+ In string, @example now must be written as \@example
+
+The idea here was to get people into the habit of writing
+C<"fred\@example.com"> when they wanted a literal C<@> sign, just as
+they have always written C<"Give me back my \$5"> when they wanted a
+literal C<$> sign.
+
+Starting with 5.6.1, when Perl now sees an C<@> sign in a
+double-quoted string, it I<always> attempts to interpolate an array,
+regardless of whether or not the array has been used or declared
+already. The fatal error has been downgraded to an optional warning:
+
+ Possible unintended interpolation of @example in string
+
+This warns you that C<"fred@example.com"> is going to turn into
+C<fred.com> if you don't backslash the C<@>.
+See http://www.plover.com/~mjd/perl/at-error.html for more details
+about the history here.
+
+=head2 Miscellaneous Changes
+
+=over 4
+
+=item *
+
+AUTOLOAD is now lvaluable, meaning that you can add the :lvalue attribute
+to AUTOLOAD subroutines and you can assign to the AUTOLOAD return value.
+
+=item *
+
+The $Config{byteorder} (and corresponding BYTEORDER in config.h) was
+previously wrong in platforms if sizeof(long) was 4, but sizeof(IV)
+was 8. The byteorder was only sizeof(long) bytes long (1234 or 4321),
+but now it is correctly sizeof(IV) bytes long, (12345678 or 87654321).
+(This problem didn't affect Windows platforms.)
+
+Also, $Config{byteorder} is now computed dynamically--this is more
+robust with "fat binaries" where an executable image contains binaries
+for more than one binary platform, and when cross-compiling.
+
+=item *
+
+C<perl -d:Module=arg,arg,arg> now works (previously one couldn't pass
+in multiple arguments.)
+
+=item *
+
+C<do> followed by a bareword now ensures that this bareword isn't
+a keyword (to avoid a bug where C<do q(foo.pl)> tried to call a
+subroutine called C<q>). This means that for example instead of
+C<do format()> you must write C<do &format()>.
+
+=item *
+
+The builtin dump() now gives an optional warning
+C<dump() better written as CORE::dump()>,
+meaning that by default C<dump(...)> is resolved as the builtin
+dump() which dumps core and aborts, not as (possibly) user-defined
+C<sub dump>. To call the latter, qualify the call as C<&dump(...)>.
+(The whole dump() feature is to considered deprecated, and possibly
+removed/changed in future releases.)
+
+=item *
+
+chomp() and chop() are now overridable. Note, however, that their
+prototype (as given by C<prototype("CORE::chomp")> is undefined,
+because it cannot be expressed and therefore one cannot really write
+replacements to override these builtins.
+
+=item *
+
+END blocks are now run even if you exit/die in a BEGIN block.
+Internally, the execution of END blocks is now controlled by
+PL_exit_flags & PERL_EXIT_DESTRUCT_END. This enables the new
+behaviour for Perl embedders. This will default in 5.10. See
+L<perlembed>.
+
+=item *
+
+Formats now support zero-padded decimal fields.
+
+=item *
+
+Although "you shouldn't do that", it was possible to write code that
+depends on Perl's hashed key order (Data::Dumper does this). The new
+algorithm "One-at-a-Time" produces a different hashed key order.
+More details are in L</"Performance Enhancements">.
+
+=item *
+
+lstat(FILEHANDLE) now gives a warning because the operation makes no sense.
+In future releases this may become a fatal error.
+
+=item *
+
+Spurious syntax errors generated in certain situations, when glob()
+caused File::Glob to be loaded for the first time, have been fixed. [561]
+
+=item *
+
+Lvalue subroutines can now return C<undef> in list context. However,
+the lvalue subroutine feature still remains experimental. [561+]
+
+=item *
+
+A lost warning "Can't declare ... dereference in my" has been
+restored (Perl had it earlier but it became lost in later releases.)
+
+=item *
+
+A new special regular expression variable has been introduced:
+C<$^N>, which contains the most-recently closed group (submatch).
+
+=item *
+
+C<no Module;> does not produce an error even if Module does not have an
+unimport() method. This parallels the behavior of C<use> vis-a-vis
+C<import>. [561]
+
+=item *
+
+The numerical comparison operators return C<undef> if either operand
+is a NaN. Previously the behaviour was unspecified.
+
+=item *
+
+C<our> can now have an experimental optional attribute C<unique> that
+affects how global variables are shared among multiple interpreters,
+see L<perlfunc/our>.
+
+=item *
+
+The following builtin functions are now overridable: each(), keys(),
+pop(), push(), shift(), splice(), unshift(). [561]
+
+=item *
+
+C<pack() / unpack()> can now group template letters with C<()> and then
+apply repetition/count modifiers on the groups.
+
+=item *
+
+C<pack() / unpack()> can now process the Perl internal numeric types:
+IVs, UVs, NVs-- and also long doubles, if supported by the platform.
+The template letters are C<j>, C<J>, C<F>, and C<D>.
+
+=item *
+
+C<pack('U0a*', ...)> can now be used to force a string to UTF-8.
+
+=item *
+
+my __PACKAGE__ $obj now works. [561]
+
+=item *
+
+POSIX::sleep() now returns the number of I<unslept> seconds
+(as the POSIX standard says), as opposed to CORE::sleep() which
+returns the number of slept seconds.
+
+=item *
+
+printf() and sprintf() now support parameter reordering using the
+C<%\d+\$> and C<*\d+\$> syntaxes. For example
+
+ printf "%2\$s %1\$s\n", "foo", "bar";
+
+will print "bar foo\n". This feature helps in writing
+internationalised software, and in general when the order
+of the parameters can vary.
+
+=item *
+
+The (\&) prototype now works properly. [561]
+
+=item *
+
+prototype(\[$@%&]) is now available to implicitly create references
+(useful for example if you want to emulate the tie() interface).
+
+=item *
+
+A new command-line option, C<-t> is available. It is the
+little brother of C<-T>: instead of dying on taint violations,
+lexical warnings are given. B<This is only meant as a temporary
+debugging aid while securing the code of old legacy applications.
+This is not a substitute for -T.>
+
+=item *
+
+In other taint news, the C<exec LIST> and C<system LIST> have now been
+considered too risky (think C<exec @ARGV>: it can start any program
+with any arguments), and now the said forms cause a warning under
+lexical warnings. You should carefully launder the arguments to
+guarantee their validity. In future releases of Perl the forms will
+become fatal errors so consider starting laundering now.
+
+=item *
+
+Tied hash interfaces are now required to have the EXISTS and DELETE
+methods (either own or inherited).
+
+=item *
+
+If tr/// is just counting characters, it doesn't attempt to
+modify its target.
+
+=item *
+
+untie() will now call an UNTIE() hook if it exists. See L<perltie>
+for details. [561]
+
+=item *
+
+L<utime> now supports C<utime undef, undef, @files> to change the
+file timestamps to the current time.
+
+=item *
+
+The rules for allowing underscores (underbars) in numeric constants
+have been relaxed and simplified: now you can have an underscore
+simply B<between digits>.
+
+=item *
+
+Rather than relying on C's argv[0] (which may not contain a full pathname)
+where possible $^X is now set by asking the operating system.
+(eg by reading F</proc/self/exe> on Linux, F</proc/curproc/file> on FreeBSD)
+
+=item *
+
+A new variable, C<${^TAINT}>, indicates whether taint mode is enabled.
+
+=item *
+
+You can now override the readline() builtin, and this overrides also
+the <FILEHANDLE> angle bracket operator.
+
+=item *
+
+The command-line options -s and -F are now recognized on the shebang
+(#!) line.
+
+=item *
+
+Use of the C</c> match modifier without an accompanying C</g> modifier
+elicits a new warning: C<Use of /c modifier is meaningless without /g>.
+
+Use of C</c> in substitutions, even with C</g>, elicits
+C<Use of /c modifier is meaningless in s///>.
+
+Use of C</g> with C<split> elicits C<Use of /g modifier is meaningless
+in split>.
+
+=item *
+
+Support for the C<CLONE> special subroutine had been added.
+With ithreads, when a new thread is created, all Perl data is cloned,
+however non-Perl data cannot be cloned automatically. In C<CLONE> you
+can do whatever you need to do, like for example handle the cloning of
+non-Perl data, if necessary. C<CLONE> will be executed once for every
+package that has it defined or inherited. It will be called in the
+context of the new thread, so all modifications are made in the new area.
+
+See L<perlmod>
+
+=back
+
+=head1 Modules and Pragmata
+
+=head2 New Modules and Pragmata
+
+=over 4
+
+=item *
+
+C<Attribute::Handlers>, originally by Damian Conway and now maintained
+by Arthur Bergman, allows a class to define attribute handlers.
+
+ package MyPack;
+ use Attribute::Handlers;
+ sub Wolf :ATTR(SCALAR) { print "howl!\n" }
+
+ # later, in some package using or inheriting from MyPack...
+
+ my MyPack $Fluffy : Wolf; # the attribute handler Wolf will be called
+
+Both variables and routines can have attribute handlers. Handlers can
+be specific to type (SCALAR, ARRAY, HASH, or CODE), or specific to the
+exact compilation phase (BEGIN, CHECK, INIT, or END).
+See L<Attribute::Handlers>.
+
+=item *
+
+C<B::Concise>, by Stephen McCamant, is a new compiler backend for
+walking the Perl syntax tree, printing concise info about ops.
+The output is highly customisable. See L<B::Concise>. [561+]
+
+=item *
+
+The new bignum, bigint, and bigrat pragmas, by Tels, implement
+transparent bignum support (using the Math::BigInt, Math::BigFloat,
+and Math::BigRat backends).
+
+=item *
+
+C<Class::ISA>, by Sean Burke, is a module for reporting the search
+path for a class's ISA tree. See L<Class::ISA>.
+
+=item *
+
+C<Cwd> now has a split personality: if possible, an XS extension is
+used, (this will hopefully be faster, more secure, and more robust)
+but if not possible, the familiar Perl implementation is used.
+
+=item *
+
+C<Devel::PPPort>, originally by Kenneth Albanowski and now
+maintained by Paul Marquess, has been added. It is primarily used
+by C<h2xs> to enhance portability of XS modules between different
+versions of Perl. See L<Devel::PPPort>.
+
+=item *
+
+C<Digest>, frontend module for calculating digests (checksums), from
+Gisle Aas, has been added. See L<Digest>.
+
+=item *
+
+C<Digest::MD5> for calculating MD5 digests (checksums) as defined in
+RFC 1321, from Gisle Aas, has been added. See L<Digest::MD5>.
+
+ use Digest::MD5 'md5_hex';
+
+ $digest = md5_hex("Thirsty Camel");
+
+ print $digest, "\n"; # 01d19d9d2045e005c3f1b80e8b164de1
+
+NOTE: the C<MD5> backward compatibility module is deliberately not
+included since its further use is discouraged.
+
+See also L<PerlIO::via::QuotedPrint>.
+
+=item *
+
+C<Encode>, originally by Nick Ing-Simmons and now maintained by Dan
+Kogai, provides a mechanism to translate between different character
+encodings. Support for Unicode, ISO-8859-1, and ASCII are compiled in
+to the module. Several other encodings (like the rest of the
+ISO-8859, CP*/Win*, Mac, KOI8-R, three variants EBCDIC, Chinese,
+Japanese, and Korean encodings) are included and can be loaded at
+runtime. (For space considerations, the largest Chinese encodings
+have been separated into their own CPAN module, Encode::HanExtra,
+which Encode will use if available). See L<Encode>.
+
+Any encoding supported by Encode module is also available to the
+":encoding()" layer if PerlIO is used.
+
+=item *
+
+C<Hash::Util> is the interface to the new I<restricted hashes>
+feature. (Implemented by Jeffrey Friedl, Nick Ing-Simmons, and
+Michael Schwern.) See L<Hash::Util>.
+
+=item *
+
+C<I18N::Langinfo> can be used to query locale information.
+See L<I18N::Langinfo>.
+
+=item *
+
+C<I18N::LangTags>, by Sean Burke, has functions for dealing with
+RFC3066-style language tags. See L<I18N::LangTags>.
+
+=item *
+
+C<ExtUtils::Constant>, by Nicholas Clark, is a new tool for extension
+writers for generating XS code to import C header constants.
+See L<ExtUtils::Constant>.
+
+=item *
+
+C<Filter::Simple>, by Damian Conway, is an easy-to-use frontend to
+Filter::Util::Call. See L<Filter::Simple>.
+
+ # in MyFilter.pm:
+
+ package MyFilter;
+
+ use Filter::Simple sub {
+ while (my ($from, $to) = splice @_, 0, 2) {
+ s/$from/$to/g;
+ }
+ };
+
+ 1;
+
+ # in user's code:
+
+ use MyFilter qr/red/ => 'green';
+
+ print "red\n"; # this code is filtered, will print "green\n"
+ print "bored\n"; # this code is filtered, will print "bogreen\n"
+
+ no MyFilter;
+
+ print "red\n"; # this code is not filtered, will print "red\n"
+
+=item *
+
+C<File::Temp>, by Tim Jenness, allows one to create temporary files
+and directories in an easy, portable, and secure way. See L<File::Temp>.
+[561+]
+
+=item *
+
+C<Filter::Util::Call>, by Paul Marquess, provides you with the
+framework to write I<source filters> in Perl. For most uses, the
+frontend Filter::Simple is to be preferred. See L<Filter::Util::Call>.
+
+=item *
+
+C<if>, by Ilya Zakharevich, is a new pragma for conditional inclusion
+of modules.
+
+=item *
+
+L<libnet>, by Graham Barr, is a collection of perl5 modules related
+to network programming. See L<Net::FTP>, L<Net::NNTP>, L<Net::Ping>
+(not part of libnet, but related), L<Net::POP3>, L<Net::SMTP>,
+and L<Net::Time>.
+
+Perl installation leaves libnet unconfigured; use F<libnetcfg>
+to configure it.
+
+=item *
+
+C<List::Util>, by Graham Barr, is a selection of general-utility
+list subroutines, such as sum(), min(), first(), and shuffle().
+See L<List::Util>.
+
+=item *
+
+C<Locale::Constants>, C<Locale::Country>, C<Locale::Currency>
+C<Locale::Language>, and L<Locale::Script>, by Neil Bowers, have
+been added. They provide the codes for various locale standards, such
+as "fr" for France, "usd" for US Dollar, and "ja" for Japanese.
+
+ use Locale::Country;
+
+ $country = code2country('jp'); # $country gets 'Japan'
+ $code = country2code('Norway'); # $code gets 'no'
+
+See L<Locale::Constants>, L<Locale::Country>, L<Locale::Currency>,
+and L<Locale::Language>.
+
+=item *
+
+C<Locale::Maketext>, by Sean Burke, is a localization framework. See
+L<Locale::Maketext>, and L<Locale::Maketext::TPJ13>. The latter is an
+article about software localization, originally published in The Perl
+Journal #13, and republished here with kind permission.
+
+=item *
+
+C<Math::BigRat> for big rational numbers, to accompany Math::BigInt and
+Math::BigFloat, from Tels. See L<Math::BigRat>.
+
+=item *
+
+C<Memoize> can make your functions faster by trading space for time,
+from Mark-Jason Dominus. See L<Memoize>.
+
+=item *
+
+C<MIME::Base64>, by Gisle Aas, allows you to encode data in base64,
+as defined in RFC 2045 - I<MIME (Multipurpose Internet Mail
+Extensions)>.
+
+ use MIME::Base64;
+
+ $encoded = encode_base64('Aladdin:open sesame');
+ $decoded = decode_base64($encoded);
+
+ print $encoded, "\n"; # "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
+
+See L<MIME::Base64>.
+
+=item *
+
+C<MIME::QuotedPrint>, by Gisle Aas, allows you to encode data
+in quoted-printable encoding, as defined in RFC 2045 - I<MIME
+(Multipurpose Internet Mail Extensions)>.
+
+ use MIME::QuotedPrint;
+
+ $encoded = encode_qp("\xDE\xAD\xBE\xEF");
+ $decoded = decode_qp($encoded);
+
+ print $encoded, "\n"; # "=DE=AD=BE=EF\n"
+ print $decoded, "\n"; # "\xDE\xAD\xBE\xEF\n"
+
+See also L<PerlIO::via::QuotedPrint>.
+
+=item *
+
+C<NEXT>, by Damian Conway, is a pseudo-class for method redispatch.
+See L<NEXT>.
+
+=item *
+
+C<open> is a new pragma for setting the default I/O layers
+for open().
+
+=item *
+
+C<PerlIO::scalar>, by Nick Ing-Simmons, provides the implementation
+of IO to "in memory" Perl scalars as discussed above. It also serves
+as an example of a loadable PerlIO layer. Other future possibilities
+include PerlIO::Array and PerlIO::Code. See L<PerlIO::scalar>.
+
+=item *
+
+C<PerlIO::via>, by Nick Ing-Simmons, acts as a PerlIO layer and wraps
+PerlIO layer functionality provided by a class (typically implemented
+in Perl code).
+
+=item *
+
+C<PerlIO::via::QuotedPrint>, by Elizabeth Mattijsen, is an example
+of a C<PerlIO::via> class:
+
+ use PerlIO::via::QuotedPrint;
+ open($fh,">:via(QuotedPrint)",$path);
+
+This will automatically convert everything output to C<$fh> to
+Quoted-Printable. See L<PerlIO::via> and L<PerlIO::via::QuotedPrint>.
+
+=item *
+
+C<Pod::ParseLink>, by Russ Allbery, has been added,
+to parse LZ<><> links in pods as described in the new
+perlpodspec.
+
+=item *
+
+C<Pod::Text::Overstrike>, by Joe Smith, has been added.
+It converts POD data to formatted overstrike text.
+See L<Pod::Text::Overstrike>. [561+]
+
+=item *
+
+C<Scalar::Util> is a selection of general-utility scalar subroutines,
+such as blessed(), reftype(), and tainted(). See L<Scalar::Util>.
+
+=item *
+
+C<sort> is a new pragma for controlling the behaviour of sort().
+
+=item *
+
+C<Storable> gives persistence to Perl data structures by allowing the
+storage and retrieval of Perl data to and from files in a fast and
+compact binary format. Because in effect Storable does serialisation
+of Perl data structures, with it you can also clone deep, hierarchical
+datastructures. Storable was originally created by Raphael Manfredi,
+but it is now maintained by Abhijit Menon-Sen. Storable has been
+enhanced to understand the two new hash features, Unicode keys and
+restricted hashes. See L<Storable>.
+
+=item *
+
+C<Switch>, by Damian Conway, has been added. Just by saying
+
+ use Switch;
+
+you have C<switch> and C<case> available in Perl.
+
+ use Switch;
+
+ switch ($val) {
+
+ case 1 { print "number 1" }
+ case "a" { print "string a" }
+ case [1..10,42] { print "number in list" }
+ case (@array) { print "number in list" }
+ case /\w+/ { print "pattern" }
+ case qr/\w+/ { print "pattern" }
+ case (%hash) { print "entry in hash" }
+ case (\%hash) { print "entry in hash" }
+ case (\&sub) { print "arg to subroutine" }
+ else { print "previous case not true" }
+ }
+
+See L<Switch>.
+
+=item *
+
+C<Test::More>, by Michael Schwern, is yet another framework for writing
+test scripts, more extensive than Test::Simple. See L<Test::More>.
+
+=item *
+
+C<Test::Simple>, by Michael Schwern, has basic utilities for writing
+tests. See L<Test::Simple>.
+
+=item *
+
+C<Text::Balanced>, by Damian Conway, has been added, for extracting
+delimited text sequences from strings.
+
+ use Text::Balanced 'extract_delimited';
+
+ ($a, $b) = extract_delimited("'never say never', he never said", "'", '');
+
+$a will be "'never say never'", $b will be ', he never said'.
+
+In addition to extract_delimited(), there are also extract_bracketed(),
+extract_quotelike(), extract_codeblock(), extract_variable(),
+extract_tagged(), extract_multiple(), gen_delimited_pat(), and
+gen_extract_tagged(). With these, you can implement rather advanced
+parsing algorithms. See L<Text::Balanced>.
+
+=item *
+
+C<threads>, by Arthur Bergman, is an interface to interpreter threads.
+Interpreter threads (ithreads) is the new thread model introduced in
+Perl 5.6 but only available as an internal interface for extension
+writers (and for Win32 Perl for C<fork()> emulation). See L<threads>,
+L<threads::shared>, and L<perlthrtut>.
+
+=item *
+
+C<threads::shared>, by Arthur Bergman, allows data sharing for
+interpreter threads. See L<threads::shared>.
+
+=item *
+
+C<Tie::File>, by Mark-Jason Dominus, associates a Perl array with the
+lines of a file. See L<Tie::File>.
+
+=item *
+
+C<Tie::Memoize>, by Ilya Zakharevich, provides on-demand loaded hashes.
+See L<Tie::Memoize>.
+
+=item *
+
+C<Tie::RefHash::Nestable>, by Edward Avis, allows storing hash
+references (unlike the standard Tie::RefHash) The module is contained
+within Tie::RefHash. See L<Tie::RefHash>.
+
+=item *
+
+C<Time::HiRes>, by Douglas E. Wegscheid, provides high resolution
+timing (ualarm, usleep, and gettimeofday). See L<Time::HiRes>.
+
+=item *
+
+C<Unicode::UCD> offers a querying interface to the Unicode Character
+Database. See L<Unicode::UCD>.
+
+=item *
+
+C<Unicode::Collate>, by SADAHIRO Tomoyuki, implements the UCA
+(Unicode Collation Algorithm) for sorting Unicode strings.
+See L<Unicode::Collate>.
+
+=item *
+
+C<Unicode::Normalize>, by SADAHIRO Tomoyuki, implements the various
+Unicode normalization forms. See L<Unicode::Normalize>.
+
+=item *
+
+C<XS::APItest>, by Tim Jenness, is a test extension that exercises XS
+APIs. Currently only C<printf()> is tested: how to output various
+basic data types from XS.
+
+=item *
+
+C<XS::Typemap>, by Tim Jenness, is a test extension that exercises
+XS typemaps. Nothing gets installed, but the code is worth studying
+for extension writers.
+
+=back
+
+=head2 Updated And Improved Modules and Pragmata
+
+=over 4
+
+=item *
+
+The following independently supported modules have been updated to the
+newest versions from CPAN: CGI, CPAN, DB_File, File::Spec, File::Temp,
+Getopt::Long, Math::BigFloat, Math::BigInt, the podlators bundle
+(Pod::Man, Pod::Text), Pod::LaTeX [561+], Pod::Parser, Storable,
+Term::ANSIColor, Test, Text-Tabs+Wrap.
+
+=item *
+
+attributes::reftype() now works on tied arguments.
+
+=item *
+
+AutoLoader can now be disabled with C<no AutoLoader;>.
+
+=item *
+
+B::Deparse has been significantly enhanced by Robin Houston. It can
+now deparse almost all of the standard test suite (so that the tests
+still succeed). There is a make target "test.deparse" for trying this
+out.
+
+=item *
+
+Carp now has better interface documentation, and the @CARP_NOT
+interface has been added to get optional control over where errors
+are reported independently of @ISA, by Ben Tilly.
+
+=item *
+
+Class::Struct can now define the classes in compile time.
+
+=item *
+
+Class::Struct now assigns the array/hash element if the accessor
+is called with an array/hash element as the B<sole> argument.
+
+=item *
+
+The return value of Cwd::fastcwd() is now tainted.
+
+=item *
+
+Data::Dumper now has an option to sort hashes.
+
+=item *
+
+Data::Dumper now has an option to dump code references
+using B::Deparse.
+
+=item *
+
+DB_File now supports newer Berkeley DB versions, among
+other improvements.
+
+=item *
+
+Devel::Peek now has an interface for the Perl memory statistics
+(this works only if you are using perl's malloc, and if you have
+compiled with debugging).
+
+=item *
+
+The English module can now be used without the infamous performance
+hit by saying
+
+ use English '-no_match_vars';
+
+(Assuming, of course, that you don't need the troublesome variables
+C<$`>, C<$&>, or C<$'>.) Also, introduced C<@LAST_MATCH_START> and
+C<@LAST_MATCH_END> English aliases for C<@-> and C<@+>.
+
+=item *
+
+ExtUtils::MakeMaker has been significantly cleaned up and fixed.
+The enhanced version has also been backported to earlier releases
+of Perl and submitted to CPAN so that the earlier releases can
+enjoy the fixes.
+
+=item *
+
+The arguments of WriteMakefile() in Makefile.PL are now checked
+for sanity much more carefully than before. This may cause new
+warnings when modules are being installed. See L<ExtUtils::MakeMaker>
+for more details.
+
+=item *
+
+ExtUtils::MakeMaker now uses File::Spec internally, which hopefully
+leads to better portability.
+
+=item *
+
+Fcntl, Socket, and Sys::Syslog have been rewritten by Nicholas Clark
+to use the new-style constant dispatch section (see L<ExtUtils::Constant>).
+This means that they will be more robust and hopefully faster.
+
+=item *
+
+File::Find now chdir()s correctly when chasing symbolic links. [561]
+
+=item *
+
+File::Find now has pre- and post-processing callbacks. It also
+correctly changes directories when chasing symbolic links. Callbacks
+(naughtily) exiting with "next;" instead of "return;" now work.
+
+=item *
+
+File::Find is now (again) reentrant. It also has been made
+more portable.
+
+=item *
+
+The warnings issued by File::Find now belong to their own category.
+You can enable/disable them with C<use/no warnings 'File::Find';>.
+
+=item *
+
+File::Glob::glob() has been renamed to File::Glob::bsd_glob()
+because the name clashes with the builtin glob(). The older
+name is still available for compatibility, but is deprecated. [561]
+
+=item *
+
+File::Glob now supports C<GLOB_LIMIT> constant to limit the size of
+the returned list of filenames.
+
+=item *
+
+IPC::Open3 now allows the use of numeric file descriptors.
+
+=item *
+
+IO::Socket now has an atmark() method, which returns true if the socket
+is positioned at the out-of-band mark. The method is also exportable
+as a sockatmark() function.
+
+=item *
+
+IO::Socket::INET failed to open the specified port if the service name
+was not known. It now correctly uses the supplied port number as is. [561]
+
+=item *
+
+IO::Socket::INET has support for the ReusePort option (if your
+platform supports it). The Reuse option now has an alias, ReuseAddr.
+For clarity, you may want to prefer ReuseAddr.
+
+=item *
+
+IO::Socket::INET now supports a value of zero for C<LocalPort>
+(usually meaning that the operating system will make one up.)
+
+=item *
+
+'use lib' now works identically to @INC. Removing directories
+with 'no lib' now works.
+
+=item *
+
+Math::BigFloat and Math::BigInt have undergone a full rewrite by Tels.
+They are now magnitudes faster, and they support various bignum
+libraries such as GMP and PARI as their backends.
+
+=item *
+
+Math::Complex handles inf, NaN etc., better.
+
+=item *
+
+Net::Ping has been considerably enhanced by Rob Brown: multihoming is
+now supported, Win32 functionality is better, there is now time
+measuring functionality (optionally high-resolution using
+Time::HiRes), and there is now "external" protocol which uses
+Net::Ping::External module which runs your external ping utility and
+parses the output. A version of Net::Ping::External is available in
+CPAN.
+
+Note that some of the Net::Ping tests are disabled when running
+under the Perl distribution since one cannot assume one or more
+of the following: enabled echo port at localhost, full Internet
+connectivity, or sympathetic firewalls. You can set the environment
+variable PERL_TEST_Net_Ping to "1" (one) before running the Perl test
+suite to enable all the Net::Ping tests.
+
+=item *
+
+POSIX::sigaction() is now much more flexible and robust.
+You can now install coderef handlers, 'DEFAULT', and 'IGNORE'
+handlers, installing new handlers was not atomic.
+
+=item *
+
+In Safe, C<%INC> is now localised in a Safe compartment so that
+use/require work.
+
+=item *
+
+In SDBM_File on dosish platforms, some keys went missing because of
+lack of support for files with "holes". A workaround for the problem
+has been added.
+
+=item *
+
+In Search::Dict one can now have a pre-processing hook for the
+lines being searched.
+
+=item *
+
+The Shell module now has an OO interface.
+
+=item *
+
+In Sys::Syslog there is now a failover mechanism that will go
+through alternative connection mechanisms until the message
+is successfully logged.
+
+=item *
+
+The Test module has been significantly enhanced.
+
+=item *
+
+Time::Local::timelocal() does not handle fractional seconds anymore.
+The rationale is that neither does localtime(), and timelocal() and
+localtime() are supposed to be inverses of each other.
+
+=item *
+
+The vars pragma now supports declaring fully qualified variables.
+(Something that C<our()> does not and will not support.)
+
+=item *
+
+The C<utf8::> name space (as in the pragma) provides various
+Perl-callable functions to provide low level access to Perl's
+internal Unicode representation. At the moment only length()
+has been implemented.
+
+=back
+
+=head1 Utility Changes
+
+=over 4
+
+=item *
+
+Emacs perl mode (emacs/cperl-mode.el) has been updated to version
+4.31.
+
+=item *
+
+F<emacs/e2ctags.pl> is now much faster.
+
+=item *
+
+C<enc2xs> is a tool for people adding their own encodings to the
+Encode module.
+
+=item *
+
+C<h2ph> now supports C trigraphs.
+
+=item *
+
+C<h2xs> now produces a template README.
+
+=item *
+
+C<h2xs> now uses C<Devel::PPPort> for better portability between
+different versions of Perl.
+
+=item *
+
+C<h2xs> uses the new L<ExtUtils::Constant|ExtUtils::Constant> module
+which will affect newly created extensions that define constants.
+Since the new code is more correct (if you have two constants where the
+first one is a prefix of the second one, the first constant B<never>
+got defined), less lossy (it uses integers for integer constant,
+as opposed to the old code that used floating point numbers even for
+integer constants), and slightly faster, you might want to consider
+regenerating your extension code (the new scheme makes regenerating
+easy). L<h2xs> now also supports C trigraphs.
+
+=item *
+
+C<libnetcfg> has been added to configure libnet.
+
+=item *
+
+C<perlbug> is now much more robust. It also sends the bug report to
+perl.org, not perl.com.
+
+=item *
+
+C<perlcc> has been rewritten and its user interface (that is,
+command line) is much more like that of the UNIX C compiler, cc.
+(The perlbc tools has been removed. Use C<perlcc -B> instead.)
+B<Note that perlcc is still considered very experimental and
+unsupported.> [561]
+
+=item *
+
+C<perlivp> is a new Installation Verification Procedure utility
+for running any time after installing Perl.
+
+=item *
+
+C<piconv> is an implementation of the character conversion utility
+C<iconv>, demonstrating the new Encode module.
+
+=item *
+
+C<pod2html> now allows specifying a cache directory.
+
+=item *
+
+C<pod2html> now produces XHTML 1.0.
+
+=item *
+
+C<pod2html> now understands POD written using different line endings
+(PC-like CRLF versus UNIX-like LF versus MacClassic-like CR).
+
+=item *
+
+C<s2p> has been completely rewritten in Perl. (It is in fact a full
+implementation of sed in Perl: you can use the sed functionality by
+using the C<psed> utility.)
+
+=item *
+
+C<xsubpp> now understands POD documentation embedded in the *.xs
+files. [561]
+
+=item *
+
+C<xsubpp> now supports the OUT keyword.
+
+=back
+
+=head1 New Documentation
+
+=over 4
+
+=item *
+
+perl56delta details the changes between the 5.005 release and the
+5.6.0 release.
+
+=item *
+
+perlclib documents the internal replacements for standard C library
+functions. (Interesting only for extension writers and Perl core
+hackers.) [561+]
+
+=item *
+
+perldebtut is a Perl debugging tutorial. [561+]
+
+=item *
+
+perlebcdic contains considerations for running Perl on EBCDIC
+platforms. [561+]
+
+=item *
+
+perlintro is a gentle introduction to Perl.
+
+=item *
+
+perliol documents the internals of PerlIO with layers.
+
+=item *
+
+perlmodstyle is a style guide for writing modules.
+
+=item *
+
+perlnewmod tells about writing and submitting a new module. [561+]
+
+=item *
+
+perlpacktut is a pack() tutorial.
+
+=item *
+
+perlpod has been rewritten to be clearer and to record the best
+practices gathered over the years.
+
+=item *
+
+perlpodspec is a more formal specification of the pod format,
+mainly of interest for writers of pod applications, not to
+people writing in pod.
+
+=item *
+
+perlretut is a regular expression tutorial. [561+]
+
+=item *
+
+perlrequick is a regular expressions quick-start guide.
+Yes, much quicker than perlretut. [561]
+
+=item *
+
+perltodo has been updated.
+
+=item *
+
+perltootc has been renamed as perltooc (to not to conflict
+with perltoot in filesystems restricted to "8.3" names).
+
+=item *
+
+perluniintro is an introduction to using Unicode in Perl.
+(perlunicode is more of a detailed reference and background
+information)
+
+=item *
+
+perlutil explains the command line utilities packaged with the Perl
+distribution. [561+]
+
+=back
+
+The following platform-specific documents are available before
+the installation as README.I<platform>, and after the installation
+as perlI<platform>:
+
+ perlaix perlamiga perlapollo perlbeos perlbs2000
+ perlce perlcygwin perldgux perldos perlepoc perlfreebsd perlhpux
+ perlhurd perlirix perlmachten perlmacos perlmint perlmpeix
+ perlnetware perlos2 perlos390 perlplan9 perlqnx perlsolaris
+ perltru64 perluts perlvmesa perlvms perlvos perlwin32
+
+These documents usually detail one or more of the following subjects:
+configuring, building, testing, installing, and sometimes also using
+Perl on the said platform.
+
+Eastern Asian Perl users are now welcomed in their own languages:
+README.jp (Japanese), README.ko (Korean), README.cn (simplified
+Chinese) and README.tw (traditional Chinese), which are written in
+normal pod but encoded in EUC-JP, EUC-KR, EUC-CN and Big5. These
+will get installed as
+
+ perljp perlko perlcn perltw
+
+=over 4
+
+=item *
+
+The documentation for the POSIX-BC platform is called "BS2000", to avoid
+confusion with the Perl POSIX module.
+
+=item *
+
+The documentation for the WinCE platform is called perlce (README.ce
+in the source code kit), to avoid confusion with the perlwin32
+documentation on 8.3-restricted filesystems.
+
+=back
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+map() could get pathologically slow when the result list it generates
+is larger than the source list. The performance has been improved for
+common scenarios. [561]
+
+=item *
+
+sort() is also fully reentrant, in the sense that the sort function
+can itself call sort(). This did not work reliably in previous
+releases. [561]
+
+=item *
+
+sort() has been changed to use primarily mergesort internally as
+opposed to the earlier quicksort. For very small lists this may
+result in slightly slower sorting times, but in general the speedup
+should be at least 20%. Additional bonuses are that the worst case
+behaviour of sort() is now better (in computer science terms it now
+runs in time O(N log N), as opposed to quicksort's Theta(N**2)
+worst-case run time behaviour), and that sort() is now stable
+(meaning that elements with identical keys will stay ordered as they
+were before the sort). See the C<sort> pragma for information.
+
+The story in more detail: suppose you want to serve yourself a little
+slice of Pi.
+
+ @digits = ( 3,1,4,1,5,9 );
+
+A numerical sort of the digits will yield (1,1,3,4,5,9), as expected.
+Which C<1> comes first is hard to know, since one C<1> looks pretty
+much like any other. You can regard this as totally trivial,
+or somewhat profound. However, if you just want to sort the even
+digits ahead of the odd ones, then what will
+
+ sort { ($a % 2) <=> ($b % 2) } @digits;
+
+yield? The only even digit, C<4>, will come first. But how about
+the odd numbers, which all compare equal? With the quicksort algorithm
+used to implement Perl 5.6 and earlier, the order of ties is left up
+to the sort. So, as you add more and more digits of Pi, the order
+in which the sorted even and odd digits appear will change.
+and, for sufficiently large slices of Pi, the quicksort algorithm
+in Perl 5.8 won't return the same results even if reinvoked with the
+same input. The justification for this rests with quicksort's
+worst case behavior. If you run
+
+ sort { $a <=> $b } ( 1 .. $N , 1 .. $N );
+
+(something you might approximate if you wanted to merge two sorted
+arrays using sort), doubling $N doesn't just double the quicksort time,
+it I<quadruples> it. Quicksort has a worst case run time that can
+grow like N**2, so-called I<quadratic> behaviour, and it can happen
+on patterns that may well arise in normal use. You won't notice this
+for small arrays, but you I<will> notice it with larger arrays,
+and you may not live long enough for the sort to complete on arrays
+of a million elements. So the 5.8 quicksort scrambles large arrays
+before sorting them, as a statistical defence against quadratic behaviour.
+But that means if you sort the same large array twice, ties may be
+broken in different ways.
+
+Because of the unpredictability of tie-breaking order, and the quadratic
+worst-case behaviour, quicksort was I<almost> replaced completely with
+a stable mergesort. I<Stable> means that ties are broken to preserve
+the original order of appearance in the input array. So
+
+ sort { ($a % 2) <=> ($b % 2) } (3,1,4,1,5,9);
+
+will yield (4,3,1,1,5,9), guaranteed. The even and odd numbers
+appear in the output in the same order they appeared in the input.
+Mergesort has worst case O(N log N) behaviour, the best value
+attainable. And, ironically, this mergesort does particularly
+well where quicksort goes quadratic: mergesort sorts (1..$N, 1..$N)
+in O(N) time. But quicksort was rescued at the last moment because
+it is faster than mergesort on certain inputs and platforms.
+For example, if you really I<don't> care about the order of even
+and odd digits, quicksort will run in O(N) time; it's very good
+at sorting many repetitions of a small number of distinct elements.
+The quicksort divide and conquer strategy works well on platforms
+with relatively small, very fast, caches. Eventually, the problem gets
+whittled down to one that fits in the cache, from which point it
+benefits from the increased memory speed.
+
+Quicksort was rescued by implementing a sort pragma to control aspects
+of the sort. The B<stable> subpragma forces stable behaviour,
+regardless of algorithm. The B<_quicksort> and B<_mergesort>
+subpragmas are heavy-handed ways to select the underlying implementation.
+The leading C<_> is a reminder that these subpragmas may not survive
+beyond 5.8. More appropriate mechanisms for selecting the implementation
+exist, but they wouldn't have arrived in time to save quicksort.
+
+=item *
+
+Hashes now use Bob Jenkins "One-at-a-Time" hashing key algorithm
+( http://burtleburtle.net/bob/hash/doobs.html ). This algorithm is
+reasonably fast while producing a much better spread of values than
+the old hashing algorithm (originally by Chris Torek, later tweaked by
+Ilya Zakharevich). Hash values output from the algorithm on a hash of
+all 3-char printable ASCII keys comes much closer to passing the
+DIEHARD random number generation tests. According to perlbench, this
+change has not affected the overall speed of Perl.
+
+=item *
+
+unshift() should now be noticeably faster.
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+=head2 Generic Improvements
+
+=over 4
+
+=item *
+
+INSTALL now explains how you can configure Perl to use 64-bit
+integers even on non-64-bit platforms.
+
+=item *
+
+Policy.sh policy change: if you are reusing a Policy.sh file
+(see INSTALL) and you use Configure -Dprefix=/foo/bar and in the old
+Policy $prefix eq $siteprefix and $prefix eq $vendorprefix, all of
+them will now be changed to the new prefix, /foo/bar. (Previously
+only $prefix changed.) If you do not like this new behaviour,
+specify prefix, siteprefix, and vendorprefix explicitly.
+
+=item *
+
+A new optional location for Perl libraries, otherlibdirs, is available.
+It can be used for example for vendor add-ons without disturbing Perl's
+own library directories.
+
+=item *
+
+In many platforms, the vendor-supplied 'cc' is too stripped-down to
+build Perl (basically, 'cc' doesn't do ANSI C). If this seems
+to be the case and 'cc' does not seem to be the GNU C compiler
+'gcc', an automatic attempt is made to find and use 'gcc' instead.
+
+=item *
+
+gcc needs to closely track the operating system release to avoid
+build problems. If Configure finds that gcc was built for a different
+operating system release than is running, it now gives a clearly visible
+warning that there may be trouble ahead.
+
+=item *
+
+Since Perl 5.8 is not binary-compatible with previous releases
+of Perl, Configure no longer suggests including the 5.005
+modules in @INC.
+
+=item *
+
+Configure C<-S> can now run non-interactively. [561]
+
+=item *
+
+Configure support for pdp11-style memory models has been removed due
+to obsolescence. [561]
+
+=item *
+
+configure.gnu now works with options with whitespace in them.
+
+=item *
+
+installperl now outputs everything to STDERR.
+
+=item *
+
+Because PerlIO is now the default on most platforms, "-perlio" doesn't
+get appended to the $Config{archname} (also known as $^O) anymore.
+Instead, if you explicitly choose not to use perlio (Configure command
+line option -Uuseperlio), you will get "-stdio" appended.
+
+=item *
+
+Another change related to the architecture name is that "-64all"
+(-Duse64bitall, or "maximally 64-bit") is appended only if your
+pointers are 64 bits wide. (To be exact, the use64bitall is ignored.)
+
+=item *
+
+In AFS installations, one can configure the root of the AFS to be
+somewhere else than the default F</afs> by using the Configure
+parameter C<-Dafsroot=/some/where/else>.
+
+=item *
+
+APPLLIB_EXP, a lesser-known configuration-time definition, has been
+documented. It can be used to prepend site-specific directories
+to Perl's default search path (@INC); see INSTALL for information.
+
+=item *
+
+The version of Berkeley DB used when the Perl (and, presumably, the
+DB_File extension) was built is now available as
+C<@Config{qw(db_version_major db_version_minor db_version_patch)}>
+from Perl and as C<DB_VERSION_MAJOR_CFG DB_VERSION_MINOR_CFG
+DB_VERSION_PATCH_CFG> from C.
+
+=item *
+
+Building Berkeley DB3 for compatibility modes for DB, NDBM, and ODBM
+has been documented in INSTALL.
+
+=item *
+
+If you have CPAN access (either network or a local copy such as a
+CD-ROM) you can during specify extra modules to Configure to build and
+install with Perl using the -Dextras=... option. See INSTALL for
+more details.
+
+=item *
+
+In addition to config.over, a new override file, config.arch, is
+available. This file is supposed to be used by hints file writers
+for architecture-wide changes (as opposed to config.over which is
+for site-wide changes).
+
+=item *
+
+If your file system supports symbolic links, you can build Perl outside
+of the source directory by
+
+ mkdir perl/build/directory
+ cd perl/build/directory
+ sh /path/to/perl/source/Configure -Dmksymlinks ...
+
+This will create in perl/build/directory a tree of symbolic links
+pointing to files in /path/to/perl/source. The original files are left
+unaffected. After Configure has finished, you can just say
+
+ make all test
+
+and Perl will be built and tested, all in perl/build/directory.
+[561]
+
+=item *
+
+For Perl developers, several new make targets for profiling
+and debugging have been added; see L<perlhack>.
+
+=over 8
+
+=item *
+
+Use of the F<gprof> tool to profile Perl has been documented in
+L<perlhack>. There is a make target called "perl.gprof" for
+generating a gprofiled Perl executable.
+
+=item *
+
+If you have GCC 3, there is a make target called "perl.gcov" for
+creating a gcoved Perl executable for coverage analysis. See
+L<perlhack>.
+
+=item *
+
+If you are on IRIX or Tru64 platforms, new profiling/debugging options
+have been added; see L<perlhack> for more information about pixie and
+Third Degree.
+
+=back
+
+=item *
+
+Guidelines of how to construct minimal Perl installations have
+been added to INSTALL.
+
+=item *
+
+The Thread extension is now not built at all under ithreads
+(C<Configure -Duseithreads>) because it wouldn't work anyway (the
+Thread extension requires being Configured with C<-Duse5005threads>).
+
+B<Note that the 5.005 threads are unsupported and deprecated: if you
+have code written for the old threads you should migrate it to the
+new ithreads model.>
+
+=item *
+
+The Gconvert macro ($Config{d_Gconvert}) used by perl for stringifying
+floating-point numbers is now more picky about using sprintf %.*g
+rules for the conversion. Some platforms that used to use gcvt may
+now resort to the slower sprintf.
+
+=item *
+
+The obsolete method of making a special (e.g., debugging) flavor
+of perl by saying
+
+ make LIBPERL=libperld.a
+
+has been removed. Use -DDEBUGGING instead.
+
+=back
+
+=head2 New Or Improved Platforms
+
+For the list of platforms known to support Perl,
+see L<perlport/"Supported Platforms">.
+
+=over 4
+
+=item *
+
+AIX dynamic loading should be now better supported.
+
+=item *
+
+AIX should now work better with gcc, threads, and 64-bitness. Also the
+long doubles support in AIX should be better now. See L<perlaix>.
+
+=item *
+
+AtheOS ( http://www.atheos.cx/ ) is a new platform.
+
+=item *
+
+BeOS has been reclaimed.
+
+=item *
+
+The DG/UX platform now supports 5.005-style threads.
+See L<perldgux>.
+
+=item *
+
+The DYNIX/ptx platform (also known as dynixptx) is supported at or
+near osvers 4.5.2.
+
+=item *
+
+EBCDIC platforms (z/OS (also known as OS/390), POSIX-BC, and VM/ESA)
+have been regained. Many test suite tests still fail and the
+co-existence of Unicode and EBCDIC isn't quite settled, but the
+situation is much better than with Perl 5.6. See L<perlos390>,
+L<perlbs2000> (for POSIX-BC), and L<perlvmesa> for more information.
+
+=item *
+
+Building perl with -Duseithreads or -Duse5005threads now works under
+HP-UX 10.20 (previously it only worked under 10.30 or later). You will
+need a thread library package installed. See README.hpux. [561]
+
+=item *
+
+Mac OS Classic is now supported in the mainstream source package
+(MacPerl has of course been available since perl 5.004 but now the
+source code bases of standard Perl and MacPerl have been synchronised)
+[561]
+
+=item *
+
+Mac OS X (or Darwin) should now be able to build Perl even on HFS+
+filesystems. (The case-insensitivity used to confuse the Perl build
+process.)
+
+=item *
+
+NCR MP-RAS is now supported. [561]
+
+=item *
+
+All the NetBSD specific patches (except for the installation
+specific ones) have been merged back to the main distribution.
+
+=item *
+
+NetWare from Novell is now supported. See L<perlnetware>.
+
+=item *
+
+NonStop-UX is now supported. [561]
+
+=item *
+
+NEC SUPER-UX is now supported.
+
+=item *
+
+All the OpenBSD specific patches (except for the installation
+specific ones) have been merged back to the main distribution.
+
+=item *
+
+Perl has been tested with the GNU pth userlevel thread package
+( http://www.gnu.org/software/pth/pth.html ). All thread tests
+of Perl now work, but not without adding some yield()s to the tests,
+so while pth (and other userlevel thread implementations) can be
+considered to be "working" with Perl ithreads, keep in mind the
+possible non-preemptability of the underlying thread implementation.
+
+=item *
+
+Stratus VOS is now supported using Perl's native build method
+(Configure). This is the recommended method to build Perl on
+VOS. The older methods, which build miniperl, are still
+available. See L<perlvos>. [561+]
+
+=item *
+
+The Amdahl UTS UNIX mainframe platform is now supported. [561]
+
+=item *
+
+WinCE is now supported. See L<perlce>.
+
+=item *
+
+z/OS (formerly known as OS/390, formerly known as MVS OE) now has
+support for dynamic loading. This is not selected by default,
+however, you must specify -Dusedl in the arguments of Configure. [561]
+
+=back
+
+=head1 Selected Bug Fixes
+
+Numerous memory leaks and uninitialized memory accesses have been
+hunted down. Most importantly, anonymous subs used to leak quite
+a bit. [561]
+
+=over 4
+
+=item *
+
+The autouse pragma didn't work for Multi::Part::Function::Names.
+
+=item *
+
+caller() could cause core dumps in certain situations. Carp was
+sometimes affected by this problem. In particular, caller() now
+returns a subroutine name of C<(unknown)> for subroutines that have
+been removed from the symbol table.
+
+=item *
+
+chop(@list) in list context returned the characters chopped in
+reverse order. This has been reversed to be in the right order. [561]
+
+=item *
+
+Configure no longer includes the DBM libraries (dbm, gdbm, db, ndbm)
+when building the Perl binary. The only exception to this is SunOS 4.x,
+which needs them. [561]
+
+=item *
+
+The behaviour of non-decimal but numeric string constants such as
+"0x23" was platform-dependent: in some platforms that was seen as 35,
+in some as 0, in some as a floating point number (don't ask). This
+was caused by Perl's using the operating system libraries in a situation
+where the result of the string to number conversion is undefined: now
+Perl consistently handles such strings as zero in numeric contexts.
+
+=item *
+
+Several debugger fixes: exit code now reflects the script exit code,
+condition C<"0"> now treated correctly, the C<d> command now checks
+line number, C<$.> no longer gets corrupted, and all debugger output
+now goes correctly to the socket if RemotePort is set. [561]
+
+=item *
+
+The debugger (perl5db.pl) has been modified to present a more
+consistent commands interface, via (CommandSet=580). perl5db.t was
+also added to test the changes, and as a placeholder for further tests.
+
+See L<perldebug>.
+
+=item *
+
+The debugger has a new C<dumpDepth> option to control the maximum
+depth to which nested structures are dumped. The C<x> command has
+been extended so that C<x N EXPR> dumps out the value of I<EXPR> to a
+depth of at most I<N> levels.
+
+=item *
+
+The debugger can now show lexical variables if you have the CPAN
+module PadWalker installed.
+
+=item *
+
+The order of DESTROYs has been made more predictable.
+
+=item *
+
+Perl 5.6.0 could emit spurious warnings about redefinition of
+dl_error() when statically building extensions into perl.
+This has been corrected. [561]
+
+=item *
+
+L<dprofpp> -R didn't work.
+
+=item *
+
+C<*foo{FORMAT}> now works.
+
+=item *
+
+Infinity is now recognized as a number.
+
+=item *
+
+UNIVERSAL::isa no longer caches methods incorrectly. (This broke
+the Tk extension with 5.6.0.) [561]
+
+=item *
+
+Lexicals I: lexicals outside an eval "" weren't resolved
+correctly inside a subroutine definition inside the eval "" if they
+were not already referenced in the top level of the eval""ed code.
+
+=item *
+
+Lexicals II: lexicals leaked at file scope into subroutines that
+were declared before the lexicals.
+
+=item *
+
+Lexical warnings now propagating correctly between scopes
+and into C<eval "...">.
+
+=item *
+
+C<use warnings qw(FATAL all)> did not work as intended. This has been
+corrected. [561]
+
+=item *
+
+warnings::enabled() now reports the state of $^W correctly if the caller
+isn't using lexical warnings. [561]
+
+=item *
+
+Line renumbering with eval and C<#line> now works. [561]
+
+=item *
+
+Fixed numerous memory leaks, especially in eval "".
+
+=item *
+
+Localised tied variables no longer leak memory
+
+ use Tie::Hash;
+ tie my %tied_hash => 'Tie::StdHash';
+
+ ...
+
+ # Used to leak memory every time local() was called;
+ # in a loop, this added up.
+ local($tied_hash{Foo}) = 1;
+
+=item *
+
+Localised hash elements (and %ENV) are correctly unlocalised to not
+exist, if they didn't before they were localised.
+
+
+ use Tie::Hash;
+ tie my %tied_hash => 'Tie::StdHash';
+
+ ...
+
+ # Nothing has set the FOO element so far
+
+ { local $tied_hash{FOO} = 'Bar' }
+
+ # This used to print, but not now.
+ print "exists!\n" if exists $tied_hash{FOO};
+
+As a side effect of this fix, tied hash interfaces B<must> define
+the EXISTS and DELETE methods.
+
+=item *
+
+mkdir() now ignores trailing slashes in the directory name,
+as mandated by POSIX.
+
+=item *
+
+Some versions of glibc have a broken modfl(). This affects builds
+with C<-Duselongdouble>. This version of Perl detects this brokenness
+and has a workaround for it. The glibc release 2.2.2 is known to have
+fixed the modfl() bug.
+
+=item *
+
+Modulus of unsigned numbers now works (4063328477 % 65535 used to
+return 27406, instead of 27047). [561]
+
+=item *
+
+Some "not a number" warnings introduced in 5.6.0 eliminated to be
+more compatible with 5.005. Infinity is now recognised as a number. [561]
+
+=item *
+
+Numeric conversions did not recognize changes in the string value
+properly in certain circumstances. [561]
+
+=item *
+
+Attributes (such as :shared) didn't work with our().
+
+=item *
+
+our() variables will not cause bogus "Variable will not stay shared"
+warnings. [561]
+
+=item *
+
+"our" variables of the same name declared in two sibling blocks
+resulted in bogus warnings about "redeclaration" of the variables.
+The problem has been corrected. [561]
+
+=item *
+
+pack "Z" now correctly terminates the string with "\0".
+
+=item *
+
+Fix password routines which in some shadow password platforms
+(e.g. HP-UX) caused getpwent() to return every other entry.
+
+=item *
+
+The PERL5OPT environment variable (for passing command line arguments
+to Perl) didn't work for more than a single group of options. [561]
+
+=item *
+
+PERL5OPT with embedded spaces didn't work.
+
+=item *
+
+printf() no longer resets the numeric locale to "C".
+
+=item *
+
+C<qw(a\\b)> now parses correctly as C<'a\\b'>: that is, as three
+characters, not four. [561]
+
+=item *
+
+pos() did not return the correct value within s///ge in earlier
+versions. This is now handled correctly. [561]
+
+=item *
+
+Printing quads (64-bit integers) with printf/sprintf now works
+without the q L ll prefixes (assuming you are on a quad-capable platform).
+
+=item *
+
+Regular expressions on references and overloaded scalars now work. [561+]
+
+=item *
+
+Right-hand side magic (GMAGIC) could in many cases such as string
+concatenation be invoked too many times.
+
+=item *
+
+scalar() now forces scalar context even when used in void context.
+
+=item *
+
+SOCKS support is now much more robust.
+
+=item *
+
+sort() arguments are now compiled in the right wantarray context
+(they were accidentally using the context of the sort() itself).
+The comparison block is now run in scalar context, and the arguments
+to be sorted are always provided list context. [561]
+
+=item *
+
+Changed the POSIX character class C<[[:space:]]> to include the (very
+rarely used) vertical tab character. Added a new POSIX-ish character
+class C<[[:blank:]]> which stands for horizontal whitespace
+(currently, the space and the tab).
+
+=item *
+
+The tainting behaviour of sprintf() has been rationalized. It does
+not taint the result of floating point formats anymore, making the
+behaviour consistent with that of string interpolation. [561]
+
+=item *
+
+Some cases of inconsistent taint propagation (such as within hash
+values) have been fixed.
+
+=item *
+
+The RE engine found in Perl 5.6.0 accidentally pessimised certain kinds
+of simple pattern matches. These are now handled better. [561]
+
+=item *
+
+Regular expression debug output (whether through C<use re 'debug'>
+or via C<-Dr>) now looks better. [561]
+
+=item *
+
+Multi-line matches like C<"a\nxb\n" =~ /(?!\A)x/m> were flawed. The
+bug has been fixed. [561]
+
+=item *
+
+Use of $& could trigger a core dump under some situations. This
+is now avoided. [561]
+
+=item *
+
+The regular expression captured submatches ($1, $2, ...) are now
+more consistently unset if the match fails, instead of leaving false
+data lying around in them. [561]
+
+=item *
+
+readline() on files opened in "slurp" mode could return an extra
+"" (blank line) at the end in certain situations. This has been
+corrected. [561]
+
+=item *
+
+Autovivification of symbolic references of special variables described
+in L<perlvar> (as in C<${$num}>) was accidentally disabled. This works
+again now. [561]
+
+=item *
+
+Sys::Syslog ignored the C<LOG_AUTH> constant.
+
+=item *
+
+$AUTOLOAD, sort(), lock(), and spawning subprocesses
+in multiple threads simultaneously are now thread-safe.
+
+=item *
+
+Tie::Array's SPLICE method was broken.
+
+=item *
+
+Allow a read-only string on the left-hand side of a non-modifying tr///.
+
+=item *
+
+If C<STDERR> is tied, warnings caused by C<warn> and C<die> now
+correctly pass to it.
+
+=item *
+
+Several Unicode fixes.
+
+=over 8
+
+=item *
+
+BOMs (byte order marks) at the beginning of Perl files
+(scripts, modules) should now be transparently skipped.
+UTF-16 and UCS-2 encoded Perl files should now be read correctly.
+
+=item *
+
+The character tables have been updated to Unicode 3.2.0.
+
+=item *
+
+Comparing with utf8 data does not magically upgrade non-utf8 data
+into utf8. (This was a problem for example if you were mixing data
+from I/O and Unicode data: your output might have got magically encoded
+as UTF-8.)
+
+=item *
+
+Generating illegal Unicode code points such as U+FFFE, or the UTF-16
+surrogates, now also generates an optional warning.
+
+=item *
+
+C<IsAlnum>, C<IsAlpha>, and C<IsWord> now match titlecase.
+
+=item *
+
+Concatenation with the C<.> operator or via variable interpolation,
+C<eq>, C<substr>, C<reverse>, C<quotemeta>, the C<x> operator,
+substitution with C<s///>, single-quoted UTF-8, should now work.
+
+=item *
+
+The C<tr///> operator now works. Note that the C<tr///CU>
+functionality has been removed (but see pack('U0', ...)).
+
+=item *
+
+C<eval "v200"> now works.
+
+=item *
+
+Perl 5.6.0 parsed m/\x{ab}/ incorrectly, leading to spurious warnings.
+This has been corrected. [561]
+
+=item *
+
+Zero entries were missing from the Unicode classes such as C<IsDigit>.
+
+=back
+
+=item *
+
+Large unsigned numbers (those above 2**31) could sometimes lose their
+unsignedness, causing bogus results in arithmetic operations. [561]
+
+=item *
+
+The Perl parser has been stress tested using both random input and
+Markov chain input and the few found crashes and lockups have been
+fixed.
+
+=back
+
+=head2 Platform Specific Changes and Fixes
+
+=over 4
+
+=item *
+
+BSDI 4.*
+
+Perl now works on post-4.0 BSD/OSes.
+
+=item *
+
+All BSDs
+
+Setting C<$0> now works (as much as possible; see L<perlvar> for details).
+
+=item *
+
+Cygwin
+
+Numerous updates; currently synchronised with Cygwin 1.3.10.
+
+=item *
+
+Previously DYNIX/ptx had problems in its Configure probe for non-blocking I/O.
+
+=item *
+
+EPOC
+
+EPOC now better supported. See README.epoc. [561]
+
+=item *
+
+FreeBSD 3.*
+
+Perl now works on post-3.0 FreeBSDs.
+
+=item *
+
+HP-UX
+
+README.hpux updated; C<Configure -Duse64bitall> now works;
+now uses HP-UX malloc instead of Perl malloc.
+
+=item *
+
+IRIX
+
+Numerous compilation flag and hint enhancements; accidental mixing
+of 32-bit and 64-bit libraries (a doomed attempt) made much harder.
+
+=item *
+
+Linux
+
+=over 8
+
+=item *
+
+Long doubles should now work (see INSTALL). [561]
+
+=item *
+
+Linux previously had problems related to sockaddrlen when using
+accept(), recvfrom() (in Perl: recv()), getpeername(), and
+getsockname().
+
+=back
+
+=item *
+
+Mac OS Classic
+
+Compilation of the standard Perl distribution in Mac OS Classic should
+now work if you have the Metrowerks development environment and the
+missing Mac-specific toolkit bits. Contact the macperl mailing list
+for details.
+
+=item *
+
+MPE/iX
+
+MPE/iX update after Perl 5.6.0. See README.mpeix. [561]
+
+=item *
+
+NetBSD/threads: try installing the GNU pth (should be in the
+packages collection, or http://www.gnu.org/software/pth/),
+and Configure with -Duseithreads.
+
+=item *
+
+NetBSD/sparc
+
+Perl now works on NetBSD/sparc.
+
+=item *
+
+OS/2
+
+Now works with usethreads (see INSTALL). [561]
+
+=item *
+
+Solaris
+
+64-bitness using the Sun Workshop compiler now works.
+
+=item *
+
+Stratus VOS
+
+The native build method requires at least VOS Release 14.5.0
+and GNU C++/GNU Tools 2.0.1 or later. The Perl pack function
+now maps overflowed values to +infinity and underflowed values
+to -infinity.
+
+=item *
+
+Tru64 (aka Digital UNIX, aka DEC OSF/1)
+
+The operating system version letter now recorded in $Config{osvers}.
+Allow compiling with gcc (previously explicitly forbidden). Compiling
+with gcc still not recommended because buggy code results, even with
+gcc 2.95.2.
+
+=item *
+
+Unicos
+
+Fixed various alignment problems that lead into core dumps either
+during build or later; no longer dies on math errors at runtime;
+now using full quad integers (64 bits), previously was using
+only 46 bit integers for speed.
+
+=item *
+
+VMS
+
+See L</"Socket Extension Dynamic in VMS"> and L</"IEEE-format Floating Point
+Default on OpenVMS Alpha"> for important changes not otherwise listed here.
+
+chdir() now works better despite a CRT bug; now works with MULTIPLICITY
+(see INSTALL); now works with Perl's malloc.
+
+The tainting of C<%ENV> elements via C<keys> or C<values> was previously
+unimplemented. It now works as documented.
+
+The C<waitpid> emulation has been improved. The worst bug (now fixed)
+was that a pid of -1 would cause a wildcard search of all processes on
+the system.
+
+POSIX-style signals are now emulated much better on VMS versions prior
+to 7.0.
+
+The C<system> function and backticks operator have improved
+functionality and better error handling. [561]
+
+File access tests now use current process privileges rather than the
+user's default privileges, which could sometimes result in a mismatch
+between reported access and actual access. This improvement is only
+available on VMS v6.0 and later.
+
+There is a new C<kill> implementation based on C<sys$sigprc> that allows
+older VMS systems (pre-7.0) to use C<kill> to send signals rather than
+simply force exit. This implementation also allows later systems to
+call C<kill> from within a signal handler.
+
+Iterative logical name translations are now limited to 10 iterations in
+imitation of SHOW LOGICAL and other OpenVMS facilities.
+
+=item *
+
+Windows
+
+=over 8
+
+=item *
+
+Signal handling now works better than it used to. It is now implemented
+using a Windows message loop, and is therefore less prone to random
+crashes.
+
+=item *
+
+fork() emulation is now more robust, but still continues to have a few
+esoteric bugs and caveats. See L<perlfork> for details. [561+]
+
+=item *
+
+A failed (pseudo)fork now returns undef and sets errno to EAGAIN. [561]
+
+=item *
+
+The following modules now work on Windows:
+
+ ExtUtils::Embed [561]
+ IO::Pipe
+ IO::Poll
+ Net::Ping
+
+=item *
+
+IO::File::new_tmpfile() is no longer limited to 32767 invocations
+per-process.
+
+=item *
+
+Better chdir() return value for a non-existent directory.
+
+=item *
+
+Compiling perl using the 64-bit Platform SDK tools is now supported.
+
+=item *
+
+The Win32::SetChildShowWindow() builtin can be used to control the
+visibility of windows created by child processes. See L<Win32> for
+details.
+
+=item *
+
+Non-blocking waits for child processes (or pseudo-processes) are
+supported via C<waitpid($pid, &POSIX::WNOHANG)>.
+
+=item *
+
+The behavior of system() with multiple arguments has been rationalized.
+Each unquoted argument will be automatically quoted to protect whitespace,
+and any existing whitespace in the arguments will be preserved. This
+improves the portability of system(@args) by avoiding the need for
+Windows C<cmd> shell specific quoting in perl programs.
+
+Note that this means that some scripts that may have relied on earlier
+buggy behavior may no longer work correctly. For example,
+C<system("nmake /nologo", @args)> will now attempt to run the file
+C<nmake /nologo> and will fail when such a file isn't found.
+On the other hand, perl will now execute code such as
+C<system("c:/Program Files/MyApp/foo.exe", @args)> correctly.
+
+=item *
+
+The perl header files no longer suppress common warnings from the
+Microsoft Visual C++ compiler. This means that additional warnings may
+now show up when compiling XS code.
+
+=item *
+
+Borland C++ v5.5 is now a supported compiler that can build Perl.
+However, the generated binaries continue to be incompatible with those
+generated by the other supported compilers (GCC and Visual C++). [561]
+
+=item *
+
+Duping socket handles with open(F, ">&MYSOCK") now works under Windows 9x.
+[561]
+
+=item *
+
+Current directory entries in %ENV are now correctly propagated to child
+processes. [561]
+
+=item *
+
+New %ENV entries now propagate to subprocesses. [561]
+
+=item *
+
+Win32::GetCwd() correctly returns C:\ instead of C: when at the drive root.
+Other bugs in chdir() and Cwd::cwd() have also been fixed. [561]
+
+=item *
+
+The makefiles now default to the features enabled in ActiveState ActivePerl
+(a popular Win32 binary distribution). [561]
+
+=item *
+
+HTML files will now be installed in c:\perl\html instead of
+c:\perl\lib\pod\html
+
+=item *
+
+REG_EXPAND_SZ keys are now allowed in registry settings used by perl. [561]
+
+=item *
+
+Can now send() from all threads, not just the first one. [561]
+
+=item *
+
+ExtUtils::MakeMaker now uses $ENV{LIB} to search for libraries. [561]
+
+=item *
+
+Less stack reserved per thread so that more threads can run
+concurrently. (Still 16M per thread.) [561]
+
+=item *
+
+C<< File::Spec->tmpdir() >> now prefers C:/temp over /tmp
+(works better when perl is running as service).
+
+=item *
+
+Better UNC path handling under ithreads. [561]
+
+=item *
+
+wait(), waitpid(), and backticks now return the correct exit status
+under Windows 9x. [561]
+
+=item *
+
+A socket handle leak in accept() has been fixed. [561]
+
+=back
+
+=back
+
+=head1 New or Changed Diagnostics
+
+Please see L<perldiag> for more details.
+
+=over 4
+
+=item *
+
+Ambiguous range in the transliteration operator (like a-z-9) now
+gives a warning.
+
+=item *
+
+chdir("") and chdir(undef) now give a deprecation warning because they
+cause a possible unintentional chdir to the home directory.
+Say chdir() if you really mean that.
+
+=item *
+
+Two new debugging options have been added: if you have compiled your
+Perl with debugging, you can use the -DT [561] and -DR options to trace
+tokenising and to add reference counts to displaying variables,
+respectively.
+
+=item *
+
+The lexical warnings category "deprecated" is no longer a sub-category
+of the "syntax" category. It is now a top-level category in its own
+right.
+
+=item *
+
+Unadorned dump() will now give a warning suggesting to
+use explicit CORE::dump() if that's what really is meant.
+
+=item *
+
+The "Unrecognized escape" warning has been extended to include C<\8>,
+C<\9>, and C<\_>. There is no need to escape any of the C<\w> characters.
+
+=item *
+
+All regular expression compilation error messages are now hopefully
+easier to understand both because the error message now comes before
+the failed regex and because the point of failure is now clearly
+marked by a C<E<lt>-- HERE> marker.
+
+=item *
+
+Various I/O (and socket) functions like binmode(), close(), and so
+forth now more consistently warn if they are used illogically either
+on a yet unopened or on an already closed filehandle (or socket).
+
+=item *
+
+Using lstat() on a filehandle now gives a warning. (It's a non-sensical
+thing to do.)
+
+=item *
+
+The C<-M> and C<-m> options now warn if you didn't supply the module name.
+
+=item *
+
+If you in C<use> specify a required minimum version, modules matching
+the name and but not defining a $VERSION will cause a fatal failure.
+
+=item *
+
+Using negative offset for vec() in lvalue context is now a warnable offense.
+
+=item *
+
+Odd number of arguments to overload::constant now elicits a warning.
+
+=item *
+
+Odd number of elements in anonymous hash now elicits a warning.
+
+=item *
+
+The various "opened only for", "on closed", "never opened" warnings
+drop the C<main::> prefix for filehandles in the C<main> package,
+for example C<STDIN> instead of C<main::STDIN>.
+
+=item *
+
+Subroutine prototypes are now checked more carefully, you may
+get warnings for example if you have used non-prototype characters.
+
+=item *
+
+If an attempt to use a (non-blessed) reference as an array index
+is made, a warning is given.
+
+=item *
+
+C<push @a;> and C<unshift @a;> (with no values to push or unshift)
+now give a warning. This may be a problem for generated and eval'ed
+code.
+
+=item *
+
+If you try to L<perlfunc/pack> a number less than 0 or larger than 255
+using the C<"C"> format you will get an optional warning. Similarly
+for the C<"c"> format and a number less than -128 or more than 127.
+
+=item *
+
+pack C<P> format now demands an explicit size.
+
+=item *
+
+unpack C<w> now warns of unterminated compressed integers.
+
+=item *
+
+Warnings relating to the use of PerlIO have been added.
+
+=item *
+
+Certain regex modifiers such as C<(?o)> make sense only if applied to
+the entire regex. You will get an optional warning if you try to do
+otherwise.
+
+=item *
+
+Variable length lookbehind has not yet been implemented, trying to
+use it will tell that.
+
+=item *
+
+Using arrays or hashes as references (e.g. C<< %foo->{bar} >>
+has been deprecated for a while. Now you will get an optional warning.
+
+=item *
+
+Warnings relating to the use of the new restricted hashes feature
+have been added.
+
+=item *
+
+Self-ties of arrays and hashes are not supported and fatal errors
+will happen even at an attempt to do so.
+
+=item *
+
+Using C<sort> in scalar context now issues an optional warning.
+This didn't do anything useful, as the sort was not performed.
+
+=item *
+
+Using the /g modifier in split() is meaningless and will cause a warning.
+
+=item *
+
+Using splice() past the end of an array now causes a warning.
+
+=item *
+
+Malformed Unicode encodings (UTF-8 and UTF-16) cause a lot of warnings,
+as does trying to use UTF-16 surrogates (which are unimplemented).
+
+=item *
+
+Trying to use Unicode characters on an I/O stream without marking the
+stream's encoding (using open() or binmode()) will cause "Wide character"
+warnings.
+
+=item *
+
+Use of v-strings in use/require causes a (backward) portability warning.
+
+=item *
+
+Warnings relating to the use interpreter threads and their shared data
+have been added.
+
+=back
+
+=head1 Changed Internals
+
+=over 4
+
+=item *
+
+PerlIO is now the default.
+
+=item *
+
+perlapi.pod (a companion to perlguts) now attempts to document the
+internal API.
+
+=item *
+
+You can now build a really minimal perl called microperl.
+Building microperl does not require even running Configure;
+C<make -f Makefile.micro> should be enough. Beware: microperl makes
+many assumptions, some of which may be too bold; the resulting
+executable may crash or otherwise misbehave in wondrous ways.
+For careful hackers only.
+
+=item *
+
+Added rsignal(), whichsig(), do_join(), op_clear, op_null,
+ptr_table_clear(), ptr_table_free(), sv_setref_uv(), and several UTF-8
+interfaces to the publicised API. For the full list of the available
+APIs see L<perlapi>.
+
+=item *
+
+Made possible to propagate customised exceptions via croak()ing.
+
+=item *
+
+Now xsubs can have attributes just like subs. (Well, at least the
+built-in attributes.)
+
+=item *
+
+dTHR and djSP have been obsoleted; the former removed (because it's
+a no-op) and the latter replaced with dSP.
+
+=item *
+
+PERL_OBJECT has been completely removed.
+
+=item *
+
+The MAGIC constants (e.g. C<'P'>) have been macrofied
+(e.g. C<PERL_MAGIC_TIED>) for better source code readability
+and maintainability.
+
+=item *
+
+The regex compiler now maintains a structure that identifies nodes in
+the compiled bytecode with the corresponding syntactic features of the
+original regex expression. The information is attached to the new
+C<offsets> member of the C<struct regexp>. See L<perldebguts> for more
+complete information.
+
+=item *
+
+The C code has been made much more C<gcc -Wall> clean. Some warning
+messages still remain in some platforms, so if you are compiling with
+gcc you may see some warnings about dubious practices. The warnings
+are being worked on.
+
+=item *
+
+F<perly.c>, F<sv.c>, and F<sv.h> have now been extensively commented.
+
+=item *
+
+Documentation on how to use the Perl source repository has been added
+to F<Porting/repository.pod>.
+
+=item *
+
+There are now several profiling make targets.
+
+=back
+
+=head1 Security Vulnerability Closed [561]
+
+(This change was already made in 5.7.0 but bears repeating here.)
+(5.7.0 came out before 5.6.1: the development branch 5.7 released
+earlier than the maintenance branch 5.6)
+
+A potential security vulnerability in the optional suidperl component
+of Perl was identified in August 2000. suidperl is neither built nor
+installed by default. As of November 2001 the only known vulnerable
+platform is Linux, most likely all Linux distributions. CERT and
+various vendors and distributors have been alerted about the vulnerability.
+See http://www.cpan.org/src/5.0/sperl-2000-08-05/sperl-2000-08-05.txt
+for more information.
+
+The problem was caused by Perl trying to report a suspected security
+exploit attempt using an external program, /bin/mail. On Linux
+platforms the /bin/mail program had an undocumented feature which
+when combined with suidperl gave access to a root shell, resulting in
+a serious compromise instead of reporting the exploit attempt. If you
+don't have /bin/mail, or if you have 'safe setuid scripts', or if
+suidperl is not installed, you are safe.
+
+The exploit attempt reporting feature has been completely removed from
+Perl 5.8.0 (and the maintenance release 5.6.1, and it was removed also
+from all the Perl 5.7 releases), so that particular vulnerability
+isn't there anymore. However, further security vulnerabilities are,
+unfortunately, always possible. The suidperl functionality is most
+probably going to be removed in Perl 5.10. In any case, suidperl
+should only be used by security experts who know exactly what they are
+doing and why they are using suidperl instead of some other solution
+such as sudo ( see http://www.courtesan.com/sudo/ ).
+
+=head1 New Tests
+
+Several new tests have been added, especially for the F<lib> and
+F<ext> subsections. There are now about 69 000 individual tests
+(spread over about 700 test scripts), in the regression suite (5.6.1
+has about 11 700 tests, in 258 test scripts) The exact numbers depend
+on the platform and Perl configuration used. Many of the new tests
+are of course introduced by the new modules, but still in general Perl
+is now more thoroughly tested.
+
+Because of the large number of tests, running the regression suite
+will take considerably longer time than it used to: expect the suite
+to take up to 4-5 times longer to run than in perl 5.6. On a really
+fast machine you can hope to finish the suite in about 6-8 minutes
+(wallclock time).
+
+The tests are now reported in a different order than in earlier Perls.
+(This happens because the test scripts from under t/lib have been moved
+to be closer to the library/extension they are testing.)
+
+=head1 Known Problems
+
+=head2 The Compiler Suite Is Still Very Experimental
+
+The compiler suite is slowly getting better but it continues to be
+highly experimental. Use in production environments is discouraged.
+
+=head2 Localising Tied Arrays and Hashes Is Broken
+
+ local %tied_array;
+
+doesn't work as one would expect: the old value is restored
+incorrectly. This will be changed in a future release, but we don't
+know yet what the new semantics will exactly be. In any case, the
+change will break existing code that relies on the current
+(ill-defined) semantics, so just avoid doing this in general.
+
+=head2 Building Extensions Can Fail Because Of Largefiles
+
+Some extensions like mod_perl are known to have issues with
+`largefiles', a change brought by Perl 5.6.0 in which file offsets
+default to 64 bits wide, where supported. Modules may fail to compile
+at all, or they may compile and work incorrectly. Currently, there
+is no good solution for the problem, but Configure now provides
+appropriate non-largefile ccflags, ldflags, libswanted, and libs
+in the %Config hash (e.g., $Config{ccflags_nolargefiles}) so the
+extensions that are having problems can try configuring themselves
+without the largefileness. This is admittedly not a clean solution,
+and the solution may not even work at all. One potential failure is
+whether one can (or, if one can, whether it's a good idea to) link
+together at all binaries with different ideas about file offsets;
+all this is platform-dependent.
+
+=head2 Modifying $_ Inside for(..)
+
+ for (1..5) { $_++ }
+
+works without complaint. It shouldn't. (You should be able to
+modify only lvalue elements inside the loops.) You can see the
+correct behaviour by replacing the 1..5 with 1, 2, 3, 4, 5.
+
+=head2 mod_perl 1.26 Doesn't Build With Threaded Perl
+
+Use mod_perl 1.27 or higher.
+
+=head2 lib/ftmp-security tests warn 'system possibly insecure'
+
+Don't panic. Read the 'make test' section of INSTALL instead.
+
+=head2 libwww-perl (LWP) fails base/date #51
+
+Use libwww-perl 5.65 or later.
+
+=head2 PDL failing some tests
+
+Use PDL 2.3.4 or later.
+
+=head2 Perl_get_sv
+
+You may get errors like 'Undefined symbol "Perl_get_sv"' or "can't
+resolve symbol 'Perl_get_sv'", or the symbol may be "Perl_sv_2pv".
+This probably means that you are trying to use an older shared Perl
+library (or extensions linked with such) with Perl 5.8.0 executable.
+Perl used to have such a subroutine, but that is no more the case.
+Check your shared library path, and any shared Perl libraries in those
+directories.
+
+Sometimes this problem may also indicate a partial Perl 5.8.0
+installation, see L</"Mac OS X dyld undefined symbols"> for an
+example and how to deal with it.
+
+=head2 Self-tying Problems
+
+Self-tying of arrays and hashes is broken in rather deep and
+hard-to-fix ways. As a stop-gap measure to avoid people from getting
+frustrated at the mysterious results (core dumps, most often), it is
+forbidden for now (you will get a fatal error even from an attempt).
+
+A change to self-tying of globs has caused them to be recursively
+referenced (see: L<perlobj/"Two-Phased Garbage Collection">). You
+will now need an explicit untie to destroy a self-tied glob. This
+behaviour may be fixed at a later date.
+
+Self-tying of scalars and IO thingies works.
+
+=head2 ext/threads/t/libc
+
+If this test fails, it indicates that your libc (C library) is not
+threadsafe. This particular test stress tests the localtime() call to
+find out whether it is threadsafe. See L<perlthrtut> for more information.
+
+=head2 Failure of Thread (5.005-style) tests
+
+B<Note that support for 5.005-style threading is deprecated,
+experimental and practically unsupported. In 5.10, it is expected
+to be removed. You should migrate your code to ithreads.>
+
+The following tests are known to fail due to fundamental problems in
+the 5.005 threading implementation. These are not new failures--Perl
+5.005_0x has the same bugs, but didn't have these tests.
+
+ ../ext/B/t/xref.t 255 65280 14 12 85.71% 3-14
+ ../ext/List/Util/t/first.t 255 65280 7 4 57.14% 2 5-7
+ ../lib/English.t 2 512 54 2 3.70% 2-3
+ ../lib/FileCache.t 5 1 20.00% 5
+ ../lib/Filter/Simple/t/data.t 6 3 50.00% 1-3
+ ../lib/Filter/Simple/t/filter_only. 9 3 33.33% 1-2 5
+ ../lib/Math/BigInt/t/bare_mbf.t 1627 4 0.25% 8 11 1626-1627
+ ../lib/Math/BigInt/t/bigfltpm.t 1629 4 0.25% 10 13 1628-
+ 1629
+ ../lib/Math/BigInt/t/sub_mbf.t 1633 4 0.24% 8 11 1632-1633
+ ../lib/Math/BigInt/t/with_sub.t 1628 4 0.25% 9 12 1627-1628
+ ../lib/Tie/File/t/31_autodefer.t 255 65280 65 32 49.23% 34-65
+ ../lib/autouse.t 10 1 10.00% 4
+ op/flip.t 15 1 6.67% 15
+
+These failures are unlikely to get fixed as 5.005-style threads
+are considered fundamentally broken. (Basically what happens is that
+competing threads can corrupt shared global state, one good example
+being regular expression engine's state.)
+
+=head2 Timing problems
+
+The following tests may fail intermittently because of timing
+problems, for example if the system is heavily loaded.
+
+ t/op/alarm.t
+ ext/Time/HiRes/HiRes.t
+ lib/Benchmark.t
+ lib/Memoize/t/expmod_t.t
+ lib/Memoize/t/speed.t
+
+In case of failure please try running them manually, for example
+
+ ./perl -Ilib ext/Time/HiRes/HiRes.t
+
+=head2 Tied/Magical Array/Hash Elements Do Not Autovivify
+
+For normal arrays C<$foo = \$bar[1]> will assign C<undef> to
+C<$bar[1]> (assuming that it didn't exist before), but for
+tied/magical arrays and hashes such autovivification does not happen
+because there is currently no way to catch the reference creation.
+The same problem affects slicing over non-existent indices/keys of
+a tied/magical array/hash.
+
+=head2 Unicode in package/class and subroutine names does not work
+
+One can have Unicode in identifier names, but not in package/class or
+subroutine names. While some limited functionality towards this does
+exist as of Perl 5.8.0, that is more accidental than designed; use of
+Unicode for the said purposes is unsupported.
+
+One reason of this unfinishedness is its (currently) inherent
+unportability: since both package names and subroutine names may
+need to be mapped to file and directory names, the Unicode capability
+of the filesystem becomes important-- and there unfortunately aren't
+portable answers.
+
+=head1 Platform Specific Problems
+
+=head2 AIX
+
+=over 4
+
+=item *
+
+If using the AIX native make command, instead of just "make" issue
+"make all". In some setups the former has been known to spuriously
+also try to run "make install". Alternatively, you may want to use
+GNU make.
+
+=item *
+
+In AIX 4.2, Perl extensions that use C++ functions that use statics
+may have problems in that the statics are not getting initialized.
+In newer AIX releases, this has been solved by linking Perl with
+the libC_r library, but unfortunately in AIX 4.2 the said library
+has an obscure bug where the various functions related to time
+(such as time() and gettimeofday()) return broken values, and
+therefore in AIX 4.2 Perl is not linked against libC_r.
+
+=item *
+
+vac 5.0.0.0 May Produce Buggy Code For Perl
+
+The AIX C compiler vac version 5.0.0.0 may produce buggy code,
+resulting in a few random tests failing when run as part of "make
+test", but when the failing tests are run by hand, they succeed.
+We suggest upgrading to at least vac version 5.0.1.0, that has been
+known to compile Perl correctly. "lslpp -L|grep vac.C" will tell
+you the vac version. See README.aix.
+
+=item *
+
+If building threaded Perl, you may get compilation warning from pp_sys.c:
+
+ "pp_sys.c", line 4651.39: 1506-280 (W) Function argument assignment between types "unsigned char*" and "const void*" is not allowed.
+
+This is harmless; it is caused by the getnetbyaddr() and getnetbyaddr_r()
+having slightly different types for their first argument.
+
+=back
+
+=head2 Alpha systems with old gccs fail several tests
+
+If you see op/pack, op/pat, op/regexp, or ext/Storable tests failing
+in a Linux/alpha or *BSD/Alpha, it's probably time to upgrade your gcc.
+gccs prior to 2.95.3 are definitely not good enough, and gcc 3.1 may
+be even better. (RedHat Linux/alpha with gcc 3.1 reported no problems,
+as did Linux 2.4.18 with gcc 2.95.4.) (In Tru64, it is preferable to
+use the bundled C compiler.)
+
+=head2 AmigaOS
+
+Perl 5.8.0 doesn't build in AmigaOS. It broke at some point during
+the ithreads work and we could not find Amiga experts to unbreak the
+problems. Perl 5.6.1 still works for AmigaOS (as does the 5.7.2
+development release).
+
+=head2 BeOS
+
+The following tests fail on 5.8.0 Perl in BeOS Personal 5.03:
+
+ t/op/lfs............................FAILED at test 17
+ t/op/magic..........................FAILED at test 24
+ ext/Fcntl/t/syslfs..................FAILED at test 17
+ ext/File/Glob/t/basic...............FAILED at test 3
+ ext/POSIX/t/sigaction...............FAILED at test 13
+ ext/POSIX/t/waitpid.................FAILED at test 1
+
+See L<perlbeos> (README.beos) for more details.
+
+=head2 Cygwin "unable to remap"
+
+For example when building the Tk extension for Cygwin,
+you may get an error message saying "unable to remap".
+This is known problem with Cygwin, and a workaround is
+detailed in here: http://sources.redhat.com/ml/cygwin/2001-12/msg00894.html
+
+=head2 Cygwin ndbm tests fail on FAT
+
+One can build but not install (or test the build of) the NDBM_File
+on FAT filesystems. Installation (or build) on NTFS works fine.
+If one attempts the test on a FAT install (or build) the following
+failures are expected:
+
+ ../ext/NDBM_File/ndbm.t 13 3328 71 59 83.10% 1-2 4 16-71
+ ../ext/ODBM_File/odbm.t 255 65280 ?? ?? % ??
+ ../lib/AnyDBM_File.t 2 512 12 2 16.67% 1 4
+ ../lib/Memoize/t/errors.t 0 139 11 5 45.45% 7-11
+ ../lib/Memoize/t/tie_ndbm.t 13 3328 4 4 100.00% 1-4
+ run/fresh_perl.t 97 1 1.03% 91
+
+NDBM_File fails and ODBM_File just coredumps.
+
+If you intend to run only on FAT (or if using AnyDBM_File on FAT),
+run Configure with the -Ui_ndbm and -Ui_dbm options to prevent
+NDBM_File and ODBM_File being built.
+
+=head2 DJGPP Failures
+
+ t/op/stat............................FAILED at test 29
+ lib/File/Find/t/find.................FAILED at test 1
+ lib/File/Find/t/taint................FAILED at test 1
+ lib/h2xs.............................FAILED at test 15
+ lib/Pod/t/eol........................FAILED at test 1
+ lib/Test/Harness/t/strap-analyze.....FAILED at test 8
+ lib/Test/Harness/t/test-harness......FAILED at test 23
+ lib/Test/Simple/t/exit...............FAILED at test 1
+
+The above failures are known as of 5.8.0 with native builds with long
+filenames, but there are a few more if running under dosemu because of
+limitations (and maybe bugs) of dosemu:
+
+ t/comp/cpp...........................FAILED at test 3
+ t/op/inccode.........................(crash)
+
+and a few lib/ExtUtils tests, and several hundred Encode/t/Aliases.t
+failures that work fine with long filenames. So you really might
+prefer native builds and long filenames.
+
+=head2 FreeBSD built with ithreads coredumps reading large directories
+
+This is a known bug in FreeBSD 4.5's readdir_r(), it has been fixed in
+FreeBSD 4.6 (see L<perlfreebsd> (README.freebsd)).
+
+=head2 FreeBSD Failing locale Test 117 For ISO 8859-15 Locales
+
+The ISO 8859-15 locales may fail the locale test 117 in FreeBSD.
+This is caused by the characters \xFF (y with diaeresis) and \xBE
+(Y with diaeresis) not behaving correctly when being matched
+case-insensitively. Apparently this problem has been fixed in
+the latest FreeBSD releases.
+( http://www.freebsd.org/cgi/query-pr.cgi?pr=34308 )
+
+=head2 IRIX fails ext/List/Util/t/shuffle.t or Digest::MD5
+
+IRIX with MIPSpro 7.3.1.2m or 7.3.1.3m compiler may fail the List::Util
+test ext/List/Util/t/shuffle.t by dumping core. This seems to be
+a compiler error since if compiled with gcc no core dump ensues, and
+no failures have been seen on the said test on any other platform.
+
+Similarly, building the Digest::MD5 extension has been
+known to fail with "*** Termination code 139 (bu21)".
+
+The cure is to drop optimization level (Configure -Doptimize=-O2).
+
+=head2 HP-UX lib/posix Subtest 9 Fails When LP64-Configured
+
+If perl is configured with -Duse64bitall, the successful result of the
+subtest 10 of lib/posix may arrive before the successful result of the
+subtest 9, which confuses the test harness so much that it thinks the
+subtest 9 failed.
+
+=head2 Linux with glibc 2.2.5 fails t/op/int subtest #6 with -Duse64bitint
+
+This is a known bug in the glibc 2.2.5 with long long integers.
+( http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=65612 )
+
+=head2 Linux With Sfio Fails op/misc Test 48
+
+No known fix.
+
+=head2 Mac OS X
+
+Please remember to set your environment variable LC_ALL to "C"
+(setenv LC_ALL C) before running "make test" to avoid a lot of
+warnings about the broken locales of Mac OS X.
+
+The following tests are known to fail in Mac OS X 10.1.5 because of
+buggy (old) implementations of Berkeley DB included in Mac OS X:
+
+ Failed Test Stat Wstat Total Fail Failed List of Failed
+ -------------------------------------------------------------------------
+ ../ext/DB_File/t/db-btree.t 0 11 ?? ?? % ??
+ ../ext/DB_File/t/db-recno.t 149 3 2.01% 61 63 65
+
+If you are building on a UFS partition, you will also probably see
+t/op/stat.t subtest #9 fail. This is caused by Darwin's UFS not
+supporting inode change time.
+
+Also the ext/POSIX/t/posix.t subtest #10 fails but it is skipped for
+now because the failure is Apple's fault, not Perl's (blocked signals
+are lost).
+
+If you Configure with ithreads, ext/threads/t/libc.t will fail. Again,
+this is not Perl's fault-- the libc of Mac OS X is not threadsafe
+(in this particular test, the localtime() call is found to be
+threadunsafe.)
+
+=head2 Mac OS X dyld undefined symbols
+
+If after installing Perl 5.8.0 you are getting warnings about missing
+symbols, for example
+
+ dyld: perl Undefined symbols
+ _perl_sv_2pv
+ _perl_get_sv
+
+you probably have an old pre-Perl-5.8.0 installation (or parts of one)
+in /Library/Perl (the undefined symbols used to exist in pre-5.8.0 Perls).
+It seems that for some reason "make install" doesn't always completely
+overwrite the files in /Library/Perl. You can move the old Perl
+shared library out of the way like this:
+
+ cd /Library/Perl/darwin/CORE
+ mv libperl.dylib libperlold.dylib
+
+and then reissue "make install". Note that the above of course is
+extremely disruptive for anything using the /usr/local/bin/perl.
+If that doesn't help, you may have to try removing all the .bundle
+files from beneath /Library/Perl, and again "make install"-ing.
+
+=head2 OS/2 Test Failures
+
+The following tests are known to fail on OS/2 (for clarity
+only the failures are shown, not the full error messages):
+
+ ../lib/ExtUtils/t/Mkbootstrap.t 1 256 18 1 5.56% 8
+ ../lib/ExtUtils/t/Packlist.t 1 256 34 1 2.94% 17
+ ../lib/ExtUtils/t/basic.t 1 256 17 1 5.88% 14
+ lib/os2_process.t 2 512 227 2 0.88% 174 209
+ lib/os2_process_kid.t 227 2 0.88% 174 209
+ lib/rx_cmprt.t 255 65280 18 3 16.67% 16-18
+
+=head2 op/sprintf tests 91, 129, and 130
+
+The op/sprintf tests 91, 129, and 130 are known to fail on some platforms.
+Examples include any platform using sfio, and Compaq/Tandem's NonStop-UX.
+
+Test 91 is known to fail on QNX6 (nto), because C<sprintf '%e',0>
+incorrectly produces C<0.000000e+0> instead of C<0.000000e+00>.
+
+For tests 129 and 130, the failing platforms do not comply with
+the ANSI C Standard: lines 19ff on page 134 of ANSI X3.159 1989, to
+be exact. (They produce something other than "1" and "-1" when
+formatting 0.6 and -0.6 using the printf format "%.0f"; most often,
+they produce "0" and "-0".)
+
+=head2 SCO
+
+The socketpair tests are known to be unhappy in SCO 3.2v5.0.4:
+
+ ext/Socket/socketpair.t...............FAILED tests 15-45
+
+=head2 Solaris 2.5
+
+In case you are still using Solaris 2.5 (aka SunOS 5.5), you may
+experience failures (the test core dumping) in lib/locale.t.
+The suggested cure is to upgrade your Solaris.
+
+=head2 Solaris x86 Fails Tests With -Duse64bitint
+
+The following tests are known to fail in Solaris x86 with Perl
+configured to use 64 bit integers:
+
+ ext/Data/Dumper/t/dumper.............FAILED at test 268
+ ext/Devel/Peek/Peek..................FAILED at test 7
+
+=head2 SUPER-UX (NEC SX)
+
+The following tests are known to fail on SUPER-UX:
+
+ op/64bitint...........................FAILED tests 29-30, 32-33, 35-36
+ op/arith..............................FAILED tests 128-130
+ op/pack...............................FAILED tests 25-5625
+ op/pow................................
+ op/taint..............................# msgsnd failed
+ ../ext/IO/lib/IO/t/io_poll............FAILED tests 3-4
+ ../ext/IPC/SysV/ipcsysv...............FAILED tests 2, 5-6
+ ../ext/IPC/SysV/t/msg.................FAILED tests 2, 4-6
+ ../ext/Socket/socketpair..............FAILED tests 12
+ ../lib/IPC/SysV.......................FAILED tests 2, 5-6
+ ../lib/warnings.......................FAILED tests 115-116, 118-119
+
+The op/pack failure ("Cannot compress negative numbers at op/pack.t line 126")
+is serious but as of yet unsolved. It points at some problems with the
+signedness handling of the C compiler, as do the 64bitint, arith, and pow
+failures. Most of the rest point at problems with SysV IPC.
+
+=head2 Term::ReadKey not working on Win32
+
+Use Term::ReadKey 2.20 or later.
+
+=head2 UNICOS/mk
+
+=over 4
+
+=item *
+
+During Configure, the test
+
+ Guessing which symbols your C compiler and preprocessor define...
+
+will probably fail with error messages like
+
+ CC-20 cc: ERROR File = try.c, Line = 3
+ The identifier "bad" is undefined.
+
+ bad switch yylook 79bad switch yylook 79bad switch yylook 79bad switch yylook 79#ifdef A29K
+ ^
+
+ CC-65 cc: ERROR File = try.c, Line = 3
+ A semicolon is expected at this point.
+
+This is caused by a bug in the awk utility of UNICOS/mk. You can ignore
+the error, but it does cause a slight problem: you cannot fully
+benefit from the h2ph utility (see L<h2ph>) that can be used to
+convert C headers to Perl libraries, mainly used to be able to access
+from Perl the constants defined using C preprocessor, cpp. Because of
+the above error, parts of the converted headers will be invisible.
+Luckily, these days the need for h2ph is rare.
+
+=item *
+
+If building Perl with interpreter threads (ithreads), the
+getgrent(), getgrnam(), and getgrgid() functions cannot return the
+list of the group members due to a bug in the multithreaded support of
+UNICOS/mk. What this means is that in list context the functions will
+return only three values, not four.
+
+=back
+
+=head2 UTS
+
+There are a few known test failures, see L<perluts> (README.uts).
+
+=head2 VOS (Stratus)
+
+When Perl is built using the native build process on VOS Release
+14.5.0 and GNU C++/GNU Tools 2.0.1, all attempted tests either
+pass or result in TODO (ignored) failures.
+
+=head2 VMS
+
+There should be no reported test failures with a default configuration,
+though there are a number of tests marked TODO that point to areas
+needing further debugging and/or porting work.
+
+=head2 Win32
+
+In multi-CPU boxes, there are some problems with the I/O buffering:
+some output may appear twice.
+
+=head2 XML::Parser not working
+
+Use XML::Parser 2.31 or later.
+
+=head2 z/OS (OS/390)
+
+z/OS has rather many test failures but the situation is actually much
+better than it was in 5.6.0; it's just that so many new modules and
+tests have been added.
+
+ Failed Test Stat Wstat Total Fail Failed List of Failed
+ ---------------------------------------------------------------------------
+ ../ext/Data/Dumper/t/dumper.t 357 8 2.24% 311 314 325 327
+ 331 333 337 339
+ ../ext/IO/lib/IO/t/io_unix.t 5 4 80.00% 2-5
+ ../ext/Storable/t/downgrade.t 12 3072 169 12 7.10% 14-15 46-47 78-79
+ 110-111 150 161
+ ../lib/ExtUtils/t/Constant.t 121 30976 48 48 100.00% 1-48
+ ../lib/ExtUtils/t/Embed.t 9 9 100.00% 1-9
+ op/pat.t 922 7 0.76% 665 776 785 832-
+ 834 845
+ op/sprintf.t 224 3 1.34% 98 100 136
+ op/tr.t 97 5 5.15% 63 71-74
+ uni/fold.t 780 6 0.77% 61 169 196 661
+ 710-711
+
+The failures in dumper.t and downgrade.t are problems in the tests,
+those in io_unix and sprintf are problems in the USS (UDP sockets and
+printf formats). The pat, tr, and fold failures are genuine Perl
+problems caused by EBCDIC (and in the pat and fold cases, combining
+that with Unicode). The Constant and Embed are probably problems in
+the tests (since they test Perl's ability to build extensions, and
+that seems to be working reasonably well.)
+
+=head2 Unicode Support on EBCDIC Still Spotty
+
+Though mostly working, Unicode support still has problem spots on
+EBCDIC platforms. One such known spot are the C<\p{}> and C<\P{}>
+regular expression constructs for code points less than 256: the
+C<pP> are testing for Unicode code points, not knowing about EBCDIC.
+
+=head2 Seen In Perl 5.7 But Gone Now
+
+C<Time::Piece> (previously known as C<Time::Object>) was removed
+because it was felt that it didn't have enough value in it to be a
+core module. It is still a useful module, though, and is available
+from the CPAN.
+
+Perl 5.8 unfortunately does not build anymore on AmigaOS; this broke
+accidentally at some point. Since there are not that many Amiga
+developers available, we could not get this fixed and tested in time
+for 5.8.0. Perl 5.6.1 still works for AmigaOS (as does the 5.7.2
+development release).
+
+The C<PerlIO::Scalar> and C<PerlIO::Via> (capitalised) were renamed as
+C<PerlIO::scalar> and C<PerlIO::via> (all lowercase) just before 5.8.0.
+The main rationale was to have all core PerlIO layers to have all
+lowercase names. The "plugins" are named as usual, for example
+C<PerlIO::via::QuotedPrint>.
+
+The C<threads::shared::queue> and C<threads::shared::semaphore> were
+renamed as C<Thread::Queue> and C<Thread::Semaphore> just before 5.8.0.
+The main rationale was to have thread modules to obey normal naming,
+C<Thread::> (the C<threads> and C<threads::shared> themselves are
+more pragma-like, they affect compile-time, so they stay lowercase).
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/ . There may also be
+information at http://www.perl.com/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Jarkko Hietaniemi <F<jhi@iki.fi>>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl590delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl590delta.pod
new file mode 100755
index 00000000000..db6f5995977
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl590delta.pod
@@ -0,0 +1,1015 @@
+=head1 NAME
+
+perl590delta - what is new for perl v5.9.0
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.0 release and
+the 5.9.0 release.
+
+=head1 Incompatible Changes
+
+=head2 Hash Randomisation
+
+Mainly due to security reasons, the "random ordering" of hashes
+has been made even more random. Previously while the order of hash
+elements from keys(), values(), and each() was essentially random,
+it was still repeatable. Now, however, the order varies between
+different runs of Perl.
+
+B<Perl has never guaranteed any ordering of the hash keys>, and the
+ordering has already changed several times during the lifetime of
+Perl 5. Also, the ordering of hash keys has always been, and
+continues to be, affected by the insertion order.
+
+The added randomness may affect applications.
+
+One possible scenario is when output of an application has included
+hash data. For example, if you have used the Data::Dumper module to
+dump data into different files, and then compared the files to see
+whether the data has changed, now you will have false positives since
+the order in which hashes are dumped will vary. In general the cure
+is to sort the keys (or the values); in particular for Data::Dumper to
+use the C<Sortkeys> option. If some particular order is really
+important, use tied hashes: for example the Tie::IxHash module
+which by default preserves the order in which the hash elements
+were added.
+
+More subtle problem is reliance on the order of "global destruction".
+That is what happens at the end of execution: Perl destroys all data
+structures, including user data. If your destructors (the DESTROY
+subroutines) have assumed any particular ordering to the global
+destruction, there might be problems ahead. For example, in a
+destructor of one object you cannot assume that objects of any other
+class are still available, unless you hold a reference to them.
+If the environment variable PERL_DESTRUCT_LEVEL is set to a non-zero
+value, or if Perl is exiting a spawned thread, it will also destruct
+the ordinary references and the symbol tables that are no longer in use.
+You can't call a class method or an ordinary function on a class that
+has been collected that way.
+
+The hash randomisation is certain to reveal hidden assumptions about
+some particular ordering of hash elements, and outright bugs: it
+revealed a few bugs in the Perl core and core modules.
+
+To disable the hash randomisation in runtime, set the environment
+variable PERL_HASH_SEED to 0 (zero) before running Perl (for more
+information see L<perlrun/PERL_HASH_SEED>), or to disable the feature
+completely in compile time, compile with C<-DNO_HASH_SEED> (see F<INSTALL>).
+
+See L<perlsec/"Algorithmic Complexity Attacks"> for the original
+rationale behind this change.
+
+=head2 UTF-8 On Filehandles No Longer Activated By Locale
+
+In Perl 5.8.0 all filehandles, including the standard filehandles,
+were implicitly set to be in Unicode UTF-8 if the locale settings
+indicated the use of UTF-8. This feature caused too many problems,
+so the feature was turned off and redesigned: see L</"Core Enhancements">.
+
+=head2 Single-number v-strings are no longer v-strings before "=>"
+
+The version strings or v-strings (see L<perldata/"Version Strings">)
+feature introduced in Perl 5.6.0 has been a source of some confusion--
+especially when the user did not want to use it, but Perl thought it
+knew better. Especially troublesome has been the feature that before
+a "=>" a version string (a "v" followed by digits) has been interpreted
+as a v-string instead of a string literal. In other words:
+
+ %h = ( v65 => 42 );
+
+has meant since Perl 5.6.0
+
+ %h = ( 'A' => 42 );
+
+(at least in platforms of ASCII progeny) Perl 5.8.1 restored the
+more natural interpretation
+
+ %h = ( 'v65' => 42 );
+
+The multi-number v-strings like v65.66 and 65.66.67 still continue to
+be v-strings in Perl 5.8.
+
+=head2 (Win32) The -C Switch Has Been Repurposed
+
+The -C switch has changed in an incompatible way. The old semantics
+of this switch only made sense in Win32 and only in the "use utf8"
+universe in 5.6.x releases, and do not make sense for the Unicode
+implementation in 5.8.0. Since this switch could not have been used
+by anyone, it has been repurposed. The behavior that this switch
+enabled in 5.6.x releases may be supported in a transparent,
+data-dependent fashion in a future release.
+
+For the new life of this switch, see L<"UTF-8 no longer default under
+UTF-8 locales">, and L<perlrun/-C>.
+
+=head2 (Win32) The /d Switch Of cmd.exe
+
+Since version 5.8.1, perl uses the /d switch when running the cmd.exe shell
+internally for system(), backticks, and when opening pipes to external
+programs. The extra switch disables the execution of AutoRun commands
+from the registry, which is generally considered undesirable when
+running external programs. If you wish to retain compatibility with
+the older behavior, set PERL5SHELL in your environment to C<cmd /x/c>.
+
+=head2 The C<$*> variable has been removed
+
+C<$*>, which was deprecated in favor of the C</s> and C</m> regexp
+modifiers, has been removed.
+
+=head1 Core Enhancements
+
+=head2 Assertions
+
+Perl 5.9.0 has experimental support for assertions. Note that the user
+interface is not fully stabilized yet, and it may change until the 5.10.0
+release. A new command-line switch, B<-A>, is used to activate
+assertions, which are declared with the C<assertions> pragma. See
+L<assertions>.
+
+=head2 Defined-or operators
+
+A new operator C<//> (defined-or) has been implemented.
+The following statement:
+
+ $a // $b
+
+is merely equivalent to
+
+ defined $a ? $a : $b
+
+and
+
+ $c //= $d;
+
+can be used instead of
+
+ $c = $d unless defined $c;
+
+This operator has the same precedence and associativity as C<||>.
+It has a low-precedence counterpart, C<err>, which has the same precedence
+and associativity as C<or>. Special care has been taken to ensure that
+those operators Do What You Mean while not breaking old code, but some
+edge cases involving the empty regular expression may now parse
+differently. See L<perlop> for details.
+
+=head2 UTF-8 no longer default under UTF-8 locales
+
+In Perl 5.8.0 many Unicode features were introduced. One of them
+was found to be of more nuisance than benefit: the automagic
+(and silent) "UTF-8-ification" of filehandles, including the
+standard filehandles, if the user's locale settings indicated
+use of UTF-8.
+
+For example, if you had C<en_US.UTF-8> as your locale, your STDIN and
+STDOUT were automatically "UTF-8", in other words an implicit
+binmode(..., ":utf8") was made. This meant that trying to print, say,
+chr(0xff), ended up printing the bytes 0xc3 0xbf. Hardly what
+you had in mind unless you were aware of this feature of Perl 5.8.0.
+The problem is that the vast majority of people weren't: for example
+in RedHat releases 8 and 9 the B<default> locale setting is UTF-8, so
+all RedHat users got UTF-8 filehandles, whether they wanted it or not.
+The pain was intensified by the Unicode implementation of Perl 5.8.0
+(still) having nasty bugs, especially related to the use of s/// and
+tr///. (Bugs that have been fixed in 5.8.1)
+
+Therefore a decision was made to backtrack the feature and change it
+from implicit silent default to explicit conscious option. The new
+Perl command line option C<-C> and its counterpart environment
+variable PERL_UNICODE can now be used to control how Perl and Unicode
+interact at interfaces like I/O and for example the command line
+arguments. See L<perlrun/-C> and L<perlrun/PERL_UNICODE> for more
+information.
+
+=head2 Unsafe signals again available
+
+In Perl 5.8.0 the so-called "safe signals" were introduced. This
+means that Perl no longer handles signals immediately but instead
+"between opcodes", when it is safe to do so. The earlier immediate
+handling easily could corrupt the internal state of Perl, resulting
+in mysterious crashes.
+
+However, the new safer model has its problems too. Because now an
+opcode, a basic unit of Perl execution, is never interrupted but
+instead let to run to completion, certain operations that can take a
+long time now really do take a long time. For example, certain
+network operations have their own blocking and timeout mechanisms, and
+being able to interrupt them immediately would be nice.
+
+Therefore perl 5.8.1 introduced a "backdoor" to restore the pre-5.8.0
+(pre-5.7.3, really) signal behaviour. Just set the environment variable
+PERL_SIGNALS to C<unsafe>, and the old immediate (and unsafe)
+signal handling behaviour returns. See L<perlrun/PERL_SIGNALS>
+and L<perlipc/"Deferred Signals (Safe Signals)">.
+
+In completely unrelated news, you can now use safe signals with
+POSIX::SigAction. See L<POSIX/POSIX::SigAction>.
+
+=head2 Tied Arrays with Negative Array Indices
+
+Formerly, the indices passed to C<FETCH>, C<STORE>, C<EXISTS>, and
+C<DELETE> methods in tied array class were always non-negative. If
+the actual argument was negative, Perl would call FETCHSIZE implicitly
+and add the result to the index before passing the result to the tied
+array method. This behaviour is now optional. If the tied array class
+contains a package variable named C<$NEGATIVE_INDICES> which is set to
+a true value, negative values will be passed to C<FETCH>, C<STORE>,
+C<EXISTS>, and C<DELETE> unchanged.
+
+=head2 local ${$x}
+
+The syntaxes
+
+ local ${$x}
+ local @{$x}
+ local %{$x}
+
+now do localise variables, given that the $x is a valid variable name.
+
+=head2 Unicode Character Database 4.0.0
+
+The copy of the Unicode Character Database included in Perl 5.8 has
+been updated to 4.0.0 from 3.2.0. This means for example that the
+Unicode character properties are as in Unicode 4.0.0.
+
+=head2 Miscellaneous Enhancements
+
+C<unpack()> now defaults to unpacking the C<$_>.
+
+C<map> in void context is no longer expensive. C<map> is now context
+aware, and will not construct a list if called in void context.
+
+If a socket gets closed by the server while printing to it, the client
+now gets a SIGPIPE. While this new feature was not planned, it fell
+naturally out of PerlIO changes, and is to be considered an accidental
+feature.
+
+PerlIO::get_layers(FH) returns the names of the PerlIO layers
+active on a filehandle.
+
+PerlIO::via layers can now have an optional UTF8 method to
+indicate whether the layer wants to "auto-:utf8" the stream.
+
+utf8::is_utf8() has been added as a quick way to test whether
+a scalar is encoded internally in UTF-8 (Unicode).
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules And Pragmata
+
+The following modules and pragmata have been updated since Perl 5.8.0:
+
+=over 4
+
+=item base
+
+=item B::Bytecode
+
+In much better shape than it used to be. Still far from perfect, but
+maybe worth a try.
+
+=item B::Concise
+
+=item B::Deparse
+
+=item Benchmark
+
+An optional feature, C<:hireswallclock>, now allows for high
+resolution wall clock times (uses Time::HiRes).
+
+=item ByteLoader
+
+See B::Bytecode.
+
+=item bytes
+
+Now has bytes::substr.
+
+=item CGI
+
+=item charnames
+
+One can now have custom character name aliases.
+
+=item CPAN
+
+There is now a simple command line frontend to the CPAN.pm
+module called F<cpan>.
+
+=item Data::Dumper
+
+A new option, Pair, allows choosing the separator between hash keys
+and values.
+
+=item DB_File
+
+=item Devel::PPPort
+
+=item Digest::MD5
+
+=item Encode
+
+Significant updates on the encoding pragma functionality
+(tr/// and the DATA filehandle, formats).
+
+If a filehandle has been marked as to have an encoding, unmappable
+characters are detected already during input, not later (when the
+corrupted data is being used).
+
+The ISO 8859-6 conversion table has been corrected (the 0x30..0x39
+erroneously mapped to U+0660..U+0669, instead of U+0030..U+0039). The
+GSM 03.38 conversion did not handle escape sequences correctly. The
+UTF-7 encoding has been added (making Encode feature-complete with
+Unicode::String).
+
+=item fields
+
+=item libnet
+
+=item Math::BigInt
+
+A lot of bugs have been fixed since v1.60, the version included in Perl
+v5.8.0. Especially noteworthy are the bug in Calc that caused div and mod to
+fail for some large values, and the fixes to the handling of bad inputs.
+
+Some new features were added, e.g. the broot() method, you can now pass
+parameters to config() to change some settings at runtime, and it is now
+possible to trap the creation of NaN and infinity.
+
+As usual, some optimizations took place and made the math overall a tad
+faster. In some cases, quite a lot faster, actually. Especially alternative
+libraries like Math::BigInt::GMP benefit from this. In addition, a lot of the
+quite clunky routines like fsqrt() and flog() are now much much faster.
+
+=item MIME::Base64
+
+=item NEXT
+
+Diamond inheritance now works.
+
+=item Net::Ping
+
+=item PerlIO::scalar
+
+Reading from non-string scalars (like the special variables, see
+L<perlvar>) now works.
+
+=item podlators
+
+=item Pod::LaTeX
+
+=item PodParsers
+
+=item Pod::Perldoc
+
+Complete rewrite. As a side-effect, no longer refuses to startup when
+run by root.
+
+=item Scalar::Util
+
+New utilities: refaddr, isvstring, looks_like_number, set_prototype.
+
+=item Storable
+
+Can now store code references (via B::Deparse, so not foolproof).
+
+=item strict
+
+Earlier versions of the strict pragma did not check the parameters
+implicitly passed to its "import" (use) and "unimport" (no) routine.
+This caused the false idiom such as:
+
+ use strict qw(@ISA);
+ @ISA = qw(Foo);
+
+This however (probably) raised the false expectation that the strict
+refs, vars and subs were being enforced (and that @ISA was somehow
+"declared"). But the strict refs, vars, and subs are B<not> enforced
+when using this false idiom.
+
+Starting from Perl 5.8.1, the above B<will> cause an error to be
+raised. This may cause programs which used to execute seemingly
+correctly without warnings and errors to fail when run under 5.8.1.
+This happens because
+
+ use strict qw(@ISA);
+
+will now fail with the error:
+
+ Unknown 'strict' tag(s) '@ISA'
+
+The remedy to this problem is to replace this code with the correct idiom:
+
+ use strict;
+ use vars qw(@ISA);
+ @ISA = qw(Foo);
+
+=item Term::ANSIcolor
+
+=item Test::Harness
+
+Now much more picky about extra or missing output from test scripts.
+
+=item Test::More
+
+=item Test::Simple
+
+=item Text::Balanced
+
+=item Time::HiRes
+
+Use of nanosleep(), if available, allows mixing subsecond sleeps with
+alarms.
+
+=item threads
+
+Several fixes, for example for join() problems and memory
+leaks. In some platforms (like Linux) that use glibc the minimum memory
+footprint of one ithread has been reduced by several hundred kilobytes.
+
+=item threads::shared
+
+Many memory leaks have been fixed.
+
+=item Unicode::Collate
+
+=item Unicode::Normalize
+
+=item Win32::GetFolderPath
+
+=item Win32::GetOSVersion
+
+Now returns extra information.
+
+=back
+
+=head1 Utility Changes
+
+The C<h2xs> utility now produces a more modern layout:
+F<Foo-Bar/lib/Foo/Bar.pm> instead of F<Foo/Bar/Bar.pm>.
+Also, the boilerplate test is now called F<t/Foo-Bar.t>
+instead of F<t/1.t>.
+
+The Perl debugger (F<lib/perl5db.pl>) has now been extensively
+documented and bugs found while documenting have been fixed.
+
+C<perldoc> has been rewritten from scratch to be more robust and
+feature rich.
+
+C<perlcc -B> works now at least somewhat better, while C<perlcc -c>
+is rather more broken. (The Perl compiler suite as a whole continues
+to be experimental.)
+
+=head1 New Documentation
+
+perl573delta has been added to list the differences between the
+(now quite obsolete) development releases 5.7.2 and 5.7.3.
+
+perl58delta and perl581delta have been added: these are the perldeltas
+of 5.8.0 and 5.8.1, detailing the differences respectively between
+5.6.0 and 5.8.0, and between 5.8.0 and 5.8.1.
+
+perlartistic has been added: it is the Artistic License in pod format,
+making it easier for modules to refer to it.
+
+perlcheat has been added: it is a Perl cheat sheet.
+
+perlgpl has been added: it is the GNU General Public License in pod
+format, making it easier for modules to refer to it.
+
+perlmacosx has been added to tell about the installation and use
+of Perl in Mac OS X.
+
+perlos400 has been added to tell about the installation and use
+of Perl in OS/400 PASE.
+
+perlreref has been added: it is a regular expressions quick reference.
+
+=head1 Installation and Configuration Improvements
+
+The UNIX standard Perl location, F</usr/bin/perl>, is no longer
+overwritten by default if it exists. This change was very prudent
+because so many UNIX vendors already provide a F</usr/bin/perl>,
+but simultaneously many system utilities may depend on that
+exact version of Perl, so better not to overwrite it.
+
+One can now specify installation directories for site and vendor man
+and HTML pages, and site and vendor scripts. See F<INSTALL>.
+
+One can now specify a destination directory for Perl installation
+by specifying the DESTDIR variable for C<make install>. (This feature
+is slightly different from the previous C<Configure -Dinstallprefix=...>.)
+See F<INSTALL>.
+
+gcc versions 3.x introduced a new warning that caused a lot of noise
+during Perl compilation: C<gcc -Ialreadyknowndirectory (warning:
+changing search order)>. This warning has now been avoided by
+Configure weeding out such directories before the compilation.
+
+One can now build subsets of Perl core modules by using the
+Configure flags C<-Dnoextensions=...> and C<-Donlyextensions=...>,
+see F<INSTALL>.
+
+=head2 Platform-specific enhancements
+
+In Cygwin Perl can now be built with threads (C<Configure -Duseithreads>).
+This works with both Cygwin 1.3.22 and Cygwin 1.5.3.
+
+In newer FreeBSD releases Perl 5.8.0 compilation failed because of
+trying to use F<malloc.h>, which in FreeBSD is just a dummy file, and
+a fatal error to even try to use. Now F<malloc.h> is not used.
+
+Perl is now known to build also in Hitachi HI-UXMPP.
+
+Perl is now known to build again in LynxOS.
+
+Mac OS X now installs with Perl version number embedded in
+installation directory names for easier upgrading of user-compiled
+Perl, and the installation directories in general are more standard.
+In other words, the default installation no longer breaks the
+Apple-provided Perl. On the other hand, with C<Configure -Dprefix=/usr>
+you can now really replace the Apple-supplied Perl (B<please be careful>).
+
+Mac OS X now builds Perl statically by default. This change was done
+mainly for faster startup times. The Apple-provided Perl is still
+dynamically linked and shared, and you can enable the sharedness for
+your own Perl builds by C<Configure -Duseshrplib>.
+
+Perl has been ported to IBM's OS/400 PASE environment. The best way
+to build a Perl for PASE is to use an AIX host as a cross-compilation
+environment. See README.os400.
+
+Yet another cross-compilation option has been added: now Perl builds
+on OpenZaurus, an Linux distribution based on Mandrake + Embedix for
+the Sharp Zaurus PDA. See the Cross/README file.
+
+Tru64 when using gcc 3 drops the optimisation for F<toke.c> to C<-O2>
+because of gigantic memory use with the default C<-O3>.
+
+Tru64 can now build Perl with the newer Berkeley DBs.
+
+Building Perl on WinCE has been much enhanced, see F<README.ce>
+and F<README.perlce>.
+
+=head1 Selected Bug Fixes
+
+=head2 Closures, eval and lexicals
+
+There have been many fixes in the area of anonymous subs, lexicals and
+closures. Although this means that Perl is now more "correct", it is
+possible that some existing code will break that happens to rely on
+the faulty behaviour. In practice this is unlikely unless your code
+contains a very complex nesting of anonymous subs, evals and lexicals.
+
+=head2 Generic fixes
+
+If an input filehandle is marked C<:utf8> and Perl sees illegal UTF-8
+coming in when doing C<< <FH> >>, if warnings are enabled a warning is
+immediately given - instead of being silent about it and Perl being
+unhappy about the broken data later. (The C<:encoding(utf8)> layer
+also works the same way.)
+
+binmode(SOCKET, ":utf8") only worked on the input side, not on the
+output side of the socket. Now it works both ways.
+
+For threaded Perls certain system database functions like getpwent()
+and getgrent() now grow their result buffer dynamically, instead of
+failing. This means that at sites with lots of users and groups the
+functions no longer fail by returning only partial results.
+
+Perl 5.8.0 had accidentally broken the capability for users
+to define their own uppercase<->lowercase Unicode mappings
+(as advertised by the Camel). This feature has been fixed and
+is also documented better.
+
+In 5.8.0 this
+
+ $some_unicode .= <FH>;
+
+didn't work correctly but instead corrupted the data. This has now
+been fixed.
+
+Tied methods like FETCH etc. may now safely access tied values, i.e.
+resulting in a recursive call to FETCH etc. Remember to break the
+recursion, though.
+
+At startup Perl blocks the SIGFPE signal away since there isn't much
+Perl can do about it. Previously this blocking was in effect also for
+programs executed from within Perl. Now Perl restores the original
+SIGFPE handling routine, whatever it was, before running external
+programs.
+
+Linenumbers in Perl scripts may now be greater than 65536, or 2**16.
+(Perl scripts have always been able to be larger than that, it's just
+that the linenumber for reported errors and warnings have "wrapped
+around".) While scripts that large usually indicate a need to rethink
+your code a bit, such Perl scripts do exist, for example as results
+from generated code. Now linenumbers can go all the way to
+4294967296, or 2**32.
+
+=head2 Platform-specific fixes
+
+Linux
+
+=over 4
+
+=item *
+
+Setting $0 works again (with certain limitations that
+Perl cannot do much about: see L<perlvar/$0>)
+
+=back
+
+HP-UX
+
+=over 4
+
+=item *
+
+Setting $0 now works.
+
+=back
+
+VMS
+
+=over 4
+
+=item *
+
+Configuration now tests for the presence of C<poll()>, and IO::Poll
+now uses the vendor-supplied function if detected.
+
+=item *
+
+A rare access violation at Perl start-up could occur if the Perl image was
+installed with privileges or if there was an identifier with the
+subsystem attribute set in the process's rightslist. Either of these
+circumstances triggered tainting code that contained a pointer bug.
+The faulty pointer arithmetic has been fixed.
+
+=item *
+
+The length limit on values (not keys) in the %ENV hash has been raised
+from 255 bytes to 32640 bytes (except when the PERL_ENV_TABLES setting
+overrides the default use of logical names for %ENV). If it is
+necessary to access these long values from outside Perl, be aware that
+they are implemented using search list logical names that store the
+value in pieces, each 255-byte piece (up to 128 of them) being an
+element in the search list. When doing a lookup in %ENV from within
+Perl, the elements are combined into a single value. The existing
+VMS-specific ability to access individual elements of a search list
+logical name via the $ENV{'foo;N'} syntax (where N is the search list
+index) is unimpaired.
+
+=item *
+
+The piping implementation now uses local rather than global DCL
+symbols for inter-process communication.
+
+=item *
+
+File::Find could become confused when navigating to a relative
+directory whose name collided with a logical name. This problem has
+been corrected by adding directory syntax to relative path names, thus
+preventing logical name translation.
+
+=back
+
+Win32
+
+=over 4
+
+=item *
+
+A memory leak in the fork() emulation has been fixed.
+
+=item *
+
+The return value of the ioctl() built-in function was accidentally
+broken in 5.8.0. This has been corrected.
+
+=item *
+
+The internal message loop executed by perl during blocking operations
+sometimes interfered with messages that were external to Perl.
+This often resulted in blocking operations terminating prematurely or
+returning incorrect results, when Perl was executing under environments
+that could generate Windows messages. This has been corrected.
+
+=item *
+
+Pipes and sockets are now automatically in binary mode.
+
+=item *
+
+The four-argument form of select() did not preserve $! (errno) properly
+when there were errors in the underlying call. This is now fixed.
+
+=item *
+
+The "CR CR LF" problem of has been fixed, binmode(FH, ":crlf")
+is now effectively a no-op.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+All the warnings related to pack() and unpack() were made more
+informative and consistent.
+
+=head2 Changed "A thread exited while %d threads were running"
+
+The old version
+
+ A thread exited while %d other threads were still running
+
+was misleading because the "other" included also the thread giving
+the warning.
+
+=head2 Removed "Attempt to clear a restricted hash"
+
+It is not illegal to clear a restricted hash, so the warning
+was removed.
+
+=head2 New "Illegal declaration of anonymous subroutine"
+
+You must specify the block of code for C<sub>.
+
+=head2 Changed "Invalid range "%s" in transliteration operator"
+
+The old version
+
+ Invalid [] range "%s" in transliteration operator
+
+was simply wrong because there are no "[] ranges" in tr///.
+
+=head2 New "Missing control char name in \c"
+
+Self-explanatory.
+
+=head2 New "Newline in left-justified string for %s"
+
+The padding spaces would appear after the newline, which is
+probably not what you had in mind.
+
+=head2 New "Possible precedence problem on bitwise %c operator"
+
+If you think this
+
+ $x & $y == 0
+
+tests whether the bitwise AND of $x and $y is zero,
+you will like this warning.
+
+=head2 New "read() on %s filehandle %s"
+
+You cannot read() (or sysread()) from a closed or unopened filehandle.
+
+=head2 New "Tied variable freed while still in use"
+
+Something pulled the plug on a live tied variable, Perl plays
+safe by bailing out.
+
+=head2 New "To%s: illegal mapping '%s'"
+
+An illegal user-defined Unicode casemapping was specified.
+
+=head2 New "Use of freed value in iteration"
+
+Something modified the values being iterated over. This is not good.
+
+=head1 Changed Internals
+
+These news matter to you only if you either write XS code or like to
+know about or hack Perl internals (using Devel::Peek or any of the
+C<B::> modules counts), or like to run Perl with the C<-D> option.
+
+The embedding examples of L<perlembed> have been reviewed to be
+up to date and consistent: for example, the correct use of
+PERL_SYS_INIT3() and PERL_SYS_TERM().
+
+Extensive reworking of the pad code (the code responsible
+for lexical variables) has been conducted by Dave Mitchell.
+
+Extensive work on the v-strings by John Peacock.
+
+UTF-8 length and position cache: to speed up the handling of Unicode
+(UTF-8) scalars, a cache was introduced. Potential problems exist if
+an extension bypasses the official APIs and directly modifies the PV
+of an SV: the UTF-8 cache does not get cleared as it should.
+
+APIs obsoleted in Perl 5.8.0, like sv_2pv, sv_catpvn, sv_catsv,
+sv_setsv, are again available.
+
+Certain Perl core C APIs like cxinc and regatom are no longer
+available at all to code outside the Perl core of the Perl core
+extensions. This is intentional. They never should have been
+available with the shorter names, and if you application depends on
+them, you should (be ashamed and) contact perl5-porters to discuss
+what are the proper APIs.
+
+Certain Perl core C APIs like C<Perl_list> are no longer available
+without their C<Perl_> prefix. If your XS module stops working
+because some functions cannot be found, in many cases a simple fix is
+to add the C<Perl_> prefix to the function and the thread context
+C<aTHX_> as the first argument of the function call. This is also how
+it should always have been done: letting the Perl_-less forms to leak
+from the core was an accident. For cleaner embedding you can also
+force this for all APIs by defining at compile time the cpp define
+PERL_NO_SHORT_NAMES.
+
+Perl_save_bool() has been added.
+
+Regexp objects (those created with C<qr>) now have S-magic rather than
+R-magic. This fixed regexps of the form /...(??{...;$x})/ to no
+longer ignore changes made to $x. The S-magic avoids dropping
+the caching optimization and making (??{...}) constructs obscenely
+slow (and consequently useless). See also L<perlguts/"Magic Variables">.
+Regexp::Copy was affected by this change.
+
+The Perl internal debugging macros DEBUG() and DEB() have been renamed
+to PERL_DEBUG() and PERL_DEB() to avoid namespace conflicts.
+
+C<-DL> removed (the leaktest had been broken and unsupported for years,
+use alternative debugging mallocs or tools like valgrind and Purify).
+
+Verbose modifier C<v> added for C<-DXv> and C<-Dsv>, see L<perlrun>.
+
+=head1 New Tests
+
+In Perl 5.8.0 there were about 69000 separate tests in about 700 test files,
+in Perl 5.9.0 there are about 77000 separate tests in about 780 test files.
+The exact numbers depend on the Perl configuration and on the operating
+system platform.
+
+=head1 Known Problems
+
+The hash randomisation mentioned in L</Incompatible Changes> is definitely
+problematic: it will wake dormant bugs and shake out bad assumptions.
+
+Many of the rarer platforms that worked 100% or pretty close to it
+with perl 5.8.0 have been left a little bit untended since their
+maintainers have been otherwise busy lately, and therefore there will
+be more failures on those platforms. Such platforms include Mac OS
+Classic, IBM z/OS (and other EBCDIC platforms), and NetWare. The most
+common Perl platforms (Unix and Unix-like, Microsoft platforms, and
+VMS) have large enough testing and expert population that they are
+doing well.
+
+=head2 Tied hashes in scalar context
+
+Tied hashes do not currently return anything useful in scalar context,
+for example when used as boolean tests:
+
+ if (%tied_hash) { ... }
+
+The current nonsensical behaviour is always to return false,
+regardless of whether the hash is empty or has elements.
+
+The root cause is that there is no interface for the implementors of
+tied hashes to implement the behaviour of a hash in scalar context.
+
+=head2 Net::Ping 450_service and 510_ping_udp failures
+
+The subtests 9 and 18 of lib/Net/Ping/t/450_service.t, and the
+subtest 2 of lib/Net/Ping/t/510_ping_udp.t might fail if you have
+an unusual networking setup. For example in the latter case the
+test is trying to send a UDP ping to the IP address 127.0.0.1.
+
+=head2 B::C
+
+The C-generating compiler backend B::C (the frontend being
+C<perlcc -c>) is even more broken than it used to be because of
+the extensive lexical variable changes. (The good news is that
+B::Bytecode and ByteLoader are better than they used to be.)
+
+=head1 Platform Specific Problems
+
+=head2 EBCDIC Platforms
+
+IBM z/OS and other EBCDIC platforms continue to be problematic
+regarding Unicode support. Many Unicode tests are skipped when
+they really should be fixed.
+
+=head2 Cygwin 1.5 problems
+
+In Cygwin 1.5 the F<io/tell> and F<op/sysio> tests have failures for
+some yet unknown reason. In 1.5.5 the threads tests stress_cv,
+stress_re, and stress_string are failing unless the environment
+variable PERLIO is set to "perlio" (which makes also the io/tell
+failure go away).
+
+Perl 5.8.1 does build and work well with Cygwin 1.3: with (uname -a)
+C<CYGWIN_NT-5.0 ... 1.3.22(0.78/3/2) 2003-03-18 09:20 i686 ...>
+a 100% "make test" was achieved with C<Configure -des -Duseithreads>.
+
+=head2 HP-UX: HP cc warnings about sendfile and sendpath
+
+With certain HP C compiler releases (e.g. B.11.11.02) you will
+get many warnings like this (lines wrapped for easier reading):
+
+ cc: "/usr/include/sys/socket.h", line 504: warning 562:
+ Redeclaration of "sendfile" with a different storage class specifier:
+ "sendfile" will have internal linkage.
+ cc: "/usr/include/sys/socket.h", line 505: warning 562:
+ Redeclaration of "sendpath" with a different storage class specifier:
+ "sendpath" will have internal linkage.
+
+The warnings show up both during the build of Perl and during certain
+lib/ExtUtils tests that invoke the C compiler. The warning, however,
+is not serious and can be ignored.
+
+=head2 IRIX: t/uni/tr_7jis.t falsely failing
+
+The test t/uni/tr_7jis.t is known to report failure under 'make test'
+or the test harness with certain releases of IRIX (at least IRIX 6.5
+and MIPSpro Compilers Version 7.3.1.1m), but if run manually the test
+fully passes.
+
+=head2 Mac OS X: no usemymalloc
+
+The Perl malloc (C<-Dusemymalloc>) does not work at all in Mac OS X.
+This is not that serious, though, since the native malloc works just
+fine.
+
+=head2 Tru64: No threaded builds with GNU cc (gcc)
+
+In the latest Tru64 releases (e.g. v5.1B or later) gcc cannot be used
+to compile a threaded Perl (-Duseithreads) because the system
+C<< <pthread.h> >> file doesn't know about gcc.
+
+=head2 Win32: sysopen, sysread, syswrite
+
+As of the 5.8.0 release, sysopen()/sysread()/syswrite() do not behave
+like they used to in 5.6.1 and earlier with respect to "text" mode.
+These built-ins now always operate in "binary" mode (even if sysopen()
+was passed the O_TEXT flag, or if binmode() was used on the file
+handle). Note that this issue should only make a difference for disk
+files, as sockets and pipes have always been in "binary" mode in the
+Windows port. As this behavior is currently considered a bug,
+compatible behavior may be re-introduced in a future release. Until
+then, the use of sysopen(), sysread() and syswrite() is not supported
+for "text" mode operations.
+
+=head1 TODO
+
+Here are some things that are planned for perl 5.10.0 :
+
+=over 4
+
+=item *
+
+Various Copy-On-Write techniques will be investigated in hopes
+of speeding up Perl.
+
+=item *
+
+CPANPLUS, Inline, and Module::Build will become core modules.
+
+=item *
+
+The ability to write true lexically scoped pragmas will be introduced,
+perhaps via a C<pragma> pragma.
+
+=item *
+
+Work will continue on the bytecompiler and byteloader.
+
+=item *
+
+v-strings as they currently exist are scheduled to be deprecated. The
+v-less form (1.2.3) will become a "version object" when used with C<use>,
+C<require>, and C<$VERSION>. $^V will also be a "version object" so the
+printf("%vd",...) construct will no longer be needed. The v-ful version
+(v1.2.3) will become obsolete. The equivalence of strings and v-strings (e.g.
+that currently 5.8.0 is equal to "\5\8\0") will go away. B<There may be no
+deprecation warning for v-strings>, though: it is quite hard to detect when
+v-strings are being used safely, and when they are not.
+
+=back
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at F<http://bugs.perl.org/>. There may also be
+information at F<http://www.perl.com/>, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team. You can browse and search
+the Perl 5 bugs at F<http://bugs.perl.org/>.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl591delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl591delta.pod
new file mode 100755
index 00000000000..349c49a40f2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl591delta.pod
@@ -0,0 +1,323 @@
+=head1 NAME
+
+perl591delta - what is new for perl v5.9.1
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.9.0 and the 5.9.1
+development releases. See L<perl590delta> for the differences between
+5.8.0 and 5.9.0.
+
+=head1 Incompatible Changes
+
+=head2 substr() lvalues are no longer fixed-length
+
+The lvalues returned by the three argument form of substr() used to be a
+"fixed length window" on the original string. In some cases this could
+cause surprising action at distance or other undefined behaviour. Now the
+length of the window adjusts itself to the length of the string assigned to
+it.
+
+=head2 The C<:unique> attribute is only meaningful for globals
+
+Now applying C<:unique> to lexical variables and to subroutines will
+result in a compilation error.
+
+=head1 Core Enhancements
+
+=head2 Lexical C<$_>
+
+The default variable C<$_> can now be lexicalized, by declaring it like
+any other lexical variable, with a simple
+
+ my $_;
+
+The operations that default on C<$_> will use the lexically-scoped
+version of C<$_> when it exists, instead of the global C<$_>.
+
+In a C<map> or a C<grep> block, if C<$_> was previously my'ed, then the
+C<$_> inside the block is lexical as well (and scoped to the block).
+
+In a scope where C<$_> has been lexicalized, you can still have access to
+the global version of C<$_> by using C<$::_>, or, more simply, by
+overriding the lexical declaration with C<our $_>.
+
+=head2 Tied hashes in scalar context
+
+As of perl 5.8.2/5.9.0, tied hashes did not return anything useful in
+scalar context, for example when used as boolean tests:
+
+ if (%tied_hash) { ... }
+
+The old nonsensical behaviour was always to return false,
+regardless of whether the hash is empty or has elements.
+
+There is now an interface for the implementors of tied hashes to implement
+the behaviour of a hash in scalar context, via the SCALAR method (see
+L<perltie>). Without a SCALAR method, perl will try to guess whether
+the hash is empty, by testing if it's inside an iteration (in this case
+it can't be empty) or by calling FIRSTKEY.
+
+=head2 Formats
+
+Formats were improved in several ways. A new field, C<^*>, can be used for
+variable-width, one-line-at-a-time text. Null characters are now handled
+correctly in picture lines. Using C<@#> and C<~~> together will now
+produce a compile-time error, as those format fields are incompatible.
+L<perlform> has been improved, and miscellaneous bugs fixed.
+
+=head2 Stacked filetest operators
+
+As a new form of syntactic sugar, it's now possible to stack up filetest
+operators. You can now write C<-f -w -x $file> in a row to mean
+C<-x $file && -w _ && -f _>. See L<perlfunc/-X>.
+
+=head1 Modules and Pragmata
+
+=over 4
+
+=item Benchmark
+
+In C<Benchmark>, cmpthese() and timestr() now use the time statistics of
+children instead of parent when the selected style is 'nop'.
+
+=item Carp
+
+The error messages produced by C<Carp> now include spaces between the
+arguments in function argument lists: this makes long error messages
+appear more nicely in browsers and other tools.
+
+=item Exporter
+
+C<Exporter> will now recognize grouping tags (such as C<:name>) anywhere
+in the import list, not only at the beginning.
+
+=item FindBin
+
+A function C<again> is provided to resolve problems where modules in different
+directories wish to use FindBin.
+
+=item List::Util
+
+You can now weaken references to read only values.
+
+=item threads::shared
+
+C<cond_wait> has a new two argument form. C<cond_timedwait> has been added.
+
+=back
+
+=head1 Utility Changes
+
+C<find2perl> now assumes C<-print> as a default action. Previously, it
+needed to be specified explicitly.
+
+A new utility, C<prove>, makes it easy to run an individual regression test
+at the command line. C<prove> is part of Test::Harness, which users of earlier
+Perl versions can install from CPAN.
+
+The perl debugger now supports a C<save> command, to save the current
+history to a file, and an C<i> command, which prints the inheritance tree
+of its argument (if the C<Class::ISA> module is installed.)
+
+=head1 Documentation
+
+The documentation has been revised in places to produce more standard manpages.
+
+The long-existing feature of C</(?{...})/> regexps setting C<$_> and pos()
+is now documented.
+
+=head1 Performance Enhancements
+
+Sorting arrays in place (C<@a = sort @a>) is now optimized to avoid
+making a temporary copy of the array.
+
+The operations involving case mapping on UTF-8 strings (uc(), lc(),
+C<//i>, etc.) have been greatly speeded up.
+
+Access to elements of lexical arrays via a numeric constant between 0 and
+255 is now faster. (This used to be only the case for global arrays.)
+
+=head1 Selected Bug Fixes
+
+=head2 UTF-8 bugs
+
+Using substr() on a UTF-8 string could cause subsequent accesses on that
+string to return garbage. This was due to incorrect UTF-8 offsets being
+cached, and is now fixed.
+
+join() could return garbage when the same join() statement was used to
+process 8 bit data having earlier processed UTF-8 data, due to the flags
+on that statement's temporary workspace not being reset correctly. This
+is now fixed.
+
+Using Unicode keys with tied hashes should now work correctly.
+
+chop() and chomp() used to mangle UTF-8 strings. This has been fixed.
+
+sprintf() used to misbehave when the format string was in UTF-8. This is
+now fixed.
+
+=head2 Threading bugs
+
+Hashes with the C<:unique> attribute weren't made read-only in new
+threads. They are now.
+
+=head2 More bugs
+
+C<$a .. $b> will now work as expected when either $a or $b is C<undef>.
+
+Reading $^E now preserves $!. Previously, the C code implementing $^E
+did not preserve C<errno>, so reading $^E could cause C<errno> and therefore
+C<$!> to change unexpectedly.
+
+C<strict> wasn't in effect in regexp-eval blocks (C</(?{...})/>).
+
+=head1 New or Changed Diagnostics
+
+A new deprecation warning, I<Deprecated use of my() in false conditional>,
+has been added, to warn against the use of the dubious and deprecated
+construct
+
+ my $x if 0;
+
+See L<perldiag>.
+
+The fatal error I<DESTROY created new reference to dead object> is now
+documented in L<perldiag>.
+
+A new error, I<%ENV is aliased to %s>, is produced when taint checks are
+enabled and when C<*ENV> has been aliased (and thus doesn't reflect the
+program's environment anymore.)
+
+=head1 Changed Internals
+
+These news matter to you only if you either write XS code or like to
+know about or hack Perl internals (using Devel::Peek or any of the
+C<B::> modules counts), or like to run Perl with the C<-D> option.
+
+=head2 Reordering of SVt_* constants
+
+The relative ordering of constants that define the various types of C<SV>
+have changed; in particular, C<SVt_PVGV> has been moved before C<SVt_PVLV>,
+C<SVt_PVAV>, C<SVt_PVHV> and C<SVt_PVCV>. This is unlikely to make any
+difference unless you have code that explicitly makes assumptions about that
+ordering. (The inheritance hierarchy of C<B::*> objects has been changed
+to reflect this.)
+
+=head2 Removal of CPP symbols
+
+The C preprocessor symbols C<PERL_PM_APIVERSION> and
+C<PERL_XS_APIVERSION>, which were supposed to give the version number of
+the oldest perl binary-compatible (resp. source-compatible) with the
+present one, were not used, and sometimes had misleading values. They have
+been removed.
+
+=head2 Less space is used by ops
+
+The C<BASEOP> structure now uses less space. The C<op_seq> field has been
+removed and replaced by two one-bit fields, C<op_opt> and C<op_static>.
+C<opt_type> is now 9 bits long. (Consequently, the C<B::OP> class doesn't
+provide an C<seq> method anymore.)
+
+=head2 New parser
+
+perl's parser is now generated by bison (it used to be generated by
+byacc.) As a result, it seems to be a bit more robust.
+
+=head1 Configuration and Building
+
+C<Configure> now invokes callbacks regardless of the value of the variable
+they are called for. Previously callbacks were only invoked in the
+C<case $variable $define)> branch. This change should only affect platform
+maintainers writing configuration hints files.
+
+The portability and cleanliness of the Win32 makefiles has been improved.
+
+=head1 Known Problems
+
+There are still a couple of problems in the implementation of the lexical
+C<$_>: it doesn't work inside C</(?{...})/> blocks and with regard to the
+reverse() built-in used without arguments. (See the TODO tests in
+F<t/op/mydef.t>.)
+
+=head2 Platform Specific Problems
+
+The test F<ext/IPC/SysV/t/ipcsysv.t> may fail on OpenBSD. This hasn't been
+diagnosed yet.
+
+On some configurations on AIX 5, one test in F<lib/Time/Local.t> fails.
+When configured with long doubles, perl may fail tests 224-236 in
+F<t/op/pow.t> on the same platform.
+
+For threaded builds, F<ext/threads/shared/t/wait.t> has been reported to
+fail some tests on HP-UX 10.20.
+
+=head1 To-do for perl 5.10.0
+
+This is a non-exhaustive, non-ordered, non-contractual and non-definitive
+list of things to do (or nice to have) for perl 5.10.0 :
+
+Clean up and finish support for assertions. See L<assertions>.
+
+Reimplement the mechanism of lexical pragmas to be more extensible. Fix
+current pragmas that don't work well (or at all) with lexical scopes or in
+run-time eval(STRING) (C<sort>, C<re>, C<encoding> for example). MJD has a
+preliminary patch that implements this.
+
+Fix (or rewrite) the implementation of the C</(?{...})/> closures.
+
+Conversions from byte strings to UTF-8 currently map high bit characters
+to Unicode without translation (or, depending on how you look at it, by
+implicitly assuming that the byte strings are in Latin-1). As perl assumes
+the C locale by default, upgrading a string to UTF-8 may change the
+meaning of its contents regarding character classes, case mapping, etc.
+This should probably emit a warning (at least).
+
+Introduce a new special block, UNITCHECK, which is run at the end of a
+compilation unit (module, file, eval(STRING) block). This will correspond to
+the Perl 6 CHECK. Perl 5's CHECK cannot be changed or removed because the
+O.pm/B.pm backend framework depends on it.
+
+Study the possibility of adding a new prototype character, C<_>, meaning
+"this argument defaults to $_".
+
+Make the peephole optimizer optional.
+
+Allow lexical aliases (maybe via the syntax C<my \$alias = \$foo>.
+
+Fix the bugs revealed by running the test suite with the C<-t> switch (via
+C<make test.taintwarn>).
+
+Make threads more robust.
+
+Make C<no 6> and C<no v6> work (opposite of C<use 5.005>, etc.).
+
+A test suite for the B module would be nice.
+
+A ponie.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/ . There may also be
+information at http://www.perl.org/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl592delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl592delta.pod
new file mode 100755
index 00000000000..cc23843c4e4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl592delta.pod
@@ -0,0 +1,342 @@
+=head1 NAME
+
+perl592delta - what is new for perl v5.9.2
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.9.1 and the 5.9.2
+development releases. See L<perl590delta> and L<perl591delta> for the
+differences between 5.8.0 and 5.9.1.
+
+=head1 Incompatible Changes
+
+=head2 Packing and UTF-8 strings
+
+The semantics of pack() and unpack() regarding UTF-8-encoded data has been
+changed. Processing is now by default character per character instead of
+byte per byte on the underlying encoding. Notably, code that used things
+like C<pack("a*", $string)> to see through the encoding of string will now
+simply get back the original $string. Packed strings can also get upgraded
+during processing when you store upgraded characters. You can get the old
+behaviour by using C<use bytes>.
+
+To be consistent with pack(), the C<C0> in unpack() templates indicates
+that the data is to be processed in character mode, i.e. character by
+character; on the contrary, C<U0> in unpack() indicates UTF-8 mode, where
+the packed string is processed in its UTF-8-encoded Unicode form on a byte
+by byte basis. This is reversed with regard to perl 5.8.X.
+
+Moreover, C<C0> and C<U0> can also be used in pack() templates to specify
+respectively character and byte modes.
+
+C<C0> and C<U0> in the middle of a pack or unpack format now switch to the
+specified encoding mode, honoring parens grouping. Previously, parens were
+ignored.
+
+Also, there is a new pack() character format, C<W>, which is intended to
+replace the old C<C>. C<C> is kept for unsigned chars coded as bytes in
+the strings internal representation. C<W> represents unsigned (logical)
+character values, which can be greater than 255. It is therefore more
+robust when dealing with potentially UTF-8-encoded data (as C<C> will wrap
+values outside the range 0..255, and not respect the string encoding).
+
+In practice, that means that pack formats are now encoding-neutral, except
+C<C>.
+
+For consistency, C<A> in unpack() format now trims all Unicode whitespace
+from the end of the string. Before perl 5.9.2, it used to strip only the
+classical ASCII space characters.
+
+=head2 Miscellaneous
+
+The internal dump output has been improved, so that non-printable characters
+such as newline and backspace are output in C<\x> notation, rather than
+octal.
+
+The B<-C> option can no longer be used on the C<#!> line. It wasn't
+working there anyway.
+
+=head1 Core Enhancements
+
+=head2 Malloc wrapping
+
+Perl can now be built to detect attempts to assign pathologically large chunks
+of memory. Previously such assignments would suffer from integer wrap-around
+during size calculations causing a misallocation, which would crash perl, and
+could theoretically be used for "stack smashing" attacks. The wrapping
+defaults to enabled on platforms where we know it works (most AIX
+configurations, BSDi, Darwin, DEC OSF/1, FreeBSD, HP-UX, GNU Linux, OpenBSD,
+Solaris, VMS and most Win32 compilers) and defaults to disabled on other
+platforms.
+
+=head2 Unicode Character Database 4.0.1
+
+The copy of the Unicode Character Database included in Perl 5.9 has
+been updated to 4.0.1 from 4.0.0.
+
+=head2 suidperl less insecure
+
+Paul Szabo has analysed and patched C<suidperl> to remove existing known
+insecurities. Currently there are no known holes in C<suidperl>, but previous
+experience shows that we cannot be confident that these were the last. You may
+no longer invoke the set uid perl directly, so to preserve backwards
+compatibility with scripts that invoke #!/usr/bin/suidperl the only set uid
+binary is now C<sperl5.9.>I<n> (C<sperl5.9.2> for this release). C<suidperl>
+is installed as a hard link to C<perl>; both C<suidperl> and C<perl> will
+invoke C<sperl5.9.2> automatically the set uid binary, so this change should
+be completely transparent.
+
+For new projects the core perl team would strongly recommend that you use
+dedicated, single purpose security tools such as C<sudo> in preference to
+C<suidperl>.
+
+=head2 PERLIO_DEBUG
+
+The C<PERLIO_DEBUG> environment variable has no longer any effect for
+setuid scripts and for scripts run with B<-T>.
+
+Moreover, with a thread-enabled perl, using C<PERLIO_DEBUG> could lead to
+an internal buffer overflow. This has been fixed.
+
+=head2 Formats
+
+In addition to bug fixes, C<format>'s features have been enhanced. See
+L<perlform>.
+
+=head2 Unicode Character Classes
+
+Perl's regular expression engine now contains support for matching on the
+intersection of two Unicode character classes. You can also now refer to
+user-defined character classes from within other user defined character
+classes.
+
+=head2 Byte-order modifiers for pack() and unpack()
+
+There are two new byte-order modifiers, C<E<gt>> (big-endian) and C<E<lt>>
+(little-endian), that can be appended to most pack() and unpack() template
+characters and groups to force a certain byte-order for that type or group.
+See L<perlfunc/pack> and L<perlpacktut> for details.
+
+=head2 Byte count feature in pack()
+
+A new pack() template character, C<".">, returns the number of characters
+read so far.
+
+=head2 New variables
+
+A new variable, ${^RE_DEBUG_FLAGS}, controls what debug flags are in
+effect for the regular expression engine when running under C<use re
+"debug">. See L<re> for details.
+
+A new variable ${^UTF8LOCALE} indicates where an UTF-8 locale was detected
+by perl at startup.
+
+=head1 Modules and Pragmata
+
+=head2 New modules
+
+=over 4
+
+=item *
+
+C<encoding::warnings>, by Audrey Tang, is a module to emit warnings
+whenever an ASCII character string containing high-bit bytes is implicitly
+converted into UTF-8.
+
+=item *
+
+C<Module::CoreList>, by Richard Clamp, is a small handy module that tells
+you what versions of core modules ship with any versions of Perl 5. It
+comes with a command-line frontend, C<corelist>.
+
+=back
+
+=head2 Updated And Improved Modules and Pragmata
+
+Dual-lived modules have been updated to be kept up-to-date with respect to
+CPAN.
+
+The dual-lived modules which contain an C<_> in their version number are
+actually I<ahead> of the corresponding CPAN release.
+
+=over 4
+
+=item B::Concise
+
+C<B::Concise> was significantly improved.
+
+=item Socket
+
+There is experimental support for Linux abstract Unix domain sockets.
+
+=item Sys::Syslog
+
+C<syslog()> can now use numeric constants for facility names and priorities,
+in addition to strings.
+
+=item threads
+
+Detached threads are now also supported on Windows.
+
+=back
+
+=head1 Utility Changes
+
+=over 4
+
+=item *
+
+The C<corelist> utility is now installed with perl (see L</"New modules">
+above).
+
+=item *
+
+C<h2ph> and C<h2xs> have been made a bit more robust with regard to
+"modern" C code.
+
+=item *
+
+Several bugs have been fixed in C<find2perl>, regarding C<-exec> and
+C<-eval>. Also the options C<-path>, C<-ipath> and C<-iname> have been
+added.
+
+=item *
+
+The Perl debugger can now save all debugger commands for sourcing later;
+notably, it can now emulate stepping backwards, by restarting and
+rerunning all bar the last command from a saved command history.
+
+It can also display the parent inheritance tree of a given class.
+
+Perl has a new -dt command-line flag, which enables threads support in the
+debugger.
+
+=back
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+Unicode case mappings (C</i>, C<lc>, C<uc>, etc) are faster.
+
+=item *
+
+C<@a = sort @a> was optimized to do in-place sort. Likewise, C<reverse
+sort ...> is now optimized to sort in reverse, avoiding the generation of
+a temporary intermediate list.
+
+=item *
+
+Unnecessary assignments are optimised away in
+
+ my $s = undef;
+ my @a = ();
+ my %h = ();
+
+=item *
+
+C<map> in scalar context is now optimized.
+
+=item *
+
+The regexp engine now implements the trie optimization : it's able to
+factorize common prefixes and suffixes in regular expressions. A new
+special variable, ${^RE_TRIE_MAXBUF}, has been added to fine-tune this
+optimization.
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+Run-time customization of @INC can be enabled by passing the
+C<-Dusesitecustomize> flag to configure. When enabled, this will make perl
+run F<$sitelibexp/sitecustomize.pl> before anything else. This script can
+then be set up to add additional entries to @INC.
+
+There is alpha support for relocatable @INC entries.
+
+Perl should build on Interix and on GNU/kFreeBSD.
+
+=head1 Selected Bug Fixes
+
+Most of those bugs were reported in the perl 5.8.x maintenance track.
+Notably, quite a few utf8 bugs were fixed, and several memory leaks were
+suppressed. The perl58Xdelta manpages have more details on them.
+
+Development-only bug fixes include :
+
+C<$Foo::_> was wrongly forced as C<$main::_>.
+
+=head1 New or Changed Diagnostics
+
+A new warning, C<!=~ should be !~>, is emitted to prevent this misspelling
+of the non-matching operator.
+
+The warning I<Newline in left-justified string> has been removed.
+
+The error I<Too late for "-T" option> has been reformulated to be more
+descriptive.
+
+There is a new compilation error, I<Illegal declaration of subroutine>,
+for an obscure case of syntax errors.
+
+The diagnostic output of Carp has been changed slightly, to add a space after
+the comma between arguments. This makes it much easier for tools such as
+web browsers to wrap it, but might confuse any automatic tools which perform
+detailed parsing of Carp output.
+
+C<perl -V> has several improvements, making it more useable from shell
+scripts to get the value of configuration variables. See L<perlrun> for
+details.
+
+=head1 Changed Internals
+
+The perl core has been refactored and reorganised in several places.
+In short, this release will not be binary compatible with any previous
+perl release.
+
+=head1 Known Problems
+
+For threaded builds, F<ext/threads/shared/t/wait.t> has been reported to
+fail some tests on HP-UX 10.20.
+
+Net::Ping might fail some tests on HP-UX 11.00 with the latest OS
+upgrades.
+
+F<t/io/dup.t>, F<t/io/open.t> and F<lib/ExtUtils/t/Constant.t> fail some
+tests on some BSD flavours.
+
+=head1 Plans for the next release
+
+The current plan for perl 5.9.3 is to add CPANPLUS as a core module.
+More regular expression optimizations are also in the works.
+
+It is planned to release a development version of perl more frequently,
+i.e. each time something major changes.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/ . There may also be
+information at http://www.perl.org/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl593delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl593delta.pod
new file mode 100755
index 00000000000..80f8cb925fb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl593delta.pod
@@ -0,0 +1,549 @@
+=head1 NAME
+
+perl593delta - what is new for perl v5.9.3
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.9.2 and the 5.9.3
+development releases. See L<perl590delta>, L<perl591delta> and
+L<perl592delta> for the differences between 5.8.0 and 5.9.2.
+
+=head1 Incompatible Changes
+
+=head2 Parsing of C<-f _>
+
+The identifier C<_> is now forced to be a bareword after a filetest
+operator. This solves a number of misparsing issues when a global C<_>
+subroutine is defined.
+
+=head2 C<mkdir()>
+
+C<mkdir()> without arguments now defaults to C<$_>.
+
+=head2 Magic goto and eval
+
+The construct C<eval { goto &foo }> is now disallowed. (Note that the
+similar construct, but with C<eval("")> instead, was already forbidden.)
+
+=head2 C<$#> has been removed
+
+The deprecated C<$#> variable (output format for numbers) has been
+removed. A new warning, C<$# is no longer supported>, has been added.
+
+=head2 C<:unique>
+
+The C<:unique> attribute has been made a no-op, since its current
+implementation was fundamentally flawed and not threadsafe.
+
+=head2 Scoping of the C<sort> pragma
+
+The C<sort> pragma is now lexically scoped. Its effect used to be global.
+
+=head1 Core Enhancements
+
+=head2 The C<feature> pragma
+
+The C<feature> pragma is used to enable new syntax that would break Perl's
+backwards-compatibility with older releases of the language. It's a lexical
+pragma, like C<strict> or C<warnings>.
+
+Currently the following new features are available: C<switch> (adds a
+switch statement), C<~~> (adds a Perl 6-like smart match operator), C<say>
+(adds a C<say> built-in function), and C<err> (adds an C<err> keyword).
+Those features are described below.
+
+Note that C<err> low-precedence defined-or operator used to be enabled by
+default (although as a weak keyword, meaning that any function would
+override it). It's now only recognized when explicitly turned on (and is
+then a regular keyword).
+
+Those features, and the C<feature> pragma itself, have been contributed by
+Robin Houston.
+
+=head2 Switch and Smart Match operator
+
+Perl 5 now has a switch statement. It's available when C<use feature
+'switch'> is in effect. This feature introduces three new keywords,
+C<given>, C<when>, and C<default>:
+
+ given ($foo) {
+ when (/^abc/) { $abc = 1; }
+ when (/^def/) { $def = 1; }
+ when (/^xyz/) { $xyz = 1; }
+ default { $nothing = 1; }
+ }
+
+A more complete description of how Perl matches the switch variable
+against the C<when> conditions is given in L<perlsyn/"Switch statements">.
+
+This kind of match is called I<smart match>, and it's also possible to use
+it outside of switch statements, via the new C<~~> operator (enabled via
+the C<use feature '~~'> directive). See L<perlsyn/"Smart matching in
+detail">.
+
+=head2 C<say()>
+
+say() is a new built-in, only available when C<use feature 'say'> is in
+effect, that is similar to print(), but that implicitly appends a newline
+to the printed string. See L<perlfunc/say>.
+
+=head2 C<CLONE_SKIP()>
+
+Perl has now support for the C<CLONE_SKIP> special subroutine. Like
+C<CLONE>, C<CLONE_SKIP> is called once per package; however, it is called
+just before cloning starts, and in the context of the parent thread. If it
+returns a true value, then no objects of that class will be cloned. See
+L<perlmod> for details. (Contributed by Dave Mitchell.)
+
+=head2 C<${^CHILD_ERROR_NATIVE}>
+
+A new internal variable, C<${^CHILD_ERROR_NATIVE}>, gives the native
+status returned by the last pipe close, backtick command, successful call
+to wait() or waitpid(), or from the system() operator. See L<perlrun> for
+details. (Contributed by Gisle Aas.)
+
+=head2 Assertions
+
+The support for assertions, introduced in perl 5.9.0, has been improved.
+The syntax for the C<-A> command-line switch has changed; it now accepts
+an optional module name, defaulting to C<assertions::activate>. See
+L<assertions> and L<perlrun>. (Contributed by Salvador Fandiño García.)
+
+=head2 Unicode Character Database 4.1.0
+
+The copy of the Unicode Character Database included in Perl 5.9 has
+been updated to 4.1.0.
+
+=head2 C<no VERSION>
+
+You can now use C<no> followed by a version number to specify that you
+want to use a version of perl older than the specified one.
+
+=head2 Recursive sort subs
+
+You can now use recursive subroutines with sort(), thanks to Robin Houston.
+
+=head2 Effect of pragmas in eval
+
+The compile-time value of the C<%^H> hint variable can now propagate into
+eval("")uated code. This makes it more useful to implement lexical
+pragmas.
+
+As a side-effect of this, the overloaded-ness of constants now propagates
+into eval("").
+
+=head2 New B<-E> command-line switch
+
+B<-E> is equivalent to B<-e>, but it implicitly enables all
+optional features (like C<use feature ":5.10">).
+
+=head2 C<chdir>, C<chmod> and C<chown> on filehandles
+
+C<chdir>, C<chmod> and C<chown> can now work on filehandles as well as
+filenames, if the system supports respectively C<fchdir>, C<fchmod> and
+C<fchown>, thanks to a patch provided by Gisle Aas.
+
+=head2 OS groups
+
+C<$(> and C<$)> now return groups in the order where the OS returns them,
+thanks to Gisle Aas. This wasn't previously the case.
+
+=head1 Modules and Pragmata
+
+=head2 New Core Modules
+
+=over 4
+
+=item *
+
+A new pragma, C<feature>, has been added; see above in L</"Core
+Enhancements">.
+
+=item *
+
+C<assertions::compat>, also available on CPAN, allows the use of assertions on
+perl versions prior to 5.9.0 (that is the first one to natively support
+them).
+
+=item *
+
+C<Math::BigInt::FastCalc> is an XS-enabled, and thus faster, version of
+C<Math::BigInt::Calc>.
+
+=item *
+
+C<Compress::Zlib> is an interface to the zlib compression library. It
+comes with a bundled version of zlib, so having a working zlib is not a
+prerequisite to install it. It's used by C<Archive::Tar> (see below).
+
+=item *
+
+C<IO::Zlib> is an C<IO::>-style interface to C<Compress::Zlib>.
+
+=item *
+
+C<Archive::Tar> is a module to manipulate C<tar> archives.
+
+=item *
+
+C<Digest::SHA> is a module used to calculate many types of SHA digests,
+has been included for SHA support in the CPAN module.
+
+=item *
+
+C<ExtUtils::CBuilder> and C<ExtUtils::ParseXS> have been added.
+
+=back
+
+=head1 Utility Changes
+
+=head2 C<ptar>
+
+C<ptar> is a pure perl implementation of C<tar>, that comes with
+C<Archive::Tar>.
+
+=head2 C<ptardiff>
+
+C<ptardiff> is a small script used to generate a diff between the contents
+of a tar archive and a directory tree. Like C<ptar>, it comes with
+C<Archive::Tar>.
+
+=head2 C<shasum>
+
+This command-line utility, used to print or to check SHA digests, comes
+with the new C<Digest::SHA> module.
+
+=head2 C<h2xs> enhancements
+
+C<h2xs> implements a new option C<--use-xsloader> to force use of
+C<XSLoader> even in backwards compatible modules.
+
+The handling of authors' names that had apostrophes has been fixed.
+
+Any enums with negative values are now skipped.
+
+=head2 C<perlivp> enhancements
+
+C<perlivp> no longer checks for F<*.ph> files by default. Use the new C<-a>
+option to run I<all> tests.
+
+=head1 Documentation
+
+=head2 Perl Glossary
+
+The L<perlglossary> manpage is a glossary of terms used in the Perl
+documentation, technical and otherwise, kindly provided by O'Reilly Media,
+Inc.
+
+L<perltodo> now lists a rough roadmap to Perl 5.10.
+
+=head1 Performance Enhancements
+
+=head2 XS-assisted SWASHGET
+
+Some pure-perl code that perl was using to retrieve Unicode properties and
+transliteration mappings has been reimplemented in XS.
+
+=head2 Constant subroutines
+
+The interpreter internals now support a far more memory efficient form of
+inlineable constants. Storing a reference to a constant value in a symbol
+table is equivalent to a full typeglob referencing a constant subroutine,
+but using about 400 bytes less memory. This proxy constant subroutine is
+automatically upgraded to a real typeglob with subroutine if necessary.
+The approach taken is analogous to the existing space optimisation for
+subroutine stub declarations, which are stored as plain scalars in place
+of the full typeglob.
+
+Several of the core modules have been converted to use this feature for
+their system dependent constants - as a result C<use POSIX;> now takes about
+200K less memory.
+
+=head2 C<PERL_DONT_CREATE_GVSV>
+
+The new compilation flag C<PERL_DONT_CREATE_GVSV>, introduced as an option
+in perl 5.8.8, is turned on by default in perl 5.9.3. It prevents perl
+from creating an empty scalar with every new typeglob. See L<perl589delta>
+for details.
+
+=head2 Weak references are cheaper
+
+Weak reference creation is now I<O(1)> rather than I<O(n)>, courtesy of
+Nicholas Clark. Weak reference deletion remains I<O(n)>, but if deletion only
+happens at program exit, it may be skipped completely.
+
+=head2 sort() enhancements
+
+Salvador Fandiño provided improvements to reduce the memory usage of C<sort>
+and to speed up some cases.
+
+=head1 Installation and Configuration Improvements
+
+=head2 Compilation improvements
+
+Parallel makes should work properly now, although there may still be problems
+if C<make test> is instructed to run in parallel.
+
+Building with Borland's compilers on Win32 should work more smoothly. In
+particular Steve Hay has worked to side step many warnings emitted by their
+compilers and at least one C compiler internal error.
+
+Perl extensions on Windows now can be statically built into the Perl DLL,
+thanks to a work by Vadim Konovalov.
+
+=head2 New Or Improved Platforms
+
+Perl is being ported to Symbian OS. See L<perlsymbian> for more
+information.
+
+The VMS port has been improved. See L<perlvms>.
+
+DynaLoader::dl_unload_file() now works on Windows.
+
+Portability of Perl on various recent compilers on Windows has been
+improved (Borland C++, Visual C++ 7.0).
+
+=head2 New probes
+
+C<Configure> will now detect C<clearenv> and C<unsetenv>, thanks to a
+patch from Alan Burlison. It will also probe for C<futimes> (and use it
+internally if available), and whether C<sprintf> correctly returns the
+length of the formatted string.
+
+=head2 Module auxiliary files
+
+README files and changelogs for CPAN modules bundled with perl are no
+longer installed.
+
+=head1 Selected Bug Fixes
+
+=head2 C<defined $$x>
+
+C<use strict "refs"> was ignoring taking a hard reference in an argument
+to defined(), as in :
+
+ use strict "refs";
+ my $x = "foo";
+ if (defined $$x) {...}
+
+This now correctly produces the run-time error C<Can't use string as a
+SCALAR ref while "strict refs" in use>. (However, C<defined @$foo> and
+C<defined %$foo> are still allowed. Those constructs are discouraged
+anyway.)
+
+=head2 Calling CORE::require()
+
+CORE::require() and CORE::do() were always parsed as require() and do()
+when they were overridden. This is now fixed.
+
+=head2 Subscripts of slices
+
+You can now use a non-arrowed form for chained subscripts after a list
+slice, like in:
+
+ ({foo => "bar"})[0]{foo}
+
+This used to be a syntax error; a C<< -> >> was required.
+
+=head2 Remove over-optimisation
+
+Perl 5.9.2 introduced a change so that assignments of C<undef> to a
+scalar, or of an empty list to an array or a hash, were optimised out. As
+this could cause problems when C<goto> jumps were involved, this change
+was backed out.
+
+=head2 sprintf() fixes
+
+Using the sprintf() function with some formats could lead to a buffer
+overflow in some specific cases. This has been fixed, along with several
+other bugs, notably in bounds checking.
+
+In related fixes, it was possible for badly written code that did not follow
+the documentation of C<Sys::Syslog> to have formatting vulnerabilities.
+C<Sys::Syslog> has been changed to protect people from poor quality third
+party code.
+
+=head2 no warnings 'category' works correctly with -w
+
+Previously when running with warnings enabled globally via C<-w>, selective
+disabling of specific warning categories would actually turn off all warnings.
+This is now fixed; now C<no warnings 'io';> will only turn off warnings in the
+C<io> class. Previously it would erroneously turn off all warnings.
+
+=head2 Smaller fixes
+
+=over 4
+
+=item *
+
+C<FindBin> now works better with directories where access rights are more
+restrictive than usual.
+
+=item *
+
+Several memory leaks in ithreads were closed. Also, ithreads were made
+less memory-intensive.
+
+=item *
+
+Trailing spaces are now trimmed from C<$!> and C<$^E>.
+
+=item *
+
+Operations that require perl to read a process' list of groups, such as reads
+of C<$(> and C<$)>, now dynamically allocate memory rather than using a
+fixed sized array. The fixed size array could cause C stack exhaustion on
+systems configured to use large numbers of groups.
+
+=item *
+
+C<PerlIO::scalar> now works better with non-default C<$/> settings.
+
+=item *
+
+The C<x> repetition operator is now able to operate on C<qw//> lists. This
+used to raise a syntax error.
+
+=item *
+
+The debugger now traces correctly execution in eval("")uated code that
+contains #line directives.
+
+=item *
+
+The value of the C<open> pragma is no longer ignored for three-argument
+opens.
+
+=item *
+
+Perl will now use the C library calls C<unsetenv> and C<clearenv> if present
+to delete keys from C<%ENV> and delete C<%ENV> entirely, thanks to a patch
+from Alan Burlison.
+
+=back
+
+=head2 More Unicode Fixes
+
+=over 4
+
+=item *
+
+chr() on a negative value now gives C<\x{FFFD}>, the Unicode replacement
+character, unless when the C<bytes> pragma is in effect, where the low
+eight bytes of the value are used.
+
+=item *
+
+Some case insensitive matches between UTF-8 encoded data and 8 bit regexps,
+and vice versa, could give malformed character warnings. These have been
+fixed by Dave Mitchell and Yves Orton.
+
+=item *
+
+C<lcfirst> and C<ucfirst> could corrupt the string for certain cases where
+the length UTF-8 encoding of the string in lower case, upper case or title
+case differed. This was fixed by Nicholas Clark.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+=head2 Attempt to set length of freed array
+
+This is a new warning, produced in situations like the following one:
+
+ $r = do {my @a; \$#a};
+ $$r = 503;
+
+=head2 Non-string passed as bitmask
+
+This is a new warning, produced when number has been passed as a argument to
+select(), instead of a bitmask.
+
+ # Wrong, will now warn
+ $rin = fileno(STDIN);
+ ($nfound,$timeleft) = select($rout=$rin, undef, undef, $timeout);
+
+ # Should be
+ $rin = '';
+ vec($rin,fileno(STDIN),1) = 1;
+ ($nfound,$timeleft) = select($rout=$rin, undef, undef, $timeout);
+
+=head2 Search pattern not terminated or ternary operator parsed as search pattern
+
+This syntax error indicates that the lexer couldn't find the final
+delimiter of a C<?PATTERN?> construct. Mentioning the ternary operator in
+this error message makes syntax diagnostic easier.
+
+=head2 "%s" variable %s masks earlier declaration
+
+This warning is now emitted in more consistent cases; in short, when one
+of the declarations involved is a C<my> variable:
+
+ my $x; my $x; # warns
+ my $x; our $x; # warns
+ our $x; my $x; # warns
+
+On the other hand, the following:
+
+ our $x; our $x;
+
+now gives a C<"our" variable %s redeclared> warning.
+
+=head2 readdir()/closedir()/etc. attempted on invalid dirhandle
+
+These new warnings are now emitted when a dirhandle is used but is
+either closed or not really a dirhandle.
+
+=head1 Changed Internals
+
+In general, the source code of perl has been refactored, tied up, and
+optimized in many places. Also, memory management and allocation has been
+improved in a couple of points.
+
+Andy Lester supplied many improvements to determine which function
+parameters and local variables could actually be declared C<const> to the C
+compiler. Steve Peters provided new C<*_set> macros and reworked the core to
+use these rather than assigning to macros in LVALUE context.
+
+Dave Mitchell improved the lexer debugging output under C<-DT>.
+
+A new file, F<mathoms.c>, has been added. It contains functions that are
+no longer used in the perl core, but that remain available for binary or
+source compatibility reasons. However, those functions will not be
+compiled in if you add C<-DNO_MATHOMS> in the compiler flags.
+
+The C<AvFLAGS> macro has been removed.
+
+The C<av_*()> functions, used to manipulate arrays, no longer accept null
+C<AV*> parameters.
+
+=head2 B:: modules inheritance changed
+
+The inheritance hierarchy of C<B::> modules has changed; C<B::NV> now
+inherits from C<B::SV> (it used to inherit from C<B::IV>).
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/ . There may also be
+information at http://www.perl.org/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl594delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl594delta.pod
new file mode 100755
index 00000000000..aa4358bc504
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl594delta.pod
@@ -0,0 +1,382 @@
+=head1 NAME
+
+perl594delta - what is new for perl v5.9.4
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.9.3 and the 5.9.4
+development releases. See L<perl590delta>, L<perl591delta>, L<perl592delta>
+and L<perl593delta> for the differences between 5.8.0 and 5.9.3.
+
+=head1 Incompatible Changes
+
+=head2 chdir FOO
+
+A bareword argument to chdir() is now recognized as a file handle.
+Earlier releases interpreted the bareword as a directory name.
+(Gisle Aas)
+
+=head2 Handling of pmc files
+
+An old feature of perl was that before C<require> or C<use> look for a
+file with a F<.pm> extension, they will first look for a similar filename
+with a F<.pmc> extension. If this file is found, it will be loaded in
+place of any potentially existing file ending in a F<.pm> extension.
+
+Previously, F<.pmc> files were loaded only if more recent than the
+matching F<.pm> file. Starting with 5.9.4, they'll be always loaded if
+they exist. (This trick is used by Pugs.)
+
+=head2 @- and @+ in patterns
+
+The special arrays C<@-> and C<@+> are no longer interpolated in regular
+expressions. (Sadahiro Tomoyuki)
+
+=head2 $AUTOLOAD can now be tainted
+
+If you call a subroutine by a tainted name, and if it defers to an
+AUTOLOAD function, then $AUTOLOAD will be (correctly) tainted.
+(Rick Delaney)
+
+=head1 Core Enhancements
+
+=head2 state() variables
+
+A new class of variables has been introduced. State variables are similar
+to C<my> variables, but are declared with the C<state> keyword in place of
+C<my>. They're visible only in their lexical scope, but their value is
+persistent: unlike C<my> variables, they're not undefined at scope entry,
+but retain their previous value. (Rafael Garcia-Suarez)
+
+To use state variables, one needs to enable them by using
+
+ use feature "state";
+
+or by using the C<-E> command-line switch in one-liners.
+
+See L<perlsub/"Persistent variables via state()">.
+
+=head2 UNIVERSAL::DOES()
+
+The C<UNIVERSAL> class has a new method, C<DOES()>. It has been added to
+solve semantic problems with the C<isa()> method. C<isa()> checks for
+inheritance, while C<DOES()> has been designed to be overridden when
+module authors use other types of relations between classes (in addition
+to inheritance). (chromatic)
+
+See L<< UNIVERSAL/"$obj->DOES( ROLE )" >>.
+
+=head2 Exceptions in constant folding
+
+The constant folding routine is now wrapped in an exception handler, and
+if folding throws an exception (such as attempting to evaluate 0/0), perl
+now retains the current optree, rather than aborting the whole program.
+(Nicholas Clark, Dave Mitchell)
+
+=head2 Source filters in @INC
+
+It's possible to enhance the mechanism of subroutine hooks in @INC by
+adding a source filter on top of the filehandle opened and returned by the
+hook. This feature was planned a long time ago, but wasn't quite working
+until now. See L<perlfunc/require> for details. (Nicholas Clark)
+
+=head2 MAD
+
+MAD, which stands for I<Misc Attribute Decoration>, is a
+still-in-development work leading to a Perl 5 to Perl 6 converter. To
+enable it, it's necessary to pass the argument C<-Dmad> to Configure. The
+obtained perl isn't binary compatible with a regular perl 5.9.4, and has
+space and speed penalties; moreover not all regression tests still pass
+with it. (Larry Wall, Nicholas Clark)
+
+=head1 Modules and Pragmas
+
+=over 4
+
+=item *
+
+C<encoding::warnings> is now a lexical pragma. (Although on older perls,
+which don't have support for lexical pragmas, it keeps its global
+behaviour.) (Audrey Tang)
+
+=item *
+
+C<threads> is now a dual-life module, also available on CPAN. It has been
+expanded in many ways. A kill() method is available for thread signalling.
+One can get thread status, or the list of running or joinable threads.
+
+A new C<< threads->exit() >> method is used to exit from the application
+(this is the default for the main thread) or from the current thread only
+(this is the default for all other threads). On the other hand, the exit()
+built-in now always causes the whole application to terminate. (Jerry
+D. Hedden)
+
+=back
+
+=head2 New Core Modules
+
+=over 4
+
+=item *
+
+C<Hash::Util::FieldHash>, by Anno Siegel, has been added. This module
+provides support for I<field hashes>: hashes that maintain an association
+of a reference with a value, in a thread-safe garbage-collected way.
+Such hashes are useful to implement inside-out objects.
+
+=item *
+
+C<Module::Build>, by Ken Williams, has been added. It's an alternative to
+C<ExtUtils::MakeMaker> to build and install perl modules.
+
+=item *
+
+C<Module::Load>, by Jos Boumans, has been added. It provides a single
+interface to load Perl modules and F<.pl> files.
+
+=item *
+
+C<Module::Loaded>, by Jos Boumans, has been added. It's used to mark
+modules as loaded or unloaded.
+
+=item *
+
+C<Package::Constants>, by Jos Boumans, has been added. It's a simple
+helper to list all constants declared in a given package.
+
+=item *
+
+C<Win32API::File>, by Tye McQueen, has been added (for Windows builds).
+This module provides low-level access to Win32 system API calls for
+files/dirs.
+
+=back
+
+=head1 Utility Changes
+
+=head2 config_data
+
+C<config_data> is a new utility that comes with C<Module::Build>. It
+provides a command-line interface to the configuration of Perl modules
+that use Module::Build's framework of configurability (that is,
+C<*::ConfigData> modules that contain local configuration information for
+their parent modules.)
+
+=head1 Documentation
+
+=head2 New manpage, perlpragma
+
+The L<perlpragma> manpage documents how to write one's own lexical
+pragmas in pure Perl (something that is possible starting with 5.9.4).
+
+=head2 New manpage, perlreguts
+
+The L<perlreguts> manpage, courtesy of Yves Orton, describes internals of the
+Perl regular expression engine.
+
+=head2 New manpage, perlunitut
+
+The L<perlunitut> manpage is an tutorial for programming with Unicode and
+string encodings in Perl, courtesy of Juerd Waalboer.
+
+=head1 Performance Enhancements
+
+=head2 Memory optimisations
+
+Several internal data structures (typeglobs, GVs, CVs, formats) have been
+restructured to use less memory. (Nicholas Clark)
+
+=head2 UTF-8 cache optimisation
+
+The UTF-8 caching code is now more efficient, and used more often.
+(Nicholas Clark)
+
+=head2 Regular expressions
+
+=over 4
+
+=item Engine de-recursivised
+
+The regular expression engine is no longer recursive, meaning that
+patterns that used to overflow the stack will either die with useful
+explanations, or run to completion, which, since they were able to blow
+the stack before, will likely take a very long time to happen. If you were
+experiencing the occasional stack overflow (or segfault) and upgrade to
+discover that now perl apparently hangs instead, look for a degenerate
+regex. (Dave Mitchell)
+
+=item Single char char-classes treated as literals
+
+Classes of a single character are now treated the same as if the character
+had been used as a literal, meaning that code that uses char-classes as an
+escaping mechanism will see a speedup. (Yves Orton)
+
+=item Trie optimisation of literal string alternations
+
+Alternations, where possible, are optimised into more efficient matching
+structures. String literal alternations are merged into a trie and are
+matched simultaneously. This means that instead of O(N) time for matching
+N alternations at a given point the new code performs in O(1) time. (Yves
+Orton)
+
+B<Note:> Much code exists that works around perl's historic poor
+performance on alternations. Often the tricks used to do so will disable
+the new optimisations. Hopefully the utility modules used for this purpose
+will be educated about these new optimisations by the time 5.10 is
+released.
+
+=item Aho-Corasick start-point optimisation
+
+When a pattern starts with a trie-able alternation and there aren't
+better optimisations available the regex engine will use Aho-Corasick
+matching to find the start point. (Yves Orton)
+
+=back
+
+=head2 Sloppy stat on Windows
+
+On Windows, perl's stat() function normally opens the file to determine
+the link count and update attributes that may have been changed through
+hard links. Setting ${^WIN32_SLOPPY_STAT} to a true value speeds up
+stat() by not performing this operation. (Jan Dubois)
+
+=head1 Installation and Configuration Improvements
+
+=head2 Relocatable installations
+
+There is now Configure support for creating a relocatable perl tree. If
+you Configure with C<-Duserelocatableinc>, then the paths in @INC (and
+everything else in %Config) can be optionally located via the path of the
+perl executable.
+
+That means that, if the string C<".../"> is found at the start of any
+path, it's substituted with the directory of $^X. So, the relocation can
+be configured on a per-directory basis, although the default with
+C<-Duserelocatableinc> is that everything is relocated. The initial
+install is done to the original configured prefix.
+
+=head2 Ports
+
+Many improvements have been made towards making Perl work correctly on
+z/OS.
+
+Perl has been reported to work on DragonFlyBSD.
+
+=head2 Compilation improvements
+
+All F<ppport.h> files in the XS modules bundled with perl are now
+autogenerated at build time. (Marcus Holland-Moritz)
+
+=head2 New probes
+
+The configuration process now detects whether strlcat() and strlcpy() are
+available. When they are not available, perl's own version is used (from
+Russ Allbery's public domain implementation). Various places in the perl
+interpreter now use them. (Steve Peters)
+
+=head2 Windows build improvements
+
+=over 4
+
+=item Building XS extensions
+
+Support for building XS extension modules with the free MinGW compiler has
+been improved in the case where perl itself was built with the Microsoft
+VC++ compiler. (ActiveState)
+
+=item Support for 64-bit compiler
+
+Support for building perl with Microsoft's 64-bit compiler has been
+improved. (ActiveState)
+
+=back
+
+=head1 Selected Bug Fixes
+
+=head2 PERL5SHELL and tainting
+
+On Windows, the PERL5SHELL environment variable is now checked for
+taintedness. (Rafael Garcia-Suarez)
+
+=head2 Using *FILE{IO}
+
+C<stat()> and C<-X> filetests now treat *FILE{IO} filehandles like *FILE
+filehandles. (Steve Peters)
+
+=head2 Overloading and reblessing
+
+Overloading now works when references are reblessed into another class.
+Internally, this has been implemented by moving the flag for "overloading"
+from the reference to the referent, which logically is where it should
+always have been. (Nicholas Clark)
+
+=head2 Overloading and UTF-8
+
+A few bugs related to UTF-8 handling with objects that have
+stringification overloaded have been fixed. (Nicholas Clark)
+
+=head2 eval memory leaks fixed
+
+Traditionally, C<eval 'syntax error'> has leaked badly. Many (but not all)
+of these leaks have now been eliminated or reduced. (Dave Mitchell)
+
+=head2 Random device on Windows
+
+In previous versions, perl would read the file F</dev/urandom> if it
+existed when seeding its random number generator. That file is unlikely
+to exist on Windows, and if it did would probably not contain appropriate
+data, so perl no longer tries to read it on Windows. (Alex Davies)
+
+=head1 New or Changed Diagnostics
+
+=over 4
+
+=item State variable %s will be reinitialized
+
+One can assign initial values to state variables, but not when they're
+declared as a sub-part of a list assignment. See L<perldiag>.
+
+=back
+
+=head1 Changed Internals
+
+A new file, F<mathoms.c>, contains functions that aren't used anymore in
+the perl core, but remain around because modules out there might
+still use them. They come from a factorization effort: for example, many
+PP functions are now shared for several ops.
+
+The implementation of the special variables $^H and %^H has changed, to
+allow implementing lexical pragmas in pure perl.
+
+=head1 Known Problems
+
+One warning test (number 263 in F<lib/warnings.t>) fails under UTF-8
+locales.
+
+Bytecode tests fail under several platforms. We are considering removing
+support for byteloader and compiler before the 5.10.0 release.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://rt.perl.org/rt3/ . There may also be
+information at http://www.perl.org/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perl595delta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perl595delta.pod
new file mode 100755
index 00000000000..246b2cc7478
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perl595delta.pod
@@ -0,0 +1,587 @@
+=head1 NAME
+
+perl595delta - what is new for perl v5.9.5
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.9.4 and the 5.9.5
+development releases. See L<perl590delta>, L<perl591delta>,
+L<perl592delta>, L<perl593delta> and L<perl594delta> for the differences
+between 5.8.0 and 5.9.4.
+
+=head1 Incompatible Changes
+
+=head2 Tainting and printf
+
+When perl is run under taint mode, C<printf()> and C<sprintf()> will now
+reject any tainted format argument. (Rafael Garcia-Suarez)
+
+=head2 undef and signal handlers
+
+Undefining or deleting a signal handler via C<undef $SIG{FOO}> is now
+equivalent to setting it to C<'DEFAULT'>. (Rafael)
+
+=head2 strictures and array/hash dereferencing in defined()
+
+C<defined @$foo> and C<defined %$bar> are now subject to C<strict 'refs'>
+(that is, C<$foo> and C<$bar> shall be proper references there.)
+(Nicholas Clark)
+
+(However, C<defined(@foo)> and C<defined(%bar)> are discouraged constructs
+anyway.)
+
+=head2 C<(?p{})> has been removed
+
+The regular expression construct C<(?p{})>, which was deprecated in perl
+5.8, has been removed. Use C<(??{})> instead. (Rafael)
+
+=head2 Pseudo-hashes have been removed
+
+Support for pseudo-hashes has been removed from Perl 5.9. (The C<fields>
+pragma remains here, but uses an alternate implementation.)
+
+=head2 Removal of the bytecode compiler and of perlcc
+
+C<perlcc>, the byteloader and the supporting modules (B::C, B::CC,
+B::Bytecode, etc.) are no longer distributed with the perl sources. Those
+experimental tools have never worked reliably, and, due to the lack of
+volunteers to keep them in line with the perl interpreter developments, it
+was decided to remove them instead of shipping a broken version of those.
+The last version of those modules can be found with perl 5.9.4.
+
+However the B compiler framework stays supported in the perl core, as with
+the more useful modules it has permitted (among others, B::Deparse and
+B::Concise).
+
+=head2 Removal of the JPL
+
+The JPL (Java-Perl Linguo) has been removed from the perl sources tarball.
+
+=head2 Recursive inheritance detected earlier
+
+Perl will now immediately throw an exception if you modify any package's
+C<@ISA> in such a way that it would cause recursive inheritance.
+
+Previously, the exception would not occur until Perl attempted to make
+use of the recursive inheritance while resolving a method or doing a
+C<$foo-E<gt>isa($bar)> lookup.
+
+=head1 Core Enhancements
+
+=head2 Regular expressions
+
+=over 4
+
+=item Recursive Patterns
+
+It is now possible to write recursive patterns without using the C<(??{})>
+construct. This new way is more efficient, and in many cases easier to
+read.
+
+Each capturing parenthesis can now be treated as an independent pattern
+that can be entered by using the C<(?PARNO)> syntax (C<PARNO> standing for
+"parenthesis number"). For example, the following pattern will match
+nested balanced angle brackets:
+
+ /
+ ^ # start of line
+ ( # start capture buffer 1
+ < # match an opening angle bracket
+ (?: # match one of:
+ (?> # don't backtrack over the inside of this group
+ [^<>]+ # one or more non angle brackets
+ ) # end non backtracking group
+ | # ... or ...
+ (?1) # recurse to bracket 1 and try it again
+ )* # 0 or more times.
+ > # match a closing angle bracket
+ ) # end capture buffer one
+ $ # end of line
+ /x
+
+Note, users experienced with PCRE will find that the Perl implementation
+of this feature differs from the PCRE one in that it is possible to
+backtrack into a recursed pattern, whereas in PCRE the recursion is
+atomic or "possessive" in nature. (Yves Orton)
+
+=item Named Capture Buffers
+
+It is now possible to name capturing parenthesis in a pattern and refer to
+the captured contents by name. The naming syntax is C<< (?<NAME>....) >>.
+It's possible to backreference to a named buffer with the C<< \k<NAME> >>
+syntax. In code, the new magical hashes C<%+> and C<%-> can be used to
+access the contents of the capture buffers.
+
+Thus, to replace all doubled chars, one could write
+
+ s/(?<letter>.)\k<letter>/$+{letter}/g
+
+Only buffers with defined contents will be "visible" in the C<%+> hash, so
+it's possible to do something like
+
+ foreach my $name (keys %+) {
+ print "content of buffer '$name' is $+{$name}\n";
+ }
+
+The C<%-> hash is a bit more complete, since it will contain array refs
+holding values from all capture buffers similarly named, if there should
+be many of them.
+
+C<%+> and C<%-> are implemented as tied hashes through the new module
+C<Tie::Hash::NamedCapture>.
+
+Users exposed to the .NET regex engine will find that the perl
+implementation differs in that the numerical ordering of the buffers
+is sequential, and not "unnamed first, then named". Thus in the pattern
+
+ /(A)(?<B>B)(C)(?<D>D)/
+
+$1 will be 'A', $2 will be 'B', $3 will be 'C' and $4 will be 'D' and not
+$1 is 'A', $2 is 'C' and $3 is 'B' and $4 is 'D' that a .NET programmer
+would expect. This is considered a feature. :-) (Yves Orton)
+
+=item Possessive Quantifiers
+
+Perl now supports the "possessive quantifier" syntax of the "atomic match"
+pattern. Basically a possessive quantifier matches as much as it can and never
+gives any back. Thus it can be used to control backtracking. The syntax is
+similar to non-greedy matching, except instead of using a '?' as the modifier
+the '+' is used. Thus C<?+>, C<*+>, C<++>, C<{min,max}+> are now legal
+quantifiers. (Yves Orton)
+
+=item Backtracking control verbs
+
+The regex engine now supports a number of special-purpose backtrack
+control verbs: (*THEN), (*PRUNE), (*MARK), (*SKIP), (*COMMIT), (*FAIL)
+and (*ACCEPT). See L<perlre> for their descriptions. (Yves Orton)
+
+=item Relative backreferences
+
+A new syntax C<\g{N}> or C<\gN> where "N" is a decimal integer allows a
+safer form of back-reference notation as well as allowing relative
+backreferences. This should make it easier to generate and embed patterns
+that contain backreferences. See L<perlre/"Capture buffers">. (Yves Orton)
+
+=item C<\K> escape
+
+The functionality of Jeff Pinyan's module Regexp::Keep has been added to
+the core. You can now use in regular expressions the special escape C<\K>
+as a way to do something like floating length positive lookbehind. It is
+also useful in substitutions like:
+
+ s/(foo)bar/$1/g
+
+that can now be converted to
+
+ s/foo\Kbar//g
+
+which is much more efficient. (Yves Orton)
+
+=item Vertical and horizontal whitespace, and linebreak
+
+Regular expressions now recognize the C<\v> and C<\h> escapes, that match
+vertical and horizontal whitespace, respectively. C<\V> and C<\H>
+logically match their complements.
+
+C<\R> matches a generic linebreak, that is, vertical whitespace, plus
+the multi-character sequence C<"\x0D\x0A">.
+
+=back
+
+=head2 The C<_> prototype
+
+A new prototype character has been added. C<_> is equivalent to C<$> (it
+denotes a scalar), but defaults to C<$_> if the corresponding argument
+isn't supplied. Due to the optional nature of the argument, you can only
+use it at the end of a prototype, or before a semicolon.
+
+This has a small incompatible consequence: the prototype() function has
+been adjusted to return C<_> for some built-ins in appropriate cases (for
+example, C<prototype('CORE::rmdir')>). (Rafael)
+
+=head2 UNITCHECK blocks
+
+C<UNITCHECK>, a new special code block has been introduced, in addition to
+C<BEGIN>, C<CHECK>, C<INIT> and C<END>.
+
+C<CHECK> and C<INIT> blocks, while useful for some specialized purposes,
+are always executed at the transition between the compilation and the
+execution of the main program, and thus are useless whenever code is
+loaded at runtime. On the other hand, C<UNITCHECK> blocks are executed
+just after the unit which defined them has been compiled. See L<perlmod>
+for more information. (Alex Gough)
+
+=head2 readpipe() is now overridable
+
+The built-in function readpipe() is now overridable. Overriding it permits
+also to override its operator counterpart, C<qx//> (a.k.a. C<``>).
+Moreover, it now defaults to C<$_> if no argument is provided. (Rafael)
+
+=head2 default argument for readline()
+
+readline() now defaults to C<*ARGV> if no argument is provided. (Rafael)
+
+=head2 UCD 5.0.0
+
+The copy of the Unicode Character Database included in Perl 5.9 has
+been updated to version 5.0.0.
+
+=head2 Smart match
+
+The smart match operator (C<~~>) is now available by default (you don't
+need to enable it with C<use feature> any longer). (Michael G Schwern)
+
+=head2 Implicit loading of C<feature>
+
+The C<feature> pragma is now implicitly loaded when you require a minimal
+perl version (with the C<use VERSION> construct) greater than, or equal
+to, 5.9.5.
+
+=head1 Modules and Pragmas
+
+=head2 New Pragma, C<mro>
+
+A new pragma, C<mro> (for Method Resolution Order) has been added. It
+permits to switch, on a per-class basis, the algorithm that perl uses to
+find inherited methods in case of a multiple inheritance hierarchy. The
+default MRO hasn't changed (DFS, for Depth First Search). Another MRO is
+available: the C3 algorithm. See L<mro> for more information.
+(Brandon Black)
+
+Note that, due to changes in the implementation of class hierarchy search,
+code that used to undef the C<*ISA> glob will most probably break. Anyway,
+undef'ing C<*ISA> had the side-effect of removing the magic on the @ISA
+array and should not have been done in the first place.
+
+=head2 bignum, bigint, bigrat
+
+The three numeric pragmas C<bignum>, C<bigint> and C<bigrat> are now
+lexically scoped. (Tels)
+
+=head2 Math::BigInt/Math::BigFloat
+
+Many bugs have been fixed; noteworthy are comparisons with NaN, which
+no longer warn about undef values.
+
+The following things are new:
+
+=over 4
+
+=item config()
+
+The config() method now also supports the calling-style
+C<< config('lib') >> in addition to C<< config()->{'lib'} >>.
+
+=item import()
+
+Upon import, using C<< lib => 'Foo' >> now warns if the low-level library
+cannot be found. To suppress the warning, you can use C<< try => 'Foo' >>
+instead. To convert the warning into a die, use C<< only => 'Foo' >>
+instead.
+
+=item roundmode common
+
+A rounding mode of C<common> is now supported.
+
+=back
+
+Also, support for the following methods has been added:
+
+=over 4
+
+=item bpi(), bcos(), bsin(), batan(), batan2()
+
+=item bmuladd()
+
+=item bexp(), bnok()
+
+=item from_hex(), from_oct(), and from_bin()
+
+=item as_oct()
+
+=back
+
+In addition, the default math-backend (Calc (Perl) and FastCalc (XS)) now
+support storing numbers in parts with 9 digits instead of 7 on Perls with
+either 64bit integer or long double support. This means math operations
+scale better and are thus faster for really big numbers.
+
+=head2 New Core Modules
+
+=over 4
+
+=item *
+
+C<Locale::Maketext::Simple>, needed by CPANPLUS, is a simple wrapper around
+C<Locale::Maketext::Lexicon>. Note that C<Locale::Maketext::Lexicon> isn't
+included in the perl core; the behaviour of C<Locale::Maketext::Simple>
+gracefully degrades when the later isn't present.
+
+=item *
+
+C<Params::Check> implements a generic input parsing/checking mechanism. It
+is used by CPANPLUS.
+
+=item *
+
+C<Term::UI> simplifies the task to ask questions at a terminal prompt.
+
+=item *
+
+C<Object::Accessor> provides an interface to create per-object accessors.
+
+=item *
+
+C<Module::Pluggable> is a simple framework to create modules that accept
+pluggable sub-modules.
+
+=item *
+
+C<Module::Load::Conditional> provides simple ways to query and possibly
+load installed modules.
+
+=item *
+
+C<Time::Piece> provides an object oriented interface to time functions,
+overriding the built-ins localtime() and gmtime().
+
+=item *
+
+C<IPC::Cmd> helps to find and run external commands, possibly
+interactively.
+
+=item *
+
+C<File::Fetch> provide a simple generic file fetching mechanism.
+
+=item *
+
+C<Log::Message> and C<Log::Message::Simple> are used by the log facility
+of C<CPANPLUS>.
+
+=item *
+
+C<Archive::Extract> is a generic archive extraction mechanism
+for F<.tar> (plain, gziped or bzipped) or F<.zip> files.
+
+=item *
+
+C<CPANPLUS> provides an API and a command-line tool to access the CPAN
+mirrors.
+
+=back
+
+=head2 Module changes
+
+=over 4
+
+=item C<assertions>
+
+The C<assertions> pragma, its submodules C<assertions::activate> and
+C<assertions::compat> and the B<-A> command-line switch have been removed.
+The interface was not judged mature enough for inclusion in a stable
+release.
+
+=item C<base>
+
+The C<base> pragma now warns if a class tries to inherit from itself.
+(Curtis "Ovid" Poe)
+
+=item C<strict> and C<warnings>
+
+C<strict> and C<warnings> will now complain loudly if they are loaded via
+incorrect casing (as in C<use Strict;>). (Johan Vromans)
+
+=item C<warnings>
+
+The C<warnings> pragma doesn't load C<Carp> anymore. That means that code
+that used C<Carp> routines without having loaded it at compile time might
+need to be adjusted; typically, the following (faulty) code won't work
+anymore, and will require parentheses to be added after the function name:
+
+ use warnings;
+ require Carp;
+ Carp::confess "argh";
+
+=item C<less>
+
+C<less> now does something useful (or at least it tries to). In fact, it
+has been turned into a lexical pragma. So, in your modules, you can now
+test whether your users have requested to use less CPU, or less memory,
+less magic, or maybe even less fat. See L<less> for more. (Joshua ben
+Jore)
+
+=item C<Attribute::Handlers>
+
+C<Attribute::Handlers> can now report the caller's file and line number.
+(David Feldman)
+
+=item C<B::Lint>
+
+C<B::Lint> is now based on C<Module::Pluggable>, and so can be extended
+with plugins. (Joshua ben Jore)
+
+=item C<B>
+
+It's now possible to access the lexical pragma hints (C<%^H>) by using the
+method B::COP::hints_hash(). It returns a C<B::RHE> object, which in turn
+can be used to get a hash reference via the method B::RHE::HASH(). (Joshua
+ben Jore)
+
+=for p5p XXX document this in B.pm too
+
+=item C<Thread>
+
+As the old 5005thread threading model has been removed, in favor of the
+ithreads scheme, the C<Thread> module is now a compatibility wrapper, to
+be used in old code only. It has been removed from the default list of
+dynamic extensions.
+
+=back
+
+=head1 Utility Changes
+
+=head2 C<cpanp>
+
+C<cpanp>, the CPANPLUS shell, has been added. (C<cpanp-run-perl>, an
+helper for CPANPLUS operation, has been added too, but isn't intended for
+direct use).
+
+=head2 C<cpan2dist>
+
+C<cpan2dist> is a new utility, that comes with CPANPLUS. It's a tool to
+create distributions (or packages) from CPAN modules.
+
+=head2 C<pod2html>
+
+The output of C<pod2html> has been enhanced to be more customizable via
+CSS. Some formatting problems were also corrected. (Jari Aalto)
+
+=head1 Documentation
+
+=head2 New manpage, perlunifaq
+
+A new manual page, L<perlunifaq> (the Perl Unicode FAQ), has been added
+(Juerd Waalboer).
+
+=head1 Installation and Configuration Improvements
+
+=head2 C++ compatibility
+
+Efforts have been made to make perl and the core XS modules compilable
+with various C++ compilers (although the situation is not perfect with
+some of the compilers on some of the platforms tested.)
+
+=head2 Visual C++
+
+Perl now can be compiled with Microsoft Visual C++ 2005.
+
+=head2 Static build on Win32
+
+It's now possible to build a C<perl-static.exe> that doesn't depend
+on C<perl59.dll> on Win32. See the Win32 makefiles for details.
+(Vadim Konovalov)
+
+=head2 win32 builds
+
+All win32 builds (MS-Win, WinCE) have been merged and cleaned up.
+
+=head2 C<d_pseudofork> and C<d_printf_format_null>
+
+A new configuration variable, available as C<$Config{d_pseudofork}> in
+the L<Config> module, has been added, to distinguish real fork() support
+from fake pseudofork used on Windows platforms.
+
+A new configuration variable, C<d_printf_format_null>, has been added,
+to see if printf-like formats are allowed to be NULL.
+
+=head2 Help
+
+C<Configure -h> has been extended with the most used option.
+
+Much less 'Whoa there' messages.
+
+=head2 64bit systems
+
+Better detection of 64bit(only) systems, and setting all the (library)
+paths accordingly.
+
+=head2 Ports
+
+Perl has been reported to work on MidnightBSD.
+
+Support for Cray XT4 Catamount/Qk has been added.
+
+Vendor patches have been merged for RedHat and GenToo.
+
+=head1 Selected Bug Fixes
+
+PerlIO::scalar will now prevent writing to read-only scalars. Moreover,
+seek() is now supported with PerlIO::scalar-based filehandles, the
+underlying string being zero-filled as needed. (Rafael, Jarkko Hietaniemi)
+
+study() never worked for UTF-8 strings, but could lead to false results.
+It's now a no-op on UTF-8 data. (Yves Orton)
+
+The signals SIGILL, SIGBUS and SIGSEGV are now always delivered in an
+"unsafe" manner (contrary to other signals, that are deferred until the
+perl interpreter reaches a reasonably stable state; see
+L<perlipc/"Deferred Signals (Safe Signals)">). (Rafael)
+
+When a module or a file is loaded through an @INC-hook, and when this hook
+has set a filename entry in %INC, __FILE__ is now set for this module
+accordingly to the contents of that %INC entry. (Rafael)
+
+The C<-w> and C<-t> switches can now be used together without messing
+up what categories of warnings are activated or not. (Rafael)
+
+Duping a filehandle which has the C<:utf8> PerlIO layer set will now
+properly carry that layer on the duped filehandle. (Rafael)
+
+Localizing an hash element whose key was given as a variable didn't work
+correctly if the variable was changed while the local() was in effect (as
+in C<local $h{$x}; ++$x>). (Bo Lindbergh)
+
+=head1 New or Changed Diagnostics
+
+=head2 Deprecations
+
+Two deprecation warnings have been added: (Rafael)
+
+ Opening dirhandle %s also as a file
+ Opening filehandle %s also as a directory
+
+=head1 Changed Internals
+
+The anonymous hash and array constructors now take 1 op in the optree
+instead of 3, now that pp_anonhash and pp_anonlist return a reference to
+an hash/array when the op is flagged with OPf_SPECIAL (Nicholas Clark).
+
+=for p5p XXX have we some docs on how to create regexp engine plugins, since that's now possible ? (perlreguts)
+
+=for p5p XXX new BIND SV type, #29544, #29642
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://rt.perl.org/rt3/ . There may also be
+information at http://www.perl.org/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlaix.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlaix.pod
new file mode 100755
index 00000000000..62d574e0259
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlaix.pod
@@ -0,0 +1,475 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.aix - Perl version 5 on IBM Unix (AIX) systems
+
+=head1 DESCRIPTION
+
+This document describes various features of IBM's Unix operating
+system (AIX) that will affect how Perl version 5 (hereafter just Perl)
+is compiled and/or runs.
+
+=head2 Compiling Perl 5 on AIX
+
+For information on compilers on older versions of AIX, see L<Compiling
+Perl 5 on older AIX versions up to 4.3.3>.
+
+When compiling Perl, you must use an ANSI C compiler. AIX does not ship
+an ANSI compliant C-compiler with AIX by default, but binary builds of
+gcc for AIX are widely available.
+
+=head2 Supported Compilers
+
+Currently all versions of IBM's "xlc", "xlc_r", "cc", "cc_r" or
+"vac" ANSI/C compiler will work for building Perl if that compiler
+works on your system.
+
+If you plan to link Perl to any module that requires thread-support,
+like DBD::Oracle, it is better to use the _r version of the compiler.
+This will not build a threaded Perl, but a thread-enabled Perl. See
+also L<Threaded Perl> later on.
+
+As of writing (2009-08) only the IBM XL C for AIX or XL C/C++ for AIX
+compiler is supported by IBM on AIX 5L/6.1.
+
+The following compiler versions are supported by IBM:
+
+XL C and XL C/C++ V7, V8, V9, V10
+
+The XL C for AIX is integrated in the XL C/C++ for AIX compiler.
+
+If you choose XL C/C++ V9 you need APAR IZ35785 installed
+otherwise the integrated SDBM_File do not compile correctly due
+to an optimization bug. You can circumvent this problem by
+adding -qipa to the optimization flags (-Doptimize='-O -qipa').
+The PTF for APAR IZ35785 which solves this problem is available
+from IBM (April 2009 PTF for XL C/C++ Enterprise Edition for AIX, V9.0).
+
+Perl can be compiled with either IBM's ANSI C compiler or with gcc.
+The former is recommended, as not only it can compile Perl with no
+difficulty, but also can take advantage of features listed later
+that require the use of IBM compiler-specific command-line flags.
+
+If you decide to use gcc, make sure your installation is recent and
+complete, and be sure to read the Perl INSTALL file for more gcc-specific
+details. Please report any hoops you had to jump through to the
+development team.
+
+=head2 Incompatibility with AIX Toolbox lib gdbm
+
+If the AIX Toolbox version of lib gdbm 1.8.x is installed on the
+system then Perl will not work. This library contains a defect version
+of the dbm_store() function. The lib gdbm will be automatically removed
+from the wanted libraries.
+
+=head2 Perl 5.10 was successfully compiled and tested on:
+
+ AIX Level | Compiler Level | w th | w/o th
+ --------------------------+-------------------------+------+-------
+ 5.1 TL9 32 bit | XL C/C++ V7 | OK | OK
+ 5.1 TL9 32 bit | gcc 3.2.2 | OK | OK
+ 5.1 TL9 64 bit | XL C/C++ V7 | OK | OK
+ 5.2 TL10 32 bit | XL C/C++ V8 | OK | OK
+ 5.2 TL8 64 bit | VA C/C++ V6 | OK | OK
+ 5.2 TL10 64 bit | XL C/C++ V8 | OK | OK
+ 5.3 TL7 32 bit | XL C/C++ V9 + IZ35785 | OK | OK
+ 5.3 TL7 32 bit | gcc 4.2.4 | OK | OK
+ 5.3 TL7 64 bit | XL C/C++ V9 + IZ35785 | OK | OK
+ 6.1 TL1 32 bit | XL C/C++ V10 | OK | OK
+ 6.1 TL1 64 bit + IZ39077 | XL C/C++ V10 | OK | OK
+
+ w th = with thread
+ w/o th = without thread
+ OK = tested
+
+Successfully tested means that all "make test" runs finish with an
+result of 100% OK. All tests were conducted with -Duseshrplib set.
+
+=head2 Building Dynamic Extensions on AIX
+
+Starting from Perl 5.7.2 (and consequently 5.8.x / 5.10.x) and AIX 4.3
+or newer Perl uses the AIX native dynamic loading interface in the so
+called runtime linking mode instead of the emulated interface that was
+used in Perl releases 5.6.1 and earlier or, for AIX releases 4.2 and
+earlier. This change does break backward compatibility with compiled
+modules from earlier Perl releases. The change was made to make Perl
+more compliant with other applications like Apache/mod_perl which are
+using the AIX native interface. This change also enables the use of
+C++ code with static constructors and destructors in Perl extensions,
+which was not possible using the emulated interface.
+
+It is highly recommended to use the new interface.
+
+=head2 Using Large Files with Perl
+
+Should yield no problems.
+
+=head2 Threaded Perl
+
+Should yield no problems with AIX 5.1 / 5.2 / 5.3 and 6.1.
+
+IBM uses the AIX system Perl (V5.6.0 on AIX 5.1 and V5.8.2 on
+AIX 5.2 / 5.3 and 6.1) for some AIX
+system scripts. If you switch the links in /usr/bin from the
+AIX system Perl (/usr/opt/perl5) to the newly build Perl then you
+get the same features as with the IBM AIX system Perl if the
+threaded options are used.
+
+The threaded Perl build works also on AIX 5.1 but the IBM Perl
+build (Perl v5.6.0) is not threaded on AIX 5.1.
+
+=head2 64-bit Perl
+
+If your AIX system is installed with 64-bit support, you can expect 64-bit
+configurations to work. If you want to use 64-bit Perl on AIX 6.1
+you need a APAR for a libc.a bug which affects (n)dbm_XXX functions.
+The APAR number for this problem is IZ39077.
+
+If you need more memory (larger data segment) for your Perl programs you
+can set:
+
+ /etc/security/limits
+ default: (or your user)
+ data = -1 (default is 262144 * 512 byte)
+
+With the default setting the size is limited to 128MB.
+The -1 removes this limit. If the "make test" fails please change
+your /etc/security/limits as stated above.
+
+=head2 Recommended Options AIX 5.1/5.2/5.3 and 6.1 (threaded/32-bit)
+
+With the following options you get a threaded Perl version which
+passes all make tests in threaded 32-bit mode, which is the default
+configuration for the Perl builds that AIX ships with.
+
+ rm config.sh
+ ./Configure \
+ -d \
+ -Dcc=cc_r \
+ -Duseshrplib \
+ -Dusethreads \
+ -Dprefix=/usr/opt/perl5_32
+
+The -Dprefix option will install Perl in a directory parallel to the
+IBM AIX system Perl installation.
+
+=head2 Recommended Options AIX 5.1/5.2/5.3 and 6.1 (32-bit)
+
+With the following options you get a Perl version which passes
+all make tests in 32-bit mode.
+
+ rm config.sh
+ ./Configure \
+ -d \
+ -Dcc=cc_r \
+ -Duseshrplib \
+ -Dprefix=/usr/opt/perl5_32
+
+The -Dprefix option will install Perl in a directory parallel to the
+IBM AIX system Perl installation.
+
+=head2 Recommended Options AIX 5.1/5.2/5.3 and 6.1 (threaded/64-bit)
+
+With the following options you get a threaded Perl version which
+passes all make tests in 64-bit mode.
+
+ export OBJECT_MODE=64 / setenv OBJECT_MODE 64 (depending on your shell)
+
+ rm config.sh
+ ./Configure \
+ -d \
+ -Dcc=cc_r \
+ -Duseshrplib \
+ -Dusethreads \
+ -Duse64bitall \
+ -Dprefix=/usr/opt/perl5_64
+
+=head2 Recommended Options AIX 5.1/5.2/5.3 and 6.1(64-bit)
+
+With the following options you get a Perl version which passes all
+make tests in 64-bit mode.
+
+ export OBJECT_MODE=64 / setenv OBJECT_MODE 64 (depending on your shell)
+
+ rm config.sh
+ ./Configure \
+ -d \
+ -Dcc=cc_r \
+ -Duseshrplib \
+ -Duse64bitall \
+ -Dprefix=/usr/opt/perl5_64
+
+The -Dprefix option will install Perl in a directory parallel to the
+IBM AIX system Perl installation.
+
+If you choose gcc to compile 64-bit Perl then you need to add the
+following option:
+
+ -Dcc='gcc -maix64'
+
+
+=head2 Compiling Perl 5 on older AIX versions up to 4.3.3
+
+Due to the fact that AIX 4.3.3 reached end-of-service in December 31,
+2003 this information is provided as is. The Perl versions prior to
+Perl 5.8.9 could be compiled on AIX up to 4.3.3 with the following
+settings (your mileage may vary):
+
+When compiling Perl, you must use an ANSI C compiler. AIX does not ship
+an ANSI compliant C-compiler with AIX by default, but binary builds of
+gcc for AIX are widely available.
+
+At the moment of writing, AIX supports two different native C compilers,
+for which you have to pay: B<xlC> and B<vac>. If you decide to use either
+of these two (which is quite a lot easier than using gcc), be sure to
+upgrade to the latest available patch level. Currently:
+
+ xlC.C 3.1.4.10 or 3.6.6.0 or 4.0.2.2 or 5.0.2.9 or 6.0.0.3
+ vac.C 4.4.0.3 or 5.0.2.6 or 6.0.0.1
+
+note that xlC has the OS version in the name as of version 4.0.2.0, so
+you will find xlC.C for AIX-5.0 as package
+
+ xlC.aix50.rte 5.0.2.0 or 6.0.0.3
+
+subversions are not the same "latest" on all OS versions. For example,
+the latest xlC-5 on aix41 is 5.0.2.9, while on aix43, it is 5.0.2.7.
+
+Perl can be compiled with either IBM's ANSI C compiler or with gcc.
+The former is recommended, as not only can it compile Perl with no
+difficulty, but also can take advantage of features listed later that
+require the use of IBM compiler-specific command-line flags.
+
+The IBM's compiler patch levels 5.0.0.0 and 5.0.1.0 have compiler
+optimization bugs that affect compiling perl.c and regcomp.c,
+respectively. If Perl's configuration detects those compiler patch
+levels, optimization is turned off for the said source code files.
+Upgrading to at least 5.0.2.0 is recommended.
+
+If you decide to use gcc, make sure your installation is recent and
+complete, and be sure to read the Perl INSTALL file for more gcc-specific
+details. Please report any hoops you had to jump through to the development
+team.
+
+=head2 OS level
+
+Before installing the patches to the IBM C-compiler you need to know the
+level of patching for the Operating System. IBM's command 'oslevel' will
+show the base, but is not always complete (in this example oslevel shows
+4.3.NULL, whereas the system might run most of 4.3.THREE):
+
+ # oslevel
+ 4.3.0.0
+ # lslpp -l | grep 'bos.rte '
+ bos.rte 4.3.3.75 COMMITTED Base Operating System Runtime
+ bos.rte 4.3.2.0 COMMITTED Base Operating System Runtime
+ #
+
+The same might happen to AIX 5.1 or other OS levels. As a side note, Perl
+cannot be built without bos.adt.syscalls and bos.adt.libm installed
+
+ # lslpp -l | egrep "syscalls|libm"
+ bos.adt.libm 5.1.0.25 COMMITTED Base Application Development
+ bos.adt.syscalls 5.1.0.36 COMMITTED System Calls Application
+ #
+
+=head2 Building Dynamic Extensions on AIX
+
+AIX supports dynamically loadable objects as well as shared libraries.
+Shared libraries by convention end with the suffix .a, which is a bit
+misleading, as an archive can contain static as well as dynamic members.
+For Perl dynamically loaded objects we use the .so suffix also used on
+many other platforms.
+
+Note that starting from Perl 5.7.2 (and consequently 5.8.0) and AIX 4.3
+or newer Perl uses the AIX native dynamic loading interface in the so
+called runtime linking mode instead of the emulated interface that was
+used in Perl releases 5.6.1 and earlier or, for AIX releases 4.2 and
+earlier. This change does break backward compatibility with compiled
+modules from earlier Perl releases. The change was made to make Perl
+more compliant with other applications like Apache/mod_perl which are
+using the AIX native interface. This change also enables the use of C++
+code with static constructors and destructors in Perl extensions, which
+was not possible using the emulated interface.
+
+=head2 The IBM ANSI C Compiler
+
+All defaults for Configure can be used.
+
+If you've chosen to use vac 4, be sure to run 4.4.0.3. Older versions
+will turn up nasty later on. For vac 5 be sure to run at least 5.0.1.0,
+but vac 5.0.2.6 or up is highly recommended. Note that since IBM has
+removed vac 5.0.2.1 through 5.0.2.5 from the software depot, these
+versions should be considered obsolete.
+
+Here's a brief lead of how to upgrade the compiler to the latest
+level. Of course this is subject to changes. You can only upgrade
+versions from ftp-available updates if the first three digit groups
+are the same (in where you can skip intermediate unlike the patches
+in the developer snapshots of Perl), or to one version up where the
+"base" is available. In other words, the AIX compiler patches are
+cumulative.
+
+ vac.C.4.4.0.1 => vac.C.4.4.0.3 is OK (vac.C.4.4.0.2 not needed)
+ xlC.C.3.1.3.3 => xlC.C.3.1.4.10 is NOT OK (xlC.C.3.1.4.0 is not available)
+
+ # ftp ftp.software.ibm.com
+ Connected to service.boulder.ibm.com.
+ : welcome message ...
+ Name (ftp.software.ibm.com:merijn): anonymous
+ 331 Guest login ok, send your complete e-mail address as password.
+ Password:
+ ... accepted login stuff
+ ftp> cd /aix/fixes/v4/
+ ftp> dir other other.ll
+ output to local-file: other.ll? y
+ 200 PORT command successful.
+ 150 Opening ASCII mode data connection for /bin/ls.
+ 226 Transfer complete.
+ ftp> dir xlc xlc.ll
+ output to local-file: xlc.ll? y
+ 200 PORT command successful.
+ 150 Opening ASCII mode data connection for /bin/ls.
+ 226 Transfer complete.
+ ftp> bye
+ ... goodbye messages
+ # ls -l *.ll
+ -rw-rw-rw- 1 merijn system 1169432 Nov 2 17:29 other.ll
+ -rw-rw-rw- 1 merijn system 29170 Nov 2 17:29 xlc.ll
+
+On AIX 4.2 using xlC, we continue:
+
+ # lslpp -l | fgrep 'xlC.C '
+ xlC.C 3.1.4.9 COMMITTED C for AIX Compiler
+ xlC.C 3.1.4.0 COMMITTED C for AIX Compiler
+ # grep 'xlC.C.3.1.4.*.bff' xlc.ll
+ -rw-r--r-- 1 45776101 1 6286336 Jul 22 1996 xlC.C.3.1.4.1.bff
+ -rw-rw-r-- 1 45776101 1 6173696 Aug 24 1998 xlC.C.3.1.4.10.bff
+ -rw-r--r-- 1 45776101 1 6319104 Aug 14 1996 xlC.C.3.1.4.2.bff
+ -rw-r--r-- 1 45776101 1 6316032 Oct 21 1996 xlC.C.3.1.4.3.bff
+ -rw-r--r-- 1 45776101 1 6315008 Dec 20 1996 xlC.C.3.1.4.4.bff
+ -rw-rw-r-- 1 45776101 1 6178816 Mar 28 1997 xlC.C.3.1.4.5.bff
+ -rw-rw-r-- 1 45776101 1 6188032 May 22 1997 xlC.C.3.1.4.6.bff
+ -rw-rw-r-- 1 45776101 1 6191104 Sep 5 1997 xlC.C.3.1.4.7.bff
+ -rw-rw-r-- 1 45776101 1 6185984 Jan 13 1998 xlC.C.3.1.4.8.bff
+ -rw-rw-r-- 1 45776101 1 6169600 May 27 1998 xlC.C.3.1.4.9.bff
+ # wget ftp://ftp.software.ibm.com/aix/fixes/v4/xlc/xlC.C.3.1.4.10.bff
+ #
+
+On AIX 4.3 using vac, we continue:
+
+ # lslpp -l | grep 'vac.C '
+ vac.C 5.0.2.2 COMMITTED C for AIX Compiler
+ vac.C 5.0.2.0 COMMITTED C for AIX Compiler
+ # grep 'vac.C.5.0.2.*.bff' other.ll
+ -rw-rw-r-- 1 45776101 1 13592576 Apr 16 2001 vac.C.5.0.2.0.bff
+ -rw-rw-r-- 1 45776101 1 14133248 Apr 9 2002 vac.C.5.0.2.3.bff
+ -rw-rw-r-- 1 45776101 1 14173184 May 20 2002 vac.C.5.0.2.4.bff
+ -rw-rw-r-- 1 45776101 1 14192640 Nov 22 2002 vac.C.5.0.2.6.bff
+ # wget ftp://ftp.software.ibm.com/aix/fixes/v4/other/vac.C.5.0.2.6.bff
+ #
+
+Likewise on all other OS levels. Then execute the following command, and
+fill in its choices
+
+ # smit install_update
+ -> Install and Update from LATEST Available Software
+ * INPUT device / directory for software [ vac.C.5.0.2.6.bff ]
+ [ OK ]
+ [ OK ]
+
+Follow the messages ... and you're done.
+
+If you like a more web-like approach, a good start point can be
+http://www14.software.ibm.com/webapp/download/downloadaz.jsp and click
+"C for AIX", and follow the instructions.
+
+=head2 The usenm option
+
+If linking miniperl
+
+ cc -o miniperl ... miniperlmain.o opmini.o perl.o ... -lm -lc ...
+
+causes error like this
+
+ ld: 0711-317 ERROR: Undefined symbol: .aintl
+ ld: 0711-317 ERROR: Undefined symbol: .copysignl
+ ld: 0711-317 ERROR: Undefined symbol: .syscall
+ ld: 0711-317 ERROR: Undefined symbol: .eaccess
+ ld: 0711-317 ERROR: Undefined symbol: .setresuid
+ ld: 0711-317 ERROR: Undefined symbol: .setresgid
+ ld: 0711-317 ERROR: Undefined symbol: .setproctitle
+ ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
+
+you could retry with
+
+ make realclean
+ rm config.sh
+ ./Configure -Dusenm ...
+
+which makes Configure to use the C<nm> tool when scanning for library
+symbols, which usually is not done in AIX.
+
+Related to this, you probably should not use the C<-r> option of
+Configure in AIX, because that affects of how the C<nm> tool is used.
+
+=head2 Using GNU's gcc for building Perl
+
+Using gcc-3.x (tested with 3.0.4, 3.1, and 3.2) now works out of the box,
+as do recent gcc-2.9 builds available directly from IBM as part of their
+Linux compatibility packages, available here:
+
+ http://www.ibm.com/servers/aix/products/aixos/linux/
+
+=head2 Using Large Files with Perl
+
+Should yield no problems.
+
+=head2 Threaded Perl
+
+Threads seem to work OK, though at the moment not all tests pass when
+threads are used in combination with 64-bit configurations.
+
+You may get a warning when doing a threaded build:
+
+ "pp_sys.c", line 4640.39: 1506-280 (W) Function argument assignment between types "unsigned char*" and "const void*" is not allowed.
+
+The exact line number may vary, but if the warning (W) comes from a line
+line this
+
+ hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
+
+in the "pp_ghostent" function, you may ignore it safely. The warning
+is caused by the reentrant variant of gethostbyaddr() having a slightly
+different prototype than its non-reentrant variant, but the difference
+is not really significant here.
+
+=head2 64-bit Perl
+
+If your AIX is installed with 64-bit support, you can expect 64-bit
+configurations to work. In combination with threads some tests might
+still fail.
+
+=head2 AIX 4.2 and extensions using C++ with statics
+
+In AIX 4.2 Perl extensions that use C++ functions that use statics
+may have problems in that the statics are not getting initialized.
+In newer AIX releases this has been solved by linking Perl with
+the libC_r library, but unfortunately in AIX 4.2 the said library
+has an obscure bug where the various functions related to time
+(such as time() and gettimeofday()) return broken values, and
+therefore in AIX 4.2 Perl is not linked against the libC_r.
+
+=head1 AUTHORS
+
+H.Merijn Brand <h.m.brand@xs4all.nl>
+Rainer Tammer <tammer@tammer.net>
+
+=head1 DATE
+
+Version 0.0.10: 07 Aug 2009
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlamiga.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlamiga.pod
new file mode 100755
index 00000000000..418a5fe635f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlamiga.pod
@@ -0,0 +1,278 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+perlamiga - Perl under Amiga OS
+
+=head1 NOTE
+
+B<Perl 5.8.0 cannot be built in AmigaOS. You can use either the
+maintenance release Perl 5.6.1 or the development release Perl 5.7.2
+in AmigaOS. See L</"PERL 5.8.0 BROKEN IN AMIGAOS"> if you want to help
+fixing this problem.>
+
+=head1 SYNOPSIS
+
+One can read this document in the following formats:
+
+ man perlamiga
+ multiview perlamiga.guide
+
+to list some (not all may be available simultaneously), or it may
+be read I<as is>: either as F<README.amiga>, or F<pod/perlamiga.pod>.
+
+A recent version of perl for the Amiga can be found at the Geek Gadgets
+section of the Aminet:
+
+ http://www.aminet.net/~aminet/dev/gg
+
+=cut
+
+Contents
+
+ perlamiga - Perl under Amiga OS
+
+ NAME
+ SYNOPSIS
+ DESCRIPTION
+ - Prerequisites
+ - Starting Perl programs under AmigaOS
+ - Shortcomings of Perl under AmigaOS
+ INSTALLATION
+ Accessing documentation
+ - Manpages
+ - HTML
+ - GNU info files
+ - LaTeX docs
+ BUILD
+ - Build Prerequisites
+ - Getting the perl source
+ - Application of the patches
+ - Making
+ - Testing
+ - Installing the built perl
+ AUTHOR
+ SEE ALSO
+
+=head1 DESCRIPTION
+
+=head2 Prerequisites for Compiling Perl on AmigaOS
+
+=over 6
+
+=item B<Unix emulation for AmigaOS: ixemul.library>
+
+You need the Unix emulation for AmigaOS, whose most important part is
+B<ixemul.library>. For a minimum setup, get the latest versions
+of the following packages from the Aminet archives
+( http://www.aminet.net/~aminet/ ):
+
+ ixemul-bin
+ ixemul-env-bin
+ pdksh-bin
+
+Note also that this is a minimum setup; you might want to add other
+packages of B<ADE> (the I<Amiga Developers Environment>).
+
+=item B<Version of Amiga OS>
+
+You need at the very least AmigaOS version 2.0. Recommended is version 3.1.
+
+=back
+
+=head2 Starting Perl programs under AmigaOS
+
+Start your Perl program F<foo> with arguments C<arg1 arg2 arg3> the
+same way as on any other platform, by
+
+ perl foo arg1 arg2 arg3
+
+If you want to specify perl options C<-my_opts> to the perl itself (as
+opposed to your program), use
+
+ perl -my_opts foo arg1 arg2 arg3
+
+Alternately, you can try to get a replacement for the system's B<Execute>
+command that honors the #!/usr/bin/perl syntax in scripts and set the s-Bit
+of your scripts. Then you can invoke your scripts like under UNIX with
+
+ foo arg1 arg2 arg3
+
+(Note that having *nixish full path to perl F</usr/bin/perl> is not
+necessary, F<perl> would be enough, but having full path would make it
+easier to use your script under *nix.)
+
+=head2 Shortcomings of Perl under AmigaOS
+
+Perl under AmigaOS lacks some features of perl under UNIX because of
+deficiencies in the UNIX-emulation, most notably:
+
+=over 6
+
+=item *
+
+fork()
+
+=item *
+
+some features of the UNIX filesystem regarding link count and file dates
+
+=item *
+
+inplace operation (the -i switch) without backup file
+
+=item *
+
+umask() works, but the correct permissions are only set when the file is
+finally close()d
+
+=back
+
+=head1 INSTALLATION
+
+Change to the installation directory (most probably ADE:), and
+extract the binary distribution:
+
+lha -mraxe x perl-$VERSION-bin.lha
+
+or
+
+tar xvzpf perl-$VERSION-bin.tgz
+
+(Of course you need lha or tar and gunzip for this.)
+
+For installation of the Unix emulation, read the appropriate docs.
+
+=head1 Accessing documentation
+
+=head2 Manpages for Perl on AmigaOS
+
+If you have C<man> installed on your system, and you installed perl
+manpages, use something like this:
+
+ man perlfunc
+ man less
+ man ExtUtils.MakeMaker
+
+to access documentation for different components of Perl. Start with
+
+ man perl
+
+Note: You have to modify your man.conf file to search for manpages
+in the /ade/lib/perl5/man/man3 directory, or the man pages for the
+perl library will not be found.
+
+Note that dot (F<.>) is used as a package separator for documentation
+for packages, and as usual, sometimes you need to give the section - C<3>
+above - to avoid shadowing by the I<less(1) manpage>.
+
+
+=head2 Perl HTML Documentation on AmigaOS
+
+If you have some WWW browser available, you can build B<HTML> docs.
+Cd to directory with F<.pod> files, and do like this
+
+ cd /ade/lib/perl5/pod
+ pod2html
+
+After this you can direct your browser the file F<perl.html> in this
+directory, and go ahead with reading docs.
+
+Alternatively you may be able to get these docs prebuilt from C<CPAN>.
+
+=head2 Perl GNU Info Files on AmigaOS
+
+Users of C<Emacs> would appreciate it very much, especially with
+C<CPerl> mode loaded. You need to get latest C<pod2info> from C<CPAN>,
+or, alternately, prebuilt info pages.
+
+=head2 Perl LaTeX Documentation on AmigaOS
+
+Can be constructed using C<pod2latex>.
+
+=head1 BUILDING PERL ON AMIGAOS
+
+Here we discuss how to build Perl under AmigaOS.
+
+=head2 Build Prerequisites for Perl on AmigaOS
+
+You need to have the latest B<ixemul> (Unix emulation for Amiga)
+from Aminet.
+
+=head2 Getting the Perl Source for AmigaOS
+
+You can either get the latest perl-for-amiga source from Ninemoons
+and extract it with:
+
+ tar xvzpf perl-$VERSION-src.tgz
+
+or get the official source from CPAN:
+
+ http://www.cpan.org/src/5.0
+
+Extract it like this
+
+ tar xvzpf perl-$VERSION.tar.gz
+
+You will see a message about errors while extracting F<Configure>. This
+is normal and expected. (There is a conflict with a similarly-named file
+F<configure>, but it causes no harm.)
+
+=head2 Making Perl on AmigaOS
+
+Remember to use a hefty wad of stack (I use 2000000)
+
+ sh configure.gnu --prefix=/gg
+
+Now type
+
+ make depend
+
+Now!
+
+ make
+
+=head2 Testing Perl on AmigaOS
+
+Now run
+
+ make test
+
+Some tests will be skipped because they need the fork() function:
+
+F<io/pipe.t>, F<op/fork.t>, F<lib/filehand.t>, F<lib/open2.t>, F<lib/open3.t>,
+F<lib/io_pipe.t>, F<lib/io_sock.t>
+
+=head2 Installing the built Perl on AmigaOS
+
+Run
+
+ make install
+
+=head1 PERL 5.8.0 BROKEN IN AMIGAOS
+
+As told above, Perl 5.6.1 was still good in AmigaOS, as was 5.7.2.
+After Perl 5.7.2 (change #11423, see the Changes file, and the file
+pod/perlhack.pod for how to get the individual changes) Perl dropped
+its internal support for vfork(), and that was very probably the step
+that broke AmigaOS (since the ixemul library has only vfork).
+The build finally fails when the ext/DynaLoader is being built, and
+PERL ends up as "0" in the produced Makefile, trying to run "0" does
+not quite work. Also, executing miniperl in backticks seems to
+generate nothing: very probably related to the (v)fork problems.
+B<Fixing the breakage requires someone quite familiar with the ixemul
+library, and how one is supposed to run external commands in AmigaOS
+without fork().>
+
+=head1 AUTHORS
+
+Norbert Pueschel, pueschel@imsdd.meb.uni-bonn.de
+Jan-Erik Karlsson, trg@privat.utfors.se
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlapi.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlapi.pod
new file mode 100755
index 00000000000..1aac471a408
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlapi.pod
@@ -0,0 +1,7388 @@
+-*- buffer-read-only: t -*-
+
+!!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+This file is built by ..\autodoc.pl extracting documentation from the C source
+files.
+
+=head1 NAME
+
+perlapi - autogenerated documentation for the perl public API
+
+=head1 DESCRIPTION
+X<Perl API> X<API> X<api>
+
+This file contains the documentation of the perl public API generated by
+embed.pl, specifically a listing of functions, macros, flags, and variables
+that may be used by extension writers. The interfaces of any functions that
+are not listed here are subject to change without notice. For this reason,
+blindly using functions listed in proto.h is to be avoided when writing
+extensions.
+
+Note that all Perl API global variables must be referenced with the C<PL_>
+prefix. Some macros are provided for compatibility with the older,
+unadorned names, but this support may be disabled in a future release.
+
+Perl was originally written to handle US-ASCII only (that is characters
+whose ordinal numbers are in the range 0 - 127).
+And documentation and comments may still use the term ASCII, when
+sometimes in fact the entire range from 0 - 255 is meant.
+
+Note that Perl can be compiled and run under EBCDIC (See L<perlebcdic>)
+or ASCII. Most of the documentation (and even comments in the code)
+ignore the EBCDIC possibility.
+For almost all purposes the differences are transparent.
+As an example, under EBCDIC,
+instead of UTF-8, UTF-EBCDIC is used to encode Unicode strings, and so
+whenever this documentation refers to C<utf8>
+(and variants of that name, including in function names),
+it also (essentially transparently) means C<UTF-EBCDIC>.
+But the ordinals of characters differ between ASCII, EBCDIC, and
+the UTF- encodings, and a string encoded in UTF-EBCDIC may occupy more bytes
+than in UTF-8.
+
+Also, on some EBCDIC machines, functions that are documented as operating on
+US-ASCII (or Basic Latin in Unicode terminology) may in fact operate on all
+256 characters in the EBCDIC range, not just the subset corresponding to
+US-ASCII.
+
+The listing below is alphabetical, case insensitive.
+
+
+=head1 "Gimme" Values
+
+=over 8
+
+=item GIMME
+X<GIMME>
+
+A backward-compatible version of C<GIMME_V> which can only return
+C<G_SCALAR> or C<G_ARRAY>; in a void context, it returns C<G_SCALAR>.
+Deprecated. Use C<GIMME_V> instead.
+
+ U32 GIMME
+
+=for hackers
+Found in file op.h
+
+=item GIMME_V
+X<GIMME_V>
+
+The XSUB-writer's equivalent to Perl's C<wantarray>. Returns C<G_VOID>,
+C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
+respectively.
+
+ U32 GIMME_V
+
+=for hackers
+Found in file op.h
+
+=item G_ARRAY
+X<G_ARRAY>
+
+Used to indicate list context. See C<GIMME_V>, C<GIMME> and
+L<perlcall>.
+
+=for hackers
+Found in file cop.h
+
+=item G_DISCARD
+X<G_DISCARD>
+
+Indicates that arguments returned from a callback should be discarded. See
+L<perlcall>.
+
+=for hackers
+Found in file cop.h
+
+=item G_EVAL
+X<G_EVAL>
+
+Used to force a Perl C<eval> wrapper around a callback. See
+L<perlcall>.
+
+=for hackers
+Found in file cop.h
+
+=item G_NOARGS
+X<G_NOARGS>
+
+Indicates that no arguments are being sent to a callback. See
+L<perlcall>.
+
+=for hackers
+Found in file cop.h
+
+=item G_SCALAR
+X<G_SCALAR>
+
+Used to indicate scalar context. See C<GIMME_V>, C<GIMME>, and
+L<perlcall>.
+
+=for hackers
+Found in file cop.h
+
+=item G_VOID
+X<G_VOID>
+
+Used to indicate void context. See C<GIMME_V> and L<perlcall>.
+
+=for hackers
+Found in file cop.h
+
+
+=back
+
+=head1 Array Manipulation Functions
+
+=over 8
+
+=item AvFILL
+X<AvFILL>
+
+Same as C<av_len()>. Deprecated, use C<av_len()> instead.
+
+ int AvFILL(AV* av)
+
+=for hackers
+Found in file av.h
+
+=item av_clear
+X<av_clear>
+
+Clears an array, making it empty. Does not free the memory used by the
+array itself.
+
+ void av_clear(AV *av)
+
+=for hackers
+Found in file av.c
+
+=item av_create_and_push
+X<av_create_and_push>
+
+Push an SV onto the end of the array, creating the array if necessary.
+A small internal helper function to remove a commonly duplicated idiom.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ void av_create_and_push(AV **const avp, SV *const val)
+
+=for hackers
+Found in file av.c
+
+=item av_create_and_unshift_one
+X<av_create_and_unshift_one>
+
+Unshifts an SV onto the beginning of the array, creating the array if
+necessary.
+A small internal helper function to remove a commonly duplicated idiom.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ SV** av_create_and_unshift_one(AV **const avp, SV *const val)
+
+=for hackers
+Found in file av.c
+
+=item av_delete
+X<av_delete>
+
+Deletes the element indexed by C<key> from the array. Returns the
+deleted element. If C<flags> equals C<G_DISCARD>, the element is freed
+and null is returned.
+
+ SV* av_delete(AV *av, I32 key, I32 flags)
+
+=for hackers
+Found in file av.c
+
+=item av_exists
+X<av_exists>
+
+Returns true if the element indexed by C<key> has been initialized.
+
+This relies on the fact that uninitialized array elements are set to
+C<&PL_sv_undef>.
+
+ bool av_exists(AV *av, I32 key)
+
+=for hackers
+Found in file av.c
+
+=item av_extend
+X<av_extend>
+
+Pre-extend an array. The C<key> is the index to which the array should be
+extended.
+
+ void av_extend(AV *av, I32 key)
+
+=for hackers
+Found in file av.c
+
+=item av_fetch
+X<av_fetch>
+
+Returns the SV at the specified index in the array. The C<key> is the
+index. If C<lval> is set then the fetch will be part of a store. Check
+that the return value is non-null before dereferencing it to a C<SV*>.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
+more information on how to use this function on tied arrays.
+
+ SV** av_fetch(AV *av, I32 key, I32 lval)
+
+=for hackers
+Found in file av.c
+
+=item av_fill
+X<av_fill>
+
+Set the highest index in the array to the given number, equivalent to
+Perl's C<$#array = $fill;>.
+
+The number of elements in the an array will be C<fill + 1> after
+av_fill() returns. If the array was previously shorter then the
+additional elements appended are set to C<PL_sv_undef>. If the array
+was longer, then the excess elements are freed. C<av_fill(av, -1)> is
+the same as C<av_clear(av)>.
+
+ void av_fill(AV *av, I32 fill)
+
+=for hackers
+Found in file av.c
+
+=item av_len
+X<av_len>
+
+Returns the highest index in the array. The number of elements in the
+array is C<av_len(av) + 1>. Returns -1 if the array is empty.
+
+ I32 av_len(const AV *av)
+
+=for hackers
+Found in file av.c
+
+=item av_make
+X<av_make>
+
+Creates a new AV and populates it with a list of SVs. The SVs are copied
+into the array, so they may be freed after the call to av_make. The new AV
+will have a reference count of 1.
+
+ AV* av_make(I32 size, SV **strp)
+
+=for hackers
+Found in file av.c
+
+=item av_pop
+X<av_pop>
+
+Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
+is empty.
+
+ SV* av_pop(AV *av)
+
+=for hackers
+Found in file av.c
+
+=item av_push
+X<av_push>
+
+Pushes an SV onto the end of the array. The array will grow automatically
+to accommodate the addition. Like C<av_store>, this takes ownership of one
+reference count.
+
+ void av_push(AV *av, SV *val)
+
+=for hackers
+Found in file av.c
+
+=item av_shift
+X<av_shift>
+
+Shifts an SV off the beginning of the array. Returns C<&PL_sv_undef> if the
+array is empty.
+
+ SV* av_shift(AV *av)
+
+=for hackers
+Found in file av.c
+
+=item av_store
+X<av_store>
+
+Stores an SV in an array. The array index is specified as C<key>. The
+return value will be NULL if the operation failed or if the value did not
+need to be actually stored within the array (as in the case of tied
+arrays). Otherwise it can be dereferenced to get the original C<SV*>. Note
+that the caller is responsible for suitably incrementing the reference
+count of C<val> before the call, and decrementing it if the function
+returned NULL.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
+more information on how to use this function on tied arrays.
+
+ SV** av_store(AV *av, I32 key, SV *val)
+
+=for hackers
+Found in file av.c
+
+=item av_undef
+X<av_undef>
+
+Undefines the array. Frees the memory used by the array itself.
+
+ void av_undef(AV *av)
+
+=for hackers
+Found in file av.c
+
+=item av_unshift
+X<av_unshift>
+
+Unshift the given number of C<undef> values onto the beginning of the
+array. The array will grow automatically to accommodate the addition. You
+must then use C<av_store> to assign values to these new elements.
+
+ void av_unshift(AV *av, I32 num)
+
+=for hackers
+Found in file av.c
+
+=item get_av
+X<get_av>
+
+Returns the AV of the specified Perl array. C<flags> are passed to
+C<gv_fetchpv>. If C<GV_ADD> is set and the
+Perl variable does not exist then it will be created. If C<flags> is zero
+and the variable does not exist then NULL is returned.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ AV* get_av(const char *name, I32 flags)
+
+=for hackers
+Found in file perl.c
+
+=item newAV
+X<newAV>
+
+Creates a new AV. The reference count is set to 1.
+
+ AV* newAV()
+
+=for hackers
+Found in file av.h
+
+=item sortsv
+X<sortsv>
+
+Sort an array. Here is an example:
+
+ sortsv(AvARRAY(av), av_len(av)+1, Perl_sv_cmp_locale);
+
+Currently this always uses mergesort. See sortsv_flags for a more
+flexible routine.
+
+ void sortsv(SV** array, size_t num_elts, SVCOMPARE_t cmp)
+
+=for hackers
+Found in file pp_sort.c
+
+=item sortsv_flags
+X<sortsv_flags>
+
+Sort an array, with various options.
+
+ void sortsv_flags(SV** array, size_t num_elts, SVCOMPARE_t cmp, U32 flags)
+
+=for hackers
+Found in file pp_sort.c
+
+
+=back
+
+=head1 Callback Functions
+
+=over 8
+
+=item call_argv
+X<call_argv>
+
+Performs a callback to the specified Perl sub. See L<perlcall>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ I32 call_argv(const char* sub_name, I32 flags, char** argv)
+
+=for hackers
+Found in file perl.c
+
+=item call_method
+X<call_method>
+
+Performs a callback to the specified Perl method. The blessed object must
+be on the stack. See L<perlcall>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ I32 call_method(const char* methname, I32 flags)
+
+=for hackers
+Found in file perl.c
+
+=item call_pv
+X<call_pv>
+
+Performs a callback to the specified Perl sub. See L<perlcall>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ I32 call_pv(const char* sub_name, I32 flags)
+
+=for hackers
+Found in file perl.c
+
+=item call_sv
+X<call_sv>
+
+Performs a callback to the Perl sub whose name is in the SV. See
+L<perlcall>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ I32 call_sv(SV* sv, VOL I32 flags)
+
+=for hackers
+Found in file perl.c
+
+=item ENTER
+X<ENTER>
+
+Opening bracket on a callback. See C<LEAVE> and L<perlcall>.
+
+ ENTER;
+
+=for hackers
+Found in file scope.h
+
+=item eval_pv
+X<eval_pv>
+
+Tells Perl to C<eval> the given string and return an SV* result.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ SV* eval_pv(const char* p, I32 croak_on_error)
+
+=for hackers
+Found in file perl.c
+
+=item eval_sv
+X<eval_sv>
+
+Tells Perl to C<eval> the string in the SV.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ I32 eval_sv(SV* sv, I32 flags)
+
+=for hackers
+Found in file perl.c
+
+=item FREETMPS
+X<FREETMPS>
+
+Closing bracket for temporaries on a callback. See C<SAVETMPS> and
+L<perlcall>.
+
+ FREETMPS;
+
+=for hackers
+Found in file scope.h
+
+=item LEAVE
+X<LEAVE>
+
+Closing bracket on a callback. See C<ENTER> and L<perlcall>.
+
+ LEAVE;
+
+=for hackers
+Found in file scope.h
+
+=item SAVETMPS
+X<SAVETMPS>
+
+Opening bracket for temporaries on a callback. See C<FREETMPS> and
+L<perlcall>.
+
+ SAVETMPS;
+
+=for hackers
+Found in file scope.h
+
+
+=back
+
+=head1 Character classes
+
+=over 8
+
+=item isALNUM
+X<isALNUM>
+
+Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
+alphanumeric character (including underscore) or digit.
+
+ bool isALNUM(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item isALPHA
+X<isALPHA>
+
+Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
+alphabetic character.
+
+ bool isALPHA(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item isDIGIT
+X<isDIGIT>
+
+Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
+digit.
+
+ bool isDIGIT(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item isLOWER
+X<isLOWER>
+
+Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
+lowercase character.
+
+ bool isLOWER(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item isSPACE
+X<isSPACE>
+
+Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
+whitespace.
+
+ bool isSPACE(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item isUPPER
+X<isUPPER>
+
+Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
+uppercase character.
+
+ bool isUPPER(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item toLOWER
+X<toLOWER>
+
+Converts the specified character to lowercase. Characters outside the
+US-ASCII (Basic Latin) range are viewed as not having any case.
+
+ char toLOWER(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item toUPPER
+X<toUPPER>
+
+Converts the specified character to uppercase. Characters outside the
+US-ASCII (Basic Latin) range are viewed as not having any case.
+
+ char toUPPER(char ch)
+
+=for hackers
+Found in file handy.h
+
+
+=back
+
+=head1 Cloning an interpreter
+
+=over 8
+
+=item perl_clone
+X<perl_clone>
+
+Create and return a new interpreter by cloning the current one.
+
+perl_clone takes these flags as parameters:
+
+CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
+without it we only clone the data and zero the stacks,
+with it we copy the stacks and the new perl interpreter is
+ready to run at the exact same point as the previous one.
+The pseudo-fork code uses COPY_STACKS while the
+threads->create doesn't.
+
+CLONEf_KEEP_PTR_TABLE
+perl_clone keeps a ptr_table with the pointer of the old
+variable as a key and the new variable as a value,
+this allows it to check if something has been cloned and not
+clone it again but rather just use the value and increase the
+refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
+the ptr_table using the function
+C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
+reason to keep it around is if you want to dup some of your own
+variable who are outside the graph perl scans, example of this
+code is in threads.xs create
+
+CLONEf_CLONE_HOST
+This is a win32 thing, it is ignored on unix, it tells perls
+win32host code (which is c++) to clone itself, this is needed on
+win32 if you want to run two threads at the same time,
+if you just want to do some stuff in a separate perl interpreter
+and then throw it away and return to the original one,
+you don't need to do anything.
+
+ PerlInterpreter* perl_clone(PerlInterpreter *proto_perl, UV flags)
+
+=for hackers
+Found in file sv.c
+
+
+=back
+
+=head1 CV Manipulation Functions
+
+=over 8
+
+=item CvSTASH
+X<CvSTASH>
+
+Returns the stash of the CV.
+
+ HV* CvSTASH(CV* cv)
+
+=for hackers
+Found in file cv.h
+
+=item get_cv
+X<get_cv>
+
+Uses C<strlen> to get the length of C<name>, then calls C<get_cvn_flags>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ CV* get_cv(const char* name, I32 flags)
+
+=for hackers
+Found in file perl.c
+
+=item get_cvn_flags
+X<get_cvn_flags>
+
+Returns the CV of the specified Perl subroutine. C<flags> are passed to
+C<gv_fetchpvn_flags>. If C<GV_ADD> is set and the Perl subroutine does not
+exist then it will be declared (which has the same effect as saying
+C<sub name;>). If C<GV_ADD> is not set and the subroutine does not exist
+then NULL is returned.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ CV* get_cvn_flags(const char* name, STRLEN len, I32 flags)
+
+=for hackers
+Found in file perl.c
+
+
+=back
+
+=head1 Embedding Functions
+
+=over 8
+
+=item cv_undef
+X<cv_undef>
+
+Clear out all the active components of a CV. This can happen either
+by an explicit C<undef &foo>, or by the reference count going to zero.
+In the former case, we keep the CvOUTSIDE pointer, so that any anonymous
+children can still follow the full lexical scope chain.
+
+ void cv_undef(CV* cv)
+
+=for hackers
+Found in file op.c
+
+=item load_module
+X<load_module>
+
+Loads the module whose name is pointed to by the string part of name.
+Note that the actual module name, not its filename, should be given.
+Eg, "Foo::Bar" instead of "Foo/Bar.pm". flags can be any of
+PERL_LOADMOD_DENY, PERL_LOADMOD_NOIMPORT, or PERL_LOADMOD_IMPORT_OPS
+(or 0 for no flags). ver, if specified, provides version semantics
+similar to C<use Foo::Bar VERSION>. The optional trailing SV*
+arguments can be used to specify arguments to the module's import()
+method, similar to C<use Foo::Bar VERSION LIST>. They must be
+terminated with a final NULL pointer. Note that this list can only
+be omitted when the PERL_LOADMOD_NOIMPORT flag has been used.
+Otherwise at least a single NULL pointer to designate the default
+import list is required.
+
+ void load_module(U32 flags, SV* name, SV* ver, ...)
+
+=for hackers
+Found in file op.c
+
+=item nothreadhook
+X<nothreadhook>
+
+Stub that provides thread hook for perl_destruct when there are
+no threads.
+
+ int nothreadhook()
+
+=for hackers
+Found in file perl.c
+
+=item perl_alloc
+X<perl_alloc>
+
+Allocates a new Perl interpreter. See L<perlembed>.
+
+ PerlInterpreter* perl_alloc()
+
+=for hackers
+Found in file perl.c
+
+=item perl_construct
+X<perl_construct>
+
+Initializes a new Perl interpreter. See L<perlembed>.
+
+ void perl_construct(PerlInterpreter *my_perl)
+
+=for hackers
+Found in file perl.c
+
+=item perl_destruct
+X<perl_destruct>
+
+Shuts down a Perl interpreter. See L<perlembed>.
+
+ int perl_destruct(PerlInterpreter *my_perl)
+
+=for hackers
+Found in file perl.c
+
+=item perl_free
+X<perl_free>
+
+Releases a Perl interpreter. See L<perlembed>.
+
+ void perl_free(PerlInterpreter *my_perl)
+
+=for hackers
+Found in file perl.c
+
+=item perl_parse
+X<perl_parse>
+
+Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
+
+ int perl_parse(PerlInterpreter *my_perl, XSINIT_t xsinit, int argc, char** argv, char** env)
+
+=for hackers
+Found in file perl.c
+
+=item perl_run
+X<perl_run>
+
+Tells a Perl interpreter to run. See L<perlembed>.
+
+ int perl_run(PerlInterpreter *my_perl)
+
+=for hackers
+Found in file perl.c
+
+=item require_pv
+X<require_pv>
+
+Tells Perl to C<require> the file named by the string argument. It is
+analogous to the Perl code C<eval "require '$file'">. It's even
+implemented that way; consider using load_module instead.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ void require_pv(const char* pv)
+
+=for hackers
+Found in file perl.c
+
+
+=back
+
+=head1 Functions in file dump.c
+
+
+=over 8
+
+=item pv_display
+X<pv_display>
+
+Similar to
+
+ pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
+
+except that an additional "\0" will be appended to the string when
+len > cur and pv[cur] is "\0".
+
+Note that the final string may be up to 7 chars longer than pvlim.
+
+ char* pv_display(SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
+
+=for hackers
+Found in file dump.c
+
+=item pv_escape
+X<pv_escape>
+
+Escapes at most the first "count" chars of pv and puts the results into
+dsv such that the size of the escaped string will not exceed "max" chars
+and will not contain any incomplete escape sequences.
+
+If flags contains PERL_PV_ESCAPE_QUOTE then any double quotes in the string
+will also be escaped.
+
+Normally the SV will be cleared before the escaped string is prepared,
+but when PERL_PV_ESCAPE_NOCLEAR is set this will not occur.
+
+If PERL_PV_ESCAPE_UNI is set then the input string is treated as Unicode,
+if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned
+using C<is_utf8_string()> to determine if it is Unicode.
+
+If PERL_PV_ESCAPE_ALL is set then all input chars will be output
+using C<\x01F1> style escapes, otherwise only chars above 255 will be
+escaped using this style, other non printable chars will use octal or
+common escaped patterns like C<\n>. If PERL_PV_ESCAPE_NOBACKSLASH
+then all chars below 255 will be treated as printable and
+will be output as literals.
+
+If PERL_PV_ESCAPE_FIRSTCHAR is set then only the first char of the
+string will be escaped, regardles of max. If the string is utf8 and
+the chars value is >255 then it will be returned as a plain hex
+sequence. Thus the output will either be a single char,
+an octal escape sequence, a special escape like C<\n> or a 3 or
+more digit hex value.
+
+If PERL_PV_ESCAPE_RE is set then the escape char used will be a '%' and
+not a '\\'. This is because regexes very often contain backslashed
+sequences, whereas '%' is not a particularly common character in patterns.
+
+Returns a pointer to the escaped text as held by dsv.
+
+ char* pv_escape(SV *dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags)
+
+=for hackers
+Found in file dump.c
+
+=item pv_pretty
+X<pv_pretty>
+
+Converts a string into something presentable, handling escaping via
+pv_escape() and supporting quoting and ellipses.
+
+If the PERL_PV_PRETTY_QUOTE flag is set then the result will be
+double quoted with any double quotes in the string escaped. Otherwise
+if the PERL_PV_PRETTY_LTGT flag is set then the result be wrapped in
+angle brackets.
+
+If the PERL_PV_PRETTY_ELLIPSES flag is set and not all characters in
+string were output then an ellipsis C<...> will be appended to the
+string. Note that this happens AFTER it has been quoted.
+
+If start_color is non-null then it will be inserted after the opening
+quote (if there is one) but before the escaped text. If end_color
+is non-null then it will be inserted after the escaped text but before
+any quotes or ellipses.
+
+Returns a pointer to the prettified text as held by dsv.
+
+ char* pv_pretty(SV *dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags)
+
+=for hackers
+Found in file dump.c
+
+
+=back
+
+=head1 Functions in file mathoms.c
+
+
+=over 8
+
+=item gv_fetchmethod
+X<gv_fetchmethod>
+
+See L<gv_fetchmethod_autoload>.
+
+ GV* gv_fetchmethod(HV* stash, const char* name)
+
+=for hackers
+Found in file mathoms.c
+
+=item pack_cat
+X<pack_cat>
+
+The engine implementing pack() Perl function. Note: parameters next_in_list and
+flags are not used. This call should not be used; use packlist instead.
+
+ void pack_cat(SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist, SV ***next_in_list, U32 flags)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_2pvbyte_nolen
+X<sv_2pvbyte_nolen>
+
+Return a pointer to the byte-encoded representation of the SV.
+May cause the SV to be downgraded from UTF-8 as a side-effect.
+
+Usually accessed via the C<SvPVbyte_nolen> macro.
+
+ char* sv_2pvbyte_nolen(SV* sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_2pvutf8_nolen
+X<sv_2pvutf8_nolen>
+
+Return a pointer to the UTF-8-encoded representation of the SV.
+May cause the SV to be upgraded to UTF-8 as a side-effect.
+
+Usually accessed via the C<SvPVutf8_nolen> macro.
+
+ char* sv_2pvutf8_nolen(SV* sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_2pv_nolen
+X<sv_2pv_nolen>
+
+Like C<sv_2pv()>, but doesn't return the length too. You should usually
+use the macro wrapper C<SvPV_nolen(sv)> instead.
+ char* sv_2pv_nolen(SV* sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_catpvn_mg
+X<sv_catpvn_mg>
+
+Like C<sv_catpvn>, but also handles 'set' magic.
+
+ void sv_catpvn_mg(SV *sv, const char *ptr, STRLEN len)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_catsv_mg
+X<sv_catsv_mg>
+
+Like C<sv_catsv>, but also handles 'set' magic.
+
+ void sv_catsv_mg(SV *dsv, SV *ssv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_force_normal
+X<sv_force_normal>
+
+Undo various types of fakery on an SV: if the PV is a shared string, make
+a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
+an xpvmg. See also C<sv_force_normal_flags>.
+
+ void sv_force_normal(SV *sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_iv
+X<sv_iv>
+
+A private implementation of the C<SvIVx> macro for compilers which can't
+cope with complex macro expressions. Always use the macro instead.
+
+ IV sv_iv(SV* sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_nolocking
+X<sv_nolocking>
+
+Dummy routine which "locks" an SV when there is no locking module present.
+Exists to avoid test for a NULL function pointer and because it could
+potentially warn under some level of strict-ness.
+
+"Superseded" by sv_nosharing().
+
+ void sv_nolocking(SV *sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_nounlocking
+X<sv_nounlocking>
+
+Dummy routine which "unlocks" an SV when there is no locking module present.
+Exists to avoid test for a NULL function pointer and because it could
+potentially warn under some level of strict-ness.
+
+"Superseded" by sv_nosharing().
+
+ void sv_nounlocking(SV *sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_nv
+X<sv_nv>
+
+A private implementation of the C<SvNVx> macro for compilers which can't
+cope with complex macro expressions. Always use the macro instead.
+
+ NV sv_nv(SV* sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_pv
+X<sv_pv>
+
+Use the C<SvPV_nolen> macro instead
+
+ char* sv_pv(SV *sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_pvbyte
+X<sv_pvbyte>
+
+Use C<SvPVbyte_nolen> instead.
+
+ char* sv_pvbyte(SV *sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_pvbyten
+X<sv_pvbyten>
+
+A private implementation of the C<SvPVbyte> macro for compilers
+which can't cope with complex macro expressions. Always use the macro
+instead.
+
+ char* sv_pvbyten(SV *sv, STRLEN *lp)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_pvn
+X<sv_pvn>
+
+A private implementation of the C<SvPV> macro for compilers which can't
+cope with complex macro expressions. Always use the macro instead.
+
+ char* sv_pvn(SV *sv, STRLEN *lp)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_pvutf8
+X<sv_pvutf8>
+
+Use the C<SvPVutf8_nolen> macro instead
+
+ char* sv_pvutf8(SV *sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_pvutf8n
+X<sv_pvutf8n>
+
+A private implementation of the C<SvPVutf8> macro for compilers
+which can't cope with complex macro expressions. Always use the macro
+instead.
+
+ char* sv_pvutf8n(SV *sv, STRLEN *lp)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_taint
+X<sv_taint>
+
+Taint an SV. Use C<SvTAINTED_on> instead.
+ void sv_taint(SV* sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_unref
+X<sv_unref>
+
+Unsets the RV status of the SV, and decrements the reference count of
+whatever was being referenced by the RV. This can almost be thought of
+as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
+being zero. See C<SvROK_off>.
+
+ void sv_unref(SV* sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_usepvn
+X<sv_usepvn>
+
+Tells an SV to use C<ptr> to find its string value. Implemented by
+calling C<sv_usepvn_flags> with C<flags> of 0, hence does not handle 'set'
+magic. See C<sv_usepvn_flags>.
+
+ void sv_usepvn(SV* sv, char* ptr, STRLEN len)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_usepvn_mg
+X<sv_usepvn_mg>
+
+Like C<sv_usepvn>, but also handles 'set' magic.
+
+ void sv_usepvn_mg(SV *sv, char *ptr, STRLEN len)
+
+=for hackers
+Found in file mathoms.c
+
+=item sv_uv
+X<sv_uv>
+
+A private implementation of the C<SvUVx> macro for compilers which can't
+cope with complex macro expressions. Always use the macro instead.
+
+ UV sv_uv(SV* sv)
+
+=for hackers
+Found in file mathoms.c
+
+=item unpack_str
+X<unpack_str>
+
+The engine implementing unpack() Perl function. Note: parameters strbeg, new_s
+and ocnt are not used. This call should not be used, use unpackstring instead.
+
+ I32 unpack_str(const char *pat, const char *patend, const char *s, const char *strbeg, const char *strend, char **new_s, I32 ocnt, U32 flags)
+
+=for hackers
+Found in file mathoms.c
+
+
+=back
+
+=head1 Functions in file perl.h
+
+
+=over 8
+
+=item PERL_SYS_INIT
+X<PERL_SYS_INIT>
+
+Provides system-specific tune up of the C runtime environment necessary to
+run Perl interpreters. This should be called only once, before creating
+any Perl interpreters.
+
+ void PERL_SYS_INIT(int argc, char** argv)
+
+=for hackers
+Found in file perl.h
+
+=item PERL_SYS_INIT3
+X<PERL_SYS_INIT3>
+
+Provides system-specific tune up of the C runtime environment necessary to
+run Perl interpreters. This should be called only once, before creating
+any Perl interpreters.
+
+ void PERL_SYS_INIT3(int argc, char** argv, char** env)
+
+=for hackers
+Found in file perl.h
+
+=item PERL_SYS_TERM
+X<PERL_SYS_TERM>
+
+Provides system-specific clean up of the C runtime environment after
+running Perl interpreters. This should be called only once, after
+freeing any remaining Perl interpreters.
+
+ void PERL_SYS_TERM()
+
+=for hackers
+Found in file perl.h
+
+
+=back
+
+=head1 Functions in file pp_ctl.c
+
+
+=over 8
+
+=item find_runcv
+X<find_runcv>
+
+Locate the CV corresponding to the currently executing sub or eval.
+If db_seqp is non_null, skip CVs that are in the DB package and populate
+*db_seqp with the cop sequence number at the point that the DB:: code was
+entered. (allows debuggers to eval in the scope of the breakpoint rather
+than in the scope of the debugger itself).
+
+ CV* find_runcv(U32 *db_seqp)
+
+=for hackers
+Found in file pp_ctl.c
+
+
+=back
+
+=head1 Functions in file pp_pack.c
+
+
+=over 8
+
+=item packlist
+X<packlist>
+
+The engine implementing pack() Perl function.
+
+ void packlist(SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist)
+
+=for hackers
+Found in file pp_pack.c
+
+=item unpackstring
+X<unpackstring>
+
+The engine implementing unpack() Perl function. C<unpackstring> puts the
+extracted list items on the stack and returns the number of elements.
+Issue C<PUTBACK> before and C<SPAGAIN> after the call to this function.
+
+ I32 unpackstring(const char *pat, const char *patend, const char *s, const char *strend, U32 flags)
+
+=for hackers
+Found in file pp_pack.c
+
+
+=back
+
+=head1 GV Functions
+
+=over 8
+
+=item GvSV
+X<GvSV>
+
+Return the SV from the GV.
+
+ SV* GvSV(GV* gv)
+
+=for hackers
+Found in file gv.h
+
+=item gv_const_sv
+X<gv_const_sv>
+
+If C<gv> is a typeglob whose subroutine entry is a constant sub eligible for
+inlining, or C<gv> is a placeholder reference that would be promoted to such
+a typeglob, then returns the value returned by the sub. Otherwise, returns
+NULL.
+
+ SV* gv_const_sv(GV* gv)
+
+=for hackers
+Found in file gv.c
+
+=item gv_fetchmeth
+X<gv_fetchmeth>
+
+Returns the glob with the given C<name> and a defined subroutine or
+C<NULL>. The glob lives in the given C<stash>, or in the stashes
+accessible via @ISA and UNIVERSAL::.
+
+The argument C<level> should be either 0 or -1. If C<level==0>, as a
+side-effect creates a glob with the given C<name> in the given C<stash>
+which in the case of success contains an alias for the subroutine, and sets
+up caching info for this glob.
+
+This function grants C<"SUPER"> token as a postfix of the stash name. The
+GV returned from C<gv_fetchmeth> may be a method cache entry, which is not
+visible to Perl code. So when calling C<call_sv>, you should not use
+the GV directly; instead, you should use the method's CV, which can be
+obtained from the GV with the C<GvCV> macro.
+
+ GV* gv_fetchmeth(HV* stash, const char* name, STRLEN len, I32 level)
+
+=for hackers
+Found in file gv.c
+
+=item gv_fetchmethod_autoload
+X<gv_fetchmethod_autoload>
+
+Returns the glob which contains the subroutine to call to invoke the method
+on the C<stash>. In fact in the presence of autoloading this may be the
+glob for "AUTOLOAD". In this case the corresponding variable $AUTOLOAD is
+already setup.
+
+The third parameter of C<gv_fetchmethod_autoload> determines whether
+AUTOLOAD lookup is performed if the given method is not present: non-zero
+means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD.
+Calling C<gv_fetchmethod> is equivalent to calling C<gv_fetchmethod_autoload>
+with a non-zero C<autoload> parameter.
+
+These functions grant C<"SUPER"> token as a prefix of the method name. Note
+that if you want to keep the returned glob for a long time, you need to
+check for it being "AUTOLOAD", since at the later time the call may load a
+different subroutine due to $AUTOLOAD changing its value. Use the glob
+created via a side effect to do this.
+
+These functions have the same side-effects and as C<gv_fetchmeth> with
+C<level==0>. C<name> should be writable if contains C<':'> or C<'
+''>. The warning against passing the GV returned by C<gv_fetchmeth> to
+C<call_sv> apply equally to these functions.
+
+ GV* gv_fetchmethod_autoload(HV* stash, const char* name, I32 autoload)
+
+=for hackers
+Found in file gv.c
+
+=item gv_fetchmeth_autoload
+X<gv_fetchmeth_autoload>
+
+Same as gv_fetchmeth(), but looks for autoloaded subroutines too.
+Returns a glob for the subroutine.
+
+For an autoloaded subroutine without a GV, will create a GV even
+if C<level < 0>. For an autoloaded subroutine without a stub, GvCV()
+of the result may be zero.
+
+ GV* gv_fetchmeth_autoload(HV* stash, const char* name, STRLEN len, I32 level)
+
+=for hackers
+Found in file gv.c
+
+=item gv_stashpv
+X<gv_stashpv>
+
+Returns a pointer to the stash for a specified package. Uses C<strlen> to
+determine the length of C<name>, then calls C<gv_stashpvn()>.
+
+ HV* gv_stashpv(const char* name, I32 flags)
+
+=for hackers
+Found in file gv.c
+
+=item gv_stashpvn
+X<gv_stashpvn>
+
+Returns a pointer to the stash for a specified package. The C<namelen>
+parameter indicates the length of the C<name>, in bytes. C<flags> is passed
+to C<gv_fetchpvn_flags()>, so if set to C<GV_ADD> then the package will be
+created if it does not already exist. If the package does not exist and
+C<flags> is 0 (or any other setting that does not create packages) then NULL
+is returned.
+
+
+ HV* gv_stashpvn(const char* name, U32 namelen, I32 flags)
+
+=for hackers
+Found in file gv.c
+
+=item gv_stashpvs
+X<gv_stashpvs>
+
+Like C<gv_stashpvn>, but takes a literal string instead of a string/length pair.
+
+ HV* gv_stashpvs(const char* name, I32 create)
+
+=for hackers
+Found in file handy.h
+
+=item gv_stashsv
+X<gv_stashsv>
+
+Returns a pointer to the stash for a specified package. See C<gv_stashpvn>.
+
+ HV* gv_stashsv(SV* sv, I32 flags)
+
+=for hackers
+Found in file gv.c
+
+
+=back
+
+=head1 Handy Values
+
+=over 8
+
+=item Nullav
+X<Nullav>
+
+Null AV pointer.
+
+=for hackers
+Found in file av.h
+
+=item Nullch
+X<Nullch>
+
+Null character pointer.
+
+=for hackers
+Found in file handy.h
+
+=item Nullcv
+X<Nullcv>
+
+Null CV pointer.
+
+=for hackers
+Found in file cv.h
+
+=item Nullhv
+X<Nullhv>
+
+Null HV pointer.
+
+=for hackers
+Found in file hv.h
+
+=item Nullsv
+X<Nullsv>
+
+Null SV pointer.
+
+=for hackers
+Found in file handy.h
+
+
+=back
+
+=head1 Hash Manipulation Functions
+
+=over 8
+
+=item get_hv
+X<get_hv>
+
+Returns the HV of the specified Perl hash. C<flags> are passed to
+C<gv_fetchpv>. If C<GV_ADD> is set and the
+Perl variable does not exist then it will be created. If C<flags> is zero
+and the variable does not exist then NULL is returned.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ HV* get_hv(const char *name, I32 flags)
+
+=for hackers
+Found in file perl.c
+
+=item HEf_SVKEY
+X<HEf_SVKEY>
+
+This flag, used in the length slot of hash entries and magic structures,
+specifies the structure contains an C<SV*> pointer where a C<char*> pointer
+is to be expected. (For information only--not to be used).
+
+=for hackers
+Found in file hv.h
+
+=item HeHASH
+X<HeHASH>
+
+Returns the computed hash stored in the hash entry.
+
+ U32 HeHASH(HE* he)
+
+=for hackers
+Found in file hv.h
+
+=item HeKEY
+X<HeKEY>
+
+Returns the actual pointer stored in the key slot of the hash entry. The
+pointer may be either C<char*> or C<SV*>, depending on the value of
+C<HeKLEN()>. Can be assigned to. The C<HePV()> or C<HeSVKEY()> macros are
+usually preferable for finding the value of a key.
+
+ void* HeKEY(HE* he)
+
+=for hackers
+Found in file hv.h
+
+=item HeKLEN
+X<HeKLEN>
+
+If this is negative, and amounts to C<HEf_SVKEY>, it indicates the entry
+holds an C<SV*> key. Otherwise, holds the actual length of the key. Can
+be assigned to. The C<HePV()> macro is usually preferable for finding key
+lengths.
+
+ STRLEN HeKLEN(HE* he)
+
+=for hackers
+Found in file hv.h
+
+=item HePV
+X<HePV>
+
+Returns the key slot of the hash entry as a C<char*> value, doing any
+necessary dereferencing of possibly C<SV*> keys. The length of the string
+is placed in C<len> (this is a macro, so do I<not> use C<&len>). If you do
+not care about what the length of the key is, you may use the global
+variable C<PL_na>, though this is rather less efficient than using a local
+variable. Remember though, that hash keys in perl are free to contain
+embedded nulls, so using C<strlen()> or similar is not a good way to find
+the length of hash keys. This is very similar to the C<SvPV()> macro
+described elsewhere in this document. See also C<HeUTF8>.
+
+If you are using C<HePV> to get values to pass to C<newSVpvn()> to create a
+new SV, you should consider using C<newSVhek(HeKEY_hek(he))> as it is more
+efficient.
+
+ char* HePV(HE* he, STRLEN len)
+
+=for hackers
+Found in file hv.h
+
+=item HeSVKEY
+X<HeSVKEY>
+
+Returns the key as an C<SV*>, or C<NULL> if the hash entry does not
+contain an C<SV*> key.
+
+ SV* HeSVKEY(HE* he)
+
+=for hackers
+Found in file hv.h
+
+=item HeSVKEY_force
+X<HeSVKEY_force>
+
+Returns the key as an C<SV*>. Will create and return a temporary mortal
+C<SV*> if the hash entry contains only a C<char*> key.
+
+ SV* HeSVKEY_force(HE* he)
+
+=for hackers
+Found in file hv.h
+
+=item HeSVKEY_set
+X<HeSVKEY_set>
+
+Sets the key to a given C<SV*>, taking care to set the appropriate flags to
+indicate the presence of an C<SV*> key, and returns the same
+C<SV*>.
+
+ SV* HeSVKEY_set(HE* he, SV* sv)
+
+=for hackers
+Found in file hv.h
+
+=item HeUTF8
+X<HeUTF8>
+
+Returns whether the C<char *> value returned by C<HePV> is encoded in UTF-8,
+doing any necessary dereferencing of possibly C<SV*> keys. The value returned
+will be 0 or non-0, not necessarily 1 (or even a value with any low bits set),
+so B<do not> blindly assign this to a C<bool> variable, as C<bool> may be a
+typedef for C<char>.
+
+ char* HeUTF8(HE* he, STRLEN len)
+
+=for hackers
+Found in file hv.h
+
+=item HeVAL
+X<HeVAL>
+
+Returns the value slot (type C<SV*>) stored in the hash entry.
+
+ SV* HeVAL(HE* he)
+
+=for hackers
+Found in file hv.h
+
+=item HvNAME
+X<HvNAME>
+
+Returns the package name of a stash, or NULL if C<stash> isn't a stash.
+See C<SvSTASH>, C<CvSTASH>.
+
+ char* HvNAME(HV* stash)
+
+=for hackers
+Found in file hv.h
+
+=item hv_assert
+X<hv_assert>
+
+Check that a hash is in an internally consistent state.
+
+ void hv_assert(HV *hv)
+
+=for hackers
+Found in file hv.c
+
+=item hv_clear
+X<hv_clear>
+
+Clears a hash, making it empty.
+
+ void hv_clear(HV* hv)
+
+=for hackers
+Found in file hv.c
+
+=item hv_clear_placeholders
+X<hv_clear_placeholders>
+
+Clears any placeholders from a hash. If a restricted hash has any of its keys
+marked as readonly and the key is subsequently deleted, the key is not actually
+deleted but is marked by assigning it a value of &PL_sv_placeholder. This tags
+it so it will be ignored by future operations such as iterating over the hash,
+but will still allow the hash to have a value reassigned to the key at some
+future point. This function clears any such placeholder keys from the hash.
+See Hash::Util::lock_keys() for an example of its use.
+
+ void hv_clear_placeholders(HV *hv)
+
+=for hackers
+Found in file hv.c
+
+=item hv_delete
+X<hv_delete>
+
+Deletes a key/value pair in the hash. The value SV is removed from the
+hash and returned to the caller. The C<klen> is the length of the key.
+The C<flags> value will normally be zero; if set to G_DISCARD then NULL
+will be returned.
+
+ SV* hv_delete(HV *hv, const char *key, I32 klen, I32 flags)
+
+=for hackers
+Found in file hv.c
+
+=item hv_delete_ent
+X<hv_delete_ent>
+
+Deletes a key/value pair in the hash. The value SV is removed from the
+hash and returned to the caller. The C<flags> value will normally be zero;
+if set to G_DISCARD then NULL will be returned. C<hash> can be a valid
+precomputed hash value, or 0 to ask for it to be computed.
+
+ SV* hv_delete_ent(HV *hv, SV *keysv, I32 flags, U32 hash)
+
+=for hackers
+Found in file hv.c
+
+=item hv_exists
+X<hv_exists>
+
+Returns a boolean indicating whether the specified hash key exists. The
+C<klen> is the length of the key.
+
+ bool hv_exists(HV *hv, const char *key, I32 klen)
+
+=for hackers
+Found in file hv.c
+
+=item hv_exists_ent
+X<hv_exists_ent>
+
+Returns a boolean indicating whether the specified hash key exists. C<hash>
+can be a valid precomputed hash value, or 0 to ask for it to be
+computed.
+
+ bool hv_exists_ent(HV *hv, SV *keysv, U32 hash)
+
+=for hackers
+Found in file hv.c
+
+=item hv_fetch
+X<hv_fetch>
+
+Returns the SV which corresponds to the specified key in the hash. The
+C<klen> is the length of the key. If C<lval> is set then the fetch will be
+part of a store. Check that the return value is non-null before
+dereferencing it to an C<SV*>.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+ SV** hv_fetch(HV *hv, const char *key, I32 klen, I32 lval)
+
+=for hackers
+Found in file hv.c
+
+=item hv_fetchs
+X<hv_fetchs>
+
+Like C<hv_fetch>, but takes a literal string instead of a string/length pair.
+
+ SV** hv_fetchs(HV* tb, const char* key, I32 lval)
+
+=for hackers
+Found in file handy.h
+
+=item hv_fetch_ent
+X<hv_fetch_ent>
+
+Returns the hash entry which corresponds to the specified key in the hash.
+C<hash> must be a valid precomputed hash number for the given C<key>, or 0
+if you want the function to compute it. IF C<lval> is set then the fetch
+will be part of a store. Make sure the return value is non-null before
+accessing it. The return value when C<tb> is a tied hash is a pointer to a
+static location, so be sure to make a copy of the structure if you need to
+store it somewhere.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+ HE* hv_fetch_ent(HV *hv, SV *keysv, I32 lval, U32 hash)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iterinit
+X<hv_iterinit>
+
+Prepares a starting point to traverse a hash table. Returns the number of
+keys in the hash (i.e. the same as C<HvKEYS(tb)>). The return value is
+currently only meaningful for hashes without tie magic.
+
+NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
+hash buckets that happen to be in use. If you still need that esoteric
+value, you can get it through the macro C<HvFILL(tb)>.
+
+
+ I32 hv_iterinit(HV *hv)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iterkey
+X<hv_iterkey>
+
+Returns the key from the current position of the hash iterator. See
+C<hv_iterinit>.
+
+ char* hv_iterkey(HE* entry, I32* retlen)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iterkeysv
+X<hv_iterkeysv>
+
+Returns the key as an C<SV*> from the current position of the hash
+iterator. The return value will always be a mortal copy of the key. Also
+see C<hv_iterinit>.
+
+ SV* hv_iterkeysv(HE* entry)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iternext
+X<hv_iternext>
+
+Returns entries from a hash iterator. See C<hv_iterinit>.
+
+You may call C<hv_delete> or C<hv_delete_ent> on the hash entry that the
+iterator currently points to, without losing your place or invalidating your
+iterator. Note that in this case the current entry is deleted from the hash
+with your iterator holding the last reference to it. Your iterator is flagged
+to free the entry on the next call to C<hv_iternext>, so you must not discard
+your iterator immediately else the entry will leak - call C<hv_iternext> to
+trigger the resource deallocation.
+
+ HE* hv_iternext(HV *hv)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iternextsv
+X<hv_iternextsv>
+
+Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
+operation.
+
+ SV* hv_iternextsv(HV *hv, char **key, I32 *retlen)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iternext_flags
+X<hv_iternext_flags>
+
+Returns entries from a hash iterator. See C<hv_iterinit> and C<hv_iternext>.
+The C<flags> value will normally be zero; if HV_ITERNEXT_WANTPLACEHOLDERS is
+set the placeholders keys (for restricted hashes) will be returned in addition
+to normal keys. By default placeholders are automatically skipped over.
+Currently a placeholder is implemented with a value that is
+C<&Perl_sv_placeholder>. Note that the implementation of placeholders and
+restricted hashes may change, and the implementation currently is
+insufficiently abstracted for any change to be tidy.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ HE* hv_iternext_flags(HV *hv, I32 flags)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iterval
+X<hv_iterval>
+
+Returns the value from the current position of the hash iterator. See
+C<hv_iterkey>.
+
+ SV* hv_iterval(HV *hv, HE *entry)
+
+=for hackers
+Found in file hv.c
+
+=item hv_magic
+X<hv_magic>
+
+Adds magic to a hash. See C<sv_magic>.
+
+ void hv_magic(HV *hv, GV *gv, int how)
+
+=for hackers
+Found in file hv.c
+
+=item hv_scalar
+X<hv_scalar>
+
+Evaluates the hash in scalar context and returns the result. Handles magic when the hash is tied.
+
+ SV* hv_scalar(HV *hv)
+
+=for hackers
+Found in file hv.c
+
+=item hv_store
+X<hv_store>
+
+Stores an SV in a hash. The hash key is specified as C<key> and C<klen> is
+the length of the key. The C<hash> parameter is the precomputed hash
+value; if it is zero then Perl will compute it. The return value will be
+NULL if the operation failed or if the value did not need to be actually
+stored within the hash (as in the case of tied hashes). Otherwise it can
+be dereferenced to get the original C<SV*>. Note that the caller is
+responsible for suitably incrementing the reference count of C<val> before
+the call, and decrementing it if the function returned NULL. Effectively
+a successful hv_store takes ownership of one reference to C<val>. This is
+usually what you want; a newly created SV has a reference count of one, so
+if all your code does is create SVs then store them in a hash, hv_store
+will own the only reference to the new SV, and your code doesn't need to do
+anything further to tidy up. hv_store is not implemented as a call to
+hv_store_ent, and does not create a temporary SV for the key, so if your
+key data is not already in SV form then use hv_store in preference to
+hv_store_ent.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+ SV** hv_store(HV *hv, const char *key, I32 klen, SV *val, U32 hash)
+
+=for hackers
+Found in file hv.c
+
+=item hv_stores
+X<hv_stores>
+
+Like C<hv_store>, but takes a literal string instead of a string/length pair
+and omits the hash parameter.
+
+ SV** hv_stores(HV* tb, const char* key, NULLOK SV* val)
+
+=for hackers
+Found in file handy.h
+
+=item hv_store_ent
+X<hv_store_ent>
+
+Stores C<val> in a hash. The hash key is specified as C<key>. The C<hash>
+parameter is the precomputed hash value; if it is zero then Perl will
+compute it. The return value is the new hash entry so created. It will be
+NULL if the operation failed or if the value did not need to be actually
+stored within the hash (as in the case of tied hashes). Otherwise the
+contents of the return value can be accessed using the C<He?> macros
+described here. Note that the caller is responsible for suitably
+incrementing the reference count of C<val> before the call, and
+decrementing it if the function returned NULL. Effectively a successful
+hv_store_ent takes ownership of one reference to C<val>. This is
+usually what you want; a newly created SV has a reference count of one, so
+if all your code does is create SVs then store them in a hash, hv_store
+will own the only reference to the new SV, and your code doesn't need to do
+anything further to tidy up. Note that hv_store_ent only reads the C<key>;
+unlike C<val> it does not take ownership of it, so maintaining the correct
+reference count on C<key> is entirely the caller's responsibility. hv_store
+is not implemented as a call to hv_store_ent, and does not create a temporary
+SV for the key, so if your key data is not already in SV form then use
+hv_store in preference to hv_store_ent.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+ HE* hv_store_ent(HV *hv, SV *key, SV *val, U32 hash)
+
+=for hackers
+Found in file hv.c
+
+=item hv_undef
+X<hv_undef>
+
+Undefines the hash.
+
+ void hv_undef(HV *hv)
+
+=for hackers
+Found in file hv.c
+
+=item newHV
+X<newHV>
+
+Creates a new HV. The reference count is set to 1.
+
+ HV* newHV()
+
+=for hackers
+Found in file hv.h
+
+
+=back
+
+=head1 Magical Functions
+
+=over 8
+
+=item mg_clear
+X<mg_clear>
+
+Clear something magical that the SV represents. See C<sv_magic>.
+
+ int mg_clear(SV* sv)
+
+=for hackers
+Found in file mg.c
+
+=item mg_copy
+X<mg_copy>
+
+Copies the magic from one SV to another. See C<sv_magic>.
+
+ int mg_copy(SV *sv, SV *nsv, const char *key, I32 klen)
+
+=for hackers
+Found in file mg.c
+
+=item mg_find
+X<mg_find>
+
+Finds the magic pointer for type matching the SV. See C<sv_magic>.
+
+ MAGIC* mg_find(const SV* sv, int type)
+
+=for hackers
+Found in file mg.c
+
+=item mg_free
+X<mg_free>
+
+Free any magic storage used by the SV. See C<sv_magic>.
+
+ int mg_free(SV* sv)
+
+=for hackers
+Found in file mg.c
+
+=item mg_get
+X<mg_get>
+
+Do magic after a value is retrieved from the SV. See C<sv_magic>.
+
+ int mg_get(SV* sv)
+
+=for hackers
+Found in file mg.c
+
+=item mg_length
+X<mg_length>
+
+Report on the SV's length. See C<sv_magic>.
+
+ U32 mg_length(SV* sv)
+
+=for hackers
+Found in file mg.c
+
+=item mg_magical
+X<mg_magical>
+
+Turns on the magical status of an SV. See C<sv_magic>.
+
+ void mg_magical(SV* sv)
+
+=for hackers
+Found in file mg.c
+
+=item mg_set
+X<mg_set>
+
+Do magic after a value is assigned to the SV. See C<sv_magic>.
+
+ int mg_set(SV* sv)
+
+=for hackers
+Found in file mg.c
+
+=item SvGETMAGIC
+X<SvGETMAGIC>
+
+Invokes C<mg_get> on an SV if it has 'get' magic. This macro evaluates its
+argument more than once.
+
+ void SvGETMAGIC(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvLOCK
+X<SvLOCK>
+
+Arranges for a mutual exclusion lock to be obtained on sv if a suitable module
+has been loaded.
+
+ void SvLOCK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSETMAGIC
+X<SvSETMAGIC>
+
+Invokes C<mg_set> on an SV if it has 'set' magic. This macro evaluates its
+argument more than once.
+
+ void SvSETMAGIC(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSetMagicSV
+X<SvSetMagicSV>
+
+Like C<SvSetSV>, but does any set magic required afterwards.
+
+ void SvSetMagicSV(SV* dsb, SV* ssv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSetMagicSV_nosteal
+X<SvSetMagicSV_nosteal>
+
+Like C<SvSetSV_nosteal>, but does any set magic required afterwards.
+
+ void SvSetMagicSV_nosteal(SV* dsv, SV* ssv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSetSV
+X<SvSetSV>
+
+Calls C<sv_setsv> if dsv is not the same as ssv. May evaluate arguments
+more than once.
+
+ void SvSetSV(SV* dsb, SV* ssv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSetSV_nosteal
+X<SvSetSV_nosteal>
+
+Calls a non-destructive version of C<sv_setsv> if dsv is not the same as
+ssv. May evaluate arguments more than once.
+
+ void SvSetSV_nosteal(SV* dsv, SV* ssv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSHARE
+X<SvSHARE>
+
+Arranges for sv to be shared between threads if a suitable module
+has been loaded.
+
+ void SvSHARE(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUNLOCK
+X<SvUNLOCK>
+
+Releases a mutual exclusion lock on sv if a suitable module
+has been loaded.
+
+ void SvUNLOCK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+
+=back
+
+=head1 Memory Management
+
+=over 8
+
+=item Copy
+X<Copy>
+
+The XSUB-writer's interface to the C C<memcpy> function. The C<src> is the
+source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
+the type. May fail on overlapping copies. See also C<Move>.
+
+ void Copy(void* src, void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item CopyD
+X<CopyD>
+
+Like C<Copy> but returns dest. Useful for encouraging compilers to tail-call
+optimise.
+
+ void * CopyD(void* src, void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item Move
+X<Move>
+
+The XSUB-writer's interface to the C C<memmove> function. The C<src> is the
+source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
+the type. Can do overlapping moves. See also C<Copy>.
+
+ void Move(void* src, void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item MoveD
+X<MoveD>
+
+Like C<Move> but returns dest. Useful for encouraging compilers to tail-call
+optimise.
+
+ void * MoveD(void* src, void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item Newx
+X<Newx>
+
+The XSUB-writer's interface to the C C<malloc> function.
+
+In 5.9.3, Newx() and friends replace the older New() API, and drops
+the first parameter, I<x>, a debug aid which allowed callers to identify
+themselves. This aid has been superseded by a new build option,
+PERL_MEM_LOG (see L<perlhack/PERL_MEM_LOG>). The older API is still
+there for use in XS modules supporting older perls.
+
+ void Newx(void* ptr, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item Newxc
+X<Newxc>
+
+The XSUB-writer's interface to the C C<malloc> function, with
+cast. See also C<Newx>.
+
+ void Newxc(void* ptr, int nitems, type, cast)
+
+=for hackers
+Found in file handy.h
+
+=item Newxz
+X<Newxz>
+
+The XSUB-writer's interface to the C C<malloc> function. The allocated
+memory is zeroed with C<memzero>. See also C<Newx>.
+
+ void Newxz(void* ptr, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item Poison
+X<Poison>
+
+PoisonWith(0xEF) for catching access to freed memory.
+
+ void Poison(void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item PoisonFree
+X<PoisonFree>
+
+PoisonWith(0xEF) for catching access to freed memory.
+
+ void PoisonFree(void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item PoisonNew
+X<PoisonNew>
+
+PoisonWith(0xAB) for catching access to allocated but uninitialized memory.
+
+ void PoisonNew(void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item PoisonWith
+X<PoisonWith>
+
+Fill up memory with a byte pattern (a byte repeated over and over
+again) that hopefully catches attempts to access uninitialized memory.
+
+ void PoisonWith(void* dest, int nitems, type, U8 byte)
+
+=for hackers
+Found in file handy.h
+
+=item Renew
+X<Renew>
+
+The XSUB-writer's interface to the C C<realloc> function.
+
+ void Renew(void* ptr, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item Renewc
+X<Renewc>
+
+The XSUB-writer's interface to the C C<realloc> function, with
+cast.
+
+ void Renewc(void* ptr, int nitems, type, cast)
+
+=for hackers
+Found in file handy.h
+
+=item Safefree
+X<Safefree>
+
+The XSUB-writer's interface to the C C<free> function.
+
+ void Safefree(void* ptr)
+
+=for hackers
+Found in file handy.h
+
+=item savepv
+X<savepv>
+
+Perl's version of C<strdup()>. Returns a pointer to a newly allocated
+string which is a duplicate of C<pv>. The size of the string is
+determined by C<strlen()>. The memory allocated for the new string can
+be freed with the C<Safefree()> function.
+
+ char* savepv(const char* pv)
+
+=for hackers
+Found in file util.c
+
+=item savepvn
+X<savepvn>
+
+Perl's version of what C<strndup()> would be if it existed. Returns a
+pointer to a newly allocated string which is a duplicate of the first
+C<len> bytes from C<pv>, plus a trailing NUL byte. The memory allocated for
+the new string can be freed with the C<Safefree()> function.
+
+ char* savepvn(const char* pv, I32 len)
+
+=for hackers
+Found in file util.c
+
+=item savepvs
+X<savepvs>
+
+Like C<savepvn>, but takes a literal string instead of a string/length pair.
+
+ char* savepvs(const char* s)
+
+=for hackers
+Found in file handy.h
+
+=item savesharedpv
+X<savesharedpv>
+
+A version of C<savepv()> which allocates the duplicate string in memory
+which is shared between threads.
+
+ char* savesharedpv(const char* pv)
+
+=for hackers
+Found in file util.c
+
+=item savesharedpvn
+X<savesharedpvn>
+
+A version of C<savepvn()> which allocates the duplicate string in memory
+which is shared between threads. (With the specific difference that a NULL
+pointer is not acceptable)
+
+ char* savesharedpvn(const char *const pv, const STRLEN len)
+
+=for hackers
+Found in file util.c
+
+=item savesvpv
+X<savesvpv>
+
+A version of C<savepv()>/C<savepvn()> which gets the string to duplicate from
+the passed in SV using C<SvPV()>
+
+ char* savesvpv(SV* sv)
+
+=for hackers
+Found in file util.c
+
+=item StructCopy
+X<StructCopy>
+
+This is an architecture-independent macro to copy one structure to another.
+
+ void StructCopy(type src, type dest, type)
+
+=for hackers
+Found in file handy.h
+
+=item Zero
+X<Zero>
+
+The XSUB-writer's interface to the C C<memzero> function. The C<dest> is the
+destination, C<nitems> is the number of items, and C<type> is the type.
+
+ void Zero(void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item ZeroD
+X<ZeroD>
+
+Like C<Zero> but returns dest. Useful for encouraging compilers to tail-call
+optimise.
+
+ void * ZeroD(void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+
+=back
+
+=head1 Miscellaneous Functions
+
+=over 8
+
+=item fbm_compile
+X<fbm_compile>
+
+Analyses the string in order to make fast searches on it using fbm_instr()
+-- the Boyer-Moore algorithm.
+
+ void fbm_compile(SV* sv, U32 flags)
+
+=for hackers
+Found in file util.c
+
+=item fbm_instr
+X<fbm_instr>
+
+Returns the location of the SV in the string delimited by C<str> and
+C<strend>. It returns C<NULL> if the string can't be found. The C<sv>
+does not have to be fbm_compiled, but the search will not be as fast
+then.
+
+ char* fbm_instr(unsigned char* big, unsigned char* bigend, SV* littlestr, U32 flags)
+
+=for hackers
+Found in file util.c
+
+=item form
+X<form>
+
+Takes a sprintf-style format pattern and conventional
+(non-SV) arguments and returns the formatted string.
+
+ (char *) Perl_form(pTHX_ const char* pat, ...)
+
+can be used any place a string (char *) is required:
+
+ char * s = Perl_form("%d.%d",major,minor);
+
+Uses a single private buffer so if you want to format several strings you
+must explicitly copy the earlier strings away (and free the copies when you
+are done).
+
+ char* form(const char* pat, ...)
+
+=for hackers
+Found in file util.c
+
+=item getcwd_sv
+X<getcwd_sv>
+
+Fill the sv with current working directory
+
+ int getcwd_sv(SV* sv)
+
+=for hackers
+Found in file util.c
+
+=item my_snprintf
+X<my_snprintf>
+
+The C library C<snprintf> functionality, if available and
+standards-compliant (uses C<vsnprintf>, actually). However, if the
+C<vsnprintf> is not available, will unfortunately use the unsafe
+C<vsprintf> which can overrun the buffer (there is an overrun check,
+but that may be too late). Consider using C<sv_vcatpvf> instead, or
+getting C<vsnprintf>.
+
+ int my_snprintf(char *buffer, const Size_t len, const char *format, ...)
+
+=for hackers
+Found in file util.c
+
+=item my_sprintf
+X<my_sprintf>
+
+The C library C<sprintf>, wrapped if necessary, to ensure that it will return
+the length of the string written to the buffer. Only rare pre-ANSI systems
+need the wrapper function - usually this is a direct call to C<sprintf>.
+
+ int my_sprintf(char *buffer, const char *pat, ...)
+
+=for hackers
+Found in file util.c
+
+=item my_vsnprintf
+X<my_vsnprintf>
+
+The C library C<vsnprintf> if available and standards-compliant.
+However, if if the C<vsnprintf> is not available, will unfortunately
+use the unsafe C<vsprintf> which can overrun the buffer (there is an
+overrun check, but that may be too late). Consider using
+C<sv_vcatpvf> instead, or getting C<vsnprintf>.
+
+ int my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap)
+
+=for hackers
+Found in file util.c
+
+=item new_version
+X<new_version>
+
+Returns a new version object based on the passed in SV:
+
+ SV *sv = new_version(SV *ver);
+
+Does not alter the passed in ver SV. See "upg_version" if you
+want to upgrade the SV.
+
+ SV* new_version(SV *ver)
+
+=for hackers
+Found in file util.c
+
+=item scan_version
+X<scan_version>
+
+Returns a pointer to the next character after the parsed
+version string, as well as upgrading the passed in SV to
+an RV.
+
+Function must be called with an already existing SV like
+
+ sv = newSV(0);
+ s = scan_version(s, SV *sv, bool qv);
+
+Performs some preprocessing to the string to ensure that
+it has the correct characteristics of a version. Flags the
+object if it contains an underscore (which denotes this
+is an alpha version). The boolean qv denotes that the version
+should be interpreted as if it had multiple decimals, even if
+it doesn't.
+
+ const char* scan_version(const char *s, SV *rv, bool qv)
+
+=for hackers
+Found in file util.c
+
+=item strEQ
+X<strEQ>
+
+Test two strings to see if they are equal. Returns true or false.
+
+ bool strEQ(char* s1, char* s2)
+
+=for hackers
+Found in file handy.h
+
+=item strGE
+X<strGE>
+
+Test two strings to see if the first, C<s1>, is greater than or equal to
+the second, C<s2>. Returns true or false.
+
+ bool strGE(char* s1, char* s2)
+
+=for hackers
+Found in file handy.h
+
+=item strGT
+X<strGT>
+
+Test two strings to see if the first, C<s1>, is greater than the second,
+C<s2>. Returns true or false.
+
+ bool strGT(char* s1, char* s2)
+
+=for hackers
+Found in file handy.h
+
+=item strLE
+X<strLE>
+
+Test two strings to see if the first, C<s1>, is less than or equal to the
+second, C<s2>. Returns true or false.
+
+ bool strLE(char* s1, char* s2)
+
+=for hackers
+Found in file handy.h
+
+=item strLT
+X<strLT>
+
+Test two strings to see if the first, C<s1>, is less than the second,
+C<s2>. Returns true or false.
+
+ bool strLT(char* s1, char* s2)
+
+=for hackers
+Found in file handy.h
+
+=item strNE
+X<strNE>
+
+Test two strings to see if they are different. Returns true or
+false.
+
+ bool strNE(char* s1, char* s2)
+
+=for hackers
+Found in file handy.h
+
+=item strnEQ
+X<strnEQ>
+
+Test two strings to see if they are equal. The C<len> parameter indicates
+the number of bytes to compare. Returns true or false. (A wrapper for
+C<strncmp>).
+
+ bool strnEQ(char* s1, char* s2, STRLEN len)
+
+=for hackers
+Found in file handy.h
+
+=item strnNE
+X<strnNE>
+
+Test two strings to see if they are different. The C<len> parameter
+indicates the number of bytes to compare. Returns true or false. (A
+wrapper for C<strncmp>).
+
+ bool strnNE(char* s1, char* s2, STRLEN len)
+
+=for hackers
+Found in file handy.h
+
+=item sv_destroyable
+X<sv_destroyable>
+
+Dummy routine which reports that object can be destroyed when there is no
+sharing module present. It ignores its single SV argument, and returns
+'true'. Exists to avoid test for a NULL function pointer and because it
+could potentially warn under some level of strict-ness.
+
+ bool sv_destroyable(SV *sv)
+
+=for hackers
+Found in file util.c
+
+=item sv_nosharing
+X<sv_nosharing>
+
+Dummy routine which "shares" an SV when there is no sharing module present.
+Or "locks" it. Or "unlocks" it. In other words, ignores its single SV argument.
+Exists to avoid test for a NULL function pointer and because it could
+potentially warn under some level of strict-ness.
+
+ void sv_nosharing(SV *sv)
+
+=for hackers
+Found in file util.c
+
+=item upg_version
+X<upg_version>
+
+In-place upgrade of the supplied SV to a version object.
+
+ SV *sv = upg_version(SV *sv, bool qv);
+
+Returns a pointer to the upgraded SV. Set the boolean qv if you want
+to force this SV to be interpreted as an "extended" version.
+
+ SV* upg_version(SV *ver, bool qv)
+
+=for hackers
+Found in file util.c
+
+=item vcmp
+X<vcmp>
+
+Version object aware cmp. Both operands must already have been
+converted into version objects.
+
+ int vcmp(SV *lhv, SV *rhv)
+
+=for hackers
+Found in file util.c
+
+=item vnormal
+X<vnormal>
+
+Accepts a version object and returns the normalized string
+representation. Call like:
+
+ sv = vnormal(rv);
+
+NOTE: you can pass either the object directly or the SV
+contained within the RV.
+
+ SV* vnormal(SV *vs)
+
+=for hackers
+Found in file util.c
+
+=item vnumify
+X<vnumify>
+
+Accepts a version object and returns the normalized floating
+point representation. Call like:
+
+ sv = vnumify(rv);
+
+NOTE: you can pass either the object directly or the SV
+contained within the RV.
+
+ SV* vnumify(SV *vs)
+
+=for hackers
+Found in file util.c
+
+=item vstringify
+X<vstringify>
+
+In order to maintain maximum compatibility with earlier versions
+of Perl, this function will return either the floating point
+notation or the multiple dotted notation, depending on whether
+the original version contained 1 or more dots, respectively
+
+ SV* vstringify(SV *vs)
+
+=for hackers
+Found in file util.c
+
+=item vverify
+X<vverify>
+
+Validates that the SV contains a valid version object.
+
+ bool vverify(SV *vobj);
+
+Note that it only confirms the bare minimum structure (so as not to get
+confused by derived classes which may contain additional hash entries):
+
+ bool vverify(SV *vs)
+
+=for hackers
+Found in file util.c
+
+
+=back
+
+=head1 MRO Functions
+
+=over 8
+
+=item mro_get_linear_isa
+X<mro_get_linear_isa>
+
+Returns either C<mro_get_linear_isa_c3> or
+C<mro_get_linear_isa_dfs> for the given stash,
+dependant upon which MRO is in effect
+for that stash. The return value is a
+read-only AV*.
+
+You are responsible for C<SvREFCNT_inc()> on the
+return value if you plan to store it anywhere
+semi-permanently (otherwise it might be deleted
+out from under you the next time the cache is
+invalidated).
+
+ AV* mro_get_linear_isa(HV* stash)
+
+=for hackers
+Found in file mro.c
+
+=item mro_method_changed_in
+X<mro_method_changed_in>
+
+Invalidates method caching on any child classes
+of the given stash, so that they might notice
+the changes in this one.
+
+Ideally, all instances of C<PL_sub_generation++> in
+perl source outside of C<mro.c> should be
+replaced by calls to this.
+
+Perl automatically handles most of the common
+ways a method might be redefined. However, there
+are a few ways you could change a method in a stash
+without the cache code noticing, in which case you
+need to call this method afterwards:
+
+1) Directly manipulating the stash HV entries from
+XS code.
+
+2) Assigning a reference to a readonly scalar
+constant into a stash entry in order to create
+a constant subroutine (like constant.pm
+does).
+
+This same method is available from pure perl
+via, C<mro::method_changed_in(classname)>.
+
+ void mro_method_changed_in(HV* stash)
+
+=for hackers
+Found in file mro.c
+
+
+=back
+
+=head1 Multicall Functions
+
+=over 8
+
+=item dMULTICALL
+X<dMULTICALL>
+
+Declare local variables for a multicall. See L<perlcall/Lightweight Callbacks>.
+
+ dMULTICALL;
+
+=for hackers
+Found in file cop.h
+
+=item MULTICALL
+X<MULTICALL>
+
+Make a lightweight callback. See L<perlcall/Lightweight Callbacks>.
+
+ MULTICALL;
+
+=for hackers
+Found in file cop.h
+
+=item POP_MULTICALL
+X<POP_MULTICALL>
+
+Closing bracket for a lightweight callback.
+See L<perlcall/Lightweight Callbacks>.
+
+ POP_MULTICALL;
+
+=for hackers
+Found in file cop.h
+
+=item PUSH_MULTICALL
+X<PUSH_MULTICALL>
+
+Opening bracket for a lightweight callback.
+See L<perlcall/Lightweight Callbacks>.
+
+ PUSH_MULTICALL;
+
+=for hackers
+Found in file cop.h
+
+
+=back
+
+=head1 Numeric functions
+
+=over 8
+
+=item grok_bin
+X<grok_bin>
+
+converts a string representing a binary number to numeric form.
+
+On entry I<start> and I<*len> give the string to scan, I<*flags> gives
+conversion flags, and I<result> should be NULL or a pointer to an NV.
+The scan stops at the end of the string, or the first invalid character.
+Unless C<PERL_SCAN_SILENT_ILLDIGIT> is set in I<*flags>, encountering an
+invalid character will also trigger a warning.
+On return I<*len> is set to the length of the scanned string,
+and I<*flags> gives output flags.
+
+If the value is <= C<UV_MAX> it is returned as a UV, the output flags are clear,
+and nothing is written to I<*result>. If the value is > UV_MAX C<grok_bin>
+returns UV_MAX, sets C<PERL_SCAN_GREATER_THAN_UV_MAX> in the output flags,
+and writes the value to I<*result> (or the value is discarded if I<result>
+is NULL).
+
+The binary number may optionally be prefixed with "0b" or "b" unless
+C<PERL_SCAN_DISALLOW_PREFIX> is set in I<*flags> on entry. If
+C<PERL_SCAN_ALLOW_UNDERSCORES> is set in I<*flags> then the binary
+number may use '_' characters to separate digits.
+
+ UV grok_bin(const char* start, STRLEN* len_p, I32* flags, NV *result)
+
+=for hackers
+Found in file numeric.c
+
+=item grok_hex
+X<grok_hex>
+
+converts a string representing a hex number to numeric form.
+
+On entry I<start> and I<*len> give the string to scan, I<*flags> gives
+conversion flags, and I<result> should be NULL or a pointer to an NV.
+The scan stops at the end of the string, or the first invalid character.
+Unless C<PERL_SCAN_SILENT_ILLDIGIT> is set in I<*flags>, encountering an
+invalid character will also trigger a warning.
+On return I<*len> is set to the length of the scanned string,
+and I<*flags> gives output flags.
+
+If the value is <= UV_MAX it is returned as a UV, the output flags are clear,
+and nothing is written to I<*result>. If the value is > UV_MAX C<grok_hex>
+returns UV_MAX, sets C<PERL_SCAN_GREATER_THAN_UV_MAX> in the output flags,
+and writes the value to I<*result> (or the value is discarded if I<result>
+is NULL).
+
+The hex number may optionally be prefixed with "0x" or "x" unless
+C<PERL_SCAN_DISALLOW_PREFIX> is set in I<*flags> on entry. If
+C<PERL_SCAN_ALLOW_UNDERSCORES> is set in I<*flags> then the hex
+number may use '_' characters to separate digits.
+
+ UV grok_hex(const char* start, STRLEN* len_p, I32* flags, NV *result)
+
+=for hackers
+Found in file numeric.c
+
+=item grok_number
+X<grok_number>
+
+Recognise (or not) a number. The type of the number is returned
+(0 if unrecognised), otherwise it is a bit-ORed combination of
+IS_NUMBER_IN_UV, IS_NUMBER_GREATER_THAN_UV_MAX, IS_NUMBER_NOT_INT,
+IS_NUMBER_NEG, IS_NUMBER_INFINITY, IS_NUMBER_NAN (defined in perl.h).
+
+If the value of the number can fit an in UV, it is returned in the *valuep
+IS_NUMBER_IN_UV will be set to indicate that *valuep is valid, IS_NUMBER_IN_UV
+will never be set unless *valuep is valid, but *valuep may have been assigned
+to during processing even though IS_NUMBER_IN_UV is not set on return.
+If valuep is NULL, IS_NUMBER_IN_UV will be set for the same cases as when
+valuep is non-NULL, but no actual assignment (or SEGV) will occur.
+
+IS_NUMBER_NOT_INT will be set with IS_NUMBER_IN_UV if trailing decimals were
+seen (in which case *valuep gives the true value truncated to an integer), and
+IS_NUMBER_NEG if the number is negative (in which case *valuep holds the
+absolute value). IS_NUMBER_IN_UV is not set if e notation was used or the
+number is larger than a UV.
+
+ int grok_number(const char *pv, STRLEN len, UV *valuep)
+
+=for hackers
+Found in file numeric.c
+
+=item grok_numeric_radix
+X<grok_numeric_radix>
+
+Scan and skip for a numeric decimal separator (radix).
+
+ bool grok_numeric_radix(const char **sp, const char *send)
+
+=for hackers
+Found in file numeric.c
+
+=item grok_oct
+X<grok_oct>
+
+converts a string representing an octal number to numeric form.
+
+On entry I<start> and I<*len> give the string to scan, I<*flags> gives
+conversion flags, and I<result> should be NULL or a pointer to an NV.
+The scan stops at the end of the string, or the first invalid character.
+Unless C<PERL_SCAN_SILENT_ILLDIGIT> is set in I<*flags>, encountering an
+invalid character will also trigger a warning.
+On return I<*len> is set to the length of the scanned string,
+and I<*flags> gives output flags.
+
+If the value is <= UV_MAX it is returned as a UV, the output flags are clear,
+and nothing is written to I<*result>. If the value is > UV_MAX C<grok_oct>
+returns UV_MAX, sets C<PERL_SCAN_GREATER_THAN_UV_MAX> in the output flags,
+and writes the value to I<*result> (or the value is discarded if I<result>
+is NULL).
+
+If C<PERL_SCAN_ALLOW_UNDERSCORES> is set in I<*flags> then the octal
+number may use '_' characters to separate digits.
+
+ UV grok_oct(const char* start, STRLEN* len_p, I32* flags, NV *result)
+
+=for hackers
+Found in file numeric.c
+
+=item Perl_signbit
+X<Perl_signbit>
+
+Return a non-zero integer if the sign bit on an NV is set, and 0 if
+it is not.
+
+If Configure detects this system has a signbit() that will work with
+our NVs, then we just use it via the #define in perl.h. Otherwise,
+fall back on this implementation. As a first pass, this gets everything
+right except -0.0. Alas, catching -0.0 is the main use for this function,
+so this is not too helpful yet. Still, at least we have the scaffolding
+in place to support other systems, should that prove useful.
+
+
+Configure notes: This function is called 'Perl_signbit' instead of a
+plain 'signbit' because it is easy to imagine a system having a signbit()
+function or macro that doesn't happen to work with our particular choice
+of NVs. We shouldn't just re-#define signbit as Perl_signbit and expect
+the standard system headers to be happy. Also, this is a no-context
+function (no pTHX_) because Perl_signbit() is usually re-#defined in
+perl.h as a simple macro call to the system's signbit().
+Users should just always call Perl_signbit().
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ int Perl_signbit(NV f)
+
+=for hackers
+Found in file numeric.c
+
+=item scan_bin
+X<scan_bin>
+
+For backwards compatibility. Use C<grok_bin> instead.
+
+ NV scan_bin(const char* start, STRLEN len, STRLEN* retlen)
+
+=for hackers
+Found in file numeric.c
+
+=item scan_hex
+X<scan_hex>
+
+For backwards compatibility. Use C<grok_hex> instead.
+
+ NV scan_hex(const char* start, STRLEN len, STRLEN* retlen)
+
+=for hackers
+Found in file numeric.c
+
+=item scan_oct
+X<scan_oct>
+
+For backwards compatibility. Use C<grok_oct> instead.
+
+ NV scan_oct(const char* start, STRLEN len, STRLEN* retlen)
+
+=for hackers
+Found in file numeric.c
+
+
+=back
+
+=head1 Optree Manipulation Functions
+
+=over 8
+
+=item cv_const_sv
+X<cv_const_sv>
+
+If C<cv> is a constant sub eligible for inlining. returns the constant
+value returned by the sub. Otherwise, returns NULL.
+
+Constant subs can be created with C<newCONSTSUB> or as described in
+L<perlsub/"Constant Functions">.
+
+ SV* cv_const_sv(CV* cv)
+
+=for hackers
+Found in file op.c
+
+=item newCONSTSUB
+X<newCONSTSUB>
+
+Creates a constant sub equivalent to Perl C<sub FOO () { 123 }> which is
+eligible for inlining at compile-time.
+
+ CV* newCONSTSUB(HV* stash, const char* name, SV* sv)
+
+=for hackers
+Found in file op.c
+
+=item newXS
+X<newXS>
+
+Used by C<xsubpp> to hook up XSUBs as Perl subs. I<filename> needs to be
+static storage, as it is used directly as CvFILE(), without a copy being made.
+
+=for hackers
+Found in file op.c
+
+
+=back
+
+=head1 Pad Data Structures
+
+=over 8
+
+=item pad_sv
+X<pad_sv>
+
+Get the value at offset po in the current pad.
+Use macro PAD_SV instead of calling this function directly.
+
+ SV* pad_sv(PADOFFSET po)
+
+=for hackers
+Found in file pad.c
+
+
+=back
+
+=head1 Per-Interpreter Variables
+
+=over 8
+
+=item PL_modglobal
+X<PL_modglobal>
+
+C<PL_modglobal> is a general purpose, interpreter global HV for use by
+extensions that need to keep information on a per-interpreter basis.
+In a pinch, it can also be used as a symbol table for extensions
+to share data among each other. It is a good idea to use keys
+prefixed by the package name of the extension that owns the data.
+
+ HV* PL_modglobal
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_na
+X<PL_na>
+
+A convenience variable which is typically used with C<SvPV> when one
+doesn't care about the length of the string. It is usually more efficient
+to either declare a local variable and use that instead or to use the
+C<SvPV_nolen> macro.
+
+ STRLEN PL_na
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_sv_no
+X<PL_sv_no>
+
+This is the C<false> SV. See C<PL_sv_yes>. Always refer to this as
+C<&PL_sv_no>.
+
+ SV PL_sv_no
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_sv_undef
+X<PL_sv_undef>
+
+This is the C<undef> SV. Always refer to this as C<&PL_sv_undef>.
+
+ SV PL_sv_undef
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_sv_yes
+X<PL_sv_yes>
+
+This is the C<true> SV. See C<PL_sv_no>. Always refer to this as
+C<&PL_sv_yes>.
+
+ SV PL_sv_yes
+
+=for hackers
+Found in file intrpvar.h
+
+
+=back
+
+=head1 REGEXP Functions
+
+=over 8
+
+=item SvRX
+X<SvRX>
+
+Convenience macro to get the REGEXP from a SV. This is approximately
+equivalent to the following snippet:
+
+ if (SvMAGICAL(sv))
+ mg_get(sv);
+ if (SvROK(sv) &&
+ (tmpsv = (SV*)SvRV(sv)) &&
+ SvTYPE(tmpsv) == SVt_PVMG &&
+ (tmpmg = mg_find(tmpsv, PERL_MAGIC_qr)))
+ {
+ return (REGEXP *)tmpmg->mg_obj;
+ }
+
+NULL will be returned if a REGEXP* is not found.
+
+ REGEXP * SvRX(SV *sv)
+
+=for hackers
+Found in file regexp.h
+
+=item SvRXOK
+X<SvRXOK>
+
+Returns a boolean indicating whether the SV contains qr magic
+(PERL_MAGIC_qr).
+
+If you want to do something with the REGEXP* later use SvRX instead
+and check for NULL.
+
+ bool SvRXOK(SV* sv)
+
+=for hackers
+Found in file regexp.h
+
+
+=back
+
+=head1 Simple Exception Handling Macros
+
+=over 8
+
+=item dXCPT
+X<dXCPT>
+
+Set up necessary local variables for exception handling.
+See L<perlguts/"Exception Handling">.
+
+ dXCPT;
+
+=for hackers
+Found in file XSUB.h
+
+=item XCPT_CATCH
+X<XCPT_CATCH>
+
+Introduces a catch block. See L<perlguts/"Exception Handling">.
+
+=for hackers
+Found in file XSUB.h
+
+=item XCPT_RETHROW
+X<XCPT_RETHROW>
+
+Rethrows a previously caught exception. See L<perlguts/"Exception Handling">.
+
+ XCPT_RETHROW;
+
+=for hackers
+Found in file XSUB.h
+
+=item XCPT_TRY_END
+X<XCPT_TRY_END>
+
+Ends a try block. See L<perlguts/"Exception Handling">.
+
+=for hackers
+Found in file XSUB.h
+
+=item XCPT_TRY_START
+X<XCPT_TRY_START>
+
+Starts a try block. See L<perlguts/"Exception Handling">.
+
+=for hackers
+Found in file XSUB.h
+
+
+=back
+
+=head1 Stack Manipulation Macros
+
+=over 8
+
+=item dMARK
+X<dMARK>
+
+Declare a stack marker variable, C<mark>, for the XSUB. See C<MARK> and
+C<dORIGMARK>.
+
+ dMARK;
+
+=for hackers
+Found in file pp.h
+
+=item dORIGMARK
+X<dORIGMARK>
+
+Saves the original stack mark for the XSUB. See C<ORIGMARK>.
+
+ dORIGMARK;
+
+=for hackers
+Found in file pp.h
+
+=item dSP
+X<dSP>
+
+Declares a local copy of perl's stack pointer for the XSUB, available via
+the C<SP> macro. See C<SP>.
+
+ dSP;
+
+=for hackers
+Found in file pp.h
+
+=item EXTEND
+X<EXTEND>
+
+Used to extend the argument stack for an XSUB's return values. Once
+used, guarantees that there is room for at least C<nitems> to be pushed
+onto the stack.
+
+ void EXTEND(SP, int nitems)
+
+=for hackers
+Found in file pp.h
+
+=item MARK
+X<MARK>
+
+Stack marker variable for the XSUB. See C<dMARK>.
+
+=for hackers
+Found in file pp.h
+
+=item mPUSHi
+X<mPUSHi>
+
+Push an integer onto the stack. The stack must have room for this element.
+Does not use C<TARG>. See also C<PUSHi>, C<mXPUSHi> and C<XPUSHi>.
+
+ void mPUSHi(IV iv)
+
+=for hackers
+Found in file pp.h
+
+=item mPUSHn
+X<mPUSHn>
+
+Push a double onto the stack. The stack must have room for this element.
+Does not use C<TARG>. See also C<PUSHn>, C<mXPUSHn> and C<XPUSHn>.
+
+ void mPUSHn(NV nv)
+
+=for hackers
+Found in file pp.h
+
+=item mPUSHp
+X<mPUSHp>
+
+Push a string onto the stack. The stack must have room for this element.
+The C<len> indicates the length of the string. Does not use C<TARG>.
+See also C<PUSHp>, C<mXPUSHp> and C<XPUSHp>.
+
+ void mPUSHp(char* str, STRLEN len)
+
+=for hackers
+Found in file pp.h
+
+=item mPUSHs
+X<mPUSHs>
+
+Push an SV onto the stack and mortalizes the SV. The stack must have room
+for this element. Does not use C<TARG>. See also C<PUSHs> and C<mXPUSHs>.
+
+ void mPUSHs(SV* sv)
+
+=for hackers
+Found in file pp.h
+
+=item mPUSHu
+X<mPUSHu>
+
+Push an unsigned integer onto the stack. The stack must have room for this
+element. Does not use C<TARG>. See also C<PUSHu>, C<mXPUSHu> and C<XPUSHu>.
+
+ void mPUSHu(UV uv)
+
+=for hackers
+Found in file pp.h
+
+=item mXPUSHi
+X<mXPUSHi>
+
+Push an integer onto the stack, extending the stack if necessary.
+Does not use C<TARG>. See also C<XPUSHi>, C<mPUSHi> and C<PUSHi>.
+
+ void mXPUSHi(IV iv)
+
+=for hackers
+Found in file pp.h
+
+=item mXPUSHn
+X<mXPUSHn>
+
+Push a double onto the stack, extending the stack if necessary.
+Does not use C<TARG>. See also C<XPUSHn>, C<mPUSHn> and C<PUSHn>.
+
+ void mXPUSHn(NV nv)
+
+=for hackers
+Found in file pp.h
+
+=item mXPUSHp
+X<mXPUSHp>
+
+Push a string onto the stack, extending the stack if necessary. The C<len>
+indicates the length of the string. Does not use C<TARG>. See also C<XPUSHp>,
+C<mPUSHp> and C<PUSHp>.
+
+ void mXPUSHp(char* str, STRLEN len)
+
+=for hackers
+Found in file pp.h
+
+=item mXPUSHs
+X<mXPUSHs>
+
+Push an SV onto the stack, extending the stack if necessary and mortalizes
+the SV. Does not use C<TARG>. See also C<XPUSHs> and C<mPUSHs>.
+
+ void mXPUSHs(SV* sv)
+
+=for hackers
+Found in file pp.h
+
+=item mXPUSHu
+X<mXPUSHu>
+
+Push an unsigned integer onto the stack, extending the stack if necessary.
+Does not use C<TARG>. See also C<XPUSHu>, C<mPUSHu> and C<PUSHu>.
+
+ void mXPUSHu(UV uv)
+
+=for hackers
+Found in file pp.h
+
+=item ORIGMARK
+X<ORIGMARK>
+
+The original stack mark for the XSUB. See C<dORIGMARK>.
+
+=for hackers
+Found in file pp.h
+
+=item POPi
+X<POPi>
+
+Pops an integer off the stack.
+
+ IV POPi
+
+=for hackers
+Found in file pp.h
+
+=item POPl
+X<POPl>
+
+Pops a long off the stack.
+
+ long POPl
+
+=for hackers
+Found in file pp.h
+
+=item POPn
+X<POPn>
+
+Pops a double off the stack.
+
+ NV POPn
+
+=for hackers
+Found in file pp.h
+
+=item POPp
+X<POPp>
+
+Pops a string off the stack. Deprecated. New code should use POPpx.
+
+ char* POPp
+
+=for hackers
+Found in file pp.h
+
+=item POPpbytex
+X<POPpbytex>
+
+Pops a string off the stack which must consist of bytes i.e. characters < 256.
+
+ char* POPpbytex
+
+=for hackers
+Found in file pp.h
+
+=item POPpx
+X<POPpx>
+
+Pops a string off the stack.
+
+ char* POPpx
+
+=for hackers
+Found in file pp.h
+
+=item POPs
+X<POPs>
+
+Pops an SV off the stack.
+
+ SV* POPs
+
+=for hackers
+Found in file pp.h
+
+=item PUSHi
+X<PUSHi>
+
+Push an integer onto the stack. The stack must have room for this element.
+Handles 'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
+called to declare it. Do not call multiple C<TARG>-oriented macros to
+return lists from XSUB's - see C<mPUSHi> instead. See also C<XPUSHi> and
+C<mXPUSHi>.
+
+ void PUSHi(IV iv)
+
+=for hackers
+Found in file pp.h
+
+=item PUSHMARK
+X<PUSHMARK>
+
+Opening bracket for arguments on a callback. See C<PUTBACK> and
+L<perlcall>.
+
+ void PUSHMARK(SP)
+
+=for hackers
+Found in file pp.h
+
+=item PUSHmortal
+X<PUSHmortal>
+
+Push a new mortal SV onto the stack. The stack must have room for this
+element. Does not use C<TARG>. See also C<PUSHs>, C<XPUSHmortal> and C<XPUSHs>.
+
+ void PUSHmortal()
+
+=for hackers
+Found in file pp.h
+
+=item PUSHn
+X<PUSHn>
+
+Push a double onto the stack. The stack must have room for this element.
+Handles 'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
+called to declare it. Do not call multiple C<TARG>-oriented macros to
+return lists from XSUB's - see C<mPUSHn> instead. See also C<XPUSHn> and
+C<mXPUSHn>.
+
+ void PUSHn(NV nv)
+
+=for hackers
+Found in file pp.h
+
+=item PUSHp
+X<PUSHp>
+
+Push a string onto the stack. The stack must have room for this element.
+The C<len> indicates the length of the string. Handles 'set' magic. Uses
+C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to declare it. Do not
+call multiple C<TARG>-oriented macros to return lists from XSUB's - see
+C<mPUSHp> instead. See also C<XPUSHp> and C<mXPUSHp>.
+
+ void PUSHp(char* str, STRLEN len)
+
+=for hackers
+Found in file pp.h
+
+=item PUSHs
+X<PUSHs>
+
+Push an SV onto the stack. The stack must have room for this element.
+Does not handle 'set' magic. Does not use C<TARG>. See also C<PUSHmortal>,
+C<XPUSHs> and C<XPUSHmortal>.
+
+ void PUSHs(SV* sv)
+
+=for hackers
+Found in file pp.h
+
+=item PUSHu
+X<PUSHu>
+
+Push an unsigned integer onto the stack. The stack must have room for this
+element. Handles 'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG>
+should be called to declare it. Do not call multiple C<TARG>-oriented
+macros to return lists from XSUB's - see C<mPUSHu> instead. See also
+C<XPUSHu> and C<mXPUSHu>.
+
+ void PUSHu(UV uv)
+
+=for hackers
+Found in file pp.h
+
+=item PUTBACK
+X<PUTBACK>
+
+Closing bracket for XSUB arguments. This is usually handled by C<xsubpp>.
+See C<PUSHMARK> and L<perlcall> for other uses.
+
+ PUTBACK;
+
+=for hackers
+Found in file pp.h
+
+=item SP
+X<SP>
+
+Stack pointer. This is usually handled by C<xsubpp>. See C<dSP> and
+C<SPAGAIN>.
+
+=for hackers
+Found in file pp.h
+
+=item SPAGAIN
+X<SPAGAIN>
+
+Refetch the stack pointer. Used after a callback. See L<perlcall>.
+
+ SPAGAIN;
+
+=for hackers
+Found in file pp.h
+
+=item XPUSHi
+X<XPUSHi>
+
+Push an integer onto the stack, extending the stack if necessary. Handles
+'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to
+declare it. Do not call multiple C<TARG>-oriented macros to return lists
+from XSUB's - see C<mXPUSHi> instead. See also C<PUSHi> and C<mPUSHi>.
+
+ void XPUSHi(IV iv)
+
+=for hackers
+Found in file pp.h
+
+=item XPUSHmortal
+X<XPUSHmortal>
+
+Push a new mortal SV onto the stack, extending the stack if necessary.
+Does not use C<TARG>. See also C<XPUSHs>, C<PUSHmortal> and C<PUSHs>.
+
+ void XPUSHmortal()
+
+=for hackers
+Found in file pp.h
+
+=item XPUSHn
+X<XPUSHn>
+
+Push a double onto the stack, extending the stack if necessary. Handles
+'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to
+declare it. Do not call multiple C<TARG>-oriented macros to return lists
+from XSUB's - see C<mXPUSHn> instead. See also C<PUSHn> and C<mPUSHn>.
+
+ void XPUSHn(NV nv)
+
+=for hackers
+Found in file pp.h
+
+=item XPUSHp
+X<XPUSHp>
+
+Push a string onto the stack, extending the stack if necessary. The C<len>
+indicates the length of the string. Handles 'set' magic. Uses C<TARG>, so
+C<dTARGET> or C<dXSTARG> should be called to declare it. Do not call
+multiple C<TARG>-oriented macros to return lists from XSUB's - see
+C<mXPUSHp> instead. See also C<PUSHp> and C<mPUSHp>.
+
+ void XPUSHp(char* str, STRLEN len)
+
+=for hackers
+Found in file pp.h
+
+=item XPUSHs
+X<XPUSHs>
+
+Push an SV onto the stack, extending the stack if necessary. Does not
+handle 'set' magic. Does not use C<TARG>. See also C<XPUSHmortal>,
+C<PUSHs> and C<PUSHmortal>.
+
+ void XPUSHs(SV* sv)
+
+=for hackers
+Found in file pp.h
+
+=item XPUSHu
+X<XPUSHu>
+
+Push an unsigned integer onto the stack, extending the stack if necessary.
+Handles 'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
+called to declare it. Do not call multiple C<TARG>-oriented macros to
+return lists from XSUB's - see C<mXPUSHu> instead. See also C<PUSHu> and
+C<mPUSHu>.
+
+ void XPUSHu(UV uv)
+
+=for hackers
+Found in file pp.h
+
+=item XSRETURN
+X<XSRETURN>
+
+Return from XSUB, indicating number of items on the stack. This is usually
+handled by C<xsubpp>.
+
+ void XSRETURN(int nitems)
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_EMPTY
+X<XSRETURN_EMPTY>
+
+Return an empty list from an XSUB immediately.
+
+ XSRETURN_EMPTY;
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_IV
+X<XSRETURN_IV>
+
+Return an integer from an XSUB immediately. Uses C<XST_mIV>.
+
+ void XSRETURN_IV(IV iv)
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_NO
+X<XSRETURN_NO>
+
+Return C<&PL_sv_no> from an XSUB immediately. Uses C<XST_mNO>.
+
+ XSRETURN_NO;
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_NV
+X<XSRETURN_NV>
+
+Return a double from an XSUB immediately. Uses C<XST_mNV>.
+
+ void XSRETURN_NV(NV nv)
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_PV
+X<XSRETURN_PV>
+
+Return a copy of a string from an XSUB immediately. Uses C<XST_mPV>.
+
+ void XSRETURN_PV(char* str)
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_UNDEF
+X<XSRETURN_UNDEF>
+
+Return C<&PL_sv_undef> from an XSUB immediately. Uses C<XST_mUNDEF>.
+
+ XSRETURN_UNDEF;
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_UV
+X<XSRETURN_UV>
+
+Return an integer from an XSUB immediately. Uses C<XST_mUV>.
+
+ void XSRETURN_UV(IV uv)
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_YES
+X<XSRETURN_YES>
+
+Return C<&PL_sv_yes> from an XSUB immediately. Uses C<XST_mYES>.
+
+ XSRETURN_YES;
+
+=for hackers
+Found in file XSUB.h
+
+=item XST_mIV
+X<XST_mIV>
+
+Place an integer into the specified position C<pos> on the stack. The
+value is stored in a new mortal SV.
+
+ void XST_mIV(int pos, IV iv)
+
+=for hackers
+Found in file XSUB.h
+
+=item XST_mNO
+X<XST_mNO>
+
+Place C<&PL_sv_no> into the specified position C<pos> on the
+stack.
+
+ void XST_mNO(int pos)
+
+=for hackers
+Found in file XSUB.h
+
+=item XST_mNV
+X<XST_mNV>
+
+Place a double into the specified position C<pos> on the stack. The value
+is stored in a new mortal SV.
+
+ void XST_mNV(int pos, NV nv)
+
+=for hackers
+Found in file XSUB.h
+
+=item XST_mPV
+X<XST_mPV>
+
+Place a copy of a string into the specified position C<pos> on the stack.
+The value is stored in a new mortal SV.
+
+ void XST_mPV(int pos, char* str)
+
+=for hackers
+Found in file XSUB.h
+
+=item XST_mUNDEF
+X<XST_mUNDEF>
+
+Place C<&PL_sv_undef> into the specified position C<pos> on the
+stack.
+
+ void XST_mUNDEF(int pos)
+
+=for hackers
+Found in file XSUB.h
+
+=item XST_mYES
+X<XST_mYES>
+
+Place C<&PL_sv_yes> into the specified position C<pos> on the
+stack.
+
+ void XST_mYES(int pos)
+
+=for hackers
+Found in file XSUB.h
+
+
+=back
+
+=head1 SV Flags
+
+=over 8
+
+=item svtype
+X<svtype>
+
+An enum of flags for Perl types. These are found in the file B<sv.h>
+in the C<svtype> enum. Test these flags with the C<SvTYPE> macro.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_IV
+X<SVt_IV>
+
+Integer type flag for scalars. See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_NV
+X<SVt_NV>
+
+Double type flag for scalars. See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_PV
+X<SVt_PV>
+
+Pointer type flag for scalars. See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_PVAV
+X<SVt_PVAV>
+
+Type flag for arrays. See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_PVCV
+X<SVt_PVCV>
+
+Type flag for code refs. See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_PVHV
+X<SVt_PVHV>
+
+Type flag for hashes. See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_PVMG
+X<SVt_PVMG>
+
+Type flag for blessed scalars. See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+
+=back
+
+=head1 SV Manipulation Functions
+
+=over 8
+
+=item croak_xs_usage
+X<croak_xs_usage>
+
+A specialised variant of C<croak()> for emitting the usage message for xsubs
+
+ croak_xs_usage(cv, "eee_yow");
+
+works out the package name and subroutine name from C<cv>, and then calls
+C<croak()>. Hence if C<cv> is C<&ouch::awk>, it would call C<croak> as:
+
+ Perl_croak(aTHX_ "Usage %s::%s(%s)", "ouch" "awk", "eee_yow");
+
+ void croak_xs_usage(const CV *const cv, const char *const params)
+
+=for hackers
+Found in file universal.c
+
+=item get_sv
+X<get_sv>
+
+Returns the SV of the specified Perl scalar. C<flags> are passed to
+C<gv_fetchpv>. If C<GV_ADD> is set and the
+Perl variable does not exist then it will be created. If C<flags> is zero
+and the variable does not exist then NULL is returned.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ SV* get_sv(const char *name, I32 flags)
+
+=for hackers
+Found in file perl.c
+
+=item newRV_inc
+X<newRV_inc>
+
+Creates an RV wrapper for an SV. The reference count for the original SV is
+incremented.
+
+ SV* newRV_inc(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item newSVpvn_utf8
+X<newSVpvn_utf8>
+
+Creates a new SV and copies a string into it. If utf8 is true, calls
+C<SvUTF8_on> on the new SV. Implemented as a wrapper around C<newSVpvn_flags>.
+
+ SV* newSVpvn_utf8(NULLOK const char* s, STRLEN len, U32 utf8)
+
+=for hackers
+Found in file sv.h
+
+=item SvCUR
+X<SvCUR>
+
+Returns the length of the string which is in the SV. See C<SvLEN>.
+
+ STRLEN SvCUR(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvCUR_set
+X<SvCUR_set>
+
+Set the current length of the string which is in the SV. See C<SvCUR>
+and C<SvIV_set>.
+
+ void SvCUR_set(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvEND
+X<SvEND>
+
+Returns a pointer to the last character in the string which is in the SV.
+See C<SvCUR>. Access the character as *(SvEND(sv)).
+
+ char* SvEND(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvGAMAGIC
+X<SvGAMAGIC>
+
+Returns true if the SV has get magic or overloading. If either is true then
+the scalar is active data, and has the potential to return a new value every
+time it is accessed. Hence you must be careful to only read it once per user
+logical operation and work with that returned value. If neither is true then
+the scalar's value cannot change unless written to.
+
+ U32 SvGAMAGIC(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvGROW
+X<SvGROW>
+
+Expands the character buffer in the SV so that it has room for the
+indicated number of bytes (remember to reserve space for an extra trailing
+NUL character). Calls C<sv_grow> to perform the expansion if necessary.
+Returns a pointer to the character buffer.
+
+ char * SvGROW(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK
+X<SvIOK>
+
+Returns a U32 value indicating whether the SV contains an integer.
+
+ U32 SvIOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOKp
+X<SvIOKp>
+
+Returns a U32 value indicating whether the SV contains an integer. Checks
+the B<private> setting. Use C<SvIOK> instead.
+
+ U32 SvIOKp(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_notUV
+X<SvIOK_notUV>
+
+Returns a boolean indicating whether the SV contains a signed integer.
+
+ bool SvIOK_notUV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_off
+X<SvIOK_off>
+
+Unsets the IV status of an SV.
+
+ void SvIOK_off(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_on
+X<SvIOK_on>
+
+Tells an SV that it is an integer.
+
+ void SvIOK_on(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_only
+X<SvIOK_only>
+
+Tells an SV that it is an integer and disables all other OK bits.
+
+ void SvIOK_only(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_only_UV
+X<SvIOK_only_UV>
+
+Tells and SV that it is an unsigned integer and disables all other OK bits.
+
+ void SvIOK_only_UV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_UV
+X<SvIOK_UV>
+
+Returns a boolean indicating whether the SV contains an unsigned integer.
+
+ bool SvIOK_UV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIsCOW
+X<SvIsCOW>
+
+Returns a boolean indicating whether the SV is Copy-On-Write. (either shared
+hash key scalars, or full Copy On Write scalars if 5.9.0 is configured for
+COW)
+
+ bool SvIsCOW(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIsCOW_shared_hash
+X<SvIsCOW_shared_hash>
+
+Returns a boolean indicating whether the SV is Copy-On-Write shared hash key
+scalar.
+
+ bool SvIsCOW_shared_hash(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIV
+X<SvIV>
+
+Coerces the given SV to an integer and returns it. See C<SvIVx> for a
+version which guarantees to evaluate sv only once.
+
+ IV SvIV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIVX
+X<SvIVX>
+
+Returns the raw value in the SV's IV slot, without checks or conversions.
+Only use when you are sure SvIOK is true. See also C<SvIV()>.
+
+ IV SvIVX(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIVx
+X<SvIVx>
+
+Coerces the given SV to an integer and returns it. Guarantees to evaluate
+C<sv> only once. Only use this if C<sv> is an expression with side effects,
+otherwise use the more efficient C<SvIV>.
+
+ IV SvIVx(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIV_nomg
+X<SvIV_nomg>
+
+Like C<SvIV> but doesn't process magic.
+
+ IV SvIV_nomg(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIV_set
+X<SvIV_set>
+
+Set the value of the IV pointer in sv to val. It is possible to perform
+the same function of this macro with an lvalue assignment to C<SvIVX>.
+With future Perls, however, it will be more efficient to use
+C<SvIV_set> instead of the lvalue assignment to C<SvIVX>.
+
+ void SvIV_set(SV* sv, IV val)
+
+=for hackers
+Found in file sv.h
+
+=item SvLEN
+X<SvLEN>
+
+Returns the size of the string buffer in the SV, not including any part
+attributable to C<SvOOK>. See C<SvCUR>.
+
+ STRLEN SvLEN(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvLEN_set
+X<SvLEN_set>
+
+Set the actual length of the string which is in the SV. See C<SvIV_set>.
+
+ void SvLEN_set(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvMAGIC_set
+X<SvMAGIC_set>
+
+Set the value of the MAGIC pointer in sv to val. See C<SvIV_set>.
+
+ void SvMAGIC_set(SV* sv, MAGIC* val)
+
+=for hackers
+Found in file sv.h
+
+=item SvNIOK
+X<SvNIOK>
+
+Returns a U32 value indicating whether the SV contains a number, integer or
+double.
+
+ U32 SvNIOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNIOKp
+X<SvNIOKp>
+
+Returns a U32 value indicating whether the SV contains a number, integer or
+double. Checks the B<private> setting. Use C<SvNIOK> instead.
+
+ U32 SvNIOKp(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNIOK_off
+X<SvNIOK_off>
+
+Unsets the NV/IV status of an SV.
+
+ void SvNIOK_off(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNOK
+X<SvNOK>
+
+Returns a U32 value indicating whether the SV contains a double.
+
+ U32 SvNOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNOKp
+X<SvNOKp>
+
+Returns a U32 value indicating whether the SV contains a double. Checks the
+B<private> setting. Use C<SvNOK> instead.
+
+ U32 SvNOKp(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNOK_off
+X<SvNOK_off>
+
+Unsets the NV status of an SV.
+
+ void SvNOK_off(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNOK_on
+X<SvNOK_on>
+
+Tells an SV that it is a double.
+
+ void SvNOK_on(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNOK_only
+X<SvNOK_only>
+
+Tells an SV that it is a double and disables all other OK bits.
+
+ void SvNOK_only(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNV
+X<SvNV>
+
+Coerce the given SV to a double and return it. See C<SvNVx> for a version
+which guarantees to evaluate sv only once.
+
+ NV SvNV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNVX
+X<SvNVX>
+
+Returns the raw value in the SV's NV slot, without checks or conversions.
+Only use when you are sure SvNOK is true. See also C<SvNV()>.
+
+ NV SvNVX(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNVx
+X<SvNVx>
+
+Coerces the given SV to a double and returns it. Guarantees to evaluate
+C<sv> only once. Only use this if C<sv> is an expression with side effects,
+otherwise use the more efficient C<SvNV>.
+
+ NV SvNVx(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNV_set
+X<SvNV_set>
+
+Set the value of the NV pointer in sv to val. See C<SvIV_set>.
+
+ void SvNV_set(SV* sv, NV val)
+
+=for hackers
+Found in file sv.h
+
+=item SvOK
+X<SvOK>
+
+Returns a U32 value indicating whether the value is defined. This is
+only meaningful for scalars.
+
+ U32 SvOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvOOK
+X<SvOOK>
+
+Returns a U32 indicating whether the SvIVX is a valid offset value for
+the SvPVX. This hack is used internally to speed up removal of characters
+from the beginning of a SvPV. When SvOOK is true, then the start of the
+allocated string buffer is really (SvPVX - SvIVX).
+
+ U32 SvOOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPOK
+X<SvPOK>
+
+Returns a U32 value indicating whether the SV contains a character
+string.
+
+ U32 SvPOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPOKp
+X<SvPOKp>
+
+Returns a U32 value indicating whether the SV contains a character string.
+Checks the B<private> setting. Use C<SvPOK> instead.
+
+ U32 SvPOKp(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPOK_off
+X<SvPOK_off>
+
+Unsets the PV status of an SV.
+
+ void SvPOK_off(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPOK_on
+X<SvPOK_on>
+
+Tells an SV that it is a string.
+
+ void SvPOK_on(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPOK_only
+X<SvPOK_only>
+
+Tells an SV that it is a string and disables all other OK bits.
+Will also turn off the UTF-8 status.
+
+ void SvPOK_only(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPOK_only_UTF8
+X<SvPOK_only_UTF8>
+
+Tells an SV that it is a string and disables all other OK bits,
+and leaves the UTF-8 status as it was.
+
+ void SvPOK_only_UTF8(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPV
+X<SvPV>
+
+Returns a pointer to the string in the SV, or a stringified form of
+the SV if the SV does not contain a string. The SV may cache the
+stringified version becoming C<SvPOK>. Handles 'get' magic. See also
+C<SvPVx> for a version which guarantees to evaluate sv only once.
+
+ char* SvPV(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVbyte
+X<SvPVbyte>
+
+Like C<SvPV>, but converts sv to byte representation first if necessary.
+
+ char* SvPVbyte(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVbytex
+X<SvPVbytex>
+
+Like C<SvPV>, but converts sv to byte representation first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVbyte>
+otherwise.
+
+ char* SvPVbytex(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVbytex_force
+X<SvPVbytex_force>
+
+Like C<SvPV_force>, but converts sv to byte representation first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVbyte_force>
+otherwise.
+
+ char* SvPVbytex_force(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVbyte_force
+X<SvPVbyte_force>
+
+Like C<SvPV_force>, but converts sv to byte representation first if necessary.
+
+ char* SvPVbyte_force(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVbyte_nolen
+X<SvPVbyte_nolen>
+
+Like C<SvPV_nolen>, but converts sv to byte representation first if necessary.
+
+ char* SvPVbyte_nolen(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVutf8
+X<SvPVutf8>
+
+Like C<SvPV>, but converts sv to utf8 first if necessary.
+
+ char* SvPVutf8(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVutf8x
+X<SvPVutf8x>
+
+Like C<SvPV>, but converts sv to utf8 first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVutf8>
+otherwise.
+
+ char* SvPVutf8x(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVutf8x_force
+X<SvPVutf8x_force>
+
+Like C<SvPV_force>, but converts sv to utf8 first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVutf8_force>
+otherwise.
+
+ char* SvPVutf8x_force(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVutf8_force
+X<SvPVutf8_force>
+
+Like C<SvPV_force>, but converts sv to utf8 first if necessary.
+
+ char* SvPVutf8_force(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVutf8_nolen
+X<SvPVutf8_nolen>
+
+Like C<SvPV_nolen>, but converts sv to utf8 first if necessary.
+
+ char* SvPVutf8_nolen(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVX
+X<SvPVX>
+
+Returns a pointer to the physical string in the SV. The SV must contain a
+string.
+
+ char* SvPVX(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVx
+X<SvPVx>
+
+A version of C<SvPV> which guarantees to evaluate C<sv> only once.
+Only use this if C<sv> is an expression with side effects, otherwise use the
+more efficient C<SvPVX>.
+
+ char* SvPVx(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPV_force
+X<SvPV_force>
+
+Like C<SvPV> but will force the SV into containing just a string
+(C<SvPOK_only>). You want force if you are going to update the C<SvPVX>
+directly.
+
+ char* SvPV_force(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPV_force_nomg
+X<SvPV_force_nomg>
+
+Like C<SvPV> but will force the SV into containing just a string
+(C<SvPOK_only>). You want force if you are going to update the C<SvPVX>
+directly. Doesn't process magic.
+
+ char* SvPV_force_nomg(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPV_nolen
+X<SvPV_nolen>
+
+Returns a pointer to the string in the SV, or a stringified form of
+the SV if the SV does not contain a string. The SV may cache the
+stringified form becoming C<SvPOK>. Handles 'get' magic.
+
+ char* SvPV_nolen(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPV_nomg
+X<SvPV_nomg>
+
+Like C<SvPV> but doesn't process magic.
+
+ char* SvPV_nomg(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPV_set
+X<SvPV_set>
+
+Set the value of the PV pointer in sv to val. See C<SvIV_set>.
+
+ void SvPV_set(SV* sv, char* val)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT
+X<SvREFCNT>
+
+Returns the value of the object's reference count.
+
+ U32 SvREFCNT(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT_dec
+X<SvREFCNT_dec>
+
+Decrements the reference count of the given SV.
+
+ void SvREFCNT_dec(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT_inc
+X<SvREFCNT_inc>
+
+Increments the reference count of the given SV.
+
+All of the following SvREFCNT_inc* macros are optimized versions of
+SvREFCNT_inc, and can be replaced with SvREFCNT_inc.
+
+ SV* SvREFCNT_inc(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT_inc_NN
+X<SvREFCNT_inc_NN>
+
+Same as SvREFCNT_inc, but can only be used if you know I<sv>
+is not NULL. Since we don't have to check the NULLness, it's faster
+and smaller.
+
+ SV* SvREFCNT_inc_NN(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT_inc_simple
+X<SvREFCNT_inc_simple>
+
+Same as SvREFCNT_inc, but can only be used with expressions without side
+effects. Since we don't have to store a temporary value, it's faster.
+
+ SV* SvREFCNT_inc_simple(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT_inc_simple_NN
+X<SvREFCNT_inc_simple_NN>
+
+Same as SvREFCNT_inc_simple, but can only be used if you know I<sv>
+is not NULL. Since we don't have to check the NULLness, it's faster
+and smaller.
+
+ SV* SvREFCNT_inc_simple_NN(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT_inc_simple_void
+X<SvREFCNT_inc_simple_void>
+
+Same as SvREFCNT_inc_simple, but can only be used if you don't need the
+return value. The macro doesn't need to return a meaningful value.
+
+ void SvREFCNT_inc_simple_void(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT_inc_simple_void_NN
+X<SvREFCNT_inc_simple_void_NN>
+
+Same as SvREFCNT_inc, but can only be used if you don't need the return
+value, and you know that I<sv> is not NULL. The macro doesn't need
+to return a meaningful value, or check for NULLness, so it's smaller
+and faster.
+
+ void SvREFCNT_inc_simple_void_NN(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT_inc_void
+X<SvREFCNT_inc_void>
+
+Same as SvREFCNT_inc, but can only be used if you don't need the
+return value. The macro doesn't need to return a meaningful value.
+
+ void SvREFCNT_inc_void(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT_inc_void_NN
+X<SvREFCNT_inc_void_NN>
+
+Same as SvREFCNT_inc, but can only be used if you don't need the return
+value, and you know that I<sv> is not NULL. The macro doesn't need
+to return a meaningful value, or check for NULLness, so it's smaller
+and faster.
+
+ void SvREFCNT_inc_void_NN(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvROK
+X<SvROK>
+
+Tests if the SV is an RV.
+
+ U32 SvROK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvROK_off
+X<SvROK_off>
+
+Unsets the RV status of an SV.
+
+ void SvROK_off(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvROK_on
+X<SvROK_on>
+
+Tells an SV that it is an RV.
+
+ void SvROK_on(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvRV
+X<SvRV>
+
+Dereferences an RV to return the SV.
+
+ SV* SvRV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvRV_set
+X<SvRV_set>
+
+Set the value of the RV pointer in sv to val. See C<SvIV_set>.
+
+ void SvRV_set(SV* sv, SV* val)
+
+=for hackers
+Found in file sv.h
+
+=item SvSTASH
+X<SvSTASH>
+
+Returns the stash of the SV.
+
+ HV* SvSTASH(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSTASH_set
+X<SvSTASH_set>
+
+Set the value of the STASH pointer in sv to val. See C<SvIV_set>.
+
+ void SvSTASH_set(SV* sv, HV* val)
+
+=for hackers
+Found in file sv.h
+
+=item SvTAINT
+X<SvTAINT>
+
+Taints an SV if tainting is enabled.
+
+ void SvTAINT(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvTAINTED
+X<SvTAINTED>
+
+Checks to see if an SV is tainted. Returns TRUE if it is, FALSE if
+not.
+
+ bool SvTAINTED(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvTAINTED_off
+X<SvTAINTED_off>
+
+Untaints an SV. Be I<very> careful with this routine, as it short-circuits
+some of Perl's fundamental security features. XS module authors should not
+use this function unless they fully understand all the implications of
+unconditionally untainting the value. Untainting should be done in the
+standard perl fashion, via a carefully crafted regexp, rather than directly
+untainting variables.
+
+ void SvTAINTED_off(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvTAINTED_on
+X<SvTAINTED_on>
+
+Marks an SV as tainted if tainting is enabled.
+
+ void SvTAINTED_on(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvTRUE
+X<SvTRUE>
+
+Returns a boolean indicating whether Perl would evaluate the SV as true or
+false. See SvOK() for a defined/undefined test. Does not handle 'get' magic.
+
+ bool SvTRUE(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvTYPE
+X<SvTYPE>
+
+Returns the type of the SV. See C<svtype>.
+
+ svtype SvTYPE(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUOK
+X<SvUOK>
+
+Returns a boolean indicating whether the SV contains an unsigned integer.
+
+ bool SvUOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUPGRADE
+X<SvUPGRADE>
+
+Used to upgrade an SV to a more complex form. Uses C<sv_upgrade> to
+perform the upgrade if necessary. See C<svtype>.
+
+ void SvUPGRADE(SV* sv, svtype type)
+
+=for hackers
+Found in file sv.h
+
+=item SvUTF8
+X<SvUTF8>
+
+Returns a U32 value indicating whether the SV contains UTF-8 encoded data.
+Call this after SvPV() in case any call to string overloading updates the
+internal flag.
+
+ U32 SvUTF8(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUTF8_off
+X<SvUTF8_off>
+
+Unsets the UTF-8 status of an SV.
+
+ void SvUTF8_off(SV *sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUTF8_on
+X<SvUTF8_on>
+
+Turn on the UTF-8 status of an SV (the data is not changed, just the flag).
+Do not use frivolously.
+
+ void SvUTF8_on(SV *sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUV
+X<SvUV>
+
+Coerces the given SV to an unsigned integer and returns it. See C<SvUVx>
+for a version which guarantees to evaluate sv only once.
+
+ UV SvUV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUVX
+X<SvUVX>
+
+Returns the raw value in the SV's UV slot, without checks or conversions.
+Only use when you are sure SvIOK is true. See also C<SvUV()>.
+
+ UV SvUVX(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUVx
+X<SvUVx>
+
+Coerces the given SV to an unsigned integer and returns it. Guarantees to
+C<sv> only once. Only use this if C<sv> is an expression with side effects,
+otherwise use the more efficient C<SvUV>.
+
+ UV SvUVx(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUV_nomg
+X<SvUV_nomg>
+
+Like C<SvUV> but doesn't process magic.
+
+ UV SvUV_nomg(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUV_set
+X<SvUV_set>
+
+Set the value of the UV pointer in sv to val. See C<SvIV_set>.
+
+ void SvUV_set(SV* sv, UV val)
+
+=for hackers
+Found in file sv.h
+
+=item SvVOK
+X<SvVOK>
+
+Returns a boolean indicating whether the SV contains a v-string.
+
+ bool SvVOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item sv_catpvn_nomg
+X<sv_catpvn_nomg>
+
+Like C<sv_catpvn> but doesn't process magic.
+
+ void sv_catpvn_nomg(SV* sv, const char* ptr, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item sv_catsv_nomg
+X<sv_catsv_nomg>
+
+Like C<sv_catsv> but doesn't process magic.
+
+ void sv_catsv_nomg(SV* dsv, SV* ssv)
+
+=for hackers
+Found in file sv.h
+
+=item sv_derived_from
+X<sv_derived_from>
+
+Returns a boolean indicating whether the SV is derived from the specified class
+I<at the C level>. To check derivation at the Perl level, call C<isa()> as a
+normal Perl method.
+
+ bool sv_derived_from(SV* sv, const char* name)
+
+=for hackers
+Found in file universal.c
+
+=item sv_does
+X<sv_does>
+
+Returns a boolean indicating whether the SV performs a specific, named role.
+The SV can be a Perl object or the name of a Perl class.
+
+ bool sv_does(SV* sv, const char* name)
+
+=for hackers
+Found in file universal.c
+
+=item sv_report_used
+X<sv_report_used>
+
+Dump the contents of all SVs not yet freed. (Debugging aid).
+
+ void sv_report_used()
+
+=for hackers
+Found in file sv.c
+
+=item sv_setsv_nomg
+X<sv_setsv_nomg>
+
+Like C<sv_setsv> but doesn't process magic.
+
+ void sv_setsv_nomg(SV* dsv, SV* ssv)
+
+=for hackers
+Found in file sv.h
+
+=item sv_utf8_upgrade_nomg
+X<sv_utf8_upgrade_nomg>
+
+Like sv_utf8_upgrade, but doesn't do magic on C<sv>
+
+ STRLEN sv_utf8_upgrade_nomg(NN SV *sv)
+
+=for hackers
+Found in file sv.h
+
+
+=back
+
+=head1 SV-Body Allocation
+
+=over 8
+
+=item looks_like_number
+X<looks_like_number>
+
+Test if the content of an SV looks like a number (or is a number).
+C<Inf> and C<Infinity> are treated as numbers (so will not issue a
+non-numeric warning), even if your atof() doesn't grok them.
+
+ I32 looks_like_number(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item newRV_noinc
+X<newRV_noinc>
+
+Creates an RV wrapper for an SV. The reference count for the original
+SV is B<not> incremented.
+
+ SV* newRV_noinc(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item newSV
+X<newSV>
+
+Creates a new SV. A non-zero C<len> parameter indicates the number of
+bytes of preallocated string space the SV should have. An extra byte for a
+trailing NUL is also reserved. (SvPOK is not set for the SV even if string
+space is allocated.) The reference count for the new SV is set to 1.
+
+In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
+parameter, I<x>, a debug aid which allowed callers to identify themselves.
+This aid has been superseded by a new build option, PERL_MEM_LOG (see
+L<perlhack/PERL_MEM_LOG>). The older API is still there for use in XS
+modules supporting older perls.
+
+ SV* newSV(STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item newSVhek
+X<newSVhek>
+
+Creates a new SV from the hash key structure. It will generate scalars that
+point to the shared string table where possible. Returns a new (undefined)
+SV if the hek is NULL.
+
+ SV* newSVhek(const HEK *hek)
+
+=for hackers
+Found in file sv.c
+
+=item newSViv
+X<newSViv>
+
+Creates a new SV and copies an integer into it. The reference count for the
+SV is set to 1.
+
+ SV* newSViv(IV i)
+
+=for hackers
+Found in file sv.c
+
+=item newSVnv
+X<newSVnv>
+
+Creates a new SV and copies a floating point value into it.
+The reference count for the SV is set to 1.
+
+ SV* newSVnv(NV n)
+
+=for hackers
+Found in file sv.c
+
+=item newSVpv
+X<newSVpv>
+
+Creates a new SV and copies a string into it. The reference count for the
+SV is set to 1. If C<len> is zero, Perl will compute the length using
+strlen(). For efficiency, consider using C<newSVpvn> instead.
+
+ SV* newSVpv(const char* s, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item newSVpvf
+X<newSVpvf>
+
+Creates a new SV and initializes it with the string formatted like
+C<sprintf>.
+
+ SV* newSVpvf(const char* pat, ...)
+
+=for hackers
+Found in file sv.c
+
+=item newSVpvn
+X<newSVpvn>
+
+Creates a new SV and copies a string into it. The reference count for the
+SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
+string. You are responsible for ensuring that the source string is at least
+C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
+
+ SV* newSVpvn(const char* s, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item newSVpvn_flags
+X<newSVpvn_flags>
+
+Creates a new SV and copies a string into it. The reference count for the
+SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
+string. You are responsible for ensuring that the source string is at least
+C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
+Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
+If C<SVs_TEMP> is set, then C<sv2mortal()> is called on the result before
+returning. If C<SVf_UTF8> is set, then it will be set on the new SV.
+C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
+
+ #define newSVpvn_utf8(s, len, u) \
+ newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
+
+ SV* newSVpvn_flags(const char* s, STRLEN len, U32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item newSVpvn_share
+X<newSVpvn_share>
+
+Creates a new SV with its SvPVX_const pointing to a shared string in the string
+table. If the string does not already exist in the table, it is created
+first. Turns on READONLY and FAKE. If the C<hash> parameter is non-zero, that
+value is used; otherwise the hash is computed. The string's hash can be later
+be retrieved from the SV with the C<SvSHARED_HASH()> macro. The idea here is
+that as the string table is used for shared hash keys these strings will have
+SvPVX_const == HeKEY and hash lookup will avoid string compare.
+
+ SV* newSVpvn_share(const char* s, I32 len, U32 hash)
+
+=for hackers
+Found in file sv.c
+
+=item newSVpvs
+X<newSVpvs>
+
+Like C<newSVpvn>, but takes a literal string instead of a string/length pair.
+
+ SV* newSVpvs(const char* s)
+
+=for hackers
+Found in file handy.h
+
+=item newSVpvs_flags
+X<newSVpvs_flags>
+
+Like C<newSVpvn_flags>, but takes a literal string instead of a string/length
+pair.
+
+ SV* newSVpvs_flags(const char* s, U32 flags)
+
+=for hackers
+Found in file handy.h
+
+=item newSVpvs_share
+X<newSVpvs_share>
+
+Like C<newSVpvn_share>, but takes a literal string instead of a string/length
+pair and omits the hash parameter.
+
+ SV* newSVpvs_share(const char* s)
+
+=for hackers
+Found in file handy.h
+
+=item newSVrv
+X<newSVrv>
+
+Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
+it will be upgraded to one. If C<classname> is non-null then the new SV will
+be blessed in the specified package. The new SV is returned and its
+reference count is 1.
+
+ SV* newSVrv(SV* rv, const char* classname)
+
+=for hackers
+Found in file sv.c
+
+=item newSVsv
+X<newSVsv>
+
+Creates a new SV which is an exact duplicate of the original SV.
+(Uses C<sv_setsv>).
+
+ SV* newSVsv(SV* old)
+
+=for hackers
+Found in file sv.c
+
+=item newSVuv
+X<newSVuv>
+
+Creates a new SV and copies an unsigned integer into it.
+The reference count for the SV is set to 1.
+
+ SV* newSVuv(UV u)
+
+=for hackers
+Found in file sv.c
+
+=item newSV_type
+X<newSV_type>
+
+Creates a new SV, of the type specified. The reference count for the new SV
+is set to 1.
+
+ SV* newSV_type(svtype type)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2bool
+X<sv_2bool>
+
+This function is only called on magical items, and is only used by
+sv_true() or its macro equivalent.
+
+ bool sv_2bool(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2cv
+X<sv_2cv>
+
+Using various gambits, try to get a CV from an SV; in addition, try if
+possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
+The flags in C<lref> are passed to sv_fetchsv.
+
+ CV* sv_2cv(SV* sv, HV** st, GV** gvp, I32 lref)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2io
+X<sv_2io>
+
+Using various gambits, try to get an IO from an SV: the IO slot if its a
+GV; or the recursive result if we're an RV; or the IO slot of the symbol
+named after the PV if we're a string.
+
+ IO* sv_2io(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2iv_flags
+X<sv_2iv_flags>
+
+Return the integer value of an SV, doing any necessary string
+conversion. If flags includes SV_GMAGIC, does an mg_get() first.
+Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
+
+ IV sv_2iv_flags(SV* sv, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2mortal
+X<sv_2mortal>
+
+Marks an existing SV as mortal. The SV will be destroyed "soon", either
+by an explicit call to FREETMPS, or by an implicit call at places such as
+statement boundaries. SvTEMP() is turned on which means that the SV's
+string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
+and C<sv_mortalcopy>.
+
+ SV* sv_2mortal(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2nv
+X<sv_2nv>
+
+Return the num value of an SV, doing any necessary string or integer
+conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
+macros.
+
+ NV sv_2nv(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2pvbyte
+X<sv_2pvbyte>
+
+Return a pointer to the byte-encoded representation of the SV, and set *lp
+to its length. May cause the SV to be downgraded from UTF-8 as a
+side-effect.
+
+Usually accessed via the C<SvPVbyte> macro.
+
+ char* sv_2pvbyte(SV* sv, STRLEN* lp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2pvutf8
+X<sv_2pvutf8>
+
+Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
+to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
+
+Usually accessed via the C<SvPVutf8> macro.
+
+ char* sv_2pvutf8(SV* sv, STRLEN* lp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2pv_flags
+X<sv_2pv_flags>
+
+Returns a pointer to the string value of an SV, and sets *lp to its length.
+If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
+if necessary.
+Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
+usually end up here too.
+
+ char* sv_2pv_flags(SV* sv, STRLEN* lp, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2uv_flags
+X<sv_2uv_flags>
+
+Return the unsigned integer value of an SV, doing any necessary string
+conversion. If flags includes SV_GMAGIC, does an mg_get() first.
+Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
+
+ UV sv_2uv_flags(SV* sv, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_backoff
+X<sv_backoff>
+
+Remove any string offset. You should normally use the C<SvOOK_off> macro
+wrapper instead.
+
+ int sv_backoff(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_bless
+X<sv_bless>
+
+Blesses an SV into a specified package. The SV must be an RV. The package
+must be designated by its stash (see C<gv_stashpv()>). The reference count
+of the SV is unaffected.
+
+ SV* sv_bless(SV* sv, HV* stash)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpv
+X<sv_catpv>
+
+Concatenates the string onto the end of the string which is in the SV.
+If the SV has the UTF-8 status set, then the bytes appended should be
+valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
+
+ void sv_catpv(SV* sv, const char* ptr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpvf
+X<sv_catpvf>
+
+Processes its arguments like C<sprintf> and appends the formatted
+output to an SV. If the appended data contains "wide" characters
+(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
+and characters >255 formatted with %c), the original SV might get
+upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
+C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
+valid UTF-8; if the original SV was bytes, the pattern should be too.
+
+ void sv_catpvf(SV* sv, const char* pat, ...)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpvf_mg
+X<sv_catpvf_mg>
+
+Like C<sv_catpvf>, but also handles 'set' magic.
+
+ void sv_catpvf_mg(SV *sv, const char* pat, ...)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpvn
+X<sv_catpvn>
+
+Concatenates the string onto the end of the string which is in the SV. The
+C<len> indicates number of bytes to copy. If the SV has the UTF-8
+status set, then the bytes appended should be valid UTF-8.
+Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
+
+ void sv_catpvn(SV *dsv, const char *sstr, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpvn_flags
+X<sv_catpvn_flags>
+
+Concatenates the string onto the end of the string which is in the SV. The
+C<len> indicates number of bytes to copy. If the SV has the UTF-8
+status set, then the bytes appended should be valid UTF-8.
+If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
+appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
+in terms of this function.
+
+ void sv_catpvn_flags(SV *dstr, const char *sstr, STRLEN len, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpvs
+X<sv_catpvs>
+
+Like C<sv_catpvn>, but takes a literal string instead of a string/length pair.
+
+ void sv_catpvs(SV* sv, const char* s)
+
+=for hackers
+Found in file handy.h
+
+=item sv_catpv_mg
+X<sv_catpv_mg>
+
+Like C<sv_catpv>, but also handles 'set' magic.
+
+ void sv_catpv_mg(SV *sv, const char *ptr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catsv
+X<sv_catsv>
+
+Concatenates the string from SV C<ssv> onto the end of the string in
+SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
+not 'set' magic. See C<sv_catsv_mg>.
+
+ void sv_catsv(SV *dstr, SV *sstr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catsv_flags
+X<sv_catsv_flags>
+
+Concatenates the string from SV C<ssv> onto the end of the string in
+SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
+bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
+and C<sv_catsv_nomg> are implemented in terms of this function.
+
+ void sv_catsv_flags(SV* dsv, SV* ssv, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_chop
+X<sv_chop>
+
+Efficient removal of characters from the beginning of the string buffer.
+SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
+the string buffer. The C<ptr> becomes the first character of the adjusted
+string. Uses the "OOK hack".
+Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
+refer to the same chunk of data.
+
+ void sv_chop(SV* sv, const char* ptr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_clear
+X<sv_clear>
+
+Clear an SV: call any destructors, free up any memory used by the body,
+and free the body itself. The SV's head is I<not> freed, although
+its type is set to all 1's so that it won't inadvertently be assumed
+to be live during global destruction etc.
+This function should only be called when REFCNT is zero. Most of the time
+you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
+instead.
+
+ void sv_clear(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_cmp
+X<sv_cmp>
+
+Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
+string in C<sv1> is less than, equal to, or greater than the string in
+C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
+coerce its args to strings if necessary. See also C<sv_cmp_locale>.
+
+ I32 sv_cmp(SV* sv1, SV* sv2)
+
+=for hackers
+Found in file sv.c
+
+=item sv_cmp_locale
+X<sv_cmp_locale>
+
+Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
+'use bytes' aware, handles get magic, and will coerce its args to strings
+if necessary. See also C<sv_cmp>.
+
+ I32 sv_cmp_locale(SV* sv1, SV* sv2)
+
+=for hackers
+Found in file sv.c
+
+=item sv_collxfrm
+X<sv_collxfrm>
+
+Add Collate Transform magic to an SV if it doesn't already have it.
+
+Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
+scalar data of the variable, but transformed to such a format that a normal
+memory comparison can be used to compare the data according to the locale
+settings.
+
+ char* sv_collxfrm(SV* sv, STRLEN* nxp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_copypv
+X<sv_copypv>
+
+Copies a stringified representation of the source SV into the
+destination SV. Automatically performs any necessary mg_get and
+coercion of numeric values into strings. Guaranteed to preserve
+UTF8 flag even from overloaded objects. Similar in nature to
+sv_2pv[_flags] but operates directly on an SV instead of just the
+string. Mostly uses sv_2pv_flags to do its work, except when that
+would lose the UTF-8'ness of the PV.
+
+ void sv_copypv(SV* dsv, SV* ssv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_dec
+X<sv_dec>
+
+Auto-decrement of the value in the SV, doing string to numeric conversion
+if necessary. Handles 'get' magic.
+
+ void sv_dec(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_eq
+X<sv_eq>
+
+Returns a boolean indicating whether the strings in the two SVs are
+identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
+coerce its args to strings if necessary.
+
+ I32 sv_eq(SV* sv1, SV* sv2)
+
+=for hackers
+Found in file sv.c
+
+=item sv_force_normal_flags
+X<sv_force_normal_flags>
+
+Undo various types of fakery on an SV: if the PV is a shared string, make
+a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
+an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
+we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
+then a copy-on-write scalar drops its PV buffer (if any) and becomes
+SvPOK_off rather than making a copy. (Used where this scalar is about to be
+set to some other value.) In addition, the C<flags> parameter gets passed to
+C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
+with flags set to 0.
+
+ void sv_force_normal_flags(SV *sv, U32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_free
+X<sv_free>
+
+Decrement an SV's reference count, and if it drops to zero, call
+C<sv_clear> to invoke destructors and free up any memory used by
+the body; finally, deallocate the SV's head itself.
+Normally called via a wrapper macro C<SvREFCNT_dec>.
+
+ void sv_free(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_gets
+X<sv_gets>
+
+Get a line from the filehandle and store it into the SV, optionally
+appending to the currently-stored string.
+
+ char* sv_gets(SV* sv, PerlIO* fp, I32 append)
+
+=for hackers
+Found in file sv.c
+
+=item sv_grow
+X<sv_grow>
+
+Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
+upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
+Use the C<SvGROW> wrapper instead.
+
+ char* sv_grow(SV* sv, STRLEN newlen)
+
+=for hackers
+Found in file sv.c
+
+=item sv_inc
+X<sv_inc>
+
+Auto-increment of the value in the SV, doing string to numeric conversion
+if necessary. Handles 'get' magic.
+
+ void sv_inc(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_insert
+X<sv_insert>
+
+Inserts a string at the specified offset/length within the SV. Similar to
+the Perl substr() function. Handles get magic.
+
+ void sv_insert(SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
+
+=for hackers
+Found in file sv.c
+
+=item sv_insert_flags
+X<sv_insert_flags>
+
+Same as C<sv_insert>, but the extra C<flags> are passed the C<SvPV_force_flags> that applies to C<bigstr>.
+
+ void sv_insert_flags(SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_isa
+X<sv_isa>
+
+Returns a boolean indicating whether the SV is blessed into the specified
+class. This does not check for subtypes; use C<sv_derived_from> to verify
+an inheritance relationship.
+
+ int sv_isa(SV* sv, const char* name)
+
+=for hackers
+Found in file sv.c
+
+=item sv_isobject
+X<sv_isobject>
+
+Returns a boolean indicating whether the SV is an RV pointing to a blessed
+object. If the SV is not an RV, or if the object is not blessed, then this
+will return false.
+
+ int sv_isobject(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_len
+X<sv_len>
+
+Returns the length of the string in the SV. Handles magic and type
+coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
+
+ STRLEN sv_len(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_len_utf8
+X<sv_len_utf8>
+
+Returns the number of characters in the string in an SV, counting wide
+UTF-8 bytes as a single character. Handles magic and type coercion.
+
+ STRLEN sv_len_utf8(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_magic
+X<sv_magic>
+
+Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
+then adds a new magic item of type C<how> to the head of the magic list.
+
+See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
+handling of the C<name> and C<namlen> arguments.
+
+You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
+to add more than one instance of the same 'how'.
+
+ void sv_magic(SV* sv, SV* obj, int how, const char* name, I32 namlen)
+
+=for hackers
+Found in file sv.c
+
+=item sv_magicext
+X<sv_magicext>
+
+Adds magic to an SV, upgrading it if necessary. Applies the
+supplied vtable and returns a pointer to the magic added.
+
+Note that C<sv_magicext> will allow things that C<sv_magic> will not.
+In particular, you can add magic to SvREADONLY SVs, and add more than
+one instance of the same 'how'.
+
+If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
+stored, if C<namlen> is zero then C<name> is stored as-is and - as another
+special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
+to contain an C<SV*> and is stored as-is with its REFCNT incremented.
+
+(This is now used as a subroutine by C<sv_magic>.)
+
+ MAGIC * sv_magicext(SV* sv, SV* obj, int how, const MGVTBL *vtbl, const char* name, I32 namlen)
+
+=for hackers
+Found in file sv.c
+
+=item sv_mortalcopy
+X<sv_mortalcopy>
+
+Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
+The new SV is marked as mortal. It will be destroyed "soon", either by an
+explicit call to FREETMPS, or by an implicit call at places such as
+statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
+
+ SV* sv_mortalcopy(SV* oldsv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_newmortal
+X<sv_newmortal>
+
+Creates a new null SV which is mortal. The reference count of the SV is
+set to 1. It will be destroyed "soon", either by an explicit call to
+FREETMPS, or by an implicit call at places such as statement boundaries.
+See also C<sv_mortalcopy> and C<sv_2mortal>.
+
+ SV* sv_newmortal()
+
+=for hackers
+Found in file sv.c
+
+=item sv_newref
+X<sv_newref>
+
+Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
+instead.
+
+ SV* sv_newref(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pos_b2u
+X<sv_pos_b2u>
+
+Converts the value pointed to by offsetp from a count of bytes from the
+start of the string, to a count of the equivalent number of UTF-8 chars.
+Handles magic and type coercion.
+
+ void sv_pos_b2u(SV* sv, I32* offsetp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pos_u2b
+X<sv_pos_u2b>
+
+Converts the value pointed to by offsetp from a count of UTF-8 chars from
+the start of the string, to a count of the equivalent number of bytes; if
+lenp is non-zero, it does the same to lenp, but this time starting from
+the offset, rather than from the start of the string. Handles magic and
+type coercion.
+
+ void sv_pos_u2b(SV* sv, I32* offsetp, I32* lenp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvbyten_force
+X<sv_pvbyten_force>
+
+The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
+
+ char* sv_pvbyten_force(SV* sv, STRLEN* lp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvn_force
+X<sv_pvn_force>
+
+Get a sensible string out of the SV somehow.
+A private implementation of the C<SvPV_force> macro for compilers which
+can't cope with complex macro expressions. Always use the macro instead.
+
+ char* sv_pvn_force(SV* sv, STRLEN* lp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvn_force_flags
+X<sv_pvn_force_flags>
+
+Get a sensible string out of the SV somehow.
+If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
+appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
+implemented in terms of this function.
+You normally want to use the various wrapper macros instead: see
+C<SvPV_force> and C<SvPV_force_nomg>
+
+ char* sv_pvn_force_flags(SV* sv, STRLEN* lp, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvutf8n_force
+X<sv_pvutf8n_force>
+
+The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
+
+ char* sv_pvutf8n_force(SV* sv, STRLEN* lp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_reftype
+X<sv_reftype>
+
+Returns a string describing what the SV is a reference to.
+
+ const char* sv_reftype(const SV* sv, int ob)
+
+=for hackers
+Found in file sv.c
+
+=item sv_replace
+X<sv_replace>
+
+Make the first argument a copy of the second, then delete the original.
+The target SV physically takes over ownership of the body of the source SV
+and inherits its flags; however, the target keeps any magic it owns,
+and any magic in the source is discarded.
+Note that this is a rather specialist SV copying operation; most of the
+time you'll want to use C<sv_setsv> or one of its many macro front-ends.
+
+ void sv_replace(SV* sv, SV* nsv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_reset
+X<sv_reset>
+
+Underlying implementation for the C<reset> Perl function.
+Note that the perl-level function is vaguely deprecated.
+
+ void sv_reset(const char* s, HV* stash)
+
+=for hackers
+Found in file sv.c
+
+=item sv_rvweaken
+X<sv_rvweaken>
+
+Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
+referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
+push a back-reference to this RV onto the array of backreferences
+associated with that magic. If the RV is magical, set magic will be
+called after the RV is cleared.
+
+ SV* sv_rvweaken(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setiv
+X<sv_setiv>
+
+Copies an integer into the given SV, upgrading first if necessary.
+Does not handle 'set' magic. See also C<sv_setiv_mg>.
+
+ void sv_setiv(SV* sv, IV num)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setiv_mg
+X<sv_setiv_mg>
+
+Like C<sv_setiv>, but also handles 'set' magic.
+
+ void sv_setiv_mg(SV *sv, IV i)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setnv
+X<sv_setnv>
+
+Copies a double into the given SV, upgrading first if necessary.
+Does not handle 'set' magic. See also C<sv_setnv_mg>.
+
+ void sv_setnv(SV* sv, NV num)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setnv_mg
+X<sv_setnv_mg>
+
+Like C<sv_setnv>, but also handles 'set' magic.
+
+ void sv_setnv_mg(SV *sv, NV num)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpv
+X<sv_setpv>
+
+Copies a string into an SV. The string must be null-terminated. Does not
+handle 'set' magic. See C<sv_setpv_mg>.
+
+ void sv_setpv(SV* sv, const char* ptr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpvf
+X<sv_setpvf>
+
+Works like C<sv_catpvf> but copies the text into the SV instead of
+appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
+
+ void sv_setpvf(SV* sv, const char* pat, ...)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpvf_mg
+X<sv_setpvf_mg>
+
+Like C<sv_setpvf>, but also handles 'set' magic.
+
+ void sv_setpvf_mg(SV *sv, const char* pat, ...)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpviv
+X<sv_setpviv>
+
+Copies an integer into the given SV, also updating its string value.
+Does not handle 'set' magic. See C<sv_setpviv_mg>.
+
+ void sv_setpviv(SV* sv, IV num)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpviv_mg
+X<sv_setpviv_mg>
+
+Like C<sv_setpviv>, but also handles 'set' magic.
+
+ void sv_setpviv_mg(SV *sv, IV iv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpvn
+X<sv_setpvn>
+
+Copies a string into an SV. The C<len> parameter indicates the number of
+bytes to be copied. If the C<ptr> argument is NULL the SV will become
+undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
+
+ void sv_setpvn(SV* sv, const char* ptr, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpvn_mg
+X<sv_setpvn_mg>
+
+Like C<sv_setpvn>, but also handles 'set' magic.
+
+ void sv_setpvn_mg(SV *sv, const char *ptr, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpvs
+X<sv_setpvs>
+
+Like C<sv_setpvn>, but takes a literal string instead of a string/length pair.
+
+ void sv_setpvs(SV* sv, const char* s)
+
+=for hackers
+Found in file handy.h
+
+=item sv_setpv_mg
+X<sv_setpv_mg>
+
+Like C<sv_setpv>, but also handles 'set' magic.
+
+ void sv_setpv_mg(SV *sv, const char *ptr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setref_iv
+X<sv_setref_iv>
+
+Copies an integer into a new SV, optionally blessing the SV. The C<rv>
+argument will be upgraded to an RV. That RV will be modified to point to
+the new SV. The C<classname> argument indicates the package for the
+blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
+will have a reference count of 1, and the RV will be returned.
+
+ SV* sv_setref_iv(SV* rv, const char* classname, IV iv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setref_nv
+X<sv_setref_nv>
+
+Copies a double into a new SV, optionally blessing the SV. The C<rv>
+argument will be upgraded to an RV. That RV will be modified to point to
+the new SV. The C<classname> argument indicates the package for the
+blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
+will have a reference count of 1, and the RV will be returned.
+
+ SV* sv_setref_nv(SV* rv, const char* classname, NV nv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setref_pv
+X<sv_setref_pv>
+
+Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
+argument will be upgraded to an RV. That RV will be modified to point to
+the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
+into the SV. The C<classname> argument indicates the package for the
+blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
+will have a reference count of 1, and the RV will be returned.
+
+Do not use with other Perl types such as HV, AV, SV, CV, because those
+objects will become corrupted by the pointer copy process.
+
+Note that C<sv_setref_pvn> copies the string while this copies the pointer.
+
+ SV* sv_setref_pv(SV* rv, const char* classname, void* pv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setref_pvn
+X<sv_setref_pvn>
+
+Copies a string into a new SV, optionally blessing the SV. The length of the
+string must be specified with C<n>. The C<rv> argument will be upgraded to
+an RV. That RV will be modified to point to the new SV. The C<classname>
+argument indicates the package for the blessing. Set C<classname> to
+C<NULL> to avoid the blessing. The new SV will have a reference count
+of 1, and the RV will be returned.
+
+Note that C<sv_setref_pv> copies the pointer while this copies the string.
+
+ SV* sv_setref_pvn(SV* rv, const char* classname, const char* pv, STRLEN n)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setref_uv
+X<sv_setref_uv>
+
+Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
+argument will be upgraded to an RV. That RV will be modified to point to
+the new SV. The C<classname> argument indicates the package for the
+blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
+will have a reference count of 1, and the RV will be returned.
+
+ SV* sv_setref_uv(SV* rv, const char* classname, UV uv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setsv
+X<sv_setsv>
+
+Copies the contents of the source SV C<ssv> into the destination SV
+C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
+function if the source SV needs to be reused. Does not handle 'set' magic.
+Loosely speaking, it performs a copy-by-value, obliterating any previous
+content of the destination.
+
+You probably want to use one of the assortment of wrappers, such as
+C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
+C<SvSetMagicSV_nosteal>.
+
+ void sv_setsv(SV *dstr, SV *sstr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setsv_flags
+X<sv_setsv_flags>
+
+Copies the contents of the source SV C<ssv> into the destination SV
+C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
+function if the source SV needs to be reused. Does not handle 'set' magic.
+Loosely speaking, it performs a copy-by-value, obliterating any previous
+content of the destination.
+If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
+C<ssv> if appropriate, else not. If the C<flags> parameter has the
+C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
+and C<sv_setsv_nomg> are implemented in terms of this function.
+
+You probably want to use one of the assortment of wrappers, such as
+C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
+C<SvSetMagicSV_nosteal>.
+
+This is the primary function for copying scalars, and most other
+copy-ish functions and macros use this underneath.
+
+ void sv_setsv_flags(SV *dstr, SV *sstr, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setsv_mg
+X<sv_setsv_mg>
+
+Like C<sv_setsv>, but also handles 'set' magic.
+
+ void sv_setsv_mg(SV *dstr, SV *sstr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setuv
+X<sv_setuv>
+
+Copies an unsigned integer into the given SV, upgrading first if necessary.
+Does not handle 'set' magic. See also C<sv_setuv_mg>.
+
+ void sv_setuv(SV* sv, UV num)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setuv_mg
+X<sv_setuv_mg>
+
+Like C<sv_setuv>, but also handles 'set' magic.
+
+ void sv_setuv_mg(SV *sv, UV u)
+
+=for hackers
+Found in file sv.c
+
+=item sv_tainted
+X<sv_tainted>
+
+Test an SV for taintedness. Use C<SvTAINTED> instead.
+ bool sv_tainted(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_true
+X<sv_true>
+
+Returns true if the SV has a true value by Perl's rules.
+Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
+instead use an in-line version.
+
+ I32 sv_true(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_unmagic
+X<sv_unmagic>
+
+Removes all magic of type C<type> from an SV.
+
+ int sv_unmagic(SV* sv, int type)
+
+=for hackers
+Found in file sv.c
+
+=item sv_unref_flags
+X<sv_unref_flags>
+
+Unsets the RV status of the SV, and decrements the reference count of
+whatever was being referenced by the RV. This can almost be thought of
+as a reversal of C<newSVrv>. The C<cflags> argument can contain
+C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
+(otherwise the decrementing is conditional on the reference count being
+different from one or the reference being a readonly SV).
+See C<SvROK_off>.
+
+ void sv_unref_flags(SV *ref, U32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_untaint
+X<sv_untaint>
+
+Untaint an SV. Use C<SvTAINTED_off> instead.
+ void sv_untaint(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_upgrade
+X<sv_upgrade>
+
+Upgrade an SV to a more complex form. Generally adds a new body type to the
+SV, then copies across as much information as possible from the old body.
+You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
+
+ void sv_upgrade(SV* sv, svtype new_type)
+
+=for hackers
+Found in file sv.c
+
+=item sv_usepvn_flags
+X<sv_usepvn_flags>
+
+Tells an SV to use C<ptr> to find its string value. Normally the
+string is stored inside the SV but sv_usepvn allows the SV to use an
+outside string. The C<ptr> should point to memory that was allocated
+by C<malloc>. The string length, C<len>, must be supplied. By default
+this function will realloc (i.e. move) the memory pointed to by C<ptr>,
+so that pointer should not be freed or used by the programmer after
+giving it to sv_usepvn, and neither should any pointers from "behind"
+that pointer (e.g. ptr + 1) be used.
+
+If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
+SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
+will be skipped. (i.e. the buffer is actually at least 1 byte longer than
+C<len>, and already meets the requirements for storing in C<SvPVX>)
+
+ void sv_usepvn_flags(SV* sv, char* ptr, STRLEN len, U32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_decode
+X<sv_utf8_decode>
+
+If the PV of the SV is an octet sequence in UTF-8
+and contains a multiple-byte character, the C<SvUTF8> flag is turned on
+so that it looks like a character. If the PV contains only single-byte
+characters, the C<SvUTF8> flag stays being off.
+Scans PV for validity and returns false if the PV is invalid UTF-8.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ bool sv_utf8_decode(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_downgrade
+X<sv_utf8_downgrade>
+
+Attempts to convert the PV of an SV from characters to bytes.
+If the PV contains a character that cannot fit
+in a byte, this conversion will fail;
+in this case, either returns false or, if C<fail_ok> is not
+true, croaks.
+
+This is not as a general purpose Unicode to byte encoding interface:
+use the Encode extension for that.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ bool sv_utf8_downgrade(SV *sv, bool fail_ok)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_encode
+X<sv_utf8_encode>
+
+Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
+flag off so that it looks like octets again.
+
+ void sv_utf8_encode(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_upgrade
+X<sv_utf8_upgrade>
+
+Converts the PV of an SV to its UTF-8-encoded form.
+Forces the SV to string form if it is not already.
+Will C<mg_get> on C<sv> if appropriate.
+Always sets the SvUTF8 flag to avoid future validity checks even
+if the whole string is the same in UTF-8 as not.
+Returns the number of bytes in the converted string
+
+This is not as a general purpose byte encoding to Unicode interface:
+use the Encode extension for that.
+
+ STRLEN sv_utf8_upgrade(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_upgrade_flags
+X<sv_utf8_upgrade_flags>
+
+Converts the PV of an SV to its UTF-8-encoded form.
+Forces the SV to string form if it is not already.
+Always sets the SvUTF8 flag to avoid future validity checks even
+if all the bytes are invariant in UTF-8. If C<flags> has C<SV_GMAGIC> bit set,
+will C<mg_get> on C<sv> if appropriate, else not.
+Returns the number of bytes in the converted string
+C<sv_utf8_upgrade> and
+C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
+
+This is not as a general purpose byte encoding to Unicode interface:
+use the Encode extension for that.
+
+ STRLEN sv_utf8_upgrade_flags(SV *sv, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_upgrade_nomg
+X<sv_utf8_upgrade_nomg>
+
+Like sv_utf8_upgrade, but doesn't do magic on C<sv>
+
+ STRLEN sv_utf8_upgrade_nomg(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_vcatpvf
+X<sv_vcatpvf>
+
+Processes its arguments like C<vsprintf> and appends the formatted output
+to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
+
+Usually used via its frontend C<sv_catpvf>.
+
+ void sv_vcatpvf(SV* sv, const char* pat, va_list* args)
+
+=for hackers
+Found in file sv.c
+
+=item sv_vcatpvfn
+X<sv_vcatpvfn>
+
+Processes its arguments like C<vsprintf> and appends the formatted output
+to an SV. Uses an array of SVs if the C style variable argument list is
+missing (NULL). When running with taint checks enabled, indicates via
+C<maybe_tainted> if results are untrustworthy (often due to the use of
+locales).
+
+Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
+
+ void sv_vcatpvfn(SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted)
+
+=for hackers
+Found in file sv.c
+
+=item sv_vcatpvf_mg
+X<sv_vcatpvf_mg>
+
+Like C<sv_vcatpvf>, but also handles 'set' magic.
+
+Usually used via its frontend C<sv_catpvf_mg>.
+
+ void sv_vcatpvf_mg(SV* sv, const char* pat, va_list* args)
+
+=for hackers
+Found in file sv.c
+
+=item sv_vsetpvf
+X<sv_vsetpvf>
+
+Works like C<sv_vcatpvf> but copies the text into the SV instead of
+appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
+
+Usually used via its frontend C<sv_setpvf>.
+
+ void sv_vsetpvf(SV* sv, const char* pat, va_list* args)
+
+=for hackers
+Found in file sv.c
+
+=item sv_vsetpvfn
+X<sv_vsetpvfn>
+
+Works like C<sv_vcatpvfn> but copies the text into the SV instead of
+appending it.
+
+Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
+
+ void sv_vsetpvfn(SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted)
+
+=for hackers
+Found in file sv.c
+
+=item sv_vsetpvf_mg
+X<sv_vsetpvf_mg>
+
+Like C<sv_vsetpvf>, but also handles 'set' magic.
+
+Usually used via its frontend C<sv_setpvf_mg>.
+
+ void sv_vsetpvf_mg(SV* sv, const char* pat, va_list* args)
+
+=for hackers
+Found in file sv.c
+
+
+=back
+
+=head1 Unicode Support
+
+=over 8
+
+=item bytes_from_utf8
+X<bytes_from_utf8>
+
+Converts a string C<s> of length C<len> from UTF-8 into native byte encoding.
+Unlike C<utf8_to_bytes> but like C<bytes_to_utf8>, returns a pointer to
+the newly-created string, and updates C<len> to contain the new
+length. Returns the original string if no conversion occurs, C<len>
+is unchanged. Do nothing if C<is_utf8> points to 0. Sets C<is_utf8> to
+0 if C<s> is converted or consisted entirely of characters that are invariant
+in utf8 (i.e., US-ASCII on non-EBCDIC machines).
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ U8* bytes_from_utf8(const U8 *s, STRLEN *len, bool *is_utf8)
+
+=for hackers
+Found in file utf8.c
+
+=item bytes_to_utf8
+X<bytes_to_utf8>
+
+Converts a string C<s> of length C<len> from the native encoding into UTF-8.
+Returns a pointer to the newly-created string, and sets C<len> to
+reflect the new length.
+
+A NUL character will be written after the end of the string.
+
+If you want to convert to UTF-8 from encodings other than
+the native (Latin1 or EBCDIC),
+see sv_recode_to_utf8().
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ U8* bytes_to_utf8(const U8 *s, STRLEN *len)
+
+=for hackers
+Found in file utf8.c
+
+=item ibcmp_utf8
+X<ibcmp_utf8>
+
+Return true if the strings s1 and s2 differ case-insensitively, false
+if not (if they are equal case-insensitively). If u1 is true, the
+string s1 is assumed to be in UTF-8-encoded Unicode. If u2 is true,
+the string s2 is assumed to be in UTF-8-encoded Unicode. If u1 or u2
+are false, the respective string is assumed to be in native 8-bit
+encoding.
+
+If the pe1 and pe2 are non-NULL, the scanning pointers will be copied
+in there (they will point at the beginning of the I<next> character).
+If the pointers behind pe1 or pe2 are non-NULL, they are the end
+pointers beyond which scanning will not continue under any
+circumstances. If the byte lengths l1 and l2 are non-zero, s1+l1 and
+s2+l2 will be used as goal end pointers that will also stop the scan,
+and which qualify towards defining a successful match: all the scans
+that define an explicit length must reach their goal pointers for
+a match to succeed).
+
+For case-insensitiveness, the "casefolding" of Unicode is used
+instead of upper/lowercasing both the characters, see
+http://www.unicode.org/unicode/reports/tr21/ (Case Mappings).
+
+ I32 ibcmp_utf8(const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2)
+
+=for hackers
+Found in file utf8.c
+
+=item is_utf8_char
+X<is_utf8_char>
+
+Tests if some arbitrary number of bytes begins in a valid UTF-8
+character. Note that an INVARIANT (i.e. ASCII on non-EBCDIC machines)
+character is a valid UTF-8 character. The actual number of bytes in the UTF-8
+character will be returned if it is valid, otherwise 0.
+
+ STRLEN is_utf8_char(const U8 *s)
+
+=for hackers
+Found in file utf8.c
+
+=item is_utf8_string
+X<is_utf8_string>
+
+Returns true if first C<len> bytes of the given string form a valid
+UTF-8 string, false otherwise. Note that 'a valid UTF-8 string' does
+not mean 'a string that contains code points above 0x7F encoded in UTF-8'
+because a valid ASCII string is a valid UTF-8 string.
+
+See also is_utf8_string_loclen() and is_utf8_string_loc().
+
+ bool is_utf8_string(const U8 *s, STRLEN len)
+
+=for hackers
+Found in file utf8.c
+
+=item is_utf8_string_loc
+X<is_utf8_string_loc>
+
+Like is_utf8_string() but stores the location of the failure (in the
+case of "utf8ness failure") or the location s+len (in the case of
+"utf8ness success") in the C<ep>.
+
+See also is_utf8_string_loclen() and is_utf8_string().
+
+ bool is_utf8_string_loc(const U8 *s, STRLEN len, const U8 **p)
+
+=for hackers
+Found in file utf8.c
+
+=item is_utf8_string_loclen
+X<is_utf8_string_loclen>
+
+Like is_utf8_string() but stores the location of the failure (in the
+case of "utf8ness failure") or the location s+len (in the case of
+"utf8ness success") in the C<ep>, and the number of UTF-8
+encoded characters in the C<el>.
+
+See also is_utf8_string_loc() and is_utf8_string().
+
+ bool is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el)
+
+=for hackers
+Found in file utf8.c
+
+=item pv_uni_display
+X<pv_uni_display>
+
+Build to the scalar dsv a displayable version of the string spv,
+length len, the displayable version being at most pvlim bytes long
+(if longer, the rest is truncated and "..." will be appended).
+
+The flags argument can have UNI_DISPLAY_ISPRINT set to display
+isPRINT()able characters as themselves, UNI_DISPLAY_BACKSLASH
+to display the \\[nrfta\\] as the backslashed versions (like '\n')
+(UNI_DISPLAY_BACKSLASH is preferred over UNI_DISPLAY_ISPRINT for \\).
+UNI_DISPLAY_QQ (and its alias UNI_DISPLAY_REGEX) have both
+UNI_DISPLAY_BACKSLASH and UNI_DISPLAY_ISPRINT turned on.
+
+The pointer to the PV of the dsv is returned.
+
+ char* pv_uni_display(SV *dsv, const U8 *spv, STRLEN len, STRLEN pvlim, UV flags)
+
+=for hackers
+Found in file utf8.c
+
+=item sv_cat_decode
+X<sv_cat_decode>
+
+The encoding is assumed to be an Encode object, the PV of the ssv is
+assumed to be octets in that encoding and decoding the input starts
+from the position which (PV + *offset) pointed to. The dsv will be
+concatenated the decoded UTF-8 string from ssv. Decoding will terminate
+when the string tstr appears in decoding output or the input ends on
+the PV of the ssv. The value which the offset points will be modified
+to the last input position on the ssv.
+
+Returns TRUE if the terminator was found, else returns FALSE.
+
+ bool sv_cat_decode(SV* dsv, SV *encoding, SV *ssv, int *offset, char* tstr, int tlen)
+
+=for hackers
+Found in file sv.c
+
+=item sv_recode_to_utf8
+X<sv_recode_to_utf8>
+
+The encoding is assumed to be an Encode object, on entry the PV
+of the sv is assumed to be octets in that encoding, and the sv
+will be converted into Unicode (and UTF-8).
+
+If the sv already is UTF-8 (or if it is not POK), or if the encoding
+is not a reference, nothing is done to the sv. If the encoding is not
+an C<Encode::XS> Encoding object, bad things will happen.
+(See F<lib/encoding.pm> and L<Encode>).
+
+The PV of the sv is returned.
+
+ char* sv_recode_to_utf8(SV* sv, SV *encoding)
+
+=for hackers
+Found in file sv.c
+
+=item sv_uni_display
+X<sv_uni_display>
+
+Build to the scalar dsv a displayable version of the scalar sv,
+the displayable version being at most pvlim bytes long
+(if longer, the rest is truncated and "..." will be appended).
+
+The flags argument is as in pv_uni_display().
+
+The pointer to the PV of the dsv is returned.
+
+ char* sv_uni_display(SV *dsv, SV *ssv, STRLEN pvlim, UV flags)
+
+=for hackers
+Found in file utf8.c
+
+=item to_utf8_case
+X<to_utf8_case>
+
+The "p" contains the pointer to the UTF-8 string encoding
+the character that is being converted.
+
+The "ustrp" is a pointer to the character buffer to put the
+conversion result to. The "lenp" is a pointer to the length
+of the result.
+
+The "swashp" is a pointer to the swash to use.
+
+Both the special and normal mappings are stored lib/unicore/To/Foo.pl,
+and loaded by SWASHNEW, using lib/utf8_heavy.pl. The special (usually,
+but not always, a multicharacter mapping), is tried first.
+
+The "special" is a string like "utf8::ToSpecLower", which means the
+hash %utf8::ToSpecLower. The access to the hash is through
+Perl_to_utf8_case().
+
+The "normal" is a string like "ToLower" which means the swash
+%utf8::ToLower.
+
+ UV to_utf8_case(const U8 *p, U8* ustrp, STRLEN *lenp, SV **swashp, const char *normal, const char *special)
+
+=for hackers
+Found in file utf8.c
+
+=item to_utf8_fold
+X<to_utf8_fold>
+
+Convert the UTF-8 encoded character at p to its foldcase version and
+store that in UTF-8 in ustrp and its length in bytes in lenp. Note
+that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
+foldcase version may be longer than the original character (up to
+three characters).
+
+The first character of the foldcased version is returned
+(but note, as explained above, that there may be more.)
+
+ UV to_utf8_fold(const U8 *p, U8* ustrp, STRLEN *lenp)
+
+=for hackers
+Found in file utf8.c
+
+=item to_utf8_lower
+X<to_utf8_lower>
+
+Convert the UTF-8 encoded character at p to its lowercase version and
+store that in UTF-8 in ustrp and its length in bytes in lenp. Note
+that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
+lowercase version may be longer than the original character.
+
+The first character of the lowercased version is returned
+(but note, as explained above, that there may be more.)
+
+ UV to_utf8_lower(const U8 *p, U8* ustrp, STRLEN *lenp)
+
+=for hackers
+Found in file utf8.c
+
+=item to_utf8_title
+X<to_utf8_title>
+
+Convert the UTF-8 encoded character at p to its titlecase version and
+store that in UTF-8 in ustrp and its length in bytes in lenp. Note
+that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
+titlecase version may be longer than the original character.
+
+The first character of the titlecased version is returned
+(but note, as explained above, that there may be more.)
+
+ UV to_utf8_title(const U8 *p, U8* ustrp, STRLEN *lenp)
+
+=for hackers
+Found in file utf8.c
+
+=item to_utf8_upper
+X<to_utf8_upper>
+
+Convert the UTF-8 encoded character at p to its uppercase version and
+store that in UTF-8 in ustrp and its length in bytes in lenp. Note
+that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since
+the uppercase version may be longer than the original character.
+
+The first character of the uppercased version is returned
+(but note, as explained above, that there may be more.)
+
+ UV to_utf8_upper(const U8 *p, U8* ustrp, STRLEN *lenp)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8n_to_uvchr
+X<utf8n_to_uvchr>
+
+flags
+
+Returns the native character value of the first character in the string
+C<s>
+which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
+length, in bytes, of that character.
+
+Allows length and flags to be passed to low level routine.
+
+ UV utf8n_to_uvchr(const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8n_to_uvuni
+X<utf8n_to_uvuni>
+
+Bottom level UTF-8 decode routine.
+Returns the Unicode code point value of the first character in the string C<s>
+which is assumed to be in UTF-8 encoding and no longer than C<curlen>;
+C<retlen> will be set to the length, in bytes, of that character.
+
+If C<s> does not point to a well-formed UTF-8 character, the behaviour
+is dependent on the value of C<flags>: if it contains UTF8_CHECK_ONLY,
+it is assumed that the caller will raise a warning, and this function
+will silently just set C<retlen> to C<-1> and return zero. If the
+C<flags> does not contain UTF8_CHECK_ONLY, warnings about
+malformations will be given, C<retlen> will be set to the expected
+length of the UTF-8 character in bytes, and zero will be returned.
+
+The C<flags> can also contain various flags to allow deviations from
+the strict UTF-8 encoding (see F<utf8.h>).
+
+Most code should use utf8_to_uvchr() rather than call this directly.
+
+ UV utf8n_to_uvuni(const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_distance
+X<utf8_distance>
+
+Returns the number of UTF-8 characters between the UTF-8 pointers C<a>
+and C<b>.
+
+WARNING: use only if you *know* that the pointers point inside the
+same UTF-8 buffer.
+
+ IV utf8_distance(const U8 *a, const U8 *b)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_hop
+X<utf8_hop>
+
+Return the UTF-8 pointer C<s> displaced by C<off> characters, either
+forward or backward.
+
+WARNING: do not use the following unless you *know* C<off> is within
+the UTF-8 data pointed to by C<s> *and* that on entry C<s> is aligned
+on the first byte of character or just after the last byte of a character.
+
+ U8* utf8_hop(const U8 *s, I32 off)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_length
+X<utf8_length>
+
+Return the length of the UTF-8 char encoded string C<s> in characters.
+Stops at C<e> (inclusive). If C<e E<lt> s> or if the scan would end
+up past C<e>, croaks.
+
+ STRLEN utf8_length(const U8* s, const U8 *e)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_to_bytes
+X<utf8_to_bytes>
+
+Converts a string C<s> of length C<len> from UTF-8 into native byte encoding.
+Unlike C<bytes_to_utf8>, this over-writes the original string, and
+updates len to contain the new length.
+Returns zero on failure, setting C<len> to -1.
+
+If you need a copy of the string, see C<bytes_from_utf8>.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ U8* utf8_to_bytes(U8 *s, STRLEN *len)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_to_uvchr
+X<utf8_to_uvchr>
+
+Returns the native character value of the first character in the string C<s>
+which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
+length, in bytes, of that character.
+
+If C<s> does not point to a well-formed UTF-8 character, zero is
+returned and retlen is set, if possible, to -1.
+
+ UV utf8_to_uvchr(const U8 *s, STRLEN *retlen)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_to_uvuni
+X<utf8_to_uvuni>
+
+Returns the Unicode code point of the first character in the string C<s>
+which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
+length, in bytes, of that character.
+
+This function should only be used when the returned UV is considered
+an index into the Unicode semantic tables (e.g. swashes).
+
+If C<s> does not point to a well-formed UTF-8 character, zero is
+returned and retlen is set, if possible, to -1.
+
+ UV utf8_to_uvuni(const U8 *s, STRLEN *retlen)
+
+=for hackers
+Found in file utf8.c
+
+=item uvchr_to_utf8
+X<uvchr_to_utf8>
+
+Adds the UTF-8 representation of the Native codepoint C<uv> to the end
+of the string C<d>; C<d> should be have at least C<UTF8_MAXBYTES+1> free
+bytes available. The return value is the pointer to the byte after the
+end of the new character. In other words,
+
+ d = uvchr_to_utf8(d, uv);
+
+is the recommended wide native character-aware way of saying
+
+ *(d++) = uv;
+
+ U8* uvchr_to_utf8(U8 *d, UV uv)
+
+=for hackers
+Found in file utf8.c
+
+=item uvuni_to_utf8_flags
+X<uvuni_to_utf8_flags>
+
+Adds the UTF-8 representation of the Unicode codepoint C<uv> to the end
+of the string C<d>; C<d> should be have at least C<UTF8_MAXBYTES+1> free
+bytes available. The return value is the pointer to the byte after the
+end of the new character. In other words,
+
+ d = uvuni_to_utf8_flags(d, uv, flags);
+
+or, in most cases,
+
+ d = uvuni_to_utf8(d, uv);
+
+(which is equivalent to)
+
+ d = uvuni_to_utf8_flags(d, uv, 0);
+
+is the recommended Unicode-aware way of saying
+
+ *(d++) = uv;
+
+ U8* uvuni_to_utf8_flags(U8 *d, UV uv, UV flags)
+
+=for hackers
+Found in file utf8.c
+
+
+=back
+
+=head1 Variables created by C<xsubpp> and C<xsubpp> internal functions
+
+=over 8
+
+=item ax
+X<ax>
+
+Variable which is setup by C<xsubpp> to indicate the stack base offset,
+used by the C<ST>, C<XSprePUSH> and C<XSRETURN> macros. The C<dMARK> macro
+must be called prior to setup the C<MARK> variable.
+
+ I32 ax
+
+=for hackers
+Found in file XSUB.h
+
+=item CLASS
+X<CLASS>
+
+Variable which is setup by C<xsubpp> to indicate the
+class name for a C++ XS constructor. This is always a C<char*>. See C<THIS>.
+
+ char* CLASS
+
+=for hackers
+Found in file XSUB.h
+
+=item dAX
+X<dAX>
+
+Sets up the C<ax> variable.
+This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
+
+ dAX;
+
+=for hackers
+Found in file XSUB.h
+
+=item dAXMARK
+X<dAXMARK>
+
+Sets up the C<ax> variable and stack marker variable C<mark>.
+This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
+
+ dAXMARK;
+
+=for hackers
+Found in file XSUB.h
+
+=item dITEMS
+X<dITEMS>
+
+Sets up the C<items> variable.
+This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
+
+ dITEMS;
+
+=for hackers
+Found in file XSUB.h
+
+=item dUNDERBAR
+X<dUNDERBAR>
+
+Sets up the C<padoff_du> variable for an XSUB that wishes to use
+C<UNDERBAR>.
+
+ dUNDERBAR;
+
+=for hackers
+Found in file XSUB.h
+
+=item dXSARGS
+X<dXSARGS>
+
+Sets up stack and mark pointers for an XSUB, calling dSP and dMARK.
+Sets up the C<ax> and C<items> variables by calling C<dAX> and C<dITEMS>.
+This is usually handled automatically by C<xsubpp>.
+
+ dXSARGS;
+
+=for hackers
+Found in file XSUB.h
+
+=item dXSI32
+X<dXSI32>
+
+Sets up the C<ix> variable for an XSUB which has aliases. This is usually
+handled automatically by C<xsubpp>.
+
+ dXSI32;
+
+=for hackers
+Found in file XSUB.h
+
+=item items
+X<items>
+
+Variable which is setup by C<xsubpp> to indicate the number of
+items on the stack. See L<perlxs/"Variable-length Parameter Lists">.
+
+ I32 items
+
+=for hackers
+Found in file XSUB.h
+
+=item ix
+X<ix>
+
+Variable which is setup by C<xsubpp> to indicate which of an
+XSUB's aliases was used to invoke it. See L<perlxs/"The ALIAS: Keyword">.
+
+ I32 ix
+
+=for hackers
+Found in file XSUB.h
+
+=item newXSproto
+X<newXSproto>
+
+Used by C<xsubpp> to hook up XSUBs as Perl subs. Adds Perl prototypes to
+the subs.
+
+=for hackers
+Found in file XSUB.h
+
+=item RETVAL
+X<RETVAL>
+
+Variable which is setup by C<xsubpp> to hold the return value for an
+XSUB. This is always the proper type for the XSUB. See
+L<perlxs/"The RETVAL Variable">.
+
+ (whatever) RETVAL
+
+=for hackers
+Found in file XSUB.h
+
+=item ST
+X<ST>
+
+Used to access elements on the XSUB's stack.
+
+ SV* ST(int ix)
+
+=for hackers
+Found in file XSUB.h
+
+=item THIS
+X<THIS>
+
+Variable which is setup by C<xsubpp> to designate the object in a C++
+XSUB. This is always the proper type for the C++ object. See C<CLASS> and
+L<perlxs/"Using XS With C++">.
+
+ (whatever) THIS
+
+=for hackers
+Found in file XSUB.h
+
+=item UNDERBAR
+X<UNDERBAR>
+
+The SV* corresponding to the $_ variable. Works even if there
+is a lexical $_ in scope.
+
+=for hackers
+Found in file XSUB.h
+
+=item XS
+X<XS>
+
+Macro to declare an XSUB and its C parameter list. This is handled by
+C<xsubpp>.
+
+=for hackers
+Found in file XSUB.h
+
+=item XS_VERSION
+X<XS_VERSION>
+
+The version identifier for an XS module. This is usually
+handled automatically by C<ExtUtils::MakeMaker>. See C<XS_VERSION_BOOTCHECK>.
+
+=for hackers
+Found in file XSUB.h
+
+=item XS_VERSION_BOOTCHECK
+X<XS_VERSION_BOOTCHECK>
+
+Macro to verify that a PM module's $VERSION variable matches the XS
+module's C<XS_VERSION> variable. This is usually handled automatically by
+C<xsubpp>. See L<perlxs/"The VERSIONCHECK: Keyword">.
+
+ XS_VERSION_BOOTCHECK;
+
+=for hackers
+Found in file XSUB.h
+
+
+=back
+
+=head1 Warning and Dieing
+
+=over 8
+
+=item croak
+X<croak>
+
+This is the XSUB-writer's interface to Perl's C<die> function.
+Normally call this function the same way you call the C C<printf>
+function. Calling C<croak> returns control directly to Perl,
+sidestepping the normal C order of execution. See C<warn>.
+
+If you want to throw an exception object, assign the object to
+C<$@> and then pass C<NULL> to croak():
+
+ errsv = get_sv("@", GV_ADD);
+ sv_setsv(errsv, exception_object);
+ croak(NULL);
+
+ void croak(const char* pat, ...)
+
+=for hackers
+Found in file util.c
+
+=item warn
+X<warn>
+
+This is the XSUB-writer's interface to Perl's C<warn> function. Call this
+function the same way you call the C C<printf> function. See C<croak>.
+
+ void warn(const char* pat, ...)
+
+=for hackers
+Found in file util.c
+
+
+=back
+
+=head1 AUTHORS
+
+Until May 1997, this document was maintained by Jeff Okamoto
+<okamoto@corp.hp.com>. It is now maintained as part of Perl itself.
+
+With lots of help and suggestions from Dean Roehrich, Malcolm Beattie,
+Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil
+Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer,
+Stephen McCamant, and Gurusamy Sarathy.
+
+API Listing originally by Dean Roehrich <roehrich@cray.com>.
+
+Updated to be autogenerated from comments in the source by Benjamin Stuhl.
+
+=head1 SEE ALSO
+
+perlguts(1), perlxs(1), perlxstut(1), perlintern(1)
+
+=cut
+
+ ex: set ro:
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlapio.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlapio.pod
new file mode 100755
index 00000000000..1c57f9a9a89
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlapio.pod
@@ -0,0 +1,526 @@
+=head1 NAME
+
+perlapio - perl's IO abstraction interface.
+
+=head1 SYNOPSIS
+
+ #define PERLIO_NOT_STDIO 0 /* For co-existence with stdio only */
+ #include <perlio.h> /* Usually via #include <perl.h> */
+
+ PerlIO *PerlIO_stdin(void);
+ PerlIO *PerlIO_stdout(void);
+ PerlIO *PerlIO_stderr(void);
+
+ PerlIO *PerlIO_open(const char *path,const char *mode);
+ PerlIO *PerlIO_fdopen(int fd, const char *mode);
+ PerlIO *PerlIO_reopen(const char *path, const char *mode, PerlIO *old); /* deprecated */
+ int PerlIO_close(PerlIO *f);
+
+ int PerlIO_stdoutf(const char *fmt,...)
+ int PerlIO_puts(PerlIO *f,const char *string);
+ int PerlIO_putc(PerlIO *f,int ch);
+ int PerlIO_write(PerlIO *f,const void *buf,size_t numbytes);
+ int PerlIO_printf(PerlIO *f, const char *fmt,...);
+ int PerlIO_vprintf(PerlIO *f, const char *fmt, va_list args);
+ int PerlIO_flush(PerlIO *f);
+
+ int PerlIO_eof(PerlIO *f);
+ int PerlIO_error(PerlIO *f);
+ void PerlIO_clearerr(PerlIO *f);
+
+ int PerlIO_getc(PerlIO *d);
+ int PerlIO_ungetc(PerlIO *f,int ch);
+ int PerlIO_read(PerlIO *f, void *buf, size_t numbytes);
+
+ int PerlIO_fileno(PerlIO *f);
+
+ void PerlIO_setlinebuf(PerlIO *f);
+
+ Off_t PerlIO_tell(PerlIO *f);
+ int PerlIO_seek(PerlIO *f, Off_t offset, int whence);
+ void PerlIO_rewind(PerlIO *f);
+
+ int PerlIO_getpos(PerlIO *f, SV *save); /* prototype changed */
+ int PerlIO_setpos(PerlIO *f, SV *saved); /* prototype changed */
+
+ int PerlIO_fast_gets(PerlIO *f);
+ int PerlIO_has_cntptr(PerlIO *f);
+ int PerlIO_get_cnt(PerlIO *f);
+ char *PerlIO_get_ptr(PerlIO *f);
+ void PerlIO_set_ptrcnt(PerlIO *f, char *ptr, int count);
+
+ int PerlIO_canset_cnt(PerlIO *f); /* deprecated */
+ void PerlIO_set_cnt(PerlIO *f, int count); /* deprecated */
+
+ int PerlIO_has_base(PerlIO *f);
+ char *PerlIO_get_base(PerlIO *f);
+ int PerlIO_get_bufsiz(PerlIO *f);
+
+ PerlIO *PerlIO_importFILE(FILE *stdio, const char *mode);
+ FILE *PerlIO_exportFILE(PerlIO *f, int flags);
+ FILE *PerlIO_findFILE(PerlIO *f);
+ void PerlIO_releaseFILE(PerlIO *f,FILE *stdio);
+
+ int PerlIO_apply_layers(PerlIO *f, const char *mode, const char *layers);
+ int PerlIO_binmode(PerlIO *f, int ptype, int imode, const char *layers);
+ void PerlIO_debug(const char *fmt,...)
+
+=head1 DESCRIPTION
+
+Perl's source code, and extensions that want maximum portability,
+should use the above functions instead of those defined in ANSI C's
+I<stdio.h>. The perl headers (in particular "perlio.h") will
+C<#define> them to the I/O mechanism selected at Configure time.
+
+The functions are modeled on those in I<stdio.h>, but parameter order
+has been "tidied up a little".
+
+C<PerlIO *> takes the place of FILE *. Like FILE * it should be
+treated as opaque (it is probably safe to assume it is a pointer to
+something).
+
+There are currently three implementations:
+
+=over 4
+
+=item 1. USE_STDIO
+
+All above are #define'd to stdio functions or are trivial wrapper
+functions which call stdio. In this case I<only> PerlIO * is a FILE *.
+This has been the default implementation since the abstraction was
+introduced in perl5.003_02.
+
+=item 2. USE_SFIO
+
+A "legacy" implementation in terms of the "sfio" library. Used for
+some specialist applications on Unix machines ("sfio" is not widely
+ported away from Unix). Most of above are #define'd to the sfio
+functions. PerlIO * is in this case Sfio_t *.
+
+=item 3. USE_PERLIO
+
+Introduced just after perl5.7.0, this is a re-implementation of the
+above abstraction which allows perl more control over how IO is done
+as it decouples IO from the way the operating system and C library
+choose to do things. For USE_PERLIO PerlIO * has an extra layer of
+indirection - it is a pointer-to-a-pointer. This allows the PerlIO *
+to remain with a known value while swapping the implementation around
+underneath I<at run time>. In this case all the above are true (but
+very simple) functions which call the underlying implementation.
+
+This is the only implementation for which C<PerlIO_apply_layers()>
+does anything "interesting".
+
+The USE_PERLIO implementation is described in L<perliol>.
+
+=back
+
+Because "perlio.h" is a thin layer (for efficiency) the semantics of
+these functions are somewhat dependent on the underlying implementation.
+Where these variations are understood they are noted below.
+
+Unless otherwise noted, functions return 0 on success, or a negative
+value (usually C<EOF> which is usually -1) and set C<errno> on error.
+
+=over 4
+
+=item B<PerlIO_stdin()>, B<PerlIO_stdout()>, B<PerlIO_stderr()>
+
+Use these rather than C<stdin>, C<stdout>, C<stderr>. They are written
+to look like "function calls" rather than variables because this makes
+it easier to I<make them> function calls if platform cannot export data
+to loaded modules, or if (say) different "threads" might have different
+values.
+
+=item B<PerlIO_open(path, mode)>, B<PerlIO_fdopen(fd,mode)>
+
+These correspond to fopen()/fdopen() and the arguments are the same.
+Return C<NULL> and set C<errno> if there is an error. There may be an
+implementation limit on the number of open handles, which may be lower
+than the limit on the number of open files - C<errno> may not be set
+when C<NULL> is returned if this limit is exceeded.
+
+=item B<PerlIO_reopen(path,mode,f)>
+
+While this currently exists in all three implementations perl itself
+does not use it. I<As perl does not use it, it is not well tested.>
+
+Perl prefers to C<dup> the new low-level descriptor to the descriptor
+used by the existing PerlIO. This may become the behaviour of this
+function in the future.
+
+=item B<PerlIO_printf(f,fmt,...)>, B<PerlIO_vprintf(f,fmt,a)>
+
+These are fprintf()/vfprintf() equivalents.
+
+=item B<PerlIO_stdoutf(fmt,...)>
+
+This is printf() equivalent. printf is #defined to this function,
+so it is (currently) legal to use C<printf(fmt,...)> in perl sources.
+
+=item B<PerlIO_read(f,buf,count)>, B<PerlIO_write(f,buf,count)>
+
+These correspond functionally to fread() and fwrite() but the
+arguments and return values are different. The PerlIO_read() and
+PerlIO_write() signatures have been modeled on the more sane low level
+read() and write() functions instead: The "file" argument is passed
+first, there is only one "count", and the return value can distinguish
+between error and C<EOF>.
+
+Returns a byte count if successful (which may be zero or
+positive), returns negative value and sets C<errno> on error.
+Depending on implementation C<errno> may be C<EINTR> if operation was
+interrupted by a signal.
+
+=item B<PerlIO_close(f)>
+
+Depending on implementation C<errno> may be C<EINTR> if operation was
+interrupted by a signal.
+
+=item B<PerlIO_puts(f,s)>, B<PerlIO_putc(f,c)>
+
+These correspond to fputs() and fputc().
+Note that arguments have been revised to have "file" first.
+
+=item B<PerlIO_ungetc(f,c)>
+
+This corresponds to ungetc(). Note that arguments have been revised
+to have "file" first. Arranges that next read operation will return
+the byte B<c>. Despite the implied "character" in the name only
+values in the range 0..0xFF are defined. Returns the byte B<c> on
+success or -1 (C<EOF>) on error. The number of bytes that can be
+"pushed back" may vary, only 1 character is certain, and then only if
+it is the last character that was read from the handle.
+
+=item B<PerlIO_getc(f)>
+
+This corresponds to getc().
+Despite the c in the name only byte range 0..0xFF is supported.
+Returns the character read or -1 (C<EOF>) on error.
+
+=item B<PerlIO_eof(f)>
+
+This corresponds to feof(). Returns a true/false indication of
+whether the handle is at end of file. For terminal devices this may
+or may not be "sticky" depending on the implementation. The flag is
+cleared by PerlIO_seek(), or PerlIO_rewind().
+
+=item B<PerlIO_error(f)>
+
+This corresponds to ferror(). Returns a true/false indication of
+whether there has been an IO error on the handle.
+
+=item B<PerlIO_fileno(f)>
+
+This corresponds to fileno(), note that on some platforms, the meaning
+of "fileno" may not match Unix. Returns -1 if the handle has no open
+descriptor associated with it.
+
+=item B<PerlIO_clearerr(f)>
+
+This corresponds to clearerr(), i.e., clears 'error' and (usually)
+'eof' flags for the "stream". Does not return a value.
+
+=item B<PerlIO_flush(f)>
+
+This corresponds to fflush(). Sends any buffered write data to the
+underlying file. If called with C<NULL> this may flush all open
+streams (or core dump with some USE_STDIO implementations). Calling
+on a handle open for read only, or on which last operation was a read
+of some kind may lead to undefined behaviour on some USE_STDIO
+implementations. The USE_PERLIO (layers) implementation tries to
+behave better: it flushes all open streams when passed C<NULL>, and
+attempts to retain data on read streams either in the buffer or by
+seeking the handle to the current logical position.
+
+=item B<PerlIO_seek(f,offset,whence)>
+
+This corresponds to fseek(). Sends buffered write data to the
+underlying file, or discards any buffered read data, then positions
+the file descriptor as specified by B<offset> and B<whence> (sic).
+This is the correct thing to do when switching between read and write
+on the same handle (see issues with PerlIO_flush() above). Offset is
+of type C<Off_t> which is a perl Configure value which may not be same
+as stdio's C<off_t>.
+
+=item B<PerlIO_tell(f)>
+
+This corresponds to ftell(). Returns the current file position, or
+(Off_t) -1 on error. May just return value system "knows" without
+making a system call or checking the underlying file descriptor (so
+use on shared file descriptors is not safe without a
+PerlIO_seek()). Return value is of type C<Off_t> which is a perl
+Configure value which may not be same as stdio's C<off_t>.
+
+=item B<PerlIO_getpos(f,p)>, B<PerlIO_setpos(f,p)>
+
+These correspond (loosely) to fgetpos() and fsetpos(). Rather than
+stdio's Fpos_t they expect a "Perl Scalar Value" to be passed. What is
+stored there should be considered opaque. The layout of the data may
+vary from handle to handle. When not using stdio or if platform does
+not have the stdio calls then they are implemented in terms of
+PerlIO_tell() and PerlIO_seek().
+
+=item B<PerlIO_rewind(f)>
+
+This corresponds to rewind(). It is usually defined as being
+
+ PerlIO_seek(f,(Off_t)0L, SEEK_SET);
+ PerlIO_clearerr(f);
+
+=item B<PerlIO_tmpfile()>
+
+This corresponds to tmpfile(), i.e., returns an anonymous PerlIO or
+NULL on error. The system will attempt to automatically delete the
+file when closed. On Unix the file is usually C<unlink>-ed just after
+it is created so it does not matter how it gets closed. On other
+systems the file may only be deleted if closed via PerlIO_close()
+and/or the program exits via C<exit>. Depending on the implementation
+there may be "race conditions" which allow other processes access to
+the file, though in general it will be safer in this regard than
+ad. hoc. schemes.
+
+=item B<PerlIO_setlinebuf(f)>
+
+This corresponds to setlinebuf(). Does not return a value. What
+constitutes a "line" is implementation dependent but usually means
+that writing "\n" flushes the buffer. What happens with things like
+"this\nthat" is uncertain. (Perl core uses it I<only> when "dumping";
+it has nothing to do with $| auto-flush.)
+
+=back
+
+=head2 Co-existence with stdio
+
+There is outline support for co-existence of PerlIO with stdio.
+Obviously if PerlIO is implemented in terms of stdio there is no
+problem. However in other cases then mechanisms must exist to create a
+FILE * which can be passed to library code which is going to use stdio
+calls.
+
+The first step is to add this line:
+
+ #define PERLIO_NOT_STDIO 0
+
+I<before> including any perl header files. (This will probably become
+the default at some point). That prevents "perlio.h" from attempting
+to #define stdio functions onto PerlIO functions.
+
+XS code is probably better using "typemap" if it expects FILE *
+arguments. The standard typemap will be adjusted to comprehend any
+changes in this area.
+
+=over 4
+
+=item B<PerlIO_importFILE(f,mode)>
+
+Used to get a PerlIO * from a FILE *.
+
+The mode argument should be a string as would be passed to
+fopen/PerlIO_open. If it is NULL then - for legacy support - the code
+will (depending upon the platform and the implementation) either
+attempt to empirically determine the mode in which I<f> is open, or
+use "r+" to indicate a read/write stream.
+
+Once called the FILE * should I<ONLY> be closed by calling
+C<PerlIO_close()> on the returned PerlIO *.
+
+The PerlIO is set to textmode. Use PerlIO_binmode if this is
+not the desired mode.
+
+This is B<not> the reverse of PerlIO_exportFILE().
+
+=item B<PerlIO_exportFILE(f,mode)>
+
+Given a PerlIO * create a 'native' FILE * suitable for passing to code
+expecting to be compiled and linked with ANSI C I<stdio.h>. The mode
+argument should be a string as would be passed to fopen/PerlIO_open.
+If it is NULL then - for legacy support - the FILE * is opened in same
+mode as the PerlIO *.
+
+The fact that such a FILE * has been 'exported' is recorded, (normally
+by pushing a new :stdio "layer" onto the PerlIO *), which may affect
+future PerlIO operations on the original PerlIO *. You should not
+call C<fclose()> on the file unless you call C<PerlIO_releaseFILE()>
+to disassociate it from the PerlIO *. (Do not use PerlIO_importFILE()
+for doing the disassociation.)
+
+Calling this function repeatedly will create a FILE * on each call
+(and will push an :stdio layer each time as well).
+
+=item B<PerlIO_releaseFILE(p,f)>
+
+Calling PerlIO_releaseFILE informs PerlIO that all use of FILE * is
+complete. It is removed from the list of 'exported' FILE *s, and the
+associated PerlIO * should revert to its original behaviour.
+
+Use this to disassociate a file from a PerlIO * that was associated
+using PerlIO_exportFILE().
+
+=item B<PerlIO_findFILE(f)>
+
+Returns a native FILE * used by a stdio layer. If there is none, it
+will create one with PerlIO_exportFILE. In either case the FILE *
+should be considered as belonging to PerlIO subsystem and should
+only be closed by calling C<PerlIO_close()>.
+
+
+=back
+
+=head2 "Fast gets" Functions
+
+In addition to standard-like API defined so far above there is an
+"implementation" interface which allows perl to get at internals of
+PerlIO. The following calls correspond to the various FILE_xxx macros
+determined by Configure - or their equivalent in other
+implementations. This section is really of interest to only those
+concerned with detailed perl-core behaviour, implementing a PerlIO
+mapping or writing code which can make use of the "read ahead" that
+has been done by the IO system in the same way perl does. Note that
+any code that uses these interfaces must be prepared to do things the
+traditional way if a handle does not support them.
+
+=over 4
+
+=item B<PerlIO_fast_gets(f)>
+
+Returns true if implementation has all the interfaces required to
+allow perl's C<sv_gets> to "bypass" normal IO mechanism. This can
+vary from handle to handle.
+
+ PerlIO_fast_gets(f) = PerlIO_has_cntptr(f) && \
+ PerlIO_canset_cnt(f) && \
+ `Can set pointer into buffer'
+
+
+=item B<PerlIO_has_cntptr(f)>
+
+Implementation can return pointer to current position in the "buffer"
+and a count of bytes available in the buffer. Do not use this - use
+PerlIO_fast_gets.
+
+=item B<PerlIO_get_cnt(f)>
+
+Return count of readable bytes in the buffer. Zero or negative return
+means no more bytes available.
+
+=item B<PerlIO_get_ptr(f)>
+
+Return pointer to next readable byte in buffer, accessing via the
+pointer (dereferencing) is only safe if PerlIO_get_cnt() has returned
+a positive value. Only positive offsets up to value returned by
+PerlIO_get_cnt() are allowed.
+
+=item B<PerlIO_set_ptrcnt(f,p,c)>
+
+Set pointer into buffer, and a count of bytes still in the
+buffer. Should be used only to set pointer to within range implied by
+previous calls to C<PerlIO_get_ptr> and C<PerlIO_get_cnt>. The two
+values I<must> be consistent with each other (implementation may only
+use one or the other or may require both).
+
+=item B<PerlIO_canset_cnt(f)>
+
+Implementation can adjust its idea of number of bytes in the buffer.
+Do not use this - use PerlIO_fast_gets.
+
+=item B<PerlIO_set_cnt(f,c)>
+
+Obscure - set count of bytes in the buffer. Deprecated. Only usable
+if PerlIO_canset_cnt() returns true. Currently used in only doio.c to
+force count less than -1 to -1. Perhaps should be PerlIO_set_empty or
+similar. This call may actually do nothing if "count" is deduced from
+pointer and a "limit". Do not use this - use PerlIO_set_ptrcnt().
+
+=item B<PerlIO_has_base(f)>
+
+Returns true if implementation has a buffer, and can return pointer
+to whole buffer and its size. Used by perl for B<-T> / B<-B> tests.
+Other uses would be very obscure...
+
+=item B<PerlIO_get_base(f)>
+
+Return I<start> of buffer. Access only positive offsets in the buffer
+up to the value returned by PerlIO_get_bufsiz().
+
+=item B<PerlIO_get_bufsiz(f)>
+
+Return the I<total number of bytes> in the buffer, this is neither the
+number that can be read, nor the amount of memory allocated to the
+buffer. Rather it is what the operating system and/or implementation
+happened to C<read()> (or whatever) last time IO was requested.
+
+=back
+
+=head2 Other Functions
+
+=over 4
+
+=item PerlIO_apply_layers(f,mode,layers)
+
+The new interface to the USE_PERLIO implementation. The layers ":crlf"
+and ":raw" are only ones allowed for other implementations and those
+are silently ignored. (As of perl5.8 ":raw" is deprecated.) Use
+PerlIO_binmode() below for the portable case.
+
+=item PerlIO_binmode(f,ptype,imode,layers)
+
+The hook used by perl's C<binmode> operator.
+B<ptype> is perl's character for the kind of IO:
+
+=over 8
+
+=item 'E<lt>' read
+
+=item 'E<gt>' write
+
+=item '+' read/write
+
+=back
+
+B<imode> is C<O_BINARY> or C<O_TEXT>.
+
+B<layers> is a string of layers to apply, only ":crlf" makes sense in
+the non USE_PERLIO case. (As of perl5.8 ":raw" is deprecated in favour
+of passing NULL.)
+
+Portable cases are:
+
+ PerlIO_binmode(f,ptype,O_BINARY,NULL);
+and
+ PerlIO_binmode(f,ptype,O_TEXT,":crlf");
+
+On Unix these calls probably have no effect whatsoever. Elsewhere
+they alter "\n" to CR,LF translation and possibly cause a special text
+"end of file" indicator to be written or honoured on read. The effect
+of making the call after doing any IO to the handle depends on the
+implementation. (It may be ignored, affect any data which is already
+buffered as well, or only apply to subsequent data.)
+
+=item PerlIO_debug(fmt,...)
+
+PerlIO_debug is a printf()-like function which can be used for
+debugging. No return value. Its main use is inside PerlIO where using
+real printf, warn() etc. would recursively call PerlIO and be a
+problem.
+
+PerlIO_debug writes to the file named by $ENV{'PERLIO_DEBUG'} typical
+use might be
+
+ Bourne shells (sh, ksh, bash, zsh, ash, ...):
+ PERLIO_DEBUG=/dev/tty ./perl somescript some args
+
+ Csh/Tcsh:
+ setenv PERLIO_DEBUG /dev/tty
+ ./perl somescript some args
+
+ If you have the "env" utility:
+ env PERLIO_DEBUG=/dev/tty ./perl somescript some args
+
+ Win32:
+ set PERLIO_DEBUG=CON
+ perl somescript some args
+
+If $ENV{'PERLIO_DEBUG'} is not set PerlIO_debug() is a no-op.
+
+=back
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlapollo.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlapollo.pod
new file mode 100755
index 00000000000..cc12e6a5cd6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlapollo.pod
@@ -0,0 +1,23 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.apollo - Perl version 5 on Apollo DomainOS
+
+=head1 DESCRIPTION
+
+The following tests are known to fail as of Perl 5.005_03:
+
+comp/decl..........FAILED at test 0
+op/write...........FAILED at test 0
+lib/filefind.......FAILED at test 2
+lib/io_udp.........FAILED at test 2
+lib/findbin........stat(/ressel/ABT/USER/vta/jk/proj.local/perl/perl5.005_03-MAINT_TRIAL_5/t/lib/): No such file or directory at ../lib/FindBin.pm line 162
+stat(/ressel/ABT/USER/vta/jk/proj.local/perl/perl5.005_03-MAINT_TRIAL_5/t/lib/): No such file or directory at ../lib/FindBin.pm line 163
+FAILED at test 1
+
+=head1 AUTHOR
+
+Johann Klasek <jk@auto.tuwien.ac.at>
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlartistic.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlartistic.pod
new file mode 100755
index 00000000000..82f3b689b96
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlartistic.pod
@@ -0,0 +1,217 @@
+
+=head1 NAME
+
+perlartistic - the Perl Artistic License
+
+=head1 SYNOPSIS
+
+ You can refer to this document in Pod via "L<perlartistic>"
+ Or you can see this document by entering "perldoc perlartistic"
+
+=head1 DESCRIPTION
+
+This is B<"The Artistic License">. It's here so that modules,
+programs, etc., that want to declare this as their distribution
+license, can link to it.
+
+It is also one of the two licenses Perl allows itself to be
+redistributed and/or modified; for the other one, the GNU General
+Public License, see the L<perlgpl>.
+
+=head1 The "Artistic License"
+
+=head2 Preamble
+
+The intent of this document is to state the conditions under which a
+Package may be copied, such that the Copyright Holder maintains some
+semblance of artistic control over the development of the package,
+while giving the users of the package the right to use and distribute
+the Package in a more-or-less customary fashion, plus the right to make
+reasonable modifications.
+
+=head2 Definitions
+
+=over
+
+=item "Package"
+
+refers to the collection of files distributed by the
+Copyright Holder, and derivatives of that collection of files created
+through textual modification.
+
+=item "Standard Version"
+
+refers to such a Package if it has not been
+modified, or has been modified in accordance with the wishes of the
+Copyright Holder as specified below.
+
+=item "Copyright Holder"
+
+is whoever is named in the copyright or
+copyrights for the package.
+
+=item "You"
+
+is you, if you're thinking about copying or distributing this Package.
+
+=item "Reasonable copying fee"
+
+is whatever you can justify on the basis
+of media cost, duplication charges, time of people involved, and so on.
+(You will not be required to justify it to the Copyright Holder, but
+only to the computing community at large as a market that must bear the
+fee.)
+
+=item "Freely Available"
+
+means that no fee is charged for the item
+itself, though there may be fees involved in handling the item. It also
+means that recipients of the item may redistribute it under the same
+conditions they received it.
+
+=back
+
+=head2 Conditions
+
+=over
+
+=item 1.
+
+You may make and give away verbatim copies of the source form of the
+Standard Version of this Package without restriction, provided that you
+duplicate all of the original copyright notices and associated disclaimers.
+
+=item 2.
+
+You may apply bug fixes, portability fixes and other modifications
+derived from the Public Domain or from the Copyright Holder. A Package
+modified in such a way shall still be considered the Standard Version.
+
+=item 3.
+
+You may otherwise modify your copy of this Package in any way, provided
+that you insert a prominent notice in each changed file stating how and
+when you changed that file, and provided that you do at least ONE of the
+following:
+
+=over
+
+=item a)
+
+place your modifications in the Public Domain or otherwise make them
+Freely Available, such as by posting said modifications to Usenet or an
+equivalent medium, or placing the modifications on a major archive site
+such as uunet.uu.net, or by allowing the Copyright Holder to include
+your modifications in the Standard Version of the Package.
+
+=item b)
+
+use the modified Package only within your corporation or organization.
+
+=item c)
+
+rename any non-standard executables so the names do not conflict with
+standard executables, which must also be provided, and provide a
+separate manual page for each non-standard executable that clearly
+documents how it differs from the Standard Version.
+
+=item d)
+
+make other distribution arrangements with the Copyright Holder.
+
+=back
+
+=item 4.
+
+You may distribute the programs of this Package in object code or
+executable form, provided that you do at least ONE of the following:
+
+=over
+
+=item a)
+
+distribute a Standard Version of the executables and library files,
+together with instructions (in the manual page or equivalent) on where
+to get the Standard Version.
+
+=item b)
+
+accompany the distribution with the machine-readable source of the
+Package with your modifications.
+
+=item c)
+
+give non-standard executables non-standard names, and clearly
+document the differences in manual pages (or equivalent), together with
+instructions on where to get the Standard Version.
+
+=item d)
+
+make other distribution arrangements with the Copyright Holder.
+
+=back
+
+=item 5.
+
+You may charge a reasonable copying fee for any distribution of this
+Package. You may charge any fee you choose for support of this
+Package. You may not charge a fee for this Package itself. However,
+you may distribute this Package in aggregate with other (possibly
+commercial) programs as part of a larger (possibly commercial) software
+distribution provided that you do not advertise this Package as a
+product of your own. You may embed this Package's interpreter within
+an executable of yours (by linking); this shall be construed as a mere
+form of aggregation, provided that the complete Standard Version of the
+interpreter is so embedded.
+
+=item 6.
+
+The scripts and library files supplied as input to or produced as
+output from the programs of this Package do not automatically fall
+under the copyright of this Package, but belong to whoever generated
+them, and may be sold commercially, and may be aggregated with this
+Package. If such scripts or library files are aggregated with this
+Package via the so-called "undump" or "unexec" methods of producing a
+binary executable image, then distribution of such an image shall
+neither be construed as a distribution of this Package nor shall it
+fall under the restrictions of Paragraphs 3 and 4, provided that you do
+not represent such an executable image as a Standard Version of this
+Package.
+
+=item 7.
+
+C subroutines (or comparably compiled subroutines in other
+languages) supplied by you and linked into this Package in order to
+emulate subroutines and variables of the language defined by this
+Package shall not be considered part of this Package, but are the
+equivalent of input as in Paragraph 6, provided these subroutines do
+not change the language in any way that would cause it to fail the
+regression tests for the language.
+
+=item 8.
+
+Aggregation of this Package with a commercial distribution is always
+permitted provided that the use of this Package is embedded; that is,
+when no overt attempt is made to make this Package's interfaces visible
+to the end user of the commercial distribution. Such use shall not be
+construed as a distribution of this Package.
+
+=item 9.
+
+The name of the Copyright Holder may not be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+
+=item 10.
+
+THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+=back
+
+The End
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlbeos.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlbeos.pod
new file mode 100755
index 00000000000..0a01f50b9ee
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlbeos.pod
@@ -0,0 +1,109 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.beos - Perl version 5.8+ on BeOS
+
+=head1 DESCRIPTION
+
+This file contains instructions how to build Perl under BeOS and lists
+known problems.
+
+=head1 BUILD AND INSTALL
+
+=head2 Requirements
+
+I have built and tested Perl 5.8.6 and 5.9.1 under BeOS R5 x86 net server.
+I can't say anything with regard to PPC. Since Perl 5.8.0 had been released
+for BeOS BONE, I suspect, there is a good chance, that it still compiles on
+a BONE system. The only change I've made, that affects BONE systems is the
+recognition of whether it is a BONE system or not in C<hints/beos.sh>. Now
+network socket support should remain enabled on BONE systems. This might
+as well break the build, though.
+
+As more recent versions of autoconf require flock() support, I wrote a flock()
+emulation (flock_server) and released it on BeBits:
+
+ http://www.bebits.com/app/4030
+
+If you want to build a Perl with flock() support, you have to install this
+package first.
+
+=head2 Configure
+
+With flock() support:
+
+ CFLAGS=-I/path/to/flock/server/headers ./configure.gnu \
+ --prefix=/boot/home/config
+
+Replace C</path/to/flock/server/headers> with the path to the directory
+containing the C<flock.h> header.
+
+Without flock() support:
+
+ ./configure.gnu --prefix=/boot/home/config
+
+=head2 Build
+
+With flock() support:
+
+ make LDLOADLIBS="-lnet -lflock"
+
+Without flock() support:
+
+ make LDLOADLIBS="-lnet"
+
+C<-lnet> is needed on net server systems only and if the compiler doesn't
+add it automatically (Be's R5 gcc does, Oliver Tappe's gcc 2.95.3 does not).
+
+=head2 Install
+
+Install all perl files:
+
+ make install
+
+Create a symlink for libperl:
+
+ cd ~/config/lib; ln -s perl5/5.8.6/BePC-beos/CORE/libperl.so .
+
+Replace C<5.8.6> with your respective version of Perl.
+
+=head1 KNOWN PROBLEMS
+
+=over 4
+
+=item *
+
+Network socket support is disabled for BeOS R5 net server. I didn't dare yet
+to try enabling it and see what problems occur.
+
+=item *
+
+The LFS (large file support) tests (C<t/op/lfs> and C<xt/Fcntl/t/syslfs>) are
+disabled as seeking beyond 2 GB is broken according to jhi@iki.fi who was the
+last one checking the BeOS port and updating this file before me. Haven't
+checked this myself.
+
+=item *
+
+The C<t/io/fflush> test fails at #6. As far as I can tell, this is caused by
+a bug in the BeOS pipes implementation that occurs when starting other child
+processes. In the particular test case a C<system("perl -e 0")> flushes the
+stdout pipe of another child process.
+
+=item *
+
+The C<ext/POSIX/t/waitpid> test fails at #1. After all child processes are
+gone BeOS' waitpid(-1,...) returns 0 instead of -1 (as it should). No idea
+how to fix this.
+
+=back
+
+=head1 CONTACT
+
+For BeOS specifics problems feel free to mail to:
+Ingo Weinhold <bonefish@cs.tu-berlin.de>
+
+Last update: 2004-12-16
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlbook.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlbook.pod
new file mode 100755
index 00000000000..b48379f5644
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlbook.pod
@@ -0,0 +1,17 @@
+=head1 NAME
+
+perlbook - Perl book information
+
+=head1 DESCRIPTION
+
+The Camel Book, officially known as I<Programming Perl, Third Edition>,
+by Larry Wall et al, is the definitive reference work covering nearly
+all of Perl. You can order it and other Perl books from O'Reilly &
+Associates, 1-800-998-9938. Local/overseas is +1 707 829 0515. If you
+can locate an O'Reilly order form, you can also fax to +1 707 829 0104.
+If you're web-connected, you can even mosey on over to
+L<http://www.oreilly.com/> for an online order form.
+
+Other Perl books from various publishers and authors
+can be found listed in L<perlfaq2> or on the web at
+L<http://books.perl.org/>.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlboot.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlboot.pod
new file mode 100755
index 00000000000..cf8e51843ae
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlboot.pod
@@ -0,0 +1,884 @@
+=head1 NAME
+
+perlboot - Beginner's Object-Oriented Tutorial
+
+=head1 DESCRIPTION
+
+If you're not familiar with objects from other languages, some of the
+other Perl object documentation may be a little daunting, such as
+L<perlobj>, a basic reference in using objects, and L<perltoot>, which
+introduces readers to the peculiarities of Perl's object system in a
+tutorial way.
+
+So, let's take a different approach, presuming no prior object
+experience. It helps if you know about subroutines (L<perlsub>),
+references (L<perlref> et. seq.), and packages (L<perlmod>), so become
+familiar with those first if you haven't already.
+
+=head2 If we could talk to the animals...
+
+Let's let the animals talk for a moment:
+
+ sub Cow::speak {
+ print "a Cow goes moooo!\n";
+ }
+ sub Horse::speak {
+ print "a Horse goes neigh!\n";
+ }
+ sub Sheep::speak {
+ print "a Sheep goes baaaah!\n";
+ }
+
+ Cow::speak;
+ Horse::speak;
+ Sheep::speak;
+
+This results in:
+
+ a Cow goes moooo!
+ a Horse goes neigh!
+ a Sheep goes baaaah!
+
+Nothing spectacular here. Simple subroutines, albeit from separate
+packages, and called using the full package name. So let's create
+an entire pasture:
+
+ # Cow::speak, Horse::speak, Sheep::speak as before
+ @pasture = qw(Cow Cow Horse Sheep Sheep);
+ foreach $animal (@pasture) {
+ &{$animal."::speak"};
+ }
+
+This results in:
+
+ a Cow goes moooo!
+ a Cow goes moooo!
+ a Horse goes neigh!
+ a Sheep goes baaaah!
+ a Sheep goes baaaah!
+
+Wow. That symbolic coderef de-referencing there is pretty nasty.
+We're counting on C<no strict refs> mode, certainly not recommended
+for larger programs. And why was that necessary? Because the name of
+the package seems to be inseparable from the name of the subroutine we
+want to invoke within that package.
+
+Or is it?
+
+=head2 Introducing the method invocation arrow
+
+For now, let's say that C<< Class->method >> invokes subroutine
+C<method> in package C<Class>. (Here, "Class" is used in its
+"category" meaning, not its "scholastic" meaning.) That's not
+completely accurate, but we'll do this one step at a time. Now let's
+use it like so:
+
+ # Cow::speak, Horse::speak, Sheep::speak as before
+ Cow->speak;
+ Horse->speak;
+ Sheep->speak;
+
+And once again, this results in:
+
+ a Cow goes moooo!
+ a Horse goes neigh!
+ a Sheep goes baaaah!
+
+That's not fun yet. Same number of characters, all constant, no
+variables. But yet, the parts are separable now. Watch:
+
+ $a = "Cow";
+ $a->speak; # invokes Cow->speak
+
+Ahh! Now that the package name has been parted from the subroutine
+name, we can use a variable package name. And this time, we've got
+something that works even when C<use strict refs> is enabled.
+
+=head2 Invoking a barnyard
+
+Let's take that new arrow invocation and put it back in the barnyard
+example:
+
+ sub Cow::speak {
+ print "a Cow goes moooo!\n";
+ }
+ sub Horse::speak {
+ print "a Horse goes neigh!\n";
+ }
+ sub Sheep::speak {
+ print "a Sheep goes baaaah!\n";
+ }
+
+ @pasture = qw(Cow Cow Horse Sheep Sheep);
+ foreach $animal (@pasture) {
+ $animal->speak;
+ }
+
+There! Now we have the animals all talking, and safely at that,
+without the use of symbolic coderefs.
+
+But look at all that common code. Each of the C<speak> routines has a
+similar structure: a C<print> operator and a string that contains
+common text, except for two of the words. It'd be nice if we could
+factor out the commonality, in case we decide later to change it all
+to C<says> instead of C<goes>.
+
+And we actually have a way of doing that without much fuss, but we
+have to hear a bit more about what the method invocation arrow is
+actually doing for us.
+
+=head2 The extra parameter of method invocation
+
+The invocation of:
+
+ Class->method(@args)
+
+attempts to invoke subroutine C<Class::method> as:
+
+ Class::method("Class", @args);
+
+(If the subroutine can't be found, "inheritance" kicks in, but we'll
+get to that later.) This means that we get the class name as the
+first parameter (the only parameter, if no arguments are given). So
+we can rewrite the C<Sheep> speaking subroutine as:
+
+ sub Sheep::speak {
+ my $class = shift;
+ print "a $class goes baaaah!\n";
+ }
+
+And the other two animals come out similarly:
+
+ sub Cow::speak {
+ my $class = shift;
+ print "a $class goes moooo!\n";
+ }
+ sub Horse::speak {
+ my $class = shift;
+ print "a $class goes neigh!\n";
+ }
+
+In each case, C<$class> will get the value appropriate for that
+subroutine. But once again, we have a lot of similar structure. Can
+we factor that out even further? Yes, by calling another method in
+the same class.
+
+=head2 Calling a second method to simplify things
+
+Let's call out from C<speak> to a helper method called C<sound>.
+This method provides the constant text for the sound itself.
+
+ { package Cow;
+ sub sound { "moooo" }
+ sub speak {
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n";
+ }
+ }
+
+Now, when we call C<< Cow->speak >>, we get a C<$class> of C<Cow> in
+C<speak>. This in turn selects the C<< Cow->sound >> method, which
+returns C<moooo>. But how different would this be for the C<Horse>?
+
+ { package Horse;
+ sub sound { "neigh" }
+ sub speak {
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n";
+ }
+ }
+
+Only the name of the package and the specific sound change. So can we
+somehow share the definition for C<speak> between the Cow and the
+Horse? Yes, with inheritance!
+
+=head2 Inheriting the windpipes
+
+We'll define a common subroutine package called C<Animal>, with the
+definition for C<speak>:
+
+ { package Animal;
+ sub speak {
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n";
+ }
+ }
+
+Then, for each animal, we say it "inherits" from C<Animal>, along
+with the animal-specific sound:
+
+ { package Cow;
+ @ISA = qw(Animal);
+ sub sound { "moooo" }
+ }
+
+Note the added C<@ISA> array (pronounced "is a"). We'll get to that in a minute.
+
+But what happens when we invoke C<< Cow->speak >> now?
+
+First, Perl constructs the argument list. In this case, it's just
+C<Cow>. Then Perl looks for C<Cow::speak>. But that's not there, so
+Perl checks for the inheritance array C<@Cow::ISA>. It's there,
+and contains the single name C<Animal>.
+
+Perl next checks for C<speak> inside C<Animal> instead, as in
+C<Animal::speak>. And that's found, so Perl invokes that subroutine
+with the already frozen argument list.
+
+Inside the C<Animal::speak> subroutine, C<$class> becomes C<Cow> (the
+first argument). So when we get to the step of invoking
+C<< $class->sound >>, it'll be looking for C<< Cow->sound >>, which
+gets it on the first try without looking at C<@ISA>. Success!
+
+=head2 A few notes about @ISA
+
+This magical C<@ISA> variable has declared that C<Cow> "is a" C<Animal>.
+Note that it's an array, not a simple single value, because on rare
+occasions, it makes sense to have more than one parent class searched
+for the missing methods.
+
+If C<Animal> also had an C<@ISA>, then we'd check there too. The
+search is recursive, depth-first, left-to-right in each C<@ISA> by
+default (see L<mro> for alternatives). Typically, each C<@ISA> has
+only one element (multiple elements means multiple inheritance and
+multiple headaches), so we get a nice tree of inheritance.
+
+When we turn on C<use strict>, we'll get complaints on C<@ISA>, since
+it's not a variable containing an explicit package name, nor is it a
+lexical ("my") variable. We can't make it a lexical variable though
+(it has to belong to the package to be found by the inheritance mechanism),
+so there's a couple of straightforward ways to handle that.
+
+The easiest is to just spell the package name out:
+
+ @Cow::ISA = qw(Animal);
+
+Or declare it as package global variable:
+
+ package Cow;
+ our @ISA = qw(Animal);
+
+Or allow it as an implicitly named package variable:
+
+ package Cow;
+ use vars qw(@ISA);
+ @ISA = qw(Animal);
+
+If the C<Animal> class comes from another (object-oriented) module, then
+just employ C<use base> to specify that C<Animal> should serve as the basis
+for the C<Cow> class:
+
+ package Cow;
+ use base qw(Animal);
+
+Now that's pretty darn simple!
+
+=head2 Overriding the methods
+
+Let's add a mouse, which can barely be heard:
+
+ # Animal package from before
+ { package Mouse;
+ @ISA = qw(Animal);
+ sub sound { "squeak" }
+ sub speak {
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n";
+ print "[but you can barely hear it!]\n";
+ }
+ }
+
+ Mouse->speak;
+
+which results in:
+
+ a Mouse goes squeak!
+ [but you can barely hear it!]
+
+Here, C<Mouse> has its own speaking routine, so C<< Mouse->speak >>
+doesn't immediately invoke C<< Animal->speak >>. This is known as
+"overriding". In fact, we don't even need to say that a C<Mouse> is
+an C<Animal> at all, because all of the methods needed for C<speak> are
+completely defined for C<Mouse>; this is known as "duck typing":
+"If it walks like a duck and quacks like a duck, I would call it a duck"
+(James Whitcomb). However, it would probably be beneficial to allow a
+closer examination to conclude that a C<Mouse> is indeed an C<Animal>,
+so it is actually better to define C<Mouse> with C<Animal> as its base
+(that is, it is better to "derive C<Mouse> from C<Animal>").
+
+Moreover, this duplication of code could become a maintenance headache
+(though code-reuse is not actually a good reason for inheritance; good
+design practices dictate that a derived class should be usable wherever
+its base class is usable, which might not be the outcome if code-reuse
+is the sole criterion for inheritance. Just remember that a C<Mouse>
+should always act like an C<Animal>).
+
+So, let's make C<Mouse> an C<Animal>!
+
+The obvious solution is to invoke C<Animal::speak> directly:
+
+ # Animal package from before
+ { package Mouse;
+ @ISA = qw(Animal);
+ sub sound { "squeak" }
+ sub speak {
+ my $class = shift;
+ Animal::speak($class);
+ print "[but you can barely hear it!]\n";
+ }
+ }
+
+Note that we're using C<Animal::speak>. If we were to invoke
+C<< Animal->speak >> instead, the first parameter to C<Animal::speak>
+would automatically be C<"Animal"> rather than C<"Mouse">, so that
+the call to C<< $class->sound >> in C<Animal::speak> would become
+C<< Animal->sound >> rather than C<< Mouse->sound >>.
+
+Also, without the method arrow C<< -> >>, it becomes necessary to specify
+the first parameter to C<Animal::speak> ourselves, which is why C<$class>
+is explicitly passed: C<Animal::speak($class)>.
+
+However, invoking C<Animal::speak> directly is a mess: Firstly, it assumes
+that the C<speak> method is a member of the C<Animal> class; what if C<Animal>
+actually inherits C<speak> from its own base? Because we are no longer using
+C<< -> >> to access C<speak>, the special method look up mechanism wouldn't be
+used, so C<speak> wouldn't even be found!
+
+The second problem is more subtle: C<Animal> is now hardwired into the subroutine
+selection. Let's assume that C<Animal::speak> does exist. What happens when,
+at a later time, someone expands the class hierarchy by having C<Mouse>
+inherit from C<Mus> instead of C<Animal>. Unless the invocation of C<Animal::speak>
+is also changed to an invocation of C<Mus::speak>, centuries worth of taxonomical
+classification could be obliterated!
+
+What we have here is a fragile or leaky abstraction; it is the beginning of a
+maintenance nightmare. What we need is the ability to search for the right
+method wih as few assumptions as possible.
+
+=head2 Starting the search from a different place
+
+A I<better> solution is to tell Perl where in the inheritance chain to begin searching
+for C<speak>. This can be achieved with a modified version of the method arrow C<< -> >>:
+
+ ClassName->FirstPlaceToLook::method
+
+So, the improved C<Mouse> class is:
+
+ # same Animal as before
+ { package Mouse;
+ # same @ISA, &sound as before
+ sub speak {
+ my $class = shift;
+ $class->Animal::speak;
+ print "[but you can barely hear it!]\n";
+ }
+ }
+
+Using this syntax, we start with C<Animal> to find C<speak>, and then
+use all of C<Animal>'s inheritance chain if it is not found immediately.
+As usual, the first parameter to C<speak> would be C<$class>, so we no
+longer need to pass C<$class> explicitly to C<speak>.
+
+But what about the second problem? We're still hardwiring C<Animal> into
+the method lookup.
+
+=head2 The SUPER way of doing things
+
+If C<Animal> is replaced with the special placeholder C<SUPER> in that
+invocation, then the contents of C<Mouse>'s C<@ISA> are used for the
+search, beginning with C<$ISA[0]>. So, all of the problems can be fixed
+as follows:
+
+ # same Animal as before
+ { package Mouse;
+ # same @ISA, &sound as before
+ sub speak {
+ my $class = shift;
+ $class->SUPER::speak;
+ print "[but you can barely hear it!]\n";
+ }
+ }
+
+In general, C<SUPER::speak> means look in the current package's C<@ISA>
+for a class that implements C<speak>, and invoke the first one found.
+The placeholder is called C<SUPER>, because many other languages refer
+to base classes as "I<super>classes", and Perl likes to be eclectic.
+
+Note that a call such as
+
+ $class->SUPER::method;
+
+does I<not> look in the C<@ISA> of C<$class> unless C<$class> happens to
+be the current package.
+
+=head2 Let's review...
+
+So far, we've seen the method arrow syntax:
+
+ Class->method(@args);
+
+or the equivalent:
+
+ $a = "Class";
+ $a->method(@args);
+
+which constructs an argument list of:
+
+ ("Class", @args)
+
+and attempts to invoke:
+
+ Class::method("Class", @args);
+
+However, if C<Class::method> is not found, then C<@Class::ISA> is examined
+(recursively) to locate a class (a package) that does indeed contain C<method>,
+and that subroutine is invoked instead.
+
+Using this simple syntax, we have class methods, (multiple) inheritance,
+overriding, and extending. Using just what we've seen so far, we've
+been able to factor out common code (though that's never a good reason
+for inheritance!), and provide a nice way to reuse implementations with
+variations.
+
+Now, what about data?
+
+=head2 A horse is a horse, of course of course -- or is it?
+
+Let's start with the code for the C<Animal> class
+and the C<Horse> class:
+
+ { package Animal;
+ sub speak {
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n";
+ }
+ }
+ { package Horse;
+ @ISA = qw(Animal);
+ sub sound { "neigh" }
+ }
+
+This lets us invoke C<< Horse->speak >> to ripple upward to
+C<Animal::speak>, calling back to C<Horse::sound> to get the specific
+sound, and the output of:
+
+ a Horse goes neigh!
+
+But all of our Horse objects would have to be absolutely identical.
+If we add a subroutine, all horses automatically share it. That's
+great for making horses the same, but how do we capture the
+distinctions of an individual horse? For example, suppose we want
+to give our first horse a name. There's got to be a way to keep its
+name separate from the other horses.
+
+That is to say, we want particular instances of C<Horse> to have
+different names.
+
+In Perl, any reference can be an "instance", so let's start with the
+simplest reference that can hold a horse's name: a scalar reference.
+
+ my $name = "Mr. Ed";
+ my $horse = \$name;
+
+So, now C<$horse> is a reference to what will be the instance-specific
+data (the name). The final step is to turn this reference into a real
+instance of a C<Horse> by using the special operator C<bless>:
+
+ bless $horse, Horse;
+
+This operator stores information about the package named C<Horse> into
+the thing pointed at by the reference. At this point, we say
+C<$horse> is an instance of C<Horse>. That is, it's a specific
+horse. The reference is otherwise unchanged, and can still be used
+with traditional dereferencing operators.
+
+=head2 Invoking an instance method
+
+The method arrow can be used on instances, as well as classes (the names
+of packages). So, let's get the sound that C<$horse> makes:
+
+ my $noise = $horse->sound("some", "unnecessary", "args");
+
+To invoke C<sound>, Perl first notes that C<$horse> is a blessed
+reference (and thus an instance). It then constructs an argument
+list, as per usual.
+
+Now for the fun part: Perl takes the class in which the instance was
+blessed, in this case C<Horse>, and uses that class to locate the
+subroutine. In this case, C<Horse::sound> is found directly (without
+using inheritance). In the end, it is as though our initial line were
+written as follows:
+
+ my $noise = Horse::sound($horse, "some", "unnecessary", "args");
+
+Note that the first parameter here is still the instance, not the name
+of the class as before. We'll get C<neigh> as the return value, and
+that'll end up as the C<$noise> variable above.
+
+If Horse::sound had not been found, we'd be wandering up the C<@Horse::ISA>
+array, trying to find the method in one of the superclasses. The only
+difference between a class method and an instance method is whether the
+first parameter is an instance (a blessed reference) or a class name (a
+string).
+
+=head2 Accessing the instance data
+
+Because we get the instance as the first parameter, we can now access
+the instance-specific data. In this case, let's add a way to get at
+the name:
+
+ { package Horse;
+ @ISA = qw(Animal);
+ sub sound { "neigh" }
+ sub name {
+ my $self = shift;
+ $$self;
+ }
+ }
+
+Inside C<Horse::name>, the C<@_> array contains:
+
+ ($horse, "some", "unnecessary", "args")
+
+so the C<shift> stores C<$horse> into C<$self>. Then, C<$self> gets
+de-referenced with C<$$self> as normal, yielding C<"Mr. Ed">.
+
+It's traditional to C<shift> the first parameter into a variable named
+C<$self> for instance methods and into a variable named C<$class> for
+class methods.
+
+Then, the following line:
+
+ print $horse->name, " says ", $horse->sound, "\n";
+
+outputs:
+
+ Mr. Ed says neigh.
+
+=head2 How to build a horse
+
+Of course, if we constructed all of our horses by hand, we'd most
+likely make mistakes from time to time. We're also violating one of
+the properties of object-oriented programming, in that the "inside
+guts" of a Horse are visible. That's good if you're a veterinarian,
+but not if you just like to own horses. So, let's have the Horse
+class handle the details inside a class method:
+
+ { package Horse;
+ @ISA = qw(Animal);
+ sub sound { "neigh" }
+ sub name {
+ my $self = shift; # instance method, so use $self
+ $$self;
+ }
+ sub named {
+ my $class = shift; # class method, so use $class
+ my $name = shift;
+ bless \$name, $class;
+ }
+ }
+
+Now with the new C<named> method, we can build a horse as follows:
+
+ my $horse = Horse->named("Mr. Ed");
+
+Notice we're back to a class method, so the two arguments to
+C<Horse::named> are C<Horse> and C<Mr. Ed>. The C<bless> operator
+not only blesses C<\$name>, it also returns that reference.
+
+This C<Horse::named> method is called a "constructor".
+
+We've called the constructor C<named> here, so that it quickly denotes
+the constructor's argument as the name for this particular C<Horse>.
+You can use different constructors with different names for different
+ways of "giving birth" to the object (like maybe recording its
+pedigree or date of birth). However, you'll find that most people
+coming to Perl from more limited languages use a single constructor
+named C<new>, with various ways of interpreting the arguments to
+C<new>. Either style is fine, as long as you document your particular
+way of giving birth to an object. (And you I<were> going to do that,
+right?)
+
+=head2 Inheriting the constructor
+
+But was there anything specific to C<Horse> in that method? No. Therefore,
+it's also the same recipe for building anything else that inherited from
+C<Animal>, so let's put C<name> and C<named> there:
+
+ { package Animal;
+ sub speak {
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n";
+ }
+ sub name {
+ my $self = shift;
+ $$self;
+ }
+ sub named {
+ my $class = shift;
+ my $name = shift;
+ bless \$name, $class;
+ }
+ }
+ { package Horse;
+ @ISA = qw(Animal);
+ sub sound { "neigh" }
+ }
+
+Ahh, but what happens if we invoke C<speak> on an instance?
+
+ my $horse = Horse->named("Mr. Ed");
+ $horse->speak;
+
+We get a debugging value:
+
+ a Horse=SCALAR(0xaca42ac) goes neigh!
+
+Why? Because the C<Animal::speak> routine is expecting a classname as
+its first parameter, not an instance. When the instance is passed in,
+we'll end up using a blessed scalar reference as a string, and that
+shows up as we saw it just now.
+
+=head2 Making a method work with either classes or instances
+
+All we need is for a method to detect if it is being called on a class
+or called on an instance. The most straightforward way is with the
+C<ref> operator. This returns a string (the classname) when used on a
+blessed reference, and an empty string when used on a string (like a
+classname). Let's modify the C<name> method first to notice the change:
+
+ sub name {
+ my $either = shift;
+ ref $either ? $$either : "Any $either";
+ }
+
+Here, the C<?:> operator comes in handy to select either the
+dereference or a derived string. Now we can use this with either an
+instance or a class. Note that I've changed the first parameter
+holder to C<$either> to show that this is intended:
+
+ my $horse = Horse->named("Mr. Ed");
+ print Horse->name, "\n"; # prints "Any Horse\n"
+ print $horse->name, "\n"; # prints "Mr Ed.\n"
+
+and now we'll fix C<speak> to use this:
+
+ sub speak {
+ my $either = shift;
+ print $either->name, " goes ", $either->sound, "\n";
+ }
+
+And since C<sound> already worked with either a class or an instance,
+we're done!
+
+=head2 Adding parameters to a method
+
+Let's train our animals to eat:
+
+ { package Animal;
+ sub named {
+ my $class = shift;
+ my $name = shift;
+ bless \$name, $class;
+ }
+ sub name {
+ my $either = shift;
+ ref $either ? $$either : "Any $either";
+ }
+ sub speak {
+ my $either = shift;
+ print $either->name, " goes ", $either->sound, "\n";
+ }
+ sub eat {
+ my $either = shift;
+ my $food = shift;
+ print $either->name, " eats $food.\n";
+ }
+ }
+ { package Horse;
+ @ISA = qw(Animal);
+ sub sound { "neigh" }
+ }
+ { package Sheep;
+ @ISA = qw(Animal);
+ sub sound { "baaaah" }
+ }
+
+And now try it out:
+
+ my $horse = Horse->named("Mr. Ed");
+ $horse->eat("hay");
+ Sheep->eat("grass");
+
+which prints:
+
+ Mr. Ed eats hay.
+ Any Sheep eats grass.
+
+An instance method with parameters gets invoked with the instance,
+and then the list of parameters. So that first invocation is like:
+
+ Animal::eat($horse, "hay");
+
+=head2 More interesting instances
+
+What if an instance needs more data? Most interesting instances are
+made of many items, each of which can in turn be a reference or even
+another object. The easiest way to store these is often in a hash.
+The keys of the hash serve as the names of parts of the object (often
+called "instance variables" or "member variables"), and the
+corresponding values are, well, the values.
+
+But how do we turn the horse into a hash? Recall that an object was
+any blessed reference. We can just as easily make it a blessed hash
+reference as a blessed scalar reference, as long as everything that
+looks at the reference is changed accordingly.
+
+Let's make a sheep that has a name and a color:
+
+ my $bad = bless { Name => "Evil", Color => "black" }, Sheep;
+
+so C<< $bad->{Name} >> has C<Evil>, and C<< $bad->{Color} >> has
+C<black>. But we want to make C<< $bad->name >> access the name, and
+that's now messed up because it's expecting a scalar reference. Not
+to worry, because that's pretty easy to fix up.
+
+One solution is to override C<Animal::name> and C<Animal::named> by
+defining them anew in C<Sheep>, but then any methods added later to
+C<Animal> might still mess up, and we'd have to override all of those
+too. Therefore, it's never a good idea to define the data layout in a
+way that's different from the data layout of the base classes. In fact,
+it's a good idea to use blessed hash references in all cases. Also, this
+is why it's important to have constructors do the low-level work. So,
+let's redefine C<Animal>:
+
+ ## in Animal
+ sub name {
+ my $either = shift;
+ ref $either ? $either->{Name} : "Any $either";
+ }
+ sub named {
+ my $class = shift;
+ my $name = shift;
+ my $self = { Name => $name };
+ bless $self, $class;
+ }
+
+Of course, we still need to override C<named> in order to handle
+constructing a C<Sheep> with a certain color:
+
+ ## in Sheep
+ sub named {
+ my ($class, $name) = @_;
+ my $self = $class->SUPER::named(@_);
+ $$self{Color} = $class->default_color;
+ $self
+ }
+
+(Note that C<@_> contains the parameters to C<named>.)
+
+What's this C<default_color>? Well, if C<named> has only the name,
+we still need to set a color, so we'll have a class-specific default color.
+For a sheep, we might define it as white:
+
+ ## in Sheep
+ sub default_color { "white" }
+
+Now:
+
+ my $sheep = Sheep->named("Bad");
+ print $sheep->{Color}, "\n";
+
+outputs:
+
+ white
+
+Now, there's nothing particularly specific to C<Sheep> when it comes
+to color, so let's remove C<Sheep::named> and implement C<Animal::named>
+to handle color instead:
+
+ ## in Animal
+ sub named {
+ my ($class, $name) = @_;
+ my $self = { Name => $name, Color => $class->default_color };
+ bless $self, $class;
+ }
+
+And then to keep from having to define C<default_color> for each additional
+class, we'll define a method that serves as the "default default" directly
+in C<Animal>:
+
+ ## in Animal
+ sub default_color { "brown" }
+
+Of course, because C<name> and C<named> were the only methods that
+referenced the "structure" of the object, the rest of the methods can
+remain the same, so C<speak> still works as before.
+
+=head2 A horse of a different color
+
+But having all our horses be brown would be boring. So let's add a
+method or two to get and set the color.
+
+ ## in Animal
+ sub color {
+ $_[0]->{Color}
+ }
+ sub set_color {
+ $_[0]->{Color} = $_[1];
+ }
+
+Note the alternate way of accessing the arguments: C<$_[0]> is used
+in-place, rather than with a C<shift>. (This saves us a bit of time
+for something that may be invoked frequently.) And now we can fix
+that color for Mr. Ed:
+
+ my $horse = Horse->named("Mr. Ed");
+ $horse->set_color("black-and-white");
+ print $horse->name, " is colored ", $horse->color, "\n";
+
+which results in:
+
+ Mr. Ed is colored black-and-white
+
+=head2 Summary
+
+So, now we have class methods, constructors, instance methods, instance
+data, and even accessors. But that's still just the beginning of what
+Perl has to offer. We haven't even begun to talk about accessors that
+double as getters and setters, destructors, indirect object notation,
+overloading, "isa" and "can" tests, the C<UNIVERSAL> class, and so on.
+That's for the rest of the Perl documentation to cover. Hopefully, this
+gets you started, though.
+
+=head1 SEE ALSO
+
+For more information, see L<perlobj> (for all the gritty details about
+Perl objects, now that you've seen the basics), L<perltoot> (the
+tutorial for those who already know objects), L<perltooc> (dealing
+with class data), L<perlbot> (for some more tricks), and books such as
+Damian Conway's excellent I<Object Oriented Perl>.
+
+Some modules which might prove interesting are Class::Accessor,
+Class::Class, Class::Contract, Class::Data::Inheritable,
+Class::MethodMaker and Tie::SecureHash
+
+=head1 COPYRIGHT
+
+Copyright (c) 1999, 2000 by Randal L. Schwartz and Stonehenge
+Consulting Services, Inc.
+
+Copyright (c) 2009 by Michael F. Witten.
+
+Permission is hereby granted to distribute this document intact with
+the Perl distribution, and in accordance with the licenses of the Perl
+distribution; derived documents must include this copyright notice
+intact.
+
+Portions of this text have been derived from Perl Training materials
+originally appearing in the I<Packages, References, Objects, and
+Modules> course taught by instructors for Stonehenge Consulting
+Services, Inc. and used with permission.
+
+Portions of this text have been derived from materials originally
+appearing in I<Linux Magazine> and used with permission.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlbot.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlbot.pod
new file mode 100755
index 00000000000..91723b70d78
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlbot.pod
@@ -0,0 +1,535 @@
+=head1 NAME
+
+perlbot - Bag'o Object Tricks (the BOT)
+
+=head1 DESCRIPTION
+
+The following collection of tricks and hints is intended to whet curious
+appetites about such things as the use of instance variables and the
+mechanics of object and class relationships. The reader is encouraged to
+consult relevant textbooks for discussion of Object Oriented definitions and
+methodology. This is not intended as a tutorial for object-oriented
+programming or as a comprehensive guide to Perl's object oriented features,
+nor should it be construed as a style guide. If you're looking for tutorials,
+be sure to read L<perlboot>, L<perltoot>, and L<perltooc>.
+
+The Perl motto still holds: There's more than one way to do it.
+
+=head1 OO SCALING TIPS
+
+=over 5
+
+=item 1
+
+Do not attempt to verify the type of $self. That'll break if the class is
+inherited, when the type of $self is valid but its package isn't what you
+expect. See rule 5.
+
+=item 2
+
+If an object-oriented (OO) or indirect-object (IO) syntax was used, then the
+object is probably the correct type and there's no need to become paranoid
+about it. Perl isn't a paranoid language anyway. If people subvert the OO
+or IO syntax then they probably know what they're doing and you should let
+them do it. See rule 1.
+
+=item 3
+
+Use the two-argument form of bless(). Let a subclass use your constructor.
+See L<INHERITING A CONSTRUCTOR>.
+
+=item 4
+
+The subclass is allowed to know things about its immediate superclass, the
+superclass is allowed to know nothing about a subclass.
+
+=item 5
+
+Don't be trigger happy with inheritance. A "using", "containing", or
+"delegation" relationship (some sort of aggregation, at least) is often more
+appropriate. See L<OBJECT RELATIONSHIPS>, L<USING RELATIONSHIP WITH SDBM>,
+and L<"DELEGATION">.
+
+=item 6
+
+The object is the namespace. Make package globals accessible via the
+object. This will remove the guess work about the symbol's home package.
+See L<CLASS CONTEXT AND THE OBJECT>.
+
+=item 7
+
+IO syntax is certainly less noisy, but it is also prone to ambiguities that
+can cause difficult-to-find bugs. Allow people to use the sure-thing OO
+syntax, even if you don't like it.
+
+=item 8
+
+Do not use function-call syntax on a method. You're going to be bitten
+someday. Someone might move that method into a superclass and your code
+will be broken. On top of that you're feeding the paranoia in rule 2.
+
+=item 9
+
+Don't assume you know the home package of a method. You're making it
+difficult for someone to override that method. See L<THINKING OF CODE REUSE>.
+
+=back
+
+=head1 INSTANCE VARIABLES
+
+An anonymous array or anonymous hash can be used to hold instance
+variables. Named parameters are also demonstrated.
+
+ package Foo;
+
+ sub new {
+ my $type = shift;
+ my %params = @_;
+ my $self = {};
+ $self->{'High'} = $params{'High'};
+ $self->{'Low'} = $params{'Low'};
+ bless $self, $type;
+ }
+
+
+ package Bar;
+
+ sub new {
+ my $type = shift;
+ my %params = @_;
+ my $self = [];
+ $self->[0] = $params{'Left'};
+ $self->[1] = $params{'Right'};
+ bless $self, $type;
+ }
+
+ package main;
+
+ $a = Foo->new( 'High' => 42, 'Low' => 11 );
+ print "High=$a->{'High'}\n";
+ print "Low=$a->{'Low'}\n";
+
+ $b = Bar->new( 'Left' => 78, 'Right' => 40 );
+ print "Left=$b->[0]\n";
+ print "Right=$b->[1]\n";
+
+=head1 SCALAR INSTANCE VARIABLES
+
+An anonymous scalar can be used when only one instance variable is needed.
+
+ package Foo;
+
+ sub new {
+ my $type = shift;
+ my $self;
+ $self = shift;
+ bless \$self, $type;
+ }
+
+ package main;
+
+ $a = Foo->new( 42 );
+ print "a=$$a\n";
+
+
+=head1 INSTANCE VARIABLE INHERITANCE
+
+This example demonstrates how one might inherit instance variables from a
+superclass for inclusion in the new class. This requires calling the
+superclass's constructor and adding one's own instance variables to the new
+object.
+
+ package Bar;
+
+ sub new {
+ my $type = shift;
+ my $self = {};
+ $self->{'buz'} = 42;
+ bless $self, $type;
+ }
+
+ package Foo;
+ @ISA = qw( Bar );
+
+ sub new {
+ my $type = shift;
+ my $self = Bar->new;
+ $self->{'biz'} = 11;
+ bless $self, $type;
+ }
+
+ package main;
+
+ $a = Foo->new;
+ print "buz = ", $a->{'buz'}, "\n";
+ print "biz = ", $a->{'biz'}, "\n";
+
+
+
+=head1 OBJECT RELATIONSHIPS
+
+The following demonstrates how one might implement "containing" and "using"
+relationships between objects.
+
+ package Bar;
+
+ sub new {
+ my $type = shift;
+ my $self = {};
+ $self->{'buz'} = 42;
+ bless $self, $type;
+ }
+
+ package Foo;
+
+ sub new {
+ my $type = shift;
+ my $self = {};
+ $self->{'Bar'} = Bar->new;
+ $self->{'biz'} = 11;
+ bless $self, $type;
+ }
+
+ package main;
+
+ $a = Foo->new;
+ print "buz = ", $a->{'Bar'}->{'buz'}, "\n";
+ print "biz = ", $a->{'biz'}, "\n";
+
+
+
+=head1 OVERRIDING SUPERCLASS METHODS
+
+The following example demonstrates how to override a superclass method and
+then call the overridden method. The B<SUPER> pseudo-class allows the
+programmer to call an overridden superclass method without actually knowing
+where that method is defined.
+
+ package Buz;
+ sub goo { print "here's the goo\n" }
+
+ package Bar; @ISA = qw( Buz );
+ sub google { print "google here\n" }
+
+ package Baz;
+ sub mumble { print "mumbling\n" }
+
+ package Foo;
+ @ISA = qw( Bar Baz );
+
+ sub new {
+ my $type = shift;
+ bless [], $type;
+ }
+ sub grr { print "grumble\n" }
+ sub goo {
+ my $self = shift;
+ $self->SUPER::goo();
+ }
+ sub mumble {
+ my $self = shift;
+ $self->SUPER::mumble();
+ }
+ sub google {
+ my $self = shift;
+ $self->SUPER::google();
+ }
+
+ package main;
+
+ $foo = Foo->new;
+ $foo->mumble;
+ $foo->grr;
+ $foo->goo;
+ $foo->google;
+
+Note that C<SUPER> refers to the superclasses of the current package
+(C<Foo>), not to the superclasses of C<$self>.
+
+
+=head1 USING RELATIONSHIP WITH SDBM
+
+This example demonstrates an interface for the SDBM class. This creates a
+"using" relationship between the SDBM class and the new class Mydbm.
+
+ package Mydbm;
+
+ require SDBM_File;
+ require Tie::Hash;
+ @ISA = qw( Tie::Hash );
+
+ sub TIEHASH {
+ my $type = shift;
+ my $ref = SDBM_File->new(@_);
+ bless {'dbm' => $ref}, $type;
+ }
+ sub FETCH {
+ my $self = shift;
+ my $ref = $self->{'dbm'};
+ $ref->FETCH(@_);
+ }
+ sub STORE {
+ my $self = shift;
+ if (defined $_[0]){
+ my $ref = $self->{'dbm'};
+ $ref->STORE(@_);
+ } else {
+ die "Cannot STORE an undefined key in Mydbm\n";
+ }
+ }
+
+ package main;
+ use Fcntl qw( O_RDWR O_CREAT );
+
+ tie %foo, "Mydbm", "Sdbm", O_RDWR|O_CREAT, 0640;
+ $foo{'bar'} = 123;
+ print "foo-bar = $foo{'bar'}\n";
+
+ tie %bar, "Mydbm", "Sdbm2", O_RDWR|O_CREAT, 0640;
+ $bar{'Cathy'} = 456;
+ print "bar-Cathy = $bar{'Cathy'}\n";
+
+=head1 THINKING OF CODE REUSE
+
+One strength of Object-Oriented languages is the ease with which old code
+can use new code. The following examples will demonstrate first how one can
+hinder code reuse and then how one can promote code reuse.
+
+This first example illustrates a class which uses a fully-qualified method
+call to access the "private" method BAZ(). The second example will show
+that it is impossible to override the BAZ() method.
+
+ package FOO;
+
+ sub new {
+ my $type = shift;
+ bless {}, $type;
+ }
+ sub bar {
+ my $self = shift;
+ $self->FOO::private::BAZ;
+ }
+
+ package FOO::private;
+
+ sub BAZ {
+ print "in BAZ\n";
+ }
+
+ package main;
+
+ $a = FOO->new;
+ $a->bar;
+
+Now we try to override the BAZ() method. We would like FOO::bar() to call
+GOOP::BAZ(), but this cannot happen because FOO::bar() explicitly calls
+FOO::private::BAZ().
+
+ package FOO;
+
+ sub new {
+ my $type = shift;
+ bless {}, $type;
+ }
+ sub bar {
+ my $self = shift;
+ $self->FOO::private::BAZ;
+ }
+
+ package FOO::private;
+
+ sub BAZ {
+ print "in BAZ\n";
+ }
+
+ package GOOP;
+ @ISA = qw( FOO );
+ sub new {
+ my $type = shift;
+ bless {}, $type;
+ }
+
+ sub BAZ {
+ print "in GOOP::BAZ\n";
+ }
+
+ package main;
+
+ $a = GOOP->new;
+ $a->bar;
+
+To create reusable code we must modify class FOO, flattening class
+FOO::private. The next example shows a reusable class FOO which allows the
+method GOOP::BAZ() to be used in place of FOO::BAZ().
+
+ package FOO;
+
+ sub new {
+ my $type = shift;
+ bless {}, $type;
+ }
+ sub bar {
+ my $self = shift;
+ $self->BAZ;
+ }
+
+ sub BAZ {
+ print "in BAZ\n";
+ }
+
+ package GOOP;
+ @ISA = qw( FOO );
+
+ sub new {
+ my $type = shift;
+ bless {}, $type;
+ }
+ sub BAZ {
+ print "in GOOP::BAZ\n";
+ }
+
+ package main;
+
+ $a = GOOP->new;
+ $a->bar;
+
+=head1 CLASS CONTEXT AND THE OBJECT
+
+Use the object to solve package and class context problems. Everything a
+method needs should be available via the object or should be passed as a
+parameter to the method.
+
+A class will sometimes have static or global data to be used by the
+methods. A subclass may want to override that data and replace it with new
+data. When this happens the superclass may not know how to find the new
+copy of the data.
+
+This problem can be solved by using the object to define the context of the
+method. Let the method look in the object for a reference to the data. The
+alternative is to force the method to go hunting for the data ("Is it in my
+class, or in a subclass? Which subclass?"), and this can be inconvenient
+and will lead to hackery. It is better just to let the object tell the
+method where that data is located.
+
+ package Bar;
+
+ %fizzle = ( 'Password' => 'XYZZY' );
+
+ sub new {
+ my $type = shift;
+ my $self = {};
+ $self->{'fizzle'} = \%fizzle;
+ bless $self, $type;
+ }
+
+ sub enter {
+ my $self = shift;
+
+ # Don't try to guess if we should use %Bar::fizzle
+ # or %Foo::fizzle. The object already knows which
+ # we should use, so just ask it.
+ #
+ my $fizzle = $self->{'fizzle'};
+
+ print "The word is ", $fizzle->{'Password'}, "\n";
+ }
+
+ package Foo;
+ @ISA = qw( Bar );
+
+ %fizzle = ( 'Password' => 'Rumple' );
+
+ sub new {
+ my $type = shift;
+ my $self = Bar->new;
+ $self->{'fizzle'} = \%fizzle;
+ bless $self, $type;
+ }
+
+ package main;
+
+ $a = Bar->new;
+ $b = Foo->new;
+ $a->enter;
+ $b->enter;
+
+=head1 INHERITING A CONSTRUCTOR
+
+An inheritable constructor should use the second form of bless() which allows
+blessing directly into a specified class. Notice in this example that the
+object will be a BAR not a FOO, even though the constructor is in class FOO.
+
+ package FOO;
+
+ sub new {
+ my $type = shift;
+ my $self = {};
+ bless $self, $type;
+ }
+
+ sub baz {
+ print "in FOO::baz()\n";
+ }
+
+ package BAR;
+ @ISA = qw(FOO);
+
+ sub baz {
+ print "in BAR::baz()\n";
+ }
+
+ package main;
+
+ $a = BAR->new;
+ $a->baz;
+
+=head1 DELEGATION
+
+Some classes, such as SDBM_File, cannot be effectively subclassed because
+they create foreign objects. Such a class can be extended with some sort of
+aggregation technique such as the "using" relationship mentioned earlier or
+by delegation.
+
+The following example demonstrates delegation using an AUTOLOAD() function to
+perform message-forwarding. This will allow the Mydbm object to behave
+exactly like an SDBM_File object. The Mydbm class could now extend the
+behavior by adding custom FETCH() and STORE() methods, if this is desired.
+
+ package Mydbm;
+
+ require SDBM_File;
+ require Tie::Hash;
+ @ISA = qw(Tie::Hash);
+
+ sub TIEHASH {
+ my $type = shift;
+ my $ref = SDBM_File->new(@_);
+ bless {'delegate' => $ref};
+ }
+
+ sub AUTOLOAD {
+ my $self = shift;
+
+ # The Perl interpreter places the name of the
+ # message in a variable called $AUTOLOAD.
+
+ # DESTROY messages should never be propagated.
+ return if $AUTOLOAD =~ /::DESTROY$/;
+
+ # Remove the package name.
+ $AUTOLOAD =~ s/^Mydbm:://;
+
+ # Pass the message to the delegate.
+ $self->{'delegate'}->$AUTOLOAD(@_);
+ }
+
+ package main;
+ use Fcntl qw( O_RDWR O_CREAT );
+
+ tie %foo, "Mydbm", "adbm", O_RDWR|O_CREAT, 0640;
+ $foo{'bar'} = 123;
+ print "foo-bar = $foo{'bar'}\n";
+
+=head1 SEE ALSO
+
+L<perlboot>, L<perltoot>, L<perltooc>.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlbs2000.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlbs2000.pod
new file mode 100755
index 00000000000..a7746c64e2b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlbs2000.pod
@@ -0,0 +1,241 @@
+This document is written in pod format hence there are punctuation
+characters in odd places. Do not worry, you've apparently got the
+ASCII->EBCDIC translation worked out correctly. You can read more
+about pod in pod/perlpod.pod or the short summary in the INSTALL file.
+
+=head1 NAME
+
+README.BS2000 - building and installing Perl for BS2000.
+
+=head1 SYNOPSIS
+
+This document will help you Configure, build, test and install Perl
+on BS2000 in the POSIX subsystem.
+
+=head1 DESCRIPTION
+
+This is a ported perl for the POSIX subsystem in BS2000 VERSION OSD
+V3.1A or later. It may work on other versions, but we started porting
+and testing it with 3.1A and are currently using Version V4.0A.
+
+You may need the following GNU programs in order to install perl:
+
+=head2 gzip on BS2000
+
+We used version 1.2.4, which could be installed out of the box with
+one failure during 'make check'.
+
+=head2 bison on BS2000
+
+The yacc coming with BS2000 POSIX didn't work for us. So we had to
+use bison. We had to make a few changes to perl in order to use the
+pure (reentrant) parser of bison. We used version 1.25, but we had to
+add a few changes due to EBCDIC. See below for more details
+concerning yacc.
+
+=head2 Unpacking Perl Distribution on BS2000
+
+To extract an ASCII tar archive on BS2000 POSIX you need an ASCII
+filesystem (we used the mountpoint /usr/local/ascii for this). Now
+you extract the archive in the ASCII filesystem without
+I/O-conversion:
+
+cd /usr/local/ascii
+export IO_CONVERSION=NO
+gunzip < /usr/local/src/perl.tar.gz | pax -r
+
+You may ignore the error message for the first element of the archive
+(this doesn't look like a tar archive / skipping to next file...),
+it's only the directory which will be created automatically anyway.
+
+After extracting the archive you copy the whole directory tree to your
+EBCDIC filesystem. B<This time you use I/O-conversion>:
+
+cd /usr/local/src
+IO_CONVERSION=YES
+cp -r /usr/local/ascii/perl5.005_02 ./
+
+=head2 Compiling Perl on BS2000
+
+There is a "hints" file for BS2000 called hints.posix-bc (because
+posix-bc is the OS name given by `uname`) that specifies the correct
+values for most things. The major problem is (of course) the EBCDIC
+character set. We have german EBCDIC version.
+
+Because of our problems with the native yacc we used GNU bison to
+generate a pure (=reentrant) parser for perly.y. So our yacc is
+really the following script:
+
+-----8<-----/usr/local/bin/yacc-----8<-----
+#! /usr/bin/sh
+
+# Bison as a reentrant yacc:
+
+# save parameters:
+params=""
+while [[ $# -gt 1 ]]; do
+ params="$params $1"
+ shift
+done
+
+# add flag %pure_parser:
+
+tmpfile=/tmp/bison.$$.y
+echo %pure_parser > $tmpfile
+cat $1 >> $tmpfile
+
+# call bison:
+
+echo "/usr/local/bin/bison --yacc $params $1\t\t\t(Pure Parser)"
+/usr/local/bin/bison --yacc $params $tmpfile
+
+# cleanup:
+
+rm -f $tmpfile
+-----8<----------8<-----
+
+We still use the normal yacc for a2p.y though!!! We made a softlink
+called byacc to distinguish between the two versions:
+
+ln -s /usr/bin/yacc /usr/local/bin/byacc
+
+We build perl using GNU make. We tried the native make once and it
+worked too.
+
+=head2 Testing Perl on BS2000
+
+We still got a few errors during C<make test>. Some of them are the
+result of using bison. Bison prints I<parser error> instead of I<syntax
+error>, so we may ignore them. The following list shows
+our errors, your results may differ:
+
+op/numconvert.......FAILED tests 1409-1440
+op/regexp...........FAILED tests 483, 496
+op/regexp_noamp.....FAILED tests 483, 496
+pragma/overload.....FAILED tests 152-153, 170-171
+pragma/warnings.....FAILED tests 14, 82, 129, 155, 192, 205, 207
+lib/bigfloat........FAILED tests 351-352, 355
+lib/bigfltpm........FAILED tests 354-355, 358
+lib/complex.........FAILED tests 267, 487
+lib/dumper..........FAILED tests 43, 45
+Failed 11/231 test scripts, 95.24% okay. 57/10595 subtests failed, 99.46% okay.
+
+=head2 Installing Perl on BS2000
+
+We have no nroff on BS2000 POSIX (yet), so we ignored any errors while
+installing the documentation.
+
+
+=head2 Using Perl in the Posix-Shell of BS2000
+
+BS2000 POSIX doesn't support the shebang notation
+(C<#!/usr/local/bin/perl>), so you have to use the following lines
+instead:
+
+: # use perl
+ eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
+ if $running_under_some_shell;
+
+=head2 Using Perl in "native" BS2000
+
+We don't have much experience with this yet, but try the following:
+
+Copy your Perl executable to a BS2000 LLM using bs2cp:
+
+C<bs2cp /usr/local/bin/perl 'bs2:perl(perl,l)'>
+
+Now you can start it with the following (SDF) command:
+
+C</START-PROG FROM-FILE=*MODULE(PERL,PERL),PROG-MODE=*ANY,RUN-MODE=*ADV>
+
+First you get the BS2000 commandline prompt ('*'). Here you may enter
+your parameters, e.g. C<-e 'print "Hello World!\\n";'> (note the
+double backslash!) or C<-w> and the name of your Perl script.
+Filenames starting with C</> are searched in the Posix filesystem,
+others are searched in the BS2000 filesystem. You may even use
+wildcards if you put a C<%> in front of your filename (e.g. C<-w
+checkfiles.pl %*.c>). Read your C/C++ manual for additional
+possibilities of the commandline prompt (look for
+PARAMETER-PROMPTING).
+
+=head2 Floating point anomalies on BS2000
+
+There appears to be a bug in the floating point implementation on BS2000 POSIX
+systems such that calling int() on the product of a number and a small
+magnitude number is not the same as calling int() on the quotient of
+that number and a large magnitude number. For example, in the following
+Perl code:
+
+ my $x = 100000.0;
+ my $y = int($x * 1e-5) * 1e5; # '0'
+ my $z = int($x / 1e+5) * 1e5; # '100000'
+ print "\$y is $y and \$z is $z\n"; # $y is 0 and $z is 100000
+
+Although one would expect the quantities $y and $z to be the same and equal
+to 100000 they will differ and instead will be 0 and 100000 respectively.
+
+=head2 Using PerlIO and different encodings on ASCII and EBCDIC partitions
+
+Since version 5.8 Perl uses the new PerlIO on BS2000. This enables
+you using different encodings per IO channel. For example you may use
+
+ use Encode;
+ open($f, ">:encoding(ascii)", "test.ascii");
+ print $f "Hello World!\n";
+ open($f, ">:encoding(posix-bc)", "test.ebcdic");
+ print $f "Hello World!\n";
+ open($f, ">:encoding(latin1)", "test.latin1");
+ print $f "Hello World!\n";
+ open($f, ">:encoding(utf8)", "test.utf8");
+ print $f "Hello World!\n";
+
+to get two files containing "Hello World!\n" in ASCII, EBCDIC, ISO
+Latin-1 (in this example identical to ASCII) respective UTF-EBCDIC (in
+this example identical to normal EBCDIC). See the documentation of
+Encode::PerlIO for details.
+
+As the PerlIO layer uses raw IO internally, all this totally ignores
+the type of your filesystem (ASCII or EBCDIC) and the IO_CONVERSION
+environment variable. If you want to get the old behavior, that the
+BS2000 IO functions determine conversion depending on the filesystem
+PerlIO still is your friend. You use IO_CONVERSION as usual and tell
+Perl, that it should use the native IO layer:
+
+ export IO_CONVERSION=YES
+ export PERLIO=stdio
+
+Now your IO would be ASCII on ASCII partitions and EBCDIC on EBCDIC
+partitions. See the documentation of PerlIO (without C<Encode::>!)
+for further posibilities.
+
+=head1 AUTHORS
+
+Thomas Dorner
+
+=head1 SEE ALSO
+
+L<INSTALL>, L<perlport>.
+
+=head2 Mailing list
+
+If you are interested in the VM/ESA, z/OS (formerly known as OS/390)
+and POSIX-BC (BS2000) ports of Perl then see the perl-mvs mailing list.
+To subscribe, send an empty message to perl-mvs-subscribe@perl.org.
+
+See also:
+
+ http://lists.perl.org/showlist.cgi?name=perl-mvs
+
+There are web archives of the mailing list at:
+
+ http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
+ http://archive.develooper.com/perl-mvs@perl.org/
+
+=head1 HISTORY
+
+This document was originally written by Thomas Dorner for the 5.005
+release of Perl.
+
+This document was podified for the 5.6 release of perl 11 July 2000.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlcall.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlcall.pod
new file mode 100755
index 00000000000..06f3aa33c74
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlcall.pod
@@ -0,0 +1,1935 @@
+=head1 NAME
+
+perlcall - Perl calling conventions from C
+
+=head1 DESCRIPTION
+
+The purpose of this document is to show you how to call Perl subroutines
+directly from C, i.e., how to write I<callbacks>.
+
+Apart from discussing the C interface provided by Perl for writing
+callbacks the document uses a series of examples to show how the
+interface actually works in practice. In addition some techniques for
+coding callbacks are covered.
+
+Examples where callbacks are necessary include
+
+=over 5
+
+=item * An Error Handler
+
+You have created an XSUB interface to an application's C API.
+
+A fairly common feature in applications is to allow you to define a C
+function that will be called whenever something nasty occurs. What we
+would like is to be able to specify a Perl subroutine that will be
+called instead.
+
+=item * An Event Driven Program
+
+The classic example of where callbacks are used is when writing an
+event driven program like for an X windows application. In this case
+you register functions to be called whenever specific events occur,
+e.g., a mouse button is pressed, the cursor moves into a window or a
+menu item is selected.
+
+=back
+
+Although the techniques described here are applicable when embedding
+Perl in a C program, this is not the primary goal of this document.
+There are other details that must be considered and are specific to
+embedding Perl. For details on embedding Perl in C refer to
+L<perlembed>.
+
+Before you launch yourself head first into the rest of this document,
+it would be a good idea to have read the following two documents -
+L<perlxs> and L<perlguts>.
+
+=head1 THE CALL_ FUNCTIONS
+
+Although this stuff is easier to explain using examples, you first need
+be aware of a few important definitions.
+
+Perl has a number of C functions that allow you to call Perl
+subroutines. They are
+
+ I32 call_sv(SV* sv, I32 flags);
+ I32 call_pv(char *subname, I32 flags);
+ I32 call_method(char *methname, I32 flags);
+ I32 call_argv(char *subname, I32 flags, register char **argv);
+
+The key function is I<call_sv>. All the other functions are
+fairly simple wrappers which make it easier to call Perl subroutines in
+special cases. At the end of the day they will all call I<call_sv>
+to invoke the Perl subroutine.
+
+All the I<call_*> functions have a C<flags> parameter which is
+used to pass a bit mask of options to Perl. This bit mask operates
+identically for each of the functions. The settings available in the
+bit mask are discussed in L<FLAG VALUES>.
+
+Each of the functions will now be discussed in turn.
+
+=over 5
+
+=item call_sv
+
+I<call_sv> takes two parameters, the first, C<sv>, is an SV*.
+This allows you to specify the Perl subroutine to be called either as a
+C string (which has first been converted to an SV) or a reference to a
+subroutine. The section, I<Using call_sv>, shows how you can make
+use of I<call_sv>.
+
+=item call_pv
+
+The function, I<call_pv>, is similar to I<call_sv> except it
+expects its first parameter to be a C char* which identifies the Perl
+subroutine you want to call, e.g., C<call_pv("fred", 0)>. If the
+subroutine you want to call is in another package, just include the
+package name in the string, e.g., C<"pkg::fred">.
+
+=item call_method
+
+The function I<call_method> is used to call a method from a Perl
+class. The parameter C<methname> corresponds to the name of the method
+to be called. Note that the class that the method belongs to is passed
+on the Perl stack rather than in the parameter list. This class can be
+either the name of the class (for a static method) or a reference to an
+object (for a virtual method). See L<perlobj> for more information on
+static and virtual methods and L<Using call_method> for an example
+of using I<call_method>.
+
+=item call_argv
+
+I<call_argv> calls the Perl subroutine specified by the C string
+stored in the C<subname> parameter. It also takes the usual C<flags>
+parameter. The final parameter, C<argv>, consists of a NULL terminated
+list of C strings to be passed as parameters to the Perl subroutine.
+See I<Using call_argv>.
+
+=back
+
+All the functions return an integer. This is a count of the number of
+items returned by the Perl subroutine. The actual items returned by the
+subroutine are stored on the Perl stack.
+
+As a general rule you should I<always> check the return value from
+these functions. Even if you are expecting only a particular number of
+values to be returned from the Perl subroutine, there is nothing to
+stop someone from doing something unexpected--don't say you haven't
+been warned.
+
+=head1 FLAG VALUES
+
+The C<flags> parameter in all the I<call_*> functions is a bit mask
+which can consist of any combination of the symbols defined below,
+OR'ed together.
+
+
+=head2 G_VOID
+
+Calls the Perl subroutine in a void context.
+
+This flag has 2 effects:
+
+=over 5
+
+=item 1.
+
+It indicates to the subroutine being called that it is executing in
+a void context (if it executes I<wantarray> the result will be the
+undefined value).
+
+=item 2.
+
+It ensures that nothing is actually returned from the subroutine.
+
+=back
+
+The value returned by the I<call_*> function indicates how many
+items have been returned by the Perl subroutine - in this case it will
+be 0.
+
+
+=head2 G_SCALAR
+
+Calls the Perl subroutine in a scalar context. This is the default
+context flag setting for all the I<call_*> functions.
+
+This flag has 2 effects:
+
+=over 5
+
+=item 1.
+
+It indicates to the subroutine being called that it is executing in a
+scalar context (if it executes I<wantarray> the result will be false).
+
+=item 2.
+
+It ensures that only a scalar is actually returned from the subroutine.
+The subroutine can, of course, ignore the I<wantarray> and return a
+list anyway. If so, then only the last element of the list will be
+returned.
+
+=back
+
+The value returned by the I<call_*> function indicates how many
+items have been returned by the Perl subroutine - in this case it will
+be either 0 or 1.
+
+If 0, then you have specified the G_DISCARD flag.
+
+If 1, then the item actually returned by the Perl subroutine will be
+stored on the Perl stack - the section I<Returning a Scalar> shows how
+to access this value on the stack. Remember that regardless of how
+many items the Perl subroutine returns, only the last one will be
+accessible from the stack - think of the case where only one value is
+returned as being a list with only one element. Any other items that
+were returned will not exist by the time control returns from the
+I<call_*> function. The section I<Returning a list in a scalar
+context> shows an example of this behavior.
+
+
+=head2 G_ARRAY
+
+Calls the Perl subroutine in a list context.
+
+As with G_SCALAR, this flag has 2 effects:
+
+=over 5
+
+=item 1.
+
+It indicates to the subroutine being called that it is executing in a
+list context (if it executes I<wantarray> the result will be true).
+
+
+=item 2.
+
+It ensures that all items returned from the subroutine will be
+accessible when control returns from the I<call_*> function.
+
+=back
+
+The value returned by the I<call_*> function indicates how many
+items have been returned by the Perl subroutine.
+
+If 0, then you have specified the G_DISCARD flag.
+
+If not 0, then it will be a count of the number of items returned by
+the subroutine. These items will be stored on the Perl stack. The
+section I<Returning a list of values> gives an example of using the
+G_ARRAY flag and the mechanics of accessing the returned items from the
+Perl stack.
+
+=head2 G_DISCARD
+
+By default, the I<call_*> functions place the items returned from
+by the Perl subroutine on the stack. If you are not interested in
+these items, then setting this flag will make Perl get rid of them
+automatically for you. Note that it is still possible to indicate a
+context to the Perl subroutine by using either G_SCALAR or G_ARRAY.
+
+If you do not set this flag then it is I<very> important that you make
+sure that any temporaries (i.e., parameters passed to the Perl
+subroutine and values returned from the subroutine) are disposed of
+yourself. The section I<Returning a Scalar> gives details of how to
+dispose of these temporaries explicitly and the section I<Using Perl to
+dispose of temporaries> discusses the specific circumstances where you
+can ignore the problem and let Perl deal with it for you.
+
+=head2 G_NOARGS
+
+Whenever a Perl subroutine is called using one of the I<call_*>
+functions, it is assumed by default that parameters are to be passed to
+the subroutine. If you are not passing any parameters to the Perl
+subroutine, you can save a bit of time by setting this flag. It has
+the effect of not creating the C<@_> array for the Perl subroutine.
+
+Although the functionality provided by this flag may seem
+straightforward, it should be used only if there is a good reason to do
+so. The reason for being cautious is that even if you have specified
+the G_NOARGS flag, it is still possible for the Perl subroutine that
+has been called to think that you have passed it parameters.
+
+In fact, what can happen is that the Perl subroutine you have called
+can access the C<@_> array from a previous Perl subroutine. This will
+occur when the code that is executing the I<call_*> function has
+itself been called from another Perl subroutine. The code below
+illustrates this
+
+ sub fred
+ { print "@_\n" }
+
+ sub joe
+ { &fred }
+
+ &joe(1,2,3);
+
+This will print
+
+ 1 2 3
+
+What has happened is that C<fred> accesses the C<@_> array which
+belongs to C<joe>.
+
+
+=head2 G_EVAL
+
+It is possible for the Perl subroutine you are calling to terminate
+abnormally, e.g., by calling I<die> explicitly or by not actually
+existing. By default, when either of these events occurs, the
+process will terminate immediately. If you want to trap this
+type of event, specify the G_EVAL flag. It will put an I<eval { }>
+around the subroutine call.
+
+Whenever control returns from the I<call_*> function you need to
+check the C<$@> variable as you would in a normal Perl script.
+
+The value returned from the I<call_*> function is dependent on
+what other flags have been specified and whether an error has
+occurred. Here are all the different cases that can occur:
+
+=over 5
+
+=item *
+
+If the I<call_*> function returns normally, then the value
+returned is as specified in the previous sections.
+
+=item *
+
+If G_DISCARD is specified, the return value will always be 0.
+
+=item *
+
+If G_ARRAY is specified I<and> an error has occurred, the return value
+will always be 0.
+
+=item *
+
+If G_SCALAR is specified I<and> an error has occurred, the return value
+will be 1 and the value on the top of the stack will be I<undef>. This
+means that if you have already detected the error by checking C<$@> and
+you want the program to continue, you must remember to pop the I<undef>
+from the stack.
+
+=back
+
+See I<Using G_EVAL> for details on using G_EVAL.
+
+=head2 G_KEEPERR
+
+You may have noticed that using the G_EVAL flag described above will
+B<always> clear the C<$@> variable and set it to a string describing
+the error iff there was an error in the called code. This unqualified
+resetting of C<$@> can be problematic in the reliable identification of
+errors using the C<eval {}> mechanism, because the possibility exists
+that perl will call other code (end of block processing code, for
+example) between the time the error causes C<$@> to be set within
+C<eval {}>, and the subsequent statement which checks for the value of
+C<$@> gets executed in the user's script.
+
+This scenario will mostly be applicable to code that is meant to be
+called from within destructors, asynchronous callbacks, signal
+handlers, C<__DIE__> or C<__WARN__> hooks, and C<tie> functions. In
+such situations, you will not want to clear C<$@> at all, but simply to
+append any new errors to any existing value of C<$@>.
+
+The G_KEEPERR flag is meant to be used in conjunction with G_EVAL in
+I<call_*> functions that are used to implement such code. This flag
+has no effect when G_EVAL is not used.
+
+When G_KEEPERR is used, any errors in the called code will be prefixed
+with the string "\t(in cleanup)", and appended to the current value
+of C<$@>. an error will not be appended if that same error string is
+already at the end of C<$@>.
+
+In addition, a warning is generated using the appended string. This can be
+disabled using C<no warnings 'misc'>.
+
+The G_KEEPERR flag was introduced in Perl version 5.002.
+
+See I<Using G_KEEPERR> for an example of a situation that warrants the
+use of this flag.
+
+=head2 Determining the Context
+
+As mentioned above, you can determine the context of the currently
+executing subroutine in Perl with I<wantarray>. The equivalent test
+can be made in C by using the C<GIMME_V> macro, which returns
+C<G_ARRAY> if you have been called in a list context, C<G_SCALAR> if
+in a scalar context, or C<G_VOID> if in a void context (i.e. the
+return value will not be used). An older version of this macro is
+called C<GIMME>; in a void context it returns C<G_SCALAR> instead of
+C<G_VOID>. An example of using the C<GIMME_V> macro is shown in
+section I<Using GIMME_V>.
+
+=head1 EXAMPLES
+
+Enough of the definition talk, let's have a few examples.
+
+Perl provides many macros to assist in accessing the Perl stack.
+Wherever possible, these macros should always be used when interfacing
+to Perl internals. We hope this should make the code less vulnerable
+to any changes made to Perl in the future.
+
+Another point worth noting is that in the first series of examples I
+have made use of only the I<call_pv> function. This has been done
+to keep the code simpler and ease you into the topic. Wherever
+possible, if the choice is between using I<call_pv> and
+I<call_sv>, you should always try to use I<call_sv>. See
+I<Using call_sv> for details.
+
+=head2 No Parameters, Nothing returned
+
+This first trivial example will call a Perl subroutine, I<PrintUID>, to
+print out the UID of the process.
+
+ sub PrintUID
+ {
+ print "UID is $<\n";
+ }
+
+and here is a C function to call it
+
+ static void
+ call_PrintUID()
+ {
+ dSP;
+
+ PUSHMARK(SP);
+ call_pv("PrintUID", G_DISCARD|G_NOARGS);
+ }
+
+Simple, eh.
+
+A few points to note about this example.
+
+=over 5
+
+=item 1.
+
+Ignore C<dSP> and C<PUSHMARK(SP)> for now. They will be discussed in
+the next example.
+
+=item 2.
+
+We aren't passing any parameters to I<PrintUID> so G_NOARGS can be
+specified.
+
+=item 3.
+
+We aren't interested in anything returned from I<PrintUID>, so
+G_DISCARD is specified. Even if I<PrintUID> was changed to
+return some value(s), having specified G_DISCARD will mean that they
+will be wiped by the time control returns from I<call_pv>.
+
+=item 4.
+
+As I<call_pv> is being used, the Perl subroutine is specified as a
+C string. In this case the subroutine name has been 'hard-wired' into the
+code.
+
+=item 5.
+
+Because we specified G_DISCARD, it is not necessary to check the value
+returned from I<call_pv>. It will always be 0.
+
+=back
+
+=head2 Passing Parameters
+
+Now let's make a slightly more complex example. This time we want to
+call a Perl subroutine, C<LeftString>, which will take 2 parameters--a
+string ($s) and an integer ($n). The subroutine will simply
+print the first $n characters of the string.
+
+So the Perl subroutine would look like this
+
+ sub LeftString
+ {
+ my($s, $n) = @_;
+ print substr($s, 0, $n), "\n";
+ }
+
+The C function required to call I<LeftString> would look like this.
+
+ static void
+ call_LeftString(a, b)
+ char * a;
+ int b;
+ {
+ dSP;
+
+ ENTER;
+ SAVETMPS;
+
+ PUSHMARK(SP);
+ XPUSHs(sv_2mortal(newSVpv(a, 0)));
+ XPUSHs(sv_2mortal(newSViv(b)));
+ PUTBACK;
+
+ call_pv("LeftString", G_DISCARD);
+
+ FREETMPS;
+ LEAVE;
+ }
+
+Here are a few notes on the C function I<call_LeftString>.
+
+=over 5
+
+=item 1.
+
+Parameters are passed to the Perl subroutine using the Perl stack.
+This is the purpose of the code beginning with the line C<dSP> and
+ending with the line C<PUTBACK>. The C<dSP> declares a local copy
+of the stack pointer. This local copy should B<always> be accessed
+as C<SP>.
+
+=item 2.
+
+If you are going to put something onto the Perl stack, you need to know
+where to put it. This is the purpose of the macro C<dSP>--it declares
+and initializes a I<local> copy of the Perl stack pointer.
+
+All the other macros which will be used in this example require you to
+have used this macro.
+
+The exception to this rule is if you are calling a Perl subroutine
+directly from an XSUB function. In this case it is not necessary to
+use the C<dSP> macro explicitly--it will be declared for you
+automatically.
+
+=item 3.
+
+Any parameters to be pushed onto the stack should be bracketed by the
+C<PUSHMARK> and C<PUTBACK> macros. The purpose of these two macros, in
+this context, is to count the number of parameters you are
+pushing automatically. Then whenever Perl is creating the C<@_> array for the
+subroutine, it knows how big to make it.
+
+The C<PUSHMARK> macro tells Perl to make a mental note of the current
+stack pointer. Even if you aren't passing any parameters (like the
+example shown in the section I<No Parameters, Nothing returned>) you
+must still call the C<PUSHMARK> macro before you can call any of the
+I<call_*> functions--Perl still needs to know that there are no
+parameters.
+
+The C<PUTBACK> macro sets the global copy of the stack pointer to be
+the same as our local copy. If we didn't do this I<call_pv>
+wouldn't know where the two parameters we pushed were--remember that
+up to now all the stack pointer manipulation we have done is with our
+local copy, I<not> the global copy.
+
+=item 4.
+
+Next, we come to XPUSHs. This is where the parameters actually get
+pushed onto the stack. In this case we are pushing a string and an
+integer.
+
+See L<perlguts/"XSUBs and the Argument Stack"> for details
+on how the XPUSH macros work.
+
+=item 5.
+
+Because we created temporary values (by means of sv_2mortal() calls)
+we will have to tidy up the Perl stack and dispose of mortal SVs.
+
+This is the purpose of
+
+ ENTER;
+ SAVETMPS;
+
+at the start of the function, and
+
+ FREETMPS;
+ LEAVE;
+
+at the end. The C<ENTER>/C<SAVETMPS> pair creates a boundary for any
+temporaries we create. This means that the temporaries we get rid of
+will be limited to those which were created after these calls.
+
+The C<FREETMPS>/C<LEAVE> pair will get rid of any values returned by
+the Perl subroutine (see next example), plus it will also dump the
+mortal SVs we have created. Having C<ENTER>/C<SAVETMPS> at the
+beginning of the code makes sure that no other mortals are destroyed.
+
+Think of these macros as working a bit like using C<{> and C<}> in Perl
+to limit the scope of local variables.
+
+See the section I<Using Perl to dispose of temporaries> for details of
+an alternative to using these macros.
+
+=item 6.
+
+Finally, I<LeftString> can now be called via the I<call_pv> function.
+The only flag specified this time is G_DISCARD. Because we are passing
+2 parameters to the Perl subroutine this time, we have not specified
+G_NOARGS.
+
+=back
+
+=head2 Returning a Scalar
+
+Now for an example of dealing with the items returned from a Perl
+subroutine.
+
+Here is a Perl subroutine, I<Adder>, that takes 2 integer parameters
+and simply returns their sum.
+
+ sub Adder
+ {
+ my($a, $b) = @_;
+ $a + $b;
+ }
+
+Because we are now concerned with the return value from I<Adder>, the C
+function required to call it is now a bit more complex.
+
+ static void
+ call_Adder(a, b)
+ int a;
+ int b;
+ {
+ dSP;
+ int count;
+
+ ENTER;
+ SAVETMPS;
+
+ PUSHMARK(SP);
+ XPUSHs(sv_2mortal(newSViv(a)));
+ XPUSHs(sv_2mortal(newSViv(b)));
+ PUTBACK;
+
+ count = call_pv("Adder", G_SCALAR);
+
+ SPAGAIN;
+
+ if (count != 1)
+ croak("Big trouble\n");
+
+ printf ("The sum of %d and %d is %d\n", a, b, POPi);
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+ }
+
+Points to note this time are
+
+=over 5
+
+=item 1.
+
+The only flag specified this time was G_SCALAR. That means the C<@_>
+array will be created and that the value returned by I<Adder> will
+still exist after the call to I<call_pv>.
+
+=item 2.
+
+The purpose of the macro C<SPAGAIN> is to refresh the local copy of the
+stack pointer. This is necessary because it is possible that the memory
+allocated to the Perl stack has been reallocated whilst in the
+I<call_pv> call.
+
+If you are making use of the Perl stack pointer in your code you must
+always refresh the local copy using SPAGAIN whenever you make use
+of the I<call_*> functions or any other Perl internal function.
+
+=item 3.
+
+Although only a single value was expected to be returned from I<Adder>,
+it is still good practice to check the return code from I<call_pv>
+anyway.
+
+Expecting a single value is not quite the same as knowing that there
+will be one. If someone modified I<Adder> to return a list and we
+didn't check for that possibility and take appropriate action the Perl
+stack would end up in an inconsistent state. That is something you
+I<really> don't want to happen ever.
+
+=item 4.
+
+The C<POPi> macro is used here to pop the return value from the stack.
+In this case we wanted an integer, so C<POPi> was used.
+
+
+Here is the complete list of POP macros available, along with the types
+they return.
+
+ POPs SV
+ POPp pointer
+ POPn double
+ POPi integer
+ POPl long
+
+=item 5.
+
+The final C<PUTBACK> is used to leave the Perl stack in a consistent
+state before exiting the function. This is necessary because when we
+popped the return value from the stack with C<POPi> it updated only our
+local copy of the stack pointer. Remember, C<PUTBACK> sets the global
+stack pointer to be the same as our local copy.
+
+=back
+
+
+=head2 Returning a list of values
+
+Now, let's extend the previous example to return both the sum of the
+parameters and the difference.
+
+Here is the Perl subroutine
+
+ sub AddSubtract
+ {
+ my($a, $b) = @_;
+ ($a+$b, $a-$b);
+ }
+
+and this is the C function
+
+ static void
+ call_AddSubtract(a, b)
+ int a;
+ int b;
+ {
+ dSP;
+ int count;
+
+ ENTER;
+ SAVETMPS;
+
+ PUSHMARK(SP);
+ XPUSHs(sv_2mortal(newSViv(a)));
+ XPUSHs(sv_2mortal(newSViv(b)));
+ PUTBACK;
+
+ count = call_pv("AddSubtract", G_ARRAY);
+
+ SPAGAIN;
+
+ if (count != 2)
+ croak("Big trouble\n");
+
+ printf ("%d - %d = %d\n", a, b, POPi);
+ printf ("%d + %d = %d\n", a, b, POPi);
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+ }
+
+If I<call_AddSubtract> is called like this
+
+ call_AddSubtract(7, 4);
+
+then here is the output
+
+ 7 - 4 = 3
+ 7 + 4 = 11
+
+Notes
+
+=over 5
+
+=item 1.
+
+We wanted list context, so G_ARRAY was used.
+
+=item 2.
+
+Not surprisingly C<POPi> is used twice this time because we were
+retrieving 2 values from the stack. The important thing to note is that
+when using the C<POP*> macros they come off the stack in I<reverse>
+order.
+
+=back
+
+=head2 Returning a list in a scalar context
+
+Say the Perl subroutine in the previous section was called in a scalar
+context, like this
+
+ static void
+ call_AddSubScalar(a, b)
+ int a;
+ int b;
+ {
+ dSP;
+ int count;
+ int i;
+
+ ENTER;
+ SAVETMPS;
+
+ PUSHMARK(SP);
+ XPUSHs(sv_2mortal(newSViv(a)));
+ XPUSHs(sv_2mortal(newSViv(b)));
+ PUTBACK;
+
+ count = call_pv("AddSubtract", G_SCALAR);
+
+ SPAGAIN;
+
+ printf ("Items Returned = %d\n", count);
+
+ for (i = 1; i <= count; ++i)
+ printf ("Value %d = %d\n", i, POPi);
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+ }
+
+The other modification made is that I<call_AddSubScalar> will print the
+number of items returned from the Perl subroutine and their value (for
+simplicity it assumes that they are integer). So if
+I<call_AddSubScalar> is called
+
+ call_AddSubScalar(7, 4);
+
+then the output will be
+
+ Items Returned = 1
+ Value 1 = 3
+
+In this case the main point to note is that only the last item in the
+list is returned from the subroutine, I<AddSubtract> actually made it back to
+I<call_AddSubScalar>.
+
+
+=head2 Returning Data from Perl via the parameter list
+
+It is also possible to return values directly via the parameter list -
+whether it is actually desirable to do it is another matter entirely.
+
+The Perl subroutine, I<Inc>, below takes 2 parameters and increments
+each directly.
+
+ sub Inc
+ {
+ ++ $_[0];
+ ++ $_[1];
+ }
+
+and here is a C function to call it.
+
+ static void
+ call_Inc(a, b)
+ int a;
+ int b;
+ {
+ dSP;
+ int count;
+ SV * sva;
+ SV * svb;
+
+ ENTER;
+ SAVETMPS;
+
+ sva = sv_2mortal(newSViv(a));
+ svb = sv_2mortal(newSViv(b));
+
+ PUSHMARK(SP);
+ XPUSHs(sva);
+ XPUSHs(svb);
+ PUTBACK;
+
+ count = call_pv("Inc", G_DISCARD);
+
+ if (count != 0)
+ croak ("call_Inc: expected 0 values from 'Inc', got %d\n",
+ count);
+
+ printf ("%d + 1 = %d\n", a, SvIV(sva));
+ printf ("%d + 1 = %d\n", b, SvIV(svb));
+
+ FREETMPS;
+ LEAVE;
+ }
+
+To be able to access the two parameters that were pushed onto the stack
+after they return from I<call_pv> it is necessary to make a note
+of their addresses--thus the two variables C<sva> and C<svb>.
+
+The reason this is necessary is that the area of the Perl stack which
+held them will very likely have been overwritten by something else by
+the time control returns from I<call_pv>.
+
+
+
+
+=head2 Using G_EVAL
+
+Now an example using G_EVAL. Below is a Perl subroutine which computes
+the difference of its 2 parameters. If this would result in a negative
+result, the subroutine calls I<die>.
+
+ sub Subtract
+ {
+ my ($a, $b) = @_;
+
+ die "death can be fatal\n" if $a < $b;
+
+ $a - $b;
+ }
+
+and some C to call it
+
+ static void
+ call_Subtract(a, b)
+ int a;
+ int b;
+ {
+ dSP;
+ int count;
+
+ ENTER;
+ SAVETMPS;
+
+ PUSHMARK(SP);
+ XPUSHs(sv_2mortal(newSViv(a)));
+ XPUSHs(sv_2mortal(newSViv(b)));
+ PUTBACK;
+
+ count = call_pv("Subtract", G_EVAL|G_SCALAR);
+
+ SPAGAIN;
+
+ /* Check the eval first */
+ if (SvTRUE(ERRSV))
+ {
+ printf ("Uh oh - %s\n", SvPV_nolen(ERRSV));
+ POPs;
+ }
+ else
+ {
+ if (count != 1)
+ croak("call_Subtract: wanted 1 value from 'Subtract', got %d\n",
+ count);
+
+ printf ("%d - %d = %d\n", a, b, POPi);
+ }
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+ }
+
+If I<call_Subtract> is called thus
+
+ call_Subtract(4, 5)
+
+the following will be printed
+
+ Uh oh - death can be fatal
+
+Notes
+
+=over 5
+
+=item 1.
+
+We want to be able to catch the I<die> so we have used the G_EVAL
+flag. Not specifying this flag would mean that the program would
+terminate immediately at the I<die> statement in the subroutine
+I<Subtract>.
+
+=item 2.
+
+The code
+
+ if (SvTRUE(ERRSV))
+ {
+ printf ("Uh oh - %s\n", SvPV_nolen(ERRSV));
+ POPs;
+ }
+
+is the direct equivalent of this bit of Perl
+
+ print "Uh oh - $@\n" if $@;
+
+C<PL_errgv> is a perl global of type C<GV *> that points to the
+symbol table entry containing the error. C<ERRSV> therefore
+refers to the C equivalent of C<$@>.
+
+=item 3.
+
+Note that the stack is popped using C<POPs> in the block where
+C<SvTRUE(ERRSV)> is true. This is necessary because whenever a
+I<call_*> function invoked with G_EVAL|G_SCALAR returns an error,
+the top of the stack holds the value I<undef>. Because we want the
+program to continue after detecting this error, it is essential that
+the stack is tidied up by removing the I<undef>.
+
+=back
+
+
+=head2 Using G_KEEPERR
+
+Consider this rather facetious example, where we have used an XS
+version of the call_Subtract example above inside a destructor:
+
+ package Foo;
+ sub new { bless {}, $_[0] }
+ sub Subtract {
+ my($a,$b) = @_;
+ die "death can be fatal" if $a < $b;
+ $a - $b;
+ }
+ sub DESTROY { call_Subtract(5, 4); }
+ sub foo { die "foo dies"; }
+
+ package main;
+ eval { Foo->new->foo };
+ print "Saw: $@" if $@; # should be, but isn't
+
+This example will fail to recognize that an error occurred inside the
+C<eval {}>. Here's why: the call_Subtract code got executed while perl
+was cleaning up temporaries when exiting the eval block, and because
+call_Subtract is implemented with I<call_pv> using the G_EVAL
+flag, it promptly reset C<$@>. This results in the failure of the
+outermost test for C<$@>, and thereby the failure of the error trap.
+
+Appending the G_KEEPERR flag, so that the I<call_pv> call in
+call_Subtract reads:
+
+ count = call_pv("Subtract", G_EVAL|G_SCALAR|G_KEEPERR);
+
+will preserve the error and restore reliable error handling.
+
+=head2 Using call_sv
+
+In all the previous examples I have 'hard-wired' the name of the Perl
+subroutine to be called from C. Most of the time though, it is more
+convenient to be able to specify the name of the Perl subroutine from
+within the Perl script.
+
+Consider the Perl code below
+
+ sub fred
+ {
+ print "Hello there\n";
+ }
+
+ CallSubPV("fred");
+
+Here is a snippet of XSUB which defines I<CallSubPV>.
+
+ void
+ CallSubPV(name)
+ char * name
+ CODE:
+ PUSHMARK(SP);
+ call_pv(name, G_DISCARD|G_NOARGS);
+
+That is fine as far as it goes. The thing is, the Perl subroutine
+can be specified as only a string. For Perl 4 this was adequate,
+but Perl 5 allows references to subroutines and anonymous subroutines.
+This is where I<call_sv> is useful.
+
+The code below for I<CallSubSV> is identical to I<CallSubPV> except
+that the C<name> parameter is now defined as an SV* and we use
+I<call_sv> instead of I<call_pv>.
+
+ void
+ CallSubSV(name)
+ SV * name
+ CODE:
+ PUSHMARK(SP);
+ call_sv(name, G_DISCARD|G_NOARGS);
+
+Because we are using an SV to call I<fred> the following can all be used
+
+ CallSubSV("fred");
+ CallSubSV(\&fred);
+ $ref = \&fred;
+ CallSubSV($ref);
+ CallSubSV( sub { print "Hello there\n" } );
+
+As you can see, I<call_sv> gives you much greater flexibility in
+how you can specify the Perl subroutine.
+
+You should note that if it is necessary to store the SV (C<name> in the
+example above) which corresponds to the Perl subroutine so that it can
+be used later in the program, it not enough just to store a copy of the
+pointer to the SV. Say the code above had been like this
+
+ static SV * rememberSub;
+
+ void
+ SaveSub1(name)
+ SV * name
+ CODE:
+ rememberSub = name;
+
+ void
+ CallSavedSub1()
+ CODE:
+ PUSHMARK(SP);
+ call_sv(rememberSub, G_DISCARD|G_NOARGS);
+
+The reason this is wrong is that by the time you come to use the
+pointer C<rememberSub> in C<CallSavedSub1>, it may or may not still refer
+to the Perl subroutine that was recorded in C<SaveSub1>. This is
+particularly true for these cases
+
+ SaveSub1(\&fred);
+ CallSavedSub1();
+
+ SaveSub1( sub { print "Hello there\n" } );
+ CallSavedSub1();
+
+By the time each of the C<SaveSub1> statements above have been executed,
+the SV*s which corresponded to the parameters will no longer exist.
+Expect an error message from Perl of the form
+
+ Can't use an undefined value as a subroutine reference at ...
+
+for each of the C<CallSavedSub1> lines.
+
+Similarly, with this code
+
+ $ref = \&fred;
+ SaveSub1($ref);
+ $ref = 47;
+ CallSavedSub1();
+
+you can expect one of these messages (which you actually get is dependent on
+the version of Perl you are using)
+
+ Not a CODE reference at ...
+ Undefined subroutine &main::47 called ...
+
+The variable $ref may have referred to the subroutine C<fred>
+whenever the call to C<SaveSub1> was made but by the time
+C<CallSavedSub1> gets called it now holds the number C<47>. Because we
+saved only a pointer to the original SV in C<SaveSub1>, any changes to
+$ref will be tracked by the pointer C<rememberSub>. This means that
+whenever C<CallSavedSub1> gets called, it will attempt to execute the
+code which is referenced by the SV* C<rememberSub>. In this case
+though, it now refers to the integer C<47>, so expect Perl to complain
+loudly.
+
+A similar but more subtle problem is illustrated with this code
+
+ $ref = \&fred;
+ SaveSub1($ref);
+ $ref = \&joe;
+ CallSavedSub1();
+
+This time whenever C<CallSavedSub1> get called it will execute the Perl
+subroutine C<joe> (assuming it exists) rather than C<fred> as was
+originally requested in the call to C<SaveSub1>.
+
+To get around these problems it is necessary to take a full copy of the
+SV. The code below shows C<SaveSub2> modified to do that
+
+ static SV * keepSub = (SV*)NULL;
+
+ void
+ SaveSub2(name)
+ SV * name
+ CODE:
+ /* Take a copy of the callback */
+ if (keepSub == (SV*)NULL)
+ /* First time, so create a new SV */
+ keepSub = newSVsv(name);
+ else
+ /* Been here before, so overwrite */
+ SvSetSV(keepSub, name);
+
+ void
+ CallSavedSub2()
+ CODE:
+ PUSHMARK(SP);
+ call_sv(keepSub, G_DISCARD|G_NOARGS);
+
+To avoid creating a new SV every time C<SaveSub2> is called,
+the function first checks to see if it has been called before. If not,
+then space for a new SV is allocated and the reference to the Perl
+subroutine, C<name> is copied to the variable C<keepSub> in one
+operation using C<newSVsv>. Thereafter, whenever C<SaveSub2> is called
+the existing SV, C<keepSub>, is overwritten with the new value using
+C<SvSetSV>.
+
+=head2 Using call_argv
+
+Here is a Perl subroutine which prints whatever parameters are passed
+to it.
+
+ sub PrintList
+ {
+ my(@list) = @_;
+
+ foreach (@list) { print "$_\n" }
+ }
+
+and here is an example of I<call_argv> which will call
+I<PrintList>.
+
+ static char * words[] = {"alpha", "beta", "gamma", "delta", NULL};
+
+ static void
+ call_PrintList()
+ {
+ dSP;
+
+ call_argv("PrintList", G_DISCARD, words);
+ }
+
+Note that it is not necessary to call C<PUSHMARK> in this instance.
+This is because I<call_argv> will do it for you.
+
+=head2 Using call_method
+
+Consider the following Perl code
+
+ {
+ package Mine;
+
+ sub new
+ {
+ my($type) = shift;
+ bless [@_]
+ }
+
+ sub Display
+ {
+ my ($self, $index) = @_;
+ print "$index: $$self[$index]\n";
+ }
+
+ sub PrintID
+ {
+ my($class) = @_;
+ print "This is Class $class version 1.0\n";
+ }
+ }
+
+It implements just a very simple class to manage an array. Apart from
+the constructor, C<new>, it declares methods, one static and one
+virtual. The static method, C<PrintID>, prints out simply the class
+name and a version number. The virtual method, C<Display>, prints out a
+single element of the array. Here is an all Perl example of using it.
+
+ $a = Mine->new('red', 'green', 'blue');
+ $a->Display(1);
+ Mine->PrintID;
+
+will print
+
+ 1: green
+ This is Class Mine version 1.0
+
+Calling a Perl method from C is fairly straightforward. The following
+things are required
+
+=over 5
+
+=item *
+
+a reference to the object for a virtual method or the name of the class
+for a static method.
+
+=item *
+
+the name of the method.
+
+=item *
+
+any other parameters specific to the method.
+
+=back
+
+Here is a simple XSUB which illustrates the mechanics of calling both
+the C<PrintID> and C<Display> methods from C.
+
+ void
+ call_Method(ref, method, index)
+ SV * ref
+ char * method
+ int index
+ CODE:
+ PUSHMARK(SP);
+ XPUSHs(ref);
+ XPUSHs(sv_2mortal(newSViv(index)));
+ PUTBACK;
+
+ call_method(method, G_DISCARD);
+
+ void
+ call_PrintID(class, method)
+ char * class
+ char * method
+ CODE:
+ PUSHMARK(SP);
+ XPUSHs(sv_2mortal(newSVpv(class, 0)));
+ PUTBACK;
+
+ call_method(method, G_DISCARD);
+
+
+So the methods C<PrintID> and C<Display> can be invoked like this
+
+ $a = Mine->new('red', 'green', 'blue');
+ call_Method($a, 'Display', 1);
+ call_PrintID('Mine', 'PrintID');
+
+The only thing to note is that in both the static and virtual methods,
+the method name is not passed via the stack--it is used as the first
+parameter to I<call_method>.
+
+=head2 Using GIMME_V
+
+Here is a trivial XSUB which prints the context in which it is
+currently executing.
+
+ void
+ PrintContext()
+ CODE:
+ I32 gimme = GIMME_V;
+ if (gimme == G_VOID)
+ printf ("Context is Void\n");
+ else if (gimme == G_SCALAR)
+ printf ("Context is Scalar\n");
+ else
+ printf ("Context is Array\n");
+
+and here is some Perl to test it
+
+ PrintContext;
+ $a = PrintContext;
+ @a = PrintContext;
+
+The output from that will be
+
+ Context is Void
+ Context is Scalar
+ Context is Array
+
+=head2 Using Perl to dispose of temporaries
+
+In the examples given to date, any temporaries created in the callback
+(i.e., parameters passed on the stack to the I<call_*> function or
+values returned via the stack) have been freed by one of these methods
+
+=over 5
+
+=item *
+
+specifying the G_DISCARD flag with I<call_*>.
+
+=item *
+
+explicitly disposed of using the C<ENTER>/C<SAVETMPS> -
+C<FREETMPS>/C<LEAVE> pairing.
+
+=back
+
+There is another method which can be used, namely letting Perl do it
+for you automatically whenever it regains control after the callback
+has terminated. This is done by simply not using the
+
+ ENTER;
+ SAVETMPS;
+ ...
+ FREETMPS;
+ LEAVE;
+
+sequence in the callback (and not, of course, specifying the G_DISCARD
+flag).
+
+If you are going to use this method you have to be aware of a possible
+memory leak which can arise under very specific circumstances. To
+explain these circumstances you need to know a bit about the flow of
+control between Perl and the callback routine.
+
+The examples given at the start of the document (an error handler and
+an event driven program) are typical of the two main sorts of flow
+control that you are likely to encounter with callbacks. There is a
+very important distinction between them, so pay attention.
+
+In the first example, an error handler, the flow of control could be as
+follows. You have created an interface to an external library.
+Control can reach the external library like this
+
+ perl --> XSUB --> external library
+
+Whilst control is in the library, an error condition occurs. You have
+previously set up a Perl callback to handle this situation, so it will
+get executed. Once the callback has finished, control will drop back to
+Perl again. Here is what the flow of control will be like in that
+situation
+
+ perl --> XSUB --> external library
+ ...
+ error occurs
+ ...
+ external library --> call_* --> perl
+ |
+ perl <-- XSUB <-- external library <-- call_* <----+
+
+After processing of the error using I<call_*> is completed,
+control reverts back to Perl more or less immediately.
+
+In the diagram, the further right you go the more deeply nested the
+scope is. It is only when control is back with perl on the extreme
+left of the diagram that you will have dropped back to the enclosing
+scope and any temporaries you have left hanging around will be freed.
+
+In the second example, an event driven program, the flow of control
+will be more like this
+
+ perl --> XSUB --> event handler
+ ...
+ event handler --> call_* --> perl
+ |
+ event handler <-- call_* <----+
+ ...
+ event handler --> call_* --> perl
+ |
+ event handler <-- call_* <----+
+ ...
+ event handler --> call_* --> perl
+ |
+ event handler <-- call_* <----+
+
+In this case the flow of control can consist of only the repeated
+sequence
+
+ event handler --> call_* --> perl
+
+for practically the complete duration of the program. This means that
+control may I<never> drop back to the surrounding scope in Perl at the
+extreme left.
+
+So what is the big problem? Well, if you are expecting Perl to tidy up
+those temporaries for you, you might be in for a long wait. For Perl
+to dispose of your temporaries, control must drop back to the
+enclosing scope at some stage. In the event driven scenario that may
+never happen. This means that as time goes on, your program will
+create more and more temporaries, none of which will ever be freed. As
+each of these temporaries consumes some memory your program will
+eventually consume all the available memory in your system--kapow!
+
+So here is the bottom line--if you are sure that control will revert
+back to the enclosing Perl scope fairly quickly after the end of your
+callback, then it isn't absolutely necessary to dispose explicitly of
+any temporaries you may have created. Mind you, if you are at all
+uncertain about what to do, it doesn't do any harm to tidy up anyway.
+
+
+=head2 Strategies for storing Callback Context Information
+
+
+Potentially one of the trickiest problems to overcome when designing a
+callback interface can be figuring out how to store the mapping between
+the C callback function and the Perl equivalent.
+
+To help understand why this can be a real problem first consider how a
+callback is set up in an all C environment. Typically a C API will
+provide a function to register a callback. This will expect a pointer
+to a function as one of its parameters. Below is a call to a
+hypothetical function C<register_fatal> which registers the C function
+to get called when a fatal error occurs.
+
+ register_fatal(cb1);
+
+The single parameter C<cb1> is a pointer to a function, so you must
+have defined C<cb1> in your code, say something like this
+
+ static void
+ cb1()
+ {
+ printf ("Fatal Error\n");
+ exit(1);
+ }
+
+Now change that to call a Perl subroutine instead
+
+ static SV * callback = (SV*)NULL;
+
+ static void
+ cb1()
+ {
+ dSP;
+
+ PUSHMARK(SP);
+
+ /* Call the Perl sub to process the callback */
+ call_sv(callback, G_DISCARD);
+ }
+
+
+ void
+ register_fatal(fn)
+ SV * fn
+ CODE:
+ /* Remember the Perl sub */
+ if (callback == (SV*)NULL)
+ callback = newSVsv(fn);
+ else
+ SvSetSV(callback, fn);
+
+ /* register the callback with the external library */
+ register_fatal(cb1);
+
+where the Perl equivalent of C<register_fatal> and the callback it
+registers, C<pcb1>, might look like this
+
+ # Register the sub pcb1
+ register_fatal(\&pcb1);
+
+ sub pcb1
+ {
+ die "I'm dying...\n";
+ }
+
+The mapping between the C callback and the Perl equivalent is stored in
+the global variable C<callback>.
+
+This will be adequate if you ever need to have only one callback
+registered at any time. An example could be an error handler like the
+code sketched out above. Remember though, repeated calls to
+C<register_fatal> will replace the previously registered callback
+function with the new one.
+
+Say for example you want to interface to a library which allows asynchronous
+file i/o. In this case you may be able to register a callback whenever
+a read operation has completed. To be of any use we want to be able to
+call separate Perl subroutines for each file that is opened. As it
+stands, the error handler example above would not be adequate as it
+allows only a single callback to be defined at any time. What we
+require is a means of storing the mapping between the opened file and
+the Perl subroutine we want to be called for that file.
+
+Say the i/o library has a function C<asynch_read> which associates a C
+function C<ProcessRead> with a file handle C<fh>--this assumes that it
+has also provided some routine to open the file and so obtain the file
+handle.
+
+ asynch_read(fh, ProcessRead)
+
+This may expect the C I<ProcessRead> function of this form
+
+ void
+ ProcessRead(fh, buffer)
+ int fh;
+ char * buffer;
+ {
+ ...
+ }
+
+To provide a Perl interface to this library we need to be able to map
+between the C<fh> parameter and the Perl subroutine we want called. A
+hash is a convenient mechanism for storing this mapping. The code
+below shows a possible implementation
+
+ static HV * Mapping = (HV*)NULL;
+
+ void
+ asynch_read(fh, callback)
+ int fh
+ SV * callback
+ CODE:
+ /* If the hash doesn't already exist, create it */
+ if (Mapping == (HV*)NULL)
+ Mapping = newHV();
+
+ /* Save the fh -> callback mapping */
+ hv_store(Mapping, (char*)&fh, sizeof(fh), newSVsv(callback), 0);
+
+ /* Register with the C Library */
+ asynch_read(fh, asynch_read_if);
+
+and C<asynch_read_if> could look like this
+
+ static void
+ asynch_read_if(fh, buffer)
+ int fh;
+ char * buffer;
+ {
+ dSP;
+ SV ** sv;
+
+ /* Get the callback associated with fh */
+ sv = hv_fetch(Mapping, (char*)&fh , sizeof(fh), FALSE);
+ if (sv == (SV**)NULL)
+ croak("Internal error...\n");
+
+ PUSHMARK(SP);
+ XPUSHs(sv_2mortal(newSViv(fh)));
+ XPUSHs(sv_2mortal(newSVpv(buffer, 0)));
+ PUTBACK;
+
+ /* Call the Perl sub */
+ call_sv(*sv, G_DISCARD);
+ }
+
+For completeness, here is C<asynch_close>. This shows how to remove
+the entry from the hash C<Mapping>.
+
+ void
+ asynch_close(fh)
+ int fh
+ CODE:
+ /* Remove the entry from the hash */
+ (void) hv_delete(Mapping, (char*)&fh, sizeof(fh), G_DISCARD);
+
+ /* Now call the real asynch_close */
+ asynch_close(fh);
+
+So the Perl interface would look like this
+
+ sub callback1
+ {
+ my($handle, $buffer) = @_;
+ }
+
+ # Register the Perl callback
+ asynch_read($fh, \&callback1);
+
+ asynch_close($fh);
+
+The mapping between the C callback and Perl is stored in the global
+hash C<Mapping> this time. Using a hash has the distinct advantage that
+it allows an unlimited number of callbacks to be registered.
+
+What if the interface provided by the C callback doesn't contain a
+parameter which allows the file handle to Perl subroutine mapping? Say
+in the asynchronous i/o package, the callback function gets passed only
+the C<buffer> parameter like this
+
+ void
+ ProcessRead(buffer)
+ char * buffer;
+ {
+ ...
+ }
+
+Without the file handle there is no straightforward way to map from the
+C callback to the Perl subroutine.
+
+In this case a possible way around this problem is to predefine a
+series of C functions to act as the interface to Perl, thus
+
+ #define MAX_CB 3
+ #define NULL_HANDLE -1
+ typedef void (*FnMap)();
+
+ struct MapStruct {
+ FnMap Function;
+ SV * PerlSub;
+ int Handle;
+ };
+
+ static void fn1();
+ static void fn2();
+ static void fn3();
+
+ static struct MapStruct Map [MAX_CB] =
+ {
+ { fn1, NULL, NULL_HANDLE },
+ { fn2, NULL, NULL_HANDLE },
+ { fn3, NULL, NULL_HANDLE }
+ };
+
+ static void
+ Pcb(index, buffer)
+ int index;
+ char * buffer;
+ {
+ dSP;
+
+ PUSHMARK(SP);
+ XPUSHs(sv_2mortal(newSVpv(buffer, 0)));
+ PUTBACK;
+
+ /* Call the Perl sub */
+ call_sv(Map[index].PerlSub, G_DISCARD);
+ }
+
+ static void
+ fn1(buffer)
+ char * buffer;
+ {
+ Pcb(0, buffer);
+ }
+
+ static void
+ fn2(buffer)
+ char * buffer;
+ {
+ Pcb(1, buffer);
+ }
+
+ static void
+ fn3(buffer)
+ char * buffer;
+ {
+ Pcb(2, buffer);
+ }
+
+ void
+ array_asynch_read(fh, callback)
+ int fh
+ SV * callback
+ CODE:
+ int index;
+ int null_index = MAX_CB;
+
+ /* Find the same handle or an empty entry */
+ for (index = 0; index < MAX_CB; ++index)
+ {
+ if (Map[index].Handle == fh)
+ break;
+
+ if (Map[index].Handle == NULL_HANDLE)
+ null_index = index;
+ }
+
+ if (index == MAX_CB && null_index == MAX_CB)
+ croak ("Too many callback functions registered\n");
+
+ if (index == MAX_CB)
+ index = null_index;
+
+ /* Save the file handle */
+ Map[index].Handle = fh;
+
+ /* Remember the Perl sub */
+ if (Map[index].PerlSub == (SV*)NULL)
+ Map[index].PerlSub = newSVsv(callback);
+ else
+ SvSetSV(Map[index].PerlSub, callback);
+
+ asynch_read(fh, Map[index].Function);
+
+ void
+ array_asynch_close(fh)
+ int fh
+ CODE:
+ int index;
+
+ /* Find the file handle */
+ for (index = 0; index < MAX_CB; ++ index)
+ if (Map[index].Handle == fh)
+ break;
+
+ if (index == MAX_CB)
+ croak ("could not close fh %d\n", fh);
+
+ Map[index].Handle = NULL_HANDLE;
+ SvREFCNT_dec(Map[index].PerlSub);
+ Map[index].PerlSub = (SV*)NULL;
+
+ asynch_close(fh);
+
+In this case the functions C<fn1>, C<fn2>, and C<fn3> are used to
+remember the Perl subroutine to be called. Each of the functions holds
+a separate hard-wired index which is used in the function C<Pcb> to
+access the C<Map> array and actually call the Perl subroutine.
+
+There are some obvious disadvantages with this technique.
+
+Firstly, the code is considerably more complex than with the previous
+example.
+
+Secondly, there is a hard-wired limit (in this case 3) to the number of
+callbacks that can exist simultaneously. The only way to increase the
+limit is by modifying the code to add more functions and then
+recompiling. None the less, as long as the number of functions is
+chosen with some care, it is still a workable solution and in some
+cases is the only one available.
+
+To summarize, here are a number of possible methods for you to consider
+for storing the mapping between C and the Perl callback
+
+=over 5
+
+=item 1. Ignore the problem - Allow only 1 callback
+
+For a lot of situations, like interfacing to an error handler, this may
+be a perfectly adequate solution.
+
+=item 2. Create a sequence of callbacks - hard wired limit
+
+If it is impossible to tell from the parameters passed back from the C
+callback what the context is, then you may need to create a sequence of C
+callback interface functions, and store pointers to each in an array.
+
+=item 3. Use a parameter to map to the Perl callback
+
+A hash is an ideal mechanism to store the mapping between C and Perl.
+
+=back
+
+
+=head2 Alternate Stack Manipulation
+
+
+Although I have made use of only the C<POP*> macros to access values
+returned from Perl subroutines, it is also possible to bypass these
+macros and read the stack using the C<ST> macro (See L<perlxs> for a
+full description of the C<ST> macro).
+
+Most of the time the C<POP*> macros should be adequate, the main
+problem with them is that they force you to process the returned values
+in sequence. This may not be the most suitable way to process the
+values in some cases. What we want is to be able to access the stack in
+a random order. The C<ST> macro as used when coding an XSUB is ideal
+for this purpose.
+
+The code below is the example given in the section I<Returning a list
+of values> recoded to use C<ST> instead of C<POP*>.
+
+ static void
+ call_AddSubtract2(a, b)
+ int a;
+ int b;
+ {
+ dSP;
+ I32 ax;
+ int count;
+
+ ENTER;
+ SAVETMPS;
+
+ PUSHMARK(SP);
+ XPUSHs(sv_2mortal(newSViv(a)));
+ XPUSHs(sv_2mortal(newSViv(b)));
+ PUTBACK;
+
+ count = call_pv("AddSubtract", G_ARRAY);
+
+ SPAGAIN;
+ SP -= count;
+ ax = (SP - PL_stack_base) + 1;
+
+ if (count != 2)
+ croak("Big trouble\n");
+
+ printf ("%d + %d = %d\n", a, b, SvIV(ST(0)));
+ printf ("%d - %d = %d\n", a, b, SvIV(ST(1)));
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+ }
+
+Notes
+
+=over 5
+
+=item 1.
+
+Notice that it was necessary to define the variable C<ax>. This is
+because the C<ST> macro expects it to exist. If we were in an XSUB it
+would not be necessary to define C<ax> as it is already defined for
+you.
+
+=item 2.
+
+The code
+
+ SPAGAIN;
+ SP -= count;
+ ax = (SP - PL_stack_base) + 1;
+
+sets the stack up so that we can use the C<ST> macro.
+
+=item 3.
+
+Unlike the original coding of this example, the returned
+values are not accessed in reverse order. So C<ST(0)> refers to the
+first value returned by the Perl subroutine and C<ST(count-1)>
+refers to the last.
+
+=back
+
+=head2 Creating and calling an anonymous subroutine in C
+
+As we've already shown, C<call_sv> can be used to invoke an
+anonymous subroutine. However, our example showed a Perl script
+invoking an XSUB to perform this operation. Let's see how it can be
+done inside our C code:
+
+ ...
+
+ SV *cvrv = eval_pv("sub { print 'You will not find me cluttering any namespace!' }", TRUE);
+
+ ...
+
+ call_sv(cvrv, G_VOID|G_NOARGS);
+
+C<eval_pv> is used to compile the anonymous subroutine, which
+will be the return value as well (read more about C<eval_pv> in
+L<perlapi/eval_pv>). Once this code reference is in hand, it
+can be mixed in with all the previous examples we've shown.
+
+=head1 LIGHTWEIGHT CALLBACKS
+
+Sometimes you need to invoke the same subroutine repeatedly.
+This usually happens with a function that acts on a list of
+values, such as Perl's built-in sort(). You can pass a
+comparison function to sort(), which will then be invoked
+for every pair of values that needs to be compared. The first()
+and reduce() functions from L<List::Util> follow a similar
+pattern.
+
+In this case it is possible to speed up the routine (often
+quite substantially) by using the lightweight callback API.
+The idea is that the calling context only needs to be
+created and destroyed once, and the sub can be called
+arbitrarily many times in between.
+
+It is usual to pass parameters using global variables -- typically
+$_ for one parameter, or $a and $b for two parameters -- rather
+than via @_. (It is possible to use the @_ mechanism if you know
+what you're doing, though there is as yet no supported API for
+it. It's also inherently slower.)
+
+The pattern of macro calls is like this:
+
+ dMULTICALL; /* Declare local variables */
+ I32 gimme = G_SCALAR; /* context of the call: G_SCALAR,
+ * G_LIST, or G_VOID */
+
+ PUSH_MULTICALL(cv); /* Set up the context for calling cv,
+ and set local vars appropriately */
+
+ /* loop */ {
+ /* set the value(s) af your parameter variables */
+ MULTICALL; /* Make the actual call */
+ } /* end of loop */
+
+ POP_MULTICALL; /* Tear down the calling context */
+
+For some concrete examples, see the implementation of the
+first() and reduce() functions of List::Util 1.18. There you
+will also find a header file that emulates the multicall API
+on older versions of perl.
+
+=head1 SEE ALSO
+
+L<perlxs>, L<perlguts>, L<perlembed>
+
+=head1 AUTHOR
+
+Paul Marquess
+
+Special thanks to the following people who assisted in the creation of
+the document.
+
+Jeff Okamoto, Tim Bunce, Nick Gianniotis, Steve Kelem, Gurusamy Sarathy
+and Larry Wall.
+
+=head1 DATE
+
+Version 1.3, 14th Apr 1997
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlce.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlce.pod
new file mode 100755
index 00000000000..25cef84af67
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlce.pod
@@ -0,0 +1,306 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+perlce - Perl for WinCE
+
+=head1 Building Perl for WinCE
+
+=head2 DESCRIPTION
+
+This file gives the instructions for building Perl5.8 and above for
+WinCE. Please read and understand the terms under which this
+software is distributed.
+
+=head2 General explanations on cross-compiling WinCE
+
+=over
+
+=item *
+
+C<miniperl> is built. This is a single executable (without DLL), intended
+to run on Win32, and it will facilitate remaining build process; all binaries
+built after it are foreign and should not run locally.
+
+C<miniperl> is built using C<./win32/Makefile>; this is part of normal
+build process invoked as dependency from wince/Makefile.ce
+
+=item *
+
+After C<miniperl> is built, C<configpm> is invoked to create right C<Config.pm>
+in right place and its corresponding Cross.pm.
+
+Unlike Win32 build, miniperl will not have C<Config.pm> of host within reach;
+it rather will use C<Config.pm> from within cross-compilation directories.
+
+File C<Cross.pm> is dead simple: for given cross-architecture places in @INC
+a path where perl modules are, and right C<Config.pm> in that place.
+
+That said, C<miniperl -Ilib -MConfig -we 1> should report an error, because
+it can not find C<Config.pm>. If it does not give an error -- wrong C<Config.pm>
+is substituted, and resulting binaries will be a mess.
+
+C<miniperl -MCross -MConfig -we 1> should run okay, and it will provide right
+C<Config.pm> for further compilations.
+
+=item *
+
+During extensions build phase, a script C<./win32/buldext.pl> is invoked,
+which in turn steps in C<./ext> subdirectories and performs a build of
+each extension in turn.
+
+All invokes of C<Makefile.PL> are provided with C<-MCross> so to enable cross-
+compile.
+
+=back
+
+=head2 BUILD
+
+This section describes the steps to be performed to build PerlCE.
+You may find additional information about building perl for WinCE
+at L<http://perlce.sourceforge.net> and some pre-built binaries.
+
+=head3 Tools & SDK
+
+For compiling, you need following:
+
+=over 4
+
+=item * Microsoft Embedded Visual Tools
+
+=item * Microsoft Visual C++
+
+=item * Rainer Keuchel's celib-sources
+
+=item * Rainer Keuchel's console-sources
+
+=back
+
+Needed source files can be downloaded at
+L<http://www.rainer-keuchel.de/wince/dirlist.html>
+
+=head3 Make
+
+Normally you only need to edit C<./win32/ce-helpers/compile.bat>
+to reflect your system and run it.
+
+File C<./win32/ce-helpers/compile.bat> is actually a wrapper to call
+C<nmake -f makefile.ce> with appropriate parameters and it accepts extra
+parameters and forwards them to C<nmake> command as additional
+arguments. You should pass target this way.
+
+To prepare distribution you need to do following:
+
+=over 4
+
+=item * go to C<./win32> subdirectory
+
+=item * edit file C<./win32/ce-helpers/compile.bat>
+
+=item * run
+ compile.bat
+
+=item * run
+ compile.bat dist
+
+=back
+
+C<Makefile.ce> has C<CROSS_NAME> macro, and it is used further to refer to
+your cross-compilation scheme. You could assign a name to it, but this
+is not necessary, because by default it is assigned after your machine
+configuration name, such as "wince-sh3-hpc-wce211", and this is enough
+to distinguish different builds at the same time. This option could be
+handy for several different builds on same platform to perform, say,
+threaded build. In a following example we assume that all required
+environment variables are set properly for C cross-compiler (a special
+*.bat file could fit perfectly to this purpose) and your C<compile.bat>
+has proper "MACHINE" parameter set, to, say, C<wince-mips-pocket-wce300>.
+
+ compile.bat
+ compile.bat dist
+ compile.bat CROSS_NAME=mips-wce300-thr "USE_ITHREADS=define" "USE_IMP_SYS=define" "USE_MULTI=define"
+ compile.bat CROSS_NAME=mips-wce300-thr "USE_ITHREADS=define" "USE_IMP_SYS=define" "USE_MULTI=define" dist
+
+If all goes okay and no errors during a build, you'll get two independent
+distributions: C<wince-mips-pocket-wce300> and C<mips-wce300-thr>.
+
+Target C<dist> prepares distribution file set. Target C<zipdist> performs
+same as C<dist> but additionally compresses distribution files into zip
+archive.
+
+NOTE: during a build there could be created a number (or one) of C<Config.pm>
+for cross-compilation ("foreign" C<Config.pm>) and those are hidden inside
+C<../xlib/$(CROSS_NAME)> with other auxilary files, but, and this is important to
+note, there should be B<no> C<Config.pm> for host miniperl.
+If you'll get an error that perl could not find Config.pm somewhere in building
+process this means something went wrong. Most probably you forgot to
+specify a cross-compilation when invoking miniperl.exe to Makefile.PL
+When building an extension for cross-compilation your command line should
+look like
+
+ ..\miniperl.exe -I..\lib -MCross=mips-wce300-thr Makefile.PL
+
+or just
+
+ ..\miniperl.exe -I..\lib -MCross Makefile.PL
+
+to refer a cross-compilation that was created last time.
+
+All questions related to building for WinCE devices could be asked in
+F<perlce-user@lists.sourceforge.net> mailing list.
+
+=head1 Using Perl on WinCE
+
+=head2 DESCRIPTION
+
+PerlCE is currently linked with a simple console window, so it also
+works on non-hpc devices.
+
+The simple stdio implementation creates the files C<stdin.txt>,
+C<stdout.txt> and C<stderr.txt>, so you might examine them if your
+console has only a liminted number of cols.
+
+When exitcode is non-zero, a message box appears, otherwise the
+console closes, so you might have to catch an exit with
+status 0 in your program to see any output.
+
+stdout/stderr now go into the files C</perl-stdout.txt> and
+C</perl-stderr.txt.>
+
+PerlIDE is handy to deal with perlce.
+
+=head2 LIMITATIONS
+
+No fork(), pipe(), popen() etc.
+
+=head2 ENVIRONMENT
+
+All environment vars must be stored in HKLM\Environment as
+strings. They are read at process startup.
+
+=over
+
+=item PERL5LIB
+
+Usual perl lib path (semi-list).
+
+=item PATH
+
+Semi-list for executables.
+
+=item TMP
+
+- Tempdir.
+
+=item UNIXROOTPATH
+
+- Root for accessing some special files, i.e. C</dev/null>, C</etc/services>.
+
+=item ROWS/COLS
+
+- Rows/cols for console.
+
+=item HOME
+
+- Home directory.
+
+=item CONSOLEFONTSIZE
+
+- Size for console font.
+
+=back
+
+You can set these with cereg.exe, a (remote) registry editor
+or via the PerlIDE.
+
+=head2 REGISTRY
+
+To start perl by clicking on a perl source file, you have
+to make the according entries in HKCR (see C<ce-helpers/wince-reg.bat>).
+cereg.exe (which must be executed on a desktop pc with
+ActiveSync) is reported not to work on some devices.
+You have to create the registry entries by hand using a
+registry editor.
+
+=head2 XS
+
+The following Win32-Methods are built-in:
+
+ newXS("Win32::GetCwd", w32_GetCwd, file);
+ newXS("Win32::SetCwd", w32_SetCwd, file);
+ newXS("Win32::GetTickCount", w32_GetTickCount, file);
+ newXS("Win32::GetOSVersion", w32_GetOSVersion, file);
+ newXS("Win32::IsWinNT", w32_IsWinNT, file);
+ newXS("Win32::IsWin95", w32_IsWin95, file);
+ newXS("Win32::IsWinCE", w32_IsWinCE, file);
+ newXS("Win32::CopyFile", w32_CopyFile, file);
+ newXS("Win32::Sleep", w32_Sleep, file);
+ newXS("Win32::MessageBox", w32_MessageBox, file);
+ newXS("Win32::GetPowerStatus", w32_GetPowerStatus, file);
+ newXS("Win32::GetOemInfo", w32_GetOemInfo, file);
+ newXS("Win32::ShellEx", w32_ShellEx, file);
+
+=head2 BUGS
+
+Opening files for read-write is currently not supported if
+they use stdio (normal perl file handles).
+
+If you find bugs or if it does not work at all on your
+device, send mail to the address below. Please report
+the details of your device (processor, ceversion,
+devicetype (hpc/palm/pocket)) and the date of the downloaded
+files.
+
+=head2 INSTALLATION
+
+Currently installation instructions are at L<http://perlce.sourceforge.net/>.
+
+After installation & testing processes will stabilize, information will
+be more precise.
+
+=head1 ACKNOWLEDGEMENTS
+
+The port for Win32 was used as a reference.
+
+=head1 History of WinCE port
+
+=over
+
+=item 5.6.0
+
+Initial port of perl to WinCE. It was performed in separate directory
+named C<wince>. This port was based on contents of C<./win32> directory.
+C<miniperl> was not built, user must have HOST perl and properly edit
+C<makefile.ce> to reflect this.
+
+=item 5.8.0
+
+wince port was kept in the same C<./wince> directory, and C<wince/Makefile.ce>
+was used to invoke native compiler to create HOST miniperl, which then
+facilitates cross-compiling process.
+Extension building support was added.
+
+=item 5.9.4
+
+Two directories C<./win32> and C<./wince> were merged, so perlce build
+process comes in C<./win32> directory.
+
+=back
+
+=head1 AUTHORS
+
+=over
+
+=item Rainer Keuchel <coyxc@rainer-keuchel.de>
+
+provided initial port of Perl, which appears to be most essential work, as
+it was a breakthrough on having Perl ported at all.
+Many thanks and obligations to Rainer!
+
+=item Vadim Konovalov
+
+made further support of WinCE port.
+
+=back
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlcheat.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlcheat.pod
new file mode 100755
index 00000000000..07853a8056d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlcheat.pod
@@ -0,0 +1,93 @@
+=head1 NAME
+
+perlcheat - Perl 5 Cheat Sheet
+
+=head1 DESCRIPTION
+
+This 'cheat sheet' is a handy reference, meant for beginning Perl
+programmers. Not everything is mentioned, but 195 features may
+already be overwhelming.
+
+=head2 The sheet
+
+ CONTEXTS SIGILS ARRAYS HASHES
+ void $scalar whole: @array %hash
+ scalar @array slice: @array[0, 2] @hash{'a', 'b'}
+ list %hash element: $array[0] $hash{'a'}
+ &sub
+ *glob SCALAR VALUES
+ number, string, reference, glob, undef
+ REFERENCES
+ \ references $$foo[1] aka $foo->[1]
+ $@%&* dereference $$foo{bar} aka $foo->{bar}
+ [] anon. arrayref ${$$foo[1]}[2] aka $foo->[1]->[2]
+ {} anon. hashref ${$$foo[1]}[2] aka $foo->[1][2]
+ \() list of refs
+ NUMBERS vs STRINGS LINKS
+ OPERATOR PRECEDENCE = = perl.plover.com
+ -> + . search.cpan.org
+ ++ -- == != eq ne cpan.org
+ ** < > <= >= lt gt le ge pm.org
+ ! ~ \ u+ u- <=> cmp tpj.com
+ =~ !~ perldoc.com
+ * / % x SYNTAX
+ + - . for (LIST) { }, for (a;b;c) { }
+ << >> while ( ) { }, until ( ) { }
+ named uops if ( ) { } elsif ( ) { } else { }
+ < > <= >= lt gt le ge unless ( ) { } elsif ( ) { } else { }
+ == != <=> eq ne cmp for equals foreach (ALWAYS)
+ &
+ | ^ REGEX METACHARS REGEX MODIFIERS
+ && ^ string begin /i case insens.
+ || $ str. end (before \n) /m line based ^$
+ .. ... + one or more /s . includes \n
+ ?: * zero or more /x ign. wh.space
+ = += -= *= etc. ? zero or one /g global
+ , => {3,7} repeat in range /o cmpl pat. once
+ list ops () capture
+ not (?:) no capture REGEX CHARCLASSES
+ and [] character class . == [^\n]
+ or xor | alternation \s == whitespace
+ \b word boundary \w == word characters
+ \z string end \d == digits
+ DO \S, \W and \D negate
+ use strict; DON'T
+ use warnings; "$foo" LINKS
+ my $var; $$variable_name perl.com
+ open() or die $!; `$userinput` use.perl.org
+ use Modules; /$userinput/ perl.apache.org
+
+ FUNCTION RETURN LISTS
+ stat localtime caller SPECIAL VARIABLES
+ 0 dev 0 second 0 package $_ default variable
+ 1 ino 1 minute 1 filename $0 program name
+ 2 mode 2 hour 2 line $/ input separator
+ 3 nlink 3 day 3 subroutine $\ output separator
+ 4 uid 4 month-1 4 hasargs $| autoflush
+ 5 gid 5 year-1900 5 wantarray $! sys/libcall error
+ 6 rdev 6 weekday 6 evaltext $@ eval error
+ 7 size 7 yearday 7 is_require $$ process ID
+ 8 atime 8 is_dst 8 hints $. line number
+ 9 mtime 9 bitmask @ARGV command line args
+ 10 ctime just use @INC include paths
+ 11 blksz POSIX:: 3..9 only @_ subroutine args
+ 12 blcks strftime! with EXPR %ENV environment
+
+=head1 ACKNOWLEDGEMENTS
+
+The first version of this document appeared on Perl Monks, where several
+people had useful suggestions. Thank you, Perl Monks.
+
+A special thanks to Damian Conway, who didn't only suggest important changes,
+but also took the time to count the number of listed features and make a
+Perl 6 version to show that Perl will stay Perl.
+
+=head1 AUTHOR
+
+Juerd Waalboer <#####@juerd.nl>, with the help of many Perl Monks.
+
+=head1 SEE ALSO
+
+ http://perlmonks.org/?node_id=216602 the original PM post
+ http://perlmonks.org/?node_id=238031 Damian Conway's Perl 6 version
+ http://juerd.nl/site.plp/perlcheat home of the Perl Cheat Sheet
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlclib.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlclib.pod
new file mode 100755
index 00000000000..39488f0fa67
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlclib.pod
@@ -0,0 +1,212 @@
+=head1 NAME
+
+perlclib - Internal replacements for standard C library functions
+
+=head1 DESCRIPTION
+
+One thing Perl porters should note is that F<perl> doesn't tend to use that
+much of the C standard library internally; you'll see very little use of,
+for example, the F<ctype.h> functions in there. This is because Perl
+tends to reimplement or abstract standard library functions, so that we
+know exactly how they're going to operate.
+
+This is a reference card for people who are familiar with the C library
+and who want to do things the Perl way; to tell them which functions
+they ought to use instead of the more normal C functions.
+
+=head2 Conventions
+
+In the following tables:
+
+=over 3
+
+=item C<t>
+
+is a type.
+
+=item C<p>
+
+is a pointer.
+
+=item C<n>
+
+is a number.
+
+=item C<s>
+
+is a string.
+
+=back
+
+C<sv>, C<av>, C<hv>, etc. represent variables of their respective types.
+
+=head2 File Operations
+
+Instead of the F<stdio.h> functions, you should use the Perl abstraction
+layer. Instead of C<FILE*> types, you need to be handling C<PerlIO*>
+types. Don't forget that with the new PerlIO layered I/O abstraction
+C<FILE*> types may not even be available. See also the C<perlapio>
+documentation for more information about the following functions:
+
+ Instead Of: Use:
+
+ stdin PerlIO_stdin()
+ stdout PerlIO_stdout()
+ stderr PerlIO_stderr()
+
+ fopen(fn, mode) PerlIO_open(fn, mode)
+ freopen(fn, mode, stream) PerlIO_reopen(fn, mode, perlio) (Deprecated)
+ fflush(stream) PerlIO_flush(perlio)
+ fclose(stream) PerlIO_close(perlio)
+
+=head2 File Input and Output
+
+ Instead Of: Use:
+
+ fprintf(stream, fmt, ...) PerlIO_printf(perlio, fmt, ...)
+
+ [f]getc(stream) PerlIO_getc(perlio)
+ [f]putc(stream, n) PerlIO_putc(perlio, n)
+ ungetc(n, stream) PerlIO_ungetc(perlio, n)
+
+Note that the PerlIO equivalents of C<fread> and C<fwrite> are slightly
+different from their C library counterparts:
+
+ fread(p, size, n, stream) PerlIO_read(perlio, buf, numbytes)
+ fwrite(p, size, n, stream) PerlIO_write(perlio, buf, numbytes)
+
+ fputs(s, stream) PerlIO_puts(perlio, s)
+
+There is no equivalent to C<fgets>; one should use C<sv_gets> instead:
+
+ fgets(s, n, stream) sv_gets(sv, perlio, append)
+
+=head2 File Positioning
+
+ Instead Of: Use:
+
+ feof(stream) PerlIO_eof(perlio)
+ fseek(stream, n, whence) PerlIO_seek(perlio, n, whence)
+ rewind(stream) PerlIO_rewind(perlio)
+
+ fgetpos(stream, p) PerlIO_getpos(perlio, sv)
+ fsetpos(stream, p) PerlIO_setpos(perlio, sv)
+
+ ferror(stream) PerlIO_error(perlio)
+ clearerr(stream) PerlIO_clearerr(perlio)
+
+=head2 Memory Management and String Handling
+
+ Instead Of: Use:
+
+ t* p = malloc(n) Newx(id, p, n, t)
+ t* p = calloc(n, s) Newxz(id, p, n, t)
+ p = realloc(p, n) Renew(p, n, t)
+ memcpy(dst, src, n) Copy(src, dst, n, t)
+ memmove(dst, src, n) Move(src, dst, n, t)
+ memcpy(dst, src, sizeof(t)) StructCopy(src, dst, t)
+ memset(dst, 0, n * sizeof(t)) Zero(dst, n, t)
+ memzero(dst, 0) Zero(dst, n, char)
+ free(p) Safefree(p)
+
+ strdup(p) savepv(p)
+ strndup(p, n) savepvn(p, n) (Hey, strndup doesn't exist!)
+
+ strstr(big, little) instr(big, little)
+ strcmp(s1, s2) strLE(s1, s2) / strEQ(s1, s2) / strGT(s1,s2)
+ strncmp(s1, s2, n) strnNE(s1, s2, n) / strnEQ(s1, s2, n)
+
+Notice the different order of arguments to C<Copy> and C<Move> than used
+in C<memcpy> and C<memmove>.
+
+Most of the time, though, you'll want to be dealing with SVs internally
+instead of raw C<char *> strings:
+
+ strlen(s) sv_len(sv)
+ strcpy(dt, src) sv_setpv(sv, s)
+ strncpy(dt, src, n) sv_setpvn(sv, s, n)
+ strcat(dt, src) sv_catpv(sv, s)
+ strncat(dt, src) sv_catpvn(sv, s)
+ sprintf(s, fmt, ...) sv_setpvf(sv, fmt, ...)
+
+Note also the existence of C<sv_catpvf> and C<sv_vcatpvfn>, combining
+concatenation with formatting.
+
+Sometimes instead of zeroing the allocated heap by using Newxz() you
+should consider "poisoning" the data. This means writing a bit
+pattern into it that should be illegal as pointers (and floating point
+numbers), and also hopefully surprising enough as integers, so that
+any code attempting to use the data without forethought will break
+sooner rather than later. Poisoning can be done using the Poison()
+macros, which have similar arguments as Zero():
+
+ PoisonWith(dst, n, t, b) scribble memory with byte b
+ PoisonNew(dst, n, t) equal to PoisonWith(dst, n, t, 0xAB)
+ PoisonFree(dst, n, t) equal to PoisonWith(dst, n, t, 0xEF)
+ Poison(dst, n, t) equal to PoisonFree(dst, n, t)
+
+=head2 Character Class Tests
+
+There are two types of character class tests that Perl implements: one
+type deals in C<char>s and are thus B<not> Unicode aware (and hence
+deprecated unless you B<know> you should use them) and the other type
+deal in C<UV>s and know about Unicode properties. In the following
+table, C<c> is a C<char>, and C<u> is a Unicode codepoint.
+
+ Instead Of: Use: But better use:
+
+ isalnum(c) isALNUM(c) isALNUM_uni(u)
+ isalpha(c) isALPHA(c) isALPHA_uni(u)
+ iscntrl(c) isCNTRL(c) isCNTRL_uni(u)
+ isdigit(c) isDIGIT(c) isDIGIT_uni(u)
+ isgraph(c) isGRAPH(c) isGRAPH_uni(u)
+ islower(c) isLOWER(c) isLOWER_uni(u)
+ isprint(c) isPRINT(c) isPRINT_uni(u)
+ ispunct(c) isPUNCT(c) isPUNCT_uni(u)
+ isspace(c) isSPACE(c) isSPACE_uni(u)
+ isupper(c) isUPPER(c) isUPPER_uni(u)
+ isxdigit(c) isXDIGIT(c) isXDIGIT_uni(u)
+
+ tolower(c) toLOWER(c) toLOWER_uni(u)
+ toupper(c) toUPPER(c) toUPPER_uni(u)
+
+=head2 F<stdlib.h> functions
+
+ Instead Of: Use:
+
+ atof(s) Atof(s)
+ atol(s) Atol(s)
+ strtod(s, &p) Nothing. Just don't use it.
+ strtol(s, &p, n) Strtol(s, &p, n)
+ strtoul(s, &p, n) Strtoul(s, &p, n)
+
+Notice also the C<grok_bin>, C<grok_hex>, and C<grok_oct> functions in
+F<numeric.c> for converting strings representing numbers in the respective
+bases into C<NV>s.
+
+In theory C<Strtol> and C<Strtoul> may not be defined if the machine perl is
+built on doesn't actually have strtol and strtoul. But as those 2
+functions are part of the 1989 ANSI C spec we suspect you'll find them
+everywhere by now.
+
+ int rand() double Drand01()
+ srand(n) { seedDrand01((Rand_seed_t)n);
+ PL_srand_called = TRUE; }
+
+ exit(n) my_exit(n)
+ system(s) Don't. Look at pp_system or use my_popen
+
+ getenv(s) PerlEnv_getenv(s)
+ setenv(s, val) my_putenv(s, val)
+
+=head2 Miscellaneous functions
+
+You should not even B<want> to use F<setjmp.h> functions, but if you
+think you do, use the C<JMPENV> stack in F<scope.h> instead.
+
+For C<signal>/C<sigaction>, use C<rsignal(signo, handler)>.
+
+=head1 SEE ALSO
+
+C<perlapi>, C<perlapio>, C<perlguts>
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlcn.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlcn.pod
new file mode 100755
index 00000000000..1fa5dce442d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlcn.pod
@@ -0,0 +1,150 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+The following documentation is written in EUC-CN encoding.
+
+Èç¹ûÄãÓÃÒ»°ãµÄÎÄ×ֱ༭Æ÷ÔÄÀÀÕâ·ÝÎļþ, ÇëºöÂÔÎÄÖÐÆæÌصÄ×¢¼Ç×Ö·û.
+Õâ·ÝÎļþÊÇÒÔ POD (¼òÃ÷Îļþ¸ñʽ) д³É; ÕâÖÖ¸ñʽÊÇΪÁËÄÜÈÃÈËÖ±½ÓÔĶÁ,
+¶øÌرðÉè¼ÆµÄ. ¹ØÓڴ˸ñʽµÄ½øÒ»²½ÐÅÏ¢, Çë²Î¿¼ perlpod ÏßÉÏÎļþ.
+
+=encoding euc-cn
+
+=head1 NAME
+
+perlcn - ¼òÌåÖÐÎÄ Perl Ö¸ÄÏ
+
+=head1 DESCRIPTION
+
+»¶Ó­À´µ½ Perl µÄÌìµØ!
+
+´Ó 5.8.0 °æ¿ªÊ¼, Perl ¾ß±¸ÁËÍêÉÆµÄ Unicode (ͳһÂë) Ö§Ô®,
+Ò²Á¬´øÖ§Ô®ÁËÐí¶àÀ­¶¡ÓïϵÒÔÍâµÄ±àÂ뷽ʽ; CJK (ÖÐÈÕº«) ±ãÊÇÆäÖеÄÒ»²¿·Ý.
+Unicode Êǹú¼ÊÐԵıê×¼, ÊÔͼº­¸ÇÊÀ½çÉÏËùÓеÄ×Ö·û: Î÷·½ÊÀ½ç, ¶«·½ÊÀ½ç,
+ÒÔ¼°Á½Õß¼äµÄÒ»ÇÐ (Ï£À°ÎÄ, ÐðÀûÑÇÎÄ, ÑÇÀ­²®ÎÄ, Ï£²®À´ÎÄ, Ó¡¶ÈÎÄ,
+Ó¡µØ°²ÎÄ, µÈµÈ). ËüÒ²ÈÝÄÉÁ˶àÖÖ×÷ҵϵͳÓëƽ̨ (Èç PC ¼°Âó½ðËþ).
+
+Perl ±¾ÉíÒÔ Unicode ½øÐвÙ×÷. Õâ±íʾ Perl ÄÚ²¿µÄ×Ö·û´®Êý¾Ý¿ÉÓà Unicode
+±íʾ; Perl µÄº¯Ê½ÓëËã·û (ÀýÈçÕý¹æ±íʾʽ±È¶Ô) Ò²ÄÜ¶Ô Unicode ½øÐвÙ×÷.
+ÔÚÊäÈë¼°Êä³öʱ, ΪÁË´¦ÀíÒÔ Unicode ֮ǰµÄ±àÂ뷽ʽ´æ·ÅµÄÊý¾Ý, Perl
+ÌṩÁË Encode Õâ¸öÄ£¿é, ¿ÉÒÔÈÃÄãÇáÒ׵ضÁÈ¡¼°Ð´Èë¾ÉÓеıàÂëÊý¾Ý.
+
+Encode ÑÓÉìÄ£¿éÖ§Ô®ÏÂÁмòÌåÖÐÎĵıàÂ뷽ʽ ('gb2312' ±íʾ 'euc-cn'):
+
+ euc-cn Unix ÑÓÉì×Ö·û¼¯, Ò²¾ÍÊÇË׳ƵĹú±êÂë
+ gb2312-raw δ¾­´¦ÀíµÄ (µÍ±ÈÌØ) GB2312 ×Ö·û±í
+ gb12345 δ¾­´¦ÀíµÄÖйúÓ÷±ÌåÖÐÎıàÂë
+ iso-ir-165 GB2312 + GB6345 + GB8565 + ÐÂÔö×Ö·û
+ cp936 ×ÖÂëÒ³ 936, Ò²¿ÉÒÔÓà 'GBK' (À©³ä¹ú±êÂë) Ö¸Ã÷
+ hz 7 ±ÈÌØÒݳöʽ GB2312 ±àÂë
+
+¾ÙÀýÀ´Ëµ, ½« EUC-CN ±àÂëµÄµµ°¸×ª³É Unicode, ìóÐè¼üÈëÏÂÁÐÖ¸Áî:
+
+ perl -Mencoding=euc-cn,STDOUT,utf8 -pe1 < file.euc-cn > file.utf8
+
+Perl Ò²ÄÚ¸½ÁË "piconv", Ò»Ö§ÍêÈ«ÒÔ Perl д³ÉµÄ×Ö·ûת»»¹¤¾ß³ÌÐò, Ó÷¨ÈçÏÂ:
+
+ piconv -f euc-cn -t utf8 < file.euc-cn > file.utf8
+ piconv -f utf8 -t euc-cn < file.utf8 > file.euc-cn
+
+ÁíÍâ, ÀûÓà encoding Ä£¿é, Äã¿ÉÒÔÇáÒ×д³öÒÔ×Ö·ûΪµ¥Î»µÄ³ÌÐòÂë, ÈçÏÂËùʾ:
+
+ #!/usr/bin/env perl
+ # Æô¶¯ euc-cn ×Ö´®½âÎö; ±ê×¼Êä³öÈë¼°±ê×¼´íÎó¶¼ÉèΪ euc-cn ±àÂë
+ use encoding 'euc-cn', STDIN => 'euc-cn', STDOUT => 'euc-cn';
+ print length("ÂæÍÕ"); # 2 (Ë«ÒýºÅ±íʾ×Ö·û)
+ print length('ÂæÍÕ'); # 4 (µ¥ÒýºÅ±íʾ×Ö½Ú)
+ print index("×»×»½Ì»å", "»×»½"); # -1 (²»°üº¬´Ë×Ó×Ö·û´®)
+ print index('×»×»½Ì»å', '»×»½'); # 1 (´ÓµÚ¶þ¸ö×Ö½Ú¿ªÊ¼)
+
+ÔÚ×îºóÒ»ÁÐÀý×ÓÀï, "×»" µÄµÚ¶þ¸ö×Ö½ÚÓë "×»" µÄµÚÒ»¸ö×Ö½Ú½áºÏ³É EUC-CN
+ÂëµÄ "»×"; "×»" µÄµÚ¶þ¸ö×Ö½ÚÔòÓë "½Ì" µÄµÚÒ»¸ö×Ö½Ú½áºÏ³É "»½".
+Õâ½â¾öÁËÒÔÇ° EUC-CN Âë±È¶Ô´¦ÀíÉϳ£¼ûµÄÎÊÌâ.
+
+=head2 ¶îÍâµÄÖÐÎıàÂë
+
+Èç¹ûÐèÒª¸ü¶àµÄÖÐÎıàÂë, ¿ÉÒÔ´Ó CPAN (L<http://www.cpan.org/>) ÏÂÔØ
+Encode::HanExtra Ä£¿é. ËüÄ¿Ç°ÌṩÏÂÁбàÂ뷽ʽ:
+
+ gb18030 À©³ä¹ýµÄ¹ú±êÂë, °üº¬·±ÌåÖÐÎÄ
+
+ÁíÍâ, Encode::HanConvert Ä£¿éÔòÌṩÁ˼ò·±×ª»»ÓõÄÁ½ÖÖ±àÂë:
+
+ big5-simp Big5 ·±ÌåÖÐÎÄÓë Unicode ¼òÌåÖÐÎÄ»¥×ª
+ gbk-trad GBK ¼òÌåÖÐÎÄÓë Unicode ·±ÌåÖÐÎÄ»¥×ª
+
+ÈôÏëÔÚ GBK Óë Big5 Ö®¼ä»¥×ª, Çë²Î¿¼¸ÃÄ£¿éÄÚ¸½µÄ b2g.pl Óë g2b.pl Á½Ö§³ÌÐò,
+»òÔÚ³ÌÐòÄÚʹÓÃÏÂÁÐд·¨:
+
+ use Encode::HanConvert;
+ $euc_cn = big5_to_gb($big5); # ´Ó Big5 תΪ GBK
+ $big5 = gb_to_big5($euc_cn); # ´Ó GBK תΪ Big5
+
+=head2 ½øÒ»²½µÄÐÅÏ¢
+
+Çë²Î¿¼ Perl ÄÚ¸½µÄ´óÁ¿ËµÃ÷Îļþ (²»ÐÒÈ«ÊÇÓÃÓ¢ÎÄдµÄ), À´Ñ§Ï°¸ü¶à¹ØÓÚ
+Perl µÄ֪ʶ, ÒÔ¼° Unicode µÄʹÓ÷½Ê½. ²»¹ý, ÍⲿµÄ×ÊÔ´Ï൱·á¸»:
+
+=head2 Ìṩ Perl ×ÊÔ´µÄÍøÖ·
+
+=over 4
+
+=item L<http://www.perl.com/>
+
+Perl µÄÊ×Ò³ (ÓÉÅ·À³Àñ¹«Ë¾Î¬»¤)
+
+=item L<http://www.cpan.org/>
+
+Perl ×ۺϵä²ØÍø (Comprehensive Perl Archive Network)
+
+=item L<http://lists.perl.org/>
+
+Perl ÓʵÝÂÛ̳һÀÀ
+
+=back
+
+=head2 ѧϰ Perl µÄÍøÖ·
+
+=over 4
+
+=item L<http://www.oreilly.com.cn/html/perl.html>
+
+¼òÌåÖÐÎÄ°æµÄÅ·À³Àñ Perl Êé½å
+
+=back
+
+=head2 Perl ʹÓÃÕß¼¯»á
+
+=over 4
+
+=item L<http://www.pm.org/groups/asia.html>
+
+Öйú Perl Íƹã×éÒ»ÀÀ
+
+=back
+
+=head2 Unicode Ïà¹ØÍøÖ·
+
+=over 4
+
+=item L<http://www.unicode.org/>
+
+Unicode ѧÊõѧ»á (Unicode ±ê×¼µÄÖƶ¨Õß)
+
+=item L<http://www.cl.cam.ac.uk/%7Emgk25/unicode.html>
+
+Unix/Linux É쵀 UTF-8 ¼° Unicode ´ð¿ÍÎÊ
+
+=back
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::CN>, L<encoding>, L<perluniintro>, L<perlunicode>
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi E<lt>jhi@iki.fiE<gt>
+
+Audrey Tang (ÌÆ·ï) E<lt>audreyt@audreyt.orgE<gt>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlcommunity.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlcommunity.pod
new file mode 100755
index 00000000000..48076a4398f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlcommunity.pod
@@ -0,0 +1,158 @@
+=head1 NAME
+
+perlcommunity - a brief overview of the Perl community
+
+=head1 DESCRIPTION
+
+This document aims to provide an overview of the vast perl community, which is
+far too large and diverse to provide a detailed listing. If any specific niche
+has been forgotten, it is not meant as an insult but an omission for the sake
+of brevity.
+
+The Perl community is as diverse as Perl, and there is a large amount of
+evidence that the Perl users apply TMTOWTDI to all endeavors, not just
+programming. From websites, to IRC, to mailing lists, there is more than one
+way to get involved in the community.
+
+=head2 Where to find the community
+
+There is a central directory for the Perl community: L<http://perl.org>
+maintained by the Perl Foundation (L<http://www.perlfoundation.org/>),
+which tracks and provides services for a variety of other community sites.
+
+=head2 Mailing lists and Newsgroups
+
+Perl runs on e-mail, there is no doubt about it. The Camel book was originally
+written mostly over e-mail and today Perl's development is co-ordinated through
+mailing lists. The largest repository of Perl mailing lists is located at
+L<http://lists.perl.org>.
+
+Most Perl-related projects set up mailing lists for both users and
+contributors. If you don't see a certain project listed at
+L<http://lists.perl.org>, check the particular website for that project.
+Most mailing lists are archived at L<http://nntp.perl.org/>.
+
+There are also plenty of Perl related newsgroups located under
+C<comp.lang.perl.*>.
+
+=head2 IRC
+
+The Perl community has a rather large IRC presence. For starters, it has its
+own IRC network, L<irc://irc.perl.org>. General (not help-oriented) chat can be
+found at L<irc://irc.perl.org/#perl>. Many other more specific chats are also
+hosted on the network. Information about irc.perl.org is located on the
+network's website: L<http://www.irc.perl.org>. For a more help oriented #perl,
+check out L<irc://irc.freenode.net/#perl>. Perl 6 development also has a
+presence in L<irc://irc.freenode.net/#perl6>. Most Perl-related channels will
+be kind enough to point you in the right direction if you ask nicely.
+
+Any large IRC network (Dalnet, EFnet) is also likely to have a #perl channel,
+with varying activity levels.
+
+=head2 Websites
+
+Perl websites come in a variety of forms, but they fit into two large
+categories: forums and news websites. There are many Perl related
+websites, so only a few of the community's largest are mentioned here.
+
+=head3 News sites
+
+=over 4
+
+=item L<http://perl.com/>
+
+Run by O'Reilly Media (The publisher of L<the Camel Book|perlbook> among other
+Perl-related literature), perl.com provides current Perl news, articles, and
+resources for Perl developers as well as a directory of other useful websites.
+
+=item L<http://use.perl.org/>
+
+use Perl; provides a slashdot-style Perl news website covering all things Perl,
+from minutes of the meetings of the Perl 6 Design team to conference
+announcements with (ir)relevant discussion.
+
+=back
+
+=head3 Forums
+
+=over 4
+
+=item L<http://www.perlmonks.org/>
+
+PerlMonks is one of the largest Perl forums, and describes itself as "A place
+for individuals to polish, improve, and showcase their Perl skills." and "A
+community which allows everyone to grow and learn from each other."
+
+=back
+
+=head2 User Groups
+
+Many cities around the world have local Perl Mongers chapters. A Perl Mongers
+chapter is a local user group which typically holds regular in-person meetings,
+both social and technical; helps organize local conferences, workshops, and
+hackathons; and provides a mailing list or other continual contact method for
+its members to keep in touch.
+
+To find your local Perl Mongers (or PM as they're commonly abbreviated) group
+check the international Perl Mongers directory at L<http://www.pm.org/>.
+
+=head2 Workshops
+
+Perl workshops are, as the name might suggest, workshops where Perl is taught
+in a variety of ways. At the workshops, subjects range from a beginner's
+introduction (such as the Pittsburgh Perl Workshop's "Zero To Perl") to much
+more advanced subjects.
+
+There are several great resources for locating workshops: the
+L<websites|"Websites"> mentioned above, the
+L<calendar|"Calendar of Perl Events"> mentioned below, and the YAPC Europe
+website, L<http://www.yapceurope.org/>, which is probably the best resource for
+European Perl events.
+
+=head2 Hackathons
+
+Hackathons are a very different kind of gathering where Perl hackers gather to
+do just that, hack nonstop for an extended (several day) period on a specific
+project or projects. Information about hackathons can be located in the same
+place as information about L<workshops|"Workshops"> as well as in
+L<irc://irc.perl.org/#perl>.
+
+If you have never been to a hackathon, here are a few basic things you need to
+know before attending: have a working laptop and know how to use it; check out
+the involved projects before hand; have the necessary version control client;
+and bring backup equipment (an extra LAN cable, additional power strips, etc.)
+because someone will forget.
+
+=head2 Conventions
+
+Perl has two major annual conventions: The Perl Conference (now part of OSCON),
+put on by O'Reilly, and Yet Another Perl Conference or YAPC (pronounced
+yap-see), which is localized into several regional YAPCs (North America,
+Europe, Asia) in a stunning grassroots display by the Perl community. For more
+information about either conference, check out their respective web pages:
+OSCON L<http://conferences.oreillynet.com/>; YAPC L<http://www.yapc.org>.
+
+A relatively new conference franchise with a large Perl portion is the
+Open Source Developers Conference or OSDC. First held in Australia it has
+recently also spread to Israel. More information can be found at:
+L<http://www.osdc.com.au/> for Australia, and L<http://www.osdc.org.il>
+for Israel.
+
+=head2 Calendar of Perl Events
+
+The Perl Review, L<http://www.theperlreview.com> maintains a website
+and Google calendar
+(L<http://www.theperlreview.com/community_calendar>) for tracking
+workshops, hackathons, Perl Mongers meetings, and other events. Views
+of this calendar are at L<http://www.perl.org/events.html> and
+L<http://www.yapc.org>.
+
+Not every event or Perl Mongers group is on that calendar, so don't lose
+heart if you don't see yours posted. To have your event or group listed,
+contact brian d foy (brian@theperlreview.com).
+
+=head1 AUTHOR
+
+Edgar "Trizor" Bering <trizor@gmail.com>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlcompile.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlcompile.pod
new file mode 100755
index 00000000000..505ce68384f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlcompile.pod
@@ -0,0 +1,293 @@
+=head1 NAME
+
+perlcompile - Introduction to the Perl Compiler-Translator
+
+=head1 DESCRIPTION
+
+Perl has always had a compiler: your source is compiled into an
+internal form (a parse tree) which is then optimized before being
+run. Since version 5.005, Perl has shipped with a module
+capable of inspecting the optimized parse tree (C<B>), and this has
+been used to write many useful utilities, including a module that lets
+you turn your Perl into C source code that can be compiled into a
+native executable.
+
+The C<B> module provides access to the parse tree, and other modules
+("back ends") do things with the tree. Some write it out as
+semi-human-readable text. Another traverses the parse tree to build a
+cross-reference of which subroutines, formats, and variables are used
+where. Another checks your code for dubious constructs. Yet another back
+end dumps the parse tree back out as Perl source, acting as a source code
+beautifier or deobfuscator.
+
+Because its original purpose was to be a way to produce C code
+corresponding to a Perl program, and in turn a native executable, the
+C<B> module and its associated back ends are known as "the
+compiler", even though they don't really compile anything.
+Different parts of the compiler are more accurately a "translator",
+or an "inspector", but people want Perl to have a "compiler
+option" not an "inspector gadget". What can you do?
+
+This document covers the use of the Perl compiler: which modules
+it comprises, how to use the most important of the back end modules,
+what problems there are, and how to work around them.
+
+=head2 Layout
+
+The compiler back ends are in the C<B::> hierarchy, and the front-end
+(the module that you, the user of the compiler, will sometimes
+interact with) is the O module.
+
+Here are the important back ends to know about, with their status
+expressed as a number from 0 (outline for later implementation) to
+10 (if there's a bug in it, we're very surprised):
+
+=over 4
+
+=item B::Lint
+
+Complains if it finds dubious constructs in your source code. Status:
+6 (it works adequately, but only has a very limited number of areas
+that it checks).
+
+=item B::Deparse
+
+Recreates the Perl source, making an attempt to format it coherently.
+Status: 8 (it works nicely, but a few obscure things are missing).
+
+=item B::Xref
+
+Reports on the declaration and use of subroutines and variables.
+Status: 8 (it works nicely, but still has a few lingering bugs).
+
+=back
+
+=head1 Using The Back Ends
+
+The following sections describe how to use the various compiler back
+ends. They're presented roughly in order of maturity, so that the
+most stable and proven back ends are described first, and the most
+experimental and incomplete back ends are described last.
+
+The O module automatically enabled the B<-c> flag to Perl, which
+prevents Perl from executing your code once it has been compiled.
+This is why all the back ends print:
+
+ myperlprogram syntax OK
+
+before producing any other output.
+
+=head2 The Cross Referencing Back End
+
+The cross referencing back end (B::Xref) produces a report on your program,
+breaking down declarations and uses of subroutines and variables (and
+formats) by file and subroutine. For instance, here's part of the
+report from the I<pod2man> program that comes with Perl:
+
+ Subroutine clear_noremap
+ Package (lexical)
+ $ready_to_print i1069, 1079
+ Package main
+ $& 1086
+ $. 1086
+ $0 1086
+ $1 1087
+ $2 1085, 1085
+ $3 1085, 1085
+ $ARGV 1086
+ %HTML_Escapes 1085, 1085
+
+This shows the variables used in the subroutine C<clear_noremap>. The
+variable C<$ready_to_print> is a my() (lexical) variable,
+B<i>ntroduced (first declared with my()) on line 1069, and used on
+line 1079. The variable C<$&> from the main package is used on 1086,
+and so on.
+
+A line number may be prefixed by a single letter:
+
+=over 4
+
+=item i
+
+Lexical variable introduced (declared with my()) for the first time.
+
+=item &
+
+Subroutine or method call.
+
+=item s
+
+Subroutine defined.
+
+=item r
+
+Format defined.
+
+=back
+
+The most useful option the cross referencer has is to save the report
+to a separate file. For instance, to save the report on
+I<myperlprogram> to the file I<report>:
+
+ $ perl -MO=Xref,-oreport myperlprogram
+
+=head2 The Decompiling Back End
+
+The Deparse back end turns your Perl source back into Perl source. It
+can reformat along the way, making it useful as a deobfuscator. The
+most basic way to use it is:
+
+ $ perl -MO=Deparse myperlprogram
+
+You'll notice immediately that Perl has no idea of how to paragraph
+your code. You'll have to separate chunks of code from each other
+with newlines by hand. However, watch what it will do with
+one-liners:
+
+ $ perl -MO=Deparse -e '$op=shift||die "usage: $0
+ code [...]";chomp(@ARGV=<>)unless@ARGV; for(@ARGV){$was=$_;eval$op;
+ die$@ if$@; rename$was,$_ unless$was eq $_}'
+ -e syntax OK
+ $op = shift @ARGV || die("usage: $0 code [...]");
+ chomp(@ARGV = <ARGV>) unless @ARGV;
+ foreach $_ (@ARGV) {
+ $was = $_;
+ eval $op;
+ die $@ if $@;
+ rename $was, $_ unless $was eq $_;
+ }
+
+The decompiler has several options for the code it generates. For
+instance, you can set the size of each indent from 4 (as above) to
+2 with:
+
+ $ perl -MO=Deparse,-si2 myperlprogram
+
+The B<-p> option adds parentheses where normally they are omitted:
+
+ $ perl -MO=Deparse -e 'print "Hello, world\n"'
+ -e syntax OK
+ print "Hello, world\n";
+ $ perl -MO=Deparse,-p -e 'print "Hello, world\n"'
+ -e syntax OK
+ print("Hello, world\n");
+
+See L<B::Deparse> for more information on the formatting options.
+
+=head2 The Lint Back End
+
+The lint back end (B::Lint) inspects programs for poor style. One
+programmer's bad style is another programmer's useful tool, so options
+let you select what is complained about.
+
+To run the style checker across your source code:
+
+ $ perl -MO=Lint myperlprogram
+
+To disable context checks and undefined subroutines:
+
+ $ perl -MO=Lint,-context,-undefined-subs myperlprogram
+
+See L<B::Lint> for information on the options.
+
+=head1 Module List for the Compiler Suite
+
+=over 4
+
+=item B
+
+This module is the introspective ("reflective" in Java terms)
+module, which allows a Perl program to inspect its innards. The
+back end modules all use this module to gain access to the compiled
+parse tree. You, the user of a back end module, will not need to
+interact with B.
+
+=item O
+
+This module is the front-end to the compiler's back ends. Normally
+called something like this:
+
+ $ perl -MO=Deparse myperlprogram
+
+This is like saying C<use O 'Deparse'> in your Perl program.
+
+=item B::Concise
+
+This module prints a concise (but complete) version of the Perl parse
+tree. Its output is more customizable than the one of B::Terse or
+B::Debug (and it can emulate them). This module useful for people who
+are writing their own back end, or who are learning about the Perl
+internals. It's not useful to the average programmer.
+
+=item B::Debug
+
+This module dumps the Perl parse tree in verbose detail to STDOUT.
+It's useful for people who are writing their own back end, or who
+are learning about the Perl internals. It's not useful to the
+average programmer.
+
+=item B::Deparse
+
+This module produces Perl source code from the compiled parse tree.
+It is useful in debugging and deconstructing other people's code,
+also as a pretty-printer for your own source. See
+L</"The Decompiling Back End"> for details about usage.
+
+=item B::Lint
+
+This module inspects the compiled form of your source code for things
+which, while some people frown on them, aren't necessarily bad enough
+to justify a warning. For instance, use of an array in scalar context
+without explicitly saying C<scalar(@array)> is something that Lint
+can identify. See L</"The Lint Back End"> for details about usage.
+
+=item B::Showlex
+
+This module prints out the my() variables used in a function or a
+file. To get a list of the my() variables used in the subroutine
+mysub() defined in the file myperlprogram:
+
+ $ perl -MO=Showlex,mysub myperlprogram
+
+To get a list of the my() variables used in the file myperlprogram:
+
+ $ perl -MO=Showlex myperlprogram
+
+[BROKEN]
+
+=item B::Terse
+
+This module prints the contents of the parse tree, but without as much
+information as B::Debug. For comparison, C<print "Hello, world.">
+produced 96 lines of output from B::Debug, but only 6 from B::Terse.
+
+This module is useful for people who are writing their own back end,
+or who are learning about the Perl internals. It's not useful to the
+average programmer.
+
+=item B::Xref
+
+This module prints a report on where the variables, subroutines, and
+formats are defined and used within a program and the modules it
+loads. See L</"The Cross Referencing Back End"> for details about
+usage.
+
+=back
+
+=head1 KNOWN PROBLEMS
+
+BEGIN{} blocks are executed while compiling your code. Any external
+state that is initialized in BEGIN{}, such as opening files, initiating
+database connections etc., do not behave properly. To work around
+this, Perl has an INIT{} block that corresponds to code being executed
+before your program begins running but after your program has finished
+being compiled. Execution order: BEGIN{}, (possible save of state
+through compiler back-end), INIT{}, program runs, END{}.
+
+=head1 AUTHOR
+
+This document was originally written by Nathan Torkington, and is now
+maintained by the perl5-porters mailing list
+I<perl5-porters@perl.org>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlcygwin.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlcygwin.pod
new file mode 100755
index 00000000000..1876f99a4a1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlcygwin.pod
@@ -0,0 +1,784 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.cygwin - Perl for Cygwin
+
+=head1 SYNOPSIS
+
+This document will help you configure, make, test and install Perl
+on Cygwin. This document also describes features of Cygwin that will
+affect how Perl behaves at runtime.
+
+B<NOTE:> There are pre-built Perl packages available for Cygwin and a
+version of Perl is provided in the normal Cygwin install. If you do
+not need to customize the configuration, consider using one of those
+packages.
+
+
+=head1 PREREQUISITES FOR COMPILING PERL ON CYGWIN
+
+=head2 Cygwin = GNU+Cygnus+Windows (Don't leave UNIX without it)
+
+The Cygwin tools are ports of the popular GNU development tools for Win32
+platforms. They run thanks to the Cygwin library which provides the UNIX
+system calls and environment these programs expect. More information
+about this project can be found at:
+
+ F<http://www.cygwin.com/>
+
+A recent net or commercial release of Cygwin is required.
+
+At the time this document was last updated, Cygwin 1.5.24 was current.
+
+
+=head2 Cygwin Configuration
+
+While building Perl some changes may be necessary to your Cygwin setup so
+that Perl builds cleanly. These changes are B<not> required for normal
+Perl usage.
+
+B<NOTE:> The binaries that are built will run on all Win32 versions.
+They do not depend on your host system (Win9x/WinME, WinNT/Win2K)
+or your Cygwin configuration (I<ntea>, I<ntsec>, binary/text mounts).
+The only dependencies come from hard-coded pathnames like C</usr/local>.
+However, your host system and Cygwin configuration will affect Perl's
+runtime behavior (see L</"TEST">).
+
+=over 4
+
+=item * C<PATH>
+
+Set the C<PATH> environment variable so that Configure finds the Cygwin
+versions of programs. Any Windows directories should be removed or
+moved to the end of your C<PATH>.
+
+=item * I<nroff>
+
+If you do not have I<nroff> (which is part of the I<groff> package),
+Configure will B<not> prompt you to install I<man> pages.
+
+=item * Permissions
+
+On WinNT with either the I<ntea> or I<ntsec> C<CYGWIN> settings, directory
+and file permissions may not be set correctly. Since the build process
+creates directories and files, to be safe you may want to run a
+C<chmod -R +w *> on the entire Perl source tree.
+
+Also, it is a well known WinNT "feature" that files created by a login
+that is a member of the I<Administrators> group will be owned by the
+I<Administrators> group. Depending on your umask, you may find that you
+can not write to files that you just created (because you are no longer
+the owner). When using the I<ntsec> C<CYGWIN> setting, this is not an
+issue because it "corrects" the ownership to what you would expect on
+a UNIX system.
+
+=back
+
+=head1 CONFIGURE PERL ON CYGWIN
+
+The default options gathered by Configure with the assistance of
+F<hints/cygwin.sh> will build a Perl that supports dynamic loading
+(which requires a shared F<libperl.dll>).
+
+This will run Configure and keep a record:
+
+ ./Configure 2>&1 | tee log.configure
+
+If you are willing to accept all the defaults run Configure with B<-de>.
+However, several useful customizations are available.
+
+=head2 Stripping Perl Binaries on Cygwin
+
+It is possible to strip the EXEs and DLLs created by the build process.
+The resulting binaries will be significantly smaller. If you want the
+binaries to be stripped, you can either add a B<-s> option when Configure
+prompts you,
+
+ Any additional ld flags (NOT including libraries)? [none] -s
+ Any special flags to pass to g++ to create a dynamically loaded library?
+ [none] -s
+ Any special flags to pass to gcc to use dynamic linking? [none] -s
+
+or you can edit F<hints/cygwin.sh> and uncomment the relevant variables
+near the end of the file.
+
+=head2 Optional Libraries for Perl on Cygwin
+
+Several Perl functions and modules depend on the existence of
+some optional libraries. Configure will find them if they are
+installed in one of the directories listed as being used for library
+searches. Pre-built packages for most of these are available from
+the Cygwin installer.
+
+=over 4
+
+=item * C<-lcrypt>
+
+The crypt package distributed with Cygwin is a Linux compatible 56-bit
+DES crypt port by Corinna Vinschen.
+
+Alternatively, the crypt libraries in GNU libc have been ported to Cygwin.
+
+The DES based Ultra Fast Crypt port was done by Alexey Truhan:
+
+ ftp://ftp.uni-erlangen.de/pub/pc/gnuwin32/cygwin/porters/Okhapkin_Sergey/cw32crypt-dist-0.tgz
+
+NOTE: There are various export restrictions on DES implementations,
+see the glibc README for more details.
+
+The MD5 port was done by Andy Piper:
+
+ ftp://ftp.uni-erlangen.de/pub/pc/gnuwin32/cygwin/porters/Okhapkin_Sergey/libcrypt.tgz
+
+=item * C<-lgdbm_compat> (C<use GDBM_File>)
+
+GDBM is available for Cygwin.
+
+NOTE: The GDBM library only works on NTFS partitions.
+
+=item * C<-ldb> (C<use DB_File>)
+
+BerkeleyDB is available for Cygwin.
+
+NOTE: The BerkeleyDB library only completely works on NTFS partitions
+and db-4.3 is flawed.
+
+=item * C<cygserver> (C<use IPC::SysV>)
+
+A port of SysV IPC is available for Cygwin.
+
+NOTE: This has B<not> been extensively tested. In particular,
+C<d_semctl_semun> is undefined because it fails a Configure test
+and on Win9x the I<shm*()> functions seem to hang. It also creates
+a compile time dependency because F<perl.h> includes F<<sys/ipc.h>>
+and F<<sys/sem.h>> (which will be required in the future when compiling
+CPAN modules). CURRENTLY NOT SUPPORTED!
+
+=item * C<-lutil>
+
+Included with the standard Cygwin netrelease is the inetutils package
+which includes libutil.a.
+
+=back
+
+=head2 Configure-time Options for Perl on Cygwin
+
+The F<INSTALL> document describes several Configure-time options. Some of
+these will work with Cygwin, others are not yet possible. Also, some of
+these are experimental. You can either select an option when Configure
+prompts you or you can define (undefine) symbols on the command line.
+
+=over 4
+
+=item * C<-Uusedl>
+
+Undefining this symbol forces Perl to be compiled statically.
+
+=item * C<-Uusemymalloc>
+
+By default Perl uses the C<malloc()> included with the Perl source. If you
+want to force Perl to build with the system C<malloc()> undefine this symbol.
+
+=item * C<-Uuseperlio>
+
+Undefining this symbol disables the PerlIO abstraction. PerlIO is now the
+default; it is not recommended to disable PerlIO.
+
+=item * C<-Dusemultiplicity>
+
+Multiplicity is required when embedding Perl in a C program and using
+more than one interpreter instance. This works with the Cygwin port.
+
+=item * C<-Duse64bitint>
+
+By default Perl uses 32 bit integers. If you want to use larger 64
+bit integers, define this symbol.
+
+=item * C<-Duselongdouble>
+
+I<gcc> supports long doubles (12 bytes). However, several additional
+long double math functions are necessary to use them within Perl
+(I<{atan2, cos, exp, floor, fmod, frexp, isnan, log, modf, pow, sin, sqrt}l,
+strtold>).
+These are B<not> yet available with Cygwin.
+
+=item * C<-Dusethreads>
+
+POSIX threads are implemented in Cygwin, define this symbol if you want
+a threaded perl.
+
+=item * C<-Duselargefiles>
+
+Cygwin uses 64-bit integers for internal size and position calculations,
+this will be correctly detected and defined by Configure.
+
+=item * C<-Dmksymlinks>
+
+Use this to build perl outside of the source tree. This works with Cygwin.
+Details can be found in the F<INSTALL> document. This is the recommended
+way to build perl from sources.
+
+=back
+
+=head2 Suspicious Warnings on Cygwin
+
+You may see some messages during Configure that seem suspicious.
+
+=over 4
+
+=item * Win9x and C<d_eofnblk>
+
+Win9x does not correctly report C<EOF> with a non-blocking read on a
+closed pipe. You will see the following messages:
+
+ But it also returns -1 to signal EOF, so be careful!
+ WARNING: you can't distinguish between EOF and no data!
+
+ *** WHOA THERE!!! ***
+ The recommended value for $d_eofnblk on this machine was "define"!
+ Keep the recommended value? [y]
+
+At least for consistency with WinNT, you should keep the recommended
+value.
+
+=item * Compiler/Preprocessor defines
+
+The following error occurs because of the Cygwin C<#define> of
+C<_LONG_DOUBLE>:
+
+ Guessing which symbols your C compiler and preprocessor define...
+ try.c:<line#>: missing binary operator
+
+This failure does not seem to cause any problems. With older gcc
+versions, "parse error" is reported instead of "missing binary
+operator".
+
+=back
+
+=head1 MAKE ON CYGWIN
+
+Simply run I<make> and wait:
+
+ make 2>&1 | tee log.make
+
+=head1 TEST ON CYGWIN
+
+There are two steps to running the test suite:
+
+ make test 2>&1 | tee log.make-test
+
+ cd t; ./perl harness 2>&1 | tee ../log.harness
+
+The same tests are run both times, but more information is provided when
+running as C<./perl harness>.
+
+Test results vary depending on your host system and your Cygwin
+configuration. If a test can pass in some Cygwin setup, it is always
+attempted and explainable test failures are documented. It is possible
+for Perl to pass all the tests, but it is more likely that some tests
+will fail for one of the reasons listed below.
+
+=head2 File Permissions on Cygwin
+
+UNIX file permissions are based on sets of mode bits for
+{read,write,execute} for each {user,group,other}. By default Cygwin
+only tracks the Win32 read-only attribute represented as the UNIX file
+user write bit (files are always readable, files are executable if they
+have a F<.{com,bat,exe}> extension or begin with C<#!>, directories are
+always readable and executable). On WinNT with the I<ntea> C<CYGWIN>
+setting, the additional mode bits are stored as extended file attributes.
+On WinNT with the default I<ntsec> C<CYGWIN> setting, permissions use the
+standard WinNT security descriptors and access control lists. Without one of
+these options, these tests will fail (listing not updated yet):
+
+ Failed Test List of failed
+ ------------------------------------
+ io/fs.t 5, 7, 9-10
+ lib/anydbm.t 2
+ lib/db-btree.t 20
+ lib/db-hash.t 16
+ lib/db-recno.t 18
+ lib/gdbm.t 2
+ lib/ndbm.t 2
+ lib/odbm.t 2
+ lib/sdbm.t 2
+ op/stat.t 9, 20 (.tmp not an executable extension)
+
+=head2 NDBM_File and ODBM_File do not work on FAT filesystems
+
+Do not use NDBM_File or ODBM_File on FAT filesystem. They can be
+built on a FAT filesystem, but many tests will fail:
+
+ ../ext/NDBM_File/ndbm.t 13 3328 71 59 83.10% 1-2 4 16-71
+ ../ext/ODBM_File/odbm.t 255 65280 ?? ?? % ??
+ ../lib/AnyDBM_File.t 2 512 12 2 16.67% 1 4
+ ../lib/Memoize/t/errors.t 0 139 11 5 45.45% 7-11
+ ../lib/Memoize/t/tie_ndbm.t 13 3328 4 4 100.00% 1-4
+ run/fresh_perl.t 97 1 1.03% 91
+
+If you intend to run only on FAT (or if using AnyDBM_File on FAT),
+run Configure with the -Ui_ndbm and -Ui_dbm options to prevent
+NDBM_File and ODBM_File being built.
+
+With NTFS (and no CYGWIN=nontsec), there should be no problems even if
+perl was built on FAT.
+
+=head2 C<fork()> failures in io_* tests
+
+A C<fork()> failure may result in the following tests failing:
+
+ ext/IO/lib/IO/t/io_multihomed.t
+ ext/IO/lib/IO/t/io_sock.t
+ ext/IO/lib/IO/t/io_unix.t
+
+See comment on fork in L<Miscellaneous> below.
+
+=head1 Specific features of the Cygwin port
+
+=head2 Script Portability on Cygwin
+
+Cygwin does an outstanding job of providing UNIX-like semantics on top of
+Win32 systems. However, in addition to the items noted above, there are
+some differences that you should know about. This is a very brief guide
+to portability, more information can be found in the Cygwin documentation.
+
+=over 4
+
+=item * Pathnames
+
+Cygwin pathnames can be separated by forward (F</>) or backward (F<\\>)
+slashes. They may also begin with drive letters (F<C:>) or Universal
+Naming Codes (F<//UNC>). DOS device names (F<aux>, F<con>, F<prn>,
+F<com*>, F<lpt?>, F<nul>) are invalid as base filenames. However, they
+can be used in extensions (e.g., F<hello.aux>). Names may contain all
+printable characters except these:
+
+ : * ? " < > |
+
+File names are case insensitive, but case preserving. A pathname that
+contains a backslash or drive letter is a Win32 pathname (and not subject
+to the translations applied to POSIX style pathnames).
+
+For conversion we have C<Cygwin::win_to_posix_path()> and
+C<Cygwin::posix_to_win_path()>.
+
+Pathnames may not contain Unicode characters. C<Cygwin> still uses the
+ANSI API calls and no Unicode calls because of newlib deficiencies.
+There's an unofficial unicode patch for cygwin at
+F<http://www.okisoft.co.jp/esc/utf8-cygwin/>
+
+=item * Text/Binary
+
+When a file is opened it is in either text or binary mode. In text mode
+a file is subject to CR/LF/Ctrl-Z translations. With Cygwin, the default
+mode for an C<open()> is determined by the mode of the mount that underlies
+the file. See C<Cygwin::is_binmount()>. Perl provides a C<binmode()> function
+to set binary mode on files that otherwise would be treated as text.
+C<sysopen()> with the C<O_TEXT> flag sets text mode on files that otherwise
+would be treated as binary:
+
+ sysopen(FOO, "bar", O_WRONLY|O_CREAT|O_TEXT)
+
+C<lseek()>, C<tell()> and C<sysseek()> only work with files opened in binary
+mode.
+
+The text/binary issue is covered at length in the Cygwin documentation.
+
+=item * PerlIO
+
+PerlIO overrides the default Cygwin Text/Binary behaviour. A file will
+always be treated as binary, regardless of the mode of the mount it lives
+on, just like it is in UNIX. So CR/LF translation needs to be requested in
+either the C<open()> call like this:
+
+ open(FH, ">:crlf", "out.txt");
+
+which will do conversion from LF to CR/LF on the output, or in the
+environment settings (add this to your .bashrc):
+
+ export PERLIO=crlf
+
+which will pull in the crlf PerlIO layer which does LF -> CRLF conversion
+on every output generated by perl.
+
+=item * F<.exe>
+
+The Cygwin C<stat()>, C<lstat()> and C<readlink()> functions make the F<.exe>
+extension transparent by looking for F<foo.exe> when you ask for F<foo>
+(unless a F<foo> also exists). Cygwin does not require a F<.exe>
+extension, but I<gcc> adds it automatically when building a program.
+However, when accessing an executable as a normal file (e.g., I<cp>
+in a makefile) the F<.exe> is not transparent. The I<install> included
+with Cygwin automatically appends a F<.exe> when necessary.
+
+=item * Cygwin vs. Windows process ids
+
+Cygwin processes have their own pid, which is different from the
+underlying windows pid. Most posix compliant Proc functions expect
+the cygwin pid, but several Win32::Process functions expect the
+winpid. E.g. C<$$> is the cygwin pid of F</usr/bin/perl>, which is not
+the winpid. Use C<Cygwin::winpid_to_pid()> and C<Cygwin::winpid_to_pid()>
+to translate between them.
+
+=item * Cygwin vs. Windows errors
+
+Under Cygwin, $^E is the same as $!. When using L<Win32 API Functions|Win32>,
+use C<Win32::GetLastError()> to get the last Windows error.
+
+=item * C<chown()>
+
+On WinNT C<chown()> can change a file's user and group IDs. On Win9x C<chown()>
+is a no-op, although this is appropriate since there is no security model.
+
+=item * Miscellaneous
+
+File locking using the C<F_GETLK> command to C<fcntl()> is a stub that
+returns C<ENOSYS>.
+
+Win9x can not C<rename()> an open file (although WinNT can).
+
+The Cygwin C<chroot()> implementation has holes (it can not restrict file
+access by native Win32 programs).
+
+Inplace editing C<perl -i> of files doesn't work without doing a backup
+of the file being edited C<perl -i.bak> because of windowish restrictions,
+therefore Perl adds the suffix C<.bak> automatically if you use C<perl -i>
+without specifying a backup extension.
+
+Using C<fork()> after loading multiple dlls may fail with an internal cygwin
+error like the following:
+
+ C:\CYGWIN\BIN\PERL.EXE: *** couldn't allocate memory 0x10000(4128768) for 'C:\CYGWIN\LIB\PERL5\5.6.1\CYGWIN-MULTI\AUTO\SOCKET\SOCKET.DLL' alignment, Win32 error 8
+
+ 200 [main] perl 377147 sync_with_child: child -395691(0xB8) died before initialization with status code 0x1
+ 1370 [main] perl 377147 sync_with_child: *** child state child loading dlls
+
+Use the rebase utility to resolve the conflicting dll addresses. The
+rebase package is included in the Cygwin netrelease. Use setup.exe from
+F<http://www.cygwin.com/setup.exe> to install it and run rebaseall.
+
+=back
+
+=head2 Prebuilt methods:
+
+=over 4
+
+=item C<Cwd::cwd>
+
+Returns the current working directory.
+
+=item C<Cygwin::pid_to_winpid>
+
+Translates a cygwin pid to the corresponding Windows pid (which may or
+may not be the same).
+
+=item C<Cygwin::winpid_to_pid>
+
+Translates a Windows pid to the corresponding cygwin pid (if any).
+
+=item C<Cygwin::win_to_posix_path>
+
+Translates a Windows path to the corresponding cygwin path respecting
+the current mount points. With a second non-null argument returns an
+absolute path. Double-byte characters will not be translated.
+
+=item C<Cygwin::posix_to_win_path>
+
+Translates a cygwin path to the corresponding cygwin path respecting
+the current mount points. With a second non-null argument returns an
+absolute path. Double-byte characters will not be translated.
+
+=item C<Cygwin::mount_table()>
+
+Returns an array of [mnt_dir, mnt_fsname, mnt_type, mnt_opts].
+
+ perl -e 'for $i (Cygwin::mount_table) {print join(" ",@$i),"\n";}'
+ /bin c:\cygwin\bin system binmode,cygexec
+ /usr/bin c:\cygwin\bin system binmode
+ /usr/lib c:\cygwin\lib system binmode
+ / c:\cygwin system binmode
+ /cygdrive/c c: system binmode,noumount
+ /cygdrive/d d: system binmode,noumount
+ /cygdrive/e e: system binmode,noumount
+
+=item C<Cygwin::mount_flags>
+
+Returns the mount type and flags for a specified mount point.
+A comma-separated string of mntent->mnt_type (always
+"system" or "user"), then the mntent->mnt_opts, where
+the first is always "binmode" or "textmode".
+
+ system|user,binmode|textmode,exec,cygexec,cygdrive,mixed,
+ notexec,managed,nosuid,devfs,proc,noumount
+
+If the argument is "/cygdrive", then just the volume mount settings,
+and the cygdrive mount prefix are returned.
+
+User mounts override system mounts.
+
+ $ perl -e 'print Cygwin::mount_flags "/usr/bin"'
+ system,binmode,cygexec
+ $ perl -e 'print Cygwin::mount_flags "/cygdrive"'
+ binmode,cygdrive,/cygdrive
+
+=item C<Cygwin::is_binmount>
+
+Returns true if the given cygwin path is binary mounted, false if the
+path is mounted in textmode.
+
+=back
+
+=head1 INSTALL PERL ON CYGWIN
+
+This will install Perl, including I<man> pages.
+
+ make install 2>&1 | tee log.make-install
+
+NOTE: If C<STDERR> is redirected C<make install> will B<not> prompt
+you to install I<perl> into F</usr/bin>.
+
+You may need to be I<Administrator> to run C<make install>. If you
+are not, you must have write access to the directories in question.
+
+Information on installing the Perl documentation in HTML format can be
+found in the F<INSTALL> document.
+
+=head1 MANIFEST ON CYGWIN
+
+These are the files in the Perl release that contain references to Cygwin.
+These very brief notes attempt to explain the reason for all conditional
+code. Hopefully, keeping this up to date will allow the Cygwin port to
+be kept as clean as possible.
+
+=over 4
+
+=item Documentation
+
+ INSTALL README.cygwin README.win32 MANIFEST
+ pod/perl.pod pod/perlport.pod pod/perlfaq3.pod
+ pod/perldelta.pod pod/perl5004delta.pod pod/perl56delta.pod
+ pod/perl561delta.pod pod/perl570delta.pod pod/perl572delta.pod
+ pod/perl573delta.pod pod/perl58delta.pod pod/perl581delta.pod
+ pod/perl590delta.pod pod/perlhist.pod pod/perlmodlib.pod
+ pod/perltoc.pod pod.lst Porting/Glossary pod/perlrepository.pod
+ Porting/checkAUTHORS.pl
+ ext/Compress-Raw-Zlib/Changes ext/Compress-Raw-Zlib/README
+ ext/Compress-Zlib/Changes ext/Cwd/Changes ext/DB_File/Changes
+ ext/Encode/Changes ext/Sys-Syslog/Changes ext/Time-HiRes/Changes
+ ext/Win32API-File/Changes lib/CGI/Changes lib/ExtUtils/CBuilder/Changes
+ lib/ExtUtils/Changes lib/ExtUtils/NOTES lib/ExtUtils/PATCHING
+ lib/ExtUtils/README lib/Module/Build/Changes lib/Net/Ping/Changes
+ lib/Test/Harness/Changes
+ lib/Term/ANSIColor/ChangeLog lib/Term/ANSIColor/README
+ README.symbian symbian/TODO
+
+=item Build, Configure, Make, Install
+
+ cygwin/Makefile.SHs
+ ext/IPC/SysV/hints/cygwin.pl
+ ext/NDBM_File/hints/cygwin.pl
+ ext/ODBM_File/hints/cygwin.pl
+ hints/cygwin.sh
+ Configure - help finding hints from uname,
+ shared libperl required for dynamic loading
+ Makefile.SH Cross/Makefile-cross-SH
+ - linklibperl
+ Porting/patchls - cygwin in port list
+ installman - man pages with :: translated to .
+ installperl - install dll, install to 'pods'
+ makedepend.SH - uwinfix
+ regen_lib.pl - file permissions
+
+ NetWare/Makefile
+ plan9/mkfile
+ symbian/sanity.pl symbian/sisify.pl
+ hints/uwin.sh
+ vms/descrip_mms.template
+ win32/Makefile win32/makefile.mk
+
+=item Tests
+
+ t/io/fs.t - no file mode checks if not ntsec
+ skip rename() check when not check_case:relaxed
+ t/io/tell.t - binmode
+ t/lib/cygwin.t - builtin cygwin function tests
+ t/op/groups.t - basegroup has ID = 0
+ t/op/magic.t - $^X/symlink WORKAROUND, s/.exe//
+ t/op/stat.t - no /dev, skip Win32 ftCreationTime quirk
+ (cache manager sometimes preserves ctime of file
+ previously created and deleted), no -u (setuid)
+ t/op/taint.t - can't use empty path under Cygwin Perl
+ t/op/time.t - no tzset()
+
+=item Compiled Perl Source
+
+ EXTERN.h - __declspec(dllimport)
+ XSUB.h - __declspec(dllexport)
+ cygwin/cygwin.c - os_extras (getcwd, spawn, and several Cygwin:: functions)
+ perl.c - os_extras, -i.bak
+ perl.h - binmode
+ doio.c - win9x can not rename a file when it is open
+ pp_sys.c - do not define h_errno, init _pwent_struct.pw_comment
+ util.c - use setenv
+ util.h - PERL_FILE_IS_ABSOLUTE macro
+ pp.c - Comment about Posix vs IEEE math under Cygwin
+ perlio.c - CR/LF mode
+ perliol.c - Comment about EXTCONST under Cygwin
+
+=item Compiled Module Source
+
+ ext/Compress-Raw-Zlib/Makefile.PL
+ - Can't install via CPAN shell under Cygwin
+ ext/Compress-Raw-Zlib/zlib-src/zutil.h
+ - Cygwin is Unix-like and has vsnprintf
+ ext/Errno/Errno_pm.PL - Special handling for Win32 Perl under Cygwin
+ ext/POSIX/POSIX.xs - tzname defined externally
+ ext/SDBM_File/sdbm/pair.c
+ - EXTCONST needs to be redefined from EXTERN.h
+ ext/SDBM_File/sdbm/sdbm.c
+ - binary open
+ ext/Sys/Syslog/Syslog.xs
+ - Cygwin has syslog.h
+ ext/Sys/Syslog/win32/compile.pl
+ - Convert paths to Windows paths
+ ext/Time-HiRes/HiRes.xs
+ - Various timers not available
+ ext/Time-HiRes/Makefile.PL
+ - Find w32api/windows.h
+ ext/Win32/Makefile.PL - Use various libraries under Cygwin
+ ext/Win32/Win32.xs - Child dir and child env under Cygwin
+ ext/Win32API-File/File.xs
+ - _open_osfhandle not implemented under Cygwin
+ ext/Win32CORE/Win32CORE.c
+ - __declspec(dllexport)
+
+=item Perl Modules/Scripts
+
+ ext/B/t/OptreeCheck.pm - Comment about stderr/stdout order under Cygwin
+ ext/Digest-SHA/bin/shasum
+ - Use binary mode under Cygwin
+ ext/Sys/Syslog/win32/Win32.pm
+ - Convert paths to Windows paths
+ ext/Time-HiRes/HiRes.pm
+ - Comment about various timers not available
+ ext/Win32API-File/File.pm
+ - _open_osfhandle not implemented under Cygwin
+ ext/Win32CORE/Win32CORE.pm
+ - History of Win32CORE under Cygwin
+ lib/CGI.pm - binmode and path separator
+ lib/CPANPLUS/Dist/MM.pm - Commented out code that fails under Win32/Cygwin
+ lib/CPANPLUS/Internals/Constants/Report.pm
+ - OS classifications
+ lib/CPANPLUS/Internals/Constants.pm
+ - Contants for Cygwin
+ lib/CPANPLUS/Internals/Report.pm
+ - Example of Cygwin report
+ lib/CPANPLUS/Module.pm
+ - Abort if running on old Cygwin version
+ lib/Cwd.pm - hook to internal Cwd::cwd
+ lib/ExtUtils/CBuilder/Platform/cygwin.pm
+ - use gcc for ld, and link to libperl.dll.a
+ lib/ExtUtils/CBuilder.pm
+ - Cygwin is Unix-like
+ lib/ExtUtils/Install.pm - Install and rename issues under Cygwin
+ lib/ExtUtils/MM.pm - OS classifications
+ lib/ExtUtils/MM_Any.pm - Example for Cygwin
+ lib/ExtUtils/MakeMaker.pm
+ - require MM_Cygwin.pm
+ lib/ExtUtils/MM_Cygwin.pm
+ - canonpath, cflags, manifypods, perl_archive
+ lib/File/Fetch.pm - Comment about quotes using a Cygwin example
+ lib/File/Find.pm - on remote drives stat() always sets st_nlink to 1
+ lib/File/Spec/Cygwin.pm - case_tolerant
+ lib/File/Spec/Unix.pm - preserve //unc
+ lib/File/Spec/Win32.pm - References a message on cygwin.com
+ lib/File/Spec.pm - Pulls in lib/File/Spec/Cygwin.pm
+ lib/File/Temp.pm - no directory sticky bit
+ lib/Module/Build/Compat.pm - Comment references 'make' under Cygwin
+ lib/Module/Build/Platform/cygwin.pm
+ - Use '.' for man page separator
+ lib/Module/Build.pm - Cygwin is Unix-like
+ lib/Module/CoreList.pm - List of all module files and versions
+ lib/Net/Domain.pm - No domainname command under Cygwin
+ lib/Net/Netrc.pm - Bypass using stat() under Cygwin
+ lib/Net/Ping.pm - ECONREFUSED is EAGAIN under Cygwin
+ lib/Pod/Find.pm - Set 'pods' dir
+ lib/Pod/Perldoc/ToMan.pm - '-c' switch for pod2man
+ lib/Pod/Perldoc.pm - Use 'less' pager, and use .exe extension
+ lib/Term/ANSIColor.pm - Cygwin terminal info
+ lib/perl5db.pl - use stdin not /dev/tty
+ utils/perlbug.PL - Add CYGWIN environment variable to report
+
+=item Perl Module Tests
+
+ ext/Compress-Zlib/t/14gzopen.t
+ ext/Cwd/t/cwd.t
+ ext/DB_File/t/db-btree.t
+ ext/DB_File/t/db-hash.t
+ ext/DB_File/t/db-recno.t
+ ext/DynaLoader/t/DynaLoader.t
+ ext/File-Glob/t/basic.t
+ ext/GDBM_File/t/gdbm.t
+ ext/POSIX/t/sysconf.t
+ ext/POSIX/t/time.t
+ ext/SDBM_File/t/sdbm.t
+ ext/Sys/Syslog/t/syslog.t
+ ext/Time-HiRes/t/HiRes.t
+ ext/Win32/t/Unicode.t
+ ext/Win32API-File/t/file.t
+ ext/Win32CORE/t/win32core.t
+ lib/AnyDBM_File.t
+ lib/Archive/Extract/t/01_Archive-Extract.t
+ lib/Archive/Tar/t/02_methods.t
+ lib/CPANPLUS/t/05_CPANPLUS-Internals-Fetch.t
+ lib/CPANPLUS/t/20_CPANPLUS-Dist-MM.t
+ lib/ExtUtils/t/Embed.t
+ lib/ExtUtils/t/eu_command.t
+ lib/ExtUtils/t/MM_Cygwin.t
+ lib/ExtUtils/t/MM_Unix.t
+ lib/File/Compare.t
+ lib/File/Copy.t
+ lib/File/Find/t/find.t
+ lib/File/Path.t
+ lib/File/Spec/t/crossplatform.t
+ lib/File/Spec/t/Spec.t
+ lib/Module/Build/t/destinations.t
+ lib/Net/hostent.t
+ lib/Net/Ping/t/110_icmp_inst.t
+ lib/Net/Ping/t/500_ping_icmp.t
+ lib/Net/t/netrc.t
+ lib/Pod/Simple/t/perlcyg.pod
+ lib/Pod/Simple/t/perlcygo.txt
+ lib/Pod/Simple/t/perlfaq.pod
+ lib/Pod/Simple/t/perlfaqo.txt
+ lib/User/grent.t
+ lib/User/pwent.t
+
+=back
+
+=head1 BUGS ON CYGWIN
+
+Support for swapping real and effective user and group IDs is incomplete.
+On WinNT Cygwin provides C<setuid()>, C<seteuid()>, C<setgid()> and C<setegid()>.
+However, additional Cygwin calls for manipulating WinNT access tokens
+and security contexts are required.
+
+=head1 AUTHORS
+
+Charles Wilson <cwilson@ece.gatech.edu>,
+Eric Fifer <egf7@columbia.edu>,
+alexander smishlajev <als@turnhere.com>,
+Steven Morlock <newspost@morlock.net>,
+Sebastien Barre <Sebastien.Barre@utc.fr>,
+Teun Burgers <burgers@ecn.nl>,
+Gerrit P. Haase <gp@familiehaase.de>,
+Reini Urban <rurban@cpan.org>,
+Jan Dubois <jand@activestate.com>,
+Jerry D. Hedden <jdhedden@cpan.org>.
+
+=head1 HISTORY
+
+Last updated: 2007-09-25
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perldata.pod b/Master/tlpkg/tlperl.straw/lib/pods/perldata.pod
new file mode 100755
index 00000000000..8f0feb7fed3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perldata.pod
@@ -0,0 +1,872 @@
+=head1 NAME
+
+perldata - Perl data types
+
+=head1 DESCRIPTION
+
+=head2 Variable names
+X<variable, name> X<variable name> X<data type> X<type>
+
+Perl has three built-in data types: scalars, arrays of scalars, and
+associative arrays of scalars, known as "hashes". A scalar is a
+single string (of any size, limited only by the available memory),
+number, or a reference to something (which will be discussed
+in L<perlref>). Normal arrays are ordered lists of scalars indexed
+by number, starting with 0. Hashes are unordered collections of scalar
+values indexed by their associated string key.
+
+Values are usually referred to by name, or through a named reference.
+The first character of the name tells you to what sort of data
+structure it refers. The rest of the name tells you the particular
+value to which it refers. Usually this name is a single I<identifier>,
+that is, a string beginning with a letter or underscore, and
+containing letters, underscores, and digits. In some cases, it may
+be a chain of identifiers, separated by C<::> (or by the slightly
+archaic C<'>); all but the last are interpreted as names of packages,
+to locate the namespace in which to look up the final identifier
+(see L<perlmod/Packages> for details). It's possible to substitute
+for a simple identifier, an expression that produces a reference
+to the value at runtime. This is described in more detail below
+and in L<perlref>.
+X<identifier>
+
+Perl also has its own built-in variables whose names don't follow
+these rules. They have strange names so they don't accidentally
+collide with one of your normal variables. Strings that match
+parenthesized parts of a regular expression are saved under names
+containing only digits after the C<$> (see L<perlop> and L<perlre>).
+In addition, several special variables that provide windows into
+the inner working of Perl have names containing punctuation characters
+and control characters. These are documented in L<perlvar>.
+X<variable, built-in>
+
+Scalar values are always named with '$', even when referring to a
+scalar that is part of an array or a hash. The '$' symbol works
+semantically like the English word "the" in that it indicates a
+single value is expected.
+X<scalar>
+
+ $days # the simple scalar value "days"
+ $days[28] # the 29th element of array @days
+ $days{'Feb'} # the 'Feb' value from hash %days
+ $#days # the last index of array @days
+
+Entire arrays (and slices of arrays and hashes) are denoted by '@',
+which works much like the word "these" or "those" does in English,
+in that it indicates multiple values are expected.
+X<array>
+
+ @days # ($days[0], $days[1],... $days[n])
+ @days[3,4,5] # same as ($days[3],$days[4],$days[5])
+ @days{'a','c'} # same as ($days{'a'},$days{'c'})
+
+Entire hashes are denoted by '%':
+X<hash>
+
+ %days # (key1, val1, key2, val2 ...)
+
+In addition, subroutines are named with an initial '&', though this
+is optional when unambiguous, just as the word "do" is often redundant
+in English. Symbol table entries can be named with an initial '*',
+but you don't really care about that yet (if ever :-).
+
+Every variable type has its own namespace, as do several
+non-variable identifiers. This means that you can, without fear
+of conflict, use the same name for a scalar variable, an array, or
+a hash--or, for that matter, for a filehandle, a directory handle, a
+subroutine name, a format name, or a label. This means that $foo
+and @foo are two different variables. It also means that C<$foo[1]>
+is a part of @foo, not a part of $foo. This may seem a bit weird,
+but that's okay, because it is weird.
+X<namespace>
+
+Because variable references always start with '$', '@', or '%', the
+"reserved" words aren't in fact reserved with respect to variable
+names. They I<are> reserved with respect to labels and filehandles,
+however, which don't have an initial special character. You can't
+have a filehandle named "log", for instance. Hint: you could say
+C<open(LOG,'logfile')> rather than C<open(log,'logfile')>. Using
+uppercase filehandles also improves readability and protects you
+from conflict with future reserved words. Case I<is> significant--"FOO",
+"Foo", and "foo" are all different names. Names that start with a
+letter or underscore may also contain digits and underscores.
+X<identifier, case sensitivity>
+X<case>
+
+It is possible to replace such an alphanumeric name with an expression
+that returns a reference to the appropriate type. For a description
+of this, see L<perlref>.
+
+Names that start with a digit may contain only more digits. Names
+that do not start with a letter, underscore, digit or a caret (i.e.
+a control character) are limited to one character, e.g., C<$%> or
+C<$$>. (Most of these one character names have a predefined
+significance to Perl. For instance, C<$$> is the current process
+id.)
+
+=head2 Context
+X<context> X<scalar context> X<list context>
+
+The interpretation of operations and values in Perl sometimes depends
+on the requirements of the context around the operation or value.
+There are two major contexts: list and scalar. Certain operations
+return list values in contexts wanting a list, and scalar values
+otherwise. If this is true of an operation it will be mentioned in
+the documentation for that operation. In other words, Perl overloads
+certain operations based on whether the expected return value is
+singular or plural. Some words in English work this way, like "fish"
+and "sheep".
+
+In a reciprocal fashion, an operation provides either a scalar or a
+list context to each of its arguments. For example, if you say
+
+ int( <STDIN> )
+
+the integer operation provides scalar context for the <>
+operator, which responds by reading one line from STDIN and passing it
+back to the integer operation, which will then find the integer value
+of that line and return that. If, on the other hand, you say
+
+ sort( <STDIN> )
+
+then the sort operation provides list context for <>, which
+will proceed to read every line available up to the end of file, and
+pass that list of lines back to the sort routine, which will then
+sort those lines and return them as a list to whatever the context
+of the sort was.
+
+Assignment is a little bit special in that it uses its left argument
+to determine the context for the right argument. Assignment to a
+scalar evaluates the right-hand side in scalar context, while
+assignment to an array or hash evaluates the righthand side in list
+context. Assignment to a list (or slice, which is just a list
+anyway) also evaluates the righthand side in list context.
+
+When you use the C<use warnings> pragma or Perl's B<-w> command-line
+option, you may see warnings
+about useless uses of constants or functions in "void context".
+Void context just means the value has been discarded, such as a
+statement containing only C<"fred";> or C<getpwuid(0);>. It still
+counts as scalar context for functions that care whether or not
+they're being called in list context.
+
+User-defined subroutines may choose to care whether they are being
+called in a void, scalar, or list context. Most subroutines do not
+need to bother, though. That's because both scalars and lists are
+automatically interpolated into lists. See L<perlfunc/wantarray>
+for how you would dynamically discern your function's calling
+context.
+
+=head2 Scalar values
+X<scalar> X<number> X<string> X<reference>
+
+All data in Perl is a scalar, an array of scalars, or a hash of
+scalars. A scalar may contain one single value in any of three
+different flavors: a number, a string, or a reference. In general,
+conversion from one form to another is transparent. Although a
+scalar may not directly hold multiple values, it may contain a
+reference to an array or hash which in turn contains multiple values.
+
+Scalars aren't necessarily one thing or another. There's no place
+to declare a scalar variable to be of type "string", type "number",
+type "reference", or anything else. Because of the automatic
+conversion of scalars, operations that return scalars don't need
+to care (and in fact, cannot care) whether their caller is looking
+for a string, a number, or a reference. Perl is a contextually
+polymorphic language whose scalars can be strings, numbers, or
+references (which includes objects). Although strings and numbers
+are considered pretty much the same thing for nearly all purposes,
+references are strongly-typed, uncastable pointers with builtin
+reference-counting and destructor invocation.
+
+A scalar value is interpreted as TRUE in the Boolean sense if it is not
+the null string or the number 0 (or its string equivalent, "0"). The
+Boolean context is just a special kind of scalar context where no
+conversion to a string or a number is ever performed.
+X<boolean> X<bool> X<true> X<false> X<truth>
+
+There are actually two varieties of null strings (sometimes referred
+to as "empty" strings), a defined one and an undefined one. The
+defined version is just a string of length zero, such as C<"">.
+The undefined version is the value that indicates that there is
+no real value for something, such as when there was an error, or
+at end of file, or when you refer to an uninitialized variable or
+element of an array or hash. Although in early versions of Perl,
+an undefined scalar could become defined when first used in a
+place expecting a defined value, this no longer happens except for
+rare cases of autovivification as explained in L<perlref>. You can
+use the defined() operator to determine whether a scalar value is
+defined (this has no meaning on arrays or hashes), and the undef()
+operator to produce an undefined value.
+X<defined> X<undefined> X<undef> X<null> X<string, null>
+
+To find out whether a given string is a valid non-zero number, it's
+sometimes enough to test it against both numeric 0 and also lexical
+"0" (although this will cause noises if warnings are on). That's
+because strings that aren't numbers count as 0, just as they do in B<awk>:
+
+ if ($str == 0 && $str ne "0") {
+ warn "That doesn't look like a number";
+ }
+
+That method may be best because otherwise you won't treat IEEE
+notations like C<NaN> or C<Infinity> properly. At other times, you
+might prefer to determine whether string data can be used numerically
+by calling the POSIX::strtod() function or by inspecting your string
+with a regular expression (as documented in L<perlre>).
+
+ warn "has nondigits" if /\D/;
+ warn "not a natural number" unless /^\d+$/; # rejects -3
+ warn "not an integer" unless /^-?\d+$/; # rejects +3
+ warn "not an integer" unless /^[+-]?\d+$/;
+ warn "not a decimal number" unless /^-?\d+\.?\d*$/; # rejects .2
+ warn "not a decimal number" unless /^-?(?:\d+(?:\.\d*)?|\.\d+)$/;
+ warn "not a C float"
+ unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
+
+The length of an array is a scalar value. You may find the length
+of array @days by evaluating C<$#days>, as in B<csh>. However, this
+isn't the length of the array; it's the subscript of the last element,
+which is a different value since there is ordinarily a 0th element.
+Assigning to C<$#days> actually changes the length of the array.
+Shortening an array this way destroys intervening values. Lengthening
+an array that was previously shortened does not recover values
+that were in those elements. (It used to do so in Perl 4, but we
+had to break this to make sure destructors were called when expected.)
+X<$#> X<array, length>
+
+You can also gain some minuscule measure of efficiency by pre-extending
+an array that is going to get big. You can also extend an array
+by assigning to an element that is off the end of the array. You
+can truncate an array down to nothing by assigning the null list
+() to it. The following are equivalent:
+
+ @whatever = ();
+ $#whatever = -1;
+
+If you evaluate an array in scalar context, it returns the length
+of the array. (Note that this is not true of lists, which return
+the last value, like the C comma operator, nor of built-in functions,
+which return whatever they feel like returning.) The following is
+always true:
+X<array, length>
+
+ scalar(@whatever) == $#whatever - $[ + 1;
+
+Version 5 of Perl changed the semantics of C<$[>: files that don't set
+the value of C<$[> no longer need to worry about whether another
+file changed its value. (In other words, use of C<$[> is deprecated.)
+So in general you can assume that
+X<$[>
+
+ scalar(@whatever) == $#whatever + 1;
+
+Some programmers choose to use an explicit conversion so as to
+leave nothing to doubt:
+
+ $element_count = scalar(@whatever);
+
+If you evaluate a hash in scalar context, it returns false if the
+hash is empty. If there are any key/value pairs, it returns true;
+more precisely, the value returned is a string consisting of the
+number of used buckets and the number of allocated buckets, separated
+by a slash. This is pretty much useful only to find out whether
+Perl's internal hashing algorithm is performing poorly on your data
+set. For example, you stick 10,000 things in a hash, but evaluating
+%HASH in scalar context reveals C<"1/16">, which means only one out
+of sixteen buckets has been touched, and presumably contains all
+10,000 of your items. This isn't supposed to happen. If a tied hash
+is evaluated in scalar context, a fatal error will result, since this
+bucket usage information is currently not available for tied hashes.
+X<hash, scalar context> X<hash, bucket> X<bucket>
+
+You can preallocate space for a hash by assigning to the keys() function.
+This rounds up the allocated buckets to the next power of two:
+
+ keys(%users) = 1000; # allocate 1024 buckets
+
+=head2 Scalar value constructors
+X<scalar, literal> X<scalar, constant>
+
+Numeric literals are specified in any of the following floating point or
+integer formats:
+
+ 12345
+ 12345.67
+ .23E-10 # a very small number
+ 3.14_15_92 # a very important number
+ 4_294_967_296 # underscore for legibility
+ 0xff # hex
+ 0xdead_beef # more hex
+ 0377 # octal (only numbers, begins with 0)
+ 0b011011 # binary
+
+You are allowed to use underscores (underbars) in numeric literals
+between digits for legibility. You could, for example, group binary
+digits by threes (as for a Unix-style mode argument such as 0b110_100_100)
+or by fours (to represent nibbles, as in 0b1010_0110) or in other groups.
+X<number, literal>
+
+String literals are usually delimited by either single or double
+quotes. They work much like quotes in the standard Unix shells:
+double-quoted string literals are subject to backslash and variable
+substitution; single-quoted strings are not (except for C<\'> and
+C<\\>). The usual C-style backslash rules apply for making
+characters such as newline, tab, etc., as well as some more exotic
+forms. See L<perlop/"Quote and Quote-like Operators"> for a list.
+X<string, literal>
+
+Hexadecimal, octal, or binary, representations in string literals
+(e.g. '0xff') are not automatically converted to their integer
+representation. The hex() and oct() functions make these conversions
+for you. See L<perlfunc/hex> and L<perlfunc/oct> for more details.
+
+You can also embed newlines directly in your strings, i.e., they can end
+on a different line than they begin. This is nice, but if you forget
+your trailing quote, the error will not be reported until Perl finds
+another line containing the quote character, which may be much further
+on in the script. Variable substitution inside strings is limited to
+scalar variables, arrays, and array or hash slices. (In other words,
+names beginning with $ or @, followed by an optional bracketed
+expression as a subscript.) The following code segment prints out "The
+price is $Z<>100."
+X<interpolation>
+
+ $Price = '$100'; # not interpolated
+ print "The price is $Price.\n"; # interpolated
+
+There is no double interpolation in Perl, so the C<$100> is left as is.
+
+By default floating point numbers substituted inside strings use the
+dot (".") as the decimal separator. If C<use locale> is in effect,
+and POSIX::setlocale() has been called, the character used for the
+decimal separator is affected by the LC_NUMERIC locale.
+See L<perllocale> and L<POSIX>.
+
+As in some shells, you can enclose the variable name in braces to
+disambiguate it from following alphanumerics (and underscores).
+You must also do
+this when interpolating a variable into a string to separate the
+variable name from a following double-colon or an apostrophe, since
+these would be otherwise treated as a package separator:
+X<interpolation>
+
+ $who = "Larry";
+ print PASSWD "${who}::0:0:Superuser:/:/bin/perl\n";
+ print "We use ${who}speak when ${who}'s here.\n";
+
+Without the braces, Perl would have looked for a $whospeak, a
+C<$who::0>, and a C<$who's> variable. The last two would be the
+$0 and the $s variables in the (presumably) non-existent package
+C<who>.
+
+In fact, an identifier within such curlies is forced to be a string,
+as is any simple identifier within a hash subscript. Neither need
+quoting. Our earlier example, C<$days{'Feb'}> can be written as
+C<$days{Feb}> and the quotes will be assumed automatically. But
+anything more complicated in the subscript will be interpreted as an
+expression. This means for example that C<$version{2.0}++> is
+equivalent to C<$version{2}++>, not to C<$version{'2.0'}++>.
+
+=head3 Version Strings
+X<version string> X<vstring> X<v-string>
+
+B<Note:> Version Strings (v-strings) have been deprecated. They will
+be removed in some future release after Perl 5.8.1. The marginal
+benefits of v-strings were greatly outweighed by the potential for
+Surprise and Confusion.
+
+A literal of the form C<v1.20.300.4000> is parsed as a string composed
+of characters with the specified ordinals. This form, known as
+v-strings, provides an alternative, more readable way to construct
+strings, rather than use the somewhat less readable interpolation form
+C<"\x{1}\x{14}\x{12c}\x{fa0}">. This is useful for representing
+Unicode strings, and for comparing version "numbers" using the string
+comparison operators, C<cmp>, C<gt>, C<lt> etc. If there are two or
+more dots in the literal, the leading C<v> may be omitted.
+
+ print v9786; # prints SMILEY, "\x{263a}"
+ print v102.111.111; # prints "foo"
+ print 102.111.111; # same
+
+Such literals are accepted by both C<require> and C<use> for
+doing a version check. Note that using the v-strings for IPv4
+addresses is not portable unless you also use the
+inet_aton()/inet_ntoa() routines of the Socket package.
+
+Note that since Perl 5.8.1 the single-number v-strings (like C<v65>)
+are not v-strings before the C<< => >> operator (which is usually used
+to separate a hash key from a hash value), instead they are interpreted
+as literal strings ('v65'). They were v-strings from Perl 5.6.0 to
+Perl 5.8.0, but that caused more confusion and breakage than good.
+Multi-number v-strings like C<v65.66> and C<65.66.67> continue to
+be v-strings always.
+
+=head3 Special Literals
+X<special literal> X<__END__> X<__DATA__> X<END> X<DATA>
+X<end> X<data> X<^D> X<^Z>
+
+The special literals __FILE__, __LINE__, and __PACKAGE__
+represent the current filename, line number, and package name at that
+point in your program. They may be used only as separate tokens; they
+will not be interpolated into strings. If there is no current package
+(due to an empty C<package;> directive), __PACKAGE__ is the undefined
+value.
+X<__FILE__> X<__LINE__> X<__PACKAGE__> X<line> X<file> X<package>
+
+The two control characters ^D and ^Z, and the tokens __END__ and __DATA__
+may be used to indicate the logical end of the script before the actual
+end of file. Any following text is ignored.
+
+Text after __DATA__ may be read via the filehandle C<PACKNAME::DATA>,
+where C<PACKNAME> is the package that was current when the __DATA__
+token was encountered. The filehandle is left open pointing to the
+contents after __DATA__. It is the program's responsibility to
+C<close DATA> when it is done reading from it. For compatibility with
+older scripts written before __DATA__ was introduced, __END__ behaves
+like __DATA__ in the top level script (but not in files loaded with
+C<require> or C<do>) and leaves the remaining contents of the
+file accessible via C<main::DATA>.
+
+See L<SelfLoader> for more description of __DATA__, and
+an example of its use. Note that you cannot read from the DATA
+filehandle in a BEGIN block: the BEGIN block is executed as soon
+as it is seen (during compilation), at which point the corresponding
+__DATA__ (or __END__) token has not yet been seen.
+
+=head3 Barewords
+X<bareword>
+
+A word that has no other interpretation in the grammar will
+be treated as if it were a quoted string. These are known as
+"barewords". As with filehandles and labels, a bareword that consists
+entirely of lowercase letters risks conflict with future reserved
+words, and if you use the C<use warnings> pragma or the B<-w> switch,
+Perl will warn you about any such words. Perl limits barewords (like
+identifiers) to about 250 characters. Future versions of Perl are likely
+to eliminate these arbitrary limitations.
+
+Some people may wish to outlaw barewords entirely. If you
+say
+
+ use strict 'subs';
+
+then any bareword that would NOT be interpreted as a subroutine call
+produces a compile-time error instead. The restriction lasts to the
+end of the enclosing block. An inner block may countermand this
+by saying C<no strict 'subs'>.
+
+=head3 Array Joining Delimiter
+X<array, interpolation> X<interpolation, array> X<$">
+
+Arrays and slices are interpolated into double-quoted strings
+by joining the elements with the delimiter specified in the C<$">
+variable (C<$LIST_SEPARATOR> if "use English;" is specified),
+space by default. The following are equivalent:
+
+ $temp = join($", @ARGV);
+ system "echo $temp";
+
+ system "echo @ARGV";
+
+Within search patterns (which also undergo double-quotish substitution)
+there is an unfortunate ambiguity: Is C</$foo[bar]/> to be interpreted as
+C</${foo}[bar]/> (where C<[bar]> is a character class for the regular
+expression) or as C</${foo[bar]}/> (where C<[bar]> is the subscript to array
+@foo)? If @foo doesn't otherwise exist, then it's obviously a
+character class. If @foo exists, Perl takes a good guess about C<[bar]>,
+and is almost always right. If it does guess wrong, or if you're just
+plain paranoid, you can force the correct interpretation with curly
+braces as above.
+
+If you're looking for the information on how to use here-documents,
+which used to be here, that's been moved to
+L<perlop/Quote and Quote-like Operators>.
+
+=head2 List value constructors
+X<list>
+
+List values are denoted by separating individual values by commas
+(and enclosing the list in parentheses where precedence requires it):
+
+ (LIST)
+
+In a context not requiring a list value, the value of what appears
+to be a list literal is simply the value of the final element, as
+with the C comma operator. For example,
+
+ @foo = ('cc', '-E', $bar);
+
+assigns the entire list value to array @foo, but
+
+ $foo = ('cc', '-E', $bar);
+
+assigns the value of variable $bar to the scalar variable $foo.
+Note that the value of an actual array in scalar context is the
+length of the array; the following assigns the value 3 to $foo:
+
+ @foo = ('cc', '-E', $bar);
+ $foo = @foo; # $foo gets 3
+
+You may have an optional comma before the closing parenthesis of a
+list literal, so that you can say:
+
+ @foo = (
+ 1,
+ 2,
+ 3,
+ );
+
+To use a here-document to assign an array, one line per element,
+you might use an approach like this:
+
+ @sauces = <<End_Lines =~ m/(\S.*\S)/g;
+ normal tomato
+ spicy tomato
+ green chile
+ pesto
+ white wine
+ End_Lines
+
+LISTs do automatic interpolation of sublists. That is, when a LIST is
+evaluated, each element of the list is evaluated in list context, and
+the resulting list value is interpolated into LIST just as if each
+individual element were a member of LIST. Thus arrays and hashes lose their
+identity in a LIST--the list
+
+ (@foo,@bar,&SomeSub,%glarch)
+
+contains all the elements of @foo followed by all the elements of @bar,
+followed by all the elements returned by the subroutine named SomeSub
+called in list context, followed by the key/value pairs of %glarch.
+To make a list reference that does I<NOT> interpolate, see L<perlref>.
+
+The null list is represented by (). Interpolating it in a list
+has no effect. Thus ((),(),()) is equivalent to (). Similarly,
+interpolating an array with no elements is the same as if no
+array had been interpolated at that point.
+
+This interpolation combines with the facts that the opening
+and closing parentheses are optional (except when necessary for
+precedence) and lists may end with an optional comma to mean that
+multiple commas within lists are legal syntax. The list C<1,,3> is a
+concatenation of two lists, C<1,> and C<3>, the first of which ends
+with that optional comma. C<1,,3> is C<(1,),(3)> is C<1,3> (And
+similarly for C<1,,,3> is C<(1,),(,),3> is C<1,3> and so on.) Not that
+we'd advise you to use this obfuscation.
+
+A list value may also be subscripted like a normal array. You must
+put the list in parentheses to avoid ambiguity. For example:
+
+ # Stat returns list value.
+ $time = (stat($file))[8];
+
+ # SYNTAX ERROR HERE.
+ $time = stat($file)[8]; # OOPS, FORGOT PARENTHESES
+
+ # Find a hex digit.
+ $hexdigit = ('a','b','c','d','e','f')[$digit-10];
+
+ # A "reverse comma operator".
+ return (pop(@foo),pop(@foo))[0];
+
+Lists may be assigned to only when each element of the list
+is itself legal to assign to:
+
+ ($a, $b, $c) = (1, 2, 3);
+
+ ($map{'red'}, $map{'blue'}, $map{'green'}) = (0x00f, 0x0f0, 0xf00);
+
+An exception to this is that you may assign to C<undef> in a list.
+This is useful for throwing away some of the return values of a
+function:
+
+ ($dev, $ino, undef, undef, $uid, $gid) = stat($file);
+
+List assignment in scalar context returns the number of elements
+produced by the expression on the right side of the assignment:
+
+ $x = (($foo,$bar) = (3,2,1)); # set $x to 3, not 2
+ $x = (($foo,$bar) = f()); # set $x to f()'s return count
+
+This is handy when you want to do a list assignment in a Boolean
+context, because most list functions return a null list when finished,
+which when assigned produces a 0, which is interpreted as FALSE.
+
+It's also the source of a useful idiom for executing a function or
+performing an operation in list context and then counting the number of
+return values, by assigning to an empty list and then using that
+assignment in scalar context. For example, this code:
+
+ $count = () = $string =~ /\d+/g;
+
+will place into $count the number of digit groups found in $string.
+This happens because the pattern match is in list context (since it
+is being assigned to the empty list), and will therefore return a list
+of all matching parts of the string. The list assignment in scalar
+context will translate that into the number of elements (here, the
+number of times the pattern matched) and assign that to $count. Note
+that simply using
+
+ $count = $string =~ /\d+/g;
+
+would not have worked, since a pattern match in scalar context will
+only return true or false, rather than a count of matches.
+
+The final element of a list assignment may be an array or a hash:
+
+ ($a, $b, @rest) = split;
+ my($a, $b, %rest) = @_;
+
+You can actually put an array or hash anywhere in the list, but the first one
+in the list will soak up all the values, and anything after it will become
+undefined. This may be useful in a my() or local().
+
+A hash can be initialized using a literal list holding pairs of
+items to be interpreted as a key and a value:
+
+ # same as map assignment above
+ %map = ('red',0x00f,'blue',0x0f0,'green',0xf00);
+
+While literal lists and named arrays are often interchangeable, that's
+not the case for hashes. Just because you can subscript a list value like
+a normal array does not mean that you can subscript a list value as a
+hash. Likewise, hashes included as parts of other lists (including
+parameters lists and return lists from functions) always flatten out into
+key/value pairs. That's why it's good to use references sometimes.
+
+It is often more readable to use the C<< => >> operator between key/value
+pairs. The C<< => >> operator is mostly just a more visually distinctive
+synonym for a comma, but it also arranges for its left-hand operand to be
+interpreted as a string -- if it's a bareword that would be a legal simple
+identifier (C<< => >> doesn't quote compound identifiers, that contain
+double colons). This makes it nice for initializing hashes:
+
+ %map = (
+ red => 0x00f,
+ blue => 0x0f0,
+ green => 0xf00,
+ );
+
+or for initializing hash references to be used as records:
+
+ $rec = {
+ witch => 'Mable the Merciless',
+ cat => 'Fluffy the Ferocious',
+ date => '10/31/1776',
+ };
+
+or for using call-by-named-parameter to complicated functions:
+
+ $field = $query->radio_group(
+ name => 'group_name',
+ values => ['eenie','meenie','minie'],
+ default => 'meenie',
+ linebreak => 'true',
+ labels => \%labels
+ );
+
+Note that just because a hash is initialized in that order doesn't
+mean that it comes out in that order. See L<perlfunc/sort> for examples
+of how to arrange for an output ordering.
+
+=head2 Subscripts
+
+An array is subscripted by specifying a dollar sign (C<$>), then the
+name of the array (without the leading C<@>), then the subscript inside
+square brackets. For example:
+
+ @myarray = (5, 50, 500, 5000);
+ print "The Third Element is", $myarray[2], "\n";
+
+The array indices start with 0. A negative subscript retrieves its
+value from the end. In our example, C<$myarray[-1]> would have been
+5000, and C<$myarray[-2]> would have been 500.
+
+Hash subscripts are similar, only instead of square brackets curly brackets
+are used. For example:
+
+ %scientists =
+ (
+ "Newton" => "Isaac",
+ "Einstein" => "Albert",
+ "Darwin" => "Charles",
+ "Feynman" => "Richard",
+ );
+
+ print "Darwin's First Name is ", $scientists{"Darwin"}, "\n";
+
+=head2 Slices
+X<slice> X<array, slice> X<hash, slice>
+
+A common way to access an array or a hash is one scalar element at a
+time. You can also subscript a list to get a single element from it.
+
+ $whoami = $ENV{"USER"}; # one element from the hash
+ $parent = $ISA[0]; # one element from the array
+ $dir = (getpwnam("daemon"))[7]; # likewise, but with list
+
+A slice accesses several elements of a list, an array, or a hash
+simultaneously using a list of subscripts. It's more convenient
+than writing out the individual elements as a list of separate
+scalar values.
+
+ ($him, $her) = @folks[0,-1]; # array slice
+ @them = @folks[0 .. 3]; # array slice
+ ($who, $home) = @ENV{"USER", "HOME"}; # hash slice
+ ($uid, $dir) = (getpwnam("daemon"))[2,7]; # list slice
+
+Since you can assign to a list of variables, you can also assign to
+an array or hash slice.
+
+ @days[3..5] = qw/Wed Thu Fri/;
+ @colors{'red','blue','green'}
+ = (0xff0000, 0x0000ff, 0x00ff00);
+ @folks[0, -1] = @folks[-1, 0];
+
+The previous assignments are exactly equivalent to
+
+ ($days[3], $days[4], $days[5]) = qw/Wed Thu Fri/;
+ ($colors{'red'}, $colors{'blue'}, $colors{'green'})
+ = (0xff0000, 0x0000ff, 0x00ff00);
+ ($folks[0], $folks[-1]) = ($folks[-1], $folks[0]);
+
+Since changing a slice changes the original array or hash that it's
+slicing, a C<foreach> construct will alter some--or even all--of the
+values of the array or hash.
+
+ foreach (@array[ 4 .. 10 ]) { s/peter/paul/ }
+
+ foreach (@hash{qw[key1 key2]}) {
+ s/^\s+//; # trim leading whitespace
+ s/\s+$//; # trim trailing whitespace
+ s/(\w+)/\u\L$1/g; # "titlecase" words
+ }
+
+A slice of an empty list is still an empty list. Thus:
+
+ @a = ()[1,0]; # @a has no elements
+ @b = (@a)[0,1]; # @b has no elements
+ @c = (0,1)[2,3]; # @c has no elements
+
+But:
+
+ @a = (1)[1,0]; # @a has two elements
+ @b = (1,undef)[1,0,2]; # @b has three elements
+
+This makes it easy to write loops that terminate when a null list
+is returned:
+
+ while ( ($home, $user) = (getpwent)[7,0]) {
+ printf "%-8s %s\n", $user, $home;
+ }
+
+As noted earlier in this document, the scalar sense of list assignment
+is the number of elements on the right-hand side of the assignment.
+The null list contains no elements, so when the password file is
+exhausted, the result is 0, not 2.
+
+If you're confused about why you use an '@' there on a hash slice
+instead of a '%', think of it like this. The type of bracket (square
+or curly) governs whether it's an array or a hash being looked at.
+On the other hand, the leading symbol ('$' or '@') on the array or
+hash indicates whether you are getting back a singular value (a
+scalar) or a plural one (a list).
+
+=head2 Typeglobs and Filehandles
+X<typeglob> X<filehandle> X<*>
+
+Perl uses an internal type called a I<typeglob> to hold an entire
+symbol table entry. The type prefix of a typeglob is a C<*>, because
+it represents all types. This used to be the preferred way to
+pass arrays and hashes by reference into a function, but now that
+we have real references, this is seldom needed.
+
+The main use of typeglobs in modern Perl is create symbol table aliases.
+This assignment:
+
+ *this = *that;
+
+makes $this an alias for $that, @this an alias for @that, %this an alias
+for %that, &this an alias for &that, etc. Much safer is to use a reference.
+This:
+
+ local *Here::blue = \$There::green;
+
+temporarily makes $Here::blue an alias for $There::green, but doesn't
+make @Here::blue an alias for @There::green, or %Here::blue an alias for
+%There::green, etc. See L<perlmod/"Symbol Tables"> for more examples
+of this. Strange though this may seem, this is the basis for the whole
+module import/export system.
+
+Another use for typeglobs is to pass filehandles into a function or
+to create new filehandles. If you need to use a typeglob to save away
+a filehandle, do it this way:
+
+ $fh = *STDOUT;
+
+or perhaps as a real reference, like this:
+
+ $fh = \*STDOUT;
+
+See L<perlsub> for examples of using these as indirect filehandles
+in functions.
+
+Typeglobs are also a way to create a local filehandle using the local()
+operator. These last until their block is exited, but may be passed back.
+For example:
+
+ sub newopen {
+ my $path = shift;
+ local *FH; # not my!
+ open (FH, $path) or return undef;
+ return *FH;
+ }
+ $fh = newopen('/etc/passwd');
+
+Now that we have the C<*foo{THING}> notation, typeglobs aren't used as much
+for filehandle manipulations, although they're still needed to pass brand
+new file and directory handles into or out of functions. That's because
+C<*HANDLE{IO}> only works if HANDLE has already been used as a handle.
+In other words, C<*FH> must be used to create new symbol table entries;
+C<*foo{THING}> cannot. When in doubt, use C<*FH>.
+
+All functions that are capable of creating filehandles (open(),
+opendir(), pipe(), socketpair(), sysopen(), socket(), and accept())
+automatically create an anonymous filehandle if the handle passed to
+them is an uninitialized scalar variable. This allows the constructs
+such as C<open(my $fh, ...)> and C<open(local $fh,...)> to be used to
+create filehandles that will conveniently be closed automatically when
+the scope ends, provided there are no other references to them. This
+largely eliminates the need for typeglobs when opening filehandles
+that must be passed around, as in the following example:
+
+ sub myopen {
+ open my $fh, "@_"
+ or die "Can't open '@_': $!";
+ return $fh;
+ }
+
+ {
+ my $f = myopen("</etc/motd");
+ print <$f>;
+ # $f implicitly closed here
+ }
+
+Note that if an initialized scalar variable is used instead the
+result is different: C<my $fh='zzz'; open($fh, ...)> is equivalent
+to C<open( *{'zzz'}, ...)>.
+C<use strict 'refs'> forbids such practice.
+
+Another way to create anonymous filehandles is with the Symbol
+module or with the IO::Handle module and its ilk. These modules
+have the advantage of not hiding different types of the same name
+during the local(). See the bottom of L<perlfunc/open()> for an
+example.
+
+=head1 SEE ALSO
+
+See L<perlvar> for a description of Perl's built-in variables and
+a discussion of legal variable names. See L<perlref>, L<perlsub>,
+and L<perlmod/"Symbol Tables"> for more discussion on typeglobs and
+the C<*foo{THING}> syntax.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perldbmfilter.pod b/Master/tlpkg/tlperl.straw/lib/pods/perldbmfilter.pod
new file mode 100755
index 00000000000..f145b8aa1bd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perldbmfilter.pod
@@ -0,0 +1,168 @@
+=head1 NAME
+
+perldbmfilter - Perl DBM Filters
+
+=head1 SYNOPSIS
+
+ $db = tie %hash, 'DBM', ...
+
+ $old_filter = $db->filter_store_key ( sub { ... } );
+ $old_filter = $db->filter_store_value( sub { ... } );
+ $old_filter = $db->filter_fetch_key ( sub { ... } );
+ $old_filter = $db->filter_fetch_value( sub { ... } );
+
+=head1 DESCRIPTION
+
+The four C<filter_*> methods shown above are available in all the DBM
+modules that ship with Perl, namely DB_File, GDBM_File, NDBM_File,
+ODBM_File and SDBM_File.
+
+Each of the methods work identically, and are used to install (or
+uninstall) a single DBM Filter. The only difference between them is the
+place that the filter is installed.
+
+To summarise:
+
+=over 5
+
+=item B<filter_store_key>
+
+If a filter has been installed with this method, it will be invoked
+every time you write a key to a DBM database.
+
+=item B<filter_store_value>
+
+If a filter has been installed with this method, it will be invoked
+every time you write a value to a DBM database.
+
+
+=item B<filter_fetch_key>
+
+If a filter has been installed with this method, it will be invoked
+every time you read a key from a DBM database.
+
+=item B<filter_fetch_value>
+
+If a filter has been installed with this method, it will be invoked
+every time you read a value from a DBM database.
+
+=back
+
+You can use any combination of the methods from none to all four.
+
+All filter methods return the existing filter, if present, or C<undef>
+in not.
+
+To delete a filter pass C<undef> to it.
+
+=head2 The Filter
+
+When each filter is called by Perl, a local copy of C<$_> will contain
+the key or value to be filtered. Filtering is achieved by modifying
+the contents of C<$_>. The return code from the filter is ignored.
+
+=head2 An Example -- the NULL termination problem.
+
+DBM Filters are useful for a class of problems where you I<always>
+want to make the same transformation to all keys, all values or both.
+
+For example, consider the following scenario. You have a DBM database
+that you need to share with a third-party C application. The C application
+assumes that I<all> keys and values are NULL terminated. Unfortunately
+when Perl writes to DBM databases it doesn't use NULL termination, so
+your Perl application will have to manage NULL termination itself. When
+you write to the database you will have to use something like this:
+
+ $hash{"$key\0"} = "$value\0";
+
+Similarly the NULL needs to be taken into account when you are considering
+the length of existing keys/values.
+
+It would be much better if you could ignore the NULL terminations issue
+in the main application code and have a mechanism that automatically
+added the terminating NULL to all keys and values whenever you write to
+the database and have them removed when you read from the database. As I'm
+sure you have already guessed, this is a problem that DBM Filters can
+fix very easily.
+
+ use strict;
+ use warnings;
+ use SDBM_File;
+ use Fcntl;
+
+ my %hash;
+ my $filename = "filt";
+ unlink $filename;
+
+ my $db = tie(%hash, 'SDBM_File', $filename, O_RDWR|O_CREAT, 0640)
+ or die "Cannot open $filename: $!\n";
+
+ # Install DBM Filters
+ $db->filter_fetch_key ( sub { s/\0$// } );
+ $db->filter_store_key ( sub { $_ .= "\0" } );
+ $db->filter_fetch_value(
+ sub { no warnings 'uninitialized'; s/\0$// } );
+ $db->filter_store_value( sub { $_ .= "\0" } );
+
+ $hash{"abc"} = "def";
+ my $a = $hash{"ABC"};
+ # ...
+ undef $db;
+ untie %hash;
+
+The code above uses SDBM_File, but it will work with any of the DBM
+modules.
+
+Hopefully the contents of each of the filters should be
+self-explanatory. Both "fetch" filters remove the terminating NULL,
+and both "store" filters add a terminating NULL.
+
+
+=head2 Another Example -- Key is a C int.
+
+Here is another real-life example. By default, whenever Perl writes to
+a DBM database it always writes the key and value as strings. So when
+you use this:
+
+ $hash{12345} = "something";
+
+the key 12345 will get stored in the DBM database as the 5 byte string
+"12345". If you actually want the key to be stored in the DBM database
+as a C int, you will have to use C<pack> when writing, and C<unpack>
+when reading.
+
+Here is a DBM Filter that does it:
+
+ use strict;
+ use warnings;
+ use DB_File;
+ my %hash;
+ my $filename = "filt";
+ unlink $filename;
+
+
+ my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH
+ or die "Cannot open $filename: $!\n";
+
+ $db->filter_fetch_key ( sub { $_ = unpack("i", $_) } );
+ $db->filter_store_key ( sub { $_ = pack ("i", $_) } );
+ $hash{123} = "def";
+ # ...
+ undef $db;
+ untie %hash;
+
+The code above uses DB_File, but again it will work with any of the
+DBM modules.
+
+This time only two filters have been used -- we only need to manipulate
+the contents of the key, so it wasn't necessary to install any value
+filters.
+
+=head1 SEE ALSO
+
+L<DB_File>, L<GDBM_File>, L<NDBM_File>, L<ODBM_File> and L<SDBM_File>.
+
+=head1 AUTHOR
+
+Paul Marquess
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perldebguts.pod b/Master/tlpkg/tlperl.straw/lib/pods/perldebguts.pod
new file mode 100755
index 00000000000..55f237b7557
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perldebguts.pod
@@ -0,0 +1,878 @@
+=head1 NAME
+
+perldebguts - Guts of Perl debugging
+
+=head1 DESCRIPTION
+
+This is not the perldebug(1) manpage, which tells you how to use
+the debugger. This manpage describes low-level details concerning
+the debugger's internals, which range from difficult to impossible
+to understand for anyone who isn't incredibly intimate with Perl's guts.
+Caveat lector.
+
+=head1 Debugger Internals
+
+Perl has special debugging hooks at compile-time and run-time used
+to create debugging environments. These hooks are not to be confused
+with the I<perl -Dxxx> command described in L<perlrun>, which is
+usable only if a special Perl is built per the instructions in the
+F<INSTALL> podpage in the Perl source tree.
+
+For example, whenever you call Perl's built-in C<caller> function
+from the package C<DB>, the arguments that the corresponding stack
+frame was called with are copied to the C<@DB::args> array. These
+mechanisms are enabled by calling Perl with the B<-d> switch.
+Specifically, the following additional features are enabled
+(cf. L<perlvar/$^P>):
+
+=over 4
+
+=item *
+
+Perl inserts the contents of C<$ENV{PERL5DB}> (or C<BEGIN {require
+'perl5db.pl'}> if not present) before the first line of your program.
+
+=item *
+
+Each array C<@{"_<$filename"}> holds the lines of $filename for a
+file compiled by Perl. The same is also true for C<eval>ed strings
+that contain subroutines, or which are currently being executed.
+The $filename for C<eval>ed strings looks like C<(eval 34)>.
+Code assertions in regexes look like C<(re_eval 19)>.
+
+Values in this array are magical in numeric context: they compare
+equal to zero only if the line is not breakable.
+
+=item *
+
+Each hash C<%{"_<$filename"}> contains breakpoints and actions keyed
+by line number. Individual entries (as opposed to the whole hash)
+are settable. Perl only cares about Boolean true here, although
+the values used by F<perl5db.pl> have the form
+C<"$break_condition\0$action">.
+
+The same holds for evaluated strings that contain subroutines, or
+which are currently being executed. The $filename for C<eval>ed strings
+looks like C<(eval 34)> or C<(re_eval 19)>.
+
+=item *
+
+Each scalar C<${"_<$filename"}> contains C<"_<$filename">. This is
+also the case for evaluated strings that contain subroutines, or
+which are currently being executed. The $filename for C<eval>ed
+strings looks like C<(eval 34)> or C<(re_eval 19)>.
+
+=item *
+
+After each C<require>d file is compiled, but before it is executed,
+C<DB::postponed(*{"_<$filename"})> is called if the subroutine
+C<DB::postponed> exists. Here, the $filename is the expanded name of
+the C<require>d file, as found in the values of %INC.
+
+=item *
+
+After each subroutine C<subname> is compiled, the existence of
+C<$DB::postponed{subname}> is checked. If this key exists,
+C<DB::postponed(subname)> is called if the C<DB::postponed> subroutine
+also exists.
+
+=item *
+
+A hash C<%DB::sub> is maintained, whose keys are subroutine names
+and whose values have the form C<filename:startline-endline>.
+C<filename> has the form C<(eval 34)> for subroutines defined inside
+C<eval>s, or C<(re_eval 19)> for those within regex code assertions.
+
+=item *
+
+When the execution of your program reaches a point that can hold a
+breakpoint, the C<DB::DB()> subroutine is called if any of the variables
+C<$DB::trace>, C<$DB::single>, or C<$DB::signal> is true. These variables
+are not C<local>izable. This feature is disabled when executing
+inside C<DB::DB()>, including functions called from it
+unless C<< $^D & (1<<30) >> is true.
+
+=item *
+
+When execution of the program reaches a subroutine call, a call to
+C<&DB::sub>(I<args>) is made instead, with C<$DB::sub> holding the
+name of the called subroutine. (This doesn't happen if the subroutine
+was compiled in the C<DB> package.)
+
+=back
+
+Note that if C<&DB::sub> needs external data for it to work, no
+subroutine call is possible without it. As an example, the standard
+debugger's C<&DB::sub> depends on the C<$DB::deep> variable
+(it defines how many levels of recursion deep into the debugger you can go
+before a mandatory break). If C<$DB::deep> is not defined, subroutine
+calls are not possible, even though C<&DB::sub> exists.
+
+=head2 Writing Your Own Debugger
+
+=head3 Environment Variables
+
+The C<PERL5DB> environment variable can be used to define a debugger.
+For example, the minimal "working" debugger (it actually doesn't do anything)
+consists of one line:
+
+ sub DB::DB {}
+
+It can easily be defined like this:
+
+ $ PERL5DB="sub DB::DB {}" perl -d your-script
+
+Another brief debugger, slightly more useful, can be created
+with only the line:
+
+ sub DB::DB {print ++$i; scalar <STDIN>}
+
+This debugger prints a number which increments for each statement
+encountered and waits for you to hit a newline before continuing
+to the next statement.
+
+The following debugger is actually useful:
+
+ {
+ package DB;
+ sub DB {}
+ sub sub {print ++$i, " $sub\n"; &$sub}
+ }
+
+It prints the sequence number of each subroutine call and the name of the
+called subroutine. Note that C<&DB::sub> is being compiled into the
+package C<DB> through the use of the C<package> directive.
+
+When it starts, the debugger reads your rc file (F<./.perldb> or
+F<~/.perldb> under Unix), which can set important options.
+(A subroutine (C<&afterinit>) can be defined here as well; it is executed
+after the debugger completes its own initialization.)
+
+After the rc file is read, the debugger reads the PERLDB_OPTS
+environment variable and uses it to set debugger options. The
+contents of this variable are treated as if they were the argument
+of an C<o ...> debugger command (q.v. in L<perldebug/Options>).
+
+=head3 Debugger internal variables
+
+In addition to the file and subroutine-related variables mentioned above,
+the debugger also maintains various magical internal variables.
+
+=over 4
+
+=item *
+
+C<@DB::dbline> is an alias for C<@{"::_<current_file"}>, which
+holds the lines of the currently-selected file (compiled by Perl), either
+explicitly chosen with the debugger's C<f> command, or implicitly by flow
+of execution.
+
+Values in this array are magical in numeric context: they compare
+equal to zero only if the line is not breakable.
+
+=item *
+
+C<%DB::dbline>, is an alias for C<%{"::_<current_file"}>, which
+contains breakpoints and actions keyed by line number in
+the currently-selected file, either explicitly chosen with the
+debugger's C<f> command, or implicitly by flow of execution.
+
+As previously noted, individual entries (as opposed to the whole hash)
+are settable. Perl only cares about Boolean true here, although
+the values used by F<perl5db.pl> have the form
+C<"$break_condition\0$action">.
+
+=back
+
+=head3 Debugger customization functions
+
+Some functions are provided to simplify customization.
+
+=over 4
+
+=item *
+
+See L<perldebug/"Configurable Options"> for a description of options parsed by
+C<DB::parse_options(string)>.
+
+=item *
+
+C<DB::dump_trace(skip[,count])> skips the specified number of frames
+and returns a list containing information about the calling frames (all
+of them, if C<count> is missing). Each entry is reference to a hash
+with keys C<context> (either C<.>, C<$>, or C<@>), C<sub> (subroutine
+name, or info about C<eval>), C<args> (C<undef> or a reference to
+an array), C<file>, and C<line>.
+
+=item *
+
+C<DB::print_trace(FH, skip[, count[, short]])> prints
+formatted info about caller frames. The last two functions may be
+convenient as arguments to C<< < >>, C<< << >> commands.
+
+=back
+
+Note that any variables and functions that are not documented in
+this manpages (or in L<perldebug>) are considered for internal
+use only, and as such are subject to change without notice.
+
+=head1 Frame Listing Output Examples
+
+The C<frame> option can be used to control the output of frame
+information. For example, contrast this expression trace:
+
+ $ perl -de 42
+ Stack dump during die enabled outside of evals.
+
+ Loading DB routines from perl5db.pl patch level 0.94
+ Emacs support available.
+
+ Enter h or `h h' for help.
+
+ main::(-e:1): 0
+ DB<1> sub foo { 14 }
+
+ DB<2> sub bar { 3 }
+
+ DB<3> t print foo() * bar()
+ main::((eval 172):3): print foo() + bar();
+ main::foo((eval 168):2):
+ main::bar((eval 170):2):
+ 42
+
+with this one, once the C<o>ption C<frame=2> has been set:
+
+ DB<4> o f=2
+ frame = '2'
+ DB<5> t print foo() * bar()
+ 3: foo() * bar()
+ entering main::foo
+ 2: sub foo { 14 };
+ exited main::foo
+ entering main::bar
+ 2: sub bar { 3 };
+ exited main::bar
+ 42
+
+By way of demonstration, we present below a laborious listing
+resulting from setting your C<PERLDB_OPTS> environment variable to
+the value C<f=n N>, and running I<perl -d -V> from the command line.
+Examples use various values of C<n> are shown to give you a feel
+for the difference between settings. Long those it may be, this
+is not a complete listing, but only excerpts.
+
+=over 4
+
+=item 1
+
+ entering main::BEGIN
+ entering Config::BEGIN
+ Package lib/Exporter.pm.
+ Package lib/Carp.pm.
+ Package lib/Config.pm.
+ entering Config::TIEHASH
+ entering Exporter::import
+ entering Exporter::export
+ entering Config::myconfig
+ entering Config::FETCH
+ entering Config::FETCH
+ entering Config::FETCH
+ entering Config::FETCH
+
+=item 2
+
+ entering main::BEGIN
+ entering Config::BEGIN
+ Package lib/Exporter.pm.
+ Package lib/Carp.pm.
+ exited Config::BEGIN
+ Package lib/Config.pm.
+ entering Config::TIEHASH
+ exited Config::TIEHASH
+ entering Exporter::import
+ entering Exporter::export
+ exited Exporter::export
+ exited Exporter::import
+ exited main::BEGIN
+ entering Config::myconfig
+ entering Config::FETCH
+ exited Config::FETCH
+ entering Config::FETCH
+ exited Config::FETCH
+ entering Config::FETCH
+
+=item 3
+
+ in $=main::BEGIN() from /dev/null:0
+ in $=Config::BEGIN() from lib/Config.pm:2
+ Package lib/Exporter.pm.
+ Package lib/Carp.pm.
+ Package lib/Config.pm.
+ in $=Config::TIEHASH('Config') from lib/Config.pm:644
+ in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from li
+ in @=Config::myconfig() from /dev/null:0
+ in $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'PERL_SUBVERSION') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'osname') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'osvers') from lib/Config.pm:574
+
+=item 4
+
+ in $=main::BEGIN() from /dev/null:0
+ in $=Config::BEGIN() from lib/Config.pm:2
+ Package lib/Exporter.pm.
+ Package lib/Carp.pm.
+ out $=Config::BEGIN() from lib/Config.pm:0
+ Package lib/Config.pm.
+ in $=Config::TIEHASH('Config') from lib/Config.pm:644
+ out $=Config::TIEHASH('Config') from lib/Config.pm:644
+ in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/
+ out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/
+ out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ out $=main::BEGIN() from /dev/null:0
+ in @=Config::myconfig() from /dev/null:0
+ in $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
+ out $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
+ out $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574
+ out $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'PERL_SUBVERSION') from lib/Config.pm:574
+
+=item 5
+
+ in $=main::BEGIN() from /dev/null:0
+ in $=Config::BEGIN() from lib/Config.pm:2
+ Package lib/Exporter.pm.
+ Package lib/Carp.pm.
+ out $=Config::BEGIN() from lib/Config.pm:0
+ Package lib/Config.pm.
+ in $=Config::TIEHASH('Config') from lib/Config.pm:644
+ out $=Config::TIEHASH('Config') from lib/Config.pm:644
+ in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E
+ out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E
+ out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ out $=main::BEGIN() from /dev/null:0
+ in @=Config::myconfig() from /dev/null:0
+ in $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574
+ out $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574
+ in $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
+ out $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
+
+=item 6
+
+ in $=CODE(0x15eca4)() from /dev/null:0
+ in $=CODE(0x182528)() from lib/Config.pm:2
+ Package lib/Exporter.pm.
+ out $=CODE(0x182528)() from lib/Config.pm:0
+ scalar context return from CODE(0x182528): undef
+ Package lib/Config.pm.
+ in $=Config::TIEHASH('Config') from lib/Config.pm:628
+ out $=Config::TIEHASH('Config') from lib/Config.pm:628
+ scalar context return from Config::TIEHASH: empty hash
+ in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
+ out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
+ scalar context return from Exporter::export: ''
+ out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ scalar context return from Exporter::import: ''
+
+=back
+
+In all cases shown above, the line indentation shows the call tree.
+If bit 2 of C<frame> is set, a line is printed on exit from a
+subroutine as well. If bit 4 is set, the arguments are printed
+along with the caller info. If bit 8 is set, the arguments are
+printed even if they are tied or references. If bit 16 is set, the
+return value is printed, too.
+
+When a package is compiled, a line like this
+
+ Package lib/Carp.pm.
+
+is printed with proper indentation.
+
+=head1 Debugging regular expressions
+
+There are two ways to enable debugging output for regular expressions.
+
+If your perl is compiled with C<-DDEBUGGING>, you may use the
+B<-Dr> flag on the command line.
+
+Otherwise, one can C<use re 'debug'>, which has effects at
+compile time and run time. It is not lexically scoped.
+
+=head2 Compile-time output
+
+The debugging output at compile time looks like this:
+
+ Compiling REx `[bc]d(ef*g)+h[ij]k$'
+ size 45 Got 364 bytes for offset annotations.
+ first at 1
+ rarest char g at 0
+ rarest char d at 0
+ 1: ANYOF[bc](12)
+ 12: EXACT <d>(14)
+ 14: CURLYX[0] {1,32767}(28)
+ 16: OPEN1(18)
+ 18: EXACT <e>(20)
+ 20: STAR(23)
+ 21: EXACT <f>(0)
+ 23: EXACT <g>(25)
+ 25: CLOSE1(27)
+ 27: WHILEM[1/1](0)
+ 28: NOTHING(29)
+ 29: EXACT <h>(31)
+ 31: ANYOF[ij](42)
+ 42: EXACT <k>(44)
+ 44: EOL(45)
+ 45: END(0)
+ anchored `de' at 1 floating `gh' at 3..2147483647 (checking floating)
+ stclass `ANYOF[bc]' minlen 7
+ Offsets: [45]
+ 1[4] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 5[1]
+ 0[0] 12[1] 0[0] 6[1] 0[0] 7[1] 0[0] 9[1] 8[1] 0[0] 10[1] 0[0]
+ 11[1] 0[0] 12[0] 12[0] 13[1] 0[0] 14[4] 0[0] 0[0] 0[0] 0[0]
+ 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 18[1] 0[0] 19[1] 20[0]
+ Omitting $` $& $' support.
+
+The first line shows the pre-compiled form of the regex. The second
+shows the size of the compiled form (in arbitrary units, usually
+4-byte words) and the total number of bytes allocated for the
+offset/length table, usually 4+C<size>*8. The next line shows the
+label I<id> of the first node that does a match.
+
+The
+
+ anchored `de' at 1 floating `gh' at 3..2147483647 (checking floating)
+ stclass `ANYOF[bc]' minlen 7
+
+line (split into two lines above) contains optimizer
+information. In the example shown, the optimizer found that the match
+should contain a substring C<de> at offset 1, plus substring C<gh>
+at some offset between 3 and infinity. Moreover, when checking for
+these substrings (to abandon impossible matches quickly), Perl will check
+for the substring C<gh> before checking for the substring C<de>. The
+optimizer may also use the knowledge that the match starts (at the
+C<first> I<id>) with a character class, and no string
+shorter than 7 characters can possibly match.
+
+The fields of interest which may appear in this line are
+
+=over 4
+
+=item C<anchored> I<STRING> C<at> I<POS>
+
+=item C<floating> I<STRING> C<at> I<POS1..POS2>
+
+See above.
+
+=item C<matching floating/anchored>
+
+Which substring to check first.
+
+=item C<minlen>
+
+The minimal length of the match.
+
+=item C<stclass> I<TYPE>
+
+Type of first matching node.
+
+=item C<noscan>
+
+Don't scan for the found substrings.
+
+=item C<isall>
+
+Means that the optimizer information is all that the regular
+expression contains, and thus one does not need to enter the regex engine at
+all.
+
+=item C<GPOS>
+
+Set if the pattern contains C<\G>.
+
+=item C<plus>
+
+Set if the pattern starts with a repeated char (as in C<x+y>).
+
+=item C<implicit>
+
+Set if the pattern starts with C<.*>.
+
+=item C<with eval>
+
+Set if the pattern contain eval-groups, such as C<(?{ code })> and
+C<(??{ code })>.
+
+=item C<anchored(TYPE)>
+
+If the pattern may match only at a handful of places, (with C<TYPE>
+being C<BOL>, C<MBOL>, or C<GPOS>. See the table below.
+
+=back
+
+If a substring is known to match at end-of-line only, it may be
+followed by C<$>, as in C<floating `k'$>.
+
+The optimizer-specific information is used to avoid entering (a slow) regex
+engine on strings that will not definitely match. If the C<isall> flag
+is set, a call to the regex engine may be avoided even when the optimizer
+found an appropriate place for the match.
+
+Above the optimizer section is the list of I<nodes> of the compiled
+form of the regex. Each line has format
+
+C< >I<id>: I<TYPE> I<OPTIONAL-INFO> (I<next-id>)
+
+=head2 Types of nodes
+
+Here are the possible types, with short descriptions:
+
+ # TYPE arg-description [num-args] [longjump-len] DESCRIPTION
+
+ # Exit points
+ END no End of program.
+ SUCCEED no Return from a subroutine, basically.
+
+ # Anchors:
+ BOL no Match "" at beginning of line.
+ MBOL no Same, assuming multiline.
+ SBOL no Same, assuming singleline.
+ EOS no Match "" at end of string.
+ EOL no Match "" at end of line.
+ MEOL no Same, assuming multiline.
+ SEOL no Same, assuming singleline.
+ BOUND no Match "" at any word boundary
+ BOUNDL no Match "" at any word boundary
+ NBOUND no Match "" at any word non-boundary
+ NBOUNDL no Match "" at any word non-boundary
+ GPOS no Matches where last m//g left off.
+
+ # [Special] alternatives
+ ANY no Match any one character (except newline).
+ SANY no Match any one character.
+ ANYOF sv Match character in (or not in) this class.
+ ALNUM no Match any alphanumeric character
+ ALNUML no Match any alphanumeric char in locale
+ NALNUM no Match any non-alphanumeric character
+ NALNUML no Match any non-alphanumeric char in locale
+ SPACE no Match any whitespace character
+ SPACEL no Match any whitespace char in locale
+ NSPACE no Match any non-whitespace character
+ NSPACEL no Match any non-whitespace char in locale
+ DIGIT no Match any numeric character
+ NDIGIT no Match any non-numeric character
+
+ # BRANCH The set of branches constituting a single choice are hooked
+ # together with their "next" pointers, since precedence prevents
+ # anything being concatenated to any individual branch. The
+ # "next" pointer of the last BRANCH in a choice points to the
+ # thing following the whole choice. This is also where the
+ # final "next" pointer of each individual branch points; each
+ # branch starts with the operand node of a BRANCH node.
+ #
+ BRANCH node Match this alternative, or the next...
+
+ # BACK Normal "next" pointers all implicitly point forward; BACK
+ # exists to make loop structures possible.
+ # not used
+ BACK no Match "", "next" ptr points backward.
+
+ # Literals
+ EXACT sv Match this string (preceded by length).
+ EXACTF sv Match this string, folded (prec. by length).
+ EXACTFL sv Match this string, folded in locale (w/len).
+
+ # Do nothing
+ NOTHING no Match empty string.
+ # A variant of above which delimits a group, thus stops optimizations
+ TAIL no Match empty string. Can jump here from outside.
+
+ # STAR,PLUS '?', and complex '*' and '+', are implemented as circular
+ # BRANCH structures using BACK. Simple cases (one character
+ # per match) are implemented with STAR and PLUS for speed
+ # and to minimize recursive plunges.
+ #
+ STAR node Match this (simple) thing 0 or more times.
+ PLUS node Match this (simple) thing 1 or more times.
+
+ CURLY sv 2 Match this simple thing {n,m} times.
+ CURLYN no 2 Match next-after-this simple thing
+ # {n,m} times, set parens.
+ CURLYM no 2 Match this medium-complex thing {n,m} times.
+ CURLYX sv 2 Match this complex thing {n,m} times.
+
+ # This terminator creates a loop structure for CURLYX
+ WHILEM no Do curly processing and see if rest matches.
+
+ # OPEN,CLOSE,GROUPP ...are numbered at compile time.
+ OPEN num 1 Mark this point in input as start of #n.
+ CLOSE num 1 Analogous to OPEN.
+
+ REF num 1 Match some already matched string
+ REFF num 1 Match already matched string, folded
+ REFFL num 1 Match already matched string, folded in loc.
+
+ # grouping assertions
+ IFMATCH off 1 2 Succeeds if the following matches.
+ UNLESSM off 1 2 Fails if the following matches.
+ SUSPEND off 1 1 "Independent" sub-regex.
+ IFTHEN off 1 1 Switch, should be preceded by switcher .
+ GROUPP num 1 Whether the group matched.
+
+ # Support for long regex
+ LONGJMP off 1 1 Jump far away.
+ BRANCHJ off 1 1 BRANCH with long offset.
+
+ # The heavy worker
+ EVAL evl 1 Execute some Perl code.
+
+ # Modifiers
+ MINMOD no Next operator is not greedy.
+ LOGICAL no Next opcode should set the flag only.
+
+ # This is not used yet
+ RENUM off 1 1 Group with independently numbered parens.
+
+ # This is not really a node, but an optimized away piece of a "long" node.
+ # To simplify debugging output, we mark it as if it were a node
+ OPTIMIZED off Placeholder for dump.
+
+=for unprinted-credits
+Next section M-J. Dominus (mjd-perl-patch+@plover.com) 20010421
+
+Following the optimizer information is a dump of the offset/length
+table, here split across several lines:
+
+ Offsets: [45]
+ 1[4] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 5[1]
+ 0[0] 12[1] 0[0] 6[1] 0[0] 7[1] 0[0] 9[1] 8[1] 0[0] 10[1] 0[0]
+ 11[1] 0[0] 12[0] 12[0] 13[1] 0[0] 14[4] 0[0] 0[0] 0[0] 0[0]
+ 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 18[1] 0[0] 19[1] 20[0]
+
+The first line here indicates that the offset/length table contains 45
+entries. Each entry is a pair of integers, denoted by C<offset[length]>.
+Entries are numbered starting with 1, so entry #1 here is C<1[4]> and
+entry #12 is C<5[1]>. C<1[4]> indicates that the node labeled C<1:>
+(the C<1: ANYOF[bc]>) begins at character position 1 in the
+pre-compiled form of the regex, and has a length of 4 characters.
+C<5[1]> in position 12
+indicates that the node labeled C<12:>
+(the C<< 12: EXACT <d> >>) begins at character position 5 in the
+pre-compiled form of the regex, and has a length of 1 character.
+C<12[1]> in position 14
+indicates that the node labeled C<14:>
+(the C<< 14: CURLYX[0] {1,32767} >>) begins at character position 12 in the
+pre-compiled form of the regex, and has a length of 1 character---that
+is, it corresponds to the C<+> symbol in the precompiled regex.
+
+C<0[0]> items indicate that there is no corresponding node.
+
+=head2 Run-time output
+
+First of all, when doing a match, one may get no run-time output even
+if debugging is enabled. This means that the regex engine was never
+entered and that all of the job was therefore done by the optimizer.
+
+If the regex engine was entered, the output may look like this:
+
+ Matching `[bc]d(ef*g)+h[ij]k$' against `abcdefg__gh__'
+ Setting an EVAL scope, savestack=3
+ 2 <ab> <cdefg__gh_> | 1: ANYOF
+ 3 <abc> <defg__gh_> | 11: EXACT <d>
+ 4 <abcd> <efg__gh_> | 13: CURLYX {1,32767}
+ 4 <abcd> <efg__gh_> | 26: WHILEM
+ 0 out of 1..32767 cc=effff31c
+ 4 <abcd> <efg__gh_> | 15: OPEN1
+ 4 <abcd> <efg__gh_> | 17: EXACT <e>
+ 5 <abcde> <fg__gh_> | 19: STAR
+ EXACT <f> can match 1 times out of 32767...
+ Setting an EVAL scope, savestack=3
+ 6 <bcdef> <g__gh__> | 22: EXACT <g>
+ 7 <bcdefg> <__gh__> | 24: CLOSE1
+ 7 <bcdefg> <__gh__> | 26: WHILEM
+ 1 out of 1..32767 cc=effff31c
+ Setting an EVAL scope, savestack=12
+ 7 <bcdefg> <__gh__> | 15: OPEN1
+ 7 <bcdefg> <__gh__> | 17: EXACT <e>
+ restoring \1 to 4(4)..7
+ failed, try continuation...
+ 7 <bcdefg> <__gh__> | 27: NOTHING
+ 7 <bcdefg> <__gh__> | 28: EXACT <h>
+ failed...
+ failed...
+
+The most significant information in the output is about the particular I<node>
+of the compiled regex that is currently being tested against the target string.
+The format of these lines is
+
+C< >I<STRING-OFFSET> <I<PRE-STRING>> <I<POST-STRING>> |I<ID>: I<TYPE>
+
+The I<TYPE> info is indented with respect to the backtracking level.
+Other incidental information appears interspersed within.
+
+=head1 Debugging Perl memory usage
+
+Perl is a profligate wastrel when it comes to memory use. There
+is a saying that to estimate memory usage of Perl, assume a reasonable
+algorithm for memory allocation, multiply that estimate by 10, and
+while you still may miss the mark, at least you won't be quite so
+astonished. This is not absolutely true, but may provide a good
+grasp of what happens.
+
+Assume that an integer cannot take less than 20 bytes of memory, a
+float cannot take less than 24 bytes, a string cannot take less
+than 32 bytes (all these examples assume 32-bit architectures, the
+result are quite a bit worse on 64-bit architectures). If a variable
+is accessed in two of three different ways (which require an integer,
+a float, or a string), the memory footprint may increase yet another
+20 bytes. A sloppy malloc(3) implementation can inflate these
+numbers dramatically.
+
+On the opposite end of the scale, a declaration like
+
+ sub foo;
+
+may take up to 500 bytes of memory, depending on which release of Perl
+you're running.
+
+Anecdotal estimates of source-to-compiled code bloat suggest an
+eightfold increase. This means that the compiled form of reasonable
+(normally commented, properly indented etc.) code will take
+about eight times more space in memory than the code took
+on disk.
+
+The B<-DL> command-line switch is obsolete since circa Perl 5.6.0
+(it was available only if Perl was built with C<-DDEBUGGING>).
+The switch was used to track Perl's memory allocations and possible
+memory leaks. These days the use of malloc debugging tools like
+F<Purify> or F<valgrind> is suggested instead. See also
+L<perlhack/PERL_MEM_LOG>.
+
+One way to find out how much memory is being used by Perl data
+structures is to install the Devel::Size module from CPAN: it gives
+you the minimum number of bytes required to store a particular data
+structure. Please be mindful of the difference between the size()
+and total_size().
+
+If Perl has been compiled using Perl's malloc you can analyze Perl
+memory usage by setting the $ENV{PERL_DEBUG_MSTATS}.
+
+=head2 Using C<$ENV{PERL_DEBUG_MSTATS}>
+
+If your perl is using Perl's malloc() and was compiled with the
+necessary switches (this is the default), then it will print memory
+usage statistics after compiling your code when C<< $ENV{PERL_DEBUG_MSTATS}
+> 1 >>, and before termination of the program when C<<
+$ENV{PERL_DEBUG_MSTATS} >= 1 >>. The report format is similar to
+the following example:
+
+ $ PERL_DEBUG_MSTATS=2 perl -e "require Carp"
+ Memory allocation statistics after compilation: (buckets 4(4)..8188(8192)
+ 14216 free: 130 117 28 7 9 0 2 2 1 0 0
+ 437 61 36 0 5
+ 60924 used: 125 137 161 55 7 8 6 16 2 0 1
+ 74 109 304 84 20
+ Total sbrk(): 77824/21:119. Odd ends: pad+heads+chain+tail: 0+636+0+2048.
+ Memory allocation statistics after execution: (buckets 4(4)..8188(8192)
+ 30888 free: 245 78 85 13 6 2 1 3 2 0 1
+ 315 162 39 42 11
+ 175816 used: 265 176 1112 111 26 22 11 27 2 1 1
+ 196 178 1066 798 39
+ Total sbrk(): 215040/47:145. Odd ends: pad+heads+chain+tail: 0+2192+0+6144.
+
+It is possible to ask for such a statistic at arbitrary points in
+your execution using the mstat() function out of the standard
+Devel::Peek module.
+
+Here is some explanation of that format:
+
+=over 4
+
+=item C<buckets SMALLEST(APPROX)..GREATEST(APPROX)>
+
+Perl's malloc() uses bucketed allocations. Every request is rounded
+up to the closest bucket size available, and a bucket is taken from
+the pool of buckets of that size.
+
+The line above describes the limits of buckets currently in use.
+Each bucket has two sizes: memory footprint and the maximal size
+of user data that can fit into this bucket. Suppose in the above
+example that the smallest bucket were size 4. The biggest bucket
+would have usable size 8188, and the memory footprint would be 8192.
+
+In a Perl built for debugging, some buckets may have negative usable
+size. This means that these buckets cannot (and will not) be used.
+For larger buckets, the memory footprint may be one page greater
+than a power of 2. If so, case the corresponding power of two is
+printed in the C<APPROX> field above.
+
+=item Free/Used
+
+The 1 or 2 rows of numbers following that correspond to the number
+of buckets of each size between C<SMALLEST> and C<GREATEST>. In
+the first row, the sizes (memory footprints) of buckets are powers
+of two--or possibly one page greater. In the second row, if present,
+the memory footprints of the buckets are between the memory footprints
+of two buckets "above".
+
+For example, suppose under the previous example, the memory footprints
+were
+
+ free: 8 16 32 64 128 256 512 1024 2048 4096 8192
+ 4 12 24 48 80
+
+With non-C<DEBUGGING> perl, the buckets starting from C<128> have
+a 4-byte overhead, and thus an 8192-long bucket may take up to
+8188-byte allocations.
+
+=item C<Total sbrk(): SBRKed/SBRKs:CONTINUOUS>
+
+The first two fields give the total amount of memory perl sbrk(2)ed
+(ess-broken? :-) and number of sbrk(2)s used. The third number is
+what perl thinks about continuity of returned chunks. So long as
+this number is positive, malloc() will assume that it is probable
+that sbrk(2) will provide continuous memory.
+
+Memory allocated by external libraries is not counted.
+
+=item C<pad: 0>
+
+The amount of sbrk(2)ed memory needed to keep buckets aligned.
+
+=item C<heads: 2192>
+
+Although memory overhead of bigger buckets is kept inside the bucket, for
+smaller buckets, it is kept in separate areas. This field gives the
+total size of these areas.
+
+=item C<chain: 0>
+
+malloc() may want to subdivide a bigger bucket into smaller buckets.
+If only a part of the deceased bucket is left unsubdivided, the rest
+is kept as an element of a linked list. This field gives the total
+size of these chunks.
+
+=item C<tail: 6144>
+
+To minimize the number of sbrk(2)s, malloc() asks for more memory. This
+field gives the size of the yet unused part, which is sbrk(2)ed, but
+never touched.
+
+=back
+
+=head1 SEE ALSO
+
+L<perldebug>,
+L<perlguts>,
+L<perlrun>
+L<re>,
+and
+L<Devel::DProf>.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perldebtut.pod b/Master/tlpkg/tlperl.straw/lib/pods/perldebtut.pod
new file mode 100755
index 00000000000..b10f9b4066e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perldebtut.pod
@@ -0,0 +1,723 @@
+=head1 NAME
+
+perldebtut - Perl debugging tutorial
+
+=head1 DESCRIPTION
+
+A (very) lightweight introduction in the use of the perl debugger, and a
+pointer to existing, deeper sources of information on the subject of debugging
+perl programs.
+
+There's an extraordinary number of people out there who don't appear to know
+anything about using the perl debugger, though they use the language every
+day.
+This is for them.
+
+
+=head1 use strict
+
+First of all, there's a few things you can do to make your life a lot more
+straightforward when it comes to debugging perl programs, without using the
+debugger at all. To demonstrate, here's a simple script, named "hello", with
+a problem:
+
+ #!/usr/bin/perl
+
+ $var1 = 'Hello World'; # always wanted to do that :-)
+ $var2 = "$varl\n";
+
+ print $var2;
+ exit;
+
+While this compiles and runs happily, it probably won't do what's expected,
+namely it doesn't print "Hello World\n" at all; It will on the other hand do
+exactly what it was told to do, computers being a bit that way inclined. That
+is, it will print out a newline character, and you'll get what looks like a
+blank line. It looks like there's 2 variables when (because of the typo)
+there's really 3:
+
+ $var1 = 'Hello World';
+ $varl = undef;
+ $var2 = "\n";
+
+To catch this kind of problem, we can force each variable to be declared
+before use by pulling in the strict module, by putting 'use strict;' after the
+first line of the script.
+
+Now when you run it, perl complains about the 3 undeclared variables and we
+get four error messages because one variable is referenced twice:
+
+ Global symbol "$var1" requires explicit package name at ./t1 line 4.
+ Global symbol "$var2" requires explicit package name at ./t1 line 5.
+ Global symbol "$varl" requires explicit package name at ./t1 line 5.
+ Global symbol "$var2" requires explicit package name at ./t1 line 7.
+ Execution of ./hello aborted due to compilation errors.
+
+Luvverly! and to fix this we declare all variables explicitly and now our
+script looks like this:
+
+ #!/usr/bin/perl
+ use strict;
+
+ my $var1 = 'Hello World';
+ my $varl = undef;
+ my $var2 = "$varl\n";
+
+ print $var2;
+ exit;
+
+We then do (always a good idea) a syntax check before we try to run it again:
+
+ > perl -c hello
+ hello syntax OK
+
+And now when we run it, we get "\n" still, but at least we know why. Just
+getting this script to compile has exposed the '$varl' (with the letter 'l')
+variable, and simply changing $varl to $var1 solves the problem.
+
+
+=head1 Looking at data and -w and v
+
+Ok, but how about when you want to really see your data, what's in that
+dynamic variable, just before using it?
+
+ #!/usr/bin/perl
+ use strict;
+
+ my $key = 'welcome';
+ my %data = (
+ 'this' => qw(that),
+ 'tom' => qw(and jerry),
+ 'welcome' => q(Hello World),
+ 'zip' => q(welcome),
+ );
+ my @data = keys %data;
+
+ print "$data{$key}\n";
+ exit;
+
+Looks OK, after it's been through the syntax check (perl -c scriptname), we
+run it and all we get is a blank line again! Hmmmm.
+
+One common debugging approach here, would be to liberally sprinkle a few print
+statements, to add a check just before we print out our data, and another just
+after:
+
+ print "All OK\n" if grep($key, keys %data);
+ print "$data{$key}\n";
+ print "done: '$data{$key}'\n";
+
+And try again:
+
+ > perl data
+ All OK
+
+ done: ''
+
+After much staring at the same piece of code and not seeing the wood for the
+trees for some time, we get a cup of coffee and try another approach. That
+is, we bring in the cavalry by giving perl the 'B<-d>' switch on the command
+line:
+
+ > perl -d data
+ Default die handler restored.
+
+ Loading DB routines from perl5db.pl version 1.07
+ Editor support available.
+
+ Enter h or `h h' for help, or `man perldebug' for more help.
+
+ main::(./data:4): my $key = 'welcome';
+
+Now, what we've done here is to launch the built-in perl debugger on our
+script. It's stopped at the first line of executable code and is waiting for
+input.
+
+Before we go any further, you'll want to know how to quit the debugger: use
+just the letter 'B<q>', not the words 'quit' or 'exit':
+
+ DB<1> q
+ >
+
+That's it, you're back on home turf again.
+
+
+=head1 help
+
+Fire the debugger up again on your script and we'll look at the help menu.
+There's a couple of ways of calling help: a simple 'B<h>' will get the summary
+help list, 'B<|h>' (pipe-h) will pipe the help through your pager (which is
+(probably 'more' or 'less'), and finally, 'B<h h>' (h-space-h) will give you
+the entire help screen. Here is the summary page:
+
+DB<1>h
+
+ List/search source lines: Control script execution:
+ l [ln|sub] List source code T Stack trace
+ - or . List previous/current line s [expr] Single step [in expr]
+ v [line] View around line n [expr] Next, steps over subs
+ f filename View source in file <CR/Enter> Repeat last n or s
+ /pattern/ ?patt? Search forw/backw r Return from subroutine
+ M Show module versions c [ln|sub] Continue until position
+ Debugger controls: L List break/watch/actions
+ o [...] Set debugger options t [expr] Toggle trace [trace expr]
+ <[<]|{[{]|>[>] [cmd] Do pre/post-prompt b [ln|event|sub] [cnd] Set breakpoint
+ ! [N|pat] Redo a previous command B ln|* Delete a/all breakpoints
+ H [-num] Display last num commands a [ln] cmd Do cmd before line
+ = [a val] Define/list an alias A ln|* Delete a/all actions
+ h [db_cmd] Get help on command w expr Add a watch expression
+ h h Complete help page W expr|* Delete a/all watch exprs
+ |[|]db_cmd Send output to pager ![!] syscmd Run cmd in a subprocess
+ q or ^D Quit R Attempt a restart
+ Data Examination: expr Execute perl code, also see: s,n,t expr
+ x|m expr Evals expr in list context, dumps the result or lists methods.
+ p expr Print expression (uses script's current package).
+ S [[!]pat] List subroutine names [not] matching pattern
+ V [Pk [Vars]] List Variables in Package. Vars can be ~pattern or !pattern.
+ X [Vars] Same as "V current_package [Vars]".
+ y [n [Vars]] List lexicals in higher scope <n>. Vars same as V.
+ For more help, type h cmd_letter, or run man perldebug for all docs.
+
+More confusing options than you can shake a big stick at! It's not as bad as
+it looks and it's very useful to know more about all of it, and fun too!
+
+There's a couple of useful ones to know about straight away. You wouldn't
+think we're using any libraries at all at the moment, but 'B<M>' will show
+which modules are currently loaded, and their version number, while 'B<m>'
+will show the methods, and 'B<S>' shows all subroutines (by pattern) as
+shown below. 'B<V>' and 'B<X>' show variables in the program by package
+scope and can be constrained by pattern.
+
+ DB<2>S str
+ dumpvar::stringify
+ strict::bits
+ strict::import
+ strict::unimport
+
+Using 'X' and cousins requires you not to use the type identifiers ($@%), just
+the 'name':
+
+ DM<3>X ~err
+ FileHandle(stderr) => fileno(2)
+
+Remember we're in our tiny program with a problem, we should have a look at
+where we are, and what our data looks like. First of all let's view some code
+at our present position (the first line of code in this case), via 'B<v>':
+
+ DB<4> v
+ 1 #!/usr/bin/perl
+ 2: use strict;
+ 3
+ 4==> my $key = 'welcome';
+ 5: my %data = (
+ 6 'this' => qw(that),
+ 7 'tom' => qw(and jerry),
+ 8 'welcome' => q(Hello World),
+ 9 'zip' => q(welcome),
+ 10 );
+
+At line number 4 is a helpful pointer, that tells you where you are now. To
+see more code, type 'v' again:
+
+ DB<4> v
+ 8 'welcome' => q(Hello World),
+ 9 'zip' => q(welcome),
+ 10 );
+ 11: my @data = keys %data;
+ 12: print "All OK\n" if grep($key, keys %data);
+ 13: print "$data{$key}\n";
+ 14: print "done: '$data{$key}'\n";
+ 15: exit;
+
+And if you wanted to list line 5 again, type 'l 5', (note the space):
+
+ DB<4> l 5
+ 5: my %data = (
+
+In this case, there's not much to see, but of course normally there's pages of
+stuff to wade through, and 'l' can be very useful. To reset your view to the
+line we're about to execute, type a lone period '.':
+
+ DB<5> .
+ main::(./data_a:4): my $key = 'welcome';
+
+The line shown is the one that is about to be executed B<next>, it hasn't
+happened yet. So while we can print a variable with the letter 'B<p>', at
+this point all we'd get is an empty (undefined) value back. What we need to
+do is to step through the next executable statement with an 'B<s>':
+
+ DB<6> s
+ main::(./data_a:5): my %data = (
+ main::(./data_a:6): 'this' => qw(that),
+ main::(./data_a:7): 'tom' => qw(and jerry),
+ main::(./data_a:8): 'welcome' => q(Hello World),
+ main::(./data_a:9): 'zip' => q(welcome),
+ main::(./data_a:10): );
+
+Now we can have a look at that first ($key) variable:
+
+ DB<7> p $key
+ welcome
+
+line 13 is where the action is, so let's continue down to there via the letter
+'B<c>', which by the way, inserts a 'one-time-only' breakpoint at the given
+line or sub routine:
+
+ DB<8> c 13
+ All OK
+ main::(./data_a:13): print "$data{$key}\n";
+
+We've gone past our check (where 'All OK' was printed) and have stopped just
+before the meat of our task. We could try to print out a couple of variables
+to see what is happening:
+
+ DB<9> p $data{$key}
+
+Not much in there, lets have a look at our hash:
+
+ DB<10> p %data
+ Hello Worldziptomandwelcomejerrywelcomethisthat
+
+ DB<11> p keys %data
+ Hello Worldtomwelcomejerrythis
+
+Well, this isn't very easy to read, and using the helpful manual (B<h h>), the
+'B<x>' command looks promising:
+
+ DB<12> x %data
+ 0 'Hello World'
+ 1 'zip'
+ 2 'tom'
+ 3 'and'
+ 4 'welcome'
+ 5 undef
+ 6 'jerry'
+ 7 'welcome'
+ 8 'this'
+ 9 'that'
+
+That's not much help, a couple of welcomes in there, but no indication of
+which are keys, and which are values, it's just a listed array dump and, in
+this case, not particularly helpful. The trick here, is to use a B<reference>
+to the data structure:
+
+ DB<13> x \%data
+ 0 HASH(0x8194bc4)
+ 'Hello World' => 'zip'
+ 'jerry' => 'welcome'
+ 'this' => 'that'
+ 'tom' => 'and'
+ 'welcome' => undef
+
+The reference is truly dumped and we can finally see what we're dealing with.
+Our quoting was perfectly valid but wrong for our purposes, with 'and jerry'
+being treated as 2 separate words rather than a phrase, thus throwing the
+evenly paired hash structure out of alignment.
+
+The 'B<-w>' switch would have told us about this, had we used it at the start,
+and saved us a lot of trouble:
+
+ > perl -w data
+ Odd number of elements in hash assignment at ./data line 5.
+
+We fix our quoting: 'tom' => q(and jerry), and run it again, this time we get
+our expected output:
+
+ > perl -w data
+ Hello World
+
+
+While we're here, take a closer look at the 'B<x>' command, it's really useful
+and will merrily dump out nested references, complete objects, partial objects
+- just about whatever you throw at it:
+
+Let's make a quick object and x-plode it, first we'll start the debugger:
+it wants some form of input from STDIN, so we give it something non-committal,
+a zero:
+
+ > perl -de 0
+ Default die handler restored.
+
+ Loading DB routines from perl5db.pl version 1.07
+ Editor support available.
+
+ Enter h or `h h' for help, or `man perldebug' for more help.
+
+ main::(-e:1): 0
+
+Now build an on-the-fly object over a couple of lines (note the backslash):
+
+ DB<1> $obj = bless({'unique_id'=>'123', 'attr'=> \
+ cont: {'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class')
+
+And let's have a look at it:
+
+ DB<2> x $obj
+ 0 MY_class=HASH(0x828ad98)
+ 'attr' => HASH(0x828ad68)
+ 'col' => 'black'
+ 'things' => ARRAY(0x828abb8)
+ 0 'this'
+ 1 'that'
+ 2 'etc'
+ 'unique_id' => 123
+ DB<3>
+
+Useful, huh? You can eval nearly anything in there, and experiment with bits
+of code or regexes until the cows come home:
+
+ DB<3> @data = qw(this that the other atheism leather theory scythe)
+
+ DB<4> p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data))
+ atheism
+ leather
+ other
+ scythe
+ the
+ theory
+ saw -> 6
+
+If you want to see the command History, type an 'B<H>':
+
+ DB<5> H
+ 4: p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data))
+ 3: @data = qw(this that the other atheism leather theory scythe)
+ 2: x $obj
+ 1: $obj = bless({'unique_id'=>'123', 'attr'=>
+ {'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class')
+ DB<5>
+
+And if you want to repeat any previous command, use the exclamation: 'B<!>':
+
+ DB<5> !4
+ p 'saw -> '.($cnt += map { print "$_\n" } grep(/the/, sort @data))
+ atheism
+ leather
+ other
+ scythe
+ the
+ theory
+ saw -> 12
+
+For more on references see L<perlref> and L<perlreftut>
+
+
+=head1 Stepping through code
+
+Here's a simple program which converts between Celsius and Fahrenheit, it too
+has a problem:
+
+ #!/usr/bin/perl -w
+ use strict;
+
+ my $arg = $ARGV[0] || '-c20';
+
+ if ($arg =~ /^\-(c|f)((\-|\+)*\d+(\.\d+)*)$/) {
+ my ($deg, $num) = ($1, $2);
+ my ($in, $out) = ($num, $num);
+ if ($deg eq 'c') {
+ $deg = 'f';
+ $out = &c2f($num);
+ } else {
+ $deg = 'c';
+ $out = &f2c($num);
+ }
+ $out = sprintf('%0.2f', $out);
+ $out =~ s/^((\-|\+)*\d+)\.0+$/$1/;
+ print "$out $deg\n";
+ } else {
+ print "Usage: $0 -[c|f] num\n";
+ }
+ exit;
+
+ sub f2c {
+ my $f = shift;
+ my $c = 5 * $f - 32 / 9;
+ return $c;
+ }
+
+ sub c2f {
+ my $c = shift;
+ my $f = 9 * $c / 5 + 32;
+ return $f;
+ }
+
+
+For some reason, the Fahrenheit to Celsius conversion fails to return the
+expected output. This is what it does:
+
+ > temp -c0.72
+ 33.30 f
+
+ > temp -f33.3
+ 162.94 c
+
+Not very consistent! We'll set a breakpoint in the code manually and run it
+under the debugger to see what's going on. A breakpoint is a flag, to which
+the debugger will run without interruption, when it reaches the breakpoint, it
+will stop execution and offer a prompt for further interaction. In normal
+use, these debugger commands are completely ignored, and they are safe - if a
+little messy, to leave in production code.
+
+ my ($in, $out) = ($num, $num);
+ $DB::single=2; # insert at line 9!
+ if ($deg eq 'c')
+ ...
+
+ > perl -d temp -f33.3
+ Default die handler restored.
+
+ Loading DB routines from perl5db.pl version 1.07
+ Editor support available.
+
+ Enter h or `h h' for help, or `man perldebug' for more help.
+
+ main::(temp:4): my $arg = $ARGV[0] || '-c100';
+
+We'll simply continue down to our pre-set breakpoint with a 'B<c>':
+
+ DB<1> c
+ main::(temp:10): if ($deg eq 'c') {
+
+Followed by a view command to see where we are:
+
+ DB<1> v
+ 7: my ($deg, $num) = ($1, $2);
+ 8: my ($in, $out) = ($num, $num);
+ 9: $DB::single=2;
+ 10==> if ($deg eq 'c') {
+ 11: $deg = 'f';
+ 12: $out = &c2f($num);
+ 13 } else {
+ 14: $deg = 'c';
+ 15: $out = &f2c($num);
+ 16 }
+
+And a print to show what values we're currently using:
+
+ DB<1> p $deg, $num
+ f33.3
+
+We can put another break point on any line beginning with a colon, we'll use
+line 17 as that's just as we come out of the subroutine, and we'd like to
+pause there later on:
+
+ DB<2> b 17
+
+There's no feedback from this, but you can see what breakpoints are set by
+using the list 'L' command:
+
+ DB<3> L
+ temp:
+ 17: print "$out $deg\n";
+ break if (1)
+
+Note that to delete a breakpoint you use 'd' or 'D'.
+
+Now we'll continue down into our subroutine, this time rather than by line
+number, we'll use the subroutine name, followed by the now familiar 'v':
+
+ DB<3> c f2c
+ main::f2c(temp:30): my $f = shift;
+
+ DB<4> v
+ 24: exit;
+ 25
+ 26 sub f2c {
+ 27==> my $f = shift;
+ 28: my $c = 5 * $f - 32 / 9;
+ 29: return $c;
+ 30 }
+ 31
+ 32 sub c2f {
+ 33: my $c = shift;
+
+
+Note that if there was a subroutine call between us and line 29, and we wanted
+to B<single-step> through it, we could use the 'B<s>' command, and to step
+over it we would use 'B<n>' which would execute the sub, but not descend into
+it for inspection. In this case though, we simply continue down to line 29:
+
+ DB<4> c 29
+ main::f2c(temp:29): return $c;
+
+And have a look at the return value:
+
+ DB<5> p $c
+ 162.944444444444
+
+This is not the right answer at all, but the sum looks correct. I wonder if
+it's anything to do with operator precedence? We'll try a couple of other
+possibilities with our sum:
+
+ DB<6> p (5 * $f - 32 / 9)
+ 162.944444444444
+
+ DB<7> p 5 * $f - (32 / 9)
+ 162.944444444444
+
+ DB<8> p (5 * $f) - 32 / 9
+ 162.944444444444
+
+ DB<9> p 5 * ($f - 32) / 9
+ 0.722222222222221
+
+:-) that's more like it! Ok, now we can set our return variable and we'll
+return out of the sub with an 'r':
+
+ DB<10> $c = 5 * ($f - 32) / 9
+
+ DB<11> r
+ scalar context return from main::f2c: 0.722222222222221
+
+Looks good, let's just continue off the end of the script:
+
+ DB<12> c
+ 0.72 c
+ Debugged program terminated. Use q to quit or R to restart,
+ use O inhibit_exit to avoid stopping after program termination,
+ h q, h R or h O to get additional info.
+
+A quick fix to the offending line (insert the missing parentheses) in the
+actual program and we're finished.
+
+
+=head1 Placeholder for a, w, t, T
+
+Actions, watch variables, stack traces etc.: on the TODO list.
+
+ a
+
+ w
+
+ t
+
+ T
+
+
+=head1 REGULAR EXPRESSIONS
+
+Ever wanted to know what a regex looked like? You'll need perl compiled with
+the DEBUGGING flag for this one:
+
+ > perl -Dr -e '/^pe(a)*rl$/i'
+ Compiling REx `^pe(a)*rl$'
+ size 17 first at 2
+ rarest char
+ at 0
+ 1: BOL(2)
+ 2: EXACTF <pe>(4)
+ 4: CURLYN[1] {0,32767}(14)
+ 6: NOTHING(8)
+ 8: EXACTF <a>(0)
+ 12: WHILEM(0)
+ 13: NOTHING(14)
+ 14: EXACTF <rl>(16)
+ 16: EOL(17)
+ 17: END(0)
+ floating `'$ at 4..2147483647 (checking floating) stclass `EXACTF <pe>'
+anchored(BOL) minlen 4
+ Omitting $` $& $' support.
+
+ EXECUTING...
+
+ Freeing REx: `^pe(a)*rl$'
+
+Did you really want to know? :-)
+For more gory details on getting regular expressions to work, have a look at
+L<perlre>, L<perlretut>, and to decode the mysterious labels (BOL and CURLYN,
+etc. above), see L<perldebguts>.
+
+
+=head1 OUTPUT TIPS
+
+To get all the output from your error log, and not miss any messages via
+helpful operating system buffering, insert a line like this, at the start of
+your script:
+
+ $|=1;
+
+To watch the tail of a dynamically growing logfile, (from the command line):
+
+ tail -f $error_log
+
+Wrapping all die calls in a handler routine can be useful to see how, and from
+where, they're being called, L<perlvar> has more information:
+
+ BEGIN { $SIG{__DIE__} = sub { require Carp; Carp::confess(@_) } }
+
+Various useful techniques for the redirection of STDOUT and STDERR filehandles
+are explained in L<perlopentut> and L<perlfaq8>.
+
+
+=head1 CGI
+
+Just a quick hint here for all those CGI programmers who can't figure out how
+on earth to get past that 'waiting for input' prompt, when running their CGI
+script from the command-line, try something like this:
+
+ > perl -d my_cgi.pl -nodebug
+
+Of course L<CGI> and L<perlfaq9> will tell you more.
+
+
+=head1 GUIs
+
+The command line interface is tightly integrated with an B<emacs> extension
+and there's a B<vi> interface too.
+
+You don't have to do this all on the command line, though, there are a few GUI
+options out there. The nice thing about these is you can wave a mouse over a
+variable and a dump of its data will appear in an appropriate window, or in a
+popup balloon, no more tiresome typing of 'x $varname' :-)
+
+In particular have a hunt around for the following:
+
+B<ptkdb> perlTK based wrapper for the built-in debugger
+
+B<ddd> data display debugger
+
+B<PerlDevKit> and B<PerlBuilder> are NT specific
+
+NB. (more info on these and others would be appreciated).
+
+
+=head1 SUMMARY
+
+We've seen how to encourage good coding practices with B<use strict> and
+B<-w>. We can run the perl debugger B<perl -d scriptname> to inspect your
+data from within the perl debugger with the B<p> and B<x> commands. You can
+walk through your code, set breakpoints with B<b> and step through that code
+with B<s> or B<n>, continue with B<c> and return from a sub with B<r>. Fairly
+intuitive stuff when you get down to it.
+
+There is of course lots more to find out about, this has just scratched the
+surface. The best way to learn more is to use perldoc to find out more about
+the language, to read the on-line help (L<perldebug> is probably the next
+place to go), and of course, experiment.
+
+
+=head1 SEE ALSO
+
+L<perldebug>,
+L<perldebguts>,
+L<perldiag>,
+L<dprofpp>,
+L<perlrun>
+
+
+=head1 AUTHOR
+
+Richard Foley <richard.foley@rfi.net> Copyright (c) 2000
+
+
+=head1 CONTRIBUTORS
+
+Various people have made helpful suggestions and contributions, in particular:
+
+Ronald J Kimball <rjk@linguist.dartmouth.edu>
+
+Hugo van der Sanden <hv@crypt0.demon.co.uk>
+
+Peter Scott <Peter@PSDT.com>
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perldebug.pod b/Master/tlpkg/tlperl.straw/lib/pods/perldebug.pod
new file mode 100755
index 00000000000..c37c5cfbb2c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perldebug.pod
@@ -0,0 +1,1174 @@
+=head1 NAME
+X<debug> X<debugger>
+
+perldebug - Perl debugging
+
+=head1 DESCRIPTION
+
+First of all, have you tried using the B<-w> switch?
+
+
+If you're new to the Perl debugger, you may prefer to read
+L<perldebtut>, which is a tutorial introduction to the debugger .
+
+=head1 The Perl Debugger
+
+If you invoke Perl with the B<-d> switch, your script runs under the
+Perl source debugger. This works like an interactive Perl
+environment, prompting for debugger commands that let you examine
+source code, set breakpoints, get stack backtraces, change the values of
+variables, etc. This is so convenient that you often fire up
+the debugger all by itself just to test out Perl constructs
+interactively to see what they do. For example:
+X<-d>
+
+ $ perl -d -e 42
+
+In Perl, the debugger is not a separate program the way it usually is in the
+typical compiled environment. Instead, the B<-d> flag tells the compiler
+to insert source information into the parse trees it's about to hand off
+to the interpreter. That means your code must first compile correctly
+for the debugger to work on it. Then when the interpreter starts up, it
+preloads a special Perl library file containing the debugger.
+
+The program will halt I<right before> the first run-time executable
+statement (but see below regarding compile-time statements) and ask you
+to enter a debugger command. Contrary to popular expectations, whenever
+the debugger halts and shows you a line of code, it always displays the
+line it's I<about> to execute, rather than the one it has just executed.
+
+Any command not recognized by the debugger is directly executed
+(C<eval>'d) as Perl code in the current package. (The debugger
+uses the DB package for keeping its own state information.)
+
+Note that the said C<eval> is bound by an implicit scope. As a
+result any newly introduced lexical variable or any modified
+capture buffer content is lost after the eval. The debugger is a
+nice environment to learn Perl, but if you interactively experiment using
+material which should be in the same scope, stuff it in one line.
+
+For any text entered at the debugger prompt, leading and trailing whitespace
+is first stripped before further processing. If a debugger command
+coincides with some function in your own program, merely precede the
+function with something that doesn't look like a debugger command, such
+as a leading C<;> or perhaps a C<+>, or by wrapping it with parentheses
+or braces.
+
+=head2 Calling the debugger
+
+There are several ways to call the debugger:
+
+=over 4
+
+=item perl -d program_name
+
+On the given program identified by C<program_name>.
+
+=item perl -d -e 0
+
+Interactively supply an arbitrary C<expression> using C<-e>.
+
+=item perl -d:Ptkdb program_name
+
+Debug a given program via the C<Devel::Ptkdb> GUI.
+
+=item perl -dt threaded_program_name
+
+Debug a given program using threads (experimental).
+
+=back
+
+=head2 Debugger Commands
+
+The interactive debugger understands the following commands:
+
+=over 12
+
+=item h
+X<debugger command, h>
+
+Prints out a summary help message
+
+=item h [command]
+
+Prints out a help message for the given debugger command.
+
+=item h h
+
+The special argument of C<h h> produces the entire help page, which is quite long.
+
+If the output of the C<h h> command (or any command, for that matter) scrolls
+past your screen, precede the command with a leading pipe symbol so
+that it's run through your pager, as in
+
+ DB> |h h
+
+You may change the pager which is used via C<o pager=...> command.
+
+
+=item p expr
+X<debugger command, p>
+
+Same as C<print {$DB::OUT} expr> in the current package. In particular,
+because this is just Perl's own C<print> function, this means that nested
+data structures and objects are not dumped, unlike with the C<x> command.
+
+The C<DB::OUT> filehandle is opened to F</dev/tty>, regardless of
+where STDOUT may be redirected to.
+
+=item x [maxdepth] expr
+X<debugger command, x>
+
+Evaluates its expression in list context and dumps out the result in a
+pretty-printed fashion. Nested data structures are printed out
+recursively, unlike the real C<print> function in Perl. When dumping
+hashes, you'll probably prefer 'x \%h' rather than 'x %h'.
+See L<Dumpvalue> if you'd like to do this yourself.
+
+The output format is governed by multiple options described under
+L<"Configurable Options">.
+
+If the C<maxdepth> is included, it must be a numeral I<N>; the value is
+dumped only I<N> levels deep, as if the C<dumpDepth> option had been
+temporarily set to I<N>.
+
+=item V [pkg [vars]]
+X<debugger command, V>
+
+Display all (or some) variables in package (defaulting to C<main>)
+using a data pretty-printer (hashes show their keys and values so
+you see what's what, control characters are made printable, etc.).
+Make sure you don't put the type specifier (like C<$>) there, just
+the symbol names, like this:
+
+ V DB filename line
+
+Use C<~pattern> and C<!pattern> for positive and negative regexes.
+
+This is similar to calling the C<x> command on each applicable var.
+
+=item X [vars]
+X<debugger command, X>
+
+Same as C<V currentpackage [vars]>.
+
+=item y [level [vars]]
+X<debugger command, y>
+
+Display all (or some) lexical variables (mnemonic: C<mY> variables)
+in the current scope or I<level> scopes higher. You can limit the
+variables that you see with I<vars> which works exactly as it does
+for the C<V> and C<X> commands. Requires the C<PadWalker> module
+version 0.08 or higher; will warn if this isn't installed. Output
+is pretty-printed in the same style as for C<V> and the format is
+controlled by the same options.
+
+=item T
+X<debugger command, T> X<backtrace> X<stack, backtrace>
+
+Produce a stack backtrace. See below for details on its output.
+
+=item s [expr]
+X<debugger command, s> X<step>
+
+Single step. Executes until the beginning of another
+statement, descending into subroutine calls. If an expression is
+supplied that includes function calls, it too will be single-stepped.
+
+=item n [expr]
+X<debugger command, n>
+
+Next. Executes over subroutine calls, until the beginning
+of the next statement. If an expression is supplied that includes
+function calls, those functions will be executed with stops before
+each statement.
+
+=item r
+X<debugger command, r>
+
+Continue until the return from the current subroutine.
+Dump the return value if the C<PrintRet> option is set (default).
+
+=item <CR>
+
+Repeat last C<n> or C<s> command.
+
+=item c [line|sub]
+X<debugger command, c>
+
+Continue, optionally inserting a one-time-only breakpoint
+at the specified line or subroutine.
+
+=item l
+X<debugger command, l>
+
+List next window of lines.
+
+=item l min+incr
+
+List C<incr+1> lines starting at C<min>.
+
+=item l min-max
+
+List lines C<min> through C<max>. C<l -> is synonymous to C<->.
+
+=item l line
+
+List a single line.
+
+=item l subname
+
+List first window of lines from subroutine. I<subname> may
+be a variable that contains a code reference.
+
+=item -
+X<debugger command, ->
+
+List previous window of lines.
+
+=item v [line]
+X<debugger command, v>
+
+View a few lines of code around the current line.
+
+=item .
+X<debugger command, .>
+
+Return the internal debugger pointer to the line last
+executed, and print out that line.
+
+=item f filename
+X<debugger command, f>
+
+Switch to viewing a different file or C<eval> statement. If I<filename>
+is not a full pathname found in the values of %INC, it is considered
+a regex.
+
+C<eval>ed strings (when accessible) are considered to be filenames:
+C<f (eval 7)> and C<f eval 7\b> access the body of the 7th C<eval>ed string
+(in the order of execution). The bodies of the currently executed C<eval>
+and of C<eval>ed strings that define subroutines are saved and thus
+accessible.
+
+=item /pattern/
+
+Search forwards for pattern (a Perl regex); final / is optional.
+The search is case-insensitive by default.
+
+=item ?pattern?
+
+Search backwards for pattern; final ? is optional.
+The search is case-insensitive by default.
+
+=item L [abw]
+X<debugger command, L>
+
+List (default all) actions, breakpoints and watch expressions
+
+=item S [[!]regex]
+X<debugger command, S>
+
+List subroutine names [not] matching the regex.
+
+=item t
+X<debugger command, t>
+
+Toggle trace mode (see also the C<AutoTrace> option).
+
+=item t expr
+X<debugger command, t>
+
+Trace through execution of C<expr>.
+See L<perldebguts/"Frame Listing Output Examples"> for examples.
+
+=item b
+X<breakpoint>
+X<debugger command, b>
+
+Sets breakpoint on current line
+
+=item b [line] [condition]
+X<breakpoint>
+X<debugger command, b>
+
+Set a breakpoint before the given line. If a condition
+is specified, it's evaluated each time the statement is reached: a
+breakpoint is taken only if the condition is true. Breakpoints may
+only be set on lines that begin an executable statement. Conditions
+don't use C<if>:
+
+ b 237 $x > 30
+ b 237 ++$count237 < 11
+ b 33 /pattern/i
+
+=item b subname [condition]
+X<breakpoint>
+X<debugger command, b>
+
+Set a breakpoint before the first line of the named subroutine. I<subname> may
+be a variable containing a code reference (in this case I<condition>
+is not supported).
+
+=item b postpone subname [condition]
+X<breakpoint>
+X<debugger command, b>
+
+Set a breakpoint at first line of subroutine after it is compiled.
+
+=item b load filename
+X<breakpoint>
+X<debugger command, b>
+
+Set a breakpoint before the first executed line of the I<filename>,
+which should be a full pathname found amongst the %INC values.
+
+=item b compile subname
+X<breakpoint>
+X<debugger command, b>
+
+Sets a breakpoint before the first statement executed after the specified
+subroutine is compiled.
+
+=item B line
+X<breakpoint>
+X<debugger command, B>
+
+Delete a breakpoint from the specified I<line>.
+
+=item B *
+X<breakpoint>
+X<debugger command, B>
+
+Delete all installed breakpoints.
+
+=item a [line] command
+X<debugger command, a>
+
+Set an action to be done before the line is executed. If I<line> is
+omitted, set an action on the line about to be executed.
+The sequence of steps taken by the debugger is
+
+ 1. check for a breakpoint at this line
+ 2. print the line if necessary (tracing)
+ 3. do any actions associated with that line
+ 4. prompt user if at a breakpoint or in single-step
+ 5. evaluate line
+
+For example, this will print out $foo every time line
+53 is passed:
+
+ a 53 print "DB FOUND $foo\n"
+
+=item A line
+X<debugger command, A>
+
+Delete an action from the specified line.
+
+=item A *
+X<debugger command, A>
+
+Delete all installed actions.
+
+=item w expr
+X<debugger command, w>
+
+Add a global watch-expression. Whenever a watched global changes the
+debugger will stop and display the old and new values.
+
+=item W expr
+X<debugger command, W>
+
+Delete watch-expression
+
+=item W *
+X<debugger command, W>
+
+Delete all watch-expressions.
+
+=item o
+X<debugger command, o>
+
+Display all options
+
+=item o booloption ...
+X<debugger command, o>
+
+Set each listed Boolean option to the value C<1>.
+
+=item o anyoption? ...
+X<debugger command, o>
+
+Print out the value of one or more options.
+
+=item o option=value ...
+X<debugger command, o>
+
+Set the value of one or more options. If the value has internal
+whitespace, it should be quoted. For example, you could set C<o
+pager="less -MQeicsNfr"> to call B<less> with those specific options.
+You may use either single or double quotes, but if you do, you must
+escape any embedded instances of same sort of quote you began with,
+as well as any escaping any escapes that immediately precede that
+quote but which are not meant to escape the quote itself. In other
+words, you follow single-quoting rules irrespective of the quote;
+eg: C<o option='this isn\'t bad'> or C<o option="She said, \"Isn't
+it?\"">.
+
+For historical reasons, the C<=value> is optional, but defaults to
+1 only where it is safe to do so--that is, mostly for Boolean
+options. It is always better to assign a specific value using C<=>.
+The C<option> can be abbreviated, but for clarity probably should
+not be. Several options can be set together. See L<"Configurable Options">
+for a list of these.
+
+=item < ?
+X<< debugger command, < >>
+
+List out all pre-prompt Perl command actions.
+
+=item < [ command ]
+X<< debugger command, < >>
+
+Set an action (Perl command) to happen before every debugger prompt.
+A multi-line command may be entered by backslashing the newlines.
+
+=item < *
+X<< debugger command, < >>
+
+Delete all pre-prompt Perl command actions.
+
+=item << command
+X<< debugger command, << >>
+
+Add an action (Perl command) to happen before every debugger prompt.
+A multi-line command may be entered by backwhacking the newlines.
+
+=item > ?
+X<< debugger command, > >>
+
+List out post-prompt Perl command actions.
+
+=item > command
+X<< debugger command, > >>
+
+Set an action (Perl command) to happen after the prompt when you've
+just given a command to return to executing the script. A multi-line
+command may be entered by backslashing the newlines (we bet you
+couldn't have guessed this by now).
+
+=item > *
+X<< debugger command, > >>
+
+Delete all post-prompt Perl command actions.
+
+=item >> command
+X<<< debugger command, >> >>>
+
+Adds an action (Perl command) to happen after the prompt when you've
+just given a command to return to executing the script. A multi-line
+command may be entered by backslashing the newlines.
+
+=item { ?
+X<debugger command, {>
+
+List out pre-prompt debugger commands.
+
+=item { [ command ]
+
+Set an action (debugger command) to happen before every debugger prompt.
+A multi-line command may be entered in the customary fashion.
+
+Because this command is in some senses new, a warning is issued if
+you appear to have accidentally entered a block instead. If that's
+what you mean to do, write it as with C<;{ ... }> or even
+C<do { ... }>.
+
+=item { *
+X<debugger command, {>
+
+Delete all pre-prompt debugger commands.
+
+=item {{ command
+X<debugger command, {{>
+
+Add an action (debugger command) to happen before every debugger prompt.
+A multi-line command may be entered, if you can guess how: see above.
+
+=item ! number
+X<debugger command, !>
+
+Redo a previous command (defaults to the previous command).
+
+=item ! -number
+X<debugger command, !>
+
+Redo number'th previous command.
+
+=item ! pattern
+X<debugger command, !>
+
+Redo last command that started with pattern.
+See C<o recallCommand>, too.
+
+=item !! cmd
+X<debugger command, !!>
+
+Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT) See
+C<o shellBang>, also. Note that the user's current shell (well,
+their C<$ENV{SHELL}> variable) will be used, which can interfere
+with proper interpretation of exit status or signal and coredump
+information.
+
+=item source file
+X<debugger command, source>
+
+Read and execute debugger commands from I<file>.
+I<file> may itself contain C<source> commands.
+
+=item H -number
+X<debugger command, H>
+
+Display last n commands. Only commands longer than one character are
+listed. If I<number> is omitted, list them all.
+
+=item q or ^D
+X<debugger command, q>
+X<debugger command, ^D>
+
+Quit. ("quit" doesn't work for this, unless you've made an alias)
+This is the only supported way to exit the debugger, though typing
+C<exit> twice might work.
+
+Set the C<inhibit_exit> option to 0 if you want to be able to step
+off the end the script. You may also need to set $finished to 0
+if you want to step through global destruction.
+
+=item R
+X<debugger command, R>
+
+Restart the debugger by C<exec()>ing a new session. We try to maintain
+your history across this, but internal settings and command-line options
+may be lost.
+
+The following setting are currently preserved: history, breakpoints,
+actions, debugger options, and the Perl command-line
+options B<-w>, B<-I>, and B<-e>.
+
+=item |dbcmd
+X<debugger command, |>
+
+Run the debugger command, piping DB::OUT into your current pager.
+
+=item ||dbcmd
+X<debugger command, ||>
+
+Same as C<|dbcmd> but DB::OUT is temporarily C<select>ed as well.
+
+=item = [alias value]
+X<debugger command, =>
+
+Define a command alias, like
+
+ = quit q
+
+or list current aliases.
+
+=item command
+
+Execute command as a Perl statement. A trailing semicolon will be
+supplied. If the Perl statement would otherwise be confused for a
+Perl debugger, use a leading semicolon, too.
+
+=item m expr
+X<debugger command, m>
+
+List which methods may be called on the result of the evaluated
+expression. The expression may evaluated to a reference to a
+blessed object, or to a package name.
+
+=item M
+X<debugger command, M>
+
+Displays all loaded modules and their versions
+
+
+=item man [manpage]
+X<debugger command, man>
+
+Despite its name, this calls your system's default documentation
+viewer on the given page, or on the viewer itself if I<manpage> is
+omitted. If that viewer is B<man>, the current C<Config> information
+is used to invoke B<man> using the proper MANPATH or S<B<-M>
+I<manpath>> option. Failed lookups of the form C<XXX> that match
+known manpages of the form I<perlXXX> will be retried. This lets
+you type C<man debug> or C<man op> from the debugger.
+
+On systems traditionally bereft of a usable B<man> command, the
+debugger invokes B<perldoc>. Occasionally this determination is
+incorrect due to recalcitrant vendors or rather more felicitously,
+to enterprising users. If you fall into either category, just
+manually set the $DB::doccmd variable to whatever viewer to view
+the Perl documentation on your system. This may be set in an rc
+file, or through direct assignment. We're still waiting for a
+working example of something along the lines of:
+
+ $DB::doccmd = 'netscape -remote http://something.here/';
+
+=back
+
+=head2 Configurable Options
+
+The debugger has numerous options settable using the C<o> command,
+either interactively or from the environment or an rc file.
+(./.perldb or ~/.perldb under Unix.)
+
+
+=over 12
+
+=item C<recallCommand>, C<ShellBang>
+X<debugger option, recallCommand>
+X<debugger option, ShellBang>
+
+The characters used to recall command or spawn shell. By
+default, both are set to C<!>, which is unfortunate.
+
+=item C<pager>
+X<debugger option, pager>
+
+Program to use for output of pager-piped commands (those beginning
+with a C<|> character.) By default, C<$ENV{PAGER}> will be used.
+Because the debugger uses your current terminal characteristics
+for bold and underlining, if the chosen pager does not pass escape
+sequences through unchanged, the output of some debugger commands
+will not be readable when sent through the pager.
+
+=item C<tkRunning>
+X<debugger option, tkRunning>
+
+Run Tk while prompting (with ReadLine).
+
+=item C<signalLevel>, C<warnLevel>, C<dieLevel>
+X<debugger option, signalLevel> X<debugger option, warnLevel>
+X<debugger option, dieLevel>
+
+Level of verbosity. By default, the debugger leaves your exceptions
+and warnings alone, because altering them can break correctly running
+programs. It will attempt to print a message when uncaught INT, BUS, or
+SEGV signals arrive. (But see the mention of signals in L<BUGS> below.)
+
+To disable this default safe mode, set these values to something higher
+than 0. At a level of 1, you get backtraces upon receiving any kind
+of warning (this is often annoying) or exception (this is
+often valuable). Unfortunately, the debugger cannot discern fatal
+exceptions from non-fatal ones. If C<dieLevel> is even 1, then your
+non-fatal exceptions are also traced and unceremoniously altered if they
+came from C<eval'ed> strings or from any kind of C<eval> within modules
+you're attempting to load. If C<dieLevel> is 2, the debugger doesn't
+care where they came from: It usurps your exception handler and prints
+out a trace, then modifies all exceptions with its own embellishments.
+This may perhaps be useful for some tracing purposes, but tends to hopelessly
+destroy any program that takes its exception handling seriously.
+
+=item C<AutoTrace>
+X<debugger option, AutoTrace>
+
+Trace mode (similar to C<t> command, but can be put into
+C<PERLDB_OPTS>).
+
+=item C<LineInfo>
+X<debugger option, LineInfo>
+
+File or pipe to print line number info to. If it is a pipe (say,
+C<|visual_perl_db>), then a short message is used. This is the
+mechanism used to interact with a slave editor or visual debugger,
+such as the special C<vi> or C<emacs> hooks, or the C<ddd> graphical
+debugger.
+
+=item C<inhibit_exit>
+X<debugger option, inhibit_exit>
+
+If 0, allows I<stepping off> the end of the script.
+
+=item C<PrintRet>
+X<debugger option, PrintRet>
+
+Print return value after C<r> command if set (default).
+
+=item C<ornaments>
+X<debugger option, ornaments>
+
+Affects screen appearance of the command line (see L<Term::ReadLine>).
+There is currently no way to disable these, which can render
+some output illegible on some displays, or with some pagers.
+This is considered a bug.
+
+=item C<frame>
+X<debugger option, frame>
+
+Affects the printing of messages upon entry and exit from subroutines. If
+C<frame & 2> is false, messages are printed on entry only. (Printing
+on exit might be useful if interspersed with other messages.)
+
+If C<frame & 4>, arguments to functions are printed, plus context
+and caller info. If C<frame & 8>, overloaded C<stringify> and
+C<tie>d C<FETCH> is enabled on the printed arguments. If C<frame
+& 16>, the return value from the subroutine is printed.
+
+The length at which the argument list is truncated is governed by the
+next option:
+
+=item C<maxTraceLen>
+X<debugger option, maxTraceLen>
+
+Length to truncate the argument list when the C<frame> option's
+bit 4 is set.
+
+=item C<windowSize>
+X<debugger option, windowSize>
+
+Change the size of code list window (default is 10 lines).
+
+=back
+
+The following options affect what happens with C<V>, C<X>, and C<x>
+commands:
+
+=over 12
+
+=item C<arrayDepth>, C<hashDepth>
+X<debugger option, arrayDepth> X<debugger option, hashDepth>
+
+Print only first N elements ('' for all).
+
+=item C<dumpDepth>
+X<debugger option, dumpDepth>
+
+Limit recursion depth to N levels when dumping structures.
+Negative values are interpreted as infinity. Default: infinity.
+
+=item C<compactDump>, C<veryCompact>
+X<debugger option, compactDump> X<debugger option, veryCompact>
+
+Change the style of array and hash output. If C<compactDump>, short array
+may be printed on one line.
+
+=item C<globPrint>
+X<debugger option, globPrint>
+
+Whether to print contents of globs.
+
+=item C<DumpDBFiles>
+X<debugger option, DumpDBFiles>
+
+Dump arrays holding debugged files.
+
+=item C<DumpPackages>
+X<debugger option, DumpPackages>
+
+Dump symbol tables of packages.
+
+=item C<DumpReused>
+X<debugger option, DumpReused>
+
+Dump contents of "reused" addresses.
+
+=item C<quote>, C<HighBit>, C<undefPrint>
+X<debugger option, quote> X<debugger option, HighBit>
+X<debugger option, undefPrint>
+
+Change the style of string dump. The default value for C<quote>
+is C<auto>; one can enable double-quotish or single-quotish format
+by setting it to C<"> or C<'>, respectively. By default, characters
+with their high bit set are printed verbatim.
+
+=item C<UsageOnly>
+X<debugger option, UsageOnly>
+
+Rudimentary per-package memory usage dump. Calculates total
+size of strings found in variables in the package. This does not
+include lexicals in a module's file scope, or lost in closures.
+
+=back
+
+After the rc file is read, the debugger reads the C<$ENV{PERLDB_OPTS}>
+environment variable and parses this as the remainder of a "O ..."
+line as one might enter at the debugger prompt. You may place the
+initialization options C<TTY>, C<noTTY>, C<ReadLine>, and C<NonStop>
+there.
+
+If your rc file contains:
+
+ parse_options("NonStop=1 LineInfo=db.out AutoTrace");
+
+then your script will run without human intervention, putting trace
+information into the file I<db.out>. (If you interrupt it, you'd
+better reset C<LineInfo> to F</dev/tty> if you expect to see anything.)
+
+=over 12
+
+=item C<TTY>
+X<debugger option, TTY>
+
+The TTY to use for debugging I/O.
+
+=item C<noTTY>
+X<debugger option, noTTY>
+
+If set, the debugger goes into C<NonStop> mode and will not connect to a TTY. If
+interrupted (or if control goes to the debugger via explicit setting of
+$DB::signal or $DB::single from the Perl script), it connects to a TTY
+specified in the C<TTY> option at startup, or to a tty found at
+runtime using the C<Term::Rendezvous> module of your choice.
+
+This module should implement a method named C<new> that returns an object
+with two methods: C<IN> and C<OUT>. These should return filehandles to use
+for debugging input and output correspondingly. The C<new> method should
+inspect an argument containing the value of C<$ENV{PERLDB_NOTTY}> at
+startup, or C<"$ENV{HOME}/.perldbtty$$"> otherwise. This file is not
+inspected for proper ownership, so security hazards are theoretically
+possible.
+
+=item C<ReadLine>
+X<debugger option, ReadLine>
+
+If false, readline support in the debugger is disabled in order
+to debug applications that themselves use ReadLine.
+
+=item C<NonStop>
+X<debugger option, NonStop>
+
+If set, the debugger goes into non-interactive mode until interrupted, or
+programmatically by setting $DB::signal or $DB::single.
+
+=back
+
+Here's an example of using the C<$ENV{PERLDB_OPTS}> variable:
+
+ $ PERLDB_OPTS="NonStop frame=2" perl -d myprogram
+
+That will run the script B<myprogram> without human intervention,
+printing out the call tree with entry and exit points. Note that
+C<NonStop=1 frame=2> is equivalent to C<N f=2>, and that originally,
+options could be uniquely abbreviated by the first letter (modulo
+the C<Dump*> options). It is nevertheless recommended that you
+always spell them out in full for legibility and future compatibility.
+
+Other examples include
+
+ $ PERLDB_OPTS="NonStop LineInfo=listing frame=2" perl -d myprogram
+
+which runs script non-interactively, printing info on each entry
+into a subroutine and each executed line into the file named F<listing>.
+(If you interrupt it, you would better reset C<LineInfo> to something
+"interactive"!)
+
+Other examples include (using standard shell syntax to show environment
+variable settings):
+
+ $ ( PERLDB_OPTS="NonStop frame=1 AutoTrace LineInfo=tperl.out"
+ perl -d myprogram )
+
+which may be useful for debugging a program that uses C<Term::ReadLine>
+itself. Do not forget to detach your shell from the TTY in the window that
+corresponds to F</dev/ttyXX>, say, by issuing a command like
+
+ $ sleep 1000000
+
+See L<perldebguts/"Debugger Internals"> for details.
+
+=head2 Debugger input/output
+
+=over 8
+
+=item Prompt
+
+The debugger prompt is something like
+
+ DB<8>
+
+or even
+
+ DB<<17>>
+
+where that number is the command number, and which you'd use to
+access with the built-in B<csh>-like history mechanism. For example,
+C<!17> would repeat command number 17. The depth of the angle
+brackets indicates the nesting depth of the debugger. You could
+get more than one set of brackets, for example, if you'd already
+at a breakpoint and then printed the result of a function call that
+itself has a breakpoint, or you step into an expression via C<s/n/t
+expression> command.
+
+=item Multiline commands
+
+If you want to enter a multi-line command, such as a subroutine
+definition with several statements or a format, escape the newline
+that would normally end the debugger command with a backslash.
+Here's an example:
+
+ DB<1> for (1..4) { \
+ cont: print "ok\n"; \
+ cont: }
+ ok
+ ok
+ ok
+ ok
+
+Note that this business of escaping a newline is specific to interactive
+commands typed into the debugger.
+
+=item Stack backtrace
+X<backtrace> X<stack, backtrace>
+
+Here's an example of what a stack backtrace via C<T> command might
+look like:
+
+ $ = main::infested called from file `Ambulation.pm' line 10
+ @ = Ambulation::legs(1, 2, 3, 4) called from file `camel_flea' line 7
+ $ = main::pests('bactrian', 4) called from file `camel_flea' line 4
+
+The left-hand character up there indicates the context in which the
+function was called, with C<$> and C<@> meaning scalar or list
+contexts respectively, and C<.> meaning void context (which is
+actually a sort of scalar context). The display above says
+that you were in the function C<main::infested> when you ran the
+stack dump, and that it was called in scalar context from line
+10 of the file I<Ambulation.pm>, but without any arguments at all,
+meaning it was called as C<&infested>. The next stack frame shows
+that the function C<Ambulation::legs> was called in list context
+from the I<camel_flea> file with four arguments. The last stack
+frame shows that C<main::pests> was called in scalar context,
+also from I<camel_flea>, but from line 4.
+
+If you execute the C<T> command from inside an active C<use>
+statement, the backtrace will contain both a C<require> frame and
+an C<eval>) frame.
+
+=item Line Listing Format
+
+This shows the sorts of output the C<l> command can produce:
+
+ DB<<13>> l
+ 101: @i{@i} = ();
+ 102:b @isa{@i,$pack} = ()
+ 103 if(exists $i{$prevpack} || exists $isa{$pack});
+ 104 }
+ 105
+ 106 next
+ 107==> if(exists $isa{$pack});
+ 108
+ 109:a if ($extra-- > 0) {
+ 110: %isa = ($pack,1);
+
+Breakable lines are marked with C<:>. Lines with breakpoints are
+marked by C<b> and those with actions by C<a>. The line that's
+about to be executed is marked by C<< ==> >>.
+
+Please be aware that code in debugger listings may not look the same
+as your original source code. Line directives and external source
+filters can alter the code before Perl sees it, causing code to move
+from its original positions or take on entirely different forms.
+
+=item Frame listing
+
+When the C<frame> option is set, the debugger would print entered (and
+optionally exited) subroutines in different styles. See L<perldebguts>
+for incredibly long examples of these.
+
+=back
+
+=head2 Debugging compile-time statements
+
+If you have compile-time executable statements (such as code within
+BEGIN, UNITCHECK and CHECK blocks or C<use> statements), these will
+I<not> be stopped by debugger, although C<require>s and INIT blocks
+will, and compile-time statements can be traced with C<AutoTrace>
+option set in C<PERLDB_OPTS>). From your own Perl code, however, you
+can transfer control back to the debugger using the following
+statement, which is harmless if the debugger is not running:
+
+ $DB::single = 1;
+
+If you set C<$DB::single> to 2, it's equivalent to having
+just typed the C<n> command, whereas a value of 1 means the C<s>
+command. The C<$DB::trace> variable should be set to 1 to simulate
+having typed the C<t> command.
+
+Another way to debug compile-time code is to start the debugger, set a
+breakpoint on the I<load> of some module:
+
+ DB<7> b load f:/perllib/lib/Carp.pm
+ Will stop on load of `f:/perllib/lib/Carp.pm'.
+
+and then restart the debugger using the C<R> command (if possible). One can use C<b
+compile subname> for the same purpose.
+
+=head2 Debugger Customization
+
+The debugger probably contains enough configuration hooks that you
+won't ever have to modify it yourself. You may change the behaviour
+of debugger from within the debugger using its C<o> command, from
+the command line via the C<PERLDB_OPTS> environment variable, and
+from customization files.
+
+You can do some customization by setting up a F<.perldb> file, which
+contains initialization code. For instance, you could make aliases
+like these (the last one is one people expect to be there):
+
+ $DB::alias{'len'} = 's/^len(.*)/p length($1)/';
+ $DB::alias{'stop'} = 's/^stop (at|in)/b/';
+ $DB::alias{'ps'} = 's/^ps\b/p scalar /';
+ $DB::alias{'quit'} = 's/^quit(\s*)/exit/';
+
+You can change options from F<.perldb> by using calls like this one;
+
+ parse_options("NonStop=1 LineInfo=db.out AutoTrace=1 frame=2");
+
+The code is executed in the package C<DB>. Note that F<.perldb> is
+processed before processing C<PERLDB_OPTS>. If F<.perldb> defines the
+subroutine C<afterinit>, that function is called after debugger
+initialization ends. F<.perldb> may be contained in the current
+directory, or in the home directory. Because this file is sourced
+in by Perl and may contain arbitrary commands, for security reasons,
+it must be owned by the superuser or the current user, and writable
+by no one but its owner.
+
+You can mock TTY input to debugger by adding arbitrary commands to
+@DB::typeahead. For example, your F<.perldb> file might contain:
+
+ sub afterinit { push @DB::typeahead, "b 4", "b 6"; }
+
+Which would attempt to set breakpoints on lines 4 and 6 immediately
+after debugger initialization. Note that @DB::typeahead is not a supported
+interface and is subject to change in future releases.
+
+If you want to modify the debugger, copy F<perl5db.pl> from the
+Perl library to another name and hack it to your heart's content.
+You'll then want to set your C<PERL5DB> environment variable to say
+something like this:
+
+ BEGIN { require "myperl5db.pl" }
+
+As a last resort, you could also use C<PERL5DB> to customize the debugger
+by directly setting internal variables or calling debugger functions.
+
+Note that any variables and functions that are not documented in
+this document (or in L<perldebguts>) are considered for internal
+use only, and as such are subject to change without notice.
+
+=head2 Readline Support / History in the debugger
+
+As shipped, the only command-line history supplied is a simplistic one
+that checks for leading exclamation points. However, if you install
+the Term::ReadKey and Term::ReadLine modules from CPAN (such as
+Term::ReadLine::Gnu, Term::ReadLine::Perl, ...) you will
+have full editing capabilities much like GNU I<readline>(3) provides.
+Look for these in the F<modules/by-module/Term> directory on CPAN.
+These do not support normal B<vi> command-line editing, however.
+
+A rudimentary command-line completion is also available.
+Unfortunately, the names of lexical variables are not available for
+completion.
+
+Without Readline support you may see the symbols "^[[A", "^[[C", "^[[B",
+"^[[D"", "^H", ... when using the arrow keys and/or the backspace key.
+
+=head2 Editor Support for Debugging
+
+If you have the FSF's version of B<emacs> installed on your system,
+it can interact with the Perl debugger to provide an integrated
+software development environment reminiscent of its interactions
+with C debuggers.
+
+Perl comes with a start file for making B<emacs> act like a
+syntax-directed editor that understands (some of) Perl's syntax.
+Look in the I<emacs> directory of the Perl source distribution.
+
+A similar setup by Tom Christiansen for interacting with any
+vendor-shipped B<vi> and the X11 window system is also available.
+This works similarly to the integrated multiwindow support that
+B<emacs> provides, where the debugger drives the editor. At the
+time of this writing, however, that tool's eventual location in the
+Perl distribution was uncertain.
+
+Users of B<vi> should also look into B<vim> and B<gvim>, the mousey
+and windy version, for coloring of Perl keywords.
+
+Note that only perl can truly parse Perl, so all such CASE tools
+fall somewhat short of the mark, especially if you don't program
+your Perl as a C programmer might.
+
+=head2 The Perl Profiler
+X<profile> X<profiling> X<profiler>
+
+If you wish to supply an alternative debugger for Perl to run, just
+invoke your script with a colon and a package argument given to the
+B<-d> flag. The most popular alternative debuggers for Perl is the
+Perl profiler. Devel::DProf is included with the standard Perl
+distribution. To profile your Perl program in the file F<mycode.pl>,
+just type:
+
+ $ perl -d:DProf mycode.pl
+
+When the script terminates the profiler will dump the profile
+information to a file called F<tmon.out>. A tool like B<dprofpp>,
+also supplied with the standard Perl distribution, can be used to
+interpret the information in that profile. More powerful profilers,
+such as C<Devel::NYTProf> are available from the CPAN.
+
+=head1 Debugging regular expressions
+X<regular expression, debugging>
+X<regex, debugging> X<regexp, debugging>
+
+C<use re 'debug'> enables you to see the gory details of how the Perl
+regular expression engine works. In order to understand this typically
+voluminous output, one must not only have some idea about how regular
+expression matching works in general, but also know how Perl's regular
+expressions are internally compiled into an automaton. These matters
+are explored in some detail in
+L<perldebguts/"Debugging regular expressions">.
+
+=head1 Debugging memory usage
+X<memory usage>
+
+Perl contains internal support for reporting its own memory usage,
+but this is a fairly advanced concept that requires some understanding
+of how memory allocation works.
+See L<perldebguts/"Debugging Perl memory usage"> for the details.
+
+=head1 SEE ALSO
+
+You did try the B<-w> switch, didn't you?
+
+L<perldebtut>,
+L<perldebguts>,
+L<re>,
+L<DB>,
+L<Devel::DProf>,
+L<dprofpp>,
+L<Dumpvalue>,
+and
+L<perlrun>.
+
+When debugging a script that uses #! and is thus normally found in
+$PATH, the -S option causes perl to search $PATH for it, so you don't
+have to type the path or C<which $scriptname>.
+
+ $ perl -Sd foo.pl
+
+=head1 BUGS
+
+You cannot get stack frame information or in any fashion debug functions
+that were not compiled by Perl, such as those from C or C++ extensions.
+
+If you alter your @_ arguments in a subroutine (such as with C<shift>
+or C<pop>), the stack backtrace will not show the original values.
+
+The debugger does not currently work in conjunction with the B<-W>
+command-line switch, because it itself is not free of warnings.
+
+If you're in a slow syscall (like C<wait>ing, C<accept>ing, or C<read>ing
+from your keyboard or a socket) and haven't set up your own C<$SIG{INT}>
+handler, then you won't be able to CTRL-C your way back to the debugger,
+because the debugger's own C<$SIG{INT}> handler doesn't understand that
+it needs to raise an exception to longjmp(3) out of slow syscalls.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perldelta.pod b/Master/tlpkg/tlperl.straw/lib/pods/perldelta.pod
new file mode 100755
index 00000000000..508990c7aac
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perldelta.pod
@@ -0,0 +1,1772 @@
+=head1 NAME
+
+perldelta - what is new for perl v5.10.1
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.10.0 release and
+the 5.10.1 release.
+
+If you are upgrading from an earlier release such as 5.8.8, first read
+the L<perl5100delta>, which describes differences between 5.8.8 and
+5.10.0
+
+=head1 Incompatible Changes
+
+=head2 Switch statement changes
+
+The handling of complex expressions by the C<given>/C<when> switch
+statement has been enhanced. There are two new cases where C<when> now
+interprets its argument as a boolean, instead of an expression to be used
+in a smart match:
+
+=over 4
+
+=item flip-flop operators
+
+The C<..> and C<...> flip-flop operators are now evaluated in boolean
+context, following their usual semantics; see L<perlop/"Range Operators">.
+
+Note that, as in perl 5.10.0, C<when (1..10)> will not work to test
+whether a given value is an integer between 1 and 10; you should use
+C<when ([1..10])> instead (note the array reference).
+
+However, contrary to 5.10.0, evaluating the flip-flop operators in boolean
+context ensures it can now be useful in a C<when()>, notably for
+implementing bistable conditions, like in:
+
+ when (/^=begin/ .. /^=end/) {
+ # do something
+ }
+
+=item defined-or operator
+
+A compound expression involving the defined-or operator, as in
+C<when (expr1 // expr2)>, will be treated as boolean if the first
+expression is boolean. (This just extends the existing rule that applies
+to the regular or operator, as in C<when (expr1 || expr2)>.)
+
+=back
+
+The next section details more changes brought to the semantics to
+the smart match operator, that naturally also modify the behaviour
+of the switch statements where smart matching is implicitly used.
+
+=head2 Smart match changes
+
+=head3 Changes to type-based dispatch
+
+The smart match operator C<~~> is no longer commutative. The behaviour of
+a smart match now depends primarily on the type of its right hand
+argument. Moreover, its semantics have been adjusted for greater
+consistency or usefulness in several cases. While the general backwards
+compatibility is maintained, several changes must be noted:
+
+=over 4
+
+=item *
+
+Code references with an empty prototype are no longer treated specially.
+They are passed an argument like the other code references (even if they
+choose to ignore it).
+
+=item *
+
+C<%hash ~~ sub {}> and C<@array ~~ sub {}> now test that the subroutine
+returns a true value for each key of the hash (or element of the
+array), instead of passing the whole hash or array as a reference to
+the subroutine.
+
+=item *
+
+Due to the commutativity breakage, code references are no longer
+treated specially when appearing on the left of the C<~~> operator,
+but like any vulgar scalar.
+
+=item *
+
+C<undef ~~ %hash> is always false (since C<undef> can't be a key in a
+hash). No implicit conversion to C<""> is done (as was the case in perl
+5.10.0).
+
+=item *
+
+C<$scalar ~~ @array> now always distributes the smart match across the
+elements of the array. It's true if one element in @array verifies
+C<$scalar ~~ $element>. This is a generalization of the old behaviour
+that tested whether the array contained the scalar.
+
+=back
+
+The full dispatch table for the smart match operator is given in
+L<perlsyn/"Smart matching in detail">.
+
+=head3 Smart match and overloading
+
+According to the rule of dispatch based on the rightmost argument type,
+when an object overloading C<~~> appears on the right side of the
+operator, the overload routine will always be called (with a 3rd argument
+set to a true value, see L<overload>.) However, when the object will
+appear on the left, the overload routine will be called only when the
+rightmost argument is a simple scalar. This way distributivity of smart match
+across arrays is not broken, as well as the other behaviours with complex
+types (coderefs, hashes, regexes). Thus, writers of overloading routines
+for smart match mostly need to worry only with comparing against a scalar,
+and possibly with stringification overloading; the other common cases
+will be automatically handled consistently.
+
+C<~~> will now refuse to work on objects that do not overload it (in order
+to avoid relying on the object's underlying structure). (However, if the
+object overloads the stringification or the numification operators, and
+if overload fallback is active, it will be used instead, as usual.)
+
+=head2 Other incompatible changes
+
+=over 4
+
+=item *
+
+The semantics of C<use feature :5.10*> have changed slightly.
+See L<"Modules and Pragmata"> for more information.
+
+=item *
+
+It is now a run-time error to use the smart match operator C<~~>
+with an object that has no overload defined for it. (This way
+C<~~> will not break encapsulation by matching against the
+object's internal representation as a reference.)
+
+=item *
+
+The version control system used for the development of the perl
+interpreter has been switched from Perforce to git. This is mainly an
+internal issue that only affects people actively working on the perl core;
+but it may have minor external visibility, for example in some of details
+of the output of C<perl -V>. See L<perlrepository> for more information.
+
+=item *
+
+The internal structure of the C<ext/> directory in the perl source has
+been reorganised. In general, a module C<Foo::Bar> whose source was
+stored under F<ext/Foo/Bar/> is now located under F<ext/Foo-Bar/>. Also,
+some modules have been moved from F<lib/> to F<ext/>. This is purely a
+source tarball change, and should make no difference to the compilation or
+installation of perl, unless you have a very customised build process that
+explicitly relies on this structure, or which hard-codes the C<nonxs_ext>
+F<Configure> parameter. Specifically, this change does not by default
+alter the location of any files in the final installation.
+
+=item *
+
+As part of the C<Test::Harness> 2.x to 3.x upgrade, the experimental
+C<Test::Harness::Straps> module has been removed.
+See L</"Updated Modules"> for more details.
+
+=item *
+
+As part of the C<ExtUtils::MakeMaker> upgrade, the
+C<ExtUtils::MakeMaker::bytes> and C<ExtUtils::MakeMaker::vmsish> modules
+have been removed from this distribution.
+
+=item *
+
+C<Module::CoreList> no longer contains the C<%:patchlevel> hash.
+
+=item *
+
+This one is actually a change introduced in 5.10.0, but it was missed
+from that release's perldelta, so it is mentioned here instead.
+
+A bugfix related to the handling of the C</m> modifier and C<qr> resulted
+in a change of behaviour between 5.8.x and 5.10.0:
+
+ # matches in 5.8.x, doesn't match in 5.10.0
+ $re = qr/^bar/; "foo\nbar" =~ /$re/m;
+
+=back
+
+=head1 Core Enhancements
+
+=head2 Unicode Character Database 5.1.0
+
+The copy of the Unicode Character Database included in Perl 5.10.1 has
+been updated to 5.1.0 from 5.0.0. See
+L<http://www.unicode.org/versions/Unicode5.1.0/#NotableChanges> for the
+notable changes.
+
+=head2 A proper interface for pluggable Method Resolution Orders
+
+As of Perl 5.10.1 there is a new interface for plugging and using method
+resolution orders other than the default (linear depth first search).
+The C3 method resolution order added in 5.10.0 has been re-implemented as
+a plugin, without changing its Perl-space interface. See L<perlmroapi> for
+more information.
+
+=head2 The C<overloading> pragma
+
+This pragma allows you to lexically disable or enable overloading
+for some or all operations. (Yuval Kogman)
+
+=head2 Parallel tests
+
+The core distribution can now run its regression tests in parallel on
+Unix-like platforms. Instead of running C<make test>, set C<TEST_JOBS> in
+your environment to the number of tests to run in parallel, and run
+C<make test_harness>. On a Bourne-like shell, this can be done as
+
+ TEST_JOBS=3 make test_harness # Run 3 tests in parallel
+
+An environment variable is used, rather than parallel make itself, because
+L<TAP::Harness> needs to be able to schedule individual non-conflicting test
+scripts itself, and there is no standard interface to C<make> utilities to
+interact with their job schedulers.
+
+Note that currently some test scripts may fail when run in parallel (most
+notably C<ext/IO/t/io_dir.t>). If necessary run just the failing scripts
+again sequentially and see if the failures go away.
+
+=head2 DTrace support
+
+Some support for DTrace has been added. See "DTrace support" in F<INSTALL>.
+
+=head2 Support for C<configure_requires> in CPAN module metadata
+
+Both C<CPAN> and C<CPANPLUS> now support the C<configure_requires> keyword
+in the C<META.yml> metadata file included in most recent CPAN distributions.
+This allows distribution authors to specify configuration prerequisites that
+must be installed before running F<Makefile.PL> or F<Build.PL>.
+
+See the documentation for C<ExtUtils::MakeMaker> or C<Module::Build> for more
+on how to specify C<configure_requires> when creating a distribution for CPAN.
+
+=head1 Modules and Pragmata
+
+=head2 New Modules and Pragmata
+
+=over 4
+
+=item C<autodie>
+
+This is a new lexically-scoped alternative for the C<Fatal> module.
+The bundled version is 2.06_01. Note that in this release, using a string
+eval when C<autodie> is in effect can cause the autodie behaviour to leak
+into the surrounding scope. See L<autodie/"BUGS"> for more details.
+
+=item C<Compress::Raw::Bzip2>
+
+This has been added to the core (version 2.020).
+
+=item C<parent>
+
+This pragma establishes an ISA relationship with base classes at compile
+time. It provides the key feature of C<base> without the feature creep.
+
+=item C<Parse::CPAN::Meta>
+
+This has been added to the core (version 1.39).
+
+=back
+
+=head2 Pragmata Changes
+
+=over 4
+
+=item C<attributes>
+
+Upgraded from version 0.08 to 0.09.
+
+=item C<attrs>
+
+Upgraded from version 1.02 to 1.03.
+
+=item C<base>
+
+Upgraded from version 2.13 to 2.14. See L<parent> for a replacement.
+
+=item C<bigint>
+
+Upgraded from version 0.22 to 0.23.
+
+=item C<bignum>
+
+Upgraded from version 0.22 to 0.23.
+
+=item C<bigrat>
+
+Upgraded from version 0.22 to 0.23.
+
+=item C<charnames>
+
+Upgraded from version 1.06 to 1.07.
+
+The Unicode F<NameAliases.txt> database file has been added. This has the
+effect of adding some extra C<\N> character names that formerly wouldn't
+have been recognised; for example, C<"\N{LATIN CAPITAL LETTER GHA}">.
+
+=item C<constant>
+
+Upgraded from version 1.13 to 1.17.
+
+=item C<feature>
+
+The meaning of the C<:5.10> and C<:5.10.X> feature bundles has
+changed slightly. The last component, if any (i.e. C<X>) is simply ignored.
+This is predicated on the assumption that new features will not, in
+general, be added to maintenance releases. So C<:5.10> and C<:5.10.X>
+have identical effect. This is a change to the behaviour documented for
+5.10.0.
+
+=item C<fields>
+
+Upgraded from version 2.13 to 2.14 (this was just a version bump; there
+were no functional changes).
+
+=item C<lib>
+
+Upgraded from version 0.5565 to 0.62.
+
+=item C<open>
+
+Upgraded from version 1.06 to 1.07.
+
+=item C<overload>
+
+Upgraded from version 1.06 to 1.07.
+
+=item C<overloading>
+
+See L</"The C<overloading> pragma"> above.
+
+=item C<version>
+
+Upgraded from version 0.74 to 0.77.
+
+=back
+
+=head2 Updated Modules
+
+=over 4
+
+=item C<Archive::Extract>
+
+Upgraded from version 0.24 to 0.34.
+
+=item C<Archive::Tar>
+
+Upgraded from version 1.38 to 1.52.
+
+=item C<Attribute::Handlers>
+
+Upgraded from version 0.79 to 0.85.
+
+=item C<AutoLoader>
+
+Upgraded from version 5.63 to 5.68.
+
+=item C<AutoSplit>
+
+Upgraded from version 1.05 to 1.06.
+
+=item C<B>
+
+Upgraded from version 1.17 to 1.22.
+
+=item C<B::Debug>
+
+Upgraded from version 1.05 to 1.11.
+
+=item C<B::Deparse>
+
+Upgraded from version 0.83 to 0.89.
+
+=item C<B::Lint>
+
+Upgraded from version 1.09 to 1.11.
+
+=item C<B::Xref>
+
+Upgraded from version 1.01 to 1.02.
+
+=item C<Benchmark>
+
+Upgraded from version 1.10 to 1.11.
+
+=item C<Carp>
+
+Upgraded from version 1.08 to 1.11.
+
+=item C<CGI>
+
+Upgraded from version 3.29 to 3.43.
+(also includes the "default_value for popup_menu()" fix from 3.45).
+
+=item C<Compress::Zlib>
+
+Upgraded from version 2.008 to 2.020.
+
+=item C<CPAN>
+
+Upgraded from version 1.9205 to 1.9402. C<CPAN::FTP> has a local fix to
+stop it being too verbose on download failure.
+
+=item C<CPANPLUS>
+
+Upgraded from version 0.84 to 0.88.
+
+=item C<CPANPLUS::Dist::Build>
+
+Upgraded from version 0.06_02 to 0.36.
+
+=item C<Cwd>
+
+Upgraded from version 3.25_01 to 3.30.
+
+=item C<Data::Dumper>
+
+Upgraded from version 2.121_14 to 2.124.
+
+=item C<DB>
+
+Upgraded from version 1.01 to 1.02.
+
+=item C<DB_File>
+
+Upgraded from version 1.816_1 to 1.820.
+
+=item C<Devel::PPPort>
+
+Upgraded from version 3.13 to 3.19.
+
+=item C<Digest::MD5>
+
+Upgraded from version 2.36_01 to 2.39.
+
+=item C<Digest::SHA>
+
+Upgraded from version 5.45 to 5.47.
+
+=item C<DirHandle>
+
+Upgraded from version 1.01 to 1.03.
+
+=item C<Dumpvalue>
+
+Upgraded from version 1.12 to 1.13.
+
+=item C<DynaLoader>
+
+Upgraded from version 1.08 to 1.10.
+
+=item C<Encode>
+
+Upgraded from version 2.23 to 2.35.
+
+=item C<Errno>
+
+Upgraded from version 1.10 to 1.11.
+
+=item C<Exporter>
+
+Upgraded from version 5.62 to 5.63.
+
+=item C<ExtUtils::CBuilder>
+
+Upgraded from version 0.21 to 0.2602.
+
+=item C<ExtUtils::Command>
+
+Upgraded from version 1.13 to 1.16.
+
+=item C<ExtUtils::Constant>
+
+Upgraded from 0.20 to 0.22. (Note that neither of these versions are
+available on CPAN.)
+
+=item C<ExtUtils::Embed>
+
+Upgraded from version 1.27 to 1.28.
+
+=item C<ExtUtils::Install>
+
+Upgraded from version 1.44 to 1.54.
+
+=item C<ExtUtils::MakeMaker>
+
+Upgraded from version 6.42 to 6.55_02.
+
+Note that C<ExtUtils::MakeMaker::bytes> and C<ExtUtils::MakeMaker::vmsish>
+have been removed from this distribution.
+
+=item C<ExtUtils::Manifest>
+
+Upgraded from version 1.51_01 to 1.56.
+
+=item C<ExtUtils::ParseXS>
+
+Upgraded from version 2.18_02 to 2.2002.
+
+=item C<Fatal>
+
+Upgraded from version 1.05 to 2.06_01. See also the new pragma C<autodie>.
+
+=item C<File::Basename>
+
+Upgraded from version 2.76 to 2.77.
+
+=item C<File::Compare>
+
+Upgraded from version 1.1005 to 1.1006.
+
+=item C<File::Copy>
+
+Upgraded from version 2.11 to 2.14.
+
+=item C<File::Fetch>
+
+Upgraded from version 0.14 to 0.20.
+
+=item C<File::Find>
+
+Upgraded from version 1.12 to 1.14.
+
+=item C<File::Path>
+
+Upgraded from version 2.04 to 2.07_03.
+
+=item C<File::Spec>
+
+Upgraded from version 3.2501 to 3.30.
+
+=item C<File::stat>
+
+Upgraded from version 1.00 to 1.01.
+
+=item C<File::Temp>
+
+Upgraded from version 0.18 to 0.22.
+
+=item C<FileCache>
+
+Upgraded from version 1.07 to 1.08.
+
+=item C<FileHandle>
+
+Upgraded from version 2.01 to 2.02.
+
+=item C<Filter::Simple>
+
+Upgraded from version 0.82 to 0.84.
+
+=item C<Filter::Util::Call>
+
+Upgraded from version 1.07 to 1.08.
+
+=item C<FindBin>
+
+Upgraded from version 1.49 to 1.50.
+
+=item C<GDBM_File>
+
+Upgraded from version 1.08 to 1.09.
+
+=item C<Getopt::Long>
+
+Upgraded from version 2.37 to 2.38.
+
+=item C<Hash::Util::FieldHash>
+
+Upgraded from version 1.03 to 1.04. This fixes a memory leak.
+
+=item C<I18N::Collate>
+
+Upgraded from version 1.00 to 1.01.
+
+=item C<IO>
+
+Upgraded from version 1.23_01 to 1.25.
+
+This makes non-blocking mode work on Windows in C<IO::Socket::INET>
+[CPAN #43573].
+
+=item C<IO::Compress::*>
+
+Upgraded from version 2.008 to 2.020.
+
+=item C<IO::Dir>
+
+Upgraded from version 1.06 to 1.07.
+
+=item C<IO::Handle>
+
+Upgraded from version 1.27 to 1.28.
+
+=item C<IO::Socket>
+
+Upgraded from version 1.30_01 to 1.31.
+
+=item C<IO::Zlib>
+
+Upgraded from version 1.07 to 1.09.
+
+=item C<IPC::Cmd>
+
+Upgraded from version 0.40_1 to 0.46.
+
+=item C<IPC::Open3>
+
+Upgraded from version 1.02 to 1.04.
+
+=item C<IPC::SysV>
+
+Upgraded from version 1.05 to 2.01.
+
+=item C<lib>
+
+Upgraded from version 0.5565 to 0.62.
+
+=item C<List::Util>
+
+Upgraded from version 1.19 to 1.21.
+
+=item C<Locale::MakeText>
+
+Upgraded from version 1.12 to 1.13.
+
+=item C<Log::Message>
+
+Upgraded from version 0.01 to 0.02.
+
+=item C<Math::BigFloat>
+
+Upgraded from version 1.59 to 1.60.
+
+=item C<Math::BigInt>
+
+Upgraded from version 1.88 to 1.89.
+
+=item C<Math::BigInt::FastCalc>
+
+Upgraded from version 0.16 to 0.19.
+
+=item C<Math::BigRat>
+
+Upgraded from version 0.21 to 0.22.
+
+=item C<Math::Complex>
+
+Upgraded from version 1.37 to 1.56.
+
+=item C<Math::Trig>
+
+Upgraded from version 1.04 to 1.20.
+
+=item C<Memoize>
+
+Upgraded from version 1.01_02 to 1.01_03 (just a minor documentation
+change).
+
+=item C<Module::Build>
+
+Upgraded from version 0.2808_01 to 0.34_02.
+
+=item C<Module::CoreList>
+
+Upgraded from version 2.13 to 2.18. This release no longer contains the
+C<%Module::CoreList::patchlevel> hash.
+
+=item C<Module::Load>
+
+Upgraded from version 0.12 to 0.16.
+
+=item C<Module::Load::Conditional>
+
+Upgraded from version 0.22 to 0.30.
+
+=item C<Module::Loaded>
+
+Upgraded from version 0.01 to 0.02.
+
+=item C<Module::Pluggable>
+
+Upgraded from version 3.6 to 3.9.
+
+=item C<NDBM_File>
+
+Upgraded from version 1.07 to 1.08.
+
+=item C<Net::Ping>
+
+Upgraded from version 2.33 to 2.36.
+
+=item C<NEXT>
+
+Upgraded from version 0.60_01 to 0.64.
+
+=item C<Object::Accessor>
+
+Upgraded from version 0.32 to 0.34.
+
+=item C<OS2::REXX>
+
+Upgraded from version 1.03 to 1.04.
+
+=item C<Package::Constants>
+
+Upgraded from version 0.01 to 0.02.
+
+=item C<PerlIO>
+
+Upgraded from version 1.04 to 1.06.
+
+=item C<PerlIO::via>
+
+Upgraded from version 0.04 to 0.07.
+
+=item C<Pod::Man>
+
+Upgraded from version 2.16 to 2.22.
+
+=item C<Pod::Parser>
+
+Upgraded from version 1.35 to 1.37.
+
+=item C<Pod::Simple>
+
+Upgraded from version 3.05 to 3.07.
+
+=item C<Pod::Text>
+
+Upgraded from version 3.08 to 3.13.
+
+=item C<POSIX>
+
+Upgraded from version 1.13 to 1.17.
+
+=item C<Safe>
+
+Upgraded from 2.12 to 2.18.
+
+=item C<Scalar::Util>
+
+Upgraded from version 1.19 to 1.21.
+
+=item C<SelectSaver>
+
+Upgraded from 1.01 to 1.02.
+
+=item C<SelfLoader>
+
+Upgraded from 1.11 to 1.17.
+
+=item C<Socket>
+
+Upgraded from 1.80 to 1.82.
+
+=item C<Storable>
+
+Upgraded from 2.18 to 2.20.
+
+=item C<Switch>
+
+Upgraded from version 2.13 to 2.14. Please see L</Deprecations>.
+
+=item C<Symbol>
+
+Upgraded from version 1.06 to 1.07.
+
+=item C<Sys::Syslog>
+
+Upgraded from version 0.22 to 0.27.
+
+=item C<Term::ANSIColor>
+
+Upgraded from version 1.12 to 2.00.
+
+=item C<Term::ReadLine>
+
+Upgraded from version 1.03 to 1.04.
+
+=item C<Term::UI>
+
+Upgraded from version 0.18 to 0.20.
+
+=item C<Test::Harness>
+
+Upgraded from version 2.64 to 3.17.
+
+Note that one side-effect of the 2.x to 3.x upgrade is that the
+experimental C<Test::Harness::Straps> module (and its supporting
+C<Assert>, C<Iterator>, C<Point> and C<Results> modules) have been
+removed. If you still need this, then they are available in the
+(unmaintained) C<Test-Harness-Straps> distribution on CPAN.
+
+=item C<Test::Simple>
+
+Upgraded from version 0.72 to 0.92.
+
+=item C<Text::ParseWords>
+
+Upgraded from version 3.26 to 3.27.
+
+=item C<Text::Tabs>
+
+Upgraded from version 2007.1117 to 2009.0305.
+
+=item C<Text::Wrap>
+
+Upgraded from version 2006.1117 to 2009.0305.
+
+=item C<Thread::Queue>
+
+Upgraded from version 2.00 to 2.11.
+
+=item C<Thread::Semaphore>
+
+Upgraded from version 2.01 to 2.09.
+
+=item C<threads>
+
+Upgraded from version 1.67 to 1.72.
+
+=item C<threads::shared>
+
+Upgraded from version 1.14 to 1.29.
+
+=item C<Tie::RefHash>
+
+Upgraded from version 1.37 to 1.38.
+
+=item C<Tie::StdHandle>
+
+This has documentation changes, and has been assigned a version for the
+first time: version 4.2.
+
+=item C<Time::HiRes>
+
+Upgraded from version 1.9711 to 1.9719.
+
+=item C<Time::Local>
+
+Upgraded from version 1.18 to 1.1901.
+
+=item C<Time::Piece>
+
+Upgraded from version 1.12 to 1.15.
+
+=item C<Unicode::Normalize>
+
+Upgraded from version 1.02 to 1.03.
+
+=item C<Unicode::UCD>
+
+Upgraded from version 0.25 to 0.27.
+
+C<charinfo()> now works on Unified CJK code points added to later versions
+of Unicode.
+
+C<casefold()> has new fields returned to provide both a simpler interface
+and previously missing information. The old fields are retained for
+backwards compatibility. Information about Turkic-specific code points is
+now returned.
+
+The documentation has been corrected and expanded.
+
+=item C<UNIVERSAL>
+
+Upgraded from version 1.04 to 1.05.
+
+=item C<Win32>
+
+Upgraded from version 0.34 to 0.39.
+
+=item C<Win32API::File>
+
+Upgraded from version 0.1001_01 to 0.1101.
+
+=item C<XSLoader>
+
+Upgraded from version 0.08 to 0.10.
+
+=back
+
+=head1 Utility Changes
+
+=over 4
+
+=item F<h2ph>
+
+Now looks in C<include-fixed> too, which is a recent addition to gcc's
+search path.
+
+=item F<h2xs>
+
+No longer incorrectly treats enum values like macros (Daniel Burr).
+
+Now handles C++ style constants (C<//>) properly in enums. (A patch from
+Rainer Weikusat was used; Daniel Burr also proposed a similar fix).
+
+=item F<perl5db.pl>
+
+C<LVALUE> subroutines now work under the debugger.
+
+The debugger now correctly handles proxy constant subroutines, and
+subroutine stubs.
+
+=item F<perlthanks>
+
+Perl 5.10.1 adds a new utility F<perlthanks>, which is a variant of
+F<perlbug>, but for sending non-bug-reports to the authors and maintainers
+of Perl. Getting nothing but bug reports can become a bit demoralising:
+we'll see if this changes things.
+
+=back
+
+=head1 New Documentation
+
+=over 4
+
+=item L<perlhaiku>
+
+This contains instructions on how to build perl for the Haiku platform.
+
+=item L<perlmroapi>
+
+This describes the new interface for pluggable Method Resolution Orders.
+
+=item L<perlperf>
+
+This document, by Richard Foley, provides an introduction to the use of
+performance and optimization techniques which can be used with particular
+reference to perl programs.
+
+=item L<perlrepository>
+
+This describes how to access the perl source using the I<git> version
+control system.
+
+=item L<perlthanks>
+
+This describes the new F<perlthanks> utility.
+
+=back
+
+=head1 Changes to Existing Documentation
+
+The various large C<Changes*> files (which listed every change made to perl
+over the last 18 years) have been removed, and replaced by a small file,
+also called C<Changes>, which just explains how that same information may
+be extracted from the git version control system.
+
+The file F<Porting/patching.pod> has been deleted, as it mainly described
+interacting with the old Perforce-based repository, which is now obsolete.
+Information still relevant has been moved to L<perlrepository>.
+
+L<perlapi>, L<perlintern>, L<perlmodlib> and L<perltoc> are now all
+generated at build time, rather than being shipped as part of the release.
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+A new internal cache means that C<isa()> will often be faster.
+
+=item *
+
+Under C<use locale>, the locale-relevant information is now cached on
+read-only values, such as the list returned by C<keys %hash>. This makes
+operations such as C<sort keys %hash> in the scope of C<use locale> much
+faster.
+
+=item *
+
+Empty C<DESTROY> methods are no longer called.
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+=head2 F<ext/> reorganisation
+
+The layout of directories in F<ext> has been revised. Specifically, all
+extensions are now flat, and at the top level, with C</> in pathnames
+replaced by C<->, so that F<ext/Data/Dumper/> is now F<ext/Data-Dumper/>,
+etc. The names of the extensions as specified to F<Configure>, and as
+reported by C<%Config::Config> under the keys C<dynamic_ext>,
+C<known_extensions>, C<nonxs_ext> and C<static_ext> have not changed, and
+still use C</>. Hence this change will not have any affect once perl is
+installed. However, C<Attribute::Handlers>, C<Safe> and C<mro> have now
+become extensions in their own right, so if you run F<Configure> with
+options to specify an exact list of extensions to build, you will need to
+change it to account for this.
+
+For 5.10.2, it is planned that many dual-life modules will have been moved
+from F<lib> to F<ext>; again this will have no effect on an installed
+perl, but will matter if you invoke F<Configure> with a pre-canned list of
+extensions to build.
+
+=head2 Configuration improvements
+
+If C<vendorlib> and C<vendorarch> are the same, then they are only added to
+C<@INC> once.
+
+C<$Config{usedevel}> and the C-level C<PERL_USE_DEVEL> are now defined if
+perl is built with C<-Dusedevel>.
+
+F<Configure> will enable use of C<-fstack-protector>, to provide protection
+against stack-smashing attacks, if the compiler supports it.
+
+F<Configure> will now determine the correct prototypes for re-entrant
+functions, and for C<gconvert>, if you are using a C++ compiler rather
+than a C compiler.
+
+On Unix, if you build from a tree containing a git repository, the
+configuration process will note the commit hash you have checked out, for
+display in the output of C<perl -v> and C<perl -V>. Unpushed local commits
+are automatically added to the list of local patches displayed by
+C<perl -V>.
+
+=head2 Compilation improvements
+
+As part of the flattening of F<ext>, all extensions on all platforms are
+built by F<make_ext.pl>. This replaces the Unix-specific
+F<ext/util/make_ext>, VMS-specific F<make_ext.com> and Win32-specific
+F<win32/buildext.pl>.
+
+=head2 Platform Specific Changes
+
+=over 4
+
+=item AIX
+
+Removed F<libbsd> for AIX 5L and 6.1. Only flock() was used from F<libbsd>.
+
+Removed F<libgdbm> for AIX 5L and 6.1. The F<libgdbm> is delivered as an
+optional package with the AIX Toolbox. Unfortunately the 64 bit version
+is broken.
+
+Hints changes mean that AIX 4.2 should work again.
+
+=item Cygwin
+
+On Cygwin we now strip the last number from the DLL. This has been the
+behaviour in the cygwin.com build for years. The hints files have been
+updated.
+
+=item FreeBSD
+
+The hints files now identify the correct threading libraries on FreeBSD 7
+and later.
+
+=item Irix
+
+We now work around a bizarre preprocessor bug in the Irix 6.5 compiler:
+C<cc -E -> unfortunately goes into K&R mode, but C<cc -E file.c> doesn't.
+
+=item Haiku
+
+Patches from the Haiku maintainers have been merged in. Perl should now
+build on Haiku.
+
+=item MirOS BSD
+
+Perl should now build on MirOS BSD.
+
+=item NetBSD
+
+Hints now supports versions 5.*.
+
+=item Stratus VOS
+
+Various changes from Stratus have been merged in.
+
+=item Symbian
+
+There is now support for Symbian S60 3.2 SDK and S60 5.0 SDK.
+
+=item Win32
+
+Improved message window handling means that C<alarm> and C<kill> messages
+will no longer be dropped under race conditions.
+
+=item VMS
+
+Reads from the in-memory temporary files of C<PerlIO::scalar> used to fail
+if C<$/> was set to a numeric reference (to indicate record-style reads).
+This is now fixed.
+
+VMS now supports C<getgrgid>.
+
+Many improvements and cleanups have been made to the VMS file name handling
+and conversion code.
+
+Enabling the C<PERL_VMS_POSIX_EXIT> logical name now encodes a POSIX exit
+status in a VMS condition value for better interaction with GNV's bash
+shell and other utilities that depend on POSIX exit values. See
+L<perlvms/"$?"> for details.
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+5.10.0 inadvertently disabled an optimisation, which caused a measurable
+performance drop in list assignment, such as is often used to assign
+function parameters from C<@_>. The optimisation has been re-instated, and
+the performance regression fixed.
+
+=item *
+
+Fixed memory leak on C<while (1) { map 1, 1 }> [RT #53038].
+
+=item *
+
+Some potential coredumps in PerlIO fixed [RT #57322,54828].
+
+=item *
+
+The debugger now works with lvalue subroutines.
+
+=item *
+
+The debugger's C<m> command was broken on modules that defined constants
+[RT #61222].
+
+=item *
+
+C<crypt()> and string complement could return tainted values for untainted
+arguments [RT #59998].
+
+=item *
+
+The C<-i.suffix> command-line switch now recreates the file using
+restricted permissions, before changing its mode to match the original
+file. This eliminates a potential race condition [RT #60904].
+
+=item *
+
+On some UNIX systems, the value in C<$?> would not have the top bit set
+(C<$? & 128>) even if the child core dumped.
+
+=item *
+
+Under some circumstances, $^R could incorrectly become undefined
+[RT #57042].
+
+=item *
+
+(XS) In various hash functions, passing a pre-computed hash to when the
+key is UTF-8 might result in an incorrect lookup.
+
+=item *
+
+(XS) Including F<XSUB.h> before F<perl.h> gave a compile-time error
+[RT #57176].
+
+=item *
+
+C<< $object->isa('Foo') >> would report false if the package C<Foo> didn't
+exist, even if the object's C<@ISA> contained C<Foo>.
+
+=item *
+
+Various bugs in the new-to 5.10.0 mro code, triggered by manipulating
+C<@ISA>, have been found and fixed.
+
+=item *
+
+Bitwise operations on references could crash the interpreter, e.g.
+C<$x=\$y; $x |= "foo"> [RT #54956].
+
+=item *
+
+Patterns including alternation might be sensitive to the internal UTF-8
+representation, e.g.
+
+ my $byte = chr(192);
+ my $utf8 = chr(192); utf8::upgrade($utf8);
+ $utf8 =~ /$byte|X}/i; # failed in 5.10.0
+
+=item *
+
+Within UTF8-encoded Perl source files (i.e. where C<use utf8> is in
+effect), double-quoted literal strings could be corrupted where a C<\xNN>,
+C<\0NNN> or C<\N{}> is followed by a literal character with ordinal value
+greater than 255 [RT #59908].
+
+=item *
+
+C<B::Deparse> failed to correctly deparse various constructs:
+C<readpipe STRING> [RT #62428], C<CORE::require(STRING)> [RT #62488],
+C<sub foo(_)> [RT #62484].
+
+=item *
+
+Using C<setpgrp()> with no arguments could corrupt the perl stack.
+
+=item *
+
+The block form of C<eval> is now specifically trappable by C<Safe> and
+C<ops>. Previously it was erroneously treated like string C<eval>.
+
+=item *
+
+In 5.10.0, the two characters C<[~> were sometimes parsed as the smart
+match operator (C<~~>) [RT #63854].
+
+=item *
+
+In 5.10.0, the C<*> quantifier in patterns was sometimes treated as
+C<{0,32767}> [RT #60034, #60464]. For example, this match would fail:
+
+ ("ab" x 32768) =~ /^(ab)*$/
+
+=item *
+
+C<shmget> was limited to a 32 bit segment size on a 64 bit OS [RT #63924].
+
+=item *
+
+Using C<next> or C<last> to exit a C<given> block no longer produces a
+spurious warning like the following:
+
+ Exiting given via last at foo.pl line 123
+
+=item *
+
+On Windows, C<'.\foo'> and C<'..\foo'> were treated differently than
+C<'./foo'> and C<'../foo'> by C<do> and C<require> [RT #63492].
+
+=item *
+
+Assigning a format to a glob could corrupt the format; e.g.:
+
+ *bar=*foo{FORMAT}; # foo format now bad
+
+=item *
+
+Attempting to coerce a typeglob to a string or number could cause an
+assertion failure. The correct error message is now generated,
+C<Can't coerce GLOB to I<$type>>.
+
+=item *
+
+Under C<use filetest 'access'>, C<-x> was using the wrong access mode. This
+has been fixed [RT #49003].
+
+=item *
+
+C<length> on a tied scalar that returned a Unicode value would not be
+correct the first time. This has been fixed.
+
+=item *
+
+Using an array C<tie> inside in array C<tie> could SEGV. This has been
+fixed. [RT #51636]
+
+=item *
+
+A race condition inside C<PerlIOStdio_close()> has been identified and
+fixed. This used to cause various threading issues, including SEGVs.
+
+=item *
+
+In C<unpack>, the use of C<()> groups in scalar context was internally
+placing a list on the interpreter's stack, which manifested in various
+ways, including SEGVs. This is now fixed [RT #50256].
+
+=item *
+
+Magic was called twice in C<substr>, C<\&$x>, C<tie $x, $m> and C<chop>.
+These have all been fixed.
+
+=item *
+
+A 5.10.0 optimisation to clear the temporary stack within the implicit
+loop of C<s///ge> has been reverted, as it turned out to be the cause of
+obscure bugs in seemingly unrelated parts of the interpreter [commit
+ef0d4e17921ee3de].
+
+=item *
+
+The line numbers for warnings inside C<elsif> are now correct.
+
+=item *
+
+The C<..> operator now works correctly with ranges whose ends are at or
+close to the values of the smallest and largest integers.
+
+=item *
+
+C<binmode STDIN, ':raw'> could lead to segmentation faults on some platforms.
+This has been fixed [RT #54828].
+
+=item *
+
+An off-by-one error meant that C<index $str, ...> was effectively being
+executed as C<index "$str\0", ...>. This has been fixed [RT #53746].
+
+=item *
+
+Various leaks associated with named captures in regexes have been fixed
+[RT #57024].
+
+=item *
+
+A weak reference to a hash would leak. This was affecting C<DBI>
+[RT #56908].
+
+=item *
+
+Using (?|) in a regex could cause a segfault [RT #59734].
+
+=item *
+
+Use of a UTF-8 C<tr//> within a closure could cause a segfault [RT #61520].
+
+=item *
+
+Calling C<sv_chop()> or otherwise upgrading an SV could result in an
+unaligned 64-bit access on the SPARC architecture [RT #60574].
+
+=item *
+
+In the 5.10.0 release, C<inc_version_list> would incorrectly list
+C<5.10.*> after C<5.8.*>; this affected the C<@INC> search order
+[RT #67628].
+
+=item *
+
+In 5.10.0, C<pack "a*", $tainted_value> returned a non-tainted value
+[RT #52552].
+
+=item *
+
+In 5.10.0, C<printf> and C<sprintf> could produce the fatal error
+C<panic: utf8_mg_pos_cache_update> when printing UTF-8 strings
+[RT #62666].
+
+=item *
+
+In the 5.10.0 release, a dynamically created C<AUTOLOAD> method might be
+missed (method cache issue) [RT #60220,60232].
+
+=item *
+
+In the 5.10.0 release, a combination of C<use feature> and C<//ee> could
+cause a memory leak [RT #63110].
+
+=item *
+
+C<-C> on the shebang (C<#!>) line is once more permitted if it is also
+specified on the command line. C<-C> on the shebang line used to be a
+silent no-op I<if> it was not also on the command line, so perl 5.10.0
+disallowed it, which broke some scripts. Now perl checks whether it is
+also on the command line and only dies if it is not [RT #67880].
+
+=item *
+
+In 5.10.0, certain types of re-entrant regular expression could crash,
+or cause the following assertion failure [RT #60508]:
+
+ Assertion rx->sublen >= (s - rx->subbeg) + i failed
+
+
+=back
+
+=head1 New or Changed Diagnostics
+
+=over 4
+
+=item C<panic: sv_chop %s>
+
+This new fatal error occurs when the C routine C<Perl_sv_chop()> was
+passed a position that is not within the scalar's string buffer. This
+could be caused by buggy XS code, and at this point recovery is not
+possible.
+
+=item C<Can't locate package %s for the parents of %s>
+
+This warning has been removed. In general, it only got produced in
+conjunction with other warnings, and removing it allowed an ISA lookup
+optimisation to be added.
+
+=item C<v-string in use/require is non-portable>
+
+This warning has been removed.
+
+=item C<Deep recursion on subroutine "%s">
+
+It is now possible to change the depth threshold for this warning from the
+default of 100, by recompiling the F<perl> binary, setting the C
+pre-processor macro C<PERL_SUB_DEPTH_WARN> to the desired value.
+
+=back
+
+=head1 Changed Internals
+
+=over 4
+
+=item *
+
+The J.R.R. Tolkien quotes at the head of C source file have been checked and
+proper citations added, thanks to a patch from Tom Christiansen.
+
+=item *
+
+C<vcroak()> now accepts a null first argument. In addition, a full audit
+was made of the "not NULL" compiler annotations, and those for several
+other internal functions were corrected.
+
+=item *
+
+New macros C<dSAVEDERRNO>, C<dSAVE_ERRNO>, C<SAVE_ERRNO>, C<RESTORE_ERRNO>
+have been added to formalise the temporary saving of the C<errno>
+variable.
+
+=item *
+
+The function C<Perl_sv_insert_flags> has been added to augment
+C<Perl_sv_insert>.
+
+=item *
+
+The function C<Perl_newSV_type(type)> has been added, equivalent to
+C<Perl_newSV()> followed by C<Perl_sv_upgrade(type)>.
+
+=item *
+
+The function C<Perl_newSVpvn_flags()> has been added, equivalent to
+C<Perl_newSVpvn()> and then performing the action relevant to the flag.
+
+Two flag bits are currently supported.
+
+=over 4
+
+=item C<SVf_UTF8>
+
+This will call C<SvUTF8_on()> for you. (Note that this does not convert an
+sequence of ISO 8859-1 characters to UTF-8). A wrapper, C<newSVpvn_utf8()>
+is available for this.
+
+=item C<SVs_TEMP>
+
+Call C<sv_2mortal()> on the new SV.
+
+=back
+
+There is also a wrapper that takes constant strings, C<newSVpvs_flags()>.
+
+=item *
+
+The function C<Perl_croak_xs_usage> has been added as a wrapper to
+C<Perl_croak>.
+
+=item *
+
+The functions C<PerlIO_find_layer> and C<PerlIO_list_alloc> are now
+exported.
+
+=item *
+
+C<PL_na> has been exterminated from the core code, replaced by local STRLEN
+temporaries, or C<*_nolen()> calls. Either approach is faster than C<PL_na>,
+which is a pointer deference into the interpreter structure under ithreads,
+and a global variable otherwise.
+
+=item *
+
+C<Perl_mg_free()> used to leave freed memory accessible via SvMAGIC() on
+the scalar. It now updates the linked list to remove each piece of magic
+as it is freed.
+
+=item *
+
+Under ithreads, the regex in C<PL_reg_curpm> is now reference counted. This
+eliminates a lot of hackish workarounds to cope with it not being reference
+counted.
+
+=item *
+
+C<Perl_mg_magical()> would sometimes incorrectly turn on C<SvRMAGICAL()>.
+This has been fixed.
+
+=item *
+
+The I<public> IV and NV flags are now not set if the string value has
+trailing "garbage". This behaviour is consistent with not setting the
+public IV or NV flags if the value is out of range for the type.
+
+=item *
+
+SV allocation tracing has been added to the diagnostics enabled by C<-Dm>.
+The tracing can alternatively output via the C<PERL_MEM_LOG> mechanism, if
+that was enabled when the F<perl> binary was compiled.
+
+=item *
+
+Uses of C<Nullav>, C<Nullcv>, C<Nullhv>, C<Nullop>, C<Nullsv> etc have been
+replaced by C<NULL> in the core code, and non-dual-life modules, as C<NULL>
+is clearer to those unfamiliar with the core code.
+
+=item *
+
+A macro C<MUTABLE_PTR(p)> has been added, which on (non-pedantic) gcc will
+not cast away C<const>, returning a C<void *>. Macros C<MUTABLE_SV(av)>,
+C<MUTABLE_SV(cv)> etc build on this, casting to C<AV *> etc without
+casting away C<const>. This allows proper compile-time auditing of
+C<const> correctness in the core, and helped picked up some errors (now
+fixed).
+
+=item *
+
+Macros C<mPUSHs()> and C<mXPUSHs()> have been added, for pushing SVs on the
+stack and mortalizing them.
+
+=item *
+
+Use of the private structure C<mro_meta> has changed slightly. Nothing
+outside the core should be accessing this directly anyway.
+
+=item *
+
+A new tool, C<Porting/expand-macro.pl> has been added, that allows you
+to view how a C preprocessor macro would be expanded when compiled.
+This is handy when trying to decode the macro hell that is the perl
+guts.
+
+=back
+
+=head1 New Tests
+
+Many modules updated from CPAN incorporate new tests.
+
+Several tests that have the potential to hang forever if they fail now
+incorporate a "watchdog" functionality that will kill them after a timeout,
+which helps ensure that C<make test> and C<make test_harness> run to
+completion automatically. (Jerry Hedden).
+
+Some core-specific tests have been added:
+
+=over 4
+
+=item t/comp/retainedlines.t
+
+Check that the debugger can retain source lines from C<eval>.
+
+=item t/io/perlio_fail.t
+
+Check that bad layers fail.
+
+=item t/io/perlio_leaks.t
+
+Check that PerlIO layers are not leaking.
+
+=item t/io/perlio_open.t
+
+Check that certain special forms of open work.
+
+=item t/io/perlio.t
+
+General PerlIO tests.
+
+=item t/io/pvbm.t
+
+Check that there is no unexpected interaction between the internal types
+C<PVBM> and C<PVGV>.
+
+=item t/mro/package_aliases.t
+
+Check that mro works properly in the presence of aliased packages.
+
+=item t/op/dbm.t
+
+Tests for C<dbmopen> and C<dbmclose>.
+
+=item t/op/index_thr.t
+
+Tests for the interaction of C<index> and threads.
+
+=item t/op/pat_thr.t
+
+Tests for the interaction of esoteric patterns and threads.
+
+=item t/op/qr_gc.t
+
+Test that C<qr> doesn't leak.
+
+=item t/op/reg_email_thr.t
+
+Tests for the interaction of regex recursion and threads.
+
+=item t/op/regexp_qr_embed_thr.t
+
+Tests for the interaction of patterns with embedded C<qr//> and threads.
+
+=item t/op/regexp_unicode_prop.t
+
+Tests for Unicode properties in regular expressions.
+
+=item t/op/regexp_unicode_prop_thr.t
+
+Tests for the interaction of Unicode properties and threads.
+
+=item t/op/reg_nc_tie.t
+
+Test the tied methods of C<Tie::Hash::NamedCapture>.
+
+=item t/op/reg_posixcc.t
+
+Check that POSIX character classes behave consistently.
+
+=item t/op/re.t
+
+Check that exportable C<re> functions in F<universal.c> work.
+
+=item t/op/setpgrpstack.t
+
+Check that C<setpgrp> works.
+
+=item t/op/substr_thr.t
+
+Tests for the interaction of C<substr> and threads.
+
+=item t/op/upgrade.t
+
+Check that upgrading and assigning scalars works.
+
+=item t/uni/lex_utf8.t
+
+Check that Unicode in the lexer works.
+
+=item t/uni/tie.t
+
+Check that Unicode and C<tie> work.
+
+=back
+
+=head1 Known Problems
+
+This is a list of some significant unfixed bugs, which are regressions
+from either 5.10.0 or 5.8.x.
+
+=over 4
+
+=item *
+
+C<List::Util::first> misbehaves in the presence of a lexical C<$_>
+(typically introduced by C<my $_> or implicitly by C<given>). The variable
+which gets set for each iteration is the package variable C<$_>, not the
+lexical C<$_> [RT #67694].
+
+A similar issue may occur in other modules that provide functions which
+take a block as their first argument, like
+
+ foo { ... $_ ...} list
+
+=item *
+
+The C<charnames> pragma may generate a run-time error when a regex is
+interpolated [RT #56444]:
+
+ use charnames ':full';
+ my $r1 = qr/\N{THAI CHARACTER SARA I}/;
+ "foo" =~ $r1; # okay
+ "foo" =~ /$r1+/; # runtime error
+
+A workaround is to generate the character outside of the regex:
+
+ my $a = "\N{THAI CHARACTER SARA I}";
+ my $r1 = qr/$a/;
+
+=item *
+
+Some regexes may run much more slowly when run in a child thread compared
+with the thread the pattern was compiled into [RT #55600].
+
+
+=back
+
+=head1 Deprecations
+
+The following items are now deprecated.
+
+=over 4
+
+=item *
+
+C<Switch> is buggy and should be avoided. From perl 5.11.0 onwards, it is
+intended that any use of the core version of this module will emit a
+warning, and that the module will eventually be removed from the core
+(probably in perl 5.14.0). See L<perlsyn/"Switch statements"> for its
+replacement.
+
+=item *
+
+C<suidperl> will be removed in 5.12.0. This provides a mechanism to
+emulate setuid permission bits on systems that don't support it properly.
+
+=back
+
+=head1 Acknowledgements
+
+Some of the work in this release was funded by a TPF grant.
+
+Nicholas Clark officially retired from maintenance pumpking duty at the
+end of 2008; however in reality he has put much effort in since then to
+help get 5.10.1 into a fit state to be released, including writing a
+considerable chunk of this perldelta.
+
+Steffen Mueller and David Golden in particular helped getting CPAN modules
+polished and synchronised with their in-core equivalents.
+
+Craig Berry was tireless in getting maint to run under VMS, no matter how
+many times we broke it for him.
+
+The other core committers contributed most of the changes, and applied most
+of the patches sent in by the hundreds of contributors listed in F<AUTHORS>.
+
+(Sorry to all the people I haven't mentioned by name).
+
+Finally, thanks to Larry Wall, without whom none of this would be
+necessary.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://rt.perl.org/perlbug/ . There may also be
+information at http://www.perl.org/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Be sure to trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+If the bug you are reporting has security implications, which make it
+inappropriate to send to a publicly archived mailing list, then please send
+it to perl5-security-report@perl.org. This points to a closed subscription
+unarchived mailing list, which includes all the core committers, who be able
+to help assess the impact of issues, figure out a resolution, and help
+co-ordinate the release of patches to mitigate or fix the problem across all
+platforms on which Perl is supported. Please only use this address for
+security issues in the Perl core, not for modules independently
+distributed on CPAN.
+
+=head1 SEE ALSO
+
+The F<Changes> file for an explanation of how to view exhaustive details
+on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perldgux.pod b/Master/tlpkg/tlperl.straw/lib/pods/perldgux.pod
new file mode 100755
index 00000000000..8e2cbf15cd3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perldgux.pod
@@ -0,0 +1,117 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+perldgux - Perl under DG/UX.
+
+=head1 SYNOPSIS
+
+One can read this document in the following formats:
+
+ man perldgux
+ view perl perldgux
+ explorer perldgux.html
+ info perldgux
+
+to list some (not all may be available simultaneously), or it may
+be read I<as is>: as F<README.dgux>.
+
+=cut
+
+Contents
+
+ perldgux - Perl under DG/UX.
+
+ NAME
+ SYNOPSIS
+ DESCRIPTION
+ BUILD
+ - Non-threaded Case
+ - Threaded Case
+ - Testing
+ - Installing the built perl
+ AUTHOR
+ SEE ALSO
+
+=head1 DESCRIPTION
+
+Perl 5.7/8.x for DG/UX ix86 R4.20MU0x
+
+=head1 BUILDING PERL ON DG/UX
+
+=head2 Non-threaded Perl on DG/UX
+
+Just run ./Configure script from the top directory.
+Then give "make" to compile.
+
+=head2 Threaded Perl on DG/UX
+
+If you are using as compiler GCC-2.95.x rev(DG/UX)
+an easy solution for configuring perl in your DG/UX
+machine is to run the command:
+
+./Configure -Dusethreads -Duseithreads -Dusedevel -des
+
+This will automatically accept all the defaults and
+in particular /usr/local/ as installation directory.
+Note that GCC-2.95.x rev(DG/UX) knows the switch
+-pthread which allows it to link correctly DG/UX's
+-lthread library.
+
+If you want to change the installation directory or
+have a standard DG/UX with C compiler GCC-2.7.2.x
+then you have no choice than to do an interactive
+build by issuing the command:
+
+./Configure -Dusethreads -Duseithreads
+
+In particular with GCC-2.7.2.x accept all the defaults
+and *watch* out for the message:
+
+ Any additional ld flags (NOT including libraries)? [ -pthread]
+
+Instead of -pthread put here -lthread. CGCC-2.7.2.x
+that comes with the DG/UX OS does NOT know the -pthread
+switch. So your build will fail if you choose the defaults.
+After configuration is done correctly give "make" to compile.
+
+=head2 Testing Perl on DG/UX
+
+Issuing a "make test" will run all the tests.
+If the test lib/ftmp-security gives you as a result
+something like
+
+ lib/ftmp-security....File::Temp::_gettemp:
+ Parent directory (/tmp/) is not safe (sticky bit not set
+ when world writable?) at lib/ftmp-security.t line 100
+
+don't panic and just set the sticky bit in your /tmp
+directory by doing the following as root:
+
+cd /
+chmod +t /tmp (=set the sticky bit to /tmp).
+
+Then rerun the tests. This time all must be OK.
+
+=head2 Installing the built perl on DG/UX
+
+Run the command "make install"
+
+=head1 AUTHOR
+
+Takis Psarogiannakopoulos
+Universirty of Cambridge
+Centre for Mathematical Sciences
+Department of Pure Mathematics
+Wilberforce road
+Cambridge CB3 0WB , UK
+email <takis@XFree86.Org>
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perldiag.pod b/Master/tlpkg/tlperl.straw/lib/pods/perldiag.pod
new file mode 100755
index 00000000000..1129a050a09
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perldiag.pod
@@ -0,0 +1,5065 @@
+=head1 NAME
+
+perldiag - various Perl diagnostics
+
+=head1 DESCRIPTION
+
+These messages are classified as follows (listed in increasing order of
+desperation):
+
+ (W) A warning (optional).
+ (D) A deprecation (optional).
+ (S) A severe warning (enabled by default).
+ (F) A fatal error (trappable).
+ (P) An internal error you should never see (trappable).
+ (X) A very fatal error (nontrappable).
+ (A) An alien error message (not generated by Perl).
+
+The majority of messages from the first three classifications above
+(W, D & S) can be controlled using the C<warnings> pragma.
+
+If a message can be controlled by the C<warnings> pragma, its warning
+category is included with the classification letter in the description
+below.
+
+Optional warnings are enabled by using the C<warnings> pragma or the B<-w>
+and B<-W> switches. Warnings may be captured by setting C<$SIG{__WARN__}>
+to a reference to a routine that will be called on each warning instead
+of printing it. See L<perlvar>.
+
+Severe warnings are always enabled, unless they are explicitly disabled
+with the C<warnings> pragma or the B<-X> switch.
+
+Trappable errors may be trapped using the eval operator. See
+L<perlfunc/eval>. In almost all cases, warnings may be selectively
+disabled or promoted to fatal errors using the C<warnings> pragma.
+See L<warnings>.
+
+The messages are in alphabetical order, without regard to upper or
+lower-case. Some of these messages are generic. Spots that vary are
+denoted with a %s or other printf-style escape. These escapes are
+ignored by the alphabetical order, as are all characters other than
+letters. To look up your message, just ignore anything that is not a
+letter.
+
+=over 4
+
+=item accept() on closed socket %s
+
+(W closed) You tried to do an accept on a closed socket. Did you forget
+to check the return value of your socket() call? See
+L<perlfunc/accept>.
+
+=item Allocation too large: %lx
+
+(X) You can't allocate more than 64K on an MS-DOS machine.
+
+=item '%c' allowed only after types %s
+
+(F) The modifiers '!', '<' and '>' are allowed in pack() or unpack() only
+after certain types. See L<perlfunc/pack>.
+
+=item Ambiguous call resolved as CORE::%s(), qualify as such or use &
+
+(W ambiguous) A subroutine you have declared has the same name as a Perl
+keyword, and you have used the name without qualification for calling
+one or the other. Perl decided to call the builtin because the
+subroutine is not imported.
+
+To force interpretation as a subroutine call, either put an ampersand
+before the subroutine name, or qualify the name with its package.
+Alternatively, you can import the subroutine (or pretend that it's
+imported with the C<use subs> pragma).
+
+To silently interpret it as the Perl operator, use the C<CORE::> prefix
+on the operator (e.g. C<CORE::log($x)>) or declare the subroutine
+to be an object method (see L<perlsub/"Subroutine Attributes"> or
+L<attributes>).
+
+=item Ambiguous range in transliteration operator
+
+(F) You wrote something like C<tr/a-z-0//> which doesn't mean anything at
+all. To include a C<-> character in a transliteration, put it either
+first or last. (In the past, C<tr/a-z-0//> was synonymous with
+C<tr/a-y//>, which was probably not what you would have expected.)
+
+=item Ambiguous use of %s resolved as %s
+
+(W ambiguous)(S) You said something that may not be interpreted the way
+you thought. Normally it's pretty easy to disambiguate it by supplying
+a missing quote, operator, parenthesis pair or declaration.
+
+=item '|' and '<' may not both be specified on command line
+
+(F) An error peculiar to VMS. Perl does its own command line
+redirection, and found that STDIN was a pipe, and that you also tried to
+redirect STDIN using '<'. Only one STDIN stream to a customer, please.
+
+=item '|' and '>' may not both be specified on command line
+
+(F) An error peculiar to VMS. Perl does its own command line
+redirection, and thinks you tried to redirect stdout both to a file and
+into a pipe to another command. You need to choose one or the other,
+though nothing's stopping you from piping into a program or Perl script
+which 'splits' output into two streams, such as
+
+ open(OUT,">$ARGV[0]") or die "Can't write to $ARGV[0]: $!";
+ while (<STDIN>) {
+ print;
+ print OUT;
+ }
+ close OUT;
+
+=item Applying %s to %s will act on scalar(%s)
+
+(W misc) The pattern match (C<//>), substitution (C<s///>), and
+transliteration (C<tr///>) operators work on scalar values. If you apply
+one of them to an array or a hash, it will convert the array or hash to
+a scalar value -- the length of an array, or the population info of a
+hash -- and then work on that scalar value. This is probably not what
+you meant to do. See L<perlfunc/grep> and L<perlfunc/map> for
+alternatives.
+
+=item Args must match #! line
+
+(F) The setuid emulator requires that the arguments Perl was invoked
+with match the arguments specified on the #! line. Since some systems
+impose a one-argument limit on the #! line, try combining switches;
+for example, turn C<-w -U> into C<-wU>.
+
+=item Arg too short for msgsnd
+
+(F) msgsnd() requires a string at least as long as sizeof(long).
+
+=item %s argument is not a HASH or ARRAY element or a subroutine
+
+(F) The argument to exists() must be a hash or array element or a
+subroutine with an ampersand, such as:
+
+ $foo{$bar}
+ $ref->{"susie"}[12]
+ &do_something
+
+=item %s argument is not a HASH or ARRAY element or slice
+
+(F) The argument to delete() must be either a hash or array element,
+such as:
+
+ $foo{$bar}
+ $ref->{"susie"}[12]
+
+or a hash or array slice, such as:
+
+ @foo[$bar, $baz, $xyzzy]
+ @{$ref->[12]}{"susie", "queue"}
+
+=item %s argument is not a subroutine name
+
+(F) The argument to exists() for C<exists &sub> must be a subroutine
+name, and not a subroutine call. C<exists &sub()> will generate this
+error.
+
+=item Argument "%s" isn't numeric%s
+
+(W numeric) The indicated string was fed as an argument to an operator
+that expected a numeric value instead. If you're fortunate the message
+will identify which operator was so unfortunate.
+
+=item Argument list not closed for PerlIO layer "%s"
+
+(W layer) When pushing a layer with arguments onto the Perl I/O system you
+forgot the ) that closes the argument list. (Layers take care of transforming
+data between external and internal representations.) Perl stopped parsing
+the layer list at this point and did not attempt to push this layer.
+If your program didn't explicitly request the failing operation, it may be
+the result of the value of the environment variable PERLIO.
+
+=item Array @%s missing the @ in argument %d of %s()
+
+(D deprecated) Really old Perl let you omit the @ on array names in some
+spots. This is now heavily deprecated.
+
+=item assertion botched: %s
+
+(P) The malloc package that comes with Perl had an internal failure.
+
+=item Assertion failed: file "%s"
+
+(P) A general assertion failed. The file in question must be examined.
+
+=item Assignment to both a list and a scalar
+
+(F) If you assign to a conditional operator, the 2nd and 3rd arguments
+must either both be scalars or both be lists. Otherwise Perl won't
+know which context to supply to the right side.
+
+=item A thread exited while %d threads were running
+
+(W threads)(S) When using threaded Perl, a thread (not necessarily the main
+thread) exited while there were still other threads running.
+Usually it's a good idea to first collect the return values of the
+created threads by joining them, and only then exit from the main
+thread. See L<threads>.
+
+=item Attempt to access disallowed key '%s' in a restricted hash
+
+(F) The failing code has attempted to get or set a key which is not in
+the current set of allowed keys of a restricted hash.
+
+=item Attempt to bless into a reference
+
+(F) The CLASSNAME argument to the bless() operator is expected to be
+the name of the package to bless the resulting object into. You've
+supplied instead a reference to something: perhaps you wrote
+
+ bless $self, $proto;
+
+when you intended
+
+ bless $self, ref($proto) || $proto;
+
+If you actually want to bless into the stringified version
+of the reference supplied, you need to stringify it yourself, for
+example by:
+
+ bless $self, "$proto";
+
+=item Attempt to delete disallowed key '%s' from a restricted hash
+
+(F) The failing code attempted to delete from a restricted hash a key
+which is not in its key set.
+
+=item Attempt to delete readonly key '%s' from a restricted hash
+
+(F) The failing code attempted to delete a key whose value has been
+declared readonly from a restricted hash.
+
+=item Attempt to free non-arena SV: 0x%lx
+
+(P internal) All SV objects are supposed to be allocated from arenas
+that will be garbage collected on exit. An SV was discovered to be
+outside any of those arenas.
+
+=item Attempt to free nonexistent shared string
+
+(P internal) Perl maintains a reference counted internal table of
+strings to optimize the storage and access of hash keys and other
+strings. This indicates someone tried to decrement the reference count
+of a string that can no longer be found in the table.
+
+=item Attempt to free temp prematurely
+
+(W debugging) Mortalized values are supposed to be freed by the
+free_tmps() routine. This indicates that something else is freeing the
+SV before the free_tmps() routine gets a chance, which means that the
+free_tmps() routine will be freeing an unreferenced scalar when it does
+try to free it.
+
+=item Attempt to free unreferenced glob pointers
+
+(P internal) The reference counts got screwed up on symbol aliases.
+
+=item Attempt to free unreferenced scalar
+
+(W internal) Perl went to decrement the reference count of a scalar to
+see if it would go to 0, and discovered that it had already gone to 0
+earlier, and should have been freed, and in fact, probably was freed.
+This could indicate that SvREFCNT_dec() was called too many times, or
+that SvREFCNT_inc() was called too few times, or that the SV was
+mortalized when it shouldn't have been, or that memory has been
+corrupted.
+
+=item Attempt to join self
+
+(F) You tried to join a thread from within itself, which is an
+impossible task. You may be joining the wrong thread, or you may need
+to move the join() to some other thread.
+
+=item Attempt to pack pointer to temporary value
+
+(W pack) You tried to pass a temporary value (like the result of a
+function, or a computed expression) to the "p" pack() template. This
+means the result contains a pointer to a location that could become
+invalid anytime, even before the end of the current statement. Use
+literals or global values as arguments to the "p" pack() template to
+avoid this warning.
+
+=item Attempt to reload %s aborted.
+
+(F) You tried to load a file with C<use> or C<require> that failed to
+compile once already. Perl will not try to compile this file again
+unless you delete its entry from %INC. See L<perlfunc/require> and
+L<perlvar/%INC>.
+
+=item Attempt to set length of freed array
+
+(W) You tried to set the length of an array which has been freed. You
+can do this by storing a reference to the scalar representing the last index
+of an array and later assigning through that reference. For example
+
+ $r = do {my @a; \$#a};
+ $$r = 503
+
+=item Attempt to use reference as lvalue in substr
+
+(W substr) You supplied a reference as the first argument to substr()
+used as an lvalue, which is pretty strange. Perhaps you forgot to
+dereference it first. See L<perlfunc/substr>.
+
+=item Bad arg length for %s, is %d, should be %s
+
+(F) You passed a buffer of the wrong size to one of msgctl(), semctl()
+or shmctl(). In C parlance, the correct sizes are, respectively,
+S<sizeof(struct msqid_ds *)>, S<sizeof(struct semid_ds *)>, and
+S<sizeof(struct shmid_ds *)>.
+
+=item Bad evalled substitution pattern
+
+(F) You've used the C</e> switch to evaluate the replacement for a
+substitution, but perl found a syntax error in the code to evaluate,
+most likely an unexpected right brace '}'.
+
+=item Bad filehandle: %s
+
+(F) A symbol was passed to something wanting a filehandle, but the
+symbol has no filehandle associated with it. Perhaps you didn't do an
+open(), or did it in another package.
+
+=item Bad free() ignored
+
+(S malloc) An internal routine called free() on something that had never
+been malloc()ed in the first place. Mandatory, but can be disabled by
+setting environment variable C<PERL_BADFREE> to 0.
+
+This message can be seen quite often with DB_File on systems with "hard"
+dynamic linking, like C<AIX> and C<OS/2>. It is a bug of C<Berkeley DB>
+which is left unnoticed if C<DB> uses I<forgiving> system malloc().
+
+=item Bad hash
+
+(P) One of the internal hash routines was passed a null HV pointer.
+
+=item Badly placed ()'s
+
+(A) You've accidentally run your script through B<csh> instead
+of Perl. Check the #! line, or manually feed your script into
+Perl yourself.
+
+=item Bad name after %s::
+
+(F) You started to name a symbol by using a package prefix, and then
+didn't finish the symbol. In particular, you can't interpolate outside
+of quotes, so
+
+ $var = 'myvar';
+ $sym = mypack::$var;
+
+is not the same as
+
+ $var = 'myvar';
+ $sym = "mypack::$var";
+
+=item Bad realloc() ignored
+
+(S malloc) An internal routine called realloc() on something that had
+never been malloc()ed in the first place. Mandatory, but can be disabled
+by setting environment variable C<PERL_BADFREE> to 1.
+
+=item Bad symbol for array
+
+(P) An internal request asked to add an array entry to something that
+wasn't a symbol table entry.
+
+=item Bad symbol for dirhandle
+
+(P) An internal request asked to add a dirhandle entry to something
+that wasn't a symbol table entry.
+
+
+=item Bad symbol for filehandle
+
+(P) An internal request asked to add a filehandle entry to something
+that wasn't a symbol table entry.
+
+=item Bad symbol for hash
+
+(P) An internal request asked to add a hash entry to something that
+wasn't a symbol table entry.
+
+=item Bareword found in conditional
+
+(W bareword) The compiler found a bareword where it expected a
+conditional, which often indicates that an || or && was parsed as part
+of the last argument of the previous construct, for example:
+
+ open FOO || die;
+
+It may also indicate a misspelled constant that has been interpreted as
+a bareword:
+
+ use constant TYPO => 1;
+ if (TYOP) { print "foo" }
+
+The C<strict> pragma is useful in avoiding such errors.
+
+=item Bareword "%s" not allowed while "strict subs" in use
+
+(F) With "strict subs" in use, a bareword is only allowed as a
+subroutine identifier, in curly brackets or to the left of the "=>"
+symbol. Perhaps you need to predeclare a subroutine?
+
+=item Bareword "%s" refers to nonexistent package
+
+(W bareword) You used a qualified bareword of the form C<Foo::>, but the
+compiler saw no other uses of that namespace before that point. Perhaps
+you need to predeclare a package?
+
+=item BEGIN failed--compilation aborted
+
+(F) An untrapped exception was raised while executing a BEGIN
+subroutine. Compilation stops immediately and the interpreter is
+exited.
+
+=item BEGIN not safe after errors--compilation aborted
+
+(F) Perl found a C<BEGIN {}> subroutine (or a C<use> directive, which
+implies a C<BEGIN {}>) after one or more compilation errors had already
+occurred. Since the intended environment for the C<BEGIN {}> could not
+be guaranteed (due to the errors), and since subsequent code likely
+depends on its correct operation, Perl just gave up.
+
+=item \1 better written as $1
+
+(W syntax) Outside of patterns, backreferences live on as variables.
+The use of backslashes is grandfathered on the right-hand side of a
+substitution, but stylistically it's better to use the variable form
+because other Perl programmers will expect it, and it works better if
+there are more than 9 backreferences.
+
+=item Binary number > 0b11111111111111111111111111111111 non-portable
+
+(W portable) The binary number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems. See
+L<perlport> for more on portability concerns.
+
+=item bind() on closed socket %s
+
+(W closed) You tried to do a bind on a closed socket. Did you forget to
+check the return value of your socket() call? See L<perlfunc/bind>.
+
+=item binmode() on closed filehandle %s
+
+(W unopened) You tried binmode() on a filehandle that was never opened.
+Check you control flow and number of arguments.
+
+=item Bit vector size > 32 non-portable
+
+(W portable) Using bit vector sizes larger than 32 is non-portable.
+
+=item Bizarre copy of %s in %s
+
+(P) Perl detected an attempt to copy an internal value that is not
+copyable.
+
+=item Buffer overflow in prime_env_iter: %s
+
+(W internal) A warning peculiar to VMS. While Perl was preparing to
+iterate over %ENV, it encountered a logical name or symbol definition
+which was too long, so it was truncated to the string shown.
+
+=item Callback called exit
+
+(F) A subroutine invoked from an external package via call_sv()
+exited by calling exit.
+
+=item %s() called too early to check prototype
+
+(W prototype) You've called a function that has a prototype before the
+parser saw a definition or declaration for it, and Perl could not check
+that the call conforms to the prototype. You need to either add an
+early prototype declaration for the subroutine in question, or move the
+subroutine definition ahead of the call to get proper prototype
+checking. Alternatively, if you are certain that you're calling the
+function correctly, you may put an ampersand before the name to avoid
+the warning. See L<perlsub>.
+
+=item Cannot compress integer in pack
+
+(F) An argument to pack("w",...) was too large to compress. The BER
+compressed integer format can only be used with positive integers, and you
+attempted to compress Infinity or a very large number (> 1e308).
+See L<perlfunc/pack>.
+
+=item Cannot compress negative numbers in pack
+
+(F) An argument to pack("w",...) was negative. The BER compressed integer
+format can only be used with positive integers. See L<perlfunc/pack>.
+
+=item Cannot convert a reference to %s to typeglob
+
+(F) You manipulated Perl's symbol table directly, stored a reference in it,
+then tried to access that symbol via conventional Perl syntax. The access
+triggers Perl to autovivify that typeglob, but it there is no legal conversion
+from that type of reference to a typeglob.
+
+=item Cannot copy to %s in %s
+
+(P) Perl detected an attempt to copy a value to an internal type that cannot
+be directly assigned not.
+
+=item Can only compress unsigned integers in pack
+
+(F) An argument to pack("w",...) was not an integer. The BER compressed
+integer format can only be used with positive integers, and you attempted
+to compress something else. See L<perlfunc/pack>.
+
+=item Can't bless non-reference value
+
+(F) Only hard references may be blessed. This is how Perl "enforces"
+encapsulation of objects. See L<perlobj>.
+
+=item Can't "break" in a loop topicalizer
+
+(F) You called C<break>, but you're in a C<foreach> block rather than
+a C<given> block. You probably meant to use C<next> or C<last>.
+
+=item Can't "break" outside a given block
+
+(F) You called C<break>, but you're not inside a C<given> block.
+
+=item Can't call method "%s" in empty package "%s"
+
+(F) You called a method correctly, and it correctly indicated a package
+functioning as a class, but that package doesn't have ANYTHING defined
+in it, let alone methods. See L<perlobj>.
+
+=item Can't call method "%s" on an undefined value
+
+(F) You used the syntax of a method call, but the slot filled by the
+object reference or package name contains an undefined value. Something
+like this will reproduce the error:
+
+ $BADREF = undef;
+ process $BADREF 1,2,3;
+ $BADREF->process(1,2,3);
+
+=item Can't call method "%s" on unblessed reference
+
+(F) A method call must know in what package it's supposed to run. It
+ordinarily finds this out from the object reference you supply, but you
+didn't supply an object reference in this case. A reference isn't an
+object reference until it has been blessed. See L<perlobj>.
+
+=item Can't call method "%s" without a package or object reference
+
+(F) You used the syntax of a method call, but the slot filled by the
+object reference or package name contains an expression that returns a
+defined value which is neither an object reference nor a package name.
+Something like this will reproduce the error:
+
+ $BADREF = 42;
+ process $BADREF 1,2,3;
+ $BADREF->process(1,2,3);
+
+=item Can't chdir to %s
+
+(F) You called C<perl -x/foo/bar>, but C</foo/bar> is not a directory
+that you can chdir to, possibly because it doesn't exist.
+
+=item Can't check filesystem of script "%s" for nosuid
+
+(P) For some reason you can't check the filesystem of the script for
+nosuid.
+
+=item Can't coerce array into hash
+
+(F) You used an array where a hash was expected, but the array has no
+information on how to map from keys to array indices. You can do that
+only with arrays that have a hash reference at index 0.
+
+=item Can't coerce %s to integer in %s
+
+(F) Certain types of SVs, in particular real symbol table entries
+(typeglobs), can't be forced to stop being what they are. So you can't
+say things like:
+
+ *foo += 1;
+
+You CAN say
+
+ $foo = *foo;
+ $foo += 1;
+
+but then $foo no longer contains a glob.
+
+=item Can't coerce %s to number in %s
+
+(F) Certain types of SVs, in particular real symbol table entries
+(typeglobs), can't be forced to stop being what they are.
+
+=item Can't coerce %s to string in %s
+
+(F) Certain types of SVs, in particular real symbol table entries
+(typeglobs), can't be forced to stop being what they are.
+
+=item Can't "continue" outside a when block
+
+(F) You called C<continue>, but you're not inside a C<when>
+or C<default> block.
+
+=item Can't create pipe mailbox
+
+(P) An error peculiar to VMS. The process is suffering from exhausted
+quotas or other plumbing problems.
+
+=item Can't declare class for non-scalar %s in "%s"
+
+(F) Currently, only scalar variables can be declared with a specific
+class qualifier in a "my", "our" or "state" declaration. The semantics may be
+extended for other types of variables in future.
+
+=item Can't declare %s in "%s"
+
+(F) Only scalar, array, and hash variables may be declared as "my", "our" or
+"state" variables. They must have ordinary identifiers as names.
+
+=item Can't do inplace edit: %s is not a regular file
+
+(S inplace) You tried to use the B<-i> switch on a special file, such as
+a file in /dev, or a FIFO. The file was ignored.
+
+=item Can't do inplace edit on %s: %s
+
+(S inplace) The creation of the new file failed for the indicated
+reason.
+
+=item Can't do inplace edit without backup
+
+(F) You're on a system such as MS-DOS that gets confused if you try
+reading from a deleted (but still opened) file. You have to say
+C<-i.bak>, or some such.
+
+=item Can't do inplace edit: %s would not be unique
+
+(S inplace) Your filesystem does not support filenames longer than 14
+characters and Perl was unable to create a unique filename during
+inplace editing with the B<-i> switch. The file was ignored.
+
+=item Can't do {n,m} with n > m in regex; marked by <-- HERE in m/%s/
+
+(F) Minima must be less than or equal to maxima. If you really want your
+regexp to match something 0 times, just put {0}. The <-- HERE shows in the
+regular expression about where the problem was discovered. See L<perlre>.
+
+=item Can't do setegid!
+
+(P) The setegid() call failed for some reason in the setuid emulator of
+suidperl.
+
+=item Can't do seteuid!
+
+(P) The setuid emulator of suidperl failed for some reason.
+
+=item Can't do setuid
+
+(F) This typically means that ordinary perl tried to exec suidperl to do
+setuid emulation, but couldn't exec it. It looks for a name of the form
+sperl5.000 in the same directory that the perl executable resides under
+the name perl5.000, typically /usr/local/bin on Unix machines. If the
+file is there, check the execute permissions. If it isn't, ask your
+sysadmin why he and/or she removed it.
+
+=item Can't do waitpid with flags
+
+(F) This machine doesn't have either waitpid() or wait4(), so only
+waitpid() without flags is emulated.
+
+=item Can't emulate -%s on #! line
+
+(F) The #! line specifies a switch that doesn't make sense at this
+point. For example, it'd be kind of silly to put a B<-x> on the #!
+line.
+
+=item Can't %s %s-endian %ss on this platform
+
+(F) Your platform's byte-order is neither big-endian nor little-endian,
+or it has a very strange pointer size. Packing and unpacking big- or
+little-endian floating point values and pointers may not be possible.
+See L<perlfunc/pack>.
+
+=item Can't exec "%s": %s
+
+(W exec) A system(), exec(), or piped open call could not execute the
+named program for the indicated reason. Typical reasons include: the
+permissions were wrong on the file, the file wasn't found in
+C<$ENV{PATH}>, the executable in question was compiled for another
+architecture, or the #! line in a script points to an interpreter that
+can't be run for similar reasons. (Or maybe your system doesn't support
+#! at all.)
+
+=item Can't exec %s
+
+(F) Perl was trying to execute the indicated program for you because
+that's what the #! line said. If that's not what you wanted, you may
+need to mention "perl" on the #! line somewhere.
+
+=item Can't execute %s
+
+(F) You used the B<-S> switch, but the copies of the script to execute
+found in the PATH did not have correct permissions.
+
+=item Can't find an opnumber for "%s"
+
+(F) A string of a form C<CORE::word> was given to prototype(), but there
+is no builtin with the name C<word>.
+
+=item Can't find %s character property "%s"
+
+(F) You used C<\p{}> or C<\P{}> but the character property by that name
+could not be found. Maybe you misspelled the name of the property
+(remember that the names of character properties consist only of
+alphanumeric characters), or maybe you forgot the C<Is> or C<In> prefix?
+
+=item Can't find label %s
+
+(F) You said to goto a label that isn't mentioned anywhere that it's
+possible for us to go to. See L<perlfunc/goto>.
+
+=item Can't find %s on PATH
+
+(F) You used the B<-S> switch, but the script to execute could not be
+found in the PATH.
+
+=item Can't find %s on PATH, '.' not in PATH
+
+(F) You used the B<-S> switch, but the script to execute could not be
+found in the PATH, or at least not with the correct permissions. The
+script exists in the current directory, but PATH prohibits running it.
+
+=item Can't find string terminator %s anywhere before EOF
+
+(F) Perl strings can stretch over multiple lines. This message means
+that the closing delimiter was omitted. Because bracketed quotes count
+nesting levels, the following is missing its final parenthesis:
+
+ print q(The character '(' starts a side comment.);
+
+If you're getting this error from a here-document, you may have included
+unseen whitespace before or after your closing tag. A good programmer's
+editor will have a way to help you find these characters.
+
+=item Can't find Unicode property definition "%s"
+
+(F) You may have tried to use C<\p> which means a Unicode property (for
+example C<\p{Lu}> is all uppercase letters). If you did mean to use a
+Unicode property, see L<perlunicode> for the list of known properties.
+If you didn't mean to use a Unicode property, escape the C<\p>, either
+by C<\\p> (just the C<\p>) or by C<\Q\p> (the rest of the string, until
+possible C<\E>).
+
+=item Can't fork
+
+(F) A fatal error occurred while trying to fork while opening a
+pipeline.
+
+=item Can't get filespec - stale stat buffer?
+
+(S) A warning peculiar to VMS. This arises because of the difference
+between access checks under VMS and under the Unix model Perl assumes.
+Under VMS, access checks are done by filename, rather than by bits in
+the stat buffer, so that ACLs and other protections can be taken into
+account. Unfortunately, Perl assumes that the stat buffer contains all
+the necessary information, and passes it, instead of the filespec, to
+the access checking routine. It will try to retrieve the filespec using
+the device name and FID present in the stat buffer, but this works only
+if you haven't made a subsequent call to the CRTL stat() routine,
+because the device name is overwritten with each call. If this warning
+appears, the name lookup failed, and the access checking routine gave up
+and returned FALSE, just to be conservative. (Note: The access checking
+routine knows about the Perl C<stat> operator and file tests, so you
+shouldn't ever see this warning in response to a Perl command; it arises
+only if some internal code takes stat buffers lightly.)
+
+=item Can't get pipe mailbox device name
+
+(P) An error peculiar to VMS. After creating a mailbox to act as a
+pipe, Perl can't retrieve its name for later use.
+
+=item Can't get SYSGEN parameter value for MAXBUF
+
+(P) An error peculiar to VMS. Perl asked $GETSYI how big you want your
+mailbox buffers to be, and didn't get an answer.
+
+=item Can't "goto" into the middle of a foreach loop
+
+(F) A "goto" statement was executed to jump into the middle of a foreach
+loop. You can't get there from here. See L<perlfunc/goto>.
+
+=item Can't "goto" out of a pseudo block
+
+(F) A "goto" statement was executed to jump out of what might look like
+a block, except that it isn't a proper block. This usually occurs if
+you tried to jump out of a sort() block or subroutine, which is a no-no.
+See L<perlfunc/goto>.
+
+=item Can't goto subroutine from a sort sub (or similar callback)
+
+(F) The "goto subroutine" call can't be used to jump out of the
+comparison sub for a sort(), or from a similar callback (such
+as the reduce() function in List::Util).
+
+=item Can't goto subroutine from an eval-%s
+
+(F) The "goto subroutine" call can't be used to jump out of an eval
+"string" or block.
+
+=item Can't goto subroutine outside a subroutine
+
+(F) The deeply magical "goto subroutine" call can only replace one
+subroutine call for another. It can't manufacture one out of whole
+cloth. In general you should be calling it out of only an AUTOLOAD
+routine anyway. See L<perlfunc/goto>.
+
+=item Can't ignore signal CHLD, forcing to default
+
+(W signal) Perl has detected that it is being run with the SIGCHLD
+signal (sometimes known as SIGCLD) disabled. Since disabling this
+signal will interfere with proper determination of exit status of child
+processes, Perl has reset the signal to its default value. This
+situation typically indicates that the parent program under which Perl
+may be running (e.g. cron) is being very careless.
+
+=item Can't "last" outside a loop block
+
+(F) A "last" statement was executed to break out of the current block,
+except that there's this itty bitty problem called there isn't a current
+block. Note that an "if" or "else" block doesn't count as a "loopish"
+block, as doesn't a block given to sort(), map() or grep(). You can
+usually double the curlies to get the same effect though, because the
+inner curlies will be considered a block that loops once. See
+L<perlfunc/last>.
+
+=item Can't linearize anonymous symbol table
+
+(F) Perl tried to calculate the method resolution order (MRO) of a
+package, but failed because the package stash has no name.
+
+=item Can't load '%s' for module %s
+
+(F) The module you tried to load failed to load a dynamic extension. This
+may either mean that you upgraded your version of perl to one that is
+incompatible with your old dynamic extensions (which is known to happen
+between major versions of perl), or (more likely) that your dynamic
+extension was built against an older version of the library that is
+installed on your system. You may need to rebuild your old dynamic
+extensions.
+
+=item Can't localize lexical variable %s
+
+(F) You used local on a variable name that was previously declared as a
+lexical variable using "my" or "state". This is not allowed. If you want to
+localize a package variable of the same name, qualify it with the
+package name.
+
+=item Can't localize through a reference
+
+(F) You said something like C<local $$ref>, which Perl can't currently
+handle, because when it goes to restore the old value of whatever $ref
+pointed to after the scope of the local() is finished, it can't be sure
+that $ref will still be a reference.
+
+=item Can't locate %s
+
+(F) You said to C<do> (or C<require>, or C<use>) a file that couldn't be
+found. Perl looks for the file in all the locations mentioned in @INC,
+unless the file name included the full path to the file. Perhaps you
+need to set the PERL5LIB or PERL5OPT environment variable to say where
+the extra library is, or maybe the script needs to add the library name
+to @INC. Or maybe you just misspelled the name of the file. See
+L<perlfunc/require> and L<lib>.
+
+=item Can't locate auto/%s.al in @INC
+
+(F) A function (or method) was called in a package which allows
+autoload, but there is no function to autoload. Most probable causes
+are a misprint in a function/method name or a failure to C<AutoSplit>
+the file, say, by doing C<make install>.
+
+=item Can't locate loadable object for module %s in @INC
+
+(F) The module you loaded is trying to load an external library, like
+for example, C<foo.so> or C<bar.dll>, but the L<DynaLoader> module was
+unable to locate this library. See L<DynaLoader>.
+
+=item Can't locate object method "%s" via package "%s"
+
+(F) You called a method correctly, and it correctly indicated a package
+functioning as a class, but that package doesn't define that particular
+method, nor does any of its base classes. See L<perlobj>.
+
+=item Can't locate package %s for @%s::ISA
+
+(W syntax) The @ISA array contained the name of another package that
+doesn't seem to exist.
+
+=item Can't locate PerlIO%s
+
+(F) You tried to use in open() a PerlIO layer that does not exist,
+e.g. open(FH, ">:nosuchlayer", "somefile").
+
+=item Can't make list assignment to \%ENV on this system
+
+(F) List assignment to %ENV is not supported on some systems, notably
+VMS.
+
+=item Can't modify %s in %s
+
+(F) You aren't allowed to assign to the item indicated, or otherwise try
+to change it, such as with an auto-increment.
+
+=item Can't modify nonexistent substring
+
+(P) The internal routine that does assignment to a substr() was handed
+a NULL.
+
+=item Can't modify non-lvalue subroutine call
+
+(F) Subroutines meant to be used in lvalue context should be declared as
+such, see L<perlsub/"Lvalue subroutines">.
+
+=item Can't msgrcv to read-only var
+
+(F) The target of a msgrcv must be modifiable to be used as a receive
+buffer.
+
+=item Can't "next" outside a loop block
+
+(F) A "next" statement was executed to reiterate the current block, but
+there isn't a current block. Note that an "if" or "else" block doesn't
+count as a "loopish" block, as doesn't a block given to sort(), map() or
+grep(). You can usually double the curlies to get the same effect
+though, because the inner curlies will be considered a block that loops
+once. See L<perlfunc/next>.
+
+=item Can't open %s: %s
+
+(S inplace) The implicit opening of a file through use of the C<< <> >>
+filehandle, either implicitly under the C<-n> or C<-p> command-line
+switches, or explicitly, failed for the indicated reason. Usually this
+is because you don't have read permission for a file which you named on
+the command line.
+
+=item Can't open a reference
+
+(W io) You tried to open a scalar reference for reading or writing,
+using the 3-arg open() syntax :
+
+ open FH, '>', $ref;
+
+but your version of perl is compiled without perlio, and this form of
+open is not supported.
+
+=item Can't open bidirectional pipe
+
+(W pipe) You tried to say C<open(CMD, "|cmd|")>, which is not supported.
+You can try any of several modules in the Perl library to do this, such
+as IPC::Open2. Alternately, direct the pipe's output to a file using
+">", and then read it in under a different file handle.
+
+=item Can't open error file %s as stderr
+
+(F) An error peculiar to VMS. Perl does its own command line
+redirection, and couldn't open the file specified after '2>' or '2>>' on
+the command line for writing.
+
+=item Can't open input file %s as stdin
+
+(F) An error peculiar to VMS. Perl does its own command line
+redirection, and couldn't open the file specified after '<' on the
+command line for reading.
+
+=item Can't open output file %s as stdout
+
+(F) An error peculiar to VMS. Perl does its own command line
+redirection, and couldn't open the file specified after '>' or '>>' on
+the command line for writing.
+
+=item Can't open output pipe (name: %s)
+
+(P) An error peculiar to VMS. Perl does its own command line
+redirection, and couldn't open the pipe into which to send data destined
+for stdout.
+
+=item Can't open perl script%s
+
+(F) The script you specified can't be opened for the indicated reason.
+
+If you're debugging a script that uses #!, and normally relies on the
+shell's $PATH search, the -S option causes perl to do that search, so
+you don't have to type the path or C<`which $scriptname`>.
+
+=item Can't read CRTL environ
+
+(S) A warning peculiar to VMS. Perl tried to read an element of %ENV
+from the CRTL's internal environment array and discovered the array was
+missing. You need to figure out where your CRTL misplaced its environ
+or define F<PERL_ENV_TABLES> (see L<perlvms>) so that environ is not
+searched.
+
+=item Can't "redo" outside a loop block
+
+(F) A "redo" statement was executed to restart the current block, but
+there isn't a current block. Note that an "if" or "else" block doesn't
+count as a "loopish" block, as doesn't a block given to sort(), map()
+or grep(). You can usually double the curlies to get the same effect
+though, because the inner curlies will be considered a block that
+loops once. See L<perlfunc/redo>.
+
+=item Can't remove %s: %s, skipping file
+
+(S inplace) You requested an inplace edit without creating a backup
+file. Perl was unable to remove the original file to replace it with
+the modified file. The file was left unmodified.
+
+=item Can't rename %s to %s: %s, skipping file
+
+(S inplace) The rename done by the B<-i> switch failed for some reason,
+probably because you don't have write permission to the directory.
+
+=item Can't reopen input pipe (name: %s) in binary mode
+
+(P) An error peculiar to VMS. Perl thought stdin was a pipe, and tried
+to reopen it to accept binary data. Alas, it failed.
+
+=item Can't resolve method `%s' overloading `%s' in package `%s'
+
+(F|P) Error resolving overloading specified by a method name (as opposed
+to a subroutine reference): no such method callable via the package. If
+method name is C<???>, this is an internal error.
+
+=item Can't reswap uid and euid
+
+(P) The setreuid() call failed for some reason in the setuid emulator of
+suidperl.
+
+=item Can't return %s from lvalue subroutine
+
+(F) Perl detected an attempt to return illegal lvalues (such as
+temporary or readonly values) from a subroutine used as an lvalue. This
+is not allowed.
+
+=item Can't return outside a subroutine
+
+(F) The return statement was executed in mainline code, that is, where
+there was no subroutine call to return out of. See L<perlsub>.
+
+=item Can't return %s to lvalue scalar context
+
+(F) You tried to return a complete array or hash from an lvalue subroutine,
+but you called the subroutine in a way that made Perl think you meant
+to return only one value. You probably meant to write parentheses around
+the call to the subroutine, which tell Perl that the call should be in
+list context.
+
+=item Can't stat script "%s"
+
+(P) For some reason you can't fstat() the script even though you have it
+open already. Bizarre.
+
+=item Can't swap uid and euid
+
+(P) The setreuid() call failed for some reason in the setuid emulator of
+suidperl.
+
+=item Can't take log of %g
+
+(F) For ordinary real numbers, you can't take the logarithm of a
+negative number or zero. There's a Math::Complex package that comes
+standard with Perl, though, if you really want to do that for the
+negative numbers.
+
+=item Can't take sqrt of %g
+
+(F) For ordinary real numbers, you can't take the square root of a
+negative number. There's a Math::Complex package that comes standard
+with Perl, though, if you really want to do that.
+
+=item Can't undef active subroutine
+
+(F) You can't undefine a routine that's currently running. You can,
+however, redefine it while it's running, and you can even undef the
+redefined subroutine while the old routine is running. Go figure.
+
+=item Can't unshift
+
+(F) You tried to unshift an "unreal" array that can't be unshifted, such
+as the main Perl stack.
+
+=item Can't upgrade %s (%d) to %d
+
+(P) The internal sv_upgrade routine adds "members" to an SV, making it
+into a more specialized kind of SV. The top several SV types are so
+specialized, however, that they cannot be interconverted. This message
+indicates that such a conversion was attempted.
+
+=item Can't use anonymous symbol table for method lookup
+
+(F) The internal routine that does method lookup was handed a symbol
+table that doesn't have a name. Symbol tables can become anonymous
+for example by undefining stashes: C<undef %Some::Package::>.
+
+=item Can't use an undefined value as %s reference
+
+(F) A value used as either a hard reference or a symbolic reference must
+be a defined value. This helps to delurk some insidious errors.
+
+=item Can't use bareword ("%s") as %s ref while "strict refs" in use
+
+(F) Only hard references are allowed by "strict refs". Symbolic
+references are disallowed. See L<perlref>.
+
+=item Can't use %! because Errno.pm is not available
+
+(F) The first time the %! hash is used, perl automatically loads the
+Errno.pm module. The Errno module is expected to tie the %! hash to
+provide symbolic names for C<$!> errno values.
+
+=item Can't use both '<' and '>' after type '%c' in %s
+
+(F) A type cannot be forced to have both big-endian and little-endian
+byte-order at the same time, so this combination of modifiers is not
+allowed. See L<perlfunc/pack>.
+
+=item Can't use %s for loop variable
+
+(F) Only a simple scalar variable may be used as a loop variable on a
+foreach.
+
+=item Can't use global %s in "%s"
+
+(F) You tried to declare a magical variable as a lexical variable. This
+is not allowed, because the magic can be tied to only one location
+(namely the global variable) and it would be incredibly confusing to
+have variables in your program that looked like magical variables but
+weren't.
+
+=item Can't use '%c' in a group with different byte-order in %s
+
+(F) You attempted to force a different byte-order on a type
+that is already inside a group with a byte-order modifier.
+For example you cannot force little-endianness on a type that
+is inside a big-endian group.
+
+=item Can't use "my %s" in sort comparison
+
+(F) The global variables $a and $b are reserved for sort comparisons.
+You mentioned $a or $b in the same line as the <=> or cmp operator,
+and the variable had earlier been declared as a lexical variable.
+Either qualify the sort variable with the package name, or rename the
+lexical variable.
+
+=item Can't use %s ref as %s ref
+
+(F) You've mixed up your reference types. You have to dereference a
+reference of the type needed. You can use the ref() function to
+test the type of the reference, if need be.
+
+=item Can't use string ("%s") as %s ref while "strict refs" in use
+
+(F) Only hard references are allowed by "strict refs". Symbolic
+references are disallowed. See L<perlref>.
+
+=item Can't use subscript on %s
+
+(F) The compiler tried to interpret a bracketed expression as a
+subscript. But to the left of the brackets was an expression that
+didn't look like a hash or array reference, or anything else subscriptable.
+
+=item Can't use \%c to mean $%c in expression
+
+(W syntax) In an ordinary expression, backslash is a unary operator that
+creates a reference to its argument. The use of backslash to indicate a
+backreference to a matched substring is valid only as part of a regular
+expression pattern. Trying to do this in ordinary Perl code produces a
+value that prints out looking like SCALAR(0xdecaf). Use the $1 form
+instead.
+
+=item Can't use "when" outside a topicalizer
+
+(F) You have used a when() block that is neither inside a C<foreach>
+loop nor a C<given> block. (Note that this error is issued on exit
+from the C<when> block, so you won't get the error if the match fails,
+or if you use an explicit C<continue>.)
+
+=item Can't weaken a nonreference
+
+(F) You attempted to weaken something that was not a reference. Only
+references can be weakened.
+
+=item Can't x= to read-only value
+
+(F) You tried to repeat a constant value (often the undefined value)
+with an assignment operator, which implies modifying the value itself.
+Perhaps you need to copy the value to a temporary, and repeat that.
+
+=item Character in 'C' format wrapped in pack
+
+(W pack) You said
+
+ pack("C", $x)
+
+where $x is either less than 0 or more than 255; the C<"C"> format is
+only for encoding native operating system characters (ASCII, EBCDIC,
+and so on) and not for Unicode characters, so Perl behaved as if you meant
+
+ pack("C", $x & 255)
+
+If you actually want to pack Unicode codepoints, use the C<"U"> format
+instead.
+
+=item Character in 'W' format wrapped in pack
+
+(W pack) You said
+
+ pack("U0W", $x)
+
+where $x is either less than 0 or more than 255. However, C<U0>-mode expects
+all values to fall in the interval [0, 255], so Perl behaved as if you
+meant:
+
+ pack("U0W", $x & 255)
+
+=item Character in 'c' format wrapped in pack
+
+(W pack) You said
+
+ pack("c", $x)
+
+where $x is either less than -128 or more than 127; the C<"c"> format
+is only for encoding native operating system characters (ASCII, EBCDIC,
+and so on) and not for Unicode characters, so Perl behaved as if you meant
+
+ pack("c", $x & 255);
+
+If you actually want to pack Unicode codepoints, use the C<"U"> format
+instead.
+
+=item Character in '%c' format wrapped in unpack
+
+(W unpack) You tried something like
+
+ unpack("H", "\x{2a1}")
+
+where the format expects to process a byte (a character with a value
+below 256), but a higher value was provided instead. Perl uses the value
+modulus 256 instead, as if you had provided:
+
+ unpack("H", "\x{a1}")
+
+=item Character(s) in '%c' format wrapped in pack
+
+(W pack) You tried something like
+
+ pack("u", "\x{1f3}b")
+
+where the format expects to process a sequence of bytes (character with a
+value below 256), but some of the characters had a higher value. Perl
+uses the character values modulus 256 instead, as if you had provided:
+
+ pack("u", "\x{f3}b")
+
+=item Character(s) in '%c' format wrapped in unpack
+
+(W unpack) You tried something like
+
+ unpack("s", "\x{1f3}b")
+
+where the format expects to process a sequence of bytes (character with a
+value below 256), but some of the characters had a higher value. Perl
+uses the character values modulus 256 instead, as if you had provided:
+
+ unpack("s", "\x{f3}b")
+
+=item close() on unopened filehandle %s
+
+(W unopened) You tried to close a filehandle that was never opened.
+
+=item closedir() attempted on invalid dirhandle %s
+
+(W io) The dirhandle you tried to close is either closed or not really
+a dirhandle. Check your control flow.
+
+=item Code missing after '/'
+
+(F) You had a (sub-)template that ends with a '/'. There must be another
+template code following the slash. See L<perlfunc/pack>.
+
+=item %s: Command not found
+
+(A) You've accidentally run your script through B<csh> instead of Perl.
+Check the #! line, or manually feed your script into Perl yourself.
+
+=item Compilation failed in require
+
+(F) Perl could not compile a file specified in a C<require> statement.
+Perl uses this generic message when none of the errors that it
+encountered were severe enough to halt compilation immediately.
+
+=item Complex regular subexpression recursion limit (%d) exceeded
+
+(W regexp) The regular expression engine uses recursion in complex
+situations where back-tracking is required. Recursion depth is limited
+to 32766, or perhaps less in architectures where the stack cannot grow
+arbitrarily. ("Simple" and "medium" situations are handled without
+recursion and are not subject to a limit.) Try shortening the string
+under examination; looping in Perl code (e.g. with C<while>) rather than
+in the regular expression engine; or rewriting the regular expression so
+that it is simpler or backtracks less. (See L<perlfaq2> for information
+on I<Mastering Regular Expressions>.)
+
+=item cond_broadcast() called on unlocked variable
+
+(W threads) Within a thread-enabled program, you tried to call
+cond_broadcast() on a variable which wasn't locked. The cond_broadcast()
+function is used to wake up another thread that is waiting in a
+cond_wait(). To ensure that the signal isn't sent before the other thread
+has a chance to enter the wait, it is usual for the signaling thread to
+first wait for a lock on variable. This lock attempt will only succeed
+after the other thread has entered cond_wait() and thus relinquished the
+lock.
+
+=item cond_signal() called on unlocked variable
+
+(W threads) Within a thread-enabled program, you tried to call
+cond_signal() on a variable which wasn't locked. The cond_signal()
+function is used to wake up another thread that is waiting in a
+cond_wait(). To ensure that the signal isn't sent before the other thread
+has a chance to enter the wait, it is usual for the signaling thread to
+first wait for a lock on variable. This lock attempt will only succeed
+after the other thread has entered cond_wait() and thus relinquished the
+lock.
+
+=item connect() on closed socket %s
+
+(W closed) You tried to do a connect on a closed socket. Did you forget
+to check the return value of your socket() call? See
+L<perlfunc/connect>.
+
+=item Constant(%s)%s: %s
+
+(F) The parser found inconsistencies either while attempting to define
+an overloaded constant, or when trying to find the character name
+specified in the C<\N{...}> escape. Perhaps you forgot to load the
+corresponding C<overload> or C<charnames> pragma? See L<charnames> and
+L<overload>.
+
+=item Constant(%s)%s: %s in regex; marked by <-- HERE in m/%s/
+
+(F) The parser found inconsistencies while attempting to find
+the character name specified in the C<\N{...}> escape. Perhaps you
+forgot to load the corresponding C<charnames> pragma?
+See L<charnames>.
+
+
+=item Constant is not %s reference
+
+(F) A constant value (perhaps declared using the C<use constant> pragma)
+is being dereferenced, but it amounts to the wrong type of reference.
+The message indicates the type of reference that was expected. This
+usually indicates a syntax error in dereferencing the constant value.
+See L<perlsub/"Constant Functions"> and L<constant>.
+
+=item Constant subroutine %s redefined
+
+(S) You redefined a subroutine which had previously been
+eligible for inlining. See L<perlsub/"Constant Functions"> for
+commentary and workarounds.
+
+=item Constant subroutine %s undefined
+
+(W misc) You undefined a subroutine which had previously been eligible
+for inlining. See L<perlsub/"Constant Functions"> for commentary and
+workarounds.
+
+=item Copy method did not return a reference
+
+(F) The method which overloads "=" is buggy. See
+L<overload/Copy Constructor>.
+
+=item CORE::%s is not a keyword
+
+(F) The CORE:: namespace is reserved for Perl keywords.
+
+=item corrupted regexp pointers
+
+(P) The regular expression engine got confused by what the regular
+expression compiler gave it.
+
+=item corrupted regexp program
+
+(P) The regular expression engine got passed a regexp program without a
+valid magic number.
+
+=item Corrupt malloc ptr 0x%lx at 0x%lx
+
+(P) The malloc package that comes with Perl had an internal failure.
+
+=item Count after length/code in unpack
+
+(F) You had an unpack template indicating a counted-length string, but
+you have also specified an explicit size for the string. See
+L<perlfunc/pack>.
+
+=item Deep recursion on subroutine "%s"
+
+(W recursion) This subroutine has called itself (directly or indirectly)
+100 times more than it has returned. This probably indicates an
+infinite recursion, unless you're writing strange benchmark programs, in
+which case it indicates something else.
+
+This threshold can be changed from 100, by recompiling the F<perl> binary,
+setting the C pre-processor macro C<PERL_SUB_DEPTH_WARN> to the desired value.
+
+=item defined(@array) is deprecated
+
+(D deprecated) defined() is not usually useful on arrays because it
+checks for an undefined I<scalar> value. If you want to see if the
+array is empty, just use C<if (@array) { # not empty }> for example.
+
+=item defined(%hash) is deprecated
+
+(D deprecated) defined() is not usually useful on hashes because it
+checks for an undefined I<scalar> value. If you want to see if the hash
+is empty, just use C<if (%hash) { # not empty }> for example.
+
+=item %s defines neither package nor VERSION--version check failed
+
+(F) You said something like "use Module 42" but in the Module file
+there are neither package declarations nor a C<$VERSION>.
+
+=item Delimiter for here document is too long
+
+(F) In a here document construct like C<<<FOO>, the label C<FOO> is too
+long for Perl to handle. You have to be seriously twisted to write code
+that triggers this error.
+
+=item Deprecated use of my() in false conditional
+
+(D deprecated) You used a declaration similar to C<my $x if 0>.
+There has been a long-standing bug in Perl that causes a lexical variable
+not to be cleared at scope exit when its declaration includes a false
+conditional. Some people have exploited this bug to achieve a kind of
+static variable. Since we intend to fix this bug, we don't want people
+relying on this behavior. You can achieve a similar static effect by
+declaring the variable in a separate block outside the function, eg
+
+ sub f { my $x if 0; return $x++ }
+
+becomes
+
+ { my $x; sub f { return $x++ } }
+
+Beginning with perl 5.9.4, you can also use C<state> variables to
+have lexicals that are initialized only once (see L<feature>):
+
+ sub f { state $x; return $x++ }
+
+=item DESTROY created new reference to dead object '%s'
+
+(F) A DESTROY() method created a new reference to the object which is
+just being DESTROYed. Perl is confused, and prefers to abort rather than
+to create a dangling reference.
+
+=item Did not produce a valid header
+
+See Server error.
+
+=item %s did not return a true value
+
+(F) A required (or used) file must return a true value to indicate that
+it compiled correctly and ran its initialization code correctly. It's
+traditional to end such a file with a "1;", though any true value would
+do. See L<perlfunc/require>.
+
+=item (Did you mean &%s instead?)
+
+(W) You probably referred to an imported subroutine &FOO as $FOO or some
+such.
+
+=item (Did you mean "local" instead of "our"?)
+
+(W misc) Remember that "our" does not localize the declared global
+variable. You have declared it again in the same lexical scope, which
+seems superfluous.
+
+=item (Did you mean $ or @ instead of %?)
+
+(W) You probably said %hash{$key} when you meant $hash{$key} or
+@hash{@keys}. On the other hand, maybe you just meant %hash and got
+carried away.
+
+=item Died
+
+(F) You passed die() an empty string (the equivalent of C<die "">) or
+you called it with no args and both C<$@> and C<$_> were empty.
+
+=item Document contains no data
+
+See Server error.
+
+=item %s does not define %s::VERSION--version check failed
+
+(F) You said something like "use Module 42" but the Module did not
+define a C<$VERSION.>
+
+=item '/' does not take a repeat count
+
+(F) You cannot put a repeat count of any kind right after the '/' code.
+See L<perlfunc/pack>.
+
+=item Don't know how to handle magic of type '%s'
+
+(P) The internal handling of magical variables has been cursed.
+
+=item do_study: out of memory
+
+(P) This should have been caught by safemalloc() instead.
+
+=item (Do you need to predeclare %s?)
+
+(S syntax) This is an educated guess made in conjunction with the message
+"%s found where operator expected". It often means a subroutine or module
+name is being referenced that hasn't been declared yet. This may be
+because of ordering problems in your file, or because of a missing
+"sub", "package", "require", or "use" statement. If you're referencing
+something that isn't defined yet, you don't actually have to define the
+subroutine or package before the current location. You can use an empty
+"sub foo;" or "package FOO;" to enter a "forward" declaration.
+
+=item dump() better written as CORE::dump()
+
+(W misc) You used the obsolescent C<dump()> built-in function, without fully
+qualifying it as C<CORE::dump()>. Maybe it's a typo. See L<perlfunc/dump>.
+
+=item dump is not supported
+
+(F) Your machine doesn't support dump/undump.
+
+=item Duplicate free() ignored
+
+(S malloc) An internal routine called free() on something that had
+already been freed.
+
+=item Duplicate modifier '%c' after '%c' in %s
+
+(W) You have applied the same modifier more than once after a type
+in a pack template. See L<perlfunc/pack>.
+
+=item elseif should be elsif
+
+(S syntax) There is no keyword "elseif" in Perl because Larry thinks it's
+ugly. Your code will be interpreted as an attempt to call a method named
+"elseif" for the class returned by the following block. This is
+unlikely to be what you want.
+
+=item Empty %s
+
+(F) C<\p> and C<\P> are used to introduce a named Unicode property, as
+described in L<perlunicode> and L<perlre>. You used C<\p> or C<\P> in
+a regular expression without specifying the property name.
+
+=item entering effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item %ENV is aliased to %s
+
+(F) You're running under taint mode, and the C<%ENV> variable has been
+aliased to another hash, so it doesn't reflect anymore the state of the
+program's environment. This is potentially insecure.
+
+=item Error converting file specification %s
+
+(F) An error peculiar to VMS. Because Perl may have to deal with file
+specifications in either VMS or Unix syntax, it converts them to a
+single form when it must operate on them directly. Either you've passed
+an invalid file specification to Perl, or you've found a case the
+conversion routines don't handle. Drat.
+
+=item %s: Eval-group in insecure regular expression
+
+(F) Perl detected tainted data when trying to compile a regular
+expression that contains the C<(?{ ... })> zero-width assertion, which
+is unsafe. See L<perlre/(?{ code })>, and L<perlsec>.
+
+=item %s: Eval-group not allowed at runtime, use re 'eval'
+
+(F) Perl tried to compile a regular expression containing the
+C<(?{ ... })> zero-width assertion at run time, as it would when the
+pattern contains interpolated values. Since that is a security risk, it
+is not allowed. If you insist, you may still do this by explicitly
+building the pattern from an interpolated string at run time and using
+that in an eval(). See L<perlre/(?{ code })>.
+
+=item %s: Eval-group not allowed, use re 'eval'
+
+(F) A regular expression contained the C<(?{ ... })> zero-width
+assertion, but that construct is only allowed when the C<use re 'eval'>
+pragma is in effect. See L<perlre/(?{ code })>.
+
+=item EVAL without pos change exceeded limit in regex; marked by <-- HERE in m/%s/
+
+(F) You used a pattern that nested too many EVAL calls without consuming
+any text. Restructure the pattern so that text is consumed.
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item Excessively long <> operator
+
+(F) The contents of a <> operator may not exceed the maximum size of a
+Perl identifier. If you're just trying to glob a long list of
+filenames, try using the glob() operator, or put the filenames into a
+variable and glob that.
+
+=item exec? I'm not *that* kind of operating system
+
+(F) The C<exec> function is not implemented in MacPerl. See L<perlport>.
+
+=item Execution of %s aborted due to compilation errors
+
+(F) The final summary message when a Perl compilation fails.
+
+=item Exiting eval via %s
+
+(W exiting) You are exiting an eval by unconventional means, such as a
+goto, or a loop control statement.
+
+=item Exiting format via %s
+
+(W exiting) You are exiting a format by unconventional means, such as a
+goto, or a loop control statement.
+
+=item Exiting pseudo-block via %s
+
+(W exiting) You are exiting a rather special block construct (like a
+sort block or subroutine) by unconventional means, such as a goto, or a
+loop control statement. See L<perlfunc/sort>.
+
+=item Exiting subroutine via %s
+
+(W exiting) You are exiting a subroutine by unconventional means, such
+as a goto, or a loop control statement.
+
+=item Exiting substitution via %s
+
+(W exiting) You are exiting a substitution by unconventional means, such
+as a return, a goto, or a loop control statement.
+
+=item Explicit blessing to '' (assuming package main)
+
+(W misc) You are blessing a reference to a zero length string. This has
+the effect of blessing the reference into the package main. This is
+usually not what you want. Consider providing a default target package,
+e.g. bless($ref, $p || 'MyPackage');
+
+=item %s: Expression syntax
+
+(A) You've accidentally run your script through B<csh> instead of Perl.
+Check the #! line, or manually feed your script into Perl yourself.
+
+=item %s failed--call queue aborted
+
+(F) An untrapped exception was raised while executing a UNITCHECK,
+CHECK, INIT, or END subroutine. Processing of the remainder of the
+queue of such routines has been prematurely ended.
+
+=item False [] range "%s" in regex; marked by <-- HERE in m/%s/
+
+(W regexp) A character class range must start and end at a literal
+character, not another character class like C<\d> or C<[:alpha:]>. The "-"
+in your false range is interpreted as a literal "-". Consider quoting the
+"-", "\-". The <-- HERE shows in the regular expression about where the
+problem was discovered. See L<perlre>.
+
+=item Fatal VMS error at %s, line %d
+
+(P) An error peculiar to VMS. Something untoward happened in a VMS
+system service or RTL routine; Perl's exit status should provide more
+details. The filename in "at %s" and the line number in "line %d" tell
+you which section of the Perl source code is distressed.
+
+=item fcntl is not implemented
+
+(F) Your machine apparently doesn't implement fcntl(). What is this, a
+PDP-11 or something?
+
+=item FETCHSIZE returned a negative value
+
+(F) A tied array claimed to have a negative number of elements, which
+is not possible.
+
+=item Field too wide in 'u' format in pack
+
+(W pack) Each line in an uuencoded string start with a length indicator
+which can't encode values above 63. So there is no point in asking for
+a line length bigger than that. Perl will behave as if you specified
+C<u63> as format.
+
+=item Filehandle %s opened only for input
+
+(W io) You tried to write on a read-only filehandle. If you intended
+it to be a read-write filehandle, you needed to open it with "+<" or
+"+>" or "+>>" instead of with "<" or nothing. If you intended only to
+write the file, use ">" or ">>". See L<perlfunc/open>.
+
+=item Filehandle %s opened only for output
+
+(W io) You tried to read from a filehandle opened only for writing, If
+you intended it to be a read/write filehandle, you needed to open it
+with "+<" or "+>" or "+>>" instead of with "<" or nothing. If you
+intended only to read from the file, use "<". See L<perlfunc/open>.
+Another possibility is that you attempted to open filedescriptor 0
+(also known as STDIN) for output (maybe you closed STDIN earlier?).
+
+=item Filehandle %s reopened as %s only for input
+
+(W io) You opened for reading a filehandle that got the same filehandle id
+as STDOUT or STDERR. This occurred because you closed STDOUT or STDERR
+previously.
+
+=item Filehandle STDIN reopened as %s only for output
+
+(W io) You opened for writing a filehandle that got the same filehandle id
+as STDIN. This occurred because you closed STDIN previously.
+
+=item Final $ should be \$ or $name
+
+(F) You must now decide whether the final $ in a string was meant to be
+a literal dollar sign, or was meant to introduce a variable name that
+happens to be missing. So you have to put either the backslash or the
+name.
+
+=item flock() on closed filehandle %s
+
+(W closed) The filehandle you're attempting to flock() got itself closed
+some time before now. Check your control flow. flock() operates on
+filehandles. Are you attempting to call flock() on a dirhandle by the
+same name?
+
+=item Format not terminated
+
+(F) A format must be terminated by a line with a solitary dot. Perl got
+to the end of your file without finding such a line.
+
+=item Format %s redefined
+
+(W redefine) You redefined a format. To suppress this warning, say
+
+ {
+ no warnings 'redefine';
+ eval "format NAME =...";
+ }
+
+=item Found = in conditional, should be ==
+
+(W syntax) You said
+
+ if ($foo = 123)
+
+when you meant
+
+ if ($foo == 123)
+
+(or something like that).
+
+=item %s found where operator expected
+
+(S syntax) The Perl lexer knows whether to expect a term or an operator.
+If it sees what it knows to be a term when it was expecting to see an
+operator, it gives you this warning. Usually it indicates that an
+operator or delimiter was omitted, such as a semicolon.
+
+=item gdbm store returned %d, errno %d, key "%s"
+
+(S) A warning from the GDBM_File extension that a store failed.
+
+=item gethostent not implemented
+
+(F) Your C library apparently doesn't implement gethostent(), probably
+because if it did, it'd feel morally obligated to return every hostname
+on the Internet.
+
+=item get%sname() on closed socket %s
+
+(W closed) You tried to get a socket or peer socket name on a closed
+socket. Did you forget to check the return value of your socket() call?
+
+=item getpwnam returned invalid UIC %#o for user "%s"
+
+(S) A warning peculiar to VMS. The call to C<sys$getuai> underlying the
+C<getpwnam> operator returned an invalid UIC.
+
+=item getsockopt() on closed socket %s
+
+(W closed) You tried to get a socket option on a closed socket. Did you
+forget to check the return value of your socket() call? See
+L<perlfunc/getsockopt>.
+
+=item Global symbol "%s" requires explicit package name
+
+(F) You've said "use strict" or "use strict vars", which indicates
+that all variables must either be lexically scoped (using "my" or "state"),
+declared beforehand using "our", or explicitly qualified to say
+which package the global variable is in (using "::").
+
+=item glob failed (%s)
+
+(W glob) Something went wrong with the external program(s) used for
+C<glob> and C<< <*.c> >>. Usually, this means that you supplied a
+C<glob> pattern that caused the external program to fail and exit with a
+nonzero status. If the message indicates that the abnormal exit
+resulted in a coredump, this may also mean that your csh (C shell) is
+broken. If so, you should change all of the csh-related variables in
+config.sh: If you have tcsh, make the variables refer to it as if it
+were csh (e.g. C<full_csh='/usr/bin/tcsh'>); otherwise, make them all
+empty (except that C<d_csh> should be C<'undef'>) so that Perl will
+think csh is missing. In either case, after editing config.sh, run
+C<./Configure -S> and rebuild Perl.
+
+=item Glob not terminated
+
+(F) The lexer saw a left angle bracket in a place where it was expecting
+a term, so it's looking for the corresponding right angle bracket, and
+not finding it. Chances are you left some needed parentheses out
+earlier in the line, and you really meant a "less than".
+
+=item Got an error from DosAllocMem
+
+(P) An error peculiar to OS/2. Most probably you're using an obsolete
+version of Perl, and this should not happen anyway.
+
+=item goto must have label
+
+(F) Unlike with "next" or "last", you're not allowed to goto an
+unspecified destination. See L<perlfunc/goto>.
+
+=item ()-group starts with a count
+
+(F) A ()-group started with a count. A count is
+supposed to follow something: a template character or a ()-group.
+ See L<perlfunc/pack>.
+
+=item %s had compilation errors
+
+(F) The final summary message when a C<perl -c> fails.
+
+=item Had to create %s unexpectedly
+
+(S internal) A routine asked for a symbol from a symbol table that ought
+to have existed already, but for some reason it didn't, and had to be
+created on an emergency basis to prevent a core dump.
+
+=item Hash %%s missing the % in argument %d of %s()
+
+(D deprecated) Really old Perl let you omit the % on hash names in some
+spots. This is now heavily deprecated.
+
+=item %s has too many errors
+
+(F) The parser has given up trying to parse the program after 10 errors.
+Further error messages would likely be uninformative.
+
+=item Hexadecimal number > 0xffffffff non-portable
+
+(W portable) The hexadecimal number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems. See
+L<perlport> for more on portability concerns.
+
+=item Identifier too long
+
+(F) Perl limits identifiers (names for variables, functions, etc.) to
+about 250 characters for simple names, and somewhat more for compound
+names (like C<$A::B>). You've exceeded Perl's limits. Future versions
+of Perl are likely to eliminate these arbitrary limitations.
+
+=item Ignoring %s in character class in regex; marked by <-- HERE in m/%s/
+
+(W) Named Unicode character escapes (\N{...}) may return multi-char
+or zero length sequences. When such an escape is used in a character class
+its behaviour is not well defined. Check that the correct escape has
+been used, and the correct charname handler is in scope.
+
+=item Illegal binary digit %s
+
+(F) You used a digit other than 0 or 1 in a binary number.
+
+=item Illegal binary digit %s ignored
+
+(W digit) You may have tried to use a digit other than 0 or 1 in a
+binary number. Interpretation of the binary number stopped before the
+offending digit.
+
+=item Illegal character %s (carriage return)
+
+(F) Perl normally treats carriage returns in the program text as it
+would any other whitespace, which means you should never see this error
+when Perl was built using standard options. For some reason, your
+version of Perl appears to have been built without this support. Talk
+to your Perl administrator.
+
+=item Illegal character in prototype for %s : %s
+
+(W syntax) An illegal character was found in a prototype declaration. Legal
+characters in prototypes are $, @, %, *, ;, [, ], &, and \.
+
+=item Illegal declaration of anonymous subroutine
+
+(F) When using the C<sub> keyword to construct an anonymous subroutine,
+you must always specify a block of code. See L<perlsub>.
+
+=item Illegal declaration of subroutine %s
+
+(F) A subroutine was not declared correctly. See L<perlsub>.
+
+=item Illegal division by zero
+
+(F) You tried to divide a number by 0. Either something was wrong in
+your logic, or you need to put a conditional in to guard against
+meaningless input.
+
+=item Illegal hexadecimal digit %s ignored
+
+(W digit) You may have tried to use a character other than 0 - 9 or
+A - F, a - f in a hexadecimal number. Interpretation of the hexadecimal
+number stopped before the illegal character.
+
+=item Illegal modulus zero
+
+(F) You tried to divide a number by 0 to get the remainder. Most
+numbers don't take to this kindly.
+
+=item Illegal number of bits in vec
+
+(F) The number of bits in vec() (the third argument) must be a power of
+two from 1 to 32 (or 64, if your platform supports that).
+
+=item Illegal octal digit %s
+
+(F) You used an 8 or 9 in an octal number.
+
+=item Illegal octal digit %s ignored
+
+(W digit) You may have tried to use an 8 or 9 in an octal number.
+Interpretation of the octal number stopped before the 8 or 9.
+
+=item Illegal switch in PERL5OPT: %s
+
+(X) The PERL5OPT environment variable may only be used to set the
+following switches: B<-[CDIMUdmtw]>.
+
+=item Ill-formed CRTL environ value "%s"
+
+(W internal) A warning peculiar to VMS. Perl tried to read the CRTL's
+internal environ array, and encountered an element without the C<=>
+delimiter used to separate keys from values. The element is ignored.
+
+=item Ill-formed message in prime_env_iter: |%s|
+
+(W internal) A warning peculiar to VMS. Perl tried to read a logical
+name or CLI symbol definition when preparing to iterate over %ENV, and
+didn't see the expected delimiter between key and value, so the line was
+ignored.
+
+=item (in cleanup) %s
+
+(W misc) This prefix usually indicates that a DESTROY() method raised
+the indicated exception. Since destructors are usually called by the
+system at arbitrary points during execution, and often a vast number of
+times, the warning is issued only once for any number of failures that
+would otherwise result in the same message being repeated.
+
+Failure of user callbacks dispatched using the C<G_KEEPERR> flag could
+also result in this warning. See L<perlcall/G_KEEPERR>.
+
+=item Inconsistent hierarchy during C3 merge of class '%s': merging failed on parent '%s'
+
+(F) The method resolution order (MRO) of the given class is not
+C3-consistent, and you have enabled the C3 MRO for this class. See the C3
+documentation in L<mro> for more information.
+
+=item In EBCDIC the v-string components cannot exceed 2147483647
+
+(F) An error peculiar to EBCDIC. Internally, v-strings are stored as
+Unicode code points, and encoded in EBCDIC as UTF-EBCDIC. The UTF-EBCDIC
+encoding is limited to code points no larger than 2147483647 (0x7FFFFFFF).
+
+=item Infinite recursion in regex; marked by <-- HERE in m/%s/
+
+(F) You used a pattern that references itself without consuming any input
+text. You should check the pattern to ensure that recursive patterns
+either consume text or fail.
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item Initialization of state variables in list context currently forbidden
+
+(F) Currently the implementation of "state" only permits the initialization
+of scalar variables in scalar context. Re-write C<state ($a) = 42> as
+C<state $a = 42> to change from list to scalar context. Constructions such
+as C<state (@a) = foo()> will be supported in a future perl release.
+
+=item Insecure dependency in %s
+
+(F) You tried to do something that the tainting mechanism didn't like.
+The tainting mechanism is turned on when you're running setuid or
+setgid, or when you specify B<-T> to turn it on explicitly. The
+tainting mechanism labels all data that's derived directly or indirectly
+from the user, who is considered to be unworthy of your trust. If any
+such data is used in a "dangerous" operation, you get this error. See
+L<perlsec> for more information.
+
+=item Insecure directory in %s
+
+(F) You can't use system(), exec(), or a piped open in a setuid or
+setgid script if C<$ENV{PATH}> contains a directory that is writable by
+the world. Also, the PATH must not contain any relative directory.
+See L<perlsec>.
+
+=item Insecure $ENV{%s} while running %s
+
+(F) You can't use system(), exec(), or a piped open in a setuid or
+setgid script if any of C<$ENV{PATH}>, C<$ENV{IFS}>, C<$ENV{CDPATH}>,
+C<$ENV{ENV}>, C<$ENV{BASH_ENV}> or C<$ENV{TERM}> are derived from data
+supplied (or potentially supplied) by the user. The script must set
+the path to a known value, using trustworthy data. See L<perlsec>.
+
+=item Integer overflow in %s number
+
+(W overflow) The hexadecimal, octal or binary number you have specified
+either as a literal or as an argument to hex() or oct() is too big for
+your architecture, and has been converted to a floating point number.
+On a 32-bit architecture the largest hexadecimal, octal or binary number
+representable without overflow is 0xFFFFFFFF, 037777777777, or
+0b11111111111111111111111111111111 respectively. Note that Perl
+transparently promotes all numbers to a floating point representation
+internally--subject to loss of precision errors in subsequent
+operations.
+
+=item Integer overflow in format string for %s
+
+(F) The indexes and widths specified in the format string of C<printf()>
+or C<sprintf()> are too large. The numbers must not overflow the size of
+integers for your architecture.
+
+=item Integer overflow in version
+
+(F) Some portion of a version initialization is too large for the
+size of integers for your architecture. This is not a warning
+because there is no rational reason for a version to try and use a
+element larger than typically 2**32. This is usually caused by
+trying to use some odd mathematical operation as a version, like
+100/9.
+
+=item Internal disaster in regex; marked by <-- HERE in m/%s/
+
+(P) Something went badly wrong in the regular expression parser.
+The <-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item Internal inconsistency in tracking vforks
+
+(S) A warning peculiar to VMS. Perl keeps track of the number of times
+you've called C<fork> and C<exec>, to determine whether the current call
+to C<exec> should affect the current script or a subprocess (see
+L<perlvms/"exec LIST">). Somehow, this count has become scrambled, so
+Perl is making a guess and treating this C<exec> as a request to
+terminate the Perl script and execute the specified command.
+
+=item Internal urp in regex; marked by <-- HERE in m/%s/
+
+(P) Something went badly awry in the regular expression parser. The
+<-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item %s (...) interpreted as function
+
+(W syntax) You've run afoul of the rule that says that any list operator
+followed by parentheses turns into a function, with all the list
+operators arguments found inside the parentheses. See
+L<perlop/Terms and List Operators (Leftward)>.
+
+=item Invalid %s attribute: %s
+
+The indicated attribute for a subroutine or variable was not recognized
+by Perl or by a user-supplied handler. See L<attributes>.
+
+=item Invalid %s attributes: %s
+
+The indicated attributes for a subroutine or variable were not
+recognized by Perl or by a user-supplied handler. See L<attributes>.
+
+=item Invalid conversion in %s: "%s"
+
+(W printf) Perl does not understand the given format conversion. See
+L<perlfunc/sprintf>.
+
+=item Invalid escape in the specified encoding in regex; marked by <-- HERE in m/%s/
+
+(W regexp) The numeric escape (for example C<\xHH>) of value < 256
+didn't correspond to a single character through the conversion
+from the encoding specified by the encoding pragma.
+The escape was replaced with REPLACEMENT CHARACTER (U+FFFD) instead.
+The <-- HERE shows in the regular expression about where the
+escape was discovered.
+
+=item Invalid mro name: '%s'
+
+(F) You tried to C<mro::set_mro("classname", "foo")>
+or C<use mro 'foo'>, where C<foo> is not a valid method resolution order (MRO).
+(Currently, the only valid ones are C<dfs> and C<c3>). See L<mro>.
+
+=item Invalid [] range "%s" in regex; marked by <-- HERE in m/%s/
+
+(F) The range specified in a character class had a minimum character
+greater than the maximum character. One possibility is that you forgot the
+C<{}> from your ending C<\x{}> - C<\x> without the curly braces can go only
+up to C<ff>. The <-- HERE shows in the regular expression about where the
+problem was discovered. See L<perlre>.
+
+=item Invalid range "%s" in transliteration operator
+
+(F) The range specified in the tr/// or y/// operator had a minimum
+character greater than the maximum character. See L<perlop>.
+
+=item Invalid separator character %s in attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of an attribute list. If the previous attribute had a
+parenthesised parameter list, perhaps that list was terminated too soon.
+See L<attributes>.
+
+=item Invalid separator character %s in PerlIO layer specification %s
+
+(W layer) When pushing layers onto the Perl I/O system, something other than a
+colon or whitespace was seen between the elements of a layer list.
+If the previous attribute had a parenthesised parameter list, perhaps that
+list was terminated too soon.
+
+=item Invalid type '%s' in %s
+
+(F) The given character is not a valid pack or unpack type.
+See L<perlfunc/pack>.
+(W) The given character is not a valid pack or unpack type but used to be
+silently ignored.
+
+=item Invalid version format (multiple underscores)
+
+(F) Versions may contain at most a single underscore, which signals
+that the version is a beta release. See L<version> for the allowed
+version formats.
+
+=item Invalid version format (underscores before decimal)
+
+(F) Versions may not contain decimals after the optional underscore.
+See L<version> for the allowed version formats.
+
+=item ioctl is not implemented
+
+(F) Your machine apparently doesn't implement ioctl(), which is pretty
+strange for a machine that supports C.
+
+=item ioctl() on unopened %s
+
+(W unopened) You tried ioctl() on a filehandle that was never opened.
+Check you control flow and number of arguments.
+
+=item IO layers (like "%s") unavailable
+
+(F) Your Perl has not been configured to have PerlIO, and therefore
+you cannot use IO layers. To have PerlIO Perl must be configured
+with 'useperlio'.
+
+=item IO::Socket::atmark not implemented on this architecture
+
+(F) Your machine doesn't implement the sockatmark() functionality,
+neither as a system call or an ioctl call (SIOCATMARK).
+
+=item $* is no longer supported
+
+(S deprecated, syntax) The special variable C<$*>, deprecated in older perls, has
+been removed as of 5.9.0 and is no longer supported. In previous versions of perl the use of
+C<$*> enabled or disabled multi-line matching within a string.
+
+Instead of using C<$*> you should use the C</m> (and maybe C</s>) regexp
+modifiers. (In older versions: when C<$*> was set to a true value then all regular
+expressions behaved as if they were written using C</m>.)
+
+=item $# is no longer supported
+
+(S deprecated, syntax) The special variable C<$#>, deprecated in older perls, has
+been removed as of 5.9.3 and is no longer supported. You should use the
+printf/sprintf functions instead.
+
+=item `%s' is not a code reference
+
+(W overload) The second (fourth, sixth, ...) argument of overload::constant
+needs to be a code reference. Either an anonymous subroutine, or a reference
+to a subroutine.
+
+=item `%s' is not an overloadable type
+
+(W overload) You tried to overload a constant type the overload package is
+unaware of.
+
+=item junk on end of regexp
+
+(P) The regular expression parser is confused.
+
+=item Label not found for "last %s"
+
+(F) You named a loop to break out of, but you're not currently in a loop
+of that name, not even if you count where you were called from. See
+L<perlfunc/last>.
+
+=item Label not found for "next %s"
+
+(F) You named a loop to continue, but you're not currently in a loop of
+that name, not even if you count where you were called from. See
+L<perlfunc/last>.
+
+=item Label not found for "redo %s"
+
+(F) You named a loop to restart, but you're not currently in a loop of
+that name, not even if you count where you were called from. See
+L<perlfunc/last>.
+
+=item leaving effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item length/code after end of string in unpack
+
+(F) While unpacking, the string buffer was already used up when an unpack
+length/code combination tried to obtain more data. This results in
+an undefined value for the length. See L<perlfunc/pack>.
+
+=item listen() on closed socket %s
+
+(W closed) You tried to do a listen on a closed socket. Did you forget
+to check the return value of your socket() call? See
+L<perlfunc/listen>.
+
+=item Lookbehind longer than %d not implemented in regex m/%s/
+
+(F) There is currently a limit on the length of string which lookbehind can
+handle. This restriction may be eased in a future release.
+
+=item lstat() on filehandle %s
+
+(W io) You tried to do an lstat on a filehandle. What did you mean
+by that? lstat() makes sense only on filenames. (Perl did a fstat()
+instead on the filehandle.)
+
+=item Lvalue subs returning %s not implemented yet
+
+(F) Due to limitations in the current implementation, array and hash
+values cannot be returned in subroutines used in lvalue context. See
+L<perlsub/"Lvalue subroutines">.
+
+=item Malformed integer in [] in pack
+
+(F) Between the brackets enclosing a numeric repeat count only digits
+are permitted. See L<perlfunc/pack>.
+
+=item Malformed integer in [] in unpack
+
+(F) Between the brackets enclosing a numeric repeat count only digits
+are permitted. See L<perlfunc/pack>.
+
+=item Malformed PERLLIB_PREFIX
+
+(F) An error peculiar to OS/2. PERLLIB_PREFIX should be of the form
+
+ prefix1;prefix2
+
+or
+ prefix1 prefix2
+
+with nonempty prefix1 and prefix2. If C<prefix1> is indeed a prefix of
+a builtin library search path, prefix2 is substituted. The error may
+appear if components are not found, or are too long. See
+"PERLLIB_PREFIX" in L<perlos2>.
+
+=item Malformed prototype for %s: %s
+
+(F) You tried to use a function with a malformed prototype. The
+syntax of function prototypes is given a brief compile-time check for
+obvious errors like invalid characters. A more rigorous check is run
+when the function is called.
+
+=item Malformed UTF-8 character (%s)
+
+(S utf8) (F) Perl detected a string that didn't comply with UTF-8
+encoding rules, even though it had the UTF8 flag on.
+
+One possible cause is that you set the UTF8 flag yourself for data that
+you thought to be in UTF-8 but it wasn't (it was for example legacy
+8-bit data). To guard against this, you can use Encode::decode_utf8.
+
+If you use the C<:encoding(UTF-8)> PerlIO layer for input, invalid byte
+sequences are handled gracefully, but if you use C<:utf8>, the flag is
+set without validating the data, possibly resulting in this error
+message.
+
+See also L<Encode/"Handling Malformed Data">.
+
+=item Malformed UTF-16 surrogate
+
+Perl thought it was reading UTF-16 encoded character data but while
+doing it Perl met a malformed Unicode surrogate.
+
+=item Malformed UTF-8 string in pack
+
+(F) You tried to pack something that didn't comply with UTF-8 encoding
+rules and perl was unable to guess how to make more progress.
+
+=item Malformed UTF-8 string in unpack
+
+(F) You tried to unpack something that didn't comply with UTF-8 encoding
+rules and perl was unable to guess how to make more progress.
+
+=item Malformed UTF-8 string in '%c' format in unpack
+
+(F) You tried to unpack something that didn't comply with UTF-8 encoding
+rules and perl was unable to guess how to make more progress.
+
+=item Maximal count of pending signals (%s) exceeded
+
+(F) Perl aborted due to a too important number of signals pending. This
+usually indicates that your operating system tried to deliver signals
+too fast (with a very high priority), starving the perl process from
+resources it would need to reach a point where it can process signals
+safely. (See L<perlipc/"Deferred Signals (Safe Signals)">.)
+
+=item %s matches null string many times in regex; marked by <-- HERE in m/%s/
+
+(W regexp) The pattern you've specified would be an infinite loop if the
+regular expression engine didn't specifically check for that. The <-- HERE
+shows in the regular expression about where the problem was discovered.
+See L<perlre>.
+
+=item "%s" may clash with future reserved word
+
+(W) This warning may be due to running a perl5 script through a perl4
+interpreter, especially if the word that is being warned about is
+"use" or "my".
+
+=item % may not be used in pack
+
+(F) You can't pack a string by supplying a checksum, because the
+checksumming process loses information, and you can't go the other way.
+See L<perlfunc/unpack>.
+
+=item Method for operation %s not found in package %s during blessing
+
+(F) An attempt was made to specify an entry in an overloading table that
+doesn't resolve to a valid subroutine. See L<overload>.
+
+=item Method %s not permitted
+
+See Server error.
+
+=item Might be a runaway multi-line %s string starting on line %d
+
+(S) An advisory indicating that the previous error may have been caused
+by a missing delimiter on a string or pattern, because it eventually
+ended earlier on the current line.
+
+=item Misplaced _ in number
+
+(W syntax) An underscore (underbar) in a numeric constant did not
+separate two digits.
+
+=item Missing argument to -%c
+
+(F) The argument to the indicated command line switch must follow
+immediately after the switch, without intervening spaces.
+
+=item Missing %sbrace%s on \N{}
+
+(F) Wrong syntax of character name literal C<\N{charname}> within
+double-quotish context.
+
+=item Missing comma after first argument to %s function
+
+(F) While certain functions allow you to specify a filehandle or an
+"indirect object" before the argument list, this ain't one of them.
+
+=item Missing command in piped open
+
+(W pipe) You used the C<open(FH, "| command")> or
+C<open(FH, "command |")> construction, but the command was missing or
+blank.
+
+=item Missing control char name in \c
+
+(F) A double-quoted string ended with "\c", without the required control
+character name.
+
+=item Missing name in "my sub"
+
+(F) The reserved syntax for lexically scoped subroutines requires that
+they have a name with which they can be found.
+
+=item Missing $ on loop variable
+
+(F) Apparently you've been programming in B<csh> too much. Variables
+are always mentioned with the $ in Perl, unlike in the shells, where it
+can vary from one line to the next.
+
+=item (Missing operator before %s?)
+
+(S syntax) This is an educated guess made in conjunction with the message
+"%s found where operator expected". Often the missing operator is a comma.
+
+=item Missing right brace on %s
+
+(F) Missing right brace in C<\x{...}>, C<\p{...}> or C<\P{...}>.
+
+=item Missing right curly or square bracket
+
+(F) The lexer counted more opening curly or square brackets than closing
+ones. As a general rule, you'll find it's missing near the place you
+were last editing.
+
+=item (Missing semicolon on previous line?)
+
+(S syntax) This is an educated guess made in conjunction with the message
+"%s found where operator expected". Don't automatically put a semicolon on
+the previous line just because you saw this message.
+
+=item Modification of a read-only value attempted
+
+(F) You tried, directly or indirectly, to change the value of a
+constant. You didn't, of course, try "2 = 1", because the compiler
+catches that. But an easy way to do the same thing is:
+
+ sub mod { $_[0] = 1 }
+ mod(2);
+
+Another way is to assign to a substr() that's off the end of the string.
+
+Yet another way is to assign to a C<foreach> loop I<VAR> when I<VAR>
+is aliased to a constant in the look I<LIST>:
+
+ $x = 1;
+ foreach my $n ($x, 2) {
+ $n *= 2; # modifies the $x, but fails on attempt to modify the 2
+ }
+
+=item Modification of non-creatable array value attempted, %s
+
+(F) You tried to make an array value spring into existence, and the
+subscript was probably negative, even counting from end of the array
+backwards.
+
+=item Modification of non-creatable hash value attempted, %s
+
+(P) You tried to make a hash value spring into existence, and it
+couldn't be created for some peculiar reason.
+
+=item Module name must be constant
+
+(F) Only a bare module name is allowed as the first argument to a "use".
+
+=item Module name required with -%c option
+
+(F) The C<-M> or C<-m> options say that Perl should load some module, but
+you omitted the name of the module. Consult L<perlrun> for full details
+about C<-M> and C<-m>.
+
+=item More than one argument to open
+
+(F) The C<open> function has been asked to open multiple files. This
+can happen if you are trying to open a pipe to a command that takes a
+list of arguments, but have forgotten to specify a piped open mode.
+See L<perlfunc/open> for details.
+
+=item msg%s not implemented
+
+(F) You don't have System V message IPC on your system.
+
+=item Multidimensional syntax %s not supported
+
+(W syntax) Multidimensional arrays aren't written like C<$foo[1,2,3]>.
+They're written like C<$foo[1][2][3]>, as in C.
+
+=item '/' must follow a numeric type in unpack
+
+(F) You had an unpack template that contained a '/', but this did not
+follow some unpack specification producing a numeric value.
+See L<perlfunc/pack>.
+
+=item "my sub" not yet implemented
+
+(F) Lexically scoped subroutines are not yet implemented. Don't try
+that yet.
+
+=item "%s" variable %s can't be in a package
+
+(F) Lexically scoped variables aren't in a package, so it doesn't make
+sense to try to declare one with a package qualifier on the front. Use
+local() if you want to localize a package variable.
+
+=item Name "%s::%s" used only once: possible typo
+
+(W once) Typographical errors often show up as unique variable names.
+If you had a good reason for having a unique name, then just mention it
+again somehow to suppress the message. The C<our> declaration is
+provided for this purpose.
+
+NOTE: This warning detects symbols that have been used only once so $c, @c,
+%c, *c, &c, sub c{}, c(), and c (the filehandle or format) are considered
+the same; if a program uses $c only once but also uses any of the others it
+will not trigger this warning.
+
+=item Negative '/' count in unpack
+
+(F) The length count obtained from a length/code unpack operation was
+negative. See L<perlfunc/pack>.
+
+=item Negative length
+
+(F) You tried to do a read/write/send/recv operation with a buffer
+length that is less than 0. This is difficult to imagine.
+
+=item Negative offset to vec in lvalue context
+
+(F) When C<vec> is called in an lvalue context, the second argument must be
+greater than or equal to zero.
+
+=item Nested quantifiers in regex; marked by <-- HERE in m/%s/
+
+(F) You can't quantify a quantifier without intervening parentheses. So
+things like ** or +* or ?* are illegal. The <-- HERE shows in the regular
+expression about where the problem was discovered.
+
+Note that the minimal matching quantifiers, C<*?>, C<+?>, and
+C<??> appear to be nested quantifiers, but aren't. See L<perlre>.
+
+=item %s never introduced
+
+(S internal) The symbol in question was declared but somehow went out of
+scope before it could possibly have been used.
+
+=item next::method/next::can/maybe::next::method cannot find enclosing method
+
+(F) C<next::method> needs to be called within the context of a
+real method in a real package, and it could not find such a context.
+See L<mro>.
+
+=item No %s allowed while running setuid
+
+(F) Certain operations are deemed to be too insecure for a setuid or
+setgid script to even be allowed to attempt. Generally speaking there
+will be another way to do what you want that is, if not secure, at least
+securable. See L<perlsec>.
+
+=item No comma allowed after %s
+
+(F) A list operator that has a filehandle or "indirect object" is not
+allowed to have a comma between that and the following arguments.
+Otherwise it'd be just another one of the arguments.
+
+One possible cause for this is that you expected to have imported a
+constant to your name space with B<use> or B<import> while no such
+importing took place, it may for example be that your operating system
+does not support that particular constant. Hopefully you did use an
+explicit import list for the constants you expect to see, please see
+L<perlfunc/use> and L<perlfunc/import>. While an explicit import list
+would probably have caught this error earlier it naturally does not
+remedy the fact that your operating system still does not support that
+constant. Maybe you have a typo in the constants of the symbol import
+list of B<use> or B<import> or in the constant name at the line where
+this error was triggered?
+
+=item No command into which to pipe on command line
+
+(F) An error peculiar to VMS. Perl handles its own command line
+redirection, and found a '|' at the end of the command line, so it
+doesn't know where you want to pipe the output from this command.
+
+=item No DB::DB routine defined
+
+(F) The currently executing code was compiled with the B<-d> switch, but
+for some reason the current debugger (e.g. F<perl5db.pl> or a C<Devel::>
+module) didn't define a routine to be called at the beginning of each
+statement.
+
+=item No dbm on this machine
+
+(P) This is counted as an internal error, because every machine should
+supply dbm nowadays, because Perl comes with SDBM. See L<SDBM_File>.
+
+=item No DB::sub routine defined
+
+(F) The currently executing code was compiled with the B<-d> switch, but
+for some reason the current debugger (e.g. F<perl5db.pl> or a C<Devel::>
+module) didn't define a C<DB::sub> routine to be called at the beginning
+of each ordinary subroutine call.
+
+=item No B<-e> allowed in setuid scripts
+
+(F) A setuid script can't be specified by the user.
+
+=item No error file after 2> or 2>> on command line
+
+(F) An error peculiar to VMS. Perl handles its own command line
+redirection, and found a '2>' or a '2>>' on the command line, but can't
+find the name of the file to which to write data destined for stderr.
+
+=item No group ending character '%c' found in template
+
+(F) A pack or unpack template has an opening '(' or '[' without its
+matching counterpart. See L<perlfunc/pack>.
+
+=item No input file after < on command line
+
+(F) An error peculiar to VMS. Perl handles its own command line
+redirection, and found a '<' on the command line, but can't find the
+name of the file from which to read data for stdin.
+
+=item No #! line
+
+(F) The setuid emulator requires that scripts have a well-formed #! line
+even on machines that don't support the #! construct.
+
+=item No next::method '%s' found for %s
+
+(F) C<next::method> found no further instances of this method name
+in the remaining packages of the MRO of this class. If you don't want
+it throwing an exception, use C<maybe::next::method>
+or C<next::can>. See L<mro>.
+
+=item "no" not allowed in expression
+
+(F) The "no" keyword is recognized and executed at compile time, and
+returns no useful value. See L<perlmod>.
+
+=item No output file after > on command line
+
+(F) An error peculiar to VMS. Perl handles its own command line
+redirection, and found a lone '>' at the end of the command line, so it
+doesn't know where you wanted to redirect stdout.
+
+=item No output file after > or >> on command line
+
+(F) An error peculiar to VMS. Perl handles its own command line
+redirection, and found a '>' or a '>>' on the command line, but can't
+find the name of the file to which to write data destined for stdout.
+
+=item No package name allowed for variable %s in "our"
+
+(F) Fully qualified variable names are not allowed in "our"
+declarations, because that doesn't make much sense under existing
+semantics. Such syntax is reserved for future extensions.
+
+=item No Perl script found in input
+
+(F) You called C<perl -x>, but no line was found in the file beginning
+with #! and containing the word "perl".
+
+=item No setregid available
+
+(F) Configure didn't find anything resembling the setregid() call for
+your system.
+
+=item No setreuid available
+
+(F) Configure didn't find anything resembling the setreuid() call for
+your system.
+
+=item No %s specified for -%c
+
+(F) The indicated command line switch needs a mandatory argument, but
+you haven't specified one.
+
+=item No such class field "%s" in variable %s of type %s
+
+(F) You tried to access a key from a hash through the indicated typed variable
+but that key is not allowed by the package of the same type. The indicated
+package has restricted the set of allowed keys using the L<fields> pragma.
+
+=item No such class %s
+
+(F) You provided a class qualifier in a "my", "our" or "state" declaration, but
+this class doesn't exist at this point in your program.
+
+=item No such hook: %s
+
+(F) You specified a signal hook that was not recognized by Perl. Currently, Perl
+accepts C<__DIE__> and C<__WARN__> as valid signal hooks
+
+=item No such pipe open
+
+(P) An error peculiar to VMS. The internal routine my_pclose() tried to
+close a pipe which hadn't been opened. This should have been caught
+earlier as an attempt to close an unopened filehandle.
+
+=item No such signal: SIG%s
+
+(W signal) You specified a signal name as a subscript to %SIG that was
+not recognized. Say C<kill -l> in your shell to see the valid signal
+names on your system.
+
+=item Not a CODE reference
+
+(F) Perl was trying to evaluate a reference to a code value (that is, a
+subroutine), but found a reference to something else instead. You can
+use the ref() function to find out what kind of ref it really was. See
+also L<perlref>.
+
+=item Not a format reference
+
+(F) I'm not sure how you managed to generate a reference to an anonymous
+format, but this indicates you did, and that it didn't exist.
+
+=item Not a GLOB reference
+
+(F) Perl was trying to evaluate a reference to a "typeglob" (that is, a
+symbol table entry that looks like C<*foo>), but found a reference to
+something else instead. You can use the ref() function to find out what
+kind of ref it really was. See L<perlref>.
+
+=item Not a HASH reference
+
+(F) Perl was trying to evaluate a reference to a hash value, but found a
+reference to something else instead. You can use the ref() function to
+find out what kind of ref it really was. See L<perlref>.
+
+=item Not an ARRAY reference
+
+(F) Perl was trying to evaluate a reference to an array value, but found
+a reference to something else instead. You can use the ref() function
+to find out what kind of ref it really was. See L<perlref>.
+
+=item Not a perl script
+
+(F) The setuid emulator requires that scripts have a well-formed #! line
+even on machines that don't support the #! construct. The line must
+mention perl.
+
+=item Not a SCALAR reference
+
+(F) Perl was trying to evaluate a reference to a scalar value, but found
+a reference to something else instead. You can use the ref() function
+to find out what kind of ref it really was. See L<perlref>.
+
+=item Not a subroutine reference
+
+(F) Perl was trying to evaluate a reference to a code value (that is, a
+subroutine), but found a reference to something else instead. You can
+use the ref() function to find out what kind of ref it really was. See
+also L<perlref>.
+
+=item Not a subroutine reference in overload table
+
+(F) An attempt was made to specify an entry in an overloading table that
+doesn't somehow point to a valid subroutine. See L<overload>.
+
+=item Not enough arguments for %s
+
+(F) The function requires more arguments than you specified.
+
+=item Not enough format arguments
+
+(W syntax) A format specified more picture fields than the next line
+supplied. See L<perlform>.
+
+=item %s: not found
+
+(A) You've accidentally run your script through the Bourne shell instead
+of Perl. Check the #! line, or manually feed your script into Perl
+yourself.
+
+=item no UTC offset information; assuming local time is UTC
+
+(S) A warning peculiar to VMS. Perl was unable to find the local
+timezone offset, so it's assuming that local system time is equivalent
+to UTC. If it's not, define the logical name
+F<SYS$TIMEZONE_DIFFERENTIAL> to translate to the number of seconds which
+need to be added to UTC to get local time.
+
+=item Non-string passed as bitmask
+
+(W misc) A number has been passed as a bitmask argument to select().
+Use the vec() function to construct the file descriptor bitmasks for
+select. See L<perlfunc/select>
+
+=item Null filename used
+
+(F) You can't require the null filename, especially because on many
+machines that means the current directory! See L<perlfunc/require>.
+
+=item NULL OP IN RUN
+
+(P debugging) Some internal routine called run() with a null opcode
+pointer.
+
+=item Null picture in formline
+
+(F) The first argument to formline must be a valid format picture
+specification. It was found to be empty, which probably means you
+supplied it an uninitialized value. See L<perlform>.
+
+=item Null realloc
+
+(P) An attempt was made to realloc NULL.
+
+=item NULL regexp argument
+
+(P) The internal pattern matching routines blew it big time.
+
+=item NULL regexp parameter
+
+(P) The internal pattern matching routines are out of their gourd.
+
+=item Number too long
+
+(F) Perl limits the representation of decimal numbers in programs to
+about 250 characters. You've exceeded that length. Future
+versions of Perl are likely to eliminate this arbitrary limitation. In
+the meantime, try using scientific notation (e.g. "1e6" instead of
+"1_000_000").
+
+=item Octal number in vector unsupported
+
+(F) Numbers with a leading C<0> are not currently allowed in vectors.
+The octal number interpretation of such numbers may be supported in a
+future version.
+
+=item Octal number > 037777777777 non-portable
+
+(W portable) The octal number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems. See
+L<perlport> for more on portability concerns.
+
+See also L<perlport> for writing portable code.
+
+=item Odd number of arguments for overload::constant
+
+(W overload) The call to overload::constant contained an odd number of
+arguments. The arguments should come in pairs.
+
+=item Odd number of elements in anonymous hash
+
+(W misc) You specified an odd number of elements to initialize a hash,
+which is odd, because hashes come in key/value pairs.
+
+=item Odd number of elements in hash assignment
+
+(W misc) You specified an odd number of elements to initialize a hash,
+which is odd, because hashes come in key/value pairs.
+
+=item Offset outside string
+
+(F, W layer) You tried to do a read/write/send/recv/seek operation
+with an offset pointing outside the buffer. This is difficult to
+imagine. The sole exceptions to this are that zero padding will
+take place when going past the end of the string when either
+C<sysread()>ing a file, or when seeking past the end of a scalar opened
+for I/O (in anticipation of future reads and to imitate the behaviour
+with real files).
+
+=item %s() on unopened %s
+
+(W unopened) An I/O operation was attempted on a filehandle that was
+never initialized. You need to do an open(), a sysopen(), or a socket()
+call, or call a constructor from the FileHandle package.
+
+=item -%s on unopened filehandle %s
+
+(W unopened) You tried to invoke a file test operator on a filehandle
+that isn't open. Check your control flow. See also L<perlfunc/-X>.
+
+=item oops: oopsAV
+
+(S internal) An internal warning that the grammar is screwed up.
+
+=item oops: oopsHV
+
+(S internal) An internal warning that the grammar is screwed up.
+
+=item Opening dirhandle %s also as a file
+
+(W io deprecated) You used open() to associate a filehandle to
+a symbol (glob or scalar) that already holds a dirhandle.
+Although legal, this idiom might render your code confusing
+and is deprecated.
+
+=item Opening filehandle %s also as a directory
+
+(W io deprecated) You used opendir() to associate a dirhandle to
+a symbol (glob or scalar) that already holds a filehandle.
+Although legal, this idiom might render your code confusing
+and is deprecated.
+
+=item Operation "%s": no method found, %s
+
+(F) An attempt was made to perform an overloaded operation for which no
+handler was defined. While some handlers can be autogenerated in terms
+of other handlers, there is no default handler for any operation, unless
+C<fallback> overloading key is specified to be true. See L<overload>.
+
+=item Operator or semicolon missing before %s
+
+(S ambiguous) You used a variable or subroutine call where the parser
+was expecting an operator. The parser has assumed you really meant to
+use an operator, but this is highly likely to be incorrect. For
+example, if you say "*foo *foo" it will be interpreted as if you said
+"*foo * 'foo'".
+
+=item "our" variable %s redeclared
+
+(W misc) You seem to have already declared the same global once before
+in the current lexical scope.
+
+=item Out of memory!
+
+(X) The malloc() function returned 0, indicating there was insufficient
+remaining memory (or virtual memory) to satisfy the request. Perl has
+no option but to exit immediately.
+
+At least in Unix you may be able to get past this by increasing your
+process datasize limits: in csh/tcsh use C<limit> and
+C<limit datasize n> (where C<n> is the number of kilobytes) to check
+the current limits and change them, and in ksh/bash/zsh use C<ulimit -a>
+and C<ulimit -d n>, respectively.
+
+=item Out of memory during %s extend
+
+(X) An attempt was made to extend an array, a list, or a string beyond
+the largest possible memory allocation.
+
+=item Out of memory during "large" request for %s
+
+(F) The malloc() function returned 0, indicating there was insufficient
+remaining memory (or virtual memory) to satisfy the request. However,
+the request was judged large enough (compile-time default is 64K), so a
+possibility to shut down by trapping this error is granted.
+
+=item Out of memory during request for %s
+
+(X|F) The malloc() function returned 0, indicating there was
+insufficient remaining memory (or virtual memory) to satisfy the
+request.
+
+The request was judged to be small, so the possibility to trap it
+depends on the way perl was compiled. By default it is not trappable.
+However, if compiled for this, Perl may use the contents of C<$^M> as an
+emergency pool after die()ing with this message. In this case the error
+is trappable I<once>, and the error message will include the line and file
+where the failed request happened.
+
+=item Out of memory during ridiculously large request
+
+(F) You can't allocate more than 2^31+"small amount" bytes. This error
+is most likely to be caused by a typo in the Perl program. e.g.,
+C<$arr[time]> instead of C<$arr[$time]>.
+
+=item Out of memory for yacc stack
+
+(F) The yacc parser wanted to grow its stack so it could continue
+parsing, but realloc() wouldn't give it more memory, virtual or
+otherwise.
+
+=item '.' outside of string in pack
+
+(F) The argument to a '.' in your template tried to move the working
+position to before the start of the packed string being built.
+
+=item '@' outside of string in unpack
+
+(F) You had a template that specified an absolute position outside
+the string being unpacked. See L<perlfunc/pack>.
+
+=item '@' outside of string with malformed UTF-8 in unpack
+
+(F) You had a template that specified an absolute position outside
+the string being unpacked. The string being unpacked was also invalid
+UTF-8. See L<perlfunc/pack>.
+
+=item %s package attribute may clash with future reserved word: %s
+
+(W reserved) A lowercase attribute name was used that had a
+package-specific handler. That name might have a meaning to Perl itself
+some day, even though it doesn't yet. Perhaps you should use a
+mixed-case attribute name, instead. See L<attributes>.
+
+=item pack/unpack repeat count overflow
+
+(F) You can't specify a repeat count so large that it overflows your
+signed integers. See L<perlfunc/pack>.
+
+=item page overflow
+
+(W io) A single call to write() produced more lines than can fit on a
+page. See L<perlform>.
+
+=item panic: %s
+
+(P) An internal error.
+
+=item panic: attempt to call %s in %s
+
+(P) One of the file test operators entered a code branch that calls
+an ACL related-function, but that function is not available on this
+platform. Earlier checks mean that it should not be possible to
+enter this branch on this platform.
+
+=item panic: ck_grep
+
+(P) Failed an internal consistency check trying to compile a grep.
+
+=item panic: ck_split
+
+(P) Failed an internal consistency check trying to compile a split.
+
+=item panic: corrupt saved stack index
+
+(P) The savestack was requested to restore more localized values than
+there are in the savestack.
+
+=item panic: del_backref
+
+(P) Failed an internal consistency check while trying to reset a weak
+reference.
+
+=item panic: Devel::DProf inconsistent subroutine return
+
+(P) Devel::DProf called a subroutine that exited using goto(LABEL),
+last(LABEL) or next(LABEL). Leaving that way a subroutine called from
+an XSUB will lead very probably to a crash of the interpreter. This is
+a bug that will hopefully one day get fixed.
+
+=item panic: die %s
+
+(P) We popped the context stack to an eval context, and then discovered
+it wasn't an eval context.
+
+=item panic: do_subst
+
+(P) The internal pp_subst() routine was called with invalid operational
+data.
+
+=item panic: do_trans_%s
+
+(P) The internal do_trans routines were called with invalid operational
+data.
+
+=item panic: fold_constants JMPENV_PUSH returned %d
+
+(P) While attempting folding constants an exception other than an C<eval>
+failure was caught.
+
+=item panic: frexp
+
+(P) The library function frexp() failed, making printf("%f") impossible.
+
+=item panic: goto
+
+(P) We popped the context stack to a context with the specified label,
+and then discovered it wasn't a context we know how to do a goto in.
+
+=item panic: hfreeentries failed to free hash
+
+(P) The internal routine used to clear a hashes entries tried repeatedly,
+but each time something added more entries to the hash. Most likely the hash
+contains an object with a reference back to the hash and a destructor that
+adds a new object to the hash.
+
+=item panic: INTERPCASEMOD
+
+(P) The lexer got into a bad state at a case modifier.
+
+=item panic: INTERPCONCAT
+
+(P) The lexer got into a bad state parsing a string with brackets.
+
+=item panic: kid popen errno read
+
+(F) forked child returned an incomprehensible message about its errno.
+
+=item panic: last
+
+(P) We popped the context stack to a block context, and then discovered
+it wasn't a block context.
+
+=item panic: leave_scope clearsv
+
+(P) A writable lexical variable became read-only somehow within the
+scope.
+
+=item panic: leave_scope inconsistency
+
+(P) The savestack probably got out of sync. At least, there was an
+invalid enum on the top of it.
+
+=item panic: magic_killbackrefs
+
+(P) Failed an internal consistency check while trying to reset all weak
+references to an object.
+
+=item panic: malloc
+
+(P) Something requested a negative number of bytes of malloc.
+
+=item panic: memory wrap
+
+(P) Something tried to allocate more memory than possible.
+
+=item panic: pad_alloc
+
+(P) The compiler got confused about which scratch pad it was allocating
+and freeing temporaries and lexicals from.
+
+=item panic: pad_free curpad
+
+(P) The compiler got confused about which scratch pad it was allocating
+and freeing temporaries and lexicals from.
+
+=item panic: pad_free po
+
+(P) An invalid scratch pad offset was detected internally.
+
+=item panic: pad_reset curpad
+
+(P) The compiler got confused about which scratch pad it was allocating
+and freeing temporaries and lexicals from.
+
+=item panic: pad_sv po
+
+(P) An invalid scratch pad offset was detected internally.
+
+=item panic: pad_swipe curpad
+
+(P) The compiler got confused about which scratch pad it was allocating
+and freeing temporaries and lexicals from.
+
+=item panic: pad_swipe po
+
+(P) An invalid scratch pad offset was detected internally.
+
+=item panic: pp_iter
+
+(P) The foreach iterator got called in a non-loop context frame.
+
+=item panic: pp_match%s
+
+(P) The internal pp_match() routine was called with invalid operational
+data.
+
+=item panic: pp_split
+
+(P) Something terrible went wrong in setting up for the split.
+
+=item panic: realloc
+
+(P) Something requested a negative number of bytes of realloc.
+
+=item panic: restartop
+
+(P) Some internal routine requested a goto (or something like it), and
+didn't supply the destination.
+
+=item panic: return
+
+(P) We popped the context stack to a subroutine or eval context, and
+then discovered it wasn't a subroutine or eval context.
+
+=item panic: scan_num
+
+(P) scan_num() got called on something that wasn't a number.
+
+=item panic: sv_chop %s
+
+(P) The sv_chop() routine was passed a position that is not within the
+scalar's string buffer.
+
+=item panic: sv_insert
+
+(P) The sv_insert() routine was told to remove more string than there
+was string.
+
+=item panic: top_env
+
+(P) The compiler attempted to do a goto, or something weird like that.
+
+=item panic: unimplemented op %s (#%d) called
+
+(P) The compiler is screwed up and attempted to use an op that isn't permitted
+at run time.
+
+=item panic: utf16_to_utf8: odd bytelen
+
+(P) Something tried to call utf16_to_utf8 with an odd (as opposed
+to even) byte length.
+
+=item panic: yylex
+
+(P) The lexer got into a bad state while processing a case modifier.
+
+=item Pattern subroutine nesting without pos change exceeded limit in regex; marked by <-- HERE in m/%s/
+
+(F) You used a pattern that uses too many nested subpattern calls without
+consuming any text. Restructure the pattern so text is consumed before the
+nesting limit is exceeded.
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item Parentheses missing around "%s" list
+
+(W parenthesis) You said something like
+
+ my $foo, $bar = @_;
+
+when you meant
+
+ my ($foo, $bar) = @_;
+
+Remember that "my", "our", "local" and "state" bind tighter than comma.
+
+=item C<-p> destination: %s
+
+(F) An error occurred during the implicit output invoked by the C<-p>
+command-line switch. (This output goes to STDOUT unless you've
+redirected it with select().)
+
+=item (perhaps you forgot to load "%s"?)
+
+(F) This is an educated guess made in conjunction with the message
+"Can't locate object method \"%s\" via package \"%s\"". It often means
+that a method requires a package that has not been loaded.
+
+=item Perl_my_%s() not available
+
+(F) Your platform has very uncommon byte-order and integer size,
+so it was not possible to set up some or all fixed-width byte-order
+conversion functions. This is only a problem when you're using the
+'<' or '>' modifiers in (un)pack templates. See L<perlfunc/pack>.
+
+=item Perl %s required--this is only version %s, stopped
+
+(F) The module in question uses features of a version of Perl more
+recent than the currently running version. How long has it been since
+you upgraded, anyway? See L<perlfunc/require>.
+
+=item PERL_SH_DIR too long
+
+(F) An error peculiar to OS/2. PERL_SH_DIR is the directory to find the
+C<sh>-shell in. See "PERL_SH_DIR" in L<perlos2>.
+
+=item PERL_SIGNALS illegal: "%s"
+
+See L<perlrun/PERL_SIGNALS> for legal values.
+
+=item perl: warning: Setting locale failed.
+
+(S) The whole warning message will look something like:
+
+ perl: warning: Setting locale failed.
+ perl: warning: Please check that your locale settings:
+ LC_ALL = "En_US",
+ LANG = (unset)
+ are supported and installed on your system.
+ perl: warning: Falling back to the standard locale ("C").
+
+Exactly what were the failed locale settings varies. In the above the
+settings were that the LC_ALL was "En_US" and the LANG had no value.
+This error means that Perl detected that you and/or your operating
+system supplier and/or system administrator have set up the so-called
+locale system but Perl could not use those settings. This was not
+dead serious, fortunately: there is a "default locale" called "C" that
+Perl can and will use, the script will be run. Before you really fix
+the problem, however, you will get the same error message each time
+you run Perl. How to really fix the problem can be found in
+L<perllocale> section B<LOCALE PROBLEMS>.
+
+=item Permission denied
+
+(F) The setuid emulator in suidperl decided you were up to no good.
+
+=item pid %x not a child
+
+(W exec) A warning peculiar to VMS. Waitpid() was asked to wait for a
+process which isn't a subprocess of the current process. While this is
+fine from VMS' perspective, it's probably not what you intended.
+
+=item 'P' must have an explicit size in unpack
+
+(F) The unpack format P must have an explicit size, not "*".
+
+=item B<-P> not allowed for setuid/setgid script
+
+(F) The script would have to be opened by the C preprocessor by name,
+which provides a race condition that breaks security.
+
+=item POSIX class [:%s:] unknown in regex; marked by <-- HERE in m/%s/
+
+(F) The class in the character class [: :] syntax is unknown. The <-- HERE
+shows in the regular expression about where the problem was discovered.
+Note that the POSIX character classes do B<not> have the C<is> prefix
+the corresponding C interfaces have: in other words, it's C<[[:print:]]>,
+not C<isprint>. See L<perlre>.
+
+=item POSIX getpgrp can't take an argument
+
+(F) Your system has POSIX getpgrp(), which takes no argument, unlike
+the BSD version, which takes a pid.
+
+=item POSIX syntax [%s] belongs inside character classes in regex; marked by <-- HERE in m/%s/
+
+(W regexp) The character class constructs [: :], [= =], and [. .] go
+I<inside> character classes, the [] are part of the construct, for example:
+/[012[:alpha:]345]/. Note that [= =] and [. .] are not currently
+implemented; they are simply placeholders for future extensions and will
+cause fatal errors. The <-- HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
+
+=item POSIX syntax [. .] is reserved for future extensions in regex; marked by <-- HERE in m/%s/
+
+(F regexp) Within regular expression character classes ([]) the syntax
+beginning with "[." and ending with ".]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[." and ".\]". The <-- HERE shows in the regular expression
+about where the problem was discovered. See L<perlre>.
+
+=item POSIX syntax [= =] is reserved for future extensions in regex; marked by <-- HERE in m/%s/
+
+(F) Within regular expression character classes ([]) the syntax beginning
+with "[=" and ending with "=]" is reserved for future extensions. If you
+need to represent those character sequences inside a regular expression
+character class, just quote the square brackets with the backslash: "\[="
+and "=\]". The <-- HERE shows in the regular expression about where the
+problem was discovered. See L<perlre>.
+
+=item Possible attempt to put comments in qw() list
+
+(W qw) qw() lists contain items separated by whitespace; as with literal
+strings, comment characters are not ignored, but are instead treated as
+literal data. (You may have used different delimiters than the
+parentheses shown here; braces are also frequently used.)
+
+You probably wrote something like this:
+
+ @list = qw(
+ a # a comment
+ b # another comment
+ );
+
+when you should have written this:
+
+ @list = qw(
+ a
+ b
+ );
+
+If you really want comments, build your list the
+old-fashioned way, with quotes and commas:
+
+ @list = (
+ 'a', # a comment
+ 'b', # another comment
+ );
+
+=item Possible attempt to separate words with commas
+
+(W qw) qw() lists contain items separated by whitespace; therefore
+commas aren't needed to separate the items. (You may have used
+different delimiters than the parentheses shown here; braces are also
+frequently used.)
+
+You probably wrote something like this:
+
+ qw! a, b, c !;
+
+which puts literal commas into some of the list items. Write it without
+commas if you don't want them to appear in your data:
+
+ qw! a b c !;
+
+=item Possible memory corruption: %s overflowed 3rd argument
+
+(F) An ioctl() or fcntl() returned more than Perl was bargaining for.
+Perl guesses a reasonable buffer size, but puts a sentinel byte at the
+end of the buffer just in case. This sentinel byte got clobbered, and
+Perl assumes that memory is now corrupted. See L<perlfunc/ioctl>.
+
+=item Possible precedence problem on bitwise %c operator
+
+(W precedence) Your program uses a bitwise logical operator in conjunction
+with a numeric comparison operator, like this :
+
+ if ($x & $y == 0) { ... }
+
+This expression is actually equivalent to C<$x & ($y == 0)>, due to the
+higher precedence of C<==>. This is probably not what you want. (If you
+really meant to write this, disable the warning, or, better, put the
+parentheses explicitly and write C<$x & ($y == 0)>).
+
+=item Possible unintended interpolation of %s in string
+
+(W ambiguous) You said something like `@foo' in a double-quoted string
+but there was no array C<@foo> in scope at the time. If you wanted a
+literal @foo, then write it as \@foo; otherwise find out what happened
+to the array you apparently lost track of.
+
+=item pragma "attrs" is deprecated, use "sub NAME : ATTRS" instead
+
+(D deprecated) You have written something like this:
+
+ sub doit
+ {
+ use attrs qw(locked);
+ }
+
+You should use the new declaration syntax instead.
+
+ sub doit : locked
+ {
+ ...
+
+The C<use attrs> pragma is now obsolete, and is only provided for
+backward-compatibility. See L<perlsub/"Subroutine Attributes">.
+
+=item Precedence problem: open %s should be open(%s)
+
+(S precedence) The old irregular construct
+
+ open FOO || die;
+
+is now misinterpreted as
+
+ open(FOO || die);
+
+because of the strict regularization of Perl 5's grammar into unary and
+list operators. (The old open was a little of both.) You must put
+parentheses around the filehandle, or use the new "or" operator instead
+of "||".
+
+=item Premature end of script headers
+
+See Server error.
+
+=item printf() on closed filehandle %s
+
+(W closed) The filehandle you're writing to got itself closed sometime
+before now. Check your control flow.
+
+=item print() on closed filehandle %s
+
+(W closed) The filehandle you're printing on got itself closed sometime
+before now. Check your control flow.
+
+=item Process terminated by SIG%s
+
+(W) This is a standard message issued by OS/2 applications, while *nix
+applications die in silence. It is considered a feature of the OS/2
+port. One can easily disable this by appropriate sighandlers, see
+L<perlipc/"Signals">. See also "Process terminated by SIGTERM/SIGINT"
+in L<perlos2>.
+
+=item Prototype mismatch: %s vs %s
+
+(S prototype) The subroutine being declared or defined had previously been
+declared or defined with a different function prototype.
+
+=item Prototype not terminated
+
+(F) You've omitted the closing parenthesis in a function prototype
+definition.
+
+=item Quantifier follows nothing in regex; marked by <-- HERE in m/%s/
+
+(F) You started a regular expression with a quantifier. Backslash it if you
+meant it literally. The <-- HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
+
+=item Quantifier in {,} bigger than %d in regex; marked by <-- HERE in m/%s/
+
+(F) There is currently a limit to the size of the min and max values of the
+{min,max} construct. The <-- HERE shows in the regular expression about where
+the problem was discovered. See L<perlre>.
+
+=item Quantifier unexpected on zero-length expression; marked by <-- HERE in m/%s/
+
+(W regexp) You applied a regular expression quantifier in a place where
+it makes no sense, such as on a zero-width assertion. Try putting the
+quantifier inside the assertion instead. For example, the way to match
+"abc" provided that it is followed by three repetitions of "xyz" is
+C</abc(?=(?:xyz){3})/>, not C</abc(?=xyz){3}/>.
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item Range iterator outside integer range
+
+(F) One (or both) of the numeric arguments to the range operator ".."
+are outside the range which can be represented by integers internally.
+One possible workaround is to force Perl to use magical string increment
+by prepending "0" to your numbers.
+
+=item readdir() attempted on invalid dirhandle %s
+
+(W io) The dirhandle you're reading from is either closed or not really
+a dirhandle. Check your control flow.
+
+=item readline() on closed filehandle %s
+
+(W closed) The filehandle you're reading from got itself closed sometime
+before now. Check your control flow.
+
+=item read() on closed filehandle %s
+
+(W closed) You tried to read from a closed filehandle.
+
+=item read() on unopened filehandle %s
+
+(W unopened) You tried to read from a filehandle that was never opened.
+
+=item Reallocation too large: %lx
+
+(F) You can't allocate more than 64K on an MS-DOS machine.
+
+=item realloc() of freed memory ignored
+
+(S malloc) An internal routine called realloc() on something that had
+already been freed.
+
+=item Recompile perl with B<-D>DEBUGGING to use B<-D> switch
+
+(F debugging) You can't use the B<-D> option unless the code to produce
+the desired output is compiled into Perl, which entails some overhead,
+which is why it's currently left out of your copy.
+
+=item Recursive inheritance detected in package '%s'
+
+(F) While calculating the method resolution order (MRO) of a package, Perl
+believes it found an infinite loop in the C<@ISA> hierarchy. This is a
+crude check that bails out after 100 levels of C<@ISA> depth.
+
+=item Recursive inheritance detected while looking for method %s
+
+(F) More than 100 levels of inheritance were encountered while invoking
+a method. Probably indicates an unintended loop in your inheritance
+hierarchy.
+
+=item Reference found where even-sized list expected
+
+(W misc) You gave a single reference where Perl was expecting a list
+with an even number of elements (for assignment to a hash). This usually
+means that you used the anon hash constructor when you meant to use
+parens. In any case, a hash requires key/value B<pairs>.
+
+ %hash = { one => 1, two => 2, }; # WRONG
+ %hash = [ qw/ an anon array / ]; # WRONG
+ %hash = ( one => 1, two => 2, ); # right
+ %hash = qw( one 1 two 2 ); # also fine
+
+=item Reference is already weak
+
+(W misc) You have attempted to weaken a reference that is already weak.
+Doing so has no effect.
+
+=item Reference miscount in sv_replace()
+
+(W internal) The internal sv_replace() function was handed a new SV with
+a reference count of other than 1.
+
+=item Reference to invalid group 0
+
+(F) You used C<\g0> or similar in a regular expression. You may refer to
+capturing parentheses only with strictly positive integers (normal
+backreferences) or with strictly negative integers (relative
+backreferences), but using 0 does not make sense.
+
+=item Reference to nonexistent group in regex; marked by <-- HERE in m/%s/
+
+(F) You used something like C<\7> in your regular expression, but there are
+not at least seven sets of capturing parentheses in the expression. If you
+wanted to have the character with value 7 inserted into the regular expression,
+prepend a zero to make the number at least two digits: C<\07>
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item Reference to nonexistent or unclosed group in regex; marked by <-- HERE in m/%s/
+
+(F) You used something like C<\g{-7}> in your regular expression, but there are
+not at least seven sets of closed capturing parentheses in the expression before
+where the C<\g{-7}> was located.
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item Reference to nonexistent named group in regex; marked by <-- HERE in m/%s/
+
+(F) You used something like C<\k'NAME'> or C<< \k<NAME> >> in your regular
+expression, but there is no corresponding named capturing parentheses such
+as C<(?'NAME'...)> or C<(?<NAME>...). Check if the name has been spelled
+correctly both in the backreference and the declaration.
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item (?(DEFINE)....) does not allow branches in regex; marked by <-- HERE in m/%s/
+
+(F) You used something like C<(?(DEFINE)...|..)> which is illegal. The
+most likely cause of this error is that you left out a parenthesis inside
+of the C<....> part.
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item regexp memory corruption
+
+(P) The regular expression engine got confused by what the regular
+expression compiler gave it.
+
+=item Regexp out of space
+
+(P) A "can't happen" error, because safemalloc() should have caught it
+earlier.
+
+=item Repeated format line will never terminate (~~ and @# incompatible)
+
+(F) Your format contains the ~~ repeat-until-blank sequence and a
+numeric field that will never go blank so that the repetition never
+terminates. You might use ^# instead. See L<perlform>.
+
+=item Reversed %s= operator
+
+(W syntax) You wrote your assignment operator backwards. The = must
+always comes last, to avoid ambiguity with subsequent unary operators.
+
+=item rewinddir() attempted on invalid dirhandle %s
+
+(W io) The dirhandle you tried to do a rewinddir() on is either closed or not
+really a dirhandle. Check your control flow.
+
+=item Runaway format
+
+(F) Your format contained the ~~ repeat-until-blank sequence, but it
+produced 200 lines at once, and the 200th line looked exactly like the
+199th line. Apparently you didn't arrange for the arguments to exhaust
+themselves, either by using ^ instead of @ (for scalar variables), or by
+shifting or popping (for array variables). See L<perlform>.
+
+=item Scalars leaked: %d
+
+(P) Something went wrong in Perl's internal bookkeeping of scalars:
+not all scalar variables were deallocated by the time Perl exited.
+What this usually indicates is a memory leak, which is of course bad,
+especially if the Perl program is intended to be long-running.
+
+=item Scalar value @%s[%s] better written as $%s[%s]
+
+(W syntax) You've used an array slice (indicated by @) to select a
+single element of an array. Generally it's better to ask for a scalar
+value (indicated by $). The difference is that C<$foo[&bar]> always
+behaves like a scalar, both when assigning to it and when evaluating its
+argument, while C<@foo[&bar]> behaves like a list when you assign to it,
+and provides a list context to its subscript, which can do weird things
+if you're expecting only one subscript.
+
+On the other hand, if you were actually hoping to treat the array
+element as a list, you need to look into how references work, because
+Perl will not magically convert between scalars and lists for you. See
+L<perlref>.
+
+=item Scalar value @%s{%s} better written as $%s{%s}
+
+(W syntax) You've used a hash slice (indicated by @) to select a single
+element of a hash. Generally it's better to ask for a scalar value
+(indicated by $). The difference is that C<$foo{&bar}> always behaves
+like a scalar, both when assigning to it and when evaluating its
+argument, while C<@foo{&bar}> behaves like a list when you assign to it,
+and provides a list context to its subscript, which can do weird things
+if you're expecting only one subscript.
+
+On the other hand, if you were actually hoping to treat the hash element
+as a list, you need to look into how references work, because Perl will
+not magically convert between scalars and lists for you. See
+L<perlref>.
+
+=item Script is not setuid/setgid in suidperl
+
+(F) Oddly, the suidperl program was invoked on a script without a setuid
+or setgid bit set. This doesn't make much sense.
+
+=item Search pattern not terminated
+
+(F) The lexer couldn't find the final delimiter of a // or m{}
+construct. Remember that bracketing delimiters count nesting level.
+Missing the leading C<$> from a variable C<$m> may cause this error.
+
+Note that since Perl 5.9.0 a // can also be the I<defined-or>
+construct, not just the empty search pattern. Therefore code written
+in Perl 5.9.0 or later that uses the // as the I<defined-or> can be
+misparsed by pre-5.9.0 Perls as a non-terminated search pattern.
+
+=item Search pattern not terminated or ternary operator parsed as search pattern
+
+(F) The lexer couldn't find the final delimiter of a C<?PATTERN?>
+construct.
+
+The question mark is also used as part of the ternary operator (as in
+C<foo ? 0 : 1>) leading to some ambiguous constructions being wrongly
+parsed. One way to disambiguate the parsing is to put parentheses around
+the conditional expression, i.e. C<(foo) ? 0 : 1>.
+
+=item %sseek() on unopened filehandle
+
+(W unopened) You tried to use the seek() or sysseek() function on a
+filehandle that was either never opened or has since been closed.
+
+=item seekdir() attempted on invalid dirhandle %s
+
+(W io) The dirhandle you are doing a seekdir() on is either closed or not
+really a dirhandle. Check your control flow.
+
+=item select not implemented
+
+(F) This machine doesn't implement the select() system call.
+
+=item Self-ties of arrays and hashes are not supported
+
+(F) Self-ties are of arrays and hashes are not supported in
+the current implementation.
+
+=item Semicolon seems to be missing
+
+(W semicolon) A nearby syntax error was probably caused by a missing
+semicolon, or possibly some other missing operator, such as a comma.
+
+=item semi-panic: attempt to dup freed string
+
+(S internal) The internal newSVsv() routine was called to duplicate a
+scalar that had previously been marked as free.
+
+=item sem%s not implemented
+
+(F) You don't have System V semaphore IPC on your system.
+
+=item send() on closed socket %s
+
+(W closed) The socket you're sending to got itself closed sometime
+before now. Check your control flow.
+
+=item Sequence (? incomplete in regex; marked by <-- HERE in m/%s/
+
+(F) A regular expression ended with an incomplete extension (?. The <-- HERE
+shows in the regular expression about where the problem was discovered. See
+L<perlre>.
+
+=item Sequence (?%s...) not implemented in regex; marked by <-- HERE in m/%s/
+
+(F) A proposed regular expression extension has the character reserved but
+has not yet been written. The <-- HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
+
+=item Sequence (?%s...) not recognized in regex; marked by <-- HERE in m/%s/
+
+(F) You used a regular expression extension that doesn't make sense. The
+<-- HERE shows in the regular expression about where the problem was
+discovered. See L<perlre>.
+
+=item Sequence \\%s... not terminated in regex; marked by <-- HERE in m/%s/
+
+(F) The regular expression expects a mandatory argument following the escape
+sequence and this has been omitted or incorrectly written.
+
+=item Sequence (?#... not terminated in regex; marked by <-- HERE in m/%s/
+
+(F) A regular expression comment must be terminated by a closing
+parenthesis. Embedded parentheses aren't allowed. The <-- HERE shows in
+the regular expression about where the problem was discovered. See
+L<perlre>.
+
+=item Sequence (?{...}) not terminated or not {}-balanced in regex; marked by <-- HERE in m/%s/
+
+(F) If the contents of a (?{...}) clause contains braces, they must balance
+for Perl to properly detect the end of the clause. The <-- HERE shows in
+the regular expression about where the problem was discovered. See
+L<perlre>.
+
+=item 500 Server error
+
+See Server error.
+
+=item Server error
+
+This is the error message generally seen in a browser window when trying
+to run a CGI program (including SSI) over the web. The actual error text
+varies widely from server to server. The most frequently-seen variants
+are "500 Server error", "Method (something) not permitted", "Document
+contains no data", "Premature end of script headers", and "Did not
+produce a valid header".
+
+B<This is a CGI error, not a Perl error>.
+
+You need to make sure your script is executable, is accessible by the
+user CGI is running the script under (which is probably not the user
+account you tested it under), does not rely on any environment variables
+(like PATH) from the user it isn't running under, and isn't in a
+location where the CGI server can't find it, basically, more or less.
+Please see the following for more information:
+
+ http://www.perl.org/CGI_MetaFAQ.html
+ http://www.htmlhelp.org/faq/cgifaq.html
+ http://www.w3.org/Security/Faq/
+
+You should also look at L<perlfaq9>.
+
+=item setegid() not implemented
+
+(F) You tried to assign to C<$)>, and your operating system doesn't
+support the setegid() system call (or equivalent), or at least Configure
+didn't think so.
+
+=item seteuid() not implemented
+
+(F) You tried to assign to C<< $> >>, and your operating system doesn't
+support the seteuid() system call (or equivalent), or at least Configure
+didn't think so.
+
+=item setpgrp can't take arguments
+
+(F) Your system has the setpgrp() from BSD 4.2, which takes no
+arguments, unlike POSIX setpgid(), which takes a process ID and process
+group ID.
+
+=item setrgid() not implemented
+
+(F) You tried to assign to C<$(>, and your operating system doesn't
+support the setrgid() system call (or equivalent), or at least Configure
+didn't think so.
+
+=item setruid() not implemented
+
+(F) You tried to assign to C<$<>, and your operating system doesn't
+support the setruid() system call (or equivalent), or at least Configure
+didn't think so.
+
+=item setsockopt() on closed socket %s
+
+(W closed) You tried to set a socket option on a closed socket. Did you
+forget to check the return value of your socket() call? See
+L<perlfunc/setsockopt>.
+
+=item Setuid/gid script is writable by world
+
+(F) The setuid emulator won't run a script that is writable by the
+world, because the world might have written on it already.
+
+=item Setuid script not plain file
+
+(F) The setuid emulator won't run a script that isn't read from a file,
+but from a socket, a pipe or another device.
+
+=item shm%s not implemented
+
+(F) You don't have System V shared memory IPC on your system.
+
+=item !=~ should be !~
+
+(W syntax) The non-matching operator is !~, not !=~. !=~ will be
+interpreted as the != (numeric not equal) and ~ (1's complement)
+operators: probably not what you intended.
+
+=item <> should be quotes
+
+(F) You wrote C<< require <file> >> when you should have written
+C<require 'file'>.
+
+=item /%s/ should probably be written as "%s"
+
+(W syntax) You have used a pattern where Perl expected to find a string,
+as in the first argument to C<join>. Perl will treat the true or false
+result of matching the pattern against $_ as the string, which is
+probably not what you had in mind.
+
+=item shutdown() on closed socket %s
+
+(W closed) You tried to do a shutdown on a closed socket. Seems a bit
+superfluous.
+
+=item SIG%s handler "%s" not defined
+
+(W signal) The signal handler named in %SIG doesn't, in fact, exist.
+Perhaps you put it into the wrong package?
+
+=item Smart matching a non-overloaded object breaks encapsulation
+
+(F) You should not use the C<~~> operator on an object that does not
+overload it: Perl refuses to use the object's underlying structure for
+the smart match.
+
+=item sort is now a reserved word
+
+(F) An ancient error message that almost nobody ever runs into anymore.
+But before sort was a keyword, people sometimes used it as a filehandle.
+
+=item Sort subroutine didn't return a numeric value
+
+(F) A sort comparison routine must return a number. You probably blew
+it by not using C<< <=> >> or C<cmp>, or by not using them correctly.
+See L<perlfunc/sort>.
+
+=item Sort subroutine didn't return single value
+
+(F) A sort comparison subroutine may not return a list value with more
+or less than one element. See L<perlfunc/sort>.
+
+=item splice() offset past end of array
+
+(W misc) You attempted to specify an offset that was past the end of
+the array passed to splice(). Splicing will instead commence at the end
+of the array, rather than past it. If this isn't what you want, try
+explicitly pre-extending the array by assigning $#array = $offset. See
+L<perlfunc/splice>.
+
+=item Split loop
+
+(P) The split was looping infinitely. (Obviously, a split shouldn't
+iterate more times than there are characters of input, which is what
+happened.) See L<perlfunc/split>.
+
+=item Statement unlikely to be reached
+
+(W exec) You did an exec() with some statement after it other than a
+die(). This is almost always an error, because exec() never returns
+unless there was a failure. You probably wanted to use system()
+instead, which does return. To suppress this warning, put the exec() in
+a block by itself.
+
+=item stat() on unopened filehandle %s
+
+(W unopened) You tried to use the stat() function on a filehandle that
+was either never opened or has since been closed.
+
+=item Stub found while resolving method "%s" overloading "%s"
+
+(P) Overloading resolution over @ISA tree may be broken by importation
+stubs. Stubs should never be implicitly created, but explicit calls to
+C<can> may break this.
+
+=item Subroutine %s redefined
+
+(W redefine) You redefined a subroutine. To suppress this warning, say
+
+ {
+ no warnings 'redefine';
+ eval "sub name { ... }";
+ }
+
+=item Substitution loop
+
+(P) The substitution was looping infinitely. (Obviously, a substitution
+shouldn't iterate more times than there are characters of input, which
+is what happened.) See the discussion of substitution in
+L<perlop/"Regexp Quote-Like Operators">.
+
+=item Substitution pattern not terminated
+
+(F) The lexer couldn't find the interior delimiter of an s/// or s{}{}
+construct. Remember that bracketing delimiters count nesting level.
+Missing the leading C<$> from variable C<$s> may cause this error.
+
+=item Substitution replacement not terminated
+
+(F) The lexer couldn't find the final delimiter of an s/// or s{}{}
+construct. Remember that bracketing delimiters count nesting level.
+Missing the leading C<$> from variable C<$s> may cause this error.
+
+=item substr outside of string
+
+(W substr),(F) You tried to reference a substr() that pointed outside of
+a string. That is, the absolute value of the offset was larger than the
+length of the string. See L<perlfunc/substr>. This warning is fatal if
+substr is used in an lvalue context (as the left hand side of an
+assignment or as a subroutine argument for example).
+
+=item suidperl is no longer needed since %s
+
+(F) Your Perl was compiled with B<-D>SETUID_SCRIPTS_ARE_SECURE_NOW, but
+a version of the setuid emulator somehow got run anyway.
+
+=item sv_upgrade from type %d down to type %d
+
+(P) Perl tried to force the upgrade an SV to a type which was actually
+inferior to its current type.
+
+=item Switch (?(condition)... contains too many branches in regex; marked by <-- HERE in m/%s/
+
+(F) A (?(condition)if-clause|else-clause) construct can have at most two
+branches (the if-clause and the else-clause). If you want one or both to
+contain alternation, such as using C<this|that|other>, enclose it in
+clustering parentheses:
+
+ (?(condition)(?:this|that|other)|else-clause)
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered. See L<perlre>.
+
+=item Switch condition not recognized in regex; marked by <-- HERE in m/%s/
+
+(F) If the argument to the (?(...)if-clause|else-clause) construct is a
+number, it can be only a number. The <-- HERE shows in the regular expression
+about where the problem was discovered. See L<perlre>.
+
+=item switching effective %s is not implemented
+
+(F) While under the C<use filetest> pragma, we cannot switch the real
+and effective uids or gids.
+
+=item %s syntax
+
+(F) The final summary message when a C<perl -c> succeeds.
+
+=item syntax error
+
+(F) Probably means you had a syntax error. Common reasons include:
+
+ A keyword is misspelled.
+ A semicolon is missing.
+ A comma is missing.
+ An opening or closing parenthesis is missing.
+ An opening or closing brace is missing.
+ A closing quote is missing.
+
+Often there will be another error message associated with the syntax
+error giving more information. (Sometimes it helps to turn on B<-w>.)
+The error message itself often tells you where it was in the line when
+it decided to give up. Sometimes the actual error is several tokens
+before this, because Perl is good at understanding random input.
+Occasionally the line number may be misleading, and once in a blue moon
+the only way to figure out what's triggering the error is to call
+C<perl -c> repeatedly, chopping away half the program each time to see
+if the error went away. Sort of the cybernetic version of S<20
+questions>.
+
+=item syntax error at line %d: `%s' unexpected
+
+(A) You've accidentally run your script through the Bourne shell instead
+of Perl. Check the #! line, or manually feed your script into Perl
+yourself.
+
+=item syntax error in file %s at line %d, next 2 tokens "%s"
+
+(F) This error is likely to occur if you run a perl5 script through
+a perl4 interpreter, especially if the next 2 tokens are "use strict"
+or "my $var" or "our $var".
+
+=item sysread() on closed filehandle %s
+
+(W closed) You tried to read from a closed filehandle.
+
+=item sysread() on unopened filehandle %s
+
+(W unopened) You tried to read from a filehandle that was never opened.
+
+=item System V %s is not implemented on this machine
+
+(F) You tried to do something with a function beginning with "sem",
+"shm", or "msg" but that System V IPC is not implemented in your
+machine. In some machines the functionality can exist but be
+unconfigured. Consult your system support.
+
+=item syswrite() on closed filehandle %s
+
+(W closed) The filehandle you're writing to got itself closed sometime
+before now. Check your control flow.
+
+=item C<-T> and C<-B> not implemented on filehandles
+
+(F) Perl can't peek at the stdio buffer of filehandles when it doesn't
+know about your kind of stdio. You'll have to use a filename instead.
+
+=item Target of goto is too deeply nested
+
+(F) You tried to use C<goto> to reach a label that was too deeply nested
+for Perl to reach. Perl is doing you a favor by refusing.
+
+=item tell() on unopened filehandle
+
+(W unopened) You tried to use the tell() function on a filehandle that
+was either never opened or has since been closed.
+
+=item telldir() attempted on invalid dirhandle %s
+
+(W io) The dirhandle you tried to telldir() is either closed or not really
+a dirhandle. Check your control flow.
+
+=item That use of $[ is unsupported
+
+(F) Assignment to C<$[> is now strictly circumscribed, and interpreted
+as a compiler directive. You may say only one of
+
+ $[ = 0;
+ $[ = 1;
+ ...
+ local $[ = 0;
+ local $[ = 1;
+ ...
+
+This is to prevent the problem of one module changing the array base out
+from under another module inadvertently. See L<perlvar/$[>.
+
+=item The crypt() function is unimplemented due to excessive paranoia
+
+(F) Configure couldn't find the crypt() function on your machine,
+probably because your vendor didn't supply it, probably because they
+think the U.S. Government thinks it's a secret, or at least that they
+will continue to pretend that it is. And if you quote me on that, I
+will deny it.
+
+=item The %s function is unimplemented
+
+The function indicated isn't implemented on this architecture, according
+to the probings of Configure.
+
+=item The stat preceding %s wasn't an lstat
+
+(F) It makes no sense to test the current stat buffer for symbolic
+linkhood if the last stat that wrote to the stat buffer already went
+past the symlink to get to the real file. Use an actual filename
+instead.
+
+=item The 'unique' attribute may only be applied to 'our' variables
+
+(F) This attribute was never supported on C<my> or C<sub> declarations.
+
+=item This Perl can't reset CRTL environ elements (%s)
+
+=item This Perl can't set CRTL environ elements (%s=%s)
+
+(W internal) Warnings peculiar to VMS. You tried to change or delete an
+element of the CRTL's internal environ array, but your copy of Perl
+wasn't built with a CRTL that contained the setenv() function. You'll
+need to rebuild Perl with a CRTL that does, or redefine
+F<PERL_ENV_TABLES> (see L<perlvms>) so that the environ array isn't the
+target of the change to
+%ENV which produced the warning.
+
+=item thread failed to start: %s
+
+(W threads)(S) The entry point function of threads->create() failed for some reason.
+
+=item times not implemented
+
+(F) Your version of the C library apparently doesn't do times(). I
+suspect you're not running on Unix.
+
+=item "-T" is on the #! line, it must also be used on the command line
+
+(X) The #! line (or local equivalent) in a Perl script contains the
+B<-T> option, but Perl was not invoked with B<-T> in its command line.
+This is an error because, by the time Perl discovers a B<-T> in a
+script, it's too late to properly taint everything from the environment.
+So Perl gives up.
+
+If the Perl script is being executed as a command using the #!
+mechanism (or its local equivalent), this error can usually be fixed by
+editing the #! line so that the B<-T> option is a part of Perl's first
+argument: e.g. change C<perl -n -T> to C<perl -T -n>.
+
+If the Perl script is being executed as C<perl scriptname>, then the
+B<-T> option must appear on the command line: C<perl -T scriptname>.
+
+=item To%s: illegal mapping '%s'
+
+(F) You tried to define a customized To-mapping for lc(), lcfirst,
+uc(), or ucfirst() (or their string-inlined versions), but you
+specified an illegal mapping.
+See L<perlunicode/"User-Defined Character Properties">.
+
+=item Too deeply nested ()-groups
+
+(F) Your template contains ()-groups with a ridiculously deep nesting level.
+
+=item Too few args to syscall
+
+(F) There has to be at least one argument to syscall() to specify the
+system call to call, silly dilly.
+
+=item Too late for "-%s" option
+
+(X) The #! line (or local equivalent) in a Perl script contains the
+B<-M>, B<-m> or B<-C> option.
+
+In the case of B<-M> and B<-m>, this is an error because those options are
+not intended for use inside scripts. Use the C<use> pragma instead.
+
+The B<-C> option only works if it is specified on the command line as well
+(with the same sequence of letters or numbers following). Either specify
+this option on the command line, or, if your system supports it, make your
+script executable and run it directly instead of passing it to perl.
+
+=item Too late to run %s block
+
+(W void) A CHECK or INIT block is being defined during run time proper,
+when the opportunity to run them has already passed. Perhaps you are
+loading a file with C<require> or C<do> when you should be using C<use>
+instead. Or perhaps you should put the C<require> or C<do> inside a
+BEGIN block.
+
+=item Too many args to syscall
+
+(F) Perl supports a maximum of only 14 args to syscall().
+
+=item Too many arguments for %s
+
+(F) The function requires fewer arguments than you specified.
+
+=item Too many )'s
+
+(A) You've accidentally run your script through B<csh> instead of Perl.
+Check the #! line, or manually feed your script into Perl yourself.
+
+=item Too many ('s
+
+(A) You've accidentally run your script through B<csh> instead of Perl.
+Check the #! line, or manually feed your script into Perl yourself.
+
+=item Trailing \ in regex m/%s/
+
+(F) The regular expression ends with an unbackslashed backslash.
+Backslash it. See L<perlre>.
+
+=item Transliteration pattern not terminated
+
+(F) The lexer couldn't find the interior delimiter of a tr/// or tr[][]
+or y/// or y[][] construct. Missing the leading C<$> from variables
+C<$tr> or C<$y> may cause this error.
+
+=item Transliteration replacement not terminated
+
+(F) The lexer couldn't find the final delimiter of a tr///, tr[][],
+y/// or y[][] construct.
+
+=item '%s' trapped by operation mask
+
+(F) You tried to use an operator from a Safe compartment in which it's
+disallowed. See L<Safe>.
+
+=item truncate not implemented
+
+(F) Your machine doesn't implement a file truncation mechanism that
+Configure knows about.
+
+=item Type of arg %d to %s must be %s (not %s)
+
+(F) This function requires the argument in that position to be of a
+certain type. Arrays must be @NAME or C<@{EXPR}>. Hashes must be
+%NAME or C<%{EXPR}>. No implicit dereferencing is allowed--use the
+{EXPR} forms as an explicit dereference. See L<perlref>.
+
+=item umask not implemented
+
+(F) Your machine doesn't implement the umask function and you tried to
+use it to restrict permissions for yourself (EXPR & 0700).
+
+=item Unable to create sub named "%s"
+
+(F) You attempted to create or access a subroutine with an illegal name.
+
+=item Unbalanced context: %d more PUSHes than POPs
+
+(W internal) The exit code detected an internal inconsistency in how
+many execution contexts were entered and left.
+
+=item Unbalanced saves: %d more saves than restores
+
+(W internal) The exit code detected an internal inconsistency in how
+many values were temporarily localized.
+
+=item Unbalanced scopes: %d more ENTERs than LEAVEs
+
+(W internal) The exit code detected an internal inconsistency in how
+many blocks were entered and left.
+
+=item Unbalanced tmps: %d more allocs than frees
+
+(W internal) The exit code detected an internal inconsistency in how
+many mortal scalars were allocated and freed.
+
+=item Undefined format "%s" called
+
+(F) The format indicated doesn't seem to exist. Perhaps it's really in
+another package? See L<perlform>.
+
+=item Undefined sort subroutine "%s" called
+
+(F) The sort comparison routine specified doesn't seem to exist.
+Perhaps it's in a different package? See L<perlfunc/sort>.
+
+=item Undefined subroutine &%s called
+
+(F) The subroutine indicated hasn't been defined, or if it was, it has
+since been undefined.
+
+=item Undefined subroutine called
+
+(F) The anonymous subroutine you're trying to call hasn't been defined,
+or if it was, it has since been undefined.
+
+=item Undefined subroutine in sort
+
+(F) The sort comparison routine specified is declared but doesn't seem
+to have been defined yet. See L<perlfunc/sort>.
+
+=item Undefined top format "%s" called
+
+(F) The format indicated doesn't seem to exist. Perhaps it's really in
+another package? See L<perlform>.
+
+=item Undefined value assigned to typeglob
+
+(W misc) An undefined value was assigned to a typeglob, a la
+C<*foo = undef>. This does nothing. It's possible that you really mean
+C<undef *foo>.
+
+=item %s: Undefined variable
+
+(A) You've accidentally run your script through B<csh> instead of Perl.
+Check the #! line, or manually feed your script into Perl yourself.
+
+=item unexec of %s into %s failed!
+
+(F) The unexec() routine failed for some reason. See your local FSF
+representative, who probably put it there in the first place.
+
+=item Unicode character %s is illegal
+
+(W utf8) Certain Unicode characters have been designated off-limits by
+the Unicode standard and should not be generated. If you really know
+what you are doing you can turn off this warning by C<no warnings 'utf8';>.
+
+=item Unknown BYTEORDER
+
+(F) There are no byte-swapping functions for a machine with this byte
+order.
+
+=item Unknown open() mode '%s'
+
+(F) The second argument of 3-argument open() is not among the list
+of valid modes: C<< < >>, C<< > >>, C<<< >> >>>, C<< +< >>,
+C<< +> >>, C<<< +>> >>>, C<-|>, C<|->, C<< <& >>, C<< >& >>.
+
+=item Unknown PerlIO layer "%s"
+
+(W layer) An attempt was made to push an unknown layer onto the Perl I/O
+system. (Layers take care of transforming data between external and
+internal representations.) Note that some layers, such as C<mmap>,
+are not supported in all environments. If your program didn't
+explicitly request the failing operation, it may be the result of the
+value of the environment variable PERLIO.
+
+=item Unknown process %x sent message to prime_env_iter: %s
+
+(P) An error peculiar to VMS. Perl was reading values for %ENV before
+iterating over it, and someone else stuck a message in the stream of
+data Perl expected. Someone's very confused, or perhaps trying to
+subvert Perl's population of %ENV for nefarious purposes.
+
+=item Unknown "re" subpragma '%s' (known ones are: %s)
+
+You tried to use an unknown subpragma of the "re" pragma.
+
+=item Unknown switch condition (?(%.2s in regex; marked by <-- HERE in m/%s/
+
+(F) The condition part of a (?(condition)if-clause|else-clause) construct
+is not known. The condition may be lookahead or lookbehind (the condition
+is true if the lookahead or lookbehind is true), a (?{...}) construct (the
+condition is true if the code evaluates to a true value), or a number (the
+condition is true if the set of capturing parentheses named by the number
+matched).
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered. See L<perlre>.
+
+=item Unknown Unicode option letter '%c'
+
+You specified an unknown Unicode option. See L<perlrun> documentation
+of the C<-C> switch for the list of known options.
+
+=item Unknown Unicode option value %x
+
+You specified an unknown Unicode option. See L<perlrun> documentation
+of the C<-C> switch for the list of known options.
+
+=item Unknown warnings category '%s'
+
+(F) An error issued by the C<warnings> pragma. You specified a warnings
+category that is unknown to perl at this point.
+
+Note that if you want to enable a warnings category registered by a module
+(e.g. C<use warnings 'File::Find'>), you must have imported this module
+
+=item Unknown verb pattern '%s' in regex; marked by <-- HERE in m/%s/
+
+(F) You either made a typo or have incorrectly put a C<*> quantifier
+after an open brace in your pattern. Check the pattern and review
+L<perlre> for details on legal verb patterns.
+
+first.
+
+=item unmatched [ in regex; marked by <-- HERE in m/%s/
+
+(F) The brackets around a character class must match. If you wish to
+include a closing bracket in a character class, backslash it or put it
+first. The <-- HERE shows in the regular expression about where the problem
+was discovered. See L<perlre>.
+
+=item unmatched ( in regex; marked by <-- HERE in m/%s/
+
+(F) Unbackslashed parentheses must always be balanced in regular
+expressions. If you're a vi user, the % key is valuable for finding the
+matching parenthesis. The <-- HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
+
+=item Unmatched right %s bracket
+
+(F) The lexer counted more closing curly or square brackets than opening
+ones, so you're probably missing a matching opening bracket. As a
+general rule, you'll find the missing one (so to speak) near the place
+you were last editing.
+
+=item Unquoted string "%s" may clash with future reserved word
+
+(W reserved) You used a bareword that might someday be claimed as a
+reserved word. It's best to put such a word in quotes, or capitalize it
+somehow, or insert an underbar into it. You might also declare it as a
+subroutine.
+
+=item Unrecognized character %s in column %d
+
+(F) The Perl parser has no idea what to do with the specified character
+in your Perl script (or eval) at the specified column. Perhaps you tried
+to run a compressed script, a binary program, or a directory as a Perl program.
+
+=item Unrecognized escape \\%c in character class passed through in regex; marked by <-- HERE in m/%s/
+
+(W regexp) You used a backslash-character combination which is not
+recognized by Perl inside character classes. The character was
+understood literally.
+The <-- HERE shows in the regular expression about where the
+escape was discovered.
+
+=item Unrecognized escape \\%c passed through
+
+(W misc) You used a backslash-character combination which is not
+recognized by Perl. The character was understood literally.
+
+=item Unrecognized escape \\%c passed through in regex; marked by <-- HERE in m/%s/
+
+(W regexp) You used a backslash-character combination which is not
+recognized by Perl. The character was understood literally.
+The <-- HERE shows in the regular expression about where the
+escape was discovered.
+
+=item Unrecognized signal name "%s"
+
+(F) You specified a signal name to the kill() function that was not
+recognized. Say C<kill -l> in your shell to see the valid signal names
+on your system.
+
+=item Unrecognized switch: -%s (-h will show valid options)
+
+(F) You specified an illegal option to Perl. Don't do that. (If you
+think you didn't do that, check the #! line to see if it's supplying the
+bad switch on your behalf.)
+
+=item Unsuccessful %s on filename containing newline
+
+(W newline) A file operation was attempted on a filename, and that
+operation failed, PROBABLY because the filename contained a newline,
+PROBABLY because you forgot to chomp() it off. See L<perlfunc/chomp>.
+
+=item Unsupported directory function "%s" called
+
+(F) Your machine doesn't support opendir() and readdir().
+
+=item Unsupported function %s
+
+(F) This machine doesn't implement the indicated function, apparently.
+At least, Configure doesn't think so.
+
+=item Unsupported function fork
+
+(F) Your version of executable does not support forking.
+
+Note that under some systems, like OS/2, there may be different flavors
+of Perl executables, some of which may support fork, some not. Try
+changing the name you call Perl by to C<perl_>, C<perl__>, and so on.
+
+=item Unsupported script encoding %s
+
+(F) Your program file begins with a Unicode Byte Order Mark (BOM) which
+declares it to be in a Unicode encoding that Perl cannot read.
+
+=item Unsupported socket function "%s" called
+
+(F) Your machine doesn't support the Berkeley socket mechanism, or at
+least that's what Configure thought.
+
+=item Unterminated attribute list
+
+(F) The lexer found something other than a simple identifier at the
+start of an attribute, and it wasn't a semicolon or the start of a
+block. Perhaps you terminated the parameter list of the previous
+attribute too soon. See L<attributes>.
+
+=item Unterminated attribute parameter in attribute list
+
+(F) The lexer saw an opening (left) parenthesis character while parsing
+an attribute list, but the matching closing (right) parenthesis
+character was not found. You may need to add (or remove) a backslash
+character to get your parentheses to balance. See L<attributes>.
+
+=item Unterminated compressed integer
+
+(F) An argument to unpack("w",...) was incompatible with the BER
+compressed integer format and could not be converted to an integer.
+See L<perlfunc/pack>.
+
+=item Unterminated verb pattern in regex; marked by <-- HERE in m/%s/
+
+(F) You used a pattern of the form C<(*VERB)> but did not terminate
+the pattern with a C<)>. Fix the pattern and retry.
+
+=item Unterminated verb pattern argument in regex; marked by <-- HERE in m/%s/
+
+(F) You used a pattern of the form C<(*VERB:ARG)> but did not terminate
+the pattern with a C<)>. Fix the pattern and retry.
+
+=item Unterminated \g{...} pattern in regex; marked by <-- HERE in m/%s/
+
+(F) You missed a close brace on a \g{..} pattern (group reference) in
+a regular expression. Fix the pattern and retry.
+
+=item Unterminated <> operator
+
+(F) The lexer saw a left angle bracket in a place where it was expecting
+a term, so it's looking for the corresponding right angle bracket, and
+not finding it. Chances are you left some needed parentheses out
+earlier in the line, and you really meant a "less than".
+
+=item untie attempted while %d inner references still exist
+
+(W untie) A copy of the object returned from C<tie> (or C<tied>) was
+still valid when C<untie> was called.
+
+=item Usage: POSIX::%s(%s)
+
+(F) You called a POSIX function with incorrect arguments.
+See L<POSIX/FUNCTIONS> for more information.
+
+=item Usage: Win32::%s(%s)
+
+(F) You called a Win32 function with incorrect arguments.
+See L<Win32> for more information.
+
+=item Useless (?-%s) - don't use /%s modifier in regex; marked by <-- HERE in m/%s/
+
+(W regexp) You have used an internal modifier such as (?-o) that has no
+meaning unless removed from the entire regexp:
+
+ if ($string =~ /(?-o)$pattern/o) { ... }
+
+must be written as
+
+ if ($string =~ /$pattern/) { ... }
+
+The <-- HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
+
+=item Useless localization of %s
+
+(W syntax) The localization of lvalues such as C<local($x=10)> is
+legal, but in fact the local() currently has no effect. This may change at
+some point in the future, but in the meantime such code is discouraged.
+
+=item Useless (?%s) - use /%s modifier in regex; marked by <-- HERE in m/%s/
+
+(W regexp) You have used an internal modifier such as (?o) that has no
+meaning unless applied to the entire regexp:
+
+ if ($string =~ /(?o)$pattern/) { ... }
+
+must be written as
+
+ if ($string =~ /$pattern/o) { ... }
+
+The <-- HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
+
+=item Useless use of %s in void context
+
+(W void) You did something without a side effect in a context that does
+nothing with the return value, such as a statement that doesn't return a
+value from a block, or the left side of a scalar comma operator. Very
+often this points not to stupidity on your part, but a failure of Perl
+to parse your program the way you thought it would. For example, you'd
+get this if you mixed up your C precedence with Python precedence and
+said
+
+ $one, $two = 1, 2;
+
+when you meant to say
+
+ ($one, $two) = (1, 2);
+
+Another common error is to use ordinary parentheses to construct a list
+reference when you should be using square or curly brackets, for
+example, if you say
+
+ $array = (1,2);
+
+when you should have said
+
+ $array = [1,2];
+
+The square brackets explicitly turn a list value into a scalar value,
+while parentheses do not. So when a parenthesized list is evaluated in
+a scalar context, the comma is treated like C's comma operator, which
+throws away the left argument, which is not what you want. See
+L<perlref> for more on this.
+
+This warning will not be issued for numerical constants equal to 0 or 1
+since they are often used in statements like
+
+ 1 while sub_with_side_effects();
+
+String constants that would normally evaluate to 0 or 1 are warned
+about.
+
+=item Useless use of "re" pragma
+
+(W) You did C<use re;> without any arguments. That isn't very useful.
+
+=item Useless use of sort in scalar context
+
+(W void) You used sort in scalar context, as in :
+
+ my $x = sort @y;
+
+This is not very useful, and perl currently optimizes this away.
+
+=item Useless use of %s with no values
+
+(W syntax) You used the push() or unshift() function with no arguments
+apart from the array, like C<push(@x)> or C<unshift(@foo)>. That won't
+usually have any effect on the array, so is completely useless. It's
+possible in principle that push(@tied_array) could have some effect
+if the array is tied to a class which implements a PUSH method. If so,
+you can write it as C<push(@tied_array,())> to avoid this warning.
+
+=item "use" not allowed in expression
+
+(F) The "use" keyword is recognized and executed at compile time, and
+returns no useful value. See L<perlmod>.
+
+=item Use of bare << to mean <<"" is deprecated
+
+(D deprecated, W syntax) You are now encouraged to use the explicitly quoted
+form if you wish to use an empty line as the terminator of the here-document.
+
+=item Use of comma-less variable list is deprecated
+
+(D deprecated, W syntax) The values you give to a format should be
+separated by commas, not just aligned on a line.
+
+=item Use of chdir('') or chdir(undef) as chdir() deprecated
+
+(D deprecated) chdir() with no arguments is documented to change to
+$ENV{HOME} or $ENV{LOGDIR}. chdir(undef) and chdir('') share this
+behavior, but that has been deprecated. In future versions they
+will simply fail.
+
+Be careful to check that what you pass to chdir() is defined and not
+blank, else you might find yourself in your home directory.
+
+=item Use of /c modifier is meaningless in s///
+
+(W regexp) You used the /c modifier in a substitution. The /c
+modifier is not presently meaningful in substitutions.
+
+=item Use of /c modifier is meaningless without /g
+
+(W regexp) You used the /c modifier with a regex operand, but didn't
+use the /g modifier. Currently, /c is meaningful only when /g is
+used. (This may change in the future.)
+
+=item Use of freed value in iteration
+
+(F) Perhaps you modified the iterated array within the loop?
+This error is typically caused by code like the following:
+
+ @a = (3,4);
+ @a = () for (1,2,@a);
+
+You are not supposed to modify arrays while they are being iterated over.
+For speed and efficiency reasons, Perl internally does not do full
+reference-counting of iterated items, hence deleting such an item in the
+middle of an iteration causes Perl to see a freed value.
+
+=item Use of *glob{FILEHANDLE} is deprecated
+
+(D deprecated) You are now encouraged to use the shorter *glob{IO} form
+to access the filehandle slot within a typeglob.
+
+=item Use of /g modifier is meaningless in split
+
+(W regexp) You used the /g modifier on the pattern for a C<split>
+operator. Since C<split> always tries to match the pattern
+repeatedly, the C</g> has no effect.
+
+=item Use of implicit split to @_ is deprecated
+
+(D deprecated, W syntax) It makes a lot of work for the compiler when you
+clobber a subroutine's argument list, so it's better if you assign the results
+of a split() explicitly to an array (or list).
+
+=item Use of inherited AUTOLOAD for non-method %s() is deprecated
+
+(D deprecated) As an (ahem) accidental feature, C<AUTOLOAD> subroutines
+are looked up as methods (using the C<@ISA> hierarchy) even when the
+subroutines to be autoloaded were called as plain functions (e.g.
+C<Foo::bar()>), not as methods (e.g. C<< Foo->bar() >> or C<<
+$obj->bar() >>).
+
+This bug will be rectified in future by using method lookup only for
+methods' C<AUTOLOAD>s. However, there is a significant base of existing
+code that may be using the old behavior. So, as an interim step, Perl
+currently issues an optional warning when non-methods use inherited
+C<AUTOLOAD>s.
+
+The simple rule is: Inheritance will not work when autoloading
+non-methods. The simple fix for old code is: In any module that used
+to depend on inheriting C<AUTOLOAD> for non-methods from a base class
+named C<BaseClass>, execute C<*AUTOLOAD = \&BaseClass::AUTOLOAD> during
+startup.
+
+In code that currently says C<use AutoLoader; @ISA = qw(AutoLoader);>
+you should remove AutoLoader from @ISA and change C<use AutoLoader;> to
+C<use AutoLoader 'AUTOLOAD';>.
+
+=item Use of %s in printf format not supported
+
+(F) You attempted to use a feature of printf that is accessible from
+only C. This usually means there's a better way to do it in Perl.
+
+=item Use of %s is deprecated
+
+(D deprecated) The construct indicated is no longer recommended for use,
+generally because there's a better way to do it, and also because the
+old way has bad side effects.
+
+=item Use of -l on filehandle %s
+
+(W io) A filehandle represents an opened file, and when you opened the file
+it already went past any symlink you are presumably trying to look for.
+The operation returned C<undef>. Use a filename instead.
+
+=item Use of "package" with no arguments is deprecated
+
+(D deprecated) You used the C<package> keyword without specifying a package
+name. So no namespace is current at all. Using this can cause many
+otherwise reasonable constructs to fail in baffling ways. C<use strict;>
+instead.
+
+=item Use of reference "%s" as array index
+
+(W misc) You tried to use a reference as an array index; this probably
+isn't what you mean, because references in numerical context tend
+to be huge numbers, and so usually indicates programmer error.
+
+If you really do mean it, explicitly numify your reference, like so:
+C<$array[0+$ref]>. This warning is not given for overloaded objects,
+either, because you can overload the numification and stringification
+operators and then you assumably know what you are doing.
+
+=item Use of reserved word "%s" is deprecated
+
+(D deprecated) The indicated bareword is a reserved word. Future
+versions of perl may use it as a keyword, so you're better off either
+explicitly quoting the word in a manner appropriate for its context of
+use, or using a different name altogether. The warning can be
+suppressed for subroutine names by either adding a C<&> prefix, or using
+a package qualifier, e.g. C<&our()>, or C<Foo::our()>.
+
+=item Use of tainted arguments in %s is deprecated
+
+(W taint, deprecated) You have supplied C<system()> or C<exec()> with multiple
+arguments and at least one of them is tainted. This used to be allowed
+but will become a fatal error in a future version of perl. Untaint your
+arguments. See L<perlsec>.
+
+=item Use of uninitialized value%s
+
+(W uninitialized) An undefined value was used as if it were already
+defined. It was interpreted as a "" or a 0, but maybe it was a mistake.
+To suppress this warning assign a defined value to your variables.
+
+To help you figure out what was undefined, perl will try to tell you the
+name of the variable (if any) that was undefined. In some cases it cannot
+do this, so it also tells you what operation you used the undefined value
+in. Note, however, that perl optimizes your program and the operation
+displayed in the warning may not necessarily appear literally in your
+program. For example, C<"that $foo"> is usually optimized into C<"that "
+. $foo>, and the warning will refer to the C<concatenation (.)> operator,
+even though there is no C<.> in your program.
+
+=item Using a hash as a reference is deprecated
+
+(D deprecated) You tried to use a hash as a reference, as in
+C<< %foo->{"bar"} >> or C<< %$ref->{"hello"} >>. Versions of perl <= 5.6.1
+used to allow this syntax, but shouldn't have. It is now deprecated, and will
+be removed in a future version.
+
+=item Using an array as a reference is deprecated
+
+(D deprecated) You tried to use an array as a reference, as in
+C<< @foo->[23] >> or C<< @$ref->[99] >>. Versions of perl <= 5.6.1 used to
+allow this syntax, but shouldn't have. It is now deprecated, and will be
+removed in a future version.
+
+=item UTF-16 surrogate %s
+
+(W utf8) You tried to generate half of an UTF-16 surrogate by
+requesting a Unicode character between the code points 0xD800 and
+0xDFFF (inclusive). That range is reserved exclusively for the use of
+UTF-16 encoding (by having two 16-bit UCS-2 characters); but Perl
+encodes its characters in UTF-8, so what you got is a very illegal
+character. If you really know what you are doing you can turn off
+this warning by C<no warnings 'utf8';>.
+
+=item Value of %s can be "0"; test with defined()
+
+(W misc) In a conditional expression, you used <HANDLE>, <*> (glob),
+C<each()>, or C<readdir()> as a boolean value. Each of these constructs
+can return a value of "0"; that would make the conditional expression
+false, which is probably not what you intended. When using these
+constructs in conditional expressions, test their values with the
+C<defined> operator.
+
+=item Value of CLI symbol "%s" too long
+
+(W misc) A warning peculiar to VMS. Perl tried to read the value of an
+%ENV element from a CLI symbol table, and found a resultant string
+longer than 1024 characters. The return value has been truncated to
+1024 characters.
+
+=item Variable "%s" is not available
+
+(W closure) During compilation, an inner named subroutine or eval is
+attempting to capture an outer lexical that is not currently available.
+This can happen for one of two reasons. First, the outer lexical may be
+declared in an outer anonymous subroutine that has not yet been created.
+(Remember that named subs are created at compile time, while anonymous
+subs are created at run-time.) For example,
+
+ sub { my $a; sub f { $a } }
+
+At the time that f is created, it can't capture the current value of $a,
+since the anonymous subroutine hasn't been created yet. Conversely,
+the following won't give a warning since the anonymous subroutine has by
+now been created and is live:
+
+ sub { my $a; eval 'sub f { $a }' }->();
+
+The second situation is caused by an eval accessing a variable that has
+gone out of scope, for example,
+
+ sub f {
+ my $a;
+ sub { eval '$a' }
+ }
+ f()->();
+
+Here, when the '$a' in the eval is being compiled, f() is not currently being
+executed, so its $a is not available for capture.
+
+=item Variable "%s" is not imported%s
+
+(F) While "use strict" in effect, you referred to a global variable that
+you apparently thought was imported from another module, because
+something else of the same name (usually a subroutine) is exported by
+that module. It usually means you put the wrong funny character on the
+front of your variable.
+
+=item Variable length lookbehind not implemented in m/%s/
+
+(F) Lookbehind is allowed only for subexpressions whose length is fixed and
+known at compile time. See L<perlre>.
+
+=item "%s" variable %s masks earlier declaration in same %s
+
+(W misc) A "my", "our" or "state" variable has been redeclared in the current
+scope or statement, effectively eliminating all access to the previous
+instance. This is almost always a typographical error. Note that the
+earlier variable will still exist until the end of the scope or until
+all closure referents to it are destroyed.
+
+=item Variable syntax
+
+(A) You've accidentally run your script through B<csh> instead
+of Perl. Check the #! line, or manually feed your script into
+Perl yourself.
+
+=item Variable "%s" will not stay shared
+
+(W closure) An inner (nested) I<named> subroutine is referencing a
+lexical variable defined in an outer named subroutine.
+
+When the inner subroutine is called, it will see the value of
+the outer subroutine's variable as it was before and during the *first*
+call to the outer subroutine; in this case, after the first call to the
+outer subroutine is complete, the inner and outer subroutines will no
+longer share a common value for the variable. In other words, the
+variable will no longer be shared.
+
+This problem can usually be solved by making the inner subroutine
+anonymous, using the C<sub {}> syntax. When inner anonymous subs that
+reference variables in outer subroutines are created, they
+are automatically rebound to the current values of such variables.
+
+=item Verb pattern '%s' has a mandatory argument in regex; marked by <-- HERE in m/%s/
+
+(F) You used a verb pattern that requires an argument. Supply an argument
+or check that you are using the right verb.
+
+=item Verb pattern '%s' may not have an argument in regex; marked by <-- HERE in m/%s/
+
+(F) You used a verb pattern that is not allowed an argument. Remove the
+argument or check that you are using the right verb.
+
+=item Version number must be a constant number
+
+(P) The attempt to translate a C<use Module n.n LIST> statement into
+its equivalent C<BEGIN> block found an internal inconsistency with
+the version number.
+
+=item Version string '%s' contains invalid data; ignoring: '%s'
+
+(W misc) The version string contains invalid characters at the end, which
+are being ignored.
+
+=item Warning: something's wrong
+
+(W) You passed warn() an empty string (the equivalent of C<warn "">) or
+you called it with no args and C<$@> was empty.
+
+=item Warning: unable to close filehandle %s properly
+
+(S) The implicit close() done by an open() got an error indication on
+the close(). This usually indicates your file system ran out of disk
+space.
+
+=item Warning: Use of "%s" without parentheses is ambiguous
+
+(S ambiguous) You wrote a unary operator followed by something that
+looks like a binary operator that could also have been interpreted as a
+term or unary operator. For instance, if you know that the rand
+function has a default argument of 1.0, and you write
+
+ rand + 5;
+
+you may THINK you wrote the same thing as
+
+ rand() + 5;
+
+but in actual fact, you got
+
+ rand(+5);
+
+So put in parentheses to say what you really mean.
+
+=item Wide character in %s
+
+(S utf8) Perl met a wide character (>255) when it wasn't expecting
+one. This warning is by default on for I/O (like print). The easiest
+way to quiet this warning is simply to add the C<:utf8> layer to the
+output, e.g. C<binmode STDOUT, ':utf8'>. Another way to turn off the
+warning is to add C<no warnings 'utf8';> but that is often closer to
+cheating. In general, you are supposed to explicitly mark the
+filehandle with an encoding, see L<open> and L<perlfunc/binmode>.
+
+=item Within []-length '%c' not allowed
+
+(F) The count in the (un)pack template may be replaced by C<[TEMPLATE]> only if
+C<TEMPLATE> always matches the same amount of packed bytes that can be
+determined from the template alone. This is not possible if it contains an
+of the codes @, /, U, u, w or a *-length. Redesign the template.
+
+=item write() on closed filehandle %s
+
+(W closed) The filehandle you're writing to got itself closed sometime
+before now. Check your control flow.
+
+=item %s "\x%s" does not map to Unicode
+
+When reading in different encodings Perl tries to map everything
+into Unicode characters. The bytes you read in are not legal in
+this encoding, for example
+
+ utf8 "\xE4" does not map to Unicode
+
+if you try to read in the a-diaereses Latin-1 as UTF-8.
+
+=item 'X' outside of string
+
+(F) You had a (un)pack template that specified a relative position before
+the beginning of the string being (un)packed. See L<perlfunc/pack>.
+
+=item 'x' outside of string in unpack
+
+(F) You had a pack template that specified a relative position after
+the end of the string being unpacked. See L<perlfunc/pack>.
+
+=item YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!
+
+(F) And you probably never will, because you probably don't have the
+sources to your kernel, and your vendor probably doesn't give a rip
+about what you want. Your best bet is to put a setuid C wrapper around
+your script.
+
+=item You need to quote "%s"
+
+(W syntax) You assigned a bareword as a signal handler name.
+Unfortunately, you already have a subroutine of that name declared,
+which means that Perl 5 will try to call the subroutine when the
+assignment is executed, which is probably not what you want. (If it IS
+what you want, put an & in front.)
+
+=item Your random numbers are not that random
+
+(F) When trying to initialise the random seed for hashes, Perl could
+not get any randomness out of your system. This usually indicates
+Something Very Wrong.
+
+=back
+
+=head1 SEE ALSO
+
+L<warnings>, L<perllexwarn>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perldoc.pod b/Master/tlpkg/tlperl.straw/lib/pods/perldoc.pod
new file mode 100755
index 00000000000..3fd4ce91099
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perldoc.pod
@@ -0,0 +1,239 @@
+
+=head1 NAME
+
+perldoc - Look up Perl documentation in Pod format.
+
+=head1 SYNOPSIS
+
+B<perldoc> [B<-h>] [B<-v>] [B<-t>] [B<-u>] [B<-m>] [B<-l>] [B<-F>]
+[B<-i>] [B<-V>] [B<-T>] [B<-r>]
+[B<-dI<destination_file>>]
+[B<-oI<formatname>>]
+[B<-MI<FormatterClassName>>]
+[B<-wI<formatteroption:value>>]
+[B<-n>I<nroff-replacement>]
+[B<-X>]
+[B<-L> I<language_code>]
+PageName|ModuleName|ProgramName
+
+B<perldoc> B<-f> BuiltinFunction
+
+B<perldoc> B<-L> it B<-f> BuiltinFunction
+
+B<perldoc> B<-q> FAQ Keyword
+
+B<perldoc> B<-L> fr B<-q> FAQ Keyword
+
+See below for more description of the switches.
+
+=head1 DESCRIPTION
+
+I<perldoc> looks up a piece of documentation in .pod format that is embedded
+in the perl installation tree or in a perl script, and displays it via
+C<pod2man | nroff -man | $PAGER>. (In addition, if running under HP-UX,
+C<col -x> will be used.) This is primarily used for the documentation for
+the perl library modules.
+
+Your system may also have man pages installed for those modules, in
+which case you can probably just use the man(1) command.
+
+If you are looking for a table of contents to the Perl library modules
+documentation, see the L<perltoc> page.
+
+=head1 OPTIONS
+
+=over 5
+
+=item B<-h>
+
+Prints out a brief B<h>elp message.
+
+=item B<-v>
+
+Describes search for the item in detail (B<v>erbosely).
+
+=item B<-t>
+
+Display docs using plain B<t>ext converter, instead of nroff. This may be faster,
+but it probably won't look as nice.
+
+=item B<-u>
+
+Skip the real Pod formatting, and just show the raw Pod source (B<U>nformatted)
+
+=item B<-m> I<module>
+
+Display the entire module: both code and unformatted pod documentation.
+This may be useful if the docs don't explain a function in the detail
+you need, and you'd like to inspect the code directly; perldoc will find
+the file for you and simply hand it off for display.
+
+=item B<-l>
+
+Display onB<l>y the file name of the module found.
+
+=item B<-F>
+
+Consider arguments as file names; no search in directories will be performed.
+
+=item B<-f> I<perlfunc>
+
+The B<-f> option followed by the name of a perl built in function will
+extract the documentation of this function from L<perlfunc>.
+
+Example:
+
+ perldoc -f sprintf
+
+=item B<-q> I<perlfaq-search-regexp>
+
+The B<-q> option takes a regular expression as an argument. It will search
+the B<q>uestion headings in perlfaq[1-9] and print the entries matching
+the regular expression. Example: C<perldoc -q shuffle>
+
+=item B<-T>
+
+This specifies that the output is not to be sent to a pager, but is to
+be sent right to STDOUT.
+
+=item B<-d> I<destination-filename>
+
+This specifies that the output is to be sent neither to a pager nor
+to STDOUT, but is to be saved to the specified filename. Example:
+C<perldoc -oLaTeX -dtextwrapdocs.tex Text::Wrap>
+
+=item B<-o> I<output-formatname>
+
+This specifies that you want Perldoc to try using a Pod-formatting
+class for the output format that you specify. For example:
+C<-oman>. This is actually just a wrapper around the C<-M> switch;
+using C<-oI<formatname>> just looks for a loadable class by adding
+that format name (with different capitalizations) to the end of
+different classname prefixes.
+
+For example, C<-oLaTeX> currently tries all of the following classes:
+Pod::Perldoc::ToLaTeX Pod::Perldoc::Tolatex Pod::Perldoc::ToLatex
+Pod::Perldoc::ToLATEX Pod::Simple::LaTeX Pod::Simple::latex
+Pod::Simple::Latex Pod::Simple::LATEX Pod::LaTeX Pod::latex Pod::Latex
+Pod::LATEX.
+
+=item B<-M> I<module-name>
+
+This specifies the module that you want to try using for formatting the
+pod. The class must at least provide a C<parse_from_file> method.
+For example: C<perldoc -MPod::Perldoc::ToChecker>.
+
+You can specify several classes to try by joining them with commas
+or semicolons, as in C<-MTk::SuperPod;Tk::Pod>.
+
+=item B<-w> I<option:value> or B<-w> I<option>
+
+This specifies an option to call the formatter B<w>ith. For example,
+C<-w textsize:15> will call
+C<< $formatter->textsize(15) >> on the formatter object before it is
+used to format the object. For this to be valid, the formatter class
+must provide such a method, and the value you pass should be valid.
+(So if C<textsize> expects an integer, and you do C<-w textsize:big>,
+expect trouble.)
+
+You can use C<-w optionname> (without a value) as shorthand for
+C<-w optionname:I<TRUE>>. This is presumably useful in cases of on/off
+features like: C<-w page_numbering>.
+
+You can use a "=" instead of the ":", as in: C<-w textsize=15>. This
+might be more (or less) convenient, depending on what shell you use.
+
+=item B<-X>
+
+Use an index if it is present -- the B<-X> option looks for an entry
+whose basename matches the name given on the command line in the file
+C<$Config{archlib}/pod.idx>. The F<pod.idx> file should contain fully
+qualified filenames, one per line.
+
+=item B<-L> I<language_code>
+
+This allows to specify the I<language code> for desired language translation.
+If C<POD2::E<lt>language_codeE<gt>> package doesn't exist (or isn't installed
+in your system), the switch will be ignored.
+All available translation packages should be found under the C<POD2::>
+namespace. See L<POD2::IT> (or L<POD2::FR>) in order to see how to create and
+integrate new localized C<POD2::*> pod documentation packages in
+L<Pod::Perldoc>.
+
+=item B<PageName|ModuleName|ProgramName>
+
+The item you want to look up. Nested modules (such as C<File::Basename>)
+are specified either as C<File::Basename> or C<File/Basename>. You may also
+give a descriptive name of a page, such as C<perlfunc>.
+
+=item B<-n> I<some-formatter>
+
+Specify replacement for nroff
+
+=item B<-r>
+
+Recursive search.
+
+=item B<-i>
+
+Ignore case.
+
+=item B<-V>
+
+Displays the version of perldoc you're running.
+
+=back
+
+
+
+=head1 SECURITY
+
+Because B<perldoc> does not run properly tainted, and is known to
+have security issues, when run as the superuser it will attempt to
+drop privileges by setting the effective and real IDs to nobody's
+or nouser's account, or -2 if unavailable. If it cannot relinquish
+its privileges, it will not run.
+
+
+=head1 ENVIRONMENT
+
+Any switches in the C<PERLDOC> environment variable will be used before the
+command line arguments.
+
+Useful values for C<PERLDOC> include C<-oman>, C<-otext>, C<-otk>, C<-ortf>,
+C<-oxml>, and so on, depending on what modules you have on hand; or
+exactly specify the formatter class with C<-MPod::Perldoc::ToMan>
+or the like.
+
+C<perldoc> also searches directories
+specified by the C<PERL5LIB> (or C<PERLLIB> if C<PERL5LIB> is not
+defined) and C<PATH> environment variables.
+(The latter is so that embedded pods for executables, such as
+C<perldoc> itself, are available.)
+
+C<perldoc> will use, in order of preference, the pager defined in
+C<PERLDOC_PAGER>, C<MANPAGER>, or C<PAGER> before trying to find a pager
+on its own. (C<MANPAGER> is not used if C<perldoc> was told to display
+plain text or unformatted pod.)
+
+One useful value for C<PERLDOC_PAGER> is C<less -+C -E>.
+
+Having PERLDOCDEBUG set to a positive integer will make perldoc emit
+even more descriptive output than the C<-v> switch does -- the higher the
+number, the more it emits.
+
+=head1 SEE ALSO
+
+L<perlpod>, L<Pod::Perldoc>
+
+=head1 AUTHOR
+
+Current maintainer: Sean M. Burke, <sburke@cpan.org>
+
+Past contributors are:
+Kenneth Albanowski <kjahds@kjahds.com>,
+Andy Dougherty <doughera@lafcol.lafayette.edu>,
+and many others.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perldos.pod b/Master/tlpkg/tlperl.straw/lib/pods/perldos.pod
new file mode 100755
index 00000000000..ef3578f8894
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perldos.pod
@@ -0,0 +1,331 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+perldos - Perl under DOS, W31, W95.
+
+=head1 SYNOPSIS
+
+These are instructions for building Perl under DOS (or w??), using
+DJGPP v2.03 or later. Under w95 long filenames are supported.
+
+=head1 DESCRIPTION
+
+Before you start, you should glance through the README file
+found in the top-level directory where the Perl distribution
+was extracted. Make sure you read and understand the terms under
+which this software is being distributed.
+
+This port currently supports MakeMaker (the set of modules that
+is used to build extensions to perl). Therefore, you should be
+able to build and install most extensions found in the CPAN sites.
+
+Detailed instructions on how to build and install perl extension
+modules, including XS-type modules, is included. See 'BUILDING AND
+INSTALLING MODULES'.
+
+=head2 Prerequisites for Compiling Perl on DOS
+
+=over 4
+
+=item DJGPP
+
+DJGPP is a port of GNU C/C++ compiler and development tools to 32-bit,
+protected-mode environment on Intel 32-bit CPUs running MS-DOS and compatible
+operating systems, by DJ Delorie <dj@delorie.com> and friends.
+
+For more details (FAQ), check out the home of DJGPP at:
+
+ http://www.delorie.com/djgpp/
+
+If you have questions about DJGPP, try posting to the DJGPP newsgroup:
+comp.os.msdos.djgpp, or use the email gateway djgpp@delorie.com.
+
+You can find the full DJGPP distribution on any of the mirrors listed here:
+
+ http://www.delorie.com/djgpp/getting.html
+
+You need the following files to build perl (or add new modules):
+
+ v2/djdev203.zip
+ v2gnu/bnu2112b.zip
+ v2gnu/gcc2953b.zip
+ v2gnu/bsh204b.zip
+ v2gnu/mak3791b.zip
+ v2gnu/fil40b.zip
+ v2gnu/sed3028b.zip
+ v2gnu/txt20b.zip
+ v2gnu/dif272b.zip
+ v2gnu/grep24b.zip
+ v2gnu/shl20jb.zip
+ v2gnu/gwk306b.zip
+ v2misc/csdpmi5b.zip
+
+or possibly any newer version.
+
+=item Pthreads
+
+Thread support is not tested in this version of the djgpp perl.
+
+=back
+
+=head2 Shortcomings of Perl under DOS
+
+Perl under DOS lacks some features of perl under UNIX because of
+deficiencies in the UNIX-emulation, most notably:
+
+=over 4
+
+=item *
+
+fork() and pipe()
+
+=item *
+
+some features of the UNIX filesystem regarding link count and file dates
+
+=item *
+
+in-place operation is a little bit broken with short filenames
+
+=item *
+
+sockets
+
+=back
+
+=head2 Building Perl on DOS
+
+=over 4
+
+=item *
+
+Unpack the source package F<perl5.8*.tar.gz> with djtarx. If you want
+to use long file names under w95 and also to get Perl to pass all its
+tests, don't forget to use
+
+ set LFN=y
+ set FNCASE=y
+
+before unpacking the archive.
+
+=item *
+
+Create a "symlink" or copy your bash.exe to sh.exe in your C<($DJDIR)/bin>
+directory.
+
+ ln -s bash.exe sh.exe
+
+[If you have the recommended version of bash for DJGPP, this is already
+done for you.]
+
+And make the C<SHELL> environment variable point to this F<sh.exe>:
+
+ set SHELL=c:/djgpp/bin/sh.exe (use full path name!)
+
+You can do this in F<djgpp.env> too. Add this line BEFORE any section
+definition:
+
+ +SHELL=%DJDIR%/bin/sh.exe
+
+=item *
+
+If you have F<split.exe> and F<gsplit.exe> in your path, then rename
+F<split.exe> to F<djsplit.exe>, and F<gsplit.exe> to F<split.exe>.
+Copy or link F<gecho.exe> to F<echo.exe> if you don't have F<echo.exe>.
+Copy or link F<gawk.exe> to F<awk.exe> if you don't have F<awk.exe>.
+
+[If you have the recommended versions of djdev, shell utilities and
+gawk, all these are already done for you, and you will not need to do
+anything.]
+
+=item *
+
+Chdir to the djgpp subdirectory of perl toplevel and type the following
+commands:
+
+ set FNCASE=y
+ configure.bat
+
+This will do some preprocessing then run the Configure script for you.
+The Configure script is interactive, but in most cases you just need to
+press ENTER. The "set" command ensures that DJGPP preserves the letter
+case of file names when reading directories. If you already issued this
+set command when unpacking the archive, and you are in the same DOS
+session as when you unpacked the archive, you don't have to issue the
+set command again. This command is necessary *before* you start to
+(re)configure or (re)build perl in order to ensure both that perl builds
+correctly and that building XS-type modules can succeed. See the DJGPP
+info entry for "_preserve_fncase" for more information:
+
+ info libc alphabetical _preserve_fncase
+
+If the script says that your package is incomplete, and asks whether
+to continue, just answer with Y (this can only happen if you don't use
+long filenames or forget to issue "set FNCASE=y" first).
+
+When Configure asks about the extensions, I suggest IO and Fcntl,
+and if you want database handling then SDBM_File or GDBM_File
+(you need to install gdbm for this one). If you want to use the
+POSIX extension (this is the default), make sure that the stack
+size of your F<cc1.exe> is at least 512kbyte (you can check this
+with: C<stubedit cc1.exe>).
+
+You can use the Configure script in non-interactive mode too.
+When I built my F<perl.exe>, I used something like this:
+
+ configure.bat -des
+
+You can find more info about Configure's command line switches in
+the F<INSTALL> file.
+
+When the script ends, and you want to change some values in the
+generated F<config.sh> file, then run
+
+ sh Configure -S
+
+after you made your modifications.
+
+IMPORTANT: if you use this C<-S> switch, be sure to delete the CONFIG
+environment variable before running the script:
+
+ set CONFIG=
+
+=item *
+
+Now you can compile Perl. Type:
+
+ make
+
+=back
+
+=head2 Testing Perl on DOS
+
+Type:
+
+ make test
+
+If you're lucky you should see "All tests successful". But there can be
+a few failed subtests (less than 5 hopefully) depending on some external
+conditions (e.g. some subtests fail under linux/dosemu or plain dos
+with short filenames only).
+
+=head2 Installation of Perl on DOS
+
+Type:
+
+ make install
+
+This will copy the newly compiled perl and libraries into your DJGPP
+directory structure. Perl.exe and the utilities go into C<($DJDIR)/bin>,
+and the library goes under C<($DJDIR)/lib/perl5>. The pod documentation
+goes under C<($DJDIR)/lib/perl5/pod>.
+
+=head1 BUILDING AND INSTALLING MODULES ON DOS
+
+=head2 Building Prerequisites for Perl on DOS
+
+For building and installing non-XS modules, all you need is a working
+perl under DJGPP. Non-XS modules do not require re-linking the perl
+binary, and so are simpler to build and install.
+
+XS-type modules do require re-linking the perl binary, because part of
+an XS module is written in "C", and has to be linked together with the
+perl binary to be executed. This is required because perl under DJGPP
+is built with the "static link" option, due to the lack of "dynamic
+linking" in the DJGPP environment.
+
+Because XS modules require re-linking of the perl binary, you need both
+the perl binary distribution and the perl source distribution to build
+an XS extension module. In addition, you will have to have built your
+perl binary from the source distribution so that all of the components
+of the perl binary are available for the required link step.
+
+=head2 Unpacking CPAN Modules on DOS
+
+First, download the module package from CPAN (e.g., the "Comma Separated
+Value" text package, Text-CSV-0.01.tar.gz). Then expand the contents of
+the package into some location on your disk. Most CPAN modules are
+built with an internal directory structure, so it is usually safe to
+expand it in the root of your DJGPP installation. Some people prefer to
+locate source trees under /usr/src (i.e., C<($DJDIR)/usr/src>), but you may
+put it wherever seems most logical to you, *EXCEPT* under the same
+directory as your perl source code. There are special rules that apply
+to modules which live in the perl source tree that do not apply to most
+of the modules in CPAN.
+
+Unlike other DJGPP packages, which are normal "zip" files, most CPAN
+module packages are "gzipped tarballs". Recent versions of WinZip will
+safely unpack and expand them, *UNLESS* they have zero-length files. It
+is a known WinZip bug (as of v7.0) that it will not extract zero-length
+files.
+
+From the command line, you can use the djtar utility provided with DJGPP
+to unpack and expand these files. For example:
+
+ C:\djgpp>djtarx -v Text-CSV-0.01.tar.gz
+
+This will create the new directory C<($DJDIR)/Text-CSV-0.01>, filling
+it with the source for this module.
+
+=head2 Building Non-XS Modules on DOS
+
+To build a non-XS module, you can use the standard module-building
+instructions distributed with perl modules.
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+This is sufficient because non-XS modules install only ".pm" files and
+(sometimes) pod and/or man documentation. No re-linking of the perl
+binary is needed to build, install or use non-XS modules.
+
+=head2 Building XS Modules on DOS
+
+To build an XS module, you must use the standard module-building
+instructions distributed with perl modules *PLUS* three extra
+instructions specific to the DJGPP "static link" build environment.
+
+ set FNCASE=y
+ perl Makefile.PL
+ make
+ make perl
+ make test
+ make -f Makefile.aperl inst_perl MAP_TARGET=perl.exe
+ make install
+
+The first extra instruction sets DJGPP's FNCASE environment variable so
+that the new perl binary which you must build for an XS-type module will
+build correctly. The second extra instruction re-builds the perl binary
+in your module directory before you run "make test", so that you are
+testing with the new module code you built with "make". The third extra
+instruction installs the perl binary from your module directory into the
+standard DJGPP binary directory, C<($DJDIR)/bin>, replacing your
+previous perl binary.
+
+Note that the MAP_TARGET value *must* have the ".exe" extension or you
+will not create a "perl.exe" to replace the one in C<($DJDIR)/bin>.
+
+When you are done, the XS-module install process will have added information
+to your "perllocal" information telling that the perl binary has been replaced,
+and what module was installed. You can view this information at any time
+by using the command:
+
+ perl -S perldoc perllocal
+
+=head1 AUTHOR
+
+Laszlo Molnar, F<laszlo.molnar@eth.ericsson.se> [Installing/building perl]
+
+Peter J. Farley III F<pjfarley@banet.net> [Building/installing modules]
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perldsc.pod b/Master/tlpkg/tlperl.straw/lib/pods/perldsc.pod
new file mode 100755
index 00000000000..db415343c1f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perldsc.pod
@@ -0,0 +1,847 @@
+=head1 NAME
+X<data structure> X<complex data structure> X<struct>
+
+perldsc - Perl Data Structures Cookbook
+
+=head1 DESCRIPTION
+
+The single feature most sorely lacking in the Perl programming language
+prior to its 5.0 release was complex data structures. Even without direct
+language support, some valiant programmers did manage to emulate them, but
+it was hard work and not for the faint of heart. You could occasionally
+get away with the C<$m{$AoA,$b}> notation borrowed from B<awk> in which the
+keys are actually more like a single concatenated string C<"$AoA$b">, but
+traversal and sorting were difficult. More desperate programmers even
+hacked Perl's internal symbol table directly, a strategy that proved hard
+to develop and maintain--to put it mildly.
+
+The 5.0 release of Perl let us have complex data structures. You
+may now write something like this and all of a sudden, you'd have an array
+with three dimensions!
+
+ for $x (1 .. 10) {
+ for $y (1 .. 10) {
+ for $z (1 .. 10) {
+ $AoA[$x][$y][$z] =
+ $x ** $y + $z;
+ }
+ }
+ }
+
+Alas, however simple this may appear, underneath it's a much more
+elaborate construct than meets the eye!
+
+How do you print it out? Why can't you say just C<print @AoA>? How do
+you sort it? How can you pass it to a function or get one of these back
+from a function? Is it an object? Can you save it to disk to read
+back later? How do you access whole rows or columns of that matrix? Do
+all the values have to be numeric?
+
+As you see, it's quite easy to become confused. While some small portion
+of the blame for this can be attributed to the reference-based
+implementation, it's really more due to a lack of existing documentation with
+examples designed for the beginner.
+
+This document is meant to be a detailed but understandable treatment of the
+many different sorts of data structures you might want to develop. It
+should also serve as a cookbook of examples. That way, when you need to
+create one of these complex data structures, you can just pinch, pilfer, or
+purloin a drop-in example from here.
+
+Let's look at each of these possible constructs in detail. There are separate
+sections on each of the following:
+
+=over 5
+
+=item * arrays of arrays
+
+=item * hashes of arrays
+
+=item * arrays of hashes
+
+=item * hashes of hashes
+
+=item * more elaborate constructs
+
+=back
+
+But for now, let's look at general issues common to all
+these types of data structures.
+
+=head1 REFERENCES
+X<reference> X<dereference> X<dereferencing> X<pointer>
+
+The most important thing to understand about all data structures in
+Perl--including multidimensional arrays--is that even though they might
+appear otherwise, Perl C<@ARRAY>s and C<%HASH>es are all internally
+one-dimensional. They can hold only scalar values (meaning a string,
+number, or a reference). They cannot directly contain other arrays or
+hashes, but instead contain I<references> to other arrays or hashes.
+X<multidimensional array> X<array, multidimensional>
+
+You can't use a reference to an array or hash in quite the same way that you
+would a real array or hash. For C or C++ programmers unused to
+distinguishing between arrays and pointers to the same, this can be
+confusing. If so, just think of it as the difference between a structure
+and a pointer to a structure.
+
+You can (and should) read more about references in the perlref(1) man
+page. Briefly, references are rather like pointers that know what they
+point to. (Objects are also a kind of reference, but we won't be needing
+them right away--if ever.) This means that when you have something which
+looks to you like an access to a two-or-more-dimensional array and/or hash,
+what's really going on is that the base type is
+merely a one-dimensional entity that contains references to the next
+level. It's just that you can I<use> it as though it were a
+two-dimensional one. This is actually the way almost all C
+multidimensional arrays work as well.
+
+ $array[7][12] # array of arrays
+ $array[7]{string} # array of hashes
+ $hash{string}[7] # hash of arrays
+ $hash{string}{'another string'} # hash of hashes
+
+Now, because the top level contains only references, if you try to print
+out your array in with a simple print() function, you'll get something
+that doesn't look very nice, like this:
+
+ @AoA = ( [2, 3], [4, 5, 7], [0] );
+ print $AoA[1][2];
+ 7
+ print @AoA;
+ ARRAY(0x83c38)ARRAY(0x8b194)ARRAY(0x8b1d0)
+
+
+That's because Perl doesn't (ever) implicitly dereference your variables.
+If you want to get at the thing a reference is referring to, then you have
+to do this yourself using either prefix typing indicators, like
+C<${$blah}>, C<@{$blah}>, C<@{$blah[$i]}>, or else postfix pointer arrows,
+like C<$a-E<gt>[3]>, C<$h-E<gt>{fred}>, or even C<$ob-E<gt>method()-E<gt>[3]>.
+
+=head1 COMMON MISTAKES
+
+The two most common mistakes made in constructing something like
+an array of arrays is either accidentally counting the number of
+elements or else taking a reference to the same memory location
+repeatedly. Here's the case where you just get the count instead
+of a nested array:
+
+ for $i (1..10) {
+ @array = somefunc($i);
+ $AoA[$i] = @array; # WRONG!
+ }
+
+That's just the simple case of assigning an array to a scalar and getting
+its element count. If that's what you really and truly want, then you
+might do well to consider being a tad more explicit about it, like this:
+
+ for $i (1..10) {
+ @array = somefunc($i);
+ $counts[$i] = scalar @array;
+ }
+
+Here's the case of taking a reference to the same memory location
+again and again:
+
+ for $i (1..10) {
+ @array = somefunc($i);
+ $AoA[$i] = \@array; # WRONG!
+ }
+
+So, what's the big problem with that? It looks right, doesn't it?
+After all, I just told you that you need an array of references, so by
+golly, you've made me one!
+
+Unfortunately, while this is true, it's still broken. All the references
+in @AoA refer to the I<very same place>, and they will therefore all hold
+whatever was last in @array! It's similar to the problem demonstrated in
+the following C program:
+
+ #include <pwd.h>
+ main() {
+ struct passwd *getpwnam(), *rp, *dp;
+ rp = getpwnam("root");
+ dp = getpwnam("daemon");
+
+ printf("daemon name is %s\nroot name is %s\n",
+ dp->pw_name, rp->pw_name);
+ }
+
+Which will print
+
+ daemon name is daemon
+ root name is daemon
+
+The problem is that both C<rp> and C<dp> are pointers to the same location
+in memory! In C, you'd have to remember to malloc() yourself some new
+memory. In Perl, you'll want to use the array constructor C<[]> or the
+hash constructor C<{}> instead. Here's the right way to do the preceding
+broken code fragments:
+X<[]> X<{}>
+
+ for $i (1..10) {
+ @array = somefunc($i);
+ $AoA[$i] = [ @array ];
+ }
+
+The square brackets make a reference to a new array with a I<copy>
+of what's in @array at the time of the assignment. This is what
+you want.
+
+Note that this will produce something similar, but it's
+much harder to read:
+
+ for $i (1..10) {
+ @array = 0 .. $i;
+ @{$AoA[$i]} = @array;
+ }
+
+Is it the same? Well, maybe so--and maybe not. The subtle difference
+is that when you assign something in square brackets, you know for sure
+it's always a brand new reference with a new I<copy> of the data.
+Something else could be going on in this new case with the C<@{$AoA[$i]}>
+dereference on the left-hand-side of the assignment. It all depends on
+whether C<$AoA[$i]> had been undefined to start with, or whether it
+already contained a reference. If you had already populated @AoA with
+references, as in
+
+ $AoA[3] = \@another_array;
+
+Then the assignment with the indirection on the left-hand-side would
+use the existing reference that was already there:
+
+ @{$AoA[3]} = @array;
+
+Of course, this I<would> have the "interesting" effect of clobbering
+@another_array. (Have you ever noticed how when a programmer says
+something is "interesting", that rather than meaning "intriguing",
+they're disturbingly more apt to mean that it's "annoying",
+"difficult", or both? :-)
+
+So just remember always to use the array or hash constructors with C<[]>
+or C<{}>, and you'll be fine, although it's not always optimally
+efficient.
+
+Surprisingly, the following dangerous-looking construct will
+actually work out fine:
+
+ for $i (1..10) {
+ my @array = somefunc($i);
+ $AoA[$i] = \@array;
+ }
+
+That's because my() is more of a run-time statement than it is a
+compile-time declaration I<per se>. This means that the my() variable is
+remade afresh each time through the loop. So even though it I<looks> as
+though you stored the same variable reference each time, you actually did
+not! This is a subtle distinction that can produce more efficient code at
+the risk of misleading all but the most experienced of programmers. So I
+usually advise against teaching it to beginners. In fact, except for
+passing arguments to functions, I seldom like to see the gimme-a-reference
+operator (backslash) used much at all in code. Instead, I advise
+beginners that they (and most of the rest of us) should try to use the
+much more easily understood constructors C<[]> and C<{}> instead of
+relying upon lexical (or dynamic) scoping and hidden reference-counting to
+do the right thing behind the scenes.
+
+In summary:
+
+ $AoA[$i] = [ @array ]; # usually best
+ $AoA[$i] = \@array; # perilous; just how my() was that array?
+ @{ $AoA[$i] } = @array; # way too tricky for most programmers
+
+
+=head1 CAVEAT ON PRECEDENCE
+X<dereference, precedence> X<dereferencing, precedence>
+
+Speaking of things like C<@{$AoA[$i]}>, the following are actually the
+same thing:
+X<< -> >>
+
+ $aref->[2][2] # clear
+ $$aref[2][2] # confusing
+
+That's because Perl's precedence rules on its five prefix dereferencers
+(which look like someone swearing: C<$ @ * % &>) make them bind more
+tightly than the postfix subscripting brackets or braces! This will no
+doubt come as a great shock to the C or C++ programmer, who is quite
+accustomed to using C<*a[i]> to mean what's pointed to by the I<i'th>
+element of C<a>. That is, they first take the subscript, and only then
+dereference the thing at that subscript. That's fine in C, but this isn't C.
+
+The seemingly equivalent construct in Perl, C<$$aref[$i]> first does
+the deref of $aref, making it take $aref as a reference to an
+array, and then dereference that, and finally tell you the I<i'th> value
+of the array pointed to by $AoA. If you wanted the C notion, you'd have to
+write C<${$AoA[$i]}> to force the C<$AoA[$i]> to get evaluated first
+before the leading C<$> dereferencer.
+
+=head1 WHY YOU SHOULD ALWAYS C<use strict>
+
+If this is starting to sound scarier than it's worth, relax. Perl has
+some features to help you avoid its most common pitfalls. The best
+way to avoid getting confused is to start every program like this:
+
+ #!/usr/bin/perl -w
+ use strict;
+
+This way, you'll be forced to declare all your variables with my() and
+also disallow accidental "symbolic dereferencing". Therefore if you'd done
+this:
+
+ my $aref = [
+ [ "fred", "barney", "pebbles", "bambam", "dino", ],
+ [ "homer", "bart", "marge", "maggie", ],
+ [ "george", "jane", "elroy", "judy", ],
+ ];
+
+ print $aref[2][2];
+
+The compiler would immediately flag that as an error I<at compile time>,
+because you were accidentally accessing C<@aref>, an undeclared
+variable, and it would thereby remind you to write instead:
+
+ print $aref->[2][2]
+
+=head1 DEBUGGING
+X<data structure, debugging> X<complex data structure, debugging>
+X<AoA, debugging> X<HoA, debugging> X<AoH, debugging> X<HoH, debugging>
+X<array of arrays, debugging> X<hash of arrays, debugging>
+X<array of hashes, debugging> X<hash of hashes, debugging>
+
+Before version 5.002, the standard Perl debugger didn't do a very nice job of
+printing out complex data structures. With 5.002 or above, the
+debugger includes several new features, including command line editing as
+well as the C<x> command to dump out complex data structures. For
+example, given the assignment to $AoA above, here's the debugger output:
+
+ DB<1> x $AoA
+ $AoA = ARRAY(0x13b5a0)
+ 0 ARRAY(0x1f0a24)
+ 0 'fred'
+ 1 'barney'
+ 2 'pebbles'
+ 3 'bambam'
+ 4 'dino'
+ 1 ARRAY(0x13b558)
+ 0 'homer'
+ 1 'bart'
+ 2 'marge'
+ 3 'maggie'
+ 2 ARRAY(0x13b540)
+ 0 'george'
+ 1 'jane'
+ 2 'elroy'
+ 3 'judy'
+
+=head1 CODE EXAMPLES
+
+Presented with little comment (these will get their own manpages someday)
+here are short code examples illustrating access of various
+types of data structures.
+
+=head1 ARRAYS OF ARRAYS
+X<array of arrays> X<AoA>
+
+=head2 Declaration of an ARRAY OF ARRAYS
+
+ @AoA = (
+ [ "fred", "barney" ],
+ [ "george", "jane", "elroy" ],
+ [ "homer", "marge", "bart" ],
+ );
+
+=head2 Generation of an ARRAY OF ARRAYS
+
+ # reading from file
+ while ( <> ) {
+ push @AoA, [ split ];
+ }
+
+ # calling a function
+ for $i ( 1 .. 10 ) {
+ $AoA[$i] = [ somefunc($i) ];
+ }
+
+ # using temp vars
+ for $i ( 1 .. 10 ) {
+ @tmp = somefunc($i);
+ $AoA[$i] = [ @tmp ];
+ }
+
+ # add to an existing row
+ push @{ $AoA[0] }, "wilma", "betty";
+
+=head2 Access and Printing of an ARRAY OF ARRAYS
+
+ # one element
+ $AoA[0][0] = "Fred";
+
+ # another element
+ $AoA[1][1] =~ s/(\w)/\u$1/;
+
+ # print the whole thing with refs
+ for $aref ( @AoA ) {
+ print "\t [ @$aref ],\n";
+ }
+
+ # print the whole thing with indices
+ for $i ( 0 .. $#AoA ) {
+ print "\t [ @{$AoA[$i]} ],\n";
+ }
+
+ # print the whole thing one at a time
+ for $i ( 0 .. $#AoA ) {
+ for $j ( 0 .. $#{ $AoA[$i] } ) {
+ print "elt $i $j is $AoA[$i][$j]\n";
+ }
+ }
+
+=head1 HASHES OF ARRAYS
+X<hash of arrays> X<HoA>
+
+=head2 Declaration of a HASH OF ARRAYS
+
+ %HoA = (
+ flintstones => [ "fred", "barney" ],
+ jetsons => [ "george", "jane", "elroy" ],
+ simpsons => [ "homer", "marge", "bart" ],
+ );
+
+=head2 Generation of a HASH OF ARRAYS
+
+ # reading from file
+ # flintstones: fred barney wilma dino
+ while ( <> ) {
+ next unless s/^(.*?):\s*//;
+ $HoA{$1} = [ split ];
+ }
+
+ # reading from file; more temps
+ # flintstones: fred barney wilma dino
+ while ( $line = <> ) {
+ ($who, $rest) = split /:\s*/, $line, 2;
+ @fields = split ' ', $rest;
+ $HoA{$who} = [ @fields ];
+ }
+
+ # calling a function that returns a list
+ for $group ( "simpsons", "jetsons", "flintstones" ) {
+ $HoA{$group} = [ get_family($group) ];
+ }
+
+ # likewise, but using temps
+ for $group ( "simpsons", "jetsons", "flintstones" ) {
+ @members = get_family($group);
+ $HoA{$group} = [ @members ];
+ }
+
+ # append new members to an existing family
+ push @{ $HoA{"flintstones"} }, "wilma", "betty";
+
+=head2 Access and Printing of a HASH OF ARRAYS
+
+ # one element
+ $HoA{flintstones}[0] = "Fred";
+
+ # another element
+ $HoA{simpsons}[1] =~ s/(\w)/\u$1/;
+
+ # print the whole thing
+ foreach $family ( keys %HoA ) {
+ print "$family: @{ $HoA{$family} }\n"
+ }
+
+ # print the whole thing with indices
+ foreach $family ( keys %HoA ) {
+ print "family: ";
+ foreach $i ( 0 .. $#{ $HoA{$family} } ) {
+ print " $i = $HoA{$family}[$i]";
+ }
+ print "\n";
+ }
+
+ # print the whole thing sorted by number of members
+ foreach $family ( sort { @{$HoA{$b}} <=> @{$HoA{$a}} } keys %HoA ) {
+ print "$family: @{ $HoA{$family} }\n"
+ }
+
+ # print the whole thing sorted by number of members and name
+ foreach $family ( sort {
+ @{$HoA{$b}} <=> @{$HoA{$a}}
+ ||
+ $a cmp $b
+ } keys %HoA )
+ {
+ print "$family: ", join(", ", sort @{ $HoA{$family} }), "\n";
+ }
+
+=head1 ARRAYS OF HASHES
+X<array of hashes> X<AoH>
+
+=head2 Declaration of an ARRAY OF HASHES
+
+ @AoH = (
+ {
+ Lead => "fred",
+ Friend => "barney",
+ },
+ {
+ Lead => "george",
+ Wife => "jane",
+ Son => "elroy",
+ },
+ {
+ Lead => "homer",
+ Wife => "marge",
+ Son => "bart",
+ }
+ );
+
+=head2 Generation of an ARRAY OF HASHES
+
+ # reading from file
+ # format: LEAD=fred FRIEND=barney
+ while ( <> ) {
+ $rec = {};
+ for $field ( split ) {
+ ($key, $value) = split /=/, $field;
+ $rec->{$key} = $value;
+ }
+ push @AoH, $rec;
+ }
+
+
+ # reading from file
+ # format: LEAD=fred FRIEND=barney
+ # no temp
+ while ( <> ) {
+ push @AoH, { split /[\s+=]/ };
+ }
+
+ # calling a function that returns a key/value pair list, like
+ # "lead","fred","daughter","pebbles"
+ while ( %fields = getnextpairset() ) {
+ push @AoH, { %fields };
+ }
+
+ # likewise, but using no temp vars
+ while (<>) {
+ push @AoH, { parsepairs($_) };
+ }
+
+ # add key/value to an element
+ $AoH[0]{pet} = "dino";
+ $AoH[2]{pet} = "santa's little helper";
+
+=head2 Access and Printing of an ARRAY OF HASHES
+
+ # one element
+ $AoH[0]{lead} = "fred";
+
+ # another element
+ $AoH[1]{lead} =~ s/(\w)/\u$1/;
+
+ # print the whole thing with refs
+ for $href ( @AoH ) {
+ print "{ ";
+ for $role ( keys %$href ) {
+ print "$role=$href->{$role} ";
+ }
+ print "}\n";
+ }
+
+ # print the whole thing with indices
+ for $i ( 0 .. $#AoH ) {
+ print "$i is { ";
+ for $role ( keys %{ $AoH[$i] } ) {
+ print "$role=$AoH[$i]{$role} ";
+ }
+ print "}\n";
+ }
+
+ # print the whole thing one at a time
+ for $i ( 0 .. $#AoH ) {
+ for $role ( keys %{ $AoH[$i] } ) {
+ print "elt $i $role is $AoH[$i]{$role}\n";
+ }
+ }
+
+=head1 HASHES OF HASHES
+X<hash of hashes> X<HoH>
+
+=head2 Declaration of a HASH OF HASHES
+
+ %HoH = (
+ flintstones => {
+ lead => "fred",
+ pal => "barney",
+ },
+ jetsons => {
+ lead => "george",
+ wife => "jane",
+ "his boy" => "elroy",
+ },
+ simpsons => {
+ lead => "homer",
+ wife => "marge",
+ kid => "bart",
+ },
+ );
+
+=head2 Generation of a HASH OF HASHES
+
+ # reading from file
+ # flintstones: lead=fred pal=barney wife=wilma pet=dino
+ while ( <> ) {
+ next unless s/^(.*?):\s*//;
+ $who = $1;
+ for $field ( split ) {
+ ($key, $value) = split /=/, $field;
+ $HoH{$who}{$key} = $value;
+ }
+
+
+ # reading from file; more temps
+ while ( <> ) {
+ next unless s/^(.*?):\s*//;
+ $who = $1;
+ $rec = {};
+ $HoH{$who} = $rec;
+ for $field ( split ) {
+ ($key, $value) = split /=/, $field;
+ $rec->{$key} = $value;
+ }
+ }
+
+ # calling a function that returns a key,value hash
+ for $group ( "simpsons", "jetsons", "flintstones" ) {
+ $HoH{$group} = { get_family($group) };
+ }
+
+ # likewise, but using temps
+ for $group ( "simpsons", "jetsons", "flintstones" ) {
+ %members = get_family($group);
+ $HoH{$group} = { %members };
+ }
+
+ # append new members to an existing family
+ %new_folks = (
+ wife => "wilma",
+ pet => "dino",
+ );
+
+ for $what (keys %new_folks) {
+ $HoH{flintstones}{$what} = $new_folks{$what};
+ }
+
+=head2 Access and Printing of a HASH OF HASHES
+
+ # one element
+ $HoH{flintstones}{wife} = "wilma";
+
+ # another element
+ $HoH{simpsons}{lead} =~ s/(\w)/\u$1/;
+
+ # print the whole thing
+ foreach $family ( keys %HoH ) {
+ print "$family: { ";
+ for $role ( keys %{ $HoH{$family} } ) {
+ print "$role=$HoH{$family}{$role} ";
+ }
+ print "}\n";
+ }
+
+ # print the whole thing somewhat sorted
+ foreach $family ( sort keys %HoH ) {
+ print "$family: { ";
+ for $role ( sort keys %{ $HoH{$family} } ) {
+ print "$role=$HoH{$family}{$role} ";
+ }
+ print "}\n";
+ }
+
+
+ # print the whole thing sorted by number of members
+ foreach $family ( sort { keys %{$HoH{$b}} <=> keys %{$HoH{$a}} } keys %HoH ) {
+ print "$family: { ";
+ for $role ( sort keys %{ $HoH{$family} } ) {
+ print "$role=$HoH{$family}{$role} ";
+ }
+ print "}\n";
+ }
+
+ # establish a sort order (rank) for each role
+ $i = 0;
+ for ( qw(lead wife son daughter pal pet) ) { $rank{$_} = ++$i }
+
+ # now print the whole thing sorted by number of members
+ foreach $family ( sort { keys %{ $HoH{$b} } <=> keys %{ $HoH{$a} } } keys %HoH ) {
+ print "$family: { ";
+ # and print these according to rank order
+ for $role ( sort { $rank{$a} <=> $rank{$b} } keys %{ $HoH{$family} } ) {
+ print "$role=$HoH{$family}{$role} ";
+ }
+ print "}\n";
+ }
+
+
+=head1 MORE ELABORATE RECORDS
+X<record> X<structure> X<struct>
+
+=head2 Declaration of MORE ELABORATE RECORDS
+
+Here's a sample showing how to create and use a record whose fields are of
+many different sorts:
+
+ $rec = {
+ TEXT => $string,
+ SEQUENCE => [ @old_values ],
+ LOOKUP => { %some_table },
+ THATCODE => \&some_function,
+ THISCODE => sub { $_[0] ** $_[1] },
+ HANDLE => \*STDOUT,
+ };
+
+ print $rec->{TEXT};
+
+ print $rec->{SEQUENCE}[0];
+ $last = pop @ { $rec->{SEQUENCE} };
+
+ print $rec->{LOOKUP}{"key"};
+ ($first_k, $first_v) = each %{ $rec->{LOOKUP} };
+
+ $answer = $rec->{THATCODE}->($arg);
+ $answer = $rec->{THISCODE}->($arg1, $arg2);
+
+ # careful of extra block braces on fh ref
+ print { $rec->{HANDLE} } "a string\n";
+
+ use FileHandle;
+ $rec->{HANDLE}->autoflush(1);
+ $rec->{HANDLE}->print(" a string\n");
+
+=head2 Declaration of a HASH OF COMPLEX RECORDS
+
+ %TV = (
+ flintstones => {
+ series => "flintstones",
+ nights => [ qw(monday thursday friday) ],
+ members => [
+ { name => "fred", role => "lead", age => 36, },
+ { name => "wilma", role => "wife", age => 31, },
+ { name => "pebbles", role => "kid", age => 4, },
+ ],
+ },
+
+ jetsons => {
+ series => "jetsons",
+ nights => [ qw(wednesday saturday) ],
+ members => [
+ { name => "george", role => "lead", age => 41, },
+ { name => "jane", role => "wife", age => 39, },
+ { name => "elroy", role => "kid", age => 9, },
+ ],
+ },
+
+ simpsons => {
+ series => "simpsons",
+ nights => [ qw(monday) ],
+ members => [
+ { name => "homer", role => "lead", age => 34, },
+ { name => "marge", role => "wife", age => 37, },
+ { name => "bart", role => "kid", age => 11, },
+ ],
+ },
+ );
+
+=head2 Generation of a HASH OF COMPLEX RECORDS
+
+ # reading from file
+ # this is most easily done by having the file itself be
+ # in the raw data format as shown above. perl is happy
+ # to parse complex data structures if declared as data, so
+ # sometimes it's easiest to do that
+
+ # here's a piece by piece build up
+ $rec = {};
+ $rec->{series} = "flintstones";
+ $rec->{nights} = [ find_days() ];
+
+ @members = ();
+ # assume this file in field=value syntax
+ while (<>) {
+ %fields = split /[\s=]+/;
+ push @members, { %fields };
+ }
+ $rec->{members} = [ @members ];
+
+ # now remember the whole thing
+ $TV{ $rec->{series} } = $rec;
+
+ ###########################################################
+ # now, you might want to make interesting extra fields that
+ # include pointers back into the same data structure so if
+ # change one piece, it changes everywhere, like for example
+ # if you wanted a {kids} field that was a reference
+ # to an array of the kids' records without having duplicate
+ # records and thus update problems.
+ ###########################################################
+ foreach $family (keys %TV) {
+ $rec = $TV{$family}; # temp pointer
+ @kids = ();
+ for $person ( @{ $rec->{members} } ) {
+ if ($person->{role} =~ /kid|son|daughter/) {
+ push @kids, $person;
+ }
+ }
+ # REMEMBER: $rec and $TV{$family} point to same data!!
+ $rec->{kids} = [ @kids ];
+ }
+
+ # you copied the array, but the array itself contains pointers
+ # to uncopied objects. this means that if you make bart get
+ # older via
+
+ $TV{simpsons}{kids}[0]{age}++;
+
+ # then this would also change in
+ print $TV{simpsons}{members}[2]{age};
+
+ # because $TV{simpsons}{kids}[0] and $TV{simpsons}{members}[2]
+ # both point to the same underlying anonymous hash table
+
+ # print the whole thing
+ foreach $family ( keys %TV ) {
+ print "the $family";
+ print " is on during @{ $TV{$family}{nights} }\n";
+ print "its members are:\n";
+ for $who ( @{ $TV{$family}{members} } ) {
+ print " $who->{name} ($who->{role}), age $who->{age}\n";
+ }
+ print "it turns out that $TV{$family}{lead} has ";
+ print scalar ( @{ $TV{$family}{kids} } ), " kids named ";
+ print join (", ", map { $_->{name} } @{ $TV{$family}{kids} } );
+ print "\n";
+ }
+
+=head1 Database Ties
+
+You cannot easily tie a multilevel data structure (such as a hash of
+hashes) to a dbm file. The first problem is that all but GDBM and
+Berkeley DB have size limitations, but beyond that, you also have problems
+with how references are to be represented on disk. One experimental
+module that does partially attempt to address this need is the MLDBM
+module. Check your nearest CPAN site as described in L<perlmodlib> for
+source code to MLDBM.
+
+=head1 SEE ALSO
+
+perlref(1), perllol(1), perldata(1), perlobj(1)
+
+=head1 AUTHOR
+
+Tom Christiansen <F<tchrist@perl.com>>
+
+Last update:
+Wed Oct 23 04:57:50 MET DST 1996
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlebcdic.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlebcdic.pod
new file mode 100755
index 00000000000..39ed61279cb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlebcdic.pod
@@ -0,0 +1,1427 @@
+=head1 NAME
+
+perlebcdic - Considerations for running Perl on EBCDIC platforms
+
+=head1 DESCRIPTION
+
+An exploration of some of the issues facing Perl programmers
+on EBCDIC based computers. We do not cover localization,
+internationalization, or multi byte character set issues other
+than some discussion of UTF-8 and UTF-EBCDIC.
+
+Portions that are still incomplete are marked with XXX.
+
+=head1 COMMON CHARACTER CODE SETS
+
+=head2 ASCII
+
+The American Standard Code for Information Interchange (ASCII or US-ASCII) is a
+set of
+integers running from 0 to 127 (decimal) that imply character
+interpretation by the display and other systems of computers.
+The range 0..127 can be covered by setting the bits in a 7-bit binary
+digit, hence the set is sometimes referred to as a "7-bit ASCII".
+ASCII was described by the American National Standards Institute
+document ANSI X3.4-1986. It was also described by ISO 646:1991
+(with localization for currency symbols). The full ASCII set is
+given in the table below as the first 128 elements. Languages that
+can be written adequately with the characters in ASCII include
+English, Hawaiian, Indonesian, Swahili and some Native American
+languages.
+
+There are many character sets that extend the range of integers
+from 0..2**7-1 up to 2**8-1, or 8 bit bytes (octets if you prefer).
+One common one is the ISO 8859-1 character set.
+
+=head2 ISO 8859
+
+The ISO 8859-$n are a collection of character code sets from the
+International Organization for Standardization (ISO) each of which
+adds characters to the ASCII set that are typically found in European
+languages many of which are based on the Roman, or Latin, alphabet.
+
+=head2 Latin 1 (ISO 8859-1)
+
+A particular 8-bit extension to ASCII that includes grave and acute
+accented Latin characters. Languages that can employ ISO 8859-1
+include all the languages covered by ASCII as well as Afrikaans,
+Albanian, Basque, Catalan, Danish, Faroese, Finnish, Norwegian,
+Portuguese, Spanish, and Swedish. Dutch is covered albeit without
+the ij ligature. French is covered too but without the oe ligature.
+German can use ISO 8859-1 but must do so without German-style
+quotation marks. This set is based on Western European extensions
+to ASCII and is commonly encountered in world wide web work.
+In IBM character code set identification terminology ISO 8859-1 is
+also known as CCSID 819 (or sometimes 0819 or even 00819).
+
+=head2 EBCDIC
+
+The Extended Binary Coded Decimal Interchange Code refers to a
+large collection of slightly different single and multi byte
+coded character sets that are different from ASCII or ISO 8859-1
+and typically run on host computers. The EBCDIC encodings derive
+from 8 bit byte extensions of Hollerith punched card encodings.
+The layout on the cards was such that high bits were set for the
+upper and lower case alphabet characters [a-z] and [A-Z], but there
+were gaps within each Latin alphabet range.
+
+Some IBM EBCDIC character sets may be known by character code set
+identification numbers (CCSID numbers) or code page numbers. Leading
+zero digits in CCSID numbers within this document are insignificant.
+E.g. CCSID 0037 may be referred to as 37 in places.
+
+Perl can be compiled on platforms that run any of three commonly used EBCDIC
+character sets, listed below.
+
+=head2 The 13 variant characters
+
+Among IBM EBCDIC character code sets there are 13 characters that
+are often mapped to different integer values. Those characters
+are known as the 13 "variant" characters and are:
+
+ \ [ ] { } ^ ~ ! # | $ @ `
+
+When Perl is compiled for a platform, it looks at some of these characters to
+guess which EBCDIC character set the platform uses, and adapts itself
+accordingly to that platform. If the platform uses a character set that is not
+one of the three Perl knows about, Perl will either fail to compile, or
+mistakenly and silently choose one of the three.
+They are:
+
+=head2 0037
+
+Character code set ID 0037 is a mapping of the ASCII plus Latin-1
+characters (i.e. ISO 8859-1) to an EBCDIC set. 0037 is used
+in North American English locales on the OS/400 operating system
+that runs on AS/400 computers. CCSID 37 differs from ISO 8859-1
+in 237 places, in other words they agree on only 19 code point values.
+
+=head2 1047
+
+Character code set ID 1047 is also a mapping of the ASCII plus
+Latin-1 characters (i.e. ISO 8859-1) to an EBCDIC set. 1047 is
+used under Unix System Services for OS/390 or z/OS, and OpenEdition
+for VM/ESA. CCSID 1047 differs from CCSID 0037 in eight places.
+
+=head2 POSIX-BC
+
+The EBCDIC code page in use on Siemens' BS2000 system is distinct from
+1047 and 0037. It is identified below as the POSIX-BC set.
+
+=head2 Unicode code points versus EBCDIC code points
+
+In Unicode terminology a I<code point> is the number assigned to a
+character: for example, in EBCDIC the character "A" is usually assigned
+the number 193. In Unicode the character "A" is assigned the number 65.
+This causes a problem with the semantics of the pack/unpack "U", which
+are supposed to pack Unicode code points to characters and back to numbers.
+The problem is: which code points to use for code points less than 256?
+(for 256 and over there's no problem: Unicode code points are used)
+In EBCDIC, for the low 256 the EBCDIC code points are used. This
+means that the equivalences
+
+ pack("U", ord($character)) eq $character
+ unpack("U", $character) == ord $character
+
+will hold. (If Unicode code points were applied consistently over
+all the possible code points, pack("U",ord("A")) would in EBCDIC
+equal I<A with acute> or chr(101), and unpack("U", "A") would equal
+65, or I<non-breaking space>, not 193, or ord "A".)
+
+=head2 Remaining Perl Unicode problems in EBCDIC
+
+=over 4
+
+=item *
+
+Many of the remaining problems seem to be related to case-insensitive matching
+
+=item *
+
+The extensions Unicode::Collate and Unicode::Normalized are not
+supported under EBCDIC, likewise for the encoding pragma.
+
+=back
+
+=head2 Unicode and UTF
+
+UTF stands for C<Unicode Transformation Format>.
+UTF-8 is an encoding of Unicode into a sequence of 8-bit byte chunks, based on
+ASCII and Latin-1.
+The length of a sequence required to represent a Unicode code point
+depends on the ordinal number of that code point,
+with larger numbers requiring more bytes.
+UTF-EBCDIC is like UTF-8, but based on EBCDIC.
+
+You may see the term C<invariant> character or code point.
+This simply means that the character has the same numeric
+value when encoded as when not.
+(Note that this is a very different concept from L</The 13 variant characters>
+mentioned above.)
+For example, the ordinal value of 'A' is 193 in most EBCDIC code pages,
+and also is 193 when encoded in UTF-EBCDIC.
+All other code points occupy at least two bytes when encoded.
+In UTF-8, the code points corresponding to the lowest 128
+ordinal numbers (0 - 127: the ASCII characters) are invariant.
+In UTF-EBCDIC, there are 160 invariant characters.
+(If you care, the EBCDIC invariants are those characters
+which have ASCII equivalents, plus those that correspond to
+the C1 controls (80..9f on ASCII platforms).)
+
+A string encoded in UTF-EBCDIC may be longer (but never shorter) than
+one encoded in UTF-8.
+
+=head2 Using Encode
+
+Starting from Perl 5.8 you can use the standard new module Encode
+to translate from EBCDIC to Latin-1 code points.
+Encode knows about more EBCDIC character sets than Perl can currently
+be compiled to run on.
+
+ use Encode 'from_to';
+
+ my %ebcdic = ( 176 => 'cp37', 95 => 'cp1047', 106 => 'posix-bc' );
+
+ # $a is in EBCDIC code points
+ from_to($a, $ebcdic{ord '^'}, 'latin1');
+ # $a is ISO 8859-1 code points
+
+and from Latin-1 code points to EBCDIC code points
+
+ use Encode 'from_to';
+
+ my %ebcdic = ( 176 => 'cp37', 95 => 'cp1047', 106 => 'posix-bc' );
+
+ # $a is ISO 8859-1 code points
+ from_to($a, 'latin1', $ebcdic{ord '^'});
+ # $a is in EBCDIC code points
+
+For doing I/O it is suggested that you use the autotranslating features
+of PerlIO, see L<perluniintro>.
+
+Since version 5.8 Perl uses the new PerlIO I/O library. This enables
+you to use different encodings per IO channel. For example you may use
+
+ use Encode;
+ open($f, ">:encoding(ascii)", "test.ascii");
+ print $f "Hello World!\n";
+ open($f, ">:encoding(cp37)", "test.ebcdic");
+ print $f "Hello World!\n";
+ open($f, ">:encoding(latin1)", "test.latin1");
+ print $f "Hello World!\n";
+ open($f, ">:encoding(utf8)", "test.utf8");
+ print $f "Hello World!\n";
+
+to get four files containing "Hello World!\n" in ASCII, CP 37 EBCDIC,
+ISO 8859-1 (Latin-1) (in this example identical to ASCII since only ASCII
+characters were printed), and
+UTF-EBCDIC (in this example identical to normal EBCDIC since only characters
+that don't differ between EBCDIC and UTF-EBCDIC were printed). See the
+documentation of Encode::PerlIO for details.
+
+As the PerlIO layer uses raw IO (bytes) internally, all this totally
+ignores things like the type of your filesystem (ASCII or EBCDIC).
+
+=head1 SINGLE OCTET TABLES
+
+The following tables list the ASCII and Latin 1 ordered sets including
+the subsets: C0 controls (0..31), ASCII graphics (32..7e), delete (7f),
+C1 controls (80..9f), and Latin-1 (a.k.a. ISO 8859-1) (a0..ff). In the
+table non-printing control character names as well as the Latin 1
+extensions to ASCII have been labelled with character names roughly
+corresponding to I<The Unicode Standard, Version 3.0> albeit with
+substitutions such as s/LATIN// and s/VULGAR// in all cases,
+s/CAPITAL LETTER// in some cases, and s/SMALL LETTER ([A-Z])/\l$1/
+in some other cases (the C<charnames> pragma names unfortunately do
+not list explicit names for the C0 or C1 control characters). The
+"names" of the C1 control set (128..159 in ISO 8859-1) listed here are
+somewhat arbitrary. The differences between the 0037 and 1047 sets are
+flagged with ***. The differences between the 1047 and POSIX-BC sets
+are flagged with ###. All ord() numbers listed are decimal. If you
+would rather see this table listing octal values then run the table
+(that is, the pod version of this document since this recipe may not
+work with a pod2_other_format translation) through:
+
+=over 4
+
+=item recipe 0
+
+=back
+
+ perl -ne 'if(/(.{33})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)' \
+ -e '{printf("%s%-9o%-9o%-9o%o\n",$1,$2,$3,$4,$5)}' perlebcdic.pod
+
+If you want to retain the UTF-x code points then in script form you
+might want to write:
+
+=over 4
+
+=item recipe 1
+
+=back
+
+ open(FH,"<perlebcdic.pod") or die "Could not open perlebcdic.pod: $!";
+ while (<FH>) {
+ if (/(.{33})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\.?(\d*)\s+(\d+)\.?(\d*)/) {
+ if ($7 ne '' && $9 ne '') {
+ printf("%s%-9o%-9o%-9o%-9o%-3o.%-5o%-3o.%o\n",$1,$2,$3,$4,$5,$6,$7,$8,$9);
+ }
+ elsif ($7 ne '') {
+ printf("%s%-9o%-9o%-9o%-9o%-3o.%-5o%o\n",$1,$2,$3,$4,$5,$6,$7,$8);
+ }
+ else {
+ printf("%s%-9o%-9o%-9o%-9o%-9o%o\n",$1,$2,$3,$4,$5,$6,$8);
+ }
+ }
+ }
+
+If you would rather see this table listing hexadecimal values then
+run the table through:
+
+=over 4
+
+=item recipe 2
+
+=back
+
+ perl -ne 'if(/(.{33})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)' \
+ -e '{printf("%s%-9X%-9X%-9X%X\n",$1,$2,$3,$4,$5)}' perlebcdic.pod
+
+Or, in order to retain the UTF-x code points in hexadecimal:
+
+=over 4
+
+=item recipe 3
+
+=back
+
+ open(FH,"<perlebcdic.pod") or die "Could not open perlebcdic.pod: $!";
+ while (<FH>) {
+ if (/(.{33})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\.?(\d*)\s+(\d+)\.?(\d*)/) {
+ if ($7 ne '' && $9 ne '') {
+ printf("%s%-9X%-9X%-9X%-9X%-2X.%-6X%-2X.%X\n",$1,$2,$3,$4,$5,$6,$7,$8,$9);
+ }
+ elsif ($7 ne '') {
+ printf("%s%-9X%-9X%-9X%-9X%-2X.%-6X%X\n",$1,$2,$3,$4,$5,$6,$7,$8);
+ }
+ else {
+ printf("%s%-9X%-9X%-9X%-9X%-9X%X\n",$1,$2,$3,$4,$5,$6,$8);
+ }
+ }
+ }
+
+
+ incomp- incomp-
+ 8859-1 lete lete
+ chr 0819 0037 1047 POSIX-BC UTF-8 UTF-EBCDIC
+ ------------------------------------------------------------------------------------
+ <NULL> 0 0 0 0 0 0
+ <START OF HEADING> 1 1 1 1 1 1
+ <START OF TEXT> 2 2 2 2 2 2
+ <END OF TEXT> 3 3 3 3 3 3
+ <END OF TRANSMISSION> 4 55 55 55 4 55
+ <ENQUIRY> 5 45 45 45 5 45
+ <ACKNOWLEDGE> 6 46 46 46 6 46
+ <BELL> 7 47 47 47 7 47
+ <BACKSPACE> 8 22 22 22 8 22
+ <HORIZONTAL TABULATION> 9 5 5 5 9 5
+ <LINE FEED> 10 37 21 21 10 21 ***
+ <VERTICAL TABULATION> 11 11 11 11 11 11
+ <FORM FEED> 12 12 12 12 12 12
+ <CARRIAGE RETURN> 13 13 13 13 13 13
+ <SHIFT OUT> 14 14 14 14 14 14
+ <SHIFT IN> 15 15 15 15 15 15
+ <DATA LINK ESCAPE> 16 16 16 16 16 16
+ <DEVICE CONTROL ONE> 17 17 17 17 17 17
+ <DEVICE CONTROL TWO> 18 18 18 18 18 18
+ <DEVICE CONTROL THREE> 19 19 19 19 19 19
+ <DEVICE CONTROL FOUR> 20 60 60 60 20 60
+ <NEGATIVE ACKNOWLEDGE> 21 61 61 61 21 61
+ <SYNCHRONOUS IDLE> 22 50 50 50 22 50
+ <END OF TRANSMISSION BLOCK> 23 38 38 38 23 38
+ <CANCEL> 24 24 24 24 24 24
+ <END OF MEDIUM> 25 25 25 25 25 25
+ <SUBSTITUTE> 26 63 63 63 26 63
+ <ESCAPE> 27 39 39 39 27 39
+ <FILE SEPARATOR> 28 28 28 28 28 28
+ <GROUP SEPARATOR> 29 29 29 29 29 29
+ <RECORD SEPARATOR> 30 30 30 30 30 30
+ <UNIT SEPARATOR> 31 31 31 31 31 31
+ <SPACE> 32 64 64 64 32 64
+ ! 33 90 90 90 33 90
+ " 34 127 127 127 34 127
+ # 35 123 123 123 35 123
+ $ 36 91 91 91 36 91
+ % 37 108 108 108 37 108
+ & 38 80 80 80 38 80
+ ' 39 125 125 125 39 125
+ ( 40 77 77 77 40 77
+ ) 41 93 93 93 41 93
+ * 42 92 92 92 42 92
+ + 43 78 78 78 43 78
+ , 44 107 107 107 44 107
+ - 45 96 96 96 45 96
+ . 46 75 75 75 46 75
+ / 47 97 97 97 47 97
+ 0 48 240 240 240 48 240
+ 1 49 241 241 241 49 241
+ 2 50 242 242 242 50 242
+ 3 51 243 243 243 51 243
+ 4 52 244 244 244 52 244
+ 5 53 245 245 245 53 245
+ 6 54 246 246 246 54 246
+ 7 55 247 247 247 55 247
+ 8 56 248 248 248 56 248
+ 9 57 249 249 249 57 249
+ : 58 122 122 122 58 122
+ ; 59 94 94 94 59 94
+ < 60 76 76 76 60 76
+ = 61 126 126 126 61 126
+ > 62 110 110 110 62 110
+ ? 63 111 111 111 63 111
+ @ 64 124 124 124 64 124
+ A 65 193 193 193 65 193
+ B 66 194 194 194 66 194
+ C 67 195 195 195 67 195
+ D 68 196 196 196 68 196
+ E 69 197 197 197 69 197
+ F 70 198 198 198 70 198
+ G 71 199 199 199 71 199
+ H 72 200 200 200 72 200
+ I 73 201 201 201 73 201
+ J 74 209 209 209 74 209
+ K 75 210 210 210 75 210
+ L 76 211 211 211 76 211
+ M 77 212 212 212 77 212
+ N 78 213 213 213 78 213
+ O 79 214 214 214 79 214
+ P 80 215 215 215 80 215
+ Q 81 216 216 216 81 216
+ R 82 217 217 217 82 217
+ S 83 226 226 226 83 226
+ T 84 227 227 227 84 227
+ U 85 228 228 228 85 228
+ V 86 229 229 229 86 229
+ W 87 230 230 230 87 230
+ X 88 231 231 231 88 231
+ Y 89 232 232 232 89 232
+ Z 90 233 233 233 90 233
+ [ 91 186 173 187 91 173 *** ###
+ \ 92 224 224 188 92 224 ###
+ ] 93 187 189 189 93 189 ***
+ ^ 94 176 95 106 94 95 *** ###
+ _ 95 109 109 109 95 109
+ ` 96 121 121 74 96 121 ###
+ a 97 129 129 129 97 129
+ b 98 130 130 130 98 130
+ c 99 131 131 131 99 131
+ d 100 132 132 132 100 132
+ e 101 133 133 133 101 133
+ f 102 134 134 134 102 134
+ g 103 135 135 135 103 135
+ h 104 136 136 136 104 136
+ i 105 137 137 137 105 137
+ j 106 145 145 145 106 145
+ k 107 146 146 146 107 146
+ l 108 147 147 147 108 147
+ m 109 148 148 148 109 148
+ n 110 149 149 149 110 149
+ o 111 150 150 150 111 150
+ p 112 151 151 151 112 151
+ q 113 152 152 152 113 152
+ r 114 153 153 153 114 153
+ s 115 162 162 162 115 162
+ t 116 163 163 163 116 163
+ u 117 164 164 164 117 164
+ v 118 165 165 165 118 165
+ w 119 166 166 166 119 166
+ x 120 167 167 167 120 167
+ y 121 168 168 168 121 168
+ z 122 169 169 169 122 169
+ { 123 192 192 251 123 192 ###
+ | 124 79 79 79 124 79
+ } 125 208 208 253 125 208 ###
+ ~ 126 161 161 255 126 161 ###
+ <DELETE> 127 7 7 7 127 7
+ <C1 0> 128 32 32 32 194.128 32
+ <C1 1> 129 33 33 33 194.129 33
+ <C1 2> 130 34 34 34 194.130 34
+ <C1 3> 131 35 35 35 194.131 35
+ <C1 4> 132 36 36 36 194.132 36
+ <C1 5> 133 21 37 37 194.133 37 ***
+ <C1 6> 134 6 6 6 194.134 6
+ <C1 7> 135 23 23 23 194.135 23
+ <C1 8> 136 40 40 40 194.136 40
+ <C1 9> 137 41 41 41 194.137 41
+ <C1 10> 138 42 42 42 194.138 42
+ <C1 11> 139 43 43 43 194.139 43
+ <C1 12> 140 44 44 44 194.140 44
+ <C1 13> 141 9 9 9 194.141 9
+ <C1 14> 142 10 10 10 194.142 10
+ <C1 15> 143 27 27 27 194.143 27
+ <C1 16> 144 48 48 48 194.144 48
+ <C1 17> 145 49 49 49 194.145 49
+ <C1 18> 146 26 26 26 194.146 26
+ <C1 19> 147 51 51 51 194.147 51
+ <C1 20> 148 52 52 52 194.148 52
+ <C1 21> 149 53 53 53 194.149 53
+ <C1 22> 150 54 54 54 194.150 54
+ <C1 23> 151 8 8 8 194.151 8
+ <C1 24> 152 56 56 56 194.152 56
+ <C1 25> 153 57 57 57 194.153 57
+ <C1 26> 154 58 58 58 194.154 58
+ <C1 27> 155 59 59 59 194.155 59
+ <C1 28> 156 4 4 4 194.156 4
+ <C1 29> 157 20 20 20 194.157 20
+ <C1 30> 158 62 62 62 194.158 62
+ <C1 31> 159 255 255 95 194.159 255 ###
+ <NON-BREAKING SPACE> 160 65 65 65 194.160 128.65
+ <INVERTED EXCLAMATION MARK> 161 170 170 170 194.161 128.66
+ <CENT SIGN> 162 74 74 176 194.162 128.67 ###
+ <POUND SIGN> 163 177 177 177 194.163 128.68
+ <CURRENCY SIGN> 164 159 159 159 194.164 128.69
+ <YEN SIGN> 165 178 178 178 194.165 128.70
+ <BROKEN BAR> 166 106 106 208 194.166 128.71 ###
+ <SECTION SIGN> 167 181 181 181 194.167 128.72
+ <DIAERESIS> 168 189 187 121 194.168 128.73 *** ###
+ <COPYRIGHT SIGN> 169 180 180 180 194.169 128.74
+ <FEMININE ORDINAL INDICATOR> 170 154 154 154 194.170 128.81
+ <LEFT POINTING GUILLEMET> 171 138 138 138 194.171 128.82
+ <NOT SIGN> 172 95 176 186 194.172 128.83 *** ###
+ <SOFT HYPHEN> 173 202 202 202 194.173 128.84
+ <REGISTERED TRADE MARK SIGN> 174 175 175 175 194.174 128.85
+ <MACRON> 175 188 188 161 194.175 128.86 ###
+ <DEGREE SIGN> 176 144 144 144 194.176 128.87
+ <PLUS-OR-MINUS SIGN> 177 143 143 143 194.177 128.88
+ <SUPERSCRIPT TWO> 178 234 234 234 194.178 128.89
+ <SUPERSCRIPT THREE> 179 250 250 250 194.179 128.98
+ <ACUTE ACCENT> 180 190 190 190 194.180 128.99
+ <MICRO SIGN> 181 160 160 160 194.181 128.100
+ <PARAGRAPH SIGN> 182 182 182 182 194.182 128.101
+ <MIDDLE DOT> 183 179 179 179 194.183 128.102
+ <CEDILLA> 184 157 157 157 194.184 128.103
+ <SUPERSCRIPT ONE> 185 218 218 218 194.185 128.104
+ <MASC. ORDINAL INDICATOR> 186 155 155 155 194.186 128.105
+ <RIGHT POINTING GUILLEMET> 187 139 139 139 194.187 128.106
+ <FRACTION ONE QUARTER> 188 183 183 183 194.188 128.112
+ <FRACTION ONE HALF> 189 184 184 184 194.189 128.113
+ <FRACTION THREE QUARTERS> 190 185 185 185 194.190 128.114
+ <INVERTED QUESTION MARK> 191 171 171 171 194.191 128.115
+ <A WITH GRAVE> 192 100 100 100 195.128 138.65
+ <A WITH ACUTE> 193 101 101 101 195.129 138.66
+ <A WITH CIRCUMFLEX> 194 98 98 98 195.130 138.67
+ <A WITH TILDE> 195 102 102 102 195.131 138.68
+ <A WITH DIAERESIS> 196 99 99 99 195.132 138.69
+ <A WITH RING ABOVE> 197 103 103 103 195.133 138.70
+ <CAPITAL LIGATURE AE> 198 158 158 158 195.134 138.71
+ <C WITH CEDILLA> 199 104 104 104 195.135 138.72
+ <E WITH GRAVE> 200 116 116 116 195.136 138.73
+ <E WITH ACUTE> 201 113 113 113 195.137 138.74
+ <E WITH CIRCUMFLEX> 202 114 114 114 195.138 138.81
+ <E WITH DIAERESIS> 203 115 115 115 195.139 138.82
+ <I WITH GRAVE> 204 120 120 120 195.140 138.83
+ <I WITH ACUTE> 205 117 117 117 195.141 138.84
+ <I WITH CIRCUMFLEX> 206 118 118 118 195.142 138.85
+ <I WITH DIAERESIS> 207 119 119 119 195.143 138.86
+ <CAPITAL LETTER ETH> 208 172 172 172 195.144 138.87
+ <N WITH TILDE> 209 105 105 105 195.145 138.88
+ <O WITH GRAVE> 210 237 237 237 195.146 138.89
+ <O WITH ACUTE> 211 238 238 238 195.147 138.98
+ <O WITH CIRCUMFLEX> 212 235 235 235 195.148 138.99
+ <O WITH TILDE> 213 239 239 239 195.149 138.100
+ <O WITH DIAERESIS> 214 236 236 236 195.150 138.101
+ <MULTIPLICATION SIGN> 215 191 191 191 195.151 138.102
+ <O WITH STROKE> 216 128 128 128 195.152 138.103
+ <U WITH GRAVE> 217 253 253 224 195.153 138.104 ###
+ <U WITH ACUTE> 218 254 254 254 195.154 138.105
+ <U WITH CIRCUMFLEX> 219 251 251 221 195.155 138.106 ###
+ <U WITH DIAERESIS> 220 252 252 252 195.156 138.112
+ <Y WITH ACUTE> 221 173 186 173 195.157 138.113 *** ###
+ <CAPITAL LETTER THORN> 222 174 174 174 195.158 138.114
+ <SMALL LETTER SHARP S> 223 89 89 89 195.159 138.115
+ <a WITH GRAVE> 224 68 68 68 195.160 139.65
+ <a WITH ACUTE> 225 69 69 69 195.161 139.66
+ <a WITH CIRCUMFLEX> 226 66 66 66 195.162 139.67
+ <a WITH TILDE> 227 70 70 70 195.163 139.68
+ <a WITH DIAERESIS> 228 67 67 67 195.164 139.69
+ <a WITH RING ABOVE> 229 71 71 71 195.165 139.70
+ <SMALL LIGATURE ae> 230 156 156 156 195.166 139.71
+ <c WITH CEDILLA> 231 72 72 72 195.167 139.72
+ <e WITH GRAVE> 232 84 84 84 195.168 139.73
+ <e WITH ACUTE> 233 81 81 81 195.169 139.74
+ <e WITH CIRCUMFLEX> 234 82 82 82 195.170 139.81
+ <e WITH DIAERESIS> 235 83 83 83 195.171 139.82
+ <i WITH GRAVE> 236 88 88 88 195.172 139.83
+ <i WITH ACUTE> 237 85 85 85 195.173 139.84
+ <i WITH CIRCUMFLEX> 238 86 86 86 195.174 139.85
+ <i WITH DIAERESIS> 239 87 87 87 195.175 139.86
+ <SMALL LETTER eth> 240 140 140 140 195.176 139.87
+ <n WITH TILDE> 241 73 73 73 195.177 139.88
+ <o WITH GRAVE> 242 205 205 205 195.178 139.89
+ <o WITH ACUTE> 243 206 206 206 195.179 139.98
+ <o WITH CIRCUMFLEX> 244 203 203 203 195.180 139.99
+ <o WITH TILDE> 245 207 207 207 195.181 139.100
+ <o WITH DIAERESIS> 246 204 204 204 195.182 139.101
+ <DIVISION SIGN> 247 225 225 225 195.183 139.102
+ <o WITH STROKE> 248 112 112 112 195.184 139.103
+ <u WITH GRAVE> 249 221 221 192 195.185 139.104 ###
+ <u WITH ACUTE> 250 222 222 222 195.186 139.105
+ <u WITH CIRCUMFLEX> 251 219 219 219 195.187 139.106
+ <u WITH DIAERESIS> 252 220 220 220 195.188 139.112
+ <y WITH ACUTE> 253 141 141 141 195.189 139.113
+ <SMALL LETTER thorn> 254 142 142 142 195.190 139.114
+ <y WITH DIAERESIS> 255 223 223 223 195.191 139.115
+
+If you would rather see the above table in CCSID 0037 order rather than
+ASCII + Latin-1 order then run the table through:
+
+=over 4
+
+=item recipe 4
+
+=back
+
+ perl -ne 'if(/.{33}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}/)'\
+ -e '{push(@l,$_)}' \
+ -e 'END{print map{$_->[0]}' \
+ -e ' sort{$a->[1] <=> $b->[1]}' \
+ -e ' map{[$_,substr($_,42,3)]}@l;}' perlebcdic.pod
+
+If you would rather see it in CCSID 1047 order then change the digit
+42 in the last line to 51, like this:
+
+=over 4
+
+=item recipe 5
+
+=back
+
+ perl -ne 'if(/.{33}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}/)'\
+ -e '{push(@l,$_)}' \
+ -e 'END{print map{$_->[0]}' \
+ -e ' sort{$a->[1] <=> $b->[1]}' \
+ -e ' map{[$_,substr($_,51,3)]}@l;}' perlebcdic.pod
+
+If you would rather see it in POSIX-BC order then change the digit
+51 in the last line to 60, like this:
+
+=over 4
+
+=item recipe 6
+
+=back
+
+ perl -ne 'if(/.{33}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}/)'\
+ -e '{push(@l,$_)}' \
+ -e 'END{print map{$_->[0]}' \
+ -e ' sort{$a->[1] <=> $b->[1]}' \
+ -e ' map{[$_,substr($_,60,3)]}@l;}' perlebcdic.pod
+
+
+=head1 IDENTIFYING CHARACTER CODE SETS
+
+To determine the character set you are running under from perl one
+could use the return value of ord() or chr() to test one or more
+character values. For example:
+
+ $is_ascii = "A" eq chr(65);
+ $is_ebcdic = "A" eq chr(193);
+
+Also, "\t" is a C<HORIZONTAL TABULATION> character so that:
+
+ $is_ascii = ord("\t") == 9;
+ $is_ebcdic = ord("\t") == 5;
+
+To distinguish EBCDIC code pages try looking at one or more of
+the characters that differ between them. For example:
+
+ $is_ebcdic_37 = "\n" eq chr(37);
+ $is_ebcdic_1047 = "\n" eq chr(21);
+
+Or better still choose a character that is uniquely encoded in any
+of the code sets, e.g.:
+
+ $is_ascii = ord('[') == 91;
+ $is_ebcdic_37 = ord('[') == 186;
+ $is_ebcdic_1047 = ord('[') == 173;
+ $is_ebcdic_POSIX_BC = ord('[') == 187;
+
+However, it would be unwise to write tests such as:
+
+ $is_ascii = "\r" ne chr(13); # WRONG
+ $is_ascii = "\n" ne chr(10); # ILL ADVISED
+
+Obviously the first of these will fail to distinguish most ASCII platforms
+from either a CCSID 0037, a 1047, or a POSIX-BC EBCDIC platform since "\r" eq
+chr(13) under all of those coded character sets. But note too that
+because "\n" is chr(13) and "\r" is chr(10) on the MacIntosh (which is an
+ASCII platform) the second C<$is_ascii> test will lead to trouble there.
+
+To determine whether or not perl was built under an EBCDIC
+code page you can use the Config module like so:
+
+ use Config;
+ $is_ebcdic = $Config{'ebcdic'} eq 'define';
+
+=head1 CONVERSIONS
+
+=head2 tr///
+
+In order to convert a string of characters from one character set to
+another a simple list of numbers, such as in the right columns in the
+above table, along with perl's tr/// operator is all that is needed.
+The data in the table are in ASCII order hence the EBCDIC columns
+provide easy to use ASCII to EBCDIC operations that are also easily
+reversed.
+
+For example, to convert ASCII to code page 037 take the output of the second
+column from the output of recipe 0 (modified to add \\ characters) and use
+it in tr/// like so:
+
+ $cp_037 =
+ '\000\001\002\003\234\011\206\177\227\215\216\013\014\015\016\017' .
+ '\020\021\022\023\235\205\010\207\030\031\222\217\034\035\036\037' .
+ '\200\201\202\203\204\012\027\033\210\211\212\213\214\005\006\007' .
+ '\220\221\026\223\224\225\226\004\230\231\232\233\024\025\236\032' .
+ '\040\240\342\344\340\341\343\345\347\361\242\056\074\050\053\174' .
+ '\046\351\352\353\350\355\356\357\354\337\041\044\052\051\073\254' .
+ '\055\057\302\304\300\301\303\305\307\321\246\054\045\137\076\077' .
+ '\370\311\312\313\310\315\316\317\314\140\072\043\100\047\075\042' .
+ '\330\141\142\143\144\145\146\147\150\151\253\273\360\375\376\261' .
+ '\260\152\153\154\155\156\157\160\161\162\252\272\346\270\306\244' .
+ '\265\176\163\164\165\166\167\170\171\172\241\277\320\335\336\256' .
+ '\136\243\245\267\251\247\266\274\275\276\133\135\257\250\264\327' .
+ '\173\101\102\103\104\105\106\107\110\111\255\364\366\362\363\365' .
+ '\175\112\113\114\115\116\117\120\121\122\271\373\374\371\372\377' .
+ '\134\367\123\124\125\126\127\130\131\132\262\324\326\322\323\325' .
+ '\060\061\062\063\064\065\066\067\070\071\263\333\334\331\332\237' ;
+
+ my $ebcdic_string = $ascii_string;
+ eval '$ebcdic_string =~ tr/' . $cp_037 . '/\000-\377/';
+
+To convert from EBCDIC 037 to ASCII just reverse the order of the tr///
+arguments like so:
+
+ my $ascii_string = $ebcdic_string;
+ eval '$ascii_string =~ tr/\000-\377/' . $cp_037 . '/';
+
+Similarly one could take the output of the third column from recipe 0 to
+obtain a C<$cp_1047> table. The fourth column of the output from recipe
+0 could provide a C<$cp_posix_bc> table suitable for transcoding as well.
+
+=head2 iconv
+
+XPG operability often implies the presence of an I<iconv> utility
+available from the shell or from the C library. Consult your system's
+documentation for information on iconv.
+
+On OS/390 or z/OS see the iconv(1) manpage. One way to invoke the iconv
+shell utility from within perl would be to:
+
+ # OS/390 or z/OS example
+ $ascii_data = `echo '$ebcdic_data'| iconv -f IBM-1047 -t ISO8859-1`
+
+or the inverse map:
+
+ # OS/390 or z/OS example
+ $ebcdic_data = `echo '$ascii_data'| iconv -f ISO8859-1 -t IBM-1047`
+
+For other perl based conversion options see the Convert::* modules on CPAN.
+
+=head2 C RTL
+
+The OS/390 and z/OS C run time libraries provide _atoe() and _etoa() functions.
+
+=head1 OPERATOR DIFFERENCES
+
+The C<..> range operator treats certain character ranges with
+care on EBCDIC platforms. For example the following array
+will have twenty six elements on either an EBCDIC platform
+or an ASCII platform:
+
+ @alphabet = ('A'..'Z'); # $#alphabet == 25
+
+The bitwise operators such as & ^ | may return different results
+when operating on string or character data in a perl program running
+on an EBCDIC platform than when run on an ASCII platform. Here is
+an example adapted from the one in L<perlop>:
+
+ # EBCDIC-based examples
+ print "j p \n" ^ " a h"; # prints "JAPH\n"
+ print "JA" | " ph\n"; # prints "japh\n"
+ print "JAPH\nJunk" & "\277\277\277\277\277"; # prints "japh\n";
+ print 'p N$' ^ " E<H\n"; # prints "Perl\n";
+
+An interesting property of the 32 C0 control characters
+in the ASCII table is that they can "literally" be constructed
+as control characters in perl, e.g. C<(chr(0) eq "\c@")>
+C<(chr(1) eq "\cA")>, and so on. Perl on EBCDIC platforms has been
+ported to take "\c@" to chr(0) and "\cA" to chr(1) as well, but the
+thirty three characters that result depend on which code page you are
+using. The table below uses the character names from the previous table
+but with substitutions such as s/START OF/S.O./; s/END OF /E.O./;
+s/TRANSMISSION/TRANS./; s/TABULATION/TAB./; s/VERTICAL/VERT./;
+s/HORIZONTAL/HORIZ./; s/DEVICE CONTROL/D.C./; s/SEPARATOR/SEP./;
+s/NEGATIVE ACKNOWLEDGE/NEG. ACK./;. The POSIX-BC and 1047 sets are
+identical throughout this range and differ from the 0037 set at only
+one spot (21 decimal). Note that the C<LINE FEED> character
+may be generated by "\cJ" on ASCII platforms but by "\cU" on 1047 or POSIX-BC
+platforms and cannot be generated as a C<"\c.letter."> control character on
+0037 platforms. Note also that "\c\\" maps to two characters
+not one.
+
+ chr ord 8859-1 0037 1047 && POSIX-BC
+ ------------------------------------------------------------------------
+ "\c?" 127 <DELETE> " " ***><
+ "\c@" 0 <NULL> <NULL> <NULL> ***><
+ "\cA" 1 <S.O. HEADING> <S.O. HEADING> <S.O. HEADING>
+ "\cB" 2 <S.O. TEXT> <S.O. TEXT> <S.O. TEXT>
+ "\cC" 3 <E.O. TEXT> <E.O. TEXT> <E.O. TEXT>
+ "\cD" 4 <E.O. TRANS.> <C1 28> <C1 28>
+ "\cE" 5 <ENQUIRY> <HORIZ. TAB.> <HORIZ. TAB.>
+ "\cF" 6 <ACKNOWLEDGE> <C1 6> <C1 6>
+ "\cG" 7 <BELL> <DELETE> <DELETE>
+ "\cH" 8 <BACKSPACE> <C1 23> <C1 23>
+ "\cI" 9 <HORIZ. TAB.> <C1 13> <C1 13>
+ "\cJ" 10 <LINE FEED> <C1 14> <C1 14>
+ "\cK" 11 <VERT. TAB.> <VERT. TAB.> <VERT. TAB.>
+ "\cL" 12 <FORM FEED> <FORM FEED> <FORM FEED>
+ "\cM" 13 <CARRIAGE RETURN> <CARRIAGE RETURN> <CARRIAGE RETURN>
+ "\cN" 14 <SHIFT OUT> <SHIFT OUT> <SHIFT OUT>
+ "\cO" 15 <SHIFT IN> <SHIFT IN> <SHIFT IN>
+ "\cP" 16 <DATA LINK ESCAPE> <DATA LINK ESCAPE> <DATA LINK ESCAPE>
+ "\cQ" 17 <D.C. ONE> <D.C. ONE> <D.C. ONE>
+ "\cR" 18 <D.C. TWO> <D.C. TWO> <D.C. TWO>
+ "\cS" 19 <D.C. THREE> <D.C. THREE> <D.C. THREE>
+ "\cT" 20 <D.C. FOUR> <C1 29> <C1 29>
+ "\cU" 21 <NEG. ACK.> <C1 5> <LINE FEED> ***
+ "\cV" 22 <SYNCHRONOUS IDLE> <BACKSPACE> <BACKSPACE>
+ "\cW" 23 <E.O. TRANS. BLOCK> <C1 7> <C1 7>
+ "\cX" 24 <CANCEL> <CANCEL> <CANCEL>
+ "\cY" 25 <E.O. MEDIUM> <E.O. MEDIUM> <E.O. MEDIUM>
+ "\cZ" 26 <SUBSTITUTE> <C1 18> <C1 18>
+ "\c[" 27 <ESCAPE> <C1 15> <C1 15>
+ "\c\\" 28 <FILE SEP.>\ <FILE SEP.>\ <FILE SEP.>\
+ "\c]" 29 <GROUP SEP.> <GROUP SEP.> <GROUP SEP.>
+ "\c^" 30 <RECORD SEP.> <RECORD SEP.> <RECORD SEP.> ***><
+ "\c_" 31 <UNIT SEP.> <UNIT SEP.> <UNIT SEP.> ***><
+
+
+=head1 FUNCTION DIFFERENCES
+
+=over 8
+
+=item chr()
+
+chr() must be given an EBCDIC code number argument to yield a desired
+character return value on an EBCDIC platform. For example:
+
+ $CAPITAL_LETTER_A = chr(193);
+
+=item ord()
+
+ord() will return EBCDIC code number values on an EBCDIC platform.
+For example:
+
+ $the_number_193 = ord("A");
+
+=item pack()
+
+The c and C templates for pack() are dependent upon character set
+encoding. Examples of usage on EBCDIC include:
+
+ $foo = pack("CCCC",193,194,195,196);
+ # $foo eq "ABCD"
+ $foo = pack("C4",193,194,195,196);
+ # same thing
+
+ $foo = pack("ccxxcc",193,194,195,196);
+ # $foo eq "AB\0\0CD"
+
+=item print()
+
+One must be careful with scalars and strings that are passed to
+print that contain ASCII encodings. One common place
+for this to occur is in the output of the MIME type header for
+CGI script writing. For example, many perl programming guides
+recommend something similar to:
+
+ print "Content-type:\ttext/html\015\012\015\012";
+ # this may be wrong on EBCDIC
+
+Under the IBM OS/390 USS Web Server or WebSphere on z/OS for example
+you should instead write that as:
+
+ print "Content-type:\ttext/html\r\n\r\n"; # OK for DGW et alia
+
+That is because the translation from EBCDIC to ASCII is done
+by the web server in this case (such code will not be appropriate for
+the Macintosh however). Consult your web server's documentation for
+further details.
+
+=item printf()
+
+The formats that can convert characters to numbers and vice versa
+will be different from their ASCII counterparts when executed
+on an EBCDIC platform. Examples include:
+
+ printf("%c%c%c",193,194,195); # prints ABC
+
+=item sort()
+
+EBCDIC sort results may differ from ASCII sort results especially for
+mixed case strings. This is discussed in more detail below.
+
+=item sprintf()
+
+See the discussion of printf() above. An example of the use
+of sprintf would be:
+
+ $CAPITAL_LETTER_A = sprintf("%c",193);
+
+=item unpack()
+
+See the discussion of pack() above.
+
+=back
+
+=head1 REGULAR EXPRESSION DIFFERENCES
+
+As of perl 5.005_03 the letter range regular expression such as
+[A-Z] and [a-z] have been especially coded to not pick up gap
+characters. For example, characters such as E<ocirc> C<o WITH CIRCUMFLEX>
+that lie between I and J would not be matched by the
+regular expression range C</[H-K]/>. This works in
+the other direction, too, if either of the range end points is
+explicitly numeric: C<[\x89-\x91]> will match C<\x8e>, even
+though C<\x89> is C<i> and C<\x91 > is C<j>, and C<\x8e>
+is a gap character from the alphabetic viewpoint.
+
+If you do want to match the alphabet gap characters in a single octet
+regular expression try matching the hex or octal code such
+as C</\313/> on EBCDIC or C</\364/> on ASCII platforms to
+have your regular expression match C<o WITH CIRCUMFLEX>.
+
+Another construct to be wary of is the inappropriate use of hex or
+octal constants in regular expressions. Consider the following
+set of subs:
+
+ sub is_c0 {
+ my $char = substr(shift,0,1);
+ $char =~ /[\000-\037]/;
+ }
+
+ sub is_print_ascii {
+ my $char = substr(shift,0,1);
+ $char =~ /[\040-\176]/;
+ }
+
+ sub is_delete {
+ my $char = substr(shift,0,1);
+ $char eq "\177";
+ }
+
+ sub is_c1 {
+ my $char = substr(shift,0,1);
+ $char =~ /[\200-\237]/;
+ }
+
+ sub is_latin_1 {
+ my $char = substr(shift,0,1);
+ $char =~ /[\240-\377]/;
+ }
+
+The above would be adequate if the concern was only with numeric code points.
+However, the concern may be with characters rather than code points
+and on an EBCDIC platform it may be desirable for constructs such as
+C<if (is_print_ascii("A")) {print "A is a printable character\n";}> to print
+out the expected message. One way to represent the above collection
+of character classification subs that is capable of working across the
+four coded character sets discussed in this document is as follows:
+
+ sub Is_c0 {
+ my $char = substr(shift,0,1);
+ if (ord('^')==94) { # ascii
+ return $char =~ /[\000-\037]/;
+ }
+ if (ord('^')==176) { # 37
+ return $char =~ /[\000-\003\067\055-\057\026\005\045\013-\023\074\075\062\046\030\031\077\047\034-\037]/;
+ }
+ if (ord('^')==95 || ord('^')==106) { # 1047 || posix-bc
+ return $char =~ /[\000-\003\067\055-\057\026\005\025\013-\023\074\075\062\046\030\031\077\047\034-\037]/;
+ }
+ }
+
+ sub Is_print_ascii {
+ my $char = substr(shift,0,1);
+ $char =~ /[ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~]/;
+ }
+
+ sub Is_delete {
+ my $char = substr(shift,0,1);
+ if (ord('^')==94) { # ascii
+ return $char eq "\177";
+ }
+ else { # ebcdic
+ return $char eq "\007";
+ }
+ }
+
+ sub Is_c1 {
+ my $char = substr(shift,0,1);
+ if (ord('^')==94) { # ascii
+ return $char =~ /[\200-\237]/;
+ }
+ if (ord('^')==176) { # 37
+ return $char =~ /[\040-\044\025\006\027\050-\054\011\012\033\060\061\032\063-\066\010\070-\073\040\024\076\377]/;
+ }
+ if (ord('^')==95) { # 1047
+ return $char =~ /[\040-\045\006\027\050-\054\011\012\033\060\061\032\063-\066\010\070-\073\040\024\076\377]/;
+ }
+ if (ord('^')==106) { # posix-bc
+ return $char =~
+ /[\040-\045\006\027\050-\054\011\012\033\060\061\032\063-\066\010\070-\073\040\024\076\137]/;
+ }
+ }
+
+ sub Is_latin_1 {
+ my $char = substr(shift,0,1);
+ if (ord('^')==94) { # ascii
+ return $char =~ /[\240-\377]/;
+ }
+ if (ord('^')==176) { # 37
+ return $char =~
+ /[\101\252\112\261\237\262\152\265\275\264\232\212\137\312\257\274\220\217\352\372\276\240\266\263\235\332\233\213\267\270\271\253\144\145\142\146\143\147\236\150\164\161-\163\170\165-\167\254\151\355\356\353\357\354\277\200\375\376\373\374\255\256\131\104\105\102\106\103\107\234\110\124\121-\123\130\125-\127\214\111\315\316\313\317\314\341\160\335\336\333\334\215\216\337]/;
+ }
+ if (ord('^')==95) { # 1047
+ return $char =~
+ /[\101\252\112\261\237\262\152\265\273\264\232\212\260\312\257\274\220\217\352\372\276\240\266\263\235\332\233\213\267\270\271\253\144\145\142\146\143\147\236\150\164\161-\163\170\165-\167\254\151\355\356\353\357\354\277\200\375\376\373\374\272\256\131\104\105\102\106\103\107\234\110\124\121-\123\130\125-\127\214\111\315\316\313\317\314\341\160\335\336\333\334\215\216\337]/;
+ }
+ if (ord('^')==106) { # posix-bc
+ return $char =~
+ /[\101\252\260\261\237\262\320\265\171\264\232\212\272\312\257\241\220\217\352\372\276\240\266\263\235\332\233\213\267\270\271\253\144\145\142\146\143\147\236\150\164\161-\163\170\165-\167\254\151\355\356\353\357\354\277\200\340\376\335\374\255\256\131\104\105\102\106\103\107\234\110\124\121-\123\130\125-\127\214\111\315\316\313\317\314\341\160\300\336\333\334\215\216\337]/;
+ }
+ }
+
+Note however that only the C<Is_ascii_print()> sub is really independent
+of coded character set. Another way to write C<Is_latin_1()> would be
+to use the characters in the range explicitly:
+
+ sub Is_latin_1 {
+ my $char = substr(shift,0,1);
+ $char =~ /[ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ]/;
+ }
+
+Although that form may run into trouble in network transit (due to the
+presence of 8 bit characters) or on non ISO-Latin character sets.
+
+=head1 SOCKETS
+
+Most socket programming assumes ASCII character encodings in network
+byte order. Exceptions can include CGI script writing under a
+host web server where the server may take care of translation for you.
+Most host web servers convert EBCDIC data to ISO-8859-1 or Unicode on
+output.
+
+=head1 SORTING
+
+One big difference between ASCII based character sets and EBCDIC ones
+are the relative positions of upper and lower case letters and the
+letters compared to the digits. If sorted on an ASCII based platform the
+two letter abbreviation for a physician comes before the two letter
+for drive, that is:
+
+ @sorted = sort(qw(Dr. dr.)); # @sorted holds ('Dr.','dr.') on ASCII,
+ # but ('dr.','Dr.') on EBCDIC
+
+The property of lower case before uppercase letters in EBCDIC is
+even carried to the Latin 1 EBCDIC pages such as 0037 and 1047.
+An example would be that E<Euml> C<E WITH DIAERESIS> (203) comes
+before E<euml> C<e WITH DIAERESIS> (235) on an ASCII platform, but
+the latter (83) comes before the former (115) on an EBCDIC platform.
+(Astute readers will note that the upper case version of E<szlig>
+C<SMALL LETTER SHARP S> is simply "SS" and that the upper case version of
+E<yuml> C<y WITH DIAERESIS> is not in the 0..255 range but it is
+at U+x0178 in Unicode, or C<"\x{178}"> in a Unicode enabled Perl).
+
+The sort order will cause differences between results obtained on
+ASCII platforms versus EBCDIC platforms. What follows are some suggestions
+on how to deal with these differences.
+
+=head2 Ignore ASCII vs. EBCDIC sort differences.
+
+This is the least computationally expensive strategy. It may require
+some user education.
+
+=head2 MONO CASE then sort data.
+
+In order to minimize the expense of mono casing mixed test try to
+C<tr///> towards the character set case most employed within the data.
+If the data are primarily UPPERCASE non Latin 1 then apply tr/[a-z]/[A-Z]/
+then sort(). If the data are primarily lowercase non Latin 1 then
+apply tr/[A-Z]/[a-z]/ before sorting. If the data are primarily UPPERCASE
+and include Latin-1 characters then apply:
+
+ tr/[a-z]/[A-Z]/;
+ tr/[àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ]/[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ]/;
+ s/ß/SS/g;
+
+then sort(). Do note however that such Latin-1 manipulation does not
+address the E<yuml> C<y WITH DIAERESIS> character that will remain at
+code point 255 on ASCII platforms, but 223 on most EBCDIC platforms
+where it will sort to a place less than the EBCDIC numerals. With a
+Unicode enabled Perl you might try:
+
+ tr/^?/\x{178}/;
+
+The strategy of mono casing data before sorting does not preserve the case
+of the data and may not be acceptable for that reason.
+
+=head2 Convert, sort data, then re convert.
+
+This is the most expensive proposition that does not employ a network
+connection.
+
+=head2 Perform sorting on one type of platform only.
+
+This strategy can employ a network connection. As such
+it would be computationally expensive.
+
+=head1 TRANSFORMATION FORMATS
+
+There are a variety of ways of transforming data with an intra character set
+mapping that serve a variety of purposes. Sorting was discussed in the
+previous section and a few of the other more popular mapping techniques are
+discussed next.
+
+=head2 URL decoding and encoding
+
+Note that some URLs have hexadecimal ASCII code points in them in an
+attempt to overcome character or protocol limitation issues. For example
+the tilde character is not on every keyboard hence a URL of the form:
+
+ http://www.pvhp.com/~pvhp/
+
+may also be expressed as either of:
+
+ http://www.pvhp.com/%7Epvhp/
+
+ http://www.pvhp.com/%7epvhp/
+
+where 7E is the hexadecimal ASCII code point for '~'. Here is an example
+of decoding such a URL under CCSID 1047:
+
+ $url = 'http://www.pvhp.com/%7Epvhp/';
+ # this array assumes code page 1047
+ my @a2e_1047 = (
+ 0, 1, 2, 3, 55, 45, 46, 47, 22, 5, 21, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31,
+ 64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97,
+ 240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111,
+ 124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214,
+ 215,216,217,226,227,228,229,230,231,232,233,173,224,189, 95,109,
+ 121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150,
+ 151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161, 7,
+ 32, 33, 34, 35, 36, 37, 6, 23, 40, 41, 42, 43, 44, 9, 10, 27,
+ 48, 49, 26, 51, 52, 53, 54, 8, 56, 57, 58, 59, 4, 20, 62,255,
+ 65,170, 74,177,159,178,106,181,187,180,154,138,176,202,175,188,
+ 144,143,234,250,190,160,182,179,157,218,155,139,183,184,185,171,
+ 100,101, 98,102, 99,103,158,104,116,113,114,115,120,117,118,119,
+ 172,105,237,238,235,239,236,191,128,253,254,251,252,186,174, 89,
+ 68, 69, 66, 70, 67, 71,156, 72, 84, 81, 82, 83, 88, 85, 86, 87,
+ 140, 73,205,206,203,207,204,225,112,221,222,219,220,141,142,223
+ );
+ $url =~ s/%([0-9a-fA-F]{2})/pack("c",$a2e_1047[hex($1)])/ge;
+
+Conversely, here is a partial solution for the task of encoding such
+a URL under the 1047 code page:
+
+ $url = 'http://www.pvhp.com/~pvhp/';
+ # this array assumes code page 1047
+ my @e2a_1047 = (
+ 0, 1, 2, 3,156, 9,134,127,151,141,142, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19,157, 10, 8,135, 24, 25,146,143, 28, 29, 30, 31,
+ 128,129,130,131,132,133, 23, 27,136,137,138,139,140, 5, 6, 7,
+ 144,145, 22,147,148,149,150, 4,152,153,154,155, 20, 21,158, 26,
+ 32,160,226,228,224,225,227,229,231,241,162, 46, 60, 40, 43,124,
+ 38,233,234,235,232,237,238,239,236,223, 33, 36, 42, 41, 59, 94,
+ 45, 47,194,196,192,193,195,197,199,209,166, 44, 37, 95, 62, 63,
+ 248,201,202,203,200,205,206,207,204, 96, 58, 35, 64, 39, 61, 34,
+ 216, 97, 98, 99,100,101,102,103,104,105,171,187,240,253,254,177,
+ 176,106,107,108,109,110,111,112,113,114,170,186,230,184,198,164,
+ 181,126,115,116,117,118,119,120,121,122,161,191,208, 91,222,174,
+ 172,163,165,183,169,167,182,188,189,190,221,168,175, 93,180,215,
+ 123, 65, 66, 67, 68, 69, 70, 71, 72, 73,173,244,246,242,243,245,
+ 125, 74, 75, 76, 77, 78, 79, 80, 81, 82,185,251,252,249,250,255,
+ 92,247, 83, 84, 85, 86, 87, 88, 89, 90,178,212,214,210,211,213,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,179,219,220,217,218,159
+ );
+ # The following regular expression does not address the
+ # mappings for: ('.' => '%2E', '/' => '%2F', ':' => '%3A')
+ $url =~ s/([\t "#%&\(\),;<=>\?\@\[\\\]^`{|}~])/sprintf("%%%02X",$e2a_1047[ord($1)])/ge;
+
+where a more complete solution would split the URL into components
+and apply a full s/// substitution only to the appropriate parts.
+
+In the remaining examples a @e2a or @a2e array may be employed
+but the assignment will not be shown explicitly. For code page 1047
+you could use the @a2e_1047 or @e2a_1047 arrays just shown.
+
+=head2 uu encoding and decoding
+
+The C<u> template to pack() or unpack() will render EBCDIC data in EBCDIC
+characters equivalent to their ASCII counterparts. For example, the
+following will print "Yes indeed\n" on either an ASCII or EBCDIC computer:
+
+ $all_byte_chrs = '';
+ for (0..255) { $all_byte_chrs .= chr($_); }
+ $uuencode_byte_chrs = pack('u', $all_byte_chrs);
+ ($uu = <<'ENDOFHEREDOC') =~ s/^\s*//gm;
+ M``$"`P0%!@<("0H+#`T.#Q`1$A,4%187&!D:&QP='A\@(2(C)"4F)R@I*BLL
+ M+2XO,#$R,S0U-C<X.3H[/#T^/T!!0D-$149'2$E*2TQ-3D]045)35%565UA9
+ M6EM<75Y?8&%B8V1E9F=H:6IK;&UN;W!Q<G-T=79W>'EZ>WQ]?G^`@8*#A(6&
+ MAXB)BHN,C8Z/D)&2DY25EI>8F9J;G)V>GZ"AHJ.DI::GJ*FJJZRMKJ^PL;*S
+ MM+6VM[BYNKN\O;Z_P,'"P\3%QL?(R<K+S,W.S]#1TM/4U=;7V-G:V]S=WM_@
+ ?X>+CY.7FY^CIZNOL[>[O\/'R\_3U]O?X^?K[_/W^_P``
+ ENDOFHEREDOC
+ if ($uuencode_byte_chrs eq $uu) {
+ print "Yes ";
+ }
+ $uudecode_byte_chrs = unpack('u', $uuencode_byte_chrs);
+ if ($uudecode_byte_chrs eq $all_byte_chrs) {
+ print "indeed\n";
+ }
+
+Here is a very spartan uudecoder that will work on EBCDIC provided
+that the @e2a array is filled in appropriately:
+
+ #!/usr/local/bin/perl
+ @e2a = ( # this must be filled in
+ );
+ $_ = <> until ($mode,$file) = /^begin\s*(\d*)\s*(\S*)/;
+ open(OUT, "> $file") if $file ne "";
+ while(<>) {
+ last if /^end/;
+ next if /[a-z]/;
+ next unless int(((($e2a[ord()] - 32 ) & 077) + 2) / 3) ==
+ int(length() / 4);
+ print OUT unpack("u", $_);
+ }
+ close(OUT);
+ chmod oct($mode), $file;
+
+
+=head2 Quoted-Printable encoding and decoding
+
+On ASCII encoded platforms it is possible to strip characters outside of
+the printable set using:
+
+ # This QP encoder works on ASCII only
+ $qp_string =~ s/([=\x00-\x1F\x80-\xFF])/sprintf("=%02X",ord($1))/ge;
+
+Whereas a QP encoder that works on both ASCII and EBCDIC platforms
+would look somewhat like the following (where the EBCDIC branch @e2a
+array is omitted for brevity):
+
+ if (ord('A') == 65) { # ASCII
+ $delete = "\x7F"; # ASCII
+ @e2a = (0 .. 255) # ASCII to ASCII identity map
+ }
+ else { # EBCDIC
+ $delete = "\x07"; # EBCDIC
+ @e2a = # EBCDIC to ASCII map (as shown above)
+ }
+ $qp_string =~
+ s/([^ !"\#\$%&'()*+,\-.\/0-9:;<>?\@A-Z[\\\]^_`a-z{|}~$delete])/sprintf("=%02X",$e2a[ord($1)])/ge;
+
+(although in production code the substitutions might be done
+in the EBCDIC branch with the @e2a array and separately in the
+ASCII branch without the expense of the identity map).
+
+Such QP strings can be decoded with:
+
+ # This QP decoder is limited to ASCII only
+ $string =~ s/=([0-9A-Fa-f][0-9A-Fa-f])/chr hex $1/ge;
+ $string =~ s/=[\n\r]+$//;
+
+Whereas a QP decoder that works on both ASCII and EBCDIC platforms
+would look somewhat like the following (where the @a2e array is
+omitted for brevity):
+
+ $string =~ s/=([0-9A-Fa-f][0-9A-Fa-f])/chr $a2e[hex $1]/ge;
+ $string =~ s/=[\n\r]+$//;
+
+=head2 Caesarian ciphers
+
+The practice of shifting an alphabet one or more characters for encipherment
+dates back thousands of years and was explicitly detailed by Gaius Julius
+Caesar in his B<Gallic Wars> text. A single alphabet shift is sometimes
+referred to as a rotation and the shift amount is given as a number $n after
+the string 'rot' or "rot$n". Rot0 and rot26 would designate identity maps
+on the 26 letter English version of the Latin alphabet. Rot13 has the
+interesting property that alternate subsequent invocations are identity maps
+(thus rot13 is its own non-trivial inverse in the group of 26 alphabet
+rotations). Hence the following is a rot13 encoder and decoder that will
+work on ASCII and EBCDIC platforms:
+
+ #!/usr/local/bin/perl
+
+ while(<>){
+ tr/n-za-mN-ZA-M/a-zA-Z/;
+ print;
+ }
+
+In one-liner form:
+
+ perl -ne 'tr/n-za-mN-ZA-M/a-zA-Z/;print'
+
+
+=head1 Hashing order and checksums
+
+To the extent that it is possible to write code that depends on
+hashing order there may be differences between hashes as stored
+on an ASCII based platform and hashes stored on an EBCDIC based platform.
+XXX
+
+=head1 I18N AND L10N
+
+Internationalization(I18N) and localization(L10N) are supported at least
+in principle even on EBCDIC platforms. The details are system dependent
+and discussed under the L<perlebcdic/OS ISSUES> section below.
+
+=head1 MULTI OCTET CHARACTER SETS
+
+Perl may work with an internal UTF-EBCDIC encoding form for wide characters
+on EBCDIC platforms in a manner analogous to the way that it works with
+the UTF-8 internal encoding form on ASCII based platforms.
+
+Legacy multi byte EBCDIC code pages XXX.
+
+=head1 OS ISSUES
+
+There may be a few system dependent issues
+of concern to EBCDIC Perl programmers.
+
+=head2 OS/400
+
+=over 8
+
+=item PASE
+
+The PASE environment is runtime environment for OS/400 that can run
+executables built for PowerPC AIX in OS/400, see L<perlos400>. PASE
+is ASCII-based, not EBCDIC-based as the ILE.
+
+=item IFS access
+
+XXX.
+
+=back
+
+=head2 OS/390, z/OS
+
+Perl runs under Unix Systems Services or USS.
+
+=over 8
+
+=item chcp
+
+B<chcp> is supported as a shell utility for displaying and changing
+one's code page. See also L<chcp>.
+
+=item dataset access
+
+For sequential data set access try:
+
+ my @ds_records = `cat //DSNAME`;
+
+or:
+
+ my @ds_records = `cat //'HLQ.DSNAME'`;
+
+See also the OS390::Stdio module on CPAN.
+
+=item OS/390, z/OS iconv
+
+B<iconv> is supported as both a shell utility and a C RTL routine.
+See also the iconv(1) and iconv(3) manual pages.
+
+=item locales
+
+On OS/390 or z/OS see L<locale> for information on locales. The L10N files
+are in F</usr/nls/locale>. $Config{d_setlocale} is 'define' on OS/390
+or z/OS.
+
+=back
+
+=head2 VM/ESA?
+
+XXX.
+
+=head2 POSIX-BC?
+
+XXX.
+
+=head1 BUGS
+
+This pod document contains literal Latin 1 characters and may encounter
+translation difficulties. In particular one popular nroff implementation
+was known to strip accented characters to their unaccented counterparts
+while attempting to view this document through the B<pod2man> program
+(for example, you may see a plain C<y> rather than one with a diaeresis
+as in E<yuml>). Another nroff truncated the resultant manpage at
+the first occurrence of 8 bit characters.
+
+Not all shells will allow multiple C<-e> string arguments to perl to
+be concatenated together properly as recipes 0, 2, 4, 5, and 6 might
+seem to imply.
+
+=head1 SEE ALSO
+
+L<perllocale>, L<perlfunc>, L<perlunicode>, L<utf8>.
+
+=head1 REFERENCES
+
+L<http://anubis.dkuug.dk/i18n/charmaps>
+
+L<http://www.unicode.org/>
+
+L<http://www.unicode.org/unicode/reports/tr16/>
+
+L<http://www.wps.com/texts/codes/>
+B<ASCII: American Standard Code for Information Infiltration> Tom Jennings,
+September 1999.
+
+B<The Unicode Standard, Version 3.0> The Unicode Consortium, Lisa Moore ed.,
+ISBN 0-201-61633-5, Addison Wesley Developers Press, February 2000.
+
+B<CDRA: IBM - Character Data Representation Architecture -
+Reference and Registry>, IBM SC09-2190-00, December 1996.
+
+"Demystifying Character Sets", Andrea Vine, Multilingual Computing
+& Technology, B<#26 Vol. 10 Issue 4>, August/September 1999;
+ISSN 1523-0309; Multilingual Computing Inc. Sandpoint ID, USA.
+
+B<Codes, Ciphers, and Other Cryptic and Clandestine Communication>
+Fred B. Wrixon, ISBN 1-57912-040-7, Black Dog & Leventhal Publishers,
+1998.
+
+L<http://www.bobbemer.com/P-BIT.HTM>
+B<IBM - EBCDIC and the P-bit; The biggest Computer Goof Ever> Robert Bemer.
+
+=head1 HISTORY
+
+15 April 2001: added UTF-8 and UTF-EBCDIC to main table, pvhp.
+
+=head1 AUTHOR
+
+Peter Prymmer pvhp@best.com wrote this in 1999 and 2000
+with CCSID 0819 and 0037 help from Chris Leach and
+AndrE<eacute> Pirard A.Pirard@ulg.ac.be as well as POSIX-BC
+help from Thomas Dorner Thomas.Dorner@start.de.
+Thanks also to Vickie Cooper, Philip Newton, William Raffloer, and
+Joe Smith. Trademarks, registered trademarks, service marks and
+registered service marks used in this document are the property of
+their respective owners.
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlembed.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlembed.pod
new file mode 100755
index 00000000000..36da54f7fe3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlembed.pod
@@ -0,0 +1,1160 @@
+=head1 NAME
+
+perlembed - how to embed perl in your C program
+
+=head1 DESCRIPTION
+
+=head2 PREAMBLE
+
+Do you want to:
+
+=over 5
+
+=item B<Use C from Perl?>
+
+Read L<perlxstut>, L<perlxs>, L<h2xs>, L<perlguts>, and L<perlapi>.
+
+=item B<Use a Unix program from Perl?>
+
+Read about back-quotes and about C<system> and C<exec> in L<perlfunc>.
+
+=item B<Use Perl from Perl?>
+
+Read about L<perlfunc/do> and L<perlfunc/eval> and L<perlfunc/require>
+and L<perlfunc/use>.
+
+=item B<Use C from C?>
+
+Rethink your design.
+
+=item B<Use Perl from C?>
+
+Read on...
+
+=back
+
+=head2 ROADMAP
+
+=over 5
+
+=item *
+
+Compiling your C program
+
+=item *
+
+Adding a Perl interpreter to your C program
+
+=item *
+
+Calling a Perl subroutine from your C program
+
+=item *
+
+Evaluating a Perl statement from your C program
+
+=item *
+
+Performing Perl pattern matches and substitutions from your C program
+
+=item *
+
+Fiddling with the Perl stack from your C program
+
+=item *
+
+Maintaining a persistent interpreter
+
+=item *
+
+Maintaining multiple interpreter instances
+
+=item *
+
+Using Perl modules, which themselves use C libraries, from your C program
+
+=item *
+
+Embedding Perl under Win32
+
+=back
+
+=head2 Compiling your C program
+
+If you have trouble compiling the scripts in this documentation,
+you're not alone. The cardinal rule: COMPILE THE PROGRAMS IN EXACTLY
+THE SAME WAY THAT YOUR PERL WAS COMPILED. (Sorry for yelling.)
+
+Also, every C program that uses Perl must link in the I<perl library>.
+What's that, you ask? Perl is itself written in C; the perl library
+is the collection of compiled C programs that were used to create your
+perl executable (I</usr/bin/perl> or equivalent). (Corollary: you
+can't use Perl from your C program unless Perl has been compiled on
+your machine, or installed properly--that's why you shouldn't blithely
+copy Perl executables from machine to machine without also copying the
+I<lib> directory.)
+
+When you use Perl from C, your C program will--usually--allocate,
+"run", and deallocate a I<PerlInterpreter> object, which is defined by
+the perl library.
+
+If your copy of Perl is recent enough to contain this documentation
+(version 5.002 or later), then the perl library (and I<EXTERN.h> and
+I<perl.h>, which you'll also need) will reside in a directory
+that looks like this:
+
+ /usr/local/lib/perl5/your_architecture_here/CORE
+
+or perhaps just
+
+ /usr/local/lib/perl5/CORE
+
+or maybe something like
+
+ /usr/opt/perl5/CORE
+
+Execute this statement for a hint about where to find CORE:
+
+ perl -MConfig -e 'print $Config{archlib}'
+
+Here's how you'd compile the example in the next section,
+L<Adding a Perl interpreter to your C program>, on my Linux box:
+
+ % gcc -O2 -Dbool=char -DHAS_BOOL -I/usr/local/include
+ -I/usr/local/lib/perl5/i586-linux/5.003/CORE
+ -L/usr/local/lib/perl5/i586-linux/5.003/CORE
+ -o interp interp.c -lperl -lm
+
+(That's all one line.) On my DEC Alpha running old 5.003_05, the
+incantation is a bit different:
+
+ % cc -O2 -Olimit 2900 -DSTANDARD_C -I/usr/local/include
+ -I/usr/local/lib/perl5/alpha-dec_osf/5.00305/CORE
+ -L/usr/local/lib/perl5/alpha-dec_osf/5.00305/CORE -L/usr/local/lib
+ -D__LANGUAGE_C__ -D_NO_PROTO -o interp interp.c -lperl -lm
+
+How can you figure out what to add? Assuming your Perl is post-5.001,
+execute a C<perl -V> command and pay special attention to the "cc" and
+"ccflags" information.
+
+You'll have to choose the appropriate compiler (I<cc>, I<gcc>, et al.) for
+your machine: C<perl -MConfig -e 'print $Config{cc}'> will tell you what
+to use.
+
+You'll also have to choose the appropriate library directory
+(I</usr/local/lib/...>) for your machine. If your compiler complains
+that certain functions are undefined, or that it can't locate
+I<-lperl>, then you need to change the path following the C<-L>. If it
+complains that it can't find I<EXTERN.h> and I<perl.h>, you need to
+change the path following the C<-I>.
+
+You may have to add extra libraries as well. Which ones?
+Perhaps those printed by
+
+ perl -MConfig -e 'print $Config{libs}'
+
+Provided your perl binary was properly configured and installed the
+B<ExtUtils::Embed> module will determine all of this information for
+you:
+
+ % cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+If the B<ExtUtils::Embed> module isn't part of your Perl distribution,
+you can retrieve it from
+http://www.perl.com/perl/CPAN/modules/by-module/ExtUtils/
+(If this documentation came from your Perl distribution, then you're
+running 5.004 or better and you already have it.)
+
+The B<ExtUtils::Embed> kit on CPAN also contains all source code for
+the examples in this document, tests, additional examples and other
+information you may find useful.
+
+=head2 Adding a Perl interpreter to your C program
+
+In a sense, perl (the C program) is a good example of embedding Perl
+(the language), so I'll demonstrate embedding with I<miniperlmain.c>,
+included in the source distribution. Here's a bastardized, non-portable
+version of I<miniperlmain.c> containing the essentials of embedding:
+
+ #include <EXTERN.h> /* from the Perl distribution */
+ #include <perl.h> /* from the Perl distribution */
+
+ static PerlInterpreter *my_perl; /*** The Perl interpreter ***/
+
+ int main(int argc, char **argv, char **env)
+ {
+ PERL_SYS_INIT3(&argc,&argv,&env);
+ my_perl = perl_alloc();
+ perl_construct(my_perl);
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+ perl_parse(my_perl, NULL, argc, argv, (char **)NULL);
+ perl_run(my_perl);
+ perl_destruct(my_perl);
+ perl_free(my_perl);
+ PERL_SYS_TERM();
+ }
+
+Notice that we don't use the C<env> pointer. Normally handed to
+C<perl_parse> as its final argument, C<env> here is replaced by
+C<NULL>, which means that the current environment will be used.
+
+The macros PERL_SYS_INIT3() and PERL_SYS_TERM() provide system-specific
+tune up of the C runtime environment necessary to run Perl interpreters;
+they should only be called once regardless of how many interpreters you
+create or destroy. Call PERL_SYS_INIT3() before you create your first
+interpreter, and PERL_SYS_TERM() after you free your last interpreter.
+
+Since PERL_SYS_INIT3() may change C<env>, it may be more appropriate to
+provide C<env> as an argument to perl_parse().
+
+Also notice that no matter what arguments you pass to perl_parse(),
+PERL_SYS_INIT3() must be invoked on the C main() argc, argv and env and
+only once.
+
+Now compile this program (I'll call it I<interp.c>) into an executable:
+
+ % cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+After a successful compilation, you'll be able to use I<interp> just
+like perl itself:
+
+ % interp
+ print "Pretty Good Perl \n";
+ print "10890 - 9801 is ", 10890 - 9801;
+ <CTRL-D>
+ Pretty Good Perl
+ 10890 - 9801 is 1089
+
+or
+
+ % interp -e 'printf("%x", 3735928559)'
+ deadbeef
+
+You can also read and execute Perl statements from a file while in the
+midst of your C program, by placing the filename in I<argv[1]> before
+calling I<perl_run>.
+
+=head2 Calling a Perl subroutine from your C program
+
+To call individual Perl subroutines, you can use any of the B<call_*>
+functions documented in L<perlcall>.
+In this example we'll use C<call_argv>.
+
+That's shown below, in a program I'll call I<showtime.c>.
+
+ #include <EXTERN.h>
+ #include <perl.h>
+
+ static PerlInterpreter *my_perl;
+
+ int main(int argc, char **argv, char **env)
+ {
+ char *args[] = { NULL };
+ PERL_SYS_INIT3(&argc,&argv,&env);
+ my_perl = perl_alloc();
+ perl_construct(my_perl);
+
+ perl_parse(my_perl, NULL, argc, argv, NULL);
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+
+ /*** skipping perl_run() ***/
+
+ call_argv("showtime", G_DISCARD | G_NOARGS, args);
+
+ perl_destruct(my_perl);
+ perl_free(my_perl);
+ PERL_SYS_TERM();
+ }
+
+where I<showtime> is a Perl subroutine that takes no arguments (that's the
+I<G_NOARGS>) and for which I'll ignore the return value (that's the
+I<G_DISCARD>). Those flags, and others, are discussed in L<perlcall>.
+
+I'll define the I<showtime> subroutine in a file called I<showtime.pl>:
+
+ print "I shan't be printed.";
+
+ sub showtime {
+ print time;
+ }
+
+Simple enough. Now compile and run:
+
+ % cc -o showtime showtime.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+ % showtime showtime.pl
+ 818284590
+
+yielding the number of seconds that elapsed between January 1, 1970
+(the beginning of the Unix epoch), and the moment I began writing this
+sentence.
+
+In this particular case we don't have to call I<perl_run>, as we set
+the PL_exit_flag PERL_EXIT_DESTRUCT_END which executes END blocks in
+perl_destruct.
+
+If you want to pass arguments to the Perl subroutine, you can add
+strings to the C<NULL>-terminated C<args> list passed to
+I<call_argv>. For other data types, or to examine return values,
+you'll need to manipulate the Perl stack. That's demonstrated in
+L<Fiddling with the Perl stack from your C program>.
+
+=head2 Evaluating a Perl statement from your C program
+
+Perl provides two API functions to evaluate pieces of Perl code.
+These are L<perlapi/eval_sv> and L<perlapi/eval_pv>.
+
+Arguably, these are the only routines you'll ever need to execute
+snippets of Perl code from within your C program. Your code can be as
+long as you wish; it can contain multiple statements; it can employ
+L<perlfunc/use>, L<perlfunc/require>, and L<perlfunc/do> to
+include external Perl files.
+
+I<eval_pv> lets us evaluate individual Perl strings, and then
+extract variables for coercion into C types. The following program,
+I<string.c>, executes three Perl strings, extracting an C<int> from
+the first, a C<float> from the second, and a C<char *> from the third.
+
+ #include <EXTERN.h>
+ #include <perl.h>
+
+ static PerlInterpreter *my_perl;
+
+ main (int argc, char **argv, char **env)
+ {
+ char *embedding[] = { "", "-e", "0" };
+
+ PERL_SYS_INIT3(&argc,&argv,&env);
+ my_perl = perl_alloc();
+ perl_construct( my_perl );
+
+ perl_parse(my_perl, NULL, 3, embedding, NULL);
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+ perl_run(my_perl);
+
+ /** Treat $a as an integer **/
+ eval_pv("$a = 3; $a **= 2", TRUE);
+ printf("a = %d\n", SvIV(get_sv("a", 0)));
+
+ /** Treat $a as a float **/
+ eval_pv("$a = 3.14; $a **= 2", TRUE);
+ printf("a = %f\n", SvNV(get_sv("a", 0)));
+
+ /** Treat $a as a string **/
+ eval_pv("$a = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);", TRUE);
+ printf("a = %s\n", SvPV_nolen(get_sv("a", 0)));
+
+ perl_destruct(my_perl);
+ perl_free(my_perl);
+ PERL_SYS_TERM();
+ }
+
+All of those strange functions with I<sv> in their names help convert Perl scalars to C types. They're described in L<perlguts> and L<perlapi>.
+
+If you compile and run I<string.c>, you'll see the results of using
+I<SvIV()> to create an C<int>, I<SvNV()> to create a C<float>, and
+I<SvPV()> to create a string:
+
+ a = 9
+ a = 9.859600
+ a = Just Another Perl Hacker
+
+In the example above, we've created a global variable to temporarily
+store the computed value of our eval'ed expression. It is also
+possible and in most cases a better strategy to fetch the return value
+from I<eval_pv()> instead. Example:
+
+ ...
+ SV *val = eval_pv("reverse 'rekcaH lreP rehtonA tsuJ'", TRUE);
+ printf("%s\n", SvPV_nolen(val));
+ ...
+
+This way, we avoid namespace pollution by not creating global
+variables and we've simplified our code as well.
+
+=head2 Performing Perl pattern matches and substitutions from your C program
+
+The I<eval_sv()> function lets us evaluate strings of Perl code, so we can
+define some functions that use it to "specialize" in matches and
+substitutions: I<match()>, I<substitute()>, and I<matches()>.
+
+ I32 match(SV *string, char *pattern);
+
+Given a string and a pattern (e.g., C<m/clasp/> or C</\b\w*\b/>, which
+in your C program might appear as "/\\b\\w*\\b/"), match()
+returns 1 if the string matches the pattern and 0 otherwise.
+
+ int substitute(SV **string, char *pattern);
+
+Given a pointer to an C<SV> and an C<=~> operation (e.g.,
+C<s/bob/robert/g> or C<tr[A-Z][a-z]>), substitute() modifies the string
+within the C<SV> as according to the operation, returning the number of substitutions
+made.
+
+ int matches(SV *string, char *pattern, AV **matches);
+
+Given an C<SV>, a pattern, and a pointer to an empty C<AV>,
+matches() evaluates C<$string =~ $pattern> in a list context, and
+fills in I<matches> with the array elements, returning the number of matches found.
+
+Here's a sample program, I<match.c>, that uses all three (long lines have
+been wrapped here):
+
+ #include <EXTERN.h>
+ #include <perl.h>
+
+ static PerlInterpreter *my_perl;
+
+ /** my_eval_sv(code, error_check)
+ ** kinda like eval_sv(),
+ ** but we pop the return value off the stack
+ **/
+ SV* my_eval_sv(SV *sv, I32 croak_on_error)
+ {
+ dSP;
+ SV* retval;
+
+
+ PUSHMARK(SP);
+ eval_sv(sv, G_SCALAR);
+
+ SPAGAIN;
+ retval = POPs;
+ PUTBACK;
+
+ if (croak_on_error && SvTRUE(ERRSV))
+ croak(SvPVx_nolen(ERRSV));
+
+ return retval;
+ }
+
+ /** match(string, pattern)
+ **
+ ** Used for matches in a scalar context.
+ **
+ ** Returns 1 if the match was successful; 0 otherwise.
+ **/
+
+ I32 match(SV *string, char *pattern)
+ {
+ SV *command = newSV(0), *retval;
+
+ sv_setpvf(command, "my $string = '%s'; $string =~ %s",
+ SvPV_nolen(string), pattern);
+
+ retval = my_eval_sv(command, TRUE);
+ SvREFCNT_dec(command);
+
+ return SvIV(retval);
+ }
+
+ /** substitute(string, pattern)
+ **
+ ** Used for =~ operations that modify their left-hand side (s/// and tr///)
+ **
+ ** Returns the number of successful matches, and
+ ** modifies the input string if there were any.
+ **/
+
+ I32 substitute(SV **string, char *pattern)
+ {
+ SV *command = newSV(0), *retval;
+
+ sv_setpvf(command, "$string = '%s'; ($string =~ %s)",
+ SvPV_nolen(*string), pattern);
+
+ retval = my_eval_sv(command, TRUE);
+ SvREFCNT_dec(command);
+
+ *string = get_sv("string", 0);
+ return SvIV(retval);
+ }
+
+ /** matches(string, pattern, matches)
+ **
+ ** Used for matches in a list context.
+ **
+ ** Returns the number of matches,
+ ** and fills in **matches with the matching substrings
+ **/
+
+ I32 matches(SV *string, char *pattern, AV **match_list)
+ {
+ SV *command = newSV(0);
+ I32 num_matches;
+
+ sv_setpvf(command, "my $string = '%s'; @array = ($string =~ %s)",
+ SvPV_nolen(string), pattern);
+
+ my_eval_sv(command, TRUE);
+ SvREFCNT_dec(command);
+
+ *match_list = get_av("array", 0);
+ num_matches = av_len(*match_list) + 1; /** assume $[ is 0 **/
+
+ return num_matches;
+ }
+
+ main (int argc, char **argv, char **env)
+ {
+ char *embedding[] = { "", "-e", "0" };
+ AV *match_list;
+ I32 num_matches, i;
+ SV *text;
+
+ PERL_SYS_INIT3(&argc,&argv,&env);
+ my_perl = perl_alloc();
+ perl_construct(my_perl);
+ perl_parse(my_perl, NULL, 3, embedding, NULL);
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+
+ text = newSV(0);
+ sv_setpv(text, "When he is at a convenience store and the "
+ "bill comes to some amount like 76 cents, Maynard is "
+ "aware that there is something he *should* do, something "
+ "that will enable him to get back a quarter, but he has "
+ "no idea *what*. He fumbles through his red squeezey "
+ "changepurse and gives the boy three extra pennies with "
+ "his dollar, hoping that he might luck into the correct "
+ "amount. The boy gives him back two of his own pennies "
+ "and then the big shiny quarter that is his prize. "
+ "-RICHH");
+
+ if (match(text, "m/quarter/")) /** Does text contain 'quarter'? **/
+ printf("match: Text contains the word 'quarter'.\n\n");
+ else
+ printf("match: Text doesn't contain the word 'quarter'.\n\n");
+
+ if (match(text, "m/eighth/")) /** Does text contain 'eighth'? **/
+ printf("match: Text contains the word 'eighth'.\n\n");
+ else
+ printf("match: Text doesn't contain the word 'eighth'.\n\n");
+
+ /** Match all occurrences of /wi../ **/
+ num_matches = matches(text, "m/(wi..)/g", &match_list);
+ printf("matches: m/(wi..)/g found %d matches...\n", num_matches);
+
+ for (i = 0; i < num_matches; i++)
+ printf("match: %s\n", SvPV_nolen(*av_fetch(match_list, i, FALSE)));
+ printf("\n");
+
+ /** Remove all vowels from text **/
+ num_matches = substitute(&text, "s/[aeiou]//gi");
+ if (num_matches) {
+ printf("substitute: s/[aeiou]//gi...%d substitutions made.\n",
+ num_matches);
+ printf("Now text is: %s\n\n", SvPV_nolen(text));
+ }
+
+ /** Attempt a substitution **/
+ if (!substitute(&text, "s/Perl/C/")) {
+ printf("substitute: s/Perl/C...No substitution made.\n\n");
+ }
+
+ SvREFCNT_dec(text);
+ PL_perl_destruct_level = 1;
+ perl_destruct(my_perl);
+ perl_free(my_perl);
+ PERL_SYS_TERM();
+ }
+
+which produces the output (again, long lines have been wrapped here)
+
+ match: Text contains the word 'quarter'.
+
+ match: Text doesn't contain the word 'eighth'.
+
+ matches: m/(wi..)/g found 2 matches...
+ match: will
+ match: with
+
+ substitute: s/[aeiou]//gi...139 substitutions made.
+ Now text is: Whn h s t cnvnnc str nd th bll cms t sm mnt lk 76 cnts,
+ Mynrd s wr tht thr s smthng h *shld* d, smthng tht wll nbl hm t gt bck
+ qrtr, bt h hs n d *wht*. H fmbls thrgh hs rd sqzy chngprs nd gvs th by
+ thr xtr pnns wth hs dllr, hpng tht h mght lck nt th crrct mnt. Th by gvs
+ hm bck tw f hs wn pnns nd thn th bg shny qrtr tht s hs prz. -RCHH
+
+ substitute: s/Perl/C...No substitution made.
+
+=head2 Fiddling with the Perl stack from your C program
+
+When trying to explain stacks, most computer science textbooks mumble
+something about spring-loaded columns of cafeteria plates: the last
+thing you pushed on the stack is the first thing you pop off. That'll
+do for our purposes: your C program will push some arguments onto "the Perl
+stack", shut its eyes while some magic happens, and then pop the
+results--the return value of your Perl subroutine--off the stack.
+
+First you'll need to know how to convert between C types and Perl
+types, with newSViv() and sv_setnv() and newAV() and all their
+friends. They're described in L<perlguts> and L<perlapi>.
+
+Then you'll need to know how to manipulate the Perl stack. That's
+described in L<perlcall>.
+
+Once you've understood those, embedding Perl in C is easy.
+
+Because C has no builtin function for integer exponentiation, let's
+make Perl's ** operator available to it (this is less useful than it
+sounds, because Perl implements ** with C's I<pow()> function). First
+I'll create a stub exponentiation function in I<power.pl>:
+
+ sub expo {
+ my ($a, $b) = @_;
+ return $a ** $b;
+ }
+
+Now I'll create a C program, I<power.c>, with a function
+I<PerlPower()> that contains all the perlguts necessary to push the
+two arguments into I<expo()> and to pop the return value out. Take a
+deep breath...
+
+ #include <EXTERN.h>
+ #include <perl.h>
+
+ static PerlInterpreter *my_perl;
+
+ static void
+ PerlPower(int a, int b)
+ {
+ dSP; /* initialize stack pointer */
+ ENTER; /* everything created after here */
+ SAVETMPS; /* ...is a temporary variable. */
+ PUSHMARK(SP); /* remember the stack pointer */
+ XPUSHs(sv_2mortal(newSViv(a))); /* push the base onto the stack */
+ XPUSHs(sv_2mortal(newSViv(b))); /* push the exponent onto stack */
+ PUTBACK; /* make local stack pointer global */
+ call_pv("expo", G_SCALAR); /* call the function */
+ SPAGAIN; /* refresh stack pointer */
+ /* pop the return value from stack */
+ printf ("%d to the %dth power is %d.\n", a, b, POPi);
+ PUTBACK;
+ FREETMPS; /* free that return value */
+ LEAVE; /* ...and the XPUSHed "mortal" args.*/
+ }
+
+ int main (int argc, char **argv, char **env)
+ {
+ char *my_argv[] = { "", "power.pl" };
+
+ PERL_SYS_INIT3(&argc,&argv,&env);
+ my_perl = perl_alloc();
+ perl_construct( my_perl );
+
+ perl_parse(my_perl, NULL, 2, my_argv, (char **)NULL);
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+ perl_run(my_perl);
+
+ PerlPower(3, 4); /*** Compute 3 ** 4 ***/
+
+ perl_destruct(my_perl);
+ perl_free(my_perl);
+ PERL_SYS_TERM();
+ }
+
+
+
+Compile and run:
+
+ % cc -o power power.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+ % power
+ 3 to the 4th power is 81.
+
+=head2 Maintaining a persistent interpreter
+
+When developing interactive and/or potentially long-running
+applications, it's a good idea to maintain a persistent interpreter
+rather than allocating and constructing a new interpreter multiple
+times. The major reason is speed: since Perl will only be loaded into
+memory once.
+
+However, you have to be more cautious with namespace and variable
+scoping when using a persistent interpreter. In previous examples
+we've been using global variables in the default package C<main>. We
+knew exactly what code would be run, and assumed we could avoid
+variable collisions and outrageous symbol table growth.
+
+Let's say your application is a server that will occasionally run Perl
+code from some arbitrary file. Your server has no way of knowing what
+code it's going to run. Very dangerous.
+
+If the file is pulled in by C<perl_parse()>, compiled into a newly
+constructed interpreter, and subsequently cleaned out with
+C<perl_destruct()> afterwards, you're shielded from most namespace
+troubles.
+
+One way to avoid namespace collisions in this scenario is to translate
+the filename into a guaranteed-unique package name, and then compile
+the code into that package using L<perlfunc/eval>. In the example
+below, each file will only be compiled once. Or, the application
+might choose to clean out the symbol table associated with the file
+after it's no longer needed. Using L<perlapi/call_argv>, We'll
+call the subroutine C<Embed::Persistent::eval_file> which lives in the
+file C<persistent.pl> and pass the filename and boolean cleanup/cache
+flag as arguments.
+
+Note that the process will continue to grow for each file that it
+uses. In addition, there might be C<AUTOLOAD>ed subroutines and other
+conditions that cause Perl's symbol table to grow. You might want to
+add some logic that keeps track of the process size, or restarts
+itself after a certain number of requests, to ensure that memory
+consumption is minimized. You'll also want to scope your variables
+with L<perlfunc/my> whenever possible.
+
+
+ package Embed::Persistent;
+ #persistent.pl
+
+ use strict;
+ our %Cache;
+ use Symbol qw(delete_package);
+
+ sub valid_package_name {
+ my($string) = @_;
+ $string =~ s/([^A-Za-z0-9\/])/sprintf("_%2x",unpack("C",$1))/eg;
+ # second pass only for words starting with a digit
+ $string =~ s|/(\d)|sprintf("/_%2x",unpack("C",$1))|eg;
+
+ # Dress it up as a real package name
+ $string =~ s|/|::|g;
+ return "Embed" . $string;
+ }
+
+ sub eval_file {
+ my($filename, $delete) = @_;
+ my $package = valid_package_name($filename);
+ my $mtime = -M $filename;
+ if(defined $Cache{$package}{mtime}
+ &&
+ $Cache{$package}{mtime} <= $mtime)
+ {
+ # we have compiled this subroutine already,
+ # it has not been updated on disk, nothing left to do
+ print STDERR "already compiled $package->handler\n";
+ }
+ else {
+ local *FH;
+ open FH, $filename or die "open '$filename' $!";
+ local($/) = undef;
+ my $sub = <FH>;
+ close FH;
+
+ #wrap the code into a subroutine inside our unique package
+ my $eval = qq{package $package; sub handler { $sub; }};
+ {
+ # hide our variables within this block
+ my($filename,$mtime,$package,$sub);
+ eval $eval;
+ }
+ die $@ if $@;
+
+ #cache it unless we're cleaning out each time
+ $Cache{$package}{mtime} = $mtime unless $delete;
+ }
+
+ eval {$package->handler;};
+ die $@ if $@;
+
+ delete_package($package) if $delete;
+
+ #take a look if you want
+ #print Devel::Symdump->rnew($package)->as_string, $/;
+ }
+
+ 1;
+
+ __END__
+
+ /* persistent.c */
+ #include <EXTERN.h>
+ #include <perl.h>
+
+ /* 1 = clean out filename's symbol table after each request, 0 = don't */
+ #ifndef DO_CLEAN
+ #define DO_CLEAN 0
+ #endif
+
+ #define BUFFER_SIZE 1024
+
+ static PerlInterpreter *my_perl = NULL;
+
+ int
+ main(int argc, char **argv, char **env)
+ {
+ char *embedding[] = { "", "persistent.pl" };
+ char *args[] = { "", DO_CLEAN, NULL };
+ char filename[BUFFER_SIZE];
+ int exitstatus = 0;
+
+ PERL_SYS_INIT3(&argc,&argv,&env);
+ if((my_perl = perl_alloc()) == NULL) {
+ fprintf(stderr, "no memory!");
+ exit(1);
+ }
+ perl_construct(my_perl);
+
+ PL_origalen = 1; /* don't let $0 assignment update the proctitle or embedding[0] */
+ exitstatus = perl_parse(my_perl, NULL, 2, embedding, NULL);
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+ if(!exitstatus) {
+ exitstatus = perl_run(my_perl);
+
+ while(printf("Enter file name: ") &&
+ fgets(filename, BUFFER_SIZE, stdin)) {
+
+ filename[strlen(filename)-1] = '\0'; /* strip \n */
+ /* call the subroutine, passing it the filename as an argument */
+ args[0] = filename;
+ call_argv("Embed::Persistent::eval_file",
+ G_DISCARD | G_EVAL, args);
+
+ /* check $@ */
+ if(SvTRUE(ERRSV))
+ fprintf(stderr, "eval error: %s\n", SvPV_nolen(ERRSV));
+ }
+ }
+
+ PL_perl_destruct_level = 0;
+ perl_destruct(my_perl);
+ perl_free(my_perl);
+ PERL_SYS_TERM();
+ exit(exitstatus);
+ }
+
+Now compile:
+
+ % cc -o persistent persistent.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+Here's an example script file:
+
+ #test.pl
+ my $string = "hello";
+ foo($string);
+
+ sub foo {
+ print "foo says: @_\n";
+ }
+
+Now run:
+
+ % persistent
+ Enter file name: test.pl
+ foo says: hello
+ Enter file name: test.pl
+ already compiled Embed::test_2epl->handler
+ foo says: hello
+ Enter file name: ^C
+
+=head2 Execution of END blocks
+
+Traditionally END blocks have been executed at the end of the perl_run.
+This causes problems for applications that never call perl_run. Since
+perl 5.7.2 you can specify C<PL_exit_flags |= PERL_EXIT_DESTRUCT_END>
+to get the new behaviour. This also enables the running of END blocks if
+the perl_parse fails and C<perl_destruct> will return the exit value.
+
+=head2 $0 assignments
+
+When a perl script assigns a value to $0 then the perl runtime will
+try to make this value show up as the program name reported by "ps" by
+updating the memory pointed to by the argv passed to perl_parse() and
+also calling API functions like setproctitle() where available. This
+behaviour might not be appropriate when embedding perl and can be
+disabled by assigning the value C<1> to the variable C<PL_origalen>
+before perl_parse() is called.
+
+The F<persistent.c> example above is for instance likely to segfault
+when $0 is assigned to if the C<PL_origalen = 1;> assignment is
+removed. This because perl will try to write to the read only memory
+of the C<embedding[]> strings.
+
+=head2 Maintaining multiple interpreter instances
+
+Some rare applications will need to create more than one interpreter
+during a session. Such an application might sporadically decide to
+release any resources associated with the interpreter.
+
+The program must take care to ensure that this takes place I<before>
+the next interpreter is constructed. By default, when perl is not
+built with any special options, the global variable
+C<PL_perl_destruct_level> is set to C<0>, since extra cleaning isn't
+usually needed when a program only ever creates a single interpreter
+in its entire lifetime.
+
+Setting C<PL_perl_destruct_level> to C<1> makes everything squeaky clean:
+
+ while(1) {
+ ...
+ /* reset global variables here with PL_perl_destruct_level = 1 */
+ PL_perl_destruct_level = 1;
+ perl_construct(my_perl);
+ ...
+ /* clean and reset _everything_ during perl_destruct */
+ PL_perl_destruct_level = 1;
+ perl_destruct(my_perl);
+ perl_free(my_perl);
+ ...
+ /* let's go do it again! */
+ }
+
+When I<perl_destruct()> is called, the interpreter's syntax parse tree
+and symbol tables are cleaned up, and global variables are reset. The
+second assignment to C<PL_perl_destruct_level> is needed because
+perl_construct resets it to C<0>.
+
+Now suppose we have more than one interpreter instance running at the
+same time. This is feasible, but only if you used the Configure option
+C<-Dusemultiplicity> or the options C<-Dusethreads -Duseithreads> when
+building perl. By default, enabling one of these Configure options
+sets the per-interpreter global variable C<PL_perl_destruct_level> to
+C<1>, so that thorough cleaning is automatic and interpreter variables
+are initialized correctly. Even if you don't intend to run two or
+more interpreters at the same time, but to run them sequentially, like
+in the above example, it is recommended to build perl with the
+C<-Dusemultiplicity> option otherwise some interpreter variables may
+not be initialized correctly between consecutive runs and your
+application may crash.
+
+See also L<perlxs/Thread-aware system interfaces>.
+
+Using C<-Dusethreads -Duseithreads> rather than C<-Dusemultiplicity>
+is more appropriate if you intend to run multiple interpreters
+concurrently in different threads, because it enables support for
+linking in the thread libraries of your system with the interpreter.
+
+Let's give it a try:
+
+
+ #include <EXTERN.h>
+ #include <perl.h>
+
+ /* we're going to embed two interpreters */
+ /* we're going to embed two interpreters */
+
+ #define SAY_HELLO "-e", "print qq(Hi, I'm $^X\n)"
+
+ int main(int argc, char **argv, char **env)
+ {
+ PerlInterpreter *one_perl, *two_perl;
+ char *one_args[] = { "one_perl", SAY_HELLO };
+ char *two_args[] = { "two_perl", SAY_HELLO };
+
+ PERL_SYS_INIT3(&argc,&argv,&env);
+ one_perl = perl_alloc();
+ two_perl = perl_alloc();
+
+ PERL_SET_CONTEXT(one_perl);
+ perl_construct(one_perl);
+ PERL_SET_CONTEXT(two_perl);
+ perl_construct(two_perl);
+
+ PERL_SET_CONTEXT(one_perl);
+ perl_parse(one_perl, NULL, 3, one_args, (char **)NULL);
+ PERL_SET_CONTEXT(two_perl);
+ perl_parse(two_perl, NULL, 3, two_args, (char **)NULL);
+
+ PERL_SET_CONTEXT(one_perl);
+ perl_run(one_perl);
+ PERL_SET_CONTEXT(two_perl);
+ perl_run(two_perl);
+
+ PERL_SET_CONTEXT(one_perl);
+ perl_destruct(one_perl);
+ PERL_SET_CONTEXT(two_perl);
+ perl_destruct(two_perl);
+
+ PERL_SET_CONTEXT(one_perl);
+ perl_free(one_perl);
+ PERL_SET_CONTEXT(two_perl);
+ perl_free(two_perl);
+ PERL_SYS_TERM();
+ }
+
+Note the calls to PERL_SET_CONTEXT(). These are necessary to initialize
+the global state that tracks which interpreter is the "current" one on
+the particular process or thread that may be running it. It should
+always be used if you have more than one interpreter and are making
+perl API calls on both interpreters in an interleaved fashion.
+
+PERL_SET_CONTEXT(interp) should also be called whenever C<interp> is
+used by a thread that did not create it (using either perl_alloc(), or
+the more esoteric perl_clone()).
+
+Compile as usual:
+
+ % cc -o multiplicity multiplicity.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+Run it, Run it:
+
+ % multiplicity
+ Hi, I'm one_perl
+ Hi, I'm two_perl
+
+=head2 Using Perl modules, which themselves use C libraries, from your C program
+
+If you've played with the examples above and tried to embed a script
+that I<use()>s a Perl module (such as I<Socket>) which itself uses a C or C++ library,
+this probably happened:
+
+
+ Can't load module Socket, dynamic loading not available in this perl.
+ (You may need to build a new perl executable which either supports
+ dynamic loading or has the Socket module statically linked into it.)
+
+
+What's wrong?
+
+Your interpreter doesn't know how to communicate with these extensions
+on its own. A little glue will help. Up until now you've been
+calling I<perl_parse()>, handing it NULL for the second argument:
+
+ perl_parse(my_perl, NULL, argc, my_argv, NULL);
+
+That's where the glue code can be inserted to create the initial contact between
+Perl and linked C/C++ routines. Let's take a look some pieces of I<perlmain.c>
+to see how Perl does this:
+
+ static void xs_init (pTHX);
+
+ EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
+ EXTERN_C void boot_Socket (pTHX_ CV* cv);
+
+
+ EXTERN_C void
+ xs_init(pTHX)
+ {
+ char *file = __FILE__;
+ /* DynaLoader is a special case */
+ newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
+ newXS("Socket::bootstrap", boot_Socket, file);
+ }
+
+Simply put: for each extension linked with your Perl executable
+(determined during its initial configuration on your
+computer or when adding a new extension),
+a Perl subroutine is created to incorporate the extension's
+routines. Normally, that subroutine is named
+I<Module::bootstrap()> and is invoked when you say I<use Module>. In
+turn, this hooks into an XSUB, I<boot_Module>, which creates a Perl
+counterpart for each of the extension's XSUBs. Don't worry about this
+part; leave that to the I<xsubpp> and extension authors. If your
+extension is dynamically loaded, DynaLoader creates I<Module::bootstrap()>
+for you on the fly. In fact, if you have a working DynaLoader then there
+is rarely any need to link in any other extensions statically.
+
+
+Once you have this code, slap it into the second argument of I<perl_parse()>:
+
+
+ perl_parse(my_perl, xs_init, argc, my_argv, NULL);
+
+
+Then compile:
+
+ % cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+ % interp
+ use Socket;
+ use SomeDynamicallyLoadedModule;
+
+ print "Now I can use extensions!\n"'
+
+B<ExtUtils::Embed> can also automate writing the I<xs_init> glue code.
+
+ % perl -MExtUtils::Embed -e xsinit -- -o perlxsi.c
+ % cc -c perlxsi.c `perl -MExtUtils::Embed -e ccopts`
+ % cc -c interp.c `perl -MExtUtils::Embed -e ccopts`
+ % cc -o interp perlxsi.o interp.o `perl -MExtUtils::Embed -e ldopts`
+
+Consult L<perlxs>, L<perlguts>, and L<perlapi> for more details.
+
+=head1 Embedding Perl under Win32
+
+In general, all of the source code shown here should work unmodified under
+Windows.
+
+However, there are some caveats about the command-line examples shown.
+For starters, backticks won't work under the Win32 native command shell.
+The ExtUtils::Embed kit on CPAN ships with a script called
+B<genmake>, which generates a simple makefile to build a program from
+a single C source file. It can be used like this:
+
+ C:\ExtUtils-Embed\eg> perl genmake interp.c
+ C:\ExtUtils-Embed\eg> nmake
+ C:\ExtUtils-Embed\eg> interp -e "print qq{I'm embedded in Win32!\n}"
+
+You may wish to use a more robust environment such as the Microsoft
+Developer Studio. In this case, run this to generate perlxsi.c:
+
+ perl -MExtUtils::Embed -e xsinit
+
+Create a new project and Insert -> Files into Project: perlxsi.c,
+perl.lib, and your own source files, e.g. interp.c. Typically you'll
+find perl.lib in B<C:\perl\lib\CORE>, if not, you should see the
+B<CORE> directory relative to C<perl -V:archlib>. The studio will
+also need this path so it knows where to find Perl include files.
+This path can be added via the Tools -> Options -> Directories menu.
+Finally, select Build -> Build interp.exe and you're ready to go.
+
+=head1 Hiding Perl_
+
+If you completely hide the short forms forms of the Perl public API,
+add -DPERL_NO_SHORT_NAMES to the compilation flags. This means that
+for example instead of writing
+
+ warn("%d bottles of beer on the wall", bottlecount);
+
+you will have to write the explicit full form
+
+ Perl_warn(aTHX_ "%d bottles of beer on the wall", bottlecount);
+
+(See L<perlguts/Background and PERL_IMPLICIT_CONTEXT for the explanation
+of the C<aTHX_>.> ) Hiding the short forms is very useful for avoiding
+all sorts of nasty (C preprocessor or otherwise) conflicts with other
+software packages (Perl defines about 2400 APIs with these short names,
+take or leave few hundred, so there certainly is room for conflict.)
+
+=head1 MORAL
+
+You can sometimes I<write faster code> in C, but
+you can always I<write code faster> in Perl. Because you can use
+each from the other, combine them as you wish.
+
+
+=head1 AUTHOR
+
+Jon Orwant <F<orwant@media.mit.edu>> and Doug MacEachern
+<F<dougm@covalent.net>>, with small contributions from Tim Bunce, Tom
+Christiansen, Guy Decoux, Hallvard Furuseth, Dov Grobgeld, and Ilya
+Zakharevich.
+
+Doug MacEachern has an article on embedding in Volume 1, Issue 4 of
+The Perl Journal ( http://www.tpj.com/ ). Doug is also the developer of the
+most widely-used Perl embedding: the mod_perl system
+(perl.apache.org), which embeds Perl in the Apache web server.
+Oracle, Binary Evolution, ActiveState, and Ben Sugars's nsapi_perl
+have used this model for Oracle, Netscape and Internet Information
+Server Perl plugins.
+
+=head1 COPYRIGHT
+
+Copyright (C) 1995, 1996, 1997, 1998 Doug MacEachern and Jon Orwant. All
+Rights Reserved.
+
+Permission is granted to make and distribute verbatim copies of this
+documentation provided the copyright notice and this permission notice are
+preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+documentation under the conditions for verbatim copying, provided also
+that they are marked clearly as modified versions, that the authors'
+names and title are unchanged (though subtitles and additional
+authors' names may be added), and that the entire resulting derived
+work is distributed under the terms of a permission notice identical
+to this one.
+
+Permission is granted to copy and distribute translations of this
+documentation into another language, under the above conditions for
+modified versions.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlepoc.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlepoc.pod
new file mode 100755
index 00000000000..5cfa4dfadf0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlepoc.pod
@@ -0,0 +1,159 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.epoc - Perl for EPOC
+
+=head1 SYNOPSIS
+
+Perl 5 README file for the EPOC Release 5 operating system.
+
+=head1 INTRODUCTION
+
+EPOC is an OS for palmtops and mobile phones. For more informations look at:
+http://www.symbian.com/
+
+This is a port of perl to the epocemx SDK by Eberhard Mattes, which
+itself uses the SDK by symbian. Essentially epocemx it is a POSIX
+look alike environment for the EPOC OS. For more information look at:
+http://epocemx.sourceforge.net/
+
+perl and epocemx runs on Epoc Release 5 machines: Psion 5mx, 5mx Pro,
+Psion Revo, Psion Netbook and on the Ericsson M128. It may run on Epoc
+Release 3 Hardware (Series 5 classic), too. For more information about
+this hardware please refer to http://www.psion.com/
+
+Vendors which like to have support for their devices are free to send
+me a sample.
+
+=head1 INSTALLING PERL ON EPOC
+
+You can download a ready-to-install version from
+http://www.oflebbe.de/oflebbe/perl/
+
+You will need at least ~6MB free space in order to install and run perl.
+
+Please install the emxusr.sis package from
+http://epocemx.sourceforge.net/ first.
+
+Install perl.sis on the EPOC machine. If you do not know how to do
+that, consult your PsiWin documentation.
+
+Perl itself and its standard library is using 4 MB disk space.
+Unicode support and some other modules are left out. (For details,
+please look into epoc/createpkg.pl). If you like to use these modules,
+you are free to copy them from a current perl release.
+
+=head1 STARTING PERL ON EPOC
+
+Please use the epocemx shell to start perl. perl integrates with the
+conventions of epocemx.
+
+=head2 Editors on Epoc
+
+A suitable text editor can be downloaded from symbian
+http://www.symbian.com/developer/downloads/files/editor.zip
+
+=head2 Features of Perl on Epoc
+
+The built-in function EPOC::getcwd returns the current directory.
+
+=head2 Restrictions of Perl on Epoc
+
+Features are left out, because of restrictions of the POSIX support in
+EPOC:
+
+=over 4
+
+=item *
+
+socket IO is only implemented poorly. You can only use sysread and
+syswrite on them. The commands read, write, print, <> do not work for
+sockets. This may change iff epocemx supports sockets.
+
+=item *
+
+kill, alarm and signals. Do not try to use them. This may be
+impossible to implement on EPOC.
+
+=item *
+
+select is missing.
+
+=item *
+
+binmode does not exist. (No CR LF to LF translation for text files)
+
+=item *
+
+EPOC does not handle the notion of current drive and current
+directory very well (i.e. not at all, but it tries hard to emulate
+one). See PATH.
+
+=item *
+
+Heap is limited to 4MB.
+
+=item *
+
+Dynamic loading is not implemented.
+
+=back
+
+=head2 Compiling Perl 5 on the EPOC cross compiling environment
+
+Sorry, this is far too short.
+
+=over 4
+
+=item *
+
+You will need the epocemx SDK from Eberhard Mattes.
+
+=item *
+
+Get the Perl sources from your nearest CPAN site.
+
+=item *
+
+Unpack the sources.
+
+=item *
+
+Build a native perl from this sources... Make sure to save the
+miniperl executable as miniperl.native.
+
+Start again from scratch
+
+ cp epoc/* .
+ ./Configure -S
+ make
+ cp miniperl.native miniperl
+ touch miniperl.exe
+ make
+ perl createpkg.pl
+
+ emxsis perl.pkg perl.sis
+
+=back
+
+=head1 SUPPORT STATUS OF PERL ON EPOC
+
+I'm offering this port "as is". You can ask me questions, but I can't
+guarantee I'll be able to answer them. Since the port to epocemx is
+quite new, please check the web for updates first.
+
+Very special thanks to Eberhard Mattes for epocemx.
+
+=head1 AUTHOR
+
+Olaf Flebbe <olaf@oflebbe.de>
+http://www.oflebbe.de/oflebbe/perl/
+
+=head1 LAST UPDATE
+
+2003-01-18
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfaq.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq.pod
new file mode 100755
index 00000000000..586282326b6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq.pod
@@ -0,0 +1,1443 @@
+=head1 NAME
+
+perlfaq - frequently asked questions about Perl
+
+=head1 DESCRIPTION
+
+The perlfaq comprises several documents that answer the most commonly
+asked questions about Perl and Perl programming. It's divided by topic
+into nine major sections outlined in this document.
+
+=head2 Where to get the perlfaq
+
+The perlfaq comes with the standard Perl distribution, so if you have Perl
+you should have the perlfaq. You should also have the C<perldoc> tool
+that lets you read the L<perlfaq>:
+
+ $ perldoc perlfaq
+
+Besides your local system, you can find the perlfaq on the web, including
+at http://perldoc.perl.org/ .
+
+The perlfaq is an evolving document and you can read the latest version
+at http://faq.perl.org/ . The perlfaq-workers periodically post extracts
+of the latest perlfaq to comp.lang.perl.misc.
+
+You can view the source tree at
+https://github.com/briandfoy/perlfaq (which is outside of the
+main Perl source tree). The git repository notes all changes to the FAQ
+and holds the latest version of the working documents and may vary
+significantly from the version distributed with the latest version of
+Perl. Check the repository before sending your corrections.
+
+=head2 How to contribute to the perlfaq
+
+You can mail corrections, additions, and suggestions to
+C<< <perlfaq-workers AT perl DOT org> >>. The perlfaq volunteers use this
+address to coordinate their efforts and track the perlfaq development.
+They appreciate your contributions to the FAQ but do not have time to
+provide individual help, so don't use this address to ask FAQs.
+
+The perlfaq server posts extracts of the perlfaq to that newsgroup every
+6 hours (or so), and the community of volunteers reviews and updates the
+answers. If you'd like to help review and update the answers, check out
+comp.lang.perl.misc.
+
+You can also fork the git repository for the perlfaq and send a pull
+request so the main repository can pull your changes. The repository
+is at:
+
+ https://github.com/briandfoy/perlfaq
+
+=head2 What will happen if you mail your Perl programming problems to the authors?
+
+The perlfaq-workers like to keep all traffic on the perlfaq-workers list
+so that everyone can see the work being done (and the work that needs to
+be done). The mailing list serves as an official record. If you email the
+authors or maintainers directly, you'll probably get a reply asking you
+to post to the mailing list. If you don't get a reply, it probably means
+that the person never saw the message or didn't have time to deal with
+it. Posting to the list allows the volunteers with time to deal with it
+when others are busy.
+
+If you have a question that isn't in the FAQ and you would like help with
+it, try the resources in L<perlfaq2>.
+
+=head1 CREDITS
+
+Tom Christiansen wrote the original perlfaq then expanded it with the
+help of Nat Torkington. The perlfaq-workers maintain current document
+and the denizens of comp.lang.perl.misc regularly review and update the
+FAQ. Several people have contributed answers, corrections, and comments,
+and the perlfaq notes those contributions wherever appropriate.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2009 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+Tom Christainsen wrote the original version of this document.
+brian d foy C<< <bdfoy@cpan.org> >> wrote this version. See the
+individual perlfaq documents for additional copyright information.
+
+This document is available under the same terms as Perl itself. Code
+examples in all the perlfaq documents are in the public domain. Use
+them as you see fit and at your own risk with no warranty from anyone.
+
+=head1 Table of Contents
+
+=over 4
+
+=item perlfaq - this document
+
+=item perlfaq1 - General Questions About Perl
+
+=item perlfaq2 - Obtaining and Learning about Perl
+
+=item perlfaq3 - Programming Tools
+
+=item perlfaq4 - Data Manipulation
+
+=item perlfaq5 - Files and Formats
+
+=item perlfaq6 - Regular Expressions
+
+=item perlfaq7 - General Perl Language Issues
+
+=item perlfaq8 - System Interaction
+
+=item perlfaq9 - Networking
+
+=back
+
+=head1 The Questions
+
+=head2 L<perlfaq1>: General Questions About Perl
+
+Very general, high-level questions about Perl.
+
+=over 4
+
+=item *
+
+What is Perl?
+
+=item *
+
+Who supports Perl? Who develops it? Why is it free?
+
+=item *
+
+Which version of Perl should I use?
+
+=item *
+
+What are Perl 4, Perl 5, or Perl 6?
+
+=item *
+
+What was Ponie?
+
+=item *
+
+What is Perl 6?
+
+=item *
+
+How stable is Perl?
+
+=item *
+
+Is Perl difficult to learn?
+
+=item *
+
+How does Perl compare with other languages like Java, Python, REXX, Scheme, or Tcl?
+
+=item *
+
+Can I do [task] in Perl?
+
+=item *
+
+When shouldn't I program in Perl?
+
+=item *
+
+What's the difference between "perl" and "Perl"?
+
+=item *
+
+Is it a Perl program or a Perl script?
+
+=item *
+
+What is a JAPH?
+
+=item *
+
+Where can I get a list of Larry Wall witticisms?
+
+=item *
+
+How can I convince others to use Perl?
+
+=back
+
+
+=head2 L<perlfaq2>: Obtaining and Learning about Perl
+
+Where to find source and documentation for Perl, support, and related matters.
+
+=over 4
+
+=item *
+
+What machines support perl? Where do I get it?
+
+=item *
+
+How can I get a binary version of perl?
+
+=item *
+
+I don't have a C compiler. How can I build my own Perl interpreter?
+
+=item *
+
+I copied the perl binary from one machine to another, but scripts don't work.
+
+=item *
+
+I grabbed the sources and tried to compile but gdbm/dynamic loading/malloc/linking/... failed. How do I make it work?
+
+=item *
+
+What modules and extensions are available for Perl? What is CPAN? What does CPAN/src/... mean?
+
+=item *
+
+Is there an ISO or ANSI certified version of Perl?
+
+=item *
+
+Where can I get information on Perl?
+
+=item *
+
+What are the Perl newsgroups on Usenet? Where do I post questions?
+
+=item *
+
+Where should I post source code?
+
+=item *
+
+Perl Books
+
+=item *
+
+Which magazines have Perl content?
+
+=item *
+
+What mailing lists are there for Perl?
+
+=item *
+
+Where are the archives for comp.lang.perl.misc?
+
+=item *
+
+Where can I buy a commercial version of perl?
+
+=item *
+
+Where do I send bug reports?
+
+=item *
+
+What is perl.com? Perl Mongers? pm.org? perl.org? cpan.org?
+
+=back
+
+
+=head2 L<perlfaq3>: Programming Tools
+
+Programmer tools and programming support.
+
+=over 4
+
+=item *
+
+How do I do (anything)?
+
+=item *
+
+How can I use Perl interactively?
+
+=item *
+
+Is there a Perl shell?
+
+=item *
+
+How do I find which modules are installed on my system?
+
+=item *
+
+How do I debug my Perl programs?
+
+=item *
+
+How do I profile my Perl programs?
+
+=item *
+
+How do I cross-reference my Perl programs?
+
+=item *
+
+Is there a pretty-printer (formatter) for Perl?
+
+=item *
+
+Is there a ctags for Perl?
+
+=item *
+
+Is there an IDE or Windows Perl Editor?
+
+=item *
+
+Where can I get Perl macros for vi?
+
+=item *
+
+Where can I get perl-mode for emacs?
+
+=item *
+
+How can I use curses with Perl?
+
+=item *
+
+How can I write a GUI (X, Tk, Gtk, etc.) in Perl?
+
+=item *
+
+How can I make my Perl program run faster?
+
+=item *
+
+How can I make my Perl program take less memory?
+
+=item *
+
+Is it safe to return a reference to local or lexical data?
+
+=item *
+
+How can I free an array or hash so my program shrinks?
+
+=item *
+
+How can I make my CGI script more efficient?
+
+=item *
+
+How can I hide the source for my Perl program?
+
+=item *
+
+How can I compile my Perl program into byte code or C?
+
+=item *
+
+How can I get C<#!perl> to work on [MS-DOS,NT,...]?
+
+=item *
+
+Can I write useful Perl programs on the command line?
+
+=item *
+
+Why don't Perl one-liners work on my DOS/Mac/VMS system?
+
+=item *
+
+Where can I learn about CGI or Web programming in Perl?
+
+=item *
+
+Where can I learn about object-oriented Perl programming?
+
+=item *
+
+Where can I learn about linking C with Perl?
+
+=item *
+
+I've read perlembed, perlguts, etc., but I can't embed perl in my C program; what am I doing wrong?
+
+=item *
+
+When I tried to run my script, I got this message. What does it mean?
+
+=item *
+
+What's MakeMaker?
+
+=back
+
+
+=head2 L<perlfaq4>: Data Manipulation
+
+Manipulating numbers, dates, strings, arrays, hashes, and miscellaneous data issues.
+
+=over 4
+
+=item *
+
+Why am I getting long decimals (eg, 19.9499999999999) instead of the numbers I should be getting (eg, 19.95)?
+
+=item *
+
+Why is int() broken?
+
+=item *
+
+Why isn't my octal data interpreted correctly?
+
+=item *
+
+Does Perl have a round() function? What about ceil() and floor()? Trig functions?
+
+=item *
+
+How do I convert between numeric representations/bases/radixes?
+
+=item *
+
+Why doesn't & work the way I want it to?
+
+=item *
+
+How do I multiply matrices?
+
+=item *
+
+How do I perform an operation on a series of integers?
+
+=item *
+
+How can I output Roman numerals?
+
+=item *
+
+Why aren't my random numbers random?
+
+=item *
+
+How do I get a random number between X and Y?
+
+=item *
+
+How do I find the day or week of the year?
+
+=item *
+
+How do I find the current century or millennium?
+
+=item *
+
+How can I compare two dates and find the difference?
+
+=item *
+
+How can I take a string and turn it into epoch seconds?
+
+=item *
+
+How can I find the Julian Day?
+
+=item *
+
+How do I find yesterday's date?
+
+=item *
+
+Does Perl have a Year 2000 problem? Is Perl Y2K compliant?
+
+=item *
+
+How do I validate input?
+
+=item *
+
+How do I unescape a string?
+
+=item *
+
+How do I remove consecutive pairs of characters?
+
+=item *
+
+How do I expand function calls in a string?
+
+=item *
+
+How do I find matching/nesting anything?
+
+=item *
+
+How do I reverse a string?
+
+=item *
+
+How do I expand tabs in a string?
+
+=item *
+
+How do I reformat a paragraph?
+
+=item *
+
+How can I access or change N characters of a string?
+
+=item *
+
+How do I change the Nth occurrence of something?
+
+=item *
+
+How can I count the number of occurrences of a substring within a string?
+
+=item *
+
+How do I capitalize all the words on one line?
+
+=item *
+
+How can I split a [character] delimited string except when inside [character]?
+
+=item *
+
+How do I strip blank space from the beginning/end of a string?
+
+=item *
+
+How do I pad a string with blanks or pad a number with zeroes?
+
+=item *
+
+How do I extract selected columns from a string?
+
+=item *
+
+How do I find the soundex value of a string?
+
+=item *
+
+How can I expand variables in text strings?
+
+=item *
+
+What's wrong with always quoting "$vars"?
+
+=item *
+
+Why don't my E<lt>E<lt>HERE documents work?
+
+=item *
+
+What is the difference between a list and an array?
+
+=item *
+
+What is the difference between $array[1] and @array[1]?
+
+=item *
+
+How can I remove duplicate elements from a list or array?
+
+=item *
+
+How can I tell whether a certain element is contained in a list or array?
+
+=item *
+
+How do I compute the difference of two arrays? How do I compute the intersection of two arrays?
+
+=item *
+
+How do I test whether two arrays or hashes are equal?
+
+=item *
+
+How do I find the first array element for which a condition is true?
+
+=item *
+
+How do I handle linked lists?
+
+=item *
+
+How do I handle circular lists?
+
+=item *
+
+How do I shuffle an array randomly?
+
+=item *
+
+How do I process/modify each element of an array?
+
+=item *
+
+How do I select a random element from an array?
+
+=item *
+
+How do I permute N elements of a list?
+
+=item *
+
+How do I sort an array by (anything)?
+
+=item *
+
+How do I manipulate arrays of bits?
+
+=item *
+
+Why does defined() return true on empty arrays and hashes?
+
+=item *
+
+How do I process an entire hash?
+
+=item *
+
+How do I merge two hashes?
+
+=item *
+
+What happens if I add or remove keys from a hash while iterating over it?
+
+=item *
+
+How do I look up a hash element by value?
+
+=item *
+
+How can I know how many entries are in a hash?
+
+=item *
+
+How do I sort a hash (optionally by value instead of key)?
+
+=item *
+
+How can I always keep my hash sorted?
+
+=item *
+
+What's the difference between "delete" and "undef" with hashes?
+
+=item *
+
+Why don't my tied hashes make the defined/exists distinction?
+
+=item *
+
+How do I reset an each() operation part-way through?
+
+=item *
+
+How can I get the unique keys from two hashes?
+
+=item *
+
+How can I store a multidimensional array in a DBM file?
+
+=item *
+
+How can I make my hash remember the order I put elements into it?
+
+=item *
+
+Why does passing a subroutine an undefined element in a hash create it?
+
+=item *
+
+How can I make the Perl equivalent of a C structure/C++ class/hash or array of hashes or arrays?
+
+=item *
+
+How can I use a reference as a hash key?
+
+=item *
+
+How do I handle binary data correctly?
+
+=item *
+
+How do I determine whether a scalar is a number/whole/integer/float?
+
+=item *
+
+How do I keep persistent data across program calls?
+
+=item *
+
+How do I print out or copy a recursive data structure?
+
+=item *
+
+How do I define methods for every class/object?
+
+=item *
+
+How do I verify a credit card checksum?
+
+=item *
+
+How do I pack arrays of doubles or floats for XS code?
+
+=back
+
+
+=head2 L<perlfaq5>: Files and Formats
+
+I/O and the "f" issues: filehandles, flushing, formats, and footers.
+
+=over 4
+
+=item *
+
+How do I flush/unbuffer an output filehandle? Why must I do this?
+
+=item *
+
+How do I change, delete, or insert a line in a file, or append to the beginning of a file?
+
+=item *
+
+How do I count the number of lines in a file?
+
+=item *
+
+How can I use Perl's C<-i> option from within a program?
+
+=item *
+
+How can I copy a file?
+
+=item *
+
+How do I make a temporary file name?
+
+=item *
+
+How can I manipulate fixed-record-length files?
+
+=item *
+
+How can I make a filehandle local to a subroutine? How do I pass filehandles between subroutines? How do I make an array of filehandles?
+
+=item *
+
+How can I use a filehandle indirectly?
+
+=item *
+
+How can I set up a footer format to be used with write()?
+
+=item *
+
+How can I write() into a string?
+
+=item *
+
+How can I open a filehandle to a string?
+
+=item *
+
+How can I output my numbers with commas added?
+
+=item *
+
+How can I translate tildes (~) in a filename?
+
+=item *
+
+How come when I open a file read-write it wipes it out?
+
+=item *
+
+Why do I sometimes get an "Argument list too long" when I use E<lt>*E<gt>?
+
+=item *
+
+Is there a leak/bug in glob()?
+
+=item *
+
+How can I open a file with a leading ">" or trailing blanks?
+
+=item *
+
+How can I reliably rename a file?
+
+=item *
+
+How can I lock a file?
+
+=item *
+
+Why can't I just open(FH, "E<gt>file.lock")?
+
+=item *
+
+I still don't get locking. I just want to increment the number in the file. How can I do this?
+
+=item *
+
+All I want to do is append a small amount of text to the end of a file. Do I still have to use locking?
+
+=item *
+
+How do I randomly update a binary file?
+
+=item *
+
+How do I get a file's timestamp in perl?
+
+=item *
+
+How do I set a file's timestamp in perl?
+
+=item *
+
+How do I print to more than one file at once?
+
+=item *
+
+How can I read in an entire file all at once?
+
+=item *
+
+How can I read in a file by paragraphs?
+
+=item *
+
+How can I read a single character from a file? From the keyboard?
+
+=item *
+
+How can I tell whether there's a character waiting on a filehandle?
+
+=item *
+
+How do I do a C<tail -f> in perl?
+
+=item *
+
+How do I dup() a filehandle in Perl?
+
+=item *
+
+How do I close a file descriptor by number?
+
+=item *
+
+Why can't I use "C:\temp\foo" in DOS paths? Why doesn't `C:\temp\foo.exe` work?
+
+=item *
+
+Why doesn't glob("*.*") get all the files?
+
+=item *
+
+Why does Perl let me delete read-only files? Why does C<-i> clobber protected files? Isn't this a bug in Perl?
+
+=item *
+
+How do I select a random line from a file?
+
+=item *
+
+Why do I get weird spaces when I print an array of lines?
+
+=item *
+
+How do I traverse a directory tree?
+
+=item *
+
+How do I delete a directory tree?
+
+=item *
+
+How do I copy an entire directory?
+
+=back
+
+
+=head2 L<perlfaq6>: Regular Expressions
+
+This section is surprisingly small because the rest of the FAQ is littered with answers involving regular expressions. For example, decoding a URL and checking whether something is a number are handled with regular expressions, but those answers are found elsewhere in this document (in L<perlfaq9>: "How do I decode or create those %-encodings on the web" and L<perlfaq4>: "How do I determine whether a scalar is a number/whole/integer/float", to be precise).
+
+=over 4
+
+=item *
+
+How can I hope to use regular expressions without creating illegible and unmaintainable code?
+
+=item *
+
+I'm having trouble matching over more than one line. What's wrong?
+
+=item *
+
+How can I pull out lines between two patterns that are themselves on different lines?
+
+=item *
+
+How do I match XML, HTML, or other nasty, ugly things with a regex?
+
+=item *
+
+I put a regular expression into $/ but it didn't work. What's wrong?
+
+=item *
+
+How do I substitute case insensitively on the LHS while preserving case on the RHS?
+
+=item *
+
+How can I make C<\w> match national character sets?
+
+=item *
+
+How can I match a locale-smart version of C</[a-zA-Z]/>?
+
+=item *
+
+How can I quote a variable to use in a regex?
+
+=item *
+
+What is C</o> really for?
+
+=item *
+
+How do I use a regular expression to strip C style comments from a file?
+
+=item *
+
+Can I use Perl regular expressions to match balanced text?
+
+=item *
+
+What does it mean that regexes are greedy? How can I get around it?
+
+=item *
+
+How do I process each word on each line?
+
+=item *
+
+How can I print out a word-frequency or line-frequency summary?
+
+=item *
+
+How can I do approximate matching?
+
+=item *
+
+How do I efficiently match many regular expressions at once?
+
+=item *
+
+Why don't word-boundary searches with C<\b> work for me?
+
+=item *
+
+Why does using $&, $`, or $' slow my program down?
+
+=item *
+
+What good is C<\G> in a regular expression?
+
+=item *
+
+Are Perl regexes DFAs or NFAs? Are they POSIX compliant?
+
+=item *
+
+What's wrong with using grep in a void context?
+
+=item *
+
+How can I match strings with multibyte characters?
+
+=item *
+
+How do I match a regular expression that's in a variable?
+
+=back
+
+
+=head2 L<perlfaq7>: General Perl Language Issues
+
+General Perl language issues that don't clearly fit into any of the other sections.
+
+=over 4
+
+=item *
+
+Can I get a BNF/yacc/RE for the Perl language?
+
+=item *
+
+What are all these $@%&* punctuation signs, and how do I know when to use them?
+
+=item *
+
+Do I always/never have to quote my strings or use semicolons and commas?
+
+=item *
+
+How do I skip some return values?
+
+=item *
+
+How do I temporarily block warnings?
+
+=item *
+
+What's an extension?
+
+=item *
+
+Why do Perl operators have different precedence than C operators?
+
+=item *
+
+How do I declare/create a structure?
+
+=item *
+
+How do I create a module?
+
+=item *
+
+How do I adopt or take over a module already on CPAN?
+
+=item *
+
+How do I create a class?
+
+=item *
+
+How can I tell if a variable is tainted?
+
+=item *
+
+What's a closure?
+
+=item *
+
+What is variable suicide and how can I prevent it?
+
+=item *
+
+How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regex}?
+
+=item *
+
+How do I create a static variable?
+
+=item *
+
+What's the difference between dynamic and lexical (static) scoping? Between local() and my()?
+
+=item *
+
+How can I access a dynamic variable while a similarly named lexical is in scope?
+
+=item *
+
+What's the difference between deep and shallow binding?
+
+=item *
+
+Why doesn't "my($foo) = E<lt>FILEE<gt>;" work right?
+
+=item *
+
+How do I redefine a builtin function, operator, or method?
+
+=item *
+
+What's the difference between calling a function as &foo and foo()?
+
+=item *
+
+How do I create a switch or case statement?
+
+=item *
+
+How can I catch accesses to undefined variables, functions, or methods?
+
+=item *
+
+Why can't a method included in this same file be found?
+
+=item *
+
+How can I find out my current or calling package?
+
+=item *
+
+How can I comment out a large block of perl code?
+
+=item *
+
+How do I clear a package?
+
+=item *
+
+How can I use a variable as a variable name?
+
+=item *
+
+What does "bad interpreter" mean?
+
+=back
+
+
+=head2 L<perlfaq8>: System Interaction
+
+This section of the Perl FAQ covers questions involving operating system interaction. Topics include interprocess communication (IPC), control over the user-interface (keyboard, screen and pointing devices), and most anything else not related to data manipulation. Read the FAQs and documentation specific to the port of perl to your operating system (eg, L<perlvms>, L<perlplan9>, ...). These should contain more detailed information on the vagaries of your perl.
+
+=over 4
+
+=item *
+
+How do I find out which operating system I'm running under?
+
+=item *
+
+How come exec() doesn't return?
+
+=item *
+
+How do I do fancy stuff with the keyboard/screen/mouse?
+
+=item *
+
+How do I print something out in color?
+
+=item *
+
+How do I read just one key without waiting for a return key?
+
+=item *
+
+How do I check whether input is ready on the keyboard?
+
+=item *
+
+How do I clear the screen?
+
+=item *
+
+How do I get the screen size?
+
+=item *
+
+How do I ask the user for a password?
+
+=item *
+
+How do I read and write the serial port?
+
+=item *
+
+How do I decode encrypted password files?
+
+=item *
+
+How do I start a process in the background?
+
+=item *
+
+How do I trap control characters/signals?
+
+=item *
+
+How do I modify the shadow password file on a Unix system?
+
+=item *
+
+How do I set the time and date?
+
+=item *
+
+How can I sleep() or alarm() for under a second?
+
+=item *
+
+How can I measure time under a second?
+
+=item *
+
+How can I do an atexit() or setjmp()/longjmp()? (Exception handling)
+
+=item *
+
+Why doesn't my sockets program work under System V (Solaris)? What does the error message "Protocol not supported" mean?
+
+=item *
+
+How can I call my system's unique C functions from Perl?
+
+=item *
+
+Where do I get the include files to do ioctl() or syscall()?
+
+=item *
+
+Why do setuid perl scripts complain about kernel problems?
+
+=item *
+
+How can I open a pipe both to and from a command?
+
+=item *
+
+Why can't I get the output of a command with system()?
+
+=item *
+
+How can I capture STDERR from an external command?
+
+=item *
+
+Why doesn't open() return an error when a pipe open fails?
+
+=item *
+
+What's wrong with using backticks in a void context?
+
+=item *
+
+How can I call backticks without shell processing?
+
+=item *
+
+Why can't my script read from STDIN after I gave it EOF (^D on Unix, ^Z on MS-DOS)?
+
+=item *
+
+How can I convert my shell script to perl?
+
+=item *
+
+Can I use perl to run a telnet or ftp session?
+
+=item *
+
+How can I write expect in Perl?
+
+=item *
+
+Is there a way to hide perl's command line from programs such as "ps"?
+
+=item *
+
+I {changed directory, modified my environment} in a perl script. How come the change disappeared when I exited the script? How do I get my changes to be visible?
+
+=item *
+
+How do I close a process's filehandle without waiting for it to complete?
+
+=item *
+
+How do I fork a daemon process?
+
+=item *
+
+How do I find out if I'm running interactively or not?
+
+=item *
+
+How do I timeout a slow event?
+
+=item *
+
+How do I set CPU limits?
+
+=item *
+
+How do I avoid zombies on a Unix system?
+
+=item *
+
+How do I use an SQL database?
+
+=item *
+
+How do I make a system() exit on control-C?
+
+=item *
+
+How do I open a file without blocking?
+
+=item *
+
+How do I tell the difference between errors from the shell and perl?
+
+=item *
+
+How do I install a module from CPAN?
+
+=item *
+
+What's the difference between require and use?
+
+=item *
+
+How do I keep my own module/library directory?
+
+=item *
+
+How do I add the directory my program lives in to the module/library search path?
+
+=item *
+
+How do I add a directory to my include path (@INC) at runtime?
+
+=item *
+
+What is socket.ph and where do I get it?
+
+=back
+
+
+=head2 L<perlfaq9>: Networking
+
+Networking, the internet, and a few on the web.
+
+=over 4
+
+=item *
+
+What is the correct form of response from a CGI script?
+
+=item *
+
+My CGI script runs from the command line but not the browser. (500 Server Error)
+
+=item *
+
+How can I get better error messages from a CGI program?
+
+=item *
+
+How do I remove HTML from a string?
+
+=item *
+
+How do I extract URLs?
+
+=item *
+
+How do I download a file from the user's machine? How do I open a file on another machine?
+
+=item *
+
+How do I make an HTML pop-up menu with Perl?
+
+=item *
+
+How do I fetch an HTML file?
+
+=item *
+
+How do I automate an HTML form submission?
+
+=item *
+
+How do I decode or create those %-encodings on the web?
+
+=item *
+
+How do I redirect to another page?
+
+=item *
+
+How do I put a password on my web pages?
+
+=item *
+
+How do I edit my .htpasswd and .htgroup files with Perl?
+
+=item *
+
+How do I make sure users can't enter values into a form that cause my CGI script to do bad things?
+
+=item *
+
+How do I parse a mail header?
+
+=item *
+
+How do I decode a CGI form?
+
+=item *
+
+How do I check a valid mail address?
+
+=item *
+
+How do I decode a MIME/BASE64 string?
+
+=item *
+
+How do I return the user's mail address?
+
+=item *
+
+How do I send mail?
+
+=item *
+
+How do I use MIME to make an attachment to a mail message?
+
+=item *
+
+How do I read mail?
+
+=item *
+
+How do I find out my hostname, domainname, or IP address?
+
+=item *
+
+How do I fetch a news article or the active newsgroups?
+
+=item *
+
+How do I fetch/put an FTP file?
+
+=item *
+
+How can I do RPC in Perl?
+
+=back
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfaq1.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq1.pod
new file mode 100755
index 00000000000..ec016f61523
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq1.pod
@@ -0,0 +1,418 @@
+=head1 NAME
+
+perlfaq1 - General Questions About Perl
+
+=head1 DESCRIPTION
+
+This section of the FAQ answers very general, high-level questions
+about Perl.
+
+=head2 What is Perl?
+
+Perl is a high-level programming language with an eclectic heritage
+written by Larry Wall and a cast of thousands. It derives from the
+ubiquitous C programming language and to a lesser extent from sed,
+awk, the Unix shell, and at least a dozen other tools and languages.
+Perl's process, file, and text manipulation facilities make it
+particularly well-suited for tasks involving quick prototyping, system
+utilities, software tools, system management tasks, database access,
+graphical programming, networking, and world wide web programming.
+These strengths make it especially popular with system administrators
+and CGI script authors, but mathematicians, geneticists, journalists,
+and even managers also use Perl. Maybe you should, too.
+
+=head2 Who supports Perl? Who develops it? Why is it free?
+
+The original culture of the pre-populist Internet and the deeply-held
+beliefs of Perl's author, Larry Wall, gave rise to the free and open
+distribution policy of perl. Perl is supported by its users. The
+core, the standard Perl library, the optional modules, and the
+documentation you're reading now were all written by volunteers. See
+the personal note at the end of the README file in the perl source
+distribution for more details. See L<perlhist> (new as of 5.005)
+for Perl's milestone releases.
+
+In particular, the core development team (known as the Perl Porters)
+are a rag-tag band of highly altruistic individuals committed to
+producing better software for free than you could hope to purchase for
+money. You may snoop on pending developments via the archives at
+http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/
+and http://archive.develooper.com/perl5-porters@perl.org/
+or the news gateway nntp://nntp.perl.org/perl.perl5.porters or
+its web interface at http://nntp.perl.org/group/perl.perl5.porters ,
+or read the faq at http://dev.perl.org/perl5/docs/p5p-faq.html ,
+or you can subscribe to the mailing list by sending
+perl5-porters-request@perl.org a subscription request
+(an empty message with no subject is fine).
+
+While the GNU project includes Perl in its distributions, there's no
+such thing as "GNU Perl". Perl is not produced nor maintained by the
+Free Software Foundation. Perl's licensing terms are also more open
+than GNU software's tend to be.
+
+You can get commercial support of Perl if you wish, although for most
+users the informal support will more than suffice. See the answer to
+"Where can I buy a commercial version of perl?" for more information.
+
+=head2 Which version of Perl should I use?
+
+(contributed by brian d foy)
+
+There is often a matter of opinion and taste, and there isn't any one
+answer that fits everyone. In general, you want to use either the current
+stable release, or the stable release immediately prior to that one.
+Currently, those are perl5.10.x and perl5.8.x, respectively.
+
+Beyond that, you have to consider several things and decide which is best
+for you.
+
+=over 4
+
+=item *
+
+If things aren't broken, upgrading perl may break them (or at least issue
+new warnings).
+
+=item *
+
+The latest versions of perl have more bug fixes.
+
+=item *
+
+The Perl community is geared toward supporting the most recent releases,
+so you'll have an easier time finding help for those.
+
+=item *
+
+Versions prior to perl5.004 had serious security problems with buffer
+overflows, and in some cases have CERT advisories (for instance,
+http://www.cert.org/advisories/CA-1997-17.html ).
+
+=item *
+
+The latest versions are probably the least deployed and widely tested, so
+you may want to wait a few months after their release and see what
+problems others have if you are risk averse.
+
+=item *
+
+The immediate, previous releases (i.e. perl5.8.x ) are usually maintained
+for a while, although not at the same level as the current releases.
+
+=item *
+
+No one is actively supporting Perl 4. Five years ago it was a dead
+camel carcass (according to this document). Now it's barely a skeleton
+as its whitewashed bones have fractured or eroded.
+
+=item *
+
+There is no Perl 6 release scheduled, but it will be available when
+it's ready. Stay tuned, but don't worry that you'll have to change
+major versions of Perl; no one is going to take Perl 5 away from you.
+
+=item *
+
+There are really two tracks of perl development: a maintenance version
+and an experimental version. The maintenance versions are stable, and
+have an even number as the minor release (i.e. perl5.10.x, where 10 is the
+minor release). The experimental versions may include features that
+don't make it into the stable versions, and have an odd number as the
+minor release (i.e. perl5.9.x, where 9 is the minor release).
+
+=back
+
+
+=head2 What are Perl 4, Perl 5, or Perl 6?
+
+(contributed by brian d foy)
+
+In short, Perl 4 is the past, Perl 5 is the present, and Perl 6 is the
+future.
+
+The number after perl (i.e. the 5 after Perl 5) is the major release
+of the perl interpreter as well as the version of the language. Each
+major version has significant differences that earlier versions cannot
+support.
+
+The current major release of Perl is Perl 5, and was released in 1994.
+It can run scripts from the previous major release, Perl 4 (March 1991),
+but has significant differences. It introduced the concept of references,
+complex data structures, and modules. The Perl 5 interpreter was a
+complete re-write of the previous perl sources.
+
+Perl 6 is the next major version of Perl, but it's still in development
+in both its syntax and design. The work started in 2002 and is still
+ongoing. Many of the most interesting features have shown up in the
+latest versions of Perl 5, and some Perl 5 modules allow you to use some
+Perl 6 syntax in your programs. You can learn more about Perl 6 at
+http://dev.perl.org/perl6/ .
+
+See L<perlhist> for a history of Perl revisions.
+
+=head2 What was Ponie?
+
+(contributed by brian d foy)
+
+Ponie stands for "Perl On the New Internal Engine", started by Arthur
+Bergman from Fotango in 2003, and subsequently run as a project of The
+Perl Foundation. It was abandoned in 2006
+( http://www.nntp.perl.org/group/perl.ponie.dev/487 ).
+
+Instead of using the current Perl internals, Ponie aimed to create a
+new one that would provide a translation path from Perl 5 to Perl 6
+(or anything else that targets Parrot, actually). You would have been
+able to just keep using Perl 5 with Parrot, the virtual machine which
+will compile and run Perl 6 bytecode.
+
+=head2 What is Perl 6?
+
+At The Second O'Reilly Open Source Software Convention, Larry Wall
+announced Perl 6 development would begin in earnest. Perl 6 was an oft
+used term for Chip Salzenberg's project to rewrite Perl in C++ named
+Topaz. However, Topaz provided valuable insights to the next version
+of Perl and its implementation, but was ultimately abandoned.
+
+If you want to learn more about Perl 6, or have a desire to help in
+the crusade to make Perl a better place then peruse the Perl 6 developers
+page at http://dev.perl.org/perl6/ and get involved.
+
+Perl 6 is not scheduled for release yet, and Perl 5 will still be supported
+for quite awhile after its release. Do not wait for Perl 6 to do whatever
+you need to do.
+
+"We're really serious about reinventing everything that needs reinventing."
+--Larry Wall
+
+=head2 How stable is Perl?
+
+Production releases, which incorporate bug fixes and new functionality,
+are widely tested before release. Since the 5.000 release, we have
+averaged only about one production release per year.
+
+Larry and the Perl development team occasionally make changes to the
+internal core of the language, but all possible efforts are made toward
+backward compatibility. While not quite all Perl 4 scripts run flawlessly
+under Perl 5, an update to perl should nearly never invalidate a program
+written for an earlier version of perl (barring accidental bug fixes
+and the rare new keyword).
+
+=head2 Is Perl difficult to learn?
+
+No, Perl is easy to start learning--and easy to keep learning. It looks
+like most programming languages you're likely to have experience
+with, so if you've ever written a C program, an awk script, a shell
+script, or even a BASIC program, you're already partway there.
+
+Most tasks only require a small subset of the Perl language. One of
+the guiding mottos for Perl development is "there's more than one way
+to do it" (TMTOWTDI, sometimes pronounced "tim toady"). Perl's
+learning curve is therefore shallow (easy to learn) and long (there's
+a whole lot you can do if you really want).
+
+Finally, because Perl is frequently (but not always, and certainly not by
+definition) an interpreted language, you can write your programs and test
+them without an intermediate compilation step, allowing you to experiment
+and test/debug quickly and easily. This ease of experimentation flattens
+the learning curve even more.
+
+Things that make Perl easier to learn: Unix experience, almost any kind
+of programming experience, an understanding of regular expressions, and
+the ability to understand other people's code. If there's something you
+need to do, then it's probably already been done, and a working example is
+usually available for free. Don't forget Perl modules, either.
+They're discussed in Part 3 of this FAQ, along with CPAN, which is
+discussed in Part 2.
+
+=head2 How does Perl compare with other languages like Java, Python, REXX, Scheme, or Tcl?
+
+Favorably in some areas, unfavorably in others. Precisely which areas
+are good and bad is often a personal choice, so asking this question
+on Usenet runs a strong risk of starting an unproductive Holy War.
+
+Probably the best thing to do is try to write equivalent code to do a
+set of tasks. These languages have their own newsgroups in which you
+can learn about (but hopefully not argue about) them.
+
+Some comparison documents can be found at http://www.perl.com/doc/FMTEYEWTK/versus/
+if you really can't stop yourself.
+
+=head2 Can I do [task] in Perl?
+
+Perl is flexible and extensible enough for you to use on virtually any
+task, from one-line file-processing tasks to large, elaborate systems.
+For many people, Perl serves as a great replacement for shell scripting.
+For others, it serves as a convenient, high-level replacement for most of
+what they'd program in low-level languages like C or C++. It's ultimately
+up to you (and possibly your management) which tasks you'll use Perl
+for and which you won't.
+
+If you have a library that provides an API, you can make any component
+of it available as just another Perl function or variable using a Perl
+extension written in C or C++ and dynamically linked into your main
+perl interpreter. You can also go the other direction, and write your
+main program in C or C++, and then link in some Perl code on the fly,
+to create a powerful application. See L<perlembed>.
+
+That said, there will always be small, focused, special-purpose
+languages dedicated to a specific problem domain that are simply more
+convenient for certain kinds of problems. Perl tries to be all things
+to all people, but nothing special to anyone. Examples of specialized
+languages that come to mind include prolog and matlab.
+
+=head2 When shouldn't I program in Perl?
+
+When your manager forbids it--but do consider replacing them :-).
+
+Actually, one good reason is when you already have an existing
+application written in another language that's all done (and done
+well), or you have an application language specifically designed for a
+certain task (e.g. prolog, make).
+
+For various reasons, Perl is probably not well-suited for real-time
+embedded systems, low-level operating systems development work like
+device drivers or context-switching code, complex multi-threaded
+shared-memory applications, or extremely large applications. You'll
+notice that perl is not itself written in Perl.
+
+Perl remains fundamentally a dynamically typed language, not
+a statically typed one. You certainly won't be chastised if you don't
+trust nuclear-plant or brain-surgery monitoring code to it. And Larry
+will sleep easier, too--Wall Street programs not withstanding. :-)
+
+=head2 What's the difference between "perl" and "Perl"?
+
+One bit. Oh, you weren't talking ASCII? :-) Larry now uses "Perl" to
+signify the language proper and "perl" the implementation of it, i.e.
+the current interpreter. Hence Tom's quip that "Nothing but perl can
+parse Perl."
+
+Before the first edition of I<Programming perl>, people commonly
+referred to the language as "perl", and its name appeared that way in
+the title because it referred to the interpreter. In the book, Randal
+Schwartz capitalised the language's name to make it stand out better
+when typeset. This convention was adopted by the community, and the
+second edition became I<Programming Perl>, using the capitalized
+version of the name to refer to the language.
+
+You may or may not choose to follow this usage. For example,
+parallelism means "awk and perl" and "Python and Perl" look good, while
+"awk and Perl" and "Python and perl" do not. But never write "PERL",
+because perl is not an acronym, apocryphal folklore and post-facto
+expansions notwithstanding.
+
+=head2 Is it a Perl program or a Perl script?
+
+Larry doesn't really care. He says (half in jest) that "a script is
+what you give the actors. A program is what you give the audience."
+
+Originally, a script was a canned sequence of normally interactive
+commands--that is, a chat script. Something like a UUCP or PPP chat
+script or an expect script fits the bill nicely, as do configuration
+scripts run by a program at its start up, such F<.cshrc> or F<.ircrc>,
+for example. Chat scripts were just drivers for existing programs,
+not stand-alone programs in their own right.
+
+A computer scientist will correctly explain that all programs are
+interpreted and that the only question is at what level. But if you
+ask this question of someone who isn't a computer scientist, they might
+tell you that a I<program> has been compiled to physical machine code
+once and can then be run multiple times, whereas a I<script> must be
+translated by a program each time it's used.
+
+Now that "script" and "scripting" are terms that have been seized by
+unscrupulous or unknowing marketeers for their own nefarious purposes,
+they have begun to take on strange and often pejorative meanings,
+like "non serious" or "not real programming". Consequently, some Perl
+programmers prefer to avoid them altogether.
+
+=head2 What is a JAPH?
+
+(contributed by brian d foy)
+
+JAPH stands for "Just another Perl hacker,", which Randal Schwartz used
+to sign email and usenet messages starting in the late 1980s. He
+previously used the phrase with many subjects ("Just another x hacker,"),
+so to distinguish his JAPH, he started to write them as Perl programs:
+
+ print "Just another Perl hacker,";
+
+Other people picked up on this and started to write clever or obfuscated
+programs to produce the same output, spinning things quickly out of
+control while still providing hours of amusement for their creators and
+readers.
+
+CPAN has several JAPH programs at http://www.cpan.org/misc/japh .
+
+=head2 Where can I get a list of Larry Wall witticisms?
+
+(contributed by brian d foy)
+
+Google "larry wall quotes"! You might even try the "I feel lucky" button.
+:)
+
+Wikiquote has the witticisms from Larry along with their source,
+including his usenet postings and source code comments.
+
+If you want a plain text file, try
+http://www.cpan.org/misc/lwall-quotes.txt.gz .
+
+=head2 How can I convince others to use Perl?
+
+(contributed by brian d foy)
+
+Appeal to their self interest! If Perl is new (and thus scary) to them,
+find something that Perl can do to solve one of their problems. That
+might mean that Perl either saves them something (time, headaches, money)
+or gives them something (flexibility, power, testability).
+
+In general, the benefit of a language is closely related to the skill of
+the people using that language. If you or your team can be more faster,
+better, and stronger through Perl, you'll deliver more value. Remember,
+people often respond better to what they get out of it. If you run
+into resistance, figure out what those people get out of the other
+choice and how Perl might satisfy that requirement.
+
+You don't have to worry about finding or paying for Perl; it's freely
+available and several popular operating systems come with Perl. Community
+support in places such as Perlmonks ( http://www.perlmonks.com )
+and the various Perl mailing lists ( http://lists.perl.org ) means that
+you can usually get quick answers to your problems.
+
+Finally, keep in mind that Perl might not be the right tool for every
+job. You're a much better advocate if your claims are reasonable and
+grounded in reality. Dogmatically advocating anything tends to make
+people discount your message. Be honest about possible disadvantages
+to your choice of Perl since any choice has trade-offs.
+
+You might find these links useful:
+
+=over 4
+
+=item * http://perltraining.com.au/whyperl.html
+
+=item * http://www.perl.org/advocacy/whyperl.html
+
+=back
+
+=head1 REVISION
+
+Revision: $Revision$
+
+Date: $Date$
+
+See L<perlfaq> for source control details and availability.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2009 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples here are in the public
+domain. You are permitted and encouraged to use this code and any
+derivatives thereof in your own programs for fun or for profit as you
+see fit. A simple comment in the code giving credit to the FAQ would
+be courteous but is not required.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfaq2.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq2.pod
new file mode 100755
index 00000000000..f578d4140c1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq2.pod
@@ -0,0 +1,552 @@
+=head1 NAME
+
+perlfaq2 - Obtaining and Learning about Perl
+
+=head1 DESCRIPTION
+
+This section of the FAQ answers questions about where to find
+source and documentation for Perl, support, and
+related matters.
+
+=head2 What machines support perl? Where do I get it?
+
+The standard release of perl (the one maintained by the perl
+development team) is distributed only in source code form. You
+can find the latest releases at http://www.cpan.org/src/README.html .
+
+Perl builds and runs on a bewildering number of platforms. Virtually
+all known and current Unix derivatives are supported (perl's native
+platform), as are other systems like VMS, DOS, OS/2, Windows,
+QNX, BeOS, OS X, MPE/iX and the Amiga.
+
+Binary distributions for some proprietary platforms can be found
+http://www.cpan.org/ports/ directory. Because these are not part of
+the standard distribution, they may and in fact do differ from the
+base perl port in a variety of ways. You'll have to check their
+respective release notes to see just what the differences are. These
+differences can be either positive (e.g. extensions for the features
+of the particular platform that are not supported in the source
+release of perl) or negative (e.g. might be based upon a less current
+source release of perl).
+
+=head2 How can I get a binary version of perl?
+
+(contributed by brian d foy)
+
+ActiveState: Windows, Linux, Mac OS X, Solaris, AIX and HP-UX
+
+ http://www.activestate.com/
+
+Sunfreeware.com: Solaris 2.5 to Solaris 10 (SPARC and x86)
+
+ http://www.sunfreeware.com/
+
+Strawberry Perl: Windows, Perl 5.8.8 and 5.10.0
+
+ http://www.strawberryperl.com
+
+IndigoPerl: Windows
+
+ http://indigostar.com/
+
+=head2 I don't have a C compiler. How can I build my own Perl interpreter?
+
+Since you don't have a C compiler, you're doomed and your vendor
+should be sacrificed to the Sun gods. But that doesn't help you.
+
+What you need to do is get a binary version of gcc for your system
+first. Consult the Usenet FAQs for your operating system for
+information on where to get such a binary version.
+
+You might look around the net for a pre-built binary of Perl (or a
+C compiler!) that meets your needs, though:
+
+For Windows, Vanilla Perl ( http://vanillaperl.com/ ) and Strawberry Perl
+( http://strawberryperl.com/ ) come with a
+bundled C compiler. ActivePerl is a pre-compiled version of Perl
+ready-to-use.
+
+For Sun systems, SunFreeware.com provides binaries of most popular
+applications, including compilers and Perl.
+
+=head2 I copied the perl binary from one machine to another, but scripts don't work.
+
+That's probably because you forgot libraries, or library paths differ.
+You really should build the whole distribution on the machine it will
+eventually live on, and then type C<make install>. Most other
+approaches are doomed to failure.
+
+One simple way to check that things are in the right place is to print out
+the hard-coded @INC that perl looks through for libraries:
+
+ % perl -le 'print for @INC'
+
+If this command lists any paths that don't exist on your system, then you
+may need to move the appropriate libraries to these locations, or create
+symbolic links, aliases, or shortcuts appropriately. @INC is also printed as
+part of the output of
+
+ % perl -V
+
+You might also want to check out
+L<perlfaq8/"How do I keep my own module/library directory?">.
+
+=head2 I grabbed the sources and tried to compile but gdbm/dynamic loading/malloc/linking/... failed. How do I make it work?
+
+Read the F<INSTALL> file, which is part of the source distribution.
+It describes in detail how to cope with most idiosyncrasies that the
+Configure script can't work around for any given system or
+architecture.
+
+=head2 What modules and extensions are available for Perl? What is CPAN? What does CPAN/src/... mean?
+
+CPAN stands for Comprehensive Perl Archive Network, a multi-gigabyte
+archive replicated on hundreds of machines all over the world. CPAN
+contains source code, non-native ports, documentation, scripts, and
+many third-party modules and extensions, designed for everything from
+commercial database interfaces to keyboard/screen control to web
+walking and CGI scripts. The master web site for CPAN is
+http://www.cpan.org/ and there is the CPAN Multiplexer at
+http://www.cpan.org/CPAN.html which will choose a mirror near you via
+DNS. See http://www.perl.com/CPAN (without a slash at the end) for
+how this process works. Also, http://mirror.cpan.org/ has a nice
+interface to the http://www.cpan.org/MIRRORED.BY mirror directory.
+
+See the CPAN FAQ at http://www.cpan.org/misc/cpan-faq.html for answers
+to the most frequently asked questions about CPAN including how to
+become a mirror.
+
+CPAN/path/... is a naming convention for files available on CPAN
+sites. CPAN indicates the base directory of a CPAN mirror, and the
+rest of the path is the path from that directory to the file. For
+instance, if you're using ftp://ftp.funet.fi/pub/languages/perl/CPAN
+as your CPAN site, the file CPAN/misc/japh is downloadable as
+ftp://ftp.funet.fi/pub/languages/perl/CPAN/misc/japh .
+
+Considering that, as of 2006, there are over ten thousand existing
+modules in the archive, one probably exists to do nearly anything you
+can think of. Current categories under CPAN/modules/by-category/
+include Perl core modules; development support; operating system
+interfaces; networking, devices, and interprocess communication; data
+type utilities; database interfaces; user interfaces; interfaces to
+other languages; filenames, file systems, and file locking;
+internationalization and locale; world wide web support; server and
+daemon utilities; archiving and compression; image manipulation; mail
+and news; control flow utilities; filehandle and I/O; Microsoft
+Windows modules; and miscellaneous modules.
+
+See http://www.cpan.org/modules/00modlist.long.html or
+http://search.cpan.org/ for a more complete list of modules by
+category.
+
+CPAN is a free service and is not affiliated with O'Reilly Media.
+
+=head2 Is there an ISO or ANSI certified version of Perl?
+
+Certainly not. Larry expects that he'll be certified before Perl is.
+
+=head2 Where can I get information on Perl?
+
+The complete Perl documentation is available with the Perl distribution.
+If you have Perl installed locally, you probably have the documentation
+installed as well: type C<man perl> if you're on a system resembling Unix.
+This will lead you to other important man pages, including how to set your
+$MANPATH. If you're not on a Unix system, access to the documentation
+will be different; for example, documentation might only be in HTML format. All
+proper perl installations have fully-accessible documentation.
+
+You might also try C<perldoc perl> in case your system doesn't
+have a proper man command, or it's been misinstalled. If that doesn't
+work, try looking in /usr/local/lib/perl5/pod for documentation.
+
+If all else fails, consult http://perldoc.perl.org/ which has the
+complete documentation in HTML and PDF format.
+
+Many good books have been written about Perl--see the section later in
+L<perlfaq2> for more details.
+
+Tutorial documents are included in current or upcoming Perl releases
+include L<perltoot> for objects or L<perlboot> for a beginner's
+approach to objects, L<perlopentut> for file opening semantics,
+L<perlreftut> for managing references, L<perlretut> for regular
+expressions, L<perlthrtut> for threads, L<perldebtut> for debugging,
+and L<perlxstut> for linking C and Perl together. There may be more
+by the time you read this. These URLs might also be useful:
+
+ http://perldoc.perl.org/
+ http://bookmarks.cpan.org/search.cgi?cat=Training%2FTutorials
+
+=head2 What are the Perl newsgroups on Usenet? Where do I post questions?
+
+Several groups devoted to the Perl language are on Usenet:
+
+ comp.lang.perl.announce Moderated announcement group
+ comp.lang.perl.misc High traffic general Perl discussion
+ comp.lang.perl.moderated Moderated discussion group
+ comp.lang.perl.modules Use and development of Perl modules
+ comp.lang.perl.tk Using Tk (and X) from Perl
+
+Some years ago, comp.lang.perl was divided into those groups, and
+comp.lang.perl itself officially removed. While that group may still
+be found on some news servers, it is unwise to use it, because
+postings there will not appear on news servers which honour the
+official list of group names. Use comp.lang.perl.misc for topics
+which do not have a more-appropriate specific group.
+
+There is also a Usenet gateway to Perl mailing lists sponsored by
+perl.org at nntp://nntp.perl.org , a web interface to the same lists
+at http://nntp.perl.org/group/ and these lists are also available
+under the C<perl.*> hierarchy at http://groups.google.com . Other
+groups are listed at http://lists.perl.org/ ( also known as
+http://lists.cpan.org/ ).
+
+A nice place to ask questions is the PerlMonks site,
+http://www.perlmonks.org/ , or the Perl Beginners mailing list
+http://lists.perl.org/showlist.cgi?name=beginners .
+
+Note that none of the above are supposed to write your code for you:
+asking questions about particular problems or general advice is fine,
+but asking someone to write your code for free is not very cool.
+
+=head2 Where should I post source code?
+
+You should post source code to whichever group is most appropriate, but
+feel free to cross-post to comp.lang.perl.misc. If you want to cross-post
+to alt.sources, please make sure it follows their posting standards,
+including setting the Followup-To header line to NOT include alt.sources;
+see their FAQ ( http://www.faqs.org/faqs/alt-sources-intro/ ) for details.
+
+If you're just looking for software, first use Google
+( http://www.google.com ), Google's usenet search interface
+( http://groups.google.com ), and CPAN Search ( http://search.cpan.org ).
+This is faster and more productive than just posting a request.
+
+=head2 Perl Books
+
+A number of books on Perl and/or CGI programming are available. A few
+of these are good, some are OK, but many aren't worth your money.
+There is a list of these books, some with extensive reviews, at
+http://books.perl.org/ . If you don't see your book listed here, you
+can write to perlfaq-workers@perl.org .
+
+The incontestably definitive reference book on Perl, written by
+the creator of Perl, is Programming Perl:
+
+ Programming Perl (the "Camel Book"):
+ by Larry Wall, Tom Christiansen, and Jon Orwant
+ ISBN 0-596-00027-8 [3rd edition July 2000]
+ http://www.oreilly.com/catalog/pperl3/
+ (English, translations to several languages are also available)
+
+The companion volume to the Camel containing thousands
+of real-world examples, mini-tutorials, and complete programs is:
+
+ The Perl Cookbook (the "Ram Book"):
+ by Tom Christiansen and Nathan Torkington,
+ with Foreword by Larry Wall
+ ISBN 0-596-00313-7 [2nd Edition August 2003]
+ http://www.oreilly.com/catalog/perlckbk2/
+
+If you're already a seasoned programmer, then the Camel Book might
+suffice for you to learn Perl. If you're not, check out the
+Llama book:
+
+ Learning Perl
+ by Randal L. Schwartz, Tom Phoenix, and brian d foy
+ ISBN 0-596-10105-8 [4th edition July 2005]
+ http://www.oreilly.com/catalog/learnperl4/
+
+And for more advanced information on writing larger programs,
+presented in the same style as the Llama book, continue your education
+with the Alpaca book:
+
+ Intermediate Perl (the "Alpaca Book")
+ by Randal L. Schwartz and brian d foy, with Tom Phoenix (foreword by Damian Conway)
+ ISBN 0-596-10206-2 [1st edition March 2006]
+ http://www.oreilly.com/catalog/lrnperlorm/
+
+Addison-Wesley ( http://www.awlonline.com/ ) and Manning
+( http://www.manning.com/ ) are also publishers of some fine Perl books
+such as I<Object Oriented Programming with Perl> by Damian Conway and
+I<Network Programming with Perl> by Lincoln Stein.
+
+An excellent technical book discounter is Bookpool at
+http://www.bookpool.com/ where a 30% discount or more is not unusual.
+
+What follows is a list of the books that the FAQ authors found personally
+useful. Your mileage may (but, we hope, probably won't) vary.
+
+Recommended books on (or mostly on) Perl follow.
+
+=over 4
+
+=item References
+
+ Programming Perl
+ by Larry Wall, Tom Christiansen, and Jon Orwant
+ ISBN 0-596-00027-8 [3rd edition July 2000]
+ http://www.oreilly.com/catalog/pperl3/
+
+ Perl 5 Pocket Reference
+ by Johan Vromans
+ ISBN 0-596-00374-9 [4th edition July 2002]
+ http://www.oreilly.com/catalog/perlpr4/
+
+=item Tutorials
+
+ Beginning Perl
+ by James Lee
+ ISBN 1-59059-391-X [2nd edition August 2004]
+ http://apress.com/book/bookDisplay.html?bID=344
+
+ Elements of Programming with Perl
+ by Andrew L. Johnson
+ ISBN 1-884777-80-5 [1st edition October 1999]
+ http://www.manning.com/johnson/
+
+ Learning Perl
+ by Randal L. Schwartz, Tom Phoenix, and brian d foy
+ ISBN 0-596-52010-7 [5th edition June 2008]
+ http://oreilly.com/catalog/9780596520106/
+
+ Intermediate Perl (the "Alpaca Book")
+ by Randal L. Schwartz and brian d foy, with Tom Phoenix (foreword by Damian Conway)
+ ISBN 0-596-10206-2 [1st edition March 2006]
+ http://www.oreilly.com/catalog/intermediateperl/
+
+ Mastering Perl
+ by brian d foy
+ ISBN 0-596-52724-1 [1st edition July 2007]
+ http://www.oreilly.com/catalog/9780596527242/
+
+=item Task-Oriented
+
+ Writing Perl Modules for CPAN
+ by Sam Tregar
+ ISBN 1-59059-018-X [1st edition Aug 2002]
+ http://apress.com/book/bookDisplay.html?bID=14
+
+ The Perl Cookbook
+ by Tom Christiansen and Nathan Torkington
+ with foreword by Larry Wall
+ ISBN 1-56592-243-3 [1st edition August 1998]
+ http://www.oreilly.com/catalog/cookbook/
+
+ Effective Perl Programming
+ by Joseph Hall
+ ISBN 0-201-41975-0 [1st edition 1998]
+ http://www.awl.com/
+
+ Real World SQL Server Administration with Perl
+ by Linchi Shea
+ ISBN 1-59059-097-X [1st edition July 2003]
+ http://apress.com/book/bookDisplay.html?bID=171
+
+=item Special Topics
+
+ Perl Best Practices
+ by Damian Conway
+ ISBN: 0-596-00173-8 [1st edition July 2005]
+ http://www.oreilly.com/catalog/perlbp/
+
+ Higher Order Perl
+ by Mark-Jason Dominus
+ ISBN: 1558607013 [1st edition March 2005]
+ http://hop.perl.plover.com/
+
+ Perl 6 Now: The Core Ideas Illustrated with Perl 5
+ by Scott Walters
+ ISBN 1-59059-395-2 [1st edition December 2004]
+ http://apress.com/book/bookDisplay.html?bID=355
+
+ Mastering Regular Expressions
+ by Jeffrey E. F. Friedl
+ ISBN 0-596-00289-0 [2nd edition July 2002]
+ http://www.oreilly.com/catalog/regex2/
+
+ Network Programming with Perl
+ by Lincoln Stein
+ ISBN 0-201-61571-1 [1st edition 2001]
+ http://www.awlonline.com/
+
+ Object Oriented Perl
+ Damian Conway
+ with foreword by Randal L. Schwartz
+ ISBN 1-884777-79-1 [1st edition August 1999]
+ http://www.manning.com/conway/
+
+ Data Munging with Perl
+ Dave Cross
+ ISBN 1-930110-00-6 [1st edition 2001]
+ http://www.manning.com/cross
+
+ Mastering Perl/Tk
+ by Steve Lidie and Nancy Walsh
+ ISBN 1-56592-716-8 [1st edition January 2002]
+ http://www.oreilly.com/catalog/mastperltk/
+
+ Extending and Embedding Perl
+ by Tim Jenness and Simon Cozens
+ ISBN 1-930110-82-0 [1st edition August 2002]
+ http://www.manning.com/jenness
+
+ Perl Debugger Pocket Reference
+ by Richard Foley
+ ISBN 0-596-00503-2 [1st edition January 2004]
+ http://www.oreilly.com/catalog/perldebugpr/
+
+ Pro Perl Debugging
+ by Richard Foley with Andy Lester
+ ISBN 1-59059-454-1 [1st edition July 2005]
+ http://www.apress.com/book/view/1590594541
+
+=back
+
+=head2 Which magazines have Perl content?
+
+I<The Perl Review> ( http://www.theperlreview.com ) focuses on Perl
+almost completely (although it sometimes sneaks in an article about
+another language). There's also I<$foo Magazin>, a german magazine
+dedicated to Perl, at ( http://www.foo-magazin.de ).
+
+Magazines that frequently carry quality articles on Perl include I<The
+Perl Review> ( http://www.theperlreview.com ), I<Unix Review> (
+http://www.unixreview.com/ ), I<Linux Magazine> (
+http://www.linuxmagazine.com/ ), and Usenix's newsletter/magazine to
+its members, I<login:> ( http://www.usenix.org/ )
+
+The Perl columns of Randal L. Schwartz are available on the web at
+http://www.stonehenge.com/merlyn/WebTechniques/ ,
+http://www.stonehenge.com/merlyn/UnixReview/ , and
+http://www.stonehenge.com/merlyn/LinuxMag/ .
+
+The first (and for a long time, only) periodical devoted to All Things
+Perl, I<The Perl Journal> contains tutorials, demonstrations, case
+studies, announcements, contests, and much more. I<TPJ> has columns
+on web development, databases, Win32 Perl, graphical programming,
+regular expressions, and networking, and sponsors the Obfuscated Perl
+Contest and the Perl Poetry Contests. Beginning in November 2002, TPJ
+moved to a reader-supported monthly e-zine format in which subscribers
+can download issues as PDF documents. In 2006, TPJ merged with Dr.
+Dobbs Journal (online edition). To read old TPJ articles, see
+http://www.ddj.com/ .
+
+=head2 What mailing lists are there for Perl?
+
+Most of the major modules (Tk, CGI, libwww-perl) have their own
+mailing lists. Consult the documentation that came with the module for
+subscription information.
+
+A comprehensive list of Perl related mailing lists can be found at:
+
+ http://lists.perl.org/
+
+=head2 Where are the archives for comp.lang.perl.misc?
+
+The Google search engine now carries archived and searchable newsgroup
+content.
+
+http://groups.google.com/group/comp.lang.perl.misc/topics
+
+If you have a question, you can be sure someone has already asked the
+same question at some point on c.l.p.m. It requires some time and patience
+to sift through all the content but often you will find the answer you
+seek.
+
+=head2 Where can I buy a commercial version of perl?
+
+In a real sense, perl already I<is> commercial software: it has a license
+that you can grab and carefully read to your manager. It is distributed
+in releases and comes in well-defined packages. There is a very large
+user community and an extensive literature. The comp.lang.perl.*
+newsgroups and several of the mailing lists provide free answers to your
+questions in near real-time. Perl has traditionally been supported by
+Larry, scores of software designers and developers, and myriad
+programmers, all working for free to create a useful thing to make life
+better for everyone.
+
+However, these answers may not suffice for managers who require a
+purchase order from a company whom they can sue should anything go awry.
+Or maybe they need very serious hand-holding and contractual obligations.
+Shrink-wrapped CDs with perl on them are available from several sources if
+that will help. For example, many Perl books include a distribution of perl,
+as do the O'Reilly Perl Resource Kits (in both the Unix flavor
+and in the proprietary Microsoft flavor); the free Unix distributions
+also all come with perl.
+
+=head2 Where do I send bug reports?
+
+(contributed by brian d foy)
+
+First, ensure that you've found an actual bug. Second, ensure you've
+found an actual bug.
+
+If you've found a bug with the perl interpreter or one of the modules
+in the standard library (those that come with Perl), you can use the
+C<perlbug> utility that comes with Perl (>= 5.004). It collects
+information about your installation to include with your message, then
+sends the message to the right place.
+
+To determine if a module came with your version of Perl, you can
+use the C<Module::CoreList> module. It has the information about
+the modules (with their versions) included with each release of Perl.
+
+Every CPAN module has a bug tracker set up in RT, http://rt.cpan.org .
+You can submit bugs to RT either through its web interface or by
+email. To email a bug report, send it to
+bug-E<lt>distribution-nameE<gt>@rt.cpan.org . For example, if you
+wanted to report a bug in C<Business::ISBN>, you could send a message to
+bug-Business-ISBN@rt.cpan.org .
+
+Some modules might have special reporting requirements, such as a
+Sourceforge or Google Code tracking system, so you should check the
+module documentation too.
+
+=head2 What is perl.com? Perl Mongers? pm.org? perl.org? cpan.org?
+
+Perl.com at http://www.perl.com/ is part of the O'Reilly Network, a
+subsidiary of O'Reilly Media.
+
+The Perl Foundation is an advocacy organization for the Perl language
+which maintains the web site http://www.perl.org/ as a general
+advocacy site for the Perl language. It uses the domain to provide
+general support services to the Perl community, including the hosting
+of mailing lists, web sites, and other services. There are also many
+other sub-domains for special topics like learning Perl, Perl news, jobs
+in Perl, such as:
+
+ http://learn.perl.org/
+ http://use.perl.org/
+ http://jobs.perl.org/
+ http://lists.perl.org/
+
+Perl Mongers uses the pm.org domain for services related to Perl user
+groups, including the hosting of mailing lists and web sites. See the
+Perl user group web site at http://www.pm.org/ for more information about
+joining, starting, or requesting services for a Perl user group.
+
+http://www.cpan.org/ is the Comprehensive Perl Archive Network,
+a replicated worldwide repository of Perl software, see
+the I<What is CPAN?> question earlier in this document.
+
+=head1 REVISION
+
+Revision: $Revision$
+
+Date: $Date$
+
+See L<perlfaq> for source control details and availability.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2009 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples here are in the public
+domain. You are permitted and encouraged to use this code and any
+derivatives thereof in your own programs for fun or for profit as you
+see fit. A simple comment in the code giving credit to the FAQ would
+be courteous but is not required.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfaq3.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq3.pod
new file mode 100755
index 00000000000..2fa78fc6545
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq3.pod
@@ -0,0 +1,1104 @@
+=head1 NAME
+
+perlfaq3 - Programming Tools
+
+=head1 DESCRIPTION
+
+This section of the FAQ answers questions related to programmer tools
+and programming support.
+
+=head2 How do I do (anything)?
+
+Have you looked at CPAN (see L<perlfaq2>)? The chances are that
+someone has already written a module that can solve your problem.
+Have you read the appropriate manpages? Here's a brief index:
+
+ Basics perldata, perlvar, perlsyn, perlop, perlsub
+ Execution perlrun, perldebug
+ Functions perlfunc
+ Objects perlref, perlmod, perlobj, perltie
+ Data Structures perlref, perllol, perldsc
+ Modules perlmod, perlmodlib, perlsub
+ Regexes perlre, perlfunc, perlop, perllocale
+ Moving to perl5 perltrap, perl
+ Linking w/C perlxstut, perlxs, perlcall, perlguts, perlembed
+ Various http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz
+ (not a man-page but still useful, a collection
+ of various essays on Perl techniques)
+
+A crude table of contents for the Perl manpage set is found in L<perltoc>.
+
+=head2 How can I use Perl interactively?
+
+The typical approach uses the Perl debugger, described in the
+perldebug(1) manpage, on an "empty" program, like this:
+
+ perl -de 42
+
+Now just type in any legal Perl code, and it will be immediately
+evaluated. You can also examine the symbol table, get stack
+backtraces, check variable values, set breakpoints, and other
+operations typically found in symbolic debuggers.
+
+=head2 Is there a Perl shell?
+
+The psh (Perl sh) is currently at version 1.8. The Perl Shell is a shell
+that combines the interactive nature of a Unix shell with the power of
+Perl. The goal is a full featured shell that behaves as expected for
+normal shell activity and uses Perl syntax and functionality for
+control-flow statements and other things. You can get psh at
+http://sourceforge.net/projects/psh/ .
+
+Zoidberg is a similar project and provides a shell written in perl,
+configured in perl and operated in perl. It is intended as a login shell
+and development environment. It can be found at
+http://pardus-larus.student.utwente.nl/~pardus/projects/zoidberg/
+or your local CPAN mirror.
+
+The Shell.pm module (distributed with Perl) makes Perl try commands
+which aren't part of the Perl language as shell commands. perlsh from
+the source distribution is simplistic and uninteresting, but may still
+be what you want.
+
+=head2 How do I find which modules are installed on my system?
+
+From the command line, you can use the C<cpan> command's C<-l> switch:
+
+ $ cpan -l
+
+You can also use C<cpan>'s C<-a> switch to create an autobundle file
+that C<CPAN.pm> understands and cna use to re-install every module:
+
+ $ cpan -a
+
+Inside a Perl program, you can use the ExtUtils::Installed module to
+show all installed distributions, although it can take awhile to do
+its magic. The standard library which comes with Perl just shows up
+as "Perl" (although you can get those with Module::CoreList).
+
+ use ExtUtils::Installed;
+
+ my $inst = ExtUtils::Installed->new();
+ my @modules = $inst->modules();
+
+If you want a list of all of the Perl module filenames, you
+can use File::Find::Rule.
+
+ use File::Find::Rule;
+
+ my @files = File::Find::Rule->
+ extras({follow => 1})->
+ file()->
+ name( '*.pm' )->
+ in( @INC )
+ ;
+
+If you do not have that module, you can do the same thing
+with File::Find which is part of the standard library.
+
+ use File::Find;
+ my @files;
+
+ find(
+ {
+ wanted => sub {
+ push @files, $File::Find::fullname
+ if -f $File::Find::fullname && /\.pm$/
+ },
+ follow => 1,
+ follow_skip => 2,
+ },
+ @INC
+ );
+
+ print join "\n", @files;
+
+If you simply need to quickly check to see if a module is
+available, you can check for its documentation. If you can
+read the documentation the module is most likely installed.
+If you cannot read the documentation, the module might not
+have any (in rare cases).
+
+ $ perldoc Module::Name
+
+You can also try to include the module in a one-liner to see if
+perl finds it.
+
+ $ perl -MModule::Name -e1
+
+=head2 How do I debug my Perl programs?
+
+(contributed by brian d foy)
+
+Before you do anything else, you can help yourself by ensuring that
+you let Perl tell you about problem areas in your code. By turning
+on warnings and strictures, you can head off many problems before
+they get too big. You can find out more about these in L<strict>
+and L<warnings>.
+
+ #!/usr/bin/perl
+ use strict;
+ use warnings;
+
+Beyond that, the simplest debugger is the C<print> function. Use it
+to look at values as you run your program:
+
+ print STDERR "The value is [$value]\n";
+
+The C<Data::Dumper> module can pretty-print Perl data structures:
+
+ use Data::Dumper qw( Dumper );
+ print STDERR "The hash is " . Dumper( \%hash ) . "\n";
+
+Perl comes with an interactive debugger, which you can start with the
+C<-d> switch. It's fully explained in L<perldebug>.
+
+If you'd like a graphical user interface and you have Tk, you can use
+C<ptkdb>. It's on CPAN and available for free.
+
+If you need something much more sophisticated and controllable, Leon
+Brocard's Devel::ebug (which you can call with the -D switch as -Debug)
+gives you the programmatic hooks into everything you need to write your
+own (without too much pain and suffering).
+
+You can also use a commercial debugger such as Affrus (Mac OS X), Komodo
+from Activestate (Windows and Mac OS X), or EPIC (most platforms).
+
+=head2 How do I profile my Perl programs?
+
+(contributed by brian d foy, updated Fri Jul 25 12:22:26 PDT 2008)
+
+The C<Devel> namespace has several modules which you can use to
+profile your Perl programs. The C<Devel::DProf> module comes with Perl
+and you can invoke it with the C<-d> switch:
+
+ perl -d:DProf program.pl
+
+After running your program under C<DProf>, you'll get a F<tmon.out> file
+with the profile data. To look at the data, you can turn it into a
+human-readable report with the C<dprofpp> program that comes with
+C<Devel::DProf>.
+
+ dprofpp
+
+You can also do the profiling and reporting in one step with the C<-p>
+switch to <dprofpp>:
+
+ dprofpp -p program.pl
+
+The C<Devel::NYTProf> (New York Times Profiler) does both statement
+and subroutine profiling. It's available from CPAN and you also invoke
+it with the C<-d> switch:
+
+ perl -d:NYTProf some_perl.pl
+
+Like C<DProf>, it creates a database of the profile information that you
+can turn into reports. The C<nytprofhtml> command turns the data into
+an HTML report similar to the C<Devel::Cover> report:
+
+ nytprofhtml
+
+CPAN has several other profilers that you can invoke in the same
+fashion. You might also be interested in using the C<Benchmark> to
+measure and compare code snippets.
+
+You can read more about profiling in I<Programming Perl>, chapter 20,
+or I<Mastering Perl>, chapter 5.
+
+L<perldebguts> documents creating a custom debugger if you need to
+create a special sort of profiler. brian d foy describes the process
+in I<The Perl Journal>, "Creating a Perl Debugger",
+http://www.ddj.com/184404522 , and "Profiling in Perl"
+http://www.ddj.com/184404580 .
+
+Perl.com has two interesting articles on profiling: "Profiling Perl",
+by Simon Cozens, http://www.perl.com/lpt/a/850 and "Debugging and
+Profiling mod_perl Applications", by Frank Wiles,
+http://www.perl.com/pub/a/2006/02/09/debug_mod_perl.html .
+
+Randal L. Schwartz writes about profiling in "Speeding up Your Perl
+Programs" for I<Unix Review>,
+http://www.stonehenge.com/merlyn/UnixReview/col49.html , and "Profiling
+in Template Toolkit via Overriding" for I<Linux Magazine>,
+http://www.stonehenge.com/merlyn/LinuxMag/col75.html .
+
+=head2 How do I cross-reference my Perl programs?
+
+The B::Xref module can be used to generate cross-reference reports
+for Perl programs.
+
+ perl -MO=Xref[,OPTIONS] scriptname.plx
+
+=head2 Is there a pretty-printer (formatter) for Perl?
+
+Perltidy is a Perl script which indents and reformats Perl scripts
+to make them easier to read by trying to follow the rules of the
+L<perlstyle>. If you write Perl scripts, or spend much time reading
+them, you will probably find it useful. It is available at
+http://perltidy.sourceforge.net
+
+Of course, if you simply follow the guidelines in L<perlstyle>,
+you shouldn't need to reformat. The habit of formatting your code
+as you write it will help prevent bugs. Your editor can and should
+help you with this. The perl-mode or newer cperl-mode for emacs
+can provide remarkable amounts of help with most (but not all)
+code, and even less programmable editors can provide significant
+assistance. Tom Christiansen and many other VI users swear by
+the following settings in vi and its clones:
+
+ set ai sw=4
+ map! ^O {^M}^[O^T
+
+Put that in your F<.exrc> file (replacing the caret characters
+with control characters) and away you go. In insert mode, ^T is
+for indenting, ^D is for undenting, and ^O is for blockdenting--as
+it were. A more complete example, with comments, can be found at
+http://www.cpan.org/authors/id/TOMC/scripts/toms.exrc.gz
+
+The a2ps http://www-inf.enst.fr/%7Edemaille/a2ps/black+white.ps.gz does
+lots of things related to generating nicely printed output of
+documents.
+
+=head2 Is there a ctags for Perl?
+
+(contributed by brian d foy)
+
+Ctags uses an index to quickly find things in source code, and many
+popular editors support ctags for several different languages,
+including Perl.
+
+Exuberent ctags supports Perl: http://ctags.sourceforge.net/
+
+You might also try pltags: http://www.mscha.com/pltags.zip
+
+=head2 Is there an IDE or Windows Perl Editor?
+
+Perl programs are just plain text, so any editor will do.
+
+If you're on Unix, you already have an IDE--Unix itself. The UNIX
+philosophy is the philosophy of several small tools that each do one
+thing and do it well. It's like a carpenter's toolbox.
+
+If you want an IDE, check the following (in alphabetical order, not
+order of preference):
+
+=over 4
+
+=item Eclipse
+
+http://e-p-i-c.sf.net/
+
+The Eclipse Perl Integration Project integrates Perl
+editing/debugging with Eclipse.
+
+=item Enginsite
+
+http://www.enginsite.com/
+
+Perl Editor by EngInSite is a complete integrated development
+environment (IDE) for creating, testing, and debugging Perl scripts;
+the tool runs on Windows 9x/NT/2000/XP or later.
+
+=item Komodo
+
+http://www.ActiveState.com/Products/Komodo/
+
+ActiveState's cross-platform (as of October 2004, that's Windows, Linux,
+and Solaris), multi-language IDE has Perl support, including a regular expression
+debugger and remote debugging.
+
+=item Open Perl IDE
+
+http://open-perl-ide.sourceforge.net/
+
+Open Perl IDE is an integrated development environment for writing
+and debugging Perl scripts with ActiveState's ActivePerl distribution
+under Windows 95/98/NT/2000.
+
+=item OptiPerl
+
+http://www.optiperl.com/
+
+OptiPerl is a Windows IDE with simulated CGI environment, including
+debugger and syntax highlighting editor.
+
+=item Padre
+
+http://padre.perlide.org/
+
+Padre is cross-platform IDE for Perl written in Perl using the the wxWidgets
+to provide a native look and feel. It's open source under the Artistic
+License.
+
+=item PerlBuilder
+
+http://www.solutionsoft.com/perl.htm
+
+PerlBuilder is an integrated development environment for Windows that
+supports Perl development.
+
+=item visiPerl+
+
+http://helpconsulting.net/visiperl/
+
+From Help Consulting, for Windows.
+
+=item Visual Perl
+
+http://www.activestate.com/Products/Visual_Perl/
+
+Visual Perl is a Visual Studio.NET plug-in from ActiveState.
+
+=item Zeus
+
+http://www.zeusedit.com/lookmain.html
+
+Zeus for Window is another Win32 multi-language editor/IDE
+that comes with support for Perl:
+
+=back
+
+For editors: if you're on Unix you probably have vi or a vi clone
+already, and possibly an emacs too, so you may not need to download
+anything. In any emacs the cperl-mode (M-x cperl-mode) gives you
+perhaps the best available Perl editing mode in any editor.
+
+If you are using Windows, you can use any editor that lets you work
+with plain text, such as NotePad or WordPad. Word processors, such as
+Microsoft Word or WordPerfect, typically do not work since they insert
+all sorts of behind-the-scenes information, although some allow you to
+save files as "Text Only". You can also download text editors designed
+specifically for programming, such as Textpad (
+http://www.textpad.com/ ) and UltraEdit ( http://www.ultraedit.com/ ),
+among others.
+
+If you are using MacOS, the same concerns apply. MacPerl (for Classic
+environments) comes with a simple editor. Popular external editors are
+BBEdit ( http://www.bbedit.com/ ) or Alpha (
+http://www.his.com/~jguyer/Alpha/Alpha8.html ). MacOS X users can use
+Unix editors as well.
+
+=over 4
+
+=item GNU Emacs
+
+http://www.gnu.org/software/emacs/windows/ntemacs.html
+
+=item MicroEMACS
+
+http://www.microemacs.de/
+
+=item XEmacs
+
+http://www.xemacs.org/Download/index.html
+
+=item Jed
+
+http://space.mit.edu/~davis/jed/
+
+=back
+
+or a vi clone such as
+
+=over 4
+
+=item Elvis
+
+ftp://ftp.cs.pdx.edu/pub/elvis/ http://www.fh-wedel.de/elvis/
+
+=item Vile
+
+http://dickey.his.com/vile/vile.html
+
+=item Vim
+
+http://www.vim.org/
+
+=back
+
+For vi lovers in general, Windows or elsewhere:
+
+ http://www.thomer.com/thomer/vi/vi.html
+
+nvi ( http://www.bostic.com/vi/ , available from CPAN in src/misc/) is
+yet another vi clone, unfortunately not available for Windows, but in
+UNIX platforms you might be interested in trying it out, firstly because
+strictly speaking it is not a vi clone, it is the real vi, or the new
+incarnation of it, and secondly because you can embed Perl inside it
+to use Perl as the scripting language. nvi is not alone in this,
+though: at least also vim and vile offer an embedded Perl.
+
+The following are Win32 multilanguage editor/IDEs that support Perl:
+
+=over 4
+
+=item Codewright
+
+http://www.borland.com/codewright/
+
+=item MultiEdit
+
+http://www.MultiEdit.com/
+
+=item SlickEdit
+
+http://www.slickedit.com/
+
+=item ConTEXT
+
+http://www.contexteditor.org/
+
+=back
+
+There is also a toyedit Text widget based editor written in Perl
+that is distributed with the Tk module on CPAN. The ptkdb
+( http://ptkdb.sourceforge.net/ ) is a Perl/tk based debugger that
+acts as a development environment of sorts. Perl Composer
+( http://perlcomposer.sourceforge.net/ ) is an IDE for Perl/Tk
+GUI creation.
+
+In addition to an editor/IDE you might be interested in a more
+powerful shell environment for Win32. Your options include
+
+=over 4
+
+=item Bash
+
+from the Cygwin package ( http://sources.redhat.com/cygwin/ )
+
+=item Ksh
+
+from the MKS Toolkit ( http://www.mkssoftware.com/ ), or the Bourne shell of
+the U/WIN environment ( http://www.research.att.com/sw/tools/uwin/ )
+
+=item Tcsh
+
+ftp://ftp.astron.com/pub/tcsh/ , see also
+http://www.primate.wisc.edu/software/csh-tcsh-book/
+
+=item Zsh
+
+http://www.zsh.org/
+
+=back
+
+MKS and U/WIN are commercial (U/WIN is free for educational and
+research purposes), Cygwin is covered by the GNU General Public
+License (but that shouldn't matter for Perl use). The Cygwin, MKS,
+and U/WIN all contain (in addition to the shells) a comprehensive set
+of standard UNIX toolkit utilities.
+
+If you're transferring text files between Unix and Windows using FTP
+be sure to transfer them in ASCII mode so the ends of lines are
+appropriately converted.
+
+On Mac OS the MacPerl Application comes with a simple 32k text editor
+that behaves like a rudimentary IDE. In contrast to the MacPerl Application
+the MPW Perl tool can make use of the MPW Shell itself as an editor (with
+no 32k limit).
+
+=over 4
+
+=item Affrus
+
+is a full Perl development environment with full debugger support
+( http://www.latenightsw.com ).
+
+=item Alpha
+
+is an editor, written and extensible in Tcl, that nonetheless has
+built in support for several popular markup and programming languages
+including Perl and HTML ( http://www.his.com/~jguyer/Alpha/Alpha8.html ).
+
+=item BBEdit and BBEdit Lite
+
+are text editors for Mac OS that have a Perl sensitivity mode
+( http://web.barebones.com/ ).
+
+
+=back
+
+=head2 Where can I get Perl macros for vi?
+
+For a complete version of Tom Christiansen's vi configuration file,
+see http://www.cpan.org/authors/Tom_Christiansen/scripts/toms.exrc.gz ,
+the standard benchmark file for vi emulators. The file runs best with nvi,
+the current version of vi out of Berkeley, which incidentally can be built
+with an embedded Perl interpreter--see http://www.cpan.org/src/misc/ .
+
+=head2 Where can I get perl-mode for emacs?
+
+Since Emacs version 19 patchlevel 22 or so, there have been both a
+perl-mode.el and support for the Perl debugger built in. These should
+come with the standard Emacs 19 distribution.
+
+In the Perl source directory, you'll find a directory called "emacs",
+which contains a cperl-mode that color-codes keywords, provides
+context-sensitive help, and other nifty things.
+
+Note that the perl-mode of emacs will have fits with C<"main'foo">
+(single quote), and mess up the indentation and highlighting. You
+are probably using C<"main::foo"> in new Perl code anyway, so this
+shouldn't be an issue.
+
+=head2 How can I use curses with Perl?
+
+The Curses module from CPAN provides a dynamically loadable object
+module interface to a curses library. A small demo can be found at the
+directory http://www.cpan.org/authors/Tom_Christiansen/scripts/rep.gz ;
+this program repeats a command and updates the screen as needed, rendering
+B<rep ps axu> similar to B<top>.
+
+=head2 How can I write a GUI (X, Tk, Gtk, etc.) in Perl?
+X<GUI> X<Tk> X<Wx> X<WxWidgets> X<Gtk> X<Gtk2> X<CamelBones> X<Qt>
+
+(contributed by Ben Morrow)
+
+There are a number of modules which let you write GUIs in Perl. Most
+GUI toolkits have a perl interface: an incomplete list follows.
+
+=over 4
+
+=item Tk
+
+This works under Unix and Windows, and the current version doesn't
+look half as bad under Windows as it used to. Some of the gui elements
+still don't 'feel' quite right, though. The interface is very natural
+and 'perlish', making it easy to use in small scripts that just need a
+simple gui. It hasn't been updated in a while.
+
+=item Wx
+
+This is a Perl binding for the cross-platform wxWidgets toolkit
+( http://www.wxwidgets.org ). It works under Unix, Win32 and Mac OS X,
+using native widgets (Gtk under Unix). The interface follows the C++
+interface closely, but the documentation is a little sparse for someone
+who doesn't know the library, mostly just referring you to the C++
+documentation.
+
+=item Gtk and Gtk2
+
+These are Perl bindings for the Gtk toolkit ( http://www.gtk.org ). The
+interface changed significantly between versions 1 and 2 so they have
+separate Perl modules. It runs under Unix, Win32 and Mac OS X (currently
+it requires an X server on Mac OS, but a 'native' port is underway), and
+the widgets look the same on every plaform: i.e., they don't match the
+native widgets. As with Wx, the Perl bindings follow the C API closely,
+and the documentation requires you to read the C documentation to
+understand it.
+
+=item Win32::GUI
+
+This provides access to most of the Win32 GUI widgets from Perl.
+Obviously, it only runs under Win32, and uses native widgets. The Perl
+interface doesn't really follow the C interface: it's been made more
+Perlish, and the documentation is pretty good. More advanced stuff may
+require familiarity with the C Win32 APIs, or reference to MSDN.
+
+=item CamelBones
+
+CamelBones ( http://camelbones.sourceforge.net ) is a Perl interface to
+Mac OS X's Cocoa GUI toolkit, and as such can be used to produce native
+GUIs on Mac OS X. It's not on CPAN, as it requires frameworks that
+CPAN.pm doesn't know how to install, but installation is via the
+standard OSX package installer. The Perl API is, again, very close to
+the ObjC API it's wrapping, and the documentation just tells you how to
+translate from one to the other.
+
+=item Qt
+
+There is a Perl interface to TrollTech's Qt toolkit, but it does not
+appear to be maintained.
+
+=item Athena
+
+Sx is an interface to the Athena widget set which comes with X, but
+again it appears not to be much used nowadays.
+
+=back
+
+=head2 How can I make my Perl program run faster?
+
+The best way to do this is to come up with a better algorithm. This
+can often make a dramatic difference. Jon Bentley's book
+I<Programming Pearls> (that's not a misspelling!) has some good tips
+on optimization, too. Advice on benchmarking boils down to: benchmark
+and profile to make sure you're optimizing the right part, look for
+better algorithms instead of microtuning your code, and when all else
+fails consider just buying faster hardware. You will probably want to
+read the answer to the earlier question "How do I profile my Perl
+programs?" if you haven't done so already.
+
+A different approach is to autoload seldom-used Perl code. See the
+AutoSplit and AutoLoader modules in the standard distribution for
+that. Or you could locate the bottleneck and think about writing just
+that part in C, the way we used to take bottlenecks in C code and
+write them in assembler. Similar to rewriting in C, modules that have
+critical sections can be written in C (for instance, the PDL module
+from CPAN).
+
+If you're currently linking your perl executable to a shared
+I<libc.so>, you can often gain a 10-25% performance benefit by
+rebuilding it to link with a static libc.a instead. This will make a
+bigger perl executable, but your Perl programs (and programmers) may
+thank you for it. See the F<INSTALL> file in the source distribution
+for more information.
+
+The undump program was an ancient attempt to speed up Perl program by
+storing the already-compiled form to disk. This is no longer a viable
+option, as it only worked on a few architectures, and wasn't a good
+solution anyway.
+
+=head2 How can I make my Perl program take less memory?
+
+When it comes to time-space tradeoffs, Perl nearly always prefers to
+throw memory at a problem. Scalars in Perl use more memory than
+strings in C, arrays take more than that, and hashes use even more. While
+there's still a lot to be done, recent releases have been addressing
+these issues. For example, as of 5.004, duplicate hash keys are
+shared amongst all hashes using them, so require no reallocation.
+
+In some cases, using substr() or vec() to simulate arrays can be
+highly beneficial. For example, an array of a thousand booleans will
+take at least 20,000 bytes of space, but it can be turned into one
+125-byte bit vector--a considerable memory savings. The standard
+Tie::SubstrHash module can also help for certain types of data
+structure. If you're working with specialist data structures
+(matrices, for instance) modules that implement these in C may use
+less memory than equivalent Perl modules.
+
+Another thing to try is learning whether your Perl was compiled with
+the system malloc or with Perl's builtin malloc. Whichever one it
+is, try using the other one and see whether this makes a difference.
+Information about malloc is in the F<INSTALL> file in the source
+distribution. You can find out whether you are using perl's malloc by
+typing C<perl -V:usemymalloc>.
+
+Of course, the best way to save memory is to not do anything to waste
+it in the first place. Good programming practices can go a long way
+toward this:
+
+=over 4
+
+=item * Don't slurp!
+
+Don't read an entire file into memory if you can process it line
+by line. Or more concretely, use a loop like this:
+
+ #
+ # Good Idea
+ #
+ while (<FILE>) {
+ # ...
+ }
+
+instead of this:
+
+ #
+ # Bad Idea
+ #
+ @data = <FILE>;
+ foreach (@data) {
+ # ...
+ }
+
+When the files you're processing are small, it doesn't much matter which
+way you do it, but it makes a huge difference when they start getting
+larger.
+
+=item * Use map and grep selectively
+
+Remember that both map and grep expect a LIST argument, so doing this:
+
+ @wanted = grep {/pattern/} <FILE>;
+
+will cause the entire file to be slurped. For large files, it's better
+to loop:
+
+ while (<FILE>) {
+ push(@wanted, $_) if /pattern/;
+ }
+
+=item * Avoid unnecessary quotes and stringification
+
+Don't quote large strings unless absolutely necessary:
+
+ my $copy = "$large_string";
+
+makes 2 copies of $large_string (one for $copy and another for the
+quotes), whereas
+
+ my $copy = $large_string;
+
+only makes one copy.
+
+Ditto for stringifying large arrays:
+
+ {
+ local $, = "\n";
+ print @big_array;
+ }
+
+is much more memory-efficient than either
+
+ print join "\n", @big_array;
+
+or
+
+ {
+ local $" = "\n";
+ print "@big_array";
+ }
+
+
+=item * Pass by reference
+
+Pass arrays and hashes by reference, not by value. For one thing, it's
+the only way to pass multiple lists or hashes (or both) in a single
+call/return. It also avoids creating a copy of all the contents. This
+requires some judgement, however, because any changes will be propagated
+back to the original data. If you really want to mangle (er, modify) a
+copy, you'll have to sacrifice the memory needed to make one.
+
+=item * Tie large variables to disk.
+
+For "big" data stores (i.e. ones that exceed available memory) consider
+using one of the DB modules to store it on disk instead of in RAM. This
+will incur a penalty in access time, but that's probably better than
+causing your hard disk to thrash due to massive swapping.
+
+=back
+
+=head2 Is it safe to return a reference to local or lexical data?
+
+Yes. Perl's garbage collection system takes care of this so
+everything works out right.
+
+ sub makeone {
+ my @a = ( 1 .. 10 );
+ return \@a;
+ }
+
+ for ( 1 .. 10 ) {
+ push @many, makeone();
+ }
+
+ print $many[4][5], "\n";
+
+ print "@many\n";
+
+=head2 How can I free an array or hash so my program shrinks?
+
+(contributed by Michael Carman)
+
+You usually can't. Memory allocated to lexicals (i.e. my() variables)
+cannot be reclaimed or reused even if they go out of scope. It is
+reserved in case the variables come back into scope. Memory allocated
+to global variables can be reused (within your program) by using
+undef() and/or delete().
+
+On most operating systems, memory allocated to a program can never be
+returned to the system. That's why long-running programs sometimes re-
+exec themselves. Some operating systems (notably, systems that use
+mmap(2) for allocating large chunks of memory) can reclaim memory that
+is no longer used, but on such systems, perl must be configured and
+compiled to use the OS's malloc, not perl's.
+
+In general, memory allocation and de-allocation isn't something you can
+or should be worrying about much in Perl.
+
+See also "How can I make my Perl program take less memory?"
+
+=head2 How can I make my CGI script more efficient?
+
+Beyond the normal measures described to make general Perl programs
+faster or smaller, a CGI program has additional issues. It may be run
+several times per second. Given that each time it runs it will need
+to be re-compiled and will often allocate a megabyte or more of system
+memory, this can be a killer. Compiling into C B<isn't going to help
+you> because the process start-up overhead is where the bottleneck is.
+
+There are two popular ways to avoid this overhead. One solution
+involves running the Apache HTTP server (available from
+http://www.apache.org/ ) with either of the mod_perl or mod_fastcgi
+plugin modules.
+
+With mod_perl and the Apache::Registry module (distributed with
+mod_perl), httpd will run with an embedded Perl interpreter which
+pre-compiles your script and then executes it within the same address
+space without forking. The Apache extension also gives Perl access to
+the internal server API, so modules written in Perl can do just about
+anything a module written in C can. For more on mod_perl, see
+http://perl.apache.org/
+
+With the FCGI module (from CPAN) and the mod_fastcgi
+module (available from http://www.fastcgi.com/ ) each of your Perl
+programs becomes a permanent CGI daemon process.
+
+Both of these solutions can have far-reaching effects on your system
+and on the way you write your CGI programs, so investigate them with
+care.
+
+See http://www.cpan.org/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/ .
+
+=head2 How can I hide the source for my Perl program?
+
+Delete it. :-) Seriously, there are a number of (mostly
+unsatisfactory) solutions with varying levels of "security".
+
+First of all, however, you I<can't> take away read permission, because
+the source code has to be readable in order to be compiled and
+interpreted. (That doesn't mean that a CGI script's source is
+readable by people on the web, though--only by people with access to
+the filesystem.) So you have to leave the permissions at the socially
+friendly 0755 level.
+
+Some people regard this as a security problem. If your program does
+insecure things and relies on people not knowing how to exploit those
+insecurities, it is not secure. It is often possible for someone to
+determine the insecure things and exploit them without viewing the
+source. Security through obscurity, the name for hiding your bugs
+instead of fixing them, is little security indeed.
+
+You can try using encryption via source filters (Starting from Perl
+5.8 the Filter::Simple and Filter::Util::Call modules are included in
+the standard distribution), but any decent programmer will be able to
+decrypt it. You can try using the byte code compiler and interpreter
+described later in L<perlfaq3>, but the curious might still be able to
+de-compile it. You can try using the native-code compiler described
+later, but crackers might be able to disassemble it. These pose
+varying degrees of difficulty to people wanting to get at your code,
+but none can definitively conceal it (true of every language, not just
+Perl).
+
+It is very easy to recover the source of Perl programs. You simply
+feed the program to the perl interpreter and use the modules in
+the B:: hierarchy. The B::Deparse module should be able to
+defeat most attempts to hide source. Again, this is not
+unique to Perl.
+
+If you're concerned about people profiting from your code, then the
+bottom line is that nothing but a restrictive license will give you
+legal security. License your software and pepper it with threatening
+statements like "This is unpublished proprietary software of XYZ Corp.
+Your access to it does not give you permission to use it blah blah
+blah." We are not lawyers, of course, so you should see a lawyer if
+you want to be sure your license's wording will stand up in court.
+
+=head2 How can I compile my Perl program into byte code or C?
+
+(contributed by brian d foy)
+
+In general, you can't do this. There are some things that may work
+for your situation though. People usually ask this question
+because they want to distribute their works without giving away
+the source code, and most solutions trade disk space for convenience.
+You probably won't see much of a speed increase either, since most
+solutions simply bundle a Perl interpreter in the final product
+(but see L<How can I make my Perl program run faster?>).
+
+The Perl Archive Toolkit ( http://par.perl.org/ ) is Perl's
+analog to Java's JAR. It's freely available and on CPAN (
+http://search.cpan.org/dist/PAR/ ).
+
+There are also some commercial products that may work for you, although
+you have to buy a license for them.
+
+The Perl Dev Kit ( http://www.activestate.com/Products/Perl_Dev_Kit/ )
+from ActiveState can "Turn your Perl programs into ready-to-run
+executables for HP-UX, Linux, Solaris and Windows."
+
+Perl2Exe ( http://www.indigostar.com/perl2exe.htm ) is a command line
+program for converting perl scripts to executable files. It targets both
+Windows and unix platforms.
+
+=head2 How can I get C<#!perl> to work on [MS-DOS,NT,...]?
+
+For OS/2 just use
+
+ extproc perl -S -your_switches
+
+as the first line in C<*.cmd> file (C<-S> due to a bug in cmd.exe's
+"extproc" handling). For DOS one should first invent a corresponding
+batch file and codify it in C<ALTERNATE_SHEBANG> (see the
+F<dosish.h> file in the source distribution for more information).
+
+The Win95/NT installation, when using the ActiveState port of Perl,
+will modify the Registry to associate the C<.pl> extension with the
+perl interpreter. If you install another port, perhaps even building
+your own Win95/NT Perl from the standard sources by using a Windows port
+of gcc (e.g., with cygwin or mingw32), then you'll have to modify
+the Registry yourself. In addition to associating C<.pl> with the
+interpreter, NT people can use: C<SET PATHEXT=%PATHEXT%;.PL> to let them
+run the program C<install-linux.pl> merely by typing C<install-linux>.
+
+Under "Classic" MacOS, a perl program will have the appropriate Creator and
+Type, so that double-clicking them will invoke the MacPerl application.
+Under Mac OS X, clickable apps can be made from any C<#!> script using Wil
+Sanchez' DropScript utility: http://www.wsanchez.net/software/ .
+
+I<IMPORTANT!>: Whatever you do, PLEASE don't get frustrated, and just
+throw the perl interpreter into your cgi-bin directory, in order to
+get your programs working for a web server. This is an EXTREMELY big
+security risk. Take the time to figure out how to do it correctly.
+
+=head2 Can I write useful Perl programs on the command line?
+
+Yes. Read L<perlrun> for more information. Some examples follow.
+(These assume standard Unix shell quoting rules.)
+
+ # sum first and last fields
+ perl -lane 'print $F[0] + $F[-1]' *
+
+ # identify text files
+ perl -le 'for(@ARGV) {print if -f && -T _}' *
+
+ # remove (most) comments from C program
+ perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c
+
+ # make file a month younger than today, defeating reaper daemons
+ perl -e '$X=24*60*60; utime(time(),time() + 30 * $X,@ARGV)' *
+
+ # find first unused uid
+ perl -le '$i++ while getpwuid($i); print $i'
+
+ # display reasonable manpath
+ echo $PATH | perl -nl -072 -e '
+ s![^/+]*$!man!&&-d&&!$s{$_}++&&push@m,$_;END{print"@m"}'
+
+OK, the last one was actually an Obfuscated Perl Contest entry. :-)
+
+=head2 Why don't Perl one-liners work on my DOS/Mac/VMS system?
+
+The problem is usually that the command interpreters on those systems
+have rather different ideas about quoting than the Unix shells under
+which the one-liners were created. On some systems, you may have to
+change single-quotes to double ones, which you must I<NOT> do on Unix
+or Plan9 systems. You might also have to change a single % to a %%.
+
+For example:
+
+ # Unix (including Mac OS X)
+ perl -e 'print "Hello world\n"'
+
+ # DOS, etc.
+ perl -e "print \"Hello world\n\""
+
+ # Mac Classic
+ print "Hello world\n"
+ (then Run "Myscript" or Shift-Command-R)
+
+ # MPW
+ perl -e 'print "Hello world\n"'
+
+ # VMS
+ perl -e "print ""Hello world\n"""
+
+The problem is that none of these examples are reliable: they depend on the
+command interpreter. Under Unix, the first two often work. Under DOS,
+it's entirely possible that neither works. If 4DOS was the command shell,
+you'd probably have better luck like this:
+
+ perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""
+
+Under the Mac, it depends which environment you are using. The MacPerl
+shell, or MPW, is much like Unix shells in its support for several
+quoting variants, except that it makes free use of the Mac's non-ASCII
+characters as control characters.
+
+Using qq(), q(), and qx(), instead of "double quotes", 'single
+quotes', and `backticks`, may make one-liners easier to write.
+
+There is no general solution to all of this. It is a mess.
+
+[Some of this answer was contributed by Kenneth Albanowski.]
+
+=head2 Where can I learn about CGI or Web programming in Perl?
+
+For modules, get the CGI or LWP modules from CPAN. For textbooks,
+see the two especially dedicated to web stuff in the question on
+books. For problems and questions related to the web, like "Why
+do I get 500 Errors" or "Why doesn't it run from the browser right
+when it runs fine on the command line", see the troubleshooting
+guides and references in L<perlfaq9> or in the CGI MetaFAQ:
+
+ http://www.perl.org/CGI_MetaFAQ.html
+
+=head2 Where can I learn about object-oriented Perl programming?
+
+A good place to start is L<perltoot>, and you can use L<perlobj>,
+L<perlboot>, L<perltoot>, L<perltooc>, and L<perlbot> for reference.
+
+A good book on OO on Perl is the "Object-Oriented Perl"
+by Damian Conway from Manning Publications, or "Intermediate Perl"
+by Randal Schwartz, brian d foy, and Tom Phoenix from O'Reilly Media.
+
+=head2 Where can I learn about linking C with Perl?
+
+If you want to call C from Perl, start with L<perlxstut>,
+moving on to L<perlxs>, L<xsubpp>, and L<perlguts>. If you want to
+call Perl from C, then read L<perlembed>, L<perlcall>, and
+L<perlguts>. Don't forget that you can learn a lot from looking at
+how the authors of existing extension modules wrote their code and
+solved their problems.
+
+You might not need all the power of XS. The Inline::C module lets
+you put C code directly in your Perl source. It handles all the
+magic to make it work. You still have to learn at least some of
+the perl API but you won't have to deal with the complexity of the
+XS support files.
+
+=head2 I've read perlembed, perlguts, etc., but I can't embed perl in my C program; what am I doing wrong?
+
+Download the ExtUtils::Embed kit from CPAN and run `make test'. If
+the tests pass, read the pods again and again and again. If they
+fail, see L<perlbug> and send a bug report with the output of
+C<make test TEST_VERBOSE=1> along with C<perl -V>.
+
+=head2 When I tried to run my script, I got this message. What does it mean?
+
+A complete list of Perl's error messages and warnings with explanatory
+text can be found in L<perldiag>. You can also use the splain program
+(distributed with Perl) to explain the error messages:
+
+ perl program 2>diag.out
+ splain [-v] [-p] diag.out
+
+or change your program to explain the messages for you:
+
+ use diagnostics;
+
+or
+
+ use diagnostics -verbose;
+
+=head2 What's MakeMaker?
+
+(contributed by brian d foy)
+
+The C<ExtUtils::MakeMaker> module, better known simply as "MakeMaker",
+turns a Perl script, typically called C<Makefile.PL>, into a Makefile.
+The unix tool C<make> uses this file to manage dependencies and actions
+to process and install a Perl distribution.
+
+=head1 REVISION
+
+Revision: $Revision$
+
+Date: $Date$
+
+See L<perlfaq> for source control details and availability.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2009 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples here are in the public
+domain. You are permitted and encouraged to use this code and any
+derivatives thereof in your own programs for fun or for profit as you
+see fit. A simple comment in the code giving credit to the FAQ would
+be courteous but is not required.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfaq4.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq4.pod
new file mode 100755
index 00000000000..a951be3b4f5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq4.pod
@@ -0,0 +1,2534 @@
+=head1 NAME
+
+perlfaq4 - Data Manipulation
+
+=head1 DESCRIPTION
+
+This section of the FAQ answers questions related to manipulating
+numbers, dates, strings, arrays, hashes, and miscellaneous data issues.
+
+=head1 Data: Numbers
+
+=head2 Why am I getting long decimals (eg, 19.9499999999999) instead of the numbers I should be getting (eg, 19.95)?
+
+Internally, your computer represents floating-point numbers in binary.
+Digital (as in powers of two) computers cannot store all numbers
+exactly. Some real numbers lose precision in the process. This is a
+problem with how computers store numbers and affects all computer
+languages, not just Perl.
+
+L<perlnumber> shows the gory details of number representations and
+conversions.
+
+To limit the number of decimal places in your numbers, you can use the
+printf or sprintf function. See the L<"Floating Point
+Arithmetic"|perlop> for more details.
+
+ printf "%.2f", 10/3;
+
+ my $number = sprintf "%.2f", 10/3;
+
+=head2 Why is int() broken?
+
+Your C<int()> is most probably working just fine. It's the numbers that
+aren't quite what you think.
+
+First, see the answer to "Why am I getting long decimals
+(eg, 19.9499999999999) instead of the numbers I should be getting
+(eg, 19.95)?".
+
+For example, this
+
+ print int(0.6/0.2-2), "\n";
+
+will in most computers print 0, not 1, because even such simple
+numbers as 0.6 and 0.2 cannot be presented exactly by floating-point
+numbers. What you think in the above as 'three' is really more like
+2.9999999999999995559.
+
+=head2 Why isn't my octal data interpreted correctly?
+
+(contributed by brian d foy)
+
+You're probably trying to convert a string to a number, which Perl only
+converts as a decimal number. When Perl converts a string to a number, it
+ignores leading spaces and zeroes, then assumes the rest of the digits
+are in base 10:
+
+ my $string = '0644';
+
+ print $string + 0; # prints 644
+
+ print $string + 44; # prints 688, certainly not octal!
+
+This problem usually involves one of the Perl built-ins that has the
+same name a unix command that uses octal numbers as arguments on the
+command line. In this example, C<chmod> on the command line knows that
+its first argument is octal because that's what it does:
+
+ %prompt> chmod 644 file
+
+If you want to use the same literal digits (644) in Perl, you have to tell
+Perl to treat them as octal numbers either by prefixing the digits with
+a C<0> or using C<oct>:
+
+ chmod( 0644, $file); # right, has leading zero
+ chmod( oct(644), $file ); # also correct
+
+The problem comes in when you take your numbers from something that Perl
+thinks is a string, such as a command line argument in C<@ARGV>:
+
+ chmod( $ARGV[0], $file); # wrong, even if "0644"
+
+ chmod( oct($ARGV[0]), $file ); # correct, treat string as octal
+
+You can always check the value you're using by printing it in octal
+notation to ensure it matches what you think it should be. Print it
+in octal and decimal format:
+
+ printf "0%o %d", $number, $number;
+
+=head2 Does Perl have a round() function? What about ceil() and floor()? Trig functions?
+
+Remember that C<int()> merely truncates toward 0. For rounding to a
+certain number of digits, C<sprintf()> or C<printf()> is usually the
+easiest route.
+
+ printf("%.3f", 3.1415926535); # prints 3.142
+
+The C<POSIX> module (part of the standard Perl distribution)
+implements C<ceil()>, C<floor()>, and a number of other mathematical
+and trigonometric functions.
+
+ use POSIX;
+ $ceil = ceil(3.5); # 4
+ $floor = floor(3.5); # 3
+
+In 5.000 to 5.003 perls, trigonometry was done in the C<Math::Complex>
+module. With 5.004, the C<Math::Trig> module (part of the standard Perl
+distribution) implements the trigonometric functions. Internally it
+uses the C<Math::Complex> module and some functions can break out from
+the real axis into the complex plane, for example the inverse sine of
+2.
+
+Rounding in financial applications can have serious implications, and
+the rounding method used should be specified precisely. In these
+cases, it probably pays not to trust whichever system rounding is
+being used by Perl, but to instead implement the rounding function you
+need yourself.
+
+To see why, notice how you'll still have an issue on half-way-point
+alternation:
+
+ for ($i = 0; $i < 1.01; $i += 0.05) { printf "%.1f ",$i}
+
+ 0.0 0.1 0.1 0.2 0.2 0.2 0.3 0.3 0.4 0.4 0.5 0.5 0.6 0.7 0.7
+ 0.8 0.8 0.9 0.9 1.0 1.0
+
+Don't blame Perl. It's the same as in C. IEEE says we have to do
+this. Perl numbers whose absolute values are integers under 2**31 (on
+32 bit machines) will work pretty much like mathematical integers.
+Other numbers are not guaranteed.
+
+=head2 How do I convert between numeric representations/bases/radixes?
+
+As always with Perl there is more than one way to do it. Below are a
+few examples of approaches to making common conversions between number
+representations. This is intended to be representational rather than
+exhaustive.
+
+Some of the examples later in L<perlfaq4> use the C<Bit::Vector>
+module from CPAN. The reason you might choose C<Bit::Vector> over the
+perl built in functions is that it works with numbers of ANY size,
+that it is optimized for speed on some operations, and for at least
+some programmers the notation might be familiar.
+
+=over 4
+
+=item How do I convert hexadecimal into decimal
+
+Using perl's built in conversion of C<0x> notation:
+
+ $dec = 0xDEADBEEF;
+
+Using the C<hex> function:
+
+ $dec = hex("DEADBEEF");
+
+Using C<pack>:
+
+ $dec = unpack("N", pack("H8", substr("0" x 8 . "DEADBEEF", -8)));
+
+Using the CPAN module C<Bit::Vector>:
+
+ use Bit::Vector;
+ $vec = Bit::Vector->new_Hex(32, "DEADBEEF");
+ $dec = $vec->to_Dec();
+
+=item How do I convert from decimal to hexadecimal
+
+Using C<sprintf>:
+
+ $hex = sprintf("%X", 3735928559); # upper case A-F
+ $hex = sprintf("%x", 3735928559); # lower case a-f
+
+Using C<unpack>:
+
+ $hex = unpack("H*", pack("N", 3735928559));
+
+Using C<Bit::Vector>:
+
+ use Bit::Vector;
+ $vec = Bit::Vector->new_Dec(32, -559038737);
+ $hex = $vec->to_Hex();
+
+And C<Bit::Vector> supports odd bit counts:
+
+ use Bit::Vector;
+ $vec = Bit::Vector->new_Dec(33, 3735928559);
+ $vec->Resize(32); # suppress leading 0 if unwanted
+ $hex = $vec->to_Hex();
+
+=item How do I convert from octal to decimal
+
+Using Perl's built in conversion of numbers with leading zeros:
+
+ $dec = 033653337357; # note the leading 0!
+
+Using the C<oct> function:
+
+ $dec = oct("33653337357");
+
+Using C<Bit::Vector>:
+
+ use Bit::Vector;
+ $vec = Bit::Vector->new(32);
+ $vec->Chunk_List_Store(3, split(//, reverse "33653337357"));
+ $dec = $vec->to_Dec();
+
+=item How do I convert from decimal to octal
+
+Using C<sprintf>:
+
+ $oct = sprintf("%o", 3735928559);
+
+Using C<Bit::Vector>:
+
+ use Bit::Vector;
+ $vec = Bit::Vector->new_Dec(32, -559038737);
+ $oct = reverse join('', $vec->Chunk_List_Read(3));
+
+=item How do I convert from binary to decimal
+
+Perl 5.6 lets you write binary numbers directly with
+the C<0b> notation:
+
+ $number = 0b10110110;
+
+Using C<oct>:
+
+ my $input = "10110110";
+ $decimal = oct( "0b$input" );
+
+Using C<pack> and C<ord>:
+
+ $decimal = ord(pack('B8', '10110110'));
+
+Using C<pack> and C<unpack> for larger strings:
+
+ $int = unpack("N", pack("B32",
+ substr("0" x 32 . "11110101011011011111011101111", -32)));
+ $dec = sprintf("%d", $int);
+
+ # substr() is used to left pad a 32 character string with zeros.
+
+Using C<Bit::Vector>:
+
+ $vec = Bit::Vector->new_Bin(32, "11011110101011011011111011101111");
+ $dec = $vec->to_Dec();
+
+=item How do I convert from decimal to binary
+
+Using C<sprintf> (perl 5.6+):
+
+ $bin = sprintf("%b", 3735928559);
+
+Using C<unpack>:
+
+ $bin = unpack("B*", pack("N", 3735928559));
+
+Using C<Bit::Vector>:
+
+ use Bit::Vector;
+ $vec = Bit::Vector->new_Dec(32, -559038737);
+ $bin = $vec->to_Bin();
+
+The remaining transformations (e.g. hex -> oct, bin -> hex, etc.)
+are left as an exercise to the inclined reader.
+
+=back
+
+=head2 Why doesn't & work the way I want it to?
+
+The behavior of binary arithmetic operators depends on whether they're
+used on numbers or strings. The operators treat a string as a series
+of bits and work with that (the string C<"3"> is the bit pattern
+C<00110011>). The operators work with the binary form of a number
+(the number C<3> is treated as the bit pattern C<00000011>).
+
+So, saying C<11 & 3> performs the "and" operation on numbers (yielding
+C<3>). Saying C<"11" & "3"> performs the "and" operation on strings
+(yielding C<"1">).
+
+Most problems with C<&> and C<|> arise because the programmer thinks
+they have a number but really it's a string. The rest arise because
+the programmer says:
+
+ if ("\020\020" & "\101\101") {
+ # ...
+ }
+
+but a string consisting of two null bytes (the result of C<"\020\020"
+& "\101\101">) is not a false value in Perl. You need:
+
+ if ( ("\020\020" & "\101\101") !~ /[^\000]/) {
+ # ...
+ }
+
+=head2 How do I multiply matrices?
+
+Use the Math::Matrix or Math::MatrixReal modules (available from CPAN)
+or the PDL extension (also available from CPAN).
+
+=head2 How do I perform an operation on a series of integers?
+
+To call a function on each element in an array, and collect the
+results, use:
+
+ @results = map { my_func($_) } @array;
+
+For example:
+
+ @triple = map { 3 * $_ } @single;
+
+To call a function on each element of an array, but ignore the
+results:
+
+ foreach $iterator (@array) {
+ some_func($iterator);
+ }
+
+To call a function on each integer in a (small) range, you B<can> use:
+
+ @results = map { some_func($_) } (5 .. 25);
+
+but you should be aware that the C<..> operator creates an array of
+all integers in the range. This can take a lot of memory for large
+ranges. Instead use:
+
+ @results = ();
+ for ($i=5; $i < 500_005; $i++) {
+ push(@results, some_func($i));
+ }
+
+This situation has been fixed in Perl5.005. Use of C<..> in a C<for>
+loop will iterate over the range, without creating the entire range.
+
+ for my $i (5 .. 500_005) {
+ push(@results, some_func($i));
+ }
+
+will not create a list of 500,000 integers.
+
+=head2 How can I output Roman numerals?
+
+Get the http://www.cpan.org/modules/by-module/Roman module.
+
+=head2 Why aren't my random numbers random?
+
+If you're using a version of Perl before 5.004, you must call C<srand>
+once at the start of your program to seed the random number generator.
+
+ BEGIN { srand() if $] < 5.004 }
+
+5.004 and later automatically call C<srand> at the beginning. Don't
+call C<srand> more than once--you make your numbers less random,
+rather than more.
+
+Computers are good at being predictable and bad at being random
+(despite appearances caused by bugs in your programs :-). see the
+F<random> article in the "Far More Than You Ever Wanted To Know"
+collection in http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz , courtesy
+of Tom Phoenix, talks more about this. John von Neumann said, "Anyone
+who attempts to generate random numbers by deterministic means is, of
+course, living in a state of sin."
+
+If you want numbers that are more random than C<rand> with C<srand>
+provides, you should also check out the C<Math::TrulyRandom> module from
+CPAN. It uses the imperfections in your system's timer to generate
+random numbers, but this takes quite a while. If you want a better
+pseudorandom generator than comes with your operating system, look at
+"Numerical Recipes in C" at http://www.nr.com/ .
+
+=head2 How do I get a random number between X and Y?
+
+To get a random number between two values, you can use the C<rand()>
+built-in to get a random number between 0 and 1. From there, you shift
+that into the range that you want.
+
+C<rand($x)> returns a number such that C<< 0 <= rand($x) < $x >>. Thus
+what you want to have perl figure out is a random number in the range
+from 0 to the difference between your I<X> and I<Y>.
+
+That is, to get a number between 10 and 15, inclusive, you want a
+random number between 0 and 5 that you can then add to 10.
+
+ my $number = 10 + int rand( 15-10+1 ); # ( 10,11,12,13,14, or 15 )
+
+Hence you derive the following simple function to abstract
+that. It selects a random integer between the two given
+integers (inclusive), For example: C<random_int_between(50,120)>.
+
+ sub random_int_between {
+ my($min, $max) = @_;
+ # Assumes that the two arguments are integers themselves!
+ return $min if $min == $max;
+ ($min, $max) = ($max, $min) if $min > $max;
+ return $min + int rand(1 + $max - $min);
+ }
+
+=head1 Data: Dates
+
+=head2 How do I find the day or week of the year?
+
+The localtime function returns the day of the year. Without an
+argument localtime uses the current time.
+
+ $day_of_year = (localtime)[7];
+
+The C<POSIX> module can also format a date as the day of the year or
+week of the year.
+
+ use POSIX qw/strftime/;
+ my $day_of_year = strftime "%j", localtime;
+ my $week_of_year = strftime "%W", localtime;
+
+To get the day of year for any date, use C<POSIX>'s C<mktime> to get
+a time in epoch seconds for the argument to localtime.
+
+ use POSIX qw/mktime strftime/;
+ my $week_of_year = strftime "%W",
+ localtime( mktime( 0, 0, 0, 18, 11, 87 ) );
+
+The C<Date::Calc> module provides two functions to calculate these.
+
+ use Date::Calc;
+ my $day_of_year = Day_of_Year( 1987, 12, 18 );
+ my $week_of_year = Week_of_Year( 1987, 12, 18 );
+
+=head2 How do I find the current century or millennium?
+
+Use the following simple functions:
+
+ sub get_century {
+ return int((((localtime(shift || time))[5] + 1999))/100);
+ }
+
+ sub get_millennium {
+ return 1+int((((localtime(shift || time))[5] + 1899))/1000);
+ }
+
+On some systems, the C<POSIX> module's C<strftime()> function has been
+extended in a non-standard way to use a C<%C> format, which they
+sometimes claim is the "century". It isn't, because on most such
+systems, this is only the first two digits of the four-digit year, and
+thus cannot be used to reliably determine the current century or
+millennium.
+
+=head2 How can I compare two dates and find the difference?
+
+(contributed by brian d foy)
+
+You could just store all your dates as a number and then subtract.
+Life isn't always that simple though. If you want to work with
+formatted dates, the C<Date::Manip>, C<Date::Calc>, or C<DateTime>
+modules can help you.
+
+=head2 How can I take a string and turn it into epoch seconds?
+
+If it's a regular enough string that it always has the same format,
+you can split it up and pass the parts to C<timelocal> in the standard
+C<Time::Local> module. Otherwise, you should look into the C<Date::Calc>
+and C<Date::Manip> modules from CPAN.
+
+=head2 How can I find the Julian Day?
+
+(contributed by brian d foy and Dave Cross)
+
+You can use the C<Time::JulianDay> module available on CPAN. Ensure
+that you really want to find a Julian day, though, as many people have
+different ideas about Julian days. See
+http://www.hermetic.ch/cal_stud/jdn.htm for instance.
+
+You can also try the C<DateTime> module, which can convert a date/time
+to a Julian Day.
+
+ $ perl -MDateTime -le'print DateTime->today->jd'
+ 2453401.5
+
+Or the modified Julian Day
+
+ $ perl -MDateTime -le'print DateTime->today->mjd'
+ 53401
+
+Or even the day of the year (which is what some people think of as a
+Julian day)
+
+ $ perl -MDateTime -le'print DateTime->today->doy'
+ 31
+
+=head2 How do I find yesterday's date?
+X<date> X<yesterday> X<DateTime> X<Date::Calc> X<Time::Local>
+X<daylight saving time> X<day> X<Today_and_Now> X<localtime>
+X<timelocal>
+
+(contributed by brian d foy)
+
+Use one of the Date modules. The C<DateTime> module makes it simple, and
+give you the same time of day, only the day before.
+
+ use DateTime;
+
+ my $yesterday = DateTime->now->subtract( days => 1 );
+
+ print "Yesterday was $yesterday\n";
+
+You can also use the C<Date::Calc> module using its C<Today_and_Now>
+function.
+
+ use Date::Calc qw( Today_and_Now Add_Delta_DHMS );
+
+ my @date_time = Add_Delta_DHMS( Today_and_Now(), -1, 0, 0, 0 );
+
+ print "@date_time\n";
+
+Most people try to use the time rather than the calendar to figure out
+dates, but that assumes that days are twenty-four hours each. For
+most people, there are two days a year when they aren't: the switch to
+and from summer time throws this off. Let the modules do the work.
+
+If you absolutely must do it yourself (or can't use one of the
+modules), here's a solution using C<Time::Local>, which comes with
+Perl:
+
+ # contributed by Gunnar Hjalmarsson
+ use Time::Local;
+ my $today = timelocal 0, 0, 12, ( localtime )[3..5];
+ my ($d, $m, $y) = ( localtime $today-86400 )[3..5];
+ printf "Yesterday: %d-%02d-%02d\n", $y+1900, $m+1, $d;
+
+In this case, you measure the day starting at noon, and subtract 24
+hours. Even if the length of the calendar day is 23 or 25 hours,
+you'll still end up on the previous calendar day, although not at
+noon. Since you don't care about the time, the one hour difference
+doesn't matter and you end up with the previous date.
+
+=head2 Does Perl have a Year 2000 problem? Is Perl Y2K compliant?
+
+Short answer: No, Perl does not have a Year 2000 problem. Yes, Perl is
+Y2K compliant (whatever that means). The programmers you've hired to
+use it, however, probably are not.
+
+Long answer: The question belies a true understanding of the issue.
+Perl is just as Y2K compliant as your pencil--no more, and no less.
+Can you use your pencil to write a non-Y2K-compliant memo? Of course
+you can. Is that the pencil's fault? Of course it isn't.
+
+The date and time functions supplied with Perl (gmtime and localtime)
+supply adequate information to determine the year well beyond 2000
+(2038 is when trouble strikes for 32-bit machines). The year returned
+by these functions when used in a list context is the year minus 1900.
+For years between 1910 and 1999 this I<happens> to be a 2-digit decimal
+number. To avoid the year 2000 problem simply do not treat the year as
+a 2-digit number. It isn't.
+
+When gmtime() and localtime() are used in scalar context they return
+a timestamp string that contains a fully-expanded year. For example,
+C<$timestamp = gmtime(1005613200)> sets $timestamp to "Tue Nov 13 01:00:00
+2001". There's no year 2000 problem here.
+
+That doesn't mean that Perl can't be used to create non-Y2K compliant
+programs. It can. But so can your pencil. It's the fault of the user,
+not the language. At the risk of inflaming the NRA: "Perl doesn't
+break Y2K, people do." See http://www.perl.org/about/y2k.html for
+a longer exposition.
+
+=head1 Data: Strings
+
+=head2 How do I validate input?
+
+(contributed by brian d foy)
+
+There are many ways to ensure that values are what you expect or
+want to accept. Besides the specific examples that we cover in the
+perlfaq, you can also look at the modules with "Assert" and "Validate"
+in their names, along with other modules such as C<Regexp::Common>.
+
+Some modules have validation for particular types of input, such
+as C<Business::ISBN>, C<Business::CreditCard>, C<Email::Valid>,
+and C<Data::Validate::IP>.
+
+=head2 How do I unescape a string?
+
+It depends just what you mean by "escape". URL escapes are dealt
+with in L<perlfaq9>. Shell escapes with the backslash (C<\>)
+character are removed with
+
+ s/\\(.)/$1/g;
+
+This won't expand C<"\n"> or C<"\t"> or any other special escapes.
+
+=head2 How do I remove consecutive pairs of characters?
+
+(contributed by brian d foy)
+
+You can use the substitution operator to find pairs of characters (or
+runs of characters) and replace them with a single instance. In this
+substitution, we find a character in C<(.)>. The memory parentheses
+store the matched character in the back-reference C<\1> and we use
+that to require that the same thing immediately follow it. We replace
+that part of the string with the character in C<$1>.
+
+ s/(.)\1/$1/g;
+
+We can also use the transliteration operator, C<tr///>. In this
+example, the search list side of our C<tr///> contains nothing, but
+the C<c> option complements that so it contains everything. The
+replacement list also contains nothing, so the transliteration is
+almost a no-op since it won't do any replacements (or more exactly,
+replace the character with itself). However, the C<s> option squashes
+duplicated and consecutive characters in the string so a character
+does not show up next to itself
+
+ my $str = 'Haarlem'; # in the Netherlands
+ $str =~ tr///cs; # Now Harlem, like in New York
+
+=head2 How do I expand function calls in a string?
+
+(contributed by brian d foy)
+
+This is documented in L<perlref>, and although it's not the easiest
+thing to read, it does work. In each of these examples, we call the
+function inside the braces used to dereference a reference. If we
+have more than one return value, we can construct and dereference an
+anonymous array. In this case, we call the function in list context.
+
+ print "The time values are @{ [localtime] }.\n";
+
+If we want to call the function in scalar context, we have to do a bit
+more work. We can really have any code we like inside the braces, so
+we simply have to end with the scalar reference, although how you do
+that is up to you, and you can use code inside the braces. Note that
+the use of parens creates a list context, so we need C<scalar> to
+force the scalar context on the function:
+
+ print "The time is ${\(scalar localtime)}.\n"
+
+ print "The time is ${ my $x = localtime; \$x }.\n";
+
+If your function already returns a reference, you don't need to create
+the reference yourself.
+
+ sub timestamp { my $t = localtime; \$t }
+
+ print "The time is ${ timestamp() }.\n";
+
+The C<Interpolation> module can also do a lot of magic for you. You can
+specify a variable name, in this case C<E>, to set up a tied hash that
+does the interpolation for you. It has several other methods to do this
+as well.
+
+ use Interpolation E => 'eval';
+ print "The time values are $E{localtime()}.\n";
+
+In most cases, it is probably easier to simply use string concatenation,
+which also forces scalar context.
+
+ print "The time is " . localtime() . ".\n";
+
+=head2 How do I find matching/nesting anything?
+
+This isn't something that can be done in one regular expression, no
+matter how complicated. To find something between two single
+characters, a pattern like C</x([^x]*)x/> will get the intervening
+bits in $1. For multiple ones, then something more like
+C</alpha(.*?)omega/> would be needed. But none of these deals with
+nested patterns. For balanced expressions using C<(>, C<{>, C<[> or
+C<< < >> as delimiters, use the CPAN module Regexp::Common, or see
+L<perlre/(??{ code })>. For other cases, you'll have to write a
+parser.
+
+If you are serious about writing a parser, there are a number of
+modules or oddities that will make your life a lot easier. There are
+the CPAN modules C<Parse::RecDescent>, C<Parse::Yapp>, and
+C<Text::Balanced>; and the C<byacc> program. Starting from perl 5.8
+the C<Text::Balanced> is part of the standard distribution.
+
+One simple destructive, inside-out approach that you might try is to
+pull out the smallest nesting parts one at a time:
+
+ while (s/BEGIN((?:(?!BEGIN)(?!END).)*)END//gs) {
+ # do something with $1
+ }
+
+A more complicated and sneaky approach is to make Perl's regular
+expression engine do it for you. This is courtesy Dean Inada, and
+rather has the nature of an Obfuscated Perl Contest entry, but it
+really does work:
+
+ # $_ contains the string to parse
+ # BEGIN and END are the opening and closing markers for the
+ # nested text.
+
+ @( = ('(','');
+ @) = (')','');
+ ($re=$_)=~s/((BEGIN)|(END)|.)/$)[!$3]\Q$1\E$([!$2]/gs;
+ @$ = (eval{/$re/},$@!~/unmatched/i);
+ print join("\n",@$[0..$#$]) if( $$[-1] );
+
+=head2 How do I reverse a string?
+
+Use C<reverse()> in scalar context, as documented in
+L<perlfunc/reverse>.
+
+ $reversed = reverse $string;
+
+=head2 How do I expand tabs in a string?
+
+You can do it yourself:
+
+ 1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
+
+Or you can just use the C<Text::Tabs> module (part of the standard Perl
+distribution).
+
+ use Text::Tabs;
+ @expanded_lines = expand(@lines_with_tabs);
+
+=head2 How do I reformat a paragraph?
+
+Use C<Text::Wrap> (part of the standard Perl distribution):
+
+ use Text::Wrap;
+ print wrap("\t", ' ', @paragraphs);
+
+The paragraphs you give to C<Text::Wrap> should not contain embedded
+newlines. C<Text::Wrap> doesn't justify the lines (flush-right).
+
+Or use the CPAN module C<Text::Autoformat>. Formatting files can be
+easily done by making a shell alias, like so:
+
+ alias fmt="perl -i -MText::Autoformat -n0777 \
+ -e 'print autoformat $_, {all=>1}' $*"
+
+See the documentation for C<Text::Autoformat> to appreciate its many
+capabilities.
+
+=head2 How can I access or change N characters of a string?
+
+You can access the first characters of a string with substr().
+To get the first character, for example, start at position 0
+and grab the string of length 1.
+
+
+ $string = "Just another Perl Hacker";
+ $first_char = substr( $string, 0, 1 ); # 'J'
+
+To change part of a string, you can use the optional fourth
+argument which is the replacement string.
+
+ substr( $string, 13, 4, "Perl 5.8.0" );
+
+You can also use substr() as an lvalue.
+
+ substr( $string, 13, 4 ) = "Perl 5.8.0";
+
+=head2 How do I change the Nth occurrence of something?
+
+You have to keep track of N yourself. For example, let's say you want
+to change the fifth occurrence of C<"whoever"> or C<"whomever"> into
+C<"whosoever"> or C<"whomsoever">, case insensitively. These
+all assume that $_ contains the string to be altered.
+
+ $count = 0;
+ s{((whom?)ever)}{
+ ++$count == 5 # is it the 5th?
+ ? "${2}soever" # yes, swap
+ : $1 # renege and leave it there
+ }ige;
+
+In the more general case, you can use the C</g> modifier in a C<while>
+loop, keeping count of matches.
+
+ $WANT = 3;
+ $count = 0;
+ $_ = "One fish two fish red fish blue fish";
+ while (/(\w+)\s+fish\b/gi) {
+ if (++$count == $WANT) {
+ print "The third fish is a $1 one.\n";
+ }
+ }
+
+That prints out: C<"The third fish is a red one."> You can also use a
+repetition count and repeated pattern like this:
+
+ /(?:\w+\s+fish\s+){2}(\w+)\s+fish/i;
+
+=head2 How can I count the number of occurrences of a substring within a string?
+
+There are a number of ways, with varying efficiency. If you want a
+count of a certain single character (X) within a string, you can use the
+C<tr///> function like so:
+
+ $string = "ThisXlineXhasXsomeXx'sXinXit";
+ $count = ($string =~ tr/X//);
+ print "There are $count X characters in the string";
+
+This is fine if you are just looking for a single character. However,
+if you are trying to count multiple character substrings within a
+larger string, C<tr///> won't work. What you can do is wrap a while()
+loop around a global pattern match. For example, let's count negative
+integers:
+
+ $string = "-9 55 48 -2 23 -76 4 14 -44";
+ while ($string =~ /-\d+/g) { $count++ }
+ print "There are $count negative numbers in the string";
+
+Another version uses a global match in list context, then assigns the
+result to a scalar, producing a count of the number of matches.
+
+ $count = () = $string =~ /-\d+/g;
+
+=head2 Does Perl have a Year 2038 problem?
+
+No, all of Perl's built in date and time functions and modules will
+work to about 2 billion years before and after 1970.
+
+Many systems cannot count time past the year 2038. Older versions of
+Perl were dependent on the system to do date calculation and thus
+shared their 2038 bug.
+
+=head2 How do I capitalize all the words on one line?
+X<Text::Autoformat> X<capitalize> X<case, title> X<case, sentence>
+
+(contributed by brian d foy)
+
+Damian Conway's L<Text::Autoformat> handles all of the thinking
+for you.
+
+ use Text::Autoformat;
+ my $x = "Dr. Strangelove or: How I Learned to Stop ".
+ "Worrying and Love the Bomb";
+
+ print $x, "\n";
+ for my $style (qw( sentence title highlight )) {
+ print autoformat($x, { case => $style }), "\n";
+ }
+
+How do you want to capitalize those words?
+
+ FRED AND BARNEY'S LODGE # all uppercase
+ Fred And Barney's Lodge # title case
+ Fred and Barney's Lodge # highlight case
+
+It's not as easy a problem as it looks. How many words do you think
+are in there? Wait for it... wait for it.... If you answered 5
+you're right. Perl words are groups of C<\w+>, but that's not what
+you want to capitalize. How is Perl supposed to know not to capitalize
+that C<s> after the apostrophe? You could try a regular expression:
+
+ $string =~ s/ (
+ (^\w) #at the beginning of the line
+ | # or
+ (\s\w) #preceded by whitespace
+ )
+ /\U$1/xg;
+
+ $string =~ s/([\w']+)/\u\L$1/g;
+
+Now, what if you don't want to capitalize that "and"? Just use
+L<Text::Autoformat> and get on with the next problem. :)
+
+=head2 How can I split a [character] delimited string except when inside [character]?
+
+Several modules can handle this sort of parsing--C<Text::Balanced>,
+C<Text::CSV>, C<Text::CSV_XS>, and C<Text::ParseWords>, among others.
+
+Take the example case of trying to split a string that is
+comma-separated into its different fields. You can't use C<split(/,/)>
+because you shouldn't split if the comma is inside quotes. For
+example, take a data line like this:
+
+ SAR001,"","Cimetrix, Inc","Bob Smith","CAM",N,8,1,0,7,"Error, Core Dumped"
+
+Due to the restriction of the quotes, this is a fairly complex
+problem. Thankfully, we have Jeffrey Friedl, author of
+I<Mastering Regular Expressions>, to handle these for us. He
+suggests (assuming your string is contained in C<$text>):
+
+ @new = ();
+ push(@new, $+) while $text =~ m{
+ "([^\"\\]*(?:\\.[^\"\\]*)*)",? # groups the phrase inside the quotes
+ | ([^,]+),?
+ | ,
+ }gx;
+ push(@new, undef) if substr($text,-1,1) eq ',';
+
+If you want to represent quotation marks inside a
+quotation-mark-delimited field, escape them with backslashes (eg,
+C<"like \"this\"">.
+
+Alternatively, the C<Text::ParseWords> module (part of the standard
+Perl distribution) lets you say:
+
+ use Text::ParseWords;
+ @new = quotewords(",", 0, $text);
+
+=head2 How do I strip blank space from the beginning/end of a string?
+
+(contributed by brian d foy)
+
+A substitution can do this for you. For a single line, you want to
+replace all the leading or trailing whitespace with nothing. You
+can do that with a pair of substitutions.
+
+ s/^\s+//;
+ s/\s+$//;
+
+You can also write that as a single substitution, although it turns
+out the combined statement is slower than the separate ones. That
+might not matter to you, though.
+
+ s/^\s+|\s+$//g;
+
+In this regular expression, the alternation matches either at the
+beginning or the end of the string since the anchors have a lower
+precedence than the alternation. With the C</g> flag, the substitution
+makes all possible matches, so it gets both. Remember, the trailing
+newline matches the C<\s+>, and the C<$> anchor can match to the
+physical end of the string, so the newline disappears too. Just add
+the newline to the output, which has the added benefit of preserving
+"blank" (consisting entirely of whitespace) lines which the C<^\s+>
+would remove all by itself.
+
+ while( <> )
+ {
+ s/^\s+|\s+$//g;
+ print "$_\n";
+ }
+
+For a multi-line string, you can apply the regular expression
+to each logical line in the string by adding the C</m> flag (for
+"multi-line"). With the C</m> flag, the C<$> matches I<before> an
+embedded newline, so it doesn't remove it. It still removes the
+newline at the end of the string.
+
+ $string =~ s/^\s+|\s+$//gm;
+
+Remember that lines consisting entirely of whitespace will disappear,
+since the first part of the alternation can match the entire string
+and replace it with nothing. If need to keep embedded blank lines,
+you have to do a little more work. Instead of matching any whitespace
+(since that includes a newline), just match the other whitespace.
+
+ $string =~ s/^[\t\f ]+|[\t\f ]+$//mg;
+
+=head2 How do I pad a string with blanks or pad a number with zeroes?
+
+In the following examples, C<$pad_len> is the length to which you wish
+to pad the string, C<$text> or C<$num> contains the string to be padded,
+and C<$pad_char> contains the padding character. You can use a single
+character string constant instead of the C<$pad_char> variable if you
+know what it is in advance. And in the same way you can use an integer in
+place of C<$pad_len> if you know the pad length in advance.
+
+The simplest method uses the C<sprintf> function. It can pad on the left
+or right with blanks and on the left with zeroes and it will not
+truncate the result. The C<pack> function can only pad strings on the
+right with blanks and it will truncate the result to a maximum length of
+C<$pad_len>.
+
+ # Left padding a string with blanks (no truncation):
+ $padded = sprintf("%${pad_len}s", $text);
+ $padded = sprintf("%*s", $pad_len, $text); # same thing
+
+ # Right padding a string with blanks (no truncation):
+ $padded = sprintf("%-${pad_len}s", $text);
+ $padded = sprintf("%-*s", $pad_len, $text); # same thing
+
+ # Left padding a number with 0 (no truncation):
+ $padded = sprintf("%0${pad_len}d", $num);
+ $padded = sprintf("%0*d", $pad_len, $num); # same thing
+
+ # Right padding a string with blanks using pack (will truncate):
+ $padded = pack("A$pad_len",$text);
+
+If you need to pad with a character other than blank or zero you can use
+one of the following methods. They all generate a pad string with the
+C<x> operator and combine that with C<$text>. These methods do
+not truncate C<$text>.
+
+Left and right padding with any character, creating a new string:
+
+ $padded = $pad_char x ( $pad_len - length( $text ) ) . $text;
+ $padded = $text . $pad_char x ( $pad_len - length( $text ) );
+
+Left and right padding with any character, modifying C<$text> directly:
+
+ substr( $text, 0, 0 ) = $pad_char x ( $pad_len - length( $text ) );
+ $text .= $pad_char x ( $pad_len - length( $text ) );
+
+=head2 How do I extract selected columns from a string?
+
+(contributed by brian d foy)
+
+If you know where the columns that contain the data, you can
+use C<substr> to extract a single column.
+
+ my $column = substr( $line, $start_column, $length );
+
+You can use C<split> if the columns are separated by whitespace or
+some other delimiter, as long as whitespace or the delimiter cannot
+appear as part of the data.
+
+ my $line = ' fred barney betty ';
+ my @columns = split /\s+/, $line;
+ # ( '', 'fred', 'barney', 'betty' );
+
+ my $line = 'fred||barney||betty';
+ my @columns = split /\|/, $line;
+ # ( 'fred', '', 'barney', '', 'betty' );
+
+If you want to work with comma-separated values, don't do this since
+that format is a bit more complicated. Use one of the modules that
+handle that format, such as C<Text::CSV>, C<Text::CSV_XS>, or
+C<Text::CSV_PP>.
+
+If you want to break apart an entire line of fixed columns, you can use
+C<unpack> with the A (ASCII) format. by using a number after the format
+specifier, you can denote the column width. See the C<pack> and C<unpack>
+entries in L<perlfunc> for more details.
+
+ my @fields = unpack( $line, "A8 A8 A8 A16 A4" );
+
+Note that spaces in the format argument to C<unpack> do not denote literal
+spaces. If you have space separated data, you may want C<split> instead.
+
+=head2 How do I find the soundex value of a string?
+
+(contributed by brian d foy)
+
+You can use the Text::Soundex module. If you want to do fuzzy or close
+matching, you might also try the C<String::Approx>, and
+C<Text::Metaphone>, and C<Text::DoubleMetaphone> modules.
+
+=head2 How can I expand variables in text strings?
+
+(contributed by brian d foy)
+
+If you can avoid it, don't, or if you can use a templating system,
+such as C<Text::Template> or C<Template> Toolkit, do that instead. You
+might even be able to get the job done with C<sprintf> or C<printf>:
+
+ my $string = sprintf 'Say hello to %s and %s', $foo, $bar;
+
+However, for the one-off simple case where I don't want to pull out a
+full templating system, I'll use a string that has two Perl scalar
+variables in it. In this example, I want to expand C<$foo> and C<$bar>
+to their variable's values:
+
+ my $foo = 'Fred';
+ my $bar = 'Barney';
+ $string = 'Say hello to $foo and $bar';
+
+One way I can do this involves the substitution operator and a double
+C</e> flag. The first C</e> evaluates C<$1> on the replacement side and
+turns it into C<$foo>. The second /e starts with C<$foo> and replaces
+it with its value. C<$foo>, then, turns into 'Fred', and that's finally
+what's left in the string:
+
+ $string =~ s/(\$\w+)/$1/eeg; # 'Say hello to Fred and Barney'
+
+The C</e> will also silently ignore violations of strict, replacing
+undefined variable names with the empty string. Since I'm using the
+C</e> flag (twice even!), I have all of the same security problems I
+have with C<eval> in its string form. If there's something odd in
+C<$foo>, perhaps something like C<@{[ system "rm -rf /" ]}>, then
+I could get myself in trouble.
+
+To get around the security problem, I could also pull the values from
+a hash instead of evaluating variable names. Using a single C</e>, I
+can check the hash to ensure the value exists, and if it doesn't, I
+can replace the missing value with a marker, in this case C<???> to
+signal that I missed something:
+
+ my $string = 'This has $foo and $bar';
+
+ my %Replacements = (
+ foo => 'Fred',
+ );
+
+ # $string =~ s/\$(\w+)/$Replacements{$1}/g;
+ $string =~ s/\$(\w+)/
+ exists $Replacements{$1} ? $Replacements{$1} : '???'
+ /eg;
+
+ print $string;
+
+=head2 What's wrong with always quoting "$vars"?
+
+The problem is that those double-quotes force
+stringification--coercing numbers and references into strings--even
+when you don't want them to be strings. Think of it this way:
+double-quote expansion is used to produce new strings. If you already
+have a string, why do you need more?
+
+If you get used to writing odd things like these:
+
+ print "$var"; # BAD
+ $new = "$old"; # BAD
+ somefunc("$var"); # BAD
+
+You'll be in trouble. Those should (in 99.8% of the cases) be
+the simpler and more direct:
+
+ print $var;
+ $new = $old;
+ somefunc($var);
+
+Otherwise, besides slowing you down, you're going to break code when
+the thing in the scalar is actually neither a string nor a number, but
+a reference:
+
+ func(\@array);
+ sub func {
+ my $aref = shift;
+ my $oref = "$aref"; # WRONG
+ }
+
+You can also get into subtle problems on those few operations in Perl
+that actually do care about the difference between a string and a
+number, such as the magical C<++> autoincrement operator or the
+syscall() function.
+
+Stringification also destroys arrays.
+
+ @lines = `command`;
+ print "@lines"; # WRONG - extra blanks
+ print @lines; # right
+
+=head2 Why don't my E<lt>E<lt>HERE documents work?
+
+Check for these three things:
+
+=over 4
+
+=item There must be no space after the E<lt>E<lt> part.
+
+=item There (probably) should be a semicolon at the end.
+
+=item You can't (easily) have any space in front of the tag.
+
+=back
+
+If you want to indent the text in the here document, you
+can do this:
+
+ # all in one
+ ($VAR = <<HERE_TARGET) =~ s/^\s+//gm;
+ your text
+ goes here
+ HERE_TARGET
+
+But the HERE_TARGET must still be flush against the margin.
+If you want that indented also, you'll have to quote
+in the indentation.
+
+ ($quote = <<' FINIS') =~ s/^\s+//gm;
+ ...we will have peace, when you and all your works have
+ perished--and the works of your dark master to whom you
+ would deliver us. You are a liar, Saruman, and a corrupter
+ of men's hearts. --Theoden in /usr/src/perl/taint.c
+ FINIS
+ $quote =~ s/\s+--/\n--/;
+
+A nice general-purpose fixer-upper function for indented here documents
+follows. It expects to be called with a here document as its argument.
+It looks to see whether each line begins with a common substring, and
+if so, strips that substring off. Otherwise, it takes the amount of leading
+whitespace found on the first line and removes that much off each
+subsequent line.
+
+ sub fix {
+ local $_ = shift;
+ my ($white, $leader); # common whitespace and common leading string
+ if (/^\s*(?:([^\w\s]+)(\s*).*\n)(?:\s*\1\2?.*\n)+$/) {
+ ($white, $leader) = ($2, quotemeta($1));
+ } else {
+ ($white, $leader) = (/^(\s+)/, '');
+ }
+ s/^\s*?$leader(?:$white)?//gm;
+ return $_;
+ }
+
+This works with leading special strings, dynamically determined:
+
+ $remember_the_main = fix<<' MAIN_INTERPRETER_LOOP';
+ @@@ int
+ @@@ runops() {
+ @@@ SAVEI32(runlevel);
+ @@@ runlevel++;
+ @@@ while ( op = (*op->op_ppaddr)() );
+ @@@ TAINT_NOT;
+ @@@ return 0;
+ @@@ }
+ MAIN_INTERPRETER_LOOP
+
+Or with a fixed amount of leading whitespace, with remaining
+indentation correctly preserved:
+
+ $poem = fix<<EVER_ON_AND_ON;
+ Now far ahead the Road has gone,
+ And I must follow, if I can,
+ Pursuing it with eager feet,
+ Until it joins some larger way
+ Where many paths and errands meet.
+ And whither then? I cannot say.
+ --Bilbo in /usr/src/perl/pp_ctl.c
+ EVER_ON_AND_ON
+
+=head1 Data: Arrays
+
+=head2 What is the difference between a list and an array?
+
+An array has a changeable length. A list does not. An array is
+something you can push or pop, while a list is a set of values. Some
+people make the distinction that a list is a value while an array is a
+variable. Subroutines are passed and return lists, you put things into
+list context, you initialize arrays with lists, and you C<foreach()>
+across a list. C<@> variables are arrays, anonymous arrays are
+arrays, arrays in scalar context behave like the number of elements in
+them, subroutines access their arguments through the array C<@_>, and
+C<push>/C<pop>/C<shift> only work on arrays.
+
+As a side note, there's no such thing as a list in scalar context.
+When you say
+
+ $scalar = (2, 5, 7, 9);
+
+you're using the comma operator in scalar context, so it uses the scalar
+comma operator. There never was a list there at all! This causes the
+last value to be returned: 9.
+
+=head2 What is the difference between $array[1] and @array[1]?
+
+The former is a scalar value; the latter an array slice, making
+it a list with one (scalar) value. You should use $ when you want a
+scalar value (most of the time) and @ when you want a list with one
+scalar value in it (very, very rarely; nearly never, in fact).
+
+Sometimes it doesn't make a difference, but sometimes it does.
+For example, compare:
+
+ $good[0] = `some program that outputs several lines`;
+
+with
+
+ @bad[0] = `same program that outputs several lines`;
+
+The C<use warnings> pragma and the B<-w> flag will warn you about these
+matters.
+
+=head2 How can I remove duplicate elements from a list or array?
+
+(contributed by brian d foy)
+
+Use a hash. When you think the words "unique" or "duplicated", think
+"hash keys".
+
+If you don't care about the order of the elements, you could just
+create the hash then extract the keys. It's not important how you
+create that hash: just that you use C<keys> to get the unique
+elements.
+
+ my %hash = map { $_, 1 } @array;
+ # or a hash slice: @hash{ @array } = ();
+ # or a foreach: $hash{$_} = 1 foreach ( @array );
+
+ my @unique = keys %hash;
+
+If you want to use a module, try the C<uniq> function from
+C<List::MoreUtils>. In list context it returns the unique elements,
+preserving their order in the list. In scalar context, it returns the
+number of unique elements.
+
+ use List::MoreUtils qw(uniq);
+
+ my @unique = uniq( 1, 2, 3, 4, 4, 5, 6, 5, 7 ); # 1,2,3,4,5,6,7
+ my $unique = uniq( 1, 2, 3, 4, 4, 5, 6, 5, 7 ); # 7
+
+You can also go through each element and skip the ones you've seen
+before. Use a hash to keep track. The first time the loop sees an
+element, that element has no key in C<%Seen>. The C<next> statement
+creates the key and immediately uses its value, which is C<undef>, so
+the loop continues to the C<push> and increments the value for that
+key. The next time the loop sees that same element, its key exists in
+the hash I<and> the value for that key is true (since it's not 0 or
+C<undef>), so the next skips that iteration and the loop goes to the
+next element.
+
+ my @unique = ();
+ my %seen = ();
+
+ foreach my $elem ( @array )
+ {
+ next if $seen{ $elem }++;
+ push @unique, $elem;
+ }
+
+You can write this more briefly using a grep, which does the
+same thing.
+
+ my %seen = ();
+ my @unique = grep { ! $seen{ $_ }++ } @array;
+
+=head2 How can I tell whether a certain element is contained in a list or array?
+
+(portions of this answer contributed by Anno Siegel and brian d foy)
+
+Hearing the word "in" is an I<in>dication that you probably should have
+used a hash, not a list or array, to store your data. Hashes are
+designed to answer this question quickly and efficiently. Arrays aren't.
+
+That being said, there are several ways to approach this. In Perl 5.10
+and later, you can use the smart match operator to check that an item is
+contained in an array or a hash:
+
+ use 5.010;
+
+ if( $item ~~ @array )
+ {
+ say "The array contains $item"
+ }
+
+ if( $item ~~ %hash )
+ {
+ say "The hash contains $item"
+ }
+
+With earlier versions of Perl, you have to do a bit more work. If you
+are going to make this query many times over arbitrary string values,
+the fastest way is probably to invert the original array and maintain a
+hash whose keys are the first array's values:
+
+ @blues = qw/azure cerulean teal turquoise lapis-lazuli/;
+ %is_blue = ();
+ for (@blues) { $is_blue{$_} = 1 }
+
+Now you can check whether C<$is_blue{$some_color}>. It might have
+been a good idea to keep the blues all in a hash in the first place.
+
+If the values are all small integers, you could use a simple indexed
+array. This kind of an array will take up less space:
+
+ @primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31);
+ @is_tiny_prime = ();
+ for (@primes) { $is_tiny_prime[$_] = 1 }
+ # or simply @istiny_prime[@primes] = (1) x @primes;
+
+Now you check whether $is_tiny_prime[$some_number].
+
+If the values in question are integers instead of strings, you can save
+quite a lot of space by using bit strings instead:
+
+ @articles = ( 1..10, 150..2000, 2017 );
+ undef $read;
+ for (@articles) { vec($read,$_,1) = 1 }
+
+Now check whether C<vec($read,$n,1)> is true for some C<$n>.
+
+These methods guarantee fast individual tests but require a re-organization
+of the original list or array. They only pay off if you have to test
+multiple values against the same array.
+
+If you are testing only once, the standard module C<List::Util> exports
+the function C<first> for this purpose. It works by stopping once it
+finds the element. It's written in C for speed, and its Perl equivalent
+looks like this subroutine:
+
+ sub first (&@) {
+ my $code = shift;
+ foreach (@_) {
+ return $_ if &{$code}();
+ }
+ undef;
+ }
+
+If speed is of little concern, the common idiom uses grep in scalar context
+(which returns the number of items that passed its condition) to traverse the
+entire list. This does have the benefit of telling you how many matches it
+found, though.
+
+ my $is_there = grep $_ eq $whatever, @array;
+
+If you want to actually extract the matching elements, simply use grep in
+list context.
+
+ my @matches = grep $_ eq $whatever, @array;
+
+=head2 How do I compute the difference of two arrays? How do I compute the intersection of two arrays?
+
+Use a hash. Here's code to do both and more. It assumes that each
+element is unique in a given array:
+
+ @union = @intersection = @difference = ();
+ %count = ();
+ foreach $element (@array1, @array2) { $count{$element}++ }
+ foreach $element (keys %count) {
+ push @union, $element;
+ push @{ $count{$element} > 1 ? \@intersection : \@difference }, $element;
+ }
+
+Note that this is the I<symmetric difference>, that is, all elements
+in either A or in B but not in both. Think of it as an xor operation.
+
+=head2 How do I test whether two arrays or hashes are equal?
+
+With Perl 5.10 and later, the smart match operator can give you the answer
+with the least amount of work:
+
+ use 5.010;
+
+ if( @array1 ~~ @array2 )
+ {
+ say "The arrays are the same";
+ }
+
+ if( %hash1 ~~ %hash2 ) # doesn't check values!
+ {
+ say "The hash keys are the same";
+ }
+
+The following code works for single-level arrays. It uses a
+stringwise comparison, and does not distinguish defined versus
+undefined empty strings. Modify if you have other needs.
+
+ $are_equal = compare_arrays(\@frogs, \@toads);
+
+ sub compare_arrays {
+ my ($first, $second) = @_;
+ no warnings; # silence spurious -w undef complaints
+ return 0 unless @$first == @$second;
+ for (my $i = 0; $i < @$first; $i++) {
+ return 0 if $first->[$i] ne $second->[$i];
+ }
+ return 1;
+ }
+
+For multilevel structures, you may wish to use an approach more
+like this one. It uses the CPAN module C<FreezeThaw>:
+
+ use FreezeThaw qw(cmpStr);
+ @a = @b = ( "this", "that", [ "more", "stuff" ] );
+
+ printf "a and b contain %s arrays\n",
+ cmpStr(\@a, \@b) == 0
+ ? "the same"
+ : "different";
+
+This approach also works for comparing hashes. Here we'll demonstrate
+two different answers:
+
+ use FreezeThaw qw(cmpStr cmpStrHard);
+
+ %a = %b = ( "this" => "that", "extra" => [ "more", "stuff" ] );
+ $a{EXTRA} = \%b;
+ $b{EXTRA} = \%a;
+
+ printf "a and b contain %s hashes\n",
+ cmpStr(\%a, \%b) == 0 ? "the same" : "different";
+
+ printf "a and b contain %s hashes\n",
+ cmpStrHard(\%a, \%b) == 0 ? "the same" : "different";
+
+
+The first reports that both those the hashes contain the same data,
+while the second reports that they do not. Which you prefer is left as
+an exercise to the reader.
+
+=head2 How do I find the first array element for which a condition is true?
+
+To find the first array element which satisfies a condition, you can
+use the C<first()> function in the C<List::Util> module, which comes
+with Perl 5.8. This example finds the first element that contains
+"Perl".
+
+ use List::Util qw(first);
+
+ my $element = first { /Perl/ } @array;
+
+If you cannot use C<List::Util>, you can make your own loop to do the
+same thing. Once you find the element, you stop the loop with last.
+
+ my $found;
+ foreach ( @array ) {
+ if( /Perl/ ) { $found = $_; last }
+ }
+
+If you want the array index, you can iterate through the indices
+and check the array element at each index until you find one
+that satisfies the condition.
+
+ my( $found, $index ) = ( undef, -1 );
+ for( $i = 0; $i < @array; $i++ ) {
+ if( $array[$i] =~ /Perl/ ) {
+ $found = $array[$i];
+ $index = $i;
+ last;
+ }
+ }
+
+=head2 How do I handle linked lists?
+
+In general, you usually don't need a linked list in Perl, since with
+regular arrays, you can push and pop or shift and unshift at either
+end, or you can use splice to add and/or remove arbitrary number of
+elements at arbitrary points. Both pop and shift are O(1)
+operations on Perl's dynamic arrays. In the absence of shifts and
+pops, push in general needs to reallocate on the order every log(N)
+times, and unshift will need to copy pointers each time.
+
+If you really, really wanted, you could use structures as described in
+L<perldsc> or L<perltoot> and do just what the algorithm book tells
+you to do. For example, imagine a list node like this:
+
+ $node = {
+ VALUE => 42,
+ LINK => undef,
+ };
+
+You could walk the list this way:
+
+ print "List: ";
+ for ($node = $head; $node; $node = $node->{LINK}) {
+ print $node->{VALUE}, " ";
+ }
+ print "\n";
+
+You could add to the list this way:
+
+ my ($head, $tail);
+ $tail = append($head, 1); # grow a new head
+ for $value ( 2 .. 10 ) {
+ $tail = append($tail, $value);
+ }
+
+ sub append {
+ my($list, $value) = @_;
+ my $node = { VALUE => $value };
+ if ($list) {
+ $node->{LINK} = $list->{LINK};
+ $list->{LINK} = $node;
+ }
+ else {
+ $_[0] = $node; # replace caller's version
+ }
+ return $node;
+ }
+
+But again, Perl's built-in are virtually always good enough.
+
+=head2 How do I handle circular lists?
+X<circular> X<array> X<Tie::Cycle> X<Array::Iterator::Circular>
+X<cycle> X<modulus>
+
+(contributed by brian d foy)
+
+If you want to cycle through an array endlessy, you can increment the
+index modulo the number of elements in the array:
+
+ my @array = qw( a b c );
+ my $i = 0;
+
+ while( 1 ) {
+ print $array[ $i++ % @array ], "\n";
+ last if $i > 20;
+ }
+
+You can also use C<Tie::Cycle> to use a scalar that always has the
+next element of the circular array:
+
+ use Tie::Cycle;
+
+ tie my $cycle, 'Tie::Cycle', [ qw( FFFFFF 000000 FFFF00 ) ];
+
+ print $cycle; # FFFFFF
+ print $cycle; # 000000
+ print $cycle; # FFFF00
+
+The C<Array::Iterator::Circular> creates an iterator object for
+circular arrays:
+
+ use Array::Iterator::Circular;
+
+ my $color_iterator = Array::Iterator::Circular->new(
+ qw(red green blue orange)
+ );
+
+ foreach ( 1 .. 20 ) {
+ print $color_iterator->next, "\n";
+ }
+
+=head2 How do I shuffle an array randomly?
+
+If you either have Perl 5.8.0 or later installed, or if you have
+Scalar-List-Utils 1.03 or later installed, you can say:
+
+ use List::Util 'shuffle';
+
+ @shuffled = shuffle(@list);
+
+If not, you can use a Fisher-Yates shuffle.
+
+ sub fisher_yates_shuffle {
+ my $deck = shift; # $deck is a reference to an array
+ return unless @$deck; # must not be empty!
+
+ my $i = @$deck;
+ while (--$i) {
+ my $j = int rand ($i+1);
+ @$deck[$i,$j] = @$deck[$j,$i];
+ }
+ }
+
+ # shuffle my mpeg collection
+ #
+ my @mpeg = <audio/*/*.mp3>;
+ fisher_yates_shuffle( \@mpeg ); # randomize @mpeg in place
+ print @mpeg;
+
+Note that the above implementation shuffles an array in place,
+unlike the C<List::Util::shuffle()> which takes a list and returns
+a new shuffled list.
+
+You've probably seen shuffling algorithms that work using splice,
+randomly picking another element to swap the current element with
+
+ srand;
+ @new = ();
+ @old = 1 .. 10; # just a demo
+ while (@old) {
+ push(@new, splice(@old, rand @old, 1));
+ }
+
+This is bad because splice is already O(N), and since you do it N
+times, you just invented a quadratic algorithm; that is, O(N**2).
+This does not scale, although Perl is so efficient that you probably
+won't notice this until you have rather largish arrays.
+
+=head2 How do I process/modify each element of an array?
+
+Use C<for>/C<foreach>:
+
+ for (@lines) {
+ s/foo/bar/; # change that word
+ tr/XZ/ZX/; # swap those letters
+ }
+
+Here's another; let's compute spherical volumes:
+
+ for (@volumes = @radii) { # @volumes has changed parts
+ $_ **= 3;
+ $_ *= (4/3) * 3.14159; # this will be constant folded
+ }
+
+which can also be done with C<map()> which is made to transform
+one list into another:
+
+ @volumes = map {$_ ** 3 * (4/3) * 3.14159} @radii;
+
+If you want to do the same thing to modify the values of the
+hash, you can use the C<values> function. As of Perl 5.6
+the values are not copied, so if you modify $orbit (in this
+case), you modify the value.
+
+ for $orbit ( values %orbits ) {
+ ($orbit **= 3) *= (4/3) * 3.14159;
+ }
+
+Prior to perl 5.6 C<values> returned copies of the values,
+so older perl code often contains constructions such as
+C<@orbits{keys %orbits}> instead of C<values %orbits> where
+the hash is to be modified.
+
+=head2 How do I select a random element from an array?
+
+Use the C<rand()> function (see L<perlfunc/rand>):
+
+ $index = rand @array;
+ $element = $array[$index];
+
+Or, simply:
+
+ my $element = $array[ rand @array ];
+
+=head2 How do I permute N elements of a list?
+X<List::Permuter> X<permute> X<Algorithm::Loops> X<Knuth>
+X<The Art of Computer Programming> X<Fischer-Krause>
+
+Use the C<List::Permutor> module on CPAN. If the list is actually an
+array, try the C<Algorithm::Permute> module (also on CPAN). It's
+written in XS code and is very efficient:
+
+ use Algorithm::Permute;
+
+ my @array = 'a'..'d';
+ my $p_iterator = Algorithm::Permute->new ( \@array );
+
+ while (my @perm = $p_iterator->next) {
+ print "next permutation: (@perm)\n";
+ }
+
+For even faster execution, you could do:
+
+ use Algorithm::Permute;
+
+ my @array = 'a'..'d';
+
+ Algorithm::Permute::permute {
+ print "next permutation: (@array)\n";
+ } @array;
+
+Here's a little program that generates all permutations of all the
+words on each line of input. The algorithm embodied in the
+C<permute()> function is discussed in Volume 4 (still unpublished) of
+Knuth's I<The Art of Computer Programming> and will work on any list:
+
+ #!/usr/bin/perl -n
+ # Fischer-Krause ordered permutation generator
+
+ sub permute (&@) {
+ my $code = shift;
+ my @idx = 0..$#_;
+ while ( $code->(@_[@idx]) ) {
+ my $p = $#idx;
+ --$p while $idx[$p-1] > $idx[$p];
+ my $q = $p or return;
+ push @idx, reverse splice @idx, $p;
+ ++$q while $idx[$p-1] > $idx[$q];
+ @idx[$p-1,$q]=@idx[$q,$p-1];
+ }
+ }
+
+ permute { print "@_\n" } split;
+
+The C<Algorithm::Loops> module also provides the C<NextPermute> and
+C<NextPermuteNum> functions which efficiently find all unique permutations
+of an array, even if it contains duplicate values, modifying it in-place:
+if its elements are in reverse-sorted order then the array is reversed,
+making it sorted, and it returns false; otherwise the next
+permutation is returned.
+
+C<NextPermute> uses string order and C<NextPermuteNum> numeric order, so
+you can enumerate all the permutations of C<0..9> like this:
+
+ use Algorithm::Loops qw(NextPermuteNum);
+
+ my @list= 0..9;
+ do { print "@list\n" } while NextPermuteNum @list;
+
+=head2 How do I sort an array by (anything)?
+
+Supply a comparison function to sort() (described in L<perlfunc/sort>):
+
+ @list = sort { $a <=> $b } @list;
+
+The default sort function is cmp, string comparison, which would
+sort C<(1, 2, 10)> into C<(1, 10, 2)>. C<< <=> >>, used above, is
+the numerical comparison operator.
+
+If you have a complicated function needed to pull out the part you
+want to sort on, then don't do it inside the sort function. Pull it
+out first, because the sort BLOCK can be called many times for the
+same element. Here's an example of how to pull out the first word
+after the first number on each item, and then sort those words
+case-insensitively.
+
+ @idx = ();
+ for (@data) {
+ ($item) = /\d+\s*(\S+)/;
+ push @idx, uc($item);
+ }
+ @sorted = @data[ sort { $idx[$a] cmp $idx[$b] } 0 .. $#idx ];
+
+which could also be written this way, using a trick
+that's come to be known as the Schwartzian Transform:
+
+ @sorted = map { $_->[0] }
+ sort { $a->[1] cmp $b->[1] }
+ map { [ $_, uc( (/\d+\s*(\S+)/)[0]) ] } @data;
+
+If you need to sort on several fields, the following paradigm is useful.
+
+ @sorted = sort {
+ field1($a) <=> field1($b) ||
+ field2($a) cmp field2($b) ||
+ field3($a) cmp field3($b)
+ } @data;
+
+This can be conveniently combined with precalculation of keys as given
+above.
+
+See the F<sort> article in the "Far More Than You Ever Wanted
+To Know" collection in http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz for
+more about this approach.
+
+See also the question later in L<perlfaq4> on sorting hashes.
+
+=head2 How do I manipulate arrays of bits?
+
+Use C<pack()> and C<unpack()>, or else C<vec()> and the bitwise
+operations.
+
+For example, you don't have to store individual bits in an array
+(which would mean that you're wasting a lot of space). To convert an
+array of bits to a string, use C<vec()> to set the right bits. This
+sets C<$vec> to have bit N set only if C<$ints[N]> was set:
+
+ @ints = (...); # array of bits, e.g. ( 1, 0, 0, 1, 1, 0 ... )
+ $vec = '';
+ foreach( 0 .. $#ints ) {
+ vec($vec,$_,1) = 1 if $ints[$_];
+ }
+
+The string C<$vec> only takes up as many bits as it needs. For
+instance, if you had 16 entries in C<@ints>, C<$vec> only needs two
+bytes to store them (not counting the scalar variable overhead).
+
+Here's how, given a vector in C<$vec>, you can get those bits into
+your C<@ints> array:
+
+ sub bitvec_to_list {
+ my $vec = shift;
+ my @ints;
+ # Find null-byte density then select best algorithm
+ if ($vec =~ tr/\0// / length $vec > 0.95) {
+ use integer;
+ my $i;
+
+ # This method is faster with mostly null-bytes
+ while($vec =~ /[^\0]/g ) {
+ $i = -9 + 8 * pos $vec;
+ push @ints, $i if vec($vec, ++$i, 1);
+ push @ints, $i if vec($vec, ++$i, 1);
+ push @ints, $i if vec($vec, ++$i, 1);
+ push @ints, $i if vec($vec, ++$i, 1);
+ push @ints, $i if vec($vec, ++$i, 1);
+ push @ints, $i if vec($vec, ++$i, 1);
+ push @ints, $i if vec($vec, ++$i, 1);
+ push @ints, $i if vec($vec, ++$i, 1);
+ }
+ }
+ else {
+ # This method is a fast general algorithm
+ use integer;
+ my $bits = unpack "b*", $vec;
+ push @ints, 0 if $bits =~ s/^(\d)// && $1;
+ push @ints, pos $bits while($bits =~ /1/g);
+ }
+
+ return \@ints;
+ }
+
+This method gets faster the more sparse the bit vector is.
+(Courtesy of Tim Bunce and Winfried Koenig.)
+
+You can make the while loop a lot shorter with this suggestion
+from Benjamin Goldberg:
+
+ while($vec =~ /[^\0]+/g ) {
+ push @ints, grep vec($vec, $_, 1), $-[0] * 8 .. $+[0] * 8;
+ }
+
+Or use the CPAN module C<Bit::Vector>:
+
+ $vector = Bit::Vector->new($num_of_bits);
+ $vector->Index_List_Store(@ints);
+ @ints = $vector->Index_List_Read();
+
+C<Bit::Vector> provides efficient methods for bit vector, sets of
+small integers and "big int" math.
+
+Here's a more extensive illustration using vec():
+
+ # vec demo
+ $vector = "\xff\x0f\xef\xfe";
+ print "Ilya's string \\xff\\x0f\\xef\\xfe represents the number ",
+ unpack("N", $vector), "\n";
+ $is_set = vec($vector, 23, 1);
+ print "Its 23rd bit is ", $is_set ? "set" : "clear", ".\n";
+ pvec($vector);
+
+ set_vec(1,1,1);
+ set_vec(3,1,1);
+ set_vec(23,1,1);
+
+ set_vec(3,1,3);
+ set_vec(3,2,3);
+ set_vec(3,4,3);
+ set_vec(3,4,7);
+ set_vec(3,8,3);
+ set_vec(3,8,7);
+
+ set_vec(0,32,17);
+ set_vec(1,32,17);
+
+ sub set_vec {
+ my ($offset, $width, $value) = @_;
+ my $vector = '';
+ vec($vector, $offset, $width) = $value;
+ print "offset=$offset width=$width value=$value\n";
+ pvec($vector);
+ }
+
+ sub pvec {
+ my $vector = shift;
+ my $bits = unpack("b*", $vector);
+ my $i = 0;
+ my $BASE = 8;
+
+ print "vector length in bytes: ", length($vector), "\n";
+ @bytes = unpack("A8" x length($vector), $bits);
+ print "bits are: @bytes\n\n";
+ }
+
+=head2 Why does defined() return true on empty arrays and hashes?
+
+The short story is that you should probably only use defined on scalars or
+functions, not on aggregates (arrays and hashes). See L<perlfunc/defined>
+in the 5.004 release or later of Perl for more detail.
+
+=head1 Data: Hashes (Associative Arrays)
+
+=head2 How do I process an entire hash?
+
+(contributed by brian d foy)
+
+There are a couple of ways that you can process an entire hash. You
+can get a list of keys, then go through each key, or grab a one
+key-value pair at a time.
+
+To go through all of the keys, use the C<keys> function. This extracts
+all of the keys of the hash and gives them back to you as a list. You
+can then get the value through the particular key you're processing:
+
+ foreach my $key ( keys %hash ) {
+ my $value = $hash{$key}
+ ...
+ }
+
+Once you have the list of keys, you can process that list before you
+process the hash elements. For instance, you can sort the keys so you
+can process them in lexical order:
+
+ foreach my $key ( sort keys %hash ) {
+ my $value = $hash{$key}
+ ...
+ }
+
+Or, you might want to only process some of the items. If you only want
+to deal with the keys that start with C<text:>, you can select just
+those using C<grep>:
+
+ foreach my $key ( grep /^text:/, keys %hash ) {
+ my $value = $hash{$key}
+ ...
+ }
+
+If the hash is very large, you might not want to create a long list of
+keys. To save some memory, you can grab one key-value pair at a time using
+C<each()>, which returns a pair you haven't seen yet:
+
+ while( my( $key, $value ) = each( %hash ) ) {
+ ...
+ }
+
+The C<each> operator returns the pairs in apparently random order, so if
+ordering matters to you, you'll have to stick with the C<keys> method.
+
+The C<each()> operator can be a bit tricky though. You can't add or
+delete keys of the hash while you're using it without possibly
+skipping or re-processing some pairs after Perl internally rehashes
+all of the elements. Additionally, a hash has only one iterator, so if
+you use C<keys>, C<values>, or C<each> on the same hash, you can reset
+the iterator and mess up your processing. See the C<each> entry in
+L<perlfunc> for more details.
+
+=head2 How do I merge two hashes?
+X<hash> X<merge> X<slice, hash>
+
+(contributed by brian d foy)
+
+Before you decide to merge two hashes, you have to decide what to do
+if both hashes contain keys that are the same and if you want to leave
+the original hashes as they were.
+
+If you want to preserve the original hashes, copy one hash (C<%hash1>)
+to a new hash (C<%new_hash>), then add the keys from the other hash
+(C<%hash2> to the new hash. Checking that the key already exists in
+C<%new_hash> gives you a chance to decide what to do with the
+duplicates:
+
+ my %new_hash = %hash1; # make a copy; leave %hash1 alone
+
+ foreach my $key2 ( keys %hash2 )
+ {
+ if( exists $new_hash{$key2} )
+ {
+ warn "Key [$key2] is in both hashes!";
+ # handle the duplicate (perhaps only warning)
+ ...
+ next;
+ }
+ else
+ {
+ $new_hash{$key2} = $hash2{$key2};
+ }
+ }
+
+If you don't want to create a new hash, you can still use this looping
+technique; just change the C<%new_hash> to C<%hash1>.
+
+ foreach my $key2 ( keys %hash2 )
+ {
+ if( exists $hash1{$key2} )
+ {
+ warn "Key [$key2] is in both hashes!";
+ # handle the duplicate (perhaps only warning)
+ ...
+ next;
+ }
+ else
+ {
+ $hash1{$key2} = $hash2{$key2};
+ }
+ }
+
+If you don't care that one hash overwrites keys and values from the other, you
+could just use a hash slice to add one hash to another. In this case, values
+from C<%hash2> replace values from C<%hash1> when they have keys in common:
+
+ @hash1{ keys %hash2 } = values %hash2;
+
+=head2 What happens if I add or remove keys from a hash while iterating over it?
+
+(contributed by brian d foy)
+
+The easy answer is "Don't do that!"
+
+If you iterate through the hash with each(), you can delete the key
+most recently returned without worrying about it. If you delete or add
+other keys, the iterator may skip or double up on them since perl
+may rearrange the hash table. See the
+entry for C<each()> in L<perlfunc>.
+
+=head2 How do I look up a hash element by value?
+
+Create a reverse hash:
+
+ %by_value = reverse %by_key;
+ $key = $by_value{$value};
+
+That's not particularly efficient. It would be more space-efficient
+to use:
+
+ while (($key, $value) = each %by_key) {
+ $by_value{$value} = $key;
+ }
+
+If your hash could have repeated values, the methods above will only find
+one of the associated keys. This may or may not worry you. If it does
+worry you, you can always reverse the hash into a hash of arrays instead:
+
+ while (($key, $value) = each %by_key) {
+ push @{$key_list_by_value{$value}}, $key;
+ }
+
+=head2 How can I know how many entries are in a hash?
+
+(contributed by brian d foy)
+
+This is very similar to "How do I process an entire hash?", also in
+L<perlfaq4>, but a bit simpler in the common cases.
+
+You can use the C<keys()> built-in function in scalar context to find out
+have many entries you have in a hash:
+
+ my $key_count = keys %hash; # must be scalar context!
+
+If you want to find out how many entries have a defined value, that's
+a bit different. You have to check each value. A C<grep> is handy:
+
+ my $defined_value_count = grep { defined } values %hash;
+
+You can use that same structure to count the entries any way that
+you like. If you want the count of the keys with vowels in them,
+you just test for that instead:
+
+ my $vowel_count = grep { /[aeiou]/ } keys %hash;
+
+The C<grep> in scalar context returns the count. If you want the list
+of matching items, just use it in list context instead:
+
+ my @defined_values = grep { defined } values %hash;
+
+The C<keys()> function also resets the iterator, which means that you may
+see strange results if you use this between uses of other hash operators
+such as C<each()>.
+
+=head2 How do I sort a hash (optionally by value instead of key)?
+
+(contributed by brian d foy)
+
+To sort a hash, start with the keys. In this example, we give the list of
+keys to the sort function which then compares them ASCIIbetically (which
+might be affected by your locale settings). The output list has the keys
+in ASCIIbetical order. Once we have the keys, we can go through them to
+create a report which lists the keys in ASCIIbetical order.
+
+ my @keys = sort { $a cmp $b } keys %hash;
+
+ foreach my $key ( @keys )
+ {
+ printf "%-20s %6d\n", $key, $hash{$key};
+ }
+
+We could get more fancy in the C<sort()> block though. Instead of
+comparing the keys, we can compute a value with them and use that
+value as the comparison.
+
+For instance, to make our report order case-insensitive, we use
+the C<\L> sequence in a double-quoted string to make everything
+lowercase. The C<sort()> block then compares the lowercased
+values to determine in which order to put the keys.
+
+ my @keys = sort { "\L$a" cmp "\L$b" } keys %hash;
+
+Note: if the computation is expensive or the hash has many elements,
+you may want to look at the Schwartzian Transform to cache the
+computation results.
+
+If we want to sort by the hash value instead, we use the hash key
+to look it up. We still get out a list of keys, but this time they
+are ordered by their value.
+
+ my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;
+
+From there we can get more complex. If the hash values are the same,
+we can provide a secondary sort on the hash key.
+
+ my @keys = sort {
+ $hash{$a} <=> $hash{$b}
+ or
+ "\L$a" cmp "\L$b"
+ } keys %hash;
+
+=head2 How can I always keep my hash sorted?
+X<hash tie sort DB_File Tie::IxHash>
+
+You can look into using the C<DB_File> module and C<tie()> using the
+C<$DB_BTREE> hash bindings as documented in L<DB_File/"In Memory
+Databases">. The C<Tie::IxHash> module from CPAN might also be
+instructive. Although this does keep your hash sorted, you might not
+like the slow down you suffer from the tie interface. Are you sure you
+need to do this? :)
+
+=head2 What's the difference between "delete" and "undef" with hashes?
+
+Hashes contain pairs of scalars: the first is the key, the
+second is the value. The key will be coerced to a string,
+although the value can be any kind of scalar: string,
+number, or reference. If a key C<$key> is present in
+%hash, C<exists($hash{$key})> will return true. The value
+for a given key can be C<undef>, in which case
+C<$hash{$key}> will be C<undef> while C<exists $hash{$key}>
+will return true. This corresponds to (C<$key>, C<undef>)
+being in the hash.
+
+Pictures help... here's the C<%hash> table:
+
+ keys values
+ +------+------+
+ | a | 3 |
+ | x | 7 |
+ | d | 0 |
+ | e | 2 |
+ +------+------+
+
+And these conditions hold
+
+ $hash{'a'} is true
+ $hash{'d'} is false
+ defined $hash{'d'} is true
+ defined $hash{'a'} is true
+ exists $hash{'a'} is true (Perl 5 only)
+ grep ($_ eq 'a', keys %hash) is true
+
+If you now say
+
+ undef $hash{'a'}
+
+your table now reads:
+
+
+ keys values
+ +------+------+
+ | a | undef|
+ | x | 7 |
+ | d | 0 |
+ | e | 2 |
+ +------+------+
+
+and these conditions now hold; changes in caps:
+
+ $hash{'a'} is FALSE
+ $hash{'d'} is false
+ defined $hash{'d'} is true
+ defined $hash{'a'} is FALSE
+ exists $hash{'a'} is true (Perl 5 only)
+ grep ($_ eq 'a', keys %hash) is true
+
+Notice the last two: you have an undef value, but a defined key!
+
+Now, consider this:
+
+ delete $hash{'a'}
+
+your table now reads:
+
+ keys values
+ +------+------+
+ | x | 7 |
+ | d | 0 |
+ | e | 2 |
+ +------+------+
+
+and these conditions now hold; changes in caps:
+
+ $hash{'a'} is false
+ $hash{'d'} is false
+ defined $hash{'d'} is true
+ defined $hash{'a'} is false
+ exists $hash{'a'} is FALSE (Perl 5 only)
+ grep ($_ eq 'a', keys %hash) is FALSE
+
+See, the whole entry is gone!
+
+=head2 Why don't my tied hashes make the defined/exists distinction?
+
+This depends on the tied hash's implementation of EXISTS().
+For example, there isn't the concept of undef with hashes
+that are tied to DBM* files. It also means that exists() and
+defined() do the same thing with a DBM* file, and what they
+end up doing is not what they do with ordinary hashes.
+
+=head2 How do I reset an each() operation part-way through?
+
+(contributed by brian d foy)
+
+You can use the C<keys> or C<values> functions to reset C<each>. To
+simply reset the iterator used by C<each> without doing anything else,
+use one of them in void context:
+
+ keys %hash; # resets iterator, nothing else.
+ values %hash; # resets iterator, nothing else.
+
+See the documentation for C<each> in L<perlfunc>.
+
+=head2 How can I get the unique keys from two hashes?
+
+First you extract the keys from the hashes into lists, then solve
+the "removing duplicates" problem described above. For example:
+
+ %seen = ();
+ for $element (keys(%foo), keys(%bar)) {
+ $seen{$element}++;
+ }
+ @uniq = keys %seen;
+
+Or more succinctly:
+
+ @uniq = keys %{{%foo,%bar}};
+
+Or if you really want to save space:
+
+ %seen = ();
+ while (defined ($key = each %foo)) {
+ $seen{$key}++;
+ }
+ while (defined ($key = each %bar)) {
+ $seen{$key}++;
+ }
+ @uniq = keys %seen;
+
+=head2 How can I store a multidimensional array in a DBM file?
+
+Either stringify the structure yourself (no fun), or else
+get the MLDBM (which uses Data::Dumper) module from CPAN and layer
+it on top of either DB_File or GDBM_File.
+
+=head2 How can I make my hash remember the order I put elements into it?
+
+Use the C<Tie::IxHash> from CPAN.
+
+ use Tie::IxHash;
+
+ tie my %myhash, 'Tie::IxHash';
+
+ for (my $i=0; $i<20; $i++) {
+ $myhash{$i} = 2*$i;
+ }
+
+ my @keys = keys %myhash;
+ # @keys = (0,1,2,3,...)
+
+=head2 Why does passing a subroutine an undefined element in a hash create it?
+
+(contributed by brian d foy)
+
+Are you using a really old version of Perl?
+
+Normally, accessing a hash key's value for a nonexistent key will
+I<not> create the key.
+
+ my %hash = ();
+ my $value = $hash{ 'foo' };
+ print "This won't print\n" if exists $hash{ 'foo' };
+
+Passing C<$hash{ 'foo' }> to a subroutine used to be a special case, though.
+Since you could assign directly to C<$_[0]>, Perl had to be ready to
+make that assignment so it created the hash key ahead of time:
+
+ my_sub( $hash{ 'foo' } );
+ print "This will print before 5.004\n" if exists $hash{ 'foo' };
+
+ sub my_sub {
+ # $_[0] = 'bar'; # create hash key in case you do this
+ 1;
+ }
+
+Since Perl 5.004, however, this situation is a special case and Perl
+creates the hash key only when you make the assignment:
+
+ my_sub( $hash{ 'foo' } );
+ print "This will print, even after 5.004\n" if exists $hash{ 'foo' };
+
+ sub my_sub {
+ $_[0] = 'bar';
+ }
+
+However, if you want the old behavior (and think carefully about that
+because it's a weird side effect), you can pass a hash slice instead.
+Perl 5.004 didn't make this a special case:
+
+ my_sub( @hash{ qw/foo/ } );
+
+=head2 How can I make the Perl equivalent of a C structure/C++ class/hash or array of hashes or arrays?
+
+Usually a hash ref, perhaps like this:
+
+ $record = {
+ NAME => "Jason",
+ EMPNO => 132,
+ TITLE => "deputy peon",
+ AGE => 23,
+ SALARY => 37_000,
+ PALS => [ "Norbert", "Rhys", "Phineas"],
+ };
+
+References are documented in L<perlref> and the upcoming L<perlreftut>.
+Examples of complex data structures are given in L<perldsc> and
+L<perllol>. Examples of structures and object-oriented classes are
+in L<perltoot>.
+
+=head2 How can I use a reference as a hash key?
+
+(contributed by brian d foy and Ben Morrow)
+
+Hash keys are strings, so you can't really use a reference as the key.
+When you try to do that, perl turns the reference into its stringified
+form (for instance, C<HASH(0xDEADBEEF)>). From there you can't get
+back the reference from the stringified form, at least without doing
+some extra work on your own.
+
+Remember that the entry in the hash will still be there even if
+the referenced variable goes out of scope, and that it is entirely
+possible for Perl to subsequently allocate a different variable at
+the same address. This will mean a new variable might accidentally
+be associated with the value for an old.
+
+If you have Perl 5.10 or later, and you just want to store a value
+against the reference for lookup later, you can use the core
+Hash::Util::Fieldhash module. This will also handle renaming the
+keys if you use multiple threads (which causes all variables to be
+reallocated at new addresses, changing their stringification), and
+garbage-collecting the entries when the referenced variable goes out
+of scope.
+
+If you actually need to be able to get a real reference back from
+each hash entry, you can use the Tie::RefHash module, which does the
+required work for you.
+
+=head1 Data: Misc
+
+=head2 How do I handle binary data correctly?
+
+Perl is binary clean, so it can handle binary data just fine.
+On Windows or DOS, however, you have to use C<binmode> for binary
+files to avoid conversions for line endings. In general, you should
+use C<binmode> any time you want to work with binary data.
+
+Also see L<perlfunc/"binmode"> or L<perlopentut>.
+
+If you're concerned about 8-bit textual data then see L<perllocale>.
+If you want to deal with multibyte characters, however, there are
+some gotchas. See the section on Regular Expressions.
+
+=head2 How do I determine whether a scalar is a number/whole/integer/float?
+
+Assuming that you don't care about IEEE notations like "NaN" or
+"Infinity", you probably just want to use a regular expression.
+
+ if (/\D/) { print "has nondigits\n" }
+ if (/^\d+$/) { print "is a whole number\n" }
+ if (/^-?\d+$/) { print "is an integer\n" }
+ if (/^[+-]?\d+$/) { print "is a +/- integer\n" }
+ if (/^-?\d+\.?\d*$/) { print "is a real number\n" }
+ if (/^-?(?:\d+(?:\.\d*)?|\.\d+)$/) { print "is a decimal number\n" }
+ if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
+ { print "a C float\n" }
+
+There are also some commonly used modules for the task.
+L<Scalar::Util> (distributed with 5.8) provides access to perl's
+internal function C<looks_like_number> for determining whether a
+variable looks like a number. L<Data::Types> exports functions that
+validate data types using both the above and other regular
+expressions. Thirdly, there is C<Regexp::Common> which has regular
+expressions to match various types of numbers. Those three modules are
+available from the CPAN.
+
+If you're on a POSIX system, Perl supports the C<POSIX::strtod>
+function. Its semantics are somewhat cumbersome, so here's a
+C<getnum> wrapper function for more convenient access. This function
+takes a string and returns the number it found, or C<undef> for input
+that isn't a C float. The C<is_numeric> function is a front end to
+C<getnum> if you just want to say, "Is this a float?"
+
+ sub getnum {
+ use POSIX qw(strtod);
+ my $str = shift;
+ $str =~ s/^\s+//;
+ $str =~ s/\s+$//;
+ $! = 0;
+ my($num, $unparsed) = strtod($str);
+ if (($str eq '') || ($unparsed != 0) || $!) {
+ return undef;
+ }
+ else {
+ return $num;
+ }
+ }
+
+ sub is_numeric { defined getnum($_[0]) }
+
+Or you could check out the L<String::Scanf> module on the CPAN
+instead. The C<POSIX> module (part of the standard Perl distribution)
+provides the C<strtod> and C<strtol> for converting strings to double
+and longs, respectively.
+
+=head2 How do I keep persistent data across program calls?
+
+For some specific applications, you can use one of the DBM modules.
+See L<AnyDBM_File>. More generically, you should consult the C<FreezeThaw>
+or C<Storable> modules from CPAN. Starting from Perl 5.8 C<Storable> is part
+of the standard distribution. Here's one example using C<Storable>'s C<store>
+and C<retrieve> functions:
+
+ use Storable;
+ store(\%hash, "filename");
+
+ # later on...
+ $href = retrieve("filename"); # by ref
+ %hash = %{ retrieve("filename") }; # direct to hash
+
+=head2 How do I print out or copy a recursive data structure?
+
+The C<Data::Dumper> module on CPAN (or the 5.005 release of Perl) is great
+for printing out data structures. The C<Storable> module on CPAN (or the
+5.8 release of Perl), provides a function called C<dclone> that recursively
+copies its argument.
+
+ use Storable qw(dclone);
+ $r2 = dclone($r1);
+
+Where C<$r1> can be a reference to any kind of data structure you'd like.
+It will be deeply copied. Because C<dclone> takes and returns references,
+you'd have to add extra punctuation if you had a hash of arrays that
+you wanted to copy.
+
+ %newhash = %{ dclone(\%oldhash) };
+
+=head2 How do I define methods for every class/object?
+
+(contributed by Ben Morrow)
+
+You can use the C<UNIVERSAL> class (see L<UNIVERSAL>). However, please
+be very careful to consider the consequences of doing this: adding
+methods to every object is very likely to have unintended
+consequences. If possible, it would be better to have all your object
+inherit from some common base class, or to use an object system like
+Moose that supports roles.
+
+=head2 How do I verify a credit card checksum?
+
+Get the C<Business::CreditCard> module from CPAN.
+
+=head2 How do I pack arrays of doubles or floats for XS code?
+
+The arrays.h/arrays.c code in the C<PGPLOT> module on CPAN does just this.
+If you're doing a lot of float or double processing, consider using
+the C<PDL> module from CPAN instead--it makes number-crunching easy.
+
+See L<http://search.cpan.org/dist/PGPLOT> for the code.
+
+=head1 REVISION
+
+Revision: $Revision$
+
+Date: $Date$
+
+See L<perlfaq> for source control details and availability.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2009 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain. You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit. A simple comment in the code giving
+credit would be courteous but is not required.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfaq5.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq5.pod
new file mode 100755
index 00000000000..3e652bd273c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq5.pod
@@ -0,0 +1,1454 @@
+=head1 NAME
+
+perlfaq5 - Files and Formats
+
+=head1 DESCRIPTION
+
+This section deals with I/O and the "f" issues: filehandles, flushing,
+formats, and footers.
+
+=head2 How do I flush/unbuffer an output filehandle? Why must I do this?
+X<flush> X<buffer> X<unbuffer> X<autoflush>
+
+(contributed by brian d foy)
+
+You might like to read Mark Jason Dominus's "Suffering From Buffering"
+at http://perl.plover.com/FAQs/Buffering.html .
+
+Perl normally buffers output so it doesn't make a system call for every
+bit of output. By saving up output, it makes fewer expensive system calls.
+For instance, in this little bit of code, you want to print a dot to the
+screen for every line you process to watch the progress of your program.
+Instead of seeing a dot for every line, Perl buffers the output and you
+have a long wait before you see a row of 50 dots all at once:
+
+ # long wait, then row of dots all at once
+ while( <> ) {
+ print ".";
+ print "\n" unless ++$count % 50;
+
+ #... expensive line processing operations
+ }
+
+To get around this, you have to unbuffer the output filehandle, in this
+case, C<STDOUT>. You can set the special variable C<$|> to a true value
+(mnemonic: making your filehandles "piping hot"):
+
+ $|++;
+
+ # dot shown immediately
+ while( <> ) {
+ print ".";
+ print "\n" unless ++$count % 50;
+
+ #... expensive line processing operations
+ }
+
+The C<$|> is one of the per-filehandle special variables, so each
+filehandle has its own copy of its value. If you want to merge
+standard output and standard error for instance, you have to unbuffer
+each (although STDERR might be unbuffered by default):
+
+ {
+ my $previous_default = select(STDOUT); # save previous default
+ $|++; # autoflush STDOUT
+ select(STDERR);
+ $|++; # autoflush STDERR, to be sure
+ select($previous_default); # restore previous default
+ }
+
+ # now should alternate . and +
+ while( 1 )
+ {
+ sleep 1;
+ print STDOUT ".";
+ print STDERR "+";
+ print STDOUT "\n" unless ++$count % 25;
+ }
+
+Besides the C<$|> special variable, you can use C<binmode> to give
+your filehandle a C<:unix> layer, which is unbuffered:
+
+ binmode( STDOUT, ":unix" );
+
+ while( 1 ) {
+ sleep 1;
+ print ".";
+ print "\n" unless ++$count % 50;
+ }
+
+For more information on output layers, see the entries for C<binmode>
+and C<open> in L<perlfunc>, and the C<PerlIO> module documentation.
+
+If you are using C<IO::Handle> or one of its subclasses, you can
+call the C<autoflush> method to change the settings of the
+filehandle:
+
+ use IO::Handle;
+ open my( $io_fh ), ">", "output.txt";
+ $io_fh->autoflush(1);
+
+The C<IO::Handle> objects also have a C<flush> method. You can flush
+the buffer any time you want without auto-buffering
+
+ $io_fh->flush;
+
+=head2 How do I change, delete, or insert a line in a file, or append to the beginning of a file?
+X<file, editing>
+
+(contributed by brian d foy)
+
+The basic idea of inserting, changing, or deleting a line from a text
+file involves reading and printing the file to the point you want to
+make the change, making the change, then reading and printing the rest
+of the file. Perl doesn't provide random access to lines (especially
+since the record input separator, C<$/>, is mutable), although modules
+such as C<Tie::File> can fake it.
+
+A Perl program to do these tasks takes the basic form of opening a
+file, printing its lines, then closing the file:
+
+ open my $in, '<', $file or die "Can't read old file: $!";
+ open my $out, '>', "$file.new" or die "Can't write new file: $!";
+
+ while( <$in> )
+ {
+ print $out $_;
+ }
+
+ close $out;
+
+Within that basic form, add the parts that you need to insert, change,
+or delete lines.
+
+To prepend lines to the beginning, print those lines before you enter
+the loop that prints the existing lines.
+
+ open my $in, '<', $file or die "Can't read old file: $!";
+ open my $out, '>', "$file.new" or die "Can't write new file: $!";
+
+ print $out "# Add this line to the top\n"; # <--- HERE'S THE MAGIC
+
+ while( <$in> )
+ {
+ print $out $_;
+ }
+
+ close $out;
+
+To change existing lines, insert the code to modify the lines inside
+the C<while> loop. In this case, the code finds all lowercased
+versions of "perl" and uppercases them. The happens for every line, so
+be sure that you're supposed to do that on every line!
+
+ open my $in, '<', $file or die "Can't read old file: $!";
+ open my $out, '>', "$file.new" or die "Can't write new file: $!";
+
+ print $out "# Add this line to the top\n";
+
+ while( <$in> )
+ {
+ s/\b(perl)\b/Perl/g;
+ print $out $_;
+ }
+
+ close $out;
+
+To change only a particular line, the input line number, C<$.>, is
+useful. First read and print the lines up to the one you want to
+change. Next, read the single line you want to change, change it, and
+print it. After that, read the rest of the lines and print those:
+
+ while( <$in> ) # print the lines before the change
+ {
+ print $out $_;
+ last if $. == 4; # line number before change
+ }
+
+ my $line = <$in>;
+ $line =~ s/\b(perl)\b/Perl/g;
+ print $out $line;
+
+ while( <$in> ) # print the rest of the lines
+ {
+ print $out $_;
+ }
+
+To skip lines, use the looping controls. The C<next> in this example
+skips comment lines, and the C<last> stops all processing once it
+encounters either C<__END__> or C<__DATA__>.
+
+ while( <$in> )
+ {
+ next if /^\s+#/; # skip comment lines
+ last if /^__(END|DATA)__$/; # stop at end of code marker
+ print $out $_;
+ }
+
+Do the same sort of thing to delete a particular line by using C<next>
+to skip the lines you don't want to show up in the output. This
+example skips every fifth line:
+
+ while( <$in> )
+ {
+ next unless $. % 5;
+ print $out $_;
+ }
+
+If, for some odd reason, you really want to see the whole file at once
+rather than processing line by line, you can slurp it in (as long as
+you can fit the whole thing in memory!):
+
+ open my $in, '<', $file or die "Can't read old file: $!"
+ open my $out, '>', "$file.new" or die "Can't write new file: $!";
+
+ my @lines = do { local $/; <$in> }; # slurp!
+
+ # do your magic here
+
+ print $out @lines;
+
+Modules such as C<File::Slurp> and C<Tie::File> can help with that
+too. If you can, however, avoid reading the entire file at once. Perl
+won't give that memory back to the operating system until the process
+finishes.
+
+You can also use Perl one-liners to modify a file in-place. The
+following changes all 'Fred' to 'Barney' in F<inFile.txt>, overwriting
+the file with the new contents. With the C<-p> switch, Perl wraps a
+C<while> loop around the code you specify with C<-e>, and C<-i> turns
+on in-place editing. The current line is in C<$_>. With C<-p>, Perl
+automatically prints the value of C<$_> at the end of the loop. See
+L<perlrun> for more details.
+
+ perl -pi -e 's/Fred/Barney/' inFile.txt
+
+To make a backup of C<inFile.txt>, give C<-i> a file extension to add:
+
+ perl -pi.bak -e 's/Fred/Barney/' inFile.txt
+
+To change only the fifth line, you can add a test checking C<$.>, the
+input line number, then only perform the operation when the test
+passes:
+
+ perl -pi -e 's/Fred/Barney/ if $. == 5' inFile.txt
+
+To add lines before a certain line, you can add a line (or lines!)
+before Perl prints C<$_>:
+
+ perl -pi -e 'print "Put before third line\n" if $. == 3' inFile.txt
+
+You can even add a line to the beginning of a file, since the current
+line prints at the end of the loop:
+
+ perl -pi -e 'print "Put before first line\n" if $. == 1' inFile.txt
+
+To insert a line after one already in the file, use the C<-n> switch.
+It's just like C<-p> except that it doesn't print C<$_> at the end of
+the loop, so you have to do that yourself. In this case, print C<$_>
+first, then print the line that you want to add.
+
+ perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt
+
+To delete lines, only print the ones that you want.
+
+ perl -ni -e 'print unless /d/' inFile.txt
+
+ ... or ...
+
+ perl -pi -e 'next unless /d/' inFile.txt
+
+=head2 How do I count the number of lines in a file?
+X<file, counting lines> X<lines> X<line>
+
+One fairly efficient way is to count newlines in the file. The
+following program uses a feature of tr///, as documented in L<perlop>.
+If your text file doesn't end with a newline, then it's not really a
+proper text file, so this may report one fewer line than you expect.
+
+ $lines = 0;
+ open(FILE, $filename) or die "Can't open `$filename': $!";
+ while (sysread FILE, $buffer, 4096) {
+ $lines += ($buffer =~ tr/\n//);
+ }
+ close FILE;
+
+This assumes no funny games with newline translations.
+
+=head2 How can I use Perl's C<-i> option from within a program?
+X<-i> X<in-place>
+
+C<-i> sets the value of Perl's C<$^I> variable, which in turn affects
+the behavior of C<< <> >>; see L<perlrun> for more details. By
+modifying the appropriate variables directly, you can get the same
+behavior within a larger program. For example:
+
+ # ...
+ {
+ local($^I, @ARGV) = ('.orig', glob("*.c"));
+ while (<>) {
+ if ($. == 1) {
+ print "This line should appear at the top of each file\n";
+ }
+ s/\b(p)earl\b/${1}erl/i; # Correct typos, preserving case
+ print;
+ close ARGV if eof; # Reset $.
+ }
+ }
+ # $^I and @ARGV return to their old values here
+
+This block modifies all the C<.c> files in the current directory,
+leaving a backup of the original data from each file in a new
+C<.c.orig> file.
+
+=head2 How can I copy a file?
+X<copy> X<file, copy> X<File::Copy>
+
+(contributed by brian d foy)
+
+Use the C<File::Copy> module. It comes with Perl and can do a
+true copy across file systems, and it does its magic in
+a portable fashion.
+
+ use File::Copy;
+
+ copy( $original, $new_copy ) or die "Copy failed: $!";
+
+If you can't use C<File::Copy>, you'll have to do the work yourself:
+open the original file, open the destination file, then print
+to the destination file as you read the original. You also have to
+remember to copy the permissions, owner, and group to the new file.
+
+=head2 How do I make a temporary file name?
+X<file, temporary>
+
+If you don't need to know the name of the file, you can use C<open()>
+with C<undef> in place of the file name. In Perl 5.8 or later, the
+C<open()> function creates an anonymous temporary file:
+
+ open my $tmp, '+>', undef or die $!;
+
+Otherwise, you can use the File::Temp module.
+
+ use File::Temp qw/ tempfile tempdir /;
+
+ $dir = tempdir( CLEANUP => 1 );
+ ($fh, $filename) = tempfile( DIR => $dir );
+
+ # or if you don't need to know the filename
+
+ $fh = tempfile( DIR => $dir );
+
+The File::Temp has been a standard module since Perl 5.6.1. If you
+don't have a modern enough Perl installed, use the C<new_tmpfile>
+class method from the IO::File module to get a filehandle opened for
+reading and writing. Use it if you don't need to know the file's name:
+
+ use IO::File;
+ $fh = IO::File->new_tmpfile()
+ or die "Unable to make new temporary file: $!";
+
+If you're committed to creating a temporary file by hand, use the
+process ID and/or the current time-value. If you need to have many
+temporary files in one process, use a counter:
+
+ BEGIN {
+ use Fcntl;
+ my $temp_dir = -d '/tmp' ? '/tmp' : $ENV{TMPDIR} || $ENV{TEMP};
+ my $base_name = sprintf "%s/%d-%d-0000", $temp_dir, $$, time;
+
+ sub temp_file {
+ local *FH;
+ my $count = 0;
+ until( defined(fileno(FH)) || $count++ > 100 ) {
+ $base_name =~ s/-(\d+)$/"-" . (1 + $1)/e;
+ # O_EXCL is required for security reasons.
+ sysopen FH, $base_name, O_WRONLY|O_EXCL|O_CREAT;
+ }
+
+ if( defined fileno(FH) ) {
+ return (*FH, $base_name);
+ }
+ else {
+ return ();
+ }
+ }
+
+ }
+
+=head2 How can I manipulate fixed-record-length files?
+X<fixed-length> X<file, fixed-length records>
+
+The most efficient way is using L<pack()|perlfunc/"pack"> and
+L<unpack()|perlfunc/"unpack">. This is faster than using
+L<substr()|perlfunc/"substr"> when taking many, many strings. It is
+slower for just a few.
+
+Here is a sample chunk of code to break up and put back together again
+some fixed-format input lines, in this case from the output of a normal,
+Berkeley-style ps:
+
+ # sample input line:
+ # 15158 p5 T 0:00 perl /home/tchrist/scripts/now-what
+ my $PS_T = 'A6 A4 A7 A5 A*';
+ open my $ps, '-|', 'ps';
+ print scalar <$ps>;
+ my @fields = qw( pid tt stat time command );
+ while (<$ps>) {
+ my %process;
+ @process{@fields} = unpack($PS_T, $_);
+ for my $field ( @fields ) {
+ print "$field: <$process{$field}>\n";
+ }
+ print 'line=', pack($PS_T, @process{@fields} ), "\n";
+ }
+
+We've used a hash slice in order to easily handle the fields of each row.
+Storing the keys in an array means it's easy to operate on them as a
+group or loop over them with for. It also avoids polluting the program
+with global variables and using symbolic references.
+
+=head2 How can I make a filehandle local to a subroutine? How do I pass filehandles between subroutines? How do I make an array of filehandles?
+X<filehandle, local> X<filehandle, passing> X<filehandle, reference>
+
+As of perl5.6, open() autovivifies file and directory handles
+as references if you pass it an uninitialized scalar variable.
+You can then pass these references just like any other scalar,
+and use them in the place of named handles.
+
+ open my $fh, $file_name;
+
+ open local $fh, $file_name;
+
+ print $fh "Hello World!\n";
+
+ process_file( $fh );
+
+If you like, you can store these filehandles in an array or a hash.
+If you access them directly, they aren't simple scalars and you
+need to give C<print> a little help by placing the filehandle
+reference in braces. Perl can only figure it out on its own when
+the filehandle reference is a simple scalar.
+
+ my @fhs = ( $fh1, $fh2, $fh3 );
+
+ for( $i = 0; $i <= $#fhs; $i++ ) {
+ print {$fhs[$i]} "just another Perl answer, \n";
+ }
+
+Before perl5.6, you had to deal with various typeglob idioms
+which you may see in older code.
+
+ open FILE, "> $filename";
+ process_typeglob( *FILE );
+ process_reference( \*FILE );
+
+ sub process_typeglob { local *FH = shift; print FH "Typeglob!" }
+ sub process_reference { local $fh = shift; print $fh "Reference!" }
+
+If you want to create many anonymous handles, you should
+check out the Symbol or IO::Handle modules.
+
+=head2 How can I use a filehandle indirectly?
+X<filehandle, indirect>
+
+An indirect filehandle is using something other than a symbol
+in a place that a filehandle is expected. Here are ways
+to get indirect filehandles:
+
+ $fh = SOME_FH; # bareword is strict-subs hostile
+ $fh = "SOME_FH"; # strict-refs hostile; same package only
+ $fh = *SOME_FH; # typeglob
+ $fh = \*SOME_FH; # ref to typeglob (bless-able)
+ $fh = *SOME_FH{IO}; # blessed IO::Handle from *SOME_FH typeglob
+
+Or, you can use the C<new> method from one of the IO::* modules to
+create an anonymous filehandle, store that in a scalar variable,
+and use it as though it were a normal filehandle.
+
+ use IO::Handle; # 5.004 or higher
+ $fh = IO::Handle->new();
+
+Then use any of those as you would a normal filehandle. Anywhere that
+Perl is expecting a filehandle, an indirect filehandle may be used
+instead. An indirect filehandle is just a scalar variable that contains
+a filehandle. Functions like C<print>, C<open>, C<seek>, or
+the C<< <FH> >> diamond operator will accept either a named filehandle
+or a scalar variable containing one:
+
+ ($ifh, $ofh, $efh) = (*STDIN, *STDOUT, *STDERR);
+ print $ofh "Type it: ";
+ $got = <$ifh>
+ print $efh "What was that: $got";
+
+If you're passing a filehandle to a function, you can write
+the function in two ways:
+
+ sub accept_fh {
+ my $fh = shift;
+ print $fh "Sending to indirect filehandle\n";
+ }
+
+Or it can localize a typeglob and use the filehandle directly:
+
+ sub accept_fh {
+ local *FH = shift;
+ print FH "Sending to localized filehandle\n";
+ }
+
+Both styles work with either objects or typeglobs of real filehandles.
+(They might also work with strings under some circumstances, but this
+is risky.)
+
+ accept_fh(*STDOUT);
+ accept_fh($handle);
+
+In the examples above, we assigned the filehandle to a scalar variable
+before using it. That is because only simple scalar variables, not
+expressions or subscripts of hashes or arrays, can be used with
+built-ins like C<print>, C<printf>, or the diamond operator. Using
+something other than a simple scalar variable as a filehandle is
+illegal and won't even compile:
+
+ @fd = (*STDIN, *STDOUT, *STDERR);
+ print $fd[1] "Type it: "; # WRONG
+ $got = <$fd[0]> # WRONG
+ print $fd[2] "What was that: $got"; # WRONG
+
+With C<print> and C<printf>, you get around this by using a block and
+an expression where you would place the filehandle:
+
+ print { $fd[1] } "funny stuff\n";
+ printf { $fd[1] } "Pity the poor %x.\n", 3_735_928_559;
+ # Pity the poor deadbeef.
+
+That block is a proper block like any other, so you can put more
+complicated code there. This sends the message out to one of two places:
+
+ $ok = -x "/bin/cat";
+ print { $ok ? $fd[1] : $fd[2] } "cat stat $ok\n";
+ print { $fd[ 1+ ($ok || 0) ] } "cat stat $ok\n";
+
+This approach of treating C<print> and C<printf> like object methods
+calls doesn't work for the diamond operator. That's because it's a
+real operator, not just a function with a comma-less argument. Assuming
+you've been storing typeglobs in your structure as we did above, you
+can use the built-in function named C<readline> to read a record just
+as C<< <> >> does. Given the initialization shown above for @fd, this
+would work, but only because readline() requires a typeglob. It doesn't
+work with objects or strings, which might be a bug we haven't fixed yet.
+
+ $got = readline($fd[0]);
+
+Let it be noted that the flakiness of indirect filehandles is not
+related to whether they're strings, typeglobs, objects, or anything else.
+It's the syntax of the fundamental operators. Playing the object
+game doesn't help you at all here.
+
+=head2 How can I set up a footer format to be used with write()?
+X<footer>
+
+There's no builtin way to do this, but L<perlform> has a couple of
+techniques to make it possible for the intrepid hacker.
+
+=head2 How can I write() into a string?
+X<write, into a string>
+
+See L<perlform/"Accessing Formatting Internals"> for an C<swrite()> function.
+
+=head2 How can I open a filehandle to a string?
+X<string> X<open> X<IO::String> X<filehandle>
+
+(contributed by Peter J. Holzer, hjp-usenet2@hjp.at)
+
+Since Perl 5.8.0 a file handle referring to a string can be created by
+calling open with a reference to that string instead of the filename.
+This file handle can then be used to read from or write to the string:
+
+ open(my $fh, '>', \$string) or die "Could not open string for writing";
+ print $fh "foo\n";
+ print $fh "bar\n"; # $string now contains "foo\nbar\n"
+
+ open(my $fh, '<', \$string) or die "Could not open string for reading";
+ my $x = <$fh>; # $x now contains "foo\n"
+
+With older versions of Perl, the C<IO::String> module provides similar
+functionality.
+
+=head2 How can I output my numbers with commas added?
+X<number, commify>
+
+(contributed by brian d foy and Benjamin Goldberg)
+
+You can use L<Number::Format> to separate places in a number.
+It handles locale information for those of you who want to insert
+full stops instead (or anything else that they want to use,
+really).
+
+This subroutine will add commas to your number:
+
+ sub commify {
+ local $_ = shift;
+ 1 while s/^([-+]?\d+)(\d{3})/$1,$2/;
+ return $_;
+ }
+
+This regex from Benjamin Goldberg will add commas to numbers:
+
+ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g;
+
+It is easier to see with comments:
+
+ s/(
+ ^[-+]? # beginning of number.
+ \d+? # first digits before first comma
+ (?= # followed by, (but not included in the match) :
+ (?>(?:\d{3})+) # some positive multiple of three digits.
+ (?!\d) # an *exact* multiple, not x * 3 + 1 or whatever.
+ )
+ | # or:
+ \G\d{3} # after the last group, get three digits
+ (?=\d) # but they have to have more digits after them.
+ )/$1,/xg;
+
+=head2 How can I translate tildes (~) in a filename?
+X<tilde> X<tilde expansion>
+
+Use the E<lt>E<gt> (C<glob()>) operator, documented in L<perlfunc>.
+Versions of Perl older than 5.6 require that you have a shell
+installed that groks tildes. Later versions of Perl have this feature
+built in. The C<File::KGlob> module (available from CPAN) gives more
+portable glob functionality.
+
+Within Perl, you may use this directly:
+
+ $filename =~ s{
+ ^ ~ # find a leading tilde
+ ( # save this in $1
+ [^/] # a non-slash character
+ * # repeated 0 or more times (0 means me)
+ )
+ }{
+ $1
+ ? (getpwnam($1))[7]
+ : ( $ENV{HOME} || $ENV{LOGDIR} )
+ }ex;
+
+=head2 How come when I open a file read-write it wipes it out?
+X<clobber> X<read-write> X<clobbering> X<truncate> X<truncating>
+
+Because you're using something like this, which truncates the file and
+I<then> gives you read-write access:
+
+ open(FH, "+> /path/name"); # WRONG (almost always)
+
+Whoops. You should instead use this, which will fail if the file
+doesn't exist.
+
+ open(FH, "+< /path/name"); # open for update
+
+Using ">" always clobbers or creates. Using "<" never does
+either. The "+" doesn't change this.
+
+Here are examples of many kinds of file opens. Those using sysopen()
+all assume
+
+ use Fcntl;
+
+To open file for reading:
+
+ open(FH, "< $path") || die $!;
+ sysopen(FH, $path, O_RDONLY) || die $!;
+
+To open file for writing, create new file if needed or else truncate old file:
+
+ open(FH, "> $path") || die $!;
+ sysopen(FH, $path, O_WRONLY|O_TRUNC|O_CREAT) || die $!;
+ sysopen(FH, $path, O_WRONLY|O_TRUNC|O_CREAT, 0666) || die $!;
+
+To open file for writing, create new file, file must not exist:
+
+ sysopen(FH, $path, O_WRONLY|O_EXCL|O_CREAT) || die $!;
+ sysopen(FH, $path, O_WRONLY|O_EXCL|O_CREAT, 0666) || die $!;
+
+To open file for appending, create if necessary:
+
+ open(FH, ">> $path") || die $!;
+ sysopen(FH, $path, O_WRONLY|O_APPEND|O_CREAT) || die $!;
+ sysopen(FH, $path, O_WRONLY|O_APPEND|O_CREAT, 0666) || die $!;
+
+To open file for appending, file must exist:
+
+ sysopen(FH, $path, O_WRONLY|O_APPEND) || die $!;
+
+To open file for update, file must exist:
+
+ open(FH, "+< $path") || die $!;
+ sysopen(FH, $path, O_RDWR) || die $!;
+
+To open file for update, create file if necessary:
+
+ sysopen(FH, $path, O_RDWR|O_CREAT) || die $!;
+ sysopen(FH, $path, O_RDWR|O_CREAT, 0666) || die $!;
+
+To open file for update, file must not exist:
+
+ sysopen(FH, $path, O_RDWR|O_EXCL|O_CREAT) || die $!;
+ sysopen(FH, $path, O_RDWR|O_EXCL|O_CREAT, 0666) || die $!;
+
+To open a file without blocking, creating if necessary:
+
+ sysopen(FH, "/foo/somefile", O_WRONLY|O_NDELAY|O_CREAT)
+ or die "can't open /foo/somefile: $!":
+
+Be warned that neither creation nor deletion of files is guaranteed to
+be an atomic operation over NFS. That is, two processes might both
+successfully create or unlink the same file! Therefore O_EXCL
+isn't as exclusive as you might wish.
+
+See also the new L<perlopentut> if you have it (new for 5.6).
+
+=head2 Why do I sometimes get an "Argument list too long" when I use E<lt>*E<gt>?
+X<argument list too long>
+
+The C<< <> >> operator performs a globbing operation (see above).
+In Perl versions earlier than v5.6.0, the internal glob() operator forks
+csh(1) to do the actual glob expansion, but
+csh can't handle more than 127 items and so gives the error message
+C<Argument list too long>. People who installed tcsh as csh won't
+have this problem, but their users may be surprised by it.
+
+To get around this, either upgrade to Perl v5.6.0 or later, do the glob
+yourself with readdir() and patterns, or use a module like File::KGlob,
+one that doesn't use the shell to do globbing.
+
+=head2 Is there a leak/bug in glob()?
+X<glob>
+
+Due to the current implementation on some operating systems, when you
+use the glob() function or its angle-bracket alias in a scalar
+context, you may cause a memory leak and/or unpredictable behavior. It's
+best therefore to use glob() only in list context.
+
+=head2 How can I open a file with a leading ">" or trailing blanks?
+X<filename, special characters>
+
+(contributed by Brian McCauley)
+
+The special two argument form of Perl's open() function ignores
+trailing blanks in filenames and infers the mode from certain leading
+characters (or a trailing "|"). In older versions of Perl this was the
+only version of open() and so it is prevalent in old code and books.
+
+Unless you have a particular reason to use the two argument form you
+should use the three argument form of open() which does not treat any
+characters in the filename as special.
+
+ open FILE, "<", " file "; # filename is " file "
+ open FILE, ">", ">file"; # filename is ">file"
+
+=head2 How can I reliably rename a file?
+X<rename> X<mv> X<move> X<file, rename> X<ren>
+
+If your operating system supports a proper mv(1) utility or its
+functional equivalent, this works:
+
+ rename($old, $new) or system("mv", $old, $new);
+
+It may be more portable to use the File::Copy module instead.
+You just copy to the new file to the new name (checking return
+values), then delete the old one. This isn't really the same
+semantically as a rename(), which preserves meta-information like
+permissions, timestamps, inode info, etc.
+
+Newer versions of File::Copy export a move() function.
+
+=head2 How can I lock a file?
+X<lock> X<file, lock> X<flock>
+
+Perl's builtin flock() function (see L<perlfunc> for details) will call
+flock(2) if that exists, fcntl(2) if it doesn't (on perl version 5.004 and
+later), and lockf(3) if neither of the two previous system calls exists.
+On some systems, it may even use a different form of native locking.
+Here are some gotchas with Perl's flock():
+
+=over 4
+
+=item 1
+
+Produces a fatal error if none of the three system calls (or their
+close equivalent) exists.
+
+=item 2
+
+lockf(3) does not provide shared locking, and requires that the
+filehandle be open for writing (or appending, or read/writing).
+
+=item 3
+
+Some versions of flock() can't lock files over a network (e.g. on NFS file
+systems), so you'd need to force the use of fcntl(2) when you build Perl.
+But even this is dubious at best. See the flock entry of L<perlfunc>
+and the F<INSTALL> file in the source distribution for information on
+building Perl to do this.
+
+Two potentially non-obvious but traditional flock semantics are that
+it waits indefinitely until the lock is granted, and that its locks are
+I<merely advisory>. Such discretionary locks are more flexible, but
+offer fewer guarantees. This means that files locked with flock() may
+be modified by programs that do not also use flock(). Cars that stop
+for red lights get on well with each other, but not with cars that don't
+stop for red lights. See the perlport manpage, your port's specific
+documentation, or your system-specific local manpages for details. It's
+best to assume traditional behavior if you're writing portable programs.
+(If you're not, you should as always feel perfectly free to write
+for your own system's idiosyncrasies (sometimes called "features").
+Slavish adherence to portability concerns shouldn't get in the way of
+your getting your job done.)
+
+For more information on file locking, see also
+L<perlopentut/"File Locking"> if you have it (new for 5.6).
+
+=back
+
+=head2 Why can't I just open(FH, "E<gt>file.lock")?
+X<lock, lockfile race condition>
+
+A common bit of code B<NOT TO USE> is this:
+
+ sleep(3) while -e "file.lock"; # PLEASE DO NOT USE
+ open(LCK, "> file.lock"); # THIS BROKEN CODE
+
+This is a classic race condition: you take two steps to do something
+which must be done in one. That's why computer hardware provides an
+atomic test-and-set instruction. In theory, this "ought" to work:
+
+ sysopen(FH, "file.lock", O_WRONLY|O_EXCL|O_CREAT)
+ or die "can't open file.lock: $!";
+
+except that lamentably, file creation (and deletion) is not atomic
+over NFS, so this won't work (at least, not every time) over the net.
+Various schemes involving link() have been suggested, but
+these tend to involve busy-wait, which is also less than desirable.
+
+=head2 I still don't get locking. I just want to increment the number in the file. How can I do this?
+X<counter> X<file, counter>
+
+Didn't anyone ever tell you web-page hit counters were useless?
+They don't count number of hits, they're a waste of time, and they serve
+only to stroke the writer's vanity. It's better to pick a random number;
+they're more realistic.
+
+Anyway, this is what you can do if you can't help yourself.
+
+ use Fcntl qw(:DEFAULT :flock);
+ sysopen(FH, "numfile", O_RDWR|O_CREAT) or die "can't open numfile: $!";
+ flock(FH, LOCK_EX) or die "can't flock numfile: $!";
+ $num = <FH> || 0;
+ seek(FH, 0, 0) or die "can't rewind numfile: $!";
+ truncate(FH, 0) or die "can't truncate numfile: $!";
+ (print FH $num+1, "\n") or die "can't write numfile: $!";
+ close FH or die "can't close numfile: $!";
+
+Here's a much better web-page hit counter:
+
+ $hits = int( (time() - 850_000_000) / rand(1_000) );
+
+If the count doesn't impress your friends, then the code might. :-)
+
+=head2 All I want to do is append a small amount of text to the end of a file. Do I still have to use locking?
+X<append> X<file, append>
+
+If you are on a system that correctly implements C<flock> and you use
+the example appending code from "perldoc -f flock" everything will be
+OK even if the OS you are on doesn't implement append mode correctly
+(if such a system exists.) So if you are happy to restrict yourself to
+OSs that implement C<flock> (and that's not really much of a
+restriction) then that is what you should do.
+
+If you know you are only going to use a system that does correctly
+implement appending (i.e. not Win32) then you can omit the C<seek>
+from the code in the previous answer.
+
+If you know you are only writing code to run on an OS and filesystem
+that does implement append mode correctly (a local filesystem on a
+modern Unix for example), and you keep the file in block-buffered mode
+and you write less than one buffer-full of output between each manual
+flushing of the buffer then each bufferload is almost guaranteed to be
+written to the end of the file in one chunk without getting
+intermingled with anyone else's output. You can also use the
+C<syswrite> function which is simply a wrapper around your system's
+C<write(2)> system call.
+
+There is still a small theoretical chance that a signal will interrupt
+the system level C<write()> operation before completion. There is also
+a possibility that some STDIO implementations may call multiple system
+level C<write()>s even if the buffer was empty to start. There may be
+some systems where this probability is reduced to zero, and this is
+not a concern when using C<:perlio> instead of your system's STDIO.
+
+=head2 How do I randomly update a binary file?
+X<file, binary patch>
+
+If you're just trying to patch a binary, in many cases something as
+simple as this works:
+
+ perl -i -pe 's{window manager}{window mangler}g' /usr/bin/emacs
+
+However, if you have fixed sized records, then you might do something more
+like this:
+
+ $RECSIZE = 220; # size of record, in bytes
+ $recno = 37; # which record to update
+ open(FH, "+<somewhere") || die "can't update somewhere: $!";
+ seek(FH, $recno * $RECSIZE, 0);
+ read(FH, $record, $RECSIZE) == $RECSIZE || die "can't read record $recno: $!";
+ # munge the record
+ seek(FH, -$RECSIZE, 1);
+ print FH $record;
+ close FH;
+
+Locking and error checking are left as an exercise for the reader.
+Don't forget them or you'll be quite sorry.
+
+=head2 How do I get a file's timestamp in perl?
+X<timestamp> X<file, timestamp>
+
+If you want to retrieve the time at which the file was last
+read, written, or had its meta-data (owner, etc) changed,
+you use the B<-A>, B<-M>, or B<-C> file test operations as
+documented in L<perlfunc>. These retrieve the age of the
+file (measured against the start-time of your program) in
+days as a floating point number. Some platforms may not have
+all of these times. See L<perlport> for details. To
+retrieve the "raw" time in seconds since the epoch, you
+would call the stat function, then use localtime(),
+gmtime(), or POSIX::strftime() to convert this into
+human-readable form.
+
+Here's an example:
+
+ $write_secs = (stat($file))[9];
+ printf "file %s updated at %s\n", $file,
+ scalar localtime($write_secs);
+
+If you prefer something more legible, use the File::stat module
+(part of the standard distribution in version 5.004 and later):
+
+ # error checking left as an exercise for reader.
+ use File::stat;
+ use Time::localtime;
+ $date_string = ctime(stat($file)->mtime);
+ print "file $file updated at $date_string\n";
+
+The POSIX::strftime() approach has the benefit of being,
+in theory, independent of the current locale. See L<perllocale>
+for details.
+
+=head2 How do I set a file's timestamp in perl?
+X<timestamp> X<file, timestamp>
+
+You use the utime() function documented in L<perlfunc/utime>.
+By way of example, here's a little program that copies the
+read and write times from its first argument to all the rest
+of them.
+
+ if (@ARGV < 2) {
+ die "usage: cptimes timestamp_file other_files ...\n";
+ }
+ $timestamp = shift;
+ ($atime, $mtime) = (stat($timestamp))[8,9];
+ utime $atime, $mtime, @ARGV;
+
+Error checking is, as usual, left as an exercise for the reader.
+
+The perldoc for utime also has an example that has the same
+effect as touch(1) on files that I<already exist>.
+
+Certain file systems have a limited ability to store the times
+on a file at the expected level of precision. For example, the
+FAT and HPFS filesystem are unable to create dates on files with
+a finer granularity than two seconds. This is a limitation of
+the filesystems, not of utime().
+
+=head2 How do I print to more than one file at once?
+X<print, to multiple files>
+
+To connect one filehandle to several output filehandles,
+you can use the IO::Tee or Tie::FileHandle::Multiplex modules.
+
+If you only have to do this once, you can print individually
+to each filehandle.
+
+ for $fh (FH1, FH2, FH3) { print $fh "whatever\n" }
+
+=head2 How can I read in an entire file all at once?
+X<slurp> X<file, slurping>
+
+You can use the File::Slurp module to do it in one step.
+
+ use File::Slurp;
+
+ $all_of_it = read_file($filename); # entire file in scalar
+ @all_lines = read_file($filename); # one line per element
+
+The customary Perl approach for processing all the lines in a file is to
+do so one line at a time:
+
+ open (INPUT, $file) || die "can't open $file: $!";
+ while (<INPUT>) {
+ chomp;
+ # do something with $_
+ }
+ close(INPUT) || die "can't close $file: $!";
+
+This is tremendously more efficient than reading the entire file into
+memory as an array of lines and then processing it one element at a time,
+which is often--if not almost always--the wrong approach. Whenever
+you see someone do this:
+
+ @lines = <INPUT>;
+
+you should think long and hard about why you need everything loaded at
+once. It's just not a scalable solution. You might also find it more
+fun to use the standard Tie::File module, or the DB_File module's
+$DB_RECNO bindings, which allow you to tie an array to a file so that
+accessing an element the array actually accesses the corresponding
+line in the file.
+
+You can read the entire filehandle contents into a scalar.
+
+ {
+ local(*INPUT, $/);
+ open (INPUT, $file) || die "can't open $file: $!";
+ $var = <INPUT>;
+ }
+
+That temporarily undefs your record separator, and will automatically
+close the file at block exit. If the file is already open, just use this:
+
+ $var = do { local $/; <INPUT> };
+
+For ordinary files you can also use the read function.
+
+ read( INPUT, $var, -s INPUT );
+
+The third argument tests the byte size of the data on the INPUT filehandle
+and reads that many bytes into the buffer $var.
+
+=head2 How can I read in a file by paragraphs?
+X<file, reading by paragraphs>
+
+Use the C<$/> variable (see L<perlvar> for details). You can either
+set it to C<""> to eliminate empty paragraphs (C<"abc\n\n\n\ndef">,
+for instance, gets treated as two paragraphs and not three), or
+C<"\n\n"> to accept empty paragraphs.
+
+Note that a blank line must have no blanks in it. Thus
+S<C<"fred\n \nstuff\n\n">> is one paragraph, but C<"fred\n\nstuff\n\n"> is two.
+
+=head2 How can I read a single character from a file? From the keyboard?
+X<getc> X<file, reading one character at a time>
+
+You can use the builtin C<getc()> function for most filehandles, but
+it won't (easily) work on a terminal device. For STDIN, either use
+the Term::ReadKey module from CPAN or use the sample code in
+L<perlfunc/getc>.
+
+If your system supports the portable operating system programming
+interface (POSIX), you can use the following code, which you'll note
+turns off echo processing as well.
+
+ #!/usr/bin/perl -w
+ use strict;
+ $| = 1;
+ for (1..4) {
+ my $got;
+ print "gimme: ";
+ $got = getone();
+ print "--> $got\n";
+ }
+ exit;
+
+ BEGIN {
+ use POSIX qw(:termios_h);
+
+ my ($term, $oterm, $echo, $noecho, $fd_stdin);
+
+ $fd_stdin = fileno(STDIN);
+
+ $term = POSIX::Termios->new();
+ $term->getattr($fd_stdin);
+ $oterm = $term->getlflag();
+
+ $echo = ECHO | ECHOK | ICANON;
+ $noecho = $oterm & ~$echo;
+
+ sub cbreak {
+ $term->setlflag($noecho);
+ $term->setcc(VTIME, 1);
+ $term->setattr($fd_stdin, TCSANOW);
+ }
+
+ sub cooked {
+ $term->setlflag($oterm);
+ $term->setcc(VTIME, 0);
+ $term->setattr($fd_stdin, TCSANOW);
+ }
+
+ sub getone {
+ my $key = '';
+ cbreak();
+ sysread(STDIN, $key, 1);
+ cooked();
+ return $key;
+ }
+
+ }
+
+ END { cooked() }
+
+The Term::ReadKey module from CPAN may be easier to use. Recent versions
+include also support for non-portable systems as well.
+
+ use Term::ReadKey;
+ open(TTY, "</dev/tty");
+ print "Gimme a char: ";
+ ReadMode "raw";
+ $key = ReadKey 0, *TTY;
+ ReadMode "normal";
+ printf "\nYou said %s, char number %03d\n",
+ $key, ord $key;
+
+=head2 How can I tell whether there's a character waiting on a filehandle?
+
+The very first thing you should do is look into getting the Term::ReadKey
+extension from CPAN. As we mentioned earlier, it now even has limited
+support for non-portable (read: not open systems, closed, proprietary,
+not POSIX, not Unix, etc) systems.
+
+You should also check out the Frequently Asked Questions list in
+comp.unix.* for things like this: the answer is essentially the same.
+It's very system dependent. Here's one solution that works on BSD
+systems:
+
+ sub key_ready {
+ my($rin, $nfd);
+ vec($rin, fileno(STDIN), 1) = 1;
+ return $nfd = select($rin,undef,undef,0);
+ }
+
+If you want to find out how many characters are waiting, there's
+also the FIONREAD ioctl call to be looked at. The I<h2ph> tool that
+comes with Perl tries to convert C include files to Perl code, which
+can be C<require>d. FIONREAD ends up defined as a function in the
+I<sys/ioctl.ph> file:
+
+ require 'sys/ioctl.ph';
+
+ $size = pack("L", 0);
+ ioctl(FH, FIONREAD(), $size) or die "Couldn't call ioctl: $!\n";
+ $size = unpack("L", $size);
+
+If I<h2ph> wasn't installed or doesn't work for you, you can
+I<grep> the include files by hand:
+
+ % grep FIONREAD /usr/include/*/*
+ /usr/include/asm/ioctls.h:#define FIONREAD 0x541B
+
+Or write a small C program using the editor of champions:
+
+ % cat > fionread.c
+ #include <sys/ioctl.h>
+ main() {
+ printf("%#08x\n", FIONREAD);
+ }
+ ^D
+ % cc -o fionread fionread.c
+ % ./fionread
+ 0x4004667f
+
+And then hard code it, leaving porting as an exercise to your successor.
+
+ $FIONREAD = 0x4004667f; # XXX: opsys dependent
+
+ $size = pack("L", 0);
+ ioctl(FH, $FIONREAD, $size) or die "Couldn't call ioctl: $!\n";
+ $size = unpack("L", $size);
+
+FIONREAD requires a filehandle connected to a stream, meaning that sockets,
+pipes, and tty devices work, but I<not> files.
+
+=head2 How do I do a C<tail -f> in perl?
+X<tail> X<IO::Handle> X<File::Tail> X<clearerr>
+
+First try
+
+ seek(GWFILE, 0, 1);
+
+The statement C<seek(GWFILE, 0, 1)> doesn't change the current position,
+but it does clear the end-of-file condition on the handle, so that the
+next C<< <GWFILE> >> makes Perl try again to read something.
+
+If that doesn't work (it relies on features of your stdio implementation),
+then you need something more like this:
+
+ for (;;) {
+ for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) {
+ # search for some stuff and put it into files
+ }
+ # sleep for a while
+ seek(GWFILE, $curpos, 0); # seek to where we had been
+ }
+
+If this still doesn't work, look into the C<clearerr> method
+from C<IO::Handle>, which resets the error and end-of-file states
+on the handle.
+
+There's also a C<File::Tail> module from CPAN.
+
+=head2 How do I dup() a filehandle in Perl?
+X<dup>
+
+If you check L<perlfunc/open>, you'll see that several of the ways
+to call open() should do the trick. For example:
+
+ open(LOG, ">>/foo/logfile");
+ open(STDERR, ">&LOG");
+
+Or even with a literal numeric descriptor:
+
+ $fd = $ENV{MHCONTEXTFD};
+ open(MHCONTEXT, "<&=$fd"); # like fdopen(3S)
+
+Note that "<&STDIN" makes a copy, but "<&=STDIN" make
+an alias. That means if you close an aliased handle, all
+aliases become inaccessible. This is not true with
+a copied one.
+
+Error checking, as always, has been left as an exercise for the reader.
+
+=head2 How do I close a file descriptor by number?
+X<file, closing file descriptors> X<POSIX> X<close>
+
+If, for some reason, you have a file descriptor instead of a
+filehandle (perhaps you used C<POSIX::open>), you can use the
+C<close()> function from the C<POSIX> module:
+
+ use POSIX ();
+
+ POSIX::close( $fd );
+
+This should rarely be necessary, as the Perl C<close()> function is to be
+used for things that Perl opened itself, even if it was a dup of a
+numeric descriptor as with C<MHCONTEXT> above. But if you really have
+to, you may be able to do this:
+
+ require 'sys/syscall.ph';
+ $rc = syscall(&SYS_close, $fd + 0); # must force numeric
+ die "can't sysclose $fd: $!" unless $rc == -1;
+
+Or, just use the fdopen(3S) feature of C<open()>:
+
+ {
+ open my( $fh ), "<&=$fd" or die "Cannot reopen fd=$fd: $!";
+ close $fh;
+ }
+
+=head2 Why can't I use "C:\temp\foo" in DOS paths? Why doesn't `C:\temp\foo.exe` work?
+X<filename, DOS issues>
+
+Whoops! You just put a tab and a formfeed into that filename!
+Remember that within double quoted strings ("like\this"), the
+backslash is an escape character. The full list of these is in
+L<perlop/Quote and Quote-like Operators>. Unsurprisingly, you don't
+have a file called "c:(tab)emp(formfeed)oo" or
+"c:(tab)emp(formfeed)oo.exe" on your legacy DOS filesystem.
+
+Either single-quote your strings, or (preferably) use forward slashes.
+Since all DOS and Windows versions since something like MS-DOS 2.0 or so
+have treated C</> and C<\> the same in a path, you might as well use the
+one that doesn't clash with Perl--or the POSIX shell, ANSI C and C++,
+awk, Tcl, Java, or Python, just to mention a few. POSIX paths
+are more portable, too.
+
+=head2 Why doesn't glob("*.*") get all the files?
+X<glob>
+
+Because even on non-Unix ports, Perl's glob function follows standard
+Unix globbing semantics. You'll need C<glob("*")> to get all (non-hidden)
+files. This makes glob() portable even to legacy systems. Your
+port may include proprietary globbing functions as well. Check its
+documentation for details.
+
+=head2 Why does Perl let me delete read-only files? Why does C<-i> clobber protected files? Isn't this a bug in Perl?
+
+This is elaborately and painstakingly described in the
+F<file-dir-perms> article in the "Far More Than You Ever Wanted To
+Know" collection in http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz .
+
+The executive summary: learn how your filesystem works. The
+permissions on a file say what can happen to the data in that file.
+The permissions on a directory say what can happen to the list of
+files in that directory. If you delete a file, you're removing its
+name from the directory (so the operation depends on the permissions
+of the directory, not of the file). If you try to write to the file,
+the permissions of the file govern whether you're allowed to.
+
+=head2 How do I select a random line from a file?
+X<file, selecting a random line>
+
+Short of loading the file into a database or pre-indexing the lines in
+the file, there are a couple of things that you can do.
+
+Here's a reservoir-sampling algorithm from the Camel Book:
+
+ srand;
+ rand($.) < 1 && ($line = $_) while <>;
+
+This has a significant advantage in space over reading the whole file
+in. You can find a proof of this method in I<The Art of Computer
+Programming>, Volume 2, Section 3.4.2, by Donald E. Knuth.
+
+You can use the C<File::Random> module which provides a function
+for that algorithm:
+
+ use File::Random qw/random_line/;
+ my $line = random_line($filename);
+
+Another way is to use the C<Tie::File> module, which treats the entire
+file as an array. Simply access a random array element.
+
+=head2 Why do I get weird spaces when I print an array of lines?
+
+(contributed by brian d foy)
+
+If you are seeing spaces between the elements of your array when
+you print the array, you are probably interpolating the array in
+double quotes:
+
+ my @animals = qw(camel llama alpaca vicuna);
+ print "animals are: @animals\n";
+
+It's the double quotes, not the C<print>, doing this. Whenever you
+interpolate an array in a double quote context, Perl joins the
+elements with spaces (or whatever is in C<$">, which is a space by
+default):
+
+ animals are: camel llama alpaca vicuna
+
+This is different than printing the array without the interpolation:
+
+ my @animals = qw(camel llama alpaca vicuna);
+ print "animals are: ", @animals, "\n";
+
+Now the output doesn't have the spaces between the elements because
+the elements of C<@animals> simply become part of the list to
+C<print>:
+
+ animals are: camelllamaalpacavicuna
+
+You might notice this when each of the elements of C<@array> end with
+a newline. You expect to print one element per line, but notice that
+every line after the first is indented:
+
+ this is a line
+ this is another line
+ this is the third line
+
+That extra space comes from the interpolation of the array. If you
+don't want to put anything between your array elements, don't use the
+array in double quotes. You can send it to print without them:
+
+ print @lines;
+
+=head2 How do I traverse a directory tree?
+
+(contributed by brian d foy)
+
+The C<File::Find> module, which comes with Perl, does all of the hard
+work to traverse a directory structure. It comes with Perl. You simply
+call the C<find> subroutine with a callback subroutine and the
+directories you want to traverse:
+
+ use File::Find;
+
+ find( \&wanted, @directories );
+
+ sub wanted {
+ # full path in $File::Find::name
+ # just filename in $_
+ ... do whatever you want to do ...
+ }
+
+The C<File::Find::Closures>, which you can download from CPAN, provides
+many ready-to-use subroutines that you can use with C<File::Find>.
+
+The C<File::Finder>, which you can download from CPAN, can help you
+create the callback subroutine using something closer to the syntax of
+the C<find> command-line utility:
+
+ use File::Find;
+ use File::Finder;
+
+ my $deep_dirs = File::Finder->depth->type('d')->ls->exec('rmdir','{}');
+
+ find( $deep_dirs->as_options, @places );
+
+The C<File::Find::Rule> module, which you can download from CPAN, has
+a similar interface, but does the traversal for you too:
+
+ use File::Find::Rule;
+
+ my @files = File::Find::Rule->file()
+ ->name( '*.pm' )
+ ->in( @INC );
+
+=head2 How do I delete a directory tree?
+
+(contributed by brian d foy)
+
+If you have an empty directory, you can use Perl's built-in C<rmdir>. If
+the directory is not empty (so, no files or subdirectories), you either
+have to empty it yourself (a lot of work) or use a module to help you.
+
+The C<File::Path> module, which comes with Perl, has a C<rmtree> which
+can take care of all of the hard work for you:
+
+ use File::Path qw(rmtree);
+
+ rmtree( \@directories, 0, 0 );
+
+The first argument to C<rmtree> is either a string representing a directory path
+or an array reference. The second argument controls progress messages, and the
+third argument controls the handling of files you don't have permissions to
+delete. See the C<File::Path> module for the details.
+
+=head2 How do I copy an entire directory?
+
+(contributed by Shlomi Fish)
+
+To do the equivalent of C<cp -R> (i.e. copy an entire directory tree
+recursively) in portable Perl, you'll either need to write something yourself
+or find a good CPAN module such as L<File::Copy::Recursive>.
+=head1 REVISION
+
+Revision: $Revision$
+
+Date: $Date$
+
+See L<perlfaq> for source control details and availability.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2009 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples here are in the public
+domain. You are permitted and encouraged to use this code and any
+derivatives thereof in your own programs for fun or for profit as you
+see fit. A simple comment in the code giving credit to the FAQ would
+be courteous but is not required.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfaq6.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq6.pod
new file mode 100755
index 00000000000..daa8402e862
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq6.pod
@@ -0,0 +1,1151 @@
+=head1 NAME
+
+perlfaq6 - Regular Expressions
+
+=head1 DESCRIPTION
+
+This section is surprisingly small because the rest of the FAQ is
+littered with answers involving regular expressions. For example,
+decoding a URL and checking whether something is a number are handled
+with regular expressions, but those answers are found elsewhere in
+this document (in L<perlfaq9>: "How do I decode or create those %-encodings
+on the web" and L<perlfaq4>: "How do I determine whether a scalar is
+a number/whole/integer/float", to be precise).
+
+=head2 How can I hope to use regular expressions without creating illegible and unmaintainable code?
+X<regex, legibility> X<regexp, legibility>
+X<regular expression, legibility> X</x>
+
+Three techniques can make regular expressions maintainable and
+understandable.
+
+=over 4
+
+=item Comments Outside the Regex
+
+Describe what you're doing and how you're doing it, using normal Perl
+comments.
+
+ # turn the line into the first word, a colon, and the
+ # number of characters on the rest of the line
+ s/^(\w+)(.*)/ lc($1) . ":" . length($2) /meg;
+
+=item Comments Inside the Regex
+
+The C</x> modifier causes whitespace to be ignored in a regex pattern
+(except in a character class), and also allows you to use normal
+comments there, too. As you can imagine, whitespace and comments help
+a lot.
+
+C</x> lets you turn this:
+
+ s{<(?:[^>'"]*|".*?"|'.*?')+>}{}gs;
+
+into this:
+
+ s{ < # opening angle bracket
+ (?: # Non-backreffing grouping paren
+ [^>'"] * # 0 or more things that are neither > nor ' nor "
+ | # or else
+ ".*?" # a section between double quotes (stingy match)
+ | # or else
+ '.*?' # a section between single quotes (stingy match)
+ ) + # all occurring one or more times
+ > # closing angle bracket
+ }{}gsx; # replace with nothing, i.e. delete
+
+It's still not quite so clear as prose, but it is very useful for
+describing the meaning of each part of the pattern.
+
+=item Different Delimiters
+
+While we normally think of patterns as being delimited with C</>
+characters, they can be delimited by almost any character. L<perlre>
+describes this. For example, the C<s///> above uses braces as
+delimiters. Selecting another delimiter can avoid quoting the
+delimiter within the pattern:
+
+ s/\/usr\/local/\/usr\/share/g; # bad delimiter choice
+ s#/usr/local#/usr/share#g; # better
+
+=back
+
+=head2 I'm having trouble matching over more than one line. What's wrong?
+X<regex, multiline> X<regexp, multiline> X<regular expression, multiline>
+
+Either you don't have more than one line in the string you're looking
+at (probably), or else you aren't using the correct modifier(s) on
+your pattern (possibly).
+
+There are many ways to get multiline data into a string. If you want
+it to happen automatically while reading input, you'll want to set $/
+(probably to '' for paragraphs or C<undef> for the whole file) to
+allow you to read more than one line at a time.
+
+Read L<perlre> to help you decide which of C</s> and C</m> (or both)
+you might want to use: C</s> allows dot to include newline, and C</m>
+allows caret and dollar to match next to a newline, not just at the
+end of the string. You do need to make sure that you've actually
+got a multiline string in there.
+
+For example, this program detects duplicate words, even when they span
+line breaks (but not paragraph ones). For this example, we don't need
+C</s> because we aren't using dot in a regular expression that we want
+to cross line boundaries. Neither do we need C</m> because we aren't
+wanting caret or dollar to match at any point inside the record next
+to newlines. But it's imperative that $/ be set to something other
+than the default, or else we won't actually ever have a multiline
+record read in.
+
+ $/ = ''; # read in whole paragraph, not just one line
+ while ( <> ) {
+ while ( /\b([\w'-]+)(\s+\1)+\b/gi ) { # word starts alpha
+ print "Duplicate $1 at paragraph $.\n";
+ }
+ }
+
+Here's code that finds sentences that begin with "From " (which would
+be mangled by many mailers):
+
+ $/ = ''; # read in whole paragraph, not just one line
+ while ( <> ) {
+ while ( /^From /gm ) { # /m makes ^ match next to \n
+ print "leading from in paragraph $.\n";
+ }
+ }
+
+Here's code that finds everything between START and END in a paragraph:
+
+ undef $/; # read in whole file, not just one line or paragraph
+ while ( <> ) {
+ while ( /START(.*?)END/sgm ) { # /s makes . cross line boundaries
+ print "$1\n";
+ }
+ }
+
+=head2 How can I pull out lines between two patterns that are themselves on different lines?
+X<..>
+
+You can use Perl's somewhat exotic C<..> operator (documented in
+L<perlop>):
+
+ perl -ne 'print if /START/ .. /END/' file1 file2 ...
+
+If you wanted text and not lines, you would use
+
+ perl -0777 -ne 'print "$1\n" while /START(.*?)END/gs' file1 file2 ...
+
+But if you want nested occurrences of C<START> through C<END>, you'll
+run up against the problem described in the question in this section
+on matching balanced text.
+
+Here's another example of using C<..>:
+
+ while (<>) {
+ $in_header = 1 .. /^$/;
+ $in_body = /^$/ .. eof;
+ # now choose between them
+ } continue {
+ $. = 0 if eof; # fix $.
+ }
+
+=head2 How do I match XML, HTML, or other nasty, ugly things with a regex?
+X<regex, XML> X<regex, HTML> X<XML> X<HTML> X<pain> X<frustration>
+X<sucking out, will to live>
+
+(contributed by brian d foy)
+
+If you just want to get work done, use a module and forget about the
+regular expressions. The C<XML::Parser> and C<HTML::Parser> modules
+are good starts, although each namespace has other parsing modules
+specialized for certain tasks and different ways of doing it. Start at
+CPAN Search ( http://search.cpan.org ) and wonder at all the work people
+have done for you already! :)
+
+The problem with things such as XML is that they have balanced text
+containing multiple levels of balanced text, but sometimes it isn't
+balanced text, as in an empty tag (C<< <br/> >>, for instance). Even then,
+things can occur out-of-order. Just when you think you've got a
+pattern that matches your input, someone throws you a curveball.
+
+If you'd like to do it the hard way, scratching and clawing your way
+toward a right answer but constantly being disappointed, beseiged by
+bug reports, and weary from the inordinate amount of time you have to
+spend reinventing a triangular wheel, then there are several things
+you can try before you give up in frustration:
+
+=over 4
+
+=item * Solve the balanced text problem from another question in L<perlfaq6>
+
+=item * Try the recursive regex features in Perl 5.10 and later. See L<perlre>
+
+=item * Try defining a grammar using Perl 5.10's C<(?DEFINE)> feature.
+
+=item * Break the problem down into sub-problems instead of trying to use a single regex
+
+=item * Convince everyone not to use XML or HTML in the first place
+
+=back
+
+Good luck!
+
+=head2 I put a regular expression into $/ but it didn't work. What's wrong?
+X<$/, regexes in> X<$INPUT_RECORD_SEPARATOR, regexes in>
+X<$RS, regexes in>
+
+$/ has to be a string. You can use these examples if you really need to
+do this.
+
+If you have File::Stream, this is easy.
+
+ use File::Stream;
+
+ my $stream = File::Stream->new(
+ $filehandle,
+ separator => qr/\s*,\s*/,
+ );
+
+ print "$_\n" while <$stream>;
+
+If you don't have File::Stream, you have to do a little more work.
+
+You can use the four-argument form of sysread to continually add to
+a buffer. After you add to the buffer, you check if you have a
+complete line (using your regular expression).
+
+ local $_ = "";
+ while( sysread FH, $_, 8192, length ) {
+ while( s/^((?s).*?)your_pattern// ) {
+ my $record = $1;
+ # do stuff here.
+ }
+ }
+
+You can do the same thing with foreach and a match using the
+c flag and the \G anchor, if you do not mind your entire file
+being in memory at the end.
+
+ local $_ = "";
+ while( sysread FH, $_, 8192, length ) {
+ foreach my $record ( m/\G((?s).*?)your_pattern/gc ) {
+ # do stuff here.
+ }
+ substr( $_, 0, pos ) = "" if pos;
+ }
+
+
+=head2 How do I substitute case insensitively on the LHS while preserving case on the RHS?
+X<replace, case preserving> X<substitute, case preserving>
+X<substitution, case preserving> X<s, case preserving>
+
+Here's a lovely Perlish solution by Larry Rosler. It exploits
+properties of bitwise xor on ASCII strings.
+
+ $_= "this is a TEsT case";
+
+ $old = 'test';
+ $new = 'success';
+
+ s{(\Q$old\E)}
+ { uc $new | (uc $1 ^ $1) .
+ (uc(substr $1, -1) ^ substr $1, -1) x
+ (length($new) - length $1)
+ }egi;
+
+ print;
+
+And here it is as a subroutine, modeled after the above:
+
+ sub preserve_case($$) {
+ my ($old, $new) = @_;
+ my $mask = uc $old ^ $old;
+
+ uc $new | $mask .
+ substr($mask, -1) x (length($new) - length($old))
+ }
+
+ $string = "this is a TEsT case";
+ $string =~ s/(test)/preserve_case($1, "success")/egi;
+ print "$string\n";
+
+This prints:
+
+ this is a SUcCESS case
+
+As an alternative, to keep the case of the replacement word if it is
+longer than the original, you can use this code, by Jeff Pinyan:
+
+ sub preserve_case {
+ my ($from, $to) = @_;
+ my ($lf, $lt) = map length, @_;
+
+ if ($lt < $lf) { $from = substr $from, 0, $lt }
+ else { $from .= substr $to, $lf }
+
+ return uc $to | ($from ^ uc $from);
+ }
+
+This changes the sentence to "this is a SUcCess case."
+
+Just to show that C programmers can write C in any programming language,
+if you prefer a more C-like solution, the following script makes the
+substitution have the same case, letter by letter, as the original.
+(It also happens to run about 240% slower than the Perlish solution runs.)
+If the substitution has more characters than the string being substituted,
+the case of the last character is used for the rest of the substitution.
+
+ # Original by Nathan Torkington, massaged by Jeffrey Friedl
+ #
+ sub preserve_case($$)
+ {
+ my ($old, $new) = @_;
+ my ($state) = 0; # 0 = no change; 1 = lc; 2 = uc
+ my ($i, $oldlen, $newlen, $c) = (0, length($old), length($new));
+ my ($len) = $oldlen < $newlen ? $oldlen : $newlen;
+
+ for ($i = 0; $i < $len; $i++) {
+ if ($c = substr($old, $i, 1), $c =~ /[\W\d_]/) {
+ $state = 0;
+ } elsif (lc $c eq $c) {
+ substr($new, $i, 1) = lc(substr($new, $i, 1));
+ $state = 1;
+ } else {
+ substr($new, $i, 1) = uc(substr($new, $i, 1));
+ $state = 2;
+ }
+ }
+ # finish up with any remaining new (for when new is longer than old)
+ if ($newlen > $oldlen) {
+ if ($state == 1) {
+ substr($new, $oldlen) = lc(substr($new, $oldlen));
+ } elsif ($state == 2) {
+ substr($new, $oldlen) = uc(substr($new, $oldlen));
+ }
+ }
+ return $new;
+ }
+
+=head2 How can I make C<\w> match national character sets?
+X<\w>
+
+Put C<use locale;> in your script. The \w character class is taken
+from the current locale.
+
+See L<perllocale> for details.
+
+=head2 How can I match a locale-smart version of C</[a-zA-Z]/>?
+X<alpha>
+
+You can use the POSIX character class syntax C</[[:alpha:]]/>
+documented in L<perlre>.
+
+No matter which locale you are in, the alphabetic characters are
+the characters in \w without the digits and the underscore.
+As a regex, that looks like C</[^\W\d_]/>. Its complement,
+the non-alphabetics, is then everything in \W along with
+the digits and the underscore, or C</[\W\d_]/>.
+
+=head2 How can I quote a variable to use in a regex?
+X<regex, escaping> X<regexp, escaping> X<regular expression, escaping>
+
+The Perl parser will expand $variable and @variable references in
+regular expressions unless the delimiter is a single quote. Remember,
+too, that the right-hand side of a C<s///> substitution is considered
+a double-quoted string (see L<perlop> for more details). Remember
+also that any regex special characters will be acted on unless you
+precede the substitution with \Q. Here's an example:
+
+ $string = "Placido P. Octopus";
+ $regex = "P.";
+
+ $string =~ s/$regex/Polyp/;
+ # $string is now "Polypacido P. Octopus"
+
+Because C<.> is special in regular expressions, and can match any
+single character, the regex C<P.> here has matched the <Pl> in the
+original string.
+
+To escape the special meaning of C<.>, we use C<\Q>:
+
+ $string = "Placido P. Octopus";
+ $regex = "P.";
+
+ $string =~ s/\Q$regex/Polyp/;
+ # $string is now "Placido Polyp Octopus"
+
+The use of C<\Q> causes the <.> in the regex to be treated as a
+regular character, so that C<P.> matches a C<P> followed by a dot.
+
+=head2 What is C</o> really for?
+X</o, regular expressions> X<compile, regular expressions>
+
+(contributed by brian d foy)
+
+The C</o> option for regular expressions (documented in L<perlop> and
+L<perlreref>) tells Perl to compile the regular expression only once.
+This is only useful when the pattern contains a variable. Perls 5.6
+and later handle this automatically if the pattern does not change.
+
+Since the match operator C<m//>, the substitution operator C<s///>,
+and the regular expression quoting operator C<qr//> are double-quotish
+constructs, you can interpolate variables into the pattern. See the
+answer to "How can I quote a variable to use in a regex?" for more
+details.
+
+This example takes a regular expression from the argument list and
+prints the lines of input that match it:
+
+ my $pattern = shift @ARGV;
+
+ while( <> ) {
+ print if m/$pattern/;
+ }
+
+Versions of Perl prior to 5.6 would recompile the regular expression
+for each iteration, even if C<$pattern> had not changed. The C</o>
+would prevent this by telling Perl to compile the pattern the first
+time, then reuse that for subsequent iterations:
+
+ my $pattern = shift @ARGV;
+
+ while( <> ) {
+ print if m/$pattern/o; # useful for Perl < 5.6
+ }
+
+In versions 5.6 and later, Perl won't recompile the regular expression
+if the variable hasn't changed, so you probably don't need the C</o>
+option. It doesn't hurt, but it doesn't help either. If you want any
+version of Perl to compile the regular expression only once even if
+the variable changes (thus, only using its initial value), you still
+need the C</o>.
+
+You can watch Perl's regular expression engine at work to verify for
+yourself if Perl is recompiling a regular expression. The C<use re
+'debug'> pragma (comes with Perl 5.005 and later) shows the details.
+With Perls before 5.6, you should see C<re> reporting that its
+compiling the regular expression on each iteration. With Perl 5.6 or
+later, you should only see C<re> report that for the first iteration.
+
+ use re 'debug';
+
+ $regex = 'Perl';
+ foreach ( qw(Perl Java Ruby Python) ) {
+ print STDERR "-" x 73, "\n";
+ print STDERR "Trying $_...\n";
+ print STDERR "\t$_ is good!\n" if m/$regex/;
+ }
+
+=head2 How do I use a regular expression to strip C style comments from a file?
+
+While this actually can be done, it's much harder than you'd think.
+For example, this one-liner
+
+ perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c
+
+will work in many but not all cases. You see, it's too simple-minded for
+certain kinds of C programs, in particular, those with what appear to be
+comments in quoted strings. For that, you'd need something like this,
+created by Jeffrey Friedl and later modified by Fred Curtis.
+
+ $/ = undef;
+ $_ = <>;
+ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;
+ print;
+
+This could, of course, be more legibly written with the C</x> modifier, adding
+whitespace and comments. Here it is expanded, courtesy of Fred Curtis.
+
+ s{
+ /\* ## Start of /* ... */ comment
+ [^*]*\*+ ## Non-* followed by 1-or-more *'s
+ (
+ [^/*][^*]*\*+
+ )* ## 0-or-more things which don't start with /
+ ## but do end with '*'
+ / ## End of /* ... */ comment
+
+ | ## OR various things which aren't comments:
+
+ (
+ " ## Start of " ... " string
+ (
+ \\. ## Escaped char
+ | ## OR
+ [^"\\] ## Non "\
+ )*
+ " ## End of " ... " string
+
+ | ## OR
+
+ ' ## Start of ' ... ' string
+ (
+ \\. ## Escaped char
+ | ## OR
+ [^'\\] ## Non '\
+ )*
+ ' ## End of ' ... ' string
+
+ | ## OR
+
+ . ## Anything other char
+ [^/"'\\]* ## Chars which doesn't start a comment, string or escape
+ )
+ }{defined $2 ? $2 : ""}gxse;
+
+A slight modification also removes C++ comments, possibly spanning multiple lines
+using a continuation character:
+
+ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//([^\\]|[^\n][\n]?)*?\n|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $3 ? $3 : ""#gse;
+
+=head2 Can I use Perl regular expressions to match balanced text?
+X<regex, matching balanced test> X<regexp, matching balanced test>
+X<regular expression, matching balanced test> X<possessive> X<PARNO>
+X<Text::Balanced> X<Regexp::Common> X<backtracking> X<recursion>
+
+(contributed by brian d foy)
+
+Your first try should probably be the C<Text::Balanced> module, which
+is in the Perl standard library since Perl 5.8. It has a variety of
+functions to deal with tricky text. The C<Regexp::Common> module can
+also help by providing canned patterns you can use.
+
+As of Perl 5.10, you can match balanced text with regular expressions
+using recursive patterns. Before Perl 5.10, you had to resort to
+various tricks such as using Perl code in C<(??{})> sequences.
+
+Here's an example using a recursive regular expression. The goal is to
+capture all of the text within angle brackets, including the text in
+nested angle brackets. This sample text has two "major" groups: a
+group with one level of nesting and a group with two levels of
+nesting. There are five total groups in angle brackets:
+
+ I have some <brackets in <nested brackets> > and
+ <another group <nested once <nested twice> > >
+ and that's it.
+
+The regular expression to match the balanced text uses two new (to
+Perl 5.10) regular expression features. These are covered in L<perlre>
+and this example is a modified version of one in that documentation.
+
+First, adding the new possesive C<+> to any quantifier finds the
+longest match and does not backtrack. That's important since you want
+to handle any angle brackets through the recursion, not backtracking.
+The group C<< [^<>]++ >> finds one or more non-angle brackets without
+backtracking.
+
+Second, the new C<(?PARNO)> refers to the sub-pattern in the
+particular capture buffer given by C<PARNO>. In the following regex,
+the first capture buffer finds (and remembers) the balanced text, and
+you need that same pattern within the first buffer to get past the
+nested text. That's the recursive part. The C<(?1)> uses the pattern
+in the outer capture buffer as an independent part of the regex.
+
+Putting it all together, you have:
+
+ #!/usr/local/bin/perl5.10.0
+
+ my $string =<<"HERE";
+ I have some <brackets in <nested brackets> > and
+ <another group <nested once <nested twice> > >
+ and that's it.
+ HERE
+
+ my @groups = $string =~ m/
+ ( # start of capture buffer 1
+ < # match an opening angle bracket
+ (?:
+ [^<>]++ # one or more non angle brackets, non backtracking
+ |
+ (?1) # found < or >, so recurse to capture buffer 1
+ )*
+ > # match a closing angle bracket
+ ) # end of capture buffer 1
+ /xg;
+
+ $" = "\n\t";
+ print "Found:\n\t@groups\n";
+
+The output shows that Perl found the two major groups:
+
+ Found:
+ <brackets in <nested brackets> >
+ <another group <nested once <nested twice> > >
+
+With a little extra work, you can get the all of the groups in angle
+brackets even if they are in other angle brackets too. Each time you
+get a balanced match, remove its outer delimiter (that's the one you
+just matched so don't match it again) and add it to a queue of strings
+to process. Keep doing that until you get no matches:
+
+ #!/usr/local/bin/perl5.10.0
+
+ my @queue =<<"HERE";
+ I have some <brackets in <nested brackets> > and
+ <another group <nested once <nested twice> > >
+ and that's it.
+ HERE
+
+ my $regex = qr/
+ ( # start of bracket 1
+ < # match an opening angle bracket
+ (?:
+ [^<>]++ # one or more non angle brackets, non backtracking
+ |
+ (?1) # recurse to bracket 1
+ )*
+ > # match a closing angle bracket
+ ) # end of bracket 1
+ /x;
+
+ $" = "\n\t";
+
+ while( @queue )
+ {
+ my $string = shift @queue;
+
+ my @groups = $string =~ m/$regex/g;
+ print "Found:\n\t@groups\n\n" if @groups;
+
+ unshift @queue, map { s/^<//; s/>$//; $_ } @groups;
+ }
+
+The output shows all of the groups. The outermost matches show up
+first and the nested matches so up later:
+
+ Found:
+ <brackets in <nested brackets> >
+ <another group <nested once <nested twice> > >
+
+ Found:
+ <nested brackets>
+
+ Found:
+ <nested once <nested twice> >
+
+ Found:
+ <nested twice>
+
+=head2 What does it mean that regexes are greedy? How can I get around it?
+X<greedy> X<greediness>
+
+Most people mean that greedy regexes match as much as they can.
+Technically speaking, it's actually the quantifiers (C<?>, C<*>, C<+>,
+C<{}>) that are greedy rather than the whole pattern; Perl prefers local
+greed and immediate gratification to overall greed. To get non-greedy
+versions of the same quantifiers, use (C<??>, C<*?>, C<+?>, C<{}?>).
+
+An example:
+
+ $s1 = $s2 = "I am very very cold";
+ $s1 =~ s/ve.*y //; # I am cold
+ $s2 =~ s/ve.*?y //; # I am very cold
+
+Notice how the second substitution stopped matching as soon as it
+encountered "y ". The C<*?> quantifier effectively tells the regular
+expression engine to find a match as quickly as possible and pass
+control on to whatever is next in line, like you would if you were
+playing hot potato.
+
+=head2 How do I process each word on each line?
+X<word>
+
+Use the split function:
+
+ while (<>) {
+ foreach $word ( split ) {
+ # do something with $word here
+ }
+ }
+
+Note that this isn't really a word in the English sense; it's just
+chunks of consecutive non-whitespace characters.
+
+To work with only alphanumeric sequences (including underscores), you
+might consider
+
+ while (<>) {
+ foreach $word (m/(\w+)/g) {
+ # do something with $word here
+ }
+ }
+
+=head2 How can I print out a word-frequency or line-frequency summary?
+
+To do this, you have to parse out each word in the input stream. We'll
+pretend that by word you mean chunk of alphabetics, hyphens, or
+apostrophes, rather than the non-whitespace chunk idea of a word given
+in the previous question:
+
+ while (<>) {
+ while ( /(\b[^\W_\d][\w'-]+\b)/g ) { # misses "`sheep'"
+ $seen{$1}++;
+ }
+ }
+
+ while ( ($word, $count) = each %seen ) {
+ print "$count $word\n";
+ }
+
+If you wanted to do the same thing for lines, you wouldn't need a
+regular expression:
+
+ while (<>) {
+ $seen{$_}++;
+ }
+
+ while ( ($line, $count) = each %seen ) {
+ print "$count $line";
+ }
+
+If you want these output in a sorted order, see L<perlfaq4>: "How do I
+sort a hash (optionally by value instead of key)?".
+
+=head2 How can I do approximate matching?
+X<match, approximate> X<matching, approximate>
+
+See the module String::Approx available from CPAN.
+
+=head2 How do I efficiently match many regular expressions at once?
+X<regex, efficiency> X<regexp, efficiency>
+X<regular expression, efficiency>
+
+( contributed by brian d foy )
+
+Avoid asking Perl to compile a regular expression every time
+you want to match it. In this example, perl must recompile
+the regular expression for every iteration of the C<foreach>
+loop since it has no way to know what $pattern will be.
+
+ @patterns = qw( foo bar baz );
+
+ LINE: while( <DATA> )
+ {
+ foreach $pattern ( @patterns )
+ {
+ if( /\b$pattern\b/i )
+ {
+ print;
+ next LINE;
+ }
+ }
+ }
+
+The C<qr//> operator showed up in perl 5.005. It compiles a
+regular expression, but doesn't apply it. When you use the
+pre-compiled version of the regex, perl does less work. In
+this example, I inserted a C<map> to turn each pattern into
+its pre-compiled form. The rest of the script is the same,
+but faster.
+
+ @patterns = map { qr/\b$_\b/i } qw( foo bar baz );
+
+ LINE: while( <> )
+ {
+ foreach $pattern ( @patterns )
+ {
+ if( /$pattern/ )
+ {
+ print;
+ next LINE;
+ }
+ }
+ }
+
+In some cases, you may be able to make several patterns into
+a single regular expression. Beware of situations that require
+backtracking though.
+
+ $regex = join '|', qw( foo bar baz );
+
+ LINE: while( <> )
+ {
+ print if /\b(?:$regex)\b/i;
+ }
+
+For more details on regular expression efficiency, see I<Mastering
+Regular Expressions> by Jeffrey Freidl. He explains how regular
+expressions engine work and why some patterns are surprisingly
+inefficient. Once you understand how perl applies regular
+expressions, you can tune them for individual situations.
+
+=head2 Why don't word-boundary searches with C<\b> work for me?
+X<\b>
+
+(contributed by brian d foy)
+
+Ensure that you know what \b really does: it's the boundary between a
+word character, \w, and something that isn't a word character. That
+thing that isn't a word character might be \W, but it can also be the
+start or end of the string.
+
+It's not (not!) the boundary between whitespace and non-whitespace,
+and it's not the stuff between words we use to create sentences.
+
+In regex speak, a word boundary (\b) is a "zero width assertion",
+meaning that it doesn't represent a character in the string, but a
+condition at a certain position.
+
+For the regular expression, /\bPerl\b/, there has to be a word
+boundary before the "P" and after the "l". As long as something other
+than a word character precedes the "P" and succeeds the "l", the
+pattern will match. These strings match /\bPerl\b/.
+
+ "Perl" # no word char before P or after l
+ "Perl " # same as previous (space is not a word char)
+ "'Perl'" # the ' char is not a word char
+ "Perl's" # no word char before P, non-word char after "l"
+
+These strings do not match /\bPerl\b/.
+
+ "Perl_" # _ is a word char!
+ "Perler" # no word char before P, but one after l
+
+You don't have to use \b to match words though. You can look for
+non-word characters surrounded by word characters. These strings
+match the pattern /\b'\b/.
+
+ "don't" # the ' char is surrounded by "n" and "t"
+ "qep'a'" # the ' char is surrounded by "p" and "a"
+
+These strings do not match /\b'\b/.
+
+ "foo'" # there is no word char after non-word '
+
+You can also use the complement of \b, \B, to specify that there
+should not be a word boundary.
+
+In the pattern /\Bam\B/, there must be a word character before the "a"
+and after the "m". These patterns match /\Bam\B/:
+
+ "llama" # "am" surrounded by word chars
+ "Samuel" # same
+
+These strings do not match /\Bam\B/
+
+ "Sam" # no word boundary before "a", but one after "m"
+ "I am Sam" # "am" surrounded by non-word chars
+
+
+=head2 Why does using $&, $`, or $' slow my program down?
+X<$MATCH> X<$&> X<$POSTMATCH> X<$'> X<$PREMATCH> X<$`>
+
+(contributed by Anno Siegel)
+
+Once Perl sees that you need one of these variables anywhere in the
+program, it provides them on each and every pattern match. That means
+that on every pattern match the entire string will be copied, part of it
+to $`, part to $&, and part to $'. Thus the penalty is most severe with
+long strings and patterns that match often. Avoid $&, $', and $` if you
+can, but if you can't, once you've used them at all, use them at will
+because you've already paid the price. Remember that some algorithms
+really appreciate them. As of the 5.005 release, the $& variable is no
+longer "expensive" the way the other two are.
+
+Since Perl 5.6.1 the special variables @- and @+ can functionally replace
+$`, $& and $'. These arrays contain pointers to the beginning and end
+of each match (see perlvar for the full story), so they give you
+essentially the same information, but without the risk of excessive
+string copying.
+
+Perl 5.10 added three specials, C<${^MATCH}>, C<${^PREMATCH}>, and
+C<${^POSTMATCH}> to do the same job but without the global performance
+penalty. Perl 5.10 only sets these variables if you compile or execute the
+regular expression with the C</p> modifier.
+
+=head2 What good is C<\G> in a regular expression?
+X<\G>
+
+You use the C<\G> anchor to start the next match on the same
+string where the last match left off. The regular
+expression engine cannot skip over any characters to find
+the next match with this anchor, so C<\G> is similar to the
+beginning of string anchor, C<^>. The C<\G> anchor is typically
+used with the C<g> flag. It uses the value of C<pos()>
+as the position to start the next match. As the match
+operator makes successive matches, it updates C<pos()> with the
+position of the next character past the last match (or the
+first character of the next match, depending on how you like
+to look at it). Each string has its own C<pos()> value.
+
+Suppose you want to match all of consecutive pairs of digits
+in a string like "1122a44" and stop matching when you
+encounter non-digits. You want to match C<11> and C<22> but
+the letter <a> shows up between C<22> and C<44> and you want
+to stop at C<a>. Simply matching pairs of digits skips over
+the C<a> and still matches C<44>.
+
+ $_ = "1122a44";
+ my @pairs = m/(\d\d)/g; # qw( 11 22 44 )
+
+If you use the C<\G> anchor, you force the match after C<22> to
+start with the C<a>. The regular expression cannot match
+there since it does not find a digit, so the next match
+fails and the match operator returns the pairs it already
+found.
+
+ $_ = "1122a44";
+ my @pairs = m/\G(\d\d)/g; # qw( 11 22 )
+
+You can also use the C<\G> anchor in scalar context. You
+still need the C<g> flag.
+
+ $_ = "1122a44";
+ while( m/\G(\d\d)/g )
+ {
+ print "Found $1\n";
+ }
+
+After the match fails at the letter C<a>, perl resets C<pos()>
+and the next match on the same string starts at the beginning.
+
+ $_ = "1122a44";
+ while( m/\G(\d\d)/g )
+ {
+ print "Found $1\n";
+ }
+
+ print "Found $1 after while" if m/(\d\d)/g; # finds "11"
+
+You can disable C<pos()> resets on fail with the C<c> flag, documented
+in L<perlop> and L<perlreref>. Subsequent matches start where the last
+successful match ended (the value of C<pos()>) even if a match on the
+same string has failed in the meantime. In this case, the match after
+the C<while()> loop starts at the C<a> (where the last match stopped),
+and since it does not use any anchor it can skip over the C<a> to find
+C<44>.
+
+ $_ = "1122a44";
+ while( m/\G(\d\d)/gc )
+ {
+ print "Found $1\n";
+ }
+
+ print "Found $1 after while" if m/(\d\d)/g; # finds "44"
+
+Typically you use the C<\G> anchor with the C<c> flag
+when you want to try a different match if one fails,
+such as in a tokenizer. Jeffrey Friedl offers this example
+which works in 5.004 or later.
+
+ while (<>) {
+ chomp;
+ PARSER: {
+ m/ \G( \d+\b )/gcx && do { print "number: $1\n"; redo; };
+ m/ \G( \w+ )/gcx && do { print "word: $1\n"; redo; };
+ m/ \G( \s+ )/gcx && do { print "space: $1\n"; redo; };
+ m/ \G( [^\w\d]+ )/gcx && do { print "other: $1\n"; redo; };
+ }
+ }
+
+For each line, the C<PARSER> loop first tries to match a series
+of digits followed by a word boundary. This match has to
+start at the place the last match left off (or the beginning
+of the string on the first match). Since C<m/ \G( \d+\b
+)/gcx> uses the C<c> flag, if the string does not match that
+regular expression, perl does not reset pos() and the next
+match starts at the same position to try a different
+pattern.
+
+=head2 Are Perl regexes DFAs or NFAs? Are they POSIX compliant?
+X<DFA> X<NFA> X<POSIX>
+
+While it's true that Perl's regular expressions resemble the DFAs
+(deterministic finite automata) of the egrep(1) program, they are in
+fact implemented as NFAs (non-deterministic finite automata) to allow
+backtracking and backreferencing. And they aren't POSIX-style either,
+because those guarantee worst-case behavior for all cases. (It seems
+that some people prefer guarantees of consistency, even when what's
+guaranteed is slowness.) See the book "Mastering Regular Expressions"
+(from O'Reilly) by Jeffrey Friedl for all the details you could ever
+hope to know on these matters (a full citation appears in
+L<perlfaq2>).
+
+=head2 What's wrong with using grep in a void context?
+X<grep>
+
+The problem is that grep builds a return list, regardless of the context.
+This means you're making Perl go to the trouble of building a list that
+you then just throw away. If the list is large, you waste both time and space.
+If your intent is to iterate over the list, then use a for loop for this
+purpose.
+
+In perls older than 5.8.1, map suffers from this problem as well.
+But since 5.8.1, this has been fixed, and map is context aware - in void
+context, no lists are constructed.
+
+=head2 How can I match strings with multibyte characters?
+X<regex, and multibyte characters> X<regexp, and multibyte characters>
+X<regular expression, and multibyte characters> X<martian> X<encoding, Martian>
+
+Starting from Perl 5.6 Perl has had some level of multibyte character
+support. Perl 5.8 or later is recommended. Supported multibyte
+character repertoires include Unicode, and legacy encodings
+through the Encode module. See L<perluniintro>, L<perlunicode>,
+and L<Encode>.
+
+If you are stuck with older Perls, you can do Unicode with the
+C<Unicode::String> module, and character conversions using the
+C<Unicode::Map8> and C<Unicode::Map> modules. If you are using
+Japanese encodings, you might try using the jperl 5.005_03.
+
+Finally, the following set of approaches was offered by Jeffrey
+Friedl, whose article in issue #5 of The Perl Journal talks about
+this very matter.
+
+Let's suppose you have some weird Martian encoding where pairs of
+ASCII uppercase letters encode single Martian letters (i.e. the two
+bytes "CV" make a single Martian letter, as do the two bytes "SG",
+"VS", "XX", etc.). Other bytes represent single characters, just like
+ASCII.
+
+So, the string of Martian "I am CVSGXX!" uses 12 bytes to encode the
+nine characters 'I', ' ', 'a', 'm', ' ', 'CV', 'SG', 'XX', '!'.
+
+Now, say you want to search for the single character C</GX/>. Perl
+doesn't know about Martian, so it'll find the two bytes "GX" in the "I
+am CVSGXX!" string, even though that character isn't there: it just
+looks like it is because "SG" is next to "XX", but there's no real
+"GX". This is a big problem.
+
+Here are a few ways, all painful, to deal with it:
+
+ # Make sure adjacent "martian" bytes are no longer adjacent.
+ $martian =~ s/([A-Z][A-Z])/ $1 /g;
+
+ print "found GX!\n" if $martian =~ /GX/;
+
+Or like this:
+
+ @chars = $martian =~ m/([A-Z][A-Z]|[^A-Z])/g;
+ # above is conceptually similar to: @chars = $text =~ m/(.)/g;
+ #
+ foreach $char (@chars) {
+ print "found GX!\n", last if $char eq 'GX';
+ }
+
+Or like this:
+
+ while ($martian =~ m/\G([A-Z][A-Z]|.)/gs) { # \G probably unneeded
+ print "found GX!\n", last if $1 eq 'GX';
+ }
+
+Here's another, slightly less painful, way to do it from Benjamin
+Goldberg, who uses a zero-width negative look-behind assertion.
+
+ print "found GX!\n" if $martian =~ m/
+ (?<![A-Z])
+ (?:[A-Z][A-Z])*?
+ GX
+ /x;
+
+This succeeds if the "martian" character GX is in the string, and fails
+otherwise. If you don't like using (?<!), a zero-width negative
+look-behind assertion, you can replace (?<![A-Z]) with (?:^|[^A-Z]).
+
+It does have the drawback of putting the wrong thing in $-[0] and $+[0],
+but this usually can be worked around.
+
+=head2 How do I match a regular expression that's in a variable?
+X<regex, in variable> X<eval> X<regex> X<quotemeta> X<\Q, regex>
+X<\E, regex>, X<qr//>
+
+(contributed by brian d foy)
+
+We don't have to hard-code patterns into the match operator (or
+anything else that works with regular expressions). We can put the
+pattern in a variable for later use.
+
+The match operator is a double quote context, so you can interpolate
+your variable just like a double quoted string. In this case, you
+read the regular expression as user input and store it in C<$regex>.
+Once you have the pattern in C<$regex>, you use that variable in the
+match operator.
+
+ chomp( my $regex = <STDIN> );
+
+ if( $string =~ m/$regex/ ) { ... }
+
+Any regular expression special characters in C<$regex> are still
+special, and the pattern still has to be valid or Perl will complain.
+For instance, in this pattern there is an unpaired parenthesis.
+
+ my $regex = "Unmatched ( paren";
+
+ "Two parens to bind them all" =~ m/$regex/;
+
+When Perl compiles the regular expression, it treats the parenthesis
+as the start of a memory match. When it doesn't find the closing
+parenthesis, it complains:
+
+ Unmatched ( in regex; marked by <-- HERE in m/Unmatched ( <-- HERE paren/ at script line 3.
+
+You can get around this in several ways depending on our situation.
+First, if you don't want any of the characters in the string to be
+special, you can escape them with C<quotemeta> before you use the string.
+
+ chomp( my $regex = <STDIN> );
+ $regex = quotemeta( $regex );
+
+ if( $string =~ m/$regex/ ) { ... }
+
+You can also do this directly in the match operator using the C<\Q>
+and C<\E> sequences. The C<\Q> tells Perl where to start escaping
+special characters, and the C<\E> tells it where to stop (see L<perlop>
+for more details).
+
+ chomp( my $regex = <STDIN> );
+
+ if( $string =~ m/\Q$regex\E/ ) { ... }
+
+Alternately, you can use C<qr//>, the regular expression quote operator (see
+L<perlop> for more details). It quotes and perhaps compiles the pattern,
+and you can apply regular expression flags to the pattern.
+
+ chomp( my $input = <STDIN> );
+
+ my $regex = qr/$input/is;
+
+ $string =~ m/$regex/ # same as m/$input/is;
+
+You might also want to trap any errors by wrapping an C<eval> block
+around the whole thing.
+
+ chomp( my $input = <STDIN> );
+
+ eval {
+ if( $string =~ m/\Q$input\E/ ) { ... }
+ };
+ warn $@ if $@;
+
+Or...
+
+ my $regex = eval { qr/$input/is };
+ if( defined $regex ) {
+ $string =~ m/$regex/;
+ }
+ else {
+ warn $@;
+ }
+
+=head1 REVISION
+
+Revision: $Revision$
+
+Date: $Date$
+
+See L<perlfaq> for source control details and availability.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2009 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain. You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit. A simple comment in the code giving
+credit would be courteous but is not required.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfaq7.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq7.pod
new file mode 100755
index 00000000000..4c0c2f13878
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq7.pod
@@ -0,0 +1,1112 @@
+=head1 NAME
+
+perlfaq7 - General Perl Language Issues
+
+=head1 DESCRIPTION
+
+This section deals with general Perl language issues that don't
+clearly fit into any of the other sections.
+
+=head2 Can I get a BNF/yacc/RE for the Perl language?
+
+There is no BNF, but you can paw your way through the yacc grammar in
+perly.y in the source distribution if you're particularly brave. The
+grammar relies on very smart tokenizing code, so be prepared to
+venture into toke.c as well.
+
+In the words of Chaim Frenkel: "Perl's grammar can not be reduced to BNF.
+The work of parsing perl is distributed between yacc, the lexer, smoke
+and mirrors."
+
+=head2 What are all these $@%&* punctuation signs, and how do I know when to use them?
+
+They are type specifiers, as detailed in L<perldata>:
+
+ $ for scalar values (number, string or reference)
+ @ for arrays
+ % for hashes (associative arrays)
+ & for subroutines (aka functions, procedures, methods)
+ * for all types of that symbol name. In version 4 you used them like
+ pointers, but in modern perls you can just use references.
+
+There are couple of other symbols that you're likely to encounter that aren't
+really type specifiers:
+
+ <> are used for inputting a record from a filehandle.
+ \ takes a reference to something.
+
+Note that <FILE> is I<neither> the type specifier for files
+nor the name of the handle. It is the C<< <> >> operator applied
+to the handle FILE. It reads one line (well, record--see
+L<perlvar/$E<sol>>) from the handle FILE in scalar context, or I<all> lines
+in list context. When performing open, close, or any other operation
+besides C<< <> >> on files, or even when talking about the handle, do
+I<not> use the brackets. These are correct: C<eof(FH)>, C<seek(FH, 0,
+2)> and "copying from STDIN to FILE".
+
+=head2 Do I always/never have to quote my strings or use semicolons and commas?
+
+Normally, a bareword doesn't need to be quoted, but in most cases
+probably should be (and must be under C<use strict>). But a hash key
+consisting of a simple word (that isn't the name of a defined
+subroutine) and the left-hand operand to the C<< => >> operator both
+count as though they were quoted:
+
+ This is like this
+ ------------ ---------------
+ $foo{line} $foo{'line'}
+ bar => stuff 'bar' => stuff
+
+The final semicolon in a block is optional, as is the final comma in a
+list. Good style (see L<perlstyle>) says to put them in except for
+one-liners:
+
+ if ($whoops) { exit 1 }
+ @nums = (1, 2, 3);
+
+ if ($whoops) {
+ exit 1;
+ }
+
+ @lines = (
+ "There Beren came from mountains cold",
+ "And lost he wandered under leaves",
+ );
+
+=head2 How do I skip some return values?
+
+One way is to treat the return values as a list and index into it:
+
+ $dir = (getpwnam($user))[7];
+
+Another way is to use undef as an element on the left-hand-side:
+
+ ($dev, $ino, undef, undef, $uid, $gid) = stat($file);
+
+You can also use a list slice to select only the elements that
+you need:
+
+ ($dev, $ino, $uid, $gid) = ( stat($file) )[0,1,4,5];
+
+=head2 How do I temporarily block warnings?
+
+If you are running Perl 5.6.0 or better, the C<use warnings> pragma
+allows fine control of what warning are produced.
+See L<perllexwarn> for more details.
+
+ {
+ no warnings; # temporarily turn off warnings
+ $a = $b + $c; # I know these might be undef
+ }
+
+Additionally, you can enable and disable categories of warnings.
+You turn off the categories you want to ignore and you can still
+get other categories of warnings. See L<perllexwarn> for the
+complete details, including the category names and hierarchy.
+
+ {
+ no warnings 'uninitialized';
+ $a = $b + $c;
+ }
+
+If you have an older version of Perl, the C<$^W> variable (documented
+in L<perlvar>) controls runtime warnings for a block:
+
+ {
+ local $^W = 0; # temporarily turn off warnings
+ $a = $b + $c; # I know these might be undef
+ }
+
+Note that like all the punctuation variables, you cannot currently
+use my() on C<$^W>, only local().
+
+=head2 What's an extension?
+
+An extension is a way of calling compiled C code from Perl. Reading
+L<perlxstut> is a good place to learn more about extensions.
+
+=head2 Why do Perl operators have different precedence than C operators?
+
+Actually, they don't. All C operators that Perl copies have the same
+precedence in Perl as they do in C. The problem is with operators that C
+doesn't have, especially functions that give a list context to everything
+on their right, eg. print, chmod, exec, and so on. Such functions are
+called "list operators" and appear as such in the precedence table in
+L<perlop>.
+
+A common mistake is to write:
+
+ unlink $file || die "snafu";
+
+This gets interpreted as:
+
+ unlink ($file || die "snafu");
+
+To avoid this problem, either put in extra parentheses or use the
+super low precedence C<or> operator:
+
+ (unlink $file) || die "snafu";
+ unlink $file or die "snafu";
+
+The "English" operators (C<and>, C<or>, C<xor>, and C<not>)
+deliberately have precedence lower than that of list operators for
+just such situations as the one above.
+
+Another operator with surprising precedence is exponentiation. It
+binds more tightly even than unary minus, making C<-2**2> produce a
+negative not a positive four. It is also right-associating, meaning
+that C<2**3**2> is two raised to the ninth power, not eight squared.
+
+Although it has the same precedence as in C, Perl's C<?:> operator
+produces an lvalue. This assigns $x to either $a or $b, depending
+on the trueness of $maybe:
+
+ ($maybe ? $a : $b) = $x;
+
+=head2 How do I declare/create a structure?
+
+In general, you don't "declare" a structure. Just use a (probably
+anonymous) hash reference. See L<perlref> and L<perldsc> for details.
+Here's an example:
+
+ $person = {}; # new anonymous hash
+ $person->{AGE} = 24; # set field AGE to 24
+ $person->{NAME} = "Nat"; # set field NAME to "Nat"
+
+If you're looking for something a bit more rigorous, try L<perltoot>.
+
+=head2 How do I create a module?
+
+(contributed by brian d foy)
+
+L<perlmod>, L<perlmodlib>, L<perlmodstyle> explain modules
+in all the gory details. L<perlnewmod> gives a brief
+overview of the process along with a couple of suggestions
+about style.
+
+If you need to include C code or C library interfaces in
+your module, you'll need h2xs. h2xs will create the module
+distribution structure and the initial interface files
+you'll need. L<perlxs> and L<perlxstut> explain the details.
+
+If you don't need to use C code, other tools such as
+ExtUtils::ModuleMaker and Module::Starter, can help you
+create a skeleton module distribution.
+
+You may also want to see Sam Tregar's "Writing Perl Modules
+for CPAN" ( http://apress.com/book/bookDisplay.html?bID=14 )
+which is the best hands-on guide to creating module
+distributions.
+
+=head2 How do I adopt or take over a module already on CPAN?
+
+(contributed by brian d foy)
+
+The full answer to this can be found at
+http://cpan.org/modules/04pause.html#takeover
+
+The easiest way to take over a module is to have the current
+module maintainer either make you a co-maintainer or transfer
+the module to you.
+
+If you can't reach the author for some reason (e.g. email bounces),
+the PAUSE admins at modules@perl.org can help. The PAUSE admins
+treat each case individually.
+
+=over 4
+
+=item
+
+Get a login for the Perl Authors Upload Server (PAUSE) if you don't
+already have one: http://pause.perl.org
+
+=item
+
+Write to modules@perl.org explaining what you did to contact the
+current maintainer. The PAUSE admins will also try to reach the
+maintainer.
+
+=item
+
+Post a public message in a heavily trafficked site announcing your
+intention to take over the module.
+
+=item
+
+Wait a bit. The PAUSE admins don't want to act too quickly in case
+the current maintainer is on holiday. If there's no response to
+private communication or the public post, a PAUSE admin can transfer
+it to you.
+
+=back
+
+=head2 How do I create a class?
+X<class, creation> X<package>
+
+(contributed by brian d foy)
+
+In Perl, a class is just a package, and methods are just subroutines.
+Perl doesn't get more formal than that and lets you set up the package
+just the way that you like it (that is, it doesn't set up anything for
+you).
+
+The Perl documentation has several tutorials that cover class
+creation, including L<perlboot> (Barnyard Object Oriented Tutorial),
+L<perltoot> (Tom's Object Oriented Tutorial), L<perlbot> (Bag o'
+Object Tricks), and L<perlobj>.
+
+=head2 How can I tell if a variable is tainted?
+
+You can use the tainted() function of the Scalar::Util module, available
+from CPAN (or included with Perl since release 5.8.0).
+See also L<perlsec/"Laundering and Detecting Tainted Data">.
+
+=head2 What's a closure?
+
+Closures are documented in L<perlref>.
+
+I<Closure> is a computer science term with a precise but
+hard-to-explain meaning. Usually, closures are implemented in Perl as
+anonymous subroutines with lasting references to lexical variables
+outside their own scopes. These lexicals magically refer to the
+variables that were around when the subroutine was defined (deep
+binding).
+
+Closures are most often used in programming languages where you can
+have the return value of a function be itself a function, as you can
+in Perl. Note that some languages provide anonymous functions but are
+not capable of providing proper closures: the Python language, for
+example. For more information on closures, check out any textbook on
+functional programming. Scheme is a language that not only supports
+but encourages closures.
+
+Here's a classic non-closure function-generating function:
+
+ sub add_function_generator {
+ return sub { shift() + shift() };
+ }
+
+ $add_sub = add_function_generator();
+ $sum = $add_sub->(4,5); # $sum is 9 now.
+
+The anonymous subroutine returned by add_function_generator() isn't
+technically a closure because it refers to no lexicals outside its own
+scope. Using a closure gives you a I<function template> with some
+customization slots left out to be filled later.
+
+Contrast this with the following make_adder() function, in which the
+returned anonymous function contains a reference to a lexical variable
+outside the scope of that function itself. Such a reference requires
+that Perl return a proper closure, thus locking in for all time the
+value that the lexical had when the function was created.
+
+ sub make_adder {
+ my $addpiece = shift;
+ return sub { shift() + $addpiece };
+ }
+
+ $f1 = make_adder(20);
+ $f2 = make_adder(555);
+
+Now C<&$f1($n)> is always 20 plus whatever $n you pass in, whereas
+C<&$f2($n)> is always 555 plus whatever $n you pass in. The $addpiece
+in the closure sticks around.
+
+Closures are often used for less esoteric purposes. For example, when
+you want to pass in a bit of code into a function:
+
+ my $line;
+ timeout( 30, sub { $line = <STDIN> } );
+
+If the code to execute had been passed in as a string,
+C<< '$line = <STDIN>' >>, there would have been no way for the
+hypothetical timeout() function to access the lexical variable
+$line back in its caller's scope.
+
+Another use for a closure is to make a variable I<private> to a
+named subroutine, e.g. a counter that gets initialized at creation
+time of the sub and can only be modified from within the sub.
+This is sometimes used with a BEGIN block in package files to make
+sure a variable doesn't get meddled with during the lifetime of the
+package:
+
+ BEGIN {
+ my $id = 0;
+ sub next_id { ++$id }
+ }
+
+This is discussed in more detail in L<perlsub>, see the entry on
+I<Persistent Private Variables>.
+
+=head2 What is variable suicide and how can I prevent it?
+
+This problem was fixed in perl 5.004_05, so preventing it means upgrading
+your version of perl. ;)
+
+Variable suicide is when you (temporarily or permanently) lose the value
+of a variable. It is caused by scoping through my() and local()
+interacting with either closures or aliased foreach() iterator variables
+and subroutine arguments. It used to be easy to inadvertently lose a
+variable's value this way, but now it's much harder. Take this code:
+
+ my $f = 'foo';
+ sub T {
+ while ($i++ < 3) { my $f = $f; $f .= "bar"; print $f, "\n" }
+ }
+
+ T;
+ print "Finally $f\n";
+
+If you are experiencing variable suicide, that C<my $f> in the subroutine
+doesn't pick up a fresh copy of the C<$f> whose value is <foo>. The output
+shows that inside the subroutine the value of C<$f> leaks through when it
+shouldn't, as in this output:
+
+ foobar
+ foobarbar
+ foobarbarbar
+ Finally foo
+
+The $f that has "bar" added to it three times should be a new C<$f>
+C<my $f> should create a new lexical variable each time through the loop.
+The expected output is:
+
+ foobar
+ foobar
+ foobar
+ Finally foo
+
+=head2 How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regex}?
+
+With the exception of regexes, you need to pass references to these
+objects. See L<perlsub/"Pass by Reference"> for this particular
+question, and L<perlref> for information on references.
+
+See "Passing Regexes", later in L<perlfaq7>, for information on
+passing regular expressions.
+
+=over 4
+
+=item Passing Variables and Functions
+
+Regular variables and functions are quite easy to pass: just pass in a
+reference to an existing or anonymous variable or function:
+
+ func( \$some_scalar );
+
+ func( \@some_array );
+ func( [ 1 .. 10 ] );
+
+ func( \%some_hash );
+ func( { this => 10, that => 20 } );
+
+ func( \&some_func );
+ func( sub { $_[0] ** $_[1] } );
+
+=item Passing Filehandles
+
+As of Perl 5.6, you can represent filehandles with scalar variables
+which you treat as any other scalar.
+
+ open my $fh, $filename or die "Cannot open $filename! $!";
+ func( $fh );
+
+ sub func {
+ my $passed_fh = shift;
+
+ my $line = <$passed_fh>;
+ }
+
+Before Perl 5.6, you had to use the C<*FH> or C<\*FH> notations.
+These are "typeglobs"--see L<perldata/"Typeglobs and Filehandles">
+and especially L<perlsub/"Pass by Reference"> for more information.
+
+=item Passing Regexes
+
+To pass regexes around, you'll need to be using a release of Perl
+sufficiently recent as to support the C<qr//> construct, pass around
+strings and use an exception-trapping eval, or else be very, very clever.
+
+Here's an example of how to pass in a string to be regex compared
+using C<qr//>:
+
+ sub compare($$) {
+ my ($val1, $regex) = @_;
+ my $retval = $val1 =~ /$regex/;
+ return $retval;
+ }
+ $match = compare("old McDonald", qr/d.*D/i);
+
+Notice how C<qr//> allows flags at the end. That pattern was compiled
+at compile time, although it was executed later. The nifty C<qr//>
+notation wasn't introduced until the 5.005 release. Before that, you
+had to approach this problem much less intuitively. For example, here
+it is again if you don't have C<qr//>:
+
+ sub compare($$) {
+ my ($val1, $regex) = @_;
+ my $retval = eval { $val1 =~ /$regex/ };
+ die if $@;
+ return $retval;
+ }
+
+ $match = compare("old McDonald", q/($?i)d.*D/);
+
+Make sure you never say something like this:
+
+ return eval "\$val =~ /$regex/"; # WRONG
+
+or someone can sneak shell escapes into the regex due to the double
+interpolation of the eval and the double-quoted string. For example:
+
+ $pattern_of_evil = 'danger ${ system("rm -rf * &") } danger';
+
+ eval "\$string =~ /$pattern_of_evil/";
+
+Those preferring to be very, very clever might see the O'Reilly book,
+I<Mastering Regular Expressions>, by Jeffrey Friedl. Page 273's
+Build_MatchMany_Function() is particularly interesting. A complete
+citation of this book is given in L<perlfaq2>.
+
+=item Passing Methods
+
+To pass an object method into a subroutine, you can do this:
+
+ call_a_lot(10, $some_obj, "methname")
+ sub call_a_lot {
+ my ($count, $widget, $trick) = @_;
+ for (my $i = 0; $i < $count; $i++) {
+ $widget->$trick();
+ }
+ }
+
+Or, you can use a closure to bundle up the object, its
+method call, and arguments:
+
+ my $whatnot = sub { $some_obj->obfuscate(@args) };
+ func($whatnot);
+ sub func {
+ my $code = shift;
+ &$code();
+ }
+
+You could also investigate the can() method in the UNIVERSAL class
+(part of the standard perl distribution).
+
+=back
+
+=head2 How do I create a static variable?
+
+(contributed by brian d foy)
+
+In Perl 5.10, declare the variable with C<state>. The C<state>
+declaration creates the lexical variable that persists between calls
+to the subroutine:
+
+ sub counter { state $count = 1; $counter++ }
+
+You can fake a static variable by using a lexical variable which goes
+out of scope. In this example, you define the subroutine C<counter>, and
+it uses the lexical variable C<$count>. Since you wrap this in a BEGIN
+block, C<$count> is defined at compile-time, but also goes out of
+scope at the end of the BEGIN block. The BEGIN block also ensures that
+the subroutine and the value it uses is defined at compile-time so the
+subroutine is ready to use just like any other subroutine, and you can
+put this code in the same place as other subroutines in the program
+text (i.e. at the end of the code, typically). The subroutine
+C<counter> still has a reference to the data, and is the only way you
+can access the value (and each time you do, you increment the value).
+The data in chunk of memory defined by C<$count> is private to
+C<counter>.
+
+ BEGIN {
+ my $count = 1;
+ sub counter { $count++ }
+ }
+
+ my $start = counter();
+
+ .... # code that calls counter();
+
+ my $end = counter();
+
+In the previous example, you created a function-private variable
+because only one function remembered its reference. You could define
+multiple functions while the variable is in scope, and each function
+can share the "private" variable. It's not really "static" because you
+can access it outside the function while the lexical variable is in
+scope, and even create references to it. In this example,
+C<increment_count> and C<return_count> share the variable. One
+function adds to the value and the other simply returns the value.
+They can both access C<$count>, and since it has gone out of scope,
+there is no other way to access it.
+
+ BEGIN {
+ my $count = 1;
+ sub increment_count { $count++ }
+ sub return_count { $count }
+ }
+
+To declare a file-private variable, you still use a lexical variable.
+A file is also a scope, so a lexical variable defined in the file
+cannot be seen from any other file.
+
+See L<perlsub/"Persistent Private Variables"> for more information.
+The discussion of closures in L<perlref> may help you even though we
+did not use anonymous subroutines in this answer. See
+L<perlsub/"Persistent Private Variables"> for details.
+
+=head2 What's the difference between dynamic and lexical (static) scoping? Between local() and my()?
+
+C<local($x)> saves away the old value of the global variable C<$x>
+and assigns a new value for the duration of the subroutine I<which is
+visible in other functions called from that subroutine>. This is done
+at run-time, so is called dynamic scoping. local() always affects global
+variables, also called package variables or dynamic variables.
+
+C<my($x)> creates a new variable that is only visible in the current
+subroutine. This is done at compile-time, so it is called lexical or
+static scoping. my() always affects private variables, also called
+lexical variables or (improperly) static(ly scoped) variables.
+
+For instance:
+
+ sub visible {
+ print "var has value $var\n";
+ }
+
+ sub dynamic {
+ local $var = 'local'; # new temporary value for the still-global
+ visible(); # variable called $var
+ }
+
+ sub lexical {
+ my $var = 'private'; # new private variable, $var
+ visible(); # (invisible outside of sub scope)
+ }
+
+ $var = 'global';
+
+ visible(); # prints global
+ dynamic(); # prints local
+ lexical(); # prints global
+
+Notice how at no point does the value "private" get printed. That's
+because $var only has that value within the block of the lexical()
+function, and it is hidden from called subroutine.
+
+In summary, local() doesn't make what you think of as private, local
+variables. It gives a global variable a temporary value. my() is
+what you're looking for if you want private variables.
+
+See L<perlsub/"Private Variables via my()"> and
+L<perlsub/"Temporary Values via local()"> for excruciating details.
+
+=head2 How can I access a dynamic variable while a similarly named lexical is in scope?
+
+If you know your package, you can just mention it explicitly, as in
+$Some_Pack::var. Note that the notation $::var is B<not> the dynamic $var
+in the current package, but rather the one in the "main" package, as
+though you had written $main::var.
+
+ use vars '$var';
+ local $var = "global";
+ my $var = "lexical";
+
+ print "lexical is $var\n";
+ print "global is $main::var\n";
+
+Alternatively you can use the compiler directive our() to bring a
+dynamic variable into the current lexical scope.
+
+ require 5.006; # our() did not exist before 5.6
+ use vars '$var';
+
+ local $var = "global";
+ my $var = "lexical";
+
+ print "lexical is $var\n";
+
+ {
+ our $var;
+ print "global is $var\n";
+ }
+
+=head2 What's the difference between deep and shallow binding?
+
+In deep binding, lexical variables mentioned in anonymous subroutines
+are the same ones that were in scope when the subroutine was created.
+In shallow binding, they are whichever variables with the same names
+happen to be in scope when the subroutine is called. Perl always uses
+deep binding of lexical variables (i.e., those created with my()).
+However, dynamic variables (aka global, local, or package variables)
+are effectively shallowly bound. Consider this just one more reason
+not to use them. See the answer to L<"What's a closure?">.
+
+=head2 Why doesn't "my($foo) = E<lt>FILEE<gt>;" work right?
+
+C<my()> and C<local()> give list context to the right hand side
+of C<=>. The <FH> read operation, like so many of Perl's
+functions and operators, can tell which context it was called in and
+behaves appropriately. In general, the scalar() function can help.
+This function does nothing to the data itself (contrary to popular myth)
+but rather tells its argument to behave in whatever its scalar fashion is.
+If that function doesn't have a defined scalar behavior, this of course
+doesn't help you (such as with sort()).
+
+To enforce scalar context in this particular case, however, you need
+merely omit the parentheses:
+
+ local($foo) = <FILE>; # WRONG
+ local($foo) = scalar(<FILE>); # ok
+ local $foo = <FILE>; # right
+
+You should probably be using lexical variables anyway, although the
+issue is the same here:
+
+ my($foo) = <FILE>; # WRONG
+ my $foo = <FILE>; # right
+
+=head2 How do I redefine a builtin function, operator, or method?
+
+Why do you want to do that? :-)
+
+If you want to override a predefined function, such as open(),
+then you'll have to import the new definition from a different
+module. See L<perlsub/"Overriding Built-in Functions">. There's
+also an example in L<perltoot/"Class::Template">.
+
+If you want to overload a Perl operator, such as C<+> or C<**>,
+then you'll want to use the C<use overload> pragma, documented
+in L<overload>.
+
+If you're talking about obscuring method calls in parent classes,
+see L<perltoot/"Overridden Methods">.
+
+=head2 What's the difference between calling a function as &foo and foo()?
+
+(contributed by brian d foy)
+
+Calling a subroutine as C<&foo> with no trailing parentheses ignores
+the prototype of C<foo> and passes it the current value of the argumet
+list, C<@_>. Here's an example; the C<bar> subroutine calls C<&foo>,
+which prints what its arguments list:
+
+ sub bar { &foo }
+
+ sub foo { print "Args in foo are: @_\n" }
+
+ bar( qw( a b c ) );
+
+When you call C<bar> with arguments, you see that C<foo> got the same C<@_>:
+
+ Args in foo are: a b c
+
+Calling the subroutine with trailing parentheses, with or without arguments,
+does not use the current C<@_> and respects the subroutine prototype. Changing
+the example to put parentheses after the call to C<foo> changes the program:
+
+ sub bar { &foo() }
+
+ sub foo { print "Args in foo are: @_\n" }
+
+ bar( qw( a b c ) );
+
+Now the output shows that C<foo> doesn't get the C<@_> from its caller.
+
+ Args in foo are:
+
+The main use of the C<@_> pass-through feature is to write subroutines
+whose main job it is to call other subroutines for you. For further
+details, see L<perlsub>.
+
+=head2 How do I create a switch or case statement?
+
+In Perl 5.10, use the C<given-when> construct described in L<perlsyn>:
+
+ use 5.010;
+
+ given ( $string ) {
+ when( 'Fred' ) { say "I found Fred!" }
+ when( 'Barney' ) { say "I found Barney!" }
+ when( /Bamm-?Bamm/ ) { say "I found Bamm-Bamm!" }
+ default { say "I don't recognize the name!" }
+ };
+
+If one wants to use pure Perl and to be compatible with Perl versions
+prior to 5.10, the general answer is to use C<if-elsif-else>:
+
+ for ($variable_to_test) {
+ if (/pat1/) { } # do something
+ elsif (/pat2/) { } # do something else
+ elsif (/pat3/) { } # do something else
+ else { } # default
+ }
+
+Here's a simple example of a switch based on pattern matching,
+lined up in a way to make it look more like a switch statement.
+We'll do a multiway conditional based on the type of reference stored
+in $whatchamacallit:
+
+ SWITCH: for (ref $whatchamacallit) {
+
+ /^$/ && die "not a reference";
+
+ /SCALAR/ && do {
+ print_scalar($$ref);
+ last SWITCH;
+ };
+
+ /ARRAY/ && do {
+ print_array(@$ref);
+ last SWITCH;
+ };
+
+ /HASH/ && do {
+ print_hash(%$ref);
+ last SWITCH;
+ };
+
+ /CODE/ && do {
+ warn "can't print function ref";
+ last SWITCH;
+ };
+
+ # DEFAULT
+
+ warn "User defined type skipped";
+
+ }
+
+See L<perlsyn> for other examples in this style.
+
+Sometimes you should change the positions of the constant and the variable.
+For example, let's say you wanted to test which of many answers you were
+given, but in a case-insensitive way that also allows abbreviations.
+You can use the following technique if the strings all start with
+different characters or if you want to arrange the matches so that
+one takes precedence over another, as C<"SEND"> has precedence over
+C<"STOP"> here:
+
+ chomp($answer = <>);
+ if ("SEND" =~ /^\Q$answer/i) { print "Action is send\n" }
+ elsif ("STOP" =~ /^\Q$answer/i) { print "Action is stop\n" }
+ elsif ("ABORT" =~ /^\Q$answer/i) { print "Action is abort\n" }
+ elsif ("LIST" =~ /^\Q$answer/i) { print "Action is list\n" }
+ elsif ("EDIT" =~ /^\Q$answer/i) { print "Action is edit\n" }
+
+A totally different approach is to create a hash of function references.
+
+ my %commands = (
+ "happy" => \&joy,
+ "sad", => \&sullen,
+ "done" => sub { die "See ya!" },
+ "mad" => \&angry,
+ );
+
+ print "How are you? ";
+ chomp($string = <STDIN>);
+ if ($commands{$string}) {
+ $commands{$string}->();
+ } else {
+ print "No such command: $string\n";
+ }
+
+Starting from Perl 5.8, a source filter module, C<Switch>, can also be
+used to get switch and case. Its use is now discouraged, because it's
+not fully compatible with the native switch of Perl 5.10, and because,
+as it's implemented as a source filter, it doesn't always work as intended
+when complex syntax is involved.
+
+=head2 How can I catch accesses to undefined variables, functions, or methods?
+
+The AUTOLOAD method, discussed in L<perlsub/"Autoloading"> and
+L<perltoot/"AUTOLOAD: Proxy Methods">, lets you capture calls to
+undefined functions and methods.
+
+When it comes to undefined variables that would trigger a warning
+under C<use warnings>, you can promote the warning to an error.
+
+ use warnings FATAL => qw(uninitialized);
+
+=head2 Why can't a method included in this same file be found?
+
+Some possible reasons: your inheritance is getting confused, you've
+misspelled the method name, or the object is of the wrong type. Check
+out L<perltoot> for details about any of the above cases. You may
+also use C<print ref($object)> to find out the class C<$object> was
+blessed into.
+
+Another possible reason for problems is because you've used the
+indirect object syntax (eg, C<find Guru "Samy">) on a class name
+before Perl has seen that such a package exists. It's wisest to make
+sure your packages are all defined before you start using them, which
+will be taken care of if you use the C<use> statement instead of
+C<require>. If not, make sure to use arrow notation (eg.,
+C<< Guru->find("Samy") >>) instead. Object notation is explained in
+L<perlobj>.
+
+Make sure to read about creating modules in L<perlmod> and
+the perils of indirect objects in L<perlobj/"Method Invocation">.
+
+=head2 How can I find out my current or calling package?
+
+(contributed by brian d foy)
+
+To find the package you are currently in, use the special literal
+C<__PACKAGE__>, as documented in L<perldata>. You can only use the
+special literals as separate tokens, so you can't interpolate them
+into strings like you can with variables:
+
+ my $current_package = __PACKAGE__;
+ print "I am in package $current_package\n";
+
+This is different from finding out the package an object is blessed
+into, which might not be the current package. For that, use C<blessed>
+from C<Scalar::Util>, part of the Standard Library since Perl 5.8:
+
+ use Scalar::Util qw(blessed);
+ my $object_package = blessed( $object );
+
+Most of the time, you shouldn't care what package an object is blessed
+into, however, as long as it claims to inherit from that class:
+
+ my $is_right_class = eval { $object->isa( $package ) }; # true or false
+
+If you want to find the package calling your code, perhaps to give better
+diagnostics as C<Carp> does, use the C<caller> built-in:
+
+ sub foo {
+ my @args = ...;
+ my( $package, $filename, $line ) = caller;
+
+ print "I was called from package $package\n";
+ );
+
+By default, your program starts in package C<main>, so you should
+always be in some package unless someone uses the C<package> built-in
+with no namespace. See the C<package> entry in L<perlfunc> for the
+details of empty packges.
+
+=head2 How can I comment out a large block of Perl code?
+
+(contributed by brian d foy)
+
+The quick-and-dirty way to comment out more than one line of Perl is
+to surround those lines with Pod directives. You have to put these
+directives at the beginning of the line and somewhere where Perl
+expects a new statement (so not in the middle of statements like the #
+comments). You end the comment with C<=cut>, ending the Pod section:
+
+ =pod
+
+ my $object = NotGonnaHappen->new();
+
+ ignored_sub();
+
+ $wont_be_assigned = 37;
+
+ =cut
+
+The quick-and-dirty method only works well when you don't plan to
+leave the commented code in the source. If a Pod parser comes along,
+you're multiline comment is going to show up in the Pod translation.
+A better way hides it from Pod parsers as well.
+
+The C<=begin> directive can mark a section for a particular purpose.
+If the Pod parser doesn't want to handle it, it just ignores it. Label
+the comments with C<comment>. End the comment using C<=end> with the
+same label. You still need the C<=cut> to go back to Perl code from
+the Pod comment:
+
+ =begin comment
+
+ my $object = NotGonnaHappen->new();
+
+ ignored_sub();
+
+ $wont_be_assigned = 37;
+
+ =end comment
+
+ =cut
+
+For more information on Pod, check out L<perlpod> and L<perlpodspec>.
+
+=head2 How do I clear a package?
+
+Use this code, provided by Mark-Jason Dominus:
+
+ sub scrub_package {
+ no strict 'refs';
+ my $pack = shift;
+ die "Shouldn't delete main package"
+ if $pack eq "" || $pack eq "main";
+ my $stash = *{$pack . '::'}{HASH};
+ my $name;
+ foreach $name (keys %$stash) {
+ my $fullname = $pack . '::' . $name;
+ # Get rid of everything with that name.
+ undef $$fullname;
+ undef @$fullname;
+ undef %$fullname;
+ undef &$fullname;
+ undef *$fullname;
+ }
+ }
+
+Or, if you're using a recent release of Perl, you can
+just use the Symbol::delete_package() function instead.
+
+=head2 How can I use a variable as a variable name?
+
+Beginners often think they want to have a variable contain the name
+of a variable.
+
+ $fred = 23;
+ $varname = "fred";
+ ++$$varname; # $fred now 24
+
+This works I<sometimes>, but it is a very bad idea for two reasons.
+
+The first reason is that this technique I<only works on global
+variables>. That means that if $fred is a lexical variable created
+with my() in the above example, the code wouldn't work at all: you'd
+accidentally access the global and skip right over the private lexical
+altogether. Global variables are bad because they can easily collide
+accidentally and in general make for non-scalable and confusing code.
+
+Symbolic references are forbidden under the C<use strict> pragma.
+They are not true references and consequently are not reference counted
+or garbage collected.
+
+The other reason why using a variable to hold the name of another
+variable is a bad idea is that the question often stems from a lack of
+understanding of Perl data structures, particularly hashes. By using
+symbolic references, you are just using the package's symbol-table hash
+(like C<%main::>) instead of a user-defined hash. The solution is to
+use your own hash or a real reference instead.
+
+ $USER_VARS{"fred"} = 23;
+ $varname = "fred";
+ $USER_VARS{$varname}++; # not $$varname++
+
+There we're using the %USER_VARS hash instead of symbolic references.
+Sometimes this comes up in reading strings from the user with variable
+references and wanting to expand them to the values of your perl
+program's variables. This is also a bad idea because it conflates the
+program-addressable namespace and the user-addressable one. Instead of
+reading a string and expanding it to the actual contents of your program's
+own variables:
+
+ $str = 'this has a $fred and $barney in it';
+ $str =~ s/(\$\w+)/$1/eeg; # need double eval
+
+it would be better to keep a hash around like %USER_VARS and have
+variable references actually refer to entries in that hash:
+
+ $str =~ s/\$(\w+)/$USER_VARS{$1}/g; # no /e here at all
+
+That's faster, cleaner, and safer than the previous approach. Of course,
+you don't need to use a dollar sign. You could use your own scheme to
+make it less confusing, like bracketed percent symbols, etc.
+
+ $str = 'this has a %fred% and %barney% in it';
+ $str =~ s/%(\w+)%/$USER_VARS{$1}/g; # no /e here at all
+
+Another reason that folks sometimes think they want a variable to
+contain the name of a variable is because they don't know how to build
+proper data structures using hashes. For example, let's say they
+wanted two hashes in their program: %fred and %barney, and that they
+wanted to use another scalar variable to refer to those by name.
+
+ $name = "fred";
+ $$name{WIFE} = "wilma"; # set %fred
+
+ $name = "barney";
+ $$name{WIFE} = "betty"; # set %barney
+
+This is still a symbolic reference, and is still saddled with the
+problems enumerated above. It would be far better to write:
+
+ $folks{"fred"}{WIFE} = "wilma";
+ $folks{"barney"}{WIFE} = "betty";
+
+And just use a multilevel hash to start with.
+
+The only times that you absolutely I<must> use symbolic references are
+when you really must refer to the symbol table. This may be because it's
+something that can't take a real reference to, such as a format name.
+Doing so may also be important for method calls, since these always go
+through the symbol table for resolution.
+
+In those cases, you would turn off C<strict 'refs'> temporarily so you
+can play around with the symbol table. For example:
+
+ @colors = qw(red blue green yellow orange purple violet);
+ for my $name (@colors) {
+ no strict 'refs'; # renege for the block
+ *$name = sub { "<FONT COLOR='$name'>@_</FONT>" };
+ }
+
+All those functions (red(), blue(), green(), etc.) appear to be separate,
+but the real code in the closure actually was compiled only once.
+
+So, sometimes you might want to use symbolic references to directly
+manipulate the symbol table. This doesn't matter for formats, handles, and
+subroutines, because they are always global--you can't use my() on them.
+For scalars, arrays, and hashes, though--and usually for subroutines--
+you probably only want to use hard references.
+
+=head2 What does "bad interpreter" mean?
+
+(contributed by brian d foy)
+
+The "bad interpreter" message comes from the shell, not perl. The
+actual message may vary depending on your platform, shell, and locale
+settings.
+
+If you see "bad interpreter - no such file or directory", the first
+line in your perl script (the "shebang" line) does not contain the
+right path to perl (or any other program capable of running scripts).
+Sometimes this happens when you move the script from one machine to
+another and each machine has a different path to perl--/usr/bin/perl
+versus /usr/local/bin/perl for instance. It may also indicate
+that the source machine has CRLF line terminators and the
+destination machine has LF only: the shell tries to find
+/usr/bin/perl<CR>, but can't.
+
+If you see "bad interpreter: Permission denied", you need to make your
+script executable.
+
+In either case, you should still be able to run the scripts with perl
+explicitly:
+
+ % perl script.pl
+
+If you get a message like "perl: command not found", perl is not in
+your PATH, which might also mean that the location of perl is not
+where you expect it so you need to adjust your shebang line.
+
+=head1 REVISION
+
+Revision: $Revision$
+
+Date: $Date$
+
+See L<perlfaq> for source control details and availability.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2009 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain. You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit. A simple comment in the code giving
+credit would be courteous but is not required.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfaq8.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq8.pod
new file mode 100755
index 00000000000..78039f96f2e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq8.pod
@@ -0,0 +1,1390 @@
+=head1 NAME
+
+perlfaq8 - System Interaction
+
+=head1 DESCRIPTION
+
+This section of the Perl FAQ covers questions involving operating
+system interaction. Topics include interprocess communication (IPC),
+control over the user-interface (keyboard, screen and pointing
+devices), and most anything else not related to data manipulation.
+
+Read the FAQs and documentation specific to the port of perl to your
+operating system (eg, L<perlvms>, L<perlplan9>, ...). These should
+contain more detailed information on the vagaries of your perl.
+
+=head2 How do I find out which operating system I'm running under?
+
+The $^O variable ($OSNAME if you use English) contains an indication of
+the name of the operating system (not its release number) that your perl
+binary was built for.
+
+=head2 How come exec() doesn't return?
+X<exec> X<system> X<fork> X<open> X<pipe>
+
+(contributed by brian d foy)
+
+The C<exec> function's job is to turn your process into another
+command and never to return. If that's not what you want to do, don't
+use C<exec>. :)
+
+If you want to run an external command and still keep your Perl process
+going, look at a piped C<open>, C<fork>, or C<system>.
+
+=head2 How do I do fancy stuff with the keyboard/screen/mouse?
+
+How you access/control keyboards, screens, and pointing devices
+("mice") is system-dependent. Try the following modules:
+
+=over 4
+
+=item Keyboard
+
+ Term::Cap Standard perl distribution
+ Term::ReadKey CPAN
+ Term::ReadLine::Gnu CPAN
+ Term::ReadLine::Perl CPAN
+ Term::Screen CPAN
+
+=item Screen
+
+ Term::Cap Standard perl distribution
+ Curses CPAN
+ Term::ANSIColor CPAN
+
+=item Mouse
+
+ Tk CPAN
+
+=back
+
+Some of these specific cases are shown as examples in other answers
+in this section of the perlfaq.
+
+=head2 How do I print something out in color?
+
+In general, you don't, because you don't know whether
+the recipient has a color-aware display device. If you
+know that they have an ANSI terminal that understands
+color, you can use the Term::ANSIColor module from CPAN:
+
+ use Term::ANSIColor;
+ print color("red"), "Stop!\n", color("reset");
+ print color("green"), "Go!\n", color("reset");
+
+Or like this:
+
+ use Term::ANSIColor qw(:constants);
+ print RED, "Stop!\n", RESET;
+ print GREEN, "Go!\n", RESET;
+
+=head2 How do I read just one key without waiting for a return key?
+
+Controlling input buffering is a remarkably system-dependent matter.
+On many systems, you can just use the B<stty> command as shown in
+L<perlfunc/getc>, but as you see, that's already getting you into
+portability snags.
+
+ open(TTY, "+</dev/tty") or die "no tty: $!";
+ system "stty cbreak </dev/tty >/dev/tty 2>&1";
+ $key = getc(TTY); # perhaps this works
+ # OR ELSE
+ sysread(TTY, $key, 1); # probably this does
+ system "stty -cbreak </dev/tty >/dev/tty 2>&1";
+
+The Term::ReadKey module from CPAN offers an easy-to-use interface that
+should be more efficient than shelling out to B<stty> for each key.
+It even includes limited support for Windows.
+
+ use Term::ReadKey;
+ ReadMode('cbreak');
+ $key = ReadKey(0);
+ ReadMode('normal');
+
+However, using the code requires that you have a working C compiler
+and can use it to build and install a CPAN module. Here's a solution
+using the standard POSIX module, which is already on your systems
+(assuming your system supports POSIX).
+
+ use HotKey;
+ $key = readkey();
+
+And here's the HotKey module, which hides the somewhat mystifying calls
+to manipulate the POSIX termios structures.
+
+ # HotKey.pm
+ package HotKey;
+
+ @ISA = qw(Exporter);
+ @EXPORT = qw(cbreak cooked readkey);
+
+ use strict;
+ use POSIX qw(:termios_h);
+ my ($term, $oterm, $echo, $noecho, $fd_stdin);
+
+ $fd_stdin = fileno(STDIN);
+ $term = POSIX::Termios->new();
+ $term->getattr($fd_stdin);
+ $oterm = $term->getlflag();
+
+ $echo = ECHO | ECHOK | ICANON;
+ $noecho = $oterm & ~$echo;
+
+ sub cbreak {
+ $term->setlflag($noecho); # ok, so i don't want echo either
+ $term->setcc(VTIME, 1);
+ $term->setattr($fd_stdin, TCSANOW);
+ }
+
+ sub cooked {
+ $term->setlflag($oterm);
+ $term->setcc(VTIME, 0);
+ $term->setattr($fd_stdin, TCSANOW);
+ }
+
+ sub readkey {
+ my $key = '';
+ cbreak();
+ sysread(STDIN, $key, 1);
+ cooked();
+ return $key;
+ }
+
+ END { cooked() }
+
+ 1;
+
+=head2 How do I check whether input is ready on the keyboard?
+
+The easiest way to do this is to read a key in nonblocking mode with the
+Term::ReadKey module from CPAN, passing it an argument of -1 to indicate
+not to block:
+
+ use Term::ReadKey;
+
+ ReadMode('cbreak');
+
+ if (defined ($char = ReadKey(-1)) ) {
+ # input was waiting and it was $char
+ } else {
+ # no input was waiting
+ }
+
+ ReadMode('normal'); # restore normal tty settings
+
+=head2 How do I clear the screen?
+
+(contributed by brian d foy)
+
+To clear the screen, you just have to print the special sequence
+that tells the terminal to clear the screen. Once you have that
+sequence, output it when you want to clear the screen.
+
+You can use the C<Term::ANSIScreen> module to get the special
+sequence. Import the C<cls> function (or the C<:screen> tag):
+
+ use Term::ANSIScreen qw(cls);
+ my $clear_screen = cls();
+
+ print $clear_screen;
+
+The C<Term::Cap> module can also get the special sequence if you want
+to deal with the low-level details of terminal control. The C<Tputs>
+method returns the string for the given capability:
+
+ use Term::Cap;
+
+ $terminal = Term::Cap->Tgetent( { OSPEED => 9600 } );
+ $clear_string = $terminal->Tputs('cl');
+
+ print $clear_screen;
+
+On Windows, you can use the C<Win32::Console> module. After creating
+an object for the output filehandle you want to affect, call the
+C<Cls> method:
+
+ Win32::Console;
+
+ $OUT = Win32::Console->new(STD_OUTPUT_HANDLE);
+ my $clear_string = $OUT->Cls;
+
+ print $clear_screen;
+
+If you have a command-line program that does the job, you can call
+it in backticks to capture whatever it outputs so you can use it
+later:
+
+ $clear_string = `clear`;
+
+ print $clear_string;
+
+=head2 How do I get the screen size?
+
+If you have Term::ReadKey module installed from CPAN,
+you can use it to fetch the width and height in characters
+and in pixels:
+
+ use Term::ReadKey;
+ ($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize();
+
+This is more portable than the raw C<ioctl>, but not as
+illustrative:
+
+ require 'sys/ioctl.ph';
+ die "no TIOCGWINSZ " unless defined &TIOCGWINSZ;
+ open(TTY, "+</dev/tty") or die "No tty: $!";
+ unless (ioctl(TTY, &TIOCGWINSZ, $winsize='')) {
+ die sprintf "$0: ioctl TIOCGWINSZ (%08x: $!)\n", &TIOCGWINSZ;
+ }
+ ($row, $col, $xpixel, $ypixel) = unpack('S4', $winsize);
+ print "(row,col) = ($row,$col)";
+ print " (xpixel,ypixel) = ($xpixel,$ypixel)" if $xpixel || $ypixel;
+ print "\n";
+
+=head2 How do I ask the user for a password?
+
+(This question has nothing to do with the web. See a different
+FAQ for that.)
+
+There's an example of this in L<perlfunc/crypt>). First, you put the
+terminal into "no echo" mode, then just read the password normally.
+You may do this with an old-style ioctl() function, POSIX terminal
+control (see L<POSIX> or its documentation the Camel Book), or a call
+to the B<stty> program, with varying degrees of portability.
+
+You can also do this for most systems using the Term::ReadKey module
+from CPAN, which is easier to use and in theory more portable.
+
+ use Term::ReadKey;
+
+ ReadMode('noecho');
+ $password = ReadLine(0);
+
+=head2 How do I read and write the serial port?
+
+This depends on which operating system your program is running on. In
+the case of Unix, the serial ports will be accessible through files in
+/dev; on other systems, device names will doubtless differ.
+Several problem areas common to all device interaction are the
+following:
+
+=over 4
+
+=item lockfiles
+
+Your system may use lockfiles to control multiple access. Make sure
+you follow the correct protocol. Unpredictable behavior can result
+from multiple processes reading from one device.
+
+=item open mode
+
+If you expect to use both read and write operations on the device,
+you'll have to open it for update (see L<perlfunc/"open"> for
+details). You may wish to open it without running the risk of
+blocking by using sysopen() and C<O_RDWR|O_NDELAY|O_NOCTTY> from the
+Fcntl module (part of the standard perl distribution). See
+L<perlfunc/"sysopen"> for more on this approach.
+
+=item end of line
+
+Some devices will be expecting a "\r" at the end of each line rather
+than a "\n". In some ports of perl, "\r" and "\n" are different from
+their usual (Unix) ASCII values of "\012" and "\015". You may have to
+give the numeric values you want directly, using octal ("\015"), hex
+("0x0D"), or as a control-character specification ("\cM").
+
+ print DEV "atv1\012"; # wrong, for some devices
+ print DEV "atv1\015"; # right, for some devices
+
+Even though with normal text files a "\n" will do the trick, there is
+still no unified scheme for terminating a line that is portable
+between Unix, DOS/Win, and Macintosh, except to terminate I<ALL> line
+ends with "\015\012", and strip what you don't need from the output.
+This applies especially to socket I/O and autoflushing, discussed
+next.
+
+=item flushing output
+
+If you expect characters to get to your device when you print() them,
+you'll want to autoflush that filehandle. You can use select()
+and the C<$|> variable to control autoflushing (see L<perlvar/$E<verbar>>
+and L<perlfunc/select>, or L<perlfaq5>, "How do I flush/unbuffer an
+output filehandle? Why must I do this?"):
+
+ $oldh = select(DEV);
+ $| = 1;
+ select($oldh);
+
+You'll also see code that does this without a temporary variable, as in
+
+ select((select(DEV), $| = 1)[0]);
+
+Or if you don't mind pulling in a few thousand lines
+of code just because you're afraid of a little $| variable:
+
+ use IO::Handle;
+ DEV->autoflush(1);
+
+As mentioned in the previous item, this still doesn't work when using
+socket I/O between Unix and Macintosh. You'll need to hard code your
+line terminators, in that case.
+
+=item non-blocking input
+
+If you are doing a blocking read() or sysread(), you'll have to
+arrange for an alarm handler to provide a timeout (see
+L<perlfunc/alarm>). If you have a non-blocking open, you'll likely
+have a non-blocking read, which means you may have to use a 4-arg
+select() to determine whether I/O is ready on that device (see
+L<perlfunc/"select">.
+
+=back
+
+While trying to read from his caller-id box, the notorious Jamie Zawinski
+C<< <jwz@netscape.com> >>, after much gnashing of teeth and fighting with sysread,
+sysopen, POSIX's tcgetattr business, and various other functions that
+go bump in the night, finally came up with this:
+
+ sub open_modem {
+ use IPC::Open2;
+ my $stty = `/bin/stty -g`;
+ open2( \*MODEM_IN, \*MODEM_OUT, "cu -l$modem_device -s2400 2>&1");
+ # starting cu hoses /dev/tty's stty settings, even when it has
+ # been opened on a pipe...
+ system("/bin/stty $stty");
+ $_ = <MODEM_IN>;
+ chomp;
+ if ( !m/^Connected/ ) {
+ print STDERR "$0: cu printed `$_' instead of `Connected'\n";
+ }
+ }
+
+=head2 How do I decode encrypted password files?
+
+You spend lots and lots of money on dedicated hardware, but this is
+bound to get you talked about.
+
+Seriously, you can't if they are Unix password files--the Unix
+password system employs one-way encryption. It's more like hashing
+than encryption. The best you can do is check whether something else
+hashes to the same string. You can't turn a hash back into the
+original string. Programs like Crack can forcibly (and intelligently)
+try to guess passwords, but don't (can't) guarantee quick success.
+
+If you're worried about users selecting bad passwords, you should
+proactively check when they try to change their password (by modifying
+passwd(1), for example).
+
+=head2 How do I start a process in the background?
+
+(contributed by brian d foy)
+
+There's not a single way to run code in the background so you don't
+have to wait for it to finish before your program moves on to other
+tasks. Process management depends on your particular operating system,
+and many of the techniques are in L<perlipc>.
+
+Several CPAN modules may be able to help, including IPC::Open2 or
+IPC::Open3, IPC::Run, Parallel::Jobs, Parallel::ForkManager, POE,
+Proc::Background, and Win32::Process. There are many other modules you
+might use, so check those namespaces for other options too.
+
+If you are on a unix-like system, you might be able to get away with a
+system call where you put an C<&> on the end of the command:
+
+ system("cmd &")
+
+You can also try using C<fork>, as described in L<perlfunc> (although
+this is the same thing that many of the modules will do for you).
+
+=over 4
+
+=item STDIN, STDOUT, and STDERR are shared
+
+Both the main process and the backgrounded one (the "child" process)
+share the same STDIN, STDOUT and STDERR filehandles. If both try to
+access them at once, strange things can happen. You may want to close
+or reopen these for the child. You can get around this with
+C<open>ing a pipe (see L<perlfunc/"open">) but on some systems this
+means that the child process cannot outlive the parent.
+
+=item Signals
+
+You'll have to catch the SIGCHLD signal, and possibly SIGPIPE too.
+SIGCHLD is sent when the backgrounded process finishes. SIGPIPE is
+sent when you write to a filehandle whose child process has closed (an
+untrapped SIGPIPE can cause your program to silently die). This is
+not an issue with C<system("cmd&")>.
+
+=item Zombies
+
+You have to be prepared to "reap" the child process when it finishes.
+
+ $SIG{CHLD} = sub { wait };
+
+ $SIG{CHLD} = 'IGNORE';
+
+You can also use a double fork. You immediately wait() for your
+first child, and the init daemon will wait() for your grandchild once
+it exits.
+
+ unless ($pid = fork) {
+ unless (fork) {
+ exec "what you really wanna do";
+ die "exec failed!";
+ }
+ exit 0;
+ }
+ waitpid($pid, 0);
+
+See L<perlipc/"Signals"> for other examples of code to do this.
+Zombies are not an issue with C<system("prog &")>.
+
+=back
+
+=head2 How do I trap control characters/signals?
+
+You don't actually "trap" a control character. Instead, that character
+generates a signal which is sent to your terminal's currently
+foregrounded process group, which you then trap in your process.
+Signals are documented in L<perlipc/"Signals"> and the
+section on "Signals" in the Camel.
+
+You can set the values of the %SIG hash to be the functions you want
+to handle the signal. After perl catches the signal, it looks in %SIG
+for a key with the same name as the signal, then calls the subroutine
+value for that key.
+
+ # as an anonymous subroutine
+
+ $SIG{INT} = sub { syswrite(STDERR, "ouch\n", 5 ) };
+
+ # or a reference to a function
+
+ $SIG{INT} = \&ouch;
+
+ # or the name of the function as a string
+
+ $SIG{INT} = "ouch";
+
+Perl versions before 5.8 had in its C source code signal handlers which
+would catch the signal and possibly run a Perl function that you had set
+in %SIG. This violated the rules of signal handling at that level
+causing perl to dump core. Since version 5.8.0, perl looks at %SIG
+*after* the signal has been caught, rather than while it is being caught.
+Previous versions of this answer were incorrect.
+
+=head2 How do I modify the shadow password file on a Unix system?
+
+If perl was installed correctly and your shadow library was written
+properly, the getpw*() functions described in L<perlfunc> should in
+theory provide (read-only) access to entries in the shadow password
+file. To change the file, make a new shadow password file (the format
+varies from system to system--see L<passwd> for specifics) and use
+pwd_mkdb(8) to install it (see L<pwd_mkdb> for more details).
+
+=head2 How do I set the time and date?
+
+Assuming you're running under sufficient permissions, you should be
+able to set the system-wide date and time by running the date(1)
+program. (There is no way to set the time and date on a per-process
+basis.) This mechanism will work for Unix, MS-DOS, Windows, and NT;
+the VMS equivalent is C<set time>.
+
+However, if all you want to do is change your time zone, you can
+probably get away with setting an environment variable:
+
+ $ENV{TZ} = "MST7MDT"; # unixish
+ $ENV{'SYS$TIMEZONE_DIFFERENTIAL'}="-5" # vms
+ system "trn comp.lang.perl.misc";
+
+=head2 How can I sleep() or alarm() for under a second?
+X<Time::HiRes> X<BSD::Itimer> X<sleep> X<select>
+
+If you want finer granularity than the 1 second that the C<sleep()>
+function provides, the easiest way is to use the C<select()> function as
+documented in L<perlfunc/"select">. Try the C<Time::HiRes> and
+the C<BSD::Itimer> modules (available from CPAN, and starting from
+Perl 5.8 C<Time::HiRes> is part of the standard distribution).
+
+=head2 How can I measure time under a second?
+X<Time::HiRes> X<BSD::Itimer> X<sleep> X<select>
+
+(contributed by brian d foy)
+
+The C<Time::HiRes> module (part of the standard distribution as of
+Perl 5.8) measures time with the C<gettimeofday()> system call, which
+returns the time in microseconds since the epoch. If you can't install
+C<Time::HiRes> for older Perls and you are on a Unixish system, you
+may be able to call C<gettimeofday(2)> directly. See
+L<perlfunc/syscall>.
+
+=head2 How can I do an atexit() or setjmp()/longjmp()? (Exception handling)
+
+Release 5 of Perl added the END block, which can be used to simulate
+atexit(). Each package's END block is called when the program or
+thread ends (see L<perlmod> manpage for more details).
+
+For example, you can use this to make sure your filter program
+managed to finish its output without filling up the disk:
+
+ END {
+ close(STDOUT) || die "stdout close failed: $!";
+ }
+
+The END block isn't called when untrapped signals kill the program,
+though, so if you use END blocks you should also use
+
+ use sigtrap qw(die normal-signals);
+
+Perl's exception-handling mechanism is its eval() operator. You can
+use eval() as setjmp and die() as longjmp. For details of this, see
+the section on signals, especially the time-out handler for a blocking
+flock() in L<perlipc/"Signals"> or the section on "Signals" in
+the Camel Book.
+
+If exception handling is all you're interested in, try the
+exceptions.pl library (part of the standard perl distribution).
+
+If you want the atexit() syntax (and an rmexit() as well), try the
+AtExit module available from CPAN.
+
+=head2 Why doesn't my sockets program work under System V (Solaris)? What does the error message "Protocol not supported" mean?
+
+Some Sys-V based systems, notably Solaris 2.X, redefined some of the
+standard socket constants. Since these were constant across all
+architectures, they were often hardwired into perl code. The proper
+way to deal with this is to "use Socket" to get the correct values.
+
+Note that even though SunOS and Solaris are binary compatible, these
+values are different. Go figure.
+
+=head2 How can I call my system's unique C functions from Perl?
+
+In most cases, you write an external module to do it--see the answer
+to "Where can I learn about linking C with Perl? [h2xs, xsubpp]".
+However, if the function is a system call, and your system supports
+syscall(), you can use the syscall function (documented in
+L<perlfunc>).
+
+Remember to check the modules that came with your distribution, and
+CPAN as well--someone may already have written a module to do it. On
+Windows, try Win32::API. On Macs, try Mac::Carbon. If no module
+has an interface to the C function, you can inline a bit of C in your
+Perl source with Inline::C.
+
+=head2 Where do I get the include files to do ioctl() or syscall()?
+
+Historically, these would be generated by the h2ph tool, part of the
+standard perl distribution. This program converts cpp(1) directives
+in C header files to files containing subroutine definitions, like
+&SYS_getitimer, which you can use as arguments to your functions.
+It doesn't work perfectly, but it usually gets most of the job done.
+Simple files like F<errno.h>, F<syscall.h>, and F<socket.h> were fine,
+but the hard ones like F<ioctl.h> nearly always need to hand-edited.
+Here's how to install the *.ph files:
+
+ 1. become super-user
+ 2. cd /usr/include
+ 3. h2ph *.h */*.h
+
+If your system supports dynamic loading, for reasons of portability and
+sanity you probably ought to use h2xs (also part of the standard perl
+distribution). This tool converts C header files to Perl extensions.
+See L<perlxstut> for how to get started with h2xs.
+
+If your system doesn't support dynamic loading, you still probably
+ought to use h2xs. See L<perlxstut> and L<ExtUtils::MakeMaker> for
+more information (in brief, just use B<make perl> instead of a plain
+B<make> to rebuild perl with a new static extension).
+
+=head2 Why do setuid perl scripts complain about kernel problems?
+
+Some operating systems have bugs in the kernel that make setuid
+scripts inherently insecure. Perl gives you a number of options
+(described in L<perlsec>) to work around such systems.
+
+=head2 How can I open a pipe both to and from a command?
+
+The IPC::Open2 module (part of the standard perl distribution) is an
+easy-to-use approach that internally uses pipe(), fork(), and exec() to do
+the job. Make sure you read the deadlock warnings in its documentation,
+though (see L<IPC::Open2>). See
+L<perlipc/"Bidirectional Communication with Another Process"> and
+L<perlipc/"Bidirectional Communication with Yourself">
+
+You may also use the IPC::Open3 module (part of the standard perl
+distribution), but be warned that it has a different order of
+arguments from IPC::Open2 (see L<IPC::Open3>).
+
+=head2 Why can't I get the output of a command with system()?
+
+You're confusing the purpose of system() and backticks (``). system()
+runs a command and returns exit status information (as a 16 bit value:
+the low 7 bits are the signal the process died from, if any, and
+the high 8 bits are the actual exit value). Backticks (``) run a
+command and return what it sent to STDOUT.
+
+ $exit_status = system("mail-users");
+ $output_string = `ls`;
+
+=head2 How can I capture STDERR from an external command?
+
+There are three basic ways of running external commands:
+
+ system $cmd; # using system()
+ $output = `$cmd`; # using backticks (``)
+ open (PIPE, "cmd |"); # using open()
+
+With system(), both STDOUT and STDERR will go the same place as the
+script's STDOUT and STDERR, unless the system() command redirects them.
+Backticks and open() read B<only> the STDOUT of your command.
+
+You can also use the open3() function from IPC::Open3. Benjamin
+Goldberg provides some sample code:
+
+To capture a program's STDOUT, but discard its STDERR:
+
+ use IPC::Open3;
+ use File::Spec;
+ use Symbol qw(gensym);
+ open(NULL, ">", File::Spec->devnull);
+ my $pid = open3(gensym, \*PH, ">&NULL", "cmd");
+ while( <PH> ) { }
+ waitpid($pid, 0);
+
+To capture a program's STDERR, but discard its STDOUT:
+
+ use IPC::Open3;
+ use File::Spec;
+ use Symbol qw(gensym);
+ open(NULL, ">", File::Spec->devnull);
+ my $pid = open3(gensym, ">&NULL", \*PH, "cmd");
+ while( <PH> ) { }
+ waitpid($pid, 0);
+
+To capture a program's STDERR, and let its STDOUT go to our own STDERR:
+
+ use IPC::Open3;
+ use Symbol qw(gensym);
+ my $pid = open3(gensym, ">&STDERR", \*PH, "cmd");
+ while( <PH> ) { }
+ waitpid($pid, 0);
+
+To read both a command's STDOUT and its STDERR separately, you can
+redirect them to temp files, let the command run, then read the temp
+files:
+
+ use IPC::Open3;
+ use Symbol qw(gensym);
+ use IO::File;
+ local *CATCHOUT = IO::File->new_tmpfile;
+ local *CATCHERR = IO::File->new_tmpfile;
+ my $pid = open3(gensym, ">&CATCHOUT", ">&CATCHERR", "cmd");
+ waitpid($pid, 0);
+ seek $_, 0, 0 for \*CATCHOUT, \*CATCHERR;
+ while( <CATCHOUT> ) {}
+ while( <CATCHERR> ) {}
+
+But there's no real need for *both* to be tempfiles... the following
+should work just as well, without deadlocking:
+
+ use IPC::Open3;
+ use Symbol qw(gensym);
+ use IO::File;
+ local *CATCHERR = IO::File->new_tmpfile;
+ my $pid = open3(gensym, \*CATCHOUT, ">&CATCHERR", "cmd");
+ while( <CATCHOUT> ) {}
+ waitpid($pid, 0);
+ seek CATCHERR, 0, 0;
+ while( <CATCHERR> ) {}
+
+And it'll be faster, too, since we can begin processing the program's
+stdout immediately, rather than waiting for the program to finish.
+
+With any of these, you can change file descriptors before the call:
+
+ open(STDOUT, ">logfile");
+ system("ls");
+
+or you can use Bourne shell file-descriptor redirection:
+
+ $output = `$cmd 2>some_file`;
+ open (PIPE, "cmd 2>some_file |");
+
+You can also use file-descriptor redirection to make STDERR a
+duplicate of STDOUT:
+
+ $output = `$cmd 2>&1`;
+ open (PIPE, "cmd 2>&1 |");
+
+Note that you I<cannot> simply open STDERR to be a dup of STDOUT
+in your Perl program and avoid calling the shell to do the redirection.
+This doesn't work:
+
+ open(STDERR, ">&STDOUT");
+ $alloutput = `cmd args`; # stderr still escapes
+
+This fails because the open() makes STDERR go to where STDOUT was
+going at the time of the open(). The backticks then make STDOUT go to
+a string, but don't change STDERR (which still goes to the old
+STDOUT).
+
+Note that you I<must> use Bourne shell (sh(1)) redirection syntax in
+backticks, not csh(1)! Details on why Perl's system() and backtick
+and pipe opens all use the Bourne shell are in the
+F<versus/csh.whynot> article in the "Far More Than You Ever Wanted To
+Know" collection in http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz . To
+capture a command's STDERR and STDOUT together:
+
+ $output = `cmd 2>&1`; # either with backticks
+ $pid = open(PH, "cmd 2>&1 |"); # or with an open pipe
+ while (<PH>) { } # plus a read
+
+To capture a command's STDOUT but discard its STDERR:
+
+ $output = `cmd 2>/dev/null`; # either with backticks
+ $pid = open(PH, "cmd 2>/dev/null |"); # or with an open pipe
+ while (<PH>) { } # plus a read
+
+To capture a command's STDERR but discard its STDOUT:
+
+ $output = `cmd 2>&1 1>/dev/null`; # either with backticks
+ $pid = open(PH, "cmd 2>&1 1>/dev/null |"); # or with an open pipe
+ while (<PH>) { } # plus a read
+
+To exchange a command's STDOUT and STDERR in order to capture the STDERR
+but leave its STDOUT to come out our old STDERR:
+
+ $output = `cmd 3>&1 1>&2 2>&3 3>&-`; # either with backticks
+ $pid = open(PH, "cmd 3>&1 1>&2 2>&3 3>&-|");# or with an open pipe
+ while (<PH>) { } # plus a read
+
+To read both a command's STDOUT and its STDERR separately, it's easiest
+to redirect them separately to files, and then read from those files
+when the program is done:
+
+ system("program args 1>program.stdout 2>program.stderr");
+
+Ordering is important in all these examples. That's because the shell
+processes file descriptor redirections in strictly left to right order.
+
+ system("prog args 1>tmpfile 2>&1");
+ system("prog args 2>&1 1>tmpfile");
+
+The first command sends both standard out and standard error to the
+temporary file. The second command sends only the old standard output
+there, and the old standard error shows up on the old standard out.
+
+=head2 Why doesn't open() return an error when a pipe open fails?
+
+If the second argument to a piped open() contains shell
+metacharacters, perl fork()s, then exec()s a shell to decode the
+metacharacters and eventually run the desired program. If the program
+couldn't be run, it's the shell that gets the message, not Perl. All
+your Perl program can find out is whether the shell itself could be
+successfully started. You can still capture the shell's STDERR and
+check it for error messages. See L<"How can I capture STDERR from an
+external command?"> elsewhere in this document, or use the
+IPC::Open3 module.
+
+If there are no shell metacharacters in the argument of open(), Perl
+runs the command directly, without using the shell, and can correctly
+report whether the command started.
+
+=head2 What's wrong with using backticks in a void context?
+
+Strictly speaking, nothing. Stylistically speaking, it's not a good
+way to write maintainable code. Perl has several operators for
+running external commands. Backticks are one; they collect the output
+from the command for use in your program. The C<system> function is
+another; it doesn't do this.
+
+Writing backticks in your program sends a clear message to the readers
+of your code that you wanted to collect the output of the command.
+Why send a clear message that isn't true?
+
+Consider this line:
+
+ `cat /etc/termcap`;
+
+You forgot to check C<$?> to see whether the program even ran
+correctly. Even if you wrote
+
+ print `cat /etc/termcap`;
+
+this code could and probably should be written as
+
+ system("cat /etc/termcap") == 0
+ or die "cat program failed!";
+
+which will echo the cat command's output as it is generated, instead
+of waiting until the program has completed to print it out. It also
+checks the return value.
+
+C<system> also provides direct control over whether shell wildcard
+processing may take place, whereas backticks do not.
+
+=head2 How can I call backticks without shell processing?
+
+This is a bit tricky. You can't simply write the command
+like this:
+
+ @ok = `grep @opts '$search_string' @filenames`;
+
+As of Perl 5.8.0, you can use C<open()> with multiple arguments.
+Just like the list forms of C<system()> and C<exec()>, no shell
+escapes happen.
+
+ open( GREP, "-|", 'grep', @opts, $search_string, @filenames );
+ chomp(@ok = <GREP>);
+ close GREP;
+
+You can also:
+
+ my @ok = ();
+ if (open(GREP, "-|")) {
+ while (<GREP>) {
+ chomp;
+ push(@ok, $_);
+ }
+ close GREP;
+ } else {
+ exec 'grep', @opts, $search_string, @filenames;
+ }
+
+Just as with C<system()>, no shell escapes happen when you C<exec()> a
+list. Further examples of this can be found in L<perlipc/"Safe Pipe
+Opens">.
+
+Note that if you're using Windows, no solution to this vexing issue is
+even possible. Even if Perl were to emulate C<fork()>, you'd still be
+stuck, because Windows does not have an argc/argv-style API.
+
+=head2 Why can't my script read from STDIN after I gave it EOF (^D on Unix, ^Z on MS-DOS)?
+
+Some stdio's set error and eof flags that need clearing. The
+POSIX module defines clearerr() that you can use. That is the
+technically correct way to do it. Here are some less reliable
+workarounds:
+
+=over 4
+
+=item 1
+
+Try keeping around the seekpointer and go there, like this:
+
+ $where = tell(LOG);
+ seek(LOG, $where, 0);
+
+=item 2
+
+If that doesn't work, try seeking to a different part of the file and
+then back.
+
+=item 3
+
+If that doesn't work, try seeking to a different part of
+the file, reading something, and then seeking back.
+
+=item 4
+
+If that doesn't work, give up on your stdio package and use sysread.
+
+=back
+
+=head2 How can I convert my shell script to perl?
+
+Learn Perl and rewrite it. Seriously, there's no simple converter.
+Things that are awkward to do in the shell are easy to do in Perl, and
+this very awkwardness is what would make a shell->perl converter
+nigh-on impossible to write. By rewriting it, you'll think about what
+you're really trying to do, and hopefully will escape the shell's
+pipeline datastream paradigm, which while convenient for some matters,
+causes many inefficiencies.
+
+=head2 Can I use perl to run a telnet or ftp session?
+
+Try the Net::FTP, TCP::Client, and Net::Telnet modules (available from
+CPAN). http://www.cpan.org/scripts/netstuff/telnet.emul.shar
+will also help for emulating the telnet protocol, but Net::Telnet is
+quite probably easier to use..
+
+If all you want to do is pretend to be telnet but don't need
+the initial telnet handshaking, then the standard dual-process
+approach will suffice:
+
+ use IO::Socket; # new in 5.004
+ $handle = IO::Socket::INET->new('www.perl.com:80')
+ or die "can't connect to port 80 on www.perl.com: $!";
+ $handle->autoflush(1);
+ if (fork()) { # XXX: undef means failure
+ select($handle);
+ print while <STDIN>; # everything from stdin to socket
+ } else {
+ print while <$handle>; # everything from socket to stdout
+ }
+ close $handle;
+ exit;
+
+=head2 How can I write expect in Perl?
+
+Once upon a time, there was a library called chat2.pl (part of the
+standard perl distribution), which never really got finished. If you
+find it somewhere, I<don't use it>. These days, your best bet is to
+look at the Expect module available from CPAN, which also requires two
+other modules from CPAN, IO::Pty and IO::Stty.
+
+=head2 Is there a way to hide perl's command line from programs such as "ps"?
+
+First of all note that if you're doing this for security reasons (to
+avoid people seeing passwords, for example) then you should rewrite
+your program so that critical information is never given as an
+argument. Hiding the arguments won't make your program completely
+secure.
+
+To actually alter the visible command line, you can assign to the
+variable $0 as documented in L<perlvar>. This won't work on all
+operating systems, though. Daemon programs like sendmail place their
+state there, as in:
+
+ $0 = "orcus [accepting connections]";
+
+=head2 I {changed directory, modified my environment} in a perl script. How come the change disappeared when I exited the script? How do I get my changes to be visible?
+
+=over 4
+
+=item Unix
+
+In the strictest sense, it can't be done--the script executes as a
+different process from the shell it was started from. Changes to a
+process are not reflected in its parent--only in any children
+created after the change. There is shell magic that may allow you to
+fake it by eval()ing the script's output in your shell; check out the
+comp.unix.questions FAQ for details.
+
+=back
+
+=head2 How do I close a process's filehandle without waiting for it to complete?
+
+Assuming your system supports such things, just send an appropriate signal
+to the process (see L<perlfunc/"kill">). It's common to first send a TERM
+signal, wait a little bit, and then send a KILL signal to finish it off.
+
+=head2 How do I fork a daemon process?
+
+If by daemon process you mean one that's detached (disassociated from
+its tty), then the following process is reported to work on most
+Unixish systems. Non-Unix users should check their Your_OS::Process
+module for other solutions.
+
+=over 4
+
+=item *
+
+Open /dev/tty and use the TIOCNOTTY ioctl on it. See L<tty>
+for details. Or better yet, you can just use the POSIX::setsid()
+function, so you don't have to worry about process groups.
+
+=item *
+
+Change directory to /
+
+=item *
+
+Reopen STDIN, STDOUT, and STDERR so they're not connected to the old
+tty.
+
+=item *
+
+Background yourself like this:
+
+ fork && exit;
+
+=back
+
+The Proc::Daemon module, available from CPAN, provides a function to
+perform these actions for you.
+
+=head2 How do I find out if I'm running interactively or not?
+
+Good question. Sometimes C<-t STDIN> and C<-t STDOUT> can give clues,
+sometimes not.
+
+ if (-t STDIN && -t STDOUT) {
+ print "Now what? ";
+ }
+
+On POSIX systems, you can test whether your own process group matches
+the current process group of your controlling terminal as follows:
+
+ use POSIX qw/getpgrp tcgetpgrp/;
+
+ # Some POSIX systems, such as Linux, can be
+ # without a /dev/tty at boot time.
+ if (!open(TTY, "/dev/tty")) {
+ print "no tty\n";
+ } else {
+ $tpgrp = tcgetpgrp(fileno(*TTY));
+ $pgrp = getpgrp();
+ if ($tpgrp == $pgrp) {
+ print "foreground\n";
+ } else {
+ print "background\n";
+ }
+ }
+
+=head2 How do I timeout a slow event?
+
+Use the alarm() function, probably in conjunction with a signal
+handler, as documented in L<perlipc/"Signals"> and the section on
+"Signals" in the Camel. You may instead use the more flexible
+Sys::AlarmCall module available from CPAN.
+
+The alarm() function is not implemented on all versions of Windows.
+Check the documentation for your specific version of Perl.
+
+=head2 How do I set CPU limits?
+X<BSD::Resource> X<limit> X<CPU>
+
+(contributed by Xho)
+
+Use the C<BSD::Resource> module from CPAN. As an example:
+
+ use BSD::Resource;
+ setrlimit(RLIMIT_CPU,10,20) or die $!;
+
+This sets the soft and hard limits to 10 and 20 seconds, respectively.
+After 10 seconds of time spent running on the CPU (not "wall" time),
+the process will be sent a signal (XCPU on some systems) which, if not
+trapped, will cause the process to terminate. If that signal is
+trapped, then after 10 more seconds (20 seconds in total) the process
+will be killed with a non-trappable signal.
+
+See the C<BSD::Resource> and your systems documentation for the gory
+details.
+
+=head2 How do I avoid zombies on a Unix system?
+
+Use the reaper code from L<perlipc/"Signals"> to call wait() when a
+SIGCHLD is received, or else use the double-fork technique described
+in L<perlfaq8/"How do I start a process in the background?">.
+
+=head2 How do I use an SQL database?
+
+The DBI module provides an abstract interface to most database
+servers and types, including Oracle, DB2, Sybase, mysql, Postgresql,
+ODBC, and flat files. The DBI module accesses each database type
+through a database driver, or DBD. You can see a complete list of
+available drivers on CPAN: http://www.cpan.org/modules/by-module/DBD/ .
+You can read more about DBI on http://dbi.perl.org .
+
+Other modules provide more specific access: Win32::ODBC, Alzabo, iodbc,
+and others found on CPAN Search: http://search.cpan.org .
+
+=head2 How do I make a system() exit on control-C?
+
+You can't. You need to imitate the system() call (see L<perlipc> for
+sample code) and then have a signal handler for the INT signal that
+passes the signal on to the subprocess. Or you can check for it:
+
+ $rc = system($cmd);
+ if ($rc & 127) { die "signal death" }
+
+=head2 How do I open a file without blocking?
+
+If you're lucky enough to be using a system that supports
+non-blocking reads (most Unixish systems do), you need only to use the
+O_NDELAY or O_NONBLOCK flag from the Fcntl module in conjunction with
+sysopen():
+
+ use Fcntl;
+ sysopen(FH, "/foo/somefile", O_WRONLY|O_NDELAY|O_CREAT, 0644)
+ or die "can't open /foo/somefile: $!":
+
+=head2 How do I tell the difference between errors from the shell and perl?
+
+(answer contributed by brian d foy)
+
+When you run a Perl script, something else is running the script for you,
+and that something else may output error messages. The script might
+emit its own warnings and error messages. Most of the time you cannot
+tell who said what.
+
+You probably cannot fix the thing that runs perl, but you can change how
+perl outputs its warnings by defining a custom warning and die functions.
+
+Consider this script, which has an error you may not notice immediately.
+
+ #!/usr/locl/bin/perl
+
+ print "Hello World\n";
+
+I get an error when I run this from my shell (which happens to be
+bash). That may look like perl forgot it has a print() function,
+but my shebang line is not the path to perl, so the shell runs the
+script, and I get the error.
+
+ $ ./test
+ ./test: line 3: print: command not found
+
+A quick and dirty fix involves a little bit of code, but this may be all
+you need to figure out the problem.
+
+ #!/usr/bin/perl -w
+
+ BEGIN {
+ $SIG{__WARN__} = sub{ print STDERR "Perl: ", @_; };
+ $SIG{__DIE__} = sub{ print STDERR "Perl: ", @_; exit 1};
+ }
+
+ $a = 1 + undef;
+ $x / 0;
+ __END__
+
+The perl message comes out with "Perl" in front. The BEGIN block
+works at compile time so all of the compilation errors and warnings
+get the "Perl:" prefix too.
+
+ Perl: Useless use of division (/) in void context at ./test line 9.
+ Perl: Name "main::a" used only once: possible typo at ./test line 8.
+ Perl: Name "main::x" used only once: possible typo at ./test line 9.
+ Perl: Use of uninitialized value in addition (+) at ./test line 8.
+ Perl: Use of uninitialized value in division (/) at ./test line 9.
+ Perl: Illegal division by zero at ./test line 9.
+ Perl: Illegal division by zero at -e line 3.
+
+If I don't see that "Perl:", it's not from perl.
+
+You could also just know all the perl errors, and although there are
+some people who may know all of them, you probably don't. However, they
+all should be in the perldiag manpage. If you don't find the error in
+there, it probably isn't a perl error.
+
+Looking up every message is not the easiest way, so let perl to do it
+for you. Use the diagnostics pragma with turns perl's normal messages
+into longer discussions on the topic.
+
+ use diagnostics;
+
+If you don't get a paragraph or two of expanded discussion, it
+might not be perl's message.
+
+=head2 How do I install a module from CPAN?
+
+The easiest way is to have a module also named CPAN do it for you.
+This module comes with perl version 5.004 and later.
+
+ $ perl -MCPAN -e shell
+
+ cpan shell -- CPAN exploration and modules installation (v1.59_54)
+ ReadLine support enabled
+
+ cpan> install Some::Module
+
+To manually install the CPAN module, or any well-behaved CPAN module
+for that matter, follow these steps:
+
+=over 4
+
+=item 1
+
+Unpack the source into a temporary area.
+
+=item 2
+
+ perl Makefile.PL
+
+=item 3
+
+ make
+
+=item 4
+
+ make test
+
+=item 5
+
+ make install
+
+=back
+
+If your version of perl is compiled without dynamic loading, then you
+just need to replace step 3 (B<make>) with B<make perl> and you will
+get a new F<perl> binary with your extension linked in.
+
+See L<ExtUtils::MakeMaker> for more details on building extensions.
+See also the next question, "What's the difference between require
+and use?".
+
+=head2 What's the difference between require and use?
+
+(contributed by brian d foy)
+
+Perl runs C<require> statement at run-time. Once Perl loads, compiles,
+and runs the file, it doesn't do anything else. The C<use> statement
+is the same as a C<require> run at compile-time, but Perl also calls the
+C<import> method for the loaded package. These two are the same:
+
+ use MODULE qw(import list);
+
+ BEGIN {
+ require MODULE;
+ MODULE->import(import list);
+ }
+
+However, you can suppress the C<import> by using an explicit, empty
+import list. Both of these still happen at compile-time:
+
+ use MODULE ();
+
+ BEGIN {
+ require MODULE;
+ }
+
+Since C<use> will also call the C<import> method, the actual value
+for C<MODULE> must be a bareword. That is, C<use> cannot load files
+by name, although C<require> can:
+
+ require "$ENV{HOME}/lib/Foo.pm"; # no @INC searching!
+
+See the entry for C<use> in L<perlfunc> for more details.
+
+=head2 How do I keep my own module/library directory?
+
+When you build modules, tell Perl where to install the modules.
+
+For C<Makefile.PL>-based distributions, use the INSTALL_BASE option
+when generating Makefiles:
+
+ perl Makefile.PL INSTALL_BASE=/mydir/perl
+
+You can set this in your CPAN.pm configuration so modules automatically install
+in your private library directory when you use the CPAN.pm shell:
+
+ % cpan
+ cpan> o conf makepl_arg INSTALL_BASE=/mydir/perl
+ cpan> o conf commit
+
+For C<Build.PL>-based distributions, use the --install_base option:
+
+ perl Build.PL --install_base /mydir/perl
+
+You can configure CPAN.pm to automatically use this option too:
+
+ % cpan
+ cpan> o conf mbuild_arg --install_base /mydir/perl
+ cpan> o conf commit
+
+INSTALL_BASE tells these tools to put your modules into
+F</mydir/perl/lib/perl5>. See L<How do I add a directory to my
+include path (@INC) at runtime?> for details on how to run your newly
+installed moudles.
+
+There is one caveat with INSTALL_BASE, though, since it acts
+differently than the PREFIX and LIB settings that older versions of
+ExtUtils::MakeMaker advocated. INSTALL_BASE does not support
+installing modules for multiple versions of Perl or different
+architectures under the same directory. You should consider if you
+really want that , and if you do, use the older PREFIX and LIB
+settings. See the ExtUtils::Makemaker documentation for more details.
+
+=head2 How do I add the directory my program lives in to the module/library search path?
+
+(contributed by brian d foy)
+
+If you know the directory already, you can add it to C<@INC> as you would
+for any other directory. You might <use lib> if you know the directory
+at compile time:
+
+ use lib $directory;
+
+The trick in this task is to find the directory. Before your script does
+anything else (such as a C<chdir>), you can get the current working
+directory with the C<Cwd> module, which comes with Perl:
+
+ BEGIN {
+ use Cwd;
+ our $directory = cwd;
+ }
+
+ use lib $directory;
+
+You can do a similar thing with the value of C<$0>, which holds the
+script name. That might hold a relative path, but C<rel2abs> can turn
+it into an absolute path. Once you have the
+
+ BEGIN {
+ use File::Spec::Functions qw(rel2abs);
+ use File::Basename qw(dirname);
+
+ my $path = rel2abs( $0 );
+ our $directory = dirname( $path );
+ }
+
+ use lib $directory;
+
+The C<FindBin> module, which comes with Perl, might work. It finds the
+directory of the currently running script and puts it in C<$Bin>, which
+you can then use to construct the right library path:
+
+ use FindBin qw($Bin);
+
+=head2 How do I add a directory to my include path (@INC) at runtime?
+
+Here are the suggested ways of modifying your include path, including
+environment variables, run-time switches, and in-code statements:
+
+=over 4
+
+=item the PERLLIB environment variable
+
+ $ export PERLLIB=/path/to/my/dir
+ $ perl program.pl
+
+=item the PERL5LIB environment variable
+
+ $ export PERL5LIB=/path/to/my/dir
+ $ perl program.pl
+
+=item the perl -Idir command line flag
+
+ $ perl -I/path/to/my/dir program.pl
+
+=item the use lib pragma:
+
+ use lib "$ENV{HOME}/myown_perllib";
+
+=back
+
+The last is particularly useful because it knows about machine
+dependent architectures. The lib.pm pragmatic module was first
+included with the 5.002 release of Perl.
+
+=head2 What is socket.ph and where do I get it?
+
+It's a Perl 4 style file defining values for system networking
+constants. Sometimes it is built using h2ph when Perl is installed,
+but other times it is not. Modern programs C<use Socket;> instead.
+
+=head1 REVISION
+
+Revision: $Revision$
+
+Date: $Date$
+
+See L<perlfaq> for source control details and availability.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2009 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain. You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit. A simple comment in the code giving
+credit would be courteous but is not required.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfaq9.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq9.pod
new file mode 100755
index 00000000000..ce0cf072419
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfaq9.pod
@@ -0,0 +1,690 @@
+=head1 NAME
+
+perlfaq9 - Networking
+
+=head1 DESCRIPTION
+
+This section deals with questions related to networking, the internet,
+and a few on the web.
+
+=head2 What is the correct form of response from a CGI script?
+
+(Alan Flavell <flavell+www@a5.ph.gla.ac.uk> answers...)
+
+The Common Gateway Interface (CGI) specifies a software interface between
+a program ("CGI script") and a web server (HTTPD). It is not specific
+to Perl, and has its own FAQs and tutorials, and usenet group,
+comp.infosystems.www.authoring.cgi
+
+The CGI specification is outlined in an informational RFC:
+http://www.ietf.org/rfc/rfc3875
+
+Other relevant documentation listed in: http://www.perl.org/CGI_MetaFAQ.html
+
+These Perl FAQs very selectively cover some CGI issues. However, Perl
+programmers are strongly advised to use the CGI.pm module, to take care
+of the details for them.
+
+The similarity between CGI response headers (defined in the CGI
+specification) and HTTP response headers (defined in the HTTP
+specification, RFC2616) is intentional, but can sometimes be confusing.
+
+The CGI specification defines two kinds of script: the "Parsed Header"
+script, and the "Non Parsed Header" (NPH) script. Check your server
+documentation to see what it supports. "Parsed Header" scripts are
+simpler in various respects. The CGI specification allows any of the
+usual newline representations in the CGI response (it's the server's
+job to create an accurate HTTP response based on it). So "\n" written in
+text mode is technically correct, and recommended. NPH scripts are more
+tricky: they must put out a complete and accurate set of HTTP
+transaction response headers; the HTTP specification calls for records
+to be terminated with carriage-return and line-feed, i.e ASCII \015\012
+written in binary mode.
+
+Using CGI.pm gives excellent platform independence, including EBCDIC
+systems. CGI.pm selects an appropriate newline representation
+($CGI::CRLF) and sets binmode as appropriate.
+
+=head2 My CGI script runs from the command line but not the browser. (500 Server Error)
+
+Several things could be wrong. You can go through the "Troubleshooting
+Perl CGI scripts" guide at
+
+ http://www.perl.org/troubleshooting_CGI.html
+
+If, after that, you can demonstrate that you've read the FAQs and that
+your problem isn't something simple that can be easily answered, you'll
+probably receive a courteous and useful reply to your question if you
+post it on comp.infosystems.www.authoring.cgi (if it's something to do
+with HTTP or the CGI protocols). Questions that appear to be Perl
+questions but are really CGI ones that are posted to comp.lang.perl.misc
+are not so well received.
+
+The useful FAQs, related documents, and troubleshooting guides are
+listed in the CGI Meta FAQ:
+
+ http://www.perl.org/CGI_MetaFAQ.html
+
+=head2 How can I get better error messages from a CGI program?
+
+Use the CGI::Carp module. It replaces C<warn> and C<die>, plus the
+normal Carp modules C<carp>, C<croak>, and C<confess> functions with
+more verbose and safer versions. It still sends them to the normal
+server error log.
+
+ use CGI::Carp;
+ warn "This is a complaint";
+ die "But this one is serious";
+
+The following use of CGI::Carp also redirects errors to a file of your choice,
+placed in a BEGIN block to catch compile-time warnings as well:
+
+ BEGIN {
+ use CGI::Carp qw(carpout);
+ open(LOG, ">>/var/local/cgi-logs/mycgi-log")
+ or die "Unable to append to mycgi-log: $!\n";
+ carpout(*LOG);
+ }
+
+You can even arrange for fatal errors to go back to the client browser,
+which is nice for your own debugging, but might confuse the end user.
+
+ use CGI::Carp qw(fatalsToBrowser);
+ die "Bad error here";
+
+Even if the error happens before you get the HTTP header out, the module
+will try to take care of this to avoid the dreaded server 500 errors.
+Normal warnings still go out to the server error log (or wherever
+you've sent them with C<carpout>) with the application name and date
+stamp prepended.
+
+=head2 How do I remove HTML from a string?
+
+The most correct way (albeit not the fastest) is to use HTML::Parser
+from CPAN. Another mostly correct
+way is to use HTML::FormatText which not only removes HTML but also
+attempts to do a little simple formatting of the resulting plain text.
+
+Many folks attempt a simple-minded regular expression approach, like
+C<< s/<.*?>//g >>, but that fails in many cases because the tags
+may continue over line breaks, they may contain quoted angle-brackets,
+or HTML comment may be present. Plus, folks forget to convert
+entities--like C<&lt;> for example.
+
+Here's one "simple-minded" approach, that works for most files:
+
+ #!/usr/bin/perl -p0777
+ s/<(?:[^>'"]*|(['"]).*?\1)*>//gs
+
+If you want a more complete solution, see the 3-stage striphtml
+program in
+http://www.cpan.org/authors/Tom_Christiansen/scripts/striphtml.gz
+.
+
+Here are some tricky cases that you should think about when picking
+a solution:
+
+ <IMG SRC = "foo.gif" ALT = "A > B">
+
+ <IMG SRC = "foo.gif"
+ ALT = "A > B">
+
+ <!-- <A comment> -->
+
+ <script>if (a<b && a>c)</script>
+
+ <# Just data #>
+
+ <![INCLUDE CDATA [ >>>>>>>>>>>> ]]>
+
+If HTML comments include other tags, those solutions would also break
+on text like this:
+
+ <!-- This section commented out.
+ <B>You can't see me!</B>
+ -->
+
+=head2 How do I extract URLs?
+
+You can easily extract all sorts of URLs from HTML with
+C<HTML::SimpleLinkExtor> which handles anchors, images, objects,
+frames, and many other tags that can contain a URL. If you need
+anything more complex, you can create your own subclass of
+C<HTML::LinkExtor> or C<HTML::Parser>. You might even use
+C<HTML::SimpleLinkExtor> as an example for something specifically
+suited to your needs.
+
+You can use URI::Find to extract URLs from an arbitrary text document.
+
+Less complete solutions involving regular expressions can save
+you a lot of processing time if you know that the input is simple. One
+solution from Tom Christiansen runs 100 times faster than most
+module based approaches but only extracts URLs from anchors where the first
+attribute is HREF and there are no other attributes.
+
+ #!/usr/bin/perl -n00
+ # qxurl - tchrist@perl.com
+ print "$2\n" while m{
+ < \s*
+ A \s+ HREF \s* = \s* (["']) (.*?) \1
+ \s* >
+ }gsix;
+
+=head2 How do I download a file from the user's machine? How do I open a file on another machine?
+
+In this case, download means to use the file upload feature of HTML
+forms. You allow the web surfer to specify a file to send to your web
+server. To you it looks like a download, and to the user it looks
+like an upload. No matter what you call it, you do it with what's
+known as B<multipart/form-data> encoding. The CGI.pm module (which
+comes with Perl as part of the Standard Library) supports this in the
+start_multipart_form() method, which isn't the same as the startform()
+method.
+
+See the section in the CGI.pm documentation on file uploads for code
+examples and details.
+
+=head2 How do I make an HTML pop-up menu with Perl?
+
+(contributed by brian d foy)
+
+The CGI.pm module (which comes with Perl) has functions to create
+the HTML form widgets. See the CGI.pm documentation for more
+examples.
+
+ use CGI qw/:standard/;
+ print header,
+ start_html('Favorite Animals'),
+
+ start_form,
+ "What's your favorite animal? ",
+ popup_menu(
+ -name => 'animal',
+ -values => [ qw( Llama Alpaca Camel Ram ) ]
+ ),
+ submit,
+
+ end_form,
+ end_html;
+
+=head2 How do I fetch an HTML file?
+
+(contributed by brian d foy)
+
+Use the libwww-perl distribution. The C<LWP::Simple> module can fetch web
+resources and give their content back to you as a string:
+
+ use LWP::Simple qw(get);
+
+ my $html = get( "http://www.example.com/index.html" );
+
+It can also store the resource directly in a file:
+
+ use LWP::Simple qw(getstore);
+
+ getstore( "http://www.example.com/index.html", "foo.html" );
+
+If you need to do something more complicated, you can use
+C<LWP::UserAgent> module to create your own user-agent (e.g. browser)
+to get the job done. If you want to simulate an interactive web
+browser, you can use the C<WWW::Mechanize> module.
+
+=head2 How do I automate an HTML form submission?
+
+If you are doing something complex, such as moving through many pages
+and forms or a web site, you can use C<WWW::Mechanize>. See its
+documentation for all the details.
+
+If you're submitting values using the GET method, create a URL and encode
+the form using the C<query_form> method:
+
+ use LWP::Simple;
+ use URI::URL;
+
+ my $url = url('http://www.perl.com/cgi-bin/cpan_mod');
+ $url->query_form(module => 'DB_File', readme => 1);
+ $content = get($url);
+
+If you're using the POST method, create your own user agent and encode
+the content appropriately.
+
+ use HTTP::Request::Common qw(POST);
+ use LWP::UserAgent;
+
+ $ua = LWP::UserAgent->new();
+ my $req = POST 'http://www.perl.com/cgi-bin/cpan_mod',
+ [ module => 'DB_File', readme => 1 ];
+ $content = $ua->request($req)->as_string;
+
+=head2 How do I decode or create those %-encodings on the web?
+X<URI> X<CGI.pm> X<CGI> X<URI::Escape> X<RFC 2396>
+
+(contributed by brian d foy)
+
+Those C<%> encodings handle reserved characters in URIs, as described
+in RFC 2396, Section 2. This encoding replaces the reserved character
+with the hexadecimal representation of the character's number from
+the US-ASCII table. For instance, a colon, C<:>, becomes C<%3A>.
+
+In CGI scripts, you don't have to worry about decoding URIs if you are
+using C<CGI.pm>. You shouldn't have to process the URI yourself,
+either on the way in or the way out.
+
+If you have to encode a string yourself, remember that you should
+never try to encode an already-composed URI. You need to escape the
+components separately then put them together. To encode a string, you
+can use the the C<URI::Escape> module. The C<uri_escape> function
+returns the escaped string:
+
+ my $original = "Colon : Hash # Percent %";
+
+ my $escaped = uri_escape( $original )
+
+ print "$string\n"; # 'Colon%20%3A%20Hash%20%23%20Percent%20%25%20'
+
+To decode the string, use the C<uri_unescape> function:
+
+ my $unescaped = uri_unescape( $escaped );
+
+ print $unescaped; # back to original
+
+If you wanted to do it yourself, you simply need to replace the
+reserved characters with their encodings. A global substitution
+is one way to do it:
+
+ # encode
+ $string =~ s/([^^A-Za-z0-9\-_.!~*'()])/ sprintf "%%%0x", ord $1 /eg;
+
+ #decode
+ $string =~ s/%([A-Fa-f\d]{2})/chr hex $1/eg;
+
+=head2 How do I redirect to another page?
+
+Specify the complete URL of the destination (even if it is on the same
+server). This is one of the two different kinds of CGI "Location:"
+responses which are defined in the CGI specification for a Parsed Headers
+script. The other kind (an absolute URLpath) is resolved internally to
+the server without any HTTP redirection. The CGI specifications do not
+allow relative URLs in either case.
+
+Use of CGI.pm is strongly recommended. This example shows redirection
+with a complete URL. This redirection is handled by the web browser.
+
+ use CGI qw/:standard/;
+
+ my $url = 'http://www.cpan.org/';
+ print redirect($url);
+
+This example shows a redirection with an absolute URLpath. This
+redirection is handled by the local web server.
+
+ my $url = '/CPAN/index.html';
+ print redirect($url);
+
+But if coded directly, it could be as follows (the final "\n" is
+shown separately, for clarity), using either a complete URL or
+an absolute URLpath.
+
+ print "Location: $url\n"; # CGI response header
+ print "\n"; # end of headers
+
+=head2 How do I put a password on my web pages?
+
+To enable authentication for your web server, you need to configure
+your web server. The configuration is different for different sorts
+of web servers--apache does it differently from iPlanet which does
+it differently from IIS. Check your web server documentation for
+the details for your particular server.
+
+=head2 How do I edit my .htpasswd and .htgroup files with Perl?
+
+The HTTPD::UserAdmin and HTTPD::GroupAdmin modules provide a
+consistent OO interface to these files, regardless of how they're
+stored. Databases may be text, dbm, Berkeley DB or any database with
+a DBI compatible driver. HTTPD::UserAdmin supports files used by the
+"Basic" and "Digest" authentication schemes. Here's an example:
+
+ use HTTPD::UserAdmin ();
+ HTTPD::UserAdmin
+ ->new(DB => "/foo/.htpasswd")
+ ->add($username => $password);
+
+=head2 How do I make sure users can't enter values into a form that cause my CGI script to do bad things?
+
+See the security references listed in the CGI Meta FAQ
+
+ http://www.perl.org/CGI_MetaFAQ.html
+
+=head2 How do I parse a mail header?
+
+For a quick-and-dirty solution, try this solution derived
+from L<perlfunc/split>:
+
+ $/ = '';
+ $header = <MSG>;
+ $header =~ s/\n\s+/ /g; # merge continuation lines
+ %head = ( UNIX_FROM_LINE, split /^([-\w]+):\s*/m, $header );
+
+That solution doesn't do well if, for example, you're trying to
+maintain all the Received lines. A more complete approach is to use
+the Mail::Header module from CPAN (part of the MailTools package).
+
+=head2 How do I decode a CGI form?
+
+(contributed by brian d foy)
+
+Use the CGI.pm module that comes with Perl. It's quick,
+it's easy, and it actually does quite a bit of work to
+ensure things happen correctly. It handles GET, POST, and
+HEAD requests, multipart forms, multivalued fields, query
+string and message body combinations, and many other things
+you probably don't want to think about.
+
+It doesn't get much easier: the CGI module automatically
+parses the input and makes each value available through the
+C<param()> function.
+
+ use CGI qw(:standard);
+
+ my $total = param( 'price' ) + param( 'shipping' );
+
+ my @items = param( 'item' ); # multiple values, same field name
+
+If you want an object-oriented approach, CGI.pm can do that too.
+
+ use CGI;
+
+ my $cgi = CGI->new();
+
+ my $total = $cgi->param( 'price' ) + $cgi->param( 'shipping' );
+
+ my @items = $cgi->param( 'item' );
+
+You might also try CGI::Minimal which is a lightweight version
+of the same thing. Other CGI::* modules on CPAN might work better
+for you, too.
+
+Many people try to write their own decoder (or copy one from
+another program) and then run into one of the many "gotchas"
+of the task. It's much easier and less hassle to use CGI.pm.
+
+=head2 How do I check a valid mail address?
+
+(partly contributed by Aaron Sherman)
+
+This isn't as simple a question as it sounds. There are two parts:
+
+a) How do I verify that an email address is correctly formatted?
+
+b) How do I verify that an email address targets a valid recipient?
+
+Without sending mail to the address and seeing whether there's a human
+on the other end to answer you, you cannot fully answer part I<b>, but
+either the C<Email::Valid> or the C<RFC::RFC822::Address> module will do
+both part I<a> and part I<b> as far as you can in real-time.
+
+If you want to just check part I<a> to see that the address is valid
+according to the mail header standard with a simple regular expression,
+you can have problems, because there are deliverable addresses that
+aren't RFC-2822 (the latest mail header standard) compliant, and
+addresses that aren't deliverable which, are compliant. However, the
+following will match valid RFC-2822 addresses that do not have comments,
+folding whitespace, or any other obsolete or non-essential elements.
+This I<just> matches the address itself:
+
+ my $atom = qr{[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+};
+ my $dot_atom = qr{$atom(?:\.$atom)*};
+ my $quoted = qr{"(?:\\[^\r\n]|[^\\"])*"};
+ my $local = qr{(?:$dot_atom|$quoted)};
+ my $quotedpair = qr{\\[\x00-\x09\x0B-\x0c\x0e-\x7e]};
+ my $domain_lit = qr{\[(?:$quotedpair|[\x21-\x5a\x5e-\x7e])*\]};
+ my $domain = qr{(?:$dot_atom|$domain_lit)};
+ my $addr_spec = qr{$local\@$domain};
+
+Just match an address against C</^${addr_spec}$/> to see if it follows
+the RFC2822 specification. However, because it is impossible to be
+sure that such a correctly formed address is actually the correct way
+to reach a particular person or even has a mailbox associated with it,
+you must be very careful about how you use this.
+
+Our best advice for verifying a person's mail address is to have them
+enter their address twice, just as you normally do to change a
+password. This usually weeds out typos. If both versions match, send
+mail to that address with a personal message. If you get the message
+back and they've followed your directions, you can be reasonably
+assured that it's real.
+
+A related strategy that's less open to forgery is to give them a PIN
+(personal ID number). Record the address and PIN (best that it be a
+random one) for later processing. In the mail you send, ask them to
+include the PIN in their reply. But if it bounces, or the message is
+included via a "vacation" script, it'll be there anyway. So it's
+best to ask them to mail back a slight alteration of the PIN, such as
+with the characters reversed, one added or subtracted to each digit, etc.
+
+=head2 How do I decode a MIME/BASE64 string?
+
+The MIME-Base64 package (available from CPAN) handles this as well as
+the MIME/QP encoding. Decoding BASE64 becomes as simple as:
+
+ use MIME::Base64;
+ $decoded = decode_base64($encoded);
+
+The MIME-Tools package (available from CPAN) supports extraction with
+decoding of BASE64 encoded attachments and content directly from email
+messages.
+
+If the string to decode is short (less than 84 bytes long)
+a more direct approach is to use the unpack() function's "u"
+format after minor transliterations:
+
+ tr#A-Za-z0-9+/##cd; # remove non-base64 chars
+ tr#A-Za-z0-9+/# -_#; # convert to uuencoded format
+ $len = pack("c", 32 + 0.75*length); # compute length byte
+ print unpack("u", $len . $_); # uudecode and print
+
+=head2 How do I return the user's mail address?
+
+On systems that support getpwuid, the $< variable, and the
+Sys::Hostname module (which is part of the standard perl distribution),
+you can probably try using something like this:
+
+ use Sys::Hostname;
+ $address = sprintf('%s@%s', scalar getpwuid($<), hostname);
+
+Company policies on mail address can mean that this generates addresses
+that the company's mail system will not accept, so you should ask for
+users' mail addresses when this matters. Furthermore, not all systems
+on which Perl runs are so forthcoming with this information as is Unix.
+
+The Mail::Util module from CPAN (part of the MailTools package) provides a
+mailaddress() function that tries to guess the mail address of the user.
+It makes a more intelligent guess than the code above, using information
+given when the module was installed, but it could still be incorrect.
+Again, the best way is often just to ask the user.
+
+=head2 How do I send mail?
+
+Use the C<sendmail> program directly:
+
+ open(SENDMAIL, "|/usr/lib/sendmail -oi -t -odq")
+ or die "Can't fork for sendmail: $!\n";
+ print SENDMAIL <<"EOF";
+ From: User Originating Mail <me\@host>
+ To: Final Destination <you\@otherhost>
+ Subject: A relevant subject line
+
+ Body of the message goes here after the blank line
+ in as many lines as you like.
+ EOF
+ close(SENDMAIL) or warn "sendmail didn't close nicely";
+
+The B<-oi> option prevents sendmail from interpreting a line consisting
+of a single dot as "end of message". The B<-t> option says to use the
+headers to decide who to send the message to, and B<-odq> says to put
+the message into the queue. This last option means your message won't
+be immediately delivered, so leave it out if you want immediate
+delivery.
+
+Alternate, less convenient approaches include calling mail (sometimes
+called mailx) directly or simply opening up port 25 have having an
+intimate conversation between just you and the remote SMTP daemon,
+probably sendmail.
+
+Or you might be able use the CPAN module Mail::Mailer:
+
+ use Mail::Mailer;
+
+ $mailer = Mail::Mailer->new();
+ $mailer->open({ From => $from_address,
+ To => $to_address,
+ Subject => $subject,
+ })
+ or die "Can't open: $!\n";
+ print $mailer $body;
+ $mailer->close();
+
+The Mail::Internet module uses Net::SMTP which is less Unix-centric than
+Mail::Mailer, but less reliable. Avoid raw SMTP commands. There
+are many reasons to use a mail transport agent like sendmail. These
+include queuing, MX records, and security.
+
+=head2 How do I use MIME to make an attachment to a mail message?
+
+This answer is extracted directly from the MIME::Lite documentation.
+Create a multipart message (i.e., one with attachments).
+
+ use MIME::Lite;
+
+ ### Create a new multipart message:
+ $msg = MIME::Lite->new(
+ From =>'me@myhost.com',
+ To =>'you@yourhost.com',
+ Cc =>'some@other.com, some@more.com',
+ Subject =>'A message with 2 parts...',
+ Type =>'multipart/mixed'
+ );
+
+ ### Add parts (each "attach" has same arguments as "new"):
+ $msg->attach(Type =>'TEXT',
+ Data =>"Here's the GIF file you wanted"
+ );
+ $msg->attach(Type =>'image/gif',
+ Path =>'aaa000123.gif',
+ Filename =>'logo.gif'
+ );
+
+ $text = $msg->as_string;
+
+MIME::Lite also includes a method for sending these things.
+
+ $msg->send;
+
+This defaults to using L<sendmail> but can be customized to use
+SMTP via L<Net::SMTP>.
+
+=head2 How do I read mail?
+
+While you could use the Mail::Folder module from CPAN (part of the
+MailFolder package) or the Mail::Internet module from CPAN (part
+of the MailTools package), often a module is overkill. Here's a
+mail sorter.
+
+ #!/usr/bin/perl
+
+ my(@msgs, @sub);
+ my $msgno = -1;
+ $/ = ''; # paragraph reads
+ while (<>) {
+ if (/^From /m) {
+ /^Subject:\s*(?:Re:\s*)*(.*)/mi;
+ $sub[++$msgno] = lc($1) || '';
+ }
+ $msgs[$msgno] .= $_;
+ }
+ for my $i (sort { $sub[$a] cmp $sub[$b] || $a <=> $b } (0 .. $#msgs)) {
+ print $msgs[$i];
+ }
+
+Or more succinctly,
+
+ #!/usr/bin/perl -n00
+ # bysub2 - awkish sort-by-subject
+ BEGIN { $msgno = -1 }
+ $sub[++$msgno] = (/^Subject:\s*(?:Re:\s*)*(.*)/mi)[0] if /^From/m;
+ $msg[$msgno] .= $_;
+ END { print @msg[ sort { $sub[$a] cmp $sub[$b] || $a <=> $b } (0 .. $#msg) ] }
+
+=head2 How do I find out my hostname, domainname, or IP address?
+X<hostname, domainname, IP address, host, domain, hostfqdn, inet_ntoa,
+gethostbyname, Socket, Net::Domain, Sys::Hostname>
+
+(contributed by brian d foy)
+
+The Net::Domain module, which is part of the standard distribution starting
+in perl5.7.3, can get you the fully qualified domain name (FQDN), the host
+name, or the domain name.
+
+ use Net::Domain qw(hostname hostfqdn hostdomain);
+
+ my $host = hostfqdn();
+
+The C<Sys::Hostname> module, included in the standard distribution since
+perl5.6, can also get the hostname.
+
+ use Sys::Hostname;
+
+ $host = hostname();
+
+To get the IP address, you can use the C<gethostbyname> built-in function
+to turn the name into a number. To turn that number into the dotted octet
+form (a.b.c.d) that most people expect, use the C<inet_ntoa> function
+from the <Socket> module, which also comes with perl.
+
+ use Socket;
+
+ my $address = inet_ntoa(
+ scalar gethostbyname( $host || 'localhost' )
+ );
+
+=head2 How do I fetch a news article or the active newsgroups?
+
+Use the Net::NNTP or News::NNTPClient modules, both available from CPAN.
+This can make tasks like fetching the newsgroup list as simple as
+
+ perl -MNews::NNTPClient
+ -e 'print News::NNTPClient->new->list("newsgroups")'
+
+=head2 How do I fetch/put an FTP file?
+
+LWP::Simple (available from CPAN) can fetch but not put. Net::FTP (also
+available from CPAN) is more complex but can put as well as fetch.
+
+=head2 How can I do RPC in Perl?
+
+(Contributed by brian d foy)
+
+Use one of the RPC modules you can find on CPAN (
+http://search.cpan.org/search?query=RPC&mode=all ).
+
+=head1 REVISION
+
+Revision: $Revision$
+
+Date: $Date$
+
+See L<perlfaq> for source control details and availability.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2009 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain. You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit. A simple comment in the code giving
+credit would be courteous but is not required.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfilter.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfilter.pod
new file mode 100755
index 00000000000..79f7a5d2da1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfilter.pod
@@ -0,0 +1,588 @@
+=head1 NAME
+
+perlfilter - Source Filters
+
+=head1 DESCRIPTION
+
+This article is about a little-known feature of Perl called
+I<source filters>. Source filters alter the program text of a module
+before Perl sees it, much as a C preprocessor alters the source text of
+a C program before the compiler sees it. This article tells you more
+about what source filters are, how they work, and how to write your
+own.
+
+The original purpose of source filters was to let you encrypt your
+program source to prevent casual piracy. This isn't all they can do, as
+you'll soon learn. But first, the basics.
+
+=head1 CONCEPTS
+
+Before the Perl interpreter can execute a Perl script, it must first
+read it from a file into memory for parsing and compilation. If that
+script itself includes other scripts with a C<use> or C<require>
+statement, then each of those scripts will have to be read from their
+respective files as well.
+
+Now think of each logical connection between the Perl parser and an
+individual file as a I<source stream>. A source stream is created when
+the Perl parser opens a file, it continues to exist as the source code
+is read into memory, and it is destroyed when Perl is finished parsing
+the file. If the parser encounters a C<require> or C<use> statement in
+a source stream, a new and distinct stream is created just for that
+file.
+
+The diagram below represents a single source stream, with the flow of
+source from a Perl script file on the left into the Perl parser on the
+right. This is how Perl normally operates.
+
+ file -------> parser
+
+There are two important points to remember:
+
+=over 5
+
+=item 1.
+
+Although there can be any number of source streams in existence at any
+given time, only one will be active.
+
+=item 2.
+
+Every source stream is associated with only one file.
+
+=back
+
+A source filter is a special kind of Perl module that intercepts and
+modifies a source stream before it reaches the parser. A source filter
+changes our diagram like this:
+
+ file ----> filter ----> parser
+
+If that doesn't make much sense, consider the analogy of a command
+pipeline. Say you have a shell script stored in the compressed file
+I<trial.gz>. The simple pipeline command below runs the script without
+needing to create a temporary file to hold the uncompressed file.
+
+ gunzip -c trial.gz | sh
+
+In this case, the data flow from the pipeline can be represented as follows:
+
+ trial.gz ----> gunzip ----> sh
+
+With source filters, you can store the text of your script compressed and use a source filter to uncompress it for Perl's parser:
+
+ compressed gunzip
+ Perl program ---> source filter ---> parser
+
+=head1 USING FILTERS
+
+So how do you use a source filter in a Perl script? Above, I said that
+a source filter is just a special kind of module. Like all Perl
+modules, a source filter is invoked with a use statement.
+
+Say you want to pass your Perl source through the C preprocessor before
+execution. You could use the existing C<-P> command line option to do
+this, but as it happens, the source filters distribution comes with a C
+preprocessor filter module called Filter::cpp. Let's use that instead.
+
+Below is an example program, C<cpp_test>, which makes use of this filter.
+Line numbers have been added to allow specific lines to be referenced
+easily.
+
+ 1: use Filter::cpp;
+ 2: #define TRUE 1
+ 3: $a = TRUE;
+ 4: print "a = $a\n";
+
+When you execute this script, Perl creates a source stream for the
+file. Before the parser processes any of the lines from the file, the
+source stream looks like this:
+
+ cpp_test ---------> parser
+
+Line 1, C<use Filter::cpp>, includes and installs the C<cpp> filter
+module. All source filters work this way. The use statement is compiled
+and executed at compile time, before any more of the file is read, and
+it attaches the cpp filter to the source stream behind the scenes. Now
+the data flow looks like this:
+
+ cpp_test ----> cpp filter ----> parser
+
+As the parser reads the second and subsequent lines from the source
+stream, it feeds those lines through the C<cpp> source filter before
+processing them. The C<cpp> filter simply passes each line through the
+real C preprocessor. The output from the C preprocessor is then
+inserted back into the source stream by the filter.
+
+ .-> cpp --.
+ | |
+ | |
+ | <-'
+ cpp_test ----> cpp filter ----> parser
+
+The parser then sees the following code:
+
+ use Filter::cpp;
+ $a = 1;
+ print "a = $a\n";
+
+Let's consider what happens when the filtered code includes another
+module with use:
+
+ 1: use Filter::cpp;
+ 2: #define TRUE 1
+ 3: use Fred;
+ 4: $a = TRUE;
+ 5: print "a = $a\n";
+
+The C<cpp> filter does not apply to the text of the Fred module, only
+to the text of the file that used it (C<cpp_test>). Although the use
+statement on line 3 will pass through the cpp filter, the module that
+gets included (C<Fred>) will not. The source streams look like this
+after line 3 has been parsed and before line 4 is parsed:
+
+ cpp_test ---> cpp filter ---> parser (INACTIVE)
+
+ Fred.pm ----> parser
+
+As you can see, a new stream has been created for reading the source
+from C<Fred.pm>. This stream will remain active until all of C<Fred.pm>
+has been parsed. The source stream for C<cpp_test> will still exist,
+but is inactive. Once the parser has finished reading Fred.pm, the
+source stream associated with it will be destroyed. The source stream
+for C<cpp_test> then becomes active again and the parser reads line 4
+and subsequent lines from C<cpp_test>.
+
+You can use more than one source filter on a single file. Similarly,
+you can reuse the same filter in as many files as you like.
+
+For example, if you have a uuencoded and compressed source file, it is
+possible to stack a uudecode filter and an uncompression filter like
+this:
+
+ use Filter::uudecode; use Filter::uncompress;
+ M'XL(".H<US4''V9I;F%L')Q;>7/;1I;_>_I3=&E=%:F*I"T?22Q/
+ M6]9*<IQCO*XFT"0[PL%%'Y+IG?WN^ZYN-$'J.[.JE$,20/?K=_[>
+ ...
+
+Once the first line has been processed, the flow will look like this:
+
+ file ---> uudecode ---> uncompress ---> parser
+ filter filter
+
+Data flows through filters in the same order they appear in the source
+file. The uudecode filter appeared before the uncompress filter, so the
+source file will be uudecoded before it's uncompressed.
+
+=head1 WRITING A SOURCE FILTER
+
+There are three ways to write your own source filter. You can write it
+in C, use an external program as a filter, or write the filter in Perl.
+I won't cover the first two in any great detail, so I'll get them out
+of the way first. Writing the filter in Perl is most convenient, so
+I'll devote the most space to it.
+
+=head1 WRITING A SOURCE FILTER IN C
+
+The first of the three available techniques is to write the filter
+completely in C. The external module you create interfaces directly
+with the source filter hooks provided by Perl.
+
+The advantage of this technique is that you have complete control over
+the implementation of your filter. The big disadvantage is the
+increased complexity required to write the filter - not only do you
+need to understand the source filter hooks, but you also need a
+reasonable knowledge of Perl guts. One of the few times it is worth
+going to this trouble is when writing a source scrambler. The
+C<decrypt> filter (which unscrambles the source before Perl parses it)
+included with the source filter distribution is an example of a C
+source filter (see Decryption Filters, below).
+
+
+=over 5
+
+=item B<Decryption Filters>
+
+All decryption filters work on the principle of "security through
+obscurity." Regardless of how well you write a decryption filter and
+how strong your encryption algorithm is, anyone determined enough can
+retrieve the original source code. The reason is quite simple - once
+the decryption filter has decrypted the source back to its original
+form, fragments of it will be stored in the computer's memory as Perl
+parses it. The source might only be in memory for a short period of
+time, but anyone possessing a debugger, skill, and lots of patience can
+eventually reconstruct your program.
+
+That said, there are a number of steps that can be taken to make life
+difficult for the potential cracker. The most important: Write your
+decryption filter in C and statically link the decryption module into
+the Perl binary. For further tips to make life difficult for the
+potential cracker, see the file I<decrypt.pm> in the source filters
+module.
+
+=back
+
+=head1 CREATING A SOURCE FILTER AS A SEPARATE EXECUTABLE
+
+An alternative to writing the filter in C is to create a separate
+executable in the language of your choice. The separate executable
+reads from standard input, does whatever processing is necessary, and
+writes the filtered data to standard output. C<Filter::cpp> is an
+example of a source filter implemented as a separate executable - the
+executable is the C preprocessor bundled with your C compiler.
+
+The source filter distribution includes two modules that simplify this
+task: C<Filter::exec> and C<Filter::sh>. Both allow you to run any
+external executable. Both use a coprocess to control the flow of data
+into and out of the external executable. (For details on coprocesses,
+see Stephens, W.R. "Advanced Programming in the UNIX Environment."
+Addison-Wesley, ISBN 0-210-56317-7, pages 441-445.) The difference
+between them is that C<Filter::exec> spawns the external command
+directly, while C<Filter::sh> spawns a shell to execute the external
+command. (Unix uses the Bourne shell; NT uses the cmd shell.) Spawning
+a shell allows you to make use of the shell metacharacters and
+redirection facilities.
+
+Here is an example script that uses C<Filter::sh>:
+
+ use Filter::sh 'tr XYZ PQR';
+ $a = 1;
+ print "XYZ a = $a\n";
+
+The output you'll get when the script is executed:
+
+ PQR a = 1
+
+Writing a source filter as a separate executable works fine, but a
+small performance penalty is incurred. For example, if you execute the
+small example above, a separate subprocess will be created to run the
+Unix C<tr> command. Each use of the filter requires its own subprocess.
+If creating subprocesses is expensive on your system, you might want to
+consider one of the other options for creating source filters.
+
+=head1 WRITING A SOURCE FILTER IN PERL
+
+The easiest and most portable option available for creating your own
+source filter is to write it completely in Perl. To distinguish this
+from the previous two techniques, I'll call it a Perl source filter.
+
+To help understand how to write a Perl source filter we need an example
+to study. Here is a complete source filter that performs rot13
+decoding. (Rot13 is a very simple encryption scheme used in Usenet
+postings to hide the contents of offensive posts. It moves every letter
+forward thirteen places, so that A becomes N, B becomes O, and Z
+becomes M.)
+
+
+ package Rot13;
+
+ use Filter::Util::Call;
+
+ sub import {
+ my ($type) = @_;
+ my ($ref) = [];
+ filter_add(bless $ref);
+ }
+
+ sub filter {
+ my ($self) = @_;
+ my ($status);
+
+ tr/n-za-mN-ZA-M/a-zA-Z/
+ if ($status = filter_read()) > 0;
+ $status;
+ }
+
+ 1;
+
+All Perl source filters are implemented as Perl classes and have the
+same basic structure as the example above.
+
+First, we include the C<Filter::Util::Call> module, which exports a
+number of functions into your filter's namespace. The filter shown
+above uses two of these functions, C<filter_add()> and
+C<filter_read()>.
+
+Next, we create the filter object and associate it with the source
+stream by defining the C<import> function. If you know Perl well
+enough, you know that C<import> is called automatically every time a
+module is included with a use statement. This makes C<import> the ideal
+place to both create and install a filter object.
+
+In the example filter, the object (C<$ref>) is blessed just like any
+other Perl object. Our example uses an anonymous array, but this isn't
+a requirement. Because this example doesn't need to store any context
+information, we could have used a scalar or hash reference just as
+well. The next section demonstrates context data.
+
+The association between the filter object and the source stream is made
+with the C<filter_add()> function. This takes a filter object as a
+parameter (C<$ref> in this case) and installs it in the source stream.
+
+Finally, there is the code that actually does the filtering. For this
+type of Perl source filter, all the filtering is done in a method
+called C<filter()>. (It is also possible to write a Perl source filter
+using a closure. See the C<Filter::Util::Call> manual page for more
+details.) It's called every time the Perl parser needs another line of
+source to process. The C<filter()> method, in turn, reads lines from
+the source stream using the C<filter_read()> function.
+
+If a line was available from the source stream, C<filter_read()>
+returns a status value greater than zero and appends the line to C<$_>.
+A status value of zero indicates end-of-file, less than zero means an
+error. The filter function itself is expected to return its status in
+the same way, and put the filtered line it wants written to the source
+stream in C<$_>. The use of C<$_> accounts for the brevity of most Perl
+source filters.
+
+In order to make use of the rot13 filter we need some way of encoding
+the source file in rot13 format. The script below, C<mkrot13>, does
+just that.
+
+ die "usage mkrot13 filename\n" unless @ARGV;
+ my $in = $ARGV[0];
+ my $out = "$in.tmp";
+ open(IN, "<$in") or die "Cannot open file $in: $!\n";
+ open(OUT, ">$out") or die "Cannot open file $out: $!\n";
+
+ print OUT "use Rot13;\n";
+ while (<IN>) {
+ tr/a-zA-Z/n-za-mN-ZA-M/;
+ print OUT;
+ }
+
+ close IN;
+ close OUT;
+ unlink $in;
+ rename $out, $in;
+
+If we encrypt this with C<mkrot13>:
+
+ print " hello fred \n";
+
+the result will be this:
+
+ use Rot13;
+ cevag "uryyb serq\a";
+
+Running it produces this output:
+
+ hello fred
+
+=head1 USING CONTEXT: THE DEBUG FILTER
+
+The rot13 example was a trivial example. Here's another demonstration
+that shows off a few more features.
+
+Say you wanted to include a lot of debugging code in your Perl script
+during development, but you didn't want it available in the released
+product. Source filters offer a solution. In order to keep the example
+simple, let's say you wanted the debugging output to be controlled by
+an environment variable, C<DEBUG>. Debugging code is enabled if the
+variable exists, otherwise it is disabled.
+
+Two special marker lines will bracket debugging code, like this:
+
+ ## DEBUG_BEGIN
+ if ($year > 1999) {
+ warn "Debug: millennium bug in year $year\n";
+ }
+ ## DEBUG_END
+
+When the C<DEBUG> environment variable exists, the filter ensures that
+Perl parses only the code between the C<DEBUG_BEGIN> and C<DEBUG_END>
+markers. That means that when C<DEBUG> does exist, the code above
+should be passed through the filter unchanged. The marker lines can
+also be passed through as-is, because the Perl parser will see them as
+comment lines. When C<DEBUG> isn't set, we need a way to disable the
+debug code. A simple way to achieve that is to convert the lines
+between the two markers into comments:
+
+ ## DEBUG_BEGIN
+ #if ($year > 1999) {
+ # warn "Debug: millennium bug in year $year\n";
+ #}
+ ## DEBUG_END
+
+Here is the complete Debug filter:
+
+ package Debug;
+
+ use strict;
+ use warnings;
+ use Filter::Util::Call;
+
+ use constant TRUE => 1;
+ use constant FALSE => 0;
+
+ sub import {
+ my ($type) = @_;
+ my (%context) = (
+ Enabled => defined $ENV{DEBUG},
+ InTraceBlock => FALSE,
+ Filename => (caller)[1],
+ LineNo => 0,
+ LastBegin => 0,
+ );
+ filter_add(bless \%context);
+ }
+
+ sub Die {
+ my ($self) = shift;
+ my ($message) = shift;
+ my ($line_no) = shift || $self->{LastBegin};
+ die "$message at $self->{Filename} line $line_no.\n"
+ }
+
+ sub filter {
+ my ($self) = @_;
+ my ($status);
+ $status = filter_read();
+ ++ $self->{LineNo};
+
+ # deal with EOF/error first
+ if ($status <= 0) {
+ $self->Die("DEBUG_BEGIN has no DEBUG_END")
+ if $self->{InTraceBlock};
+ return $status;
+ }
+
+ if ($self->{InTraceBlock}) {
+ if (/^\s*##\s*DEBUG_BEGIN/ ) {
+ $self->Die("Nested DEBUG_BEGIN", $self->{LineNo})
+ } elsif (/^\s*##\s*DEBUG_END/) {
+ $self->{InTraceBlock} = FALSE;
+ }
+
+ # comment out the debug lines when the filter is disabled
+ s/^/#/ if ! $self->{Enabled};
+ } elsif ( /^\s*##\s*DEBUG_BEGIN/ ) {
+ $self->{InTraceBlock} = TRUE;
+ $self->{LastBegin} = $self->{LineNo};
+ } elsif ( /^\s*##\s*DEBUG_END/ ) {
+ $self->Die("DEBUG_END has no DEBUG_BEGIN", $self->{LineNo});
+ }
+ return $status;
+ }
+
+ 1;
+
+The big difference between this filter and the previous example is the
+use of context data in the filter object. The filter object is based on
+a hash reference, and is used to keep various pieces of context
+information between calls to the filter function. All but two of the
+hash fields are used for error reporting. The first of those two,
+Enabled, is used by the filter to determine whether the debugging code
+should be given to the Perl parser. The second, InTraceBlock, is true
+when the filter has encountered a C<DEBUG_BEGIN> line, but has not yet
+encountered the following C<DEBUG_END> line.
+
+If you ignore all the error checking that most of the code does, the
+essence of the filter is as follows:
+
+ sub filter {
+ my ($self) = @_;
+ my ($status);
+ $status = filter_read();
+
+ # deal with EOF/error first
+ return $status if $status <= 0;
+ if ($self->{InTraceBlock}) {
+ if (/^\s*##\s*DEBUG_END/) {
+ $self->{InTraceBlock} = FALSE
+ }
+
+ # comment out debug lines when the filter is disabled
+ s/^/#/ if ! $self->{Enabled};
+ } elsif ( /^\s*##\s*DEBUG_BEGIN/ ) {
+ $self->{InTraceBlock} = TRUE;
+ }
+ return $status;
+ }
+
+Be warned: just as the C-preprocessor doesn't know C, the Debug filter
+doesn't know Perl. It can be fooled quite easily:
+
+ print <<EOM;
+ ##DEBUG_BEGIN
+ EOM
+
+Such things aside, you can see that a lot can be achieved with a modest
+amount of code.
+
+=head1 CONCLUSION
+
+You now have better understanding of what a source filter is, and you
+might even have a possible use for them. If you feel like playing with
+source filters but need a bit of inspiration, here are some extra
+features you could add to the Debug filter.
+
+First, an easy one. Rather than having debugging code that is
+all-or-nothing, it would be much more useful to be able to control
+which specific blocks of debugging code get included. Try extending the
+syntax for debug blocks to allow each to be identified. The contents of
+the C<DEBUG> environment variable can then be used to control which
+blocks get included.
+
+Once you can identify individual blocks, try allowing them to be
+nested. That isn't difficult either.
+
+Here is an interesting idea that doesn't involve the Debug filter.
+Currently Perl subroutines have fairly limited support for formal
+parameter lists. You can specify the number of parameters and their
+type, but you still have to manually take them out of the C<@_> array
+yourself. Write a source filter that allows you to have a named
+parameter list. Such a filter would turn this:
+
+ sub MySub ($first, $second, @rest) { ... }
+
+into this:
+
+ sub MySub($$@) {
+ my ($first) = shift;
+ my ($second) = shift;
+ my (@rest) = @_;
+ ...
+ }
+
+Finally, if you feel like a real challenge, have a go at writing a
+full-blown Perl macro preprocessor as a source filter. Borrow the
+useful features from the C preprocessor and any other macro processors
+you know. The tricky bit will be choosing how much knowledge of Perl's
+syntax you want your filter to have.
+
+=head1 THINGS TO LOOK OUT FOR
+
+=over 5
+
+=item Some Filters Clobber the C<DATA> Handle
+
+Some source filters use the C<DATA> handle to read the calling program.
+When using these source filters you cannot rely on this handle, nor expect
+any particular kind of behavior when operating on it. Filters based on
+Filter::Util::Call (and therefore Filter::Simple) do not alter the C<DATA>
+filehandle.
+
+=back
+
+=head1 REQUIREMENTS
+
+The Source Filters distribution is available on CPAN, in
+
+ CPAN/modules/by-module/Filter
+
+Starting from Perl 5.8 Filter::Util::Call (the core part of the
+Source Filters distribution) is part of the standard Perl distribution.
+Also included is a friendlier interface called Filter::Simple, by
+Damian Conway.
+
+=head1 AUTHOR
+
+Paul Marquess E<lt>Paul.Marquess@btinternet.comE<gt>
+
+=head1 Copyrights
+
+This article originally appeared in The Perl Journal #11, and is
+copyright 1998 The Perl Journal. It appears courtesy of Jon Orwant and
+The Perl Journal. This document may be distributed under the same terms
+as Perl itself.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfork.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfork.pod
new file mode 100755
index 00000000000..48d65ed4c58
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfork.pod
@@ -0,0 +1,323 @@
+=head1 NAME
+
+perlfork - Perl's fork() emulation
+
+=head1 SYNOPSIS
+
+ NOTE: As of the 5.8.0 release, fork() emulation has considerably
+ matured. However, there are still a few known bugs and differences
+ from real fork() that might affect you. See the "BUGS" and
+ "CAVEATS AND LIMITATIONS" sections below.
+
+Perl provides a fork() keyword that corresponds to the Unix system call
+of the same name. On most Unix-like platforms where the fork() system
+call is available, Perl's fork() simply calls it.
+
+On some platforms such as Windows where the fork() system call is not
+available, Perl can be built to emulate fork() at the interpreter level.
+While the emulation is designed to be as compatible as possible with the
+real fork() at the level of the Perl program, there are certain
+important differences that stem from the fact that all the pseudo child
+"processes" created this way live in the same real process as far as the
+operating system is concerned.
+
+This document provides a general overview of the capabilities and
+limitations of the fork() emulation. Note that the issues discussed here
+are not applicable to platforms where a real fork() is available and Perl
+has been configured to use it.
+
+=head1 DESCRIPTION
+
+The fork() emulation is implemented at the level of the Perl interpreter.
+What this means in general is that running fork() will actually clone the
+running interpreter and all its state, and run the cloned interpreter in
+a separate thread, beginning execution in the new thread just after the
+point where the fork() was called in the parent. We will refer to the
+thread that implements this child "process" as the pseudo-process.
+
+To the Perl program that called fork(), all this is designed to be
+transparent. The parent returns from the fork() with a pseudo-process
+ID that can be subsequently used in any process manipulation functions;
+the child returns from the fork() with a value of C<0> to signify that
+it is the child pseudo-process.
+
+=head2 Behavior of other Perl features in forked pseudo-processes
+
+Most Perl features behave in a natural way within pseudo-processes.
+
+=over 8
+
+=item $$ or $PROCESS_ID
+
+This special variable is correctly set to the pseudo-process ID.
+It can be used to identify pseudo-processes within a particular
+session. Note that this value is subject to recycling if any
+pseudo-processes are launched after others have been wait()-ed on.
+
+=item %ENV
+
+Each pseudo-process maintains its own virtual environment. Modifications
+to %ENV affect the virtual environment, and are only visible within that
+pseudo-process, and in any processes (or pseudo-processes) launched from
+it.
+
+=item chdir() and all other builtins that accept filenames
+
+Each pseudo-process maintains its own virtual idea of the current directory.
+Modifications to the current directory using chdir() are only visible within
+that pseudo-process, and in any processes (or pseudo-processes) launched from
+it. All file and directory accesses from the pseudo-process will correctly
+map the virtual working directory to the real working directory appropriately.
+
+=item wait() and waitpid()
+
+wait() and waitpid() can be passed a pseudo-process ID returned by fork().
+These calls will properly wait for the termination of the pseudo-process
+and return its status.
+
+=item kill()
+
+kill() can be used to terminate a pseudo-process by passing it the ID returned
+by fork(). This should not be used except under dire circumstances, because
+the operating system may not guarantee integrity of the process resources
+when a running thread is terminated. Note that using kill() on a
+pseudo-process() may typically cause memory leaks, because the thread that
+implements the pseudo-process does not get a chance to clean up its resources.
+
+=item exec()
+
+Calling exec() within a pseudo-process actually spawns the requested
+executable in a separate process and waits for it to complete before
+exiting with the same exit status as that process. This means that the
+process ID reported within the running executable will be different from
+what the earlier Perl fork() might have returned. Similarly, any process
+manipulation functions applied to the ID returned by fork() will affect the
+waiting pseudo-process that called exec(), not the real process it is
+waiting for after the exec().
+
+When exec() is called inside a pseudo-process then DESTROY methods and
+END blocks will still be called after the external process returns.
+
+=item exit()
+
+exit() always exits just the executing pseudo-process, after automatically
+wait()-ing for any outstanding child pseudo-processes. Note that this means
+that the process as a whole will not exit unless all running pseudo-processes
+have exited. See below for some limitations with open filehandles.
+
+=item Open handles to files, directories and network sockets
+
+All open handles are dup()-ed in pseudo-processes, so that closing
+any handles in one process does not affect the others. See below for
+some limitations.
+
+=back
+
+=head2 Resource limits
+
+In the eyes of the operating system, pseudo-processes created via the fork()
+emulation are simply threads in the same process. This means that any
+process-level limits imposed by the operating system apply to all
+pseudo-processes taken together. This includes any limits imposed by the
+operating system on the number of open file, directory and socket handles,
+limits on disk space usage, limits on memory size, limits on CPU utilization
+etc.
+
+=head2 Killing the parent process
+
+If the parent process is killed (either using Perl's kill() builtin, or
+using some external means) all the pseudo-processes are killed as well,
+and the whole process exits.
+
+=head2 Lifetime of the parent process and pseudo-processes
+
+During the normal course of events, the parent process and every
+pseudo-process started by it will wait for their respective pseudo-children
+to complete before they exit. This means that the parent and every
+pseudo-child created by it that is also a pseudo-parent will only exit
+after their pseudo-children have exited.
+
+A way to mark a pseudo-processes as running detached from their parent (so
+that the parent would not have to wait() for them if it doesn't want to)
+will be provided in future.
+
+=head2 CAVEATS AND LIMITATIONS
+
+=over 8
+
+=item BEGIN blocks
+
+The fork() emulation will not work entirely correctly when called from
+within a BEGIN block. The forked copy will run the contents of the
+BEGIN block, but will not continue parsing the source stream after the
+BEGIN block. For example, consider the following code:
+
+ BEGIN {
+ fork and exit; # fork child and exit the parent
+ print "inner\n";
+ }
+ print "outer\n";
+
+This will print:
+
+ inner
+
+rather than the expected:
+
+ inner
+ outer
+
+This limitation arises from fundamental technical difficulties in
+cloning and restarting the stacks used by the Perl parser in the
+middle of a parse.
+
+=item Open filehandles
+
+Any filehandles open at the time of the fork() will be dup()-ed. Thus,
+the files can be closed independently in the parent and child, but beware
+that the dup()-ed handles will still share the same seek pointer. Changing
+the seek position in the parent will change it in the child and vice-versa.
+One can avoid this by opening files that need distinct seek pointers
+separately in the child.
+
+On some operating systems, notably Solaris and Unixware, calling C<exit()>
+from a child process will flush and close open filehandles in the parent,
+thereby corrupting the filehandles. On these systems, calling C<_exit()>
+is suggested instead. C<_exit()> is available in Perl through the
+C<POSIX> module. Please consult your systems manpages for more information
+on this.
+
+=item Forking pipe open() not yet implemented
+
+The C<open(FOO, "|-")> and C<open(BAR, "-|")> constructs are not yet
+implemented. This limitation can be easily worked around in new code
+by creating a pipe explicitly. The following example shows how to
+write to a forked child:
+
+ # simulate open(FOO, "|-")
+ sub pipe_to_fork ($) {
+ my $parent = shift;
+ pipe my $child, $parent or die;
+ my $pid = fork();
+ die "fork() failed: $!" unless defined $pid;
+ if ($pid) {
+ close $child;
+ }
+ else {
+ close $parent;
+ open(STDIN, "<&=" . fileno($child)) or die;
+ }
+ $pid;
+ }
+
+ if (pipe_to_fork('FOO')) {
+ # parent
+ print FOO "pipe_to_fork\n";
+ close FOO;
+ }
+ else {
+ # child
+ while (<STDIN>) { print; }
+ exit(0);
+ }
+
+And this one reads from the child:
+
+ # simulate open(FOO, "-|")
+ sub pipe_from_fork ($) {
+ my $parent = shift;
+ pipe $parent, my $child or die;
+ my $pid = fork();
+ die "fork() failed: $!" unless defined $pid;
+ if ($pid) {
+ close $child;
+ }
+ else {
+ close $parent;
+ open(STDOUT, ">&=" . fileno($child)) or die;
+ }
+ $pid;
+ }
+
+ if (pipe_from_fork('BAR')) {
+ # parent
+ while (<BAR>) { print; }
+ close BAR;
+ }
+ else {
+ # child
+ print "pipe_from_fork\n";
+ exit(0);
+ }
+
+Forking pipe open() constructs will be supported in future.
+
+=item Global state maintained by XSUBs
+
+External subroutines (XSUBs) that maintain their own global state may
+not work correctly. Such XSUBs will either need to maintain locks to
+protect simultaneous access to global data from different pseudo-processes,
+or maintain all their state on the Perl symbol table, which is copied
+naturally when fork() is called. A callback mechanism that provides
+extensions an opportunity to clone their state will be provided in the
+near future.
+
+=item Interpreter embedded in larger application
+
+The fork() emulation may not behave as expected when it is executed in an
+application which embeds a Perl interpreter and calls Perl APIs that can
+evaluate bits of Perl code. This stems from the fact that the emulation
+only has knowledge about the Perl interpreter's own data structures and
+knows nothing about the containing application's state. For example, any
+state carried on the application's own call stack is out of reach.
+
+=item Thread-safety of extensions
+
+Since the fork() emulation runs code in multiple threads, extensions
+calling into non-thread-safe libraries may not work reliably when
+calling fork(). As Perl's threading support gradually becomes more
+widely adopted even on platforms with a native fork(), such extensions
+are expected to be fixed for thread-safety.
+
+=back
+
+=head1 BUGS
+
+=over 8
+
+=item *
+
+Having pseudo-process IDs be negative integers breaks down for the integer
+C<-1> because the wait() and waitpid() functions treat this number as
+being special. The tacit assumption in the current implementation is that
+the system never allocates a thread ID of C<1> for user threads. A better
+representation for pseudo-process IDs will be implemented in future.
+
+=item *
+
+In certain cases, the OS-level handles created by the pipe(), socket(),
+and accept() operators are apparently not duplicated accurately in
+pseudo-processes. This only happens in some situations, but where it
+does happen, it may result in deadlocks between the read and write ends
+of pipe handles, or inability to send or receive data across socket
+handles.
+
+=item *
+
+This document may be incomplete in some respects.
+
+=back
+
+=head1 AUTHOR
+
+Support for concurrent interpreters and the fork() emulation was implemented
+by ActiveState, with funding from Microsoft Corporation.
+
+This document is authored and maintained by Gurusamy Sarathy
+E<lt>gsar@activestate.comE<gt>.
+
+=head1 SEE ALSO
+
+L<perlfunc/"fork">, L<perlipc>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlform.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlform.pod
new file mode 100755
index 00000000000..3cfa1b768d0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlform.pod
@@ -0,0 +1,459 @@
+=head1 NAME
+X<format> X<report> X<chart>
+
+perlform - Perl formats
+
+=head1 DESCRIPTION
+
+Perl has a mechanism to help you generate simple reports and charts. To
+facilitate this, Perl helps you code up your output page close to how it
+will look when it's printed. It can keep track of things like how many
+lines are on a page, what page you're on, when to print page headers,
+etc. Keywords are borrowed from FORTRAN: format() to declare and write()
+to execute; see their entries in L<perlfunc>. Fortunately, the layout is
+much more legible, more like BASIC's PRINT USING statement. Think of it
+as a poor man's nroff(1).
+X<nroff>
+
+Formats, like packages and subroutines, are declared rather than
+executed, so they may occur at any point in your program. (Usually it's
+best to keep them all together though.) They have their own namespace
+apart from all the other "types" in Perl. This means that if you have a
+function named "Foo", it is not the same thing as having a format named
+"Foo". However, the default name for the format associated with a given
+filehandle is the same as the name of the filehandle. Thus, the default
+format for STDOUT is named "STDOUT", and the default format for filehandle
+TEMP is named "TEMP". They just look the same. They aren't.
+
+Output record formats are declared as follows:
+
+ format NAME =
+ FORMLIST
+ .
+
+If the name is omitted, format "STDOUT" is defined. A single "." in
+column 1 is used to terminate a format. FORMLIST consists of a sequence
+of lines, each of which may be one of three types:
+
+=over 4
+
+=item 1.
+
+A comment, indicated by putting a '#' in the first column.
+
+=item 2.
+
+A "picture" line giving the format for one output line.
+
+=item 3.
+
+An argument line supplying values to plug into the previous picture line.
+
+=back
+
+Picture lines contain output field definitions, intermingled with
+literal text. These lines do not undergo any kind of variable interpolation.
+Field definitions are made up from a set of characters, for starting and
+extending a field to its desired width. This is the complete set of
+characters for field definitions:
+X<format, picture line>
+X<@> X<^> X<< < >> X<< | >> X<< > >> X<#> X<0> X<.> X<...>
+X<@*> X<^*> X<~> X<~~>
+
+ @ start of regular field
+ ^ start of special field
+ < pad character for left justification
+ | pad character for centering
+ > pad character for right justification
+ # pad character for a right justified numeric field
+ 0 instead of first #: pad number with leading zeroes
+ . decimal point within a numeric field
+ ... terminate a text field, show "..." as truncation evidence
+ @* variable width field for a multi-line value
+ ^* variable width field for next line of a multi-line value
+ ~ suppress line with all fields empty
+ ~~ repeat line until all fields are exhausted
+
+Each field in a picture line starts with either "@" (at) or "^" (caret),
+indicating what we'll call, respectively, a "regular" or "special" field.
+The choice of pad characters determines whether a field is textual or
+numeric. The tilde operators are not part of a field. Let's look at
+the various possibilities in detail.
+
+
+=head2 Text Fields
+X<format, text field>
+
+The length of the field is supplied by padding out the field with multiple
+"E<lt>", "E<gt>", or "|" characters to specify a non-numeric field with,
+respectively, left justification, right justification, or centering.
+For a regular field, the value (up to the first newline) is taken and
+printed according to the selected justification, truncating excess characters.
+If you terminate a text field with "...", three dots will be shown if
+the value is truncated. A special text field may be used to do rudimentary
+multi-line text block filling; see L</Using Fill Mode> for details.
+
+ Example:
+ format STDOUT =
+ @<<<<<< @|||||| @>>>>>>
+ "left", "middle", "right"
+ .
+ Output:
+ left middle right
+
+
+=head2 Numeric Fields
+X<#> X<format, numeric field>
+
+Using "#" as a padding character specifies a numeric field, with
+right justification. An optional "." defines the position of the
+decimal point. With a "0" (zero) instead of the first "#", the
+formatted number will be padded with leading zeroes if necessary.
+A special numeric field is blanked out if the value is undefined.
+If the resulting value would exceed the width specified the field is
+filled with "#" as overflow evidence.
+
+ Example:
+ format STDOUT =
+ @### @.### @##.### @### @### ^####
+ 42, 3.1415, undef, 0, 10000, undef
+ .
+ Output:
+ 42 3.142 0.000 0 ####
+
+
+=head2 The Field @* for Variable Width Multi-Line Text
+X<@*>
+
+The field "@*" can be used for printing multi-line, nontruncated
+values; it should (but need not) appear by itself on a line. A final
+line feed is chomped off, but all other characters are emitted verbatim.
+
+
+=head2 The Field ^* for Variable Width One-line-at-a-time Text
+X<^*>
+
+Like "@*", this is a variable width field. The value supplied must be a
+scalar variable. Perl puts the first line (up to the first "\n") of the
+text into the field, and then chops off the front of the string so that
+the next time the variable is referenced, more of the text can be printed.
+The variable will I<not> be restored.
+
+ Example:
+ $text = "line 1\nline 2\nline 3";
+ format STDOUT =
+ Text: ^*
+ $text
+ ~~ ^*
+ $text
+ .
+ Output:
+ Text: line 1
+ line 2
+ line 3
+
+
+=head2 Specifying Values
+X<format, specifying values>
+
+The values are specified on the following format line in the same order as
+the picture fields. The expressions providing the values must be
+separated by commas. They are all evaluated in a list context
+before the line is processed, so a single list expression could produce
+multiple list elements. The expressions may be spread out to more than
+one line if enclosed in braces. If so, the opening brace must be the first
+token on the first line. If an expression evaluates to a number with a
+decimal part, and if the corresponding picture specifies that the decimal
+part should appear in the output (that is, any picture except multiple "#"
+characters B<without> an embedded "."), the character used for the decimal
+point is B<always> determined by the current LC_NUMERIC locale. This
+means that, if, for example, the run-time environment happens to specify a
+German locale, "," will be used instead of the default ".". See
+L<perllocale> and L<"WARNINGS"> for more information.
+
+
+=head2 Using Fill Mode
+X<format, fill mode>
+
+On text fields the caret enables a kind of fill mode. Instead of an
+arbitrary expression, the value supplied must be a scalar variable
+that contains a text string. Perl puts the next portion of the text into
+the field, and then chops off the front of the string so that the next time
+the variable is referenced, more of the text can be printed. (Yes, this
+means that the variable itself is altered during execution of the write()
+call, and is not restored.) The next portion of text is determined by
+a crude line breaking algorithm. You may use the carriage return character
+(C<\r>) to force a line break. You can change which characters are legal
+to break on by changing the variable C<$:> (that's
+$FORMAT_LINE_BREAK_CHARACTERS if you're using the English module) to a
+list of the desired characters.
+
+Normally you would use a sequence of fields in a vertical stack associated
+with the same scalar variable to print out a block of text. You might wish
+to end the final field with the text "...", which will appear in the output
+if the text was too long to appear in its entirety.
+
+
+=head2 Suppressing Lines Where All Fields Are Void
+X<format, suppressing lines>
+
+Using caret fields can produce lines where all fields are blank. You can
+suppress such lines by putting a "~" (tilde) character anywhere in the
+line. The tilde will be translated to a space upon output.
+
+
+=head2 Repeating Format Lines
+X<format, repeating lines>
+
+If you put two contiguous tilde characters "~~" anywhere into a line,
+the line will be repeated until all the fields on the line are exhausted,
+i.e. undefined. For special (caret) text fields this will occur sooner or
+later, but if you use a text field of the at variety, the expression you
+supply had better not give the same value every time forever! (C<shift(@f)>
+is a simple example that would work.) Don't use a regular (at) numeric
+field in such lines, because it will never go blank.
+
+
+=head2 Top of Form Processing
+X<format, top of form> X<top> X<header>
+
+Top-of-form processing is by default handled by a format with the
+same name as the current filehandle with "_TOP" concatenated to it.
+It's triggered at the top of each page. See L<perlfunc/write>.
+
+Examples:
+
+ # a report on the /etc/passwd file
+ format STDOUT_TOP =
+ Passwd File
+ Name Login Office Uid Gid Home
+ ------------------------------------------------------------------
+ .
+ format STDOUT =
+ @<<<<<<<<<<<<<<<<<< @||||||| @<<<<<<@>>>> @>>>> @<<<<<<<<<<<<<<<<<
+ $name, $login, $office,$uid,$gid, $home
+ .
+
+
+ # a report from a bug report form
+ format STDOUT_TOP =
+ Bug Reports
+ @<<<<<<<<<<<<<<<<<<<<<<< @||| @>>>>>>>>>>>>>>>>>>>>>>>
+ $system, $%, $date
+ ------------------------------------------------------------------
+ .
+ format STDOUT =
+ Subject: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $subject
+ Index: @<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $index, $description
+ Priority: @<<<<<<<<<< Date: @<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $priority, $date, $description
+ From: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $from, $description
+ Assigned to: @<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $programmer, $description
+ ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $description
+ ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $description
+ ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $description
+ ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $description
+ ~ ^<<<<<<<<<<<<<<<<<<<<<<<...
+ $description
+ .
+
+It is possible to intermix print()s with write()s on the same output
+channel, but you'll have to handle C<$-> (C<$FORMAT_LINES_LEFT>)
+yourself.
+
+=head2 Format Variables
+X<format variables>
+X<format, variables>
+
+The current format name is stored in the variable C<$~> (C<$FORMAT_NAME>),
+and the current top of form format name is in C<$^> (C<$FORMAT_TOP_NAME>).
+The current output page number is stored in C<$%> (C<$FORMAT_PAGE_NUMBER>),
+and the number of lines on the page is in C<$=> (C<$FORMAT_LINES_PER_PAGE>).
+Whether to autoflush output on this handle is stored in C<$|>
+(C<$OUTPUT_AUTOFLUSH>). The string output before each top of page (except
+the first) is stored in C<$^L> (C<$FORMAT_FORMFEED>). These variables are
+set on a per-filehandle basis, so you'll need to select() into a different
+one to affect them:
+
+ select((select(OUTF),
+ $~ = "My_Other_Format",
+ $^ = "My_Top_Format"
+ )[0]);
+
+Pretty ugly, eh? It's a common idiom though, so don't be too surprised
+when you see it. You can at least use a temporary variable to hold
+the previous filehandle: (this is a much better approach in general,
+because not only does legibility improve, you now have intermediary
+stage in the expression to single-step the debugger through):
+
+ $ofh = select(OUTF);
+ $~ = "My_Other_Format";
+ $^ = "My_Top_Format";
+ select($ofh);
+
+If you use the English module, you can even read the variable names:
+
+ use English '-no_match_vars';
+ $ofh = select(OUTF);
+ $FORMAT_NAME = "My_Other_Format";
+ $FORMAT_TOP_NAME = "My_Top_Format";
+ select($ofh);
+
+But you still have those funny select()s. So just use the FileHandle
+module. Now, you can access these special variables using lowercase
+method names instead:
+
+ use FileHandle;
+ format_name OUTF "My_Other_Format";
+ format_top_name OUTF "My_Top_Format";
+
+Much better!
+
+=head1 NOTES
+
+Because the values line may contain arbitrary expressions (for at fields,
+not caret fields), you can farm out more sophisticated processing
+to other functions, like sprintf() or one of your own. For example:
+
+ format Ident =
+ @<<<<<<<<<<<<<<<
+ &commify($n)
+ .
+
+To get a real at or caret into the field, do this:
+
+ format Ident =
+ I have an @ here.
+ "@"
+ .
+
+To center a whole line of text, do something like this:
+
+ format Ident =
+ @|||||||||||||||||||||||||||||||||||||||||||||||
+ "Some text line"
+ .
+
+There is no builtin way to say "float this to the right hand side
+of the page, however wide it is." You have to specify where it goes.
+The truly desperate can generate their own format on the fly, based
+on the current number of columns, and then eval() it:
+
+ $format = "format STDOUT = \n"
+ . '^' . '<' x $cols . "\n"
+ . '$entry' . "\n"
+ . "\t^" . "<" x ($cols-8) . "~~\n"
+ . '$entry' . "\n"
+ . ".\n";
+ print $format if $Debugging;
+ eval $format;
+ die $@ if $@;
+
+Which would generate a format looking something like this:
+
+ format STDOUT =
+ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $entry
+ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
+ $entry
+ .
+
+Here's a little program that's somewhat like fmt(1):
+
+ format =
+ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
+ $_
+
+ .
+
+ $/ = '';
+ while (<>) {
+ s/\s*\n\s*/ /g;
+ write;
+ }
+
+=head2 Footers
+X<format, footer> X<footer>
+
+While $FORMAT_TOP_NAME contains the name of the current header format,
+there is no corresponding mechanism to automatically do the same thing
+for a footer. Not knowing how big a format is going to be until you
+evaluate it is one of the major problems. It's on the TODO list.
+
+Here's one strategy: If you have a fixed-size footer, you can get footers
+by checking $FORMAT_LINES_LEFT before each write() and print the footer
+yourself if necessary.
+
+Here's another strategy: Open a pipe to yourself, using C<open(MYSELF, "|-")>
+(see L<perlfunc/open()>) and always write() to MYSELF instead of STDOUT.
+Have your child process massage its STDIN to rearrange headers and footers
+however you like. Not very convenient, but doable.
+
+=head2 Accessing Formatting Internals
+X<format, internals>
+
+For low-level access to the formatting mechanism. you may use formline()
+and access C<$^A> (the $ACCUMULATOR variable) directly.
+
+For example:
+
+ $str = formline <<'END', 1,2,3;
+ @<<< @||| @>>>
+ END
+
+ print "Wow, I just stored `$^A' in the accumulator!\n";
+
+Or to make an swrite() subroutine, which is to write() what sprintf()
+is to printf(), do this:
+
+ use Carp;
+ sub swrite {
+ croak "usage: swrite PICTURE ARGS" unless @_;
+ my $format = shift;
+ $^A = "";
+ formline($format,@_);
+ return $^A;
+ }
+
+ $string = swrite(<<'END', 1, 2, 3);
+ Check me out
+ @<<< @||| @>>>
+ END
+ print $string;
+
+=head1 WARNINGS
+
+The lone dot that ends a format can also prematurely end a mail
+message passing through a misconfigured Internet mailer (and based on
+experience, such misconfiguration is the rule, not the exception). So
+when sending format code through mail, you should indent it so that
+the format-ending dot is not on the left margin; this will prevent
+SMTP cutoff.
+
+Lexical variables (declared with "my") are not visible within a
+format unless the format is declared within the scope of the lexical
+variable. (They weren't visible at all before version 5.001.)
+
+Formats are the only part of Perl that unconditionally use information
+from a program's locale; if a program's environment specifies an
+LC_NUMERIC locale, it is always used to specify the decimal point
+character in formatted output. Perl ignores all other aspects of locale
+handling unless the C<use locale> pragma is in effect. Formatted output
+cannot be controlled by C<use locale> because the pragma is tied to the
+block structure of the program, and, for historical reasons, formats
+exist outside that block structure. See L<perllocale> for further
+discussion of locale handling.
+
+Within strings that are to be displayed in a fixed length text field,
+each control character is substituted by a space. (But remember the
+special meaning of C<\r> when using fill mode.) This is done to avoid
+misalignment when control characters "disappear" on some output media.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfreebsd.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfreebsd.pod
new file mode 100755
index 00000000000..77c297bec6d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfreebsd.pod
@@ -0,0 +1,47 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+README.freebsd - Perl version 5 on FreeBSD systems
+
+=head1 DESCRIPTION
+
+This document describes various features of FreeBSD that will affect how Perl
+version 5 (hereafter just Perl) is compiled and/or runs.
+
+=head2 FreeBSD core dumps from readdir_r with ithreads
+
+When perl is configured to use ithreads, it will use re-entrant library calls
+in preference to non-re-entrant versions. There is a bug in FreeBSD's
+C<readdir_r> function in versions 4.5 and earlier that can cause a SEGV when
+reading large directories. A patch for FreeBSD libc is available
+(see http://www.freebsd.org/cgi/query-pr.cgi?pr=misc/30631 )
+which has been integrated into FreeBSD 4.6.
+
+=head2 $^X doesn't always contain a full path in FreeBSD
+
+perl 5.8.0 sets C<$^X> where possible to a full path by asking the operating
+system. On FreeBSD the full path of the perl interpreter is found by reading
+the symlink F</proc/curproc/file>. There is a bug on FreeBSD, where the
+result of reading this symlink is can be wrong in certain circumstances
+(see http://www.freebsd.org/cgi/query-pr.cgi?pr=35703 ).
+In these cases perl will fall back to the old behaviour of using C's
+argv[0] value for C<$^X>.
+
+=head2 Perl will no longer be part of "base FreeBSD"
+
+Not as bad as it sounds--what this means is that Perl will no longer be
+part of the B<kernel build system> of FreeBSD. Perl will still very
+probably be part of the "default install", and in any case the latest
+version will be in the ports system. The first FreeBSD version this
+change will affect is 5.0, all 4.n versions will keep the status quo.
+
+=head1 AUTHOR
+
+Nicholas Clark <nick@ccl4.org>, collating wisdom supplied by Slaven Rezic
+and Tim Bunce.
+
+Please report any errors, updates, or suggestions to F<perlbug@perl.org>.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlfunc.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlfunc.pod
new file mode 100755
index 00000000000..6a7661eee75
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlfunc.pod
@@ -0,0 +1,7444 @@
+=head1 NAME
+X<function>
+
+perlfunc - Perl builtin functions
+
+=head1 DESCRIPTION
+
+The functions in this section can serve as terms in an expression.
+They fall into two major categories: list operators and named unary
+operators. These differ in their precedence relationship with a
+following comma. (See the precedence table in L<perlop>.) List
+operators take more than one argument, while unary operators can never
+take more than one argument. Thus, a comma terminates the argument of
+a unary operator, but merely separates the arguments of a list
+operator. A unary operator generally provides a scalar context to its
+argument, while a list operator may provide either scalar or list
+contexts for its arguments. If it does both, the scalar arguments will
+be first, and the list argument will follow. (Note that there can ever
+be only one such list argument.) For instance, splice() has three scalar
+arguments followed by a list, whereas gethostbyname() has four scalar
+arguments.
+
+In the syntax descriptions that follow, list operators that expect a
+list (and provide list context for the elements of the list) are shown
+with LIST as an argument. Such a list may consist of any combination
+of scalar arguments or list values; the list values will be included
+in the list as if each individual element were interpolated at that
+point in the list, forming a longer single-dimensional list value.
+Commas should separate elements of the LIST.
+
+Any function in the list below may be used either with or without
+parentheses around its arguments. (The syntax descriptions omit the
+parentheses.) If you use the parentheses, the simple (but occasionally
+surprising) rule is this: It I<looks> like a function, therefore it I<is> a
+function, and precedence doesn't matter. Otherwise it's a list
+operator or unary operator, and precedence does matter. And whitespace
+between the function and left parenthesis doesn't count--so you need to
+be careful sometimes:
+
+ print 1+2+4; # Prints 7.
+ print(1+2) + 4; # Prints 3.
+ print (1+2)+4; # Also prints 3!
+ print +(1+2)+4; # Prints 7.
+ print ((1+2)+4); # Prints 7.
+
+If you run Perl with the B<-w> switch it can warn you about this. For
+example, the third line above produces:
+
+ print (...) interpreted as function at - line 1.
+ Useless use of integer addition in void context at - line 1.
+
+A few functions take no arguments at all, and therefore work as neither
+unary nor list operators. These include such functions as C<time>
+and C<endpwent>. For example, C<time+86_400> always means
+C<time() + 86_400>.
+
+For functions that can be used in either a scalar or list context,
+nonabortive failure is generally indicated in a scalar context by
+returning the undefined value, and in a list context by returning the
+null list.
+
+Remember the following important rule: There is B<no rule> that relates
+the behavior of an expression in list context to its behavior in scalar
+context, or vice versa. It might do two totally different things.
+Each operator and function decides which sort of value it would be most
+appropriate to return in scalar context. Some operators return the
+length of the list that would have been returned in list context. Some
+operators return the first value in the list. Some operators return the
+last value in the list. Some operators return a count of successful
+operations. In general, they do what you want, unless you want
+consistency.
+X<context>
+
+A named array in scalar context is quite different from what would at
+first glance appear to be a list in scalar context. You can't get a list
+like C<(1,2,3)> into being in scalar context, because the compiler knows
+the context at compile time. It would generate the scalar comma operator
+there, not the list construction version of the comma. That means it
+was never a list to start with.
+
+In general, functions in Perl that serve as wrappers for system calls
+of the same name (like chown(2), fork(2), closedir(2), etc.) all return
+true when they succeed and C<undef> otherwise, as is usually mentioned
+in the descriptions below. This is different from the C interfaces,
+which return C<-1> on failure. Exceptions to this rule are C<wait>,
+C<waitpid>, and C<syscall>. System calls also set the special C<$!>
+variable on failure. Other functions do not, except accidentally.
+
+=head2 Perl Functions by Category
+X<function>
+
+Here are Perl's functions (including things that look like
+functions, like some keywords and named operators)
+arranged by category. Some functions appear in more
+than one place.
+
+=over 4
+
+=item Functions for SCALARs or strings
+X<scalar> X<string> X<character>
+
+C<chomp>, C<chop>, C<chr>, C<crypt>, C<hex>, C<index>, C<lc>, C<lcfirst>,
+C<length>, C<oct>, C<ord>, C<pack>, C<q//>, C<qq//>, C<reverse>,
+C<rindex>, C<sprintf>, C<substr>, C<tr///>, C<uc>, C<ucfirst>, C<y///>
+
+=item Regular expressions and pattern matching
+X<regular expression> X<regex> X<regexp>
+
+C<m//>, C<pos>, C<quotemeta>, C<s///>, C<split>, C<study>, C<qr//>
+
+=item Numeric functions
+X<numeric> X<number> X<trigonometric> X<trigonometry>
+
+C<abs>, C<atan2>, C<cos>, C<exp>, C<hex>, C<int>, C<log>, C<oct>, C<rand>,
+C<sin>, C<sqrt>, C<srand>
+
+=item Functions for real @ARRAYs
+X<array>
+
+C<pop>, C<push>, C<shift>, C<splice>, C<unshift>
+
+=item Functions for list data
+X<list>
+
+C<grep>, C<join>, C<map>, C<qw//>, C<reverse>, C<sort>, C<unpack>
+
+=item Functions for real %HASHes
+X<hash>
+
+C<delete>, C<each>, C<exists>, C<keys>, C<values>
+
+=item Input and output functions
+X<I/O> X<input> X<output> X<dbm>
+
+C<binmode>, C<close>, C<closedir>, C<dbmclose>, C<dbmopen>, C<die>, C<eof>,
+C<fileno>, C<flock>, C<format>, C<getc>, C<print>, C<printf>, C<read>,
+C<readdir>, C<rewinddir>, C<say>, C<seek>, C<seekdir>, C<select>, C<syscall>,
+C<sysread>, C<sysseek>, C<syswrite>, C<tell>, C<telldir>, C<truncate>,
+C<warn>, C<write>
+
+=item Functions for fixed length data or records
+
+C<pack>, C<read>, C<syscall>, C<sysread>, C<syswrite>, C<unpack>, C<vec>
+
+=item Functions for filehandles, files, or directories
+X<file> X<filehandle> X<directory> X<pipe> X<link> X<symlink>
+
+C<-I<X>>, C<chdir>, C<chmod>, C<chown>, C<chroot>, C<fcntl>, C<glob>,
+C<ioctl>, C<link>, C<lstat>, C<mkdir>, C<open>, C<opendir>,
+C<readlink>, C<rename>, C<rmdir>, C<stat>, C<symlink>, C<sysopen>,
+C<umask>, C<unlink>, C<utime>
+
+=item Keywords related to the control flow of your Perl program
+X<control flow>
+
+C<caller>, C<continue>, C<die>, C<do>, C<dump>, C<eval>, C<exit>,
+C<goto>, C<last>, C<next>, C<redo>, C<return>, C<sub>, C<wantarray>
+
+=item Keywords related to switch
+
+C<break>, C<continue>, C<given>, C<when>, C<default>
+
+(These are only available if you enable the "switch" feature.
+See L<feature> and L<perlsyn/"Switch statements">.)
+
+=item Keywords related to scoping
+
+C<caller>, C<import>, C<local>, C<my>, C<our>, C<state>, C<package>,
+C<use>
+
+(C<state> is only available if the "state" feature is enabled. See
+L<feature>.)
+
+=item Miscellaneous functions
+
+C<defined>, C<dump>, C<eval>, C<formline>, C<local>, C<my>, C<our>,
+C<reset>, C<scalar>, C<state>, C<undef>, C<wantarray>
+
+=item Functions for processes and process groups
+X<process> X<pid> X<process id>
+
+C<alarm>, C<exec>, C<fork>, C<getpgrp>, C<getppid>, C<getpriority>, C<kill>,
+C<pipe>, C<qx//>, C<setpgrp>, C<setpriority>, C<sleep>, C<system>,
+C<times>, C<wait>, C<waitpid>
+
+=item Keywords related to perl modules
+X<module>
+
+C<do>, C<import>, C<no>, C<package>, C<require>, C<use>
+
+=item Keywords related to classes and object-orientation
+X<object> X<class> X<package>
+
+C<bless>, C<dbmclose>, C<dbmopen>, C<package>, C<ref>, C<tie>, C<tied>,
+C<untie>, C<use>
+
+=item Low-level socket functions
+X<socket> X<sock>
+
+C<accept>, C<bind>, C<connect>, C<getpeername>, C<getsockname>,
+C<getsockopt>, C<listen>, C<recv>, C<send>, C<setsockopt>, C<shutdown>,
+C<socket>, C<socketpair>
+
+=item System V interprocess communication functions
+X<IPC> X<System V> X<semaphore> X<shared memory> X<memory> X<message>
+
+C<msgctl>, C<msgget>, C<msgrcv>, C<msgsnd>, C<semctl>, C<semget>, C<semop>,
+C<shmctl>, C<shmget>, C<shmread>, C<shmwrite>
+
+=item Fetching user and group info
+X<user> X<group> X<password> X<uid> X<gid> X<passwd> X</etc/passwd>
+
+C<endgrent>, C<endhostent>, C<endnetent>, C<endpwent>, C<getgrent>,
+C<getgrgid>, C<getgrnam>, C<getlogin>, C<getpwent>, C<getpwnam>,
+C<getpwuid>, C<setgrent>, C<setpwent>
+
+=item Fetching network info
+X<network> X<protocol> X<host> X<hostname> X<IP> X<address> X<service>
+
+C<endprotoent>, C<endservent>, C<gethostbyaddr>, C<gethostbyname>,
+C<gethostent>, C<getnetbyaddr>, C<getnetbyname>, C<getnetent>,
+C<getprotobyname>, C<getprotobynumber>, C<getprotoent>,
+C<getservbyname>, C<getservbyport>, C<getservent>, C<sethostent>,
+C<setnetent>, C<setprotoent>, C<setservent>
+
+=item Time-related functions
+X<time> X<date>
+
+C<gmtime>, C<localtime>, C<time>, C<times>
+
+=item Functions new in perl5
+X<perl5>
+
+C<abs>, C<bless>, C<break>, C<chomp>, C<chr>, C<continue>, C<default>,
+C<exists>, C<formline>, C<given>, C<glob>, C<import>, C<lc>, C<lcfirst>,
+C<lock>, C<map>, C<my>, C<no>, C<our>, C<prototype>, C<qr//>, C<qw//>, C<qx//>,
+C<readline>, C<readpipe>, C<ref>, C<sub>*, C<sysopen>, C<tie>, C<tied>, C<uc>,
+C<ucfirst>, C<untie>, C<use>, C<when>
+
+* - C<sub> was a keyword in perl4, but in perl5 it is an
+operator, which can be used in expressions.
+
+=item Functions obsoleted in perl5
+
+C<dbmclose>, C<dbmopen>
+
+=back
+
+=head2 Portability
+X<portability> X<Unix> X<portable>
+
+Perl was born in Unix and can therefore access all common Unix
+system calls. In non-Unix environments, the functionality of some
+Unix system calls may not be available, or details of the available
+functionality may differ slightly. The Perl functions affected
+by this are:
+
+C<-X>, C<binmode>, C<chmod>, C<chown>, C<chroot>, C<crypt>,
+C<dbmclose>, C<dbmopen>, C<dump>, C<endgrent>, C<endhostent>,
+C<endnetent>, C<endprotoent>, C<endpwent>, C<endservent>, C<exec>,
+C<fcntl>, C<flock>, C<fork>, C<getgrent>, C<getgrgid>, C<gethostbyname>,
+C<gethostent>, C<getlogin>, C<getnetbyaddr>, C<getnetbyname>, C<getnetent>,
+C<getppid>, C<getpgrp>, C<getpriority>, C<getprotobynumber>,
+C<getprotoent>, C<getpwent>, C<getpwnam>, C<getpwuid>,
+C<getservbyport>, C<getservent>, C<getsockopt>, C<glob>, C<ioctl>,
+C<kill>, C<link>, C<lstat>, C<msgctl>, C<msgget>, C<msgrcv>,
+C<msgsnd>, C<open>, C<pipe>, C<readlink>, C<rename>, C<select>, C<semctl>,
+C<semget>, C<semop>, C<setgrent>, C<sethostent>, C<setnetent>,
+C<setpgrp>, C<setpriority>, C<setprotoent>, C<setpwent>,
+C<setservent>, C<setsockopt>, C<shmctl>, C<shmget>, C<shmread>,
+C<shmwrite>, C<socket>, C<socketpair>,
+C<stat>, C<symlink>, C<syscall>, C<sysopen>, C<system>,
+C<times>, C<truncate>, C<umask>, C<unlink>,
+C<utime>, C<wait>, C<waitpid>
+
+For more information about the portability of these functions, see
+L<perlport> and other available platform-specific documentation.
+
+=head2 Alphabetical Listing of Perl Functions
+
+=over 8
+
+=item -X FILEHANDLE
+X<-r>X<-w>X<-x>X<-o>X<-R>X<-W>X<-X>X<-O>X<-e>X<-z>X<-s>X<-f>X<-d>X<-l>X<-p>
+X<-S>X<-b>X<-c>X<-t>X<-u>X<-g>X<-k>X<-T>X<-B>X<-M>X<-A>X<-C>
+
+=item -X EXPR
+
+=item -X DIRHANDLE
+
+=item -X
+
+A file test, where X is one of the letters listed below. This unary
+operator takes one argument, either a filename, a filehandle, or a dirhandle,
+and tests the associated file to see if something is true about it. If the
+argument is omitted, tests C<$_>, except for C<-t>, which tests STDIN.
+Unless otherwise documented, it returns C<1> for true and C<''> for false, or
+the undefined value if the file doesn't exist. Despite the funny
+names, precedence is the same as any other named unary operator. The
+operator may be any of:
+
+ -r File is readable by effective uid/gid.
+ -w File is writable by effective uid/gid.
+ -x File is executable by effective uid/gid.
+ -o File is owned by effective uid.
+
+ -R File is readable by real uid/gid.
+ -W File is writable by real uid/gid.
+ -X File is executable by real uid/gid.
+ -O File is owned by real uid.
+
+ -e File exists.
+ -z File has zero size (is empty).
+ -s File has nonzero size (returns size in bytes).
+
+ -f File is a plain file.
+ -d File is a directory.
+ -l File is a symbolic link.
+ -p File is a named pipe (FIFO), or Filehandle is a pipe.
+ -S File is a socket.
+ -b File is a block special file.
+ -c File is a character special file.
+ -t Filehandle is opened to a tty.
+
+ -u File has setuid bit set.
+ -g File has setgid bit set.
+ -k File has sticky bit set.
+
+ -T File is an ASCII text file (heuristic guess).
+ -B File is a "binary" file (opposite of -T).
+
+ -M Script start time minus file modification time, in days.
+ -A Same for access time.
+ -C Same for inode change time (Unix, may differ for other platforms)
+
+Example:
+
+ while (<>) {
+ chomp;
+ next unless -f $_; # ignore specials
+ #...
+ }
+
+The interpretation of the file permission operators C<-r>, C<-R>,
+C<-w>, C<-W>, C<-x>, and C<-X> is by default based solely on the mode
+of the file and the uids and gids of the user. There may be other
+reasons you can't actually read, write, or execute the file: for
+example network filesystem access controls, ACLs (access control lists),
+read-only filesystems, and unrecognized executable formats. Note
+that the use of these six specific operators to verify if some operation
+is possible is usually a mistake, because it may be open to race
+conditions.
+
+Also note that, for the superuser on the local filesystems, the C<-r>,
+C<-R>, C<-w>, and C<-W> tests always return 1, and C<-x> and C<-X> return 1
+if any execute bit is set in the mode. Scripts run by the superuser
+may thus need to do a stat() to determine the actual mode of the file,
+or temporarily set their effective uid to something else.
+
+If you are using ACLs, there is a pragma called C<filetest> that may
+produce more accurate results than the bare stat() mode bits.
+When under the C<use filetest 'access'> the above-mentioned filetests
+will test whether the permission can (not) be granted using the
+access() family of system calls. Also note that the C<-x> and C<-X> may
+under this pragma return true even if there are no execute permission
+bits set (nor any extra execute permission ACLs). This strangeness is
+due to the underlying system calls' definitions. Note also that, due to
+the implementation of C<use filetest 'access'>, the C<_> special
+filehandle won't cache the results of the file tests when this pragma is
+in effect. Read the documentation for the C<filetest> pragma for more
+information.
+
+Note that C<-s/a/b/> does not do a negated substitution. Saying
+C<-exp($foo)> still works as expected, however--only single letters
+following a minus are interpreted as file tests.
+
+The C<-T> and C<-B> switches work as follows. The first block or so of the
+file is examined for odd characters such as strange control codes or
+characters with the high bit set. If too many strange characters (>30%)
+are found, it's a C<-B> file; otherwise it's a C<-T> file. Also, any file
+containing null in the first block is considered a binary file. If C<-T>
+or C<-B> is used on a filehandle, the current IO buffer is examined
+rather than the first block. Both C<-T> and C<-B> return true on a null
+file, or a file at EOF when testing a filehandle. Because you have to
+read a file to do the C<-T> test, on most occasions you want to use a C<-f>
+against the file first, as in C<next unless -f $file && -T $file>.
+
+If any of the file tests (or either the C<stat> or C<lstat> operators) are given
+the special filehandle consisting of a solitary underline, then the stat
+structure of the previous file test (or stat operator) is used, saving
+a system call. (This doesn't work with C<-t>, and you need to remember
+that lstat() and C<-l> will leave values in the stat structure for the
+symbolic link, not the real file.) (Also, if the stat buffer was filled by
+an C<lstat> call, C<-T> and C<-B> will reset it with the results of C<stat _>).
+Example:
+
+ print "Can do.\n" if -r $a || -w _ || -x _;
+
+ stat($filename);
+ print "Readable\n" if -r _;
+ print "Writable\n" if -w _;
+ print "Executable\n" if -x _;
+ print "Setuid\n" if -u _;
+ print "Setgid\n" if -g _;
+ print "Sticky\n" if -k _;
+ print "Text\n" if -T _;
+ print "Binary\n" if -B _;
+
+As of Perl 5.9.1, as a form of purely syntactic sugar, you can stack file
+test operators, in a way that C<-f -w -x $file> is equivalent to
+C<-x $file && -w _ && -f _>. (This is only syntax fancy: if you use
+the return value of C<-f $file> as an argument to another filetest
+operator, no special magic will happen.)
+
+=item abs VALUE
+X<abs> X<absolute>
+
+=item abs
+
+Returns the absolute value of its argument.
+If VALUE is omitted, uses C<$_>.
+
+=item accept NEWSOCKET,GENERICSOCKET
+X<accept>
+
+Accepts an incoming socket connect, just as the accept(2) system call
+does. Returns the packed address if it succeeded, false otherwise.
+See the example in L<perlipc/"Sockets: Client/Server Communication">.
+
+On systems that support a close-on-exec flag on files, the flag will
+be set for the newly opened file descriptor, as determined by the
+value of $^F. See L<perlvar/$^F>.
+
+=item alarm SECONDS
+X<alarm>
+X<SIGALRM>
+X<timer>
+
+=item alarm
+
+Arranges to have a SIGALRM delivered to this process after the
+specified number of wallclock seconds has elapsed. If SECONDS is not
+specified, the value stored in C<$_> is used. (On some machines,
+unfortunately, the elapsed time may be up to one second less or more
+than you specified because of how seconds are counted, and process
+scheduling may delay the delivery of the signal even further.)
+
+Only one timer may be counting at once. Each call disables the
+previous timer, and an argument of C<0> may be supplied to cancel the
+previous timer without starting a new one. The returned value is the
+amount of time remaining on the previous timer.
+
+For delays of finer granularity than one second, the Time::HiRes module
+(from CPAN, and starting from Perl 5.8 part of the standard
+distribution) provides ualarm(). You may also use Perl's four-argument
+version of select() leaving the first three arguments undefined, or you
+might be able to use the C<syscall> interface to access setitimer(2) if
+your system supports it. See L<perlfaq8> for details.
+
+It is usually a mistake to intermix C<alarm> and C<sleep> calls.
+(C<sleep> may be internally implemented in your system with C<alarm>)
+
+If you want to use C<alarm> to time out a system call you need to use an
+C<eval>/C<die> pair. You can't rely on the alarm causing the system call to
+fail with C<$!> set to C<EINTR> because Perl sets up signal handlers to
+restart system calls on some systems. Using C<eval>/C<die> always works,
+modulo the caveats given in L<perlipc/"Signals">.
+
+ eval {
+ local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
+ alarm $timeout;
+ $nread = sysread SOCKET, $buffer, $size;
+ alarm 0;
+ };
+ if ($@) {
+ die unless $@ eq "alarm\n"; # propagate unexpected errors
+ # timed out
+ }
+ else {
+ # didn't
+ }
+
+For more information see L<perlipc>.
+
+=item atan2 Y,X
+X<atan2> X<arctangent> X<tan> X<tangent>
+
+Returns the arctangent of Y/X in the range -PI to PI.
+
+For the tangent operation, you may use the C<Math::Trig::tan>
+function, or use the familiar relation:
+
+ sub tan { sin($_[0]) / cos($_[0]) }
+
+The return value for C<atan2(0,0)> is implementation-defined; consult
+your atan2(3) manpage for more information.
+
+=item bind SOCKET,NAME
+X<bind>
+
+Binds a network address to a socket, just as the bind system call
+does. Returns true if it succeeded, false otherwise. NAME should be a
+packed address of the appropriate type for the socket. See the examples in
+L<perlipc/"Sockets: Client/Server Communication">.
+
+=item binmode FILEHANDLE, LAYER
+X<binmode> X<binary> X<text> X<DOS> X<Windows>
+
+=item binmode FILEHANDLE
+
+Arranges for FILEHANDLE to be read or written in "binary" or "text"
+mode on systems where the run-time libraries distinguish between
+binary and text files. If FILEHANDLE is an expression, the value is
+taken as the name of the filehandle. Returns true on success,
+otherwise it returns C<undef> and sets C<$!> (errno).
+
+On some systems (in general, DOS and Windows-based systems) binmode()
+is necessary when you're not working with a text file. For the sake
+of portability it is a good idea to always use it when appropriate,
+and to never use it when it isn't appropriate. Also, people can
+set their I/O to be by default UTF-8 encoded Unicode, not bytes.
+
+In other words: regardless of platform, use binmode() on binary data,
+like for example images.
+
+If LAYER is present it is a single string, but may contain multiple
+directives. The directives alter the behaviour of the file handle.
+When LAYER is present using binmode on a text file makes sense.
+
+If LAYER is omitted or specified as C<:raw> the filehandle is made
+suitable for passing binary data. This includes turning off possible CRLF
+translation and marking it as bytes (as opposed to Unicode characters).
+Note that, despite what may be implied in I<"Programming Perl"> (the
+Camel) or elsewhere, C<:raw> is I<not> simply the inverse of C<:crlf>
+-- other layers which would affect the binary nature of the stream are
+I<also> disabled. See L<PerlIO>, L<perlrun> and the discussion about the
+PERLIO environment variable.
+
+The C<:bytes>, C<:crlf>, and C<:utf8>, and any other directives of the
+form C<:...>, are called I/O I<layers>. The C<open> pragma can be used to
+establish default I/O layers. See L<open>.
+
+I<The LAYER parameter of the binmode() function is described as "DISCIPLINE"
+in "Programming Perl, 3rd Edition". However, since the publishing of this
+book, by many known as "Camel III", the consensus of the naming of this
+functionality has moved from "discipline" to "layer". All documentation
+of this version of Perl therefore refers to "layers" rather than to
+"disciplines". Now back to the regularly scheduled documentation...>
+
+To mark FILEHANDLE as UTF-8, use C<:utf8> or C<:encoding(utf8)>.
+C<:utf8> just marks the data as UTF-8 without further checking,
+while C<:encoding(utf8)> checks the data for actually being valid
+UTF-8. More details can be found in L<PerlIO::encoding>.
+
+In general, binmode() should be called after open() but before any I/O
+is done on the filehandle. Calling binmode() will normally flush any
+pending buffered output data (and perhaps pending input data) on the
+handle. An exception to this is the C<:encoding> layer that
+changes the default character encoding of the handle, see L<open>.
+The C<:encoding> layer sometimes needs to be called in
+mid-stream, and it doesn't flush the stream. The C<:encoding>
+also implicitly pushes on top of itself the C<:utf8> layer because
+internally Perl will operate on UTF-8 encoded Unicode characters.
+
+The operating system, device drivers, C libraries, and Perl run-time
+system all work together to let the programmer treat a single
+character (C<\n>) as the line terminator, irrespective of the external
+representation. On many operating systems, the native text file
+representation matches the internal representation, but on some
+platforms the external representation of C<\n> is made up of more than
+one character.
+
+Mac OS, all variants of Unix, and Stream_LF files on VMS use a single
+character to end each line in the external representation of text (even
+though that single character is CARRIAGE RETURN on Mac OS and LINE FEED
+on Unix and most VMS files). In other systems like OS/2, DOS and the
+various flavors of MS-Windows your program sees a C<\n> as a simple C<\cJ>,
+but what's stored in text files are the two characters C<\cM\cJ>. That
+means that, if you don't use binmode() on these systems, C<\cM\cJ>
+sequences on disk will be converted to C<\n> on input, and any C<\n> in
+your program will be converted back to C<\cM\cJ> on output. This is what
+you want for text files, but it can be disastrous for binary files.
+
+Another consequence of using binmode() (on some systems) is that
+special end-of-file markers will be seen as part of the data stream.
+For systems from the Microsoft family this means that if your binary
+data contains C<\cZ>, the I/O subsystem will regard it as the end of
+the file, unless you use binmode().
+
+binmode() is not only important for readline() and print() operations,
+but also when using read(), seek(), sysread(), syswrite() and tell()
+(see L<perlport> for more details). See the C<$/> and C<$\> variables
+in L<perlvar> for how to manually set your input and output
+line-termination sequences.
+
+=item bless REF,CLASSNAME
+X<bless>
+
+=item bless REF
+
+This function tells the thingy referenced by REF that it is now an object
+in the CLASSNAME package. If CLASSNAME is omitted, the current package
+is used. Because a C<bless> is often the last thing in a constructor,
+it returns the reference for convenience. Always use the two-argument
+version if a derived class might inherit the function doing the blessing.
+See L<perltoot> and L<perlobj> for more about the blessing (and blessings)
+of objects.
+
+Consider always blessing objects in CLASSNAMEs that are mixed case.
+Namespaces with all lowercase names are considered reserved for
+Perl pragmata. Builtin types have all uppercase names. To prevent
+confusion, you may wish to avoid such package names as well. Make sure
+that CLASSNAME is a true value.
+
+See L<perlmod/"Perl Modules">.
+
+=item break
+
+Break out of a C<given()> block.
+
+This keyword is enabled by the "switch" feature: see L<feature>
+for more information.
+
+=item caller EXPR
+X<caller> X<call stack> X<stack> X<stack trace>
+
+=item caller
+
+Returns the context of the current subroutine call. In scalar context,
+returns the caller's package name if there is a caller, that is, if
+we're in a subroutine or C<eval> or C<require>, and the undefined value
+otherwise. In list context, returns
+
+ # 0 1 2
+ ($package, $filename, $line) = caller;
+
+With EXPR, it returns some extra information that the debugger uses to
+print a stack trace. The value of EXPR indicates how many call frames
+to go back before the current one.
+
+ # 0 1 2 3 4
+ ($package, $filename, $line, $subroutine, $hasargs,
+
+ # 5 6 7 8 9 10
+ $wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash)
+ = caller($i);
+
+Here $subroutine may be C<(eval)> if the frame is not a subroutine
+call, but an C<eval>. In such a case additional elements $evaltext and
+C<$is_require> are set: C<$is_require> is true if the frame is created by a
+C<require> or C<use> statement, $evaltext contains the text of the
+C<eval EXPR> statement. In particular, for an C<eval BLOCK> statement,
+$subroutine is C<(eval)>, but $evaltext is undefined. (Note also that
+each C<use> statement creates a C<require> frame inside an C<eval EXPR>
+frame.) $subroutine may also be C<(unknown)> if this particular
+subroutine happens to have been deleted from the symbol table.
+C<$hasargs> is true if a new instance of C<@_> was set up for the frame.
+C<$hints> and C<$bitmask> contain pragmatic hints that the caller was
+compiled with. The C<$hints> and C<$bitmask> values are subject to change
+between versions of Perl, and are not meant for external use.
+
+C<$hinthash> is a reference to a hash containing the value of C<%^H> when the
+caller was compiled, or C<undef> if C<%^H> was empty. Do not modify the values
+of this hash, as they are the actual values stored in the optree.
+
+Furthermore, when called from within the DB package, caller returns more
+detailed information: it sets the list variable C<@DB::args> to be the
+arguments with which the subroutine was invoked.
+
+Be aware that the optimizer might have optimized call frames away before
+C<caller> had a chance to get the information. That means that C<caller(N)>
+might not return information about the call frame you expect it do, for
+C<< N > 1 >>. In particular, C<@DB::args> might have information from the
+previous time C<caller> was called.
+
+=item chdir EXPR
+X<chdir>
+X<cd>
+X<directory, change>
+
+=item chdir FILEHANDLE
+
+=item chdir DIRHANDLE
+
+=item chdir
+
+Changes the working directory to EXPR, if possible. If EXPR is omitted,
+changes to the directory specified by C<$ENV{HOME}>, if set; if not,
+changes to the directory specified by C<$ENV{LOGDIR}>. (Under VMS, the
+variable C<$ENV{SYS$LOGIN}> is also checked, and used if it is set.) If
+neither is set, C<chdir> does nothing. It returns true upon success,
+false otherwise. See the example under C<die>.
+
+On systems that support fchdir, you might pass a file handle or
+directory handle as argument. On systems that don't support fchdir,
+passing handles produces a fatal error at run time.
+
+=item chmod LIST
+X<chmod> X<permission> X<mode>
+
+Changes the permissions of a list of files. The first element of the
+list must be the numerical mode, which should probably be an octal
+number, and which definitely should I<not> be a string of octal digits:
+C<0644> is okay, C<'0644'> is not. Returns the number of files
+successfully changed. See also L</oct>, if all you have is a string.
+
+ $cnt = chmod 0755, 'foo', 'bar';
+ chmod 0755, @executables;
+ $mode = '0644'; chmod $mode, 'foo'; # !!! sets mode to
+ # --w----r-T
+ $mode = '0644'; chmod oct($mode), 'foo'; # this is better
+ $mode = 0644; chmod $mode, 'foo'; # this is best
+
+On systems that support fchmod, you might pass file handles among the
+files. On systems that don't support fchmod, passing file handles
+produces a fatal error at run time. The file handles must be passed
+as globs or references to be recognized. Barewords are considered
+file names.
+
+ open(my $fh, "<", "foo");
+ my $perm = (stat $fh)[2] & 07777;
+ chmod($perm | 0600, $fh);
+
+You can also import the symbolic C<S_I*> constants from the Fcntl
+module:
+
+ use Fcntl ':mode';
+
+ chmod S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, @executables;
+ # This is identical to the chmod 0755 of the above example.
+
+=item chomp VARIABLE
+X<chomp> X<INPUT_RECORD_SEPARATOR> X<$/> X<newline> X<eol>
+
+=item chomp( LIST )
+
+=item chomp
+
+This safer version of L</chop> removes any trailing string
+that corresponds to the current value of C<$/> (also known as
+$INPUT_RECORD_SEPARATOR in the C<English> module). It returns the total
+number of characters removed from all its arguments. It's often used to
+remove the newline from the end of an input record when you're worried
+that the final record may be missing its newline. When in paragraph
+mode (C<$/ = "">), it removes all trailing newlines from the string.
+When in slurp mode (C<$/ = undef>) or fixed-length record mode (C<$/> is
+a reference to an integer or the like, see L<perlvar>) chomp() won't
+remove anything.
+If VARIABLE is omitted, it chomps C<$_>. Example:
+
+ while (<>) {
+ chomp; # avoid \n on last field
+ @array = split(/:/);
+ # ...
+ }
+
+If VARIABLE is a hash, it chomps the hash's values, but not its keys.
+
+You can actually chomp anything that's an lvalue, including an assignment:
+
+ chomp($cwd = `pwd`);
+ chomp($answer = <STDIN>);
+
+If you chomp a list, each element is chomped, and the total number of
+characters removed is returned.
+
+Note that parentheses are necessary when you're chomping anything
+that is not a simple variable. This is because C<chomp $cwd = `pwd`;>
+is interpreted as C<(chomp $cwd) = `pwd`;>, rather than as
+C<chomp( $cwd = `pwd` )> which you might expect. Similarly,
+C<chomp $a, $b> is interpreted as C<chomp($a), $b> rather than
+as C<chomp($a, $b)>.
+
+=item chop VARIABLE
+X<chop>
+
+=item chop( LIST )
+
+=item chop
+
+Chops off the last character of a string and returns the character
+chopped. It is much more efficient than C<s/.$//s> because it neither
+scans nor copies the string. If VARIABLE is omitted, chops C<$_>.
+If VARIABLE is a hash, it chops the hash's values, but not its keys.
+
+You can actually chop anything that's an lvalue, including an assignment.
+
+If you chop a list, each element is chopped. Only the value of the
+last C<chop> is returned.
+
+Note that C<chop> returns the last character. To return all but the last
+character, use C<substr($string, 0, -1)>.
+
+See also L</chomp>.
+
+=item chown LIST
+X<chown> X<owner> X<user> X<group>
+
+Changes the owner (and group) of a list of files. The first two
+elements of the list must be the I<numeric> uid and gid, in that
+order. A value of -1 in either position is interpreted by most
+systems to leave that value unchanged. Returns the number of files
+successfully changed.
+
+ $cnt = chown $uid, $gid, 'foo', 'bar';
+ chown $uid, $gid, @filenames;
+
+On systems that support fchown, you might pass file handles among the
+files. On systems that don't support fchown, passing file handles
+produces a fatal error at run time. The file handles must be passed
+as globs or references to be recognized. Barewords are considered
+file names.
+
+Here's an example that looks up nonnumeric uids in the passwd file:
+
+ print "User: ";
+ chomp($user = <STDIN>);
+ print "Files: ";
+ chomp($pattern = <STDIN>);
+
+ ($login,$pass,$uid,$gid) = getpwnam($user)
+ or die "$user not in passwd file";
+
+ @ary = glob($pattern); # expand filenames
+ chown $uid, $gid, @ary;
+
+On most systems, you are not allowed to change the ownership of the
+file unless you're the superuser, although you should be able to change
+the group to any of your secondary groups. On insecure systems, these
+restrictions may be relaxed, but this is not a portable assumption.
+On POSIX systems, you can detect this condition this way:
+
+ use POSIX qw(sysconf _PC_CHOWN_RESTRICTED);
+ $can_chown_giveaway = not sysconf(_PC_CHOWN_RESTRICTED);
+
+=item chr NUMBER
+X<chr> X<character> X<ASCII> X<Unicode>
+
+=item chr
+
+Returns the character represented by that NUMBER in the character set.
+For example, C<chr(65)> is C<"A"> in either ASCII or Unicode, and
+chr(0x263a) is a Unicode smiley face.
+
+Negative values give the Unicode replacement character (chr(0xfffd)),
+except under the L<bytes> pragma, where low eight bits of the value
+(truncated to an integer) are used.
+
+If NUMBER is omitted, uses C<$_>.
+
+For the reverse, use L</ord>.
+
+Note that characters from 128 to 255 (inclusive) are by default
+internally not encoded as UTF-8 for backward compatibility reasons.
+
+See L<perlunicode> for more about Unicode.
+
+=item chroot FILENAME
+X<chroot> X<root>
+
+=item chroot
+
+This function works like the system call by the same name: it makes the
+named directory the new root directory for all further pathnames that
+begin with a C</> by your process and all its children. (It doesn't
+change your current working directory, which is unaffected.) For security
+reasons, this call is restricted to the superuser. If FILENAME is
+omitted, does a C<chroot> to C<$_>.
+
+=item close FILEHANDLE
+X<close>
+
+=item close
+
+Closes the file or pipe associated with the file handle, flushes the IO
+buffers, and closes the system file descriptor. Returns true if those
+operations have succeeded and if no error was reported by any PerlIO
+layer. Closes the currently selected filehandle if the argument is
+omitted.
+
+You don't have to close FILEHANDLE if you are immediately going to do
+another C<open> on it, because C<open> will close it for you. (See
+C<open>.) However, an explicit C<close> on an input file resets the line
+counter (C<$.>), while the implicit close done by C<open> does not.
+
+If the file handle came from a piped open, C<close> will additionally
+return false if one of the other system calls involved fails, or if the
+program exits with non-zero status. (If the only problem was that the
+program exited non-zero, C<$!> will be set to C<0>.) Closing a pipe
+also waits for the process executing on the pipe to complete, in case you
+want to look at the output of the pipe afterwards, and
+implicitly puts the exit status value of that command into C<$?> and
+C<${^CHILD_ERROR_NATIVE}>.
+
+Prematurely closing the read end of a pipe (i.e. before the process
+writing to it at the other end has closed it) will result in a
+SIGPIPE being delivered to the writer. If the other end can't
+handle that, be sure to read all the data before closing the pipe.
+
+Example:
+
+ open(OUTPUT, '|sort >foo') # pipe to sort
+ or die "Can't start sort: $!";
+ #... # print stuff to output
+ close OUTPUT # wait for sort to finish
+ or warn $! ? "Error closing sort pipe: $!"
+ : "Exit status $? from sort";
+ open(INPUT, 'foo') # get sort's results
+ or die "Can't open 'foo' for input: $!";
+
+FILEHANDLE may be an expression whose value can be used as an indirect
+filehandle, usually the real filehandle name.
+
+=item closedir DIRHANDLE
+X<closedir>
+
+Closes a directory opened by C<opendir> and returns the success of that
+system call.
+
+=item connect SOCKET,NAME
+X<connect>
+
+Attempts to connect to a remote socket, just as the connect system call
+does. Returns true if it succeeded, false otherwise. NAME should be a
+packed address of the appropriate type for the socket. See the examples in
+L<perlipc/"Sockets: Client/Server Communication">.
+
+=item continue BLOCK
+X<continue>
+
+=item continue
+
+C<continue> is actually a flow control statement rather than a function. If
+there is a C<continue> BLOCK attached to a BLOCK (typically in a C<while> or
+C<foreach>), it is always executed just before the conditional is about to
+be evaluated again, just like the third part of a C<for> loop in C. Thus
+it can be used to increment a loop variable, even when the loop has been
+continued via the C<next> statement (which is similar to the C C<continue>
+statement).
+
+C<last>, C<next>, or C<redo> may appear within a C<continue>
+block. C<last> and C<redo> will behave as if they had been executed within
+the main block. So will C<next>, but since it will execute a C<continue>
+block, it may be more entertaining.
+
+ while (EXPR) {
+ ### redo always comes here
+ do_something;
+ } continue {
+ ### next always comes here
+ do_something_else;
+ # then back the top to re-check EXPR
+ }
+ ### last always comes here
+
+Omitting the C<continue> section is semantically equivalent to using an
+empty one, logically enough. In that case, C<next> goes directly back
+to check the condition at the top of the loop.
+
+If the "switch" feature is enabled, C<continue> is also a
+function that will break out of the current C<when> or C<default>
+block, and fall through to the next case. See L<feature> and
+L<perlsyn/"Switch statements"> for more information.
+
+
+=item cos EXPR
+X<cos> X<cosine> X<acos> X<arccosine>
+
+=item cos
+
+Returns the cosine of EXPR (expressed in radians). If EXPR is omitted,
+takes cosine of C<$_>.
+
+For the inverse cosine operation, you may use the C<Math::Trig::acos()>
+function, or use this relation:
+
+ sub acos { atan2( sqrt(1 - $_[0] * $_[0]), $_[0] ) }
+
+=item crypt PLAINTEXT,SALT
+X<crypt> X<digest> X<hash> X<salt> X<plaintext> X<password>
+X<decrypt> X<cryptography> X<passwd> X<encrypt>
+
+Creates a digest string exactly like the crypt(3) function in the C
+library (assuming that you actually have a version there that has not
+been extirpated as a potential munition).
+
+crypt() is a one-way hash function. The PLAINTEXT and SALT is turned
+into a short string, called a digest, which is returned. The same
+PLAINTEXT and SALT will always return the same string, but there is no
+(known) way to get the original PLAINTEXT from the hash. Small
+changes in the PLAINTEXT or SALT will result in large changes in the
+digest.
+
+There is no decrypt function. This function isn't all that useful for
+cryptography (for that, look for F<Crypt> modules on your nearby CPAN
+mirror) and the name "crypt" is a bit of a misnomer. Instead it is
+primarily used to check if two pieces of text are the same without
+having to transmit or store the text itself. An example is checking
+if a correct password is given. The digest of the password is stored,
+not the password itself. The user types in a password that is
+crypt()'d with the same salt as the stored digest. If the two digests
+match the password is correct.
+
+When verifying an existing digest string you should use the digest as
+the salt (like C<crypt($plain, $digest) eq $digest>). The SALT used
+to create the digest is visible as part of the digest. This ensures
+crypt() will hash the new string with the same salt as the digest.
+This allows your code to work with the standard L<crypt|/crypt> and
+with more exotic implementations. In other words, do not assume
+anything about the returned string itself, or how many bytes in the
+digest matter.
+
+Traditionally the result is a string of 13 bytes: two first bytes of
+the salt, followed by 11 bytes from the set C<[./0-9A-Za-z]>, and only
+the first eight bytes of PLAINTEXT mattered. But alternative
+hashing schemes (like MD5), higher level security schemes (like C2),
+and implementations on non-UNIX platforms may produce different
+strings.
+
+When choosing a new salt create a random two character string whose
+characters come from the set C<[./0-9A-Za-z]> (like C<join '', ('.',
+'/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64]>). This set of
+characters is just a recommendation; the characters allowed in
+the salt depend solely on your system's crypt library, and Perl can't
+restrict what salts C<crypt()> accepts.
+
+Here's an example that makes sure that whoever runs this program knows
+their password:
+
+ $pwd = (getpwuid($<))[1];
+
+ system "stty -echo";
+ print "Password: ";
+ chomp($word = <STDIN>);
+ print "\n";
+ system "stty echo";
+
+ if (crypt($word, $pwd) ne $pwd) {
+ die "Sorry...\n";
+ } else {
+ print "ok\n";
+ }
+
+Of course, typing in your own password to whoever asks you
+for it is unwise.
+
+The L<crypt|/crypt> function is unsuitable for hashing large quantities
+of data, not least of all because you can't get the information
+back. Look at the L<Digest> module for more robust algorithms.
+
+If using crypt() on a Unicode string (which I<potentially> has
+characters with codepoints above 255), Perl tries to make sense
+of the situation by trying to downgrade (a copy of the string)
+the string back to an eight-bit byte string before calling crypt()
+(on that copy). If that works, good. If not, crypt() dies with
+C<Wide character in crypt>.
+
+=item dbmclose HASH
+X<dbmclose>
+
+[This function has been largely superseded by the C<untie> function.]
+
+Breaks the binding between a DBM file and a hash.
+
+=item dbmopen HASH,DBNAME,MASK
+X<dbmopen> X<dbm> X<ndbm> X<sdbm> X<gdbm>
+
+[This function has been largely superseded by the C<tie> function.]
+
+This binds a dbm(3), ndbm(3), sdbm(3), gdbm(3), or Berkeley DB file to a
+hash. HASH is the name of the hash. (Unlike normal C<open>, the first
+argument is I<not> a filehandle, even though it looks like one). DBNAME
+is the name of the database (without the F<.dir> or F<.pag> extension if
+any). If the database does not exist, it is created with protection
+specified by MASK (as modified by the C<umask>). If your system supports
+only the older DBM functions, you may perform only one C<dbmopen> in your
+program. In older versions of Perl, if your system had neither DBM nor
+ndbm, calling C<dbmopen> produced a fatal error; it now falls back to
+sdbm(3).
+
+If you don't have write access to the DBM file, you can only read hash
+variables, not set them. If you want to test whether you can write,
+either use file tests or try setting a dummy hash entry inside an C<eval>,
+which will trap the error.
+
+Note that functions such as C<keys> and C<values> may return huge lists
+when used on large DBM files. You may prefer to use the C<each>
+function to iterate over large DBM files. Example:
+
+ # print out history file offsets
+ dbmopen(%HIST,'/usr/lib/news/history',0666);
+ while (($key,$val) = each %HIST) {
+ print $key, ' = ', unpack('L',$val), "\n";
+ }
+ dbmclose(%HIST);
+
+See also L<AnyDBM_File> for a more general description of the pros and
+cons of the various dbm approaches, as well as L<DB_File> for a particularly
+rich implementation.
+
+You can control which DBM library you use by loading that library
+before you call dbmopen():
+
+ use DB_File;
+ dbmopen(%NS_Hist, "$ENV{HOME}/.netscape/history.db")
+ or die "Can't open netscape history file: $!";
+
+=item defined EXPR
+X<defined> X<undef> X<undefined>
+
+=item defined
+
+Returns a Boolean value telling whether EXPR has a value other than
+the undefined value C<undef>. If EXPR is not present, C<$_> will be
+checked.
+
+Many operations return C<undef> to indicate failure, end of file,
+system error, uninitialized variable, and other exceptional
+conditions. This function allows you to distinguish C<undef> from
+other values. (A simple Boolean test will not distinguish among
+C<undef>, zero, the empty string, and C<"0">, which are all equally
+false.) Note that since C<undef> is a valid scalar, its presence
+doesn't I<necessarily> indicate an exceptional condition: C<pop>
+returns C<undef> when its argument is an empty array, I<or> when the
+element to return happens to be C<undef>.
+
+You may also use C<defined(&func)> to check whether subroutine C<&func>
+has ever been defined. The return value is unaffected by any forward
+declarations of C<&func>. Note that a subroutine which is not defined
+may still be callable: its package may have an C<AUTOLOAD> method that
+makes it spring into existence the first time that it is called -- see
+L<perlsub>.
+
+Use of C<defined> on aggregates (hashes and arrays) is deprecated. It
+used to report whether memory for that aggregate has ever been
+allocated. This behavior may disappear in future versions of Perl.
+You should instead use a simple test for size:
+
+ if (@an_array) { print "has array elements\n" }
+ if (%a_hash) { print "has hash members\n" }
+
+When used on a hash element, it tells you whether the value is defined,
+not whether the key exists in the hash. Use L</exists> for the latter
+purpose.
+
+Examples:
+
+ print if defined $switch{'D'};
+ print "$val\n" while defined($val = pop(@ary));
+ die "Can't readlink $sym: $!"
+ unless defined($value = readlink $sym);
+ sub foo { defined &$bar ? &$bar(@_) : die "No bar"; }
+ $debugging = 0 unless defined $debugging;
+
+Note: Many folks tend to overuse C<defined>, and then are surprised to
+discover that the number C<0> and C<""> (the zero-length string) are, in fact,
+defined values. For example, if you say
+
+ "ab" =~ /a(.*)b/;
+
+The pattern match succeeds, and C<$1> is defined, despite the fact that it
+matched "nothing". It didn't really fail to match anything. Rather, it
+matched something that happened to be zero characters long. This is all
+very above-board and honest. When a function returns an undefined value,
+it's an admission that it couldn't give you an honest answer. So you
+should use C<defined> only when you're questioning the integrity of what
+you're trying to do. At other times, a simple comparison to C<0> or C<""> is
+what you want.
+
+See also L</undef>, L</exists>, L</ref>.
+
+=item delete EXPR
+X<delete>
+
+Given an expression that specifies a hash element, array element, hash slice,
+or array slice, deletes the specified element(s) from the hash or array.
+In the case of an array, if the array elements happen to be at the end,
+the size of the array will shrink to the highest element that tests
+true for exists() (or 0 if no such element exists).
+
+Returns a list with the same number of elements as the number of elements
+for which deletion was attempted. Each element of that list consists of
+either the value of the element deleted, or the undefined value. In scalar
+context, this means that you get the value of the last element deleted (or
+the undefined value if that element did not exist).
+
+ %hash = (foo => 11, bar => 22, baz => 33);
+ $scalar = delete $hash{foo}; # $scalar is 11
+ $scalar = delete @hash{qw(foo bar)}; # $scalar is 22
+ @array = delete @hash{qw(foo bar baz)}; # @array is (undef,undef,33)
+
+Deleting from C<%ENV> modifies the environment. Deleting from
+a hash tied to a DBM file deletes the entry from the DBM file. Deleting
+from a C<tie>d hash or array may not necessarily return anything.
+
+Deleting an array element effectively returns that position of the array
+to its initial, uninitialized state. Subsequently testing for the same
+element with exists() will return false. Also, deleting array elements
+in the middle of an array will not shift the index of the elements
+after them down. Use splice() for that. See L</exists>.
+
+The following (inefficiently) deletes all the values of %HASH and @ARRAY:
+
+ foreach $key (keys %HASH) {
+ delete $HASH{$key};
+ }
+
+ foreach $index (0 .. $#ARRAY) {
+ delete $ARRAY[$index];
+ }
+
+And so do these:
+
+ delete @HASH{keys %HASH};
+
+ delete @ARRAY[0 .. $#ARRAY];
+
+But both of these are slower than just assigning the empty list
+or undefining %HASH or @ARRAY:
+
+ %HASH = (); # completely empty %HASH
+ undef %HASH; # forget %HASH ever existed
+
+ @ARRAY = (); # completely empty @ARRAY
+ undef @ARRAY; # forget @ARRAY ever existed
+
+Note that the EXPR can be arbitrarily complicated as long as the final
+operation is a hash element, array element, hash slice, or array slice
+lookup:
+
+ delete $ref->[$x][$y]{$key};
+ delete @{$ref->[$x][$y]}{$key1, $key2, @morekeys};
+
+ delete $ref->[$x][$y][$index];
+ delete @{$ref->[$x][$y]}[$index1, $index2, @moreindices];
+
+=item die LIST
+X<die> X<throw> X<exception> X<raise> X<$@> X<abort>
+
+Outside an C<eval>, prints the value of LIST to C<STDERR> and
+exits with the current value of C<$!> (errno). If C<$!> is C<0>,
+exits with the value of C<<< ($? >> 8) >>> (backtick `command`
+status). If C<<< ($? >> 8) >>> is C<0>, exits with C<255>. Inside
+an C<eval(),> the error message is stuffed into C<$@> and the
+C<eval> is terminated with the undefined value. This makes
+C<die> the way to raise an exception.
+
+Equivalent examples:
+
+ die "Can't cd to spool: $!\n" unless chdir '/usr/spool/news';
+ chdir '/usr/spool/news' or die "Can't cd to spool: $!\n"
+
+If the last element of LIST does not end in a newline, the current
+script line number and input line number (if any) are also printed,
+and a newline is supplied. Note that the "input line number" (also
+known as "chunk") is subject to whatever notion of "line" happens to
+be currently in effect, and is also available as the special variable
+C<$.>. See L<perlvar/"$/"> and L<perlvar/"$.">.
+
+Hint: sometimes appending C<", stopped"> to your message will cause it
+to make better sense when the string C<"at foo line 123"> is appended.
+Suppose you are running script "canasta".
+
+ die "/etc/games is no good";
+ die "/etc/games is no good, stopped";
+
+produce, respectively
+
+ /etc/games is no good at canasta line 123.
+ /etc/games is no good, stopped at canasta line 123.
+
+See also exit(), warn(), and the Carp module.
+
+If LIST is empty and C<$@> already contains a value (typically from a
+previous eval) that value is reused after appending C<"\t...propagated">.
+This is useful for propagating exceptions:
+
+ eval { ... };
+ die unless $@ =~ /Expected exception/;
+
+If LIST is empty and C<$@> contains an object reference that has a
+C<PROPAGATE> method, that method will be called with additional file
+and line number parameters. The return value replaces the value in
+C<$@>. i.e. as if C<< $@ = eval { $@->PROPAGATE(__FILE__, __LINE__) }; >>
+were called.
+
+If C<$@> is empty then the string C<"Died"> is used.
+
+die() can also be called with a reference argument. If this happens to be
+trapped within an eval(), $@ contains the reference. This behavior permits
+a more elaborate exception handling implementation using objects that
+maintain arbitrary state about the nature of the exception. Such a scheme
+is sometimes preferable to matching particular string values of $@ using
+regular expressions. Because $@ is a global variable, and eval() may be
+used within object implementations, care must be taken that analyzing the
+error object doesn't replace the reference in the global variable. The
+easiest solution is to make a local copy of the reference before doing
+other manipulations. Here's an example:
+
+ use Scalar::Util 'blessed';
+
+ eval { ... ; die Some::Module::Exception->new( FOO => "bar" ) };
+ if (my $ev_err = $@) {
+ if (blessed($ev_err) && $ev_err->isa("Some::Module::Exception")) {
+ # handle Some::Module::Exception
+ }
+ else {
+ # handle all other possible exceptions
+ }
+ }
+
+Because perl will stringify uncaught exception messages before displaying
+them, you may want to overload stringification operations on such custom
+exception objects. See L<overload> for details about that.
+
+You can arrange for a callback to be run just before the C<die>
+does its deed, by setting the C<$SIG{__DIE__}> hook. The associated
+handler will be called with the error text and can change the error
+message, if it sees fit, by calling C<die> again. See
+L<perlvar/$SIG{expr}> for details on setting C<%SIG> entries, and
+L<"eval BLOCK"> for some examples. Although this feature was
+to be run only right before your program was to exit, this is not
+currently the case--the C<$SIG{__DIE__}> hook is currently called
+even inside eval()ed blocks/strings! If one wants the hook to do
+nothing in such situations, put
+
+ die @_ if $^S;
+
+as the first line of the handler (see L<perlvar/$^S>). Because
+this promotes strange action at a distance, this counterintuitive
+behavior may be fixed in a future release.
+
+=item do BLOCK
+X<do> X<block>
+
+Not really a function. Returns the value of the last command in the
+sequence of commands indicated by BLOCK. When modified by the C<while> or
+C<until> loop modifier, executes the BLOCK once before testing the loop
+condition. (On other statements the loop modifiers test the conditional
+first.)
+
+C<do BLOCK> does I<not> count as a loop, so the loop control statements
+C<next>, C<last>, or C<redo> cannot be used to leave or restart the block.
+See L<perlsyn> for alternative strategies.
+
+=item do SUBROUTINE(LIST)
+X<do>
+
+This form of subroutine call is deprecated. See L<perlsub>.
+
+=item do EXPR
+X<do>
+
+Uses the value of EXPR as a filename and executes the contents of the
+file as a Perl script.
+
+ do 'stat.pl';
+
+is just like
+
+ eval `cat stat.pl`;
+
+except that it's more efficient and concise, keeps track of the current
+filename for error messages, searches the @INC directories, and updates
+C<%INC> if the file is found. See L<perlvar/Predefined Names> for these
+variables. It also differs in that code evaluated with C<do FILENAME>
+cannot see lexicals in the enclosing scope; C<eval STRING> does. It's the
+same, however, in that it does reparse the file every time you call it,
+so you probably don't want to do this inside a loop.
+
+If C<do> cannot read the file, it returns undef and sets C<$!> to the
+error. If C<do> can read the file but cannot compile it, it
+returns undef and sets an error message in C<$@>. If the file is
+successfully compiled, C<do> returns the value of the last expression
+evaluated.
+
+Note that inclusion of library modules is better done with the
+C<use> and C<require> operators, which also do automatic error checking
+and raise an exception if there's a problem.
+
+You might like to use C<do> to read in a program configuration
+file. Manual error checking can be done this way:
+
+ # read in config files: system first, then user
+ for $file ("/share/prog/defaults.rc",
+ "$ENV{HOME}/.someprogrc")
+ {
+ unless ($return = do $file) {
+ warn "couldn't parse $file: $@" if $@;
+ warn "couldn't do $file: $!" unless defined $return;
+ warn "couldn't run $file" unless $return;
+ }
+ }
+
+=item dump LABEL
+X<dump> X<core> X<undump>
+
+=item dump
+
+This function causes an immediate core dump. See also the B<-u>
+command-line switch in L<perlrun>, which does the same thing.
+Primarily this is so that you can use the B<undump> program (not
+supplied) to turn your core dump into an executable binary after
+having initialized all your variables at the beginning of the
+program. When the new binary is executed it will begin by executing
+a C<goto LABEL> (with all the restrictions that C<goto> suffers).
+Think of it as a goto with an intervening core dump and reincarnation.
+If C<LABEL> is omitted, restarts the program from the top.
+
+B<WARNING>: Any files opened at the time of the dump will I<not>
+be open any more when the program is reincarnated, with possible
+resulting confusion on the part of Perl.
+
+This function is now largely obsolete, mostly because it's very hard to
+convert a core file into an executable. That's why you should now invoke
+it as C<CORE::dump()>, if you don't want to be warned against a possible
+typo.
+
+=item each HASH
+X<each> X<hash, iterator>
+
+When called in list context, returns a 2-element list consisting of the
+key and value for the next element of a hash, so that you can iterate over
+it. When called in scalar context, returns only the key for the next
+element in the hash.
+
+Entries are returned in an apparently random order. The actual random
+order is subject to change in future versions of perl, but it is
+guaranteed to be in the same order as either the C<keys> or C<values>
+function would produce on the same (unmodified) hash. Since Perl
+5.8.2 the ordering can be different even between different runs of Perl
+for security reasons (see L<perlsec/"Algorithmic Complexity Attacks">).
+
+When the hash is entirely read, a null array is returned in list context
+(which when assigned produces a false (C<0>) value), and C<undef> in
+scalar context. The next call to C<each> after that will start iterating
+again. There is a single iterator for each hash, shared by all C<each>,
+C<keys>, and C<values> function calls in the program; it can be reset by
+reading all the elements from the hash, or by evaluating C<keys HASH> or
+C<values HASH>. If you add or delete elements of a hash while you're
+iterating over it, you may get entries skipped or duplicated, so
+don't. Exception: It is always safe to delete the item most recently
+returned by C<each()>, which means that the following code will work:
+
+ while (($key, $value) = each %hash) {
+ print $key, "\n";
+ delete $hash{$key}; # This is safe
+ }
+
+The following prints out your environment like the printenv(1) program,
+only in a different order:
+
+ while (($key,$value) = each %ENV) {
+ print "$key=$value\n";
+ }
+
+See also C<keys>, C<values> and C<sort>.
+
+=item eof FILEHANDLE
+X<eof>
+X<end of file>
+X<end-of-file>
+
+=item eof ()
+
+=item eof
+
+Returns 1 if the next read on FILEHANDLE will return end of file, or if
+FILEHANDLE is not open. FILEHANDLE may be an expression whose value
+gives the real filehandle. (Note that this function actually
+reads a character and then C<ungetc>s it, so isn't very useful in an
+interactive context.) Do not read from a terminal file (or call
+C<eof(FILEHANDLE)> on it) after end-of-file is reached. File types such
+as terminals may lose the end-of-file condition if you do.
+
+An C<eof> without an argument uses the last file read. Using C<eof()>
+with empty parentheses is very different. It refers to the pseudo file
+formed from the files listed on the command line and accessed via the
+C<< <> >> operator. Since C<< <> >> isn't explicitly opened,
+as a normal filehandle is, an C<eof()> before C<< <> >> has been
+used will cause C<@ARGV> to be examined to determine if input is
+available. Similarly, an C<eof()> after C<< <> >> has returned
+end-of-file will assume you are processing another C<@ARGV> list,
+and if you haven't set C<@ARGV>, will read input from C<STDIN>;
+see L<perlop/"I/O Operators">.
+
+In a C<< while (<>) >> loop, C<eof> or C<eof(ARGV)> can be used to
+detect the end of each file, C<eof()> will only detect the end of the
+last file. Examples:
+
+ # reset line numbering on each input file
+ while (<>) {
+ next if /^\s*#/; # skip comments
+ print "$.\t$_";
+ } continue {
+ close ARGV if eof; # Not eof()!
+ }
+
+ # insert dashes just before last line of last file
+ while (<>) {
+ if (eof()) { # check for end of last file
+ print "--------------\n";
+ }
+ print;
+ last if eof(); # needed if we're reading from a terminal
+ }
+
+Practical hint: you almost never need to use C<eof> in Perl, because the
+input operators typically return C<undef> when they run out of data, or if
+there was an error.
+
+=item eval EXPR
+X<eval> X<try> X<catch> X<evaluate> X<parse> X<execute>
+X<error, handling> X<exception, handling>
+
+=item eval BLOCK
+
+=item eval
+
+In the first form, the return value of EXPR is parsed and executed as if it
+were a little Perl program. The value of the expression (which is itself
+determined within scalar context) is first parsed, and if there weren't any
+errors, executed in the lexical context of the current Perl program, so
+that any variable settings or subroutine and format definitions remain
+afterwards. Note that the value is parsed every time the C<eval> executes.
+If EXPR is omitted, evaluates C<$_>. This form is typically used to
+delay parsing and subsequent execution of the text of EXPR until run time.
+
+In the second form, the code within the BLOCK is parsed only once--at the
+same time the code surrounding the C<eval> itself was parsed--and executed
+within the context of the current Perl program. This form is typically
+used to trap exceptions more efficiently than the first (see below), while
+also providing the benefit of checking the code within BLOCK at compile
+time.
+
+The final semicolon, if any, may be omitted from the value of EXPR or within
+the BLOCK.
+
+In both forms, the value returned is the value of the last expression
+evaluated inside the mini-program; a return statement may be also used, just
+as with subroutines. The expression providing the return value is evaluated
+in void, scalar, or list context, depending on the context of the C<eval>
+itself. See L</wantarray> for more on how the evaluation context can be
+determined.
+
+If there is a syntax error or runtime error, or a C<die> statement is
+executed, C<eval> returns an undefined value in scalar context
+or an empty list in list context, and C<$@> is set to the
+error message. If there was no error, C<$@> is guaranteed to be a null
+string. Beware that using C<eval> neither silences perl from printing
+warnings to STDERR, nor does it stuff the text of warning messages into C<$@>.
+To do either of those, you have to use the C<$SIG{__WARN__}> facility, or
+turn off warnings inside the BLOCK or EXPR using S<C<no warnings 'all'>>.
+See L</warn>, L<perlvar>, L<warnings> and L<perllexwarn>.
+
+Note that, because C<eval> traps otherwise-fatal errors, it is useful for
+determining whether a particular feature (such as C<socket> or C<symlink>)
+is implemented. It is also Perl's exception trapping mechanism, where
+the die operator is used to raise exceptions.
+
+If you want to trap errors when loading an XS module, some problems with
+the binary interface (such as Perl version skew) may be fatal even with
+C<eval> unless C<$ENV{PERL_DL_NONLAZY}> is set. See L<perlrun>.
+
+If the code to be executed doesn't vary, you may use the eval-BLOCK
+form to trap run-time errors without incurring the penalty of
+recompiling each time. The error, if any, is still returned in C<$@>.
+Examples:
+
+ # make divide-by-zero nonfatal
+ eval { $answer = $a / $b; }; warn $@ if $@;
+
+ # same thing, but less efficient
+ eval '$answer = $a / $b'; warn $@ if $@;
+
+ # a compile-time error
+ eval { $answer = }; # WRONG
+
+ # a run-time error
+ eval '$answer ='; # sets $@
+
+Using the C<eval{}> form as an exception trap in libraries does have some
+issues. Due to the current arguably broken state of C<__DIE__> hooks, you
+may wish not to trigger any C<__DIE__> hooks that user code may have installed.
+You can use the C<local $SIG{__DIE__}> construct for this purpose,
+as shown in this example:
+
+ # a very private exception trap for divide-by-zero
+ eval { local $SIG{'__DIE__'}; $answer = $a / $b; };
+ warn $@ if $@;
+
+This is especially significant, given that C<__DIE__> hooks can call
+C<die> again, which has the effect of changing their error messages:
+
+ # __DIE__ hooks may modify error messages
+ {
+ local $SIG{'__DIE__'} =
+ sub { (my $x = $_[0]) =~ s/foo/bar/g; die $x };
+ eval { die "foo lives here" };
+ print $@ if $@; # prints "bar lives here"
+ }
+
+Because this promotes action at a distance, this counterintuitive behavior
+may be fixed in a future release.
+
+With an C<eval>, you should be especially careful to remember what's
+being looked at when:
+
+ eval $x; # CASE 1
+ eval "$x"; # CASE 2
+
+ eval '$x'; # CASE 3
+ eval { $x }; # CASE 4
+
+ eval "\$$x++"; # CASE 5
+ $$x++; # CASE 6
+
+Cases 1 and 2 above behave identically: they run the code contained in
+the variable $x. (Although case 2 has misleading double quotes making
+the reader wonder what else might be happening (nothing is).) Cases 3
+and 4 likewise behave in the same way: they run the code C<'$x'>, which
+does nothing but return the value of $x. (Case 4 is preferred for
+purely visual reasons, but it also has the advantage of compiling at
+compile-time instead of at run-time.) Case 5 is a place where
+normally you I<would> like to use double quotes, except that in this
+particular situation, you can just use symbolic references instead, as
+in case 6.
+
+The assignment to C<$@> occurs before restoration of localised variables,
+which means a temporary is required if you want to mask some but not all
+errors:
+
+ # alter $@ on nefarious repugnancy only
+ {
+ my $e;
+ {
+ local $@; # protect existing $@
+ eval { test_repugnancy() };
+ # $@ =~ /nefarious/ and die $@; # DOES NOT WORK
+ $@ =~ /nefarious/ and $e = $@;
+ }
+ die $e if defined $e
+ }
+
+C<eval BLOCK> does I<not> count as a loop, so the loop control statements
+C<next>, C<last>, or C<redo> cannot be used to leave or restart the block.
+
+Note that as a very special case, an C<eval ''> executed within the C<DB>
+package doesn't see the usual surrounding lexical scope, but rather the
+scope of the first non-DB piece of code that called it. You don't normally
+need to worry about this unless you are writing a Perl debugger.
+
+=item exec LIST
+X<exec> X<execute>
+
+=item exec PROGRAM LIST
+
+The C<exec> function executes a system command I<and never returns>--
+use C<system> instead of C<exec> if you want it to return. It fails and
+returns false only if the command does not exist I<and> it is executed
+directly instead of via your system's command shell (see below).
+
+Since it's a common mistake to use C<exec> instead of C<system>, Perl
+warns you if there is a following statement which isn't C<die>, C<warn>,
+or C<exit> (if C<-w> is set - but you always do that). If you
+I<really> want to follow an C<exec> with some other statement, you
+can use one of these styles to avoid the warning:
+
+ exec ('foo') or print STDERR "couldn't exec foo: $!";
+ { exec ('foo') }; print STDERR "couldn't exec foo: $!";
+
+If there is more than one argument in LIST, or if LIST is an array
+with more than one value, calls execvp(3) with the arguments in LIST.
+If there is only one scalar argument or an array with one element in it,
+the argument is checked for shell metacharacters, and if there are any,
+the entire argument is passed to the system's command shell for parsing
+(this is C</bin/sh -c> on Unix platforms, but varies on other platforms).
+If there are no shell metacharacters in the argument, it is split into
+words and passed directly to C<execvp>, which is more efficient.
+Examples:
+
+ exec '/bin/echo', 'Your arguments are: ', @ARGV;
+ exec "sort $outfile | uniq";
+
+If you don't really want to execute the first argument, but want to lie
+to the program you are executing about its own name, you can specify
+the program you actually want to run as an "indirect object" (without a
+comma) in front of the LIST. (This always forces interpretation of the
+LIST as a multivalued list, even if there is only a single scalar in
+the list.) Example:
+
+ $shell = '/bin/csh';
+ exec $shell '-sh'; # pretend it's a login shell
+
+or, more directly,
+
+ exec {'/bin/csh'} '-sh'; # pretend it's a login shell
+
+When the arguments get executed via the system shell, results will
+be subject to its quirks and capabilities. See L<perlop/"`STRING`">
+for details.
+
+Using an indirect object with C<exec> or C<system> is also more
+secure. This usage (which also works fine with system()) forces
+interpretation of the arguments as a multivalued list, even if the
+list had just one argument. That way you're safe from the shell
+expanding wildcards or splitting up words with whitespace in them.
+
+ @args = ( "echo surprise" );
+
+ exec @args; # subject to shell escapes
+ # if @args == 1
+ exec { $args[0] } @args; # safe even with one-arg list
+
+The first version, the one without the indirect object, ran the I<echo>
+program, passing it C<"surprise"> an argument. The second version
+didn't--it tried to run a program literally called I<"echo surprise">,
+didn't find it, and set C<$?> to a non-zero value indicating failure.
+
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before the exec, but this may not be supported on some platforms
+(see L<perlport>). To be safe, you may need to set C<$|> ($AUTOFLUSH
+in English) or call the C<autoflush()> method of C<IO::Handle> on any
+open handles in order to avoid lost output.
+
+Note that C<exec> will not call your C<END> blocks, nor will it call
+any C<DESTROY> methods in your objects.
+
+=item exists EXPR
+X<exists> X<autovivification>
+
+Given an expression that specifies a hash element or array element,
+returns true if the specified element in the hash or array has ever
+been initialized, even if the corresponding value is undefined.
+
+ print "Exists\n" if exists $hash{$key};
+ print "Defined\n" if defined $hash{$key};
+ print "True\n" if $hash{$key};
+
+ print "Exists\n" if exists $array[$index];
+ print "Defined\n" if defined $array[$index];
+ print "True\n" if $array[$index];
+
+A hash or array element can be true only if it's defined, and defined if
+it exists, but the reverse doesn't necessarily hold true.
+
+Given an expression that specifies the name of a subroutine,
+returns true if the specified subroutine has ever been declared, even
+if it is undefined. Mentioning a subroutine name for exists or defined
+does not count as declaring it. Note that a subroutine which does not
+exist may still be callable: its package may have an C<AUTOLOAD>
+method that makes it spring into existence the first time that it is
+called -- see L<perlsub>.
+
+ print "Exists\n" if exists &subroutine;
+ print "Defined\n" if defined &subroutine;
+
+Note that the EXPR can be arbitrarily complicated as long as the final
+operation is a hash or array key lookup or subroutine name:
+
+ if (exists $ref->{A}->{B}->{$key}) { }
+ if (exists $hash{A}{B}{$key}) { }
+
+ if (exists $ref->{A}->{B}->[$ix]) { }
+ if (exists $hash{A}{B}[$ix]) { }
+
+ if (exists &{$ref->{A}{B}{$key}}) { }
+
+Although the deepest nested array or hash will not spring into existence
+just because its existence was tested, any intervening ones will.
+Thus C<< $ref->{"A"} >> and C<< $ref->{"A"}->{"B"} >> will spring
+into existence due to the existence test for the $key element above.
+This happens anywhere the arrow operator is used, including even:
+
+ undef $ref;
+ if (exists $ref->{"Some key"}) { }
+ print $ref; # prints HASH(0x80d3d5c)
+
+This surprising autovivification in what does not at first--or even
+second--glance appear to be an lvalue context may be fixed in a future
+release.
+
+Use of a subroutine call, rather than a subroutine name, as an argument
+to exists() is an error.
+
+ exists &sub; # OK
+ exists &sub(); # Error
+
+=item exit EXPR
+X<exit> X<terminate> X<abort>
+
+=item exit
+
+Evaluates EXPR and exits immediately with that value. Example:
+
+ $ans = <STDIN>;
+ exit 0 if $ans =~ /^[Xx]/;
+
+See also C<die>. If EXPR is omitted, exits with C<0> status. The only
+universally recognized values for EXPR are C<0> for success and C<1>
+for error; other values are subject to interpretation depending on the
+environment in which the Perl program is running. For example, exiting
+69 (EX_UNAVAILABLE) from a I<sendmail> incoming-mail filter will cause
+the mailer to return the item undelivered, but that's not true everywhere.
+
+Don't use C<exit> to abort a subroutine if there's any chance that
+someone might want to trap whatever error happened. Use C<die> instead,
+which can be trapped by an C<eval>.
+
+The exit() function does not always exit immediately. It calls any
+defined C<END> routines first, but these C<END> routines may not
+themselves abort the exit. Likewise any object destructors that need to
+be called are called before the real exit. If this is a problem, you
+can call C<POSIX:_exit($status)> to avoid END and destructor processing.
+See L<perlmod> for details.
+
+=item exp EXPR
+X<exp> X<exponential> X<antilog> X<antilogarithm> X<e>
+
+=item exp
+
+Returns I<e> (the natural logarithm base) to the power of EXPR.
+If EXPR is omitted, gives C<exp($_)>.
+
+=item fcntl FILEHANDLE,FUNCTION,SCALAR
+X<fcntl>
+
+Implements the fcntl(2) function. You'll probably have to say
+
+ use Fcntl;
+
+first to get the correct constant definitions. Argument processing and
+value return works just like C<ioctl> below.
+For example:
+
+ use Fcntl;
+ fcntl($filehandle, F_GETFL, $packed_return_buffer)
+ or die "can't fcntl F_GETFL: $!";
+
+You don't have to check for C<defined> on the return from C<fcntl>.
+Like C<ioctl>, it maps a C<0> return from the system call into
+C<"0 but true"> in Perl. This string is true in boolean context and C<0>
+in numeric context. It is also exempt from the normal B<-w> warnings
+on improper numeric conversions.
+
+Note that C<fcntl> will produce a fatal error if used on a machine that
+doesn't implement fcntl(2). See the Fcntl module or your fcntl(2)
+manpage to learn what functions are available on your system.
+
+Here's an example of setting a filehandle named C<REMOTE> to be
+non-blocking at the system level. You'll have to negotiate C<$|>
+on your own, though.
+
+ use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
+
+ $flags = fcntl(REMOTE, F_GETFL, 0)
+ or die "Can't get flags for the socket: $!\n";
+
+ $flags = fcntl(REMOTE, F_SETFL, $flags | O_NONBLOCK)
+ or die "Can't set flags for the socket: $!\n";
+
+=item fileno FILEHANDLE
+X<fileno>
+
+Returns the file descriptor for a filehandle, or undefined if the
+filehandle is not open. This is mainly useful for constructing
+bitmaps for C<select> and low-level POSIX tty-handling operations.
+If FILEHANDLE is an expression, the value is taken as an indirect
+filehandle, generally its name.
+
+You can use this to find out whether two handles refer to the
+same underlying descriptor:
+
+ if (fileno(THIS) == fileno(THAT)) {
+ print "THIS and THAT are dups\n";
+ }
+
+(Filehandles connected to memory objects via new features of C<open> may
+return undefined even though they are open.)
+
+
+=item flock FILEHANDLE,OPERATION
+X<flock> X<lock> X<locking>
+
+Calls flock(2), or an emulation of it, on FILEHANDLE. Returns true
+for success, false on failure. Produces a fatal error if used on a
+machine that doesn't implement flock(2), fcntl(2) locking, or lockf(3).
+C<flock> is Perl's portable file locking interface, although it locks
+only entire files, not records.
+
+Two potentially non-obvious but traditional C<flock> semantics are
+that it waits indefinitely until the lock is granted, and that its locks
+B<merely advisory>. Such discretionary locks are more flexible, but offer
+fewer guarantees. This means that programs that do not also use C<flock>
+may modify files locked with C<flock>. See L<perlport>,
+your port's specific documentation, or your system-specific local manpages
+for details. It's best to assume traditional behavior if you're writing
+portable programs. (But if you're not, you should as always feel perfectly
+free to write for your own system's idiosyncrasies (sometimes called
+"features"). Slavish adherence to portability concerns shouldn't get
+in the way of your getting your job done.)
+
+OPERATION is one of LOCK_SH, LOCK_EX, or LOCK_UN, possibly combined with
+LOCK_NB. These constants are traditionally valued 1, 2, 8 and 4, but
+you can use the symbolic names if you import them from the Fcntl module,
+either individually, or as a group using the ':flock' tag. LOCK_SH
+requests a shared lock, LOCK_EX requests an exclusive lock, and LOCK_UN
+releases a previously requested lock. If LOCK_NB is bitwise-or'ed with
+LOCK_SH or LOCK_EX then C<flock> will return immediately rather than blocking
+waiting for the lock (check the return status to see if you got it).
+
+To avoid the possibility of miscoordination, Perl now flushes FILEHANDLE
+before locking or unlocking it.
+
+Note that the emulation built with lockf(3) doesn't provide shared
+locks, and it requires that FILEHANDLE be open with write intent. These
+are the semantics that lockf(3) implements. Most if not all systems
+implement lockf(3) in terms of fcntl(2) locking, though, so the
+differing semantics shouldn't bite too many people.
+
+Note that the fcntl(2) emulation of flock(3) requires that FILEHANDLE
+be open with read intent to use LOCK_SH and requires that it be open
+with write intent to use LOCK_EX.
+
+Note also that some versions of C<flock> cannot lock things over the
+network; you would need to use the more system-specific C<fcntl> for
+that. If you like you can force Perl to ignore your system's flock(2)
+function, and so provide its own fcntl(2)-based emulation, by passing
+the switch C<-Ud_flock> to the F<Configure> program when you configure
+perl.
+
+Here's a mailbox appender for BSD systems.
+
+ use Fcntl qw(:flock SEEK_END); # import LOCK_* and SEEK_END constants
+
+ sub lock {
+ my ($fh) = @_;
+ flock($fh, LOCK_EX) or die "Cannot lock mailbox - $!\n";
+
+ # and, in case someone appended while we were waiting...
+ seek($fh, 0, SEEK_END) or die "Cannot seek - $!\n";
+ }
+
+ sub unlock {
+ my ($fh) = @_;
+ flock($fh, LOCK_UN) or die "Cannot unlock mailbox - $!\n";
+ }
+
+ open(my $mbox, ">>", "/usr/spool/mail/$ENV{'USER'}")
+ or die "Can't open mailbox: $!";
+
+ lock($mbox);
+ print $mbox $msg,"\n\n";
+ unlock($mbox);
+
+On systems that support a real flock(), locks are inherited across fork()
+calls, whereas those that must resort to the more capricious fcntl()
+function lose the locks, making it harder to write servers.
+
+See also L<DB_File> for other flock() examples.
+
+=item fork
+X<fork> X<child> X<parent>
+
+Does a fork(2) system call to create a new process running the
+same program at the same point. It returns the child pid to the
+parent process, C<0> to the child process, or C<undef> if the fork is
+unsuccessful. File descriptors (and sometimes locks on those descriptors)
+are shared, while everything else is copied. On most systems supporting
+fork(), great care has gone into making it extremely efficient (for
+example, using copy-on-write technology on data pages), making it the
+dominant paradigm for multitasking over the last few decades.
+
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before forking the child process, but this may not be supported
+on some platforms (see L<perlport>). To be safe, you may need to set
+C<$|> ($AUTOFLUSH in English) or call the C<autoflush()> method of
+C<IO::Handle> on any open handles in order to avoid duplicate output.
+
+If you C<fork> without ever waiting on your children, you will
+accumulate zombies. On some systems, you can avoid this by setting
+C<$SIG{CHLD}> to C<"IGNORE">. See also L<perlipc> for more examples of
+forking and reaping moribund children.
+
+Note that if your forked child inherits system file descriptors like
+STDIN and STDOUT that are actually connected by a pipe or socket, even
+if you exit, then the remote server (such as, say, a CGI script or a
+backgrounded job launched from a remote shell) won't think you're done.
+You should reopen those to F</dev/null> if it's any issue.
+
+=item format
+X<format>
+
+Declare a picture format for use by the C<write> function. For
+example:
+
+ format Something =
+ Test: @<<<<<<<< @||||| @>>>>>
+ $str, $%, '$' . int($num)
+ .
+
+ $str = "widget";
+ $num = $cost/$quantity;
+ $~ = 'Something';
+ write;
+
+See L<perlform> for many details and examples.
+
+=item formline PICTURE,LIST
+X<formline>
+
+This is an internal function used by C<format>s, though you may call it,
+too. It formats (see L<perlform>) a list of values according to the
+contents of PICTURE, placing the output into the format output
+accumulator, C<$^A> (or C<$ACCUMULATOR> in English).
+Eventually, when a C<write> is done, the contents of
+C<$^A> are written to some filehandle. You could also read C<$^A>
+and then set C<$^A> back to C<"">. Note that a format typically
+does one C<formline> per line of form, but the C<formline> function itself
+doesn't care how many newlines are embedded in the PICTURE. This means
+that the C<~> and C<~~> tokens will treat the entire PICTURE as a single line.
+You may therefore need to use multiple formlines to implement a single
+record format, just like the format compiler.
+
+Be careful if you put double quotes around the picture, because an C<@>
+character may be taken to mean the beginning of an array name.
+C<formline> always returns true. See L<perlform> for other examples.
+
+=item getc FILEHANDLE
+X<getc> X<getchar> X<character> X<file, read>
+
+=item getc
+
+Returns the next character from the input file attached to FILEHANDLE,
+or the undefined value at end of file, or if there was an error (in
+the latter case C<$!> is set). If FILEHANDLE is omitted, reads from
+STDIN. This is not particularly efficient. However, it cannot be
+used by itself to fetch single characters without waiting for the user
+to hit enter. For that, try something more like:
+
+ if ($BSD_STYLE) {
+ system "stty cbreak </dev/tty >/dev/tty 2>&1";
+ }
+ else {
+ system "stty", '-icanon', 'eol', "\001";
+ }
+
+ $key = getc(STDIN);
+
+ if ($BSD_STYLE) {
+ system "stty -cbreak </dev/tty >/dev/tty 2>&1";
+ }
+ else {
+ system "stty", 'icanon', 'eol', '^@'; # ASCII null
+ }
+ print "\n";
+
+Determination of whether $BSD_STYLE should be set
+is left as an exercise to the reader.
+
+The C<POSIX::getattr> function can do this more portably on
+systems purporting POSIX compliance. See also the C<Term::ReadKey>
+module from your nearest CPAN site; details on CPAN can be found on
+L<perlmodlib/CPAN>.
+
+=item getlogin
+X<getlogin> X<login>
+
+This implements the C library function of the same name, which on most
+systems returns the current login from F</etc/utmp>, if any. If null,
+use C<getpwuid>.
+
+ $login = getlogin || getpwuid($<) || "Kilroy";
+
+Do not consider C<getlogin> for authentication: it is not as
+secure as C<getpwuid>.
+
+=item getpeername SOCKET
+X<getpeername> X<peer>
+
+Returns the packed sockaddr address of other end of the SOCKET connection.
+
+ use Socket;
+ $hersockaddr = getpeername(SOCK);
+ ($port, $iaddr) = sockaddr_in($hersockaddr);
+ $herhostname = gethostbyaddr($iaddr, AF_INET);
+ $herstraddr = inet_ntoa($iaddr);
+
+=item getpgrp PID
+X<getpgrp> X<group>
+
+Returns the current process group for the specified PID. Use
+a PID of C<0> to get the current process group for the
+current process. Will raise an exception if used on a machine that
+doesn't implement getpgrp(2). If PID is omitted, returns process
+group of current process. Note that the POSIX version of C<getpgrp>
+does not accept a PID argument, so only C<PID==0> is truly portable.
+
+=item getppid
+X<getppid> X<parent> X<pid>
+
+Returns the process id of the parent process.
+
+Note for Linux users: on Linux, the C functions C<getpid()> and
+C<getppid()> return different values from different threads. In order to
+be portable, this behavior is not reflected by the perl-level function
+C<getppid()>, that returns a consistent value across threads. If you want
+to call the underlying C<getppid()>, you may use the CPAN module
+C<Linux::Pid>.
+
+=item getpriority WHICH,WHO
+X<getpriority> X<priority> X<nice>
+
+Returns the current priority for a process, a process group, or a user.
+(See C<getpriority(2)>.) Will raise a fatal exception if used on a
+machine that doesn't implement getpriority(2).
+
+=item getpwnam NAME
+X<getpwnam> X<getgrnam> X<gethostbyname> X<getnetbyname> X<getprotobyname>
+X<getpwuid> X<getgrgid> X<getservbyname> X<gethostbyaddr> X<getnetbyaddr>
+X<getprotobynumber> X<getservbyport> X<getpwent> X<getgrent> X<gethostent>
+X<getnetent> X<getprotoent> X<getservent> X<setpwent> X<setgrent> X<sethostent>
+X<setnetent> X<setprotoent> X<setservent> X<endpwent> X<endgrent> X<endhostent>
+X<endnetent> X<endprotoent> X<endservent>
+
+=item getgrnam NAME
+
+=item gethostbyname NAME
+
+=item getnetbyname NAME
+
+=item getprotobyname NAME
+
+=item getpwuid UID
+
+=item getgrgid GID
+
+=item getservbyname NAME,PROTO
+
+=item gethostbyaddr ADDR,ADDRTYPE
+
+=item getnetbyaddr ADDR,ADDRTYPE
+
+=item getprotobynumber NUMBER
+
+=item getservbyport PORT,PROTO
+
+=item getpwent
+
+=item getgrent
+
+=item gethostent
+
+=item getnetent
+
+=item getprotoent
+
+=item getservent
+
+=item setpwent
+
+=item setgrent
+
+=item sethostent STAYOPEN
+
+=item setnetent STAYOPEN
+
+=item setprotoent STAYOPEN
+
+=item setservent STAYOPEN
+
+=item endpwent
+
+=item endgrent
+
+=item endhostent
+
+=item endnetent
+
+=item endprotoent
+
+=item endservent
+
+These routines perform the same functions as their counterparts in the
+system library. In list context, the return values from the
+various get routines are as follows:
+
+ ($name,$passwd,$uid,$gid,
+ $quota,$comment,$gcos,$dir,$shell,$expire) = getpw*
+ ($name,$passwd,$gid,$members) = getgr*
+ ($name,$aliases,$addrtype,$length,@addrs) = gethost*
+ ($name,$aliases,$addrtype,$net) = getnet*
+ ($name,$aliases,$proto) = getproto*
+ ($name,$aliases,$port,$proto) = getserv*
+
+(If the entry doesn't exist you get a null list.)
+
+The exact meaning of the $gcos field varies but it usually contains
+the real name of the user (as opposed to the login name) and other
+information pertaining to the user. Beware, however, that in many
+system users are able to change this information and therefore it
+cannot be trusted and therefore the $gcos is tainted (see
+L<perlsec>). The $passwd and $shell, user's encrypted password and
+login shell, are also tainted, because of the same reason.
+
+In scalar context, you get the name, unless the function was a
+lookup by name, in which case you get the other thing, whatever it is.
+(If the entry doesn't exist you get the undefined value.) For example:
+
+ $uid = getpwnam($name);
+ $name = getpwuid($num);
+ $name = getpwent();
+ $gid = getgrnam($name);
+ $name = getgrgid($num);
+ $name = getgrent();
+ #etc.
+
+In I<getpw*()> the fields $quota, $comment, and $expire are special
+cases in the sense that in many systems they are unsupported. If the
+$quota is unsupported, it is an empty scalar. If it is supported, it
+usually encodes the disk quota. If the $comment field is unsupported,
+it is an empty scalar. If it is supported it usually encodes some
+administrative comment about the user. In some systems the $quota
+field may be $change or $age, fields that have to do with password
+aging. In some systems the $comment field may be $class. The $expire
+field, if present, encodes the expiration period of the account or the
+password. For the availability and the exact meaning of these fields
+in your system, please consult your getpwnam(3) documentation and your
+F<pwd.h> file. You can also find out from within Perl what your
+$quota and $comment fields mean and whether you have the $expire field
+by using the C<Config> module and the values C<d_pwquota>, C<d_pwage>,
+C<d_pwchange>, C<d_pwcomment>, and C<d_pwexpire>. Shadow password
+files are only supported if your vendor has implemented them in the
+intuitive fashion that calling the regular C library routines gets the
+shadow versions if you're running under privilege or if there exists
+the shadow(3) functions as found in System V (this includes Solaris
+and Linux.) Those systems that implement a proprietary shadow password
+facility are unlikely to be supported.
+
+The $members value returned by I<getgr*()> is a space separated list of
+the login names of the members of the group.
+
+For the I<gethost*()> functions, if the C<h_errno> variable is supported in
+C, it will be returned to you via C<$?> if the function call fails. The
+C<@addrs> value returned by a successful call is a list of the raw
+addresses returned by the corresponding system library call. In the
+Internet domain, each address is four bytes long and you can unpack it
+by saying something like:
+
+ ($a,$b,$c,$d) = unpack('W4',$addr[0]);
+
+The Socket library makes this slightly easier:
+
+ use Socket;
+ $iaddr = inet_aton("127.1"); # or whatever address
+ $name = gethostbyaddr($iaddr, AF_INET);
+
+ # or going the other way
+ $straddr = inet_ntoa($iaddr);
+
+In the opposite way, to resolve a hostname to the IP address
+you can write this:
+
+ use Socket;
+ $packed_ip = gethostbyname("www.perl.org");
+ if (defined $packed_ip) {
+ $ip_address = inet_ntoa($packed_ip);
+ }
+
+Make sure <gethostbyname()> is called in SCALAR context and that
+its return value is checked for definedness.
+
+If you get tired of remembering which element of the return list
+contains which return value, by-name interfaces are provided
+in standard modules: C<File::stat>, C<Net::hostent>, C<Net::netent>,
+C<Net::protoent>, C<Net::servent>, C<Time::gmtime>, C<Time::localtime>,
+and C<User::grent>. These override the normal built-ins, supplying
+versions that return objects with the appropriate names
+for each field. For example:
+
+ use File::stat;
+ use User::pwent;
+ $is_his = (stat($filename)->uid == pwent($whoever)->uid);
+
+Even though it looks like they're the same method calls (uid),
+they aren't, because a C<File::stat> object is different from
+a C<User::pwent> object.
+
+=item getsockname SOCKET
+X<getsockname>
+
+Returns the packed sockaddr address of this end of the SOCKET connection,
+in case you don't know the address because you have several different
+IPs that the connection might have come in on.
+
+ use Socket;
+ $mysockaddr = getsockname(SOCK);
+ ($port, $myaddr) = sockaddr_in($mysockaddr);
+ printf "Connect to %s [%s]\n",
+ scalar gethostbyaddr($myaddr, AF_INET),
+ inet_ntoa($myaddr);
+
+=item getsockopt SOCKET,LEVEL,OPTNAME
+X<getsockopt>
+
+Queries the option named OPTNAME associated with SOCKET at a given LEVEL.
+Options may exist at multiple protocol levels depending on the socket
+type, but at least the uppermost socket level SOL_SOCKET (defined in the
+C<Socket> module) will exist. To query options at another level the
+protocol number of the appropriate protocol controlling the option
+should be supplied. For example, to indicate that an option is to be
+interpreted by the TCP protocol, LEVEL should be set to the protocol
+number of TCP, which you can get using getprotobyname.
+
+The call returns a packed string representing the requested socket option,
+or C<undef> if there is an error (the error reason will be in $!). What
+exactly is in the packed string depends in the LEVEL and OPTNAME, consult
+your system documentation for details. A very common case however is that
+the option is an integer, in which case the result will be a packed
+integer which you can decode using unpack with the C<i> (or C<I>) format.
+
+An example testing if Nagle's algorithm is turned on on a socket:
+
+ use Socket qw(:all);
+
+ defined(my $tcp = getprotobyname("tcp"))
+ or die "Could not determine the protocol number for tcp";
+ # my $tcp = IPPROTO_TCP; # Alternative
+ my $packed = getsockopt($socket, $tcp, TCP_NODELAY)
+ or die "Could not query TCP_NODELAY socket option: $!";
+ my $nodelay = unpack("I", $packed);
+ print "Nagle's algorithm is turned ", $nodelay ? "off\n" : "on\n";
+
+
+=item glob EXPR
+X<glob> X<wildcard> X<filename, expansion> X<expand>
+
+=item glob
+
+In list context, returns a (possibly empty) list of filename expansions on
+the value of EXPR such as the standard Unix shell F</bin/csh> would do. In
+scalar context, glob iterates through such filename expansions, returning
+undef when the list is exhausted. This is the internal function
+implementing the C<< <*.c> >> operator, but you can use it directly. If
+EXPR is omitted, C<$_> is used. The C<< <*.c> >> operator is discussed in
+more detail in L<perlop/"I/O Operators">.
+
+Note that C<glob> will split its arguments on whitespace, treating
+each segment as separate pattern. As such, C<glob('*.c *.h')> would
+match all files with a F<.c> or F<.h> extension. The expression
+C<glob('.* *')> would match all files in the current working directory.
+
+Beginning with v5.6.0, this operator is implemented using the standard
+C<File::Glob> extension. See L<File::Glob> for details, including
+C<bsd_glob> which does not treat whitespace as a pattern separator.
+
+=item gmtime EXPR
+X<gmtime> X<UTC> X<Greenwich>
+
+=item gmtime
+
+Works just like L<localtime> but the returned values are
+localized for the standard Greenwich time zone.
+
+Note: when called in list context, $isdst, the last value
+returned by gmtime is always C<0>. There is no
+Daylight Saving Time in GMT.
+
+See L<perlport/gmtime> for portability concerns.
+
+=item goto LABEL
+X<goto> X<jump> X<jmp>
+
+=item goto EXPR
+
+=item goto &NAME
+
+The C<goto-LABEL> form finds the statement labeled with LABEL and resumes
+execution there. It may not be used to go into any construct that
+requires initialization, such as a subroutine or a C<foreach> loop. It
+also can't be used to go into a construct that is optimized away,
+or to get out of a block or subroutine given to C<sort>.
+It can be used to go almost anywhere else within the dynamic scope,
+including out of subroutines, but it's usually better to use some other
+construct such as C<last> or C<die>. The author of Perl has never felt the
+need to use this form of C<goto> (in Perl, that is--C is another matter).
+(The difference being that C does not offer named loops combined with
+loop control. Perl does, and this replaces most structured uses of C<goto>
+in other languages.)
+
+The C<goto-EXPR> form expects a label name, whose scope will be resolved
+dynamically. This allows for computed C<goto>s per FORTRAN, but isn't
+necessarily recommended if you're optimizing for maintainability:
+
+ goto ("FOO", "BAR", "GLARCH")[$i];
+
+The C<goto-&NAME> form is quite different from the other forms of
+C<goto>. In fact, it isn't a goto in the normal sense at all, and
+doesn't have the stigma associated with other gotos. Instead, it
+exits the current subroutine (losing any changes set by local()) and
+immediately calls in its place the named subroutine using the current
+value of @_. This is used by C<AUTOLOAD> subroutines that wish to
+load another subroutine and then pretend that the other subroutine had
+been called in the first place (except that any modifications to C<@_>
+in the current subroutine are propagated to the other subroutine.)
+After the C<goto>, not even C<caller> will be able to tell that this
+routine was called first.
+
+NAME needn't be the name of a subroutine; it can be a scalar variable
+containing a code reference, or a block that evaluates to a code
+reference.
+
+=item grep BLOCK LIST
+X<grep>
+
+=item grep EXPR,LIST
+
+This is similar in spirit to, but not the same as, grep(1) and its
+relatives. In particular, it is not limited to using regular expressions.
+
+Evaluates the BLOCK or EXPR for each element of LIST (locally setting
+C<$_> to each element) and returns the list value consisting of those
+elements for which the expression evaluated to true. In scalar
+context, returns the number of times the expression was true.
+
+ @foo = grep(!/^#/, @bar); # weed out comments
+
+or equivalently,
+
+ @foo = grep {!/^#/} @bar; # weed out comments
+
+Note that C<$_> is an alias to the list value, so it can be used to
+modify the elements of the LIST. While this is useful and supported,
+it can cause bizarre results if the elements of LIST are not variables.
+Similarly, grep returns aliases into the original list, much as a for
+loop's index variable aliases the list elements. That is, modifying an
+element of a list returned by grep (for example, in a C<foreach>, C<map>
+or another C<grep>) actually modifies the element in the original list.
+This is usually something to be avoided when writing clear code.
+
+If C<$_> is lexical in the scope where the C<grep> appears (because it has
+been declared with C<my $_>) then, in addition to being locally aliased to
+the list elements, C<$_> keeps being lexical inside the block; i.e. it
+can't be seen from the outside, avoiding any potential side-effects.
+
+See also L</map> for a list composed of the results of the BLOCK or EXPR.
+
+=item hex EXPR
+X<hex> X<hexadecimal>
+
+=item hex
+
+Interprets EXPR as a hex string and returns the corresponding value.
+(To convert strings that might start with either C<0>, C<0x>, or C<0b>, see
+L</oct>.) If EXPR is omitted, uses C<$_>.
+
+ print hex '0xAf'; # prints '175'
+ print hex 'aF'; # same
+
+Hex strings may only represent integers. Strings that would cause
+integer overflow trigger a warning. Leading whitespace is not stripped,
+unlike oct(). To present something as hex, look into L</printf>,
+L</sprintf>, or L</unpack>.
+
+=item import LIST
+X<import>
+
+There is no builtin C<import> function. It is just an ordinary
+method (subroutine) defined (or inherited) by modules that wish to export
+names to another module. The C<use> function calls the C<import> method
+for the package used. See also L</use>, L<perlmod>, and L<Exporter>.
+
+=item index STR,SUBSTR,POSITION
+X<index> X<indexOf> X<InStr>
+
+=item index STR,SUBSTR
+
+The index function searches for one string within another, but without
+the wildcard-like behavior of a full regular-expression pattern match.
+It returns the position of the first occurrence of SUBSTR in STR at
+or after POSITION. If POSITION is omitted, starts searching from the
+beginning of the string. POSITION before the beginning of the string
+or after its end is treated as if it were the beginning or the end,
+respectively. POSITION and the return value are based at C<0> (or whatever
+you've set the C<$[> variable to--but don't do that). If the substring
+is not found, C<index> returns one less than the base, ordinarily C<-1>.
+
+=item int EXPR
+X<int> X<integer> X<truncate> X<trunc> X<floor>
+
+=item int
+
+Returns the integer portion of EXPR. If EXPR is omitted, uses C<$_>.
+You should not use this function for rounding: one because it truncates
+towards C<0>, and two because machine representations of floating point
+numbers can sometimes produce counterintuitive results. For example,
+C<int(-6.725/0.025)> produces -268 rather than the correct -269; that's
+because it's really more like -268.99999999999994315658 instead. Usually,
+the C<sprintf>, C<printf>, or the C<POSIX::floor> and C<POSIX::ceil>
+functions will serve you better than will int().
+
+=item ioctl FILEHANDLE,FUNCTION,SCALAR
+X<ioctl>
+
+Implements the ioctl(2) function. You'll probably first have to say
+
+ require "sys/ioctl.ph"; # probably in $Config{archlib}/sys/ioctl.ph
+
+to get the correct function definitions. If F<sys/ioctl.ph> doesn't
+exist or doesn't have the correct definitions you'll have to roll your
+own, based on your C header files such as F<< <sys/ioctl.h> >>.
+(There is a Perl script called B<h2ph> that comes with the Perl kit that
+may help you in this, but it's nontrivial.) SCALAR will be read and/or
+written depending on the FUNCTION--a pointer to the string value of SCALAR
+will be passed as the third argument of the actual C<ioctl> call. (If SCALAR
+has no string value but does have a numeric value, that value will be
+passed rather than a pointer to the string value. To guarantee this to be
+true, add a C<0> to the scalar before using it.) The C<pack> and C<unpack>
+functions may be needed to manipulate the values of structures used by
+C<ioctl>.
+
+The return value of C<ioctl> (and C<fcntl>) is as follows:
+
+ if OS returns: then Perl returns:
+ -1 undefined value
+ 0 string "0 but true"
+ anything else that number
+
+Thus Perl returns true on success and false on failure, yet you can
+still easily determine the actual value returned by the operating
+system:
+
+ $retval = ioctl(...) || -1;
+ printf "System returned %d\n", $retval;
+
+The special string C<"0 but true"> is exempt from B<-w> complaints
+about improper numeric conversions.
+
+=item join EXPR,LIST
+X<join>
+
+Joins the separate strings of LIST into a single string with fields
+separated by the value of EXPR, and returns that new string. Example:
+
+ $rec = join(':', $login,$passwd,$uid,$gid,$gcos,$home,$shell);
+
+Beware that unlike C<split>, C<join> doesn't take a pattern as its
+first argument. Compare L</split>.
+
+=item keys HASH
+X<keys> X<key>
+
+Returns a list consisting of all the keys of the named hash.
+(In scalar context, returns the number of keys.)
+
+The keys are returned in an apparently random order. The actual
+random order is subject to change in future versions of perl, but it
+is guaranteed to be the same order as either the C<values> or C<each>
+function produces (given that the hash has not been modified). Since
+Perl 5.8.1 the ordering is different even between different runs of
+Perl for security reasons (see L<perlsec/"Algorithmic Complexity
+Attacks">).
+
+As a side effect, calling keys() resets the HASH's internal iterator
+(see L</each>). In particular, calling keys() in void context resets
+the iterator with no other overhead.
+
+Here is yet another way to print your environment:
+
+ @keys = keys %ENV;
+ @values = values %ENV;
+ while (@keys) {
+ print pop(@keys), '=', pop(@values), "\n";
+ }
+
+or how about sorted by key:
+
+ foreach $key (sort(keys %ENV)) {
+ print $key, '=', $ENV{$key}, "\n";
+ }
+
+The returned values are copies of the original keys in the hash, so
+modifying them will not affect the original hash. Compare L</values>.
+
+To sort a hash by value, you'll need to use a C<sort> function.
+Here's a descending numeric sort of a hash by its values:
+
+ foreach $key (sort { $hash{$b} <=> $hash{$a} } keys %hash) {
+ printf "%4d %s\n", $hash{$key}, $key;
+ }
+
+As an lvalue C<keys> allows you to increase the number of hash buckets
+allocated for the given hash. This can gain you a measure of efficiency if
+you know the hash is going to get big. (This is similar to pre-extending
+an array by assigning a larger number to $#array.) If you say
+
+ keys %hash = 200;
+
+then C<%hash> will have at least 200 buckets allocated for it--256 of them,
+in fact, since it rounds up to the next power of two. These
+buckets will be retained even if you do C<%hash = ()>, use C<undef
+%hash> if you want to free the storage while C<%hash> is still in scope.
+You can't shrink the number of buckets allocated for the hash using
+C<keys> in this way (but you needn't worry about doing this by accident,
+as trying has no effect).
+
+See also C<each>, C<values> and C<sort>.
+
+=item kill SIGNAL, LIST
+X<kill> X<signal>
+
+Sends a signal to a list of processes. Returns the number of
+processes successfully signaled (which is not necessarily the
+same as the number actually killed).
+
+ $cnt = kill 1, $child1, $child2;
+ kill 9, @goners;
+
+If SIGNAL is zero, no signal is sent to the process, but the kill(2)
+system call will check whether it's possible to send a signal to it (that
+means, to be brief, that the process is owned by the same user, or we are
+the super-user). This is a useful way to check that a child process is
+alive (even if only as a zombie) and hasn't changed its UID. See
+L<perlport> for notes on the portability of this construct.
+
+Unlike in the shell, if SIGNAL is negative, it kills
+process groups instead of processes. (On System V, a negative I<PROCESS>
+number will also kill process groups, but that's not portable.) That
+means you usually want to use positive not negative signals. You may also
+use a signal name in quotes.
+
+See L<perlipc/"Signals"> for more details.
+
+=item last LABEL
+X<last> X<break>
+
+=item last
+
+The C<last> command is like the C<break> statement in C (as used in
+loops); it immediately exits the loop in question. If the LABEL is
+omitted, the command refers to the innermost enclosing loop. The
+C<continue> block, if any, is not executed:
+
+ LINE: while (<STDIN>) {
+ last LINE if /^$/; # exit when done with header
+ #...
+ }
+
+C<last> cannot be used to exit a block which returns a value such as
+C<eval {}>, C<sub {}> or C<do {}>, and should not be used to exit
+a grep() or map() operation.
+
+Note that a block by itself is semantically identical to a loop
+that executes once. Thus C<last> can be used to effect an early
+exit out of such a block.
+
+See also L</continue> for an illustration of how C<last>, C<next>, and
+C<redo> work.
+
+=item lc EXPR
+X<lc> X<lowercase>
+
+=item lc
+
+Returns a lowercased version of EXPR. This is the internal function
+implementing the C<\L> escape in double-quoted strings. Respects
+current LC_CTYPE locale if C<use locale> in force. See L<perllocale>
+and L<perlunicode> for more details about locale and Unicode support.
+
+If EXPR is omitted, uses C<$_>.
+
+=item lcfirst EXPR
+X<lcfirst> X<lowercase>
+
+=item lcfirst
+
+Returns the value of EXPR with the first character lowercased. This
+is the internal function implementing the C<\l> escape in
+double-quoted strings. Respects current LC_CTYPE locale if C<use
+locale> in force. See L<perllocale> and L<perlunicode> for more
+details about locale and Unicode support.
+
+If EXPR is omitted, uses C<$_>.
+
+=item length EXPR
+X<length> X<size>
+
+=item length
+
+Returns the length in I<characters> of the value of EXPR. If EXPR is
+omitted, returns length of C<$_>. Note that this cannot be used on
+an entire array or hash to find out how many elements these have.
+For that, use C<scalar @array> and C<scalar keys %hash> respectively.
+
+Note the I<characters>: if the EXPR is in Unicode, you will get the
+number of characters, not the number of bytes. To get the length
+of the internal string in bytes, use C<bytes::length(EXPR)>, see
+L<bytes>. Note that the internal encoding is variable, and the number
+of bytes usually meaningless. To get the number of bytes that the
+string would have when encoded as UTF-8, use
+C<length(Encoding::encode_utf8(EXPR))>.
+
+=item link OLDFILE,NEWFILE
+X<link>
+
+Creates a new filename linked to the old filename. Returns true for
+success, false otherwise.
+
+=item listen SOCKET,QUEUESIZE
+X<listen>
+
+Does the same thing that the listen system call does. Returns true if
+it succeeded, false otherwise. See the example in
+L<perlipc/"Sockets: Client/Server Communication">.
+
+=item local EXPR
+X<local>
+
+You really probably want to be using C<my> instead, because C<local> isn't
+what most people think of as "local". See
+L<perlsub/"Private Variables via my()"> for details.
+
+A local modifies the listed variables to be local to the enclosing
+block, file, or eval. If more than one value is listed, the list must
+be placed in parentheses. See L<perlsub/"Temporary Values via local()">
+for details, including issues with tied arrays and hashes.
+
+=item localtime EXPR
+X<localtime> X<ctime>
+
+=item localtime
+
+Converts a time as returned by the time function to a 9-element list
+with the time analyzed for the local time zone. Typically used as
+follows:
+
+ # 0 1 2 3 4 5 6 7 8
+ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+ localtime(time);
+
+All list elements are numeric, and come straight out of the C `struct
+tm'. C<$sec>, C<$min>, and C<$hour> are the seconds, minutes, and hours
+of the specified time.
+
+C<$mday> is the day of the month, and C<$mon> is the month itself, in
+the range C<0..11> with 0 indicating January and 11 indicating December.
+This makes it easy to get a month name from a list:
+
+ my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
+ print "$abbr[$mon] $mday";
+ # $mon=9, $mday=18 gives "Oct 18"
+
+C<$year> is the number of years since 1900, not just the last two digits
+of the year. That is, C<$year> is C<123> in year 2023. The proper way
+to get a complete 4-digit year is simply:
+
+ $year += 1900;
+
+Otherwise you create non-Y2K-compliant programs--and you wouldn't want
+to do that, would you?
+
+To get the last two digits of the year (e.g., '01' in 2001) do:
+
+ $year = sprintf("%02d", $year % 100);
+
+C<$wday> is the day of the week, with 0 indicating Sunday and 3 indicating
+Wednesday. C<$yday> is the day of the year, in the range C<0..364>
+(or C<0..365> in leap years.)
+
+C<$isdst> is true if the specified time occurs during Daylight Saving
+Time, false otherwise.
+
+If EXPR is omitted, C<localtime()> uses the current time (as returned
+by time(3)).
+
+In scalar context, C<localtime()> returns the ctime(3) value:
+
+ $now_string = localtime; # e.g., "Thu Oct 13 04:54:34 1994"
+
+This scalar value is B<not> locale dependent but is a Perl builtin. For GMT
+instead of local time use the L</gmtime> builtin. See also the
+C<Time::Local> module (to convert the second, minutes, hours, ... back to
+the integer value returned by time()), and the L<POSIX> module's strftime(3)
+and mktime(3) functions.
+
+To get somewhat similar but locale dependent date strings, set up your
+locale environment variables appropriately (please see L<perllocale>) and
+try for example:
+
+ use POSIX qw(strftime);
+ $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime;
+ # or for GMT formatted appropriately for your locale:
+ $now_string = strftime "%a %b %e %H:%M:%S %Y", gmtime;
+
+Note that the C<%a> and C<%b>, the short forms of the day of the week
+and the month of the year, may not necessarily be three characters wide.
+
+See L<perlport/localtime> for portability concerns.
+
+The L<Time::gmtime> and L<Time::localtime> modules provides a convenient,
+by-name access mechanism to the gmtime() and localtime() functions,
+respectively.
+
+For a comprehensive date and time representation look at the
+L<DateTime> module on CPAN.
+
+=item lock THING
+X<lock>
+
+This function places an advisory lock on a shared variable, or referenced
+object contained in I<THING> until the lock goes out of scope.
+
+lock() is a "weak keyword" : this means that if you've defined a function
+by this name (before any calls to it), that function will be called
+instead. (However, if you've said C<use threads>, lock() is always a
+keyword.) See L<threads>.
+
+=item log EXPR
+X<log> X<logarithm> X<e> X<ln> X<base>
+
+=item log
+
+Returns the natural logarithm (base I<e>) of EXPR. If EXPR is omitted,
+returns log of C<$_>. To get the log of another base, use basic algebra:
+The base-N log of a number is equal to the natural log of that number
+divided by the natural log of N. For example:
+
+ sub log10 {
+ my $n = shift;
+ return log($n)/log(10);
+ }
+
+See also L</exp> for the inverse operation.
+
+=item lstat EXPR
+X<lstat>
+
+=item lstat
+
+Does the same thing as the C<stat> function (including setting the
+special C<_> filehandle) but stats a symbolic link instead of the file
+the symbolic link points to. If symbolic links are unimplemented on
+your system, a normal C<stat> is done. For much more detailed
+information, please see the documentation for C<stat>.
+
+If EXPR is omitted, stats C<$_>.
+
+=item m//
+
+The match operator. See L<perlop/"Regexp Quote-Like Operators">.
+
+=item map BLOCK LIST
+X<map>
+
+=item map EXPR,LIST
+
+Evaluates the BLOCK or EXPR for each element of LIST (locally setting
+C<$_> to each element) and returns the list value composed of the
+results of each such evaluation. In scalar context, returns the
+total number of elements so generated. Evaluates BLOCK or EXPR in
+list context, so each element of LIST may produce zero, one, or
+more elements in the returned value.
+
+ @chars = map(chr, @nums);
+
+translates a list of numbers to the corresponding characters. And
+
+ %hash = map { get_a_key_for($_) => $_ } @array;
+
+is just a funny way to write
+
+ %hash = ();
+ foreach (@array) {
+ $hash{get_a_key_for($_)} = $_;
+ }
+
+Note that C<$_> is an alias to the list value, so it can be used to
+modify the elements of the LIST. While this is useful and supported,
+it can cause bizarre results if the elements of LIST are not variables.
+Using a regular C<foreach> loop for this purpose would be clearer in
+most cases. See also L</grep> for an array composed of those items of
+the original list for which the BLOCK or EXPR evaluates to true.
+
+If C<$_> is lexical in the scope where the C<map> appears (because it has
+been declared with C<my $_>), then, in addition to being locally aliased to
+the list elements, C<$_> keeps being lexical inside the block; that is, it
+can't be seen from the outside, avoiding any potential side-effects.
+
+C<{> starts both hash references and blocks, so C<map { ...> could be either
+the start of map BLOCK LIST or map EXPR, LIST. Because perl doesn't look
+ahead for the closing C<}> it has to take a guess at which its dealing with
+based what it finds just after the C<{>. Usually it gets it right, but if it
+doesn't it won't realize something is wrong until it gets to the C<}> and
+encounters the missing (or unexpected) comma. The syntax error will be
+reported close to the C<}> but you'll need to change something near the C<{>
+such as using a unary C<+> to give perl some help:
+
+ %hash = map { "\L$_", 1 } @array # perl guesses EXPR. wrong
+ %hash = map { +"\L$_", 1 } @array # perl guesses BLOCK. right
+ %hash = map { ("\L$_", 1) } @array # this also works
+ %hash = map { lc($_), 1 } @array # as does this.
+ %hash = map +( lc($_), 1 ), @array # this is EXPR and works!
+
+ %hash = map ( lc($_), 1 ), @array # evaluates to (1, @array)
+
+or to force an anon hash constructor use C<+{>:
+
+ @hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end
+
+and you get list of anonymous hashes each with only 1 entry.
+
+=item mkdir FILENAME,MASK
+X<mkdir> X<md> X<directory, create>
+
+=item mkdir FILENAME
+
+=item mkdir
+
+Creates the directory specified by FILENAME, with permissions
+specified by MASK (as modified by C<umask>). If it succeeds it
+returns true, otherwise it returns false and sets C<$!> (errno).
+If omitted, MASK defaults to 0777. If omitted, FILENAME defaults
+to C<$_>.
+
+In general, it is better to create directories with permissive MASK,
+and let the user modify that with their C<umask>, than it is to supply
+a restrictive MASK and give the user no way to be more permissive.
+The exceptions to this rule are when the file or directory should be
+kept private (mail files, for instance). The perlfunc(1) entry on
+C<umask> discusses the choice of MASK in more detail.
+
+Note that according to the POSIX 1003.1-1996 the FILENAME may have any
+number of trailing slashes. Some operating and filesystems do not get
+this right, so Perl automatically removes all trailing slashes to keep
+everyone happy.
+
+In order to recursively create a directory structure look at
+the C<mkpath> function of the L<File::Path> module.
+
+=item msgctl ID,CMD,ARG
+X<msgctl>
+
+Calls the System V IPC function msgctl(2). You'll probably have to say
+
+ use IPC::SysV;
+
+first to get the correct constant definitions. If CMD is C<IPC_STAT>,
+then ARG must be a variable that will hold the returned C<msqid_ds>
+structure. Returns like C<ioctl>: the undefined value for error,
+C<"0 but true"> for zero, or the actual return value otherwise. See also
+L<perlipc/"SysV IPC">, C<IPC::SysV>, and C<IPC::Semaphore> documentation.
+
+=item msgget KEY,FLAGS
+X<msgget>
+
+Calls the System V IPC function msgget(2). Returns the message queue
+id, or the undefined value if there is an error. See also
+L<perlipc/"SysV IPC"> and C<IPC::SysV> and C<IPC::Msg> documentation.
+
+=item msgrcv ID,VAR,SIZE,TYPE,FLAGS
+X<msgrcv>
+
+Calls the System V IPC function msgrcv to receive a message from
+message queue ID into variable VAR with a maximum message size of
+SIZE. Note that when a message is received, the message type as a
+native long integer will be the first thing in VAR, followed by the
+actual message. This packing may be opened with C<unpack("l! a*")>.
+Taints the variable. Returns true if successful, or false if there is
+an error. See also L<perlipc/"SysV IPC">, C<IPC::SysV>, and
+C<IPC::SysV::Msg> documentation.
+
+=item msgsnd ID,MSG,FLAGS
+X<msgsnd>
+
+Calls the System V IPC function msgsnd to send the message MSG to the
+message queue ID. MSG must begin with the native long integer message
+type, and be followed by the length of the actual message, and finally
+the message itself. This kind of packing can be achieved with
+C<pack("l! a*", $type, $message)>. Returns true if successful,
+or false if there is an error. See also C<IPC::SysV>
+and C<IPC::SysV::Msg> documentation.
+
+=item my EXPR
+X<my>
+
+=item my TYPE EXPR
+
+=item my EXPR : ATTRS
+
+=item my TYPE EXPR : ATTRS
+
+A C<my> declares the listed variables to be local (lexically) to the
+enclosing block, file, or C<eval>. If more than one value is listed,
+the list must be placed in parentheses.
+
+The exact semantics and interface of TYPE and ATTRS are still
+evolving. TYPE is currently bound to the use of C<fields> pragma,
+and attributes are handled using the C<attributes> pragma, or starting
+from Perl 5.8.0 also via the C<Attribute::Handlers> module. See
+L<perlsub/"Private Variables via my()"> for details, and L<fields>,
+L<attributes>, and L<Attribute::Handlers>.
+
+=item next LABEL
+X<next> X<continue>
+
+=item next
+
+The C<next> command is like the C<continue> statement in C; it starts
+the next iteration of the loop:
+
+ LINE: while (<STDIN>) {
+ next LINE if /^#/; # discard comments
+ #...
+ }
+
+Note that if there were a C<continue> block on the above, it would get
+executed even on discarded lines. If the LABEL is omitted, the command
+refers to the innermost enclosing loop.
+
+C<next> cannot be used to exit a block which returns a value such as
+C<eval {}>, C<sub {}> or C<do {}>, and should not be used to exit
+a grep() or map() operation.
+
+Note that a block by itself is semantically identical to a loop
+that executes once. Thus C<next> will exit such a block early.
+
+See also L</continue> for an illustration of how C<last>, C<next>, and
+C<redo> work.
+
+=item no Module VERSION LIST
+X<no>
+
+=item no Module VERSION
+
+=item no Module LIST
+
+=item no Module
+
+=item no VERSION
+
+See the C<use> function, of which C<no> is the opposite.
+
+=item oct EXPR
+X<oct> X<octal> X<hex> X<hexadecimal> X<binary> X<bin>
+
+=item oct
+
+Interprets EXPR as an octal string and returns the corresponding
+value. (If EXPR happens to start off with C<0x>, interprets it as a
+hex string. If EXPR starts off with C<0b>, it is interpreted as a
+binary string. Leading whitespace is ignored in all three cases.)
+The following will handle decimal, binary, octal, and hex in the standard
+Perl or C notation:
+
+ $val = oct($val) if $val =~ /^0/;
+
+If EXPR is omitted, uses C<$_>. To go the other way (produce a number
+in octal), use sprintf() or printf():
+
+ $perms = (stat("filename"))[2] & 07777;
+ $oct_perms = sprintf "%lo", $perms;
+
+The oct() function is commonly used when a string such as C<644> needs
+to be converted into a file mode, for example. (Although perl will
+automatically convert strings into numbers as needed, this automatic
+conversion assumes base 10.)
+
+=item open FILEHANDLE,EXPR
+X<open> X<pipe> X<file, open> X<fopen>
+
+=item open FILEHANDLE,MODE,EXPR
+
+=item open FILEHANDLE,MODE,EXPR,LIST
+
+=item open FILEHANDLE,MODE,REFERENCE
+
+=item open FILEHANDLE
+
+Opens the file whose filename is given by EXPR, and associates it with
+FILEHANDLE.
+
+Simple examples to open a file for reading:
+
+ open(my $fh, '<', "input.txt") or die $!;
+
+and for writing:
+
+ open(my $fh, '>', "output.txt") or die $!;
+
+(The following is a comprehensive reference to open(): for a gentler
+introduction you may consider L<perlopentut>.)
+
+If FILEHANDLE is an undefined scalar variable (or array or hash element)
+the variable is assigned a reference to a new anonymous filehandle,
+otherwise if FILEHANDLE is an expression, its value is used as the name of
+the real filehandle wanted. (This is considered a symbolic reference, so
+C<use strict 'refs'> should I<not> be in effect.)
+
+If EXPR is omitted, the scalar variable of the same name as the
+FILEHANDLE contains the filename. (Note that lexical variables--those
+declared with C<my>--will not work for this purpose; so if you're
+using C<my>, specify EXPR in your call to open.)
+
+If three or more arguments are specified then the mode of opening and
+the file name are separate. If MODE is C<< '<' >> or nothing, the file
+is opened for input. If MODE is C<< '>' >>, the file is truncated and
+opened for output, being created if necessary. If MODE is C<<< '>>' >>>,
+the file is opened for appending, again being created if necessary.
+
+You can put a C<'+'> in front of the C<< '>' >> or C<< '<' >> to
+indicate that you want both read and write access to the file; thus
+C<< '+<' >> is almost always preferred for read/write updates--the C<<
+'+>' >> mode would clobber the file first. You can't usually use
+either read-write mode for updating textfiles, since they have
+variable length records. See the B<-i> switch in L<perlrun> for a
+better approach. The file is created with permissions of C<0666>
+modified by the process' C<umask> value.
+
+These various prefixes correspond to the fopen(3) modes of C<'r'>,
+C<'r+'>, C<'w'>, C<'w+'>, C<'a'>, and C<'a+'>.
+
+In the 2-arguments (and 1-argument) form of the call the mode and
+filename should be concatenated (in this order), possibly separated by
+spaces. It is possible to omit the mode in these forms if the mode is
+C<< '<' >>.
+
+If the filename begins with C<'|'>, the filename is interpreted as a
+command to which output is to be piped, and if the filename ends with a
+C<'|'>, the filename is interpreted as a command which pipes output to
+us. See L<perlipc/"Using open() for IPC">
+for more examples of this. (You are not allowed to C<open> to a command
+that pipes both in I<and> out, but see L<IPC::Open2>, L<IPC::Open3>,
+and L<perlipc/"Bidirectional Communication with Another Process">
+for alternatives.)
+
+For three or more arguments if MODE is C<'|-'>, the filename is
+interpreted as a command to which output is to be piped, and if MODE
+is C<'-|'>, the filename is interpreted as a command which pipes
+output to us. In the 2-arguments (and 1-argument) form one should
+replace dash (C<'-'>) with the command.
+See L<perlipc/"Using open() for IPC"> for more examples of this.
+(You are not allowed to C<open> to a command that pipes both in I<and>
+out, but see L<IPC::Open2>, L<IPC::Open3>, and
+L<perlipc/"Bidirectional Communication"> for alternatives.)
+
+In the three-or-more argument form of pipe opens, if LIST is specified
+(extra arguments after the command name) then LIST becomes arguments
+to the command invoked if the platform supports it. The meaning of
+C<open> with more than three arguments for non-pipe modes is not yet
+specified. Experimental "layers" may give extra LIST arguments
+meaning.
+
+In the 2-arguments (and 1-argument) form opening C<'-'> opens STDIN
+and opening C<< '>-' >> opens STDOUT.
+
+You may use the three-argument form of open to specify IO "layers"
+(sometimes also referred to as "disciplines") to be applied to the handle
+that affect how the input and output are processed (see L<open> and
+L<PerlIO> for more details). For example
+
+ open(my $fh, "<:encoding(UTF-8)", "file")
+
+will open the UTF-8 encoded file containing Unicode characters,
+see L<perluniintro>. Note that if layers are specified in the
+three-arg form then default layers stored in ${^OPEN} (see L<perlvar>;
+usually set by the B<open> pragma or the switch B<-CioD>) are ignored.
+
+Open returns nonzero upon success, the undefined value otherwise. If
+the C<open> involved a pipe, the return value happens to be the pid of
+the subprocess.
+
+If you're running Perl on a system that distinguishes between text
+files and binary files, then you should check out L</binmode> for tips
+for dealing with this. The key distinction between systems that need
+C<binmode> and those that don't is their text file formats. Systems
+like Unix, Mac OS, and Plan 9, which delimit lines with a single
+character, and which encode that character in C as C<"\n">, do not
+need C<binmode>. The rest need it.
+
+When opening a file, it's usually a bad idea to continue normal execution
+if the request failed, so C<open> is frequently used in connection with
+C<die>. Even if C<die> won't do what you want (say, in a CGI script,
+where you want to make a nicely formatted error message (but there are
+modules that can help with that problem)) you should always check
+the return value from opening a file. The infrequent exception is when
+working with an unopened filehandle is actually what you want to do.
+
+As a special case the 3-arg form with a read/write mode and the third
+argument being C<undef>:
+
+ open(my $tmp, "+>", undef) or die ...
+
+opens a filehandle to an anonymous temporary file. Also using "+<"
+works for symmetry, but you really should consider writing something
+to the temporary file first. You will need to seek() to do the
+reading.
+
+Since v5.8.0, perl has built using PerlIO by default. Unless you've
+changed this (i.e. Configure -Uuseperlio), you can open file handles to
+"in memory" files held in Perl scalars via:
+
+ open($fh, '>', \$variable) || ..
+
+Though if you try to re-open C<STDOUT> or C<STDERR> as an "in memory"
+file, you have to close it first:
+
+ close STDOUT;
+ open STDOUT, '>', \$variable or die "Can't open STDOUT: $!";
+
+Examples:
+
+ $ARTICLE = 100;
+ open ARTICLE or die "Can't find article $ARTICLE: $!\n";
+ while (<ARTICLE>) {...
+
+ open(LOG, '>>/usr/spool/news/twitlog'); # (log is reserved)
+ # if the open fails, output is discarded
+
+ open(my $dbase, '+<', 'dbase.mine') # open for update
+ or die "Can't open 'dbase.mine' for update: $!";
+
+ open(my $dbase, '+<dbase.mine') # ditto
+ or die "Can't open 'dbase.mine' for update: $!";
+
+ open(ARTICLE, '-|', "caesar <$article") # decrypt article
+ or die "Can't start caesar: $!";
+
+ open(ARTICLE, "caesar <$article |") # ditto
+ or die "Can't start caesar: $!";
+
+ open(EXTRACT, "|sort >Tmp$$") # $$ is our process id
+ or die "Can't start sort: $!";
+
+ # in memory files
+ open(MEMORY,'>', \$var)
+ or die "Can't open memory file: $!";
+ print MEMORY "foo!\n"; # output will end up in $var
+
+ # process argument list of files along with any includes
+
+ foreach $file (@ARGV) {
+ process($file, 'fh00');
+ }
+
+ sub process {
+ my($filename, $input) = @_;
+ $input++; # this is a string increment
+ unless (open($input, $filename)) {
+ print STDERR "Can't open $filename: $!\n";
+ return;
+ }
+
+ local $_;
+ while (<$input>) { # note use of indirection
+ if (/^#include "(.*)"/) {
+ process($1, $input);
+ next;
+ }
+ #... # whatever
+ }
+ }
+
+See L<perliol> for detailed info on PerlIO.
+
+You may also, in the Bourne shell tradition, specify an EXPR beginning
+with C<< '>&' >>, in which case the rest of the string is interpreted
+as the name of a filehandle (or file descriptor, if numeric) to be
+duped (as C<dup(2)>) and opened. You may use C<&> after C<< > >>,
+C<<< >> >>>, C<< < >>, C<< +> >>, C<<< +>> >>>, and C<< +< >>.
+The mode you specify should match the mode of the original filehandle.
+(Duping a filehandle does not take into account any existing contents
+of IO buffers.) If you use the 3-arg form then you can pass either a
+number, the name of a filehandle or the normal "reference to a glob".
+
+Here is a script that saves, redirects, and restores C<STDOUT> and
+C<STDERR> using various methods:
+
+ #!/usr/bin/perl
+ open my $oldout, ">&STDOUT" or die "Can't dup STDOUT: $!";
+ open OLDERR, ">&", \*STDERR or die "Can't dup STDERR: $!";
+
+ open STDOUT, '>', "foo.out" or die "Can't redirect STDOUT: $!";
+ open STDERR, ">&STDOUT" or die "Can't dup STDOUT: $!";
+
+ select STDERR; $| = 1; # make unbuffered
+ select STDOUT; $| = 1; # make unbuffered
+
+ print STDOUT "stdout 1\n"; # this works for
+ print STDERR "stderr 1\n"; # subprocesses too
+
+ open STDOUT, ">&", $oldout or die "Can't dup \$oldout: $!";
+ open STDERR, ">&OLDERR" or die "Can't dup OLDERR: $!";
+
+ print STDOUT "stdout 2\n";
+ print STDERR "stderr 2\n";
+
+If you specify C<< '<&=X' >>, where C<X> is a file descriptor number
+or a filehandle, then Perl will do an equivalent of C's C<fdopen> of
+that file descriptor (and not call C<dup(2)>); this is more
+parsimonious of file descriptors. For example:
+
+ # open for input, reusing the fileno of $fd
+ open(FILEHANDLE, "<&=$fd")
+
+or
+
+ open(FILEHANDLE, "<&=", $fd)
+
+or
+
+ # open for append, using the fileno of OLDFH
+ open(FH, ">>&=", OLDFH)
+
+or
+
+ open(FH, ">>&=OLDFH")
+
+Being parsimonious on filehandles is also useful (besides being
+parsimonious) for example when something is dependent on file
+descriptors, like for example locking using flock(). If you do just
+C<< open(A, '>>&B') >>, the filehandle A will not have the same file
+descriptor as B, and therefore flock(A) will not flock(B), and vice
+versa. But with C<< open(A, '>>&=B') >> the filehandles will share
+the same file descriptor.
+
+Note that if you are using Perls older than 5.8.0, Perl will be using
+the standard C libraries' fdopen() to implement the "=" functionality.
+On many UNIX systems fdopen() fails when file descriptors exceed a
+certain value, typically 255. For Perls 5.8.0 and later, PerlIO is
+most often the default.
+
+You can see whether Perl has been compiled with PerlIO or not by
+running C<perl -V> and looking for C<useperlio=> line. If C<useperlio>
+is C<define>, you have PerlIO, otherwise you don't.
+
+If you open a pipe on the command C<'-'>, i.e., either C<'|-'> or C<'-|'>
+with 2-arguments (or 1-argument) form of open(), then
+there is an implicit fork done, and the return value of open is the pid
+of the child within the parent process, and C<0> within the child
+process. (Use C<defined($pid)> to determine whether the open was successful.)
+The filehandle behaves normally for the parent, but i/o to that
+filehandle is piped from/to the STDOUT/STDIN of the child process.
+In the child process the filehandle isn't opened--i/o happens from/to
+the new STDOUT or STDIN. Typically this is used like the normal
+piped open when you want to exercise more control over just how the
+pipe command gets executed, such as when you are running setuid, and
+don't want to have to scan shell commands for metacharacters.
+The following triples are more or less equivalent:
+
+ open(FOO, "|tr '[a-z]' '[A-Z]'");
+ open(FOO, '|-', "tr '[a-z]' '[A-Z]'");
+ open(FOO, '|-') || exec 'tr', '[a-z]', '[A-Z]';
+ open(FOO, '|-', "tr", '[a-z]', '[A-Z]');
+
+ open(FOO, "cat -n '$file'|");
+ open(FOO, '-|', "cat -n '$file'");
+ open(FOO, '-|') || exec 'cat', '-n', $file;
+ open(FOO, '-|', "cat", '-n', $file);
+
+The last example in each block shows the pipe as "list form", which is
+not yet supported on all platforms. A good rule of thumb is that if
+your platform has true C<fork()> (in other words, if your platform is
+UNIX) you can use the list form.
+
+See L<perlipc/"Safe Pipe Opens"> for more examples of this.
+
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before any operation that may do a fork, but this may not be
+supported on some platforms (see L<perlport>). To be safe, you may need
+to set C<$|> ($AUTOFLUSH in English) or call the C<autoflush()> method
+of C<IO::Handle> on any open handles.
+
+On systems that support a close-on-exec flag on files, the flag will
+be set for the newly opened file descriptor as determined by the value
+of $^F. See L<perlvar/$^F>.
+
+Closing any piped filehandle causes the parent process to wait for the
+child to finish, and returns the status value in C<$?> and
+C<${^CHILD_ERROR_NATIVE}>.
+
+The filename passed to 2-argument (or 1-argument) form of open() will
+have leading and trailing whitespace deleted, and the normal
+redirection characters honored. This property, known as "magic open",
+can often be used to good effect. A user could specify a filename of
+F<"rsh cat file |">, or you could change certain filenames as needed:
+
+ $filename =~ s/(.*\.gz)\s*$/gzip -dc < $1|/;
+ open(FH, $filename) or die "Can't open $filename: $!";
+
+Use 3-argument form to open a file with arbitrary weird characters in it,
+
+ open(FOO, '<', $file);
+
+otherwise it's necessary to protect any leading and trailing whitespace:
+
+ $file =~ s#^(\s)#./$1#;
+ open(FOO, "< $file\0");
+
+(this may not work on some bizarre filesystems). One should
+conscientiously choose between the I<magic> and 3-arguments form
+of open():
+
+ open IN, $ARGV[0];
+
+will allow the user to specify an argument of the form C<"rsh cat file |">,
+but will not work on a filename which happens to have a trailing space, while
+
+ open IN, '<', $ARGV[0];
+
+will have exactly the opposite restrictions.
+
+If you want a "real" C C<open> (see C<open(2)> on your system), then you
+should use the C<sysopen> function, which involves no such magic (but
+may use subtly different filemodes than Perl open(), which is mapped
+to C fopen()). This is
+another way to protect your filenames from interpretation. For example:
+
+ use IO::Handle;
+ sysopen(HANDLE, $path, O_RDWR|O_CREAT|O_EXCL)
+ or die "sysopen $path: $!";
+ $oldfh = select(HANDLE); $| = 1; select($oldfh);
+ print HANDLE "stuff $$\n";
+ seek(HANDLE, 0, 0);
+ print "File contains: ", <HANDLE>;
+
+Using the constructor from the C<IO::Handle> package (or one of its
+subclasses, such as C<IO::File> or C<IO::Socket>), you can generate anonymous
+filehandles that have the scope of whatever variables hold references to
+them, and automatically close whenever and however you leave that scope:
+
+ use IO::File;
+ #...
+ sub read_myfile_munged {
+ my $ALL = shift;
+ my $handle = IO::File->new;
+ open($handle, "myfile") or die "myfile: $!";
+ $first = <$handle>
+ or return (); # Automatically closed here.
+ mung $first or die "mung failed"; # Or here.
+ return $first, <$handle> if $ALL; # Or here.
+ $first; # Or here.
+ }
+
+See L</seek> for some details about mixing reading and writing.
+
+=item opendir DIRHANDLE,EXPR
+X<opendir>
+
+Opens a directory named EXPR for processing by C<readdir>, C<telldir>,
+C<seekdir>, C<rewinddir>, and C<closedir>. Returns true if successful.
+DIRHANDLE may be an expression whose value can be used as an indirect
+dirhandle, usually the real dirhandle name. If DIRHANDLE is an undefined
+scalar variable (or array or hash element), the variable is assigned a
+reference to a new anonymous dirhandle.
+DIRHANDLEs have their own namespace separate from FILEHANDLEs.
+
+See example at C<readdir>.
+
+=item ord EXPR
+X<ord> X<encoding>
+
+=item ord
+
+Returns the numeric (the native 8-bit encoding, like ASCII or EBCDIC,
+or Unicode) value of the first character of EXPR. If EXPR is omitted,
+uses C<$_>.
+
+For the reverse, see L</chr>.
+See L<perlunicode> for more about Unicode.
+
+=item our EXPR
+X<our> X<global>
+
+=item our TYPE EXPR
+
+=item our EXPR : ATTRS
+
+=item our TYPE EXPR : ATTRS
+
+C<our> associates a simple name with a package variable in the current
+package for use within the current scope. When C<use strict 'vars'> is in
+effect, C<our> lets you use declared global variables without qualifying
+them with package names, within the lexical scope of the C<our> declaration.
+In this way C<our> differs from C<use vars>, which is package scoped.
+
+Unlike C<my>, which both allocates storage for a variable and associates
+a simple name with that storage for use within the current scope, C<our>
+associates a simple name with a package variable in the current package,
+for use within the current scope. In other words, C<our> has the same
+scoping rules as C<my>, but does not necessarily create a
+variable.
+
+If more than one value is listed, the list must be placed
+in parentheses.
+
+ our $foo;
+ our($bar, $baz);
+
+An C<our> declaration declares a global variable that will be visible
+across its entire lexical scope, even across package boundaries. The
+package in which the variable is entered is determined at the point
+of the declaration, not at the point of use. This means the following
+behavior holds:
+
+ package Foo;
+ our $bar; # declares $Foo::bar for rest of lexical scope
+ $bar = 20;
+
+ package Bar;
+ print $bar; # prints 20, as it refers to $Foo::bar
+
+Multiple C<our> declarations with the same name in the same lexical
+scope are allowed if they are in different packages. If they happen
+to be in the same package, Perl will emit warnings if you have asked
+for them, just like multiple C<my> declarations. Unlike a second
+C<my> declaration, which will bind the name to a fresh variable, a
+second C<our> declaration in the same package, in the same scope, is
+merely redundant.
+
+ use warnings;
+ package Foo;
+ our $bar; # declares $Foo::bar for rest of lexical scope
+ $bar = 20;
+
+ package Bar;
+ our $bar = 30; # declares $Bar::bar for rest of lexical scope
+ print $bar; # prints 30
+
+ our $bar; # emits warning but has no other effect
+ print $bar; # still prints 30
+
+An C<our> declaration may also have a list of attributes associated
+with it.
+
+The exact semantics and interface of TYPE and ATTRS are still
+evolving. TYPE is currently bound to the use of C<fields> pragma,
+and attributes are handled using the C<attributes> pragma, or starting
+from Perl 5.8.0 also via the C<Attribute::Handlers> module. See
+L<perlsub/"Private Variables via my()"> for details, and L<fields>,
+L<attributes>, and L<Attribute::Handlers>.
+
+=item pack TEMPLATE,LIST
+X<pack>
+
+Takes a LIST of values and converts it into a string using the rules
+given by the TEMPLATE. The resulting string is the concatenation of
+the converted values. Typically, each converted value looks
+like its machine-level representation. For example, on 32-bit machines
+an integer may be represented by a sequence of 4 bytes that will be
+converted to a sequence of 4 characters.
+
+The TEMPLATE is a sequence of characters that give the order and type
+of values, as follows:
+
+ a A string with arbitrary binary data, will be null padded.
+ A A text (ASCII) string, will be space padded.
+ Z A null terminated (ASCIZ) string, will be null padded.
+
+ b A bit string (ascending bit order inside each byte, like vec()).
+ B A bit string (descending bit order inside each byte).
+ h A hex string (low nybble first).
+ H A hex string (high nybble first).
+
+ c A signed char (8-bit) value.
+ C An unsigned char (octet) value.
+ W An unsigned char value (can be greater than 255).
+
+ s A signed short (16-bit) value.
+ S An unsigned short value.
+
+ l A signed long (32-bit) value.
+ L An unsigned long value.
+
+ q A signed quad (64-bit) value.
+ Q An unsigned quad value.
+ (Quads are available only if your system supports 64-bit
+ integer values _and_ if Perl has been compiled to support those.
+ Causes a fatal error otherwise.)
+
+ i A signed integer value.
+ I A unsigned integer value.
+ (This 'integer' is _at_least_ 32 bits wide. Its exact
+ size depends on what a local C compiler calls 'int'.)
+
+ n An unsigned short (16-bit) in "network" (big-endian) order.
+ N An unsigned long (32-bit) in "network" (big-endian) order.
+ v An unsigned short (16-bit) in "VAX" (little-endian) order.
+ V An unsigned long (32-bit) in "VAX" (little-endian) order.
+
+ j A Perl internal signed integer value (IV).
+ J A Perl internal unsigned integer value (UV).
+
+ f A single-precision float in the native format.
+ d A double-precision float in the native format.
+
+ F A Perl internal floating point value (NV) in the native format
+ D A long double-precision float in the native format.
+ (Long doubles are available only if your system supports long
+ double values _and_ if Perl has been compiled to support those.
+ Causes a fatal error otherwise.)
+
+ p A pointer to a null-terminated string.
+ P A pointer to a structure (fixed-length string).
+
+ u A uuencoded string.
+ U A Unicode character number. Encodes to a character in character mode
+ and UTF-8 (or UTF-EBCDIC in EBCDIC platforms) in byte mode.
+
+ w A BER compressed integer (not an ASN.1 BER, see perlpacktut for
+ details). Its bytes represent an unsigned integer in base 128,
+ most significant digit first, with as few digits as possible. Bit
+ eight (the high bit) is set on each byte except the last.
+
+ x A null byte.
+ X Back up a byte.
+ @ Null fill or truncate to absolute position, counted from the
+ start of the innermost ()-group.
+ . Null fill or truncate to absolute position specified by value.
+ ( Start of a ()-group.
+
+One or more of the modifiers below may optionally follow some letters in the
+TEMPLATE (the second column lists the letters for which the modifier is
+valid):
+
+ ! sSlLiI Forces native (short, long, int) sizes instead
+ of fixed (16-/32-bit) sizes.
+
+ xX Make x and X act as alignment commands.
+
+ nNvV Treat integers as signed instead of unsigned.
+
+ @. Specify position as byte offset in the internal
+ representation of the packed string. Efficient but
+ dangerous.
+
+ > sSiIlLqQ Force big-endian byte-order on the type.
+ jJfFdDpP (The "big end" touches the construct.)
+
+ < sSiIlLqQ Force little-endian byte-order on the type.
+ jJfFdDpP (The "little end" touches the construct.)
+
+The C<E<gt>> and C<E<lt>> modifiers can also be used on C<()>-groups,
+in which case they force a certain byte-order on all components of
+that group, including subgroups.
+
+The following rules apply:
+
+=over 8
+
+=item *
+
+Each letter may optionally be followed by a number giving a repeat
+count. With all types except C<a>, C<A>, C<Z>, C<b>, C<B>, C<h>,
+C<H>, C<@>, C<.>, C<x>, C<X> and C<P> the pack function will gobble up
+that many values from the LIST. A C<*> for the repeat count means to
+use however many items are left, except for C<@>, C<x>, C<X>, where it
+is equivalent to C<0>, for <.> where it means relative to string start
+and C<u>, where it is equivalent to 1 (or 45, which is the same).
+A numeric repeat count may optionally be enclosed in brackets, as in
+C<pack 'C[80]', @arr>.
+
+One can replace the numeric repeat count by a template enclosed in brackets;
+then the packed length of this template in bytes is used as a count.
+For example, C<x[L]> skips a long (it skips the number of bytes in a long);
+the template C<$t X[$t] $t> unpack()s twice what $t unpacks.
+If the template in brackets contains alignment commands (such as C<x![d]>),
+its packed length is calculated as if the start of the template has the maximal
+possible alignment.
+
+When used with C<Z>, C<*> results in the addition of a trailing null
+byte (so the packed result will be one longer than the byte C<length>
+of the item).
+
+When used with C<@>, the repeat count represents an offset from the start
+of the innermost () group.
+
+When used with C<.>, the repeat count is used to determine the starting
+position from where the value offset is calculated. If the repeat count
+is 0, it's relative to the current position. If the repeat count is C<*>,
+the offset is relative to the start of the packed string. And if its an
+integer C<n> the offset is relative to the start of the n-th innermost
+() group (or the start of the string if C<n> is bigger then the group
+level).
+
+The repeat count for C<u> is interpreted as the maximal number of bytes
+to encode per line of output, with 0, 1 and 2 replaced by 45. The repeat
+count should not be more than 65.
+
+=item *
+
+The C<a>, C<A>, and C<Z> types gobble just one value, but pack it as a
+string of length count, padding with nulls or spaces as necessary. When
+unpacking, C<A> strips trailing whitespace and nulls, C<Z> strips everything
+after the first null, and C<a> returns data verbatim.
+
+If the value-to-pack is too long, it is truncated. If too long and an
+explicit count is provided, C<Z> packs only C<$count-1> bytes, followed
+by a null byte. Thus C<Z> always packs a trailing null (except when the
+count is 0).
+
+=item *
+
+Likewise, the C<b> and C<B> fields pack a string that many bits long.
+Each character of the input field of pack() generates 1 bit of the result.
+Each result bit is based on the least-significant bit of the corresponding
+input character, i.e., on C<ord($char)%2>. In particular, characters C<"0">
+and C<"1"> generate bits 0 and 1, as do characters C<"\0"> and C<"\1">.
+
+Starting from the beginning of the input string of pack(), each 8-tuple
+of characters is converted to 1 character of output. With format C<b>
+the first character of the 8-tuple determines the least-significant bit of a
+character, and with format C<B> it determines the most-significant bit of
+a character.
+
+If the length of the input string is not exactly divisible by 8, the
+remainder is packed as if the input string were padded by null characters
+at the end. Similarly, during unpack()ing the "extra" bits are ignored.
+
+If the input string of pack() is longer than needed, extra characters are
+ignored. A C<*> for the repeat count of pack() means to use all the
+characters of the input field. On unpack()ing the bits are converted to a
+string of C<"0">s and C<"1">s.
+
+=item *
+
+The C<h> and C<H> fields pack a string that many nybbles (4-bit groups,
+representable as hexadecimal digits, 0-9a-f) long.
+
+Each character of the input field of pack() generates 4 bits of the result.
+For non-alphabetical characters the result is based on the 4 least-significant
+bits of the input character, i.e., on C<ord($char)%16>. In particular,
+characters C<"0"> and C<"1"> generate nybbles 0 and 1, as do bytes
+C<"\0"> and C<"\1">. For characters C<"a".."f"> and C<"A".."F"> the result
+is compatible with the usual hexadecimal digits, so that C<"a"> and
+C<"A"> both generate the nybble C<0xa==10>. The result for characters
+C<"g".."z"> and C<"G".."Z"> is not well-defined.
+
+Starting from the beginning of the input string of pack(), each pair
+of characters is converted to 1 character of output. With format C<h> the
+first character of the pair determines the least-significant nybble of the
+output character, and with format C<H> it determines the most-significant
+nybble.
+
+If the length of the input string is not even, it behaves as if padded
+by a null character at the end. Similarly, during unpack()ing the "extra"
+nybbles are ignored.
+
+If the input string of pack() is longer than needed, extra characters are
+ignored.
+A C<*> for the repeat count of pack() means to use all the characters of
+the input field. On unpack()ing the nybbles are converted to a string
+of hexadecimal digits.
+
+=item *
+
+The C<p> type packs a pointer to a null-terminated string. You are
+responsible for ensuring the string is not a temporary value (which can
+potentially get deallocated before you get around to using the packed result).
+The C<P> type packs a pointer to a structure of the size indicated by the
+length. A NULL pointer is created if the corresponding value for C<p> or
+C<P> is C<undef>, similarly for unpack().
+
+If your system has a strange pointer size (i.e. a pointer is neither as
+big as an int nor as big as a long), it may not be possible to pack or
+unpack pointers in big- or little-endian byte order. Attempting to do
+so will result in a fatal error.
+
+=item *
+
+The C</> template character allows packing and unpacking of a sequence of
+items where the packed structure contains a packed item count followed by
+the packed items themselves.
+
+For C<pack> you write I<length-item>C</>I<sequence-item> and the
+I<length-item> describes how the length value is packed. The ones likely
+to be of most use are integer-packing ones like C<n> (for Java strings),
+C<w> (for ASN.1 or SNMP) and C<N> (for Sun XDR).
+
+For C<pack>, the I<sequence-item> may have a repeat count, in which case
+the minimum of that and the number of available items is used as argument
+for the I<length-item>. If it has no repeat count or uses a '*', the number
+of available items is used.
+
+For C<unpack> an internal stack of integer arguments unpacked so far is
+used. You write C</>I<sequence-item> and the repeat count is obtained by
+popping off the last element from the stack. The I<sequence-item> must not
+have a repeat count.
+
+If the I<sequence-item> refers to a string type (C<"A">, C<"a"> or C<"Z">),
+the I<length-item> is a string length, not a number of strings. If there is
+an explicit repeat count for pack, the packed string will be adjusted to that
+given length.
+
+ unpack 'W/a', "\04Gurusamy"; gives ('Guru')
+ unpack 'a3/A A*', '007 Bond J '; gives (' Bond', 'J')
+ unpack 'a3 x2 /A A*', '007: Bond, J.'; gives ('Bond, J', '.')
+ pack 'n/a* w/a','hello,','world'; gives "\000\006hello,\005world"
+ pack 'a/W2', ord('a') .. ord('z'); gives '2ab'
+
+The I<length-item> is not returned explicitly from C<unpack>.
+
+Adding a count to the I<length-item> letter is unlikely to do anything
+useful, unless that letter is C<A>, C<a> or C<Z>. Packing with a
+I<length-item> of C<a> or C<Z> may introduce C<"\000"> characters,
+which Perl does not regard as legal in numeric strings.
+
+=item *
+
+The integer types C<s>, C<S>, C<l>, and C<L> may be
+followed by a C<!> modifier to signify native shorts or
+longs--as you can see from above for example a bare C<l> does mean
+exactly 32 bits, the native C<long> (as seen by the local C compiler)
+may be larger. This is an issue mainly in 64-bit platforms. You can
+see whether using C<!> makes any difference by
+
+ print length(pack("s")), " ", length(pack("s!")), "\n";
+ print length(pack("l")), " ", length(pack("l!")), "\n";
+
+C<i!> and C<I!> also work but only because of completeness;
+they are identical to C<i> and C<I>.
+
+The actual sizes (in bytes) of native shorts, ints, longs, and long
+longs on the platform where Perl was built are also available via
+L<Config>:
+
+ use Config;
+ print $Config{shortsize}, "\n";
+ print $Config{intsize}, "\n";
+ print $Config{longsize}, "\n";
+ print $Config{longlongsize}, "\n";
+
+(The C<$Config{longlongsize}> will be undefined if your system does
+not support long longs.)
+
+=item *
+
+The integer formats C<s>, C<S>, C<i>, C<I>, C<l>, C<L>, C<j>, and C<J>
+are inherently non-portable between processors and operating systems
+because they obey the native byteorder and endianness. For example a
+4-byte integer 0x12345678 (305419896 decimal) would be ordered natively
+(arranged in and handled by the CPU registers) into bytes as
+
+ 0x12 0x34 0x56 0x78 # big-endian
+ 0x78 0x56 0x34 0x12 # little-endian
+
+Basically, the Intel and VAX CPUs are little-endian, while everybody
+else, for example Motorola m68k/88k, PPC, Sparc, HP PA, Power, and
+Cray are big-endian. Alpha and MIPS can be either: Digital/Compaq
+used/uses them in little-endian mode; SGI/Cray uses them in big-endian
+mode.
+
+The names `big-endian' and `little-endian' are comic references to
+the classic "Gulliver's Travels" (via the paper "On Holy Wars and a
+Plea for Peace" by Danny Cohen, USC/ISI IEN 137, April 1, 1980) and
+the egg-eating habits of the Lilliputians.
+
+Some systems may have even weirder byte orders such as
+
+ 0x56 0x78 0x12 0x34
+ 0x34 0x12 0x78 0x56
+
+You can see your system's preference with
+
+ print join(" ", map { sprintf "%#02x", $_ }
+ unpack("W*",pack("L",0x12345678))), "\n";
+
+The byteorder on the platform where Perl was built is also available
+via L<Config>:
+
+ use Config;
+ print $Config{byteorder}, "\n";
+
+Byteorders C<'1234'> and C<'12345678'> are little-endian, C<'4321'>
+and C<'87654321'> are big-endian.
+
+If you want portable packed integers you can either use the formats
+C<n>, C<N>, C<v>, and C<V>, or you can use the C<E<gt>> and C<E<lt>>
+modifiers. These modifiers are only available as of perl 5.9.2.
+See also L<perlport>.
+
+=item *
+
+All integer and floating point formats as well as C<p> and C<P> and
+C<()>-groups may be followed by the C<E<gt>> or C<E<lt>> modifiers
+to force big- or little- endian byte-order, respectively.
+This is especially useful, since C<n>, C<N>, C<v> and C<V> don't cover
+signed integers, 64-bit integers and floating point values. However,
+there are some things to keep in mind.
+
+Exchanging signed integers between different platforms only works
+if all platforms store them in the same format. Most platforms store
+signed integers in two's complement, so usually this is not an issue.
+
+The C<E<gt>> or C<E<lt>> modifiers can only be used on floating point
+formats on big- or little-endian machines. Otherwise, attempting to
+do so will result in a fatal error.
+
+Forcing big- or little-endian byte-order on floating point values for
+data exchange can only work if all platforms are using the same
+binary representation (e.g. IEEE floating point format). Even if all
+platforms are using IEEE, there may be subtle differences. Being able
+to use C<E<gt>> or C<E<lt>> on floating point values can be very useful,
+but also very dangerous if you don't know exactly what you're doing.
+It is definitely not a general way to portably store floating point
+values.
+
+When using C<E<gt>> or C<E<lt>> on an C<()>-group, this will affect
+all types inside the group that accept the byte-order modifiers,
+including all subgroups. It will silently be ignored for all other
+types. You are not allowed to override the byte-order within a group
+that already has a byte-order modifier suffix.
+
+=item *
+
+Real numbers (floats and doubles) are in the native machine format only;
+due to the multiplicity of floating formats around, and the lack of a
+standard "network" representation, no facility for interchange has been
+made. This means that packed floating point data written on one machine
+may not be readable on another - even if both use IEEE floating point
+arithmetic (as the endian-ness of the memory representation is not part
+of the IEEE spec). See also L<perlport>.
+
+If you know exactly what you're doing, you can use the C<E<gt>> or C<E<lt>>
+modifiers to force big- or little-endian byte-order on floating point values.
+
+Note that Perl uses doubles (or long doubles, if configured) internally for
+all numeric calculation, and converting from double into float and thence back
+to double again will lose precision (i.e., C<unpack("f", pack("f", $foo)>)
+will not in general equal $foo).
+
+=item *
+
+Pack and unpack can operate in two modes, character mode (C<C0> mode) where
+the packed string is processed per character and UTF-8 mode (C<U0> mode)
+where the packed string is processed in its UTF-8-encoded Unicode form on
+a byte by byte basis. Character mode is the default unless the format string
+starts with an C<U>. You can switch mode at any moment with an explicit
+C<C0> or C<U0> in the format. A mode is in effect until the next mode switch
+or until the end of the ()-group in which it was entered.
+
+=item *
+
+You must yourself do any alignment or padding by inserting for example
+enough C<'x'>es while packing. There is no way to pack() and unpack()
+could know where the characters are going to or coming from. Therefore
+C<pack> (and C<unpack>) handle their output and input as flat
+sequences of characters.
+
+=item *
+
+A ()-group is a sub-TEMPLATE enclosed in parentheses. A group may
+take a repeat count, both as postfix, and for unpack() also via the C</>
+template character. Within each repetition of a group, positioning with
+C<@> starts again at 0. Therefore, the result of
+
+ pack( '@1A((@2A)@3A)', 'a', 'b', 'c' )
+
+is the string "\0a\0\0bc".
+
+=item *
+
+C<x> and C<X> accept C<!> modifier. In this case they act as
+alignment commands: they jump forward/back to the closest position
+aligned at a multiple of C<count> characters. For example, to pack() or
+unpack() C's C<struct {char c; double d; char cc[2]}> one may need to
+use the template C<W x![d] d W[2]>; this assumes that doubles must be
+aligned on the double's size.
+
+For alignment commands C<count> of 0 is equivalent to C<count> of 1;
+both result in no-ops.
+
+=item *
+
+C<n>, C<N>, C<v> and C<V> accept the C<!> modifier. In this case they
+will represent signed 16-/32-bit integers in big-/little-endian order.
+This is only portable if all platforms sharing the packed data use the
+same binary representation for signed integers (e.g. all platforms are
+using two's complement representation).
+
+=item *
+
+A comment in a TEMPLATE starts with C<#> and goes to the end of line.
+White space may be used to separate pack codes from each other, but
+modifiers and a repeat count must follow immediately.
+
+=item *
+
+If TEMPLATE requires more arguments to pack() than actually given, pack()
+assumes additional C<""> arguments. If TEMPLATE requires fewer arguments
+to pack() than actually given, extra arguments are ignored.
+
+=back
+
+Examples:
+
+ $foo = pack("WWWW",65,66,67,68);
+ # foo eq "ABCD"
+ $foo = pack("W4",65,66,67,68);
+ # same thing
+ $foo = pack("W4",0x24b6,0x24b7,0x24b8,0x24b9);
+ # same thing with Unicode circled letters.
+ $foo = pack("U4",0x24b6,0x24b7,0x24b8,0x24b9);
+ # same thing with Unicode circled letters. You don't get the UTF-8
+ # bytes because the U at the start of the format caused a switch to
+ # U0-mode, so the UTF-8 bytes get joined into characters
+ $foo = pack("C0U4",0x24b6,0x24b7,0x24b8,0x24b9);
+ # foo eq "\xe2\x92\xb6\xe2\x92\xb7\xe2\x92\xb8\xe2\x92\xb9"
+ # This is the UTF-8 encoding of the string in the previous example
+
+ $foo = pack("ccxxcc",65,66,67,68);
+ # foo eq "AB\0\0CD"
+
+ # note: the above examples featuring "W" and "c" are true
+ # only on ASCII and ASCII-derived systems such as ISO Latin 1
+ # and UTF-8. In EBCDIC the first example would be
+ # $foo = pack("WWWW",193,194,195,196);
+
+ $foo = pack("s2",1,2);
+ # "\1\0\2\0" on little-endian
+ # "\0\1\0\2" on big-endian
+
+ $foo = pack("a4","abcd","x","y","z");
+ # "abcd"
+
+ $foo = pack("aaaa","abcd","x","y","z");
+ # "axyz"
+
+ $foo = pack("a14","abcdefg");
+ # "abcdefg\0\0\0\0\0\0\0"
+
+ $foo = pack("i9pl", gmtime);
+ # a real struct tm (on my system anyway)
+
+ $utmp_template = "Z8 Z8 Z16 L";
+ $utmp = pack($utmp_template, @utmp1);
+ # a struct utmp (BSDish)
+
+ @utmp2 = unpack($utmp_template, $utmp);
+ # "@utmp1" eq "@utmp2"
+
+ sub bintodec {
+ unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
+ }
+
+ $foo = pack('sx2l', 12, 34);
+ # short 12, two zero bytes padding, long 34
+ $bar = pack('s@4l', 12, 34);
+ # short 12, zero fill to position 4, long 34
+ # $foo eq $bar
+ $baz = pack('s.l', 12, 4, 34);
+ # short 12, zero fill to position 4, long 34
+
+ $foo = pack('nN', 42, 4711);
+ # pack big-endian 16- and 32-bit unsigned integers
+ $foo = pack('S>L>', 42, 4711);
+ # exactly the same
+ $foo = pack('s<l<', -42, 4711);
+ # pack little-endian 16- and 32-bit signed integers
+ $foo = pack('(sl)<', -42, 4711);
+ # exactly the same
+
+The same template may generally also be used in unpack().
+
+=item package NAMESPACE
+X<package> X<module> X<namespace>
+
+=item package
+
+Declares the compilation unit as being in the given namespace. The scope
+of the package declaration is from the declaration itself through the end
+of the enclosing block, file, or eval (the same as the C<my> operator).
+All further unqualified dynamic identifiers will be in this namespace.
+A package statement affects only dynamic variables--including those
+you've used C<local> on--but I<not> lexical variables, which are created
+with C<my>. Typically it would be the first declaration in a file to
+be included by the C<require> or C<use> operator. You can switch into a
+package in more than one place; it merely influences which symbol table
+is used by the compiler for the rest of that block. You can refer to
+variables and filehandles in other packages by prefixing the identifier
+with the package name and a double colon: C<$Package::Variable>.
+If the package name is null, the C<main> package as assumed. That is,
+C<$::sail> is equivalent to C<$main::sail> (as well as to C<$main'sail>,
+still seen in older code).
+
+See L<perlmod/"Packages"> for more information about packages, modules,
+and classes. See L<perlsub> for other scoping issues.
+
+=item pipe READHANDLE,WRITEHANDLE
+X<pipe>
+
+Opens a pair of connected pipes like the corresponding system call.
+Note that if you set up a loop of piped processes, deadlock can occur
+unless you are very careful. In addition, note that Perl's pipes use
+IO buffering, so you may need to set C<$|> to flush your WRITEHANDLE
+after each command, depending on the application.
+
+See L<IPC::Open2>, L<IPC::Open3>, and L<perlipc/"Bidirectional Communication">
+for examples of such things.
+
+On systems that support a close-on-exec flag on files, the flag will be set
+for the newly opened file descriptors as determined by the value of $^F.
+See L<perlvar/$^F>.
+
+=item pop ARRAY
+X<pop> X<stack>
+
+=item pop
+
+Pops and returns the last value of the array, shortening the array by
+one element.
+
+If there are no elements in the array, returns the undefined value
+(although this may happen at other times as well). If ARRAY is
+omitted, pops the C<@ARGV> array in the main program, and the C<@_>
+array in subroutines, just like C<shift>.
+
+=item pos SCALAR
+X<pos> X<match, position>
+
+=item pos
+
+Returns the offset of where the last C<m//g> search left off for the variable
+in question (C<$_> is used when the variable is not specified). Note that
+0 is a valid match offset. C<undef> indicates that the search position
+is reset (usually due to match failure, but can also be because no match has
+yet been performed on the scalar). C<pos> directly accesses the location used
+by the regexp engine to store the offset, so assigning to C<pos> will change
+that offset, and so will also influence the C<\G> zero-width assertion in
+regular expressions. Because a failed C<m//gc> match doesn't reset the offset,
+the return from C<pos> won't change either in this case. See L<perlre> and
+L<perlop>.
+
+=item print FILEHANDLE LIST
+X<print>
+
+=item print LIST
+
+=item print
+
+Prints a string or a list of strings. Returns true if successful.
+FILEHANDLE may be a scalar variable name, in which case the variable
+contains the name of or a reference to the filehandle, thus introducing
+one level of indirection. (NOTE: If FILEHANDLE is a variable and
+the next token is a term, it may be misinterpreted as an operator
+unless you interpose a C<+> or put parentheses around the arguments.)
+If FILEHANDLE is omitted, prints by default to standard output (or
+to the last selected output channel--see L</select>). If LIST is
+also omitted, prints C<$_> to the currently selected output channel.
+To set the default output channel to something other than STDOUT
+use the select operation. The current value of C<$,> (if any) is
+printed between each LIST item. The current value of C<$\> (if
+any) is printed after the entire LIST has been printed. Because
+print takes a LIST, anything in the LIST is evaluated in list
+context, and any subroutine that you call will have one or more of
+its expressions evaluated in list context. Also be careful not to
+follow the print keyword with a left parenthesis unless you want
+the corresponding right parenthesis to terminate the arguments to
+the print--interpose a C<+> or put parentheses around all the
+arguments.
+
+Note that if you're storing FILEHANDLEs in an array, or if you're using
+any other expression more complex than a scalar variable to retrieve it,
+you will have to use a block returning the filehandle value instead:
+
+ print { $files[$i] } "stuff\n";
+ print { $OK ? STDOUT : STDERR } "stuff\n";
+
+=item printf FILEHANDLE FORMAT, LIST
+X<printf>
+
+=item printf FORMAT, LIST
+
+Equivalent to C<print FILEHANDLE sprintf(FORMAT, LIST)>, except that C<$\>
+(the output record separator) is not appended. The first argument
+of the list will be interpreted as the C<printf> format. See C<sprintf>
+for an explanation of the format argument. If C<use locale> is in effect,
+and POSIX::setlocale() has been called, the character used for the decimal
+separator in formatted floating point numbers is affected by the LC_NUMERIC
+locale. See L<perllocale> and L<POSIX>.
+
+Don't fall into the trap of using a C<printf> when a simple
+C<print> would do. The C<print> is more efficient and less
+error prone.
+
+=item prototype FUNCTION
+X<prototype>
+
+Returns the prototype of a function as a string (or C<undef> if the
+function has no prototype). FUNCTION is a reference to, or the name of,
+the function whose prototype you want to retrieve.
+
+If FUNCTION is a string starting with C<CORE::>, the rest is taken as a
+name for Perl builtin. If the builtin is not I<overridable> (such as
+C<qw//>) or if its arguments cannot be adequately expressed by a prototype
+(such as C<system>), prototype() returns C<undef>, because the builtin
+does not really behave like a Perl function. Otherwise, the string
+describing the equivalent prototype is returned.
+
+=item push ARRAY,LIST
+X<push> X<stack>
+
+Treats ARRAY as a stack, and pushes the values of LIST
+onto the end of ARRAY. The length of ARRAY increases by the length of
+LIST. Has the same effect as
+
+ for $value (LIST) {
+ $ARRAY[++$#ARRAY] = $value;
+ }
+
+but is more efficient. Returns the number of elements in the array following
+the completed C<push>.
+
+=item q/STRING/
+
+=item qq/STRING/
+
+=item qx/STRING/
+
+=item qw/STRING/
+
+Generalized quotes. See L<perlop/"Quote-Like Operators">.
+
+=item qr/STRING/
+
+Regexp-like quote. See L<perlop/"Regexp Quote-Like Operators">.
+
+=item quotemeta EXPR
+X<quotemeta> X<metacharacter>
+
+=item quotemeta
+
+Returns the value of EXPR with all non-"word"
+characters backslashed. (That is, all characters not matching
+C</[A-Za-z_0-9]/> will be preceded by a backslash in the
+returned string, regardless of any locale settings.)
+This is the internal function implementing
+the C<\Q> escape in double-quoted strings.
+
+If EXPR is omitted, uses C<$_>.
+
+=item rand EXPR
+X<rand> X<random>
+
+=item rand
+
+Returns a random fractional number greater than or equal to C<0> and less
+than the value of EXPR. (EXPR should be positive.) If EXPR is
+omitted, the value C<1> is used. Currently EXPR with the value C<0> is
+also special-cased as C<1> - this has not been documented before perl 5.8.0
+and is subject to change in future versions of perl. Automatically calls
+C<srand> unless C<srand> has already been called. See also C<srand>.
+
+Apply C<int()> to the value returned by C<rand()> if you want random
+integers instead of random fractional numbers. For example,
+
+ int(rand(10))
+
+returns a random integer between C<0> and C<9>, inclusive.
+
+(Note: If your rand function consistently returns numbers that are too
+large or too small, then your version of Perl was probably compiled
+with the wrong number of RANDBITS.)
+
+=item read FILEHANDLE,SCALAR,LENGTH,OFFSET
+X<read> X<file, read>
+
+=item read FILEHANDLE,SCALAR,LENGTH
+
+Attempts to read LENGTH I<characters> of data into variable SCALAR
+from the specified FILEHANDLE. Returns the number of characters
+actually read, C<0> at end of file, or undef if there was an error (in
+the latter case C<$!> is also set). SCALAR will be grown or shrunk
+so that the last character actually read is the last character of the
+scalar after the read.
+
+An OFFSET may be specified to place the read data at some place in the
+string other than the beginning. A negative OFFSET specifies
+placement at that many characters counting backwards from the end of
+the string. A positive OFFSET greater than the length of SCALAR
+results in the string being padded to the required size with C<"\0">
+bytes before the result of the read is appended.
+
+The call is actually implemented in terms of either Perl's or system's
+fread() call. To get a true read(2) system call, see C<sysread>.
+
+Note the I<characters>: depending on the status of the filehandle,
+either (8-bit) bytes or characters are read. By default all
+filehandles operate on bytes, but for example if the filehandle has
+been opened with the C<:utf8> I/O layer (see L</open>, and the C<open>
+pragma, L<open>), the I/O will operate on UTF-8 encoded Unicode
+characters, not bytes. Similarly for the C<:encoding> pragma:
+in that case pretty much any characters can be read.
+
+=item readdir DIRHANDLE
+X<readdir>
+
+Returns the next directory entry for a directory opened by C<opendir>.
+If used in list context, returns all the rest of the entries in the
+directory. If there are no more entries, returns an undefined value in
+scalar context or a null list in list context.
+
+If you're planning to filetest the return values out of a C<readdir>, you'd
+better prepend the directory in question. Otherwise, because we didn't
+C<chdir> there, it would have been testing the wrong file.
+
+ opendir(my $dh, $some_dir) || die "can't opendir $some_dir: $!";
+ @dots = grep { /^\./ && -f "$some_dir/$_" } readdir($dh);
+ closedir $dh;
+
+=item readline EXPR
+
+=item readline
+X<readline> X<gets> X<fgets>
+
+Reads from the filehandle whose typeglob is contained in EXPR (or from
+*ARGV if EXPR is not provided). In scalar context, each call reads and
+returns the next line, until end-of-file is reached, whereupon the
+subsequent call returns undef. In list context, reads until end-of-file
+is reached and returns a list of lines. Note that the notion of "line"
+used here is however you may have defined it with C<$/> or
+C<$INPUT_RECORD_SEPARATOR>). See L<perlvar/"$/">.
+
+When C<$/> is set to C<undef>, when readline() is in scalar
+context (i.e. file slurp mode), and when an empty file is read, it
+returns C<''> the first time, followed by C<undef> subsequently.
+
+This is the internal function implementing the C<< <EXPR> >>
+operator, but you can use it directly. The C<< <EXPR> >>
+operator is discussed in more detail in L<perlop/"I/O Operators">.
+
+ $line = <STDIN>;
+ $line = readline(*STDIN); # same thing
+
+If readline encounters an operating system error, C<$!> will be set with the
+corresponding error message. It can be helpful to check C<$!> when you are
+reading from filehandles you don't trust, such as a tty or a socket. The
+following example uses the operator form of C<readline>, and takes the necessary
+steps to ensure that C<readline> was successful.
+
+ for (;;) {
+ undef $!;
+ unless (defined( $line = <> )) {
+ last if eof;
+ die $! if $!;
+ }
+ # ...
+ }
+
+=item readlink EXPR
+X<readlink>
+
+=item readlink
+
+Returns the value of a symbolic link, if symbolic links are
+implemented. If not, gives a fatal error. If there is some system
+error, returns the undefined value and sets C<$!> (errno). If EXPR is
+omitted, uses C<$_>.
+
+=item readpipe EXPR
+
+=item readpipe
+X<readpipe>
+
+EXPR is executed as a system command.
+The collected standard output of the command is returned.
+In scalar context, it comes back as a single (potentially
+multi-line) string. In list context, returns a list of lines
+(however you've defined lines with C<$/> or C<$INPUT_RECORD_SEPARATOR>).
+This is the internal function implementing the C<qx/EXPR/>
+operator, but you can use it directly. The C<qx/EXPR/>
+operator is discussed in more detail in L<perlop/"I/O Operators">.
+If EXPR is omitted, uses C<$_>.
+
+=item recv SOCKET,SCALAR,LENGTH,FLAGS
+X<recv>
+
+Receives a message on a socket. Attempts to receive LENGTH characters
+of data into variable SCALAR from the specified SOCKET filehandle.
+SCALAR will be grown or shrunk to the length actually read. Takes the
+same flags as the system call of the same name. Returns the address
+of the sender if SOCKET's protocol supports this; returns an empty
+string otherwise. If there's an error, returns the undefined value.
+This call is actually implemented in terms of recvfrom(2) system call.
+See L<perlipc/"UDP: Message Passing"> for examples.
+
+Note the I<characters>: depending on the status of the socket, either
+(8-bit) bytes or characters are received. By default all sockets
+operate on bytes, but for example if the socket has been changed using
+binmode() to operate with the C<:encoding(utf8)> I/O layer (see the
+C<open> pragma, L<open>), the I/O will operate on UTF-8 encoded Unicode
+characters, not bytes. Similarly for the C<:encoding> pragma: in that
+case pretty much any characters can be read.
+
+=item redo LABEL
+X<redo>
+
+=item redo
+
+The C<redo> command restarts the loop block without evaluating the
+conditional again. The C<continue> block, if any, is not executed. If
+the LABEL is omitted, the command refers to the innermost enclosing
+loop. Programs that want to lie to themselves about what was just input
+normally use this command:
+
+ # a simpleminded Pascal comment stripper
+ # (warning: assumes no { or } in strings)
+ LINE: while (<STDIN>) {
+ while (s|({.*}.*){.*}|$1 |) {}
+ s|{.*}| |;
+ if (s|{.*| |) {
+ $front = $_;
+ while (<STDIN>) {
+ if (/}/) { # end of comment?
+ s|^|$front\{|;
+ redo LINE;
+ }
+ }
+ }
+ print;
+ }
+
+C<redo> cannot be used to retry a block which returns a value such as
+C<eval {}>, C<sub {}> or C<do {}>, and should not be used to exit
+a grep() or map() operation.
+
+Note that a block by itself is semantically identical to a loop
+that executes once. Thus C<redo> inside such a block will effectively
+turn it into a looping construct.
+
+See also L</continue> for an illustration of how C<last>, C<next>, and
+C<redo> work.
+
+=item ref EXPR
+X<ref> X<reference>
+
+=item ref
+
+Returns a non-empty string if EXPR is a reference, the empty
+string otherwise. If EXPR
+is not specified, C<$_> will be used. The value returned depends on the
+type of thing the reference is a reference to.
+Builtin types include:
+
+ SCALAR
+ ARRAY
+ HASH
+ CODE
+ REF
+ GLOB
+ LVALUE
+ FORMAT
+ IO
+ VSTRING
+ Regexp
+
+If the referenced object has been blessed into a package, then that package
+name is returned instead. You can think of C<ref> as a C<typeof> operator.
+
+ if (ref($r) eq "HASH") {
+ print "r is a reference to a hash.\n";
+ }
+ unless (ref($r)) {
+ print "r is not a reference at all.\n";
+ }
+
+The return value C<LVALUE> indicates a reference to an lvalue that is not
+a variable. You get this from taking the reference of function calls like
+C<pos()> or C<substr()>. C<VSTRING> is returned if the reference points
+to a L<version string|perldata/"Version Strings">.
+
+The result C<Regexp> indicates that the argument is a regular expression
+resulting from C<qr//>.
+
+See also L<perlref>.
+
+=item rename OLDNAME,NEWNAME
+X<rename> X<move> X<mv> X<ren>
+
+Changes the name of a file; an existing file NEWNAME will be
+clobbered. Returns true for success, false otherwise.
+
+Behavior of this function varies wildly depending on your system
+implementation. For example, it will usually not work across file system
+boundaries, even though the system I<mv> command sometimes compensates
+for this. Other restrictions include whether it works on directories,
+open files, or pre-existing files. Check L<perlport> and either the
+rename(2) manpage or equivalent system documentation for details.
+
+For a platform independent C<move> function look at the L<File::Copy>
+module.
+
+=item require VERSION
+X<require>
+
+=item require EXPR
+
+=item require
+
+Demands a version of Perl specified by VERSION, or demands some semantics
+specified by EXPR or by C<$_> if EXPR is not supplied.
+
+VERSION may be either a numeric argument such as 5.006, which will be
+compared to C<$]>, or a literal of the form v5.6.1, which will be compared
+to C<$^V> (aka $PERL_VERSION). A fatal error is produced at run time if
+VERSION is greater than the version of the current Perl interpreter.
+Compare with L</use>, which can do a similar check at compile time.
+
+Specifying VERSION as a literal of the form v5.6.1 should generally be
+avoided, because it leads to misleading error messages under earlier
+versions of Perl that do not support this syntax. The equivalent numeric
+version should be used instead.
+
+ require v5.6.1; # run time version check
+ require 5.6.1; # ditto
+ require 5.006_001; # ditto; preferred for backwards compatibility
+
+Otherwise, C<require> demands that a library file be included if it
+hasn't already been included. The file is included via the do-FILE
+mechanism, which is essentially just a variety of C<eval> with the
+caveat that lexical variables in the invoking script will be invisible
+to the included code. Has semantics similar to the following subroutine:
+
+ sub require {
+ my ($filename) = @_;
+ if (exists $INC{$filename}) {
+ return 1 if $INC{$filename};
+ die "Compilation failed in require";
+ }
+ my ($realfilename,$result);
+ ITER: {
+ foreach $prefix (@INC) {
+ $realfilename = "$prefix/$filename";
+ if (-f $realfilename) {
+ $INC{$filename} = $realfilename;
+ $result = do $realfilename;
+ last ITER;
+ }
+ }
+ die "Can't find $filename in \@INC";
+ }
+ if ($@) {
+ $INC{$filename} = undef;
+ die $@;
+ } elsif (!$result) {
+ delete $INC{$filename};
+ die "$filename did not return true value";
+ } else {
+ return $result;
+ }
+ }
+
+Note that the file will not be included twice under the same specified
+name.
+
+The file must return true as the last statement to indicate
+successful execution of any initialization code, so it's customary to
+end such a file with C<1;> unless you're sure it'll return true
+otherwise. But it's better just to put the C<1;>, in case you add more
+statements.
+
+If EXPR is a bareword, the require assumes a "F<.pm>" extension and
+replaces "F<::>" with "F</>" in the filename for you,
+to make it easy to load standard modules. This form of loading of
+modules does not risk altering your namespace.
+
+In other words, if you try this:
+
+ require Foo::Bar; # a splendid bareword
+
+The require function will actually look for the "F<Foo/Bar.pm>" file in the
+directories specified in the C<@INC> array.
+
+But if you try this:
+
+ $class = 'Foo::Bar';
+ require $class; # $class is not a bareword
+ #or
+ require "Foo::Bar"; # not a bareword because of the ""
+
+The require function will look for the "F<Foo::Bar>" file in the @INC array and
+will complain about not finding "F<Foo::Bar>" there. In this case you can do:
+
+ eval "require $class";
+
+Now that you understand how C<require> looks for files in the case of a
+bareword argument, there is a little extra functionality going on behind
+the scenes. Before C<require> looks for a "F<.pm>" extension, it will
+first look for a similar filename with a "F<.pmc>" extension. If this file
+is found, it will be loaded in place of any file ending in a "F<.pm>"
+extension.
+
+You can also insert hooks into the import facility, by putting directly
+Perl code into the @INC array. There are three forms of hooks: subroutine
+references, array references and blessed objects.
+
+Subroutine references are the simplest case. When the inclusion system
+walks through @INC and encounters a subroutine, this subroutine gets
+called with two parameters, the first being a reference to itself, and the
+second the name of the file to be included (e.g. "F<Foo/Bar.pm>"). The
+subroutine should return nothing, or a list of up to three values in the
+following order:
+
+=over
+
+=item 1
+
+A filehandle, from which the file will be read.
+
+=item 2
+
+A reference to a subroutine. If there is no filehandle (previous item),
+then this subroutine is expected to generate one line of source code per
+call, writing the line into C<$_> and returning 1, then returning 0 at
+"end of file". If there is a filehandle, then the subroutine will be
+called to act as a simple source filter, with the line as read in C<$_>.
+Again, return 1 for each valid line, and 0 after all lines have been
+returned.
+
+=item 3
+
+Optional state for the subroutine. The state is passed in as C<$_[1]>. A
+reference to the subroutine itself is passed in as C<$_[0]>.
+
+=back
+
+If an empty list, C<undef>, or nothing that matches the first 3 values above
+is returned then C<require> will look at the remaining elements of @INC.
+Note that this file handle must be a real file handle (strictly a typeglob,
+or reference to a typeglob, blessed or unblessed) - tied file handles will be
+ignored and return value processing will stop there.
+
+If the hook is an array reference, its first element must be a subroutine
+reference. This subroutine is called as above, but the first parameter is
+the array reference. This enables to pass indirectly some arguments to
+the subroutine.
+
+In other words, you can write:
+
+ push @INC, \&my_sub;
+ sub my_sub {
+ my ($coderef, $filename) = @_; # $coderef is \&my_sub
+ ...
+ }
+
+or:
+
+ push @INC, [ \&my_sub, $x, $y, ... ];
+ sub my_sub {
+ my ($arrayref, $filename) = @_;
+ # Retrieve $x, $y, ...
+ my @parameters = @$arrayref[1..$#$arrayref];
+ ...
+ }
+
+If the hook is an object, it must provide an INC method that will be
+called as above, the first parameter being the object itself. (Note that
+you must fully qualify the sub's name, as unqualified C<INC> is always forced
+into package C<main>.) Here is a typical code layout:
+
+ # In Foo.pm
+ package Foo;
+ sub new { ... }
+ sub Foo::INC {
+ my ($self, $filename) = @_;
+ ...
+ }
+
+ # In the main program
+ push @INC, Foo->new(...);
+
+Note that these hooks are also permitted to set the %INC entry
+corresponding to the files they have loaded. See L<perlvar/%INC>.
+
+For a yet-more-powerful import facility, see L</use> and L<perlmod>.
+
+=item reset EXPR
+X<reset>
+
+=item reset
+
+Generally used in a C<continue> block at the end of a loop to clear
+variables and reset C<??> searches so that they work again. The
+expression is interpreted as a list of single characters (hyphens
+allowed for ranges). All variables and arrays beginning with one of
+those letters are reset to their pristine state. If the expression is
+omitted, one-match searches (C<?pattern?>) are reset to match again. Resets
+only variables or searches in the current package. Always returns
+1. Examples:
+
+ reset 'X'; # reset all X variables
+ reset 'a-z'; # reset lower case variables
+ reset; # just reset ?one-time? searches
+
+Resetting C<"A-Z"> is not recommended because you'll wipe out your
+C<@ARGV> and C<@INC> arrays and your C<%ENV> hash. Resets only package
+variables--lexical variables are unaffected, but they clean themselves
+up on scope exit anyway, so you'll probably want to use them instead.
+See L</my>.
+
+=item return EXPR
+X<return>
+
+=item return
+
+Returns from a subroutine, C<eval>, or C<do FILE> with the value
+given in EXPR. Evaluation of EXPR may be in list, scalar, or void
+context, depending on how the return value will be used, and the context
+may vary from one execution to the next (see C<wantarray>). If no EXPR
+is given, returns an empty list in list context, the undefined value in
+scalar context, and (of course) nothing at all in a void context.
+
+(Note that in the absence of an explicit C<return>, a subroutine, eval,
+or do FILE will automatically return the value of the last expression
+evaluated.)
+
+=item reverse LIST
+X<reverse> X<rev> X<invert>
+
+In list context, returns a list value consisting of the elements
+of LIST in the opposite order. In scalar context, concatenates the
+elements of LIST and returns a string value with all characters
+in the opposite order.
+
+ print join(", ", reverse "world", "Hello"); # Hello, world
+
+ print scalar reverse "dlrow ,", "olleH"; # Hello, world
+
+Used without arguments in scalar context, reverse() reverses C<$_>.
+
+ $_ = "dlrow ,olleH";
+ print reverse; # No output, list context
+ print scalar reverse; # Hello, world
+
+This operator is also handy for inverting a hash, although there are some
+caveats. If a value is duplicated in the original hash, only one of those
+can be represented as a key in the inverted hash. Also, this has to
+unwind one hash and build a whole new one, which may take some time
+on a large hash, such as from a DBM file.
+
+ %by_name = reverse %by_address; # Invert the hash
+
+=item rewinddir DIRHANDLE
+X<rewinddir>
+
+Sets the current position to the beginning of the directory for the
+C<readdir> routine on DIRHANDLE.
+
+=item rindex STR,SUBSTR,POSITION
+X<rindex>
+
+=item rindex STR,SUBSTR
+
+Works just like index() except that it returns the position of the I<last>
+occurrence of SUBSTR in STR. If POSITION is specified, returns the
+last occurrence beginning at or before that position.
+
+=item rmdir FILENAME
+X<rmdir> X<rd> X<directory, remove>
+
+=item rmdir
+
+Deletes the directory specified by FILENAME if that directory is
+empty. If it succeeds it returns true, otherwise it returns false and
+sets C<$!> (errno). If FILENAME is omitted, uses C<$_>.
+
+To remove a directory tree recursively (C<rm -rf> on unix) look at
+the C<rmtree> function of the L<File::Path> module.
+
+=item s///
+
+The substitution operator. See L<perlop/"Regexp Quote-Like Operators">.
+
+=item say FILEHANDLE LIST
+X<say>
+
+=item say LIST
+
+=item say
+
+Just like C<print>, but implicitly appends a newline.
+C<say LIST> is simply an abbreviation for C<{ local $\ = "\n"; print
+LIST }>.
+
+This keyword is only available when the "say" feature is
+enabled: see L<feature>.
+
+=item scalar EXPR
+X<scalar> X<context>
+
+Forces EXPR to be interpreted in scalar context and returns the value
+of EXPR.
+
+ @counts = ( scalar @a, scalar @b, scalar @c );
+
+There is no equivalent operator to force an expression to
+be interpolated in list context because in practice, this is never
+needed. If you really wanted to do so, however, you could use
+the construction C<@{[ (some expression) ]}>, but usually a simple
+C<(some expression)> suffices.
+
+Because C<scalar> is unary operator, if you accidentally use for EXPR a
+parenthesized list, this behaves as a scalar comma expression, evaluating
+all but the last element in void context and returning the final element
+evaluated in scalar context. This is seldom what you want.
+
+The following single statement:
+
+ print uc(scalar(&foo,$bar)),$baz;
+
+is the moral equivalent of these two:
+
+ &foo;
+ print(uc($bar),$baz);
+
+See L<perlop> for more details on unary operators and the comma operator.
+
+=item seek FILEHANDLE,POSITION,WHENCE
+X<seek> X<fseek> X<filehandle, position>
+
+Sets FILEHANDLE's position, just like the C<fseek> call of C<stdio>.
+FILEHANDLE may be an expression whose value gives the name of the
+filehandle. The values for WHENCE are C<0> to set the new position
+I<in bytes> to POSITION, C<1> to set it to the current position plus
+POSITION, and C<2> to set it to EOF plus POSITION (typically
+negative). For WHENCE you may use the constants C<SEEK_SET>,
+C<SEEK_CUR>, and C<SEEK_END> (start of the file, current position, end
+of the file) from the Fcntl module. Returns C<1> upon success, C<0>
+otherwise.
+
+Note the I<in bytes>: even if the filehandle has been set to
+operate on characters (for example by using the C<:encoding(utf8)> open
+layer), tell() will return byte offsets, not character offsets
+(because implementing that would render seek() and tell() rather slow).
+
+If you want to position file for C<sysread> or C<syswrite>, don't use
+C<seek>--buffering makes its effect on the file's system position
+unpredictable and non-portable. Use C<sysseek> instead.
+
+Due to the rules and rigors of ANSI C, on some systems you have to do a
+seek whenever you switch between reading and writing. Amongst other
+things, this may have the effect of calling stdio's clearerr(3).
+A WHENCE of C<1> (C<SEEK_CUR>) is useful for not moving the file position:
+
+ seek(TEST,0,1);
+
+This is also useful for applications emulating C<tail -f>. Once you hit
+EOF on your read, and then sleep for a while, you might have to stick in a
+seek() to reset things. The C<seek> doesn't change the current position,
+but it I<does> clear the end-of-file condition on the handle, so that the
+next C<< <FILE> >> makes Perl try again to read something. We hope.
+
+If that doesn't work (some IO implementations are particularly
+cantankerous), then you may need something more like this:
+
+ for (;;) {
+ for ($curpos = tell(FILE); $_ = <FILE>;
+ $curpos = tell(FILE)) {
+ # search for some stuff and put it into files
+ }
+ sleep($for_a_while);
+ seek(FILE, $curpos, 0);
+ }
+
+=item seekdir DIRHANDLE,POS
+X<seekdir>
+
+Sets the current position for the C<readdir> routine on DIRHANDLE. POS
+must be a value returned by C<telldir>. C<seekdir> also has the same caveats
+about possible directory compaction as the corresponding system library
+routine.
+
+=item select FILEHANDLE
+X<select> X<filehandle, default>
+
+=item select
+
+Returns the currently selected filehandle. If FILEHANDLE is supplied,
+sets the new current default filehandle for output. This has two
+effects: first, a C<write> or a C<print> without a filehandle will
+default to this FILEHANDLE. Second, references to variables related to
+output will refer to this output channel. For example, if you have to
+set the top of form format for more than one output channel, you might
+do the following:
+
+ select(REPORT1);
+ $^ = 'report1_top';
+ select(REPORT2);
+ $^ = 'report2_top';
+
+FILEHANDLE may be an expression whose value gives the name of the
+actual filehandle. Thus:
+
+ $oldfh = select(STDERR); $| = 1; select($oldfh);
+
+Some programmers may prefer to think of filehandles as objects with
+methods, preferring to write the last example as:
+
+ use IO::Handle;
+ STDERR->autoflush(1);
+
+=item select RBITS,WBITS,EBITS,TIMEOUT
+X<select>
+
+This calls the select(2) system call with the bit masks specified, which
+can be constructed using C<fileno> and C<vec>, along these lines:
+
+ $rin = $win = $ein = '';
+ vec($rin,fileno(STDIN),1) = 1;
+ vec($win,fileno(STDOUT),1) = 1;
+ $ein = $rin | $win;
+
+If you want to select on many filehandles you might wish to write a
+subroutine:
+
+ sub fhbits {
+ my(@fhlist) = split(' ',$_[0]);
+ my($bits);
+ for (@fhlist) {
+ vec($bits,fileno($_),1) = 1;
+ }
+ $bits;
+ }
+ $rin = fhbits('STDIN TTY SOCK');
+
+The usual idiom is:
+
+ ($nfound,$timeleft) =
+ select($rout=$rin, $wout=$win, $eout=$ein, $timeout);
+
+or to block until something becomes ready just do this
+
+ $nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef);
+
+Most systems do not bother to return anything useful in $timeleft, so
+calling select() in scalar context just returns $nfound.
+
+Any of the bit masks can also be undef. The timeout, if specified, is
+in seconds, which may be fractional. Note: not all implementations are
+capable of returning the $timeleft. If not, they always return
+$timeleft equal to the supplied $timeout.
+
+You can effect a sleep of 250 milliseconds this way:
+
+ select(undef, undef, undef, 0.25);
+
+Note that whether C<select> gets restarted after signals (say, SIGALRM)
+is implementation-dependent. See also L<perlport> for notes on the
+portability of C<select>.
+
+On error, C<select> behaves like the select(2) system call : it returns
+-1 and sets C<$!>.
+
+Note: on some Unixes, the select(2) system call may report a socket file
+descriptor as "ready for reading", when actually no data is available,
+thus a subsequent read blocks. It can be avoided using always the
+O_NONBLOCK flag on the socket. See select(2) and fcntl(2) for further
+details.
+
+B<WARNING>: One should not attempt to mix buffered I/O (like C<read>
+or <FH>) with C<select>, except as permitted by POSIX, and even
+then only on POSIX systems. You have to use C<sysread> instead.
+
+=item semctl ID,SEMNUM,CMD,ARG
+X<semctl>
+
+Calls the System V IPC function C<semctl>. You'll probably have to say
+
+ use IPC::SysV;
+
+first to get the correct constant definitions. If CMD is IPC_STAT or
+GETALL, then ARG must be a variable that will hold the returned
+semid_ds structure or semaphore value array. Returns like C<ioctl>:
+the undefined value for error, "C<0 but true>" for zero, or the actual
+return value otherwise. The ARG must consist of a vector of native
+short integers, which may be created with C<pack("s!",(0)x$nsem)>.
+See also L<perlipc/"SysV IPC">, C<IPC::SysV>, C<IPC::Semaphore>
+documentation.
+
+=item semget KEY,NSEMS,FLAGS
+X<semget>
+
+Calls the System V IPC function semget. Returns the semaphore id, or
+the undefined value if there is an error. See also
+L<perlipc/"SysV IPC">, C<IPC::SysV>, C<IPC::SysV::Semaphore>
+documentation.
+
+=item semop KEY,OPSTRING
+X<semop>
+
+Calls the System V IPC function semop to perform semaphore operations
+such as signalling and waiting. OPSTRING must be a packed array of
+semop structures. Each semop structure can be generated with
+C<pack("s!3", $semnum, $semop, $semflag)>. The length of OPSTRING
+implies the number of semaphore operations. Returns true if
+successful, or false if there is an error. As an example, the
+following code waits on semaphore $semnum of semaphore id $semid:
+
+ $semop = pack("s!3", $semnum, -1, 0);
+ die "Semaphore trouble: $!\n" unless semop($semid, $semop);
+
+To signal the semaphore, replace C<-1> with C<1>. See also
+L<perlipc/"SysV IPC">, C<IPC::SysV>, and C<IPC::SysV::Semaphore>
+documentation.
+
+=item send SOCKET,MSG,FLAGS,TO
+X<send>
+
+=item send SOCKET,MSG,FLAGS
+
+Sends a message on a socket. Attempts to send the scalar MSG to the
+SOCKET filehandle. Takes the same flags as the system call of the
+same name. On unconnected sockets you must specify a destination to
+send TO, in which case it does a C C<sendto>. Returns the number of
+characters sent, or the undefined value if there is an error. The C
+system call sendmsg(2) is currently unimplemented. See
+L<perlipc/"UDP: Message Passing"> for examples.
+
+Note the I<characters>: depending on the status of the socket, either
+(8-bit) bytes or characters are sent. By default all sockets operate
+on bytes, but for example if the socket has been changed using
+binmode() to operate with the C<:encoding(utf8)> I/O layer (see
+L</open>, or the C<open> pragma, L<open>), the I/O will operate on UTF-8
+encoded Unicode characters, not bytes. Similarly for the C<:encoding>
+pragma: in that case pretty much any characters can be sent.
+
+=item setpgrp PID,PGRP
+X<setpgrp> X<group>
+
+Sets the current process group for the specified PID, C<0> for the current
+process. Will produce a fatal error if used on a machine that doesn't
+implement POSIX setpgid(2) or BSD setpgrp(2). If the arguments are omitted,
+it defaults to C<0,0>. Note that the BSD 4.2 version of C<setpgrp> does not
+accept any arguments, so only C<setpgrp(0,0)> is portable. See also
+C<POSIX::setsid()>.
+
+=item setpriority WHICH,WHO,PRIORITY
+X<setpriority> X<priority> X<nice> X<renice>
+
+Sets the current priority for a process, a process group, or a user.
+(See setpriority(2).) Will produce a fatal error if used on a machine
+that doesn't implement setpriority(2).
+
+=item setsockopt SOCKET,LEVEL,OPTNAME,OPTVAL
+X<setsockopt>
+
+Sets the socket option requested. Returns undefined if there is an
+error. Use integer constants provided by the C<Socket> module for
+LEVEL and OPNAME. Values for LEVEL can also be obtained from
+getprotobyname. OPTVAL might either be a packed string or an integer.
+An integer OPTVAL is shorthand for pack("i", OPTVAL).
+
+An example disabling the Nagle's algorithm for a socket:
+
+ use Socket qw(IPPROTO_TCP TCP_NODELAY);
+ setsockopt($socket, IPPROTO_TCP, TCP_NODELAY, 1);
+
+=item shift ARRAY
+X<shift>
+
+=item shift
+
+Shifts the first value of the array off and returns it, shortening the
+array by 1 and moving everything down. If there are no elements in the
+array, returns the undefined value. If ARRAY is omitted, shifts the
+C<@_> array within the lexical scope of subroutines and formats, and the
+C<@ARGV> array outside of a subroutine and also within the lexical scopes
+established by the C<eval STRING>, C<BEGIN {}>, C<INIT {}>, C<CHECK {}>,
+C<UNITCHECK {}> and C<END {}> constructs.
+
+See also C<unshift>, C<push>, and C<pop>. C<shift> and C<unshift> do the
+same thing to the left end of an array that C<pop> and C<push> do to the
+right end.
+
+=item shmctl ID,CMD,ARG
+X<shmctl>
+
+Calls the System V IPC function shmctl. You'll probably have to say
+
+ use IPC::SysV;
+
+first to get the correct constant definitions. If CMD is C<IPC_STAT>,
+then ARG must be a variable that will hold the returned C<shmid_ds>
+structure. Returns like ioctl: the undefined value for error, "C<0> but
+true" for zero, or the actual return value otherwise.
+See also L<perlipc/"SysV IPC"> and C<IPC::SysV> documentation.
+
+=item shmget KEY,SIZE,FLAGS
+X<shmget>
+
+Calls the System V IPC function shmget. Returns the shared memory
+segment id, or the undefined value if there is an error.
+See also L<perlipc/"SysV IPC"> and C<IPC::SysV> documentation.
+
+=item shmread ID,VAR,POS,SIZE
+X<shmread>
+X<shmwrite>
+
+=item shmwrite ID,STRING,POS,SIZE
+
+Reads or writes the System V shared memory segment ID starting at
+position POS for size SIZE by attaching to it, copying in/out, and
+detaching from it. When reading, VAR must be a variable that will
+hold the data read. When writing, if STRING is too long, only SIZE
+bytes are used; if STRING is too short, nulls are written to fill out
+SIZE bytes. Return true if successful, or false if there is an error.
+shmread() taints the variable. See also L<perlipc/"SysV IPC">,
+C<IPC::SysV> documentation, and the C<IPC::Shareable> module from CPAN.
+
+=item shutdown SOCKET,HOW
+X<shutdown>
+
+Shuts down a socket connection in the manner indicated by HOW, which
+has the same interpretation as in the system call of the same name.
+
+ shutdown(SOCKET, 0); # I/we have stopped reading data
+ shutdown(SOCKET, 1); # I/we have stopped writing data
+ shutdown(SOCKET, 2); # I/we have stopped using this socket
+
+This is useful with sockets when you want to tell the other
+side you're done writing but not done reading, or vice versa.
+It's also a more insistent form of close because it also
+disables the file descriptor in any forked copies in other
+processes.
+
+Returns C<1> for success. In the case of error, returns C<undef> if
+the first argument is not a valid filehandle, or returns C<0> and sets
+C<$!> for any other failure.
+
+=item sin EXPR
+X<sin> X<sine> X<asin> X<arcsine>
+
+=item sin
+
+Returns the sine of EXPR (expressed in radians). If EXPR is omitted,
+returns sine of C<$_>.
+
+For the inverse sine operation, you may use the C<Math::Trig::asin>
+function, or use this relation:
+
+ sub asin { atan2($_[0], sqrt(1 - $_[0] * $_[0])) }
+
+=item sleep EXPR
+X<sleep> X<pause>
+
+=item sleep
+
+Causes the script to sleep for EXPR seconds, or forever if no EXPR.
+Returns the number of seconds actually slept.
+
+May be interrupted if the process receives a signal such as C<SIGALRM>.
+
+ eval {
+ local $SIG{ALARM} = sub { die "Alarm!\n" };
+ sleep;
+ };
+ die $@ unless $@ eq "Alarm!\n";
+
+You probably cannot mix C<alarm> and C<sleep> calls, because C<sleep>
+is often implemented using C<alarm>.
+
+On some older systems, it may sleep up to a full second less than what
+you requested, depending on how it counts seconds. Most modern systems
+always sleep the full amount. They may appear to sleep longer than that,
+however, because your process might not be scheduled right away in a
+busy multitasking system.
+
+For delays of finer granularity than one second, the Time::HiRes module
+(from CPAN, and starting from Perl 5.8 part of the standard
+distribution) provides usleep(). You may also use Perl's four-argument
+version of select() leaving the first three arguments undefined, or you
+might be able to use the C<syscall> interface to access setitimer(2) if
+your system supports it. See L<perlfaq8> for details.
+
+See also the POSIX module's C<pause> function.
+
+=item socket SOCKET,DOMAIN,TYPE,PROTOCOL
+X<socket>
+
+Opens a socket of the specified kind and attaches it to filehandle
+SOCKET. DOMAIN, TYPE, and PROTOCOL are specified the same as for
+the system call of the same name. You should C<use Socket> first
+to get the proper definitions imported. See the examples in
+L<perlipc/"Sockets: Client/Server Communication">.
+
+On systems that support a close-on-exec flag on files, the flag will
+be set for the newly opened file descriptor, as determined by the
+value of $^F. See L<perlvar/$^F>.
+
+=item socketpair SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL
+X<socketpair>
+
+Creates an unnamed pair of sockets in the specified domain, of the
+specified type. DOMAIN, TYPE, and PROTOCOL are specified the same as
+for the system call of the same name. If unimplemented, yields a fatal
+error. Returns true if successful.
+
+On systems that support a close-on-exec flag on files, the flag will
+be set for the newly opened file descriptors, as determined by the value
+of $^F. See L<perlvar/$^F>.
+
+Some systems defined C<pipe> in terms of C<socketpair>, in which a call
+to C<pipe(Rdr, Wtr)> is essentially:
+
+ use Socket;
+ socketpair(Rdr, Wtr, AF_UNIX, SOCK_STREAM, PF_UNSPEC);
+ shutdown(Rdr, 1); # no more writing for reader
+ shutdown(Wtr, 0); # no more reading for writer
+
+See L<perlipc> for an example of socketpair use. Perl 5.8 and later will
+emulate socketpair using IP sockets to localhost if your system implements
+sockets but not socketpair.
+
+=item sort SUBNAME LIST
+X<sort> X<qsort> X<quicksort> X<mergesort>
+
+=item sort BLOCK LIST
+
+=item sort LIST
+
+In list context, this sorts the LIST and returns the sorted list value.
+In scalar context, the behaviour of C<sort()> is undefined.
+
+If SUBNAME or BLOCK is omitted, C<sort>s in standard string comparison
+order. If SUBNAME is specified, it gives the name of a subroutine
+that returns an integer less than, equal to, or greater than C<0>,
+depending on how the elements of the list are to be ordered. (The C<<
+<=> >> and C<cmp> operators are extremely useful in such routines.)
+SUBNAME may be a scalar variable name (unsubscripted), in which case
+the value provides the name of (or a reference to) the actual
+subroutine to use. In place of a SUBNAME, you can provide a BLOCK as
+an anonymous, in-line sort subroutine.
+
+If the subroutine's prototype is C<($$)>, the elements to be compared
+are passed by reference in C<@_>, as for a normal subroutine. This is
+slower than unprototyped subroutines, where the elements to be
+compared are passed into the subroutine
+as the package global variables $a and $b (see example below). Note that
+in the latter case, it is usually counter-productive to declare $a and
+$b as lexicals.
+
+The values to be compared are always passed by reference and should not
+be modified.
+
+You also cannot exit out of the sort block or subroutine using any of the
+loop control operators described in L<perlsyn> or with C<goto>.
+
+When C<use locale> is in effect, C<sort LIST> sorts LIST according to the
+current collation locale. See L<perllocale>.
+
+sort() returns aliases into the original list, much as a for loop's index
+variable aliases the list elements. That is, modifying an element of a
+list returned by sort() (for example, in a C<foreach>, C<map> or C<grep>)
+actually modifies the element in the original list. This is usually
+something to be avoided when writing clear code.
+
+Perl 5.6 and earlier used a quicksort algorithm to implement sort.
+That algorithm was not stable, and I<could> go quadratic. (A I<stable> sort
+preserves the input order of elements that compare equal. Although
+quicksort's run time is O(NlogN) when averaged over all arrays of
+length N, the time can be O(N**2), I<quadratic> behavior, for some
+inputs.) In 5.7, the quicksort implementation was replaced with
+a stable mergesort algorithm whose worst-case behavior is O(NlogN).
+But benchmarks indicated that for some inputs, on some platforms,
+the original quicksort was faster. 5.8 has a sort pragma for
+limited control of the sort. Its rather blunt control of the
+underlying algorithm may not persist into future Perls, but the
+ability to characterize the input or output in implementation
+independent ways quite probably will. See L<the sort pragma|sort>.
+
+Examples:
+
+ # sort lexically
+ @articles = sort @files;
+
+ # same thing, but with explicit sort routine
+ @articles = sort {$a cmp $b} @files;
+
+ # now case-insensitively
+ @articles = sort {uc($a) cmp uc($b)} @files;
+
+ # same thing in reversed order
+ @articles = sort {$b cmp $a} @files;
+
+ # sort numerically ascending
+ @articles = sort {$a <=> $b} @files;
+
+ # sort numerically descending
+ @articles = sort {$b <=> $a} @files;
+
+ # this sorts the %age hash by value instead of key
+ # using an in-line function
+ @eldest = sort { $age{$b} <=> $age{$a} } keys %age;
+
+ # sort using explicit subroutine name
+ sub byage {
+ $age{$a} <=> $age{$b}; # presuming numeric
+ }
+ @sortedclass = sort byage @class;
+
+ sub backwards { $b cmp $a }
+ @harry = qw(dog cat x Cain Abel);
+ @george = qw(gone chased yz Punished Axed);
+ print sort @harry;
+ # prints AbelCaincatdogx
+ print sort backwards @harry;
+ # prints xdogcatCainAbel
+ print sort @george, 'to', @harry;
+ # prints AbelAxedCainPunishedcatchaseddoggonetoxyz
+
+ # inefficiently sort by descending numeric compare using
+ # the first integer after the first = sign, or the
+ # whole record case-insensitively otherwise
+
+ @new = sort {
+ ($b =~ /=(\d+)/)[0] <=> ($a =~ /=(\d+)/)[0]
+ ||
+ uc($a) cmp uc($b)
+ } @old;
+
+ # same thing, but much more efficiently;
+ # we'll build auxiliary indices instead
+ # for speed
+ @nums = @caps = ();
+ for (@old) {
+ push @nums, /=(\d+)/;
+ push @caps, uc($_);
+ }
+
+ @new = @old[ sort {
+ $nums[$b] <=> $nums[$a]
+ ||
+ $caps[$a] cmp $caps[$b]
+ } 0..$#old
+ ];
+
+ # same thing, but without any temps
+ @new = map { $_->[0] }
+ sort { $b->[1] <=> $a->[1]
+ ||
+ $a->[2] cmp $b->[2]
+ } map { [$_, /=(\d+)/, uc($_)] } @old;
+
+ # using a prototype allows you to use any comparison subroutine
+ # as a sort subroutine (including other package's subroutines)
+ package other;
+ sub backwards ($$) { $_[1] cmp $_[0]; } # $a and $b are not set here
+
+ package main;
+ @new = sort other::backwards @old;
+
+ # guarantee stability, regardless of algorithm
+ use sort 'stable';
+ @new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;
+
+ # force use of mergesort (not portable outside Perl 5.8)
+ use sort '_mergesort'; # note discouraging _
+ @new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;
+
+Warning: syntactical care is required when sorting the list returned from
+a function. If you want to sort the list returned by the function call
+C<find_records(@key)>, you can use:
+
+ @contact = sort { $a cmp $b } find_records @key;
+ @contact = sort +find_records(@key);
+ @contact = sort &find_records(@key);
+ @contact = sort(find_records(@key));
+
+If instead you want to sort the array @key with the comparison routine
+C<find_records()> then you can use:
+
+ @contact = sort { find_records() } @key;
+ @contact = sort find_records(@key);
+ @contact = sort(find_records @key);
+ @contact = sort(find_records (@key));
+
+If you're using strict, you I<must not> declare $a
+and $b as lexicals. They are package globals. That means
+that if you're in the C<main> package and type
+
+ @articles = sort {$b <=> $a} @files;
+
+then C<$a> and C<$b> are C<$main::a> and C<$main::b> (or C<$::a> and C<$::b>),
+but if you're in the C<FooPack> package, it's the same as typing
+
+ @articles = sort {$FooPack::b <=> $FooPack::a} @files;
+
+The comparison function is required to behave. If it returns
+inconsistent results (sometimes saying C<$x[1]> is less than C<$x[2]> and
+sometimes saying the opposite, for example) the results are not
+well-defined.
+
+Because C<< <=> >> returns C<undef> when either operand is C<NaN>
+(not-a-number), and because C<sort> will trigger a fatal error unless the
+result of a comparison is defined, when sorting with a comparison function
+like C<< $a <=> $b >>, be careful about lists that might contain a C<NaN>.
+The following example takes advantage of the fact that C<NaN != NaN> to
+eliminate any C<NaN>s from the input.
+
+ @result = sort { $a <=> $b } grep { $_ == $_ } @input;
+
+=item splice ARRAY,OFFSET,LENGTH,LIST
+X<splice>
+
+=item splice ARRAY,OFFSET,LENGTH
+
+=item splice ARRAY,OFFSET
+
+=item splice ARRAY
+
+Removes the elements designated by OFFSET and LENGTH from an array, and
+replaces them with the elements of LIST, if any. In list context,
+returns the elements removed from the array. In scalar context,
+returns the last element removed, or C<undef> if no elements are
+removed. The array grows or shrinks as necessary.
+If OFFSET is negative then it starts that far from the end of the array.
+If LENGTH is omitted, removes everything from OFFSET onward.
+If LENGTH is negative, removes the elements from OFFSET onward
+except for -LENGTH elements at the end of the array.
+If both OFFSET and LENGTH are omitted, removes everything. If OFFSET is
+past the end of the array, perl issues a warning, and splices at the
+end of the array.
+
+The following equivalences hold (assuming C<< $[ == 0 and $#a >= $i >> )
+
+ push(@a,$x,$y) splice(@a,@a,0,$x,$y)
+ pop(@a) splice(@a,-1)
+ shift(@a) splice(@a,0,1)
+ unshift(@a,$x,$y) splice(@a,0,0,$x,$y)
+ $a[$i] = $y splice(@a,$i,1,$y)
+
+Example, assuming array lengths are passed before arrays:
+
+ sub aeq { # compare two list values
+ my(@a) = splice(@_,0,shift);
+ my(@b) = splice(@_,0,shift);
+ return 0 unless @a == @b; # same len?
+ while (@a) {
+ return 0 if pop(@a) ne pop(@b);
+ }
+ return 1;
+ }
+ if (&aeq($len,@foo[1..$len],0+@bar,@bar)) { ... }
+
+=item split /PATTERN/,EXPR,LIMIT
+X<split>
+
+=item split /PATTERN/,EXPR
+
+=item split /PATTERN/
+
+=item split
+
+Splits the string EXPR into a list of strings and returns that list. By
+default, empty leading fields are preserved, and empty trailing ones are
+deleted. (If all fields are empty, they are considered to be trailing.)
+
+In scalar context, returns the number of fields found. In scalar and void
+context it splits into the C<@_> array. Use of split in scalar and void
+context is deprecated, however, because it clobbers your subroutine
+arguments.
+
+If EXPR is omitted, splits the C<$_> string. If PATTERN is also omitted,
+splits on whitespace (after skipping any leading whitespace). Anything
+matching PATTERN is taken to be a delimiter separating the fields. (Note
+that the delimiter may be longer than one character.)
+
+If LIMIT is specified and positive, it represents the maximum number
+of fields the EXPR will be split into, though the actual number of
+fields returned depends on the number of times PATTERN matches within
+EXPR. If LIMIT is unspecified or zero, trailing null fields are
+stripped (which potential users of C<pop> would do well to remember).
+If LIMIT is negative, it is treated as if an arbitrarily large LIMIT
+had been specified. Note that splitting an EXPR that evaluates to the
+empty string always returns the empty list, regardless of the LIMIT
+specified.
+
+A pattern matching the null string (not to be confused with
+a null pattern C<//>, which is just one member of the set of patterns
+matching a null string) will split the value of EXPR into separate
+characters at each point it matches that way. For example:
+
+ print join(':', split(/ */, 'hi there')), "\n";
+
+produces the output 'h:i:t:h:e:r:e'.
+
+As a special case for C<split>, using the empty pattern C<//> specifically
+matches only the null string, and is not be confused with the regular use
+of C<//> to mean "the last successful pattern match". So, for C<split>,
+the following:
+
+ print join(':', split(//, 'hi there')), "\n";
+
+produces the output 'h:i: :t:h:e:r:e'.
+
+Empty leading fields are produced when there are positive-width matches at
+the beginning of the string; a zero-width match at the beginning of
+the string does not produce an empty field. For example:
+
+ print join(':', split(/(?=\w)/, 'hi there!'));
+
+produces the output 'h:i :t:h:e:r:e!'. Empty trailing fields, on the other
+hand, are produced when there is a match at the end of the string (and
+when LIMIT is given and is not 0), regardless of the length of the match.
+For example:
+
+ print join(':', split(//, 'hi there!', -1)), "\n";
+ print join(':', split(/\W/, 'hi there!', -1)), "\n";
+
+produce the output 'h:i: :t:h:e:r:e:!:' and 'hi:there:', respectively,
+both with an empty trailing field.
+
+The LIMIT parameter can be used to split a line partially
+
+ ($login, $passwd, $remainder) = split(/:/, $_, 3);
+
+When assigning to a list, if LIMIT is omitted, or zero, Perl supplies
+a LIMIT one larger than the number of variables in the list, to avoid
+unnecessary work. For the list above LIMIT would have been 4 by
+default. In time critical applications it behooves you not to split
+into more fields than you really need.
+
+If the PATTERN contains parentheses, additional list elements are
+created from each matching substring in the delimiter.
+
+ split(/([,-])/, "1-10,20", 3);
+
+produces the list value
+
+ (1, '-', 10, ',', 20)
+
+If you had the entire header of a normal Unix email message in $header,
+you could split it up into fields and their values this way:
+
+ $header =~ s/\n(?=\s)//g; # fix continuation lines
+ %hdrs = (UNIX_FROM => split /^(\S*?):\s*/m, $header);
+
+The pattern C</PATTERN/> may be replaced with an expression to specify
+patterns that vary at runtime. (To do runtime compilation only once,
+use C</$variable/o>.)
+
+As a special case, specifying a PATTERN of space (S<C<' '>>) will split on
+white space just as C<split> with no arguments does. Thus, S<C<split(' ')>> can
+be used to emulate B<awk>'s default behavior, whereas S<C<split(/ /)>>
+will give you as many null initial fields as there are leading spaces.
+A C<split> on C</\s+/> is like a S<C<split(' ')>> except that any leading
+whitespace produces a null first field. A C<split> with no arguments
+really does a S<C<split(' ', $_)>> internally.
+
+A PATTERN of C</^/> is treated as if it were C</^/m>, since it isn't
+much use otherwise.
+
+Example:
+
+ open(PASSWD, '/etc/passwd');
+ while (<PASSWD>) {
+ chomp;
+ ($login, $passwd, $uid, $gid,
+ $gcos, $home, $shell) = split(/:/);
+ #...
+ }
+
+As with regular pattern matching, any capturing parentheses that are not
+matched in a C<split()> will be set to C<undef> when returned:
+
+ @fields = split /(A)|B/, "1A2B3";
+ # @fields is (1, 'A', 2, undef, 3)
+
+=item sprintf FORMAT, LIST
+X<sprintf>
+
+Returns a string formatted by the usual C<printf> conventions of the C
+library function C<sprintf>. See below for more details
+and see C<sprintf(3)> or C<printf(3)> on your system for an explanation of
+the general principles.
+
+For example:
+
+ # Format number with up to 8 leading zeroes
+ $result = sprintf("%08d", $number);
+
+ # Round number to 3 digits after decimal point
+ $rounded = sprintf("%.3f", $number);
+
+Perl does its own C<sprintf> formatting--it emulates the C
+function C<sprintf>, but it doesn't use it (except for floating-point
+numbers, and even then only the standard modifiers are allowed). As a
+result, any non-standard extensions in your local C<sprintf> are not
+available from Perl.
+
+Unlike C<printf>, C<sprintf> does not do what you probably mean when you
+pass it an array as your first argument. The array is given scalar context,
+and instead of using the 0th element of the array as the format, Perl will
+use the count of elements in the array as the format, which is almost never
+useful.
+
+Perl's C<sprintf> permits the following universally-known conversions:
+
+ %% a percent sign
+ %c a character with the given number
+ %s a string
+ %d a signed integer, in decimal
+ %u an unsigned integer, in decimal
+ %o an unsigned integer, in octal
+ %x an unsigned integer, in hexadecimal
+ %e a floating-point number, in scientific notation
+ %f a floating-point number, in fixed decimal notation
+ %g a floating-point number, in %e or %f notation
+
+In addition, Perl permits the following widely-supported conversions:
+
+ %X like %x, but using upper-case letters
+ %E like %e, but using an upper-case "E"
+ %G like %g, but with an upper-case "E" (if applicable)
+ %b an unsigned integer, in binary
+ %B like %b, but using an upper-case "B" with the # flag
+ %p a pointer (outputs the Perl value's address in hexadecimal)
+ %n special: *stores* the number of characters output so far
+ into the next variable in the parameter list
+
+Finally, for backward (and we do mean "backward") compatibility, Perl
+permits these unnecessary but widely-supported conversions:
+
+ %i a synonym for %d
+ %D a synonym for %ld
+ %U a synonym for %lu
+ %O a synonym for %lo
+ %F a synonym for %f
+
+Note that the number of exponent digits in the scientific notation produced
+by C<%e>, C<%E>, C<%g> and C<%G> for numbers with the modulus of the
+exponent less than 100 is system-dependent: it may be three or less
+(zero-padded as necessary). In other words, 1.23 times ten to the
+99th may be either "1.23e99" or "1.23e099".
+
+Between the C<%> and the format letter, you may specify a number of
+additional attributes controlling the interpretation of the format.
+In order, these are:
+
+=over 4
+
+=item format parameter index
+
+An explicit format parameter index, such as C<2$>. By default sprintf
+will format the next unused argument in the list, but this allows you
+to take the arguments out of order, e.g.:
+
+ printf '%2$d %1$d', 12, 34; # prints "34 12"
+ printf '%3$d %d %1$d', 1, 2, 3; # prints "3 1 1"
+
+=item flags
+
+one or more of:
+
+ space prefix non-negative number with a space
+ + prefix non-negative number with a plus sign
+ - left-justify within the field
+ 0 use zeros, not spaces, to right-justify
+ # ensure the leading "0" for any octal,
+ prefix non-zero hexadecimal with "0x" or "0X",
+ prefix non-zero binary with "0b" or "0B"
+
+For example:
+
+ printf '<% d>', 12; # prints "< 12>"
+ printf '<%+d>', 12; # prints "<+12>"
+ printf '<%6s>', 12; # prints "< 12>"
+ printf '<%-6s>', 12; # prints "<12 >"
+ printf '<%06s>', 12; # prints "<000012>"
+ printf '<%#o>', 12; # prints "<014>"
+ printf '<%#x>', 12; # prints "<0xc>"
+ printf '<%#X>', 12; # prints "<0XC>"
+ printf '<%#b>', 12; # prints "<0b1100>"
+ printf '<%#B>', 12; # prints "<0B1100>"
+
+When a space and a plus sign are given as the flags at once,
+a plus sign is used to prefix a positive number.
+
+ printf '<%+ d>', 12; # prints "<+12>"
+ printf '<% +d>', 12; # prints "<+12>"
+
+When the # flag and a precision are given in the %o conversion,
+the precision is incremented if it's necessary for the leading "0".
+
+ printf '<%#.5o>', 012; # prints "<00012>"
+ printf '<%#.5o>', 012345; # prints "<012345>"
+ printf '<%#.0o>', 0; # prints "<0>"
+
+=item vector flag
+
+This flag tells perl to interpret the supplied string as a vector of
+integers, one for each character in the string. Perl applies the format to
+each integer in turn, then joins the resulting strings with a separator (a
+dot C<.> by default). This can be useful for displaying ordinal values of
+characters in arbitrary strings:
+
+ printf "%vd", "AB\x{100}"; # prints "65.66.256"
+ printf "version is v%vd\n", $^V; # Perl's version
+
+Put an asterisk C<*> before the C<v> to override the string to
+use to separate the numbers:
+
+ printf "address is %*vX\n", ":", $addr; # IPv6 address
+ printf "bits are %0*v8b\n", " ", $bits; # random bitstring
+
+You can also explicitly specify the argument number to use for
+the join string using e.g. C<*2$v>:
+
+ printf '%*4$vX %*4$vX %*4$vX', @addr[1..3], ":"; # 3 IPv6 addresses
+
+=item (minimum) width
+
+Arguments are usually formatted to be only as wide as required to
+display the given value. You can override the width by putting
+a number here, or get the width from the next argument (with C<*>)
+or from a specified argument (with e.g. C<*2$>):
+
+ printf '<%s>', "a"; # prints "<a>"
+ printf '<%6s>', "a"; # prints "< a>"
+ printf '<%*s>', 6, "a"; # prints "< a>"
+ printf '<%*2$s>', "a", 6; # prints "< a>"
+ printf '<%2s>', "long"; # prints "<long>" (does not truncate)
+
+If a field width obtained through C<*> is negative, it has the same
+effect as the C<-> flag: left-justification.
+
+=item precision, or maximum width
+X<precision>
+
+You can specify a precision (for numeric conversions) or a maximum
+width (for string conversions) by specifying a C<.> followed by a number.
+For floating point formats, with the exception of 'g' and 'G', this specifies
+the number of decimal places to show (the default being 6), e.g.:
+
+ # these examples are subject to system-specific variation
+ printf '<%f>', 1; # prints "<1.000000>"
+ printf '<%.1f>', 1; # prints "<1.0>"
+ printf '<%.0f>', 1; # prints "<1>"
+ printf '<%e>', 10; # prints "<1.000000e+01>"
+ printf '<%.1e>', 10; # prints "<1.0e+01>"
+
+For 'g' and 'G', this specifies the maximum number of digits to show,
+including prior to the decimal point as well as after it, e.g.:
+
+ # these examples are subject to system-specific variation
+ printf '<%g>', 1; # prints "<1>"
+ printf '<%.10g>', 1; # prints "<1>"
+ printf '<%g>', 100; # prints "<100>"
+ printf '<%.1g>', 100; # prints "<1e+02>"
+ printf '<%.2g>', 100.01; # prints "<1e+02>"
+ printf '<%.5g>', 100.01; # prints "<100.01>"
+ printf '<%.4g>', 100.01; # prints "<100>"
+
+For integer conversions, specifying a precision implies that the
+output of the number itself should be zero-padded to this width,
+where the 0 flag is ignored:
+
+ printf '<%.6d>', 1; # prints "<000001>"
+ printf '<%+.6d>', 1; # prints "<+000001>"
+ printf '<%-10.6d>', 1; # prints "<000001 >"
+ printf '<%10.6d>', 1; # prints "< 000001>"
+ printf '<%010.6d>', 1; # prints "< 000001>"
+ printf '<%+10.6d>', 1; # prints "< +000001>"
+
+ printf '<%.6x>', 1; # prints "<000001>"
+ printf '<%#.6x>', 1; # prints "<0x000001>"
+ printf '<%-10.6x>', 1; # prints "<000001 >"
+ printf '<%10.6x>', 1; # prints "< 000001>"
+ printf '<%010.6x>', 1; # prints "< 000001>"
+ printf '<%#10.6x>', 1; # prints "< 0x000001>"
+
+For string conversions, specifying a precision truncates the string
+to fit in the specified width:
+
+ printf '<%.5s>', "truncated"; # prints "<trunc>"
+ printf '<%10.5s>', "truncated"; # prints "< trunc>"
+
+You can also get the precision from the next argument using C<.*>:
+
+ printf '<%.6x>', 1; # prints "<000001>"
+ printf '<%.*x>', 6, 1; # prints "<000001>"
+
+If a precision obtained through C<*> is negative, it has the same
+effect as no precision.
+
+ printf '<%.*s>', 7, "string"; # prints "<string>"
+ printf '<%.*s>', 3, "string"; # prints "<str>"
+ printf '<%.*s>', 0, "string"; # prints "<>"
+ printf '<%.*s>', -1, "string"; # prints "<string>"
+
+ printf '<%.*d>', 1, 0; # prints "<0>"
+ printf '<%.*d>', 0, 0; # prints "<>"
+ printf '<%.*d>', -1, 0; # prints "<0>"
+
+You cannot currently get the precision from a specified number,
+but it is intended that this will be possible in the future using
+e.g. C<.*2$>:
+
+ printf '<%.*2$x>', 1, 6; # INVALID, but in future will print "<000001>"
+
+=item size
+
+For numeric conversions, you can specify the size to interpret the
+number as using C<l>, C<h>, C<V>, C<q>, C<L>, or C<ll>. For integer
+conversions (C<d u o x X b i D U O>), numbers are usually assumed to be
+whatever the default integer size is on your platform (usually 32 or 64
+bits), but you can override this to use instead one of the standard C types,
+as supported by the compiler used to build Perl:
+
+ l interpret integer as C type "long" or "unsigned long"
+ h interpret integer as C type "short" or "unsigned short"
+ q, L or ll interpret integer as C type "long long", "unsigned long long".
+ or "quads" (typically 64-bit integers)
+
+The last will produce errors if Perl does not understand "quads" in your
+installation. (This requires that either the platform natively supports quads
+or Perl was specifically compiled to support quads.) You can find out
+whether your Perl supports quads via L<Config>:
+
+ use Config;
+ ($Config{use64bitint} eq 'define' || $Config{longsize} >= 8) &&
+ print "quads\n";
+
+For floating point conversions (C<e f g E F G>), numbers are usually assumed
+to be the default floating point size on your platform (double or long double),
+but you can force 'long double' with C<q>, C<L>, or C<ll> if your
+platform supports them. You can find out whether your Perl supports long
+doubles via L<Config>:
+
+ use Config;
+ $Config{d_longdbl} eq 'define' && print "long doubles\n";
+
+You can find out whether Perl considers 'long double' to be the default
+floating point size to use on your platform via L<Config>:
+
+ use Config;
+ ($Config{uselongdouble} eq 'define') &&
+ print "long doubles by default\n";
+
+It can also be the case that long doubles and doubles are the same thing:
+
+ use Config;
+ ($Config{doublesize} == $Config{longdblsize}) &&
+ print "doubles are long doubles\n";
+
+The size specifier C<V> has no effect for Perl code, but it is supported
+for compatibility with XS code; it means 'use the standard size for
+a Perl integer (or floating-point number)', which is already the
+default for Perl code.
+
+=item order of arguments
+
+Normally, sprintf takes the next unused argument as the value to
+format for each format specification. If the format specification
+uses C<*> to require additional arguments, these are consumed from
+the argument list in the order in which they appear in the format
+specification I<before> the value to format. Where an argument is
+specified using an explicit index, this does not affect the normal
+order for the arguments (even when the explicitly specified index
+would have been the next argument in any case).
+
+So:
+
+ printf '<%*.*s>', $a, $b, $c;
+
+would use C<$a> for the width, C<$b> for the precision and C<$c>
+as the value to format, while:
+
+ printf '<%*1$.*s>', $a, $b;
+
+would use C<$a> for the width and the precision, and C<$b> as the
+value to format.
+
+Here are some more examples - beware that when using an explicit
+index, the C<$> may need to be escaped:
+
+ printf "%2\$d %d\n", 12, 34; # will print "34 12\n"
+ printf "%2\$d %d %d\n", 12, 34; # will print "34 12 34\n"
+ printf "%3\$d %d %d\n", 12, 34, 56; # will print "56 12 34\n"
+ printf "%2\$*3\$d %d\n", 12, 34, 3; # will print " 34 12\n"
+
+=back
+
+If C<use locale> is in effect, and POSIX::setlocale() has been called,
+the character used for the decimal separator in formatted floating
+point numbers is affected by the LC_NUMERIC locale. See L<perllocale>
+and L<POSIX>.
+
+=item sqrt EXPR
+X<sqrt> X<root> X<square root>
+
+=item sqrt
+
+Return the square root of EXPR. If EXPR is omitted, returns square
+root of C<$_>. Only works on non-negative operands, unless you've
+loaded the standard Math::Complex module.
+
+ use Math::Complex;
+ print sqrt(-2); # prints 1.4142135623731i
+
+=item srand EXPR
+X<srand> X<seed> X<randseed>
+
+=item srand
+
+Sets the random number seed for the C<rand> operator.
+
+The point of the function is to "seed" the C<rand> function so that
+C<rand> can produce a different sequence each time you run your
+program.
+
+If srand() is not called explicitly, it is called implicitly at the
+first use of the C<rand> operator. However, this was not the case in
+versions of Perl before 5.004, so if your script will run under older
+Perl versions, it should call C<srand>.
+
+Most programs won't even call srand() at all, except those that
+need a cryptographically-strong starting point rather than the
+generally acceptable default, which is based on time of day,
+process ID, and memory allocation, or the F</dev/urandom> device,
+if available.
+
+You can call srand($seed) with the same $seed to reproduce the
+I<same> sequence from rand(), but this is usually reserved for
+generating predictable results for testing or debugging.
+Otherwise, don't call srand() more than once in your program.
+
+Do B<not> call srand() (i.e. without an argument) more than once in
+a script. The internal state of the random number generator should
+contain more entropy than can be provided by any seed, so calling
+srand() again actually I<loses> randomness.
+
+Most implementations of C<srand> take an integer and will silently
+truncate decimal numbers. This means C<srand(42)> will usually
+produce the same results as C<srand(42.1)>. To be safe, always pass
+C<srand> an integer.
+
+In versions of Perl prior to 5.004 the default seed was just the
+current C<time>. This isn't a particularly good seed, so many old
+programs supply their own seed value (often C<time ^ $$> or C<time ^
+($$ + ($$ << 15))>), but that isn't necessary any more.
+
+For cryptographic purposes, however, you need something much more random
+than the default seed. Checksumming the compressed output of one or more
+rapidly changing operating system status programs is the usual method. For
+example:
+
+ srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip -f`);
+
+If you're particularly concerned with this, see the C<Math::TrulyRandom>
+module in CPAN.
+
+Frequently called programs (like CGI scripts) that simply use
+
+ time ^ $$
+
+for a seed can fall prey to the mathematical property that
+
+ a^b == (a+1)^(b+1)
+
+one-third of the time. So don't do that.
+
+=item stat FILEHANDLE
+X<stat> X<file, status> X<ctime>
+
+=item stat EXPR
+
+=item stat DIRHANDLE
+
+=item stat
+
+Returns a 13-element list giving the status info for a file, either
+the file opened via FILEHANDLE or DIRHANDLE, or named by EXPR. If EXPR is
+omitted, it stats C<$_>. Returns a null list if the stat fails. Typically
+used as follows:
+
+ ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+ $atime,$mtime,$ctime,$blksize,$blocks)
+ = stat($filename);
+
+Not all fields are supported on all filesystem types. Here are the
+meanings of the fields:
+
+ 0 dev device number of filesystem
+ 1 ino inode number
+ 2 mode file mode (type and permissions)
+ 3 nlink number of (hard) links to the file
+ 4 uid numeric user ID of file's owner
+ 5 gid numeric group ID of file's owner
+ 6 rdev the device identifier (special files only)
+ 7 size total size of file, in bytes
+ 8 atime last access time in seconds since the epoch
+ 9 mtime last modify time in seconds since the epoch
+ 10 ctime inode change time in seconds since the epoch (*)
+ 11 blksize preferred block size for file system I/O
+ 12 blocks actual number of blocks allocated
+
+(The epoch was at 00:00 January 1, 1970 GMT.)
+
+(*) Not all fields are supported on all filesystem types. Notably, the
+ctime field is non-portable. In particular, you cannot expect it to be a
+"creation time", see L<perlport/"Files and Filesystems"> for details.
+
+If C<stat> is passed the special filehandle consisting of an underline, no
+stat is done, but the current contents of the stat structure from the
+last C<stat>, C<lstat>, or filetest are returned. Example:
+
+ if (-x $file && (($d) = stat(_)) && $d < 0) {
+ print "$file is executable NFS file\n";
+ }
+
+(This works on machines only for which the device number is negative
+under NFS.)
+
+Because the mode contains both the file type and its permissions, you
+should mask off the file type portion and (s)printf using a C<"%o">
+if you want to see the real permissions.
+
+ $mode = (stat($filename))[2];
+ printf "Permissions are %04o\n", $mode & 07777;
+
+In scalar context, C<stat> returns a boolean value indicating success
+or failure, and, if successful, sets the information associated with
+the special filehandle C<_>.
+
+The L<File::stat> module provides a convenient, by-name access mechanism:
+
+ use File::stat;
+ $sb = stat($filename);
+ printf "File is %s, size is %s, perm %04o, mtime %s\n",
+ $filename, $sb->size, $sb->mode & 07777,
+ scalar localtime $sb->mtime;
+
+You can import symbolic mode constants (C<S_IF*>) and functions
+(C<S_IS*>) from the Fcntl module:
+
+ use Fcntl ':mode';
+
+ $mode = (stat($filename))[2];
+
+ $user_rwx = ($mode & S_IRWXU) >> 6;
+ $group_read = ($mode & S_IRGRP) >> 3;
+ $other_execute = $mode & S_IXOTH;
+
+ printf "Permissions are %04o\n", S_IMODE($mode), "\n";
+
+ $is_setuid = $mode & S_ISUID;
+ $is_directory = S_ISDIR($mode);
+
+You could write the last two using the C<-u> and C<-d> operators.
+The commonly available C<S_IF*> constants are
+
+ # Permissions: read, write, execute, for user, group, others.
+
+ S_IRWXU S_IRUSR S_IWUSR S_IXUSR
+ S_IRWXG S_IRGRP S_IWGRP S_IXGRP
+ S_IRWXO S_IROTH S_IWOTH S_IXOTH
+
+ # Setuid/Setgid/Stickiness/SaveText.
+ # Note that the exact meaning of these is system dependent.
+
+ S_ISUID S_ISGID S_ISVTX S_ISTXT
+
+ # File types. Not necessarily all are available on your system.
+
+ S_IFREG S_IFDIR S_IFLNK S_IFBLK S_IFCHR S_IFIFO S_IFSOCK S_IFWHT S_ENFMT
+
+ # The following are compatibility aliases for S_IRUSR, S_IWUSR, S_IXUSR.
+
+ S_IREAD S_IWRITE S_IEXEC
+
+and the C<S_IF*> functions are
+
+ S_IMODE($mode) the part of $mode containing the permission bits
+ and the setuid/setgid/sticky bits
+
+ S_IFMT($mode) the part of $mode containing the file type
+ which can be bit-anded with e.g. S_IFREG
+ or with the following functions
+
+ # The operators -f, -d, -l, -b, -c, -p, and -S.
+
+ S_ISREG($mode) S_ISDIR($mode) S_ISLNK($mode)
+ S_ISBLK($mode) S_ISCHR($mode) S_ISFIFO($mode) S_ISSOCK($mode)
+
+ # No direct -X operator counterpart, but for the first one
+ # the -g operator is often equivalent. The ENFMT stands for
+ # record flocking enforcement, a platform-dependent feature.
+
+ S_ISENFMT($mode) S_ISWHT($mode)
+
+See your native chmod(2) and stat(2) documentation for more details
+about the C<S_*> constants. To get status info for a symbolic link
+instead of the target file behind the link, use the C<lstat> function.
+
+=item state EXPR
+X<state>
+
+=item state TYPE EXPR
+
+=item state EXPR : ATTRS
+
+=item state TYPE EXPR : ATTRS
+
+C<state> declares a lexically scoped variable, just like C<my> does.
+However, those variables will never be reinitialized, contrary to
+lexical variables that are reinitialized each time their enclosing block
+is entered.
+
+C<state> variables are only enabled when the C<feature 'state'> pragma is
+in effect. See L<feature>.
+
+=item study SCALAR
+X<study>
+
+=item study
+
+Takes extra time to study SCALAR (C<$_> if unspecified) in anticipation of
+doing many pattern matches on the string before it is next modified.
+This may or may not save time, depending on the nature and number of
+patterns you are searching on, and on the distribution of character
+frequencies in the string to be searched--you probably want to compare
+run times with and without it to see which runs faster. Those loops
+that scan for many short constant strings (including the constant
+parts of more complex patterns) will benefit most. You may have only
+one C<study> active at a time--if you study a different scalar the first
+is "unstudied". (The way C<study> works is this: a linked list of every
+character in the string to be searched is made, so we know, for
+example, where all the C<'k'> characters are. From each search string,
+the rarest character is selected, based on some static frequency tables
+constructed from some C programs and English text. Only those places
+that contain this "rarest" character are examined.)
+
+For example, here is a loop that inserts index producing entries
+before any line containing a certain pattern:
+
+ while (<>) {
+ study;
+ print ".IX foo\n" if /\bfoo\b/;
+ print ".IX bar\n" if /\bbar\b/;
+ print ".IX blurfl\n" if /\bblurfl\b/;
+ # ...
+ print;
+ }
+
+In searching for C</\bfoo\b/>, only those locations in C<$_> that contain C<f>
+will be looked at, because C<f> is rarer than C<o>. In general, this is
+a big win except in pathological cases. The only question is whether
+it saves you more time than it took to build the linked list in the
+first place.
+
+Note that if you have to look for strings that you don't know till
+runtime, you can build an entire loop as a string and C<eval> that to
+avoid recompiling all your patterns all the time. Together with
+undefining C<$/> to input entire files as one record, this can be very
+fast, often faster than specialized programs like fgrep(1). The following
+scans a list of files (C<@files>) for a list of words (C<@words>), and prints
+out the names of those files that contain a match:
+
+ $search = 'while (<>) { study;';
+ foreach $word (@words) {
+ $search .= "++\$seen{\$ARGV} if /\\b$word\\b/;\n";
+ }
+ $search .= "}";
+ @ARGV = @files;
+ undef $/;
+ eval $search; # this screams
+ $/ = "\n"; # put back to normal input delimiter
+ foreach $file (sort keys(%seen)) {
+ print $file, "\n";
+ }
+
+=item sub NAME BLOCK
+X<sub>
+
+=item sub NAME (PROTO) BLOCK
+
+=item sub NAME : ATTRS BLOCK
+
+=item sub NAME (PROTO) : ATTRS BLOCK
+
+This is subroutine definition, not a real function I<per se>.
+Without a BLOCK it's just a forward declaration. Without a NAME,
+it's an anonymous function declaration, and does actually return
+a value: the CODE ref of the closure you just created.
+
+See L<perlsub> and L<perlref> for details about subroutines and
+references, and L<attributes> and L<Attribute::Handlers> for more
+information about attributes.
+
+=item substr EXPR,OFFSET,LENGTH,REPLACEMENT
+X<substr> X<substring> X<mid> X<left> X<right>
+
+=item substr EXPR,OFFSET,LENGTH
+
+=item substr EXPR,OFFSET
+
+Extracts a substring out of EXPR and returns it. First character is at
+offset C<0>, or whatever you've set C<$[> to (but don't do that).
+If OFFSET is negative (or more precisely, less than C<$[>), starts
+that far from the end of the string. If LENGTH is omitted, returns
+everything to the end of the string. If LENGTH is negative, leaves that
+many characters off the end of the string.
+
+ my $s = "The black cat climbed the green tree";
+ my $color = substr $s, 4, 5; # black
+ my $middle = substr $s, 4, -11; # black cat climbed the
+ my $end = substr $s, 14; # climbed the green tree
+ my $tail = substr $s, -4; # tree
+ my $z = substr $s, -4, 2; # tr
+
+You can use the substr() function as an lvalue, in which case EXPR
+must itself be an lvalue. If you assign something shorter than LENGTH,
+the string will shrink, and if you assign something longer than LENGTH,
+the string will grow to accommodate it. To keep the string the same
+length you may need to pad or chop your value using C<sprintf>.
+
+If OFFSET and LENGTH specify a substring that is partly outside the
+string, only the part within the string is returned. If the substring
+is beyond either end of the string, substr() returns the undefined
+value and produces a warning. When used as an lvalue, specifying a
+substring that is entirely outside the string is a fatal error.
+Here's an example showing the behavior for boundary cases:
+
+ my $name = 'fred';
+ substr($name, 4) = 'dy'; # $name is now 'freddy'
+ my $null = substr $name, 6, 2; # returns '' (no warning)
+ my $oops = substr $name, 7; # returns undef, with warning
+ substr($name, 7) = 'gap'; # fatal error
+
+An alternative to using substr() as an lvalue is to specify the
+replacement string as the 4th argument. This allows you to replace
+parts of the EXPR and return what was there before in one operation,
+just as you can with splice().
+
+ my $s = "The black cat climbed the green tree";
+ my $z = substr $s, 14, 7, "jumped from"; # climbed
+ # $s is now "The black cat jumped from the green tree"
+
+Note that the lvalue returned by the 3-arg version of substr() acts as
+a 'magic bullet'; each time it is assigned to, it remembers which part
+of the original string is being modified; for example:
+
+ $x = '1234';
+ for (substr($x,1,2)) {
+ $_ = 'a'; print $x,"\n"; # prints 1a4
+ $_ = 'xyz'; print $x,"\n"; # prints 1xyz4
+ $x = '56789';
+ $_ = 'pq'; print $x,"\n"; # prints 5pq9
+ }
+
+Prior to Perl version 5.9.1, the result of using an lvalue multiple times was
+unspecified.
+
+=item symlink OLDFILE,NEWFILE
+X<symlink> X<link> X<symbolic link> X<link, symbolic>
+
+Creates a new filename symbolically linked to the old filename.
+Returns C<1> for success, C<0> otherwise. On systems that don't support
+symbolic links, produces a fatal error at run time. To check for that,
+use eval:
+
+ $symlink_exists = eval { symlink("",""); 1 };
+
+=item syscall NUMBER, LIST
+X<syscall> X<system call>
+
+Calls the system call specified as the first element of the list,
+passing the remaining elements as arguments to the system call. If
+unimplemented, produces a fatal error. The arguments are interpreted
+as follows: if a given argument is numeric, the argument is passed as
+an int. If not, the pointer to the string value is passed. You are
+responsible to make sure a string is pre-extended long enough to
+receive any result that might be written into a string. You can't use a
+string literal (or other read-only string) as an argument to C<syscall>
+because Perl has to assume that any string pointer might be written
+through. If your
+integer arguments are not literals and have never been interpreted in a
+numeric context, you may need to add C<0> to them to force them to look
+like numbers. This emulates the C<syswrite> function (or vice versa):
+
+ require 'syscall.ph'; # may need to run h2ph
+ $s = "hi there\n";
+ syscall(&SYS_write, fileno(STDOUT), $s, length $s);
+
+Note that Perl supports passing of up to only 14 arguments to your system call,
+which in practice should usually suffice.
+
+Syscall returns whatever value returned by the system call it calls.
+If the system call fails, C<syscall> returns C<-1> and sets C<$!> (errno).
+Note that some system calls can legitimately return C<-1>. The proper
+way to handle such calls is to assign C<$!=0;> before the call and
+check the value of C<$!> if syscall returns C<-1>.
+
+There's a problem with C<syscall(&SYS_pipe)>: it returns the file
+number of the read end of the pipe it creates. There is no way
+to retrieve the file number of the other end. You can avoid this
+problem by using C<pipe> instead.
+
+=item sysopen FILEHANDLE,FILENAME,MODE
+X<sysopen>
+
+=item sysopen FILEHANDLE,FILENAME,MODE,PERMS
+
+Opens the file whose filename is given by FILENAME, and associates it
+with FILEHANDLE. If FILEHANDLE is an expression, its value is used as
+the name of the real filehandle wanted. This function calls the
+underlying operating system's C<open> function with the parameters
+FILENAME, MODE, PERMS.
+
+The possible values and flag bits of the MODE parameter are
+system-dependent; they are available via the standard module C<Fcntl>.
+See the documentation of your operating system's C<open> to see which
+values and flag bits are available. You may combine several flags
+using the C<|>-operator.
+
+Some of the most common values are C<O_RDONLY> for opening the file in
+read-only mode, C<O_WRONLY> for opening the file in write-only mode,
+and C<O_RDWR> for opening the file in read-write mode.
+X<O_RDONLY> X<O_RDWR> X<O_WRONLY>
+
+For historical reasons, some values work on almost every system
+supported by perl: zero means read-only, one means write-only, and two
+means read/write. We know that these values do I<not> work under
+OS/390 & VM/ESA Unix and on the Macintosh; you probably don't want to
+use them in new code.
+
+If the file named by FILENAME does not exist and the C<open> call creates
+it (typically because MODE includes the C<O_CREAT> flag), then the value of
+PERMS specifies the permissions of the newly created file. If you omit
+the PERMS argument to C<sysopen>, Perl uses the octal value C<0666>.
+These permission values need to be in octal, and are modified by your
+process's current C<umask>.
+X<O_CREAT>
+
+In many systems the C<O_EXCL> flag is available for opening files in
+exclusive mode. This is B<not> locking: exclusiveness means here that
+if the file already exists, sysopen() fails. C<O_EXCL> may not work
+on network filesystems, and has no effect unless the C<O_CREAT> flag
+is set as well. Setting C<O_CREAT|O_EXCL> prevents the file from
+being opened if it is a symbolic link. It does not protect against
+symbolic links in the file's path.
+X<O_EXCL>
+
+Sometimes you may want to truncate an already-existing file. This
+can be done using the C<O_TRUNC> flag. The behavior of
+C<O_TRUNC> with C<O_RDONLY> is undefined.
+X<O_TRUNC>
+
+You should seldom if ever use C<0644> as argument to C<sysopen>, because
+that takes away the user's option to have a more permissive umask.
+Better to omit it. See the perlfunc(1) entry on C<umask> for more
+on this.
+
+Note that C<sysopen> depends on the fdopen() C library function.
+On many UNIX systems, fdopen() is known to fail when file descriptors
+exceed a certain value, typically 255. If you need more file
+descriptors than that, consider rebuilding Perl to use the C<sfio>
+library, or perhaps using the POSIX::open() function.
+
+See L<perlopentut> for a kinder, gentler explanation of opening files.
+
+=item sysread FILEHANDLE,SCALAR,LENGTH,OFFSET
+X<sysread>
+
+=item sysread FILEHANDLE,SCALAR,LENGTH
+
+Attempts to read LENGTH bytes of data into variable SCALAR from the
+specified FILEHANDLE, using the system call read(2). It bypasses
+buffered IO, so mixing this with other kinds of reads, C<print>,
+C<write>, C<seek>, C<tell>, or C<eof> can cause confusion because the
+perlio or stdio layers usually buffers data. Returns the number of
+bytes actually read, C<0> at end of file, or undef if there was an
+error (in the latter case C<$!> is also set). SCALAR will be grown or
+shrunk so that the last byte actually read is the last byte of the
+scalar after the read.
+
+An OFFSET may be specified to place the read data at some place in the
+string other than the beginning. A negative OFFSET specifies
+placement at that many characters counting backwards from the end of
+the string. A positive OFFSET greater than the length of SCALAR
+results in the string being padded to the required size with C<"\0">
+bytes before the result of the read is appended.
+
+There is no syseof() function, which is ok, since eof() doesn't work
+very well on device files (like ttys) anyway. Use sysread() and check
+for a return value for 0 to decide whether you're done.
+
+Note that if the filehandle has been marked as C<:utf8> Unicode
+characters are read instead of bytes (the LENGTH, OFFSET, and the
+return value of sysread() are in Unicode characters).
+The C<:encoding(...)> layer implicitly introduces the C<:utf8> layer.
+See L</binmode>, L</open>, and the C<open> pragma, L<open>.
+
+=item sysseek FILEHANDLE,POSITION,WHENCE
+X<sysseek> X<lseek>
+
+Sets FILEHANDLE's system position in bytes using the system call
+lseek(2). FILEHANDLE may be an expression whose value gives the name
+of the filehandle. The values for WHENCE are C<0> to set the new
+position to POSITION, C<1> to set the it to the current position plus
+POSITION, and C<2> to set it to EOF plus POSITION (typically
+negative).
+
+Note the I<in bytes>: even if the filehandle has been set to operate
+on characters (for example by using the C<:encoding(utf8)> I/O layer),
+tell() will return byte offsets, not character offsets (because
+implementing that would render sysseek() very slow).
+
+sysseek() bypasses normal buffered IO, so mixing this with reads (other
+than C<sysread>, for example C<< <> >> or read()) C<print>, C<write>,
+C<seek>, C<tell>, or C<eof> may cause confusion.
+
+For WHENCE, you may also use the constants C<SEEK_SET>, C<SEEK_CUR>,
+and C<SEEK_END> (start of the file, current position, end of the file)
+from the Fcntl module. Use of the constants is also more portable
+than relying on 0, 1, and 2. For example to define a "systell" function:
+
+ use Fcntl 'SEEK_CUR';
+ sub systell { sysseek($_[0], 0, SEEK_CUR) }
+
+Returns the new position, or the undefined value on failure. A position
+of zero is returned as the string C<"0 but true">; thus C<sysseek> returns
+true on success and false on failure, yet you can still easily determine
+the new position.
+
+=item system LIST
+X<system> X<shell>
+
+=item system PROGRAM LIST
+
+Does exactly the same thing as C<exec LIST>, except that a fork is
+done first, and the parent process waits for the child process to
+complete. Note that argument processing varies depending on the
+number of arguments. If there is more than one argument in LIST,
+or if LIST is an array with more than one value, starts the program
+given by the first element of the list with arguments given by the
+rest of the list. If there is only one scalar argument, the argument
+is checked for shell metacharacters, and if there are any, the
+entire argument is passed to the system's command shell for parsing
+(this is C</bin/sh -c> on Unix platforms, but varies on other
+platforms). If there are no shell metacharacters in the argument,
+it is split into words and passed directly to C<execvp>, which is
+more efficient.
+
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before any operation that may do a fork, but this may not be
+supported on some platforms (see L<perlport>). To be safe, you may need
+to set C<$|> ($AUTOFLUSH in English) or call the C<autoflush()> method
+of C<IO::Handle> on any open handles.
+
+The return value is the exit status of the program as returned by the
+C<wait> call. To get the actual exit value, shift right by eight (see
+below). See also L</exec>. This is I<not> what you want to use to capture
+the output from a command, for that you should use merely backticks or
+C<qx//>, as described in L<perlop/"`STRING`">. Return value of -1
+indicates a failure to start the program or an error of the wait(2) system
+call (inspect $! for the reason).
+
+If you'd like to make C<system> (and many other bits of Perl) die on error,
+have a look at the L<autodie> pragma.
+
+Like C<exec>, C<system> allows you to lie to a program about its name if
+you use the C<system PROGRAM LIST> syntax. Again, see L</exec>.
+
+Since C<SIGINT> and C<SIGQUIT> are ignored during the execution of
+C<system>, if you expect your program to terminate on receipt of these
+signals you will need to arrange to do so yourself based on the return
+value.
+
+ @args = ("command", "arg1", "arg2");
+ system(@args) == 0
+ or die "system @args failed: $?"
+
+If you'd like to manually inspect C<system>'s failure, you can check all
+possible failure modes by inspecting C<$?> like this:
+
+ if ($? == -1) {
+ print "failed to execute: $!\n";
+ }
+ elsif ($? & 127) {
+ printf "child died with signal %d, %s coredump\n",
+ ($? & 127), ($? & 128) ? 'with' : 'without';
+ }
+ else {
+ printf "child exited with value %d\n", $? >> 8;
+ }
+
+Alternatively you might inspect the value of C<${^CHILD_ERROR_NATIVE}>
+with the W*() calls of the POSIX extension.
+
+When the arguments get executed via the system shell, results
+and return codes will be subject to its quirks and capabilities.
+See L<perlop/"`STRING`"> and L</exec> for details.
+
+=item syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET
+X<syswrite>
+
+=item syswrite FILEHANDLE,SCALAR,LENGTH
+
+=item syswrite FILEHANDLE,SCALAR
+
+Attempts to write LENGTH bytes of data from variable SCALAR to the
+specified FILEHANDLE, using the system call write(2). If LENGTH is
+not specified, writes whole SCALAR. It bypasses buffered IO, so
+mixing this with reads (other than C<sysread())>, C<print>, C<write>,
+C<seek>, C<tell>, or C<eof> may cause confusion because the perlio and
+stdio layers usually buffers data. Returns the number of bytes
+actually written, or C<undef> if there was an error (in this case the
+errno variable C<$!> is also set). If the LENGTH is greater than the
+available data in the SCALAR after the OFFSET, only as much data as is
+available will be written.
+
+An OFFSET may be specified to write the data from some part of the
+string other than the beginning. A negative OFFSET specifies writing
+that many characters counting backwards from the end of the string.
+In the case the SCALAR is empty you can use OFFSET but only zero offset.
+
+Note that if the filehandle has been marked as C<:utf8>, Unicode
+characters are written instead of bytes (the LENGTH, OFFSET, and the
+return value of syswrite() are in UTF-8 encoded Unicode characters).
+The C<:encoding(...)> layer implicitly introduces the C<:utf8> layer.
+See L</binmode>, L</open>, and the C<open> pragma, L<open>.
+
+=item tell FILEHANDLE
+X<tell>
+
+=item tell
+
+Returns the current position I<in bytes> for FILEHANDLE, or -1 on
+error. FILEHANDLE may be an expression whose value gives the name of
+the actual filehandle. If FILEHANDLE is omitted, assumes the file
+last read.
+
+Note the I<in bytes>: even if the filehandle has been set to
+operate on characters (for example by using the C<:encoding(utf8)> open
+layer), tell() will return byte offsets, not character offsets (because
+that would render seek() and tell() rather slow).
+
+The return value of tell() for the standard streams like the STDIN
+depends on the operating system: it may return -1 or something else.
+tell() on pipes, fifos, and sockets usually returns -1.
+
+There is no C<systell> function. Use C<sysseek(FH, 0, 1)> for that.
+
+Do not use tell() (or other buffered I/O operations) on a file handle
+that has been manipulated by sysread(), syswrite() or sysseek().
+Those functions ignore the buffering, while tell() does not.
+
+=item telldir DIRHANDLE
+X<telldir>
+
+Returns the current position of the C<readdir> routines on DIRHANDLE.
+Value may be given to C<seekdir> to access a particular location in a
+directory. C<telldir> has the same caveats about possible directory
+compaction as the corresponding system library routine.
+
+=item tie VARIABLE,CLASSNAME,LIST
+X<tie>
+
+This function binds a variable to a package class that will provide the
+implementation for the variable. VARIABLE is the name of the variable
+to be enchanted. CLASSNAME is the name of a class implementing objects
+of correct type. Any additional arguments are passed to the C<new>
+method of the class (meaning C<TIESCALAR>, C<TIEHANDLE>, C<TIEARRAY>,
+or C<TIEHASH>). Typically these are arguments such as might be passed
+to the C<dbm_open()> function of C. The object returned by the C<new>
+method is also returned by the C<tie> function, which would be useful
+if you want to access other methods in CLASSNAME.
+
+Note that functions such as C<keys> and C<values> may return huge lists
+when used on large objects, like DBM files. You may prefer to use the
+C<each> function to iterate over such. Example:
+
+ # print out history file offsets
+ use NDBM_File;
+ tie(%HIST, 'NDBM_File', '/usr/lib/news/history', 1, 0);
+ while (($key,$val) = each %HIST) {
+ print $key, ' = ', unpack('L',$val), "\n";
+ }
+ untie(%HIST);
+
+A class implementing a hash should have the following methods:
+
+ TIEHASH classname, LIST
+ FETCH this, key
+ STORE this, key, value
+ DELETE this, key
+ CLEAR this
+ EXISTS this, key
+ FIRSTKEY this
+ NEXTKEY this, lastkey
+ SCALAR this
+ DESTROY this
+ UNTIE this
+
+A class implementing an ordinary array should have the following methods:
+
+ TIEARRAY classname, LIST
+ FETCH this, key
+ STORE this, key, value
+ FETCHSIZE this
+ STORESIZE this, count
+ CLEAR this
+ PUSH this, LIST
+ POP this
+ SHIFT this
+ UNSHIFT this, LIST
+ SPLICE this, offset, length, LIST
+ EXTEND this, count
+ DESTROY this
+ UNTIE this
+
+A class implementing a file handle should have the following methods:
+
+ TIEHANDLE classname, LIST
+ READ this, scalar, length, offset
+ READLINE this
+ GETC this
+ WRITE this, scalar, length, offset
+ PRINT this, LIST
+ PRINTF this, format, LIST
+ BINMODE this
+ EOF this
+ FILENO this
+ SEEK this, position, whence
+ TELL this
+ OPEN this, mode, LIST
+ CLOSE this
+ DESTROY this
+ UNTIE this
+
+A class implementing a scalar should have the following methods:
+
+ TIESCALAR classname, LIST
+ FETCH this,
+ STORE this, value
+ DESTROY this
+ UNTIE this
+
+Not all methods indicated above need be implemented. See L<perltie>,
+L<Tie::Hash>, L<Tie::Array>, L<Tie::Scalar>, and L<Tie::Handle>.
+
+Unlike C<dbmopen>, the C<tie> function will not use or require a module
+for you--you need to do that explicitly yourself. See L<DB_File>
+or the F<Config> module for interesting C<tie> implementations.
+
+For further details see L<perltie>, L<"tied VARIABLE">.
+
+=item tied VARIABLE
+X<tied>
+
+Returns a reference to the object underlying VARIABLE (the same value
+that was originally returned by the C<tie> call that bound the variable
+to a package.) Returns the undefined value if VARIABLE isn't tied to a
+package.
+
+=item time
+X<time> X<epoch>
+
+Returns the number of non-leap seconds since whatever time the system
+considers to be the epoch, suitable for feeding to C<gmtime> and
+C<localtime>. On most systems the epoch is 00:00:00 UTC, January 1, 1970;
+a prominent exception being Mac OS Classic which uses 00:00:00, January 1,
+1904 in the current local time zone for its epoch.
+
+For measuring time in better granularity than one second,
+you may use either the L<Time::HiRes> module (from CPAN, and starting from
+Perl 5.8 part of the standard distribution), or if you have
+gettimeofday(2), you may be able to use the C<syscall> interface of Perl.
+See L<perlfaq8> for details.
+
+For date and time processing look at the many related modules on CPAN.
+For a comprehensive date and time representation look at the
+L<DateTime> module.
+
+=item times
+X<times>
+
+Returns a four-element list giving the user and system times, in
+seconds, for this process and the children of this process.
+
+ ($user,$system,$cuser,$csystem) = times;
+
+In scalar context, C<times> returns C<$user>.
+
+Note that times for children are included only after they terminate.
+
+=item tr///
+
+The transliteration operator. Same as C<y///>. See
+L<perlop/"Quote and Quote-like Operators">.
+
+=item truncate FILEHANDLE,LENGTH
+X<truncate>
+
+=item truncate EXPR,LENGTH
+
+Truncates the file opened on FILEHANDLE, or named by EXPR, to the
+specified length. Produces a fatal error if truncate isn't implemented
+on your system. Returns true if successful, the undefined value
+otherwise.
+
+The behavior is undefined if LENGTH is greater than the length of the
+file.
+
+The position in the file of FILEHANDLE is left unchanged. You may want to
+call L<seek> before writing to the file.
+
+=item uc EXPR
+X<uc> X<uppercase> X<toupper>
+
+=item uc
+
+Returns an uppercased version of EXPR. This is the internal function
+implementing the C<\U> escape in double-quoted strings. Respects
+current LC_CTYPE locale if C<use locale> in force. See L<perllocale>
+and L<perlunicode> for more details about locale and Unicode support.
+It does not attempt to do titlecase mapping on initial letters. See
+C<ucfirst> for that.
+
+If EXPR is omitted, uses C<$_>.
+
+=item ucfirst EXPR
+X<ucfirst> X<uppercase>
+
+=item ucfirst
+
+Returns the value of EXPR with the first character in uppercase
+(titlecase in Unicode). This is the internal function implementing
+the C<\u> escape in double-quoted strings. Respects current LC_CTYPE
+locale if C<use locale> in force. See L<perllocale> and L<perlunicode>
+for more details about locale and Unicode support.
+
+If EXPR is omitted, uses C<$_>.
+
+=item umask EXPR
+X<umask>
+
+=item umask
+
+Sets the umask for the process to EXPR and returns the previous value.
+If EXPR is omitted, merely returns the current umask.
+
+The Unix permission C<rwxr-x---> is represented as three sets of three
+bits, or three octal digits: C<0750> (the leading 0 indicates octal
+and isn't one of the digits). The C<umask> value is such a number
+representing disabled permissions bits. The permission (or "mode")
+values you pass C<mkdir> or C<sysopen> are modified by your umask, so
+even if you tell C<sysopen> to create a file with permissions C<0777>,
+if your umask is C<0022> then the file will actually be created with
+permissions C<0755>. If your C<umask> were C<0027> (group can't
+write; others can't read, write, or execute), then passing
+C<sysopen> C<0666> would create a file with mode C<0640> (C<0666 &~
+027> is C<0640>).
+
+Here's some advice: supply a creation mode of C<0666> for regular
+files (in C<sysopen>) and one of C<0777> for directories (in
+C<mkdir>) and executable files. This gives users the freedom of
+choice: if they want protected files, they might choose process umasks
+of C<022>, C<027>, or even the particularly antisocial mask of C<077>.
+Programs should rarely if ever make policy decisions better left to
+the user. The exception to this is when writing files that should be
+kept private: mail files, web browser cookies, I<.rhosts> files, and
+so on.
+
+If umask(2) is not implemented on your system and you are trying to
+restrict access for I<yourself> (i.e., (EXPR & 0700) > 0), produces a
+fatal error at run time. If umask(2) is not implemented and you are
+not trying to restrict access for yourself, returns C<undef>.
+
+Remember that a umask is a number, usually given in octal; it is I<not> a
+string of octal digits. See also L</oct>, if all you have is a string.
+
+=item undef EXPR
+X<undef> X<undefine>
+
+=item undef
+
+Undefines the value of EXPR, which must be an lvalue. Use only on a
+scalar value, an array (using C<@>), a hash (using C<%>), a subroutine
+(using C<&>), or a typeglob (using C<*>). (Saying C<undef $hash{$key}>
+will probably not do what you expect on most predefined variables or
+DBM list values, so don't do that; see L<delete>.) Always returns the
+undefined value. You can omit the EXPR, in which case nothing is
+undefined, but you still get an undefined value that you could, for
+instance, return from a subroutine, assign to a variable or pass as a
+parameter. Examples:
+
+ undef $foo;
+ undef $bar{'blurfl'}; # Compare to: delete $bar{'blurfl'};
+ undef @ary;
+ undef %hash;
+ undef &mysub;
+ undef *xyz; # destroys $xyz, @xyz, %xyz, &xyz, etc.
+ return (wantarray ? (undef, $errmsg) : undef) if $they_blew_it;
+ select undef, undef, undef, 0.25;
+ ($a, $b, undef, $c) = &foo; # Ignore third value returned
+
+Note that this is a unary operator, not a list operator.
+
+=item unlink LIST
+X<unlink> X<delete> X<remove> X<rm> X<del>
+
+=item unlink
+
+Deletes a list of files. Returns the number of files successfully
+deleted.
+
+ $cnt = unlink 'a', 'b', 'c';
+ unlink @goners;
+ unlink <*.bak>;
+
+Note: C<unlink> will not attempt to delete directories unless you are superuser
+and the B<-U> flag is supplied to Perl. Even if these conditions are
+met, be warned that unlinking a directory can inflict damage on your
+filesystem. Finally, using C<unlink> on directories is not supported on
+many operating systems. Use C<rmdir> instead.
+
+If LIST is omitted, uses C<$_>.
+
+=item unpack TEMPLATE,EXPR
+X<unpack>
+
+=item unpack TEMPLATE
+
+C<unpack> does the reverse of C<pack>: it takes a string
+and expands it out into a list of values.
+(In scalar context, it returns merely the first value produced.)
+
+If EXPR is omitted, unpacks the C<$_> string.
+
+The string is broken into chunks described by the TEMPLATE. Each chunk
+is converted separately to a value. Typically, either the string is a result
+of C<pack>, or the characters of the string represent a C structure of some
+kind.
+
+The TEMPLATE has the same format as in the C<pack> function.
+Here's a subroutine that does substring:
+
+ sub substr {
+ my($what,$where,$howmuch) = @_;
+ unpack("x$where a$howmuch", $what);
+ }
+
+and then there's
+
+ sub ordinal { unpack("W",$_[0]); } # same as ord()
+
+In addition to fields allowed in pack(), you may prefix a field with
+a %<number> to indicate that
+you want a <number>-bit checksum of the items instead of the items
+themselves. Default is a 16-bit checksum. Checksum is calculated by
+summing numeric values of expanded values (for string fields the sum of
+C<ord($char)> is taken, for bit fields the sum of zeroes and ones).
+
+For example, the following
+computes the same number as the System V sum program:
+
+ $checksum = do {
+ local $/; # slurp!
+ unpack("%32W*",<>) % 65535;
+ };
+
+The following efficiently counts the number of set bits in a bit vector:
+
+ $setbits = unpack("%32b*", $selectmask);
+
+The C<p> and C<P> formats should be used with care. Since Perl
+has no way of checking whether the value passed to C<unpack()>
+corresponds to a valid memory location, passing a pointer value that's
+not known to be valid is likely to have disastrous consequences.
+
+If there are more pack codes or if the repeat count of a field or a group
+is larger than what the remainder of the input string allows, the result
+is not well defined: in some cases, the repeat count is decreased, or
+C<unpack()> will produce null strings or zeroes, or terminate with an
+error. If the input string is longer than one described by the TEMPLATE,
+the rest is ignored.
+
+See L</pack> for more examples and notes.
+
+=item untie VARIABLE
+X<untie>
+
+Breaks the binding between a variable and a package. (See C<tie>.)
+Has no effect if the variable is not tied.
+
+=item unshift ARRAY,LIST
+X<unshift>
+
+Does the opposite of a C<shift>. Or the opposite of a C<push>,
+depending on how you look at it. Prepends list to the front of the
+array, and returns the new number of elements in the array.
+
+ unshift(@ARGV, '-e') unless $ARGV[0] =~ /^-/;
+
+Note the LIST is prepended whole, not one element at a time, so the
+prepended elements stay in the same order. Use C<reverse> to do the
+reverse.
+
+=item use Module VERSION LIST
+X<use> X<module> X<import>
+
+=item use Module VERSION
+
+=item use Module LIST
+
+=item use Module
+
+=item use VERSION
+
+Imports some semantics into the current package from the named module,
+generally by aliasing certain subroutine or variable names into your
+package. It is exactly equivalent to
+
+ BEGIN { require Module; Module->import( LIST ); }
+
+except that Module I<must> be a bareword.
+
+In the peculiar C<use VERSION> form, VERSION may be either a numeric
+argument such as 5.006, which will be compared to C<$]>, or a literal of
+the form v5.6.1, which will be compared to C<$^V> (aka $PERL_VERSION). A
+fatal error is produced if VERSION is greater than the version of the
+current Perl interpreter; Perl will not attempt to parse the rest of the
+file. Compare with L</require>, which can do a similar check at run time.
+Symmetrically, C<no VERSION> allows you to specify that you want a version
+of perl older than the specified one.
+
+Specifying VERSION as a literal of the form v5.6.1 should generally be
+avoided, because it leads to misleading error messages under earlier
+versions of Perl (that is, prior to 5.6.0) that do not support this
+syntax. The equivalent numeric version should be used instead.
+
+ use v5.6.1; # compile time version check
+ use 5.6.1; # ditto
+ use 5.006_001; # ditto; preferred for backwards compatibility
+
+This is often useful if you need to check the current Perl version before
+C<use>ing library modules that won't work with older versions of Perl.
+(We try not to do this more than we have to.)
+
+Also, if the specified perl version is greater than or equal to 5.9.5,
+C<use VERSION> will also load the C<feature> pragma and enable all
+features available in the requested version. See L<feature>.
+
+The C<BEGIN> forces the C<require> and C<import> to happen at compile time. The
+C<require> makes sure the module is loaded into memory if it hasn't been
+yet. The C<import> is not a builtin--it's just an ordinary static method
+call into the C<Module> package to tell the module to import the list of
+features back into the current package. The module can implement its
+C<import> method any way it likes, though most modules just choose to
+derive their C<import> method via inheritance from the C<Exporter> class that
+is defined in the C<Exporter> module. See L<Exporter>. If no C<import>
+method can be found then the call is skipped, even if there is an AUTOLOAD
+method.
+
+If you do not want to call the package's C<import> method (for instance,
+to stop your namespace from being altered), explicitly supply the empty list:
+
+ use Module ();
+
+That is exactly equivalent to
+
+ BEGIN { require Module }
+
+If the VERSION argument is present between Module and LIST, then the
+C<use> will call the VERSION method in class Module with the given
+version as an argument. The default VERSION method, inherited from
+the UNIVERSAL class, croaks if the given version is larger than the
+value of the variable C<$Module::VERSION>.
+
+Again, there is a distinction between omitting LIST (C<import> called
+with no arguments) and an explicit empty LIST C<()> (C<import> not
+called). Note that there is no comma after VERSION!
+
+Because this is a wide-open interface, pragmas (compiler directives)
+are also implemented this way. Currently implemented pragmas are:
+
+ use constant;
+ use diagnostics;
+ use integer;
+ use sigtrap qw(SEGV BUS);
+ use strict qw(subs vars refs);
+ use subs qw(afunc blurfl);
+ use warnings qw(all);
+ use sort qw(stable _quicksort _mergesort);
+
+Some of these pseudo-modules import semantics into the current
+block scope (like C<strict> or C<integer>, unlike ordinary modules,
+which import symbols into the current package (which are effective
+through the end of the file).
+
+There's a corresponding C<no> command that unimports meanings imported
+by C<use>, i.e., it calls C<unimport Module LIST> instead of C<import>.
+It behaves exactly as C<import> does with respect to VERSION, an
+omitted LIST, empty LIST, or no unimport method being found.
+
+ no integer;
+ no strict 'refs';
+ no warnings;
+
+See L<perlmodlib> for a list of standard modules and pragmas. See L<perlrun>
+for the C<-M> and C<-m> command-line options to perl that give C<use>
+functionality from the command-line.
+
+=item utime LIST
+X<utime>
+
+Changes the access and modification times on each file of a list of
+files. The first two elements of the list must be the NUMERICAL access
+and modification times, in that order. Returns the number of files
+successfully changed. The inode change time of each file is set
+to the current time. For example, this code has the same effect as the
+Unix touch(1) command when the files I<already exist> and belong to
+the user running the program:
+
+ #!/usr/bin/perl
+ $atime = $mtime = time;
+ utime $atime, $mtime, @ARGV;
+
+Since perl 5.7.2, if the first two elements of the list are C<undef>, then
+the utime(2) function in the C library will be called with a null second
+argument. On most systems, this will set the file's access and
+modification times to the current time (i.e. equivalent to the example
+above) and will even work on other users' files where you have write
+permission:
+
+ utime undef, undef, @ARGV;
+
+Under NFS this will use the time of the NFS server, not the time of
+the local machine. If there is a time synchronization problem, the
+NFS server and local machine will have different times. The Unix
+touch(1) command will in fact normally use this form instead of the
+one shown in the first example.
+
+Note that only passing one of the first two elements as C<undef> will
+be equivalent of passing it as 0 and will not have the same effect as
+described when they are both C<undef>. This case will also trigger an
+uninitialized warning.
+
+On systems that support futimes, you might pass file handles among the
+files. On systems that don't support futimes, passing file handles
+produces a fatal error at run time. The file handles must be passed
+as globs or references to be recognized. Barewords are considered
+file names.
+
+=item values HASH
+X<values>
+
+Returns a list consisting of all the values of the named hash.
+(In a scalar context, returns the number of values.)
+
+The values are returned in an apparently random order. The actual
+random order is subject to change in future versions of perl, but it
+is guaranteed to be the same order as either the C<keys> or C<each>
+function would produce on the same (unmodified) hash. Since Perl
+5.8.1 the ordering is different even between different runs of Perl
+for security reasons (see L<perlsec/"Algorithmic Complexity Attacks">).
+
+As a side effect, calling values() resets the HASH's internal iterator,
+see L</each>. (In particular, calling values() in void context resets
+the iterator with no other overhead.)
+
+Note that the values are not copied, which means modifying them will
+modify the contents of the hash:
+
+ for (values %hash) { s/foo/bar/g } # modifies %hash values
+ for (@hash{keys %hash}) { s/foo/bar/g } # same
+
+See also C<keys>, C<each>, and C<sort>.
+
+=item vec EXPR,OFFSET,BITS
+X<vec> X<bit> X<bit vector>
+
+Treats the string in EXPR as a bit vector made up of elements of
+width BITS, and returns the value of the element specified by OFFSET
+as an unsigned integer. BITS therefore specifies the number of bits
+that are reserved for each element in the bit vector. This must
+be a power of two from 1 to 32 (or 64, if your platform supports
+that).
+
+If BITS is 8, "elements" coincide with bytes of the input string.
+
+If BITS is 16 or more, bytes of the input string are grouped into chunks
+of size BITS/8, and each group is converted to a number as with
+pack()/unpack() with big-endian formats C<n>/C<N> (and analogously
+for BITS==64). See L<"pack"> for details.
+
+If bits is 4 or less, the string is broken into bytes, then the bits
+of each byte are broken into 8/BITS groups. Bits of a byte are
+numbered in a little-endian-ish way, as in C<0x01>, C<0x02>,
+C<0x04>, C<0x08>, C<0x10>, C<0x20>, C<0x40>, C<0x80>. For example,
+breaking the single input byte C<chr(0x36)> into two groups gives a list
+C<(0x6, 0x3)>; breaking it into 4 groups gives C<(0x2, 0x1, 0x3, 0x0)>.
+
+C<vec> may also be assigned to, in which case parentheses are needed
+to give the expression the correct precedence as in
+
+ vec($image, $max_x * $x + $y, 8) = 3;
+
+If the selected element is outside the string, the value 0 is returned.
+If an element off the end of the string is written to, Perl will first
+extend the string with sufficiently many zero bytes. It is an error
+to try to write off the beginning of the string (i.e. negative OFFSET).
+
+If the string happens to be encoded as UTF-8 internally (and thus has
+the UTF8 flag set), this is ignored by C<vec>, and it operates on the
+internal byte string, not the conceptual character string, even if you
+only have characters with values less than 256.
+
+Strings created with C<vec> can also be manipulated with the logical
+operators C<|>, C<&>, C<^>, and C<~>. These operators will assume a bit
+vector operation is desired when both operands are strings.
+See L<perlop/"Bitwise String Operators">.
+
+The following code will build up an ASCII string saying C<'PerlPerlPerl'>.
+The comments show the string after each step. Note that this code works
+in the same way on big-endian or little-endian machines.
+
+ my $foo = '';
+ vec($foo, 0, 32) = 0x5065726C; # 'Perl'
+
+ # $foo eq "Perl" eq "\x50\x65\x72\x6C", 32 bits
+ print vec($foo, 0, 8); # prints 80 == 0x50 == ord('P')
+
+ vec($foo, 2, 16) = 0x5065; # 'PerlPe'
+ vec($foo, 3, 16) = 0x726C; # 'PerlPerl'
+ vec($foo, 8, 8) = 0x50; # 'PerlPerlP'
+ vec($foo, 9, 8) = 0x65; # 'PerlPerlPe'
+ vec($foo, 20, 4) = 2; # 'PerlPerlPe' . "\x02"
+ vec($foo, 21, 4) = 7; # 'PerlPerlPer'
+ # 'r' is "\x72"
+ vec($foo, 45, 2) = 3; # 'PerlPerlPer' . "\x0c"
+ vec($foo, 93, 1) = 1; # 'PerlPerlPer' . "\x2c"
+ vec($foo, 94, 1) = 1; # 'PerlPerlPerl'
+ # 'l' is "\x6c"
+
+To transform a bit vector into a string or list of 0's and 1's, use these:
+
+ $bits = unpack("b*", $vector);
+ @bits = split(//, unpack("b*", $vector));
+
+If you know the exact length in bits, it can be used in place of the C<*>.
+
+Here is an example to illustrate how the bits actually fall in place:
+
+ #!/usr/bin/perl -wl
+
+ print <<'EOT';
+ 0 1 2 3
+ unpack("V",$_) 01234567890123456789012345678901
+ ------------------------------------------------------------------
+ EOT
+
+ for $w (0..3) {
+ $width = 2**$w;
+ for ($shift=0; $shift < $width; ++$shift) {
+ for ($off=0; $off < 32/$width; ++$off) {
+ $str = pack("B*", "0"x32);
+ $bits = (1<<$shift);
+ vec($str, $off, $width) = $bits;
+ $res = unpack("b*",$str);
+ $val = unpack("V", $str);
+ write;
+ }
+ }
+ }
+
+ format STDOUT =
+ vec($_,@#,@#) = @<< == @######### @>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ $off, $width, $bits, $val, $res
+ .
+ __END__
+
+Regardless of the machine architecture on which it is run, the above
+example should print the following table:
+
+ 0 1 2 3
+ unpack("V",$_) 01234567890123456789012345678901
+ ------------------------------------------------------------------
+ vec($_, 0, 1) = 1 == 1 10000000000000000000000000000000
+ vec($_, 1, 1) = 1 == 2 01000000000000000000000000000000
+ vec($_, 2, 1) = 1 == 4 00100000000000000000000000000000
+ vec($_, 3, 1) = 1 == 8 00010000000000000000000000000000
+ vec($_, 4, 1) = 1 == 16 00001000000000000000000000000000
+ vec($_, 5, 1) = 1 == 32 00000100000000000000000000000000
+ vec($_, 6, 1) = 1 == 64 00000010000000000000000000000000
+ vec($_, 7, 1) = 1 == 128 00000001000000000000000000000000
+ vec($_, 8, 1) = 1 == 256 00000000100000000000000000000000
+ vec($_, 9, 1) = 1 == 512 00000000010000000000000000000000
+ vec($_,10, 1) = 1 == 1024 00000000001000000000000000000000
+ vec($_,11, 1) = 1 == 2048 00000000000100000000000000000000
+ vec($_,12, 1) = 1 == 4096 00000000000010000000000000000000
+ vec($_,13, 1) = 1 == 8192 00000000000001000000000000000000
+ vec($_,14, 1) = 1 == 16384 00000000000000100000000000000000
+ vec($_,15, 1) = 1 == 32768 00000000000000010000000000000000
+ vec($_,16, 1) = 1 == 65536 00000000000000001000000000000000
+ vec($_,17, 1) = 1 == 131072 00000000000000000100000000000000
+ vec($_,18, 1) = 1 == 262144 00000000000000000010000000000000
+ vec($_,19, 1) = 1 == 524288 00000000000000000001000000000000
+ vec($_,20, 1) = 1 == 1048576 00000000000000000000100000000000
+ vec($_,21, 1) = 1 == 2097152 00000000000000000000010000000000
+ vec($_,22, 1) = 1 == 4194304 00000000000000000000001000000000
+ vec($_,23, 1) = 1 == 8388608 00000000000000000000000100000000
+ vec($_,24, 1) = 1 == 16777216 00000000000000000000000010000000
+ vec($_,25, 1) = 1 == 33554432 00000000000000000000000001000000
+ vec($_,26, 1) = 1 == 67108864 00000000000000000000000000100000
+ vec($_,27, 1) = 1 == 134217728 00000000000000000000000000010000
+ vec($_,28, 1) = 1 == 268435456 00000000000000000000000000001000
+ vec($_,29, 1) = 1 == 536870912 00000000000000000000000000000100
+ vec($_,30, 1) = 1 == 1073741824 00000000000000000000000000000010
+ vec($_,31, 1) = 1 == 2147483648 00000000000000000000000000000001
+ vec($_, 0, 2) = 1 == 1 10000000000000000000000000000000
+ vec($_, 1, 2) = 1 == 4 00100000000000000000000000000000
+ vec($_, 2, 2) = 1 == 16 00001000000000000000000000000000
+ vec($_, 3, 2) = 1 == 64 00000010000000000000000000000000
+ vec($_, 4, 2) = 1 == 256 00000000100000000000000000000000
+ vec($_, 5, 2) = 1 == 1024 00000000001000000000000000000000
+ vec($_, 6, 2) = 1 == 4096 00000000000010000000000000000000
+ vec($_, 7, 2) = 1 == 16384 00000000000000100000000000000000
+ vec($_, 8, 2) = 1 == 65536 00000000000000001000000000000000
+ vec($_, 9, 2) = 1 == 262144 00000000000000000010000000000000
+ vec($_,10, 2) = 1 == 1048576 00000000000000000000100000000000
+ vec($_,11, 2) = 1 == 4194304 00000000000000000000001000000000
+ vec($_,12, 2) = 1 == 16777216 00000000000000000000000010000000
+ vec($_,13, 2) = 1 == 67108864 00000000000000000000000000100000
+ vec($_,14, 2) = 1 == 268435456 00000000000000000000000000001000
+ vec($_,15, 2) = 1 == 1073741824 00000000000000000000000000000010
+ vec($_, 0, 2) = 2 == 2 01000000000000000000000000000000
+ vec($_, 1, 2) = 2 == 8 00010000000000000000000000000000
+ vec($_, 2, 2) = 2 == 32 00000100000000000000000000000000
+ vec($_, 3, 2) = 2 == 128 00000001000000000000000000000000
+ vec($_, 4, 2) = 2 == 512 00000000010000000000000000000000
+ vec($_, 5, 2) = 2 == 2048 00000000000100000000000000000000
+ vec($_, 6, 2) = 2 == 8192 00000000000001000000000000000000
+ vec($_, 7, 2) = 2 == 32768 00000000000000010000000000000000
+ vec($_, 8, 2) = 2 == 131072 00000000000000000100000000000000
+ vec($_, 9, 2) = 2 == 524288 00000000000000000001000000000000
+ vec($_,10, 2) = 2 == 2097152 00000000000000000000010000000000
+ vec($_,11, 2) = 2 == 8388608 00000000000000000000000100000000
+ vec($_,12, 2) = 2 == 33554432 00000000000000000000000001000000
+ vec($_,13, 2) = 2 == 134217728 00000000000000000000000000010000
+ vec($_,14, 2) = 2 == 536870912 00000000000000000000000000000100
+ vec($_,15, 2) = 2 == 2147483648 00000000000000000000000000000001
+ vec($_, 0, 4) = 1 == 1 10000000000000000000000000000000
+ vec($_, 1, 4) = 1 == 16 00001000000000000000000000000000
+ vec($_, 2, 4) = 1 == 256 00000000100000000000000000000000
+ vec($_, 3, 4) = 1 == 4096 00000000000010000000000000000000
+ vec($_, 4, 4) = 1 == 65536 00000000000000001000000000000000
+ vec($_, 5, 4) = 1 == 1048576 00000000000000000000100000000000
+ vec($_, 6, 4) = 1 == 16777216 00000000000000000000000010000000
+ vec($_, 7, 4) = 1 == 268435456 00000000000000000000000000001000
+ vec($_, 0, 4) = 2 == 2 01000000000000000000000000000000
+ vec($_, 1, 4) = 2 == 32 00000100000000000000000000000000
+ vec($_, 2, 4) = 2 == 512 00000000010000000000000000000000
+ vec($_, 3, 4) = 2 == 8192 00000000000001000000000000000000
+ vec($_, 4, 4) = 2 == 131072 00000000000000000100000000000000
+ vec($_, 5, 4) = 2 == 2097152 00000000000000000000010000000000
+ vec($_, 6, 4) = 2 == 33554432 00000000000000000000000001000000
+ vec($_, 7, 4) = 2 == 536870912 00000000000000000000000000000100
+ vec($_, 0, 4) = 4 == 4 00100000000000000000000000000000
+ vec($_, 1, 4) = 4 == 64 00000010000000000000000000000000
+ vec($_, 2, 4) = 4 == 1024 00000000001000000000000000000000
+ vec($_, 3, 4) = 4 == 16384 00000000000000100000000000000000
+ vec($_, 4, 4) = 4 == 262144 00000000000000000010000000000000
+ vec($_, 5, 4) = 4 == 4194304 00000000000000000000001000000000
+ vec($_, 6, 4) = 4 == 67108864 00000000000000000000000000100000
+ vec($_, 7, 4) = 4 == 1073741824 00000000000000000000000000000010
+ vec($_, 0, 4) = 8 == 8 00010000000000000000000000000000
+ vec($_, 1, 4) = 8 == 128 00000001000000000000000000000000
+ vec($_, 2, 4) = 8 == 2048 00000000000100000000000000000000
+ vec($_, 3, 4) = 8 == 32768 00000000000000010000000000000000
+ vec($_, 4, 4) = 8 == 524288 00000000000000000001000000000000
+ vec($_, 5, 4) = 8 == 8388608 00000000000000000000000100000000
+ vec($_, 6, 4) = 8 == 134217728 00000000000000000000000000010000
+ vec($_, 7, 4) = 8 == 2147483648 00000000000000000000000000000001
+ vec($_, 0, 8) = 1 == 1 10000000000000000000000000000000
+ vec($_, 1, 8) = 1 == 256 00000000100000000000000000000000
+ vec($_, 2, 8) = 1 == 65536 00000000000000001000000000000000
+ vec($_, 3, 8) = 1 == 16777216 00000000000000000000000010000000
+ vec($_, 0, 8) = 2 == 2 01000000000000000000000000000000
+ vec($_, 1, 8) = 2 == 512 00000000010000000000000000000000
+ vec($_, 2, 8) = 2 == 131072 00000000000000000100000000000000
+ vec($_, 3, 8) = 2 == 33554432 00000000000000000000000001000000
+ vec($_, 0, 8) = 4 == 4 00100000000000000000000000000000
+ vec($_, 1, 8) = 4 == 1024 00000000001000000000000000000000
+ vec($_, 2, 8) = 4 == 262144 00000000000000000010000000000000
+ vec($_, 3, 8) = 4 == 67108864 00000000000000000000000000100000
+ vec($_, 0, 8) = 8 == 8 00010000000000000000000000000000
+ vec($_, 1, 8) = 8 == 2048 00000000000100000000000000000000
+ vec($_, 2, 8) = 8 == 524288 00000000000000000001000000000000
+ vec($_, 3, 8) = 8 == 134217728 00000000000000000000000000010000
+ vec($_, 0, 8) = 16 == 16 00001000000000000000000000000000
+ vec($_, 1, 8) = 16 == 4096 00000000000010000000000000000000
+ vec($_, 2, 8) = 16 == 1048576 00000000000000000000100000000000
+ vec($_, 3, 8) = 16 == 268435456 00000000000000000000000000001000
+ vec($_, 0, 8) = 32 == 32 00000100000000000000000000000000
+ vec($_, 1, 8) = 32 == 8192 00000000000001000000000000000000
+ vec($_, 2, 8) = 32 == 2097152 00000000000000000000010000000000
+ vec($_, 3, 8) = 32 == 536870912 00000000000000000000000000000100
+ vec($_, 0, 8) = 64 == 64 00000010000000000000000000000000
+ vec($_, 1, 8) = 64 == 16384 00000000000000100000000000000000
+ vec($_, 2, 8) = 64 == 4194304 00000000000000000000001000000000
+ vec($_, 3, 8) = 64 == 1073741824 00000000000000000000000000000010
+ vec($_, 0, 8) = 128 == 128 00000001000000000000000000000000
+ vec($_, 1, 8) = 128 == 32768 00000000000000010000000000000000
+ vec($_, 2, 8) = 128 == 8388608 00000000000000000000000100000000
+ vec($_, 3, 8) = 128 == 2147483648 00000000000000000000000000000001
+
+=item wait
+X<wait>
+
+Behaves like the wait(2) system call on your system: it waits for a child
+process to terminate and returns the pid of the deceased process, or
+C<-1> if there are no child processes. The status is returned in C<$?>
+and C<${^CHILD_ERROR_NATIVE}>.
+Note that a return value of C<-1> could mean that child processes are
+being automatically reaped, as described in L<perlipc>.
+
+=item waitpid PID,FLAGS
+X<waitpid>
+
+Waits for a particular child process to terminate and returns the pid of
+the deceased process, or C<-1> if there is no such child process. On some
+systems, a value of 0 indicates that there are processes still running.
+The status is returned in C<$?> and C<${^CHILD_ERROR_NATIVE}>. If you say
+
+ use POSIX ":sys_wait_h";
+ #...
+ do {
+ $kid = waitpid(-1, WNOHANG);
+ } while $kid > 0;
+
+then you can do a non-blocking wait for all pending zombie processes.
+Non-blocking wait is available on machines supporting either the
+waitpid(2) or wait4(2) system calls. However, waiting for a particular
+pid with FLAGS of C<0> is implemented everywhere. (Perl emulates the
+system call by remembering the status values of processes that have
+exited but have not been harvested by the Perl script yet.)
+
+Note that on some systems, a return value of C<-1> could mean that child
+processes are being automatically reaped. See L<perlipc> for details,
+and for other examples.
+
+=item wantarray
+X<wantarray> X<context>
+
+Returns true if the context of the currently executing subroutine or
+C<eval> is looking for a list value. Returns false if the context is
+looking for a scalar. Returns the undefined value if the context is
+looking for no value (void context).
+
+ return unless defined wantarray; # don't bother doing more
+ my @a = complex_calculation();
+ return wantarray ? @a : "@a";
+
+C<wantarray()>'s result is unspecified in the top level of a file,
+in a C<BEGIN>, C<UNITCHECK>, C<CHECK>, C<INIT> or C<END> block, or
+in a C<DESTROY> method.
+
+This function should have been named wantlist() instead.
+
+=item warn LIST
+X<warn> X<warning> X<STDERR>
+
+Prints the value of LIST to STDERR. If the last element of LIST does
+not end in a newline, it appends the same file/line number text as C<die>
+does.
+
+If LIST is empty and C<$@> already contains a value (typically from a
+previous eval) that value is used after appending C<"\t...caught">
+to C<$@>. This is useful for staying almost, but not entirely similar to
+C<die>.
+
+If C<$@> is empty then the string C<"Warning: Something's wrong"> is used.
+
+No message is printed if there is a C<$SIG{__WARN__}> handler
+installed. It is the handler's responsibility to deal with the message
+as it sees fit (like, for instance, converting it into a C<die>). Most
+handlers must therefore make arrangements to actually display the
+warnings that they are not prepared to deal with, by calling C<warn>
+again in the handler. Note that this is quite safe and will not
+produce an endless loop, since C<__WARN__> hooks are not called from
+inside one.
+
+You will find this behavior is slightly different from that of
+C<$SIG{__DIE__}> handlers (which don't suppress the error text, but can
+instead call C<die> again to change it).
+
+Using a C<__WARN__> handler provides a powerful way to silence all
+warnings (even the so-called mandatory ones). An example:
+
+ # wipe out *all* compile-time warnings
+ BEGIN { $SIG{'__WARN__'} = sub { warn $_[0] if $DOWARN } }
+ my $foo = 10;
+ my $foo = 20; # no warning about duplicate my $foo,
+ # but hey, you asked for it!
+ # no compile-time or run-time warnings before here
+ $DOWARN = 1;
+
+ # run-time warnings enabled after here
+ warn "\$foo is alive and $foo!"; # does show up
+
+See L<perlvar> for details on setting C<%SIG> entries, and for more
+examples. See the Carp module for other kinds of warnings using its
+carp() and cluck() functions.
+
+=item write FILEHANDLE
+X<write>
+
+=item write EXPR
+
+=item write
+
+Writes a formatted record (possibly multi-line) to the specified FILEHANDLE,
+using the format associated with that file. By default the format for
+a file is the one having the same name as the filehandle, but the
+format for the current output channel (see the C<select> function) may be set
+explicitly by assigning the name of the format to the C<$~> variable.
+
+Top of form processing is handled automatically: if there is
+insufficient room on the current page for the formatted record, the
+page is advanced by writing a form feed, a special top-of-page format
+is used to format the new page header, and then the record is written.
+By default the top-of-page format is the name of the filehandle with
+"_TOP" appended, but it may be dynamically set to the format of your
+choice by assigning the name to the C<$^> variable while the filehandle is
+selected. The number of lines remaining on the current page is in
+variable C<$->, which can be set to C<0> to force a new page.
+
+If FILEHANDLE is unspecified, output goes to the current default output
+channel, which starts out as STDOUT but may be changed by the
+C<select> operator. If the FILEHANDLE is an EXPR, then the expression
+is evaluated and the resulting string is used to look up the name of
+the FILEHANDLE at run time. For more on formats, see L<perlform>.
+
+Note that write is I<not> the opposite of C<read>. Unfortunately.
+
+=item y///
+
+The transliteration operator. Same as C<tr///>. See
+L<perlop/"Quote and Quote-like Operators">.
+
+=back
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlglossary.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlglossary.pod
new file mode 100755
index 00000000000..f0240b0c9e5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlglossary.pod
@@ -0,0 +1,3408 @@
+=head1 NAME
+
+perlglossary - Perl Glossary
+
+=head1 DESCRIPTION
+
+A glossary of terms (technical and otherwise) used in the Perl documentation.
+Other useful sources include the Free On-Line Dictionary of Computing
+L<http://foldoc.doc.ic.ac.uk/foldoc/index.html>, the Jargon File
+L<http://catb.org/~esr/jargon/>, and Wikipedia L<http://www.wikipedia.org/>.
+
+=head2 A
+
+=over 4
+
+=item accessor methods
+
+A L</method> used to indirectly inspect or update an L</object>'s
+state (its L<instance variables|/instance variable>).
+
+=item actual arguments
+
+The L<scalar values|/scalar value> that you supply to a L</function>
+or L</subroutine> when you call it. For instance, when you call
+C<power("puff")>, the string C<"puff"> is the actual argument. See
+also L</argument> and L</formal arguments>.
+
+=item address operator
+
+Some languages work directly with the memory addresses of values, but
+this can be like playing with fire. Perl provides a set of asbestos
+gloves for handling all memory management. The closest to an address
+operator in Perl is the backslash operator, but it gives you a L</hard
+reference>, which is much safer than a memory address.
+
+=item algorithm
+
+A well-defined sequence of steps, clearly enough explained that even a
+computer could do them.
+
+=item alias
+
+A nickname for something, which behaves in all ways as though you'd
+used the original name instead of the nickname. Temporary aliases are
+implicitly created in the loop variable for C<foreach> loops, in the
+C<$_> variable for L<map|perlfunc/map> or L<grep|perlfunc/grep>
+operators, in C<$a> and C<$b> during L<sort|perlfunc/sort>'s
+comparison function, and in each element of C<@_> for the L</actual
+arguments> of a subroutine call. Permanent aliases are explicitly
+created in L<packages|/package> by L<importing|/import> symbols or by
+assignment to L<typeglobs|/typeglob>. Lexically scoped aliases for
+package variables are explicitly created by the L<our|perlfunc/our>
+declaration.
+
+=item alternatives
+
+A list of possible choices from which you may select only one, as in
+"Would you like door A, B, or C?" Alternatives in regular expressions
+are separated with a single vertical bar: C<|>. Alternatives in
+normal Perl expressions are separated with a double vertical bar:
+C<||>. Logical alternatives in L</Boolean> expressions are separated
+with either C<||> or C<or>.
+
+=item anonymous
+
+Used to describe a L</referent> that is not directly accessible
+through a named L</variable>. Such a referent must be indirectly
+accessible through at least one L</hard reference>. When the last
+hard reference goes away, the anonymous referent is destroyed without
+pity.
+
+=item architecture
+
+The kind of computer you're working on, where one "kind" of computer
+means all those computers sharing a compatible machine language.
+Since Perl programs are (typically) simple text files, not executable
+images, a Perl program is much less sensitive to the architecture it's
+running on than programs in other languages, such as C, that are
+compiled into machine code. See also L</platform> and L</operating
+system>.
+
+=item argument
+
+A piece of data supplied to a L<program|/executable file>,
+L</subroutine>, L</function>, or L</method> to tell it what it's
+supposed to do. Also called a "parameter".
+
+=item ARGV
+
+The name of the array containing the L</argument> L</vector> from the
+command line. If you use the empty C<< E<lt>E<gt> >> operator, L</ARGV> is
+the name of both the L</filehandle> used to traverse the arguments and
+the L</scalar> containing the name of the current input file.
+
+=item arithmetical operator
+
+A L</symbol> such as C<+> or C</> that tells Perl to do the arithmetic
+you were supposed to learn in grade school.
+
+=item array
+
+An ordered sequence of L<values|/value>, stored such that you can
+easily access any of the values using an integer L</subscript>
+that specifies the value's L</offset> in the sequence.
+
+=item array context
+
+An archaic expression for what is more correctly referred to as
+L</list context>.
+
+=item ASCII
+
+The American Standard Code for Information Interchange (a 7-bit
+character set adequate only for poorly representing English text).
+Often used loosely to describe the lowest 128 values of the various
+ISO-8859-X character sets, a bunch of mutually incompatible 8-bit
+codes best described as half ASCII. See also L</Unicode>.
+
+=item assertion
+
+A component of a L</regular expression> that must be true for the
+pattern to match but does not necessarily match any characters itself.
+Often used specifically to mean a L</zero width> assertion.
+
+=item assignment
+
+An L</operator> whose assigned mission in life is to change the value
+of a L</variable>.
+
+=item assignment operator
+
+Either a regular L</assignment>, or a compound L</operator> composed
+of an ordinary assignment and some other operator, that changes the
+value of a variable in place, that is, relative to its old value. For
+example, C<$a += 2> adds C<2> to C<$a>.
+
+=item associative array
+
+See L</hash>. Please.
+
+=item associativity
+
+Determines whether you do the left L</operator> first or the right
+L</operator> first when you have "A L</operator> B L</operator> C" and
+the two operators are of the same precedence. Operators like C<+> are
+left associative, while operators like C<**> are right associative.
+See L<perlop> for a list of operators and their associativity.
+
+=item asynchronous
+
+Said of events or activities whose relative temporal ordering is
+indeterminate because too many things are going on at once. Hence, an
+asynchronous event is one you didn't know when to expect.
+
+=item atom
+
+A L</regular expression> component potentially matching a
+L</substring> containing one or more characters and treated as an
+indivisible syntactic unit by any following L</quantifier>. (Contrast
+with an L</assertion> that matches something of L</zero width> and may
+not be quantified.)
+
+=item atomic operation
+
+When Democritus gave the word "atom" to the indivisible bits of
+matter, he meant literally something that could not be cut: I<a->
+(not) + I<tomos> (cuttable). An atomic operation is an action that
+can't be interrupted, not one forbidden in a nuclear-free zone.
+
+=item attribute
+
+A new feature that allows the declaration of L<variables|/variable>
+and L<subroutines|/subroutine> with modifiers as in C<sub foo : locked
+method>. Also, another name for an L</instance variable> of an
+L</object>.
+
+=item autogeneration
+
+A feature of L</operator overloading> of L<objects|/object>, whereby
+the behavior of certain L<operators|/operator> can be reasonably
+deduced using more fundamental operators. This assumes that the
+overloaded operators will often have the same relationships as the
+regular operators. See L<perlop>.
+
+=item autoincrement
+
+To add one to something automatically, hence the name of the C<++>
+operator. To instead subtract one from something automatically is
+known as an "autodecrement".
+
+=item autoload
+
+To load on demand. (Also called "lazy" loading.) Specifically, to
+call an L<AUTOLOAD|perlsub/Autoloading> subroutine on behalf of an
+undefined subroutine.
+
+=item autosplit
+
+To split a string automatically, as the B<-a> L</switch> does when
+running under B<-p> or B<-n> in order to emulate L</awk>. (See also
+the L<AutoSplit> module, which has nothing to do with the B<-a>
+switch, but a lot to do with autoloading.)
+
+=item autovivification
+
+A Greco-Roman word meaning "to bring oneself to life". In Perl,
+storage locations (L<lvalues|/lvalue>) spontaneously generate
+themselves as needed, including the creation of any L</hard reference>
+values to point to the next level of storage. The assignment
+C<$a[5][5][5][5][5] = "quintet"> potentially creates five scalar
+storage locations, plus four references (in the first four scalar
+locations) pointing to four new anonymous arrays (to hold the last
+four scalar locations). But the point of autovivification is that you
+don't have to worry about it.
+
+=item AV
+
+Short for "array value", which refers to one of Perl's internal data
+types that holds an L</array>. The L</AV> type is a subclass of
+L</SV>.
+
+=item awk
+
+Descriptive editing term--short for "awkward". Also coincidentally
+refers to a venerable text-processing language from which Perl derived
+some of its high-level ideas.
+
+=back
+
+=head2 B
+
+=over 4
+
+=item backreference
+
+A substring L<captured|/capturing> by a subpattern within
+unadorned parentheses in a L</regex>. Backslashed decimal numbers
+(C<\1>, C<\2>, etc.) later in the same pattern refer back to the
+corresponding subpattern in the current match. Outside the pattern,
+the numbered variables (C<$1>, C<$2>, etc.) continue to refer to these
+same values, as long as the pattern was the last successful match of
+the current dynamic scope.
+
+=item backtracking
+
+The practice of saying, "If I had to do it all over, I'd do it
+differently," and then actually going back and doing it all over
+differently. Mathematically speaking, it's returning from an
+unsuccessful recursion on a tree of possibilities. Perl backtracks
+when it attempts to match patterns with a L</regular expression>, and
+its earlier attempts don't pan out. See L<perlre/Backtracking>.
+
+=item backward compatibility
+
+Means you can still run your old program because we didn't break any
+of the features or bugs it was relying on.
+
+=item bareword
+
+A word sufficiently ambiguous to be deemed illegal under L<use strict
+'subs'|strict/strict subs>. In the absence of that stricture, a
+bareword is treated as if quotes were around it.
+
+=item base class
+
+A generic L</object> type; that is, a L</class> from which other, more
+specific classes are derived genetically by L</inheritance>. Also
+called a "superclass" by people who respect their ancestors.
+
+=item big-endian
+
+From Swift: someone who eats eggs big end first. Also used of
+computers that store the most significant L</byte> of a word at a
+lower byte address than the least significant byte. Often considered
+superior to little-endian machines. See also L</little-endian>.
+
+=item binary
+
+Having to do with numbers represented in base 2. That means there's
+basically two numbers, 0 and 1. Also used to describe a "non-text
+file", presumably because such a file makes full use of all the binary
+bits in its bytes. With the advent of L</Unicode>, this distinction,
+already suspect, loses even more of its meaning.
+
+=item binary operator
+
+An L</operator> that takes two L<operands|/operand>.
+
+=item bind
+
+To assign a specific L</network address> to a L</socket>.
+
+=item bit
+
+An integer in the range from 0 to 1, inclusive. The smallest possible
+unit of information storage. An eighth of a L</byte> or of a dollar.
+(The term "Pieces of Eight" comes from being able to split the old
+Spanish dollar into 8 bits, each of which still counted for money.
+That's why a 25-cent piece today is still "two bits".)
+
+=item bit shift
+
+The movement of bits left or right in a computer word, which has the
+effect of multiplying or dividing by a power of 2.
+
+=item bit string
+
+A sequence of L<bits|/bit> that is actually being thought of as a
+sequence of bits, for once.
+
+=item bless
+
+In corporate life, to grant official approval to a thing, as in, "The
+VP of Engineering has blessed our WebCruncher project." Similarly in
+Perl, to grant official approval to a L</referent> so that it can
+function as an L</object>, such as a WebCruncher object. See
+L<perlfunc/"bless">.
+
+=item block
+
+What a L</process> does when it has to wait for something: "My process
+blocked waiting for the disk." As an unrelated noun, it refers to a
+large chunk of data, of a size that the L</operating system> likes to
+deal with (normally a power of two such as 512 or 8192). Typically
+refers to a chunk of data that's coming from or going to a disk file.
+
+=item BLOCK
+
+A syntactic construct consisting of a sequence of Perl
+L<statements|/statement> that is delimited by braces. The C<if> and
+C<while> statements are defined in terms of L<BLOCKs|/BLOCK>, for instance.
+Sometimes we also say "block" to mean a lexical scope; that is, a
+sequence of statements that act like a L</BLOCK>, such as within an
+L<eval|perlfunc/eval> or a file, even though the statements aren't
+delimited by braces.
+
+=item block buffering
+
+A method of making input and output efficient by passing one L</block>
+at a time. By default, Perl does block buffering to disk files. See
+L</buffer> and L</command buffering>.
+
+=item Boolean
+
+A value that is either L</true> or L</false>.
+
+=item Boolean context
+
+A special kind of L</scalar context> used in conditionals to decide
+whether the L</scalar value> returned by an expression is L</true> or
+L</false>. Does not evaluate as either a string or a number. See
+L</context>.
+
+=item breakpoint
+
+A spot in your program where you've told the debugger to stop
+L<execution|/execute> so you can poke around and see whether anything
+is wrong yet.
+
+=item broadcast
+
+To send a L</datagram> to multiple destinations simultaneously.
+
+=item BSD
+
+A psychoactive drug, popular in the 80s, probably developed at
+U. C. Berkeley or thereabouts. Similar in many ways to the
+prescription-only medication called "System V", but infinitely more
+useful. (Or, at least, more fun.) The full chemical name is
+"Berkeley Standard Distribution".
+
+=item bucket
+
+A location in a L</hash table> containing (potentially) multiple
+entries whose keys "hash" to the same hash value according to its hash
+function. (As internal policy, you don't have to worry about it,
+unless you're into internals, or policy.)
+
+=item buffer
+
+A temporary holding location for data. L<Block buffering|/block
+buffering> means that the data is passed on to its destination
+whenever the buffer is full. L<Line buffering|/line buffering> means
+that it's passed on whenever a complete line is received. L<Command
+buffering|/command buffering> means that it's passed every time you do
+a L<print|perlfunc/print> command (or equivalent). If your output is
+unbuffered, the system processes it one byte at a time without the use
+of a holding area. This can be rather inefficient.
+
+=item built-in
+
+A L</function> that is predefined in the language. Even when hidden
+by L</overriding>, you can always get at a built-in function by
+L<qualifying|/qualified> its name with the C<CORE::> pseudo-package.
+
+=item bundle
+
+A group of related modules on L</CPAN>. (Also, sometimes refers to a
+group of command-line switches grouped into one L</switch cluster>.)
+
+=item byte
+
+A piece of data worth eight L<bits|/bit> in most places.
+
+=item bytecode
+
+A pidgin-like language spoken among 'droids when they don't wish to
+reveal their orientation (see L</endian>). Named after some similar
+languages spoken (for similar reasons) between compilers and
+interpreters in the late 20th century. These languages are
+characterized by representing everything as a
+non-architecture-dependent sequence of bytes.
+
+=back
+
+=head2 C
+
+=over 4
+
+=item C
+
+A language beloved by many for its inside-out L</type> definitions,
+inscrutable L</precedence> rules, and heavy L</overloading> of the
+function-call mechanism. (Well, actually, people first switched to C
+because they found lowercase identifiers easier to read than upper.)
+Perl is written in C, so it's not surprising that Perl borrowed a few
+ideas from it.
+
+=item C preprocessor
+
+The typical C compiler's first pass, which processes lines beginning
+with C<#> for conditional compilation and macro definition and does
+various manipulations of the program text based on the current
+definitions. Also known as I<cpp>(1).
+
+=item call by reference
+
+An L</argument>-passing mechanism in which the L</formal arguments>
+refer directly to the L</actual arguments>, and the L</subroutine> can
+change the actual arguments by changing the formal arguments. That
+is, the formal argument is an L</alias> for the actual argument. See
+also L</call by value>.
+
+=item call by value
+
+An L</argument>-passing mechanism in which the L</formal arguments>
+refer to a copy of the L</actual arguments>, and the L</subroutine>
+cannot change the actual arguments by changing the formal arguments.
+See also L</call by reference>.
+
+=item callback
+
+A L</handler> that you register with some other part of your program
+in the hope that the other part of your program will L</trigger> your
+handler when some event of interest transpires.
+
+=item canonical
+
+Reduced to a standard form to facilitate comparison.
+
+=item capturing
+
+The use of parentheses around a L</subpattern> in a L</regular
+expression> to store the matched L</substring> as a L</backreference>.
+(Captured strings are also returned as a list in L</list context>.)
+
+=item character
+
+A small integer representative of a unit of orthography.
+Historically, characters were usually stored as fixed-width integers
+(typically in a byte, or maybe two, depending on the character set),
+but with the advent of UTF-8, characters are often stored in a
+variable number of bytes depending on the size of the integer that
+represents the character. Perl manages this transparently for you,
+for the most part.
+
+=item character class
+
+A square-bracketed list of characters used in a L</regular expression>
+to indicate that any character of the set may occur at a given point.
+Loosely, any predefined set of characters so used.
+
+=item character property
+
+A predefined L</character class> matchable by the C<\p>
+L</metasymbol>. Many standard properties are defined for L</Unicode>.
+
+=item circumfix operator
+
+An L</operator> that surrounds its L</operand>, like the angle
+operator, or parentheses, or a hug.
+
+=item class
+
+A user-defined L</type>, implemented in Perl via a L</package> that
+provides (either directly or by inheritance) L<methods|/method> (that
+is, L<subroutines|/subroutine>) to handle L<instances|/instance> of
+the class (its L<objects|/object>). See also L</inheritance>.
+
+=item class method
+
+A L</method> whose L</invocant> is a L</package> name, not an
+L</object> reference. A method associated with the class as a whole.
+
+=item client
+
+In networking, a L</process> that initiates contact with a L</server>
+process in order to exchange data and perhaps receive a service.
+
+=item cloister
+
+A L</cluster> used to restrict the scope of a L</regular expression
+modifier>.
+
+=item closure
+
+An L</anonymous> subroutine that, when a reference to it is generated
+at run time, keeps track of the identities of externally visible
+L<lexical variables|/lexical variable> even after those lexical
+variables have supposedly gone out of L</scope>. They're called
+"closures" because this sort of behavior gives mathematicians a sense
+of closure.
+
+=item cluster
+
+A parenthesized L</subpattern> used to group parts of a L</regular
+expression> into a single L</atom>.
+
+=item CODE
+
+The word returned by the L<ref|perlfunc/ref> function when you apply
+it to a reference to a subroutine. See also L</CV>.
+
+=item code generator
+
+A system that writes code for you in a low-level language, such as
+code to implement the backend of a compiler. See L</program
+generator>.
+
+=item code subpattern
+
+A L</regular expression> subpattern whose real purpose is to execute
+some Perl code, for example, the C<(?{...})> and C<(??{...})>
+subpatterns.
+
+=item collating sequence
+
+The order into which L<characters|/character> sort. This is used by
+L</string> comparison routines to decide, for example, where in this
+glossary to put "collating sequence".
+
+=item command
+
+In L</shell> programming, the syntactic combination of a program name
+and its arguments. More loosely, anything you type to a shell (a
+command interpreter) that starts it doing something. Even more
+loosely, a Perl L</statement>, which might start with a L</label> and
+typically ends with a semicolon.
+
+=item command buffering
+
+A mechanism in Perl that lets you store up the output of each Perl
+L</command> and then flush it out as a single request to the
+L</operating system>. It's enabled by setting the C<$|>
+(C<$AUTOFLUSH>) variable to a true value. It's used when you don't
+want data sitting around not going where it's supposed to, which may
+happen because the default on a L</file> or L</pipe> is to use
+L</block buffering>.
+
+=item command name
+
+The name of the program currently executing, as typed on the command
+line. In C, the L</command> name is passed to the program as the
+first command-line argument. In Perl, it comes in separately as
+C<$0>.
+
+=item command-line arguments
+
+The L<values|/value> you supply along with a program name when you
+tell a L</shell> to execute a L</command>. These values are passed to
+a Perl program through C<@ARGV>.
+
+=item comment
+
+A remark that doesn't affect the meaning of the program. In Perl, a
+comment is introduced by a C<#> character and continues to the end of
+the line.
+
+=item compilation unit
+
+The L</file> (or L</string>, in the case of L<eval|perlfunc/eval>)
+that is currently being compiled.
+
+=item compile phase
+
+Any time before Perl starts running your main program. See also
+L</run phase>. Compile phase is mostly spent in L</compile time>, but
+may also be spent in L</run time> when C<BEGIN> blocks,
+L<use|perlfunc/use> declarations, or constant subexpressions are being
+evaluated. The startup and import code of any L<use|perlfunc/use>
+declaration is also run during compile phase.
+
+=item compile time
+
+The time when Perl is trying to make sense of your code, as opposed to
+when it thinks it knows what your code means and is merely trying to
+do what it thinks your code says to do, which is L</run time>.
+
+=item compiler
+
+Strictly speaking, a program that munches up another program and spits
+out yet another file containing the program in a "more executable"
+form, typically containing native machine instructions. The I<perl>
+program is not a compiler by this definition, but it does contain a
+kind of compiler that takes a program and turns it into a more
+executable form (L<syntax trees|/syntax tree>) within the I<perl>
+process itself, which the L</interpreter> then interprets. There are,
+however, extension L<modules|/module> to get Perl to act more like a
+"real" compiler. See L<O>.
+
+=item composer
+
+A "constructor" for a L</referent> that isn't really an L</object>,
+like an anonymous array or a hash (or a sonata, for that matter). For
+example, a pair of braces acts as a composer for a hash, and a pair of
+brackets acts as a composer for an array. See L<perlref/Making
+References>.
+
+=item concatenation
+
+The process of gluing one cat's nose to another cat's tail. Also, a
+similar operation on two L<strings|/string>.
+
+=item conditional
+
+Something "iffy". See L</Boolean context>.
+
+=item connection
+
+In telephony, the temporary electrical circuit between the caller's
+and the callee's phone. In networking, the same kind of temporary
+circuit between a L</client> and a L</server>.
+
+=item construct
+
+As a noun, a piece of syntax made up of smaller pieces. As a
+transitive verb, to create an L</object> using a L</constructor>.
+
+=item constructor
+
+Any L</class method>, instance L</method>, or L</subroutine>
+that composes, initializes, blesses, and returns an L</object>.
+Sometimes we use the term loosely to mean a L</composer>.
+
+=item context
+
+The surroundings, or environment. The context given by the
+surrounding code determines what kind of data a particular
+L</expression> is expected to return. The three primary contexts are
+L</list context>, L</scalar context>, and L</void context>. Scalar
+context is sometimes subdivided into L</Boolean context>, L</numeric
+context>, L</string context>, and L</void context>. There's also a
+"don't care" scalar context (which is dealt with in Programming Perl,
+Third Edition, Chapter 2, "Bits and Pieces" if you care).
+
+=item continuation
+
+The treatment of more than one physical L</line> as a single logical
+line. L</Makefile> lines are continued by putting a backslash before
+the L</newline>. Mail headers as defined by RFC 822 are continued by
+putting a space or tab I<after> the newline. In general, lines in
+Perl do not need any form of continuation mark, because L</whitespace>
+(including newlines) is gleefully ignored. Usually.
+
+=item core dump
+
+The corpse of a L</process>, in the form of a file left in the
+L</working directory> of the process, usually as a result of certain
+kinds of fatal error.
+
+=item CPAN
+
+The Comprehensive Perl Archive Network. (See L<perlfaq2/What modules and extensions are available for Perl? What is CPAN? What does CPANE<sol>srcE<sol>... mean?>).
+
+=item cracker
+
+Someone who breaks security on computer systems. A cracker may be a
+true L</hacker> or only a L</script kiddie>.
+
+=item current package
+
+The L</package> in which the current statement is compiled. Scan
+backwards in the text of your program through the current L<lexical
+scope|/lexical scoping> or any enclosing lexical scopes till you find
+a package declaration. That's your current package name.
+
+=item current working directory
+
+See L</working directory>.
+
+=item currently selected output channel
+
+The last L</filehandle> that was designated with
+L<select|perlfunc/select>(C<FILEHANDLE>); L</STDOUT>, if no filehandle
+has been selected.
+
+=item CV
+
+An internal "code value" typedef, holding a L</subroutine>. The L</CV>
+type is a subclass of L</SV>.
+
+=back
+
+=head2 D
+
+=over 4
+
+=item dangling statement
+
+A bare, single L</statement>, without any braces, hanging off an C<if>
+or C<while> conditional. C allows them. Perl doesn't.
+
+=item data structure
+
+How your various pieces of data relate to each other and what shape
+they make when you put them all together, as in a rectangular table or
+a triangular-shaped tree.
+
+=item data type
+
+A set of possible values, together with all the operations that know
+how to deal with those values. For example, a numeric data type has a
+certain set of numbers that you can work with and various mathematical
+operations that you can do on the numbers but would make little sense
+on, say, a string such as C<"Kilroy">. Strings have their own
+operations, such as L</concatenation>. Compound types made of a
+number of smaller pieces generally have operations to compose and
+decompose them, and perhaps to rearrange them. L<Objects|/object>
+that model things in the real world often have operations that
+correspond to real activities. For instance, if you model an
+elevator, your elevator object might have an C<open_door()>
+L</method>.
+
+=item datagram
+
+A packet of data, such as a L</UDP> message, that (from the viewpoint
+of the programs involved) can be sent independently over the network.
+(In fact, all packets are sent independently at the L</IP> level, but
+L</stream> protocols such as L</TCP> hide this from your program.)
+
+=item DBM
+
+Stands for "Data Base Management" routines, a set of routines that
+emulate an L</associative array> using disk files. The routines use a
+dynamic hashing scheme to locate any entry with only two disk
+accesses. DBM files allow a Perl program to keep a persistent
+L</hash> across multiple invocations. You can L<tie|perlfunc/tie>
+your hash variables to various DBM implementations--see L<AnyDBM_File>
+and L<DB_File>.
+
+=item declaration
+
+An L</assertion> that states something exists and perhaps describes
+what it's like, without giving any commitment as to how or where
+you'll use it. A declaration is like the part of your recipe that
+says, "two cups flour, one large egg, four or five tadpoles..." See
+L</statement> for its opposite. Note that some declarations also
+function as statements. Subroutine declarations also act as
+definitions if a body is supplied.
+
+=item decrement
+
+To subtract a value from a variable, as in "decrement C<$x>" (meaning
+to remove 1 from its value) or "decrement C<$x> by 3".
+
+=item default
+
+A L</value> chosen for you if you don't supply a value of your own.
+
+=item defined
+
+Having a meaning. Perl thinks that some of the things people try to
+do are devoid of meaning, in particular, making use of variables that
+have never been given a L</value> and performing certain operations on
+data that isn't there. For example, if you try to read data past the
+end of a file, Perl will hand you back an undefined value. See also
+L</false> and L<perlfunc/defined>.
+
+=item delimiter
+
+A L</character> or L</string> that sets bounds to an arbitrarily-sized
+textual object, not to be confused with a L</separator> or
+L</terminator>. "To delimit" really just means "to surround" or "to
+enclose" (like these parentheses are doing).
+
+=item deprecated modules and features
+
+Deprecated modules and features are those which were part of a stable
+release, but later found to be subtly flawed, and which should be avoided.
+They are subject to removal and/or bug-incompatible reimplementation in
+the next major release (but they will be preserved through maintenance
+releases). Deprecation warnings are issued under B<-w> or C<use
+diagnostics>, and notices are found in L<perldelta>s, as well as various
+other PODs. Coding practices that misuse features, such as C<my $foo if
+0>, can also be deprecated.
+
+=item dereference
+
+A fancy computer science term meaning "to follow a L</reference> to
+what it points to". The "de" part of it refers to the fact that
+you're taking away one level of L</indirection>.
+
+=item derived class
+
+A L</class> that defines some of its L<methods|/method> in terms of a
+more generic class, called a L</base class>. Note that classes aren't
+classified exclusively into base classes or derived classes: a class
+can function as both a derived class and a base class simultaneously,
+which is kind of classy.
+
+=item descriptor
+
+See L</file descriptor>.
+
+=item destroy
+
+To deallocate the memory of a L</referent> (first triggering its
+C<DESTROY> method, if it has one).
+
+=item destructor
+
+A special L</method> that is called when an L</object> is thinking
+about L<destroying|/destroy> itself. A Perl program's C<DESTROY>
+method doesn't do the actual destruction; Perl just
+L<triggers|/trigger> the method in case the L</class> wants to do any
+associated cleanup.
+
+=item device
+
+A whiz-bang hardware gizmo (like a disk or tape drive or a modem or a
+joystick or a mouse) attached to your computer, that the L</operating
+system> tries to make look like a L</file> (or a bunch of files).
+Under Unix, these fake files tend to live in the I</dev> directory.
+
+=item directive
+
+A L</pod> directive. See L<perlpod>.
+
+=item directory
+
+A special file that contains other files. Some L<operating
+systems|/operating system> call these "folders", "drawers", or
+"catalogs".
+
+=item directory handle
+
+A name that represents a particular instance of opening a directory to
+read it, until you close it. See the L<opendir|perlfunc/opendir>
+function.
+
+=item dispatch
+
+To send something to its correct destination. Often used
+metaphorically to indicate a transfer of programmatic control to a
+destination selected algorithmically, often by lookup in a table of
+function L<references|/reference> or, in the case of object
+L<methods|/method>, by traversing the inheritance tree looking for the
+most specific definition for the method.
+
+=item distribution
+
+A standard, bundled release of a system of software. The default
+usage implies source code is included. If that is not the case, it
+will be called a "binary-only" distribution.
+
+=item (to be) dropped modules
+
+When Perl 5 was first released (see L<perlhistory>), several modules were
+included, which have now fallen out of common use. It has been suggested
+that these modules should be removed, since the distribution became rather
+large, and the common criterion for new module additions is now limited to
+modules that help to build, test, and extend perl itself. Furthermore,
+the CPAN (which didn't exist at the time of Perl 5.0) can become the new
+home of dropped modules. Dropping modules is currently not an option, but
+further developments may clear the last barriers.
+
+=item dweomer
+
+An enchantment, illusion, phantasm, or jugglery. Said when Perl's
+magical L</dwimmer> effects don't do what you expect, but rather seem
+to be the product of arcane dweomercraft, sorcery, or wonder working.
+[From Old English]
+
+=item dwimmer
+
+DWIM is an acronym for "Do What I Mean", the principle that something
+should just do what you want it to do without an undue amount of fuss.
+A bit of code that does "dwimming" is a "dwimmer". Dwimming can
+require a great deal of behind-the-scenes magic, which (if it doesn't
+stay properly behind the scenes) is called a L</dweomer> instead.
+
+=item dynamic scoping
+
+Dynamic scoping works over a dynamic scope, making variables visible
+throughout the rest of the L</block> in which they are first used and
+in any L<subroutines|/subroutine> that are called by the rest of the
+block. Dynamically scoped variables can have their values temporarily
+changed (and implicitly restored later) by a L<local|perlfunc/local>
+operator. (Compare L</lexical scoping>.) Used more loosely to mean
+how a subroutine that is in the middle of calling another subroutine
+"contains" that subroutine at L</run time>.
+
+=back
+
+=head2 E
+
+=over 4
+
+=item eclectic
+
+Derived from many sources. Some would say I<too> many.
+
+=item element
+
+A basic building block. When you're talking about an L</array>, it's
+one of the items that make up the array.
+
+=item embedding
+
+When something is contained in something else, particularly when that
+might be considered surprising: "I've embedded a complete Perl
+interpreter in my editor!"
+
+=item empty subclass test
+
+The notion that an empty L</derived class> should behave exactly like
+its L</base class>.
+
+=item en passant
+
+When you change a L</value> as it is being copied. [From French, "in
+passing", as in the exotic pawn-capturing maneuver in chess.]
+
+=item encapsulation
+
+The veil of abstraction separating the L</interface> from the
+L</implementation> (whether enforced or not), which mandates that all
+access to an L</object>'s state be through L<methods|/method> alone.
+
+=item endian
+
+See L</little-endian> and L</big-endian>.
+
+=item environment
+
+The collective set of L<environment variables|/environment variable>
+your L</process> inherits from its parent. Accessed via C<%ENV>.
+
+=item environment variable
+
+A mechanism by which some high-level agent such as a user can pass its
+preferences down to its future offspring (child L<processes|/process>,
+grandchild processes, great-grandchild processes, and so on). Each
+environment variable is a L</key>/L</value> pair, like one entry in a
+L</hash>.
+
+=item EOF
+
+End of File. Sometimes used metaphorically as the terminating string
+of a L</here document>.
+
+=item errno
+
+The error number returned by a L</syscall> when it fails. Perl refers
+to the error by the name C<$!> (or C<$OS_ERROR> if you use the English
+module).
+
+=item error
+
+See L</exception> or L</fatal error>.
+
+=item escape sequence
+
+See L</metasymbol>.
+
+=item exception
+
+A fancy term for an error. See L</fatal error>.
+
+=item exception handling
+
+The way a program responds to an error. The exception handling
+mechanism in Perl is the L<eval|perlfunc/eval> operator.
+
+=item exec
+
+To throw away the current L</process>'s program and replace it with
+another without exiting the process or relinquishing any resources
+held (apart from the old memory image).
+
+=item executable file
+
+A L</file> that is specially marked to tell the L</operating system>
+that it's okay to run this file as a program. Usually shortened to
+"executable".
+
+=item execute
+
+To run a L<program|/executable file> or L</subroutine>. (Has nothing
+to do with the L<kill|perlfunc/kill> built-in, unless you're trying to
+run a L</signal handler>.)
+
+=item execute bit
+
+The special mark that tells the operating system it can run this
+program. There are actually three execute bits under Unix, and which
+bit gets used depends on whether you own the file singularly,
+collectively, or not at all.
+
+=item exit status
+
+See L</status>.
+
+=item export
+
+To make symbols from a L</module> available for L</import> by other modules.
+
+=item expression
+
+Anything you can legally say in a spot where a L</value> is required.
+Typically composed of L<literals|/literal>, L<variables|/variable>,
+L<operators|/operator>, L<functions|/function>, and L</subroutine>
+calls, not necessarily in that order.
+
+=item extension
+
+A Perl module that also pulls in compiled C or C++ code. More
+generally, any experimental option that can be compiled into Perl,
+such as multithreading.
+
+=back
+
+=head2 F
+
+=over 4
+
+=item false
+
+In Perl, any value that would look like C<""> or C<"0"> if evaluated
+in a string context. Since undefined values evaluate to C<"">, all
+undefined values are false, but not all false values are undefined.
+
+=item FAQ
+
+Frequently Asked Question (although not necessarily frequently
+answered, especially if the answer appears in the Perl FAQ shipped
+standard with Perl).
+
+=item fatal error
+
+An uncaught L</exception>, which causes termination of the L</process>
+after printing a message on your L</standard error> stream. Errors
+that happen inside an L<eval|perlfunc/eval> are not fatal. Instead,
+the L<eval|perlfunc/eval> terminates after placing the exception
+message in the C<$@> (C<$EVAL_ERROR>) variable. You can try to
+provoke a fatal error with the L<die|perlfunc/die> operator (known as
+throwing or raising an exception), but this may be caught by a
+dynamically enclosing L<eval|perlfunc/eval>. If not caught, the
+L<die|perlfunc/die> becomes a fatal error.
+
+=item field
+
+A single piece of numeric or string data that is part of a longer
+L</string>, L</record>, or L</line>. Variable-width fields are usually
+split up by L<separators|/separator> (so use L<split|perlfunc/split> to
+extract the fields), while fixed-width fields are usually at fixed
+positions (so use L<unpack|perlfunc/unpack>). L<Instance
+variables|/instance variable> are also known as fields.
+
+=item FIFO
+
+First In, First Out. See also L</LIFO>. Also, a nickname for a
+L</named pipe>.
+
+=item file
+
+A named collection of data, usually stored on disk in a L</directory>
+in a L</filesystem>. Roughly like a document, if you're into office
+metaphors. In modern filesystems, you can actually give a file more
+than one name. Some files have special properties, like directories
+and devices.
+
+=item file descriptor
+
+The little number the L</operating system> uses to keep track of which
+opened L</file> you're talking about. Perl hides the file descriptor
+inside a L</standard IE<sol>O> stream and then attaches the stream to
+a L</filehandle>.
+
+=item file test operator
+
+A built-in unary operator that you use to determine whether something
+is L</true> about a file, such as C<-o $filename> to test whether
+you're the owner of the file.
+
+=item fileglob
+
+A "wildcard" match on L<filenames|/filename>. See the
+L<glob|perlfunc/glob> function.
+
+=item filehandle
+
+An identifier (not necessarily related to the real name of a file)
+that represents a particular instance of opening a file until you
+close it. If you're going to open and close several different files
+in succession, it's fine to open each of them with the same
+filehandle, so you don't have to write out separate code to process
+each file.
+
+=item filename
+
+One name for a file. This name is listed in a L</directory>, and you
+can use it in an L<open|perlfunc/open> to tell the L</operating
+system> exactly which file you want to open, and associate the file
+with a L</filehandle> which will carry the subsequent identity of that
+file in your program, until you close it.
+
+=item filesystem
+
+A set of L<directories|/directory> and L<files|/file> residing on a
+partition of the disk. Sometimes known as a "partition". You can
+change the file's name or even move a file around from directory to
+directory within a filesystem without actually moving the file itself,
+at least under Unix.
+
+=item filter
+
+A program designed to take a L</stream> of input and transform it into
+a stream of output.
+
+=item flag
+
+We tend to avoid this term because it means so many things. It may
+mean a command-line L</switch> that takes no argument
+itself (such as Perl's B<-n> and B<-p>
+flags) or, less frequently, a single-bit indicator (such as the
+C<O_CREAT> and C<O_EXCL> flags used in
+L<sysopen|perlfunc/sysopen>).
+
+=item floating point
+
+A method of storing numbers in "scientific notation", such that the
+precision of the number is independent of its magnitude (the decimal
+point "floats"). Perl does its numeric work with floating-point
+numbers (sometimes called "floats"), when it can't get away with
+using L<integers|/integer>. Floating-point numbers are mere
+approximations of real numbers.
+
+=item flush
+
+The act of emptying a L</buffer>, often before it's full.
+
+=item FMTEYEWTK
+
+Far More Than Everything You Ever Wanted To Know. An exhaustive
+treatise on one narrow topic, something of a super-L</FAQ>. See Tom
+for far more.
+
+=item fork
+
+To create a child L</process> identical to the parent process at its
+moment of conception, at least until it gets ideas of its own. A
+thread with protected memory.
+
+=item formal arguments
+
+The generic names by which a L</subroutine> knows its
+L<arguments|/argument>. In many languages, formal arguments are
+always given individual names, but in Perl, the formal arguments are
+just the elements of an array. The formal arguments to a Perl program
+are C<$ARGV[0]>, C<$ARGV[1]>, and so on. Similarly, the formal
+arguments to a Perl subroutine are C<$_[0]>, C<$_[1]>, and so on. You
+may give the arguments individual names by assigning the values to a
+L<my|perlfunc/my> list. See also L</actual arguments>.
+
+=item format
+
+A specification of how many spaces and digits and things to put
+somewhere so that whatever you're printing comes out nice and pretty.
+
+=item freely available
+
+Means you don't have to pay money to get it, but the copyright on it
+may still belong to someone else (like Larry).
+
+=item freely redistributable
+
+Means you're not in legal trouble if you give a bootleg copy of it to
+your friends and we find out about it. In fact, we'd rather you gave
+a copy to all your friends.
+
+=item freeware
+
+Historically, any software that you give away, particularly if you
+make the source code available as well. Now often called C<open
+source software>. Recently there has been a trend to use the term in
+contradistinction to L</open source software>, to refer only to free
+software released under the Free Software Foundation's GPL (General
+Public License), but this is difficult to justify etymologically.
+
+=item function
+
+Mathematically, a mapping of each of a set of input values to a
+particular output value. In computers, refers to a L</subroutine> or
+L</operator> that returns a L</value>. It may or may not have input
+values (called L<arguments|/argument>).
+
+=item funny character
+
+Someone like Larry, or one of his peculiar friends. Also refers to
+the strange prefixes that Perl requires as noun markers on its
+variables.
+
+=item garbage collection
+
+A misnamed feature--it should be called, "expecting your mother to
+pick up after you". Strictly speaking, Perl doesn't do this, but it
+relies on a reference-counting mechanism to keep things tidy.
+However, we rarely speak strictly and will often refer to the
+reference-counting scheme as a form of garbage collection. (If it's
+any comfort, when your interpreter exits, a "real" garbage collector
+runs to make sure everything is cleaned up if you've been messy with
+circular references and such.)
+
+=back
+
+=head2 G
+
+=over 4
+
+=item GID
+
+Group ID--in Unix, the numeric group ID that the L</operating system>
+uses to identify you and members of your L</group>.
+
+=item glob
+
+Strictly, the shell's C<*> character, which will match a "glob" of
+characters when you're trying to generate a list of filenames.
+Loosely, the act of using globs and similar symbols to do pattern
+matching. See also L</fileglob> and L</typeglob>.
+
+=item global
+
+Something you can see from anywhere, usually used of
+L<variables|/variable> and L<subroutines|/subroutine> that are visible
+everywhere in your program. In Perl, only certain special variables
+are truly global--most variables (and all subroutines) exist only in
+the current L</package>. Global variables can be declared with
+L<our|perlfunc/our>. See L<perlfunc/our>.
+
+=item global destruction
+
+The L</garbage collection> of globals (and the running of any
+associated object destructors) that takes place when a Perl
+L</interpreter> is being shut down. Global destruction should not be
+confused with the Apocalypse, except perhaps when it should.
+
+=item glue language
+
+A language such as Perl that is good at hooking things together that
+weren't intended to be hooked together.
+
+=item granularity
+
+The size of the pieces you're dealing with, mentally speaking.
+
+=item greedy
+
+A L</subpattern> whose L</quantifier> wants to match as many things as
+possible.
+
+=item grep
+
+Originally from the old Unix editor command for "Globally search for a
+Regular Expression and Print it", now used in the general sense of any
+kind of search, especially text searches. Perl has a built-in
+L<grep|perlfunc/grep> function that searches a list for elements
+matching any given criterion, whereas the I<grep>(1) program searches
+for lines matching a L</regular expression> in one or more files.
+
+=item group
+
+A set of users of which you are a member. In some operating systems
+(like Unix), you can give certain file access permissions to other
+members of your group.
+
+=item GV
+
+An internal "glob value" typedef, holding a L</typeglob>. The L</GV>
+type is a subclass of L</SV>.
+
+=back
+
+=head2 H
+
+=over 4
+
+=item hacker
+
+Someone who is brilliantly persistent in solving technical problems,
+whether these involve golfing, fighting orcs, or programming. Hacker
+is a neutral term, morally speaking. Good hackers are not to be
+confused with evil L<crackers|/cracker> or clueless L<script
+kiddies|/script kiddie>. If you confuse them, we will presume that
+you are either evil or clueless.
+
+=item handler
+
+A L</subroutine> or L</method> that is called by Perl when your
+program needs to respond to some internal event, such as a L</signal>,
+or an encounter with an operator subject to L</operator overloading>.
+See also L</callback>.
+
+=item hard reference
+
+A L</scalar> L</value> containing the actual address of a
+L</referent>, such that the referent's L</reference> count accounts
+for it. (Some hard references are held internally, such as the
+implicit reference from one of a L</typeglob>'s variable slots to its
+corresponding referent.) A hard reference is different from a
+L</symbolic reference>.
+
+=item hash
+
+An unordered association of L</key>/L</value> pairs, stored such that
+you can easily use a string L</key> to look up its associated data
+L</value>. This glossary is like a hash, where the word to be defined
+is the key, and the definition is the value. A hash is also sometimes
+septisyllabically called an "associative array", which is a pretty
+good reason for simply calling it a "hash" instead.
+
+=item hash table
+
+A data structure used internally by Perl for implementing associative
+arrays (hashes) efficiently. See also L</bucket>.
+
+=item header file
+
+A file containing certain required definitions that you must include
+"ahead" of the rest of your program to do certain obscure operations.
+A C header file has a I<.h> extension. Perl doesn't really have
+header files, though historically Perl has sometimes used translated
+I<.h> files with a I<.ph> extension. See L<perlfunc/require>.
+(Header files have been superseded by the L</module> mechanism.)
+
+=item here document
+
+So called because of a similar construct in L<shells|/shell> that
+pretends that the L<lines|/line> following the L</command> are a
+separate L</file> to be fed to the command, up to some terminating
+string. In Perl, however, it's just a fancy form of quoting.
+
+=item hexadecimal
+
+A number in base 16, "hex" for short. The digits for 10 through 16
+are customarily represented by the letters C<a> through C<f>.
+Hexadecimal constants in Perl start with C<0x>. See also
+L<perlfunc/hex>.
+
+=item home directory
+
+The directory you are put into when you log in. On a Unix system, the
+name is often placed into C<$ENV{HOME}> or C<$ENV{LOGDIR}> by
+I<login>, but you can also find it with C<(getpwuid($E<lt>))[7]>.
+(Some platforms do not have a concept of a home directory.)
+
+=item host
+
+The computer on which a program or other data resides.
+
+=item hubris
+
+Excessive pride, the sort of thing Zeus zaps you for. Also the
+quality that makes you write (and maintain) programs that other people
+won't want to say bad things about. Hence, the third great virtue of
+a programmer. See also L</laziness> and L</impatience>.
+
+=item HV
+
+Short for a "hash value" typedef, which holds Perl's internal
+representation of a hash. The L</HV> type is a subclass of L</SV>.
+
+=back
+
+=head2 I
+
+=over 4
+
+=item identifier
+
+A legally formed name for most anything in which a computer program
+might be interested. Many languages (including Perl) allow
+identifiers that start with a letter and contain letters and digits.
+Perl also counts the underscore character as a valid letter. (Perl
+also has more complicated names, such as L</qualified> names.)
+
+=item impatience
+
+The anger you feel when the computer is being lazy. This makes you
+write programs that don't just react to your needs, but actually
+anticipate them. Or at least that pretend to. Hence, the second
+great virtue of a programmer. See also L</laziness> and L</hubris>.
+
+=item implementation
+
+How a piece of code actually goes about doing its job. Users of the
+code should not count on implementation details staying the same
+unless they are part of the published L</interface>.
+
+=item import
+
+To gain access to symbols that are exported from another module. See
+L<perlfunc/use>.
+
+=item increment
+
+To increase the value of something by 1 (or by some other number, if
+so specified).
+
+=item indexing
+
+In olden days, the act of looking up a L</key> in an actual index
+(such as a phone book), but now merely the act of using any kind of
+key or position to find the corresponding L</value>, even if no index
+is involved. Things have degenerated to the point that Perl's
+L<index|perlfunc/index> function merely locates the position (index)
+of one string in another.
+
+=item indirect filehandle
+
+An L</expression> that evaluates to something that can be used as a
+L</filehandle>: a L</string> (filehandle name), a L</typeglob>, a
+typeglob L</reference>, or a low-level L</IO> object.
+
+=item indirect object
+
+In English grammar, a short noun phrase between a verb and its direct
+object indicating the beneficiary or recipient of the action. In
+Perl, C<print STDOUT "$foo\n";> can be understood as "verb
+indirect-object object" where L</STDOUT> is the recipient of the
+L<print|perlfunc/print> action, and C<"$foo"> is the object being
+printed. Similarly, when invoking a L</method>, you might place the
+invocant between the method and its arguments:
+
+ $gollum = new Pathetic::Creature "Smeagol";
+ give $gollum "Fisssssh!";
+ give $gollum "Precious!";
+
+In modern Perl, calling methods this way is often considered bad practice and
+to be avoided.
+
+=item indirect object slot
+
+The syntactic position falling between a method call and its arguments
+when using the indirect object invocation syntax. (The slot is
+distinguished by the absence of a comma between it and the next
+argument.) L</STDERR> is in the indirect object slot here:
+
+ print STDERR "Awake! Awake! Fear, Fire,
+ Foes! Awake!\n";
+
+=item indirection
+
+If something in a program isn't the value you're looking for but
+indicates where the value is, that's indirection. This can be done
+with either L<symbolic references|/symbolic reference> or L<hard
+references|/hard reference>.
+
+=item infix
+
+An L</operator> that comes in between its L<operands|/operand>, such
+as multiplication in C<24 * 7>.
+
+=item inheritance
+
+What you get from your ancestors, genetically or otherwise. If you
+happen to be a L</class>, your ancestors are called L<base
+classes|/base class> and your descendants are called L<derived
+classes|/derived class>. See L</single inheritance> and L</multiple
+inheritance>.
+
+=item instance
+
+Short for "an instance of a class", meaning an L</object> of that L</class>.
+
+=item instance variable
+
+An L</attribute> of an L</object>; data stored with the particular
+object rather than with the class as a whole.
+
+=item integer
+
+A number with no fractional (decimal) part. A counting number, like
+1, 2, 3, and so on, but including 0 and the negatives.
+
+=item interface
+
+The services a piece of code promises to provide forever, in contrast to
+its L</implementation>, which it should feel free to change whenever it
+likes.
+
+=item interpolation
+
+The insertion of a scalar or list value somewhere in the middle of
+another value, such that it appears to have been there all along. In
+Perl, variable interpolation happens in double-quoted strings and
+patterns, and list interpolation occurs when constructing the list of
+values to pass to a list operator or other such construct that takes a
+L</LIST>.
+
+=item interpreter
+
+Strictly speaking, a program that reads a second program and does what
+the second program says directly without turning the program into a
+different form first, which is what L<compilers|/compiler> do. Perl
+is not an interpreter by this definition, because it contains a kind
+of compiler that takes a program and turns it into a more executable
+form (L<syntax trees|/syntax tree>) within the I<perl> process itself,
+which the Perl L</run time> system then interprets.
+
+=item invocant
+
+The agent on whose behalf a L</method> is invoked. In a L</class>
+method, the invocant is a package name. In an L</instance> method,
+the invocant is an object reference.
+
+=item invocation
+
+The act of calling up a deity, daemon, program, method, subroutine, or
+function to get it do what you think it's supposed to do. We usually
+"call" subroutines but "invoke" methods, since it sounds cooler.
+
+=item I/O
+
+Input from, or output to, a L</file> or L</device>.
+
+=item IO
+
+An internal I/O object. Can also mean L</indirect object>.
+
+=item IP
+
+Internet Protocol, or Intellectual Property.
+
+=item IPC
+
+Interprocess Communication.
+
+=item is-a
+
+A relationship between two L<objects|/object> in which one object is
+considered to be a more specific version of the other, generic object:
+"A camel is a mammal." Since the generic object really only exists in
+a Platonic sense, we usually add a little abstraction to the notion of
+objects and think of the relationship as being between a generic
+L</base class> and a specific L</derived class>. Oddly enough,
+Platonic classes don't always have Platonic relationships--see
+L</inheritance>.
+
+=item iteration
+
+Doing something repeatedly.
+
+=item iterator
+
+A special programming gizmo that keeps track of where you are in
+something that you're trying to iterate over. The C<foreach> loop in
+Perl contains an iterator; so does a hash, allowing you to
+L<each|perlfunc/each> through it.
+
+=item IV
+
+The integer four, not to be confused with six, Tom's favorite editor.
+IV also means an internal Integer Value of the type a L</scalar> can
+hold, not to be confused with an L</NV>.
+
+=back
+
+=head2 J
+
+=over 4
+
+=item JAPH
+
+"Just Another Perl Hacker," a clever but cryptic bit of Perl code that
+when executed, evaluates to that string. Often used to illustrate a
+particular Perl feature, and something of an ongoing Obfuscated Perl
+Contest seen in Usenix signatures.
+
+=back
+
+=head2 K
+
+=over 4
+
+=item key
+
+The string index to a L</hash>, used to look up the L</value>
+associated with that key.
+
+=item keyword
+
+See L</reserved words>.
+
+=back
+
+=head2 L
+
+=over 4
+
+=item label
+
+A name you give to a L</statement> so that you can talk about that
+statement elsewhere in the program.
+
+=item laziness
+
+The quality that makes you go to great effort to reduce overall energy
+expenditure. It makes you write labor-saving programs that other
+people will find useful, and document what you wrote so you don't have
+to answer so many questions about it. Hence, the first great virtue
+of a programmer. Also hence, this book. See also L</impatience> and
+L</hubris>.
+
+=item left shift
+
+A L</bit shift> that multiplies the number by some power of 2.
+
+=item leftmost longest
+
+The preference of the L</regular expression> engine to match the
+leftmost occurrence of a L</pattern>, then given a position at which a
+match will occur, the preference for the longest match (presuming the
+use of a L</greedy> quantifier). See L<perlre> for I<much> more on
+this subject.
+
+=item lexeme
+
+Fancy term for a L</token>.
+
+=item lexer
+
+Fancy term for a L</tokener>.
+
+=item lexical analysis
+
+Fancy term for L</tokenizing>.
+
+=item lexical scoping
+
+Looking at your I<Oxford English Dictionary> through a microscope.
+(Also known as L</static scoping>, because dictionaries don't change
+very fast.) Similarly, looking at variables stored in a private
+dictionary (namespace) for each scope, which are visible only from
+their point of declaration down to the end of the lexical scope in
+which they are declared. --Syn. L</static scoping>.
+--Ant. L</dynamic scoping>.
+
+=item lexical variable
+
+A L</variable> subject to L</lexical scoping>, declared by
+L<my|perlfunc/my>. Often just called a "lexical". (The
+L<our|perlfunc/our> declaration declares a lexically scoped name for a
+global variable, which is not itself a lexical variable.)
+
+=item library
+
+Generally, a collection of procedures. In ancient days, referred to a
+collection of subroutines in a I<.pl> file. In modern times, refers
+more often to the entire collection of Perl L<modules|/module> on your
+system.
+
+=item LIFO
+
+Last In, First Out. See also L</FIFO>. A LIFO is usually called a
+L</stack>.
+
+=item line
+
+In Unix, a sequence of zero or more non-newline characters terminated
+with a L</newline> character. On non-Unix machines, this is emulated
+by the C library even if the underlying L</operating system> has
+different ideas.
+
+=item line buffering
+
+Used by a L</standard IE<sol>O> output stream that flushes its
+L</buffer> after every L</newline>. Many standard I/O libraries
+automatically set up line buffering on output that is going to the
+terminal.
+
+=item line number
+
+The number of lines read previous to this one, plus 1. Perl keeps a
+separate line number for each source or input file it opens. The
+current source file's line number is represented by C<__LINE__>. The
+current input line number (for the file that was most recently read
+via C<< E<lt>FHE<gt> >>) is represented by the C<$.>
+(C<$INPUT_LINE_NUMBER>) variable. Many error messages report both
+values, if available.
+
+=item link
+
+Used as a noun, a name in a L</directory>, representing a L</file>. A
+given file can have multiple links to it. It's like having the same
+phone number listed in the phone directory under different names. As
+a verb, to resolve a partially compiled file's unresolved symbols into
+a (nearly) executable image. Linking can generally be static or
+dynamic, which has nothing to do with static or dynamic scoping.
+
+=item LIST
+
+A syntactic construct representing a comma-separated list of
+expressions, evaluated to produce a L</list value>. Each
+L</expression> in a L</LIST> is evaluated in L</list context> and
+interpolated into the list value.
+
+=item list
+
+An ordered set of scalar values.
+
+=item list context
+
+The situation in which an L</expression> is expected by its
+surroundings (the code calling it) to return a list of values rather
+than a single value. Functions that want a L</LIST> of arguments tell
+those arguments that they should produce a list value. See also
+L</context>.
+
+=item list operator
+
+An L</operator> that does something with a list of values, such as
+L<join|perlfunc/join> or L<grep|perlfunc/grep>. Usually used for
+named built-in operators (such as L<print|perlfunc/print>,
+L<unlink|perlfunc/unlink>, and L<system|perlfunc/system>) that do not
+require parentheses around their L</argument> list.
+
+=item list value
+
+An unnamed list of temporary scalar values that may be passed around
+within a program from any list-generating function to any function or
+construct that provides a L</list context>.
+
+=item literal
+
+A token in a programming language such as a number or L</string> that
+gives you an actual L</value> instead of merely representing possible
+values as a L</variable> does.
+
+=item little-endian
+
+From Swift: someone who eats eggs little end first. Also used of
+computers that store the least significant L</byte> of a word at a
+lower byte address than the most significant byte. Often considered
+superior to big-endian machines. See also L</big-endian>.
+
+=item local
+
+Not meaning the same thing everywhere. A global variable in Perl can
+be localized inside a L<dynamic scope|/dynamic scoping> via the
+L<local|perlfunc/local> operator.
+
+=item logical operator
+
+Symbols representing the concepts "and", "or", "xor", and "not".
+
+=item lookahead
+
+An L</assertion> that peeks at the string to the right of the current
+match location.
+
+=item lookbehind
+
+An L</assertion> that peeks at the string to the left of the current
+match location.
+
+=item loop
+
+A construct that performs something repeatedly, like a roller coaster.
+
+=item loop control statement
+
+Any statement within the body of a loop that can make a loop
+prematurely stop looping or skip an L</iteration>. Generally you
+shouldn't try this on roller coasters.
+
+=item loop label
+
+A kind of key or name attached to a loop (or roller coaster) so that
+loop control statements can talk about which loop they want to
+control.
+
+=item lvaluable
+
+Able to serve as an L</lvalue>.
+
+=item lvalue
+
+Term used by language lawyers for a storage location you can assign a
+new L</value> to, such as a L</variable> or an element of an
+L</array>. The "l" is short for "left", as in the left side of an
+assignment, a typical place for lvalues. An L</lvaluable> function or
+expression is one to which a value may be assigned, as in C<pos($x) =
+10>.
+
+=item lvalue modifier
+
+An adjectival pseudofunction that warps the meaning of an L</lvalue>
+in some declarative fashion. Currently there are three lvalue
+modifiers: L<my|perlfunc/my>, L<our|perlfunc/our>, and
+L<local|perlfunc/local>.
+
+=back
+
+=head2 M
+
+=over 4
+
+=item magic
+
+Technically speaking, any extra semantics attached to a variable such
+as C<$!>, C<$0>, C<%ENV>, or C<%SIG>, or to any tied variable.
+Magical things happen when you diddle those variables.
+
+=item magical increment
+
+An L</increment> operator that knows how to bump up alphabetics as
+well as numbers.
+
+=item magical variables
+
+Special variables that have side effects when you access them or
+assign to them. For example, in Perl, changing elements of the
+C<%ENV> array also changes the corresponding environment variables
+that subprocesses will use. Reading the C<$!> variable gives you the
+current system error number or message.
+
+=item Makefile
+
+A file that controls the compilation of a program. Perl programs
+don't usually need a L</Makefile> because the Perl compiler has plenty
+of self-control.
+
+=item man
+
+The Unix program that displays online documentation (manual pages) for
+you.
+
+=item manpage
+
+A "page" from the manuals, typically accessed via the I<man>(1)
+command. A manpage contains a SYNOPSIS, a DESCRIPTION, a list of
+BUGS, and so on, and is typically longer than a page. There are
+manpages documenting L<commands|/command>, L<syscalls|/syscall>,
+L</library> L<functions|/function>, L<devices|/device>,
+L<protocols|/protocol>, L<files|/file>, and such. In this book, we
+call any piece of standard Perl documentation (like I<perlop> or
+I<perldelta>) a manpage, no matter what format it's installed in on
+your system.
+
+=item matching
+
+See L</pattern matching>.
+
+=item member data
+
+See L</instance variable>.
+
+=item memory
+
+This always means your main memory, not your disk. Clouding the issue
+is the fact that your machine may implement L</virtual> memory; that
+is, it will pretend that it has more memory than it really does, and
+it'll use disk space to hold inactive bits. This can make it seem
+like you have a little more memory than you really do, but it's not a
+substitute for real memory. The best thing that can be said about
+virtual memory is that it lets your performance degrade gradually
+rather than suddenly when you run out of real memory. But your
+program can die when you run out of virtual memory too, if you haven't
+thrashed your disk to death first.
+
+=item metacharacter
+
+A L</character> that is I<not> supposed to be treated normally. Which
+characters are to be treated specially as metacharacters varies
+greatly from context to context. Your L</shell> will have certain
+metacharacters, double-quoted Perl L<strings|/string> have other
+metacharacters, and L</regular expression> patterns have all the
+double-quote metacharacters plus some extra ones of their own.
+
+=item metasymbol
+
+Something we'd call a L</metacharacter> except that it's a sequence of
+more than one character. Generally, the first character in the
+sequence must be a true metacharacter to get the other characters in
+the metasymbol to misbehave along with it.
+
+=item method
+
+A kind of action that an L</object> can take if you tell it to. See
+L<perlobj>.
+
+=item minimalism
+
+The belief that "small is beautiful." Paradoxically, if you say
+something in a small language, it turns out big, and if you say it in
+a big language, it turns out small. Go figure.
+
+=item mode
+
+In the context of the L<stat> syscall, refers to the field holding
+the L</permission bits> and the type of the L</file>.
+
+=item modifier
+
+See L</statement modifier>, L</regular expression modifier>, and
+L</lvalue modifier>, not necessarily in that order.
+
+=item module
+
+A L</file> that defines a L</package> of (almost) the same name, which
+can either L</export> symbols or function as an L</object> class. (A
+module's main I<.pm> file may also load in other files in support of
+the module.) See the L<use|perlfunc/use> built-in.
+
+=item modulus
+
+An integer divisor when you're interested in the remainder instead of
+the quotient.
+
+=item monger
+
+Short for Perl Monger, a purveyor of Perl.
+
+=item mortal
+
+A temporary value scheduled to die when the current statement
+finishes.
+
+=item multidimensional array
+
+An array with multiple subscripts for finding a single element. Perl
+implements these using L<references|/reference>--see L<perllol> and
+L<perldsc>.
+
+=item multiple inheritance
+
+The features you got from your mother and father, mixed together
+unpredictably. (See also L</inheritance>, and L</single
+inheritance>.) In computer languages (including Perl), the notion
+that a given class may have multiple direct ancestors or L<base
+classes|/base class>.
+
+=back
+
+=head2 N
+
+=over 4
+
+=item named pipe
+
+A L</pipe> with a name embedded in the L</filesystem> so that it can
+be accessed by two unrelated L<processes|/process>.
+
+=item namespace
+
+A domain of names. You needn't worry about whether the names in one
+such domain have been used in another. See L</package>.
+
+=item network address
+
+The most important attribute of a socket, like your telephone's
+telephone number. Typically an IP address. See also L</port>.
+
+=item newline
+
+A single character that represents the end of a line, with the ASCII
+value of 012 octal under Unix (but 015 on a Mac), and represented by
+C<\n> in Perl strings. For Windows machines writing text files, and
+for certain physical devices like terminals, the single newline gets
+automatically translated by your C library into a line feed and a
+carriage return, but normally, no translation is done.
+
+=item NFS
+
+Network File System, which allows you to mount a remote filesystem as
+if it were local.
+
+=item null character
+
+A character with the ASCII value of zero. It's used by C to terminate
+strings, but Perl allows strings to contain a null.
+
+=item null list
+
+A L</list value> with zero elements, represented in Perl by C<()>.
+
+=item null string
+
+A L</string> containing no characters, not to be confused with a
+string containing a L</null character>, which has a positive length
+and is L</true>.
+
+=item numeric context
+
+The situation in which an expression is expected by its surroundings
+(the code calling it) to return a number. See also L</context> and
+L</string context>.
+
+=item NV
+
+Short for Nevada, no part of which will ever be confused with
+civilization. NV also means an internal floating-point Numeric Value
+of the type a L</scalar> can hold, not to be confused with an L</IV>.
+
+=item nybble
+
+Half a L</byte>, equivalent to one L</hexadecimal> digit, and worth
+four L<bits|/bit>.
+
+=back
+
+=head2 O
+
+=over 4
+
+=item object
+
+An L</instance> of a L</class>. Something that "knows" what
+user-defined type (class) it is, and what it can do because of what
+class it is. Your program can request an object to do things, but the
+object gets to decide whether it wants to do them or not. Some
+objects are more accommodating than others.
+
+=item octal
+
+A number in base 8. Only the digits 0 through 7 are allowed. Octal
+constants in Perl start with 0, as in 013. See also the
+L<oct|perlfunc/oct> function.
+
+=item offset
+
+How many things you have to skip over when moving from the beginning
+of a string or array to a specific position within it. Thus, the
+minimum offset is zero, not one, because you don't skip anything to
+get to the first item.
+
+=item one-liner
+
+An entire computer program crammed into one line of text.
+
+=item open source software
+
+Programs for which the source code is freely available and freely
+redistributable, with no commercial strings attached. For a more
+detailed definition, see L<http://www.opensource.org/osd.html>.
+
+=item operand
+
+An L</expression> that yields a L</value> that an L</operator>
+operates on. See also L</precedence>.
+
+=item operating system
+
+A special program that runs on the bare machine and hides the gory
+details of managing L<processes|/process> and L<devices|/device>.
+Usually used in a looser sense to indicate a particular culture of
+programming. The loose sense can be used at varying levels of
+specificity. At one extreme, you might say that all versions of Unix
+and Unix-lookalikes are the same operating system (upsetting many
+people, especially lawyers and other advocates). At the other
+extreme, you could say this particular version of this particular
+vendor's operating system is different from any other version of this
+or any other vendor's operating system. Perl is much more portable
+across operating systems than many other languages. See also
+L</architecture> and L</platform>.
+
+=item operator
+
+A gizmo that transforms some number of input values to some number of
+output values, often built into a language with a special syntax or
+symbol. A given operator may have specific expectations about what
+L<types|/type> of data you give as its arguments
+(L<operands|/operand>) and what type of data you want back from it.
+
+=item operator overloading
+
+A kind of L</overloading> that you can do on built-in
+L<operators|/operator> to make them work on L<objects|/object> as if
+the objects were ordinary scalar values, but with the actual semantics
+supplied by the object class. This is set up with the L<overload>
+L</pragma>.
+
+=item options
+
+See either L<switches|/switch> or L</regular expression modifier>.
+
+=item overloading
+
+Giving additional meanings to a symbol or construct. Actually, all
+languages do overloading to one extent or another, since people are
+good at figuring out things from L</context>.
+
+=item overriding
+
+Hiding or invalidating some other definition of the same name. (Not
+to be confused with L</overloading>, which adds definitions that must
+be disambiguated some other way.) To confuse the issue further, we use
+the word with two overloaded definitions: to describe how you can
+define your own L</subroutine> to hide a built-in L</function> of the
+same name (see L<perlsub/Overriding Built-in Functions>) and to
+describe how you can define a replacement L</method> in a L</derived
+class> to hide a L</base class>'s method of the same name (see
+L<perlobj>).
+
+=item owner
+
+The one user (apart from the superuser) who has absolute control over
+a L</file>. A file may also have a L</group> of users who may
+exercise joint ownership if the real owner permits it. See
+L</permission bits>.
+
+=back
+
+=head2 P
+
+=over 4
+
+=item package
+
+A L</namespace> for global L<variables|/variable>,
+L<subroutines|/subroutine>, and the like, such that they can be kept
+separate from like-named L<symbols|/symbol> in other namespaces. In a
+sense, only the package is global, since the symbols in the package's
+symbol table are only accessible from code compiled outside the
+package by naming the package. But in another sense, all package
+symbols are also globals--they're just well-organized globals.
+
+=item pad
+
+Short for L</scratchpad>.
+
+=item parameter
+
+See L</argument>.
+
+=item parent class
+
+See L</base class>.
+
+=item parse tree
+
+See L</syntax tree>.
+
+=item parsing
+
+The subtle but sometimes brutal art of attempting to turn your
+possibly malformed program into a valid L</syntax tree>.
+
+=item patch
+
+To fix by applying one, as it were. In the realm of hackerdom, a
+listing of the differences between two versions of a program as might
+be applied by the I<patch>(1) program when you want to fix a bug or
+upgrade your old version.
+
+=item PATH
+
+The list of L<directories|/directory> the system searches to find a
+program you want to L</execute>. The list is stored as one of your
+L<environment variables|/environment variable>, accessible in Perl as
+C<$ENV{PATH}>.
+
+=item pathname
+
+A fully qualified filename such as I</usr/bin/perl>. Sometimes
+confused with L</PATH>.
+
+=item pattern
+
+A template used in L</pattern matching>.
+
+=item pattern matching
+
+Taking a pattern, usually a L</regular expression>, and trying the
+pattern various ways on a string to see whether there's any way to
+make it fit. Often used to pick interesting tidbits out of a file.
+
+=item permission bits
+
+Bits that the L</owner> of a file sets or unsets to allow or disallow
+access to other people. These flag bits are part of the L</mode> word
+returned by the L<stat|perlfunc/stat> built-in when you ask about a
+file. On Unix systems, you can check the I<ls>(1) manpage for more
+information.
+
+=item Pern
+
+What you get when you do C<Perl++> twice. Doing it only once will
+curl your hair. You have to increment it eight times to shampoo your
+hair. Lather, rinse, iterate.
+
+=item pipe
+
+A direct L</connection> that carries the output of one L</process> to
+the input of another without an intermediate temporary file. Once the
+pipe is set up, the two processes in question can read and write as if
+they were talking to a normal file, with some caveats.
+
+=item pipeline
+
+A series of L<processes|/process> all in a row, linked by
+L<pipes|/pipe>, where each passes its output stream to the next.
+
+=item platform
+
+The entire hardware and software context in which a program runs. A
+ program written in a platform-dependent language might break if you
+change any of: machine, operating system, libraries, compiler, or
+system configuration. The I<perl> interpreter has to be compiled
+differently for each platform because it is implemented in C, but
+programs written in the Perl language are largely
+platform-independent.
+
+=item pod
+
+The markup used to embed documentation into your Perl code. See
+L<perlpod>.
+
+=item pointer
+
+A L</variable> in a language like C that contains the exact memory
+location of some other item. Perl handles pointers internally so you
+don't have to worry about them. Instead, you just use symbolic
+pointers in the form of L<keys|/key> and L</variable> names, or L<hard
+references|/hard reference>, which aren't pointers (but act like
+pointers and do in fact contain pointers).
+
+=item polymorphism
+
+The notion that you can tell an L</object> to do something generic,
+and the object will interpret the command in different ways depending
+on its type. [E<lt>Gk many shapes]
+
+=item port
+
+The part of the address of a TCP or UDP socket that directs packets to
+the correct process after finding the right machine, something like
+the phone extension you give when you reach the company operator.
+Also, the result of converting code to run on a different platform
+than originally intended, or the verb denoting this conversion.
+
+=item portable
+
+Once upon a time, C code compilable under both BSD and SysV. In
+general, code that can be easily converted to run on another
+L</platform>, where "easily" can be defined however you like, and
+usually is. Anything may be considered portable if you try hard
+enough. See I<mobile home> or I<London Bridge>.
+
+=item porter
+
+Someone who "carries" software from one L</platform> to another.
+Porting programs written in platform-dependent languages such as C can
+be difficult work, but porting programs like Perl is very much worth
+the agony.
+
+=item POSIX
+
+The Portable Operating System Interface specification.
+
+=item postfix
+
+An L</operator> that follows its L</operand>, as in C<$x++>.
+
+=item pp
+
+An internal shorthand for a "push-pop" code, that is, C code
+implementing Perl's stack machine.
+
+=item pragma
+
+A standard module whose practical hints and suggestions are received
+(and possibly ignored) at compile time. Pragmas are named in all
+lowercase.
+
+=item precedence
+
+The rules of conduct that, in the absence of other guidance, determine
+what should happen first. For example, in the absence of parentheses,
+you always do multiplication before addition.
+
+=item prefix
+
+An L</operator> that precedes its L</operand>, as in C<++$x>.
+
+=item preprocessing
+
+What some helper L</process> did to transform the incoming data into a
+form more suitable for the current process. Often done with an
+incoming L</pipe>. See also L</C preprocessor>.
+
+=item procedure
+
+A L</subroutine>.
+
+=item process
+
+An instance of a running program. Under multitasking systems like
+Unix, two or more separate processes could be running the same program
+independently at the same time--in fact, the L<fork|perlfunc/fork>
+function is designed to bring about this happy state of affairs.
+Under other operating systems, processes are sometimes called
+"threads", "tasks", or "jobs", often with slight nuances in meaning.
+
+=item program generator
+
+A system that algorithmically writes code for you in a high-level
+language. See also L</code generator>.
+
+=item progressive matching
+
+L<Pattern matching|/pattern matching> that picks up where it left off before.
+
+=item property
+
+See either L</instance variable> or L</character property>.
+
+=item protocol
+
+In networking, an agreed-upon way of sending messages back and forth
+so that neither correspondent will get too confused.
+
+=item prototype
+
+An optional part of a L</subroutine> declaration telling the Perl
+compiler how many and what flavor of arguments may be passed as
+L</actual arguments>, so that you can write subroutine calls that
+parse much like built-in functions. (Or don't parse, as the case may
+be.)
+
+=item pseudofunction
+
+A construct that sometimes looks like a function but really isn't.
+Usually reserved for L</lvalue> modifiers like L<my|perlfunc/my>, for
+L</context> modifiers like L<scalar|perlfunc/scalar>, and for the
+pick-your-own-quotes constructs, C<q//>, C<qq//>, C<qx//>, C<qw//>,
+C<qr//>, C<m//>, C<s///>, C<y///>, and C<tr///>.
+
+=item pseudohash
+
+A reference to an array whose initial element happens to hold a
+reference to a hash. You can treat a pseudohash reference as either
+an array reference or a hash reference.
+
+=item pseudoliteral
+
+An L</operator> that looks something like a L</literal>, such as the
+output-grabbing operator, C<`>I<C<command>>C<`>.
+
+=item public domain
+
+Something not owned by anybody. Perl is copyrighted and is thus
+I<not> in the public domain--it's just L</freely available> and
+L</freely redistributable>.
+
+=item pumpkin
+
+A notional "baton" handed around the Perl community indicating who is
+the lead integrator in some arena of development.
+
+=item pumpking
+
+A L</pumpkin> holder, the person in charge of pumping the pump, or at
+least priming it. Must be willing to play the part of the Great
+Pumpkin now and then.
+
+=item PV
+
+A "pointer value", which is Perl Internals Talk for a C<char*>.
+
+=back
+
+=head2 Q
+
+=over 4
+
+=item qualified
+
+Possessing a complete name. The symbol C<$Ent::moot> is qualified;
+C<$moot> is unqualified. A fully qualified filename is specified from
+the top-level directory.
+
+=item quantifier
+
+A component of a L</regular expression> specifying how many times the
+foregoing L</atom> may occur.
+
+=back
+
+=head2 R
+
+=over 4
+
+=item readable
+
+With respect to files, one that has the proper permission bit set to
+let you access the file. With respect to computer programs, one
+that's written well enough that someone has a chance of figuring out
+what it's trying to do.
+
+=item reaping
+
+The last rites performed by a parent L</process> on behalf of a
+deceased child process so that it doesn't remain a L</zombie>. See
+the L<wait|perlfunc/wait> and L<waitpid|perlfunc/waitpid> function
+calls.
+
+=item record
+
+A set of related data values in a L</file> or L</stream>, often
+associated with a unique L</key> field. In Unix, often commensurate
+with a L</line>, or a blank-line-terminated set of lines (a
+"paragraph"). Each line of the I</etc/passwd> file is a record, keyed
+on login name, containing information about that user.
+
+=item recursion
+
+The art of defining something (at least partly) in terms of itself,
+which is a naughty no-no in dictionaries but often works out okay in
+computer programs if you're careful not to recurse forever, which is
+like an infinite loop with more spectacular failure modes.
+
+=item reference
+
+Where you look to find a pointer to information somewhere else. (See
+L</indirection>.) References come in two flavors, L<symbolic
+references|/symbolic reference> and L<hard references|/hard
+reference>.
+
+=item referent
+
+Whatever a reference refers to, which may or may not have a name.
+Common types of referents include scalars, arrays, hashes, and
+subroutines.
+
+=item regex
+
+See L</regular expression>.
+
+=item regular expression
+
+A single entity with various interpretations, like an elephant. To a
+computer scientist, it's a grammar for a little language in which some
+strings are legal and others aren't. To normal people, it's a pattern
+you can use to find what you're looking for when it varies from case
+to case. Perl's regular expressions are far from regular in the
+theoretical sense, but in regular use they work quite well. Here's a
+regular expression: C</Oh s.*t./>. This will match strings like "C<Oh
+say can you see by the dawn's early light>" and "C<Oh sit!>". See
+L<perlre>.
+
+=item regular expression modifier
+
+An option on a pattern or substitution, such as C</i> to render the
+pattern case insensitive. See also L</cloister>.
+
+=item regular file
+
+A L</file> that's not a L</directory>, a L</device>, a named L</pipe>
+or L</socket>, or a L</symbolic link>. Perl uses the C<-f> file test
+operator to identify regular files. Sometimes called a "plain" file.
+
+=item relational operator
+
+An L</operator> that says whether a particular ordering relationship
+is L</true> about a pair of L<operands|/operand>. Perl has both
+numeric and string relational operators. See L</collating sequence>.
+
+=item reserved words
+
+A word with a specific, built-in meaning to a L</compiler>, such as
+C<if> or L<delete|perlfunc/delete>. In many languages (not Perl),
+it's illegal to use reserved words to name anything else. (Which is
+why they're reserved, after all.) In Perl, you just can't use them to
+name L<labels|/label> or L<filehandles|/filehandle>. Also called
+"keywords".
+
+=item return value
+
+The L</value> produced by a L</subroutine> or L</expression> when
+evaluated. In Perl, a return value may be either a L</list> or a
+L</scalar>.
+
+=item RFC
+
+Request For Comment, which despite the timid connotations is the name
+of a series of important standards documents.
+
+=item right shift
+
+A L</bit shift> that divides a number by some power of 2.
+
+=item root
+
+The superuser (UID == 0). Also, the top-level directory of the
+filesystem.
+
+=item RTFM
+
+What you are told when someone thinks you should Read The Fine Manual.
+
+=item run phase
+
+Any time after Perl starts running your main program. See also
+L</compile phase>. Run phase is mostly spent in L</run time> but may
+also be spent in L</compile time> when L<require|perlfunc/require>,
+L<do|perlfunc/do> C<FILE>, or L<eval|perlfunc/eval> C<STRING>
+operators are executed or when a substitution uses the C</ee>
+modifier.
+
+=item run time
+
+The time when Perl is actually doing what your code says to do, as
+opposed to the earlier period of time when it was trying to figure out
+whether what you said made any sense whatsoever, which is L</compile
+time>.
+
+=item run-time pattern
+
+A pattern that contains one or more variables to be interpolated
+before parsing the pattern as a L</regular expression>, and that
+therefore cannot be analyzed at compile time, but must be re-analyzed
+each time the pattern match operator is evaluated. Run-time patterns
+are useful but expensive.
+
+=item RV
+
+A recreational vehicle, not to be confused with vehicular recreation.
+RV also means an internal Reference Value of the type a L</scalar> can
+hold. See also L</IV> and L</NV> if you're not confused yet.
+
+=item rvalue
+
+A L</value> that you might find on the right side of an
+L</assignment>. See also L</lvalue>.
+
+=back
+
+=head2 S
+
+=over 4
+
+=item scalar
+
+A simple, singular value; a number, L</string>, or L</reference>.
+
+=item scalar context
+
+The situation in which an L</expression> is expected by its
+surroundings (the code calling it) to return a single L</value> rather
+than a L</list> of values. See also L</context> and L</list context>.
+A scalar context sometimes imposes additional constraints on the
+return value--see L</string context> and L</numeric context>.
+Sometimes we talk about a L</Boolean context> inside conditionals, but
+this imposes no additional constraints, since any scalar value,
+whether numeric or L</string>, is already true or false.
+
+=item scalar literal
+
+A number or quoted L</string>--an actual L</value> in the text of your
+program, as opposed to a L</variable>.
+
+=item scalar value
+
+A value that happens to be a L</scalar> as opposed to a L</list>.
+
+=item scalar variable
+
+A L</variable> prefixed with C<$> that holds a single value.
+
+=item scope
+
+How far away you can see a variable from, looking through one. Perl
+has two visibility mechanisms: it does L</dynamic scoping> of
+L<local|perlfunc/local> L<variables|/variable>, meaning that the rest
+of the L</block>, and any L<subroutines|/subroutine> that are called
+by the rest of the block, can see the variables that are local to the
+block. Perl does L</lexical scoping> of L<my|perlfunc/my> variables,
+meaning that the rest of the block can see the variable, but other
+subroutines called by the block I<cannot> see the variable.
+
+=item scratchpad
+
+The area in which a particular invocation of a particular file or
+subroutine keeps some of its temporary values, including any lexically
+scoped variables.
+
+=item script
+
+A text L</file> that is a program intended to be L<executed|/execute>
+directly rather than L<compiled|/compiler> to another form of file
+before execution. Also, in the context of L</Unicode>, a writing
+system for a particular language or group of languages, such as Greek,
+Bengali, or Klingon.
+
+=item script kiddie
+
+A L</cracker> who is not a L</hacker>, but knows just enough to run
+canned scripts. A cargo-cult programmer.
+
+=item sed
+
+A venerable Stream EDitor from which Perl derives some of its ideas.
+
+=item semaphore
+
+A fancy kind of interlock that prevents multiple L<threads|/thread> or
+L<processes|/process> from using up the same resources simultaneously.
+
+=item separator
+
+A L</character> or L</string> that keeps two surrounding strings from
+being confused with each other. The L<split|perlfunc/split> function
+works on separators. Not to be confused with L<delimiters|/delimiter>
+or L<terminators|/terminator>. The "or" in the previous sentence
+separated the two alternatives.
+
+=item serialization
+
+Putting a fancy L</data structure> into linear order so that it can be
+stored as a L</string> in a disk file or database or sent through a
+L</pipe>. Also called marshalling.
+
+=item server
+
+In networking, a L</process> that either advertises a L</service> or
+just hangs around at a known location and waits for L<clients|/client>
+who need service to get in touch with it.
+
+=item service
+
+Something you do for someone else to make them happy, like giving them
+the time of day (or of their life). On some machines, well-known
+services are listed by the L<getservent|perlfunc/getservent> function.
+
+=item setgid
+
+Same as L</setuid>, only having to do with giving away L</group>
+privileges.
+
+=item setuid
+
+Said of a program that runs with the privileges of its L</owner>
+rather than (as is usually the case) the privileges of whoever is
+running it. Also describes the bit in the mode word (L</permission
+bits>) that controls the feature. This bit must be explicitly set by
+the owner to enable this feature, and the program must be carefully
+written not to give away more privileges than it ought to.
+
+=item shared memory
+
+A piece of L</memory> accessible by two different
+L<processes|/process> who otherwise would not see each other's memory.
+
+=item shebang
+
+Irish for the whole McGillicuddy. In Perl culture, a portmanteau of
+"sharp" and "bang", meaning the C<#!> sequence that tells the system
+where to find the interpreter.
+
+=item shell
+
+A L</command>-line L</interpreter>. The program that interactively
+gives you a prompt, accepts one or more L<lines|/line> of input, and
+executes the programs you mentioned, feeding each of them their proper
+L<arguments|/argument> and input data. Shells can also execute
+scripts containing such commands. Under Unix, typical shells include
+the Bourne shell (I</bin/sh>), the C shell (I</bin/csh>), and the Korn
+shell (I</bin/ksh>). Perl is not strictly a shell because it's not
+interactive (although Perl programs can be interactive).
+
+=item side effects
+
+Something extra that happens when you evaluate an L</expression>.
+Nowadays it can refer to almost anything. For example, evaluating a
+simple assignment statement typically has the "side effect" of
+assigning a value to a variable. (And you thought assigning the value
+was your primary intent in the first place!) Likewise, assigning a
+value to the special variable C<$|> (C<$AUTOFLUSH>) has the side
+effect of forcing a flush after every L<write|perlfunc/write> or
+L<print|perlfunc/print> on the currently selected filehandle.
+
+=item signal
+
+A bolt out of the blue; that is, an event triggered by the
+L</operating system>, probably when you're least expecting it.
+
+=item signal handler
+
+A L</subroutine> that, instead of being content to be called in the
+normal fashion, sits around waiting for a bolt out of the blue before
+it will deign to L</execute>. Under Perl, bolts out of the blue are
+called signals, and you send them with the L<kill|perlfunc/kill>
+built-in. See L<perlvar/%SIG> and L<perlipc/Signals>.
+
+=item single inheritance
+
+The features you got from your mother, if she told you that you don't
+have a father. (See also L</inheritance> and L</multiple
+inheritance>.) In computer languages, the notion that
+L<classes|/class> reproduce asexually so that a given class can only
+have one direct ancestor or L</base class>. Perl supplies no such
+restriction, though you may certainly program Perl that way if you
+like.
+
+=item slice
+
+A selection of any number of L<elements|/element> from a L</list>,
+L</array>, or L</hash>.
+
+=item slurp
+
+To read an entire L</file> into a L</string> in one operation.
+
+=item socket
+
+An endpoint for network communication among multiple
+L<processes|/process> that works much like a telephone or a post
+office box. The most important thing about a socket is its L</network
+address> (like a phone number). Different kinds of sockets have
+different kinds of addresses--some look like filenames, and some
+don't.
+
+=item soft reference
+
+See L</symbolic reference>.
+
+=item source filter
+
+A special kind of L</module> that does L</preprocessing> on your
+script just before it gets to the L</tokener>.
+
+=item stack
+
+A device you can put things on the top of, and later take them back
+off in the opposite order in which you put them on. See L</LIFO>.
+
+=item standard
+
+Included in the official Perl distribution, as in a standard module, a
+standard tool, or a standard Perl L</manpage>.
+
+=item standard error
+
+The default output L</stream> for nasty remarks that don't belong in
+L</standard output>. Represented within a Perl program by the
+L</filehandle> L</STDERR>. You can use this stream explicitly, but the
+L<die|perlfunc/die> and L<warn|perlfunc/warn> built-ins write to your
+standard error stream automatically.
+
+=item standard I/O
+
+A standard C library for doing L<buffered|/buffer> input and output to
+the L</operating system>. (The "standard" of standard I/O is only
+marginally related to the "standard" of standard input and output.)
+In general, Perl relies on whatever implementation of standard I/O a
+given operating system supplies, so the buffering characteristics of a
+Perl program on one machine may not exactly match those on another
+machine. Normally this only influences efficiency, not semantics. If
+your standard I/O package is doing block buffering and you want it to
+L</flush> the buffer more often, just set the C<$|> variable to a true
+value.
+
+=item standard input
+
+The default input L</stream> for your program, which if possible
+shouldn't care where its data is coming from. Represented within a
+Perl program by the L</filehandle> L</STDIN>.
+
+=item standard output
+
+The default output L</stream> for your program, which if possible
+shouldn't care where its data is going. Represented within a Perl
+program by the L</filehandle> L</STDOUT>.
+
+=item stat structure
+
+A special internal spot in which Perl keeps the information about the
+last L</file> on which you requested information.
+
+=item statement
+
+A L</command> to the computer about what to do next, like a step in a
+recipe: "Add marmalade to batter and mix until mixed." A statement is
+distinguished from a L</declaration>, which doesn't tell the computer
+to do anything, but just to learn something.
+
+=item statement modifier
+
+A L</conditional> or L</loop> that you put after the L</statement>
+instead of before, if you know what we mean.
+
+=item static
+
+Varying slowly compared to something else. (Unfortunately, everything
+is relatively stable compared to something else, except for certain
+elementary particles, and we're not so sure about them.) In
+computers, where things are supposed to vary rapidly, "static" has a
+derogatory connotation, indicating a slightly dysfunctional
+L</variable>, L</subroutine>, or L</method>. In Perl culture, the
+word is politely avoided.
+
+=item static method
+
+No such thing. See L</class method>.
+
+=item static scoping
+
+No such thing. See L</lexical scoping>.
+
+=item static variable
+
+No such thing. Just use a L</lexical variable> in a scope larger than
+your L</subroutine>.
+
+=item status
+
+The L</value> returned to the parent L</process> when one of its child
+processes dies. This value is placed in the special variable C<$?>.
+Its upper eight L<bits|/bit> are the exit status of the defunct
+process, and its lower eight bits identify the signal (if any) that
+the process died from. On Unix systems, this status value is the same
+as the status word returned by I<wait>(2). See L<perlfunc/system>.
+
+=item STDERR
+
+See L</standard error>.
+
+=item STDIN
+
+See L</standard input>.
+
+=item STDIO
+
+See L</standard IE<sol>O>.
+
+=item STDOUT
+
+See L</standard output>.
+
+=item stream
+
+A flow of data into or out of a process as a steady sequence of bytes
+or characters, without the appearance of being broken up into packets.
+This is a kind of L</interface>--the underlying L</implementation> may
+well break your data up into separate packets for delivery, but this
+is hidden from you.
+
+=item string
+
+A sequence of characters such as "He said !@#*&%@#*?!". A string does
+not have to be entirely printable.
+
+=item string context
+
+The situation in which an expression is expected by its surroundings
+(the code calling it) to return a L</string>. See also L</context>
+and L</numeric context>.
+
+=item stringification
+
+The process of producing a L</string> representation of an abstract
+object.
+
+=item struct
+
+C keyword introducing a structure definition or name.
+
+=item structure
+
+See L</data structure>.
+
+=item subclass
+
+See L</derived class>.
+
+=item subpattern
+
+A component of a L</regular expression> pattern.
+
+=item subroutine
+
+A named or otherwise accessible piece of program that can be invoked
+from elsewhere in the program in order to accomplish some sub-goal of
+the program. A subroutine is often parameterized to accomplish
+different but related things depending on its input
+L<arguments|/argument>. If the subroutine returns a meaningful
+L</value>, it is also called a L</function>.
+
+=item subscript
+
+A L</value> that indicates the position of a particular L</array>
+L</element> in an array.
+
+=item substitution
+
+Changing parts of a string via the C<s///> operator. (We avoid use of
+this term to mean L</variable interpolation>.)
+
+=item substring
+
+A portion of a L</string>, starting at a certain L</character>
+position (L</offset>) and proceeding for a certain number of
+characters.
+
+=item superclass
+
+See L</base class>.
+
+=item superuser
+
+The person whom the L</operating system> will let do almost anything.
+Typically your system administrator or someone pretending to be your
+system administrator. On Unix systems, the L</root> user. On Windows
+systems, usually the Administrator user.
+
+=item SV
+
+Short for "scalar value". But within the Perl interpreter every
+L</referent> is treated as a member of a class derived from SV, in an
+object-oriented sort of way. Every L</value> inside Perl is passed
+around as a C language C<SV*> pointer. The SV L</struct> knows its
+own "referent type", and the code is smart enough (we hope) not to try
+to call a L</hash> function on a L</subroutine>.
+
+=item switch
+
+An option you give on a command line to influence the way your program
+works, usually introduced with a minus sign. The word is also used as
+a nickname for a L</switch statement>.
+
+=item switch cluster
+
+The combination of multiple command-line switches (e.g., B<-a -b -c>)
+into one switch (e.g., B<-abc>). Any switch with an additional
+L</argument> must be the last switch in a cluster.
+
+=item switch statement
+
+A program technique that lets you evaluate an L</expression> and then,
+based on the value of the expression, do a multiway branch to the
+appropriate piece of code for that value. Also called a "case
+structure", named after the similar Pascal construct. Most switch
+statements in Perl are spelled C<for>. See L<perlsyn/Basic BLOCKs and
+Switch Statements>.
+
+=item symbol
+
+Generally, any L</token> or L</metasymbol>. Often used more
+specifically to mean the sort of name you might find in a L</symbol
+table>.
+
+=item symbol table
+
+Where a L</compiler> remembers symbols. A program like Perl must
+somehow remember all the names of all the L<variables|/variable>,
+L<filehandles|/filehandle>, and L<subroutines|/subroutine> you've
+used. It does this by placing the names in a symbol table, which is
+implemented in Perl using a L</hash table>. There is a separate
+symbol table for each L</package> to give each package its own
+L</namespace>.
+
+=item symbolic debugger
+
+A program that lets you step through the L<execution|/execute> of your
+program, stopping or printing things out here and there to see whether
+anything has gone wrong, and if so, what. The "symbolic" part just
+means that you can talk to the debugger using the same symbols with
+which your program is written.
+
+=item symbolic link
+
+An alternate filename that points to the real L</filename>, which in
+turn points to the real L</file>. Whenever the L</operating system>
+is trying to parse a L</pathname> containing a symbolic link, it
+merely substitutes the new name and continues parsing.
+
+=item symbolic reference
+
+A variable whose value is the name of another variable or subroutine.
+By L<dereferencing|/dereference> the first variable, you can get at
+the second one. Symbolic references are illegal under L<use strict
+'refs'|strict/strict refs>.
+
+=item synchronous
+
+Programming in which the orderly sequence of events can be determined;
+that is, when things happen one after the other, not at the same time.
+
+=item syntactic sugar
+
+An alternative way of writing something more easily; a shortcut.
+
+=item syntax
+
+From Greek, "with-arrangement". How things (particularly symbols) are
+put together with each other.
+
+=item syntax tree
+
+An internal representation of your program wherein lower-level
+L<constructs|/construct> dangle off the higher-level constructs
+enclosing them.
+
+=item syscall
+
+A L</function> call directly to the L</operating system>. Many of the
+important subroutines and functions you use aren't direct system
+calls, but are built up in one or more layers above the system call
+level. In general, Perl programmers don't need to worry about the
+distinction. However, if you do happen to know which Perl functions
+are really syscalls, you can predict which of these will set the C<$!>
+(C<$ERRNO>) variable on failure. Unfortunately, beginning programmers
+often confusingly employ the term "system call" to mean what happens
+when you call the Perl L<system|perlfunc/system> function, which
+actually involves many syscalls. To avoid any confusion, we nearly
+always use say "syscall" for something you could call indirectly via
+Perl's L<syscall|perlfunc/syscall> function, and never for something
+you would call with Perl's L<system|perlfunc/system> function.
+
+=back
+
+=head2 T
+
+=over 4
+
+=item tainted
+
+Said of data derived from the grubby hands of a user and thus unsafe
+for a secure program to rely on. Perl does taint checks if you run a
+L</setuid> (or L</setgid>) program, or if you use the B<-T> switch.
+
+=item TCP
+
+Short for Transmission Control Protocol. A protocol wrapped around
+the Internet Protocol to make an unreliable packet transmission
+mechanism appear to the application program to be a reliable
+L</stream> of bytes. (Usually.)
+
+=item term
+
+Short for a "terminal", that is, a leaf node of a L</syntax tree>. A
+thing that functions grammatically as an L</operand> for the operators
+in an expression.
+
+=item terminator
+
+A L</character> or L</string> that marks the end of another string.
+The C<$/> variable contains the string that terminates a
+L<readline|perlfunc/readline> operation, which L<chomp|perlfunc/chomp>
+deletes from the end. Not to be confused with
+L<delimiters|/delimiter> or L<separators|/separator>. The period at
+the end of this sentence is a terminator.
+
+=item ternary
+
+An L</operator> taking three L<operands|/operand>. Sometimes
+pronounced L</trinary>.
+
+=item text
+
+A L</string> or L</file> containing primarily printable characters.
+
+=item thread
+
+Like a forked process, but without L</fork>'s inherent memory
+protection. A thread is lighter weight than a full process, in that a
+process could have multiple threads running around in it, all fighting
+over the same process's memory space unless steps are taken to protect
+threads from each other. See L<threads>.
+
+=item tie
+
+The bond between a magical variable and its implementation class. See
+L<perlfunc/tie> and L<perltie>.
+
+=item TMTOWTDI
+
+There's More Than One Way To Do It, the Perl Motto. The notion that
+there can be more than one valid path to solving a programming problem
+in context. (This doesn't mean that more ways are always better or
+that all possible paths are equally desirable--just that there need
+not be One True Way.) Pronounced TimToady.
+
+=item token
+
+A morpheme in a programming language, the smallest unit of text with
+semantic significance.
+
+=item tokener
+
+A module that breaks a program text into a sequence of
+L<tokens|/token> for later analysis by a parser.
+
+=item tokenizing
+
+Splitting up a program text into L<tokens|/token>. Also known as
+"lexing", in which case you get "lexemes" instead of tokens.
+
+=item toolbox approach
+
+The notion that, with a complete set of simple tools that work well
+together, you can build almost anything you want. Which is fine if
+you're assembling a tricycle, but if you're building a defranishizing
+comboflux regurgalator, you really want your own machine shop in which
+to build special tools. Perl is sort of a machine shop.
+
+=item transliterate
+
+To turn one string representation into another by mapping each
+character of the source string to its corresponding character in the
+result string. See
+L<perlop/trE<sol>SEARCHLISTE<sol>REPLACEMENTLISTE<sol>cds>.
+
+=item trigger
+
+An event that causes a L</handler> to be run.
+
+=item trinary
+
+Not a stellar system with three stars, but an L</operator> taking
+three L<operands|/operand>. Sometimes pronounced L</ternary>.
+
+=item troff
+
+A venerable typesetting language from which Perl derives the name of
+its C<$%> variable and which is secretly used in the production of
+Camel books.
+
+=item true
+
+Any scalar value that doesn't evaluate to 0 or C<"">.
+
+=item truncating
+
+Emptying a file of existing contents, either automatically when
+opening a file for writing or explicitly via the
+L<truncate|perlfunc/truncate> function.
+
+=item type
+
+See L</data type> and L</class>.
+
+=item type casting
+
+Converting data from one type to another. C permits this. Perl does
+not need it. Nor want it.
+
+=item typed lexical
+
+A L</lexical variable> that is declared with a L</class> type: C<my
+Pony $bill>.
+
+=item typedef
+
+A type definition in the C language.
+
+=item typeglob
+
+Use of a single identifier, prefixed with C<*>. For example, C<*name>
+stands for any or all of C<$name>, C<@name>, C<%name>, C<&name>, or
+just C<name>. How you use it determines whether it is interpreted as
+all or only one of them. See L<perldata/Typeglobs and Filehandles>.
+
+=item typemap
+
+A description of how C types may be transformed to and from Perl types
+within an L</extension> module written in L</XS>.
+
+=back
+
+=head2 U
+
+=over 4
+
+=item UDP
+
+User Datagram Protocol, the typical way to send L<datagrams|/datagram>
+over the Internet.
+
+=item UID
+
+A user ID. Often used in the context of L</file> or L</process>
+ownership.
+
+=item umask
+
+A mask of those L</permission bits> that should be forced off when
+creating files or directories, in order to establish a policy of whom
+you'll ordinarily deny access to. See the L<umask|perlfunc/umask>
+function.
+
+=item unary operator
+
+An operator with only one L</operand>, like C<!> or
+L<chdir|perlfunc/chdir>. Unary operators are usually prefix
+operators; that is, they precede their operand. The C<++> and C<-->
+operators can be either prefix or postfix. (Their position I<does>
+change their meanings.)
+
+=item Unicode
+
+A character set comprising all the major character sets of the world,
+more or less. See L<http://www.unicode.org>.
+
+=item Unix
+
+A very large and constantly evolving language with several alternative
+and largely incompatible syntaxes, in which anyone can define anything
+any way they choose, and usually do. Speakers of this language think
+it's easy to learn because it's so easily twisted to one's own ends,
+but dialectical differences make tribal intercommunication nearly
+impossible, and travelers are often reduced to a pidgin-like subset of
+the language. To be universally understood, a Unix shell programmer
+must spend years of study in the art. Many have abandoned this
+discipline and now communicate via an Esperanto-like language called
+Perl.
+
+In ancient times, Unix was also used to refer to some code that a
+couple of people at Bell Labs wrote to make use of a PDP-7 computer
+that wasn't doing much of anything else at the time.
+
+=back
+
+=head2 V
+
+=over 4
+
+=item value
+
+An actual piece of data, in contrast to all the variables, references,
+keys, indexes, operators, and whatnot that you need to access the
+value.
+
+=item variable
+
+A named storage location that can hold any of various kinds of
+L</value>, as your program sees fit.
+
+=item variable interpolation
+
+The L</interpolation> of a scalar or array variable into a string.
+
+=item variadic
+
+Said of a L</function> that happily receives an indeterminate number
+of L</actual arguments>.
+
+=item vector
+
+Mathematical jargon for a list of L<scalar values|/scalar value>.
+
+=item virtual
+
+Providing the appearance of something without the reality, as in:
+virtual memory is not real memory. (See also L</memory>.) The
+opposite of "virtual" is "transparent", which means providing the
+reality of something without the appearance, as in: Perl handles the
+variable-length UTF-8 character encoding transparently.
+
+=item void context
+
+A form of L</scalar context> in which an L</expression> is not
+expected to return any L</value> at all and is evaluated for its
+L</side effects> alone.
+
+=item v-string
+
+A "version" or "vector" L</string> specified with a C<v> followed by a
+series of decimal integers in dot notation, for instance,
+C<v1.20.300.4000>. Each number turns into a L</character> with the
+specified ordinal value. (The C<v> is optional when there are at
+least three integers.)
+
+=back
+
+=head2 W
+
+=over 4
+
+=item warning
+
+A message printed to the L</STDERR> stream to the effect that something
+might be wrong but isn't worth blowing up over. See L<perlfunc/warn>
+and the L<warnings> pragma.
+
+=item watch expression
+
+An expression which, when its value changes, causes a breakpoint in
+the Perl debugger.
+
+=item whitespace
+
+A L</character> that moves your cursor but doesn't otherwise put
+anything on your screen. Typically refers to any of: space, tab, line
+feed, carriage return, or form feed.
+
+=item word
+
+In normal "computerese", the piece of data of the size most
+efficiently handled by your computer, typically 32 bits or so, give or
+take a few powers of 2. In Perl culture, it more often refers to an
+alphanumeric L</identifier> (including underscores), or to a string of
+nonwhitespace L<characters|/character> bounded by whitespace or string
+boundaries.
+
+=item working directory
+
+Your current L</directory>, from which relative pathnames are
+interpreted by the L</operating system>. The operating system knows
+your current directory because you told it with a
+L<chdir|perlfunc/chdir> or because you started out in the place where
+your parent L</process> was when you were born.
+
+=item wrapper
+
+A program or subroutine that runs some other program or subroutine for
+you, modifying some of its input or output to better suit your
+purposes.
+
+=item WYSIWYG
+
+What You See Is What You Get. Usually used when something that
+appears on the screen matches how it will eventually look, like Perl's
+L<format|perlfunc/format> declarations. Also used to mean the
+opposite of magic because everything works exactly as it appears, as
+in the three-argument form of L<open|perlfunc/open>.
+
+=back
+
+=head2 X
+
+=over 4
+
+=item XS
+
+An extraordinarily exported, expeditiously excellent, expressly
+eXternal Subroutine, executed in existing C or C++ or in an exciting
+new extension language called (exasperatingly) XS. Examine L<perlxs>
+for the exact explanation or L<perlxstut> for an exemplary unexacting
+one.
+
+=item XSUB
+
+An external L</subroutine> defined in L</XS>.
+
+=back
+
+=head2 Y
+
+=over 4
+
+=item yacc
+
+Yet Another Compiler Compiler. A parser generator without which Perl
+probably would not have existed. See the file I<perly.y> in the Perl
+source distribution.
+
+=back
+
+=head2 Z
+
+=over 4
+
+=item zero width
+
+A subpattern L</assertion> matching the L</null string> between
+L<characters|/character>.
+
+=item zombie
+
+A process that has died (exited) but whose parent has not yet received
+proper notification of its demise by virtue of having called
+L<wait|perlfunc/wait> or L<waitpid|perlfunc/waitpid>. If you
+L<fork|perlfunc/fork>, you must clean up after your child processes
+when they exit, or else the process table will fill up and your system
+administrator will Not Be Happy with you.
+
+=back
+
+=head1 AUTHOR AND COPYRIGHT
+
+Based on the Glossary of Programming Perl, Third Edition,
+by Larry Wall, Tom Christiansen & Jon Orwant.
+Copyright (c) 2000, 1996, 1991 O'Reilly Media, Inc.
+This document may be distributed under the same terms as Perl itself.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlgpl.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlgpl.pod
new file mode 100755
index 00000000000..09cab02604a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlgpl.pod
@@ -0,0 +1,378 @@
+
+=head1 NAME
+
+perlgpl - the GNU General Public License, version 2
+
+=head1 SYNOPSIS
+
+ You can refer to this document in Pod via "L<perlgpl>"
+ Or you can see this document by entering "perldoc perlgpl"
+
+=cut
+
+# Because the following document's language disallows "changing"
+# it, we haven't gone thru and prettied it up with =item's or
+# anything. It's good enough the way it is.
+
+=head1 DESCRIPTION
+
+This is B<"The GNU General Public License, version 2">. It's here so
+that modules, programs, etc., that want to declare this as their
+distribution license, can link to it.
+
+It is also one of the two licenses Perl allows itself to be
+redistributed and/or modified; for the other one, the Perl Artistic
+License, see the L<perlartistic>.
+
+=head1 GNU GENERAL PUBLIC LICENSE
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software
+ interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Program does not specify a
+version number of this License, you may choose any version ever
+published by the Free Software Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+
+[End.]
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlguts.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlguts.pod
new file mode 100755
index 00000000000..d119937145c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlguts.pod
@@ -0,0 +1,2671 @@
+=head1 NAME
+
+perlguts - Introduction to the Perl API
+
+=head1 DESCRIPTION
+
+This document attempts to describe how to use the Perl API, as well as
+to provide some info on the basic workings of the Perl core. It is far
+from complete and probably contains many errors. Please refer any
+questions or comments to the author below.
+
+=head1 Variables
+
+=head2 Datatypes
+
+Perl has three typedefs that handle Perl's three main data types:
+
+ SV Scalar Value
+ AV Array Value
+ HV Hash Value
+
+Each typedef has specific routines that manipulate the various data types.
+
+=head2 What is an "IV"?
+
+Perl uses a special typedef IV which is a simple signed integer type that is
+guaranteed to be large enough to hold a pointer (as well as an integer).
+Additionally, there is the UV, which is simply an unsigned IV.
+
+Perl also uses two special typedefs, I32 and I16, which will always be at
+least 32-bits and 16-bits long, respectively. (Again, there are U32 and U16,
+as well.) They will usually be exactly 32 and 16 bits long, but on Crays
+they will both be 64 bits.
+
+=head2 Working with SVs
+
+An SV can be created and loaded with one command. There are five types of
+values that can be loaded: an integer value (IV), an unsigned integer
+value (UV), a double (NV), a string (PV), and another scalar (SV).
+
+The seven routines are:
+
+ SV* newSViv(IV);
+ SV* newSVuv(UV);
+ SV* newSVnv(double);
+ SV* newSVpv(const char*, STRLEN);
+ SV* newSVpvn(const char*, STRLEN);
+ SV* newSVpvf(const char*, ...);
+ SV* newSVsv(SV*);
+
+C<STRLEN> is an integer type (Size_t, usually defined as size_t in
+F<config.h>) guaranteed to be large enough to represent the size of
+any string that perl can handle.
+
+In the unlikely case of a SV requiring more complex initialisation, you
+can create an empty SV with newSV(len). If C<len> is 0 an empty SV of
+type NULL is returned, else an SV of type PV is returned with len + 1 (for
+the NUL) bytes of storage allocated, accessible via SvPVX. In both cases
+the SV has value undef.
+
+ SV *sv = newSV(0); /* no storage allocated */
+ SV *sv = newSV(10); /* 10 (+1) bytes of uninitialised storage allocated */
+
+To change the value of an I<already-existing> SV, there are eight routines:
+
+ void sv_setiv(SV*, IV);
+ void sv_setuv(SV*, UV);
+ void sv_setnv(SV*, double);
+ void sv_setpv(SV*, const char*);
+ void sv_setpvn(SV*, const char*, STRLEN)
+ void sv_setpvf(SV*, const char*, ...);
+ void sv_vsetpvfn(SV*, const char*, STRLEN, va_list *, SV **, I32, bool *);
+ void sv_setsv(SV*, SV*);
+
+Notice that you can choose to specify the length of the string to be
+assigned by using C<sv_setpvn>, C<newSVpvn>, or C<newSVpv>, or you may
+allow Perl to calculate the length by using C<sv_setpv> or by specifying
+0 as the second argument to C<newSVpv>. Be warned, though, that Perl will
+determine the string's length by using C<strlen>, which depends on the
+string terminating with a NUL character.
+
+The arguments of C<sv_setpvf> are processed like C<sprintf>, and the
+formatted output becomes the value.
+
+C<sv_vsetpvfn> is an analogue of C<vsprintf>, but it allows you to specify
+either a pointer to a variable argument list or the address and length of
+an array of SVs. The last argument points to a boolean; on return, if that
+boolean is true, then locale-specific information has been used to format
+the string, and the string's contents are therefore untrustworthy (see
+L<perlsec>). This pointer may be NULL if that information is not
+important. Note that this function requires you to specify the length of
+the format.
+
+The C<sv_set*()> functions are not generic enough to operate on values
+that have "magic". See L<Magic Virtual Tables> later in this document.
+
+All SVs that contain strings should be terminated with a NUL character.
+If it is not NUL-terminated there is a risk of
+core dumps and corruptions from code which passes the string to C
+functions or system calls which expect a NUL-terminated string.
+Perl's own functions typically add a trailing NUL for this reason.
+Nevertheless, you should be very careful when you pass a string stored
+in an SV to a C function or system call.
+
+To access the actual value that an SV points to, you can use the macros:
+
+ SvIV(SV*)
+ SvUV(SV*)
+ SvNV(SV*)
+ SvPV(SV*, STRLEN len)
+ SvPV_nolen(SV*)
+
+which will automatically coerce the actual scalar type into an IV, UV, double,
+or string.
+
+In the C<SvPV> macro, the length of the string returned is placed into the
+variable C<len> (this is a macro, so you do I<not> use C<&len>). If you do
+not care what the length of the data is, use the C<SvPV_nolen> macro.
+Historically the C<SvPV> macro with the global variable C<PL_na> has been
+used in this case. But that can be quite inefficient because C<PL_na> must
+be accessed in thread-local storage in threaded Perl. In any case, remember
+that Perl allows arbitrary strings of data that may both contain NULs and
+might not be terminated by a NUL.
+
+Also remember that C doesn't allow you to safely say C<foo(SvPV(s, len),
+len);>. It might work with your compiler, but it won't work for everyone.
+Break this sort of statement up into separate assignments:
+
+ SV *s;
+ STRLEN len;
+ char * ptr;
+ ptr = SvPV(s, len);
+ foo(ptr, len);
+
+If you want to know if the scalar value is TRUE, you can use:
+
+ SvTRUE(SV*)
+
+Although Perl will automatically grow strings for you, if you need to force
+Perl to allocate more memory for your SV, you can use the macro
+
+ SvGROW(SV*, STRLEN newlen)
+
+which will determine if more memory needs to be allocated. If so, it will
+call the function C<sv_grow>. Note that C<SvGROW> can only increase, not
+decrease, the allocated memory of an SV and that it does not automatically
+add a byte for the a trailing NUL (perl's own string functions typically do
+C<SvGROW(sv, len + 1)>).
+
+If you have an SV and want to know what kind of data Perl thinks is stored
+in it, you can use the following macros to check the type of SV you have.
+
+ SvIOK(SV*)
+ SvNOK(SV*)
+ SvPOK(SV*)
+
+You can get and set the current length of the string stored in an SV with
+the following macros:
+
+ SvCUR(SV*)
+ SvCUR_set(SV*, I32 val)
+
+You can also get a pointer to the end of the string stored in the SV
+with the macro:
+
+ SvEND(SV*)
+
+But note that these last three macros are valid only if C<SvPOK()> is true.
+
+If you want to append something to the end of string stored in an C<SV*>,
+you can use the following functions:
+
+ void sv_catpv(SV*, const char*);
+ void sv_catpvn(SV*, const char*, STRLEN);
+ void sv_catpvf(SV*, const char*, ...);
+ void sv_vcatpvfn(SV*, const char*, STRLEN, va_list *, SV **, I32, bool);
+ void sv_catsv(SV*, SV*);
+
+The first function calculates the length of the string to be appended by
+using C<strlen>. In the second, you specify the length of the string
+yourself. The third function processes its arguments like C<sprintf> and
+appends the formatted output. The fourth function works like C<vsprintf>.
+You can specify the address and length of an array of SVs instead of the
+va_list argument. The fifth function extends the string stored in the first
+SV with the string stored in the second SV. It also forces the second SV
+to be interpreted as a string.
+
+The C<sv_cat*()> functions are not generic enough to operate on values that
+have "magic". See L<Magic Virtual Tables> later in this document.
+
+If you know the name of a scalar variable, you can get a pointer to its SV
+by using the following:
+
+ SV* get_sv("package::varname", 0);
+
+This returns NULL if the variable does not exist.
+
+If you want to know if this variable (or any other SV) is actually C<defined>,
+you can call:
+
+ SvOK(SV*)
+
+The scalar C<undef> value is stored in an SV instance called C<PL_sv_undef>.
+
+Its address can be used whenever an C<SV*> is needed. Make sure that
+you don't try to compare a random sv with C<&PL_sv_undef>. For example
+when interfacing Perl code, it'll work correctly for:
+
+ foo(undef);
+
+But won't work when called as:
+
+ $x = undef;
+ foo($x);
+
+So to repeat always use SvOK() to check whether an sv is defined.
+
+Also you have to be careful when using C<&PL_sv_undef> as a value in
+AVs or HVs (see L<AVs, HVs and undefined values>).
+
+There are also the two values C<PL_sv_yes> and C<PL_sv_no>, which contain
+boolean TRUE and FALSE values, respectively. Like C<PL_sv_undef>, their
+addresses can be used whenever an C<SV*> is needed.
+
+Do not be fooled into thinking that C<(SV *) 0> is the same as C<&PL_sv_undef>.
+Take this code:
+
+ SV* sv = (SV*) 0;
+ if (I-am-to-return-a-real-value) {
+ sv = sv_2mortal(newSViv(42));
+ }
+ sv_setsv(ST(0), sv);
+
+This code tries to return a new SV (which contains the value 42) if it should
+return a real value, or undef otherwise. Instead it has returned a NULL
+pointer which, somewhere down the line, will cause a segmentation violation,
+bus error, or just weird results. Change the zero to C<&PL_sv_undef> in the
+first line and all will be well.
+
+To free an SV that you've created, call C<SvREFCNT_dec(SV*)>. Normally this
+call is not necessary (see L<Reference Counts and Mortality>).
+
+=head2 Offsets
+
+Perl provides the function C<sv_chop> to efficiently remove characters
+from the beginning of a string; you give it an SV and a pointer to
+somewhere inside the PV, and it discards everything before the
+pointer. The efficiency comes by means of a little hack: instead of
+actually removing the characters, C<sv_chop> sets the flag C<OOK>
+(offset OK) to signal to other functions that the offset hack is in
+effect, and it puts the number of bytes chopped off into the IV field
+of the SV. It then moves the PV pointer (called C<SvPVX>) forward that
+many bytes, and adjusts C<SvCUR> and C<SvLEN>.
+
+Hence, at this point, the start of the buffer that we allocated lives
+at C<SvPVX(sv) - SvIV(sv)> in memory and the PV pointer is pointing
+into the middle of this allocated storage.
+
+This is best demonstrated by example:
+
+ % ./perl -Ilib -MDevel::Peek -le '$a="12345"; $a=~s/.//; Dump($a)'
+ SV = PVIV(0x8128450) at 0x81340f0
+ REFCNT = 1
+ FLAGS = (POK,OOK,pPOK)
+ IV = 1 (OFFSET)
+ PV = 0x8135781 ( "1" . ) "2345"\0
+ CUR = 4
+ LEN = 5
+
+Here the number of bytes chopped off (1) is put into IV, and
+C<Devel::Peek::Dump> helpfully reminds us that this is an offset. The
+portion of the string between the "real" and the "fake" beginnings is
+shown in parentheses, and the values of C<SvCUR> and C<SvLEN> reflect
+the fake beginning, not the real one.
+
+Something similar to the offset hack is performed on AVs to enable
+efficient shifting and splicing off the beginning of the array; while
+C<AvARRAY> points to the first element in the array that is visible from
+Perl, C<AvALLOC> points to the real start of the C array. These are
+usually the same, but a C<shift> operation can be carried out by
+increasing C<AvARRAY> by one and decreasing C<AvFILL> and C<AvLEN>.
+Again, the location of the real start of the C array only comes into
+play when freeing the array. See C<av_shift> in F<av.c>.
+
+=head2 What's Really Stored in an SV?
+
+Recall that the usual method of determining the type of scalar you have is
+to use C<Sv*OK> macros. Because a scalar can be both a number and a string,
+usually these macros will always return TRUE and calling the C<Sv*V>
+macros will do the appropriate conversion of string to integer/double or
+integer/double to string.
+
+If you I<really> need to know if you have an integer, double, or string
+pointer in an SV, you can use the following three macros instead:
+
+ SvIOKp(SV*)
+ SvNOKp(SV*)
+ SvPOKp(SV*)
+
+These will tell you if you truly have an integer, double, or string pointer
+stored in your SV. The "p" stands for private.
+
+The are various ways in which the private and public flags may differ.
+For example, a tied SV may have a valid underlying value in the IV slot
+(so SvIOKp is true), but the data should be accessed via the FETCH
+routine rather than directly, so SvIOK is false. Another is when
+numeric conversion has occurred and precision has been lost: only the
+private flag is set on 'lossy' values. So when an NV is converted to an
+IV with loss, SvIOKp, SvNOKp and SvNOK will be set, while SvIOK wont be.
+
+In general, though, it's best to use the C<Sv*V> macros.
+
+=head2 Working with AVs
+
+There are two ways to create and load an AV. The first method creates an
+empty AV:
+
+ AV* newAV();
+
+The second method both creates the AV and initially populates it with SVs:
+
+ AV* av_make(I32 num, SV **ptr);
+
+The second argument points to an array containing C<num> C<SV*>'s. Once the
+AV has been created, the SVs can be destroyed, if so desired.
+
+Once the AV has been created, the following operations are possible on AVs:
+
+ void av_push(AV*, SV*);
+ SV* av_pop(AV*);
+ SV* av_shift(AV*);
+ void av_unshift(AV*, I32 num);
+
+These should be familiar operations, with the exception of C<av_unshift>.
+This routine adds C<num> elements at the front of the array with the C<undef>
+value. You must then use C<av_store> (described below) to assign values
+to these new elements.
+
+Here are some other functions:
+
+ I32 av_len(AV*);
+ SV** av_fetch(AV*, I32 key, I32 lval);
+ SV** av_store(AV*, I32 key, SV* val);
+
+The C<av_len> function returns the highest index value in array (just
+like $#array in Perl). If the array is empty, -1 is returned. The
+C<av_fetch> function returns the value at index C<key>, but if C<lval>
+is non-zero, then C<av_fetch> will store an undef value at that index.
+The C<av_store> function stores the value C<val> at index C<key>, and does
+not increment the reference count of C<val>. Thus the caller is responsible
+for taking care of that, and if C<av_store> returns NULL, the caller will
+have to decrement the reference count to avoid a memory leak. Note that
+C<av_fetch> and C<av_store> both return C<SV**>'s, not C<SV*>'s as their
+return value.
+
+ void av_clear(AV*);
+ void av_undef(AV*);
+ void av_extend(AV*, I32 key);
+
+The C<av_clear> function deletes all the elements in the AV* array, but
+does not actually delete the array itself. The C<av_undef> function will
+delete all the elements in the array plus the array itself. The
+C<av_extend> function extends the array so that it contains at least C<key+1>
+elements. If C<key+1> is less than the currently allocated length of the array,
+then nothing is done.
+
+If you know the name of an array variable, you can get a pointer to its AV
+by using the following:
+
+ AV* get_av("package::varname", 0);
+
+This returns NULL if the variable does not exist.
+
+See L<Understanding the Magic of Tied Hashes and Arrays> for more
+information on how to use the array access functions on tied arrays.
+
+=head2 Working with HVs
+
+To create an HV, you use the following routine:
+
+ HV* newHV();
+
+Once the HV has been created, the following operations are possible on HVs:
+
+ SV** hv_store(HV*, const char* key, U32 klen, SV* val, U32 hash);
+ SV** hv_fetch(HV*, const char* key, U32 klen, I32 lval);
+
+The C<klen> parameter is the length of the key being passed in (Note that
+you cannot pass 0 in as a value of C<klen> to tell Perl to measure the
+length of the key). The C<val> argument contains the SV pointer to the
+scalar being stored, and C<hash> is the precomputed hash value (zero if
+you want C<hv_store> to calculate it for you). The C<lval> parameter
+indicates whether this fetch is actually a part of a store operation, in
+which case a new undefined value will be added to the HV with the supplied
+key and C<hv_fetch> will return as if the value had already existed.
+
+Remember that C<hv_store> and C<hv_fetch> return C<SV**>'s and not just
+C<SV*>. To access the scalar value, you must first dereference the return
+value. However, you should check to make sure that the return value is
+not NULL before dereferencing it.
+
+These two functions check if a hash table entry exists, and deletes it.
+
+ bool hv_exists(HV*, const char* key, U32 klen);
+ SV* hv_delete(HV*, const char* key, U32 klen, I32 flags);
+
+If C<flags> does not include the C<G_DISCARD> flag then C<hv_delete> will
+create and return a mortal copy of the deleted value.
+
+And more miscellaneous functions:
+
+ void hv_clear(HV*);
+ void hv_undef(HV*);
+
+Like their AV counterparts, C<hv_clear> deletes all the entries in the hash
+table but does not actually delete the hash table. The C<hv_undef> deletes
+both the entries and the hash table itself.
+
+Perl keeps the actual data in linked list of structures with a typedef of HE.
+These contain the actual key and value pointers (plus extra administrative
+overhead). The key is a string pointer; the value is an C<SV*>. However,
+once you have an C<HE*>, to get the actual key and value, use the routines
+specified below.
+
+ I32 hv_iterinit(HV*);
+ /* Prepares starting point to traverse hash table */
+ HE* hv_iternext(HV*);
+ /* Get the next entry, and return a pointer to a
+ structure that has both the key and value */
+ char* hv_iterkey(HE* entry, I32* retlen);
+ /* Get the key from an HE structure and also return
+ the length of the key string */
+ SV* hv_iterval(HV*, HE* entry);
+ /* Return an SV pointer to the value of the HE
+ structure */
+ SV* hv_iternextsv(HV*, char** key, I32* retlen);
+ /* This convenience routine combines hv_iternext,
+ hv_iterkey, and hv_iterval. The key and retlen
+ arguments are return values for the key and its
+ length. The value is returned in the SV* argument */
+
+If you know the name of a hash variable, you can get a pointer to its HV
+by using the following:
+
+ HV* get_hv("package::varname", 0);
+
+This returns NULL if the variable does not exist.
+
+The hash algorithm is defined in the C<PERL_HASH(hash, key, klen)> macro:
+
+ hash = 0;
+ while (klen--)
+ hash = (hash * 33) + *key++;
+ hash = hash + (hash >> 5); /* after 5.6 */
+
+The last step was added in version 5.6 to improve distribution of
+lower bits in the resulting hash value.
+
+See L<Understanding the Magic of Tied Hashes and Arrays> for more
+information on how to use the hash access functions on tied hashes.
+
+=head2 Hash API Extensions
+
+Beginning with version 5.004, the following functions are also supported:
+
+ HE* hv_fetch_ent (HV* tb, SV* key, I32 lval, U32 hash);
+ HE* hv_store_ent (HV* tb, SV* key, SV* val, U32 hash);
+
+ bool hv_exists_ent (HV* tb, SV* key, U32 hash);
+ SV* hv_delete_ent (HV* tb, SV* key, I32 flags, U32 hash);
+
+ SV* hv_iterkeysv (HE* entry);
+
+Note that these functions take C<SV*> keys, which simplifies writing
+of extension code that deals with hash structures. These functions
+also allow passing of C<SV*> keys to C<tie> functions without forcing
+you to stringify the keys (unlike the previous set of functions).
+
+They also return and accept whole hash entries (C<HE*>), making their
+use more efficient (since the hash number for a particular string
+doesn't have to be recomputed every time). See L<perlapi> for detailed
+descriptions.
+
+The following macros must always be used to access the contents of hash
+entries. Note that the arguments to these macros must be simple
+variables, since they may get evaluated more than once. See
+L<perlapi> for detailed descriptions of these macros.
+
+ HePV(HE* he, STRLEN len)
+ HeVAL(HE* he)
+ HeHASH(HE* he)
+ HeSVKEY(HE* he)
+ HeSVKEY_force(HE* he)
+ HeSVKEY_set(HE* he, SV* sv)
+
+These two lower level macros are defined, but must only be used when
+dealing with keys that are not C<SV*>s:
+
+ HeKEY(HE* he)
+ HeKLEN(HE* he)
+
+Note that both C<hv_store> and C<hv_store_ent> do not increment the
+reference count of the stored C<val>, which is the caller's responsibility.
+If these functions return a NULL value, the caller will usually have to
+decrement the reference count of C<val> to avoid a memory leak.
+
+=head2 AVs, HVs and undefined values
+
+Sometimes you have to store undefined values in AVs or HVs. Although
+this may be a rare case, it can be tricky. That's because you're
+used to using C<&PL_sv_undef> if you need an undefined SV.
+
+For example, intuition tells you that this XS code:
+
+ AV *av = newAV();
+ av_store( av, 0, &PL_sv_undef );
+
+is equivalent to this Perl code:
+
+ my @av;
+ $av[0] = undef;
+
+Unfortunately, this isn't true. AVs use C<&PL_sv_undef> as a marker
+for indicating that an array element has not yet been initialized.
+Thus, C<exists $av[0]> would be true for the above Perl code, but
+false for the array generated by the XS code.
+
+Other problems can occur when storing C<&PL_sv_undef> in HVs:
+
+ hv_store( hv, "key", 3, &PL_sv_undef, 0 );
+
+This will indeed make the value C<undef>, but if you try to modify
+the value of C<key>, you'll get the following error:
+
+ Modification of non-creatable hash value attempted
+
+In perl 5.8.0, C<&PL_sv_undef> was also used to mark placeholders
+in restricted hashes. This caused such hash entries not to appear
+when iterating over the hash or when checking for the keys
+with the C<hv_exists> function.
+
+You can run into similar problems when you store C<&PL_sv_true> or
+C<&PL_sv_false> into AVs or HVs. Trying to modify such elements
+will give you the following error:
+
+ Modification of a read-only value attempted
+
+To make a long story short, you can use the special variables
+C<&PL_sv_undef>, C<&PL_sv_true> and C<&PL_sv_false> with AVs and
+HVs, but you have to make sure you know what you're doing.
+
+Generally, if you want to store an undefined value in an AV
+or HV, you should not use C<&PL_sv_undef>, but rather create a
+new undefined value using the C<newSV> function, for example:
+
+ av_store( av, 42, newSV(0) );
+ hv_store( hv, "foo", 3, newSV(0), 0 );
+
+=head2 References
+
+References are a special type of scalar that point to other data types
+(including references).
+
+To create a reference, use either of the following functions:
+
+ SV* newRV_inc((SV*) thing);
+ SV* newRV_noinc((SV*) thing);
+
+The C<thing> argument can be any of an C<SV*>, C<AV*>, or C<HV*>. The
+functions are identical except that C<newRV_inc> increments the reference
+count of the C<thing>, while C<newRV_noinc> does not. For historical
+reasons, C<newRV> is a synonym for C<newRV_inc>.
+
+Once you have a reference, you can use the following macro to dereference
+the reference:
+
+ SvRV(SV*)
+
+then call the appropriate routines, casting the returned C<SV*> to either an
+C<AV*> or C<HV*>, if required.
+
+To determine if an SV is a reference, you can use the following macro:
+
+ SvROK(SV*)
+
+To discover what type of value the reference refers to, use the following
+macro and then check the return value.
+
+ SvTYPE(SvRV(SV*))
+
+The most useful types that will be returned are:
+
+ SVt_IV Scalar
+ SVt_NV Scalar
+ SVt_PV Scalar
+ SVt_RV Scalar
+ SVt_PVAV Array
+ SVt_PVHV Hash
+ SVt_PVCV Code
+ SVt_PVGV Glob (possible a file handle)
+ SVt_PVMG Blessed or Magical Scalar
+
+See the F<sv.h> header file for more details.
+
+=head2 Blessed References and Class Objects
+
+References are also used to support object-oriented programming. In perl's
+OO lexicon, an object is simply a reference that has been blessed into a
+package (or class). Once blessed, the programmer may now use the reference
+to access the various methods in the class.
+
+A reference can be blessed into a package with the following function:
+
+ SV* sv_bless(SV* sv, HV* stash);
+
+The C<sv> argument must be a reference value. The C<stash> argument
+specifies which class the reference will belong to. See
+L<Stashes and Globs> for information on converting class names into stashes.
+
+/* Still under construction */
+
+Upgrades rv to reference if not already one. Creates new SV for rv to
+point to. If C<classname> is non-null, the SV is blessed into the specified
+class. SV is returned.
+
+ SV* newSVrv(SV* rv, const char* classname);
+
+Copies integer, unsigned integer or double into an SV whose reference is C<rv>. SV is blessed
+if C<classname> is non-null.
+
+ SV* sv_setref_iv(SV* rv, const char* classname, IV iv);
+ SV* sv_setref_uv(SV* rv, const char* classname, UV uv);
+ SV* sv_setref_nv(SV* rv, const char* classname, NV iv);
+
+Copies the pointer value (I<the address, not the string!>) into an SV whose
+reference is rv. SV is blessed if C<classname> is non-null.
+
+ SV* sv_setref_pv(SV* rv, const char* classname, PV iv);
+
+Copies string into an SV whose reference is C<rv>. Set length to 0 to let
+Perl calculate the string length. SV is blessed if C<classname> is non-null.
+
+ SV* sv_setref_pvn(SV* rv, const char* classname, PV iv, STRLEN length);
+
+Tests whether the SV is blessed into the specified class. It does not
+check inheritance relationships.
+
+ int sv_isa(SV* sv, const char* name);
+
+Tests whether the SV is a reference to a blessed object.
+
+ int sv_isobject(SV* sv);
+
+Tests whether the SV is derived from the specified class. SV can be either
+a reference to a blessed object or a string containing a class name. This
+is the function implementing the C<UNIVERSAL::isa> functionality.
+
+ bool sv_derived_from(SV* sv, const char* name);
+
+To check if you've got an object derived from a specific class you have
+to write:
+
+ if (sv_isobject(sv) && sv_derived_from(sv, class)) { ... }
+
+=head2 Creating New Variables
+
+To create a new Perl variable with an undef value which can be accessed from
+your Perl script, use the following routines, depending on the variable type.
+
+ SV* get_sv("package::varname", GV_ADD);
+ AV* get_av("package::varname", GV_ADD);
+ HV* get_hv("package::varname", GV_ADD);
+
+Notice the use of TRUE as the second parameter. The new variable can now
+be set, using the routines appropriate to the data type.
+
+There are additional macros whose values may be bitwise OR'ed with the
+C<TRUE> argument to enable certain extra features. Those bits are:
+
+=over
+
+=item GV_ADDMULTI
+
+Marks the variable as multiply defined, thus preventing the:
+
+ Name <varname> used only once: possible typo
+
+warning.
+
+=item GV_ADDWARN
+
+Issues the warning:
+
+ Had to create <varname> unexpectedly
+
+if the variable did not exist before the function was called.
+
+=back
+
+If you do not specify a package name, the variable is created in the current
+package.
+
+=head2 Reference Counts and Mortality
+
+Perl uses a reference count-driven garbage collection mechanism. SVs,
+AVs, or HVs (xV for short in the following) start their life with a
+reference count of 1. If the reference count of an xV ever drops to 0,
+then it will be destroyed and its memory made available for reuse.
+
+This normally doesn't happen at the Perl level unless a variable is
+undef'ed or the last variable holding a reference to it is changed or
+overwritten. At the internal level, however, reference counts can be
+manipulated with the following macros:
+
+ int SvREFCNT(SV* sv);
+ SV* SvREFCNT_inc(SV* sv);
+ void SvREFCNT_dec(SV* sv);
+
+However, there is one other function which manipulates the reference
+count of its argument. The C<newRV_inc> function, you will recall,
+creates a reference to the specified argument. As a side effect,
+it increments the argument's reference count. If this is not what
+you want, use C<newRV_noinc> instead.
+
+For example, imagine you want to return a reference from an XSUB function.
+Inside the XSUB routine, you create an SV which initially has a reference
+count of one. Then you call C<newRV_inc>, passing it the just-created SV.
+This returns the reference as a new SV, but the reference count of the
+SV you passed to C<newRV_inc> has been incremented to two. Now you
+return the reference from the XSUB routine and forget about the SV.
+But Perl hasn't! Whenever the returned reference is destroyed, the
+reference count of the original SV is decreased to one and nothing happens.
+The SV will hang around without any way to access it until Perl itself
+terminates. This is a memory leak.
+
+The correct procedure, then, is to use C<newRV_noinc> instead of
+C<newRV_inc>. Then, if and when the last reference is destroyed,
+the reference count of the SV will go to zero and it will be destroyed,
+stopping any memory leak.
+
+There are some convenience functions available that can help with the
+destruction of xVs. These functions introduce the concept of "mortality".
+An xV that is mortal has had its reference count marked to be decremented,
+but not actually decremented, until "a short time later". Generally the
+term "short time later" means a single Perl statement, such as a call to
+an XSUB function. The actual determinant for when mortal xVs have their
+reference count decremented depends on two macros, SAVETMPS and FREETMPS.
+See L<perlcall> and L<perlxs> for more details on these macros.
+
+"Mortalization" then is at its simplest a deferred C<SvREFCNT_dec>.
+However, if you mortalize a variable twice, the reference count will
+later be decremented twice.
+
+"Mortal" SVs are mainly used for SVs that are placed on perl's stack.
+For example an SV which is created just to pass a number to a called sub
+is made mortal to have it cleaned up automatically when it's popped off
+the stack. Similarly, results returned by XSUBs (which are pushed on the
+stack) are often made mortal.
+
+To create a mortal variable, use the functions:
+
+ SV* sv_newmortal()
+ SV* sv_2mortal(SV*)
+ SV* sv_mortalcopy(SV*)
+
+The first call creates a mortal SV (with no value), the second converts an existing
+SV to a mortal SV (and thus defers a call to C<SvREFCNT_dec>), and the
+third creates a mortal copy of an existing SV.
+Because C<sv_newmortal> gives the new SV no value,it must normally be given one
+via C<sv_setpv>, C<sv_setiv>, etc. :
+
+ SV *tmp = sv_newmortal();
+ sv_setiv(tmp, an_integer);
+
+As that is multiple C statements it is quite common so see this idiom instead:
+
+ SV *tmp = sv_2mortal(newSViv(an_integer));
+
+
+You should be careful about creating mortal variables. Strange things
+can happen if you make the same value mortal within multiple contexts,
+or if you make a variable mortal multiple times. Thinking of "Mortalization"
+as deferred C<SvREFCNT_dec> should help to minimize such problems.
+For example if you are passing an SV which you I<know> has high enough REFCNT
+to survive its use on the stack you need not do any mortalization.
+If you are not sure then doing an C<SvREFCNT_inc> and C<sv_2mortal>, or
+making a C<sv_mortalcopy> is safer.
+
+The mortal routines are not just for SVs -- AVs and HVs can be
+made mortal by passing their address (type-casted to C<SV*>) to the
+C<sv_2mortal> or C<sv_mortalcopy> routines.
+
+=head2 Stashes and Globs
+
+A B<stash> is a hash that contains all variables that are defined
+within a package. Each key of the stash is a symbol
+name (shared by all the different types of objects that have the same
+name), and each value in the hash table is a GV (Glob Value). This GV
+in turn contains references to the various objects of that name,
+including (but not limited to) the following:
+
+ Scalar Value
+ Array Value
+ Hash Value
+ I/O Handle
+ Format
+ Subroutine
+
+There is a single stash called C<PL_defstash> that holds the items that exist
+in the C<main> package. To get at the items in other packages, append the
+string "::" to the package name. The items in the C<Foo> package are in
+the stash C<Foo::> in PL_defstash. The items in the C<Bar::Baz> package are
+in the stash C<Baz::> in C<Bar::>'s stash.
+
+To get the stash pointer for a particular package, use the function:
+
+ HV* gv_stashpv(const char* name, I32 flags)
+ HV* gv_stashsv(SV*, I32 flags)
+
+The first function takes a literal string, the second uses the string stored
+in the SV. Remember that a stash is just a hash table, so you get back an
+C<HV*>. The C<flags> flag will create a new package if it is set to GV_ADD.
+
+The name that C<gv_stash*v> wants is the name of the package whose symbol table
+you want. The default package is called C<main>. If you have multiply nested
+packages, pass their names to C<gv_stash*v>, separated by C<::> as in the Perl
+language itself.
+
+Alternately, if you have an SV that is a blessed reference, you can find
+out the stash pointer by using:
+
+ HV* SvSTASH(SvRV(SV*));
+
+then use the following to get the package name itself:
+
+ char* HvNAME(HV* stash);
+
+If you need to bless or re-bless an object you can use the following
+function:
+
+ SV* sv_bless(SV*, HV* stash)
+
+where the first argument, an C<SV*>, must be a reference, and the second
+argument is a stash. The returned C<SV*> can now be used in the same way
+as any other SV.
+
+For more information on references and blessings, consult L<perlref>.
+
+=head2 Double-Typed SVs
+
+Scalar variables normally contain only one type of value, an integer,
+double, pointer, or reference. Perl will automatically convert the
+actual scalar data from the stored type into the requested type.
+
+Some scalar variables contain more than one type of scalar data. For
+example, the variable C<$!> contains either the numeric value of C<errno>
+or its string equivalent from either C<strerror> or C<sys_errlist[]>.
+
+To force multiple data values into an SV, you must do two things: use the
+C<sv_set*v> routines to add the additional scalar type, then set a flag
+so that Perl will believe it contains more than one type of data. The
+four macros to set the flags are:
+
+ SvIOK_on
+ SvNOK_on
+ SvPOK_on
+ SvROK_on
+
+The particular macro you must use depends on which C<sv_set*v> routine
+you called first. This is because every C<sv_set*v> routine turns on
+only the bit for the particular type of data being set, and turns off
+all the rest.
+
+For example, to create a new Perl variable called "dberror" that contains
+both the numeric and descriptive string error values, you could use the
+following code:
+
+ extern int dberror;
+ extern char *dberror_list;
+
+ SV* sv = get_sv("dberror", GV_ADD);
+ sv_setiv(sv, (IV) dberror);
+ sv_setpv(sv, dberror_list[dberror]);
+ SvIOK_on(sv);
+
+If the order of C<sv_setiv> and C<sv_setpv> had been reversed, then the
+macro C<SvPOK_on> would need to be called instead of C<SvIOK_on>.
+
+=head2 Magic Variables
+
+[This section still under construction. Ignore everything here. Post no
+bills. Everything not permitted is forbidden.]
+
+Any SV may be magical, that is, it has special features that a normal
+SV does not have. These features are stored in the SV structure in a
+linked list of C<struct magic>'s, typedef'ed to C<MAGIC>.
+
+ struct magic {
+ MAGIC* mg_moremagic;
+ MGVTBL* mg_virtual;
+ U16 mg_private;
+ char mg_type;
+ U8 mg_flags;
+ I32 mg_len;
+ SV* mg_obj;
+ char* mg_ptr;
+ };
+
+Note this is current as of patchlevel 0, and could change at any time.
+
+=head2 Assigning Magic
+
+Perl adds magic to an SV using the sv_magic function:
+
+ void sv_magic(SV* sv, SV* obj, int how, const char* name, I32 namlen);
+
+The C<sv> argument is a pointer to the SV that is to acquire a new magical
+feature.
+
+If C<sv> is not already magical, Perl uses the C<SvUPGRADE> macro to
+convert C<sv> to type C<SVt_PVMG>. Perl then continues by adding new magic
+to the beginning of the linked list of magical features. Any prior entry
+of the same type of magic is deleted. Note that this can be overridden,
+and multiple instances of the same type of magic can be associated with an
+SV.
+
+The C<name> and C<namlen> arguments are used to associate a string with
+the magic, typically the name of a variable. C<namlen> is stored in the
+C<mg_len> field and if C<name> is non-null then either a C<savepvn> copy of
+C<name> or C<name> itself is stored in the C<mg_ptr> field, depending on
+whether C<namlen> is greater than zero or equal to zero respectively. As a
+special case, if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
+to contain an C<SV*> and is stored as-is with its REFCNT incremented.
+
+The sv_magic function uses C<how> to determine which, if any, predefined
+"Magic Virtual Table" should be assigned to the C<mg_virtual> field.
+See the L<Magic Virtual Tables> section below. The C<how> argument is also
+stored in the C<mg_type> field. The value of C<how> should be chosen
+from the set of macros C<PERL_MAGIC_foo> found in F<perl.h>. Note that before
+these macros were added, Perl internals used to directly use character
+literals, so you may occasionally come across old code or documentation
+referring to 'U' magic rather than C<PERL_MAGIC_uvar> for example.
+
+The C<obj> argument is stored in the C<mg_obj> field of the C<MAGIC>
+structure. If it is not the same as the C<sv> argument, the reference
+count of the C<obj> object is incremented. If it is the same, or if
+the C<how> argument is C<PERL_MAGIC_arylen>, or if it is a NULL pointer,
+then C<obj> is merely stored, without the reference count being incremented.
+
+See also C<sv_magicext> in L<perlapi> for a more flexible way to add magic
+to an SV.
+
+There is also a function to add magic to an C<HV>:
+
+ void hv_magic(HV *hv, GV *gv, int how);
+
+This simply calls C<sv_magic> and coerces the C<gv> argument into an C<SV>.
+
+To remove the magic from an SV, call the function sv_unmagic:
+
+ void sv_unmagic(SV *sv, int type);
+
+The C<type> argument should be equal to the C<how> value when the C<SV>
+was initially made magical.
+
+=head2 Magic Virtual Tables
+
+The C<mg_virtual> field in the C<MAGIC> structure is a pointer to an
+C<MGVTBL>, which is a structure of function pointers and stands for
+"Magic Virtual Table" to handle the various operations that might be
+applied to that variable.
+
+The C<MGVTBL> has five (or sometimes eight) pointers to the following
+routine types:
+
+ int (*svt_get)(SV* sv, MAGIC* mg);
+ int (*svt_set)(SV* sv, MAGIC* mg);
+ U32 (*svt_len)(SV* sv, MAGIC* mg);
+ int (*svt_clear)(SV* sv, MAGIC* mg);
+ int (*svt_free)(SV* sv, MAGIC* mg);
+
+ int (*svt_copy)(SV *sv, MAGIC* mg, SV *nsv, const char *name, int namlen);
+ int (*svt_dup)(MAGIC *mg, CLONE_PARAMS *param);
+ int (*svt_local)(SV *nsv, MAGIC *mg);
+
+
+This MGVTBL structure is set at compile-time in F<perl.h> and there are
+currently 32 types. These different structures contain pointers to various
+routines that perform additional actions depending on which function is
+being called.
+
+ Function pointer Action taken
+ ---------------- ------------
+ svt_get Do something before the value of the SV is retrieved.
+ svt_set Do something after the SV is assigned a value.
+ svt_len Report on the SV's length.
+ svt_clear Clear something the SV represents.
+ svt_free Free any extra storage associated with the SV.
+
+ svt_copy copy tied variable magic to a tied element
+ svt_dup duplicate a magic structure during thread cloning
+ svt_local copy magic to local value during 'local'
+
+For instance, the MGVTBL structure called C<vtbl_sv> (which corresponds
+to an C<mg_type> of C<PERL_MAGIC_sv>) contains:
+
+ { magic_get, magic_set, magic_len, 0, 0 }
+
+Thus, when an SV is determined to be magical and of type C<PERL_MAGIC_sv>,
+if a get operation is being performed, the routine C<magic_get> is
+called. All the various routines for the various magical types begin
+with C<magic_>. NOTE: the magic routines are not considered part of
+the Perl API, and may not be exported by the Perl library.
+
+The last three slots are a recent addition, and for source code
+compatibility they are only checked for if one of the three flags
+MGf_COPY, MGf_DUP or MGf_LOCAL is set in mg_flags. This means that most
+code can continue declaring a vtable as a 5-element value. These three are
+currently used exclusively by the threading code, and are highly subject
+to change.
+
+The current kinds of Magic Virtual Tables are:
+
+ mg_type
+ (old-style char and macro) MGVTBL Type of magic
+ -------------------------- ------ -------------
+ \0 PERL_MAGIC_sv vtbl_sv Special scalar variable
+ A PERL_MAGIC_overload vtbl_amagic %OVERLOAD hash
+ a PERL_MAGIC_overload_elem vtbl_amagicelem %OVERLOAD hash element
+ c PERL_MAGIC_overload_table (none) Holds overload table (AMT)
+ on stash
+ B PERL_MAGIC_bm vtbl_bm Boyer-Moore (fast string search)
+ D PERL_MAGIC_regdata vtbl_regdata Regex match position data
+ (@+ and @- vars)
+ d PERL_MAGIC_regdatum vtbl_regdatum Regex match position data
+ element
+ E PERL_MAGIC_env vtbl_env %ENV hash
+ e PERL_MAGIC_envelem vtbl_envelem %ENV hash element
+ f PERL_MAGIC_fm vtbl_fm Formline ('compiled' format)
+ g PERL_MAGIC_regex_global vtbl_mglob m//g target / study()ed string
+ H PERL_MAGIC_hints vtbl_sig %^H hash
+ h PERL_MAGIC_hintselem vtbl_hintselem %^H hash element
+ I PERL_MAGIC_isa vtbl_isa @ISA array
+ i PERL_MAGIC_isaelem vtbl_isaelem @ISA array element
+ k PERL_MAGIC_nkeys vtbl_nkeys scalar(keys()) lvalue
+ L PERL_MAGIC_dbfile (none) Debugger %_<filename
+ l PERL_MAGIC_dbline vtbl_dbline Debugger %_<filename element
+ o PERL_MAGIC_collxfrm vtbl_collxfrm Locale collate transformation
+ P PERL_MAGIC_tied vtbl_pack Tied array or hash
+ p PERL_MAGIC_tiedelem vtbl_packelem Tied array or hash element
+ q PERL_MAGIC_tiedscalar vtbl_packelem Tied scalar or handle
+ r PERL_MAGIC_qr vtbl_qr precompiled qr// regex
+ S PERL_MAGIC_sig vtbl_sig %SIG hash
+ s PERL_MAGIC_sigelem vtbl_sigelem %SIG hash element
+ t PERL_MAGIC_taint vtbl_taint Taintedness
+ U PERL_MAGIC_uvar vtbl_uvar Available for use by extensions
+ v PERL_MAGIC_vec vtbl_vec vec() lvalue
+ V PERL_MAGIC_vstring (none) v-string scalars
+ w PERL_MAGIC_utf8 vtbl_utf8 UTF-8 length+offset cache
+ x PERL_MAGIC_substr vtbl_substr substr() lvalue
+ y PERL_MAGIC_defelem vtbl_defelem Shadow "foreach" iterator
+ variable / smart parameter
+ vivification
+ # PERL_MAGIC_arylen vtbl_arylen Array length ($#ary)
+ . PERL_MAGIC_pos vtbl_pos pos() lvalue
+ < PERL_MAGIC_backref vtbl_backref back pointer to a weak ref
+ ~ PERL_MAGIC_ext (none) Available for use by extensions
+ : PERL_MAGIC_symtab (none) hash used as symbol table
+ % PERL_MAGIC_rhash (none) hash used as restricted hash
+ @ PERL_MAGIC_arylen_p vtbl_arylen_p pointer to $#a from @a
+
+
+When an uppercase and lowercase letter both exist in the table, then the
+uppercase letter is typically used to represent some kind of composite type
+(a list or a hash), and the lowercase letter is used to represent an element
+of that composite type. Some internals code makes use of this case
+relationship. However, 'v' and 'V' (vec and v-string) are in no way related.
+
+The C<PERL_MAGIC_ext> and C<PERL_MAGIC_uvar> magic types are defined
+specifically for use by extensions and will not be used by perl itself.
+Extensions can use C<PERL_MAGIC_ext> magic to 'attach' private information
+to variables (typically objects). This is especially useful because
+there is no way for normal perl code to corrupt this private information
+(unlike using extra elements of a hash object).
+
+Similarly, C<PERL_MAGIC_uvar> magic can be used much like tie() to call a
+C function any time a scalar's value is used or changed. The C<MAGIC>'s
+C<mg_ptr> field points to a C<ufuncs> structure:
+
+ struct ufuncs {
+ I32 (*uf_val)(pTHX_ IV, SV*);
+ I32 (*uf_set)(pTHX_ IV, SV*);
+ IV uf_index;
+ };
+
+When the SV is read from or written to, the C<uf_val> or C<uf_set>
+function will be called with C<uf_index> as the first arg and a pointer to
+the SV as the second. A simple example of how to add C<PERL_MAGIC_uvar>
+magic is shown below. Note that the ufuncs structure is copied by
+sv_magic, so you can safely allocate it on the stack.
+
+ void
+ Umagic(sv)
+ SV *sv;
+ PREINIT:
+ struct ufuncs uf;
+ CODE:
+ uf.uf_val = &my_get_fn;
+ uf.uf_set = &my_set_fn;
+ uf.uf_index = 0;
+ sv_magic(sv, 0, PERL_MAGIC_uvar, (char*)&uf, sizeof(uf));
+
+Attaching C<PERL_MAGIC_uvar> to arrays is permissible but has no effect.
+
+For hashes there is a specialized hook that gives control over hash
+keys (but not values). This hook calls C<PERL_MAGIC_uvar> 'get' magic
+if the "set" function in the C<ufuncs> structure is NULL. The hook
+is activated whenever the hash is accessed with a key specified as
+an C<SV> through the functions C<hv_store_ent>, C<hv_fetch_ent>,
+C<hv_delete_ent>, and C<hv_exists_ent>. Accessing the key as a string
+through the functions without the C<..._ent> suffix circumvents the
+hook. See L<Hash::Util::Fieldhash/Guts> for a detailed description.
+
+Note that because multiple extensions may be using C<PERL_MAGIC_ext>
+or C<PERL_MAGIC_uvar> magic, it is important for extensions to take
+extra care to avoid conflict. Typically only using the magic on
+objects blessed into the same class as the extension is sufficient.
+For C<PERL_MAGIC_ext> magic, it may also be appropriate to add an I32
+'signature' at the top of the private data area and check that.
+
+Also note that the C<sv_set*()> and C<sv_cat*()> functions described
+earlier do B<not> invoke 'set' magic on their targets. This must
+be done by the user either by calling the C<SvSETMAGIC()> macro after
+calling these functions, or by using one of the C<sv_set*_mg()> or
+C<sv_cat*_mg()> functions. Similarly, generic C code must call the
+C<SvGETMAGIC()> macro to invoke any 'get' magic if they use an SV
+obtained from external sources in functions that don't handle magic.
+See L<perlapi> for a description of these functions.
+For example, calls to the C<sv_cat*()> functions typically need to be
+followed by C<SvSETMAGIC()>, but they don't need a prior C<SvGETMAGIC()>
+since their implementation handles 'get' magic.
+
+=head2 Finding Magic
+
+ MAGIC* mg_find(SV*, int type); /* Finds the magic pointer of that type */
+
+This routine returns a pointer to the C<MAGIC> structure stored in the SV.
+If the SV does not have that magical feature, C<NULL> is returned. Also,
+if the SV is not of type SVt_PVMG, Perl may core dump.
+
+ int mg_copy(SV* sv, SV* nsv, const char* key, STRLEN klen);
+
+This routine checks to see what types of magic C<sv> has. If the mg_type
+field is an uppercase letter, then the mg_obj is copied to C<nsv>, but
+the mg_type field is changed to be the lowercase letter.
+
+=head2 Understanding the Magic of Tied Hashes and Arrays
+
+Tied hashes and arrays are magical beasts of the C<PERL_MAGIC_tied>
+magic type.
+
+WARNING: As of the 5.004 release, proper usage of the array and hash
+access functions requires understanding a few caveats. Some
+of these caveats are actually considered bugs in the API, to be fixed
+in later releases, and are bracketed with [MAYCHANGE] below. If
+you find yourself actually applying such information in this section, be
+aware that the behavior may change in the future, umm, without warning.
+
+The perl tie function associates a variable with an object that implements
+the various GET, SET, etc methods. To perform the equivalent of the perl
+tie function from an XSUB, you must mimic this behaviour. The code below
+carries out the necessary steps - firstly it creates a new hash, and then
+creates a second hash which it blesses into the class which will implement
+the tie methods. Lastly it ties the two hashes together, and returns a
+reference to the new tied hash. Note that the code below does NOT call the
+TIEHASH method in the MyTie class -
+see L<Calling Perl Routines from within C Programs> for details on how
+to do this.
+
+ SV*
+ mytie()
+ PREINIT:
+ HV *hash;
+ HV *stash;
+ SV *tie;
+ CODE:
+ hash = newHV();
+ tie = newRV_noinc((SV*)newHV());
+ stash = gv_stashpv("MyTie", GV_ADD);
+ sv_bless(tie, stash);
+ hv_magic(hash, (GV*)tie, PERL_MAGIC_tied);
+ RETVAL = newRV_noinc(hash);
+ OUTPUT:
+ RETVAL
+
+The C<av_store> function, when given a tied array argument, merely
+copies the magic of the array onto the value to be "stored", using
+C<mg_copy>. It may also return NULL, indicating that the value did not
+actually need to be stored in the array. [MAYCHANGE] After a call to
+C<av_store> on a tied array, the caller will usually need to call
+C<mg_set(val)> to actually invoke the perl level "STORE" method on the
+TIEARRAY object. If C<av_store> did return NULL, a call to
+C<SvREFCNT_dec(val)> will also be usually necessary to avoid a memory
+leak. [/MAYCHANGE]
+
+The previous paragraph is applicable verbatim to tied hash access using the
+C<hv_store> and C<hv_store_ent> functions as well.
+
+C<av_fetch> and the corresponding hash functions C<hv_fetch> and
+C<hv_fetch_ent> actually return an undefined mortal value whose magic
+has been initialized using C<mg_copy>. Note the value so returned does not
+need to be deallocated, as it is already mortal. [MAYCHANGE] But you will
+need to call C<mg_get()> on the returned value in order to actually invoke
+the perl level "FETCH" method on the underlying TIE object. Similarly,
+you may also call C<mg_set()> on the return value after possibly assigning
+a suitable value to it using C<sv_setsv>, which will invoke the "STORE"
+method on the TIE object. [/MAYCHANGE]
+
+[MAYCHANGE]
+In other words, the array or hash fetch/store functions don't really
+fetch and store actual values in the case of tied arrays and hashes. They
+merely call C<mg_copy> to attach magic to the values that were meant to be
+"stored" or "fetched". Later calls to C<mg_get> and C<mg_set> actually
+do the job of invoking the TIE methods on the underlying objects. Thus
+the magic mechanism currently implements a kind of lazy access to arrays
+and hashes.
+
+Currently (as of perl version 5.004), use of the hash and array access
+functions requires the user to be aware of whether they are operating on
+"normal" hashes and arrays, or on their tied variants. The API may be
+changed to provide more transparent access to both tied and normal data
+types in future versions.
+[/MAYCHANGE]
+
+You would do well to understand that the TIEARRAY and TIEHASH interfaces
+are mere sugar to invoke some perl method calls while using the uniform hash
+and array syntax. The use of this sugar imposes some overhead (typically
+about two to four extra opcodes per FETCH/STORE operation, in addition to
+the creation of all the mortal variables required to invoke the methods).
+This overhead will be comparatively small if the TIE methods are themselves
+substantial, but if they are only a few statements long, the overhead
+will not be insignificant.
+
+=head2 Localizing changes
+
+Perl has a very handy construction
+
+ {
+ local $var = 2;
+ ...
+ }
+
+This construction is I<approximately> equivalent to
+
+ {
+ my $oldvar = $var;
+ $var = 2;
+ ...
+ $var = $oldvar;
+ }
+
+The biggest difference is that the first construction would
+reinstate the initial value of $var, irrespective of how control exits
+the block: C<goto>, C<return>, C<die>/C<eval>, etc. It is a little bit
+more efficient as well.
+
+There is a way to achieve a similar task from C via Perl API: create a
+I<pseudo-block>, and arrange for some changes to be automatically
+undone at the end of it, either explicit, or via a non-local exit (via
+die()). A I<block>-like construct is created by a pair of
+C<ENTER>/C<LEAVE> macros (see L<perlcall/"Returning a Scalar">).
+Such a construct may be created specially for some important localized
+task, or an existing one (like boundaries of enclosing Perl
+subroutine/block, or an existing pair for freeing TMPs) may be
+used. (In the second case the overhead of additional localization must
+be almost negligible.) Note that any XSUB is automatically enclosed in
+an C<ENTER>/C<LEAVE> pair.
+
+Inside such a I<pseudo-block> the following service is available:
+
+=over 4
+
+=item C<SAVEINT(int i)>
+
+=item C<SAVEIV(IV i)>
+
+=item C<SAVEI32(I32 i)>
+
+=item C<SAVELONG(long i)>
+
+These macros arrange things to restore the value of integer variable
+C<i> at the end of enclosing I<pseudo-block>.
+
+=item C<SAVESPTR(s)>
+
+=item C<SAVEPPTR(p)>
+
+These macros arrange things to restore the value of pointers C<s> and
+C<p>. C<s> must be a pointer of a type which survives conversion to
+C<SV*> and back, C<p> should be able to survive conversion to C<char*>
+and back.
+
+=item C<SAVEFREESV(SV *sv)>
+
+The refcount of C<sv> would be decremented at the end of
+I<pseudo-block>. This is similar to C<sv_2mortal> in that it is also a
+mechanism for doing a delayed C<SvREFCNT_dec>. However, while C<sv_2mortal>
+extends the lifetime of C<sv> until the beginning of the next statement,
+C<SAVEFREESV> extends it until the end of the enclosing scope. These
+lifetimes can be wildly different.
+
+Also compare C<SAVEMORTALIZESV>.
+
+=item C<SAVEMORTALIZESV(SV *sv)>
+
+Just like C<SAVEFREESV>, but mortalizes C<sv> at the end of the current
+scope instead of decrementing its reference count. This usually has the
+effect of keeping C<sv> alive until the statement that called the currently
+live scope has finished executing.
+
+=item C<SAVEFREEOP(OP *op)>
+
+The C<OP *> is op_free()ed at the end of I<pseudo-block>.
+
+=item C<SAVEFREEPV(p)>
+
+The chunk of memory which is pointed to by C<p> is Safefree()ed at the
+end of I<pseudo-block>.
+
+=item C<SAVECLEARSV(SV *sv)>
+
+Clears a slot in the current scratchpad which corresponds to C<sv> at
+the end of I<pseudo-block>.
+
+=item C<SAVEDELETE(HV *hv, char *key, I32 length)>
+
+The key C<key> of C<hv> is deleted at the end of I<pseudo-block>. The
+string pointed to by C<key> is Safefree()ed. If one has a I<key> in
+short-lived storage, the corresponding string may be reallocated like
+this:
+
+ SAVEDELETE(PL_defstash, savepv(tmpbuf), strlen(tmpbuf));
+
+=item C<SAVEDESTRUCTOR(DESTRUCTORFUNC_NOCONTEXT_t f, void *p)>
+
+At the end of I<pseudo-block> the function C<f> is called with the
+only argument C<p>.
+
+=item C<SAVEDESTRUCTOR_X(DESTRUCTORFUNC_t f, void *p)>
+
+At the end of I<pseudo-block> the function C<f> is called with the
+implicit context argument (if any), and C<p>.
+
+=item C<SAVESTACK_POS()>
+
+The current offset on the Perl internal stack (cf. C<SP>) is restored
+at the end of I<pseudo-block>.
+
+=back
+
+The following API list contains functions, thus one needs to
+provide pointers to the modifiable data explicitly (either C pointers,
+or Perlish C<GV *>s). Where the above macros take C<int>, a similar
+function takes C<int *>.
+
+=over 4
+
+=item C<SV* save_scalar(GV *gv)>
+
+Equivalent to Perl code C<local $gv>.
+
+=item C<AV* save_ary(GV *gv)>
+
+=item C<HV* save_hash(GV *gv)>
+
+Similar to C<save_scalar>, but localize C<@gv> and C<%gv>.
+
+=item C<void save_item(SV *item)>
+
+Duplicates the current value of C<SV>, on the exit from the current
+C<ENTER>/C<LEAVE> I<pseudo-block> will restore the value of C<SV>
+using the stored value. It doesn't handle magic. Use C<save_scalar> if
+magic is affected.
+
+=item C<void save_list(SV **sarg, I32 maxsarg)>
+
+A variant of C<save_item> which takes multiple arguments via an array
+C<sarg> of C<SV*> of length C<maxsarg>.
+
+=item C<SV* save_svref(SV **sptr)>
+
+Similar to C<save_scalar>, but will reinstate an C<SV *>.
+
+=item C<void save_aptr(AV **aptr)>
+
+=item C<void save_hptr(HV **hptr)>
+
+Similar to C<save_svref>, but localize C<AV *> and C<HV *>.
+
+=back
+
+The C<Alias> module implements localization of the basic types within the
+I<caller's scope>. People who are interested in how to localize things in
+the containing scope should take a look there too.
+
+=head1 Subroutines
+
+=head2 XSUBs and the Argument Stack
+
+The XSUB mechanism is a simple way for Perl programs to access C subroutines.
+An XSUB routine will have a stack that contains the arguments from the Perl
+program, and a way to map from the Perl data structures to a C equivalent.
+
+The stack arguments are accessible through the C<ST(n)> macro, which returns
+the C<n>'th stack argument. Argument 0 is the first argument passed in the
+Perl subroutine call. These arguments are C<SV*>, and can be used anywhere
+an C<SV*> is used.
+
+Most of the time, output from the C routine can be handled through use of
+the RETVAL and OUTPUT directives. However, there are some cases where the
+argument stack is not already long enough to handle all the return values.
+An example is the POSIX tzname() call, which takes no arguments, but returns
+two, the local time zone's standard and summer time abbreviations.
+
+To handle this situation, the PPCODE directive is used and the stack is
+extended using the macro:
+
+ EXTEND(SP, num);
+
+where C<SP> is the macro that represents the local copy of the stack pointer,
+and C<num> is the number of elements the stack should be extended by.
+
+Now that there is room on the stack, values can be pushed on it using C<PUSHs>
+macro. The pushed values will often need to be "mortal" (See
+L</Reference Counts and Mortality>):
+
+ PUSHs(sv_2mortal(newSViv(an_integer)))
+ PUSHs(sv_2mortal(newSVuv(an_unsigned_integer)))
+ PUSHs(sv_2mortal(newSVnv(a_double)))
+ PUSHs(sv_2mortal(newSVpv("Some String",0)))
+
+And now the Perl program calling C<tzname>, the two values will be assigned
+as in:
+
+ ($standard_abbrev, $summer_abbrev) = POSIX::tzname;
+
+An alternate (and possibly simpler) method to pushing values on the stack is
+to use the macro:
+
+ XPUSHs(SV*)
+
+This macro automatically adjust the stack for you, if needed. Thus, you
+do not need to call C<EXTEND> to extend the stack.
+
+Despite their suggestions in earlier versions of this document the macros
+C<(X)PUSH[iunp]> are I<not> suited to XSUBs which return multiple results.
+For that, either stick to the C<(X)PUSHs> macros shown above, or use the new
+C<m(X)PUSH[iunp]> macros instead; see L</Putting a C value on Perl stack>.
+
+For more information, consult L<perlxs> and L<perlxstut>.
+
+=head2 Calling Perl Routines from within C Programs
+
+There are four routines that can be used to call a Perl subroutine from
+within a C program. These four are:
+
+ I32 call_sv(SV*, I32);
+ I32 call_pv(const char*, I32);
+ I32 call_method(const char*, I32);
+ I32 call_argv(const char*, I32, register char**);
+
+The routine most often used is C<call_sv>. The C<SV*> argument
+contains either the name of the Perl subroutine to be called, or a
+reference to the subroutine. The second argument consists of flags
+that control the context in which the subroutine is called, whether
+or not the subroutine is being passed arguments, how errors should be
+trapped, and how to treat return values.
+
+All four routines return the number of arguments that the subroutine returned
+on the Perl stack.
+
+These routines used to be called C<perl_call_sv>, etc., before Perl v5.6.0,
+but those names are now deprecated; macros of the same name are provided for
+compatibility.
+
+When using any of these routines (except C<call_argv>), the programmer
+must manipulate the Perl stack. These include the following macros and
+functions:
+
+ dSP
+ SP
+ PUSHMARK()
+ PUTBACK
+ SPAGAIN
+ ENTER
+ SAVETMPS
+ FREETMPS
+ LEAVE
+ XPUSH*()
+ POP*()
+
+For a detailed description of calling conventions from C to Perl,
+consult L<perlcall>.
+
+=head2 Memory Allocation
+
+=head3 Allocation
+
+All memory meant to be used with the Perl API functions should be manipulated
+using the macros described in this section. The macros provide the necessary
+transparency between differences in the actual malloc implementation that is
+used within perl.
+
+It is suggested that you enable the version of malloc that is distributed
+with Perl. It keeps pools of various sizes of unallocated memory in
+order to satisfy allocation requests more quickly. However, on some
+platforms, it may cause spurious malloc or free errors.
+
+The following three macros are used to initially allocate memory :
+
+ Newx(pointer, number, type);
+ Newxc(pointer, number, type, cast);
+ Newxz(pointer, number, type);
+
+The first argument C<pointer> should be the name of a variable that will
+point to the newly allocated memory.
+
+The second and third arguments C<number> and C<type> specify how many of
+the specified type of data structure should be allocated. The argument
+C<type> is passed to C<sizeof>. The final argument to C<Newxc>, C<cast>,
+should be used if the C<pointer> argument is different from the C<type>
+argument.
+
+Unlike the C<Newx> and C<Newxc> macros, the C<Newxz> macro calls C<memzero>
+to zero out all the newly allocated memory.
+
+=head3 Reallocation
+
+ Renew(pointer, number, type);
+ Renewc(pointer, number, type, cast);
+ Safefree(pointer)
+
+These three macros are used to change a memory buffer size or to free a
+piece of memory no longer needed. The arguments to C<Renew> and C<Renewc>
+match those of C<New> and C<Newc> with the exception of not needing the
+"magic cookie" argument.
+
+=head3 Moving
+
+ Move(source, dest, number, type);
+ Copy(source, dest, number, type);
+ Zero(dest, number, type);
+
+These three macros are used to move, copy, or zero out previously allocated
+memory. The C<source> and C<dest> arguments point to the source and
+destination starting points. Perl will move, copy, or zero out C<number>
+instances of the size of the C<type> data structure (using the C<sizeof>
+function).
+
+=head2 PerlIO
+
+The most recent development releases of Perl has been experimenting with
+removing Perl's dependency on the "normal" standard I/O suite and allowing
+other stdio implementations to be used. This involves creating a new
+abstraction layer that then calls whichever implementation of stdio Perl
+was compiled with. All XSUBs should now use the functions in the PerlIO
+abstraction layer and not make any assumptions about what kind of stdio
+is being used.
+
+For a complete description of the PerlIO abstraction, consult L<perlapio>.
+
+=head2 Putting a C value on Perl stack
+
+A lot of opcodes (this is an elementary operation in the internal perl
+stack machine) put an SV* on the stack. However, as an optimization
+the corresponding SV is (usually) not recreated each time. The opcodes
+reuse specially assigned SVs (I<target>s) which are (as a corollary)
+not constantly freed/created.
+
+Each of the targets is created only once (but see
+L<Scratchpads and recursion> below), and when an opcode needs to put
+an integer, a double, or a string on stack, it just sets the
+corresponding parts of its I<target> and puts the I<target> on stack.
+
+The macro to put this target on stack is C<PUSHTARG>, and it is
+directly used in some opcodes, as well as indirectly in zillions of
+others, which use it via C<(X)PUSH[iunp]>.
+
+Because the target is reused, you must be careful when pushing multiple
+values on the stack. The following code will not do what you think:
+
+ XPUSHi(10);
+ XPUSHi(20);
+
+This translates as "set C<TARG> to 10, push a pointer to C<TARG> onto
+the stack; set C<TARG> to 20, push a pointer to C<TARG> onto the stack".
+At the end of the operation, the stack does not contain the values 10
+and 20, but actually contains two pointers to C<TARG>, which we have set
+to 20.
+
+If you need to push multiple different values then you should either use
+the C<(X)PUSHs> macros, or else use the new C<m(X)PUSH[iunp]> macros,
+none of which make use of C<TARG>. The C<(X)PUSHs> macros simply push an
+SV* on the stack, which, as noted under L</XSUBs and the Argument Stack>,
+will often need to be "mortal". The new C<m(X)PUSH[iunp]> macros make
+this a little easier to achieve by creating a new mortal for you (via
+C<(X)PUSHmortal>), pushing that onto the stack (extending it if necessary
+in the case of the C<mXPUSH[iunp]> macros), and then setting its value.
+Thus, instead of writing this to "fix" the example above:
+
+ XPUSHs(sv_2mortal(newSViv(10)))
+ XPUSHs(sv_2mortal(newSViv(20)))
+
+you can simply write:
+
+ mXPUSHi(10)
+ mXPUSHi(20)
+
+On a related note, if you do use C<(X)PUSH[iunp]>, then you're going to
+need a C<dTARG> in your variable declarations so that the C<*PUSH*>
+macros can make use of the local variable C<TARG>. See also C<dTARGET>
+and C<dXSTARG>.
+
+=head2 Scratchpads
+
+The question remains on when the SVs which are I<target>s for opcodes
+are created. The answer is that they are created when the current unit --
+a subroutine or a file (for opcodes for statements outside of
+subroutines) -- is compiled. During this time a special anonymous Perl
+array is created, which is called a scratchpad for the current
+unit.
+
+A scratchpad keeps SVs which are lexicals for the current unit and are
+targets for opcodes. One can deduce that an SV lives on a scratchpad
+by looking on its flags: lexicals have C<SVs_PADMY> set, and
+I<target>s have C<SVs_PADTMP> set.
+
+The correspondence between OPs and I<target>s is not 1-to-1. Different
+OPs in the compile tree of the unit can use the same target, if this
+would not conflict with the expected life of the temporary.
+
+=head2 Scratchpads and recursion
+
+In fact it is not 100% true that a compiled unit contains a pointer to
+the scratchpad AV. In fact it contains a pointer to an AV of
+(initially) one element, and this element is the scratchpad AV. Why do
+we need an extra level of indirection?
+
+The answer is B<recursion>, and maybe B<threads>. Both
+these can create several execution pointers going into the same
+subroutine. For the subroutine-child not write over the temporaries
+for the subroutine-parent (lifespan of which covers the call to the
+child), the parent and the child should have different
+scratchpads. (I<And> the lexicals should be separate anyway!)
+
+So each subroutine is born with an array of scratchpads (of length 1).
+On each entry to the subroutine it is checked that the current
+depth of the recursion is not more than the length of this array, and
+if it is, new scratchpad is created and pushed into the array.
+
+The I<target>s on this scratchpad are C<undef>s, but they are already
+marked with correct flags.
+
+=head1 Compiled code
+
+=head2 Code tree
+
+Here we describe the internal form your code is converted to by
+Perl. Start with a simple example:
+
+ $a = $b + $c;
+
+This is converted to a tree similar to this one:
+
+ assign-to
+ / \
+ + $a
+ / \
+ $b $c
+
+(but slightly more complicated). This tree reflects the way Perl
+parsed your code, but has nothing to do with the execution order.
+There is an additional "thread" going through the nodes of the tree
+which shows the order of execution of the nodes. In our simplified
+example above it looks like:
+
+ $b ---> $c ---> + ---> $a ---> assign-to
+
+But with the actual compile tree for C<$a = $b + $c> it is different:
+some nodes I<optimized away>. As a corollary, though the actual tree
+contains more nodes than our simplified example, the execution order
+is the same as in our example.
+
+=head2 Examining the tree
+
+If you have your perl compiled for debugging (usually done with
+C<-DDEBUGGING> on the C<Configure> command line), you may examine the
+compiled tree by specifying C<-Dx> on the Perl command line. The
+output takes several lines per node, and for C<$b+$c> it looks like
+this:
+
+ 5 TYPE = add ===> 6
+ TARG = 1
+ FLAGS = (SCALAR,KIDS)
+ {
+ TYPE = null ===> (4)
+ (was rv2sv)
+ FLAGS = (SCALAR,KIDS)
+ {
+ 3 TYPE = gvsv ===> 4
+ FLAGS = (SCALAR)
+ GV = main::b
+ }
+ }
+ {
+ TYPE = null ===> (5)
+ (was rv2sv)
+ FLAGS = (SCALAR,KIDS)
+ {
+ 4 TYPE = gvsv ===> 5
+ FLAGS = (SCALAR)
+ GV = main::c
+ }
+ }
+
+This tree has 5 nodes (one per C<TYPE> specifier), only 3 of them are
+not optimized away (one per number in the left column). The immediate
+children of the given node correspond to C<{}> pairs on the same level
+of indentation, thus this listing corresponds to the tree:
+
+ add
+ / \
+ null null
+ | |
+ gvsv gvsv
+
+The execution order is indicated by C<===E<gt>> marks, thus it is C<3
+4 5 6> (node C<6> is not included into above listing), i.e.,
+C<gvsv gvsv add whatever>.
+
+Each of these nodes represents an op, a fundamental operation inside the
+Perl core. The code which implements each operation can be found in the
+F<pp*.c> files; the function which implements the op with type C<gvsv>
+is C<pp_gvsv>, and so on. As the tree above shows, different ops have
+different numbers of children: C<add> is a binary operator, as one would
+expect, and so has two children. To accommodate the various different
+numbers of children, there are various types of op data structure, and
+they link together in different ways.
+
+The simplest type of op structure is C<OP>: this has no children. Unary
+operators, C<UNOP>s, have one child, and this is pointed to by the
+C<op_first> field. Binary operators (C<BINOP>s) have not only an
+C<op_first> field but also an C<op_last> field. The most complex type of
+op is a C<LISTOP>, which has any number of children. In this case, the
+first child is pointed to by C<op_first> and the last child by
+C<op_last>. The children in between can be found by iteratively
+following the C<op_sibling> pointer from the first child to the last.
+
+There are also two other op types: a C<PMOP> holds a regular expression,
+and has no children, and a C<LOOP> may or may not have children. If the
+C<op_children> field is non-zero, it behaves like a C<LISTOP>. To
+complicate matters, if a C<UNOP> is actually a C<null> op after
+optimization (see L</Compile pass 2: context propagation>) it will still
+have children in accordance with its former type.
+
+Another way to examine the tree is to use a compiler back-end module, such
+as L<B::Concise>.
+
+=head2 Compile pass 1: check routines
+
+The tree is created by the compiler while I<yacc> code feeds it
+the constructions it recognizes. Since I<yacc> works bottom-up, so does
+the first pass of perl compilation.
+
+What makes this pass interesting for perl developers is that some
+optimization may be performed on this pass. This is optimization by
+so-called "check routines". The correspondence between node names
+and corresponding check routines is described in F<opcode.pl> (do not
+forget to run C<make regen_headers> if you modify this file).
+
+A check routine is called when the node is fully constructed except
+for the execution-order thread. Since at this time there are no
+back-links to the currently constructed node, one can do most any
+operation to the top-level node, including freeing it and/or creating
+new nodes above/below it.
+
+The check routine returns the node which should be inserted into the
+tree (if the top-level node was not modified, check routine returns
+its argument).
+
+By convention, check routines have names C<ck_*>. They are usually
+called from C<new*OP> subroutines (or C<convert>) (which in turn are
+called from F<perly.y>).
+
+=head2 Compile pass 1a: constant folding
+
+Immediately after the check routine is called the returned node is
+checked for being compile-time executable. If it is (the value is
+judged to be constant) it is immediately executed, and a I<constant>
+node with the "return value" of the corresponding subtree is
+substituted instead. The subtree is deleted.
+
+If constant folding was not performed, the execution-order thread is
+created.
+
+=head2 Compile pass 2: context propagation
+
+When a context for a part of compile tree is known, it is propagated
+down through the tree. At this time the context can have 5 values
+(instead of 2 for runtime context): void, boolean, scalar, list, and
+lvalue. In contrast with the pass 1 this pass is processed from top
+to bottom: a node's context determines the context for its children.
+
+Additional context-dependent optimizations are performed at this time.
+Since at this moment the compile tree contains back-references (via
+"thread" pointers), nodes cannot be free()d now. To allow
+optimized-away nodes at this stage, such nodes are null()ified instead
+of free()ing (i.e. their type is changed to OP_NULL).
+
+=head2 Compile pass 3: peephole optimization
+
+After the compile tree for a subroutine (or for an C<eval> or a file)
+is created, an additional pass over the code is performed. This pass
+is neither top-down or bottom-up, but in the execution order (with
+additional complications for conditionals). These optimizations are
+done in the subroutine peep(). Optimizations performed at this stage
+are subject to the same restrictions as in the pass 2.
+
+=head2 Pluggable runops
+
+The compile tree is executed in a runops function. There are two runops
+functions, in F<run.c> and in F<dump.c>. C<Perl_runops_debug> is used
+with DEBUGGING and C<Perl_runops_standard> is used otherwise. For fine
+control over the execution of the compile tree it is possible to provide
+your own runops function.
+
+It's probably best to copy one of the existing runops functions and
+change it to suit your needs. Then, in the BOOT section of your XS
+file, add the line:
+
+ PL_runops = my_runops;
+
+This function should be as efficient as possible to keep your programs
+running as fast as possible.
+
+=head1 Examining internal data structures with the C<dump> functions
+
+To aid debugging, the source file F<dump.c> contains a number of
+functions which produce formatted output of internal data structures.
+
+The most commonly used of these functions is C<Perl_sv_dump>; it's used
+for dumping SVs, AVs, HVs, and CVs. The C<Devel::Peek> module calls
+C<sv_dump> to produce debugging output from Perl-space, so users of that
+module should already be familiar with its format.
+
+C<Perl_op_dump> can be used to dump an C<OP> structure or any of its
+derivatives, and produces output similar to C<perl -Dx>; in fact,
+C<Perl_dump_eval> will dump the main root of the code being evaluated,
+exactly like C<-Dx>.
+
+Other useful functions are C<Perl_dump_sub>, which turns a C<GV> into an
+op tree, C<Perl_dump_packsubs> which calls C<Perl_dump_sub> on all the
+subroutines in a package like so: (Thankfully, these are all xsubs, so
+there is no op tree)
+
+ (gdb) print Perl_dump_packsubs(PL_defstash)
+
+ SUB attributes::bootstrap = (xsub 0x811fedc 0)
+
+ SUB UNIVERSAL::can = (xsub 0x811f50c 0)
+
+ SUB UNIVERSAL::isa = (xsub 0x811f304 0)
+
+ SUB UNIVERSAL::VERSION = (xsub 0x811f7ac 0)
+
+ SUB DynaLoader::boot_DynaLoader = (xsub 0x805b188 0)
+
+and C<Perl_dump_all>, which dumps all the subroutines in the stash and
+the op tree of the main root.
+
+=head1 How multiple interpreters and concurrency are supported
+
+=head2 Background and PERL_IMPLICIT_CONTEXT
+
+The Perl interpreter can be regarded as a closed box: it has an API
+for feeding it code or otherwise making it do things, but it also has
+functions for its own use. This smells a lot like an object, and
+there are ways for you to build Perl so that you can have multiple
+interpreters, with one interpreter represented either as a C structure,
+or inside a thread-specific structure. These structures contain all
+the context, the state of that interpreter.
+
+One macro controls the major Perl build flavor: MULTIPLICITY. The
+MULTIPLICITY build has a C structure that packages all the interpreter
+state. With multiplicity-enabled perls, PERL_IMPLICIT_CONTEXT is also
+normally defined, and enables the support for passing in a "hidden" first
+argument that represents all three data structures. MULTIPLICITY makes
+mutli-threaded perls possible (with the ithreads threading model, related
+to the macro USE_ITHREADS.)
+
+Two other "encapsulation" macros are the PERL_GLOBAL_STRUCT and
+PERL_GLOBAL_STRUCT_PRIVATE (the latter turns on the former, and the
+former turns on MULTIPLICITY.) The PERL_GLOBAL_STRUCT causes all the
+internal variables of Perl to be wrapped inside a single global struct,
+struct perl_vars, accessible as (globals) &PL_Vars or PL_VarsPtr or
+the function Perl_GetVars(). The PERL_GLOBAL_STRUCT_PRIVATE goes
+one step further, there is still a single struct (allocated in main()
+either from heap or from stack) but there are no global data symbols
+pointing to it. In either case the global struct should be initialised
+as the very first thing in main() using Perl_init_global_struct() and
+correspondingly tear it down after perl_free() using Perl_free_global_struct(),
+please see F<miniperlmain.c> for usage details. You may also need
+to use C<dVAR> in your coding to "declare the global variables"
+when you are using them. dTHX does this for you automatically.
+
+To see whether you have non-const data you can use a BSD-compatible C<nm>:
+
+ nm libperl.a | grep -v ' [TURtr] '
+
+If this displays any C<D> or C<d> symbols, you have non-const data.
+
+For backward compatibility reasons defining just PERL_GLOBAL_STRUCT
+doesn't actually hide all symbols inside a big global struct: some
+PerlIO_xxx vtables are left visible. The PERL_GLOBAL_STRUCT_PRIVATE
+then hides everything (see how the PERLIO_FUNCS_DECL is used).
+
+All this obviously requires a way for the Perl internal functions to be
+either subroutines taking some kind of structure as the first
+argument, or subroutines taking nothing as the first argument. To
+enable these two very different ways of building the interpreter,
+the Perl source (as it does in so many other situations) makes heavy
+use of macros and subroutine naming conventions.
+
+First problem: deciding which functions will be public API functions and
+which will be private. All functions whose names begin C<S_> are private
+(think "S" for "secret" or "static"). All other functions begin with
+"Perl_", but just because a function begins with "Perl_" does not mean it is
+part of the API. (See L</Internal Functions>.) The easiest way to be B<sure> a
+function is part of the API is to find its entry in L<perlapi>.
+If it exists in L<perlapi>, it's part of the API. If it doesn't, and you
+think it should be (i.e., you need it for your extension), send mail via
+L<perlbug> explaining why you think it should be.
+
+Second problem: there must be a syntax so that the same subroutine
+declarations and calls can pass a structure as their first argument,
+or pass nothing. To solve this, the subroutines are named and
+declared in a particular way. Here's a typical start of a static
+function used within the Perl guts:
+
+ STATIC void
+ S_incline(pTHX_ char *s)
+
+STATIC becomes "static" in C, and may be #define'd to nothing in some
+configurations in future.
+
+A public function (i.e. part of the internal API, but not necessarily
+sanctioned for use in extensions) begins like this:
+
+ void
+ Perl_sv_setiv(pTHX_ SV* dsv, IV num)
+
+C<pTHX_> is one of a number of macros (in F<perl.h>) that hide the
+details of the interpreter's context. THX stands for "thread", "this",
+or "thingy", as the case may be. (And no, George Lucas is not involved. :-)
+The first character could be 'p' for a B<p>rototype, 'a' for B<a>rgument,
+or 'd' for B<d>eclaration, so we have C<pTHX>, C<aTHX> and C<dTHX>, and
+their variants.
+
+When Perl is built without options that set PERL_IMPLICIT_CONTEXT, there is no
+first argument containing the interpreter's context. The trailing underscore
+in the pTHX_ macro indicates that the macro expansion needs a comma
+after the context argument because other arguments follow it. If
+PERL_IMPLICIT_CONTEXT is not defined, pTHX_ will be ignored, and the
+subroutine is not prototyped to take the extra argument. The form of the
+macro without the trailing underscore is used when there are no additional
+explicit arguments.
+
+When a core function calls another, it must pass the context. This
+is normally hidden via macros. Consider C<sv_setiv>. It expands into
+something like this:
+
+ #ifdef PERL_IMPLICIT_CONTEXT
+ #define sv_setiv(a,b) Perl_sv_setiv(aTHX_ a, b)
+ /* can't do this for vararg functions, see below */
+ #else
+ #define sv_setiv Perl_sv_setiv
+ #endif
+
+This works well, and means that XS authors can gleefully write:
+
+ sv_setiv(foo, bar);
+
+and still have it work under all the modes Perl could have been
+compiled with.
+
+This doesn't work so cleanly for varargs functions, though, as macros
+imply that the number of arguments is known in advance. Instead we
+either need to spell them out fully, passing C<aTHX_> as the first
+argument (the Perl core tends to do this with functions like
+Perl_warner), or use a context-free version.
+
+The context-free version of Perl_warner is called
+Perl_warner_nocontext, and does not take the extra argument. Instead
+it does dTHX; to get the context from thread-local storage. We
+C<#define warner Perl_warner_nocontext> so that extensions get source
+compatibility at the expense of performance. (Passing an arg is
+cheaper than grabbing it from thread-local storage.)
+
+You can ignore [pad]THXx when browsing the Perl headers/sources.
+Those are strictly for use within the core. Extensions and embedders
+need only be aware of [pad]THX.
+
+=head2 So what happened to dTHR?
+
+C<dTHR> was introduced in perl 5.005 to support the older thread model.
+The older thread model now uses the C<THX> mechanism to pass context
+pointers around, so C<dTHR> is not useful any more. Perl 5.6.0 and
+later still have it for backward source compatibility, but it is defined
+to be a no-op.
+
+=head2 How do I use all this in extensions?
+
+When Perl is built with PERL_IMPLICIT_CONTEXT, extensions that call
+any functions in the Perl API will need to pass the initial context
+argument somehow. The kicker is that you will need to write it in
+such a way that the extension still compiles when Perl hasn't been
+built with PERL_IMPLICIT_CONTEXT enabled.
+
+There are three ways to do this. First, the easy but inefficient way,
+which is also the default, in order to maintain source compatibility
+with extensions: whenever F<XSUB.h> is #included, it redefines the aTHX
+and aTHX_ macros to call a function that will return the context.
+Thus, something like:
+
+ sv_setiv(sv, num);
+
+in your extension will translate to this when PERL_IMPLICIT_CONTEXT is
+in effect:
+
+ Perl_sv_setiv(Perl_get_context(), sv, num);
+
+or to this otherwise:
+
+ Perl_sv_setiv(sv, num);
+
+You have to do nothing new in your extension to get this; since
+the Perl library provides Perl_get_context(), it will all just
+work.
+
+The second, more efficient way is to use the following template for
+your Foo.xs:
+
+ #define PERL_NO_GET_CONTEXT /* we want efficiency */
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
+
+ STATIC void my_private_function(int arg1, int arg2);
+
+ STATIC void
+ my_private_function(int arg1, int arg2)
+ {
+ dTHX; /* fetch context */
+ ... call many Perl API functions ...
+ }
+
+ [... etc ...]
+
+ MODULE = Foo PACKAGE = Foo
+
+ /* typical XSUB */
+
+ void
+ my_xsub(arg)
+ int arg
+ CODE:
+ my_private_function(arg, 10);
+
+Note that the only two changes from the normal way of writing an
+extension is the addition of a C<#define PERL_NO_GET_CONTEXT> before
+including the Perl headers, followed by a C<dTHX;> declaration at
+the start of every function that will call the Perl API. (You'll
+know which functions need this, because the C compiler will complain
+that there's an undeclared identifier in those functions.) No changes
+are needed for the XSUBs themselves, because the XS() macro is
+correctly defined to pass in the implicit context if needed.
+
+The third, even more efficient way is to ape how it is done within
+the Perl guts:
+
+
+ #define PERL_NO_GET_CONTEXT /* we want efficiency */
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
+
+ /* pTHX_ only needed for functions that call Perl API */
+ STATIC void my_private_function(pTHX_ int arg1, int arg2);
+
+ STATIC void
+ my_private_function(pTHX_ int arg1, int arg2)
+ {
+ /* dTHX; not needed here, because THX is an argument */
+ ... call Perl API functions ...
+ }
+
+ [... etc ...]
+
+ MODULE = Foo PACKAGE = Foo
+
+ /* typical XSUB */
+
+ void
+ my_xsub(arg)
+ int arg
+ CODE:
+ my_private_function(aTHX_ arg, 10);
+
+This implementation never has to fetch the context using a function
+call, since it is always passed as an extra argument. Depending on
+your needs for simplicity or efficiency, you may mix the previous
+two approaches freely.
+
+Never add a comma after C<pTHX> yourself--always use the form of the
+macro with the underscore for functions that take explicit arguments,
+or the form without the argument for functions with no explicit arguments.
+
+If one is compiling Perl with the C<-DPERL_GLOBAL_STRUCT> the C<dVAR>
+definition is needed if the Perl global variables (see F<perlvars.h>
+or F<globvar.sym>) are accessed in the function and C<dTHX> is not
+used (the C<dTHX> includes the C<dVAR> if necessary). One notices
+the need for C<dVAR> only with the said compile-time define, because
+otherwise the Perl global variables are visible as-is.
+
+=head2 Should I do anything special if I call perl from multiple threads?
+
+If you create interpreters in one thread and then proceed to call them in
+another, you need to make sure perl's own Thread Local Storage (TLS) slot is
+initialized correctly in each of those threads.
+
+The C<perl_alloc> and C<perl_clone> API functions will automatically set
+the TLS slot to the interpreter they created, so that there is no need to do
+anything special if the interpreter is always accessed in the same thread that
+created it, and that thread did not create or call any other interpreters
+afterwards. If that is not the case, you have to set the TLS slot of the
+thread before calling any functions in the Perl API on that particular
+interpreter. This is done by calling the C<PERL_SET_CONTEXT> macro in that
+thread as the first thing you do:
+
+ /* do this before doing anything else with some_perl */
+ PERL_SET_CONTEXT(some_perl);
+
+ ... other Perl API calls on some_perl go here ...
+
+=head2 Future Plans and PERL_IMPLICIT_SYS
+
+Just as PERL_IMPLICIT_CONTEXT provides a way to bundle up everything
+that the interpreter knows about itself and pass it around, so too are
+there plans to allow the interpreter to bundle up everything it knows
+about the environment it's running on. This is enabled with the
+PERL_IMPLICIT_SYS macro. Currently it only works with USE_ITHREADS on
+Windows.
+
+This allows the ability to provide an extra pointer (called the "host"
+environment) for all the system calls. This makes it possible for
+all the system stuff to maintain their own state, broken down into
+seven C structures. These are thin wrappers around the usual system
+calls (see F<win32/perllib.c>) for the default perl executable, but for a
+more ambitious host (like the one that would do fork() emulation) all
+the extra work needed to pretend that different interpreters are
+actually different "processes", would be done here.
+
+The Perl engine/interpreter and the host are orthogonal entities.
+There could be one or more interpreters in a process, and one or
+more "hosts", with free association between them.
+
+=head1 Internal Functions
+
+All of Perl's internal functions which will be exposed to the outside
+world are prefixed by C<Perl_> so that they will not conflict with XS
+functions or functions used in a program in which Perl is embedded.
+Similarly, all global variables begin with C<PL_>. (By convention,
+static functions start with C<S_>.)
+
+Inside the Perl core, you can get at the functions either with or
+without the C<Perl_> prefix, thanks to a bunch of defines that live in
+F<embed.h>. This header file is generated automatically from
+F<embed.pl> and F<embed.fnc>. F<embed.pl> also creates the prototyping
+header files for the internal functions, generates the documentation
+and a lot of other bits and pieces. It's important that when you add
+a new function to the core or change an existing one, you change the
+data in the table in F<embed.fnc> as well. Here's a sample entry from
+that table:
+
+ Apd |SV** |av_fetch |AV* ar|I32 key|I32 lval
+
+The second column is the return type, the third column the name. Columns
+after that are the arguments. The first column is a set of flags:
+
+=over 3
+
+=item A
+
+This function is a part of the public API. All such functions should also
+have 'd', very few do not.
+
+=item p
+
+This function has a C<Perl_> prefix; i.e. it is defined as
+C<Perl_av_fetch>.
+
+=item d
+
+This function has documentation using the C<apidoc> feature which we'll
+look at in a second. Some functions have 'd' but not 'A'; docs are good.
+
+=back
+
+Other available flags are:
+
+=over 3
+
+=item s
+
+This is a static function and is defined as C<STATIC S_whatever>, and
+usually called within the sources as C<whatever(...)>.
+
+=item n
+
+This does not need a interpreter context, so the definition has no
+C<pTHX>, and it follows that callers don't use C<aTHX>. (See
+L<perlguts/Background and PERL_IMPLICIT_CONTEXT>.)
+
+=item r
+
+This function never returns; C<croak>, C<exit> and friends.
+
+=item f
+
+This function takes a variable number of arguments, C<printf> style.
+The argument list should end with C<...>, like this:
+
+ Afprd |void |croak |const char* pat|...
+
+=item M
+
+This function is part of the experimental development API, and may change
+or disappear without notice.
+
+=item o
+
+This function should not have a compatibility macro to define, say,
+C<Perl_parse> to C<parse>. It must be called as C<Perl_parse>.
+
+=item x
+
+This function isn't exported out of the Perl core.
+
+=item m
+
+This is implemented as a macro.
+
+=item X
+
+This function is explicitly exported.
+
+=item E
+
+This function is visible to extensions included in the Perl core.
+
+=item b
+
+Binary backward compatibility; this function is a macro but also has
+a C<Perl_> implementation (which is exported).
+
+=item others
+
+See the comments at the top of C<embed.fnc> for others.
+
+=back
+
+If you edit F<embed.pl> or F<embed.fnc>, you will need to run
+C<make regen_headers> to force a rebuild of F<embed.h> and other
+auto-generated files.
+
+=head2 Formatted Printing of IVs, UVs, and NVs
+
+If you are printing IVs, UVs, or NVS instead of the stdio(3) style
+formatting codes like C<%d>, C<%ld>, C<%f>, you should use the
+following macros for portability
+
+ IVdf IV in decimal
+ UVuf UV in decimal
+ UVof UV in octal
+ UVxf UV in hexadecimal
+ NVef NV %e-like
+ NVff NV %f-like
+ NVgf NV %g-like
+
+These will take care of 64-bit integers and long doubles.
+For example:
+
+ printf("IV is %"IVdf"\n", iv);
+
+The IVdf will expand to whatever is the correct format for the IVs.
+
+If you are printing addresses of pointers, use UVxf combined
+with PTR2UV(), do not use %lx or %p.
+
+=head2 Pointer-To-Integer and Integer-To-Pointer
+
+Because pointer size does not necessarily equal integer size,
+use the follow macros to do it right.
+
+ PTR2UV(pointer)
+ PTR2IV(pointer)
+ PTR2NV(pointer)
+ INT2PTR(pointertotype, integer)
+
+For example:
+
+ IV iv = ...;
+ SV *sv = INT2PTR(SV*, iv);
+
+and
+
+ AV *av = ...;
+ UV uv = PTR2UV(av);
+
+=head2 Exception Handling
+
+There are a couple of macros to do very basic exception handling in XS
+modules. You have to define C<NO_XSLOCKS> before including F<XSUB.h> to
+be able to use these macros:
+
+ #define NO_XSLOCKS
+ #include "XSUB.h"
+
+You can use these macros if you call code that may croak, but you need
+to do some cleanup before giving control back to Perl. For example:
+
+ dXCPT; /* set up necessary variables */
+
+ XCPT_TRY_START {
+ code_that_may_croak();
+ } XCPT_TRY_END
+
+ XCPT_CATCH
+ {
+ /* do cleanup here */
+ XCPT_RETHROW;
+ }
+
+Note that you always have to rethrow an exception that has been
+caught. Using these macros, it is not possible to just catch the
+exception and ignore it. If you have to ignore the exception, you
+have to use the C<call_*> function.
+
+The advantage of using the above macros is that you don't have
+to setup an extra function for C<call_*>, and that using these
+macros is faster than using C<call_*>.
+
+=head2 Source Documentation
+
+There's an effort going on to document the internal functions and
+automatically produce reference manuals from them - L<perlapi> is one
+such manual which details all the functions which are available to XS
+writers. L<perlintern> is the autogenerated manual for the functions
+which are not part of the API and are supposedly for internal use only.
+
+Source documentation is created by putting POD comments into the C
+source, like this:
+
+ /*
+ =for apidoc sv_setiv
+
+ Copies an integer into the given SV. Does not handle 'set' magic. See
+ C<sv_setiv_mg>.
+
+ =cut
+ */
+
+Please try and supply some documentation if you add functions to the
+Perl core.
+
+=head2 Backwards compatibility
+
+The Perl API changes over time. New functions are added or the interfaces
+of existing functions are changed. The C<Devel::PPPort> module tries to
+provide compatibility code for some of these changes, so XS writers don't
+have to code it themselves when supporting multiple versions of Perl.
+
+C<Devel::PPPort> generates a C header file F<ppport.h> that can also
+be run as a Perl script. To generate F<ppport.h>, run:
+
+ perl -MDevel::PPPort -eDevel::PPPort::WriteFile
+
+Besides checking existing XS code, the script can also be used to retrieve
+compatibility information for various API calls using the C<--api-info>
+command line switch. For example:
+
+ % perl ppport.h --api-info=sv_magicext
+
+For details, see C<perldoc ppport.h>.
+
+=head1 Unicode Support
+
+Perl 5.6.0 introduced Unicode support. It's important for porters and XS
+writers to understand this support and make sure that the code they
+write does not corrupt Unicode data.
+
+=head2 What B<is> Unicode, anyway?
+
+In the olden, less enlightened times, we all used to use ASCII. Most of
+us did, anyway. The big problem with ASCII is that it's American. Well,
+no, that's not actually the problem; the problem is that it's not
+particularly useful for people who don't use the Roman alphabet. What
+used to happen was that particular languages would stick their own
+alphabet in the upper range of the sequence, between 128 and 255. Of
+course, we then ended up with plenty of variants that weren't quite
+ASCII, and the whole point of it being a standard was lost.
+
+Worse still, if you've got a language like Chinese or
+Japanese that has hundreds or thousands of characters, then you really
+can't fit them into a mere 256, so they had to forget about ASCII
+altogether, and build their own systems using pairs of numbers to refer
+to one character.
+
+To fix this, some people formed Unicode, Inc. and
+produced a new character set containing all the characters you can
+possibly think of and more. There are several ways of representing these
+characters, and the one Perl uses is called UTF-8. UTF-8 uses
+a variable number of bytes to represent a character. You can learn more
+about Unicode and Perl's Unicode model in L<perlunicode>.
+
+=head2 How can I recognise a UTF-8 string?
+
+You can't. This is because UTF-8 data is stored in bytes just like
+non-UTF-8 data. The Unicode character 200, (C<0xC8> for you hex types)
+capital E with a grave accent, is represented by the two bytes
+C<v196.172>. Unfortunately, the non-Unicode string C<chr(196).chr(172)>
+has that byte sequence as well. So you can't tell just by looking - this
+is what makes Unicode input an interesting problem.
+
+In general, you either have to know what you're dealing with, or you
+have to guess. The API function C<is_utf8_string> can help; it'll tell
+you if a string contains only valid UTF-8 characters. However, it can't
+do the work for you. On a character-by-character basis, C<is_utf8_char>
+will tell you whether the current character in a string is valid UTF-8.
+
+=head2 How does UTF-8 represent Unicode characters?
+
+As mentioned above, UTF-8 uses a variable number of bytes to store a
+character. Characters with values 0...127 are stored in one byte, just
+like good ol' ASCII. Character 128 is stored as C<v194.128>; this
+continues up to character 191, which is C<v194.191>. Now we've run out of
+bits (191 is binary C<10111111>) so we move on; 192 is C<v195.128>. And
+so it goes on, moving to three bytes at character 2048.
+
+Assuming you know you're dealing with a UTF-8 string, you can find out
+how long the first character in it is with the C<UTF8SKIP> macro:
+
+ char *utf = "\305\233\340\240\201";
+ I32 len;
+
+ len = UTF8SKIP(utf); /* len is 2 here */
+ utf += len;
+ len = UTF8SKIP(utf); /* len is 3 here */
+
+Another way to skip over characters in a UTF-8 string is to use
+C<utf8_hop>, which takes a string and a number of characters to skip
+over. You're on your own about bounds checking, though, so don't use it
+lightly.
+
+All bytes in a multi-byte UTF-8 character will have the high bit set,
+so you can test if you need to do something special with this
+character like this (the UTF8_IS_INVARIANT() is a macro that tests
+whether the byte can be encoded as a single byte even in UTF-8):
+
+ U8 *utf;
+ UV uv; /* Note: a UV, not a U8, not a char */
+
+ if (!UTF8_IS_INVARIANT(*utf))
+ /* Must treat this as UTF-8 */
+ uv = utf8_to_uv(utf);
+ else
+ /* OK to treat this character as a byte */
+ uv = *utf;
+
+You can also see in that example that we use C<utf8_to_uv> to get the
+value of the character; the inverse function C<uv_to_utf8> is available
+for putting a UV into UTF-8:
+
+ if (!UTF8_IS_INVARIANT(uv))
+ /* Must treat this as UTF8 */
+ utf8 = uv_to_utf8(utf8, uv);
+ else
+ /* OK to treat this character as a byte */
+ *utf8++ = uv;
+
+You B<must> convert characters to UVs using the above functions if
+you're ever in a situation where you have to match UTF-8 and non-UTF-8
+characters. You may not skip over UTF-8 characters in this case. If you
+do this, you'll lose the ability to match hi-bit non-UTF-8 characters;
+for instance, if your UTF-8 string contains C<v196.172>, and you skip
+that character, you can never match a C<chr(200)> in a non-UTF-8 string.
+So don't do that!
+
+=head2 How does Perl store UTF-8 strings?
+
+Currently, Perl deals with Unicode strings and non-Unicode strings
+slightly differently. A flag in the SV, C<SVf_UTF8>, indicates that the
+string is internally encoded as UTF-8. Without it, the byte value is the
+codepoint number and vice versa (in other words, the string is encoded
+as iso-8859-1). You can check and manipulate this flag with the
+following macros:
+
+ SvUTF8(sv)
+ SvUTF8_on(sv)
+ SvUTF8_off(sv)
+
+This flag has an important effect on Perl's treatment of the string: if
+Unicode data is not properly distinguished, regular expressions,
+C<length>, C<substr> and other string handling operations will have
+undesirable results.
+
+The problem comes when you have, for instance, a string that isn't
+flagged as UTF-8, and contains a byte sequence that could be UTF-8 -
+especially when combining non-UTF-8 and UTF-8 strings.
+
+Never forget that the C<SVf_UTF8> flag is separate to the PV value; you
+need be sure you don't accidentally knock it off while you're
+manipulating SVs. More specifically, you cannot expect to do this:
+
+ SV *sv;
+ SV *nsv;
+ STRLEN len;
+ char *p;
+
+ p = SvPV(sv, len);
+ frobnicate(p);
+ nsv = newSVpvn(p, len);
+
+The C<char*> string does not tell you the whole story, and you can't
+copy or reconstruct an SV just by copying the string value. Check if the
+old SV has the UTF8 flag set, and act accordingly:
+
+ p = SvPV(sv, len);
+ frobnicate(p);
+ nsv = newSVpvn(p, len);
+ if (SvUTF8(sv))
+ SvUTF8_on(nsv);
+
+In fact, your C<frobnicate> function should be made aware of whether or
+not it's dealing with UTF-8 data, so that it can handle the string
+appropriately.
+
+Since just passing an SV to an XS function and copying the data of
+the SV is not enough to copy the UTF8 flags, even less right is just
+passing a C<char *> to an XS function.
+
+=head2 How do I convert a string to UTF-8?
+
+If you're mixing UTF-8 and non-UTF-8 strings, it is necessary to upgrade
+one of the strings to UTF-8. If you've got an SV, the easiest way to do
+this is:
+
+ sv_utf8_upgrade(sv);
+
+However, you must not do this, for example:
+
+ if (!SvUTF8(left))
+ sv_utf8_upgrade(left);
+
+If you do this in a binary operator, you will actually change one of the
+strings that came into the operator, and, while it shouldn't be noticeable
+by the end user, it can cause problems in deficient code.
+
+Instead, C<bytes_to_utf8> will give you a UTF-8-encoded B<copy> of its
+string argument. This is useful for having the data available for
+comparisons and so on, without harming the original SV. There's also
+C<utf8_to_bytes> to go the other way, but naturally, this will fail if
+the string contains any characters above 255 that can't be represented
+in a single byte.
+
+=head2 Is there anything else I need to know?
+
+Not really. Just remember these things:
+
+=over 3
+
+=item *
+
+There's no way to tell if a string is UTF-8 or not. You can tell if an SV
+is UTF-8 by looking at is C<SvUTF8> flag. Don't forget to set the flag if
+something should be UTF-8. Treat the flag as part of the PV, even though
+it's not - if you pass on the PV to somewhere, pass on the flag too.
+
+=item *
+
+If a string is UTF-8, B<always> use C<utf8_to_uv> to get at the value,
+unless C<UTF8_IS_INVARIANT(*s)> in which case you can use C<*s>.
+
+=item *
+
+When writing a character C<uv> to a UTF-8 string, B<always> use
+C<uv_to_utf8>, unless C<UTF8_IS_INVARIANT(uv))> in which case
+you can use C<*s = uv>.
+
+=item *
+
+Mixing UTF-8 and non-UTF-8 strings is tricky. Use C<bytes_to_utf8> to get
+a new string which is UTF-8 encoded, and then combine them.
+
+=back
+
+=head1 Custom Operators
+
+Custom operator support is a new experimental feature that allows you to
+define your own ops. This is primarily to allow the building of
+interpreters for other languages in the Perl core, but it also allows
+optimizations through the creation of "macro-ops" (ops which perform the
+functions of multiple ops which are usually executed together, such as
+C<gvsv, gvsv, add>.)
+
+This feature is implemented as a new op type, C<OP_CUSTOM>. The Perl
+core does not "know" anything special about this op type, and so it will
+not be involved in any optimizations. This also means that you can
+define your custom ops to be any op structure - unary, binary, list and
+so on - you like.
+
+It's important to know what custom operators won't do for you. They
+won't let you add new syntax to Perl, directly. They won't even let you
+add new keywords, directly. In fact, they won't change the way Perl
+compiles a program at all. You have to do those changes yourself, after
+Perl has compiled the program. You do this either by manipulating the op
+tree using a C<CHECK> block and the C<B::Generate> module, or by adding
+a custom peephole optimizer with the C<optimize> module.
+
+When you do this, you replace ordinary Perl ops with custom ops by
+creating ops with the type C<OP_CUSTOM> and the C<pp_addr> of your own
+PP function. This should be defined in XS code, and should look like
+the PP ops in C<pp_*.c>. You are responsible for ensuring that your op
+takes the appropriate number of values from the stack, and you are
+responsible for adding stack marks if necessary.
+
+You should also "register" your op with the Perl interpreter so that it
+can produce sensible error and warning messages. Since it is possible to
+have multiple custom ops within the one "logical" op type C<OP_CUSTOM>,
+Perl uses the value of C<< o->op_ppaddr >> as a key into the
+C<PL_custom_op_descs> and C<PL_custom_op_names> hashes. This means you
+need to enter a name and description for your op at the appropriate
+place in the C<PL_custom_op_names> and C<PL_custom_op_descs> hashes.
+
+Forthcoming versions of C<B::Generate> (version 1.0 and above) should
+directly support the creation of custom ops by name.
+
+=head1 AUTHORS
+
+Until May 1997, this document was maintained by Jeff Okamoto
+E<lt>okamoto@corp.hp.comE<gt>. It is now maintained as part of Perl
+itself by the Perl 5 Porters E<lt>perl5-porters@perl.orgE<gt>.
+
+With lots of help and suggestions from Dean Roehrich, Malcolm Beattie,
+Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil
+Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer,
+Stephen McCamant, and Gurusamy Sarathy.
+
+=head1 SEE ALSO
+
+perlapi(1), perlintern(1), perlxs(1), perlembed(1)
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlhack.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlhack.pod
new file mode 100755
index 00000000000..9f3688f9c13
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlhack.pod
@@ -0,0 +1,3375 @@
+=head1 NAME
+
+perlhack - How to hack at the Perl internals
+
+=head1 DESCRIPTION
+
+This document attempts to explain how Perl development takes place,
+and ends with some suggestions for people wanting to become bona fide
+porters.
+
+The perl5-porters mailing list is where the Perl standard distribution
+is maintained and developed. The list can get anywhere from 10 to 150
+messages a day, depending on the heatedness of the debate. Most days
+there are two or three patches, extensions, features, or bugs being
+discussed at a time.
+
+A searchable archive of the list is at either:
+
+ http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/
+
+or
+
+ http://archive.develooper.com/perl5-porters@perl.org/
+
+List subscribers (the porters themselves) come in several flavours.
+Some are quiet curious lurkers, who rarely pitch in and instead watch
+the ongoing development to ensure they're forewarned of new changes or
+features in Perl. Some are representatives of vendors, who are there
+to make sure that Perl continues to compile and work on their
+platforms. Some patch any reported bug that they know how to fix,
+some are actively patching their pet area (threads, Win32, the regexp
+engine), while others seem to do nothing but complain. In other
+words, it's your usual mix of technical people.
+
+Over this group of porters presides Larry Wall. He has the final word
+in what does and does not change in the Perl language. Various
+releases of Perl are shepherded by a "pumpking", a porter
+responsible for gathering patches, deciding on a patch-by-patch,
+feature-by-feature basis what will and will not go into the release.
+For instance, Gurusamy Sarathy was the pumpking for the 5.6 release of
+Perl, and Jarkko Hietaniemi was the pumpking for the 5.8 release, and
+Rafael Garcia-Suarez holds the pumpking crown for the 5.10 release.
+
+In addition, various people are pumpkings for different things. For
+instance, Andy Dougherty and Jarkko Hietaniemi did a grand job as the
+I<Configure> pumpkin up till the 5.8 release. For the 5.10 release
+H.Merijn Brand took over.
+
+Larry sees Perl development along the lines of the US government:
+there's the Legislature (the porters), the Executive branch (the
+pumpkings), and the Supreme Court (Larry). The legislature can
+discuss and submit patches to the executive branch all they like, but
+the executive branch is free to veto them. Rarely, the Supreme Court
+will side with the executive branch over the legislature, or the
+legislature over the executive branch. Mostly, however, the
+legislature and the executive branch are supposed to get along and
+work out their differences without impeachment or court cases.
+
+You might sometimes see reference to Rule 1 and Rule 2. Larry's power
+as Supreme Court is expressed in The Rules:
+
+=over 4
+
+=item 1
+
+Larry is always by definition right about how Perl should behave.
+This means he has final veto power on the core functionality.
+
+=item 2
+
+Larry is allowed to change his mind about any matter at a later date,
+regardless of whether he previously invoked Rule 1.
+
+=back
+
+Got that? Larry is always right, even when he was wrong. It's rare
+to see either Rule exercised, but they are often alluded to.
+
+New features and extensions to the language are contentious, because
+the criteria used by the pumpkings, Larry, and other porters to decide
+which features should be implemented and incorporated are not codified
+in a few small design goals as with some other languages. Instead,
+the heuristics are flexible and often difficult to fathom. Here is
+one person's list, roughly in decreasing order of importance, of
+heuristics that new features have to be weighed against:
+
+=over 4
+
+=item Does concept match the general goals of Perl?
+
+These haven't been written anywhere in stone, but one approximation
+is:
+
+ 1. Keep it fast, simple, and useful.
+ 2. Keep features/concepts as orthogonal as possible.
+ 3. No arbitrary limits (platforms, data sizes, cultures).
+ 4. Keep it open and exciting to use/patch/advocate Perl everywhere.
+ 5. Either assimilate new technologies, or build bridges to them.
+
+=item Where is the implementation?
+
+All the talk in the world is useless without an implementation. In
+almost every case, the person or people who argue for a new feature
+will be expected to be the ones who implement it. Porters capable
+of coding new features have their own agendas, and are not available
+to implement your (possibly good) idea.
+
+=item Backwards compatibility
+
+It's a cardinal sin to break existing Perl programs. New warnings are
+contentious--some say that a program that emits warnings is not
+broken, while others say it is. Adding keywords has the potential to
+break programs, changing the meaning of existing token sequences or
+functions might break programs.
+
+=item Could it be a module instead?
+
+Perl 5 has extension mechanisms, modules and XS, specifically to avoid
+the need to keep changing the Perl interpreter. You can write modules
+that export functions, you can give those functions prototypes so they
+can be called like built-in functions, you can even write XS code to
+mess with the runtime data structures of the Perl interpreter if you
+want to implement really complicated things. If it can be done in a
+module instead of in the core, it's highly unlikely to be added.
+
+=item Is the feature generic enough?
+
+Is this something that only the submitter wants added to the language,
+or would it be broadly useful? Sometimes, instead of adding a feature
+with a tight focus, the porters might decide to wait until someone
+implements the more generalized feature. For instance, instead of
+implementing a "delayed evaluation" feature, the porters are waiting
+for a macro system that would permit delayed evaluation and much more.
+
+=item Does it potentially introduce new bugs?
+
+Radical rewrites of large chunks of the Perl interpreter have the
+potential to introduce new bugs. The smaller and more localized the
+change, the better.
+
+=item Does it preclude other desirable features?
+
+A patch is likely to be rejected if it closes off future avenues of
+development. For instance, a patch that placed a true and final
+interpretation on prototypes is likely to be rejected because there
+are still options for the future of prototypes that haven't been
+addressed.
+
+=item Is the implementation robust?
+
+Good patches (tight code, complete, correct) stand more chance of
+going in. Sloppy or incorrect patches might be placed on the back
+burner until the pumpking has time to fix, or might be discarded
+altogether without further notice.
+
+=item Is the implementation generic enough to be portable?
+
+The worst patches make use of a system-specific features. It's highly
+unlikely that non-portable additions to the Perl language will be
+accepted.
+
+=item Is the implementation tested?
+
+Patches which change behaviour (fixing bugs or introducing new features)
+must include regression tests to verify that everything works as expected.
+Without tests provided by the original author, how can anyone else changing
+perl in the future be sure that they haven't unwittingly broken the behaviour
+the patch implements? And without tests, how can the patch's author be
+confident that his/her hard work put into the patch won't be accidentally
+thrown away by someone in the future?
+
+=item Is there enough documentation?
+
+Patches without documentation are probably ill-thought out or
+incomplete. Nothing can be added without documentation, so submitting
+a patch for the appropriate manpages as well as the source code is
+always a good idea.
+
+=item Is there another way to do it?
+
+Larry said "Although the Perl Slogan is I<There's More Than One Way
+to Do It>, I hesitate to make 10 ways to do something". This is a
+tricky heuristic to navigate, though--one man's essential addition is
+another man's pointless cruft.
+
+=item Does it create too much work?
+
+Work for the pumpking, work for Perl programmers, work for module
+authors, ... Perl is supposed to be easy.
+
+=item Patches speak louder than words
+
+Working code is always preferred to pie-in-the-sky ideas. A patch to
+add a feature stands a much higher chance of making it to the language
+than does a random feature request, no matter how fervently argued the
+request might be. This ties into "Will it be useful?", as the fact
+that someone took the time to make the patch demonstrates a strong
+desire for the feature.
+
+=back
+
+If you're on the list, you might hear the word "core" bandied
+around. It refers to the standard distribution. "Hacking on the
+core" means you're changing the C source code to the Perl
+interpreter. "A core module" is one that ships with Perl.
+
+=head2 Keeping in sync
+
+The source code to the Perl interpreter, in its different versions, is
+kept in a repository managed by the git revision control system. The
+pumpkings and a few others have write access to the repository to check in
+changes.
+
+How to clone and use the git perl repository is described in L<perlrepository>.
+
+You can also choose to use rsync to get a copy of the current source tree
+for the bleadperl branch and all maintenance branches :
+
+ $ rsync -avz rsync://perl5.git.perl.org/APC/perl-current .
+ $ rsync -avz rsync://perl5.git.perl.org/APC/perl-5.10.x .
+ $ rsync -avz rsync://perl5.git.perl.org/APC/perl-5.8.x .
+ $ rsync -avz rsync://perl5.git.perl.org/APC/perl-5.6.x .
+ $ rsync -avz rsync://perl5.git.perl.org/APC/perl-5.005xx .
+
+(Add the C<--delete> option to remove leftover files)
+
+You may also want to subscribe to the perl5-changes mailing list to
+receive a copy of each patch that gets submitted to the maintenance
+and development "branches" of the perl repository. See
+http://lists.perl.org/ for subscription information.
+
+If you are a member of the perl5-porters mailing list, it is a good
+thing to keep in touch with the most recent changes. If not only to
+verify if what you would have posted as a bug report isn't already
+solved in the most recent available perl development branch, also
+known as perl-current, bleading edge perl, bleedperl or bleadperl.
+
+Needless to say, the source code in perl-current is usually in a perpetual
+state of evolution. You should expect it to be very buggy. Do B<not> use
+it for any purpose other than testing and development.
+
+=head2 Perlbug administration
+
+There is a single remote administrative interface for modifying bug status,
+category, open issues etc. using the B<RT> bugtracker system, maintained
+by Robert Spier. Become an administrator, and close any bugs you can get
+your sticky mitts on:
+
+ http://bugs.perl.org/
+
+To email the bug system administrators:
+
+ "perlbug-admin" <perlbug-admin@perl.org>
+
+=head2 Submitting patches
+
+Always submit patches to I<perl5-porters@perl.org>. If you're
+patching a core module and there's an author listed, send the author a
+copy (see L<Patching a core module>). This lets other porters review
+your patch, which catches a surprising number of errors in patches.
+Please patch against the latest B<development> version. (e.g., even if
+you're fixing a bug in the 5.8 track, patch against the C<blead> branch in
+the git repository.)
+
+If changes are accepted, they are applied to the development branch. Then
+the maintenance pumpking decides which of those patches is to be
+backported to the maint branch. Only patches that survive the heat of the
+development branch get applied to maintenance versions.
+
+Your patch should update the documentation and test suite. See
+L<Writing a test>. If you have added or removed files in the distribution,
+edit the MANIFEST file accordingly, sort the MANIFEST file using
+C<make manisort>, and include those changes as part of your patch.
+
+Patching documentation also follows the same order: if accepted, a patch
+is first applied to B<development>, and if relevant then it's backported
+to B<maintenance>. (With an exception for some patches that document
+behaviour that only appears in the maintenance branch, but which has
+changed in the development version.)
+
+To report a bug in Perl, use the program I<perlbug> which comes with
+Perl (if you can't get Perl to work, send mail to the address
+I<perlbug@perl.org> or I<perlbug@perl.com>). Reporting bugs through
+I<perlbug> feeds into the automated bug-tracking system, access to
+which is provided through the web at http://rt.perl.org/rt3/ . It
+often pays to check the archives of the perl5-porters mailing list to
+see whether the bug you're reporting has been reported before, and if
+so whether it was considered a bug. See above for the location of
+the searchable archives.
+
+The CPAN testers ( http://testers.cpan.org/ ) are a group of
+volunteers who test CPAN modules on a variety of platforms. Perl
+Smokers ( http://www.nntp.perl.org/group/perl.daily-build and
+http://www.nntp.perl.org/group/perl.daily-build.reports/ )
+automatically test Perl source releases on platforms with various
+configurations. Both efforts welcome volunteers. In order to get
+involved in smoke testing of the perl itself visit
+L<http://search.cpan.org/dist/Test-Smoke>. In order to start smoke
+testing CPAN modules visit L<http://search.cpan.org/dist/CPAN-YACSmoke/>
+or L<http://search.cpan.org/dist/POE-Component-CPAN-YACSmoke/> or
+L<http://search.cpan.org/dist/CPAN-Reporter/>.
+
+It's a good idea to read and lurk for a while before chipping in.
+That way you'll get to see the dynamic of the conversations, learn the
+personalities of the players, and hopefully be better prepared to make
+a useful contribution when do you speak up.
+
+If after all this you still think you want to join the perl5-porters
+mailing list, send mail to I<perl5-porters-subscribe@perl.org>. To
+unsubscribe, send mail to I<perl5-porters-unsubscribe@perl.org>.
+
+To hack on the Perl guts, you'll need to read the following things:
+
+=over 3
+
+=item L<perlguts>
+
+This is of paramount importance, since it's the documentation of what
+goes where in the Perl source. Read it over a couple of times and it
+might start to make sense - don't worry if it doesn't yet, because the
+best way to study it is to read it in conjunction with poking at Perl
+source, and we'll do that later on.
+
+Gisle Aas's illustrated perlguts (aka: illguts) is wonderful, although
+a little out of date wrt some size details; the various SV structures
+have since been reworked for smaller memory footprint. The
+fundamentals are right however, and the pictures are very helpful.
+
+http://www.perl.org/tpc/1998/Perl_Language_and_Modules/Perl%20Illustrated/
+
+=item L<perlxstut> and L<perlxs>
+
+A working knowledge of XSUB programming is incredibly useful for core
+hacking; XSUBs use techniques drawn from the PP code, the portion of the
+guts that actually executes a Perl program. It's a lot gentler to learn
+those techniques from simple examples and explanation than from the core
+itself.
+
+=item L<perlapi>
+
+The documentation for the Perl API explains what some of the internal
+functions do, as well as the many macros used in the source.
+
+=item F<Porting/pumpkin.pod>
+
+This is a collection of words of wisdom for a Perl porter; some of it is
+only useful to the pumpkin holder, but most of it applies to anyone
+wanting to go about Perl development.
+
+=item The perl5-porters FAQ
+
+This should be available from http://dev.perl.org/perl5/docs/p5p-faq.html .
+It contains hints on reading perl5-porters, information on how
+perl5-porters works and how Perl development in general works.
+
+=back
+
+=head2 Finding Your Way Around
+
+Perl maintenance can be split into a number of areas, and certain people
+(pumpkins) will have responsibility for each area. These areas sometimes
+correspond to files or directories in the source kit. Among the areas are:
+
+=over 3
+
+=item Core modules
+
+Modules shipped as part of the Perl core live in the F<lib/> and F<ext/>
+subdirectories: F<lib/> is for the pure-Perl modules, and F<ext/>
+contains the core XS modules.
+
+=item Tests
+
+There are tests for nearly all the modules, built-ins and major bits
+of functionality. Test files all have a .t suffix. Module tests live
+in the F<lib/> and F<ext/> directories next to the module being
+tested. Others live in F<t/>. See L<Writing a test>
+
+=item Documentation
+
+Documentation maintenance includes looking after everything in the
+F<pod/> directory, (as well as contributing new documentation) and
+the documentation to the modules in core.
+
+=item Configure
+
+The configure process is the way we make Perl portable across the
+myriad of operating systems it supports. Responsibility for the
+configure, build and installation process, as well as the overall
+portability of the core code rests with the configure pumpkin - others
+help out with individual operating systems.
+
+The files involved are the operating system directories, (F<win32/>,
+F<os2/>, F<vms/> and so on) the shell scripts which generate F<config.h>
+and F<Makefile>, as well as the metaconfig files which generate
+F<Configure>. (metaconfig isn't included in the core distribution.)
+
+=item Interpreter
+
+And of course, there's the core of the Perl interpreter itself. Let's
+have a look at that in a little more detail.
+
+=back
+
+Before we leave looking at the layout, though, don't forget that
+F<MANIFEST> contains not only the file names in the Perl distribution,
+but short descriptions of what's in them, too. For an overview of the
+important files, try this:
+
+ perl -lne 'print if /^[^\/]+\.[ch]\s+/' MANIFEST
+
+=head2 Elements of the interpreter
+
+The work of the interpreter has two main stages: compiling the code
+into the internal representation, or bytecode, and then executing it.
+L<perlguts/Compiled code> explains exactly how the compilation stage
+happens.
+
+Here is a short breakdown of perl's operation:
+
+=over 3
+
+=item Startup
+
+The action begins in F<perlmain.c>. (or F<miniperlmain.c> for miniperl)
+This is very high-level code, enough to fit on a single screen, and it
+resembles the code found in L<perlembed>; most of the real action takes
+place in F<perl.c>
+
+F<perlmain.c> is generated by L<writemain> from F<miniperlmain.c> at
+make time, so you should make perl to follow this along.
+
+First, F<perlmain.c> allocates some memory and constructs a Perl
+interpreter, along these lines:
+
+ 1 PERL_SYS_INIT3(&argc,&argv,&env);
+ 2
+ 3 if (!PL_do_undump) {
+ 4 my_perl = perl_alloc();
+ 5 if (!my_perl)
+ 6 exit(1);
+ 7 perl_construct(my_perl);
+ 8 PL_perl_destruct_level = 0;
+ 9 }
+
+Line 1 is a macro, and its definition is dependent on your operating
+system. Line 3 references C<PL_do_undump>, a global variable - all
+global variables in Perl start with C<PL_>. This tells you whether the
+current running program was created with the C<-u> flag to perl and then
+F<undump>, which means it's going to be false in any sane context.
+
+Line 4 calls a function in F<perl.c> to allocate memory for a Perl
+interpreter. It's quite a simple function, and the guts of it looks like
+this:
+
+ my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
+
+Here you see an example of Perl's system abstraction, which we'll see
+later: C<PerlMem_malloc> is either your system's C<malloc>, or Perl's
+own C<malloc> as defined in F<malloc.c> if you selected that option at
+configure time.
+
+Next, in line 7, we construct the interpreter using perl_construct,
+also in F<perl.c>; this sets up all the special variables that Perl
+needs, the stacks, and so on.
+
+Now we pass Perl the command line options, and tell it to go:
+
+ exitstatus = perl_parse(my_perl, xs_init, argc, argv, (char **)NULL);
+ if (!exitstatus)
+ perl_run(my_perl);
+
+ exitstatus = perl_destruct(my_perl);
+
+ perl_free(my_perl);
+
+C<perl_parse> is actually a wrapper around C<S_parse_body>, as defined
+in F<perl.c>, which processes the command line options, sets up any
+statically linked XS modules, opens the program and calls C<yyparse> to
+parse it.
+
+=item Parsing
+
+The aim of this stage is to take the Perl source, and turn it into an op
+tree. We'll see what one of those looks like later. Strictly speaking,
+there's three things going on here.
+
+C<yyparse>, the parser, lives in F<perly.c>, although you're better off
+reading the original YACC input in F<perly.y>. (Yes, Virginia, there
+B<is> a YACC grammar for Perl!) The job of the parser is to take your
+code and "understand" it, splitting it into sentences, deciding which
+operands go with which operators and so on.
+
+The parser is nobly assisted by the lexer, which chunks up your input
+into tokens, and decides what type of thing each token is: a variable
+name, an operator, a bareword, a subroutine, a core function, and so on.
+The main point of entry to the lexer is C<yylex>, and that and its
+associated routines can be found in F<toke.c>. Perl isn't much like
+other computer languages; it's highly context sensitive at times, it can
+be tricky to work out what sort of token something is, or where a token
+ends. As such, there's a lot of interplay between the tokeniser and the
+parser, which can get pretty frightening if you're not used to it.
+
+As the parser understands a Perl program, it builds up a tree of
+operations for the interpreter to perform during execution. The routines
+which construct and link together the various operations are to be found
+in F<op.c>, and will be examined later.
+
+=item Optimization
+
+Now the parsing stage is complete, and the finished tree represents
+the operations that the Perl interpreter needs to perform to execute our
+program. Next, Perl does a dry run over the tree looking for
+optimisations: constant expressions such as C<3 + 4> will be computed
+now, and the optimizer will also see if any multiple operations can be
+replaced with a single one. For instance, to fetch the variable C<$foo>,
+instead of grabbing the glob C<*foo> and looking at the scalar
+component, the optimizer fiddles the op tree to use a function which
+directly looks up the scalar in question. The main optimizer is C<peep>
+in F<op.c>, and many ops have their own optimizing functions.
+
+=item Running
+
+Now we're finally ready to go: we have compiled Perl byte code, and all
+that's left to do is run it. The actual execution is done by the
+C<runops_standard> function in F<run.c>; more specifically, it's done by
+these three innocent looking lines:
+
+ while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX))) {
+ PERL_ASYNC_CHECK();
+ }
+
+You may be more comfortable with the Perl version of that:
+
+ PERL_ASYNC_CHECK() while $Perl::op = &{$Perl::op->{function}};
+
+Well, maybe not. Anyway, each op contains a function pointer, which
+stipulates the function which will actually carry out the operation.
+This function will return the next op in the sequence - this allows for
+things like C<if> which choose the next op dynamically at run time.
+The C<PERL_ASYNC_CHECK> makes sure that things like signals interrupt
+execution if required.
+
+The actual functions called are known as PP code, and they're spread
+between four files: F<pp_hot.c> contains the "hot" code, which is most
+often used and highly optimized, F<pp_sys.c> contains all the
+system-specific functions, F<pp_ctl.c> contains the functions which
+implement control structures (C<if>, C<while> and the like) and F<pp.c>
+contains everything else. These are, if you like, the C code for Perl's
+built-in functions and operators.
+
+Note that each C<pp_> function is expected to return a pointer to the next
+op. Calls to perl subs (and eval blocks) are handled within the same
+runops loop, and do not consume extra space on the C stack. For example,
+C<pp_entersub> and C<pp_entertry> just push a C<CxSUB> or C<CxEVAL> block
+struct onto the context stack which contain the address of the op
+following the sub call or eval. They then return the first op of that sub
+or eval block, and so execution continues of that sub or block. Later, a
+C<pp_leavesub> or C<pp_leavetry> op pops the C<CxSUB> or C<CxEVAL>,
+retrieves the return op from it, and returns it.
+
+=item Exception handing
+
+Perl's exception handing (i.e. C<die> etc.) is built on top of the low-level
+C<setjmp()>/C<longjmp()> C-library functions. These basically provide a
+way to capture the current PC and SP registers and later restore them; i.e.
+a C<longjmp()> continues at the point in code where a previous C<setjmp()>
+was done, with anything further up on the C stack being lost. This is why
+code should always save values using C<SAVE_FOO> rather than in auto
+variables.
+
+The perl core wraps C<setjmp()> etc in the macros C<JMPENV_PUSH> and
+C<JMPENV_JUMP>. The basic rule of perl exceptions is that C<exit>, and
+C<die> (in the absence of C<eval>) perform a C<JMPENV_JUMP(2)>, while
+C<die> within C<eval> does a C<JMPENV_JUMP(3)>.
+
+At entry points to perl, such as C<perl_parse()>, C<perl_run()> and
+C<call_sv(cv, G_EVAL)> each does a C<JMPENV_PUSH>, then enter a runops
+loop or whatever, and handle possible exception returns. For a 2 return,
+final cleanup is performed, such as popping stacks and calling C<CHECK> or
+C<END> blocks. Amongst other things, this is how scope cleanup still
+occurs during an C<exit>.
+
+If a C<die> can find a C<CxEVAL> block on the context stack, then the
+stack is popped to that level and the return op in that block is assigned
+to C<PL_restartop>; then a C<JMPENV_JUMP(3)> is performed. This normally
+passes control back to the guard. In the case of C<perl_run> and
+C<call_sv>, a non-null C<PL_restartop> triggers re-entry to the runops
+loop. The is the normal way that C<die> or C<croak> is handled within an
+C<eval>.
+
+Sometimes ops are executed within an inner runops loop, such as tie, sort
+or overload code. In this case, something like
+
+ sub FETCH { eval { die } }
+
+would cause a longjmp right back to the guard in C<perl_run>, popping both
+runops loops, which is clearly incorrect. One way to avoid this is for the
+tie code to do a C<JMPENV_PUSH> before executing C<FETCH> in the inner
+runops loop, but for efficiency reasons, perl in fact just sets a flag,
+using C<CATCH_SET(TRUE)>. The C<pp_require>, C<pp_entereval> and
+C<pp_entertry> ops check this flag, and if true, they call C<docatch>,
+which does a C<JMPENV_PUSH> and starts a new runops level to execute the
+code, rather than doing it on the current loop.
+
+As a further optimisation, on exit from the eval block in the C<FETCH>,
+execution of the code following the block is still carried on in the inner
+loop. When an exception is raised, C<docatch> compares the C<JMPENV>
+level of the C<CxEVAL> with C<PL_top_env> and if they differ, just
+re-throws the exception. In this way any inner loops get popped.
+
+Here's an example.
+
+ 1: eval { tie @a, 'A' };
+ 2: sub A::TIEARRAY {
+ 3: eval { die };
+ 4: die;
+ 5: }
+
+To run this code, C<perl_run> is called, which does a C<JMPENV_PUSH> then
+enters a runops loop. This loop executes the eval and tie ops on line 1,
+with the eval pushing a C<CxEVAL> onto the context stack.
+
+The C<pp_tie> does a C<CATCH_SET(TRUE)>, then starts a second runops loop
+to execute the body of C<TIEARRAY>. When it executes the entertry op on
+line 3, C<CATCH_GET> is true, so C<pp_entertry> calls C<docatch> which
+does a C<JMPENV_PUSH> and starts a third runops loop, which then executes
+the die op. At this point the C call stack looks like this:
+
+ Perl_pp_die
+ Perl_runops # third loop
+ S_docatch_body
+ S_docatch
+ Perl_pp_entertry
+ Perl_runops # second loop
+ S_call_body
+ Perl_call_sv
+ Perl_pp_tie
+ Perl_runops # first loop
+ S_run_body
+ perl_run
+ main
+
+and the context and data stacks, as shown by C<-Dstv>, look like:
+
+ STACK 0: MAIN
+ CX 0: BLOCK =>
+ CX 1: EVAL => AV() PV("A"\0)
+ retop=leave
+ STACK 1: MAGIC
+ CX 0: SUB =>
+ retop=(null)
+ CX 1: EVAL => *
+ retop=nextstate
+
+The die pops the first C<CxEVAL> off the context stack, sets
+C<PL_restartop> from it, does a C<JMPENV_JUMP(3)>, and control returns to
+the top C<docatch>. This then starts another third-level runops level,
+which executes the nextstate, pushmark and die ops on line 4. At the point
+that the second C<pp_die> is called, the C call stack looks exactly like
+that above, even though we are no longer within an inner eval; this is
+because of the optimization mentioned earlier. However, the context stack
+now looks like this, ie with the top CxEVAL popped:
+
+ STACK 0: MAIN
+ CX 0: BLOCK =>
+ CX 1: EVAL => AV() PV("A"\0)
+ retop=leave
+ STACK 1: MAGIC
+ CX 0: SUB =>
+ retop=(null)
+
+The die on line 4 pops the context stack back down to the CxEVAL, leaving
+it as:
+
+ STACK 0: MAIN
+ CX 0: BLOCK =>
+
+As usual, C<PL_restartop> is extracted from the C<CxEVAL>, and a
+C<JMPENV_JUMP(3)> done, which pops the C stack back to the docatch:
+
+ S_docatch
+ Perl_pp_entertry
+ Perl_runops # second loop
+ S_call_body
+ Perl_call_sv
+ Perl_pp_tie
+ Perl_runops # first loop
+ S_run_body
+ perl_run
+ main
+
+In this case, because the C<JMPENV> level recorded in the C<CxEVAL>
+differs from the current one, C<docatch> just does a C<JMPENV_JUMP(3)>
+and the C stack unwinds to:
+
+ perl_run
+ main
+
+Because C<PL_restartop> is non-null, C<run_body> starts a new runops loop
+and execution continues.
+
+=back
+
+=head2 Internal Variable Types
+
+You should by now have had a look at L<perlguts>, which tells you about
+Perl's internal variable types: SVs, HVs, AVs and the rest. If not, do
+that now.
+
+These variables are used not only to represent Perl-space variables, but
+also any constants in the code, as well as some structures completely
+internal to Perl. The symbol table, for instance, is an ordinary Perl
+hash. Your code is represented by an SV as it's read into the parser;
+any program files you call are opened via ordinary Perl filehandles, and
+so on.
+
+The core L<Devel::Peek|Devel::Peek> module lets us examine SVs from a
+Perl program. Let's see, for instance, how Perl treats the constant
+C<"hello">.
+
+ % perl -MDevel::Peek -e 'Dump("hello")'
+ 1 SV = PV(0xa041450) at 0xa04ecbc
+ 2 REFCNT = 1
+ 3 FLAGS = (POK,READONLY,pPOK)
+ 4 PV = 0xa0484e0 "hello"\0
+ 5 CUR = 5
+ 6 LEN = 6
+
+Reading C<Devel::Peek> output takes a bit of practise, so let's go
+through it line by line.
+
+Line 1 tells us we're looking at an SV which lives at C<0xa04ecbc> in
+memory. SVs themselves are very simple structures, but they contain a
+pointer to a more complex structure. In this case, it's a PV, a
+structure which holds a string value, at location C<0xa041450>. Line 2
+is the reference count; there are no other references to this data, so
+it's 1.
+
+Line 3 are the flags for this SV - it's OK to use it as a PV, it's a
+read-only SV (because it's a constant) and the data is a PV internally.
+Next we've got the contents of the string, starting at location
+C<0xa0484e0>.
+
+Line 5 gives us the current length of the string - note that this does
+B<not> include the null terminator. Line 6 is not the length of the
+string, but the length of the currently allocated buffer; as the string
+grows, Perl automatically extends the available storage via a routine
+called C<SvGROW>.
+
+You can get at any of these quantities from C very easily; just add
+C<Sv> to the name of the field shown in the snippet, and you've got a
+macro which will return the value: C<SvCUR(sv)> returns the current
+length of the string, C<SvREFCOUNT(sv)> returns the reference count,
+C<SvPV(sv, len)> returns the string itself with its length, and so on.
+More macros to manipulate these properties can be found in L<perlguts>.
+
+Let's take an example of manipulating a PV, from C<sv_catpvn>, in F<sv.c>
+
+ 1 void
+ 2 Perl_sv_catpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
+ 3 {
+ 4 STRLEN tlen;
+ 5 char *junk;
+
+ 6 junk = SvPV_force(sv, tlen);
+ 7 SvGROW(sv, tlen + len + 1);
+ 8 if (ptr == junk)
+ 9 ptr = SvPVX(sv);
+ 10 Move(ptr,SvPVX(sv)+tlen,len,char);
+ 11 SvCUR(sv) += len;
+ 12 *SvEND(sv) = '\0';
+ 13 (void)SvPOK_only_UTF8(sv); /* validate pointer */
+ 14 SvTAINT(sv);
+ 15 }
+
+This is a function which adds a string, C<ptr>, of length C<len> onto
+the end of the PV stored in C<sv>. The first thing we do in line 6 is
+make sure that the SV B<has> a valid PV, by calling the C<SvPV_force>
+macro to force a PV. As a side effect, C<tlen> gets set to the current
+value of the PV, and the PV itself is returned to C<junk>.
+
+In line 7, we make sure that the SV will have enough room to accommodate
+the old string, the new string and the null terminator. If C<LEN> isn't
+big enough, C<SvGROW> will reallocate space for us.
+
+Now, if C<junk> is the same as the string we're trying to add, we can
+grab the string directly from the SV; C<SvPVX> is the address of the PV
+in the SV.
+
+Line 10 does the actual catenation: the C<Move> macro moves a chunk of
+memory around: we move the string C<ptr> to the end of the PV - that's
+the start of the PV plus its current length. We're moving C<len> bytes
+of type C<char>. After doing so, we need to tell Perl we've extended the
+string, by altering C<CUR> to reflect the new length. C<SvEND> is a
+macro which gives us the end of the string, so that needs to be a
+C<"\0">.
+
+Line 13 manipulates the flags; since we've changed the PV, any IV or NV
+values will no longer be valid: if we have C<$a=10; $a.="6";> we don't
+want to use the old IV of 10. C<SvPOK_only_utf8> is a special UTF-8-aware
+version of C<SvPOK_only>, a macro which turns off the IOK and NOK flags
+and turns on POK. The final C<SvTAINT> is a macro which launders tainted
+data if taint mode is turned on.
+
+AVs and HVs are more complicated, but SVs are by far the most common
+variable type being thrown around. Having seen something of how we
+manipulate these, let's go on and look at how the op tree is
+constructed.
+
+=head2 Op Trees
+
+First, what is the op tree, anyway? The op tree is the parsed
+representation of your program, as we saw in our section on parsing, and
+it's the sequence of operations that Perl goes through to execute your
+program, as we saw in L</Running>.
+
+An op is a fundamental operation that Perl can perform: all the built-in
+functions and operators are ops, and there are a series of ops which
+deal with concepts the interpreter needs internally - entering and
+leaving a block, ending a statement, fetching a variable, and so on.
+
+The op tree is connected in two ways: you can imagine that there are two
+"routes" through it, two orders in which you can traverse the tree.
+First, parse order reflects how the parser understood the code, and
+secondly, execution order tells perl what order to perform the
+operations in.
+
+The easiest way to examine the op tree is to stop Perl after it has
+finished parsing, and get it to dump out the tree. This is exactly what
+the compiler backends L<B::Terse|B::Terse>, L<B::Concise|B::Concise>
+and L<B::Debug|B::Debug> do.
+
+Let's have a look at how Perl sees C<$a = $b + $c>:
+
+ % perl -MO=Terse -e '$a=$b+$c'
+ 1 LISTOP (0x8179888) leave
+ 2 OP (0x81798b0) enter
+ 3 COP (0x8179850) nextstate
+ 4 BINOP (0x8179828) sassign
+ 5 BINOP (0x8179800) add [1]
+ 6 UNOP (0x81796e0) null [15]
+ 7 SVOP (0x80fafe0) gvsv GV (0x80fa4cc) *b
+ 8 UNOP (0x81797e0) null [15]
+ 9 SVOP (0x8179700) gvsv GV (0x80efeb0) *c
+ 10 UNOP (0x816b4f0) null [15]
+ 11 SVOP (0x816dcf0) gvsv GV (0x80fa460) *a
+
+Let's start in the middle, at line 4. This is a BINOP, a binary
+operator, which is at location C<0x8179828>. The specific operator in
+question is C<sassign> - scalar assignment - and you can find the code
+which implements it in the function C<pp_sassign> in F<pp_hot.c>. As a
+binary operator, it has two children: the add operator, providing the
+result of C<$b+$c>, is uppermost on line 5, and the left hand side is on
+line 10.
+
+Line 10 is the null op: this does exactly nothing. What is that doing
+there? If you see the null op, it's a sign that something has been
+optimized away after parsing. As we mentioned in L</Optimization>,
+the optimization stage sometimes converts two operations into one, for
+example when fetching a scalar variable. When this happens, instead of
+rewriting the op tree and cleaning up the dangling pointers, it's easier
+just to replace the redundant operation with the null op. Originally,
+the tree would have looked like this:
+
+ 10 SVOP (0x816b4f0) rv2sv [15]
+ 11 SVOP (0x816dcf0) gv GV (0x80fa460) *a
+
+That is, fetch the C<a> entry from the main symbol table, and then look
+at the scalar component of it: C<gvsv> (C<pp_gvsv> into F<pp_hot.c>)
+happens to do both these things.
+
+The right hand side, starting at line 5 is similar to what we've just
+seen: we have the C<add> op (C<pp_add> also in F<pp_hot.c>) add together
+two C<gvsv>s.
+
+Now, what's this about?
+
+ 1 LISTOP (0x8179888) leave
+ 2 OP (0x81798b0) enter
+ 3 COP (0x8179850) nextstate
+
+C<enter> and C<leave> are scoping ops, and their job is to perform any
+housekeeping every time you enter and leave a block: lexical variables
+are tidied up, unreferenced variables are destroyed, and so on. Every
+program will have those first three lines: C<leave> is a list, and its
+children are all the statements in the block. Statements are delimited
+by C<nextstate>, so a block is a collection of C<nextstate> ops, with
+the ops to be performed for each statement being the children of
+C<nextstate>. C<enter> is a single op which functions as a marker.
+
+That's how Perl parsed the program, from top to bottom:
+
+ Program
+ |
+ Statement
+ |
+ =
+ / \
+ / \
+ $a +
+ / \
+ $b $c
+
+However, it's impossible to B<perform> the operations in this order:
+you have to find the values of C<$b> and C<$c> before you add them
+together, for instance. So, the other thread that runs through the op
+tree is the execution order: each op has a field C<op_next> which points
+to the next op to be run, so following these pointers tells us how perl
+executes the code. We can traverse the tree in this order using
+the C<exec> option to C<B::Terse>:
+
+ % perl -MO=Terse,exec -e '$a=$b+$c'
+ 1 OP (0x8179928) enter
+ 2 COP (0x81798c8) nextstate
+ 3 SVOP (0x81796c8) gvsv GV (0x80fa4d4) *b
+ 4 SVOP (0x8179798) gvsv GV (0x80efeb0) *c
+ 5 BINOP (0x8179878) add [1]
+ 6 SVOP (0x816dd38) gvsv GV (0x80fa468) *a
+ 7 BINOP (0x81798a0) sassign
+ 8 LISTOP (0x8179900) leave
+
+This probably makes more sense for a human: enter a block, start a
+statement. Get the values of C<$b> and C<$c>, and add them together.
+Find C<$a>, and assign one to the other. Then leave.
+
+The way Perl builds up these op trees in the parsing process can be
+unravelled by examining F<perly.y>, the YACC grammar. Let's take the
+piece we need to construct the tree for C<$a = $b + $c>
+
+ 1 term : term ASSIGNOP term
+ 2 { $$ = newASSIGNOP(OPf_STACKED, $1, $2, $3); }
+ 3 | term ADDOP term
+ 4 { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
+
+If you're not used to reading BNF grammars, this is how it works: You're
+fed certain things by the tokeniser, which generally end up in upper
+case. Here, C<ADDOP>, is provided when the tokeniser sees C<+> in your
+code. C<ASSIGNOP> is provided when C<=> is used for assigning. These are
+"terminal symbols", because you can't get any simpler than them.
+
+The grammar, lines one and three of the snippet above, tells you how to
+build up more complex forms. These complex forms, "non-terminal symbols"
+are generally placed in lower case. C<term> here is a non-terminal
+symbol, representing a single expression.
+
+The grammar gives you the following rule: you can make the thing on the
+left of the colon if you see all the things on the right in sequence.
+This is called a "reduction", and the aim of parsing is to completely
+reduce the input. There are several different ways you can perform a
+reduction, separated by vertical bars: so, C<term> followed by C<=>
+followed by C<term> makes a C<term>, and C<term> followed by C<+>
+followed by C<term> can also make a C<term>.
+
+So, if you see two terms with an C<=> or C<+>, between them, you can
+turn them into a single expression. When you do this, you execute the
+code in the block on the next line: if you see C<=>, you'll do the code
+in line 2. If you see C<+>, you'll do the code in line 4. It's this code
+which contributes to the op tree.
+
+ | term ADDOP term
+ { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
+
+What this does is creates a new binary op, and feeds it a number of
+variables. The variables refer to the tokens: C<$1> is the first token in
+the input, C<$2> the second, and so on - think regular expression
+backreferences. C<$$> is the op returned from this reduction. So, we
+call C<newBINOP> to create a new binary operator. The first parameter to
+C<newBINOP>, a function in F<op.c>, is the op type. It's an addition
+operator, so we want the type to be C<ADDOP>. We could specify this
+directly, but it's right there as the second token in the input, so we
+use C<$2>. The second parameter is the op's flags: 0 means "nothing
+special". Then the things to add: the left and right hand side of our
+expression, in scalar context.
+
+=head2 Stacks
+
+When perl executes something like C<addop>, how does it pass on its
+results to the next op? The answer is, through the use of stacks. Perl
+has a number of stacks to store things it's currently working on, and
+we'll look at the three most important ones here.
+
+=over 3
+
+=item Argument stack
+
+Arguments are passed to PP code and returned from PP code using the
+argument stack, C<ST>. The typical way to handle arguments is to pop
+them off the stack, deal with them how you wish, and then push the result
+back onto the stack. This is how, for instance, the cosine operator
+works:
+
+ NV value;
+ value = POPn;
+ value = Perl_cos(value);
+ XPUSHn(value);
+
+We'll see a more tricky example of this when we consider Perl's macros
+below. C<POPn> gives you the NV (floating point value) of the top SV on
+the stack: the C<$x> in C<cos($x)>. Then we compute the cosine, and push
+the result back as an NV. The C<X> in C<XPUSHn> means that the stack
+should be extended if necessary - it can't be necessary here, because we
+know there's room for one more item on the stack, since we've just
+removed one! The C<XPUSH*> macros at least guarantee safety.
+
+Alternatively, you can fiddle with the stack directly: C<SP> gives you
+the first element in your portion of the stack, and C<TOP*> gives you
+the top SV/IV/NV/etc. on the stack. So, for instance, to do unary
+negation of an integer:
+
+ SETi(-TOPi);
+
+Just set the integer value of the top stack entry to its negation.
+
+Argument stack manipulation in the core is exactly the same as it is in
+XSUBs - see L<perlxstut>, L<perlxs> and L<perlguts> for a longer
+description of the macros used in stack manipulation.
+
+=item Mark stack
+
+I say "your portion of the stack" above because PP code doesn't
+necessarily get the whole stack to itself: if your function calls
+another function, you'll only want to expose the arguments aimed for the
+called function, and not (necessarily) let it get at your own data. The
+way we do this is to have a "virtual" bottom-of-stack, exposed to each
+function. The mark stack keeps bookmarks to locations in the argument
+stack usable by each function. For instance, when dealing with a tied
+variable, (internally, something with "P" magic) Perl has to call
+methods for accesses to the tied variables. However, we need to separate
+the arguments exposed to the method to the argument exposed to the
+original function - the store or fetch or whatever it may be. Here's
+roughly how the tied C<push> is implemented; see C<av_push> in F<av.c>:
+
+ 1 PUSHMARK(SP);
+ 2 EXTEND(SP,2);
+ 3 PUSHs(SvTIED_obj((SV*)av, mg));
+ 4 PUSHs(val);
+ 5 PUTBACK;
+ 6 ENTER;
+ 7 call_method("PUSH", G_SCALAR|G_DISCARD);
+ 8 LEAVE;
+
+Let's examine the whole implementation, for practice:
+
+ 1 PUSHMARK(SP);
+
+Push the current state of the stack pointer onto the mark stack. This is
+so that when we've finished adding items to the argument stack, Perl
+knows how many things we've added recently.
+
+ 2 EXTEND(SP,2);
+ 3 PUSHs(SvTIED_obj((SV*)av, mg));
+ 4 PUSHs(val);
+
+We're going to add two more items onto the argument stack: when you have
+a tied array, the C<PUSH> subroutine receives the object and the value
+to be pushed, and that's exactly what we have here - the tied object,
+retrieved with C<SvTIED_obj>, and the value, the SV C<val>.
+
+ 5 PUTBACK;
+
+Next we tell Perl to update the global stack pointer from our internal
+variable: C<dSP> only gave us a local copy, not a reference to the global.
+
+ 6 ENTER;
+ 7 call_method("PUSH", G_SCALAR|G_DISCARD);
+ 8 LEAVE;
+
+C<ENTER> and C<LEAVE> localise a block of code - they make sure that all
+variables are tidied up, everything that has been localised gets
+its previous value returned, and so on. Think of them as the C<{> and
+C<}> of a Perl block.
+
+To actually do the magic method call, we have to call a subroutine in
+Perl space: C<call_method> takes care of that, and it's described in
+L<perlcall>. We call the C<PUSH> method in scalar context, and we're
+going to discard its return value. The call_method() function
+removes the top element of the mark stack, so there is nothing for
+the caller to clean up.
+
+=item Save stack
+
+C doesn't have a concept of local scope, so perl provides one. We've
+seen that C<ENTER> and C<LEAVE> are used as scoping braces; the save
+stack implements the C equivalent of, for example:
+
+ {
+ local $foo = 42;
+ ...
+ }
+
+See L<perlguts/Localising Changes> for how to use the save stack.
+
+=back
+
+=head2 Millions of Macros
+
+One thing you'll notice about the Perl source is that it's full of
+macros. Some have called the pervasive use of macros the hardest thing
+to understand, others find it adds to clarity. Let's take an example,
+the code which implements the addition operator:
+
+ 1 PP(pp_add)
+ 2 {
+ 3 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
+ 4 {
+ 5 dPOPTOPnnrl_ul;
+ 6 SETn( left + right );
+ 7 RETURN;
+ 8 }
+ 9 }
+
+Every line here (apart from the braces, of course) contains a macro. The
+first line sets up the function declaration as Perl expects for PP code;
+line 3 sets up variable declarations for the argument stack and the
+target, the return value of the operation. Finally, it tries to see if
+the addition operation is overloaded; if so, the appropriate subroutine
+is called.
+
+Line 5 is another variable declaration - all variable declarations start
+with C<d> - which pops from the top of the argument stack two NVs (hence
+C<nn>) and puts them into the variables C<right> and C<left>, hence the
+C<rl>. These are the two operands to the addition operator. Next, we
+call C<SETn> to set the NV of the return value to the result of adding
+the two values. This done, we return - the C<RETURN> macro makes sure
+that our return value is properly handled, and we pass the next operator
+to run back to the main run loop.
+
+Most of these macros are explained in L<perlapi>, and some of the more
+important ones are explained in L<perlxs> as well. Pay special attention
+to L<perlguts/Background and PERL_IMPLICIT_CONTEXT> for information on
+the C<[pad]THX_?> macros.
+
+=head2 The .i Targets
+
+You can expand the macros in a F<foo.c> file by saying
+
+ make foo.i
+
+which will expand the macros using cpp. Don't be scared by the results.
+
+=head1 SOURCE CODE STATIC ANALYSIS
+
+Various tools exist for analysing C source code B<statically>, as
+opposed to B<dynamically>, that is, without executing the code.
+It is possible to detect resource leaks, undefined behaviour, type
+mismatches, portability problems, code paths that would cause illegal
+memory accesses, and other similar problems by just parsing the C code
+and looking at the resulting graph, what does it tell about the
+execution and data flows. As a matter of fact, this is exactly
+how C compilers know to give warnings about dubious code.
+
+=head2 lint, splint
+
+The good old C code quality inspector, C<lint>, is available in
+several platforms, but please be aware that there are several
+different implementations of it by different vendors, which means that
+the flags are not identical across different platforms.
+
+There is a lint variant called C<splint> (Secure Programming Lint)
+available from http://www.splint.org/ that should compile on any
+Unix-like platform.
+
+There are C<lint> and <splint> targets in Makefile, but you may have
+to diddle with the flags (see above).
+
+=head2 Coverity
+
+Coverity (http://www.coverity.com/) is a product similar to lint and
+as a testbed for their product they periodically check several open
+source projects, and they give out accounts to open source developers
+to the defect databases.
+
+=head2 cpd (cut-and-paste detector)
+
+The cpd tool detects cut-and-paste coding. If one instance of the
+cut-and-pasted code changes, all the other spots should probably be
+changed, too. Therefore such code should probably be turned into a
+subroutine or a macro.
+
+cpd (http://pmd.sourceforge.net/cpd.html) is part of the pmd project
+(http://pmd.sourceforge.net/). pmd was originally written for static
+analysis of Java code, but later the cpd part of it was extended to
+parse also C and C++.
+
+Download the pmd-bin-X.Y.zip () from the SourceForge site, extract the
+pmd-X.Y.jar from it, and then run that on source code thusly:
+
+ java -cp pmd-X.Y.jar net.sourceforge.pmd.cpd.CPD --minimum-tokens 100 --files /some/where/src --language c > cpd.txt
+
+You may run into memory limits, in which case you should use the -Xmx option:
+
+ java -Xmx512M ...
+
+=head2 gcc warnings
+
+Though much can be written about the inconsistency and coverage
+problems of gcc warnings (like C<-Wall> not meaning "all the
+warnings", or some common portability problems not being covered by
+C<-Wall>, or C<-ansi> and C<-pedantic> both being a poorly defined
+collection of warnings, and so forth), gcc is still a useful tool in
+keeping our coding nose clean.
+
+The C<-Wall> is by default on.
+
+The C<-ansi> (and its sidekick, C<-pedantic>) would be nice to be on
+always, but unfortunately they are not safe on all platforms, they can
+for example cause fatal conflicts with the system headers (Solaris
+being a prime example). If Configure C<-Dgccansipedantic> is used,
+the C<cflags> frontend selects C<-ansi -pedantic> for the platforms
+where they are known to be safe.
+
+Starting from Perl 5.9.4 the following extra flags are added:
+
+=over 4
+
+=item *
+
+C<-Wendif-labels>
+
+=item *
+
+C<-Wextra>
+
+=item *
+
+C<-Wdeclaration-after-statement>
+
+=back
+
+The following flags would be nice to have but they would first need
+their own Augean stablemaster:
+
+=over 4
+
+=item *
+
+C<-Wpointer-arith>
+
+=item *
+
+C<-Wshadow>
+
+=item *
+
+C<-Wstrict-prototypes>
+
+=back
+
+The C<-Wtraditional> is another example of the annoying tendency of
+gcc to bundle a lot of warnings under one switch -- it would be
+impossible to deploy in practice because it would complain a lot -- but
+it does contain some warnings that would be beneficial to have available
+on their own, such as the warning about string constants inside macros
+containing the macro arguments: this behaved differently pre-ANSI
+than it does in ANSI, and some C compilers are still in transition,
+AIX being an example.
+
+=head2 Warnings of other C compilers
+
+Other C compilers (yes, there B<are> other C compilers than gcc) often
+have their "strict ANSI" or "strict ANSI with some portability extensions"
+modes on, like for example the Sun Workshop has its C<-Xa> mode on
+(though implicitly), or the DEC (these days, HP...) has its C<-std1>
+mode on.
+
+=head2 DEBUGGING
+
+You can compile a special debugging version of Perl, which allows you
+to use the C<-D> option of Perl to tell more about what Perl is doing.
+But sometimes there is no alternative than to dive in with a debugger,
+either to see the stack trace of a core dump (very useful in a bug
+report), or trying to figure out what went wrong before the core dump
+happened, or how did we end up having wrong or unexpected results.
+
+=head2 Poking at Perl
+
+To really poke around with Perl, you'll probably want to build Perl for
+debugging, like this:
+
+ ./Configure -d -D optimize=-g
+ make
+
+C<-g> is a flag to the C compiler to have it produce debugging
+information which will allow us to step through a running program,
+and to see in which C function we are at (without the debugging
+information we might see only the numerical addresses of the functions,
+which is not very helpful).
+
+F<Configure> will also turn on the C<DEBUGGING> compilation symbol which
+enables all the internal debugging code in Perl. There are a whole bunch
+of things you can debug with this: L<perlrun> lists them all, and the
+best way to find out about them is to play about with them. The most
+useful options are probably
+
+ l Context (loop) stack processing
+ t Trace execution
+ o Method and overloading resolution
+ c String/numeric conversions
+
+Some of the functionality of the debugging code can be achieved using XS
+modules.
+
+ -Dr => use re 'debug'
+ -Dx => use O 'Debug'
+
+=head2 Using a source-level debugger
+
+If the debugging output of C<-D> doesn't help you, it's time to step
+through perl's execution with a source-level debugger.
+
+=over 3
+
+=item *
+
+We'll use C<gdb> for our examples here; the principles will apply to
+any debugger (many vendors call their debugger C<dbx>), but check the
+manual of the one you're using.
+
+=back
+
+To fire up the debugger, type
+
+ gdb ./perl
+
+Or if you have a core dump:
+
+ gdb ./perl core
+
+You'll want to do that in your Perl source tree so the debugger can read
+the source code. You should see the copyright message, followed by the
+prompt.
+
+ (gdb)
+
+C<help> will get you into the documentation, but here are the most
+useful commands:
+
+=over 3
+
+=item run [args]
+
+Run the program with the given arguments.
+
+=item break function_name
+
+=item break source.c:xxx
+
+Tells the debugger that we'll want to pause execution when we reach
+either the named function (but see L<perlguts/Internal Functions>!) or the given
+line in the named source file.
+
+=item step
+
+Steps through the program a line at a time.
+
+=item next
+
+Steps through the program a line at a time, without descending into
+functions.
+
+=item continue
+
+Run until the next breakpoint.
+
+=item finish
+
+Run until the end of the current function, then stop again.
+
+=item 'enter'
+
+Just pressing Enter will do the most recent operation again - it's a
+blessing when stepping through miles of source code.
+
+=item print
+
+Execute the given C code and print its results. B<WARNING>: Perl makes
+heavy use of macros, and F<gdb> does not necessarily support macros
+(see later L</"gdb macro support">). You'll have to substitute them
+yourself, or to invoke cpp on the source code files
+(see L</"The .i Targets">)
+So, for instance, you can't say
+
+ print SvPV_nolen(sv)
+
+but you have to say
+
+ print Perl_sv_2pv_nolen(sv)
+
+=back
+
+You may find it helpful to have a "macro dictionary", which you can
+produce by saying C<cpp -dM perl.c | sort>. Even then, F<cpp> won't
+recursively apply those macros for you.
+
+=head2 gdb macro support
+
+Recent versions of F<gdb> have fairly good macro support, but
+in order to use it you'll need to compile perl with macro definitions
+included in the debugging information. Using F<gcc> version 3.1, this
+means configuring with C<-Doptimize=-g3>. Other compilers might use a
+different switch (if they support debugging macros at all).
+
+=head2 Dumping Perl Data Structures
+
+One way to get around this macro hell is to use the dumping functions in
+F<dump.c>; these work a little like an internal
+L<Devel::Peek|Devel::Peek>, but they also cover OPs and other structures
+that you can't get at from Perl. Let's take an example. We'll use the
+C<$a = $b + $c> we used before, but give it a bit of context:
+C<$b = "6XXXX"; $c = 2.3;>. Where's a good place to stop and poke around?
+
+What about C<pp_add>, the function we examined earlier to implement the
+C<+> operator:
+
+ (gdb) break Perl_pp_add
+ Breakpoint 1 at 0x46249f: file pp_hot.c, line 309.
+
+Notice we use C<Perl_pp_add> and not C<pp_add> - see L<perlguts/Internal Functions>.
+With the breakpoint in place, we can run our program:
+
+ (gdb) run -e '$b = "6XXXX"; $c = 2.3; $a = $b + $c'
+
+Lots of junk will go past as gdb reads in the relevant source files and
+libraries, and then:
+
+ Breakpoint 1, Perl_pp_add () at pp_hot.c:309
+ 309 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
+ (gdb) step
+ 311 dPOPTOPnnrl_ul;
+ (gdb)
+
+We looked at this bit of code before, and we said that C<dPOPTOPnnrl_ul>
+arranges for two C<NV>s to be placed into C<left> and C<right> - let's
+slightly expand it:
+
+ #define dPOPTOPnnrl_ul NV right = POPn; \
+ SV *leftsv = TOPs; \
+ NV left = USE_LEFT(leftsv) ? SvNV(leftsv) : 0.0
+
+C<POPn> takes the SV from the top of the stack and obtains its NV either
+directly (if C<SvNOK> is set) or by calling the C<sv_2nv> function.
+C<TOPs> takes the next SV from the top of the stack - yes, C<POPn> uses
+C<TOPs> - but doesn't remove it. We then use C<SvNV> to get the NV from
+C<leftsv> in the same way as before - yes, C<POPn> uses C<SvNV>.
+
+Since we don't have an NV for C<$b>, we'll have to use C<sv_2nv> to
+convert it. If we step again, we'll find ourselves there:
+
+ Perl_sv_2nv (sv=0xa0675d0) at sv.c:1669
+ 1669 if (!sv)
+ (gdb)
+
+We can now use C<Perl_sv_dump> to investigate the SV:
+
+ SV = PV(0xa057cc0) at 0xa0675d0
+ REFCNT = 1
+ FLAGS = (POK,pPOK)
+ PV = 0xa06a510 "6XXXX"\0
+ CUR = 5
+ LEN = 6
+ $1 = void
+
+We know we're going to get C<6> from this, so let's finish the
+subroutine:
+
+ (gdb) finish
+ Run till exit from #0 Perl_sv_2nv (sv=0xa0675d0) at sv.c:1671
+ 0x462669 in Perl_pp_add () at pp_hot.c:311
+ 311 dPOPTOPnnrl_ul;
+
+We can also dump out this op: the current op is always stored in
+C<PL_op>, and we can dump it with C<Perl_op_dump>. This'll give us
+similar output to L<B::Debug|B::Debug>.
+
+ {
+ 13 TYPE = add ===> 14
+ TARG = 1
+ FLAGS = (SCALAR,KIDS)
+ {
+ TYPE = null ===> (12)
+ (was rv2sv)
+ FLAGS = (SCALAR,KIDS)
+ {
+ 11 TYPE = gvsv ===> 12
+ FLAGS = (SCALAR)
+ GV = main::b
+ }
+ }
+
+# finish this later #
+
+=head2 Patching
+
+All right, we've now had a look at how to navigate the Perl sources and
+some things you'll need to know when fiddling with them. Let's now get
+on and create a simple patch. Here's something Larry suggested: if a
+C<U> is the first active format during a C<pack>, (for example,
+C<pack "U3C8", @stuff>) then the resulting string should be treated as
+UTF-8 encoded.
+
+How do we prepare to fix this up? First we locate the code in question -
+the C<pack> happens at runtime, so it's going to be in one of the F<pp>
+files. Sure enough, C<pp_pack> is in F<pp.c>. Since we're going to be
+altering this file, let's copy it to F<pp.c~>.
+
+[Well, it was in F<pp.c> when this tutorial was written. It has now been
+split off with C<pp_unpack> to its own file, F<pp_pack.c>]
+
+Now let's look over C<pp_pack>: we take a pattern into C<pat>, and then
+loop over the pattern, taking each format character in turn into
+C<datum_type>. Then for each possible format character, we swallow up
+the other arguments in the pattern (a field width, an asterisk, and so
+on) and convert the next chunk input into the specified format, adding
+it onto the output SV C<cat>.
+
+How do we know if the C<U> is the first format in the C<pat>? Well, if
+we have a pointer to the start of C<pat> then, if we see a C<U> we can
+test whether we're still at the start of the string. So, here's where
+C<pat> is set up:
+
+ STRLEN fromlen;
+ register char *pat = SvPVx(*++MARK, fromlen);
+ register char *patend = pat + fromlen;
+ register I32 len;
+ I32 datumtype;
+ SV *fromstr;
+
+We'll have another string pointer in there:
+
+ STRLEN fromlen;
+ register char *pat = SvPVx(*++MARK, fromlen);
+ register char *patend = pat + fromlen;
+ + char *patcopy;
+ register I32 len;
+ I32 datumtype;
+ SV *fromstr;
+
+And just before we start the loop, we'll set C<patcopy> to be the start
+of C<pat>:
+
+ items = SP - MARK;
+ MARK++;
+ sv_setpvn(cat, "", 0);
+ + patcopy = pat;
+ while (pat < patend) {
+
+Now if we see a C<U> which was at the start of the string, we turn on
+the C<UTF8> flag for the output SV, C<cat>:
+
+ + if (datumtype == 'U' && pat==patcopy+1)
+ + SvUTF8_on(cat);
+ if (datumtype == '#') {
+ while (pat < patend && *pat != '\n')
+ pat++;
+
+Remember that it has to be C<patcopy+1> because the first character of
+the string is the C<U> which has been swallowed into C<datumtype!>
+
+Oops, we forgot one thing: what if there are spaces at the start of the
+pattern? C<pack(" U*", @stuff)> will have C<U> as the first active
+character, even though it's not the first thing in the pattern. In this
+case, we have to advance C<patcopy> along with C<pat> when we see spaces:
+
+ if (isSPACE(datumtype))
+ continue;
+
+needs to become
+
+ if (isSPACE(datumtype)) {
+ patcopy++;
+ continue;
+ }
+
+OK. That's the C part done. Now we must do two additional things before
+this patch is ready to go: we've changed the behaviour of Perl, and so
+we must document that change. We must also provide some more regression
+tests to make sure our patch works and doesn't create a bug somewhere
+else along the line.
+
+The regression tests for each operator live in F<t/op/>, and so we
+make a copy of F<t/op/pack.t> to F<t/op/pack.t~>. Now we can add our
+tests to the end. First, we'll test that the C<U> does indeed create
+Unicode strings.
+
+t/op/pack.t has a sensible ok() function, but if it didn't we could
+use the one from t/test.pl.
+
+ require './test.pl';
+ plan( tests => 159 );
+
+so instead of this:
+
+ print 'not ' unless "1.20.300.4000" eq sprintf "%vd", pack("U*",1,20,300,4000);
+ print "ok $test\n"; $test++;
+
+we can write the more sensible (see L<Test::More> for a full
+explanation of is() and other testing functions).
+
+ is( "1.20.300.4000", sprintf "%vd", pack("U*",1,20,300,4000),
+ "U* produces Unicode" );
+
+Now we'll test that we got that space-at-the-beginning business right:
+
+ is( "1.20.300.4000", sprintf "%vd", pack(" U*",1,20,300,4000),
+ " with spaces at the beginning" );
+
+And finally we'll test that we don't make Unicode strings if C<U> is B<not>
+the first active format:
+
+ isnt( v1.20.300.4000, sprintf "%vd", pack("C0U*",1,20,300,4000),
+ "U* not first isn't Unicode" );
+
+Mustn't forget to change the number of tests which appears at the top,
+or else the automated tester will get confused. This will either look
+like this:
+
+ print "1..156\n";
+
+or this:
+
+ plan( tests => 156 );
+
+We now compile up Perl, and run it through the test suite. Our new
+tests pass, hooray!
+
+Finally, the documentation. The job is never done until the paperwork is
+over, so let's describe the change we've just made. The relevant place
+is F<pod/perlfunc.pod>; again, we make a copy, and then we'll insert
+this text in the description of C<pack>:
+
+ =item *
+
+ If the pattern begins with a C<U>, the resulting string will be treated
+ as UTF-8-encoded Unicode. You can force UTF-8 encoding on in a string
+ with an initial C<U0>, and the bytes that follow will be interpreted as
+ Unicode characters. If you don't want this to happen, you can begin your
+ pattern with C<C0> (or anything else) to force Perl not to UTF-8 encode your
+ string, and then follow this with a C<U*> somewhere in your pattern.
+
+All done. Now let's create the patch. F<Porting/patching.pod> tells us
+that if we're making major changes, we should copy the entire directory
+to somewhere safe before we begin fiddling, and then do
+
+ diff -ruN old new > patch
+
+However, we know which files we've changed, and we can simply do this:
+
+ diff -u pp.c~ pp.c > patch
+ diff -u t/op/pack.t~ t/op/pack.t >> patch
+ diff -u pod/perlfunc.pod~ pod/perlfunc.pod >> patch
+
+We end up with a patch looking a little like this:
+
+ --- pp.c~ Fri Jun 02 04:34:10 2000
+ +++ pp.c Fri Jun 16 11:37:25 2000
+ @@ -4375,6 +4375,7 @@
+ register I32 items;
+ STRLEN fromlen;
+ register char *pat = SvPVx(*++MARK, fromlen);
+ + char *patcopy;
+ register char *patend = pat + fromlen;
+ register I32 len;
+ I32 datumtype;
+ @@ -4405,6 +4406,7 @@
+ ...
+
+And finally, we submit it, with our rationale, to perl5-porters. Job
+done!
+
+=head2 Patching a core module
+
+This works just like patching anything else, with an extra
+consideration. Many core modules also live on CPAN. If this is so,
+patch the CPAN version instead of the core and send the patch off to
+the module maintainer (with a copy to p5p). This will help the module
+maintainer keep the CPAN version in sync with the core version without
+constantly scanning p5p.
+
+The list of maintainers of core modules is usefully documented in
+F<Porting/Maintainers.pl>.
+
+=head2 Adding a new function to the core
+
+If, as part of a patch to fix a bug, or just because you have an
+especially good idea, you decide to add a new function to the core,
+discuss your ideas on p5p well before you start work. It may be that
+someone else has already attempted to do what you are considering and
+can give lots of good advice or even provide you with bits of code
+that they already started (but never finished).
+
+You have to follow all of the advice given above for patching. It is
+extremely important to test any addition thoroughly and add new tests
+to explore all boundary conditions that your new function is expected
+to handle. If your new function is used only by one module (e.g. toke),
+then it should probably be named S_your_function (for static); on the
+other hand, if you expect it to accessible from other functions in
+Perl, you should name it Perl_your_function. See L<perlguts/Internal Functions>
+for more details.
+
+The location of any new code is also an important consideration. Don't
+just create a new top level .c file and put your code there; you would
+have to make changes to Configure (so the Makefile is created properly),
+as well as possibly lots of include files. This is strictly pumpking
+business.
+
+It is better to add your function to one of the existing top level
+source code files, but your choice is complicated by the nature of
+the Perl distribution. Only the files that are marked as compiled
+static are located in the perl executable. Everything else is located
+in the shared library (or DLL if you are running under WIN32). So,
+for example, if a function was only used by functions located in
+toke.c, then your code can go in toke.c. If, however, you want to call
+the function from universal.c, then you should put your code in another
+location, for example util.c.
+
+In addition to writing your c-code, you will need to create an
+appropriate entry in embed.pl describing your function, then run
+'make regen_headers' to create the entries in the numerous header
+files that perl needs to compile correctly. See L<perlguts/Internal Functions>
+for information on the various options that you can set in embed.pl.
+You will forget to do this a few (or many) times and you will get
+warnings during the compilation phase. Make sure that you mention
+this when you post your patch to P5P; the pumpking needs to know this.
+
+When you write your new code, please be conscious of existing code
+conventions used in the perl source files. See L<perlstyle> for
+details. Although most of the guidelines discussed seem to focus on
+Perl code, rather than c, they all apply (except when they don't ;).
+See also I<Porting/patching.pod> file in the Perl source distribution
+for lots of details about both formatting and submitting patches of
+your changes.
+
+Lastly, TEST TEST TEST TEST TEST any code before posting to p5p.
+Test on as many platforms as you can find. Test as many perl
+Configure options as you can (e.g. MULTIPLICITY). If you have
+profiling or memory tools, see L<EXTERNAL TOOLS FOR DEBUGGING PERL>
+below for how to use them to further test your code. Remember that
+most of the people on P5P are doing this on their own time and
+don't have the time to debug your code.
+
+=head2 Writing a test
+
+Every module and built-in function has an associated test file (or
+should...). If you add or change functionality, you have to write a
+test. If you fix a bug, you have to write a test so that bug never
+comes back. If you alter the docs, it would be nice to test what the
+new documentation says.
+
+In short, if you submit a patch you probably also have to patch the
+tests.
+
+For modules, the test file is right next to the module itself.
+F<lib/strict.t> tests F<lib/strict.pm>. This is a recent innovation,
+so there are some snags (and it would be wonderful for you to brush
+them out), but it basically works that way. Everything else lives in
+F<t/>.
+
+If you add a new test directory under F<t/>, it is imperative that you
+add that directory to F<t/HARNESS> and F<t/TEST>.
+
+=over 3
+
+=item F<t/base/>
+
+Testing of the absolute basic functionality of Perl. Things like
+C<if>, basic file reads and writes, simple regexes, etc. These are
+run first in the test suite and if any of them fail, something is
+I<really> broken.
+
+=item F<t/cmd/>
+
+These test the basic control structures, C<if/else>, C<while>,
+subroutines, etc.
+
+=item F<t/comp/>
+
+Tests basic issues of how Perl parses and compiles itself.
+
+=item F<t/io/>
+
+Tests for built-in IO functions, including command line arguments.
+
+=item F<t/lib/>
+
+The old home for the module tests, you shouldn't put anything new in
+here. There are still some bits and pieces hanging around in here
+that need to be moved. Perhaps you could move them? Thanks!
+
+=item F<t/mro/>
+
+Tests for perl's method resolution order implementations
+(see L<mro>).
+
+=item F<t/op/>
+
+Tests for perl's built in functions that don't fit into any of the
+other directories.
+
+=item F<t/pod/>
+
+Tests for POD directives. There are still some tests for the Pod
+modules hanging around in here that need to be moved out into F<lib/>.
+
+=item F<t/run/>
+
+Testing features of how perl actually runs, including exit codes and
+handling of PERL* environment variables.
+
+=item F<t/uni/>
+
+Tests for the core support of Unicode.
+
+=item F<t/win32/>
+
+Windows-specific tests.
+
+=item F<t/x2p>
+
+A test suite for the s2p converter.
+
+=back
+
+The core uses the same testing style as the rest of Perl, a simple
+"ok/not ok" run through Test::Harness, but there are a few special
+considerations.
+
+There are three ways to write a test in the core. Test::More,
+t/test.pl and ad hoc C<print $test ? "ok 42\n" : "not ok 42\n">. The
+decision of which to use depends on what part of the test suite you're
+working on. This is a measure to prevent a high-level failure (such
+as Config.pm breaking) from causing basic functionality tests to fail.
+
+=over 4
+
+=item t/base t/comp
+
+Since we don't know if require works, or even subroutines, use ad hoc
+tests for these two. Step carefully to avoid using the feature being
+tested.
+
+=item t/cmd t/run t/io t/op
+
+Now that basic require() and subroutines are tested, you can use the
+t/test.pl library which emulates the important features of Test::More
+while using a minimum of core features.
+
+You can also conditionally use certain libraries like Config, but be
+sure to skip the test gracefully if it's not there.
+
+=item t/lib ext lib
+
+Now that the core of Perl is tested, Test::More can be used. You can
+also use the full suite of core modules in the tests.
+
+=back
+
+When you say "make test" Perl uses the F<t/TEST> program to run the
+test suite (except under Win32 where it uses F<t/harness> instead.)
+All tests are run from the F<t/> directory, B<not> the directory
+which contains the test. This causes some problems with the tests
+in F<lib/>, so here's some opportunity for some patching.
+
+You must be triply conscious of cross-platform concerns. This usually
+boils down to using File::Spec and avoiding things like C<fork()> and
+C<system()> unless absolutely necessary.
+
+=head2 Special Make Test Targets
+
+There are various special make targets that can be used to test Perl
+slightly differently than the standard "test" target. Not all them
+are expected to give a 100% success rate. Many of them have several
+aliases, and many of them are not available on certain operating
+systems.
+
+=over 4
+
+=item coretest
+
+Run F<perl> on all core tests (F<t/*> and F<lib/[a-z]*> pragma tests).
+
+(Not available on Win32)
+
+=item test.deparse
+
+Run all the tests through B::Deparse. Not all tests will succeed.
+
+(Not available on Win32)
+
+=item test.taintwarn
+
+Run all tests with the B<-t> command-line switch. Not all tests
+are expected to succeed (until they're specifically fixed, of course).
+
+(Not available on Win32)
+
+=item minitest
+
+Run F<miniperl> on F<t/base>, F<t/comp>, F<t/cmd>, F<t/run>, F<t/io>,
+F<t/op>, F<t/uni> and F<t/mro> tests.
+
+=item test.valgrind check.valgrind utest.valgrind ucheck.valgrind
+
+(Only in Linux) Run all the tests using the memory leak + naughty
+memory access tool "valgrind". The log files will be named
+F<testname.valgrind>.
+
+=item test.third check.third utest.third ucheck.third
+
+(Only in Tru64) Run all the tests using the memory leak + naughty
+memory access tool "Third Degree". The log files will be named
+F<perl.3log.testname>.
+
+=item test.torture torturetest
+
+Run all the usual tests and some extra tests. As of Perl 5.8.0 the
+only extra tests are Abigail's JAPHs, F<t/japh/abigail.t>.
+
+You can also run the torture test with F<t/harness> by giving
+C<-torture> argument to F<t/harness>.
+
+=item utest ucheck test.utf8 check.utf8
+
+Run all the tests with -Mutf8. Not all tests will succeed.
+
+(Not available on Win32)
+
+=item minitest.utf16 test.utf16
+
+Runs the tests with UTF-16 encoded scripts, encoded with different
+versions of this encoding.
+
+C<make utest.utf16> runs the test suite with a combination of C<-utf8> and
+C<-utf16> arguments to F<t/TEST>.
+
+(Not available on Win32)
+
+=item test_harness
+
+Run the test suite with the F<t/harness> controlling program, instead of
+F<t/TEST>. F<t/harness> is more sophisticated, and uses the
+L<Test::Harness> module, thus using this test target supposes that perl
+mostly works. The main advantage for our purposes is that it prints a
+detailed summary of failed tests at the end. Also, unlike F<t/TEST>, it
+doesn't redirect stderr to stdout.
+
+Note that under Win32 F<t/harness> is always used instead of F<t/TEST>, so
+there is no special "test_harness" target.
+
+Under Win32's "test" target you may use the TEST_SWITCHES and TEST_FILES
+environment variables to control the behaviour of F<t/harness>. This means
+you can say
+
+ nmake test TEST_FILES="op/*.t"
+ nmake test TEST_SWITCHES="-torture" TEST_FILES="op/*.t"
+
+=item test-notty test_notty
+
+Sets PERL_SKIP_TTY_TEST to true before running normal test.
+
+=back
+
+=head2 Running tests by hand
+
+You can run part of the test suite by hand by using one the following
+commands from the F<t/> directory :
+
+ ./perl -I../lib TEST list-of-.t-files
+
+or
+
+ ./perl -I../lib harness list-of-.t-files
+
+(if you don't specify test scripts, the whole test suite will be run.)
+
+=head3 Using t/harness for testing
+
+If you use C<harness> for testing you have several command line options
+available to you. The arguments are as follows, and are in the order
+that they must appear if used together.
+
+ harness -v -torture -re=pattern LIST OF FILES TO TEST
+ harness -v -torture -re LIST OF PATTERNS TO MATCH
+
+If C<LIST OF FILES TO TEST> is omitted the file list is obtained from
+the manifest. The file list may include shell wildcards which will be
+expanded out.
+
+=over 4
+
+=item -v
+
+Run the tests under verbose mode so you can see what tests were run,
+and debug output.
+
+=item -torture
+
+Run the torture tests as well as the normal set.
+
+=item -re=PATTERN
+
+Filter the file list so that all the test files run match PATTERN.
+Note that this form is distinct from the B<-re LIST OF PATTERNS> form below
+in that it allows the file list to be provided as well.
+
+=item -re LIST OF PATTERNS
+
+Filter the file list so that all the test files run match
+/(LIST|OF|PATTERNS)/. Note that with this form the patterns
+are joined by '|' and you cannot supply a list of files, instead
+the test files are obtained from the MANIFEST.
+
+=back
+
+You can run an individual test by a command similar to
+
+ ./perl -I../lib patho/to/foo.t
+
+except that the harnesses set up some environment variables that may
+affect the execution of the test :
+
+=over 4
+
+=item PERL_CORE=1
+
+indicates that we're running this test part of the perl core test suite.
+This is useful for modules that have a dual life on CPAN.
+
+=item PERL_DESTRUCT_LEVEL=2
+
+is set to 2 if it isn't set already (see L</PERL_DESTRUCT_LEVEL>)
+
+=item PERL
+
+(used only by F<t/TEST>) if set, overrides the path to the perl executable
+that should be used to run the tests (the default being F<./perl>).
+
+=item PERL_SKIP_TTY_TEST
+
+if set, tells to skip the tests that need a terminal. It's actually set
+automatically by the Makefile, but can also be forced artificially by
+running 'make test_notty'.
+
+=back
+
+=head3 Other environment variables that may influence tests
+
+=over 4
+
+=item PERL_TEST_Net_Ping
+
+Setting this variable runs all the Net::Ping modules tests,
+otherwise some tests that interact with the outside world are skipped.
+See L<perl58delta>.
+
+=item PERL_TEST_NOVREXX
+
+Setting this variable skips the vrexx.t tests for OS2::REXX.
+
+=item PERL_TEST_NUMCONVERTS
+
+This sets a variable in op/numconvert.t.
+
+=back
+
+See also the documentation for the Test and Test::Harness modules,
+for more environment variables that affect testing.
+
+=head2 Common problems when patching Perl source code
+
+Perl source plays by ANSI C89 rules: no C99 (or C++) extensions. In
+some cases we have to take pre-ANSI requirements into consideration.
+You don't care about some particular platform having broken Perl?
+I hear there is still a strong demand for J2EE programmers.
+
+=head2 Perl environment problems
+
+=over 4
+
+=item *
+
+Not compiling with threading
+
+Compiling with threading (-Duseithreads) completely rewrites
+the function prototypes of Perl. You better try your changes
+with that. Related to this is the difference between "Perl_-less"
+and "Perl_-ly" APIs, for example:
+
+ Perl_sv_setiv(aTHX_ ...);
+ sv_setiv(...);
+
+The first one explicitly passes in the context, which is needed for e.g.
+threaded builds. The second one does that implicitly; do not get them
+mixed. If you are not passing in a aTHX_, you will need to do a dTHX
+(or a dVAR) as the first thing in the function.
+
+See L<perlguts/"How multiple interpreters and concurrency are supported">
+for further discussion about context.
+
+=item *
+
+Not compiling with -DDEBUGGING
+
+The DEBUGGING define exposes more code to the compiler,
+therefore more ways for things to go wrong. You should try it.
+
+=item *
+
+Introducing (non-read-only) globals
+
+Do not introduce any modifiable globals, truly global or file static.
+They are bad form and complicate multithreading and other forms of
+concurrency. The right way is to introduce them as new interpreter
+variables, see F<intrpvar.h> (at the very end for binary compatibility).
+
+Introducing read-only (const) globals is okay, as long as you verify
+with e.g. C<nm libperl.a|egrep -v ' [TURtr] '> (if your C<nm> has
+BSD-style output) that the data you added really is read-only.
+(If it is, it shouldn't show up in the output of that command.)
+
+If you want to have static strings, make them constant:
+
+ static const char etc[] = "...";
+
+If you want to have arrays of constant strings, note carefully
+the right combination of C<const>s:
+
+ static const char * const yippee[] =
+ {"hi", "ho", "silver"};
+
+There is a way to completely hide any modifiable globals (they are all
+moved to heap), the compilation setting C<-DPERL_GLOBAL_STRUCT_PRIVATE>.
+It is not normally used, but can be used for testing, read more
+about it in L<perlguts/"Background and PERL_IMPLICIT_CONTEXT">.
+
+=item *
+
+Not exporting your new function
+
+Some platforms (Win32, AIX, VMS, OS/2, to name a few) require any
+function that is part of the public API (the shared Perl library)
+to be explicitly marked as exported. See the discussion about
+F<embed.pl> in L<perlguts>.
+
+=item *
+
+Exporting your new function
+
+The new shiny result of either genuine new functionality or your
+arduous refactoring is now ready and correctly exported. So what
+could possibly go wrong?
+
+Maybe simply that your function did not need to be exported in the
+first place. Perl has a long and not so glorious history of exporting
+functions that it should not have.
+
+If the function is used only inside one source code file, make it
+static. See the discussion about F<embed.pl> in L<perlguts>.
+
+If the function is used across several files, but intended only for
+Perl's internal use (and this should be the common case), do not
+export it to the public API. See the discussion about F<embed.pl>
+in L<perlguts>.
+
+=back
+
+=head2 Portability problems
+
+The following are common causes of compilation and/or execution
+failures, not common to Perl as such. The C FAQ is good bedtime
+reading. Please test your changes with as many C compilers and
+platforms as possible -- we will, anyway, and it's nice to save
+oneself from public embarrassment.
+
+If using gcc, you can add the C<-std=c89> option which will hopefully
+catch most of these unportabilities. (However it might also catch
+incompatibilities in your system's header files.)
+
+Use the Configure C<-Dgccansipedantic> flag to enable the gcc
+C<-ansi -pedantic> flags which enforce stricter ANSI rules.
+
+If using the C<gcc -Wall> note that not all the possible warnings
+(like C<-Wunitialized>) are given unless you also compile with C<-O>.
+
+Note that if using gcc, starting from Perl 5.9.5 the Perl core source
+code files (the ones at the top level of the source code distribution,
+but not e.g. the extensions under ext/) are automatically compiled
+with as many as possible of the C<-std=c89>, C<-ansi>, C<-pedantic>,
+and a selection of C<-W> flags (see cflags.SH).
+
+Also study L<perlport> carefully to avoid any bad assumptions
+about the operating system, filesystems, and so forth.
+
+You may once in a while try a "make microperl" to see whether we
+can still compile Perl with just the bare minimum of interfaces.
+(See README.micro.)
+
+Do not assume an operating system indicates a certain compiler.
+
+=over 4
+
+=item *
+
+Casting pointers to integers or casting integers to pointers
+
+ void castaway(U8* p)
+ {
+ IV i = p;
+
+or
+
+ void castaway(U8* p)
+ {
+ IV i = (IV)p;
+
+Both are bad, and broken, and unportable. Use the PTR2IV()
+macro that does it right. (Likewise, there are PTR2UV(), PTR2NV(),
+INT2PTR(), and NUM2PTR().)
+
+=item *
+
+Casting between data function pointers and data pointers
+
+Technically speaking casting between function pointers and data
+pointers is unportable and undefined, but practically speaking
+it seems to work, but you should use the FPTR2DPTR() and DPTR2FPTR()
+macros. Sometimes you can also play games with unions.
+
+=item *
+
+Assuming sizeof(int) == sizeof(long)
+
+There are platforms where longs are 64 bits, and platforms where ints
+are 64 bits, and while we are out to shock you, even platforms where
+shorts are 64 bits. This is all legal according to the C standard.
+(In other words, "long long" is not a portable way to specify 64 bits,
+and "long long" is not even guaranteed to be any wider than "long".)
+
+Instead, use the definitions IV, UV, IVSIZE, I32SIZE, and so forth.
+Avoid things like I32 because they are B<not> guaranteed to be
+I<exactly> 32 bits, they are I<at least> 32 bits, nor are they
+guaranteed to be B<int> or B<long>. If you really explicitly need
+64-bit variables, use I64 and U64, but only if guarded by HAS_QUAD.
+
+=item *
+
+Assuming one can dereference any type of pointer for any type of data
+
+ char *p = ...;
+ long pony = *p; /* BAD */
+
+Many platforms, quite rightly so, will give you a core dump instead
+of a pony if the p happens not be correctly aligned.
+
+=item *
+
+Lvalue casts
+
+ (int)*p = ...; /* BAD */
+
+Simply not portable. Get your lvalue to be of the right type,
+or maybe use temporary variables, or dirty tricks with unions.
+
+=item *
+
+Assume B<anything> about structs (especially the ones you
+don't control, like the ones coming from the system headers)
+
+=over 8
+
+=item *
+
+That a certain field exists in a struct
+
+=item *
+
+That no other fields exist besides the ones you know of
+
+=item *
+
+That a field is of certain signedness, sizeof, or type
+
+=item *
+
+That the fields are in a certain order
+
+=over 8
+
+=item *
+
+While C guarantees the ordering specified in the struct definition,
+between different platforms the definitions might differ
+
+=back
+
+=item *
+
+That the sizeof(struct) or the alignments are the same everywhere
+
+=over 8
+
+=item *
+
+There might be padding bytes between the fields to align the fields -
+the bytes can be anything
+
+=item *
+
+Structs are required to be aligned to the maximum alignment required
+by the fields - which for native types is for usually equivalent to
+sizeof() of the field
+
+=back
+
+=back
+
+=item *
+
+Assuming the character set is ASCIIish
+
+Perl can compile and run under EBCDIC platforms. See L<perlebcdic>.
+This is transparent for the most part, but because the character sets
+differ, you shouldn't use numeric (decimal, octal, nor hex) constants
+to refer to characters. You can safely say 'A', but not 0x41.
+You can safely say '\n', but not \012.
+If a character doesn't have a trivial input form, you can
+create a #define for it in both C<utfebcdic.h> and C<utf8.h>, so that
+it resolves to different values depending on the character set being used.
+(There are three different EBCDIC character sets defined in C<utfebcdic.h>,
+so it might be best to insert the #define three times in that file.)
+
+Also, the range 'A' - 'Z' in ASCII is an unbroken sequence of 26 upper case
+alphabetic characters. That is not true in EBCDIC. Nor for 'a' to 'z'.
+But '0' - '9' is an unbroken range in both systems. Don't assume anything
+about other ranges.
+
+Many of the comments in the existing code ignore the possibility of EBCDIC,
+and may be wrong therefore, even if the code works.
+This is actually a tribute to the successful transparent insertion of being
+able to handle EBCDIC without having to change pre-existing code.
+
+UTF-8 and UTF-EBCDIC are two different encodings used to represent Unicode
+code points as sequences of bytes. Macros
+with the same names (but different definitions)
+in C<utf8.h> and C<utfebcdic.h>
+are used to allow the calling code to think that there is only one such
+encoding.
+This is almost always referred to as C<utf8>, but it means the EBCDIC version
+as well. Again, comments in the code may well be wrong even if the code itself
+is right.
+For example, the concept of C<invariant characters> differs between ASCII and
+EBCDIC.
+On ASCII platforms, only characters that do not have the high-order
+bit set (i.e. whose ordinals are strict ASCII, 0 - 127)
+are invariant, and the documentation and comments in the code
+may assume that,
+often referring to something like, say, C<hibit>.
+The situation differs and is not so simple on EBCDIC machines, but as long as
+the code itself uses the C<NATIVE_IS_INVARIANT()> macro appropriately, it
+works, even if the comments are wrong.
+
+=item *
+
+Assuming the character set is just ASCII
+
+ASCII is a 7 bit encoding, but bytes have 8 bits in them. The 128 extra
+characters have different meanings depending on the locale. Absent a locale,
+currently these extra characters are generally considered to be unassigned,
+and this has presented some problems.
+This is scheduled to be changed in 5.12 so that these characters will
+be considered to be Latin-1 (ISO-8859-1).
+
+=item *
+
+Mixing #define and #ifdef
+
+ #define BURGLE(x) ... \
+ #ifdef BURGLE_OLD_STYLE /* BAD */
+ ... do it the old way ... \
+ #else
+ ... do it the new way ... \
+ #endif
+
+You cannot portably "stack" cpp directives. For example in the above
+you need two separate BURGLE() #defines, one for each #ifdef branch.
+
+=item *
+
+Adding non-comment stuff after #endif or #else
+
+ #ifdef SNOSH
+ ...
+ #else !SNOSH /* BAD */
+ ...
+ #endif SNOSH /* BAD */
+
+The #endif and #else cannot portably have anything non-comment after
+them. If you want to document what is going (which is a good idea
+especially if the branches are long), use (C) comments:
+
+ #ifdef SNOSH
+ ...
+ #else /* !SNOSH */
+ ...
+ #endif /* SNOSH */
+
+The gcc option C<-Wendif-labels> warns about the bad variant
+(by default on starting from Perl 5.9.4).
+
+=item *
+
+Having a comma after the last element of an enum list
+
+ enum color {
+ CERULEAN,
+ CHARTREUSE,
+ CINNABAR, /* BAD */
+ };
+
+is not portable. Leave out the last comma.
+
+Also note that whether enums are implicitly morphable to ints
+varies between compilers, you might need to (int).
+
+=item *
+
+Using //-comments
+
+ // This function bamfoodles the zorklator. /* BAD */
+
+That is C99 or C++. Perl is C89. Using the //-comments is silently
+allowed by many C compilers but cranking up the ANSI C89 strictness
+(which we like to do) causes the compilation to fail.
+
+=item *
+
+Mixing declarations and code
+
+ void zorklator()
+ {
+ int n = 3;
+ set_zorkmids(n); /* BAD */
+ int q = 4;
+
+That is C99 or C++. Some C compilers allow that, but you shouldn't.
+
+The gcc option C<-Wdeclaration-after-statements> scans for such problems
+(by default on starting from Perl 5.9.4).
+
+=item *
+
+Introducing variables inside for()
+
+ for(int i = ...; ...; ...) { /* BAD */
+
+That is C99 or C++. While it would indeed be awfully nice to have that
+also in C89, to limit the scope of the loop variable, alas, we cannot.
+
+=item *
+
+Mixing signed char pointers with unsigned char pointers
+
+ int foo(char *s) { ... }
+ ...
+ unsigned char *t = ...; /* Or U8* t = ... */
+ foo(t); /* BAD */
+
+While this is legal practice, it is certainly dubious, and downright
+fatal in at least one platform: for example VMS cc considers this a
+fatal error. One cause for people often making this mistake is that a
+"naked char" and therefore dereferencing a "naked char pointer" have
+an undefined signedness: it depends on the compiler and the flags of
+the compiler and the underlying platform whether the result is signed
+or unsigned. For this very same reason using a 'char' as an array
+index is bad.
+
+=item *
+
+Macros that have string constants and their arguments as substrings of
+the string constants
+
+ #define FOO(n) printf("number = %d\n", n) /* BAD */
+ FOO(10);
+
+Pre-ANSI semantics for that was equivalent to
+
+ printf("10umber = %d\10");
+
+which is probably not what you were expecting. Unfortunately at least
+one reasonably common and modern C compiler does "real backward
+compatibility" here, in AIX that is what still happens even though the
+rest of the AIX compiler is very happily C89.
+
+=item *
+
+Using printf formats for non-basic C types
+
+ IV i = ...;
+ printf("i = %d\n", i); /* BAD */
+
+While this might by accident work in some platform (where IV happens
+to be an C<int>), in general it cannot. IV might be something larger.
+Even worse the situation is with more specific types (defined by Perl's
+configuration step in F<config.h>):
+
+ Uid_t who = ...;
+ printf("who = %d\n", who); /* BAD */
+
+The problem here is that Uid_t might be not only not C<int>-wide
+but it might also be unsigned, in which case large uids would be
+printed as negative values.
+
+There is no simple solution to this because of printf()'s limited
+intelligence, but for many types the right format is available as
+with either 'f' or '_f' suffix, for example:
+
+ IVdf /* IV in decimal */
+ UVxf /* UV is hexadecimal */
+
+ printf("i = %"IVdf"\n", i); /* The IVdf is a string constant. */
+
+ Uid_t_f /* Uid_t in decimal */
+
+ printf("who = %"Uid_t_f"\n", who);
+
+Or you can try casting to a "wide enough" type:
+
+ printf("i = %"IVdf"\n", (IV)something_very_small_and_signed);
+
+Also remember that the C<%p> format really does require a void pointer:
+
+ U8* p = ...;
+ printf("p = %p\n", (void*)p);
+
+The gcc option C<-Wformat> scans for such problems.
+
+=item *
+
+Blindly using variadic macros
+
+gcc has had them for a while with its own syntax, and C99 brought
+them with a standardized syntax. Don't use the former, and use
+the latter only if the HAS_C99_VARIADIC_MACROS is defined.
+
+=item *
+
+Blindly passing va_list
+
+Not all platforms support passing va_list to further varargs (stdarg)
+functions. The right thing to do is to copy the va_list using the
+Perl_va_copy() if the NEED_VA_COPY is defined.
+
+=item *
+
+Using gcc statement expressions
+
+ val = ({...;...;...}); /* BAD */
+
+While a nice extension, it's not portable. The Perl code does
+admittedly use them if available to gain some extra speed
+(essentially as a funky form of inlining), but you shouldn't.
+
+=item *
+
+Binding together several statements in a macro
+
+Use the macros STMT_START and STMT_END.
+
+ STMT_START {
+ ...
+ } STMT_END
+
+=item *
+
+Testing for operating systems or versions when should be testing for features
+
+ #ifdef __FOONIX__ /* BAD */
+ foo = quux();
+ #endif
+
+Unless you know with 100% certainty that quux() is only ever available
+for the "Foonix" operating system B<and> that is available B<and>
+correctly working for B<all> past, present, B<and> future versions of
+"Foonix", the above is very wrong. This is more correct (though still
+not perfect, because the below is a compile-time check):
+
+ #ifdef HAS_QUUX
+ foo = quux();
+ #endif
+
+How does the HAS_QUUX become defined where it needs to be? Well, if
+Foonix happens to be UNIXy enough to be able to run the Configure
+script, and Configure has been taught about detecting and testing
+quux(), the HAS_QUUX will be correctly defined. In other platforms,
+the corresponding configuration step will hopefully do the same.
+
+In a pinch, if you cannot wait for Configure to be educated,
+or if you have a good hunch of where quux() might be available,
+you can temporarily try the following:
+
+ #if (defined(__FOONIX__) || defined(__BARNIX__))
+ # define HAS_QUUX
+ #endif
+
+ ...
+
+ #ifdef HAS_QUUX
+ foo = quux();
+ #endif
+
+But in any case, try to keep the features and operating systems separate.
+
+=back
+
+=head2 Problematic System Interfaces
+
+=over 4
+
+=item *
+
+malloc(0), realloc(0), calloc(0, 0) are non-portable. To be portable
+allocate at least one byte. (In general you should rarely need to
+work at this low level, but instead use the various malloc wrappers.)
+
+=item *
+
+snprintf() - the return type is unportable. Use my_snprintf() instead.
+
+=back
+
+=head2 Security problems
+
+Last but not least, here are various tips for safer coding.
+
+=over 4
+
+=item *
+
+Do not use gets()
+
+Or we will publicly ridicule you. Seriously.
+
+=item *
+
+Do not use strcpy() or strcat() or strncpy() or strncat()
+
+Use my_strlcpy() and my_strlcat() instead: they either use the native
+implementation, or Perl's own implementation (borrowed from the public
+domain implementation of INN).
+
+=item *
+
+Do not use sprintf() or vsprintf()
+
+If you really want just plain byte strings, use my_snprintf()
+and my_vsnprintf() instead, which will try to use snprintf() and
+vsnprintf() if those safer APIs are available. If you want something
+fancier than a plain byte string, use SVs and Perl_sv_catpvf().
+
+=back
+
+=head1 EXTERNAL TOOLS FOR DEBUGGING PERL
+
+Sometimes it helps to use external tools while debugging and
+testing Perl. This section tries to guide you through using
+some common testing and debugging tools with Perl. This is
+meant as a guide to interfacing these tools with Perl, not
+as any kind of guide to the use of the tools themselves.
+
+B<NOTE 1>: Running under memory debuggers such as Purify, valgrind, or
+Third Degree greatly slows down the execution: seconds become minutes,
+minutes become hours. For example as of Perl 5.8.1, the
+ext/Encode/t/Unicode.t takes extraordinarily long to complete under
+e.g. Purify, Third Degree, and valgrind. Under valgrind it takes more
+than six hours, even on a snappy computer-- the said test must be
+doing something that is quite unfriendly for memory debuggers. If you
+don't feel like waiting, that you can simply kill away the perl
+process.
+
+B<NOTE 2>: To minimize the number of memory leak false alarms (see
+L</PERL_DESTRUCT_LEVEL> for more information), you have to have
+environment variable PERL_DESTRUCT_LEVEL set to 2. The F<TEST>
+and harness scripts do that automatically. But if you are running
+some of the tests manually-- for csh-like shells:
+
+ setenv PERL_DESTRUCT_LEVEL 2
+
+and for Bourne-type shells:
+
+ PERL_DESTRUCT_LEVEL=2
+ export PERL_DESTRUCT_LEVEL
+
+or in UNIXy environments you can also use the C<env> command:
+
+ env PERL_DESTRUCT_LEVEL=2 valgrind ./perl -Ilib ...
+
+B<NOTE 3>: There are known memory leaks when there are compile-time
+errors within eval or require, seeing C<S_doeval> in the call stack
+is a good sign of these. Fixing these leaks is non-trivial,
+unfortunately, but they must be fixed eventually.
+
+B<NOTE 4>: L<DynaLoader> will not clean up after itself completely
+unless Perl is built with the Configure option
+C<-Accflags=-DDL_UNLOAD_ALL_AT_EXIT>.
+
+=head2 Rational Software's Purify
+
+Purify is a commercial tool that is helpful in identifying
+memory overruns, wild pointers, memory leaks and other such
+badness. Perl must be compiled in a specific way for
+optimal testing with Purify. Purify is available under
+Windows NT, Solaris, HP-UX, SGI, and Siemens Unix.
+
+=head2 Purify on Unix
+
+On Unix, Purify creates a new Perl binary. To get the most
+benefit out of Purify, you should create the perl to Purify
+using:
+
+ sh Configure -Accflags=-DPURIFY -Doptimize='-g' \
+ -Uusemymalloc -Dusemultiplicity
+
+where these arguments mean:
+
+=over 4
+
+=item -Accflags=-DPURIFY
+
+Disables Perl's arena memory allocation functions, as well as
+forcing use of memory allocation functions derived from the
+system malloc.
+
+=item -Doptimize='-g'
+
+Adds debugging information so that you see the exact source
+statements where the problem occurs. Without this flag, all
+you will see is the source filename of where the error occurred.
+
+=item -Uusemymalloc
+
+Disable Perl's malloc so that Purify can more closely monitor
+allocations and leaks. Using Perl's malloc will make Purify
+report most leaks in the "potential" leaks category.
+
+=item -Dusemultiplicity
+
+Enabling the multiplicity option allows perl to clean up
+thoroughly when the interpreter shuts down, which reduces the
+number of bogus leak reports from Purify.
+
+=back
+
+Once you've compiled a perl suitable for Purify'ing, then you
+can just:
+
+ make pureperl
+
+which creates a binary named 'pureperl' that has been Purify'ed.
+This binary is used in place of the standard 'perl' binary
+when you want to debug Perl memory problems.
+
+As an example, to show any memory leaks produced during the
+standard Perl testset you would create and run the Purify'ed
+perl as:
+
+ make pureperl
+ cd t
+ ../pureperl -I../lib harness
+
+which would run Perl on test.pl and report any memory problems.
+
+Purify outputs messages in "Viewer" windows by default. If
+you don't have a windowing environment or if you simply
+want the Purify output to unobtrusively go to a log file
+instead of to the interactive window, use these following
+options to output to the log file "perl.log":
+
+ setenv PURIFYOPTIONS "-chain-length=25 -windows=no \
+ -log-file=perl.log -append-logfile=yes"
+
+If you plan to use the "Viewer" windows, then you only need this option:
+
+ setenv PURIFYOPTIONS "-chain-length=25"
+
+In Bourne-type shells:
+
+ PURIFYOPTIONS="..."
+ export PURIFYOPTIONS
+
+or if you have the "env" utility:
+
+ env PURIFYOPTIONS="..." ../pureperl ...
+
+=head2 Purify on NT
+
+Purify on Windows NT instruments the Perl binary 'perl.exe'
+on the fly. There are several options in the makefile you
+should change to get the most use out of Purify:
+
+=over 4
+
+=item DEFINES
+
+You should add -DPURIFY to the DEFINES line so the DEFINES
+line looks something like:
+
+ DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT $(CRYPT_FLAG) -DPURIFY=1
+
+to disable Perl's arena memory allocation functions, as
+well as to force use of memory allocation functions derived
+from the system malloc.
+
+=item USE_MULTI = define
+
+Enabling the multiplicity option allows perl to clean up
+thoroughly when the interpreter shuts down, which reduces the
+number of bogus leak reports from Purify.
+
+=item #PERL_MALLOC = define
+
+Disable Perl's malloc so that Purify can more closely monitor
+allocations and leaks. Using Perl's malloc will make Purify
+report most leaks in the "potential" leaks category.
+
+=item CFG = Debug
+
+Adds debugging information so that you see the exact source
+statements where the problem occurs. Without this flag, all
+you will see is the source filename of where the error occurred.
+
+=back
+
+As an example, to show any memory leaks produced during the
+standard Perl testset you would create and run Purify as:
+
+ cd win32
+ make
+ cd ../t
+ purify ../perl -I../lib harness
+
+which would instrument Perl in memory, run Perl on test.pl,
+then finally report any memory problems.
+
+=head2 valgrind
+
+The excellent valgrind tool can be used to find out both memory leaks
+and illegal memory accesses. As of version 3.3.0, Valgrind only
+supports Linux on x86, x86-64 and PowerPC. The special "test.valgrind"
+target can be used to run the tests under valgrind. Found errors
+and memory leaks are logged in files named F<testfile.valgrind>.
+
+Valgrind also provides a cachegrind tool, invoked on perl as:
+
+ VG_OPTS=--tool=cachegrind make test.valgrind
+
+As system libraries (most notably glibc) are also triggering errors,
+valgrind allows to suppress such errors using suppression files. The
+default suppression file that comes with valgrind already catches a lot
+of them. Some additional suppressions are defined in F<t/perl.supp>.
+
+To get valgrind and for more information see
+
+ http://developer.kde.org/~sewardj/
+
+=head2 Compaq's/Digital's/HP's Third Degree
+
+Third Degree is a tool for memory leak detection and memory access checks.
+It is one of the many tools in the ATOM toolkit. The toolkit is only
+available on Tru64 (formerly known as Digital UNIX formerly known as
+DEC OSF/1).
+
+When building Perl, you must first run Configure with -Doptimize=-g
+and -Uusemymalloc flags, after that you can use the make targets
+"perl.third" and "test.third". (What is required is that Perl must be
+compiled using the C<-g> flag, you may need to re-Configure.)
+
+The short story is that with "atom" you can instrument the Perl
+executable to create a new executable called F<perl.third>. When the
+instrumented executable is run, it creates a log of dubious memory
+traffic in file called F<perl.3log>. See the manual pages of atom and
+third for more information. The most extensive Third Degree
+documentation is available in the Compaq "Tru64 UNIX Programmer's
+Guide", chapter "Debugging Programs with Third Degree".
+
+The "test.third" leaves a lot of files named F<foo_bar.3log> in the t/
+subdirectory. There is a problem with these files: Third Degree is so
+effective that it finds problems also in the system libraries.
+Therefore you should used the Porting/thirdclean script to cleanup
+the F<*.3log> files.
+
+There are also leaks that for given certain definition of a leak,
+aren't. See L</PERL_DESTRUCT_LEVEL> for more information.
+
+=head2 PERL_DESTRUCT_LEVEL
+
+If you want to run any of the tests yourself manually using e.g.
+valgrind, or the pureperl or perl.third executables, please note that
+by default perl B<does not> explicitly cleanup all the memory it has
+allocated (such as global memory arenas) but instead lets the exit()
+of the whole program "take care" of such allocations, also known as
+"global destruction of objects".
+
+There is a way to tell perl to do complete cleanup: set the
+environment variable PERL_DESTRUCT_LEVEL to a non-zero value.
+The t/TEST wrapper does set this to 2, and this is what you
+need to do too, if you don't want to see the "global leaks":
+For example, for "third-degreed" Perl:
+
+ env PERL_DESTRUCT_LEVEL=2 ./perl.third -Ilib t/foo/bar.t
+
+(Note: the mod_perl apache module uses also this environment variable
+for its own purposes and extended its semantics. Refer to the mod_perl
+documentation for more information. Also, spawned threads do the
+equivalent of setting this variable to the value 1.)
+
+If, at the end of a run you get the message I<N scalars leaked>, you can
+recompile with C<-DDEBUG_LEAKING_SCALARS>, which will cause the addresses
+of all those leaked SVs to be dumped along with details as to where each
+SV was originally allocated. This information is also displayed by
+Devel::Peek. Note that the extra details recorded with each SV increases
+memory usage, so it shouldn't be used in production environments. It also
+converts C<new_SV()> from a macro into a real function, so you can use
+your favourite debugger to discover where those pesky SVs were allocated.
+
+If you see that you're leaking memory at runtime, but neither valgrind
+nor C<-DDEBUG_LEAKING_SCALARS> will find anything, you're probably
+leaking SVs that are still reachable and will be properly cleaned up
+during destruction of the interpreter. In such cases, using the C<-Dm>
+switch can point you to the source of the leak. If the executable was
+built with C<-DDEBUG_LEAKING_SCALARS>, C<-Dm> will output SV allocations
+in addition to memory allocations. Each SV allocation has a distinct
+serial number that will be written on creation and destruction of the SV.
+So if you're executing the leaking code in a loop, you need to look for
+SVs that are created, but never destroyed between each cycle. If such an
+SV is found, set a conditional breakpoint within C<new_SV()> and make it
+break only when C<PL_sv_serial> is equal to the serial number of the
+leaking SV. Then you will catch the interpreter in exactly the state
+where the leaking SV is allocated, which is sufficient in many cases to
+find the source of the leak.
+
+As C<-Dm> is using the PerlIO layer for output, it will by itself
+allocate quite a bunch of SVs, which are hidden to avoid recursion.
+You can bypass the PerlIO layer if you use the SV logging provided
+by C<-DPERL_MEM_LOG> instead.
+
+=head2 PERL_MEM_LOG
+
+If compiled with C<-DPERL_MEM_LOG>, all Newx() and Renew() allocations
+and Safefree() in the Perl core go through logging functions, which is
+handy for breakpoint setting. If also compiled with C<-DPERL_MEM_LOG_STDERR>,
+the allocations and frees are logged to STDERR (or more precisely, to the
+file descriptor 2) in these logging functions, with the calling source code
+file and line number (and C function name, if supported by the C compiler).
+
+This logging is somewhat similar to C<-Dm> but independent of C<-DDEBUGGING>,
+and at a higher level (the C<-Dm> is directly at the point of C<malloc()>,
+while the C<PERL_MEM_LOG> is at the level of C<New()>).
+
+In addition to memory allocations, SV allocations will be logged, just as
+with C<-Dm>. However, since the logging doesn't use PerlIO, all SV allocations
+are logged and no extra SV allocations are introduced by enabling the logging.
+If compiled with C<-DDEBUG_LEAKING_SCALARS>, the serial number for each SV
+allocation is also logged.
+
+You can control the logging from your environment if you compile with
+C<-DPERL_MEM_LOG_ENV>. Then you need to explicitly set C<PERL_MEM_LOG> and/or
+C<PERL_SV_LOG> to a non-zero value to enable logging of memory and/or SV
+allocations.
+
+=head2 Profiling
+
+Depending on your platform there are various of profiling Perl.
+
+There are two commonly used techniques of profiling executables:
+I<statistical time-sampling> and I<basic-block counting>.
+
+The first method takes periodically samples of the CPU program
+counter, and since the program counter can be correlated with the code
+generated for functions, we get a statistical view of in which
+functions the program is spending its time. The caveats are that very
+small/fast functions have lower probability of showing up in the
+profile, and that periodically interrupting the program (this is
+usually done rather frequently, in the scale of milliseconds) imposes
+an additional overhead that may skew the results. The first problem
+can be alleviated by running the code for longer (in general this is a
+good idea for profiling), the second problem is usually kept in guard
+by the profiling tools themselves.
+
+The second method divides up the generated code into I<basic blocks>.
+Basic blocks are sections of code that are entered only in the
+beginning and exited only at the end. For example, a conditional jump
+starts a basic block. Basic block profiling usually works by
+I<instrumenting> the code by adding I<enter basic block #nnnn>
+book-keeping code to the generated code. During the execution of the
+code the basic block counters are then updated appropriately. The
+caveat is that the added extra code can skew the results: again, the
+profiling tools usually try to factor their own effects out of the
+results.
+
+=head2 Gprof Profiling
+
+gprof is a profiling tool available in many UNIX platforms,
+it uses F<statistical time-sampling>.
+
+You can build a profiled version of perl called "perl.gprof" by
+invoking the make target "perl.gprof" (What is required is that Perl
+must be compiled using the C<-pg> flag, you may need to re-Configure).
+Running the profiled version of Perl will create an output file called
+F<gmon.out> is created which contains the profiling data collected
+during the execution.
+
+The gprof tool can then display the collected data in various ways.
+Usually gprof understands the following options:
+
+=over 4
+
+=item -a
+
+Suppress statically defined functions from the profile.
+
+=item -b
+
+Suppress the verbose descriptions in the profile.
+
+=item -e routine
+
+Exclude the given routine and its descendants from the profile.
+
+=item -f routine
+
+Display only the given routine and its descendants in the profile.
+
+=item -s
+
+Generate a summary file called F<gmon.sum> which then may be given
+to subsequent gprof runs to accumulate data over several runs.
+
+=item -z
+
+Display routines that have zero usage.
+
+=back
+
+For more detailed explanation of the available commands and output
+formats, see your own local documentation of gprof.
+
+quick hint:
+
+ $ sh Configure -des -Dusedevel -Doptimize='-g' -Accflags='-pg' -Aldflags='-pg' && make
+ $ ./perl someprog # creates gmon.out in current directory
+ $ gprof perl > out
+ $ view out
+
+=head2 GCC gcov Profiling
+
+Starting from GCC 3.0 I<basic block profiling> is officially available
+for the GNU CC.
+
+You can build a profiled version of perl called F<perl.gcov> by
+invoking the make target "perl.gcov" (what is required that Perl must
+be compiled using gcc with the flags C<-fprofile-arcs
+-ftest-coverage>, you may need to re-Configure).
+
+Running the profiled version of Perl will cause profile output to be
+generated. For each source file an accompanying ".da" file will be
+created.
+
+To display the results you use the "gcov" utility (which should
+be installed if you have gcc 3.0 or newer installed). F<gcov> is
+run on source code files, like this
+
+ gcov sv.c
+
+which will cause F<sv.c.gcov> to be created. The F<.gcov> files
+contain the source code annotated with relative frequencies of
+execution indicated by "#" markers.
+
+Useful options of F<gcov> include C<-b> which will summarise the
+basic block, branch, and function call coverage, and C<-c> which
+instead of relative frequencies will use the actual counts. For
+more information on the use of F<gcov> and basic block profiling
+with gcc, see the latest GNU CC manual, as of GCC 3.0 see
+
+ http://gcc.gnu.org/onlinedocs/gcc-3.0/gcc.html
+
+and its section titled "8. gcov: a Test Coverage Program"
+
+ http://gcc.gnu.org/onlinedocs/gcc-3.0/gcc_8.html#SEC132
+
+quick hint:
+
+ $ sh Configure -des -Doptimize='-g' -Accflags='-fprofile-arcs -ftest-coverage' \
+ -Aldflags='-fprofile-arcs -ftest-coverage' && make perl.gcov
+ $ rm -f regexec.c.gcov regexec.gcda
+ $ ./perl.gcov
+ $ gcov regexec.c
+ $ view regexec.c.gcov
+
+=head2 Pixie Profiling
+
+Pixie is a profiling tool available on IRIX and Tru64 (aka Digital
+UNIX aka DEC OSF/1) platforms. Pixie does its profiling using
+I<basic-block counting>.
+
+You can build a profiled version of perl called F<perl.pixie> by
+invoking the make target "perl.pixie" (what is required is that Perl
+must be compiled using the C<-g> flag, you may need to re-Configure).
+
+In Tru64 a file called F<perl.Addrs> will also be silently created,
+this file contains the addresses of the basic blocks. Running the
+profiled version of Perl will create a new file called "perl.Counts"
+which contains the counts for the basic block for that particular
+program execution.
+
+To display the results you use the F<prof> utility. The exact
+incantation depends on your operating system, "prof perl.Counts" in
+IRIX, and "prof -pixie -all -L. perl" in Tru64.
+
+In IRIX the following prof options are available:
+
+=over 4
+
+=item -h
+
+Reports the most heavily used lines in descending order of use.
+Useful for finding the hotspot lines.
+
+=item -l
+
+Groups lines by procedure, with procedures sorted in descending order of use.
+Within a procedure, lines are listed in source order.
+Useful for finding the hotspots of procedures.
+
+=back
+
+In Tru64 the following options are available:
+
+=over 4
+
+=item -p[rocedures]
+
+Procedures sorted in descending order by the number of cycles executed
+in each procedure. Useful for finding the hotspot procedures.
+(This is the default option.)
+
+=item -h[eavy]
+
+Lines sorted in descending order by the number of cycles executed in
+each line. Useful for finding the hotspot lines.
+
+=item -i[nvocations]
+
+The called procedures are sorted in descending order by number of calls
+made to the procedures. Useful for finding the most used procedures.
+
+=item -l[ines]
+
+Grouped by procedure, sorted by cycles executed per procedure.
+Useful for finding the hotspots of procedures.
+
+=item -testcoverage
+
+The compiler emitted code for these lines, but the code was unexecuted.
+
+=item -z[ero]
+
+Unexecuted procedures.
+
+=back
+
+For further information, see your system's manual pages for pixie and prof.
+
+=head2 Miscellaneous tricks
+
+=over 4
+
+=item *
+
+Those debugging perl with the DDD frontend over gdb may find the
+following useful:
+
+You can extend the data conversion shortcuts menu, so for example you
+can display an SV's IV value with one click, without doing any typing.
+To do that simply edit ~/.ddd/init file and add after:
+
+ ! Display shortcuts.
+ Ddd*gdbDisplayShortcuts: \
+ /t () // Convert to Bin\n\
+ /d () // Convert to Dec\n\
+ /x () // Convert to Hex\n\
+ /o () // Convert to Oct(\n\
+
+the following two lines:
+
+ ((XPV*) (())->sv_any )->xpv_pv // 2pvx\n\
+ ((XPVIV*) (())->sv_any )->xiv_iv // 2ivx
+
+so now you can do ivx and pvx lookups or you can plug there the
+sv_peek "conversion":
+
+ Perl_sv_peek(my_perl, (SV*)()) // sv_peek
+
+(The my_perl is for threaded builds.)
+Just remember that every line, but the last one, should end with \n\
+
+Alternatively edit the init file interactively via:
+3rd mouse button -> New Display -> Edit Menu
+
+Note: you can define up to 20 conversion shortcuts in the gdb
+section.
+
+=item *
+
+If you see in a debugger a memory area mysteriously full of 0xABABABAB
+or 0xEFEFEFEF, you may be seeing the effect of the Poison() macros,
+see L<perlclib>.
+
+=item *
+
+Under ithreads the optree is read only. If you want to enforce this, to check
+for write accesses from buggy code, compile with C<-DPL_OP_SLAB_ALLOC> to
+enable the OP slab allocator and C<-DPERL_DEBUG_READONLY_OPS> to enable code
+that allocates op memory via C<mmap>, and sets it read-only at run time.
+Any write access to an op results in a C<SIGBUS> and abort.
+
+This code is intended for development only, and may not be portable even to
+all Unix variants. Also, it is an 80% solution, in that it isn't able to make
+all ops read only. Specifically it
+
+=over
+
+=item 1
+
+Only sets read-only on all slabs of ops at C<CHECK> time, hence ops allocated
+later via C<require> or C<eval> will be re-write
+
+=item 2
+
+Turns an entire slab of ops read-write if the refcount of any op in the slab
+needs to be decreased.
+
+=item 3
+
+Turns an entire slab of ops read-write if any op from the slab is freed.
+
+=back
+
+It's not possible to turn the slabs to read-only after an action requiring
+read-write access, as either can happen during op tree building time, so
+there may still be legitimate write access.
+
+However, as an 80% solution it is still effective, as currently it catches
+a write access during the generation of F<Config.pm>, which means that we
+can't yet build F<perl> with this enabled.
+
+=back
+
+
+=head1 CONCLUSION
+
+We've had a brief look around the Perl source, how to maintain quality
+of the source code, an overview of the stages F<perl> goes through
+when it's running your code, how to use debuggers to poke at the Perl
+guts, and finally how to analyse the execution of Perl. We took a very
+simple problem and demonstrated how to solve it fully - with
+documentation, regression tests, and finally a patch for submission to
+p5p. Finally, we talked about how to use external tools to debug and
+test Perl.
+
+I'd now suggest you read over those references again, and then, as soon
+as possible, get your hands dirty. The best way to learn is by doing,
+so:
+
+=over 3
+
+=item *
+
+Subscribe to perl5-porters, follow the patches and try and understand
+them; don't be afraid to ask if there's a portion you're not clear on -
+who knows, you may unearth a bug in the patch...
+
+=item *
+
+Keep up to date with the bleeding edge Perl distributions and get
+familiar with the changes. Try and get an idea of what areas people are
+working on and the changes they're making.
+
+=item *
+
+Do read the README associated with your operating system, e.g. README.aix
+on the IBM AIX OS. Don't hesitate to supply patches to that README if
+you find anything missing or changed over a new OS release.
+
+=item *
+
+Find an area of Perl that seems interesting to you, and see if you can
+work out how it works. Scan through the source, and step over it in the
+debugger. Play, poke, investigate, fiddle! You'll probably get to
+understand not just your chosen area but a much wider range of F<perl>'s
+activity as well, and probably sooner than you'd think.
+
+=back
+
+=over 3
+
+=item I<The Road goes ever on and on, down from the door where it began.>
+
+=back
+
+If you can do these things, you've started on the long road to Perl porting.
+Thanks for wanting to help make Perl better - and happy hacking!
+
+=head2 Metaphoric Quotations
+
+If you recognized the quote about the Road above, you're in luck.
+
+Most software projects begin each file with a literal description of each
+file's purpose. Perl instead begins each with a literary allusion to that
+file's purpose.
+
+Like chapters in many books, all top-level Perl source files (along with a
+few others here and there) begin with an epigramic inscription that alludes,
+indirectly and metaphorically, to the material you're about to read.
+
+Quotations are taken from writings of J.R.R Tolkien pertaining to his
+Legendarium, almost always from I<The Lord of the Rings>. Chapters and
+page numbers are given using the following editions:
+
+=over 4
+
+=item *
+
+I<The Hobbit>, by J.R.R. Tolkien. The hardcover, 70th-anniversary
+edition of 2007 was used, published in the UK by Harper Collins Publishers
+and in the US by the Houghton Mifflin Company.
+
+=item *
+
+I<The Lord of the Rings>, by J.R.R. Tolkien. The hardcover,
+50th-anniversary edition of 2004 was used, published in the UK by Harper
+Collins Publishers and in the US by the Houghton Mifflin Company.
+
+=item *
+
+I<The Lays of Beleriand>, by J.R.R. Tolkien and published posthumously by his
+son and literary executor, C.J.R. Tolkien, being the 3rd of the 12 volumes
+in Christopher's mammoth I<History of Middle Earth>. Page numbers derive
+from the hardcover edition, first published in 1983 by George Allen &
+Unwin; no page numbers changed for the special 3-volume omnibus edition of
+2002 or the various trade-paper editions, all again now by Harper Collins
+or Houghton Mifflin.
+
+=back
+
+Other JRRT books fair game for quotes would thus include I<The Adventures of
+Tom Bombadil>, I<The Silmarillion>, I<Unfinished Tales>, and I<The Tale of
+the Children of Hurin>, all but the first posthumously assembled by CJRT.
+But I<The Lord of the Rings> itself is perfectly fine and probably best to
+quote from, provided you can find a suitable quote there.
+
+So if you were to supply a new, complete, top-level source file to add to
+Perl, you should conform to this peculiar practice by yourself selecting an
+appropriate quotation from Tolkien, retaining the original spelling and
+punctuation and using the same format the rest of the quotes are in.
+Indirect and oblique is just fine; remember, it's a metaphor, so being meta
+is, after all, what it's for.
+
+=head1 AUTHOR
+
+This document was written by Nathan Torkington, and is maintained by
+the perl5-porters mailing list.
+
+=head1 SEE ALSO
+
+L<perlrepository>
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlhaiku.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlhaiku.pod
new file mode 100755
index 00000000000..c0441bc003b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlhaiku.pod
@@ -0,0 +1,64 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.haiku - Perl version 5.10+ on Haiku
+
+=head1 DESCRIPTION
+
+This file contains instructions how to build Perl for Haiku and lists
+known problems.
+
+=head1 BUILD AND INSTALL
+
+The build procedure is completely standard:
+
+ ./Configure -de
+ make
+ make install
+
+Make perl executable and create a symlink for libperl:
+
+ chmod a+x /boot/common/bin/perl
+ cd /boot/common/lib; ln -s perl5/5.10.1/BePC-haiku/CORE/libperl.so .
+
+Replace C<5.10.1> with your respective version of Perl.
+
+=head1 KNOWN PROBLEMS
+
+The following problems are encountered with Haiku revision 28311:
+
+=over 4
+
+=item *
+
+Perl cannot be compiled with threading support ATM.
+
+=item *
+
+The C<ext/Socket/t/socketpair.t> test fails. More precisely: the subtests
+using datagram sockets fail. Unix datagram sockets aren't implemented in
+Haiku yet.
+
+=item *
+
+A subtest of the C<ext/Sys/Syslog/t/syslog.t> test fails. This is due to Haiku
+not implementing C</dev/log> support yet.
+
+=item *
+
+The tests C<lib/Net/Ping/t/450_service.t> and C<lib/Net/Ping/t/510_ping_udp.t>
+fail. This is due to bugs in Haiku's network stack implementation.
+
+=back
+
+=head1 CONTACT
+
+For Haiku specific problems contact the HaikuPorts developers:
+http://ports.haiku-files.org/
+
+The initial Haiku port was done by Ingo Weinhold <ingo_weinhold@gmx.de>.
+
+Last update: 2008-10-29
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlhist.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlhist.pod
new file mode 100755
index 00000000000..9512fd01935
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlhist.pod
@@ -0,0 +1,860 @@
+=head1 NAME
+
+perlhist - the Perl history records
+
+=head1 DESCRIPTION
+
+This document aims to record the Perl source code releases.
+
+=head1 INTRODUCTION
+
+Perl history in brief, by Larry Wall:
+
+ Perl 0 introduced Perl to my officemates.
+ Perl 1 introduced Perl to the world, and changed /\(...\|...\)/ to
+ /(...|...)/. \(Dan Faigin still hasn't forgiven me. :-\)
+ Perl 2 introduced Henry Spencer's regular expression package.
+ Perl 3 introduced the ability to handle binary data (embedded nulls).
+ Perl 4 introduced the first Camel book. Really. We mostly just
+ switched version numbers so the book could refer to 4.000.
+ Perl 5 introduced everything else, including the ability to
+ introduce everything else.
+
+=head1 THE KEEPERS OF THE PUMPKIN
+
+Larry Wall, Andy Dougherty, Tom Christiansen, Charles Bailey, Nick
+Ing-Simmons, Chip Salzenberg, Tim Bunce, Malcolm Beattie, Gurusamy
+Sarathy, Graham Barr, Jarkko Hietaniemi, Hugo van der Sanden,
+Michael Schwern, Rafael Garcia-Suarez, Nicholas Clark, Richard Clamp,
+Leon Brocard, Dave Mitchell.
+
+=head2 PUMPKIN?
+
+[from Porting/pumpkin.pod in the Perl source code distribution]
+
+Chip Salzenberg gets credit for that, with a nod to his cow orker,
+David Croy. We had passed around various names (baton, token, hot
+potato) but none caught on. Then, Chip asked:
+
+[begin quote]
+
+ Who has the patch pumpkin?
+
+To explain: David Croy once told me once that at a previous job,
+there was one tape drive and multiple systems that used it for backups.
+But instead of some high-tech exclusion software, they used a low-tech
+method to prevent multiple simultaneous backups: a stuffed pumpkin.
+No one was allowed to make backups unless they had the "backup pumpkin".
+
+[end quote]
+
+The name has stuck. The holder of the pumpkin is sometimes called
+the pumpking (keeping the source afloat?) or the pumpkineer (pulling
+the strings?).
+
+=head1 THE RECORDS
+
+ Pump- Release Date Notes
+ king (by no means
+ comprehensive,
+ see Changes*
+ for details)
+ ======================================================================
+
+ Larry 0 Classified. Don't ask.
+
+ Larry 1.000 1987-Dec-18
+
+ 1.001..10 1988-Jan-30
+ 1.011..14 1988-Feb-02
+ Schwern 1.0.15 2002-Dec-18 Modernization
+ Richard 1.0.16 2003-Dec-18
+
+ Larry 2.000 1988-Jun-05
+
+ 2.001 1988-Jun-28
+
+ Larry 3.000 1989-Oct-18
+
+ 3.001 1989-Oct-26
+ 3.002..4 1989-Nov-11
+ 3.005 1989-Nov-18
+ 3.006..8 1989-Dec-22
+ 3.009..13 1990-Mar-02
+ 3.014 1990-Mar-13
+ 3.015 1990-Mar-14
+ 3.016..18 1990-Mar-28
+ 3.019..27 1990-Aug-10 User subs.
+ 3.028 1990-Aug-14
+ 3.029..36 1990-Oct-17
+ 3.037 1990-Oct-20
+ 3.040 1990-Nov-10
+ 3.041 1990-Nov-13
+ 3.042..43 1991-Jan-??
+ 3.044 1991-Jan-12
+
+ Larry 4.000 1991-Mar-21
+
+ 4.001..3 1991-Apr-12
+ 4.004..9 1991-Jun-07
+ 4.010 1991-Jun-10
+ 4.011..18 1991-Nov-05
+ 4.019 1991-Nov-11 Stable.
+ 4.020..33 1992-Jun-08
+ 4.034 1992-Jun-11
+ 4.035 1992-Jun-23
+ Larry 4.036 1993-Feb-05 Very stable.
+
+ 5.000alpha1 1993-Jul-31
+ 5.000alpha2 1993-Aug-16
+ 5.000alpha3 1993-Oct-10
+ 5.000alpha4 1993-???-??
+ 5.000alpha5 1993-???-??
+ 5.000alpha6 1994-Mar-18
+ 5.000alpha7 1994-Mar-25
+ Andy 5.000alpha8 1994-Apr-04
+ Larry 5.000alpha9 1994-May-05 ext appears.
+ 5.000alpha10 1994-Jun-11
+ 5.000alpha11 1994-Jul-01
+ Andy 5.000a11a 1994-Jul-07 To fit 14.
+ 5.000a11b 1994-Jul-14
+ 5.000a11c 1994-Jul-19
+ 5.000a11d 1994-Jul-22
+ Larry 5.000alpha12 1994-Aug-04
+ Andy 5.000a12a 1994-Aug-08
+ 5.000a12b 1994-Aug-15
+ 5.000a12c 1994-Aug-22
+ 5.000a12d 1994-Aug-22
+ 5.000a12e 1994-Aug-22
+ 5.000a12f 1994-Aug-24
+ 5.000a12g 1994-Aug-24
+ 5.000a12h 1994-Aug-24
+ Larry 5.000beta1 1994-Aug-30
+ Andy 5.000b1a 1994-Sep-06
+ Larry 5.000beta2 1994-Sep-14 Core slushified.
+ Andy 5.000b2a 1994-Sep-14
+ 5.000b2b 1994-Sep-17
+ 5.000b2c 1994-Sep-17
+ Larry 5.000beta3 1994-Sep-??
+ Andy 5.000b3a 1994-Sep-18
+ 5.000b3b 1994-Sep-22
+ 5.000b3c 1994-Sep-23
+ 5.000b3d 1994-Sep-27
+ 5.000b3e 1994-Sep-28
+ 5.000b3f 1994-Sep-30
+ 5.000b3g 1994-Oct-04
+ Andy 5.000b3h 1994-Oct-07
+ Larry? 5.000gamma 1994-Oct-13?
+
+ Larry 5.000 1994-Oct-17
+
+ Andy 5.000a 1994-Dec-19
+ 5.000b 1995-Jan-18
+ 5.000c 1995-Jan-18
+ 5.000d 1995-Jan-18
+ 5.000e 1995-Jan-18
+ 5.000f 1995-Jan-18
+ 5.000g 1995-Jan-18
+ 5.000h 1995-Jan-18
+ 5.000i 1995-Jan-26
+ 5.000j 1995-Feb-07
+ 5.000k 1995-Feb-11
+ 5.000l 1995-Feb-21
+ 5.000m 1995-Feb-28
+ 5.000n 1995-Mar-07
+ 5.000o 1995-Mar-13?
+
+ Larry 5.001 1995-Mar-13
+
+ Andy 5.001a 1995-Mar-15
+ 5.001b 1995-Mar-31
+ 5.001c 1995-Apr-07
+ 5.001d 1995-Apr-14
+ 5.001e 1995-Apr-18 Stable.
+ 5.001f 1995-May-31
+ 5.001g 1995-May-25
+ 5.001h 1995-May-25
+ 5.001i 1995-May-30
+ 5.001j 1995-Jun-05
+ 5.001k 1995-Jun-06
+ 5.001l 1995-Jun-06 Stable.
+ 5.001m 1995-Jul-02 Very stable.
+ 5.001n 1995-Oct-31 Very unstable.
+ 5.002beta1 1995-Nov-21
+ 5.002b1a 1995-Dec-04
+ 5.002b1b 1995-Dec-04
+ 5.002b1c 1995-Dec-04
+ 5.002b1d 1995-Dec-04
+ 5.002b1e 1995-Dec-08
+ 5.002b1f 1995-Dec-08
+ Tom 5.002b1g 1995-Dec-21 Doc release.
+ Andy 5.002b1h 1996-Jan-05
+ 5.002b2 1996-Jan-14
+ Larry 5.002b3 1996-Feb-02
+ Andy 5.002gamma 1996-Feb-11
+ Larry 5.002delta 1996-Feb-27
+
+ Larry 5.002 1996-Feb-29 Prototypes.
+
+ Charles 5.002_01 1996-Mar-25
+
+ 5.003 1996-Jun-25 Security release.
+
+ 5.003_01 1996-Jul-31
+ Nick 5.003_02 1996-Aug-10
+ Andy 5.003_03 1996-Aug-28
+ 5.003_04 1996-Sep-02
+ 5.003_05 1996-Sep-12
+ 5.003_06 1996-Oct-07
+ 5.003_07 1996-Oct-10
+ Chip 5.003_08 1996-Nov-19
+ 5.003_09 1996-Nov-26
+ 5.003_10 1996-Nov-29
+ 5.003_11 1996-Dec-06
+ 5.003_12 1996-Dec-19
+ 5.003_13 1996-Dec-20
+ 5.003_14 1996-Dec-23
+ 5.003_15 1996-Dec-23
+ 5.003_16 1996-Dec-24
+ 5.003_17 1996-Dec-27
+ 5.003_18 1996-Dec-31
+ 5.003_19 1997-Jan-04
+ 5.003_20 1997-Jan-07
+ 5.003_21 1997-Jan-15
+ 5.003_22 1997-Jan-16
+ 5.003_23 1997-Jan-25
+ 5.003_24 1997-Jan-29
+ 5.003_25 1997-Feb-04
+ 5.003_26 1997-Feb-10
+ 5.003_27 1997-Feb-18
+ 5.003_28 1997-Feb-21
+ 5.003_90 1997-Feb-25 Ramping up to the 5.004 release.
+ 5.003_91 1997-Mar-01
+ 5.003_92 1997-Mar-06
+ 5.003_93 1997-Mar-10
+ 5.003_94 1997-Mar-22
+ 5.003_95 1997-Mar-25
+ 5.003_96 1997-Apr-01
+ 5.003_97 1997-Apr-03 Fairly widely used.
+ 5.003_97a 1997-Apr-05
+ 5.003_97b 1997-Apr-08
+ 5.003_97c 1997-Apr-10
+ 5.003_97d 1997-Apr-13
+ 5.003_97e 1997-Apr-15
+ 5.003_97f 1997-Apr-17
+ 5.003_97g 1997-Apr-18
+ 5.003_97h 1997-Apr-24
+ 5.003_97i 1997-Apr-25
+ 5.003_97j 1997-Apr-28
+ 5.003_98 1997-Apr-30
+ 5.003_99 1997-May-01
+ 5.003_99a 1997-May-09
+ p54rc1 1997-May-12 Release Candidates.
+ p54rc2 1997-May-14
+
+ Chip 5.004 1997-May-15 A major maintenance release.
+
+ Tim 5.004_01-t1 1997-???-?? The 5.004 maintenance track.
+ 5.004_01-t2 1997-Jun-11 aka perl5.004m1t2
+ 5.004_01 1997-Jun-13
+ 5.004_01_01 1997-Jul-29 aka perl5.004m2t1
+ 5.004_01_02 1997-Aug-01 aka perl5.004m2t2
+ 5.004_01_03 1997-Aug-05 aka perl5.004m2t3
+ 5.004_02 1997-Aug-07
+ 5.004_02_01 1997-Aug-12 aka perl5.004m3t1
+ 5.004_03-t2 1997-Aug-13 aka perl5.004m3t2
+ 5.004_03 1997-Sep-05
+ 5.004_04-t1 1997-Sep-19 aka perl5.004m4t1
+ 5.004_04-t2 1997-Sep-23 aka perl5.004m4t2
+ 5.004_04-t3 1997-Oct-10 aka perl5.004m4t3
+ 5.004_04-t4 1997-Oct-14 aka perl5.004m4t4
+ 5.004_04 1997-Oct-15
+ 5.004_04-m1 1998-Mar-04 (5.004m5t1) Maint. trials for 5.004_05.
+ 5.004_04-m2 1998-May-01
+ 5.004_04-m3 1998-May-15
+ 5.004_04-m4 1998-May-19
+ 5.004_05-MT5 1998-Jul-21
+ 5.004_05-MT6 1998-Oct-09
+ 5.004_05-MT7 1998-Nov-22
+ 5.004_05-MT8 1998-Dec-03
+ Chip 5.004_05-MT9 1999-Apr-26
+ 5.004_05 1999-Apr-29
+
+ Malcolm 5.004_50 1997-Sep-09 The 5.005 development track.
+ 5.004_51 1997-Oct-02
+ 5.004_52 1997-Oct-15
+ 5.004_53 1997-Oct-16
+ 5.004_54 1997-Nov-14
+ 5.004_55 1997-Nov-25
+ 5.004_56 1997-Dec-18
+ 5.004_57 1998-Feb-03
+ 5.004_58 1998-Feb-06
+ 5.004_59 1998-Feb-13
+ 5.004_60 1998-Feb-20
+ 5.004_61 1998-Feb-27
+ 5.004_62 1998-Mar-06
+ 5.004_63 1998-Mar-17
+ 5.004_64 1998-Apr-03
+ 5.004_65 1998-May-15
+ 5.004_66 1998-May-29
+ Sarathy 5.004_67 1998-Jun-15
+ 5.004_68 1998-Jun-23
+ 5.004_69 1998-Jun-29
+ 5.004_70 1998-Jul-06
+ 5.004_71 1998-Jul-09
+ 5.004_72 1998-Jul-12
+ 5.004_73 1998-Jul-13
+ 5.004_74 1998-Jul-14 5.005 beta candidate.
+ 5.004_75 1998-Jul-15 5.005 beta1.
+ 5.004_76 1998-Jul-21 5.005 beta2.
+ 5.005 1998-Jul-22 Oneperl.
+
+ Sarathy 5.005_01 1998-Jul-27 The 5.005 maintenance track.
+ 5.005_02-T1 1998-Aug-02
+ 5.005_02-T2 1998-Aug-05
+ 5.005_02 1998-Aug-08
+ Graham 5.005_03-MT1 1998-Nov-30
+ 5.005_03-MT2 1999-Jan-04
+ 5.005_03-MT3 1999-Jan-17
+ 5.005_03-MT4 1999-Jan-26
+ 5.005_03-MT5 1999-Jan-28
+ 5.005_03-MT6 1999-Mar-05
+ 5.005_03 1999-Mar-28
+ Leon 5.005_04-RC1 2004-Feb-05
+ 5.005_04-RC2 2004-Feb-18
+ 5.005_04 2004-Feb-23
+
+ Sarathy 5.005_50 1998-Jul-26 The 5.6 development track.
+ 5.005_51 1998-Aug-10
+ 5.005_52 1998-Sep-25
+ 5.005_53 1998-Oct-31
+ 5.005_54 1998-Nov-30
+ 5.005_55 1999-Feb-16
+ 5.005_56 1999-Mar-01
+ 5.005_57 1999-May-25
+ 5.005_58 1999-Jul-27
+ 5.005_59 1999-Aug-02
+ 5.005_60 1999-Aug-02
+ 5.005_61 1999-Aug-20
+ 5.005_62 1999-Oct-15
+ 5.005_63 1999-Dec-09
+ 5.5.640 2000-Feb-02
+ 5.5.650 2000-Feb-08 beta1
+ 5.5.660 2000-Feb-22 beta2
+ 5.5.670 2000-Feb-29 beta3
+ 5.6.0-RC1 2000-Mar-09 Release candidate 1.
+ 5.6.0-RC2 2000-Mar-14 Release candidate 2.
+ 5.6.0-RC3 2000-Mar-21 Release candidate 3.
+ 5.6.0 2000-Mar-22
+
+ Sarathy 5.6.1-TRIAL1 2000-Dec-18 The 5.6 maintenance track.
+ 5.6.1-TRIAL2 2001-Jan-31
+ 5.6.1-TRIAL3 2001-Mar-19
+ 5.6.1-foolish 2001-Apr-01 The "fools-gold" release.
+ 5.6.1 2001-Apr-08
+ Rafael 5.6.2-RC1 2003-Nov-08
+ 5.6.2 2003-Nov-15 Fix new build issues
+
+ Jarkko 5.7.0 2000-Sep-02 The 5.7 track: Development.
+ 5.7.1 2001-Apr-09
+ 5.7.2 2001-Jul-13 Virtual release candidate 0.
+ 5.7.3 2002-Mar-05
+ 5.8.0-RC1 2002-Jun-01
+ 5.8.0-RC2 2002-Jun-21
+ 5.8.0-RC3 2002-Jul-13
+ 5.8.0 2002-Jul-18
+ 5.8.1-RC1 2003-Jul-10
+ 5.8.1-RC2 2003-Jul-11
+ 5.8.1-RC3 2003-Jul-30
+ 5.8.1-RC4 2003-Aug-01
+ 5.8.1-RC5 2003-Sep-22
+ 5.8.1 2003-Sep-25
+ Nicholas 5.8.2-RC1 2003-Oct-27
+ 5.8.2-RC2 2003-Nov-03
+ 5.8.2 2003-Nov-05
+ 5.8.3-RC1 2004-Jan-07
+ 5.8.3 2004-Jan-14
+ 5.8.4-RC1 2004-Apr-05
+ 5.8.4-RC2 2004-Apr-15
+ 5.8.4 2004-Apr-21
+ 5.8.5-RC1 2004-Jul-06
+ 5.8.5-RC2 2004-Jul-08
+ 5.8.5 2004-Jul-19
+ 5.8.6-RC1 2004-Nov-11
+ 5.8.6 2004-Nov-27
+ 5.8.7-RC1 2005-May-18
+ 5.8.7 2005-May-30
+ 5.8.8-RC1 2006-Jan-20
+ 5.8.8 2006-Jan-31
+ 5.8.9-RC1 2008-Nov-10
+ 5.8.9-RC2 2008-Dec-06
+ 5.8.9 2008-Dec-14
+
+ Hugo 5.9.0 2003-Oct-27
+ Rafael 5.9.1 2004-Mar-16
+ 5.9.2 2005-Apr-01
+ 5.9.3 2006-Jan-28
+ 5.9.4 2006-Aug-15
+ 5.9.5 2007-Jul-07
+ 5.10.0-RC1 2007-Nov-17
+ 5.10.0-RC2 2007-Nov-25
+ 5.10.0 2007-Dec-18
+ David 5.10.1-RC1 2009-Aug-06
+ 5.10.1-RC2 2009-Aug-18
+ 5.10.1 2009-Aug-22
+
+=head2 SELECTED RELEASE SIZES
+
+For example the notation "core: 212 29" in the release 1.000 means that
+it had in the core 212 kilobytes, in 29 files. The "core".."doc" are
+explained below.
+
+ release core lib ext t doc
+ ======================================================================
+
+ 1.000 212 29 - - - - 38 51 62 3
+ 1.014 219 29 - - - - 39 52 68 4
+ 2.000 309 31 2 3 - - 55 57 92 4
+ 2.001 312 31 2 3 - - 55 57 94 4
+ 3.000 508 36 24 11 - - 79 73 156 5
+ 3.044 645 37 61 20 - - 90 74 190 6
+ 4.000 635 37 59 20 - - 91 75 198 4
+ 4.019 680 37 85 29 - - 98 76 199 4
+ 4.036 709 37 89 30 - - 98 76 208 5
+ 5.000alpha2 785 50 114 32 - - 112 86 209 5
+ 5.000alpha3 801 50 117 33 - - 121 87 209 5
+ 5.000alpha9 1022 56 149 43 116 29 125 90 217 6
+ 5.000a12h 978 49 140 49 205 46 152 97 228 9
+ 5.000b3h 1035 53 232 70 216 38 162 94 218 21
+ 5.000 1038 53 250 76 216 38 154 92 536 62
+ 5.001m 1071 54 388 82 240 38 159 95 544 29
+ 5.002 1121 54 661 101 287 43 155 94 847 35
+ 5.003 1129 54 680 102 291 43 166 100 853 35
+ 5.003_07 1231 60 748 106 396 53 213 137 976 39
+ 5.004 1351 60 1230 136 408 51 355 161 1587 55
+ 5.004_01 1356 60 1258 138 410 51 358 161 1587 55
+ 5.004_04 1375 60 1294 139 413 51 394 162 1629 55
+ 5.004_05 1463 60 1435 150 394 50 445 175 1855 59
+ 5.004_51 1401 61 1260 140 413 53 358 162 1594 56
+ 5.004_53 1422 62 1295 141 438 70 394 162 1637 56
+ 5.004_56 1501 66 1301 140 447 74 408 165 1648 57
+ 5.004_59 1555 72 1317 142 448 74 424 171 1678 58
+ 5.004_62 1602 77 1327 144 629 92 428 173 1674 58
+ 5.004_65 1626 77 1358 146 615 92 446 179 1698 60
+ 5.004_68 1856 74 1382 152 619 92 463 187 1784 60
+ 5.004_70 1863 75 1456 154 675 92 494 194 1809 60
+ 5.004_73 1874 76 1467 152 762 102 506 196 1883 61
+ 5.004_75 1877 76 1467 152 770 103 508 196 1896 62
+ 5.005 1896 76 1469 152 795 103 509 197 1945 63
+ 5.005_03 1936 77 1541 153 813 104 551 201 2176 72
+ 5.005_50 1969 78 1842 301 795 103 514 198 1948 63
+ 5.005_53 1999 79 1885 303 806 104 602 224 2002 67
+ 5.005_56 2086 79 1970 307 866 113 672 238 2221 75
+ 5.6.0 2820 79 2626 364 1096 129 863 280 2840 93
+ 5.6.1 2946 78 2921 430 1171 132 1024 304 3330 102
+ 5.6.2 2947 78 3143 451 1247 127 1303 387 3406 102
+ 5.7.0 2977 80 2801 425 1250 132 975 307 3206 100
+ 5.7.1 3351 84 3442 455 1944 167 1334 357 3698 124
+ 5.7.2 3491 87 4858 618 3290 298 1598 449 3910 139
+ 5.7.3 3299 85 4295 537 2196 300 2176 626 4171 120
+ 5.8.0 3489 87 4533 585 2437 331 2588 726 4368 125
+ 5.8.1 3674 90 5104 623 2604 353 2983 836 4625 134
+ 5.8.2 3633 90 5111 623 2623 357 3019 848 4634 135
+ 5.8.3 3625 90 5141 624 2660 363 3083 869 4669 136
+ 5.8.4 3653 90 5170 634 2684 368 3148 885 4689 137
+ 5.8.5 3664 90 4260 303 2707 369 3208 898 4689 138
+ 5.8.6 3690 90 4271 303 3141 396 3411 925 4709 139
+ 5.8.7 3788 90 4322 307 3297 401 3485 964 4744 141
+ 5.8.8 3895 90 4357 314 3409 431 3622 1017 4979 144
+ 5.8.9 4132 93 5508 330 3826 529 4364 1234 5348 152
+ 5.9.0 3657 90 4951 626 2603 354 3011 841 4609 135
+ 5.9.1 3580 90 5196 634 2665 367 3186 889 4725 138
+ 5.9.2 3863 90 4654 312 3283 403 3551 973 4800 142
+ 5.9.3 4096 91 5318 381 4806 597 4272 1214 5139 147
+ 5.9.4 4393 94 5718 415 4578 642 4646 1310 5335 153
+ 5.9.5 4681 96 6849 479 4827 671 5155 1490 5572 159
+ 5.10.0 4710 97 7050 486 4899 673 5275 1503 5673 160
+
+The "core"..."doc" mean the following files from the Perl source code
+distribution. The glob notation ** means recursively, (.) means
+regular files.
+
+ core *.[hcy]
+ lib lib/**/*.p[ml]
+ ext ext/**/*.{[hcyt],xs,pm}
+ t t/**/*(.) (for 1-5.005_56) or **/*.t (for 5.6.0-5.7.3)
+ doc {README*,INSTALL,*[_.]man{,.?},pod/**/*.pod}
+
+Here are some statistics for the other subdirectories and one file in
+the Perl source distribution for somewhat more selected releases.
+
+ ======================================================================
+ Legend: kB #
+
+ 1.014 2.001 3.044
+
+ Configure 31 1 37 1 62 1
+ eg - - 34 28 47 39
+ h2pl - - - - 12 12
+ msdos - - - - 41 13
+ os2 - - - - 63 22
+ usub - - - - 21 16
+ x2p 103 17 104 17 137 17
+
+ ======================================================================
+
+ 4.000 4.019 4.036
+
+ atarist - - - - 113 31
+ Configure 73 1 83 1 86 1
+ eg 47 39 47 39 47 39
+ emacs 67 4 67 4 67 4
+ h2pl 12 12 12 12 12 12
+ hints - - 5 42 11 56
+ msdos 57 15 58 15 60 15
+ os2 81 29 81 29 113 31
+ usub 25 7 43 8 43 8
+ x2p 147 18 152 19 154 19
+
+ ======================================================================
+
+ 5.000a2 5.000a12h 5.000b3h 5.000 5.001m
+
+ apollo 8 3 8 3 8 3 8 3 8 3
+ atarist 113 31 113 31 - - - - - -
+ bench - - 0 1 - - - - - -
+ Bugs 2 5 26 1 - - - - - -
+ dlperl 40 5 - - - - - - - -
+ do 127 71 - - - - - - - -
+ Configure - - 153 1 159 1 160 1 180 1
+ Doc - - 26 1 75 7 11 1 11 1
+ eg 79 58 53 44 51 43 54 44 54 44
+ emacs 67 4 104 6 104 6 104 1 104 6
+ h2pl 12 12 12 12 12 12 12 12 12 12
+ hints 11 56 12 46 18 48 18 48 44 56
+ msdos 60 15 60 15 - - - - - -
+ os2 113 31 113 31 - - - - - -
+ U - - 62 8 112 42 - - - -
+ usub 43 8 - - - - - - - -
+ vms - - 80 7 123 9 184 15 304 20
+ x2p 171 22 171 21 162 20 162 20 279 20
+
+ ======================================================================
+
+ 5.002 5.003 5.003_07
+
+ Configure 201 1 201 1 217 1
+ eg 54 44 54 44 54 44
+ emacs 108 1 108 1 143 1
+ h2pl 12 12 12 12 12 12
+ hints 73 59 77 60 90 62
+ os2 84 17 56 10 117 42
+ plan9 - - - - 79 15
+ Porting - - - - 51 1
+ utils 87 7 88 7 97 7
+ vms 500 24 475 26 505 27
+ x2p 280 20 280 20 280 19
+
+ ======================================================================
+
+ 5.004 5.004_04 5.004_62 5.004_65 5.004_68
+
+ beos - - - - - - 1 1 1 1
+ Configure 225 1 225 1 240 1 248 1 256 1
+ cygwin32 23 5 23 5 23 5 24 5 24 5
+ djgpp - - - - 14 5 14 5 14 5
+ eg 81 62 81 62 81 62 81 62 81 62
+ emacs 194 1 204 1 212 2 212 2 212 2
+ h2pl 12 12 12 12 12 12 12 12 12 12
+ hints 129 69 132 71 144 72 151 74 155 74
+ os2 121 42 127 42 127 44 129 44 129 44
+ plan9 82 15 82 15 82 15 82 15 82 15
+ Porting 94 2 109 4 203 6 234 8 241 9
+ qnx 1 2 1 2 1 2 1 2 1 2
+ utils 112 8 118 8 124 8 156 9 159 9
+ vms 518 34 524 34 538 34 569 34 569 34
+ win32 285 33 378 36 470 39 493 39 575 41
+ x2p 281 19 281 19 281 19 282 19 281 19
+
+ ======================================================================
+
+ 5.004_70 5.004_73 5.004_75 5.005 5.005_03
+
+ apollo - - - - - - - - 0 1
+ beos 1 1 1 1 1 1 1 1 1 1
+ Configure 256 1 256 1 264 1 264 1 270 1
+ cygwin32 24 5 24 5 24 5 24 5 24 5
+ djgpp 14 5 14 5 14 5 14 5 15 5
+ eg 86 65 86 65 86 65 86 65 86 65
+ emacs 262 2 262 2 262 2 262 2 274 2
+ h2pl 12 12 12 12 12 12 12 12 12 12
+ hints 157 74 157 74 159 74 160 74 179 77
+ mint - - - - - - - - 4 7
+ mpeix - - - - 5 3 5 3 5 3
+ os2 129 44 139 44 142 44 143 44 148 44
+ plan9 82 15 82 15 82 15 82 15 82 15
+ Porting 241 9 253 9 259 10 264 12 272 13
+ qnx 1 2 1 2 1 2 1 2 1 2
+ utils 160 9 160 9 160 9 160 9 164 9
+ vms 570 34 572 34 573 34 575 34 583 34
+ vos - - - - - - - - 156 10
+ win32 577 41 585 41 585 41 587 41 600 42
+ x2p 281 19 281 19 281 19 281 19 281 19
+
+ ======================================================================
+
+ 5.6.0 5.6.1 5.6.2 5.7.3
+
+ apollo 8 3 8 3 8 3 8 3
+ beos 5 2 5 2 5 2 6 4
+ Configure 346 1 361 1 363 1 394 1
+ Cross - - - - - - 4 2
+ djgpp 19 6 19 6 19 6 21 7
+ eg 112 71 112 71 112 71 - -
+ emacs 303 4 319 4 319 4 319 4
+ epoc 29 8 35 8 35 8 36 8
+ h2pl 24 15 24 15 24 15 24 15
+ hints 242 83 250 84 321 89 272 87
+ mint 11 9 11 9 11 9 11 9
+ mpeix 9 4 9 4 9 4 9 4
+ NetWare - - - - - - 423 57
+ os2 214 59 224 60 224 60 357 66
+ plan9 92 17 92 17 92 17 85 15
+ Porting 361 15 390 16 390 16 425 21
+ qnx 5 3 5 3 5 3 5 3
+ utils 228 12 221 11 222 11 267 13
+ uts - - - - - - 12 3
+ vmesa 25 4 25 4 25 4 25 4
+ vms 686 38 627 38 627 38 649 36
+ vos 227 12 249 15 248 15 281 17
+ win32 755 41 782 42 801 42 1006 50
+ x2p 307 20 307 20 307 20 345 20
+
+ ======================================================================
+
+ 5.8.0 5.8.1 5.8.2 5.8.3 5.8.4
+
+ apollo 8 3 8 3 8 3 8 3 8 3
+ beos 6 4 6 4 6 4 6 4 6 4
+ Configure 472 1 493 1 493 1 493 1 494 1
+ Cross 4 2 45 10 45 10 45 10 45 10
+ djgpp 21 7 21 7 21 7 21 7 21 7
+ emacs 319 4 329 4 329 4 329 4 329 4
+ epoc 33 8 33 8 33 8 33 8 33 8
+ h2pl 24 15 24 15 24 15 24 15 24 15
+ hints 294 88 321 89 321 89 321 89 348 91
+ mint 11 9 11 9 11 9 11 9 11 9
+ mpeix 24 5 25 5 25 5 25 5 25 5
+ NetWare 488 61 490 61 490 61 490 61 488 61
+ os2 361 66 445 67 450 67 488 67 488 67
+ plan9 85 15 325 17 325 17 325 17 321 17
+ Porting 479 22 537 32 538 32 539 32 538 33
+ qnx 5 3 5 3 5 3 5 3 5 3
+ utils 275 15 258 16 258 16 263 19 263 19
+ uts 12 3 12 3 12 3 12 3 12 3
+ vmesa 25 4 25 4 25 4 25 4 25 4
+ vms 648 36 654 36 654 36 656 36 656 36
+ vos 330 20 335 20 335 20 335 20 335 20
+ win32 1062 49 1125 49 1127 49 1126 49 1181 56
+ x2p 347 20 348 20 348 20 348 20 348 20
+
+ ======================================================================
+
+ 5.8.5 5.8.6 5.8.7 5.8.8 5.8.9
+
+ apollo 8 3 8 3 8 3 8 3 8 3
+ beos 6 4 6 4 8 4 8 4 8 4
+ Configure 494 1 494 1 495 1 506 1 520 1
+ Cross 45 10 45 10 45 10 45 10 46 10
+ djgpp 21 7 21 7 21 7 21 7 21 7
+ emacs 329 4 329 4 329 4 329 4 406 4
+ epoc 33 8 33 8 33 8 34 8 35 8
+ h2pl 24 15 24 15 24 15 24 15 24 15
+ hints 350 91 352 91 355 94 360 94 387 99
+ mint 11 9 11 9 11 9 11 9 11 9
+ mpeix 25 5 25 5 25 5 49 6 49 6
+ NetWare 488 61 488 61 488 61 490 61 491 61
+ os2 488 67 488 67 488 67 488 67 552 70
+ plan9 321 17 321 17 321 17 322 17 324 17
+ Porting 538 34 548 35 549 35 564 37 625 41
+ qnx 5 3 5 3 5 3 5 3 5 3
+ utils 265 19 265 19 266 19 267 19 281 21
+ uts 12 3 12 3 12 3 12 3 12 3
+ vmesa 25 4 25 4 25 4 25 4 25 4
+ vms 657 36 658 36 662 36 664 36 716 35
+ vos 335 20 335 20 335 20 336 21 345 22
+ win32 1183 56 1190 56 1199 56 1219 56 1484 68
+ x2p 349 20 349 20 349 20 349 19 350 19
+
+ ======================================================================
+
+ 5.9.0 5.9.1 5.9.2 5.9.3 5.9.4
+
+ apollo 8 3 8 3 8 3 8 3 8 3
+ beos 6 4 6 4 8 4 8 4 8 4
+ Configure 493 1 493 1 495 1 508 1 512 1
+ Cross 45 10 45 10 45 10 45 10 46 10
+ djgpp 21 7 21 7 21 7 21 7 21 7
+ emacs 329 4 329 4 329 4 329 4 329 4
+ epoc 33 8 33 8 33 8 34 8 34 8
+ h2pl 24 15 24 15 24 15 24 15 24 15
+ hints 321 89 346 91 355 94 359 94 366 96
+ mad - - - - - - - - 174 6
+ mint 11 9 11 9 11 9 11 9 11 9
+ mpeix 25 5 25 5 25 5 49 6 49 6
+ NetWare 489 61 487 61 487 61 489 61 489 61
+ os2 444 67 488 67 488 67 488 67 488 67
+ plan9 325 17 321 17 321 17 322 17 323 17
+ Porting 537 32 536 33 549 36 564 38 576 38
+ qnx 5 3 5 3 5 3 5 3 5 3
+ symbian - - - - - - 293 53 293 53
+ utils 258 16 263 19 268 20 273 23 275 24
+ uts 12 3 12 3 12 3 12 3 12 3
+ vmesa 25 4 25 4 25 4 25 4 25 4
+ vms 660 36 547 33 553 33 661 33 696 33
+ vos 11 7 11 7 11 7 11 7 11 7
+ win32 1120 49 1124 51 1191 56 1209 56 1719 90
+ x2p 348 20 348 20 349 20 349 19 349 19
+
+ ======================================================================
+
+ 5.9.5 5.10.0
+
+ apollo 8 3 8 3
+ beos 8 4 8 4
+ Configure 518 1 518 1
+ Cross 122 15 122 15
+ djgpp 21 7 21 7
+ emacs 329 4 406 4
+ epoc 34 8 35 8
+ h2pl 24 15 24 15
+ hints 377 98 381 98
+ mad 182 8 182 8
+ mint 11 9 11 9
+ mpeix 49 6 49 6
+ NetWare 489 61 489 61
+ os2 552 70 552 70
+ plan9 324 17 324 17
+ Porting 627 40 632 40
+ qnx 5 3 5 4
+ symbian 300 54 300 54
+ utils 260 26 264 27
+ uts 12 3 12 3
+ vmesa 25 4 25 4
+ vms 690 32 722 32
+ vos 19 8 19 8
+ win32 1482 68 1485 68
+ x2p 349 19 349 19
+
+=head2 SELECTED PATCH SIZES
+
+The "diff lines kB" means that for example the patch 5.003_08, to be
+applied on top of the 5.003_07 (or whatever was before the 5.003_08)
+added lines for 110 kilobytes, it removed lines for 19 kilobytes, and
+changed lines for 424 kilobytes. Just the lines themselves are
+counted, not their context. The "+ - !" become from the diff(1)
+context diff output format.
+
+ Pump- Release Date diff lines kB
+ king -------------
+ + - !
+ ======================================================================
+
+ Chip 5.003_08 1996-Nov-19 110 19 424
+ 5.003_09 1996-Nov-26 38 9 248
+ 5.003_10 1996-Nov-29 29 2 27
+ 5.003_11 1996-Dec-06 73 12 165
+ 5.003_12 1996-Dec-19 275 6 436
+ 5.003_13 1996-Dec-20 95 1 56
+ 5.003_14 1996-Dec-23 23 7 333
+ 5.003_15 1996-Dec-23 0 0 1
+ 5.003_16 1996-Dec-24 12 3 50
+ 5.003_17 1996-Dec-27 19 1 14
+ 5.003_18 1996-Dec-31 21 1 32
+ 5.003_19 1997-Jan-04 80 3 85
+ 5.003_20 1997-Jan-07 18 1 146
+ 5.003_21 1997-Jan-15 38 10 221
+ 5.003_22 1997-Jan-16 4 0 18
+ 5.003_23 1997-Jan-25 71 15 119
+ 5.003_24 1997-Jan-29 426 1 20
+ 5.003_25 1997-Feb-04 21 8 169
+ 5.003_26 1997-Feb-10 16 1 15
+ 5.003_27 1997-Feb-18 32 10 38
+ 5.003_28 1997-Feb-21 58 4 66
+ 5.003_90 1997-Feb-25 22 2 34
+ 5.003_91 1997-Mar-01 37 1 39
+ 5.003_92 1997-Mar-06 16 3 69
+ 5.003_93 1997-Mar-10 12 3 15
+ 5.003_94 1997-Mar-22 407 7 200
+ 5.003_95 1997-Mar-25 41 1 37
+ 5.003_96 1997-Apr-01 283 5 261
+ 5.003_97 1997-Apr-03 13 2 34
+ 5.003_97a 1997-Apr-05 57 1 27
+ 5.003_97b 1997-Apr-08 14 1 20
+ 5.003_97c 1997-Apr-10 20 1 16
+ 5.003_97d 1997-Apr-13 8 0 16
+ 5.003_97e 1997-Apr-15 15 4 46
+ 5.003_97f 1997-Apr-17 7 1 33
+ 5.003_97g 1997-Apr-18 6 1 42
+ 5.003_97h 1997-Apr-24 23 3 68
+ 5.003_97i 1997-Apr-25 23 1 31
+ 5.003_97j 1997-Apr-28 36 1 49
+ 5.003_98 1997-Apr-30 171 12 539
+ 5.003_99 1997-May-01 6 0 7
+ 5.003_99a 1997-May-09 36 2 61
+ p54rc1 1997-May-12 8 1 11
+ p54rc2 1997-May-14 6 0 40
+
+ 5.004 1997-May-15 4 0 4
+
+ Tim 5.004_01 1997-Jun-13 222 14 57
+ 5.004_02 1997-Aug-07 112 16 119
+ 5.004_03 1997-Sep-05 109 0 17
+ 5.004_04 1997-Oct-15 66 8 173
+
+=head3 The patch-free era
+
+In more modern times, named releases don't come as often, and as progress
+can be followed (nearly) instantly (with rsync, and since late 2008, git)
+patches between versions are no longer provided. However, that doesn't
+keep us from calculating how large a patch could have been. Which is
+shown in the table below. Unless noted otherwise, the size mentioned is
+the patch to bring version x.y.z to x.y.z+1.
+
+ Sarathy 5.6.1 2001-Apr-08 531 44 651
+ Rafael 5.6.2 2003-Nov-15 20 11 1819
+
+ Jarkko 5.8.0 2002-Jul-18 1205 31 471 From 5.7.3
+
+ 5.8.1 2003-Sep-25 243 102 6162
+ Nicholas 5.8.2 2003-Nov-05 10 50 788
+ 5.8.3 2004-Jan-14 31 13 360
+ 5.8.4 2004-Apr-21 33 8 299
+ 5.8.5 2004-Jul-19 11 19 255
+ 5.8.6 2004-Nov-27 35 3 192
+ 5.8.7 2005-May-30 75 34 778
+ 5.8.8 2006-Jan-31 131 42 1251
+ 5.8.9 2008-Dec-14 340 132 12988
+
+ Hugo 5.9.0 2003-Oct-27 281 168 7132 From 5.8.0
+ Rafael 5.9.1 2004-Mar-16 57 250 2107
+ 5.9.2 2005-Apr-01 720 57 858
+ 5.9.3 2006-Jan-28 1124 102 1906
+ 5.9.4 2006-Aug-15 896 60 862
+ 5.9.5 2007-Jul-07 1149 128 1062
+
+ 5.10.0 2007-Dec-18 50 31 13111 From 5.9.5
+
+
+=head1 THE KEEPERS OF THE RECORDS
+
+Jarkko Hietaniemi <F<jhi@iki.fi>>.
+
+Thanks to the collective memory of the Perlfolk. In addition to the
+Keepers of the Pumpkin also Alan Champion, Mark Dominus,
+Andreas König, John Macdonald, Matthias Neeracher, Jeff Okamoto,
+Michael Peppler, Randal Schwartz, and Paul D. Smith sent corrections
+and additions. Abigail added file and patch size data for the 5.6.0 - 5.10
+era.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlhpux.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlhpux.pod
new file mode 100755
index 00000000000..4cfeb6cc941
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlhpux.pod
@@ -0,0 +1,679 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.hpux - Perl version 5 on Hewlett-Packard Unix (HP-UX) systems
+
+=head1 DESCRIPTION
+
+This document describes various features of HP's Unix operating system
+(HP-UX) that will affect how Perl version 5 (hereafter just Perl) is
+compiled and/or runs.
+
+=head2 Using perl as shipped with HP-UX
+
+Application release September 2001, HP-UX 11.00 is the first to ship
+with Perl. By the time it was perl-5.6.1 in /opt/perl. The first
+occurrence is on CD 5012-7954 and can be installed using
+
+ swinstall -s /cdrom perl
+
+assuming you have mounted that CD on /cdrom. In this version the
+following modules were installed:
+
+ ActivePerl::DocTools-0.04 HTML::Parser-3.19 XML::DOM-1.25
+ Archive::Tar-0.072 HTML::Tagset-3.03 XML::Parser-2.27
+ Compress::Zlib-1.08 MIME::Base64-2.11 XML::Simple-1.05
+ Convert::ASN1-0.10 Net-1.07 XML::XPath-1.09
+ Digest::MD5-2.11 PPM-2.1.5 XML::XSLT-0.32
+ File::CounterFile-0.12 SOAP::Lite-0.46 libwww-perl-5.51
+ Font::AFM-1.18 Storable-1.011 libxml-perl-0.07
+ HTML-Tree-3.11 URI-1.11 perl-ldap-0.23
+
+That build was a portable hppa-1.1 multithread build that supports large
+files compiled with gcc-2.9-hppa-991112.
+
+If you perform a new installation, then (a newer) Perl will be installed
+automatically. Preinstalled HP-UX systems now slao have more recent versions
+of Perl and the updated modules.
+
+The official (threaded) builds from HP, as they are shipped on the
+Application DVD/CD's are available on
+http://www.software.hp.com/cgi-bin/swdepot_parser.cgi/cgi/displayProductInfo.pl?productNumber=PERL
+for both PA-RISC and IPF (Itanium Processor Family). They are built
+with the HP ANSI-C compiler by ActiveState.
+
+To see what version is included on the DVD (assumed here to be mounted
+on /cdrom), issue this command:
+
+ # swlist -s /cdrom perl
+ # perl D.5.8.8.B 5.8.8 Perl Programming Language
+ perl.Perl5-32 D.5.8.8.B 32-bit 5.8.8 Perl Programming Language with Extensions
+ perl.Perl5-64 D.5.8.8.B 64-bit 5.8.8 Perl Programming Language with Extensions
+
+=head2 Using perl from HP's porting centre
+
+HP porting centre tries very hard to keep up with customer demand and
+release updates from the Open Source community. Having precompiled
+Perl binaries available is obvious.
+
+The HP porting centres are limited in what systems they are allowed
+to port to and they usually choose the two most recent OS versions
+available. This means that at the moment of writing, there are only
+HP-UX 11.11 (pa-risc 2.0) and HP-UX 11.23 (Itanium 2) ports available
+on the porting centres.
+
+HP has asked the porting centre to move Open Source binaries
+from /opt to /usr/local, so binaries produced since the start
+of July 2002 are located in /usr/local.
+
+One of HP porting centres URL's is http://hpux.connect.org.uk/
+The port currently available is built with GNU gcc.
+
+=head2 Compiling Perl 5 on HP-UX
+
+When compiling Perl, you must use an ANSI C compiler. The C compiler
+that ships with all HP-UX systems is a K&R compiler that should only be
+used to build new kernels.
+
+Perl can be compiled with either HP's ANSI C compiler or with gcc. The
+former is recommended, as not only can it compile Perl with no
+difficulty, but also can take advantage of features listed later that
+require the use of HP compiler-specific command-line flags.
+
+If you decide to use gcc, make sure your installation is recent and
+complete, and be sure to read the Perl INSTALL file for more gcc-specific
+details.
+
+=head2 PA-RISC
+
+HP's HP9000 Unix systems run on HP's own Precision Architecture
+(PA-RISC) chip. HP-UX used to run on the Motorola MC68000 family of
+chips, but any machine with this chip in it is quite obsolete and this
+document will not attempt to address issues for compiling Perl on the
+Motorola chipset.
+
+The version of PA-RISC at the time of this document's last update is 2.0,
+which is also the last there will be. HP PA-RISC systems are usually
+refered to with model description "HP 9000". The last CPU in this series
+is the PA-8900. Support for PA-RISC architectured machines officially
+ends as shown in the following table:
+
+ PA-RISC End-of-Life Roadmap
+ +--------+----------------+----------------+-----------------+
+ | HP9000 | Superdome | PA-8700 | Spring 2011 |
+ | 4-128 | | PA-8800/sx1000 | Summer 2012 |
+ | cores | | PA-8900/sx1000 | 2014 |
+ | | | PA-8900/sx2000 | 2015 |
+ +--------+----------------+----------------+-----------------+
+ | HP9000 | rp7410, rp8400 | PA-8700 | Spring 2011 |
+ | 2-32 | rp7420, rp8420 | PA-8800/sx1000 | 2012 |
+ | cores | rp7440, rp8440 | PA-8900/sx1000 | Autumn 2013 |
+ | | | PA-8900/sx2000 | 2015 |
+ +--------+----------------+----------------+-----------------+
+ | HP9000 | rp44x0 | PA-8700 | Spring 2011 |
+ | 1-8 | | PA-8800/rp44x0 | 2012 |
+ | cores | | PA-8900/rp44x0 | 2014 |
+ +--------+----------------+----------------+-----------------+
+ | HP9000 | rp34x0 | PA-8700 | Spring 2011 |
+ | 1-4 | | PA-8800/rp34x0 | 2012 |
+ | cores | | PA-8900/rp34x0 | 2014 |
+ +--------+----------------+----------------+-----------------+
+
+From http://www.hp.com/products1/evolution/9000/eol_announcement.html:
+
+ The last order date for HP9000 PA-RISC systems is planned for
+ December 31, 2008 and ship date of April 1, 2009. Operating system
+ releases for HP-UX will continue shipping past the HP9000 systems
+ last order date.
+
+A complete list of models at the time the OS was built is in the file
+/usr/sam/lib/mo/sched.models. The first column corresponds to the last
+part of the output of the "model" command. The second column is the
+PA-RISC version and the third column is the exact chip type used.
+(Start browsing at the bottom to prevent confusion ;-)
+
+ # model
+ 9000/800/L1000-44
+ # grep L1000-44 /usr/sam/lib/mo/sched.models
+ L1000-44 2.0 PA8500
+
+=head2 Portability Between PA-RISC Versions
+
+An executable compiled on a PA-RISC 2.0 platform will not execute on a
+PA-RISC 1.1 platform, even if they are running the same version of
+HP-UX. If you are building Perl on a PA-RISC 2.0 platform and want that
+Perl to also run on a PA-RISC 1.1, the compiler flags +DAportable and
++DS32 should be used.
+
+It is no longer possible to compile PA-RISC 1.0 executables on either
+the PA-RISC 1.1 or 2.0 platforms. The command-line flags are accepted,
+but the resulting executable will not run when transferred to a PA-RISC
+1.0 system.
+
+=head2 PA-RISC 1.0
+
+The original version of PA-RISC, HP no longer sells any system with this chip.
+
+The following systems contained PA-RISC 1.0 chips:
+
+ 600, 635, 645, 808, 815, 822, 825, 832, 834, 835, 840, 842, 845, 850,
+ 852, 855, 860, 865, 870, 890
+
+=head2 PA-RISC 1.1
+
+An upgrade to the PA-RISC design, it shipped for many years in many different
+system.
+
+The following systems contain with PA-RISC 1.1 chips:
+
+ 705, 710, 712, 715, 720, 722, 725, 728, 730, 735, 742, 743, 744, 745,
+ 747, 750, 755, 770, 777, 778, 779, 800, 801, 803, 806, 807, 809, 811,
+ 813, 816, 817, 819, 821, 826, 827, 829, 831, 837, 839, 841, 847, 849,
+ 851, 856, 857, 859, 867, 869, 877, 887, 891, 892, 897, A180, A180C,
+ B115, B120, B132L, B132L+, B160L, B180L, C100, C110, C115, C120,
+ C160L, D200, D210, D220, D230, D250, D260, D310, D320, D330, D350,
+ D360, D410, DX0, DX5, DXO, E25, E35, E45, E55, F10, F20, F30, G30,
+ G40, G50, G60, G70, H20, H30, H40, H50, H60, H70, I30, I40, I50, I60,
+ I70, J200, J210, J210XC, K100, K200, K210, K220, K230, K400, K410,
+ K420, S700i, S715, S744, S760, T500, T520
+
+=head2 PA-RISC 2.0
+
+The most recent upgrade to the PA-RISC design, it added support for
+64-bit integer data.
+
+As of the date of this document's last update, the following systems
+contain PA-RISC 2.0 chips:
+
+ 700, 780, 781, 782, 783, 785, 802, 804, 810, 820, 861, 871, 879, 889,
+ 893, 895, 896, 898, 899, A400, A500, B1000, B2000, C130, C140, C160,
+ C180, C180+, C180-XP, C200+, C400+, C3000, C360, C3600, CB260, D270,
+ D280, D370, D380, D390, D650, J220, J2240, J280, J282, J400, J410,
+ J5000, J5500XM, J5600, J7000, J7600, K250, K260, K260-EG, K270, K360,
+ K370, K380, K450, K460, K460-EG, K460-XP, K470, K570, K580, L1000,
+ L2000, L3000, N4000, R380, R390, SD16000, SD32000, SD64000, T540,
+ T600, V2000, V2200, V2250, V2500, V2600
+
+Just before HP took over Compaq, some systems were renamed. the link
+that contained the explanation is dead, so here's a short summary:
+
+ HP 9000 A-Class servers, now renamed HP Server rp2400 series.
+ HP 9000 L-Class servers, now renamed HP Server rp5400 series.
+ HP 9000 N-Class servers, now renamed HP Server rp7400.
+
+ rp2400, rp2405, rp2430, rp2450, rp2470, rp3410, rp3440, rp4410,
+ rp4440, rp5400, rp5405, rp5430, rp5450, rp5470, rp7400, rp7405,
+ rp7410, rp7420, rp7440, rp8400, rp8420, rp8440, Superdome
+
+The current naming convention is:
+
+ aadddd
+ ||||`+- 00 - 99 relative capacity & newness (upgrades, etc.)
+ |||`--- unique number for each architecture to ensure different
+ ||| systems do not have the same numbering across
+ ||| architectures
+ ||`---- 1 - 9 identifies family and/or relative positioning
+ ||
+ |`----- c = ia32 (cisc)
+ | p = pa-risc
+ | x = ia-64 (Itanium & Itanium 2)
+ | h = housing
+ `------ t = tower
+ r = rack optimized
+ s = super scalable
+ b = blade
+ sa = appliance
+
+=head2 Itanium Processor Family (IPF) and HP-UX
+
+HP-UX also runs on the new Itanium processor. This requires the use
+of a different version of HP-UX (currently 11.23 or 11i v2), and with
+the exception of a few differences detailed below and in later sections,
+Perl should compile with no problems.
+
+Although PA-RISC binaries can run on Itanium systems, you should not
+attempt to use a PA-RISC version of Perl on an Itanium system. This is
+because shared libraries created on an Itanium system cannot be loaded
+while running a PA-RISC executable.
+
+HP Itanium 2 systems are usually refered to with model description
+"HP Integrity".
+
+=head2 Itanium, Itanium 2 & Madison 6
+
+HP also ships servers with the 128-bit Itanium processor(s). The cx26x0
+is told to have Madison 6. As of the date of this document's last update,
+the following systems contain Itanium or Itanium 2 chips (this is likely
+to be out of date):
+
+ BL60p, BL860c, BL870c, cx2600, cx2620, rx1600, rx1620, rx2600,
+ rx2600hptc, rx2620, rx2660, rx3600, rx4610, rx4640, rx5670,
+ rx6600, rx7420, rx7620, rx7640, rx8420, rx8620, rx8640, rx9610,
+ sx1000, sx2000
+
+To see all about your machine, type
+
+ # model
+ ia64 hp server rx2600
+ # /usr/contrib/bin/machinfo
+
+=head2 HP-UX versions
+
+Not all architectures (PA = PA-RISC, IPF = Itanium Processor Family)
+support all versions of HP-UX, here is a short list
+
+ HP-UX version Kernel Architecture
+ ------------- ------ ------------
+ 10.20 32 bit PA
+ 11.00 32/64 PA
+ 11.11 11i v1 32/64 PA
+ 11.22 11i v2 64 IPF
+ 11.23 11i v2 64 PA & IPF
+ 11.31 11i v3 64 PA & IPF
+
+See for the full list of hardware/OS support and expected end-of-life
+http://www.hp.com/go/hpuxservermatrix
+
+=head2 Building Dynamic Extensions on HP-UX
+
+HP-UX supports dynamically loadable libraries (shared libraries).
+Shared libraries end with the suffix .sl. On Itanium systems,
+they end with the suffix .so.
+
+Shared libraries created on a platform using a particular PA-RISC
+version are not usable on platforms using an earlier PA-RISC version by
+default. However, this backwards compatibility may be enabled using the
+same +DAportable compiler flag (with the same PA-RISC 1.0 caveat
+mentioned above).
+
+Shared libraries created on an Itanium platform cannot be loaded on
+a PA-RISC platform. Shared libraries created on a PA-RISC platform
+can only be loaded on an Itanium platform if it is a PA-RISC executable
+that is attempting to load the PA-RISC library. A PA-RISC shared
+library cannot be loaded into an Itanium executable nor vice-versa.
+
+To create a shared library, the following steps must be performed:
+
+ 1. Compile source modules with +z or +Z flag to create a .o module
+ which contains Position-Independent Code (PIC). The linker will
+ tell you in the next step if +Z was needed.
+ (For gcc, the appropriate flag is -fpic or -fPIC.)
+
+ 2. Link the shared library using the -b flag. If the code calls
+ any functions in other system libraries (e.g., libm), it must
+ be included on this line.
+
+(Note that these steps are usually handled automatically by the extension's
+Makefile).
+
+If these dependent libraries are not listed at shared library creation
+time, you will get fatal "Unresolved symbol" errors at run time when the
+library is loaded.
+
+You may create a shared library that refers to another library, which
+may be either an archive library or a shared library. If this second
+library is a shared library, this is called a "dependent library". The
+dependent library's name is recorded in the main shared library, but it
+is not linked into the shared library. Instead, it is loaded when the
+main shared library is loaded. This can cause problems if you build an
+extension on one system and move it to another system where the
+libraries may not be located in the same place as on the first system.
+
+If the referred library is an archive library, then it is treated as a
+simple collection of .o modules (all of which must contain PIC). These
+modules are then linked into the shared library.
+
+Note that it is okay to create a library which contains a dependent
+library that is already linked into perl.
+
+Some extensions, like DB_File and Compress::Zlib use/require prebuilt
+libraries for the perl extensions/modules to work. If these libraries
+are built using the default configuration, it might happen that you
+run into an error like "invalid loader fixup" during load phase.
+HP is aware of this problem. Search the HP-UX cxx-dev forums for
+discussions about the subject. The short answer is that B<everything>
+(all libraries, everything) must be compiled with C<+z> or C<+Z> to be
+PIC (position independent code). (For gcc, that would be
+C<-fpic> or C<-fPIC>). In HP-UX 11.00 or newer the linker
+error message should tell the name of the offending object file.
+
+A more general approach is to intervene manually, as with an example for
+the DB_File module, which requires SleepyCat's libdb.sl:
+
+ # cd .../db-3.2.9/build_unix
+ # vi Makefile
+ ... add +Z to all cflags to create shared objects
+ CFLAGS= -c $(CPPFLAGS) +Z -Ae +O2 +Onolimit \
+ -I/usr/local/include -I/usr/include/X11R6
+ CXXFLAGS= -c $(CPPFLAGS) +Z -Ae +O2 +Onolimit \
+ -I/usr/local/include -I/usr/include/X11R6
+
+ # make clean
+ # make
+ # mkdir tmp
+ # cd tmp
+ # ar x ../libdb.a
+ # ld -b -o libdb-3.2.sl *.o
+ # mv libdb-3.2.sl /usr/local/lib
+ # rm *.o
+ # cd /usr/local/lib
+ # rm -f libdb.sl
+ # ln -s libdb-3.2.sl libdb.sl
+
+ # cd .../DB_File-1.76
+ # make distclean
+ # perl Makefile.PL
+ # make
+ # make test
+ # make install
+
+As of db-4.2.x it is no longer needed to do this by hand. Sleepycat
+has changed the configuration process to add +z on HP-UX automatically.
+
+ # cd .../db-4.2.25/build_unix
+ # env CFLAGS=+DD64 LDFLAGS=+DD64 ../dist/configure
+
+should work to generate 64bit shared libraries for HP-UX 11.00 and 11i.
+
+It is no longer possible to link PA-RISC 1.0 shared libraries (even
+though the command-line flags are still present).
+
+PA-RISC and Itanium object files are not interchangeable. Although
+you may be able to use ar to create an archive library of PA-RISC
+object files on an Itanium system, you cannot link against it using
+an Itanium link editor.
+
+=head2 The HP ANSI C Compiler
+
+When using this compiler to build Perl, you should make sure that the
+flag -Aa is added to the cpprun and cppstdin variables in the config.sh
+file (though see the section on 64-bit perl below). If you are using a
+recent version of the Perl distribution, these flags are set automatically.
+
+Even though HP-UX 10.20 and 11.00 are not actively maintained by HP
+anymore, updates for the HP ANSI C compiler are still available from
+time to time, and it might be advisable to see if updates are applicable.
+At the moment of writing, the latests available patches for 11.00 that
+should be applied are PHSS_35098, PHSS_35175, PHSS_35100, PHSS_33036,
+and PHSS_33902). If you have a SUM account, you can use it to search
+for updates/patches. Enter "ANSI" as keyword.
+
+=head2 The GNU C Compiler
+
+When you are going to use the GNU C compiler (gcc), and you don't have
+gcc yet, you can either build it yourself from the sources (available
+from e.g. http://www.gnu.ai.mit.edu/software/gcc/releases.html) or fetch
+a prebuilt binary from the HP porting center. There are two places where
+gcc prebuilds can be fetched; the first and best (for HP-UX 11 only) is
+http://h21007.www2.hp.com/dspp/tech/tech_TechSoftwareDetailPage_IDX/1,1703,547,00.html
+the second is http://hpux.cs.utah.edu/hppd/hpux/Gnu/ where you can also
+find the GNU binutils package. (Browse through the list, because there
+are often multiple versions of the same package available).
+
+Above mentioned distributions are depots. H.Merijn Brand has made prebuilt
+gcc binaries available on http://mirrors.develooper.com/hpux/ and/or
+http://www.cmve.net/~merijn/ for HP-UX 10.20, HP-UX 11.00, HP-UX 11.11
+(HP-UX 11i v1), and HP-UX 11.23 (HP-UX 11i v2) in both 32- and 64-bit
+versions. These are bzipped tar archives that also include recent GNU
+binutils and GNU gdb. Read the instructions on that page to rebuild gcc
+using itself.
+
+On PA-RISC you need a different compiler for 32-bit applications and for
+64-bit applications. On PA-RISC, 32-bit objects and 64-bit objects do
+not mix. Period. There is no different behaviour for HP C-ANSI-C or GNU
+gcc. So if you require your perl binary to use 64-bit libraries, like
+Oracle-64bit, you MUST build a 64-bit perl.
+
+Building a 64-bit capable gcc on PA-RISC from source is possible only when
+you have the HP C-ANSI C compiler or an already working 64-bit binary of
+gcc available. Best performance for perl is achieved with HP's native
+compiler.
+
+=head2 Using Large Files with Perl on HP-UX
+
+Beginning with HP-UX version 10.20, files larger than 2GB (2^31 bytes)
+may be created and manipulated. Three separate methods of doing this
+are available. Of these methods, the best method for Perl is to compile
+using the -Duselargefiles flag to Configure. This causes Perl to be
+compiled using structures and functions in which these are 64 bits wide,
+rather than 32 bits wide. (Note that this will only work with HP's ANSI
+C compiler. If you want to compile Perl using gcc, you will have to get
+a version of the compiler that supports 64-bit operations. See above for
+where to find it.)
+
+There are some drawbacks to this approach. One is that any extension
+which calls any file-manipulating C function will need to be recompiled
+(just follow the usual "perl Makefile.PL; make; make test; make install"
+procedure).
+
+The list of functions that will need to recompiled is:
+ creat, fgetpos, fopen,
+ freopen, fsetpos, fstat,
+ fstatvfs, fstatvfsdev, ftruncate,
+ ftw, lockf, lseek,
+ lstat, mmap, nftw,
+ open, prealloc, stat,
+ statvfs, statvfsdev, tmpfile,
+ truncate, getrlimit, setrlimit
+
+Another drawback is only valid for Perl versions before 5.6.0. This
+drawback is that the seek and tell functions (both the builtin version
+and POSIX module version) will not perform correctly.
+
+It is strongly recommended that you use this flag when you run
+Configure. If you do not do this, but later answer the question about
+large files when Configure asks you, you may get a configuration that
+cannot be compiled, or that does not function as expected.
+
+=head2 Threaded Perl on HP-UX
+
+It is possible to compile a version of threaded Perl on any version of
+HP-UX before 10.30, but it is strongly suggested that you be running on
+HP-UX 11.00 at least.
+
+To compile Perl with threads, add -Dusethreads to the arguments of
+Configure. Verify that the -D_POSIX_C_SOURCE=199506L compiler flag is
+automatically added to the list of flags. Also make sure that -lpthread
+is listed before -lc in the list of libraries to link Perl with. The
+hints provided for HP-UX during Configure will try very hard to get
+this right for you.
+
+HP-UX versions before 10.30 require a separate installation of a POSIX
+threads library package. Two examples are the HP DCE package, available
+on "HP-UX Hardware Extensions 3.0, Install and Core OS, Release 10.20,
+April 1999 (B3920-13941)" or the Freely available PTH package, available
+on H.Merijn's site (http://mirrors.develooper.com/hpux/).
+
+If you are going to use the HP DCE package, the library used for threading
+is /usr/lib/libcma.sl, but there have been multiple updates of that
+library over time. Perl will build with the first version, but it
+will not pass the test suite. Older Oracle versions might be a compelling
+reason not to update that library, otherwise please find a newer version
+in one of the following patches: PHSS_19739, PHSS_20608, or PHSS_23672
+
+reformatted output:
+
+ d3:/usr/lib 106 > what libcma-*.1
+ libcma-00000.1:
+ HP DCE/9000 1.5 Module: libcma.sl (Export)
+ Date: Apr 29 1996 22:11:24
+ libcma-19739.1:
+ HP DCE/9000 1.5 PHSS_19739-40 Module: libcma.sl (Export)
+ Date: Sep 4 1999 01:59:07
+ libcma-20608.1:
+ HP DCE/9000 1.5 PHSS_20608 Module: libcma.1 (Export)
+ Date: Dec 8 1999 18:41:23
+ libcma-23672.1:
+ HP DCE/9000 1.5 PHSS_23672 Module: libcma.1 (Export)
+ Date: Apr 9 2001 10:01:06
+ d3:/usr/lib 107 >
+
+If you choose for the PTH package, use swinstall to install pth in
+the default location (/opt/pth), and then make symbolic links to the
+libraries from /usr/lib
+
+ # cd /usr/lib
+ # ln -s /opt/pth/lib/libpth* .
+
+For building perl to support Oracle, it needs to be linked with libcl
+and libpthread. So even if your perl is an unthreaded build, these
+libraries might be required. See "Oracle on HP-UX" below.
+
+=head2 64-bit Perl on HP-UX
+
+Beginning with HP-UX 11.00, programs compiled under HP-UX can take
+advantage of the LP64 programming environment (LP64 means Longs and
+Pointers are 64 bits wide), in which scalar variables will be able
+to hold numbers larger than 2^32 with complete precision. Perl has
+proven to be consistent and reliable in 64bit mode since 5.8.1 on
+all HP-UX 11.xx.
+
+As of the date of this document, Perl is fully 64-bit compliant on
+HP-UX 11.00 and up for both cc- and gcc builds. If you are about to
+build a 64-bit perl with GNU gcc, please read the gcc section carefully.
+
+Should a user have the need for compiling Perl in the LP64 environment,
+use the -Duse64bitall flag to Configure. This will force Perl to be
+compiled in a pure LP64 environment (with the +DD64 flag for HP C-ANSI-C,
+with no additional options for GNU gcc 64-bit on PA-RISC, and with
+-mlp64 for GNU gcc on Itanium).
+If you want to compile Perl using gcc, you will have to get a version of
+the compiler that supports 64-bit operations.)
+
+You can also use the -Duse64bitint flag to Configure. Although there
+are some minor differences between compiling Perl with this flag versus
+the -Duse64bitall flag, they should not be noticeable from a Perl user's
+perspective. When configuring -Duse64bitint using a 64bit gcc on a
+pa-risc architecture, -Duse64bitint is silently promoted to -Duse64bitall.
+
+In both cases, it is strongly recommended that you use these flags when
+you run Configure. If you do not use do this, but later answer the
+questions about 64-bit numbers when Configure asks you, you may get a
+configuration that cannot be compiled, or that does not function as
+expected.
+
+=head2 Oracle on HP-UX
+
+Using perl to connect to Oracle databases through DBI and DBD::Oracle
+has caused a lot of people many headaches. Read README.hpux in the
+DBD::Oracle for much more information. The reason to mention it here
+is that Oracle requires a perl built with libcl and libpthread, the
+latter even when perl is build without threads. Building perl using
+all defaults, but still enabling to build DBD::Oracle later on can be
+achieved using
+
+ Configure -A prepend:libswanted='cl pthread ' ...
+
+Do not forget the space before the trailing quote.
+
+Also note that this does not (yet) work with all configurations,
+it is known to fail with 64-bit versions of GCC.
+
+=head2 GDBM and Threads on HP-UX
+
+If you attempt to compile Perl with (POSIX) threads on an 11.X system
+and also link in the GDBM library, then Perl will immediately core dump
+when it starts up. The only workaround at this point is to relink the
+GDBM library under 11.X, then relink it into Perl.
+
+the error might show something like:
+
+Pthread internal error: message: __libc_reinit() failed, file: ../pthreads/pthread.c, line: 1096
+Return Pointer is 0xc082bf33
+sh: 5345 Quit(coredump)
+
+and Configure will give up.
+
+=head2 NFS filesystems and utime(2) on HP-UX
+
+If you are compiling Perl on a remotely-mounted NFS filesystem, the test
+io/fs.t may fail on test #18. This appears to be a bug in HP-UX and no
+fix is currently available.
+
+=head2 perl -P and // and HP-UX
+
+If HP-UX Perl is compiled with flags that will cause problems if the
+-P flag of Perl (preprocess Perl code with the C preprocessor before
+perl sees it) is used. The problem is that C<//>, being a C++-style
+until-end-of-line comment, will disappear along with the remainder
+of the line. This means that common Perl constructs like
+
+ s/foo//;
+
+will turn into illegal code
+
+ s/foo
+
+The workaround is to use some other quoting separator than C<"/">,
+like for example C<"!">:
+
+ s!foo!!;
+
+=head2 HP-UX Kernel Parameters (maxdsiz) for Compiling Perl
+
+By default, HP-UX comes configured with a maximum data segment size of
+64MB. This is too small to correctly compile Perl with the maximum
+optimization levels. You can increase the size of the maxdsiz kernel
+parameter through the use of SAM.
+
+When using the GUI version of SAM, click on the Kernel Configuration
+icon, then the Configurable Parameters icon. Scroll down and select
+the maxdsiz line. From the Actions menu, select the Modify Configurable
+Parameter item. Insert the new formula into the Formula/Value box.
+Then follow the instructions to rebuild your kernel and reboot your
+system.
+
+In general, a value of 256MB (or "256*1024*1024") is sufficient for
+Perl to compile at maximum optimization.
+
+=head1 nss_delete core dump from op/pwent or op/grent
+
+You may get a bus error core dump from the op/pwent or op/grent
+tests. If compiled with -g you will see a stack trace much like
+the following:
+
+ #0 0xc004216c in () from /usr/lib/libc.2
+ #1 0xc00d7550 in __nss_src_state_destr () from /usr/lib/libc.2
+ #2 0xc00d7768 in __nss_src_state_destr () from /usr/lib/libc.2
+ #3 0xc00d78a8 in nss_delete () from /usr/lib/libc.2
+ #4 0xc01126d8 in endpwent () from /usr/lib/libc.2
+ #5 0xd1950 in Perl_pp_epwent () from ./perl
+ #6 0x94d3c in Perl_runops_standard () from ./perl
+ #7 0x23728 in S_run_body () from ./perl
+ #8 0x23428 in perl_run () from ./perl
+ #9 0x2005c in main () from ./perl
+
+The key here is the C<nss_delete> call. One workaround for this
+bug seems to be to create add to the file F</etc/nsswitch.conf>
+(at least) the following lines
+
+ group: files
+ passwd: files
+
+Whether you are using NIS does not matter. Amazingly enough,
+the same bug also affects Solaris.
+
+=head1 Miscellaneous
+
+HP-UX 11 Y2K patch "Y2K-1100 B.11.00.B0125 HP-UX Core OS Year 2000
+Patch Bundle" has been reported to break the io/fs test #18 which
+tests whether utime() can change timestamps. The Y2K patch seems to
+break utime() so that over NFS the timestamps do not get changed
+(on local filesystems utime() still works). This has probably been
+fixed on your system by now.
+
+=head1 AUTHOR
+
+H.Merijn Brand <h.m.brand@xs4all.nl>
+Jeff Okamoto <okamoto@corp.hp.com>
+
+With much assistance regarding shared libraries from Marc Sabatella.
+
+=head1 DATE
+
+Version 0.8.3: 2008-06-24
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlhurd.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlhurd.pod
new file mode 100755
index 00000000000..251249cbc15
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlhurd.pod
@@ -0,0 +1,54 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.hurd - Perl version 5 on Hurd
+
+=head1 DESCRIPTION
+
+If you want to use Perl on the Hurd, I recommend using the Debian
+GNU/Hurd distribution ( see http://www.debian.org/ ), even if an
+official, stable release has not yet been made. The old "gnu-0.2"
+binary distribution will most certainly have additional problems.
+
+=head2 Known Problems with Perl on Hurd
+
+The Perl test suite may still report some errors on the Hurd. The
+"lib/anydbm" and "pragma/warnings" tests will almost certainly fail.
+Both failures are not really specific to the Hurd, as indicated by the
+test suite output.
+
+The socket tests may fail if the network is not configured. You have
+to make "/hurd/pfinet" the translator for "/servers/socket/2", giving
+it the right arguments. Try "/hurd/pfinet --help" for more
+information.
+
+Here are the statistics for Perl 5.005_62 on my system:
+
+ Failed Test Status Wstat Total Fail Failed List of failed
+ -------------------------------------------------------------------------
+ lib/anydbm.t 12 1 8.33% 12
+ pragma/warnings 333 1 0.30% 215
+
+ 8 tests and 24 subtests skipped.
+ Failed 2/229 test scripts, 99.13% okay. 2/10850 subtests failed, 99.98% okay.
+
+There are quite a few systems out there that do worse!
+
+However, since I am running a very recent Hurd snapshot, in which a lot of
+bugs that were exposed by the Perl test suite have been fixed, you may
+encounter more failures. Likely candidates are: "op/stat", "lib/io_pipe",
+"lib/io_sock", "lib/io_udp" and "lib/time".
+
+In any way, if you're seeing failures beyond those mentioned in this
+document, please consider upgrading to the latest Hurd before reporting
+the failure as a bug.
+
+=head1 AUTHOR
+
+Mark Kettenis <kettenis@gnu.org>
+
+Last Updated: Fri, 29 Oct 1999 22:50:30 +0200
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlintern.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlintern.pod
new file mode 100755
index 00000000000..68f72f24afb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlintern.pod
@@ -0,0 +1,1106 @@
+-*- buffer-read-only: t -*-
+
+!!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+This file is built by ..\autodoc.pl extracting documentation from the C source
+files.
+
+=head1 NAME
+
+perlintern - autogenerated documentation of purely B<internal>
+ Perl functions
+
+=head1 DESCRIPTION
+X<internal Perl functions> X<interpreter functions>
+
+This file is the autogenerated documentation of functions in the
+Perl interpreter that are documented using Perl's internal documentation
+format but are not marked as part of the Perl API. In other words,
+B<they are not for use in extensions>!
+
+
+=head1 CV reference counts and CvOUTSIDE
+
+=over 8
+
+=item CvWEAKOUTSIDE
+X<CvWEAKOUTSIDE>
+
+Each CV has a pointer, C<CvOUTSIDE()>, to its lexically enclosing
+CV (if any). Because pointers to anonymous sub prototypes are
+stored in C<&> pad slots, it is a possible to get a circular reference,
+with the parent pointing to the child and vice-versa. To avoid the
+ensuing memory leak, we do not increment the reference count of the CV
+pointed to by C<CvOUTSIDE> in the I<one specific instance> that the parent
+has a C<&> pad slot pointing back to us. In this case, we set the
+C<CvWEAKOUTSIDE> flag in the child. This allows us to determine under what
+circumstances we should decrement the refcount of the parent when freeing
+the child.
+
+There is a further complication with non-closure anonymous subs (i.e. those
+that do not refer to any lexicals outside that sub). In this case, the
+anonymous prototype is shared rather than being cloned. This has the
+consequence that the parent may be freed while there are still active
+children, eg
+
+ BEGIN { $a = sub { eval '$x' } }
+
+In this case, the BEGIN is freed immediately after execution since there
+are no active references to it: the anon sub prototype has
+C<CvWEAKOUTSIDE> set since it's not a closure, and $a points to the same
+CV, so it doesn't contribute to BEGIN's refcount either. When $a is
+executed, the C<eval '$x'> causes the chain of C<CvOUTSIDE>s to be followed,
+and the freed BEGIN is accessed.
+
+To avoid this, whenever a CV and its associated pad is freed, any
+C<&> entries in the pad are explicitly removed from the pad, and if the
+refcount of the pointed-to anon sub is still positive, then that
+child's C<CvOUTSIDE> is set to point to its grandparent. This will only
+occur in the single specific case of a non-closure anon prototype
+having one or more active references (such as C<$a> above).
+
+One other thing to consider is that a CV may be merely undefined
+rather than freed, eg C<undef &foo>. In this case, its refcount may
+not have reached zero, but we still delete its pad and its C<CvROOT> etc.
+Since various children may still have their C<CvOUTSIDE> pointing at this
+undefined CV, we keep its own C<CvOUTSIDE> for the time being, so that
+the chain of lexical scopes is unbroken. For example, the following
+should print 123:
+
+ my $x = 123;
+ sub tmp { sub { eval '$x' } }
+ my $a = tmp();
+ undef &tmp;
+ print $a->();
+
+ bool CvWEAKOUTSIDE(CV *cv)
+
+=for hackers
+Found in file cv.h
+
+
+=back
+
+=head1 Functions in file pad.h
+
+
+=over 8
+
+=item CX_CURPAD_SAVE
+X<CX_CURPAD_SAVE>
+
+Save the current pad in the given context block structure.
+
+ void CX_CURPAD_SAVE(struct context)
+
+=for hackers
+Found in file pad.h
+
+=item CX_CURPAD_SV
+X<CX_CURPAD_SV>
+
+Access the SV at offset po in the saved current pad in the given
+context block structure (can be used as an lvalue).
+
+ SV * CX_CURPAD_SV(struct context, PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_BASE_SV
+X<PAD_BASE_SV>
+
+Get the value from slot C<po> in the base (DEPTH=1) pad of a padlist
+
+ SV * PAD_BASE_SV(PADLIST padlist, PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_CLONE_VARS
+X<PAD_CLONE_VARS>
+
+Clone the state variables associated with running and compiling pads.
+
+ void PAD_CLONE_VARS(PerlInterpreter *proto_perl, CLONE_PARAMS* param)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_COMPNAME_FLAGS
+X<PAD_COMPNAME_FLAGS>
+
+Return the flags for the current compiling pad name
+at offset C<po>. Assumes a valid slot entry.
+
+ U32 PAD_COMPNAME_FLAGS(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_COMPNAME_GEN
+X<PAD_COMPNAME_GEN>
+
+The generation number of the name at offset C<po> in the current
+compiling pad (lvalue). Note that C<SvUVX> is hijacked for this purpose.
+
+ STRLEN PAD_COMPNAME_GEN(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_COMPNAME_GEN_set
+X<PAD_COMPNAME_GEN_set>
+
+Sets the generation number of the name at offset C<po> in the current
+ling pad (lvalue) to C<gen>. Note that C<SvUV_set> is hijacked for this purpose.
+
+ STRLEN PAD_COMPNAME_GEN_set(PADOFFSET po, int gen)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_COMPNAME_OURSTASH
+X<PAD_COMPNAME_OURSTASH>
+
+Return the stash associated with an C<our> variable.
+Assumes the slot entry is a valid C<our> lexical.
+
+ HV * PAD_COMPNAME_OURSTASH(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_COMPNAME_PV
+X<PAD_COMPNAME_PV>
+
+Return the name of the current compiling pad name
+at offset C<po>. Assumes a valid slot entry.
+
+ char * PAD_COMPNAME_PV(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_COMPNAME_TYPE
+X<PAD_COMPNAME_TYPE>
+
+Return the type (stash) of the current compiling pad name at offset
+C<po>. Must be a valid name. Returns null if not typed.
+
+ HV * PAD_COMPNAME_TYPE(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_DUP
+X<PAD_DUP>
+
+Clone a padlist.
+
+ void PAD_DUP(PADLIST dstpad, PADLIST srcpad, CLONE_PARAMS* param)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_RESTORE_LOCAL
+X<PAD_RESTORE_LOCAL>
+
+Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL()
+
+ void PAD_RESTORE_LOCAL(PAD *opad)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SAVE_LOCAL
+X<PAD_SAVE_LOCAL>
+
+Save the current pad to the local variable opad, then make the
+current pad equal to npad
+
+ void PAD_SAVE_LOCAL(PAD *opad, PAD *npad)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SAVE_SETNULLPAD
+X<PAD_SAVE_SETNULLPAD>
+
+Save the current pad then set it to null.
+
+ void PAD_SAVE_SETNULLPAD()
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SETSV
+X<PAD_SETSV>
+
+Set the slot at offset C<po> in the current pad to C<sv>
+
+ SV * PAD_SETSV(PADOFFSET po, SV* sv)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SET_CUR
+X<PAD_SET_CUR>
+
+Set the current pad to be pad C<n> in the padlist, saving
+the previous current pad. NB currently this macro expands to a string too
+long for some compilers, so it's best to replace it with
+
+ SAVECOMPPAD();
+ PAD_SET_CUR_NOSAVE(padlist,n);
+
+
+ void PAD_SET_CUR(PADLIST padlist, I32 n)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SET_CUR_NOSAVE
+X<PAD_SET_CUR_NOSAVE>
+
+like PAD_SET_CUR, but without the save
+
+ void PAD_SET_CUR_NOSAVE(PADLIST padlist, I32 n)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SV
+X<PAD_SV>
+
+Get the value at offset C<po> in the current pad
+
+ void PAD_SV(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SVl
+X<PAD_SVl>
+
+Lightweight and lvalue version of C<PAD_SV>.
+Get or set the value at offset C<po> in the current pad.
+Unlike C<PAD_SV>, does not print diagnostics with -DX.
+For internal use only.
+
+ SV * PAD_SVl(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item SAVECLEARSV
+X<SAVECLEARSV>
+
+Clear the pointed to pad value on scope exit. (i.e. the runtime action of 'my')
+
+ void SAVECLEARSV(SV **svp)
+
+=for hackers
+Found in file pad.h
+
+=item SAVECOMPPAD
+X<SAVECOMPPAD>
+
+save PL_comppad and PL_curpad
+
+
+
+
+
+ void SAVECOMPPAD()
+
+=for hackers
+Found in file pad.h
+
+=item SAVEPADSV
+X<SAVEPADSV>
+
+Save a pad slot (used to restore after an iteration)
+
+XXX DAPM it would make more sense to make the arg a PADOFFSET
+ void SAVEPADSV(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+
+=back
+
+=head1 GV Functions
+
+=over 8
+
+=item is_gv_magical
+X<is_gv_magical>
+
+Returns C<TRUE> if given the name of a magical GV.
+
+Currently only useful internally when determining if a GV should be
+created even in rvalue contexts.
+
+C<flags> is not used at present but available for future extension to
+allow selecting particular classes of magical variable.
+
+Currently assumes that C<name> is NUL terminated (as well as len being valid).
+This assumption is met by all callers within the perl core, which all pass
+pointers returned by SvPV.
+
+ bool is_gv_magical(const char *name, STRLEN len, U32 flags)
+
+=for hackers
+Found in file gv.c
+
+=item is_gv_magical_sv
+X<is_gv_magical_sv>
+
+Returns C<TRUE> if given the name of a magical GV. Calls is_gv_magical.
+
+ bool is_gv_magical_sv(SV *name, U32 flags)
+
+=for hackers
+Found in file gv.c
+
+
+=back
+
+=head1 Hash Manipulation Functions
+
+=over 8
+
+=item refcounted_he_chain_2hv
+X<refcounted_he_chain_2hv>
+
+Generates and returns a C<HV *> by walking up the tree starting at the passed
+in C<struct refcounted_he *>.
+
+ HV * refcounted_he_chain_2hv(const struct refcounted_he *c)
+
+=for hackers
+Found in file hv.c
+
+=item refcounted_he_free
+X<refcounted_he_free>
+
+Decrements the reference count of the passed in C<struct refcounted_he *>
+by one. If the reference count reaches zero the structure's memory is freed,
+and C<refcounted_he_free> iterates onto the parent node.
+
+ void refcounted_he_free(struct refcounted_he *he)
+
+=for hackers
+Found in file hv.c
+
+=item refcounted_he_new
+X<refcounted_he_new>
+
+Creates a new C<struct refcounted_he>. As S<key> is copied, and value is
+stored in a compact form, all references remain the property of the caller.
+The C<struct refcounted_he> is returned with a reference count of 1.
+
+ struct refcounted_he * refcounted_he_new(struct refcounted_he *const parent, SV *const key, SV *const value)
+
+=for hackers
+Found in file hv.c
+
+
+=back
+
+=head1 IO Functions
+
+=over 8
+
+=item start_glob
+X<start_glob>
+
+Function called by C<do_readline> to spawn a glob (or do the glob inside
+perl on VMS). This code used to be inline, but now perl uses C<File::Glob>
+this glob starter is only used by miniperl during the build process.
+Moving it away shrinks pp_hot.c; shrinking pp_hot.c helps speed perl up.
+
+ PerlIO* start_glob(SV *tmpglob, IO *io)
+
+=for hackers
+Found in file doio.c
+
+
+=back
+
+=head1 Magical Functions
+
+=over 8
+
+=item magic_clearhint
+X<magic_clearhint>
+
+Triggered by a delete from %^H, records the key to
+C<PL_compiling.cop_hints_hash>.
+
+ int magic_clearhint(SV* sv, MAGIC* mg)
+
+=for hackers
+Found in file mg.c
+
+=item magic_sethint
+X<magic_sethint>
+
+Triggered by a store to %^H, records the key/value pair to
+C<PL_compiling.cop_hints_hash>. It is assumed that hints aren't storing
+anything that would need a deep copy. Maybe we should warn if we find a
+reference.
+
+ int magic_sethint(SV* sv, MAGIC* mg)
+
+=for hackers
+Found in file mg.c
+
+=item mg_localize
+X<mg_localize>
+
+Copy some of the magic from an existing SV to new localized version of
+that SV. Container magic (eg %ENV, $1, tie) gets copied, value magic
+doesn't (eg taint, pos).
+
+ void mg_localize(SV* sv, SV* nsv)
+
+=for hackers
+Found in file mg.c
+
+
+=back
+
+=head1 MRO Functions
+
+=over 8
+
+=item mro_get_linear_isa_dfs
+X<mro_get_linear_isa_dfs>
+
+Returns the Depth-First Search linearization of @ISA
+the given stash. The return value is a read-only AV*.
+C<level> should be 0 (it is used internally in this
+function's recursion).
+
+You are responsible for C<SvREFCNT_inc()> on the
+return value if you plan to store it anywhere
+semi-permanently (otherwise it might be deleted
+out from under you the next time the cache is
+invalidated).
+
+ AV* mro_get_linear_isa_dfs(HV* stash, U32 level)
+
+=for hackers
+Found in file mro.c
+
+=item mro_isa_changed_in
+X<mro_isa_changed_in>
+
+Takes the necessary steps (cache invalidations, mostly)
+when the @ISA of the given package has changed. Invoked
+by the C<setisa> magic, should not need to invoke directly.
+
+ void mro_isa_changed_in(HV* stash)
+
+=for hackers
+Found in file mro.c
+
+
+=back
+
+=head1 Pad Data Structures
+
+=over 8
+
+=item CvPADLIST
+X<CvPADLIST>
+
+CV's can have CvPADLIST(cv) set to point to an AV.
+
+For these purposes "forms" are a kind-of CV, eval""s are too (except they're
+not callable at will and are always thrown away after the eval"" is done
+executing). Require'd files are simply evals without any outer lexical
+scope.
+
+XSUBs don't have CvPADLIST set - dXSTARG fetches values from PL_curpad,
+but that is really the callers pad (a slot of which is allocated by
+every entersub).
+
+The CvPADLIST AV has does not have AvREAL set, so REFCNT of component items
+is managed "manual" (mostly in pad.c) rather than normal av.c rules.
+The items in the AV are not SVs as for a normal AV, but other AVs:
+
+0'th Entry of the CvPADLIST is an AV which represents the "names" or rather
+the "static type information" for lexicals.
+
+The CvDEPTH'th entry of CvPADLIST AV is an AV which is the stack frame at that
+depth of recursion into the CV.
+The 0'th slot of a frame AV is an AV which is @_.
+other entries are storage for variables and op targets.
+
+During compilation:
+C<PL_comppad_name> is set to the names AV.
+C<PL_comppad> is set to the frame AV for the frame CvDEPTH == 1.
+C<PL_curpad> is set to the body of the frame AV (i.e. AvARRAY(PL_comppad)).
+
+During execution, C<PL_comppad> and C<PL_curpad> refer to the live
+frame of the currently executing sub.
+
+Iterating over the names AV iterates over all possible pad
+items. Pad slots that are SVs_PADTMP (targets/GVs/constants) end up having
+&PL_sv_undef "names" (see pad_alloc()).
+
+Only my/our variable (SVs_PADMY/SVs_PADOUR) slots get valid names.
+The rest are op targets/GVs/constants which are statically allocated
+or resolved at compile time. These don't have names by which they
+can be looked up from Perl code at run time through eval"" like
+my/our variables can be. Since they can't be looked up by "name"
+but only by their index allocated at compile time (which is usually
+in PL_op->op_targ), wasting a name SV for them doesn't make sense.
+
+The SVs in the names AV have their PV being the name of the variable.
+xlow+1..xhigh inclusive in the NV union is a range of cop_seq numbers for
+which the name is valid. For typed lexicals name SV is SVt_PVMG and SvSTASH
+points at the type. For C<our> lexicals, the type is also SVt_PVMG, with the
+SvOURSTASH slot pointing at the stash of the associated global (so that
+duplicate C<our> declarations in the same package can be detected). SvUVX is
+sometimes hijacked to store the generation number during compilation.
+
+If SvFAKE is set on the name SV, then that slot in the frame AV is
+a REFCNT'ed reference to a lexical from "outside". In this case,
+the name SV does not use xlow and xhigh to store a cop_seq range, since it is
+in scope throughout. Instead xhigh stores some flags containing info about
+the real lexical (is it declared in an anon, and is it capable of being
+instantiated multiple times?), and for fake ANONs, xlow contains the index
+within the parent's pad where the lexical's value is stored, to make
+cloning quicker.
+
+If the 'name' is '&' the corresponding entry in frame AV
+is a CV representing a possible closure.
+(SvFAKE and name of '&' is not a meaningful combination currently but could
+become so if C<my sub foo {}> is implemented.)
+
+Note that formats are treated as anon subs, and are cloned each time
+write is called (if necessary).
+
+The flag SVf_PADSTALE is cleared on lexicals each time the my() is executed,
+and set on scope exit. This allows the 'Variable $x is not available' warning
+to be generated in evals, such as
+
+ { my $x = 1; sub f { eval '$x'} } f();
+
+For state vars, SVf_PADSTALE is overloaded to mean 'not yet initialised'
+
+ AV * CvPADLIST(CV *cv)
+
+=for hackers
+Found in file pad.c
+
+=item cv_clone
+X<cv_clone>
+
+Clone a CV: make a new CV which points to the same code etc, but which
+has a newly-created pad built by copying the prototype pad and capturing
+any outer lexicals.
+
+ CV* cv_clone(CV* proto)
+
+=for hackers
+Found in file pad.c
+
+=item cv_dump
+X<cv_dump>
+
+dump the contents of a CV
+
+ void cv_dump(const CV *cv, const char *title)
+
+=for hackers
+Found in file pad.c
+
+=item do_dump_pad
+X<do_dump_pad>
+
+Dump the contents of a padlist
+
+ void do_dump_pad(I32 level, PerlIO *file, PADLIST *padlist, int full)
+
+=for hackers
+Found in file pad.c
+
+=item intro_my
+X<intro_my>
+
+"Introduce" my variables to visible status.
+
+ U32 intro_my()
+
+=for hackers
+Found in file pad.c
+
+=item pad_add_anon
+X<pad_add_anon>
+
+Add an anon code entry to the current compiling pad
+
+ PADOFFSET pad_add_anon(SV* sv, OPCODE op_type)
+
+=for hackers
+Found in file pad.c
+
+=item pad_add_name
+X<pad_add_name>
+
+Create a new name and associated PADMY SV in the current pad; return the
+offset.
+If C<typestash> is valid, the name is for a typed lexical; set the
+name's stash to that value.
+If C<ourstash> is valid, it's an our lexical, set the name's
+SvOURSTASH to that value
+
+If fake, it means we're cloning an existing entry
+
+ PADOFFSET pad_add_name(const char *name, HV* typestash, HV* ourstash, bool clone, bool state)
+
+=for hackers
+Found in file pad.c
+
+=item pad_alloc
+X<pad_alloc>
+
+Allocate a new my or tmp pad entry. For a my, simply push a null SV onto
+the end of PL_comppad, but for a tmp, scan the pad from PL_padix upwards
+for a slot which has no name and no active value.
+
+ PADOFFSET pad_alloc(I32 optype, U32 tmptype)
+
+=for hackers
+Found in file pad.c
+
+=item pad_block_start
+X<pad_block_start>
+
+Update the pad compilation state variables on entry to a new block
+
+ void pad_block_start(int full)
+
+=for hackers
+Found in file pad.c
+
+=item pad_check_dup
+X<pad_check_dup>
+
+Check for duplicate declarations: report any of:
+ * a my in the current scope with the same name;
+ * an our (anywhere in the pad) with the same name and the same stash
+ as C<ourstash>
+C<is_our> indicates that the name to check is an 'our' declaration
+
+ void pad_check_dup(const char* name, bool is_our, const HV* ourstash)
+
+=for hackers
+Found in file pad.c
+
+=item pad_findlex
+X<pad_findlex>
+
+Find a named lexical anywhere in a chain of nested pads. Add fake entries
+in the inner pads if it's found in an outer one.
+
+Returns the offset in the bottom pad of the lex or the fake lex.
+cv is the CV in which to start the search, and seq is the current cop_seq
+to match against. If warn is true, print appropriate warnings. The out_*
+vars return values, and so are pointers to where the returned values
+should be stored. out_capture, if non-null, requests that the innermost
+instance of the lexical is captured; out_name_sv is set to the innermost
+matched namesv or fake namesv; out_flags returns the flags normally
+associated with the IVX field of a fake namesv.
+
+Note that pad_findlex() is recursive; it recurses up the chain of CVs,
+then comes back down, adding fake entries as it goes. It has to be this way
+because fake namesvs in anon protoypes have to store in xlow the index into
+the parent pad.
+
+ PADOFFSET pad_findlex(const char *name, const CV* cv, U32 seq, int warn, SV** out_capture, SV** out_name_sv, int *out_flags)
+
+=for hackers
+Found in file pad.c
+
+=item pad_findmy
+X<pad_findmy>
+
+Given a lexical name, try to find its offset, first in the current pad,
+or failing that, in the pads of any lexically enclosing subs (including
+the complications introduced by eval). If the name is found in an outer pad,
+then a fake entry is added to the current pad.
+Returns the offset in the current pad, or NOT_IN_PAD on failure.
+
+ PADOFFSET pad_findmy(const char* name)
+
+=for hackers
+Found in file pad.c
+
+=item pad_fixup_inner_anons
+X<pad_fixup_inner_anons>
+
+For any anon CVs in the pad, change CvOUTSIDE of that CV from
+old_cv to new_cv if necessary. Needed when a newly-compiled CV has to be
+moved to a pre-existing CV struct.
+
+ void pad_fixup_inner_anons(PADLIST *padlist, CV *old_cv, CV *new_cv)
+
+=for hackers
+Found in file pad.c
+
+=item pad_free
+X<pad_free>
+
+Free the SV at offset po in the current pad.
+
+ void pad_free(PADOFFSET po)
+
+=for hackers
+Found in file pad.c
+
+=item pad_leavemy
+X<pad_leavemy>
+
+Cleanup at end of scope during compilation: set the max seq number for
+lexicals in this scope and warn of any lexicals that never got introduced.
+
+ void pad_leavemy()
+
+=for hackers
+Found in file pad.c
+
+=item pad_new
+X<pad_new>
+
+Create a new compiling padlist, saving and updating the various global
+vars at the same time as creating the pad itself. The following flags
+can be OR'ed together:
+
+ padnew_CLONE this pad is for a cloned CV
+ padnew_SAVE save old globals
+ padnew_SAVESUB also save extra stuff for start of sub
+
+ PADLIST* pad_new(int flags)
+
+=for hackers
+Found in file pad.c
+
+=item pad_push
+X<pad_push>
+
+Push a new pad frame onto the padlist, unless there's already a pad at
+this depth, in which case don't bother creating a new one. Then give
+the new pad an @_ in slot zero.
+
+ void pad_push(PADLIST *padlist, int depth)
+
+=for hackers
+Found in file pad.c
+
+=item pad_reset
+X<pad_reset>
+
+Mark all the current temporaries for reuse
+
+ void pad_reset()
+
+=for hackers
+Found in file pad.c
+
+=item pad_setsv
+X<pad_setsv>
+
+Set the entry at offset po in the current pad to sv.
+Use the macro PAD_SETSV() rather than calling this function directly.
+
+ void pad_setsv(PADOFFSET po, SV* sv)
+
+=for hackers
+Found in file pad.c
+
+=item pad_swipe
+X<pad_swipe>
+
+Abandon the tmp in the current pad at offset po and replace with a
+new one.
+
+ void pad_swipe(PADOFFSET po, bool refadjust)
+
+=for hackers
+Found in file pad.c
+
+=item pad_tidy
+X<pad_tidy>
+
+Tidy up a pad after we've finished compiling it:
+ * remove most stuff from the pads of anonsub prototypes;
+ * give it a @_;
+ * mark tmps as such.
+
+ void pad_tidy(padtidy_type type)
+
+=for hackers
+Found in file pad.c
+
+=item pad_undef
+X<pad_undef>
+
+Free the padlist associated with a CV.
+If parts of it happen to be current, we null the relevant
+PL_*pad* global vars so that we don't have any dangling references left.
+We also repoint the CvOUTSIDE of any about-to-be-orphaned
+inner subs to the outer of this cv.
+
+(This function should really be called pad_free, but the name was already
+taken)
+
+ void pad_undef(CV* cv)
+
+=for hackers
+Found in file pad.c
+
+
+=back
+
+=head1 Per-Interpreter Variables
+
+=over 8
+
+=item PL_DBsingle
+X<PL_DBsingle>
+
+When Perl is run in debugging mode, with the B<-d> switch, this SV is a
+boolean which indicates whether subs are being single-stepped.
+Single-stepping is automatically turned on after every step. This is the C
+variable which corresponds to Perl's $DB::single variable. See
+C<PL_DBsub>.
+
+ SV * PL_DBsingle
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_DBsub
+X<PL_DBsub>
+
+When Perl is run in debugging mode, with the B<-d> switch, this GV contains
+the SV which holds the name of the sub being debugged. This is the C
+variable which corresponds to Perl's $DB::sub variable. See
+C<PL_DBsingle>.
+
+ GV * PL_DBsub
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_DBtrace
+X<PL_DBtrace>
+
+Trace variable used when Perl is run in debugging mode, with the B<-d>
+switch. This is the C variable which corresponds to Perl's $DB::trace
+variable. See C<PL_DBsingle>.
+
+ SV * PL_DBtrace
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_dowarn
+X<PL_dowarn>
+
+The C variable which corresponds to Perl's $^W warning variable.
+
+ bool PL_dowarn
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_last_in_gv
+X<PL_last_in_gv>
+
+The GV which was last used for a filehandle input operation. (C<< <FH> >>)
+
+ GV* PL_last_in_gv
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_ofs_sv
+X<PL_ofs_sv>
+
+The output field separator - C<$,> in Perl space.
+
+ SV* PL_ofs_sv
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_rs
+X<PL_rs>
+
+The input record separator - C<$/> in Perl space.
+
+ SV* PL_rs
+
+=for hackers
+Found in file intrpvar.h
+
+
+=back
+
+=head1 Stack Manipulation Macros
+
+=over 8
+
+=item djSP
+X<djSP>
+
+Declare Just C<SP>. This is actually identical to C<dSP>, and declares
+a local copy of perl's stack pointer, available via the C<SP> macro.
+See C<SP>. (Available for backward source code compatibility with the
+old (Perl 5.005) thread model.)
+
+ djSP;
+
+=for hackers
+Found in file pp.h
+
+=item LVRET
+X<LVRET>
+
+True if this op will be the return value of an lvalue subroutine
+
+=for hackers
+Found in file pp.h
+
+
+=back
+
+=head1 SV Manipulation Functions
+
+=over 8
+
+=item sv_add_arena
+X<sv_add_arena>
+
+Given a chunk of memory, link it to the head of the list of arenas,
+and split it into a list of free SVs.
+
+ void sv_add_arena(char* ptr, U32 size, U32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_clean_all
+X<sv_clean_all>
+
+Decrement the refcnt of each remaining SV, possibly triggering a
+cleanup. This function may have to be called multiple times to free
+SVs which are in complex self-referential hierarchies.
+
+ I32 sv_clean_all()
+
+=for hackers
+Found in file sv.c
+
+=item sv_clean_objs
+X<sv_clean_objs>
+
+Attempt to destroy all objects not yet freed
+
+ void sv_clean_objs()
+
+=for hackers
+Found in file sv.c
+
+=item sv_free_arenas
+X<sv_free_arenas>
+
+Deallocate the memory used by all arenas. Note that all the individual SV
+heads and bodies within the arenas must already have been freed.
+
+ void sv_free_arenas()
+
+=for hackers
+Found in file sv.c
+
+
+=back
+
+=head1 SV-Body Allocation
+
+=over 8
+
+=item sv_2num
+X<sv_2num>
+
+Return an SV with the numeric value of the source SV, doing any necessary
+reference or overload conversion. You must use the C<SvNUM(sv)> macro to
+access this function.
+
+ SV* sv_2num(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+
+=back
+
+=head1 Unicode Support
+
+=over 8
+
+=item find_uninit_var
+X<find_uninit_var>
+
+Find the name of the undefined variable (if any) that caused the operator o
+to issue a "Use of uninitialized value" warning.
+If match is true, only return a name if it's value matches uninit_sv.
+So roughly speaking, if a unary operator (such as OP_COS) generates a
+warning, then following the direct child of the op may yield an
+OP_PADSV or OP_GV that gives the name of the undefined variable. On the
+other hand, with OP_ADD there are two branches to follow, so we only print
+the variable name if we get an exact match.
+
+The name is returned as a mortal SV.
+
+Assumes that PL_op is the op that originally triggered the error, and that
+PL_comppad/PL_curpad points to the currently executing pad.
+
+ SV* find_uninit_var(OP* obase, SV* uninit_sv, bool top)
+
+=for hackers
+Found in file sv.c
+
+=item report_uninit
+X<report_uninit>
+
+Print appropriate "Use of uninitialized variable" warning
+
+ void report_uninit(SV* uninit_sv)
+
+=for hackers
+Found in file sv.c
+
+
+=back
+
+=head1 AUTHORS
+
+The autodocumentation system was originally added to the Perl core by
+Benjamin Stuhl. Documentation is by whoever was kind enough to
+document their functions.
+
+=head1 SEE ALSO
+
+perlguts(1), perlapi(1)
+
+=cut
+
+ ex: set ro:
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlintro.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlintro.pod
new file mode 100755
index 00000000000..9973fd62c1b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlintro.pod
@@ -0,0 +1,679 @@
+=head1 NAME
+
+perlintro -- a brief introduction and overview of Perl
+
+=head1 DESCRIPTION
+
+This document is intended to give you a quick overview of the Perl
+programming language, along with pointers to further documentation. It
+is intended as a "bootstrap" guide for those who are new to the
+language, and provides just enough information for you to be able to
+read other peoples' Perl and understand roughly what it's doing, or
+write your own simple scripts.
+
+This introductory document does not aim to be complete. It does not
+even aim to be entirely accurate. In some cases perfection has been
+sacrificed in the goal of getting the general idea across. You are
+I<strongly> advised to follow this introduction with more information
+from the full Perl manual, the table of contents to which can be found
+in L<perltoc>.
+
+Throughout this document you'll see references to other parts of the
+Perl documentation. You can read that documentation using the C<perldoc>
+command or whatever method you're using to read this document.
+
+=head2 What is Perl?
+
+Perl is a general-purpose programming language originally developed for
+text manipulation and now used for a wide range of tasks including
+system administration, web development, network programming, GUI
+development, and more.
+
+The language is intended to be practical (easy to use, efficient,
+complete) rather than beautiful (tiny, elegant, minimal). Its major
+features are that it's easy to use, supports both procedural and
+object-oriented (OO) programming, has powerful built-in support for text
+processing, and has one of the world's most impressive collections of
+third-party modules.
+
+Different definitions of Perl are given in L<perl>, L<perlfaq1> and
+no doubt other places. From this we can determine that Perl is different
+things to different people, but that lots of people think it's at least
+worth writing about.
+
+=head2 Running Perl programs
+
+To run a Perl program from the Unix command line:
+
+ perl progname.pl
+
+Alternatively, put this as the first line of your script:
+
+ #!/usr/bin/env perl
+
+... and run the script as C</path/to/script.pl>. Of course, it'll need
+to be executable first, so C<chmod 755 script.pl> (under Unix).
+
+(This start line assumes you have the B<env> program. You can also put
+directly the path to your perl executable, like in C<#!/usr/bin/perl>).
+
+For more information, including instructions for other platforms such as
+Windows and Mac OS, read L<perlrun>.
+
+=head2 Safety net
+
+Perl by default is very forgiving. In order to make it more robust
+it is recommended to start every program with the following lines:
+
+ #!/usr/bin/perl
+ use strict;
+ use warnings;
+
+The two additional lines request from perl to catch various common
+problems in your code. They check different things so you need both. A
+potential problem caught by C<use strict;> will cause your code to stop
+immediately when it is encountered, while C<use warnings;> will merely
+give a warning (like the command-line switch B<-w>) and let your code run.
+To read more about them check their respective manual pages at L<strict>
+and L<warnings>.
+
+=head2 Basic syntax overview
+
+A Perl script or program consists of one or more statements. These
+statements are simply written in the script in a straightforward
+fashion. There is no need to have a C<main()> function or anything of
+that kind.
+
+Perl statements end in a semi-colon:
+
+ print "Hello, world";
+
+Comments start with a hash symbol and run to the end of the line
+
+ # This is a comment
+
+Whitespace is irrelevant:
+
+ print
+ "Hello, world"
+ ;
+
+... except inside quoted strings:
+
+ # this would print with a linebreak in the middle
+ print "Hello
+ world";
+
+Double quotes or single quotes may be used around literal strings:
+
+ print "Hello, world";
+ print 'Hello, world';
+
+However, only double quotes "interpolate" variables and special
+characters such as newlines (C<\n>):
+
+ print "Hello, $name\n"; # works fine
+ print 'Hello, $name\n'; # prints $name\n literally
+
+Numbers don't need quotes around them:
+
+ print 42;
+
+You can use parentheses for functions' arguments or omit them
+according to your personal taste. They are only required
+occasionally to clarify issues of precedence.
+
+ print("Hello, world\n");
+ print "Hello, world\n";
+
+More detailed information about Perl syntax can be found in L<perlsyn>.
+
+=head2 Perl variable types
+
+Perl has three main variable types: scalars, arrays, and hashes.
+
+=over 4
+
+=item Scalars
+
+A scalar represents a single value:
+
+ my $animal = "camel";
+ my $answer = 42;
+
+Scalar values can be strings, integers or floating point numbers, and Perl
+will automatically convert between them as required. There is no need
+to pre-declare your variable types, but you have to declare them using
+the C<my> keyword the first time you use them. (This is one of the
+requirements of C<use strict;>.)
+
+Scalar values can be used in various ways:
+
+ print $animal;
+ print "The animal is $animal\n";
+ print "The square of $answer is ", $answer * $answer, "\n";
+
+There are a number of "magic" scalars with names that look like
+punctuation or line noise. These special variables are used for all
+kinds of purposes, and are documented in L<perlvar>. The only one you
+need to know about for now is C<$_> which is the "default variable".
+It's used as the default argument to a number of functions in Perl, and
+it's set implicitly by certain looping constructs.
+
+ print; # prints contents of $_ by default
+
+=item Arrays
+
+An array represents a list of values:
+
+ my @animals = ("camel", "llama", "owl");
+ my @numbers = (23, 42, 69);
+ my @mixed = ("camel", 42, 1.23);
+
+Arrays are zero-indexed. Here's how you get at elements in an array:
+
+ print $animals[0]; # prints "camel"
+ print $animals[1]; # prints "llama"
+
+The special variable C<$#array> tells you the index of the last element
+of an array:
+
+ print $mixed[$#mixed]; # last element, prints 1.23
+
+You might be tempted to use C<$#array + 1> to tell you how many items there
+are in an array. Don't bother. As it happens, using C<@array> where Perl
+expects to find a scalar value ("in scalar context") will give you the number
+of elements in the array:
+
+ if (@animals < 5) { ... }
+
+The elements we're getting from the array start with a C<$> because
+we're getting just a single value out of the array -- you ask for a scalar,
+you get a scalar.
+
+To get multiple values from an array:
+
+ @animals[0,1]; # gives ("camel", "llama");
+ @animals[0..2]; # gives ("camel", "llama", "owl");
+ @animals[1..$#animals]; # gives all except the first element
+
+This is called an "array slice".
+
+You can do various useful things to lists:
+
+ my @sorted = sort @animals;
+ my @backwards = reverse @numbers;
+
+There are a couple of special arrays too, such as C<@ARGV> (the command
+line arguments to your script) and C<@_> (the arguments passed to a
+subroutine). These are documented in L<perlvar>.
+
+=item Hashes
+
+A hash represents a set of key/value pairs:
+
+ my %fruit_color = ("apple", "red", "banana", "yellow");
+
+You can use whitespace and the C<< => >> operator to lay them out more
+nicely:
+
+ my %fruit_color = (
+ apple => "red",
+ banana => "yellow",
+ );
+
+To get at hash elements:
+
+ $fruit_color{"apple"}; # gives "red"
+
+You can get at lists of keys and values with C<keys()> and
+C<values()>.
+
+ my @fruits = keys %fruit_colors;
+ my @colors = values %fruit_colors;
+
+Hashes have no particular internal order, though you can sort the keys
+and loop through them.
+
+Just like special scalars and arrays, there are also special hashes.
+The most well known of these is C<%ENV> which contains environment
+variables. Read all about it (and other special variables) in
+L<perlvar>.
+
+=back
+
+Scalars, arrays and hashes are documented more fully in L<perldata>.
+
+More complex data types can be constructed using references, which allow
+you to build lists and hashes within lists and hashes.
+
+A reference is a scalar value and can refer to any other Perl data
+type. So by storing a reference as the value of an array or hash
+element, you can easily create lists and hashes within lists and
+hashes. The following example shows a 2 level hash of hash
+structure using anonymous hash references.
+
+ my $variables = {
+ scalar => {
+ description => "single item",
+ sigil => '$',
+ },
+ array => {
+ description => "ordered list of items",
+ sigil => '@',
+ },
+ hash => {
+ description => "key/value pairs",
+ sigil => '%',
+ },
+ };
+
+ print "Scalars begin with a $variables->{'scalar'}->{'sigil'}\n";
+
+Exhaustive information on the topic of references can be found in
+L<perlreftut>, L<perllol>, L<perlref> and L<perldsc>.
+
+=head2 Variable scoping
+
+Throughout the previous section all the examples have used the syntax:
+
+ my $var = "value";
+
+The C<my> is actually not required; you could just use:
+
+ $var = "value";
+
+However, the above usage will create global variables throughout your
+program, which is bad programming practice. C<my> creates lexically
+scoped variables instead. The variables are scoped to the block
+(i.e. a bunch of statements surrounded by curly-braces) in which they
+are defined.
+
+ my $x = "foo";
+ my $some_condition = 1;
+ if ($some_condition) {
+ my $y = "bar";
+ print $x; # prints "foo"
+ print $y; # prints "bar"
+ }
+ print $x; # prints "foo"
+ print $y; # prints nothing; $y has fallen out of scope
+
+Using C<my> in combination with a C<use strict;> at the top of
+your Perl scripts means that the interpreter will pick up certain common
+programming errors. For instance, in the example above, the final
+C<print $y> would cause a compile-time error and prevent you from
+running the program. Using C<strict> is highly recommended.
+
+=head2 Conditional and looping constructs
+
+Perl has most of the usual conditional and looping constructs except for
+case/switch (but if you really want it, there is a Switch module in Perl
+5.8 and newer, and on CPAN. See the section on modules, below, for more
+information about modules and CPAN).
+
+The conditions can be any Perl expression. See the list of operators in
+the next section for information on comparison and boolean logic operators,
+which are commonly used in conditional statements.
+
+=over 4
+
+=item if
+
+ if ( condition ) {
+ ...
+ } elsif ( other condition ) {
+ ...
+ } else {
+ ...
+ }
+
+There's also a negated version of it:
+
+ unless ( condition ) {
+ ...
+ }
+
+This is provided as a more readable version of C<if (!I<condition>)>.
+
+Note that the braces are required in Perl, even if you've only got one
+line in the block. However, there is a clever way of making your one-line
+conditional blocks more English like:
+
+ # the traditional way
+ if ($zippy) {
+ print "Yow!";
+ }
+
+ # the Perlish post-condition way
+ print "Yow!" if $zippy;
+ print "We have no bananas" unless $bananas;
+
+=item while
+
+ while ( condition ) {
+ ...
+ }
+
+There's also a negated version, for the same reason we have C<unless>:
+
+ until ( condition ) {
+ ...
+ }
+
+You can also use C<while> in a post-condition:
+
+ print "LA LA LA\n" while 1; # loops forever
+
+=item for
+
+Exactly like C:
+
+ for ($i = 0; $i <= $max; $i++) {
+ ...
+ }
+
+The C style for loop is rarely needed in Perl since Perl provides
+the more friendly list scanning C<foreach> loop.
+
+=item foreach
+
+ foreach (@array) {
+ print "This element is $_\n";
+ }
+
+ print $list[$_] foreach 0 .. $max;
+
+ # you don't have to use the default $_ either...
+ foreach my $key (keys %hash) {
+ print "The value of $key is $hash{$key}\n";
+ }
+
+=back
+
+For more detail on looping constructs (and some that weren't mentioned in
+this overview) see L<perlsyn>.
+
+=head2 Builtin operators and functions
+
+Perl comes with a wide selection of builtin functions. Some of the ones
+we've already seen include C<print>, C<sort> and C<reverse>. A list of
+them is given at the start of L<perlfunc> and you can easily read
+about any given function by using C<perldoc -f I<functionname>>.
+
+Perl operators are documented in full in L<perlop>, but here are a few
+of the most common ones:
+
+=over 4
+
+=item Arithmetic
+
+ + addition
+ - subtraction
+ * multiplication
+ / division
+
+=item Numeric comparison
+
+ == equality
+ != inequality
+ < less than
+ > greater than
+ <= less than or equal
+ >= greater than or equal
+
+=item String comparison
+
+ eq equality
+ ne inequality
+ lt less than
+ gt greater than
+ le less than or equal
+ ge greater than or equal
+
+(Why do we have separate numeric and string comparisons? Because we don't
+have special variable types, and Perl needs to know whether to sort
+numerically (where 99 is less than 100) or alphabetically (where 100 comes
+before 99).
+
+=item Boolean logic
+
+ && and
+ || or
+ ! not
+
+(C<and>, C<or> and C<not> aren't just in the above table as descriptions
+of the operators -- they're also supported as operators in their own
+right. They're more readable than the C-style operators, but have
+different precedence to C<&&> and friends. Check L<perlop> for more
+detail.)
+
+=item Miscellaneous
+
+ = assignment
+ . string concatenation
+ x string multiplication
+ .. range operator (creates a list of numbers)
+
+=back
+
+Many operators can be combined with a C<=> as follows:
+
+ $a += 1; # same as $a = $a + 1
+ $a -= 1; # same as $a = $a - 1
+ $a .= "\n"; # same as $a = $a . "\n";
+
+=head2 Files and I/O
+
+You can open a file for input or output using the C<open()> function.
+It's documented in extravagant detail in L<perlfunc> and L<perlopentut>,
+but in short:
+
+ open(my $in, "<", "input.txt") or die "Can't open input.txt: $!";
+ open(my $out, ">", "output.txt") or die "Can't open output.txt: $!";
+ open(my $log, ">>", "my.log") or die "Can't open my.log: $!";
+
+You can read from an open filehandle using the C<< <> >> operator. In
+scalar context it reads a single line from the filehandle, and in list
+context it reads the whole file in, assigning each line to an element of
+the list:
+
+ my $line = <$in>;
+ my @lines = <$in>;
+
+Reading in the whole file at one time is called slurping. It can
+be useful but it may be a memory hog. Most text file processing
+can be done a line at a time with Perl's looping constructs.
+
+The C<< <> >> operator is most often seen in a C<while> loop:
+
+ while (<$in>) { # assigns each line in turn to $_
+ print "Just read in this line: $_";
+ }
+
+We've already seen how to print to standard output using C<print()>.
+However, C<print()> can also take an optional first argument specifying
+which filehandle to print to:
+
+ print STDERR "This is your final warning.\n";
+ print $out $record;
+ print $log $logmessage;
+
+When you're done with your filehandles, you should C<close()> them
+(though to be honest, Perl will clean up after you if you forget):
+
+ close $in or die "$in: $!";
+
+=head2 Regular expressions
+
+Perl's regular expression support is both broad and deep, and is the
+subject of lengthy documentation in L<perlrequick>, L<perlretut>, and
+elsewhere. However, in short:
+
+=over 4
+
+=item Simple matching
+
+ if (/foo/) { ... } # true if $_ contains "foo"
+ if ($a =~ /foo/) { ... } # true if $a contains "foo"
+
+The C<//> matching operator is documented in L<perlop>. It operates on
+C<$_> by default, or can be bound to another variable using the C<=~>
+binding operator (also documented in L<perlop>).
+
+=item Simple substitution
+
+ s/foo/bar/; # replaces foo with bar in $_
+ $a =~ s/foo/bar/; # replaces foo with bar in $a
+ $a =~ s/foo/bar/g; # replaces ALL INSTANCES of foo with bar in $a
+
+The C<s///> substitution operator is documented in L<perlop>.
+
+=item More complex regular expressions
+
+You don't just have to match on fixed strings. In fact, you can match
+on just about anything you could dream of by using more complex regular
+expressions. These are documented at great length in L<perlre>, but for
+the meantime, here's a quick cheat sheet:
+
+ . a single character
+ \s a whitespace character (space, tab, newline, ...)
+ \S non-whitespace character
+ \d a digit (0-9)
+ \D a non-digit
+ \w a word character (a-z, A-Z, 0-9, _)
+ \W a non-word character
+ [aeiou] matches a single character in the given set
+ [^aeiou] matches a single character outside the given set
+ (foo|bar|baz) matches any of the alternatives specified
+
+ ^ start of string
+ $ end of string
+
+Quantifiers can be used to specify how many of the previous thing you
+want to match on, where "thing" means either a literal character, one
+of the metacharacters listed above, or a group of characters or
+metacharacters in parentheses.
+
+ * zero or more of the previous thing
+ + one or more of the previous thing
+ ? zero or one of the previous thing
+ {3} matches exactly 3 of the previous thing
+ {3,6} matches between 3 and 6 of the previous thing
+ {3,} matches 3 or more of the previous thing
+
+Some brief examples:
+
+ /^\d+/ string starts with one or more digits
+ /^$/ nothing in the string (start and end are adjacent)
+ /(\d\s){3}/ a three digits, each followed by a whitespace
+ character (eg "3 4 5 ")
+ /(a.)+/ matches a string in which every odd-numbered letter
+ is a (eg "abacadaf")
+
+ # This loop reads from STDIN, and prints non-blank lines:
+ while (<>) {
+ next if /^$/;
+ print;
+ }
+
+=item Parentheses for capturing
+
+As well as grouping, parentheses serve a second purpose. They can be
+used to capture the results of parts of the regexp match for later use.
+The results end up in C<$1>, C<$2> and so on.
+
+ # a cheap and nasty way to break an email address up into parts
+
+ if ($email =~ /([^@]+)@(.+)/) {
+ print "Username is $1\n";
+ print "Hostname is $2\n";
+ }
+
+=item Other regexp features
+
+Perl regexps also support backreferences, lookaheads, and all kinds of
+other complex details. Read all about them in L<perlrequick>,
+L<perlretut>, and L<perlre>.
+
+=back
+
+=head2 Writing subroutines
+
+Writing subroutines is easy:
+
+ sub logger {
+ my $logmessage = shift;
+ open my $logfile, ">>", "my.log" or die "Could not open my.log: $!";
+ print $logfile $logmessage;
+ }
+
+Now we can use the subroutine just as any other built-in function:
+
+ logger("We have a logger subroutine!");
+
+What's that C<shift>? Well, the arguments to a subroutine are available
+to us as a special array called C<@_> (see L<perlvar> for more on that).
+The default argument to the C<shift> function just happens to be C<@_>.
+So C<my $logmessage = shift;> shifts the first item off the list of
+arguments and assigns it to C<$logmessage>.
+
+We can manipulate C<@_> in other ways too:
+
+ my ($logmessage, $priority) = @_; # common
+ my $logmessage = $_[0]; # uncommon, and ugly
+
+Subroutines can also return values:
+
+ sub square {
+ my $num = shift;
+ my $result = $num * $num;
+ return $result;
+ }
+
+Then use it like:
+
+ $sq = square(8);
+
+For more information on writing subroutines, see L<perlsub>.
+
+=head2 OO Perl
+
+OO Perl is relatively simple and is implemented using references which
+know what sort of object they are based on Perl's concept of packages.
+However, OO Perl is largely beyond the scope of this document.
+Read L<perlboot>, L<perltoot>, L<perltooc> and L<perlobj>.
+
+As a beginning Perl programmer, your most common use of OO Perl will be
+in using third-party modules, which are documented below.
+
+=head2 Using Perl modules
+
+Perl modules provide a range of features to help you avoid reinventing
+the wheel, and can be downloaded from CPAN ( http://www.cpan.org/ ). A
+number of popular modules are included with the Perl distribution
+itself.
+
+Categories of modules range from text manipulation to network protocols
+to database integration to graphics. A categorized list of modules is
+also available from CPAN.
+
+To learn how to install modules you download from CPAN, read
+L<perlmodinstall>.
+
+To learn how to use a particular module, use C<perldoc I<Module::Name>>.
+Typically you will want to C<use I<Module::Name>>, which will then give
+you access to exported functions or an OO interface to the module.
+
+L<perlfaq> contains questions and answers related to many common
+tasks, and often provides suggestions for good CPAN modules to use.
+
+L<perlmod> describes Perl modules in general. L<perlmodlib> lists the
+modules which came with your Perl installation.
+
+If you feel the urge to write Perl modules, L<perlnewmod> will give you
+good advice.
+
+=head1 AUTHOR
+
+Kirrily "Skud" Robert <skud@cpan.org>
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perliol.pod b/Master/tlpkg/tlperl.straw/lib/pods/perliol.pod
new file mode 100755
index 00000000000..a560d970cb6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perliol.pod
@@ -0,0 +1,1039 @@
+=head1 NAME
+
+perliol - C API for Perl's implementation of IO in Layers.
+
+=head1 SYNOPSIS
+
+ /* Defining a layer ... */
+ #include <perliol.h>
+
+=head1 DESCRIPTION
+
+This document describes the behavior and implementation of the PerlIO
+abstraction described in L<perlapio> when C<USE_PERLIO> is defined (and
+C<USE_SFIO> is not).
+
+=head2 History and Background
+
+The PerlIO abstraction was introduced in perl5.003_02 but languished as
+just an abstraction until perl5.7.0. However during that time a number
+of perl extensions switched to using it, so the API is mostly fixed to
+maintain (source) compatibility.
+
+The aim of the implementation is to provide the PerlIO API in a flexible
+and platform neutral manner. It is also a trial of an "Object Oriented
+C, with vtables" approach which may be applied to Perl 6.
+
+=head2 Basic Structure
+
+PerlIO is a stack of layers.
+
+The low levels of the stack work with the low-level operating system
+calls (file descriptors in C) getting bytes in and out, the higher
+layers of the stack buffer, filter, and otherwise manipulate the I/O,
+and return characters (or bytes) to Perl. Terms I<above> and I<below>
+are used to refer to the relative positioning of the stack layers.
+
+A layer contains a "vtable", the table of I/O operations (at C level
+a table of function pointers), and status flags. The functions in the
+vtable implement operations like "open", "read", and "write".
+
+When I/O, for example "read", is requested, the request goes from Perl
+first down the stack using "read" functions of each layer, then at the
+bottom the input is requested from the operating system services, then
+the result is returned up the stack, finally being interpreted as Perl
+data.
+
+The requests do not necessarily go always all the way down to the
+operating system: that's where PerlIO buffering comes into play.
+
+When you do an open() and specify extra PerlIO layers to be deployed,
+the layers you specify are "pushed" on top of the already existing
+default stack. One way to see it is that "operating system is
+on the left" and "Perl is on the right".
+
+What exact layers are in this default stack depends on a lot of
+things: your operating system, Perl version, Perl compile time
+configuration, and Perl runtime configuration. See L<PerlIO>,
+L<perlrun/PERLIO>, and L<open> for more information.
+
+binmode() operates similarly to open(): by default the specified
+layers are pushed on top of the existing stack.
+
+However, note that even as the specified layers are "pushed on top"
+for open() and binmode(), this doesn't mean that the effects are
+limited to the "top": PerlIO layers can be very 'active' and inspect
+and affect layers also deeper in the stack. As an example there
+is a layer called "raw" which repeatedly "pops" layers until
+it reaches the first layer that has declared itself capable of
+handling binary data. The "pushed" layers are processed in left-to-right
+order.
+
+sysopen() operates (unsurprisingly) at a lower level in the stack than
+open(). For example in UNIX or UNIX-like systems sysopen() operates
+directly at the level of file descriptors: in the terms of PerlIO
+layers, it uses only the "unix" layer, which is a rather thin wrapper
+on top of the UNIX file descriptors.
+
+=head2 Layers vs Disciplines
+
+Initial discussion of the ability to modify IO streams behaviour used
+the term "discipline" for the entities which were added. This came (I
+believe) from the use of the term in "sfio", which in turn borrowed it
+from "line disciplines" on Unix terminals. However, this document (and
+the C code) uses the term "layer".
+
+This is, I hope, a natural term given the implementation, and should
+avoid connotations that are inherent in earlier uses of "discipline"
+for things which are rather different.
+
+=head2 Data Structures
+
+The basic data structure is a PerlIOl:
+
+ typedef struct _PerlIO PerlIOl;
+ typedef struct _PerlIO_funcs PerlIO_funcs;
+ typedef PerlIOl *PerlIO;
+
+ struct _PerlIO
+ {
+ PerlIOl * next; /* Lower layer */
+ PerlIO_funcs * tab; /* Functions for this layer */
+ IV flags; /* Various flags for state */
+ };
+
+A C<PerlIOl *> is a pointer to the struct, and the I<application>
+level C<PerlIO *> is a pointer to a C<PerlIOl *> - i.e. a pointer
+to a pointer to the struct. This allows the application level C<PerlIO *>
+to remain constant while the actual C<PerlIOl *> underneath
+changes. (Compare perl's C<SV *> which remains constant while its
+C<sv_any> field changes as the scalar's type changes.) An IO stream is
+then in general represented as a pointer to this linked-list of
+"layers".
+
+It should be noted that because of the double indirection in a C<PerlIO *>,
+a C<< &(perlio->next) >> "is" a C<PerlIO *>, and so to some degree
+at least one layer can use the "standard" API on the next layer down.
+
+A "layer" is composed of two parts:
+
+=over 4
+
+=item 1.
+
+The functions and attributes of the "layer class".
+
+=item 2.
+
+The per-instance data for a particular handle.
+
+=back
+
+=head2 Functions and Attributes
+
+The functions and attributes are accessed via the "tab" (for table)
+member of C<PerlIOl>. The functions (methods of the layer "class") are
+fixed, and are defined by the C<PerlIO_funcs> type. They are broadly the
+same as the public C<PerlIO_xxxxx> functions:
+
+ struct _PerlIO_funcs
+ {
+ Size_t fsize;
+ char * name;
+ Size_t size;
+ IV kind;
+ IV (*Pushed)(pTHX_ PerlIO *f,const char *mode,SV *arg, PerlIO_funcs *tab);
+ IV (*Popped)(pTHX_ PerlIO *f);
+ PerlIO * (*Open)(pTHX_ PerlIO_funcs *tab,
+ PerlIO_list_t *layers, IV n,
+ const char *mode,
+ int fd, int imode, int perm,
+ PerlIO *old,
+ int narg, SV **args);
+ IV (*Binmode)(pTHX_ PerlIO *f);
+ SV * (*Getarg)(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
+ IV (*Fileno)(pTHX_ PerlIO *f);
+ PerlIO * (*Dup)(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
+ /* Unix-like functions - cf sfio line disciplines */
+ SSize_t (*Read)(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+ SSize_t (*Unread)(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+ SSize_t (*Write)(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+ IV (*Seek)(pTHX_ PerlIO *f, Off_t offset, int whence);
+ Off_t (*Tell)(pTHX_ PerlIO *f);
+ IV (*Close)(pTHX_ PerlIO *f);
+ /* Stdio-like buffered IO functions */
+ IV (*Flush)(pTHX_ PerlIO *f);
+ IV (*Fill)(pTHX_ PerlIO *f);
+ IV (*Eof)(pTHX_ PerlIO *f);
+ IV (*Error)(pTHX_ PerlIO *f);
+ void (*Clearerr)(pTHX_ PerlIO *f);
+ void (*Setlinebuf)(pTHX_ PerlIO *f);
+ /* Perl's snooping functions */
+ STDCHAR * (*Get_base)(pTHX_ PerlIO *f);
+ Size_t (*Get_bufsiz)(pTHX_ PerlIO *f);
+ STDCHAR * (*Get_ptr)(pTHX_ PerlIO *f);
+ SSize_t (*Get_cnt)(pTHX_ PerlIO *f);
+ void (*Set_ptrcnt)(pTHX_ PerlIO *f,STDCHAR *ptr,SSize_t cnt);
+ };
+
+The first few members of the struct give a function table size for
+compatibility check "name" for the layer, the size to C<malloc> for the per-instance data,
+and some flags which are attributes of the class as whole (such as whether it is a buffering
+layer), then follow the functions which fall into four basic groups:
+
+=over 4
+
+=item 1.
+
+Opening and setup functions
+
+=item 2.
+
+Basic IO operations
+
+=item 3.
+
+Stdio class buffering options.
+
+=item 4.
+
+Functions to support Perl's traditional "fast" access to the buffer.
+
+=back
+
+A layer does not have to implement all the functions, but the whole
+table has to be present. Unimplemented slots can be NULL (which will
+result in an error when called) or can be filled in with stubs to
+"inherit" behaviour from a "base class". This "inheritance" is fixed
+for all instances of the layer, but as the layer chooses which stubs
+to populate the table, limited "multiple inheritance" is possible.
+
+=head2 Per-instance Data
+
+The per-instance data are held in memory beyond the basic PerlIOl
+struct, by making a PerlIOl the first member of the layer's struct
+thus:
+
+ typedef struct
+ {
+ struct _PerlIO base; /* Base "class" info */
+ STDCHAR * buf; /* Start of buffer */
+ STDCHAR * end; /* End of valid part of buffer */
+ STDCHAR * ptr; /* Current position in buffer */
+ Off_t posn; /* Offset of buf into the file */
+ Size_t bufsiz; /* Real size of buffer */
+ IV oneword; /* Emergency buffer */
+ } PerlIOBuf;
+
+In this way (as for perl's scalars) a pointer to a PerlIOBuf can be
+treated as a pointer to a PerlIOl.
+
+=head2 Layers in action.
+
+ table perlio unix
+ | |
+ +-----------+ +----------+ +--------+
+ PerlIO ->| |--->| next |--->| NULL |
+ +-----------+ +----------+ +--------+
+ | | | buffer | | fd |
+ +-----------+ | | +--------+
+ | | +----------+
+
+
+The above attempts to show how the layer scheme works in a simple case.
+The application's C<PerlIO *> points to an entry in the table(s)
+representing open (allocated) handles. For example the first three slots
+in the table correspond to C<stdin>,C<stdout> and C<stderr>. The table
+in turn points to the current "top" layer for the handle - in this case
+an instance of the generic buffering layer "perlio". That layer in turn
+points to the next layer down - in this case the low-level "unix" layer.
+
+The above is roughly equivalent to a "stdio" buffered stream, but with
+much more flexibility:
+
+=over 4
+
+=item *
+
+If Unix level C<read>/C<write>/C<lseek> is not appropriate for (say)
+sockets then the "unix" layer can be replaced (at open time or even
+dynamically) with a "socket" layer.
+
+=item *
+
+Different handles can have different buffering schemes. The "top"
+layer could be the "mmap" layer if reading disk files was quicker
+using C<mmap> than C<read>. An "unbuffered" stream can be implemented
+simply by not having a buffer layer.
+
+=item *
+
+Extra layers can be inserted to process the data as it flows through.
+This was the driving need for including the scheme in perl 5.7.0+ - we
+needed a mechanism to allow data to be translated between perl's
+internal encoding (conceptually at least Unicode as UTF-8), and the
+"native" format used by the system. This is provided by the
+":encoding(xxxx)" layer which typically sits above the buffering layer.
+
+=item *
+
+A layer can be added that does "\n" to CRLF translation. This layer
+can be used on any platform, not just those that normally do such
+things.
+
+=back
+
+=head2 Per-instance flag bits
+
+The generic flag bits are a hybrid of C<O_XXXXX> style flags deduced
+from the mode string passed to C<PerlIO_open()>, and state bits for
+typical buffer layers.
+
+=over 4
+
+=item PERLIO_F_EOF
+
+End of file.
+
+=item PERLIO_F_CANWRITE
+
+Writes are permitted, i.e. opened as "w" or "r+" or "a", etc.
+
+=item PERLIO_F_CANREAD
+
+Reads are permitted i.e. opened "r" or "w+" (or even "a+" - ick).
+
+=item PERLIO_F_ERROR
+
+An error has occurred (for C<PerlIO_error()>).
+
+=item PERLIO_F_TRUNCATE
+
+Truncate file suggested by open mode.
+
+=item PERLIO_F_APPEND
+
+All writes should be appends.
+
+=item PERLIO_F_CRLF
+
+Layer is performing Win32-like "\n" mapped to CR,LF for output and CR,LF
+mapped to "\n" for input. Normally the provided "crlf" layer is the only
+layer that need bother about this. C<PerlIO_binmode()> will mess with this
+flag rather than add/remove layers if the C<PERLIO_K_CANCRLF> bit is set
+for the layers class.
+
+=item PERLIO_F_UTF8
+
+Data written to this layer should be UTF-8 encoded; data provided
+by this layer should be considered UTF-8 encoded. Can be set on any layer
+by ":utf8" dummy layer. Also set on ":encoding" layer.
+
+=item PERLIO_F_UNBUF
+
+Layer is unbuffered - i.e. write to next layer down should occur for
+each write to this layer.
+
+=item PERLIO_F_WRBUF
+
+The buffer for this layer currently holds data written to it but not sent
+to next layer.
+
+=item PERLIO_F_RDBUF
+
+The buffer for this layer currently holds unconsumed data read from
+layer below.
+
+=item PERLIO_F_LINEBUF
+
+Layer is line buffered. Write data should be passed to next layer down
+whenever a "\n" is seen. Any data beyond the "\n" should then be
+processed.
+
+=item PERLIO_F_TEMP
+
+File has been C<unlink()>ed, or should be deleted on C<close()>.
+
+=item PERLIO_F_OPEN
+
+Handle is open.
+
+=item PERLIO_F_FASTGETS
+
+This instance of this layer supports the "fast C<gets>" interface.
+Normally set based on C<PERLIO_K_FASTGETS> for the class and by the
+existence of the function(s) in the table. However a class that
+normally provides that interface may need to avoid it on a
+particular instance. The "pending" layer needs to do this when
+it is pushed above a layer which does not support the interface.
+(Perl's C<sv_gets()> does not expect the streams fast C<gets> behaviour
+to change during one "get".)
+
+=back
+
+=head2 Methods in Detail
+
+=over 4
+
+=item fsize
+
+ Size_t fsize;
+
+Size of the function table. This is compared against the value PerlIO
+code "knows" as a compatibility check. Future versions I<may> be able
+to tolerate layers compiled against an old version of the headers.
+
+=item name
+
+ char * name;
+
+The name of the layer whose open() method Perl should invoke on
+open(). For example if the layer is called APR, you will call:
+
+ open $fh, ">:APR", ...
+
+and Perl knows that it has to invoke the PerlIOAPR_open() method
+implemented by the APR layer.
+
+=item size
+
+ Size_t size;
+
+The size of the per-instance data structure, e.g.:
+
+ sizeof(PerlIOAPR)
+
+If this field is zero then C<PerlIO_pushed> does not malloc anything
+and assumes layer's Pushed function will do any required layer stack
+manipulation - used to avoid malloc/free overhead for dummy layers.
+If the field is non-zero it must be at least the size of C<PerlIOl>,
+C<PerlIO_pushed> will allocate memory for the layer's data structures
+and link new layer onto the stream's stack. (If the layer's Pushed
+method returns an error indication the layer is popped again.)
+
+=item kind
+
+ IV kind;
+
+=over 4
+
+=item * PERLIO_K_BUFFERED
+
+The layer is buffered.
+
+=item * PERLIO_K_RAW
+
+The layer is acceptable to have in a binmode(FH) stack - i.e. it does not
+(or will configure itself not to) transform bytes passing through it.
+
+=item * PERLIO_K_CANCRLF
+
+Layer can translate between "\n" and CRLF line ends.
+
+=item * PERLIO_K_FASTGETS
+
+Layer allows buffer snooping.
+
+=item * PERLIO_K_MULTIARG
+
+Used when the layer's open() accepts more arguments than usual. The
+extra arguments should come not before the C<MODE> argument. When this
+flag is used it's up to the layer to validate the args.
+
+=back
+
+=item Pushed
+
+ IV (*Pushed)(pTHX_ PerlIO *f,const char *mode, SV *arg);
+
+The only absolutely mandatory method. Called when the layer is pushed
+onto the stack. The C<mode> argument may be NULL if this occurs
+post-open. The C<arg> will be non-C<NULL> if an argument string was
+passed. In most cases this should call C<PerlIOBase_pushed()> to
+convert C<mode> into the appropriate C<PERLIO_F_XXXXX> flags in
+addition to any actions the layer itself takes. If a layer is not
+expecting an argument it need neither save the one passed to it, nor
+provide C<Getarg()> (it could perhaps C<Perl_warn> that the argument
+was un-expected).
+
+Returns 0 on success. On failure returns -1 and should set errno.
+
+=item Popped
+
+ IV (*Popped)(pTHX_ PerlIO *f);
+
+Called when the layer is popped from the stack. A layer will normally
+be popped after C<Close()> is called. But a layer can be popped
+without being closed if the program is dynamically managing layers on
+the stream. In such cases C<Popped()> should free any resources
+(buffers, translation tables, ...) not held directly in the layer's
+struct. It should also C<Unread()> any unconsumed data that has been
+read and buffered from the layer below back to that layer, so that it
+can be re-provided to what ever is now above.
+
+Returns 0 on success and failure. If C<Popped()> returns I<true> then
+I<perlio.c> assumes that either the layer has popped itself, or the
+layer is super special and needs to be retained for other reasons.
+In most cases it should return I<false>.
+
+=item Open
+
+ PerlIO * (*Open)(...);
+
+The C<Open()> method has lots of arguments because it combines the
+functions of perl's C<open>, C<PerlIO_open>, perl's C<sysopen>,
+C<PerlIO_fdopen> and C<PerlIO_reopen>. The full prototype is as
+follows:
+
+ PerlIO * (*Open)(pTHX_ PerlIO_funcs *tab,
+ PerlIO_list_t *layers, IV n,
+ const char *mode,
+ int fd, int imode, int perm,
+ PerlIO *old,
+ int narg, SV **args);
+
+Open should (perhaps indirectly) call C<PerlIO_allocate()> to allocate
+a slot in the table and associate it with the layers information for
+the opened file, by calling C<PerlIO_push>. The I<layers> is an
+array of all the layers destined for the C<PerlIO *>, and any
+arguments passed to them, I<n> is the index into that array of the
+layer being called. The macro C<PerlIOArg> will return a (possibly
+C<NULL>) SV * for the argument passed to the layer.
+
+The I<mode> string is an "C<fopen()>-like" string which would match
+the regular expression C</^[I#]?[rwa]\+?[bt]?$/>.
+
+The C<'I'> prefix is used during creation of C<stdin>..C<stderr> via
+special C<PerlIO_fdopen> calls; the C<'#'> prefix means that this is
+C<sysopen> and that I<imode> and I<perm> should be passed to
+C<PerlLIO_open3>; C<'r'> means B<r>ead, C<'w'> means B<w>rite and
+C<'a'> means B<a>ppend. The C<'+'> suffix means that both reading and
+writing/appending are permitted. The C<'b'> suffix means file should
+be binary, and C<'t'> means it is text. (Almost all layers should do
+the IO in binary mode, and ignore the b/t bits. The C<:crlf> layer
+should be pushed to handle the distinction.)
+
+If I<old> is not C<NULL> then this is a C<PerlIO_reopen>. Perl itself
+does not use this (yet?) and semantics are a little vague.
+
+If I<fd> not negative then it is the numeric file descriptor I<fd>,
+which will be open in a manner compatible with the supplied mode
+string, the call is thus equivalent to C<PerlIO_fdopen>. In this case
+I<nargs> will be zero.
+
+If I<nargs> is greater than zero then it gives the number of arguments
+passed to C<open>, otherwise it will be 1 if for example
+C<PerlIO_open> was called. In simple cases SvPV_nolen(*args) is the
+pathname to open.
+
+Having said all that translation-only layers do not need to provide
+C<Open()> at all, but rather leave the opening to a lower level layer
+and wait to be "pushed". If a layer does provide C<Open()> it should
+normally call the C<Open()> method of next layer down (if any) and
+then push itself on top if that succeeds.
+
+If C<PerlIO_push> was performed and open has failed, it must
+C<PerlIO_pop> itself, since if it's not, the layer won't be removed
+and may cause bad problems.
+
+Returns C<NULL> on failure.
+
+=item Binmode
+
+ IV (*Binmode)(pTHX_ PerlIO *f);
+
+Optional. Used when C<:raw> layer is pushed (explicitly or as a result
+of binmode(FH)). If not present layer will be popped. If present
+should configure layer as binary (or pop itself) and return 0.
+If it returns -1 for error C<binmode> will fail with layer
+still on the stack.
+
+=item Getarg
+
+ SV * (*Getarg)(pTHX_ PerlIO *f,
+ CLONE_PARAMS *param, int flags);
+
+Optional. If present should return an SV * representing the string
+argument passed to the layer when it was
+pushed. e.g. ":encoding(ascii)" would return an SvPV with value
+"ascii". (I<param> and I<flags> arguments can be ignored in most
+cases)
+
+C<Dup> uses C<Getarg> to retrieve the argument originally passed to
+C<Pushed>, so you must implement this function if your layer has an
+extra argument to C<Pushed> and will ever be C<Dup>ed.
+
+=item Fileno
+
+ IV (*Fileno)(pTHX_ PerlIO *f);
+
+Returns the Unix/Posix numeric file descriptor for the handle. Normally
+C<PerlIOBase_fileno()> (which just asks next layer down) will suffice
+for this.
+
+Returns -1 on error, which is considered to include the case where the
+layer cannot provide such a file descriptor.
+
+=item Dup
+
+ PerlIO * (*Dup)(pTHX_ PerlIO *f, PerlIO *o,
+ CLONE_PARAMS *param, int flags);
+
+XXX: Needs more docs.
+
+Used as part of the "clone" process when a thread is spawned (in which
+case param will be non-NULL) and when a stream is being duplicated via
+'&' in the C<open>.
+
+Similar to C<Open>, returns PerlIO* on success, C<NULL> on failure.
+
+=item Read
+
+ SSize_t (*Read)(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+
+Basic read operation.
+
+Typically will call C<Fill> and manipulate pointers (possibly via the
+API). C<PerlIOBuf_read()> may be suitable for derived classes which
+provide "fast gets" methods.
+
+Returns actual bytes read, or -1 on an error.
+
+=item Unread
+
+ SSize_t (*Unread)(pTHX_ PerlIO *f,
+ const void *vbuf, Size_t count);
+
+A superset of stdio's C<ungetc()>. Should arrange for future reads to
+see the bytes in C<vbuf>. If there is no obviously better implementation
+then C<PerlIOBase_unread()> provides the function by pushing a "fake"
+"pending" layer above the calling layer.
+
+Returns the number of unread chars.
+
+=item Write
+
+ SSize_t (*Write)(PerlIO *f, const void *vbuf, Size_t count);
+
+Basic write operation.
+
+Returns bytes written or -1 on an error.
+
+=item Seek
+
+ IV (*Seek)(pTHX_ PerlIO *f, Off_t offset, int whence);
+
+Position the file pointer. Should normally call its own C<Flush>
+method and then the C<Seek> method of next layer down.
+
+Returns 0 on success, -1 on failure.
+
+=item Tell
+
+ Off_t (*Tell)(pTHX_ PerlIO *f);
+
+Return the file pointer. May be based on layers cached concept of
+position to avoid overhead.
+
+Returns -1 on failure to get the file pointer.
+
+=item Close
+
+ IV (*Close)(pTHX_ PerlIO *f);
+
+Close the stream. Should normally call C<PerlIOBase_close()> to flush
+itself and close layers below, and then deallocate any data structures
+(buffers, translation tables, ...) not held directly in the data
+structure.
+
+Returns 0 on success, -1 on failure.
+
+=item Flush
+
+ IV (*Flush)(pTHX_ PerlIO *f);
+
+Should make stream's state consistent with layers below. That is, any
+buffered write data should be written, and file position of lower layers
+adjusted for data read from below but not actually consumed.
+(Should perhaps C<Unread()> such data to the lower layer.)
+
+Returns 0 on success, -1 on failure.
+
+=item Fill
+
+ IV (*Fill)(pTHX_ PerlIO *f);
+
+The buffer for this layer should be filled (for read) from layer
+below. When you "subclass" PerlIOBuf layer, you want to use its
+I<_read> method and to supply your own fill method, which fills the
+PerlIOBuf's buffer.
+
+Returns 0 on success, -1 on failure.
+
+=item Eof
+
+ IV (*Eof)(pTHX_ PerlIO *f);
+
+Return end-of-file indicator. C<PerlIOBase_eof()> is normally sufficient.
+
+Returns 0 on end-of-file, 1 if not end-of-file, -1 on error.
+
+=item Error
+
+ IV (*Error)(pTHX_ PerlIO *f);
+
+Return error indicator. C<PerlIOBase_error()> is normally sufficient.
+
+Returns 1 if there is an error (usually when C<PERLIO_F_ERROR> is set,
+0 otherwise.
+
+=item Clearerr
+
+ void (*Clearerr)(pTHX_ PerlIO *f);
+
+Clear end-of-file and error indicators. Should call C<PerlIOBase_clearerr()>
+to set the C<PERLIO_F_XXXXX> flags, which may suffice.
+
+=item Setlinebuf
+
+ void (*Setlinebuf)(pTHX_ PerlIO *f);
+
+Mark the stream as line buffered. C<PerlIOBase_setlinebuf()> sets the
+PERLIO_F_LINEBUF flag and is normally sufficient.
+
+=item Get_base
+
+ STDCHAR * (*Get_base)(pTHX_ PerlIO *f);
+
+Allocate (if not already done so) the read buffer for this layer and
+return pointer to it. Return NULL on failure.
+
+=item Get_bufsiz
+
+ Size_t (*Get_bufsiz)(pTHX_ PerlIO *f);
+
+Return the number of bytes that last C<Fill()> put in the buffer.
+
+=item Get_ptr
+
+ STDCHAR * (*Get_ptr)(pTHX_ PerlIO *f);
+
+Return the current read pointer relative to this layer's buffer.
+
+=item Get_cnt
+
+ SSize_t (*Get_cnt)(pTHX_ PerlIO *f);
+
+Return the number of bytes left to be read in the current buffer.
+
+=item Set_ptrcnt
+
+ void (*Set_ptrcnt)(pTHX_ PerlIO *f,
+ STDCHAR *ptr, SSize_t cnt);
+
+Adjust the read pointer and count of bytes to match C<ptr> and/or C<cnt>.
+The application (or layer above) must ensure they are consistent.
+(Checking is allowed by the paranoid.)
+
+=back
+
+=head2 Utilities
+
+To ask for the next layer down use PerlIONext(PerlIO *f).
+
+To check that a PerlIO* is valid use PerlIOValid(PerlIO *f). (All
+this does is really just to check that the pointer is non-NULL and
+that the pointer behind that is non-NULL.)
+
+PerlIOBase(PerlIO *f) returns the "Base" pointer, or in other words,
+the C<PerlIOl*> pointer.
+
+PerlIOSelf(PerlIO* f, type) return the PerlIOBase cast to a type.
+
+Perl_PerlIO_or_Base(PerlIO* f, callback, base, failure, args) either
+calls the I<callback> from the functions of the layer I<f> (just by
+the name of the IO function, like "Read") with the I<args>, or if
+there is no such callback, calls the I<base> version of the callback
+with the same args, or if the f is invalid, set errno to EBADF and
+return I<failure>.
+
+Perl_PerlIO_or_fail(PerlIO* f, callback, failure, args) either calls
+the I<callback> of the functions of the layer I<f> with the I<args>,
+or if there is no such callback, set errno to EINVAL. Or if the f is
+invalid, set errno to EBADF and return I<failure>.
+
+Perl_PerlIO_or_Base_void(PerlIO* f, callback, base, args) either calls
+the I<callback> of the functions of the layer I<f> with the I<args>,
+or if there is no such callback, calls the I<base> version of the
+callback with the same args, or if the f is invalid, set errno to
+EBADF.
+
+Perl_PerlIO_or_fail_void(PerlIO* f, callback, args) either calls the
+I<callback> of the functions of the layer I<f> with the I<args>, or if
+there is no such callback, set errno to EINVAL. Or if the f is
+invalid, set errno to EBADF.
+
+=head2 Implementing PerlIO Layers
+
+If you find the implementation document unclear or not sufficient,
+look at the existing PerlIO layer implementations, which include:
+
+=over
+
+=item * C implementations
+
+The F<perlio.c> and F<perliol.h> in the Perl core implement the
+"unix", "perlio", "stdio", "crlf", "utf8", "byte", "raw", "pending"
+layers, and also the "mmap" and "win32" layers if applicable.
+(The "win32" is currently unfinished and unused, to see what is used
+instead in Win32, see L<PerlIO/"Querying the layers of filehandles"> .)
+
+PerlIO::encoding, PerlIO::scalar, PerlIO::via in the Perl core.
+
+PerlIO::gzip and APR::PerlIO (mod_perl 2.0) on CPAN.
+
+=item * Perl implementations
+
+PerlIO::via::QuotedPrint in the Perl core and PerlIO::via::* on CPAN.
+
+=back
+
+If you are creating a PerlIO layer, you may want to be lazy, in other
+words, implement only the methods that interest you. The other methods
+you can either replace with the "blank" methods
+
+ PerlIOBase_noop_ok
+ PerlIOBase_noop_fail
+
+(which do nothing, and return zero and -1, respectively) or for
+certain methods you may assume a default behaviour by using a NULL
+method. The Open method looks for help in the 'parent' layer.
+The following table summarizes the behaviour:
+
+ method behaviour with NULL
+
+ Clearerr PerlIOBase_clearerr
+ Close PerlIOBase_close
+ Dup PerlIOBase_dup
+ Eof PerlIOBase_eof
+ Error PerlIOBase_error
+ Fileno PerlIOBase_fileno
+ Fill FAILURE
+ Flush SUCCESS
+ Getarg SUCCESS
+ Get_base FAILURE
+ Get_bufsiz FAILURE
+ Get_cnt FAILURE
+ Get_ptr FAILURE
+ Open INHERITED
+ Popped SUCCESS
+ Pushed SUCCESS
+ Read PerlIOBase_read
+ Seek FAILURE
+ Set_cnt FAILURE
+ Set_ptrcnt FAILURE
+ Setlinebuf PerlIOBase_setlinebuf
+ Tell FAILURE
+ Unread PerlIOBase_unread
+ Write FAILURE
+
+ FAILURE Set errno (to EINVAL in UNIXish, to LIB$_INVARG in VMS) and
+ return -1 (for numeric return values) or NULL (for pointers)
+ INHERITED Inherited from the layer below
+ SUCCESS Return 0 (for numeric return values) or a pointer
+
+=head2 Core Layers
+
+The file C<perlio.c> provides the following layers:
+
+=over 4
+
+=item "unix"
+
+A basic non-buffered layer which calls Unix/POSIX C<read()>, C<write()>,
+C<lseek()>, C<close()>. No buffering. Even on platforms that distinguish
+between O_TEXT and O_BINARY this layer is always O_BINARY.
+
+=item "perlio"
+
+A very complete generic buffering layer which provides the whole of
+PerlIO API. It is also intended to be used as a "base class" for other
+layers. (For example its C<Read()> method is implemented in terms of
+the C<Get_cnt()>/C<Get_ptr()>/C<Set_ptrcnt()> methods).
+
+"perlio" over "unix" provides a complete replacement for stdio as seen
+via PerlIO API. This is the default for USE_PERLIO when system's stdio
+does not permit perl's "fast gets" access, and which do not
+distinguish between C<O_TEXT> and C<O_BINARY>.
+
+=item "stdio"
+
+A layer which provides the PerlIO API via the layer scheme, but
+implements it by calling system's stdio. This is (currently) the default
+if system's stdio provides sufficient access to allow perl's "fast gets"
+access and which do not distinguish between C<O_TEXT> and C<O_BINARY>.
+
+=item "crlf"
+
+A layer derived using "perlio" as a base class. It provides Win32-like
+"\n" to CR,LF translation. Can either be applied above "perlio" or serve
+as the buffer layer itself. "crlf" over "unix" is the default if system
+distinguishes between C<O_TEXT> and C<O_BINARY> opens. (At some point
+"unix" will be replaced by a "native" Win32 IO layer on that platform,
+as Win32's read/write layer has various drawbacks.) The "crlf" layer is
+a reasonable model for a layer which transforms data in some way.
+
+=item "mmap"
+
+If Configure detects C<mmap()> functions this layer is provided (with
+"perlio" as a "base") which does "read" operations by mmap()ing the
+file. Performance improvement is marginal on modern systems, so it is
+mainly there as a proof of concept. It is likely to be unbundled from
+the core at some point. The "mmap" layer is a reasonable model for a
+minimalist "derived" layer.
+
+=item "pending"
+
+An "internal" derivative of "perlio" which can be used to provide
+Unread() function for layers which have no buffer or cannot be
+bothered. (Basically this layer's C<Fill()> pops itself off the stack
+and so resumes reading from layer below.)
+
+=item "raw"
+
+A dummy layer which never exists on the layer stack. Instead when
+"pushed" it actually pops the stack removing itself, it then calls
+Binmode function table entry on all the layers in the stack - normally
+this (via PerlIOBase_binmode) removes any layers which do not have
+C<PERLIO_K_RAW> bit set. Layers can modify that behaviour by defining
+their own Binmode entry.
+
+=item "utf8"
+
+Another dummy layer. When pushed it pops itself and sets the
+C<PERLIO_F_UTF8> flag on the layer which was (and now is once more)
+the top of the stack.
+
+=back
+
+In addition F<perlio.c> also provides a number of C<PerlIOBase_xxxx()>
+functions which are intended to be used in the table slots of classes
+which do not need to do anything special for a particular method.
+
+=head2 Extension Layers
+
+Layers can made available by extension modules. When an unknown layer
+is encountered the PerlIO code will perform the equivalent of :
+
+ use PerlIO 'layer';
+
+Where I<layer> is the unknown layer. F<PerlIO.pm> will then attempt to:
+
+ require PerlIO::layer;
+
+If after that process the layer is still not defined then the C<open>
+will fail.
+
+The following extension layers are bundled with perl:
+
+=over 4
+
+=item ":encoding"
+
+ use Encoding;
+
+makes this layer available, although F<PerlIO.pm> "knows" where to
+find it. It is an example of a layer which takes an argument as it is
+called thus:
+
+ open( $fh, "<:encoding(iso-8859-7)", $pathname );
+
+=item ":scalar"
+
+Provides support for reading data from and writing data to a scalar.
+
+ open( $fh, "+<:scalar", \$scalar );
+
+When a handle is so opened, then reads get bytes from the string value
+of I<$scalar>, and writes change the value. In both cases the position
+in I<$scalar> starts as zero but can be altered via C<seek>, and
+determined via C<tell>.
+
+Please note that this layer is implied when calling open() thus:
+
+ open( $fh, "+<", \$scalar );
+
+=item ":via"
+
+Provided to allow layers to be implemented as Perl code. For instance:
+
+ use PerlIO::via::StripHTML;
+ open( my $fh, "<:via(StripHTML)", "index.html" );
+
+See L<PerlIO::via> for details.
+
+=back
+
+=head1 TODO
+
+Things that need to be done to improve this document.
+
+=over
+
+=item *
+
+Explain how to make a valid fh without going through open()(i.e. apply
+a layer). For example if the file is not opened through perl, but we
+want to get back a fh, like it was opened by Perl.
+
+How PerlIO_apply_layera fits in, where its docs, was it made public?
+
+Currently the example could be something like this:
+
+ PerlIO *foo_to_PerlIO(pTHX_ char *mode, ...)
+ {
+ char *mode; /* "w", "r", etc */
+ const char *layers = ":APR"; /* the layer name */
+ PerlIO *f = PerlIO_allocate(aTHX);
+ if (!f) {
+ return NULL;
+ }
+
+ PerlIO_apply_layers(aTHX_ f, mode, layers);
+
+ if (f) {
+ PerlIOAPR *st = PerlIOSelf(f, PerlIOAPR);
+ /* fill in the st struct, as in _open() */
+ st->file = file;
+ PerlIOBase(f)->flags |= PERLIO_F_OPEN;
+
+ return f;
+ }
+ return NULL;
+ }
+
+=item *
+
+fix/add the documentation in places marked as XXX.
+
+=item *
+
+The handling of errors by the layer is not specified. e.g. when $!
+should be set explicitly, when the error handling should be just
+delegated to the top layer.
+
+Probably give some hints on using SETERRNO() or pointers to where they
+can be found.
+
+=item *
+
+I think it would help to give some concrete examples to make it easier
+to understand the API. Of course I agree that the API has to be
+concise, but since there is no second document that is more of a
+guide, I think that it'd make it easier to start with the doc which is
+an API, but has examples in it in places where things are unclear, to
+a person who is not a PerlIO guru (yet).
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlipc.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlipc.pod
new file mode 100755
index 00000000000..77f0b6e3a23
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlipc.pod
@@ -0,0 +1,1818 @@
+=head1 NAME
+
+perlipc - Perl interprocess communication (signals, fifos, pipes, safe subprocesses, sockets, and semaphores)
+
+=head1 DESCRIPTION
+
+The basic IPC facilities of Perl are built out of the good old Unix
+signals, named pipes, pipe opens, the Berkeley socket routines, and SysV
+IPC calls. Each is used in slightly different situations.
+
+=head1 Signals
+
+Perl uses a simple signal handling model: the %SIG hash contains names
+or references of user-installed signal handlers. These handlers will
+be called with an argument which is the name of the signal that
+triggered it. A signal may be generated intentionally from a
+particular keyboard sequence like control-C or control-Z, sent to you
+from another process, or triggered automatically by the kernel when
+special events transpire, like a child process exiting, your process
+running out of stack space, or hitting file size limit.
+
+For example, to trap an interrupt signal, set up a handler like this:
+
+ sub catch_zap {
+ my $signame = shift;
+ $shucks++;
+ die "Somebody sent me a SIG$signame";
+ }
+ $SIG{INT} = 'catch_zap'; # could fail in modules
+ $SIG{INT} = \&catch_zap; # best strategy
+
+Prior to Perl 5.7.3 it was necessary to do as little as you possibly
+could in your handler; notice how all we do is set a global variable
+and then raise an exception. That's because on most systems,
+libraries are not re-entrant; particularly, memory allocation and I/O
+routines are not. That meant that doing nearly I<anything> in your
+handler could in theory trigger a memory fault and subsequent core
+dump - see L</Deferred Signals (Safe Signals)> below.
+
+The names of the signals are the ones listed out by C<kill -l> on your
+system, or you can retrieve them from the Config module. Set up an
+@signame list indexed by number to get the name and a %signo table
+indexed by name to get the number:
+
+ use Config;
+ defined $Config{sig_name} || die "No sigs?";
+ foreach $name (split(' ', $Config{sig_name})) {
+ $signo{$name} = $i;
+ $signame[$i] = $name;
+ $i++;
+ }
+
+So to check whether signal 17 and SIGALRM were the same, do just this:
+
+ print "signal #17 = $signame[17]\n";
+ if ($signo{ALRM}) {
+ print "SIGALRM is $signo{ALRM}\n";
+ }
+
+You may also choose to assign the strings C<'IGNORE'> or C<'DEFAULT'> as
+the handler, in which case Perl will try to discard the signal or do the
+default thing.
+
+On most Unix platforms, the C<CHLD> (sometimes also known as C<CLD>) signal
+has special behavior with respect to a value of C<'IGNORE'>.
+Setting C<$SIG{CHLD}> to C<'IGNORE'> on such a platform has the effect of
+not creating zombie processes when the parent process fails to C<wait()>
+on its child processes (i.e. child processes are automatically reaped).
+Calling C<wait()> with C<$SIG{CHLD}> set to C<'IGNORE'> usually returns
+C<-1> on such platforms.
+
+Some signals can be neither trapped nor ignored, such as
+the KILL and STOP (but not the TSTP) signals. One strategy for
+temporarily ignoring signals is to use a local() statement, which will be
+automatically restored once your block is exited. (Remember that local()
+values are "inherited" by functions called from within that block.)
+
+ sub precious {
+ local $SIG{INT} = 'IGNORE';
+ &more_functions;
+ }
+ sub more_functions {
+ # interrupts still ignored, for now...
+ }
+
+Sending a signal to a negative process ID means that you send the signal
+to the entire Unix process-group. This code sends a hang-up signal to all
+processes in the current process group (and sets $SIG{HUP} to IGNORE so
+it doesn't kill itself):
+
+ {
+ local $SIG{HUP} = 'IGNORE';
+ kill HUP => -$$;
+ # snazzy writing of: kill('HUP', -$$)
+ }
+
+Another interesting signal to send is signal number zero. This doesn't
+actually affect a child process, but instead checks whether it's alive
+or has changed its UID.
+
+ unless (kill 0 => $kid_pid) {
+ warn "something wicked happened to $kid_pid";
+ }
+
+When directed at a process whose UID is not identical to that
+of the sending process, signal number zero may fail because
+you lack permission to send the signal, even though the process is alive.
+You may be able to determine the cause of failure using C<%!>.
+
+ unless (kill 0 => $pid or $!{EPERM}) {
+ warn "$pid looks dead";
+ }
+
+You might also want to employ anonymous functions for simple signal
+handlers:
+
+ $SIG{INT} = sub { die "\nOutta here!\n" };
+
+But that will be problematic for the more complicated handlers that need
+to reinstall themselves. Because Perl's signal mechanism is currently
+based on the signal(3) function from the C library, you may sometimes be so
+unfortunate as to run on systems where that function is "broken", that
+is, it behaves in the old unreliable SysV way rather than the newer, more
+reasonable BSD and POSIX fashion. So you'll see defensive people writing
+signal handlers like this:
+
+ sub REAPER {
+ $waitedpid = wait;
+ # loathe SysV: it makes us not only reinstate
+ # the handler, but place it after the wait
+ $SIG{CHLD} = \&REAPER;
+ }
+ $SIG{CHLD} = \&REAPER;
+ # now do something that forks...
+
+or better still:
+
+ use POSIX ":sys_wait_h";
+ sub REAPER {
+ my $child;
+ # If a second child dies while in the signal handler caused by the
+ # first death, we won't get another signal. So must loop here else
+ # we will leave the unreaped child as a zombie. And the next time
+ # two children die we get another zombie. And so on.
+ while (($child = waitpid(-1,WNOHANG)) > 0) {
+ $Kid_Status{$child} = $?;
+ }
+ $SIG{CHLD} = \&REAPER; # still loathe SysV
+ }
+ $SIG{CHLD} = \&REAPER;
+ # do something that forks...
+
+Signal handling is also used for timeouts in Unix, While safely
+protected within an C<eval{}> block, you set a signal handler to trap
+alarm signals and then schedule to have one delivered to you in some
+number of seconds. Then try your blocking operation, clearing the alarm
+when it's done but not before you've exited your C<eval{}> block. If it
+goes off, you'll use die() to jump out of the block, much as you might
+using longjmp() or throw() in other languages.
+
+Here's an example:
+
+ eval {
+ local $SIG{ALRM} = sub { die "alarm clock restart" };
+ alarm 10;
+ flock(FH, 2); # blocking write lock
+ alarm 0;
+ };
+ if ($@ and $@ !~ /alarm clock restart/) { die }
+
+If the operation being timed out is system() or qx(), this technique
+is liable to generate zombies. If this matters to you, you'll
+need to do your own fork() and exec(), and kill the errant child process.
+
+For more complex signal handling, you might see the standard POSIX
+module. Lamentably, this is almost entirely undocumented, but
+the F<t/lib/posix.t> file from the Perl source distribution has some
+examples in it.
+
+=head2 Handling the SIGHUP Signal in Daemons
+
+A process that usually starts when the system boots and shuts down
+when the system is shut down is called a daemon (Disk And Execution
+MONitor). If a daemon process has a configuration file which is
+modified after the process has been started, there should be a way to
+tell that process to re-read its configuration file, without stopping
+the process. Many daemons provide this mechanism using the C<SIGHUP>
+signal handler. When you want to tell the daemon to re-read the file
+you simply send it the C<SIGHUP> signal.
+
+Not all platforms automatically reinstall their (native) signal
+handlers after a signal delivery. This means that the handler works
+only the first time the signal is sent. The solution to this problem
+is to use C<POSIX> signal handlers if available, their behaviour
+is well-defined.
+
+The following example implements a simple daemon, which restarts
+itself every time the C<SIGHUP> signal is received. The actual code is
+located in the subroutine C<code()>, which simply prints some debug
+info to show that it works and should be replaced with the real code.
+
+ #!/usr/bin/perl -w
+
+ use POSIX ();
+ use FindBin ();
+ use File::Basename ();
+ use File::Spec::Functions;
+
+ $|=1;
+
+ # make the daemon cross-platform, so exec always calls the script
+ # itself with the right path, no matter how the script was invoked.
+ my $script = File::Basename::basename($0);
+ my $SELF = catfile $FindBin::Bin, $script;
+
+ # POSIX unmasks the sigprocmask properly
+ my $sigset = POSIX::SigSet->new();
+ my $action = POSIX::SigAction->new('sigHUP_handler',
+ $sigset,
+ &POSIX::SA_NODEFER);
+ POSIX::sigaction(&POSIX::SIGHUP, $action);
+
+ sub sigHUP_handler {
+ print "got SIGHUP\n";
+ exec($SELF, @ARGV) or die "Couldn't restart: $!\n";
+ }
+
+ code();
+
+ sub code {
+ print "PID: $$\n";
+ print "ARGV: @ARGV\n";
+ my $c = 0;
+ while (++$c) {
+ sleep 2;
+ print "$c\n";
+ }
+ }
+ __END__
+
+
+=head1 Named Pipes
+
+A named pipe (often referred to as a FIFO) is an old Unix IPC
+mechanism for processes communicating on the same machine. It works
+just like a regular, connected anonymous pipes, except that the
+processes rendezvous using a filename and don't have to be related.
+
+To create a named pipe, use the C<POSIX::mkfifo()> function.
+
+ use POSIX qw(mkfifo);
+ mkfifo($path, 0700) or die "mkfifo $path failed: $!";
+
+You can also use the Unix command mknod(1) or on some
+systems, mkfifo(1). These may not be in your normal path.
+
+ # system return val is backwards, so && not ||
+ #
+ $ENV{PATH} .= ":/etc:/usr/etc";
+ if ( system('mknod', $path, 'p')
+ && system('mkfifo', $path) )
+ {
+ die "mk{nod,fifo} $path failed";
+ }
+
+
+A fifo is convenient when you want to connect a process to an unrelated
+one. When you open a fifo, the program will block until there's something
+on the other end.
+
+For example, let's say you'd like to have your F<.signature> file be a
+named pipe that has a Perl program on the other end. Now every time any
+program (like a mailer, news reader, finger program, etc.) tries to read
+from that file, the reading program will block and your program will
+supply the new signature. We'll use the pipe-checking file test B<-p>
+to find out whether anyone (or anything) has accidentally removed our fifo.
+
+ chdir; # go home
+ $FIFO = '.signature';
+
+ while (1) {
+ unless (-p $FIFO) {
+ unlink $FIFO;
+ require POSIX;
+ POSIX::mkfifo($FIFO, 0700)
+ or die "can't mkfifo $FIFO: $!";
+ }
+
+ # next line blocks until there's a reader
+ open (FIFO, "> $FIFO") || die "can't write $FIFO: $!";
+ print FIFO "John Smith (smith\@host.org)\n", `fortune -s`;
+ close FIFO;
+ sleep 2; # to avoid dup signals
+ }
+
+=head2 Deferred Signals (Safe Signals)
+
+In Perls before Perl 5.7.3 by installing Perl code to deal with
+signals, you were exposing yourself to danger from two things. First,
+few system library functions are re-entrant. If the signal interrupts
+while Perl is executing one function (like malloc(3) or printf(3)),
+and your signal handler then calls the same function again, you could
+get unpredictable behavior--often, a core dump. Second, Perl isn't
+itself re-entrant at the lowest levels. If the signal interrupts Perl
+while Perl is changing its own internal data structures, similarly
+unpredictable behaviour may result.
+
+There were two things you could do, knowing this: be paranoid or be
+pragmatic. The paranoid approach was to do as little as possible in your
+signal handler. Set an existing integer variable that already has a
+value, and return. This doesn't help you if you're in a slow system call,
+which will just restart. That means you have to C<die> to longjmp(3) out
+of the handler. Even this is a little cavalier for the true paranoiac,
+who avoids C<die> in a handler because the system I<is> out to get you.
+The pragmatic approach was to say "I know the risks, but prefer the
+convenience", and to do anything you wanted in your signal handler,
+and be prepared to clean up core dumps now and again.
+
+In Perl 5.7.3 and later to avoid these problems signals are
+"deferred"-- that is when the signal is delivered to the process by
+the system (to the C code that implements Perl) a flag is set, and the
+handler returns immediately. Then at strategic "safe" points in the
+Perl interpreter (e.g. when it is about to execute a new opcode) the
+flags are checked and the Perl level handler from %SIG is
+executed. The "deferred" scheme allows much more flexibility in the
+coding of signal handler as we know Perl interpreter is in a safe
+state, and that we are not in a system library function when the
+handler is called. However the implementation does differ from
+previous Perls in the following ways:
+
+=over 4
+
+=item Long-running opcodes
+
+As the Perl interpreter only looks at the signal flags when it is about
+to execute a new opcode, a signal that arrives during a long-running
+opcode (e.g. a regular expression operation on a very large string) will
+not be seen until the current opcode completes.
+
+N.B. If a signal of any given type fires multiple times during an opcode
+(such as from a fine-grained timer), the handler for that signal will
+only be called once after the opcode completes, and all the other
+instances will be discarded. Furthermore, if your system's signal queue
+gets flooded to the point that there are signals that have been raised
+but not yet caught (and thus not deferred) at the time an opcode
+completes, those signals may well be caught and deferred during
+subsequent opcodes, with sometimes surprising results. For example, you
+may see alarms delivered even after calling C<alarm(0)> as the latter
+stops the raising of alarms but does not cancel the delivery of alarms
+raised but not yet caught. Do not depend on the behaviors described in
+this paragraph as they are side effects of the current implementation and
+may change in future versions of Perl.
+
+
+=item Interrupting IO
+
+When a signal is delivered (e.g. INT control-C) the operating system
+breaks into IO operations like C<read> (used to implement Perls
+E<lt>E<gt> operator). On older Perls the handler was called
+immediately (and as C<read> is not "unsafe" this worked well). With
+the "deferred" scheme the handler is not called immediately, and if
+Perl is using system's C<stdio> library that library may re-start the
+C<read> without returning to Perl and giving it a chance to call the
+%SIG handler. If this happens on your system the solution is to use
+C<:perlio> layer to do IO - at least on those handles which you want
+to be able to break into with signals. (The C<:perlio> layer checks
+the signal flags and calls %SIG handlers before resuming IO operation.)
+
+Note that the default in Perl 5.7.3 and later is to automatically use
+the C<:perlio> layer.
+
+Note that some networking library functions like gethostbyname() are
+known to have their own implementations of timeouts which may conflict
+with your timeouts. If you are having problems with such functions,
+you can try using the POSIX sigaction() function, which bypasses the
+Perl safe signals (note that this means subjecting yourself to
+possible memory corruption, as described above). Instead of setting
+C<$SIG{ALRM}>:
+
+ local $SIG{ALRM} = sub { die "alarm" };
+
+try something like the following:
+
+ use POSIX qw(SIGALRM);
+ POSIX::sigaction(SIGALRM,
+ POSIX::SigAction->new(sub { die "alarm" }))
+ or die "Error setting SIGALRM handler: $!\n";
+
+Another way to disable the safe signal behavior locally is to use
+the C<Perl::Unsafe::Signals> module from CPAN (which will affect
+all signals).
+
+=item Restartable system calls
+
+On systems that supported it, older versions of Perl used the
+SA_RESTART flag when installing %SIG handlers. This meant that
+restartable system calls would continue rather than returning when
+a signal arrived. In order to deliver deferred signals promptly,
+Perl 5.7.3 and later do I<not> use SA_RESTART. Consequently,
+restartable system calls can fail (with $! set to C<EINTR>) in places
+where they previously would have succeeded.
+
+Note that the default C<:perlio> layer will retry C<read>, C<write>
+and C<close> as described above and that interrupted C<wait> and
+C<waitpid> calls will always be retried.
+
+=item Signals as "faults"
+
+Certain signals, e.g. SEGV, ILL, and BUS, are generated as a result of
+virtual memory or other "faults". These are normally fatal and there is
+little a Perl-level handler can do with them, so Perl now delivers them
+immediately rather than attempting to defer them.
+
+=item Signals triggered by operating system state
+
+On some operating systems certain signal handlers are supposed to "do
+something" before returning. One example can be CHLD or CLD which
+indicates a child process has completed. On some operating systems the
+signal handler is expected to C<wait> for the completed child
+process. On such systems the deferred signal scheme will not work for
+those signals (it does not do the C<wait>). Again the failure will
+look like a loop as the operating system will re-issue the signal as
+there are un-waited-for completed child processes.
+
+=back
+
+If you want the old signal behaviour back regardless of possible
+memory corruption, set the environment variable C<PERL_SIGNALS> to
+C<"unsafe"> (a new feature since Perl 5.8.1).
+
+=head1 Using open() for IPC
+
+Perl's basic open() statement can also be used for unidirectional
+interprocess communication by either appending or prepending a pipe
+symbol to the second argument to open(). Here's how to start
+something up in a child process you intend to write to:
+
+ open(SPOOLER, "| cat -v | lpr -h 2>/dev/null")
+ || die "can't fork: $!";
+ local $SIG{PIPE} = sub { die "spooler pipe broke" };
+ print SPOOLER "stuff\n";
+ close SPOOLER || die "bad spool: $! $?";
+
+And here's how to start up a child process you intend to read from:
+
+ open(STATUS, "netstat -an 2>&1 |")
+ || die "can't fork: $!";
+ while (<STATUS>) {
+ next if /^(tcp|udp)/;
+ print;
+ }
+ close STATUS || die "bad netstat: $! $?";
+
+If one can be sure that a particular program is a Perl script that is
+expecting filenames in @ARGV, the clever programmer can write something
+like this:
+
+ % program f1 "cmd1|" - f2 "cmd2|" f3 < tmpfile
+
+and irrespective of which shell it's called from, the Perl program will
+read from the file F<f1>, the process F<cmd1>, standard input (F<tmpfile>
+in this case), the F<f2> file, the F<cmd2> command, and finally the F<f3>
+file. Pretty nifty, eh?
+
+You might notice that you could use backticks for much the
+same effect as opening a pipe for reading:
+
+ print grep { !/^(tcp|udp)/ } `netstat -an 2>&1`;
+ die "bad netstat" if $?;
+
+While this is true on the surface, it's much more efficient to process the
+file one line or record at a time because then you don't have to read the
+whole thing into memory at once. It also gives you finer control of the
+whole process, letting you to kill off the child process early if you'd
+like.
+
+Be careful to check both the open() and the close() return values. If
+you're I<writing> to a pipe, you should also trap SIGPIPE. Otherwise,
+think of what happens when you start up a pipe to a command that doesn't
+exist: the open() will in all likelihood succeed (it only reflects the
+fork()'s success), but then your output will fail--spectacularly. Perl
+can't know whether the command worked because your command is actually
+running in a separate process whose exec() might have failed. Therefore,
+while readers of bogus commands return just a quick end of file, writers
+to bogus command will trigger a signal they'd better be prepared to
+handle. Consider:
+
+ open(FH, "|bogus") or die "can't fork: $!";
+ print FH "bang\n" or die "can't write: $!";
+ close FH or die "can't close: $!";
+
+That won't blow up until the close, and it will blow up with a SIGPIPE.
+To catch it, you could use this:
+
+ $SIG{PIPE} = 'IGNORE';
+ open(FH, "|bogus") or die "can't fork: $!";
+ print FH "bang\n" or die "can't write: $!";
+ close FH or die "can't close: status=$?";
+
+=head2 Filehandles
+
+Both the main process and any child processes it forks share the same
+STDIN, STDOUT, and STDERR filehandles. If both processes try to access
+them at once, strange things can happen. You may also want to close
+or reopen the filehandles for the child. You can get around this by
+opening your pipe with open(), but on some systems this means that the
+child process cannot outlive the parent.
+
+=head2 Background Processes
+
+You can run a command in the background with:
+
+ system("cmd &");
+
+The command's STDOUT and STDERR (and possibly STDIN, depending on your
+shell) will be the same as the parent's. You won't need to catch
+SIGCHLD because of the double-fork taking place (see below for more
+details).
+
+=head2 Complete Dissociation of Child from Parent
+
+In some cases (starting server processes, for instance) you'll want to
+completely dissociate the child process from the parent. This is
+often called daemonization. A well behaved daemon will also chdir()
+to the root directory (so it doesn't prevent unmounting the filesystem
+containing the directory from which it was launched) and redirect its
+standard file descriptors from and to F</dev/null> (so that random
+output doesn't wind up on the user's terminal).
+
+ use POSIX 'setsid';
+
+ sub daemonize {
+ chdir '/' or die "Can't chdir to /: $!";
+ open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
+ open STDOUT, '>/dev/null'
+ or die "Can't write to /dev/null: $!";
+ defined(my $pid = fork) or die "Can't fork: $!";
+ exit if $pid;
+ die "Can't start a new session: $!" if setsid == -1;
+ open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
+ }
+
+The fork() has to come before the setsid() to ensure that you aren't a
+process group leader (the setsid() will fail if you are). If your
+system doesn't have the setsid() function, open F</dev/tty> and use the
+C<TIOCNOTTY> ioctl() on it instead. See tty(4) for details.
+
+Non-Unix users should check their Your_OS::Process module for other
+solutions.
+
+=head2 Safe Pipe Opens
+
+Another interesting approach to IPC is making your single program go
+multiprocess and communicate between (or even amongst) yourselves. The
+open() function will accept a file argument of either C<"-|"> or C<"|-">
+to do a very interesting thing: it forks a child connected to the
+filehandle you've opened. The child is running the same program as the
+parent. This is useful for safely opening a file when running under an
+assumed UID or GID, for example. If you open a pipe I<to> minus, you can
+write to the filehandle you opened and your kid will find it in his
+STDIN. If you open a pipe I<from> minus, you can read from the filehandle
+you opened whatever your kid writes to his STDOUT.
+
+ use English '-no_match_vars';
+ my $sleep_count = 0;
+
+ do {
+ $pid = open(KID_TO_WRITE, "|-");
+ unless (defined $pid) {
+ warn "cannot fork: $!";
+ die "bailing out" if $sleep_count++ > 6;
+ sleep 10;
+ }
+ } until defined $pid;
+
+ if ($pid) { # parent
+ print KID_TO_WRITE @some_data;
+ close(KID_TO_WRITE) || warn "kid exited $?";
+ } else { # child
+ ($EUID, $EGID) = ($UID, $GID); # suid progs only
+ open (FILE, "> /safe/file")
+ || die "can't open /safe/file: $!";
+ while (<STDIN>) {
+ print FILE; # child's STDIN is parent's KID_TO_WRITE
+ }
+ exit; # don't forget this
+ }
+
+Another common use for this construct is when you need to execute
+something without the shell's interference. With system(), it's
+straightforward, but you can't use a pipe open or backticks safely.
+That's because there's no way to stop the shell from getting its hands on
+your arguments. Instead, use lower-level control to call exec() directly.
+
+Here's a safe backtick or pipe open for read:
+
+ # add error processing as above
+ $pid = open(KID_TO_READ, "-|");
+
+ if ($pid) { # parent
+ while (<KID_TO_READ>) {
+ # do something interesting
+ }
+ close(KID_TO_READ) || warn "kid exited $?";
+
+ } else { # child
+ ($EUID, $EGID) = ($UID, $GID); # suid only
+ exec($program, @options, @args)
+ || die "can't exec program: $!";
+ # NOTREACHED
+ }
+
+
+And here's a safe pipe open for writing:
+
+ # add error processing as above
+ $pid = open(KID_TO_WRITE, "|-");
+ $SIG{PIPE} = sub { die "whoops, $program pipe broke" };
+
+ if ($pid) { # parent
+ for (@data) {
+ print KID_TO_WRITE;
+ }
+ close(KID_TO_WRITE) || warn "kid exited $?";
+
+ } else { # child
+ ($EUID, $EGID) = ($UID, $GID);
+ exec($program, @options, @args)
+ || die "can't exec program: $!";
+ # NOTREACHED
+ }
+
+It is very easy to dead-lock a process using this form of open(), or
+indeed any use of pipe() and multiple sub-processes. The above
+example is 'safe' because it is simple and calls exec(). See
+L</"Avoiding Pipe Deadlocks"> for general safety principles, but there
+are extra gotchas with Safe Pipe Opens.
+
+In particular, if you opened the pipe using C<open FH, "|-">, then you
+cannot simply use close() in the parent process to close an unwanted
+writer. Consider this code:
+
+ $pid = open WRITER, "|-";
+ defined $pid or die "fork failed; $!";
+ if ($pid) {
+ if (my $sub_pid = fork()) {
+ close WRITER;
+ # do something else...
+ }
+ else {
+ # write to WRITER...
+ exit;
+ }
+ }
+ else {
+ # do something with STDIN...
+ exit;
+ }
+
+In the above, the true parent does not want to write to the WRITER
+filehandle, so it closes it. However, because WRITER was opened using
+C<open FH, "|-">, it has a special behaviour: closing it will call
+waitpid() (see L<perlfunc/waitpid>), which waits for the sub-process
+to exit. If the child process ends up waiting for something happening
+in the section marked "do something else", then you have a deadlock.
+
+This can also be a problem with intermediate sub-processes in more
+complicated code, which will call waitpid() on all open filehandles
+during global destruction; in no predictable order.
+
+To solve this, you must manually use pipe(), fork(), and the form of
+open() which sets one file descriptor to another, as below:
+
+ pipe(READER, WRITER);
+ $pid = fork();
+ defined $pid or die "fork failed; $!";
+ if ($pid) {
+ close READER;
+ if (my $sub_pid = fork()) {
+ close WRITER;
+ }
+ else {
+ # write to WRITER...
+ exit;
+ }
+ # write to WRITER...
+ }
+ else {
+ open STDIN, "<&READER";
+ close WRITER;
+ # do something...
+ exit;
+ }
+
+Since Perl 5.8.0, you can also use the list form of C<open> for pipes :
+the syntax
+
+ open KID_PS, "-|", "ps", "aux" or die $!;
+
+forks the ps(1) command (without spawning a shell, as there are more than
+three arguments to open()), and reads its standard output via the
+C<KID_PS> filehandle. The corresponding syntax to write to command
+pipes (with C<"|-"> in place of C<"-|">) is also implemented.
+
+Note that these operations are full Unix forks, which means they may not be
+correctly implemented on alien systems. Additionally, these are not true
+multithreading. If you'd like to learn more about threading, see the
+F<modules> file mentioned below in the SEE ALSO section.
+
+=head2 Avoiding Pipe Deadlocks
+
+In general, if you have more than one sub-process, you need to be very
+careful that any process which does not need the writer half of any
+pipe you create for inter-process communication does not have it open.
+
+The reason for this is that any child process which is reading from
+the pipe and expecting an EOF will never receive it, and therefore
+never exit. A single process closing a pipe is not enough to close it;
+the last process with the pipe open must close it for it to read EOF.
+
+There are some features built-in to unix to help prevent this most of
+the time. For instance, filehandles have a 'close on exec' flag (set
+I<en masse> with Perl using the C<$^F> L<perlvar>), so that any
+filehandles which you didn't explicitly route to the STDIN, STDOUT or
+STDERR of a child I<program> will automatically be closed for you.
+
+So, always explicitly and immediately call close() on the writable end
+of any pipe, unless that process is actually writing to it. If you
+don't explicitly call close() then be warned Perl will still close()
+all the filehandles during global destruction. As warned above, if
+those filehandles were opened with Safe Pipe Open, they will also call
+waitpid() and you might again deadlock.
+
+=head2 Bidirectional Communication with Another Process
+
+While this works reasonably well for unidirectional communication, what
+about bidirectional communication? The obvious thing you'd like to do
+doesn't actually work:
+
+ open(PROG_FOR_READING_AND_WRITING, "| some program |")
+
+and if you forget to use the C<use warnings> pragma or the B<-w> flag,
+then you'll miss out entirely on the diagnostic message:
+
+ Can't do bidirectional pipe at -e line 1.
+
+If you really want to, you can use the standard open2() library function
+to catch both ends. There's also an open3() for tridirectional I/O so you
+can also catch your child's STDERR, but doing so would then require an
+awkward select() loop and wouldn't allow you to use normal Perl input
+operations.
+
+If you look at its source, you'll see that open2() uses low-level
+primitives like Unix pipe() and exec() calls to create all the connections.
+While it might have been slightly more efficient by using socketpair(), it
+would have then been even less portable than it already is. The open2()
+and open3() functions are unlikely to work anywhere except on a Unix
+system or some other one purporting to be POSIX compliant.
+
+Here's an example of using open2():
+
+ use FileHandle;
+ use IPC::Open2;
+ $pid = open2(*Reader, *Writer, "cat -u -n" );
+ print Writer "stuff\n";
+ $got = <Reader>;
+
+The problem with this is that Unix buffering is really going to
+ruin your day. Even though your C<Writer> filehandle is auto-flushed,
+and the process on the other end will get your data in a timely manner,
+you can't usually do anything to force it to give it back to you
+in a similarly quick fashion. In this case, we could, because we
+gave I<cat> a B<-u> flag to make it unbuffered. But very few Unix
+commands are designed to operate over pipes, so this seldom works
+unless you yourself wrote the program on the other end of the
+double-ended pipe.
+
+A solution to this is the nonstandard F<Comm.pl> library. It uses
+pseudo-ttys to make your program behave more reasonably:
+
+ require 'Comm.pl';
+ $ph = open_proc('cat -n');
+ for (1..10) {
+ print $ph "a line\n";
+ print "got back ", scalar <$ph>;
+ }
+
+This way you don't have to have control over the source code of the
+program you're using. The F<Comm> library also has expect()
+and interact() functions. Find the library (and we hope its
+successor F<IPC::Chat>) at your nearest CPAN archive as detailed
+in the SEE ALSO section below.
+
+The newer Expect.pm module from CPAN also addresses this kind of thing.
+This module requires two other modules from CPAN: IO::Pty and IO::Stty.
+It sets up a pseudo-terminal to interact with programs that insist on
+using talking to the terminal device driver. If your system is
+amongst those supported, this may be your best bet.
+
+=head2 Bidirectional Communication with Yourself
+
+If you want, you may make low-level pipe() and fork()
+to stitch this together by hand. This example only
+talks to itself, but you could reopen the appropriate
+handles to STDIN and STDOUT and call other processes.
+
+ #!/usr/bin/perl -w
+ # pipe1 - bidirectional communication using two pipe pairs
+ # designed for the socketpair-challenged
+ use IO::Handle; # thousands of lines just for autoflush :-(
+ pipe(PARENT_RDR, CHILD_WTR); # XXX: failure?
+ pipe(CHILD_RDR, PARENT_WTR); # XXX: failure?
+ CHILD_WTR->autoflush(1);
+ PARENT_WTR->autoflush(1);
+
+ if ($pid = fork) {
+ close PARENT_RDR; close PARENT_WTR;
+ print CHILD_WTR "Parent Pid $$ is sending this\n";
+ chomp($line = <CHILD_RDR>);
+ print "Parent Pid $$ just read this: `$line'\n";
+ close CHILD_RDR; close CHILD_WTR;
+ waitpid($pid,0);
+ } else {
+ die "cannot fork: $!" unless defined $pid;
+ close CHILD_RDR; close CHILD_WTR;
+ chomp($line = <PARENT_RDR>);
+ print "Child Pid $$ just read this: `$line'\n";
+ print PARENT_WTR "Child Pid $$ is sending this\n";
+ close PARENT_RDR; close PARENT_WTR;
+ exit;
+ }
+
+But you don't actually have to make two pipe calls. If you
+have the socketpair() system call, it will do this all for you.
+
+ #!/usr/bin/perl -w
+ # pipe2 - bidirectional communication using socketpair
+ # "the best ones always go both ways"
+
+ use Socket;
+ use IO::Handle; # thousands of lines just for autoflush :-(
+ # We say AF_UNIX because although *_LOCAL is the
+ # POSIX 1003.1g form of the constant, many machines
+ # still don't have it.
+ socketpair(CHILD, PARENT, AF_UNIX, SOCK_STREAM, PF_UNSPEC)
+ or die "socketpair: $!";
+
+ CHILD->autoflush(1);
+ PARENT->autoflush(1);
+
+ if ($pid = fork) {
+ close PARENT;
+ print CHILD "Parent Pid $$ is sending this\n";
+ chomp($line = <CHILD>);
+ print "Parent Pid $$ just read this: `$line'\n";
+ close CHILD;
+ waitpid($pid,0);
+ } else {
+ die "cannot fork: $!" unless defined $pid;
+ close CHILD;
+ chomp($line = <PARENT>);
+ print "Child Pid $$ just read this: `$line'\n";
+ print PARENT "Child Pid $$ is sending this\n";
+ close PARENT;
+ exit;
+ }
+
+=head1 Sockets: Client/Server Communication
+
+While not limited to Unix-derived operating systems (e.g., WinSock on PCs
+provides socket support, as do some VMS libraries), you may not have
+sockets on your system, in which case this section probably isn't going to do
+you much good. With sockets, you can do both virtual circuits (i.e., TCP
+streams) and datagrams (i.e., UDP packets). You may be able to do even more
+depending on your system.
+
+The Perl function calls for dealing with sockets have the same names as
+the corresponding system calls in C, but their arguments tend to differ
+for two reasons: first, Perl filehandles work differently than C file
+descriptors. Second, Perl already knows the length of its strings, so you
+don't need to pass that information.
+
+One of the major problems with old socket code in Perl was that it used
+hard-coded values for some of the constants, which severely hurt
+portability. If you ever see code that does anything like explicitly
+setting C<$AF_INET = 2>, you know you're in for big trouble: An
+immeasurably superior approach is to use the C<Socket> module, which more
+reliably grants access to various constants and functions you'll need.
+
+If you're not writing a server/client for an existing protocol like
+NNTP or SMTP, you should give some thought to how your server will
+know when the client has finished talking, and vice-versa. Most
+protocols are based on one-line messages and responses (so one party
+knows the other has finished when a "\n" is received) or multi-line
+messages and responses that end with a period on an empty line
+("\n.\n" terminates a message/response).
+
+=head2 Internet Line Terminators
+
+The Internet line terminator is "\015\012". Under ASCII variants of
+Unix, that could usually be written as "\r\n", but under other systems,
+"\r\n" might at times be "\015\015\012", "\012\012\015", or something
+completely different. The standards specify writing "\015\012" to be
+conformant (be strict in what you provide), but they also recommend
+accepting a lone "\012" on input (but be lenient in what you require).
+We haven't always been very good about that in the code in this manpage,
+but unless you're on a Mac, you'll probably be ok.
+
+=head2 Internet TCP Clients and Servers
+
+Use Internet-domain sockets when you want to do client-server
+communication that might extend to machines outside of your own system.
+
+Here's a sample TCP client using Internet-domain sockets:
+
+ #!/usr/bin/perl -w
+ use strict;
+ use Socket;
+ my ($remote,$port, $iaddr, $paddr, $proto, $line);
+
+ $remote = shift || 'localhost';
+ $port = shift || 2345; # random port
+ if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') }
+ die "No port" unless $port;
+ $iaddr = inet_aton($remote) || die "no host: $remote";
+ $paddr = sockaddr_in($port, $iaddr);
+
+ $proto = getprotobyname('tcp');
+ socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
+ connect(SOCK, $paddr) || die "connect: $!";
+ while (defined($line = <SOCK>)) {
+ print $line;
+ }
+
+ close (SOCK) || die "close: $!";
+ exit;
+
+And here's a corresponding server to go along with it. We'll
+leave the address as INADDR_ANY so that the kernel can choose
+the appropriate interface on multihomed hosts. If you want sit
+on a particular interface (like the external side of a gateway
+or firewall machine), you should fill this in with your real address
+instead.
+
+ #!/usr/bin/perl -Tw
+ use strict;
+ BEGIN { $ENV{PATH} = '/usr/ucb:/bin' }
+ use Socket;
+ use Carp;
+ my $EOL = "\015\012";
+
+ sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" }
+
+ my $port = shift || 2345;
+ my $proto = getprotobyname('tcp');
+
+ ($port) = $port =~ /^(\d+)$/ or die "invalid port";
+
+ socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
+ setsockopt(Server, SOL_SOCKET, SO_REUSEADDR,
+ pack("l", 1)) || die "setsockopt: $!";
+ bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!";
+ listen(Server,SOMAXCONN) || die "listen: $!";
+
+ logmsg "server started on port $port";
+
+ my $paddr;
+
+ $SIG{CHLD} = \&REAPER;
+
+ for ( ; $paddr = accept(Client,Server); close Client) {
+ my($port,$iaddr) = sockaddr_in($paddr);
+ my $name = gethostbyaddr($iaddr,AF_INET);
+
+ logmsg "connection from $name [",
+ inet_ntoa($iaddr), "]
+ at port $port";
+
+ print Client "Hello there, $name, it's now ",
+ scalar localtime, $EOL;
+ }
+
+And here's a multithreaded version. It's multithreaded in that
+like most typical servers, it spawns (forks) a slave server to
+handle the client request so that the master server can quickly
+go back to service a new client.
+
+ #!/usr/bin/perl -Tw
+ use strict;
+ BEGIN { $ENV{PATH} = '/usr/ucb:/bin' }
+ use Socket;
+ use Carp;
+ my $EOL = "\015\012";
+
+ sub spawn; # forward declaration
+ sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" }
+
+ my $port = shift || 2345;
+ my $proto = getprotobyname('tcp');
+
+ ($port) = $port =~ /^(\d+)$/ or die "invalid port";
+
+ socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
+ setsockopt(Server, SOL_SOCKET, SO_REUSEADDR,
+ pack("l", 1)) || die "setsockopt: $!";
+ bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!";
+ listen(Server,SOMAXCONN) || die "listen: $!";
+
+ logmsg "server started on port $port";
+
+ my $waitedpid = 0;
+ my $paddr;
+
+ use POSIX ":sys_wait_h";
+ use Errno;
+
+ sub REAPER {
+ local $!; # don't let waitpid() overwrite current error
+ while ((my $pid = waitpid(-1,WNOHANG)) > 0 && WIFEXITED($?)) {
+ logmsg "reaped $waitedpid" . ($? ? " with exit $?" : '');
+ }
+ $SIG{CHLD} = \&REAPER; # loathe SysV
+ }
+
+ $SIG{CHLD} = \&REAPER;
+
+ while(1) {
+ $paddr = accept(Client, Server) || do {
+ # try again if accept() returned because a signal was received
+ next if $!{EINTR};
+ die "accept: $!";
+ };
+ my ($port, $iaddr) = sockaddr_in($paddr);
+ my $name = gethostbyaddr($iaddr, AF_INET);
+
+ logmsg "connection from $name [",
+ inet_ntoa($iaddr),
+ "] at port $port";
+
+ spawn sub {
+ $|=1;
+ print "Hello there, $name, it's now ", scalar localtime, $EOL;
+ exec '/usr/games/fortune' # XXX: `wrong' line terminators
+ or confess "can't exec fortune: $!";
+ };
+ close Client;
+ }
+
+ sub spawn {
+ my $coderef = shift;
+
+ unless (@_ == 0 && $coderef && ref($coderef) eq 'CODE') {
+ confess "usage: spawn CODEREF";
+ }
+
+ my $pid;
+ if (! defined($pid = fork)) {
+ logmsg "cannot fork: $!";
+ return;
+ }
+ elsif ($pid) {
+ logmsg "begat $pid";
+ return; # I'm the parent
+ }
+ # else I'm the child -- go spawn
+
+ open(STDIN, "<&Client") || die "can't dup client to stdin";
+ open(STDOUT, ">&Client") || die "can't dup client to stdout";
+ ## open(STDERR, ">&STDOUT") || die "can't dup stdout to stderr";
+ exit &$coderef();
+ }
+
+This server takes the trouble to clone off a child version via fork()
+for each incoming request. That way it can handle many requests at
+once, which you might not always want. Even if you don't fork(), the
+listen() will allow that many pending connections. Forking servers
+have to be particularly careful about cleaning up their dead children
+(called "zombies" in Unix parlance), because otherwise you'll quickly
+fill up your process table. The REAPER subroutine is used here to
+call waitpid() for any child processes that have finished, thereby
+ensuring that they terminate cleanly and don't join the ranks of the
+living dead.
+
+Within the while loop we call accept() and check to see if it returns
+a false value. This would normally indicate a system error that needs
+to be reported. However the introduction of safe signals (see
+L</Deferred Signals (Safe Signals)> above) in Perl 5.7.3 means that
+accept() may also be interrupted when the process receives a signal.
+This typically happens when one of the forked sub-processes exits and
+notifies the parent process with a CHLD signal.
+
+If accept() is interrupted by a signal then $! will be set to EINTR.
+If this happens then we can safely continue to the next iteration of
+the loop and another call to accept(). It is important that your
+signal handling code doesn't modify the value of $! or this test will
+most likely fail. In the REAPER subroutine we create a local version
+of $! before calling waitpid(). When waitpid() sets $! to ECHILD (as
+it inevitably does when it has no more children waiting), it will
+update the local copy leaving the original unchanged.
+
+We suggest that you use the B<-T> flag to use taint checking (see L<perlsec>)
+even if we aren't running setuid or setgid. This is always a good idea
+for servers and other programs run on behalf of someone else (like CGI
+scripts), because it lessens the chances that people from the outside will
+be able to compromise your system.
+
+Let's look at another TCP client. This one connects to the TCP "time"
+service on a number of different machines and shows how far their clocks
+differ from the system on which it's being run:
+
+ #!/usr/bin/perl -w
+ use strict;
+ use Socket;
+
+ my $SECS_of_70_YEARS = 2208988800;
+ sub ctime { scalar localtime(shift) }
+
+ my $iaddr = gethostbyname('localhost');
+ my $proto = getprotobyname('tcp');
+ my $port = getservbyname('time', 'tcp');
+ my $paddr = sockaddr_in(0, $iaddr);
+ my($host);
+
+ $| = 1;
+ printf "%-24s %8s %s\n", "localhost", 0, ctime(time());
+
+ foreach $host (@ARGV) {
+ printf "%-24s ", $host;
+ my $hisiaddr = inet_aton($host) || die "unknown host";
+ my $hispaddr = sockaddr_in($port, $hisiaddr);
+ socket(SOCKET, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
+ connect(SOCKET, $hispaddr) || die "bind: $!";
+ my $rtime = ' ';
+ read(SOCKET, $rtime, 4);
+ close(SOCKET);
+ my $histime = unpack("N", $rtime) - $SECS_of_70_YEARS;
+ printf "%8d %s\n", $histime - time, ctime($histime);
+ }
+
+=head2 Unix-Domain TCP Clients and Servers
+
+That's fine for Internet-domain clients and servers, but what about local
+communications? While you can use the same setup, sometimes you don't
+want to. Unix-domain sockets are local to the current host, and are often
+used internally to implement pipes. Unlike Internet domain sockets, Unix
+domain sockets can show up in the file system with an ls(1) listing.
+
+ % ls -l /dev/log
+ srw-rw-rw- 1 root 0 Oct 31 07:23 /dev/log
+
+You can test for these with Perl's B<-S> file test:
+
+ unless ( -S '/dev/log' ) {
+ die "something's wicked with the log system";
+ }
+
+Here's a sample Unix-domain client:
+
+ #!/usr/bin/perl -w
+ use Socket;
+ use strict;
+ my ($rendezvous, $line);
+
+ $rendezvous = shift || 'catsock';
+ socket(SOCK, PF_UNIX, SOCK_STREAM, 0) || die "socket: $!";
+ connect(SOCK, sockaddr_un($rendezvous)) || die "connect: $!";
+ while (defined($line = <SOCK>)) {
+ print $line;
+ }
+ exit;
+
+And here's a corresponding server. You don't have to worry about silly
+network terminators here because Unix domain sockets are guaranteed
+to be on the localhost, and thus everything works right.
+
+ #!/usr/bin/perl -Tw
+ use strict;
+ use Socket;
+ use Carp;
+
+ BEGIN { $ENV{PATH} = '/usr/ucb:/bin' }
+ sub spawn; # forward declaration
+ sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" }
+
+ my $NAME = 'catsock';
+ my $uaddr = sockaddr_un($NAME);
+ my $proto = getprotobyname('tcp');
+
+ socket(Server,PF_UNIX,SOCK_STREAM,0) || die "socket: $!";
+ unlink($NAME);
+ bind (Server, $uaddr) || die "bind: $!";
+ listen(Server,SOMAXCONN) || die "listen: $!";
+
+ logmsg "server started on $NAME";
+
+ my $waitedpid;
+
+ use POSIX ":sys_wait_h";
+ sub REAPER {
+ my $child;
+ while (($waitedpid = waitpid(-1,WNOHANG)) > 0) {
+ logmsg "reaped $waitedpid" . ($? ? " with exit $?" : '');
+ }
+ $SIG{CHLD} = \&REAPER; # loathe SysV
+ }
+
+ $SIG{CHLD} = \&REAPER;
+
+
+ for ( $waitedpid = 0;
+ accept(Client,Server) || $waitedpid;
+ $waitedpid = 0, close Client)
+ {
+ next if $waitedpid;
+ logmsg "connection on $NAME";
+ spawn sub {
+ print "Hello there, it's now ", scalar localtime, "\n";
+ exec '/usr/games/fortune' or die "can't exec fortune: $!";
+ };
+ }
+
+ sub spawn {
+ my $coderef = shift;
+
+ unless (@_ == 0 && $coderef && ref($coderef) eq 'CODE') {
+ confess "usage: spawn CODEREF";
+ }
+
+ my $pid;
+ if (!defined($pid = fork)) {
+ logmsg "cannot fork: $!";
+ return;
+ } elsif ($pid) {
+ logmsg "begat $pid";
+ return; # I'm the parent
+ }
+ # else I'm the child -- go spawn
+
+ open(STDIN, "<&Client") || die "can't dup client to stdin";
+ open(STDOUT, ">&Client") || die "can't dup client to stdout";
+ ## open(STDERR, ">&STDOUT") || die "can't dup stdout to stderr";
+ exit &$coderef();
+ }
+
+As you see, it's remarkably similar to the Internet domain TCP server, so
+much so, in fact, that we've omitted several duplicate functions--spawn(),
+logmsg(), ctime(), and REAPER()--which are exactly the same as in the
+other server.
+
+So why would you ever want to use a Unix domain socket instead of a
+simpler named pipe? Because a named pipe doesn't give you sessions. You
+can't tell one process's data from another's. With socket programming,
+you get a separate session for each client: that's why accept() takes two
+arguments.
+
+For example, let's say that you have a long running database server daemon
+that you want folks from the World Wide Web to be able to access, but only
+if they go through a CGI interface. You'd have a small, simple CGI
+program that does whatever checks and logging you feel like, and then acts
+as a Unix-domain client and connects to your private server.
+
+=head1 TCP Clients with IO::Socket
+
+For those preferring a higher-level interface to socket programming, the
+IO::Socket module provides an object-oriented approach. IO::Socket is
+included as part of the standard Perl distribution as of the 5.004
+release. If you're running an earlier version of Perl, just fetch
+IO::Socket from CPAN, where you'll also find modules providing easy
+interfaces to the following systems: DNS, FTP, Ident (RFC 931), NIS and
+NISPlus, NNTP, Ping, POP3, SMTP, SNMP, SSLeay, Telnet, and Time--just
+to name a few.
+
+=head2 A Simple Client
+
+Here's a client that creates a TCP connection to the "daytime"
+service at port 13 of the host name "localhost" and prints out everything
+that the server there cares to provide.
+
+ #!/usr/bin/perl -w
+ use IO::Socket;
+ $remote = IO::Socket::INET->new(
+ Proto => "tcp",
+ PeerAddr => "localhost",
+ PeerPort => "daytime(13)",
+ )
+ or die "cannot connect to daytime port at localhost";
+ while ( <$remote> ) { print }
+
+When you run this program, you should get something back that
+looks like this:
+
+ Wed May 14 08:40:46 MDT 1997
+
+Here are what those parameters to the C<new> constructor mean:
+
+=over 4
+
+=item C<Proto>
+
+This is which protocol to use. In this case, the socket handle returned
+will be connected to a TCP socket, because we want a stream-oriented
+connection, that is, one that acts pretty much like a plain old file.
+Not all sockets are this of this type. For example, the UDP protocol
+can be used to make a datagram socket, used for message-passing.
+
+=item C<PeerAddr>
+
+This is the name or Internet address of the remote host the server is
+running on. We could have specified a longer name like C<"www.perl.com">,
+or an address like C<"204.148.40.9">. For demonstration purposes, we've
+used the special hostname C<"localhost">, which should always mean the
+current machine you're running on. The corresponding Internet address
+for localhost is C<"127.1">, if you'd rather use that.
+
+=item C<PeerPort>
+
+This is the service name or port number we'd like to connect to.
+We could have gotten away with using just C<"daytime"> on systems with a
+well-configured system services file,[FOOTNOTE: The system services file
+is in I</etc/services> under Unix] but just in case, we've specified the
+port number (13) in parentheses. Using just the number would also have
+worked, but constant numbers make careful programmers nervous.
+
+=back
+
+Notice how the return value from the C<new> constructor is used as
+a filehandle in the C<while> loop? That's what's called an indirect
+filehandle, a scalar variable containing a filehandle. You can use
+it the same way you would a normal filehandle. For example, you
+can read one line from it this way:
+
+ $line = <$handle>;
+
+all remaining lines from is this way:
+
+ @lines = <$handle>;
+
+and send a line of data to it this way:
+
+ print $handle "some data\n";
+
+=head2 A Webget Client
+
+Here's a simple client that takes a remote host to fetch a document
+from, and then a list of documents to get from that host. This is a
+more interesting client than the previous one because it first sends
+something to the server before fetching the server's response.
+
+ #!/usr/bin/perl -w
+ use IO::Socket;
+ unless (@ARGV > 1) { die "usage: $0 host document ..." }
+ $host = shift(@ARGV);
+ $EOL = "\015\012";
+ $BLANK = $EOL x 2;
+ foreach $document ( @ARGV ) {
+ $remote = IO::Socket::INET->new( Proto => "tcp",
+ PeerAddr => $host,
+ PeerPort => "http(80)",
+ );
+ unless ($remote) { die "cannot connect to http daemon on $host" }
+ $remote->autoflush(1);
+ print $remote "GET $document HTTP/1.0" . $BLANK;
+ while ( <$remote> ) { print }
+ close $remote;
+ }
+
+The web server handing the "http" service, which is assumed to be at
+its standard port, number 80. If the web server you're trying to
+connect to is at a different port (like 1080 or 8080), you should specify
+as the named-parameter pair, C<< PeerPort => 8080 >>. The C<autoflush>
+method is used on the socket because otherwise the system would buffer
+up the output we sent it. (If you're on a Mac, you'll also need to
+change every C<"\n"> in your code that sends data over the network to
+be a C<"\015\012"> instead.)
+
+Connecting to the server is only the first part of the process: once you
+have the connection, you have to use the server's language. Each server
+on the network has its own little command language that it expects as
+input. The string that we send to the server starting with "GET" is in
+HTTP syntax. In this case, we simply request each specified document.
+Yes, we really are making a new connection for each document, even though
+it's the same host. That's the way you always used to have to speak HTTP.
+Recent versions of web browsers may request that the remote server leave
+the connection open a little while, but the server doesn't have to honor
+such a request.
+
+Here's an example of running that program, which we'll call I<webget>:
+
+ % webget www.perl.com /guanaco.html
+ HTTP/1.1 404 File Not Found
+ Date: Thu, 08 May 1997 18:02:32 GMT
+ Server: Apache/1.2b6
+ Connection: close
+ Content-type: text/html
+
+ <HEAD><TITLE>404 File Not Found</TITLE></HEAD>
+ <BODY><H1>File Not Found</H1>
+ The requested URL /guanaco.html was not found on this server.<P>
+ </BODY>
+
+Ok, so that's not very interesting, because it didn't find that
+particular document. But a long response wouldn't have fit on this page.
+
+For a more fully-featured version of this program, you should look to
+the I<lwp-request> program included with the LWP modules from CPAN.
+
+=head2 Interactive Client with IO::Socket
+
+Well, that's all fine if you want to send one command and get one answer,
+but what about setting up something fully interactive, somewhat like
+the way I<telnet> works? That way you can type a line, get the answer,
+type a line, get the answer, etc.
+
+This client is more complicated than the two we've done so far, but if
+you're on a system that supports the powerful C<fork> call, the solution
+isn't that rough. Once you've made the connection to whatever service
+you'd like to chat with, call C<fork> to clone your process. Each of
+these two identical process has a very simple job to do: the parent
+copies everything from the socket to standard output, while the child
+simultaneously copies everything from standard input to the socket.
+To accomplish the same thing using just one process would be I<much>
+harder, because it's easier to code two processes to do one thing than it
+is to code one process to do two things. (This keep-it-simple principle
+a cornerstones of the Unix philosophy, and good software engineering as
+well, which is probably why it's spread to other systems.)
+
+Here's the code:
+
+ #!/usr/bin/perl -w
+ use strict;
+ use IO::Socket;
+ my ($host, $port, $kidpid, $handle, $line);
+
+ unless (@ARGV == 2) { die "usage: $0 host port" }
+ ($host, $port) = @ARGV;
+
+ # create a tcp connection to the specified host and port
+ $handle = IO::Socket::INET->new(Proto => "tcp",
+ PeerAddr => $host,
+ PeerPort => $port)
+ or die "can't connect to port $port on $host: $!";
+
+ $handle->autoflush(1); # so output gets there right away
+ print STDERR "[Connected to $host:$port]\n";
+
+ # split the program into two processes, identical twins
+ die "can't fork: $!" unless defined($kidpid = fork());
+
+ # the if{} block runs only in the parent process
+ if ($kidpid) {
+ # copy the socket to standard output
+ while (defined ($line = <$handle>)) {
+ print STDOUT $line;
+ }
+ kill("TERM", $kidpid); # send SIGTERM to child
+ }
+ # the else{} block runs only in the child process
+ else {
+ # copy standard input to the socket
+ while (defined ($line = <STDIN>)) {
+ print $handle $line;
+ }
+ }
+
+The C<kill> function in the parent's C<if> block is there to send a
+signal to our child process (current running in the C<else> block)
+as soon as the remote server has closed its end of the connection.
+
+If the remote server sends data a byte at time, and you need that
+data immediately without waiting for a newline (which might not happen),
+you may wish to replace the C<while> loop in the parent with the
+following:
+
+ my $byte;
+ while (sysread($handle, $byte, 1) == 1) {
+ print STDOUT $byte;
+ }
+
+Making a system call for each byte you want to read is not very efficient
+(to put it mildly) but is the simplest to explain and works reasonably
+well.
+
+=head1 TCP Servers with IO::Socket
+
+As always, setting up a server is little bit more involved than running a client.
+The model is that the server creates a special kind of socket that
+does nothing but listen on a particular port for incoming connections.
+It does this by calling the C<< IO::Socket::INET->new() >> method with
+slightly different arguments than the client did.
+
+=over 4
+
+=item Proto
+
+This is which protocol to use. Like our clients, we'll
+still specify C<"tcp"> here.
+
+=item LocalPort
+
+We specify a local
+port in the C<LocalPort> argument, which we didn't do for the client.
+This is service name or port number for which you want to be the
+server. (Under Unix, ports under 1024 are restricted to the
+superuser.) In our sample, we'll use port 9000, but you can use
+any port that's not currently in use on your system. If you try
+to use one already in used, you'll get an "Address already in use"
+message. Under Unix, the C<netstat -a> command will show
+which services current have servers.
+
+=item Listen
+
+The C<Listen> parameter is set to the maximum number of
+pending connections we can accept until we turn away incoming clients.
+Think of it as a call-waiting queue for your telephone.
+The low-level Socket module has a special symbol for the system maximum, which
+is SOMAXCONN.
+
+=item Reuse
+
+The C<Reuse> parameter is needed so that we restart our server
+manually without waiting a few minutes to allow system buffers to
+clear out.
+
+=back
+
+Once the generic server socket has been created using the parameters
+listed above, the server then waits for a new client to connect
+to it. The server blocks in the C<accept> method, which eventually accepts a
+bidirectional connection from the remote client. (Make sure to autoflush
+this handle to circumvent buffering.)
+
+To add to user-friendliness, our server prompts the user for commands.
+Most servers don't do this. Because of the prompt without a newline,
+you'll have to use the C<sysread> variant of the interactive client above.
+
+This server accepts one of five different commands, sending output
+back to the client. Note that unlike most network servers, this one
+only handles one incoming client at a time. Multithreaded servers are
+covered in Chapter 6 of the Camel.
+
+Here's the code. We'll
+
+ #!/usr/bin/perl -w
+ use IO::Socket;
+ use Net::hostent; # for OO version of gethostbyaddr
+
+ $PORT = 9000; # pick something not in use
+
+ $server = IO::Socket::INET->new( Proto => 'tcp',
+ LocalPort => $PORT,
+ Listen => SOMAXCONN,
+ Reuse => 1);
+
+ die "can't setup server" unless $server;
+ print "[Server $0 accepting clients]\n";
+
+ while ($client = $server->accept()) {
+ $client->autoflush(1);
+ print $client "Welcome to $0; type help for command list.\n";
+ $hostinfo = gethostbyaddr($client->peeraddr);
+ printf "[Connect from %s]\n", $hostinfo ? $hostinfo->name : $client->peerhost;
+ print $client "Command? ";
+ while ( <$client>) {
+ next unless /\S/; # blank line
+ if (/quit|exit/i) { last; }
+ elsif (/date|time/i) { printf $client "%s\n", scalar localtime; }
+ elsif (/who/i ) { print $client `who 2>&1`; }
+ elsif (/cookie/i ) { print $client `/usr/games/fortune 2>&1`; }
+ elsif (/motd/i ) { print $client `cat /etc/motd 2>&1`; }
+ else {
+ print $client "Commands: quit date who cookie motd\n";
+ }
+ } continue {
+ print $client "Command? ";
+ }
+ close $client;
+ }
+
+=head1 UDP: Message Passing
+
+Another kind of client-server setup is one that uses not connections, but
+messages. UDP communications involve much lower overhead but also provide
+less reliability, as there are no promises that messages will arrive at
+all, let alone in order and unmangled. Still, UDP offers some advantages
+over TCP, including being able to "broadcast" or "multicast" to a whole
+bunch of destination hosts at once (usually on your local subnet). If you
+find yourself overly concerned about reliability and start building checks
+into your message system, then you probably should use just TCP to start
+with.
+
+Note that UDP datagrams are I<not> a bytestream and should not be treated
+as such. This makes using I/O mechanisms with internal buffering
+like stdio (i.e. print() and friends) especially cumbersome. Use syswrite(),
+or better send(), like in the example below.
+
+Here's a UDP program similar to the sample Internet TCP client given
+earlier. However, instead of checking one host at a time, the UDP version
+will check many of them asynchronously by simulating a multicast and then
+using select() to do a timed-out wait for I/O. To do something similar
+with TCP, you'd have to use a different socket handle for each host.
+
+ #!/usr/bin/perl -w
+ use strict;
+ use Socket;
+ use Sys::Hostname;
+
+ my ( $count, $hisiaddr, $hispaddr, $histime,
+ $host, $iaddr, $paddr, $port, $proto,
+ $rin, $rout, $rtime, $SECS_of_70_YEARS);
+
+ $SECS_of_70_YEARS = 2208988800;
+
+ $iaddr = gethostbyname(hostname());
+ $proto = getprotobyname('udp');
+ $port = getservbyname('time', 'udp');
+ $paddr = sockaddr_in(0, $iaddr); # 0 means let kernel pick
+
+ socket(SOCKET, PF_INET, SOCK_DGRAM, $proto) || die "socket: $!";
+ bind(SOCKET, $paddr) || die "bind: $!";
+
+ $| = 1;
+ printf "%-12s %8s %s\n", "localhost", 0, scalar localtime time;
+ $count = 0;
+ for $host (@ARGV) {
+ $count++;
+ $hisiaddr = inet_aton($host) || die "unknown host";
+ $hispaddr = sockaddr_in($port, $hisiaddr);
+ defined(send(SOCKET, 0, 0, $hispaddr)) || die "send $host: $!";
+ }
+
+ $rin = '';
+ vec($rin, fileno(SOCKET), 1) = 1;
+
+ # timeout after 10.0 seconds
+ while ($count && select($rout = $rin, undef, undef, 10.0)) {
+ $rtime = '';
+ ($hispaddr = recv(SOCKET, $rtime, 4, 0)) || die "recv: $!";
+ ($port, $hisiaddr) = sockaddr_in($hispaddr);
+ $host = gethostbyaddr($hisiaddr, AF_INET);
+ $histime = unpack("N", $rtime) - $SECS_of_70_YEARS;
+ printf "%-12s ", $host;
+ printf "%8d %s\n", $histime - time, scalar localtime($histime);
+ $count--;
+ }
+
+Note that this example does not include any retries and may consequently
+fail to contact a reachable host. The most prominent reason for this
+is congestion of the queues on the sending host if the number of
+list of hosts to contact is sufficiently large.
+
+=head1 SysV IPC
+
+While System V IPC isn't so widely used as sockets, it still has some
+interesting uses. You can't, however, effectively use SysV IPC or
+Berkeley mmap() to have shared memory so as to share a variable amongst
+several processes. That's because Perl would reallocate your string when
+you weren't wanting it to.
+
+Here's a small example showing shared memory usage.
+
+ use IPC::SysV qw(IPC_PRIVATE IPC_RMID S_IRUSR S_IWUSR);
+
+ $size = 2000;
+ $id = shmget(IPC_PRIVATE, $size, S_IRUSR|S_IWUSR) || die "$!";
+ print "shm key $id\n";
+
+ $message = "Message #1";
+ shmwrite($id, $message, 0, 60) || die "$!";
+ print "wrote: '$message'\n";
+ shmread($id, $buff, 0, 60) || die "$!";
+ print "read : '$buff'\n";
+
+ # the buffer of shmread is zero-character end-padded.
+ substr($buff, index($buff, "\0")) = '';
+ print "un" unless $buff eq $message;
+ print "swell\n";
+
+ print "deleting shm $id\n";
+ shmctl($id, IPC_RMID, 0) || die "$!";
+
+Here's an example of a semaphore:
+
+ use IPC::SysV qw(IPC_CREAT);
+
+ $IPC_KEY = 1234;
+ $id = semget($IPC_KEY, 10, 0666 | IPC_CREAT ) || die "$!";
+ print "shm key $id\n";
+
+Put this code in a separate file to be run in more than one process.
+Call the file F<take>:
+
+ # create a semaphore
+
+ $IPC_KEY = 1234;
+ $id = semget($IPC_KEY, 0 , 0 );
+ die if !defined($id);
+
+ $semnum = 0;
+ $semflag = 0;
+
+ # 'take' semaphore
+ # wait for semaphore to be zero
+ $semop = 0;
+ $opstring1 = pack("s!s!s!", $semnum, $semop, $semflag);
+
+ # Increment the semaphore count
+ $semop = 1;
+ $opstring2 = pack("s!s!s!", $semnum, $semop, $semflag);
+ $opstring = $opstring1 . $opstring2;
+
+ semop($id,$opstring) || die "$!";
+
+Put this code in a separate file to be run in more than one process.
+Call this file F<give>:
+
+ # 'give' the semaphore
+ # run this in the original process and you will see
+ # that the second process continues
+
+ $IPC_KEY = 1234;
+ $id = semget($IPC_KEY, 0, 0);
+ die if !defined($id);
+
+ $semnum = 0;
+ $semflag = 0;
+
+ # Decrement the semaphore count
+ $semop = -1;
+ $opstring = pack("s!s!s!", $semnum, $semop, $semflag);
+
+ semop($id,$opstring) || die "$!";
+
+The SysV IPC code above was written long ago, and it's definitely
+clunky looking. For a more modern look, see the IPC::SysV module
+which is included with Perl starting from Perl 5.005.
+
+A small example demonstrating SysV message queues:
+
+ use IPC::SysV qw(IPC_PRIVATE IPC_RMID IPC_CREAT S_IRUSR S_IWUSR);
+
+ my $id = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR | S_IWUSR);
+
+ my $sent = "message";
+ my $type_sent = 1234;
+ my $rcvd;
+ my $type_rcvd;
+
+ if (defined $id) {
+ if (msgsnd($id, pack("l! a*", $type_sent, $sent), 0)) {
+ if (msgrcv($id, $rcvd, 60, 0, 0)) {
+ ($type_rcvd, $rcvd) = unpack("l! a*", $rcvd);
+ if ($rcvd eq $sent) {
+ print "okay\n";
+ } else {
+ print "not okay\n";
+ }
+ } else {
+ die "# msgrcv failed\n";
+ }
+ } else {
+ die "# msgsnd failed\n";
+ }
+ msgctl($id, IPC_RMID, 0) || die "# msgctl failed: $!\n";
+ } else {
+ die "# msgget failed\n";
+ }
+
+=head1 NOTES
+
+Most of these routines quietly but politely return C<undef> when they
+fail instead of causing your program to die right then and there due to
+an uncaught exception. (Actually, some of the new I<Socket> conversion
+functions croak() on bad arguments.) It is therefore essential to
+check return values from these functions. Always begin your socket
+programs this way for optimal success, and don't forget to add B<-T>
+taint checking flag to the #! line for servers:
+
+ #!/usr/bin/perl -Tw
+ use strict;
+ use sigtrap;
+ use Socket;
+
+=head1 BUGS
+
+All these routines create system-specific portability problems. As noted
+elsewhere, Perl is at the mercy of your C libraries for much of its system
+behaviour. It's probably safest to assume broken SysV semantics for
+signals and to stick with simple TCP and UDP socket operations; e.g., don't
+try to pass open file descriptors over a local UDP datagram socket if you
+want your code to stand a chance of being portable.
+
+=head1 AUTHOR
+
+Tom Christiansen, with occasional vestiges of Larry Wall's original
+version and suggestions from the Perl Porters.
+
+=head1 SEE ALSO
+
+There's a lot more to networking than this, but this should get you
+started.
+
+For intrepid programmers, the indispensable textbook is I<Unix
+Network Programming, 2nd Edition, Volume 1> by W. Richard Stevens
+(published by Prentice-Hall). Note that most books on networking
+address the subject from the perspective of a C programmer; translation
+to Perl is left as an exercise for the reader.
+
+The IO::Socket(3) manpage describes the object library, and the Socket(3)
+manpage describes the low-level interface to sockets. Besides the obvious
+functions in L<perlfunc>, you should also check out the F<modules> file
+at your nearest CPAN site. (See L<perlmodlib> or best yet, the F<Perl
+FAQ> for a description of what CPAN is and where to get it.)
+
+Section 5 of the F<modules> file is devoted to "Networking, Device Control
+(modems), and Interprocess Communication", and contains numerous unbundled
+modules numerous networking modules, Chat and Expect operations, CGI
+programming, DCE, FTP, IPC, NNTP, Proxy, Ptty, RPC, SNMP, SMTP, Telnet,
+Threads, and ToolTalk--just to name a few.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlirix.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlirix.pod
new file mode 100755
index 00000000000..911a2514b3a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlirix.pod
@@ -0,0 +1,137 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+README.irix - Perl version 5 on Irix systems
+
+=head1 DESCRIPTION
+
+This document describes various features of Irix that will affect how Perl
+version 5 (hereafter just Perl) is compiled and/or runs.
+
+=head2 Building 32-bit Perl in Irix
+
+Use
+
+ sh Configure -Dcc='cc -n32'
+
+to compile Perl 32-bit. Don't bother with -n32 unless you have 7.1
+or later compilers (use cc -version to check).
+
+(Building 'cc -n32' is the default.)
+
+=head2 Building 64-bit Perl in Irix
+
+Use
+
+ sh Configure -Dcc='cc -64' -Duse64bitint
+
+This requires require a 64-bit MIPS CPU (R8000, R10000, ...)
+
+You can also use
+
+ sh Configure -Dcc='cc -64' -Duse64bitall
+
+but that makes no difference compared with the -Duse64bitint because
+of the C<cc -64>.
+
+You can also do
+
+ sh Configure -Dcc='cc -n32' -Duse64bitint
+
+to use long longs for the 64-bit integer type, in case you don't
+have a 64-bit CPU.
+
+If you are using gcc, just
+
+ sh Configure -Dcc=gcc -Duse64bitint
+
+should be enough, the Configure should automatically probe for the
+correct 64-bit settings.
+
+=head2 About Compiler Versions of Irix
+
+Some Irix cc versions, e.g. 7.3.1.1m (try cc -version) have been known
+to have issues (coredumps) when compiling perl.c. If you've used
+-OPT:fast_io=ON and this happens, try removing it. If that fails, or
+you didn't use that, then try adjusting other optimization options
+(-LNO, -INLINE, -O3 to -O2, etcetera). The compiler bug has been
+reported to SGI. (Allen Smith <easmith@beatrice.rutgers.edu>)
+
+=head2 Linker Problems in Irix
+
+If you get complaints about so_locations then search in the file
+hints/irix_6.sh for "lddflags" and do the suggested adjustments.
+(David Billinghurst <David.Billinghurst@riotinto.com.au>)
+
+=head2 Malloc in Irix
+
+Do not try to use Perl's malloc, this will lead into very mysterious
+errors (especially with -Duse64bitall).
+
+=head2 Building with threads in Irix
+
+Run Configure with -Duseithreads which will configure Perl with
+the Perl 5.8.0 "interpreter threads", see L<threads>.
+
+For Irix 6.2 with perl threads, you have to have the following
+patches installed:
+
+ 1404 Irix 6.2 Posix 1003.1b man pages
+ 1645 Irix 6.2 & 6.3 POSIX header file updates
+ 2000 Irix 6.2 Posix 1003.1b support modules
+ 2254 Pthread library fixes
+ 2401 6.2 all platform kernel rollup
+
+B<IMPORTANT>: Without patch 2401, a kernel bug in Irix 6.2 will cause
+your machine to panic and crash when running threaded perl. Irix 6.3
+and later are okay.
+
+ Thanks to Hannu Napari <Hannu.Napari@hut.fi> for the IRIX
+ pthreads patches information.
+
+=head2 Irix 5.3
+
+While running Configure and when building, you are likely to get
+quite a few of these warnings:
+
+ ld:
+ The shared object /usr/lib/libm.so did not resolve any symbols.
+ You may want to remove it from your link line.
+
+Ignore them: in IRIX 5.3 there is no way to quieten ld about this.
+
+During compilation you will see this warning from toke.c:
+
+ uopt: Warning: Perl_yylex: this procedure not optimized because it
+ exceeds size threshold; to optimize this procedure, use -Olimit option
+ with value >= 4252.
+
+Ignore the warning.
+
+In IRIX 5.3 and with Perl 5.8.1 (Perl 5.8.0 didn't compile in IRIX 5.3)
+the following failures are known.
+
+ Failed Test Stat Wstat Total Fail Failed List of Failed
+ --------------------------------------------------------------------------
+ ../ext/List/Util/t/shuffle.t 0 139 ?? ?? % ??
+ ../lib/Math/Trig.t 255 65280 29 12 41.38% 24-29
+ ../lib/sort.t 0 138 119 72 60.50% 48-119
+ 56 tests and 474 subtests skipped.
+ Failed 3/811 test scripts, 99.63% okay. 78/75813 subtests failed, 99.90% okay.
+
+They are suspected to be compiler errors (at least the shuffle.t
+failure is known from some IRIX 6 setups) and math library errors
+(the Trig.t failure), but since IRIX 5 is long since end-of-lifed,
+further fixes for the IRIX are unlikely. If you can get gcc for 5.3,
+you could try that, too, since gcc in IRIX 6 is a known workaround for
+at least the shuffle.t and sort.t failures.
+
+=head1 AUTHOR
+
+Jarkko Hietaniemi <jhi@iki.fi>
+
+Please report any errors, updates, or suggestions to F<perlbug@perl.org>.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perljp.pod b/Master/tlpkg/tlperl.straw/lib/pods/perljp.pod
new file mode 100755
index 00000000000..579c8ad9dc9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perljp.pod
@@ -0,0 +1,206 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+The following documentation is written in euc-jp encoding.
+
+=encoding euc-jp
+
+=head1 NAME
+
+perljp - ÆüËܸì Perl ¥¬¥¤¥É
+
+=head1 ÀâÌÀ
+
+Perl ¤ÎÀ¤³¦¤Ø¤è¤¦¤³¤½!
+
+Perl 5.8.0 ¤è¤ê¡¢Unicode¥µ¥Ý¡¼¥È¤¬ÂçÉý¤Ë¶¯²½¤µ¤ì¡¢¤½¤Î·ë²Ì¥é¥Æ¥óʸ»ú°Ê³°¤Îʸ»ú¥³¡¼¥É¤Î¥µ¥Ý¡¼¥È¤¬ CJK (Ãæ¹ñ¸ì¡¢ÆüËܸ졢¥Ï¥ó¥°¥ë)¤ò´Þ¤á¤Æ²Ã¤ï¤ê¤Þ¤·¤¿¡£Unicode¤ÏÀ¤³¦Ãæ¤Îʸ»ú¤ò°ì¤Ä¤Îʸ»ú¥³¡¼¥É¤Ç°·¤¦¤³¤È¤òÌܻؤ·¤¿É¸½àµ¬³Ê¤Ç¤¢¤ê¡¢Å줫¤éÀ¾¡¢¤Ï¤¿¤Þ¤¿¤½¤Î´Ö¤Îʸ»ú¡Ê¥®¥ê¥·¥ãʸ»ú¡¢¥­¥ê¡¼¥ëʸ»ú¡¢¥¢¥é¥Ó¥¢Ê¸»ú¡¢¥Ø¥Ö¥é¥¤Ê¸»ú¡¢¥Ç¥£¡¼¥ô¥¡¥Ê¥¬¡¼¥êʸ»ú¡¢¤Ê¤É¤Ê¤É¡Ë¤ä¡¢¤³¤ì¤Þ¤Ç¤ÏOS¥Ù¥ó¥À¡¼¤¬Æȼ«¤ËÄê¤á¤Æ¤¤¤¿Ê¸»ú(PC¤ª¤è¤ÓMacintosh)¤¬¤¹¤Ç¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£
+
+Perl ¼«¿È¤Ï Unicode ¤ÇÆ°ºî¤·¤Þ¤¹¡£Perl ¥¹¥¯¥ê¥×¥ÈÆâ¤Îʸ»úÎó¥ê¥Æ¥é¥ë¤äÀµµ¬É½¸½¤Ï Unicode ¤òÁ°Äó¤È¤·¤Æ¤¤¤Þ¤¹¡£¤½¤·¤ÆÆþ½ÐÎϤΤ¿¤á¤Ë¤Ï¡¢¤³¤ì¤Þ¤Ç»È¤ï¤ì¤Æ¤­¤¿¤µ¤Þ¤¶¤Þ¤Êʸ»ú¥³¡¼¥É¤ËÂбþ¤¹¤ë¥â¥¸¥å¡¼¥ë¡¢¡Ö Encode ¡×¤¬É¸½àÁõÈ÷¤µ¤ì¤Æ¤ª¤ê¡¢Unicode ¤È¤³¤ì¤é¤Îʸ»ú¥³¡¼¥É¤ÎÁê¸ßÊÑ´¹¤â´Êñ¤Ë¹Ô¤¨¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
+
+¸½»þÅÀ¤Ç Encode ¤¬¥µ¥Ý¡¼¥È¤¹¤ëʸ»ú¥³¡¼¥É¤Ï°Ê²¼¤Î¤È¤ª¤ê¤Ç¤¹¡£
+
+ 7bit-jis AdobeStandardEncoding AdobeSymbol AdobeZdingbat
+ ascii big5 big5-hkscs cp1006
+ cp1026 cp1047 cp1250 cp1251
+ cp1252 cp1253 cp1254 cp1255
+ cp1256 cp1257 cp1258 cp37
+ cp424 cp437 cp500 cp737
+ cp775 cp850 cp852 cp855
+ cp856 cp857 cp860 cp861
+ cp862 cp863 cp864 cp865
+ cp866 cp869 cp874 cp875
+ cp932 cp936 cp949 cp950
+ dingbats euc-cn euc-jp euc-kr
+ gb12345-raw gb2312-raw gsm0338 hp-roman8
+ hz iso-2022-jp iso-2022-jp-1 iso-8859-1
+ iso-8859-10 iso-8859-11 iso-8859-13 iso-8859-14
+ iso-8859-15 iso-8859-16 iso-8859-2 iso-8859-3
+ iso-8859-4 iso-8859-5 iso-8859-6 iso-8859-7
+ iso-8859-8 iso-8859-9 iso-ir-165 jis0201-raw
+ jis0208-raw jis0212-raw johab koi8-f
+ koi8-r koi8-u ksc5601-raw MacArabic
+ MacCentralEurRoman MacChineseSimp MacChineseTrad MacCroatian
+ MacCyrillic MacDingbats MacFarsi MacGreek
+ MacHebrew MacIcelandic MacJapanese MacKorean
+ MacRoman MacRomanian MacRumanian MacSami
+ MacSymbol MacThai MacTurkish MacUkrainian
+ nextstep posix-bc shiftjis symbol
+ UCS-2BE UCS-2LE UTF-16 UTF-16BE
+ UTF-16LE UTF-32 UTF-32BE UTF-32LE
+ utf8 viscii
+
+(Á´114¼ïÎà)
+
+Î㤨¤Ð¡¢Ê¸»ú¥³¡¼¥ÉFOO¤Î¥Õ¥¡¥¤¥ë¤òUTF-8¤ËÊÑ´¹¤¹¤ë¤Ë¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£
+
+ perl -Mencoding=FOO,STDOUT,utf8 -pe1 < file.FOO > file.utf8
+
+¤Þ¤¿¡¢Perl¤Ë¤Ï¡¢Á´Éô¤¬Perl¤Ç½ñ¤«¤ì¤¿Ê¸»ú¥³¡¼¥ÉÊÑ´¹¥æ¡¼¥Æ¥£¥ê¥Æ¥£¡¢piconv¤âÉÕ°¤·¤Æ¤¤¤ë¤Î¤Ç¡¢°Ê²¼¤Î¤è¤¦¤Ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£
+
+ piconv -f FOO -t utf8 < file.FOO > file.utf8
+ piconv -f utf8 -t FOO < file.utf8 > file.FOO
+
+=head2 About (jcode.pl|Jcode.pm|JPerl)
+
+5.8°ÊÁ°¤Î¡¢¥¹¥¯¥ê¥×¥È¤¬EUC-JP¤Ç¤¢¤ì¤Ð¥ê¥Æ¥é¥ë¤À¤±¤Ï°·¤¦¤³¤È¤¬¤Ç¤­¤Þ¤·¤¿¡£¤Þ¤¿¡¢Æþ½ÐÎϤò°·¤¦¥â¥¸¥å¡¼¥ë¤È¤·¤Æ¤ÏJcode.pm¤¬( http://openlab.jp/Jcode/ )¡¢perl4ÍѤΥ桼¥Æ¥£¥ê¥Æ¥£¤È¤·¤Æ¤Ïjcode.pl( http://srekcah.org/jcode/ )¤¬¤½¤ì¤¾¤ì¸ºß¤·¡¢ÆüËܸì¤Î°·¤¨¤ëCGI¤Ç¤è¤¯ÍøÍѤµ¤ì¤Æ¤¤¤ë¤³¤È¤ò¸æ¸¤¸¤ÎÊý¤â¾¯¤Ê¤¯¤Ê¤¤¤«¤È»×¤ï¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢ÆüËܸì¤Ë¤è¤ëÀµµ¬É½¸½¤ò¤¦¤Þ¤¯°·¤¦¤³¤È¤ÏÉÔ²Äǽ¤Ç¤·¤¿¡£
+
+5.005°ÊÁ°¤ÎPerl¤Ë¤Ï¡¢ÆüËܸì¤ËÆò½¤·¤¿¥í¡¼¥«¥é¥¤¥ºÈÇ¡¢Jperl¤¬Â¸ºß¤·¤Þ¤·¤¿( http://homepage2.nifty.com/kipp/perl/jperl/index.html )¡£¤Þ¤¿¡¢Mac OS 9.x/ClassicÍѤÎPerl¡¢MacPerl¤ÎÆüËܸìÈǤâMacJPerl¤È¤·¤Æ¸ºß¤·¤Æ¤Þ¤·¤¿¡£( http://world.std.com/~habilis/macjperl/ ).¤³¤ì¤é¤Ç¤Ïʸ»ú¥³¡¼¥É¤È¤·¤ÆEUC-JP¤Ë²Ã¤¨Shift_JIS¤â¤½¤Î¤Þ¤Þ°·¤¦¤³¤È¤¬¤Ç¤­¡¢¤Þ¤¿ÆüËܸì¤Ë¤è¤ëÀµµ¬É½¸½¤ò°·¤¦¤³¤È¤â²Äǽ¤Ç¤·¤¿¡£
+
+Perl5.8¤Ç¤Ï¡¢¤³¤ì¤é¤Îµ¡Ç½¤¬¤¹¤Ù¤ÆPerlËÜÂΤÀ¤±¤Ç¼Â¸½¤Ç¤­¤ë¾å¤Ë¡¢ÆüËܸì¤Î¤ß¤Ê¤é¤º¾åµ­114¤Îʸ»ú¥³¡¼¥É¤ò¤¹¤Ù¤Æ¡¢¤·¤«¤âƱ»þ¤Ë°·¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤µ¤é¤Ë¡¢CPAN¤Ê¤É¤«¤é¿·¤·¤¤Ê¸»ú¥³¡¼¥ÉÍѤΥ⥸¥å¡¼¥ë¤òÆþ¼ê¤¹¤ë¤³¤È¤â´Êñ¤Ë¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
+
+=over 4
+
+=item *
+
+Æþ½ÐÎÏ
+
+°Ê²¼¤ÎÎã¤Ï¤¤¤Å¤ì¤âShift_JIS¤ÎÆþÎϤòEUC-JP¤ËÊÑ´¹¤·¤Æ½ÐÎϤ·¤Þ¤¹¡£
+
+ # jcode.pl
+ require "jcode.pl";
+ while(<>){
+ jcode::convert(*_, 'euc', 'sjis');
+ print;
+ }
+ # Jcode.pm
+ use Jcode;
+ while(<>){
+ print Jcode->new($_, 'sjis')->euc;
+ }
+ # Perl 5.8
+ use Encode;
+ while(<>){
+ from_to($_, 'shiftjis', 'euc-jp');
+ print;
+ }
+ # Perl 5.8 - encoding ¤òÍøÍѤ·¤Æ
+ use encoding 'euc-jp', STDIN => 'shiftjis';
+ while(<>){
+ print;
+ }
+
+=item *
+
+Jperl ¸ß´¹¥¹¥¯¥ê¥×¥È
+
+ ¤¤¤ï¤æ¤ë"shebang"¤òÊѹ¹¤¹¤ë¤À¤±¤Ç¡¢JperlÍѤÎscript¤Î¤Û¤È¤ó¤É¤ÏÊѹ¹¤Ê¤·¤ËÍøÍѲÄǽ¤À¤È»×¤ï¤ì¤Þ¤¹¡£
+
+ #!/path/to/jperl
+ ¢­
+ #!/path/to/perl -Mencoding=euc-jp
+
+ ¾Ü¤·¤¯¤Ï perldoc encoding ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
+
+=back
+
+=head2 ¤µ¤é¤Ë¾Ü¤·¤¯
+
+Perl¤Ë¤ÏËÄÂç¤Ê»ñÎÁ¤¬ÉÕ°¤·¤Æ¤ª¤ê¡¢Perl¤Î¿·µ¡Ç½¤äUnicode¥µ¥Ý¡¼¥È¡¢¤½¤·¤ÆEncode¥â¥¸¥å¡¼¥ë¤Î»ÈÍÑË¡¤Ê¤É¤¬ºÙ¤«¤¯ÌÖÍ夵¤ì¤Æ¤¤¤Þ¤¹¡Ê»ÄÇ°¤Ê¤¬¤é¡¢¤Û¤È¤ó¤É±Ñ¸ì¤Ç¤Ï¤¢¤ê¤Þ¤¹¤¬¡Ë¡£°Ê²¼¤Î¥³¥Þ¥ó¥É¤Ç¤½¤ì¤é¤Î°ìÉô¤ò±ÜÍ÷¤¹¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£
+
+ perldoc perlunicode # Perl¤ÎUnicode¥µ¥Ý¡¼¥ÈÁ´ÈÌ
+ perldoc Encode # Encode¥â¥¸¥å¡¼¥ë¤Ë´Ø¤·¤Æ
+ perldoc Encode::JP # ¤¦¤ÁÆüËܸìʸ»ú¥³¡¼¥É¤Ë´Ø¤·¤Æ
+
+=head2 PerlÁ´È̤˴ؤ¹¤ë URL
+
+=over 4
+
+=item L<http://www.perl.com/>
+
+Perl ¥Û¡¼¥à¥Ú¡¼¥¸ (O'Reilly and Associates)
+
+=item L<http://www.cpan.org/>
+
+CPAN (Comprehensive Perl Archive Network)
+
+=item L<http://lists.perl.org/>
+
+Perl ¥á¡¼¥ê¥ó¥°¥ê¥¹¥È½¸
+
+=back
+
+=head2 Perl¤Î½¤ÆÀ¤ËÌòΩ¤Ä URL
+
+=over 4
+
+=item L<http://www.oreilly.com.tw/chinese/>
+
+O'Reilly ¼Ò¤ÎPerl´ØÏ¢½ñÀÒ(ÈËÂλúÃæ¹ñ¸ì)
+
+=item L<http://www.oreilly.com.cn/chinese/>
+
+O'Reilly ¼Ò¤ÎPerl´ØÏ¢½ñÀÒ(´ÊÂλúÃæ¹ñ¸ì)
+
+=item L<http://www.oreilly.co.jp/catalog.htm>
+
+¥ª¥é¥¤¥ê¡¼¼Ò¤ÎPerl´ØÏ¢½ñÀÒ(ÆüËܸì)
+
+=back
+
+=head2 Perl ¥æ¡¼¥¶¡¼¥°¥ë¡¼¥×
+
+=over 4
+
+=item L<http://www.pm.org/groups/asia.html>
+
+Ãæ¹ñ¡ÊÃæ²Ú¿Í̱¶¦Ï¹ñ¡Ë
+
+=item L<http://www.pm.org/groups/asia.shtml#Japan>
+
+ÆüËÜ
+
+=item L<http://www.pm.org/groups/asia.shtml#Korea%20(Republic%20of)>
+
+´Ú¹ñ¡ÊÂç´Ú̱¹ñ¡Ë
+
+=item L<http://www.pm.org/groups/asia.shtml#Taiwan>
+
+ÂæÏÑ¡ÊÃæ²Ú̱¹ñ¡Ë
+
+=back
+
+=head2 Unicode´ØÏ¢¤ÎURL
+
+=over 4
+
+=item L<http://www.unicode.org/>
+
+Unicode ¥³¥ó¥½¡¼¥·¥¢¥à (Unicodeµ¬³Ê¤ÎÁªÄêÃÄÂÎ)
+
+=item L<http://www.cl.cam.ac.uk/%7Emgk25/unicode.html>
+
+UTF-8 and Unicode FAQ for Unix/Linux
+
+=item L<http://kldp.org/Translations/html/UTF8-Unicode-KLDP/UTF8-Unicode-KLDP.html>
+
+UTF-8 and Unicode FAQ for Unix/Linux (¥Ï¥ó¥°¥ëÌõ)
+
+=back
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi E<lt>jhi@iki.fiE<gt>
+Dan Kogai (¾®»ô¡¡ÃÆ) E<lt>dankogai@dan.co.jpE<gt>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlko.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlko.pod
new file mode 100755
index 00000000000..c88b969b538
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlko.pod
@@ -0,0 +1,219 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+This file is in Korean encoded in EUC-KR.
+
+ÀÌ ¹®¼­¸¦ perldocÀ» ½á¼­ º¸Áö ¾Ê°í Á÷Á¢ º¸´Â °æ¿ì¿¡´Â °¢ ºÎºÐÀÇ
+¿ªÇÒÀ» Ç¥½ÃÇϱâ À§ÇØ ¾²ÀÎ =head, =item, 'L' µîÀº ¹«½ÃÇϽʽÿÀ.
+ÀÌ ¹®¼­´Â µû·Î perldocÀ» ¾²Áö ¾Ê°í º¸´õ¶óµµ Àдµ¥ º° ÁöÀåÀÌ
+¾ø´Â POD Çü½ÄÀ¸·Î Â¥¿© ÀÖ½À´Ï´Ù. ´õ ÀÚ¼¼ÇÑ °ÍÀº perlpod
+¸Å´º¾óÀ» Âü°íÇϽʽÿÀ.
+
+=encoding euc-kr
+
+=head1 NAME
+
+perlko - Perl°ú Çѱ¹¾î ÀÎÄÚµù
+
+=head1 DESCRIPTION
+
+PerlÀÇ ¼¼°è¿¡ ¿À½Å °ÍÀ» ȯ¿µÇÕ´Ï´Ù !
+
+
+PerlÀº 5.8.0ÆǺÎÅÍ À¯´ÏÄÚµå/ISO 10646¿¡ ´ëÇÑ ±¤¹üÀ§ÇÑ Áö¿øÀ» ÇÕ´Ï´Ù.
+À¯´ÏÄÚµå Áö¿øÀÇ ÀÏȯÀ¸·Î ÇÑÁßÀÏÀ» ºñ·ÔÇÑ ¼¼°è °¢±¹¿¡¼­
+À¯´ÏÄÚµå ÀÌÀü¿¡ ¾²°í ÀÖ¾ú°í Áö±Ýµµ ³Î¸® ¾²ÀÌ°í ÀÖ´Â ¼ö¸¹Àº ÀÎÄÚµùÀ»
+Áö¿øÇÕ´Ï´Ù. À¯´ÏÄÚµå´Â Àü ¼¼°è¿¡¼­ ¾²ÀÌ´Â ¸ðµç ¾ð¾î¸¦ À§ÇÑ Ç¥±â ü°è -
+À¯·´ÀÇ ¶óƾ ¾ËÆĺª, Å°¸± ¾ËÆĺª, ±×¸®½º ¾ËÆĺª, Àεµ¿Í µ¿³² ¾Æ½Ã¾ÆÀÇ
+ºê¶ó¹Ì °è¿­ ½ºÅ©¸³Æ®, ¾Æ¶ø ¹®ÀÚ, È÷ºê¸® ¹®ÀÚ, ÇÑÁßÀÏÀÇ ÇÑÀÚ, Çѱ¹¾îÀÇ ÇѱÛ,
+ÀϺ»¾îÀÇ °¡³ª, ºÏ¹Ì Àεð¾ÈÀÇ Ç¥±â ü°è µî-¸¦ ¼ö¿ëÇÏ´Â °ÍÀ» ¸ñÇ¥·Î ÇÏ°í
+Àֱ⠶§¹®¿¡ ±âÁ¸¿¡ ¾²ÀÌ´ø °¢ ¾ð¾î ¹× ±¹°¡ ±×¸®°í ¿î¿µ ü°è¿¡ °íÀ¯ÇÑ
+¹®ÀÚ ÁýÇÕ°ú ÀÎÄÚµù¿¡ ¾µ ¼ö ÀÖ´Â ¸ðµç ±ÛÀÚ´Â ¹°·ÐÀÌ°í ±âÁ¸ ¹®ÀÚ ÁýÇÕ¿¡¼­
+Áö¿øÇÏ°í ÀÖÁö ¾Ê´ø ¾ÆÁÖ ¸¹Àº ±ÛÀÚ¸¦ Æ÷ÇÔÇÏ°í ÀÖ½À´Ï´Ù.
+
+
+PerlÀº ³»ºÎÀûÀ¸·Î À¯´ÏÄڵ带 ¹®ÀÚ Ç¥ÇöÀ» À§ÇØ »ç¿ëÇÕ´Ï´Ù. º¸´Ù ±¸Ã¼ÀûÀ¸·Î
+¸»Çϸé Perl ½ºÅ©¸³Æ® ¾È¿¡¼­ UTF-8 ¹®ÀÚ¿­À» ¾µ ¼ö ÀÖ°í,
+°¢Á¾ ÇÔ¼ö¿Í ¿¬»êÀÚ(¿¹¸¦ µé¾î, Á¤±Ô½Ä, index, substr)°¡ ¹ÙÀÌÆ® ´ÜÀ§
+´ë½Å À¯´ÏÄÚµå ±ÛÀÚ ´ÜÀ§·Î µ¿ÀÛÇÕ´Ï´Ù. (´õ ÀÚ¼¼ÇÑ °ÍÀº
+perlunicode ¸Å´º¾óÀ» Âü°íÇϽʽÿÀ.) À¯´ÏÄڵ尡 ³Î¸® º¸±ÞµÇ±â Àü¿¡
+³Î¸® ¾²ÀÌ°í ÀÖ¾ú°í, ¿©ÀüÈ÷ ³Î¸® ¾²ÀÌ°í ÀÖ´Â °¢±¹/°¢ ¾ð¾îº° ÀÎÄÚµùÀ¸·Î
+ÀÔÃâ·ÂÀ» ÇÏ°í À̵é ÀÎÄÚµùÀ¸·Î µÈ µ¥ÀÌÅÍ¿Í ¹®¼­¸¦ ´Ù·ç´Â °ÍÀ» µ½±â À§ÇØ
+'Encode'°¡ ¾²¿´½À´Ï´Ù. ¹«¾ùº¸´Ù 'Encode'¸¦ ½á¼­ ¼ö¸¹Àº ÀÎÄÚµù »çÀÌÀÇ
+º¯È¯À» ½±°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù.
+
+'Encode'´Â ´ÙÀ½°ú °°Àº Çѱ¹¾î ÀÎÄÚµùÀ» Áö¿øÇÕ´Ï´Ù.
+
+=over 4
+
+=item euc-kr
+
+ US-ASCII¿Í KS X 1001À» °°ÀÌ ¾²´Â ¸ÖƼ¹ÙÀÌÆ® ÀÎÄÚµù (ÈçÈ÷ ¿Ï¼ºÇüÀ̶ó°í
+ ºÒ¸².) KS X 2901°ú RFC 1557 Âü°í.
+
+=item cp949
+
+ MS-Windows 9x/ME¿¡¼­ ¾²ÀÌ´Â È®Àå ¿Ï¼ºÇü. euc-kr¿¡ 8,822ÀÚÀÇ
+ ÇÑ±Û À½ÀýÀ» ´õÇÑ °ÍÀÓ. alias´Â uhc, windows-949, x-windows-949,
+ ks_c_5601-1987. ¸Ç ¸¶Áö¸· À̸§Àº ÀûÀýÇÏÁö ¾ÊÀº À̸§ÀÌÁö¸¸, Microsoft
+ Á¦Ç°¿¡¼­ CP949ÀÇ Àǹ̷Π¾²ÀÌ°í ÀÖÀ½.
+
+=item johab
+
+ KS X 1001:1998 ºÎ·Ï 3¿¡¼­ ±ÔÁ¤ÇÑ Á¶ÇÕÇü. ¹®ÀÚ ·¹ÆÛÅ丮´Â cp949¿Í
+ ¸¶Âù°¡Áö·Î US-ASCII¿Í KS X 1001¿¡ 8,822ÀÚÀÇ ÇÑ±Û À½ÀýÀ» ´õÇÑ °ÍÀÓ.
+ ÀÎÄÚµù ¹æ½ÄÀº ÀüÇô ´Ù¸§.
+
+=item iso-2022-kr
+
+ RFC 1557¿¡¼­ ±ÔÁ¤ÇÑ Çѱ¹¾î ÀÎÅÍ³Ý ¸ÞÀÏ ±³È¯¿ë ÀÎÄÚµùÀ¸·Î US-ASCII¿Í
+ KS X 1001À» ·¹ÆÛÅ丮·Î ÇÏ´Â Á¡¿¡¼­ euc-kr°ú °°Áö¸¸ ÀÎÄÚµù ¹æ½ÄÀÌ ´Ù¸§.
+ 1997-8³â °æ±îÁö ¾²¿´À¸³ª ´õ ÀÌ»ó ¸ÞÀÏ ±³È¯¿¡ ¾²ÀÌÁö ¾ÊÀ½.
+
+=item ksc5601-raw
+
+ KS X 1001(KS C 5601)À» GL(Áï, MSB¸¦ 0À¸·Î ÇÑ °æ¿ì) ¿¡ ³õ¾ÒÀ» ¶§ÀÇ
+ ÀÎÄÚµù. US-ASCII¿Í °áÇÕÇÏÁö ¾Ê°í ´Üµ¶À¸·Î ¾²ÀÌ´Â ÀÏÀº X11 µî¿¡¼­ ±Û²Ã
+ ÀÎÄÚµù (ksc5601.1987-0. '0'Àº GLÀ» ÀǹÌÇÔ.)À¸·Î ¾²ÀÌ´Â °ÍÀ» Á¦¿ÜÇÏ°í´Â
+ °ÅÀÇ ¾øÀ½. KS C 5601Àº 1997³â KS X 1001·Î À̸§À» ¹Ù²Ù¾úÀ½. 1998³â¿¡´Â µÎ
+ ±ÛÀÚ (À¯·ÎÈ­ ºÎÈ£¿Í µî·Ï »óÇ¥ ºÎÈ£)°¡ ´õÇØÁ³À½.
+
+=back
+
+ ¸î °¡Áö »ç¿ë ¿¹Á¦¸¦ ¾Æ·¡¿¡ º¸ÀÔ´Ï´Ù.
+
+¿¹¸¦ µé¾î, euc-kr ÀÎÄÚµùÀ¸·Î µÈ ÆÄÀÏÀ» UTF-8·Î º¯È¯ÇÏ·Á¸é ´ÙÀ½°ú
+°°ÀÌ ÇÏ¸é µË´Ï´Ù.
+
+
+ perl -Mencoding=euc-kr,STDOUT,utf8 -pe1 < file.euckr > file.utf8
+
+¿ªº¯È¯Àº ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖ½À´Ï´Ù.
+
+ perl -Mencoding=utf8,STDOUT,euc-kr -pe1 < file.utf8 > file.euckr
+
+ ÀÌ·± º¯È¯À» Á»´õ Æí¸®ÇÏ°Ô ÇÒ ¼ö ÀÖµµ·Ï Encode ¸ðµâÀ» ½á¼­
+¼ø¼öÇÏ°Ô Perl·Î¸¸ ¾²ÀÎ piconv°¡ Perl¿¡ µé¾î ÀÖ½À´Ï´Ù.
+±× À̸§¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ piconv´Â Unix¿¡ ÀÖ´Â iconv¸¦
+¸ðµ¨·Î ÇÑ °ÍÀÔ´Ï´Ù. ±× »ç¿ë¹ýÀº ¾Æ·¡¿Í °°½À´Ï´Ù.
+
+ piconv -f euc-kr -t utf8 < file.euckr > file.utf8
+ piconv -f utf8 -t euc-kr < file.utf8 > file.euckr
+
+ ¶Ç, 'PerlIO::encoding' ¸ðµâÀ» ½á¼­ Çѱ¹¾î ÀÎÄÚµùÀ» ¾²¸é¼­ ±ÛÀÚ ´ÜÀ§
+(¹ÙÀÌÆ® ´ÜÀ§°¡ ¾Æ´Ï¶ó) 󸮸¦ ½±°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù.
+
+ #!/path/to/perl
+
+ use encoding 'euc-kr', STDIN => 'euc-kr',
+ STDOUT-> 'euc-kr', STDERR=>'euc-kr';
+
+ print length("°¡³ª"); # 2 (Å« µû¿ÈÇ¥´Â ±ÛÀÚ ´ÜÀ§ 󸮸¦ Áö½Ã)
+ print length('°¡³ª'); # 4 (ÀÛÀº µû¿ÈÇ¥´Â ¹ÙÀÌÆ® ´ÜÀ§ 󸮸¦ Áö½Ã)
+ print index("ÇÑ°­, ´ëµ¿°­", "¿°"); # -1 ('¿°'ÀÌ ¾øÀ½)
+ print index('ÇÑ°­, ´ëµ¿°­', '¿°'); # 7 (8¹ø°¿Í 9¹ø° ¹ÙÀÌÆ®°¡ '¿°'ÀÇ
+ Äڵ尪°ú ÀÏÄ¡ÇÔ.)
+
+
+=head2 ´õ ÀÚ¼¼È÷ ¾Ë°í ½ÍÀ¸¸é...
+
+ PerlÀ» ¼³Ä¡ÇÏ¸é ´ë´ÜÈ÷ ÀÚ¼¼ÇÑ ¹®¼­°¡ °°ÀÌ µû¶ó ¿À¸ç, ÀÌ ¹®¼­¸¦ ÅëÇØ
+Perl Àü¹Ý »Ó ¾Æ´Ï¶ó À¯´ÏÄÚµå Áö¿ø, EncodeÀÇ »ç¿ë¹ý µî¿¡ ¸¹Àº °ÍÀ»
+¹è¿ï ¼ö ÀÖ½À´Ï´Ù. ¾ÆÁ÷ ÀÌ ¹®¼­´Â ÇöÀç ¸ðµÎ ¿µ¾î·Î ¾²¿© ÀÖ½À´Ï´Ù.
+
+
+=head2 Perl °ü·Ã ÀÚ·á
+
+À§¿¡¼­ ¾ð±ÞÇÑ ¹®¼­ ¿Ü¿¡µµ ´ÙÀ½°ú °°Àº ÀÚ·á°¡ ÀÖ½À´Ï´Ù. ÀÌ ¸ñ·ÏÀº °áÄÚ
+¿ÏÀüÇÑ °ÍÀÌ ¾Æ´Ï°í ÀϺΠ´ëÇ¥ÀûÀÎ °Í¸¸ ¸ðÀº °ÍÀÔ´Ï´Ù.
+
+=over 4
+
+=item L<http://www.perl.com/>
+
+ O'ReillyÀÇ Perl À¥ ÆäÀÌÁö
+
+=item L<http://www.cpan.org/>
+
+ Comprehensive Perl Archive Network
+
+=item L<http://lists.perl.org/>
+
+ Perl ¸ÞÀϸµ ¸®½ºÆ®. ¸¹Àº ¸®½ºÆ® °¡¿îµ¥
+ perl-unicode¿¡¼­ 'Encode'¿¡ ´ëÇØ ³íÀÇÇÔ.
+
+=back
+
+=head2 PerlÀ» ´õ ±í°Ô °øºÎÇϴµ¥ µµ¿òÀ» ÁÙ ¼ö ÀÖ´Â Çѱ¹¾î °ü·Ã »çÀÌÆ®
+
+=over 4
+
+=item L<http://www.perl.or.kr/>
+
+ Perl Çѱ¹ »ç¿ëÀÚ ¸ðÀÓ
+
+=item L<news:han.comp.lang.perl/>
+
+ Çѱ¹¾î Perl ´º½º ±×·ì
+
+=item L<http://seoul.pm.org/>
+
+ Perl ¸Á°Å½º (¼­¿ï)
+
+=item L<http://www.perlmania.or.kr/>
+
+ Home for Korean Perlmanias
+
+=item L<http://www.oreilly.co.kr/perl/>
+
+ O'Reilly¿¡¼­ ³ª¿Â Çѱ¹¾î Perl ¼­Àû ¸ñ·Ï
+
+=item L<http://www.perlschool.net/>
+
+ Perl ±âÃÊ °­Á ¹× ¼Ò½º, ÃÖ±Ù µ¿Çâ, °ü·Ã ÇØ¿Ü »çÀÌÆ® ¸µÅ©
+
+=item L<http://www.perl.co.kr>
+
+ Perl¿¡ °ü·ÃµÈ CGI, DB, ¿¬µ¿ µî¿¡ ´ëÇÑ Á¤º¸ ¹× ´º½º Á¦°ø
+
+=back
+
+=head2 À¯´ÏÄÚµå ¹× Çѱ¹¾î ÀÎÄÚµù °ü·Ã ÀÚ·á
+
+=over 4
+
+=item L<http://www.unicode.org/>
+
+ À¯´ÏÄÚµå ÄÁ¼Ò½Ã¾ö.
+
+=item L<http://std.dkuug.dk/JTC1/SC2/WG2>
+
+±âº»ÀûÀ¸·Î Unicode¿Í °°Àº ISO Ç¥ÁØÀÎ ISO/IEC 10646 UCS(Universal
+Character Set)À» ¸¸µå´Â ISO/IEC JTC1/SC2/WG2ÀÇ À¥ ÆäÀÌÁö.
+
+=item L<http://jshin.net/faq/qa8.html>
+
+ Çѱ¹¾î ¹®ÀÚ ÁýÇÕ ¹× ÀÎÄÚµù¿¡ ´ëÇÑ ¾È³».
+
+=item L<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
+
+ À¯´Ð½º/¸®´ª½º¿¡¼­ À¯´ÏÄÚµå¿Í UTF-8 »ç¿ë¿¡ ´ëÇÑ ¹®´äÁý(FAQ)
+
+=item L<http://kldp.org/Translations/html/UTF8-Unicode-KLDP/UTF8-Unicode-KLDP.html>
+
+ À¯´Ð½º/¸®´ª½º¿¡¼­ À¯´ÏÄÚµå¿Í UTF-8 »ç¿ë¿¡ ´ëÇÑ ¹®´äÁý(FAQ)ÀÇ Çѱ¹¾î ¹ø¿ª
+
+=back
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::KR>, L<encoding>, L<perluniintro>, L<perlunicode>
+
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi E<lt>jhi@iki.fiE<gt>
+½ÅÁ¤½Ä E<lt>jshin@mailaps.orgE<gt>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perllexwarn.pod b/Master/tlpkg/tlperl.straw/lib/pods/perllexwarn.pod
new file mode 100755
index 00000000000..72370c72e41
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perllexwarn.pod
@@ -0,0 +1,525 @@
+=head1 NAME
+X<warning, lexical> X<warnings> X<warning>
+
+perllexwarn - Perl Lexical Warnings
+
+=head1 DESCRIPTION
+
+The C<use warnings> pragma enables to control precisely what warnings are
+to be enabled in which parts of a Perl program. It's a more flexible
+alternative for both the command line flag B<-w> and the equivalent Perl
+variable, C<$^W>.
+
+This pragma works just like the C<strict> pragma.
+This means that the scope of the warning pragma is limited to the
+enclosing block. It also means that the pragma setting will not
+leak across files (via C<use>, C<require> or C<do>). This allows
+authors to independently define the degree of warning checks that will
+be applied to their module.
+
+By default, optional warnings are disabled, so any legacy code that
+doesn't attempt to control the warnings will work unchanged.
+
+All warnings are enabled in a block by either of these:
+
+ use warnings;
+ use warnings 'all';
+
+Similarly all warnings are disabled in a block by either of these:
+
+ no warnings;
+ no warnings 'all';
+
+For example, consider the code below:
+
+ use warnings;
+ my @a;
+ {
+ no warnings;
+ my $b = @a[0];
+ }
+ my $c = @a[0];
+
+The code in the enclosing block has warnings enabled, but the inner
+block has them disabled. In this case that means the assignment to the
+scalar C<$c> will trip the C<"Scalar value @a[0] better written as $a[0]">
+warning, but the assignment to the scalar C<$b> will not.
+
+=head2 Default Warnings and Optional Warnings
+
+Before the introduction of lexical warnings, Perl had two classes of
+warnings: mandatory and optional.
+
+As its name suggests, if your code tripped a mandatory warning, you
+would get a warning whether you wanted it or not.
+For example, the code below would always produce an C<"isn't numeric">
+warning about the "2:".
+
+ my $a = "2:" + 3;
+
+With the introduction of lexical warnings, mandatory warnings now become
+I<default> warnings. The difference is that although the previously
+mandatory warnings are still enabled by default, they can then be
+subsequently enabled or disabled with the lexical warning pragma. For
+example, in the code below, an C<"isn't numeric"> warning will only
+be reported for the C<$a> variable.
+
+ my $a = "2:" + 3;
+ no warnings;
+ my $b = "2:" + 3;
+
+Note that neither the B<-w> flag or the C<$^W> can be used to
+disable/enable default warnings. They are still mandatory in this case.
+
+=head2 What's wrong with B<-w> and C<$^W>
+
+Although very useful, the big problem with using B<-w> on the command
+line to enable warnings is that it is all or nothing. Take the typical
+scenario when you are writing a Perl program. Parts of the code you
+will write yourself, but it's very likely that you will make use of
+pre-written Perl modules. If you use the B<-w> flag in this case, you
+end up enabling warnings in pieces of code that you haven't written.
+
+Similarly, using C<$^W> to either disable or enable blocks of code is
+fundamentally flawed. For a start, say you want to disable warnings in
+a block of code. You might expect this to be enough to do the trick:
+
+ {
+ local ($^W) = 0;
+ my $a =+ 2;
+ my $b; chop $b;
+ }
+
+When this code is run with the B<-w> flag, a warning will be produced
+for the C<$a> line -- C<"Reversed += operator">.
+
+The problem is that Perl has both compile-time and run-time warnings. To
+disable compile-time warnings you need to rewrite the code like this:
+
+ {
+ BEGIN { $^W = 0 }
+ my $a =+ 2;
+ my $b; chop $b;
+ }
+
+The other big problem with C<$^W> is the way you can inadvertently
+change the warning setting in unexpected places in your code. For example,
+when the code below is run (without the B<-w> flag), the second call
+to C<doit> will trip a C<"Use of uninitialized value"> warning, whereas
+the first will not.
+
+ sub doit
+ {
+ my $b; chop $b;
+ }
+
+ doit();
+
+ {
+ local ($^W) = 1;
+ doit()
+ }
+
+This is a side-effect of C<$^W> being dynamically scoped.
+
+Lexical warnings get around these limitations by allowing finer control
+over where warnings can or can't be tripped.
+
+=head2 Controlling Warnings from the Command Line
+
+There are three Command Line flags that can be used to control when
+warnings are (or aren't) produced:
+
+=over 5
+
+=item B<-w>
+X<-w>
+
+This is the existing flag. If the lexical warnings pragma is B<not>
+used in any of you code, or any of the modules that you use, this flag
+will enable warnings everywhere. See L<Backward Compatibility> for
+details of how this flag interacts with lexical warnings.
+
+=item B<-W>
+X<-W>
+
+If the B<-W> flag is used on the command line, it will enable all warnings
+throughout the program regardless of whether warnings were disabled
+locally using C<no warnings> or C<$^W =0>. This includes all files that get
+included via C<use>, C<require> or C<do>.
+Think of it as the Perl equivalent of the "lint" command.
+
+=item B<-X>
+X<-X>
+
+Does the exact opposite to the B<-W> flag, i.e. it disables all warnings.
+
+=back
+
+=head2 Backward Compatibility
+
+If you are used with working with a version of Perl prior to the
+introduction of lexically scoped warnings, or have code that uses both
+lexical warnings and C<$^W>, this section will describe how they interact.
+
+How Lexical Warnings interact with B<-w>/C<$^W>:
+
+=over 5
+
+=item 1.
+
+If none of the three command line flags (B<-w>, B<-W> or B<-X>) that
+control warnings is used and neither C<$^W> or the C<warnings> pragma
+are used, then default warnings will be enabled and optional warnings
+disabled.
+This means that legacy code that doesn't attempt to control the warnings
+will work unchanged.
+
+=item 2.
+
+The B<-w> flag just sets the global C<$^W> variable as in 5.005 -- this
+means that any legacy code that currently relies on manipulating C<$^W>
+to control warning behavior will still work as is.
+
+=item 3.
+
+Apart from now being a boolean, the C<$^W> variable operates in exactly
+the same horrible uncontrolled global way, except that it cannot
+disable/enable default warnings.
+
+=item 4.
+
+If a piece of code is under the control of the C<warnings> pragma,
+both the C<$^W> variable and the B<-w> flag will be ignored for the
+scope of the lexical warning.
+
+=item 5.
+
+The only way to override a lexical warnings setting is with the B<-W>
+or B<-X> command line flags.
+
+=back
+
+The combined effect of 3 & 4 is that it will allow code which uses
+the C<warnings> pragma to control the warning behavior of $^W-type
+code (using a C<local $^W=0>) if it really wants to, but not vice-versa.
+
+=head2 Category Hierarchy
+X<warning, categories>
+
+A hierarchy of "categories" have been defined to allow groups of warnings
+to be enabled/disabled in isolation.
+
+The current hierarchy is:
+
+ all -+
+ |
+ +- closure
+ |
+ +- deprecated
+ |
+ +- exiting
+ |
+ +- glob
+ |
+ +- io -----------+
+ | |
+ | +- closed
+ | |
+ | +- exec
+ | |
+ | +- layer
+ | |
+ | +- newline
+ | |
+ | +- pipe
+ | |
+ | +- unopened
+ |
+ +- misc
+ |
+ +- numeric
+ |
+ +- once
+ |
+ +- overflow
+ |
+ +- pack
+ |
+ +- portable
+ |
+ +- recursion
+ |
+ +- redefine
+ |
+ +- regexp
+ |
+ +- severe -------+
+ | |
+ | +- debugging
+ | |
+ | +- inplace
+ | |
+ | +- internal
+ | |
+ | +- malloc
+ |
+ +- signal
+ |
+ +- substr
+ |
+ +- syntax -------+
+ | |
+ | +- ambiguous
+ | |
+ | +- bareword
+ | |
+ | +- digit
+ | |
+ | +- parenthesis
+ | |
+ | +- precedence
+ | |
+ | +- printf
+ | |
+ | +- prototype
+ | |
+ | +- qw
+ | |
+ | +- reserved
+ | |
+ | +- semicolon
+ |
+ +- taint
+ |
+ +- threads
+ |
+ +- uninitialized
+ |
+ +- unpack
+ |
+ +- untie
+ |
+ +- utf8
+ |
+ +- void
+
+Just like the "strict" pragma any of these categories can be combined
+
+ use warnings qw(void redefine);
+ no warnings qw(io syntax untie);
+
+Also like the "strict" pragma, if there is more than one instance of the
+C<warnings> pragma in a given scope the cumulative effect is additive.
+
+ use warnings qw(void); # only "void" warnings enabled
+ ...
+ use warnings qw(io); # only "void" & "io" warnings enabled
+ ...
+ no warnings qw(void); # only "io" warnings enabled
+
+To determine which category a specific warning has been assigned to see
+L<perldiag>.
+
+Note: In Perl 5.6.1, the lexical warnings category "deprecated" was a
+sub-category of the "syntax" category. It is now a top-level category
+in its own right.
+
+
+=head2 Fatal Warnings
+X<warning, fatal>
+
+The presence of the word "FATAL" in the category list will escalate any
+warnings detected from the categories specified in the lexical scope
+into fatal errors. In the code below, the use of C<time>, C<length>
+and C<join> can all produce a C<"Useless use of xxx in void context">
+warning.
+
+ use warnings;
+
+ time;
+
+ {
+ use warnings FATAL => qw(void);
+ length "abc";
+ }
+
+ join "", 1,2,3;
+
+ print "done\n";
+
+When run it produces this output
+
+ Useless use of time in void context at fatal line 3.
+ Useless use of length in void context at fatal line 7.
+
+The scope where C<length> is used has escalated the C<void> warnings
+category into a fatal error, so the program terminates immediately it
+encounters the warning.
+
+To explicitly turn off a "FATAL" warning you just disable the warning
+it is associated with. So, for example, to disable the "void" warning
+in the example above, either of these will do the trick:
+
+ no warnings qw(void);
+ no warnings FATAL => qw(void);
+
+If you want to downgrade a warning that has been escalated into a fatal
+error back to a normal warning, you can use the "NONFATAL" keyword. For
+example, the code below will promote all warnings into fatal errors,
+except for those in the "syntax" category.
+
+ use warnings FATAL => 'all', NONFATAL => 'syntax';
+
+=head2 Reporting Warnings from a Module
+X<warning, reporting> X<warning, registering>
+
+The C<warnings> pragma provides a number of functions that are useful for
+module authors. These are used when you want to report a module-specific
+warning to a calling module has enabled warnings via the C<warnings>
+pragma.
+
+Consider the module C<MyMod::Abc> below.
+
+ package MyMod::Abc;
+
+ use warnings::register;
+
+ sub open {
+ my $path = shift;
+ if ($path !~ m#^/#) {
+ warnings::warn("changing relative path to /var/abc")
+ if warnings::enabled();
+ $path = "/var/abc/$path";
+ }
+ }
+
+ 1;
+
+The call to C<warnings::register> will create a new warnings category
+called "MyMod::abc", i.e. the new category name matches the current
+package name. The C<open> function in the module will display a warning
+message if it gets given a relative path as a parameter. This warnings
+will only be displayed if the code that uses C<MyMod::Abc> has actually
+enabled them with the C<warnings> pragma like below.
+
+ use MyMod::Abc;
+ use warnings 'MyMod::Abc';
+ ...
+ abc::open("../fred.txt");
+
+It is also possible to test whether the pre-defined warnings categories are
+set in the calling module with the C<warnings::enabled> function. Consider
+this snippet of code:
+
+ package MyMod::Abc;
+
+ sub open {
+ warnings::warnif("deprecated",
+ "open is deprecated, use new instead");
+ new(@_);
+ }
+
+ sub new
+ ...
+ 1;
+
+The function C<open> has been deprecated, so code has been included to
+display a warning message whenever the calling module has (at least) the
+"deprecated" warnings category enabled. Something like this, say.
+
+ use warnings 'deprecated';
+ use MyMod::Abc;
+ ...
+ MyMod::Abc::open($filename);
+
+Either the C<warnings::warn> or C<warnings::warnif> function should be
+used to actually display the warnings message. This is because they can
+make use of the feature that allows warnings to be escalated into fatal
+errors. So in this case
+
+ use MyMod::Abc;
+ use warnings FATAL => 'MyMod::Abc';
+ ...
+ MyMod::Abc::open('../fred.txt');
+
+the C<warnings::warnif> function will detect this and die after
+displaying the warning message.
+
+The three warnings functions, C<warnings::warn>, C<warnings::warnif>
+and C<warnings::enabled> can optionally take an object reference in place
+of a category name. In this case the functions will use the class name
+of the object as the warnings category.
+
+Consider this example:
+
+ package Original;
+
+ no warnings;
+ use warnings::register;
+
+ sub new
+ {
+ my $class = shift;
+ bless [], $class;
+ }
+
+ sub check
+ {
+ my $self = shift;
+ my $value = shift;
+
+ if ($value % 2 && warnings::enabled($self))
+ { warnings::warn($self, "Odd numbers are unsafe") }
+ }
+
+ sub doit
+ {
+ my $self = shift;
+ my $value = shift;
+ $self->check($value);
+ # ...
+ }
+
+ 1;
+
+ package Derived;
+
+ use warnings::register;
+ use Original;
+ our @ISA = qw( Original );
+ sub new
+ {
+ my $class = shift;
+ bless [], $class;
+ }
+
+
+ 1;
+
+The code below makes use of both modules, but it only enables warnings from
+C<Derived>.
+
+ use Original;
+ use Derived;
+ use warnings 'Derived';
+ my $a = Original->new();
+ $a->doit(1);
+ my $b = Derived->new();
+ $a->doit(1);
+
+When this code is run only the C<Derived> object, C<$b>, will generate
+a warning.
+
+ Odd numbers are unsafe at main.pl line 7
+
+Notice also that the warning is reported at the line where the object is first
+used.
+
+=head1 SEE ALSO
+
+L<warnings>, L<perldiag>.
+
+=head1 AUTHOR
+
+Paul Marquess
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perllinux.pod b/Master/tlpkg/tlperl.straw/lib/pods/perllinux.pod
new file mode 100755
index 00000000000..c02ddd3fa1e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perllinux.pod
@@ -0,0 +1,39 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+README.linux - Perl version 5 on Linux systems
+
+=head1 DESCRIPTION
+
+This document describes various features of Linux that will affect how Perl
+version 5 (hereafter just Perl) is compiled and/or runs.
+
+=head2 Experimental Support for Sun Studio Compilers for Linux OS
+
+Sun Microsystems has released a port of their Sun Studio compiliers for
+Linux. As of November 2005, only an alpha version has been released.
+Until a release of these compilers is made, support for compiling Perl with
+these compiler experimental.
+
+Also, some special instructions for building Perl with Sun Studio on Linux.
+Following the normal C<Configure>, you have to run make as follows:
+
+ LDLOADLIBS=-lc make
+
+C<LDLOADLIBS> is an environment variable used by the linker to link modules
+C</ext> modules to glibc. Currently, that environment variable is not getting
+populated by a combination of C<Config> entries and C<ExtUtil::MakeMaker>.
+While there may be a bug somewhere in Perl's configuration or
+C<ExtUtil::MakeMaker> causing the problem, the most likely cause is an
+incomplete understanding of Sun Studio by this author. Further investigation
+is needed to get this working better.
+
+=head1 AUTHOR
+
+Steve Peters <steve@fisharerojo.org>
+
+Please report any errors, updates, or suggestions to F<perlbug@perl.org>.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perllocale.pod b/Master/tlpkg/tlperl.straw/lib/pods/perllocale.pod
new file mode 100755
index 00000000000..3c2b3ab8ae2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perllocale.pod
@@ -0,0 +1,1043 @@
+=head1 NAME
+
+perllocale - Perl locale handling (internationalization and localization)
+
+=head1 DESCRIPTION
+
+Perl supports language-specific notions of data such as "is this
+a letter", "what is the uppercase equivalent of this letter", and
+"which of these letters comes first". These are important issues,
+especially for languages other than English--but also for English: it
+would be naE<iuml>ve to imagine that C<A-Za-z> defines all the "letters"
+needed to write in English. Perl is also aware that some character other
+than '.' may be preferred as a decimal point, and that output date
+representations may be language-specific. The process of making an
+application take account of its users' preferences in such matters is
+called B<internationalization> (often abbreviated as B<i18n>); telling
+such an application about a particular set of preferences is known as
+B<localization> (B<l10n>).
+
+Perl can understand language-specific data via the standardized (ISO C,
+XPG4, POSIX 1.c) method called "the locale system". The locale system is
+controlled per application using one pragma, one function call, and
+several environment variables.
+
+B<NOTE>: This feature is new in Perl 5.004, and does not apply unless an
+application specifically requests it--see L<Backward compatibility>.
+The one exception is that write() now B<always> uses the current locale
+- see L<"NOTES">.
+
+=head1 PREPARING TO USE LOCALES
+
+If Perl applications are to understand and present your data
+correctly according a locale of your choice, B<all> of the following
+must be true:
+
+=over 4
+
+=item *
+
+B<Your operating system must support the locale system>. If it does,
+you should find that the setlocale() function is a documented part of
+its C library.
+
+=item *
+
+B<Definitions for locales that you use must be installed>. You, or
+your system administrator, must make sure that this is the case. The
+available locales, the location in which they are kept, and the manner
+in which they are installed all vary from system to system. Some systems
+provide only a few, hard-wired locales and do not allow more to be
+added. Others allow you to add "canned" locales provided by the system
+supplier. Still others allow you or the system administrator to define
+and add arbitrary locales. (You may have to ask your supplier to
+provide canned locales that are not delivered with your operating
+system.) Read your system documentation for further illumination.
+
+=item *
+
+B<Perl must believe that the locale system is supported>. If it does,
+C<perl -V:d_setlocale> will say that the value for C<d_setlocale> is
+C<define>.
+
+=back
+
+If you want a Perl application to process and present your data
+according to a particular locale, the application code should include
+the S<C<use locale>> pragma (see L<The use locale pragma>) where
+appropriate, and B<at least one> of the following must be true:
+
+=over 4
+
+=item *
+
+B<The locale-determining environment variables (see L<"ENVIRONMENT">)
+must be correctly set up> at the time the application is started, either
+by yourself or by whoever set up your system account.
+
+=item *
+
+B<The application must set its own locale> using the method described in
+L<The setlocale function>.
+
+=back
+
+=head1 USING LOCALES
+
+=head2 The use locale pragma
+
+By default, Perl ignores the current locale. The S<C<use locale>>
+pragma tells Perl to use the current locale for some operations:
+
+=over 4
+
+=item *
+
+B<The comparison operators> (C<lt>, C<le>, C<cmp>, C<ge>, and C<gt>) and
+the POSIX string collation functions strcoll() and strxfrm() use
+C<LC_COLLATE>. sort() is also affected if used without an
+explicit comparison function, because it uses C<cmp> by default.
+
+B<Note:> C<eq> and C<ne> are unaffected by locale: they always
+perform a char-by-char comparison of their scalar operands. What's
+more, if C<cmp> finds that its operands are equal according to the
+collation sequence specified by the current locale, it goes on to
+perform a char-by-char comparison, and only returns I<0> (equal) if the
+operands are char-for-char identical. If you really want to know whether
+two strings--which C<eq> and C<cmp> may consider different--are equal
+as far as collation in the locale is concerned, see the discussion in
+L<Category LC_COLLATE: Collation>.
+
+=item *
+
+B<Regular expressions and case-modification functions> (uc(), lc(),
+ucfirst(), and lcfirst()) use C<LC_CTYPE>
+
+=item *
+
+B<The formatting functions> (printf(), sprintf() and write()) use
+C<LC_NUMERIC>
+
+=item *
+
+B<The POSIX date formatting function> (strftime()) uses C<LC_TIME>.
+
+=back
+
+C<LC_COLLATE>, C<LC_CTYPE>, and so on, are discussed further in
+L<LOCALE CATEGORIES>.
+
+The default behavior is restored with the S<C<no locale>> pragma, or
+upon reaching the end of block enclosing C<use locale>.
+
+The string result of any operation that uses locale
+information is tainted, as it is possible for a locale to be
+untrustworthy. See L<"SECURITY">.
+
+=head2 The setlocale function
+
+You can switch locales as often as you wish at run time with the
+POSIX::setlocale() function:
+
+ # This functionality not usable prior to Perl 5.004
+ require 5.004;
+
+ # Import locale-handling tool set from POSIX module.
+ # This example uses: setlocale -- the function call
+ # LC_CTYPE -- explained below
+ use POSIX qw(locale_h);
+
+ # query and save the old locale
+ $old_locale = setlocale(LC_CTYPE);
+
+ setlocale(LC_CTYPE, "fr_CA.ISO8859-1");
+ # LC_CTYPE now in locale "French, Canada, codeset ISO 8859-1"
+
+ setlocale(LC_CTYPE, "");
+ # LC_CTYPE now reset to default defined by LC_ALL/LC_CTYPE/LANG
+ # environment variables. See below for documentation.
+
+ # restore the old locale
+ setlocale(LC_CTYPE, $old_locale);
+
+The first argument of setlocale() gives the B<category>, the second the
+B<locale>. The category tells in what aspect of data processing you
+want to apply locale-specific rules. Category names are discussed in
+L<LOCALE CATEGORIES> and L<"ENVIRONMENT">. The locale is the name of a
+collection of customization information corresponding to a particular
+combination of language, country or territory, and codeset. Read on for
+hints on the naming of locales: not all systems name locales as in the
+example.
+
+If no second argument is provided and the category is something else
+than LC_ALL, the function returns a string naming the current locale
+for the category. You can use this value as the second argument in a
+subsequent call to setlocale().
+
+If no second argument is provided and the category is LC_ALL, the
+result is implementation-dependent. It may be a string of
+concatenated locales names (separator also implementation-dependent)
+or a single locale name. Please consult your setlocale(3) man page for
+details.
+
+If a second argument is given and it corresponds to a valid locale,
+the locale for the category is set to that value, and the function
+returns the now-current locale value. You can then use this in yet
+another call to setlocale(). (In some implementations, the return
+value may sometimes differ from the value you gave as the second
+argument--think of it as an alias for the value you gave.)
+
+As the example shows, if the second argument is an empty string, the
+category's locale is returned to the default specified by the
+corresponding environment variables. Generally, this results in a
+return to the default that was in force when Perl started up: changes
+to the environment made by the application after startup may or may not
+be noticed, depending on your system's C library.
+
+If the second argument does not correspond to a valid locale, the locale
+for the category is not changed, and the function returns I<undef>.
+
+For further information about the categories, consult setlocale(3).
+
+=head2 Finding locales
+
+For locales available in your system, consult also setlocale(3) to
+see whether it leads to the list of available locales (search for the
+I<SEE ALSO> section). If that fails, try the following command lines:
+
+ locale -a
+
+ nlsinfo
+
+ ls /usr/lib/nls/loc
+
+ ls /usr/lib/locale
+
+ ls /usr/lib/nls
+
+ ls /usr/share/locale
+
+and see whether they list something resembling these
+
+ en_US.ISO8859-1 de_DE.ISO8859-1 ru_RU.ISO8859-5
+ en_US.iso88591 de_DE.iso88591 ru_RU.iso88595
+ en_US de_DE ru_RU
+ en de ru
+ english german russian
+ english.iso88591 german.iso88591 russian.iso88595
+ english.roman8 russian.koi8r
+
+Sadly, even though the calling interface for setlocale() has been
+standardized, names of locales and the directories where the
+configuration resides have not been. The basic form of the name is
+I<language_territory>B<.>I<codeset>, but the latter parts after
+I<language> are not always present. The I<language> and I<country>
+are usually from the standards B<ISO 3166> and B<ISO 639>, the
+two-letter abbreviations for the countries and the languages of the
+world, respectively. The I<codeset> part often mentions some B<ISO
+8859> character set, the Latin codesets. For example, C<ISO 8859-1>
+is the so-called "Western European codeset" that can be used to encode
+most Western European languages adequately. Again, there are several
+ways to write even the name of that one standard. Lamentably.
+
+Two special locales are worth particular mention: "C" and "POSIX".
+Currently these are effectively the same locale: the difference is
+mainly that the first one is defined by the C standard, the second by
+the POSIX standard. They define the B<default locale> in which
+every program starts in the absence of locale information in its
+environment. (The I<default> default locale, if you will.) Its language
+is (American) English and its character codeset ASCII.
+
+B<NOTE>: Not all systems have the "POSIX" locale (not all systems are
+POSIX-conformant), so use "C" when you need explicitly to specify this
+default locale.
+
+=head2 LOCALE PROBLEMS
+
+You may encounter the following warning message at Perl startup:
+
+ perl: warning: Setting locale failed.
+ perl: warning: Please check that your locale settings:
+ LC_ALL = "En_US",
+ LANG = (unset)
+ are supported and installed on your system.
+ perl: warning: Falling back to the standard locale ("C").
+
+This means that your locale settings had LC_ALL set to "En_US" and
+LANG exists but has no value. Perl tried to believe you but could not.
+Instead, Perl gave up and fell back to the "C" locale, the default locale
+that is supposed to work no matter what. This usually means your locale
+settings were wrong, they mention locales your system has never heard
+of, or the locale installation in your system has problems (for example,
+some system files are broken or missing). There are quick and temporary
+fixes to these problems, as well as more thorough and lasting fixes.
+
+=head2 Temporarily fixing locale problems
+
+The two quickest fixes are either to render Perl silent about any
+locale inconsistencies or to run Perl under the default locale "C".
+
+Perl's moaning about locale problems can be silenced by setting the
+environment variable PERL_BADLANG to a zero value, for example "0".
+This method really just sweeps the problem under the carpet: you tell
+Perl to shut up even when Perl sees that something is wrong. Do not
+be surprised if later something locale-dependent misbehaves.
+
+Perl can be run under the "C" locale by setting the environment
+variable LC_ALL to "C". This method is perhaps a bit more civilized
+than the PERL_BADLANG approach, but setting LC_ALL (or
+other locale variables) may affect other programs as well, not just
+Perl. In particular, external programs run from within Perl will see
+these changes. If you make the new settings permanent (read on), all
+programs you run see the changes. See L<"ENVIRONMENT"> for
+the full list of relevant environment variables and L<USING LOCALES>
+for their effects in Perl. Effects in other programs are
+easily deducible. For example, the variable LC_COLLATE may well affect
+your B<sort> program (or whatever the program that arranges "records"
+alphabetically in your system is called).
+
+You can test out changing these variables temporarily, and if the
+new settings seem to help, put those settings into your shell startup
+files. Consult your local documentation for the exact details. For in
+Bourne-like shells (B<sh>, B<ksh>, B<bash>, B<zsh>):
+
+ LC_ALL=en_US.ISO8859-1
+ export LC_ALL
+
+This assumes that we saw the locale "en_US.ISO8859-1" using the commands
+discussed above. We decided to try that instead of the above faulty
+locale "En_US"--and in Cshish shells (B<csh>, B<tcsh>)
+
+ setenv LC_ALL en_US.ISO8859-1
+
+or if you have the "env" application you can do in any shell
+
+ env LC_ALL=en_US.ISO8859-1 perl ...
+
+If you do not know what shell you have, consult your local
+helpdesk or the equivalent.
+
+=head2 Permanently fixing locale problems
+
+The slower but superior fixes are when you may be able to yourself
+fix the misconfiguration of your own environment variables. The
+mis(sing)configuration of the whole system's locales usually requires
+the help of your friendly system administrator.
+
+First, see earlier in this document about L<Finding locales>. That tells
+how to find which locales are really supported--and more importantly,
+installed--on your system. In our example error message, environment
+variables affecting the locale are listed in the order of decreasing
+importance (and unset variables do not matter). Therefore, having
+LC_ALL set to "En_US" must have been the bad choice, as shown by the
+error message. First try fixing locale settings listed first.
+
+Second, if using the listed commands you see something B<exactly>
+(prefix matches do not count and case usually counts) like "En_US"
+without the quotes, then you should be okay because you are using a
+locale name that should be installed and available in your system.
+In this case, see L<Permanently fixing your system's locale configuration>.
+
+=head2 Permanently fixing your system's locale configuration
+
+This is when you see something like:
+
+ perl: warning: Please check that your locale settings:
+ LC_ALL = "En_US",
+ LANG = (unset)
+ are supported and installed on your system.
+
+but then cannot see that "En_US" listed by the above-mentioned
+commands. You may see things like "en_US.ISO8859-1", but that isn't
+the same. In this case, try running under a locale
+that you can list and which somehow matches what you tried. The
+rules for matching locale names are a bit vague because
+standardization is weak in this area. See again the
+L<Finding locales> about general rules.
+
+=head2 Fixing system locale configuration
+
+Contact a system administrator (preferably your own) and report the exact
+error message you get, and ask them to read this same documentation you
+are now reading. They should be able to check whether there is something
+wrong with the locale configuration of the system. The L<Finding locales>
+section is unfortunately a bit vague about the exact commands and places
+because these things are not that standardized.
+
+=head2 The localeconv function
+
+The POSIX::localeconv() function allows you to get particulars of the
+locale-dependent numeric formatting information specified by the current
+C<LC_NUMERIC> and C<LC_MONETARY> locales. (If you just want the name of
+the current locale for a particular category, use POSIX::setlocale()
+with a single parameter--see L<The setlocale function>.)
+
+ use POSIX qw(locale_h);
+
+ # Get a reference to a hash of locale-dependent info
+ $locale_values = localeconv();
+
+ # Output sorted list of the values
+ for (sort keys %$locale_values) {
+ printf "%-20s = %s\n", $_, $locale_values->{$_}
+ }
+
+localeconv() takes no arguments, and returns B<a reference to> a hash.
+The keys of this hash are variable names for formatting, such as
+C<decimal_point> and C<thousands_sep>. The values are the
+corresponding, er, values. See L<POSIX/localeconv> for a longer
+example listing the categories an implementation might be expected to
+provide; some provide more and others fewer. You don't need an
+explicit C<use locale>, because localeconv() always observes the
+current locale.
+
+Here's a simple-minded example program that rewrites its command-line
+parameters as integers correctly formatted in the current locale:
+
+ # See comments in previous example
+ require 5.004;
+ use POSIX qw(locale_h);
+
+ # Get some of locale's numeric formatting parameters
+ my ($thousands_sep, $grouping) =
+ @{localeconv()}{'thousands_sep', 'grouping'};
+
+ # Apply defaults if values are missing
+ $thousands_sep = ',' unless $thousands_sep;
+
+ # grouping and mon_grouping are packed lists
+ # of small integers (characters) telling the
+ # grouping (thousand_seps and mon_thousand_seps
+ # being the group dividers) of numbers and
+ # monetary quantities. The integers' meanings:
+ # 255 means no more grouping, 0 means repeat
+ # the previous grouping, 1-254 means use that
+ # as the current grouping. Grouping goes from
+ # right to left (low to high digits). In the
+ # below we cheat slightly by never using anything
+ # else than the first grouping (whatever that is).
+ if ($grouping) {
+ @grouping = unpack("C*", $grouping);
+ } else {
+ @grouping = (3);
+ }
+
+ # Format command line params for current locale
+ for (@ARGV) {
+ $_ = int; # Chop non-integer part
+ 1 while
+ s/(\d)(\d{$grouping[0]}($|$thousands_sep))/$1$thousands_sep$2/;
+ print "$_";
+ }
+ print "\n";
+
+=head2 I18N::Langinfo
+
+Another interface for querying locale-dependent information is the
+I18N::Langinfo::langinfo() function, available at least in UNIX-like
+systems and VMS.
+
+The following example will import the langinfo() function itself and
+three constants to be used as arguments to langinfo(): a constant for
+the abbreviated first day of the week (the numbering starts from
+Sunday = 1) and two more constants for the affirmative and negative
+answers for a yes/no question in the current locale.
+
+ use I18N::Langinfo qw(langinfo ABDAY_1 YESSTR NOSTR);
+
+ my ($abday_1, $yesstr, $nostr) = map { langinfo } qw(ABDAY_1 YESSTR NOSTR);
+
+ print "$abday_1? [$yesstr/$nostr] ";
+
+In other words, in the "C" (or English) locale the above will probably
+print something like:
+
+ Sun? [yes/no]
+
+See L<I18N::Langinfo> for more information.
+
+=head1 LOCALE CATEGORIES
+
+The following subsections describe basic locale categories. Beyond these,
+some combination categories allow manipulation of more than one
+basic category at a time. See L<"ENVIRONMENT"> for a discussion of these.
+
+=head2 Category LC_COLLATE: Collation
+
+In the scope of S<C<use locale>>, Perl looks to the C<LC_COLLATE>
+environment variable to determine the application's notions on collation
+(ordering) of characters. For example, 'b' follows 'a' in Latin
+alphabets, but where do 'E<aacute>' and 'E<aring>' belong? And while
+'color' follows 'chocolate' in English, what about in Spanish?
+
+The following collations all make sense and you may meet any of them
+if you "use locale".
+
+ A B C D E a b c d e
+ A a B b C c D d E e
+ a A b B c C d D e E
+ a b c d e A B C D E
+
+Here is a code snippet to tell what "word"
+characters are in the current locale, in that locale's order:
+
+ use locale;
+ print +(sort grep /\w/, map { chr } 0..255), "\n";
+
+Compare this with the characters that you see and their order if you
+state explicitly that the locale should be ignored:
+
+ no locale;
+ print +(sort grep /\w/, map { chr } 0..255), "\n";
+
+This machine-native collation (which is what you get unless S<C<use
+locale>> has appeared earlier in the same block) must be used for
+sorting raw binary data, whereas the locale-dependent collation of the
+first example is useful for natural text.
+
+As noted in L<USING LOCALES>, C<cmp> compares according to the current
+collation locale when C<use locale> is in effect, but falls back to a
+char-by-char comparison for strings that the locale says are equal. You
+can use POSIX::strcoll() if you don't want this fall-back:
+
+ use POSIX qw(strcoll);
+ $equal_in_locale =
+ !strcoll("space and case ignored", "SpaceAndCaseIgnored");
+
+$equal_in_locale will be true if the collation locale specifies a
+dictionary-like ordering that ignores space characters completely and
+which folds case.
+
+If you have a single string that you want to check for "equality in
+locale" against several others, you might think you could gain a little
+efficiency by using POSIX::strxfrm() in conjunction with C<eq>:
+
+ use POSIX qw(strxfrm);
+ $xfrm_string = strxfrm("Mixed-case string");
+ print "locale collation ignores spaces\n"
+ if $xfrm_string eq strxfrm("Mixed-casestring");
+ print "locale collation ignores hyphens\n"
+ if $xfrm_string eq strxfrm("Mixedcase string");
+ print "locale collation ignores case\n"
+ if $xfrm_string eq strxfrm("mixed-case string");
+
+strxfrm() takes a string and maps it into a transformed string for use
+in char-by-char comparisons against other transformed strings during
+collation. "Under the hood", locale-affected Perl comparison operators
+call strxfrm() for both operands, then do a char-by-char
+comparison of the transformed strings. By calling strxfrm() explicitly
+and using a non locale-affected comparison, the example attempts to save
+a couple of transformations. But in fact, it doesn't save anything: Perl
+magic (see L<perlguts/Magic Variables>) creates the transformed version of a
+string the first time it's needed in a comparison, then keeps this version around
+in case it's needed again. An example rewritten the easy way with
+C<cmp> runs just about as fast. It also copes with null characters
+embedded in strings; if you call strxfrm() directly, it treats the first
+null it finds as a terminator. don't expect the transformed strings
+it produces to be portable across systems--or even from one revision
+of your operating system to the next. In short, don't call strxfrm()
+directly: let Perl do it for you.
+
+Note: C<use locale> isn't shown in some of these examples because it isn't
+needed: strcoll() and strxfrm() exist only to generate locale-dependent
+results, and so always obey the current C<LC_COLLATE> locale.
+
+=head2 Category LC_CTYPE: Character Types
+
+In the scope of S<C<use locale>>, Perl obeys the C<LC_CTYPE> locale
+setting. This controls the application's notion of which characters are
+alphabetic. This affects Perl's C<\w> regular expression metanotation,
+which stands for alphanumeric characters--that is, alphabetic,
+numeric, and including other special characters such as the underscore or
+hyphen. (Consult L<perlre> for more information about
+regular expressions.) Thanks to C<LC_CTYPE>, depending on your locale
+setting, characters like 'E<aelig>', 'E<eth>', 'E<szlig>', and
+'E<oslash>' may be understood as C<\w> characters.
+
+The C<LC_CTYPE> locale also provides the map used in transliterating
+characters between lower and uppercase. This affects the case-mapping
+functions--lc(), lcfirst, uc(), and ucfirst(); case-mapping
+interpolation with C<\l>, C<\L>, C<\u>, or C<\U> in double-quoted strings
+and C<s///> substitutions; and case-independent regular expression
+pattern matching using the C<i> modifier.
+
+Finally, C<LC_CTYPE> affects the POSIX character-class test
+functions--isalpha(), islower(), and so on. For example, if you move
+from the "C" locale to a 7-bit Scandinavian one, you may find--possibly
+to your surprise--that "|" moves from the ispunct() class to isalpha().
+
+B<Note:> A broken or malicious C<LC_CTYPE> locale definition may result
+in clearly ineligible characters being considered to be alphanumeric by
+your application. For strict matching of (mundane) letters and
+digits--for example, in command strings--locale-aware applications
+should use C<\w> inside a C<no locale> block. See L<"SECURITY">.
+
+=head2 Category LC_NUMERIC: Numeric Formatting
+
+After a proper POSIX::setlocale() call, Perl obeys the C<LC_NUMERIC>
+locale information, which controls an application's idea of how numbers
+should be formatted for human readability by the printf(), sprintf(), and
+write() functions. String-to-numeric conversion by the POSIX::strtod()
+function is also affected. In most implementations the only effect is to
+change the character used for the decimal point--perhaps from '.' to ','.
+These functions aren't aware of such niceties as thousands separation and
+so on. (See L<The localeconv function> if you care about these things.)
+
+Output produced by print() is also affected by the current locale: it
+corresponds to what you'd get from printf() in the "C" locale. The
+same is true for Perl's internal conversions between numeric and
+string formats:
+
+ use POSIX qw(strtod setlocale LC_NUMERIC);
+
+ setlocale LC_NUMERIC, "";
+
+ $n = 5/2; # Assign numeric 2.5 to $n
+
+ $a = " $n"; # Locale-dependent conversion to string
+
+ print "half five is $n\n"; # Locale-dependent output
+
+ printf "half five is %g\n", $n; # Locale-dependent output
+
+ print "DECIMAL POINT IS COMMA\n"
+ if $n == (strtod("2,5"))[0]; # Locale-dependent conversion
+
+See also L<I18N::Langinfo> and C<RADIXCHAR>.
+
+=head2 Category LC_MONETARY: Formatting of monetary amounts
+
+The C standard defines the C<LC_MONETARY> category, but no function
+that is affected by its contents. (Those with experience of standards
+committees will recognize that the working group decided to punt on the
+issue.) Consequently, Perl takes no notice of it. If you really want
+to use C<LC_MONETARY>, you can query its contents--see
+L<The localeconv function>--and use the information that it returns in your
+application's own formatting of currency amounts. However, you may well
+find that the information, voluminous and complex though it may be, still
+does not quite meet your requirements: currency formatting is a hard nut
+to crack.
+
+See also L<I18N::Langinfo> and C<CRNCYSTR>.
+
+=head2 LC_TIME
+
+Output produced by POSIX::strftime(), which builds a formatted
+human-readable date/time string, is affected by the current C<LC_TIME>
+locale. Thus, in a French locale, the output produced by the C<%B>
+format element (full month name) for the first month of the year would
+be "janvier". Here's how to get a list of long month names in the
+current locale:
+
+ use POSIX qw(strftime);
+ for (0..11) {
+ $long_month_name[$_] =
+ strftime("%B", 0, 0, 0, 1, $_, 96);
+ }
+
+Note: C<use locale> isn't needed in this example: as a function that
+exists only to generate locale-dependent results, strftime() always
+obeys the current C<LC_TIME> locale.
+
+See also L<I18N::Langinfo> and C<ABDAY_1>..C<ABDAY_7>, C<DAY_1>..C<DAY_7>,
+C<ABMON_1>..C<ABMON_12>, and C<ABMON_1>..C<ABMON_12>.
+
+=head2 Other categories
+
+The remaining locale category, C<LC_MESSAGES> (possibly supplemented
+by others in particular implementations) is not currently used by
+Perl--except possibly to affect the behavior of library functions
+called by extensions outside the standard Perl distribution and by the
+operating system and its utilities. Note especially that the string
+value of C<$!> and the error messages given by external utilities may
+be changed by C<LC_MESSAGES>. If you want to have portable error
+codes, use C<%!>. See L<Errno>.
+
+=head1 SECURITY
+
+Although the main discussion of Perl security issues can be found in
+L<perlsec>, a discussion of Perl's locale handling would be incomplete
+if it did not draw your attention to locale-dependent security issues.
+Locales--particularly on systems that allow unprivileged users to
+build their own locales--are untrustworthy. A malicious (or just plain
+broken) locale can make a locale-aware application give unexpected
+results. Here are a few possibilities:
+
+=over 4
+
+=item *
+
+Regular expression checks for safe file names or mail addresses using
+C<\w> may be spoofed by an C<LC_CTYPE> locale that claims that
+characters such as "E<gt>" and "|" are alphanumeric.
+
+=item *
+
+String interpolation with case-mapping, as in, say, C<$dest =
+"C:\U$name.$ext">, may produce dangerous results if a bogus LC_CTYPE
+case-mapping table is in effect.
+
+=item *
+
+A sneaky C<LC_COLLATE> locale could result in the names of students with
+"D" grades appearing ahead of those with "A"s.
+
+=item *
+
+An application that takes the trouble to use information in
+C<LC_MONETARY> may format debits as if they were credits and vice versa
+if that locale has been subverted. Or it might make payments in US
+dollars instead of Hong Kong dollars.
+
+=item *
+
+The date and day names in dates formatted by strftime() could be
+manipulated to advantage by a malicious user able to subvert the
+C<LC_DATE> locale. ("Look--it says I wasn't in the building on
+Sunday.")
+
+=back
+
+Such dangers are not peculiar to the locale system: any aspect of an
+application's environment which may be modified maliciously presents
+similar challenges. Similarly, they are not specific to Perl: any
+programming language that allows you to write programs that take
+account of their environment exposes you to these issues.
+
+Perl cannot protect you from all possibilities shown in the
+examples--there is no substitute for your own vigilance--but, when
+C<use locale> is in effect, Perl uses the tainting mechanism (see
+L<perlsec>) to mark string results that become locale-dependent, and
+which may be untrustworthy in consequence. Here is a summary of the
+tainting behavior of operators and functions that may be affected by
+the locale:
+
+=over 4
+
+=item *
+
+B<Comparison operators> (C<lt>, C<le>, C<ge>, C<gt> and C<cmp>):
+
+Scalar true/false (or less/equal/greater) result is never tainted.
+
+=item *
+
+B<Case-mapping interpolation> (with C<\l>, C<\L>, C<\u> or C<\U>)
+
+Result string containing interpolated material is tainted if
+C<use locale> is in effect.
+
+=item *
+
+B<Matching operator> (C<m//>):
+
+Scalar true/false result never tainted.
+
+Subpatterns, either delivered as a list-context result or as $1 etc.
+are tainted if C<use locale> is in effect, and the subpattern regular
+expression contains C<\w> (to match an alphanumeric character), C<\W>
+(non-alphanumeric character), C<\s> (whitespace character), or C<\S>
+(non whitespace character). The matched-pattern variable, $&, $`
+(pre-match), $' (post-match), and $+ (last match) are also tainted if
+C<use locale> is in effect and the regular expression contains C<\w>,
+C<\W>, C<\s>, or C<\S>.
+
+=item *
+
+B<Substitution operator> (C<s///>):
+
+Has the same behavior as the match operator. Also, the left
+operand of C<=~> becomes tainted when C<use locale> in effect
+if modified as a result of a substitution based on a regular
+expression match involving C<\w>, C<\W>, C<\s>, or C<\S>; or of
+case-mapping with C<\l>, C<\L>,C<\u> or C<\U>.
+
+=item *
+
+B<Output formatting functions> (printf() and write()):
+
+Results are never tainted because otherwise even output from print,
+for example C<print(1/7)>, should be tainted if C<use locale> is in
+effect.
+
+=item *
+
+B<Case-mapping functions> (lc(), lcfirst(), uc(), ucfirst()):
+
+Results are tainted if C<use locale> is in effect.
+
+=item *
+
+B<POSIX locale-dependent functions> (localeconv(), strcoll(),
+strftime(), strxfrm()):
+
+Results are never tainted.
+
+=item *
+
+B<POSIX character class tests> (isalnum(), isalpha(), isdigit(),
+isgraph(), islower(), isprint(), ispunct(), isspace(), isupper(),
+isxdigit()):
+
+True/false results are never tainted.
+
+=back
+
+Three examples illustrate locale-dependent tainting.
+The first program, which ignores its locale, won't run: a value taken
+directly from the command line may not be used to name an output file
+when taint checks are enabled.
+
+ #/usr/local/bin/perl -T
+ # Run with taint checking
+
+ # Command line sanity check omitted...
+ $tainted_output_file = shift;
+
+ open(F, ">$tainted_output_file")
+ or warn "Open of $untainted_output_file failed: $!\n";
+
+The program can be made to run by "laundering" the tainted value through
+a regular expression: the second example--which still ignores locale
+information--runs, creating the file named on its command line
+if it can.
+
+ #/usr/local/bin/perl -T
+
+ $tainted_output_file = shift;
+ $tainted_output_file =~ m%[\w/]+%;
+ $untainted_output_file = $&;
+
+ open(F, ">$untainted_output_file")
+ or warn "Open of $untainted_output_file failed: $!\n";
+
+Compare this with a similar but locale-aware program:
+
+ #/usr/local/bin/perl -T
+
+ $tainted_output_file = shift;
+ use locale;
+ $tainted_output_file =~ m%[\w/]+%;
+ $localized_output_file = $&;
+
+ open(F, ">$localized_output_file")
+ or warn "Open of $localized_output_file failed: $!\n";
+
+This third program fails to run because $& is tainted: it is the result
+of a match involving C<\w> while C<use locale> is in effect.
+
+=head1 ENVIRONMENT
+
+=over 12
+
+=item PERL_BADLANG
+
+A string that can suppress Perl's warning about failed locale settings
+at startup. Failure can occur if the locale support in the operating
+system is lacking (broken) in some way--or if you mistyped the name of
+a locale when you set up your environment. If this environment
+variable is absent, or has a value that does not evaluate to integer
+zero--that is, "0" or ""-- Perl will complain about locale setting
+failures.
+
+B<NOTE>: PERL_BADLANG only gives you a way to hide the warning message.
+The message tells about some problem in your system's locale support,
+and you should investigate what the problem is.
+
+=back
+
+The following environment variables are not specific to Perl: They are
+part of the standardized (ISO C, XPG4, POSIX 1.c) setlocale() method
+for controlling an application's opinion on data.
+
+=over 12
+
+=item LC_ALL
+
+C<LC_ALL> is the "override-all" locale environment variable. If
+set, it overrides all the rest of the locale environment variables.
+
+=item LANGUAGE
+
+B<NOTE>: C<LANGUAGE> is a GNU extension, it affects you only if you
+are using the GNU libc. This is the case if you are using e.g. Linux.
+If you are using "commercial" UNIXes you are most probably I<not>
+using GNU libc and you can ignore C<LANGUAGE>.
+
+However, in the case you are using C<LANGUAGE>: it affects the
+language of informational, warning, and error messages output by
+commands (in other words, it's like C<LC_MESSAGES>) but it has higher
+priority than L<LC_ALL>. Moreover, it's not a single value but
+instead a "path" (":"-separated list) of I<languages> (not locales).
+See the GNU C<gettext> library documentation for more information.
+
+=item LC_CTYPE
+
+In the absence of C<LC_ALL>, C<LC_CTYPE> chooses the character type
+locale. In the absence of both C<LC_ALL> and C<LC_CTYPE>, C<LANG>
+chooses the character type locale.
+
+=item LC_COLLATE
+
+In the absence of C<LC_ALL>, C<LC_COLLATE> chooses the collation
+(sorting) locale. In the absence of both C<LC_ALL> and C<LC_COLLATE>,
+C<LANG> chooses the collation locale.
+
+=item LC_MONETARY
+
+In the absence of C<LC_ALL>, C<LC_MONETARY> chooses the monetary
+formatting locale. In the absence of both C<LC_ALL> and C<LC_MONETARY>,
+C<LANG> chooses the monetary formatting locale.
+
+=item LC_NUMERIC
+
+In the absence of C<LC_ALL>, C<LC_NUMERIC> chooses the numeric format
+locale. In the absence of both C<LC_ALL> and C<LC_NUMERIC>, C<LANG>
+chooses the numeric format.
+
+=item LC_TIME
+
+In the absence of C<LC_ALL>, C<LC_TIME> chooses the date and time
+formatting locale. In the absence of both C<LC_ALL> and C<LC_TIME>,
+C<LANG> chooses the date and time formatting locale.
+
+=item LANG
+
+C<LANG> is the "catch-all" locale environment variable. If it is set, it
+is used as the last resort after the overall C<LC_ALL> and the
+category-specific C<LC_...>.
+
+=back
+
+=head2 Examples
+
+The LC_NUMERIC controls the numeric output:
+
+ use locale;
+ use POSIX qw(locale_h); # Imports setlocale() and the LC_ constants.
+ setlocale(LC_NUMERIC, "fr_FR") or die "Pardon";
+ printf "%g\n", 1.23; # If the "fr_FR" succeeded, probably shows 1,23.
+
+and also how strings are parsed by POSIX::strtod() as numbers:
+
+ use locale;
+ use POSIX qw(locale_h strtod);
+ setlocale(LC_NUMERIC, "de_DE") or die "Entschuldigung";
+ my $x = strtod("2,34") + 5;
+ print $x, "\n"; # Probably shows 7,34.
+
+=head1 NOTES
+
+=head2 Backward compatibility
+
+Versions of Perl prior to 5.004 B<mostly> ignored locale information,
+generally behaving as if something similar to the C<"C"> locale were
+always in force, even if the program environment suggested otherwise
+(see L<The setlocale function>). By default, Perl still behaves this
+way for backward compatibility. If you want a Perl application to pay
+attention to locale information, you B<must> use the S<C<use locale>>
+pragma (see L<The use locale pragma>) to instruct it to do so.
+
+Versions of Perl from 5.002 to 5.003 did use the C<LC_CTYPE>
+information if available; that is, C<\w> did understand what
+were the letters according to the locale environment variables.
+The problem was that the user had no control over the feature:
+if the C library supported locales, Perl used them.
+
+=head2 I18N:Collate obsolete
+
+In versions of Perl prior to 5.004, per-locale collation was possible
+using the C<I18N::Collate> library module. This module is now mildly
+obsolete and should be avoided in new applications. The C<LC_COLLATE>
+functionality is now integrated into the Perl core language: One can
+use locale-specific scalar data completely normally with C<use locale>,
+so there is no longer any need to juggle with the scalar references of
+C<I18N::Collate>.
+
+=head2 Sort speed and memory use impacts
+
+Comparing and sorting by locale is usually slower than the default
+sorting; slow-downs of two to four times have been observed. It will
+also consume more memory: once a Perl scalar variable has participated
+in any string comparison or sorting operation obeying the locale
+collation rules, it will take 3-15 times more memory than before. (The
+exact multiplier depends on the string's contents, the operating system
+and the locale.) These downsides are dictated more by the operating
+system's implementation of the locale system than by Perl.
+
+=head2 write() and LC_NUMERIC
+
+Formats are the only part of Perl that unconditionally use information
+from a program's locale; if a program's environment specifies an
+LC_NUMERIC locale, it is always used to specify the decimal point
+character in formatted output. Formatted output cannot be controlled by
+C<use locale> because the pragma is tied to the block structure of the
+program, and, for historical reasons, formats exist outside that block
+structure.
+
+=head2 Freely available locale definitions
+
+There is a large collection of locale definitions at
+ftp://dkuug.dk/i18n/WG15-collection . You should be aware that it is
+unsupported, and is not claimed to be fit for any purpose. If your
+system allows installation of arbitrary locales, you may find the
+definitions useful as they are, or as a basis for the development of
+your own locales.
+
+=head2 I18n and l10n
+
+"Internationalization" is often abbreviated as B<i18n> because its first
+and last letters are separated by eighteen others. (You may guess why
+the internalin ... internaliti ... i18n tends to get abbreviated.) In
+the same way, "localization" is often abbreviated to B<l10n>.
+
+=head2 An imperfect standard
+
+Internationalization, as defined in the C and POSIX standards, can be
+criticized as incomplete, ungainly, and having too large a granularity.
+(Locales apply to a whole process, when it would arguably be more useful
+to have them apply to a single thread, window group, or whatever.) They
+also have a tendency, like standards groups, to divide the world into
+nations, when we all know that the world can equally well be divided
+into bankers, bikers, gamers, and so on. But, for now, it's the only
+standard we've got. This may be construed as a bug.
+
+=head1 Unicode and UTF-8
+
+The support of Unicode is new starting from Perl version 5.6, and
+more fully implemented in the version 5.8. See L<perluniintro> and
+L<perlunicode> for more details.
+
+Usually locale settings and Unicode do not affect each other, but
+there are exceptions, see L<perlunicode/Locales> for examples.
+
+=head1 BUGS
+
+=head2 Broken systems
+
+In certain systems, the operating system's locale support
+is broken and cannot be fixed or used by Perl. Such deficiencies can
+and will result in mysterious hangs and/or Perl core dumps when the
+C<use locale> is in effect. When confronted with such a system,
+please report in excruciating detail to <F<perlbug@perl.org>>, and
+complain to your vendor: bug fixes may exist for these problems
+in your operating system. Sometimes such bug fixes are called an
+operating system upgrade.
+
+=head1 SEE ALSO
+
+L<I18N::Langinfo>, L<perluniintro>, L<perlunicode>, L<open>,
+L<POSIX/isalnum>, L<POSIX/isalpha>,
+L<POSIX/isdigit>, L<POSIX/isgraph>, L<POSIX/islower>,
+L<POSIX/isprint>, L<POSIX/ispunct>, L<POSIX/isspace>,
+L<POSIX/isupper>, L<POSIX/isxdigit>, L<POSIX/localeconv>,
+L<POSIX/setlocale>, L<POSIX/strcoll>, L<POSIX/strftime>,
+L<POSIX/strtod>, L<POSIX/strxfrm>.
+
+=head1 HISTORY
+
+Jarkko Hietaniemi's original F<perli18n.pod> heavily hacked by Dominic
+Dunlop, assisted by the perl5-porters. Prose worked over a bit by
+Tom Christiansen.
+
+Last update: Thu Jun 11 08:44:13 MDT 1998
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perllol.pod b/Master/tlpkg/tlperl.straw/lib/pods/perllol.pod
new file mode 100755
index 00000000000..c42c977c511
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perllol.pod
@@ -0,0 +1,303 @@
+=head1 NAME
+
+perllol - Manipulating Arrays of Arrays in Perl
+
+=head1 DESCRIPTION
+
+=head2 Declaration and Access of Arrays of Arrays
+
+The simplest thing to build is an array of arrays (sometimes imprecisely
+called a list of lists). It's reasonably easy to understand, and
+almost everything that applies here will also be applicable later
+on with the fancier data structures.
+
+An array of an array is just a regular old array @AoA that you can
+get at with two subscripts, like C<$AoA[3][2]>. Here's a declaration
+of the array:
+
+ # assign to our array, an array of array references
+ @AoA = (
+ [ "fred", "barney" ],
+ [ "george", "jane", "elroy" ],
+ [ "homer", "marge", "bart" ],
+ );
+
+ print $AoA[2][2];
+ bart
+
+Now you should be very careful that the outer bracket type
+is a round one, that is, a parenthesis. That's because you're assigning to
+an @array, so you need parentheses. If you wanted there I<not> to be an @AoA,
+but rather just a reference to it, you could do something more like this:
+
+ # assign a reference to array of array references
+ $ref_to_AoA = [
+ [ "fred", "barney", "pebbles", "bambam", "dino", ],
+ [ "homer", "bart", "marge", "maggie", ],
+ [ "george", "jane", "elroy", "judy", ],
+ ];
+
+ print $ref_to_AoA->[2][2];
+
+Notice that the outer bracket type has changed, and so our access syntax
+has also changed. That's because unlike C, in perl you can't freely
+interchange arrays and references thereto. $ref_to_AoA is a reference to an
+array, whereas @AoA is an array proper. Likewise, C<$AoA[2]> is not an
+array, but an array ref. So how come you can write these:
+
+ $AoA[2][2]
+ $ref_to_AoA->[2][2]
+
+instead of having to write these:
+
+ $AoA[2]->[2]
+ $ref_to_AoA->[2]->[2]
+
+Well, that's because the rule is that on adjacent brackets only (whether
+square or curly), you are free to omit the pointer dereferencing arrow.
+But you cannot do so for the very first one if it's a scalar containing
+a reference, which means that $ref_to_AoA always needs it.
+
+=head2 Growing Your Own
+
+That's all well and good for declaration of a fixed data structure,
+but what if you wanted to add new elements on the fly, or build
+it up entirely from scratch?
+
+First, let's look at reading it in from a file. This is something like
+adding a row at a time. We'll assume that there's a flat file in which
+each line is a row and each word an element. If you're trying to develop an
+@AoA array containing all these, here's the right way to do that:
+
+ while (<>) {
+ @tmp = split;
+ push @AoA, [ @tmp ];
+ }
+
+You might also have loaded that from a function:
+
+ for $i ( 1 .. 10 ) {
+ $AoA[$i] = [ somefunc($i) ];
+ }
+
+Or you might have had a temporary variable sitting around with the
+array in it.
+
+ for $i ( 1 .. 10 ) {
+ @tmp = somefunc($i);
+ $AoA[$i] = [ @tmp ];
+ }
+
+It's very important that you make sure to use the C<[]> array reference
+constructor. That's because this will be very wrong:
+
+ $AoA[$i] = @tmp;
+
+You see, assigning a named array like that to a scalar just counts the
+number of elements in @tmp, which probably isn't what you want.
+
+If you are running under C<use strict>, you'll have to add some
+declarations to make it happy:
+
+ use strict;
+ my(@AoA, @tmp);
+ while (<>) {
+ @tmp = split;
+ push @AoA, [ @tmp ];
+ }
+
+Of course, you don't need the temporary array to have a name at all:
+
+ while (<>) {
+ push @AoA, [ split ];
+ }
+
+You also don't have to use push(). You could just make a direct assignment
+if you knew where you wanted to put it:
+
+ my (@AoA, $i, $line);
+ for $i ( 0 .. 10 ) {
+ $line = <>;
+ $AoA[$i] = [ split ' ', $line ];
+ }
+
+or even just
+
+ my (@AoA, $i);
+ for $i ( 0 .. 10 ) {
+ $AoA[$i] = [ split ' ', <> ];
+ }
+
+You should in general be leery of using functions that could
+potentially return lists in scalar context without explicitly stating
+such. This would be clearer to the casual reader:
+
+ my (@AoA, $i);
+ for $i ( 0 .. 10 ) {
+ $AoA[$i] = [ split ' ', scalar(<>) ];
+ }
+
+If you wanted to have a $ref_to_AoA variable as a reference to an array,
+you'd have to do something like this:
+
+ while (<>) {
+ push @$ref_to_AoA, [ split ];
+ }
+
+Now you can add new rows. What about adding new columns? If you're
+dealing with just matrices, it's often easiest to use simple assignment:
+
+ for $x (1 .. 10) {
+ for $y (1 .. 10) {
+ $AoA[$x][$y] = func($x, $y);
+ }
+ }
+
+ for $x ( 3, 7, 9 ) {
+ $AoA[$x][20] += func2($x);
+ }
+
+It doesn't matter whether those elements are already
+there or not: it'll gladly create them for you, setting
+intervening elements to C<undef> as need be.
+
+If you wanted just to append to a row, you'd have
+to do something a bit funnier looking:
+
+ # add new columns to an existing row
+ push @{ $AoA[0] }, "wilma", "betty";
+
+Notice that I I<couldn't> say just:
+
+ push $AoA[0], "wilma", "betty"; # WRONG!
+
+In fact, that wouldn't even compile. How come? Because the argument
+to push() must be a real array, not just a reference to such.
+
+=head2 Access and Printing
+
+Now it's time to print your data structure out. How
+are you going to do that? Well, if you want only one
+of the elements, it's trivial:
+
+ print $AoA[0][0];
+
+If you want to print the whole thing, though, you can't
+say
+
+ print @AoA; # WRONG
+
+because you'll get just references listed, and perl will never
+automatically dereference things for you. Instead, you have to
+roll yourself a loop or two. This prints the whole structure,
+using the shell-style for() construct to loop across the outer
+set of subscripts.
+
+ for $aref ( @AoA ) {
+ print "\t [ @$aref ],\n";
+ }
+
+If you wanted to keep track of subscripts, you might do this:
+
+ for $i ( 0 .. $#AoA ) {
+ print "\t elt $i is [ @{$AoA[$i]} ],\n";
+ }
+
+or maybe even this. Notice the inner loop.
+
+ for $i ( 0 .. $#AoA ) {
+ for $j ( 0 .. $#{$AoA[$i]} ) {
+ print "elt $i $j is $AoA[$i][$j]\n";
+ }
+ }
+
+As you can see, it's getting a bit complicated. That's why
+sometimes is easier to take a temporary on your way through:
+
+ for $i ( 0 .. $#AoA ) {
+ $aref = $AoA[$i];
+ for $j ( 0 .. $#{$aref} ) {
+ print "elt $i $j is $AoA[$i][$j]\n";
+ }
+ }
+
+Hmm... that's still a bit ugly. How about this:
+
+ for $i ( 0 .. $#AoA ) {
+ $aref = $AoA[$i];
+ $n = @$aref - 1;
+ for $j ( 0 .. $n ) {
+ print "elt $i $j is $AoA[$i][$j]\n";
+ }
+ }
+
+=head2 Slices
+
+If you want to get at a slice (part of a row) in a multidimensional
+array, you're going to have to do some fancy subscripting. That's
+because while we have a nice synonym for single elements via the
+pointer arrow for dereferencing, no such convenience exists for slices.
+(Remember, of course, that you can always write a loop to do a slice
+operation.)
+
+Here's how to do one operation using a loop. We'll assume an @AoA
+variable as before.
+
+ @part = ();
+ $x = 4;
+ for ($y = 7; $y < 13; $y++) {
+ push @part, $AoA[$x][$y];
+ }
+
+That same loop could be replaced with a slice operation:
+
+ @part = @{ $AoA[4] } [ 7..12 ];
+
+but as you might well imagine, this is pretty rough on the reader.
+
+Ah, but what if you wanted a I<two-dimensional slice>, such as having
+$x run from 4..8 and $y run from 7 to 12? Hmm... here's the simple way:
+
+ @newAoA = ();
+ for ($startx = $x = 4; $x <= 8; $x++) {
+ for ($starty = $y = 7; $y <= 12; $y++) {
+ $newAoA[$x - $startx][$y - $starty] = $AoA[$x][$y];
+ }
+ }
+
+We can reduce some of the looping through slices
+
+ for ($x = 4; $x <= 8; $x++) {
+ push @newAoA, [ @{ $AoA[$x] } [ 7..12 ] ];
+ }
+
+If you were into Schwartzian Transforms, you would probably
+have selected map for that
+
+ @newAoA = map { [ @{ $AoA[$_] } [ 7..12 ] ] } 4 .. 8;
+
+Although if your manager accused you of seeking job security (or rapid
+insecurity) through inscrutable code, it would be hard to argue. :-)
+If I were you, I'd put that in a function:
+
+ @newAoA = splice_2D( \@AoA, 4 => 8, 7 => 12 );
+ sub splice_2D {
+ my $lrr = shift; # ref to array of array refs!
+ my ($x_lo, $x_hi,
+ $y_lo, $y_hi) = @_;
+
+ return map {
+ [ @{ $lrr->[$_] } [ $y_lo .. $y_hi ] ]
+ } $x_lo .. $x_hi;
+ }
+
+
+=head1 SEE ALSO
+
+perldata(1), perlref(1), perldsc(1)
+
+=head1 AUTHOR
+
+Tom Christiansen <F<tchrist@perl.com>>
+
+Last update: Thu Jun 4 16:16:23 MDT 1998
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlmachten.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlmachten.pod
new file mode 100755
index 00000000000..f2628fd00c0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlmachten.pod
@@ -0,0 +1,116 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.machten - Perl version 5 on Power MachTen systems
+
+=head1 DESCRIPTION
+
+This document describes how to build Perl 5 on Power MachTen systems,
+and discusses a few wrinkles in the implementation.
+
+=head2 Perl version 5.8.x and greater not supported
+
+B<Power MachTen is not supported by versions of Perl later than
+5.6.x.>
+If you wish to build a version from the 5.6 track, please
+obtain a source distribution from the archive at
+L<http://cpan.org/src/5.0/> and follow the instructions in its
+README.machten file.
+
+MachTen is no longer supported by its developers, Tenon Intersystems.
+A UNIX environment hosted on Mac OS Classic, MachTen has been
+superseded by Mac OS X and by BSD and Linux implementations for Macintosh
+hardware.
+The final version of Power MachTen, 4.1.4, lacks many features found in
+modern implementations of UNIX, and has a number of bugs.
+These shortcomings prevent recent versions of Perl from being able to use
+extensions on MachTen, and cause numerous test suite failures in the
+perl core.
+
+In September 2003, a discussion on the MachTen mailing list determined
+that there was no interest in making a later version of Perl build
+successfully on MachTen.
+Consequently, support for building Perl under MachTen has been suppressed
+in Perl distributions published after February 2004.
+The hints file, F<hints/machten.sh>, remains a part of the
+distributions for reference purposes.
+
+=head2 Compiling Perl 5.6.x on MachTen
+
+To compile perl 5.6.x under MachTen 4.1.4 (and probably earlier versions):
+
+ ./Configure -de
+ make
+ make test
+ make install
+
+This builds and installs a statically-linked perl; MachTen's dynamic
+linking facilities are not adequate to support Perl's use of
+dynamically linked libraries. (See F<hints/machten.sh> for more
+information.)
+
+You should have at least 32 megabytes of free memory on your
+system before running the C<make> command.
+
+For much more information on building perl -- for example, on how to
+change the default installation directory -- see F<INSTALL>.
+
+=head2 Failures during C<make test> on MachTen
+
+=over 4
+
+=item op/lexassign.t
+
+This test may fail when first run after building perl. It does not
+fail subsequently. The cause is unknown.
+
+=item pragma/warnings.t
+
+Test 257 fails due to a failure to warn about attempts to read from a
+filehandle which is a duplicate of stdout when stdout is attached to a
+pipe. The output of the test contains a block comment which discusses
+a different failure, not applicable to MachTen.
+
+The root of the problem is that Machten does not assign a file type to
+either end of a pipe (see L<stat>), resulting, among other things
+in Perl's C<-p> test failing on file descriptors belonging to pipes.
+As a result, perl becomes confused, and the test for reading from a
+write-only file fails. I am reluctant to patch perl to get around
+this, as it's clearly an OS bug (about which Tenon has been informed),
+and limited in its effect on practical Perl programs.
+
+=back
+
+=head2 Building external modules on MachTen
+
+To add an external module to perl, build in the normal way, which
+is documented in L<ExtUtils::MakeMaker>, or which can be driven
+automatically by the CPAN module (see L<CPAN>), which is part of the
+standard distribution. If you want to install a module which
+contains XS code (C or C++ source which compiles to object code
+for linking with perl), you will have to replace your perl binary with
+a new version containing the new statically-linked object module. The
+build process tells you how to do this.
+
+There is a gotcha, however, which users usually encounter immediately
+they respond to CPAN's invitation to C<install Bundle::CPAN>. When
+installing a I<bundle> -- a group of modules which together achieve
+some particular purpose, the installation process for later modules in
+the bundle tends to assume that earlier modules have been fully
+installed and are available for use. This is not true on a
+statically-linked system for earlier modules which contain XS code.
+As a result the installation of the bundle fails. The work-around is
+not to install the bundle as a one-shot operation, but instead to see
+what modules it contains, and install these one-at-a-time by hand in
+the order given.
+
+=head1 AUTHOR
+
+Dominic Dunlop <domo@computer.org>
+
+=head1 DATE
+
+Version 1.1.0 2004-02-13
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlmacos.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlmacos.pod
new file mode 100755
index 00000000000..d0ac88e4eaa
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlmacos.pod
@@ -0,0 +1,64 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.macos - Perl under Mac OS (Classic)
+
+=head1 SYNOPSIS
+
+This document briefly describes perl under Mac OS (Classic).
+If you are running perl under Mac OS X, you don't want to be
+here (unless you are in the Classic environment under Mac OS X).
+
+When we say "Mac OS" below, we mean Mac OS 7, 8, and 9, and I<not>
+Mac OS X.
+
+
+=head1 DESCRIPTION
+
+The latest perl source itself builds on Mac OS, with some additional
+pieces. Support for Mac OS is now in the perl core, and MacPerl is kept
+in close sync with regular perl releases.
+
+To build perl for Mac OS (as an MPW tool), you will need the addition
+of the F<macos> subdirectory, distributed separately. It includes extra
+source files, config files, and make files. It also includes extra
+Mac-specific modules.
+
+To build the MacPerl application, you will also need the F<macperl>
+directory, which includes the source files for creating the
+application itself.
+
+All of this is available from the development site, via
+HTTP (in the MacPerl Installer, which includes all the source
+and binaries) and anonymous CVS.
+
+ http://dev.macperl.org/
+
+The source is also in the main perl repository in the macperl
+branch (the 5.6 source is in the maint-5.6/macperl branch).
+
+You will also need compilers and libraries, all of them freely
+available. These are linked to from the SourceForge site. Go that site
+for all things having to do with MacPerl development.
+
+MacPerl 5.6.1 and later are supported on Mac OS 8.1 and later, for 68040
+and PowerPC architectures. The MPW tool may be used on Mac OS 7.5.5
+and 68030 computers.
+
+MacPerl 5.2.0r4 is also available, on the CPAN and on SourceForge. It
+is based on perl 5.004, and works with Mac OS 7.5.5 and 68030 computers.
+
+
+=head1 AUTHOR
+
+perl was ported to Mac OS by Matthias Neeracher
+E<lt>neeracher@mac.comE<gt>. It is currently maintained by Chris
+Nandor E<lt>pudge@pobox.comE<gt>.
+
+
+=head1 DATE
+
+Last modified 2002.05.02.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlmacosx.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlmacosx.pod
new file mode 100755
index 00000000000..a0b21af8c7b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlmacosx.pod
@@ -0,0 +1,270 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.macosx - Perl under Mac OS X
+
+=head1 SYNOPSIS
+
+This document briefly describes perl under Mac OS X.
+
+
+=head1 DESCRIPTION
+
+The latest Perl release (5.8.8 as of this writing) builds without changes
+under Mac OS X. Under 10.3 "Panther" and newer OS versions, all self-tests
+pass, and all standard features are supported.
+
+Earlier Mac OS X releases (10.2 "Jaguar" and older) did not include a
+completely thread-safe libc, so threading is not fully supported. Also,
+earlier releases included a buggy libdb, so some of the DB_File tests
+are known to fail on those releases.
+
+
+=head2 Installation Prefix
+
+The default installation location for this release uses the traditional
+UNIX directory layout under /usr/local. This is the recommended location
+for most users, and will leave the Apple-supplied Perl and its modules
+undisturbed.
+
+Using an installation prefix of '/usr' will result in a directory layout
+that mirrors that of Apple's default Perl, with core modules stored in
+'/System/Library/Perl/${version}', CPAN modules stored in
+'/Library/Perl/${version}', and the addition of
+'/Network/Library/Perl/${version}' to @INC for modules that are stored
+on a file server and used by many Macs.
+
+
+=head2 SDK support
+
+First, export the path to the SDK into the build environment:
+
+ export SDK=/Developer/SDKs/MacOSX10.3.9.sdk
+
+Use an SDK by exporting some additions to Perl's 'ccflags' and '..flags'
+config variables:
+
+ ./Configure -Accflags="-nostdinc -B$SDK/usr/include/gcc \
+ -B$SDK/usr/lib/gcc -isystem$SDK/usr/include \
+ -F$SDK/System/Library/Frameworks" \
+ -Aldflags="-Wl,-syslibroot,$SDK" \
+ -de
+
+=head2 Universal Binary support
+
+To compile perl as a universal binary (built for both ppc and intel), export
+the SDK variable as above, selecting the 10.4u SDK:
+
+ export SDK=/Developer/SDKs/MacOSX10.4u.sdk
+
+In addition to the compiler flags used to select the SDK, also add the flags
+for creating a universal binary:
+
+ ./Configure -Accflags="-arch i686 -arch ppc -nostdinc -B$SDK/usr/include/gcc \
+ -B$SDK/usr/lib/gcc -isystem$SDK/usr/include \
+ -F$SDK/System/Library/Frameworks" \
+ -Aldflags="-arch i686 -arch ppc -Wl,-syslibroot,$SDK" \
+ -de
+
+In Leopard (MacOSX 10.5.6 at the time of this writing) you must use the 10.5 SDK:
+
+ export SDK=/Developer/SDKs/MacOSX10.5.sdk
+
+You can use the same compiler flags you would use with the 10.4u SDK.
+
+Keep in mind that these compiler and linker settings will also be used when
+building CPAN modules. For XS modules to be compiled as a universal binary, any
+libraries it links to must also be universal binaries. The system libraries that
+Apple includes with the 10.4u SDK are all universal, but user-installed libraries
+may need to be re-installed as universal binaries.
+
+=head2 64-bit PPC support
+
+Follow the instructions in F<INSTALL> to build perl with support for 64-bit
+integers (C<use64bitint>) or both 64-bit integers and 64-bit addressing
+(C<use64bitall>). In the latter case, the resulting binary will run only
+on G5-based hosts.
+
+Support for 64-bit addressing is experimental: some aspects of Perl may be
+omitted or buggy. Note the messages output by F<Configure> for further
+information. Please use C<perlbug> to submit a problem report in the
+event that you encounter difficulties.
+
+When building 64-bit modules, it is your responsiblity to ensure that linked
+external libraries and frameworks provide 64-bit support: if they do not,
+module building may appear to succeed, but attempts to use the module will
+result in run-time dynamic linking errors, and subsequent test failures.
+You can use C<file> to discover the architectures supported by a library:
+
+ $ file libgdbm.3.0.0.dylib
+ libgdbm.3.0.0.dylib: Mach-O fat file with 2 architectures
+ libgdbm.3.0.0.dylib (for architecture ppc): Mach-O dynamically linked shared library ppc
+ libgdbm.3.0.0.dylib (for architecture ppc64): Mach-O 64-bit dynamically linked shared library ppc64
+
+Note that this issue precludes the building of many Macintosh-specific CPAN
+modules (C<Mac::*>), as the required Apple frameworks do not provide PPC64
+support. Similarly, downloads from Fink or Darwinports are unlikely to provide
+64-bit support; the libraries must be rebuilt from source with the appropriate
+compiler and linker flags. For further information, see Apple's
+I<64-Bit Transition Guide> at
+L<http://developer.apple.com/documentation/Darwin/Conceptual/64bitPorting/index.html>.
+
+=head2 libperl and Prebinding
+
+Mac OS X ships with a dynamically-loaded libperl, but the default for
+this release is to compile a static libperl. The reason for this is
+pre-binding. Dynamic libraries can be pre-bound to a specific address in
+memory in order to decrease load time. To do this, one needs to be aware
+of the location and size of all previously-loaded libraries. Apple
+collects this information as part of their overall OS build process, and
+thus has easy access to it when building Perl, but ordinary users would
+need to go to a great deal of effort to obtain the information needed
+for pre-binding.
+
+You can override the default and build a shared libperl if you wish
+(S<Configure ... -Duseshrlib>), but the load time on pre-10.4 OS
+releases will be greater than either the static library, or Apple's
+pre-bound dynamic library.
+
+With 10.4 "Tiger" and newer, Apple has all but eliminated the performance
+penalty for non-prebound libraries.
+
+
+=head2 Updating Apple's Perl
+
+In a word - don't, at least without a *very* good reason. Your scripts
+can just as easily begin with "#!/usr/local/bin/perl" as with
+"#!/usr/bin/perl". Scripts supplied by Apple and other third parties as
+part of installation packages and such have generally only been tested
+with the /usr/bin/perl that's installed by Apple.
+
+If you find that you do need to update the system Perl, one issue worth
+keeping in mind is the question of static vs. dynamic libraries. If you
+upgrade using the default static libperl, you will find that the dynamic
+libperl supplied by Apple will not be deleted. If both libraries are
+present when an application that links against libperl is built, ld will
+link against the dynamic library by default. So, if you need to replace
+Apple's dynamic libperl with a static libperl, you need to be sure to
+delete the older dynamic library after you've installed the update.
+
+
+=head2 Known problems
+
+If you have installed extra libraries such as GDBM through Fink
+(in other words, you have libraries under F</sw/lib>), or libdlcompat
+to F</usr/local/lib>, you may need to be extra careful when running
+Configure to not to confuse Configure and Perl about which libraries
+to use. Being confused will show up for example as "dyld" errors about
+symbol problems, for example during "make test". The safest bet is to run
+Configure as
+
+ Configure ... -Uloclibpth -Dlibpth=/usr/lib
+
+to make Configure look only into the system libraries. If you have some
+extra library directories that you really want to use (such as newer
+Berkeley DB libraries in pre-Panther systems), add those to the libpth:
+
+ Configure ... -Uloclibpth -Dlibpth='/usr/lib /opt/lib'
+
+The default of building Perl statically may cause problems with complex
+applications like Tk: in that case consider building shared Perl
+
+ Configure ... -Duseshrplib
+
+but remember that there's a startup cost to pay in that case (see above
+"libperl and Prebinding").
+
+Starting with Tiger (Mac OS X 10.4), Apple shipped broken locale files for
+the eu_ES locale (Basque-Spain). In previous releases of Perl, this resulted in
+failures in the C<lib/locale> test. These failures have been supressed
+in the current release of Perl by making the test ignore the broken locale.
+If you need to use the eu_ES locale, you should contact Apple support.
+
+=head2 MacPerl
+
+Quite a bit has been written about MacPerl, the Perl distribution for
+"Classic MacOS" - that is, versions 9 and earlier of MacOS. Because it
+runs in environment that's very different from that of UNIX, many things
+are done differently in MacPerl. Modules are installed using a different
+procedure, Perl itself is built differently, path names are different,
+etc.
+
+From the perspective of a Perl programmer, Mac OS X is more like a
+traditional UNIX than Classic MacOS. If you find documentation that
+refers to a special procedure that's needed for MacOS that's drastically
+different from the instructions provided for UNIX, the MacOS
+instructions are quite often intended for MacPerl on Classic MacOS. In
+that case, the correct procedure on Mac OS X is usually to follow the
+UNIX instructions, rather than the MacPerl instructions.
+
+
+=head2 Carbon
+
+MacPerl ships with a number of modules that are used to access the
+classic MacOS toolbox. Many of these modules have been updated to use
+Mac OS X's newer "Carbon" toolbox, and are available from CPAN in the
+"Mac::Carbon" module.
+
+
+=head2 Cocoa
+
+There are two ways to use Cocoa from Perl. Apple's PerlObjCBridge
+module, included with Mac OS X, can be used by standalone scripts to
+access Foundation (i.e. non-GUI) classes and objects.
+
+An alternative is CamelBones, a framework that allows access to both
+Foundation and AppKit classes and objects, so that full GUI applications
+can be built in Perl. CamelBones can be found on SourceForge, at
+L<http://www.sourceforge.net/projects/camelbones/>.
+
+
+=head1 Starting From Scratch
+
+Unfortunately it is not that difficult somehow manage to break one's
+Mac OS X Perl rather severely. If all else fails and you want to
+really, B<REALLY>, start from scratch and remove even your Apple Perl
+installation (which has become corrupted somehow), the following
+instructions should do it. B<Please think twice before following
+these instructions: they are much like conducting brain surgery to
+yourself. Without anesthesia.> We will B<not> come to fix your system
+if you do this.
+
+First, get rid of the libperl.dylib:
+
+ # cd /System/Library/Perl/darwin/CORE
+ # rm libperl.dylib
+
+Then delete every .bundle file found anywhere in the folders:
+
+ /System/Library/Perl
+ /Library/Perl
+
+You can find them for example by
+
+ # find /System/Library/Perl /Library/Perl -name '*.bundle' -print
+
+After this you can either copy Perl from your operating system media
+(you will need at least the /System/Library/Perl and /usr/bin/perl),
+or rebuild Perl from the source code with C<Configure -Dprefix=/usr
+-Dusershrplib> NOTE: the C<-Dprefix=/usr> to replace the system Perl
+works much better with Perl 5.8.1 and later, in Perl 5.8.0 the
+settings were not quite right.
+
+"Pacifist" from CharlesSoft (L<http://www.charlessoft.com/>) is a nice
+way to extract the Perl binaries from the OS media, without having to
+reinstall the entire OS.
+
+
+=head1 AUTHOR
+
+This README was written by Sherm Pendley E<lt>sherm@dot-app.orgE<gt>,
+and subsequently updated by Dominic Dunlop E<lt>domo@computer.orgE<gt>.
+The "Starting From Scratch" recipe was contributed by John Montbriand
+E<lt>montbriand@apple.comE<gt>.
+
+=head1 DATE
+
+Last modified 2006-02-24.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlmint.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlmint.pod
new file mode 100755
index 00000000000..a2372c0d669
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlmint.pod
@@ -0,0 +1,229 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.mint - Perl version 5 on Atari MiNT
+
+=head1 DESCRIPTION
+
+There is a binary version of perl available from the FreeMiNT project
+http://freemint.de/ You may wish to use this instead of trying to
+compile yourself.
+
+B<The following advice is from perl 5.004_02 and is probably rather
+out of date.>
+
+If you want to build perl yourself on MiNT (or maybe on an Atari without
+MiNT) you may want to accept some advice from somebody who already did it...
+
+There was a perl port for Atari ST done by ++jrb bammi@cadence.com.
+This port tried very hard to build on non-MiNT-systems. For the
+sake of efficiency I've left this way. Yet, I haven't removed bammi's
+patches but left them intact. Unfortunately some of the files that
+bammi contributed to the perl distribution seem to have vanished?
+
+So, how can you distinguish my patches from bammi's patches? All of
+bammi's stuff is embedded in "#ifdef atarist" preprocessor macros.
+My MiNT port uses "#ifdef __MINT__" instead (and unconditionally
+undefines "atarist". If you want to continue on bammi's port, all
+you have to do is to swap the "-D" and "-U" switches for "__MINT__"
+and "atarist" in the variable ccflags.
+
+However, I think that my version will still run on non-MiNT-systems
+provided that the user has a Eunuchs-like environment (i.e. the
+standard envariables like $PATH, $HOME, ... are set, there is a
+POSIX compliant shell in /bin/sh, and...)
+
+=head1 Known problems with Perl on MiNT
+
+The problems you may encounter when building perl on your machine
+are most probably due to deficiencies in MiNT resp. the Atari
+platform in general.
+
+First of all, if you have less than 8 MB of RAM you shouldn't
+even try to build Perl yourself. Better grab a binary pre-compiled
+version somewhere. Even if you have more memory you should take
+some care. Try to run in a fresh environment (without memory
+fragmented too much) with as few daemons, accessories, xcontrol
+modules etc. as possible. If you run some AES you should
+consider to start a console based environment instead.
+
+A problem has been reported with sed. Sed is used to create
+some configuration files based on the answers you have given
+to the Configure script. Unfortunately the Perl Configure script
+shows sed on MiNT its limits. I have sed 2.05 with a stacksize
+of 64k and I have encountered no problems. If sed crashes
+during your configuration process you should first try to
+augment sed's stacksize:
+
+ fixstk 64k /usr/bin/sed
+
+(or similar). If it still doesn't help you may have a look
+which other versions of sed are installed on your system.
+If you have a KGMD 1.0 installation you will find three
+in /usr/bin. Have a look there.
+
+Perl has some "mammut" C files. If gcc reports "internal
+compiler error: program cc1 got fatal signal 10" this is very
+likely due to a stack overflow in program cc1. Find cc1
+and fix its stack. I have made good experiences with
+
+ fixstk 2 cc1
+
+This doesn't establish a stack of 2 Bytes only as you might
+think. It really reserves one half of the available memory
+for cc1's stack. A setting of 1 would reserve the entire
+memory for cc1, 3 would reserve three fourths. You will have
+to find out the value that suits to your system yourself.
+
+To find out the location of the program "cc1" simply type
+`gcc --print-prog-name cc1' at your shell prompt.
+
+Now run make (maybe "make -k"). If you get a fatal signal 10
+increase cc1's stacksize, if you run out of memory you should
+either decrease the stacksize or follow some more hints:
+
+Perl's building process is very handy on machines with a lot
+of virtual memory but may result in a disaster if you are short
+of memory. If gcc fails to compile many source files you should
+reduce the optimization. Grep for "optimize" in the file
+config.sh and change the flags.
+
+If only several huge files cause problems (actually it is not a
+matter of the file size resp. the amount of code but depends on
+the size of the individual functions) it is useful to bypass
+the make program and compile these files directly from the
+command line. For example if you got something like the
+following from make:
+
+ CCCMD = gcc -DPERL_CORE ....
+ ...
+ ...: virtual memory exhausted
+
+you should hack into the shell:
+
+ gcc -DPERL_CORE ... toke.c
+
+Please note that you have to add the name of the source file
+(here toke.c) at the end.
+
+If none of this helps, you're helpless. Wait for a binary
+release. If you have succeeded you may encounter another problem
+at the linking process. If gcc complains that it can't find
+some libraries within the perl distribution you probably have
+an old linker. If it complains for example about "file not
+found for xxx.olb" you should cd into the directory in
+question and
+
+ ln -s libxxx.a xxx.olb
+
+This will fix the problem.
+
+This version (5.00402) of perl has passed most of the tests on my system:
+
+ Failed Test Status Wstat Total Fail Failed List of failed
+ ------------------------------------------------------------------------------
+ io/pipe.t 10 2 20.00% 7, 9
+ io/tell.t 13 1 7.69% 12
+ lib/complex.t 762 13 1.71% 84-85, 248-251, 257, 272-273,
+ 371, 380, 419-420
+ lib/io_pipe.t 10 1 10.00% 9
+ lib/io_tell.t 13 1 7.69% 12
+ op/magic.t 30 2 6.67% 29-30
+ Failed 6/152 test scripts, 96.05% okay. 20/4359 subtests failed, 99.54% okay.
+
+Pipes always cause problems with MiNT, it's actually a surprise that
+most of the tests did work. I've got no idea why the "tell" test failed,
+this shouldn't mean too big a problem however.
+
+Most of the failures of lib/complex seem to be harmless, actually errors
+far right to the decimal point... Two failures seem to be serious:
+The sign of the results is reversed. I would say that this is due
+to minor bugs in the portable math lib that I compiled perl with.
+
+I haven't bothered very much to find the reason for the failures
+with op/magic.t and op/stat.t. Maybe you'll find it out.
+
+##########################################################################
+
+Another possible problem may arise from the implementation of the "pwd"
+command. It happened to add a carriage return and newline to its output
+no matter what the setting of $UNIXMODE is. This is quite annoying since many
+library modules for perl take the output of pwd, chop off the
+trailing newline character and then expect to see a valid path in
+that. But the carriage return (last but second character!) isn't
+chopped off. You can either try to patch all library modules (at
+the price of performance for the extra transformation) or you can
+use my version of pwd that doesn't suffer from this deficiency.
+
+The fixed implementation is in the mint subdirectory. Running
+"Configure" will attempt to build and install it if necessary
+(hints/mint.sh will do this work) but you can build and install it
+explicitly by:
+
+ cd mint
+ make install
+
+This is the fastest solution.
+
+Just in case you want to go the hard way: perl won't even build with a
+broken pwd! You will have to fix the library modules
+(ext/POSIX/POSIX.pm, lib/Cwd.pm, lib/pwd.pl) at last after building
+miniperl.
+
+A major nuisance of current MiNTLib versions is the implementation
+of system() which is far from being POSIX compliant. A real system()
+should fork and then exec /bin/sh with its argument as a command
+line to the shell. The MiNTLib system() however doesn't expect
+that every user has a POSIX shell in /bin/sh. It tries to work
+around the problem by forking and exec'ing the first token in its argument
+string. To get a little bit of compliance to POSIX system() it
+tries to handle at least redirection ("<" or ">") on its own
+behalf.
+
+This isn't a good idea since many programs expect that they can
+pass a command line to system() that exploits all features of a
+POSIX shell. If you use the MiNTLib version of system() with
+perl the Perl function system() will suffer from the same deficiencies.
+
+You will find a fixed version of system() in the mint subdirectory.
+You can easily insert this version into your system libc:
+
+ cd mint
+ make system.o
+ ar r /usr/lib/libc.a
+ ranlib /usr/lib/libc.a
+
+If you are suspicious you should either back up your libc before
+or extract the original system.o from your libc with
+"ar x /usr/lib/libc.a system.o". You can then backup the system.o
+module somewhere before you succeed.
+
+Anything missing? Yep, I've almost forgotten...
+No file in this distribution without a fine saying. Take this one:
+
+ "From a thief you should learn: (1) to work at night;
+ (2) if one cannot gain what one wants in one night to
+ try again the next night; (3) to love one's coworkers
+ just as thieves love each other; (4) to be willing to
+ risk one's life even for a little thing; (5) not to
+ attach too much value to things even though one has
+ risked one's life for them - just as a thief will resell
+ a stolen article for a fraction of its real value;
+ (6) to withstand all kinds of beatings and tortures
+ but to remain what you are; and (7) to believe your
+ work is worthwhile and not be willing to change it."
+
+ -- Rabbi Dov Baer, Maggid of Mezeritch
+
+OK, this was my motto while working on Perl for MiNT, especially rule (1)...
+
+Have fun with Perl!
+
+=head1 AUTHOR
+
+Guido Flohr
+
+ mailto:guido@FreeMiNT.de
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlmod.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlmod.pod
new file mode 100755
index 00000000000..4a7c62dfd0d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlmod.pod
@@ -0,0 +1,598 @@
+=head1 NAME
+
+perlmod - Perl modules (packages and symbol tables)
+
+=head1 DESCRIPTION
+
+=head2 Packages
+X<package> X<namespace> X<variable, global> X<global variable> X<global>
+
+Perl provides a mechanism for alternative namespaces to protect
+packages from stomping on each other's variables. In fact, there's
+really no such thing as a global variable in Perl. The package
+statement declares the compilation unit as being in the given
+namespace. The scope of the package declaration is from the
+declaration itself through the end of the enclosing block, C<eval>,
+or file, whichever comes first (the same scope as the my() and
+local() operators). Unqualified dynamic identifiers will be in
+this namespace, except for those few identifiers that if unqualified,
+default to the main package instead of the current one as described
+below. A package statement affects only dynamic variables--including
+those you've used local() on--but I<not> lexical variables created
+with my(). Typically it would be the first declaration in a file
+included by the C<do>, C<require>, or C<use> operators. You can
+switch into a package in more than one place; it merely influences
+which symbol table is used by the compiler for the rest of that
+block. You can refer to variables and filehandles in other packages
+by prefixing the identifier with the package name and a double
+colon: C<$Package::Variable>. If the package name is null, the
+C<main> package is assumed. That is, C<$::sail> is equivalent to
+C<$main::sail>.
+
+The old package delimiter was a single quote, but double colon is now the
+preferred delimiter, in part because it's more readable to humans, and
+in part because it's more readable to B<emacs> macros. It also makes C++
+programmers feel like they know what's going on--as opposed to using the
+single quote as separator, which was there to make Ada programmers feel
+like they knew what was going on. Because the old-fashioned syntax is still
+supported for backwards compatibility, if you try to use a string like
+C<"This is $owner's house">, you'll be accessing C<$owner::s>; that is,
+the $s variable in package C<owner>, which is probably not what you meant.
+Use braces to disambiguate, as in C<"This is ${owner}'s house">.
+X<::> X<'>
+
+Packages may themselves contain package separators, as in
+C<$OUTER::INNER::var>. This implies nothing about the order of
+name lookups, however. There are no relative packages: all symbols
+are either local to the current package, or must be fully qualified
+from the outer package name down. For instance, there is nowhere
+within package C<OUTER> that C<$INNER::var> refers to
+C<$OUTER::INNER::var>. C<INNER> refers to a totally
+separate global package.
+
+Only identifiers starting with letters (or underscore) are stored
+in a package's symbol table. All other symbols are kept in package
+C<main>, including all punctuation variables, like $_. In addition,
+when unqualified, the identifiers STDIN, STDOUT, STDERR, ARGV,
+ARGVOUT, ENV, INC, and SIG are forced to be in package C<main>,
+even when used for other purposes than their built-in ones. If you
+have a package called C<m>, C<s>, or C<y>, then you can't use the
+qualified form of an identifier because it would be instead interpreted
+as a pattern match, a substitution, or a transliteration.
+X<variable, punctuation>
+
+Variables beginning with underscore used to be forced into package
+main, but we decided it was more useful for package writers to be able
+to use leading underscore to indicate private variables and method names.
+However, variables and functions named with a single C<_>, such as
+$_ and C<sub _>, are still forced into the package C<main>. See also
+L<perlvar/"Technical Note on the Syntax of Variable Names">.
+
+C<eval>ed strings are compiled in the package in which the eval() was
+compiled. (Assignments to C<$SIG{}>, however, assume the signal
+handler specified is in the C<main> package. Qualify the signal handler
+name if you wish to have a signal handler in a package.) For an
+example, examine F<perldb.pl> in the Perl library. It initially switches
+to the C<DB> package so that the debugger doesn't interfere with variables
+in the program you are trying to debug. At various points, however, it
+temporarily switches back to the C<main> package to evaluate various
+expressions in the context of the C<main> package (or wherever you came
+from). See L<perldebug>.
+
+The special symbol C<__PACKAGE__> contains the current package, but cannot
+(easily) be used to construct variable names.
+
+See L<perlsub> for other scoping issues related to my() and local(),
+and L<perlref> regarding closures.
+
+=head2 Symbol Tables
+X<symbol table> X<stash> X<%::> X<%main::> X<typeglob> X<glob> X<alias>
+
+The symbol table for a package happens to be stored in the hash of that
+name with two colons appended. The main symbol table's name is thus
+C<%main::>, or C<%::> for short. Likewise the symbol table for the nested
+package mentioned earlier is named C<%OUTER::INNER::>.
+
+The value in each entry of the hash is what you are referring to when you
+use the C<*name> typeglob notation.
+
+ local *main::foo = *main::bar;
+
+You can use this to print out all the variables in a package, for
+instance. The standard but antiquated F<dumpvar.pl> library and
+the CPAN module Devel::Symdump make use of this.
+
+Assignment to a typeglob performs an aliasing operation, i.e.,
+
+ *dick = *richard;
+
+causes variables, subroutines, formats, and file and directory handles
+accessible via the identifier C<richard> also to be accessible via the
+identifier C<dick>. If you want to alias only a particular variable or
+subroutine, assign a reference instead:
+
+ *dick = \$richard;
+
+Which makes $richard and $dick the same variable, but leaves
+@richard and @dick as separate arrays. Tricky, eh?
+
+There is one subtle difference between the following statements:
+
+ *foo = *bar;
+ *foo = \$bar;
+
+C<*foo = *bar> makes the typeglobs themselves synonymous while
+C<*foo = \$bar> makes the SCALAR portions of two distinct typeglobs
+refer to the same scalar value. This means that the following code:
+
+ $bar = 1;
+ *foo = \$bar; # Make $foo an alias for $bar
+
+ {
+ local $bar = 2; # Restrict changes to block
+ print $foo; # Prints '1'!
+ }
+
+Would print '1', because C<$foo> holds a reference to the I<original>
+C<$bar> -- the one that was stuffed away by C<local()> and which will be
+restored when the block ends. Because variables are accessed through the
+typeglob, you can use C<*foo = *bar> to create an alias which can be
+localized. (But be aware that this means you can't have a separate
+C<@foo> and C<@bar>, etc.)
+
+What makes all of this important is that the Exporter module uses glob
+aliasing as the import/export mechanism. Whether or not you can properly
+localize a variable that has been exported from a module depends on how
+it was exported:
+
+ @EXPORT = qw($FOO); # Usual form, can't be localized
+ @EXPORT = qw(*FOO); # Can be localized
+
+You can work around the first case by using the fully qualified name
+(C<$Package::FOO>) where you need a local value, or by overriding it
+by saying C<*FOO = *Package::FOO> in your script.
+
+The C<*x = \$y> mechanism may be used to pass and return cheap references
+into or from subroutines if you don't want to copy the whole
+thing. It only works when assigning to dynamic variables, not
+lexicals.
+
+ %some_hash = (); # can't be my()
+ *some_hash = fn( \%another_hash );
+ sub fn {
+ local *hashsym = shift;
+ # now use %hashsym normally, and you
+ # will affect the caller's %another_hash
+ my %nhash = (); # do what you want
+ return \%nhash;
+ }
+
+On return, the reference will overwrite the hash slot in the
+symbol table specified by the *some_hash typeglob. This
+is a somewhat tricky way of passing around references cheaply
+when you don't want to have to remember to dereference variables
+explicitly.
+
+Another use of symbol tables is for making "constant" scalars.
+X<constant> X<scalar, constant>
+
+ *PI = \3.14159265358979;
+
+Now you cannot alter C<$PI>, which is probably a good thing all in all.
+This isn't the same as a constant subroutine, which is subject to
+optimization at compile-time. A constant subroutine is one prototyped
+to take no arguments and to return a constant expression. See
+L<perlsub> for details on these. The C<use constant> pragma is a
+convenient shorthand for these.
+
+You can say C<*foo{PACKAGE}> and C<*foo{NAME}> to find out what name and
+package the *foo symbol table entry comes from. This may be useful
+in a subroutine that gets passed typeglobs as arguments:
+
+ sub identify_typeglob {
+ my $glob = shift;
+ print 'You gave me ', *{$glob}{PACKAGE}, '::', *{$glob}{NAME}, "\n";
+ }
+ identify_typeglob *foo;
+ identify_typeglob *bar::baz;
+
+This prints
+
+ You gave me main::foo
+ You gave me bar::baz
+
+The C<*foo{THING}> notation can also be used to obtain references to the
+individual elements of *foo. See L<perlref>.
+
+Subroutine definitions (and declarations, for that matter) need
+not necessarily be situated in the package whose symbol table they
+occupy. You can define a subroutine outside its package by
+explicitly qualifying the name of the subroutine:
+
+ package main;
+ sub Some_package::foo { ... } # &foo defined in Some_package
+
+This is just a shorthand for a typeglob assignment at compile time:
+
+ BEGIN { *Some_package::foo = sub { ... } }
+
+and is I<not> the same as writing:
+
+ {
+ package Some_package;
+ sub foo { ... }
+ }
+
+In the first two versions, the body of the subroutine is
+lexically in the main package, I<not> in Some_package. So
+something like this:
+
+ package main;
+
+ $Some_package::name = "fred";
+ $main::name = "barney";
+
+ sub Some_package::foo {
+ print "in ", __PACKAGE__, ": \$name is '$name'\n";
+ }
+
+ Some_package::foo();
+
+prints:
+
+ in main: $name is 'barney'
+
+rather than:
+
+ in Some_package: $name is 'fred'
+
+This also has implications for the use of the SUPER:: qualifier
+(see L<perlobj>).
+
+=head2 BEGIN, UNITCHECK, CHECK, INIT and END
+X<BEGIN> X<UNITCHECK> X<CHECK> X<INIT> X<END>
+
+Five specially named code blocks are executed at the beginning and at
+the end of a running Perl program. These are the C<BEGIN>,
+C<UNITCHECK>, C<CHECK>, C<INIT>, and C<END> blocks.
+
+These code blocks can be prefixed with C<sub> to give the appearance of a
+subroutine (although this is not considered good style). One should note
+that these code blocks don't really exist as named subroutines (despite
+their appearance). The thing that gives this away is the fact that you can
+have B<more than one> of these code blocks in a program, and they will get
+B<all> executed at the appropriate moment. So you can't execute any of
+these code blocks by name.
+
+A C<BEGIN> code block is executed as soon as possible, that is, the moment
+it is completely defined, even before the rest of the containing file (or
+string) is parsed. You may have multiple C<BEGIN> blocks within a file (or
+eval'ed string) -- they will execute in order of definition. Because a C<BEGIN>
+code block executes immediately, it can pull in definitions of subroutines
+and such from other files in time to be visible to the rest of the compile
+and run time. Once a C<BEGIN> has run, it is immediately undefined and any
+code it used is returned to Perl's memory pool.
+
+An C<END> code block is executed as late as possible, that is, after
+perl has finished running the program and just before the interpreter
+is being exited, even if it is exiting as a result of a die() function.
+(But not if it's morphing into another program via C<exec>, or
+being blown out of the water by a signal--you have to trap that yourself
+(if you can).) You may have multiple C<END> blocks within a file--they
+will execute in reverse order of definition; that is: last in, first
+out (LIFO). C<END> blocks are not executed when you run perl with the
+C<-c> switch, or if compilation fails.
+
+Note that C<END> code blocks are B<not> executed at the end of a string
+C<eval()>: if any C<END> code blocks are created in a string C<eval()>,
+they will be executed just as any other C<END> code block of that package
+in LIFO order just before the interpreter is being exited.
+
+Inside an C<END> code block, C<$?> contains the value that the program is
+going to pass to C<exit()>. You can modify C<$?> to change the exit
+value of the program. Beware of changing C<$?> by accident (e.g. by
+running something via C<system>).
+X<$?>
+
+C<UNITCHECK>, C<CHECK> and C<INIT> code blocks are useful to catch the
+transition between the compilation phase and the execution phase of
+the main program.
+
+C<UNITCHECK> blocks are run just after the unit which defined them has
+been compiled. The main program file and each module it loads are
+compilation units, as are string C<eval>s, code compiled using the
+C<(?{ })> construct in a regex, calls to C<do FILE>, C<require FILE>,
+and code after the C<-e> switch on the command line.
+
+C<CHECK> code blocks are run just after the B<initial> Perl compile phase ends
+and before the run time begins, in LIFO order. C<CHECK> code blocks are used
+in the Perl compiler suite to save the compiled state of the program.
+
+C<INIT> blocks are run just before the Perl runtime begins execution, in
+"first in, first out" (FIFO) order.
+
+The C<CHECK> and C<INIT> code blocks will not be executed inside a string
+eval(), if that eval() happens after the end of the main compilation
+phase; that can be a problem in mod_perl and other persistent environments
+which use C<eval STRING> to load code at runtime.
+
+When you use the B<-n> and B<-p> switches to Perl, C<BEGIN> and
+C<END> work just as they do in B<awk>, as a degenerate case.
+Both C<BEGIN> and C<CHECK> blocks are run when you use the B<-c>
+switch for a compile-only syntax check, although your main code
+is not.
+
+The B<begincheck> program makes it all clear, eventually:
+
+ #!/usr/bin/perl
+
+ # begincheck
+
+ print "10. Ordinary code runs at runtime.\n";
+
+ END { print "16. So this is the end of the tale.\n" }
+ INIT { print " 7. INIT blocks run FIFO just before runtime.\n" }
+ UNITCHECK {
+ print " 4. And therefore before any CHECK blocks.\n"
+ }
+ CHECK { print " 6. So this is the sixth line.\n" }
+
+ print "11. It runs in order, of course.\n";
+
+ BEGIN { print " 1. BEGIN blocks run FIFO during compilation.\n" }
+ END { print "15. Read perlmod for the rest of the story.\n" }
+ CHECK { print " 5. CHECK blocks run LIFO after all compilation.\n" }
+ INIT { print " 8. Run this again, using Perl's -c switch.\n" }
+
+ print "12. This is anti-obfuscated code.\n";
+
+ END { print "14. END blocks run LIFO at quitting time.\n" }
+ BEGIN { print " 2. So this line comes out second.\n" }
+ UNITCHECK {
+ print " 3. UNITCHECK blocks run LIFO after each file is compiled.\n"
+ }
+ INIT { print " 9. You'll see the difference right away.\n" }
+
+ print "13. It merely _looks_ like it should be confusing.\n";
+
+ __END__
+
+=head2 Perl Classes
+X<class> X<@ISA>
+
+There is no special class syntax in Perl, but a package may act
+as a class if it provides subroutines to act as methods. Such a
+package may also derive some of its methods from another class (package)
+by listing the other package name(s) in its global @ISA array (which
+must be a package global, not a lexical).
+
+For more on this, see L<perltoot> and L<perlobj>.
+
+=head2 Perl Modules
+X<module>
+
+A module is just a set of related functions in a library file, i.e.,
+a Perl package with the same name as the file. It is specifically
+designed to be reusable by other modules or programs. It may do this
+by providing a mechanism for exporting some of its symbols into the
+symbol table of any package using it, or it may function as a class
+definition and make its semantics available implicitly through
+method calls on the class and its objects, without explicitly
+exporting anything. Or it can do a little of both.
+
+For example, to start a traditional, non-OO module called Some::Module,
+create a file called F<Some/Module.pm> and start with this template:
+
+ package Some::Module; # assumes Some/Module.pm
+
+ use strict;
+ use warnings;
+
+ BEGIN {
+ use Exporter ();
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+ # set the version for version checking
+ $VERSION = 1.00;
+ # if using RCS/CVS, this may be preferred
+ $VERSION = sprintf "%d.%03d", q$Revision: 1.1 $ =~ /(\d+)/g;
+
+ @ISA = qw(Exporter);
+ @EXPORT = qw(&func1 &func2 &func4);
+ %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+
+ # your exported package globals go here,
+ # as well as any optionally exported functions
+ @EXPORT_OK = qw($Var1 %Hashit &func3);
+ }
+ our @EXPORT_OK;
+
+ # exported package globals go here
+ our $Var1;
+ our %Hashit;
+
+ # non-exported package globals go here
+ our @more;
+ our $stuff;
+
+ # initialize package globals, first exported ones
+ $Var1 = '';
+ %Hashit = ();
+
+ # then the others (which are still accessible as $Some::Module::stuff)
+ $stuff = '';
+ @more = ();
+
+ # all file-scoped lexicals must be created before
+ # the functions below that use them.
+
+ # file-private lexicals go here
+ my $priv_var = '';
+ my %secret_hash = ();
+
+ # here's a file-private function as a closure,
+ # callable as &$priv_func; it cannot be prototyped.
+ my $priv_func = sub {
+ # stuff goes here.
+ };
+
+ # make all your functions, whether exported or not;
+ # remember to put something interesting in the {} stubs
+ sub func1 {} # no prototype
+ sub func2() {} # proto'd void
+ sub func3($$) {} # proto'd to 2 scalars
+
+ # this one isn't exported, but could be called!
+ sub func4(\%) {} # proto'd to 1 hash ref
+
+ END { } # module clean-up code here (global destructor)
+
+ ## YOUR CODE GOES HERE
+
+ 1; # don't forget to return a true value from the file
+
+Then go on to declare and use your variables in functions without
+any qualifications. See L<Exporter> and the L<perlmodlib> for
+details on mechanics and style issues in module creation.
+
+Perl modules are included into your program by saying
+
+ use Module;
+
+or
+
+ use Module LIST;
+
+This is exactly equivalent to
+
+ BEGIN { require Module; import Module; }
+
+or
+
+ BEGIN { require Module; import Module LIST; }
+
+As a special case
+
+ use Module ();
+
+is exactly equivalent to
+
+ BEGIN { require Module; }
+
+All Perl module files have the extension F<.pm>. The C<use> operator
+assumes this so you don't have to spell out "F<Module.pm>" in quotes.
+This also helps to differentiate new modules from old F<.pl> and
+F<.ph> files. Module names are also capitalized unless they're
+functioning as pragmas; pragmas are in effect compiler directives,
+and are sometimes called "pragmatic modules" (or even "pragmata"
+if you're a classicist).
+
+The two statements:
+
+ require SomeModule;
+ require "SomeModule.pm";
+
+differ from each other in two ways. In the first case, any double
+colons in the module name, such as C<Some::Module>, are translated
+into your system's directory separator, usually "/". The second
+case does not, and would have to be specified literally. The other
+difference is that seeing the first C<require> clues in the compiler
+that uses of indirect object notation involving "SomeModule", as
+in C<$ob = purge SomeModule>, are method calls, not function calls.
+(Yes, this really can make a difference.)
+
+Because the C<use> statement implies a C<BEGIN> block, the importing
+of semantics happens as soon as the C<use> statement is compiled,
+before the rest of the file is compiled. This is how it is able
+to function as a pragma mechanism, and also how modules are able to
+declare subroutines that are then visible as list or unary operators for
+the rest of the current file. This will not work if you use C<require>
+instead of C<use>. With C<require> you can get into this problem:
+
+ require Cwd; # make Cwd:: accessible
+ $here = Cwd::getcwd();
+
+ use Cwd; # import names from Cwd::
+ $here = getcwd();
+
+ require Cwd; # make Cwd:: accessible
+ $here = getcwd(); # oops! no main::getcwd()
+
+In general, C<use Module ()> is recommended over C<require Module>,
+because it determines module availability at compile time, not in the
+middle of your program's execution. An exception would be if two modules
+each tried to C<use> each other, and each also called a function from
+that other module. In that case, it's easy to use C<require> instead.
+
+Perl packages may be nested inside other package names, so we can have
+package names containing C<::>. But if we used that package name
+directly as a filename it would make for unwieldy or impossible
+filenames on some systems. Therefore, if a module's name is, say,
+C<Text::Soundex>, then its definition is actually found in the library
+file F<Text/Soundex.pm>.
+
+Perl modules always have a F<.pm> file, but there may also be
+dynamically linked executables (often ending in F<.so>) or autoloaded
+subroutine definitions (often ending in F<.al>) associated with the
+module. If so, these will be entirely transparent to the user of
+the module. It is the responsibility of the F<.pm> file to load
+(or arrange to autoload) any additional functionality. For example,
+although the POSIX module happens to do both dynamic loading and
+autoloading, the user can say just C<use POSIX> to get it all.
+
+=head2 Making your module threadsafe
+X<threadsafe> X<thread safe>
+X<module, threadsafe> X<module, thread safe>
+X<CLONE> X<CLONE_SKIP> X<thread> X<threads> X<ithread>
+
+Since 5.6.0, Perl has had support for a new type of threads called
+interpreter threads (ithreads). These threads can be used explicitly
+and implicitly.
+
+Ithreads work by cloning the data tree so that no data is shared
+between different threads. These threads can be used by using the C<threads>
+module or by doing fork() on win32 (fake fork() support). When a
+thread is cloned all Perl data is cloned, however non-Perl data cannot
+be cloned automatically. Perl after 5.7.2 has support for the C<CLONE>
+special subroutine. In C<CLONE> you can do whatever
+you need to do,
+like for example handle the cloning of non-Perl data, if necessary.
+C<CLONE> will be called once as a class method for every package that has it
+defined (or inherits it). It will be called in the context of the new thread,
+so all modifications are made in the new area. Currently CLONE is called with
+no parameters other than the invocant package name, but code should not assume
+that this will remain unchanged, as it is likely that in future extra parameters
+will be passed in to give more information about the state of cloning.
+
+If you want to CLONE all objects you will need to keep track of them per
+package. This is simply done using a hash and Scalar::Util::weaken().
+
+Perl after 5.8.7 has support for the C<CLONE_SKIP> special subroutine.
+Like C<CLONE>, C<CLONE_SKIP> is called once per package; however, it is
+called just before cloning starts, and in the context of the parent
+thread. If it returns a true value, then no objects of that class will
+be cloned; or rather, they will be copied as unblessed, undef values.
+For example: if in the parent there are two references to a single blessed
+hash, then in the child there will be two references to a single undefined
+scalar value instead.
+This provides a simple mechanism for making a module threadsafe; just add
+C<sub CLONE_SKIP { 1 }> at the top of the class, and C<DESTROY()> will be
+now only be called once per object. Of course, if the child thread needs
+to make use of the objects, then a more sophisticated approach is
+needed.
+
+Like C<CLONE>, C<CLONE_SKIP> is currently called with no parameters other
+than the invocant package name, although that may change. Similarly, to
+allow for future expansion, the return value should be a single C<0> or
+C<1> value.
+
+=head1 SEE ALSO
+
+See L<perlmodlib> for general style issues related to building Perl
+modules and classes, as well as descriptions of the standard library
+and CPAN, L<Exporter> for how Perl's standard import/export mechanism
+works, L<perltoot> and L<perltooc> for an in-depth tutorial on
+creating classes, L<perlobj> for a hard-core reference document on
+objects, L<perlsub> for an explanation of functions and scoping,
+and L<perlxstut> and L<perlguts> for more information on writing
+extension modules.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlmodinstall.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlmodinstall.pod
new file mode 100755
index 00000000000..8352bff474f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlmodinstall.pod
@@ -0,0 +1,465 @@
+=head1 NAME
+
+perlmodinstall - Installing CPAN Modules
+
+=head1 DESCRIPTION
+
+You can think of a module as the fundamental unit of reusable Perl
+code; see L<perlmod> for details. Whenever anyone creates a chunk of
+Perl code that they think will be useful to the world, they register
+as a Perl developer at http://www.cpan.org/modules/04pause.html
+so that they can then upload their code to the CPAN. The CPAN is the
+Comprehensive Perl Archive Network and can be accessed at
+http://www.cpan.org/ , and searched at http://search.cpan.org/ .
+
+This documentation is for people who want to download CPAN modules
+and install them on their own computer.
+
+=head2 PREAMBLE
+
+First, are you sure that the module isn't already on your system? Try
+C<perl -MFoo -e 1>. (Replace "Foo" with the name of the module; for
+instance, C<perl -MCGI::Carp -e 1>.
+
+If you don't see an error message, you have the module. (If you do
+see an error message, it's still possible you have the module, but
+that it's not in your path, which you can display with C<perl -e
+"print qq(@INC)">.) For the remainder of this document, we'll assume
+that you really honestly truly lack an installed module, but have
+found it on the CPAN.
+
+So now you have a file ending in .tar.gz (or, less often, .zip). You
+know there's a tasty module inside. There are four steps you must now
+take:
+
+=over 5
+
+=item B<DECOMPRESS> the file
+
+=item B<UNPACK> the file into a directory
+
+=item B<BUILD> the module (sometimes unnecessary)
+
+=item B<INSTALL> the module.
+
+=back
+
+Here's how to perform each step for each operating system. This is
+<not> a substitute for reading the README and INSTALL files that
+might have come with your module!
+
+Also note that these instructions are tailored for installing the
+module into your system's repository of Perl modules -- but you can
+install modules into any directory you wish. For instance, where I
+say C<perl Makefile.PL>, you can substitute C<perl Makefile.PL
+PREFIX=/my/perl_directory> to install the modules into
+C</my/perl_directory>. Then you can use the modules from your Perl
+programs with C<use lib "/my/perl_directory/lib/site_perl";> or
+sometimes just C<use "/my/perl_directory";>. If you're on a system
+that requires superuser/root access to install modules into the
+directories you see when you type C<perl -e "print qq(@INC)">, you'll
+want to install them into a local directory (such as your home
+directory) and use this approach.
+
+=over 4
+
+=item *
+
+B<If you're on a Unix or Unix-like system,>
+
+You can use Andreas Koenig's CPAN module
+( http://www.cpan.org/modules/by-module/CPAN )
+to automate the following steps, from DECOMPRESS through INSTALL.
+
+A. DECOMPRESS
+
+Decompress the file with C<gzip -d yourmodule.tar.gz>
+
+You can get gzip from ftp://prep.ai.mit.edu/pub/gnu/
+
+Or, you can combine this step with the next to save disk space:
+
+ gzip -dc yourmodule.tar.gz | tar -xof -
+
+B. UNPACK
+
+Unpack the result with C<tar -xof yourmodule.tar>
+
+C. BUILD
+
+Go into the newly-created directory and type:
+
+ perl Makefile.PL
+ make test
+
+or
+
+ perl Makefile.PL PREFIX=/my/perl_directory
+
+to install it locally. (Remember that if you do this, you'll have to
+put C<use lib "/my/perl_directory";> near the top of the program that
+is to use this module.
+
+D. INSTALL
+
+While still in that directory, type:
+
+ make install
+
+Make sure you have the appropriate permissions to install the module
+in your Perl 5 library directory. Often, you'll need to be root.
+
+That's all you need to do on Unix systems with dynamic linking.
+Most Unix systems have dynamic linking -- if yours doesn't, or if for
+another reason you have a statically-linked perl, B<and> the
+module requires compilation, you'll need to build a new Perl binary
+that includes the module. Again, you'll probably need to be root.
+
+=item *
+
+B<If you're running ActivePerl (Win95/98/2K/NT/XP, Linux, Solaris)>
+
+First, type C<ppm> from a shell and see whether ActiveState's PPM
+repository has your module. If so, you can install it with C<ppm> and
+you won't have to bother with any of the other steps here. You might
+be able to use the CPAN instructions from the "Unix or Linux" section
+above as well; give it a try. Otherwise, you'll have to follow the
+steps below.
+
+ A. DECOMPRESS
+
+You can use the shareware Winzip ( http://www.winzip.com ) to
+decompress and unpack modules.
+
+ B. UNPACK
+
+If you used WinZip, this was already done for you.
+
+ C. BUILD
+
+You'll need the C<nmake> utility, available at
+http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/nmake15.exe
+or dmake, available on CPAN.
+http://search.cpan.org/dist/dmake/
+
+Does the module require compilation (i.e. does it have files that end
+in .xs, .c, .h, .y, .cc, .cxx, or .C)? If it does, life is now
+officially tough for you, because you have to compile the module
+yourself -- no easy feat on Windows. You'll need a compiler such as
+Visual C++. Alternatively, you can download a pre-built PPM package
+from ActiveState.
+http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/
+
+Go into the newly-created directory and type:
+
+ perl Makefile.PL
+ nmake test
+
+
+ D. INSTALL
+
+While still in that directory, type:
+
+ nmake install
+
+=item *
+
+B<If you're using a Macintosh with "Classic" MacOS and MacPerl,>
+
+
+A. DECOMPRESS
+
+First, make sure you have the latest B<cpan-mac> distribution (
+http://www.cpan.org/authors/id/CNANDOR/ ), which has utilities for
+doing all of the steps. Read the cpan-mac directions carefully and
+install it. If you choose not to use cpan-mac for some reason, there
+are alternatives listed here.
+
+After installing cpan-mac, drop the module archive on the
+B<untarzipme> droplet, which will decompress and unpack for you.
+
+B<Or>, you can either use the shareware B<StuffIt Expander> program
+( http://www.aladdinsys.com/expander/ )
+in combination with B<DropStuff with Expander Enhancer>
+( http://www.aladdinsys.com/dropstuff/ )
+or the freeware B<MacGzip> program (
+http://persephone.cps.unizar.es/general/gente/spd/gzip/gzip.html ).
+
+B. UNPACK
+
+If you're using untarzipme or StuffIt, the archive should be extracted
+now. B<Or>, you can use the freeware B<suntar> or I<Tar> (
+http://hyperarchive.lcs.mit.edu/HyperArchive/Archive/cmp/ ).
+
+C. BUILD
+
+Check the contents of the distribution.
+Read the module's documentation, looking for
+reasons why you might have trouble using it with MacPerl. Look for
+F<.xs> and F<.c> files, which normally denote that the distribution
+must be compiled, and you cannot install it "out of the box."
+(See L<"PORTABILITY">.)
+
+If a module does not work on MacPerl but should, or needs to be
+compiled, see if the module exists already as a port on the
+MacPerl Module Porters site ( http://pudge.net/mmp/ ).
+For more information on doing XS with MacPerl yourself, see
+Arved Sandstrom's XS tutorial ( http://macperl.com/depts/Tutorials/ ),
+and then consider uploading your binary to the CPAN and
+registering it on the MMP site.
+
+D. INSTALL
+
+If you are using cpan-mac, just drop the folder on the
+B<installme> droplet, and use the module.
+
+B<Or>, if you aren't using cpan-mac, do some manual labor.
+
+Make sure the newlines for the modules are in Mac format, not Unix format.
+If they are not then you might have decompressed them incorrectly. Check
+your decompression and unpacking utilities settings to make sure they are
+translating text files properly.
+
+As a last resort, you can use the perl one-liner:
+
+ perl -i.bak -pe 's/(?:\015)?\012/\015/g' <filenames>
+
+on the source files.
+
+Then move the files (probably just the F<.pm> files, though there
+may be some additional ones, too; check the module documentation)
+to their final destination: This will
+most likely be in C<$ENV{MACPERL}site_lib:> (i.e.,
+C<HD:MacPerl folder:site_lib:>). You can add new paths to
+the default C<@INC> in the Preferences menu item in the
+MacPerl application (C<$ENV{MACPERL}site_lib:> is added
+automagically). Create whatever directory structures are required
+(i.e., for C<Some::Module>, create
+C<$ENV{MACPERL}site_lib:Some:> and put
+C<Module.pm> in that directory).
+
+Then run the following script (or something like it):
+
+ #!perl -w
+ use AutoSplit;
+ my $dir = "${MACPERL}site_perl";
+ autosplit("$dir:Some:Module.pm", "$dir:auto", 0, 1, 1);
+
+=item *
+
+B<If you're on the DJGPP port of DOS,>
+
+ A. DECOMPRESS
+
+djtarx ( ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2/ )
+will both uncompress and unpack.
+
+ B. UNPACK
+
+See above.
+
+ C. BUILD
+
+Go into the newly-created directory and type:
+
+ perl Makefile.PL
+ make test
+
+You will need the packages mentioned in F<README.dos>
+in the Perl distribution.
+
+ D. INSTALL
+
+While still in that directory, type:
+
+ make install
+
+You will need the packages mentioned in F<README.dos> in the Perl distribution.
+
+=item *
+
+B<If you're on OS/2,>
+
+Get the EMX development suite and gzip/tar, from either Hobbes (
+http://hobbes.nmsu.edu ) or Leo ( http://www.leo.org ), and then follow
+the instructions for Unix.
+
+=item *
+
+B<If you're on VMS,>
+
+When downloading from CPAN, save your file with a C<.tgz>
+extension instead of C<.tar.gz>. All other periods in the
+filename should be replaced with underscores. For example,
+C<Your-Module-1.33.tar.gz> should be downloaded as
+C<Your-Module-1_33.tgz>.
+
+A. DECOMPRESS
+
+Type
+
+ gzip -d Your-Module.tgz
+
+or, for zipped modules, type
+
+ unzip Your-Module.zip
+
+Executables for gzip, zip, and VMStar:
+
+ http://www.openvms.digital.com/freeware/
+ http://www.crinoid.com/utils/
+
+and their source code:
+
+ http://www.fsf.org/order/ftp.html
+
+Note that GNU's gzip/gunzip is not the same as Info-ZIP's zip/unzip
+package. The former is a simple compression tool; the latter permits
+creation of multi-file archives.
+
+B. UNPACK
+
+If you're using VMStar:
+
+ VMStar xf Your-Module.tar
+
+Or, if you're fond of VMS command syntax:
+
+ tar/extract/verbose Your_Module.tar
+
+C. BUILD
+
+Make sure you have MMS (from Digital) or the freeware MMK ( available
+from MadGoat at http://www.madgoat.com ). Then type this to create
+the DESCRIP.MMS for the module:
+
+ perl Makefile.PL
+
+Now you're ready to build:
+
+ mms test
+
+Substitute C<mmk> for C<mms> above if you're using MMK.
+
+D. INSTALL
+
+Type
+
+ mms install
+
+Substitute C<mmk> for C<mms> above if you're using MMK.
+
+=item *
+
+B<If you're on MVS>,
+
+Introduce the F<.tar.gz> file into an HFS as binary; don't translate from
+ASCII to EBCDIC.
+
+A. DECOMPRESS
+
+Decompress the file with C<gzip -d yourmodule.tar.gz>
+
+You can get gzip from
+http://www.s390.ibm.com/products/oe/bpxqp1.html
+
+B. UNPACK
+
+Unpack the result with
+
+ pax -o to=IBM-1047,from=ISO8859-1 -r < yourmodule.tar
+
+The BUILD and INSTALL steps are identical to those for Unix. Some
+modules generate Makefiles that work better with GNU make, which is
+available from http://www.mks.com/s390/gnu/
+
+=back
+
+=head1 PORTABILITY
+
+Note that not all modules will work with on all platforms.
+See L<perlport> for more information on portability issues.
+Read the documentation to see if the module will work on your
+system. There are basically three categories
+of modules that will not work "out of the box" with all
+platforms (with some possibility of overlap):
+
+=over 4
+
+=item *
+
+B<Those that should, but don't.> These need to be fixed; consider
+contacting the author and possibly writing a patch.
+
+=item *
+
+B<Those that need to be compiled, where the target platform
+doesn't have compilers readily available.> (These modules contain
+F<.xs> or F<.c> files, usually.) You might be able to find
+existing binaries on the CPAN or elsewhere, or you might
+want to try getting compilers and building it yourself, and then
+release the binary for other poor souls to use.
+
+=item *
+
+B<Those that are targeted at a specific platform.>
+(Such as the Win32:: modules.) If the module is targeted
+specifically at a platform other than yours, you're out
+of luck, most likely.
+
+=back
+
+
+
+Check the CPAN Testers if a module should work with your platform
+but it doesn't behave as you'd expect, or you aren't sure whether or
+not a module will work under your platform. If the module you want
+isn't listed there, you can test it yourself and let CPAN Testers know,
+you can join CPAN Testers, or you can request it be tested.
+
+ http://testers.cpan.org/
+
+
+=head1 HEY
+
+If you have any suggested changes for this page, let me know. Please
+don't send me mail asking for help on how to install your modules.
+There are too many modules, and too few Orwants, for me to be able to
+answer or even acknowledge all your questions. Contact the module
+author instead, or post to comp.lang.perl.modules, or ask someone
+familiar with Perl on your operating system.
+
+=head1 AUTHOR
+
+Jon Orwant
+
+orwant@medita.mit.edu
+
+with invaluable help from Chris Nandor, and valuable help from Brandon
+Allbery, Charles Bailey, Graham Barr, Dominic Dunlop, Jarkko
+Hietaniemi, Ben Holzman, Tom Horsley, Nick Ing-Simmons, Tuomas
+J. Lukka, Laszlo Molnar, Alan Olsen, Peter Prymmer, Gurusamy Sarathy,
+Christoph Spalinger, Dan Sugalski, Larry Virden, and Ilya Zakharevich.
+
+First version July 22, 1998; last revised November 21, 2001.
+
+=head1 COPYRIGHT
+
+Copyright (C) 1998, 2002, 2003 Jon Orwant. All Rights Reserved.
+
+Permission is granted to make and distribute verbatim copies of this
+documentation provided the copyright notice and this permission notice are
+preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+documentation under the conditions for verbatim copying, provided also
+that they are marked clearly as modified versions, that the authors'
+names and title are unchanged (though subtitles and additional
+authors' names may be added), and that the entire resulting derived
+work is distributed under the terms of a permission notice identical
+to this one.
+
+Permission is granted to copy and distribute translations of this
+documentation into another language, under the above conditions for
+modified versions.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlmodlib.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlmodlib.pod
new file mode 100755
index 00000000000..8f64058ffe3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlmodlib.pod
@@ -0,0 +1,3430 @@
+=for maintainers
+Generated by perlmodlib.PL -- DO NOT EDIT!
+
+=head1 NAME
+
+perlmodlib - constructing new Perl modules and finding existing ones
+
+=head1 THE PERL MODULE LIBRARY
+
+Many modules are included in the Perl distribution. These are described
+below, and all end in F<.pm>. You may discover compiled library
+files (usually ending in F<.so>) or small pieces of modules to be
+autoloaded (ending in F<.al>); these were automatically generated
+by the installation process. You may also discover files in the
+library directory that end in either F<.pl> or F<.ph>. These are
+old libraries supplied so that old programs that use them still
+run. The F<.pl> files will all eventually be converted into standard
+modules, and the F<.ph> files made by B<h2ph> will probably end up
+as extension modules made by B<h2xs>. (Some F<.ph> values may
+already be available through the POSIX, Errno, or Fcntl modules.)
+The B<pl2pm> file in the distribution may help in your conversion,
+but it's just a mechanical process and therefore far from bulletproof.
+
+=head2 Pragmatic Modules
+
+They work somewhat like compiler directives (pragmata) in that they
+tend to affect the compilation of your program, and thus will usually
+work well only when used within a C<use>, or C<no>. Most of these
+are lexically scoped, so an inner BLOCK may countermand them
+by saying:
+
+ no integer;
+ no strict 'refs';
+ no warnings;
+
+which lasts until the end of that BLOCK.
+
+Some pragmas are lexically scoped--typically those that affect the
+C<$^H> hints variable. Others affect the current package instead,
+like C<use vars> and C<use subs>, which allow you to predeclare a
+variables or subroutines within a particular I<file> rather than
+just a block. Such declarations are effective for the entire file
+for which they were declared. You cannot rescind them with C<no
+vars> or C<no subs>.
+
+The following pragmas are defined (and have their own documentation).
+
+=over 12
+
+=item attributes
+
+Get/set subroutine or variable attributes
+
+=item attrs
+
+Set/get attributes of a subroutine (deprecated)
+
+=item autodie
+
+Replace functions with ones that succeed or die with lexical scope
+
+=item autodie::exception
+
+Exceptions from autodying functions.
+
+=item autodie::exception::system
+
+Exceptions from autodying system().
+
+=item autodie::hints
+
+Provide hints about user subroutines to autodie
+
+=item autouse
+
+Postpone load of modules until a function is used
+
+=item base
+
+Establish an ISA relationship with base classes at compile time
+
+=item bigint
+
+Transparent BigInteger support for Perl
+
+=item bignum
+
+Transparent BigNumber support for Perl
+
+=item bigrat
+
+Transparent BigNumber/BigRational support for Perl
+
+=item blib
+
+Use MakeMaker's uninstalled version of a package
+
+=item bytes
+
+Force byte semantics rather than character semantics
+
+=item charnames
+
+Define character names for C<\N{named}> string literal escapes
+
+=item constant
+
+Declare constants
+
+=item diagnostics
+
+Produce verbose warning diagnostics
+
+=item encoding
+
+Allows you to write your script in non-ascii or non-utf8
+
+=item encoding::warnings
+
+Warn on implicit encoding conversions
+
+=item feature
+
+Enable new syntactic features
+
+=item fields
+
+Compile-time class fields
+
+=item filetest
+
+Control the filetest permission operators
+
+=item if
+
+C<use> a Perl module if a condition holds
+
+=item integer
+
+Use integer arithmetic instead of floating point
+
+=item less
+
+Request less of something
+
+=item lib
+
+Manipulate @INC at compile time
+
+=item locale
+
+Use and avoid POSIX locales for built-in operations
+
+=item mro
+
+Method Resolution Order
+
+=item open
+
+Set default PerlIO layers for input and output
+
+=item ops
+
+Restrict unsafe operations when compiling
+
+=item overload
+
+Package for overloading Perl operations
+
+=item overloading
+
+Lexically control overloading
+
+=item parent
+
+Establish an ISA relationship with base classes at compile time
+
+=item re
+
+Alter regular expression behaviour
+
+=item sigtrap
+
+Enable simple signal handling
+
+=item sort
+
+Control sort() behaviour
+
+=item strict
+
+Restrict unsafe constructs
+
+=item subs
+
+Predeclare sub names
+
+=item threads
+
+Perl interpreter-based threads
+
+=item threads::shared
+
+Perl extension for sharing data structures between threads
+
+=item utf8
+
+Enable/disable UTF-8 (or UTF-EBCDIC) in source code
+
+=item vars
+
+Predeclare global variable names (obsolete)
+
+=item version
+
+Perl extension for Version Objects
+
+=item vmsish
+
+Control VMS-specific language features
+
+=item warnings
+
+Control optional warnings
+
+=item warnings::register
+
+Warnings import function
+
+=back
+
+=head2 Standard Modules
+
+Standard, bundled modules are all expected to behave in a well-defined
+manner with respect to namespace pollution because they use the
+Exporter module. See their own documentation for details.
+
+It's possible that not all modules listed below are installed on your
+system. For example, the GDBM_File module will not be installed if you
+don't have the gdbm library.
+
+=over 12
+
+=item AnyDBM_File
+
+Provide framework for multiple DBMs
+
+=item App::Prove
+
+Implements the C<prove> command.
+
+=item App::Prove::State
+
+State storage for the C<prove> command.
+
+=item App::Prove::State::Result
+
+Individual test suite results.
+
+=item App::Prove::State::Result::Test
+
+Individual test results.
+
+=item Archive::Extract
+
+A generic archive extracting mechanism
+
+=item Archive::Tar
+
+Module for manipulations of tar archives
+
+=item Archive::Tar::File
+
+A subclass for in-memory extracted file from Archive::Tar
+
+=item Attribute::Handlers
+
+Simpler definition of attribute handlers
+
+=item AutoLoader
+
+Load subroutines only on demand
+
+=item AutoSplit
+
+Split a package for autoloading
+
+=item B
+
+The Perl Compiler
+
+=item B::Concise
+
+Walk Perl syntax tree, printing concise info about ops
+
+=item B::Debug
+
+Walk Perl syntax tree, printing debug info about ops
+
+=item B::Deparse
+
+Perl compiler backend to produce perl code
+
+=item B::Lint
+
+Perl lint
+
+=item B::Lint::Debug
+
+Adds debugging stringification to B::
+
+=item B::Showlex
+
+Show lexical variables used in functions or files
+
+=item B::Terse
+
+Walk Perl syntax tree, printing terse info about ops
+
+=item B::Xref
+
+Generates cross reference reports for Perl programs
+
+=item Benchmark
+
+Benchmark running times of Perl code
+
+=item CGI
+
+Handle Common Gateway Interface requests and responses
+
+=item CGI::Apache
+
+Backward compatibility module for CGI.pm
+
+=item CGI::Carp
+
+CGI routines for writing to the HTTPD (or other) error log
+
+=item CGI::Cookie
+
+Interface to Netscape Cookies
+
+=item CGI::Fast
+
+CGI Interface for Fast CGI
+
+=item CGI::Pretty
+
+Module to produce nicely formatted HTML code
+
+=item CGI::Push
+
+Simple Interface to Server Push
+
+=item CGI::Switch
+
+Backward compatibility module for defunct CGI::Switch
+
+=item CGI::Util
+
+Internal utilities used by CGI module
+
+=item CORE
+
+Pseudo-namespace for Perl's core routines
+
+=item CPAN
+
+Query, download and build perl modules from CPAN sites
+
+=item CPAN::API::HOWTO
+
+A recipe book for programming with CPAN.pm
+
+=item CPAN::Distroprefs
+
+Read and match distroprefs
+
+=item CPAN::FirstTime
+
+Utility for CPAN::Config file Initialization
+
+=item CPAN::Kwalify
+
+Interface between CPAN.pm and Kwalify.pm
+
+=item CPAN::Nox
+
+Wrapper around CPAN.pm without using any XS module
+
+=item CPAN::Version
+
+Utility functions to compare CPAN versions
+
+=item CPANPLUS
+
+API & CLI access to the CPAN mirrors
+
+=item CPANPLUS::Dist::Base
+
+Base class for custom distribution classes
+
+=item CPANPLUS::Dist::Build
+
+CPANPLUS plugin to install packages that use Build.PL
+
+=item CPANPLUS::Dist::Build::Constants
+
+Constants for CPANPLUS::Dist::Build
+
+=item CPANPLUS::Dist::Sample
+
+Sample code to create your own Dist::* plugin
+
+=item CPANPLUS::Internals::Source::Memory
+
+In memory implementation
+
+=item CPANPLUS::Internals::Source::SQLite
+
+SQLite implementation
+
+=item CPANPLUS::Shell::Classic
+
+CPAN.pm emulation for CPANPLUS
+
+=item CPANPLUS::Shell::Default::Plugins::HOWTO
+
+Documentation on how to write your own plugins
+
+=item Carp
+
+Warn of errors (from perspective of caller)
+
+=item Carp::Heavy
+
+Heavy machinery, no user serviceable parts inside
+
+=item Class::ISA
+
+Report the search path for a class's ISA tree
+
+=item Class::Struct
+
+Declare struct-like datatypes as Perl classes
+
+=item Compress::Raw::Bzip2
+
+Low-Level Interface to bzip2 compression library
+
+=item Compress::Raw::Bzip2::FAQ
+
+Frequently Asked Questions about Compress::Raw::Bzip2
+
+=item Compress::Raw::Zlib
+
+Low-Level Interface to zlib compression library
+
+=item Compress::Raw::Zlib::FAQ
+
+Frequently Asked Questions about Compress::Raw::Zlib
+
+=item Compress::Zlib
+
+Interface to zlib compression library
+
+=item Config
+
+Access Perl configuration information
+
+=item Cwd
+
+Get pathname of current working directory
+
+=item DB
+
+Programmatic interface to the Perl debugging API
+
+=item DBM_Filter
+
+Filter DBM keys/values
+
+=item DBM_Filter::compress
+
+Filter for DBM_Filter
+
+=item DBM_Filter::encode
+
+Filter for DBM_Filter
+
+=item DBM_Filter::int32
+
+Filter for DBM_Filter
+
+=item DBM_Filter::null
+
+Filter for DBM_Filter
+
+=item DBM_Filter::utf8
+
+Filter for DBM_Filter
+
+=item DB_File
+
+Perl5 access to Berkeley DB version 1.x
+
+=item Data::Dumper
+
+Stringified perl data structures, suitable for both printing and C<eval>
+
+=item Devel::DProf
+
+A Perl code profiler
+
+=item Devel::InnerPackage
+
+Find all the inner packages of a package
+
+=item Devel::PPPort
+
+Perl/Pollution/Portability
+
+=item Devel::Peek
+
+A data debugging tool for the XS programmer
+
+=item Devel::SelfStubber
+
+Generate stubs for a SelfLoading module
+
+=item Digest
+
+Modules that calculate message digests
+
+=item Digest::MD5
+
+Perl interface to the MD5 Algorithm
+
+=item Digest::SHA
+
+Perl extension for SHA-1/224/256/384/512
+
+=item Digest::base
+
+Digest base class
+
+=item Digest::file
+
+Calculate digests of files
+
+=item DirHandle
+
+Supply object methods for directory handles
+
+=item Dumpvalue
+
+Provides screen dump of Perl data.
+
+=item DynaLoader
+
+Dynamically load C libraries into Perl code
+
+=item Encode
+
+Character encodings
+
+=item Encode::Alias
+
+Alias definitions to encodings
+
+=item Encode::Byte
+
+Single Byte Encodings
+
+=item Encode::CJKConstants
+
+Internally used by Encode::??::ISO_2022_*
+
+=item Encode::CN
+
+China-based Chinese Encodings
+
+=item Encode::CN::HZ
+
+Internally used by Encode::CN
+
+=item Encode::Config
+
+Internally used by Encode
+
+=item Encode::EBCDIC
+
+EBCDIC Encodings
+
+=item Encode::Encoder
+
+Object Oriented Encoder
+
+=item Encode::Encoding
+
+Encode Implementation Base Class
+
+=item Encode::GSM0338
+
+ESTI GSM 03.38 Encoding
+
+=item Encode::Guess
+
+Guesses encoding from data
+
+=item Encode::JP
+
+Japanese Encodings
+
+=item Encode::JP::H2Z
+
+Internally used by Encode::JP::2022_JP*
+
+=item Encode::JP::JIS7
+
+Internally used by Encode::JP
+
+=item Encode::KR
+
+Korean Encodings
+
+=item Encode::KR::2022_KR
+
+Internally used by Encode::KR
+
+=item Encode::MIME::Header
+
+MIME 'B' and 'Q' header encoding
+
+=item Encode::MIME::Name
+
+Internally used by Encode
+
+=item Encode::PerlIO
+
+A detailed document on Encode and PerlIO
+
+=item Encode::Supported
+
+Encodings supported by Encode
+
+=item Encode::Symbol
+
+Symbol Encodings
+
+=item Encode::TW
+
+Taiwan-based Chinese Encodings
+
+=item Encode::Unicode
+
+Various Unicode Transformation Formats
+
+=item Encode::Unicode::UTF7
+
+UTF-7 encoding
+
+=item English
+
+Use nice English (or awk) names for ugly punctuation variables
+
+=item Env
+
+Perl module that imports environment variables as scalars or arrays
+
+=item Errno
+
+System errno constants
+
+=item Exporter
+
+Implements default import method for modules
+
+=item Exporter::Heavy
+
+Exporter guts
+
+=item ExtUtils::CBuilder
+
+Compile and link C code for Perl modules
+
+=item ExtUtils::CBuilder::Platform::Windows
+
+Builder class for Windows platforms
+
+=item ExtUtils::Command
+
+Utilities to replace common UNIX commands in Makefiles etc.
+
+=item ExtUtils::Command::MM
+
+Commands for the MM's to use in Makefiles
+
+=item ExtUtils::Constant
+
+Generate XS code to import C header constants
+
+=item ExtUtils::Constant::Base
+
+Base class for ExtUtils::Constant objects
+
+=item ExtUtils::Constant::Utils
+
+Helper functions for ExtUtils::Constant
+
+=item ExtUtils::Constant::XS
+
+Generate C code for XS modules' constants.
+
+=item ExtUtils::Embed
+
+Utilities for embedding Perl in C/C++ applications
+
+=item ExtUtils::Install
+
+Install files from here to there
+
+=item ExtUtils::Installed
+
+Inventory management of installed modules
+
+=item ExtUtils::Liblist
+
+Determine libraries to use and how to use them
+
+=item ExtUtils::MM
+
+OS adjusted ExtUtils::MakeMaker subclass
+
+=item ExtUtils::MM_AIX
+
+AIX specific subclass of ExtUtils::MM_Unix
+
+=item ExtUtils::MM_Any
+
+Platform-agnostic MM methods
+
+=item ExtUtils::MM_BeOS
+
+Methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_Cygwin
+
+Methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_DOS
+
+DOS specific subclass of ExtUtils::MM_Unix
+
+=item ExtUtils::MM_Darwin
+
+Special behaviors for OS X
+
+=item ExtUtils::MM_MacOS
+
+Once produced Makefiles for MacOS Classic
+
+=item ExtUtils::MM_NW5
+
+Methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_OS2
+
+Methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_QNX
+
+QNX specific subclass of ExtUtils::MM_Unix
+
+=item ExtUtils::MM_UWIN
+
+U/WIN specific subclass of ExtUtils::MM_Unix
+
+=item ExtUtils::MM_Unix
+
+Methods used by ExtUtils::MakeMaker
+
+=item ExtUtils::MM_VMS
+
+Methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_VOS
+
+VOS specific subclass of ExtUtils::MM_Unix
+
+=item ExtUtils::MM_Win32
+
+Methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_Win95
+
+Method to customize MakeMaker for Win9X
+
+=item ExtUtils::MY
+
+ExtUtils::MakeMaker subclass for customization
+
+=item ExtUtils::MakeMaker
+
+Create a module Makefile
+
+=item ExtUtils::MakeMaker::Config
+
+Wrapper around Config.pm
+
+=item ExtUtils::MakeMaker::FAQ
+
+Frequently Asked Questions About MakeMaker
+
+=item ExtUtils::MakeMaker::Tutorial
+
+Writing a module with MakeMaker
+
+=item ExtUtils::Manifest
+
+Utilities to write and check a MANIFEST file
+
+=item ExtUtils::Mkbootstrap
+
+Make a bootstrap file for use by DynaLoader
+
+=item ExtUtils::Mksymlists
+
+Write linker options files for dynamic extension
+
+=item ExtUtils::Packlist
+
+Manage .packlist files
+
+=item ExtUtils::ParseXS
+
+Converts Perl XS code into C code
+
+=item ExtUtils::XSSymSet
+
+Keep sets of symbol names palatable to the VMS linker
+
+=item ExtUtils::testlib
+
+Add blib/* directories to @INC
+
+=item Fatal
+
+Replace functions with equivalents which succeed or die
+
+=item Fcntl
+
+Load the C Fcntl.h defines
+
+=item File::Basename
+
+Parse file paths into directory, filename and suffix.
+
+=item File::CheckTree
+
+Run many filetest checks on a tree
+
+=item File::Compare
+
+Compare files or filehandles
+
+=item File::Copy
+
+Copy files or filehandles
+
+=item File::DosGlob
+
+DOS like globbing and then some
+
+=item File::Fetch
+
+A generic file fetching mechanism
+
+=item File::Find
+
+Traverse a directory tree.
+
+=item File::Glob
+
+Perl extension for BSD glob routine
+
+=item File::GlobMapper
+
+Extend File Glob to Allow Input and Output Files
+
+=item File::Path
+
+Create or remove directory trees
+
+=item File::Spec
+
+Portably perform operations on file names
+
+=item File::Spec::Cygwin
+
+Methods for Cygwin file specs
+
+=item File::Spec::Epoc
+
+Methods for Epoc file specs
+
+=item File::Spec::Functions
+
+Portably perform operations on file names
+
+=item File::Spec::Mac
+
+File::Spec for Mac OS (Classic)
+
+=item File::Spec::OS2
+
+Methods for OS/2 file specs
+
+=item File::Spec::Unix
+
+File::Spec for Unix, base for other File::Spec modules
+
+=item File::Spec::VMS
+
+Methods for VMS file specs
+
+=item File::Spec::Win32
+
+Methods for Win32 file specs
+
+=item File::Temp
+
+Return name and handle of a temporary file safely
+
+=item File::stat
+
+By-name interface to Perl's built-in stat() functions
+
+=item FileCache
+
+Keep more files open than the system permits
+
+=item FileHandle
+
+Supply object methods for filehandles
+
+=item Filter::Simple
+
+Simplified source filtering
+
+=item Filter::Util::Call
+
+Perl Source Filter Utility Module
+
+=item FindBin
+
+Locate directory of original perl script
+
+=item GDBM_File
+
+Perl5 access to the gdbm library.
+
+=item Getopt::Long
+
+Extended processing of command line options
+
+=item Getopt::Std
+
+Process single-character switches with switch clustering
+
+=item Hash::Util
+
+A selection of general-utility hash subroutines
+
+=item Hash::Util::FieldHash
+
+Support for Inside-Out Classes
+
+=item I18N::Collate
+
+Compare 8-bit scalar data according to the current locale
+
+=item I18N::LangTags
+
+Functions for dealing with RFC3066-style language tags
+
+=item I18N::LangTags::Detect
+
+Detect the user's language preferences
+
+=item I18N::LangTags::List
+
+Tags and names for human languages
+
+=item I18N::Langinfo
+
+Query locale information
+
+=item IO
+
+Load various IO modules
+
+=item IO::Compress::Base
+
+Base Class for IO::Compress modules
+
+=item IO::Compress::Bzip2
+
+Write bzip2 files/buffers
+
+=item IO::Compress::Deflate
+
+Write RFC 1950 files/buffers
+
+=item IO::Compress::FAQ
+
+Frequently Asked Questions about IO::Compress
+
+=item IO::Compress::Gzip
+
+Write RFC 1952 files/buffers
+
+=item IO::Compress::RawDeflate
+
+Write RFC 1951 files/buffers
+
+=item IO::Compress::Zip
+
+Write zip files/buffers
+
+=item IO::Dir
+
+Supply object methods for directory handles
+
+=item IO::File
+
+Supply object methods for filehandles
+
+=item IO::Handle
+
+Supply object methods for I/O handles
+
+=item IO::Pipe
+
+Supply object methods for pipes
+
+=item IO::Poll
+
+Object interface to system poll call
+
+=item IO::Seekable
+
+Supply seek based methods for I/O objects
+
+=item IO::Select
+
+OO interface to the select system call
+
+=item IO::Socket
+
+Object interface to socket communications
+
+=item IO::Socket::INET
+
+Object interface for AF_INET domain sockets
+
+=item IO::Socket::UNIX
+
+Object interface for AF_UNIX domain sockets
+
+=item IO::Uncompress::AnyInflate
+
+Uncompress zlib-based (zip, gzip) file/buffer
+
+=item IO::Uncompress::AnyUncompress
+
+Uncompress gzip, zip, bzip2 or lzop file/buffer
+
+=item IO::Uncompress::Base
+
+Base Class for IO::Uncompress modules
+
+=item IO::Uncompress::Bunzip2
+
+Read bzip2 files/buffers
+
+=item IO::Uncompress::Gunzip
+
+Read RFC 1952 files/buffers
+
+=item IO::Uncompress::Inflate
+
+Read RFC 1950 files/buffers
+
+=item IO::Uncompress::RawInflate
+
+Read RFC 1951 files/buffers
+
+=item IO::Uncompress::Unzip
+
+Read zip files/buffers
+
+=item IO::Zlib
+
+IO:: style interface to L<Compress::Zlib>
+
+=item IPC::Cmd
+
+Finding and running system commands made easy
+
+=item IPC::Msg
+
+SysV Msg IPC object class
+
+=item IPC::Open2
+
+Open a process for both reading and writing
+
+=item IPC::Open3
+
+Open a process for reading, writing, and error handling
+
+=item IPC::Semaphore
+
+SysV Semaphore IPC object class
+
+=item IPC::SharedMem
+
+SysV Shared Memory IPC object class
+
+=item IPC::SysV
+
+System V IPC constants and system calls
+
+=item List::Util
+
+A selection of general-utility list subroutines
+
+=item List::Util::XS
+
+Indicate if List::Util was compiled with a C compiler
+
+=item Locale::Constants
+
+Constants for Locale codes
+
+=item Locale::Country
+
+ISO codes for country identification (ISO 3166)
+
+=item Locale::Currency
+
+ISO three letter codes for currency identification (ISO 4217)
+
+=item Locale::Language
+
+ISO two letter codes for language identification (ISO 639)
+
+=item Locale::Maketext
+
+Framework for localization
+
+=item Locale::Maketext::Simple
+
+Simple interface to Locale::Maketext::Lexicon
+
+=item Locale::Maketext::TPJ13
+
+Article about software localization
+
+=item Locale::Script
+
+ISO codes for script identification (ISO 15924)
+
+=item Log::Message
+
+A generic message storing mechanism;
+
+=item Log::Message::Config
+
+Configuration options for Log::Message
+
+=item Log::Message::Handlers
+
+Message handlers for Log::Message
+
+=item Log::Message::Item
+
+Message objects for Log::Message
+
+=item MIME::Base64
+
+Encoding and decoding of base64 strings
+
+=item MIME::QuotedPrint
+
+Encoding and decoding of quoted-printable strings
+
+=item Math::BigFloat
+
+Arbitrary size floating point math package
+
+=item Math::BigInt
+
+Arbitrary size integer/float math package
+
+=item Math::BigInt::Calc
+
+Pure Perl module to support Math::BigInt
+
+=item Math::BigInt::CalcEmu
+
+Emulate low-level math with BigInt code
+
+=item Math::BigInt::FastCalc
+
+Math::BigInt::Calc with some XS for more speed
+
+=item Math::BigRat
+
+Arbitrary big rational numbers
+
+=item Math::Complex
+
+Complex numbers and associated mathematical functions
+
+=item Math::Trig
+
+Trigonometric functions
+
+=item Memoize
+
+Make functions faster by trading space for time
+
+=item Memoize::AnyDBM_File
+
+Glue to provide EXISTS for AnyDBM_File for Storable use
+
+=item Memoize::Expire
+
+Plug-in module for automatic expiration of memoized values
+
+=item Memoize::ExpireFile
+
+Test for Memoize expiration semantics
+
+=item Memoize::ExpireTest
+
+Test for Memoize expiration semantics
+
+=item Memoize::NDBM_File
+
+Glue to provide EXISTS for NDBM_File for Storable use
+
+=item Memoize::SDBM_File
+
+Glue to provide EXISTS for SDBM_File for Storable use
+
+=item Memoize::Storable
+
+Store Memoized data in Storable database
+
+=item Module::Build
+
+Build and install Perl modules
+
+=item Module::Build::API
+
+API Reference for Module Authors
+
+=item Module::Build::Authoring
+
+Authoring Module::Build modules
+
+=item Module::Build::Base
+
+Default methods for Module::Build
+
+=item Module::Build::Compat
+
+Compatibility with ExtUtils::MakeMaker
+
+=item Module::Build::ConfigData
+
+Configuration for Module::Build
+
+=item Module::Build::Cookbook
+
+Examples of Module::Build Usage
+
+=item Module::Build::ModuleInfo
+
+Gather package and POD information from a perl module file
+
+=item Module::Build::Notes
+
+Configuration for $module_name
+
+=item Module::Build::PPMMaker
+
+Perl Package Manager file creation
+
+=item Module::Build::Platform::Amiga
+
+Builder class for Amiga platforms
+
+=item Module::Build::Platform::Default
+
+Stub class for unknown platforms
+
+=item Module::Build::Platform::EBCDIC
+
+Builder class for EBCDIC platforms
+
+=item Module::Build::Platform::MPEiX
+
+Builder class for MPEiX platforms
+
+=item Module::Build::Platform::MacOS
+
+Builder class for MacOS platforms
+
+=item Module::Build::Platform::RiscOS
+
+Builder class for RiscOS platforms
+
+=item Module::Build::Platform::Unix
+
+Builder class for Unix platforms
+
+=item Module::Build::Platform::VMS
+
+Builder class for VMS platforms
+
+=item Module::Build::Platform::VOS
+
+Builder class for VOS platforms
+
+=item Module::Build::Platform::Windows
+
+Builder class for Windows platforms
+
+=item Module::Build::Platform::aix
+
+Builder class for AIX platform
+
+=item Module::Build::Platform::cygwin
+
+Builder class for Cygwin platform
+
+=item Module::Build::Platform::darwin
+
+Builder class for Mac OS X platform
+
+=item Module::Build::Platform::os2
+
+Builder class for OS/2 platform
+
+=item Module::Build::YAML
+
+Provides just enough YAML support so that Module::Build works even if YAML.pm is not installed
+
+=item Module::CoreList
+
+What modules shipped with versions of perl
+
+=item Module::Load
+
+Runtime require of both modules and files
+
+=item Module::Load::Conditional
+
+Looking up module information / loading at runtime
+
+=item Module::Loaded
+
+Mark modules as loaded or unloaded
+
+=item Module::Pluggable
+
+Automatically give your module the ability to have plugins
+
+=item Module::Pluggable::Object
+
+Automatically give your module the ability to have plugins
+
+=item NDBM_File
+
+Tied access to ndbm files
+
+=item NEXT
+
+Provide a pseudo-class NEXT (et al) that allows method redispatch
+
+=item Net::Cmd
+
+Network Command class (as used by FTP, SMTP etc)
+
+=item Net::Config
+
+Local configuration data for libnet
+
+=item Net::Domain
+
+Attempt to evaluate the current host's internet name and domain
+
+=item Net::FTP
+
+FTP Client class
+
+=item Net::NNTP
+
+NNTP Client class
+
+=item Net::Netrc
+
+OO interface to users netrc file
+
+=item Net::POP3
+
+Post Office Protocol 3 Client class (RFC1939)
+
+=item Net::Ping
+
+Check a remote host for reachability
+
+=item Net::SMTP
+
+Simple Mail Transfer Protocol Client
+
+=item Net::Time
+
+Time and daytime network client interface
+
+=item Net::hostent
+
+By-name interface to Perl's built-in gethost*() functions
+
+=item Net::libnetFAQ
+
+Libnet Frequently Asked Questions
+
+=item Net::netent
+
+By-name interface to Perl's built-in getnet*() functions
+
+=item Net::protoent
+
+By-name interface to Perl's built-in getproto*() functions
+
+=item Net::servent
+
+By-name interface to Perl's built-in getserv*() functions
+
+=item O
+
+Generic interface to Perl Compiler backends
+
+=item ODBM_File
+
+Tied access to odbm files
+
+=item Opcode
+
+Disable named opcodes when compiling perl code
+
+=item POSIX
+
+Perl interface to IEEE Std 1003.1
+
+=item Package::Constants
+
+List all constants declared in a package
+
+=item Params::Check
+
+A generic input parsing/checking mechanism.
+
+=item Parse::CPAN::Meta
+
+Parse META.yml and other similar CPAN metadata files
+
+=item PerlIO
+
+On demand loader for PerlIO layers and root of PerlIO::* name space
+
+=item PerlIO::encoding
+
+Encoding layer
+
+=item PerlIO::scalar
+
+In-memory IO, scalar IO
+
+=item PerlIO::via
+
+Helper class for PerlIO layers implemented in perl
+
+=item PerlIO::via::QuotedPrint
+
+PerlIO layer for quoted-printable strings
+
+=item Pod::Checker
+
+Check pod documents for syntax errors
+
+=item Pod::Escapes
+
+For resolving Pod EE<lt>...E<gt> sequences
+
+=item Pod::Find
+
+Find POD documents in directory trees
+
+=item Pod::Functions
+
+Group Perl's functions a la perlfunc.pod
+
+=item Pod::Html
+
+Module to convert pod files to HTML
+
+=item Pod::InputObjects
+
+Objects representing POD input paragraphs, commands, etc.
+
+=item Pod::LaTeX
+
+Convert Pod data to formatted Latex
+
+=item Pod::Man
+
+Convert POD data to formatted *roff input
+
+=item Pod::ParseLink
+
+Parse an LE<lt>E<gt> formatting code in POD text
+
+=item Pod::ParseUtils
+
+Helpers for POD parsing and conversion
+
+=item Pod::Parser
+
+Base class for creating POD filters and translators
+
+=item Pod::Perldoc::ToChecker
+
+Let Perldoc check Pod for errors
+
+=item Pod::Perldoc::ToMan
+
+Let Perldoc render Pod as man pages
+
+=item Pod::Perldoc::ToNroff
+
+Let Perldoc convert Pod to nroff
+
+=item Pod::Perldoc::ToPod
+
+Let Perldoc render Pod as ... Pod!
+
+=item Pod::Perldoc::ToRtf
+
+Let Perldoc render Pod as RTF
+
+=item Pod::Perldoc::ToText
+
+Let Perldoc render Pod as plaintext
+
+=item Pod::Perldoc::ToTk
+
+Let Perldoc use Tk::Pod to render Pod
+
+=item Pod::Perldoc::ToXml
+
+Let Perldoc render Pod as XML
+
+=item Pod::PlainText
+
+Convert POD data to formatted ASCII text
+
+=item Pod::Plainer
+
+Perl extension for converting Pod to old style Pod.
+
+=item Pod::Select
+
+Extract selected sections of POD from input
+
+=item Pod::Simple
+
+Framework for parsing Pod
+
+=item Pod::Simple::Checker
+
+Check the Pod syntax of a document
+
+=item Pod::Simple::Debug
+
+Put Pod::Simple into trace/debug mode
+
+=item Pod::Simple::DumpAsText
+
+Dump Pod-parsing events as text
+
+=item Pod::Simple::DumpAsXML
+
+Turn Pod into XML
+
+=item Pod::Simple::HTML
+
+Convert Pod to HTML
+
+=item Pod::Simple::HTMLBatch
+
+Convert several Pod files to several HTML files
+
+=item Pod::Simple::LinkSection
+
+Represent "section" attributes of L codes
+
+=item Pod::Simple::Methody
+
+Turn Pod::Simple events into method calls
+
+=item Pod::Simple::PullParser
+
+A pull-parser interface to parsing Pod
+
+=item Pod::Simple::PullParserEndToken
+
+End-tokens from Pod::Simple::PullParser
+
+=item Pod::Simple::PullParserStartToken
+
+Start-tokens from Pod::Simple::PullParser
+
+=item Pod::Simple::PullParserTextToken
+
+Text-tokens from Pod::Simple::PullParser
+
+=item Pod::Simple::PullParserToken
+
+Tokens from Pod::Simple::PullParser
+
+=item Pod::Simple::RTF
+
+Format Pod as RTF
+
+=item Pod::Simple::Search
+
+Find POD documents in directory trees
+
+=item Pod::Simple::SimpleTree
+
+Parse Pod into a simple parse tree
+
+=item Pod::Simple::Subclassing
+
+Write a formatter as a Pod::Simple subclass
+
+=item Pod::Simple::Text
+
+Format Pod as plaintext
+
+=item Pod::Simple::TextContent
+
+Get the text content of Pod
+
+=item Pod::Simple::XHTML
+
+Format Pod as validating XHTML
+
+=item Pod::Simple::XMLOutStream
+
+Turn Pod into XML
+
+=item Pod::Text
+
+Convert POD data to formatted ASCII text
+
+=item Pod::Text::Color
+
+Convert POD data to formatted color ASCII text
+
+=item Pod::Text::Termcap
+
+Convert POD data to ASCII text with format escapes
+
+=item Pod::Usage
+
+Print a usage message from embedded pod documentation
+
+=item SDBM_File
+
+Tied access to sdbm files
+
+=item Safe
+
+Compile and execute code in restricted compartments
+
+=item Scalar::Util
+
+A selection of general-utility scalar subroutines
+
+=item Search::Dict
+
+Search for key in dictionary file
+
+=item SelectSaver
+
+Save and restore selected file handle
+
+=item SelfLoader
+
+Load functions only on demand
+
+=item Shell
+
+Run shell commands transparently within perl
+
+=item Socket
+
+Load the C socket.h defines and structure manipulators
+
+=item Storable
+
+Persistence for Perl data structures
+
+=item Switch
+
+A switch statement for Perl
+
+=item Symbol
+
+Manipulate Perl symbols and their names
+
+=item Sys::Hostname
+
+Try every conceivable way to get hostname
+
+=item Sys::Syslog
+
+Perl interface to the UNIX syslog(3) calls
+
+=item Sys::Syslog::Win32
+
+Win32 support for Sys::Syslog
+
+=item TAP::Base
+
+Base class that provides common functionality to L<TAP::Parser>
+
+=item TAP::Formatter::Color
+
+Run Perl test scripts with color
+
+=item TAP::Formatter::Console
+
+Harness output delegate for default console output
+
+=item TAP::Formatter::Console
+
+Harness output delegate for default console output
+
+=item TAP::Formatter::Console::ParallelSession
+
+Harness output delegate for parallel console output
+
+=item TAP::Formatter::Console::Session
+
+Harness output delegate for default console output
+
+=item TAP::Formatter::File
+
+Harness output delegate for file output
+
+=item TAP::Formatter::File::Session
+
+Harness output delegate for file output
+
+=item TAP::Formatter::Session
+
+Abstract base class for harness output delegate
+
+=item TAP::Harness
+
+Run test scripts with statistics
+
+=item TAP::Object
+
+Base class that provides common functionality to all C<TAP::*> modules
+
+=item TAP::Parser
+
+Parse L<TAP|Test::Harness::TAP> output
+
+=item TAP::Parser::Aggregator
+
+Aggregate TAP::Parser results
+
+=item TAP::Parser::Grammar
+
+A grammar for the Test Anything Protocol.
+
+=item TAP::Parser::Iterator
+
+Internal base class for TAP::Parser Iterators
+
+=item TAP::Parser::Iterator::Array
+
+Internal TAP::Parser array Iterator
+
+=item TAP::Parser::Iterator::Process
+
+Internal TAP::Parser Iterator
+
+=item TAP::Parser::Iterator::Stream
+
+Internal TAP::Parser Iterator
+
+=item TAP::Parser::IteratorFactory
+
+Internal TAP::Parser Iterator
+
+=item TAP::Parser::Multiplexer
+
+Multiplex multiple TAP::Parsers
+
+=item TAP::Parser::Result
+
+Base class for TAP::Parser output objects
+
+=item TAP::Parser::Result::Bailout
+
+Bailout result token.
+
+=item TAP::Parser::Result::Comment
+
+Comment result token.
+
+=item TAP::Parser::Result::Plan
+
+Plan result token.
+
+=item TAP::Parser::Result::Pragma
+
+TAP pragma token.
+
+=item TAP::Parser::Result::Test
+
+Test result token.
+
+=item TAP::Parser::Result::Unknown
+
+Unknown result token.
+
+=item TAP::Parser::Result::Version
+
+TAP syntax version token.
+
+=item TAP::Parser::Result::YAML
+
+YAML result token.
+
+=item TAP::Parser::ResultFactory
+
+Factory for creating TAP::Parser output objects
+
+=item TAP::Parser::Scheduler
+
+Schedule tests during parallel testing
+
+=item TAP::Parser::Scheduler::Job
+
+A single testing job.
+
+=item TAP::Parser::Scheduler::Spinner
+
+A no-op job.
+
+=item TAP::Parser::Source
+
+Stream output from some source
+
+=item TAP::Parser::Source::Perl
+
+Stream Perl output
+
+=item TAP::Parser::Utils
+
+Internal TAP::Parser utilities
+
+=item TAP::Parser::YAMLish::Reader
+
+Read YAMLish data from iterator
+
+=item TAP::Parser::YAMLish::Writer
+
+Write YAMLish data
+
+=item Term::ANSIColor
+
+Color screen output using ANSI escape sequences
+
+=item Term::Cap
+
+Perl termcap interface
+
+=item Term::Complete
+
+Perl word completion module
+
+=item Term::ReadLine
+
+Perl interface to various C<readline> packages.
+
+=item Term::UI
+
+Term::ReadLine UI made easy
+
+=item Test
+
+Provides a simple framework for writing test scripts
+
+=item Test::Builder
+
+Backend for building test libraries
+
+=item Test::Builder::Module
+
+Base class for test modules
+
+=item Test::Builder::Tester
+
+Test testsuites that have been built with
+
+=item Test::Builder::Tester::Color
+
+Turn on colour in Test::Builder::Tester
+
+=item Test::Harness
+
+Run Perl standard test scripts with statistics
+
+=item Test::More
+
+Yet another framework for writing test scripts
+
+=item Test::Simple
+
+Basic utilities for writing tests.
+
+=item Test::Tutorial
+
+A tutorial about writing really basic tests
+
+=item Text::Abbrev
+
+Create an abbreviation table from a list
+
+=item Text::Balanced
+
+Extract delimited text sequences from strings.
+
+=item Text::ParseWords
+
+Parse text into an array of tokens or array of arrays
+
+=item Text::Soundex
+
+Implementation of the soundex algorithm.
+
+=item Text::Tabs
+
+Expand and unexpand tabs per the unix expand(1) and unexpand(1)
+
+=item Text::Wrap
+
+Line wrapping to form simple paragraphs
+
+=item Thread
+
+Manipulate threads in Perl (for old code only)
+
+=item Thread::Queue
+
+Thread-safe queues
+
+=item Thread::Semaphore
+
+Thread-safe semaphores
+
+=item Tie::Array
+
+Base class for tied arrays
+
+=item Tie::File
+
+Access the lines of a disk file via a Perl array
+
+=item Tie::Handle
+
+Base class definitions for tied handles
+
+=item Tie::Hash
+
+Base class definitions for tied hashes
+
+=item Tie::Hash::NamedCapture
+
+Named regexp capture buffers
+
+=item Tie::Memoize
+
+Add data to hash when needed
+
+=item Tie::RefHash
+
+Use references as hash keys
+
+=item Tie::Scalar
+
+Base class definitions for tied scalars
+
+=item Tie::StdHandle
+
+Base class definitions for tied handles
+
+=item Tie::SubstrHash
+
+Fixed-table-size, fixed-key-length hashing
+
+=item Time::HiRes
+
+High resolution alarm, sleep, gettimeofday, interval timers
+
+=item Time::Local
+
+Efficiently compute time from local and GMT time
+
+=item Time::Piece
+
+Object Oriented time objects
+
+=item Time::Seconds
+
+A simple API to convert seconds to other date values
+
+=item Time::gmtime
+
+By-name interface to Perl's built-in gmtime() function
+
+=item Time::localtime
+
+By-name interface to Perl's built-in localtime() function
+
+=item Time::tm
+
+Internal object used by Time::gmtime and Time::localtime
+
+=item UNIVERSAL
+
+Base class for ALL classes (blessed references)
+
+=item Unicode::Collate
+
+Unicode Collation Algorithm
+
+=item Unicode::Normalize
+
+Unicode Normalization Forms
+
+=item Unicode::UCD
+
+Unicode character database
+
+=item User::grent
+
+By-name interface to Perl's built-in getgr*() functions
+
+=item User::pwent
+
+By-name interface to Perl's built-in getpw*() functions
+
+=item Win32
+
+Interfaces to some Win32 API Functions
+
+=item Win32API::File
+
+Low-level access to Win32 system API calls for files/dirs.
+
+=item Win32CORE
+
+Win32 CORE function stubs
+
+=item XS::APItest
+
+Test the perl C API
+
+=item XS::Typemap
+
+Module to test the XS typemaps distributed with perl
+
+=item XSLoader
+
+Dynamically load C libraries into Perl code
+
+=item version::Internal
+
+Perl extension for Version Objects
+
+=back
+
+To find out I<all> modules installed on your system, including
+those without documentation or outside the standard release,
+just use the following command (under the default win32 shell,
+double quotes should be used instead of single quotes).
+
+ % perl -MFile::Find=find -MFile::Spec::Functions -Tlwe \
+ 'find { wanted => sub { print canonpath $_ if /\.pm\z/ },
+ no_chdir => 1 }, @INC'
+
+(The -T is here to prevent '.' from being listed in @INC.)
+They should all have their own documentation installed and accessible
+via your system man(1) command. If you do not have a B<find>
+program, you can use the Perl B<find2perl> program instead, which
+generates Perl code as output you can run through perl. If you
+have a B<man> program but it doesn't find your modules, you'll have
+to fix your manpath. See L<perl> for details. If you have no
+system B<man> command, you might try the B<perldoc> program.
+
+Note also that the command C<perldoc perllocal> gives you a (possibly
+incomplete) list of the modules that have been further installed on
+your system. (The perllocal.pod file is updated by the standard MakeMaker
+install process.)
+
+=head2 Extension Modules
+
+Extension modules are written in C (or a mix of Perl and C). They
+are usually dynamically loaded into Perl if and when you need them,
+but may also be linked in statically. Supported extension modules
+include Socket, Fcntl, and POSIX.
+
+Many popular C extension modules do not come bundled (at least, not
+completely) due to their sizes, volatility, or simply lack of time
+for adequate testing and configuration across the multitude of
+platforms on which Perl was beta-tested. You are encouraged to
+look for them on CPAN (described below), or using web search engines
+like Alta Vista or Google.
+
+=head1 CPAN
+
+CPAN stands for Comprehensive Perl Archive Network; it's a globally
+replicated trove of Perl materials, including documentation, style
+guides, tricks and traps, alternate ports to non-Unix systems and
+occasional binary distributions for these. Search engines for
+CPAN can be found at http://www.cpan.org/
+
+Most importantly, CPAN includes around a thousand unbundled modules,
+some of which require a C compiler to build. Major categories of
+modules are:
+
+=over
+
+=item *
+
+Language Extensions and Documentation Tools
+
+=item *
+
+Development Support
+
+=item *
+
+Operating System Interfaces
+
+=item *
+
+Networking, Device Control (modems) and InterProcess Communication
+
+=item *
+
+Data Types and Data Type Utilities
+
+=item *
+
+Database Interfaces
+
+=item *
+
+User Interfaces
+
+=item *
+
+Interfaces to / Emulations of Other Programming Languages
+
+=item *
+
+File Names, File Systems and File Locking (see also File Handles)
+
+=item *
+
+String Processing, Language Text Processing, Parsing, and Searching
+
+=item *
+
+Option, Argument, Parameter, and Configuration File Processing
+
+=item *
+
+Internationalization and Locale
+
+=item *
+
+Authentication, Security, and Encryption
+
+=item *
+
+World Wide Web, HTML, HTTP, CGI, MIME
+
+=item *
+
+Server and Daemon Utilities
+
+=item *
+
+Archiving and Compression
+
+=item *
+
+Images, Pixmap and Bitmap Manipulation, Drawing, and Graphing
+
+=item *
+
+Mail and Usenet News
+
+=item *
+
+Control Flow Utilities (callbacks and exceptions etc)
+
+=item *
+
+File Handle and Input/Output Stream Utilities
+
+=item *
+
+Miscellaneous Modules
+
+=back
+
+The list of the registered CPAN sites as of this writing follows.
+Please note that the sorting order is alphabetical on fields:
+
+Continent
+ |
+ |-->Country
+ |
+ |-->[state/province]
+ |
+ |-->ftp
+ |
+ |-->[http]
+
+and thus the North American servers happen to be listed between the
+European and the South American sites.
+
+You should try to choose one close to you.
+
+=head2 Africa
+
+=over 4
+
+=item South Africa
+
+ http://ftp.rucus.ru.ac.za/pub/perl/CPAN/
+ ftp://ftp.rucus.ru.ac.za/pub/perl/CPAN/
+ ftp://ftp.is.co.za/programming/perl/CPAN/
+ ftp://ftp.saix.net/pub/CPAN/
+ ftp://ftp.sun.ac.za/CPAN/CPAN/
+
+=back
+
+=head2 Asia
+
+=over 4
+
+=item China
+
+ http://cpan.linuxforum.net/
+ http://cpan.shellhung.org/
+ ftp://ftp.shellhung.org/pub/CPAN
+ ftp://mirrors.hknet.com/CPAN
+
+=item Indonesia
+
+ http://mirrors.tf.itb.ac.id/cpan/
+ http://cpan.cbn.net.id/
+ ftp://ftp.cbn.net.id/mirror/CPAN
+
+=item Israel
+
+ ftp://ftp.iglu.org.il/pub/CPAN/
+ http://cpan.lerner.co.il/
+ http://bioinfo.weizmann.ac.il/pub/software/perl/CPAN/
+ ftp://bioinfo.weizmann.ac.il/pub/software/perl/CPAN/
+
+=item Japan
+
+ ftp://ftp.u-aizu.ac.jp/pub/CPAN
+ ftp://ftp.kddlabs.co.jp/CPAN/
+ ftp://ftp.ayamura.org/pub/CPAN/
+ ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/
+ http://ftp.cpan.jp/
+ ftp://ftp.cpan.jp/CPAN/
+ ftp://ftp.dti.ad.jp/pub/lang/CPAN/
+ ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/
+
+=item Malaysia
+
+ http://cpan.MyBSD.org.my
+ http://mirror.leafbug.org/pub/CPAN
+ http://ossig.mncc.com.my/mirror/pub/CPAN
+
+=item Russian Federation
+
+ http://cpan.tomsk.ru
+ ftp://cpan.tomsk.ru/
+
+=item Saudi Arabia
+
+ ftp://ftp.isu.net.sa/pub/CPAN/
+
+=item Singapore
+
+ http://CPAN.en.com.sg/
+ ftp://cpan.en.com.sg/
+ http://mirror.averse.net/pub/CPAN
+ ftp://mirror.averse.net/pub/CPAN
+ http://cpan.oss.eznetsols.org
+ ftp://ftp.oss.eznetsols.org/cpan
+
+=item South Korea
+
+ http://CPAN.bora.net/
+ ftp://ftp.bora.net/pub/CPAN/
+ http://mirror.kr.FreeBSD.org/CPAN
+ ftp://ftp.kr.FreeBSD.org/pub/CPAN
+
+=item Taiwan
+
+ ftp://ftp.nctu.edu.tw/UNIX/perl/CPAN
+ http://cpan.cdpa.nsysu.edu.tw/
+ ftp://cpan.cdpa.nsysu.edu.tw/pub/CPAN
+ http://ftp.isu.edu.tw/pub/CPAN
+ ftp://ftp.isu.edu.tw/pub/CPAN
+ ftp://ftp1.sinica.edu.tw/pub1/perl/CPAN/
+ http://ftp.tku.edu.tw/pub/CPAN/
+ ftp://ftp.tku.edu.tw/pub/CPAN/
+
+=item Thailand
+
+ ftp://ftp.loxinfo.co.th/pub/cpan/
+ ftp://ftp.cs.riubon.ac.th/pub/mirrors/CPAN/
+
+=back
+
+=head2 Central America
+
+=over 4
+
+=item Costa Rica
+
+ http://ftp.ucr.ac.cr/Unix/CPAN/
+ ftp://ftp.ucr.ac.cr/pub/Unix/CPAN/
+
+=back
+
+=head2 Europe
+
+=over 4
+
+=item Austria
+
+ http://cpan.inode.at/
+ ftp://cpan.inode.at
+ ftp://ftp.tuwien.ac.at/pub/CPAN/
+
+=item Belgium
+
+ http://ftp.easynet.be/pub/CPAN/
+ ftp://ftp.easynet.be/pub/CPAN/
+ http://cpan.skynet.be
+ ftp://ftp.cpan.skynet.be/pub/CPAN
+ ftp://ftp.kulnet.kuleuven.ac.be/pub/mirror/CPAN/
+
+=item Bosnia and Herzegovina
+
+ http://cpan.blic.net/
+
+=item Bulgaria
+
+ http://cpan.online.bg
+ ftp://cpan.online.bg/cpan
+ http://cpan.zadnik.org
+ ftp://ftp.zadnik.org/mirrors/CPAN/
+ http://cpan.lirex.net/
+ ftp://ftp.lirex.net/pub/mirrors/CPAN
+
+=item Croatia
+
+ http://ftp.linux.hr/pub/CPAN/
+ ftp://ftp.linux.hr/pub/CPAN/
+
+=item Czech Republic
+
+ ftp://ftp.fi.muni.cz/pub/CPAN/
+ ftp://sunsite.mff.cuni.cz/MIRRORS/ftp.funet.fi/pub/languages/perl/CPAN/
+
+=item Denmark
+
+ http://mirrors.sunsite.dk/cpan/
+ ftp://sunsite.dk/mirrors/cpan/
+ http://cpan.cybercity.dk
+ http://www.cpan.dk/CPAN/
+ ftp://www.cpan.dk/ftp.cpan.org/CPAN/
+
+=item Estonia
+
+ ftp://ftp.ut.ee/pub/languages/perl/CPAN/
+
+=item Finland
+
+ ftp://ftp.funet.fi/pub/languages/perl/CPAN/
+ http://mirror.eunet.fi/CPAN
+
+=item France
+
+ http://www.enstimac.fr/Perl/CPAN
+ http://ftp.u-paris10.fr/perl/CPAN
+ ftp://ftp.u-paris10.fr/perl/CPAN
+ http://cpan.mirrors.easynet.fr/
+ ftp://cpan.mirrors.easynet.fr/pub/ftp.cpan.org/
+ ftp://ftp.club-internet.fr/pub/perl/CPAN/
+ http://fr.cpan.org/
+ ftp://ftp.lip6.fr/pub/perl/CPAN/
+ ftp://ftp.oleane.net/pub/mirrors/CPAN/
+ ftp://ftp.pasteur.fr/pub/computing/CPAN/
+ http://mir2.ovh.net/ftp.cpan.org
+ ftp://mir1.ovh.net/ftp.cpan.org
+ http://ftp.crihan.fr/mirrors/ftp.cpan.org/
+ ftp://ftp.crihan.fr/mirrors/ftp.cpan.org/
+ http://ftp.u-strasbg.fr/CPAN
+ ftp://ftp.u-strasbg.fr/CPAN
+ ftp://cpan.cict.fr/pub/CPAN/
+ ftp://ftp.uvsq.fr/pub/perl/CPAN/
+
+=item Germany
+
+ ftp://ftp.rub.de/pub/CPAN/
+ ftp://ftp.freenet.de/pub/ftp.cpan.org/pub/CPAN/
+ ftp://ftp.uni-erlangen.de/pub/source/CPAN/
+ ftp://ftp-stud.fht-esslingen.de/pub/Mirrors/CPAN
+ http://pandemonium.tiscali.de/pub/CPAN/
+ ftp://pandemonium.tiscali.de/pub/CPAN/
+ http://ftp.gwdg.de/pub/languages/perl/CPAN/
+ ftp://ftp.gwdg.de/pub/languages/perl/CPAN/
+ ftp://ftp.uni-hamburg.de/pub/soft/lang/perl/CPAN/
+ ftp://ftp.leo.org/pub/CPAN/
+ http://cpan.noris.de/
+ ftp://cpan.noris.de/pub/CPAN/
+ ftp://ftp.mpi-sb.mpg.de/pub/perl/CPAN/
+ ftp://ftp.gmd.de/mirrors/CPAN/
+
+=item Greece
+
+ ftp://ftp.acn.gr/pub/lang/perl
+ ftp://ftp.forthnet.gr/pub/languages/perl/CPAN
+ ftp://ftp.ntua.gr/pub/lang/perl/
+
+=item Hungary
+
+ http://ftp.kfki.hu/packages/perl/CPAN/
+ ftp://ftp.kfki.hu/pub/packages/perl/CPAN/
+
+=item Iceland
+
+ http://ftp.rhnet.is/pub/CPAN/
+ ftp://ftp.rhnet.is/pub/CPAN/
+
+=item Ireland
+
+ http://cpan.indigo.ie/
+ ftp://cpan.indigo.ie/pub/CPAN/
+ http://ftp.heanet.ie/mirrors/ftp.perl.org/pub/CPAN
+ ftp://ftp.heanet.ie/mirrors/ftp.perl.org/pub/CPAN
+ http://sunsite.compapp.dcu.ie/pub/perl/
+ ftp://sunsite.compapp.dcu.ie/pub/perl/
+
+=item Italy
+
+ http://cpan.nettuno.it/
+ http://gusp.dyndns.org/CPAN/
+ ftp://gusp.dyndns.org/pub/CPAN
+ http://softcity.iol.it/cpan
+ ftp://softcity.iol.it/pub/cpan
+ ftp://ftp.unina.it/pub/Other/CPAN/CPAN/
+ ftp://ftp.unipi.it/pub/mirror/perl/CPAN/
+ ftp://cis.uniRoma2.it/CPAN/
+ ftp://ftp.edisontel.it/pub/CPAN_Mirror/
+ http://cpan.flashnet.it/
+ ftp://ftp.flashnet.it/pub/CPAN/
+
+=item Latvia
+
+ http://kvin.lv/pub/CPAN/
+
+=item Lithuania
+
+ ftp://ftp.unix.lt/pub/CPAN/
+
+=item Netherlands
+
+ ftp://download.xs4all.nl/pub/mirror/CPAN/
+ ftp://ftp.nl.uu.net/pub/CPAN/
+ ftp://ftp.nluug.nl/pub/languages/perl/CPAN/
+ http://cpan.cybercomm.nl/
+ ftp://mirror.cybercomm.nl/pub/CPAN
+ ftp://mirror.vuurwerk.nl/pub/CPAN/
+ ftp://ftp.cpan.nl/pub/CPAN/
+ http://ftp.easynet.nl/mirror/CPAN
+ ftp://ftp.easynet.nl/mirror/CPAN
+ http://archive.cs.uu.nl/mirror/CPAN/
+ ftp://ftp.cs.uu.nl/mirror/CPAN/
+
+=item Norway
+
+ ftp://ftp.uninett.no/pub/languages/perl/CPAN
+ ftp://ftp.uit.no/pub/languages/perl/cpan/
+
+=item Poland
+
+ ftp://ftp.mega.net.pl/CPAN
+ ftp://ftp.man.torun.pl/pub/doc/CPAN/
+ ftp://sunsite.icm.edu.pl/pub/CPAN/
+
+=item Portugal
+
+ ftp://ftp.ua.pt/pub/CPAN/
+ ftp://perl.di.uminho.pt/pub/CPAN/
+ http://cpan.dei.uc.pt/
+ ftp://ftp.dei.uc.pt/pub/CPAN
+ ftp://ftp.nfsi.pt/pub/CPAN
+ http://ftp.linux.pt/pub/mirrors/CPAN
+ ftp://ftp.linux.pt/pub/mirrors/CPAN
+ http://cpan.ip.pt/
+ ftp://cpan.ip.pt/pub/cpan/
+ http://cpan.telepac.pt/
+ ftp://ftp.telepac.pt/pub/cpan/
+
+=item Romania
+
+ ftp://ftp.bio-net.ro/pub/CPAN
+ ftp://ftp.kappa.ro/pub/mirrors/ftp.perl.org/pub/CPAN/
+ ftp://ftp.lug.ro/CPAN
+ ftp://ftp.roedu.net/pub/CPAN/
+ ftp://ftp.dntis.ro/pub/cpan/
+ ftp://ftp.iasi.roedu.net/pub/mirrors/ftp.cpan.org/
+ http://cpan.ambra.ro/
+ ftp://ftp.ambra.ro/pub/CPAN
+ ftp://ftp.dnttm.ro/pub/CPAN/
+ ftp://ftp.lasting.ro/pub/CPAN
+ ftp://ftp.timisoara.roedu.net/mirrors/CPAN/
+
+=item Russia
+
+ ftp://ftp.chg.ru/pub/lang/perl/CPAN/
+ http://cpan.rinet.ru/
+ ftp://cpan.rinet.ru/pub/mirror/CPAN/
+ ftp://ftp.aha.ru/pub/CPAN/
+ ftp://ftp.corbina.ru/pub/CPAN/
+ http://cpan.sai.msu.ru/
+ ftp://ftp.sai.msu.su/pub/lang/perl/CPAN/
+
+=item Slovakia
+
+ ftp://ftp.cvt.stuba.sk/pub/CPAN/
+
+=item Slovenia
+
+ ftp://ftp.arnes.si/software/perl/CPAN/
+
+=item Spain
+
+ http://cpan.imasd.elmundo.es/
+ ftp://ftp.rediris.es/mirror/CPAN/
+ ftp://ftp.ri.telefonica-data.net/CPAN
+ ftp://ftp.etse.urv.es/pub/perl/
+
+=item Sweden
+
+ http://ftp.du.se/CPAN/
+ ftp://ftp.du.se/pub/CPAN/
+ http://mirror.dataphone.se/CPAN
+ ftp://mirror.dataphone.se/pub/CPAN
+ ftp://ftp.sunet.se/pub/lang/perl/CPAN/
+
+=item Switzerland
+
+ http://cpan.mirror.solnet.ch/
+ ftp://ftp.solnet.ch/mirror/CPAN/
+ ftp://ftp.danyk.ch/CPAN/
+ ftp://sunsite.cnlab-switch.ch/mirror/CPAN/
+
+=item Turkey
+
+ http://ftp.ulak.net.tr/perl/CPAN/
+ ftp://ftp.ulak.net.tr/perl/CPAN
+ ftp://sunsite.bilkent.edu.tr/pub/languages/CPAN/
+
+=item Ukraine
+
+ http://cpan.org.ua/
+ ftp://cpan.org.ua/
+ ftp://ftp.perl.org.ua/pub/CPAN/
+ http://no-more.kiev.ua/CPAN/
+ ftp://no-more.kiev.ua/pub/CPAN/
+
+=item United Kingdom
+
+ http://www.mirror.ac.uk/sites/ftp.funet.fi/pub/languages/perl/CPAN
+ ftp://ftp.mirror.ac.uk/sites/ftp.funet.fi/pub/languages/perl/CPAN/
+ http://cpan.teleglobe.net/
+ ftp://cpan.teleglobe.net/pub/CPAN
+ http://cpan.mirror.anlx.net/
+ ftp://ftp.mirror.anlx.net/CPAN/
+ http://cpan.etla.org/
+ ftp://cpan.etla.org/pub/CPAN
+ ftp://ftp.demon.co.uk/pub/CPAN/
+ http://cpan.m.flirble.org/
+ ftp://ftp.flirble.org/pub/languages/perl/CPAN/
+ ftp://ftp.plig.org/pub/CPAN/
+ http://cpan.hambule.co.uk/
+ http://cpan.mirrors.clockerz.net/
+ ftp://ftp.clockerz.net/pub/CPAN/
+ ftp://usit.shef.ac.uk/pub/packages/CPAN/
+
+=back
+
+=head2 North America
+
+=over 4
+
+=item Canada
+
+=over 8
+
+=item Alberta
+
+ http://cpan.sunsite.ualberta.ca/
+ ftp://cpan.sunsite.ualberta.ca/pub/CPAN/
+
+=item Manitoba
+
+ http://theoryx5.uwinnipeg.ca/pub/CPAN/
+ ftp://theoryx5.uwinnipeg.ca/pub/CPAN/
+
+=item Nova Scotia
+
+ ftp://cpan.chebucto.ns.ca/pub/CPAN/
+
+=item Ontario
+
+ ftp://ftp.nrc.ca/pub/CPAN/
+
+=back
+
+=item Mexico
+
+ http://cpan.azc.uam.mx
+ ftp://cpan.azc.uam.mx/mirrors/CPAN
+ http://www.cpan.unam.mx/
+ ftp://ftp.unam.mx/pub/CPAN
+ http://www.msg.com.mx/CPAN/
+ ftp://ftp.msg.com.mx/pub/CPAN/
+
+=item United States
+
+=over 8
+
+=item Alabama
+
+ http://mirror.hiwaay.net/CPAN/
+ ftp://mirror.hiwaay.net/CPAN/
+
+=item California
+
+ http://cpan.develooper.com/
+ http://www.cpan.org/
+ ftp://cpan.valueclick.com/pub/CPAN/
+ http://www.mednor.net/ftp/pub/mirrors/CPAN/
+ ftp://ftp.mednor.net/pub/mirrors/CPAN/
+ http://mirrors.gossamer-threads.com/CPAN
+ ftp://cpan.nas.nasa.gov/pub/perl/CPAN/
+ http://mirrors.kernel.org/cpan/
+ ftp://mirrors.kernel.org/pub/CPAN
+ http://cpan-sj.viaverio.com/
+ ftp://cpan-sj.viaverio.com/pub/CPAN/
+ http://cpan.digisle.net/
+ ftp://cpan.digisle.net/pub/CPAN
+ http://www.perl.com/CPAN/
+ http://www.uberlan.net/CPAN
+
+=item Colorado
+
+ ftp://ftp.cs.colorado.edu/pub/perl/CPAN/
+ http://cpan.four10.com
+
+=item Delaware
+
+ http://ftp.lug.udel.edu/pub/CPAN
+ ftp://ftp.lug.udel.edu/pub/CPAN
+
+=item District of Columbia
+
+ ftp://ftp.dc.aleron.net/pub/CPAN/
+
+=item Florida
+
+ ftp://ftp.cise.ufl.edu/pub/mirrors/CPAN/
+ http://mirror.csit.fsu.edu/pub/CPAN/
+ ftp://mirror.csit.fsu.edu/pub/CPAN/
+ http://cpan.mirrors.nks.net/
+
+=item Indiana
+
+ ftp://ftp.uwsg.iu.edu/pub/perl/CPAN/
+ http://cpan.netnitco.net/
+ ftp://cpan.netnitco.net/pub/mirrors/CPAN/
+ http://archive.progeny.com/CPAN/
+ ftp://archive.progeny.com/CPAN/
+ http://fx.saintjoe.edu/pub/CPAN
+ ftp://ftp.saintjoe.edu/pub/CPAN
+ http://csociety-ftp.ecn.purdue.edu/pub/CPAN
+ ftp://csociety-ftp.ecn.purdue.edu/pub/CPAN
+
+=item Kentucky
+
+ http://cpan.uky.edu/
+ ftp://cpan.uky.edu/pub/CPAN/
+ http://slugsite.louisville.edu/cpan
+ ftp://slugsite.louisville.edu/CPAN
+
+=item Massachusetts
+
+ http://mirrors.towardex.com/CPAN
+ ftp://mirrors.towardex.com/pub/CPAN
+ ftp://ftp.ccs.neu.edu/net/mirrors/ftp.funet.fi/pub/languages/perl/CPAN/
+
+=item Michigan
+
+ ftp://cpan.cse.msu.edu/
+ http://cpan.calvin.edu/pub/CPAN
+ ftp://cpan.calvin.edu/pub/CPAN
+
+=item Nevada
+
+ http://www.oss.redundant.com/pub/CPAN
+ ftp://www.oss.redundant.com/pub/CPAN
+
+=item New Jersey
+
+ http://ftp.cpanel.net/pub/CPAN/
+ ftp://ftp.cpanel.net/pub/CPAN/
+ http://cpan.teleglobe.net/
+ ftp://cpan.teleglobe.net/pub/CPAN
+
+=item New York
+
+ http://cpan.belfry.net/
+ http://cpan.erlbaum.net/
+ ftp://cpan.erlbaum.net/
+ http://cpan.thepirtgroup.com/
+ ftp://cpan.thepirtgroup.com/
+ ftp://ftp.stealth.net/pub/CPAN/
+ http://www.rge.com/pub/languages/perl/
+ ftp://ftp.rge.com/pub/languages/perl/
+
+=item North Carolina
+
+ http://www.ibiblio.org/pub/languages/perl/CPAN
+ ftp://ftp.ibiblio.org/pub/languages/perl/CPAN
+ ftp://ftp.duke.edu/pub/perl/
+ ftp://ftp.ncsu.edu/pub/mirror/CPAN/
+
+=item Oklahoma
+
+ ftp://ftp.ou.edu/mirrors/CPAN/
+
+=item Oregon
+
+ ftp://ftp.orst.edu/pub/CPAN
+
+=item Pennsylvania
+
+ http://ftp.epix.net/CPAN/
+ ftp://ftp.epix.net/pub/languages/perl/
+ http://mirrors.phenominet.com/pub/CPAN/
+ ftp://mirrors.phenominet.com/pub/CPAN/
+ http://cpan.pair.com/
+ ftp://cpan.pair.com/pub/CPAN/
+ ftp://carroll.cac.psu.edu/pub/CPAN/
+
+=item Tennessee
+
+ ftp://ftp.sunsite.utk.edu/pub/CPAN/
+
+=item Texas
+
+ http://ftp.sedl.org/pub/mirrors/CPAN/
+ http://www.binarycode.org/cpan
+ ftp://mirror.telentente.com/pub/CPAN
+ http://mirrors.theonlinerecordstore.com/CPAN
+
+=item Utah
+
+ ftp://mirror.xmission.com/CPAN/
+
+=item Virginia
+
+ http://cpan-du.viaverio.com/
+ ftp://cpan-du.viaverio.com/pub/CPAN/
+ http://mirrors.rcn.net/pub/lang/CPAN/
+ ftp://mirrors.rcn.net/pub/lang/CPAN/
+ http://perl.secsup.org/
+ ftp://perl.secsup.org/pub/perl/
+ http://noc.cvaix.com/mirrors/CPAN/
+
+=item Washington
+
+ http://cpan.llarian.net/
+ ftp://cpan.llarian.net/pub/CPAN/
+ http://cpan.mirrorcentral.com/
+ ftp://ftp.mirrorcentral.com/pub/CPAN/
+ ftp://ftp-mirror.internap.com/pub/CPAN/
+
+=item Wisconsin
+
+ http://mirror.sit.wisc.edu/pub/CPAN/
+ ftp://mirror.sit.wisc.edu/pub/CPAN/
+ http://mirror.aphix.com/CPAN
+ ftp://mirror.aphix.com/pub/CPAN
+
+=back
+
+=back
+
+=head2 Oceania
+
+=over 4
+
+=item Australia
+
+ http://ftp.planetmirror.com/pub/CPAN/
+ ftp://ftp.planetmirror.com/pub/CPAN/
+ ftp://mirror.aarnet.edu.au/pub/perl/CPAN/
+ ftp://cpan.topend.com.au/pub/CPAN/
+ http://cpan.mirrors.ilisys.com.au
+
+=item New Zealand
+
+ ftp://ftp.auckland.ac.nz/pub/perl/CPAN/
+
+=item United States
+
+ http://aniani.ifa.hawaii.edu/CPAN/
+ ftp://aniani.ifa.hawaii.edu/CPAN/
+
+=back
+
+=head2 South America
+
+=over 4
+
+=item Argentina
+
+ ftp://mirrors.bannerlandia.com.ar/mirrors/CPAN/
+ http://www.linux.org.ar/mirrors/cpan
+ ftp://ftp.linux.org.ar/mirrors/cpan
+
+=item Brazil
+
+ ftp://cpan.pop-mg.com.br/pub/CPAN/
+ ftp://ftp.matrix.com.br/pub/perl/CPAN/
+ http://cpan.hostsul.com.br/
+ ftp://cpan.hostsul.com.br/
+
+=item Chile
+
+ http://cpan.netglobalis.net/
+ ftp://cpan.netglobalis.net/pub/CPAN/
+
+=back
+
+=head2 RSYNC Mirrors
+
+ www.linux.org.ar::cpan
+ theoryx5.uwinnipeg.ca::CPAN
+ ftp.shellhung.org::CPAN
+ rsync.nic.funet.fi::CPAN
+ ftp.u-paris10.fr::CPAN
+ mir1.ovh.net::CPAN
+ rsync://ftp.crihan.fr::CPAN
+ ftp.gwdg.de::FTP/languages/perl/CPAN/
+ ftp.leo.org::CPAN
+ ftp.cbn.net.id::CPAN
+ rsync://ftp.heanet.ie/mirrors/ftp.perl.org/pub/CPAN
+ ftp.iglu.org.il::CPAN
+ gusp.dyndns.org::cpan
+ ftp.kddlabs.co.jp::cpan
+ ftp.ayamura.org::pub/CPAN/
+ mirror.leafbug.org::CPAN
+ rsync.en.com.sg::CPAN
+ mirror.averse.net::cpan
+ rsync.oss.eznetsols.org
+ ftp.kr.FreeBSD.org::CPAN
+ ftp.solnet.ch::CPAN
+ cpan.cdpa.nsysu.edu.tw::CPAN
+ cpan.teleglobe.net::CPAN
+ rsync://rsync.mirror.anlx.net::CPAN
+ ftp.sedl.org::cpan
+ ibiblio.org::CPAN
+ cpan-du.viaverio.com::CPAN
+ aniani.ifa.hawaii.edu::CPAN
+ archive.progeny.com::CPAN
+ rsync://slugsite.louisville.edu::CPAN
+ mirror.aphix.com::CPAN
+ cpan.teleglobe.net::CPAN
+ ftp.lug.udel.edu::cpan
+ mirrors.kernel.org::mirrors/CPAN
+ mirrors.phenominet.com::CPAN
+ cpan.pair.com::CPAN
+ cpan-sj.viaverio.com::CPAN
+ mirror.csit.fsu.edu::CPAN
+ csociety-ftp.ecn.purdue.edu::CPAN
+
+For an up-to-date listing of CPAN sites,
+see http://www.cpan.org/SITES or ftp://www.cpan.org/SITES .
+
+=head1 Modules: Creation, Use, and Abuse
+
+(The following section is borrowed directly from Tim Bunce's modules
+file, available at your nearest CPAN site.)
+
+Perl implements a class using a package, but the presence of a
+package doesn't imply the presence of a class. A package is just a
+namespace. A class is a package that provides subroutines that can be
+used as methods. A method is just a subroutine that expects, as its
+first argument, either the name of a package (for "static" methods),
+or a reference to something (for "virtual" methods).
+
+A module is a file that (by convention) provides a class of the same
+name (sans the .pm), plus an import method in that class that can be
+called to fetch exported symbols. This module may implement some of
+its methods by loading dynamic C or C++ objects, but that should be
+totally transparent to the user of the module. Likewise, the module
+might set up an AUTOLOAD function to slurp in subroutine definitions on
+demand, but this is also transparent. Only the F<.pm> file is required to
+exist. See L<perlsub>, L<perltoot>, and L<AutoLoader> for details about
+the AUTOLOAD mechanism.
+
+=head2 Guidelines for Module Creation
+
+=over 4
+
+=item *
+
+Do similar modules already exist in some form?
+
+If so, please try to reuse the existing modules either in whole or
+by inheriting useful features into a new class. If this is not
+practical try to get together with the module authors to work on
+extending or enhancing the functionality of the existing modules.
+A perfect example is the plethora of packages in perl4 for dealing
+with command line options.
+
+If you are writing a module to expand an already existing set of
+modules, please coordinate with the author of the package. It
+helps if you follow the same naming scheme and module interaction
+scheme as the original author.
+
+=item *
+
+Try to design the new module to be easy to extend and reuse.
+
+Try to C<use warnings;> (or C<use warnings qw(...);>).
+Remember that you can add C<no warnings qw(...);> to individual blocks
+of code that need less warnings.
+
+Use blessed references. Use the two argument form of bless to bless
+into the class name given as the first parameter of the constructor,
+e.g.,:
+
+ sub new {
+ my $class = shift;
+ return bless {}, $class;
+ }
+
+or even this if you'd like it to be used as either a static
+or a virtual method.
+
+ sub new {
+ my $self = shift;
+ my $class = ref($self) || $self;
+ return bless {}, $class;
+ }
+
+Pass arrays as references so more parameters can be added later
+(it's also faster). Convert functions into methods where
+appropriate. Split large methods into smaller more flexible ones.
+Inherit methods from other modules if appropriate.
+
+Avoid class name tests like: C<die "Invalid" unless ref $ref eq 'FOO'>.
+Generally you can delete the C<eq 'FOO'> part with no harm at all.
+Let the objects look after themselves! Generally, avoid hard-wired
+class names as far as possible.
+
+Avoid C<< $r->Class::func() >> where using C<@ISA=qw(... Class ...)> and
+C<< $r->func() >> would work (see L<perlbot> for more details).
+
+Use autosplit so little used or newly added functions won't be a
+burden to programs that don't use them. Add test functions to
+the module after __END__ either using AutoSplit or by saying:
+
+ eval join('',<main::DATA>) || die $@ unless caller();
+
+Does your module pass the 'empty subclass' test? If you say
+C<@SUBCLASS::ISA = qw(YOURCLASS);> your applications should be able
+to use SUBCLASS in exactly the same way as YOURCLASS. For example,
+does your application still work if you change: C<< $obj = YOURCLASS->new(); >>
+into: C<< $obj = SUBCLASS->new(); >> ?
+
+Avoid keeping any state information in your packages. It makes it
+difficult for multiple other packages to use yours. Keep state
+information in objects.
+
+Always use B<-w>.
+
+Try to C<use strict;> (or C<use strict qw(...);>).
+Remember that you can add C<no strict qw(...);> to individual blocks
+of code that need less strictness.
+
+Always use B<-w>.
+
+Follow the guidelines in the perlstyle(1) manual.
+
+Always use B<-w>.
+
+=item *
+
+Some simple style guidelines
+
+The perlstyle manual supplied with Perl has many helpful points.
+
+Coding style is a matter of personal taste. Many people evolve their
+style over several years as they learn what helps them write and
+maintain good code. Here's one set of assorted suggestions that
+seem to be widely used by experienced developers:
+
+Use underscores to separate words. It is generally easier to read
+$var_names_like_this than $VarNamesLikeThis, especially for
+non-native speakers of English. It's also a simple rule that works
+consistently with VAR_NAMES_LIKE_THIS.
+
+Package/Module names are an exception to this rule. Perl informally
+reserves lowercase module names for 'pragma' modules like integer
+and strict. Other modules normally begin with a capital letter and
+use mixed case with no underscores (need to be short and portable).
+
+You may find it helpful to use letter case to indicate the scope
+or nature of a variable. For example:
+
+ $ALL_CAPS_HERE constants only (beware clashes with Perl vars)
+ $Some_Caps_Here package-wide global/static
+ $no_caps_here function scope my() or local() variables
+
+Function and method names seem to work best as all lowercase.
+e.g., C<< $obj->as_string() >>.
+
+You can use a leading underscore to indicate that a variable or
+function should not be used outside the package that defined it.
+
+=item *
+
+Select what to export.
+
+Do NOT export method names!
+
+Do NOT export anything else by default without a good reason!
+
+Exports pollute the namespace of the module user. If you must
+export try to use @EXPORT_OK in preference to @EXPORT and avoid
+short or common names to reduce the risk of name clashes.
+
+Generally anything not exported is still accessible from outside the
+module using the ModuleName::item_name (or C<< $blessed_ref->method >>)
+syntax. By convention you can use a leading underscore on names to
+indicate informally that they are 'internal' and not for public use.
+
+(It is actually possible to get private functions by saying:
+C<my $subref = sub { ... }; &$subref;>. But there's no way to call that
+directly as a method, because a method must have a name in the symbol
+table.)
+
+As a general rule, if the module is trying to be object oriented
+then export nothing. If it's just a collection of functions then
+@EXPORT_OK anything but use @EXPORT with caution.
+
+=item *
+
+Select a name for the module.
+
+This name should be as descriptive, accurate, and complete as
+possible. Avoid any risk of ambiguity. Always try to use two or
+more whole words. Generally the name should reflect what is special
+about what the module does rather than how it does it. Please use
+nested module names to group informally or categorize a module.
+There should be a very good reason for a module not to have a nested name.
+Module names should begin with a capital letter.
+
+Having 57 modules all called Sort will not make life easy for anyone
+(though having 23 called Sort::Quick is only marginally better :-).
+Imagine someone trying to install your module alongside many others.
+If in any doubt ask for suggestions in comp.lang.perl.misc.
+
+If you are developing a suite of related modules/classes it's good
+practice to use nested classes with a common prefix as this will
+avoid namespace clashes. For example: Xyz::Control, Xyz::View,
+Xyz::Model etc. Use the modules in this list as a naming guide.
+
+If adding a new module to a set, follow the original author's
+standards for naming modules and the interface to methods in
+those modules.
+
+If developing modules for private internal or project specific use,
+that will never be released to the public, then you should ensure
+that their names will not clash with any future public module. You
+can do this either by using the reserved Local::* category or by
+using a category name that includes an underscore like Foo_Corp::*.
+
+To be portable each component of a module name should be limited to
+11 characters. If it might be used on MS-DOS then try to ensure each is
+unique in the first 8 characters. Nested modules make this easier.
+
+=item *
+
+Have you got it right?
+
+How do you know that you've made the right decisions? Have you
+picked an interface design that will cause problems later? Have
+you picked the most appropriate name? Do you have any questions?
+
+The best way to know for sure, and pick up many helpful suggestions,
+is to ask someone who knows. Comp.lang.perl.misc is read by just about
+all the people who develop modules and it's the best place to ask.
+
+All you need to do is post a short summary of the module, its
+purpose and interfaces. A few lines on each of the main methods is
+probably enough. (If you post the whole module it might be ignored
+by busy people - generally the very people you want to read it!)
+
+Don't worry about posting if you can't say when the module will be
+ready - just say so in the message. It might be worth inviting
+others to help you, they may be able to complete it for you!
+
+=item *
+
+README and other Additional Files.
+
+It's well known that software developers usually fully document the
+software they write. If, however, the world is in urgent need of
+your software and there is not enough time to write the full
+documentation please at least provide a README file containing:
+
+=over 10
+
+=item *
+
+A description of the module/package/extension etc.
+
+=item *
+
+A copyright notice - see below.
+
+=item *
+
+Prerequisites - what else you may need to have.
+
+=item *
+
+How to build it - possible changes to Makefile.PL etc.
+
+=item *
+
+How to install it.
+
+=item *
+
+Recent changes in this release, especially incompatibilities
+
+=item *
+
+Changes / enhancements you plan to make in the future.
+
+=back
+
+If the README file seems to be getting too large you may wish to
+split out some of the sections into separate files: INSTALL,
+Copying, ToDo etc.
+
+=over 4
+
+=item *
+
+Adding a Copyright Notice.
+
+How you choose to license your work is a personal decision.
+The general mechanism is to assert your Copyright and then make
+a declaration of how others may copy/use/modify your work.
+
+Perl, for example, is supplied with two types of licence: The GNU GPL
+and The Artistic Licence (see the files README, Copying, and Artistic,
+or L<perlgpl> and L<perlartistic>). Larry has good reasons for NOT
+just using the GNU GPL.
+
+My personal recommendation, out of respect for Larry, Perl, and the
+Perl community at large is to state something simply like:
+
+ Copyright (c) 1995 Your Name. All rights reserved.
+ This program is free software; you can redistribute it and/or
+ modify it under the same terms as Perl itself.
+
+This statement should at least appear in the README file. You may
+also wish to include it in a Copying file and your source files.
+Remember to include the other words in addition to the Copyright.
+
+=item *
+
+Give the module a version/issue/release number.
+
+To be fully compatible with the Exporter and MakeMaker modules you
+should store your module's version number in a non-my package
+variable called $VERSION. This should be a floating point
+number with at least two digits after the decimal (i.e., hundredths,
+e.g, C<$VERSION = "0.01">). Don't use a "1.3.2" style version.
+See L<Exporter> for details.
+
+It may be handy to add a function or method to retrieve the number.
+Use the number in announcements and archive file names when
+releasing the module (ModuleName-1.02.tar.Z).
+See perldoc ExtUtils::MakeMaker.pm for details.
+
+=item *
+
+How to release and distribute a module.
+
+It's good idea to post an announcement of the availability of your
+module (or the module itself if small) to the comp.lang.perl.announce
+Usenet newsgroup. This will at least ensure very wide once-off
+distribution.
+
+If possible, register the module with CPAN. You should
+include details of its location in your announcement.
+
+Some notes about ftp archives: Please use a long descriptive file
+name that includes the version number. Most incoming directories
+will not be readable/listable, i.e., you won't be able to see your
+file after uploading it. Remember to send your email notification
+message as soon as possible after uploading else your file may get
+deleted automatically. Allow time for the file to be processed
+and/or check the file has been processed before announcing its
+location.
+
+FTP Archives for Perl Modules:
+
+Follow the instructions and links on:
+
+ http://www.cpan.org/modules/00modlist.long.html
+ http://www.cpan.org/modules/04pause.html
+
+or upload to one of these sites:
+
+ https://pause.kbx.de/pause/
+ http://pause.perl.org/pause/
+
+and notify <modules@perl.org>.
+
+By using the WWW interface you can ask the Upload Server to mirror
+your modules from your ftp or WWW site into your own directory on
+CPAN!
+
+Please remember to send me an updated entry for the Module list!
+
+=item *
+
+Take care when changing a released module.
+
+Always strive to remain compatible with previous released versions.
+Otherwise try to add a mechanism to revert to the
+old behavior if people rely on it. Document incompatible changes.
+
+=back
+
+=back
+
+=head2 Guidelines for Converting Perl 4 Library Scripts into Modules
+
+=over 4
+
+=item *
+
+There is no requirement to convert anything.
+
+If it ain't broke, don't fix it! Perl 4 library scripts should
+continue to work with no problems. You may need to make some minor
+changes (like escaping non-array @'s in double quoted strings) but
+there is no need to convert a .pl file into a Module for just that.
+
+=item *
+
+Consider the implications.
+
+All Perl applications that make use of the script will need to
+be changed (slightly) if the script is converted into a module. Is
+it worth it unless you plan to make other changes at the same time?
+
+=item *
+
+Make the most of the opportunity.
+
+If you are going to convert the script to a module you can use the
+opportunity to redesign the interface. The guidelines for module
+creation above include many of the issues you should consider.
+
+=item *
+
+The pl2pm utility will get you started.
+
+This utility will read *.pl files (given as parameters) and write
+corresponding *.pm files. The pl2pm utilities does the following:
+
+=over 10
+
+=item *
+
+Adds the standard Module prologue lines
+
+=item *
+
+Converts package specifiers from ' to ::
+
+=item *
+
+Converts die(...) to croak(...)
+
+=item *
+
+Several other minor changes
+
+=back
+
+Being a mechanical process pl2pm is not bullet proof. The converted
+code will need careful checking, especially any package statements.
+Don't delete the original .pl file till the new .pm one works!
+
+=back
+
+=head2 Guidelines for Reusing Application Code
+
+=over 4
+
+=item *
+
+Complete applications rarely belong in the Perl Module Library.
+
+=item *
+
+Many applications contain some Perl code that could be reused.
+
+Help save the world! Share your code in a form that makes it easy
+to reuse.
+
+=item *
+
+Break-out the reusable code into one or more separate module files.
+
+=item *
+
+Take the opportunity to reconsider and redesign the interfaces.
+
+=item *
+
+In some cases the 'application' can then be reduced to a small
+
+fragment of code built on top of the reusable modules. In these cases
+the application could invoked as:
+
+ % perl -e 'use Module::Name; method(@ARGV)' ...
+or
+ % perl -mModule::Name ... (in perl5.002 or higher)
+
+=back
+
+=head1 NOTE
+
+Perl does not enforce private and public parts of its modules as you may
+have been used to in other languages like C++, Ada, or Modula-17. Perl
+doesn't have an infatuation with enforced privacy. It would prefer
+that you stayed out of its living room because you weren't invited, not
+because it has a shotgun.
+
+The module and its user have a contract, part of which is common law,
+and part of which is "written". Part of the common law contract is
+that a module doesn't pollute any namespace it wasn't asked to. The
+written contract for the module (A.K.A. documentation) may make other
+provisions. But then you know when you C<use RedefineTheWorld> that
+you're redefining the world and willing to take the consequences.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlmodstyle.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlmodstyle.pod
new file mode 100755
index 00000000000..a5e332e533b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlmodstyle.pod
@@ -0,0 +1,780 @@
+=head1 NAME
+
+perlmodstyle - Perl module style guide
+
+=head1 INTRODUCTION
+
+This document attempts to describe the Perl Community's "best practice"
+for writing Perl modules. It extends the recommendations found in
+L<perlstyle> , which should be considered required reading
+before reading this document.
+
+While this document is intended to be useful to all module authors, it is
+particularly aimed at authors who wish to publish their modules on CPAN.
+
+The focus is on elements of style which are visible to the users of a
+module, rather than those parts which are only seen by the module's
+developers. However, many of the guidelines presented in this document
+can be extrapolated and applied successfully to a module's internals.
+
+This document differs from L<perlnewmod> in that it is a style guide
+rather than a tutorial on creating CPAN modules. It provides a
+checklist against which modules can be compared to determine whether
+they conform to best practice, without necessarily describing in detail
+how to achieve this.
+
+All the advice contained in this document has been gleaned from
+extensive conversations with experienced CPAN authors and users. Every
+piece of advice given here is the result of previous mistakes. This
+information is here to help you avoid the same mistakes and the extra
+work that would inevitably be required to fix them.
+
+The first section of this document provides an itemized checklist;
+subsequent sections provide a more detailed discussion of the items on
+the list. The final section, "Common Pitfalls", describes some of the
+most popular mistakes made by CPAN authors.
+
+=head1 QUICK CHECKLIST
+
+For more detail on each item in this checklist, see below.
+
+=head2 Before you start
+
+=over 4
+
+=item *
+
+Don't re-invent the wheel
+
+=item *
+
+Patch, extend or subclass an existing module where possible
+
+=item *
+
+Do one thing and do it well
+
+=item *
+
+Choose an appropriate name
+
+=back
+
+=head2 The API
+
+=over 4
+
+=item *
+
+API should be understandable by the average programmer
+
+=item *
+
+Simple methods for simple tasks
+
+=item *
+
+Separate functionality from output
+
+=item *
+
+Consistent naming of subroutines or methods
+
+=item *
+
+Use named parameters (a hash or hashref) when there are more than two
+parameters
+
+=back
+
+=head2 Stability
+
+=over 4
+
+=item *
+
+Ensure your module works under C<use strict> and C<-w>
+
+=item *
+
+Stable modules should maintain backwards compatibility
+
+=back
+
+=head2 Documentation
+
+=over 4
+
+=item *
+
+Write documentation in POD
+
+=item *
+
+Document purpose, scope and target applications
+
+=item *
+
+Document each publically accessible method or subroutine, including params and return values
+
+=item *
+
+Give examples of use in your documentation
+
+=item *
+
+Provide a README file and perhaps also release notes, changelog, etc
+
+=item *
+
+Provide links to further information (URL, email)
+
+=back
+
+=head2 Release considerations
+
+=over 4
+
+=item *
+
+Specify pre-requisites in Makefile.PL or Build.PL
+
+=item *
+
+Specify Perl version requirements with C<use>
+
+=item *
+
+Include tests with your module
+
+=item *
+
+Choose a sensible and consistent version numbering scheme (X.YY is the common Perl module numbering scheme)
+
+=item *
+
+Increment the version number for every change, no matter how small
+
+=item *
+
+Package the module using "make dist"
+
+=item *
+
+Choose an appropriate license (GPL/Artistic is a good default)
+
+=back
+
+=head1 BEFORE YOU START WRITING A MODULE
+
+Try not to launch headlong into developing your module without spending
+some time thinking first. A little forethought may save you a vast
+amount of effort later on.
+
+=head2 Has it been done before?
+
+You may not even need to write the module. Check whether it's already
+been done in Perl, and avoid re-inventing the wheel unless you have a
+good reason.
+
+Good places to look for pre-existing modules include
+http://search.cpan.org/ and asking on modules@perl.org
+
+If an existing module B<almost> does what you want, consider writing a
+patch, writing a subclass, or otherwise extending the existing module
+rather than rewriting it.
+
+=head2 Do one thing and do it well
+
+At the risk of stating the obvious, modules are intended to be modular.
+A Perl developer should be able to use modules to put together the
+building blocks of their application. However, it's important that the
+blocks are the right shape, and that the developer shouldn't have to use
+a big block when all they need is a small one.
+
+Your module should have a clearly defined scope which is no longer than
+a single sentence. Can your module be broken down into a family of
+related modules?
+
+Bad example:
+
+"FooBar.pm provides an implementation of the FOO protocol and the
+related BAR standard."
+
+Good example:
+
+"Foo.pm provides an implementation of the FOO protocol. Bar.pm
+implements the related BAR protocol."
+
+This means that if a developer only needs a module for the BAR standard,
+they should not be forced to install libraries for FOO as well.
+
+=head2 What's in a name?
+
+Make sure you choose an appropriate name for your module early on. This
+will help people find and remember your module, and make programming
+with your module more intuitive.
+
+When naming your module, consider the following:
+
+=over 4
+
+=item *
+
+Be descriptive (i.e. accurately describes the purpose of the module).
+
+=item *
+
+Be consistent with existing modules.
+
+=item *
+
+Reflect the functionality of the module, not the implementation.
+
+=item *
+
+Avoid starting a new top-level hierarchy, especially if a suitable
+hierarchy already exists under which you could place your module.
+
+=back
+
+You should contact modules@perl.org to ask them about your module name
+before publishing your module. You should also try to ask people who
+are already familiar with the module's application domain and the CPAN
+naming system. Authors of similar modules, or modules with similar
+names, may be a good place to start.
+
+=head1 DESIGNING AND WRITING YOUR MODULE
+
+Considerations for module design and coding:
+
+=head2 To OO or not to OO?
+
+Your module may be object oriented (OO) or not, or it may have both kinds
+of interfaces available. There are pros and cons of each technique, which
+should be considered when you design your API.
+
+According to Damian Conway, you should consider using OO:
+
+=over 4
+
+=item *
+
+When the system is large or likely to become so
+
+=item *
+
+When the data is aggregated in obvious structures that will become objects
+
+=item *
+
+When the types of data form a natural hierarchy that can make use of inheritance
+
+=item *
+
+When operations on data vary according to data type (making
+polymorphic invocation of methods feasible)
+
+=item *
+
+When it is likely that new data types may be later introduced
+into the system, and will need to be handled by existing code
+
+=item *
+
+When interactions between data are best represented by
+overloaded operators
+
+=item *
+
+When the implementation of system components is likely to
+change over time (and hence should be encapsulated)
+
+=item *
+
+When the system design is itself object-oriented
+
+=item *
+
+When large amounts of client code will use the software (and
+should be insulated from changes in its implementation)
+
+=item *
+
+When many separate operations will need to be applied to the
+same set of data
+
+=back
+
+Think carefully about whether OO is appropriate for your module.
+Gratuitous object orientation results in complex APIs which are
+difficult for the average module user to understand or use.
+
+=head2 Designing your API
+
+Your interfaces should be understandable by an average Perl programmer.
+The following guidelines may help you judge whether your API is
+sufficiently straightforward:
+
+=over 4
+
+=item Write simple routines to do simple things.
+
+It's better to have numerous simple routines than a few monolithic ones.
+If your routine changes its behaviour significantly based on its
+arguments, it's a sign that you should have two (or more) separate
+routines.
+
+=item Separate functionality from output.
+
+Return your results in the most generic form possible and allow the user
+to choose how to use them. The most generic form possible is usually a
+Perl data structure which can then be used to generate a text report,
+HTML, XML, a database query, or whatever else your users require.
+
+If your routine iterates through some kind of list (such as a list of
+files, or records in a database) you may consider providing a callback
+so that users can manipulate each element of the list in turn.
+File::Find provides an example of this with its
+C<find(\&wanted, $dir)> syntax.
+
+=item Provide sensible shortcuts and defaults.
+
+Don't require every module user to jump through the same hoops to achieve a
+simple result. You can always include optional parameters or routines for
+more complex or non-standard behaviour. If most of your users have to
+type a few almost identical lines of code when they start using your
+module, it's a sign that you should have made that behaviour a default.
+Another good indicator that you should use defaults is if most of your
+users call your routines with the same arguments.
+
+=item Naming conventions
+
+Your naming should be consistent. For instance, it's better to have:
+
+ display_day();
+ display_week();
+ display_year();
+
+than
+
+ display_day();
+ week_display();
+ show_year();
+
+This applies equally to method names, parameter names, and anything else
+which is visible to the user (and most things that aren't!)
+
+=item Parameter passing
+
+Use named parameters. It's easier to use a hash like this:
+
+ $obj->do_something(
+ name => "wibble",
+ type => "text",
+ size => 1024,
+ );
+
+... than to have a long list of unnamed parameters like this:
+
+ $obj->do_something("wibble", "text", 1024);
+
+While the list of arguments might work fine for one, two or even three
+arguments, any more arguments become hard for the module user to
+remember, and hard for the module author to manage. If you want to add
+a new parameter you will have to add it to the end of the list for
+backward compatibility, and this will probably make your list order
+unintuitive. Also, if many elements may be undefined you may see the
+following unattractive method calls:
+
+ $obj->do_something(undef, undef, undef, undef, undef, undef, 1024);
+
+Provide sensible defaults for parameters which have them. Don't make
+your users specify parameters which will almost always be the same.
+
+The issue of whether to pass the arguments in a hash or a hashref is
+largely a matter of personal style.
+
+The use of hash keys starting with a hyphen (C<-name>) or entirely in
+upper case (C<NAME>) is a relic of older versions of Perl in which
+ordinary lower case strings were not handled correctly by the C<=E<gt>>
+operator. While some modules retain uppercase or hyphenated argument
+keys for historical reasons or as a matter of personal style, most new
+modules should use simple lower case keys. Whatever you choose, be
+consistent!
+
+=back
+
+=head2 Strictness and warnings
+
+Your module should run successfully under the strict pragma and should
+run without generating any warnings. Your module should also handle
+taint-checking where appropriate, though this can cause difficulties in
+many cases.
+
+=head2 Backwards compatibility
+
+Modules which are "stable" should not break backwards compatibility
+without at least a long transition phase and a major change in version
+number.
+
+=head2 Error handling and messages
+
+When your module encounters an error it should do one or more of:
+
+=over 4
+
+=item *
+
+Return an undefined value.
+
+=item *
+
+set C<$Module::errstr> or similar (C<errstr> is a common name used by
+DBI and other popular modules; if you choose something else, be sure to
+document it clearly).
+
+=item *
+
+C<warn()> or C<carp()> a message to STDERR.
+
+=item *
+
+C<croak()> only when your module absolutely cannot figure out what to
+do. (C<croak()> is a better version of C<die()> for use within
+modules, which reports its errors from the perspective of the caller.
+See L<Carp> for details of C<croak()>, C<carp()> and other useful
+routines.)
+
+=item *
+
+As an alternative to the above, you may prefer to throw exceptions using
+the Error module.
+
+=back
+
+Configurable error handling can be very useful to your users. Consider
+offering a choice of levels for warning and debug messages, an option to
+send messages to a separate file, a way to specify an error-handling
+routine, or other such features. Be sure to default all these options
+to the commonest use.
+
+=head1 DOCUMENTING YOUR MODULE
+
+=head2 POD
+
+Your module should include documentation aimed at Perl developers.
+You should use Perl's "plain old documentation" (POD) for your general
+technical documentation, though you may wish to write additional
+documentation (white papers, tutorials, etc) in some other format.
+You need to cover the following subjects:
+
+=over 4
+
+=item *
+
+A synopsis of the common uses of the module
+
+=item *
+
+The purpose, scope and target applications of your module
+
+=item *
+
+Use of each publically accessible method or subroutine, including
+parameters and return values
+
+=item *
+
+Examples of use
+
+=item *
+
+Sources of further information
+
+=item *
+
+A contact email address for the author/maintainer
+
+=back
+
+The level of detail in Perl module documentation generally goes from
+less detailed to more detailed. Your SYNOPSIS section should contain a
+minimal example of use (perhaps as little as one line of code; skip the
+unusual use cases or anything not needed by most users); the
+DESCRIPTION should describe your module in broad terms, generally in
+just a few paragraphs; more detail of the module's routines or methods,
+lengthy code examples, or other in-depth material should be given in
+subsequent sections.
+
+Ideally, someone who's slightly familiar with your module should be able
+to refresh their memory without hitting "page down". As your reader
+continues through the document, they should receive a progressively
+greater amount of knowledge.
+
+The recommended order of sections in Perl module documentation is:
+
+=over 4
+
+=item *
+
+NAME
+
+=item *
+
+SYNOPSIS
+
+=item *
+
+DESCRIPTION
+
+=item *
+
+One or more sections or subsections giving greater detail of available
+methods and routines and any other relevant information.
+
+=item *
+
+BUGS/CAVEATS/etc
+
+=item *
+
+AUTHOR
+
+=item *
+
+SEE ALSO
+
+=item *
+
+COPYRIGHT and LICENSE
+
+=back
+
+Keep your documentation near the code it documents ("inline"
+documentation). Include POD for a given method right above that
+method's subroutine. This makes it easier to keep the documentation up
+to date, and avoids having to document each piece of code twice (once in
+POD and once in comments).
+
+=head2 README, INSTALL, release notes, changelogs
+
+Your module should also include a README file describing the module and
+giving pointers to further information (website, author email).
+
+An INSTALL file should be included, and should contain simple installation
+instructions. When using ExtUtils::MakeMaker this will usually be:
+
+=over 4
+
+=item perl Makefile.PL
+
+=item make
+
+=item make test
+
+=item make install
+
+=back
+
+When using Module::Build, this will usually be:
+
+=over 4
+
+=item perl Build.PL
+
+=item perl Build
+
+=item perl Build test
+
+=item perl Build install
+
+=back
+
+Release notes or changelogs should be produced for each release of your
+software describing user-visible changes to your module, in terms
+relevant to the user.
+
+=head1 RELEASE CONSIDERATIONS
+
+=head2 Version numbering
+
+Version numbers should indicate at least major and minor releases, and
+possibly sub-minor releases. A major release is one in which most of
+the functionality has changed, or in which major new functionality is
+added. A minor release is one in which a small amount of functionality
+has been added or changed. Sub-minor version numbers are usually used
+for changes which do not affect functionality, such as documentation
+patches.
+
+The most common CPAN version numbering scheme looks like this:
+
+ 1.00, 1.10, 1.11, 1.20, 1.30, 1.31, 1.32
+
+A correct CPAN version number is a floating point number with at least
+2 digits after the decimal. You can test whether it conforms to CPAN by
+using
+
+ perl -MExtUtils::MakeMaker -le 'print MM->parse_version(shift)' 'Foo.pm'
+
+If you want to release a 'beta' or 'alpha' version of a module but
+don't want CPAN.pm to list it as most recent use an '_' after the
+regular version number followed by at least 2 digits, eg. 1.20_01. If
+you do this, the following idiom is recommended:
+
+ $VERSION = "1.12_01";
+ $XS_VERSION = $VERSION; # only needed if you have XS code
+ $VERSION = eval $VERSION;
+
+With that trick MakeMaker will only read the first line and thus read
+the underscore, while the perl interpreter will evaluate the $VERSION
+and convert the string into a number. Later operations that treat
+$VERSION as a number will then be able to do so without provoking a
+warning about $VERSION not being a number.
+
+Never release anything (even a one-word documentation patch) without
+incrementing the number. Even a one-word documentation patch should
+result in a change in version at the sub-minor level.
+
+=head2 Pre-requisites
+
+Module authors should carefully consider whether to rely on other
+modules, and which modules to rely on.
+
+Most importantly, choose modules which are as stable as possible. In
+order of preference:
+
+=over 4
+
+=item *
+
+Core Perl modules
+
+=item *
+
+Stable CPAN modules
+
+=item *
+
+Unstable CPAN modules
+
+=item *
+
+Modules not available from CPAN
+
+=back
+
+Specify version requirements for other Perl modules in the
+pre-requisites in your Makefile.PL or Build.PL.
+
+Be sure to specify Perl version requirements both in Makefile.PL or
+Build.PL and with C<require 5.6.1> or similar. See the section on
+C<use VERSION> of L<perlfunc/require> for details.
+
+=head2 Testing
+
+All modules should be tested before distribution (using "make disttest"),
+and the tests should also be available to people installing the modules
+(using "make test").
+For Module::Build you would use the C<make test> equivalent C<perl Build test>.
+
+The importance of these tests is proportional to the alleged stability of a
+module -- a module which purports to be stable or which hopes to achieve wide
+use should adhere to as strict a testing regime as possible.
+
+Useful modules to help you write tests (with minimum impact on your
+development process or your time) include Test::Simple, Carp::Assert
+and Test::Inline.
+For more sophisticated test suites there are Test::More and Test::MockObject.
+
+=head2 Packaging
+
+Modules should be packaged using one of the standard packaging tools.
+Currently you have the choice between ExtUtils::MakeMaker and the
+more platform independent Module::Build, allowing modules to be installed in a
+consistent manner.
+When using ExtUtils::MakeMaker, you can use "make dist" to create your
+package. Tools exist to help you to build your module in a MakeMaker-friendly
+style. These include ExtUtils::ModuleMaker and h2xs. See also L<perlnewmod>.
+
+=head2 Licensing
+
+Make sure that your module has a license, and that the full text of it
+is included in the distribution (unless it's a common one and the terms
+of the license don't require you to include it).
+
+If you don't know what license to use, dual licensing under the GPL
+and Artistic licenses (the same as Perl itself) is a good idea.
+See L<perlgpl> and L<perlartistic>.
+
+=head1 COMMON PITFALLS
+
+=head2 Reinventing the wheel
+
+There are certain application spaces which are already very, very well
+served by CPAN. One example is templating systems, another is date and
+time modules, and there are many more. While it is a rite of passage to
+write your own version of these things, please consider carefully
+whether the Perl world really needs you to publish it.
+
+=head2 Trying to do too much
+
+Your module will be part of a developer's toolkit. It will not, in
+itself, form the B<entire> toolkit. It's tempting to add extra features
+until your code is a monolithic system rather than a set of modular
+building blocks.
+
+=head2 Inappropriate documentation
+
+Don't fall into the trap of writing for the wrong audience. Your
+primary audience is a reasonably experienced developer with at least
+a moderate understanding of your module's application domain, who's just
+downloaded your module and wants to start using it as quickly as possible.
+
+Tutorials, end-user documentation, research papers, FAQs etc are not
+appropriate in a module's main documentation. If you really want to
+write these, include them as sub-documents such as C<My::Module::Tutorial> or
+C<My::Module::FAQ> and provide a link in the SEE ALSO section of the
+main documentation.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<perlstyle>
+
+General Perl style guide
+
+=item L<perlnewmod>
+
+How to create a new module
+
+=item L<perlpod>
+
+POD documentation
+
+=item L<podchecker>
+
+Verifies your POD's correctness
+
+=item Packaging Tools
+
+L<ExtUtils::MakeMaker>, L<Module::Build>
+
+=item Testing tools
+
+L<Test::Simple>, L<Test::Inline>, L<Carp::Assert>, L<Test::More>, L<Test::MockObject>
+
+=item http://pause.perl.org/
+
+Perl Authors Upload Server. Contains links to information for module
+authors.
+
+=item Any good book on software engineering
+
+=back
+
+=head1 AUTHOR
+
+Kirrily "Skud" Robert <skud@cpan.org>
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlmpeix.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlmpeix.pod
new file mode 100755
index 00000000000..757055a7725
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlmpeix.pod
@@ -0,0 +1,730 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.mpeix - Perl/iX for HP e3000 MPE
+
+=head1 SYNOPSIS
+
+ http://www.bixby.org/mark/perlix.html
+ http://jazz.external.hp.com/src/hp_freeware/perl/
+ Perl language for MPE
+ Last updated January 12, 2006 @ 2100 UTC
+
+
+=head1 NOTE
+
+This is a podified version of the above-mentioned web page,
+podified by Jarkko Hietaniemi 2001-Jan-01.
+
+=head1 Binary distribution from HP
+
+The simplest way to obtain Perl for the MPE/iX is to go either of
+these URLs and follow the instructions within.
+
+http://jazz.external.hp.com/src/hp_freeware/perl/
+http://www.bixby.org/mark/perlix.html
+
+Use which ever one is more recent.
+
+
+=head1 What's New in Perl for MPE/iX
+
+January 12, 2006
+
+=over 4
+
+=item *
+
+Updated for perl-5.8.8 and perl-5.9.3 by Ken Hirsch.
+
+Simplified the build process by using the MPEAUTOCONF
+functionality in Mark Klein's ld.
+
+If you build this from scratch, make sure you have a version
+of ld which supports it. In the shell, type
+
+ ld --help
+ and look for AUTOCONF or MPEAUTOCONF near the bottom
+
+ or do this:
+ ld --help 2>&1 | grep AUTOCONF
+
+If you see don't see AUTOCONF or MPEAUTOCONF, make sure you get a new
+version.
+
+You also do not have to use mpeix/relink after building, so the
+recommend sequence is:
+
+ ./Configure -de
+
+ # or ./Configure -de -Dusedevel
+ # if you're building a development version
+
+ make
+ make test
+ # if you run this in a job, do "make test_notty"
+
+ make install
+
+Be prepared for a wait. These take much longer on MPE/iX than on a Unix
+system, because of a slow forking, mostly. On a lightly-loaded HP3000
+Series 979 running MPE/iX 7.5:
+
+ Configure: 1 hour
+ make: 1 hour 15 minutes
+ make test 1 hour 45 minutes
+
+Various socket problems were fixed in mpeix.c.
+
+Mark Klein provided a fixed sigsetjmp (that works with dynamic
+libraries) in mpeix_setjmp.c
+
+=back
+
+June 1, 2000
+
+=over 4
+
+=item *
+
+Rebuilt to be compatible with mod_perl. If you plan on using
+mod_perl, you MUST download and install this version of Perl/iX!
+
+=item *
+
+uselargefiles="undef": not available in MPE for POSIX files yet.
+
+=item *
+
+Now bundled with various add-on packages:
+
+=over 8
+
+=item *
+
+libnet (as seen on CPAN)
+
+=item *
+
+libwww-perl (LWP) which lets Perl programs behave like web browsers:
+
+ 1. #!/PERL/PUB/perl
+ 2. use LWP::Simple;
+ 3. $doc = get('http://www.bixby.org/mark/perlix.html'); # reads the
+ web page into variable $doc
+
+(http://www.bixby.org/mark/perlix.html)
+
+=item *
+
+mod_perl (just the perl portion; the actual DSO will be released
+soon with Apache/iX 1.3.12 from bixby.org). This module allows you to
+write high performance persistent Perl CGI scripts and all sorts of
+cool things. (http://perl.apache.org/)
+
+and much much more hiding under /PERL/PUB/.cpan/
+
+=item *
+
+The CPAN module now works for automatic downloading and
+installing of add-on packages:
+
+ 1. export FTP_PASSIVE=1
+ 2. perl -MCPAN -e shell
+ 3. Ignore any terminal I/O related complaints!
+
+(http://theoryx5.uwinnipeg.ca/CPAN/data/perl/CPAN.html)
+
+=back
+
+=back
+
+May 20, 2000
+
+=over 4
+
+=item *
+
+Updated to version 5.6.0. Builds straight out of the box on MPE/iX.
+
+=item *
+
+Perl's getpwnam() function which had regressed to being
+unimplemented on MPE is now implemented once again.
+
+=back
+
+September 17, 1999
+
+=over 4
+
+=item *
+
+Migrated from cccd.edu to bixby.org.
+
+=back
+
+=head1 Welcome to Perl/iX
+
+This is the official home page for the HP e3000 MPE/iX
+( http://www.hp.com/go/e3000 ) port of the Perl scripting
+language ( http://www.perl.com/ ) which gives you all of the power of C,
+awk, sed, and sh in a single language. Check here for the latest news,
+implemented functionality, known bugs, to-do list, etc. Status reports
+about major milestones will also be posted to the HP3000-L mailing list
+( http://www.lsoft.com/scripts/wl.exe?SL1=HP3000-L&H=RAVEN.UTC.EDU ) and
+its associated gatewayed newsgroup comp.sys.hp.mpe.
+
+I'm doing this port because I can't live without Perl on the Unix
+machines that I administer, and I want to have the same power
+available to me on MPE.
+
+Please send your comments, questions, and bug reports directly to me,
+Mark Bixby ( http://www.bixby.org/mark/ ). Or just post them to HP3000-L.
+
+The platform I'm using to do this port is an HP 3000 957RX running
+MPE/iX 6.0 and using the GNU gcc C compiler
+( http://jazz.external.hp.com/src/gnu/gnuframe.html ).
+
+The combined porting wisdom from all of my ports can be found in my
+MPE/iX Porting Guide (http://www.bixby.org/mark/porting.html).
+
+IMPORTANT NOTICE: Yes, I do work for the HP CSY R&D lab, but ALL of
+the software you download from bixby.org is my personal freeware that
+is NOT supported by HP.
+
+=head1 System Requirements for Perl/iX
+
+=over 4
+
+=item *
+
+MPE/iX 5.5 or later. This version of Perl/iX does NOT run on
+MPE/iX 5.0 or earlier, nor does it run on "classic" MPE/V machines.
+
+=item *
+
+If you wish to recompile Perl, you must install both GNUCORE and
+GNUGCC from jazz (http://jazz.external.hp.com/src/gnu/gnuframe.html).
+
+=item *
+
+Perl/iX will be happier on MPE/iX 5.5 if you install the MPEKX40B
+extended POSIX filename characters patch, but this is optional.
+
+=item *
+
+Patch LBCJXT6A is required on MPE/iX 5.5 machines in order to
+prevent Perl/iX from dying with an unresolved external reference
+to _getenv_libc.
+
+=item *
+
+If you will be compiling Perl/iX yourself, you will also need
+Syslog/iX ( http://www.bixby.org/mark/syslogix.html ) and the
+/BIND/PUB/include and /BIND/PUB/lib portions of BIND/iX
+( http://www.bixby.org/mark/bindix.html ).
+
+=back
+
+=head1 How to Obtain Perl/iX
+
+=over 4
+
+=item 1.
+
+Download Perl using either FTP.ARPA.SYS or some other client
+
+=item 2.
+
+Extract the installation script
+
+=item 3.
+
+Edit the installation script
+
+=item 4.
+
+Run the installation script
+
+=item 5.
+
+Convert your *.a system archive libraries to *.sl shared libraries
+
+=back
+
+Download Perl using FTP.ARPA.SYS from your HP 3000 (the preferred
+method).....
+
+ :HELLO MANAGER.SYS
+ :XEQ FTP.ARPA.SYS
+ open ftp.bixby.org
+ anonymous
+ your@email.address
+ bytestream
+ cd /pub/mpe
+ get perl-5.6.0-mpe.tar.Z /tmp/perl.tar.Z;disc=2147483647
+ exit
+
+.....Or download using some other generic web or ftp client (the alternate
+method)
+
+Download the following files (make sure that you use "binary mode" or
+whatever client feature that is 8-bit clean):
+
+=over 4
+
+=item *
+
+Perl from
+
+ http://www.bixby.org/ftp/pub/mpe/perl-5.6.0-mpe.tar.Z
+
+or
+
+ ftp://ftp.bixby.org/pub/mpe/perl-5.6.0-mpe.tar.Z
+
+=item *
+
+Upload those files to your HP 3000 in an 8-bit clean bytestream manner to:
+
+ /tmp/perl.tar.Z
+
+=item *
+
+Then extract the installation script (after both download methods)
+
+ :CHDIR /tmp
+ :XEQ TAR.HPBIN.SYS 'xvfopz /tmp/perl.tar.Z INSTALL'
+
+=item *
+
+Edit the installation script
+
+Examine the accounting structure creation commands and modify if
+necessary (adding additional capabilities, choosing a non-system
+volume set, etc).
+
+ :XEQ VI.HPBIN.SYS /tmp/INSTALL
+
+=item *
+
+Run the installation script.
+
+The accounting structure will be created and then all files will be
+extracted from the archive.
+
+ :XEQ SH.HPBIN.SYS /tmp/INSTALL
+
+=item *
+
+Convert your *.a system archive libraries to *.sl shared libraries
+
+You only have to do this ONCE on your MPE/iX 5.5 machine in order to
+convert /lib/lib*.a and /usr/lib/lib*.a libraries to their *.sl
+equivalents. This step should not be necessary on MPE/iX 6.0 or later
+machines because the 6.0 or later update process does it for you.
+
+ :XEQ SH.HPBIN.SYS /PERL/PUB/LIBSHP3K
+
+=back
+
+=head1 Perl/iX Distribution Contents Highlights
+
+=over 4
+
+=item README
+
+The file you're reading now.
+
+=item INSTALL
+
+Perl/iX Installation script.
+
+=item LIBSHP3K
+
+Script to convert *.a system archive libraries to *.sl shared libraries.
+
+=item PERL
+
+Perl NMPRG executable. A version-numbered backup copy also
+exists. You might wish to "ln -s /PERL/PUB/PERL /usr/local/bin/perl".
+
+=item .cpan/
+
+Much add-on source code downloaded with the CPAN module.
+
+=item lib/
+
+Perl libraries, both core and add-on.
+
+=item man/
+
+Perl man page documentation.
+
+=item public_html/feedback.cgi
+
+Sample feedback CGI form written in Perl.
+
+=item src/perl-5.6.0-mpe
+
+Source code.
+
+=back
+
+=head1 How to Compile Perl/iX
+
+=over 4
+
+=item 1.
+
+cd src/perl-5.6.0-mpe
+
+=item 2.
+
+Read the INSTALL file for the official instructions
+
+=item 3.
+
+./Configure -d
+
+=item 4.
+
+make
+
+=item 5.
+
+./mpeix/relink
+
+=item 6.
+
+make test (expect approximately 15 out of 11306 subtests to fail,
+mostly due to MPE not supporting hard links, UDP socket problems,
+and handling exit() return codes improperly)
+
+=item 7.
+
+make install
+
+=item 8.
+
+Optionally create symbolic links that point to the Perl
+executable, i.e. ln -s /PERL/PUB/PERL /usr/local/bin/perl
+
+=back
+
+The summary test results from "cd t; ./perl -I../lib harness":
+
+ Failed Test Status Wstat Total Fail Failed List of failed
+ ---------------------------------------------------------------------------
+ io/fs.t 29 8 27.59% 2-5, 7-9, 11
+ io/openpid.t 10 1 10.00% 7
+ lib/io_sock.t 14 1 7.14% 13
+ lib/io_udp.t 7 2 28.57% 3, 5
+ lib/posix.t 27 1 3.70% 12
+ op/lex_assign.t 187 1 0.53% 13
+ op/stat.t 58 1 1.72% 3
+ 15 tests and 94 subtests skipped.
+ Failed 7/236 test scripts, 97.03% okay. 15/11306 subtests failed, 99.87% okay.
+
+=head1 Getting Started with Perl/iX
+
+Create your Perl script files with "#!/PERL/PUB/perl" (or an
+equivalent symbolic link) as the first line. Use the chmod command to
+make sure that your script has execute permission. Run your script!
+
+Be sure to take a look at the CPAN module list
+( http://www.cpan.org/CPAN.html ). A wide variety of free Perl software
+is available. You can automatically download these packages by using
+the CPAN module ( http://theoryx5.uwinnipeg.ca/CPAN/data/perl/CPAN.html ).
+
+=head1 MPE/iX Implementation Considerations
+
+There some minor functionality issues to be aware of when comparing
+Perl for Unix (Perl/UX) to Perl/iX:
+
+=over 4
+
+=item *
+
+MPE gcc/ld doesn't properly support linking NMPRG executables against
+NMXL dynamic libraries, so you must manually run mpeix/relink after
+each re-build of Perl.
+
+=item *
+
+Perl/iX File::Copy will use MPE's /bin/cp command to copy files by
+name in order to preserve file attributes like file code.
+
+=item *
+
+MPE (and thus Perl/iX) lacks support for setgrent(), endgrent(),
+setpwent(), endpwent().
+
+=item *
+
+MPE (and thus Perl/iX) lacks support for hard links.
+
+=item *
+
+MPE requires GETPRIVMODE() in order to bind() to ports less than 1024.
+Perl/iX will call GETPRIVMODE() automatically on your behalf if you
+attempt to bind() to these low-numbered ports. Note that the Perl/iX
+executable and the PERL account do not normally have CAP=PM, so if you
+will be bind()-ing to these privileged ports, you will manually need
+to add PM capability as appropriate.
+
+=item *
+
+MPE requires that you bind() to an IP address of zero. Perl/iX
+automatically replaces the IP address that you pass to bind() with
+a zero.
+
+=item *
+
+MPE requires GETPRIVMODE() in order to setuid(). There are too many
+calls to setuid() within Perl/iX, so I have not attempted an automatic
+GETPRIVMODE() solution similar to bind().
+
+=back
+
+=head1 Known Perl/iX Bugs Under Investigation
+
+None.
+
+=head1 Perl/iX To-Do List
+
+=over 4
+
+=item *
+
+Make setuid()/setgid() support work.
+
+=item *
+
+Make sure that fcntl() against a socket descriptor is redirected to sfcntl().
+
+=item *
+
+Add support for Berkeley DB once I've finished porting Berkeley DB.
+
+=item *
+
+Write an MPE XS extension library containing miscellaneous important
+MPE functions like GETPRIVMODE(), GETUSERMODE(), and sfcntl().
+
+=back
+
+=head1 Perl/iX Change History
+
+May 6, 1999
+
+=over 4
+
+=item *
+
+Patch LBCJXT6A is required on MPE/iX 5.5 machines in order to prevent
+Perl/iX from dying with an unresolved external reference to _getenv_libc.
+
+=back
+
+April 7, 1999
+
+=over 4
+
+=item *
+
+Updated to version 5.005_03.
+
+=item *
+
+The official source distribution once again compiles "straight out
+of the box" for MPE.
+
+=item *
+
+The current incarnation of the 5.5 POSIX filename extended
+characters patch is now MPEKX40B.
+
+=item *
+
+The LIBSHP3K *.a -> *.sl library conversion script is now included
+as /PERL/PUB/LIBSHP3K.
+
+=back
+
+November 20, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.005_02.
+
+=item *
+
+Fixed a DynaLoader bug that was unable to load symbols from relative
+path name libraries.
+
+=item *
+
+Fixed a .xs compilation bug where the mpeixish.sh include file wasn't
+being installed into the proper directory.
+
+=item *
+
+All bugfixes will be submitted back to the official Perl developers.
+
+=item *
+
+The current incarnation of the POSIX filename extended characters
+patch is now MPEKXJ3A.
+
+=back
+
+August 14, 1998
+
+=over 4
+
+=item *
+
+The previous POSIX filename extended characters patch MPEKX44C has
+been superseded by MPEKXB5A.
+
+=back
+
+August 7, 1998
+
+=over 4
+
+=item *
+
+The previous POSIX filename extended characters patch MPEKX76A has
+been superseded by MPEKX44C.
+
+=back
+
+July 28, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.005_01.
+
+=back
+
+July 23, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.005 (production release). The public
+freeware sources are now 100% MPE-ready "straight out of the box".
+
+=back
+
+July 17, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.005b1 (public beta release). The public
+freeware sources are now 99.9% MPE-ready. By installing and
+testing this beta on your own HP3000, you will be helping to
+insure that the final release of 5.005 will be 100% MPE-ready and
+100% bug free.
+
+=item *
+
+My MPE binary release is now extracted using my standard INSTALL script.
+
+=back
+
+July 15, 1998
+
+=over 4
+
+=item *
+
+Changed startperl to #!/PERL/PUB/perl so that Perl will recognize
+scripts more easily and efficiently.
+
+=back
+
+July 8, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.004_70 (internal developer release) which is now
+MPE-ready. The next public freeware release of Perl should compile
+"straight out of the box" on MPE. Note that this version of Perl/iX
+was strictly internal to me and never publicly released. Note that
+[21]BIND/iX is now required (well, the include files and libbind.a) if
+you wish to compile Perl/iX.
+
+=back
+
+November 6, 1997
+
+=over 4
+
+=item *
+
+Updated to version 5.004_04. No changes in MPE-specific functionality.
+
+=back
+
+October 16, 1997
+
+=over 4
+
+=item *
+
+Added Demos section to the Perl/iX home page so you can see some
+sample Perl applications running on my 3000.
+
+=back
+
+October 3, 1997
+
+=over 4
+
+=item *
+
+Added System Requirements section to the Perl/iX home page just so the
+prerequisites stand out more. Various other home page tweaks.
+
+=back
+
+October 2, 1997
+
+=over 4
+
+=item *
+
+Initial public release.
+
+=back
+
+September 1997
+
+=over 4
+
+=item *
+
+Porting begins.
+
+=back
+
+=head1 AUTHOR
+
+Mark Bixby, http://www.bixby.org/mark/
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlmroapi.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlmroapi.pod
new file mode 100755
index 00000000000..2200becded2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlmroapi.pod
@@ -0,0 +1,94 @@
+=head1 NAME
+
+perlmroapi - Perl method resolution plugin interface
+
+=head1 DESCRIPTION
+
+As of Perl 5.10.1 there is a new interface for plugging and using method
+resolution orders other than the default (linear depth first search).
+The C3 method resolution order added in 5.10.0 has been re-implemented as
+a plugin, without changing its Perl-space interface.
+
+Each plugin should register itself with C<Perl_mro_register> by providing
+the following structure
+
+ struct mro_alg {
+ AV *(*resolve)(pTHX_ HV *stash, U32 level);
+ const char *name;
+ U16 length;
+ U16 kflags;
+ U32 hash;
+ };
+
+=over 4
+
+=item resolve
+
+Pointer to the linearisation function, described below.
+
+=item name
+
+Name of the MRO, either in ISO-8859-1 or UTF-8.
+
+=item length
+
+Length of the name.
+
+=item kflags
+
+If the name is given in UTF-8, set this to C<HVhek_UTF8>. The value is passed
+direct as the parameter I<kflags> to C<hv_common()>.
+
+=item hash
+
+A precomputed hash value for the MRO's name, or 0.
+
+=back
+
+=head1 Callbacks
+
+The C<resolve> function is called to generate a linearised ISA for the
+given stash, using this MRO. It is called with a pointer to the stash, and
+a I<level> of 0. The core always sets I<level> to 0 when it calls your
+function - the parameter is provided to allow your implementation to track
+depth if it needs to recurse.
+
+The function should return a reference to an array containing the parent
+classes in order. The caller is responsible for incrementing the reference
+count if it wants to keep the structure. Hence if you have created a
+temporary value that you keep no pointer to, C<sv_2mortal()> to ensure that
+it is disposed of correctly. If you have cached your return value, then
+return a pointer to it without changing the reference count.
+
+=head1 Caching
+
+Computing MROs can be expensive. The implementation provides a cache, in
+which you can store a single C<SV *>, or anything that can be cast to
+C<SV *>, such as C<AV *>. To read your private value, use the macro
+C<MRO_GET_PRIVATE_DATA()>, passing it the C<mro_meta> structure from the
+stash, and a pointer to your C<mro_alg> structure:
+
+ meta = HvMROMETA(stash);
+ private_sv = MRO_GET_PRIVATE_DATA(meta, &my_mro_alg);
+
+To set your private value, call C<Perl_mro_set_private_data()>:
+
+ Perl_mro_set_private_data(aTHX_ meta, &c3_alg, private_sv);
+
+The private data cache will take ownership of a reference to private_sv,
+much the same way that C<hv_store()> takes ownership of a reference to the
+value that you pass it.
+
+=head1 Examples
+
+For examples of MRO implementations, see C<S_mro_get_linear_isa_c3()>
+and the C<BOOT:> section of F<mro/mro.xs>, and C<S_mro_get_linear_isa_dfs()>
+in F<mro.c>
+
+=head1 AUTHORS
+
+The implementation of the C3 MRO and switchable MROs within the perl core was
+written by Brandon L Black. Nicholas Clark created the pluggable interface,
+refactored Brandon's implementation to work with it, and wrote this document.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlnetware.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlnetware.pod
new file mode 100755
index 00000000000..1e92b84890a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlnetware.pod
@@ -0,0 +1,214 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+perlnetware - Perl for NetWare
+
+=head1 DESCRIPTION
+
+This file gives instructions for building Perl 5.7 and above, and also
+Perl modules for NetWare. Before you start, you may want to read the
+README file found in the top level directory into which the Perl source
+code distribution was extracted. Make sure you read and understand
+the terms under which the software is being distributed.
+
+=head1 BUILD
+
+This section describes the steps to be performed to build a Perl NLM
+and other associated NLMs.
+
+=head2 Tools & SDK
+
+The build requires CodeWarrior compiler and linker. In addition,
+the "NetWare SDK", "NLM & NetWare Libraries for C" and
+"NetWare Server Protocol Libraries for C", all available at
+L<http://developer.novell.com/wiki/index.php/Category:Novell_Developer_Kit>,
+are required. Microsoft Visual C++ version 4.2 or later is also
+required.
+
+=head2 Setup
+
+The build process is dependent on the location of the NetWare SDK.
+Once the Tools & SDK are installed, the build environment has to
+be setup. The following batch files setup the environment.
+
+=over 4
+
+=item SetNWBld.bat
+
+The Execution of this file takes 2 parameters as input. The first
+being the NetWare SDK path, second being the path for CodeWarrior
+Compiler & tools. Execution of this file sets these paths and also
+sets the build type to Release by default.
+
+=item Buildtype.bat
+
+This is used to set the build type to debug or release. Change the
+build type only after executing SetNWBld.bat
+
+=item *
+
+Example:
+ 1. Typing "buildtype d on" at the command prompt causes the buildtype
+ to be set to Debug type with D2 flag set.
+ 2. Typing "buildtype d off" or "buildtype d" at the command prompt causes
+ the buildtype to be set to Debug type with D1 flag set.
+ 2. Typing "buildtype r" at the command prompt sets it to Release Build type.
+
+=back
+
+=head2 Make
+
+The make process runs only under WinNT shell. The NetWare makefile is
+located under the NetWare folder. This makes use of miniperl.exe to
+run some of the Perl scripts. To create miniperl.exe, first set the
+required paths for Visual c++ compilier (specify vcvars32 location) at
+the command prompt. Then run nmake from win32 folder through WinNT
+command prompt. The build process can be stopped after miniperl.exe
+is created. Then run nmake from NetWare folder through WinNT command
+prompt.
+
+Currently the following two build types are tested on NetWare:
+
+=over 4
+
+=item *
+
+USE_MULTI, USE_ITHREADS & USE_IMP_SYS defined
+
+=item *
+
+USE_MULTI & USE_IMP_SYS defined and USE_ITHREADS not defined
+
+=back
+
+=head2 Interpreter
+
+Once miniperl.exe creation is over, run nmake from the NetWare folder.
+This will build the Perl interpreter for NetWare as I<perl.nlm>.
+This is copied under the I<Release> folder if you are doing
+a release build, else will be copied under I<Debug> folder for debug builds.
+
+=head2 Extensions
+
+The make process also creates the Perl extensions as I<<Extension>.nlm>
+
+=head1 INSTALL
+
+To install NetWare Perl onto a NetWare server, first map the Sys
+volume of a NetWare server to I<i:>. This is because the makefile by
+default sets the drive letter to I<i:>. Type I<nmake nwinstall> from
+NetWare folder on a WinNT command prompt. This will copy the binaries
+and module files onto the NetWare server under I<sys:\Perl>
+folder. The Perl interpreter, I<perl.nlm>, is copied under
+I<sys:\perl\system> folder. Copy this to I<sys:\system> folder.
+
+Example: At the command prompt Type "nmake nwinstall".
+ This will install NetWare Perl on the NetWare Server.
+ Similiarly if you type "nmake install",
+ This will cause the binaries to be installed on the local machine.
+ (Typically under the c:\perl folder)
+
+=head1 BUILD NEW EXTENSIONS
+
+To build extensions other than standard extensions, NetWare Perl has
+to be installed on Windows along with Windows Perl. The Perl for
+Windows can be either downloaded from the CPAN site and built using
+the sources, or the binaries can be directly downloaded from the
+ActiveState site. Installation can be done by invoking I<nmake
+install> from the NetWare folder on a WinNT command prompt after
+building NetWare Perl by following steps given above. This will copy
+all the *.pm files and other required files. Documentation files are
+not copied. Thus one must first install Windows Perl, Then install
+NetWare Perl.
+
+Once this is done, do the following to build any extension:
+
+=over 4
+
+=item *
+
+Change to the extension directory where its source files are present.
+
+=item *
+
+Run the following command at the command prompt:
+
+ perl -II<path to NetWare lib dir> -II<path to lib> Makefile.pl
+
+Example:
+
+ perl -Ic:/perl/5.6.1/lib/NetWare-x86-multi-thread -Ic:\perl\5.6.1\lib MakeFile.pl
+
+or
+
+ perl -Ic:/perl/5.8.0/lib/NetWare-x86-multi-thread -Ic:\perl\5.8.0\lib MakeFile.pl
+
+=item *
+
+nmake
+
+=item *
+
+nmake install
+
+Install will copy the files into the Windows machine where NetWare
+Perl is installed and these files may have to be copied to the NetWare
+server manually. Alternatively, pass I<INSTALLSITELIB=i:\perl\lib> as
+an input to makefile.pl above. Here I<i:> is the mapped drive to the
+sys: volume of the server where Perl on NetWare is installed. Now
+typing I<nmake install>, will copy the files onto the NetWare server.
+
+Example: You can execute the following on the command prompt.
+
+ perl -Ic:/perl/5.6.1/lib/NetWare-x86-multi-thread -Ic:\perl\5.6.1\lib MakeFile.pl
+ INSTALLSITELIB=i:\perl\lib
+
+or
+
+ perl -Ic:/perl/5.8.0/lib/NetWare-x86-multi-thread -Ic:\perl\5.8.0\lib MakeFile.pl
+ INSTALLSITELIB=i:\perl\lib
+
+=item *
+
+Note: Some modules downloaded from CPAN may require NetWare related
+API in order to build on NetWare. Other modules may however build
+smoothly with or without minor changes depending on the type of
+module.
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+The makefile for Win32 is used as a reference to create the makefile
+for NetWare. Also, the make process for NetWare port uses
+miniperl.exe to run scripts during the make and installation process.
+
+=head1 AUTHORS
+
+Anantha Kesari H Y (hyanantha@novell.com)
+Aditya C (caditya@novell.com)
+
+=head1 DATE
+
+=over 4
+
+=item *
+
+Created - 18 Jan 2001
+
+=item *
+
+Modified - 25 June 2001
+
+=item *
+
+Modified - 13 July 2001
+
+=item *
+
+Modified - 28 May 2002
+
+=back
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlnewmod.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlnewmod.pod
new file mode 100755
index 00000000000..d8bd4003c6c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlnewmod.pod
@@ -0,0 +1,280 @@
+=head1 NAME
+
+perlnewmod - preparing a new module for distribution
+
+=head1 DESCRIPTION
+
+This document gives you some suggestions about how to go about writing
+Perl modules, preparing them for distribution, and making them available
+via CPAN.
+
+One of the things that makes Perl really powerful is the fact that Perl
+hackers tend to want to share the solutions to problems they've faced,
+so you and I don't have to battle with the same problem again.
+
+The main way they do this is by abstracting the solution into a Perl
+module. If you don't know what one of these is, the rest of this
+document isn't going to be much use to you. You're also missing out on
+an awful lot of useful code; consider having a look at L<perlmod>,
+L<perlmodlib> and L<perlmodinstall> before coming back here.
+
+When you've found that there isn't a module available for what you're
+trying to do, and you've had to write the code yourself, consider
+packaging up the solution into a module and uploading it to CPAN so that
+others can benefit.
+
+=head2 Warning
+
+We're going to primarily concentrate on Perl-only modules here, rather
+than XS modules. XS modules serve a rather different purpose, and
+you should consider different things before distributing them - the
+popularity of the library you are gluing, the portability to other
+operating systems, and so on. However, the notes on preparing the Perl
+side of the module and packaging and distributing it will apply equally
+well to an XS module as a pure-Perl one.
+
+=head2 What should I make into a module?
+
+You should make a module out of any code that you think is going to be
+useful to others. Anything that's likely to fill a hole in the communal
+library and which someone else can slot directly into their program. Any
+part of your code which you can isolate and extract and plug into
+something else is a likely candidate.
+
+Let's take an example. Suppose you're reading in data from a local
+format into a hash-of-hashes in Perl, turning that into a tree, walking
+the tree and then piping each node to an Acme Transmogrifier Server.
+
+Now, quite a few people have the Acme Transmogrifier, and you've had to
+write something to talk the protocol from scratch - you'd almost
+certainly want to make that into a module. The level at which you pitch
+it is up to you: you might want protocol-level modules analogous to
+L<Net::SMTP|Net::SMTP> which then talk to higher level modules analogous
+to L<Mail::Send|Mail::Send>. The choice is yours, but you do want to get
+a module out for that server protocol.
+
+Nobody else on the planet is going to talk your local data format, so we
+can ignore that. But what about the thing in the middle? Building tree
+structures from Perl variables and then traversing them is a nice,
+general problem, and if nobody's already written a module that does
+that, you might want to modularise that code too.
+
+So hopefully you've now got a few ideas about what's good to modularise.
+Let's now see how it's done.
+
+=head2 Step-by-step: Preparing the ground
+
+Before we even start scraping out the code, there are a few things we'll
+want to do in advance.
+
+=over 3
+
+=item Look around
+
+Dig into a bunch of modules to see how they're written. I'd suggest
+starting with L<Text::Tabs|Text::Tabs>, since it's in the standard
+library and is nice and simple, and then looking at something a little
+more complex like L<File::Copy|File::Copy>. For object oriented
+code, C<WWW::Mechanize> or the C<Email::*> modules provide some good
+examples.
+
+These should give you an overall feel for how modules are laid out and
+written.
+
+=item Check it's new
+
+There are a lot of modules on CPAN, and it's easy to miss one that's
+similar to what you're planning on contributing. Have a good plough
+through the L<http://search.cpan.org> and make sure you're not the one
+reinventing the wheel!
+
+=item Discuss the need
+
+You might love it. You might feel that everyone else needs it. But there
+might not actually be any real demand for it out there. If you're unsure
+about the demand your module will have, consider sending out feelers
+on the C<comp.lang.perl.modules> newsgroup, or as a last resort, ask the
+modules list at C<modules@perl.org>. Remember that this is a closed list
+with a very long turn-around time - be prepared to wait a good while for
+a response from them.
+
+=item Choose a name
+
+Perl modules included on CPAN have a naming hierarchy you should try to
+fit in with. See L<perlmodlib> for more details on how this works, and
+browse around CPAN and the modules list to get a feel of it. At the very
+least, remember this: modules should be title capitalised, (This::Thing)
+fit in with a category, and explain their purpose succinctly.
+
+=item Check again
+
+While you're doing that, make really sure you haven't missed a module
+similar to the one you're about to write.
+
+When you've got your name sorted out and you're sure that your module is
+wanted and not currently available, it's time to start coding.
+
+=back
+
+=head2 Step-by-step: Making the module
+
+=over 3
+
+=item Start with F<module-starter> or F<h2xs>
+
+The F<module-starter> utility is distributed as part of the
+L<Module::Starter|Module::Starter> CPAN package. It creates a directory
+with stubs of all the necessary files to start a new module, according
+to recent "best practice" for module development, and is invoked from
+the command line, thus:
+
+ module-starter --module=Foo::Bar \
+ --author="Your Name" --email=yourname@cpan.org
+
+If you do not wish to install the L<Module::Starter|Module::Starter>
+package from CPAN, F<h2xs> is an older tool, originally intended for the
+development of XS modules, which comes packaged with the Perl
+distribution.
+
+A typical invocation of L<h2xs|h2xs> for a pure Perl module is:
+
+ h2xs -AX --skip-exporter --use-new-tests -n Foo::Bar
+
+The C<-A> omits the Autoloader code, C<-X> omits XS elements,
+C<--skip-exporter> omits the Exporter code, C<--use-new-tests> sets up a
+modern testing environment, and C<-n> specifies the name of the module.
+
+=item Use L<strict|strict> and L<warnings|warnings>
+
+A module's code has to be warning and strict-clean, since you can't
+guarantee the conditions that it'll be used under. Besides, you wouldn't
+want to distribute code that wasn't warning or strict-clean anyway,
+right?
+
+=item Use L<Carp|Carp>
+
+The L<Carp|Carp> module allows you to present your error messages from
+the caller's perspective; this gives you a way to signal a problem with
+the caller and not your module. For instance, if you say this:
+
+ warn "No hostname given";
+
+the user will see something like this:
+
+ No hostname given at /usr/local/lib/perl5/site_perl/5.6.0/Net/Acme.pm
+ line 123.
+
+which looks like your module is doing something wrong. Instead, you want
+to put the blame on the user, and say this:
+
+ No hostname given at bad_code, line 10.
+
+You do this by using L<Carp|Carp> and replacing your C<warn>s with
+C<carp>s. If you need to C<die>, say C<croak> instead. However, keep
+C<warn> and C<die> in place for your sanity checks - where it really is
+your module at fault.
+
+=item Use L<Exporter|Exporter> - wisely!
+
+L<Exporter|Exporter> gives you a standard way of exporting symbols and
+subroutines from your module into the caller's namespace. For instance,
+saying C<use Net::Acme qw(&frob)> would import the C<frob> subroutine.
+
+The package variable C<@EXPORT> will determine which symbols will get
+exported when the caller simply says C<use Net::Acme> - you will hardly
+ever want to put anything in there. C<@EXPORT_OK>, on the other hand,
+specifies which symbols you're willing to export. If you do want to
+export a bunch of symbols, use the C<%EXPORT_TAGS> and define a standard
+export set - look at L<Exporter> for more details.
+
+=item Use L<plain old documentation|perlpod>
+
+The work isn't over until the paperwork is done, and you're going to
+need to put in some time writing some documentation for your module.
+C<module-starter> or C<h2xs> will provide a stub for you to fill in; if
+you're not sure about the format, look at L<perlpod> for an
+introduction. Provide a good synopsis of how your module is used in
+code, a description, and then notes on the syntax and function of the
+individual subroutines or methods. Use Perl comments for developer notes
+and POD for end-user notes.
+
+=item Write tests
+
+You're encouraged to create self-tests for your module to ensure it's
+working as intended on the myriad platforms Perl supports; if you upload
+your module to CPAN, a host of testers will build your module and send
+you the results of the tests. Again, C<module-starter> and C<h2xs>
+provide a test framework which you can extend - you should do something
+more than just checking your module will compile.
+L<Test::Simple|Test::Simple> and L<Test::More|Test::More> are good
+places to start when writing a test suite.
+
+=item Write the README
+
+If you're uploading to CPAN, the automated gremlins will extract the
+README file and place that in your CPAN directory. It'll also appear in
+the main F<by-module> and F<by-category> directories if you make it onto
+the modules list. It's a good idea to put here what the module actually
+does in detail, and the user-visible changes since the last release.
+
+=back
+
+=head2 Step-by-step: Distributing your module
+
+=over 3
+
+=item Get a CPAN user ID
+
+Every developer publishing modules on CPAN needs a CPAN ID. Visit
+C<http://pause.perl.org/>, select "Request PAUSE Account", and wait for
+your request to be approved by the PAUSE administrators.
+
+=item C<perl Makefile.PL; make test; make dist>
+
+Once again, C<module-starter> or C<h2xs> has done all the work for you.
+They produce the standard C<Makefile.PL> you see when you download and
+install modules, and this produces a Makefile with a C<dist> target.
+
+Once you've ensured that your module passes its own tests - always a
+good thing to make sure - you can C<make dist>, and the Makefile will
+hopefully produce you a nice tarball of your module, ready for upload.
+
+=item Upload the tarball
+
+The email you got when you received your CPAN ID will tell you how to
+log in to PAUSE, the Perl Authors Upload SErver. From the menus there,
+you can upload your module to CPAN.
+
+=item Announce to the modules list
+
+Once uploaded, it'll sit unnoticed in your author directory. If you want
+it connected to the rest of the CPAN, you'll need to go to "Register
+Namespace" on PAUSE. Once registered, your module will appear in the
+by-module and by-category listings on CPAN.
+
+=item Announce to clpa
+
+If you have a burning desire to tell the world about your release, post
+an announcement to the moderated C<comp.lang.perl.announce> newsgroup.
+
+=item Fix bugs!
+
+Once you start accumulating users, they'll send you bug reports. If
+you're lucky, they'll even send you patches. Welcome to the joys of
+maintaining a software project...
+
+=back
+
+=head1 AUTHOR
+
+Simon Cozens, C<simon@cpan.org>
+
+Updated by Kirrily "Skud" Robert, C<skud@cpan.org>
+
+=head1 SEE ALSO
+
+L<perlmod>, L<perlmodlib>, L<perlmodinstall>, L<h2xs>, L<strict>,
+L<Carp>, L<Exporter>, L<perlpod>, L<Test::Simple>, L<Test::More>
+L<ExtUtils::MakeMaker>, L<Module::Build>, L<Module::Starter>
+http://www.cpan.org/ , Ken Williams' tutorial on building your own
+module at http://mathforum.org/~ken/perl_modules.html
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlnumber.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlnumber.pod
new file mode 100755
index 00000000000..ffe3ed5b432
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlnumber.pod
@@ -0,0 +1,209 @@
+=head1 NAME
+
+perlnumber - semantics of numbers and numeric operations in Perl
+
+=head1 SYNOPSIS
+
+ $n = 1234; # decimal integer
+ $n = 0b1110011; # binary integer
+ $n = 01234; # octal integer
+ $n = 0x1234; # hexadecimal integer
+ $n = 12.34e-56; # exponential notation
+ $n = "-12.34e56"; # number specified as a string
+ $n = "1234"; # number specified as a string
+
+=head1 DESCRIPTION
+
+This document describes how Perl internally handles numeric values.
+
+Perl's operator overloading facility is completely ignored here. Operator
+overloading allows user-defined behaviors for numbers, such as operations
+over arbitrarily large integers, floating points numbers with arbitrary
+precision, operations over "exotic" numbers such as modular arithmetic or
+p-adic arithmetic, and so on. See L<overload> for details.
+
+=head1 Storing numbers
+
+Perl can internally represent numbers in 3 different ways: as native
+integers, as native floating point numbers, and as decimal strings.
+Decimal strings may have an exponential notation part, as in C<"12.34e-56">.
+I<Native> here means "a format supported by the C compiler which was used
+to build perl".
+
+The term "native" does not mean quite as much when we talk about native
+integers, as it does when native floating point numbers are involved.
+The only implication of the term "native" on integers is that the limits for
+the maximal and the minimal supported true integral quantities are close to
+powers of 2. However, "native" floats have a most fundamental
+restriction: they may represent only those numbers which have a relatively
+"short" representation when converted to a binary fraction. For example,
+0.9 cannot be represented by a native float, since the binary fraction
+for 0.9 is infinite:
+
+ binary0.1110011001100...
+
+with the sequence C<1100> repeating again and again. In addition to this
+limitation, the exponent of the binary number is also restricted when it
+is represented as a floating point number. On typical hardware, floating
+point values can store numbers with up to 53 binary digits, and with binary
+exponents between -1024 and 1024. In decimal representation this is close
+to 16 decimal digits and decimal exponents in the range of -304..304.
+The upshot of all this is that Perl cannot store a number like
+12345678901234567 as a floating point number on such architectures without
+loss of information.
+
+Similarly, decimal strings can represent only those numbers which have a
+finite decimal expansion. Being strings, and thus of arbitrary length, there
+is no practical limit for the exponent or number of decimal digits for these
+numbers. (But realize that what we are discussing the rules for just the
+I<storage> of these numbers. The fact that you can store such "large" numbers
+does not mean that the I<operations> over these numbers will use all
+of the significant digits.
+See L<"Numeric operators and numeric conversions"> for details.)
+
+In fact numbers stored in the native integer format may be stored either
+in the signed native form, or in the unsigned native form. Thus the limits
+for Perl numbers stored as native integers would typically be -2**31..2**32-1,
+with appropriate modifications in the case of 64-bit integers. Again, this
+does not mean that Perl can do operations only over integers in this range:
+it is possible to store many more integers in floating point format.
+
+Summing up, Perl numeric values can store only those numbers which have
+a finite decimal expansion or a "short" binary expansion.
+
+=head1 Numeric operators and numeric conversions
+
+As mentioned earlier, Perl can store a number in any one of three formats,
+but most operators typically understand only one of those formats. When
+a numeric value is passed as an argument to such an operator, it will be
+converted to the format understood by the operator.
+
+Six such conversions are possible:
+
+ native integer --> native floating point (*)
+ native integer --> decimal string
+ native floating_point --> native integer (*)
+ native floating_point --> decimal string (*)
+ decimal string --> native integer
+ decimal string --> native floating point (*)
+
+These conversions are governed by the following general rules:
+
+=over 4
+
+=item *
+
+If the source number can be represented in the target form, that
+representation is used.
+
+=item *
+
+If the source number is outside of the limits representable in the target form,
+a representation of the closest limit is used. (I<Loss of information>)
+
+=item *
+
+If the source number is between two numbers representable in the target form,
+a representation of one of these numbers is used. (I<Loss of information>)
+
+=item *
+
+In C<< native floating point --> native integer >> conversions the magnitude
+of the result is less than or equal to the magnitude of the source.
+(I<"Rounding to zero".>)
+
+=item *
+
+If the C<< decimal string --> native integer >> conversion cannot be done
+without loss of information, the result is compatible with the conversion
+sequence C<< decimal_string --> native_floating_point --> native_integer >>.
+In particular, rounding is strongly biased to 0, though a number like
+C<"0.99999999999999999999"> has a chance of being rounded to 1.
+
+=back
+
+B<RESTRICTION>: The conversions marked with C<(*)> above involve steps
+performed by the C compiler. In particular, bugs/features of the compiler
+used may lead to breakage of some of the above rules.
+
+=head1 Flavors of Perl numeric operations
+
+Perl operations which take a numeric argument treat that argument in one
+of four different ways: they may force it to one of the integer/floating/
+string formats, or they may behave differently depending on the format of
+the operand. Forcing a numeric value to a particular format does not
+change the number stored in the value.
+
+All the operators which need an argument in the integer format treat the
+argument as in modular arithmetic, e.g., C<mod 2**32> on a 32-bit
+architecture. C<sprintf "%u", -1> therefore provides the same result as
+C<sprintf "%u", ~0>.
+
+=over 4
+
+=item Arithmetic operators
+
+The binary operators C<+> C<-> C<*> C</> C<%> C<==> C<!=> C<E<gt>> C<E<lt>>
+C<E<gt>=> C<E<lt>=> and the unary operators C<-> C<abs> and C<--> will
+attempt to convert arguments to integers. If both conversions are possible
+without loss of precision, and the operation can be performed without
+loss of precision then the integer result is used. Otherwise arguments are
+converted to floating point format and the floating point result is used.
+The caching of conversions (as described above) means that the integer
+conversion does not throw away fractional parts on floating point numbers.
+
+=item ++
+
+C<++> behaves as the other operators above, except that if it is a string
+matching the format C</^[a-zA-Z]*[0-9]*\z/> the string increment described
+in L<perlop> is used.
+
+=item Arithmetic operators during C<use integer>
+
+In scopes where C<use integer;> is in force, nearly all the operators listed
+above will force their argument(s) into integer format, and return an integer
+result. The exceptions, C<abs>, C<++> and C<-->, do not change their
+behavior with C<use integer;>
+
+=item Other mathematical operators
+
+Operators such as C<**>, C<sin> and C<exp> force arguments to floating point
+format.
+
+=item Bitwise operators
+
+Arguments are forced into the integer format if not strings.
+
+=item Bitwise operators during C<use integer>
+
+forces arguments to integer format. Also shift operations internally use
+signed integers rather than the default unsigned.
+
+=item Operators which expect an integer
+
+force the argument into the integer format. This is applicable
+to the third and fourth arguments of C<sysread>, for example.
+
+=item Operators which expect a string
+
+force the argument into the string format. For example, this is
+applicable to C<printf "%s", $value>.
+
+=back
+
+Though forcing an argument into a particular form does not change the
+stored number, Perl remembers the result of such conversions. In
+particular, though the first such conversion may be time-consuming,
+repeated operations will not need to redo the conversion.
+
+=head1 AUTHOR
+
+Ilya Zakharevich C<ilya@math.ohio-state.edu>
+
+Editorial adjustments by Gurusamy Sarathy <gsar@ActiveState.com>
+
+Updates for 5.8.0 by Nicholas Clark <nick@ccl4.org>
+
+=head1 SEE ALSO
+
+L<overload>, L<perlop>
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlobj.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlobj.pod
new file mode 100755
index 00000000000..44ae4535ab3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlobj.pod
@@ -0,0 +1,586 @@
+=head1 NAME
+X<object> X<OOP>
+
+perlobj - Perl objects
+
+=head1 DESCRIPTION
+
+First you need to understand what references are in Perl.
+See L<perlref> for that. Second, if you still find the following
+reference work too complicated, a tutorial on object-oriented programming
+in Perl can be found in L<perltoot> and L<perltooc>.
+
+If you're still with us, then
+here are three very simple definitions that you should find reassuring.
+
+=over 4
+
+=item 1.
+
+An object is simply a reference that happens to know which class it
+belongs to.
+
+=item 2.
+
+A class is simply a package that happens to provide methods to deal
+with object references.
+
+=item 3.
+
+A method is simply a subroutine that expects an object reference (or
+a package name, for class methods) as the first argument.
+
+=back
+
+We'll cover these points now in more depth.
+
+=head2 An Object is Simply a Reference
+X<object> X<bless> X<constructor> X<new>
+
+Unlike say C++, Perl doesn't provide any special syntax for
+constructors. A constructor is merely a subroutine that returns a
+reference to something "blessed" into a class, generally the
+class that the subroutine is defined in. Here is a typical
+constructor:
+
+ package Critter;
+ sub new { bless {} }
+
+That word C<new> isn't special. You could have written
+a construct this way, too:
+
+ package Critter;
+ sub spawn { bless {} }
+
+This might even be preferable, because the C++ programmers won't
+be tricked into thinking that C<new> works in Perl as it does in C++.
+It doesn't. We recommend that you name your constructors whatever
+makes sense in the context of the problem you're solving. For example,
+constructors in the Tk extension to Perl are named after the widgets
+they create.
+
+One thing that's different about Perl constructors compared with those in
+C++ is that in Perl, they have to allocate their own memory. (The other
+things is that they don't automatically call overridden base-class
+constructors.) The C<{}> allocates an anonymous hash containing no
+key/value pairs, and returns it The bless() takes that reference and
+tells the object it references that it's now a Critter, and returns
+the reference. This is for convenience, because the referenced object
+itself knows that it has been blessed, and the reference to it could
+have been returned directly, like this:
+
+ sub new {
+ my $self = {};
+ bless $self;
+ return $self;
+ }
+
+You often see such a thing in more complicated constructors
+that wish to call methods in the class as part of the construction:
+
+ sub new {
+ my $self = {};
+ bless $self;
+ $self->initialize();
+ return $self;
+ }
+
+If you care about inheritance (and you should; see
+L<perlmodlib/"Modules: Creation, Use, and Abuse">),
+then you want to use the two-arg form of bless
+so that your constructors may be inherited:
+
+ sub new {
+ my $class = shift;
+ my $self = {};
+ bless $self, $class;
+ $self->initialize();
+ return $self;
+ }
+
+Or if you expect people to call not just C<< CLASS->new() >> but also
+C<< $obj->new() >>, then use something like the following. (Note that using
+this to call new() on an instance does not automatically perform any
+copying. If you want a shallow or deep copy of an object, you'll have to
+specifically allow for that.) The initialize() method used will be of
+whatever $class we blessed the object into:
+
+ sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my $self = {};
+ bless $self, $class;
+ $self->initialize();
+ return $self;
+ }
+
+Within the class package, the methods will typically deal with the
+reference as an ordinary reference. Outside the class package,
+the reference is generally treated as an opaque value that may
+be accessed only through the class's methods.
+
+Although a constructor can in theory re-bless a referenced object
+currently belonging to another class, this is almost certainly going
+to get you into trouble. The new class is responsible for all
+cleanup later. The previous blessing is forgotten, as an object
+may belong to only one class at a time. (Although of course it's
+free to inherit methods from many classes.) If you find yourself
+having to do this, the parent class is probably misbehaving, though.
+
+A clarification: Perl objects are blessed. References are not. Objects
+know which package they belong to. References do not. The bless()
+function uses the reference to find the object. Consider
+the following example:
+
+ $a = {};
+ $b = $a;
+ bless $a, BLAH;
+ print "\$b is a ", ref($b), "\n";
+
+This reports $b as being a BLAH, so obviously bless()
+operated on the object and not on the reference.
+
+=head2 A Class is Simply a Package
+X<class> X<package> X<@ISA> X<inheritance>
+
+Unlike say C++, Perl doesn't provide any special syntax for class
+definitions. You use a package as a class by putting method
+definitions into the class.
+
+There is a special array within each package called @ISA, which says
+where else to look for a method if you can't find it in the current
+package. This is how Perl implements inheritance. Each element of the
+@ISA array is just the name of another package that happens to be a
+class package. The classes are searched for missing methods in
+depth-first, left-to-right order by default (see L<mro> for alternative
+search order and other in-depth information). The classes accessible
+through @ISA are known as base classes of the current class.
+
+All classes implicitly inherit from class C<UNIVERSAL> as their
+last base class. Several commonly used methods are automatically
+supplied in the UNIVERSAL class; see L<"Default UNIVERSAL methods"> or
+L<UNIVERSAL|UNIVERSAL> for more details.
+X<UNIVERSAL> X<base class> X<class, base>
+
+If a missing method is found in a base class, it is cached
+in the current class for efficiency. Changing @ISA or defining new
+subroutines invalidates the cache and causes Perl to do the lookup again.
+
+If neither the current class, its named base classes, nor the UNIVERSAL
+class contains the requested method, these three places are searched
+all over again, this time looking for a method named AUTOLOAD(). If an
+AUTOLOAD is found, this method is called on behalf of the missing method,
+setting the package global $AUTOLOAD to be the fully qualified name of
+the method that was intended to be called.
+X<AUTOLOAD>
+
+If none of that works, Perl finally gives up and complains.
+
+If you want to stop the AUTOLOAD inheritance say simply
+X<AUTOLOAD>
+
+ sub AUTOLOAD;
+
+and the call will die using the name of the sub being called.
+
+Perl classes do method inheritance only. Data inheritance is left up
+to the class itself. By and large, this is not a problem in Perl,
+because most classes model the attributes of their object using an
+anonymous hash, which serves as its own little namespace to be carved up
+by the various classes that might want to do something with the object.
+The only problem with this is that you can't sure that you aren't using
+a piece of the hash that isn't already used. A reasonable workaround
+is to prepend your fieldname in the hash with the package name.
+X<inheritance, method> X<inheritance, data>
+
+ sub bump {
+ my $self = shift;
+ $self->{ __PACKAGE__ . ".count"}++;
+ }
+
+=head2 A Method is Simply a Subroutine
+X<method>
+
+Unlike say C++, Perl doesn't provide any special syntax for method
+definition. (It does provide a little syntax for method invocation
+though. More on that later.) A method expects its first argument
+to be the object (reference) or package (string) it is being invoked
+on. There are two ways of calling methods, which we'll call class
+methods and instance methods.
+
+A class method expects a class name as the first argument. It
+provides functionality for the class as a whole, not for any
+individual object belonging to the class. Constructors are often
+class methods, but see L<perltoot> and L<perltooc> for alternatives.
+Many class methods simply ignore their first argument, because they
+already know what package they're in and don't care what package
+they were invoked via. (These aren't necessarily the same, because
+class methods follow the inheritance tree just like ordinary instance
+methods.) Another typical use for class methods is to look up an
+object by name:
+
+ sub find {
+ my ($class, $name) = @_;
+ $objtable{$name};
+ }
+
+An instance method expects an object reference as its first argument.
+Typically it shifts the first argument into a "self" or "this" variable,
+and then uses that as an ordinary reference.
+
+ sub display {
+ my $self = shift;
+ my @keys = @_ ? @_ : sort keys %$self;
+ foreach $key (@keys) {
+ print "\t$key => $self->{$key}\n";
+ }
+ }
+
+=head2 Method Invocation
+X<invocation> X<method> X<arrow> X<< -> >>
+
+For various historical and other reasons, Perl offers two equivalent
+ways to write a method call. The simpler and more common way is to use
+the arrow notation:
+
+ my $fred = Critter->find("Fred");
+ $fred->display("Height", "Weight");
+
+You should already be familiar with the use of the C<< -> >> operator with
+references. In fact, since C<$fred> above is a reference to an object,
+you could think of the method call as just another form of
+dereferencing.
+
+Whatever is on the left side of the arrow, whether a reference or a
+class name, is passed to the method subroutine as its first argument.
+So the above code is mostly equivalent to:
+
+ my $fred = Critter::find("Critter", "Fred");
+ Critter::display($fred, "Height", "Weight");
+
+How does Perl know which package the subroutine is in? By looking at
+the left side of the arrow, which must be either a package name or a
+reference to an object, i.e. something that has been blessed to a
+package. Either way, that's the package where Perl starts looking. If
+that package has no subroutine with that name, Perl starts looking for
+it in any base classes of that package, and so on.
+
+If you need to, you I<can> force Perl to start looking in some other package:
+
+ my $barney = MyCritter->Critter::find("Barney");
+ $barney->Critter::display("Height", "Weight");
+
+Here C<MyCritter> is presumably a subclass of C<Critter> that defines
+its own versions of find() and display(). We haven't specified what
+those methods do, but that doesn't matter above since we've forced Perl
+to start looking for the subroutines in C<Critter>.
+
+As a special case of the above, you may use the C<SUPER> pseudo-class to
+tell Perl to start looking for the method in the packages named in the
+current class's C<@ISA> list.
+X<SUPER>
+
+ package MyCritter;
+ use base 'Critter'; # sets @MyCritter::ISA = ('Critter');
+
+ sub display {
+ my ($self, @args) = @_;
+ $self->SUPER::display("Name", @args);
+ }
+
+It is important to note that C<SUPER> refers to the superclass(es) of the
+I<current package> and not to the superclass(es) of the object. Also, the
+C<SUPER> pseudo-class can only currently be used as a modifier to a method
+name, but not in any of the other ways that class names are normally used,
+eg:
+X<SUPER>
+
+ something->SUPER::method(...); # OK
+ SUPER::method(...); # WRONG
+ SUPER->method(...); # WRONG
+
+Instead of a class name or an object reference, you can also use any
+expression that returns either of those on the left side of the arrow.
+So the following statement is valid:
+
+ Critter->find("Fred")->display("Height", "Weight");
+
+and so is the following:
+
+ my $fred = (reverse "rettirC")->find(reverse "derF");
+
+The right side of the arrow typically is the method name, but a simple
+scalar variable containing either the method name or a subroutine
+reference can also be used.
+
+If the right side of the arrow is a scalar containing a reference
+to a subroutine, then this is equivalent to calling the referenced
+subroutine directly with the class name or object on the left side
+of the arrow as its first argument. No lookup is done and there is
+no requirement that the subroutine be defined in any package related
+to the class name or object on the left side of the arrow.
+
+For example, the following calls to $display are equivalent:
+
+ my $display = sub { my $self = shift; ... };
+ $fred->$display("Height", "Weight");
+ $display->($fred, "Height", "Weight");
+
+=head2 Indirect Object Syntax
+X<indirect object syntax> X<invocation, indirect> X<indirect>
+
+The other way to invoke a method is by using the so-called "indirect
+object" notation. This syntax was available in Perl 4 long before
+objects were introduced, and is still used with filehandles like this:
+
+ print STDERR "help!!!\n";
+
+The same syntax can be used to call either object or class methods.
+
+ my $fred = find Critter "Fred";
+ display $fred "Height", "Weight";
+
+Notice that there is no comma between the object or class name and the
+parameters. This is how Perl can tell you want an indirect method call
+instead of an ordinary subroutine call.
+
+But what if there are no arguments? In that case, Perl must guess what
+you want. Even worse, it must make that guess I<at compile time>.
+Usually Perl gets it right, but when it doesn't you get a function
+call compiled as a method, or vice versa. This can introduce subtle bugs
+that are hard to detect.
+
+For example, a call to a method C<new> in indirect notation -- as C++
+programmers are wont to make -- can be miscompiled into a subroutine
+call if there's already a C<new> function in scope. You'd end up
+calling the current package's C<new> as a subroutine, rather than the
+desired class's method. The compiler tries to cheat by remembering
+bareword C<require>s, but the grief when it messes up just isn't worth the
+years of debugging it will take you to track down such subtle bugs.
+
+There is another problem with this syntax: the indirect object is
+limited to a name, a scalar variable, or a block, because it would have
+to do too much lookahead otherwise, just like any other postfix
+dereference in the language. (These are the same quirky rules as are
+used for the filehandle slot in functions like C<print> and C<printf>.)
+This can lead to horribly confusing precedence problems, as in these
+next two lines:
+
+ move $obj->{FIELD}; # probably wrong!
+ move $ary[$i]; # probably wrong!
+
+Those actually parse as the very surprising:
+
+ $obj->move->{FIELD}; # Well, lookee here
+ $ary->move([$i]); # Didn't expect this one, eh?
+
+Rather than what you might have expected:
+
+ $obj->{FIELD}->move(); # You should be so lucky.
+ $ary[$i]->move; # Yeah, sure.
+
+To get the correct behavior with indirect object syntax, you would have
+to use a block around the indirect object:
+
+ move {$obj->{FIELD}};
+ move {$ary[$i]};
+
+Even then, you still have the same potential problem if there happens to
+be a function named C<move> in the current package. B<The C<< -> >>
+notation suffers from neither of these disturbing ambiguities, so we
+recommend you use it exclusively.> However, you may still end up having
+to read code using the indirect object notation, so it's important to be
+familiar with it.
+
+=head2 Default UNIVERSAL methods
+X<UNIVERSAL>
+
+The C<UNIVERSAL> package automatically contains the following methods that
+are inherited by all other classes:
+
+=over 4
+
+=item isa(CLASS)
+X<isa>
+
+C<isa> returns I<true> if its object is blessed into a subclass of C<CLASS>
+
+=item DOES(ROLE)
+X<DOES>
+
+C<DOES> returns I<true> if its object claims to perform the role C<ROLE>. By
+default, this is equivalent to C<isa>.
+
+=item can(METHOD)
+X<can>
+
+C<can> checks to see if its object has a method called C<METHOD>,
+if it does then a reference to the sub is returned, if it does not then
+C<undef> is returned.
+
+=item VERSION( [NEED] )
+X<VERSION>
+
+C<VERSION> returns the version number of the class (package). If the
+NEED argument is given then it will check that the current version (as
+defined by the $VERSION variable in the given package) not less than
+NEED; it will die if this is not the case. This method is called automatically
+by the C<VERSION> form of C<use>.
+
+ use Package 1.2 qw(some imported subs);
+ # implies:
+ Package->VERSION(1.2);
+
+=back
+
+=head2 Destructors
+X<destructor> X<DESTROY>
+
+When the last reference to an object goes away, the object is
+automatically destroyed. (This may even be after you exit, if you've
+stored references in global variables.) If you want to capture control
+just before the object is freed, you may define a DESTROY method in
+your class. It will automatically be called at the appropriate moment,
+and you can do any extra cleanup you need to do. Perl passes a reference
+to the object under destruction as the first (and only) argument. Beware
+that the reference is a read-only value, and cannot be modified by
+manipulating C<$_[0]> within the destructor. The object itself (i.e.
+the thingy the reference points to, namely C<${$_[0]}>, C<@{$_[0]}>,
+C<%{$_[0]}> etc.) is not similarly constrained.
+
+Since DESTROY methods can be called at unpredictable times, it is
+important that you localise any global variables that the method may
+update. In particular, localise C<$@> if you use C<eval {}> and
+localise C<$?> if you use C<system> or backticks.
+
+If you arrange to re-bless the reference before the destructor returns,
+perl will again call the DESTROY method for the re-blessed object after
+the current one returns. This can be used for clean delegation of
+object destruction, or for ensuring that destructors in the base classes
+of your choosing get called. Explicitly calling DESTROY is also possible,
+but is usually never needed.
+
+Do not confuse the previous discussion with how objects I<CONTAINED> in the current
+one are destroyed. Such objects will be freed and destroyed automatically
+when the current object is freed, provided no other references to them exist
+elsewhere.
+
+=head2 Summary
+
+That's about all there is to it. Now you need just to go off and buy a
+book about object-oriented design methodology, and bang your forehead
+with it for the next six months or so.
+
+=head2 Two-Phased Garbage Collection
+X<garbage collection> X<GC> X<circular reference>
+X<reference, circular> X<DESTROY> X<destructor>
+
+For most purposes, Perl uses a fast and simple, reference-based
+garbage collection system. That means there's an extra
+dereference going on at some level, so if you haven't built
+your Perl executable using your C compiler's C<-O> flag, performance
+will suffer. If you I<have> built Perl with C<cc -O>, then this
+probably won't matter.
+
+A more serious concern is that unreachable memory with a non-zero
+reference count will not normally get freed. Therefore, this is a bad
+idea:
+
+ {
+ my $a;
+ $a = \$a;
+ }
+
+Even thought $a I<should> go away, it can't. When building recursive data
+structures, you'll have to break the self-reference yourself explicitly
+if you don't care to leak. For example, here's a self-referential
+node such as one might use in a sophisticated tree structure:
+
+ sub new_node {
+ my $class = shift;
+ my $node = {};
+ $node->{LEFT} = $node->{RIGHT} = $node;
+ $node->{DATA} = [ @_ ];
+ return bless $node => $class;
+ }
+
+If you create nodes like that, they (currently) won't go away unless you
+break their self reference yourself. (In other words, this is not to be
+construed as a feature, and you shouldn't depend on it.)
+
+Almost.
+
+When an interpreter thread finally shuts down (usually when your program
+exits), then a rather costly but complete mark-and-sweep style of garbage
+collection is performed, and everything allocated by that thread gets
+destroyed. This is essential to support Perl as an embedded or a
+multithreadable language. For example, this program demonstrates Perl's
+two-phased garbage collection:
+
+ #!/usr/bin/perl
+ package Subtle;
+
+ sub new {
+ my $test;
+ $test = \$test;
+ warn "CREATING " . \$test;
+ return bless \$test;
+ }
+
+ sub DESTROY {
+ my $self = shift;
+ warn "DESTROYING $self";
+ }
+
+ package main;
+
+ warn "starting program";
+ {
+ my $a = Subtle->new;
+ my $b = Subtle->new;
+ $$a = 0; # break selfref
+ warn "leaving block";
+ }
+
+ warn "just exited block";
+ warn "time to die...";
+ exit;
+
+When run as F</foo/test>, the following output is produced:
+
+ starting program at /foo/test line 18.
+ CREATING SCALAR(0x8e5b8) at /foo/test line 7.
+ CREATING SCALAR(0x8e57c) at /foo/test line 7.
+ leaving block at /foo/test line 23.
+ DESTROYING Subtle=SCALAR(0x8e5b8) at /foo/test line 13.
+ just exited block at /foo/test line 26.
+ time to die... at /foo/test line 27.
+ DESTROYING Subtle=SCALAR(0x8e57c) during global destruction.
+
+Notice that "global destruction" bit there? That's the thread
+garbage collector reaching the unreachable.
+
+Objects are always destructed, even when regular refs aren't. Objects
+are destructed in a separate pass before ordinary refs just to
+prevent object destructors from using refs that have been themselves
+destructed. Plain refs are only garbage-collected if the destruct level
+is greater than 0. You can test the higher levels of global destruction
+by setting the PERL_DESTRUCT_LEVEL environment variable, presuming
+C<-DDEBUGGING> was enabled during perl build time.
+See L<perlhack/PERL_DESTRUCT_LEVEL> for more information.
+
+A more complete garbage collection strategy will be implemented
+at a future date.
+
+In the meantime, the best solution is to create a non-recursive container
+class that holds a pointer to the self-referential data structure.
+Define a DESTROY method for the containing object's class that manually
+breaks the circularities in the self-referential structure.
+
+=head1 SEE ALSO
+
+A kinder, gentler tutorial on object-oriented programming in Perl can
+be found in L<perltoot>, L<perlboot> and L<perltooc>. You should
+also check out L<perlbot> for other object tricks, traps, and tips, as
+well as L<perlmodlib> for some style guides on constructing both
+modules and classes.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlop.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlop.pod
new file mode 100755
index 00000000000..fe995259c52
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlop.pod
@@ -0,0 +1,2513 @@
+=head1 NAME
+X<operator>
+
+perlop - Perl operators and precedence
+
+=head1 DESCRIPTION
+
+=head2 Operator Precedence and Associativity
+X<operator, precedence> X<precedence> X<associativity>
+
+Operator precedence and associativity work in Perl more or less like
+they do in mathematics.
+
+I<Operator precedence> means some operators are evaluated before
+others. For example, in C<2 + 4 * 5>, the multiplication has higher
+precedence so C<4 * 5> is evaluated first yielding C<2 + 20 ==
+22> and not C<6 * 5 == 30>.
+
+I<Operator associativity> defines what happens if a sequence of the
+same operators is used one after another: whether the evaluator will
+evaluate the left operations first or the right. For example, in C<8
+- 4 - 2>, subtraction is left associative so Perl evaluates the
+expression left to right. C<8 - 4> is evaluated first making the
+expression C<4 - 2 == 2> and not C<8 - 2 == 6>.
+
+Perl operators have the following associativity and precedence,
+listed from highest precedence to lowest. Operators borrowed from
+C keep the same precedence relationship with each other, even where
+C's precedence is slightly screwy. (This makes learning Perl easier
+for C folks.) With very few exceptions, these all operate on scalar
+values only, not array values.
+
+ left terms and list operators (leftward)
+ left ->
+ nonassoc ++ --
+ right **
+ right ! ~ \ and unary + and -
+ left =~ !~
+ left * / % x
+ left + - .
+ left << >>
+ nonassoc named unary operators
+ nonassoc < > <= >= lt gt le ge
+ nonassoc == != <=> eq ne cmp ~~
+ left &
+ left | ^
+ left &&
+ left || //
+ nonassoc .. ...
+ right ?:
+ right = += -= *= etc.
+ left , =>
+ nonassoc list operators (rightward)
+ right not
+ left and
+ left or xor
+
+In the following sections, these operators are covered in precedence order.
+
+Many operators can be overloaded for objects. See L<overload>.
+
+=head2 Terms and List Operators (Leftward)
+X<list operator> X<operator, list> X<term>
+
+A TERM has the highest precedence in Perl. They include variables,
+quote and quote-like operators, any expression in parentheses,
+and any function whose arguments are parenthesized. Actually, there
+aren't really functions in this sense, just list operators and unary
+operators behaving as functions because you put parentheses around
+the arguments. These are all documented in L<perlfunc>.
+
+If any list operator (print(), etc.) or any unary operator (chdir(), etc.)
+is followed by a left parenthesis as the next token, the operator and
+arguments within parentheses are taken to be of highest precedence,
+just like a normal function call.
+
+In the absence of parentheses, the precedence of list operators such as
+C<print>, C<sort>, or C<chmod> is either very high or very low depending on
+whether you are looking at the left side or the right side of the operator.
+For example, in
+
+ @ary = (1, 3, sort 4, 2);
+ print @ary; # prints 1324
+
+the commas on the right of the sort are evaluated before the sort,
+but the commas on the left are evaluated after. In other words,
+list operators tend to gobble up all arguments that follow, and
+then act like a simple TERM with regard to the preceding expression.
+Be careful with parentheses:
+
+ # These evaluate exit before doing the print:
+ print($foo, exit); # Obviously not what you want.
+ print $foo, exit; # Nor is this.
+
+ # These do the print before evaluating exit:
+ (print $foo), exit; # This is what you want.
+ print($foo), exit; # Or this.
+ print ($foo), exit; # Or even this.
+
+Also note that
+
+ print ($foo & 255) + 1, "\n";
+
+probably doesn't do what you expect at first glance. The parentheses
+enclose the argument list for C<print> which is evaluated (printing
+the result of C<$foo & 255>). Then one is added to the return value
+of C<print> (usually 1). The result is something like this:
+
+ 1 + 1, "\n"; # Obviously not what you meant.
+
+To do what you meant properly, you must write:
+
+ print(($foo & 255) + 1, "\n");
+
+See L<Named Unary Operators> for more discussion of this.
+
+Also parsed as terms are the C<do {}> and C<eval {}> constructs, as
+well as subroutine and method calls, and the anonymous
+constructors C<[]> and C<{}>.
+
+See also L<Quote and Quote-like Operators> toward the end of this section,
+as well as L</"I/O Operators">.
+
+=head2 The Arrow Operator
+X<arrow> X<dereference> X<< -> >>
+
+"C<< -> >>" is an infix dereference operator, just as it is in C
+and C++. If the right side is either a C<[...]>, C<{...}>, or a
+C<(...)> subscript, then the left side must be either a hard or
+symbolic reference to an array, a hash, or a subroutine respectively.
+(Or technically speaking, a location capable of holding a hard
+reference, if it's an array or hash reference being used for
+assignment.) See L<perlreftut> and L<perlref>.
+
+Otherwise, the right side is a method name or a simple scalar
+variable containing either the method name or a subroutine reference,
+and the left side must be either an object (a blessed reference)
+or a class name (that is, a package name). See L<perlobj>.
+
+=head2 Auto-increment and Auto-decrement
+X<increment> X<auto-increment> X<++> X<decrement> X<auto-decrement> X<-->
+
+"++" and "--" work as in C. That is, if placed before a variable,
+they increment or decrement the variable by one before returning the
+value, and if placed after, increment or decrement after returning the
+value.
+
+ $i = 0; $j = 0;
+ print $i++; # prints 0
+ print ++$j; # prints 1
+
+Note that just as in C, Perl doesn't define B<when> the variable is
+incremented or decremented. You just know it will be done sometime
+before or after the value is returned. This also means that modifying
+a variable twice in the same statement will lead to undefined behaviour.
+Avoid statements like:
+
+ $i = $i ++;
+ print ++ $i + $i ++;
+
+Perl will not guarantee what the result of the above statements is.
+
+The auto-increment operator has a little extra builtin magic to it. If
+you increment a variable that is numeric, or that has ever been used in
+a numeric context, you get a normal increment. If, however, the
+variable has been used in only string contexts since it was set, and
+has a value that is not the empty string and matches the pattern
+C</^[a-zA-Z]*[0-9]*\z/>, the increment is done as a string, preserving each
+character within its range, with carry:
+
+ print ++($foo = '99'); # prints '100'
+ print ++($foo = 'a0'); # prints 'a1'
+ print ++($foo = 'Az'); # prints 'Ba'
+ print ++($foo = 'zz'); # prints 'aaa'
+
+C<undef> is always treated as numeric, and in particular is changed
+to C<0> before incrementing (so that a post-increment of an undef value
+will return C<0> rather than C<undef>).
+
+The auto-decrement operator is not magical.
+
+=head2 Exponentiation
+X<**> X<exponentiation> X<power>
+
+Binary "**" is the exponentiation operator. It binds even more
+tightly than unary minus, so -2**4 is -(2**4), not (-2)**4. (This is
+implemented using C's pow(3) function, which actually works on doubles
+internally.)
+
+=head2 Symbolic Unary Operators
+X<unary operator> X<operator, unary>
+
+Unary "!" performs logical negation, i.e., "not". See also C<not> for a lower
+precedence version of this.
+X<!>
+
+Unary "-" performs arithmetic negation if the operand is numeric. If
+the operand is an identifier, a string consisting of a minus sign
+concatenated with the identifier is returned. Otherwise, if the string
+starts with a plus or minus, a string starting with the opposite sign
+is returned. One effect of these rules is that -bareword is equivalent
+to the string "-bareword". If, however, the string begins with a
+non-alphabetic character (excluding "+" or "-"), Perl will attempt to convert
+the string to a numeric and the arithmetic negation is performed. If the
+string cannot be cleanly converted to a numeric, Perl will give the warning
+B<Argument "the string" isn't numeric in negation (-) at ...>.
+X<-> X<negation, arithmetic>
+
+Unary "~" performs bitwise negation, i.e., 1's complement. For
+example, C<0666 & ~027> is 0640. (See also L<Integer Arithmetic> and
+L<Bitwise String Operators>.) Note that the width of the result is
+platform-dependent: ~0 is 32 bits wide on a 32-bit platform, but 64
+bits wide on a 64-bit platform, so if you are expecting a certain bit
+width, remember to use the & operator to mask off the excess bits.
+X<~> X<negation, binary>
+
+Unary "+" has no effect whatsoever, even on strings. It is useful
+syntactically for separating a function name from a parenthesized expression
+that would otherwise be interpreted as the complete list of function
+arguments. (See examples above under L<Terms and List Operators (Leftward)>.)
+X<+>
+
+Unary "\" creates a reference to whatever follows it. See L<perlreftut>
+and L<perlref>. Do not confuse this behavior with the behavior of
+backslash within a string, although both forms do convey the notion
+of protecting the next thing from interpolation.
+X<\> X<reference> X<backslash>
+
+=head2 Binding Operators
+X<binding> X<operator, binding> X<=~> X<!~>
+
+Binary "=~" binds a scalar expression to a pattern match. Certain operations
+search or modify the string $_ by default. This operator makes that kind
+of operation work on some other string. The right argument is a search
+pattern, substitution, or transliteration. The left argument is what is
+supposed to be searched, substituted, or transliterated instead of the default
+$_. When used in scalar context, the return value generally indicates the
+success of the operation. Behavior in list context depends on the particular
+operator. See L</"Regexp Quote-Like Operators"> for details and
+L<perlretut> for examples using these operators.
+
+If the right argument is an expression rather than a search pattern,
+substitution, or transliteration, it is interpreted as a search pattern at run
+time. Note that this means that its contents will be interpolated twice, so
+
+ '\\' =~ q'\\';
+
+is not ok, as the regex engine will end up trying to compile the
+pattern C<\>, which it will consider a syntax error.
+
+Binary "!~" is just like "=~" except the return value is negated in
+the logical sense.
+
+=head2 Multiplicative Operators
+X<operator, multiplicative>
+
+Binary "*" multiplies two numbers.
+X<*>
+
+Binary "/" divides two numbers.
+X</> X<slash>
+
+Binary "%" is the modulo operator, which computes the division
+remainder of its first argument with respect to its second argument.
+Given integer
+operands C<$a> and C<$b>: If C<$b> is positive, then C<$a % $b> is
+C<$a> minus the largest multiple of C<$b> less than or equal to
+C<$a>. If C<$b> is negative, then C<$a % $b> is C<$a> minus the
+smallest multiple of C<$b> that is not less than C<$a> (i.e. the
+result will be less than or equal to zero). If the operands
+C<$a> and C<$b> are floating point values and the absolute value of
+C<$b> (that is C<abs($b)>) is less than C<(UV_MAX + 1)>, only
+the integer portion of C<$a> and C<$b> will be used in the operation
+(Note: here C<UV_MAX> means the maximum of the unsigned integer type).
+If the absolute value of the right operand (C<abs($b)>) is greater than
+or equal to C<(UV_MAX + 1)>, "%" computes the floating-point remainder
+C<$r> in the equation C<($r = $a - $i*$b)> where C<$i> is a certain
+integer that makes C<$r> have the same sign as the right operand
+C<$b> (B<not> as the left operand C<$a> like C function C<fmod()>)
+and the absolute value less than that of C<$b>.
+Note that when C<use integer> is in scope, "%" gives you direct access
+to the modulo operator as implemented by your C compiler. This
+operator is not as well defined for negative operands, but it will
+execute faster.
+X<%> X<remainder> X<modulo> X<mod>
+
+Binary "x" is the repetition operator. In scalar context or if the left
+operand is not enclosed in parentheses, it returns a string consisting
+of the left operand repeated the number of times specified by the right
+operand. In list context, if the left operand is enclosed in
+parentheses or is a list formed by C<qw/STRING/>, it repeats the list.
+If the right operand is zero or negative, it returns an empty string
+or an empty list, depending on the context.
+X<x>
+
+ print '-' x 80; # print row of dashes
+
+ print "\t" x ($tab/8), ' ' x ($tab%8); # tab over
+
+ @ones = (1) x 80; # a list of 80 1's
+ @ones = (5) x @ones; # set all elements to 5
+
+
+=head2 Additive Operators
+X<operator, additive>
+
+Binary "+" returns the sum of two numbers.
+X<+>
+
+Binary "-" returns the difference of two numbers.
+X<->
+
+Binary "." concatenates two strings.
+X<string, concatenation> X<concatenation>
+X<cat> X<concat> X<concatenate> X<.>
+
+=head2 Shift Operators
+X<shift operator> X<operator, shift> X<<< << >>>
+X<<< >> >>> X<right shift> X<left shift> X<bitwise shift>
+X<shl> X<shr> X<shift, right> X<shift, left>
+
+Binary "<<" returns the value of its left argument shifted left by the
+number of bits specified by the right argument. Arguments should be
+integers. (See also L<Integer Arithmetic>.)
+
+Binary ">>" returns the value of its left argument shifted right by
+the number of bits specified by the right argument. Arguments should
+be integers. (See also L<Integer Arithmetic>.)
+
+Note that both "<<" and ">>" in Perl are implemented directly using
+"<<" and ">>" in C. If C<use integer> (see L<Integer Arithmetic>) is
+in force then signed C integers are used, else unsigned C integers are
+used. Either way, the implementation isn't going to generate results
+larger than the size of the integer type Perl was built with (32 bits
+or 64 bits).
+
+The result of overflowing the range of the integers is undefined
+because it is undefined also in C. In other words, using 32-bit
+integers, C<< 1 << 32 >> is undefined. Shifting by a negative number
+of bits is also undefined.
+
+=head2 Named Unary Operators
+X<operator, named unary>
+
+The various named unary operators are treated as functions with one
+argument, with optional parentheses.
+
+If any list operator (print(), etc.) or any unary operator (chdir(), etc.)
+is followed by a left parenthesis as the next token, the operator and
+arguments within parentheses are taken to be of highest precedence,
+just like a normal function call. For example,
+because named unary operators are higher precedence than ||:
+
+ chdir $foo || die; # (chdir $foo) || die
+ chdir($foo) || die; # (chdir $foo) || die
+ chdir ($foo) || die; # (chdir $foo) || die
+ chdir +($foo) || die; # (chdir $foo) || die
+
+but, because * is higher precedence than named operators:
+
+ chdir $foo * 20; # chdir ($foo * 20)
+ chdir($foo) * 20; # (chdir $foo) * 20
+ chdir ($foo) * 20; # (chdir $foo) * 20
+ chdir +($foo) * 20; # chdir ($foo * 20)
+
+ rand 10 * 20; # rand (10 * 20)
+ rand(10) * 20; # (rand 10) * 20
+ rand (10) * 20; # (rand 10) * 20
+ rand +(10) * 20; # rand (10 * 20)
+
+Regarding precedence, the filetest operators, like C<-f>, C<-M>, etc. are
+treated like named unary operators, but they don't follow this functional
+parenthesis rule. That means, for example, that C<-f($file).".bak"> is
+equivalent to C<-f "$file.bak">.
+X<-X> X<filetest> X<operator, filetest>
+
+See also L<"Terms and List Operators (Leftward)">.
+
+=head2 Relational Operators
+X<relational operator> X<operator, relational>
+
+Binary "<" returns true if the left argument is numerically less than
+the right argument.
+X<< < >>
+
+Binary ">" returns true if the left argument is numerically greater
+than the right argument.
+X<< > >>
+
+Binary "<=" returns true if the left argument is numerically less than
+or equal to the right argument.
+X<< <= >>
+
+Binary ">=" returns true if the left argument is numerically greater
+than or equal to the right argument.
+X<< >= >>
+
+Binary "lt" returns true if the left argument is stringwise less than
+the right argument.
+X<< lt >>
+
+Binary "gt" returns true if the left argument is stringwise greater
+than the right argument.
+X<< gt >>
+
+Binary "le" returns true if the left argument is stringwise less than
+or equal to the right argument.
+X<< le >>
+
+Binary "ge" returns true if the left argument is stringwise greater
+than or equal to the right argument.
+X<< ge >>
+
+=head2 Equality Operators
+X<equality> X<equal> X<equals> X<operator, equality>
+
+Binary "==" returns true if the left argument is numerically equal to
+the right argument.
+X<==>
+
+Binary "!=" returns true if the left argument is numerically not equal
+to the right argument.
+X<!=>
+
+Binary "<=>" returns -1, 0, or 1 depending on whether the left
+argument is numerically less than, equal to, or greater than the right
+argument. If your platform supports NaNs (not-a-numbers) as numeric
+values, using them with "<=>" returns undef. NaN is not "<", "==", ">",
+"<=" or ">=" anything (even NaN), so those 5 return false. NaN != NaN
+returns true, as does NaN != anything else. If your platform doesn't
+support NaNs then NaN is just a string with numeric value 0.
+X<< <=> >> X<spaceship>
+
+ perl -le '$a = "NaN"; print "No NaN support here" if $a == $a'
+ perl -le '$a = "NaN"; print "NaN support here" if $a != $a'
+
+Binary "eq" returns true if the left argument is stringwise equal to
+the right argument.
+X<eq>
+
+Binary "ne" returns true if the left argument is stringwise not equal
+to the right argument.
+X<ne>
+
+Binary "cmp" returns -1, 0, or 1 depending on whether the left
+argument is stringwise less than, equal to, or greater than the right
+argument.
+X<cmp>
+
+Binary "~~" does a smart match between its arguments. Smart matching
+is described in L<perlsyn/"Smart matching in detail">.
+X<~~>
+
+"lt", "le", "ge", "gt" and "cmp" use the collation (sort) order specified
+by the current locale if C<use locale> is in effect. See L<perllocale>.
+
+=head2 Bitwise And
+X<operator, bitwise, and> X<bitwise and> X<&>
+
+Binary "&" returns its operands ANDed together bit by bit.
+(See also L<Integer Arithmetic> and L<Bitwise String Operators>.)
+
+Note that "&" has lower priority than relational operators, so for example
+the brackets are essential in a test like
+
+ print "Even\n" if ($x & 1) == 0;
+
+=head2 Bitwise Or and Exclusive Or
+X<operator, bitwise, or> X<bitwise or> X<|> X<operator, bitwise, xor>
+X<bitwise xor> X<^>
+
+Binary "|" returns its operands ORed together bit by bit.
+(See also L<Integer Arithmetic> and L<Bitwise String Operators>.)
+
+Binary "^" returns its operands XORed together bit by bit.
+(See also L<Integer Arithmetic> and L<Bitwise String Operators>.)
+
+Note that "|" and "^" have lower priority than relational operators, so
+for example the brackets are essential in a test like
+
+ print "false\n" if (8 | 2) != 10;
+
+=head2 C-style Logical And
+X<&&> X<logical and> X<operator, logical, and>
+
+Binary "&&" performs a short-circuit logical AND operation. That is,
+if the left operand is false, the right operand is not even evaluated.
+Scalar or list context propagates down to the right operand if it
+is evaluated.
+
+=head2 C-style Logical Or
+X<||> X<operator, logical, or>
+
+Binary "||" performs a short-circuit logical OR operation. That is,
+if the left operand is true, the right operand is not even evaluated.
+Scalar or list context propagates down to the right operand if it
+is evaluated.
+
+=head2 C-style Logical Defined-Or
+X<//> X<operator, logical, defined-or>
+
+Although it has no direct equivalent in C, Perl's C<//> operator is related
+to its C-style or. In fact, it's exactly the same as C<||>, except that it
+tests the left hand side's definedness instead of its truth. Thus, C<$a // $b>
+is similar to C<defined($a) || $b> (except that it returns the value of C<$a>
+rather than the value of C<defined($a)>) and is exactly equivalent to
+C<defined($a) ? $a : $b>. This is very useful for providing default values
+for variables. If you actually want to test if at least one of C<$a> and
+C<$b> is defined, use C<defined($a // $b)>.
+
+The C<||>, C<//> and C<&&> operators return the last value evaluated
+(unlike C's C<||> and C<&&>, which return 0 or 1). Thus, a reasonably
+portable way to find out the home directory might be:
+
+ $home = $ENV{'HOME'} // $ENV{'LOGDIR'} //
+ (getpwuid($<))[7] // die "You're homeless!\n";
+
+In particular, this means that you shouldn't use this
+for selecting between two aggregates for assignment:
+
+ @a = @b || @c; # this is wrong
+ @a = scalar(@b) || @c; # really meant this
+ @a = @b ? @b : @c; # this works fine, though
+
+As more readable alternatives to C<&&> and C<||> when used for
+control flow, Perl provides the C<and> and C<or> operators (see below).
+The short-circuit behavior is identical. The precedence of "and"
+and "or" is much lower, however, so that you can safely use them after a
+list operator without the need for parentheses:
+
+ unlink "alpha", "beta", "gamma"
+ or gripe(), next LINE;
+
+With the C-style operators that would have been written like this:
+
+ unlink("alpha", "beta", "gamma")
+ || (gripe(), next LINE);
+
+Using "or" for assignment is unlikely to do what you want; see below.
+
+=head2 Range Operators
+X<operator, range> X<range> X<..> X<...>
+
+Binary ".." is the range operator, which is really two different
+operators depending on the context. In list context, it returns a
+list of values counting (up by ones) from the left value to the right
+value. If the left value is greater than the right value then it
+returns the empty list. The range operator is useful for writing
+C<foreach (1..10)> loops and for doing slice operations on arrays. In
+the current implementation, no temporary array is created when the
+range operator is used as the expression in C<foreach> loops, but older
+versions of Perl might burn a lot of memory when you write something
+like this:
+
+ for (1 .. 1_000_000) {
+ # code
+ }
+
+The range operator also works on strings, using the magical auto-increment,
+see below.
+
+In scalar context, ".." returns a boolean value. The operator is
+bistable, like a flip-flop, and emulates the line-range (comma) operator
+of B<sed>, B<awk>, and various editors. Each ".." operator maintains its
+own boolean state. It is false as long as its left operand is false.
+Once the left operand is true, the range operator stays true until the
+right operand is true, I<AFTER> which the range operator becomes false
+again. It doesn't become false till the next time the range operator is
+evaluated. It can test the right operand and become false on the same
+evaluation it became true (as in B<awk>), but it still returns true once.
+If you don't want it to test the right operand till the next
+evaluation, as in B<sed>, just use three dots ("...") instead of
+two. In all other regards, "..." behaves just like ".." does.
+
+The right operand is not evaluated while the operator is in the
+"false" state, and the left operand is not evaluated while the
+operator is in the "true" state. The precedence is a little lower
+than || and &&. The value returned is either the empty string for
+false, or a sequence number (beginning with 1) for true. The
+sequence number is reset for each range encountered. The final
+sequence number in a range has the string "E0" appended to it, which
+doesn't affect its numeric value, but gives you something to search
+for if you want to exclude the endpoint. You can exclude the
+beginning point by waiting for the sequence number to be greater
+than 1.
+
+If either operand of scalar ".." is a constant expression,
+that operand is considered true if it is equal (C<==>) to the current
+input line number (the C<$.> variable).
+
+To be pedantic, the comparison is actually C<int(EXPR) == int(EXPR)>,
+but that is only an issue if you use a floating point expression; when
+implicitly using C<$.> as described in the previous paragraph, the
+comparison is C<int(EXPR) == int($.)> which is only an issue when C<$.>
+is set to a floating point value and you are not reading from a file.
+Furthermore, C<"span" .. "spat"> or C<2.18 .. 3.14> will not do what
+you want in scalar context because each of the operands are evaluated
+using their integer representation.
+
+Examples:
+
+As a scalar operator:
+
+ if (101 .. 200) { print; } # print 2nd hundred lines, short for
+ # if ($. == 101 .. $. == 200) { print; }
+
+ next LINE if (1 .. /^$/); # skip header lines, short for
+ # next LINE if ($. == 1 .. /^$/);
+ # (typically in a loop labeled LINE)
+
+ s/^/> / if (/^$/ .. eof()); # quote body
+
+ # parse mail messages
+ while (<>) {
+ $in_header = 1 .. /^$/;
+ $in_body = /^$/ .. eof;
+ if ($in_header) {
+ # do something
+ } else { # in body
+ # do something else
+ }
+ } continue {
+ close ARGV if eof; # reset $. each file
+ }
+
+Here's a simple example to illustrate the difference between
+the two range operators:
+
+ @lines = (" - Foo",
+ "01 - Bar",
+ "1 - Baz",
+ " - Quux");
+
+ foreach (@lines) {
+ if (/0/ .. /1/) {
+ print "$_\n";
+ }
+ }
+
+This program will print only the line containing "Bar". If
+the range operator is changed to C<...>, it will also print the
+"Baz" line.
+
+And now some examples as a list operator:
+
+ for (101 .. 200) { print; } # print $_ 100 times
+ @foo = @foo[0 .. $#foo]; # an expensive no-op
+ @foo = @foo[$#foo-4 .. $#foo]; # slice last 5 items
+
+The range operator (in list context) makes use of the magical
+auto-increment algorithm if the operands are strings. You
+can say
+
+ @alphabet = ('A' .. 'Z');
+
+to get all normal letters of the English alphabet, or
+
+ $hexdigit = (0 .. 9, 'a' .. 'f')[$num & 15];
+
+to get a hexadecimal digit, or
+
+ @z2 = ('01' .. '31'); print $z2[$mday];
+
+to get dates with leading zeros.
+
+If the final value specified is not in the sequence that the magical
+increment would produce, the sequence goes until the next value would
+be longer than the final value specified.
+
+If the initial value specified isn't part of a magical increment
+sequence (that is, a non-empty string matching "/^[a-zA-Z]*[0-9]*\z/"),
+only the initial value will be returned. So the following will only
+return an alpha:
+
+ use charnames 'greek';
+ my @greek_small = ("\N{alpha}" .. "\N{omega}");
+
+To get lower-case greek letters, use this instead:
+
+ my @greek_small = map { chr } ( ord("\N{alpha}") .. ord("\N{omega}") );
+
+Because each operand is evaluated in integer form, C<2.18 .. 3.14> will
+return two elements in list context.
+
+ @list = (2.18 .. 3.14); # same as @list = (2 .. 3);
+
+=head2 Conditional Operator
+X<operator, conditional> X<operator, ternary> X<ternary> X<?:>
+
+Ternary "?:" is the conditional operator, just as in C. It works much
+like an if-then-else. If the argument before the ? is true, the
+argument before the : is returned, otherwise the argument after the :
+is returned. For example:
+
+ printf "I have %d dog%s.\n", $n,
+ ($n == 1) ? '' : "s";
+
+Scalar or list context propagates downward into the 2nd
+or 3rd argument, whichever is selected.
+
+ $a = $ok ? $b : $c; # get a scalar
+ @a = $ok ? @b : @c; # get an array
+ $a = $ok ? @b : @c; # oops, that's just a count!
+
+The operator may be assigned to if both the 2nd and 3rd arguments are
+legal lvalues (meaning that you can assign to them):
+
+ ($a_or_b ? $a : $b) = $c;
+
+Because this operator produces an assignable result, using assignments
+without parentheses will get you in trouble. For example, this:
+
+ $a % 2 ? $a += 10 : $a += 2
+
+Really means this:
+
+ (($a % 2) ? ($a += 10) : $a) += 2
+
+Rather than this:
+
+ ($a % 2) ? ($a += 10) : ($a += 2)
+
+That should probably be written more simply as:
+
+ $a += ($a % 2) ? 10 : 2;
+
+=head2 Assignment Operators
+X<assignment> X<operator, assignment> X<=> X<**=> X<+=> X<*=> X<&=>
+X<<< <<= >>> X<&&=> X<-=> X</=> X<|=> X<<< >>= >>> X<||=> X<//=> X<.=>
+X<%=> X<^=> X<x=>
+
+"=" is the ordinary assignment operator.
+
+Assignment operators work as in C. That is,
+
+ $a += 2;
+
+is equivalent to
+
+ $a = $a + 2;
+
+although without duplicating any side effects that dereferencing the lvalue
+might trigger, such as from tie(). Other assignment operators work similarly.
+The following are recognized:
+
+ **= += *= &= <<= &&=
+ -= /= |= >>= ||=
+ .= %= ^= //=
+ x=
+
+Although these are grouped by family, they all have the precedence
+of assignment.
+
+Unlike in C, the scalar assignment operator produces a valid lvalue.
+Modifying an assignment is equivalent to doing the assignment and
+then modifying the variable that was assigned to. This is useful
+for modifying a copy of something, like this:
+
+ ($tmp = $global) =~ tr [A-Z] [a-z];
+
+Likewise,
+
+ ($a += 2) *= 3;
+
+is equivalent to
+
+ $a += 2;
+ $a *= 3;
+
+Similarly, a list assignment in list context produces the list of
+lvalues assigned to, and a list assignment in scalar context returns
+the number of elements produced by the expression on the right hand
+side of the assignment.
+
+=head2 Comma Operator
+X<comma> X<operator, comma> X<,>
+
+Binary "," is the comma operator. In scalar context it evaluates
+its left argument, throws that value away, then evaluates its right
+argument and returns that value. This is just like C's comma operator.
+
+In list context, it's just the list argument separator, and inserts
+both its arguments into the list. These arguments are also evaluated
+from left to right.
+
+The C<< => >> operator is a synonym for the comma except that it causes
+its left operand to be interpreted as a string if it begins with a letter
+or underscore and is composed only of letters, digits and underscores.
+This includes operands that might otherwise be interpreted as operators,
+constants, single number v-strings or function calls. If in doubt about
+this behaviour, the left operand can be quoted explicitly.
+
+Otherwise, the C<< => >> operator behaves exactly as the comma operator
+or list argument separator, according to context.
+
+For example:
+
+ use constant FOO => "something";
+
+ my %h = ( FOO => 23 );
+
+is equivalent to:
+
+ my %h = ("FOO", 23);
+
+It is I<NOT>:
+
+ my %h = ("something", 23);
+
+The C<< => >> operator is helpful in documenting the correspondence
+between keys and values in hashes, and other paired elements in lists.
+
+ %hash = ( $key => $value );
+ login( $username => $password );
+
+=head2 List Operators (Rightward)
+X<operator, list, rightward> X<list operator>
+
+On the right side of a list operator, it has very low precedence,
+such that it controls all comma-separated expressions found there.
+The only operators with lower precedence are the logical operators
+"and", "or", and "not", which may be used to evaluate calls to list
+operators without the need for extra parentheses:
+
+ open HANDLE, "filename"
+ or die "Can't open: $!\n";
+
+See also discussion of list operators in L<Terms and List Operators (Leftward)>.
+
+=head2 Logical Not
+X<operator, logical, not> X<not>
+
+Unary "not" returns the logical negation of the expression to its right.
+It's the equivalent of "!" except for the very low precedence.
+
+=head2 Logical And
+X<operator, logical, and> X<and>
+
+Binary "and" returns the logical conjunction of the two surrounding
+expressions. It's equivalent to && except for the very low
+precedence. This means that it short-circuits: i.e., the right
+expression is evaluated only if the left expression is true.
+
+=head2 Logical or, Defined or, and Exclusive Or
+X<operator, logical, or> X<operator, logical, xor>
+X<operator, logical, defined or> X<operator, logical, exclusive or>
+X<or> X<xor>
+
+Binary "or" returns the logical disjunction of the two surrounding
+expressions. It's equivalent to || except for the very low precedence.
+This makes it useful for control flow
+
+ print FH $data or die "Can't write to FH: $!";
+
+This means that it short-circuits: i.e., the right expression is evaluated
+only if the left expression is false. Due to its precedence, you should
+probably avoid using this for assignment, only for control flow.
+
+ $a = $b or $c; # bug: this is wrong
+ ($a = $b) or $c; # really means this
+ $a = $b || $c; # better written this way
+
+However, when it's a list-context assignment and you're trying to use
+"||" for control flow, you probably need "or" so that the assignment
+takes higher precedence.
+
+ @info = stat($file) || die; # oops, scalar sense of stat!
+ @info = stat($file) or die; # better, now @info gets its due
+
+Then again, you could always use parentheses.
+
+Binary "xor" returns the exclusive-OR of the two surrounding expressions.
+It cannot short circuit, of course.
+
+=head2 C Operators Missing From Perl
+X<operator, missing from perl> X<&> X<*>
+X<typecasting> X<(TYPE)>
+
+Here is what C has that Perl doesn't:
+
+=over 8
+
+=item unary &
+
+Address-of operator. (But see the "\" operator for taking a reference.)
+
+=item unary *
+
+Dereference-address operator. (Perl's prefix dereferencing
+operators are typed: $, @, %, and &.)
+
+=item (TYPE)
+
+Type-casting operator.
+
+=back
+
+=head2 Quote and Quote-like Operators
+X<operator, quote> X<operator, quote-like> X<q> X<qq> X<qx> X<qw> X<m>
+X<qr> X<s> X<tr> X<'> X<''> X<"> X<""> X<//> X<`> X<``> X<<< << >>>
+X<escape sequence> X<escape>
+
+
+While we usually think of quotes as literal values, in Perl they
+function as operators, providing various kinds of interpolating and
+pattern matching capabilities. Perl provides customary quote characters
+for these behaviors, but also provides a way for you to choose your
+quote character for any of them. In the following table, a C<{}> represents
+any pair of delimiters you choose.
+
+ Customary Generic Meaning Interpolates
+ '' q{} Literal no
+ "" qq{} Literal yes
+ `` qx{} Command yes*
+ qw{} Word list no
+ // m{} Pattern match yes*
+ qr{} Pattern yes*
+ s{}{} Substitution yes*
+ tr{}{} Transliteration no (but see below)
+ <<EOF here-doc yes*
+
+ * unless the delimiter is ''.
+
+Non-bracketing delimiters use the same character fore and aft, but the four
+sorts of brackets (round, angle, square, curly) will all nest, which means
+that
+
+ q{foo{bar}baz}
+
+is the same as
+
+ 'foo{bar}baz'
+
+Note, however, that this does not always work for quoting Perl code:
+
+ $s = q{ if($a eq "}") ... }; # WRONG
+
+is a syntax error. The C<Text::Balanced> module (from CPAN, and
+starting from Perl 5.8 part of the standard distribution) is able
+to do this properly.
+
+There can be whitespace between the operator and the quoting
+characters, except when C<#> is being used as the quoting character.
+C<q#foo#> is parsed as the string C<foo>, while C<q #foo#> is the
+operator C<q> followed by a comment. Its argument will be taken
+from the next line. This allows you to write:
+
+ s {foo} # Replace foo
+ {bar} # with bar.
+
+The following escape sequences are available in constructs that interpolate
+and in transliterations.
+X<\t> X<\n> X<\r> X<\f> X<\b> X<\a> X<\e> X<\x> X<\0> X<\c> X<\N>
+
+ \t tab (HT, TAB)
+ \n newline (NL)
+ \r return (CR)
+ \f form feed (FF)
+ \b backspace (BS)
+ \a alarm (bell) (BEL)
+ \e escape (ESC)
+ \033 octal char (example: ESC)
+ \x1b hex char (example: ESC)
+ \x{263a} wide hex char (example: SMILEY)
+ \c[ control char (example: ESC)
+ \N{name} named Unicode character
+
+The character following C<\c> is mapped to some other character by
+converting letters to upper case and then (on ASCII systems) by inverting
+the 7th bit (0x40). The most interesting range is from '@' to '_'
+(0x40 through 0x5F), resulting in a control character from 0x00
+through 0x1F. A '?' maps to the DEL character. On EBCDIC systems only
+'@', the letters, '[', '\', ']', '^', '_' and '?' will work, resulting
+in 0x00 through 0x1F and 0x7F.
+
+B<NOTE>: Unlike C and other languages, Perl has no \v escape sequence for
+the vertical tab (VT - ASCII 11), but you may use C<\ck> or C<\x0b>.
+
+The following escape sequences are available in constructs that interpolate
+but not in transliterations.
+X<\l> X<\u> X<\L> X<\U> X<\E> X<\Q>
+
+ \l lowercase next char
+ \u uppercase next char
+ \L lowercase till \E
+ \U uppercase till \E
+ \E end case modification
+ \Q quote non-word characters till \E
+
+If C<use locale> is in effect, the case map used by C<\l>, C<\L>,
+C<\u> and C<\U> is taken from the current locale. See L<perllocale>.
+If Unicode (for example, C<\N{}> or wide hex characters of 0x100 or
+beyond) is being used, the case map used by C<\l>, C<\L>, C<\u> and
+C<\U> is as defined by Unicode. For documentation of C<\N{name}>,
+see L<charnames>.
+
+All systems use the virtual C<"\n"> to represent a line terminator,
+called a "newline". There is no such thing as an unvarying, physical
+newline character. It is only an illusion that the operating system,
+device drivers, C libraries, and Perl all conspire to preserve. Not all
+systems read C<"\r"> as ASCII CR and C<"\n"> as ASCII LF. For example,
+on a Mac, these are reversed, and on systems without line terminator,
+printing C<"\n"> may emit no actual data. In general, use C<"\n"> when
+you mean a "newline" for your system, but use the literal ASCII when you
+need an exact character. For example, most networking protocols expect
+and prefer a CR+LF (C<"\015\012"> or C<"\cM\cJ">) for line terminators,
+and although they often accept just C<"\012">, they seldom tolerate just
+C<"\015">. If you get in the habit of using C<"\n"> for networking,
+you may be burned some day.
+X<newline> X<line terminator> X<eol> X<end of line>
+X<\n> X<\r> X<\r\n>
+
+For constructs that do interpolate, variables beginning with "C<$>"
+or "C<@>" are interpolated. Subscripted variables such as C<$a[3]> or
+C<< $href->{key}[0] >> are also interpolated, as are array and hash slices.
+But method calls such as C<< $obj->meth >> are not.
+
+Interpolating an array or slice interpolates the elements in order,
+separated by the value of C<$">, so is equivalent to interpolating
+C<join $", @array>. "Punctuation" arrays such as C<@*> are only
+interpolated if the name is enclosed in braces C<@{*}>, but special
+arrays C<@_>, C<@+>, and C<@-> are interpolated, even without braces.
+
+You cannot include a literal C<$> or C<@> within a C<\Q> sequence.
+An unescaped C<$> or C<@> interpolates the corresponding variable,
+while escaping will cause the literal string C<\$> to be inserted.
+You'll need to write something like C<m/\Quser\E\@\Qhost/>.
+
+Patterns are subject to an additional level of interpretation as a
+regular expression. This is done as a second pass, after variables are
+interpolated, so that regular expressions may be incorporated into the
+pattern from the variables. If this is not what you want, use C<\Q> to
+interpolate a variable literally.
+
+Apart from the behavior described above, Perl does not expand
+multiple levels of interpolation. In particular, contrary to the
+expectations of shell programmers, back-quotes do I<NOT> interpolate
+within double quotes, nor do single quotes impede evaluation of
+variables when used within double quotes.
+
+=head2 Regexp Quote-Like Operators
+X<operator, regexp>
+
+Here are the quote-like operators that apply to pattern
+matching and related activities.
+
+=over 8
+
+=item qr/STRING/msixpo
+X<qr> X</i> X</m> X</o> X</s> X</x> X</p>
+
+This operator quotes (and possibly compiles) its I<STRING> as a regular
+expression. I<STRING> is interpolated the same way as I<PATTERN>
+in C<m/PATTERN/>. If "'" is used as the delimiter, no interpolation
+is done. Returns a Perl value which may be used instead of the
+corresponding C</STRING/msixpo> expression. The returned value is a
+normalized version of the original pattern. It magically differs from
+a string containing the same characters: C<ref(qr/x/)> returns "Regexp",
+even though dereferencing the result returns undef.
+
+For example,
+
+ $rex = qr/my.STRING/is;
+ print $rex; # prints (?si-xm:my.STRING)
+ s/$rex/foo/;
+
+is equivalent to
+
+ s/my.STRING/foo/is;
+
+The result may be used as a subpattern in a match:
+
+ $re = qr/$pattern/;
+ $string =~ /foo${re}bar/; # can be interpolated in other patterns
+ $string =~ $re; # or used standalone
+ $string =~ /$re/; # or this way
+
+Since Perl may compile the pattern at the moment of execution of qr()
+operator, using qr() may have speed advantages in some situations,
+notably if the result of qr() is used standalone:
+
+ sub match {
+ my $patterns = shift;
+ my @compiled = map qr/$_/i, @$patterns;
+ grep {
+ my $success = 0;
+ foreach my $pat (@compiled) {
+ $success = 1, last if /$pat/;
+ }
+ $success;
+ } @_;
+ }
+
+Precompilation of the pattern into an internal representation at
+the moment of qr() avoids a need to recompile the pattern every
+time a match C</$pat/> is attempted. (Perl has many other internal
+optimizations, but none would be triggered in the above example if
+we did not use qr() operator.)
+
+Options are:
+
+ m Treat string as multiple lines.
+ s Treat string as single line. (Make . match a newline)
+ i Do case-insensitive pattern matching.
+ x Use extended regular expressions.
+ p When matching preserve a copy of the matched string so
+ that ${^PREMATCH}, ${^MATCH}, ${^POSTMATCH} will be defined.
+ o Compile pattern only once.
+
+If a precompiled pattern is embedded in a larger pattern then the effect
+of 'msixp' will be propagated appropriately. The effect of the 'o'
+modifier has is not propagated, being restricted to those patterns
+explicitly using it.
+
+See L<perlre> for additional information on valid syntax for STRING, and
+for a detailed look at the semantics of regular expressions.
+
+=item m/PATTERN/msixpogc
+X<m> X<operator, match>
+X<regexp, options> X<regexp> X<regex, options> X<regex>
+X</m> X</s> X</i> X</x> X</p> X</o> X</g> X</c>
+
+=item /PATTERN/msixpogc
+
+Searches a string for a pattern match, and in scalar context returns
+true if it succeeds, false if it fails. If no string is specified
+via the C<=~> or C<!~> operator, the $_ string is searched. (The
+string specified with C<=~> need not be an lvalue--it may be the
+result of an expression evaluation, but remember the C<=~> binds
+rather tightly.) See also L<perlre>. See L<perllocale> for
+discussion of additional considerations that apply when C<use locale>
+is in effect.
+
+Options are as described in C<qr//>; in addition, the following match
+process modifiers are available:
+
+ g Match globally, i.e., find all occurrences.
+ c Do not reset search position on a failed match when /g is in effect.
+
+If "/" is the delimiter then the initial C<m> is optional. With the C<m>
+you can use any pair of non-alphanumeric, non-whitespace characters
+as delimiters. This is particularly useful for matching path names
+that contain "/", to avoid LTS (leaning toothpick syndrome). If "?" is
+the delimiter, then the match-only-once rule of C<?PATTERN?> applies.
+If "'" is the delimiter, no interpolation is performed on the PATTERN.
+
+PATTERN may contain variables, which will be interpolated (and the
+pattern recompiled) every time the pattern search is evaluated, except
+for when the delimiter is a single quote. (Note that C<$(>, C<$)>, and
+C<$|> are not interpolated because they look like end-of-string tests.)
+If you want such a pattern to be compiled only once, add a C</o> after
+the trailing delimiter. This avoids expensive run-time recompilations,
+and is useful when the value you are interpolating won't change over
+the life of the script. However, mentioning C</o> constitutes a promise
+that you won't change the variables in the pattern. If you change them,
+Perl won't even notice. See also L<"qr/STRING/msixpo">.
+
+=item The empty pattern //
+
+If the PATTERN evaluates to the empty string, the last
+I<successfully> matched regular expression is used instead. In this
+case, only the C<g> and C<c> flags on the empty pattern is honoured -
+the other flags are taken from the original pattern. If no match has
+previously succeeded, this will (silently) act instead as a genuine
+empty pattern (which will always match).
+
+Note that it's possible to confuse Perl into thinking C<//> (the empty
+regex) is really C<//> (the defined-or operator). Perl is usually pretty
+good about this, but some pathological cases might trigger this, such as
+C<$a///> (is that C<($a) / (//)> or C<$a // />?) and C<print $fh //>
+(C<print $fh(//> or C<print($fh //>?). In all of these examples, Perl
+will assume you meant defined-or. If you meant the empty regex, just
+use parentheses or spaces to disambiguate, or even prefix the empty
+regex with an C<m> (so C<//> becomes C<m//>).
+
+=item Matching in list context
+
+If the C</g> option is not used, C<m//> in list context returns a
+list consisting of the subexpressions matched by the parentheses in the
+pattern, i.e., (C<$1>, C<$2>, C<$3>...). (Note that here C<$1> etc. are
+also set, and that this differs from Perl 4's behavior.) When there are
+no parentheses in the pattern, the return value is the list C<(1)> for
+success. With or without parentheses, an empty list is returned upon
+failure.
+
+Examples:
+
+ open(TTY, '/dev/tty');
+ <TTY> =~ /^y/i && foo(); # do foo if desired
+
+ if (/Version: *([0-9.]*)/) { $version = $1; }
+
+ next if m#^/usr/spool/uucp#;
+
+ # poor man's grep
+ $arg = shift;
+ while (<>) {
+ print if /$arg/o; # compile only once
+ }
+
+ if (($F1, $F2, $Etc) = ($foo =~ /^(\S+)\s+(\S+)\s*(.*)/))
+
+This last example splits $foo into the first two words and the
+remainder of the line, and assigns those three fields to $F1, $F2, and
+$Etc. The conditional is true if any variables were assigned, i.e., if
+the pattern matched.
+
+The C</g> modifier specifies global pattern matching--that is,
+matching as many times as possible within the string. How it behaves
+depends on the context. In list context, it returns a list of the
+substrings matched by any capturing parentheses in the regular
+expression. If there are no parentheses, it returns a list of all
+the matched strings, as if there were parentheses around the whole
+pattern.
+
+In scalar context, each execution of C<m//g> finds the next match,
+returning true if it matches, and false if there is no further match.
+The position after the last match can be read or set using the pos()
+function; see L<perlfunc/pos>. A failed match normally resets the
+search position to the beginning of the string, but you can avoid that
+by adding the C</c> modifier (e.g. C<m//gc>). Modifying the target
+string also resets the search position.
+
+=item \G assertion
+
+You can intermix C<m//g> matches with C<m/\G.../g>, where C<\G> is a
+zero-width assertion that matches the exact position where the previous
+C<m//g>, if any, left off. Without the C</g> modifier, the C<\G> assertion
+still anchors at pos(), but the match is of course only attempted once.
+Using C<\G> without C</g> on a target string that has not previously had a
+C</g> match applied to it is the same as using the C<\A> assertion to match
+the beginning of the string. Note also that, currently, C<\G> is only
+properly supported when anchored at the very beginning of the pattern.
+
+Examples:
+
+ # list context
+ ($one,$five,$fifteen) = (`uptime` =~ /(\d+\.\d+)/g);
+
+ # scalar context
+ $/ = "";
+ while (defined($paragraph = <>)) {
+ while ($paragraph =~ /[a-z]['")]*[.!?]+['")]*\s/g) {
+ $sentences++;
+ }
+ }
+ print "$sentences\n";
+
+ # using m//gc with \G
+ $_ = "ppooqppqq";
+ while ($i++ < 2) {
+ print "1: '";
+ print $1 while /(o)/gc; print "', pos=", pos, "\n";
+ print "2: '";
+ print $1 if /\G(q)/gc; print "', pos=", pos, "\n";
+ print "3: '";
+ print $1 while /(p)/gc; print "', pos=", pos, "\n";
+ }
+ print "Final: '$1', pos=",pos,"\n" if /\G(.)/;
+
+The last example should print:
+
+ 1: 'oo', pos=4
+ 2: 'q', pos=5
+ 3: 'pp', pos=7
+ 1: '', pos=7
+ 2: 'q', pos=8
+ 3: '', pos=8
+ Final: 'q', pos=8
+
+Notice that the final match matched C<q> instead of C<p>, which a match
+without the C<\G> anchor would have done. Also note that the final match
+did not update C<pos> -- C<pos> is only updated on a C</g> match. If the
+final match did indeed match C<p>, it's a good bet that you're running an
+older (pre-5.6.0) Perl.
+
+A useful idiom for C<lex>-like scanners is C</\G.../gc>. You can
+combine several regexps like this to process a string part-by-part,
+doing different actions depending on which regexp matched. Each
+regexp tries to match where the previous one leaves off.
+
+ $_ = <<'EOL';
+ $url = URI::URL->new( "http://www/" ); die if $url eq "xXx";
+ EOL
+ LOOP:
+ {
+ print(" digits"), redo LOOP if /\G\d+\b[,.;]?\s*/gc;
+ print(" lowercase"), redo LOOP if /\G[a-z]+\b[,.;]?\s*/gc;
+ print(" UPPERCASE"), redo LOOP if /\G[A-Z]+\b[,.;]?\s*/gc;
+ print(" Capitalized"), redo LOOP if /\G[A-Z][a-z]+\b[,.;]?\s*/gc;
+ print(" MiXeD"), redo LOOP if /\G[A-Za-z]+\b[,.;]?\s*/gc;
+ print(" alphanumeric"), redo LOOP if /\G[A-Za-z0-9]+\b[,.;]?\s*/gc;
+ print(" line-noise"), redo LOOP if /\G[^A-Za-z0-9]+/gc;
+ print ". That's all!\n";
+ }
+
+Here is the output (split into several lines):
+
+ line-noise lowercase line-noise lowercase UPPERCASE line-noise
+ UPPERCASE line-noise lowercase line-noise lowercase line-noise
+ lowercase lowercase line-noise lowercase lowercase line-noise
+ MiXeD line-noise. That's all!
+
+=item ?PATTERN?
+X<?>
+
+This is just like the C</pattern/> search, except that it matches only
+once between calls to the reset() operator. This is a useful
+optimization when you want to see only the first occurrence of
+something in each file of a set of files, for instance. Only C<??>
+patterns local to the current package are reset.
+
+ while (<>) {
+ if (?^$?) {
+ # blank line between header and body
+ }
+ } continue {
+ reset if eof; # clear ?? status for next file
+ }
+
+This usage is vaguely deprecated, which means it just might possibly
+be removed in some distant future version of Perl, perhaps somewhere
+around the year 2168.
+
+=item s/PATTERN/REPLACEMENT/msixpogce
+X<substitute> X<substitution> X<replace> X<regexp, replace>
+X<regexp, substitute> X</m> X</s> X</i> X</x> X</p> X</o> X</g> X</c> X</e>
+
+Searches a string for a pattern, and if found, replaces that pattern
+with the replacement text and returns the number of substitutions
+made. Otherwise it returns false (specifically, the empty string).
+
+If no string is specified via the C<=~> or C<!~> operator, the C<$_>
+variable is searched and modified. (The string specified with C<=~> must
+be scalar variable, an array element, a hash element, or an assignment
+to one of those, i.e., an lvalue.)
+
+If the delimiter chosen is a single quote, no interpolation is
+done on either the PATTERN or the REPLACEMENT. Otherwise, if the
+PATTERN contains a $ that looks like a variable rather than an
+end-of-string test, the variable will be interpolated into the pattern
+at run-time. If you want the pattern compiled only once the first time
+the variable is interpolated, use the C</o> option. If the pattern
+evaluates to the empty string, the last successfully executed regular
+expression is used instead. See L<perlre> for further explanation on these.
+See L<perllocale> for discussion of additional considerations that apply
+when C<use locale> is in effect.
+
+Options are as with m// with the addition of the following replacement
+specific options:
+
+ e Evaluate the right side as an expression.
+ ee Evaluate the right side as a string then eval the result
+
+Any non-alphanumeric, non-whitespace delimiter may replace the
+slashes. If single quotes are used, no interpretation is done on the
+replacement string (the C</e> modifier overrides this, however). Unlike
+Perl 4, Perl 5 treats backticks as normal delimiters; the replacement
+text is not evaluated as a command. If the
+PATTERN is delimited by bracketing quotes, the REPLACEMENT has its own
+pair of quotes, which may or may not be bracketing quotes, e.g.,
+C<s(foo)(bar)> or C<< s<foo>/bar/ >>. A C</e> will cause the
+replacement portion to be treated as a full-fledged Perl expression
+and evaluated right then and there. It is, however, syntax checked at
+compile-time. A second C<e> modifier will cause the replacement portion
+to be C<eval>ed before being run as a Perl expression.
+
+Examples:
+
+ s/\bgreen\b/mauve/g; # don't change wintergreen
+
+ $path =~ s|/usr/bin|/usr/local/bin|;
+
+ s/Login: $foo/Login: $bar/; # run-time pattern
+
+ ($foo = $bar) =~ s/this/that/; # copy first, then change
+
+ $count = ($paragraph =~ s/Mister\b/Mr./g); # get change-count
+
+ $_ = 'abc123xyz';
+ s/\d+/$&*2/e; # yields 'abc246xyz'
+ s/\d+/sprintf("%5d",$&)/e; # yields 'abc 246xyz'
+ s/\w/$& x 2/eg; # yields 'aabbcc 224466xxyyzz'
+
+ s/%(.)/$percent{$1}/g; # change percent escapes; no /e
+ s/%(.)/$percent{$1} || $&/ge; # expr now, so /e
+ s/^=(\w+)/pod($1)/ge; # use function call
+
+ # expand variables in $_, but dynamics only, using
+ # symbolic dereferencing
+ s/\$(\w+)/${$1}/g;
+
+ # Add one to the value of any numbers in the string
+ s/(\d+)/1 + $1/eg;
+
+ # This will expand any embedded scalar variable
+ # (including lexicals) in $_ : First $1 is interpolated
+ # to the variable name, and then evaluated
+ s/(\$\w+)/$1/eeg;
+
+ # Delete (most) C comments.
+ $program =~ s {
+ /\* # Match the opening delimiter.
+ .*? # Match a minimal number of characters.
+ \*/ # Match the closing delimiter.
+ } []gsx;
+
+ s/^\s*(.*?)\s*$/$1/; # trim whitespace in $_, expensively
+
+ for ($variable) { # trim whitespace in $variable, cheap
+ s/^\s+//;
+ s/\s+$//;
+ }
+
+ s/([^ ]*) *([^ ]*)/$2 $1/; # reverse 1st two fields
+
+Note the use of $ instead of \ in the last example. Unlike
+B<sed>, we use the \<I<digit>> form in only the left hand side.
+Anywhere else it's $<I<digit>>.
+
+Occasionally, you can't use just a C</g> to get all the changes
+to occur that you might want. Here are two common cases:
+
+ # put commas in the right places in an integer
+ 1 while s/(\d)(\d\d\d)(?!\d)/$1,$2/g;
+
+ # expand tabs to 8-column spacing
+ 1 while s/\t+/' ' x (length($&)*8 - length($`)%8)/e;
+
+=back
+
+=head2 Quote-Like Operators
+X<operator, quote-like>
+
+=over 4
+
+=item q/STRING/
+X<q> X<quote, single> X<'> X<''>
+
+=item 'STRING'
+
+A single-quoted, literal string. A backslash represents a backslash
+unless followed by the delimiter or another backslash, in which case
+the delimiter or backslash is interpolated.
+
+ $foo = q!I said, "You said, 'She said it.'"!;
+ $bar = q('This is it.');
+ $baz = '\n'; # a two-character string
+
+=item qq/STRING/
+X<qq> X<quote, double> X<"> X<"">
+
+=item "STRING"
+
+A double-quoted, interpolated string.
+
+ $_ .= qq
+ (*** The previous line contains the naughty word "$1".\n)
+ if /\b(tcl|java|python)\b/i; # :-)
+ $baz = "\n"; # a one-character string
+
+=item qx/STRING/
+X<qx> X<`> X<``> X<backtick>
+
+=item `STRING`
+
+A string which is (possibly) interpolated and then executed as a
+system command with C</bin/sh> or its equivalent. Shell wildcards,
+pipes, and redirections will be honored. The collected standard
+output of the command is returned; standard error is unaffected. In
+scalar context, it comes back as a single (potentially multi-line)
+string, or undef if the command failed. In list context, returns a
+list of lines (however you've defined lines with $/ or
+$INPUT_RECORD_SEPARATOR), or an empty list if the command failed.
+
+Because backticks do not affect standard error, use shell file descriptor
+syntax (assuming the shell supports this) if you care to address this.
+To capture a command's STDERR and STDOUT together:
+
+ $output = `cmd 2>&1`;
+
+To capture a command's STDOUT but discard its STDERR:
+
+ $output = `cmd 2>/dev/null`;
+
+To capture a command's STDERR but discard its STDOUT (ordering is
+important here):
+
+ $output = `cmd 2>&1 1>/dev/null`;
+
+To exchange a command's STDOUT and STDERR in order to capture the STDERR
+but leave its STDOUT to come out the old STDERR:
+
+ $output = `cmd 3>&1 1>&2 2>&3 3>&-`;
+
+To read both a command's STDOUT and its STDERR separately, it's easiest
+to redirect them separately to files, and then read from those files
+when the program is done:
+
+ system("program args 1>program.stdout 2>program.stderr");
+
+The STDIN filehandle used by the command is inherited from Perl's STDIN.
+For example:
+
+ open BLAM, "blam" || die "Can't open: $!";
+ open STDIN, "<&BLAM";
+ print `sort`;
+
+will print the sorted contents of the file "blam".
+
+Using single-quote as a delimiter protects the command from Perl's
+double-quote interpolation, passing it on to the shell instead:
+
+ $perl_info = qx(ps $$); # that's Perl's $$
+ $shell_info = qx'ps $$'; # that's the new shell's $$
+
+How that string gets evaluated is entirely subject to the command
+interpreter on your system. On most platforms, you will have to protect
+shell metacharacters if you want them treated literally. This is in
+practice difficult to do, as it's unclear how to escape which characters.
+See L<perlsec> for a clean and safe example of a manual fork() and exec()
+to emulate backticks safely.
+
+On some platforms (notably DOS-like ones), the shell may not be
+capable of dealing with multiline commands, so putting newlines in
+the string may not get you what you want. You may be able to evaluate
+multiple commands in a single line by separating them with the command
+separator character, if your shell supports that (e.g. C<;> on many Unix
+shells; C<&> on the Windows NT C<cmd> shell).
+
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before starting the child process, but this may not be supported
+on some platforms (see L<perlport>). To be safe, you may need to set
+C<$|> ($AUTOFLUSH in English) or call the C<autoflush()> method of
+C<IO::Handle> on any open handles.
+
+Beware that some command shells may place restrictions on the length
+of the command line. You must ensure your strings don't exceed this
+limit after any necessary interpolations. See the platform-specific
+release notes for more details about your particular environment.
+
+Using this operator can lead to programs that are difficult to port,
+because the shell commands called vary between systems, and may in
+fact not be present at all. As one example, the C<type> command under
+the POSIX shell is very different from the C<type> command under DOS.
+That doesn't mean you should go out of your way to avoid backticks
+when they're the right way to get something done. Perl was made to be
+a glue language, and one of the things it glues together is commands.
+Just understand what you're getting yourself into.
+
+See L</"I/O Operators"> for more discussion.
+
+=item qw/STRING/
+X<qw> X<quote, list> X<quote, words>
+
+Evaluates to a list of the words extracted out of STRING, using embedded
+whitespace as the word delimiters. It can be understood as being roughly
+equivalent to:
+
+ split(' ', q/STRING/);
+
+the differences being that it generates a real list at compile time, and
+in scalar context it returns the last element in the list. So
+this expression:
+
+ qw(foo bar baz)
+
+is semantically equivalent to the list:
+
+ 'foo', 'bar', 'baz'
+
+Some frequently seen examples:
+
+ use POSIX qw( setlocale localeconv )
+ @EXPORT = qw( foo bar baz );
+
+A common mistake is to try to separate the words with comma or to
+put comments into a multi-line C<qw>-string. For this reason, the
+C<use warnings> pragma and the B<-w> switch (that is, the C<$^W> variable)
+produces warnings if the STRING contains the "," or the "#" character.
+
+
+=item tr/SEARCHLIST/REPLACEMENTLIST/cds
+X<tr> X<y> X<transliterate> X</c> X</d> X</s>
+
+=item y/SEARCHLIST/REPLACEMENTLIST/cds
+
+Transliterates all occurrences of the characters found in the search list
+with the corresponding character in the replacement list. It returns
+the number of characters replaced or deleted. If no string is
+specified via the =~ or !~ operator, the $_ string is transliterated. (The
+string specified with =~ must be a scalar variable, an array element, a
+hash element, or an assignment to one of those, i.e., an lvalue.)
+
+A character range may be specified with a hyphen, so C<tr/A-J/0-9/>
+does the same replacement as C<tr/ACEGIBDFHJ/0246813579/>.
+For B<sed> devotees, C<y> is provided as a synonym for C<tr>. If the
+SEARCHLIST is delimited by bracketing quotes, the REPLACEMENTLIST has
+its own pair of quotes, which may or may not be bracketing quotes,
+e.g., C<tr[A-Z][a-z]> or C<tr(+\-*/)/ABCD/>.
+
+Note that C<tr> does B<not> do regular expression character classes
+such as C<\d> or C<[:lower:]>. The C<tr> operator is not equivalent to
+the tr(1) utility. If you want to map strings between lower/upper
+cases, see L<perlfunc/lc> and L<perlfunc/uc>, and in general consider
+using the C<s> operator if you need regular expressions.
+
+Note also that the whole range idea is rather unportable between
+character sets--and even within character sets they may cause results
+you probably didn't expect. A sound principle is to use only ranges
+that begin from and end at either alphabets of equal case (a-e, A-E),
+or digits (0-4). Anything else is unsafe. If in doubt, spell out the
+character sets in full.
+
+Options:
+
+ c Complement the SEARCHLIST.
+ d Delete found but unreplaced characters.
+ s Squash duplicate replaced characters.
+
+If the C</c> modifier is specified, the SEARCHLIST character set
+is complemented. If the C</d> modifier is specified, any characters
+specified by SEARCHLIST not found in REPLACEMENTLIST are deleted.
+(Note that this is slightly more flexible than the behavior of some
+B<tr> programs, which delete anything they find in the SEARCHLIST,
+period.) If the C</s> modifier is specified, sequences of characters
+that were transliterated to the same character are squashed down
+to a single instance of the character.
+
+If the C</d> modifier is used, the REPLACEMENTLIST is always interpreted
+exactly as specified. Otherwise, if the REPLACEMENTLIST is shorter
+than the SEARCHLIST, the final character is replicated till it is long
+enough. If the REPLACEMENTLIST is empty, the SEARCHLIST is replicated.
+This latter is useful for counting characters in a class or for
+squashing character sequences in a class.
+
+Examples:
+
+ $ARGV[1] =~ tr/A-Z/a-z/; # canonicalize to lower case
+
+ $cnt = tr/*/*/; # count the stars in $_
+
+ $cnt = $sky =~ tr/*/*/; # count the stars in $sky
+
+ $cnt = tr/0-9//; # count the digits in $_
+
+ tr/a-zA-Z//s; # bookkeeper -> bokeper
+
+ ($HOST = $host) =~ tr/a-z/A-Z/;
+
+ tr/a-zA-Z/ /cs; # change non-alphas to single space
+
+ tr [\200-\377]
+ [\000-\177]; # delete 8th bit
+
+If multiple transliterations are given for a character, only the
+first one is used:
+
+ tr/AAA/XYZ/
+
+will transliterate any A to X.
+
+Because the transliteration table is built at compile time, neither
+the SEARCHLIST nor the REPLACEMENTLIST are subjected to double quote
+interpolation. That means that if you want to use variables, you
+must use an eval():
+
+ eval "tr/$oldlist/$newlist/";
+ die $@ if $@;
+
+ eval "tr/$oldlist/$newlist/, 1" or die $@;
+
+=item <<EOF
+X<here-doc> X<heredoc> X<here-document> X<<< << >>>
+
+A line-oriented form of quoting is based on the shell "here-document"
+syntax. Following a C<< << >> you specify a string to terminate
+the quoted material, and all lines following the current line down to
+the terminating string are the value of the item.
+
+The terminating string may be either an identifier (a word), or some
+quoted text. An unquoted identifier works like double quotes.
+There may not be a space between the C<< << >> and the identifier,
+unless the identifier is explicitly quoted. (If you put a space it
+will be treated as a null identifier, which is valid, and matches the
+first empty line.) The terminating string must appear by itself
+(unquoted and with no surrounding whitespace) on the terminating line.
+
+If the terminating string is quoted, the type of quotes used determine
+the treatment of the text.
+
+=over 4
+
+=item Double Quotes
+
+Double quotes indicate that the text will be interpolated using exactly
+the same rules as normal double quoted strings.
+
+ print <<EOF;
+ The price is $Price.
+ EOF
+
+ print << "EOF"; # same as above
+ The price is $Price.
+ EOF
+
+
+=item Single Quotes
+
+Single quotes indicate the text is to be treated literally with no
+interpolation of its content. This is similar to single quoted
+strings except that backslashes have no special meaning, with C<\\>
+being treated as two backslashes and not one as they would in every
+other quoting construct.
+
+This is the only form of quoting in perl where there is no need
+to worry about escaping content, something that code generators
+can and do make good use of.
+
+=item Backticks
+
+The content of the here doc is treated just as it would be if the
+string were embedded in backticks. Thus the content is interpolated
+as though it were double quoted and then executed via the shell, with
+the results of the execution returned.
+
+ print << `EOC`; # execute command and get results
+ echo hi there
+ EOC
+
+=back
+
+It is possible to stack multiple here-docs in a row:
+
+ print <<"foo", <<"bar"; # you can stack them
+ I said foo.
+ foo
+ I said bar.
+ bar
+
+ myfunc(<< "THIS", 23, <<'THAT');
+ Here's a line
+ or two.
+ THIS
+ and here's another.
+ THAT
+
+Just don't forget that you have to put a semicolon on the end
+to finish the statement, as Perl doesn't know you're not going to
+try to do this:
+
+ print <<ABC
+ 179231
+ ABC
+ + 20;
+
+If you want to remove the line terminator from your here-docs,
+use C<chomp()>.
+
+ chomp($string = <<'END');
+ This is a string.
+ END
+
+If you want your here-docs to be indented with the rest of the code,
+you'll need to remove leading whitespace from each line manually:
+
+ ($quote = <<'FINIS') =~ s/^\s+//gm;
+ The Road goes ever on and on,
+ down from the door where it began.
+ FINIS
+
+If you use a here-doc within a delimited construct, such as in C<s///eg>,
+the quoted material must come on the lines following the final delimiter.
+So instead of
+
+ s/this/<<E . 'that'
+ the other
+ E
+ . 'more '/eg;
+
+you have to write
+
+ s/this/<<E . 'that'
+ . 'more '/eg;
+ the other
+ E
+
+If the terminating identifier is on the last line of the program, you
+must be sure there is a newline after it; otherwise, Perl will give the
+warning B<Can't find string terminator "END" anywhere before EOF...>.
+
+Additionally, the quoting rules for the end of string identifier are not
+related to Perl's quoting rules -- C<q()>, C<qq()>, and the like are not
+supported in place of C<''> and C<"">, and the only interpolation is for
+backslashing the quoting character:
+
+ print << "abc\"def";
+ testing...
+ abc"def
+
+Finally, quoted strings cannot span multiple lines. The general rule is
+that the identifier must be a string literal. Stick with that, and you
+should be safe.
+
+=back
+
+=head2 Gory details of parsing quoted constructs
+X<quote, gory details>
+
+When presented with something that might have several different
+interpretations, Perl uses the B<DWIM> (that's "Do What I Mean")
+principle to pick the most probable interpretation. This strategy
+is so successful that Perl programmers often do not suspect the
+ambivalence of what they write. But from time to time, Perl's
+notions differ substantially from what the author honestly meant.
+
+This section hopes to clarify how Perl handles quoted constructs.
+Although the most common reason to learn this is to unravel labyrinthine
+regular expressions, because the initial steps of parsing are the
+same for all quoting operators, they are all discussed together.
+
+The most important Perl parsing rule is the first one discussed
+below: when processing a quoted construct, Perl first finds the end
+of that construct, then interprets its contents. If you understand
+this rule, you may skip the rest of this section on the first
+reading. The other rules are likely to contradict the user's
+expectations much less frequently than this first one.
+
+Some passes discussed below are performed concurrently, but because
+their results are the same, we consider them individually. For different
+quoting constructs, Perl performs different numbers of passes, from
+one to four, but these passes are always performed in the same order.
+
+=over 4
+
+=item Finding the end
+
+The first pass is finding the end of the quoted construct, where
+the information about the delimiters is used in parsing.
+During this search, text between the starting and ending delimiters
+is copied to a safe location. The text copied gets delimiter-independent.
+
+If the construct is a here-doc, the ending delimiter is a line
+that has a terminating string as the content. Therefore C<<<EOF> is
+terminated by C<EOF> immediately followed by C<"\n"> and starting
+from the first column of the terminating line.
+When searching for the terminating line of a here-doc, nothing
+is skipped. In other words, lines after the here-doc syntax
+are compared with the terminating string line by line.
+
+For the constructs except here-docs, single characters are used as starting
+and ending delimiters. If the starting delimiter is an opening punctuation
+(that is C<(>, C<[>, C<{>, or C<< < >>), the ending delimiter is the
+corresponding closing punctuation (that is C<)>, C<]>, C<}>, or C<< > >>).
+If the starting delimiter is an unpaired character like C</> or a closing
+punctuation, the ending delimiter is same as the starting delimiter.
+Therefore a C</> terminates a C<qq//> construct, while a C<]> terminates
+C<qq[]> and C<qq]]> constructs.
+
+When searching for single-character delimiters, escaped delimiters
+and C<\\> are skipped. For example, while searching for terminating C</>,
+combinations of C<\\> and C<\/> are skipped. If the delimiters are
+bracketing, nested pairs are also skipped. For example, while searching
+for closing C<]> paired with the opening C<[>, combinations of C<\\>, C<\]>,
+and C<\[> are all skipped, and nested C<[> and C<]> are skipped as well.
+However, when backslashes are used as the delimiters (like C<qq\\> and
+C<tr\\\>), nothing is skipped.
+During the search for the end, backslashes that escape delimiters
+are removed (exactly speaking, they are not copied to the safe location).
+
+For constructs with three-part delimiters (C<s///>, C<y///>, and
+C<tr///>), the search is repeated once more.
+If the first delimiter is not an opening punctuation, three delimiters must
+be same such as C<s!!!> and C<tr)))>, in which case the second delimiter
+terminates the left part and starts the right part at once.
+If the left part is delimited by bracketing punctuations (that is C<()>,
+C<[]>, C<{}>, or C<< <> >>), the right part needs another pair of
+delimiters such as C<s(){}> and C<tr[]//>. In these cases, whitespaces
+and comments are allowed between both parts, though the comment must follow
+at least one whitespace; otherwise a character expected as the start of
+the comment may be regarded as the starting delimiter of the right part.
+
+During this search no attention is paid to the semantics of the construct.
+Thus:
+
+ "$hash{"$foo/$bar"}"
+
+or:
+
+ m/
+ bar # NOT a comment, this slash / terminated m//!
+ /x
+
+do not form legal quoted expressions. The quoted part ends on the
+first C<"> and C</>, and the rest happens to be a syntax error.
+Because the slash that terminated C<m//> was followed by a C<SPACE>,
+the example above is not C<m//x>, but rather C<m//> with no C</x>
+modifier. So the embedded C<#> is interpreted as a literal C<#>.
+
+Also no attention is paid to C<\c\> (multichar control char syntax) during
+this search. Thus the second C<\> in C<qq/\c\/> is interpreted as a part
+of C<\/>, and the following C</> is not recognized as a delimiter.
+Instead, use C<\034> or C<\x1c> at the end of quoted constructs.
+
+=item Interpolation
+X<interpolation>
+
+The next step is interpolation in the text obtained, which is now
+delimiter-independent. There are multiple cases.
+
+=over 4
+
+=item C<<<'EOF'>
+
+No interpolation is performed.
+Note that the combination C<\\> is left intact, since escaped delimiters
+are not available for here-docs.
+
+=item C<m''>, the pattern of C<s'''>
+
+No interpolation is performed at this stage.
+Any backslashed sequences including C<\\> are treated at the stage
+to L</"parsing regular expressions">.
+
+=item C<''>, C<q//>, C<tr'''>, C<y'''>, the replacement of C<s'''>
+
+The only interpolation is removal of C<\> from pairs of C<\\>.
+Therefore C<-> in C<tr'''> and C<y'''> is treated literally
+as a hyphen and no character range is available.
+C<\1> in the replacement of C<s'''> does not work as C<$1>.
+
+=item C<tr///>, C<y///>
+
+No variable interpolation occurs. String modifying combinations for
+case and quoting such as C<\Q>, C<\U>, and C<\E> are not recognized.
+The other escape sequences such as C<\200> and C<\t> and backslashed
+characters such as C<\\> and C<\-> are converted to appropriate literals.
+The character C<-> is treated specially and therefore C<\-> is treated
+as a literal C<->.
+
+=item C<"">, C<``>, C<qq//>, C<qx//>, C<< <file*glob> >>, C<<<"EOF">
+
+C<\Q>, C<\U>, C<\u>, C<\L>, C<\l> (possibly paired with C<\E>) are
+converted to corresponding Perl constructs. Thus, C<"$foo\Qbaz$bar">
+is converted to C<$foo . (quotemeta("baz" . $bar))> internally.
+The other escape sequences such as C<\200> and C<\t> and backslashed
+characters such as C<\\> and C<\-> are replaced with appropriate
+expansions.
+
+Let it be stressed that I<whatever falls between C<\Q> and C<\E>>
+is interpolated in the usual way. Something like C<"\Q\\E"> has
+no C<\E> inside. instead, it has C<\Q>, C<\\>, and C<E>, so the
+result is the same as for C<"\\\\E">. As a general rule, backslashes
+between C<\Q> and C<\E> may lead to counterintuitive results. So,
+C<"\Q\t\E"> is converted to C<quotemeta("\t")>, which is the same
+as C<"\\\t"> (since TAB is not alphanumeric). Note also that:
+
+ $str = '\t';
+ return "\Q$str";
+
+may be closer to the conjectural I<intention> of the writer of C<"\Q\t\E">.
+
+Interpolated scalars and arrays are converted internally to the C<join> and
+C<.> catenation operations. Thus, C<"$foo XXX '@arr'"> becomes:
+
+ $foo . " XXX '" . (join $", @arr) . "'";
+
+All operations above are performed simultaneously, left to right.
+
+Because the result of C<"\Q STRING \E"> has all metacharacters
+quoted, there is no way to insert a literal C<$> or C<@> inside a
+C<\Q\E> pair. If protected by C<\>, C<$> will be quoted to became
+C<"\\\$">; if not, it is interpreted as the start of an interpolated
+scalar.
+
+Note also that the interpolation code needs to make a decision on
+where the interpolated scalar ends. For instance, whether
+C<< "a $b -> {c}" >> really means:
+
+ "a " . $b . " -> {c}";
+
+or:
+
+ "a " . $b -> {c};
+
+Most of the time, the longest possible text that does not include
+spaces between components and which contains matching braces or
+brackets. because the outcome may be determined by voting based
+on heuristic estimators, the result is not strictly predictable.
+Fortunately, it's usually correct for ambiguous cases.
+
+=item the replacement of C<s///>
+
+Processing of C<\Q>, C<\U>, C<\u>, C<\L>, C<\l>, and interpolation
+happens as with C<qq//> constructs.
+
+It is at this step that C<\1> is begrudgingly converted to C<$1> in
+the replacement text of C<s///>, in order to correct the incorrigible
+I<sed> hackers who haven't picked up the saner idiom yet. A warning
+is emitted if the C<use warnings> pragma or the B<-w> command-line flag
+(that is, the C<$^W> variable) was set.
+
+=item C<RE> in C<?RE?>, C</RE/>, C<m/RE/>, C<s/RE/foo/>,
+
+Processing of C<\Q>, C<\U>, C<\u>, C<\L>, C<\l>, C<\E>,
+and interpolation happens (almost) as with C<qq//> constructs.
+
+However any other combinations of C<\> followed by a character
+are not substituted but only skipped, in order to parse them
+as regular expressions at the following step.
+As C<\c> is skipped at this step, C<@> of C<\c@> in RE is possibly
+treated as an array symbol (for example C<@foo>),
+even though the same text in C<qq//> gives interpolation of C<\c@>.
+
+Moreover, inside C<(?{BLOCK})>, C<(?# comment )>, and
+a C<#>-comment in a C<//x>-regular expression, no processing is
+performed whatsoever. This is the first step at which the presence
+of the C<//x> modifier is relevant.
+
+Interpolation in patterns has several quirks: C<$|>, C<$(>, C<$)>, C<@+>
+and C<@-> are not interpolated, and constructs C<$var[SOMETHING]> are
+voted (by several different estimators) to be either an array element
+or C<$var> followed by an RE alternative. This is where the notation
+C<${arr[$bar]}> comes handy: C</${arr[0-9]}/> is interpreted as
+array element C<-9>, not as a regular expression from the variable
+C<$arr> followed by a digit, which would be the interpretation of
+C</$arr[0-9]/>. Since voting among different estimators may occur,
+the result is not predictable.
+
+The lack of processing of C<\\> creates specific restrictions on
+the post-processed text. If the delimiter is C</>, one cannot get
+the combination C<\/> into the result of this step. C</> will
+finish the regular expression, C<\/> will be stripped to C</> on
+the previous step, and C<\\/> will be left as is. Because C</> is
+equivalent to C<\/> inside a regular expression, this does not
+matter unless the delimiter happens to be character special to the
+RE engine, such as in C<s*foo*bar*>, C<m[foo]>, or C<?foo?>; or an
+alphanumeric char, as in:
+
+ m m ^ a \s* b mmx;
+
+In the RE above, which is intentionally obfuscated for illustration, the
+delimiter is C<m>, the modifier is C<mx>, and after delimiter-removal the
+RE is the same as for C<m/ ^ a \s* b /mx>. There's more than one
+reason you're encouraged to restrict your delimiters to non-alphanumeric,
+non-whitespace choices.
+
+=back
+
+This step is the last one for all constructs except regular expressions,
+which are processed further.
+
+=item parsing regular expressions
+X<regexp, parse>
+
+Previous steps were performed during the compilation of Perl code,
+but this one happens at run time--although it may be optimized to
+be calculated at compile time if appropriate. After preprocessing
+described above, and possibly after evaluation if concatenation,
+joining, casing translation, or metaquoting are involved, the
+resulting I<string> is passed to the RE engine for compilation.
+
+Whatever happens in the RE engine might be better discussed in L<perlre>,
+but for the sake of continuity, we shall do so here.
+
+This is another step where the presence of the C<//x> modifier is
+relevant. The RE engine scans the string from left to right and
+converts it to a finite automaton.
+
+Backslashed characters are either replaced with corresponding
+literal strings (as with C<\{>), or else they generate special nodes
+in the finite automaton (as with C<\b>). Characters special to the
+RE engine (such as C<|>) generate corresponding nodes or groups of
+nodes. C<(?#...)> comments are ignored. All the rest is either
+converted to literal strings to match, or else is ignored (as is
+whitespace and C<#>-style comments if C<//x> is present).
+
+Parsing of the bracketed character class construct, C<[...]>, is
+rather different than the rule used for the rest of the pattern.
+The terminator of this construct is found using the same rules as
+for finding the terminator of a C<{}>-delimited construct, the only
+exception being that C<]> immediately following C<[> is treated as
+though preceded by a backslash. Similarly, the terminator of
+C<(?{...})> is found using the same rules as for finding the
+terminator of a C<{}>-delimited construct.
+
+It is possible to inspect both the string given to RE engine and the
+resulting finite automaton. See the arguments C<debug>/C<debugcolor>
+in the C<use L<re>> pragma, as well as Perl's B<-Dr> command-line
+switch documented in L<perlrun/"Command Switches">.
+
+=item Optimization of regular expressions
+X<regexp, optimization>
+
+This step is listed for completeness only. Since it does not change
+semantics, details of this step are not documented and are subject
+to change without notice. This step is performed over the finite
+automaton that was generated during the previous pass.
+
+It is at this stage that C<split()> silently optimizes C</^/> to
+mean C</^/m>.
+
+=back
+
+=head2 I/O Operators
+X<operator, i/o> X<operator, io> X<io> X<while> X<filehandle>
+X<< <> >> X<@ARGV>
+
+There are several I/O operators you should know about.
+
+A string enclosed by backticks (grave accents) first undergoes
+double-quote interpolation. It is then interpreted as an external
+command, and the output of that command is the value of the
+backtick string, like in a shell. In scalar context, a single string
+consisting of all output is returned. In list context, a list of
+values is returned, one per line of output. (You can set C<$/> to use
+a different line terminator.) The command is executed each time the
+pseudo-literal is evaluated. The status value of the command is
+returned in C<$?> (see L<perlvar> for the interpretation of C<$?>).
+Unlike in B<csh>, no translation is done on the return data--newlines
+remain newlines. Unlike in any of the shells, single quotes do not
+hide variable names in the command from interpretation. To pass a
+literal dollar-sign through to the shell you need to hide it with a
+backslash. The generalized form of backticks is C<qx//>. (Because
+backticks always undergo shell expansion as well, see L<perlsec> for
+security concerns.)
+X<qx> X<`> X<``> X<backtick> X<glob>
+
+In scalar context, evaluating a filehandle in angle brackets yields
+the next line from that file (the newline, if any, included), or
+C<undef> at end-of-file or on error. When C<$/> is set to C<undef>
+(sometimes known as file-slurp mode) and the file is empty, it
+returns C<''> the first time, followed by C<undef> subsequently.
+
+Ordinarily you must assign the returned value to a variable, but
+there is one situation where an automatic assignment happens. If
+and only if the input symbol is the only thing inside the conditional
+of a C<while> statement (even if disguised as a C<for(;;)> loop),
+the value is automatically assigned to the global variable $_,
+destroying whatever was there previously. (This may seem like an
+odd thing to you, but you'll use the construct in almost every Perl
+script you write.) The $_ variable is not implicitly localized.
+You'll have to put a C<local $_;> before the loop if you want that
+to happen.
+
+The following lines are equivalent:
+
+ while (defined($_ = <STDIN>)) { print; }
+ while ($_ = <STDIN>) { print; }
+ while (<STDIN>) { print; }
+ for (;<STDIN>;) { print; }
+ print while defined($_ = <STDIN>);
+ print while ($_ = <STDIN>);
+ print while <STDIN>;
+
+This also behaves similarly, but avoids $_ :
+
+ while (my $line = <STDIN>) { print $line }
+
+In these loop constructs, the assigned value (whether assignment
+is automatic or explicit) is then tested to see whether it is
+defined. The defined test avoids problems where line has a string
+value that would be treated as false by Perl, for example a "" or
+a "0" with no trailing newline. If you really mean for such values
+to terminate the loop, they should be tested for explicitly:
+
+ while (($_ = <STDIN>) ne '0') { ... }
+ while (<STDIN>) { last unless $_; ... }
+
+In other boolean contexts, C<< <I<filehandle>> >> without an
+explicit C<defined> test or comparison elicit a warning if the
+C<use warnings> pragma or the B<-w>
+command-line switch (the C<$^W> variable) is in effect.
+
+The filehandles STDIN, STDOUT, and STDERR are predefined. (The
+filehandles C<stdin>, C<stdout>, and C<stderr> will also work except
+in packages, where they would be interpreted as local identifiers
+rather than global.) Additional filehandles may be created with
+the open() function, amongst others. See L<perlopentut> and
+L<perlfunc/open> for details on this.
+X<stdin> X<stdout> X<sterr>
+
+If a <FILEHANDLE> is used in a context that is looking for
+a list, a list comprising all input lines is returned, one line per
+list element. It's easy to grow to a rather large data space this
+way, so use with care.
+
+<FILEHANDLE> may also be spelled C<readline(*FILEHANDLE)>.
+See L<perlfunc/readline>.
+
+The null filehandle <> is special: it can be used to emulate the
+behavior of B<sed> and B<awk>. Input from <> comes either from
+standard input, or from each file listed on the command line. Here's
+how it works: the first time <> is evaluated, the @ARGV array is
+checked, and if it is empty, C<$ARGV[0]> is set to "-", which when opened
+gives you standard input. The @ARGV array is then processed as a list
+of filenames. The loop
+
+ while (<>) {
+ ... # code for each line
+ }
+
+is equivalent to the following Perl-like pseudo code:
+
+ unshift(@ARGV, '-') unless @ARGV;
+ while ($ARGV = shift) {
+ open(ARGV, $ARGV);
+ while (<ARGV>) {
+ ... # code for each line
+ }
+ }
+
+except that it isn't so cumbersome to say, and will actually work.
+It really does shift the @ARGV array and put the current filename
+into the $ARGV variable. It also uses filehandle I<ARGV>
+internally--<> is just a synonym for <ARGV>, which
+is magical. (The pseudo code above doesn't work because it treats
+<ARGV> as non-magical.)
+
+Since the null filehandle uses the two argument form of L<perlfunc/open>
+it interprets special characters, so if you have a script like this:
+
+ while (<>) {
+ print;
+ }
+
+and call it with C<perl dangerous.pl 'rm -rfv *|'>, it actually opens a
+pipe, executes the C<rm> command and reads C<rm>'s output from that pipe.
+If you want all items in C<@ARGV> to be interpreted as file names, you
+can use the module C<ARGV::readonly> from CPAN.
+
+You can modify @ARGV before the first <> as long as the array ends up
+containing the list of filenames you really want. Line numbers (C<$.>)
+continue as though the input were one big happy file. See the example
+in L<perlfunc/eof> for how to reset line numbers on each file.
+
+If you want to set @ARGV to your own list of files, go right ahead.
+This sets @ARGV to all plain text files if no @ARGV was given:
+
+ @ARGV = grep { -f && -T } glob('*') unless @ARGV;
+
+You can even set them to pipe commands. For example, this automatically
+filters compressed arguments through B<gzip>:
+
+ @ARGV = map { /\.(gz|Z)$/ ? "gzip -dc < $_ |" : $_ } @ARGV;
+
+If you want to pass switches into your script, you can use one of the
+Getopts modules or put a loop on the front like this:
+
+ while ($_ = $ARGV[0], /^-/) {
+ shift;
+ last if /^--$/;
+ if (/^-D(.*)/) { $debug = $1 }
+ if (/^-v/) { $verbose++ }
+ # ... # other switches
+ }
+
+ while (<>) {
+ # ... # code for each line
+ }
+
+The <> symbol will return C<undef> for end-of-file only once.
+If you call it again after this, it will assume you are processing another
+@ARGV list, and if you haven't set @ARGV, will read input from STDIN.
+
+If what the angle brackets contain is a simple scalar variable (e.g.,
+<$foo>), then that variable contains the name of the
+filehandle to input from, or its typeglob, or a reference to the
+same. For example:
+
+ $fh = \*STDIN;
+ $line = <$fh>;
+
+If what's within the angle brackets is neither a filehandle nor a simple
+scalar variable containing a filehandle name, typeglob, or typeglob
+reference, it is interpreted as a filename pattern to be globbed, and
+either a list of filenames or the next filename in the list is returned,
+depending on context. This distinction is determined on syntactic
+grounds alone. That means C<< <$x> >> is always a readline() from
+an indirect handle, but C<< <$hash{key}> >> is always a glob().
+That's because $x is a simple scalar variable, but C<$hash{key}> is
+not--it's a hash element. Even C<< <$x > >> (note the extra space)
+is treated as C<glob("$x ")>, not C<readline($x)>.
+
+One level of double-quote interpretation is done first, but you can't
+say C<< <$foo> >> because that's an indirect filehandle as explained
+in the previous paragraph. (In older versions of Perl, programmers
+would insert curly brackets to force interpretation as a filename glob:
+C<< <${foo}> >>. These days, it's considered cleaner to call the
+internal function directly as C<glob($foo)>, which is probably the right
+way to have done it in the first place.) For example:
+
+ while (<*.c>) {
+ chmod 0644, $_;
+ }
+
+is roughly equivalent to:
+
+ open(FOO, "echo *.c | tr -s ' \t\r\f' '\\012\\012\\012\\012'|");
+ while (<FOO>) {
+ chomp;
+ chmod 0644, $_;
+ }
+
+except that the globbing is actually done internally using the standard
+C<File::Glob> extension. Of course, the shortest way to do the above is:
+
+ chmod 0644, <*.c>;
+
+A (file)glob evaluates its (embedded) argument only when it is
+starting a new list. All values must be read before it will start
+over. In list context, this isn't important because you automatically
+get them all anyway. However, in scalar context the operator returns
+the next value each time it's called, or C<undef> when the list has
+run out. As with filehandle reads, an automatic C<defined> is
+generated when the glob occurs in the test part of a C<while>,
+because legal glob returns (e.g. a file called F<0>) would otherwise
+terminate the loop. Again, C<undef> is returned only once. So if
+you're expecting a single value from a glob, it is much better to
+say
+
+ ($file) = <blurch*>;
+
+than
+
+ $file = <blurch*>;
+
+because the latter will alternate between returning a filename and
+returning false.
+
+If you're trying to do variable interpolation, it's definitely better
+to use the glob() function, because the older notation can cause people
+to become confused with the indirect filehandle notation.
+
+ @files = glob("$dir/*.[ch]");
+ @files = glob($files[$i]);
+
+=head2 Constant Folding
+X<constant folding> X<folding>
+
+Like C, Perl does a certain amount of expression evaluation at
+compile time whenever it determines that all arguments to an
+operator are static and have no side effects. In particular, string
+concatenation happens at compile time between literals that don't do
+variable substitution. Backslash interpolation also happens at
+compile time. You can say
+
+ 'Now is the time for all' . "\n" .
+ 'good men to come to.'
+
+and this all reduces to one string internally. Likewise, if
+you say
+
+ foreach $file (@filenames) {
+ if (-s $file > 5 + 100 * 2**16) { }
+ }
+
+the compiler will precompute the number which that expression
+represents so that the interpreter won't have to.
+
+=head2 No-ops
+X<no-op> X<nop>
+
+Perl doesn't officially have a no-op operator, but the bare constants
+C<0> and C<1> are special-cased to not produce a warning in a void
+context, so you can for example safely do
+
+ 1 while foo();
+
+=head2 Bitwise String Operators
+X<operator, bitwise, string>
+
+Bitstrings of any size may be manipulated by the bitwise operators
+(C<~ | & ^>).
+
+If the operands to a binary bitwise op are strings of different
+sizes, B<|> and B<^> ops act as though the shorter operand had
+additional zero bits on the right, while the B<&> op acts as though
+the longer operand were truncated to the length of the shorter.
+The granularity for such extension or truncation is one or more
+bytes.
+
+ # ASCII-based examples
+ print "j p \n" ^ " a h"; # prints "JAPH\n"
+ print "JA" | " ph\n"; # prints "japh\n"
+ print "japh\nJunk" & '_____'; # prints "JAPH\n";
+ print 'p N$' ^ " E<H\n"; # prints "Perl\n";
+
+If you are intending to manipulate bitstrings, be certain that
+you're supplying bitstrings: If an operand is a number, that will imply
+a B<numeric> bitwise operation. You may explicitly show which type of
+operation you intend by using C<""> or C<0+>, as in the examples below.
+
+ $foo = 150 | 105; # yields 255 (0x96 | 0x69 is 0xFF)
+ $foo = '150' | 105; # yields 255
+ $foo = 150 | '105'; # yields 255
+ $foo = '150' | '105'; # yields string '155' (under ASCII)
+
+ $baz = 0+$foo & 0+$bar; # both ops explicitly numeric
+ $biz = "$foo" ^ "$bar"; # both ops explicitly stringy
+
+See L<perlfunc/vec> for information on how to manipulate individual bits
+in a bit vector.
+
+=head2 Integer Arithmetic
+X<integer>
+
+By default, Perl assumes that it must do most of its arithmetic in
+floating point. But by saying
+
+ use integer;
+
+you may tell the compiler that it's okay to use integer operations
+(if it feels like it) from here to the end of the enclosing BLOCK.
+An inner BLOCK may countermand this by saying
+
+ no integer;
+
+which lasts until the end of that BLOCK. Note that this doesn't
+mean everything is only an integer, merely that Perl may use integer
+operations if it is so inclined. For example, even under C<use
+integer>, if you take the C<sqrt(2)>, you'll still get C<1.4142135623731>
+or so.
+
+Used on numbers, the bitwise operators ("&", "|", "^", "~", "<<",
+and ">>") always produce integral results. (But see also
+L<Bitwise String Operators>.) However, C<use integer> still has meaning for
+them. By default, their results are interpreted as unsigned integers, but
+if C<use integer> is in effect, their results are interpreted
+as signed integers. For example, C<~0> usually evaluates to a large
+integral value. However, C<use integer; ~0> is C<-1> on two's-complement
+machines.
+
+=head2 Floating-point Arithmetic
+X<floating-point> X<floating point> X<float> X<real>
+
+While C<use integer> provides integer-only arithmetic, there is no
+analogous mechanism to provide automatic rounding or truncation to a
+certain number of decimal places. For rounding to a certain number
+of digits, sprintf() or printf() is usually the easiest route.
+See L<perlfaq4>.
+
+Floating-point numbers are only approximations to what a mathematician
+would call real numbers. There are infinitely more reals than floats,
+so some corners must be cut. For example:
+
+ printf "%.20g\n", 123456789123456789;
+ # produces 123456789123456784
+
+Testing for exact equality of floating-point equality or inequality is
+not a good idea. Here's a (relatively expensive) work-around to compare
+whether two floating-point numbers are equal to a particular number of
+decimal places. See Knuth, volume II, for a more robust treatment of
+this topic.
+
+ sub fp_equal {
+ my ($X, $Y, $POINTS) = @_;
+ my ($tX, $tY);
+ $tX = sprintf("%.${POINTS}g", $X);
+ $tY = sprintf("%.${POINTS}g", $Y);
+ return $tX eq $tY;
+ }
+
+The POSIX module (part of the standard perl distribution) implements
+ceil(), floor(), and other mathematical and trigonometric functions.
+The Math::Complex module (part of the standard perl distribution)
+defines mathematical functions that work on both the reals and the
+imaginary numbers. Math::Complex not as efficient as POSIX, but
+POSIX can't work with complex numbers.
+
+Rounding in financial applications can have serious implications, and
+the rounding method used should be specified precisely. In these
+cases, it probably pays not to trust whichever system rounding is
+being used by Perl, but to instead implement the rounding function you
+need yourself.
+
+=head2 Bigger Numbers
+X<number, arbitrary precision>
+
+The standard Math::BigInt and Math::BigFloat modules provide
+variable-precision arithmetic and overloaded operators, although
+they're currently pretty slow. At the cost of some space and
+considerable speed, they avoid the normal pitfalls associated with
+limited-precision representations.
+
+ use Math::BigInt;
+ $x = Math::BigInt->new('123456789123456789');
+ print $x * $x;
+
+ # prints +15241578780673678515622620750190521
+
+There are several modules that let you calculate with (bound only by
+memory and cpu-time) unlimited or fixed precision. There are also
+some non-standard modules that provide faster implementations via
+external C libraries.
+
+Here is a short, but incomplete summary:
+
+ Math::Fraction big, unlimited fractions like 9973 / 12967
+ Math::String treat string sequences like numbers
+ Math::FixedPrecision calculate with a fixed precision
+ Math::Currency for currency calculations
+ Bit::Vector manipulate bit vectors fast (uses C)
+ Math::BigIntFast Bit::Vector wrapper for big numbers
+ Math::Pari provides access to the Pari C library
+ Math::BigInteger uses an external C library
+ Math::Cephes uses external Cephes C library (no big numbers)
+ Math::Cephes::Fraction fractions via the Cephes library
+ Math::GMP another one using an external C library
+
+Choose wisely.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlopenbsd.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlopenbsd.pod
new file mode 100755
index 00000000000..b1d5eea14f4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlopenbsd.pod
@@ -0,0 +1,30 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+README.openbsd - Perl version 5 on OpenBSD systems
+
+=head1 DESCRIPTION
+
+This document describes various features of OpenBSD that will affect how Perl
+version 5 (hereafter just Perl) is compiled and/or runs.
+
+=head2 OpenBSD core dumps from getprotobyname_r and getservbyname_r with ithreads
+
+When Perl is configured to use ithreads, it will use re-entrant library calls
+in preference to non-re-entrant versions. There is an incompatability in
+OpenBSD's C<getprotobyname_r> and C<getservbyname_r> function in versions 3.7
+and later that will cause a SEGV when called without doing a C<bzero> on
+their return structs prior to calling these functions. Current Perl's
+should handle this problem correctly. Older threaded Perls (5.8.6 or earlier)
+will run into this problem. If you want to run a threaded Perl on OpenBSD
+3.7 or higher, you will need to upgrade to at least Perl 5.8.7.
+
+=head1 AUTHOR
+
+Steve Peters <steve@fisharerojo.org>
+
+Please report any errors, updates, or suggestions to F<perlbug@perl.org>.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlopentut.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlopentut.pod
new file mode 100755
index 00000000000..b9033786b66
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlopentut.pod
@@ -0,0 +1,981 @@
+=head1 NAME
+
+perlopentut - tutorial on opening things in Perl
+
+=head1 DESCRIPTION
+
+Perl has two simple, built-in ways to open files: the shell way for
+convenience, and the C way for precision. The shell way also has 2- and
+3-argument forms, which have different semantics for handling the filename.
+The choice is yours.
+
+=head1 Open E<agrave> la shell
+
+Perl's C<open> function was designed to mimic the way command-line
+redirection in the shell works. Here are some basic examples
+from the shell:
+
+ $ myprogram file1 file2 file3
+ $ myprogram < inputfile
+ $ myprogram > outputfile
+ $ myprogram >> outputfile
+ $ myprogram | otherprogram
+ $ otherprogram | myprogram
+
+And here are some more advanced examples:
+
+ $ otherprogram | myprogram f1 - f2
+ $ otherprogram 2>&1 | myprogram -
+ $ myprogram <&3
+ $ myprogram >&4
+
+Programmers accustomed to constructs like those above can take comfort
+in learning that Perl directly supports these familiar constructs using
+virtually the same syntax as the shell.
+
+=head2 Simple Opens
+
+The C<open> function takes two arguments: the first is a filehandle,
+and the second is a single string comprising both what to open and how
+to open it. C<open> returns true when it works, and when it fails,
+returns a false value and sets the special variable C<$!> to reflect
+the system error. If the filehandle was previously opened, it will
+be implicitly closed first.
+
+For example:
+
+ open(INFO, "datafile") || die("can't open datafile: $!");
+ open(INFO, "< datafile") || die("can't open datafile: $!");
+ open(RESULTS,"> runstats") || die("can't open runstats: $!");
+ open(LOG, ">> logfile ") || die("can't open logfile: $!");
+
+If you prefer the low-punctuation version, you could write that this way:
+
+ open INFO, "< datafile" or die "can't open datafile: $!";
+ open RESULTS,"> runstats" or die "can't open runstats: $!";
+ open LOG, ">> logfile " or die "can't open logfile: $!";
+
+A few things to notice. First, the leading less-than is optional.
+If omitted, Perl assumes that you want to open the file for reading.
+
+Note also that the first example uses the C<||> logical operator, and the
+second uses C<or>, which has lower precedence. Using C<||> in the latter
+examples would effectively mean
+
+ open INFO, ( "< datafile" || die "can't open datafile: $!" );
+
+which is definitely not what you want.
+
+The other important thing to notice is that, just as in the shell,
+any whitespace before or after the filename is ignored. This is good,
+because you wouldn't want these to do different things:
+
+ open INFO, "<datafile"
+ open INFO, "< datafile"
+ open INFO, "< datafile"
+
+Ignoring surrounding whitespace also helps for when you read a filename
+in from a different file, and forget to trim it before opening:
+
+ $filename = <INFO>; # oops, \n still there
+ open(EXTRA, "< $filename") || die "can't open $filename: $!";
+
+This is not a bug, but a feature. Because C<open> mimics the shell in
+its style of using redirection arrows to specify how to open the file, it
+also does so with respect to extra whitespace around the filename itself
+as well. For accessing files with naughty names, see
+L<"Dispelling the Dweomer">.
+
+There is also a 3-argument version of C<open>, which lets you put the
+special redirection characters into their own argument:
+
+ open( INFO, ">", $datafile ) || die "Can't create $datafile: $!";
+
+In this case, the filename to open is the actual string in C<$datafile>,
+so you don't have to worry about C<$datafile> containing characters
+that might influence the open mode, or whitespace at the beginning of
+the filename that would be absorbed in the 2-argument version. Also,
+any reduction of unnecessary string interpolation is a good thing.
+
+=head2 Indirect Filehandles
+
+C<open>'s first argument can be a reference to a filehandle. As of
+perl 5.6.0, if the argument is uninitialized, Perl will automatically
+create a filehandle and put a reference to it in the first argument,
+like so:
+
+ open( my $in, $infile ) or die "Couldn't read $infile: $!";
+ while ( <$in> ) {
+ # do something with $_
+ }
+ close $in;
+
+Indirect filehandles make namespace management easier. Since filehandles
+are global to the current package, two subroutines trying to open
+C<INFILE> will clash. With two functions opening indirect filehandles
+like C<my $infile>, there's no clash and no need to worry about future
+conflicts.
+
+Another convenient behavior is that an indirect filehandle automatically
+closes when it goes out of scope or when you undefine it:
+
+ sub firstline {
+ open( my $in, shift ) && return scalar <$in>;
+ # no close() required
+ }
+
+=head2 Pipe Opens
+
+In C, when you want to open a file using the standard I/O library,
+you use the C<fopen> function, but when opening a pipe, you use the
+C<popen> function. But in the shell, you just use a different redirection
+character. That's also the case for Perl. The C<open> call
+remains the same--just its argument differs.
+
+If the leading character is a pipe symbol, C<open> starts up a new
+command and opens a write-only filehandle leading into that command.
+This lets you write into that handle and have what you write show up on
+that command's standard input. For example:
+
+ open(PRINTER, "| lpr -Plp1") || die "can't run lpr: $!";
+ print PRINTER "stuff\n";
+ close(PRINTER) || die "can't close lpr: $!";
+
+If the trailing character is a pipe, you start up a new command and open a
+read-only filehandle leading out of that command. This lets whatever that
+command writes to its standard output show up on your handle for reading.
+For example:
+
+ open(NET, "netstat -i -n |") || die "can't fork netstat: $!";
+ while (<NET>) { } # do something with input
+ close(NET) || die "can't close netstat: $!";
+
+What happens if you try to open a pipe to or from a non-existent
+command? If possible, Perl will detect the failure and set C<$!> as
+usual. But if the command contains special shell characters, such as
+C<E<gt>> or C<*>, called 'metacharacters', Perl does not execute the
+command directly. Instead, Perl runs the shell, which then tries to
+run the command. This means that it's the shell that gets the error
+indication. In such a case, the C<open> call will only indicate
+failure if Perl can't even run the shell. See L<perlfaq8/"How can I
+capture STDERR from an external command?"> to see how to cope with
+this. There's also an explanation in L<perlipc>.
+
+If you would like to open a bidirectional pipe, the IPC::Open2
+library will handle this for you. Check out
+L<perlipc/"Bidirectional Communication with Another Process">
+
+perl-5.6.x introduced a version of piped open that executes a process
+based on its command line arguments without relying on the shell. (Similar
+to the C<system(@LIST)> notation.) This is safer and faster than executing
+a single argument pipe-command, but does not allow special shell
+constructs. (It is also not supported on Microsoft Windows, Mac OS Classic
+or RISC OS.)
+
+Here's an example of C<open '-|'>, which prints a random Unix
+fortune cookie as uppercase:
+
+ my $collection = shift(@ARGV);
+ open my $fortune, '-|', 'fortune', $collection
+ or die "Could not find fortune - $!";
+ while (<$fortune>)
+ {
+ print uc($_);
+ }
+ close($fortune);
+
+And this C<open '|-'> pipes into lpr:
+
+ open my $printer, '|-', 'lpr', '-Plp1'
+ or die "can't run lpr: $!";
+ print {$printer} "stuff\n";
+ close($printer)
+ or die "can't close lpr: $!";
+
+=head2 The Minus File
+
+Again following the lead of the standard shell utilities, Perl's
+C<open> function treats a file whose name is a single minus, "-", in a
+special way. If you open minus for reading, it really means to access
+the standard input. If you open minus for writing, it really means to
+access the standard output.
+
+If minus can be used as the default input or default output, what happens
+if you open a pipe into or out of minus? What's the default command it
+would run? The same script as you're currently running! This is actually
+a stealth C<fork> hidden inside an C<open> call. See
+L<perlipc/"Safe Pipe Opens"> for details.
+
+=head2 Mixing Reads and Writes
+
+It is possible to specify both read and write access. All you do is
+add a "+" symbol in front of the redirection. But as in the shell,
+using a less-than on a file never creates a new file; it only opens an
+existing one. On the other hand, using a greater-than always clobbers
+(truncates to zero length) an existing file, or creates a brand-new one
+if there isn't an old one. Adding a "+" for read-write doesn't affect
+whether it only works on existing files or always clobbers existing ones.
+
+ open(WTMP, "+< /usr/adm/wtmp")
+ || die "can't open /usr/adm/wtmp: $!";
+
+ open(SCREEN, "+> lkscreen")
+ || die "can't open lkscreen: $!";
+
+ open(LOGFILE, "+>> /var/log/applog")
+ || die "can't open /var/log/applog: $!";
+
+The first one won't create a new file, and the second one will always
+clobber an old one. The third one will create a new file if necessary
+and not clobber an old one, and it will allow you to read at any point
+in the file, but all writes will always go to the end. In short,
+the first case is substantially more common than the second and third
+cases, which are almost always wrong. (If you know C, the plus in
+Perl's C<open> is historically derived from the one in C's fopen(3S),
+which it ultimately calls.)
+
+In fact, when it comes to updating a file, unless you're working on
+a binary file as in the WTMP case above, you probably don't want to
+use this approach for updating. Instead, Perl's B<-i> flag comes to
+the rescue. The following command takes all the C, C++, or yacc source
+or header files and changes all their foo's to bar's, leaving
+the old version in the original filename with a ".orig" tacked
+on the end:
+
+ $ perl -i.orig -pe 's/\bfoo\b/bar/g' *.[Cchy]
+
+This is a short cut for some renaming games that are really
+the best way to update textfiles. See the second question in
+L<perlfaq5> for more details.
+
+=head2 Filters
+
+One of the most common uses for C<open> is one you never
+even notice. When you process the ARGV filehandle using
+C<< <ARGV> >>, Perl actually does an implicit open
+on each file in @ARGV. Thus a program called like this:
+
+ $ myprogram file1 file2 file3
+
+can have all its files opened and processed one at a time
+using a construct no more complex than:
+
+ while (<>) {
+ # do something with $_
+ }
+
+If @ARGV is empty when the loop first begins, Perl pretends you've opened
+up minus, that is, the standard input. In fact, $ARGV, the currently
+open file during C<< <ARGV> >> processing, is even set to "-"
+in these circumstances.
+
+You are welcome to pre-process your @ARGV before starting the loop to
+make sure it's to your liking. One reason to do this might be to remove
+command options beginning with a minus. While you can always roll the
+simple ones by hand, the Getopts modules are good for this:
+
+ use Getopt::Std;
+
+ # -v, -D, -o ARG, sets $opt_v, $opt_D, $opt_o
+ getopts("vDo:");
+
+ # -v, -D, -o ARG, sets $args{v}, $args{D}, $args{o}
+ getopts("vDo:", \%args);
+
+Or the standard Getopt::Long module to permit named arguments:
+
+ use Getopt::Long;
+ GetOptions( "verbose" => \$verbose, # --verbose
+ "Debug" => \$debug, # --Debug
+ "output=s" => \$output );
+ # --output=somestring or --output somestring
+
+Another reason for preprocessing arguments is to make an empty
+argument list default to all files:
+
+ @ARGV = glob("*") unless @ARGV;
+
+You could even filter out all but plain, text files. This is a bit
+silent, of course, and you might prefer to mention them on the way.
+
+ @ARGV = grep { -f && -T } @ARGV;
+
+If you're using the B<-n> or B<-p> command-line options, you
+should put changes to @ARGV in a C<BEGIN{}> block.
+
+Remember that a normal C<open> has special properties, in that it might
+call fopen(3S) or it might called popen(3S), depending on what its
+argument looks like; that's why it's sometimes called "magic open".
+Here's an example:
+
+ $pwdinfo = `domainname` =~ /^(\(none\))?$/
+ ? '< /etc/passwd'
+ : 'ypcat passwd |';
+
+ open(PWD, $pwdinfo)
+ or die "can't open $pwdinfo: $!";
+
+This sort of thing also comes into play in filter processing. Because
+C<< <ARGV> >> processing employs the normal, shell-style Perl C<open>,
+it respects all the special things we've already seen:
+
+ $ myprogram f1 "cmd1|" - f2 "cmd2|" f3 < tmpfile
+
+That program will read from the file F<f1>, the process F<cmd1>, standard
+input (F<tmpfile> in this case), the F<f2> file, the F<cmd2> command,
+and finally the F<f3> file.
+
+Yes, this also means that if you have files named "-" (and so on) in
+your directory, they won't be processed as literal files by C<open>.
+You'll need to pass them as "./-", much as you would for the I<rm> program,
+or you could use C<sysopen> as described below.
+
+One of the more interesting applications is to change files of a certain
+name into pipes. For example, to autoprocess gzipped or compressed
+files by decompressing them with I<gzip>:
+
+ @ARGV = map { /\.(gz|Z)$/ ? "gzip -dc $_ |" : $_ } @ARGV;
+
+Or, if you have the I<GET> program installed from LWP,
+you can fetch URLs before processing them:
+
+ @ARGV = map { m#^\w+://# ? "GET $_ |" : $_ } @ARGV;
+
+It's not for nothing that this is called magic C<< <ARGV> >>.
+Pretty nifty, eh?
+
+=head1 Open E<agrave> la C
+
+If you want the convenience of the shell, then Perl's C<open> is
+definitely the way to go. On the other hand, if you want finer precision
+than C's simplistic fopen(3S) provides you should look to Perl's
+C<sysopen>, which is a direct hook into the open(2) system call.
+That does mean it's a bit more involved, but that's the price of
+precision.
+
+C<sysopen> takes 3 (or 4) arguments.
+
+ sysopen HANDLE, PATH, FLAGS, [MASK]
+
+The HANDLE argument is a filehandle just as with C<open>. The PATH is
+a literal path, one that doesn't pay attention to any greater-thans or
+less-thans or pipes or minuses, nor ignore whitespace. If it's there,
+it's part of the path. The FLAGS argument contains one or more values
+derived from the Fcntl module that have been or'd together using the
+bitwise "|" operator. The final argument, the MASK, is optional; if
+present, it is combined with the user's current umask for the creation
+mode of the file. You should usually omit this.
+
+Although the traditional values of read-only, write-only, and read-write
+are 0, 1, and 2 respectively, this is known not to hold true on some
+systems. Instead, it's best to load in the appropriate constants first
+from the Fcntl module, which supplies the following standard flags:
+
+ O_RDONLY Read only
+ O_WRONLY Write only
+ O_RDWR Read and write
+ O_CREAT Create the file if it doesn't exist
+ O_EXCL Fail if the file already exists
+ O_APPEND Append to the file
+ O_TRUNC Truncate the file
+ O_NONBLOCK Non-blocking access
+
+Less common flags that are sometimes available on some operating
+systems include C<O_BINARY>, C<O_TEXT>, C<O_SHLOCK>, C<O_EXLOCK>,
+C<O_DEFER>, C<O_SYNC>, C<O_ASYNC>, C<O_DSYNC>, C<O_RSYNC>,
+C<O_NOCTTY>, C<O_NDELAY> and C<O_LARGEFILE>. Consult your open(2)
+manpage or its local equivalent for details. (Note: starting from
+Perl release 5.6 the C<O_LARGEFILE> flag, if available, is automatically
+added to the sysopen() flags because large files are the default.)
+
+Here's how to use C<sysopen> to emulate the simple C<open> calls we had
+before. We'll omit the C<|| die $!> checks for clarity, but make sure
+you always check the return values in real code. These aren't quite
+the same, since C<open> will trim leading and trailing whitespace,
+but you'll get the idea.
+
+To open a file for reading:
+
+ open(FH, "< $path");
+ sysopen(FH, $path, O_RDONLY);
+
+To open a file for writing, creating a new file if needed or else truncating
+an old file:
+
+ open(FH, "> $path");
+ sysopen(FH, $path, O_WRONLY | O_TRUNC | O_CREAT);
+
+To open a file for appending, creating one if necessary:
+
+ open(FH, ">> $path");
+ sysopen(FH, $path, O_WRONLY | O_APPEND | O_CREAT);
+
+To open a file for update, where the file must already exist:
+
+ open(FH, "+< $path");
+ sysopen(FH, $path, O_RDWR);
+
+And here are things you can do with C<sysopen> that you cannot do with
+a regular C<open>. As you'll see, it's just a matter of controlling the
+flags in the third argument.
+
+To open a file for writing, creating a new file which must not previously
+exist:
+
+ sysopen(FH, $path, O_WRONLY | O_EXCL | O_CREAT);
+
+To open a file for appending, where that file must already exist:
+
+ sysopen(FH, $path, O_WRONLY | O_APPEND);
+
+To open a file for update, creating a new file if necessary:
+
+ sysopen(FH, $path, O_RDWR | O_CREAT);
+
+To open a file for update, where that file must not already exist:
+
+ sysopen(FH, $path, O_RDWR | O_EXCL | O_CREAT);
+
+To open a file without blocking, creating one if necessary:
+
+ sysopen(FH, $path, O_WRONLY | O_NONBLOCK | O_CREAT);
+
+=head2 Permissions E<agrave> la mode
+
+If you omit the MASK argument to C<sysopen>, Perl uses the octal value
+0666. The normal MASK to use for executables and directories should
+be 0777, and for anything else, 0666.
+
+Why so permissive? Well, it isn't really. The MASK will be modified
+by your process's current C<umask>. A umask is a number representing
+I<disabled> permissions bits; that is, bits that will not be turned on
+in the created files' permissions field.
+
+For example, if your C<umask> were 027, then the 020 part would
+disable the group from writing, and the 007 part would disable others
+from reading, writing, or executing. Under these conditions, passing
+C<sysopen> 0666 would create a file with mode 0640, since C<0666 & ~027>
+is 0640.
+
+You should seldom use the MASK argument to C<sysopen()>. That takes
+away the user's freedom to choose what permission new files will have.
+Denying choice is almost always a bad thing. One exception would be for
+cases where sensitive or private data is being stored, such as with mail
+folders, cookie files, and internal temporary files.
+
+=head1 Obscure Open Tricks
+
+=head2 Re-Opening Files (dups)
+
+Sometimes you already have a filehandle open, and want to make another
+handle that's a duplicate of the first one. In the shell, we place an
+ampersand in front of a file descriptor number when doing redirections.
+For example, C<< 2>&1 >> makes descriptor 2 (that's STDERR in Perl)
+be redirected into descriptor 1 (which is usually Perl's STDOUT).
+The same is essentially true in Perl: a filename that begins with an
+ampersand is treated instead as a file descriptor if a number, or as a
+filehandle if a string.
+
+ open(SAVEOUT, ">&SAVEERR") || die "couldn't dup SAVEERR: $!";
+ open(MHCONTEXT, "<&4") || die "couldn't dup fd4: $!";
+
+That means that if a function is expecting a filename, but you don't
+want to give it a filename because you already have the file open, you
+can just pass the filehandle with a leading ampersand. It's best to
+use a fully qualified handle though, just in case the function happens
+to be in a different package:
+
+ somefunction("&main::LOGFILE");
+
+This way if somefunction() is planning on opening its argument, it can
+just use the already opened handle. This differs from passing a handle,
+because with a handle, you don't open the file. Here you have something
+you can pass to open.
+
+If you have one of those tricky, newfangled I/O objects that the C++
+folks are raving about, then this doesn't work because those aren't a
+proper filehandle in the native Perl sense. You'll have to use fileno()
+to pull out the proper descriptor number, assuming you can:
+
+ use IO::Socket;
+ $handle = IO::Socket::INET->new("www.perl.com:80");
+ $fd = $handle->fileno;
+ somefunction("&$fd"); # not an indirect function call
+
+It can be easier (and certainly will be faster) just to use real
+filehandles though:
+
+ use IO::Socket;
+ local *REMOTE = IO::Socket::INET->new("www.perl.com:80");
+ die "can't connect" unless defined(fileno(REMOTE));
+ somefunction("&main::REMOTE");
+
+If the filehandle or descriptor number is preceded not just with a simple
+"&" but rather with a "&=" combination, then Perl will not create a
+completely new descriptor opened to the same place using the dup(2)
+system call. Instead, it will just make something of an alias to the
+existing one using the fdopen(3S) library call. This is slightly more
+parsimonious of systems resources, although this is less a concern
+these days. Here's an example of that:
+
+ $fd = $ENV{"MHCONTEXTFD"};
+ open(MHCONTEXT, "<&=$fd") or die "couldn't fdopen $fd: $!";
+
+If you're using magic C<< <ARGV> >>, you could even pass in as a
+command line argument in @ARGV something like C<"<&=$MHCONTEXTFD">,
+but we've never seen anyone actually do this.
+
+=head2 Dispelling the Dweomer
+
+Perl is more of a DWIMmer language than something like Java--where DWIM
+is an acronym for "do what I mean". But this principle sometimes leads
+to more hidden magic than one knows what to do with. In this way, Perl
+is also filled with I<dweomer>, an obscure word meaning an enchantment.
+Sometimes, Perl's DWIMmer is just too much like dweomer for comfort.
+
+If magic C<open> is a bit too magical for you, you don't have to turn
+to C<sysopen>. To open a file with arbitrary weird characters in
+it, it's necessary to protect any leading and trailing whitespace.
+Leading whitespace is protected by inserting a C<"./"> in front of a
+filename that starts with whitespace. Trailing whitespace is protected
+by appending an ASCII NUL byte (C<"\0">) at the end of the string.
+
+ $file =~ s#^(\s)#./$1#;
+ open(FH, "< $file\0") || die "can't open $file: $!";
+
+This assumes, of course, that your system considers dot the current
+working directory, slash the directory separator, and disallows ASCII
+NULs within a valid filename. Most systems follow these conventions,
+including all POSIX systems as well as proprietary Microsoft systems.
+The only vaguely popular system that doesn't work this way is the
+"Classic" Macintosh system, which uses a colon where the rest of us
+use a slash. Maybe C<sysopen> isn't such a bad idea after all.
+
+If you want to use C<< <ARGV> >> processing in a totally boring
+and non-magical way, you could do this first:
+
+ # "Sam sat on the ground and put his head in his hands.
+ # 'I wish I had never come here, and I don't want to see
+ # no more magic,' he said, and fell silent."
+ for (@ARGV) {
+ s#^([^./])#./$1#;
+ $_ .= "\0";
+ }
+ while (<>) {
+ # now process $_
+ }
+
+But be warned that users will not appreciate being unable to use "-"
+to mean standard input, per the standard convention.
+
+=head2 Paths as Opens
+
+You've probably noticed how Perl's C<warn> and C<die> functions can
+produce messages like:
+
+ Some warning at scriptname line 29, <FH> line 7.
+
+That's because you opened a filehandle FH, and had read in seven records
+from it. But what was the name of the file, rather than the handle?
+
+If you aren't running with C<strict refs>, or if you've turned them off
+temporarily, then all you have to do is this:
+
+ open($path, "< $path") || die "can't open $path: $!";
+ while (<$path>) {
+ # whatever
+ }
+
+Since you're using the pathname of the file as its handle,
+you'll get warnings more like
+
+ Some warning at scriptname line 29, </etc/motd> line 7.
+
+=head2 Single Argument Open
+
+Remember how we said that Perl's open took two arguments? That was a
+passive prevarication. You see, it can also take just one argument.
+If and only if the variable is a global variable, not a lexical, you
+can pass C<open> just one argument, the filehandle, and it will
+get the path from the global scalar variable of the same name.
+
+ $FILE = "/etc/motd";
+ open FILE or die "can't open $FILE: $!";
+ while (<FILE>) {
+ # whatever
+ }
+
+Why is this here? Someone has to cater to the hysterical porpoises.
+It's something that's been in Perl since the very beginning, if not
+before.
+
+=head2 Playing with STDIN and STDOUT
+
+One clever move with STDOUT is to explicitly close it when you're done
+with the program.
+
+ END { close(STDOUT) || die "can't close stdout: $!" }
+
+If you don't do this, and your program fills up the disk partition due
+to a command line redirection, it won't report the error exit with a
+failure status.
+
+You don't have to accept the STDIN and STDOUT you were given. You are
+welcome to reopen them if you'd like.
+
+ open(STDIN, "< datafile")
+ || die "can't open datafile: $!";
+
+ open(STDOUT, "> output")
+ || die "can't open output: $!";
+
+And then these can be accessed directly or passed on to subprocesses.
+This makes it look as though the program were initially invoked
+with those redirections from the command line.
+
+It's probably more interesting to connect these to pipes. For example:
+
+ $pager = $ENV{PAGER} || "(less || more)";
+ open(STDOUT, "| $pager")
+ || die "can't fork a pager: $!";
+
+This makes it appear as though your program were called with its stdout
+already piped into your pager. You can also use this kind of thing
+in conjunction with an implicit fork to yourself. You might do this
+if you would rather handle the post processing in your own program,
+just in a different process:
+
+ head(100);
+ while (<>) {
+ print;
+ }
+
+ sub head {
+ my $lines = shift || 20;
+ return if $pid = open(STDOUT, "|-"); # return if parent
+ die "cannot fork: $!" unless defined $pid;
+ while (<STDIN>) {
+ last if --$lines < 0;
+ print;
+ }
+ exit;
+ }
+
+This technique can be applied to repeatedly push as many filters on your
+output stream as you wish.
+
+=head1 Other I/O Issues
+
+These topics aren't really arguments related to C<open> or C<sysopen>,
+but they do affect what you do with your open files.
+
+=head2 Opening Non-File Files
+
+When is a file not a file? Well, you could say when it exists but
+isn't a plain file. We'll check whether it's a symbolic link first,
+just in case.
+
+ if (-l $file || ! -f _) {
+ print "$file is not a plain file\n";
+ }
+
+What other kinds of files are there than, well, files? Directories,
+symbolic links, named pipes, Unix-domain sockets, and block and character
+devices. Those are all files, too--just not I<plain> files. This isn't
+the same issue as being a text file. Not all text files are plain files.
+Not all plain files are text files. That's why there are separate C<-f>
+and C<-T> file tests.
+
+To open a directory, you should use the C<opendir> function, then
+process it with C<readdir>, carefully restoring the directory
+name if necessary:
+
+ opendir(DIR, $dirname) or die "can't opendir $dirname: $!";
+ while (defined($file = readdir(DIR))) {
+ # do something with "$dirname/$file"
+ }
+ closedir(DIR);
+
+If you want to process directories recursively, it's better to use the
+File::Find module. For example, this prints out all files recursively
+and adds a slash to their names if the file is a directory.
+
+ @ARGV = qw(.) unless @ARGV;
+ use File::Find;
+ find sub { print $File::Find::name, -d && '/', "\n" }, @ARGV;
+
+This finds all bogus symbolic links beneath a particular directory:
+
+ find sub { print "$File::Find::name\n" if -l && !-e }, $dir;
+
+As you see, with symbolic links, you can just pretend that it is
+what it points to. Or, if you want to know I<what> it points to, then
+C<readlink> is called for:
+
+ if (-l $file) {
+ if (defined($whither = readlink($file))) {
+ print "$file points to $whither\n";
+ } else {
+ print "$file points nowhere: $!\n";
+ }
+ }
+
+=head2 Opening Named Pipes
+
+Named pipes are a different matter. You pretend they're regular files,
+but their opens will normally block until there is both a reader and
+a writer. You can read more about them in L<perlipc/"Named Pipes">.
+Unix-domain sockets are rather different beasts as well; they're
+described in L<perlipc/"Unix-Domain TCP Clients and Servers">.
+
+When it comes to opening devices, it can be easy and it can be tricky.
+We'll assume that if you're opening up a block device, you know what
+you're doing. The character devices are more interesting. These are
+typically used for modems, mice, and some kinds of printers. This is
+described in L<perlfaq8/"How do I read and write the serial port?">
+It's often enough to open them carefully:
+
+ sysopen(TTYIN, "/dev/ttyS1", O_RDWR | O_NDELAY | O_NOCTTY)
+ # (O_NOCTTY no longer needed on POSIX systems)
+ or die "can't open /dev/ttyS1: $!";
+ open(TTYOUT, "+>&TTYIN")
+ or die "can't dup TTYIN: $!";
+
+ $ofh = select(TTYOUT); $| = 1; select($ofh);
+
+ print TTYOUT "+++at\015";
+ $answer = <TTYIN>;
+
+With descriptors that you haven't opened using C<sysopen>, such as
+sockets, you can set them to be non-blocking using C<fcntl>:
+
+ use Fcntl;
+ my $old_flags = fcntl($handle, F_GETFL, 0)
+ or die "can't get flags: $!";
+ fcntl($handle, F_SETFL, $old_flags | O_NONBLOCK)
+ or die "can't set non blocking: $!";
+
+Rather than losing yourself in a morass of twisting, turning C<ioctl>s,
+all dissimilar, if you're going to manipulate ttys, it's best to
+make calls out to the stty(1) program if you have it, or else use the
+portable POSIX interface. To figure this all out, you'll need to read the
+termios(3) manpage, which describes the POSIX interface to tty devices,
+and then L<POSIX>, which describes Perl's interface to POSIX. There are
+also some high-level modules on CPAN that can help you with these games.
+Check out Term::ReadKey and Term::ReadLine.
+
+=head2 Opening Sockets
+
+What else can you open? To open a connection using sockets, you won't use
+one of Perl's two open functions. See
+L<perlipc/"Sockets: Client/Server Communication"> for that. Here's an
+example. Once you have it, you can use FH as a bidirectional filehandle.
+
+ use IO::Socket;
+ local *FH = IO::Socket::INET->new("www.perl.com:80");
+
+For opening up a URL, the LWP modules from CPAN are just what
+the doctor ordered. There's no filehandle interface, but
+it's still easy to get the contents of a document:
+
+ use LWP::Simple;
+ $doc = get('http://www.linpro.no/lwp/');
+
+=head2 Binary Files
+
+On certain legacy systems with what could charitably be called terminally
+convoluted (some would say broken) I/O models, a file isn't a file--at
+least, not with respect to the C standard I/O library. On these old
+systems whose libraries (but not kernels) distinguish between text and
+binary streams, to get files to behave properly you'll have to bend over
+backwards to avoid nasty problems. On such infelicitous systems, sockets
+and pipes are already opened in binary mode, and there is currently no
+way to turn that off. With files, you have more options.
+
+Another option is to use the C<binmode> function on the appropriate
+handles before doing regular I/O on them:
+
+ binmode(STDIN);
+ binmode(STDOUT);
+ while (<STDIN>) { print }
+
+Passing C<sysopen> a non-standard flag option will also open the file in
+binary mode on those systems that support it. This is the equivalent of
+opening the file normally, then calling C<binmode> on the handle.
+
+ sysopen(BINDAT, "records.data", O_RDWR | O_BINARY)
+ || die "can't open records.data: $!";
+
+Now you can use C<read> and C<print> on that handle without worrying
+about the non-standard system I/O library breaking your data. It's not
+a pretty picture, but then, legacy systems seldom are. CP/M will be
+with us until the end of days, and after.
+
+On systems with exotic I/O systems, it turns out that, astonishingly
+enough, even unbuffered I/O using C<sysread> and C<syswrite> might do
+sneaky data mutilation behind your back.
+
+ while (sysread(WHENCE, $buf, 1024)) {
+ syswrite(WHITHER, $buf, length($buf));
+ }
+
+Depending on the vicissitudes of your runtime system, even these calls
+may need C<binmode> or C<O_BINARY> first. Systems known to be free of
+such difficulties include Unix, the Mac OS, Plan 9, and Inferno.
+
+=head2 File Locking
+
+In a multitasking environment, you may need to be careful not to collide
+with other processes who want to do I/O on the same files as you
+are working on. You'll often need shared or exclusive locks
+on files for reading and writing respectively. You might just
+pretend that only exclusive locks exist.
+
+Never use the existence of a file C<-e $file> as a locking indication,
+because there is a race condition between the test for the existence of
+the file and its creation. It's possible for another process to create
+a file in the slice of time between your existence check and your attempt
+to create the file. Atomicity is critical.
+
+Perl's most portable locking interface is via the C<flock> function,
+whose simplicity is emulated on systems that don't directly support it
+such as SysV or Windows. The underlying semantics may affect how
+it all works, so you should learn how C<flock> is implemented on your
+system's port of Perl.
+
+File locking I<does not> lock out another process that would like to
+do I/O. A file lock only locks out others trying to get a lock, not
+processes trying to do I/O. Because locks are advisory, if one process
+uses locking and another doesn't, all bets are off.
+
+By default, the C<flock> call will block until a lock is granted.
+A request for a shared lock will be granted as soon as there is no
+exclusive locker. A request for an exclusive lock will be granted as
+soon as there is no locker of any kind. Locks are on file descriptors,
+not file names. You can't lock a file until you open it, and you can't
+hold on to a lock once the file has been closed.
+
+Here's how to get a blocking shared lock on a file, typically used
+for reading:
+
+ use 5.004;
+ use Fcntl qw(:DEFAULT :flock);
+ open(FH, "< filename") or die "can't open filename: $!";
+ flock(FH, LOCK_SH) or die "can't lock filename: $!";
+ # now read from FH
+
+You can get a non-blocking lock by using C<LOCK_NB>.
+
+ flock(FH, LOCK_SH | LOCK_NB)
+ or die "can't lock filename: $!";
+
+This can be useful for producing more user-friendly behaviour by warning
+if you're going to be blocking:
+
+ use 5.004;
+ use Fcntl qw(:DEFAULT :flock);
+ open(FH, "< filename") or die "can't open filename: $!";
+ unless (flock(FH, LOCK_SH | LOCK_NB)) {
+ $| = 1;
+ print "Waiting for lock...";
+ flock(FH, LOCK_SH) or die "can't lock filename: $!";
+ print "got it.\n"
+ }
+ # now read from FH
+
+To get an exclusive lock, typically used for writing, you have to be
+careful. We C<sysopen> the file so it can be locked before it gets
+emptied. You can get a nonblocking version using C<LOCK_EX | LOCK_NB>.
+
+ use 5.004;
+ use Fcntl qw(:DEFAULT :flock);
+ sysopen(FH, "filename", O_WRONLY | O_CREAT)
+ or die "can't open filename: $!";
+ flock(FH, LOCK_EX)
+ or die "can't lock filename: $!";
+ truncate(FH, 0)
+ or die "can't truncate filename: $!";
+ # now write to FH
+
+Finally, due to the uncounted millions who cannot be dissuaded from
+wasting cycles on useless vanity devices called hit counters, here's
+how to increment a number in a file safely:
+
+ use Fcntl qw(:DEFAULT :flock);
+
+ sysopen(FH, "numfile", O_RDWR | O_CREAT)
+ or die "can't open numfile: $!";
+ # autoflush FH
+ $ofh = select(FH); $| = 1; select ($ofh);
+ flock(FH, LOCK_EX)
+ or die "can't write-lock numfile: $!";
+
+ $num = <FH> || 0;
+ seek(FH, 0, 0)
+ or die "can't rewind numfile : $!";
+ print FH $num+1, "\n"
+ or die "can't write numfile: $!";
+
+ truncate(FH, tell(FH))
+ or die "can't truncate numfile: $!";
+ close(FH)
+ or die "can't close numfile: $!";
+
+=head2 IO Layers
+
+In Perl 5.8.0 a new I/O framework called "PerlIO" was introduced.
+This is a new "plumbing" for all the I/O happening in Perl; for the
+most part everything will work just as it did, but PerlIO also brought
+in some new features such as the ability to think of I/O as "layers".
+One I/O layer may in addition to just moving the data also do
+transformations on the data. Such transformations may include
+compression and decompression, encryption and decryption, and transforming
+between various character encodings.
+
+Full discussion about the features of PerlIO is out of scope for this
+tutorial, but here is how to recognize the layers being used:
+
+=over 4
+
+=item *
+
+The three-(or more)-argument form of C<open> is being used and the
+second argument contains something else in addition to the usual
+C<< '<' >>, C<< '>' >>, C<< '>>' >>, C<< '|' >> and their variants,
+for example:
+
+ open(my $fh, "<:crlf", $fn);
+
+=item *
+
+The two-argument form of C<binmode> is being used, for example
+
+ binmode($fh, ":encoding(utf16)");
+
+=back
+
+For more detailed discussion about PerlIO see L<PerlIO>;
+for more detailed discussion about Unicode and I/O see L<perluniintro>.
+
+=head1 SEE ALSO
+
+The C<open> and C<sysopen> functions in perlfunc(1);
+the system open(2), dup(2), fopen(3), and fdopen(3) manpages;
+the POSIX documentation.
+
+=head1 AUTHOR and COPYRIGHT
+
+Copyright 1998 Tom Christiansen.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in these files are
+hereby placed into the public domain. You are permitted and
+encouraged to use this code in your own programs for fun or for profit
+as you see fit. A simple comment in the code giving credit would be
+courteous but is not required.
+
+=head1 HISTORY
+
+First release: Sat Jan 9 08:09:11 MST 1999
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlos2.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlos2.pod
new file mode 100755
index 00000000000..a51958eef17
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlos2.pod
@@ -0,0 +1,2743 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+perlos2 - Perl under OS/2, DOS, Win0.3*, Win0.95 and WinNT.
+
+=head1 SYNOPSIS
+
+One can read this document in the following formats:
+
+ man perlos2
+ view perl perlos2
+ explorer perlos2.html
+ info perlos2
+
+to list some (not all may be available simultaneously), or it may
+be read I<as is>: either as F<README.os2>, or F<pod/perlos2.pod>.
+
+To read the F<.INF> version of documentation (B<very> recommended)
+outside of OS/2, one needs an IBM's reader (may be available on IBM
+ftp sites (?) (URL anyone?)) or shipped with PC DOS 7.0 and IBM's
+Visual Age C++ 3.5.
+
+A copy of a Win* viewer is contained in the "Just add OS/2 Warp" package
+
+ ftp://ftp.software.ibm.com/ps/products/os2/tools/jaow/jaow.zip
+
+in F<?:\JUST_ADD\view.exe>. This gives one an access to EMX's
+F<.INF> docs as well (text form is available in F</emx/doc> in
+EMX's distribution). There is also a different viewer named xview.
+
+Note that if you have F<lynx.exe> or F<netscape.exe> installed, you can follow WWW links
+from this document in F<.INF> format. If you have EMX docs installed
+correctly, you can follow library links (you need to have C<view emxbook>
+working by setting C<EMXBOOK> environment variable as it is described
+in EMX docs).
+
+=cut
+
+Contents (This may be a little bit obsolete)
+
+ perlos2 - Perl under OS/2, DOS, Win0.3*, Win0.95 and WinNT.
+
+ NAME
+ SYNOPSIS
+ DESCRIPTION
+ - Target
+ - Other OSes
+ - Prerequisites
+ - Starting Perl programs under OS/2 (and DOS and...)
+ - Starting OS/2 (and DOS) programs under Perl
+ Frequently asked questions
+ - "It does not work"
+ - I cannot run external programs
+ - I cannot embed perl into my program, or use perl.dll from my
+ - `` and pipe-open do not work under DOS.
+ - Cannot start find.exe "pattern" file
+ INSTALLATION
+ - Automatic binary installation
+ - Manual binary installation
+ - Warning
+ Accessing documentation
+ - OS/2 .INF file
+ - Plain text
+ - Manpages
+ - HTML
+ - GNU info files
+ - PDF files
+ - LaTeX docs
+ BUILD
+ - The short story
+ - Prerequisites
+ - Getting perl source
+ - Application of the patches
+ - Hand-editing
+ - Making
+ - Testing
+ - Installing the built perl
+ - a.out-style build
+ Build FAQ
+ - Some / became \ in pdksh.
+ - 'errno' - unresolved external
+ - Problems with tr or sed
+ - Some problem (forget which ;-)
+ - Library ... not found
+ - Segfault in make
+ - op/sprintf test failure
+ Specific (mis)features of OS/2 port
+ - setpriority, getpriority
+ - system()
+ - extproc on the first line
+ - Additional modules:
+ - Prebuilt methods:
+ - Prebuilt variables:
+ - Misfeatures
+ - Modifications
+ - Identifying DLLs
+ - Centralized management of resources
+ Perl flavors
+ - perl.exe
+ - perl_.exe
+ - perl__.exe
+ - perl___.exe
+ - Why strange names?
+ - Why dynamic linking?
+ - Why chimera build?
+ ENVIRONMENT
+ - PERLLIB_PREFIX
+ - PERL_BADLANG
+ - PERL_BADFREE
+ - PERL_SH_DIR
+ - USE_PERL_FLOCK
+ - TMP or TEMP
+ Evolution
+ - Text-mode filehandles
+ - Priorities
+ - DLL name mangling: pre 5.6.2
+ - DLL name mangling: 5.6.2 and beyond
+ - DLL forwarder generation
+ - Threading
+ - Calls to external programs
+ - Memory allocation
+ - Threads
+ BUGS
+ AUTHOR
+ SEE ALSO
+
+=head1 DESCRIPTION
+
+=head2 Target
+
+The target is to make OS/2 one of the best supported platform for
+using/building/developing Perl and I<Perl applications>, as well as
+make Perl the best language to use under OS/2. The secondary target is
+to try to make this work under DOS and Win* as well (but not B<too> hard).
+
+The current state is quite close to this target. Known limitations:
+
+=over 5
+
+=item *
+
+Some *nix programs use fork() a lot; with the mostly useful flavors of
+perl for OS/2 (there are several built simultaneously) this is
+supported; but some flavors do not support this (e.g., when Perl is
+called from inside REXX). Using fork() after
+I<use>ing dynamically loading extensions would not work with I<very> old
+versions of EMX.
+
+=item *
+
+You need a separate perl executable F<perl__.exe> (see L<perl__.exe>)
+if you want to use PM code in your application (as Perl/Tk or OpenGL
+Perl modules do) without having a text-mode window present.
+
+While using the standard F<perl.exe> from a text-mode window is possible
+too, I have seen cases when this causes degradation of the system stability.
+Using F<perl__.exe> avoids such a degradation.
+
+=item *
+
+There is no simple way to access WPS objects. The only way I know
+is via C<OS2::REXX> and C<SOM> extensions (see L<OS2::REXX>, L<Som>).
+However, we do not have access to
+convenience methods of Object-REXX. (Is it possible at all? I know
+of no Object-REXX API.) The C<SOM> extension (currently in alpha-text)
+may eventually remove this shortcoming; however, due to the fact that
+DII is not supported by the C<SOM> module, using C<SOM> is not as
+convenient as one would like it.
+
+=back
+
+Please keep this list up-to-date by informing me about other items.
+
+=head2 Other OSes
+
+Since OS/2 port of perl uses a remarkable EMX environment, it can
+run (and build extensions, and - possibly - be built itself) under any
+environment which can run EMX. The current list is DOS,
+DOS-inside-OS/2, Win0.3*, Win0.95 and WinNT. Out of many perl flavors,
+only one works, see L<"perl_.exe">.
+
+Note that not all features of Perl are available under these
+environments. This depends on the features the I<extender> - most
+probably RSX - decided to implement.
+
+Cf. L<Prerequisites>.
+
+=head2 Prerequisites
+
+=over 6
+
+=item EMX
+
+EMX runtime is required (may be substituted by RSX). Note that
+it is possible to make F<perl_.exe> to run under DOS without any
+external support by binding F<emx.exe>/F<rsx.exe> to it, see L<emxbind>. Note
+that under DOS for best results one should use RSX runtime, which
+has much more functions working (like C<fork>, C<popen> and so on). In
+fact RSX is required if there is no VCPI present. Note the
+RSX requires DPMI. Many implementations of DPMI are known to be very
+buggy, beware!
+
+Only the latest runtime is supported, currently C<0.9d fix 03>. Perl may run
+under earlier versions of EMX, but this is not tested.
+
+One can get different parts of EMX from, say
+
+ http://www.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/
+ http://powerusersbbs.com/pub/os2/dev/ [EMX+GCC Development]
+ http://hobbes.nmsu.edu/pub/os2/dev/emx/v0.9d/
+
+The runtime component should have the name F<emxrt.zip>.
+
+B<NOTE>. When using F<emx.exe>/F<rsx.exe>, it is enough to have them on your path. One
+does not need to specify them explicitly (though this
+
+ emx perl_.exe -de 0
+
+will work as well.)
+
+=item RSX
+
+To run Perl on DPMI platforms one needs RSX runtime. This is
+needed under DOS-inside-OS/2, Win0.3*, Win0.95 and WinNT (see
+L<"Other OSes">). RSX would not work with VCPI
+only, as EMX would, it requires DMPI.
+
+Having RSX and the latest F<sh.exe> one gets a fully functional
+B<*nix>-ish environment under DOS, say, C<fork>, C<``> and
+pipe-C<open> work. In fact, MakeMaker works (for static build), so one
+can have Perl development environment under DOS.
+
+One can get RSX from, say
+
+ ftp://ftp.cdrom.com/pub/os2/emx09c/contrib
+ ftp://ftp.uni-bielefeld.de/pub/systems/msdos/misc
+ ftp://ftp.leo.org/pub/comp/os/os2/leo/devtools/emx+gcc/contrib
+
+Contact the author on C<rainer@mathematik.uni-bielefeld.de>.
+
+The latest F<sh.exe> with DOS hooks is available in
+
+ http://www.ilyaz.org/software/os2/
+
+as F<sh_dos.zip> or under similar names starting with C<sh>, C<pdksh> etc.
+
+=item HPFS
+
+Perl does not care about file systems, but the perl library contains
+many files with long names, so to install it intact one needs a file
+system which supports long file names.
+
+Note that if you do not plan to build the perl itself, it may be
+possible to fool EMX to truncate file names. This is not supported,
+read EMX docs to see how to do it.
+
+=item pdksh
+
+To start external programs with complicated command lines (like with
+pipes in between, and/or quoting of arguments), Perl uses an external
+shell. With EMX port such shell should be named F<sh.exe>, and located
+either in the wired-in-during-compile locations (usually F<F:/bin>),
+or in configurable location (see L<"PERL_SH_DIR">).
+
+For best results use EMX pdksh. The standard binary (5.2.14 or later) runs
+under DOS (with L<RSX>) as well, see
+
+ http://www.ilyaz.org/software/os2/
+
+=back
+
+=head2 Starting Perl programs under OS/2 (and DOS and...)
+
+Start your Perl program F<foo.pl> with arguments C<arg1 arg2 arg3> the
+same way as on any other platform, by
+
+ perl foo.pl arg1 arg2 arg3
+
+If you want to specify perl options C<-my_opts> to the perl itself (as
+opposed to your program), use
+
+ perl -my_opts foo.pl arg1 arg2 arg3
+
+Alternately, if you use OS/2-ish shell, like CMD or 4os2, put
+the following at the start of your perl script:
+
+ extproc perl -S -my_opts
+
+rename your program to F<foo.cmd>, and start it by typing
+
+ foo arg1 arg2 arg3
+
+Note that because of stupid OS/2 limitations the full path of the perl
+script is not available when you use C<extproc>, thus you are forced to
+use C<-S> perl switch, and your script should be on the C<PATH>. As a plus
+side, if you know a full path to your script, you may still start it
+with
+
+ perl ../../blah/foo.cmd arg1 arg2 arg3
+
+(note that the argument C<-my_opts> is taken care of by the C<extproc> line
+in your script, see L<C<extproc> on the first line>).
+
+To understand what the above I<magic> does, read perl docs about C<-S>
+switch - see L<perlrun>, and cmdref about C<extproc>:
+
+ view perl perlrun
+ man perlrun
+ view cmdref extproc
+ help extproc
+
+or whatever method you prefer.
+
+There are also endless possibilities to use I<executable extensions> of
+4os2, I<associations> of WPS and so on... However, if you use
+*nixish shell (like F<sh.exe> supplied in the binary distribution),
+you need to follow the syntax specified in L<perlrun/"Switches">.
+
+Note that B<-S> switch supports scripts with additional extensions
+F<.cmd>, F<.btm>, F<.bat>, F<.pl> as well.
+
+=head2 Starting OS/2 (and DOS) programs under Perl
+
+This is what system() (see L<perlfunc/system>), C<``> (see
+L<perlop/"I/O Operators">), and I<open pipe> (see L<perlfunc/open>)
+are for. (Avoid exec() (see L<perlfunc/exec>) unless you know what you
+do).
+
+Note however that to use some of these operators you need to have a
+sh-syntax shell installed (see L<"Pdksh">,
+L<"Frequently asked questions">), and perl should be able to find it
+(see L<"PERL_SH_DIR">).
+
+The cases when the shell is used are:
+
+=over
+
+=item 1
+
+One-argument system() (see L<perlfunc/system>), exec() (see L<perlfunc/exec>)
+with redirection or shell meta-characters;
+
+=item 2
+
+Pipe-open (see L<perlfunc/open>) with the command which contains redirection
+or shell meta-characters;
+
+=item 3
+
+Backticks C<``> (see L<perlop/"I/O Operators">) with the command which contains
+redirection or shell meta-characters;
+
+=item 4
+
+If the executable called by system()/exec()/pipe-open()/C<``> is a script
+with the "magic" C<#!> line or C<extproc> line which specifies shell;
+
+=item 5
+
+If the executable called by system()/exec()/pipe-open()/C<``> is a script
+without "magic" line, and C<$ENV{EXECSHELL}> is set to shell;
+
+=item 6
+
+If the executable called by system()/exec()/pipe-open()/C<``> is not
+found (is not this remark obsolete?);
+
+=item 7
+
+For globbing (see L<perlfunc/glob>, L<perlop/"I/O Operators">)
+(obsolete? Perl uses builtin globbing nowadays...).
+
+=back
+
+For the sake of speed for a common case, in the above algorithms
+backslashes in the command name are not considered as shell metacharacters.
+
+Perl starts scripts which begin with cookies
+C<extproc> or C<#!> directly, without an intervention of shell. Perl uses the
+same algorithm to find the executable as F<pdksh>: if the path
+on C<#!> line does not work, and contains C</>, then the directory
+part of the executable is ignored, and the executable
+is searched in F<.> and on C<PATH>. To find arguments for these scripts
+Perl uses a different algorithm than F<pdksh>: up to 3 arguments are
+recognized, and trailing whitespace is stripped.
+
+If a script
+does not contain such a cooky, then to avoid calling F<sh.exe>, Perl uses
+the same algorithm as F<pdksh>: if C<$ENV{EXECSHELL}> is set, the
+script is given as the first argument to this command, if not set, then
+C<$ENV{COMSPEC} /c> is used (or a hardwired guess if C<$ENV{COMSPEC}> is
+not set).
+
+When starting scripts directly, Perl uses exactly the same algorithm as for
+the search of script given by B<-S> command-line option: it will look in
+the current directory, then on components of C<$ENV{PATH}> using the
+following order of appended extensions: no extension, F<.cmd>, F<.btm>,
+F<.bat>, F<.pl>.
+
+Note that Perl will start to look for scripts only if OS/2 cannot start the
+specified application, thus C<system 'blah'> will not look for a script if
+there is an executable file F<blah.exe> I<anywhere> on C<PATH>. In
+other words, C<PATH> is essentially searched twice: once by the OS for
+an executable, then by Perl for scripts.
+
+Note also that executable files on OS/2 can have an arbitrary extension,
+but F<.exe> will be automatically appended if no dot is present in the name.
+The workaround is as simple as that: since F<blah.> and F<blah> denote the
+same file (at list on FAT and HPFS file systems), to start an executable residing in file F<n:/bin/blah> (no
+extension) give an argument C<n:/bin/blah.> (dot appended) to system().
+
+Perl will start PM programs from VIO (=text-mode) Perl process in a
+separate PM session;
+the opposite is not true: when you start a non-PM program from a PM
+Perl process, Perl would not run it in a separate session. If a separate
+session is desired, either ensure
+that shell will be used, as in C<system 'cmd /c myprog'>, or start it using
+optional arguments to system() documented in C<OS2::Process> module. This
+is considered to be a feature.
+
+=head1 Frequently asked questions
+
+=head2 "It does not work"
+
+Perl binary distributions come with a F<testperl.cmd> script which tries
+to detect common problems with misconfigured installations. There is a
+pretty large chance it will discover which step of the installation you
+managed to goof. C<;-)>
+
+=head2 I cannot run external programs
+
+=over 4
+
+=item *
+
+Did you run your programs with C<-w> switch? See
+L<Starting OS/2 (and DOS) programs under Perl>.
+
+=item *
+
+Do you try to run I<internal> shell commands, like C<`copy a b`>
+(internal for F<cmd.exe>), or C<`glob a*b`> (internal for ksh)? You
+need to specify your shell explicitly, like C<`cmd /c copy a b`>,
+since Perl cannot deduce which commands are internal to your shell.
+
+=back
+
+=head2 I cannot embed perl into my program, or use F<perl.dll> from my
+program.
+
+=over 4
+
+=item Is your program EMX-compiled with C<-Zmt -Zcrtdll>?
+
+Well, nowadays Perl DLL should be usable from a differently compiled
+program too... If you can run Perl code from REXX scripts (see
+L<OS2::REXX>), then there are some other aspect of interaction which
+are overlooked by the current hackish code to support
+differently-compiled principal programs.
+
+If everything else fails, you need to build a stand-alone DLL for
+perl. Contact me, I did it once. Sockets would not work, as a lot of
+other stuff.
+
+=item Did you use L<ExtUtils::Embed>?
+
+Some time ago I had reports it does not work. Nowadays it is checked
+in the Perl test suite, so grep F<./t> subdirectory of the build tree
+(as well as F<*.t> files in the F<./lib> subdirectory) to find how it
+should be done "correctly".
+
+=back
+
+=head2 C<``> and pipe-C<open> do not work under DOS.
+
+This may a variant of just L<"I cannot run external programs">, or a
+deeper problem. Basically: you I<need> RSX (see L<"Prerequisites">)
+for these commands to work, and you may need a port of F<sh.exe> which
+understands command arguments. One of such ports is listed in
+L<"Prerequisites"> under RSX. Do not forget to set variable
+C<L<"PERL_SH_DIR">> as well.
+
+DPMI is required for RSX.
+
+=head2 Cannot start C<find.exe "pattern" file>
+
+The whole idea of the "standard C API to start applications" is that
+the forms C<foo> and C<"foo"> of program arguments are completely
+interchangable. F<find> breaks this paradigm;
+
+ find "pattern" file
+ find pattern file
+
+are not equivalent; F<find> cannot be started directly using the above
+API. One needs a way to surround the doublequotes in some other
+quoting construction, necessarily having an extra non-Unixish shell in
+between.
+
+Use one of
+
+ system 'cmd', '/c', 'find "pattern" file';
+ `cmd /c 'find "pattern" file'`
+
+This would start F<find.exe> via F<cmd.exe> via C<sh.exe> via
+C<perl.exe>, but this is a price to pay if you want to use
+non-conforming program.
+
+=head1 INSTALLATION
+
+=head2 Automatic binary installation
+
+The most convenient way of installing a binary distribution of perl is via perl installer
+F<install.exe>. Just follow the instructions, and 99% of the
+installation blues would go away.
+
+Note however, that you need to have F<unzip.exe> on your path, and
+EMX environment I<running>. The latter means that if you just
+installed EMX, and made all the needed changes to F<Config.sys>,
+you may need to reboot in between. Check EMX runtime by running
+
+ emxrev
+
+Binary installer also creates a folder on your desktop with some useful
+objects. If you need to change some aspects of the work of the binary
+installer, feel free to edit the file F<Perl.pkg>. This may be useful
+e.g., if you need to run the installer many times and do not want to
+make many interactive changes in the GUI.
+
+B<Things not taken care of by automatic binary installation:>
+
+=over 15
+
+=item C<PERL_BADLANG>
+
+may be needed if you change your codepage I<after> perl installation,
+and the new value is not supported by EMX. See L<"PERL_BADLANG">.
+
+=item C<PERL_BADFREE>
+
+see L<"PERL_BADFREE">.
+
+=item F<Config.pm>
+
+This file resides somewhere deep in the location you installed your
+perl library, find it out by
+
+ perl -MConfig -le "print $INC{'Config.pm'}"
+
+While most important values in this file I<are> updated by the binary
+installer, some of them may need to be hand-edited. I know no such
+data, please keep me informed if you find one. Moreover, manual
+changes to the installed version may need to be accompanied by an edit
+of this file.
+
+=back
+
+B<NOTE>. Because of a typo the binary installer of 5.00305
+would install a variable C<PERL_SHPATH> into F<Config.sys>. Please
+remove this variable and put C<L<PERL_SH_DIR>> instead.
+
+=head2 Manual binary installation
+
+As of version 5.00305, OS/2 perl binary distribution comes split
+into 11 components. Unfortunately, to enable configurable binary
+installation, the file paths in the zip files are not absolute, but
+relative to some directory.
+
+Note that the extraction with the stored paths is still necessary
+(default with unzip, specify C<-d> to pkunzip). However, you
+need to know where to extract the files. You need also to manually
+change entries in F<Config.sys> to reflect where did you put the
+files. Note that if you have some primitive unzipper (like
+C<pkunzip>), you may get a lot of warnings/errors during
+unzipping. Upgrade to C<(w)unzip>.
+
+Below is the sample of what to do to reproduce the configuration on my
+machine. In F<VIEW.EXE> you can press C<Ctrl-Insert> now, and
+cut-and-paste from the resulting file - created in the directory you
+started F<VIEW.EXE> from.
+
+For each component, we mention environment variables related to each
+installation directory. Either choose directories to match your
+values of the variables, or create/append-to variables to take into
+account the directories.
+
+=over 3
+
+=item Perl VIO and PM executables (dynamically linked)
+
+ unzip perl_exc.zip *.exe *.ico -d f:/emx.add/bin
+ unzip perl_exc.zip *.dll -d f:/emx.add/dll
+
+(have the directories with C<*.exe> on PATH, and C<*.dll> on
+LIBPATH);
+
+=item Perl_ VIO executable (statically linked)
+
+ unzip perl_aou.zip -d f:/emx.add/bin
+
+(have the directory on PATH);
+
+=item Executables for Perl utilities
+
+ unzip perl_utl.zip -d f:/emx.add/bin
+
+(have the directory on PATH);
+
+=item Main Perl library
+
+ unzip perl_mlb.zip -d f:/perllib/lib
+
+If this directory is exactly the same as the prefix which was compiled
+into F<perl.exe>, you do not need to change
+anything. However, for perl to find the library if you use a different
+path, you need to
+C<set PERLLIB_PREFIX> in F<Config.sys>, see L<"PERLLIB_PREFIX">.
+
+=item Additional Perl modules
+
+ unzip perl_ste.zip -d f:/perllib/lib/site_perl/5.10.1/
+
+Same remark as above applies. Additionally, if this directory is not
+one of directories on @INC (and @INC is influenced by C<PERLLIB_PREFIX>), you
+need to put this
+directory and subdirectory F<./os2> in C<PERLLIB> or C<PERL5LIB>
+variable. Do not use C<PERL5LIB> unless you have it set already. See
+L<perl/"ENVIRONMENT">.
+
+B<[Check whether this extraction directory is still applicable with
+the new directory structure layout!]>
+
+=item Tools to compile Perl modules
+
+ unzip perl_blb.zip -d f:/perllib/lib
+
+Same remark as for F<perl_ste.zip>.
+
+=item Manpages for Perl and utilities
+
+ unzip perl_man.zip -d f:/perllib/man
+
+This directory should better be on C<MANPATH>. You need to have a
+working F<man> to access these files.
+
+=item Manpages for Perl modules
+
+ unzip perl_mam.zip -d f:/perllib/man
+
+This directory should better be on C<MANPATH>. You need to have a
+working man to access these files.
+
+=item Source for Perl documentation
+
+ unzip perl_pod.zip -d f:/perllib/lib
+
+This is used by the C<perldoc> program (see L<perldoc>), and may be used to
+generate HTML documentation usable by WWW browsers, and
+documentation in zillions of other formats: C<info>, C<LaTeX>,
+C<Acrobat>, C<FrameMaker> and so on. [Use programs such as
+F<pod2latex> etc.]
+
+=item Perl manual in F<.INF> format
+
+ unzip perl_inf.zip -d d:/os2/book
+
+This directory should better be on C<BOOKSHELF>.
+
+=item Pdksh
+
+ unzip perl_sh.zip -d f:/bin
+
+This is used by perl to run external commands which explicitly
+require shell, like the commands using I<redirection> and I<shell
+metacharacters>. It is also used instead of explicit F</bin/sh>.
+
+Set C<PERL_SH_DIR> (see L<"PERL_SH_DIR">) if you move F<sh.exe> from
+the above location.
+
+B<Note.> It may be possible to use some other sh-compatible shell (untested).
+
+=back
+
+After you installed the components you needed and updated the
+F<Config.sys> correspondingly, you need to hand-edit
+F<Config.pm>. This file resides somewhere deep in the location you
+installed your perl library, find it out by
+
+ perl -MConfig -le "print $INC{'Config.pm'}"
+
+You need to correct all the entries which look like file paths (they
+currently start with C<f:/>).
+
+=head2 B<Warning>
+
+The automatic and manual perl installation leave precompiled paths
+inside perl executables. While these paths are overwriteable (see
+L<"PERLLIB_PREFIX">, L<"PERL_SH_DIR">), some people may prefer
+binary editing of paths inside the executables/DLLs.
+
+=head1 Accessing documentation
+
+Depending on how you built/installed perl you may have (otherwise
+identical) Perl documentation in the following formats:
+
+=head2 OS/2 F<.INF> file
+
+Most probably the most convenient form. Under OS/2 view it as
+
+ view perl
+ view perl perlfunc
+ view perl less
+ view perl ExtUtils::MakeMaker
+
+(currently the last two may hit a wrong location, but this may improve
+soon). Under Win* see L<"SYNOPSIS">.
+
+If you want to build the docs yourself, and have I<OS/2 toolkit>, run
+
+ pod2ipf > perl.ipf
+
+in F</perllib/lib/pod> directory, then
+
+ ipfc /inf perl.ipf
+
+(Expect a lot of errors during the both steps.) Now move it on your
+BOOKSHELF path.
+
+=head2 Plain text
+
+If you have perl documentation in the source form, perl utilities
+installed, and GNU groff installed, you may use
+
+ perldoc perlfunc
+ perldoc less
+ perldoc ExtUtils::MakeMaker
+
+to access the perl documentation in the text form (note that you may get
+better results using perl manpages).
+
+Alternately, try running pod2text on F<.pod> files.
+
+=head2 Manpages
+
+If you have F<man> installed on your system, and you installed perl
+manpages, use something like this:
+
+ man perlfunc
+ man 3 less
+ man ExtUtils.MakeMaker
+
+to access documentation for different components of Perl. Start with
+
+ man perl
+
+Note that dot (F<.>) is used as a package separator for documentation
+for packages, and as usual, sometimes you need to give the section - C<3>
+above - to avoid shadowing by the I<less(1) manpage>.
+
+Make sure that the directory B<above> the directory with manpages is
+on our C<MANPATH>, like this
+
+ set MANPATH=c:/man;f:/perllib/man
+
+for Perl manpages in C<f:/perllib/man/man1/> etc.
+
+=head2 HTML
+
+If you have some WWW browser available, installed the Perl
+documentation in the source form, and Perl utilities, you can build
+HTML docs. Cd to directory with F<.pod> files, and do like this
+
+ cd f:/perllib/lib/pod
+ pod2html
+
+After this you can direct your browser the file F<perl.html> in this
+directory, and go ahead with reading docs, like this:
+
+ explore file:///f:/perllib/lib/pod/perl.html
+
+Alternatively you may be able to get these docs prebuilt from CPAN.
+
+=head2 GNU C<info> files
+
+Users of Emacs would appreciate it very much, especially with
+C<CPerl> mode loaded. You need to get latest C<pod2texi> from C<CPAN>,
+or, alternately, the prebuilt info pages.
+
+=head2 F<PDF> files
+
+for C<Acrobat> are available on CPAN (may be for slightly older version of
+perl).
+
+=head2 C<LaTeX> docs
+
+can be constructed using C<pod2latex>.
+
+=head1 BUILD
+
+Here we discuss how to build Perl under OS/2. There is an alternative
+(but maybe older) view on L<http://www.shadow.net/~troc/os2perl.html>.
+
+=head2 The short story
+
+Assume that you are a seasoned porter, so are sure that all the necessary
+tools are already present on your system, and you know how to get the Perl
+source distribution. Untar it, change to the extract directory, and
+
+ gnupatch -p0 < os2\diff.configure
+ sh Configure -des -D prefix=f:/perllib
+ make
+ make test
+ make install
+ make aout_test
+ make aout_install
+
+This puts the executables in f:/perllib/bin. Manually move them to the
+C<PATH>, manually move the built F<perl*.dll> to C<LIBPATH> (here for
+Perl DLL F<*> is a not-very-meaningful hex checksum), and run
+
+ make installcmd INSTALLCMDDIR=d:/ir/on/path
+
+Assuming that the C<man>-files were put on an appropriate location,
+this completes the installation of minimal Perl system. (The binary
+distribution contains also a lot of additional modules, and the
+documentation in INF format.)
+
+What follows is a detailed guide through these steps.
+
+=head2 Prerequisites
+
+You need to have the latest EMX development environment, the full
+GNU tool suite (gawk renamed to awk, and GNU F<find.exe>
+earlier on path than the OS/2 F<find.exe>, same with F<sort.exe>, to
+check use
+
+ find --version
+ sort --version
+
+). You need the latest version of F<pdksh> installed as F<sh.exe>.
+
+Check that you have B<BSD> libraries and headers installed, and -
+optionally - Berkeley DB headers and libraries, and crypt.
+
+Possible locations to get the files:
+
+ ftp://hobbes.nmsu.edu/os2/unix/
+ ftp://ftp.cdrom.com/pub/os2/unix/
+ ftp://ftp.cdrom.com/pub/os2/dev32/
+ ftp://ftp.cdrom.com/pub/os2/emx09c/
+
+It is reported that the following archives contain enough utils to
+build perl: F<gnufutil.zip>, F<gnusutil.zip>, F<gnututil.zip>, F<gnused.zip>,
+F<gnupatch.zip>, F<gnuawk.zip>, F<gnumake.zip>, F<gnugrep.zip>, F<bsddev.zip> and
+F<ksh527rt.zip> (or a later version). Note that all these utilities are
+known to be available from LEO:
+
+ ftp://ftp.leo.org/pub/comp/os/os2/leo/gnu
+
+Note also that the F<db.lib> and F<db.a> from the EMX distribution
+are not suitable for multi-threaded compile (even single-threaded
+flavor of Perl uses multi-threaded C RTL, for
+compatibility with XFree86-OS/2). Get a corrected one from
+
+ http://www.ilyaz.org/software/os2/db_mt.zip
+
+If you have I<exactly the same version of Perl> installed already,
+make sure that no copies or perl are currently running. Later steps
+of the build may fail since an older version of F<perl.dll> loaded into
+memory may be found. Running C<make test> becomes meaningless, since
+the test are checking a previous build of perl (this situation is detected
+and reported by F<lib/os2_base.t> test). Do not forget to unset
+C<PERL_EMXLOAD_SEC> in environment.
+
+Also make sure that you have F</tmp> directory on the current drive,
+and F<.> directory in your C<LIBPATH>. One may try to correct the
+latter condition by
+
+ set BEGINLIBPATH .\.
+
+if you use something like F<CMD.EXE> or latest versions of
+F<4os2.exe>. (Setting BEGINLIBPATH to just C<.> is ignored by the
+OS/2 kernel.)
+
+Make sure your gcc is good for C<-Zomf> linking: run C<omflibs>
+script in F</emx/lib> directory.
+
+Check that you have link386 installed. It comes standard with OS/2,
+but may be not installed due to customization. If typing
+
+ link386
+
+shows you do not have it, do I<Selective install>, and choose C<Link
+object modules> in I<Optional system utilities/More>. If you get into
+link386 prompts, press C<Ctrl-C> to exit.
+
+=head2 Getting perl source
+
+You need to fetch the latest perl source (including developers
+releases). With some probability it is located in
+
+ http://www.cpan.org/src/5.0
+ http://www.cpan.org/src/5.0/unsupported
+
+If not, you may need to dig in the indices to find it in the directory
+of the current maintainer.
+
+Quick cycle of developers release may break the OS/2 build time to
+time, looking into
+
+ http://www.cpan.org/ports/os2/
+
+may indicate the latest release which was publicly released by the
+maintainer. Note that the release may include some additional patches
+to apply to the current source of perl.
+
+Extract it like this
+
+ tar vzxf perl5.00409.tar.gz
+
+You may see a message about errors while extracting F<Configure>. This is
+because there is a conflict with a similarly-named file F<configure>.
+
+Change to the directory of extraction.
+
+=head2 Application of the patches
+
+You need to apply the patches in F<./os2/diff.*> like this:
+
+ gnupatch -p0 < os2\diff.configure
+
+You may also need to apply the patches supplied with the binary
+distribution of perl. It also makes sense to look on the
+perl5-porters mailing list for the latest OS/2-related patches (see
+L<http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/>). Such
+patches usually contain strings C</os2/> and C<patch>, so it makes
+sense looking for these strings.
+
+=head2 Hand-editing
+
+You may look into the file F<./hints/os2.sh> and correct anything
+wrong you find there. I do not expect it is needed anywhere.
+
+=head2 Making
+
+ sh Configure -des -D prefix=f:/perllib
+
+C<prefix> means: where to install the resulting perl library. Giving
+correct prefix you may avoid the need to specify C<PERLLIB_PREFIX>,
+see L<"PERLLIB_PREFIX">.
+
+I<Ignore the message about missing C<ln>, and about C<-c> option to
+tr>. The latter is most probably already fixed, if you see it and can trace
+where the latter spurious warning comes from, please inform me.
+
+Now
+
+ make
+
+At some moment the built may die, reporting a I<version mismatch> or
+I<unable to run F<perl>>. This means that you do not have F<.> in
+your LIBPATH, so F<perl.exe> cannot find the needed F<perl67B2.dll> (treat
+these hex digits as line noise). After this is fixed the build
+should finish without a lot of fuss.
+
+=head2 Testing
+
+Now run
+
+ make test
+
+All tests should succeed (with some of them skipped). If you have the
+same version of Perl installed, it is crucial that you have C<.> early
+in your LIBPATH (or in BEGINLIBPATH), otherwise your tests will most
+probably test the wrong version of Perl.
+
+Some tests may generate extra messages similar to
+
+=over 4
+
+=item A lot of C<bad free>
+
+in database tests related to Berkeley DB. I<This should be fixed already.>
+If it persists, you may disable this warnings, see L<"PERL_BADFREE">.
+
+=item Process terminated by SIGTERM/SIGINT
+
+This is a standard message issued by OS/2 applications. *nix
+applications die in silence. It is considered to be a feature. One can
+easily disable this by appropriate sighandlers.
+
+However the test engine bleeds these message to screen in unexpected
+moments. Two messages of this kind I<should> be present during
+testing.
+
+=back
+
+To get finer test reports, call
+
+ perl t/harness
+
+The report with F<io/pipe.t> failing may look like this:
+
+ Failed Test Status Wstat Total Fail Failed List of failed
+ ------------------------------------------------------------
+ io/pipe.t 12 1 8.33% 9
+ 7 tests skipped, plus 56 subtests skipped.
+ Failed 1/195 test scripts, 99.49% okay. 1/6542 subtests failed, 99.98% okay.
+
+The reasons for most important skipped tests are:
+
+=over 8
+
+=item F<op/fs.t>
+
+=over 4
+
+=item 18
+
+Checks C<atime> and C<mtime> of C<stat()> - unfortunately, HPFS
+provides only 2sec time granularity (for compatibility with FAT?).
+
+=item 25
+
+Checks C<truncate()> on a filehandle just opened for write - I do not
+know why this should or should not work.
+
+=back
+
+=item F<op/stat.t>
+
+Checks C<stat()>. Tests:
+
+=over 4
+
+=item 4
+
+Checks C<atime> and C<mtime> of C<stat()> - unfortunately, HPFS
+provides only 2sec time granularity (for compatibility with FAT?).
+
+=back
+
+=back
+
+=head2 Installing the built perl
+
+If you haven't yet moved C<perl*.dll> onto LIBPATH, do it now.
+
+Run
+
+ make install
+
+It would put the generated files into needed locations. Manually put
+F<perl.exe>, F<perl__.exe> and F<perl___.exe> to a location on your
+PATH, F<perl.dll> to a location on your LIBPATH.
+
+Run
+
+ make installcmd INSTALLCMDDIR=d:/ir/on/path
+
+to convert perl utilities to F<.cmd> files and put them on
+PATH. You need to put F<.EXE>-utilities on path manually. They are
+installed in C<$prefix/bin>, here C<$prefix> is what you gave to
+F<Configure>, see L<Making>.
+
+If you use C<man>, either move the installed F<*/man/> directories to
+your C<MANPATH>, or modify C<MANPATH> to match the location. (One
+could have avoided this by providing a correct C<manpath> option to
+F<./Configure>, or editing F<./config.sh> between configuring and
+making steps.)
+
+=head2 C<a.out>-style build
+
+Proceed as above, but make F<perl_.exe> (see L<"perl_.exe">) by
+
+ make perl_
+
+test and install by
+
+ make aout_test
+ make aout_install
+
+Manually put F<perl_.exe> to a location on your PATH.
+
+B<Note.> The build process for C<perl_> I<does not know> about all the
+dependencies, so you should make sure that anything is up-to-date,
+say, by doing
+
+ make perl_dll
+
+first.
+
+=head1 Building a binary distribution
+
+[This section provides a short overview only...]
+
+Building should proceed differently depending on whether the version of perl
+you install is already present and used on your system, or is a new version
+not yet used. The description below assumes that the version is new, so
+installing its DLLs and F<.pm> files will not disrupt the operation of your
+system even if some intermediate steps are not yet fully working.
+
+The other cases require a little bit more convoluted procedures. Below I
+suppose that the current version of Perl is C<5.8.2>, so the executables are
+named accordingly.
+
+=over
+
+=item 1.
+
+Fully build and test the Perl distribution. Make sure that no tests are
+failing with C<test> and C<aout_test> targets; fix the bugs in Perl and
+the Perl test suite detected by these tests. Make sure that C<all_test>
+make target runs as clean as possible. Check that C<os2/perlrexx.cmd>
+runs fine.
+
+=item 2.
+
+Fully install Perl, including C<installcmd> target. Copy the generated DLLs
+to C<LIBPATH>; copy the numbered Perl executables (as in F<perl5.8.2.exe>)
+to C<PATH>; copy C<perl_.exe> to C<PATH> as C<perl_5.8.2.exe>. Think whether
+you need backward-compatibility DLLs. In most cases you do not need to install
+them yet; but sometime this may simplify the following steps.
+
+=item 3.
+
+Make sure that C<CPAN.pm> can download files from CPAN. If not, you may need
+to manually install C<Net::FTP>.
+
+=item 4.
+
+Install the bundle C<Bundle::OS2_default>
+
+ perl5.8.2 -MCPAN -e "install Bundle::OS2_default" < nul |& tee 00cpan_i_1
+
+This may take a couple of hours on 1GHz processor (when run the first time).
+And this should not be necessarily a smooth procedure. Some modules may not
+specify required dependencies, so one may need to repeat this procedure several
+times until the results stabilize.
+
+ perl5.8.2 -MCPAN -e "install Bundle::OS2_default" < nul |& tee 00cpan_i_2
+ perl5.8.2 -MCPAN -e "install Bundle::OS2_default" < nul |& tee 00cpan_i_3
+
+Even after they stabilize, some tests may fail.
+
+Fix as many discovered bugs as possible. Document all the bugs which are not
+fixed, and all the failures with unknown reasons. Inspect the produced logs
+F<00cpan_i_1> to find suspiciously skipped tests, and other fishy events.
+
+Keep in mind that I<installation> of some modules may fail too: for example,
+the DLLs to update may be already loaded by F<CPAN.pm>. Inspect the C<install>
+logs (in the example above F<00cpan_i_1> etc) for errors, and install things
+manually, as in
+
+ cd $CPANHOME/.cpan/build/Digest-MD5-2.31
+ make install
+
+Some distributions may fail some tests, but you may want to install them
+anyway (as above, or via C<force install> command of C<CPAN.pm> shell-mode).
+
+Since this procedure may take quite a long time to complete, it makes sense
+to "freeze" your CPAN configuration by disabling periodic updates of the
+local copy of CPAN index: set C<index_expire> to some big value (I use 365),
+then save the settings
+
+ CPAN> o conf index_expire 365
+ CPAN> o conf commit
+
+Reset back to the default value C<1> when you are finished.
+
+=item 5.
+
+When satisfied with the results, rerun the C<installcmd> target. Now you
+can copy C<perl5.8.2.exe> to C<perl.exe>, and install the other OMF-build
+executables: C<perl__.exe> etc. They are ready to be used.
+
+=item 6.
+
+Change to the C<./pod> directory of the build tree, download the Perl logo
+F<CamelGrayBig.BMP>, and run
+
+ ( perl2ipf > perl.ipf ) |& tee 00ipf
+ ipfc /INF perl.ipf |& tee 00inf
+
+This produces the Perl docs online book C<perl.INF>. Install in on
+C<BOOKSHELF> path.
+
+=item 7.
+
+Now is the time to build statically linked executable F<perl_.exe> which
+includes newly-installed via C<Bundle::OS2_default> modules. Doing testing
+via C<CPAN.pm> is going to be painfully slow, since it statically links
+a new executable per XS extension.
+
+Here is a possible workaround: create a toplevel F<Makefile.PL> in
+F<$CPANHOME/.cpan/build/> with contents being (compare with L<Making
+executables with a custom collection of statically loaded extensions>)
+
+ use ExtUtils::MakeMaker;
+ WriteMakefile NAME => 'dummy';
+
+execute this as
+
+ perl_5.8.2.exe Makefile.PL <nul |& tee 00aout_c1
+ make -k all test <nul |& 00aout_t1
+
+Again, this procedure should not be absolutely smooth. Some C<Makefile.PL>'s
+in subdirectories may be buggy, and would not run as "child" scripts. The
+interdependency of modules can strike you; however, since non-XS modules
+are already installed, the prerequisites of most modules have a very good
+chance to be present.
+
+If you discover some glitches, move directories of problematic modules to a
+different location; if these modules are non-XS modules, you may just ignore
+them - they are already installed; the remaining, XS, modules you need to
+install manually one by one.
+
+After each such removal you need to rerun the C<Makefile.PL>/C<make> process;
+usually this procedure converges soon. (But be sure to convert all the
+necessary external C libraries from F<.lib> format to F<.a> format: run one of
+
+ emxaout foo.lib
+ emximp -o foo.a foo.lib
+
+whichever is appropriate.) Also, make sure that the DLLs for external
+libraries are usable with with executables compiled without C<-Zmtd> options.
+
+When you are sure that only a few subdirectories
+lead to failures, you may want to add C<-j4> option to C<make> to speed up
+skipping subdirectories with already finished build.
+
+When you are satisfied with the results of tests, install the build C libraries
+for extensions:
+
+ make install |& tee 00aout_i
+
+Now you can rename the file F<./perl.exe> generated during the last phase
+to F<perl_5.8.2.exe>; place it on C<PATH>; if there is an inter-dependency
+between some XS modules, you may need to repeat the C<test>/C<install> loop
+with this new executable and some excluded modules - until the procedure
+converges.
+
+Now you have all the necessary F<.a> libraries for these Perl modules in the
+places where Perl builder can find it. Use the perl builder: change to an
+empty directory, create a "dummy" F<Makefile.PL> again, and run
+
+ perl_5.8.2.exe Makefile.PL |& tee 00c
+ make perl |& tee 00p
+
+This should create an executable F<./perl.exe> with all the statically loaded
+extensions built in. Compare the generated F<perlmain.c> files to make sure
+that during the iterations the number of loaded extensions only increases.
+Rename F<./perl.exe> to F<perl_5.8.2.exe> on C<PATH>.
+
+When it converges, you got a functional variant of F<perl_5.8.2.exe>; copy it
+to C<perl_.exe>. You are done with generation of the local Perl installation.
+
+=item 8.
+
+Make sure that the installed modules are actually installed in the location
+of the new Perl, and are not inherited from entries of @INC given for
+inheritance from the older versions of Perl: set C<PERLLIB_582_PREFIX> to
+redirect the new version of Perl to a new location, and copy the installed
+files to this new location. Redo the tests to make sure that the versions of
+modules inherited from older versions of Perl are not needed.
+
+Actually, the log output of L<pod2ipf> during the step 6 gives a very detailed
+info about which modules are loaded from which place; so you may use it as
+an additional verification tool.
+
+Check that some temporary files did not make into the perl install tree.
+Run something like this
+
+ pfind . -f "!(/\.(pm|pl|ix|al|h|a|lib|txt|pod|imp|bs|dll|ld|bs|inc|xbm|yml|cgi|uu|e2x|skip|packlist|eg|cfg|html|pub|enc|all|ini|po|pot)$/i or /^\w+$/") | less
+
+in the install tree (both top one and F<sitelib> one).
+
+Compress all the DLLs with F<lxlite>. The tiny F<.exe> can be compressed with
+C</c:max> (the bug only appears when there is a fixup in the last 6 bytes of a
+page (?); since the tiny executables are much smaller than a page, the bug
+will not hit). Do not compress C<perl_.exe> - it would not work under DOS.
+
+=item 9.
+
+Now you can generate the binary distribution. This is done by running the
+test of the CPAN distribution C<OS2::SoftInstaller>. Tune up the file
+F<test.pl> to suit the layout of current version of Perl first. Do not
+forget to pack the necessary external DLLs accordingly. Include the
+description of the bugs and test suite failures you could not fix. Include
+the small-stack versions of Perl executables from Perl build directory.
+
+Include F<perl5.def> so that people can relink the perl DLL preserving
+the binary compatibility, or can create compatibility DLLs. Include the diff
+files (C<diff -pu old new>) of fixes you did so that people can rebuild your
+version. Include F<perl5.map> so that one can use remote debugging.
+
+=item 10.
+
+Share what you did with the other people. Relax. Enjoy fruits of your work.
+
+=item 11.
+
+Brace yourself for thanks, bug reports, hate mail and spam coming as result
+of the previous step. No good deed should remain unpunished!
+
+=back
+
+=head1 Building custom F<.EXE> files
+
+The Perl executables can be easily rebuilt at any moment. Moreover, one can
+use the I<embedding> interface (see L<perlembed>) to make very customized
+executables.
+
+=head2 Making executables with a custom collection of statically loaded extensions
+
+It is a little bit easier to do so while I<decreasing> the list of statically
+loaded extensions. We discuss this case only here.
+
+=over
+
+=item 1.
+
+Change to an empty directory, and create a placeholder <Makefile.PL>:
+
+ use ExtUtils::MakeMaker;
+ WriteMakefile NAME => 'dummy';
+
+=item 2.
+
+Run it with the flavor of Perl (F<perl.exe> or F<perl_.exe>) you want to
+rebuild.
+
+ perl_ Makefile.PL
+
+=item 3.
+
+Ask it to create new Perl executable:
+
+ make perl
+
+(you may need to manually add C<PERLTYPE=-DPERL_CORE> to this commandline on
+some versions of Perl; the symptom is that the command-line globbing does not
+work from OS/2 shells with the newly-compiled executable; check with
+
+ .\perl.exe -wle "print for @ARGV" *
+
+).
+
+=item 4.
+
+The previous step created F<perlmain.c> which contains a list of newXS() calls
+near the end. Removing unnecessary calls, and rerunning
+
+ make perl
+
+will produce a customized executable.
+
+=back
+
+=head2 Making executables with a custom search-paths
+
+The default perl executable is flexible enough to support most usages.
+However, one may want something yet more flexible; for example, one may want
+to find Perl DLL relatively to the location of the EXE file; or one may want
+to ignore the environment when setting the Perl-library search patch, etc.
+
+If you fill comfortable with I<embedding> interface (see L<perlembed>), such
+things are easy to do repeating the steps outlined in L<Making
+executables with a custom collection of statically loaded extensions>, and
+doing more comprehensive edits to main() of F<perlmain.c>. The people with
+little desire to understand Perl can just rename main(), and do necessary
+modification in a custom main() which calls the renamed function in appropriate
+time.
+
+However, there is a third way: perl DLL exports the main() function and several
+callbacks to customize the search path. Below is a complete example of a
+"Perl loader" which
+
+=over
+
+=item 1.
+
+Looks for Perl DLL in the directory C<$exedir/../dll>;
+
+=item 2.
+
+Prepends the above directory to C<BEGINLIBPATH>;
+
+=item 3.
+
+Fails if the Perl DLL found via C<BEGINLIBPATH> is different from what was
+loaded on step 1; e.g., another process could have loaded it from C<LIBPATH>
+or from a different value of C<BEGINLIBPATH>. In these cases one needs to
+modify the setting of the system so that this other process either does not
+run, or loads the DLL from C<BEGINLIBPATH> with C<LIBPATHSTRICT=T> (available
+with kernels after September 2000).
+
+=item 4.
+
+Loads Perl library from C<$exedir/../dll/lib/>.
+
+=item 5.
+
+Uses Bourne shell from C<$exedir/../dll/sh/ksh.exe>.
+
+=back
+
+For best results compile the C file below with the same options as the Perl
+DLL. However, a lot of functionality will work even if the executable is not
+an EMX applications, e.g., if compiled with
+
+ gcc -Wall -DDOSISH -DOS2=1 -O2 -s -Zomf -Zsys perl-starter.c -DPERL_DLL_BASENAME=\"perl312F\" -Zstack 8192 -Zlinker /PM:VIO
+
+Here is the sample C file:
+
+ #define INCL_DOS
+ #define INCL_NOPM
+ /* These are needed for compile if os2.h includes os2tk.h, not os2emx.h */
+ #define INCL_DOSPROCESS
+ #include <os2.h>
+
+ #include "EXTERN.h"
+ #define PERL_IN_MINIPERLMAIN_C
+ #include "perl.h"
+
+ static char *me;
+ HMODULE handle;
+
+ static void
+ die_with(char *msg1, char *msg2, char *msg3, char *msg4)
+ {
+ ULONG c;
+ char *s = " error: ";
+
+ DosWrite(2, me, strlen(me), &c);
+ DosWrite(2, s, strlen(s), &c);
+ DosWrite(2, msg1, strlen(msg1), &c);
+ DosWrite(2, msg2, strlen(msg2), &c);
+ DosWrite(2, msg3, strlen(msg3), &c);
+ DosWrite(2, msg4, strlen(msg4), &c);
+ DosWrite(2, "\r\n", 2, &c);
+ exit(255);
+ }
+
+ typedef ULONG (*fill_extLibpath_t)(int type, char *pre, char *post, int replace, char *msg);
+ typedef int (*main_t)(int type, char *argv[], char *env[]);
+ typedef int (*handler_t)(void* data, int which);
+
+ #ifndef PERL_DLL_BASENAME
+ # define PERL_DLL_BASENAME "perl"
+ #endif
+
+ static HMODULE
+ load_perl_dll(char *basename)
+ {
+ char buf[300], fail[260];
+ STRLEN l, dirl;
+ fill_extLibpath_t f;
+ ULONG rc_fullname;
+ HMODULE handle, handle1;
+
+ if (_execname(buf, sizeof(buf) - 13) != 0)
+ die_with("Can't find full path: ", strerror(errno), "", "");
+ /* XXXX Fill `me' with new value */
+ l = strlen(buf);
+ while (l && buf[l-1] != '/' && buf[l-1] != '\\')
+ l--;
+ dirl = l - 1;
+ strcpy(buf + l, basename);
+ l += strlen(basename);
+ strcpy(buf + l, ".dll");
+ if ( (rc_fullname = DosLoadModule(fail, sizeof fail, buf, &handle)) != 0
+ && DosLoadModule(fail, sizeof fail, basename, &handle) != 0 )
+ die_with("Can't load DLL ", buf, "", "");
+ if (rc_fullname)
+ return handle; /* was loaded with short name; all is fine */
+ if (DosQueryProcAddr(handle, 0, "fill_extLibpath", (PFN*)&f))
+ die_with(buf, ": DLL exports no symbol ", "fill_extLibpath", "");
+ buf[dirl] = 0;
+ if (f(0 /*BEGINLIBPATH*/, buf /* prepend */, NULL /* append */,
+ 0 /* keep old value */, me))
+ die_with(me, ": prepending BEGINLIBPATH", "", "");
+ if (DosLoadModule(fail, sizeof fail, basename, &handle1) != 0)
+ die_with(me, ": finding perl DLL again via BEGINLIBPATH", "", "");
+ buf[dirl] = '\\';
+ if (handle1 != handle) {
+ if (DosQueryModuleName(handle1, sizeof(fail), fail))
+ strcpy(fail, "???");
+ die_with(buf, ":\n\tperl DLL via BEGINLIBPATH is different: \n\t",
+ fail,
+ "\n\tYou may need to manipulate global BEGINLIBPATH and LIBPATHSTRICT"
+ "\n\tso that the other copy is loaded via BEGINLIBPATH.");
+ }
+ return handle;
+ }
+
+ int
+ main(int argc, char **argv, char **env)
+ {
+ main_t f;
+ handler_t h;
+
+ me = argv[0];
+ /**/
+ handle = load_perl_dll(PERL_DLL_BASENAME);
+
+ if (DosQueryProcAddr(handle, 0, "Perl_OS2_handler_install", (PFN*)&h))
+ die_with(PERL_DLL_BASENAME, ": DLL exports no symbol ", "Perl_OS2_handler_install", "");
+ if ( !h((void *)"~installprefix", Perlos2_handler_perllib_from)
+ || !h((void *)"~dll", Perlos2_handler_perllib_to)
+ || !h((void *)"~dll/sh/ksh.exe", Perlos2_handler_perl_sh) )
+ die_with(PERL_DLL_BASENAME, ": Can't install @INC manglers", "", "");
+
+ if (DosQueryProcAddr(handle, 0, "dll_perlmain", (PFN*)&f))
+ die_with(PERL_DLL_BASENAME, ": DLL exports no symbol ", "dll_perlmain", "");
+ return f(argc, argv, env);
+ }
+
+
+=head1 Build FAQ
+
+=head2 Some C</> became C<\> in pdksh.
+
+You have a very old pdksh. See L<Prerequisites>.
+
+=head2 C<'errno'> - unresolved external
+
+You do not have MT-safe F<db.lib>. See L<Prerequisites>.
+
+=head2 Problems with tr or sed
+
+reported with very old version of tr and sed.
+
+=head2 Some problem (forget which ;-)
+
+You have an older version of F<perl.dll> on your LIBPATH, which
+broke the build of extensions.
+
+=head2 Library ... not found
+
+You did not run C<omflibs>. See L<Prerequisites>.
+
+=head2 Segfault in make
+
+You use an old version of GNU make. See L<Prerequisites>.
+
+=head2 op/sprintf test failure
+
+This can result from a bug in emx sprintf which was fixed in 0.9d fix 03.
+
+=head1 Specific (mis)features of OS/2 port
+
+=head2 C<setpriority>, C<getpriority>
+
+Note that these functions are compatible with *nix, not with the older
+ports of '94 - 95. The priorities are absolute, go from 32 to -95,
+lower is quicker. 0 is the default priority.
+
+B<WARNING>. Calling C<getpriority> on a non-existing process could lock
+the system before Warp3 fixpak22. Starting with Warp3, Perl will use
+a workaround: it aborts getpriority() if the process is not present.
+This is not possible on older versions C<2.*>, and has a race
+condition anyway.
+
+=head2 C<system()>
+
+Multi-argument form of C<system()> allows an additional numeric
+argument. The meaning of this argument is described in
+L<OS2::Process>.
+
+When finding a program to run, Perl first asks the OS to look for executables
+on C<PATH> (OS/2 adds extension F<.exe> if no extension is present).
+If not found, it looks for a script with possible extensions
+added in this order: no extension, F<.cmd>, F<.btm>,
+F<.bat>, F<.pl>. If found, Perl checks the start of the file for magic
+strings C<"#!"> and C<"extproc ">. If found, Perl uses the rest of the
+first line as the beginning of the command line to run this script. The
+only mangling done to the first line is extraction of arguments (currently
+up to 3), and ignoring of the path-part of the "interpreter" name if it can't
+be found using the full path.
+
+E.g., C<system 'foo', 'bar', 'baz'> may lead Perl to finding
+F<C:/emx/bin/foo.cmd> with the first line being
+
+ extproc /bin/bash -x -c
+
+If F</bin/bash.exe> is not found, then Perl looks for an executable F<bash.exe> on
+C<PATH>. If found in F<C:/emx.add/bin/bash.exe>, then the above system() is
+translated to
+
+ system qw(C:/emx.add/bin/bash.exe -x -c C:/emx/bin/foo.cmd bar baz)
+
+One additional translation is performed: instead of F</bin/sh> Perl uses
+the hardwired-or-customized shell (see C<L<"PERL_SH_DIR">>).
+
+The above search for "interpreter" is recursive: if F<bash> executable is not
+found, but F<bash.btm> is found, Perl will investigate its first line etc.
+The only hardwired limit on the recursion depth is implicit: there is a limit
+4 on the number of additional arguments inserted before the actual arguments
+given to system(). In particular, if no additional arguments are specified
+on the "magic" first lines, then the limit on the depth is 4.
+
+If Perl finds that the found executable is of PM type when the
+current session is not, it will start the new process in a separate session of
+necessary type. Call via C<OS2::Process> to disable this magic.
+
+B<WARNING>. Due to the described logic, you need to explicitly
+specify F<.com> extension if needed. Moreover, if the executable
+F<perl5.6.1> is requested, Perl will not look for F<perl5.6.1.exe>.
+[This may change in the future.]
+
+=head2 C<extproc> on the first line
+
+If the first chars of a Perl script are C<"extproc ">, this line is treated
+as C<#!>-line, thus all the switches on this line are processed (twice
+if script was started via cmd.exe). See L<perlrun/DESCRIPTION>.
+
+=head2 Additional modules:
+
+L<OS2::Process>, L<OS2::DLL>, L<OS2::REXX>, L<OS2::PrfDB>, L<OS2::ExtAttr>. These
+modules provide access to additional numeric argument for C<system>
+and to the information about the running process,
+to DLLs having functions with REXX signature and to the REXX runtime, to
+OS/2 databases in the F<.INI> format, and to Extended Attributes.
+
+Two additional extensions by Andreas Kaiser, C<OS2::UPM>, and
+C<OS2::FTP>, are included into C<ILYAZ> directory, mirrored on CPAN.
+Other OS/2-related extensions are available too.
+
+=head2 Prebuilt methods:
+
+=over 4
+
+=item C<File::Copy::syscopy>
+
+used by C<File::Copy::copy>, see L<File::Copy>.
+
+=item C<DynaLoader::mod2fname>
+
+used by C<DynaLoader> for DLL name mangling.
+
+=item C<Cwd::current_drive()>
+
+Self explanatory.
+
+=item C<Cwd::sys_chdir(name)>
+
+leaves drive as it is.
+
+=item C<Cwd::change_drive(name)>
+
+chanes the "current" drive.
+
+=item C<Cwd::sys_is_absolute(name)>
+
+means has drive letter and is_rooted.
+
+=item C<Cwd::sys_is_rooted(name)>
+
+means has leading C<[/\\]> (maybe after a drive-letter:).
+
+=item C<Cwd::sys_is_relative(name)>
+
+means changes with current dir.
+
+=item C<Cwd::sys_cwd(name)>
+
+Interface to cwd from EMX. Used by C<Cwd::cwd>.
+
+=item C<Cwd::sys_abspath(name, dir)>
+
+Really really odious function to implement. Returns absolute name of
+file which would have C<name> if CWD were C<dir>. C<Dir> defaults to the
+current dir.
+
+=item C<Cwd::extLibpath([type])>
+
+Get current value of extended library search path. If C<type> is
+present and positive, works with C<END_LIBPATH>, if negative, works
+with C<LIBPATHSTRICT>, otherwise with C<BEGIN_LIBPATH>.
+
+=item C<Cwd::extLibpath_set( path [, type ] )>
+
+Set current value of extended library search path. If C<type> is
+present and positive, works with <END_LIBPATH>, if negative, works
+with C<LIBPATHSTRICT>, otherwise with C<BEGIN_LIBPATH>.
+
+=item C<OS2::Error(do_harderror,do_exception)>
+
+Returns C<undef> if it was not called yet, otherwise bit 1 is
+set if on the previous call do_harderror was enabled, bit
+2 is set if on previous call do_exception was enabled.
+
+This function enables/disables error popups associated with
+hardware errors (Disk not ready etc.) and software exceptions.
+
+I know of no way to find out the state of popups I<before> the first call
+to this function.
+
+=item C<OS2::Errors2Drive(drive)>
+
+Returns C<undef> if it was not called yet, otherwise return false if errors
+were not requested to be written to a hard drive, or the drive letter if
+this was requested.
+
+This function may redirect error popups associated with hardware errors
+(Disk not ready etc.) and software exceptions to the file POPUPLOG.OS2 at
+the root directory of the specified drive. Overrides OS2::Error() specified
+by individual programs. Given argument undef will disable redirection.
+
+Has global effect, persists after the application exits.
+
+I know of no way to find out the state of redirection of popups to the disk
+I<before> the first call to this function.
+
+=item OS2::SysInfo()
+
+Returns a hash with system information. The keys of the hash are
+
+ MAX_PATH_LENGTH, MAX_TEXT_SESSIONS, MAX_PM_SESSIONS,
+ MAX_VDM_SESSIONS, BOOT_DRIVE, DYN_PRI_VARIATION,
+ MAX_WAIT, MIN_SLICE, MAX_SLICE, PAGE_SIZE,
+ VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION,
+ MS_COUNT, TIME_LOW, TIME_HIGH, TOTPHYSMEM, TOTRESMEM,
+ TOTAVAILMEM, MAXPRMEM, MAXSHMEM, TIMER_INTERVAL,
+ MAX_COMP_LENGTH, FOREGROUND_FS_SESSION,
+ FOREGROUND_PROCESS
+
+=item OS2::BootDrive()
+
+Returns a letter without colon.
+
+=item C<OS2::MorphPM(serve)>, C<OS2::UnMorphPM(serve)>
+
+Transforms the current application into a PM application and back.
+The argument true means that a real message loop is going to be served.
+OS2::MorphPM() returns the PM message queue handle as an integer.
+
+See L<"Centralized management of resources"> for additional details.
+
+=item C<OS2::Serve_Messages(force)>
+
+Fake on-demand retrieval of outstanding PM messages. If C<force> is false,
+will not dispatch messages if a real message loop is known to
+be present. Returns number of messages retrieved.
+
+Dies with "QUITing..." if WM_QUIT message is obtained.
+
+=item C<OS2::Process_Messages(force [, cnt])>
+
+Retrieval of PM messages until window creation/destruction.
+If C<force> is false, will not dispatch messages if a real message loop
+is known to be present.
+
+Returns change in number of windows. If C<cnt> is given,
+it is incremented by the number of messages retrieved.
+
+Dies with "QUITing..." if WM_QUIT message is obtained.
+
+=item C<OS2::_control87(new,mask)>
+
+the same as L<_control87(3)> of EMX. Takes integers as arguments, returns
+the previous coprocessor control word as an integer. Only bits in C<new> which
+are present in C<mask> are changed in the control word.
+
+=item OS2::get_control87()
+
+gets the coprocessor control word as an integer.
+
+=item C<OS2::set_control87_em(new=MCW_EM,mask=MCW_EM)>
+
+The variant of OS2::_control87() with default values good for
+handling exception mask: if no C<mask>, uses exception mask part of C<new>
+only. If no C<new>, disables all the floating point exceptions.
+
+See L<"Misfeatures"> for details.
+
+=item C<OS2::DLLname([how [, \&xsub]])>
+
+Gives the information about the Perl DLL or the DLL containing the C
+function bound to by C<&xsub>. The meaning of C<how> is: default (2):
+full name; 0: handle; 1: module name.
+
+=back
+
+(Note that some of these may be moved to different libraries -
+eventually).
+
+
+=head2 Prebuilt variables:
+
+=over 4
+
+=item $OS2::emx_rev
+
+numeric value is the same as _emx_rev of EMX, a string value the same
+as _emx_vprt (similar to C<0.9c>).
+
+=item $OS2::emx_env
+
+same as _emx_env of EMX, a number similar to 0x8001.
+
+=item $OS2::os_ver
+
+a number C<OS_MAJOR + 0.001 * OS_MINOR>.
+
+=item $OS2::is_aout
+
+true if the Perl library was compiled in AOUT format.
+
+=item $OS2::can_fork
+
+true if the current executable is an AOUT EMX executable, so Perl can
+fork. Do not use this, use the portable check for
+$Config::Config{dfork}.
+
+=item $OS2::nsyserror
+
+This variable (default is 1) controls whether to enforce the contents
+of $^E to start with C<SYS0003>-like id. If set to 0, then the string
+value of $^E is what is available from the OS/2 message file. (Some
+messages in this file have an C<SYS0003>-like id prepended, some not.)
+
+=back
+
+=head2 Misfeatures
+
+=over 4
+
+=item *
+
+Since L<flock(3)> is present in EMX, but is not functional, it is
+emulated by perl. To disable the emulations, set environment variable
+C<USE_PERL_FLOCK=0>.
+
+=item *
+
+Here is the list of things which may be "broken" on
+EMX (from EMX docs):
+
+=over 4
+
+=item *
+
+The functions L<recvmsg(3)>, L<sendmsg(3)>, and L<socketpair(3)> are not
+implemented.
+
+=item *
+
+L<sock_init(3)> is not required and not implemented.
+
+=item *
+
+L<flock(3)> is not yet implemented (dummy function). (Perl has a workaround.)
+
+=item *
+
+L<kill(3)>: Special treatment of PID=0, PID=1 and PID=-1 is not implemented.
+
+=item *
+
+L<waitpid(3)>:
+
+ WUNTRACED
+ Not implemented.
+ waitpid() is not implemented for negative values of PID.
+
+=back
+
+Note that C<kill -9> does not work with the current version of EMX.
+
+=item *
+
+See L<"Text-mode filehandles">.
+
+=item *
+
+Unix-domain sockets on OS/2 live in a pseudo-file-system C</sockets/...>.
+To avoid a failure to create a socket with a name of a different form,
+C<"/socket/"> is prepended to the socket name (unless it starts with this
+already).
+
+This may lead to problems later in case the socket is accessed via the
+"usual" file-system calls using the "initial" name.
+
+=item *
+
+Apparently, IBM used a compiler (for some period of time around '95?) which
+changes FP mask right and left. This is not I<that> bad for IBM's
+programs, but the same compiler was used for DLLs which are used with
+general-purpose applications. When these DLLs are used, the state of
+floating-point flags in the application is not predictable.
+
+What is much worse, some DLLs change the floating point flags when in
+_DLLInitTerm() (e.g., F<TCP32IP>). This means that even if you do not I<call>
+any function in the DLL, just the act of loading this DLL will reset your
+flags. What is worse, the same compiler was used to compile some HOOK DLLs.
+Given that HOOK dlls are executed in the context of I<all> the applications
+in the system, this means a complete unpredictablity of floating point
+flags on systems using such HOOK DLLs. E.g., F<GAMESRVR.DLL> of B<DIVE>
+origin changes the floating point flags on each write to the TTY of a VIO
+(windowed text-mode) applications.
+
+Some other (not completely debugged) situations when FP flags change include
+some video drivers (?), and some operations related to creation of the windows.
+People who code B<OpenGL> may have more experience on this.
+
+Perl is generally used in the situation when all the floating-point
+exceptions are ignored, as is the default under EMX. If they are not ignored,
+some benign Perl programs would get a C<SIGFPE> and would die a horrible death.
+
+To circumvent this, Perl uses two hacks. They help against I<one> type of
+damage only: FP flags changed when loading a DLL.
+
+One of the hacks is to disable floating point exceptions on Perl startup (as
+is the default with EMX). This helps only with compile-time-linked DLLs
+changing the flags before main() had a chance to be called.
+
+The other hack is to restore FP flags after a call to dlopen(). This helps
+against similar damage done by DLLs _DLLInitTerm() at runtime. Currently
+no way to switch these hacks off is provided.
+
+=back
+
+=head2 Modifications
+
+Perl modifies some standard C library calls in the following ways:
+
+=over 9
+
+=item C<popen>
+
+C<my_popen> uses F<sh.exe> if shell is required, cf. L<"PERL_SH_DIR">.
+
+=item C<tmpnam>
+
+is created using C<TMP> or C<TEMP> environment variable, via
+C<tempnam>.
+
+=item C<tmpfile>
+
+If the current directory is not writable, file is created using modified
+C<tmpnam>, so there may be a race condition.
+
+=item C<ctermid>
+
+a dummy implementation.
+
+=item C<stat>
+
+C<os2_stat> special-cases F</dev/tty> and F</dev/con>.
+
+=item C<mkdir>, C<rmdir>
+
+these EMX functions do not work if the path contains a trailing C</>.
+Perl contains a workaround for this.
+
+=item C<flock>
+
+Since L<flock(3)> is present in EMX, but is not functional, it is
+emulated by perl. To disable the emulations, set environment variable
+C<USE_PERL_FLOCK=0>.
+
+=back
+
+=head2 Identifying DLLs
+
+All the DLLs built with the current versions of Perl have ID strings
+identifying the name of the extension, its version, and the version
+of Perl required for this DLL. Run C<bldlevel DLL-name> to find this
+info.
+
+=head2 Centralized management of resources
+
+Since to call certain OS/2 API one needs to have a correctly initialized
+C<Win> subsystem, OS/2-specific extensions may require getting C<HAB>s and
+C<HMQ>s. If an extension would do it on its own, another extension could
+fail to initialize.
+
+Perl provides a centralized management of these resources:
+
+=over
+
+=item C<HAB>
+
+To get the HAB, the extension should call C<hab = perl_hab_GET()> in C. After
+this call is performed, C<hab> may be accessed as C<Perl_hab>. There is
+no need to release the HAB after it is used.
+
+If by some reasons F<perl.h> cannot be included, use
+
+ extern int Perl_hab_GET(void);
+
+instead.
+
+=item C<HMQ>
+
+There are two cases:
+
+=over
+
+=item *
+
+the extension needs an C<HMQ> only because some API will not work otherwise.
+Use C<serve = 0> below.
+
+=item *
+
+the extension needs an C<HMQ> since it wants to engage in a PM event loop.
+Use C<serve = 1> below.
+
+=back
+
+To get an C<HMQ>, the extension should call C<hmq = perl_hmq_GET(serve)> in C.
+After this call is performed, C<hmq> may be accessed as C<Perl_hmq>.
+
+To signal to Perl that HMQ is not needed any more, call
+C<perl_hmq_UNSET(serve)>. Perl process will automatically morph/unmorph itself
+into/from a PM process if HMQ is needed/not-needed. Perl will automatically
+enable/disable C<WM_QUIT> message during shutdown if the message queue is
+served/not-served.
+
+B<NOTE>. If during a shutdown there is a message queue which did not disable
+WM_QUIT, and which did not process the received WM_QUIT message, the
+shutdown will be automatically cancelled. Do not call C<perl_hmq_GET(1)>
+unless you are going to process messages on an orderly basis.
+
+=item * Treating errors reported by OS/2 API
+
+There are two principal conventions (it is useful to call them C<Dos*>
+and C<Win*> - though this part of the function signature is not always
+determined by the name of the API) of reporting the error conditions
+of OS/2 API. Most of C<Dos*> APIs report the error code as the result
+of the call (so 0 means success, and there are many types of errors).
+Most of C<Win*> API report success/fail via the result being
+C<TRUE>/C<FALSE>; to find the reason for the failure one should call
+WinGetLastError() API.
+
+Some C<Win*> entry points also overload a "meaningful" return value
+with the error indicator; having a 0 return value indicates an error.
+Yet some other C<Win*> entry points overload things even more, and 0
+return value may mean a successful call returning a valid value 0, as
+well as an error condition; in the case of a 0 return value one should
+call WinGetLastError() API to distinguish a successful call from a
+failing one.
+
+By convention, all the calls to OS/2 API should indicate their
+failures by resetting $^E. All the Perl-accessible functions which
+call OS/2 API may be broken into two classes: some die()s when an API
+error is encountered, the other report the error via a false return
+value (of course, this does not concern Perl-accessible functions
+which I<expect> a failure of the OS/2 API call, having some workarounds
+coded).
+
+Obviously, in the situation of the last type of the signature of an OS/2
+API, it is must more convenient for the users if the failure is
+indicated by die()ing: one does not need to check $^E to know that
+something went wrong. If, however, this solution is not desirable by
+some reason, the code in question should reset $^E to 0 before making
+this OS/2 API call, so that the caller of this Perl-accessible
+function has a chance to distinguish a success-but-0-return value from
+a failure. (One may return undef as an alternative way of reporting
+an error.)
+
+The macros to simplify this type of error propagation are
+
+=over
+
+=item C<CheckOSError(expr)>
+
+Returns true on error, sets $^E. Expects expr() be a call of
+C<Dos*>-style API.
+
+=item C<CheckWinError(expr)>
+
+Returns true on error, sets $^E. Expects expr() be a call of
+C<Win*>-style API.
+
+=item C<SaveWinError(expr)>
+
+Returns C<expr>, sets $^E from WinGetLastError() if C<expr> is false.
+
+=item C<SaveCroakWinError(expr,die,name1,name2)>
+
+Returns C<expr>, sets $^E from WinGetLastError() if C<expr> is false,
+and die()s if C<die> and $^E are true. The message to die is the
+concatenated strings C<name1> and C<name2>, separated by C<": "> from
+the contents of $^E.
+
+=item C<WinError_2_Perl_rc>
+
+Sets C<Perl_rc> to the return value of WinGetLastError().
+
+=item C<FillWinError>
+
+Sets C<Perl_rc> to the return value of WinGetLastError(), and sets $^E
+to the corresponding value.
+
+=item C<FillOSError(rc)>
+
+Sets C<Perl_rc> to C<rc>, and sets $^E to the corresponding value.
+
+=back
+
+=item * Loading DLLs and ordinals in DLLs
+
+Some DLLs are only present in some versions of OS/2, or in some
+configurations of OS/2. Some exported entry points are present only
+in DLLs shipped with some versions of OS/2. If these DLLs and entry
+points were linked directly for a Perl executable/DLL or from a Perl
+extensions, this binary would work only with the specified
+versions/setups. Even if these entry points were not needed, the
+I<load> of the executable (or DLL) would fail.
+
+For example, many newer useful APIs are not present in OS/2 v2; many
+PM-related APIs require DLLs not available on floppy-boot setup.
+
+To make these calls fail I<only when the calls are executed>, one
+should call these API via a dynamic linking API. There is a subsystem
+in Perl to simplify such type of calls. A large number of entry
+points available for such linking is provided (see C<entries_ordinals>
+- and also C<PMWIN_entries> - in F<os2ish.h>). These ordinals can be
+accessed via the APIs:
+
+ CallORD(), DeclFuncByORD(), DeclVoidFuncByORD(),
+ DeclOSFuncByORD(), DeclWinFuncByORD(), AssignFuncPByORD(),
+ DeclWinFuncByORD_CACHE(), DeclWinFuncByORD_CACHE_survive(),
+ DeclWinFuncByORD_CACHE_resetError_survive(),
+ DeclWinFunc_CACHE(), DeclWinFunc_CACHE_resetError(),
+ DeclWinFunc_CACHE_survive(), DeclWinFunc_CACHE_resetError_survive()
+
+See the header files and the C code in the supplied OS/2-related
+modules for the details on usage of these functions.
+
+Some of these functions also combine dynaloading semantic with the
+error-propagation semantic discussed above.
+
+=back
+
+=head1 Perl flavors
+
+Because of idiosyncrasies of OS/2 one cannot have all the eggs in the
+same basket (though EMX environment tries hard to overcome this
+limitations, so the situation may somehow improve). There are 4
+executables for Perl provided by the distribution:
+
+=head2 F<perl.exe>
+
+The main workhorse. This is a chimera executable: it is compiled as an
+C<a.out>-style executable, but is linked with C<omf>-style dynamic
+library F<perl.dll>, and with dynamic CRT DLL. This executable is a
+VIO application.
+
+It can load perl dynamic extensions, and it can fork().
+
+B<Note.> Keep in mind that fork() is needed to open a pipe to yourself.
+
+=head2 F<perl_.exe>
+
+This is a statically linked C<a.out>-style executable. It cannot
+load dynamic Perl extensions. The executable supplied in binary
+distributions has a lot of extensions prebuilt, thus the above restriction is
+important only if you use custom-built extensions. This executable is a VIO
+application.
+
+I<This is the only executable with does not require OS/2.> The
+friends locked into C<M$> world would appreciate the fact that this
+executable runs under DOS, Win0.3*, Win0.95 and WinNT with an
+appropriate extender. See L<"Other OSes">.
+
+=head2 F<perl__.exe>
+
+This is the same executable as F<perl___.exe>, but it is a PM
+application.
+
+B<Note.> Usually (unless explicitly redirected during the startup)
+STDIN, STDERR, and STDOUT of a PM
+application are redirected to F<nul>. However, it is possible to I<see>
+them if you start C<perl__.exe> from a PM program which emulates a
+console window, like I<Shell mode> of Emacs or EPM. Thus it I<is
+possible> to use Perl debugger (see L<perldebug>) to debug your PM
+application (but beware of the message loop lockups - this will not
+work if you have a message queue to serve, unless you hook the serving
+into the getc() function of the debugger).
+
+Another way to see the output of a PM program is to run it as
+
+ pm_prog args 2>&1 | cat -
+
+with a shell I<different> from F<cmd.exe>, so that it does not create
+a link between a VIO session and the session of C<pm_porg>. (Such a link
+closes the VIO window.) E.g., this works with F<sh.exe> - or with Perl!
+
+ open P, 'pm_prog args 2>&1 |' or die;
+ print while <P>;
+
+The flavor F<perl__.exe> is required if you want to start your program without
+a VIO window present, but not C<detach>ed (run C<help detach> for more info).
+Very useful for extensions which use PM, like C<Perl/Tk> or C<OpenGL>.
+
+Note also that the differences between PM and VIO executables are only
+in the I<default> behaviour. One can start I<any> executable in
+I<any> kind of session by using the arguments C</fs>, C</pm> or
+C</win> switches of the command C<start> (of F<CMD.EXE> or a similar
+shell). Alternatively, one can use the numeric first argument of the
+C<system> Perl function (see L<OS2::Process>).
+
+=head2 F<perl___.exe>
+
+This is an C<omf>-style executable which is dynamically linked to
+F<perl.dll> and CRT DLL. I know no advantages of this executable
+over C<perl.exe>, but it cannot fork() at all. Well, one advantage is
+that the build process is not so convoluted as with C<perl.exe>.
+
+It is a VIO application.
+
+=head2 Why strange names?
+
+Since Perl processes the C<#!>-line (cf.
+L<perlrun/DESCRIPTION>, L<perlrun/Switches>,
+L<perldiag/"Not a perl script">,
+L<perldiag/"No Perl script found in input">), it should know when a
+program I<is a Perl>. There is some naming convention which allows
+Perl to distinguish correct lines from wrong ones. The above names are
+almost the only names allowed by this convention which do not contain
+digits (which have absolutely different semantics).
+
+=head2 Why dynamic linking?
+
+Well, having several executables dynamically linked to the same huge
+library has its advantages, but this would not substantiate the
+additional work to make it compile. The reason is the complicated-to-developers
+but very quick and convenient-to-users "hard" dynamic linking used by OS/2.
+
+There are two distinctive features of the dyna-linking model of OS/2:
+first, all the references to external functions are resolved at the compile time;
+second, there is no runtime fixup of the DLLs after they are loaded into memory.
+The first feature is an enormous advantage over other models: it avoids
+conflicts when several DLLs used by an application export entries with
+the same name. In such cases "other" models of dyna-linking just choose
+between these two entry points using some random criterion - with predictable
+disasters as results. But it is the second feature which requires the build
+of F<perl.dll>.
+
+The address tables of DLLs are patched only once, when they are
+loaded. The addresses of the entry points into DLLs are guaranteed to be
+the same for all the programs which use the same DLL. This removes the
+runtime fixup - once DLL is loaded, its code is read-only.
+
+While this allows some (significant?) performance advantages, this makes life
+much harder for developers, since the above scheme makes it impossible
+for a DLL to be "linked" to a symbol in the F<.EXE> file. Indeed, this
+would need a DLL to have different relocations tables for the
+(different) executables which use this DLL.
+
+However, a dynamically loaded Perl extension is forced to use some symbols
+from the perl
+executable, e.g., to know how to find the arguments to the functions:
+the arguments live on the perl
+internal evaluation stack. The solution is to put the main code of
+the interpreter into a DLL, and make the F<.EXE> file which just loads
+this DLL into memory and supplies command-arguments. The extension DLL
+cannot link to symbols in F<.EXE>, but it has no problem linking
+to symbols in the F<.DLL>.
+
+This I<greatly> increases the load time for the application (as well as
+complexity of the compilation). Since interpreter is in a DLL,
+the C RTL is basically forced to reside in a DLL as well (otherwise
+extensions would not be able to use CRT). There are some advantages if
+you use different flavors of perl, such as running F<perl.exe> and
+F<perl__.exe> simultaneously: they share the memory of F<perl.dll>.
+
+B<NOTE>. There is one additional effect which makes DLLs more wasteful:
+DLLs are loaded in the shared memory region, which is a scarse resource
+given the 512M barrier of the "standard" OS/2 virtual memory. The code of
+F<.EXE> files is also shared by all the processes which use the particular
+F<.EXE>, but they are "shared in the private address space of the process";
+this is possible because the address at which different sections
+of the F<.EXE> file are loaded is decided at compile-time, thus all the
+processes have these sections loaded at same addresses, and no fixup
+of internal links inside the F<.EXE> is needed.
+
+Since DLLs may be loaded at run time, to have the same mechanism for DLLs
+one needs to have the address range of I<any of the loaded> DLLs in the
+system to be available I<in all the processes> which did not load a particular
+DLL yet. This is why the DLLs are mapped to the shared memory region.
+
+=head2 Why chimera build?
+
+Current EMX environment does not allow DLLs compiled using Unixish
+C<a.out> format to export symbols for data (or at least some types of
+data). This forces C<omf>-style compile of F<perl.dll>.
+
+Current EMX environment does not allow F<.EXE> files compiled in
+C<omf> format to fork(). fork() is needed for exactly three Perl
+operations:
+
+=over 4
+
+=item *
+
+explicit fork() in the script,
+
+=item *
+
+C<open FH, "|-">
+
+=item *
+
+C<open FH, "-|">, in other words, opening pipes to itself.
+
+=back
+
+While these operations are not questions of life and death, they are
+needed for a lot of
+useful scripts. This forces C<a.out>-style compile of
+F<perl.exe>.
+
+
+=head1 ENVIRONMENT
+
+Here we list environment variables with are either OS/2- and DOS- and
+Win*-specific, or are more important under OS/2 than under other OSes.
+
+=head2 C<PERLLIB_PREFIX>
+
+Specific for EMX port. Should have the form
+
+ path1;path2
+
+or
+
+ path1 path2
+
+If the beginning of some prebuilt path matches F<path1>, it is
+substituted with F<path2>.
+
+Should be used if the perl library is moved from the default
+location in preference to C<PERL(5)LIB>, since this would not leave wrong
+entries in @INC. For example, if the compiled version of perl looks for @INC
+in F<f:/perllib/lib>, and you want to install the library in
+F<h:/opt/gnu>, do
+
+ set PERLLIB_PREFIX=f:/perllib/lib;h:/opt/gnu
+
+This will cause Perl with the prebuilt @INC of
+
+ f:/perllib/lib/5.00553/os2
+ f:/perllib/lib/5.00553
+ f:/perllib/lib/site_perl/5.00553/os2
+ f:/perllib/lib/site_perl/5.00553
+ .
+
+to use the following @INC:
+
+ h:/opt/gnu/5.00553/os2
+ h:/opt/gnu/5.00553
+ h:/opt/gnu/site_perl/5.00553/os2
+ h:/opt/gnu/site_perl/5.00553
+ .
+
+=head2 C<PERL_BADLANG>
+
+If 0, perl ignores setlocale() failing. May be useful with some
+strange I<locale>s.
+
+=head2 C<PERL_BADFREE>
+
+If 0, perl would not warn of in case of unwarranted free(). With older
+perls this might be
+useful in conjunction with the module DB_File, which was buggy when
+dynamically linked and OMF-built.
+
+Should not be set with newer Perls, since this may hide some I<real> problems.
+
+=head2 C<PERL_SH_DIR>
+
+Specific for EMX port. Gives the directory part of the location for
+F<sh.exe>.
+
+=head2 C<USE_PERL_FLOCK>
+
+Specific for EMX port. Since L<flock(3)> is present in EMX, but is not
+functional, it is emulated by perl. To disable the emulations, set
+environment variable C<USE_PERL_FLOCK=0>.
+
+=head2 C<TMP> or C<TEMP>
+
+Specific for EMX port. Used as storage place for temporary files.
+
+=head1 Evolution
+
+Here we list major changes which could make you by surprise.
+
+=head2 Text-mode filehandles
+
+Starting from version 5.8, Perl uses a builtin translation layer for
+text-mode files. This replaces the efficient well-tested EMX layer by
+some code which should be best characterized as a "quick hack".
+
+In addition to possible bugs and an inability to follow changes to the
+translation policy with off/on switches of TERMIO translation, this
+introduces a serious incompatible change: before sysread() on
+text-mode filehandles would go through the translation layer, now it
+would not.
+
+=head2 Priorities
+
+C<setpriority> and C<getpriority> are not compatible with earlier
+ports by Andreas Kaiser. See C<"setpriority, getpriority">.
+
+=head2 DLL name mangling: pre 5.6.2
+
+With the release 5.003_01 the dynamically loadable libraries
+should be rebuilt when a different version of Perl is compiled. In particular,
+DLLs (including F<perl.dll>) are now created with the names
+which contain a checksum, thus allowing workaround for OS/2 scheme of
+caching DLLs.
+
+It may be possible to code a simple workaround which would
+
+=over
+
+=item *
+
+find the old DLLs looking through the old @INC;
+
+=item *
+
+mangle the names according to the scheme of new perl and copy the DLLs to
+these names;
+
+=item *
+
+edit the internal C<LX> tables of DLL to reflect the change of the name
+(probably not needed for Perl extension DLLs, since the internally coded names
+are not used for "specific" DLLs, they used only for "global" DLLs).
+
+=item *
+
+edit the internal C<IMPORT> tables and change the name of the "old"
+F<perl????.dll> to the "new" F<perl????.dll>.
+
+=back
+
+=head2 DLL name mangling: 5.6.2 and beyond
+
+In fact mangling of I<extension> DLLs was done due to misunderstanding
+of the OS/2 dynaloading model. OS/2 (effectively) maintains two
+different tables of loaded DLL:
+
+=over
+
+=item Global DLLs
+
+those loaded by the base name from C<LIBPATH>; including those
+associated at link time;
+
+=item specific DLLs
+
+loaded by the full name.
+
+=back
+
+When resolving a request for a global DLL, the table of already-loaded
+specific DLLs is (effectively) ignored; moreover, specific DLLs are
+I<always> loaded from the prescribed path.
+
+There is/was a minor twist which makes this scheme fragile: what to do
+with DLLs loaded from
+
+=over
+
+=item C<BEGINLIBPATH> and C<ENDLIBPATH>
+
+(which depend on the process)
+
+=item F<.> from C<LIBPATH>
+
+which I<effectively> depends on the process (although C<LIBPATH> is the
+same for all the processes).
+
+=back
+
+Unless C<LIBPATHSTRICT> is set to C<T> (and the kernel is after
+2000/09/01), such DLLs are considered to be global. When loading a
+global DLL it is first looked in the table of already-loaded global
+DLLs. Because of this the fact that one executable loaded a DLL from
+C<BEGINLIBPATH> and C<ENDLIBPATH>, or F<.> from C<LIBPATH> may affect
+I<which> DLL is loaded when I<another> executable requests a DLL with
+the same name. I<This> is the reason for version-specific mangling of
+the DLL name for perl DLL.
+
+Since the Perl extension DLLs are always loaded with the full path,
+there is no need to mangle their names in a version-specific ways:
+their directory already reflects the corresponding version of perl,
+and @INC takes into account binary compatibility with older version.
+Starting from C<5.6.2> the name mangling scheme is fixed to be the
+same as for Perl 5.005_53 (same as in a popular binary release). Thus
+new Perls will be able to I<resolve the names> of old extension DLLs
+if @INC allows finding their directories.
+
+However, this still does not guarantee that these DLL may be loaded.
+The reason is the mangling of the name of the I<Perl DLL>. And since
+the extension DLLs link with the Perl DLL, extension DLLs for older
+versions would load an older Perl DLL, and would most probably
+segfault (since the data in this DLL is not properly initialized).
+
+There is a partial workaround (which can be made complete with newer
+OS/2 kernels): create a forwarder DLL with the same name as the DLL of
+the older version of Perl, which forwards the entry points to the
+newer Perl's DLL. Make this DLL accessible on (say) the C<BEGINLIBPATH> of
+the new Perl executable. When the new executable accesses old Perl's
+extension DLLs, they would request the old Perl's DLL by name, get the
+forwarder instead, so effectively will link with the currently running
+(new) Perl DLL.
+
+This may break in two ways:
+
+=over
+
+=item *
+
+Old perl executable is started when a new executable is running has
+loaded an extension compiled for the old executable (ouph!). In this
+case the old executable will get a forwarder DLL instead of the old
+perl DLL, so would link with the new perl DLL. While not directly
+fatal, it will behave the same as new executable. This beats the whole
+purpose of explicitly starting an old executable.
+
+=item *
+
+A new executable loads an extension compiled for the old executable
+when an old perl executable is running. In this case the extension
+will not pick up the forwarder - with fatal results.
+
+=back
+
+With support for C<LIBPATHSTRICT> this may be circumvented - unless
+one of DLLs is started from F<.> from C<LIBPATH> (I do not know
+whether C<LIBPATHSTRICT> affects this case).
+
+B<REMARK>. Unless newer kernels allow F<.> in C<BEGINLIBPATH> (older
+do not), this mess cannot be completely cleaned. (It turns out that
+as of the beginning of 2002, F<.> is not allowed, but F<.\.> is - and
+it has the same effect.)
+
+
+B<REMARK>. C<LIBPATHSTRICT>, C<BEGINLIBPATH> and C<ENDLIBPATH> are
+not environment variables, although F<cmd.exe> emulates them on C<SET
+...> lines. From Perl they may be accessed by L<Cwd::extLibpath> and
+L<Cwd::extLibpath_set>.
+
+=head2 DLL forwarder generation
+
+Assume that the old DLL is named F<perlE0AC.dll> (as is one for
+5.005_53), and the new version is 5.6.1. Create a file
+F<perl5shim.def-leader> with
+
+ LIBRARY 'perlE0AC' INITINSTANCE TERMINSTANCE
+ DESCRIPTION '@#perl5-porters@perl.org:5.006001#@ Perl module for 5.00553 -> Perl 5.6.1 forwarder'
+ CODE LOADONCALL
+ DATA LOADONCALL NONSHARED MULTIPLE
+ EXPORTS
+
+modifying the versions/names as needed. Run
+
+ perl -wnle "next if 0../EXPORTS/; print qq( \"$1\") if /\"(\w+)\"/" perl5.def >lst
+
+in the Perl build directory (to make the DLL smaller replace perl5.def
+with the definition file for the older version of Perl if present).
+
+ cat perl5shim.def-leader lst >perl5shim.def
+ gcc -Zomf -Zdll -o perlE0AC.dll perl5shim.def -s -llibperl
+
+(ignore multiple C<warning L4085>).
+
+=head2 Threading
+
+As of release 5.003_01 perl is linked to multithreaded C RTL
+DLL. If perl itself is not compiled multithread-enabled, so will not be perl's
+malloc(). However, extensions may use multiple thread on their own
+risk.
+
+This was needed to compile C<Perl/Tk> for XFree86-OS/2 out-of-the-box, and
+link with DLLs for other useful libraries, which typically are compiled
+with C<-Zmt -Zcrtdll>.
+
+=head2 Calls to external programs
+
+Due to a popular demand the perl external program calling has been
+changed wrt Andreas Kaiser's port. I<If> perl needs to call an
+external program I<via shell>, the F<f:/bin/sh.exe> will be called, or
+whatever is the override, see L<"PERL_SH_DIR">.
+
+Thus means that you need to get some copy of a F<sh.exe> as well (I
+use one from pdksh). The path F<F:/bin> above is set up automatically during
+the build to a correct value on the builder machine, but is
+overridable at runtime,
+
+B<Reasons:> a consensus on C<perl5-porters> was that perl should use
+one non-overridable shell per platform. The obvious choices for OS/2
+are F<cmd.exe> and F<sh.exe>. Having perl build itself would be impossible
+with F<cmd.exe> as a shell, thus I picked up C<sh.exe>. This assures almost
+100% compatibility with the scripts coming from *nix. As an added benefit
+this works as well under DOS if you use DOS-enabled port of pdksh
+(see L<"Prerequisites">).
+
+B<Disadvantages:> currently F<sh.exe> of pdksh calls external programs
+via fork()/exec(), and there is I<no> functioning exec() on
+OS/2. exec() is emulated by EMX by an asynchronous call while the caller
+waits for child completion (to pretend that the C<pid> did not change). This
+means that 1 I<extra> copy of F<sh.exe> is made active via fork()/exec(),
+which may lead to some resources taken from the system (even if we do
+not count extra work needed for fork()ing).
+
+Note that this a lesser issue now when we do not spawn F<sh.exe>
+unless needed (metachars found).
+
+One can always start F<cmd.exe> explicitly via
+
+ system 'cmd', '/c', 'mycmd', 'arg1', 'arg2', ...
+
+If you need to use F<cmd.exe>, and do not want to hand-edit thousands of your
+scripts, the long-term solution proposed on p5-p is to have a directive
+
+ use OS2::Cmd;
+
+which will override system(), exec(), C<``>, and
+C<open(,'...|')>. With current perl you may override only system(),
+readpipe() - the explicit version of C<``>, and maybe exec(). The code
+will substitute the one-argument call to system() by
+C<CORE::system('cmd.exe', '/c', shift)>.
+
+If you have some working code for C<OS2::Cmd>, please send it to me,
+I will include it into distribution. I have no need for such a module, so
+cannot test it.
+
+For the details of the current situation with calling external programs,
+see L<Starting OS/2 (and DOS) programs under Perl>. Set us mention a couple
+of features:
+
+=over 4
+
+=item *
+
+External scripts may be called by their basename. Perl will try the same
+extensions as when processing B<-S> command-line switch.
+
+=item *
+
+External scripts starting with C<#!> or C<extproc > will be executed directly,
+without calling the shell, by calling the program specified on the rest of
+the first line.
+
+=back
+
+=head2 Memory allocation
+
+Perl uses its own malloc() under OS/2 - interpreters are usually malloc-bound
+for speed, but perl is not, since its malloc is lightning-fast.
+Perl-memory-usage-tuned benchmarks show that Perl's malloc is 5 times quicker
+than EMX one. I do not have convincing data about memory footprint, but
+a (pretty random) benchmark showed that Perl's one is 5% better.
+
+Combination of perl's malloc() and rigid DLL name resolution creates
+a special problem with library functions which expect their return value to
+be free()d by system's free(). To facilitate extensions which need to call
+such functions, system memory-allocation functions are still available with
+the prefix C<emx_> added. (Currently only DLL perl has this, it should
+propagate to F<perl_.exe> shortly.)
+
+=head2 Threads
+
+One can build perl with thread support enabled by providing C<-D usethreads>
+option to F<Configure>. Currently OS/2 support of threads is very
+preliminary.
+
+Most notable problems:
+
+=over 4
+
+=item C<COND_WAIT>
+
+may have a race condition (but probably does not due to edge-triggered
+nature of OS/2 Event semaphores). (Needs a reimplementation (in terms of chaining
+waiting threads, with the linked list stored in per-thread structure?)?)
+
+=item F<os2.c>
+
+has a couple of static variables used in OS/2-specific functions. (Need to be
+moved to per-thread structure, or serialized?)
+
+=back
+
+Note that these problems should not discourage experimenting, since they
+have a low probability of affecting small programs.
+
+=head1 BUGS
+
+This description is not updated often (since 5.6.1?), see F<./os2/Changes>
+(L<perlos2delta>) for more info.
+
+=cut
+
+OS/2 extensions
+~~~~~~~~~~~~~~~
+I include 3 extensions by Andreas Kaiser, OS2::REXX, OS2::UPM, and OS2::FTP,
+into my ftp directory, mirrored on CPAN. I made
+some minor changes needed to compile them by standard tools. I cannot
+test UPM and FTP, so I will appreciate your feedback. Other extensions
+there are OS2::ExtAttr, OS2::PrfDB for tied access to EAs and .INI
+files - and maybe some other extensions at the time you read it.
+
+Note that OS2 perl defines 2 pseudo-extension functions
+OS2::Copy::copy and DynaLoader::mod2fname (many more now, see
+L<Prebuilt methods>).
+
+The -R switch of older perl is deprecated. If you need to call a REXX code
+which needs access to variables, include the call into a REXX compartment
+created by
+ REXX_call {...block...};
+
+Two new functions are supported by REXX code,
+ REXX_eval 'string';
+ REXX_eval_with 'string', REXX_function_name => \&perl_sub_reference;
+
+If you have some other extensions you want to share, send the code to
+me. At least two are available: tied access to EA's, and tied access
+to system databases.
+
+=head1 AUTHOR
+
+Ilya Zakharevich, cpan@ilyaz.org
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlos390.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlos390.pod
new file mode 100755
index 00000000000..cea717db16f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlos390.pod
@@ -0,0 +1,458 @@
+This document is written in pod format hence there are punctuation
+characters in odd places. Do not worry, you've apparently got the
+ASCII->EBCDIC translation worked out correctly. You can read more
+about pod in pod/perlpod.pod or the short summary in the INSTALL file.
+
+=head1 NAME
+
+README.os390 - building and installing Perl for OS/390 and z/OS
+
+=head1 SYNOPSIS
+
+This document will help you Configure, build, test and install Perl
+on OS/390 (aka z/OS) Unix System Services.
+
+=head1 DESCRIPTION
+
+This is a fully ported Perl for OS/390 Version 2 Release 3, 5, 6, 7,
+8, and 9. It may work on other versions or releases, but those are
+the ones we've tested it on.
+
+You may need to carry out some system configuration tasks before
+running the Configure script for Perl.
+
+
+=head2 Tools
+
+The z/OS Unix Tools and Toys list may prove helpful and contains links
+to ports of much of the software helpful for building Perl.
+http://www-1.ibm.com/servers/eserver/zseries/zos/unix/bpxa1toy.html
+
+
+=head2 Unpacking Perl distribution on OS/390
+
+If using ftp remember to transfer the distribution in binary format.
+
+Gunzip/gzip for OS/390 is discussed at:
+
+ http://www-1.ibm.com/servers/eserver/zseries/zos/unix/faq/bpxqp1.html
+
+to extract an ASCII tar archive on OS/390, try this:
+
+ pax -o to=IBM-1047,from=ISO8859-1 -r < latest.tar
+
+or
+
+ zcat latest.tar.Z | pax -o to=IBM-1047,from=ISO8859-1 -r
+
+If you get lots of errors of the form
+
+ tar: FSUM7171 ...: cannot set uid/gid: EDC5139I Operation not permitted.
+
+you didn't read the above and tried to use tar instead of pax, you'll
+first have to remove the (now corrupt) perl directory
+
+ rm -rf perl-...
+
+and then use pax.
+
+=head2 Setup and utilities for Perl on OS/390
+
+Be sure that your yacc installation is in place including any necessary
+parser template files. If you have not already done so then be sure to:
+
+ cp /samples/yyparse.c /etc
+
+This may also be a good time to ensure that your /etc/protocol file
+and either your /etc/resolv.conf or /etc/hosts files are in place.
+The IBM document that described such USS system setup issues was
+SC28-1890-07 "OS/390 UNIX System Services Planning", in particular
+Chapter 6 on customizing the OE shell.
+
+GNU make for OS/390, which is recommended for the build of perl (as
+well as building CPAN modules and extensions), is available from the
+L</Tools>.
+
+Some people have reported encountering "Out of memory!" errors while
+trying to build Perl using GNU make binaries. If you encounter such
+trouble then try to download the source code kit and build GNU make
+from source to eliminate any such trouble. You might also find GNU make
+(as well as Perl and Apache) in the red-piece/book "Open Source Software
+for OS/390 UNIX", SG24-5944-00 from IBM.
+
+If instead of the recommended GNU make you would like to use the system
+supplied make program then be sure to install the default rules file
+properly via the shell command:
+
+ cp /samples/startup.mk /etc
+
+and be sure to also set the environment variable _C89_CCMODE=1 (exporting
+_C89_CCMODE=1 is also a good idea for users of GNU make).
+
+You might also want to have GNU groff for OS/390 installed before
+running the "make install" step for Perl.
+
+There is a syntax error in the /usr/include/sys/socket.h header file
+that IBM supplies with USS V2R7, V2R8, and possibly V2R9. The problem with
+the header file is that near the definition of the SO_REUSEPORT constant
+there is a spurious extra '/' character outside of a comment like so:
+
+ #define SO_REUSEPORT 0x0200 /* allow local address & port
+ reuse */ /
+
+You could edit that header yourself to remove that last '/', or you might
+note that Language Environment (LE) APAR PQ39997 describes the problem
+and PTF's UQ46272 and UQ46271 are the (R8 at least) fixes and apply them.
+If left unattended that syntax error will turn up as an inability for Perl
+to build its "Socket" extension.
+
+For successful testing you may need to turn on the sticky bit for your
+world readable /tmp directory if you have not already done so (see man chmod).
+
+=head2 Configure Perl on OS/390
+
+Once you've unpacked the distribution, run "sh Configure" (see INSTALL
+for a full discussion of the Configure options). There is a "hints" file
+for os390 that specifies the correct values for most things. Some things
+to watch out for include:
+
+=over 4
+
+=item *
+
+A message of the form:
+
+ (I see you are using the Korn shell. Some ksh's blow up on Configure,
+ mainly on older exotic systems. If yours does, try the Bourne shell instead.)
+
+is nothing to worry about at all.
+
+=item *
+
+Some of the parser default template files in /samples are needed in /etc.
+In particular be sure that you at least copy /samples/yyparse.c to /etc
+before running Perl's Configure. This step ensures successful extraction
+of EBCDIC versions of parser files such as perly.c, perly.h, and x2p/a2p.c.
+This has to be done before running Configure the first time. If you failed
+to do so then the easiest way to re-Configure Perl is to delete your
+misconfigured build root and re-extract the source from the tar ball.
+Then you must ensure that /etc/yyparse.c is properly in place before
+attempting to re-run Configure.
+
+=item *
+
+This port will support dynamic loading, but it is not selected by
+default. If you would like to experiment with dynamic loading then
+be sure to specify -Dusedl in the arguments to the Configure script.
+See the comments in hints/os390.sh for more information on dynamic loading.
+If you build with dynamic loading then you will need to add the
+$archlibexp/CORE directory to your LIBPATH environment variable in order
+for perl to work. See the config.sh file for the value of $archlibexp.
+If in trying to use Perl you see an error message similar to:
+
+ CEE3501S The module libperl.dll was not found.
+ From entry point __dllstaticinit at compile unit offset +00000194 at
+
+then your LIBPATH does not have the location of libperl.x and either
+libperl.dll or libperl.so in it. Add that directory to your LIBPATH and
+proceed.
+
+=item *
+
+Do not turn on the compiler optimization flag "-O". There is
+a bug in either the optimizer or perl that causes perl to
+not work correctly when the optimizer is on.
+
+=item *
+
+Some of the configuration files in /etc used by the
+networking APIs are either missing or have the wrong
+names. In particular, make sure that there's either
+an /etc/resolv.conf or an /etc/hosts, so that
+gethostbyname() works, and make sure that the file
+/etc/proto has been renamed to /etc/protocol (NOT
+/etc/protocols, as used by other Unix systems).
+You may have to look for things like HOSTNAME and DOMAINORIGIN
+in the "//'SYS1.TCPPARMS(TCPDATA)'" PDS member in order to
+properly set up your /etc networking files.
+
+=back
+
+=head2 Build, Test, Install Perl on OS/390
+
+Simply put:
+
+ sh Configure
+ make
+ make test
+
+if everything looks ok (see the next section for test/IVP diagnosis) then:
+
+ make install
+
+this last step may or may not require UID=0 privileges depending
+on how you answered the questions that Configure asked and whether
+or not you have write access to the directories you specified.
+
+=head2 Build Anomalies with Perl on OS/390
+
+"Out of memory!" messages during the build of Perl are most often fixed
+by re building the GNU make utility for OS/390 from a source code kit.
+
+Another memory limiting item to check is your MAXASSIZE parameter in your
+'SYS1.PARMLIB(BPXPRMxx)' data set (note too that as of V2R8 address space
+limits can be set on a per user ID basis in the USS segment of a RACF
+profile). People have reported successful builds of Perl with MAXASSIZE
+parameters as small as 503316480 (and it may be possible to build Perl
+with a MAXASSIZE smaller than that).
+
+Within USS your /etc/profile or $HOME/.profile may limit your ulimit
+settings. Check that the following command returns reasonable values:
+
+ ulimit -a
+
+To conserve memory you should have your compiler modules loaded into the
+Link Pack Area (LPA/ELPA) rather than in a link list or step lib.
+
+If the c89 compiler complains of syntax errors during the build of the
+Socket extension then be sure to fix the syntax error in the system
+header /usr/include/sys/socket.h.
+
+=head2 Testing Anomalies with Perl on OS/390
+
+The "make test" step runs a Perl Verification Procedure, usually before
+installation. You might encounter STDERR messages even during a successful
+run of "make test". Here is a guide to some of the more commonly seen
+anomalies:
+
+=over 4
+
+=item *
+
+A message of the form:
+
+ comp/cpp.............ERROR CBC3191 ./.301989890.c:1 The character $ is not a
+ valid C source character.
+ FSUM3065 The COMPILE step ended with return code 12.
+ FSUM3017 Could not compile .301989890.c. Correct the errors and try again.
+ ok
+
+indicates that the t/comp/cpp.t test of Perl's -P command line switch has
+passed but that the particular invocation of c89 -E in the cpp script does
+not suppress the C compiler check of source code validity.
+
+=item *
+
+A message of the form:
+
+ io/openpid...........CEE5210S The signal SIGHUP was received.
+ CEE5210S The signal SIGHUP was received.
+ CEE5210S The signal SIGHUP was received.
+ ok
+
+indicates that the t/io/openpid.t test of Perl has passed but done so
+with extraneous messages on stderr from CEE.
+
+=item *
+
+A message of the form:
+
+ lib/ftmp-security....File::Temp::_gettemp: Parent directory (/tmp/) is not safe
+ (sticky bit not set when world writable?) at lib/ftmp-security.t line 100
+ File::Temp::_gettemp: Parent directory (/tmp/) is not safe (sticky bit not
+ set when world writable?) at lib/ftmp-security.t line 100
+ ok
+
+indicates a problem with the permissions on your /tmp directory within the HFS.
+To correct that problem issue the command:
+
+ chmod a+t /tmp
+
+from an account with write access to the directory entry for /tmp.
+
+=item *
+
+Out of Memory!
+
+Recent perl test suite is quite memory hunrgy. In addition to the comments
+above on memory limitations it is also worth checking for _CEE_RUNOPTS
+in your environment. Perl now has (in miniperlmain.c) a C #pragma
+to set CEE run options, but the environment variable wins.
+
+The C code asks for:
+
+ #pragma runopts(HEAP(2M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON))
+
+The important parts of that are the second argument (the increment) to HEAP,
+and allowing the stack to be "Above the (16M) line". If the heap
+increment is too small then when perl (for example loading unicode/Name.pl) tries
+to create a "big" (400K+) string it cannot fit in a single segment
+and you get "Out of Memory!" - even if there is still plenty of memory
+available.
+
+A related issue is use with perl's malloc. Perl's malloc uses C<sbrk()>
+to get memory, and C<sbrk()> is limited to the first allocation so in this
+case something like:
+
+ HEAP(8M,500K,ANYWHERE,KEEP,8K,4K)
+
+is needed to get through the test suite.
+
+
+=back
+
+=head2 Installation Anomalies with Perl on OS/390
+
+The installman script will try to run on OS/390. There will be fewer errors
+if you have a roff utility installed. You can obtain GNU groff from the
+Redbook SG24-5944-00 ftp site.
+
+=head2 Usage Hints for Perl on OS/390
+
+When using perl on OS/390 please keep in mind that the EBCDIC and ASCII
+character sets are different. See perlebcdic.pod for more on such character
+set issues. Perl builtin functions that may behave differently under
+EBCDIC are also mentioned in the perlport.pod document.
+
+Open Edition (UNIX System Services) from V2R8 onward does support
+#!/path/to/perl script invocation. There is a PTF available from
+IBM for V2R7 that will allow shell/kernel support for #!. USS
+releases prior to V2R7 did not support the #! means of script invocation.
+If you are running V2R6 or earlier then see:
+
+ head `whence perldoc`
+
+for an example of how to use the "eval exec" trick to ask the shell to
+have Perl run your scripts on those older releases of Unix System Services.
+
+If you are having trouble with square brackets then consider switching your
+rlogin or telnet client. Try to avoid older 3270 emulators and ISHELL for
+working with Perl on USS.
+
+=head2 Floating Point Anomalies with Perl on OS/390
+
+There appears to be a bug in the floating point implementation on S/390
+systems such that calling int() on the product of a number and a small
+magnitude number is not the same as calling int() on the quotient of
+that number and a large magnitude number. For example, in the following
+Perl code:
+
+ my $x = 100000.0;
+ my $y = int($x * 1e-5) * 1e5; # '0'
+ my $z = int($x / 1e+5) * 1e5; # '100000'
+ print "\$y is $y and \$z is $z\n"; # $y is 0 and $z is 100000
+
+Although one would expect the quantities $y and $z to be the same and equal
+to 100000 they will differ and instead will be 0 and 100000 respectively.
+
+The problem can be further examined in a roughly equivalent C program:
+
+ #include <stdio.h>
+ #include <math.h>
+ main()
+ {
+ double r1,r2;
+ double x = 100000.0;
+ double y = 0.0;
+ double z = 0.0;
+ x = 100000.0 * 1e-5;
+ r1 = modf (x,&y);
+ x = 100000.0 / 1e+5;
+ r2 = modf (x,&z);
+ printf("y is %e and z is %e\n",y*1e5,z*1e5);
+ /* y is 0.000000e+00 and z is 1.000000e+05 (with c89) */
+ }
+
+=head2 Modules and Extensions for Perl on OS/390
+
+Pure pure (that is non xs) modules may be installed via the usual:
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+If you built perl with dynamic loading capability then that would also
+be the way to build xs based extensions. However, if you built perl with
+the default static linking you can still build xs based extensions for OS/390
+but you will need to follow the instructions in ExtUtils::MakeMaker for
+building statically linked perl binaries. In the simplest configurations
+building a static perl + xs extension boils down to:
+
+ perl Makefile.PL
+ make
+ make perl
+ make test
+ make install
+ make -f Makefile.aperl inst_perl MAP_TARGET=perl
+
+In most cases people have reported better results with GNU make rather
+than the system's /bin/make program, whether for plain modules or for
+xs based extensions.
+
+If the make process encounters trouble with either compilation or
+linking then try setting the _C89_CCMODE to 1. Assuming sh is your
+login shell then run:
+
+ export _C89_CCMODE=1
+
+If tcsh is your login shell then use the setenv command.
+
+=head1 AUTHORS
+
+David Fiander and Peter Prymmer with thanks to Dennis Longnecker
+and William Raffloer for valuable reports, LPAR and PTF feedback.
+Thanks to Mike MacIsaac and Egon Terwedow for SG24-5944-00.
+Thanks to Ignasi Roca for pointing out the floating point problems.
+Thanks to John Goodyear for dynamic loading help.
+
+=head1 SEE ALSO
+
+L<INSTALL>, L<perlport>, L<perlebcdic>, L<ExtUtils::MakeMaker>.
+
+ http://www-1.ibm.com/servers/eserver/zseries/zos/unix/bpxa1toy.html
+
+ http://www.redbooks.ibm.com/abstracts/sg245944.html
+
+ http://www-1.ibm.com/servers/eserver/zseries/zos/unix/bpxa1ty1.html#opensrc
+
+ http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
+
+ http://publibz.boulder.ibm.com:80/cgi-bin/bookmgr_OS390/BOOKS/ceea3030/
+
+ http://publibz.boulder.ibm.com:80/cgi-bin/bookmgr_OS390/BOOKS/CBCUG030/
+
+=head2 Mailing list for Perl on OS/390
+
+If you are interested in the VM/ESA, z/OS (formerly known as OS/390)
+and POSIX-BC (BS2000) ports of Perl then see the perl-mvs mailing list.
+To subscribe, send an empty message to perl-mvs-subscribe@perl.org.
+
+See also:
+
+ http://lists.perl.org/showlist.cgi?name=perl-mvs
+
+There are web archives of the mailing list at:
+
+ http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
+ http://archive.develooper.com/perl-mvs@perl.org/
+
+=head1 HISTORY
+
+This document was originally written by David Fiander for the 5.005
+release of Perl.
+
+This document was podified for the 5.005_03 release of Perl 11 March 1999.
+
+Updated 28 November 2001 for broken URLs.
+
+Updated 12 November 2000 for the 5.7.1 release of Perl.
+
+Updated 15 January 2001 for the 5.7.1 release of Perl.
+
+Updated 24 January 2001 to mention dynamic loading.
+
+Updated 12 March 2001 to mention //'SYS1.TCPPARMS(TCPDATA)'.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlos400.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlos400.pod
new file mode 100755
index 00000000000..cd789166955
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlos400.pod
@@ -0,0 +1,120 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.os400 - Perl version 5 on OS/400
+
+=head1 DESCRIPTION
+
+This document describes various features of IBM's OS/400 operating
+system that will affect how Perl version 5 (hereafter just Perl) is
+compiled and/or runs.
+
+By far the easiest way to build Perl for OS/400 is to use the PASE
+(Portable Application Solutions Environment), for more information see
+http://www.iseries.ibm.com/developer/factory/pase/index.html
+This environment allows one to use AIX APIs while programming, and it
+provides a runtime that allows AIX binaries to execute directly on the
+PowerPC iSeries.
+
+=head2 Compiling Perl for OS/400 PASE
+
+The recommended way to build Perl for the OS/400 PASE is to build the
+Perl 5 source code (release 5.8.1 or later) under AIX.
+
+The trick is to give a special parameter to the Configure shell script
+when running it on AIX:
+
+ sh Configure -DPASE ...
+
+The default installation directory of Perl under PASE is /QOpenSys/perl.
+This can be modified if needed with Configure parameter -Dprefix=/some/dir.
+
+Starting from OS/400 V5R2 the IBM Visual Age compiler is supported
+on OS/400 PASE, so it is possible to build Perl natively on OS/400.
+The easier way, however, is to compile in AIX, as just described.
+
+If you don't want to install the compiled Perl in AIX into /QOpenSys
+(for packaging it before copying it to PASE), you can use a Configure
+parameter: -Dinstallprefix=/tmp/QOpenSys/perl. This will cause the
+"make install" to install everything into that directory, while the
+installed files still think they are (will be) in /QOpenSys/perl.
+
+If building natively on PASE, please do the build under the /QOpenSys
+directory, since Perl is happier when built on a case sensitive filesystem.
+
+=head2 Installing Perl in OS/400 PASE
+
+If you are compiling on AIX, simply do a "make install" on the AIX box.
+Once the install finishes, tar up the /QOpenSys/perl directory. Transfer
+the tarball to the OS/400 using FTP with the following commands:
+
+ > binary
+ > site namefmt 1
+ > put perl.tar /QOpenSys
+
+Once you have it on, simply bring up a PASE shell and extract the tarball.
+
+If you are compiling in PASE, then "make install" is the only thing you
+will need to do.
+
+The default path for perl binary is /QOpenSys/perl/bin/perl. You'll
+want to symlink /QOpenSys/usr/bin/perl to this file so you don't have
+to modify your path.
+
+=head2 Using Perl in OS/400 PASE
+
+Perl in PASE may be used in the same manner as you would use Perl on AIX.
+
+Scripts starting with #!/usr/bin/perl should work if you have
+/QOpenSys/usr/bin/perl symlinked to your perl binary. This will not
+work if you've done a setuid/setgid or have environment variable
+PASE_EXEC_QOPENSYS="N". If you have V5R1, you'll need to get the
+latest PTFs to have this feature. Scripts starting with
+#!/QOpenSys/perl/bin/perl should always work.
+
+=head2 Known Problems
+
+When compiling in PASE, there is no "oslevel" command. Therefore,
+you may want to create a script called "oslevel" that echoes the
+level of AIX that your version of PASE runtime supports. If you're
+unsure, consult your documentation or use "4.3.3.0".
+
+If you have test cases that fail, check for the existence of spool files.
+The test case may be trying to use a syscall that is not implemented
+in PASE. To avoid the SIGILL, try setting the PASE_SYSCALL_NOSIGILL
+environment variable or have a handler for the SIGILL. If you can
+compile programs for PASE, run the config script and edit config.sh
+when it gives you the option. If you want to remove fchdir(), which
+isn't implement in V5R1, simply change the line that says:
+
+d_fchdir='define'
+
+to
+
+d_fchdir='undef'
+
+and then compile Perl. The places where fchdir() is used have
+alternatives for systems that do not have fchdir() available.
+
+=head2 Perl on ILE
+
+There exists a port of Perl to the ILE environment. This port, however,
+is based quite an old release of Perl, Perl 5.00502 (August 1998).
+(As of July 2002 the latest release of Perl is 5.8.0, and even 5.6.1
+has been out since April 2001.) If you need to run Perl on ILE, though,
+you may need this older port: http://www.cpan.org/ports/#os400
+Note that any Perl release later than 5.00502 has not been ported to ILE.
+
+If you need to use Perl in the ILE environment, you may want to consider
+using Qp2RunPase() to call the PASE version of Perl.
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi <jhi@iki.fi>
+Bryan Logan <bryanlog@us.ibm.com>
+David Larson <larson1@us.ibm.com>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlothrtut.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlothrtut.pod
new file mode 100755
index 00000000000..e0d69c50599
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlothrtut.pod
@@ -0,0 +1,1067 @@
+=head1 NAME
+
+perlothrtut - old tutorial on threads in Perl
+
+=head1 DESCRIPTION
+
+B<WARNING>:
+This tutorial describes the old-style thread model that was introduced in
+release 5.005. This model is deprecated, and has been removed
+for version 5.10. The interfaces described here were considered
+experimental, and are likely to be buggy.
+
+For information about the new interpreter threads ("ithreads") model, see
+the F<perlthrtut> tutorial, and the L<threads> and L<threads::shared>
+modules.
+
+You are strongly encouraged to migrate any existing threads code to the
+new model as soon as possible.
+
+=head1 What Is A Thread Anyway?
+
+A thread is a flow of control through a program with a single
+execution point.
+
+Sounds an awful lot like a process, doesn't it? Well, it should.
+Threads are one of the pieces of a process. Every process has at least
+one thread and, up until now, every process running Perl had only one
+thread. With 5.005, though, you can create extra threads. We're going
+to show you how, when, and why.
+
+=head1 Threaded Program Models
+
+There are three basic ways that you can structure a threaded
+program. Which model you choose depends on what you need your program
+to do. For many non-trivial threaded programs you'll need to choose
+different models for different pieces of your program.
+
+=head2 Boss/Worker
+
+The boss/worker model usually has one `boss' thread and one or more
+`worker' threads. The boss thread gathers or generates tasks that need
+to be done, then parcels those tasks out to the appropriate worker
+thread.
+
+This model is common in GUI and server programs, where a main thread
+waits for some event and then passes that event to the appropriate
+worker threads for processing. Once the event has been passed on, the
+boss thread goes back to waiting for another event.
+
+The boss thread does relatively little work. While tasks aren't
+necessarily performed faster than with any other method, it tends to
+have the best user-response times.
+
+=head2 Work Crew
+
+In the work crew model, several threads are created that do
+essentially the same thing to different pieces of data. It closely
+mirrors classical parallel processing and vector processors, where a
+large array of processors do the exact same thing to many pieces of
+data.
+
+This model is particularly useful if the system running the program
+will distribute multiple threads across different processors. It can
+also be useful in ray tracing or rendering engines, where the
+individual threads can pass on interim results to give the user visual
+feedback.
+
+=head2 Pipeline
+
+The pipeline model divides up a task into a series of steps, and
+passes the results of one step on to the thread processing the
+next. Each thread does one thing to each piece of data and passes the
+results to the next thread in line.
+
+This model makes the most sense if you have multiple processors so two
+or more threads will be executing in parallel, though it can often
+make sense in other contexts as well. It tends to keep the individual
+tasks small and simple, as well as allowing some parts of the pipeline
+to block (on I/O or system calls, for example) while other parts keep
+going. If you're running different parts of the pipeline on different
+processors you may also take advantage of the caches on each
+processor.
+
+This model is also handy for a form of recursive programming where,
+rather than having a subroutine call itself, it instead creates
+another thread. Prime and Fibonacci generators both map well to this
+form of the pipeline model. (A version of a prime number generator is
+presented later on.)
+
+=head1 Native threads
+
+There are several different ways to implement threads on a system. How
+threads are implemented depends both on the vendor and, in some cases,
+the version of the operating system. Often the first implementation
+will be relatively simple, but later versions of the OS will be more
+sophisticated.
+
+While the information in this section is useful, it's not necessary,
+so you can skip it if you don't feel up to it.
+
+There are three basic categories of threads-user-mode threads, kernel
+threads, and multiprocessor kernel threads.
+
+User-mode threads are threads that live entirely within a program and
+its libraries. In this model, the OS knows nothing about threads. As
+far as it's concerned, your process is just a process.
+
+This is the easiest way to implement threads, and the way most OSes
+start. The big disadvantage is that, since the OS knows nothing about
+threads, if one thread blocks they all do. Typical blocking activities
+include most system calls, most I/O, and things like sleep().
+
+Kernel threads are the next step in thread evolution. The OS knows
+about kernel threads, and makes allowances for them. The main
+difference between a kernel thread and a user-mode thread is
+blocking. With kernel threads, things that block a single thread don't
+block other threads. This is not the case with user-mode threads,
+where the kernel blocks at the process level and not the thread level.
+
+This is a big step forward, and can give a threaded program quite a
+performance boost over non-threaded programs. Threads that block
+performing I/O, for example, won't block threads that are doing other
+things. Each process still has only one thread running at once,
+though, regardless of how many CPUs a system might have.
+
+Since kernel threading can interrupt a thread at any time, they will
+uncover some of the implicit locking assumptions you may make in your
+program. For example, something as simple as C<$a = $a + 2> can behave
+unpredictably with kernel threads if $a is visible to other
+threads, as another thread may have changed $a between the time it
+was fetched on the right hand side and the time the new value is
+stored.
+
+Multiprocessor Kernel Threads are the final step in thread
+support. With multiprocessor kernel threads on a machine with multiple
+CPUs, the OS may schedule two or more threads to run simultaneously on
+different CPUs.
+
+This can give a serious performance boost to your threaded program,
+since more than one thread will be executing at the same time. As a
+tradeoff, though, any of those nagging synchronization issues that
+might not have shown with basic kernel threads will appear with a
+vengeance.
+
+In addition to the different levels of OS involvement in threads,
+different OSes (and different thread implementations for a particular
+OS) allocate CPU cycles to threads in different ways.
+
+Cooperative multitasking systems have running threads give up control
+if one of two things happen. If a thread calls a yield function, it
+gives up control. It also gives up control if the thread does
+something that would cause it to block, such as perform I/O. In a
+cooperative multitasking implementation, one thread can starve all the
+others for CPU time if it so chooses.
+
+Preemptive multitasking systems interrupt threads at regular intervals
+while the system decides which thread should run next. In a preemptive
+multitasking system, one thread usually won't monopolize the CPU.
+
+On some systems, there can be cooperative and preemptive threads
+running simultaneously. (Threads running with realtime priorities
+often behave cooperatively, for example, while threads running at
+normal priorities behave preemptively.)
+
+=head1 What kind of threads are perl threads?
+
+If you have experience with other thread implementations, you might
+find that things aren't quite what you expect. It's very important to
+remember when dealing with Perl threads that Perl Threads Are Not X
+Threads, for all values of X. They aren't POSIX threads, or
+DecThreads, or Java's Green threads, or Win32 threads. There are
+similarities, and the broad concepts are the same, but if you start
+looking for implementation details you're going to be either
+disappointed or confused. Possibly both.
+
+This is not to say that Perl threads are completely different from
+everything that's ever come before--they're not. Perl's threading
+model owes a lot to other thread models, especially POSIX. Just as
+Perl is not C, though, Perl threads are not POSIX threads. So if you
+find yourself looking for mutexes, or thread priorities, it's time to
+step back a bit and think about what you want to do and how Perl can
+do it.
+
+=head1 Threadsafe Modules
+
+The addition of threads has changed Perl's internals
+substantially. There are implications for people who write
+modules--especially modules with XS code or external libraries. While
+most modules won't encounter any problems, modules that aren't
+explicitly tagged as thread-safe should be tested before being used in
+production code.
+
+Not all modules that you might use are thread-safe, and you should
+always assume a module is unsafe unless the documentation says
+otherwise. This includes modules that are distributed as part of the
+core. Threads are a beta feature, and even some of the standard
+modules aren't thread-safe.
+
+If you're using a module that's not thread-safe for some reason, you
+can protect yourself by using semaphores and lots of programming
+discipline to control access to the module. Semaphores are covered
+later in the article. Perl Threads Are Different
+
+=head1 Thread Basics
+
+The core Thread module provides the basic functions you need to write
+threaded programs. In the following sections we'll cover the basics,
+showing you what you need to do to create a threaded program. After
+that, we'll go over some of the features of the Thread module that
+make threaded programming easier.
+
+=head2 Basic Thread Support
+
+Thread support is a Perl compile-time option-it's something that's
+turned on or off when Perl is built at your site, rather than when
+your programs are compiled. If your Perl wasn't compiled with thread
+support enabled, then any attempt to use threads will fail.
+
+Remember that the threading support in 5.005 is in beta release, and
+should be treated as such. You should expect that it may not function
+entirely properly, and the thread interface may well change some
+before it is a fully supported, production release. The beta version
+shouldn't be used for mission-critical projects. Having said that,
+threaded Perl is pretty nifty, and worth a look.
+
+Your programs can use the Config module to check whether threads are
+enabled. If your program can't run without them, you can say something
+like:
+
+ $Config{usethreads} or die "Recompile Perl with threads to run this program.";
+
+A possibly-threaded program using a possibly-threaded module might
+have code like this:
+
+ use Config;
+ use MyMod;
+
+ if ($Config{usethreads}) {
+ # We have threads
+ require MyMod_threaded;
+ import MyMod_threaded;
+ } else {
+ require MyMod_unthreaded;
+ import MyMod_unthreaded;
+ }
+
+Since code that runs both with and without threads is usually pretty
+messy, it's best to isolate the thread-specific code in its own
+module. In our example above, that's what MyMod_threaded is, and it's
+only imported if we're running on a threaded Perl.
+
+=head2 Creating Threads
+
+The Thread package provides the tools you need to create new
+threads. Like any other module, you need to tell Perl you want to use
+it; use Thread imports all the pieces you need to create basic
+threads.
+
+The simplest, straightforward way to create a thread is with new():
+
+ use Thread;
+
+ $thr = Thread->new( \&sub1 );
+
+ sub sub1 {
+ print "In the thread\n";
+ }
+
+The new() method takes a reference to a subroutine and creates a new
+thread, which starts executing in the referenced subroutine. Control
+then passes both to the subroutine and the caller.
+
+If you need to, your program can pass parameters to the subroutine as
+part of the thread startup. Just include the list of parameters as
+part of the C<Thread::new> call, like this:
+
+ use Thread;
+ $Param3 = "foo";
+ $thr = Thread->new( \&sub1, "Param 1", "Param 2", $Param3 );
+ $thr = Thread->new( \&sub1, @ParamList );
+ $thr = Thread->new( \&sub1, qw(Param1 Param2 $Param3) );
+
+ sub sub1 {
+ my @InboundParameters = @_;
+ print "In the thread\n";
+ print "got parameters >", join("<>", @InboundParameters), "<\n";
+ }
+
+
+The subroutine runs like a normal Perl subroutine, and the call to new
+Thread returns whatever the subroutine returns.
+
+The last example illustrates another feature of threads. You can spawn
+off several threads using the same subroutine. Each thread executes
+the same subroutine, but in a separate thread with a separate
+environment and potentially separate arguments.
+
+The other way to spawn a new thread is with async(), which is a way to
+spin off a chunk of code like eval(), but into its own thread:
+
+ use Thread qw(async);
+
+ $LineCount = 0;
+
+ $thr = async {
+ while(<>) {$LineCount++}
+ print "Got $LineCount lines\n";
+ };
+
+ print "Waiting for the linecount to end\n";
+ $thr->join;
+ print "All done\n";
+
+You'll notice we did a use Thread qw(async) in that example. async is
+not exported by default, so if you want it, you'll either need to
+import it before you use it or fully qualify it as
+Thread::async. You'll also note that there's a semicolon after the
+closing brace. That's because async() treats the following block as an
+anonymous subroutine, so the semicolon is necessary.
+
+Like eval(), the code executes in the same context as it would if it
+weren't spun off. Since both the code inside and after the async start
+executing, you need to be careful with any shared resources. Locking
+and other synchronization techniques are covered later.
+
+=head2 Giving up control
+
+There are times when you may find it useful to have a thread
+explicitly give up the CPU to another thread. Your threading package
+might not support preemptive multitasking for threads, for example, or
+you may be doing something compute-intensive and want to make sure
+that the user-interface thread gets called frequently. Regardless,
+there are times that you might want a thread to give up the processor.
+
+Perl's threading package provides the yield() function that does
+this. yield() is pretty straightforward, and works like this:
+
+ use Thread qw(yield async);
+ async {
+ my $foo = 50;
+ while ($foo--) { print "first async\n" }
+ yield;
+ $foo = 50;
+ while ($foo--) { print "first async\n" }
+ };
+ async {
+ my $foo = 50;
+ while ($foo--) { print "second async\n" }
+ yield;
+ $foo = 50;
+ while ($foo--) { print "second async\n" }
+ };
+
+=head2 Waiting For A Thread To Exit
+
+Since threads are also subroutines, they can return values. To wait
+for a thread to exit and extract any scalars it might return, you can
+use the join() method.
+
+ use Thread;
+ $thr = Thread->new( \&sub1 );
+
+ @ReturnData = $thr->join;
+ print "Thread returned @ReturnData";
+
+ sub sub1 { return "Fifty-six", "foo", 2; }
+
+In the example above, the join() method returns as soon as the thread
+ends. In addition to waiting for a thread to finish and gathering up
+any values that the thread might have returned, join() also performs
+any OS cleanup necessary for the thread. That cleanup might be
+important, especially for long-running programs that spawn lots of
+threads. If you don't want the return values and don't want to wait
+for the thread to finish, you should call the detach() method
+instead. detach() is covered later in the article.
+
+=head2 Errors In Threads
+
+So what happens when an error occurs in a thread? Any errors that
+could be caught with eval() are postponed until the thread is
+joined. If your program never joins, the errors appear when your
+program exits.
+
+Errors deferred until a join() can be caught with eval():
+
+ use Thread qw(async);
+ $thr = async {$b = 3/0}; # Divide by zero error
+ $foo = eval {$thr->join};
+ if ($@) {
+ print "died with error $@\n";
+ } else {
+ print "Hey, why aren't you dead?\n";
+ }
+
+eval() passes any results from the joined thread back unmodified, so
+if you want the return value of the thread, this is your only chance
+to get them.
+
+=head2 Ignoring A Thread
+
+join() does three things: it waits for a thread to exit, cleans up
+after it, and returns any data the thread may have produced. But what
+if you're not interested in the thread's return values, and you don't
+really care when the thread finishes? All you want is for the thread
+to get cleaned up after when it's done.
+
+In this case, you use the detach() method. Once a thread is detached,
+it'll run until it's finished, then Perl will clean up after it
+automatically.
+
+ use Thread;
+ $thr = Thread->new( \&sub1 ); # Spawn the thread
+
+ $thr->detach; # Now we officially don't care any more
+
+ sub sub1 {
+ $a = 0;
+ while (1) {
+ $a++;
+ print "\$a is $a\n";
+ sleep 1;
+ }
+ }
+
+
+Once a thread is detached, it may not be joined, and any output that
+it might have produced (if it was done and waiting for a join) is
+lost.
+
+=head1 Threads And Data
+
+Now that we've covered the basics of threads, it's time for our next
+topic: data. Threading introduces a couple of complications to data
+access that non-threaded programs never need to worry about.
+
+=head2 Shared And Unshared Data
+
+The single most important thing to remember when using threads is that
+all threads potentially have access to all the data anywhere in your
+program. While this is true with a nonthreaded Perl program as well,
+it's especially important to remember with a threaded program, since
+more than one thread can be accessing this data at once.
+
+Perl's scoping rules don't change because you're using threads. If a
+subroutine (or block, in the case of async()) could see a variable if
+you weren't running with threads, it can see it if you are. This is
+especially important for the subroutines that create, and makes C<my>
+variables even more important. Remember--if your variables aren't
+lexically scoped (declared with C<my>) you're probably sharing them
+between threads.
+
+=head2 Thread Pitfall: Races
+
+While threads bring a new set of useful tools, they also bring a
+number of pitfalls. One pitfall is the race condition:
+
+ use Thread;
+ $a = 1;
+ $thr1 = Thread->new(\&sub1);
+ $thr2 = Thread->new(\&sub2);
+
+ sleep 10;
+ print "$a\n";
+
+ sub sub1 { $foo = $a; $a = $foo + 1; }
+ sub sub2 { $bar = $a; $a = $bar + 1; }
+
+What do you think $a will be? The answer, unfortunately, is "it
+depends." Both sub1() and sub2() access the global variable $a, once
+to read and once to write. Depending on factors ranging from your
+thread implementation's scheduling algorithm to the phase of the moon,
+$a can be 2 or 3.
+
+Race conditions are caused by unsynchronized access to shared
+data. Without explicit synchronization, there's no way to be sure that
+nothing has happened to the shared data between the time you access it
+and the time you update it. Even this simple code fragment has the
+possibility of error:
+
+ use Thread qw(async);
+ $a = 2;
+ async{ $b = $a; $a = $b + 1; };
+ async{ $c = $a; $a = $c + 1; };
+
+Two threads both access $a. Each thread can potentially be interrupted
+at any point, or be executed in any order. At the end, $a could be 3
+or 4, and both $b and $c could be 2 or 3.
+
+Whenever your program accesses data or resources that can be accessed
+by other threads, you must take steps to coordinate access or risk
+data corruption and race conditions.
+
+=head2 Controlling access: lock()
+
+The lock() function takes a variable (or subroutine, but we'll get to
+that later) and puts a lock on it. No other thread may lock the
+variable until the locking thread exits the innermost block containing
+the lock. Using lock() is straightforward:
+
+ use Thread qw(async);
+ $a = 4;
+ $thr1 = async {
+ $foo = 12;
+ {
+ lock ($a); # Block until we get access to $a
+ $b = $a;
+ $a = $b * $foo;
+ }
+ print "\$foo was $foo\n";
+ };
+ $thr2 = async {
+ $bar = 7;
+ {
+ lock ($a); # Block until we can get access to $a
+ $c = $a;
+ $a = $c * $bar;
+ }
+ print "\$bar was $bar\n";
+ };
+ $thr1->join;
+ $thr2->join;
+ print "\$a is $a\n";
+
+lock() blocks the thread until the variable being locked is
+available. When lock() returns, your thread can be sure that no other
+thread can lock that variable until the innermost block containing the
+lock exits.
+
+It's important to note that locks don't prevent access to the variable
+in question, only lock attempts. This is in keeping with Perl's
+longstanding tradition of courteous programming, and the advisory file
+locking that flock() gives you. Locked subroutines behave differently,
+however. We'll cover that later in the article.
+
+You may lock arrays and hashes as well as scalars. Locking an array,
+though, will not block subsequent locks on array elements, just lock
+attempts on the array itself.
+
+Finally, locks are recursive, which means it's okay for a thread to
+lock a variable more than once. The lock will last until the outermost
+lock() on the variable goes out of scope.
+
+=head2 Thread Pitfall: Deadlocks
+
+Locks are a handy tool to synchronize access to data. Using them
+properly is the key to safe shared data. Unfortunately, locks aren't
+without their dangers. Consider the following code:
+
+ use Thread qw(async yield);
+ $a = 4;
+ $b = "foo";
+ async {
+ lock($a);
+ yield;
+ sleep 20;
+ lock ($b);
+ };
+ async {
+ lock($b);
+ yield;
+ sleep 20;
+ lock ($a);
+ };
+
+This program will probably hang until you kill it. The only way it
+won't hang is if one of the two async() routines acquires both locks
+first. A guaranteed-to-hang version is more complicated, but the
+principle is the same.
+
+The first thread spawned by async() will grab a lock on $a then, a
+second or two later, try to grab a lock on $b. Meanwhile, the second
+thread grabs a lock on $b, then later tries to grab a lock on $a. The
+second lock attempt for both threads will block, each waiting for the
+other to release its lock.
+
+This condition is called a deadlock, and it occurs whenever two or
+more threads are trying to get locks on resources that the others
+own. Each thread will block, waiting for the other to release a lock
+on a resource. That never happens, though, since the thread with the
+resource is itself waiting for a lock to be released.
+
+There are a number of ways to handle this sort of problem. The best
+way is to always have all threads acquire locks in the exact same
+order. If, for example, you lock variables $a, $b, and $c, always lock
+$a before $b, and $b before $c. It's also best to hold on to locks for
+as short a period of time to minimize the risks of deadlock.
+
+=head2 Queues: Passing Data Around
+
+A queue is a special thread-safe object that lets you put data in one
+end and take it out the other without having to worry about
+synchronization issues. They're pretty straightforward, and look like
+this:
+
+ use Thread qw(async);
+ use Thread::Queue;
+
+ my $DataQueue = Thread::Queue->new();
+ $thr = async {
+ while ($DataElement = $DataQueue->dequeue) {
+ print "Popped $DataElement off the queue\n";
+ }
+ };
+
+ $DataQueue->enqueue(12);
+ $DataQueue->enqueue("A", "B", "C");
+ sleep 10;
+ $DataQueue->enqueue(undef);
+
+You create the queue with C<< Thread::Queue->new >>. Then you can add
+lists of scalars onto the end with enqueue(), and pop scalars off the
+front of it with dequeue(). A queue has no fixed size, and can grow as
+needed to hold everything pushed on to it.
+
+If a queue is empty, dequeue() blocks until another thread enqueues
+something. This makes queues ideal for event loops and other
+communications between threads.
+
+=head1 Threads And Code
+
+In addition to providing thread-safe access to data via locks and
+queues, threaded Perl also provides general-purpose semaphores for
+coarser synchronization than locks provide and thread-safe access to
+entire subroutines.
+
+=head2 Semaphores: Synchronizing Data Access
+
+Semaphores are a kind of generic locking mechanism. Unlike lock, which
+gets a lock on a particular scalar, Perl doesn't associate any
+particular thing with a semaphore so you can use them to control
+access to anything you like. In addition, semaphores can allow more
+than one thread to access a resource at once, though by default
+semaphores only allow one thread access at a time.
+
+=over 4
+
+=item Basic semaphores
+
+Semaphores have two methods, down and up. down decrements the resource
+count, while up increments it. down calls will block if the
+semaphore's current count would decrement below zero. This program
+gives a quick demonstration:
+
+ use Thread qw(yield);
+ use Thread::Semaphore;
+ my $semaphore = Thread::Semaphore->new();
+ $GlobalVariable = 0;
+
+ $thr1 = Thread->new( \&sample_sub, 1 );
+ $thr2 = Thread->new( \&sample_sub, 2 );
+ $thr3 = Thread->new( \&sample_sub, 3 );
+
+ sub sample_sub {
+ my $SubNumber = shift @_;
+ my $TryCount = 10;
+ my $LocalCopy;
+ sleep 1;
+ while ($TryCount--) {
+ $semaphore->down;
+ $LocalCopy = $GlobalVariable;
+ print "$TryCount tries left for sub $SubNumber (\$GlobalVariable is $GlobalVariable)\n";
+ yield;
+ sleep 2;
+ $LocalCopy++;
+ $GlobalVariable = $LocalCopy;
+ $semaphore->up;
+ }
+ }
+
+The three invocations of the subroutine all operate in sync. The
+semaphore, though, makes sure that only one thread is accessing the
+global variable at once.
+
+=item Advanced Semaphores
+
+By default, semaphores behave like locks, letting only one thread
+down() them at a time. However, there are other uses for semaphores.
+
+Each semaphore has a counter attached to it. down() decrements the
+counter and up() increments the counter. By default, semaphores are
+created with the counter set to one, down() decrements by one, and
+up() increments by one. If down() attempts to decrement the counter
+below zero, it blocks until the counter is large enough. Note that
+while a semaphore can be created with a starting count of zero, any
+up() or down() always changes the counter by at least
+one. $semaphore->down(0) is the same as $semaphore->down(1).
+
+The question, of course, is why would you do something like this? Why
+create a semaphore with a starting count that's not one, or why
+decrement/increment it by more than one? The answer is resource
+availability. Many resources that you want to manage access for can be
+safely used by more than one thread at once.
+
+For example, let's take a GUI driven program. It has a semaphore that
+it uses to synchronize access to the display, so only one thread is
+ever drawing at once. Handy, but of course you don't want any thread
+to start drawing until things are properly set up. In this case, you
+can create a semaphore with a counter set to zero, and up it when
+things are ready for drawing.
+
+Semaphores with counters greater than one are also useful for
+establishing quotas. Say, for example, that you have a number of
+threads that can do I/O at once. You don't want all the threads
+reading or writing at once though, since that can potentially swamp
+your I/O channels, or deplete your process' quota of filehandles. You
+can use a semaphore initialized to the number of concurrent I/O
+requests (or open files) that you want at any one time, and have your
+threads quietly block and unblock themselves.
+
+Larger increments or decrements are handy in those cases where a
+thread needs to check out or return a number of resources at once.
+
+=back
+
+=head2 Attributes: Restricting Access To Subroutines
+
+In addition to synchronizing access to data or resources, you might
+find it useful to synchronize access to subroutines. You may be
+accessing a singular machine resource (perhaps a vector processor), or
+find it easier to serialize calls to a particular subroutine than to
+have a set of locks and semaphores.
+
+One of the additions to Perl 5.005 is subroutine attributes. The
+Thread package uses these to provide several flavors of
+serialization. It's important to remember that these attributes are
+used in the compilation phase of your program so you can't change a
+subroutine's behavior while your program is actually running.
+
+=head2 Subroutine Locks
+
+The basic subroutine lock looks like this:
+
+ sub test_sub :locked {
+ }
+
+This ensures that only one thread will be executing this subroutine at
+any one time. Once a thread calls this subroutine, any other thread
+that calls it will block until the thread in the subroutine exits
+it. A more elaborate example looks like this:
+
+ use Thread qw(yield);
+
+ Thread->new(\&thread_sub, 1);
+ Thread->new(\&thread_sub, 2);
+ Thread->new(\&thread_sub, 3);
+ Thread->new(\&thread_sub, 4);
+
+ sub sync_sub :locked {
+ my $CallingThread = shift @_;
+ print "In sync_sub for thread $CallingThread\n";
+ yield;
+ sleep 3;
+ print "Leaving sync_sub for thread $CallingThread\n";
+ }
+
+ sub thread_sub {
+ my $ThreadID = shift @_;
+ print "Thread $ThreadID calling sync_sub\n";
+ sync_sub($ThreadID);
+ print "$ThreadID is done with sync_sub\n";
+ }
+
+The C<locked> attribute tells perl to lock sync_sub(), and if you run
+this, you can see that only one thread is in it at any one time.
+
+=head2 Methods
+
+Locking an entire subroutine can sometimes be overkill, especially
+when dealing with Perl objects. When calling a method for an object,
+for example, you want to serialize calls to a method, so that only one
+thread will be in the subroutine for a particular object, but threads
+calling that subroutine for a different object aren't blocked. The
+method attribute indicates whether the subroutine is really a method.
+
+ use Thread;
+
+ sub tester {
+ my $thrnum = shift @_;
+ my $bar = Foo->new();
+ foreach (1..10) {
+ print "$thrnum calling per_object\n";
+ $bar->per_object($thrnum);
+ print "$thrnum out of per_object\n";
+ yield;
+ print "$thrnum calling one_at_a_time\n";
+ $bar->one_at_a_time($thrnum);
+ print "$thrnum out of one_at_a_time\n";
+ yield;
+ }
+ }
+
+ foreach my $thrnum (1..10) {
+ Thread->new(\&tester, $thrnum);
+ }
+
+ package Foo;
+ sub new {
+ my $class = shift @_;
+ return bless [@_], $class;
+ }
+
+ sub per_object :locked :method {
+ my ($class, $thrnum) = @_;
+ print "In per_object for thread $thrnum\n";
+ yield;
+ sleep 2;
+ print "Exiting per_object for thread $thrnum\n";
+ }
+
+ sub one_at_a_time :locked {
+ my ($class, $thrnum) = @_;
+ print "In one_at_a_time for thread $thrnum\n";
+ yield;
+ sleep 2;
+ print "Exiting one_at_a_time for thread $thrnum\n";
+ }
+
+As you can see from the output (omitted for brevity; it's 800 lines)
+all the threads can be in per_object() simultaneously, but only one
+thread is ever in one_at_a_time() at once.
+
+=head2 Locking A Subroutine
+
+You can lock a subroutine as you would lock a variable. Subroutine locks
+work the same as specifying a C<locked> attribute for the subroutine,
+and block all access to the subroutine for other threads until the
+lock goes out of scope. When the subroutine isn't locked, any number
+of threads can be in it at once, and getting a lock on a subroutine
+doesn't affect threads already in the subroutine. Getting a lock on a
+subroutine looks like this:
+
+ lock(\&sub_to_lock);
+
+Simple enough. Unlike the C<locked> attribute, which is a compile time
+option, locking and unlocking a subroutine can be done at runtime at your
+discretion. There is some runtime penalty to using lock(\&sub) instead
+of the C<locked> attribute, so make sure you're choosing the proper
+method to do the locking.
+
+You'd choose lock(\&sub) when writing modules and code to run on both
+threaded and unthreaded Perl, especially for code that will run on
+5.004 or earlier Perls. In that case, it's useful to have subroutines
+that should be serialized lock themselves if they're running threaded,
+like so:
+
+ package Foo;
+ use Config;
+ $Running_Threaded = 0;
+
+ BEGIN { $Running_Threaded = $Config{'usethreads'} }
+
+ sub sub1 { lock(\&sub1) if $Running_Threaded }
+
+
+This way you can ensure single-threadedness regardless of which
+version of Perl you're running.
+
+=head1 General Thread Utility Routines
+
+We've covered the workhorse parts of Perl's threading package, and
+with these tools you should be well on your way to writing threaded
+code and packages. There are a few useful little pieces that didn't
+really fit in anyplace else.
+
+=head2 What Thread Am I In?
+
+The Thread->self method provides your program with a way to get an
+object representing the thread it's currently in. You can use this
+object in the same way as the ones returned from the thread creation.
+
+=head2 Thread IDs
+
+tid() is a thread object method that returns the thread ID of the
+thread the object represents. Thread IDs are integers, with the main
+thread in a program being 0. Currently Perl assigns a unique tid to
+every thread ever created in your program, assigning the first thread
+to be created a tid of 1, and increasing the tid by 1 for each new
+thread that's created.
+
+=head2 Are These Threads The Same?
+
+The equal() method takes two thread objects and returns true
+if the objects represent the same thread, and false if they don't.
+
+=head2 What Threads Are Running?
+
+Thread->list returns a list of thread objects, one for each thread
+that's currently running. Handy for a number of things, including
+cleaning up at the end of your program:
+
+ # Loop through all the threads
+ foreach $thr (Thread->list) {
+ # Don't join the main thread or ourselves
+ if ($thr->tid && !Thread::equal($thr, Thread->self)) {
+ $thr->join;
+ }
+ }
+
+The example above is just for illustration. It isn't strictly
+necessary to join all the threads you create, since Perl detaches all
+the threads before it exits.
+
+=head1 A Complete Example
+
+Confused yet? It's time for an example program to show some of the
+things we've covered. This program finds prime numbers using threads.
+
+ 1 #!/usr/bin/perl -w
+ 2 # prime-pthread, courtesy of Tom Christiansen
+ 3
+ 4 use strict;
+ 5
+ 6 use Thread;
+ 7 use Thread::Queue;
+ 8
+ 9 my $stream = Thread::Queue->new();
+ 10 my $kid = Thread->new(\&check_num, $stream, 2);
+ 11
+ 12 for my $i ( 3 .. 1000 ) {
+ 13 $stream->enqueue($i);
+ 14 }
+ 15
+ 16 $stream->enqueue(undef);
+ 17 $kid->join();
+ 18
+ 19 sub check_num {
+ 20 my ($upstream, $cur_prime) = @_;
+ 21 my $kid;
+ 22 my $downstream = Thread::Queue->new();
+ 23 while (my $num = $upstream->dequeue) {
+ 24 next unless $num % $cur_prime;
+ 25 if ($kid) {
+ 26 $downstream->enqueue($num);
+ 27 } else {
+ 28 print "Found prime $num\n";
+ 29 $kid = Thread->new(\&check_num, $downstream, $num);
+ 30 }
+ 31 }
+ 32 $downstream->enqueue(undef) if $kid;
+ 33 $kid->join() if $kid;
+ 34 }
+
+This program uses the pipeline model to generate prime numbers. Each
+thread in the pipeline has an input queue that feeds numbers to be
+checked, a prime number that it's responsible for, and an output queue
+that it funnels numbers that have failed the check into. If the thread
+has a number that's failed its check and there's no child thread, then
+the thread must have found a new prime number. In that case, a new
+child thread is created for that prime and stuck on the end of the
+pipeline.
+
+This probably sounds a bit more confusing than it really is, so lets
+go through this program piece by piece and see what it does. (For
+those of you who might be trying to remember exactly what a prime
+number is, it's a number that's only evenly divisible by itself and 1)
+
+The bulk of the work is done by the check_num() subroutine, which
+takes a reference to its input queue and a prime number that it's
+responsible for. After pulling in the input queue and the prime that
+the subroutine's checking (line 20), we create a new queue (line 22)
+and reserve a scalar for the thread that we're likely to create later
+(line 21).
+
+The while loop from lines 23 to line 31 grabs a scalar off the input
+queue and checks against the prime this thread is responsible
+for. Line 24 checks to see if there's a remainder when we modulo the
+number to be checked against our prime. If there is one, the number
+must not be evenly divisible by our prime, so we need to either pass
+it on to the next thread if we've created one (line 26) or create a
+new thread if we haven't.
+
+The new thread creation is line 29. We pass on to it a reference to
+the queue we've created, and the prime number we've found.
+
+Finally, once the loop terminates (because we got a 0 or undef in the
+queue, which serves as a note to die), we pass on the notice to our
+child and wait for it to exit if we've created a child (Lines 32 and
+37).
+
+Meanwhile, back in the main thread, we create a queue (line 9) and the
+initial child thread (line 10), and pre-seed it with the first prime:
+2. Then we queue all the numbers from 3 to 1000 for checking (lines
+12-14), then queue a die notice (line 16) and wait for the first child
+thread to terminate (line 17). Because a child won't die until its
+child has died, we know that we're done once we return from the join.
+
+That's how it works. It's pretty simple; as with many Perl programs,
+the explanation is much longer than the program.
+
+=head1 Conclusion
+
+A complete thread tutorial could fill a book (and has, many times),
+but this should get you well on your way. The final authority on how
+Perl's threads behave is the documentation bundled with the Perl
+distribution, but with what we've covered in this article, you should
+be well on your way to becoming a threaded Perl expert.
+
+=head1 Bibliography
+
+Here's a short bibliography courtesy of Jürgen Christoffel:
+
+=head2 Introductory Texts
+
+Birrell, Andrew D. An Introduction to Programming with
+Threads. Digital Equipment Corporation, 1989, DEC-SRC Research Report
+#35 online as
+http://www.research.digital.com/SRC/staff/birrell/bib.html (highly
+recommended)
+
+Robbins, Kay. A., and Steven Robbins. Practical Unix Programming: A
+Guide to Concurrency, Communication, and
+Multithreading. Prentice-Hall, 1996.
+
+Lewis, Bill, and Daniel J. Berg. Multithreaded Programming with
+Pthreads. Prentice Hall, 1997, ISBN 0-13-443698-9 (a well-written
+introduction to threads).
+
+Nelson, Greg (editor). Systems Programming with Modula-3. Prentice
+Hall, 1991, ISBN 0-13-590464-1.
+
+Nichols, Bradford, Dick Buttlar, and Jacqueline Proulx Farrell.
+Pthreads Programming. O'Reilly & Associates, 1996, ISBN 156592-115-1
+(covers POSIX threads).
+
+=head2 OS-Related References
+
+Boykin, Joseph, David Kirschen, Alan Langerman, and Susan
+LoVerso. Programming under Mach. Addison-Wesley, 1994, ISBN
+0-201-52739-1.
+
+Tanenbaum, Andrew S. Distributed Operating Systems. Prentice Hall,
+1995, ISBN 0-13-219908-4 (great textbook).
+
+Silberschatz, Abraham, and Peter B. Galvin. Operating System Concepts,
+4th ed. Addison-Wesley, 1995, ISBN 0-201-59292-4
+
+=head2 Other References
+
+Arnold, Ken and James Gosling. The Java Programming Language, 2nd
+ed. Addison-Wesley, 1998, ISBN 0-201-31006-6.
+
+Le Sergent, T. and B. Berthomieu. "Incremental MultiThreaded Garbage
+Collection on Virtually Shared Memory Architectures" in Memory
+Management: Proc. of the International Workshop IWMM 92, St. Malo,
+France, September 1992, Yves Bekkers and Jacques Cohen, eds. Springer,
+1992, ISBN 3540-55940-X (real-life thread applications).
+
+=head1 Acknowledgements
+
+Thanks (in no particular order) to Chaim Frenkel, Steve Fink, Gurusamy
+Sarathy, Ilya Zakharevich, Benjamin Sugars, Jürgen Christoffel, Joshua
+Pritikin, and Alan Burlison, for their help in reality-checking and
+polishing this article. Big thanks to Tom Christiansen for his rewrite
+of the prime number generator.
+
+=head1 AUTHOR
+
+Dan Sugalski E<lt>sugalskd@ous.eduE<gt>
+
+=head1 Copyrights
+
+This article originally appeared in The Perl Journal #10, and is
+copyright 1998 The Perl Journal. It appears courtesy of Jon Orwant and
+The Perl Journal. This document may be distributed under the same terms
+as Perl itself.
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlpacktut.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlpacktut.pod
new file mode 100755
index 00000000000..7d2126a0eaa
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlpacktut.pod
@@ -0,0 +1,1266 @@
+=head1 NAME
+
+perlpacktut - tutorial on C<pack> and C<unpack>
+
+=head1 DESCRIPTION
+
+C<pack> and C<unpack> are two functions for transforming data according
+to a user-defined template, between the guarded way Perl stores values
+and some well-defined representation as might be required in the
+environment of a Perl program. Unfortunately, they're also two of
+the most misunderstood and most often overlooked functions that Perl
+provides. This tutorial will demystify them for you.
+
+
+=head1 The Basic Principle
+
+Most programming languages don't shelter the memory where variables are
+stored. In C, for instance, you can take the address of some variable,
+and the C<sizeof> operator tells you how many bytes are allocated to
+the variable. Using the address and the size, you may access the storage
+to your heart's content.
+
+In Perl, you just can't access memory at random, but the structural and
+representational conversion provided by C<pack> and C<unpack> is an
+excellent alternative. The C<pack> function converts values to a byte
+sequence containing representations according to a given specification,
+the so-called "template" argument. C<unpack> is the reverse process,
+deriving some values from the contents of a string of bytes. (Be cautioned,
+however, that not all that has been packed together can be neatly unpacked -
+a very common experience as seasoned travellers are likely to confirm.)
+
+Why, you may ask, would you need a chunk of memory containing some values
+in binary representation? One good reason is input and output accessing
+some file, a device, or a network connection, whereby this binary
+representation is either forced on you or will give you some benefit
+in processing. Another cause is passing data to some system call that
+is not available as a Perl function: C<syscall> requires you to provide
+parameters stored in the way it happens in a C program. Even text processing
+(as shown in the next section) may be simplified with judicious usage
+of these two functions.
+
+To see how (un)packing works, we'll start with a simple template
+code where the conversion is in low gear: between the contents of a byte
+sequence and a string of hexadecimal digits. Let's use C<unpack>, since
+this is likely to remind you of a dump program, or some desperate last
+message unfortunate programs are wont to throw at you before they expire
+into the wild blue yonder. Assuming that the variable C<$mem> holds a
+sequence of bytes that we'd like to inspect without assuming anything
+about its meaning, we can write
+
+ my( $hex ) = unpack( 'H*', $mem );
+ print "$hex\n";
+
+whereupon we might see something like this, with each pair of hex digits
+corresponding to a byte:
+
+ 41204d414e204120504c414e20412043414e414c2050414e414d41
+
+What was in this chunk of memory? Numbers, characters, or a mixture of
+both? Assuming that we're on a computer where ASCII (or some similar)
+encoding is used: hexadecimal values in the range C<0x40> - C<0x5A>
+indicate an uppercase letter, and C<0x20> encodes a space. So we might
+assume it is a piece of text, which some are able to read like a tabloid;
+but others will have to get hold of an ASCII table and relive that
+firstgrader feeling. Not caring too much about which way to read this,
+we note that C<unpack> with the template code C<H> converts the contents
+of a sequence of bytes into the customary hexadecimal notation. Since
+"a sequence of" is a pretty vague indication of quantity, C<H> has been
+defined to convert just a single hexadecimal digit unless it is followed
+by a repeat count. An asterisk for the repeat count means to use whatever
+remains.
+
+The inverse operation - packing byte contents from a string of hexadecimal
+digits - is just as easily written. For instance:
+
+ my $s = pack( 'H2' x 10, map { "3$_" } ( 0..9 ) );
+ print "$s\n";
+
+Since we feed a list of ten 2-digit hexadecimal strings to C<pack>, the
+pack template should contain ten pack codes. If this is run on a computer
+with ASCII character coding, it will print C<0123456789>.
+
+
+=head1 Packing Text
+
+Let's suppose you've got to read in a data file like this:
+
+ Date |Description | Income|Expenditure
+ 01/24/2001 Ahmed's Camel Emporium 1147.99
+ 01/28/2001 Flea spray 24.99
+ 01/29/2001 Camel rides to tourists 235.00
+
+How do we do it? You might think first to use C<split>; however, since
+C<split> collapses blank fields, you'll never know whether a record was
+income or expenditure. Oops. Well, you could always use C<substr>:
+
+ while (<>) {
+ my $date = substr($_, 0, 11);
+ my $desc = substr($_, 12, 27);
+ my $income = substr($_, 40, 7);
+ my $expend = substr($_, 52, 7);
+ ...
+ }
+
+It's not really a barrel of laughs, is it? In fact, it's worse than it
+may seem; the eagle-eyed may notice that the first field should only be
+10 characters wide, and the error has propagated right through the other
+numbers - which we've had to count by hand. So it's error-prone as well
+as horribly unfriendly.
+
+Or maybe we could use regular expressions:
+
+ while (<>) {
+ my($date, $desc, $income, $expend) =
+ m|(\d\d/\d\d/\d{4}) (.{27}) (.{7})(.*)|;
+ ...
+ }
+
+Urgh. Well, it's a bit better, but - well, would you want to maintain
+that?
+
+Hey, isn't Perl supposed to make this sort of thing easy? Well, it does,
+if you use the right tools. C<pack> and C<unpack> are designed to help
+you out when dealing with fixed-width data like the above. Let's have a
+look at a solution with C<unpack>:
+
+ while (<>) {
+ my($date, $desc, $income, $expend) = unpack("A10xA27xA7A*", $_);
+ ...
+ }
+
+That looks a bit nicer; but we've got to take apart that weird template.
+Where did I pull that out of?
+
+OK, let's have a look at some of our data again; in fact, we'll include
+the headers, and a handy ruler so we can keep track of where we are.
+
+ 1 2 3 4 5
+ 1234567890123456789012345678901234567890123456789012345678
+ Date |Description | Income|Expenditure
+ 01/28/2001 Flea spray 24.99
+ 01/29/2001 Camel rides to tourists 235.00
+
+From this, we can see that the date column stretches from column 1 to
+column 10 - ten characters wide. The C<pack>-ese for "character" is
+C<A>, and ten of them are C<A10>. So if we just wanted to extract the
+dates, we could say this:
+
+ my($date) = unpack("A10", $_);
+
+OK, what's next? Between the date and the description is a blank column;
+we want to skip over that. The C<x> template means "skip forward", so we
+want one of those. Next, we have another batch of characters, from 12 to
+38. That's 27 more characters, hence C<A27>. (Don't make the fencepost
+error - there are 27 characters between 12 and 38, not 26. Count 'em!)
+
+Now we skip another character and pick up the next 7 characters:
+
+ my($date,$description,$income) = unpack("A10xA27xA7", $_);
+
+Now comes the clever bit. Lines in our ledger which are just income and
+not expenditure might end at column 46. Hence, we don't want to tell our
+C<unpack> pattern that we B<need> to find another 12 characters; we'll
+just say "if there's anything left, take it". As you might guess from
+regular expressions, that's what the C<*> means: "use everything
+remaining".
+
+=over 3
+
+=item *
+
+Be warned, though, that unlike regular expressions, if the C<unpack>
+template doesn't match the incoming data, Perl will scream and die.
+
+=back
+
+
+Hence, putting it all together:
+
+ my($date,$description,$income,$expend) = unpack("A10xA27xA7xA*", $_);
+
+Now, that's our data parsed. I suppose what we might want to do now is
+total up our income and expenditure, and add another line to the end of
+our ledger - in the same format - saying how much we've brought in and
+how much we've spent:
+
+ while (<>) {
+ my($date, $desc, $income, $expend) = unpack("A10xA27xA7xA*", $_);
+ $tot_income += $income;
+ $tot_expend += $expend;
+ }
+
+ $tot_income = sprintf("%.2f", $tot_income); # Get them into
+ $tot_expend = sprintf("%.2f", $tot_expend); # "financial" format
+
+ $date = POSIX::strftime("%m/%d/%Y", localtime);
+
+ # OK, let's go:
+
+ print pack("A10xA27xA7xA*", $date, "Totals", $tot_income, $tot_expend);
+
+Oh, hmm. That didn't quite work. Let's see what happened:
+
+ 01/24/2001 Ahmed's Camel Emporium 1147.99
+ 01/28/2001 Flea spray 24.99
+ 01/29/2001 Camel rides to tourists 1235.00
+ 03/23/2001Totals 1235.001172.98
+
+OK, it's a start, but what happened to the spaces? We put C<x>, didn't
+we? Shouldn't it skip forward? Let's look at what L<perlfunc/pack> says:
+
+ x A null byte.
+
+Urgh. No wonder. There's a big difference between "a null byte",
+character zero, and "a space", character 32. Perl's put something
+between the date and the description - but unfortunately, we can't see
+it!
+
+What we actually need to do is expand the width of the fields. The C<A>
+format pads any non-existent characters with spaces, so we can use the
+additional spaces to line up our fields, like this:
+
+ print pack("A11 A28 A8 A*", $date, "Totals", $tot_income, $tot_expend);
+
+(Note that you can put spaces in the template to make it more readable,
+but they don't translate to spaces in the output.) Here's what we got
+this time:
+
+ 01/24/2001 Ahmed's Camel Emporium 1147.99
+ 01/28/2001 Flea spray 24.99
+ 01/29/2001 Camel rides to tourists 1235.00
+ 03/23/2001 Totals 1235.00 1172.98
+
+That's a bit better, but we still have that last column which needs to
+be moved further over. There's an easy way to fix this up:
+unfortunately, we can't get C<pack> to right-justify our fields, but we
+can get C<sprintf> to do it:
+
+ $tot_income = sprintf("%.2f", $tot_income);
+ $tot_expend = sprintf("%12.2f", $tot_expend);
+ $date = POSIX::strftime("%m/%d/%Y", localtime);
+ print pack("A11 A28 A8 A*", $date, "Totals", $tot_income, $tot_expend);
+
+This time we get the right answer:
+
+ 01/28/2001 Flea spray 24.99
+ 01/29/2001 Camel rides to tourists 1235.00
+ 03/23/2001 Totals 1235.00 1172.98
+
+So that's how we consume and produce fixed-width data. Let's recap what
+we've seen of C<pack> and C<unpack> so far:
+
+=over 3
+
+=item *
+
+Use C<pack> to go from several pieces of data to one fixed-width
+version; use C<unpack> to turn a fixed-width-format string into several
+pieces of data.
+
+=item *
+
+The pack format C<A> means "any character"; if you're C<pack>ing and
+you've run out of things to pack, C<pack> will fill the rest up with
+spaces.
+
+=item *
+
+C<x> means "skip a byte" when C<unpack>ing; when C<pack>ing, it means
+"introduce a null byte" - that's probably not what you mean if you're
+dealing with plain text.
+
+=item *
+
+You can follow the formats with numbers to say how many characters
+should be affected by that format: C<A12> means "take 12 characters";
+C<x6> means "skip 6 bytes" or "character 0, 6 times".
+
+=item *
+
+Instead of a number, you can use C<*> to mean "consume everything else
+left".
+
+B<Warning>: when packing multiple pieces of data, C<*> only means
+"consume all of the current piece of data". That's to say
+
+ pack("A*A*", $one, $two)
+
+packs all of C<$one> into the first C<A*> and then all of C<$two> into
+the second. This is a general principle: each format character
+corresponds to one piece of data to be C<pack>ed.
+
+=back
+
+
+
+=head1 Packing Numbers
+
+So much for textual data. Let's get onto the meaty stuff that C<pack>
+and C<unpack> are best at: handling binary formats for numbers. There is,
+of course, not just one binary format - life would be too simple - but
+Perl will do all the finicky labor for you.
+
+
+=head2 Integers
+
+Packing and unpacking numbers implies conversion to and from some
+I<specific> binary representation. Leaving floating point numbers
+aside for the moment, the salient properties of any such representation
+are:
+
+=over 4
+
+=item *
+
+the number of bytes used for storing the integer,
+
+=item *
+
+whether the contents are interpreted as a signed or unsigned number,
+
+=item *
+
+the byte ordering: whether the first byte is the least or most
+significant byte (or: little-endian or big-endian, respectively).
+
+=back
+
+So, for instance, to pack 20302 to a signed 16 bit integer in your
+computer's representation you write
+
+ my $ps = pack( 's', 20302 );
+
+Again, the result is a string, now containing 2 bytes. If you print
+this string (which is, generally, not recommended) you might see
+C<ON> or C<NO> (depending on your system's byte ordering) - or something
+entirely different if your computer doesn't use ASCII character encoding.
+Unpacking C<$ps> with the same template returns the original integer value:
+
+ my( $s ) = unpack( 's', $ps );
+
+This is true for all numeric template codes. But don't expect miracles:
+if the packed value exceeds the allotted byte capacity, high order bits
+are silently discarded, and unpack certainly won't be able to pull them
+back out of some magic hat. And, when you pack using a signed template
+code such as C<s>, an excess value may result in the sign bit
+getting set, and unpacking this will smartly return a negative value.
+
+16 bits won't get you too far with integers, but there is C<l> and C<L>
+for signed and unsigned 32-bit integers. And if this is not enough and
+your system supports 64 bit integers you can push the limits much closer
+to infinity with pack codes C<q> and C<Q>. A notable exception is provided
+by pack codes C<i> and C<I> for signed and unsigned integers of the
+"local custom" variety: Such an integer will take up as many bytes as
+a local C compiler returns for C<sizeof(int)>, but it'll use I<at least>
+32 bits.
+
+Each of the integer pack codes C<sSlLqQ> results in a fixed number of bytes,
+no matter where you execute your program. This may be useful for some
+applications, but it does not provide for a portable way to pass data
+structures between Perl and C programs (bound to happen when you call
+XS extensions or the Perl function C<syscall>), or when you read or
+write binary files. What you'll need in this case are template codes that
+depend on what your local C compiler compiles when you code C<short> or
+C<unsigned long>, for instance. These codes and their corresponding
+byte lengths are shown in the table below. Since the C standard leaves
+much leeway with respect to the relative sizes of these data types, actual
+values may vary, and that's why the values are given as expressions in
+C and Perl. (If you'd like to use values from C<%Config> in your program
+you have to import it with C<use Config>.)
+
+ signed unsigned byte length in C byte length in Perl
+ s! S! sizeof(short) $Config{shortsize}
+ i! I! sizeof(int) $Config{intsize}
+ l! L! sizeof(long) $Config{longsize}
+ q! Q! sizeof(long long) $Config{longlongsize}
+
+The C<i!> and C<I!> codes aren't different from C<i> and C<I>; they are
+tolerated for completeness' sake.
+
+
+=head2 Unpacking a Stack Frame
+
+Requesting a particular byte ordering may be necessary when you work with
+binary data coming from some specific architecture whereas your program could
+run on a totally different system. As an example, assume you have 24 bytes
+containing a stack frame as it happens on an Intel 8086:
+
+ +---------+ +----+----+ +---------+
+ TOS: | IP | TOS+4:| FL | FH | FLAGS TOS+14:| SI |
+ +---------+ +----+----+ +---------+
+ | CS | | AL | AH | AX | DI |
+ +---------+ +----+----+ +---------+
+ | BL | BH | BX | BP |
+ +----+----+ +---------+
+ | CL | CH | CX | DS |
+ +----+----+ +---------+
+ | DL | DH | DX | ES |
+ +----+----+ +---------+
+
+First, we note that this time-honored 16-bit CPU uses little-endian order,
+and that's why the low order byte is stored at the lower address. To
+unpack such a (unsigned) short we'll have to use code C<v>. A repeat
+count unpacks all 12 shorts:
+
+ my( $ip, $cs, $flags, $ax, $bx, $cd, $dx, $si, $di, $bp, $ds, $es ) =
+ unpack( 'v12', $frame );
+
+Alternatively, we could have used C<C> to unpack the individually
+accessible byte registers FL, FH, AL, AH, etc.:
+
+ my( $fl, $fh, $al, $ah, $bl, $bh, $cl, $ch, $dl, $dh ) =
+ unpack( 'C10', substr( $frame, 4, 10 ) );
+
+It would be nice if we could do this in one fell swoop: unpack a short,
+back up a little, and then unpack 2 bytes. Since Perl I<is> nice, it
+proffers the template code C<X> to back up one byte. Putting this all
+together, we may now write:
+
+ my( $ip, $cs,
+ $flags,$fl,$fh,
+ $ax,$al,$ah, $bx,$bl,$bh, $cx,$cl,$ch, $dx,$dl,$dh,
+ $si, $di, $bp, $ds, $es ) =
+ unpack( 'v2' . ('vXXCC' x 5) . 'v5', $frame );
+
+(The clumsy construction of the template can be avoided - just read on!)
+
+We've taken some pains to construct the template so that it matches
+the contents of our frame buffer. Otherwise we'd either get undefined values,
+or C<unpack> could not unpack all. If C<pack> runs out of items, it will
+supply null strings (which are coerced into zeroes whenever the pack code
+says so).
+
+
+=head2 How to Eat an Egg on a Net
+
+The pack code for big-endian (high order byte at the lowest address) is
+C<n> for 16 bit and C<N> for 32 bit integers. You use these codes
+if you know that your data comes from a compliant architecture, but,
+surprisingly enough, you should also use these pack codes if you
+exchange binary data, across the network, with some system that you
+know next to nothing about. The simple reason is that this
+order has been chosen as the I<network order>, and all standard-fearing
+programs ought to follow this convention. (This is, of course, a stern
+backing for one of the Lilliputian parties and may well influence the
+political development there.) So, if the protocol expects you to send
+a message by sending the length first, followed by just so many bytes,
+you could write:
+
+ my $buf = pack( 'N', length( $msg ) ) . $msg;
+
+or even:
+
+ my $buf = pack( 'NA*', length( $msg ), $msg );
+
+and pass C<$buf> to your send routine. Some protocols demand that the
+count should include the length of the count itself: then just add 4
+to the data length. (But make sure to read L<"Lengths and Widths"> before
+you really code this!)
+
+
+=head2 Byte-order modifiers
+
+In the previous sections we've learned how to use C<n>, C<N>, C<v> and
+C<V> to pack and unpack integers with big- or little-endian byte-order.
+While this is nice, it's still rather limited because it leaves out all
+kinds of signed integers as well as 64-bit integers. For example, if you
+wanted to unpack a sequence of signed big-endian 16-bit integers in a
+platform-independent way, you would have to write:
+
+ my @data = unpack 's*', pack 'S*', unpack 'n*', $buf;
+
+This is ugly. As of Perl 5.9.2, there's a much nicer way to express your
+desire for a certain byte-order: the C<E<gt>> and C<E<lt>> modifiers.
+C<E<gt>> is the big-endian modifier, while C<E<lt>> is the little-endian
+modifier. Using them, we could rewrite the above code as:
+
+ my @data = unpack 's>*', $buf;
+
+As you can see, the "big end" of the arrow touches the C<s>, which is a
+nice way to remember that C<E<gt>> is the big-endian modifier. The same
+obviously works for C<E<lt>>, where the "little end" touches the code.
+
+You will probably find these modifiers even more useful if you have
+to deal with big- or little-endian C structures. Be sure to read
+L<"Packing and Unpacking C Structures"> for more on that.
+
+
+=head2 Floating point Numbers
+
+For packing floating point numbers you have the choice between the
+pack codes C<f>, C<d>, C<F> and C<D>. C<f> and C<d> pack into (or unpack
+from) single-precision or double-precision representation as it is provided
+by your system. If your systems supports it, C<D> can be used to pack and
+unpack extended-precision floating point values (C<long double>), which
+can offer even more resolution than C<f> or C<d>. C<F> packs an C<NV>,
+which is the floating point type used by Perl internally. (There
+is no such thing as a network representation for reals, so if you want
+to send your real numbers across computer boundaries, you'd better stick
+to ASCII representation, unless you're absolutely sure what's on the other
+end of the line. For the even more adventuresome, you can use the byte-order
+modifiers from the previous section also on floating point codes.)
+
+
+
+=head1 Exotic Templates
+
+
+=head2 Bit Strings
+
+Bits are the atoms in the memory world. Access to individual bits may
+have to be used either as a last resort or because it is the most
+convenient way to handle your data. Bit string (un)packing converts
+between strings containing a series of C<0> and C<1> characters and
+a sequence of bytes each containing a group of 8 bits. This is almost
+as simple as it sounds, except that there are two ways the contents of
+a byte may be written as a bit string. Let's have a look at an annotated
+byte:
+
+ 7 6 5 4 3 2 1 0
+ +-----------------+
+ | 1 0 0 0 1 1 0 0 |
+ +-----------------+
+ MSB LSB
+
+It's egg-eating all over again: Some think that as a bit string this should
+be written "10001100" i.e. beginning with the most significant bit, others
+insist on "00110001". Well, Perl isn't biased, so that's why we have two bit
+string codes:
+
+ $byte = pack( 'B8', '10001100' ); # start with MSB
+ $byte = pack( 'b8', '00110001' ); # start with LSB
+
+It is not possible to pack or unpack bit fields - just integral bytes.
+C<pack> always starts at the next byte boundary and "rounds up" to the
+next multiple of 8 by adding zero bits as required. (If you do want bit
+fields, there is L<perlfunc/vec>. Or you could implement bit field
+handling at the character string level, using split, substr, and
+concatenation on unpacked bit strings.)
+
+To illustrate unpacking for bit strings, we'll decompose a simple
+status register (a "-" stands for a "reserved" bit):
+
+ +-----------------+-----------------+
+ | S Z - A - P - C | - - - - O D I T |
+ +-----------------+-----------------+
+ MSB LSB MSB LSB
+
+Converting these two bytes to a string can be done with the unpack
+template C<'b16'>. To obtain the individual bit values from the bit
+string we use C<split> with the "empty" separator pattern which dissects
+into individual characters. Bit values from the "reserved" positions are
+simply assigned to C<undef>, a convenient notation for "I don't care where
+this goes".
+
+ ($carry, undef, $parity, undef, $auxcarry, undef, $zero, $sign,
+ $trace, $interrupt, $direction, $overflow) =
+ split( //, unpack( 'b16', $status ) );
+
+We could have used an unpack template C<'b12'> just as well, since the
+last 4 bits can be ignored anyway.
+
+
+=head2 Uuencoding
+
+Another odd-man-out in the template alphabet is C<u>, which packs an
+"uuencoded string". ("uu" is short for Unix-to-Unix.) Chances are that
+you won't ever need this encoding technique which was invented to overcome
+the shortcomings of old-fashioned transmission mediums that do not support
+other than simple ASCII data. The essential recipe is simple: Take three
+bytes, or 24 bits. Split them into 4 six-packs, adding a space (0x20) to
+each. Repeat until all of the data is blended. Fold groups of 4 bytes into
+lines no longer than 60 and garnish them in front with the original byte count
+(incremented by 0x20) and a C<"\n"> at the end. - The C<pack> chef will
+prepare this for you, a la minute, when you select pack code C<u> on the menu:
+
+ my $uubuf = pack( 'u', $bindat );
+
+A repeat count after C<u> sets the number of bytes to put into an
+uuencoded line, which is the maximum of 45 by default, but could be
+set to some (smaller) integer multiple of three. C<unpack> simply ignores
+the repeat count.
+
+
+=head2 Doing Sums
+
+An even stranger template code is C<%>E<lt>I<number>E<gt>. First, because
+it's used as a prefix to some other template code. Second, because it
+cannot be used in C<pack> at all, and third, in C<unpack>, doesn't return the
+data as defined by the template code it precedes. Instead it'll give you an
+integer of I<number> bits that is computed from the data value by
+doing sums. For numeric unpack codes, no big feat is achieved:
+
+ my $buf = pack( 'iii', 100, 20, 3 );
+ print unpack( '%32i3', $buf ), "\n"; # prints 123
+
+For string values, C<%> returns the sum of the byte values saving
+you the trouble of a sum loop with C<substr> and C<ord>:
+
+ print unpack( '%32A*', "\x01\x10" ), "\n"; # prints 17
+
+Although the C<%> code is documented as returning a "checksum":
+don't put your trust in such values! Even when applied to a small number
+of bytes, they won't guarantee a noticeable Hamming distance.
+
+In connection with C<b> or C<B>, C<%> simply adds bits, and this can be put
+to good use to count set bits efficiently:
+
+ my $bitcount = unpack( '%32b*', $mask );
+
+And an even parity bit can be determined like this:
+
+ my $evenparity = unpack( '%1b*', $mask );
+
+
+=head2 Unicode
+
+Unicode is a character set that can represent most characters in most of
+the world's languages, providing room for over one million different
+characters. Unicode 3.1 specifies 94,140 characters: The Basic Latin
+characters are assigned to the numbers 0 - 127. The Latin-1 Supplement with
+characters that are used in several European languages is in the next
+range, up to 255. After some more Latin extensions we find the character
+sets from languages using non-Roman alphabets, interspersed with a
+variety of symbol sets such as currency symbols, Zapf Dingbats or Braille.
+(You might want to visit L<http://www.unicode.org/> for a look at some of
+them - my personal favourites are Telugu and Kannada.)
+
+The Unicode character sets associates characters with integers. Encoding
+these numbers in an equal number of bytes would more than double the
+requirements for storing texts written in Latin alphabets.
+The UTF-8 encoding avoids this by storing the most common (from a western
+point of view) characters in a single byte while encoding the rarer
+ones in three or more bytes.
+
+Perl uses UTF-8, internally, for most Unicode strings.
+
+So what has this got to do with C<pack>? Well, if you want to compose a
+Unicode string (that is internally encoded as UTF-8), you can do so by
+using template code C<U>. As an example, let's produce the Euro currency
+symbol (code number 0x20AC):
+
+ $UTF8{Euro} = pack( 'U', 0x20AC );
+ # Equivalent to: $UTF8{Euro} = "\x{20ac}";
+
+Inspecting C<$UTF8{Euro}> shows that it contains 3 bytes:
+"\xe2\x82\xac". However, it contains only 1 character, number 0x20AC.
+The round trip can be completed with C<unpack>:
+
+ $Unicode{Euro} = unpack( 'U', $UTF8{Euro} );
+
+Unpacking using the C<U> template code also works on UTF-8 encoded byte
+strings.
+
+Usually you'll want to pack or unpack UTF-8 strings:
+
+ # pack and unpack the Hebrew alphabet
+ my $alefbet = pack( 'U*', 0x05d0..0x05ea );
+ my @hebrew = unpack( 'U*', $utf );
+
+Please note: in the general case, you're better off using
+Encode::decode_utf8 to decode a UTF-8 encoded byte string to a Perl
+Unicode string, and Encode::encode_utf8 to encode a Perl Unicode string
+to UTF-8 bytes. These functions provide means of handling invalid byte
+sequences and generally have a friendlier interface.
+
+=head2 Another Portable Binary Encoding
+
+The pack code C<w> has been added to support a portable binary data
+encoding scheme that goes way beyond simple integers. (Details can
+be found at L<http://Casbah.org/>, the Scarab project.) A BER (Binary Encoded
+Representation) compressed unsigned integer stores base 128
+digits, most significant digit first, with as few digits as possible.
+Bit eight (the high bit) is set on each byte except the last. There
+is no size limit to BER encoding, but Perl won't go to extremes.
+
+ my $berbuf = pack( 'w*', 1, 128, 128+1, 128*128+127 );
+
+A hex dump of C<$berbuf>, with spaces inserted at the right places,
+shows 01 8100 8101 81807F. Since the last byte is always less than
+128, C<unpack> knows where to stop.
+
+
+=head1 Template Grouping
+
+Prior to Perl 5.8, repetitions of templates had to be made by
+C<x>-multiplication of template strings. Now there is a better way as
+we may use the pack codes C<(> and C<)> combined with a repeat count.
+The C<unpack> template from the Stack Frame example can simply
+be written like this:
+
+ unpack( 'v2 (vXXCC)5 v5', $frame )
+
+Let's explore this feature a little more. We'll begin with the equivalent of
+
+ join( '', map( substr( $_, 0, 1 ), @str ) )
+
+which returns a string consisting of the first character from each string.
+Using pack, we can write
+
+ pack( '(A)'.@str, @str )
+
+or, because a repeat count C<*> means "repeat as often as required",
+simply
+
+ pack( '(A)*', @str )
+
+(Note that the template C<A*> would only have packed C<$str[0]> in full
+length.)
+
+To pack dates stored as triplets ( day, month, year ) in an array C<@dates>
+into a sequence of byte, byte, short integer we can write
+
+ $pd = pack( '(CCS)*', map( @$_, @dates ) );
+
+To swap pairs of characters in a string (with even length) one could use
+several techniques. First, let's use C<x> and C<X> to skip forward and back:
+
+ $s = pack( '(A)*', unpack( '(xAXXAx)*', $s ) );
+
+We can also use C<@> to jump to an offset, with 0 being the position where
+we were when the last C<(> was encountered:
+
+ $s = pack( '(A)*', unpack( '(@1A @0A @2)*', $s ) );
+
+Finally, there is also an entirely different approach by unpacking big
+endian shorts and packing them in the reverse byte order:
+
+ $s = pack( '(v)*', unpack( '(n)*', $s );
+
+
+=head1 Lengths and Widths
+
+=head2 String Lengths
+
+In the previous section we've seen a network message that was constructed
+by prefixing the binary message length to the actual message. You'll find
+that packing a length followed by so many bytes of data is a
+frequently used recipe since appending a null byte won't work
+if a null byte may be part of the data. Here is an example where both
+techniques are used: after two null terminated strings with source and
+destination address, a Short Message (to a mobile phone) is sent after
+a length byte:
+
+ my $msg = pack( 'Z*Z*CA*', $src, $dst, length( $sm ), $sm );
+
+Unpacking this message can be done with the same template:
+
+ ( $src, $dst, $len, $sm ) = unpack( 'Z*Z*CA*', $msg );
+
+There's a subtle trap lurking in the offing: Adding another field after
+the Short Message (in variable C<$sm>) is all right when packing, but this
+cannot be unpacked naively:
+
+ # pack a message
+ my $msg = pack( 'Z*Z*CA*C', $src, $dst, length( $sm ), $sm, $prio );
+
+ # unpack fails - $prio remains undefined!
+ ( $src, $dst, $len, $sm, $prio ) = unpack( 'Z*Z*CA*C', $msg );
+
+The pack code C<A*> gobbles up all remaining bytes, and C<$prio> remains
+undefined! Before we let disappointment dampen the morale: Perl's got
+the trump card to make this trick too, just a little further up the sleeve.
+Watch this:
+
+ # pack a message: ASCIIZ, ASCIIZ, length/string, byte
+ my $msg = pack( 'Z* Z* C/A* C', $src, $dst, $sm, $prio );
+
+ # unpack
+ ( $src, $dst, $sm, $prio ) = unpack( 'Z* Z* C/A* C', $msg );
+
+Combining two pack codes with a slash (C</>) associates them with a single
+value from the argument list. In C<pack>, the length of the argument is
+taken and packed according to the first code while the argument itself
+is added after being converted with the template code after the slash.
+This saves us the trouble of inserting the C<length> call, but it is
+in C<unpack> where we really score: The value of the length byte marks the
+end of the string to be taken from the buffer. Since this combination
+doesn't make sense except when the second pack code isn't C<a*>, C<A*>
+or C<Z*>, Perl won't let you.
+
+The pack code preceding C</> may be anything that's fit to represent a
+number: All the numeric binary pack codes, and even text codes such as
+C<A4> or C<Z*>:
+
+ # pack/unpack a string preceded by its length in ASCII
+ my $buf = pack( 'A4/A*', "Humpty-Dumpty" );
+ # unpack $buf: '13 Humpty-Dumpty'
+ my $txt = unpack( 'A4/A*', $buf );
+
+C</> is not implemented in Perls before 5.6, so if your code is required to
+work on older Perls you'll need to C<unpack( 'Z* Z* C')> to get the length,
+then use it to make a new unpack string. For example
+
+ # pack a message: ASCIIZ, ASCIIZ, length, string, byte (5.005 compatible)
+ my $msg = pack( 'Z* Z* C A* C', $src, $dst, length $sm, $sm, $prio );
+
+ # unpack
+ ( undef, undef, $len) = unpack( 'Z* Z* C', $msg );
+ ($src, $dst, $sm, $prio) = unpack ( "Z* Z* x A$len C", $msg );
+
+But that second C<unpack> is rushing ahead. It isn't using a simple literal
+string for the template. So maybe we should introduce...
+
+=head2 Dynamic Templates
+
+So far, we've seen literals used as templates. If the list of pack
+items doesn't have fixed length, an expression constructing the
+template is required (whenever, for some reason, C<()*> cannot be used).
+Here's an example: To store named string values in a way that can be
+conveniently parsed by a C program, we create a sequence of names and
+null terminated ASCII strings, with C<=> between the name and the value,
+followed by an additional delimiting null byte. Here's how:
+
+ my $env = pack( '(A*A*Z*)' . keys( %Env ) . 'C',
+ map( { ( $_, '=', $Env{$_} ) } keys( %Env ) ), 0 );
+
+Let's examine the cogs of this byte mill, one by one. There's the C<map>
+call, creating the items we intend to stuff into the C<$env> buffer:
+to each key (in C<$_>) it adds the C<=> separator and the hash entry value.
+Each triplet is packed with the template code sequence C<A*A*Z*> that
+is repeated according to the number of keys. (Yes, that's what the C<keys>
+function returns in scalar context.) To get the very last null byte,
+we add a C<0> at the end of the C<pack> list, to be packed with C<C>.
+(Attentive readers may have noticed that we could have omitted the 0.)
+
+For the reverse operation, we'll have to determine the number of items
+in the buffer before we can let C<unpack> rip it apart:
+
+ my $n = $env =~ tr/\0// - 1;
+ my %env = map( split( /=/, $_ ), unpack( "(Z*)$n", $env ) );
+
+The C<tr> counts the null bytes. The C<unpack> call returns a list of
+name-value pairs each of which is taken apart in the C<map> block.
+
+
+=head2 Counting Repetitions
+
+Rather than storing a sentinel at the end of a data item (or a list of items),
+we could precede the data with a count. Again, we pack keys and values of
+a hash, preceding each with an unsigned short length count, and up front
+we store the number of pairs:
+
+ my $env = pack( 'S(S/A* S/A*)*', scalar keys( %Env ), %Env );
+
+This simplifies the reverse operation as the number of repetitions can be
+unpacked with the C</> code:
+
+ my %env = unpack( 'S/(S/A* S/A*)', $env );
+
+Note that this is one of the rare cases where you cannot use the same
+template for C<pack> and C<unpack> because C<pack> can't determine
+a repeat count for a C<()>-group.
+
+
+=head2 Intel HEX
+
+Intel HEX is a file format for representing binary data, mostly for
+programming various chips, as a text file. (See
+L<http://en.wikipedia.org/wiki/.hex> for a detailed description, and
+L<http://en.wikipedia.org/wiki/SREC_(file_format)> for the Motorola
+S-record format, which can be unravelled using the same technique.)
+Each line begins with a colon (':') and is followed by a sequence of
+hexadecimal characters, specifying a byte count I<n> (8 bit),
+an address (16 bit, big endian), a record type (8 bit), I<n> data bytes
+and a checksum (8 bit) computed as the least significant byte of the two's
+complement sum of the preceding bytes. Example: C<:0300300002337A1E>.
+
+The first step of processing such a line is the conversion, to binary,
+of the hexadecimal data, to obtain the four fields, while checking the
+checksum. No surprise here: we'll start with a simple C<pack> call to
+convert everything to binary:
+
+ my $binrec = pack( 'H*', substr( $hexrec, 1 ) );
+
+The resulting byte sequence is most convenient for checking the checksum.
+Don't slow your program down with a for loop adding the C<ord> values
+of this string's bytes - the C<unpack> code C<%> is the thing to use
+for computing the 8-bit sum of all bytes, which must be equal to zero:
+
+ die unless unpack( "%8C*", $binrec ) == 0;
+
+Finally, let's get those four fields. By now, you shouldn't have any
+problems with the first three fields - but how can we use the byte count
+of the data in the first field as a length for the data field? Here
+the codes C<x> and C<X> come to the rescue, as they permit jumping
+back and forth in the string to unpack.
+
+ my( $addr, $type, $data ) = unpack( "x n C X4 C x3 /a", $bin );
+
+Code C<x> skips a byte, since we don't need the count yet. Code C<n> takes
+care of the 16-bit big-endian integer address, and C<C> unpacks the
+record type. Being at offset 4, where the data begins, we need the count.
+C<X4> brings us back to square one, which is the byte at offset 0.
+Now we pick up the count, and zoom forth to offset 4, where we are
+now fully furnished to extract the exact number of data bytes, leaving
+the trailing checksum byte alone.
+
+
+
+=head1 Packing and Unpacking C Structures
+
+In previous sections we have seen how to pack numbers and character
+strings. If it were not for a couple of snags we could conclude this
+section right away with the terse remark that C structures don't
+contain anything else, and therefore you already know all there is to it.
+Sorry, no: read on, please.
+
+If you have to deal with a lot of C structures, and don't want to
+hack all your template strings manually, you'll probably want to have
+a look at the CPAN module C<Convert::Binary::C>. Not only can it parse
+your C source directly, but it also has built-in support for all the
+odds and ends described further on in this section.
+
+=head2 The Alignment Pit
+
+In the consideration of speed against memory requirements the balance
+has been tilted in favor of faster execution. This has influenced the
+way C compilers allocate memory for structures: On architectures
+where a 16-bit or 32-bit operand can be moved faster between places in
+memory, or to or from a CPU register, if it is aligned at an even or
+multiple-of-four or even at a multiple-of eight address, a C compiler
+will give you this speed benefit by stuffing extra bytes into structures.
+If you don't cross the C shoreline this is not likely to cause you any
+grief (although you should care when you design large data structures,
+or you want your code to be portable between architectures (you do want
+that, don't you?)).
+
+To see how this affects C<pack> and C<unpack>, we'll compare these two
+C structures:
+
+ typedef struct {
+ char c1;
+ short s;
+ char c2;
+ long l;
+ } gappy_t;
+
+ typedef struct {
+ long l;
+ short s;
+ char c1;
+ char c2;
+ } dense_t;
+
+Typically, a C compiler allocates 12 bytes to a C<gappy_t> variable, but
+requires only 8 bytes for a C<dense_t>. After investigating this further,
+we can draw memory maps, showing where the extra 4 bytes are hidden:
+
+ 0 +4 +8 +12
+ +--+--+--+--+--+--+--+--+--+--+--+--+
+ |c1|xx| s |c2|xx|xx|xx| l | xx = fill byte
+ +--+--+--+--+--+--+--+--+--+--+--+--+
+ gappy_t
+
+ 0 +4 +8
+ +--+--+--+--+--+--+--+--+
+ | l | h |c1|c2|
+ +--+--+--+--+--+--+--+--+
+ dense_t
+
+And that's where the first quirk strikes: C<pack> and C<unpack>
+templates have to be stuffed with C<x> codes to get those extra fill bytes.
+
+The natural question: "Why can't Perl compensate for the gaps?" warrants
+an answer. One good reason is that C compilers might provide (non-ANSI)
+extensions permitting all sorts of fancy control over the way structures
+are aligned, even at the level of an individual structure field. And, if
+this were not enough, there is an insidious thing called C<union> where
+the amount of fill bytes cannot be derived from the alignment of the next
+item alone.
+
+OK, so let's bite the bullet. Here's one way to get the alignment right
+by inserting template codes C<x>, which don't take a corresponding item
+from the list:
+
+ my $gappy = pack( 'cxs cxxx l!', $c1, $s, $c2, $l );
+
+Note the C<!> after C<l>: We want to make sure that we pack a long
+integer as it is compiled by our C compiler. And even now, it will only
+work for the platforms where the compiler aligns things as above.
+And somebody somewhere has a platform where it doesn't.
+[Probably a Cray, where C<short>s, C<int>s and C<long>s are all 8 bytes. :-)]
+
+Counting bytes and watching alignments in lengthy structures is bound to
+be a drag. Isn't there a way we can create the template with a simple
+program? Here's a C program that does the trick:
+
+ #include <stdio.h>
+ #include <stddef.h>
+
+ typedef struct {
+ char fc1;
+ short fs;
+ char fc2;
+ long fl;
+ } gappy_t;
+
+ #define Pt(struct,field,tchar) \
+ printf( "@%d%s ", offsetof(struct,field), # tchar );
+
+ int main() {
+ Pt( gappy_t, fc1, c );
+ Pt( gappy_t, fs, s! );
+ Pt( gappy_t, fc2, c );
+ Pt( gappy_t, fl, l! );
+ printf( "\n" );
+ }
+
+The output line can be used as a template in a C<pack> or C<unpack> call:
+
+ my $gappy = pack( '@0c @2s! @4c @8l!', $c1, $s, $c2, $l );
+
+Gee, yet another template code - as if we hadn't plenty. But
+C<@> saves our day by enabling us to specify the offset from the beginning
+of the pack buffer to the next item: This is just the value
+the C<offsetof> macro (defined in C<E<lt>stddef.hE<gt>>) returns when
+given a C<struct> type and one of its field names ("member-designator" in
+C standardese).
+
+Neither using offsets nor adding C<x>'s to bridge the gaps is satisfactory.
+(Just imagine what happens if the structure changes.) What we really need
+is a way of saying "skip as many bytes as required to the next multiple of N".
+In fluent Templatese, you say this with C<x!N> where N is replaced by the
+appropriate value. Here's the next version of our struct packaging:
+
+ my $gappy = pack( 'c x!2 s c x!4 l!', $c1, $s, $c2, $l );
+
+That's certainly better, but we still have to know how long all the
+integers are, and portability is far away. Rather than C<2>,
+for instance, we want to say "however long a short is". But this can be
+done by enclosing the appropriate pack code in brackets: C<[s]>. So, here's
+the very best we can do:
+
+ my $gappy = pack( 'c x![s] s c x![l!] l!', $c1, $s, $c2, $l );
+
+
+=head2 Dealing with Endian-ness
+
+Now, imagine that we want to pack the data for a machine with a
+different byte-order. First, we'll have to figure out how big the data
+types on the target machine really are. Let's assume that the longs are
+32 bits wide and the shorts are 16 bits wide. You can then rewrite the
+template as:
+
+ my $gappy = pack( 'c x![s] s c x![l] l', $c1, $s, $c2, $l );
+
+If the target machine is little-endian, we could write:
+
+ my $gappy = pack( 'c x![s] s< c x![l] l<', $c1, $s, $c2, $l );
+
+This forces the short and the long members to be little-endian, and is
+just fine if you don't have too many struct members. But we could also
+use the byte-order modifier on a group and write the following:
+
+ my $gappy = pack( '( c x![s] s c x![l] l )<', $c1, $s, $c2, $l );
+
+This is not as short as before, but it makes it more obvious that we
+intend to have little-endian byte-order for a whole group, not only
+for individual template codes. It can also be more readable and easier
+to maintain.
+
+
+=head2 Alignment, Take 2
+
+I'm afraid that we're not quite through with the alignment catch yet. The
+hydra raises another ugly head when you pack arrays of structures:
+
+ typedef struct {
+ short count;
+ char glyph;
+ } cell_t;
+
+ typedef cell_t buffer_t[BUFLEN];
+
+Where's the catch? Padding is neither required before the first field C<count>,
+nor between this and the next field C<glyph>, so why can't we simply pack
+like this:
+
+ # something goes wrong here:
+ pack( 's!a' x @buffer,
+ map{ ( $_->{count}, $_->{glyph} ) } @buffer );
+
+This packs C<3*@buffer> bytes, but it turns out that the size of
+C<buffer_t> is four times C<BUFLEN>! The moral of the story is that
+the required alignment of a structure or array is propagated to the
+next higher level where we have to consider padding I<at the end>
+of each component as well. Thus the correct template is:
+
+ pack( 's!ax' x @buffer,
+ map{ ( $_->{count}, $_->{glyph} ) } @buffer );
+
+=head2 Alignment, Take 3
+
+And even if you take all the above into account, ANSI still lets this:
+
+ typedef struct {
+ char foo[2];
+ } foo_t;
+
+vary in size. The alignment constraint of the structure can be greater than
+any of its elements. [And if you think that this doesn't affect anything
+common, dismember the next cellphone that you see. Many have ARM cores, and
+the ARM structure rules make C<sizeof (foo_t)> == 4]
+
+=head2 Pointers for How to Use Them
+
+The title of this section indicates the second problem you may run into
+sooner or later when you pack C structures. If the function you intend
+to call expects a, say, C<void *> value, you I<cannot> simply take
+a reference to a Perl variable. (Although that value certainly is a
+memory address, it's not the address where the variable's contents are
+stored.)
+
+Template code C<P> promises to pack a "pointer to a fixed length string".
+Isn't this what we want? Let's try:
+
+ # allocate some storage and pack a pointer to it
+ my $memory = "\x00" x $size;
+ my $memptr = pack( 'P', $memory );
+
+But wait: doesn't C<pack> just return a sequence of bytes? How can we pass this
+string of bytes to some C code expecting a pointer which is, after all,
+nothing but a number? The answer is simple: We have to obtain the numeric
+address from the bytes returned by C<pack>.
+
+ my $ptr = unpack( 'L!', $memptr );
+
+Obviously this assumes that it is possible to typecast a pointer
+to an unsigned long and vice versa, which frequently works but should not
+be taken as a universal law. - Now that we have this pointer the next question
+is: How can we put it to good use? We need a call to some C function
+where a pointer is expected. The read(2) system call comes to mind:
+
+ ssize_t read(int fd, void *buf, size_t count);
+
+After reading L<perlfunc> explaining how to use C<syscall> we can write
+this Perl function copying a file to standard output:
+
+ require 'syscall.ph';
+ sub cat($){
+ my $path = shift();
+ my $size = -s $path;
+ my $memory = "\x00" x $size; # allocate some memory
+ my $ptr = unpack( 'L', pack( 'P', $memory ) );
+ open( F, $path ) || die( "$path: cannot open ($!)\n" );
+ my $fd = fileno(F);
+ my $res = syscall( &SYS_read, fileno(F), $ptr, $size );
+ print $memory;
+ close( F );
+ }
+
+This is neither a specimen of simplicity nor a paragon of portability but
+it illustrates the point: We are able to sneak behind the scenes and
+access Perl's otherwise well-guarded memory! (Important note: Perl's
+C<syscall> does I<not> require you to construct pointers in this roundabout
+way. You simply pass a string variable, and Perl forwards the address.)
+
+How does C<unpack> with C<P> work? Imagine some pointer in the buffer
+about to be unpacked: If it isn't the null pointer (which will smartly
+produce the C<undef> value) we have a start address - but then what?
+Perl has no way of knowing how long this "fixed length string" is, so
+it's up to you to specify the actual size as an explicit length after C<P>.
+
+ my $mem = "abcdefghijklmn";
+ print unpack( 'P5', pack( 'P', $mem ) ); # prints "abcde"
+
+As a consequence, C<pack> ignores any number or C<*> after C<P>.
+
+
+Now that we have seen C<P> at work, we might as well give C<p> a whirl.
+Why do we need a second template code for packing pointers at all? The
+answer lies behind the simple fact that an C<unpack> with C<p> promises
+a null-terminated string starting at the address taken from the buffer,
+and that implies a length for the data item to be returned:
+
+ my $buf = pack( 'p', "abc\x00efhijklmn" );
+ print unpack( 'p', $buf ); # prints "abc"
+
+
+
+Albeit this is apt to be confusing: As a consequence of the length being
+implied by the string's length, a number after pack code C<p> is a repeat
+count, not a length as after C<P>.
+
+
+Using C<pack(..., $x)> with C<P> or C<p> to get the address where C<$x> is
+actually stored must be used with circumspection. Perl's internal machinery
+considers the relation between a variable and that address as its very own
+private matter and doesn't really care that we have obtained a copy. Therefore:
+
+=over 4
+
+=item *
+
+Do not use C<pack> with C<p> or C<P> to obtain the address of variable
+that's bound to go out of scope (and thereby freeing its memory) before you
+are done with using the memory at that address.
+
+=item *
+
+Be very careful with Perl operations that change the value of the
+variable. Appending something to the variable, for instance, might require
+reallocation of its storage, leaving you with a pointer into no-man's land.
+
+=item *
+
+Don't think that you can get the address of a Perl variable
+when it is stored as an integer or double number! C<pack('P', $x)> will
+force the variable's internal representation to string, just as if you
+had written something like C<$x .= ''>.
+
+=back
+
+It's safe, however, to P- or p-pack a string literal, because Perl simply
+allocates an anonymous variable.
+
+
+
+=head1 Pack Recipes
+
+Here are a collection of (possibly) useful canned recipes for C<pack>
+and C<unpack>:
+
+ # Convert IP address for socket functions
+ pack( "C4", split /\./, "123.4.5.6" );
+
+ # Count the bits in a chunk of memory (e.g. a select vector)
+ unpack( '%32b*', $mask );
+
+ # Determine the endianness of your system
+ $is_little_endian = unpack( 'c', pack( 's', 1 ) );
+ $is_big_endian = unpack( 'xc', pack( 's', 1 ) );
+
+ # Determine the number of bits in a native integer
+ $bits = unpack( '%32I!', ~0 );
+
+ # Prepare argument for the nanosleep system call
+ my $timespec = pack( 'L!L!', $secs, $nanosecs );
+
+For a simple memory dump we unpack some bytes into just as
+many pairs of hex digits, and use C<map> to handle the traditional
+spacing - 16 bytes to a line:
+
+ my $i;
+ print map( ++$i % 16 ? "$_ " : "$_\n",
+ unpack( 'H2' x length( $mem ), $mem ) ),
+ length( $mem ) % 16 ? "\n" : '';
+
+
+=head1 Funnies Section
+
+ # Pulling digits out of nowhere...
+ print unpack( 'C', pack( 'x' ) ),
+ unpack( '%B*', pack( 'A' ) ),
+ unpack( 'H', pack( 'A' ) ),
+ unpack( 'A', unpack( 'C', pack( 'A' ) ) ), "\n";
+
+ # One for the road ;-)
+ my $advice = pack( 'all u can in a van' );
+
+
+=head1 Authors
+
+Simon Cozens and Wolfgang Laun.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlperf.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlperf.pod
new file mode 100755
index 00000000000..adc1ebb1589
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlperf.pod
@@ -0,0 +1,1182 @@
+=head1 NAME
+
+perlperf - Perl Performance and Optimization Techniques
+
+=head1 DESCRIPTION
+
+This is an introduction to the use of performance and optimization techniques
+which can be used with particular reference to perl programs. While many perl
+developers have come from other languages, and can use their prior knowledge
+where appropriate, there are many other people who might benefit from a few
+perl specific pointers. If you want the condensed version, perhaps the best
+advice comes from the renowned Japanese Samurai, Miyamoto Musashi, who said:
+
+ "Do Not Engage in Useless Activity"
+
+in 1645.
+
+=head1 OVERVIEW
+
+Perhaps the most common mistake programmers make is to attempt to optimize
+their code before a program actually does anything useful - this is a bad idea.
+There's no point in having an extremely fast program that doesn't work. The
+first job is to get a program to I<correctly> do something B<useful>, (not to
+mention ensuring the test suite is fully functional), and only then to consider
+optimizing it. Having decided to optimize existing working code, there are
+several simple but essential steps to consider which are intrinsic to any
+optimization process.
+
+=head2 ONE STEP SIDEWAYS
+
+Firstly, you need to establish a baseline time for the existing code, which
+timing needs to be reliable and repeatable. You'll probably want to use the
+C<Benchmark> or C<Devel::DProf> modules, or something similar, for this step,
+or perhaps the unix system C<time> utility, whichever is appropriate. See the
+base of this document for a longer list of benchmarking and profiling modules,
+and recommended further reading.
+
+=head2 ONE STEP FORWARD
+
+Next, having examined the program for I<hot spots>, (places where the code
+seems to run slowly), change the code with the intention of making it run
+faster. Using version control software, like C<subversion>, will ensure no
+changes are irreversible. It's too easy to fiddle here and fiddle there -
+don't change too much at any one time or you might not discover which piece of
+code B<really> was the slow bit.
+
+=head2 ANOTHER STEP SIDEWAYS
+
+It's not enough to say: "that will make it run faster", you have to check it.
+Rerun the code under control of the benchmarking or profiling modules, from the
+first step above, and check that the new code executed the B<same task> in
+I<less time>. Save your work and repeat...
+
+=head1 GENERAL GUIDELINES
+
+The critical thing when considering performance is to remember there is no such
+thing as a C<Golden Bullet>, which is why there are no rules, only guidelines.
+
+It is clear that inline code is going to be faster than subroutine or method
+calls, because there is less overhead, but this approach has the disadvantage
+of being less maintainable and comes at the cost of greater memory usage -
+there is no such thing as a free lunch. If you are searching for an element in
+a list, it can be more efficient to store the data in a hash structure, and
+then simply look to see whether the key is defined, rather than to loop through
+the entire array using grep() for instance. substr() may be (a lot) faster
+than grep() but not as flexible, so you have another trade-off to access. Your
+code may contain a line which takes 0.01 of a second to execute which if you
+call it 1,000 times, quite likely in a program parsing even medium sized files
+for instance, you already have a 10 second delay, in just one single code
+location, and if you call that line 100,000 times, your entire program will
+slow down to an unbearable crawl.
+
+Using a subroutine as part of your sort is a powerful way to get exactly what
+you want, but will usually be slower than the built-in I<alphabetic> C<cmp> and
+I<numeric> C<E<lt>=E<gt>> sort operators. It is possible to make multiple
+passes over your data, building indices to make the upcoming sort more
+efficient, and to use what is known as the C<OM> (Orcish Maneuver) to cache the
+sort keys in advance. The cache lookup, while a good idea, can itself be a
+source of slowdown by enforcing a double pass over the data - once to setup the
+cache, and once to sort the data. Using C<pack()> to extract the required sort
+key into a consistent string can be an efficient way to build a single string
+to compare, instead of using multiple sort keys, which makes it possible to use
+the standard, written in C<c> and fast, perl C<sort()> function on the output,
+and is the basis of the C<GRT> (Guttman Rossler Transform). Some string
+combinations can slow the C<GRT> down, by just being too plain complex for it's
+own good.
+
+For applications using database backends, the standard C<DBIx> namespace has
+tries to help with keeping things nippy, not least because it tries to I<not>
+query the database until the latest possible moment, but always read the docs
+which come with your choice of libraries. Among the many issues facing
+developers dealing with databases should remain aware of is to always use
+C<SQL> placeholders and to consider pre-fetching data sets when this might
+prove advantageous. Splitting up a large file by assigning multiple processes
+to parsing a single file, using say C<POE>, C<threads> or C<fork> can also be a
+useful way of optimizing your usage of the available C<CPU> resources, though
+this technique is fraught with concurrency issues and demands high attention to
+detail.
+
+Every case has a specific application and one or more exceptions, and there is
+no replacement for running a few tests and finding out which method works best
+for your particular environment, this is why writing optimal code is not an
+exact science, and why we love using Perl so much - TMTOWTDI.
+
+=head1 BENCHMARKS
+
+Here are a few examples to demonstrate usage of Perl's benchmarking tools.
+
+=head2 Assigning and Dereferencing Variables.
+
+I'm sure most of us have seen code which looks like, (or worse than), this:
+
+ if ( $obj->{_ref}->{_myscore} >= $obj->{_ref}->{_yourscore} ) {
+ ...
+
+This sort of code can be a real eyesore to read, as well as being very
+sensitive to typos, and it's much clearer to dereference the variable
+explicitly. We're side-stepping the issue of working with object-oriented
+programming techniques to encapsulate variable access via methods, only
+accessible through an object. Here we're just discussing the technical
+implementation of choice, and whether this has an effect on performance. We
+can see whether this dereferencing operation, has any overhead by putting
+comparative code in a file and running a C<Benchmark> test.
+
+# dereference
+
+ #!/usr/bin/perl
+
+ use strict;
+ use warnings;
+
+ use Benchmark;
+
+ my $ref = {
+ 'ref' => {
+ _myscore => '100 + 1',
+ _yourscore => '102 - 1',
+ },
+ };
+
+ timethese(1000000, {
+ 'direct' => sub {
+ my $x = $ref->{ref}->{_myscore} . $ref->{ref}->{_yourscore} ;
+ },
+ 'dereference' => sub {
+ my $ref = $ref->{ref};
+ my $myscore = $ref->{_myscore};
+ my $yourscore = $ref->{_yourscore};
+ my $x = $myscore . $yourscore;
+ },
+ });
+
+It's essential to run any timing measurements a sufficient number of times so
+the numbers settle on a numerical average, otherwise each run will naturally
+fluctuate due to variations in the environment, to reduce the effect of
+contention for C<CPU> resources and network bandwidth for instance. Running
+the above code for one million iterations, we can take a look at the report
+output by the C<Benchmark> module, to see which approach is the most effective.
+
+ $> perl dereference
+
+ Benchmark: timing 1000000 iterations of dereference, direct...
+ dereference: 2 wallclock secs ( 1.59 usr + 0.00 sys = 1.59 CPU) @ 628930.82/s (n=1000000)
+ direct: 1 wallclock secs ( 1.20 usr + 0.00 sys = 1.20 CPU) @ 833333.33/s (n=1000000)
+
+The difference is clear to see and the dereferencing approach is slower. While
+it managed to execute an average of 628,930 times a second during our test, the
+direct approach managed to run an additional 204,403 times, unfortunately.
+Unfortunately, because there are many examples of code written using the
+multiple layer direct variable access, and it's usually horrible. It is,
+however, miniscully faster. The question remains whether the minute gain is
+actually worth the eyestrain, or the loss of maintainability.
+
+=head2 Search and replace or tr
+
+If we have a string which needs to be modified, while a regex will almost
+always be much more flexible, C<tr>, an oft underused tool, can still be a
+useful. One scenario might be replace all vowels with another character. The
+regex solution might look like this:
+
+ $str =~ s/[aeiou]/x/g
+
+The C<tr> alternative might look like this:
+
+ $str =~ tr/aeiou/xxxxx/
+
+We can put that into a test file which we can run to check which approach is
+the fastest, using a global C<$STR> variable to assign to the C<my $str>
+variable so as to avoid perl trying to optimize any of the work away by
+noticing it's assigned only the once.
+
+# regex-transliterate
+
+ #!/usr/bin/perl
+
+ use strict;
+ use warnings;
+
+ use Benchmark;
+
+ my $STR = "$$-this and that";
+
+ timethese( 1000000, {
+ 'sr' => sub { my $str = $STR; $str =~ s/[aeiou]/x/g; return $str; },
+ 'tr' => sub { my $str = $STR; $str =~ tr/aeiou/xxxxx/; return $str; },
+ });
+
+Running the code gives us our results:
+
+ $> perl regex-transliterate
+
+ Benchmark: timing 1000000 iterations of sr, tr...
+ sr: 2 wallclock secs ( 1.19 usr + 0.00 sys = 1.19 CPU) @ 840336.13/s (n=1000000)
+ tr: 0 wallclock secs ( 0.49 usr + 0.00 sys = 0.49 CPU) @ 2040816.33/s (n=1000000)
+
+The C<tr> version is a clear winner. One solution is flexible, the other is
+fast - and it's appropriately the programmers choice which to use in the
+circumstances.
+
+Check the C<Benchmark> docs for further useful techniques.
+
+=head1 PROFILING TOOLS
+
+A slightly larger piece of code will provide something on which a profiler can
+produce more extensive reporting statistics. This example uses the simplistic
+C<wordmatch> program which parses a given input file and spews out a short
+report on the contents.
+
+# wordmatch
+
+ #!/usr/bin/perl
+
+ use strict;
+ use warnings;
+
+ =head1 NAME
+
+ filewords - word analysis of input file
+
+ =head1 SYNOPSIS
+
+ filewords -f inputfilename [-d]
+
+ =head1 DESCRIPTION
+
+ This program parses the given filename, specified with C<-f>, and displays a
+ simple analysis of the words found therein. Use the C<-d> switch to enable
+ debugging messages.
+
+ =cut
+
+ use FileHandle;
+ use Getopt::Long;
+
+ my $debug = 0;
+ my $file = '';
+
+ my $result = GetOptions (
+ 'debug' => \$debug,
+ 'file=s' => \$file,
+ );
+ die("invalid args") unless $result;
+
+ unless ( -f $file ) {
+ die("Usage: $0 -f filename [-d]");
+ }
+ my $FH = FileHandle->new("< $file") or die("unable to open file($file): $!");
+
+ my $i_LINES = 0;
+ my $i_WORDS = 0;
+ my %count = ();
+
+ my @lines = <$FH>;
+ foreach my $line ( @lines ) {
+ $i_LINES++;
+ $line =~ s/\n//;
+ my @words = split(/ +/, $line);
+ my $i_words = scalar(@words);
+ $i_WORDS = $i_WORDS + $i_words;
+ debug("line: $i_LINES supplying $i_words words: @words");
+ my $i_word = 0;
+ foreach my $word ( @words ) {
+ $i_word++;
+ $count{$i_LINES}{spec} += matches($i_word, $word, '[^a-zA-Z0-9]');
+ $count{$i_LINES}{only} += matches($i_word, $word, '^[^a-zA-Z0-9]+$');
+ $count{$i_LINES}{cons} += matches($i_word, $word, '^[(?i:bcdfghjklmnpqrstvwxyz)]+$');
+ $count{$i_LINES}{vows} += matches($i_word, $word, '^[(?i:aeiou)]+$');
+ $count{$i_LINES}{caps} += matches($i_word, $word, '^[(A-Z)]+$');
+ }
+ }
+
+ print report( %count );
+
+ sub matches {
+ my $i_wd = shift;
+ my $word = shift;
+ my $regex = shift;
+ my $has = 0;
+
+ if ( $word =~ /($regex)/ ) {
+ $has++ if $1;
+ }
+
+ debug("word: $i_wd ".($has ? 'matches' : 'does not match')." chars: /$regex/");
+
+ return $has;
+ }
+
+ sub report {
+ my %report = @_;
+ my %rep;
+
+ foreach my $line ( keys %report ) {
+ foreach my $key ( keys %{ $report{$line} } ) {
+ $rep{$key} += $report{$line}{$key};
+ }
+ }
+
+ my $report = qq|
+ $0 report for $file:
+ lines in file: $i_LINES
+ words in file: $i_WORDS
+ words with special (non-word) characters: $i_spec
+ words with only special (non-word) characters: $i_only
+ words with only consonants: $i_cons
+ words with only capital letters: $i_caps
+ words with only vowels: $i_vows
+ |;
+
+ return $report;
+ }
+
+ sub debug {
+ my $message = shift;
+
+ if ( $debug ) {
+ print STDERR "DBG: $message\n";
+ }
+ }
+
+ exit 0;
+
+=head2 Devel::DProf
+
+This venerable module has been the de-facto standard for Perl code profiling
+for more than a decade, but has been replaced by a number of other modules
+which have brought us back to the 21st century. Although you're recommended to
+evaluate your tool from the several mentioned here and from the CPAN list at
+the base of this document, (and currently L<Devel::NYTProf> seems to be the
+weapon of choice - see below), we'll take a quick look at the output from
+L<Devel::DProf> first, to set a baseline for Perl profiling tools. Run the
+above program under the control of C<Devel::DProf> by using the C<-d> switch on
+the command-line.
+
+ $> perl -d:DProf wordmatch -f perl5db.pl
+
+ <...multiple lines snipped...>
+
+ wordmatch report for perl5db.pl:
+ lines in file: 9428
+ words in file: 50243
+ words with special (non-word) characters: 20480
+ words with only special (non-word) characters: 7790
+ words with only consonants: 4801
+ words with only capital letters: 1316
+ words with only vowels: 1701
+
+C<Devel::DProf> produces a special file, called F<tmon.out> by default, and
+this file is read by the C<dprofpp> program, which is already installed as part
+of the C<Devel::DProf> distribution. If you call C<dprofpp> with no options,
+it will read the F<tmon.out> file in the current directory and produce a human
+readable statistics report of the run of your program. Note that this may take
+a little time.
+
+ $> dprofpp
+
+ Total Elapsed Time = 2.951677 Seconds
+ User+System Time = 2.871677 Seconds
+ Exclusive Times
+ %Time ExclSec CumulS #Calls sec/call Csec/c Name
+ 102. 2.945 3.003 251215 0.0000 0.0000 main::matches
+ 2.40 0.069 0.069 260643 0.0000 0.0000 main::debug
+ 1.74 0.050 0.050 1 0.0500 0.0500 main::report
+ 1.04 0.030 0.049 4 0.0075 0.0123 main::BEGIN
+ 0.35 0.010 0.010 3 0.0033 0.0033 Exporter::as_heavy
+ 0.35 0.010 0.010 7 0.0014 0.0014 IO::File::BEGIN
+ 0.00 - -0.000 1 - - Getopt::Long::FindOption
+ 0.00 - -0.000 1 - - Symbol::BEGIN
+ 0.00 - -0.000 1 - - Fcntl::BEGIN
+ 0.00 - -0.000 1 - - Fcntl::bootstrap
+ 0.00 - -0.000 1 - - warnings::BEGIN
+ 0.00 - -0.000 1 - - IO::bootstrap
+ 0.00 - -0.000 1 - - Getopt::Long::ConfigDefaults
+ 0.00 - -0.000 1 - - Getopt::Long::Configure
+ 0.00 - -0.000 1 - - Symbol::gensym
+
+C<dprofpp> will produce some quite detailed reporting on the activity of the
+C<wordmatch> program. The wallclock, user and system, times are at the top of
+the analysis, and after this are the main columns defining which define the
+report. Check the C<dprofpp> docs for details of the many options it supports.
+
+See also C<Apache::DProf> which hooks C<Devel::DProf> into C<mod_perl>.
+
+=head2 Devel::Profiler
+
+Let's take a look at the same program using a different profiler:
+C<Devel::Profiler>, a drop-in Perl-only replacement for C<Devel::DProf>. The
+usage is very slightly different in that instead of using the special C<-d:>
+flag, you pull C<Devel::Profiler> in directly as a module using C<-M>.
+
+ $> perl -MDevel::Profiler wordmatch -f perl5db.pl
+
+ <...multiple lines snipped...>
+
+ wordmatch report for perl5db.pl:
+ lines in file: 9428
+ words in file: 50243
+ words with special (non-word) characters: 20480
+ words with only special (non-word) characters: 7790
+ words with only consonants: 4801
+ words with only capital letters: 1316
+ words with only vowels: 1701
+
+
+C<Devel::Profiler> generates a tmon.out file which is compatible with the
+C<dprofpp> program, thus saving the construction of a dedicated statistics
+reader program. C<dprofpp> usage is therefore identical to the above example.
+
+ $> dprofpp
+
+ Total Elapsed Time = 20.984 Seconds
+ User+System Time = 19.981 Seconds
+ Exclusive Times
+ %Time ExclSec CumulS #Calls sec/call Csec/c Name
+ 49.0 9.792 14.509 251215 0.0000 0.0001 main::matches
+ 24.4 4.887 4.887 260643 0.0000 0.0000 main::debug
+ 0.25 0.049 0.049 1 0.0490 0.0490 main::report
+ 0.00 0.000 0.000 1 0.0000 0.0000 Getopt::Long::GetOptions
+ 0.00 0.000 0.000 2 0.0000 0.0000 Getopt::Long::ParseOptionSpec
+ 0.00 0.000 0.000 1 0.0000 0.0000 Getopt::Long::FindOption
+ 0.00 0.000 0.000 1 0.0000 0.0000 IO::File::new
+ 0.00 0.000 0.000 1 0.0000 0.0000 IO::Handle::new
+ 0.00 0.000 0.000 1 0.0000 0.0000 Symbol::gensym
+ 0.00 0.000 0.000 1 0.0000 0.0000 IO::File::open
+
+Interestingly we get slightly different results, which is mostly because the
+algorithm which generates the report is different, even though the output file
+format was allegedly identical. The elapsed, user and system times are clearly
+showing the time it took for C<Devel::Profiler> to execute it's own run, but
+the column listings feel more accurate somehow than the ones we had earlier
+from C<Devel::DProf>. The 102% figure has disappeared, for example. This is
+where we have to use the tools at our disposal, and recognise their pros and
+cons, before using them. Interestingly, the numbers of calls for each
+subroutine are identical in the two reports, it's the percentages which differ.
+As the author of C<Devel::Proviler> writes:
+
+ ...running HTML::Template's test suite under Devel::DProf shows output()
+ taking NO time but Devel::Profiler shows around 10% of the time is in output().
+ I don't know which to trust but my gut tells me something is wrong with
+ Devel::DProf. HTML::Template::output() is a big routine that's called for
+ every test. Either way, something needs fixing.
+
+YMMV.
+
+See also C<Devel::Apache::Profiler> which hooks C<Devel::Profiler> into C<mod_perl>.
+
+=head2 Devel::SmallProf
+
+The C<Devel::SmallProf> profiler examines the runtime of your Perl program and
+produces a line-by-line listing to show how many times each line was called,
+and how long each line took to execute. It is called by supplying the familiar
+C<-d> flag to Perl at runtime.
+
+ $> perl -d:SmallProf wordmatch -f perl5db.pl
+
+ <...multiple lines snipped...>
+
+ wordmatch report for perl5db.pl:
+ lines in file: 9428
+ words in file: 50243
+ words with special (non-word) characters: 20480
+ words with only special (non-word) characters: 7790
+ words with only consonants: 4801
+ words with only capital letters: 1316
+ words with only vowels: 1701
+
+C<Devel::SmallProf> writes it's output into a file called F<smallprof.out>, by
+default. The format of the file looks like this:
+
+ <num> <time> <ctime> <line>:<text>
+
+When the program has terminated, the output may be examined and sorted using
+any standard text filtering utilities. Something like the following may be
+sufficient:
+
+ $> cat smallprof.out | grep \d*: | sort -k3 | tac | head -n20
+
+ 251215 1.65674 7.68000 75: if ( $word =~ /($regex)/ ) {
+ 251215 0.03264 4.40000 79: debug("word: $i_wd ".($has ? 'matches' :
+ 251215 0.02693 4.10000 81: return $has;
+ 260643 0.02841 4.07000 128: if ( $debug ) {
+ 260643 0.02601 4.04000 126: my $message = shift;
+ 251215 0.02641 3.91000 73: my $has = 0;
+ 251215 0.03311 3.71000 70: my $i_wd = shift;
+ 251215 0.02699 3.69000 72: my $regex = shift;
+ 251215 0.02766 3.68000 71: my $word = shift;
+ 50243 0.59726 1.00000 59: $count{$i_LINES}{cons} =
+ 50243 0.48175 0.92000 61: $count{$i_LINES}{spec} =
+ 50243 0.00644 0.89000 56: my $i_cons = matches($i_word, $word,
+ 50243 0.48837 0.88000 63: $count{$i_LINES}{caps} =
+ 50243 0.00516 0.88000 58: my $i_caps = matches($i_word, $word, '^[(A-
+ 50243 0.00631 0.81000 54: my $i_spec = matches($i_word, $word, '[^a-
+ 50243 0.00496 0.80000 57: my $i_vows = matches($i_word, $word,
+ 50243 0.00688 0.80000 53: $i_word++;
+ 50243 0.48469 0.79000 62: $count{$i_LINES}{only} =
+ 50243 0.48928 0.77000 60: $count{$i_LINES}{vows} =
+ 50243 0.00683 0.75000 55: my $i_only = matches($i_word, $word, '^[^a-
+
+You can immediately see a slightly different focus to the subroutine profiling
+modules, and we start to see exactly which line of code is taking the most
+time. That regex line is looking a bit suspicious, for example. Remember that
+these tools are supposed to be used together, there is no single best way to
+profile your code, you need to use the best tools for the job.
+
+See also C<Apache::SmallProf> which hooks C<Devel::SmallProf> into C<mod_perl>.
+
+=head2 Devel::FastProf
+
+C<Devel::FastProf> is another Perl line profiler. This was written with a view
+to getting a faster line profiler, than is possible with for example
+C<Devel::SmallProf>, because it's written in C<C>. To use C<Devel::FastProf>,
+supply the C<-d> argument to Perl:
+
+ $> perl -d:FastProf wordmatch -f perl5db.pl
+
+ <...multiple lines snipped...>
+
+ wordmatch report for perl5db.pl:
+ lines in file: 9428
+ words in file: 50243
+ words with special (non-word) characters: 20480
+ words with only special (non-word) characters: 7790
+ words with only consonants: 4801
+ words with only capital letters: 1316
+ words with only vowels: 1701
+
+C<Devel::FastProf> writes statistics to the file F<fastprof.out> in the current
+directory. The output file, which can be specified, can be interpreted by using
+the C<fprofpp> command-line program.
+
+ $> fprofpp | head -n20
+
+ # fprofpp output format is:
+ # filename:line time count: source
+ wordmatch:75 3.93338 251215: if ( $word =~ /($regex)/ ) {
+ wordmatch:79 1.77774 251215: debug("word: $i_wd ".($has ? 'matches' : 'does not match')." chars: /$regex/");
+ wordmatch:81 1.47604 251215: return $has;
+ wordmatch:126 1.43441 260643: my $message = shift;
+ wordmatch:128 1.42156 260643: if ( $debug ) {
+ wordmatch:70 1.36824 251215: my $i_wd = shift;
+ wordmatch:71 1.36739 251215: my $word = shift;
+ wordmatch:72 1.35939 251215: my $regex = shift;
+
+Straightaway we can see that the number of times each line has been called is
+identical to the C<Devel::SmallProf> output, and the sequence is only very
+slightly different based on the ordering of the amount of time each line took
+to execute, C<if ( $debug ) { > and C<my $message = shift;>, for example. The
+differences in the actual times recorded might be in the algorithm used
+internally, or it could be due to system resource limitations or contention.
+
+See also the L<DBIx::Profiler> which will profile database queries running
+under the C<DBIx::*> namespace.
+
+=head2 Devel::NYTProf
+
+C<Devel::NYTProf> is the B<next generation> of Perl code profiler, fixing many
+shortcomings in other tools and implementing many cool features. First of all it
+can be used as either a I<line> profiler, a I<block> or a I<subroutine>
+profiler, all at once. It can also use sub-microsecond (100ns) resolution on
+systems which provide C<clock_gettime()>. It can be started and stopped even
+by the program being profiled. It's a one-line entry to profile C<mod_perl>
+applications. It's written in C<c> and is probably the fastest profiler
+available for Perl. The list of coolness just goes on. Enough of that, let's
+see how to it works - just use the familiar C<-d> switch to plug it in and run
+the code.
+
+ $> perl -d:NYTProf wordmatch -f perl5db.pl
+
+ wordmatch report for perl5db.pl:
+ lines in file: 9427
+ words in file: 50243
+ words with special (non-word) characters: 20480
+ words with only special (non-word) characters: 7790
+ words with only consonants: 4801
+ words with only capital letters: 1316
+ words with only vowels: 1701
+
+C<NYTProf> will generate a report database into the file F<nytprof.out> by
+default. Human readable reports can be generated from here by using the
+supplied C<nytprofhtml> (HTML output) and C<nytprofcsv> (CSV output) programs.
+We've used the unix sytem C<html2text> utility to convert the
+F<nytprof/index.html> file for convenience here.
+
+ $> html2text nytprof/index.html
+
+ Performance Profile Index
+ For wordmatch
+ Run on Fri Sep 26 13:46:39 2008
+ Reported on Fri Sep 26 13:47:23 2008
+
+ Top 15 Subroutines -- ordered by exclusive time
+ |Calls |P |F |Inclusive|Exclusive|Subroutine |
+ | | | |Time |Time | |
+ |251215|5 |1 |13.09263 |10.47692 |main:: |matches |
+ |260642|2 |1 |2.71199 |2.71199 |main:: |debug |
+ |1 |1 |1 |0.21404 |0.21404 |main:: |report |
+ |2 |2 |2 |0.00511 |0.00511 |XSLoader:: |load (xsub) |
+ |14 |14|7 |0.00304 |0.00298 |Exporter:: |import |
+ |3 |1 |1 |0.00265 |0.00254 |Exporter:: |as_heavy |
+ |10 |10|4 |0.00140 |0.00140 |vars:: |import |
+ |13 |13|1 |0.00129 |0.00109 |constant:: |import |
+ |1 |1 |1 |0.00360 |0.00096 |FileHandle:: |import |
+ |3 |3 |3 |0.00086 |0.00074 |warnings::register::|import |
+ |9 |3 |1 |0.00036 |0.00036 |strict:: |bits |
+ |13 |13|13|0.00032 |0.00029 |strict:: |import |
+ |2 |2 |2 |0.00020 |0.00020 |warnings:: |import |
+ |2 |1 |1 |0.00020 |0.00020 |Getopt::Long:: |ParseOptionSpec|
+ |7 |7 |6 |0.00043 |0.00020 |strict:: |unimport |
+
+ For more information see the full list of 189 subroutines.
+
+The first part of the report already shows the critical information regarding
+which subroutines are using the most time. The next gives some statistics
+about the source files profiled.
+
+ Source Code Files -- ordered by exclusive time then name
+ |Stmts |Exclusive|Avg. |Reports |Source File |
+ | |Time | | | |
+ |2699761|15.66654 |6e-06 |line . block . sub|wordmatch |
+ |35 |0.02187 |0.00062|line . block . sub|IO/Handle.pm |
+ |274 |0.01525 |0.00006|line . block . sub|Getopt/Long.pm |
+ |20 |0.00585 |0.00029|line . block . sub|Fcntl.pm |
+ |128 |0.00340 |0.00003|line . block . sub|Exporter/Heavy.pm |
+ |42 |0.00332 |0.00008|line . block . sub|IO/File.pm |
+ |261 |0.00308 |0.00001|line . block . sub|Exporter.pm |
+ |323 |0.00248 |8e-06 |line . block . sub|constant.pm |
+ |12 |0.00246 |0.00021|line . block . sub|File/Spec/Unix.pm |
+ |191 |0.00240 |0.00001|line . block . sub|vars.pm |
+ |77 |0.00201 |0.00003|line . block . sub|FileHandle.pm |
+ |12 |0.00198 |0.00016|line . block . sub|Carp.pm |
+ |14 |0.00175 |0.00013|line . block . sub|Symbol.pm |
+ |15 |0.00130 |0.00009|line . block . sub|IO.pm |
+ |22 |0.00120 |0.00005|line . block . sub|IO/Seekable.pm |
+ |198 |0.00085 |4e-06 |line . block . sub|warnings/register.pm|
+ |114 |0.00080 |7e-06 |line . block . sub|strict.pm |
+ |47 |0.00068 |0.00001|line . block . sub|warnings.pm |
+ |27 |0.00054 |0.00002|line . block . sub|overload.pm |
+ |9 |0.00047 |0.00005|line . block . sub|SelectSaver.pm |
+ |13 |0.00045 |0.00003|line . block . sub|File/Spec.pm |
+ |2701595|15.73869 | |Total |
+ |128647 |0.74946 | |Average |
+ | |0.00201 |0.00003|Median |
+ | |0.00121 |0.00003|Deviation |
+
+ Report produced by the NYTProf 2.03 Perl profiler, developed by Tim Bunce and
+ Adam Kaplan.
+
+At this point, if you're using the I<html> report, you can click through the
+various links to bore down into each subroutine and each line of code. Because
+we're using the text reporting here, and there's a whole directory full of
+reports built for each source file, we'll just display a part of the
+corresponding F<wordmatch-line.html> file, sufficient to give an idea of the
+sort of output you can expect from this cool tool.
+
+ $> html2text nytprof/wordmatch-line.html
+
+ Performance Profile -- -block view-.-line view-.-sub view-
+ For wordmatch
+ Run on Fri Sep 26 13:46:39 2008
+ Reported on Fri Sep 26 13:47:22 2008
+
+ File wordmatch
+
+ Subroutines -- ordered by exclusive time
+ |Calls |P|F|Inclusive|Exclusive|Subroutine |
+ | | | |Time |Time | |
+ |251215|5|1|13.09263 |10.47692 |main::|matches|
+ |260642|2|1|2.71199 |2.71199 |main::|debug |
+ |1 |1|1|0.21404 |0.21404 |main::|report |
+ |0 |0|0|0 |0 |main::|BEGIN |
+
+
+ |Line|Stmts.|Exclusive|Avg. |Code |
+ | | |Time | | |
+ |1 | | | |#!/usr/bin/perl |
+ |2 | | | | |
+ | | | | |use strict; |
+ |3 |3 |0.00086 |0.00029|# spent 0.00003s making 1 calls to strict:: |
+ | | | | |import |
+ | | | | |use warnings; |
+ |4 |3 |0.01563 |0.00521|# spent 0.00012s making 1 calls to warnings:: |
+ | | | | |import |
+ |5 | | | | |
+ |6 | | | |=head1 NAME |
+ |7 | | | | |
+ |8 | | | |filewords - word analysis of input file |
+ <...snip...>
+ |62 |1 |0.00445 |0.00445|print report( %count ); |
+ | | | | |# spent 0.21404s making 1 calls to main::report|
+ |63 | | | | |
+ | | | | |# spent 23.56955s (10.47692+2.61571) within |
+ | | | | |main::matches which was called 251215 times, |
+ | | | | |avg 0.00005s/call: # 50243 times |
+ | | | | |(2.12134+0.51939s) at line 57 of wordmatch, avg|
+ | | | | |0.00005s/call # 50243 times (2.17735+0.54550s) |
+ |64 | | | |at line 56 of wordmatch, avg 0.00005s/call # |
+ | | | | |50243 times (2.10992+0.51797s) at line 58 of |
+ | | | | |wordmatch, avg 0.00005s/call # 50243 times |
+ | | | | |(2.12696+0.51598s) at line 55 of wordmatch, avg|
+ | | | | |0.00005s/call # 50243 times (1.94134+0.51687s) |
+ | | | | |at line 54 of wordmatch, avg 0.00005s/call |
+ | | | | |sub matches { |
+ <...snip...>
+ |102 | | | | |
+ | | | | |# spent 2.71199s within main::debug which was |
+ | | | | |called 260642 times, avg 0.00001s/call: # |
+ | | | | |251215 times (2.61571+0s) by main::matches at |
+ |103 | | | |line 74 of wordmatch, avg 0.00001s/call # 9427 |
+ | | | | |times (0.09628+0s) at line 50 of wordmatch, avg|
+ | | | | |0.00001s/call |
+ | | | | |sub debug { |
+ |104 |260642|0.58496 |2e-06 |my $message = shift; |
+ |105 | | | | |
+ |106 |260642|1.09917 |4e-06 |if ( $debug ) { |
+ |107 | | | |print STDERR "DBG: $message\n"; |
+ |108 | | | |} |
+ |109 | | | |} |
+ |110 | | | | |
+ |111 |1 |0.01501 |0.01501|exit 0; |
+ |112 | | | | |
+
+Oodles of very useful information in there - this seems to be the way forward.
+
+See also C<Devel::NYTProf::Apache> which hooks C<Devel::NYTProf> into C<mod_perl>.
+
+=head1 SORTING
+
+Perl modules are not the only tools a performance analyst has at their
+disposal, system tools like C<time> should not be overlooked as the next
+example shows, where we take a quick look at sorting. Many books, theses and
+articles, have been written about efficient sorting algorithms, and this is not
+the place to repeat such work, there's several good sorting modules which
+deserve taking a look at too: C<Sort::Maker>, C<Sort::Key> spring to mind.
+However, it's still possible to make some observations on certain Perl specific
+interpretations on issues relating to sorting data sets and give an example or
+two with regard to how sorting large data volumes can effect performance.
+Firstly, an often overlooked point when sorting large amounts of data, one can
+attempt to reduce the data set to be dealt with and in many cases C<grep()> can
+be quite useful as a simple filter:
+
+ @data = sort grep { /$filter/ } @incoming
+
+A command such as this can vastly reduce the volume of material to actually
+sort through in the first place, and should not be too lightly disregarded
+purely on the basis of it's simplicity. The C<KISS> principle is too often
+overlooked - the next example uses the simple system C<time> utility to
+demonstrate. Let's take a look at an actual example of sorting the contents of
+a large file, an apache logfile would do. This one has over a quarter of a
+million lines, is 50M in size, and a snippet of it looks like this:
+
+# logfile
+
+ 188.209-65-87.adsl-dyn.isp.belgacom.be - - [08/Feb/2007:12:57:16 +0000] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
+ 188.209-65-87.adsl-dyn.isp.belgacom.be - - [08/Feb/2007:12:57:16 +0000] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
+ 151.56.71.198 - - [08/Feb/2007:12:57:41 +0000] "GET /suse-on-vaio.html HTTP/1.1" 200 2858 "http://www.linux-on-laptops.com/sony.html" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"
+ 151.56.71.198 - - [08/Feb/2007:12:57:42 +0000] "GET /data/css HTTP/1.1" 404 206 "http://www.rfi.net/suse-on-vaio.html" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"
+ 151.56.71.198 - - [08/Feb/2007:12:57:43 +0000] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"
+ 217.113.68.60 - - [08/Feb/2007:13:02:15 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
+ 217.113.68.60 - - [08/Feb/2007:13:02:16 +0000] "GET /data/css HTTP/1.1" 404 206 "http://www.rfi.net/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
+ debora.to.isac.cnr.it - - [08/Feb/2007:13:03:58 +0000] "GET /suse-on-vaio.html HTTP/1.1" 200 2858 "http://www.linux-on-laptops.com/sony.html" "Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.0 (like Gecko)"
+ debora.to.isac.cnr.it - - [08/Feb/2007:13:03:58 +0000] "GET /data/css HTTP/1.1" 404 206 "http://www.rfi.net/suse-on-vaio.html" "Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.0 (like Gecko)"
+ debora.to.isac.cnr.it - - [08/Feb/2007:13:03:58 +0000] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.0 (like Gecko)"
+ 195.24.196.99 - - [08/Feb/2007:13:26:48 +0000] "GET / HTTP/1.0" 200 3309 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9"
+ 195.24.196.99 - - [08/Feb/2007:13:26:58 +0000] "GET /data/css HTTP/1.0" 404 206 "http://www.rfi.net/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9"
+ 195.24.196.99 - - [08/Feb/2007:13:26:59 +0000] "GET /favicon.ico HTTP/1.0" 404 209 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9"
+ crawl1.cosmixcorp.com - - [08/Feb/2007:13:27:57 +0000] "GET /robots.txt HTTP/1.0" 200 179 "-" "voyager/1.0"
+ crawl1.cosmixcorp.com - - [08/Feb/2007:13:28:25 +0000] "GET /links.html HTTP/1.0" 200 3413 "-" "voyager/1.0"
+ fhm226.internetdsl.tpnet.pl - - [08/Feb/2007:13:37:32 +0000] "GET /suse-on-vaio.html HTTP/1.1" 200 2858 "http://www.linux-on-laptops.com/sony.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
+ fhm226.internetdsl.tpnet.pl - - [08/Feb/2007:13:37:34 +0000] "GET /data/css HTTP/1.1" 404 206 "http://www.rfi.net/suse-on-vaio.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
+ 80.247.140.134 - - [08/Feb/2007:13:57:35 +0000] "GET / HTTP/1.1" 200 3309 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)"
+ 80.247.140.134 - - [08/Feb/2007:13:57:37 +0000] "GET /data/css HTTP/1.1" 404 206 "http://www.rfi.net" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)"
+ pop.compuscan.co.za - - [08/Feb/2007:14:10:43 +0000] "GET / HTTP/1.1" 200 3309 "-" "www.clamav.net"
+ livebot-207-46-98-57.search.live.com - - [08/Feb/2007:14:12:04 +0000] "GET /robots.txt HTTP/1.0" 200 179 "-" "msnbot/1.0 (+http://search.msn.com/msnbot.htm)"
+ livebot-207-46-98-57.search.live.com - - [08/Feb/2007:14:12:04 +0000] "GET /html/oracle.html HTTP/1.0" 404 214 "-" "msnbot/1.0 (+http://search.msn.com/msnbot.htm)"
+ dslb-088-064-005-154.pools.arcor-ip.net - - [08/Feb/2007:14:12:15 +0000] "GET / HTTP/1.1" 200 3309 "-" "www.clamav.net"
+ 196.201.92.41 - - [08/Feb/2007:14:15:01 +0000] "GET / HTTP/1.1" 200 3309 "-" "MOT-L7/08.B7.DCR MIB/2.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1"
+
+The specific task here is to sort the 286,525 lines of this file by Response
+Code, Query, Browser, Referring Url, and lastly Date. One solution might be to
+use the following code, which iterates over the files given on the
+command-line.
+
+# sort-apache-log
+
+ #!/usr/bin/perl -n
+
+ use strict;
+ use warnings;
+
+ my @data;
+
+ LINE:
+ while ( <> ) {
+ my $line = $_;
+ if (
+ $line =~ m/^(
+ ([\w\.\-]+) # client
+ \s*-\s*-\s*\[
+ ([^]]+) # date
+ \]\s*"\w+\s*
+ (\S+) # query
+ [^"]+"\s*
+ (\d+) # status
+ \s+\S+\s+"[^"]*"\s+"
+ ([^"]*) # browser
+ "
+ .*
+ )$/x
+ ) {
+ my @chunks = split(/ +/, $line);
+ my $ip = $1;
+ my $date = $2;
+ my $query = $3;
+ my $status = $4;
+ my $browser = $5;
+
+ push(@data, [$ip, $date, $query, $status, $browser, $line]);
+ }
+ }
+
+ my @sorted = sort {
+ $a->[3] cmp $b->[3]
+ ||
+ $a->[2] cmp $b->[2]
+ ||
+ $a->[0] cmp $b->[0]
+ ||
+ $a->[1] cmp $b->[1]
+ ||
+ $a->[4] cmp $b->[4]
+ } @data;
+
+ foreach my $data ( @sorted ) {
+ print $data->[5];
+ }
+
+ exit 0;
+
+When running this program, redirect C<STDOUT> so it is possible to check the
+output is correct from following test runs and use the system C<time> utility
+to check the overall runtime.
+
+ $> time ./sort-apache-log logfile > out-sort
+
+ real 0m17.371s
+ user 0m15.757s
+ sys 0m0.592s
+
+The program took just over 17 wallclock seconds to run. Note the different
+values C<time> outputs, it's important to always use the same one, and to not
+confuse what each one means.
+
+=over 4
+
+=item Elapsed Real Time
+
+The overall, or wallclock, time between when C<time> was called, and when it
+terminates. The elapsed time includes both user and system times, and time
+spent waiting for other users and processes on the system. Inevitably, this is
+the most approximate of the measurements given.
+
+=item User CPU Time
+
+The user time is the amount of time the entire process spent on behalf of the
+user on this system executing this program.
+
+=item System CPU Time
+
+The system time is the amount of time the kernel itself spent executing
+routines, or system calls, on behalf of this process user.
+
+=back
+
+Running this same process as a C<Schwarzian Transform> it is possible to
+eliminate the input and output arrays for storing all the data, and work on the
+input directly as it arrives too. Otherwise, the code looks fairly similar:
+
+# sort-apache-log-schwarzian
+
+ #!/usr/bin/perl -n
+
+ use strict;
+ use warnings;
+
+ print
+
+ map $_->[0] =>
+
+ sort {
+ $a->[4] cmp $b->[4]
+ ||
+ $a->[3] cmp $b->[3]
+ ||
+ $a->[1] cmp $b->[1]
+ ||
+ $a->[2] cmp $b->[2]
+ ||
+ $a->[5] cmp $b->[5]
+ }
+ map [ $_, m/^(
+ ([\w\.\-]+) # client
+ \s*-\s*-\s*\[
+ ([^]]+) # date
+ \]\s*"\w+\s*
+ (\S+) # query
+ [^"]+"\s*
+ (\d+) # status
+ \s+\S+\s+"[^"]*"\s+"
+ ([^"]*) # browser
+ "
+ .*
+ )$/xo ]
+
+ => <>;
+
+ exit 0;
+
+Run the new code against the same logfile, as above, to check the new time.
+
+ $> time ./sort-apache-log-schwarzian logfile > out-schwarz
+
+ real 0m9.664s
+ user 0m8.873s
+ sys 0m0.704s
+
+The time has been cut in half, which is a respectable speed improvement by any
+standard. Naturally, it is important to check the output is consistent with
+the first program run, this is where the unix system C<cksum> utility comes in.
+
+ $> cksum out-sort out-schwarz
+ 3044173777 52029194 out-sort
+ 3044173777 52029194 out-schwarz
+
+BTW. Beware too of pressure from managers who see you speed a program up by 50%
+of the runtime once, only to get a request one month later to do the same again
+(true story) - you'll just have to point out your only human, even if you are a
+Perl programmer, and you'll see what you can do...
+
+=head1 LOGGING
+
+An essential part of any good development process is appropriate error handling
+with appropriately informative messages, however there exists a school of
+thought which suggests that log files should be I<chatty>, as if the chain of
+unbroken output somehow ensures the survival of the program. If speed is in
+any way an issue, this approach is wrong.
+
+A common sight is code which looks something like this:
+
+ logger->debug( "A logging message via process-id: $$ INC: " . Dumper(\%INC) )
+
+The problem is that this code will always be parsed and executed, even when the
+debug level set in the logging configuration file is zero. Once the debug()
+subroutine has been entered, and the internal C<$debug> variable confirmed to
+be zero, for example, the message which has been sent in will be discarded and
+the program will continue. In the example given though, the \%INC hash will
+already have been dumped, and the message string constructed, all of which work
+could be bypassed by a debug variable at the statement level, like this:
+
+ logger->debug( "A logging message via process-id: $$ INC: " . Dumper(\%INC) ) if $DEBUG;
+
+This effect can be demonstrated by setting up a test script with both forms,
+including a C<debug()> subroutine to emulate typical C<logger()> functionality.
+
+# ifdebug
+
+ #!/usr/bin/perl
+
+ use strict;
+ use warnings;
+
+ use Benchmark;
+ use Data::Dumper;
+ my $DEBUG = 0;
+
+ sub debug {
+ my $msg = shift;
+
+ if ( $DEBUG ) {
+ print "DEBUG: $msg\n";
+ }
+ };
+
+ timethese(100000, {
+ 'debug' => sub {
+ debug( "A $0 logging message via process-id: $$" . Dumper(\%INC) )
+ },
+ 'ifdebug' => sub {
+ debug( "A $0 logging message via process-id: $$" . Dumper(\%INC) ) if $DEBUG
+ },
+ });
+
+Let's see what C<Benchmark> makes of this:
+
+ $> perl ifdebug
+ Benchmark: timing 100000 iterations of constant, sub...
+ ifdebug: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 10000000.00/s (n=100000)
+ (warning: too few iterations for a reliable count)
+ debug: 14 wallclock secs (13.18 usr + 0.04 sys = 13.22 CPU) @ 7564.30/s (n=100000)
+
+In the one case the code, which does exactly the same thing as far as
+outputting any debugging information is concerned, in other words nothing,
+takes 14 seconds, and in the other case the code takes one hundredth of a
+second. Looks fairly definitive. Use a C<$DEBUG> variable BEFORE you call the
+subroutine, rather than relying on the smart functionality inside it.
+
+=head2 Logging if DEBUG (constant)
+
+It's possible to take the previous idea a little further, by using a compile
+time C<DEBUG> constant.
+
+# ifdebug-constant
+
+ #!/usr/bin/perl
+
+ use strict;
+ use warnings;
+
+ use Benchmark;
+ use Data::Dumper;
+ use constant
+ DEBUG => 0
+ ;
+
+ sub debug {
+ if ( DEBUG ) {
+ my $msg = shift;
+ print "DEBUG: $msg\n";
+ }
+ };
+
+ timethese(100000, {
+ 'debug' => sub {
+ debug( "A $0 logging message via process-id: $$" . Dumper(\%INC) )
+ },
+ 'constant' => sub {
+ debug( "A $0 logging message via process-id: $$" . Dumper(\%INC) ) if DEBUG
+ },
+ });
+
+Running this program produces the following output:
+
+ $> perl ifdebug-constant
+ Benchmark: timing 100000 iterations of constant, sub...
+ constant: 0 wallclock secs (-0.00 usr + 0.00 sys = -0.00 CPU) @ -7205759403792793600000.00/s (n=100000)
+ (warning: too few iterations for a reliable count)
+ sub: 14 wallclock secs (13.09 usr + 0.00 sys = 13.09 CPU) @ 7639.42/s (n=100000)
+
+The C<DEBUG> constant wipes the floor with even the C<$debug> variable,
+clocking in at minus zero seconds, and generates a "warning: too few iterations
+for a reliable count" message into the bargain. To see what is really going
+on, and why we had too few iterations when we thought we asked for 100000, we
+can use the very useful C<B::Deparse> to inspect the new code:
+
+ $> perl -MO=Deparse ifdebug-constant
+
+ use Benchmark;
+ use Data::Dumper;
+ use constant ('DEBUG', 0);
+ sub debug {
+ use warnings;
+ use strict 'refs';
+ 0;
+ }
+ use warnings;
+ use strict 'refs';
+ timethese(100000, {'sub', sub {
+ debug "A $0 logging message via process-id: $$" . Dumper(\%INC);
+ }
+ , 'constant', sub {
+ 0;
+ }
+ });
+ ifdebug-constant syntax OK
+
+The output shows the constant() subroutine we're testing being replaced with
+the value of the C<DEBUG> constant: zero. The line to be tested has been
+completely optimized away, and you can't get much more efficient than that.
+
+=head1 POSTSCRIPT
+
+This document has provided several way to go about identifying hot-spots, and
+checking whether any modifications have improved the runtime of the code.
+
+As a final thought, remember that it's not (at the time of writing) possible to
+produce a useful program which will run in zero or negative time and this basic
+principle can be written as: I<useful programs are slow> by their very
+definition. It is of course possible to write a nearly instantaneous program,
+but it's not going to do very much, here's a very efficient one:
+
+ $> perl -e 0
+
+Optimizing that any further is a job for C<p5p>.
+
+=head1 SEE ALSO
+
+Further reading can be found using the modules and links below.
+
+=head2 PERLDOCS
+
+For example: C<perldoc -f sort>.
+
+L<perlfaq4>.
+
+L<perlfork>, L<perlfunc>, L<perlretut>, L<perlthrtut>.
+
+L<threads>.
+
+=head2 MAN PAGES
+
+C<time>.
+
+=head2 MODULES
+
+It's not possible to individually showcase all the performance related code for
+Perl here, naturally, but here's a short list of modules from the CPAN which
+deserve further attention.
+
+ Apache::DProf
+ Apache::SmallProf
+ Benchmark
+ DBIx::Profiler
+ Devel::AutoProfiler
+ Devel::DProf
+ Devel::DProfLB
+ Devel::FastProf
+ Devel::GraphVizProf
+ Devel::NYTProf
+ Devel::NYTProf::Apache
+ Devel::Profiler
+ Devel::Profile
+ Devel::Profit
+ Devel::SmallProf
+ Devel::WxProf
+ POE::Devel::Profiler
+ Sort::Key
+ Sort::Maker
+
+=head2 URLS
+
+Very useful online reference material:
+
+ http://www.ccl4.org/~nick/P/Fast_Enough/
+
+ http://www-128.ibm.com/developerworks/library/l-optperl.html
+
+ http://perlbuzz.com/2007/11/bind-output-variables-in-dbi-for-speed-and-safety.html
+
+ http://en.wikipedia.org/wiki/Performance_analysis
+
+ http://apache.perl.org/docs/1.0/guide/performance.html
+
+ http://perlgolf.sourceforge.net/
+
+ http://www.sysarch.com/Perl/sort_paper.html
+
+ http://www.unix.org.ua/orelly/perl/prog/ch08_03.htm
+
+=head1 AUTHOR
+
+Richard Foley <richard.foley@rfi.net> Copyright (c) 2008
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlplan9.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlplan9.pod
new file mode 100755
index 00000000000..5e53c05bdb9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlplan9.pod
@@ -0,0 +1,146 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+perlplan9 - Plan 9-specific documentation for Perl
+
+=head1 DESCRIPTION
+
+These are a few notes describing features peculiar to
+Plan 9 Perl. As such, it is not intended to be a replacement
+for the rest of the Perl 5 documentation (which is both
+copious and excellent). If you have any questions to
+which you can't find answers in these man pages, contact
+Luther Huffman at lutherh@stratcom.com and we'll try to
+answer them.
+
+=head2 Invoking Perl
+
+Perl is invoked from the command line as described in
+L<perl>. Most perl scripts, however, do have a first line
+such as "#!/usr/local/bin/perl". This is known as a shebang
+(shell-bang) statement and tells the OS shell where to find
+the perl interpreter. In Plan 9 Perl this statement should be
+"#!/bin/perl" if you wish to be able to directly invoke the
+script by its name.
+ Alternatively, you may invoke perl with the command "Perl"
+instead of "perl". This will produce Acme-friendly error
+messages of the form "filename:18".
+
+Some scripts, usually identified with a *.PL extension, are
+self-configuring and are able to correctly create their own
+shebang path from config information located in Plan 9
+Perl. These you won't need to be worried about.
+
+=head2 What's in Plan 9 Perl
+
+Although Plan 9 Perl currently only provides static
+loading, it is built with a number of useful extensions.
+These include Opcode, FileHandle, Fcntl, and POSIX. Expect
+to see others (and DynaLoading!) in the future.
+
+=head2 What's not in Plan 9 Perl
+
+As mentioned previously, dynamic loading isn't currently
+available nor is MakeMaker. Both are high-priority items.
+
+=head2 Perl5 Functions not currently supported in Plan 9 Perl
+
+Some, such as C<chown> and C<umask> aren't provided
+because the concept does not exist within Plan 9. Others,
+such as some of the socket-related functions, simply
+haven't been written yet. Many in the latter category
+may be supported in the future.
+
+The functions not currently implemented include:
+
+ chown, chroot, dbmclose, dbmopen, getsockopt,
+ setsockopt, recvmsg, sendmsg, getnetbyname,
+ getnetbyaddr, getnetent, getprotoent, getservent,
+ sethostent, setnetent, setprotoent, setservent,
+ endservent, endnetent, endprotoent, umask
+
+There may be several other functions that have undefined
+behavior so this list shouldn't be considered complete.
+
+=head2 Signals in Plan 9 Perl
+
+For compatibility with perl scripts written for the Unix
+environment, Plan 9 Perl uses the POSIX signal emulation
+provided in Plan 9's ANSI POSIX Environment (APE). Signal stacking
+isn't supported. The signals provided are:
+
+ SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT,
+ SIGFPE, SIGKILL, SIGSEGV, SIGPIPE, SIGPIPE, SIGALRM,
+ SIGTERM, SIGUSR1, SIGUSR2, SIGCHLD, SIGCONT,
+ SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU
+
+=head1 COMPILING AND INSTALLING PERL ON PLAN 9
+
+WELCOME to Plan 9 Perl, brave soul!
+
+ This is a preliminary alpha version of Plan 9 Perl. Still to be
+implemented are MakeMaker and DynaLoader. Many perl commands are
+missing or currently behave in an inscrutable manner. These gaps will,
+with perseverance and a modicum of luck, be remedied in the near
+future.To install this software:
+
+1. Create the source directories and libraries for perl by running the
+plan9/setup.rc command (i.e., located in the plan9 subdirectory).
+Note: the setup routine assumes that you haven't dearchived these
+files into /sys/src/cmd/perl. After running setup.rc you may delete
+the copy of the source you originally detarred, as source code has now
+been installed in /sys/src/cmd/perl. If you plan on installing perl
+binaries for all architectures, run "setup.rc -a".
+
+2. After making sure that you have adequate privileges to build system
+software, from /sys/src/cmd/perl/5.00301 (adjust version
+appropriately) run:
+
+ mk install
+
+If you wish to install perl versions for all architectures (68020,
+mips, sparc and 386) run:
+
+ mk installall
+
+3. Wait. The build process will take a *long* time because perl
+bootstraps itself. A 75MHz Pentium, 16MB RAM machine takes roughly 30
+minutes to build the distribution from scratch.
+
+=head2 Installing Perl Documentation on Plan 9
+
+This perl distribution comes with a tremendous amount of
+documentation. To add these to the built-in manuals that come with
+Plan 9, from /sys/src/cmd/perl/5.00301 (adjust version appropriately)
+run:
+
+ mk man
+
+To begin your reading, start with:
+
+ man perl
+
+This is a good introduction and will direct you towards other man
+pages that may interest you.
+
+(Note: "mk man" may produce some extraneous noise. Fear not.)
+
+=head1 BUGS
+
+"As many as there are grains of sand on all the beaches of the
+world . . ." - Carl Sagan
+
+=head1 Revision date
+
+This document was revised 09-October-1996 for Perl 5.003_7.
+
+=head1 AUTHOR
+
+Direct questions, comments, and the unlikely bug report (ahem) direct
+comments toward:
+
+Luther Huffman, lutherh@stratcom.com,
+Strategic Computer Solutions, Inc.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlpod.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlpod.pod
new file mode 100755
index 00000000000..827548b8ebd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlpod.pod
@@ -0,0 +1,732 @@
+
+=for comment
+This document is in Pod format. To read this, use a Pod formatter,
+like "perldoc perlpod".
+
+=head1 NAME
+X<POD> X<plain old documentation>
+
+perlpod - the Plain Old Documentation format
+
+=head1 DESCRIPTION
+
+Pod is a simple-to-use markup language used for writing documentation
+for Perl, Perl programs, and Perl modules.
+
+Translators are available for converting Pod to various formats
+like plain text, HTML, man pages, and more.
+
+Pod markup consists of three basic kinds of paragraphs:
+L<ordinary|/"Ordinary Paragraph">,
+L<verbatim|/"Verbatim Paragraph">, and
+L<command|/"Command Paragraph">.
+
+
+=head2 Ordinary Paragraph
+X<POD, ordinary paragraph>
+
+Most paragraphs in your documentation will be ordinary blocks
+of text, like this one. You can simply type in your text without
+any markup whatsoever, and with just a blank line before and
+after. When it gets formatted, it will undergo minimal formatting,
+like being rewrapped, probably put into a proportionally spaced
+font, and maybe even justified.
+
+You can use formatting codes in ordinary paragraphs, for B<bold>,
+I<italic>, C<code-style>, L<hyperlinks|perlfaq>, and more. Such
+codes are explained in the "L<Formatting Codes|/"Formatting Codes">"
+section, below.
+
+
+=head2 Verbatim Paragraph
+X<POD, verbatim paragraph> X<verbatim>
+
+Verbatim paragraphs are usually used for presenting a codeblock or
+other text which does not require any special parsing or formatting,
+and which shouldn't be wrapped.
+
+A verbatim paragraph is distinguished by having its first character
+be a space or a tab. (And commonly, all its lines begin with spaces
+and/or tabs.) It should be reproduced exactly, with tabs assumed to
+be on 8-column boundaries. There are no special formatting codes,
+so you can't italicize or anything like that. A \ means \, and
+nothing else.
+
+
+=head2 Command Paragraph
+X<POD, command>
+
+A command paragraph is used for special treatment of whole chunks
+of text, usually as headings or parts of lists.
+
+All command paragraphs (which are typically only one line long) start
+with "=", followed by an identifier, followed by arbitrary text that
+the command can use however it pleases. Currently recognized commands
+are
+
+ =pod
+ =head1 Heading Text
+ =head2 Heading Text
+ =head3 Heading Text
+ =head4 Heading Text
+ =over indentlevel
+ =item stuff
+ =back
+ =begin format
+ =end format
+ =for format text...
+ =encoding type
+ =cut
+
+To explain them each in detail:
+
+=over
+
+=item C<=head1 I<Heading Text>>
+X<=head1> X<=head2> X<=head3> X<=head4>
+X<head1> X<head2> X<head3> X<head4>
+
+=item C<=head2 I<Heading Text>>
+
+=item C<=head3 I<Heading Text>>
+
+=item C<=head4 I<Heading Text>>
+
+Head1 through head4 produce headings, head1 being the highest
+level. The text in the rest of this paragraph is the content of the
+heading. For example:
+
+ =head2 Object Attributes
+
+The text "Object Attributes" comprises the heading there. (Note that
+head3 and head4 are recent additions, not supported in older Pod
+translators.) The text in these heading commands can use
+formatting codes, as seen here:
+
+ =head2 Possible Values for C<$/>
+
+Such commands are explained in the
+"L<Formatting Codes|/"Formatting Codes">" section, below.
+
+=item C<=over I<indentlevel>>
+X<=over> X<=item> X<=back> X<over> X<item> X<back>
+
+=item C<=item I<stuff...>>
+
+=item C<=back>
+
+Item, over, and back require a little more explanation: "=over" starts
+a region specifically for the generation of a list using "=item"
+commands, or for indenting (groups of) normal paragraphs. At the end
+of your list, use "=back" to end it. The I<indentlevel> option to
+"=over" indicates how far over to indent, generally in ems (where
+one em is the width of an "M" in the document's base font) or roughly
+comparable units; if there is no I<indentlevel> option, it defaults
+to four. (And some formatters may just ignore whatever I<indentlevel>
+you provide.) In the I<stuff> in C<=item I<stuff...>>, you may
+use formatting codes, as seen here:
+
+ =item Using C<$|> to Control Buffering
+
+Such commands are explained in the
+"L<Formatting Codes|/"Formatting Codes">" section, below.
+
+Note also that there are some basic rules to using "=over" ...
+"=back" regions:
+
+=over
+
+=item *
+
+Don't use "=item"s outside of an "=over" ... "=back" region.
+
+=item *
+
+The first thing after the "=over" command should be an "=item", unless
+there aren't going to be any items at all in this "=over" ... "=back"
+region.
+
+=item *
+
+Don't put "=headI<n>" commands inside an "=over" ... "=back" region.
+
+=item *
+
+And perhaps most importantly, keep the items consistent: either use
+"=item *" for all of them, to produce bullets; or use "=item 1.",
+"=item 2.", etc., to produce numbered lists; or use "=item foo",
+"=item bar", etc. -- namely, things that look nothing like bullets or
+numbers.
+
+If you start with bullets or numbers, stick with them, as
+formatters use the first "=item" type to decide how to format the
+list.
+
+=back
+
+=item C<=cut>
+X<=cut> X<cut>
+
+To end a Pod block, use a blank line,
+then a line beginning with "=cut", and a blank
+line after it. This lets Perl (and the Pod formatter) know that
+this is where Perl code is resuming. (The blank line before the "=cut"
+is not technically necessary, but many older Pod processors require it.)
+
+=item C<=pod>
+X<=pod> X<pod>
+
+The "=pod" command by itself doesn't do much of anything, but it
+signals to Perl (and Pod formatters) that a Pod block starts here. A
+Pod block starts with I<any> command paragraph, so a "=pod" command is
+usually used just when you want to start a Pod block with an ordinary
+paragraph or a verbatim paragraph. For example:
+
+ =item stuff()
+
+ This function does stuff.
+
+ =cut
+
+ sub stuff {
+ ...
+ }
+
+ =pod
+
+ Remember to check its return value, as in:
+
+ stuff() || die "Couldn't do stuff!";
+
+ =cut
+
+=item C<=begin I<formatname>>
+X<=begin> X<=end> X<=for> X<begin> X<end> X<for>
+
+=item C<=end I<formatname>>
+
+=item C<=for I<formatname> I<text...>>
+
+For, begin, and end will let you have regions of text/code/data that
+are not generally interpreted as normal Pod text, but are passed
+directly to particular formatters, or are otherwise special. A
+formatter that can use that format will use the region, otherwise it
+will be completely ignored.
+
+A command "=begin I<formatname>", some paragraphs, and a
+command "=end I<formatname>", mean that the text/data in between
+is meant for formatters that understand the special format
+called I<formatname>. For example,
+
+ =begin html
+
+ <hr> <img src="thang.png">
+ <p> This is a raw HTML paragraph </p>
+
+ =end html
+
+The command "=for I<formatname> I<text...>"
+specifies that the remainder of just this paragraph (starting
+right after I<formatname>) is in that special format.
+
+ =for html <hr> <img src="thang.png">
+ <p> This is a raw HTML paragraph </p>
+
+This means the same thing as the above "=begin html" ... "=end html"
+region.
+
+That is, with "=for", you can have only one paragraph's worth
+of text (i.e., the text in "=foo targetname text..."), but with
+"=begin targetname" ... "=end targetname", you can have any amount
+of stuff inbetween. (Note that there still must be a blank line
+after the "=begin" command and a blank line before the "=end"
+command.
+
+Here are some examples of how to use these:
+
+ =begin html
+
+ <br>Figure 1.<br><IMG SRC="figure1.png"><br>
+
+ =end html
+
+ =begin text
+
+ ---------------
+ | foo |
+ | bar |
+ ---------------
+
+ ^^^^ Figure 1. ^^^^
+
+ =end text
+
+Some format names that formatters currently are known to accept
+include "roff", "man", "latex", "tex", "text", and "html". (Some
+formatters will treat some of these as synonyms.)
+
+A format name of "comment" is common for just making notes (presumably
+to yourself) that won't appear in any formatted version of the Pod
+document:
+
+ =for comment
+ Make sure that all the available options are documented!
+
+Some I<formatnames> will require a leading colon (as in
+C<"=for :formatname">, or
+C<"=begin :formatname" ... "=end :formatname">),
+to signal that the text is not raw data, but instead I<is> Pod text
+(i.e., possibly containing formatting codes) that's just not for
+normal formatting (e.g., may not be a normal-use paragraph, but might
+be for formatting as a footnote).
+
+=item C<=encoding I<encodingname>>
+X<=encoding> X<encoding>
+
+This command is used for declaring the encoding of a document. Most
+users won't need this; but if your encoding isn't US-ASCII or Latin-1,
+then put a C<=encoding I<encodingname>> command early in the document so
+that pod formatters will know how to decode the document. For
+I<encodingname>, use a name recognized by the L<Encode::Supported>
+module. Examples:
+
+ =encoding utf8
+
+ =encoding koi8-r
+
+ =encoding ShiftJIS
+
+ =encoding big5
+
+=back
+
+C<=encoding> affects the whole document, and must occur only once.
+
+And don't forget, when using any other command, that the command lasts up
+until the end of its I<paragraph>, not its line. So in the
+examples below, you can see that every command needs the blank
+line after it, to end its paragraph.
+
+Some examples of lists include:
+
+ =over
+
+ =item *
+
+ First item
+
+ =item *
+
+ Second item
+
+ =back
+
+ =over
+
+ =item Foo()
+
+ Description of Foo function
+
+ =item Bar()
+
+ Description of Bar function
+
+ =back
+
+
+=head2 Formatting Codes
+X<POD, formatting code> X<formatting code>
+X<POD, interior sequence> X<interior sequence>
+
+In ordinary paragraphs and in some command paragraphs, various
+formatting codes (a.k.a. "interior sequences") can be used:
+
+=for comment
+ "interior sequences" is such an opaque term.
+ Prefer "formatting codes" instead.
+
+=over
+
+=item C<IE<lt>textE<gt>> -- italic text
+X<I> X<< IZ<><> >> X<POD, formatting code, italic> X<italic>
+
+Used for emphasis ("C<be IE<lt>careful!E<gt>>") and parameters
+("C<redo IE<lt>LABELE<gt>>")
+
+=item C<BE<lt>textE<gt>> -- bold text
+X<B> X<< BZ<><> >> X<POD, formatting code, bold> X<bold>
+
+Used for switches ("C<perl's BE<lt>-nE<gt> switch>"), programs
+("C<some systems provide a BE<lt>chfnE<gt> for that>"),
+emphasis ("C<be BE<lt>careful!E<gt>>"), and so on
+("C<and that feature is known as BE<lt>autovivificationE<gt>>").
+
+=item C<CE<lt>codeE<gt>> -- code text
+X<C> X<< CZ<><> >> X<POD, formatting code, code> X<code>
+
+Renders code in a typewriter font, or gives some other indication that
+this represents program text ("C<CE<lt>gmtime($^T)E<gt>>") or some other
+form of computerese ("C<CE<lt>drwxr-xr-xE<gt>>").
+
+=item C<LE<lt>nameE<gt>> -- a hyperlink
+X<L> X<< LZ<><> >> X<POD, formatting code, hyperlink> X<hyperlink>
+
+There are various syntaxes, listed below. In the syntaxes given,
+C<text>, C<name>, and C<section> cannot contain the characters
+'/' and '|'; and any '<' or '>' should be matched.
+
+=over
+
+=item *
+
+C<LE<lt>nameE<gt>>
+
+Link to a Perl manual page (e.g., C<LE<lt>Net::PingE<gt>>). Note
+that C<name> should not contain spaces. This syntax
+is also occasionally used for references to UNIX man pages, as in
+C<LE<lt>crontab(5)E<gt>>.
+
+=item *
+
+C<LE<lt>name/"sec"E<gt>> or C<LE<lt>name/secE<gt>>
+
+Link to a section in other manual page. E.g.,
+C<LE<lt>perlsyn/"For Loops"E<gt>>
+
+=item *
+
+C<LE<lt>/"sec"E<gt>> or C<LE<lt>/secE<gt>> or C<LE<lt>"sec"E<gt>>
+
+Link to a section in this manual page. E.g.,
+C<LE<lt>/"Object Methods"E<gt>>
+
+=back
+
+A section is started by the named heading or item. For
+example, C<LE<lt>perlvar/$.E<gt>> or C<LE<lt>perlvar/"$."E<gt>> both
+link to the section started by "C<=item $.>" in perlvar. And
+C<LE<lt>perlsyn/For LoopsE<gt>> or C<LE<lt>perlsyn/"For Loops"E<gt>>
+both link to the section started by "C<=head2 For Loops>"
+in perlsyn.
+
+To control what text is used for display, you
+use "C<LE<lt>text|...E<gt>>", as in:
+
+=over
+
+=item *
+
+C<LE<lt>text|nameE<gt>>
+
+Link this text to that manual page. E.g.,
+C<LE<lt>Perl Error Messages|perldiagE<gt>>
+
+=item *
+
+C<LE<lt>text|name/"sec"E<gt>> or C<LE<lt>text|name/secE<gt>>
+
+Link this text to that section in that manual page. E.g.,
+C<LE<lt>postfix "if"|perlsyn/"Statement Modifiers"E<gt>>
+
+=item *
+
+C<LE<lt>text|/"sec"E<gt>> or C<LE<lt>text|/secE<gt>>
+or C<LE<lt>text|"sec"E<gt>>
+
+Link this text to that section in this manual page. E.g.,
+C<LE<lt>the various attributes|/"Member Data"E<gt>>
+
+=back
+
+Or you can link to a web page:
+
+=over
+
+=item *
+
+C<LE<lt>scheme:...E<gt>>
+
+Links to an absolute URL. For example,
+C<LE<lt>http://www.perl.org/E<gt>>. But note
+that there is no corresponding C<LE<lt>text|scheme:...E<gt>> syntax, for
+various reasons.
+
+=back
+
+=item C<EE<lt>escapeE<gt>> -- a character escape
+X<E> X<< EZ<><> >> X<POD, formatting code, escape> X<escape>
+
+Very similar to HTML/XML C<&I<foo>;> "entity references":
+
+=over
+
+=item *
+
+C<EE<lt>ltE<gt>> -- a literal E<lt> (less than)
+
+=item *
+
+C<EE<lt>gtE<gt>> -- a literal E<gt> (greater than)
+
+=item *
+
+C<EE<lt>verbarE<gt>> -- a literal | (I<ver>tical I<bar>)
+
+=item *
+
+C<EE<lt>solE<gt>> = a literal / (I<sol>idus)
+
+The above four are optional except in other formatting codes,
+notably C<LE<lt>...E<gt>>, and when preceded by a
+capital letter.
+
+=item *
+
+C<EE<lt>htmlnameE<gt>>
+
+Some non-numeric HTML entity name, such as C<EE<lt>eacuteE<gt>>,
+meaning the same thing as C<&eacute;> in HTML -- i.e., a lowercase
+e with an acute (/-shaped) accent.
+
+=item *
+
+C<EE<lt>numberE<gt>>
+
+The ASCII/Latin-1/Unicode character with that number. A
+leading "0x" means that I<number> is hex, as in
+C<EE<lt>0x201EE<gt>>. A leading "0" means that I<number> is octal,
+as in C<EE<lt>075E<gt>>. Otherwise I<number> is interpreted as being
+in decimal, as in C<EE<lt>181E<gt>>.
+
+Note that older Pod formatters might not recognize octal or
+hex numeric escapes, and that many formatters cannot reliably
+render characters above 255. (Some formatters may even have
+to use compromised renderings of Latin-1 characters, like
+rendering C<EE<lt>eacuteE<gt>> as just a plain "e".)
+
+=back
+
+=item C<FE<lt>filenameE<gt>> -- used for filenames
+X<F> X<< FZ<><> >> X<POD, formatting code, filename> X<filename>
+
+Typically displayed in italics. Example: "C<FE<lt>.cshrcE<gt>>"
+
+=item C<SE<lt>textE<gt>> -- text contains non-breaking spaces
+X<S> X<< SZ<><> >> X<POD, formatting code, non-breaking space>
+X<non-breaking space>
+
+This means that the words in I<text> should not be broken
+across lines. Example: S<C<SE<lt>$x ? $y : $zE<gt>>>.
+
+=item C<XE<lt>topic nameE<gt>> -- an index entry
+X<X> X<< XZ<><> >> X<POD, formatting code, index entry> X<index entry>
+
+This is ignored by most formatters, but some may use it for building
+indexes. It always renders as empty-string.
+Example: C<XE<lt>absolutizing relative URLsE<gt>>
+
+=item C<ZE<lt>E<gt>> -- a null (zero-effect) formatting code
+X<Z> X<< ZZ<><> >> X<POD, formatting code, null> X<null>
+
+This is rarely used. It's one way to get around using an
+EE<lt>...E<gt> code sometimes. For example, instead of
+"C<NEE<lt>ltE<gt>3>" (for "NE<lt>3") you could write
+"C<NZE<lt>E<gt>E<lt>3>" (the "ZE<lt>E<gt>" breaks up the "N" and
+the "E<lt>" so they can't be considered
+the part of a (fictitious) "NE<lt>...E<gt>" code.
+
+=for comment
+ This was formerly explained as a "zero-width character". But it in
+ most parser models, it parses to nothing at all, as opposed to parsing
+ as if it were a E<zwnj> or E<zwj>, which are REAL zero-width characters.
+ So "width" and "character" are exactly the wrong words.
+
+=back
+
+Most of the time, you will need only a single set of angle brackets to
+delimit the beginning and end of formatting codes. However,
+sometimes you will want to put a real right angle bracket (a
+greater-than sign, '>') inside of a formatting code. This is particularly
+common when using a formatting code to provide a different font-type for a
+snippet of code. As with all things in Perl, there is more than
+one way to do it. One way is to simply escape the closing bracket
+using an C<E> code:
+
+ C<$a E<lt>=E<gt> $b>
+
+This will produce: "C<$a E<lt>=E<gt> $b>"
+
+A more readable, and perhaps more "plain" way is to use an alternate
+set of delimiters that doesn't require a single ">" to be escaped. With
+the Pod formatters that are standard starting with perl5.5.660, doubled
+angle brackets ("<<" and ">>") may be used I<if and only if there is
+whitespace right after the opening delimiter and whitespace right
+before the closing delimiter!> For example, the following will
+do the trick:
+X<POD, formatting code, escaping with multiple brackets>
+
+ C<< $a <=> $b >>
+
+In fact, you can use as many repeated angle-brackets as you like so
+long as you have the same number of them in the opening and closing
+delimiters, and make sure that whitespace immediately follows the last
+'<' of the opening delimiter, and immediately precedes the first '>'
+of the closing delimiter. (The whitespace is ignored.) So the
+following will also work:
+X<POD, formatting code, escaping with multiple brackets>
+
+ C<<< $a <=> $b >>>
+ C<<<< $a <=> $b >>>>
+
+And they all mean exactly the same as this:
+
+ C<$a E<lt>=E<gt> $b>
+
+As a further example, this means that if you wanted to put these bits of
+code in C<C> (code) style:
+
+ open(X, ">>thing.dat") || die $!
+ $foo->bar();
+
+you could do it like so:
+
+ C<<< open(X, ">>thing.dat") || die $! >>>
+ C<< $foo->bar(); >>
+
+which is presumably easier to read than the old way:
+
+ C<open(X, "E<gt>E<gt>thing.dat") || die $!>
+ C<$foo-E<gt>bar();>
+
+This is currently supported by pod2text (Pod::Text), pod2man (Pod::Man),
+and any other pod2xxx or Pod::Xxxx translators that use
+Pod::Parser 1.093 or later, or Pod::Tree 1.02 or later.
+
+=head2 The Intent
+X<POD, intent of>
+
+The intent is simplicity of use, not power of expression. Paragraphs
+look like paragraphs (block format), so that they stand out
+visually, and so that I could run them through C<fmt> easily to reformat
+them (that's F7 in my version of B<vi>, or Esc Q in my version of
+B<emacs>). I wanted the translator to always leave the C<'> and C<`> and
+C<"> quotes alone, in verbatim mode, so I could slurp in a
+working program, shift it over four spaces, and have it print out, er,
+verbatim. And presumably in a monospace font.
+
+The Pod format is not necessarily sufficient for writing a book. Pod
+is just meant to be an idiot-proof common source for nroff, HTML,
+TeX, and other markup languages, as used for online
+documentation. Translators exist for B<pod2text>, B<pod2html>,
+B<pod2man> (that's for nroff(1) and troff(1)), B<pod2latex>, and
+B<pod2fm>. Various others are available in CPAN.
+
+
+=head2 Embedding Pods in Perl Modules
+X<POD, embedding>
+
+You can embed Pod documentation in your Perl modules and scripts.
+Start your documentation with an empty line, a "=head1" command at the
+beginning, and end it with a "=cut" command and an empty line. Perl
+will ignore the Pod text. See any of the supplied library modules for
+examples. If you're going to put your Pod at the end of the file, and
+you're using an __END__ or __DATA__ cut mark, make sure to put an
+empty line there before the first Pod command.
+
+ __END__
+
+ =head1 NAME
+
+ Time::Local - efficiently compute time from local and GMT time
+
+Without that empty line before the "=head1", many translators wouldn't
+have recognized the "=head1" as starting a Pod block.
+
+=head2 Hints for Writing Pod
+
+=over
+
+=item *
+X<podchecker> X<POD, validating>
+
+The B<podchecker> command is provided for checking Pod syntax for errors
+and warnings. For example, it checks for completely blank lines in
+Pod blocks and for unknown commands and formatting codes. You should
+still also pass your document through one or more translators and proofread
+the result, or print out the result and proofread that. Some of the
+problems found may be bugs in the translators, which you may or may not
+wish to work around.
+
+=item *
+
+If you're more familiar with writing in HTML than with writing in Pod, you
+can try your hand at writing documentation in simple HTML, and converting
+it to Pod with the experimental L<Pod::HTML2Pod|Pod::HTML2Pod> module,
+(available in CPAN), and looking at the resulting code. The experimental
+L<Pod::PXML|Pod::PXML> module in CPAN might also be useful.
+
+=item *
+
+Many older Pod translators require the lines before every Pod
+command and after every Pod command (including "=cut"!) to be a blank
+line. Having something like this:
+
+ # - - - - - - - - - - - -
+ =item $firecracker->boom()
+
+ This noisily detonates the firecracker object.
+ =cut
+ sub boom {
+ ...
+
+...will make such Pod translators completely fail to see the Pod block
+at all.
+
+Instead, have it like this:
+
+ # - - - - - - - - - - - -
+
+ =item $firecracker->boom()
+
+ This noisily detonates the firecracker object.
+
+ =cut
+
+ sub boom {
+ ...
+
+=item *
+
+Some older Pod translators require paragraphs (including command
+paragraphs like "=head2 Functions") to be separated by I<completely>
+empty lines. If you have an apparently empty line with some spaces
+on it, this might not count as a separator for those translators, and
+that could cause odd formatting.
+
+=item *
+
+Older translators might add wording around an LE<lt>E<gt> link, so that
+C<LE<lt>Foo::BarE<gt>> may become "the Foo::Bar manpage", for example.
+So you shouldn't write things like C<the LE<lt>fooE<gt>
+documentation>, if you want the translated document to read sensibly
+-- instead write C<the LE<lt>Foo::Bar|Foo::BarE<gt> documentation> or
+C<LE<lt>the Foo::Bar documentation|Foo::BarE<gt>>, to control how the
+link comes out.
+
+=item *
+
+Going past the 70th column in a verbatim block might be ungracefully
+wrapped by some formatters.
+
+=back
+
+=head1 SEE ALSO
+
+L<perlpodspec>, L<perlsyn/"PODs: Embedded Documentation">,
+L<perlnewmod>, L<perldoc>, L<pod2html>, L<pod2man>, L<podchecker>.
+
+=head1 AUTHOR
+
+Larry Wall, Sean M. Burke
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlpodspec.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlpodspec.pod
new file mode 100755
index 00000000000..8973a7080cd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlpodspec.pod
@@ -0,0 +1,1899 @@
+
+=head1 NAME
+
+perlpodspec - Plain Old Documentation: format specification and notes
+
+=head1 DESCRIPTION
+
+This document is detailed notes on the Pod markup language. Most
+people will only have to read L<perlpod|perlpod> to know how to write
+in Pod, but this document may answer some incidental questions to do
+with parsing and rendering Pod.
+
+In this document, "must" / "must not", "should" /
+"should not", and "may" have their conventional (cf. RFC 2119)
+meanings: "X must do Y" means that if X doesn't do Y, it's against
+this specification, and should really be fixed. "X should do Y"
+means that it's recommended, but X may fail to do Y, if there's a
+good reason. "X may do Y" is merely a note that X can do Y at
+will (although it is up to the reader to detect any connotation of
+"and I think it would be I<nice> if X did Y" versus "it wouldn't
+really I<bother> me if X did Y").
+
+Notably, when I say "the parser should do Y", the
+parser may fail to do Y, if the calling application explicitly
+requests that the parser I<not> do Y. I often phrase this as
+"the parser should, by default, do Y." This doesn't I<require>
+the parser to provide an option for turning off whatever
+feature Y is (like expanding tabs in verbatim paragraphs), although
+it implicates that such an option I<may> be provided.
+
+=head1 Pod Definitions
+
+Pod is embedded in files, typically Perl source files -- although you
+can write a file that's nothing but Pod.
+
+A B<line> in a file consists of zero or more non-newline characters,
+terminated by either a newline or the end of the file.
+
+A B<newline sequence> is usually a platform-dependent concept, but
+Pod parsers should understand it to mean any of CR (ASCII 13), LF
+(ASCII 10), or a CRLF (ASCII 13 followed immediately by ASCII 10), in
+addition to any other system-specific meaning. The first CR/CRLF/LF
+sequence in the file may be used as the basis for identifying the
+newline sequence for parsing the rest of the file.
+
+A B<blank line> is a line consisting entirely of zero or more spaces
+(ASCII 32) or tabs (ASCII 9), and terminated by a newline or end-of-file.
+A B<non-blank line> is a line containing one or more characters other
+than space or tab (and terminated by a newline or end-of-file).
+
+(I<Note:> Many older Pod parsers did not accept a line consisting of
+spaces/tabs and then a newline as a blank line -- the only lines they
+considered blank were lines consisting of I<no characters at all>,
+terminated by a newline.)
+
+B<Whitespace> is used in this document as a blanket term for spaces,
+tabs, and newline sequences. (By itself, this term usually refers
+to literal whitespace. That is, sequences of whitespace characters
+in Pod source, as opposed to "EE<lt>32>", which is a formatting
+code that I<denotes> a whitespace character.)
+
+A B<Pod parser> is a module meant for parsing Pod (regardless of
+whether this involves calling callbacks or building a parse tree or
+directly formatting it). A B<Pod formatter> (or B<Pod translator>)
+is a module or program that converts Pod to some other format (HTML,
+plaintext, TeX, PostScript, RTF). A B<Pod processor> might be a
+formatter or translator, or might be a program that does something
+else with the Pod (like counting words, scanning for index points,
+etc.).
+
+Pod content is contained in B<Pod blocks>. A Pod block starts with a
+line that matches <m/\A=[a-zA-Z]/>, and continues up to the next line
+that matches C<m/\A=cut/> -- or up to the end of the file, if there is
+no C<m/\A=cut/> line.
+
+=for comment
+ The current perlsyn says:
+ [beginquote]
+ Note that pod translators should look at only paragraphs beginning
+ with a pod directive (it makes parsing easier), whereas the compiler
+ actually knows to look for pod escapes even in the middle of a
+ paragraph. This means that the following secret stuff will be ignored
+ by both the compiler and the translators.
+ $a=3;
+ =secret stuff
+ warn "Neither POD nor CODE!?"
+ =cut back
+ print "got $a\n";
+ You probably shouldn't rely upon the warn() being podded out forever.
+ Not all pod translators are well-behaved in this regard, and perhaps
+ the compiler will become pickier.
+ [endquote]
+ I think that those paragraphs should just be removed; paragraph-based
+ parsing seems to have been largely abandoned, because of the hassle
+ with non-empty blank lines messing up what people meant by "paragraph".
+ Even if the "it makes parsing easier" bit were especially true,
+ it wouldn't be worth the confusion of having perl and pod2whatever
+ actually disagree on what can constitute a Pod block.
+
+Within a Pod block, there are B<Pod paragraphs>. A Pod paragraph
+consists of non-blank lines of text, separated by one or more blank
+lines.
+
+For purposes of Pod processing, there are four types of paragraphs in
+a Pod block:
+
+=over
+
+=item *
+
+A command paragraph (also called a "directive"). The first line of
+this paragraph must match C<m/\A=[a-zA-Z]/>. Command paragraphs are
+typically one line, as in:
+
+ =head1 NOTES
+
+ =item *
+
+But they may span several (non-blank) lines:
+
+ =for comment
+ Hm, I wonder what it would look like if
+ you tried to write a BNF for Pod from this.
+
+ =head3 Dr. Strangelove, or: How I Learned to
+ Stop Worrying and Love the Bomb
+
+I<Some> command paragraphs allow formatting codes in their content
+(i.e., after the part that matches C<m/\A=[a-zA-Z]\S*\s*/>), as in:
+
+ =head1 Did You Remember to C<use strict;>?
+
+In other words, the Pod processing handler for "head1" will apply the
+same processing to "Did You Remember to CE<lt>use strict;>?" that it
+would to an ordinary paragraph -- i.e., formatting codes (like
+"CE<lt>...>") are parsed and presumably formatted appropriately, and
+whitespace in the form of literal spaces and/or tabs is not
+significant.
+
+=item *
+
+A B<verbatim paragraph>. The first line of this paragraph must be a
+literal space or tab, and this paragraph must not be inside a "=begin
+I<identifier>", ... "=end I<identifier>" sequence unless
+"I<identifier>" begins with a colon (":"). That is, if a paragraph
+starts with a literal space or tab, but I<is> inside a
+"=begin I<identifier>", ... "=end I<identifier>" region, then it's
+a data paragraph, unless "I<identifier>" begins with a colon.
+
+Whitespace I<is> significant in verbatim paragraphs (although, in
+processing, tabs are probably expanded).
+
+=item *
+
+An B<ordinary paragraph>. A paragraph is an ordinary paragraph
+if its first line matches neither C<m/\A=[a-zA-Z]/> nor
+C<m/\A[ \t]/>, I<and> if it's not inside a "=begin I<identifier>",
+... "=end I<identifier>" sequence unless "I<identifier>" begins with
+a colon (":").
+
+=item *
+
+A B<data paragraph>. This is a paragraph that I<is> inside a "=begin
+I<identifier>" ... "=end I<identifier>" sequence where
+"I<identifier>" does I<not> begin with a literal colon (":"). In
+some sense, a data paragraph is not part of Pod at all (i.e.,
+effectively it's "out-of-band"), since it's not subject to most kinds
+of Pod parsing; but it is specified here, since Pod
+parsers need to be able to call an event for it, or store it in some
+form in a parse tree, or at least just parse I<around> it.
+
+=back
+
+For example: consider the following paragraphs:
+
+ # <- that's the 0th column
+
+ =head1 Foo
+
+ Stuff
+
+ $foo->bar
+
+ =cut
+
+Here, "=head1 Foo" and "=cut" are command paragraphs because the first
+line of each matches C<m/\A=[a-zA-Z]/>. "I<[space][space]>$foo->bar"
+is a verbatim paragraph, because its first line starts with a literal
+whitespace character (and there's no "=begin"..."=end" region around).
+
+The "=begin I<identifier>" ... "=end I<identifier>" commands stop
+paragraphs that they surround from being parsed as ordinary or verbatim
+paragraphs, if I<identifier> doesn't begin with a colon. This
+is discussed in detail in the section
+L</About Data Paragraphs and "=beginE<sol>=end" Regions>.
+
+=head1 Pod Commands
+
+This section is intended to supplement and clarify the discussion in
+L<perlpod/"Command Paragraph">. These are the currently recognized
+Pod commands:
+
+=over
+
+=item "=head1", "=head2", "=head3", "=head4"
+
+This command indicates that the text in the remainder of the paragraph
+is a heading. That text may contain formatting codes. Examples:
+
+ =head1 Object Attributes
+
+ =head3 What B<Not> to Do!
+
+=item "=pod"
+
+This command indicates that this paragraph begins a Pod block. (If we
+are already in the middle of a Pod block, this command has no effect at
+all.) If there is any text in this command paragraph after "=pod",
+it must be ignored. Examples:
+
+ =pod
+
+ This is a plain Pod paragraph.
+
+ =pod This text is ignored.
+
+=item "=cut"
+
+This command indicates that this line is the end of this previously
+started Pod block. If there is any text after "=cut" on the line, it must be
+ignored. Examples:
+
+ =cut
+
+ =cut The documentation ends here.
+
+ =cut
+ # This is the first line of program text.
+ sub foo { # This is the second.
+
+It is an error to try to I<start> a Pod block with a "=cut" command. In
+that case, the Pod processor must halt parsing of the input file, and
+must by default emit a warning.
+
+=item "=over"
+
+This command indicates that this is the start of a list/indent
+region. If there is any text following the "=over", it must consist
+of only a nonzero positive numeral. The semantics of this numeral is
+explained in the L</"About =over...=back Regions"> section, further
+below. Formatting codes are not expanded. Examples:
+
+ =over 3
+
+ =over 3.5
+
+ =over
+
+=item "=item"
+
+This command indicates that an item in a list begins here. Formatting
+codes are processed. The semantics of the (optional) text in the
+remainder of this paragraph are
+explained in the L</"About =over...=back Regions"> section, further
+below. Examples:
+
+ =item
+
+ =item *
+
+ =item *
+
+ =item 14
+
+ =item 3.
+
+ =item C<< $thing->stuff(I<dodad>) >>
+
+ =item For transporting us beyond seas to be tried for pretended
+ offenses
+
+ =item He is at this time transporting large armies of foreign
+ mercenaries to complete the works of death, desolation and
+ tyranny, already begun with circumstances of cruelty and perfidy
+ scarcely paralleled in the most barbarous ages, and totally
+ unworthy the head of a civilized nation.
+
+=item "=back"
+
+This command indicates that this is the end of the region begun
+by the most recent "=over" command. It permits no text after the
+"=back" command.
+
+=item "=begin formatname"
+
+This marks the following paragraphs (until the matching "=end
+formatname") as being for some special kind of processing. Unless
+"formatname" begins with a colon, the contained non-command
+paragraphs are data paragraphs. But if "formatname" I<does> begin
+with a colon, then non-command paragraphs are ordinary paragraphs
+or data paragraphs. This is discussed in detail in the section
+L</About Data Paragraphs and "=beginE<sol>=end" Regions>.
+
+It is advised that formatnames match the regexp
+C<m/\A:?[-a-zA-Z0-9_]+\z/>. Implementors should anticipate future
+expansion in the semantics and syntax of the first parameter
+to "=begin"/"=end"/"=for".
+
+=item "=end formatname"
+
+This marks the end of the region opened by the matching
+"=begin formatname" region. If "formatname" is not the formatname
+of the most recent open "=begin formatname" region, then this
+is an error, and must generate an error message. This
+is discussed in detail in the section
+L</About Data Paragraphs and "=beginE<sol>=end" Regions>.
+
+=item "=for formatname text..."
+
+This is synonymous with:
+
+ =begin formatname
+
+ text...
+
+ =end formatname
+
+That is, it creates a region consisting of a single paragraph; that
+paragraph is to be treated as a normal paragraph if "formatname"
+begins with a ":"; if "formatname" I<doesn't> begin with a colon,
+then "text..." will constitute a data paragraph. There is no way
+to use "=for formatname text..." to express "text..." as a verbatim
+paragraph.
+
+=item "=encoding encodingname"
+
+This command, which should occur early in the document (at least
+before any non-US-ASCII data!), declares that this document is
+encoded in the encoding I<encodingname>, which must be
+an encoding name that L<Encode> recognizes. (Encode's list
+of supported encodings, in L<Encode::Supported>, is useful here.)
+If the Pod parser cannot decode the declared encoding, it
+should emit a warning and may abort parsing the document
+altogether.
+
+A document having more than one "=encoding" line should be
+considered an error. Pod processors may silently tolerate this if
+the not-first "=encoding" lines are just duplicates of the
+first one (e.g., if there's a "=encoding utf8" line, and later on
+another "=encoding utf8" line). But Pod processors should complain if
+there are contradictory "=encoding" lines in the same document
+(e.g., if there is a "=encoding utf8" early in the document and
+"=encoding big5" later). Pod processors that recognize BOMs
+may also complain if they see an "=encoding" line
+that contradicts the BOM (e.g., if a document with a UTF-16LE
+BOM has an "=encoding shiftjis" line).
+
+=back
+
+If a Pod processor sees any command other than the ones listed
+above (like "=head", or "=haed1", or "=stuff", or "=cuttlefish",
+or "=w123"), that processor must by default treat this as an
+error. It must not process the paragraph beginning with that
+command, must by default warn of this as an error, and may
+abort the parse. A Pod parser may allow a way for particular
+applications to add to the above list of known commands, and to
+stipulate, for each additional command, whether formatting
+codes should be processed.
+
+Future versions of this specification may add additional
+commands.
+
+
+
+=head1 Pod Formatting Codes
+
+(Note that in previous drafts of this document and of perlpod,
+formatting codes were referred to as "interior sequences", and
+this term may still be found in the documentation for Pod parsers,
+and in error messages from Pod processors.)
+
+There are two syntaxes for formatting codes:
+
+=over
+
+=item *
+
+A formatting code starts with a capital letter (just US-ASCII [A-Z])
+followed by a "<", any number of characters, and ending with the first
+matching ">". Examples:
+
+ That's what I<you> think!
+
+ What's C<dump()> for?
+
+ X<C<chmod> and C<unlink()> Under Different Operating Systems>
+
+=item *
+
+A formatting code starts with a capital letter (just US-ASCII [A-Z])
+followed by two or more "<"'s, one or more whitespace characters,
+any number of characters, one or more whitespace characters,
+and ending with the first matching sequence of two or more ">"'s, where
+the number of ">"'s equals the number of "<"'s in the opening of this
+formatting code. Examples:
+
+ That's what I<< you >> think!
+
+ C<<< open(X, ">>thing.dat") || die $! >>>
+
+ B<< $foo->bar(); >>
+
+With this syntax, the whitespace character(s) after the "CE<lt><<"
+and before the ">>" (or whatever letter) are I<not> renderable -- they
+do not signify whitespace, are merely part of the formatting codes
+themselves. That is, these are all synonymous:
+
+ C<thing>
+ C<< thing >>
+ C<< thing >>
+ C<<< thing >>>
+ C<<<<
+ thing
+ >>>>
+
+and so on.
+
+=back
+
+In parsing Pod, a notably tricky part is the correct parsing of
+(potentially nested!) formatting codes. Implementors should
+consult the code in the C<parse_text> routine in Pod::Parser as an
+example of a correct implementation.
+
+=over
+
+=item C<IE<lt>textE<gt>> -- italic text
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+=item C<BE<lt>textE<gt>> -- bold text
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+=item C<CE<lt>codeE<gt>> -- code text
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+=item C<FE<lt>filenameE<gt>> -- style for filenames
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+=item C<XE<lt>topic nameE<gt>> -- an index entry
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+This code is unusual in that most formatters completely discard
+this code and its content. Other formatters will render it with
+invisible codes that can be used in building an index of
+the current document.
+
+=item C<ZE<lt>E<gt>> -- a null (zero-effect) formatting code
+
+Discussed briefly in L<perlpod/"Formatting Codes">.
+
+This code is unusual is that it should have no content. That is,
+a processor may complain if it sees C<ZE<lt>potatoesE<gt>>. Whether
+or not it complains, the I<potatoes> text should ignored.
+
+=item C<LE<lt>nameE<gt>> -- a hyperlink
+
+The complicated syntaxes of this code are discussed at length in
+L<perlpod/"Formatting Codes">, and implementation details are
+discussed below, in L</"About LE<lt>...E<gt> Codes">. Parsing the
+contents of LE<lt>content> is tricky. Notably, the content has to be
+checked for whether it looks like a URL, or whether it has to be split
+on literal "|" and/or "/" (in the right order!), and so on,
+I<before> EE<lt>...> codes are resolved.
+
+=item C<EE<lt>escapeE<gt>> -- a character escape
+
+See L<perlpod/"Formatting Codes">, and several points in
+L</Notes on Implementing Pod Processors>.
+
+=item C<SE<lt>textE<gt>> -- text contains non-breaking spaces
+
+This formatting code is syntactically simple, but semantically
+complex. What it means is that each space in the printable
+content of this code signifies a non-breaking space.
+
+Consider:
+
+ C<$x ? $y : $z>
+
+ S<C<$x ? $y : $z>>
+
+Both signify the monospace (c[ode] style) text consisting of
+"$x", one space, "?", one space, ":", one space, "$z". The
+difference is that in the latter, with the S code, those spaces
+are not "normal" spaces, but instead are non-breaking spaces.
+
+=back
+
+
+If a Pod processor sees any formatting code other than the ones
+listed above (as in "NE<lt>...>", or "QE<lt>...>", etc.), that
+processor must by default treat this as an error.
+A Pod parser may allow a way for particular
+applications to add to the above list of known formatting codes;
+a Pod parser might even allow a way to stipulate, for each additional
+command, whether it requires some form of special processing, as
+LE<lt>...> does.
+
+Future versions of this specification may add additional
+formatting codes.
+
+Historical note: A few older Pod processors would not see a ">" as
+closing a "CE<lt>" code, if the ">" was immediately preceded by
+a "-". This was so that this:
+
+ C<$foo->bar>
+
+would parse as equivalent to this:
+
+ C<$foo-E<gt>bar>
+
+instead of as equivalent to a "C" formatting code containing
+only "$foo-", and then a "bar>" outside the "C" formatting code. This
+problem has since been solved by the addition of syntaxes like this:
+
+ C<< $foo->bar >>
+
+Compliant parsers must not treat "->" as special.
+
+Formatting codes absolutely cannot span paragraphs. If a code is
+opened in one paragraph, and no closing code is found by the end of
+that paragraph, the Pod parser must close that formatting code,
+and should complain (as in "Unterminated I code in the paragraph
+starting at line 123: 'Time objects are not...'"). So these
+two paragraphs:
+
+ I<I told you not to do this!
+
+ Don't make me say it again!>
+
+...must I<not> be parsed as two paragraphs in italics (with the I
+code starting in one paragraph and starting in another.) Instead,
+the first paragraph should generate a warning, but that aside, the
+above code must parse as if it were:
+
+ I<I told you not to do this!>
+
+ Don't make me say it again!E<gt>
+
+(In SGMLish jargon, all Pod commands are like block-level
+elements, whereas all Pod formatting codes are like inline-level
+elements.)
+
+
+
+=head1 Notes on Implementing Pod Processors
+
+The following is a long section of miscellaneous requirements
+and suggestions to do with Pod processing.
+
+=over
+
+=item *
+
+Pod formatters should tolerate lines in verbatim blocks that are of
+any length, even if that means having to break them (possibly several
+times, for very long lines) to avoid text running off the side of the
+page. Pod formatters may warn of such line-breaking. Such warnings
+are particularly appropriate for lines are over 100 characters long, which
+are usually not intentional.
+
+=item *
+
+Pod parsers must recognize I<all> of the three well-known newline
+formats: CR, LF, and CRLF. See L<perlport|perlport>.
+
+=item *
+
+Pod parsers should accept input lines that are of any length.
+
+=item *
+
+Since Perl recognizes a Unicode Byte Order Mark at the start of files
+as signaling that the file is Unicode encoded as in UTF-16 (whether
+big-endian or little-endian) or UTF-8, Pod parsers should do the
+same. Otherwise, the character encoding should be understood as
+being UTF-8 if the first highbit byte sequence in the file seems
+valid as a UTF-8 sequence, or otherwise as Latin-1.
+
+Future versions of this specification may specify
+how Pod can accept other encodings. Presumably treatment of other
+encodings in Pod parsing would be as in XML parsing: whatever the
+encoding declared by a particular Pod file, content is to be
+stored in memory as Unicode characters.
+
+=item *
+
+The well known Unicode Byte Order Marks are as follows: if the
+file begins with the two literal byte values 0xFE 0xFF, this is
+the BOM for big-endian UTF-16. If the file begins with the two
+literal byte value 0xFF 0xFE, this is the BOM for little-endian
+UTF-16. If the file begins with the three literal byte values
+0xEF 0xBB 0xBF, this is the BOM for UTF-8.
+
+=for comment
+ use bytes; print map sprintf(" 0x%02X", ord $_), split '', "\x{feff}";
+ 0xEF 0xBB 0xBF
+
+=for comment
+ If toke.c is modified to support UTF-32, add mention of those here.
+
+=item *
+
+A naive but sufficient heuristic for testing the first highbit
+byte-sequence in a BOM-less file (whether in code or in Pod!), to see
+whether that sequence is valid as UTF-8 (RFC 2279) is to check whether
+that the first byte in the sequence is in the range 0xC0 - 0xFD
+I<and> whether the next byte is in the range
+0x80 - 0xBF. If so, the parser may conclude that this file is in
+UTF-8, and all highbit sequences in the file should be assumed to
+be UTF-8. Otherwise the parser should treat the file as being
+in Latin-1. In the unlikely circumstance that the first highbit
+sequence in a truly non-UTF-8 file happens to appear to be UTF-8, one
+can cater to our heuristic (as well as any more intelligent heuristic)
+by prefacing that line with a comment line containing a highbit
+sequence that is clearly I<not> valid as UTF-8. A line consisting
+of simply "#", an e-acute, and any non-highbit byte,
+is sufficient to establish this file's encoding.
+
+=for comment
+ If/WHEN some brave soul makes these heuristics into a generic
+ text-file class (or PerlIO layer?), we can presumably delete
+ mention of these icky details from this file, and can instead
+ tell people to just use appropriate class/layer.
+ Auto-recognition of newline sequences would be another desirable
+ feature of such a class/layer.
+ HINT HINT HINT.
+
+=for comment
+ "The probability that a string of characters
+ in any other encoding appears as valid UTF-8 is low" - RFC2279
+
+=item *
+
+This document's requirements and suggestions about encodings
+do not apply to Pod processors running on non-ASCII platforms,
+notably EBCDIC platforms.
+
+=item *
+
+Pod processors must treat a "=for [label] [content...]" paragraph as
+meaning the same thing as a "=begin [label]" paragraph, content, and
+an "=end [label]" paragraph. (The parser may conflate these two
+constructs, or may leave them distinct, in the expectation that the
+formatter will nevertheless treat them the same.)
+
+=item *
+
+When rendering Pod to a format that allows comments (i.e., to nearly
+any format other than plaintext), a Pod formatter must insert comment
+text identifying its name and version number, and the name and
+version numbers of any modules it might be using to process the Pod.
+Minimal examples:
+
+ %% POD::Pod2PS v3.14159, using POD::Parser v1.92
+
+ <!-- Pod::HTML v3.14159, using POD::Parser v1.92 -->
+
+ {\doccomm generated by Pod::Tree::RTF 3.14159 using Pod::Tree 1.08}
+
+ .\" Pod::Man version 3.14159, using POD::Parser version 1.92
+
+Formatters may also insert additional comments, including: the
+release date of the Pod formatter program, the contact address for
+the author(s) of the formatter, the current time, the name of input
+file, the formatting options in effect, version of Perl used, etc.
+
+Formatters may also choose to note errors/warnings as comments,
+besides or instead of emitting them otherwise (as in messages to
+STDERR, or C<die>ing).
+
+=item *
+
+Pod parsers I<may> emit warnings or error messages ("Unknown E code
+EE<lt>zslig>!") to STDERR (whether through printing to STDERR, or
+C<warn>ing/C<carp>ing, or C<die>ing/C<croak>ing), but I<must> allow
+suppressing all such STDERR output, and instead allow an option for
+reporting errors/warnings
+in some other way, whether by triggering a callback, or noting errors
+in some attribute of the document object, or some similarly unobtrusive
+mechanism -- or even by appending a "Pod Errors" section to the end of
+the parsed form of the document.
+
+=item *
+
+In cases of exceptionally aberrant documents, Pod parsers may abort the
+parse. Even then, using C<die>ing/C<croak>ing is to be avoided; where
+possible, the parser library may simply close the input file
+and add text like "*** Formatting Aborted ***" to the end of the
+(partial) in-memory document.
+
+=item *
+
+In paragraphs where formatting codes (like EE<lt>...>, BE<lt>...>)
+are understood (i.e., I<not> verbatim paragraphs, but I<including>
+ordinary paragraphs, and command paragraphs that produce renderable
+text, like "=head1"), literal whitespace should generally be considered
+"insignificant", in that one literal space has the same meaning as any
+(nonzero) number of literal spaces, literal newlines, and literal tabs
+(as long as this produces no blank lines, since those would terminate
+the paragraph). Pod parsers should compact literal whitespace in each
+processed paragraph, but may provide an option for overriding this
+(since some processing tasks do not require it), or may follow
+additional special rules (for example, specially treating
+period-space-space or period-newline sequences).
+
+=item *
+
+Pod parsers should not, by default, try to coerce apostrophe (') and
+quote (") into smart quotes (little 9's, 66's, 99's, etc), nor try to
+turn backtick (`) into anything else but a single backtick character
+(distinct from an open quote character!), nor "--" into anything but
+two minus signs. They I<must never> do any of those things to text
+in CE<lt>...> formatting codes, and never I<ever> to text in verbatim
+paragraphs.
+
+=item *
+
+When rendering Pod to a format that has two kinds of hyphens (-), one
+that's a non-breaking hyphen, and another that's a breakable hyphen
+(as in "object-oriented", which can be split across lines as
+"object-", newline, "oriented"), formatters are encouraged to
+generally translate "-" to non-breaking hyphen, but may apply
+heuristics to convert some of these to breaking hyphens.
+
+=item *
+
+Pod formatters should make reasonable efforts to keep words of Perl
+code from being broken across lines. For example, "Foo::Bar" in some
+formatting systems is seen as eligible for being broken across lines
+as "Foo::" newline "Bar" or even "Foo::-" newline "Bar". This should
+be avoided where possible, either by disabling all line-breaking in
+mid-word, or by wrapping particular words with internal punctuation
+in "don't break this across lines" codes (which in some formats may
+not be a single code, but might be a matter of inserting non-breaking
+zero-width spaces between every pair of characters in a word.)
+
+=item *
+
+Pod parsers should, by default, expand tabs in verbatim paragraphs as
+they are processed, before passing them to the formatter or other
+processor. Parsers may also allow an option for overriding this.
+
+=item *
+
+Pod parsers should, by default, remove newlines from the end of
+ordinary and verbatim paragraphs before passing them to the
+formatter. For example, while the paragraph you're reading now
+could be considered, in Pod source, to end with (and contain)
+the newline(s) that end it, it should be processed as ending with
+(and containing) the period character that ends this sentence.
+
+=item *
+
+Pod parsers, when reporting errors, should make some effort to report
+an approximate line number ("Nested EE<lt>>'s in Paragraph #52, near
+line 633 of Thing/Foo.pm!"), instead of merely noting the paragraph
+number ("Nested EE<lt>>'s in Paragraph #52 of Thing/Foo.pm!"). Where
+this is problematic, the paragraph number should at least be
+accompanied by an excerpt from the paragraph ("Nested EE<lt>>'s in
+Paragraph #52 of Thing/Foo.pm, which begins 'Read/write accessor for
+the CE<lt>interest rate> attribute...'").
+
+=item *
+
+Pod parsers, when processing a series of verbatim paragraphs one
+after another, should consider them to be one large verbatim
+paragraph that happens to contain blank lines. I.e., these two
+lines, which have a blank line between them:
+
+ use Foo;
+
+ print Foo->VERSION
+
+should be unified into one paragraph ("\tuse Foo;\n\n\tprint
+Foo->VERSION") before being passed to the formatter or other
+processor. Parsers may also allow an option for overriding this.
+
+While this might be too cumbersome to implement in event-based Pod
+parsers, it is straightforward for parsers that return parse trees.
+
+=item *
+
+Pod formatters, where feasible, are advised to avoid splitting short
+verbatim paragraphs (under twelve lines, say) across pages.
+
+=item *
+
+Pod parsers must treat a line with only spaces and/or tabs on it as a
+"blank line" such as separates paragraphs. (Some older parsers
+recognized only two adjacent newlines as a "blank line" but would not
+recognize a newline, a space, and a newline, as a blank line. This
+is noncompliant behavior.)
+
+=item *
+
+Authors of Pod formatters/processors should make every effort to
+avoid writing their own Pod parser. There are already several in
+CPAN, with a wide range of interface styles -- and one of them,
+Pod::Parser, comes with modern versions of Perl.
+
+=item *
+
+Characters in Pod documents may be conveyed either as literals, or by
+number in EE<lt>n> codes, or by an equivalent mnemonic, as in
+EE<lt>eacute> which is exactly equivalent to EE<lt>233>.
+
+Characters in the range 32-126 refer to those well known US-ASCII
+characters (also defined there by Unicode, with the same meaning),
+which all Pod formatters must render faithfully. Characters
+in the ranges 0-31 and 127-159 should not be used (neither as
+literals, nor as EE<lt>number> codes), except for the
+literal byte-sequences for newline (13, 13 10, or 10), and tab (9).
+
+Characters in the range 160-255 refer to Latin-1 characters (also
+defined there by Unicode, with the same meaning). Characters above
+255 should be understood to refer to Unicode characters.
+
+=item *
+
+Be warned
+that some formatters cannot reliably render characters outside 32-126;
+and many are able to handle 32-126 and 160-255, but nothing above
+255.
+
+=item *
+
+Besides the well-known "EE<lt>lt>" and "EE<lt>gt>" codes for
+less-than and greater-than, Pod parsers must understand "EE<lt>sol>"
+for "/" (solidus, slash), and "EE<lt>verbar>" for "|" (vertical bar,
+pipe). Pod parsers should also understand "EE<lt>lchevron>" and
+"EE<lt>rchevron>" as legacy codes for characters 171 and 187, i.e.,
+"left-pointing double angle quotation mark" = "left pointing
+guillemet" and "right-pointing double angle quotation mark" = "right
+pointing guillemet". (These look like little "<<" and ">>", and they
+are now preferably expressed with the HTML/XHTML codes "EE<lt>laquo>"
+and "EE<lt>raquo>".)
+
+=item *
+
+Pod parsers should understand all "EE<lt>html>" codes as defined
+in the entity declarations in the most recent XHTML specification at
+C<www.W3.org>. Pod parsers must understand at least the entities
+that define characters in the range 160-255 (Latin-1). Pod parsers,
+when faced with some unknown "EE<lt>I<identifier>>" code,
+shouldn't simply replace it with nullstring (by default, at least),
+but may pass it through as a string consisting of the literal characters
+E, less-than, I<identifier>, greater-than. Or Pod parsers may offer the
+alternative option of processing such unknown
+"EE<lt>I<identifier>>" codes by firing an event especially
+for such codes, or by adding a special node-type to the in-memory
+document tree. Such "EE<lt>I<identifier>>" may have special meaning
+to some processors, or some processors may choose to add them to
+a special error report.
+
+=item *
+
+Pod parsers must also support the XHTML codes "EE<lt>quot>" for
+character 34 (doublequote, "), "EE<lt>amp>" for character 38
+(ampersand, &), and "EE<lt>apos>" for character 39 (apostrophe, ').
+
+=item *
+
+Note that in all cases of "EE<lt>whatever>", I<whatever> (whether
+an htmlname, or a number in any base) must consist only of
+alphanumeric characters -- that is, I<whatever> must watch
+C<m/\A\w+\z/>. So "EE<lt> 0 1 2 3 >" is invalid, because
+it contains spaces, which aren't alphanumeric characters. This
+presumably does not I<need> special treatment by a Pod processor;
+" 0 1 2 3 " doesn't look like a number in any base, so it would
+presumably be looked up in the table of HTML-like names. Since
+there isn't (and cannot be) an HTML-like entity called " 0 1 2 3 ",
+this will be treated as an error. However, Pod processors may
+treat "EE<lt> 0 1 2 3 >" or "EE<lt>e-acute>" as I<syntactically>
+invalid, potentially earning a different error message than the
+error message (or warning, or event) generated by a merely unknown
+(but theoretically valid) htmlname, as in "EE<lt>qacute>"
+[sic]. However, Pod parsers are not required to make this
+distinction.
+
+=item *
+
+Note that EE<lt>number> I<must not> be interpreted as simply
+"codepoint I<number> in the current/native character set". It always
+means only "the character represented by codepoint I<number> in
+Unicode." (This is identical to the semantics of &#I<number>; in XML.)
+
+This will likely require many formatters to have tables mapping from
+treatable Unicode codepoints (such as the "\xE9" for the e-acute
+character) to the escape sequences or codes necessary for conveying
+such sequences in the target output format. A converter to *roff
+would, for example know that "\xE9" (whether conveyed literally, or via
+a EE<lt>...> sequence) is to be conveyed as "e\\*'".
+Similarly, a program rendering Pod in a Mac OS application window, would
+presumably need to know that "\xE9" maps to codepoint 142 in MacRoman
+encoding that (at time of writing) is native for Mac OS. Such
+Unicode2whatever mappings are presumably already widely available for
+common output formats. (Such mappings may be incomplete! Implementers
+are not expected to bend over backwards in an attempt to render
+Cherokee syllabics, Etruscan runes, Byzantine musical symbols, or any
+of the other weird things that Unicode can encode.) And
+if a Pod document uses a character not found in such a mapping, the
+formatter should consider it an unrenderable character.
+
+=item *
+
+If, surprisingly, the implementor of a Pod formatter can't find a
+satisfactory pre-existing table mapping from Unicode characters to
+escapes in the target format (e.g., a decent table of Unicode
+characters to *roff escapes), it will be necessary to build such a
+table. If you are in this circumstance, you should begin with the
+characters in the range 0x00A0 - 0x00FF, which is mostly the heavily
+used accented characters. Then proceed (as patience permits and
+fastidiousness compels) through the characters that the (X)HTML
+standards groups judged important enough to merit mnemonics
+for. These are declared in the (X)HTML specifications at the
+www.W3.org site. At time of writing (September 2001), the most recent
+entity declaration files are:
+
+ http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent
+ http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent
+ http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent
+
+Then you can progress through any remaining notable Unicode characters
+in the range 0x2000-0x204D (consult the character tables at
+www.unicode.org), and whatever else strikes your fancy. For example,
+in F<xhtml-symbol.ent>, there is the entry:
+
+ <!ENTITY infin "&#8734;"> <!-- infinity, U+221E ISOtech -->
+
+While the mapping "infin" to the character "\x{221E}" will (hopefully)
+have been already handled by the Pod parser, the presence of the
+character in this file means that it's reasonably important enough to
+include in a formatter's table that maps from notable Unicode characters
+to the codes necessary for rendering them. So for a Unicode-to-*roff
+mapping, for example, this would merit the entry:
+
+ "\x{221E}" => '\(in',
+
+It is eagerly hoped that in the future, increasing numbers of formats
+(and formatters) will support Unicode characters directly (as (X)HTML
+does with C<&infin;>, C<&#8734;>, or C<&#x221E;>), reducing the need
+for idiosyncratic mappings of Unicode-to-I<my_escapes>.
+
+=item *
+
+It is up to individual Pod formatter to display good judgement when
+confronted with an unrenderable character (which is distinct from an
+unknown EE<lt>thing> sequence that the parser couldn't resolve to
+anything, renderable or not). It is good practice to map Latin letters
+with diacritics (like "EE<lt>eacute>"/"EE<lt>233>") to the corresponding
+unaccented US-ASCII letters (like a simple character 101, "e"), but
+clearly this is often not feasible, and an unrenderable character may
+be represented as "?", or the like. In attempting a sane fallback
+(as from EE<lt>233> to "e"), Pod formatters may use the
+%Latin1Code_to_fallback table in L<Pod::Escapes|Pod::Escapes>, or
+L<Text::Unidecode|Text::Unidecode>, if available.
+
+For example, this Pod text:
+
+ magic is enabled if you set C<$Currency> to 'E<euro>'.
+
+may be rendered as:
+"magic is enabled if you set C<$Currency> to 'I<?>'" or as
+"magic is enabled if you set C<$Currency> to 'B<[euro]>'", or as
+"magic is enabled if you set C<$Currency> to '[x20AC]', etc.
+
+A Pod formatter may also note, in a comment or warning, a list of what
+unrenderable characters were encountered.
+
+=item *
+
+EE<lt>...> may freely appear in any formatting code (other than
+in another EE<lt>...> or in an ZE<lt>>). That is, "XE<lt>The
+EE<lt>euro>1,000,000 Solution>" is valid, as is "LE<lt>The
+EE<lt>euro>1,000,000 Solution|Million::Euros>".
+
+=item *
+
+Some Pod formatters output to formats that implement non-breaking
+spaces as an individual character (which I'll call "NBSP"), and
+others output to formats that implement non-breaking spaces just as
+spaces wrapped in a "don't break this across lines" code. Note that
+at the level of Pod, both sorts of codes can occur: Pod can contain a
+NBSP character (whether as a literal, or as a "EE<lt>160>" or
+"EE<lt>nbsp>" code); and Pod can contain "SE<lt>foo
+IE<lt>barE<gt> baz>" codes, where "mere spaces" (character 32) in
+such codes are taken to represent non-breaking spaces. Pod
+parsers should consider supporting the optional parsing of "SE<lt>foo
+IE<lt>barE<gt> baz>" as if it were
+"fooI<NBSP>IE<lt>barE<gt>I<NBSP>baz", and, going the other way, the
+optional parsing of groups of words joined by NBSP's as if each group
+were in a SE<lt>...> code, so that formatters may use the
+representation that maps best to what the output format demands.
+
+=item *
+
+Some processors may find that the C<SE<lt>...E<gt>> code is easiest to
+implement by replacing each space in the parse tree under the content
+of the S, with an NBSP. But note: the replacement should apply I<not> to
+spaces in I<all> text, but I<only> to spaces in I<printable> text. (This
+distinction may or may not be evident in the particular tree/event
+model implemented by the Pod parser.) For example, consider this
+unusual case:
+
+ S<L</Autoloaded Functions>>
+
+This means that the space in the middle of the visible link text must
+not be broken across lines. In other words, it's the same as this:
+
+ L<"AutoloadedE<160>Functions"/Autoloaded Functions>
+
+However, a misapplied space-to-NBSP replacement could (wrongly)
+produce something equivalent to this:
+
+ L<"AutoloadedE<160>Functions"/AutoloadedE<160>Functions>
+
+...which is almost definitely not going to work as a hyperlink (assuming
+this formatter outputs a format supporting hypertext).
+
+Formatters may choose to just not support the S format code,
+especially in cases where the output format simply has no NBSP
+character/code and no code for "don't break this stuff across lines".
+
+=item *
+
+Besides the NBSP character discussed above, implementors are reminded
+of the existence of the other "special" character in Latin-1, the
+"soft hyphen" character, also known as "discretionary hyphen",
+i.e. C<EE<lt>173E<gt>> = C<EE<lt>0xADE<gt>> =
+C<EE<lt>shyE<gt>>). This character expresses an optional hyphenation
+point. That is, it normally renders as nothing, but may render as a
+"-" if a formatter breaks the word at that point. Pod formatters
+should, as appropriate, do one of the following: 1) render this with
+a code with the same meaning (e.g., "\-" in RTF), 2) pass it through
+in the expectation that the formatter understands this character as
+such, or 3) delete it.
+
+For example:
+
+ sigE<shy>action
+ manuE<shy>script
+ JarkE<shy>ko HieE<shy>taE<shy>nieE<shy>mi
+
+These signal to a formatter that if it is to hyphenate "sigaction"
+or "manuscript", then it should be done as
+"sig-I<[linebreak]>action" or "manu-I<[linebreak]>script"
+(and if it doesn't hyphenate it, then the C<EE<lt>shyE<gt>> doesn't
+show up at all). And if it is
+to hyphenate "Jarkko" and/or "Hietaniemi", it can do
+so only at the points where there is a C<EE<lt>shyE<gt>> code.
+
+In practice, it is anticipated that this character will not be used
+often, but formatters should either support it, or delete it.
+
+=item *
+
+If you think that you want to add a new command to Pod (like, say, a
+"=biblio" command), consider whether you could get the same
+effect with a for or begin/end sequence: "=for biblio ..." or "=begin
+biblio" ... "=end biblio". Pod processors that don't understand
+"=for biblio", etc, will simply ignore it, whereas they may complain
+loudly if they see "=biblio".
+
+=item *
+
+Throughout this document, "Pod" has been the preferred spelling for
+the name of the documentation format. One may also use "POD" or
+"pod". For the documentation that is (typically) in the Pod
+format, you may use "pod", or "Pod", or "POD". Understanding these
+distinctions is useful; but obsessing over how to spell them, usually
+is not.
+
+=back
+
+
+
+
+
+=head1 About LE<lt>...E<gt> Codes
+
+As you can tell from a glance at L<perlpod|perlpod>, the LE<lt>...>
+code is the most complex of the Pod formatting codes. The points below
+will hopefully clarify what it means and how processors should deal
+with it.
+
+=over
+
+=item *
+
+In parsing an LE<lt>...> code, Pod parsers must distinguish at least
+four attributes:
+
+=over
+
+=item First:
+
+The link-text. If there is none, this must be undef. (E.g., in
+"LE<lt>Perl Functions|perlfunc>", the link-text is "Perl Functions".
+In "LE<lt>Time::HiRes>" and even "LE<lt>|Time::HiRes>", there is no
+link text. Note that link text may contain formatting.)
+
+=item Second:
+
+The possibly inferred link-text -- i.e., if there was no real link
+text, then this is the text that we'll infer in its place. (E.g., for
+"LE<lt>Getopt::Std>", the inferred link text is "Getopt::Std".)
+
+=item Third:
+
+The name or URL, or undef if none. (E.g., in "LE<lt>Perl
+Functions|perlfunc>", the name -- also sometimes called the page --
+is "perlfunc". In "LE<lt>/CAVEATS>", the name is undef.)
+
+=item Fourth:
+
+The section (AKA "item" in older perlpods), or undef if none. E.g.,
+in "LE<lt>Getopt::Std/DESCRIPTIONE<gt>", "DESCRIPTION" is the section. (Note
+that this is not the same as a manpage section like the "5" in "man 5
+crontab". "Section Foo" in the Pod sense means the part of the text
+that's introduced by the heading or item whose text is "Foo".)
+
+=back
+
+Pod parsers may also note additional attributes including:
+
+=over
+
+=item Fifth:
+
+A flag for whether item 3 (if present) is a URL (like
+"http://lists.perl.org" is), in which case there should be no section
+attribute; a Pod name (like "perldoc" and "Getopt::Std" are); or
+possibly a man page name (like "crontab(5)" is).
+
+=item Sixth:
+
+The raw original LE<lt>...> content, before text is split on
+"|", "/", etc, and before EE<lt>...> codes are expanded.
+
+=back
+
+(The above were numbered only for concise reference below. It is not
+a requirement that these be passed as an actual list or array.)
+
+For example:
+
+ L<Foo::Bar>
+ => undef, # link text
+ "Foo::Bar", # possibly inferred link text
+ "Foo::Bar", # name
+ undef, # section
+ 'pod', # what sort of link
+ "Foo::Bar" # original content
+
+ L<Perlport's section on NL's|perlport/Newlines>
+ => "Perlport's section on NL's", # link text
+ "Perlport's section on NL's", # possibly inferred link text
+ "perlport", # name
+ "Newlines", # section
+ 'pod', # what sort of link
+ "Perlport's section on NL's|perlport/Newlines" # orig. content
+
+ L<perlport/Newlines>
+ => undef, # link text
+ '"Newlines" in perlport', # possibly inferred link text
+ "perlport", # name
+ "Newlines", # section
+ 'pod', # what sort of link
+ "perlport/Newlines" # original content
+
+ L<crontab(5)/"DESCRIPTION">
+ => undef, # link text
+ '"DESCRIPTION" in crontab(5)', # possibly inferred link text
+ "crontab(5)", # name
+ "DESCRIPTION", # section
+ 'man', # what sort of link
+ 'crontab(5)/"DESCRIPTION"' # original content
+
+ L</Object Attributes>
+ => undef, # link text
+ '"Object Attributes"', # possibly inferred link text
+ undef, # name
+ "Object Attributes", # section
+ 'pod', # what sort of link
+ "/Object Attributes" # original content
+
+ L<http://www.perl.org/>
+ => undef, # link text
+ "http://www.perl.org/", # possibly inferred link text
+ "http://www.perl.org/", # name
+ undef, # section
+ 'url', # what sort of link
+ "http://www.perl.org/" # original content
+
+Note that you can distinguish URL-links from anything else by the
+fact that they match C<m/\A\w+:[^:\s]\S*\z/>. So
+C<LE<lt>http://www.perl.comE<gt>> is a URL, but
+C<LE<lt>HTTP::ResponseE<gt>> isn't.
+
+=item *
+
+In case of LE<lt>...> codes with no "text|" part in them,
+older formatters have exhibited great variation in actually displaying
+the link or cross reference. For example, LE<lt>crontab(5)> would render
+as "the C<crontab(5)> manpage", or "in the C<crontab(5)> manpage"
+or just "C<crontab(5)>".
+
+Pod processors must now treat "text|"-less links as follows:
+
+ L<name> => L<name|name>
+ L</section> => L<"section"|/section>
+ L<name/section> => L<"section" in name|name/section>
+
+=item *
+
+Note that section names might contain markup. I.e., if a section
+starts with:
+
+ =head2 About the C<-M> Operator
+
+or with:
+
+ =item About the C<-M> Operator
+
+then a link to it would look like this:
+
+ L<somedoc/About the C<-M> Operator>
+
+Formatters may choose to ignore the markup for purposes of resolving
+the link and use only the renderable characters in the section name,
+as in:
+
+ <h1><a name="About_the_-M_Operator">About the <code>-M</code>
+ Operator</h1>
+
+ ...
+
+ <a href="somedoc#About_the_-M_Operator">About the <code>-M</code>
+ Operator" in somedoc</a>
+
+=item *
+
+Previous versions of perlpod distinguished C<LE<lt>name/"section"E<gt>>
+links from C<LE<lt>name/itemE<gt>> links (and their targets). These
+have been merged syntactically and semantically in the current
+specification, and I<section> can refer either to a "=headI<n> Heading
+Content" command or to a "=item Item Content" command. This
+specification does not specify what behavior should be in the case
+of a given document having several things all seeming to produce the
+same I<section> identifier (e.g., in HTML, several things all producing
+the same I<anchorname> in <a name="I<anchorname>">...</a>
+elements). Where Pod processors can control this behavior, they should
+use the first such anchor. That is, C<LE<lt>Foo/BarE<gt>> refers to the
+I<first> "Bar" section in Foo.
+
+But for some processors/formats this cannot be easily controlled; as
+with the HTML example, the behavior of multiple ambiguous
+<a name="I<anchorname>">...</a> is most easily just left up to
+browsers to decide.
+
+=item *
+
+Authors wanting to link to a particular (absolute) URL, must do so
+only with "LE<lt>scheme:...>" codes (like
+LE<lt>http://www.perl.org>), and must not attempt "LE<lt>Some Site
+Name|scheme:...>" codes. This restriction avoids many problems
+in parsing and rendering LE<lt>...> codes.
+
+=item *
+
+In a C<LE<lt>text|...E<gt>> code, text may contain formatting codes
+for formatting or for EE<lt>...> escapes, as in:
+
+ L<B<ummE<234>stuff>|...>
+
+For C<LE<lt>...E<gt>> codes without a "name|" part, only
+C<EE<lt>...E<gt>> and C<ZE<lt>E<gt>> codes may occur -- no
+other formatting codes. That is, authors should not use
+"C<LE<lt>BE<lt>Foo::BarE<gt>E<gt>>".
+
+Note, however, that formatting codes and ZE<lt>>'s can occur in any
+and all parts of an LE<lt>...> (i.e., in I<name>, I<section>, I<text>,
+and I<url>).
+
+Authors must not nest LE<lt>...> codes. For example, "LE<lt>The
+LE<lt>Foo::Bar> man page>" should be treated as an error.
+
+=item *
+
+Note that Pod authors may use formatting codes inside the "text"
+part of "LE<lt>text|name>" (and so on for LE<lt>text|/"sec">).
+
+In other words, this is valid:
+
+ Go read L<the docs on C<$.>|perlvar/"$.">
+
+Some output formats that do allow rendering "LE<lt>...>" codes as
+hypertext, might not allow the link-text to be formatted; in
+that case, formatters will have to just ignore that formatting.
+
+=item *
+
+At time of writing, C<LE<lt>nameE<gt>> values are of two types:
+either the name of a Pod page like C<LE<lt>Foo::BarE<gt>> (which
+might be a real Perl module or program in an @INC / PATH
+directory, or a .pod file in those places); or the name of a UNIX
+man page, like C<LE<lt>crontab(5)E<gt>>. In theory, C<LE<lt>chmodE<gt>>
+in ambiguous between a Pod page called "chmod", or the Unix man page
+"chmod" (in whatever man-section). However, the presence of a string
+in parens, as in "crontab(5)", is sufficient to signal that what
+is being discussed is not a Pod page, and so is presumably a
+UNIX man page. The distinction is of no importance to many
+Pod processors, but some processors that render to hypertext formats
+may need to distinguish them in order to know how to render a
+given C<LE<lt>fooE<gt>> code.
+
+=item *
+
+Previous versions of perlpod allowed for a C<LE<lt>sectionE<gt>> syntax
+(as in C<LE<lt>Object AttributesE<gt>>), which was not easily distinguishable
+from C<LE<lt>nameE<gt>> syntax. This syntax is no longer in the
+specification, and has been replaced by the C<LE<lt>"section"E<gt>> syntax
+(where the quotes were formerly optional). Pod parsers should tolerate
+the C<LE<lt>sectionE<gt>> syntax, for a while at least. The suggested
+heuristic for distinguishing C<LE<lt>sectionE<gt>> from C<LE<lt>nameE<gt>>
+is that if it contains any whitespace, it's a I<section>. Pod processors
+may warn about this being deprecated syntax.
+
+=back
+
+=head1 About =over...=back Regions
+
+"=over"..."=back" regions are used for various kinds of list-like
+structures. (I use the term "region" here simply as a collective
+term for everything from the "=over" to the matching "=back".)
+
+=over
+
+=item *
+
+The non-zero numeric I<indentlevel> in "=over I<indentlevel>" ...
+"=back" is used for giving the formatter a clue as to how many
+"spaces" (ems, or roughly equivalent units) it should tab over,
+although many formatters will have to convert this to an absolute
+measurement that may not exactly match with the size of spaces (or M's)
+in the document's base font. Other formatters may have to completely
+ignore the number. The lack of any explicit I<indentlevel> parameter is
+equivalent to an I<indentlevel> value of 4. Pod processors may
+complain if I<indentlevel> is present but is not a positive number
+matching C<m/\A(\d*\.)?\d+\z/>.
+
+=item *
+
+Authors of Pod formatters are reminded that "=over" ... "=back" may
+map to several different constructs in your output format. For
+example, in converting Pod to (X)HTML, it can map to any of
+<ul>...</ul>, <ol>...</ol>, <dl>...</dl>, or
+<blockquote>...</blockquote>. Similarly, "=item" can map to <li> or
+<dt>.
+
+=item *
+
+Each "=over" ... "=back" region should be one of the following:
+
+=over
+
+=item *
+
+An "=over" ... "=back" region containing only "=item *" commands,
+each followed by some number of ordinary/verbatim paragraphs, other
+nested "=over" ... "=back" regions, "=for..." paragraphs, and
+"=begin"..."=end" regions.
+
+(Pod processors must tolerate a bare "=item" as if it were "=item
+*".) Whether "*" is rendered as a literal asterisk, an "o", or as
+some kind of real bullet character, is left up to the Pod formatter,
+and may depend on the level of nesting.
+
+=item *
+
+An "=over" ... "=back" region containing only
+C<m/\A=item\s+\d+\.?\s*\z/> paragraphs, each one (or each group of them)
+followed by some number of ordinary/verbatim paragraphs, other nested
+"=over" ... "=back" regions, "=for..." paragraphs, and/or
+"=begin"..."=end" codes. Note that the numbers must start at 1
+in each section, and must proceed in order and without skipping
+numbers.
+
+(Pod processors must tolerate lines like "=item 1" as if they were
+"=item 1.", with the period.)
+
+=item *
+
+An "=over" ... "=back" region containing only "=item [text]"
+commands, each one (or each group of them) followed by some number of
+ordinary/verbatim paragraphs, other nested "=over" ... "=back"
+regions, or "=for..." paragraphs, and "=begin"..."=end" regions.
+
+The "=item [text]" paragraph should not match
+C<m/\A=item\s+\d+\.?\s*\z/> or C<m/\A=item\s+\*\s*\z/>, nor should it
+match just C<m/\A=item\s*\z/>.
+
+=item *
+
+An "=over" ... "=back" region containing no "=item" paragraphs at
+all, and containing only some number of
+ordinary/verbatim paragraphs, and possibly also some nested "=over"
+... "=back" regions, "=for..." paragraphs, and "=begin"..."=end"
+regions. Such an itemless "=over" ... "=back" region in Pod is
+equivalent in meaning to a "<blockquote>...</blockquote>" element in
+HTML.
+
+=back
+
+Note that with all the above cases, you can determine which type of
+"=over" ... "=back" you have, by examining the first (non-"=cut",
+non-"=pod") Pod paragraph after the "=over" command.
+
+=item *
+
+Pod formatters I<must> tolerate arbitrarily large amounts of text
+in the "=item I<text...>" paragraph. In practice, most such
+paragraphs are short, as in:
+
+ =item For cutting off our trade with all parts of the world
+
+But they may be arbitrarily long:
+
+ =item For transporting us beyond seas to be tried for pretended
+ offenses
+
+ =item He is at this time transporting large armies of foreign
+ mercenaries to complete the works of death, desolation and
+ tyranny, already begun with circumstances of cruelty and perfidy
+ scarcely paralleled in the most barbarous ages, and totally
+ unworthy the head of a civilized nation.
+
+=item *
+
+Pod processors should tolerate "=item *" / "=item I<number>" commands
+with no accompanying paragraph. The middle item is an example:
+
+ =over
+
+ =item 1
+
+ Pick up dry cleaning.
+
+ =item 2
+
+ =item 3
+
+ Stop by the store. Get Abba Zabas, Stoli, and cheap lawn chairs.
+
+ =back
+
+=item *
+
+No "=over" ... "=back" region can contain headings. Processors may
+treat such a heading as an error.
+
+=item *
+
+Note that an "=over" ... "=back" region should have some
+content. That is, authors should not have an empty region like this:
+
+ =over
+
+ =back
+
+Pod processors seeing such a contentless "=over" ... "=back" region,
+may ignore it, or may report it as an error.
+
+=item *
+
+Processors must tolerate an "=over" list that goes off the end of the
+document (i.e., which has no matching "=back"), but they may warn
+about such a list.
+
+=item *
+
+Authors of Pod formatters should note that this construct:
+
+ =item Neque
+
+ =item Porro
+
+ =item Quisquam Est
+
+ Qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+ velit, sed quia non numquam eius modi tempora incidunt ut
+ labore et dolore magnam aliquam quaerat voluptatem.
+
+ =item Ut Enim
+
+is semantically ambiguous, in a way that makes formatting decisions
+a bit difficult. On the one hand, it could be mention of an item
+"Neque", mention of another item "Porro", and mention of another
+item "Quisquam Est", with just the last one requiring the explanatory
+paragraph "Qui dolorem ipsum quia dolor..."; and then an item
+"Ut Enim". In that case, you'd want to format it like so:
+
+ Neque
+
+ Porro
+
+ Quisquam Est
+ Qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+ velit, sed quia non numquam eius modi tempora incidunt ut
+ labore et dolore magnam aliquam quaerat voluptatem.
+
+ Ut Enim
+
+But it could equally well be a discussion of three (related or equivalent)
+items, "Neque", "Porro", and "Quisquam Est", followed by a paragraph
+explaining them all, and then a new item "Ut Enim". In that case, you'd
+probably want to format it like so:
+
+ Neque
+ Porro
+ Quisquam Est
+ Qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+ velit, sed quia non numquam eius modi tempora incidunt ut
+ labore et dolore magnam aliquam quaerat voluptatem.
+
+ Ut Enim
+
+But (for the foreseeable future), Pod does not provide any way for Pod
+authors to distinguish which grouping is meant by the above
+"=item"-cluster structure. So formatters should format it like so:
+
+ Neque
+
+ Porro
+
+ Quisquam Est
+
+ Qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+ velit, sed quia non numquam eius modi tempora incidunt ut
+ labore et dolore magnam aliquam quaerat voluptatem.
+
+ Ut Enim
+
+That is, there should be (at least roughly) equal spacing between
+items as between paragraphs (although that spacing may well be less
+than the full height of a line of text). This leaves it to the reader
+to use (con)textual cues to figure out whether the "Qui dolorem
+ipsum..." paragraph applies to the "Quisquam Est" item or to all three
+items "Neque", "Porro", and "Quisquam Est". While not an ideal
+situation, this is preferable to providing formatting cues that may
+be actually contrary to the author's intent.
+
+=back
+
+
+
+=head1 About Data Paragraphs and "=begin/=end" Regions
+
+Data paragraphs are typically used for inlining non-Pod data that is
+to be used (typically passed through) when rendering the document to
+a specific format:
+
+ =begin rtf
+
+ \par{\pard\qr\sa4500{\i Printed\~\chdate\~\chtime}\par}
+
+ =end rtf
+
+The exact same effect could, incidentally, be achieved with a single
+"=for" paragraph:
+
+ =for rtf \par{\pard\qr\sa4500{\i Printed\~\chdate\~\chtime}\par}
+
+(Although that is not formally a data paragraph, it has the same
+meaning as one, and Pod parsers may parse it as one.)
+
+Another example of a data paragraph:
+
+ =begin html
+
+ I like <em>PIE</em>!
+
+ <hr>Especially pecan pie!
+
+ =end html
+
+If these were ordinary paragraphs, the Pod parser would try to
+expand the "EE<lt>/em>" (in the first paragraph) as a formatting
+code, just like "EE<lt>lt>" or "EE<lt>eacute>". But since this
+is in a "=begin I<identifier>"..."=end I<identifier>" region I<and>
+the identifier "html" doesn't begin have a ":" prefix, the contents
+of this region are stored as data paragraphs, instead of being
+processed as ordinary paragraphs (or if they began with a spaces
+and/or tabs, as verbatim paragraphs).
+
+As a further example: At time of writing, no "biblio" identifier is
+supported, but suppose some processor were written to recognize it as
+a way of (say) denoting a bibliographic reference (necessarily
+containing formatting codes in ordinary paragraphs). The fact that
+"biblio" paragraphs were meant for ordinary processing would be
+indicated by prefacing each "biblio" identifier with a colon:
+
+ =begin :biblio
+
+ Wirth, Niklaus. 1976. I<Algorithms + Data Structures =
+ Programs.> Prentice-Hall, Englewood Cliffs, NJ.
+
+ =end :biblio
+
+This would signal to the parser that paragraphs in this begin...end
+region are subject to normal handling as ordinary/verbatim paragraphs
+(while still tagged as meant only for processors that understand the
+"biblio" identifier). The same effect could be had with:
+
+ =for :biblio
+ Wirth, Niklaus. 1976. I<Algorithms + Data Structures =
+ Programs.> Prentice-Hall, Englewood Cliffs, NJ.
+
+The ":" on these identifiers means simply "process this stuff
+normally, even though the result will be for some special target".
+I suggest that parser APIs report "biblio" as the target identifier,
+but also report that it had a ":" prefix. (And similarly, with the
+above "html", report "html" as the target identifier, and note the
+I<lack> of a ":" prefix.)
+
+Note that a "=begin I<identifier>"..."=end I<identifier>" region where
+I<identifier> begins with a colon, I<can> contain commands. For example:
+
+ =begin :biblio
+
+ Wirth's classic is available in several editions, including:
+
+ =for comment
+ hm, check abebooks.com for how much used copies cost.
+
+ =over
+
+ =item
+
+ Wirth, Niklaus. 1975. I<Algorithmen und Datenstrukturen.>
+ Teubner, Stuttgart. [Yes, it's in German.]
+
+ =item
+
+ Wirth, Niklaus. 1976. I<Algorithms + Data Structures =
+ Programs.> Prentice-Hall, Englewood Cliffs, NJ.
+
+ =back
+
+ =end :biblio
+
+Note, however, a "=begin I<identifier>"..."=end I<identifier>"
+region where I<identifier> does I<not> begin with a colon, should not
+directly contain "=head1" ... "=head4" commands, nor "=over", nor "=back",
+nor "=item". For example, this may be considered invalid:
+
+ =begin somedata
+
+ This is a data paragraph.
+
+ =head1 Don't do this!
+
+ This is a data paragraph too.
+
+ =end somedata
+
+A Pod processor may signal that the above (specifically the "=head1"
+paragraph) is an error. Note, however, that the following should
+I<not> be treated as an error:
+
+ =begin somedata
+
+ This is a data paragraph.
+
+ =cut
+
+ # Yup, this isn't Pod anymore.
+ sub excl { (rand() > .5) ? "hoo!" : "hah!" }
+
+ =pod
+
+ This is a data paragraph too.
+
+ =end somedata
+
+And this too is valid:
+
+ =begin someformat
+
+ This is a data paragraph.
+
+ And this is a data paragraph.
+
+ =begin someotherformat
+
+ This is a data paragraph too.
+
+ And this is a data paragraph too.
+
+ =begin :yetanotherformat
+
+ =head2 This is a command paragraph!
+
+ This is an ordinary paragraph!
+
+ And this is a verbatim paragraph!
+
+ =end :yetanotherformat
+
+ =end someotherformat
+
+ Another data paragraph!
+
+ =end someformat
+
+The contents of the above "=begin :yetanotherformat" ...
+"=end :yetanotherformat" region I<aren't> data paragraphs, because
+the immediately containing region's identifier (":yetanotherformat")
+begins with a colon. In practice, most regions that contain
+data paragraphs will contain I<only> data paragraphs; however,
+the above nesting is syntactically valid as Pod, even if it is
+rare. However, the handlers for some formats, like "html",
+will accept only data paragraphs, not nested regions; and they may
+complain if they see (targeted for them) nested regions, or commands,
+other than "=end", "=pod", and "=cut".
+
+Also consider this valid structure:
+
+ =begin :biblio
+
+ Wirth's classic is available in several editions, including:
+
+ =over
+
+ =item
+
+ Wirth, Niklaus. 1975. I<Algorithmen und Datenstrukturen.>
+ Teubner, Stuttgart. [Yes, it's in German.]
+
+ =item
+
+ Wirth, Niklaus. 1976. I<Algorithms + Data Structures =
+ Programs.> Prentice-Hall, Englewood Cliffs, NJ.
+
+ =back
+
+ Buy buy buy!
+
+ =begin html
+
+ <img src='wirth_spokesmodeling_book.png'>
+
+ <hr>
+
+ =end html
+
+ Now now now!
+
+ =end :biblio
+
+There, the "=begin html"..."=end html" region is nested inside
+the larger "=begin :biblio"..."=end :biblio" region. Note that the
+content of the "=begin html"..."=end html" region is data
+paragraph(s), because the immediately containing region's identifier
+("html") I<doesn't> begin with a colon.
+
+Pod parsers, when processing a series of data paragraphs one
+after another (within a single region), should consider them to
+be one large data paragraph that happens to contain blank lines. So
+the content of the above "=begin html"..."=end html" I<may> be stored
+as two data paragraphs (one consisting of
+"<img src='wirth_spokesmodeling_book.png'>\n"
+and another consisting of "<hr>\n"), but I<should> be stored as
+a single data paragraph (consisting of
+"<img src='wirth_spokesmodeling_book.png'>\n\n<hr>\n").
+
+Pod processors should tolerate empty
+"=begin I<something>"..."=end I<something>" regions,
+empty "=begin :I<something>"..."=end :I<something>" regions, and
+contentless "=for I<something>" and "=for :I<something>"
+paragraphs. I.e., these should be tolerated:
+
+ =for html
+
+ =begin html
+
+ =end html
+
+ =begin :biblio
+
+ =end :biblio
+
+Incidentally, note that there's no easy way to express a data
+paragraph starting with something that looks like a command. Consider:
+
+ =begin stuff
+
+ =shazbot
+
+ =end stuff
+
+There, "=shazbot" will be parsed as a Pod command "shazbot", not as a data
+paragraph "=shazbot\n". However, you can express a data paragraph consisting
+of "=shazbot\n" using this code:
+
+ =for stuff =shazbot
+
+The situation where this is necessary, is presumably quite rare.
+
+Note that =end commands must match the currently open =begin command. That
+is, they must properly nest. For example, this is valid:
+
+ =begin outer
+
+ X
+
+ =begin inner
+
+ Y
+
+ =end inner
+
+ Z
+
+ =end outer
+
+while this is invalid:
+
+ =begin outer
+
+ X
+
+ =begin inner
+
+ Y
+
+ =end outer
+
+ Z
+
+ =end inner
+
+This latter is improper because when the "=end outer" command is seen, the
+currently open region has the formatname "inner", not "outer". (It just
+happens that "outer" is the format name of a higher-up region.) This is
+an error. Processors must by default report this as an error, and may halt
+processing the document containing that error. A corollary of this is that
+regions cannot "overlap" -- i.e., the latter block above does not represent
+a region called "outer" which contains X and Y, overlapping a region called
+"inner" which contains Y and Z. But because it is invalid (as all
+apparently overlapping regions would be), it doesn't represent that, or
+anything at all.
+
+Similarly, this is invalid:
+
+ =begin thing
+
+ =end hting
+
+This is an error because the region is opened by "thing", and the "=end"
+tries to close "hting" [sic].
+
+This is also invalid:
+
+ =begin thing
+
+ =end
+
+This is invalid because every "=end" command must have a formatname
+parameter.
+
+=head1 SEE ALSO
+
+L<perlpod>, L<perlsyn/"PODs: Embedded Documentation">,
+L<podchecker>
+
+=head1 AUTHOR
+
+Sean M. Burke
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlport.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlport.pod
new file mode 100755
index 00000000000..1bda8c005ff
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlport.pod
@@ -0,0 +1,2335 @@
+=head1 NAME
+
+perlport - Writing portable Perl
+
+=head1 DESCRIPTION
+
+Perl runs on numerous operating systems. While most of them share
+much in common, they also have their own unique features.
+
+This document is meant to help you to find out what constitutes portable
+Perl code. That way once you make a decision to write portably,
+you know where the lines are drawn, and you can stay within them.
+
+There is a tradeoff between taking full advantage of one particular
+type of computer and taking advantage of a full range of them.
+Naturally, as you broaden your range and become more diverse, the
+common factors drop, and you are left with an increasingly smaller
+area of common ground in which you can operate to accomplish a
+particular task. Thus, when you begin attacking a problem, it is
+important to consider under which part of the tradeoff curve you
+want to operate. Specifically, you must decide whether it is
+important that the task that you are coding have the full generality
+of being portable, or whether to just get the job done right now.
+This is the hardest choice to be made. The rest is easy, because
+Perl provides many choices, whichever way you want to approach your
+problem.
+
+Looking at it another way, writing portable code is usually about
+willfully limiting your available choices. Naturally, it takes
+discipline and sacrifice to do that. The product of portability
+and convenience may be a constant. You have been warned.
+
+Be aware of two important points:
+
+=over 4
+
+=item Not all Perl programs have to be portable
+
+There is no reason you should not use Perl as a language to glue Unix
+tools together, or to prototype a Macintosh application, or to manage the
+Windows registry. If it makes no sense to aim for portability for one
+reason or another in a given program, then don't bother.
+
+=item Nearly all of Perl already I<is> portable
+
+Don't be fooled into thinking that it is hard to create portable Perl
+code. It isn't. Perl tries its level-best to bridge the gaps between
+what's available on different platforms, and all the means available to
+use those features. Thus almost all Perl code runs on any machine
+without modification. But there are some significant issues in
+writing portable code, and this document is entirely about those issues.
+
+=back
+
+Here's the general rule: When you approach a task commonly done
+using a whole range of platforms, think about writing portable
+code. That way, you don't sacrifice much by way of the implementation
+choices you can avail yourself of, and at the same time you can give
+your users lots of platform choices. On the other hand, when you have to
+take advantage of some unique feature of a particular platform, as is
+often the case with systems programming (whether for Unix, Windows,
+S<Mac OS>, VMS, etc.), consider writing platform-specific code.
+
+When the code will run on only two or three operating systems, you
+may need to consider only the differences of those particular systems.
+The important thing is to decide where the code will run and to be
+deliberate in your decision.
+
+The material below is separated into three main sections: main issues of
+portability (L<"ISSUES">), platform-specific issues (L<"PLATFORMS">), and
+built-in perl functions that behave differently on various ports
+(L<"FUNCTION IMPLEMENTATIONS">).
+
+This information should not be considered complete; it includes possibly
+transient information about idiosyncrasies of some of the ports, almost
+all of which are in a state of constant evolution. Thus, this material
+should be considered a perpetual work in progress
+(C<< <IMG SRC="yellow_sign.gif" ALT="Under Construction"> >>).
+
+=head1 ISSUES
+
+=head2 Newlines
+
+In most operating systems, lines in files are terminated by newlines.
+Just what is used as a newline may vary from OS to OS. Unix
+traditionally uses C<\012>, one type of DOSish I/O uses C<\015\012>,
+and S<Mac OS> uses C<\015>.
+
+Perl uses C<\n> to represent the "logical" newline, where what is
+logical may depend on the platform in use. In MacPerl, C<\n> always
+means C<\015>. In DOSish perls, C<\n> usually means C<\012>, but
+when accessing a file in "text" mode, STDIO translates it to (or
+from) C<\015\012>, depending on whether you're reading or writing.
+Unix does the same thing on ttys in canonical mode. C<\015\012>
+is commonly referred to as CRLF.
+
+To trim trailing newlines from text lines use chomp(). With default
+settings that function looks for a trailing C<\n> character and thus
+trims in a portable way.
+
+When dealing with binary files (or text files in binary mode) be sure
+to explicitly set $/ to the appropriate value for your file format
+before using chomp().
+
+Because of the "text" mode translation, DOSish perls have limitations
+in using C<seek> and C<tell> on a file accessed in "text" mode.
+Stick to C<seek>-ing to locations you got from C<tell> (and no
+others), and you are usually free to use C<seek> and C<tell> even
+in "text" mode. Using C<seek> or C<tell> or other file operations
+may be non-portable. If you use C<binmode> on a file, however, you
+can usually C<seek> and C<tell> with arbitrary values in safety.
+
+A common misconception in socket programming is that C<\n> eq C<\012>
+everywhere. When using protocols such as common Internet protocols,
+C<\012> and C<\015> are called for specifically, and the values of
+the logical C<\n> and C<\r> (carriage return) are not reliable.
+
+ print SOCKET "Hi there, client!\r\n"; # WRONG
+ print SOCKET "Hi there, client!\015\012"; # RIGHT
+
+However, using C<\015\012> (or C<\cM\cJ>, or C<\x0D\x0A>) can be tedious
+and unsightly, as well as confusing to those maintaining the code. As
+such, the Socket module supplies the Right Thing for those who want it.
+
+ use Socket qw(:DEFAULT :crlf);
+ print SOCKET "Hi there, client!$CRLF" # RIGHT
+
+When reading from a socket, remember that the default input record
+separator C<$/> is C<\n>, but robust socket code will recognize as
+either C<\012> or C<\015\012> as end of line:
+
+ while (<SOCKET>) {
+ # ...
+ }
+
+Because both CRLF and LF end in LF, the input record separator can
+be set to LF and any CR stripped later. Better to write:
+
+ use Socket qw(:DEFAULT :crlf);
+ local($/) = LF; # not needed if $/ is already \012
+
+ while (<SOCKET>) {
+ s/$CR?$LF/\n/; # not sure if socket uses LF or CRLF, OK
+ # s/\015?\012/\n/; # same thing
+ }
+
+This example is preferred over the previous one--even for Unix
+platforms--because now any C<\015>'s (C<\cM>'s) are stripped out
+(and there was much rejoicing).
+
+Similarly, functions that return text data--such as a function that
+fetches a web page--should sometimes translate newlines before
+returning the data, if they've not yet been translated to the local
+newline representation. A single line of code will often suffice:
+
+ $data =~ s/\015?\012/\n/g;
+ return $data;
+
+Some of this may be confusing. Here's a handy reference to the ASCII CR
+and LF characters. You can print it out and stick it in your wallet.
+
+ LF eq \012 eq \x0A eq \cJ eq chr(10) eq ASCII 10
+ CR eq \015 eq \x0D eq \cM eq chr(13) eq ASCII 13
+
+ | Unix | DOS | Mac |
+ ---------------------------
+ \n | LF | LF | CR |
+ \r | CR | CR | LF |
+ \n * | LF | CRLF | CR |
+ \r * | CR | CR | LF |
+ ---------------------------
+ * text-mode STDIO
+
+The Unix column assumes that you are not accessing a serial line
+(like a tty) in canonical mode. If you are, then CR on input becomes
+"\n", and "\n" on output becomes CRLF.
+
+These are just the most common definitions of C<\n> and C<\r> in Perl.
+There may well be others. For example, on an EBCDIC implementation
+such as z/OS (OS/390) or OS/400 (using the ILE, the PASE is ASCII-based)
+the above material is similar to "Unix" but the code numbers change:
+
+ LF eq \025 eq \x15 eq \cU eq chr(21) eq CP-1047 21
+ LF eq \045 eq \x25 eq chr(37) eq CP-0037 37
+ CR eq \015 eq \x0D eq \cM eq chr(13) eq CP-1047 13
+ CR eq \015 eq \x0D eq \cM eq chr(13) eq CP-0037 13
+
+ | z/OS | OS/400 |
+ ----------------------
+ \n | LF | LF |
+ \r | CR | CR |
+ \n * | LF | LF |
+ \r * | CR | CR |
+ ----------------------
+ * text-mode STDIO
+
+=head2 Numbers endianness and Width
+
+Different CPUs store integers and floating point numbers in different
+orders (called I<endianness>) and widths (32-bit and 64-bit being the
+most common today). This affects your programs when they attempt to transfer
+numbers in binary format from one CPU architecture to another,
+usually either "live" via network connection, or by storing the
+numbers to secondary storage such as a disk file or tape.
+
+Conflicting storage orders make utter mess out of the numbers. If a
+little-endian host (Intel, VAX) stores 0x12345678 (305419896 in
+decimal), a big-endian host (Motorola, Sparc, PA) reads it as
+0x78563412 (2018915346 in decimal). Alpha and MIPS can be either:
+Digital/Compaq used/uses them in little-endian mode; SGI/Cray uses
+them in big-endian mode. To avoid this problem in network (socket)
+connections use the C<pack> and C<unpack> formats C<n> and C<N>, the
+"network" orders. These are guaranteed to be portable.
+
+As of perl 5.9.2, you can also use the C<E<gt>> and C<E<lt>> modifiers
+to force big- or little-endian byte-order. This is useful if you want
+to store signed integers or 64-bit integers, for example.
+
+You can explore the endianness of your platform by unpacking a
+data structure packed in native format such as:
+
+ print unpack("h*", pack("s2", 1, 2)), "\n";
+ # '10002000' on e.g. Intel x86 or Alpha 21064 in little-endian mode
+ # '00100020' on e.g. Motorola 68040
+
+If you need to distinguish between endian architectures you could use
+either of the variables set like so:
+
+ $is_big_endian = unpack("h*", pack("s", 1)) =~ /01/;
+ $is_little_endian = unpack("h*", pack("s", 1)) =~ /^1/;
+
+Differing widths can cause truncation even between platforms of equal
+endianness. The platform of shorter width loses the upper parts of the
+number. There is no good solution for this problem except to avoid
+transferring or storing raw binary numbers.
+
+One can circumnavigate both these problems in two ways. Either
+transfer and store numbers always in text format, instead of raw
+binary, or else consider using modules like Data::Dumper (included in
+the standard distribution as of Perl 5.005) and Storable (included as
+of perl 5.8). Keeping all data as text significantly simplifies matters.
+
+The v-strings are portable only up to v2147483647 (0x7FFFFFFF), that's
+how far EBCDIC, or more precisely UTF-EBCDIC will go.
+
+=head2 Files and Filesystems
+
+Most platforms these days structure files in a hierarchical fashion.
+So, it is reasonably safe to assume that all platforms support the
+notion of a "path" to uniquely identify a file on the system. How
+that path is really written, though, differs considerably.
+
+Although similar, file path specifications differ between Unix,
+Windows, S<Mac OS>, OS/2, VMS, VOS, S<RISC OS>, and probably others.
+Unix, for example, is one of the few OSes that has the elegant idea
+of a single root directory.
+
+DOS, OS/2, VMS, VOS, and Windows can work similarly to Unix with C</>
+as path separator, or in their own idiosyncratic ways (such as having
+several root directories and various "unrooted" device files such NIL:
+and LPT:).
+
+S<Mac OS> uses C<:> as a path separator instead of C</>.
+
+The filesystem may support neither hard links (C<link>) nor
+symbolic links (C<symlink>, C<readlink>, C<lstat>).
+
+The filesystem may support neither access timestamp nor change
+timestamp (meaning that about the only portable timestamp is the
+modification timestamp), or one second granularity of any timestamps
+(e.g. the FAT filesystem limits the time granularity to two seconds).
+
+The "inode change timestamp" (the C<-C> filetest) may really be the
+"creation timestamp" (which it is not in UNIX).
+
+VOS perl can emulate Unix filenames with C</> as path separator. The
+native pathname characters greater-than, less-than, number-sign, and
+percent-sign are always accepted.
+
+S<RISC OS> perl can emulate Unix filenames with C</> as path
+separator, or go native and use C<.> for path separator and C<:> to
+signal filesystems and disk names.
+
+Don't assume UNIX filesystem access semantics: that read, write,
+and execute are all the permissions there are, and even if they exist,
+that their semantics (for example what do r, w, and x mean on
+a directory) are the UNIX ones. The various UNIX/POSIX compatibility
+layers usually try to make interfaces like chmod() work, but sometimes
+there simply is no good mapping.
+
+If all this is intimidating, have no (well, maybe only a little)
+fear. There are modules that can help. The File::Spec modules
+provide methods to do the Right Thing on whatever platform happens
+to be running the program.
+
+ use File::Spec::Functions;
+ chdir(updir()); # go up one directory
+ $file = catfile(curdir(), 'temp', 'file.txt');
+ # on Unix and Win32, './temp/file.txt'
+ # on Mac OS, ':temp:file.txt'
+ # on VMS, '[.temp]file.txt'
+
+File::Spec is available in the standard distribution as of version
+5.004_05. File::Spec::Functions is only in File::Spec 0.7 and later,
+and some versions of perl come with version 0.6. If File::Spec
+is not updated to 0.7 or later, you must use the object-oriented
+interface from File::Spec (or upgrade File::Spec).
+
+In general, production code should not have file paths hardcoded.
+Making them user-supplied or read from a configuration file is
+better, keeping in mind that file path syntax varies on different
+machines.
+
+This is especially noticeable in scripts like Makefiles and test suites,
+which often assume C</> as a path separator for subdirectories.
+
+Also of use is File::Basename from the standard distribution, which
+splits a pathname into pieces (base filename, full path to directory,
+and file suffix).
+
+Even when on a single platform (if you can call Unix a single platform),
+remember not to count on the existence or the contents of particular
+system-specific files or directories, like F</etc/passwd>,
+F</etc/sendmail.conf>, F</etc/resolv.conf>, or even F</tmp/>. For
+example, F</etc/passwd> may exist but not contain the encrypted
+passwords, because the system is using some form of enhanced security.
+Or it may not contain all the accounts, because the system is using NIS.
+If code does need to rely on such a file, include a description of the
+file and its format in the code's documentation, then make it easy for
+the user to override the default location of the file.
+
+Don't assume a text file will end with a newline. They should,
+but people forget.
+
+Do not have two files or directories of the same name with different
+case, like F<test.pl> and F<Test.pl>, as many platforms have
+case-insensitive (or at least case-forgiving) filenames. Also, try
+not to have non-word characters (except for C<.>) in the names, and
+keep them to the 8.3 convention, for maximum portability, onerous a
+burden though this may appear.
+
+Likewise, when using the AutoSplit module, try to keep your functions to
+8.3 naming and case-insensitive conventions; or, at the least,
+make it so the resulting files have a unique (case-insensitively)
+first 8 characters.
+
+Whitespace in filenames is tolerated on most systems, but not all,
+and even on systems where it might be tolerated, some utilities
+might become confused by such whitespace.
+
+Many systems (DOS, VMS ODS-2) cannot have more than one C<.> in their
+filenames.
+
+Don't assume C<< > >> won't be the first character of a filename.
+Always use C<< < >> explicitly to open a file for reading, or even
+better, use the three-arg version of open, unless you want the user to
+be able to specify a pipe open.
+
+ open(FILE, '<', $existing_file) or die $!;
+
+If filenames might use strange characters, it is safest to open it
+with C<sysopen> instead of C<open>. C<open> is magic and can
+translate characters like C<< > >>, C<< < >>, and C<|>, which may
+be the wrong thing to do. (Sometimes, though, it's the right thing.)
+Three-arg open can also help protect against this translation in cases
+where it is undesirable.
+
+Don't use C<:> as a part of a filename since many systems use that for
+their own semantics (Mac OS Classic for separating pathname components,
+many networking schemes and utilities for separating the nodename and
+the pathname, and so on). For the same reasons, avoid C<@>, C<;> and
+C<|>.
+
+Don't assume that in pathnames you can collapse two leading slashes
+C<//> into one: some networking and clustering filesystems have special
+semantics for that. Let the operating system to sort it out.
+
+The I<portable filename characters> as defined by ANSI C are
+
+ a b c d e f g h i j k l m n o p q r t u v w x y z
+ A B C D E F G H I J K L M N O P Q R T U V W X Y Z
+ 0 1 2 3 4 5 6 7 8 9
+ . _ -
+
+and the "-" shouldn't be the first character. If you want to be
+hypercorrect, stay case-insensitive and within the 8.3 naming
+convention (all the files and directories have to be unique within one
+directory if their names are lowercased and truncated to eight
+characters before the C<.>, if any, and to three characters after the
+C<.>, if any). (And do not use C<.>s in directory names.)
+
+=head2 System Interaction
+
+Not all platforms provide a command line. These are usually platforms
+that rely primarily on a Graphical User Interface (GUI) for user
+interaction. A program requiring a command line interface might
+not work everywhere. This is probably for the user of the program
+to deal with, so don't stay up late worrying about it.
+
+Some platforms can't delete or rename files held open by the system,
+this limitation may also apply to changing filesystem metainformation
+like file permissions or owners. Remember to C<close> files when you
+are done with them. Don't C<unlink> or C<rename> an open file. Don't
+C<tie> or C<open> a file already tied or opened; C<untie> or C<close>
+it first.
+
+Don't open the same file more than once at a time for writing, as some
+operating systems put mandatory locks on such files.
+
+Don't assume that write/modify permission on a directory gives the
+right to add or delete files/directories in that directory. That is
+filesystem specific: in some filesystems you need write/modify
+permission also (or even just) in the file/directory itself. In some
+filesystems (AFS, DFS) the permission to add/delete directory entries
+is a completely separate permission.
+
+Don't assume that a single C<unlink> completely gets rid of the file:
+some filesystems (most notably the ones in VMS) have versioned
+filesystems, and unlink() removes only the most recent one (it doesn't
+remove all the versions because by default the native tools on those
+platforms remove just the most recent version, too). The portable
+idiom to remove all the versions of a file is
+
+ 1 while unlink "file";
+
+This will terminate if the file is undeleteable for some reason
+(protected, not there, and so on).
+
+Don't count on a specific environment variable existing in C<%ENV>.
+Don't count on C<%ENV> entries being case-sensitive, or even
+case-preserving. Don't try to clear %ENV by saying C<%ENV = ();>, or,
+if you really have to, make it conditional on C<$^O ne 'VMS'> since in
+VMS the C<%ENV> table is much more than a per-process key-value string
+table.
+
+On VMS, some entries in the %ENV hash are dynamically created when
+their key is used on a read if they did not previously exist. The
+values for C<$ENV{HOME}>, C<$ENV{TERM}>, C<$ENV{HOME}>, and C<$ENV{USER}>,
+are known to be dynamically generated. The specific names that are
+dynamically generated may vary with the version of the C library on VMS,
+and more may exist than is documented.
+
+On VMS by default, changes to the %ENV hash are persistent after the process
+exits. This can cause unintended issues.
+
+Don't count on signals or C<%SIG> for anything.
+
+Don't count on filename globbing. Use C<opendir>, C<readdir>, and
+C<closedir> instead.
+
+Don't count on per-program environment variables, or per-program current
+directories.
+
+Don't count on specific values of C<$!>, neither numeric nor
+especially the strings values-- users may switch their locales causing
+error messages to be translated into their languages. If you can
+trust a POSIXish environment, you can portably use the symbols defined
+by the Errno module, like ENOENT. And don't trust on the values of C<$!>
+at all except immediately after a failed system call.
+
+=head2 Command names versus file pathnames
+
+Don't assume that the name used to invoke a command or program with
+C<system> or C<exec> can also be used to test for the existence of the
+file that holds the executable code for that command or program.
+First, many systems have "internal" commands that are built-in to the
+shell or OS and while these commands can be invoked, there is no
+corresponding file. Second, some operating systems (e.g., Cygwin,
+DJGPP, OS/2, and VOS) have required suffixes for executable files;
+these suffixes are generally permitted on the command name but are not
+required. Thus, a command like "perl" might exist in a file named
+"perl", "perl.exe", or "perl.pm", depending on the operating system.
+The variable "_exe" in the Config module holds the executable suffix,
+if any. Third, the VMS port carefully sets up $^X and
+$Config{perlpath} so that no further processing is required. This is
+just as well, because the matching regular expression used below would
+then have to deal with a possible trailing version number in the VMS
+file name.
+
+To convert $^X to a file pathname, taking account of the requirements
+of the various operating system possibilities, say:
+
+ use Config;
+ $thisperl = $^X;
+ if ($^O ne 'VMS')
+ {$thisperl .= $Config{_exe} unless $thisperl =~ m/$Config{_exe}$/i;}
+
+To convert $Config{perlpath} to a file pathname, say:
+
+ use Config;
+ $thisperl = $Config{perlpath};
+ if ($^O ne 'VMS')
+ {$thisperl .= $Config{_exe} unless $thisperl =~ m/$Config{_exe}$/i;}
+
+=head2 Networking
+
+Don't assume that you can reach the public Internet.
+
+Don't assume that there is only one way to get through firewalls
+to the public Internet.
+
+Don't assume that you can reach outside world through any other port
+than 80, or some web proxy. ftp is blocked by many firewalls.
+
+Don't assume that you can send email by connecting to the local SMTP port.
+
+Don't assume that you can reach yourself or any node by the name
+'localhost'. The same goes for '127.0.0.1'. You will have to try both.
+
+Don't assume that the host has only one network card, or that it
+can't bind to many virtual IP addresses.
+
+Don't assume a particular network device name.
+
+Don't assume a particular set of ioctl()s will work.
+
+Don't assume that you can ping hosts and get replies.
+
+Don't assume that any particular port (service) will respond.
+
+Don't assume that Sys::Hostname (or any other API or command)
+returns either a fully qualified hostname or a non-qualified hostname:
+it all depends on how the system had been configured. Also remember
+things like DHCP and NAT-- the hostname you get back might not be very
+useful.
+
+All the above "don't":s may look daunting, and they are -- but the key
+is to degrade gracefully if one cannot reach the particular network
+service one wants. Croaking or hanging do not look very professional.
+
+=head2 Interprocess Communication (IPC)
+
+In general, don't directly access the system in code meant to be
+portable. That means, no C<system>, C<exec>, C<fork>, C<pipe>,
+C<``>, C<qx//>, C<open> with a C<|>, nor any of the other things
+that makes being a perl hacker worth being.
+
+Commands that launch external processes are generally supported on
+most platforms (though many of them do not support any type of
+forking). The problem with using them arises from what you invoke
+them on. External tools are often named differently on different
+platforms, may not be available in the same location, might accept
+different arguments, can behave differently, and often present their
+results in a platform-dependent way. Thus, you should seldom depend
+on them to produce consistent results. (Then again, if you're calling
+I<netstat -a>, you probably don't expect it to run on both Unix and CP/M.)
+
+One especially common bit of Perl code is opening a pipe to B<sendmail>:
+
+ open(MAIL, '|/usr/lib/sendmail -t')
+ or die "cannot fork sendmail: $!";
+
+This is fine for systems programming when sendmail is known to be
+available. But it is not fine for many non-Unix systems, and even
+some Unix systems that may not have sendmail installed. If a portable
+solution is needed, see the various distributions on CPAN that deal
+with it. Mail::Mailer and Mail::Send in the MailTools distribution are
+commonly used, and provide several mailing methods, including mail,
+sendmail, and direct SMTP (via Net::SMTP) if a mail transfer agent is
+not available. Mail::Sendmail is a standalone module that provides
+simple, platform-independent mailing.
+
+The Unix System V IPC (C<msg*(), sem*(), shm*()>) is not available
+even on all Unix platforms.
+
+Do not use either the bare result of C<pack("N", 10, 20, 30, 40)> or
+bare v-strings (such as C<v10.20.30.40>) to represent IPv4 addresses:
+both forms just pack the four bytes into network order. That this
+would be equal to the C language C<in_addr> struct (which is what the
+socket code internally uses) is not guaranteed. To be portable use
+the routines of the Socket extension, such as C<inet_aton()>,
+C<inet_ntoa()>, and C<sockaddr_in()>.
+
+The rule of thumb for portable code is: Do it all in portable Perl, or
+use a module (that may internally implement it with platform-specific
+code, but expose a common interface).
+
+=head2 External Subroutines (XS)
+
+XS code can usually be made to work with any platform, but dependent
+libraries, header files, etc., might not be readily available or
+portable, or the XS code itself might be platform-specific, just as Perl
+code might be. If the libraries and headers are portable, then it is
+normally reasonable to make sure the XS code is portable, too.
+
+A different type of portability issue arises when writing XS code:
+availability of a C compiler on the end-user's system. C brings
+with it its own portability issues, and writing XS code will expose
+you to some of those. Writing purely in Perl is an easier way to
+achieve portability.
+
+=head2 Standard Modules
+
+In general, the standard modules work across platforms. Notable
+exceptions are the CPAN module (which currently makes connections to external
+programs that may not be available), platform-specific modules (like
+ExtUtils::MM_VMS), and DBM modules.
+
+There is no one DBM module available on all platforms.
+SDBM_File and the others are generally available on all Unix and DOSish
+ports, but not in MacPerl, where only NBDM_File and DB_File are
+available.
+
+The good news is that at least some DBM module should be available, and
+AnyDBM_File will use whichever module it can find. Of course, then
+the code needs to be fairly strict, dropping to the greatest common
+factor (e.g., not exceeding 1K for each record), so that it will
+work with any DBM module. See L<AnyDBM_File> for more details.
+
+=head2 Time and Date
+
+The system's notion of time of day and calendar date is controlled in
+widely different ways. Don't assume the timezone is stored in C<$ENV{TZ}>,
+and even if it is, don't assume that you can control the timezone through
+that variable. Don't assume anything about the three-letter timezone
+abbreviations (for example that MST would be the Mountain Standard Time,
+it's been known to stand for Moscow Standard Time). If you need to
+use timezones, express them in some unambiguous format like the
+exact number of minutes offset from UTC, or the POSIX timezone
+format.
+
+Don't assume that the epoch starts at 00:00:00, January 1, 1970,
+because that is OS- and implementation-specific. It is better to
+store a date in an unambiguous representation. The ISO 8601 standard
+defines YYYY-MM-DD as the date format, or YYYY-MM-DDTHH-MM-SS
+(that's a literal "T" separating the date from the time).
+Please do use the ISO 8601 instead of making us to guess what
+date 02/03/04 might be. ISO 8601 even sorts nicely as-is.
+A text representation (like "1987-12-18") can be easily converted
+into an OS-specific value using a module like Date::Parse.
+An array of values, such as those returned by C<localtime>, can be
+converted to an OS-specific representation using Time::Local.
+
+When calculating specific times, such as for tests in time or date modules,
+it may be appropriate to calculate an offset for the epoch.
+
+ require Time::Local;
+ $offset = Time::Local::timegm(0, 0, 0, 1, 0, 70);
+
+The value for C<$offset> in Unix will be C<0>, but in Mac OS will be
+some large number. C<$offset> can then be added to a Unix time value
+to get what should be the proper value on any system.
+
+On Windows (at least), you shouldn't pass a negative value to C<gmtime> or
+C<localtime>.
+
+=head2 Character sets and character encoding
+
+Assume very little about character sets.
+
+Assume nothing about numerical values (C<ord>, C<chr>) of characters.
+Do not use explicit code point ranges (like \xHH-\xHH); use for
+example symbolic character classes like C<[:print:]>.
+
+Do not assume that the alphabetic characters are encoded contiguously
+(in the numeric sense). There may be gaps.
+
+Do not assume anything about the ordering of the characters.
+The lowercase letters may come before or after the uppercase letters;
+the lowercase and uppercase may be interlaced so that both "a" and "A"
+come before "b"; the accented and other international characters may
+be interlaced so that E<auml> comes before "b".
+
+=head2 Internationalisation
+
+If you may assume POSIX (a rather large assumption), you may read
+more about the POSIX locale system from L<perllocale>. The locale
+system at least attempts to make things a little bit more portable,
+or at least more convenient and native-friendly for non-English
+users. The system affects character sets and encoding, and date
+and time formatting--amongst other things.
+
+If you really want to be international, you should consider Unicode.
+See L<perluniintro> and L<perlunicode> for more information.
+
+If you want to use non-ASCII bytes (outside the bytes 0x00..0x7f) in
+the "source code" of your code, to be portable you have to be explicit
+about what bytes they are. Someone might for example be using your
+code under a UTF-8 locale, in which case random native bytes might be
+illegal ("Malformed UTF-8 ...") This means that for example embedding
+ISO 8859-1 bytes beyond 0x7f into your strings might cause trouble
+later. If the bytes are native 8-bit bytes, you can use the C<bytes>
+pragma. If the bytes are in a string (regular expression being a
+curious string), you can often also use the C<\xHH> notation instead
+of embedding the bytes as-is. (If you want to write your code in UTF-8,
+you can use the C<utf8>.) The C<bytes> and C<utf8> pragmata are
+available since Perl 5.6.0.
+
+=head2 System Resources
+
+If your code is destined for systems with severely constrained (or
+missing!) virtual memory systems then you want to be I<especially> mindful
+of avoiding wasteful constructs such as:
+
+ # NOTE: this is no longer "bad" in perl5.005
+ for (0..10000000) {} # bad
+ for (my $x = 0; $x <= 10000000; ++$x) {} # good
+
+ @lines = <VERY_LARGE_FILE>; # bad
+
+ while (<FILE>) {$file .= $_} # sometimes bad
+ $file = join('', <FILE>); # better
+
+The last two constructs may appear unintuitive to most people. The
+first repeatedly grows a string, whereas the second allocates a
+large chunk of memory in one go. On some systems, the second is
+more efficient that the first.
+
+=head2 Security
+
+Most multi-user platforms provide basic levels of security, usually
+implemented at the filesystem level. Some, however, do
+not-- unfortunately. Thus the notion of user id, or "home" directory,
+or even the state of being logged-in, may be unrecognizable on many
+platforms. If you write programs that are security-conscious, it
+is usually best to know what type of system you will be running
+under so that you can write code explicitly for that platform (or
+class of platforms).
+
+Don't assume the UNIX filesystem access semantics: the operating
+system or the filesystem may be using some ACL systems, which are
+richer languages than the usual rwx. Even if the rwx exist,
+their semantics might be different.
+
+(From security viewpoint testing for permissions before attempting to
+do something is silly anyway: if one tries this, there is potential
+for race conditions-- someone or something might change the
+permissions between the permissions check and the actual operation.
+Just try the operation.)
+
+Don't assume the UNIX user and group semantics: especially, don't
+expect the C<< $< >> and C<< $> >> (or the C<$(> and C<$)>) to work
+for switching identities (or memberships).
+
+Don't assume set-uid and set-gid semantics. (And even if you do,
+think twice: set-uid and set-gid are a known can of security worms.)
+
+=head2 Style
+
+For those times when it is necessary to have platform-specific code,
+consider keeping the platform-specific code in one place, making porting
+to other platforms easier. Use the Config module and the special
+variable C<$^O> to differentiate platforms, as described in
+L<"PLATFORMS">.
+
+Be careful in the tests you supply with your module or programs.
+Module code may be fully portable, but its tests might not be. This
+often happens when tests spawn off other processes or call external
+programs to aid in the testing, or when (as noted above) the tests
+assume certain things about the filesystem and paths. Be careful not
+to depend on a specific output style for errors, such as when checking
+C<$!> after a failed system call. Using C<$!> for anything else than
+displaying it as output is doubtful (though see the Errno module for
+testing reasonably portably for error value). Some platforms expect
+a certain output format, and Perl on those platforms may have been
+adjusted accordingly. Most specifically, don't anchor a regex when
+testing an error value.
+
+=head1 CPAN Testers
+
+Modules uploaded to CPAN are tested by a variety of volunteers on
+different platforms. These CPAN testers are notified by mail of each
+new upload, and reply to the list with PASS, FAIL, NA (not applicable to
+this platform), or UNKNOWN (unknown), along with any relevant notations.
+
+The purpose of the testing is twofold: one, to help developers fix any
+problems in their code that crop up because of lack of testing on other
+platforms; two, to provide users with information about whether
+a given module works on a given platform.
+
+Also see:
+
+=over 4
+
+=item *
+
+Mailing list: cpan-testers@perl.org
+
+=item *
+
+Testing results: http://testers.cpan.org/
+
+=back
+
+=head1 PLATFORMS
+
+As of version 5.002, Perl is built with a C<$^O> variable that
+indicates the operating system it was built on. This was implemented
+to help speed up code that would otherwise have to C<use Config>
+and use the value of C<$Config{osname}>. Of course, to get more
+detailed information about the system, looking into C<%Config> is
+certainly recommended.
+
+C<%Config> cannot always be trusted, however, because it was built
+at compile time. If perl was built in one place, then transferred
+elsewhere, some values may be wrong. The values may even have been
+edited after the fact.
+
+=head2 Unix
+
+Perl works on a bewildering variety of Unix and Unix-like platforms (see
+e.g. most of the files in the F<hints/> directory in the source code kit).
+On most of these systems, the value of C<$^O> (hence C<$Config{'osname'}>,
+too) is determined either by lowercasing and stripping punctuation from the
+first field of the string returned by typing C<uname -a> (or a similar command)
+at the shell prompt or by testing the file system for the presence of
+uniquely named files such as a kernel or header file. Here, for example,
+are a few of the more popular Unix flavors:
+
+ uname $^O $Config{'archname'}
+ --------------------------------------------
+ AIX aix aix
+ BSD/OS bsdos i386-bsdos
+ Darwin darwin darwin
+ dgux dgux AViiON-dgux
+ DYNIX/ptx dynixptx i386-dynixptx
+ FreeBSD freebsd freebsd-i386
+ Haiku haiku BePC-haiku
+ Linux linux arm-linux
+ Linux linux i386-linux
+ Linux linux i586-linux
+ Linux linux ppc-linux
+ HP-UX hpux PA-RISC1.1
+ IRIX irix irix
+ Mac OS X darwin darwin
+ MachTen PPC machten powerpc-machten
+ NeXT 3 next next-fat
+ NeXT 4 next OPENSTEP-Mach
+ openbsd openbsd i386-openbsd
+ OSF1 dec_osf alpha-dec_osf
+ reliantunix-n svr4 RM400-svr4
+ SCO_SV sco_sv i386-sco_sv
+ SINIX-N svr4 RM400-svr4
+ sn4609 unicos CRAY_C90-unicos
+ sn6521 unicosmk t3e-unicosmk
+ sn9617 unicos CRAY_J90-unicos
+ SunOS solaris sun4-solaris
+ SunOS solaris i86pc-solaris
+ SunOS4 sunos sun4-sunos
+
+Because the value of C<$Config{archname}> may depend on the
+hardware architecture, it can vary more than the value of C<$^O>.
+
+=head2 DOS and Derivatives
+
+Perl has long been ported to Intel-style microcomputers running under
+systems like PC-DOS, MS-DOS, OS/2, and most Windows platforms you can
+bring yourself to mention (except for Windows CE, if you count that).
+Users familiar with I<COMMAND.COM> or I<CMD.EXE> style shells should
+be aware that each of these file specifications may have subtle
+differences:
+
+ $filespec0 = "c:/foo/bar/file.txt";
+ $filespec1 = "c:\\foo\\bar\\file.txt";
+ $filespec2 = 'c:\foo\bar\file.txt';
+ $filespec3 = 'c:\\foo\\bar\\file.txt';
+
+System calls accept either C</> or C<\> as the path separator.
+However, many command-line utilities of DOS vintage treat C</> as
+the option prefix, so may get confused by filenames containing C</>.
+Aside from calling any external programs, C</> will work just fine,
+and probably better, as it is more consistent with popular usage,
+and avoids the problem of remembering what to backwhack and what
+not to.
+
+The DOS FAT filesystem can accommodate only "8.3" style filenames. Under
+the "case-insensitive, but case-preserving" HPFS (OS/2) and NTFS (NT)
+filesystems you may have to be careful about case returned with functions
+like C<readdir> or used with functions like C<open> or C<opendir>.
+
+DOS also treats several filenames as special, such as AUX, PRN,
+NUL, CON, COM1, LPT1, LPT2, etc. Unfortunately, sometimes these
+filenames won't even work if you include an explicit directory
+prefix. It is best to avoid such filenames, if you want your code
+to be portable to DOS and its derivatives. It's hard to know what
+these all are, unfortunately.
+
+Users of these operating systems may also wish to make use of
+scripts such as I<pl2bat.bat> or I<pl2cmd> to
+put wrappers around your scripts.
+
+Newline (C<\n>) is translated as C<\015\012> by STDIO when reading from
+and writing to files (see L<"Newlines">). C<binmode(FILEHANDLE)>
+will keep C<\n> translated as C<\012> for that filehandle. Since it is a
+no-op on other systems, C<binmode> should be used for cross-platform code
+that deals with binary data. That's assuming you realize in advance
+that your data is in binary. General-purpose programs should
+often assume nothing about their data.
+
+The C<$^O> variable and the C<$Config{archname}> values for various
+DOSish perls are as follows:
+
+ OS $^O $Config{archname} ID Version
+ --------------------------------------------------------
+ MS-DOS dos ?
+ PC-DOS dos ?
+ OS/2 os2 ?
+ Windows 3.1 ? ? 0 3 01
+ Windows 95 MSWin32 MSWin32-x86 1 4 00
+ Windows 98 MSWin32 MSWin32-x86 1 4 10
+ Windows ME MSWin32 MSWin32-x86 1 ?
+ Windows NT MSWin32 MSWin32-x86 2 4 xx
+ Windows NT MSWin32 MSWin32-ALPHA 2 4 xx
+ Windows NT MSWin32 MSWin32-ppc 2 4 xx
+ Windows 2000 MSWin32 MSWin32-x86 2 5 00
+ Windows XP MSWin32 MSWin32-x86 2 5 01
+ Windows 2003 MSWin32 MSWin32-x86 2 5 02
+ Windows CE MSWin32 ? 3
+ Cygwin cygwin cygwin
+
+The various MSWin32 Perl's can distinguish the OS they are running on
+via the value of the fifth element of the list returned from
+Win32::GetOSVersion(). For example:
+
+ if ($^O eq 'MSWin32') {
+ my @os_version_info = Win32::GetOSVersion();
+ print +('3.1','95','NT')[$os_version_info[4]],"\n";
+ }
+
+There are also Win32::IsWinNT() and Win32::IsWin95(), try C<perldoc Win32>,
+and as of libwin32 0.19 (not part of the core Perl distribution)
+Win32::GetOSName(). The very portable POSIX::uname() will work too:
+
+ c:\> perl -MPOSIX -we "print join '|', uname"
+ Windows NT|moonru|5.0|Build 2195 (Service Pack 2)|x86
+
+Also see:
+
+=over 4
+
+=item *
+
+The djgpp environment for DOS, http://www.delorie.com/djgpp/
+and L<perldos>.
+
+=item *
+
+The EMX environment for DOS, OS/2, etc. emx@iaehv.nl,
+http://www.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/index.html or
+ftp://hobbes.nmsu.edu/pub/os2/dev/emx/ Also L<perlos2>.
+
+=item *
+
+Build instructions for Win32 in L<perlwin32>, or under the Cygnus environment
+in L<perlcygwin>.
+
+=item *
+
+The C<Win32::*> modules in L<Win32>.
+
+=item *
+
+The ActiveState Pages, http://www.activestate.com/
+
+=item *
+
+The Cygwin environment for Win32; F<README.cygwin> (installed
+as L<perlcygwin>), http://www.cygwin.com/
+
+=item *
+
+The U/WIN environment for Win32,
+http://www.research.att.com/sw/tools/uwin/
+
+=item *
+
+Build instructions for OS/2, L<perlos2>
+
+=back
+
+=head2 S<Mac OS>
+
+Any module requiring XS compilation is right out for most people, because
+MacPerl is built using non-free (and non-cheap!) compilers. Some XS
+modules that can work with MacPerl are built and distributed in binary
+form on CPAN.
+
+Directories are specified as:
+
+ volume:folder:file for absolute pathnames
+ volume:folder: for absolute pathnames
+ :folder:file for relative pathnames
+ :folder: for relative pathnames
+ :file for relative pathnames
+ file for relative pathnames
+
+Files are stored in the directory in alphabetical order. Filenames are
+limited to 31 characters, and may include any character except for
+null and C<:>, which is reserved as the path separator.
+
+Instead of C<flock>, see C<FSpSetFLock> and C<FSpRstFLock> in the
+Mac::Files module, or C<chmod(0444, ...)> and C<chmod(0666, ...)>.
+
+In the MacPerl application, you can't run a program from the command line;
+programs that expect C<@ARGV> to be populated can be edited with something
+like the following, which brings up a dialog box asking for the command
+line arguments.
+
+ if (!@ARGV) {
+ @ARGV = split /\s+/, MacPerl::Ask('Arguments?');
+ }
+
+A MacPerl script saved as a "droplet" will populate C<@ARGV> with the full
+pathnames of the files dropped onto the script.
+
+Mac users can run programs under a type of command line interface
+under MPW (Macintosh Programmer's Workshop, a free development
+environment from Apple). MacPerl was first introduced as an MPW
+tool, and MPW can be used like a shell:
+
+ perl myscript.plx some arguments
+
+ToolServer is another app from Apple that provides access to MPW tools
+from MPW and the MacPerl app, which allows MacPerl programs to use
+C<system>, backticks, and piped C<open>.
+
+"S<Mac OS>" is the proper name for the operating system, but the value
+in C<$^O> is "MacOS". To determine architecture, version, or whether
+the application or MPW tool version is running, check:
+
+ $is_app = $MacPerl::Version =~ /App/;
+ $is_tool = $MacPerl::Version =~ /MPW/;
+ ($version) = $MacPerl::Version =~ /^(\S+)/;
+ $is_ppc = $MacPerl::Architecture eq 'MacPPC';
+ $is_68k = $MacPerl::Architecture eq 'Mac68K';
+
+S<Mac OS X>, based on NeXT's OpenStep OS, runs MacPerl natively, under the
+"Classic" environment. There is no "Carbon" version of MacPerl to run
+under the primary Mac OS X environment. S<Mac OS X> and its Open Source
+version, Darwin, both run Unix perl natively.
+
+Also see:
+
+=over 4
+
+=item *
+
+MacPerl Development, http://dev.macperl.org/ .
+
+=item *
+
+The MacPerl Pages, http://www.macperl.com/ .
+
+=item *
+
+The MacPerl mailing lists, http://lists.perl.org/ .
+
+=item *
+
+MPW, ftp://ftp.apple.com/developer/Tool_Chest/Core_Mac_OS_Tools/
+
+=back
+
+=head2 VMS
+
+Perl on VMS is discussed in L<perlvms> in the perl distribution.
+
+The official name of VMS as of this writing is OpenVMS.
+
+Perl on VMS can accept either VMS- or Unix-style file
+specifications as in either of the following:
+
+ $ perl -ne "print if /perl_setup/i" SYS$LOGIN:LOGIN.COM
+ $ perl -ne "print if /perl_setup/i" /sys$login/login.com
+
+but not a mixture of both as in:
+
+ $ perl -ne "print if /perl_setup/i" sys$login:/login.com
+ Can't open sys$login:/login.com: file specification syntax error
+
+Interacting with Perl from the Digital Command Language (DCL) shell
+often requires a different set of quotation marks than Unix shells do.
+For example:
+
+ $ perl -e "print ""Hello, world.\n"""
+ Hello, world.
+
+There are several ways to wrap your perl scripts in DCL F<.COM> files, if
+you are so inclined. For example:
+
+ $ write sys$output "Hello from DCL!"
+ $ if p1 .eqs. ""
+ $ then perl -x 'f$environment("PROCEDURE")
+ $ else perl -x - 'p1 'p2 'p3 'p4 'p5 'p6 'p7 'p8
+ $ deck/dollars="__END__"
+ #!/usr/bin/perl
+
+ print "Hello from Perl!\n";
+
+ __END__
+ $ endif
+
+Do take care with C<$ ASSIGN/nolog/user SYS$COMMAND: SYS$INPUT> if your
+perl-in-DCL script expects to do things like C<< $read = <STDIN>; >>.
+
+The VMS operating system has two filesystems, known as ODS-2 and ODS-5.
+
+For ODS-2, filenames are in the format "name.extension;version". The
+maximum length for filenames is 39 characters, and the maximum length for
+extensions is also 39 characters. Version is a number from 1 to
+32767. Valid characters are C</[A-Z0-9$_-]/>.
+
+The ODS-2 filesystem is case-insensitive and does not preserve case.
+Perl simulates this by converting all filenames to lowercase internally.
+
+For ODS-5, filenames may have almost any character in them and can include
+Unicode characters. Characters that could be misinterpreted by the DCL
+shell or file parsing utilities need to be prefixed with the C<^>
+character, or replaced with hexadecimal characters prefixed with the
+C<^> character. Such prefixing is only needed with the pathnames are
+in VMS format in applications. Programs that can accept the UNIX format
+of pathnames do not need the escape characters. The maximum length for
+filenames is 255 characters. The ODS-5 file system can handle both
+a case preserved and a case sensitive mode.
+
+ODS-5 is only available on the OpenVMS for 64 bit platforms.
+
+Support for the extended file specifications is being done as optional
+settings to preserve backward compatibility with Perl scripts that
+assume the previous VMS limitations.
+
+In general routines on VMS that get a UNIX format file specification
+should return it in a UNIX format, and when they get a VMS format
+specification they should return a VMS format unless they are documented
+to do a conversion.
+
+For routines that generate return a file specification, VMS allows setting
+if the C library which Perl is built on if it will be returned in VMS
+format or in UNIX format.
+
+With the ODS-2 file system, there is not much difference in syntax of
+filenames without paths for VMS or UNIX. With the extended character
+set available with ODS-5 there can be a significant difference.
+
+Because of this, existing Perl scripts written for VMS were sometimes
+treating VMS and UNIX filenames interchangeably. Without the extended
+character set enabled, this behavior will mostly be maintained for
+backwards compatibility.
+
+When extended characters are enabled with ODS-5, the handling of
+UNIX formatted file specifications is to that of a UNIX system.
+
+VMS file specifications without extensions have a trailing dot. An
+equivalent UNIX file specification should not show the trailing dot.
+
+The result of all of this, is that for VMS, for portable scripts, you
+can not depend on Perl to present the filenames in lowercase, to be
+case sensitive, and that the filenames could be returned in either
+UNIX or VMS format.
+
+And if a routine returns a file specification, unless it is intended to
+convert it, it should return it in the same format as it found it.
+
+C<readdir> by default has traditionally returned lowercased filenames.
+When the ODS-5 support is enabled, it will return the exact case of the
+filename on the disk.
+
+Files without extensions have a trailing period on them, so doing a
+C<readdir> in the default mode with a file named F<A.;5> will
+return F<a.> when VMS is (though that file could be opened with
+C<open(FH, 'A')>).
+
+With support for extended file specifications and if C<opendir> was
+given a UNIX format directory, a file named F<A.;5> will return F<a>
+and optionally in the exact case on the disk. When C<opendir> is given
+a VMS format directory, then C<readdir> should return F<a.>, and
+again with the optionally the exact case.
+
+RMS had an eight level limit on directory depths from any rooted logical
+(allowing 16 levels overall) prior to VMS 7.2, and even with versions of
+VMS on VAX up through 7.3. Hence C<PERL_ROOT:[LIB.2.3.4.5.6.7.8]> is a
+valid directory specification but C<PERL_ROOT:[LIB.2.3.4.5.6.7.8.9]> is
+not. F<Makefile.PL> authors might have to take this into account, but at
+least they can refer to the former as C</PERL_ROOT/lib/2/3/4/5/6/7/8/>.
+
+Pumpkings and module integrators can easily see whether files with too many
+directory levels have snuck into the core by running the following in the
+top-level source directory:
+
+ $ perl -ne "$_=~s/\s+.*//; print if scalar(split /\//) > 8;" < MANIFEST
+
+
+The VMS::Filespec module, which gets installed as part of the build
+process on VMS, is a pure Perl module that can easily be installed on
+non-VMS platforms and can be helpful for conversions to and from RMS
+native formats. It is also now the only way that you should check to
+see if VMS is in a case sensitive mode.
+
+What C<\n> represents depends on the type of file opened. It usually
+represents C<\012> but it could also be C<\015>, C<\012>, C<\015\012>,
+C<\000>, C<\040>, or nothing depending on the file organization and
+record format. The VMS::Stdio module provides access to the
+special fopen() requirements of files with unusual attributes on VMS.
+
+TCP/IP stacks are optional on VMS, so socket routines might not be
+implemented. UDP sockets may not be supported.
+
+The TCP/IP library support for all current versions of VMS is dynamically
+loaded if present, so even if the routines are configured, they may
+return a status indicating that they are not implemented.
+
+The value of C<$^O> on OpenVMS is "VMS". To determine the architecture
+that you are running on without resorting to loading all of C<%Config>
+you can examine the content of the C<@INC> array like so:
+
+ if (grep(/VMS_AXP/, @INC)) {
+ print "I'm on Alpha!\n";
+
+ } elsif (grep(/VMS_VAX/, @INC)) {
+ print "I'm on VAX!\n";
+
+ } elsif (grep(/VMS_IA64/, @INC)) {
+ print "I'm on IA64!\n";
+
+ } else {
+ print "I'm not so sure about where $^O is...\n";
+ }
+
+In general, the significant differences should only be if Perl is running
+on VMS_VAX or one of the 64 bit OpenVMS platforms.
+
+On VMS, perl determines the UTC offset from the C<SYS$TIMEZONE_DIFFERENTIAL>
+logical name. Although the VMS epoch began at 17-NOV-1858 00:00:00.00,
+calls to C<localtime> are adjusted to count offsets from
+01-JAN-1970 00:00:00.00, just like Unix.
+
+Also see:
+
+=over 4
+
+=item *
+
+F<README.vms> (installed as L<README_vms>), L<perlvms>
+
+=item *
+
+vmsperl list, vmsperl-subscribe@perl.org
+
+=item *
+
+vmsperl on the web, http://www.sidhe.org/vmsperl/index.html
+
+=back
+
+=head2 VOS
+
+Perl on VOS is discussed in F<README.vos> in the perl distribution
+(installed as L<perlvos>). Perl on VOS can accept either VOS- or
+Unix-style file specifications as in either of the following:
+
+ $ perl -ne "print if /perl_setup/i" >system>notices
+ $ perl -ne "print if /perl_setup/i" /system/notices
+
+or even a mixture of both as in:
+
+ $ perl -ne "print if /perl_setup/i" >system/notices
+
+Even though VOS allows the slash character to appear in object
+names, because the VOS port of Perl interprets it as a pathname
+delimiting character, VOS files, directories, or links whose names
+contain a slash character cannot be processed. Such files must be
+renamed before they can be processed by Perl. Note that VOS limits
+file names to 32 or fewer characters, file names cannot start with a
+C<-> character, or contain any character matching C<< tr/ !%&'()*+;<>?// >>
+
+The value of C<$^O> on VOS is "VOS". To determine the architecture that
+you are running on without resorting to loading all of C<%Config> you
+can examine the content of the @INC array like so:
+
+ if ($^O =~ /VOS/) {
+ print "I'm on a Stratus box!\n";
+ } else {
+ print "I'm not on a Stratus box!\n";
+ die;
+ }
+
+Also see:
+
+=over 4
+
+=item *
+
+F<README.vos> (installed as L<perlvos>)
+
+=item *
+
+The VOS mailing list.
+
+There is no specific mailing list for Perl on VOS. You can post
+comments to the comp.sys.stratus newsgroup, or subscribe to the general
+Stratus mailing list. Send a letter with "subscribe Info-Stratus" in
+the message body to majordomo@list.stratagy.com.
+
+=item *
+
+VOS Perl on the web at http://ftp.stratus.com/pub/vos/posix/posix.html
+
+=back
+
+=head2 EBCDIC Platforms
+
+Recent versions of Perl have been ported to platforms such as OS/400 on
+AS/400 minicomputers as well as OS/390, VM/ESA, and BS2000 for S/390
+Mainframes. Such computers use EBCDIC character sets internally (usually
+Character Code Set ID 0037 for OS/400 and either 1047 or POSIX-BC for S/390
+systems). On the mainframe perl currently works under the "Unix system
+services for OS/390" (formerly known as OpenEdition), VM/ESA OpenEdition, or
+the BS200 POSIX-BC system (BS2000 is supported in perl 5.6 and greater).
+See L<perlos390> for details. Note that for OS/400 there is also a port of
+Perl 5.8.1/5.9.0 or later to the PASE which is ASCII-based (as opposed to
+ILE which is EBCDIC-based), see L<perlos400>.
+
+As of R2.5 of USS for OS/390 and Version 2.3 of VM/ESA these Unix
+sub-systems do not support the C<#!> shebang trick for script invocation.
+Hence, on OS/390 and VM/ESA perl scripts can be executed with a header
+similar to the following simple script:
+
+ : # use perl
+ eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
+ if 0;
+ #!/usr/local/bin/perl # just a comment really
+
+ print "Hello from perl!\n";
+
+OS/390 will support the C<#!> shebang trick in release 2.8 and beyond.
+Calls to C<system> and backticks can use POSIX shell syntax on all
+S/390 systems.
+
+On the AS/400, if PERL5 is in your library list, you may need
+to wrap your perl scripts in a CL procedure to invoke them like so:
+
+ BEGIN
+ CALL PGM(PERL5/PERL) PARM('/QOpenSys/hello.pl')
+ ENDPGM
+
+This will invoke the perl script F<hello.pl> in the root of the
+QOpenSys file system. On the AS/400 calls to C<system> or backticks
+must use CL syntax.
+
+On these platforms, bear in mind that the EBCDIC character set may have
+an effect on what happens with some perl functions (such as C<chr>,
+C<pack>, C<print>, C<printf>, C<ord>, C<sort>, C<sprintf>, C<unpack>), as
+well as bit-fiddling with ASCII constants using operators like C<^>, C<&>
+and C<|>, not to mention dealing with socket interfaces to ASCII computers
+(see L<"Newlines">).
+
+Fortunately, most web servers for the mainframe will correctly
+translate the C<\n> in the following statement to its ASCII equivalent
+(C<\r> is the same under both Unix and OS/390 & VM/ESA):
+
+ print "Content-type: text/html\r\n\r\n";
+
+The values of C<$^O> on some of these platforms includes:
+
+ uname $^O $Config{'archname'}
+ --------------------------------------------
+ OS/390 os390 os390
+ OS400 os400 os400
+ POSIX-BC posix-bc BS2000-posix-bc
+ VM/ESA vmesa vmesa
+
+Some simple tricks for determining if you are running on an EBCDIC
+platform could include any of the following (perhaps all):
+
+ if ("\t" eq "\05") { print "EBCDIC may be spoken here!\n"; }
+
+ if (ord('A') == 193) { print "EBCDIC may be spoken here!\n"; }
+
+ if (chr(169) eq 'z') { print "EBCDIC may be spoken here!\n"; }
+
+One thing you may not want to rely on is the EBCDIC encoding
+of punctuation characters since these may differ from code page to code
+page (and once your module or script is rumoured to work with EBCDIC,
+folks will want it to work with all EBCDIC character sets).
+
+Also see:
+
+=over 4
+
+=item *
+
+L<perlos390>, F<README.os390>, F<perlbs2000>, F<README.vmesa>,
+L<perlebcdic>.
+
+=item *
+
+The perl-mvs@perl.org list is for discussion of porting issues as well as
+general usage issues for all EBCDIC Perls. Send a message body of
+"subscribe perl-mvs" to majordomo@perl.org.
+
+=item *
+
+AS/400 Perl information at
+http://as400.rochester.ibm.com/
+as well as on CPAN in the F<ports/> directory.
+
+=back
+
+=head2 Acorn RISC OS
+
+Because Acorns use ASCII with newlines (C<\n>) in text files as C<\012> like
+Unix, and because Unix filename emulation is turned on by default,
+most simple scripts will probably work "out of the box". The native
+filesystem is modular, and individual filesystems are free to be
+case-sensitive or insensitive, and are usually case-preserving. Some
+native filesystems have name length limits, which file and directory
+names are silently truncated to fit. Scripts should be aware that the
+standard filesystem currently has a name length limit of B<10>
+characters, with up to 77 items in a directory, but other filesystems
+may not impose such limitations.
+
+Native filenames are of the form
+
+ Filesystem#Special_Field::DiskName.$.Directory.Directory.File
+
+where
+
+ Special_Field is not usually present, but may contain . and $ .
+ Filesystem =~ m|[A-Za-z0-9_]|
+ DsicName =~ m|[A-Za-z0-9_/]|
+ $ represents the root directory
+ . is the path separator
+ @ is the current directory (per filesystem but machine global)
+ ^ is the parent directory
+ Directory and File =~ m|[^\0- "\.\$\%\&:\@\\^\|\177]+|
+
+The default filename translation is roughly C<tr|/.|./|;>
+
+Note that C<"ADFS::HardDisk.$.File" ne 'ADFS::HardDisk.$.File'> and that
+the second stage of C<$> interpolation in regular expressions will fall
+foul of the C<$.> if scripts are not careful.
+
+Logical paths specified by system variables containing comma-separated
+search lists are also allowed; hence C<System:Modules> is a valid
+filename, and the filesystem will prefix C<Modules> with each section of
+C<System$Path> until a name is made that points to an object on disk.
+Writing to a new file C<System:Modules> would be allowed only if
+C<System$Path> contains a single item list. The filesystem will also
+expand system variables in filenames if enclosed in angle brackets, so
+C<< <System$Dir>.Modules >> would look for the file
+S<C<$ENV{'System$Dir'} . 'Modules'>>. The obvious implication of this is
+that B<fully qualified filenames can start with C<< <> >>> and should
+be protected when C<open> is used for input.
+
+Because C<.> was in use as a directory separator and filenames could not
+be assumed to be unique after 10 characters, Acorn implemented the C
+compiler to strip the trailing C<.c> C<.h> C<.s> and C<.o> suffix from
+filenames specified in source code and store the respective files in
+subdirectories named after the suffix. Hence files are translated:
+
+ foo.h h.foo
+ C:foo.h C:h.foo (logical path variable)
+ sys/os.h sys.h.os (C compiler groks Unix-speak)
+ 10charname.c c.10charname
+ 10charname.o o.10charname
+ 11charname_.c c.11charname (assuming filesystem truncates at 10)
+
+The Unix emulation library's translation of filenames to native assumes
+that this sort of translation is required, and it allows a user-defined list
+of known suffixes that it will transpose in this fashion. This may
+seem transparent, but consider that with these rules C<foo/bar/baz.h>
+and C<foo/bar/h/baz> both map to C<foo.bar.h.baz>, and that C<readdir> and
+C<glob> cannot and do not attempt to emulate the reverse mapping. Other
+C<.>'s in filenames are translated to C</>.
+
+As implied above, the environment accessed through C<%ENV> is global, and
+the convention is that program specific environment variables are of the
+form C<Program$Name>. Each filesystem maintains a current directory,
+and the current filesystem's current directory is the B<global> current
+directory. Consequently, sociable programs don't change the current
+directory but rely on full pathnames, and programs (and Makefiles) cannot
+assume that they can spawn a child process which can change the current
+directory without affecting its parent (and everyone else for that
+matter).
+
+Because native operating system filehandles are global and are currently
+allocated down from 255, with 0 being a reserved value, the Unix emulation
+library emulates Unix filehandles. Consequently, you can't rely on
+passing C<STDIN>, C<STDOUT>, or C<STDERR> to your children.
+
+The desire of users to express filenames of the form
+C<< <Foo$Dir>.Bar >> on the command line unquoted causes problems,
+too: C<``> command output capture has to perform a guessing game. It
+assumes that a string C<< <[^<>]+\$[^<>]> >> is a
+reference to an environment variable, whereas anything else involving
+C<< < >> or C<< > >> is redirection, and generally manages to be 99%
+right. Of course, the problem remains that scripts cannot rely on any
+Unix tools being available, or that any tools found have Unix-like command
+line arguments.
+
+Extensions and XS are, in theory, buildable by anyone using free
+tools. In practice, many don't, as users of the Acorn platform are
+used to binary distributions. MakeMaker does run, but no available
+make currently copes with MakeMaker's makefiles; even if and when
+this should be fixed, the lack of a Unix-like shell will cause
+problems with makefile rules, especially lines of the form C<cd
+sdbm && make all>, and anything using quoting.
+
+"S<RISC OS>" is the proper name for the operating system, but the value
+in C<$^O> is "riscos" (because we don't like shouting).
+
+=head2 Other perls
+
+Perl has been ported to many platforms that do not fit into any of
+the categories listed above. Some, such as AmigaOS, Atari MiNT,
+BeOS, HP MPE/iX, QNX, Plan 9, and VOS, have been well-integrated
+into the standard Perl source code kit. You may need to see the
+F<ports/> directory on CPAN for information, and possibly binaries,
+for the likes of: aos, Atari ST, lynxos, riscos, Novell Netware,
+Tandem Guardian, I<etc.> (Yes, we know that some of these OSes may
+fall under the Unix category, but we are not a standards body.)
+
+Some approximate operating system names and their C<$^O> values
+in the "OTHER" category include:
+
+ OS $^O $Config{'archname'}
+ ------------------------------------------
+ Amiga DOS amigaos m68k-amigos
+ BeOS beos
+ MPE/iX mpeix PA-RISC1.1
+
+See also:
+
+=over 4
+
+=item *
+
+Amiga, F<README.amiga> (installed as L<perlamiga>).
+
+=item *
+
+Atari, F<README.mint> and Guido Flohr's web page
+http://stud.uni-sb.de/~gufl0000/
+
+=item *
+
+Be OS, F<README.beos>
+
+=item *
+
+HP 300 MPE/iX, F<README.mpeix> and Mark Bixby's web page
+http://www.bixby.org/mark/perlix.html
+
+=item *
+
+A free perl5-based PERL.NLM for Novell Netware is available in
+precompiled binary and source code form from http://www.novell.com/
+as well as from CPAN.
+
+=item *
+
+S<Plan 9>, F<README.plan9>
+
+=back
+
+=head1 FUNCTION IMPLEMENTATIONS
+
+Listed below are functions that are either completely unimplemented
+or else have been implemented differently on various platforms.
+Following each description will be, in parentheses, a list of
+platforms that the description applies to.
+
+The list may well be incomplete, or even wrong in some places. When
+in doubt, consult the platform-specific README files in the Perl
+source distribution, and any other documentation resources accompanying
+a given port.
+
+Be aware, moreover, that even among Unix-ish systems there are variations.
+
+For many functions, you can also query C<%Config>, exported by
+default from the Config module. For example, to check whether the
+platform has the C<lstat> call, check C<$Config{d_lstat}>. See
+L<Config> for a full description of available variables.
+
+=head2 Alphabetical Listing of Perl Functions
+
+=over 8
+
+=item -X
+
+C<-r>, C<-w>, and C<-x> have a limited meaning only; directories
+and applications are executable, and there are no uid/gid
+considerations. C<-o> is not supported. (S<Mac OS>)
+
+C<-w> only inspects the read-only file attribute (FILE_ATTRIBUTE_READONLY),
+which determines whether the directory can be deleted, not whether it can
+be written to. Directories always have read and write access unless denied
+by discretionary access control lists (DACLs). (S<Win32>)
+
+C<-r>, C<-w>, C<-x>, and C<-o> tell whether the file is accessible,
+which may not reflect UIC-based file protections. (VMS)
+
+C<-s> returns the size of the data fork, not the total size of data fork
+plus resource fork. (S<Mac OS>).
+
+C<-s> by name on an open file will return the space reserved on disk,
+rather than the current extent. C<-s> on an open filehandle returns the
+current size. (S<RISC OS>)
+
+C<-R>, C<-W>, C<-X>, C<-O> are indistinguishable from C<-r>, C<-w>,
+C<-x>, C<-o>. (S<Mac OS>, Win32, VMS, S<RISC OS>)
+
+C<-b>, C<-c>, C<-k>, C<-g>, C<-p>, C<-u>, C<-A> are not implemented.
+(S<Mac OS>)
+
+C<-g>, C<-k>, C<-l>, C<-p>, C<-u>, C<-A> are not particularly meaningful.
+(Win32, VMS, S<RISC OS>)
+
+C<-d> is true if passed a device spec without an explicit directory.
+(VMS)
+
+C<-T> and C<-B> are implemented, but might misclassify Mac text files
+with foreign characters; this is the case will all platforms, but may
+affect S<Mac OS> often. (S<Mac OS>)
+
+C<-x> (or C<-X>) determine if a file ends in one of the executable
+suffixes. C<-S> is meaningless. (Win32)
+
+C<-x> (or C<-X>) determine if a file has an executable file type.
+(S<RISC OS>)
+
+=item atan2
+
+Due to issues with various CPUs, math libraries, compilers, and standards,
+results for C<atan2()> may vary depending on any combination of the above.
+Perl attempts to conform to the Open Group/IEEE standards for the results
+returned from C<atan2()>, but cannot force the issue if the system Perl is
+run on does not allow it. (Tru64, HP-UX 10.20)
+
+The current version of the standards for C<atan2()> is available at
+L<http://www.opengroup.org/onlinepubs/009695399/functions/atan2.html>.
+
+=item binmode
+
+Meaningless. (S<Mac OS>, S<RISC OS>)
+
+Reopens file and restores pointer; if function fails, underlying
+filehandle may be closed, or pointer may be in a different position.
+(VMS)
+
+The value returned by C<tell> may be affected after the call, and
+the filehandle may be flushed. (Win32)
+
+=item chmod
+
+Only limited meaning. Disabling/enabling write permission is mapped to
+locking/unlocking the file. (S<Mac OS>)
+
+Only good for changing "owner" read-write access, "group", and "other"
+bits are meaningless. (Win32)
+
+Only good for changing "owner" and "other" read-write access. (S<RISC OS>)
+
+Access permissions are mapped onto VOS access-control list changes. (VOS)
+
+The actual permissions set depend on the value of the C<CYGWIN>
+in the SYSTEM environment settings. (Cygwin)
+
+=item chown
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>, S<RISC OS>)
+
+Does nothing, but won't fail. (Win32)
+
+A little funky, because VOS's notion of ownership is a little funky (VOS).
+
+=item chroot
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<Plan 9>, S<RISC OS>, VOS, VM/ESA)
+
+=item crypt
+
+May not be available if library or source was not provided when building
+perl. (Win32)
+
+=item dbmclose
+
+Not implemented. (VMS, S<Plan 9>, VOS)
+
+=item dbmopen
+
+Not implemented. (VMS, S<Plan 9>, VOS)
+
+=item dump
+
+Not useful. (S<Mac OS>, S<RISC OS>)
+
+Not supported. (Cygwin, Win32)
+
+Invokes VMS debugger. (VMS)
+
+=item exec
+
+Not implemented. (S<Mac OS>)
+
+Implemented via Spawn. (VM/ESA)
+
+Does not automatically flush output handles on some platforms.
+(SunOS, Solaris, HP-UX)
+
+=item exit
+
+Emulates UNIX exit() (which considers C<exit 1> to indicate an error) by
+mapping the C<1> to SS$_ABORT (C<44>). This behavior may be overridden
+with the pragma C<use vmsish 'exit'>. As with the CRTL's exit()
+function, C<exit 0> is also mapped to an exit status of SS$_NORMAL
+(C<1>); this mapping cannot be overridden. Any other argument to exit()
+is used directly as Perl's exit status. On VMS, unless the future
+POSIX_EXIT mode is enabled, the exit code should always be a valid
+VMS exit code and not a generic number. When the POSIX_EXIT mode is
+enabled, a generic number will be encoded in a method compatible with
+the C library _POSIX_EXIT macro so that it can be decoded by other
+programs, particularly ones written in C, like the GNV package. (VMS)
+
+=item fcntl
+
+Not implemented. (Win32)
+Some functions available based on the version of VMS. (VMS)
+
+=item flock
+
+Not implemented (S<Mac OS>, VMS, S<RISC OS>, VOS).
+
+Available only on Windows NT (not on Windows 95). (Win32)
+
+=item fork
+
+Not implemented. (S<Mac OS>, AmigaOS, S<RISC OS>, VM/ESA, VMS)
+
+Emulated using multiple interpreters. See L<perlfork>. (Win32)
+
+Does not automatically flush output handles on some platforms.
+(SunOS, Solaris, HP-UX)
+
+=item getlogin
+
+Not implemented. (S<Mac OS>, S<RISC OS>)
+
+=item getpgrp
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
+
+=item getppid
+
+Not implemented. (S<Mac OS>, Win32, S<RISC OS>)
+
+=item getpriority
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS, VM/ESA)
+
+=item getpwnam
+
+Not implemented. (S<Mac OS>, Win32)
+
+Not useful. (S<RISC OS>)
+
+=item getgrnam
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
+
+=item getnetbyname
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
+
+=item getpwuid
+
+Not implemented. (S<Mac OS>, Win32)
+
+Not useful. (S<RISC OS>)
+
+=item getgrgid
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
+
+=item getnetbyaddr
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
+
+=item getprotobynumber
+
+Not implemented. (S<Mac OS>)
+
+=item getservbyport
+
+Not implemented. (S<Mac OS>)
+
+=item getpwent
+
+Not implemented. (S<Mac OS>, Win32, VM/ESA)
+
+=item getgrent
+
+Not implemented. (S<Mac OS>, Win32, VMS, VM/ESA)
+
+=item gethostbyname
+
+C<gethostbyname('localhost')> does not work everywhere: you may have
+to use C<gethostbyname('127.0.0.1')>. (S<Mac OS>, S<Irix 5>)
+
+=item gethostent
+
+Not implemented. (S<Mac OS>, Win32)
+
+=item getnetent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
+
+=item getprotoent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
+
+=item getservent
+
+Not implemented. (Win32, S<Plan 9>)
+
+=item sethostent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>, S<RISC OS>)
+
+=item setnetent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>, S<RISC OS>)
+
+=item setprotoent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>, S<RISC OS>)
+
+=item setservent
+
+Not implemented. (S<Plan 9>, Win32, S<RISC OS>)
+
+=item endpwent
+
+Not implemented. (S<Mac OS>, MPE/iX, VM/ESA, Win32)
+
+=item endgrent
+
+Not implemented. (S<Mac OS>, MPE/iX, S<RISC OS>, VM/ESA, VMS, Win32)
+
+=item endhostent
+
+Not implemented. (S<Mac OS>, Win32)
+
+=item endnetent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
+
+=item endprotoent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
+
+=item endservent
+
+Not implemented. (S<Plan 9>, Win32)
+
+=item getsockopt SOCKET,LEVEL,OPTNAME
+
+Not implemented. (S<Plan 9>)
+
+=item glob
+
+This operator is implemented via the File::Glob extension on most
+platforms. See L<File::Glob> for portability information.
+
+=item gmtime
+
+Same portability caveats as L<localtime>.
+
+=item ioctl FILEHANDLE,FUNCTION,SCALAR
+
+Not implemented. (VMS)
+
+Available only for socket handles, and it does what the ioctlsocket() call
+in the Winsock API does. (Win32)
+
+Available only for socket handles. (S<RISC OS>)
+
+=item kill
+
+C<kill(0, LIST)> is implemented for the sake of taint checking;
+use with other signals is unimplemented. (S<Mac OS>)
+
+Not implemented, hence not useful for taint checking. (S<RISC OS>)
+
+C<kill()> doesn't have the semantics of C<raise()>, i.e. it doesn't send
+a signal to the identified process like it does on Unix platforms.
+Instead C<kill($sig, $pid)> terminates the process identified by $pid,
+and makes it exit immediately with exit status $sig. As in Unix, if
+$sig is 0 and the specified process exists, it returns true without
+actually terminating it. (Win32)
+
+C<kill(-9, $pid)> will terminate the process specified by $pid and
+recursively all child processes owned by it. This is different from
+the Unix semantics, where the signal will be delivered to all
+processes in the same process group as the process specified by
+$pid. (Win32)
+
+Is not supported for process identification number of 0 or negative
+numbers. (VMS)
+
+=item link
+
+Not implemented. (S<Mac OS>, MPE/iX, S<RISC OS>)
+
+Link count not updated because hard links are not quite that hard
+(They are sort of half-way between hard and soft links). (AmigaOS)
+
+Hard links are implemented on Win32 under NTFS only. They are
+natively supported on Windows 2000 and later. On Windows NT they
+are implemented using the Windows POSIX subsystem support and the
+Perl process will need Administrator or Backup Operator privileges
+to create hard links.
+
+Available on 64 bit OpenVMS 8.2 and later. (VMS)
+
+=item localtime
+
+Because Perl currently relies on the native standard C localtime()
+function, it is only safe to use times between 0 and (2**31)-1. Times
+outside this range may result in unexpected behavior depending on your
+operating system's implementation of localtime().
+
+=item lstat
+
+Not implemented. (S<RISC OS>)
+
+Return values (especially for device and inode) may be bogus. (Win32)
+
+=item msgctl
+
+=item msgget
+
+=item msgsnd
+
+=item msgrcv
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<Plan 9>, S<RISC OS>, VOS)
+
+=item open
+
+The C<|> variants are supported only if ToolServer is installed.
+(S<Mac OS>)
+
+open to C<|-> and C<-|> are unsupported. (S<Mac OS>, Win32, S<RISC OS>)
+
+Opening a process does not automatically flush output handles on some
+platforms. (SunOS, Solaris, HP-UX)
+
+=item pipe
+
+Very limited functionality. (MiNT)
+
+=item readlink
+
+Not implemented. (Win32, VMS, S<RISC OS>)
+
+=item rename
+
+Can't move directories between directories on different logical volumes. (Win32)
+
+=item select
+
+Only implemented on sockets. (Win32, VMS)
+
+Only reliable on sockets. (S<RISC OS>)
+
+Note that the C<select FILEHANDLE> form is generally portable.
+
+=item semctl
+
+=item semget
+
+=item semop
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
+
+=item setgrent
+
+Not implemented. (S<Mac OS>, MPE/iX, VMS, Win32, S<RISC OS>, VOS)
+
+=item setpgrp
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
+
+=item setpriority
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
+
+=item setpwent
+
+Not implemented. (S<Mac OS>, MPE/iX, Win32, S<RISC OS>, VOS)
+
+=item setsockopt
+
+Not implemented. (S<Plan 9>)
+
+=item shmctl
+
+=item shmget
+
+=item shmread
+
+=item shmwrite
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
+
+=item sockatmark
+
+A relatively recent addition to socket functions, may not
+be implemented even in UNIX platforms.
+
+=item socketpair
+
+Not implemented. (S<RISC OS>, VOS, VM/ESA)
+
+Available on 64 bit OpenVMS 8.2 and later. (VMS)
+
+=item stat
+
+Platforms that do not have rdev, blksize, or blocks will return these
+as '', so numeric comparison or manipulation of these fields may cause
+'not numeric' warnings.
+
+mtime and atime are the same thing, and ctime is creation time instead of
+inode change time. (S<Mac OS>).
+
+ctime not supported on UFS (S<Mac OS X>).
+
+ctime is creation time instead of inode change time (Win32).
+
+device and inode are not meaningful. (Win32)
+
+device and inode are not necessarily reliable. (VMS)
+
+mtime, atime and ctime all return the last modification time. Device and
+inode are not necessarily reliable. (S<RISC OS>)
+
+dev, rdev, blksize, and blocks are not available. inode is not
+meaningful and will differ between stat calls on the same file. (os2)
+
+some versions of cygwin when doing a stat("foo") and if not finding it
+may then attempt to stat("foo.exe") (Cygwin)
+
+On Win32 stat() needs to open the file to determine the link count
+and update attributes that may have been changed through hard links.
+Setting ${^WIN32_SLOPPY_STAT} to a true value speeds up stat() by
+not performing this operation. (Win32)
+
+=item symlink
+
+Not implemented. (Win32, S<RISC OS>)
+
+Implemented on 64 bit VMS 8.3. VMS requires the symbolic link to be in Unix
+syntax if it is intended to resolve to a valid path.
+
+=item syscall
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS, VM/ESA)
+
+=item sysopen
+
+The traditional "0", "1", and "2" MODEs are implemented with different
+numeric values on some systems. The flags exported by C<Fcntl>
+(O_RDONLY, O_WRONLY, O_RDWR) should work everywhere though. (S<Mac
+OS>, OS/390, VM/ESA)
+
+=item system
+
+Only implemented if ToolServer is installed. (S<Mac OS>)
+
+As an optimization, may not call the command shell specified in
+C<$ENV{PERL5SHELL}>. C<system(1, @args)> spawns an external
+process and immediately returns its process designator, without
+waiting for it to terminate. Return value may be used subsequently
+in C<wait> or C<waitpid>. Failure to spawn() a subprocess is indicated
+by setting $? to "255 << 8". C<$?> is set in a way compatible with
+Unix (i.e. the exitstatus of the subprocess is obtained by "$? >> 8",
+as described in the documentation). (Win32)
+
+There is no shell to process metacharacters, and the native standard is
+to pass a command line terminated by "\n" "\r" or "\0" to the spawned
+program. Redirection such as C<< > foo >> is performed (if at all) by
+the run time library of the spawned program. C<system> I<list> will call
+the Unix emulation library's C<exec> emulation, which attempts to provide
+emulation of the stdin, stdout, stderr in force in the parent, providing
+the child program uses a compatible version of the emulation library.
+I<scalar> will call the native command line direct and no such emulation
+of a child Unix program will exists. Mileage B<will> vary. (S<RISC OS>)
+
+Far from being POSIX compliant. Because there may be no underlying
+/bin/sh tries to work around the problem by forking and execing the
+first token in its argument string. Handles basic redirection
+("<" or ">") on its own behalf. (MiNT)
+
+Does not automatically flush output handles on some platforms.
+(SunOS, Solaris, HP-UX)
+
+The return value is POSIX-like (shifted up by 8 bits), which only allows
+room for a made-up value derived from the severity bits of the native
+32-bit condition code (unless overridden by C<use vmsish 'status'>).
+If the native condition code is one that has a POSIX value encoded, the
+POSIX value will be decoded to extract the expected exit value.
+For more details see L<perlvms/$?>. (VMS)
+
+=item times
+
+Only the first entry returned is nonzero. (S<Mac OS>)
+
+"cumulative" times will be bogus. On anything other than Windows NT
+or Windows 2000, "system" time will be bogus, and "user" time is
+actually the time returned by the clock() function in the C runtime
+library. (Win32)
+
+Not useful. (S<RISC OS>)
+
+=item truncate
+
+Not implemented. (Older versions of VMS)
+
+Truncation to same-or-shorter lengths only. (VOS)
+
+If a FILEHANDLE is supplied, it must be writable and opened in append
+mode (i.e., use C<<< open(FH, '>>filename') >>>
+or C<sysopen(FH,...,O_APPEND|O_RDWR)>. If a filename is supplied, it
+should not be held open elsewhere. (Win32)
+
+=item umask
+
+Returns undef where unavailable, as of version 5.005.
+
+C<umask> works but the correct permissions are set only when the file
+is finally closed. (AmigaOS)
+
+=item utime
+
+Only the modification time is updated. (S<BeOS>, S<Mac OS>, VMS, S<RISC OS>)
+
+May not behave as expected. Behavior depends on the C runtime
+library's implementation of utime(), and the filesystem being
+used. The FAT filesystem typically does not support an "access
+time" field, and it may limit timestamps to a granularity of
+two seconds. (Win32)
+
+=item wait
+
+=item waitpid
+
+Not implemented. (S<Mac OS>)
+
+Can only be applied to process handles returned for processes spawned
+using C<system(1, ...)> or pseudo processes created with C<fork()>. (Win32)
+
+Not useful. (S<RISC OS>)
+
+=back
+
+
+=head1 Supported Platforms
+
+As of July 2002 (the Perl release 5.8.0), the following platforms are
+able to build Perl from the standard source code distribution
+available at http://www.cpan.org/src/index.html
+
+ AIX
+ BeOS
+ BSD/OS (BSDi)
+ Cygwin
+ DG/UX
+ DOS DJGPP 1)
+ DYNIX/ptx
+ EPOC R5
+ FreeBSD
+ HI-UXMPP (Hitachi) (5.8.0 worked but we didn't know it)
+ HP-UX
+ IRIX
+ Linux
+ Mac OS Classic
+ Mac OS X (Darwin)
+ MPE/iX
+ NetBSD
+ NetWare
+ NonStop-UX
+ ReliantUNIX (formerly SINIX)
+ OpenBSD
+ OpenVMS (formerly VMS)
+ Open UNIX (Unixware) (since Perl 5.8.1/5.9.0)
+ OS/2
+ OS/400 (using the PASE) (since Perl 5.8.1/5.9.0)
+ PowerUX
+ POSIX-BC (formerly BS2000)
+ QNX
+ Solaris
+ SunOS 4
+ SUPER-UX (NEC)
+ Tru64 UNIX (formerly DEC OSF/1, Digital UNIX)
+ UNICOS
+ UNICOS/mk
+ UTS
+ VOS
+ Win95/98/ME/2K/XP 2)
+ WinCE
+ z/OS (formerly OS/390)
+ VM/ESA
+
+ 1) in DOS mode either the DOS or OS/2 ports can be used
+ 2) compilers: Borland, MinGW (GCC), VC6
+
+The following platforms worked with the previous releases (5.6 and
+5.7), but we did not manage either to fix or to test these in time
+for the 5.8.0 release. There is a very good chance that many of these
+will work fine with the 5.8.0.
+
+ BSD/OS
+ DomainOS
+ Hurd
+ LynxOS
+ MachTen
+ PowerMAX
+ SCO SV
+ SVR4
+ Unixware
+ Windows 3.1
+
+Known to be broken for 5.8.0 (but 5.6.1 and 5.7.2 can be used):
+
+ AmigaOS
+
+The following platforms have been known to build Perl from source in
+the past (5.005_03 and earlier), but we haven't been able to verify
+their status for the current release, either because the
+hardware/software platforms are rare or because we don't have an
+active champion on these platforms--or both. They used to work,
+though, so go ahead and try compiling them, and let perlbug@perl.org
+of any trouble.
+
+ 3b1
+ A/UX
+ ConvexOS
+ CX/UX
+ DC/OSx
+ DDE SMES
+ DOS EMX
+ Dynix
+ EP/IX
+ ESIX
+ FPS
+ GENIX
+ Greenhills
+ ISC
+ MachTen 68k
+ MiNT
+ MPC
+ NEWS-OS
+ NextSTEP
+ OpenSTEP
+ Opus
+ Plan 9
+ RISC/os
+ SCO ODT/OSR
+ Stellar
+ SVR2
+ TI1500
+ TitanOS
+ Ultrix
+ Unisys Dynix
+
+The following platforms have their own source code distributions and
+binaries available via http://www.cpan.org/ports/
+
+ Perl release
+
+ OS/400 (ILE) 5.005_02
+ Tandem Guardian 5.004
+
+The following platforms have only binaries available via
+http://www.cpan.org/ports/index.html :
+
+ Perl release
+
+ Acorn RISCOS 5.005_02
+ AOS 5.002
+ LynxOS 5.004_02
+
+Although we do suggest that you always build your own Perl from
+the source code, both for maximal configurability and for security,
+in case you are in a hurry you can check
+http://www.cpan.org/ports/index.html for binary distributions.
+
+=head1 SEE ALSO
+
+L<perlaix>, L<perlamiga>, L<perlapollo>, L<perlbeos>, L<perlbs2000>,
+L<perlce>, L<perlcygwin>, L<perldgux>, L<perldos>, L<perlepoc>,
+L<perlebcdic>, L<perlfreebsd>, L<perlhurd>, L<perlhpux>, L<perlirix>,
+L<perlmachten>, L<perlmacos>, L<perlmacosx>, L<perlmint>, L<perlmpeix>,
+L<perlnetware>, L<perlos2>, L<perlos390>, L<perlos400>,
+L<perlplan9>, L<perlqnx>, L<perlsolaris>, L<perltru64>,
+L<perlunicode>, L<perlvmesa>, L<perlvms>, L<perlvos>,
+L<perlwin32>, and L<Win32>.
+
+=head1 AUTHORS / CONTRIBUTORS
+
+Abigail <abigail@foad.org>,
+Charles Bailey <bailey@newman.upenn.edu>,
+Graham Barr <gbarr@pobox.com>,
+Tom Christiansen <tchrist@perl.com>,
+Nicholas Clark <nick@ccl4.org>,
+Thomas Dorner <Thomas.Dorner@start.de>,
+Andy Dougherty <doughera@lafayette.edu>,
+Dominic Dunlop <domo@computer.org>,
+Neale Ferguson <neale@vma.tabnsw.com.au>,
+David J. Fiander <davidf@mks.com>,
+Paul Green <Paul.Green@stratus.com>,
+M.J.T. Guy <mjtg@cam.ac.uk>,
+Jarkko Hietaniemi <jhi@iki.fi>,
+Luther Huffman <lutherh@stratcom.com>,
+Nick Ing-Simmons <nick@ing-simmons.net>,
+Andreas J. KE<ouml>nig <a.koenig@mind.de>,
+Markus Laker <mlaker@contax.co.uk>,
+Andrew M. Langmead <aml@world.std.com>,
+Larry Moore <ljmoore@freespace.net>,
+Paul Moore <Paul.Moore@uk.origin-it.com>,
+Chris Nandor <pudge@pobox.com>,
+Matthias Neeracher <neeracher@mac.com>,
+Philip Newton <pne@cpan.org>,
+Gary Ng <71564.1743@CompuServe.COM>,
+Tom Phoenix <rootbeer@teleport.com>,
+AndrE<eacute> Pirard <A.Pirard@ulg.ac.be>,
+Peter Prymmer <pvhp@forte.com>,
+Hugo van der Sanden <hv@crypt0.demon.co.uk>,
+Gurusamy Sarathy <gsar@activestate.com>,
+Paul J. Schinder <schinder@pobox.com>,
+Michael G Schwern <schwern@pobox.com>,
+Dan Sugalski <dan@sidhe.org>,
+Nathan Torkington <gnat@frii.com>.
+John Malmberg <wb8tyw@qsl.net>
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlpragma.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlpragma.pod
new file mode 100755
index 00000000000..51292a8a12c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlpragma.pod
@@ -0,0 +1,147 @@
+=head1 NAME
+
+perlpragma - how to write a user pragma
+
+=head1 DESCRIPTION
+
+A pragma is a module which influences some aspect of the compile time or run
+time behaviour of Perl, such as C<strict> or C<warnings>. With Perl 5.10 you
+are no longer limited to the built in pragmata; you can now create user
+pragmata that modify the behaviour of user functions within a lexical scope.
+
+=head1 A basic example
+
+For example, say you need to create a class implementing overloaded
+mathematical operators, and would like to provide your own pragma that
+functions much like C<use integer;> You'd like this code
+
+ use MyMaths;
+
+ my $l = MyMaths->new(1.2);
+ my $r = MyMaths->new(3.4);
+
+ print "A: ", $l + $r, "\n";
+
+ use myint;
+ print "B: ", $l + $r, "\n";
+
+ {
+ no myint;
+ print "C: ", $l + $r, "\n";
+ }
+
+ print "D: ", $l + $r, "\n";
+
+ no myint;
+ print "E: ", $l + $r, "\n";
+
+to give the output
+
+ A: 4.6
+ B: 4
+ C: 4.6
+ D: 4
+ E: 4.6
+
+I<i.e.>, where C<use myint;> is in effect, addition operations are forced
+to integer, whereas by default they are not, with the default behaviour being
+restored via C<no myint;>
+
+The minimal implementation of the package C<MyMaths> would be something like
+this:
+
+ package MyMaths;
+ use warnings;
+ use strict;
+ use myint();
+ use overload '+' => sub {
+ my ($l, $r) = @_;
+ # Pass 1 to check up one call level from here
+ if (myint::in_effect(1)) {
+ int($$l) + int($$r);
+ } else {
+ $$l + $$r;
+ }
+ };
+
+ sub new {
+ my ($class, $value) = @_;
+ bless \$value, $class;
+ }
+
+ 1;
+
+Note how we load the user pragma C<myint> with an empty list C<()> to
+prevent its C<import> being called.
+
+The interaction with the Perl compilation happens inside package C<myint>:
+
+ package myint;
+
+ use strict;
+ use warnings;
+
+ sub import {
+ $^H{myint} = 1;
+ }
+
+ sub unimport {
+ $^H{myint} = 0;
+ }
+
+ sub in_effect {
+ my $level = shift // 0;
+ my $hinthash = (caller($level))[10];
+ return $hinthash->{myint};
+ }
+
+ 1;
+
+As pragmata are implemented as modules, like any other module, C<use myint;>
+becomes
+
+ BEGIN {
+ require myint;
+ myint->import();
+ }
+
+and C<no myint;> is
+
+ BEGIN {
+ require myint;
+ myint->unimport();
+ }
+
+Hence the C<import> and C<unimport> routines are called at B<compile time>
+for the user's code.
+
+User pragmata store their state by writing to the magical hash C<%^H>,
+hence these two routines manipulate it. The state information in C<%^H> is
+stored in the optree, and can be retrieved at runtime with C<caller()>, at
+index 10 of the list of returned results. In the example pragma, retrieval
+is encapsulated into the routine C<in_effect()>, which takes as parameter
+the number of call frames to go up to find the value of the pragma in the
+user's script. This uses C<caller()> to determine the value of
+C<$^H{myint}> when each line of the user's script was called, and
+therefore provide the correct semantics in the subroutine implementing the
+overloaded addition.
+
+=head1 Implementation details
+
+The optree is shared between threads. This means there is a possibility that
+the optree will outlive the particular thread (and therefore the interpreter
+instance) that created it, so true Perl scalars cannot be stored in the
+optree. Instead a compact form is used, which can only store values that are
+integers (signed and unsigned), strings or C<undef> - references and
+floating point values are stringified. If you need to store multiple values
+or complex structures, you should serialise them, for example with C<pack>.
+The deletion of a hash key from C<%^H> is recorded, and as ever can be
+distinguished from the existence of a key with value C<undef> with
+C<exists>.
+
+B<Don't> attempt to store references to data structures as integers which
+are retrieved via C<caller> and converted back, as this will not be threadsafe.
+Accesses would be to the structure without locking (which is not safe for
+Perl's scalars), and either the structure has to leak, or it has to be
+freed when its creating thread terminates, which may be before the optree
+referencing it is deleted, if other threads outlive it.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlqnx.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlqnx.pod
new file mode 100755
index 00000000000..5951810ab46
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlqnx.pod
@@ -0,0 +1,143 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.qnx - Perl version 5 on QNX
+
+=head1 DESCRIPTION
+
+As of perl5.7.2 all tests pass under:
+
+ QNX 4.24G
+ Watcom 10.6 with Beta/970211.wcc.update.tar.F
+ socket3r.lib Nov21 1996.
+
+As of perl5.8.1 there is at least one test still failing.
+
+Some tests may complain under known circumstances.
+
+See below and hints/qnx.sh for more information.
+
+Under QNX 6.2.0 there are still a few tests which fail.
+See below and hints/qnx.sh for more information.
+
+=head2 Required Software for Compiling Perl on QNX4
+
+As with many unix ports, this one depends on a few "standard"
+unix utilities which are not necessarily standard for QNX4.
+
+=over 4
+
+=item /bin/sh
+
+This is used heavily by Configure and then by
+perl itself. QNX4's version is fine, but Configure
+will choke on the 16-bit version, so if you are
+running QNX 4.22, link /bin/sh to /bin32/ksh
+
+=item ar
+
+This is the standard unix library builder.
+We use wlib. With Watcom 10.6, when wlib is
+linked as "ar", it behaves like ar and all is
+fine. Under 9.5, a cover is required. One is
+included in ../qnx
+
+=item nm
+
+This is used (optionally) by configure to list
+the contents of libraries. I will generate
+a cover function on the fly in the UU directory.
+
+=item cpp
+
+Configure and perl need a way to invoke a C
+preprocessor. I have created a simple cover
+for cc which does the right thing. Without this,
+Configure will create its own wrapper which works,
+but it doesn't handle some of the command line arguments
+that perl will throw at it.
+
+=item make
+
+You really need GNU make to compile this. GNU make
+ships by default with QNX 4.23, but you can get it
+from quics for earlier versions.
+
+=back
+
+=head2 Outstanding Issues with Perl on QNX4
+
+There is no support for dynamically linked libraries in QNX4.
+
+If you wish to compile with the Socket extension, you need
+to have the TCP/IP toolkit, and you need to make sure that
+-lsocket locates the correct copy of socket3r.lib. Beware
+that the Watcom compiler ships with a stub version of
+socket3r.lib which has very little functionality. Also
+beware the order in which wlink searches directories for
+libraries. You may have /usr/lib/socket3r.lib pointing to
+the correct library, but wlink may pick up
+/usr/watcom/10.6/usr/lib/socket3r.lib instead. Make sure
+they both point to the correct library, that is,
+/usr/tcptk/current/usr/lib/socket3r.lib.
+
+The following tests may report errors under QNX4:
+
+ext/Cwd/Cwd.t will complain if `pwd` and cwd don't give
+the same results. cwd calls `fullpath -t`, so if you
+cd `fullpath -t` before running the test, it will
+pass.
+
+lib/File/Find/taint.t will complain if '.' is in your
+PATH. The PATH test is triggered because cwd calls
+`fullpath -t`.
+
+ext/IO/lib/IO/t/io_sock.t: Subtests 14 and 22 are skipped due to
+the fact that the functionality to read back the non-blocking
+status of a socket is not implemented in QNX's TCP/IP. This has
+been reported to QNX and it may work with later versions of
+TCP/IP.
+
+t/io/tell.t: Subtest 27 is failing. We are still investigating.
+
+=head2 QNX auxiliary files
+
+The files in the "qnx" directory are:
+
+=over 4
+
+=item qnx/ar
+
+A script that emulates the standard unix archive (aka library)
+utility. Under Watcom 10.6, ar is linked to wlib and provides the
+expected interface. With Watcom 9.5, a cover function is
+required. This one is fairly crude but has proved adequate for
+compiling perl.
+
+=item qnx/cpp
+
+A script that provides C preprocessing functionality. Configure can
+generate a similar cover, but it doesn't handle all the command-line
+options that perl throws at it. This might be reasonably placed in
+/usr/local/bin.
+
+=back
+
+=head2 Outstanding issues with perl under QNX6
+
+The following tests are still failing for Perl 5.8.1 under QNX 6.2.0:
+
+ op/sprintf.........................FAILED at test 91
+ lib/Benchmark......................FAILED at test 26
+
+This is due to a bug in the C library's printf routine.
+printf("'%e'", 0. ) produces '0.000000e+0', but ANSI requires
+'0.000000e+00'. QNX has acknowledged the bug.
+
+=head1 AUTHOR
+
+Norton T. Allen (allen@huarp.harvard.edu)
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlre.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlre.pod
new file mode 100755
index 00000000000..a076d3ad66a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlre.pod
@@ -0,0 +1,2199 @@
+=head1 NAME
+X<regular expression> X<regex> X<regexp>
+
+perlre - Perl regular expressions
+
+=head1 DESCRIPTION
+
+This page describes the syntax of regular expressions in Perl.
+
+If you haven't used regular expressions before, a quick-start
+introduction is available in L<perlrequick>, and a longer tutorial
+introduction is available in L<perlretut>.
+
+For reference on how regular expressions are used in matching
+operations, plus various examples of the same, see discussions of
+C<m//>, C<s///>, C<qr//> and C<??> in L<perlop/"Regexp Quote-Like
+Operators">.
+
+
+=head2 Modifiers
+
+Matching operations can have various modifiers. Modifiers
+that relate to the interpretation of the regular expression inside
+are listed below. Modifiers that alter the way a regular expression
+is used by Perl are detailed in L<perlop/"Regexp Quote-Like Operators"> and
+L<perlop/"Gory details of parsing quoted constructs">.
+
+=over 4
+
+=item m
+X</m> X<regex, multiline> X<regexp, multiline> X<regular expression, multiline>
+
+Treat string as multiple lines. That is, change "^" and "$" from matching
+the start or end of the string to matching the start or end of any
+line anywhere within the string.
+
+=item s
+X</s> X<regex, single-line> X<regexp, single-line>
+X<regular expression, single-line>
+
+Treat string as single line. That is, change "." to match any character
+whatsoever, even a newline, which normally it would not match.
+
+Used together, as /ms, they let the "." match any character whatsoever,
+while still allowing "^" and "$" to match, respectively, just after
+and just before newlines within the string.
+
+=item i
+X</i> X<regex, case-insensitive> X<regexp, case-insensitive>
+X<regular expression, case-insensitive>
+
+Do case-insensitive pattern matching.
+
+If C<use locale> is in effect, the case map is taken from the current
+locale. See L<perllocale>.
+
+=item x
+X</x>
+
+Extend your pattern's legibility by permitting whitespace and comments.
+
+=item p
+X</p> X<regex, preserve> X<regexp, preserve>
+
+Preserve the string matched such that ${^PREMATCH}, {$^MATCH}, and
+${^POSTMATCH} are available for use after matching.
+
+=item g and c
+X</g> X</c>
+
+Global matching, and keep the Current position after failed matching.
+Unlike i, m, s and x, these two flags affect the way the regex is used
+rather than the regex itself. See
+L<perlretut/"Using regular expressions in Perl"> for further explanation
+of the g and c modifiers.
+
+=back
+
+These are usually written as "the C</x> modifier", even though the delimiter
+in question might not really be a slash. Any of these
+modifiers may also be embedded within the regular expression itself using
+the C<(?...)> construct. See below.
+
+The C</x> modifier itself needs a little more explanation. It tells
+the regular expression parser to ignore whitespace that is neither
+backslashed nor within a character class. You can use this to break up
+your regular expression into (slightly) more readable parts. The C<#>
+character is also treated as a metacharacter introducing a comment,
+just as in ordinary Perl code. This also means that if you want real
+whitespace or C<#> characters in the pattern (outside a character
+class, where they are unaffected by C</x>), then you'll either have to
+escape them (using backslashes or C<\Q...\E>) or encode them using octal
+or hex escapes. Taken together, these features go a long way towards
+making Perl's regular expressions more readable. Note that you have to
+be careful not to include the pattern delimiter in the comment--perl has
+no way of knowing you did not intend to close the pattern early. See
+the C-comment deletion code in L<perlop>. Also note that anything inside
+a C<\Q...\E> stays unaffected by C</x>.
+X</x>
+
+=head2 Regular Expressions
+
+=head3 Metacharacters
+
+The patterns used in Perl pattern matching evolved from those supplied in
+the Version 8 regex routines. (The routines are derived
+(distantly) from Henry Spencer's freely redistributable reimplementation
+of the V8 routines.) See L<Version 8 Regular Expressions> for
+details.
+
+In particular the following metacharacters have their standard I<egrep>-ish
+meanings:
+X<metacharacter>
+X<\> X<^> X<.> X<$> X<|> X<(> X<()> X<[> X<[]>
+
+
+ \ Quote the next metacharacter
+ ^ Match the beginning of the line
+ . Match any character (except newline)
+ $ Match the end of the line (or before newline at the end)
+ | Alternation
+ () Grouping
+ [] Character class
+
+By default, the "^" character is guaranteed to match only the
+beginning of the string, the "$" character only the end (or before the
+newline at the end), and Perl does certain optimizations with the
+assumption that the string contains only one line. Embedded newlines
+will not be matched by "^" or "$". You may, however, wish to treat a
+string as a multi-line buffer, such that the "^" will match after any
+newline within the string (except if the newline is the last character in
+the string), and "$" will match before any newline. At the
+cost of a little more overhead, you can do this by using the /m modifier
+on the pattern match operator. (Older programs did this by setting C<$*>,
+but this practice has been removed in perl 5.9.)
+X<^> X<$> X</m>
+
+To simplify multi-line substitutions, the "." character never matches a
+newline unless you use the C</s> modifier, which in effect tells Perl to pretend
+the string is a single line--even if it isn't.
+X<.> X</s>
+
+=head3 Quantifiers
+
+The following standard quantifiers are recognized:
+X<metacharacter> X<quantifier> X<*> X<+> X<?> X<{n}> X<{n,}> X<{n,m}>
+
+ * Match 0 or more times
+ + Match 1 or more times
+ ? Match 1 or 0 times
+ {n} Match exactly n times
+ {n,} Match at least n times
+ {n,m} Match at least n but not more than m times
+
+(If a curly bracket occurs in any other context, it is treated
+as a regular character. In particular, the lower bound
+is not optional.) The "*" quantifier is equivalent to C<{0,}>, the "+"
+quantifier to C<{1,}>, and the "?" quantifier to C<{0,1}>. n and m are limited
+to integral values less than a preset limit defined when perl is built.
+This is usually 32766 on the most common platforms. The actual limit can
+be seen in the error message generated by code such as this:
+
+ $_ **= $_ , / {$_} / for 2 .. 42;
+
+By default, a quantified subpattern is "greedy", that is, it will match as
+many times as possible (given a particular starting location) while still
+allowing the rest of the pattern to match. If you want it to match the
+minimum number of times possible, follow the quantifier with a "?". Note
+that the meanings don't change, just the "greediness":
+X<metacharacter> X<greedy> X<greediness>
+X<?> X<*?> X<+?> X<??> X<{n}?> X<{n,}?> X<{n,m}?>
+
+ *? Match 0 or more times, not greedily
+ +? Match 1 or more times, not greedily
+ ?? Match 0 or 1 time, not greedily
+ {n}? Match exactly n times, not greedily
+ {n,}? Match at least n times, not greedily
+ {n,m}? Match at least n but not more than m times, not greedily
+
+By default, when a quantified subpattern does not allow the rest of the
+overall pattern to match, Perl will backtrack. However, this behaviour is
+sometimes undesirable. Thus Perl provides the "possessive" quantifier form
+as well.
+
+ *+ Match 0 or more times and give nothing back
+ ++ Match 1 or more times and give nothing back
+ ?+ Match 0 or 1 time and give nothing back
+ {n}+ Match exactly n times and give nothing back (redundant)
+ {n,}+ Match at least n times and give nothing back
+ {n,m}+ Match at least n but not more than m times and give nothing back
+
+For instance,
+
+ 'aaaa' =~ /a++a/
+
+will never match, as the C<a++> will gobble up all the C<a>'s in the
+string and won't leave any for the remaining part of the pattern. This
+feature can be extremely useful to give perl hints about where it
+shouldn't backtrack. For instance, the typical "match a double-quoted
+string" problem can be most efficiently performed when written as:
+
+ /"(?:[^"\\]++|\\.)*+"/
+
+as we know that if the final quote does not match, backtracking will not
+help. See the independent subexpression C<< (?>...) >> for more details;
+possessive quantifiers are just syntactic sugar for that construct. For
+instance the above example could also be written as follows:
+
+ /"(?>(?:(?>[^"\\]+)|\\.)*)"/
+
+=head3 Escape sequences
+
+Because patterns are processed as double quoted strings, the following
+also work:
+X<\t> X<\n> X<\r> X<\f> X<\e> X<\a> X<\l> X<\u> X<\L> X<\U> X<\E> X<\Q>
+X<\0> X<\c> X<\N> X<\x>
+
+ \t tab (HT, TAB)
+ \n newline (LF, NL)
+ \r return (CR)
+ \f form feed (FF)
+ \a alarm (bell) (BEL)
+ \e escape (think troff) (ESC)
+ \033 octal char (example: ESC)
+ \x1B hex char (example: ESC)
+ \x{263a} long hex char (example: Unicode SMILEY)
+ \cK control char (example: VT)
+ \N{name} named Unicode character
+ \l lowercase next char (think vi)
+ \u uppercase next char (think vi)
+ \L lowercase till \E (think vi)
+ \U uppercase till \E (think vi)
+ \E end case modification (think vi)
+ \Q quote (disable) pattern metacharacters till \E
+
+If C<use locale> is in effect, the case map used by C<\l>, C<\L>, C<\u>
+and C<\U> is taken from the current locale. See L<perllocale>. For
+documentation of C<\N{name}>, see L<charnames>.
+
+You cannot include a literal C<$> or C<@> within a C<\Q> sequence.
+An unescaped C<$> or C<@> interpolates the corresponding variable,
+while escaping will cause the literal string C<\$> to be matched.
+You'll need to write something like C<m/\Quser\E\@\Qhost/>.
+
+=head3 Character Classes and other Special Escapes
+
+In addition, Perl defines the following:
+X<\w> X<\W> X<\s> X<\S> X<\d> X<\D> X<\X> X<\p> X<\P> X<\C>
+X<\g> X<\k> X<\N> X<\K> X<\v> X<\V> X<\h> X<\H>
+X<word> X<whitespace> X<character class> X<backreference>
+
+ \w Match a "word" character (alphanumeric plus "_")
+ \W Match a non-"word" character
+ \s Match a whitespace character
+ \S Match a non-whitespace character
+ \d Match a digit character
+ \D Match a non-digit character
+ \pP Match P, named property. Use \p{Prop} for longer names.
+ \PP Match non-P
+ \X Match eXtended Unicode "combining character sequence",
+ equivalent to (?>\PM\pM*)
+ \C Match a single C char (octet) even under Unicode.
+ NOTE: breaks up characters into their UTF-8 bytes,
+ so you may end up with malformed pieces of UTF-8.
+ Unsupported in lookbehind.
+ \1 Backreference to a specific group.
+ '1' may actually be any positive integer.
+ \g1 Backreference to a specific or previous group,
+ \g{-1} number may be negative indicating a previous buffer and may
+ optionally be wrapped in curly brackets for safer parsing.
+ \g{name} Named backreference
+ \k<name> Named backreference
+ \K Keep the stuff left of the \K, don't include it in $&
+ \v Vertical whitespace
+ \V Not vertical whitespace
+ \h Horizontal whitespace
+ \H Not horizontal whitespace
+ \R Linebreak
+
+A C<\w> matches a single alphanumeric character (an alphabetic
+character, or a decimal digit) or C<_>, not a whole word. Use C<\w+>
+to match a string of Perl-identifier characters (which isn't the same
+as matching an English word). If C<use locale> is in effect, the list
+of alphabetic characters generated by C<\w> is taken from the current
+locale. See L<perllocale>. You may use C<\w>, C<\W>, C<\s>, C<\S>,
+C<\d>, and C<\D> within character classes, but they aren't usable
+as either end of a range. If any of them precedes or follows a "-",
+the "-" is understood literally. If Unicode is in effect, C<\s> matches
+also "\x{85}", "\x{2028}", and "\x{2029}". See L<perlunicode> for more
+details about C<\pP>, C<\PP>, C<\X> and the possibility of defining
+your own C<\p> and C<\P> properties, and L<perluniintro> about Unicode
+in general.
+X<\w> X<\W> X<word>
+
+C<\R> will atomically match a linebreak, including the network line-ending
+"\x0D\x0A". Specifically, X<\R> is exactly equivalent to
+
+ (?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}])
+
+B<Note:> C<\R> has no special meaning inside of a character class;
+use C<\v> instead (vertical whitespace).
+X<\R>
+
+The POSIX character class syntax
+X<character class>
+
+ [:class:]
+
+is also available. Note that the C<[> and C<]> brackets are I<literal>;
+they must always be used within a character class expression.
+
+ # this is correct:
+ $string =~ /[[:alpha:]]/;
+
+ # this is not, and will generate a warning:
+ $string =~ /[:alpha:]/;
+
+The available classes and their backslash equivalents (if available) are
+as follows:
+X<character class>
+X<alpha> X<alnum> X<ascii> X<blank> X<cntrl> X<digit> X<graph>
+X<lower> X<print> X<punct> X<space> X<upper> X<word> X<xdigit>
+
+ alpha
+ alnum
+ ascii
+ blank [1]
+ cntrl
+ digit \d
+ graph
+ lower
+ print
+ punct
+ space \s [2]
+ upper
+ word \w [3]
+ xdigit
+
+=over
+
+=item [1]
+
+A GNU extension equivalent to C<[ \t]>, "all horizontal whitespace".
+
+=item [2]
+
+Not exactly equivalent to C<\s> since the C<[[:space:]]> includes
+also the (very rare) "vertical tabulator", "\cK" or chr(11) in ASCII.
+
+=item [3]
+
+A Perl extension, see above.
+
+=back
+
+For example use C<[:upper:]> to match all the uppercase characters.
+Note that the C<[]> are part of the C<[::]> construct, not part of the
+whole character class. For example:
+
+ [01[:alpha:]%]
+
+matches zero, one, any alphabetic character, and the percent sign.
+
+The following equivalences to Unicode \p{} constructs and equivalent
+backslash character classes (if available), will hold:
+X<character class> X<\p> X<\p{}>
+
+ [[:...:]] \p{...} backslash
+
+ alpha IsAlpha
+ alnum IsAlnum
+ ascii IsASCII
+ blank
+ cntrl IsCntrl
+ digit IsDigit \d
+ graph IsGraph
+ lower IsLower
+ print IsPrint (but see [2] below)
+ punct IsPunct (but see [3] below)
+ space IsSpace
+ IsSpacePerl \s
+ upper IsUpper
+ word IsWord \w
+ xdigit IsXDigit
+
+For example C<[[:lower:]]> and C<\p{IsLower}> are equivalent.
+
+However, the equivalence between C<[[:xxxxx:]]> and C<\p{IsXxxxx}>
+is not exact.
+
+=over 4
+
+=item [1]
+
+If the C<utf8> pragma is not used but the C<locale> pragma is, the
+classes correlate with the usual isalpha(3) interface (except for
+"word" and "blank").
+
+But if the C<locale> or C<encoding> pragmas are not used and
+the string is not C<utf8>, then C<[[:xxxxx:]]> (and C<\w>, etc.)
+will not match characters 0x80-0xff; whereas C<\p{IsXxxxx}> will
+force the string to C<utf8> and can match these characters
+(as Unicode).
+
+=item [2]
+
+C<\p{IsPrint}> matches characters 0x09-0x0d but C<[[:print:]]> does not.
+
+=item [3]
+
+C<[[:punct::]]> matches the following but C<\p{IsPunct}> does not,
+because they are classed as symbols (not punctuation) in Unicode.
+
+=over 4
+
+=item C<$>
+
+Currency symbol
+
+=item C<+> C<< < >> C<=> C<< > >> C<|> C<~>
+
+Mathematical symbols
+
+=item C<^> C<`>
+
+Modifier symbols (accents)
+
+=back
+
+=back
+
+The other named classes are:
+
+=over 4
+
+=item cntrl
+X<cntrl>
+
+Any control character. Usually characters that don't produce output as
+such but instead control the terminal somehow: for example newline and
+backspace are control characters. All characters with ord() less than
+32 are usually classified as control characters (assuming ASCII,
+the ISO Latin character sets, and Unicode), as is the character with
+the ord() value of 127 (C<DEL>).
+
+=item graph
+X<graph>
+
+Any alphanumeric or punctuation (special) character.
+
+=item print
+X<print>
+
+Any alphanumeric or punctuation (special) character or the space character.
+
+=item punct
+X<punct>
+
+Any punctuation (special) character.
+
+=item xdigit
+X<xdigit>
+
+Any hexadecimal digit. Though this may feel silly ([0-9A-Fa-f] would
+work just fine) it is included for completeness.
+
+=back
+
+You can negate the [::] character classes by prefixing the class name
+with a '^'. This is a Perl extension. For example:
+X<character class, negation>
+
+ POSIX traditional Unicode
+
+ [[:^digit:]] \D \P{IsDigit}
+ [[:^space:]] \S \P{IsSpace}
+ [[:^word:]] \W \P{IsWord}
+
+Perl respects the POSIX standard in that POSIX character classes are
+only supported within a character class. The POSIX character classes
+[.cc.] and [=cc=] are recognized but B<not> supported and trying to
+use them will cause an error.
+
+=head3 Assertions
+
+Perl defines the following zero-width assertions:
+X<zero-width assertion> X<assertion> X<regex, zero-width assertion>
+X<regexp, zero-width assertion>
+X<regular expression, zero-width assertion>
+X<\b> X<\B> X<\A> X<\Z> X<\z> X<\G>
+
+ \b Match a word boundary
+ \B Match except at a word boundary
+ \A Match only at beginning of string
+ \Z Match only at end of string, or before newline at the end
+ \z Match only at end of string
+ \G Match only at pos() (e.g. at the end-of-match position
+ of prior m//g)
+
+A word boundary (C<\b>) is a spot between two characters
+that has a C<\w> on one side of it and a C<\W> on the other side
+of it (in either order), counting the imaginary characters off the
+beginning and end of the string as matching a C<\W>. (Within
+character classes C<\b> represents backspace rather than a word
+boundary, just as it normally does in any double-quoted string.)
+The C<\A> and C<\Z> are just like "^" and "$", except that they
+won't match multiple times when the C</m> modifier is used, while
+"^" and "$" will match at every internal line boundary. To match
+the actual end of the string and not ignore an optional trailing
+newline, use C<\z>.
+X<\b> X<\A> X<\Z> X<\z> X</m>
+
+The C<\G> assertion can be used to chain global matches (using
+C<m//g>), as described in L<perlop/"Regexp Quote-Like Operators">.
+It is also useful when writing C<lex>-like scanners, when you have
+several patterns that you want to match against consequent substrings
+of your string, see the previous reference. The actual location
+where C<\G> will match can also be influenced by using C<pos()> as
+an lvalue: see L<perlfunc/pos>. Note that the rule for zero-length
+matches is modified somewhat, in that contents to the left of C<\G> is
+not counted when determining the length of the match. Thus the following
+will not match forever:
+X<\G>
+
+ $str = 'ABC';
+ pos($str) = 1;
+ while (/.\G/g) {
+ print $&;
+ }
+
+It will print 'A' and then terminate, as it considers the match to
+be zero-width, and thus will not match at the same position twice in a
+row.
+
+It is worth noting that C<\G> improperly used can result in an infinite
+loop. Take care when using patterns that include C<\G> in an alternation.
+
+=head3 Capture buffers
+
+The bracketing construct C<( ... )> creates capture buffers. To refer
+to the current contents of a buffer later on, within the same pattern,
+use \1 for the first, \2 for the second, and so on.
+Outside the match use "$" instead of "\". (The
+\<digit> notation works in certain circumstances outside
+the match. See the warning below about \1 vs $1 for details.)
+Referring back to another part of the match is called a
+I<backreference>.
+X<regex, capture buffer> X<regexp, capture buffer>
+X<regular expression, capture buffer> X<backreference>
+
+There is no limit to the number of captured substrings that you may
+use. However Perl also uses \10, \11, etc. as aliases for \010,
+\011, etc. (Recall that 0 means octal, so \011 is the character at
+number 9 in your coded character set; which would be the 10th character,
+a horizontal tab under ASCII.) Perl resolves this
+ambiguity by interpreting \10 as a backreference only if at least 10
+left parentheses have opened before it. Likewise \11 is a
+backreference only if at least 11 left parentheses have opened
+before it. And so on. \1 through \9 are always interpreted as
+backreferences.
+
+X<\g{1}> X<\g{-1}> X<\g{name}> X<relative backreference> X<named backreference>
+In order to provide a safer and easier way to construct patterns using
+backreferences, Perl provides the C<\g{N}> notation (starting with perl
+5.10.0). The curly brackets are optional, however omitting them is less
+safe as the meaning of the pattern can be changed by text (such as digits)
+following it. When N is a positive integer the C<\g{N}> notation is
+exactly equivalent to using normal backreferences. When N is a negative
+integer then it is a relative backreference referring to the previous N'th
+capturing group. When the bracket form is used and N is not an integer, it
+is treated as a reference to a named buffer.
+
+Thus C<\g{-1}> refers to the last buffer, C<\g{-2}> refers to the
+buffer before that. For example:
+
+ /
+ (Y) # buffer 1
+ ( # buffer 2
+ (X) # buffer 3
+ \g{-1} # backref to buffer 3
+ \g{-3} # backref to buffer 1
+ )
+ /x
+
+and would match the same as C</(Y) ( (X) \3 \1 )/x>.
+
+Additionally, as of Perl 5.10.0 you may use named capture buffers and named
+backreferences. The notation is C<< (?<name>...) >> to declare and C<< \k<name> >>
+to reference. You may also use apostrophes instead of angle brackets to delimit the
+name; and you may use the bracketed C<< \g{name} >> backreference syntax.
+It's possible to refer to a named capture buffer by absolute and relative number as well.
+Outside the pattern, a named capture buffer is available via the C<%+> hash.
+When different buffers within the same pattern have the same name, C<$+{name}>
+and C<< \k<name> >> refer to the leftmost defined group. (Thus it's possible
+to do things with named capture buffers that would otherwise require C<(??{})>
+code to accomplish.)
+X<named capture buffer> X<regular expression, named capture buffer>
+X<%+> X<$+{name}> X<< \k<name> >>
+
+Examples:
+
+ s/^([^ ]*) *([^ ]*)/$2 $1/; # swap first two words
+
+ /(.)\1/ # find first doubled char
+ and print "'$1' is the first doubled character\n";
+
+ /(?<char>.)\k<char>/ # ... a different way
+ and print "'$+{char}' is the first doubled character\n";
+
+ /(?'char'.)\1/ # ... mix and match
+ and print "'$1' is the first doubled character\n";
+
+ if (/Time: (..):(..):(..)/) { # parse out values
+ $hours = $1;
+ $minutes = $2;
+ $seconds = $3;
+ }
+
+Several special variables also refer back to portions of the previous
+match. C<$+> returns whatever the last bracket match matched.
+C<$&> returns the entire matched string. (At one point C<$0> did
+also, but now it returns the name of the program.) C<$`> returns
+everything before the matched string. C<$'> returns everything
+after the matched string. And C<$^N> contains whatever was matched by
+the most-recently closed group (submatch). C<$^N> can be used in
+extended patterns (see below), for example to assign a submatch to a
+variable.
+X<$+> X<$^N> X<$&> X<$`> X<$'>
+
+The numbered match variables ($1, $2, $3, etc.) and the related punctuation
+set (C<$+>, C<$&>, C<$`>, C<$'>, and C<$^N>) are all dynamically scoped
+until the end of the enclosing block or until the next successful
+match, whichever comes first. (See L<perlsyn/"Compound Statements">.)
+X<$+> X<$^N> X<$&> X<$`> X<$'>
+X<$1> X<$2> X<$3> X<$4> X<$5> X<$6> X<$7> X<$8> X<$9>
+
+
+B<NOTE>: Failed matches in Perl do not reset the match variables,
+which makes it easier to write code that tests for a series of more
+specific cases and remembers the best match.
+
+B<WARNING>: Once Perl sees that you need one of C<$&>, C<$`>, or
+C<$'> anywhere in the program, it has to provide them for every
+pattern match. This may substantially slow your program. Perl
+uses the same mechanism to produce $1, $2, etc, so you also pay a
+price for each pattern that contains capturing parentheses. (To
+avoid this cost while retaining the grouping behaviour, use the
+extended regular expression C<(?: ... )> instead.) But if you never
+use C<$&>, C<$`> or C<$'>, then patterns I<without> capturing
+parentheses will not be penalized. So avoid C<$&>, C<$'>, and C<$`>
+if you can, but if you can't (and some algorithms really appreciate
+them), once you've used them once, use them at will, because you've
+already paid the price. As of 5.005, C<$&> is not so costly as the
+other two.
+X<$&> X<$`> X<$'>
+
+As a workaround for this problem, Perl 5.10.0 introduces C<${^PREMATCH}>,
+C<${^MATCH}> and C<${^POSTMATCH}>, which are equivalent to C<$`>, C<$&>
+and C<$'>, B<except> that they are only guaranteed to be defined after a
+successful match that was executed with the C</p> (preserve) modifier.
+The use of these variables incurs no global performance penalty, unlike
+their punctuation char equivalents, however at the trade-off that you
+have to tell perl when you want to use them.
+X</p> X<p modifier>
+
+Backslashed metacharacters in Perl are alphanumeric, such as C<\b>,
+C<\w>, C<\n>. Unlike some other regular expression languages, there
+are no backslashed symbols that aren't alphanumeric. So anything
+that looks like \\, \(, \), \<, \>, \{, or \} is always
+interpreted as a literal character, not a metacharacter. This was
+once used in a common idiom to disable or quote the special meanings
+of regular expression metacharacters in a string that you want to
+use for a pattern. Simply quote all non-"word" characters:
+
+ $pattern =~ s/(\W)/\\$1/g;
+
+(If C<use locale> is set, then this depends on the current locale.)
+Today it is more common to use the quotemeta() function or the C<\Q>
+metaquoting escape sequence to disable all metacharacters' special
+meanings like this:
+
+ /$unquoted\Q$quoted\E$unquoted/
+
+Beware that if you put literal backslashes (those not inside
+interpolated variables) between C<\Q> and C<\E>, double-quotish
+backslash interpolation may lead to confusing results. If you
+I<need> to use literal backslashes within C<\Q...\E>,
+consult L<perlop/"Gory details of parsing quoted constructs">.
+
+=head2 Extended Patterns
+
+Perl also defines a consistent extension syntax for features not
+found in standard tools like B<awk> and B<lex>. The syntax is a
+pair of parentheses with a question mark as the first thing within
+the parentheses. The character after the question mark indicates
+the extension.
+
+The stability of these extensions varies widely. Some have been
+part of the core language for many years. Others are experimental
+and may change without warning or be completely removed. Check
+the documentation on an individual feature to verify its current
+status.
+
+A question mark was chosen for this and for the minimal-matching
+construct because 1) question marks are rare in older regular
+expressions, and 2) whenever you see one, you should stop and
+"question" exactly what is going on. That's psychology...
+
+=over 10
+
+=item C<(?#text)>
+X<(?#)>
+
+A comment. The text is ignored. If the C</x> modifier enables
+whitespace formatting, a simple C<#> will suffice. Note that Perl closes
+the comment as soon as it sees a C<)>, so there is no way to put a literal
+C<)> in the comment.
+
+=item C<(?pimsx-imsx)>
+X<(?)>
+
+One or more embedded pattern-match modifiers, to be turned on (or
+turned off, if preceded by C<->) for the remainder of the pattern or
+the remainder of the enclosing pattern group (if any). This is
+particularly useful for dynamic patterns, such as those read in from a
+configuration file, taken from an argument, or specified in a table
+somewhere. Consider the case where some patterns want to be case
+sensitive and some do not: The case insensitive ones merely need to
+include C<(?i)> at the front of the pattern. For example:
+
+ $pattern = "foobar";
+ if ( /$pattern/i ) { }
+
+ # more flexible:
+
+ $pattern = "(?i)foobar";
+ if ( /$pattern/ ) { }
+
+These modifiers are restored at the end of the enclosing group. For example,
+
+ ( (?i) blah ) \s+ \1
+
+will match C<blah> in any case, some spaces, and an exact (I<including the case>!)
+repetition of the previous word, assuming the C</x> modifier, and no C</i>
+modifier outside this group.
+
+Note that the C<p> modifier is special in that it can only be enabled,
+not disabled, and that its presence anywhere in a pattern has a global
+effect. Thus C<(?-p)> and C<(?-p:...)> are meaningless and will warn
+when executed under C<use warnings>.
+
+=item C<(?:pattern)>
+X<(?:)>
+
+=item C<(?imsx-imsx:pattern)>
+
+This is for clustering, not capturing; it groups subexpressions like
+"()", but doesn't make backreferences as "()" does. So
+
+ @fields = split(/\b(?:a|b|c)\b/)
+
+is like
+
+ @fields = split(/\b(a|b|c)\b/)
+
+but doesn't spit out extra fields. It's also cheaper not to capture
+characters if you don't need to.
+
+Any letters between C<?> and C<:> act as flags modifiers as with
+C<(?imsx-imsx)>. For example,
+
+ /(?s-i:more.*than).*million/i
+
+is equivalent to the more verbose
+
+ /(?:(?s-i)more.*than).*million/i
+
+=item C<(?|pattern)>
+X<(?|)> X<Branch reset>
+
+This is the "branch reset" pattern, which has the special property
+that the capture buffers are numbered from the same starting point
+in each alternation branch. It is available starting from perl 5.10.0.
+
+Capture buffers are numbered from left to right, but inside this
+construct the numbering is restarted for each branch.
+
+The numbering within each branch will be as normal, and any buffers
+following this construct will be numbered as though the construct
+contained only one branch, that being the one with the most capture
+buffers in it.
+
+This construct will be useful when you want to capture one of a
+number of alternative matches.
+
+Consider the following pattern. The numbers underneath show in
+which buffer the captured content will be stored.
+
+
+ # before ---------------branch-reset----------- after
+ / ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
+ # 1 2 2 3 2 3 4
+
+Note: as of Perl 5.10.0, branch resets interfere with the contents of
+the C<%+> hash, that holds named captures. Consider using C<%-> instead.
+
+=item Look-Around Assertions
+X<look-around assertion> X<lookaround assertion> X<look-around> X<lookaround>
+
+Look-around assertions are zero width patterns which match a specific
+pattern without including it in C<$&>. Positive assertions match when
+their subpattern matches, negative assertions match when their subpattern
+fails. Look-behind matches text up to the current match position,
+look-ahead matches text following the current match position.
+
+=over 4
+
+=item C<(?=pattern)>
+X<(?=)> X<look-ahead, positive> X<lookahead, positive>
+
+A zero-width positive look-ahead assertion. For example, C</\w+(?=\t)/>
+matches a word followed by a tab, without including the tab in C<$&>.
+
+=item C<(?!pattern)>
+X<(?!)> X<look-ahead, negative> X<lookahead, negative>
+
+A zero-width negative look-ahead assertion. For example C</foo(?!bar)/>
+matches any occurrence of "foo" that isn't followed by "bar". Note
+however that look-ahead and look-behind are NOT the same thing. You cannot
+use this for look-behind.
+
+If you are looking for a "bar" that isn't preceded by a "foo", C</(?!foo)bar/>
+will not do what you want. That's because the C<(?!foo)> is just saying that
+the next thing cannot be "foo"--and it's not, it's a "bar", so "foobar" will
+match. You would have to do something like C</(?!foo)...bar/> for that. We
+say "like" because there's the case of your "bar" not having three characters
+before it. You could cover that this way: C</(?:(?!foo)...|^.{0,2})bar/>.
+Sometimes it's still easier just to say:
+
+ if (/bar/ && $` !~ /foo$/)
+
+For look-behind see below.
+
+=item C<(?<=pattern)> C<\K>
+X<(?<=)> X<look-behind, positive> X<lookbehind, positive> X<\K>
+
+A zero-width positive look-behind assertion. For example, C</(?<=\t)\w+/>
+matches a word that follows a tab, without including the tab in C<$&>.
+Works only for fixed-width look-behind.
+
+There is a special form of this construct, called C<\K>, which causes the
+regex engine to "keep" everything it had matched prior to the C<\K> and
+not include it in C<$&>. This effectively provides variable length
+look-behind. The use of C<\K> inside of another look-around assertion
+is allowed, but the behaviour is currently not well defined.
+
+For various reasons C<\K> may be significantly more efficient than the
+equivalent C<< (?<=...) >> construct, and it is especially useful in
+situations where you want to efficiently remove something following
+something else in a string. For instance
+
+ s/(foo)bar/$1/g;
+
+can be rewritten as the much more efficient
+
+ s/foo\Kbar//g;
+
+=item C<(?<!pattern)>
+X<(?<!)> X<look-behind, negative> X<lookbehind, negative>
+
+A zero-width negative look-behind assertion. For example C</(?<!bar)foo/>
+matches any occurrence of "foo" that does not follow "bar". Works
+only for fixed-width look-behind.
+
+=back
+
+=item C<(?'NAME'pattern)>
+
+=item C<< (?<NAME>pattern) >>
+X<< (?<NAME>) >> X<(?'NAME')> X<named capture> X<capture>
+
+A named capture buffer. Identical in every respect to normal capturing
+parentheses C<()> but for the additional fact that C<%+> or C<%-> may be
+used after a successful match to refer to a named buffer. See C<perlvar>
+for more details on the C<%+> and C<%-> hashes.
+
+If multiple distinct capture buffers have the same name then the
+$+{NAME} will refer to the leftmost defined buffer in the match.
+
+The forms C<(?'NAME'pattern)> and C<< (?<NAME>pattern) >> are equivalent.
+
+B<NOTE:> While the notation of this construct is the same as the similar
+function in .NET regexes, the behavior is not. In Perl the buffers are
+numbered sequentially regardless of being named or not. Thus in the
+pattern
+
+ /(x)(?<foo>y)(z)/
+
+$+{foo} will be the same as $2, and $3 will contain 'z' instead of
+the opposite which is what a .NET regex hacker might expect.
+
+Currently NAME is restricted to simple identifiers only.
+In other words, it must match C</^[_A-Za-z][_A-Za-z0-9]*\z/> or
+its Unicode extension (see L<utf8>),
+though it isn't extended by the locale (see L<perllocale>).
+
+B<NOTE:> In order to make things easier for programmers with experience
+with the Python or PCRE regex engines, the pattern C<< (?PE<lt>NAMEE<gt>pattern) >>
+may be used instead of C<< (?<NAME>pattern) >>; however this form does not
+support the use of single quotes as a delimiter for the name.
+
+=item C<< \k<NAME> >>
+
+=item C<< \k'NAME' >>
+
+Named backreference. Similar to numeric backreferences, except that
+the group is designated by name and not number. If multiple groups
+have the same name then it refers to the leftmost defined group in
+the current match.
+
+It is an error to refer to a name not defined by a C<< (?<NAME>) >>
+earlier in the pattern.
+
+Both forms are equivalent.
+
+B<NOTE:> In order to make things easier for programmers with experience
+with the Python or PCRE regex engines, the pattern C<< (?P=NAME) >>
+may be used instead of C<< \k<NAME> >>.
+
+=item C<(?{ code })>
+X<(?{})> X<regex, code in> X<regexp, code in> X<regular expression, code in>
+
+B<WARNING>: This extended regular expression feature is considered
+experimental, and may be changed without notice. Code executed that
+has side effects may not perform identically from version to version
+due to the effect of future optimisations in the regex engine.
+
+This zero-width assertion evaluates any embedded Perl code. It
+always succeeds, and its C<code> is not interpolated. Currently,
+the rules to determine where the C<code> ends are somewhat convoluted.
+
+This feature can be used together with the special variable C<$^N> to
+capture the results of submatches in variables without having to keep
+track of the number of nested parentheses. For example:
+
+ $_ = "The brown fox jumps over the lazy dog";
+ /the (\S+)(?{ $color = $^N }) (\S+)(?{ $animal = $^N })/i;
+ print "color = $color, animal = $animal\n";
+
+Inside the C<(?{...})> block, C<$_> refers to the string the regular
+expression is matching against. You can also use C<pos()> to know what is
+the current position of matching within this string.
+
+The C<code> is properly scoped in the following sense: If the assertion
+is backtracked (compare L<"Backtracking">), all changes introduced after
+C<local>ization are undone, so that
+
+ $_ = 'a' x 8;
+ m<
+ (?{ $cnt = 0 }) # Initialize $cnt.
+ (
+ a
+ (?{
+ local $cnt = $cnt + 1; # Update $cnt, backtracking-safe.
+ })
+ )*
+ aaaa
+ (?{ $res = $cnt }) # On success copy to non-localized
+ # location.
+ >x;
+
+will set C<$res = 4>. Note that after the match, C<$cnt> returns to the globally
+introduced value, because the scopes that restrict C<local> operators
+are unwound.
+
+This assertion may be used as a C<(?(condition)yes-pattern|no-pattern)>
+switch. If I<not> used in this way, the result of evaluation of
+C<code> is put into the special variable C<$^R>. This happens
+immediately, so C<$^R> can be used from other C<(?{ code })> assertions
+inside the same regular expression.
+
+The assignment to C<$^R> above is properly localized, so the old
+value of C<$^R> is restored if the assertion is backtracked; compare
+L<"Backtracking">.
+
+Due to an unfortunate implementation issue, the Perl code contained in these
+blocks is treated as a compile time closure that can have seemingly bizarre
+consequences when used with lexically scoped variables inside of subroutines
+or loops. There are various workarounds for this, including simply using
+global variables instead. If you are using this construct and strange results
+occur then check for the use of lexically scoped variables.
+
+For reasons of security, this construct is forbidden if the regular
+expression involves run-time interpolation of variables, unless the
+perilous C<use re 'eval'> pragma has been used (see L<re>), or the
+variables contain results of C<qr//> operator (see
+L<perlop/"qr/STRING/imosx">).
+
+This restriction is due to the wide-spread and remarkably convenient
+custom of using run-time determined strings as patterns. For example:
+
+ $re = <>;
+ chomp $re;
+ $string =~ /$re/;
+
+Before Perl knew how to execute interpolated code within a pattern,
+this operation was completely safe from a security point of view,
+although it could raise an exception from an illegal pattern. If
+you turn on the C<use re 'eval'>, though, it is no longer secure,
+so you should only do so if you are also using taint checking.
+Better yet, use the carefully constrained evaluation within a Safe
+compartment. See L<perlsec> for details about both these mechanisms.
+
+Because Perl's regex engine is currently not re-entrant, interpolated
+code may not invoke the regex engine either directly with C<m//> or C<s///>),
+or indirectly with functions such as C<split>.
+
+=item C<(??{ code })>
+X<(??{})>
+X<regex, postponed> X<regexp, postponed> X<regular expression, postponed>
+
+B<WARNING>: This extended regular expression feature is considered
+experimental, and may be changed without notice. Code executed that
+has side effects may not perform identically from version to version
+due to the effect of future optimisations in the regex engine.
+
+This is a "postponed" regular subexpression. The C<code> is evaluated
+at run time, at the moment this subexpression may match. The result
+of evaluation is considered as a regular expression and matched as
+if it were inserted instead of this construct. Note that this means
+that the contents of capture buffers defined inside an eval'ed pattern
+are not available outside of the pattern, and vice versa, there is no
+way for the inner pattern to refer to a capture buffer defined outside.
+Thus,
+
+ ('a' x 100)=~/(??{'(.)' x 100})/
+
+B<will> match, it will B<not> set $1.
+
+The C<code> is not interpolated. As before, the rules to determine
+where the C<code> ends are currently somewhat convoluted.
+
+The following pattern matches a parenthesized group:
+
+ $re = qr{
+ \(
+ (?:
+ (?> [^()]+ ) # Non-parens without backtracking
+ |
+ (??{ $re }) # Group with matching parens
+ )*
+ \)
+ }x;
+
+See also C<(?PARNO)> for a different, more efficient way to accomplish
+the same task.
+
+Because perl's regex engine is not currently re-entrant, delayed
+code may not invoke the regex engine either directly with C<m//> or C<s///>),
+or indirectly with functions such as C<split>.
+
+Recursing deeper than 50 times without consuming any input string will
+result in a fatal error. The maximum depth is compiled into perl, so
+changing it requires a custom build.
+
+=item C<(?PARNO)> C<(?-PARNO)> C<(?+PARNO)> C<(?R)> C<(?0)>
+X<(?PARNO)> X<(?1)> X<(?R)> X<(?0)> X<(?-1)> X<(?+1)> X<(?-PARNO)> X<(?+PARNO)>
+X<regex, recursive> X<regexp, recursive> X<regular expression, recursive>
+X<regex, relative recursion>
+
+Similar to C<(??{ code })> except it does not involve compiling any code,
+instead it treats the contents of a capture buffer as an independent
+pattern that must match at the current position. Capture buffers
+contained by the pattern will have the value as determined by the
+outermost recursion.
+
+PARNO is a sequence of digits (not starting with 0) whose value reflects
+the paren-number of the capture buffer to recurse to. C<(?R)> recurses to
+the beginning of the whole pattern. C<(?0)> is an alternate syntax for
+C<(?R)>. If PARNO is preceded by a plus or minus sign then it is assumed
+to be relative, with negative numbers indicating preceding capture buffers
+and positive ones following. Thus C<(?-1)> refers to the most recently
+declared buffer, and C<(?+1)> indicates the next buffer to be declared.
+Note that the counting for relative recursion differs from that of
+relative backreferences, in that with recursion unclosed buffers B<are>
+included.
+
+The following pattern matches a function foo() which may contain
+balanced parentheses as the argument.
+
+ $re = qr{ ( # paren group 1 (full function)
+ foo
+ ( # paren group 2 (parens)
+ \(
+ ( # paren group 3 (contents of parens)
+ (?:
+ (?> [^()]+ ) # Non-parens without backtracking
+ |
+ (?2) # Recurse to start of paren group 2
+ )*
+ )
+ \)
+ )
+ )
+ }x;
+
+If the pattern was used as follows
+
+ 'foo(bar(baz)+baz(bop))'=~/$re/
+ and print "\$1 = $1\n",
+ "\$2 = $2\n",
+ "\$3 = $3\n";
+
+the output produced should be the following:
+
+ $1 = foo(bar(baz)+baz(bop))
+ $2 = (bar(baz)+baz(bop))
+ $3 = bar(baz)+baz(bop)
+
+If there is no corresponding capture buffer defined, then it is a
+fatal error. Recursing deeper than 50 times without consuming any input
+string will also result in a fatal error. The maximum depth is compiled
+into perl, so changing it requires a custom build.
+
+The following shows how using negative indexing can make it
+easier to embed recursive patterns inside of a C<qr//> construct
+for later use:
+
+ my $parens = qr/(\((?:[^()]++|(?-1))*+\))/;
+ if (/foo $parens \s+ + \s+ bar $parens/x) {
+ # do something here...
+ }
+
+B<Note> that this pattern does not behave the same way as the equivalent
+PCRE or Python construct of the same form. In Perl you can backtrack into
+a recursed group, in PCRE and Python the recursed into group is treated
+as atomic. Also, modifiers are resolved at compile time, so constructs
+like (?i:(?1)) or (?:(?i)(?1)) do not affect how the sub-pattern will
+be processed.
+
+=item C<(?&NAME)>
+X<(?&NAME)>
+
+Recurse to a named subpattern. Identical to C<(?PARNO)> except that the
+parenthesis to recurse to is determined by name. If multiple parentheses have
+the same name, then it recurses to the leftmost.
+
+It is an error to refer to a name that is not declared somewhere in the
+pattern.
+
+B<NOTE:> In order to make things easier for programmers with experience
+with the Python or PCRE regex engines the pattern C<< (?P>NAME) >>
+may be used instead of C<< (?&NAME) >>.
+
+=item C<(?(condition)yes-pattern|no-pattern)>
+X<(?()>
+
+=item C<(?(condition)yes-pattern)>
+
+Conditional expression. C<(condition)> should be either an integer in
+parentheses (which is valid if the corresponding pair of parentheses
+matched), a look-ahead/look-behind/evaluate zero-width assertion, a
+name in angle brackets or single quotes (which is valid if a buffer
+with the given name matched), or the special symbol (R) (true when
+evaluated inside of recursion or eval). Additionally the R may be
+followed by a number, (which will be true when evaluated when recursing
+inside of the appropriate group), or by C<&NAME>, in which case it will
+be true only when evaluated during recursion in the named group.
+
+Here's a summary of the possible predicates:
+
+=over 4
+
+=item (1) (2) ...
+
+Checks if the numbered capturing buffer has matched something.
+
+=item (<NAME>) ('NAME')
+
+Checks if a buffer with the given name has matched something.
+
+=item (?{ CODE })
+
+Treats the code block as the condition.
+
+=item (R)
+
+Checks if the expression has been evaluated inside of recursion.
+
+=item (R1) (R2) ...
+
+Checks if the expression has been evaluated while executing directly
+inside of the n-th capture group. This check is the regex equivalent of
+
+ if ((caller(0))[3] eq 'subname') { ... }
+
+In other words, it does not check the full recursion stack.
+
+=item (R&NAME)
+
+Similar to C<(R1)>, this predicate checks to see if we're executing
+directly inside of the leftmost group with a given name (this is the same
+logic used by C<(?&NAME)> to disambiguate). It does not check the full
+stack, but only the name of the innermost active recursion.
+
+=item (DEFINE)
+
+In this case, the yes-pattern is never directly executed, and no
+no-pattern is allowed. Similar in spirit to C<(?{0})> but more efficient.
+See below for details.
+
+=back
+
+For example:
+
+ m{ ( \( )?
+ [^()]+
+ (?(1) \) )
+ }x
+
+matches a chunk of non-parentheses, possibly included in parentheses
+themselves.
+
+A special form is the C<(DEFINE)> predicate, which never executes directly
+its yes-pattern, and does not allow a no-pattern. This allows to define
+subpatterns which will be executed only by using the recursion mechanism.
+This way, you can define a set of regular expression rules that can be
+bundled into any pattern you choose.
+
+It is recommended that for this usage you put the DEFINE block at the
+end of the pattern, and that you name any subpatterns defined within it.
+
+Also, it's worth noting that patterns defined this way probably will
+not be as efficient, as the optimiser is not very clever about
+handling them.
+
+An example of how this might be used is as follows:
+
+ /(?<NAME>(?&NAME_PAT))(?<ADDR>(?&ADDRESS_PAT))
+ (?(DEFINE)
+ (?<NAME_PAT>....)
+ (?<ADRESS_PAT>....)
+ )/x
+
+Note that capture buffers matched inside of recursion are not accessible
+after the recursion returns, so the extra layer of capturing buffers is
+necessary. Thus C<$+{NAME_PAT}> would not be defined even though
+C<$+{NAME}> would be.
+
+=item C<< (?>pattern) >>
+X<backtrack> X<backtracking> X<atomic> X<possessive>
+
+An "independent" subexpression, one which matches the substring
+that a I<standalone> C<pattern> would match if anchored at the given
+position, and it matches I<nothing other than this substring>. This
+construct is useful for optimizations of what would otherwise be
+"eternal" matches, because it will not backtrack (see L<"Backtracking">).
+It may also be useful in places where the "grab all you can, and do not
+give anything back" semantic is desirable.
+
+For example: C<< ^(?>a*)ab >> will never match, since C<< (?>a*) >>
+(anchored at the beginning of string, as above) will match I<all>
+characters C<a> at the beginning of string, leaving no C<a> for
+C<ab> to match. In contrast, C<a*ab> will match the same as C<a+b>,
+since the match of the subgroup C<a*> is influenced by the following
+group C<ab> (see L<"Backtracking">). In particular, C<a*> inside
+C<a*ab> will match fewer characters than a standalone C<a*>, since
+this makes the tail match.
+
+An effect similar to C<< (?>pattern) >> may be achieved by writing
+C<(?=(pattern))\1>. This matches the same substring as a standalone
+C<a+>, and the following C<\1> eats the matched string; it therefore
+makes a zero-length assertion into an analogue of C<< (?>...) >>.
+(The difference between these two constructs is that the second one
+uses a capturing group, thus shifting ordinals of backreferences
+in the rest of a regular expression.)
+
+Consider this pattern:
+
+ m{ \(
+ (
+ [^()]+ # x+
+ |
+ \( [^()]* \)
+ )+
+ \)
+ }x
+
+That will efficiently match a nonempty group with matching parentheses
+two levels deep or less. However, if there is no such group, it
+will take virtually forever on a long string. That's because there
+are so many different ways to split a long string into several
+substrings. This is what C<(.+)+> is doing, and C<(.+)+> is similar
+to a subpattern of the above pattern. Consider how the pattern
+above detects no-match on C<((()aaaaaaaaaaaaaaaaaa> in several
+seconds, but that each extra letter doubles this time. This
+exponential performance will make it appear that your program has
+hung. However, a tiny change to this pattern
+
+ m{ \(
+ (
+ (?> [^()]+ ) # change x+ above to (?> x+ )
+ |
+ \( [^()]* \)
+ )+
+ \)
+ }x
+
+which uses C<< (?>...) >> matches exactly when the one above does (verifying
+this yourself would be a productive exercise), but finishes in a fourth
+the time when used on a similar string with 1000000 C<a>s. Be aware,
+however, that this pattern currently triggers a warning message under
+the C<use warnings> pragma or B<-w> switch saying it
+C<"matches null string many times in regex">.
+
+On simple groups, such as the pattern C<< (?> [^()]+ ) >>, a comparable
+effect may be achieved by negative look-ahead, as in C<[^()]+ (?! [^()] )>.
+This was only 4 times slower on a string with 1000000 C<a>s.
+
+The "grab all you can, and do not give anything back" semantic is desirable
+in many situations where on the first sight a simple C<()*> looks like
+the correct solution. Suppose we parse text with comments being delimited
+by C<#> followed by some optional (horizontal) whitespace. Contrary to
+its appearance, C<#[ \t]*> I<is not> the correct subexpression to match
+the comment delimiter, because it may "give up" some whitespace if
+the remainder of the pattern can be made to match that way. The correct
+answer is either one of these:
+
+ (?>#[ \t]*)
+ #[ \t]*(?![ \t])
+
+For example, to grab non-empty comments into $1, one should use either
+one of these:
+
+ / (?> \# [ \t]* ) ( .+ ) /x;
+ / \# [ \t]* ( [^ \t] .* ) /x;
+
+Which one you pick depends on which of these expressions better reflects
+the above specification of comments.
+
+In some literature this construct is called "atomic matching" or
+"possessive matching".
+
+Possessive quantifiers are equivalent to putting the item they are applied
+to inside of one of these constructs. The following equivalences apply:
+
+ Quantifier Form Bracketing Form
+ --------------- ---------------
+ PAT*+ (?>PAT*)
+ PAT++ (?>PAT+)
+ PAT?+ (?>PAT?)
+ PAT{min,max}+ (?>PAT{min,max})
+
+=back
+
+=head2 Special Backtracking Control Verbs
+
+B<WARNING:> These patterns are experimental and subject to change or
+removal in a future version of Perl. Their usage in production code should
+be noted to avoid problems during upgrades.
+
+These special patterns are generally of the form C<(*VERB:ARG)>. Unless
+otherwise stated the ARG argument is optional; in some cases, it is
+forbidden.
+
+Any pattern containing a special backtracking verb that allows an argument
+has the special behaviour that when executed it sets the current packages'
+C<$REGERROR> and C<$REGMARK> variables. When doing so the following
+rules apply:
+
+On failure, the C<$REGERROR> variable will be set to the ARG value of the
+verb pattern, if the verb was involved in the failure of the match. If the
+ARG part of the pattern was omitted, then C<$REGERROR> will be set to the
+name of the last C<(*MARK:NAME)> pattern executed, or to TRUE if there was
+none. Also, the C<$REGMARK> variable will be set to FALSE.
+
+On a successful match, the C<$REGERROR> variable will be set to FALSE, and
+the C<$REGMARK> variable will be set to the name of the last
+C<(*MARK:NAME)> pattern executed. See the explanation for the
+C<(*MARK:NAME)> verb below for more details.
+
+B<NOTE:> C<$REGERROR> and C<$REGMARK> are not magic variables like C<$1>
+and most other regex related variables. They are not local to a scope, nor
+readonly, but instead are volatile package variables similar to C<$AUTOLOAD>.
+Use C<local> to localize changes to them to a specific scope if necessary.
+
+If a pattern does not contain a special backtracking verb that allows an
+argument, then C<$REGERROR> and C<$REGMARK> are not touched at all.
+
+=over 4
+
+=item Verbs that take an argument
+
+=over 4
+
+=item C<(*PRUNE)> C<(*PRUNE:NAME)>
+X<(*PRUNE)> X<(*PRUNE:NAME)>
+
+This zero-width pattern prunes the backtracking tree at the current point
+when backtracked into on failure. Consider the pattern C<A (*PRUNE) B>,
+where A and B are complex patterns. Until the C<(*PRUNE)> verb is reached,
+A may backtrack as necessary to match. Once it is reached, matching
+continues in B, which may also backtrack as necessary; however, should B
+not match, then no further backtracking will take place, and the pattern
+will fail outright at the current starting position.
+
+The following example counts all the possible matching strings in a
+pattern (without actually matching any of them).
+
+ 'aaab' =~ /a+b?(?{print "$&\n"; $count++})(*FAIL)/;
+ print "Count=$count\n";
+
+which produces:
+
+ aaab
+ aaa
+ aa
+ a
+ aab
+ aa
+ a
+ ab
+ a
+ Count=9
+
+If we add a C<(*PRUNE)> before the count like the following
+
+ 'aaab' =~ /a+b?(*PRUNE)(?{print "$&\n"; $count++})(*FAIL)/;
+ print "Count=$count\n";
+
+we prevent backtracking and find the count of the longest matching
+at each matching starting point like so:
+
+ aaab
+ aab
+ ab
+ Count=3
+
+Any number of C<(*PRUNE)> assertions may be used in a pattern.
+
+See also C<< (?>pattern) >> and possessive quantifiers for other ways to
+control backtracking. In some cases, the use of C<(*PRUNE)> can be
+replaced with a C<< (?>pattern) >> with no functional difference; however,
+C<(*PRUNE)> can be used to handle cases that cannot be expressed using a
+C<< (?>pattern) >> alone.
+
+
+=item C<(*SKIP)> C<(*SKIP:NAME)>
+X<(*SKIP)>
+
+This zero-width pattern is similar to C<(*PRUNE)>, except that on
+failure it also signifies that whatever text that was matched leading up
+to the C<(*SKIP)> pattern being executed cannot be part of I<any> match
+of this pattern. This effectively means that the regex engine "skips" forward
+to this position on failure and tries to match again, (assuming that
+there is sufficient room to match).
+
+The name of the C<(*SKIP:NAME)> pattern has special significance. If a
+C<(*MARK:NAME)> was encountered while matching, then it is that position
+which is used as the "skip point". If no C<(*MARK)> of that name was
+encountered, then the C<(*SKIP)> operator has no effect. When used
+without a name the "skip point" is where the match point was when
+executing the (*SKIP) pattern.
+
+Compare the following to the examples in C<(*PRUNE)>, note the string
+is twice as long:
+
+ 'aaabaaab' =~ /a+b?(*SKIP)(?{print "$&\n"; $count++})(*FAIL)/;
+ print "Count=$count\n";
+
+outputs
+
+ aaab
+ aaab
+ Count=2
+
+Once the 'aaab' at the start of the string has matched, and the C<(*SKIP)>
+executed, the next starting point will be where the cursor was when the
+C<(*SKIP)> was executed.
+
+=item C<(*MARK:NAME)> C<(*:NAME)>
+X<(*MARK)> C<(*MARK:NAME)> C<(*:NAME)>
+
+This zero-width pattern can be used to mark the point reached in a string
+when a certain part of the pattern has been successfully matched. This
+mark may be given a name. A later C<(*SKIP)> pattern will then skip
+forward to that point if backtracked into on failure. Any number of
+C<(*MARK)> patterns are allowed, and the NAME portion is optional and may
+be duplicated.
+
+In addition to interacting with the C<(*SKIP)> pattern, C<(*MARK:NAME)>
+can be used to "label" a pattern branch, so that after matching, the
+program can determine which branches of the pattern were involved in the
+match.
+
+When a match is successful, the C<$REGMARK> variable will be set to the
+name of the most recently executed C<(*MARK:NAME)> that was involved
+in the match.
+
+This can be used to determine which branch of a pattern was matched
+without using a separate capture buffer for each branch, which in turn
+can result in a performance improvement, as perl cannot optimize
+C</(?:(x)|(y)|(z))/> as efficiently as something like
+C</(?:x(*MARK:x)|y(*MARK:y)|z(*MARK:z))/>.
+
+When a match has failed, and unless another verb has been involved in
+failing the match and has provided its own name to use, the C<$REGERROR>
+variable will be set to the name of the most recently executed
+C<(*MARK:NAME)>.
+
+See C<(*SKIP)> for more details.
+
+As a shortcut C<(*MARK:NAME)> can be written C<(*:NAME)>.
+
+=item C<(*THEN)> C<(*THEN:NAME)>
+
+This is similar to the "cut group" operator C<::> from Perl 6. Like
+C<(*PRUNE)>, this verb always matches, and when backtracked into on
+failure, it causes the regex engine to try the next alternation in the
+innermost enclosing group (capturing or otherwise).
+
+Its name comes from the observation that this operation combined with the
+alternation operator (C<|>) can be used to create what is essentially a
+pattern-based if/then/else block:
+
+ ( COND (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ )
+
+Note that if this operator is used and NOT inside of an alternation then
+it acts exactly like the C<(*PRUNE)> operator.
+
+ / A (*PRUNE) B /
+
+is the same as
+
+ / A (*THEN) B /
+
+but
+
+ / ( A (*THEN) B | C (*THEN) D ) /
+
+is not the same as
+
+ / ( A (*PRUNE) B | C (*PRUNE) D ) /
+
+as after matching the A but failing on the B the C<(*THEN)> verb will
+backtrack and try C; but the C<(*PRUNE)> verb will simply fail.
+
+=item C<(*COMMIT)>
+X<(*COMMIT)>
+
+This is the Perl 6 "commit pattern" C<< <commit> >> or C<:::>. It's a
+zero-width pattern similar to C<(*SKIP)>, except that when backtracked
+into on failure it causes the match to fail outright. No further attempts
+to find a valid match by advancing the start pointer will occur again.
+For example,
+
+ 'aaabaaab' =~ /a+b?(*COMMIT)(?{print "$&\n"; $count++})(*FAIL)/;
+ print "Count=$count\n";
+
+outputs
+
+ aaab
+ Count=1
+
+In other words, once the C<(*COMMIT)> has been entered, and if the pattern
+does not match, the regex engine will not try any further matching on the
+rest of the string.
+
+=back
+
+=item Verbs without an argument
+
+=over 4
+
+=item C<(*FAIL)> C<(*F)>
+X<(*FAIL)> X<(*F)>
+
+This pattern matches nothing and always fails. It can be used to force the
+engine to backtrack. It is equivalent to C<(?!)>, but easier to read. In
+fact, C<(?!)> gets optimised into C<(*FAIL)> internally.
+
+It is probably useful only when combined with C<(?{})> or C<(??{})>.
+
+=item C<(*ACCEPT)>
+X<(*ACCEPT)>
+
+B<WARNING:> This feature is highly experimental. It is not recommended
+for production code.
+
+This pattern matches nothing and causes the end of successful matching at
+the point at which the C<(*ACCEPT)> pattern was encountered, regardless of
+whether there is actually more to match in the string. When inside of a
+nested pattern, such as recursion, or in a subpattern dynamically generated
+via C<(??{})>, only the innermost pattern is ended immediately.
+
+If the C<(*ACCEPT)> is inside of capturing buffers then the buffers are
+marked as ended at the point at which the C<(*ACCEPT)> was encountered.
+For instance:
+
+ 'AB' =~ /(A (A|B(*ACCEPT)|C) D)(E)/x;
+
+will match, and C<$1> will be C<AB> and C<$2> will be C<B>, C<$3> will not
+be set. If another branch in the inner parentheses were matched, such as in the
+string 'ACDE', then the C<D> and C<E> would have to be matched as well.
+
+=back
+
+=back
+
+=head2 Backtracking
+X<backtrack> X<backtracking>
+
+NOTE: This section presents an abstract approximation of regular
+expression behavior. For a more rigorous (and complicated) view of
+the rules involved in selecting a match among possible alternatives,
+see L<Combining RE Pieces>.
+
+A fundamental feature of regular expression matching involves the
+notion called I<backtracking>, which is currently used (when needed)
+by all regular non-possessive expression quantifiers, namely C<*>, C<*?>, C<+>,
+C<+?>, C<{n,m}>, and C<{n,m}?>. Backtracking is often optimized
+internally, but the general principle outlined here is valid.
+
+For a regular expression to match, the I<entire> regular expression must
+match, not just part of it. So if the beginning of a pattern containing a
+quantifier succeeds in a way that causes later parts in the pattern to
+fail, the matching engine backs up and recalculates the beginning
+part--that's why it's called backtracking.
+
+Here is an example of backtracking: Let's say you want to find the
+word following "foo" in the string "Food is on the foo table.":
+
+ $_ = "Food is on the foo table.";
+ if ( /\b(foo)\s+(\w+)/i ) {
+ print "$2 follows $1.\n";
+ }
+
+When the match runs, the first part of the regular expression (C<\b(foo)>)
+finds a possible match right at the beginning of the string, and loads up
+$1 with "Foo". However, as soon as the matching engine sees that there's
+no whitespace following the "Foo" that it had saved in $1, it realizes its
+mistake and starts over again one character after where it had the
+tentative match. This time it goes all the way until the next occurrence
+of "foo". The complete regular expression matches this time, and you get
+the expected output of "table follows foo."
+
+Sometimes minimal matching can help a lot. Imagine you'd like to match
+everything between "foo" and "bar". Initially, you write something
+like this:
+
+ $_ = "The food is under the bar in the barn.";
+ if ( /foo(.*)bar/ ) {
+ print "got <$1>\n";
+ }
+
+Which perhaps unexpectedly yields:
+
+ got <d is under the bar in the >
+
+That's because C<.*> was greedy, so you get everything between the
+I<first> "foo" and the I<last> "bar". Here it's more effective
+to use minimal matching to make sure you get the text between a "foo"
+and the first "bar" thereafter.
+
+ if ( /foo(.*?)bar/ ) { print "got <$1>\n" }
+ got <d is under the >
+
+Here's another example. Let's say you'd like to match a number at the end
+of a string, and you also want to keep the preceding part of the match.
+So you write this:
+
+ $_ = "I have 2 numbers: 53147";
+ if ( /(.*)(\d*)/ ) { # Wrong!
+ print "Beginning is <$1>, number is <$2>.\n";
+ }
+
+That won't work at all, because C<.*> was greedy and gobbled up the
+whole string. As C<\d*> can match on an empty string the complete
+regular expression matched successfully.
+
+ Beginning is <I have 2 numbers: 53147>, number is <>.
+
+Here are some variants, most of which don't work:
+
+ $_ = "I have 2 numbers: 53147";
+ @pats = qw{
+ (.*)(\d*)
+ (.*)(\d+)
+ (.*?)(\d*)
+ (.*?)(\d+)
+ (.*)(\d+)$
+ (.*?)(\d+)$
+ (.*)\b(\d+)$
+ (.*\D)(\d+)$
+ };
+
+ for $pat (@pats) {
+ printf "%-12s ", $pat;
+ if ( /$pat/ ) {
+ print "<$1> <$2>\n";
+ } else {
+ print "FAIL\n";
+ }
+ }
+
+That will print out:
+
+ (.*)(\d*) <I have 2 numbers: 53147> <>
+ (.*)(\d+) <I have 2 numbers: 5314> <7>
+ (.*?)(\d*) <> <>
+ (.*?)(\d+) <I have > <2>
+ (.*)(\d+)$ <I have 2 numbers: 5314> <7>
+ (.*?)(\d+)$ <I have 2 numbers: > <53147>
+ (.*)\b(\d+)$ <I have 2 numbers: > <53147>
+ (.*\D)(\d+)$ <I have 2 numbers: > <53147>
+
+As you see, this can be a bit tricky. It's important to realize that a
+regular expression is merely a set of assertions that gives a definition
+of success. There may be 0, 1, or several different ways that the
+definition might succeed against a particular string. And if there are
+multiple ways it might succeed, you need to understand backtracking to
+know which variety of success you will achieve.
+
+When using look-ahead assertions and negations, this can all get even
+trickier. Imagine you'd like to find a sequence of non-digits not
+followed by "123". You might try to write that as
+
+ $_ = "ABC123";
+ if ( /^\D*(?!123)/ ) { # Wrong!
+ print "Yup, no 123 in $_\n";
+ }
+
+But that isn't going to match; at least, not the way you're hoping. It
+claims that there is no 123 in the string. Here's a clearer picture of
+why that pattern matches, contrary to popular expectations:
+
+ $x = 'ABC123';
+ $y = 'ABC445';
+
+ print "1: got $1\n" if $x =~ /^(ABC)(?!123)/;
+ print "2: got $1\n" if $y =~ /^(ABC)(?!123)/;
+
+ print "3: got $1\n" if $x =~ /^(\D*)(?!123)/;
+ print "4: got $1\n" if $y =~ /^(\D*)(?!123)/;
+
+This prints
+
+ 2: got ABC
+ 3: got AB
+ 4: got ABC
+
+You might have expected test 3 to fail because it seems to a more
+general purpose version of test 1. The important difference between
+them is that test 3 contains a quantifier (C<\D*>) and so can use
+backtracking, whereas test 1 will not. What's happening is
+that you've asked "Is it true that at the start of $x, following 0 or more
+non-digits, you have something that's not 123?" If the pattern matcher had
+let C<\D*> expand to "ABC", this would have caused the whole pattern to
+fail.
+
+The search engine will initially match C<\D*> with "ABC". Then it will
+try to match C<(?!123> with "123", which fails. But because
+a quantifier (C<\D*>) has been used in the regular expression, the
+search engine can backtrack and retry the match differently
+in the hope of matching the complete regular expression.
+
+The pattern really, I<really> wants to succeed, so it uses the
+standard pattern back-off-and-retry and lets C<\D*> expand to just "AB" this
+time. Now there's indeed something following "AB" that is not
+"123". It's "C123", which suffices.
+
+We can deal with this by using both an assertion and a negation.
+We'll say that the first part in $1 must be followed both by a digit
+and by something that's not "123". Remember that the look-aheads
+are zero-width expressions--they only look, but don't consume any
+of the string in their match. So rewriting this way produces what
+you'd expect; that is, case 5 will fail, but case 6 succeeds:
+
+ print "5: got $1\n" if $x =~ /^(\D*)(?=\d)(?!123)/;
+ print "6: got $1\n" if $y =~ /^(\D*)(?=\d)(?!123)/;
+
+ 6: got ABC
+
+In other words, the two zero-width assertions next to each other work as though
+they're ANDed together, just as you'd use any built-in assertions: C</^$/>
+matches only if you're at the beginning of the line AND the end of the
+line simultaneously. The deeper underlying truth is that juxtaposition in
+regular expressions always means AND, except when you write an explicit OR
+using the vertical bar. C</ab/> means match "a" AND (then) match "b",
+although the attempted matches are made at different positions because "a"
+is not a zero-width assertion, but a one-width assertion.
+
+B<WARNING>: Particularly complicated regular expressions can take
+exponential time to solve because of the immense number of possible
+ways they can use backtracking to try for a match. For example, without
+internal optimizations done by the regular expression engine, this will
+take a painfully long time to run:
+
+ 'aaaaaaaaaaaa' =~ /((a{0,5}){0,5})*[c]/
+
+And if you used C<*>'s in the internal groups instead of limiting them
+to 0 through 5 matches, then it would take forever--or until you ran
+out of stack space. Moreover, these internal optimizations are not
+always applicable. For example, if you put C<{0,5}> instead of C<*>
+on the external group, no current optimization is applicable, and the
+match takes a long time to finish.
+
+A powerful tool for optimizing such beasts is what is known as an
+"independent group",
+which does not backtrack (see L<C<< (?>pattern) >>>). Note also that
+zero-length look-ahead/look-behind assertions will not backtrack to make
+the tail match, since they are in "logical" context: only
+whether they match is considered relevant. For an example
+where side-effects of look-ahead I<might> have influenced the
+following match, see L<C<< (?>pattern) >>>.
+
+=head2 Version 8 Regular Expressions
+X<regular expression, version 8> X<regex, version 8> X<regexp, version 8>
+
+In case you're not familiar with the "regular" Version 8 regex
+routines, here are the pattern-matching rules not described above.
+
+Any single character matches itself, unless it is a I<metacharacter>
+with a special meaning described here or above. You can cause
+characters that normally function as metacharacters to be interpreted
+literally by prefixing them with a "\" (e.g., "\." matches a ".", not any
+character; "\\" matches a "\"). This escape mechanism is also required
+for the character used as the pattern delimiter.
+
+A series of characters matches that series of characters in the target
+string, so the pattern C<blurfl> would match "blurfl" in the target
+string.
+
+You can specify a character class, by enclosing a list of characters
+in C<[]>, which will match any character from the list. If the
+first character after the "[" is "^", the class matches any character not
+in the list. Within a list, the "-" character specifies a
+range, so that C<a-z> represents all characters between "a" and "z",
+inclusive. If you want either "-" or "]" itself to be a member of a
+class, put it at the start of the list (possibly after a "^"), or
+escape it with a backslash. "-" is also taken literally when it is
+at the end of the list, just before the closing "]". (The
+following all specify the same class of three characters: C<[-az]>,
+C<[az-]>, and C<[a\-z]>. All are different from C<[a-z]>, which
+specifies a class containing twenty-six characters, even on EBCDIC-based
+character sets.) Also, if you try to use the character
+classes C<\w>, C<\W>, C<\s>, C<\S>, C<\d>, or C<\D> as endpoints of
+a range, the "-" is understood literally.
+
+Note also that the whole range idea is rather unportable between
+character sets--and even within character sets they may cause results
+you probably didn't expect. A sound principle is to use only ranges
+that begin from and end at either alphabetics of equal case ([a-e],
+[A-E]), or digits ([0-9]). Anything else is unsafe. If in doubt,
+spell out the character sets in full.
+
+Characters may be specified using a metacharacter syntax much like that
+used in C: "\n" matches a newline, "\t" a tab, "\r" a carriage return,
+"\f" a form feed, etc. More generally, \I<nnn>, where I<nnn> is a string
+of octal digits, matches the character whose coded character set value
+is I<nnn>. Similarly, \xI<nn>, where I<nn> are hexadecimal digits,
+matches the character whose numeric value is I<nn>. The expression \cI<x>
+matches the character control-I<x>. Finally, the "." metacharacter
+matches any character except "\n" (unless you use C</s>).
+
+You can specify a series of alternatives for a pattern using "|" to
+separate them, so that C<fee|fie|foe> will match any of "fee", "fie",
+or "foe" in the target string (as would C<f(e|i|o)e>). The
+first alternative includes everything from the last pattern delimiter
+("(", "[", or the beginning of the pattern) up to the first "|", and
+the last alternative contains everything from the last "|" to the next
+pattern delimiter. That's why it's common practice to include
+alternatives in parentheses: to minimize confusion about where they
+start and end.
+
+Alternatives are tried from left to right, so the first
+alternative found for which the entire expression matches, is the one that
+is chosen. This means that alternatives are not necessarily greedy. For
+example: when matching C<foo|foot> against "barefoot", only the "foo"
+part will match, as that is the first alternative tried, and it successfully
+matches the target string. (This might not seem important, but it is
+important when you are capturing matched text using parentheses.)
+
+Also remember that "|" is interpreted as a literal within square brackets,
+so if you write C<[fee|fie|foe]> you're really only matching C<[feio|]>.
+
+Within a pattern, you may designate subpatterns for later reference
+by enclosing them in parentheses, and you may refer back to the
+I<n>th subpattern later in the pattern using the metacharacter
+\I<n>. Subpatterns are numbered based on the left to right order
+of their opening parenthesis. A backreference matches whatever
+actually matched the subpattern in the string being examined, not
+the rules for that subpattern. Therefore, C<(0|0x)\d*\s\1\d*> will
+match "0x1234 0x4321", but not "0x1234 01234", because subpattern
+1 matched "0x", even though the rule C<0|0x> could potentially match
+the leading 0 in the second number.
+
+=head2 Warning on \1 Instead of $1
+
+Some people get too used to writing things like:
+
+ $pattern =~ s/(\W)/\\\1/g;
+
+This is grandfathered for the RHS of a substitute to avoid shocking the
+B<sed> addicts, but it's a dirty habit to get into. That's because in
+PerlThink, the righthand side of an C<s///> is a double-quoted string. C<\1> in
+the usual double-quoted string means a control-A. The customary Unix
+meaning of C<\1> is kludged in for C<s///>. However, if you get into the habit
+of doing that, you get yourself into trouble if you then add an C</e>
+modifier.
+
+ s/(\d+)/ \1 + 1 /eg; # causes warning under -w
+
+Or if you try to do
+
+ s/(\d+)/\1000/;
+
+You can't disambiguate that by saying C<\{1}000>, whereas you can fix it with
+C<${1}000>. The operation of interpolation should not be confused
+with the operation of matching a backreference. Certainly they mean two
+different things on the I<left> side of the C<s///>.
+
+=head2 Repeated Patterns Matching a Zero-length Substring
+
+B<WARNING>: Difficult material (and prose) ahead. This section needs a rewrite.
+
+Regular expressions provide a terse and powerful programming language. As
+with most other power tools, power comes together with the ability
+to wreak havoc.
+
+A common abuse of this power stems from the ability to make infinite
+loops using regular expressions, with something as innocuous as:
+
+ 'foo' =~ m{ ( o? )* }x;
+
+The C<o?> matches at the beginning of C<'foo'>, and since the position
+in the string is not moved by the match, C<o?> would match again and again
+because of the C<*> quantifier. Another common way to create a similar cycle
+is with the looping modifier C<//g>:
+
+ @matches = ( 'foo' =~ m{ o? }xg );
+
+or
+
+ print "match: <$&>\n" while 'foo' =~ m{ o? }xg;
+
+or the loop implied by split().
+
+However, long experience has shown that many programming tasks may
+be significantly simplified by using repeated subexpressions that
+may match zero-length substrings. Here's a simple example being:
+
+ @chars = split //, $string; # // is not magic in split
+ ($whitewashed = $string) =~ s/()/ /g; # parens avoid magic s// /
+
+Thus Perl allows such constructs, by I<forcefully breaking
+the infinite loop>. The rules for this are different for lower-level
+loops given by the greedy quantifiers C<*+{}>, and for higher-level
+ones like the C</g> modifier or split() operator.
+
+The lower-level loops are I<interrupted> (that is, the loop is
+broken) when Perl detects that a repeated expression matched a
+zero-length substring. Thus
+
+ m{ (?: NON_ZERO_LENGTH | ZERO_LENGTH )* }x;
+
+is made equivalent to
+
+ m{ (?: NON_ZERO_LENGTH )*
+ |
+ (?: ZERO_LENGTH )?
+ }x;
+
+The higher level-loops preserve an additional state between iterations:
+whether the last match was zero-length. To break the loop, the following
+match after a zero-length match is prohibited to have a length of zero.
+This prohibition interacts with backtracking (see L<"Backtracking">),
+and so the I<second best> match is chosen if the I<best> match is of
+zero length.
+
+For example:
+
+ $_ = 'bar';
+ s/\w??/<$&>/g;
+
+results in C<< <><b><><a><><r><> >>. At each position of the string the best
+match given by non-greedy C<??> is the zero-length match, and the I<second
+best> match is what is matched by C<\w>. Thus zero-length matches
+alternate with one-character-long matches.
+
+Similarly, for repeated C<m/()/g> the second-best match is the match at the
+position one notch further in the string.
+
+The additional state of being I<matched with zero-length> is associated with
+the matched string, and is reset by each assignment to pos().
+Zero-length matches at the end of the previous match are ignored
+during C<split>.
+
+=head2 Combining RE Pieces
+
+Each of the elementary pieces of regular expressions which were described
+before (such as C<ab> or C<\Z>) could match at most one substring
+at the given position of the input string. However, in a typical regular
+expression these elementary pieces are combined into more complicated
+patterns using combining operators C<ST>, C<S|T>, C<S*> etc
+(in these examples C<S> and C<T> are regular subexpressions).
+
+Such combinations can include alternatives, leading to a problem of choice:
+if we match a regular expression C<a|ab> against C<"abc">, will it match
+substring C<"a"> or C<"ab">? One way to describe which substring is
+actually matched is the concept of backtracking (see L<"Backtracking">).
+However, this description is too low-level and makes you think
+in terms of a particular implementation.
+
+Another description starts with notions of "better"/"worse". All the
+substrings which may be matched by the given regular expression can be
+sorted from the "best" match to the "worst" match, and it is the "best"
+match which is chosen. This substitutes the question of "what is chosen?"
+by the question of "which matches are better, and which are worse?".
+
+Again, for elementary pieces there is no such question, since at most
+one match at a given position is possible. This section describes the
+notion of better/worse for combining operators. In the description
+below C<S> and C<T> are regular subexpressions.
+
+=over 4
+
+=item C<ST>
+
+Consider two possible matches, C<AB> and C<A'B'>, C<A> and C<A'> are
+substrings which can be matched by C<S>, C<B> and C<B'> are substrings
+which can be matched by C<T>.
+
+If C<A> is better match for C<S> than C<A'>, C<AB> is a better
+match than C<A'B'>.
+
+If C<A> and C<A'> coincide: C<AB> is a better match than C<AB'> if
+C<B> is better match for C<T> than C<B'>.
+
+=item C<S|T>
+
+When C<S> can match, it is a better match than when only C<T> can match.
+
+Ordering of two matches for C<S> is the same as for C<S>. Similar for
+two matches for C<T>.
+
+=item C<S{REPEAT_COUNT}>
+
+Matches as C<SSS...S> (repeated as many times as necessary).
+
+=item C<S{min,max}>
+
+Matches as C<S{max}|S{max-1}|...|S{min+1}|S{min}>.
+
+=item C<S{min,max}?>
+
+Matches as C<S{min}|S{min+1}|...|S{max-1}|S{max}>.
+
+=item C<S?>, C<S*>, C<S+>
+
+Same as C<S{0,1}>, C<S{0,BIG_NUMBER}>, C<S{1,BIG_NUMBER}> respectively.
+
+=item C<S??>, C<S*?>, C<S+?>
+
+Same as C<S{0,1}?>, C<S{0,BIG_NUMBER}?>, C<S{1,BIG_NUMBER}?> respectively.
+
+=item C<< (?>S) >>
+
+Matches the best match for C<S> and only that.
+
+=item C<(?=S)>, C<(?<=S)>
+
+Only the best match for C<S> is considered. (This is important only if
+C<S> has capturing parentheses, and backreferences are used somewhere
+else in the whole regular expression.)
+
+=item C<(?!S)>, C<(?<!S)>
+
+For this grouping operator there is no need to describe the ordering, since
+only whether or not C<S> can match is important.
+
+=item C<(??{ EXPR })>, C<(?PARNO)>
+
+The ordering is the same as for the regular expression which is
+the result of EXPR, or the pattern contained by capture buffer PARNO.
+
+=item C<(?(condition)yes-pattern|no-pattern)>
+
+Recall that which of C<yes-pattern> or C<no-pattern> actually matches is
+already determined. The ordering of the matches is the same as for the
+chosen subexpression.
+
+=back
+
+The above recipes describe the ordering of matches I<at a given position>.
+One more rule is needed to understand how a match is determined for the
+whole regular expression: a match at an earlier position is always better
+than a match at a later position.
+
+=head2 Creating Custom RE Engines
+
+Overloaded constants (see L<overload>) provide a simple way to extend
+the functionality of the RE engine.
+
+Suppose that we want to enable a new RE escape-sequence C<\Y|> which
+matches at a boundary between whitespace characters and non-whitespace
+characters. Note that C<(?=\S)(?<!\S)|(?!\S)(?<=\S)> matches exactly
+at these positions, so we want to have each C<\Y|> in the place of the
+more complicated version. We can create a module C<customre> to do
+this:
+
+ package customre;
+ use overload;
+
+ sub import {
+ shift;
+ die "No argument to customre::import allowed" if @_;
+ overload::constant 'qr' => \&convert;
+ }
+
+ sub invalid { die "/$_[0]/: invalid escape '\\$_[1]'"}
+
+ # We must also take care of not escaping the legitimate \\Y|
+ # sequence, hence the presence of '\\' in the conversion rules.
+ my %rules = ( '\\' => '\\\\',
+ 'Y|' => qr/(?=\S)(?<!\S)|(?!\S)(?<=\S)/ );
+ sub convert {
+ my $re = shift;
+ $re =~ s{
+ \\ ( \\ | Y . )
+ }
+ { $rules{$1} or invalid($re,$1) }sgex;
+ return $re;
+ }
+
+Now C<use customre> enables the new escape in constant regular
+expressions, i.e., those without any runtime variable interpolations.
+As documented in L<overload>, this conversion will work only over
+literal parts of regular expressions. For C<\Y|$re\Y|> the variable
+part of this regular expression needs to be converted explicitly
+(but only if the special meaning of C<\Y|> should be enabled inside $re):
+
+ use customre;
+ $re = <>;
+ chomp $re;
+ $re = customre::convert $re;
+ /\Y|$re\Y|/;
+
+=head1 PCRE/Python Support
+
+As of Perl 5.10.0, Perl supports several Python/PCRE specific extensions
+to the regex syntax. While Perl programmers are encouraged to use the
+Perl specific syntax, the following are also accepted:
+
+=over 4
+
+=item C<< (?PE<lt>NAMEE<gt>pattern) >>
+
+Define a named capture buffer. Equivalent to C<< (?<NAME>pattern) >>.
+
+=item C<< (?P=NAME) >>
+
+Backreference to a named capture buffer. Equivalent to C<< \g{NAME} >>.
+
+=item C<< (?P>NAME) >>
+
+Subroutine call to a named capture buffer. Equivalent to C<< (?&NAME) >>.
+
+=back
+
+=head1 BUGS
+
+This document varies from difficult to understand to completely
+and utterly opaque. The wandering prose riddled with jargon is
+hard to fathom in several places.
+
+This document needs a rewrite that separates the tutorial content
+from the reference content.
+
+=head1 SEE ALSO
+
+L<perlrequick>.
+
+L<perlretut>.
+
+L<perlop/"Regexp Quote-Like Operators">.
+
+L<perlop/"Gory details of parsing quoted constructs">.
+
+L<perlfaq6>.
+
+L<perlfunc/pos>.
+
+L<perllocale>.
+
+L<perlebcdic>.
+
+I<Mastering Regular Expressions> by Jeffrey Friedl, published
+by O'Reilly and Associates.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlreapi.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlreapi.pod
new file mode 100755
index 00000000000..b0d6275810d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlreapi.pod
@@ -0,0 +1,699 @@
+=head1 NAME
+
+perlreapi - perl regular expression plugin interface
+
+=head1 DESCRIPTION
+
+As of Perl 5.9.5 there is a new interface for plugging and using other
+regular expression engines than the default one.
+
+Each engine is supposed to provide access to a constant structure of the
+following format:
+
+ typedef struct regexp_engine {
+ REGEXP* (*comp) (pTHX_ const SV * const pattern, const U32 flags);
+ I32 (*exec) (pTHX_ REGEXP * const rx, char* stringarg, char* strend,
+ char* strbeg, I32 minend, SV* screamer,
+ void* data, U32 flags);
+ char* (*intuit) (pTHX_ REGEXP * const rx, SV *sv, char *strpos,
+ char *strend, U32 flags,
+ struct re_scream_pos_data_s *data);
+ SV* (*checkstr) (pTHX_ REGEXP * const rx);
+ void (*free) (pTHX_ REGEXP * const rx);
+ void (*numbered_buff_FETCH) (pTHX_ REGEXP * const rx, const I32 paren,
+ SV * const sv);
+ void (*numbered_buff_STORE) (pTHX_ REGEXP * const rx, const I32 paren,
+ SV const * const value);
+ I32 (*numbered_buff_LENGTH) (pTHX_ REGEXP * const rx, const SV * const sv,
+ const I32 paren);
+ SV* (*named_buff) (pTHX_ REGEXP * const rx, SV * const key,
+ SV * const value, U32 flags);
+ SV* (*named_buff_iter) (pTHX_ REGEXP * const rx, const SV * const lastkey,
+ const U32 flags);
+ SV* (*qr_package)(pTHX_ REGEXP * const rx);
+ #ifdef USE_ITHREADS
+ void* (*dupe) (pTHX_ REGEXP * const rx, CLONE_PARAMS *param);
+ #endif
+
+When a regexp is compiled, its C<engine> field is then set to point at
+the appropriate structure, so that when it needs to be used Perl can find
+the right routines to do so.
+
+In order to install a new regexp handler, C<$^H{regcomp}> is set
+to an integer which (when casted appropriately) resolves to one of these
+structures. When compiling, the C<comp> method is executed, and the
+resulting regexp structure's engine field is expected to point back at
+the same structure.
+
+The pTHX_ symbol in the definition is a macro used by perl under threading
+to provide an extra argument to the routine holding a pointer back to
+the interpreter that is executing the regexp. So under threading all
+routines get an extra argument.
+
+=head1 Callbacks
+
+=head2 comp
+
+ REGEXP* comp(pTHX_ const SV * const pattern, const U32 flags);
+
+Compile the pattern stored in C<pattern> using the given C<flags> and
+return a pointer to a prepared C<REGEXP> structure that can perform
+the match. See L</The REGEXP structure> below for an explanation of
+the individual fields in the REGEXP struct.
+
+The C<pattern> parameter is the scalar that was used as the
+pattern. previous versions of perl would pass two C<char*> indicating
+the start and end of the stringified pattern, the following snippet can
+be used to get the old parameters:
+
+ STRLEN plen;
+ char* exp = SvPV(pattern, plen);
+ char* xend = exp + plen;
+
+Since any scalar can be passed as a pattern it's possible to implement
+an engine that does something with an array (C<< "ook" =~ [ qw/ eek
+hlagh / ] >>) or with the non-stringified form of a compiled regular
+expression (C<< "ook" =~ qr/eek/ >>). perl's own engine will always
+stringify everything using the snippet above but that doesn't mean
+other engines have to.
+
+The C<flags> parameter is a bitfield which indicates which of the
+C<msixp> flags the regex was compiled with. It also contains
+additional info such as whether C<use locale> is in effect.
+
+The C<eogc> flags are stripped out before being passed to the comp
+routine. The regex engine does not need to know whether any of these
+are set as those flags should only affect what perl does with the
+pattern and its match variables, not how it gets compiled and
+executed.
+
+By the time the comp callback is called, some of these flags have
+already had effect (noted below where applicable). However most of
+their effect occurs after the comp callback has run in routines that
+read the C<< rx->extflags >> field which it populates.
+
+In general the flags should be preserved in C<< rx->extflags >> after
+compilation, although the regex engine might want to add or delete
+some of them to invoke or disable some special behavior in perl. The
+flags along with any special behavior they cause are documented below:
+
+The pattern modifiers:
+
+=over 4
+
+=item C</m> - RXf_PMf_MULTILINE
+
+If this is in C<< rx->extflags >> it will be passed to
+C<Perl_fbm_instr> by C<pp_split> which will treat the subject string
+as a multi-line string.
+
+=item C</s> - RXf_PMf_SINGLELINE
+
+=item C</i> - RXf_PMf_FOLD
+
+=item C</x> - RXf_PMf_EXTENDED
+
+If present on a regex C<#> comments will be handled differently by the
+tokenizer in some cases.
+
+TODO: Document those cases.
+
+=item C</p> - RXf_PMf_KEEPCOPY
+
+=back
+
+Additional flags:
+
+=over 4
+
+=item RXf_PMf_LOCALE
+
+Set if C<use locale> is in effect. If present in C<< rx->extflags >>
+C<split> will use the locale dependent definition of whitespace under
+when RXf_SKIPWHITE or RXf_WHITE are in effect. Under ASCII whitespace
+is defined as per L<isSPACE|perlapi/ISSPACE>, and by the internal
+macros C<is_utf8_space> under UTF-8 and C<isSPACE_LC> under C<use
+locale>.
+
+=item RXf_UTF8
+
+Set if the pattern is L<SvUTF8()|perlapi/SvUTF8>, set by Perl_pmruntime.
+
+A regex engine may want to set or disable this flag during
+compilation. The perl engine for instance may upgrade non-UTF-8
+strings to UTF-8 if the pattern includes constructs such as C<\x{...}>
+that can only match Unicode values.
+
+=item RXf_SPLIT
+
+If C<split> is invoked as C<split ' '> or with no arguments (which
+really means C<split(' ', $_)>, see L<split|perlfunc/split>), perl will
+set this flag. The regex engine can then check for it and set the
+SKIPWHITE and WHITE extflags. To do this the perl engine does:
+
+ if (flags & RXf_SPLIT && r->prelen == 1 && r->precomp[0] == ' ')
+ r->extflags |= (RXf_SKIPWHITE|RXf_WHITE);
+
+=back
+
+These flags can be set during compilation to enable optimizations in
+the C<split> operator.
+
+=over 4
+
+=item RXf_SKIPWHITE
+
+If the flag is present in C<< rx->extflags >> C<split> will delete
+whitespace from the start of the subject string before it's operated
+on. What is considered whitespace depends on whether the subject is a
+UTF-8 string and whether the C<RXf_PMf_LOCALE> flag is set.
+
+If RXf_WHITE is set in addition to this flag C<split> will behave like
+C<split " "> under the perl engine.
+
+=item RXf_START_ONLY
+
+Tells the split operator to split the target string on newlines
+(C<\n>) without invoking the regex engine.
+
+Perl's engine sets this if the pattern is C</^/> (C<plen == 1 && *exp
+== '^'>), even under C</^/s>, see L<split|perlfunc>. Of course a
+different regex engine might want to use the same optimizations
+with a different syntax.
+
+=item RXf_WHITE
+
+Tells the split operator to split the target string on whitespace
+without invoking the regex engine. The definition of whitespace varies
+depending on whether the target string is a UTF-8 string and on
+whether RXf_PMf_LOCALE is set.
+
+Perl's engine sets this flag if the pattern is C<\s+>.
+
+=item RXf_NULL
+
+Tells the split operator to split the target string on
+characters. The definition of character varies depending on whether
+the target string is a UTF-8 string.
+
+Perl's engine sets this flag on empty patterns, this optimization
+makes C<split //> much faster than it would otherwise be. It's even
+faster than C<unpack>.
+
+=back
+
+=head2 exec
+
+ I32 exec(pTHX_ REGEXP * const rx,
+ char *stringarg, char* strend, char* strbeg,
+ I32 minend, SV* screamer,
+ void* data, U32 flags);
+
+Execute a regexp.
+
+=head2 intuit
+
+ char* intuit(pTHX_ REGEXP * const rx,
+ SV *sv, char *strpos, char *strend,
+ const U32 flags, struct re_scream_pos_data_s *data);
+
+Find the start position where a regex match should be attempted,
+or possibly whether the regex engine should not be run because the
+pattern can't match. This is called as appropriate by the core
+depending on the values of the extflags member of the regexp
+structure.
+
+=head2 checkstr
+
+ SV* checkstr(pTHX_ REGEXP * const rx);
+
+Return a SV containing a string that must appear in the pattern. Used
+by C<split> for optimising matches.
+
+=head2 free
+
+ void free(pTHX_ REGEXP * const rx);
+
+Called by perl when it is freeing a regexp pattern so that the engine
+can release any resources pointed to by the C<pprivate> member of the
+regexp structure. This is only responsible for freeing private data;
+perl will handle releasing anything else contained in the regexp structure.
+
+=head2 Numbered capture callbacks
+
+Called to get/set the value of C<$`>, C<$'>, C<$&> and their named
+equivalents, ${^PREMATCH}, ${^POSTMATCH} and $^{MATCH}, as well as the
+numbered capture buffers (C<$1>, C<$2>, ...).
+
+The C<paren> parameter will be C<-2> for C<$`>, C<-1> for C<$'>, C<0>
+for C<$&>, C<1> for C<$1> and so forth.
+
+The names have been chosen by analogy with L<Tie::Scalar> methods
+names with an additional B<LENGTH> callback for efficiency. However
+named capture variables are currently not tied internally but
+implemented via magic.
+
+=head3 numbered_buff_FETCH
+
+ void numbered_buff_FETCH(pTHX_ REGEXP * const rx, const I32 paren,
+ SV * const sv);
+
+Fetch a specified numbered capture. C<sv> should be set to the scalar
+to return, the scalar is passed as an argument rather than being
+returned from the function because when it's called perl already has a
+scalar to store the value, creating another one would be
+redundant. The scalar can be set with C<sv_setsv>, C<sv_setpvn> and
+friends, see L<perlapi>.
+
+This callback is where perl untaints its own capture variables under
+taint mode (see L<perlsec>). See the C<Perl_reg_numbered_buff_fetch>
+function in F<regcomp.c> for how to untaint capture variables if
+that's something you'd like your engine to do as well.
+
+=head3 numbered_buff_STORE
+
+ void (*numbered_buff_STORE) (pTHX_ REGEXP * const rx, const I32 paren,
+ SV const * const value);
+
+Set the value of a numbered capture variable. C<value> is the scalar
+that is to be used as the new value. It's up to the engine to make
+sure this is used as the new value (or reject it).
+
+Example:
+
+ if ("ook" =~ /(o*)/) {
+ # `paren' will be `1' and `value' will be `ee'
+ $1 =~ tr/o/e/;
+ }
+
+Perl's own engine will croak on any attempt to modify the capture
+variables, to do this in another engine use the following callback
+(copied from C<Perl_reg_numbered_buff_store>):
+
+ void
+ Example_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren,
+ SV const * const value)
+ {
+ PERL_UNUSED_ARG(rx);
+ PERL_UNUSED_ARG(paren);
+ PERL_UNUSED_ARG(value);
+
+ if (!PL_localizing)
+ Perl_croak(aTHX_ PL_no_modify);
+ }
+
+Actually perl will not I<always> croak in a statement that looks
+like it would modify a numbered capture variable. This is because the
+STORE callback will not be called if perl can determine that it
+doesn't have to modify the value. This is exactly how tied variables
+behave in the same situation:
+
+ package CaptureVar;
+ use base 'Tie::Scalar';
+
+ sub TIESCALAR { bless [] }
+ sub FETCH { undef }
+ sub STORE { die "This doesn't get called" }
+
+ package main;
+
+ tie my $sv => "CatptureVar";
+ $sv =~ y/a/b/;
+
+Because C<$sv> is C<undef> when the C<y///> operator is applied to it
+the transliteration won't actually execute and the program won't
+C<die>. This is different to how 5.8 and earlier versions behaved
+since the capture variables were READONLY variables then, now they'll
+just die when assigned to in the default engine.
+
+=head3 numbered_buff_LENGTH
+
+ I32 numbered_buff_LENGTH (pTHX_ REGEXP * const rx, const SV * const sv,
+ const I32 paren);
+
+Get the C<length> of a capture variable. There's a special callback
+for this so that perl doesn't have to do a FETCH and run C<length> on
+the result, since the length is (in perl's case) known from an offset
+stored in C<< rx->offs >> this is much more efficient:
+
+ I32 s1 = rx->offs[paren].start;
+ I32 s2 = rx->offs[paren].end;
+ I32 len = t1 - s1;
+
+This is a little bit more complex in the case of UTF-8, see what
+C<Perl_reg_numbered_buff_length> does with
+L<is_utf8_string_loclen|perlapi/is_utf8_string_loclen>.
+
+=head2 Named capture callbacks
+
+Called to get/set the value of C<%+> and C<%-> as well as by some
+utility functions in L<re>.
+
+There are two callbacks, C<named_buff> is called in all the cases the
+FETCH, STORE, DELETE, CLEAR, EXISTS and SCALAR L<Tie::Hash> callbacks
+would be on changes to C<%+> and C<%-> and C<named_buff_iter> in the
+same cases as FIRSTKEY and NEXTKEY.
+
+The C<flags> parameter can be used to determine which of these
+operations the callbacks should respond to, the following flags are
+currently defined:
+
+Which L<Tie::Hash> operation is being performed from the Perl level on
+C<%+> or C<%+>, if any:
+
+ RXapif_FETCH
+ RXapif_STORE
+ RXapif_DELETE
+ RXapif_CLEAR
+ RXapif_EXISTS
+ RXapif_SCALAR
+ RXapif_FIRSTKEY
+ RXapif_NEXTKEY
+
+Whether C<%+> or C<%-> is being operated on, if any.
+
+ RXapif_ONE /* %+ */
+ RXapif_ALL /* %- */
+
+Whether this is being called as C<re::regname>, C<re::regnames> or
+C<re::regnames_count>, if any. The first two will be combined with
+C<RXapif_ONE> or C<RXapif_ALL>.
+
+ RXapif_REGNAME
+ RXapif_REGNAMES
+ RXapif_REGNAMES_COUNT
+
+Internally C<%+> and C<%-> are implemented with a real tied interface
+via L<Tie::Hash::NamedCapture>. The methods in that package will call
+back into these functions. However the usage of
+L<Tie::Hash::NamedCapture> for this purpose might change in future
+releases. For instance this might be implemented by magic instead
+(would need an extension to mgvtbl).
+
+=head3 named_buff
+
+ SV* (*named_buff) (pTHX_ REGEXP * const rx, SV * const key,
+ SV * const value, U32 flags);
+
+=head3 named_buff_iter
+
+ SV* (*named_buff_iter) (pTHX_ REGEXP * const rx, const SV * const lastkey,
+ const U32 flags);
+
+=head2 qr_package
+
+ SV* qr_package(pTHX_ REGEXP * const rx);
+
+The package the qr// magic object is blessed into (as seen by C<ref
+qr//>). It is recommended that engines change this to their package
+name for identification regardless of whether they implement methods
+on the object.
+
+The package this method returns should also have the internal
+C<Regexp> package in its C<@ISA>. C<qr//->isa("Regexp")> should always
+be true regardless of what engine is being used.
+
+Example implementation might be:
+
+ SV*
+ Example_qr_package(pTHX_ REGEXP * const rx)
+ {
+ PERL_UNUSED_ARG(rx);
+ return newSVpvs("re::engine::Example");
+ }
+
+Any method calls on an object created with C<qr//> will be dispatched to the
+package as a normal object.
+
+ use re::engine::Example;
+ my $re = qr//;
+ $re->meth; # dispatched to re::engine::Example::meth()
+
+To retrieve the C<REGEXP> object from the scalar in an XS function use
+the C<SvRX> macro, see L<"REGEXP Functions" in perlapi|perlapi/REGEXP
+Functions>.
+
+ void meth(SV * rv)
+ PPCODE:
+ REGEXP * re = SvRX(sv);
+
+=head2 dupe
+
+ void* dupe(pTHX_ REGEXP * const rx, CLONE_PARAMS *param);
+
+On threaded builds a regexp may need to be duplicated so that the pattern
+can be used by multiple threads. This routine is expected to handle the
+duplication of any private data pointed to by the C<pprivate> member of
+the regexp structure. It will be called with the preconstructed new
+regexp structure as an argument, the C<pprivate> member will point at
+the B<old> private structure, and it is this routine's responsibility to
+construct a copy and return a pointer to it (which perl will then use to
+overwrite the field as passed to this routine.)
+
+This allows the engine to dupe its private data but also if necessary
+modify the final structure if it really must.
+
+On unthreaded builds this field doesn't exist.
+
+=head1 The REGEXP structure
+
+The REGEXP struct is defined in F<regexp.h>. All regex engines must be able to
+correctly build such a structure in their L</comp> routine.
+
+The REGEXP structure contains all the data that perl needs to be aware of
+to properly work with the regular expression. It includes data about
+optimisations that perl can use to determine if the regex engine should
+really be used, and various other control info that is needed to properly
+execute patterns in various contexts such as is the pattern anchored in
+some way, or what flags were used during the compile, or whether the
+program contains special constructs that perl needs to be aware of.
+
+In addition it contains two fields that are intended for the private
+use of the regex engine that compiled the pattern. These are the
+C<intflags> and C<pprivate> members. C<pprivate> is a void pointer to
+an arbitrary structure whose use and management is the responsibility
+of the compiling engine. perl will never modify either of these
+values.
+
+ typedef struct regexp {
+ /* what engine created this regexp? */
+ const struct regexp_engine* engine;
+
+ /* what re is this a lightweight copy of? */
+ struct regexp* mother_re;
+
+ /* Information about the match that the perl core uses to manage things */
+ U32 extflags; /* Flags used both externally and internally */
+ I32 minlen; /* mininum possible length of string to match */
+ I32 minlenret; /* mininum possible length of $& */
+ U32 gofs; /* chars left of pos that we search from */
+
+ /* substring data about strings that must appear
+ in the final match, used for optimisations */
+ struct reg_substr_data *substrs;
+
+ U32 nparens; /* number of capture buffers */
+
+ /* private engine specific data */
+ U32 intflags; /* Engine Specific Internal flags */
+ void *pprivate; /* Data private to the regex engine which
+ created this object. */
+
+ /* Data about the last/current match. These are modified during matching*/
+ U32 lastparen; /* last open paren matched */
+ U32 lastcloseparen; /* last close paren matched */
+ regexp_paren_pair *swap; /* Swap copy of *offs */
+ regexp_paren_pair *offs; /* Array of offsets for (@-) and (@+) */
+
+ char *subbeg; /* saved or original string so \digit works forever. */
+ SV_SAVED_COPY /* If non-NULL, SV which is COW from original */
+ I32 sublen; /* Length of string pointed by subbeg */
+
+ /* Information about the match that isn't often used */
+ I32 prelen; /* length of precomp */
+ const char *precomp; /* pre-compilation regular expression */
+
+ char *wrapped; /* wrapped version of the pattern */
+ I32 wraplen; /* length of wrapped */
+
+ I32 seen_evals; /* number of eval groups in the pattern - for security checks */
+ HV *paren_names; /* Optional hash of paren names */
+
+ /* Refcount of this regexp */
+ I32 refcnt; /* Refcount of this regexp */
+ } regexp;
+
+The fields are discussed in more detail below:
+
+=head2 C<engine>
+
+This field points at a regexp_engine structure which contains pointers
+to the subroutines that are to be used for performing a match. It
+is the compiling routine's responsibility to populate this field before
+returning the regexp object.
+
+Internally this is set to C<NULL> unless a custom engine is specified in
+C<$^H{regcomp}>, perl's own set of callbacks can be accessed in the struct
+pointed to by C<RE_ENGINE_PTR>.
+
+=head2 C<mother_re>
+
+TODO, see L<http://www.mail-archive.com/perl5-changes@perl.org/msg17328.html>
+
+=head2 C<extflags>
+
+This will be used by perl to see what flags the regexp was compiled
+with, this will normally be set to the value of the flags parameter by
+the L<comp|/comp> callback. See the L<comp|/comp> documentation for
+valid flags.
+
+=head2 C<minlen> C<minlenret>
+
+The minimum string length required for the pattern to match. This is used to
+prune the search space by not bothering to match any closer to the end of a
+string than would allow a match. For instance there is no point in even
+starting the regex engine if the minlen is 10 but the string is only 5
+characters long. There is no way that the pattern can match.
+
+C<minlenret> is the minimum length of the string that would be found
+in $& after a match.
+
+The difference between C<minlen> and C<minlenret> can be seen in the
+following pattern:
+
+ /ns(?=\d)/
+
+where the C<minlen> would be 3 but C<minlenret> would only be 2 as the \d is
+required to match but is not actually included in the matched content. This
+distinction is particularly important as the substitution logic uses the
+C<minlenret> to tell whether it can do in-place substitution which can result in
+considerable speedup.
+
+=head2 C<gofs>
+
+Left offset from pos() to start match at.
+
+=head2 C<substrs>
+
+Substring data about strings that must appear in the final match. This
+is currently only used internally by perl's engine for but might be
+used in the future for all engines for optimisations.
+
+=head2 C<nparens>, C<lasparen>, and C<lastcloseparen>
+
+These fields are used to keep track of how many paren groups could be matched
+in the pattern, which was the last open paren to be entered, and which was
+the last close paren to be entered.
+
+=head2 C<intflags>
+
+The engine's private copy of the flags the pattern was compiled with. Usually
+this is the same as C<extflags> unless the engine chose to modify one of them.
+
+=head2 C<pprivate>
+
+A void* pointing to an engine-defined data structure. The perl engine uses the
+C<regexp_internal> structure (see L<perlreguts/Base Structures>) but a custom
+engine should use something else.
+
+=head2 C<swap>
+
+TODO: document
+
+=head2 C<offs>
+
+A C<regexp_paren_pair> structure which defines offsets into the string being
+matched which correspond to the C<$&> and C<$1>, C<$2> etc. captures, the
+C<regexp_paren_pair> struct is defined as follows:
+
+ typedef struct regexp_paren_pair {
+ I32 start;
+ I32 end;
+ } regexp_paren_pair;
+
+If C<< ->offs[num].start >> or C<< ->offs[num].end >> is C<-1> then that
+capture buffer did not match. C<< ->offs[0].start/end >> represents C<$&> (or
+C<${^MATCH> under C<//p>) and C<< ->offs[paren].end >> matches C<$$paren> where
+C<$paren >= 1>.
+
+=head2 C<precomp> C<prelen>
+
+Used for optimisations. C<precomp> holds a copy of the pattern that
+was compiled and C<prelen> its length. When a new pattern is to be
+compiled (such as inside a loop) the internal C<regcomp> operator
+checks whether the last compiled C<REGEXP>'s C<precomp> and C<prelen>
+are equivalent to the new one, and if so uses the old pattern instead
+of compiling a new one.
+
+The relevant snippet from C<Perl_pp_regcomp>:
+
+ if (!re || !re->precomp || re->prelen != (I32)len ||
+ memNE(re->precomp, t, len))
+ /* Compile a new pattern */
+
+=head2 C<paren_names>
+
+This is a hash used internally to track named capture buffers and their
+offsets. The keys are the names of the buffers the values are dualvars,
+with the IV slot holding the number of buffers with the given name and the
+pv being an embedded array of I32. The values may also be contained
+independently in the data array in cases where named backreferences are
+used.
+
+=head2 C<substrs>
+
+Holds information on the longest string that must occur at a fixed
+offset from the start of the pattern, and the longest string that must
+occur at a floating offset from the start of the pattern. Used to do
+Fast-Boyer-Moore searches on the string to find out if its worth using
+the regex engine at all, and if so where in the string to search.
+
+=head2 C<subbeg> C<sublen> C<saved_copy>
+
+Used during execution phase for managing search and replace patterns.
+
+=head2 C<wrapped> C<wraplen>
+
+Stores the string C<qr//> stringifies to. The perl engine for example
+stores C<(?-xism:eek)> in the case of C<qr/eek/>.
+
+When using a custom engine that doesn't support the C<(?:)> construct
+for inline modifiers, it's probably best to have C<qr//> stringify to
+the supplied pattern, note that this will create undesired patterns in
+cases such as:
+
+ my $x = qr/a|b/; # "a|b"
+ my $y = qr/c/i; # "c"
+ my $z = qr/$x$y/; # "a|bc"
+
+There's no solution for this problem other than making the custom
+engine understand a construct like C<(?:)>.
+
+=head2 C<seen_evals>
+
+This stores the number of eval groups in the pattern. This is used for security
+purposes when embedding compiled regexes into larger patterns with C<qr//>.
+
+=head2 C<refcnt>
+
+The number of times the structure is referenced. When this falls to 0 the
+regexp is automatically freed by a call to pregfree. This should be set to 1 in
+each engine's L</comp> routine.
+
+=head1 HISTORY
+
+Originally part of L<perlreguts>.
+
+=head1 AUTHORS
+
+Originally written by Yves Orton, expanded by E<AElig>var ArnfjE<ouml>rE<eth>
+Bjarmason.
+
+=head1 LICENSE
+
+Copyright 2006 Yves Orton and 2007 E<AElig>var ArnfjE<ouml>rE<eth> Bjarmason.
+
+This program is free software; you can redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlrebackslash.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlrebackslash.pod
new file mode 100755
index 00000000000..ddd7abee380
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlrebackslash.pod
@@ -0,0 +1,539 @@
+=head1 NAME
+
+perlrebackslash - Perl Regular Expression Backslash Sequences and Escapes
+
+=head1 DESCRIPTION
+
+The top level documentation about Perl regular expressions
+is found in L<perlre>.
+
+This document describes all backslash and escape sequences. After
+explaining the role of the backslash, it lists all the sequences that have
+a special meaning in Perl regular expressions (in alphabetical order),
+then describes each of them.
+
+Most sequences are described in detail in different documents; the primary
+purpose of this document is to have a quick reference guide describing all
+backslash and escape sequences.
+
+
+=head2 The backslash
+
+In a regular expression, the backslash can perform one of two tasks:
+it either takes away the special meaning of the character following it
+(for instance, C<\|> matches a vertical bar, it's not an alternation),
+or it is the start of a backslash or escape sequence.
+
+The rules determining what it is are quite simple: if the character
+following the backslash is a punctuation (non-word) character (that is,
+anything that is not a letter, digit or underscore), then the backslash
+just takes away the special meaning (if any) of the character following
+it.
+
+If the character following the backslash is a letter or a digit, then the
+sequence may be special; if so, it's listed below. A few letters have not
+been used yet, and escaping them with a backslash is safe for now, but a
+future version of Perl may assign a special meaning to it. However, if you
+have warnings turned on, Perl will issue a warning if you use such a sequence.
+[1].
+
+It is however guaranteed that backslash or escape sequences never have a
+punctuation character following the backslash, not now, and not in a future
+version of Perl 5. So it is safe to put a backslash in front of a non-word
+character.
+
+Note that the backslash itself is special; if you want to match a backslash,
+you have to escape the backslash with a backslash: C</\\/> matches a single
+backslash.
+
+=over 4
+
+=item [1]
+
+There is one exception. If you use an alphanumerical character as the
+delimiter of your pattern (which you probably shouldn't do for readability
+reasons), you will have to escape the delimiter if you want to match
+it. Perl won't warn then. See also L<perlop/Gory details of parsing
+quoted constructs>.
+
+=back
+
+
+=head2 All the sequences and escapes
+
+ \000 Octal escape sequence.
+ \1 Absolute backreference.
+ \a Alarm or bell.
+ \A Beginning of string.
+ \b Word/non-word boundary. (Backspace in a char class).
+ \B Not a word/non-word boundary.
+ \cX Control-X (X can be any ASCII character).
+ \C Single octet, even under UTF-8.
+ \d Character class for digits.
+ \D Character class for non-digits.
+ \e Escape character.
+ \E Turn off \Q, \L and \U processing.
+ \f Form feed.
+ \g{}, \g1 Named, absolute or relative backreference.
+ \G Pos assertion.
+ \h Character class for horizontal white space.
+ \H Character class for non horizontal white space.
+ \k{}, \k<>, \k'' Named backreference.
+ \K Keep the stuff left of \K.
+ \l Lowercase next character.
+ \L Lowercase till \E.
+ \n (Logical) newline character.
+ \N{} Named (Unicode) character.
+ \p{}, \pP Character with a Unicode property.
+ \P{}, \PP Character without a Unicode property.
+ \Q Quotemeta till \E.
+ \r Return character.
+ \R Generic new line.
+ \s Character class for white space.
+ \S Character class for non white space.
+ \t Tab character.
+ \u Titlecase next character.
+ \U Uppercase till \E.
+ \v Character class for vertical white space.
+ \V Character class for non vertical white space.
+ \w Character class for word characters.
+ \W Character class for non-word characters.
+ \x{}, \x00 Hexadecimal escape sequence.
+ \X Extended Unicode "combining character sequence".
+ \z End of string.
+ \Z End of string.
+
+=head2 Character Escapes
+
+=head3 Fixed characters
+
+A handful of characters have a dedicated I<character escape>. The following
+table shows them, along with their code points (in decimal and hex), their
+ASCII name, the control escape (see below) and a short description.
+
+ Seq. Code Point ASCII Cntr Description.
+ Dec Hex
+ \a 7 07 BEL \cG alarm or bell
+ \b 8 08 BS \cH backspace [1]
+ \e 27 1B ESC \c[ escape character
+ \f 12 0C FF \cL form feed
+ \n 10 0A LF \cJ line feed [2]
+ \r 13 0D CR \cM carriage return
+ \t 9 09 TAB \cI tab
+
+=over 4
+
+=item [1]
+
+C<\b> is only the backspace character inside a character class. Outside a
+character class, C<\b> is a word/non-word boundary.
+
+=item [2]
+
+C<\n> matches a logical newline. Perl will convert between C<\n> and your
+OSses native newline character when reading from or writing to text files.
+
+=back
+
+=head4 Example
+
+ $str =~ /\t/; # Matches if $str contains a (horizontal) tab.
+
+=head3 Control characters
+
+C<\c> is used to denote a control character; the character following C<\c>
+is the name of the control character. For instance, C</\cM/> matches the
+character I<control-M> (a carriage return, code point 13). The case of the
+character following C<\c> doesn't matter: C<\cM> and C<\cm> match the same
+character.
+
+Mnemonic: I<c>ontrol character.
+
+=head4 Example
+
+ $str =~ /\cK/; # Matches if $str contains a vertical tab (control-K).
+
+=head3 Named characters
+
+All Unicode characters have a Unicode name, and characters in various scripts
+have names as well. It is even possible to give your own names to characters.
+You can use a character by name by using the C<\N{}> construct; the name of
+the character goes between the curly braces. You do have to C<use charnames>
+to load the names of the characters, otherwise Perl will complain you use
+a name it doesn't know about. For more details, see L<charnames>.
+
+Mnemonic: I<N>amed character.
+
+=head4 Example
+
+ use charnames ':full'; # Loads the Unicode names.
+ $str =~ /\N{THAI CHARACTER SO SO}/; # Matches the Thai SO SO character
+
+ use charnames 'Cyrillic'; # Loads Cyrillic names.
+ $str =~ /\N{ZHE}\N{KA}/; # Match "ZHE" followed by "KA".
+
+=head3 Octal escapes
+
+Octal escapes consist of a backslash followed by two or three octal digits
+matching the code point of the character you want to use. This allows for
+512 characters (C<\00> up to C<\777>) that can be expressed this way.
+Enough in pre-Unicode days, but most Unicode characters cannot be escaped
+this way.
+
+Note that a character that is expressed as an octal escape is considered
+as a character without special meaning by the regex engine, and will match
+"as is".
+
+=head4 Examples
+
+ $str = "Perl";
+ $str =~ /\120/; # Match, "\120" is "P".
+ $str =~ /\120+/; # Match, "\120" is "P", it is repeated at least once.
+ $str =~ /P\053/; # No match, "\053" is "+" and taken literally.
+
+=head4 Caveat
+
+Octal escapes potentially clash with backreferences. They both consist
+of a backslash followed by numbers. So Perl has to use heuristics to
+determine whether it is a backreference or an octal escape. Perl uses
+the following rules:
+
+=over 4
+
+=item 1
+
+If the backslash is followed by a single digit, it's a backreference.
+
+=item 2
+
+If the first digit following the backslash is a 0, it's an octal escape.
+
+=item 3
+
+If the number following the backslash is N (decimal), and Perl already has
+seen N capture groups, Perl will consider this to be a backreference.
+Otherwise, it will consider it to be an octal escape. Note that if N > 999,
+Perl only takes the first three digits for the octal escape; the rest is
+matched as is.
+
+ my $pat = "(" x 999;
+ $pat .= "a";
+ $pat .= ")" x 999;
+ /^($pat)\1000$/; # Matches 'aa'; there are 1000 capture groups.
+ /^$pat\1000$/; # Matches 'a@0'; there are 999 capture groups
+ # and \1000 is seen as \100 (a '@') and a '0'.
+
+=back
+
+=head3 Hexadecimal escapes
+
+Hexadecimal escapes start with C<\x> and are then either followed by
+two digit hexadecimal number, or a hexadecimal number of arbitrary length
+surrounded by curly braces. The hexadecimal number is the code point of
+the character you want to express.
+
+Note that a character that is expressed as a hexadecimal escape is considered
+as a character without special meaning by the regex engine, and will match
+"as is".
+
+Mnemonic: heI<x>adecimal.
+
+=head4 Examples
+
+ $str = "Perl";
+ $str =~ /\x50/; # Match, "\x50" is "P".
+ $str =~ /\x50+/; # Match, "\x50" is "P", it is repeated at least once.
+ $str =~ /P\x2B/; # No match, "\x2B" is "+" and taken literally.
+
+ /\x{2603}\x{2602}/ # Snowman with an umbrella.
+ # The Unicode character 2603 is a snowman,
+ # the Unicode character 2602 is an umbrella.
+ /\x{263B}/ # Black smiling face.
+ /\x{263b}/ # Same, the hex digits A - F are case insensitive.
+
+=head2 Modifiers
+
+A number of backslash sequences have to do with changing the character,
+or characters following them. C<\l> will lowercase the character following
+it, while C<\u> will uppercase (or, more accurately, titlecase) the
+character following it. (They perform similar functionality as the
+functions C<lcfirst> and C<ucfirst>).
+
+To uppercase or lowercase several characters, one might want to use
+C<\L> or C<\U>, which will lowercase/uppercase all characters following
+them, until either the end of the pattern, or the next occurrence of
+C<\E>, whatever comes first. They perform similar functionality as the
+functions C<lc> and C<uc> do.
+
+C<\Q> is used to escape all characters following, up to the next C<\E>
+or the end of the pattern. C<\Q> adds a backslash to any character that
+isn't a letter, digit or underscore. This will ensure that any character
+between C<\Q> and C<\E> is matched literally, and will not be interpreted
+by the regexp engine.
+
+Mnemonic: I<L>owercase, I<U>ppercase, I<Q>uotemeta, I<E>nd.
+
+=head4 Examples
+
+ $sid = "sid";
+ $greg = "GrEg";
+ $miranda = "(Miranda)";
+ $str =~ /\u$sid/; # Matches 'Sid'
+ $str =~ /\L$greg/; # Matches 'greg'
+ $str =~ /\Q$miranda\E/; # Matches '(Miranda)', as if the pattern
+ # had been written as /\(Miranda\)/
+
+=head2 Character classes
+
+Perl regular expressions have a large range of character classes. Some of
+the character classes are written as a backslash sequence. We will briefly
+discuss those here; full details of character classes can be found in
+L<perlrecharclass>.
+
+C<\w> is a character class that matches any I<word> character (letters,
+digits, underscore). C<\d> is a character class that matches any digit,
+while the character class C<\s> matches any white space character.
+New in perl 5.10.0 are the classes C<\h> and C<\v> which match horizontal
+and vertical white space characters.
+
+The uppercase variants (C<\W>, C<\D>, C<\S>, C<\H>, and C<\V>) are
+character classes that match any character that isn't a word character,
+digit, white space, horizontal white space or vertical white space.
+
+Mnemonics: I<w>ord, I<d>igit, I<s>pace, I<h>orizontal, I<v>ertical.
+
+=head3 Unicode classes
+
+C<\pP> (where C<P> is a single letter) and C<\p{Property}> are used to
+match a character that matches the given Unicode property; properties
+include things like "letter", or "thai character". Capitalizing the
+sequence to C<\PP> and C<\P{Property}> make the sequence match a character
+that doesn't match the given Unicode property. For more details, see
+L<perlrecharclass/Backslashed sequences> and
+L<perlunicode/Unicode Character Properties>.
+
+Mnemonic: I<p>roperty.
+
+
+=head2 Referencing
+
+If capturing parenthesis are used in a regular expression, we can refer
+to the part of the source string that was matched, and match exactly the
+same thing. There are three ways of referring to such I<backreference>:
+absolutely, relatively, and by name.
+
+=for later add link to perlrecapture
+
+=head3 Absolute referencing
+
+A backslash sequence that starts with a backslash and is followed by a
+number is an absolute reference (but be aware of the caveat mentioned above).
+If the number is I<N>, it refers to the Nth set of parenthesis - whatever
+has been matched by that set of parenthesis has to be matched by the C<\N>
+as well.
+
+=head4 Examples
+
+ /(\w+) \1/; # Finds a duplicated word, (e.g. "cat cat").
+ /(.)(.)\2\1/; # Match a four letter palindrome (e.g. "ABBA").
+
+
+=head3 Relative referencing
+
+New in perl 5.10.0 is a different way of referring to capture buffers: C<\g>.
+C<\g> takes a number as argument, with the number in curly braces (the
+braces are optional). If the number (N) does not have a sign, it's a reference
+to the Nth capture group (so C<\g{2}> is equivalent to C<\2> - except that
+C<\g> always refers to a capture group and will never be seen as an octal
+escape). If the number is negative, the reference is relative, referring to
+the Nth group before the C<\g{-N}>.
+
+The big advantage of C<\g{-N}> is that it makes it much easier to write
+patterns with references that can be interpolated in larger patterns,
+even if the larger pattern also contains capture groups.
+
+Mnemonic: I<g>roup.
+
+=head4 Examples
+
+ /(A) # Buffer 1
+ ( # Buffer 2
+ (B) # Buffer 3
+ \g{-1} # Refers to buffer 3 (B)
+ \g{-3} # Refers to buffer 1 (A)
+ )
+ /x; # Matches "ABBA".
+
+ my $qr = qr /(.)(.)\g{-2}\g{-1}/; # Matches 'abab', 'cdcd', etc.
+ /$qr$qr/ # Matches 'ababcdcd'.
+
+=head3 Named referencing
+
+Also new in perl 5.10.0 is the use of named capture buffers, which can be
+referred to by name. This is done with C<\g{name}>, which is a
+backreference to the capture buffer with the name I<name>.
+
+To be compatible with .Net regular expressions, C<\g{name}> may also be
+written as C<\k{name}>, C<< \k<name> >> or C<\k'name'>.
+
+Note that C<\g{}> has the potential to be ambiguous, as it could be a named
+reference, or an absolute or relative reference (if its argument is numeric).
+However, names are not allowed to start with digits, nor are allowed to
+contain a hyphen, so there is no ambiguity.
+
+=head4 Examples
+
+ /(?<word>\w+) \g{word}/ # Finds duplicated word, (e.g. "cat cat")
+ /(?<word>\w+) \k{word}/ # Same.
+ /(?<word>\w+) \k<word>/ # Same.
+ /(?<letter1>.)(?<letter2>.)\g{letter2}\g{letter1}/
+ # Match a four letter palindrome (e.g. "ABBA")
+
+=head2 Assertions
+
+Assertions are conditions that have to be true -- they don't actually
+match parts of the substring. There are six assertions that are written as
+backslash sequences.
+
+=over 4
+
+=item \A
+
+C<\A> only matches at the beginning of the string. If the C</m> modifier
+isn't used, then C</\A/> is equivalent with C</^/>. However, if the C</m>
+modifier is used, then C</^/> matches internal newlines, but the meaning
+of C</\A/> isn't changed by the C</m> modifier. C<\A> matches at the beginning
+of the string regardless whether the C</m> modifier is used.
+
+=item \z, \Z
+
+C<\z> and C<\Z> match at the end of the string. If the C</m> modifier isn't
+used, then C</\Z/> is equivalent with C</$/>, that is, it matches at the
+end of the string, or before the newline at the end of the string. If the
+C</m> modifier is used, then C</$/> matches at internal newlines, but the
+meaning of C</\Z/> isn't changed by the C</m> modifier. C<\Z> matches at
+the end of the string (or just before a trailing newline) regardless whether
+the C</m> modifier is used.
+
+C<\z> is just like C<\Z>, except that it will not match before a trailing
+newline. C<\z> will only match at the end of the string - regardless of the
+modifiers used, and not before a newline.
+
+=item \G
+
+C<\G> is usually only used in combination with the C</g> modifier. If the
+C</g> modifier is used (and the match is done in scalar context), Perl will
+remember where in the source string the last match ended, and the next time,
+it will start the match from where it ended the previous time.
+
+C<\G> matches the point where the previous match ended, or the beginning
+of the string if there was no previous match.
+
+=for later add link to perlremodifiers
+
+Mnemonic: I<G>lobal.
+
+=item \b, \B
+
+C<\b> matches at any place between a word and a non-word character; C<\B>
+matches at any place between characters where C<\b> doesn't match. C<\b>
+and C<\B> assume there's a non-word character before the beginning and after
+the end of the source string; so C<\b> will match at the beginning (or end)
+of the source string if the source string begins (or ends) with a word
+character. Otherwise, C<\B> will match.
+
+Mnemonic: I<b>oundary.
+
+=back
+
+=head4 Examples
+
+ "cat" =~ /\Acat/; # Match.
+ "cat" =~ /cat\Z/; # Match.
+ "cat\n" =~ /cat\Z/; # Match.
+ "cat\n" =~ /cat\z/; # No match.
+
+ "cat" =~ /\bcat\b/; # Matches.
+ "cats" =~ /\bcat\b/; # No match.
+ "cat" =~ /\bcat\B/; # No match.
+ "cats" =~ /\bcat\B/; # Match.
+
+ while ("cat dog" =~ /(\w+)/g) {
+ print $1; # Prints 'catdog'
+ }
+ while ("cat dog" =~ /\G(\w+)/g) {
+ print $1; # Prints 'cat'
+ }
+
+=head2 Misc
+
+Here we document the backslash sequences that don't fall in one of the
+categories above. They are:
+
+=over 4
+
+=item \C
+
+C<\C> always matches a single octet, even if the source string is encoded
+in UTF-8 format, and the character to be matched is a multi-octet character.
+C<\C> was introduced in perl 5.6.
+
+Mnemonic: oI<C>tet.
+
+=item \K
+
+This is new in perl 5.10.0. Anything that is matched left of C<\K> is
+not included in C<$&> - and will not be replaced if the pattern is
+used in a substitution. This will allow you to write C<s/PAT1 \K PAT2/REPL/x>
+instead of C<s/(PAT1) PAT2/${1}REPL/x> or C<s/(?<=PAT1) PAT2/REPL/x>.
+
+Mnemonic: I<K>eep.
+
+=item \R
+
+C<\R> matches a I<generic newline>, that is, anything that is considered
+a newline by Unicode. This includes all characters matched by C<\v>
+(vertical white space), and the multi character sequence C<"\x0D\x0A">
+(carriage return followed by a line feed, aka the network newline, or
+the newline used in Windows text files). C<\R> is equivalent with
+C<< (?>\x0D\x0A)|\v) >>. Since C<\R> can match a more than one character,
+it cannot be put inside a bracketed character class; C</[\R]/> is an error.
+C<\R> was introduced in perl 5.10.0.
+
+Mnemonic: none really. C<\R> was picked because PCRE already uses C<\R>,
+and more importantly because Unicode recommends such a regular expression
+metacharacter, and suggests C<\R> as the notation.
+
+=item \X
+
+This matches an extended Unicode I<combining character sequence>, and
+is equivalent to C<< (?>\PM\pM*) >>. C<\PM> matches any character that is
+not considered a Unicode mark character, while C<\pM> matches any character
+that is considered a Unicode mark character; so C<\X> matches any non
+mark character followed by zero or more mark characters. Mark characters
+include (but are not restricted to) I<combining characters> and
+I<vowel signs>.
+
+C<\X> matches quite well what normal (non-Unicode-programmer) usage
+would consider a single character: for example a base character
+(the C<\PM> above), for example a letter, followed by zero or more
+diacritics, which are I<combining characters> (the C<\pM*> above).
+
+Mnemonic: eI<X>tended Unicode character.
+
+=back
+
+=head4 Examples
+
+ "\x{256}" =~ /^\C\C$/; # Match as chr (256) takes 2 octets in UTF-8.
+
+ $str =~ s/foo\Kbar/baz/g; # Change any 'bar' following a 'foo' to 'baz'.
+ $str =~ s/(.)\K\1//g; # Delete duplicated characters.
+
+ "\n" =~ /^\R$/; # Match, \n is a generic newline.
+ "\r" =~ /^\R$/; # Match, \r is a generic newline.
+ "\r\n" =~ /^\R$/; # Match, \r\n is a generic newline.
+
+ "P\x{0307}" =~ /^\X$/ # \X matches a P with a dot above.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlrecharclass.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlrecharclass.pod
new file mode 100755
index 00000000000..a626dd9bb9b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlrecharclass.pod
@@ -0,0 +1,525 @@
+=head1 NAME
+
+perlrecharclass - Perl Regular Expression Character Classes
+
+=head1 DESCRIPTION
+
+The top level documentation about Perl regular expressions
+is found in L<perlre>.
+
+This manual page discusses the syntax and use of character
+classes in Perl Regular Expressions.
+
+A character class is a way of denoting a set of characters,
+in such a way that one character of the set is matched.
+It's important to remember that matching a character class
+consumes exactly one character in the source string. (The source
+string is the string the regular expression is matched against.)
+
+There are three types of character classes in Perl regular
+expressions: the dot, backslashed sequences, and the bracketed form.
+
+=head2 The dot
+
+The dot (or period), C<.> is probably the most used, and certainly
+the most well-known character class. By default, a dot matches any
+character, except for the newline. The default can be changed to
+add matching the newline with the I<single line> modifier: either
+for the entire regular expression using the C</s> modifier, or
+locally using C<(?s)>.
+
+Here are some examples:
+
+ "a" =~ /./ # Match
+ "." =~ /./ # Match
+ "" =~ /./ # No match (dot has to match a character)
+ "\n" =~ /./ # No match (dot does not match a newline)
+ "\n" =~ /./s # Match (global 'single line' modifier)
+ "\n" =~ /(?s:.)/ # Match (local 'single line' modifier)
+ "ab" =~ /^.$/ # No match (dot matches one character)
+
+
+=head2 Backslashed sequences
+
+Perl regular expressions contain many backslashed sequences that
+constitute a character class. That is, they will match a single
+character, if that character belongs to a specific set of characters
+(defined by the sequence). A backslashed sequence is a sequence of
+characters starting with a backslash. Not all backslashed sequences
+are character class; for a full list, see L<perlrebackslash>.
+
+Here's a list of the backslashed sequences, which are discussed in
+more detail below.
+
+ \d Match a digit character.
+ \D Match a non-digit character.
+ \w Match a "word" character.
+ \W Match a non-"word" character.
+ \s Match a white space character.
+ \S Match a non-white space character.
+ \h Match a horizontal white space character.
+ \H Match a character that isn't horizontal white space.
+ \v Match a vertical white space character.
+ \V Match a character that isn't vertical white space.
+ \pP, \p{Prop} Match a character matching a Unicode property.
+ \PP, \P{Prop} Match a character that doesn't match a Unicode property.
+
+=head3 Digits
+
+C<\d> matches a single character that is considered to be a I<digit>.
+What is considered a digit depends on the internal encoding of
+the source string. If the source string is in UTF-8 format, C<\d>
+not only matches the digits '0' - '9', but also Arabic, Devanagari and
+digits from other languages. Otherwise, if there is a locale in effect,
+it will match whatever characters the locale considers digits. Without
+a locale, C<\d> matches the digits '0' to '9'.
+See L</Locale, Unicode and UTF-8>.
+
+Any character that isn't matched by C<\d> will be matched by C<\D>.
+
+=head3 Word characters
+
+C<\w> matches a single I<word> character: an alphanumeric character
+(that is, an alphabetic character, or a digit), or the underscore (C<_>).
+What is considered a word character depends on the internal encoding
+of the string. If it's in UTF-8 format, C<\w> matches those characters
+that are considered word characters in the Unicode database. That is, it
+not only matches ASCII letters, but also Thai letters, Greek letters, etc.
+If the source string isn't in UTF-8 format, C<\w> matches those characters
+that are considered word characters by the current locale. Without
+a locale in effect, C<\w> matches the ASCII letters, digits and the
+underscore.
+
+Any character that isn't matched by C<\w> will be matched by C<\W>.
+
+=head3 White space
+
+C<\s> matches any single character that is consider white space. In the
+ASCII range, C<\s> matches the horizontal tab (C<\t>), the new line
+(C<\n>), the form feed (C<\f>), the carriage return (C<\r>), and the
+space (the vertical tab, C<\cK> is not matched by C<\s>). The exact set
+of characters matched by C<\s> depends on whether the source string is
+in UTF-8 format. If it is, C<\s> matches what is considered white space
+in the Unicode database. Otherwise, if there is a locale in effect, C<\s>
+matches whatever is considered white space by the current locale. Without
+a locale, C<\s> matches the five characters mentioned in the beginning
+of this paragraph. Perhaps the most notable difference is that C<\s>
+matches a non-breaking space only if the non-breaking space is in a
+UTF-8 encoded string.
+
+Any character that isn't matched by C<\s> will be matched by C<\S>.
+
+C<\h> will match any character that is considered horizontal white space;
+this includes the space and the tab characters. C<\H> will match any character
+that is not considered horizontal white space.
+
+C<\v> will match any character that is considered vertical white space;
+this includes the carriage return and line feed characters (newline).
+C<\V> will match any character that is not considered vertical white space.
+
+C<\R> matches anything that can be considered a newline under Unicode
+rules. It's not a character class, as it can match a multi-character
+sequence. Therefore, it cannot be used inside a bracketed character
+class. Details are discussed in L<perlrebackslash>.
+
+C<\h>, C<\H>, C<\v>, C<\V>, and C<\R> are new in perl 5.10.0.
+
+Note that unlike C<\s>, C<\d> and C<\w>, C<\h> and C<\v> always match
+the same characters, regardless whether the source string is in UTF-8
+format or not. The set of characters they match is also not influenced
+by locale.
+
+One might think that C<\s> is equivalent with C<[\h\v]>. This is not true.
+The vertical tab (C<"\x0b">) is not matched by C<\s>, it is however
+considered vertical white space. Furthermore, if the source string is
+not in UTF-8 format, the next line (C<"\x85">) and the no-break space
+(C<"\xA0">) are not matched by C<\s>, but are by C<\v> and C<\h> respectively.
+If the source string is in UTF-8 format, both the next line and the
+no-break space are matched by C<\s>.
+
+The following table is a complete listing of characters matched by
+C<\s>, C<\h> and C<\v>.
+
+The first column gives the code point of the character (in hex format),
+the second column gives the (Unicode) name. The third column indicates
+by which class(es) the character is matched.
+
+ 0x00009 CHARACTER TABULATION h s
+ 0x0000a LINE FEED (LF) vs
+ 0x0000b LINE TABULATION v
+ 0x0000c FORM FEED (FF) vs
+ 0x0000d CARRIAGE RETURN (CR) vs
+ 0x00020 SPACE h s
+ 0x00085 NEXT LINE (NEL) vs [1]
+ 0x000a0 NO-BREAK SPACE h s [1]
+ 0x01680 OGHAM SPACE MARK h s
+ 0x0180e MONGOLIAN VOWEL SEPARATOR h s
+ 0x02000 EN QUAD h s
+ 0x02001 EM QUAD h s
+ 0x02002 EN SPACE h s
+ 0x02003 EM SPACE h s
+ 0x02004 THREE-PER-EM SPACE h s
+ 0x02005 FOUR-PER-EM SPACE h s
+ 0x02006 SIX-PER-EM SPACE h s
+ 0x02007 FIGURE SPACE h s
+ 0x02008 PUNCTUATION SPACE h s
+ 0x02009 THIN SPACE h s
+ 0x0200a HAIR SPACE h s
+ 0x02028 LINE SEPARATOR vs
+ 0x02029 PARAGRAPH SEPARATOR vs
+ 0x0202f NARROW NO-BREAK SPACE h s
+ 0x0205f MEDIUM MATHEMATICAL SPACE h s
+ 0x03000 IDEOGRAPHIC SPACE h s
+
+=over 4
+
+=item [1]
+
+NEXT LINE and NO-BREAK SPACE only match C<\s> if the source string is in
+UTF-8 format.
+
+=back
+
+It is worth noting that C<\d>, C<\w>, etc, match single characters, not
+complete numbers or words. To match a number (that consists of integers),
+use C<\d+>; to match a word, use C<\w+>.
+
+
+=head3 Unicode Properties
+
+C<\pP> and C<\p{Prop}> are character classes to match characters that
+fit given Unicode classes. One letter classes can be used in the C<\pP>
+form, with the class name following the C<\p>, otherwise, the property
+name is enclosed in braces, and follows the C<\p>. For instance, a
+match for a number can be written as C</\pN/> or as C</\p{Number}/>.
+Lowercase letters are matched by the property I<LowercaseLetter> which
+has as short form I<Ll>. They have to be written as C</\p{Ll}/> or
+C</\p{LowercaseLetter}/>. C</\pLl/> is valid, but means something different.
+It matches a two character string: a letter (Unicode property C<\pL>),
+followed by a lowercase C<l>.
+
+For a list of possible properties, see
+L<perlunicode/Unicode Character Properties>. It is also possible to
+defined your own properties. This is discussed in
+L<perlunicode/User-Defined Character Properties>.
+
+
+=head4 Examples
+
+ "a" =~ /\w/ # Match, "a" is a 'word' character.
+ "7" =~ /\w/ # Match, "7" is a 'word' character as well.
+ "a" =~ /\d/ # No match, "a" isn't a digit.
+ "7" =~ /\d/ # Match, "7" is a digit.
+ " " =~ /\s/ # Match, a space is white space.
+ "a" =~ /\D/ # Match, "a" is a non-digit.
+ "7" =~ /\D/ # No match, "7" is not a non-digit.
+ " " =~ /\S/ # No match, a space is not non-white space.
+
+ " " =~ /\h/ # Match, space is horizontal white space.
+ " " =~ /\v/ # No match, space is not vertical white space.
+ "\r" =~ /\v/ # Match, a return is vertical white space.
+
+ "a" =~ /\pL/ # Match, "a" is a letter.
+ "a" =~ /\p{Lu}/ # No match, /\p{Lu}/ matches upper case letters.
+
+ "\x{0e0b}" =~ /\p{Thai}/ # Match, \x{0e0b} is the character
+ # 'THAI CHARACTER SO SO', and that's in
+ # Thai Unicode class.
+ "a" =~ /\P{Lao}/ # Match, as "a" is not a Laoian character.
+
+
+=head2 Bracketed Character Classes
+
+The third form of character class you can use in Perl regular expressions
+is the bracketed form. In its simplest form, it lists the characters
+that may be matched inside square brackets, like this: C<[aeiou]>.
+This matches one of C<a>, C<e>, C<i>, C<o> or C<u>. Just as the other
+character classes, exactly one character will be matched. To match
+a longer string consisting of characters mentioned in the characters
+class, follow the character class with a quantifier. For instance,
+C<[aeiou]+> matches a string of one or more lowercase ASCII vowels.
+
+Repeating a character in a character class has no
+effect; it's considered to be in the set only once.
+
+Examples:
+
+ "e" =~ /[aeiou]/ # Match, as "e" is listed in the class.
+ "p" =~ /[aeiou]/ # No match, "p" is not listed in the class.
+ "ae" =~ /^[aeiou]$/ # No match, a character class only matches
+ # a single character.
+ "ae" =~ /^[aeiou]+$/ # Match, due to the quantifier.
+
+=head3 Special Characters Inside a Bracketed Character Class
+
+Most characters that are meta characters in regular expressions (that
+is, characters that carry a special meaning like C<*> or C<(>) lose
+their special meaning and can be used inside a character class without
+the need to escape them. For instance, C<[()]> matches either an opening
+parenthesis, or a closing parenthesis, and the parens inside the character
+class don't group or capture.
+
+Characters that may carry a special meaning inside a character class are:
+C<\>, C<^>, C<->, C<[> and C<]>, and are discussed below. They can be
+escaped with a backslash, although this is sometimes not needed, in which
+case the backslash may be omitted.
+
+The sequence C<\b> is special inside a bracketed character class. While
+outside the character class C<\b> is an assertion indicating a point
+that does not have either two word characters or two non-word characters
+on either side, inside a bracketed character class, C<\b> matches a
+backspace character.
+
+A C<[> is not special inside a character class, unless it's the start
+of a POSIX character class (see below). It normally does not need escaping.
+
+A C<]> is either the end of a POSIX character class (see below), or it
+signals the end of the bracketed character class. Normally it needs
+escaping if you want to include a C<]> in the set of characters.
+However, if the C<]> is the I<first> (or the second if the first
+character is a caret) character of a bracketed character class, it
+does not denote the end of the class (as you cannot have an empty class)
+and is considered part of the set of characters that can be matched without
+escaping.
+
+Examples:
+
+ "+" =~ /[+?*]/ # Match, "+" in a character class is not special.
+ "\cH" =~ /[\b]/ # Match, \b inside in a character class
+ # is equivalent with a backspace.
+ "]" =~ /[][]/ # Match, as the character class contains.
+ # both [ and ].
+ "[]" =~ /[[]]/ # Match, the pattern contains a character class
+ # containing just ], and the character class is
+ # followed by a ].
+
+=head3 Character Ranges
+
+It is not uncommon to want to match a range of characters. Luckily, instead
+of listing all the characters in the range, one may use the hyphen (C<->).
+If inside a bracketed character class you have two characters separated
+by a hyphen, it's treated as if all the characters between the two are in
+the class. For instance, C<[0-9]> matches any ASCII digit, and C<[a-m]>
+matches any lowercase letter from the first half of the ASCII alphabet.
+
+Note that the two characters on either side of the hyphen are not
+necessary both letters or both digits. Any character is possible,
+although not advisable. C<['-?]> contains a range of characters, but
+most people will not know which characters that will be. Furthermore,
+such ranges may lead to portability problems if the code has to run on
+a platform that uses a different character set, such as EBCDIC.
+
+If a hyphen in a character class cannot be part of a range, for instance
+because it is the first or the last character of the character class,
+or if it immediately follows a range, the hyphen isn't special, and will be
+considered a character that may be matched. You have to escape the hyphen
+with a backslash if you want to have a hyphen in your set of characters to
+be matched, and its position in the class is such that it can be considered
+part of a range.
+
+Examples:
+
+ [a-z] # Matches a character that is a lower case ASCII letter.
+ [a-fz] # Matches any letter between 'a' and 'f' (inclusive) or the
+ # letter 'z'.
+ [-z] # Matches either a hyphen ('-') or the letter 'z'.
+ [a-f-m] # Matches any letter between 'a' and 'f' (inclusive), the
+ # hyphen ('-'), or the letter 'm'.
+ ['-?] # Matches any of the characters '()*+,-./0123456789:;<=>?
+ # (But not on an EBCDIC platform).
+
+
+=head3 Negation
+
+It is also possible to instead list the characters you do not want to
+match. You can do so by using a caret (C<^>) as the first character in the
+character class. For instance, C<[^a-z]> matches a character that is not a
+lowercase ASCII letter.
+
+This syntax make the caret a special character inside a bracketed character
+class, but only if it is the first character of the class. So if you want
+to have the caret as one of the characters you want to match, you either
+have to escape the caret, or not list it first.
+
+Examples:
+
+ "e" =~ /[^aeiou]/ # No match, the 'e' is listed.
+ "x" =~ /[^aeiou]/ # Match, as 'x' isn't a lowercase vowel.
+ "^" =~ /[^^]/ # No match, matches anything that isn't a caret.
+ "^" =~ /[x^]/ # Match, caret is not special here.
+
+=head3 Backslash Sequences
+
+You can put a backslash sequence character class inside a bracketed character
+class, and it will act just as if you put all the characters matched by
+the backslash sequence inside the character class. For instance,
+C<[a-f\d]> will match any digit, or any of the lowercase letters between
+'a' and 'f' inclusive.
+
+Examples:
+
+ /[\p{Thai}\d]/ # Matches a character that is either a Thai
+ # character, or a digit.
+ /[^\p{Arabic}()]/ # Matches a character that is neither an Arabic
+ # character, nor a parenthesis.
+
+Backslash sequence character classes cannot form one of the endpoints
+of a range.
+
+=head3 Posix Character Classes
+
+Posix character classes have the form C<[:class:]>, where I<class> is
+name, and the C<[:> and C<:]> delimiters. Posix character classes appear
+I<inside> bracketed character classes, and are a convenient and descriptive
+way of listing a group of characters. Be careful about the syntax,
+
+ # Correct:
+ $string =~ /[[:alpha:]]/
+
+ # Incorrect (will warn):
+ $string =~ /[:alpha:]/
+
+The latter pattern would be a character class consisting of a colon,
+and the letters C<a>, C<l>, C<p> and C<h>.
+
+Perl recognizes the following POSIX character classes:
+
+ alpha Any alphabetical character.
+ alnum Any alphanumerical character.
+ ascii Any ASCII character.
+ blank A GNU extension, equal to a space or a horizontal tab ("\t").
+ cntrl Any control character.
+ digit Any digit, equivalent to "\d".
+ graph Any printable character, excluding a space.
+ lower Any lowercase character.
+ print Any printable character, including a space.
+ punct Any punctuation character.
+ space Any white space character. "\s" plus the vertical tab ("\cK").
+ upper Any uppercase character.
+ word Any "word" character, equivalent to "\w".
+ xdigit Any hexadecimal digit, '0' - '9', 'a' - 'f', 'A' - 'F'.
+
+The exact set of characters matched depends on whether the source string
+is internally in UTF-8 format or not. See L</Locale, Unicode and UTF-8>.
+
+Most POSIX character classes have C<\p> counterparts. The difference
+is that the C<\p> classes will always match according to the Unicode
+properties, regardless whether the string is in UTF-8 format or not.
+
+The following table shows the relation between POSIX character classes
+and the Unicode properties:
+
+ [[:...:]] \p{...} backslash
+
+ alpha IsAlpha
+ alnum IsAlnum
+ ascii IsASCII
+ blank
+ cntrl IsCntrl
+ digit IsDigit \d
+ graph IsGraph
+ lower IsLower
+ print IsPrint
+ punct IsPunct
+ space IsSpace
+ IsSpacePerl \s
+ upper IsUpper
+ word IsWord
+ xdigit IsXDigit
+
+Some character classes may have a non-obvious name:
+
+=over 4
+
+=item cntrl
+
+Any control character. Usually, control characters don't produce output
+as such, but instead control the terminal somehow: for example newline
+and backspace are control characters. All characters with C<ord()> less
+than 32 are usually classified as control characters (in ASCII, the ISO
+Latin character sets, and Unicode), as is the character C<ord()> value
+of 127 (C<DEL>).
+
+=item graph
+
+Any character that is I<graphical>, that is, visible. This class consists
+of all the alphanumerical characters and all punctuation characters.
+
+=item print
+
+All printable characters, which is the set of all the graphical characters
+plus the space.
+
+=item punct
+
+Any punctuation (special) character.
+
+=back
+
+=head4 Negation
+
+A Perl extension to the POSIX character class is the ability to
+negate it. This is done by prefixing the class name with a caret (C<^>).
+Some examples:
+
+ POSIX Unicode Backslash
+ [[:^digit:]] \P{IsDigit} \D
+ [[:^space:]] \P{IsSpace} \S
+ [[:^word:]] \P{IsWord} \W
+
+=head4 [= =] and [. .]
+
+Perl will recognize the POSIX character classes C<[=class=]>, and
+C<[.class.]>, but does not (yet?) support this construct. Use of
+such a construct will lead to an error.
+
+
+=head4 Examples
+
+ /[[:digit:]]/ # Matches a character that is a digit.
+ /[01[:lower:]]/ # Matches a character that is either a
+ # lowercase letter, or '0' or '1'.
+ /[[:digit:][:^xdigit:]]/ # Matches a character that can be anything,
+ # but the letters 'a' to 'f' in either case.
+ # This is because the character class contains
+ # all digits, and anything that isn't a
+ # hex digit, resulting in a class containing
+ # all characters, but the letters 'a' to 'f'
+ # and 'A' to 'F'.
+
+
+=head2 Locale, Unicode and UTF-8
+
+Some of the character classes have a somewhat different behaviour depending
+on the internal encoding of the source string, and the locale that is
+in effect.
+
+C<\w>, C<\d>, C<\s> and the POSIX character classes (and their negations,
+including C<\W>, C<\D>, C<\S>) suffer from this behaviour.
+
+The rule is that if the source string is in UTF-8 format, the character
+classes match according to the Unicode properties. If the source string
+isn't, then the character classes match according to whatever locale is
+in effect. If there is no locale, they match the ASCII defaults
+(52 letters, 10 digits and underscore for C<\w>, 0 to 9 for C<\d>, etc).
+
+This usually means that if you are matching against characters whose C<ord()>
+values are between 128 and 255 inclusive, your character class may match
+or not depending on the current locale, and whether the source string is
+in UTF-8 format. The string will be in UTF-8 format if it contains
+characters whose C<ord()> value exceeds 255. But a string may be in UTF-8
+format without it having such characters.
+
+For portability reasons, it may be better to not use C<\w>, C<\d>, C<\s>
+or the POSIX character classes, and use the Unicode properties instead.
+
+=head4 Examples
+
+ $str = "\xDF"; # $str is not in UTF-8 format.
+ $str =~ /^\w/; # No match, as $str isn't in UTF-8 format.
+ $str .= "\x{0e0b}"; # Now $str is in UTF-8 format.
+ $str =~ /^\w/; # Match! $str is now in UTF-8 format.
+ chop $str;
+ $str =~ /^\w/; # Still a match! $str remains in UTF-8 format.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlref.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlref.pod
new file mode 100755
index 00000000000..550f4c14d21
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlref.pod
@@ -0,0 +1,686 @@
+=head1 NAME
+X<reference> X<pointer> X<data structure> X<structure> X<struct>
+
+perlref - Perl references and nested data structures
+
+=head1 NOTE
+
+This is complete documentation about all aspects of references.
+For a shorter, tutorial introduction to just the essential features,
+see L<perlreftut>.
+
+=head1 DESCRIPTION
+
+Before release 5 of Perl it was difficult to represent complex data
+structures, because all references had to be symbolic--and even then
+it was difficult to refer to a variable instead of a symbol table entry.
+Perl now not only makes it easier to use symbolic references to variables,
+but also lets you have "hard" references to any piece of data or code.
+Any scalar may hold a hard reference. Because arrays and hashes contain
+scalars, you can now easily build arrays of arrays, arrays of hashes,
+hashes of arrays, arrays of hashes of functions, and so on.
+
+Hard references are smart--they keep track of reference counts for you,
+automatically freeing the thing referred to when its reference count goes
+to zero. (Reference counts for values in self-referential or
+cyclic data structures may not go to zero without a little help; see
+L<perlobj/"Two-Phased Garbage Collection"> for a detailed explanation.)
+If that thing happens to be an object, the object is destructed. See
+L<perlobj> for more about objects. (In a sense, everything in Perl is an
+object, but we usually reserve the word for references to objects that
+have been officially "blessed" into a class package.)
+
+Symbolic references are names of variables or other objects, just as a
+symbolic link in a Unix filesystem contains merely the name of a file.
+The C<*glob> notation is something of a symbolic reference. (Symbolic
+references are sometimes called "soft references", but please don't call
+them that; references are confusing enough without useless synonyms.)
+X<reference, symbolic> X<reference, soft>
+X<symbolic reference> X<soft reference>
+
+In contrast, hard references are more like hard links in a Unix file
+system: They are used to access an underlying object without concern for
+what its (other) name is. When the word "reference" is used without an
+adjective, as in the following paragraph, it is usually talking about a
+hard reference.
+X<reference, hard> X<hard reference>
+
+References are easy to use in Perl. There is just one overriding
+principle: Perl does no implicit referencing or dereferencing. When a
+scalar is holding a reference, it always behaves as a simple scalar. It
+doesn't magically start being an array or hash or subroutine; you have to
+tell it explicitly to do so, by dereferencing it.
+
+=head2 Making References
+X<reference, creation> X<referencing>
+
+References can be created in several ways.
+
+=over 4
+
+=item 1.
+X<\> X<backslash>
+
+By using the backslash operator on a variable, subroutine, or value.
+(This works much like the & (address-of) operator in C.)
+This typically creates I<another> reference to a variable, because
+there's already a reference to the variable in the symbol table. But
+the symbol table reference might go away, and you'll still have the
+reference that the backslash returned. Here are some examples:
+
+ $scalarref = \$foo;
+ $arrayref = \@ARGV;
+ $hashref = \%ENV;
+ $coderef = \&handler;
+ $globref = \*foo;
+
+It isn't possible to create a true reference to an IO handle (filehandle
+or dirhandle) using the backslash operator. The most you can get is a
+reference to a typeglob, which is actually a complete symbol table entry.
+But see the explanation of the C<*foo{THING}> syntax below. However,
+you can still use type globs and globrefs as though they were IO handles.
+
+=item 2.
+X<array, anonymous> X<[> X<[]> X<square bracket>
+X<bracket, square> X<arrayref> X<array reference> X<reference, array>
+
+A reference to an anonymous array can be created using square
+brackets:
+
+ $arrayref = [1, 2, ['a', 'b', 'c']];
+
+Here we've created a reference to an anonymous array of three elements
+whose final element is itself a reference to another anonymous array of three
+elements. (The multidimensional syntax described later can be used to
+access this. For example, after the above, C<< $arrayref->[2][1] >> would have
+the value "b".)
+
+Taking a reference to an enumerated list is not the same
+as using square brackets--instead it's the same as creating
+a list of references!
+
+ @list = (\$a, \@b, \%c);
+ @list = \($a, @b, %c); # same thing!
+
+As a special case, C<\(@foo)> returns a list of references to the contents
+of C<@foo>, not a reference to C<@foo> itself. Likewise for C<%foo>,
+except that the key references are to copies (since the keys are just
+strings rather than full-fledged scalars).
+
+=item 3.
+X<hash, anonymous> X<{> X<{}> X<curly bracket>
+X<bracket, curly> X<brace> X<hashref> X<hash reference> X<reference, hash>
+
+A reference to an anonymous hash can be created using curly
+brackets:
+
+ $hashref = {
+ 'Adam' => 'Eve',
+ 'Clyde' => 'Bonnie',
+ };
+
+Anonymous hash and array composers like these can be intermixed freely to
+produce as complicated a structure as you want. The multidimensional
+syntax described below works for these too. The values above are
+literals, but variables and expressions would work just as well, because
+assignment operators in Perl (even within local() or my()) are executable
+statements, not compile-time declarations.
+
+Because curly brackets (braces) are used for several other things
+including BLOCKs, you may occasionally have to disambiguate braces at the
+beginning of a statement by putting a C<+> or a C<return> in front so
+that Perl realizes the opening brace isn't starting a BLOCK. The economy and
+mnemonic value of using curlies is deemed worth this occasional extra
+hassle.
+
+For example, if you wanted a function to make a new hash and return a
+reference to it, you have these options:
+
+ sub hashem { { @_ } } # silently wrong
+ sub hashem { +{ @_ } } # ok
+ sub hashem { return { @_ } } # ok
+
+On the other hand, if you want the other meaning, you can do this:
+
+ sub showem { { @_ } } # ambiguous (currently ok, but may change)
+ sub showem { {; @_ } } # ok
+ sub showem { { return @_ } } # ok
+
+The leading C<+{> and C<{;> always serve to disambiguate
+the expression to mean either the HASH reference, or the BLOCK.
+
+=item 4.
+X<subroutine, anonymous> X<subroutine, reference> X<reference, subroutine>
+X<scope, lexical> X<closure> X<lexical> X<lexical scope>
+
+A reference to an anonymous subroutine can be created by using
+C<sub> without a subname:
+
+ $coderef = sub { print "Boink!\n" };
+
+Note the semicolon. Except for the code
+inside not being immediately executed, a C<sub {}> is not so much a
+declaration as it is an operator, like C<do{}> or C<eval{}>. (However, no
+matter how many times you execute that particular line (unless you're in an
+C<eval("...")>), $coderef will still have a reference to the I<same>
+anonymous subroutine.)
+
+Anonymous subroutines act as closures with respect to my() variables,
+that is, variables lexically visible within the current scope. Closure
+is a notion out of the Lisp world that says if you define an anonymous
+function in a particular lexical context, it pretends to run in that
+context even when it's called outside the context.
+
+In human terms, it's a funny way of passing arguments to a subroutine when
+you define it as well as when you call it. It's useful for setting up
+little bits of code to run later, such as callbacks. You can even
+do object-oriented stuff with it, though Perl already provides a different
+mechanism to do that--see L<perlobj>.
+
+You might also think of closure as a way to write a subroutine
+template without using eval(). Here's a small example of how
+closures work:
+
+ sub newprint {
+ my $x = shift;
+ return sub { my $y = shift; print "$x, $y!\n"; };
+ }
+ $h = newprint("Howdy");
+ $g = newprint("Greetings");
+
+ # Time passes...
+
+ &$h("world");
+ &$g("earthlings");
+
+This prints
+
+ Howdy, world!
+ Greetings, earthlings!
+
+Note particularly that $x continues to refer to the value passed
+into newprint() I<despite> "my $x" having gone out of scope by the
+time the anonymous subroutine runs. That's what a closure is all
+about.
+
+This applies only to lexical variables, by the way. Dynamic variables
+continue to work as they have always worked. Closure is not something
+that most Perl programmers need trouble themselves about to begin with.
+
+=item 5.
+X<constructor> X<new>
+
+References are often returned by special subroutines called constructors. Perl
+objects are just references to a special type of object that happens to know
+which package it's associated with. Constructors are just special subroutines
+that know how to create that association. They do so by starting with an
+ordinary reference, and it remains an ordinary reference even while it's also
+being an object. Constructors are often named C<new()>. You I<can> call them
+indirectly:
+
+ $objref = new Doggie( Tail => 'short', Ears => 'long' );
+
+But that can produce ambiguous syntax in certain cases, so it's often
+better to use the direct method invocation approach:
+
+ $objref = Doggie->new(Tail => 'short', Ears => 'long');
+
+ use Term::Cap;
+ $terminal = Term::Cap->Tgetent( { OSPEED => 9600 });
+
+ use Tk;
+ $main = MainWindow->new();
+ $menubar = $main->Frame(-relief => "raised",
+ -borderwidth => 2)
+
+=item 6.
+X<autovivification>
+
+References of the appropriate type can spring into existence if you
+dereference them in a context that assumes they exist. Because we haven't
+talked about dereferencing yet, we can't show you any examples yet.
+
+=item 7.
+X<*foo{THING}> X<*>
+
+A reference can be created by using a special syntax, lovingly known as
+the *foo{THING} syntax. *foo{THING} returns a reference to the THING
+slot in *foo (which is the symbol table entry which holds everything
+known as foo).
+
+ $scalarref = *foo{SCALAR};
+ $arrayref = *ARGV{ARRAY};
+ $hashref = *ENV{HASH};
+ $coderef = *handler{CODE};
+ $ioref = *STDIN{IO};
+ $globref = *foo{GLOB};
+ $formatref = *foo{FORMAT};
+
+All of these are self-explanatory except for C<*foo{IO}>. It returns
+the IO handle, used for file handles (L<perlfunc/open>), sockets
+(L<perlfunc/socket> and L<perlfunc/socketpair>), and directory
+handles (L<perlfunc/opendir>). For compatibility with previous
+versions of Perl, C<*foo{FILEHANDLE}> is a synonym for C<*foo{IO}>, though it
+is deprecated as of 5.8.0. If deprecation warnings are in effect, it will warn
+of its use.
+
+C<*foo{THING}> returns undef if that particular THING hasn't been used yet,
+except in the case of scalars. C<*foo{SCALAR}> returns a reference to an
+anonymous scalar if $foo hasn't been used yet. This might change in a
+future release.
+
+C<*foo{IO}> is an alternative to the C<*HANDLE> mechanism given in
+L<perldata/"Typeglobs and Filehandles"> for passing filehandles
+into or out of subroutines, or storing into larger data structures.
+Its disadvantage is that it won't create a new filehandle for you.
+Its advantage is that you have less risk of clobbering more than
+you want to with a typeglob assignment. (It still conflates file
+and directory handles, though.) However, if you assign the incoming
+value to a scalar instead of a typeglob as we do in the examples
+below, there's no risk of that happening.
+
+ splutter(*STDOUT); # pass the whole glob
+ splutter(*STDOUT{IO}); # pass both file and dir handles
+
+ sub splutter {
+ my $fh = shift;
+ print $fh "her um well a hmmm\n";
+ }
+
+ $rec = get_rec(*STDIN); # pass the whole glob
+ $rec = get_rec(*STDIN{IO}); # pass both file and dir handles
+
+ sub get_rec {
+ my $fh = shift;
+ return scalar <$fh>;
+ }
+
+=back
+
+=head2 Using References
+X<reference, use> X<dereferencing> X<dereference>
+
+That's it for creating references. By now you're probably dying to
+know how to use references to get back to your long-lost data. There
+are several basic methods.
+
+=over 4
+
+=item 1.
+
+Anywhere you'd put an identifier (or chain of identifiers) as part
+of a variable or subroutine name, you can replace the identifier with
+a simple scalar variable containing a reference of the correct type:
+
+ $bar = $$scalarref;
+ push(@$arrayref, $filename);
+ $$arrayref[0] = "January";
+ $$hashref{"KEY"} = "VALUE";
+ &$coderef(1,2,3);
+ print $globref "output\n";
+
+It's important to understand that we are specifically I<not> dereferencing
+C<$arrayref[0]> or C<$hashref{"KEY"}> there. The dereference of the
+scalar variable happens I<before> it does any key lookups. Anything more
+complicated than a simple scalar variable must use methods 2 or 3 below.
+However, a "simple scalar" includes an identifier that itself uses method
+1 recursively. Therefore, the following prints "howdy".
+
+ $refrefref = \\\"howdy";
+ print $$$$refrefref;
+
+=item 2.
+
+Anywhere you'd put an identifier (or chain of identifiers) as part of a
+variable or subroutine name, you can replace the identifier with a
+BLOCK returning a reference of the correct type. In other words, the
+previous examples could be written like this:
+
+ $bar = ${$scalarref};
+ push(@{$arrayref}, $filename);
+ ${$arrayref}[0] = "January";
+ ${$hashref}{"KEY"} = "VALUE";
+ &{$coderef}(1,2,3);
+ $globref->print("output\n"); # iff IO::Handle is loaded
+
+Admittedly, it's a little silly to use the curlies in this case, but
+the BLOCK can contain any arbitrary expression, in particular,
+subscripted expressions:
+
+ &{ $dispatch{$index} }(1,2,3); # call correct routine
+
+Because of being able to omit the curlies for the simple case of C<$$x>,
+people often make the mistake of viewing the dereferencing symbols as
+proper operators, and wonder about their precedence. If they were,
+though, you could use parentheses instead of braces. That's not the case.
+Consider the difference below; case 0 is a short-hand version of case 1,
+I<not> case 2:
+
+ $$hashref{"KEY"} = "VALUE"; # CASE 0
+ ${$hashref}{"KEY"} = "VALUE"; # CASE 1
+ ${$hashref{"KEY"}} = "VALUE"; # CASE 2
+ ${$hashref->{"KEY"}} = "VALUE"; # CASE 3
+
+Case 2 is also deceptive in that you're accessing a variable
+called %hashref, not dereferencing through $hashref to the hash
+it's presumably referencing. That would be case 3.
+
+=item 3.
+
+Subroutine calls and lookups of individual array elements arise often
+enough that it gets cumbersome to use method 2. As a form of
+syntactic sugar, the examples for method 2 may be written:
+
+ $arrayref->[0] = "January"; # Array element
+ $hashref->{"KEY"} = "VALUE"; # Hash element
+ $coderef->(1,2,3); # Subroutine call
+
+The left side of the arrow can be any expression returning a reference,
+including a previous dereference. Note that C<$array[$x]> is I<not> the
+same thing as C<< $array->[$x] >> here:
+
+ $array[$x]->{"foo"}->[0] = "January";
+
+This is one of the cases we mentioned earlier in which references could
+spring into existence when in an lvalue context. Before this
+statement, C<$array[$x]> may have been undefined. If so, it's
+automatically defined with a hash reference so that we can look up
+C<{"foo"}> in it. Likewise C<< $array[$x]->{"foo"} >> will automatically get
+defined with an array reference so that we can look up C<[0]> in it.
+This process is called I<autovivification>.
+
+One more thing here. The arrow is optional I<between> brackets
+subscripts, so you can shrink the above down to
+
+ $array[$x]{"foo"}[0] = "January";
+
+Which, in the degenerate case of using only ordinary arrays, gives you
+multidimensional arrays just like C's:
+
+ $score[$x][$y][$z] += 42;
+
+Well, okay, not entirely like C's arrays, actually. C doesn't know how
+to grow its arrays on demand. Perl does.
+
+=item 4.
+
+If a reference happens to be a reference to an object, then there are
+probably methods to access the things referred to, and you should probably
+stick to those methods unless you're in the class package that defines the
+object's methods. In other words, be nice, and don't violate the object's
+encapsulation without a very good reason. Perl does not enforce
+encapsulation. We are not totalitarians here. We do expect some basic
+civility though.
+
+=back
+
+Using a string or number as a reference produces a symbolic reference,
+as explained above. Using a reference as a number produces an
+integer representing its storage location in memory. The only
+useful thing to be done with this is to compare two references
+numerically to see whether they refer to the same location.
+X<reference, numeric context>
+
+ if ($ref1 == $ref2) { # cheap numeric compare of references
+ print "refs 1 and 2 refer to the same thing\n";
+ }
+
+Using a reference as a string produces both its referent's type,
+including any package blessing as described in L<perlobj>, as well
+as the numeric address expressed in hex. The ref() operator returns
+just the type of thing the reference is pointing to, without the
+address. See L<perlfunc/ref> for details and examples of its use.
+X<reference, string context>
+
+The bless() operator may be used to associate the object a reference
+points to with a package functioning as an object class. See L<perlobj>.
+
+A typeglob may be dereferenced the same way a reference can, because
+the dereference syntax always indicates the type of reference desired.
+So C<${*foo}> and C<${\$foo}> both indicate the same scalar variable.
+
+Here's a trick for interpolating a subroutine call into a string:
+
+ print "My sub returned @{[mysub(1,2,3)]} that time.\n";
+
+The way it works is that when the C<@{...}> is seen in the double-quoted
+string, it's evaluated as a block. The block creates a reference to an
+anonymous array containing the results of the call to C<mysub(1,2,3)>. So
+the whole block returns a reference to an array, which is then
+dereferenced by C<@{...}> and stuck into the double-quoted string. This
+chicanery is also useful for arbitrary expressions:
+
+ print "That yields @{[$n + 5]} widgets\n";
+
+Similarly, an expression that returns a reference to a scalar can be
+dereferenced via C<${...}>. Thus, the above expression may be written
+as:
+
+ print "That yields ${\($n + 5)} widgets\n";
+
+=head2 Symbolic references
+X<reference, symbolic> X<reference, soft>
+X<symbolic reference> X<soft reference>
+
+We said that references spring into existence as necessary if they are
+undefined, but we didn't say what happens if a value used as a
+reference is already defined, but I<isn't> a hard reference. If you
+use it as a reference, it'll be treated as a symbolic
+reference. That is, the value of the scalar is taken to be the I<name>
+of a variable, rather than a direct link to a (possibly) anonymous
+value.
+
+People frequently expect it to work like this. So it does.
+
+ $name = "foo";
+ $$name = 1; # Sets $foo
+ ${$name} = 2; # Sets $foo
+ ${$name x 2} = 3; # Sets $foofoo
+ $name->[0] = 4; # Sets $foo[0]
+ @$name = (); # Clears @foo
+ &$name(); # Calls &foo() (as in Perl 4)
+ $pack = "THAT";
+ ${"${pack}::$name"} = 5; # Sets $THAT::foo without eval
+
+This is powerful, and slightly dangerous, in that it's possible
+to intend (with the utmost sincerity) to use a hard reference, and
+accidentally use a symbolic reference instead. To protect against
+that, you can say
+
+ use strict 'refs';
+
+and then only hard references will be allowed for the rest of the enclosing
+block. An inner block may countermand that with
+
+ no strict 'refs';
+
+Only package variables (globals, even if localized) are visible to
+symbolic references. Lexical variables (declared with my()) aren't in
+a symbol table, and thus are invisible to this mechanism. For example:
+
+ local $value = 10;
+ $ref = "value";
+ {
+ my $value = 20;
+ print $$ref;
+ }
+
+This will still print 10, not 20. Remember that local() affects package
+variables, which are all "global" to the package.
+
+=head2 Not-so-symbolic references
+
+A new feature contributing to readability in perl version 5.001 is that the
+brackets around a symbolic reference behave more like quotes, just as they
+always have within a string. That is,
+
+ $push = "pop on ";
+ print "${push}over";
+
+has always meant to print "pop on over", even though push is
+a reserved word. This has been generalized to work the same outside
+of quotes, so that
+
+ print ${push} . "over";
+
+and even
+
+ print ${ push } . "over";
+
+will have the same effect. (This would have been a syntax error in
+Perl 5.000, though Perl 4 allowed it in the spaceless form.) This
+construct is I<not> considered to be a symbolic reference when you're
+using strict refs:
+
+ use strict 'refs';
+ ${ bareword }; # Okay, means $bareword.
+ ${ "bareword" }; # Error, symbolic reference.
+
+Similarly, because of all the subscripting that is done using single
+words, we've applied the same rule to any bareword that is used for
+subscripting a hash. So now, instead of writing
+
+ $array{ "aaa" }{ "bbb" }{ "ccc" }
+
+you can write just
+
+ $array{ aaa }{ bbb }{ ccc }
+
+and not worry about whether the subscripts are reserved words. In the
+rare event that you do wish to do something like
+
+ $array{ shift }
+
+you can force interpretation as a reserved word by adding anything that
+makes it more than a bareword:
+
+ $array{ shift() }
+ $array{ +shift }
+ $array{ shift @_ }
+
+The C<use warnings> pragma or the B<-w> switch will warn you if it
+interprets a reserved word as a string.
+But it will no longer warn you about using lowercase words, because the
+string is effectively quoted.
+
+=head2 Pseudo-hashes: Using an array as a hash
+X<pseudo-hash> X<pseudo hash> X<pseudohash>
+
+Pseudo-hashes have been removed from Perl. The 'fields' pragma
+remains available.
+
+=head2 Function Templates
+X<scope, lexical> X<closure> X<lexical> X<lexical scope>
+X<subroutine, nested> X<sub, nested> X<subroutine, local> X<sub, local>
+
+As explained above, an anonymous function with access to the lexical
+variables visible when that function was compiled, creates a closure. It
+retains access to those variables even though it doesn't get run until
+later, such as in a signal handler or a Tk callback.
+
+Using a closure as a function template allows us to generate many functions
+that act similarly. Suppose you wanted functions named after the colors
+that generated HTML font changes for the various colors:
+
+ print "Be ", red("careful"), "with that ", green("light");
+
+The red() and green() functions would be similar. To create these,
+we'll assign a closure to a typeglob of the name of the function we're
+trying to build.
+
+ @colors = qw(red blue green yellow orange purple violet);
+ for my $name (@colors) {
+ no strict 'refs'; # allow symbol table manipulation
+ *$name = *{uc $name} = sub { "<FONT COLOR='$name'>@_</FONT>" };
+ }
+
+Now all those different functions appear to exist independently. You can
+call red(), RED(), blue(), BLUE(), green(), etc. This technique saves on
+both compile time and memory use, and is less error-prone as well, since
+syntax checks happen at compile time. It's critical that any variables in
+the anonymous subroutine be lexicals in order to create a proper closure.
+That's the reasons for the C<my> on the loop iteration variable.
+
+This is one of the only places where giving a prototype to a closure makes
+much sense. If you wanted to impose scalar context on the arguments of
+these functions (probably not a wise idea for this particular example),
+you could have written it this way instead:
+
+ *$name = sub ($) { "<FONT COLOR='$name'>$_[0]</FONT>" };
+
+However, since prototype checking happens at compile time, the assignment
+above happens too late to be of much use. You could address this by
+putting the whole loop of assignments within a BEGIN block, forcing it
+to occur during compilation.
+
+Access to lexicals that change over time--like those in the C<for> loop
+above, basically aliases to elements from the surrounding lexical scopes--
+only works with anonymous subs, not with named subroutines. Generally
+said, named subroutines do not nest properly and should only be declared
+in the main package scope.
+
+This is because named subroutines are created at compile time so their
+lexical variables get assigned to the parent lexicals from the first
+execution of the parent block. If a parent scope is entered a second
+time, its lexicals are created again, while the nested subs still
+reference the old ones.
+
+Anonymous subroutines get to capture each time you execute the C<sub>
+operator, as they are created on the fly. If you are accustomed to using
+nested subroutines in other programming languages with their own private
+variables, you'll have to work at it a bit in Perl. The intuitive coding
+of this type of thing incurs mysterious warnings about "will not stay
+shared" due to the reasons explained above.
+For example, this won't work:
+
+ sub outer {
+ my $x = $_[0] + 35;
+ sub inner { return $x * 19 } # WRONG
+ return $x + inner();
+ }
+
+A work-around is the following:
+
+ sub outer {
+ my $x = $_[0] + 35;
+ local *inner = sub { return $x * 19 };
+ return $x + inner();
+ }
+
+Now inner() can only be called from within outer(), because of the
+temporary assignments of the anonymous subroutine. But when it does,
+it has normal access to the lexical variable $x from the scope of
+outer() at the time outer is invoked.
+
+This has the interesting effect of creating a function local to another
+function, something not normally supported in Perl.
+
+=head1 WARNING
+X<reference, string context> X<reference, use as hash key>
+
+You may not (usefully) use a reference as the key to a hash. It will be
+converted into a string:
+
+ $x{ \$a } = $a;
+
+If you try to dereference the key, it won't do a hard dereference, and
+you won't accomplish what you're attempting. You might want to do something
+more like
+
+ $r = \@a;
+ $x{ $r } = $r;
+
+And then at least you can use the values(), which will be
+real refs, instead of the keys(), which won't.
+
+The standard Tie::RefHash module provides a convenient workaround to this.
+
+=head1 SEE ALSO
+
+Besides the obvious documents, source code can be instructive.
+Some pathological examples of the use of references can be found
+in the F<t/op/ref.t> regression test in the Perl source directory.
+
+See also L<perldsc> and L<perllol> for how to use references to create
+complex data structures, and L<perltoot>, L<perlobj>, and L<perlbot>
+for how to use them to create objects.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlreftut.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlreftut.pod
new file mode 100755
index 00000000000..7898b6db53c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlreftut.pod
@@ -0,0 +1,527 @@
+=head1 NAME
+
+perlreftut - Mark's very short tutorial about references
+
+=head1 DESCRIPTION
+
+One of the most important new features in Perl 5 was the capability to
+manage complicated data structures like multidimensional arrays and
+nested hashes. To enable these, Perl 5 introduced a feature called
+`references', and using references is the key to managing complicated,
+structured data in Perl. Unfortunately, there's a lot of funny syntax
+to learn, and the main manual page can be hard to follow. The manual
+is quite complete, and sometimes people find that a problem, because
+it can be hard to tell what is important and what isn't.
+
+Fortunately, you only need to know 10% of what's in the main page to get
+90% of the benefit. This page will show you that 10%.
+
+=head1 Who Needs Complicated Data Structures?
+
+One problem that came up all the time in Perl 4 was how to represent a
+hash whose values were lists. Perl 4 had hashes, of course, but the
+values had to be scalars; they couldn't be lists.
+
+Why would you want a hash of lists? Let's take a simple example: You
+have a file of city and country names, like this:
+
+ Chicago, USA
+ Frankfurt, Germany
+ Berlin, Germany
+ Washington, USA
+ Helsinki, Finland
+ New York, USA
+
+and you want to produce an output like this, with each country mentioned
+once, and then an alphabetical list of the cities in that country:
+
+ Finland: Helsinki.
+ Germany: Berlin, Frankfurt.
+ USA: Chicago, New York, Washington.
+
+The natural way to do this is to have a hash whose keys are country
+names. Associated with each country name key is a list of the cities in
+that country. Each time you read a line of input, split it into a country
+and a city, look up the list of cities already known to be in that
+country, and append the new city to the list. When you're done reading
+the input, iterate over the hash as usual, sorting each list of cities
+before you print it out.
+
+If hash values can't be lists, you lose. In Perl 4, hash values can't
+be lists; they can only be strings. You lose. You'd probably have to
+combine all the cities into a single string somehow, and then when
+time came to write the output, you'd have to break the string into a
+list, sort the list, and turn it back into a string. This is messy
+and error-prone. And it's frustrating, because Perl already has
+perfectly good lists that would solve the problem if only you could
+use them.
+
+=head1 The Solution
+
+By the time Perl 5 rolled around, we were already stuck with this
+design: Hash values must be scalars. The solution to this is
+references.
+
+A reference is a scalar value that I<refers to> an entire array or an
+entire hash (or to just about anything else). Names are one kind of
+reference that you're already familiar with. Think of the President
+of the United States: a messy, inconvenient bag of blood and bones.
+But to talk about him, or to represent him in a computer program, all
+you need is the easy, convenient scalar string "Barack Obama".
+
+References in Perl are like names for arrays and hashes. They're
+Perl's private, internal names, so you can be sure they're
+unambiguous. Unlike "Barack Obama", a reference only refers to one
+thing, and you always know what it refers to. If you have a reference
+to an array, you can recover the entire array from it. If you have a
+reference to a hash, you can recover the entire hash. But the
+reference is still an easy, compact scalar value.
+
+You can't have a hash whose values are arrays; hash values can only be
+scalars. We're stuck with that. But a single reference can refer to
+an entire array, and references are scalars, so you can have a hash of
+references to arrays, and it'll act a lot like a hash of arrays, and
+it'll be just as useful as a hash of arrays.
+
+We'll come back to this city-country problem later, after we've seen
+some syntax for managing references.
+
+
+=head1 Syntax
+
+There are just two ways to make a reference, and just two ways to use
+it once you have it.
+
+=head2 Making References
+
+=head3 B<Make Rule 1>
+
+If you put a C<\> in front of a variable, you get a
+reference to that variable.
+
+ $aref = \@array; # $aref now holds a reference to @array
+ $href = \%hash; # $href now holds a reference to %hash
+ $sref = \$scalar; # $sref now holds a reference to $scalar
+
+Once the reference is stored in a variable like $aref or $href, you
+can copy it or store it just the same as any other scalar value:
+
+ $xy = $aref; # $xy now holds a reference to @array
+ $p[3] = $href; # $p[3] now holds a reference to %hash
+ $z = $p[3]; # $z now holds a reference to %hash
+
+
+These examples show how to make references to variables with names.
+Sometimes you want to make an array or a hash that doesn't have a
+name. This is analogous to the way you like to be able to use the
+string C<"\n"> or the number 80 without having to store it in a named
+variable first.
+
+B<Make Rule 2>
+
+C<[ ITEMS ]> makes a new, anonymous array, and returns a reference to
+that array. C<{ ITEMS }> makes a new, anonymous hash, and returns a
+reference to that hash.
+
+ $aref = [ 1, "foo", undef, 13 ];
+ # $aref now holds a reference to an array
+
+ $href = { APR => 4, AUG => 8 };
+ # $href now holds a reference to a hash
+
+
+The references you get from rule 2 are the same kind of
+references that you get from rule 1:
+
+ # This:
+ $aref = [ 1, 2, 3 ];
+
+ # Does the same as this:
+ @array = (1, 2, 3);
+ $aref = \@array;
+
+
+The first line is an abbreviation for the following two lines, except
+that it doesn't create the superfluous array variable C<@array>.
+
+If you write just C<[]>, you get a new, empty anonymous array.
+If you write just C<{}>, you get a new, empty anonymous hash.
+
+
+=head2 Using References
+
+What can you do with a reference once you have it? It's a scalar
+value, and we've seen that you can store it as a scalar and get it back
+again just like any scalar. There are just two more ways to use it:
+
+=head3 B<Use Rule 1>
+
+You can always use an array reference, in curly braces, in place of
+the name of an array. For example, C<@{$aref}> instead of C<@array>.
+
+Here are some examples of that:
+
+Arrays:
+
+
+ @a @{$aref} An array
+ reverse @a reverse @{$aref} Reverse the array
+ $a[3] ${$aref}[3] An element of the array
+ $a[3] = 17; ${$aref}[3] = 17 Assigning an element
+
+
+On each line are two expressions that do the same thing. The
+left-hand versions operate on the array C<@a>. The right-hand
+versions operate on the array that is referred to by C<$aref>. Once
+they find the array they're operating on, both versions do the same
+things to the arrays.
+
+Using a hash reference is I<exactly> the same:
+
+ %h %{$href} A hash
+ keys %h keys %{$href} Get the keys from the hash
+ $h{'red'} ${$href}{'red'} An element of the hash
+ $h{'red'} = 17 ${$href}{'red'} = 17 Assigning an element
+
+Whatever you want to do with a reference, B<Use Rule 1> tells you how
+to do it. You just write the Perl code that you would have written
+for doing the same thing to a regular array or hash, and then replace
+the array or hash name with C<{$reference}>. "How do I loop over an
+array when all I have is a reference?" Well, to loop over an array, you
+would write
+
+ for my $element (@array) {
+ ...
+ }
+
+so replace the array name, C<@array>, with the reference:
+
+ for my $element (@{$aref}) {
+ ...
+ }
+
+"How do I print out the contents of a hash when all I have is a
+reference?" First write the code for printing out a hash:
+
+ for my $key (keys %hash) {
+ print "$key => $hash{$key}\n";
+ }
+
+And then replace the hash name with the reference:
+
+ for my $key (keys %{$href}) {
+ print "$key => ${$href}{$key}\n";
+ }
+
+=head3 B<Use Rule 2>
+
+B<Use Rule 1> is all you really need, because it tells you how to do
+absolutely everything you ever need to do with references. But the
+most common thing to do with an array or a hash is to extract a single
+element, and the B<Use Rule 1> notation is cumbersome. So there is an
+abbreviation.
+
+C<${$aref}[3]> is too hard to read, so you can write C<< $aref->[3] >>
+instead.
+
+C<${$href}{red}> is too hard to read, so you can write
+C<< $href->{red} >> instead.
+
+If C<$aref> holds a reference to an array, then C<< $aref->[3] >> is
+the fourth element of the array. Don't confuse this with C<$aref[3]>,
+which is the fourth element of a totally different array, one
+deceptively named C<@aref>. C<$aref> and C<@aref> are unrelated the
+same way that C<$item> and C<@item> are.
+
+Similarly, C<< $href->{'red'} >> is part of the hash referred to by
+the scalar variable C<$href>, perhaps even one with no name.
+C<$href{'red'}> is part of the deceptively named C<%href> hash. It's
+easy to forget to leave out the C<< -> >>, and if you do, you'll get
+bizarre results when your program gets array and hash elements out of
+totally unexpected hashes and arrays that weren't the ones you wanted
+to use.
+
+
+=head2 An Example
+
+Let's see a quick example of how all this is useful.
+
+First, remember that C<[1, 2, 3]> makes an anonymous array containing
+C<(1, 2, 3)>, and gives you a reference to that array.
+
+Now think about
+
+ @a = ( [1, 2, 3],
+ [4, 5, 6],
+ [7, 8, 9]
+ );
+
+@a is an array with three elements, and each one is a reference to
+another array.
+
+C<$a[1]> is one of these references. It refers to an array, the array
+containing C<(4, 5, 6)>, and because it is a reference to an array,
+B<Use Rule 2> says that we can write C<< $a[1]->[2] >> to get the
+third element from that array. C<< $a[1]->[2] >> is the 6.
+Similarly, C<< $a[0]->[1] >> is the 2. What we have here is like a
+two-dimensional array; you can write C<< $a[ROW]->[COLUMN] >> to get
+or set the element in any row and any column of the array.
+
+The notation still looks a little cumbersome, so there's one more
+abbreviation:
+
+=head2 Arrow Rule
+
+In between two B<subscripts>, the arrow is optional.
+
+Instead of C<< $a[1]->[2] >>, we can write C<$a[1][2]>; it means the
+same thing. Instead of C<< $a[0]->[1] = 23 >>, we can write
+C<$a[0][1] = 23>; it means the same thing.
+
+Now it really looks like two-dimensional arrays!
+
+You can see why the arrows are important. Without them, we would have
+had to write C<${$a[1]}[2]> instead of C<$a[1][2]>. For
+three-dimensional arrays, they let us write C<$x[2][3][5]> instead of
+the unreadable C<${${$x[2]}[3]}[5]>.
+
+=head1 Solution
+
+Here's the answer to the problem I posed earlier, of reformatting a
+file of city and country names.
+
+ 1 my %table;
+
+ 2 while (<>) {
+ 3 chomp;
+ 4 my ($city, $country) = split /, /;
+ 5 $table{$country} = [] unless exists $table{$country};
+ 6 push @{$table{$country}}, $city;
+ 7 }
+
+ 8 foreach $country (sort keys %table) {
+ 9 print "$country: ";
+ 10 my @cities = @{$table{$country}};
+ 11 print join ', ', sort @cities;
+ 12 print ".\n";
+ 13 }
+
+
+The program has two pieces: Lines 2--7 read the input and build a data
+structure, and lines 8-13 analyze the data and print out the report.
+We're going to have a hash, C<%table>, whose keys are country names,
+and whose values are references to arrays of city names. The data
+structure will look like this:
+
+
+ %table
+ +-------+---+
+ | | | +-----------+--------+
+ |Germany| *---->| Frankfurt | Berlin |
+ | | | +-----------+--------+
+ +-------+---+
+ | | | +----------+
+ |Finland| *---->| Helsinki |
+ | | | +----------+
+ +-------+---+
+ | | | +---------+------------+----------+
+ | USA | *---->| Chicago | Washington | New York |
+ | | | +---------+------------+----------+
+ +-------+---+
+
+We'll look at output first. Supposing we already have this structure,
+how do we print it out?
+
+ 8 foreach $country (sort keys %table) {
+ 9 print "$country: ";
+ 10 my @cities = @{$table{$country}};
+ 11 print join ', ', sort @cities;
+ 12 print ".\n";
+ 13 }
+
+C<%table> is an
+ordinary hash, and we get a list of keys from it, sort the keys, and
+loop over the keys as usual. The only use of references is in line 10.
+C<$table{$country}> looks up the key C<$country> in the hash
+and gets the value, which is a reference to an array of cities in that country.
+B<Use Rule 1> says that
+we can recover the array by saying
+C<@{$table{$country}}>. Line 10 is just like
+
+ @cities = @array;
+
+except that the name C<array> has been replaced by the reference
+C<{$table{$country}}>. The C<@> tells Perl to get the entire array.
+Having gotten the list of cities, we sort it, join it, and print it
+out as usual.
+
+Lines 2-7 are responsible for building the structure in the first
+place. Here they are again:
+
+ 2 while (<>) {
+ 3 chomp;
+ 4 my ($city, $country) = split /, /;
+ 5 $table{$country} = [] unless exists $table{$country};
+ 6 push @{$table{$country}}, $city;
+ 7 }
+
+Lines 2-4 acquire a city and country name. Line 5 looks to see if the
+country is already present as a key in the hash. If it's not, the
+program uses the C<[]> notation (B<Make Rule 2>) to manufacture a new,
+empty anonymous array of cities, and installs a reference to it into
+the hash under the appropriate key.
+
+Line 6 installs the city name into the appropriate array.
+C<$table{$country}> now holds a reference to the array of cities seen
+in that country so far. Line 6 is exactly like
+
+ push @array, $city;
+
+except that the name C<array> has been replaced by the reference
+C<{$table{$country}}>. The C<push> adds a city name to the end of the
+referred-to array.
+
+There's one fine point I skipped. Line 5 is unnecessary, and we can
+get rid of it.
+
+ 2 while (<>) {
+ 3 chomp;
+ 4 my ($city, $country) = split /, /;
+ 5 #### $table{$country} = [] unless exists $table{$country};
+ 6 push @{$table{$country}}, $city;
+ 7 }
+
+If there's already an entry in C<%table> for the current C<$country>,
+then nothing is different. Line 6 will locate the value in
+C<$table{$country}>, which is a reference to an array, and push
+C<$city> into the array. But
+what does it do when
+C<$country> holds a key, say C<Greece>, that is not yet in C<%table>?
+
+This is Perl, so it does the exact right thing. It sees that you want
+to push C<Athens> onto an array that doesn't exist, so it helpfully
+makes a new, empty, anonymous array for you, installs it into
+C<%table>, and then pushes C<Athens> onto it. This is called
+`autovivification'--bringing things to life automatically. Perl saw
+that they key wasn't in the hash, so it created a new hash entry
+automatically. Perl saw that you wanted to use the hash value as an
+array, so it created a new empty array and installed a reference to it
+in the hash automatically. And as usual, Perl made the array one
+element longer to hold the new city name.
+
+=head1 The Rest
+
+I promised to give you 90% of the benefit with 10% of the details, and
+that means I left out 90% of the details. Now that you have an
+overview of the important parts, it should be easier to read the
+L<perlref> manual page, which discusses 100% of the details.
+
+Some of the highlights of L<perlref>:
+
+=over 4
+
+=item *
+
+You can make references to anything, including scalars, functions, and
+other references.
+
+=item *
+
+In B<Use Rule 1>, you can omit the curly brackets whenever the thing
+inside them is an atomic scalar variable like C<$aref>. For example,
+C<@$aref> is the same as C<@{$aref}>, and C<$$aref[1]> is the same as
+C<${$aref}[1]>. If you're just starting out, you may want to adopt
+the habit of always including the curly brackets.
+
+=item *
+
+This doesn't copy the underlying array:
+
+ $aref2 = $aref1;
+
+You get two references to the same array. If you modify
+C<< $aref1->[23] >> and then look at
+C<< $aref2->[23] >> you'll see the change.
+
+To copy the array, use
+
+ $aref2 = [@{$aref1}];
+
+This uses C<[...]> notation to create a new anonymous array, and
+C<$aref2> is assigned a reference to the new array. The new array is
+initialized with the contents of the array referred to by C<$aref1>.
+
+Similarly, to copy an anonymous hash, you can use
+
+ $href2 = {%{$href1}};
+
+=item *
+
+To see if a variable contains a reference, use the C<ref> function. It
+returns true if its argument is a reference. Actually it's a little
+better than that: It returns C<HASH> for hash references and C<ARRAY>
+for array references.
+
+=item *
+
+If you try to use a reference like a string, you get strings like
+
+ ARRAY(0x80f5dec) or HASH(0x826afc0)
+
+If you ever see a string that looks like this, you'll know you
+printed out a reference by mistake.
+
+A side effect of this representation is that you can use C<eq> to see
+if two references refer to the same thing. (But you should usually use
+C<==> instead because it's much faster.)
+
+=item *
+
+You can use a string as if it were a reference. If you use the string
+C<"foo"> as an array reference, it's taken to be a reference to the
+array C<@foo>. This is called a I<soft reference> or I<symbolic
+reference>. The declaration C<use strict 'refs'> disables this
+feature, which can cause all sorts of trouble if you use it by accident.
+
+=back
+
+You might prefer to go on to L<perllol> instead of L<perlref>; it
+discusses lists of lists and multidimensional arrays in detail. After
+that, you should move on to L<perldsc>; it's a Data Structure Cookbook
+that shows recipes for using and printing out arrays of hashes, hashes
+of arrays, and other kinds of data.
+
+=head1 Summary
+
+Everyone needs compound data structures, and in Perl the way you get
+them is with references. There are four important rules for managing
+references: Two for making references and two for using them. Once
+you know these rules you can do most of the important things you need
+to do with references.
+
+=head1 Credits
+
+Author: Mark Jason Dominus, Plover Systems (C<mjd-perl-ref+@plover.com>)
+
+This article originally appeared in I<The Perl Journal>
+( http://www.tpj.com/ ) volume 3, #2. Reprinted with permission.
+
+The original title was I<Understand References Today>.
+
+=head2 Distribution Conditions
+
+Copyright 1998 The Perl Journal.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in these files are
+hereby placed into the public domain. You are permitted and
+encouraged to use this code in your own programs for fun or for profit
+as you see fit. A simple comment in the code giving credit would be
+courteous but is not required.
+
+
+
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlreguts.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlreguts.pod
new file mode 100755
index 00000000000..204993165c2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlreguts.pod
@@ -0,0 +1,887 @@
+=head1 NAME
+
+perlreguts - Description of the Perl regular expression engine.
+
+=head1 DESCRIPTION
+
+This document is an attempt to shine some light on the guts of the regex
+engine and how it works. The regex engine represents a significant chunk
+of the perl codebase, but is relatively poorly understood. This document
+is a meagre attempt at addressing this situation. It is derived from the
+author's experience, comments in the source code, other papers on the
+regex engine, feedback on the perl5-porters mail list, and no doubt other
+places as well.
+
+B<NOTICE!> It should be clearly understood that the behavior and
+structures discussed in this represents the state of the engine as the
+author understood it at the time of writing. It is B<NOT> an API
+definition, it is purely an internals guide for those who want to hack
+the regex engine, or understand how the regex engine works. Readers of
+this document are expected to understand perl's regex syntax and its
+usage in detail. If you want to learn about the basics of Perl's
+regular expressions, see L<perlre>. And if you want to replace the
+regex engine with your own see see L<perlreapi>.
+
+=head1 OVERVIEW
+
+=head2 A quick note on terms
+
+There is some debate as to whether to say "regexp" or "regex". In this
+document we will use the term "regex" unless there is a special reason
+not to, in which case we will explain why.
+
+When speaking about regexes we need to distinguish between their source
+code form and their internal form. In this document we will use the term
+"pattern" when we speak of their textual, source code form, and the term
+"program" when we speak of their internal representation. These
+correspond to the terms I<S-regex> and I<B-regex> that Mark Jason
+Dominus employs in his paper on "Rx" ([1] in L</REFERENCES>).
+
+=head2 What is a regular expression engine?
+
+A regular expression engine is a program that takes a set of constraints
+specified in a mini-language, and then applies those constraints to a
+target string, and determines whether or not the string satisfies the
+constraints. See L<perlre> for a full definition of the language.
+
+In less grandiose terms, the first part of the job is to turn a pattern into
+something the computer can efficiently use to find the matching point in
+the string, and the second part is performing the search itself.
+
+To do this we need to produce a program by parsing the text. We then
+need to execute the program to find the point in the string that
+matches. And we need to do the whole thing efficiently.
+
+=head2 Structure of a Regexp Program
+
+=head3 High Level
+
+Although it is a bit confusing and some people object to the terminology, it
+is worth taking a look at a comment that has
+been in F<regexp.h> for years:
+
+I<This is essentially a linear encoding of a nondeterministic
+finite-state machine (aka syntax charts or "railroad normal form" in
+parsing technology).>
+
+The term "railroad normal form" is a bit esoteric, with "syntax
+diagram/charts", or "railroad diagram/charts" being more common terms.
+Nevertheless it provides a useful mental image of a regex program: each
+node can be thought of as a unit of track, with a single entry and in
+most cases a single exit point (there are pieces of track that fork, but
+statistically not many), and the whole forms a layout with a
+single entry and single exit point. The matching process can be thought
+of as a car that moves along the track, with the particular route through
+the system being determined by the character read at each possible
+connector point. A car can fall off the track at any point but it may
+only proceed as long as it matches the track.
+
+Thus the pattern C</foo(?:\w+|\d+|\s+)bar/> can be thought of as the
+following chart:
+
+ [start]
+ |
+ <foo>
+ |
+ +-----+-----+
+ | | |
+ <\w+> <\d+> <\s+>
+ | | |
+ +-----+-----+
+ |
+ <bar>
+ |
+ [end]
+
+The truth of the matter is that perl's regular expressions these days are
+much more complex than this kind of structure, but visualising it this way
+can help when trying to get your bearings, and it matches the
+current implementation pretty closely.
+
+To be more precise, we will say that a regex program is an encoding
+of a graph. Each node in the graph corresponds to part of
+the original regex pattern, such as a literal string or a branch,
+and has a pointer to the nodes representing the next component
+to be matched. Since "node" and "opcode" already have other meanings in the
+perl source, we will call the nodes in a regex program "regops".
+
+The program is represented by an array of C<regnode> structures, one or
+more of which represent a single regop of the program. Struct
+C<regnode> is the smallest struct needed, and has a field structure which is
+shared with all the other larger structures.
+
+The "next" pointers of all regops except C<BRANCH> implement concatenation;
+a "next" pointer with a C<BRANCH> on both ends of it is connecting two
+alternatives. [Here we have one of the subtle syntax dependencies: an
+individual C<BRANCH> (as opposed to a collection of them) is never
+concatenated with anything because of operator precedence.]
+
+The operand of some types of regop is a literal string; for others,
+it is a regop leading into a sub-program. In particular, the operand
+of a C<BRANCH> node is the first regop of the branch.
+
+B<NOTE>: As the railroad metaphor suggests, this is B<not> a tree
+structure: the tail of the branch connects to the thing following the
+set of C<BRANCH>es. It is a like a single line of railway track that
+splits as it goes into a station or railway yard and rejoins as it comes
+out the other side.
+
+=head3 Regops
+
+The base structure of a regop is defined in F<regexp.h> as follows:
+
+ struct regnode {
+ U8 flags; /* Various purposes, sometimes overridden */
+ U8 type; /* Opcode value as specified by regnodes.h */
+ U16 next_off; /* Offset in size regnode */
+ };
+
+Other larger C<regnode>-like structures are defined in F<regcomp.h>. They
+are almost like subclasses in that they have the same fields as
+C<regnode>, with possibly additional fields following in
+the structure, and in some cases the specific meaning (and name)
+of some of base fields are overridden. The following is a more
+complete description.
+
+=over 4
+
+=item C<regnode_1>
+
+=item C<regnode_2>
+
+C<regnode_1> structures have the same header, followed by a single
+four-byte argument; C<regnode_2> structures contain two two-byte
+arguments instead:
+
+ regnode_1 U32 arg1;
+ regnode_2 U16 arg1; U16 arg2;
+
+=item C<regnode_string>
+
+C<regnode_string> structures, used for literal strings, follow the header
+with a one-byte length and then the string data. Strings are padded on
+the end with zero bytes so that the total length of the node is a
+multiple of four bytes:
+
+ regnode_string char string[1];
+ U8 str_len; /* overrides flags */
+
+=item C<regnode_charclass>
+
+Character classes are represented by C<regnode_charclass> structures,
+which have a four-byte argument and then a 32-byte (256-bit) bitmap
+indicating which characters are included in the class.
+
+ regnode_charclass U32 arg1;
+ char bitmap[ANYOF_BITMAP_SIZE];
+
+=item C<regnode_charclass_class>
+
+There is also a larger form of a char class structure used to represent
+POSIX char classes called C<regnode_charclass_class> which has an
+additional 4-byte (32-bit) bitmap indicating which POSIX char classes
+have been included.
+
+ regnode_charclass_class U32 arg1;
+ char bitmap[ANYOF_BITMAP_SIZE];
+ char classflags[ANYOF_CLASSBITMAP_SIZE];
+
+=back
+
+F<regnodes.h> defines an array called C<regarglen[]> which gives the size
+of each opcode in units of C<size regnode> (4-byte). A macro is used
+to calculate the size of an C<EXACT> node based on its C<str_len> field.
+
+The regops are defined in F<regnodes.h> which is generated from
+F<regcomp.sym> by F<regcomp.pl>. Currently the maximum possible number
+of distinct regops is restricted to 256, with about a quarter already
+used.
+
+A set of macros makes accessing the fields
+easier and more consistent. These include C<OP()>, which is used to determine
+the type of a C<regnode>-like structure; C<NEXT_OFF()>, which is the offset to
+the next node (more on this later); C<ARG()>, C<ARG1()>, C<ARG2()>, C<ARG_SET()>,
+and equivalents for reading and setting the arguments; and C<STR_LEN()>,
+C<STRING()> and C<OPERAND()> for manipulating strings and regop bearing
+types.
+
+=head3 What regop is next?
+
+There are three distinct concepts of "next" in the regex engine, and
+it is important to keep them clear.
+
+=over 4
+
+=item *
+
+There is the "next regnode" from a given regnode, a value which is
+rarely useful except that sometimes it matches up in terms of value
+with one of the others, and that sometimes the code assumes this to
+always be so.
+
+=item *
+
+There is the "next regop" from a given regop/regnode. This is the
+regop physically located after the the current one, as determined by
+the size of the current regop. This is often useful, such as when
+dumping the structure we use this order to traverse. Sometimes the code
+assumes that the "next regnode" is the same as the "next regop", or in
+other words assumes that the sizeof a given regop type is always going
+to be one regnode large.
+
+=item *
+
+There is the "regnext" from a given regop. This is the regop which
+is reached by jumping forward by the value of C<NEXT_OFF()>,
+or in a few cases for longer jumps by the C<arg1> field of the C<regnode_1>
+structure. The subroutine C<regnext()> handles this transparently.
+This is the logical successor of the node, which in some cases, like
+that of the C<BRANCH> regop, has special meaning.
+
+=back
+
+=head1 Process Overview
+
+Broadly speaking, performing a match of a string against a pattern
+involves the following steps:
+
+=over 5
+
+=item A. Compilation
+
+=over 5
+
+=item 1. Parsing for size
+
+=item 2. Parsing for construction
+
+=item 3. Peep-hole optimisation and analysis
+
+=back
+
+=item B. Execution
+
+=over 5
+
+=item 4. Start position and no-match optimisations
+
+=item 5. Program execution
+
+=back
+
+=back
+
+
+Where these steps occur in the actual execution of a perl program is
+determined by whether the pattern involves interpolating any string
+variables. If interpolation occurs, then compilation happens at run time. If it
+does not, then compilation is performed at compile time. (The C</o> modifier changes this,
+as does C<qr//> to a certain extent.) The engine doesn't really care that
+much.
+
+=head2 Compilation
+
+This code resides primarily in F<regcomp.c>, along with the header files
+F<regcomp.h>, F<regexp.h> and F<regnodes.h>.
+
+Compilation starts with C<pregcomp()>, which is mostly an initialisation
+wrapper which farms work out to two other routines for the heavy lifting: the
+first is C<reg()>, which is the start point for parsing; the second,
+C<study_chunk()>, is responsible for optimisation.
+
+Initialisation in C<pregcomp()> mostly involves the creation and data-filling
+of a special structure, C<RExC_state_t> (defined in F<regcomp.c>).
+Almost all internally-used routines in F<regcomp.h> take a pointer to one
+of these structures as their first argument, with the name C<pRExC_state>.
+This structure is used to store the compilation state and contains many
+fields. Likewise there are many macros which operate on this
+variable: anything that looks like C<RExC_xxxx> is a macro that operates on
+this pointer/structure.
+
+=head3 Parsing for size
+
+In this pass the input pattern is parsed in order to calculate how much
+space is needed for each regop we would need to emit. The size is also
+used to determine whether long jumps will be required in the program.
+
+This stage is controlled by the macro C<SIZE_ONLY> being set.
+
+The parse proceeds pretty much exactly as it does during the
+construction phase, except that most routines are short-circuited to
+change the size field C<RExC_size> and not do anything else.
+
+=head3 Parsing for construction
+
+Once the size of the program has been determined, the pattern is parsed
+again, but this time for real. Now C<SIZE_ONLY> will be false, and the
+actual construction can occur.
+
+C<reg()> is the start of the parse process. It is responsible for
+parsing an arbitrary chunk of pattern up to either the end of the
+string, or the first closing parenthesis it encounters in the pattern.
+This means it can be used to parse the top-level regex, or any section
+inside of a grouping parenthesis. It also handles the "special parens"
+that perl's regexes have. For instance when parsing C</x(?:foo)y/> C<reg()>
+will at one point be called to parse from the "?" symbol up to and
+including the ")".
+
+Additionally, C<reg()> is responsible for parsing the one or more
+branches from the pattern, and for "finishing them off" by correctly
+setting their next pointers. In order to do the parsing, it repeatedly
+calls out to C<regbranch()>, which is responsible for handling up to the
+first C<|> symbol it sees.
+
+C<regbranch()> in turn calls C<regpiece()> which
+handles "things" followed by a quantifier. In order to parse the
+"things", C<regatom()> is called. This is the lowest level routine, which
+parses out constant strings, character classes, and the
+various special symbols like C<$>. If C<regatom()> encounters a "("
+character it in turn calls C<reg()>.
+
+The routine C<regtail()> is called by both C<reg()> and C<regbranch()>
+in order to "set the tail pointer" correctly. When executing and
+we get to the end of a branch, we need to go to the node following the
+grouping parens. When parsing, however, we don't know where the end will
+be until we get there, so when we do we must go back and update the
+offsets as appropriate. C<regtail> is used to make this easier.
+
+A subtlety of the parsing process means that a regex like C</foo/> is
+originally parsed into an alternation with a single branch. It is only
+afterwards that the optimiser converts single branch alternations into the
+simpler form.
+
+=head3 Parse Call Graph and a Grammar
+
+The call graph looks like this:
+
+ reg() # parse a top level regex, or inside of parens
+ regbranch() # parse a single branch of an alternation
+ regpiece() # parse a pattern followed by a quantifier
+ regatom() # parse a simple pattern
+ regclass() # used to handle a class
+ reg() # used to handle a parenthesised subpattern
+ ....
+ ...
+ regtail() # finish off the branch
+ ...
+ regtail() # finish off the branch sequence. Tie each
+ # branch's tail to the tail of the sequence
+ # (NEW) In Debug mode this is
+ # regtail_study().
+
+A grammar form might be something like this:
+
+ atom : constant | class
+ quant : '*' | '+' | '?' | '{min,max}'
+ _branch: piece
+ | piece _branch
+ | nothing
+ branch: _branch
+ | _branch '|' branch
+ group : '(' branch ')'
+ _piece: atom | group
+ piece : _piece
+ | _piece quant
+
+=head3 Debug Output
+
+In the 5.9.x development version of perl you can C<< use re Debug => 'PARSE' >>
+to see some trace information about the parse process. We will start with some
+simple patterns and build up to more complex patterns.
+
+So when we parse C</foo/> we see something like the following table. The
+left shows what is being parsed, and the number indicates where the next regop
+would go. The stuff on the right is the trace output of the graph. The
+names are chosen to be short to make it less dense on the screen. 'tsdy'
+is a special form of C<regtail()> which does some extra analysis.
+
+ >foo< 1 reg
+ brnc
+ piec
+ atom
+ >< 4 tsdy~ EXACT <foo> (EXACT) (1)
+ ~ attach to END (3) offset to 2
+
+The resulting program then looks like:
+
+ 1: EXACT <foo>(3)
+ 3: END(0)
+
+As you can see, even though we parsed out a branch and a piece, it was ultimately
+only an atom. The final program shows us how things work. We have an C<EXACT> regop,
+followed by an C<END> regop. The number in parens indicates where the C<regnext> of
+the node goes. The C<regnext> of an C<END> regop is unused, as C<END> regops mean
+we have successfully matched. The number on the left indicates the position of
+the regop in the regnode array.
+
+Now let's try a harder pattern. We will add a quantifier, so now we have the pattern
+C</foo+/>. We will see that C<regbranch()> calls C<regpiece()> twice.
+
+ >foo+< 1 reg
+ brnc
+ piec
+ atom
+ >o+< 3 piec
+ atom
+ >< 6 tail~ EXACT <fo> (1)
+ 7 tsdy~ EXACT <fo> (EXACT) (1)
+ ~ PLUS (END) (3)
+ ~ attach to END (6) offset to 3
+
+And we end up with the program:
+
+ 1: EXACT <fo>(3)
+ 3: PLUS(6)
+ 4: EXACT <o>(0)
+ 6: END(0)
+
+Now we have a special case. The C<EXACT> regop has a C<regnext> of 0. This is
+because if it matches it should try to match itself again. The C<PLUS> regop
+handles the actual failure of the C<EXACT> regop and acts appropriately (going
+to regnode 6 if the C<EXACT> matched at least once, or failing if it didn't).
+
+Now for something much more complex: C</x(?:foo*|b[a][rR])(foo|bar)$/>
+
+ >x(?:foo*|b... 1 reg
+ brnc
+ piec
+ atom
+ >(?:foo*|b[... 3 piec
+ atom
+ >?:foo*|b[a... reg
+ >foo*|b[a][... brnc
+ piec
+ atom
+ >o*|b[a][rR... 5 piec
+ atom
+ >|b[a][rR])... 8 tail~ EXACT <fo> (3)
+ >b[a][rR])(... 9 brnc
+ 10 piec
+ atom
+ >[a][rR])(f... 12 piec
+ atom
+ >a][rR])(fo... clas
+ >[rR])(foo|... 14 tail~ EXACT <b> (10)
+ piec
+ atom
+ >rR])(foo|b... clas
+ >)(foo|bar)... 25 tail~ EXACT <a> (12)
+ tail~ BRANCH (3)
+ 26 tsdy~ BRANCH (END) (9)
+ ~ attach to TAIL (25) offset to 16
+ tsdy~ EXACT <fo> (EXACT) (4)
+ ~ STAR (END) (6)
+ ~ attach to TAIL (25) offset to 19
+ tsdy~ EXACT <b> (EXACT) (10)
+ ~ EXACT <a> (EXACT) (12)
+ ~ ANYOF[Rr] (END) (14)
+ ~ attach to TAIL (25) offset to 11
+ >(foo|bar)$< tail~ EXACT <x> (1)
+ piec
+ atom
+ >foo|bar)$< reg
+ 28 brnc
+ piec
+ atom
+ >|bar)$< 31 tail~ OPEN1 (26)
+ >bar)$< brnc
+ 32 piec
+ atom
+ >)$< 34 tail~ BRANCH (28)
+ 36 tsdy~ BRANCH (END) (31)
+ ~ attach to CLOSE1 (34) offset to 3
+ tsdy~ EXACT <foo> (EXACT) (29)
+ ~ attach to CLOSE1 (34) offset to 5
+ tsdy~ EXACT <bar> (EXACT) (32)
+ ~ attach to CLOSE1 (34) offset to 2
+ >$< tail~ BRANCH (3)
+ ~ BRANCH (9)
+ ~ TAIL (25)
+ piec
+ atom
+ >< 37 tail~ OPEN1 (26)
+ ~ BRANCH (28)
+ ~ BRANCH (31)
+ ~ CLOSE1 (34)
+ 38 tsdy~ EXACT <x> (EXACT) (1)
+ ~ BRANCH (END) (3)
+ ~ BRANCH (END) (9)
+ ~ TAIL (END) (25)
+ ~ OPEN1 (END) (26)
+ ~ BRANCH (END) (28)
+ ~ BRANCH (END) (31)
+ ~ CLOSE1 (END) (34)
+ ~ EOL (END) (36)
+ ~ attach to END (37) offset to 1
+
+Resulting in the program
+
+ 1: EXACT <x>(3)
+ 3: BRANCH(9)
+ 4: EXACT <fo>(6)
+ 6: STAR(26)
+ 7: EXACT <o>(0)
+ 9: BRANCH(25)
+ 10: EXACT <ba>(14)
+ 12: OPTIMIZED (2 nodes)
+ 14: ANYOF[Rr](26)
+ 25: TAIL(26)
+ 26: OPEN1(28)
+ 28: TRIE-EXACT(34)
+ [StS:1 Wds:2 Cs:6 Uq:5 #Sts:7 Mn:3 Mx:3 Stcls:bf]
+ <foo>
+ <bar>
+ 30: OPTIMIZED (4 nodes)
+ 34: CLOSE1(36)
+ 36: EOL(37)
+ 37: END(0)
+
+Here we can see a much more complex program, with various optimisations in
+play. At regnode 10 we see an example where a character class with only
+one character in it was turned into an C<EXACT> node. We can also see where
+an entire alternation was turned into a C<TRIE-EXACT> node. As a consequence,
+some of the regnodes have been marked as optimised away. We can see that
+the C<$> symbol has been converted into an C<EOL> regop, a special piece of
+code that looks for C<\n> or the end of the string.
+
+The next pointer for C<BRANCH>es is interesting in that it points at where
+execution should go if the branch fails. When executing, if the engine
+tries to traverse from a branch to a C<regnext> that isn't a branch then
+the engine will know that the entire set of branches has failed.
+
+=head3 Peep-hole Optimisation and Analysis
+
+The regular expression engine can be a weighty tool to wield. On long
+strings and complex patterns it can end up having to do a lot of work
+to find a match, and even more to decide that no match is possible.
+Consider a situation like the following pattern.
+
+ 'ababababababababababab' =~ /(a|b)*z/
+
+The C<(a|b)*> part can match at every char in the string, and then fail
+every time because there is no C<z> in the string. So obviously we can
+avoid using the regex engine unless there is a C<z> in the string.
+Likewise in a pattern like:
+
+ /foo(\w+)bar/
+
+In this case we know that the string must contain a C<foo> which must be
+followed by C<bar>. We can use Fast Boyer-Moore matching as implemented
+in C<fbm_instr()> to find the location of these strings. If they don't exist
+then we don't need to resort to the much more expensive regex engine.
+Even better, if they do exist then we can use their positions to
+reduce the search space that the regex engine needs to cover to determine
+if the entire pattern matches.
+
+There are various aspects of the pattern that can be used to facilitate
+optimisations along these lines:
+
+=over 5
+
+=item * anchored fixed strings
+
+=item * floating fixed strings
+
+=item * minimum and maximum length requirements
+
+=item * start class
+
+=item * Beginning/End of line positions
+
+=back
+
+Another form of optimisation that can occur is the post-parse "peep-hole"
+optimisation, where inefficient constructs are replaced by more efficient
+constructs. The C<TAIL> regops which are used during parsing to mark the end
+of branches and the end of groups are examples of this. These regops are used
+as place-holders during construction and "always match" so they can be
+"optimised away" by making the things that point to the C<TAIL> point to the
+thing that C<TAIL> points to, thus "skipping" the node.
+
+Another optimisation that can occur is that of "C<EXACT> merging" which is
+where two consecutive C<EXACT> nodes are merged into a single
+regop. An even more aggressive form of this is that a branch
+sequence of the form C<EXACT BRANCH ... EXACT> can be converted into a
+C<TRIE-EXACT> regop.
+
+All of this occurs in the routine C<study_chunk()> which uses a special
+structure C<scan_data_t> to store the analysis that it has performed, and
+does the "peep-hole" optimisations as it goes.
+
+The code involved in C<study_chunk()> is extremely cryptic. Be careful. :-)
+
+=head2 Execution
+
+Execution of a regex generally involves two phases, the first being
+finding the start point in the string where we should match from,
+and the second being running the regop interpreter.
+
+If we can tell that there is no valid start point then we don't bother running
+interpreter at all. Likewise, if we know from the analysis phase that we
+cannot detect a short-cut to the start position, we go straight to the
+interpreter.
+
+The two entry points are C<re_intuit_start()> and C<pregexec()>. These routines
+have a somewhat incestuous relationship with overlap between their functions,
+and C<pregexec()> may even call C<re_intuit_start()> on its own. Nevertheless
+other parts of the the perl source code may call into either, or both.
+
+Execution of the interpreter itself used to be recursive, but thanks to the
+efforts of Dave Mitchell in the 5.9.x development track, that has changed: now an
+internal stack is maintained on the heap and the routine is fully
+iterative. This can make it tricky as the code is quite conservative
+about what state it stores, with the result that that two consecutive lines in the
+code can actually be running in totally different contexts due to the
+simulated recursion.
+
+=head3 Start position and no-match optimisations
+
+C<re_intuit_start()> is responsible for handling start points and no-match
+optimisations as determined by the results of the analysis done by
+C<study_chunk()> (and described in L<Peep-hole Optimisation and Analysis>).
+
+The basic structure of this routine is to try to find the start- and/or
+end-points of where the pattern could match, and to ensure that the string
+is long enough to match the pattern. It tries to use more efficient
+methods over less efficient methods and may involve considerable
+cross-checking of constraints to find the place in the string that matches.
+For instance it may try to determine that a given fixed string must be
+not only present but a certain number of chars before the end of the
+string, or whatever.
+
+It calls several other routines, such as C<fbm_instr()> which does
+Fast Boyer Moore matching and C<find_byclass()> which is responsible for
+finding the start using the first mandatory regop in the program.
+
+When the optimisation criteria have been satisfied, C<reg_try()> is called
+to perform the match.
+
+=head3 Program execution
+
+C<pregexec()> is the main entry point for running a regex. It contains
+support for initialising the regex interpreter's state, running
+C<re_intuit_start()> if needed, and running the interpreter on the string
+from various start positions as needed. When it is necessary to use
+the regex interpreter C<pregexec()> calls C<regtry()>.
+
+C<regtry()> is the entry point into the regex interpreter. It expects
+as arguments a pointer to a C<regmatch_info> structure and a pointer to
+a string. It returns an integer 1 for success and a 0 for failure.
+It is basically a set-up wrapper around C<regmatch()>.
+
+C<regmatch> is the main "recursive loop" of the interpreter. It is
+basically a giant switch statement that implements a state machine, where
+the possible states are the regops themselves, plus a number of additional
+intermediate and failure states. A few of the states are implemented as
+subroutines but the bulk are inline code.
+
+=head1 MISCELLANEOUS
+
+=head2 Unicode and Localisation Support
+
+When dealing with strings containing characters that cannot be represented
+using an eight-bit character set, perl uses an internal representation
+that is a permissive version of Unicode's UTF-8 encoding[2]. This uses single
+bytes to represent characters from the ASCII character set, and sequences
+of two or more bytes for all other characters. (See L<perlunitut>
+for more information about the relationship between UTF-8 and perl's
+encoding, utf8 -- the difference isn't important for this discussion.)
+
+No matter how you look at it, Unicode support is going to be a pain in a
+regex engine. Tricks that might be fine when you have 256 possible
+characters often won't scale to handle the size of the UTF-8 character
+set. Things you can take for granted with ASCII may not be true with
+Unicode. For instance, in ASCII, it is safe to assume that
+C<sizeof(char1) == sizeof(char2)>, but in UTF-8 it isn't. Unicode case folding is
+vastly more complex than the simple rules of ASCII, and even when not
+using Unicode but only localised single byte encodings, things can get
+tricky (for example, B<LATIN SMALL LETTER SHARP S> (U+00DF, E<szlig>)
+should match 'SS' in localised case-insensitive matching).
+
+Making things worse is that UTF-8 support was a later addition to the
+regex engine (as it was to perl) and this necessarily made things a lot
+more complicated. Obviously it is easier to design a regex engine with
+Unicode support in mind from the beginning than it is to retrofit it to
+one that wasn't.
+
+Nearly all regops that involve looking at the input string have
+two cases, one for UTF-8, and one not. In fact, it's often more complex
+than that, as the pattern may be UTF-8 as well.
+
+Care must be taken when making changes to make sure that you handle
+UTF-8 properly, both at compile time and at execution time, including
+when the string and pattern are mismatched.
+
+The following comment in F<regcomp.h> gives an example of exactly how
+tricky this can be:
+
+ Two problematic code points in Unicode casefolding of EXACT nodes:
+
+ U+0390 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+ U+03B0 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+
+ which casefold to
+
+ Unicode UTF-8
+
+ U+03B9 U+0308 U+0301 0xCE 0xB9 0xCC 0x88 0xCC 0x81
+ U+03C5 U+0308 U+0301 0xCF 0x85 0xCC 0x88 0xCC 0x81
+
+ This means that in case-insensitive matching (or "loose matching",
+ as Unicode calls it), an EXACTF of length six (the UTF-8 encoded
+ byte length of the above casefolded versions) can match a target
+ string of length two (the byte length of UTF-8 encoded U+0390 or
+ U+03B0). This would rather mess up the minimum length computation.
+
+ What we'll do is to look for the tail four bytes, and then peek
+ at the preceding two bytes to see whether we need to decrease
+ the minimum length by four (six minus two).
+
+ Thanks to the design of UTF-8, there cannot be false matches:
+ A sequence of valid UTF-8 bytes cannot be a subsequence of
+ another valid sequence of UTF-8 bytes.
+
+
+=head2 Base Structures
+
+The C<regexp> structure described in L<perlreapi> is common to all
+regex engines. Two of its fields that are intended for the private use
+of the regex engine that compiled the pattern. These are the
+C<intflags> and pprivate members. The C<pprivate> is a void pointer to
+an arbitrary structure whose use and management is the responsibility
+of the compiling engine. perl will never modify either of these
+values. In the case of the stock engine the structure pointed to by
+C<pprivate> is called C<regexp_internal>.
+
+Its C<pprivate> and C<intflags> fields contain data
+specific to each engine.
+
+There are two structures used to store a compiled regular expression.
+One, the C<regexp> structure described in L<perlreapi> is populated by
+the engine currently being. used and some of its fields read by perl to
+implement things such as the stringification of C<qr//>.
+
+
+The other structure is pointed to be the C<regexp> struct's
+C<pprivate> and is in addition to C<intflags> in the same struct
+considered to be the property of the regex engine which compiled the
+regular expression;
+
+The regexp structure contains all the data that perl needs to be aware of
+to properly work with the regular expression. It includes data about
+optimisations that perl can use to determine if the regex engine should
+really be used, and various other control info that is needed to properly
+execute patterns in various contexts such as is the pattern anchored in
+some way, or what flags were used during the compile, or whether the
+program contains special constructs that perl needs to be aware of.
+
+In addition it contains two fields that are intended for the private use
+of the regex engine that compiled the pattern. These are the C<intflags>
+and pprivate members. The C<pprivate> is a void pointer to an arbitrary
+structure whose use and management is the responsibility of the compiling
+engine. perl will never modify either of these values.
+
+As mentioned earlier, in the case of the default engines, the C<pprivate>
+will be a pointer to a regexp_internal structure which holds the compiled
+program and any additional data that is private to the regex engine
+implementation.
+
+=head3 Perl's C<pprivate> structure
+
+The following structure is used as the C<pprivate> struct by perl's
+regex engine. Since it is specific to perl it is only of curiosity
+value to other engine implementations.
+
+ typedef struct regexp_internal {
+ regexp_paren_ofs *swap; /* Swap copy of *startp / *endp */
+ U32 *offsets; /* offset annotations 20001228 MJD
+ data about mapping the program to the
+ string*/
+ regnode *regstclass; /* Optional startclass as identified or constructed
+ by the optimiser */
+ struct reg_data *data; /* Additional miscellaneous data used by the program.
+ Used to make it easier to clone and free arbitrary
+ data that the regops need. Often the ARG field of
+ a regop is an index into this structure */
+ regnode program[1]; /* Unwarranted chumminess with compiler. */
+ } regexp_internal;
+
+=over 5
+
+=item C<swap>
+
+C<swap> is an extra set of startp/endp stored in a C<regexp_paren_ofs>
+struct. This is used when the last successful match was from the same pattern
+as the current pattern, so that a partial match doesn't overwrite the
+previous match's results. When this field is data filled the matching
+engine will swap buffers before every match attempt. If the match fails,
+then it swaps them back. If it's successful it leaves them. This field
+is populated on demand and is by default null.
+
+=item C<offsets>
+
+Offsets holds a mapping of offset in the C<program>
+to offset in the C<precomp> string. This is only used by ActiveState's
+visual regex debugger.
+
+=item C<regstclass>
+
+Special regop that is used by C<re_intuit_start()> to check if a pattern
+can match at a certain position. For instance if the regex engine knows
+that the pattern must start with a 'Z' then it can scan the string until
+it finds one and then launch the regex engine from there. The routine
+that handles this is called C<find_by_class()>. Sometimes this field
+points at a regop embedded in the program, and sometimes it points at
+an independent synthetic regop that has been constructed by the optimiser.
+
+=item C<data>
+
+This field points at a reg_data structure, which is defined as follows
+
+ struct reg_data {
+ U32 count;
+ U8 *what;
+ void* data[1];
+ };
+
+This structure is used for handling data structures that the regex engine
+needs to handle specially during a clone or free operation on the compiled
+product. Each element in the data array has a corresponding element in the
+what array. During compilation regops that need special structures stored
+will add an element to each array using the add_data() routine and then store
+the index in the regop.
+
+=item C<program>
+
+Compiled program. Inlined into the structure so the entire struct can be
+treated as a single blob.
+
+=back
+
+=head1 SEE ALSO
+
+L<perlreapi>
+
+L<perlre>
+
+L<perlunitut>
+
+=head1 AUTHOR
+
+by Yves Orton, 2006.
+
+With excerpts from Perl, and contributions and suggestions from
+Ronald J. Kimball, Dave Mitchell, Dominic Dunlop, Mark Jason Dominus,
+Stephen McCamant, and David Landgren.
+
+=head1 LICENCE
+
+Same terms as Perl.
+
+=head1 REFERENCES
+
+[1] L<http://perl.plover.com/Rx/paper/>
+
+[2] L<http://www.unicode.org>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlrepository.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlrepository.pod
new file mode 100755
index 00000000000..0ab8a71aefe
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlrepository.pod
@@ -0,0 +1,689 @@
+=for comment
+Consistent formatting of this file is achieved with:
+ perl ./Porting/podtidy pod/perlrepository.pod
+
+=head1 NAME
+
+perlrepository - Using the Perl source repository
+
+=head1 SYNOPSIS
+
+All of Perl's source code is kept centrally in a Git repository at
+I<perl5.git.perl.org>. The repository contains many Perl revisions from
+Perl 1 onwards and all the revisions from Perforce, the version control
+system we were using previously. This repository is accessible in
+different ways.
+
+The full repository takes up about 80MB of disk space. A check out of
+the blead branch (that is, the main development branch, which contains
+bleadperl, the development version of perl 5) takes up about 160MB of
+disk space (including the repository). A build of bleadperl takes up
+about 200MB (including the repository and the check out).
+
+=head1 GETTING ACCESS TO THE REPOSITORY
+
+=head2 READ ACCESS VIA THE WEB
+
+You may access the repository over the web. This allows you to browse
+the tree, see recent commits, subscribe to RSS feeds for the changes,
+search for particular commits and more. You may access it at:
+
+ http://perl5.git.perl.org/perl.git
+
+A mirror of the repository is found at:
+
+ http://github.com/github/perl
+
+=head2 READ ACCESS VIA GIT
+
+You will need a copy of Git for your computer. You can fetch a copy of
+the repository using the Git protocol (which uses port 9418):
+
+ git clone git://perl5.git.perl.org/perl.git perl-git
+
+This clones the repository and makes a local copy in the F<perl-git>
+directory.
+
+If your local network does not allow you to use port 9418, then you can
+fetch a copy of the repository over HTTP (this is slower):
+
+ git clone http://perl5.git.perl.org/perl.git perl-http
+
+This clones the repository and makes a local copy in the F<perl-http>
+directory.
+
+=head2 WRITE ACCESS TO THE REPOSITORY
+
+If you are a committer, then you can fetch a copy of the repository
+that you can push back on with:
+
+ git clone ssh://perl5.git.perl.org/gitroot/perl.git perl-ssh
+
+This clones the repository and makes a local copy in the F<perl-ssh>
+directory.
+
+If you cloned using the git protocol, which is faster than ssh, then
+you will need to modify your config in order to enable pushing. Edit
+F<.git/config> where you will see something like:
+
+ [remote "origin"]
+ url = git://perl5.git.perl.org/perl.git
+
+change that to something like this:
+
+ [remote "origin"]
+ url = ssh://perl5.git.perl.org/gitroot/perl.git
+
+NOTE: there are symlinks set up so that the /gitroot is optional and
+since SSH is the default protocol you can actually shorten the "url" to
+C<perl5.git.perl.org:/perl.git>.
+
+You can also set up your user name and e-mail address. For example
+
+ % git config user.name "Leon Brocard"
+ % git config user.email acme@astray.com
+
+It is also possible to keep C<origin> as a git remote, and add a new
+remote for ssh access:
+
+ % git remote add camel perl5.git.perl.org:/perl.git
+
+This allows you to update your local repository by pulling from
+C<origin>, which is faster and doesn't require you to authenticate, and
+to push your changes back with the C<camel> remote:
+
+ % git fetch camel
+ % git push camel
+
+The C<fetch> command just updates the C<camel> refs, as the objects
+themselves should have been fetched when pulling from C<origin>.
+
+The committers have access to 2 servers that serve perl5.git.perl.org.
+One is camel.booking.com, which is the 'master' repository. The
+perl5.git.perl.org IP address also lives on this machine. The second
+one is dromedary.booking.com, which can be used for general testing and
+development. Dromedary syncs the git tree from camel every few minutes,
+you should not push there. Both machines also have a full CPAN mirror.
+To share files with the general public, dromedary serves your
+~/public_html/ as http://users.perl5.git.perl.org/~yourlogin/
+
+=head1 OVERVIEW OF THE REPOSITORY
+
+Once you have changed into the repository directory, you can inspect
+it.
+
+After a clone the repository will contain a single local branch, which
+will be the current branch as well, as indicated by the asterisk.
+
+ % git branch
+ * blead
+
+Using the -a switch to C<branch> will also show the remote tracking
+branches in the repository:
+
+ % git branch -a
+ * blead
+ origin/HEAD
+ origin/blead
+ ...
+
+The branches that begin with "origin" correspond to the "git remote"
+that you cloned from (which is named "origin"). Each branch on the
+remote will be exactly tracked by theses branches. You should NEVER do
+work on these remote tracking branches. You only ever do work in a
+local branch. Local branches can be configured to automerge (on pull)
+from a designated remote tracking branch. This is the case with the
+default branch C<blead> which will be configured to merge from the
+remote tracking branch C<origin/blead>.
+
+You can see recent commits:
+
+ % git log
+
+And pull new changes from the repository, and update your local
+repository (must be clean first)
+
+ % git pull
+
+Assuming we are on the branch C<blead> immediately after a pull, this
+command would be more or less equivalent to:
+
+ % git fetch
+ % git merge origin/blead
+
+In fact if you want to update your local repository without touching
+your working directory you do:
+
+ % git fetch
+
+And if you want to update your remote-tracking branches for all defined
+remotes simultaneously you can do
+
+ % git remote update
+
+Neither of these last two commands will update your working directory,
+however both will update the remote-tracking branches in your
+repository.
+
+To switch to another branch:
+
+ % git checkout origin/maint-5.8-dor
+
+To make a local branch of a remote branch:
+
+ % git checkout -b maint-5.10 origin/maint-5.10
+
+To switch back to blead:
+
+ % git checkout blead
+
+=head2 FINDING OUT YOUR STATUS
+
+The most common git command you will use will probably be
+
+ % git status
+
+This command will produce as output a description of the current state
+of the repository, including modified files and unignored untracked
+files, and in addition it will show things like what files have been
+staged for the next commit, and usually some useful information about
+how to change things. For instance the following:
+
+ $ git status
+ # On branch blead
+ # Your branch is ahead of 'origin/blead' by 1 commit.
+ #
+ # Changes to be committed:
+ # (use "git reset HEAD <file>..." to unstage)
+ #
+ # modified: pod/perlrepository.pod
+ #
+ # Changed but not updated:
+ # (use "git add <file>..." to update what will be committed)
+ #
+ # modified: pod/perlrepository.pod
+ #
+ # Untracked files:
+ # (use "git add <file>..." to include in what will be committed)
+ #
+ # deliberate.untracked
+
+This shows that there were changes to this document staged for commit,
+and that there were further changes in the working directory not yet
+staged. It also shows that there was an untracked file in the working
+directory, and as you can see shows how to change all of this. It also
+shows that there is one commit on the working branch C<blead> which has
+not been pushed to the C<origin> remote yet. B<NOTE>: that this output
+is also what you see as a template if you do not provide a message to
+C<git commit>.
+
+Assuming we commit all the mentioned changes above:
+
+ % git commit -a -m'explain git status and stuff about remotes'
+ Created commit daf8e63: explain git status and stuff about remotes
+ 1 files changed, 83 insertions(+), 3 deletions(-)
+
+We can re-run git status and see something like this:
+
+ % git status
+ # On branch blead
+ # Your branch is ahead of 'origin/blead' by 2 commits.
+ #
+ # Untracked files:
+ # (use "git add <file>..." to include in what will be committed)
+ #
+ # deliberate.untracked
+ nothing added to commit but untracked files present (use "git add" to track)
+
+
+When in doubt, before you do anything else, check your status and read
+it carefully, many questions are answered directly by the git status
+output.
+
+=head1 SUBMITTING A PATCH
+
+If you have a patch in mind for Perl, you should first get a copy of
+the repository:
+
+ % git clone git://perl5.git.perl.org/perl.git perl-git
+
+Then change into the directory:
+
+ % cd perl-git
+
+Alternatively, if you already have a Perl repository, you should ensure
+that you're on the I<blead> branch, and your repository is up to date:
+
+ % git checkout blead
+ % git pull
+
+It's preferable to patch against the latest blead version, since this
+is where new development occurs for all changes other than critical bug
+fixes. Critical bug fix patches should be made against the relevant
+maint branches, or should be submitted with a note indicating all the
+branches where the fix should be applied.
+
+Now that we have everything up to date, we need to create a temporary
+new branch for these changes and switch into it:
+
+ % git checkout -b orange
+
+which is the short form of
+
+ % git branch orange
+ % git checkout orange
+
+Then make your changes. For example, if Leon Brocard changes his name
+to Orange Brocard, we should change his name in the AUTHORS file:
+
+ % perl -pi -e 's{Leon Brocard}{Orange Brocard}' AUTHORS
+
+You can see what files are changed:
+
+ % git status
+ # On branch orange
+ # Changes to be committed:
+ # (use "git reset HEAD <file>..." to unstage)
+ #
+ # modified: AUTHORS
+ #
+
+And you can see the changes:
+
+ % git diff
+ diff --git a/AUTHORS b/AUTHORS
+ index 293dd70..722c93e 100644
+ --- a/AUTHORS
+ +++ b/AUTHORS
+ @@ -541,7 +541,7 @@ Lars Hecking <lhecking@nmrc.ucc.ie>
+ Laszlo Molnar <laszlo.molnar@eth.ericsson.se>
+ Leif Huhn <leif@hale.dkstat.com>
+ Len Johnson <lenjay@ibm.net>
+ -Leon Brocard <acme@astray.com>
+ +Orange Brocard <acme@astray.com>
+ Les Peters <lpeters@aol.net>
+ Lesley Binks <lesley.binks@gmail.com>
+ Lincoln D. Stein <lstein@cshl.org>
+
+Now commit your change locally:
+
+ % git commit -a -m 'Rename Leon Brocard to Orange Brocard'
+ Created commit 6196c1d: Rename Leon Brocard to Orange Brocard
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+You can examine your last commit with:
+
+ % git show HEAD
+
+and if you are not happy with either the description or the patch
+itself you can fix it up by editing the files once more and then issue:
+
+ % git commit -a --amend
+
+Now you should create a patch file for all your local changes:
+
+ % git format-patch origin
+ 0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
+
+You should now send an email to perl5-porters@perl.org with a
+description of your changes, and include this patch file as an
+attachment.
+
+If you want to delete your temporary branch, you may do so with:
+
+ % git checkout blead
+ % git branch -d orange
+ error: The branch 'orange' is not an ancestor of your current HEAD.
+ If you are sure you want to delete it, run 'git branch -D orange'.
+ % git branch -D orange
+ Deleted branch orange.
+
+=head2 A note on derived files
+
+Be aware that many files in the distribution are derivative--avoid
+patching them, because git won't see the changes to them, and the build
+process will overwrite them. Patch the originals instead. Most
+utilities (like perldoc) are in this category, i.e. patch
+utils/perldoc.PL rather than utils/perldoc. Similarly, don't create
+patches for files under $src_root/ext from their copies found in
+$install_root/lib. If you are unsure about the proper location of a
+file that may have gotten copied while building the source
+distribution, consult the C<MANIFEST>.
+
+=head2 A note on binary files
+
+Since the patch(1) utility cannot deal with binary files, it's
+important that you either avoid the use of binary files in your patch,
+generate the files dynamically, or that you encode any binary files
+using the F<uupacktool.pl> utility.
+
+Assuming you needed to include a gzip-encoded file for a module's test
+suite, you might do this as follows using the F<uupacktool.pl> utility:
+
+ $ perl uupacktool.pl -v -p -D lib/Some/Module/t/src/t.gz
+ Writing lib/Some/Module/t/src/t.gz into lib/Some/Module/t/src/t.gz.packed
+
+This will replace the C<t.gz> file with an encoded counterpart. During
+C<make test>, before any tests are run, perl's Makefile will restore
+all the C<.packed> files mentioned in the MANIFEST to their original
+name. This means that the test suite does not need to be aware of this
+packing scheme and will not need to be altered.
+
+=head2 Getting your patch accepted
+
+The first thing you should include with your patch is a description of
+the problem that the patch corrects. If it is a code patch (rather
+than a documentation patch) you should also include a small test case
+that illustrates the bug (a patch to an existing test file is
+preferred).
+
+If you are submitting a code patch there are several other things that
+you need to do.
+
+=over 4
+
+=item Comments, Comments, Comments
+
+Be sure to adequately comment your code. While commenting every line
+is unnecessary, anything that takes advantage of side effects of
+operators, that creates changes that will be felt outside of the
+function being patched, or that others may find confusing should be
+documented. If you are going to err, it is better to err on the side
+of adding too many comments than too few.
+
+=item Style
+
+In general, please follow the particular style of the code you are
+patching.
+
+In particular, follow these general guidelines for patching Perl
+sources:
+
+ 8-wide tabs (no exceptions!)
+ 4-wide indents for code, 2-wide indents for nested CPP #defines
+ try hard not to exceed 79-columns
+ ANSI C prototypes
+ uncuddled elses and "K&R" style for indenting control constructs
+ no C++ style (//) comments
+ mark places that need to be revisited with XXX (and revisit often!)
+ opening brace lines up with "if" when conditional spans multiple
+ lines; should be at end-of-line otherwise
+ in function definitions, name starts in column 0 (return value is on
+ previous line)
+ single space after keywords that are followed by parens, no space
+ between function name and following paren
+ avoid assignments in conditionals, but if they're unavoidable, use
+ extra paren, e.g. "if (a && (b = c)) ..."
+ "return foo;" rather than "return(foo);"
+ "if (!foo) ..." rather than "if (foo == FALSE) ..." etc.
+
+=item Testsuite
+
+When submitting a patch you should make every effort to also include an
+addition to perl's regression tests to properly exercise your patch.
+Your testsuite additions should generally follow these guidelines
+(courtesy of Gurusamy Sarathy <gsar@activestate.com>):
+
+ Know what you're testing. Read the docs, and the source.
+ Tend to fail, not succeed.
+ Interpret results strictly.
+ Use unrelated features (this will flush out bizarre interactions).
+ Use non-standard idioms (otherwise you are not testing TIMTOWTDI).
+ Avoid using hardcoded test numbers whenever possible (the
+ EXPECTED/GOT found in t/op/tie.t is much more maintainable,
+ and gives better failure reports).
+ Give meaningful error messages when a test fails.
+ Avoid using qx// and system() unless you are testing for them. If you
+ do use them, make sure that you cover _all_ perl platforms.
+ Unlink any temporary files you create.
+ Promote unforeseen warnings to errors with $SIG{__WARN__}.
+ Be sure to use the libraries and modules shipped with the version
+ being tested, not those that were already installed.
+ Add comments to the code explaining what you are testing for.
+ Make updating the '1..42' string unnecessary. Or make sure that
+ you update it.
+ Test _all_ behaviors of a given operator, library, or function:
+ - All optional arguments
+ - Return values in various contexts (boolean, scalar, list, lvalue)
+ - Use both global and lexical variables
+ - Don't forget the exceptional, pathological cases.
+
+=back
+
+=head1 ACCEPTING A PATCH
+
+If you have received a patch file generated using the above section,
+you should try out the patch.
+
+First we need to create a temporary new branch for these changes and
+switch into it:
+
+ % git checkout -b experimental
+
+Patches that were formatted by C<git format-patch> are applied with
+C<git am>:
+
+ % git am 0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
+ Applying Rename Leon Brocard to Orange Brocard
+
+If just a raw diff is provided, it is also possible use this two-step
+process:
+
+ % git apply bugfix.diff
+ % git commit -a -m "Some fixing" --author="That Guy <that.guy@internets.com>"
+
+Now we can inspect the change:
+
+ % git show HEAD
+ commit b1b3dab48344cff6de4087efca3dbd63548ab5e2
+ Author: Leon Brocard <acme@astray.com>
+ Date: Fri Dec 19 17:02:59 2008 +0000
+
+ Rename Leon Brocard to Orange Brocard
+
+ diff --git a/AUTHORS b/AUTHORS
+ index 293dd70..722c93e 100644
+ --- a/AUTHORS
+ +++ b/AUTHORS
+ @@ -541,7 +541,7 @@ Lars Hecking <lhecking@nmrc.ucc.ie>
+ Laszlo Molnar <laszlo.molnar@eth.ericsson.se>
+ Leif Huhn <leif@hale.dkstat.com>
+ Len Johnson <lenjay@ibm.net>
+ -Leon Brocard <acme@astray.com>
+ +Orange Brocard <acme@astray.com>
+ Les Peters <lpeters@aol.net>
+ Lesley Binks <lesley.binks@gmail.com>
+ Lincoln D. Stein <lstein@cshl.org>
+
+If you are a committer to Perl and you think the patch is good, you can
+then merge it into blead then push it out to the main repository:
+
+ % git checkout blead
+ % git merge experimental
+ % git push
+
+If you want to delete your temporary branch, you may do so with:
+
+ % git checkout blead
+ % git branch -d experimental
+ error: The branch 'experimental' is not an ancestor of your current HEAD.
+ If you are sure you want to delete it, run 'git branch -D experimental'.
+ % git branch -D experimental
+ Deleted branch experimental.
+
+=head1 CLEANING A WORKING DIRECTORY
+
+The command C<git clean> can with varying arguments be used as a
+replacement for C<make clean>.
+
+To reset your working directory to a pristine condition you can do:
+
+ git clean -dxf
+
+However, be aware this will delete ALL untracked content. You can use
+
+ git clean -Xf
+
+to remove all ignored untracked files, such as build and test
+byproduct, but leave any manually created files alone.
+
+If you only want to cancel some uncommitted edits, you can use C<git
+checkout> and give it a list of files to be reverted, or C<git checkout
+-f> to revert them all.
+
+If you want to cancel one or several commits, you can use C<git reset>.
+
+=head1 BISECTING
+
+C<git> provides a built-in way to determine, with a binary search in
+the history, which commit should be blamed for introducing a given bug.
+
+Suppose that we have a script F<~/testcase.pl> that exits with C<0>
+when some behaviour is correct, and with C<1> when it's faulty. We need
+an helper script that automates building C<perl> and running the
+testcase:
+
+ % cat ~/run
+ #!/bin/sh
+ git clean -dxf
+ # If you can use ccache, add -Dcc=ccache\ gcc -Dld=gcc to the Configure line
+ sh Configure -des -Dusedevel -Doptimize="-g"
+ test -f config.sh || exit 125
+ # Correct makefile for newer GNU gcc
+ perl -ni -we 'print unless /<(?:built-in|command)/' makefile x2p/makefile
+ # if you just need miniperl, replace test_prep with miniperl
+ make -j4 test_prep
+ -x ./perl || exit 125
+ ./perl -Ilib ~/testcase.pl
+ ret=$?
+ git clean -dxf
+ exit $ret
+
+This script may return C<125> to indicate that the corresponding commit
+should be skipped. Otherwise, it returns the status of
+F<~/testcase.pl>.
+
+We first enter in bisect mode with:
+
+ % git bisect start
+
+For example, if the bug is present on C<HEAD> but wasn't in 5.10.0,
+C<git> will learn about this when you enter:
+
+ % git bisect bad
+ % git bisect good perl-5.10.0
+ Bisecting: 853 revisions left to test after this
+
+This results in checking out the median commit between C<HEAD> and
+C<perl-5.10.0>. We can then run the bisecting process with:
+
+ % git bisect run ~/run
+
+When the first bad commit is isolated, C<git bisect> will tell you so:
+
+ ca4cfd28534303b82a216cfe83a1c80cbc3b9dc5 is first bad commit
+ commit ca4cfd28534303b82a216cfe83a1c80cbc3b9dc5
+ Author: Dave Mitchell <davem@fdisolutions.com>
+ Date: Sat Feb 9 14:56:23 2008 +0000
+
+ [perl #49472] Attributes + Unknown Error
+ ...
+
+ bisect run success
+
+You can peek into the bisecting process with C<git bisect log> and
+C<git bisect visualize>. C<git bisect reset> will get you out of bisect
+mode.
+
+Please note that the first C<good> state must be an ancestor of the
+first C<bad> state. If you want to search for the commit that I<solved>
+some bug, you have to negate your test case (i.e. exit with C<1> if OK
+and C<0> if not) and still mark the lower bound as C<good> and the
+upper as C<bad>. The "first bad commit" has then to be understood as
+the "first commit where the bug is solved".
+
+C<git help bisect> has much more information on how you can tweak your
+binary searches.
+
+=head1 SUBMITTING A PATCH VIA GITHUB
+
+GitHub is a website that makes it easy to fork and publish projects
+with Git. First you should set up a GitHub account and log in.
+
+Perl's git repository is mirrored on GitHub at this page:
+
+ http://github.com/github/perl/tree/blead
+
+Visit the page and click the "fork" button. This clones the Perl git
+repository for you and provides you with "Your Clone URL" from which
+you should clone:
+
+ % git clone git@github.com:USERNAME/perl.git perl-github
+
+We shall make the same patch as above, creating a new branch:
+
+ % cd perl-github
+ % git remote add upstream git://github.com/github/perl.git
+ % git pull upstream blead
+ % git checkout -b orange
+ % perl -pi -e 's{Leon Brocard}{Orange Brocard}' AUTHORS
+ % git commit -a -m 'Rename Leon Brocard to Orange Brocard'
+ % git push origin orange
+
+The orange branch has been pushed to GitHub, so you should now send an
+email to perl5-porters@perl.org with a description of your changes and
+the following information:
+
+ http://github.com/USERNAME/perl/tree/orange
+ git@github.com:USERNAME/perl.git branch orange
+
+=head1 MERGING FROM A BRANCH VIA GITHUB
+
+If someone has provided a branch via GitHub and you are a committer,
+you should use the following in your perl-ssh directory:
+
+ % git remote add dandv git://github.com/dandv/perl.git
+ % git fetch
+
+Now you can see the differences between the branch and blead:
+
+ % git diff dandv/blead
+
+And you can see the commits:
+
+ % git log dandv/blead
+
+If you approve of a specific commit, you can cherry pick it:
+
+ % git cherry-pick 3adac458cb1c1d41af47fc66e67b49c8dec2323f
+
+Or you could just merge the whole branch if you like it all:
+
+ % git merge dandv/blead
+
+And then push back to the repository:
+
+ % git push
+
+=head1 COMMITTING TO MAINTENANCE VERSIONS
+
+Maintenance versions should only be altered to add critical bug fixes.
+
+To commit to a maintenance version of perl, you need to create a local
+tracking branch:
+
+ % git checkout --track -b maint-5.005 origin/maint-5.005
+
+This creates a local branch named C<maint-5.005>, which tracks the
+remote branch C<origin/maint-5.005>. Then you can pull, commit, merge
+and push as before.
+
+You can also cherry-pick commits from blead and another branch, by
+using the C<git cherry-pick> command. It is recommended to use the
+B<-x> option to C<git cherry-pick> in order to record the SHA1 of the
+original commit in the new commit message.
+
+=head1 SEE ALSO
+
+The git documentation, accessible via C<git help command>.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlrequick.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlrequick.pod
new file mode 100755
index 00000000000..7abd895e8a8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlrequick.pod
@@ -0,0 +1,516 @@
+=head1 NAME
+
+perlrequick - Perl regular expressions quick start
+
+=head1 DESCRIPTION
+
+This page covers the very basics of understanding, creating and
+using regular expressions ('regexes') in Perl.
+
+
+=head1 The Guide
+
+=head2 Simple word matching
+
+The simplest regex is simply a word, or more generally, a string of
+characters. A regex consisting of a word matches any string that
+contains that word:
+
+ "Hello World" =~ /World/; # matches
+
+In this statement, C<World> is a regex and the C<//> enclosing
+C</World/> tells perl to search a string for a match. The operator
+C<=~> associates the string with the regex match and produces a true
+value if the regex matched, or false if the regex did not match. In
+our case, C<World> matches the second word in C<"Hello World">, so the
+expression is true. This idea has several variations.
+
+Expressions like this are useful in conditionals:
+
+ print "It matches\n" if "Hello World" =~ /World/;
+
+The sense of the match can be reversed by using C<!~> operator:
+
+ print "It doesn't match\n" if "Hello World" !~ /World/;
+
+The literal string in the regex can be replaced by a variable:
+
+ $greeting = "World";
+ print "It matches\n" if "Hello World" =~ /$greeting/;
+
+If you're matching against C<$_>, the C<$_ =~> part can be omitted:
+
+ $_ = "Hello World";
+ print "It matches\n" if /World/;
+
+Finally, the C<//> default delimiters for a match can be changed to
+arbitrary delimiters by putting an C<'m'> out front:
+
+ "Hello World" =~ m!World!; # matches, delimited by '!'
+ "Hello World" =~ m{World}; # matches, note the matching '{}'
+ "/usr/bin/perl" =~ m"/perl"; # matches after '/usr/bin',
+ # '/' becomes an ordinary char
+
+Regexes must match a part of the string I<exactly> in order for the
+statement to be true:
+
+ "Hello World" =~ /world/; # doesn't match, case sensitive
+ "Hello World" =~ /o W/; # matches, ' ' is an ordinary char
+ "Hello World" =~ /World /; # doesn't match, no ' ' at end
+
+perl will always match at the earliest possible point in the string:
+
+ "Hello World" =~ /o/; # matches 'o' in 'Hello'
+ "That hat is red" =~ /hat/; # matches 'hat' in 'That'
+
+Not all characters can be used 'as is' in a match. Some characters,
+called B<metacharacters>, are reserved for use in regex notation.
+The metacharacters are
+
+ {}[]()^$.|*+?\
+
+A metacharacter can be matched by putting a backslash before it:
+
+ "2+2=4" =~ /2+2/; # doesn't match, + is a metacharacter
+ "2+2=4" =~ /2\+2/; # matches, \+ is treated like an ordinary +
+ 'C:\WIN32' =~ /C:\\WIN/; # matches
+ "/usr/bin/perl" =~ /\/usr\/bin\/perl/; # matches
+
+In the last regex, the forward slash C<'/'> is also backslashed,
+because it is used to delimit the regex.
+
+Non-printable ASCII characters are represented by B<escape sequences>.
+Common examples are C<\t> for a tab, C<\n> for a newline, and C<\r>
+for a carriage return. Arbitrary bytes are represented by octal
+escape sequences, e.g., C<\033>, or hexadecimal escape sequences,
+e.g., C<\x1B>:
+
+ "1000\t2000" =~ m(0\t2) # matches
+ "cat" =~ /\143\x61\x74/ # matches, but a weird way to spell cat
+
+Regexes are treated mostly as double quoted strings, so variable
+substitution works:
+
+ $foo = 'house';
+ 'cathouse' =~ /cat$foo/; # matches
+ 'housecat' =~ /${foo}cat/; # matches
+
+With all of the regexes above, if the regex matched anywhere in the
+string, it was considered a match. To specify I<where> it should
+match, we would use the B<anchor> metacharacters C<^> and C<$>. The
+anchor C<^> means match at the beginning of the string and the anchor
+C<$> means match at the end of the string, or before a newline at the
+end of the string. Some examples:
+
+ "housekeeper" =~ /keeper/; # matches
+ "housekeeper" =~ /^keeper/; # doesn't match
+ "housekeeper" =~ /keeper$/; # matches
+ "housekeeper\n" =~ /keeper$/; # matches
+ "housekeeper" =~ /^housekeeper$/; # matches
+
+=head2 Using character classes
+
+A B<character class> allows a set of possible characters, rather than
+just a single character, to match at a particular point in a regex.
+Character classes are denoted by brackets C<[...]>, with the set of
+characters to be possibly matched inside. Here are some examples:
+
+ /cat/; # matches 'cat'
+ /[bcr]at/; # matches 'bat', 'cat', or 'rat'
+ "abc" =~ /[cab]/; # matches 'a'
+
+In the last statement, even though C<'c'> is the first character in
+the class, the earliest point at which the regex can match is C<'a'>.
+
+ /[yY][eE][sS]/; # match 'yes' in a case-insensitive way
+ # 'yes', 'Yes', 'YES', etc.
+ /yes/i; # also match 'yes' in a case-insensitive way
+
+The last example shows a match with an C<'i'> B<modifier>, which makes
+the match case-insensitive.
+
+Character classes also have ordinary and special characters, but the
+sets of ordinary and special characters inside a character class are
+different than those outside a character class. The special
+characters for a character class are C<-]\^$> and are matched using an
+escape:
+
+ /[\]c]def/; # matches ']def' or 'cdef'
+ $x = 'bcr';
+ /[$x]at/; # matches 'bat, 'cat', or 'rat'
+ /[\$x]at/; # matches '$at' or 'xat'
+ /[\\$x]at/; # matches '\at', 'bat, 'cat', or 'rat'
+
+The special character C<'-'> acts as a range operator within character
+classes, so that the unwieldy C<[0123456789]> and C<[abc...xyz]>
+become the svelte C<[0-9]> and C<[a-z]>:
+
+ /item[0-9]/; # matches 'item0' or ... or 'item9'
+ /[0-9a-fA-F]/; # matches a hexadecimal digit
+
+If C<'-'> is the first or last character in a character class, it is
+treated as an ordinary character.
+
+The special character C<^> in the first position of a character class
+denotes a B<negated character class>, which matches any character but
+those in the brackets. Both C<[...]> and C<[^...]> must match a
+character, or the match fails. Then
+
+ /[^a]at/; # doesn't match 'aat' or 'at', but matches
+ # all other 'bat', 'cat, '0at', '%at', etc.
+ /[^0-9]/; # matches a non-numeric character
+ /[a^]at/; # matches 'aat' or '^at'; here '^' is ordinary
+
+Perl has several abbreviations for common character classes:
+
+=over 4
+
+=item *
+
+\d is a digit and represents
+
+ [0-9]
+
+=item *
+
+\s is a whitespace character and represents
+
+ [\ \t\r\n\f]
+
+=item *
+
+\w is a word character (alphanumeric or _) and represents
+
+ [0-9a-zA-Z_]
+
+=item *
+
+\D is a negated \d; it represents any character but a digit
+
+ [^0-9]
+
+=item *
+
+\S is a negated \s; it represents any non-whitespace character
+
+ [^\s]
+
+=item *
+
+\W is a negated \w; it represents any non-word character
+
+ [^\w]
+
+=item *
+
+The period '.' matches any character but "\n"
+
+=back
+
+The C<\d\s\w\D\S\W> abbreviations can be used both inside and outside
+of character classes. Here are some in use:
+
+ /\d\d:\d\d:\d\d/; # matches a hh:mm:ss time format
+ /[\d\s]/; # matches any digit or whitespace character
+ /\w\W\w/; # matches a word char, followed by a
+ # non-word char, followed by a word char
+ /..rt/; # matches any two chars, followed by 'rt'
+ /end\./; # matches 'end.'
+ /end[.]/; # same thing, matches 'end.'
+
+The S<B<word anchor> > C<\b> matches a boundary between a word
+character and a non-word character C<\w\W> or C<\W\w>:
+
+ $x = "Housecat catenates house and cat";
+ $x =~ /\bcat/; # matches cat in 'catenates'
+ $x =~ /cat\b/; # matches cat in 'housecat'
+ $x =~ /\bcat\b/; # matches 'cat' at end of string
+
+In the last example, the end of the string is considered a word
+boundary.
+
+=head2 Matching this or that
+
+We can match different character strings with the B<alternation>
+metacharacter C<'|'>. To match C<dog> or C<cat>, we form the regex
+C<dog|cat>. As before, perl will try to match the regex at the
+earliest possible point in the string. At each character position,
+perl will first try to match the first alternative, C<dog>. If
+C<dog> doesn't match, perl will then try the next alternative, C<cat>.
+If C<cat> doesn't match either, then the match fails and perl moves to
+the next position in the string. Some examples:
+
+ "cats and dogs" =~ /cat|dog|bird/; # matches "cat"
+ "cats and dogs" =~ /dog|cat|bird/; # matches "cat"
+
+Even though C<dog> is the first alternative in the second regex,
+C<cat> is able to match earlier in the string.
+
+ "cats" =~ /c|ca|cat|cats/; # matches "c"
+ "cats" =~ /cats|cat|ca|c/; # matches "cats"
+
+At a given character position, the first alternative that allows the
+regex match to succeed will be the one that matches. Here, all the
+alternatives match at the first string position, so the first matches.
+
+=head2 Grouping things and hierarchical matching
+
+The B<grouping> metacharacters C<()> allow a part of a regex to be
+treated as a single unit. Parts of a regex are grouped by enclosing
+them in parentheses. The regex C<house(cat|keeper)> means match
+C<house> followed by either C<cat> or C<keeper>. Some more examples
+are
+
+ /(a|b)b/; # matches 'ab' or 'bb'
+ /(^a|b)c/; # matches 'ac' at start of string or 'bc' anywhere
+
+ /house(cat|)/; # matches either 'housecat' or 'house'
+ /house(cat(s|)|)/; # matches either 'housecats' or 'housecat' or
+ # 'house'. Note groups can be nested.
+
+ "20" =~ /(19|20|)\d\d/; # matches the null alternative '()\d\d',
+ # because '20\d\d' can't match
+
+=head2 Extracting matches
+
+The grouping metacharacters C<()> also allow the extraction of the
+parts of a string that matched. For each grouping, the part that
+matched inside goes into the special variables C<$1>, C<$2>, etc.
+They can be used just as ordinary variables:
+
+ # extract hours, minutes, seconds
+ $time =~ /(\d\d):(\d\d):(\d\d)/; # match hh:mm:ss format
+ $hours = $1;
+ $minutes = $2;
+ $seconds = $3;
+
+In list context, a match C</regex/> with groupings will return the
+list of matched values C<($1,$2,...)>. So we could rewrite it as
+
+ ($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/);
+
+If the groupings in a regex are nested, C<$1> gets the group with the
+leftmost opening parenthesis, C<$2> the next opening parenthesis,
+etc. For example, here is a complex regex and the matching variables
+indicated below it:
+
+ /(ab(cd|ef)((gi)|j))/;
+ 1 2 34
+
+Associated with the matching variables C<$1>, C<$2>, ... are
+the B<backreferences> C<\1>, C<\2>, ... Backreferences are
+matching variables that can be used I<inside> a regex:
+
+ /(\w\w\w)\s\1/; # find sequences like 'the the' in string
+
+C<$1>, C<$2>, ... should only be used outside of a regex, and C<\1>,
+C<\2>, ... only inside a regex.
+
+=head2 Matching repetitions
+
+The B<quantifier> metacharacters C<?>, C<*>, C<+>, and C<{}> allow us
+to determine the number of repeats of a portion of a regex we
+consider to be a match. Quantifiers are put immediately after the
+character, character class, or grouping that we want to specify. They
+have the following meanings:
+
+=over 4
+
+=item *
+
+C<a?> = match 'a' 1 or 0 times
+
+=item *
+
+C<a*> = match 'a' 0 or more times, i.e., any number of times
+
+=item *
+
+C<a+> = match 'a' 1 or more times, i.e., at least once
+
+=item *
+
+C<a{n,m}> = match at least C<n> times, but not more than C<m>
+times.
+
+=item *
+
+C<a{n,}> = match at least C<n> or more times
+
+=item *
+
+C<a{n}> = match exactly C<n> times
+
+=back
+
+Here are some examples:
+
+ /[a-z]+\s+\d*/; # match a lowercase word, at least some space, and
+ # any number of digits
+ /(\w+)\s+\1/; # match doubled words of arbitrary length
+ $year =~ /\d{2,4}/; # make sure year is at least 2 but not more
+ # than 4 digits
+ $year =~ /\d{4}|\d{2}/; # better match; throw out 3 digit dates
+
+These quantifiers will try to match as much of the string as possible,
+while still allowing the regex to match. So we have
+
+ $x = 'the cat in the hat';
+ $x =~ /^(.*)(at)(.*)$/; # matches,
+ # $1 = 'the cat in the h'
+ # $2 = 'at'
+ # $3 = '' (0 matches)
+
+The first quantifier C<.*> grabs as much of the string as possible
+while still having the regex match. The second quantifier C<.*> has
+no string left to it, so it matches 0 times.
+
+=head2 More matching
+
+There are a few more things you might want to know about matching
+operators. In the code
+
+ $pattern = 'Seuss';
+ while (<>) {
+ print if /$pattern/;
+ }
+
+perl has to re-evaluate C<$pattern> each time through the loop. If
+C<$pattern> won't be changing, use the C<//o> modifier, to only
+perform variable substitutions once. If you don't want any
+substitutions at all, use the special delimiter C<m''>:
+
+ @pattern = ('Seuss');
+ m/@pattern/; # matches 'Seuss'
+ m'@pattern'; # matches the literal string '@pattern'
+
+The global modifier C<//g> allows the matching operator to match
+within a string as many times as possible. In scalar context,
+successive matches against a string will have C<//g> jump from match
+to match, keeping track of position in the string as it goes along.
+You can get or set the position with the C<pos()> function.
+For example,
+
+ $x = "cat dog house"; # 3 words
+ while ($x =~ /(\w+)/g) {
+ print "Word is $1, ends at position ", pos $x, "\n";
+ }
+
+prints
+
+ Word is cat, ends at position 3
+ Word is dog, ends at position 7
+ Word is house, ends at position 13
+
+A failed match or changing the target string resets the position. If
+you don't want the position reset after failure to match, add the
+C<//c>, as in C</regex/gc>.
+
+In list context, C<//g> returns a list of matched groupings, or if
+there are no groupings, a list of matches to the whole regex. So
+
+ @words = ($x =~ /(\w+)/g); # matches,
+ # $word[0] = 'cat'
+ # $word[1] = 'dog'
+ # $word[2] = 'house'
+
+=head2 Search and replace
+
+Search and replace is performed using C<s/regex/replacement/modifiers>.
+The C<replacement> is a Perl double quoted string that replaces in the
+string whatever is matched with the C<regex>. The operator C<=~> is
+also used here to associate a string with C<s///>. If matching
+against C<$_>, the S<C<$_ =~> > can be dropped. If there is a match,
+C<s///> returns the number of substitutions made, otherwise it returns
+false. Here are a few examples:
+
+ $x = "Time to feed the cat!";
+ $x =~ s/cat/hacker/; # $x contains "Time to feed the hacker!"
+ $y = "'quoted words'";
+ $y =~ s/^'(.*)'$/$1/; # strip single quotes,
+ # $y contains "quoted words"
+
+With the C<s///> operator, the matched variables C<$1>, C<$2>, etc.
+are immediately available for use in the replacement expression. With
+the global modifier, C<s///g> will search and replace all occurrences
+of the regex in the string:
+
+ $x = "I batted 4 for 4";
+ $x =~ s/4/four/; # $x contains "I batted four for 4"
+ $x = "I batted 4 for 4";
+ $x =~ s/4/four/g; # $x contains "I batted four for four"
+
+The evaluation modifier C<s///e> wraps an C<eval{...}> around the
+replacement string and the evaluated result is substituted for the
+matched substring. Some examples:
+
+ # reverse all the words in a string
+ $x = "the cat in the hat";
+ $x =~ s/(\w+)/reverse $1/ge; # $x contains "eht tac ni eht tah"
+
+ # convert percentage to decimal
+ $x = "A 39% hit rate";
+ $x =~ s!(\d+)%!$1/100!e; # $x contains "A 0.39 hit rate"
+
+The last example shows that C<s///> can use other delimiters, such as
+C<s!!!> and C<s{}{}>, and even C<s{}//>. If single quotes are used
+C<s'''>, then the regex and replacement are treated as single quoted
+strings.
+
+=head2 The split operator
+
+C<split /regex/, string> splits C<string> into a list of substrings
+and returns that list. The regex determines the character sequence
+that C<string> is split with respect to. For example, to split a
+string into words, use
+
+ $x = "Calvin and Hobbes";
+ @word = split /\s+/, $x; # $word[0] = 'Calvin'
+ # $word[1] = 'and'
+ # $word[2] = 'Hobbes'
+
+To extract a comma-delimited list of numbers, use
+
+ $x = "1.618,2.718, 3.142";
+ @const = split /,\s*/, $x; # $const[0] = '1.618'
+ # $const[1] = '2.718'
+ # $const[2] = '3.142'
+
+If the empty regex C<//> is used, the string is split into individual
+characters. If the regex has groupings, then the list produced contains
+the matched substrings from the groupings as well:
+
+ $x = "/usr/bin";
+ @parts = split m!(/)!, $x; # $parts[0] = ''
+ # $parts[1] = '/'
+ # $parts[2] = 'usr'
+ # $parts[3] = '/'
+ # $parts[4] = 'bin'
+
+Since the first character of $x matched the regex, C<split> prepended
+an empty initial element to the list.
+
+=head1 BUGS
+
+None.
+
+=head1 SEE ALSO
+
+This is just a quick start guide. For a more in-depth tutorial on
+regexes, see L<perlretut> and for the reference page, see L<perlre>.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 2000 Mark Kvale
+All rights reserved.
+
+This document may be distributed under the same terms as Perl itself.
+
+=head2 Acknowledgments
+
+The author would like to thank Mark-Jason Dominus, Tom Christiansen,
+Ilya Zakharevich, Brad Hughes, and Mike Giroux for all their helpful
+comments.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlreref.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlreref.pod
new file mode 100755
index 00000000000..b9fb3b02026
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlreref.pod
@@ -0,0 +1,364 @@
+=head1 NAME
+
+perlreref - Perl Regular Expressions Reference
+
+=head1 DESCRIPTION
+
+This is a quick reference to Perl's regular expressions.
+For full information see L<perlre> and L<perlop>, as well
+as the L</"SEE ALSO"> section in this document.
+
+=head2 OPERATORS
+
+C<=~> determines to which variable the regex is applied.
+In its absence, $_ is used.
+
+ $var =~ /foo/;
+
+C<!~> determines to which variable the regex is applied,
+and negates the result of the match; it returns
+false if the match succeeds, and true if it fails.
+
+ $var !~ /foo/;
+
+C<m/pattern/msixpogc> searches a string for a pattern match,
+applying the given options.
+
+ m Multiline mode - ^ and $ match internal lines
+ s match as a Single line - . matches \n
+ i case-Insensitive
+ x eXtended legibility - free whitespace and comments
+ p Preserve a copy of the matched string -
+ ${^PREMATCH}, ${^MATCH}, ${^POSTMATCH} will be defined.
+ o compile pattern Once
+ g Global - all occurrences
+ c don't reset pos on failed matches when using /g
+
+If 'pattern' is an empty string, the last I<successfully> matched
+regex is used. Delimiters other than '/' may be used for both this
+operator and the following ones. The leading C<m> can be omitted
+if the delimiter is '/'.
+
+C<qr/pattern/msixpo> lets you store a regex in a variable,
+or pass one around. Modifiers as for C<m//>, and are stored
+within the regex.
+
+C<s/pattern/replacement/msixpogce> substitutes matches of
+'pattern' with 'replacement'. Modifiers as for C<m//>,
+with one addition:
+
+ e Evaluate 'replacement' as an expression
+
+'e' may be specified multiple times. 'replacement' is interpreted
+as a double quoted string unless a single-quote (C<'>) is the delimiter.
+
+C<?pattern?> is like C<m/pattern/> but matches only once. No alternate
+delimiters can be used. Must be reset with reset().
+
+=head2 SYNTAX
+
+ \ Escapes the character immediately following it
+ . Matches any single character except a newline (unless /s is used)
+ ^ Matches at the beginning of the string (or line, if /m is used)
+ $ Matches at the end of the string (or line, if /m is used)
+ * Matches the preceding element 0 or more times
+ + Matches the preceding element 1 or more times
+ ? Matches the preceding element 0 or 1 times
+ {...} Specifies a range of occurrences for the element preceding it
+ [...] Matches any one of the characters contained within the brackets
+ (...) Groups subexpressions for capturing to $1, $2...
+ (?:...) Groups subexpressions without capturing (cluster)
+ | Matches either the subexpression preceding or following it
+ \1, \2, \3 ... Matches the text from the Nth group
+ \g1 or \g{1}, \g2 ... Matches the text from the Nth group
+ \g-1 or \g{-1}, \g-2 ... Matches the text from the Nth previous group
+ \g{name} Named backreference
+ \k<name> Named backreference
+ \k'name' Named backreference
+ (?P=name) Named backreference (python syntax)
+
+=head2 ESCAPE SEQUENCES
+
+These work as in normal strings.
+
+ \a Alarm (beep)
+ \e Escape
+ \f Formfeed
+ \n Newline
+ \r Carriage return
+ \t Tab
+ \037 Any octal ASCII value
+ \x7f Any hexadecimal ASCII value
+ \x{263a} A wide hexadecimal value
+ \cx Control-x
+ \N{name} A named character
+
+ \l Lowercase next character
+ \u Titlecase next character
+ \L Lowercase until \E
+ \U Uppercase until \E
+ \Q Disable pattern metacharacters until \E
+ \E End modification
+
+For Titlecase, see L</Titlecase>.
+
+This one works differently from normal strings:
+
+ \b An assertion, not backspace, except in a character class
+
+=head2 CHARACTER CLASSES
+
+ [amy] Match 'a', 'm' or 'y'
+ [f-j] Dash specifies "range"
+ [f-j-] Dash escaped or at start or end means 'dash'
+ [^f-j] Caret indicates "match any character _except_ these"
+
+The following sequences work within or without a character class.
+The first six are locale aware, all are Unicode aware. See L<perllocale>
+and L<perlunicode> for details.
+
+ \d A digit
+ \D A nondigit
+ \w A word character
+ \W A non-word character
+ \s A whitespace character
+ \S A non-whitespace character
+ \h An horizontal white space
+ \H A non horizontal white space
+ \v A vertical white space
+ \V A non vertical white space
+ \R A generic newline (?>\v|\x0D\x0A)
+
+ \C Match a byte (with Unicode, '.' matches a character)
+ \pP Match P-named (Unicode) property
+ \p{...} Match Unicode property with long name
+ \PP Match non-P
+ \P{...} Match lack of Unicode property with long name
+ \X Match extended Unicode combining character sequence
+
+POSIX character classes and their Unicode and Perl equivalents:
+
+ alnum IsAlnum Alphanumeric
+ alpha IsAlpha Alphabetic
+ ascii IsASCII Any ASCII char
+ blank IsSpace [ \t] Horizontal whitespace (GNU extension)
+ cntrl IsCntrl Control characters
+ digit IsDigit \d Digits
+ graph IsGraph Alphanumeric and punctuation
+ lower IsLower Lowercase chars (locale and Unicode aware)
+ print IsPrint Alphanumeric, punct, and space
+ punct IsPunct Punctuation
+ space IsSpace [\s\ck] Whitespace
+ IsSpacePerl \s Perl's whitespace definition
+ upper IsUpper Uppercase chars (locale and Unicode aware)
+ word IsWord \w Alphanumeric plus _ (Perl extension)
+ xdigit IsXDigit [0-9A-Fa-f] Hexadecimal digit
+
+Within a character class:
+
+ POSIX traditional Unicode
+ [:digit:] \d \p{IsDigit}
+ [:^digit:] \D \P{IsDigit}
+
+=head2 ANCHORS
+
+All are zero-width assertions.
+
+ ^ Match string start (or line, if /m is used)
+ $ Match string end (or line, if /m is used) or before newline
+ \b Match word boundary (between \w and \W)
+ \B Match except at word boundary (between \w and \w or \W and \W)
+ \A Match string start (regardless of /m)
+ \Z Match string end (before optional newline)
+ \z Match absolute string end
+ \G Match where previous m//g left off
+
+ \K Keep the stuff left of the \K, don't include it in $&
+
+=head2 QUANTIFIERS
+
+Quantifiers are greedy by default -- match the B<longest> leftmost.
+
+ Maximal Minimal Possessive Allowed range
+ ------- ------- ---------- -------------
+ {n,m} {n,m}? {n,m}+ Must occur at least n times
+ but no more than m times
+ {n,} {n,}? {n,}+ Must occur at least n times
+ {n} {n}? {n}+ Must occur exactly n times
+ * *? *+ 0 or more times (same as {0,})
+ + +? ++ 1 or more times (same as {1,})
+ ? ?? ?+ 0 or 1 time (same as {0,1})
+
+The possessive forms (new in Perl 5.10) prevent backtracking: what gets
+matched by a pattern with a possessive quantifier will not be backtracked
+into, even if that causes the whole match to fail.
+
+There is no quantifier {,n} -- that gets understood as a literal string.
+
+=head2 EXTENDED CONSTRUCTS
+
+ (?#text) A comment
+ (?:...) Groups subexpressions without capturing (cluster)
+ (?pimsx-imsx:...) Enable/disable option (as per m// modifiers)
+ (?=...) Zero-width positive lookahead assertion
+ (?!...) Zero-width negative lookahead assertion
+ (?<=...) Zero-width positive lookbehind assertion
+ (?<!...) Zero-width negative lookbehind assertion
+ (?>...) Grab what we can, prohibit backtracking
+ (?|...) Branch reset
+ (?<name>...) Named capture
+ (?'name'...) Named capture
+ (?P<name>...) Named capture (python syntax)
+ (?{ code }) Embedded code, return value becomes $^R
+ (??{ code }) Dynamic regex, return value used as regex
+ (?N) Recurse into subpattern number N
+ (?-N), (?+N) Recurse into Nth previous/next subpattern
+ (?R), (?0) Recurse at the beginning of the whole pattern
+ (?&name) Recurse into a named subpattern
+ (?P>name) Recurse into a named subpattern (python syntax)
+ (?(cond)yes|no)
+ (?(cond)yes) Conditional expression, where "cond" can be:
+ (N) subpattern N has matched something
+ (<name>) named subpattern has matched something
+ ('name') named subpattern has matched something
+ (?{code}) code condition
+ (R) true if recursing
+ (RN) true if recursing into Nth subpattern
+ (R&name) true if recursing into named subpattern
+ (DEFINE) always false, no no-pattern allowed
+
+=head2 VARIABLES
+
+ $_ Default variable for operators to use
+
+ $` Everything prior to matched string
+ $& Entire matched string
+ $' Everything after to matched string
+
+ ${^PREMATCH} Everything prior to matched string
+ ${^MATCH} Entire matched string
+ ${^POSTMATCH} Everything after to matched string
+
+The use of C<$`>, C<$&> or C<$'> will slow down B<all> regex use
+within your program. Consult L<perlvar> for C<@->
+to see equivalent expressions that won't cause slow down.
+See also L<Devel::SawAmpersand>. Starting with Perl 5.10, you
+can also use the equivalent variables C<${^PREMATCH}>, C<${^MATCH}>
+and C<${^POSTMATCH}>, but for them to be defined, you have to
+specify the C</p> (preserve) modifier on your regular expression.
+
+ $1, $2 ... hold the Xth captured expr
+ $+ Last parenthesized pattern match
+ $^N Holds the most recently closed capture
+ $^R Holds the result of the last (?{...}) expr
+ @- Offsets of starts of groups. $-[0] holds start of whole match
+ @+ Offsets of ends of groups. $+[0] holds end of whole match
+ %+ Named capture buffers
+ %- Named capture buffers, as array refs
+
+Captured groups are numbered according to their I<opening> paren.
+
+=head2 FUNCTIONS
+
+ lc Lowercase a string
+ lcfirst Lowercase first char of a string
+ uc Uppercase a string
+ ucfirst Titlecase first char of a string
+
+ pos Return or set current match position
+ quotemeta Quote metacharacters
+ reset Reset ?pattern? status
+ study Analyze string for optimizing matching
+
+ split Use a regex to split a string into parts
+
+The first four of these are like the escape sequences C<\L>, C<\l>,
+C<\U>, and C<\u>. For Titlecase, see L</Titlecase>.
+
+=head2 TERMINOLOGY
+
+=head3 Titlecase
+
+Unicode concept which most often is equal to uppercase, but for
+certain characters like the German "sharp s" there is a difference.
+
+=head1 AUTHOR
+
+Iain Truskett. Updated by the Perl 5 Porters.
+
+This document may be distributed under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item *
+
+L<perlretut> for a tutorial on regular expressions.
+
+=item *
+
+L<perlrequick> for a rapid tutorial.
+
+=item *
+
+L<perlre> for more details.
+
+=item *
+
+L<perlvar> for details on the variables.
+
+=item *
+
+L<perlop> for details on the operators.
+
+=item *
+
+L<perlfunc> for details on the functions.
+
+=item *
+
+L<perlfaq6> for FAQs on regular expressions.
+
+=item *
+
+L<perlrebackslash> for a reference on backslash sequences.
+
+=item *
+
+L<perlrecharclass> for a reference on character classes.
+
+=item *
+
+The L<re> module to alter behaviour and aid
+debugging.
+
+=item *
+
+L<perldebug/"Debugging regular expressions">
+
+=item *
+
+L<perluniintro>, L<perlunicode>, L<charnames> and L<perllocale>
+for details on regexes and internationalisation.
+
+=item *
+
+I<Mastering Regular Expressions> by Jeffrey Friedl
+(F<http://regex.info/>) for a thorough grounding and
+reference on the topic.
+
+=back
+
+=head1 THANKS
+
+David P.C. Wollmann,
+Richard Soderberg,
+Sean M. Burke,
+Tom Christiansen,
+Jim Cromie,
+and
+Jeffrey Goff
+for useful advice.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlretut.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlretut.pod
new file mode 100755
index 00000000000..22fc44a7b2c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlretut.pod
@@ -0,0 +1,2870 @@
+=head1 NAME
+
+perlretut - Perl regular expressions tutorial
+
+=head1 DESCRIPTION
+
+This page provides a basic tutorial on understanding, creating and
+using regular expressions in Perl. It serves as a complement to the
+reference page on regular expressions L<perlre>. Regular expressions
+are an integral part of the C<m//>, C<s///>, C<qr//> and C<split>
+operators and so this tutorial also overlaps with
+L<perlop/"Regexp Quote-Like Operators"> and L<perlfunc/split>.
+
+Perl is widely renowned for excellence in text processing, and regular
+expressions are one of the big factors behind this fame. Perl regular
+expressions display an efficiency and flexibility unknown in most
+other computer languages. Mastering even the basics of regular
+expressions will allow you to manipulate text with surprising ease.
+
+What is a regular expression? A regular expression is simply a string
+that describes a pattern. Patterns are in common use these days;
+examples are the patterns typed into a search engine to find web pages
+and the patterns used to list files in a directory, e.g., C<ls *.txt>
+or C<dir *.*>. In Perl, the patterns described by regular expressions
+are used to search strings, extract desired parts of strings, and to
+do search and replace operations.
+
+Regular expressions have the undeserved reputation of being abstract
+and difficult to understand. Regular expressions are constructed using
+simple concepts like conditionals and loops and are no more difficult
+to understand than the corresponding C<if> conditionals and C<while>
+loops in the Perl language itself. In fact, the main challenge in
+learning regular expressions is just getting used to the terse
+notation used to express these concepts.
+
+This tutorial flattens the learning curve by discussing regular
+expression concepts, along with their notation, one at a time and with
+many examples. The first part of the tutorial will progress from the
+simplest word searches to the basic regular expression concepts. If
+you master the first part, you will have all the tools needed to solve
+about 98% of your needs. The second part of the tutorial is for those
+comfortable with the basics and hungry for more power tools. It
+discusses the more advanced regular expression operators and
+introduces the latest cutting edge innovations in 5.6.0.
+
+A note: to save time, 'regular expression' is often abbreviated as
+regexp or regex. Regexp is a more natural abbreviation than regex, but
+is harder to pronounce. The Perl pod documentation is evenly split on
+regexp vs regex; in Perl, there is more than one way to abbreviate it.
+We'll use regexp in this tutorial.
+
+=head1 Part 1: The basics
+
+=head2 Simple word matching
+
+The simplest regexp is simply a word, or more generally, a string of
+characters. A regexp consisting of a word matches any string that
+contains that word:
+
+ "Hello World" =~ /World/; # matches
+
+What is this Perl statement all about? C<"Hello World"> is a simple
+double quoted string. C<World> is the regular expression and the
+C<//> enclosing C</World/> tells Perl to search a string for a match.
+The operator C<=~> associates the string with the regexp match and
+produces a true value if the regexp matched, or false if the regexp
+did not match. In our case, C<World> matches the second word in
+C<"Hello World">, so the expression is true. Expressions like this
+are useful in conditionals:
+
+ if ("Hello World" =~ /World/) {
+ print "It matches\n";
+ }
+ else {
+ print "It doesn't match\n";
+ }
+
+There are useful variations on this theme. The sense of the match can
+be reversed by using the C<!~> operator:
+
+ if ("Hello World" !~ /World/) {
+ print "It doesn't match\n";
+ }
+ else {
+ print "It matches\n";
+ }
+
+The literal string in the regexp can be replaced by a variable:
+
+ $greeting = "World";
+ if ("Hello World" =~ /$greeting/) {
+ print "It matches\n";
+ }
+ else {
+ print "It doesn't match\n";
+ }
+
+If you're matching against the special default variable C<$_>, the
+C<$_ =~> part can be omitted:
+
+ $_ = "Hello World";
+ if (/World/) {
+ print "It matches\n";
+ }
+ else {
+ print "It doesn't match\n";
+ }
+
+And finally, the C<//> default delimiters for a match can be changed
+to arbitrary delimiters by putting an C<'m'> out front:
+
+ "Hello World" =~ m!World!; # matches, delimited by '!'
+ "Hello World" =~ m{World}; # matches, note the matching '{}'
+ "/usr/bin/perl" =~ m"/perl"; # matches after '/usr/bin',
+ # '/' becomes an ordinary char
+
+C</World/>, C<m!World!>, and C<m{World}> all represent the
+same thing. When, e.g., the quote (C<">) is used as a delimiter, the forward
+slash C<'/'> becomes an ordinary character and can be used in this regexp
+without trouble.
+
+Let's consider how different regexps would match C<"Hello World">:
+
+ "Hello World" =~ /world/; # doesn't match
+ "Hello World" =~ /o W/; # matches
+ "Hello World" =~ /oW/; # doesn't match
+ "Hello World" =~ /World /; # doesn't match
+
+The first regexp C<world> doesn't match because regexps are
+case-sensitive. The second regexp matches because the substring
+S<C<'o W'>> occurs in the string S<C<"Hello World">>. The space
+character ' ' is treated like any other character in a regexp and is
+needed to match in this case. The lack of a space character is the
+reason the third regexp C<'oW'> doesn't match. The fourth regexp
+C<'World '> doesn't match because there is a space at the end of the
+regexp, but not at the end of the string. The lesson here is that
+regexps must match a part of the string I<exactly> in order for the
+statement to be true.
+
+If a regexp matches in more than one place in the string, Perl will
+always match at the earliest possible point in the string:
+
+ "Hello World" =~ /o/; # matches 'o' in 'Hello'
+ "That hat is red" =~ /hat/; # matches 'hat' in 'That'
+
+With respect to character matching, there are a few more points you
+need to know about. First of all, not all characters can be used 'as
+is' in a match. Some characters, called I<metacharacters>, are reserved
+for use in regexp notation. The metacharacters are
+
+ {}[]()^$.|*+?\
+
+The significance of each of these will be explained
+in the rest of the tutorial, but for now, it is important only to know
+that a metacharacter can be matched by putting a backslash before it:
+
+ "2+2=4" =~ /2+2/; # doesn't match, + is a metacharacter
+ "2+2=4" =~ /2\+2/; # matches, \+ is treated like an ordinary +
+ "The interval is [0,1)." =~ /[0,1)./ # is a syntax error!
+ "The interval is [0,1)." =~ /\[0,1\)\./ # matches
+ "#!/usr/bin/perl" =~ /#!\/usr\/bin\/perl/; # matches
+
+In the last regexp, the forward slash C<'/'> is also backslashed,
+because it is used to delimit the regexp. This can lead to LTS
+(leaning toothpick syndrome), however, and it is often more readable
+to change delimiters.
+
+ "#!/usr/bin/perl" =~ m!#\!/usr/bin/perl!; # easier to read
+
+The backslash character C<'\'> is a metacharacter itself and needs to
+be backslashed:
+
+ 'C:\WIN32' =~ /C:\\WIN/; # matches
+
+In addition to the metacharacters, there are some ASCII characters
+which don't have printable character equivalents and are instead
+represented by I<escape sequences>. Common examples are C<\t> for a
+tab, C<\n> for a newline, C<\r> for a carriage return and C<\a> for a
+bell. If your string is better thought of as a sequence of arbitrary
+bytes, the octal escape sequence, e.g., C<\033>, or hexadecimal escape
+sequence, e.g., C<\x1B> may be a more natural representation for your
+bytes. Here are some examples of escapes:
+
+ "1000\t2000" =~ m(0\t2) # matches
+ "1000\n2000" =~ /0\n20/ # matches
+ "1000\t2000" =~ /\000\t2/ # doesn't match, "0" ne "\000"
+ "cat" =~ /\143\x61\x74/ # matches, but a weird way to spell cat
+
+If you've been around Perl a while, all this talk of escape sequences
+may seem familiar. Similar escape sequences are used in double-quoted
+strings and in fact the regexps in Perl are mostly treated as
+double-quoted strings. This means that variables can be used in
+regexps as well. Just like double-quoted strings, the values of the
+variables in the regexp will be substituted in before the regexp is
+evaluated for matching purposes. So we have:
+
+ $foo = 'house';
+ 'housecat' =~ /$foo/; # matches
+ 'cathouse' =~ /cat$foo/; # matches
+ 'housecat' =~ /${foo}cat/; # matches
+
+So far, so good. With the knowledge above you can already perform
+searches with just about any literal string regexp you can dream up.
+Here is a I<very simple> emulation of the Unix grep program:
+
+ % cat > simple_grep
+ #!/usr/bin/perl
+ $regexp = shift;
+ while (<>) {
+ print if /$regexp/;
+ }
+ ^D
+
+ % chmod +x simple_grep
+
+ % simple_grep abba /usr/dict/words
+ Babbage
+ cabbage
+ cabbages
+ sabbath
+ Sabbathize
+ Sabbathizes
+ sabbatical
+ scabbard
+ scabbards
+
+This program is easy to understand. C<#!/usr/bin/perl> is the standard
+way to invoke a perl program from the shell.
+S<C<$regexp = shift;>> saves the first command line argument as the
+regexp to be used, leaving the rest of the command line arguments to
+be treated as files. S<C<< while (<>) >>> loops over all the lines in
+all the files. For each line, S<C<print if /$regexp/;>> prints the
+line if the regexp matches the line. In this line, both C<print> and
+C</$regexp/> use the default variable C<$_> implicitly.
+
+With all of the regexps above, if the regexp matched anywhere in the
+string, it was considered a match. Sometimes, however, we'd like to
+specify I<where> in the string the regexp should try to match. To do
+this, we would use the I<anchor> metacharacters C<^> and C<$>. The
+anchor C<^> means match at the beginning of the string and the anchor
+C<$> means match at the end of the string, or before a newline at the
+end of the string. Here is how they are used:
+
+ "housekeeper" =~ /keeper/; # matches
+ "housekeeper" =~ /^keeper/; # doesn't match
+ "housekeeper" =~ /keeper$/; # matches
+ "housekeeper\n" =~ /keeper$/; # matches
+
+The second regexp doesn't match because C<^> constrains C<keeper> to
+match only at the beginning of the string, but C<"housekeeper"> has
+keeper starting in the middle. The third regexp does match, since the
+C<$> constrains C<keeper> to match only at the end of the string.
+
+When both C<^> and C<$> are used at the same time, the regexp has to
+match both the beginning and the end of the string, i.e., the regexp
+matches the whole string. Consider
+
+ "keeper" =~ /^keep$/; # doesn't match
+ "keeper" =~ /^keeper$/; # matches
+ "" =~ /^$/; # ^$ matches an empty string
+
+The first regexp doesn't match because the string has more to it than
+C<keep>. Since the second regexp is exactly the string, it
+matches. Using both C<^> and C<$> in a regexp forces the complete
+string to match, so it gives you complete control over which strings
+match and which don't. Suppose you are looking for a fellow named
+bert, off in a string by himself:
+
+ "dogbert" =~ /bert/; # matches, but not what you want
+
+ "dilbert" =~ /^bert/; # doesn't match, but ..
+ "bertram" =~ /^bert/; # matches, so still not good enough
+
+ "bertram" =~ /^bert$/; # doesn't match, good
+ "dilbert" =~ /^bert$/; # doesn't match, good
+ "bert" =~ /^bert$/; # matches, perfect
+
+Of course, in the case of a literal string, one could just as easily
+use the string comparison S<C<$string eq 'bert'>> and it would be
+more efficient. The C<^...$> regexp really becomes useful when we
+add in the more powerful regexp tools below.
+
+=head2 Using character classes
+
+Although one can already do quite a lot with the literal string
+regexps above, we've only scratched the surface of regular expression
+technology. In this and subsequent sections we will introduce regexp
+concepts (and associated metacharacter notations) that will allow a
+regexp to not just represent a single character sequence, but a I<whole
+class> of them.
+
+One such concept is that of a I<character class>. A character class
+allows a set of possible characters, rather than just a single
+character, to match at a particular point in a regexp. Character
+classes are denoted by brackets C<[...]>, with the set of characters
+to be possibly matched inside. Here are some examples:
+
+ /cat/; # matches 'cat'
+ /[bcr]at/; # matches 'bat, 'cat', or 'rat'
+ /item[0123456789]/; # matches 'item0' or ... or 'item9'
+ "abc" =~ /[cab]/; # matches 'a'
+
+In the last statement, even though C<'c'> is the first character in
+the class, C<'a'> matches because the first character position in the
+string is the earliest point at which the regexp can match.
+
+ /[yY][eE][sS]/; # match 'yes' in a case-insensitive way
+ # 'yes', 'Yes', 'YES', etc.
+
+This regexp displays a common task: perform a case-insensitive
+match. Perl provides a way of avoiding all those brackets by simply
+appending an C<'i'> to the end of the match. Then C</[yY][eE][sS]/;>
+can be rewritten as C</yes/i;>. The C<'i'> stands for
+case-insensitive and is an example of a I<modifier> of the matching
+operation. We will meet other modifiers later in the tutorial.
+
+We saw in the section above that there were ordinary characters, which
+represented themselves, and special characters, which needed a
+backslash C<\> to represent themselves. The same is true in a
+character class, but the sets of ordinary and special characters
+inside a character class are different than those outside a character
+class. The special characters for a character class are C<-]\^$> (and
+the pattern delimiter, whatever it is).
+C<]> is special because it denotes the end of a character class. C<$> is
+special because it denotes a scalar variable. C<\> is special because
+it is used in escape sequences, just like above. Here is how the
+special characters C<]$\> are handled:
+
+ /[\]c]def/; # matches ']def' or 'cdef'
+ $x = 'bcr';
+ /[$x]at/; # matches 'bat', 'cat', or 'rat'
+ /[\$x]at/; # matches '$at' or 'xat'
+ /[\\$x]at/; # matches '\at', 'bat, 'cat', or 'rat'
+
+The last two are a little tricky. In C<[\$x]>, the backslash protects
+the dollar sign, so the character class has two members C<$> and C<x>.
+In C<[\\$x]>, the backslash is protected, so C<$x> is treated as a
+variable and substituted in double quote fashion.
+
+The special character C<'-'> acts as a range operator within character
+classes, so that a contiguous set of characters can be written as a
+range. With ranges, the unwieldy C<[0123456789]> and C<[abc...xyz]>
+become the svelte C<[0-9]> and C<[a-z]>. Some examples are
+
+ /item[0-9]/; # matches 'item0' or ... or 'item9'
+ /[0-9bx-z]aa/; # matches '0aa', ..., '9aa',
+ # 'baa', 'xaa', 'yaa', or 'zaa'
+ /[0-9a-fA-F]/; # matches a hexadecimal digit
+ /[0-9a-zA-Z_]/; # matches a "word" character,
+ # like those in a Perl variable name
+
+If C<'-'> is the first or last character in a character class, it is
+treated as an ordinary character; C<[-ab]>, C<[ab-]> and C<[a\-b]> are
+all equivalent.
+
+The special character C<^> in the first position of a character class
+denotes a I<negated character class>, which matches any character but
+those in the brackets. Both C<[...]> and C<[^...]> must match a
+character, or the match fails. Then
+
+ /[^a]at/; # doesn't match 'aat' or 'at', but matches
+ # all other 'bat', 'cat, '0at', '%at', etc.
+ /[^0-9]/; # matches a non-numeric character
+ /[a^]at/; # matches 'aat' or '^at'; here '^' is ordinary
+
+Now, even C<[0-9]> can be a bother to write multiple times, so in the
+interest of saving keystrokes and making regexps more readable, Perl
+has several abbreviations for common character classes, as shown below.
+Since the introduction of Unicode, these character classes match more
+than just a few characters in the ISO 8859-1 range.
+
+=over 4
+
+=item *
+
+\d matches a digit, not just [0-9] but also digits from non-roman scripts
+
+=item *
+
+\s matches a whitespace character, the set [\ \t\r\n\f] and others
+
+=item *
+
+\w matches a word character (alphanumeric or _), not just [0-9a-zA-Z_]
+but also digits and characters from non-roman scripts
+
+=item *
+
+\D is a negated \d; it represents any other character than a digit, or [^\d]
+
+=item *
+
+\S is a negated \s; it represents any non-whitespace character [^\s]
+
+=item *
+
+\W is a negated \w; it represents any non-word character [^\w]
+
+=item *
+
+The period '.' matches any character but "\n" (unless the modifier C<//s> is
+in effect, as explained below).
+
+=back
+
+The C<\d\s\w\D\S\W> abbreviations can be used both inside and outside
+of character classes. Here are some in use:
+
+ /\d\d:\d\d:\d\d/; # matches a hh:mm:ss time format
+ /[\d\s]/; # matches any digit or whitespace character
+ /\w\W\w/; # matches a word char, followed by a
+ # non-word char, followed by a word char
+ /..rt/; # matches any two chars, followed by 'rt'
+ /end\./; # matches 'end.'
+ /end[.]/; # same thing, matches 'end.'
+
+Because a period is a metacharacter, it needs to be escaped to match
+as an ordinary period. Because, for example, C<\d> and C<\w> are sets
+of characters, it is incorrect to think of C<[^\d\w]> as C<[\D\W]>; in
+fact C<[^\d\w]> is the same as C<[^\w]>, which is the same as
+C<[\W]>. Think DeMorgan's laws.
+
+An anchor useful in basic regexps is the I<word anchor>
+C<\b>. This matches a boundary between a word character and a non-word
+character C<\w\W> or C<\W\w>:
+
+ $x = "Housecat catenates house and cat";
+ $x =~ /cat/; # matches cat in 'housecat'
+ $x =~ /\bcat/; # matches cat in 'catenates'
+ $x =~ /cat\b/; # matches cat in 'housecat'
+ $x =~ /\bcat\b/; # matches 'cat' at end of string
+
+Note in the last example, the end of the string is considered a word
+boundary.
+
+You might wonder why C<'.'> matches everything but C<"\n"> - why not
+every character? The reason is that often one is matching against
+lines and would like to ignore the newline characters. For instance,
+while the string C<"\n"> represents one line, we would like to think
+of it as empty. Then
+
+ "" =~ /^$/; # matches
+ "\n" =~ /^$/; # matches, $ anchors before "\n"
+
+ "" =~ /./; # doesn't match; it needs a char
+ "" =~ /^.$/; # doesn't match; it needs a char
+ "\n" =~ /^.$/; # doesn't match; it needs a char other than "\n"
+ "a" =~ /^.$/; # matches
+ "a\n" =~ /^.$/; # matches, $ anchors before "\n"
+
+This behavior is convenient, because we usually want to ignore
+newlines when we count and match characters in a line. Sometimes,
+however, we want to keep track of newlines. We might even want C<^>
+and C<$> to anchor at the beginning and end of lines within the
+string, rather than just the beginning and end of the string. Perl
+allows us to choose between ignoring and paying attention to newlines
+by using the C<//s> and C<//m> modifiers. C<//s> and C<//m> stand for
+single line and multi-line and they determine whether a string is to
+be treated as one continuous string, or as a set of lines. The two
+modifiers affect two aspects of how the regexp is interpreted: 1) how
+the C<'.'> character class is defined, and 2) where the anchors C<^>
+and C<$> are able to match. Here are the four possible combinations:
+
+=over 4
+
+=item *
+
+no modifiers (//): Default behavior. C<'.'> matches any character
+except C<"\n">. C<^> matches only at the beginning of the string and
+C<$> matches only at the end or before a newline at the end.
+
+=item *
+
+s modifier (//s): Treat string as a single long line. C<'.'> matches
+any character, even C<"\n">. C<^> matches only at the beginning of
+the string and C<$> matches only at the end or before a newline at the
+end.
+
+=item *
+
+m modifier (//m): Treat string as a set of multiple lines. C<'.'>
+matches any character except C<"\n">. C<^> and C<$> are able to match
+at the start or end of I<any> line within the string.
+
+=item *
+
+both s and m modifiers (//sm): Treat string as a single long line, but
+detect multiple lines. C<'.'> matches any character, even
+C<"\n">. C<^> and C<$>, however, are able to match at the start or end
+of I<any> line within the string.
+
+=back
+
+Here are examples of C<//s> and C<//m> in action:
+
+ $x = "There once was a girl\nWho programmed in Perl\n";
+
+ $x =~ /^Who/; # doesn't match, "Who" not at start of string
+ $x =~ /^Who/s; # doesn't match, "Who" not at start of string
+ $x =~ /^Who/m; # matches, "Who" at start of second line
+ $x =~ /^Who/sm; # matches, "Who" at start of second line
+
+ $x =~ /girl.Who/; # doesn't match, "." doesn't match "\n"
+ $x =~ /girl.Who/s; # matches, "." matches "\n"
+ $x =~ /girl.Who/m; # doesn't match, "." doesn't match "\n"
+ $x =~ /girl.Who/sm; # matches, "." matches "\n"
+
+Most of the time, the default behavior is what is wanted, but C<//s> and
+C<//m> are occasionally very useful. If C<//m> is being used, the start
+of the string can still be matched with C<\A> and the end of the string
+can still be matched with the anchors C<\Z> (matches both the end and
+the newline before, like C<$>), and C<\z> (matches only the end):
+
+ $x =~ /^Who/m; # matches, "Who" at start of second line
+ $x =~ /\AWho/m; # doesn't match, "Who" is not at start of string
+
+ $x =~ /girl$/m; # matches, "girl" at end of first line
+ $x =~ /girl\Z/m; # doesn't match, "girl" is not at end of string
+
+ $x =~ /Perl\Z/m; # matches, "Perl" is at newline before end
+ $x =~ /Perl\z/m; # doesn't match, "Perl" is not at end of string
+
+We now know how to create choices among classes of characters in a
+regexp. What about choices among words or character strings? Such
+choices are described in the next section.
+
+=head2 Matching this or that
+
+Sometimes we would like our regexp to be able to match different
+possible words or character strings. This is accomplished by using
+the I<alternation> metacharacter C<|>. To match C<dog> or C<cat>, we
+form the regexp C<dog|cat>. As before, Perl will try to match the
+regexp at the earliest possible point in the string. At each
+character position, Perl will first try to match the first
+alternative, C<dog>. If C<dog> doesn't match, Perl will then try the
+next alternative, C<cat>. If C<cat> doesn't match either, then the
+match fails and Perl moves to the next position in the string. Some
+examples:
+
+ "cats and dogs" =~ /cat|dog|bird/; # matches "cat"
+ "cats and dogs" =~ /dog|cat|bird/; # matches "cat"
+
+Even though C<dog> is the first alternative in the second regexp,
+C<cat> is able to match earlier in the string.
+
+ "cats" =~ /c|ca|cat|cats/; # matches "c"
+ "cats" =~ /cats|cat|ca|c/; # matches "cats"
+
+Here, all the alternatives match at the first string position, so the
+first alternative is the one that matches. If some of the
+alternatives are truncations of the others, put the longest ones first
+to give them a chance to match.
+
+ "cab" =~ /a|b|c/ # matches "c"
+ # /a|b|c/ == /[abc]/
+
+The last example points out that character classes are like
+alternations of characters. At a given character position, the first
+alternative that allows the regexp match to succeed will be the one
+that matches.
+
+=head2 Grouping things and hierarchical matching
+
+Alternation allows a regexp to choose among alternatives, but by
+itself it is unsatisfying. The reason is that each alternative is a whole
+regexp, but sometime we want alternatives for just part of a
+regexp. For instance, suppose we want to search for housecats or
+housekeepers. The regexp C<housecat|housekeeper> fits the bill, but is
+inefficient because we had to type C<house> twice. It would be nice to
+have parts of the regexp be constant, like C<house>, and some
+parts have alternatives, like C<cat|keeper>.
+
+The I<grouping> metacharacters C<()> solve this problem. Grouping
+allows parts of a regexp to be treated as a single unit. Parts of a
+regexp are grouped by enclosing them in parentheses. Thus we could solve
+the C<housecat|housekeeper> by forming the regexp as
+C<house(cat|keeper)>. The regexp C<house(cat|keeper)> means match
+C<house> followed by either C<cat> or C<keeper>. Some more examples
+are
+
+ /(a|b)b/; # matches 'ab' or 'bb'
+ /(ac|b)b/; # matches 'acb' or 'bb'
+ /(^a|b)c/; # matches 'ac' at start of string or 'bc' anywhere
+ /(a|[bc])d/; # matches 'ad', 'bd', or 'cd'
+
+ /house(cat|)/; # matches either 'housecat' or 'house'
+ /house(cat(s|)|)/; # matches either 'housecats' or 'housecat' or
+ # 'house'. Note groups can be nested.
+
+ /(19|20|)\d\d/; # match years 19xx, 20xx, or the Y2K problem, xx
+ "20" =~ /(19|20|)\d\d/; # matches the null alternative '()\d\d',
+ # because '20\d\d' can't match
+
+Alternations behave the same way in groups as out of them: at a given
+string position, the leftmost alternative that allows the regexp to
+match is taken. So in the last example at the first string position,
+C<"20"> matches the second alternative, but there is nothing left over
+to match the next two digits C<\d\d>. So Perl moves on to the next
+alternative, which is the null alternative and that works, since
+C<"20"> is two digits.
+
+The process of trying one alternative, seeing if it matches, and
+moving on to the next alternative, while going back in the string
+from where the previous alternative was tried, if it doesn't, is called
+I<backtracking>. The term 'backtracking' comes from the idea that
+matching a regexp is like a walk in the woods. Successfully matching
+a regexp is like arriving at a destination. There are many possible
+trailheads, one for each string position, and each one is tried in
+order, left to right. From each trailhead there may be many paths,
+some of which get you there, and some which are dead ends. When you
+walk along a trail and hit a dead end, you have to backtrack along the
+trail to an earlier point to try another trail. If you hit your
+destination, you stop immediately and forget about trying all the
+other trails. You are persistent, and only if you have tried all the
+trails from all the trailheads and not arrived at your destination, do
+you declare failure. To be concrete, here is a step-by-step analysis
+of what Perl does when it tries to match the regexp
+
+ "abcde" =~ /(abd|abc)(df|d|de)/;
+
+=over 4
+
+=item 0
+
+Start with the first letter in the string 'a'.
+
+=item 1
+
+Try the first alternative in the first group 'abd'.
+
+=item 2
+
+Match 'a' followed by 'b'. So far so good.
+
+=item 3
+
+'d' in the regexp doesn't match 'c' in the string - a dead
+end. So backtrack two characters and pick the second alternative in
+the first group 'abc'.
+
+=item 4
+
+Match 'a' followed by 'b' followed by 'c'. We are on a roll
+and have satisfied the first group. Set $1 to 'abc'.
+
+=item 5
+
+Move on to the second group and pick the first alternative
+'df'.
+
+=item 6
+
+Match the 'd'.
+
+=item 7
+
+'f' in the regexp doesn't match 'e' in the string, so a dead
+end. Backtrack one character and pick the second alternative in the
+second group 'd'.
+
+=item 8
+
+'d' matches. The second grouping is satisfied, so set $2 to
+'d'.
+
+=item 9
+
+We are at the end of the regexp, so we are done! We have
+matched 'abcd' out of the string "abcde".
+
+=back
+
+There are a couple of things to note about this analysis. First, the
+third alternative in the second group 'de' also allows a match, but we
+stopped before we got to it - at a given character position, leftmost
+wins. Second, we were able to get a match at the first character
+position of the string 'a'. If there were no matches at the first
+position, Perl would move to the second character position 'b' and
+attempt the match all over again. Only when all possible paths at all
+possible character positions have been exhausted does Perl give
+up and declare S<C<$string =~ /(abd|abc)(df|d|de)/;>> to be false.
+
+Even with all this work, regexp matching happens remarkably fast. To
+speed things up, Perl compiles the regexp into a compact sequence of
+opcodes that can often fit inside a processor cache. When the code is
+executed, these opcodes can then run at full throttle and search very
+quickly.
+
+=head2 Extracting matches
+
+The grouping metacharacters C<()> also serve another completely
+different function: they allow the extraction of the parts of a string
+that matched. This is very useful to find out what matched and for
+text processing in general. For each grouping, the part that matched
+inside goes into the special variables C<$1>, C<$2>, etc. They can be
+used just as ordinary variables:
+
+ # extract hours, minutes, seconds
+ if ($time =~ /(\d\d):(\d\d):(\d\d)/) { # match hh:mm:ss format
+ $hours = $1;
+ $minutes = $2;
+ $seconds = $3;
+ }
+
+Now, we know that in scalar context,
+S<C<$time =~ /(\d\d):(\d\d):(\d\d)/>> returns a true or false
+value. In list context, however, it returns the list of matched values
+C<($1,$2,$3)>. So we could write the code more compactly as
+
+ # extract hours, minutes, seconds
+ ($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/);
+
+If the groupings in a regexp are nested, C<$1> gets the group with the
+leftmost opening parenthesis, C<$2> the next opening parenthesis,
+etc. Here is a regexp with nested groups:
+
+ /(ab(cd|ef)((gi)|j))/;
+ 1 2 34
+
+If this regexp matches, C<$1> contains a string starting with
+C<'ab'>, C<$2> is either set to C<'cd'> or C<'ef'>, C<$3> equals either
+C<'gi'> or C<'j'>, and C<$4> is either set to C<'gi'>, just like C<$3>,
+or it remains undefined.
+
+For convenience, Perl sets C<$+> to the string held by the highest numbered
+C<$1>, C<$2>,... that got assigned (and, somewhat related, C<$^N> to the
+value of the C<$1>, C<$2>,... most-recently assigned; i.e. the C<$1>,
+C<$2>,... associated with the rightmost closing parenthesis used in the
+match).
+
+
+=head2 Backreferences
+
+Closely associated with the matching variables C<$1>, C<$2>, ... are
+the I<backreferences> C<\1>, C<\2>,... Backreferences are simply
+matching variables that can be used I<inside> a regexp. This is a
+really nice feature -- what matches later in a regexp is made to depend on
+what matched earlier in the regexp. Suppose we wanted to look
+for doubled words in a text, like 'the the'. The following regexp finds
+all 3-letter doubles with a space in between:
+
+ /\b(\w\w\w)\s\1\b/;
+
+The grouping assigns a value to \1, so that the same 3 letter sequence
+is used for both parts.
+
+A similar task is to find words consisting of two identical parts:
+
+ % simple_grep '^(\w\w\w\w|\w\w\w|\w\w|\w)\1$' /usr/dict/words
+ beriberi
+ booboo
+ coco
+ mama
+ murmur
+ papa
+
+The regexp has a single grouping which considers 4-letter
+combinations, then 3-letter combinations, etc., and uses C<\1> to look for
+a repeat. Although C<$1> and C<\1> represent the same thing, care should be
+taken to use matched variables C<$1>, C<$2>,... only I<outside> a regexp
+and backreferences C<\1>, C<\2>,... only I<inside> a regexp; not doing
+so may lead to surprising and unsatisfactory results.
+
+
+=head2 Relative backreferences
+
+Counting the opening parentheses to get the correct number for a
+backreference is errorprone as soon as there is more than one
+capturing group. A more convenient technique became available
+with Perl 5.10: relative backreferences. To refer to the immediately
+preceding capture group one now may write C<\g{-1}>, the next but
+last is available via C<\g{-2}>, and so on.
+
+Another good reason in addition to readability and maintainability
+for using relative backreferences is illustrated by the following example,
+where a simple pattern for matching peculiar strings is used:
+
+ $a99a = '([a-z])(\d)\2\1'; # matches a11a, g22g, x33x, etc.
+
+Now that we have this pattern stored as a handy string, we might feel
+tempted to use it as a part of some other pattern:
+
+ $line = "code=e99e";
+ if ($line =~ /^(\w+)=$a99a$/){ # unexpected behavior!
+ print "$1 is valid\n";
+ } else {
+ print "bad line: '$line'\n";
+ }
+
+But this doesn't match -- at least not the way one might expect. Only
+after inserting the interpolated C<$a99a> and looking at the resulting
+full text of the regexp is it obvious that the backreferences have
+backfired -- the subexpression C<(\w+)> has snatched number 1 and
+demoted the groups in C<$a99a> by one rank. This can be avoided by
+using relative backreferences:
+
+ $a99a = '([a-z])(\d)\g{-1}\g{-2}'; # safe for being interpolated
+
+
+=head2 Named backreferences
+
+Perl 5.10 also introduced named capture buffers and named backreferences.
+To attach a name to a capturing group, you write either
+C<< (?<name>...) >> or C<< (?'name'...) >>. The backreference may
+then be written as C<\g{name}>. It is permissible to attach the
+same name to more than one group, but then only the leftmost one of the
+eponymous set can be referenced. Outside of the pattern a named
+capture buffer is accessible through the C<%+> hash.
+
+Assuming that we have to match calendar dates which may be given in one
+of the three formats yyyy-mm-dd, mm/dd/yyyy or dd.mm.yyyy, we can write
+three suitable patterns where we use 'd', 'm' and 'y' respectively as the
+names of the buffers capturing the pertaining components of a date. The
+matching operation combines the three patterns as alternatives:
+
+ $fmt1 = '(?<y>\d\d\d\d)-(?<m>\d\d)-(?<d>\d\d)';
+ $fmt2 = '(?<m>\d\d)/(?<d>\d\d)/(?<y>\d\d\d\d)';
+ $fmt3 = '(?<d>\d\d)\.(?<m>\d\d)\.(?<y>\d\d\d\d)';
+ for my $d qw( 2006-10-21 15.01.2007 10/31/2005 ){
+ if ( $d =~ m{$fmt1|$fmt2|$fmt3} ){
+ print "day=$+{d} month=$+{m} year=$+{y}\n";
+ }
+ }
+
+If any of the alternatives matches, the hash C<%+> is bound to contain the
+three key-value pairs.
+
+
+=head2 Alternative capture group numbering
+
+Yet another capturing group numbering technique (also as from Perl 5.10)
+deals with the problem of referring to groups within a set of alternatives.
+Consider a pattern for matching a time of the day, civil or military style:
+
+ if ( $time =~ /(\d\d|\d):(\d\d)|(\d\d)(\d\d)/ ){
+ # process hour and minute
+ }
+
+Processing the results requires an additional if statement to determine
+whether C<$1> and C<$2> or C<$3> and C<$4> contain the goodies. It would
+be easier if we could use buffer numbers 1 and 2 in second alternative as
+well, and this is exactly what the parenthesized construct C<(?|...)>,
+set around an alternative achieves. Here is an extended version of the
+previous pattern:
+
+ if ( $time =~ /(?|(\d\d|\d):(\d\d)|(\d\d)(\d\d))\s+([A-Z][A-Z][A-Z])/ ){
+ print "hour=$1 minute=$2 zone=$3\n";
+ }
+
+Within the alternative numbering group, buffer numbers start at the same
+position for each alternative. After the group, numbering continues
+with one higher than the maximum reached across all the alternatives.
+
+=head2 Position information
+
+In addition to what was matched, Perl (since 5.6.0) also provides the
+positions of what was matched as contents of the C<@-> and C<@+>
+arrays. C<$-[0]> is the position of the start of the entire match and
+C<$+[0]> is the position of the end. Similarly, C<$-[n]> is the
+position of the start of the C<$n> match and C<$+[n]> is the position
+of the end. If C<$n> is undefined, so are C<$-[n]> and C<$+[n]>. Then
+this code
+
+ $x = "Mmm...donut, thought Homer";
+ $x =~ /^(Mmm|Yech)\.\.\.(donut|peas)/; # matches
+ foreach $expr (1..$#-) {
+ print "Match $expr: '${$expr}' at position ($-[$expr],$+[$expr])\n";
+ }
+
+prints
+
+ Match 1: 'Mmm' at position (0,3)
+ Match 2: 'donut' at position (6,11)
+
+Even if there are no groupings in a regexp, it is still possible to
+find out what exactly matched in a string. If you use them, Perl
+will set C<$`> to the part of the string before the match, will set C<$&>
+to the part of the string that matched, and will set C<$'> to the part
+of the string after the match. An example:
+
+ $x = "the cat caught the mouse";
+ $x =~ /cat/; # $` = 'the ', $& = 'cat', $' = ' caught the mouse'
+ $x =~ /the/; # $` = '', $& = 'the', $' = ' cat caught the mouse'
+
+In the second match, C<$`> equals C<''> because the regexp matched at the
+first character position in the string and stopped; it never saw the
+second 'the'. It is important to note that using C<$`> and C<$'>
+slows down regexp matching quite a bit, while C<$&> slows it down to a
+lesser extent, because if they are used in one regexp in a program,
+they are generated for I<all> regexps in the program. So if raw
+performance is a goal of your application, they should be avoided.
+If you need to extract the corresponding substrings, use C<@-> and
+C<@+> instead:
+
+ $` is the same as substr( $x, 0, $-[0] )
+ $& is the same as substr( $x, $-[0], $+[0]-$-[0] )
+ $' is the same as substr( $x, $+[0] )
+
+
+=head2 Non-capturing groupings
+
+A group that is required to bundle a set of alternatives may or may not be
+useful as a capturing group. If it isn't, it just creates a superfluous
+addition to the set of available capture buffer values, inside as well as
+outside the regexp. Non-capturing groupings, denoted by C<(?:regexp)>,
+still allow the regexp to be treated as a single unit, but don't establish
+a capturing buffer at the same time. Both capturing and non-capturing
+groupings are allowed to co-exist in the same regexp. Because there is
+no extraction, non-capturing groupings are faster than capturing
+groupings. Non-capturing groupings are also handy for choosing exactly
+which parts of a regexp are to be extracted to matching variables:
+
+ # match a number, $1-$4 are set, but we only want $1
+ /([+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?)/;
+
+ # match a number faster , only $1 is set
+ /([+-]?\ *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?)/;
+
+ # match a number, get $1 = whole number, $2 = exponent
+ /([+-]?\ *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE]([+-]?\d+))?)/;
+
+Non-capturing groupings are also useful for removing nuisance
+elements gathered from a split operation where parentheses are
+required for some reason:
+
+ $x = '12aba34ba5';
+ @num = split /(a|b)+/, $x; # @num = ('12','a','34','b','5')
+ @num = split /(?:a|b)+/, $x; # @num = ('12','34','5')
+
+
+=head2 Matching repetitions
+
+The examples in the previous section display an annoying weakness. We
+were only matching 3-letter words, or chunks of words of 4 letters or
+less. We'd like to be able to match words or, more generally, strings
+of any length, without writing out tedious alternatives like
+C<\w\w\w\w|\w\w\w|\w\w|\w>.
+
+This is exactly the problem the I<quantifier> metacharacters C<?>,
+C<*>, C<+>, and C<{}> were created for. They allow us to delimit the
+number of repeats for a portion of a regexp we consider to be a
+match. Quantifiers are put immediately after the character, character
+class, or grouping that we want to specify. They have the following
+meanings:
+
+=over 4
+
+=item *
+
+C<a?> means: match 'a' 1 or 0 times
+
+=item *
+
+C<a*> means: match 'a' 0 or more times, i.e., any number of times
+
+=item *
+
+C<a+> means: match 'a' 1 or more times, i.e., at least once
+
+=item *
+
+C<a{n,m}> means: match at least C<n> times, but not more than C<m>
+times.
+
+=item *
+
+C<a{n,}> means: match at least C<n> or more times
+
+=item *
+
+C<a{n}> means: match exactly C<n> times
+
+=back
+
+Here are some examples:
+
+ /[a-z]+\s+\d*/; # match a lowercase word, at least one space, and
+ # any number of digits
+ /(\w+)\s+\1/; # match doubled words of arbitrary length
+ /y(es)?/i; # matches 'y', 'Y', or a case-insensitive 'yes'
+ $year =~ /\d{2,4}/; # make sure year is at least 2 but not more
+ # than 4 digits
+ $year =~ /\d{4}|\d{2}/; # better match; throw out 3 digit dates
+ $year =~ /\d{2}(\d{2})?/; # same thing written differently. However,
+ # this produces $1 and the other does not.
+
+ % simple_grep '^(\w+)\1$' /usr/dict/words # isn't this easier?
+ beriberi
+ booboo
+ coco
+ mama
+ murmur
+ papa
+
+For all of these quantifiers, Perl will try to match as much of the
+string as possible, while still allowing the regexp to succeed. Thus
+with C</a?.../>, Perl will first try to match the regexp with the C<a>
+present; if that fails, Perl will try to match the regexp without the
+C<a> present. For the quantifier C<*>, we get the following:
+
+ $x = "the cat in the hat";
+ $x =~ /^(.*)(cat)(.*)$/; # matches,
+ # $1 = 'the '
+ # $2 = 'cat'
+ # $3 = ' in the hat'
+
+Which is what we might expect, the match finds the only C<cat> in the
+string and locks onto it. Consider, however, this regexp:
+
+ $x =~ /^(.*)(at)(.*)$/; # matches,
+ # $1 = 'the cat in the h'
+ # $2 = 'at'
+ # $3 = '' (0 characters match)
+
+One might initially guess that Perl would find the C<at> in C<cat> and
+stop there, but that wouldn't give the longest possible string to the
+first quantifier C<.*>. Instead, the first quantifier C<.*> grabs as
+much of the string as possible while still having the regexp match. In
+this example, that means having the C<at> sequence with the final C<at>
+in the string. The other important principle illustrated here is that
+when there are two or more elements in a regexp, the I<leftmost>
+quantifier, if there is one, gets to grab as much the string as
+possible, leaving the rest of the regexp to fight over scraps. Thus in
+our example, the first quantifier C<.*> grabs most of the string, while
+the second quantifier C<.*> gets the empty string. Quantifiers that
+grab as much of the string as possible are called I<maximal match> or
+I<greedy> quantifiers.
+
+When a regexp can match a string in several different ways, we can use
+the principles above to predict which way the regexp will match:
+
+=over 4
+
+=item *
+
+Principle 0: Taken as a whole, any regexp will be matched at the
+earliest possible position in the string.
+
+=item *
+
+Principle 1: In an alternation C<a|b|c...>, the leftmost alternative
+that allows a match for the whole regexp will be the one used.
+
+=item *
+
+Principle 2: The maximal matching quantifiers C<?>, C<*>, C<+> and
+C<{n,m}> will in general match as much of the string as possible while
+still allowing the whole regexp to match.
+
+=item *
+
+Principle 3: If there are two or more elements in a regexp, the
+leftmost greedy quantifier, if any, will match as much of the string
+as possible while still allowing the whole regexp to match. The next
+leftmost greedy quantifier, if any, will try to match as much of the
+string remaining available to it as possible, while still allowing the
+whole regexp to match. And so on, until all the regexp elements are
+satisfied.
+
+=back
+
+As we have seen above, Principle 0 overrides the others -- the regexp
+will be matched as early as possible, with the other principles
+determining how the regexp matches at that earliest character
+position.
+
+Here is an example of these principles in action:
+
+ $x = "The programming republic of Perl";
+ $x =~ /^(.+)(e|r)(.*)$/; # matches,
+ # $1 = 'The programming republic of Pe'
+ # $2 = 'r'
+ # $3 = 'l'
+
+This regexp matches at the earliest string position, C<'T'>. One
+might think that C<e>, being leftmost in the alternation, would be
+matched, but C<r> produces the longest string in the first quantifier.
+
+ $x =~ /(m{1,2})(.*)$/; # matches,
+ # $1 = 'mm'
+ # $2 = 'ing republic of Perl'
+
+Here, The earliest possible match is at the first C<'m'> in
+C<programming>. C<m{1,2}> is the first quantifier, so it gets to match
+a maximal C<mm>.
+
+ $x =~ /.*(m{1,2})(.*)$/; # matches,
+ # $1 = 'm'
+ # $2 = 'ing republic of Perl'
+
+Here, the regexp matches at the start of the string. The first
+quantifier C<.*> grabs as much as possible, leaving just a single
+C<'m'> for the second quantifier C<m{1,2}>.
+
+ $x =~ /(.?)(m{1,2})(.*)$/; # matches,
+ # $1 = 'a'
+ # $2 = 'mm'
+ # $3 = 'ing republic of Perl'
+
+Here, C<.?> eats its maximal one character at the earliest possible
+position in the string, C<'a'> in C<programming>, leaving C<m{1,2}>
+the opportunity to match both C<m>'s. Finally,
+
+ "aXXXb" =~ /(X*)/; # matches with $1 = ''
+
+because it can match zero copies of C<'X'> at the beginning of the
+string. If you definitely want to match at least one C<'X'>, use
+C<X+>, not C<X*>.
+
+Sometimes greed is not good. At times, we would like quantifiers to
+match a I<minimal> piece of string, rather than a maximal piece. For
+this purpose, Larry Wall created the I<minimal match> or
+I<non-greedy> quantifiers C<??>, C<*?>, C<+?>, and C<{}?>. These are
+the usual quantifiers with a C<?> appended to them. They have the
+following meanings:
+
+=over 4
+
+=item *
+
+C<a??> means: match 'a' 0 or 1 times. Try 0 first, then 1.
+
+=item *
+
+C<a*?> means: match 'a' 0 or more times, i.e., any number of times,
+but as few times as possible
+
+=item *
+
+C<a+?> means: match 'a' 1 or more times, i.e., at least once, but
+as few times as possible
+
+=item *
+
+C<a{n,m}?> means: match at least C<n> times, not more than C<m>
+times, as few times as possible
+
+=item *
+
+C<a{n,}?> means: match at least C<n> times, but as few times as
+possible
+
+=item *
+
+C<a{n}?> means: match exactly C<n> times. Because we match exactly
+C<n> times, C<a{n}?> is equivalent to C<a{n}> and is just there for
+notational consistency.
+
+=back
+
+Let's look at the example above, but with minimal quantifiers:
+
+ $x = "The programming republic of Perl";
+ $x =~ /^(.+?)(e|r)(.*)$/; # matches,
+ # $1 = 'Th'
+ # $2 = 'e'
+ # $3 = ' programming republic of Perl'
+
+The minimal string that will allow both the start of the string C<^>
+and the alternation to match is C<Th>, with the alternation C<e|r>
+matching C<e>. The second quantifier C<.*> is free to gobble up the
+rest of the string.
+
+ $x =~ /(m{1,2}?)(.*?)$/; # matches,
+ # $1 = 'm'
+ # $2 = 'ming republic of Perl'
+
+The first string position that this regexp can match is at the first
+C<'m'> in C<programming>. At this position, the minimal C<m{1,2}?>
+matches just one C<'m'>. Although the second quantifier C<.*?> would
+prefer to match no characters, it is constrained by the end-of-string
+anchor C<$> to match the rest of the string.
+
+ $x =~ /(.*?)(m{1,2}?)(.*)$/; # matches,
+ # $1 = 'The progra'
+ # $2 = 'm'
+ # $3 = 'ming republic of Perl'
+
+In this regexp, you might expect the first minimal quantifier C<.*?>
+to match the empty string, because it is not constrained by a C<^>
+anchor to match the beginning of the word. Principle 0 applies here,
+however. Because it is possible for the whole regexp to match at the
+start of the string, it I<will> match at the start of the string. Thus
+the first quantifier has to match everything up to the first C<m>. The
+second minimal quantifier matches just one C<m> and the third
+quantifier matches the rest of the string.
+
+ $x =~ /(.??)(m{1,2})(.*)$/; # matches,
+ # $1 = 'a'
+ # $2 = 'mm'
+ # $3 = 'ing republic of Perl'
+
+Just as in the previous regexp, the first quantifier C<.??> can match
+earliest at position C<'a'>, so it does. The second quantifier is
+greedy, so it matches C<mm>, and the third matches the rest of the
+string.
+
+We can modify principle 3 above to take into account non-greedy
+quantifiers:
+
+=over 4
+
+=item *
+
+Principle 3: If there are two or more elements in a regexp, the
+leftmost greedy (non-greedy) quantifier, if any, will match as much
+(little) of the string as possible while still allowing the whole
+regexp to match. The next leftmost greedy (non-greedy) quantifier, if
+any, will try to match as much (little) of the string remaining
+available to it as possible, while still allowing the whole regexp to
+match. And so on, until all the regexp elements are satisfied.
+
+=back
+
+Just like alternation, quantifiers are also susceptible to
+backtracking. Here is a step-by-step analysis of the example
+
+ $x = "the cat in the hat";
+ $x =~ /^(.*)(at)(.*)$/; # matches,
+ # $1 = 'the cat in the h'
+ # $2 = 'at'
+ # $3 = '' (0 matches)
+
+=over 4
+
+=item 0
+
+Start with the first letter in the string 't'.
+
+=item 1
+
+The first quantifier '.*' starts out by matching the whole
+string 'the cat in the hat'.
+
+=item 2
+
+'a' in the regexp element 'at' doesn't match the end of the
+string. Backtrack one character.
+
+=item 3
+
+'a' in the regexp element 'at' still doesn't match the last
+letter of the string 't', so backtrack one more character.
+
+=item 4
+
+Now we can match the 'a' and the 't'.
+
+=item 5
+
+Move on to the third element '.*'. Since we are at the end of
+the string and '.*' can match 0 times, assign it the empty string.
+
+=item 6
+
+We are done!
+
+=back
+
+Most of the time, all this moving forward and backtracking happens
+quickly and searching is fast. There are some pathological regexps,
+however, whose execution time exponentially grows with the size of the
+string. A typical structure that blows up in your face is of the form
+
+ /(a|b+)*/;
+
+The problem is the nested indeterminate quantifiers. There are many
+different ways of partitioning a string of length n between the C<+>
+and C<*>: one repetition with C<b+> of length n, two repetitions with
+the first C<b+> length k and the second with length n-k, m repetitions
+whose bits add up to length n, etc. In fact there are an exponential
+number of ways to partition a string as a function of its length. A
+regexp may get lucky and match early in the process, but if there is
+no match, Perl will try I<every> possibility before giving up. So be
+careful with nested C<*>'s, C<{n,m}>'s, and C<+>'s. The book
+I<Mastering Regular Expressions> by Jeffrey Friedl gives a wonderful
+discussion of this and other efficiency issues.
+
+
+=head2 Possessive quantifiers
+
+Backtracking during the relentless search for a match may be a waste
+of time, particularly when the match is bound to fail. Consider
+the simple pattern
+
+ /^\w+\s+\w+$/; # a word, spaces, a word
+
+Whenever this is applied to a string which doesn't quite meet the
+pattern's expectations such as S<C<"abc ">> or S<C<"abc def ">>,
+the regex engine will backtrack, approximately once for each character
+in the string. But we know that there is no way around taking I<all>
+of the initial word characters to match the first repetition, that I<all>
+spaces must be eaten by the middle part, and the same goes for the second
+word.
+
+With the introduction of the I<possessive quantifiers> in Perl 5.10, we
+have a way of instructing the regex engine not to backtrack, with the
+usual quantifiers with a C<+> appended to them. This makes them greedy as
+well as stingy; once they succeed they won't give anything back to permit
+another solution. They have the following meanings:
+
+=over 4
+
+=item *
+
+C<a{n,m}+> means: match at least C<n> times, not more than C<m> times,
+as many times as possible, and don't give anything up. C<a?+> is short
+for C<a{0,1}+>
+
+=item *
+
+C<a{n,}+> means: match at least C<n> times, but as many times as possible,
+and don't give anything up. C<a*+> is short for C<a{0,}+> and C<a++> is
+short for C<a{1,}+>.
+
+=item *
+
+C<a{n}+> means: match exactly C<n> times. It is just there for
+notational consistency.
+
+=back
+
+These possessive quantifiers represent a special case of a more general
+concept, the I<independent subexpression>, see below.
+
+As an example where a possessive quantifier is suitable we consider
+matching a quoted string, as it appears in several programming languages.
+The backslash is used as an escape character that indicates that the
+next character is to be taken literally, as another character for the
+string. Therefore, after the opening quote, we expect a (possibly
+empty) sequence of alternatives: either some character except an
+unescaped quote or backslash or an escaped character.
+
+ /"(?:[^"\\]++|\\.)*+"/;
+
+
+=head2 Building a regexp
+
+At this point, we have all the basic regexp concepts covered, so let's
+give a more involved example of a regular expression. We will build a
+regexp that matches numbers.
+
+The first task in building a regexp is to decide what we want to match
+and what we want to exclude. In our case, we want to match both
+integers and floating point numbers and we want to reject any string
+that isn't a number.
+
+The next task is to break the problem down into smaller problems that
+are easily converted into a regexp.
+
+The simplest case is integers. These consist of a sequence of digits,
+with an optional sign in front. The digits we can represent with
+C<\d+> and the sign can be matched with C<[+-]>. Thus the integer
+regexp is
+
+ /[+-]?\d+/; # matches integers
+
+A floating point number potentially has a sign, an integral part, a
+decimal point, a fractional part, and an exponent. One or more of these
+parts is optional, so we need to check out the different
+possibilities. Floating point numbers which are in proper form include
+123., 0.345, .34, -1e6, and 25.4E-72. As with integers, the sign out
+front is completely optional and can be matched by C<[+-]?>. We can
+see that if there is no exponent, floating point numbers must have a
+decimal point, otherwise they are integers. We might be tempted to
+model these with C<\d*\.\d*>, but this would also match just a single
+decimal point, which is not a number. So the three cases of floating
+point number without exponent are
+
+ /[+-]?\d+\./; # 1., 321., etc.
+ /[+-]?\.\d+/; # .1, .234, etc.
+ /[+-]?\d+\.\d+/; # 1.0, 30.56, etc.
+
+These can be combined into a single regexp with a three-way alternation:
+
+ /[+-]?(\d+\.\d+|\d+\.|\.\d+)/; # floating point, no exponent
+
+In this alternation, it is important to put C<'\d+\.\d+'> before
+C<'\d+\.'>. If C<'\d+\.'> were first, the regexp would happily match that
+and ignore the fractional part of the number.
+
+Now consider floating point numbers with exponents. The key
+observation here is that I<both> integers and numbers with decimal
+points are allowed in front of an exponent. Then exponents, like the
+overall sign, are independent of whether we are matching numbers with
+or without decimal points, and can be 'decoupled' from the
+mantissa. The overall form of the regexp now becomes clear:
+
+ /^(optional sign)(integer | f.p. mantissa)(optional exponent)$/;
+
+The exponent is an C<e> or C<E>, followed by an integer. So the
+exponent regexp is
+
+ /[eE][+-]?\d+/; # exponent
+
+Putting all the parts together, we get a regexp that matches numbers:
+
+ /^[+-]?(\d+\.\d+|\d+\.|\.\d+|\d+)([eE][+-]?\d+)?$/; # Ta da!
+
+Long regexps like this may impress your friends, but can be hard to
+decipher. In complex situations like this, the C<//x> modifier for a
+match is invaluable. It allows one to put nearly arbitrary whitespace
+and comments into a regexp without affecting their meaning. Using it,
+we can rewrite our 'extended' regexp in the more pleasing form
+
+ /^
+ [+-]? # first, match an optional sign
+ ( # then match integers or f.p. mantissas:
+ \d+\.\d+ # mantissa of the form a.b
+ |\d+\. # mantissa of the form a.
+ |\.\d+ # mantissa of the form .b
+ |\d+ # integer of the form a
+ )
+ ([eE][+-]?\d+)? # finally, optionally match an exponent
+ $/x;
+
+If whitespace is mostly irrelevant, how does one include space
+characters in an extended regexp? The answer is to backslash it
+S<C<'\ '>> or put it in a character class S<C<[ ]>>. The same thing
+goes for pound signs, use C<\#> or C<[#]>. For instance, Perl allows
+a space between the sign and the mantissa or integer, and we could add
+this to our regexp as follows:
+
+ /^
+ [+-]?\ * # first, match an optional sign *and space*
+ ( # then match integers or f.p. mantissas:
+ \d+\.\d+ # mantissa of the form a.b
+ |\d+\. # mantissa of the form a.
+ |\.\d+ # mantissa of the form .b
+ |\d+ # integer of the form a
+ )
+ ([eE][+-]?\d+)? # finally, optionally match an exponent
+ $/x;
+
+In this form, it is easier to see a way to simplify the
+alternation. Alternatives 1, 2, and 4 all start with C<\d+>, so it
+could be factored out:
+
+ /^
+ [+-]?\ * # first, match an optional sign
+ ( # then match integers or f.p. mantissas:
+ \d+ # start out with a ...
+ (
+ \.\d* # mantissa of the form a.b or a.
+ )? # ? takes care of integers of the form a
+ |\.\d+ # mantissa of the form .b
+ )
+ ([eE][+-]?\d+)? # finally, optionally match an exponent
+ $/x;
+
+or written in the compact form,
+
+ /^[+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$/;
+
+This is our final regexp. To recap, we built a regexp by
+
+=over 4
+
+=item *
+
+specifying the task in detail,
+
+=item *
+
+breaking down the problem into smaller parts,
+
+=item *
+
+translating the small parts into regexps,
+
+=item *
+
+combining the regexps,
+
+=item *
+
+and optimizing the final combined regexp.
+
+=back
+
+These are also the typical steps involved in writing a computer
+program. This makes perfect sense, because regular expressions are
+essentially programs written in a little computer language that specifies
+patterns.
+
+=head2 Using regular expressions in Perl
+
+The last topic of Part 1 briefly covers how regexps are used in Perl
+programs. Where do they fit into Perl syntax?
+
+We have already introduced the matching operator in its default
+C</regexp/> and arbitrary delimiter C<m!regexp!> forms. We have used
+the binding operator C<=~> and its negation C<!~> to test for string
+matches. Associated with the matching operator, we have discussed the
+single line C<//s>, multi-line C<//m>, case-insensitive C<//i> and
+extended C<//x> modifiers. There are a few more things you might
+want to know about matching operators.
+
+=head3 Optimizing pattern evaluation
+
+We pointed out earlier that variables in regexps are substituted
+before the regexp is evaluated:
+
+ $pattern = 'Seuss';
+ while (<>) {
+ print if /$pattern/;
+ }
+
+This will print any lines containing the word C<Seuss>. It is not as
+efficient as it could be, however, because Perl has to re-evaluate
+(or compile) C<$pattern> each time through the loop. If C<$pattern> won't be
+changing over the lifetime of the script, we can add the C<//o>
+modifier, which directs Perl to only perform variable substitutions
+once:
+
+ #!/usr/bin/perl
+ # Improved simple_grep
+ $regexp = shift;
+ while (<>) {
+ print if /$regexp/o; # a good deal faster
+ }
+
+
+=head3 Prohibiting substitution
+
+If you change C<$pattern> after the first substitution happens, Perl
+will ignore it. If you don't want any substitutions at all, use the
+special delimiter C<m''>:
+
+ @pattern = ('Seuss');
+ while (<>) {
+ print if m'@pattern'; # matches literal '@pattern', not 'Seuss'
+ }
+
+Similar to strings, C<m''> acts like apostrophes on a regexp; all other
+C<m> delimiters act like quotes. If the regexp evaluates to the empty string,
+the regexp in the I<last successful match> is used instead. So we have
+
+ "dog" =~ /d/; # 'd' matches
+ "dogbert =~ //; # this matches the 'd' regexp used before
+
+
+=head3 Global matching
+
+The final two modifiers C<//g> and C<//c> concern multiple matches.
+The modifier C<//g> stands for global matching and allows the
+matching operator to match within a string as many times as possible.
+In scalar context, successive invocations against a string will have
+`C<//g> jump from match to match, keeping track of position in the
+string as it goes along. You can get or set the position with the
+C<pos()> function.
+
+The use of C<//g> is shown in the following example. Suppose we have
+a string that consists of words separated by spaces. If we know how
+many words there are in advance, we could extract the words using
+groupings:
+
+ $x = "cat dog house"; # 3 words
+ $x =~ /^\s*(\w+)\s+(\w+)\s+(\w+)\s*$/; # matches,
+ # $1 = 'cat'
+ # $2 = 'dog'
+ # $3 = 'house'
+
+But what if we had an indeterminate number of words? This is the sort
+of task C<//g> was made for. To extract all words, form the simple
+regexp C<(\w+)> and loop over all matches with C</(\w+)/g>:
+
+ while ($x =~ /(\w+)/g) {
+ print "Word is $1, ends at position ", pos $x, "\n";
+ }
+
+prints
+
+ Word is cat, ends at position 3
+ Word is dog, ends at position 7
+ Word is house, ends at position 13
+
+A failed match or changing the target string resets the position. If
+you don't want the position reset after failure to match, add the
+C<//c>, as in C</regexp/gc>. The current position in the string is
+associated with the string, not the regexp. This means that different
+strings have different positions and their respective positions can be
+set or read independently.
+
+In list context, C<//g> returns a list of matched groupings, or if
+there are no groupings, a list of matches to the whole regexp. So if
+we wanted just the words, we could use
+
+ @words = ($x =~ /(\w+)/g); # matches,
+ # $word[0] = 'cat'
+ # $word[1] = 'dog'
+ # $word[2] = 'house'
+
+Closely associated with the C<//g> modifier is the C<\G> anchor. The
+C<\G> anchor matches at the point where the previous C<//g> match left
+off. C<\G> allows us to easily do context-sensitive matching:
+
+ $metric = 1; # use metric units
+ ...
+ $x = <FILE>; # read in measurement
+ $x =~ /^([+-]?\d+)\s*/g; # get magnitude
+ $weight = $1;
+ if ($metric) { # error checking
+ print "Units error!" unless $x =~ /\Gkg\./g;
+ }
+ else {
+ print "Units error!" unless $x =~ /\Glbs\./g;
+ }
+ $x =~ /\G\s+(widget|sprocket)/g; # continue processing
+
+The combination of C<//g> and C<\G> allows us to process the string a
+bit at a time and use arbitrary Perl logic to decide what to do next.
+Currently, the C<\G> anchor is only fully supported when used to anchor
+to the start of the pattern.
+
+C<\G> is also invaluable in processing fixed length records with
+regexps. Suppose we have a snippet of coding region DNA, encoded as
+base pair letters C<ATCGTTGAAT...> and we want to find all the stop
+codons C<TGA>. In a coding region, codons are 3-letter sequences, so
+we can think of the DNA snippet as a sequence of 3-letter records. The
+naive regexp
+
+ # expanded, this is "ATC GTT GAA TGC AAA TGA CAT GAC"
+ $dna = "ATCGTTGAATGCAAATGACATGAC";
+ $dna =~ /TGA/;
+
+doesn't work; it may match a C<TGA>, but there is no guarantee that
+the match is aligned with codon boundaries, e.g., the substring
+S<C<GTT GAA>> gives a match. A better solution is
+
+ while ($dna =~ /(\w\w\w)*?TGA/g) { # note the minimal *?
+ print "Got a TGA stop codon at position ", pos $dna, "\n";
+ }
+
+which prints
+
+ Got a TGA stop codon at position 18
+ Got a TGA stop codon at position 23
+
+Position 18 is good, but position 23 is bogus. What happened?
+
+The answer is that our regexp works well until we get past the last
+real match. Then the regexp will fail to match a synchronized C<TGA>
+and start stepping ahead one character position at a time, not what we
+want. The solution is to use C<\G> to anchor the match to the codon
+alignment:
+
+ while ($dna =~ /\G(\w\w\w)*?TGA/g) {
+ print "Got a TGA stop codon at position ", pos $dna, "\n";
+ }
+
+This prints
+
+ Got a TGA stop codon at position 18
+
+which is the correct answer. This example illustrates that it is
+important not only to match what is desired, but to reject what is not
+desired.
+
+=head3 Search and replace
+
+Regular expressions also play a big role in I<search and replace>
+operations in Perl. Search and replace is accomplished with the
+C<s///> operator. The general form is
+C<s/regexp/replacement/modifiers>, with everything we know about
+regexps and modifiers applying in this case as well. The
+C<replacement> is a Perl double quoted string that replaces in the
+string whatever is matched with the C<regexp>. The operator C<=~> is
+also used here to associate a string with C<s///>. If matching
+against C<$_>, the S<C<$_ =~>> can be dropped. If there is a match,
+C<s///> returns the number of substitutions made, otherwise it returns
+false. Here are a few examples:
+
+ $x = "Time to feed the cat!";
+ $x =~ s/cat/hacker/; # $x contains "Time to feed the hacker!"
+ if ($x =~ s/^(Time.*hacker)!$/$1 now!/) {
+ $more_insistent = 1;
+ }
+ $y = "'quoted words'";
+ $y =~ s/^'(.*)'$/$1/; # strip single quotes,
+ # $y contains "quoted words"
+
+In the last example, the whole string was matched, but only the part
+inside the single quotes was grouped. With the C<s///> operator, the
+matched variables C<$1>, C<$2>, etc. are immediately available for use
+in the replacement expression, so we use C<$1> to replace the quoted
+string with just what was quoted. With the global modifier, C<s///g>
+will search and replace all occurrences of the regexp in the string:
+
+ $x = "I batted 4 for 4";
+ $x =~ s/4/four/; # doesn't do it all:
+ # $x contains "I batted four for 4"
+ $x = "I batted 4 for 4";
+ $x =~ s/4/four/g; # does it all:
+ # $x contains "I batted four for four"
+
+If you prefer 'regex' over 'regexp' in this tutorial, you could use
+the following program to replace it:
+
+ % cat > simple_replace
+ #!/usr/bin/perl
+ $regexp = shift;
+ $replacement = shift;
+ while (<>) {
+ s/$regexp/$replacement/go;
+ print;
+ }
+ ^D
+
+ % simple_replace regexp regex perlretut.pod
+
+In C<simple_replace> we used the C<s///g> modifier to replace all
+occurrences of the regexp on each line and the C<s///o> modifier to
+compile the regexp only once. As with C<simple_grep>, both the
+C<print> and the C<s/$regexp/$replacement/go> use C<$_> implicitly.
+
+A modifier available specifically to search and replace is the
+C<s///e> evaluation modifier. C<s///e> wraps an C<eval{...}> around
+the replacement string and the evaluated result is substituted for the
+matched substring. C<s///e> is useful if you need to do a bit of
+computation in the process of replacing text. This example counts
+character frequencies in a line:
+
+ $x = "Bill the cat";
+ $x =~ s/(.)/$chars{$1}++;$1/eg; # final $1 replaces char with itself
+ print "frequency of '$_' is $chars{$_}\n"
+ foreach (sort {$chars{$b} <=> $chars{$a}} keys %chars);
+
+This prints
+
+ frequency of ' ' is 2
+ frequency of 't' is 2
+ frequency of 'l' is 2
+ frequency of 'B' is 1
+ frequency of 'c' is 1
+ frequency of 'e' is 1
+ frequency of 'h' is 1
+ frequency of 'i' is 1
+ frequency of 'a' is 1
+
+As with the match C<m//> operator, C<s///> can use other delimiters,
+such as C<s!!!> and C<s{}{}>, and even C<s{}//>. If single quotes are
+used C<s'''>, then the regexp and replacement are treated as single
+quoted strings and there are no substitutions. C<s///> in list context
+returns the same thing as in scalar context, i.e., the number of
+matches.
+
+=head3 The split function
+
+The C<split()> function is another place where a regexp is used.
+C<split /regexp/, string, limit> separates the C<string> operand into
+a list of substrings and returns that list. The regexp must be designed
+to match whatever constitutes the separators for the desired substrings.
+The C<limit>, if present, constrains splitting into no more than C<limit>
+number of strings. For example, to split a string into words, use
+
+ $x = "Calvin and Hobbes";
+ @words = split /\s+/, $x; # $word[0] = 'Calvin'
+ # $word[1] = 'and'
+ # $word[2] = 'Hobbes'
+
+If the empty regexp C<//> is used, the regexp always matches and
+the string is split into individual characters. If the regexp has
+groupings, then the resulting list contains the matched substrings from the
+groupings as well. For instance,
+
+ $x = "/usr/bin/perl";
+ @dirs = split m!/!, $x; # $dirs[0] = ''
+ # $dirs[1] = 'usr'
+ # $dirs[2] = 'bin'
+ # $dirs[3] = 'perl'
+ @parts = split m!(/)!, $x; # $parts[0] = ''
+ # $parts[1] = '/'
+ # $parts[2] = 'usr'
+ # $parts[3] = '/'
+ # $parts[4] = 'bin'
+ # $parts[5] = '/'
+ # $parts[6] = 'perl'
+
+Since the first character of $x matched the regexp, C<split> prepended
+an empty initial element to the list.
+
+If you have read this far, congratulations! You now have all the basic
+tools needed to use regular expressions to solve a wide range of text
+processing problems. If this is your first time through the tutorial,
+why not stop here and play around with regexps a while... S<Part 2>
+concerns the more esoteric aspects of regular expressions and those
+concepts certainly aren't needed right at the start.
+
+=head1 Part 2: Power tools
+
+OK, you know the basics of regexps and you want to know more. If
+matching regular expressions is analogous to a walk in the woods, then
+the tools discussed in Part 1 are analogous to topo maps and a
+compass, basic tools we use all the time. Most of the tools in part 2
+are analogous to flare guns and satellite phones. They aren't used
+too often on a hike, but when we are stuck, they can be invaluable.
+
+What follows are the more advanced, less used, or sometimes esoteric
+capabilities of Perl regexps. In Part 2, we will assume you are
+comfortable with the basics and concentrate on the new features.
+
+=head2 More on characters, strings, and character classes
+
+There are a number of escape sequences and character classes that we
+haven't covered yet.
+
+There are several escape sequences that convert characters or strings
+between upper and lower case, and they are also available within
+patterns. C<\l> and C<\u> convert the next character to lower or
+upper case, respectively:
+
+ $x = "perl";
+ $string =~ /\u$x/; # matches 'Perl' in $string
+ $x = "M(rs?|s)\\."; # note the double backslash
+ $string =~ /\l$x/; # matches 'mr.', 'mrs.', and 'ms.',
+
+A C<\L> or C<\U> indicates a lasting conversion of case, until
+terminated by C<\E> or thrown over by another C<\U> or C<\L>:
+
+ $x = "This word is in lower case:\L SHOUT\E";
+ $x =~ /shout/; # matches
+ $x = "I STILL KEYPUNCH CARDS FOR MY 360"
+ $x =~ /\Ukeypunch/; # matches punch card string
+
+If there is no C<\E>, case is converted until the end of the
+string. The regexps C<\L\u$word> or C<\u\L$word> convert the first
+character of C<$word> to uppercase and the rest of the characters to
+lowercase.
+
+Control characters can be escaped with C<\c>, so that a control-Z
+character would be matched with C<\cZ>. The escape sequence
+C<\Q>...C<\E> quotes, or protects most non-alphabetic characters. For
+instance,
+
+ $x = "\QThat !^*&%~& cat!";
+ $x =~ /\Q!^*&%~&\E/; # check for rough language
+
+It does not protect C<$> or C<@>, so that variables can still be
+substituted.
+
+With the advent of 5.6.0, Perl regexps can handle more than just the
+standard ASCII character set. Perl now supports I<Unicode>, a standard
+for representing the alphabets from virtually all of the world's written
+languages, and a host of symbols. Perl's text strings are Unicode strings, so
+they can contain characters with a value (codepoint or character number) higher
+than 255
+
+What does this mean for regexps? Well, regexp users don't need to know
+much about Perl's internal representation of strings. But they do need
+to know 1) how to represent Unicode characters in a regexp and 2) that
+a matching operation will treat the string to be searched as a sequence
+of characters, not bytes. The answer to 1) is that Unicode characters
+greater than C<chr(255)> are represented using the C<\x{hex}> notation,
+because the \0 octal and \x hex (without curly braces) don't go further
+than 255.
+
+ /\x{263a}/; # match a Unicode smiley face :)
+
+B<NOTE>: In Perl 5.6.0 it used to be that one needed to say C<use
+utf8> to use any Unicode features. This is no more the case: for
+almost all Unicode processing, the explicit C<utf8> pragma is not
+needed. (The only case where it matters is if your Perl script is in
+Unicode and encoded in UTF-8, then an explicit C<use utf8> is needed.)
+
+Figuring out the hexadecimal sequence of a Unicode character you want
+or deciphering someone else's hexadecimal Unicode regexp is about as
+much fun as programming in machine code. So another way to specify
+Unicode characters is to use the I<named character>> escape
+sequence C<\N{name}>. C<name> is a name for the Unicode character, as
+specified in the Unicode standard. For instance, if we wanted to
+represent or match the astrological sign for the planet Mercury, we
+could use
+
+ use charnames ":full"; # use named chars with Unicode full names
+ $x = "abc\N{MERCURY}def";
+ $x =~ /\N{MERCURY}/; # matches
+
+One can also use short names or restrict names to a certain alphabet:
+
+ use charnames ':full';
+ print "\N{GREEK SMALL LETTER SIGMA} is called sigma.\n";
+
+ use charnames ":short";
+ print "\N{greek:Sigma} is an upper-case sigma.\n";
+
+ use charnames qw(greek);
+ print "\N{sigma} is Greek sigma\n";
+
+A list of full names is found in the file NamesList.txt in the
+lib/perl5/X.X.X/unicore directory (where X.X.X is the perl
+version number as it is installed on your system).
+
+The answer to requirement 2), as of 5.6.0, is that a regexp uses Unicode
+characters. Internally, this is encoded to bytes using either UTF-8 or a
+native 8 bit encoding, depending on the history of the string, but
+conceptually it is a sequence of characters, not bytes. See
+L<perlunitut> for a tutorial about that.
+
+Let us now discuss Unicode character classes. Just as with Unicode
+characters, there are named Unicode character classes represented by the
+C<\p{name}> escape sequence. Closely associated is the C<\P{name}>
+character class, which is the negation of the C<\p{name}> class. For
+example, to match lower and uppercase characters,
+
+ use charnames ":full"; # use named chars with Unicode full names
+ $x = "BOB";
+ $x =~ /^\p{IsUpper}/; # matches, uppercase char class
+ $x =~ /^\P{IsUpper}/; # doesn't match, char class sans uppercase
+ $x =~ /^\p{IsLower}/; # doesn't match, lowercase char class
+ $x =~ /^\P{IsLower}/; # matches, char class sans lowercase
+
+Here is the association between some Perl named classes and the
+traditional Unicode classes:
+
+ Perl class name Unicode class name or regular expression
+
+ IsAlpha /^[LM]/
+ IsAlnum /^[LMN]/
+ IsASCII $code <= 127
+ IsCntrl /^C/
+ IsBlank $code =~ /^(0020|0009)$/ || /^Z[^lp]/
+ IsDigit Nd
+ IsGraph /^([LMNPS]|Co)/
+ IsLower Ll
+ IsPrint /^([LMNPS]|Co|Zs)/
+ IsPunct /^P/
+ IsSpace /^Z/ || ($code =~ /^(0009|000A|000B|000C|000D)$/
+ IsSpacePerl /^Z/ || ($code =~ /^(0009|000A|000C|000D|0085|2028|2029)$/
+ IsUpper /^L[ut]/
+ IsWord /^[LMN]/ || $code eq "005F"
+ IsXDigit $code =~ /^00(3[0-9]|[46][1-6])$/
+
+You can also use the official Unicode class names with the C<\p> and
+C<\P>, like C<\p{L}> for Unicode 'letters', or C<\p{Lu}> for uppercase
+letters, or C<\P{Nd}> for non-digits. If a C<name> is just one
+letter, the braces can be dropped. For instance, C<\pM> is the
+character class of Unicode 'marks', for example accent marks.
+For the full list see L<perlunicode>.
+
+The Unicode has also been separated into various sets of characters
+which you can test with C<\p{...}> (in) and C<\P{...}> (not in).
+To test whether a character is (or is not) an element of a script
+you would use the script name, for example C<\p{Latin}>, C<\p{Greek}>,
+or C<\P{Katakana}>. Other sets are the Unicode blocks, the names
+of which begin with "In". One such block is dedicated to mathematical
+operators, and its pattern formula is <C\p{InMathematicalOperators>}>.
+For the full list see L<perlunicode>.
+
+C<\X> is an abbreviation for a character class that comprises
+the Unicode I<combining character sequences>. A combining character
+sequence is a base character followed by any number of diacritics, i.e.,
+signs like accents used to indicate different sounds of a letter. Using
+the Unicode full names, e.g., S<C<A + COMBINING RING>> is a combining
+character sequence with base character C<A> and combining character
+S<C<COMBINING RING>>, which translates in Danish to A with the circle
+atop it, as in the word Angstrom. C<\X> is equivalent to C<\PM\pM*}>,
+i.e., a non-mark followed by one or more marks.
+
+For the full and latest information about Unicode see the latest
+Unicode standard, or the Unicode Consortium's website http://www.unicode.org/
+
+As if all those classes weren't enough, Perl also defines POSIX style
+character classes. These have the form C<[:name:]>, with C<name> the
+name of the POSIX class. The POSIX classes are C<alpha>, C<alnum>,
+C<ascii>, C<cntrl>, C<digit>, C<graph>, C<lower>, C<print>, C<punct>,
+C<space>, C<upper>, and C<xdigit>, and two extensions, C<word> (a Perl
+extension to match C<\w>), and C<blank> (a GNU extension). If C<utf8>
+is being used, then these classes are defined the same as their
+corresponding Perl Unicode classes: C<[:upper:]> is the same as
+C<\p{IsUpper}>, etc. The POSIX character classes, however, don't
+require using C<utf8>. The C<[:digit:]>, C<[:word:]>, and
+C<[:space:]> correspond to the familiar C<\d>, C<\w>, and C<\s>
+character classes. To negate a POSIX class, put a C<^> in front of
+the name, so that, e.g., C<[:^digit:]> corresponds to C<\D> and under
+C<utf8>, C<\P{IsDigit}>. The Unicode and POSIX character classes can
+be used just like C<\d>, with the exception that POSIX character
+classes can only be used inside of a character class:
+
+ /\s+[abc[:digit:]xyz]\s*/; # match a,b,c,x,y,z, or a digit
+ /^=item\s[[:digit:]]/; # match '=item',
+ # followed by a space and a digit
+ use charnames ":full";
+ /\s+[abc\p{IsDigit}xyz]\s+/; # match a,b,c,x,y,z, or a digit
+ /^=item\s\p{IsDigit}/; # match '=item',
+ # followed by a space and a digit
+
+Whew! That is all the rest of the characters and character classes.
+
+=head2 Compiling and saving regular expressions
+
+In Part 1 we discussed the C<//o> modifier, which compiles a regexp
+just once. This suggests that a compiled regexp is some data structure
+that can be stored once and used again and again. The regexp quote
+C<qr//> does exactly that: C<qr/string/> compiles the C<string> as a
+regexp and transforms the result into a form that can be assigned to a
+variable:
+
+ $reg = qr/foo+bar?/; # reg contains a compiled regexp
+
+Then C<$reg> can be used as a regexp:
+
+ $x = "fooooba";
+ $x =~ $reg; # matches, just like /foo+bar?/
+ $x =~ /$reg/; # same thing, alternate form
+
+C<$reg> can also be interpolated into a larger regexp:
+
+ $x =~ /(abc)?$reg/; # still matches
+
+As with the matching operator, the regexp quote can use different
+delimiters, e.g., C<qr!!>, C<qr{}> or C<qr~~>. Apostrophes
+as delimiters (C<qr''>) inhibit any interpolation.
+
+Pre-compiled regexps are useful for creating dynamic matches that
+don't need to be recompiled each time they are encountered. Using
+pre-compiled regexps, we write a C<grep_step> program which greps
+for a sequence of patterns, advancing to the next pattern as soon
+as one has been satisfied.
+
+ % cat > grep_step
+ #!/usr/bin/perl
+ # grep_step - match <number> regexps, one after the other
+ # usage: multi_grep <number> regexp1 regexp2 ... file1 file2 ...
+
+ $number = shift;
+ $regexp[$_] = shift foreach (0..$number-1);
+ @compiled = map qr/$_/, @regexp;
+ while ($line = <>) {
+ if ($line =~ /$compiled[0]/) {
+ print $line;
+ shift @compiled;
+ last unless @compiled;
+ }
+ }
+ ^D
+
+ % grep_step 3 shift print last grep_step
+ $number = shift;
+ print $line;
+ last unless @compiled;
+
+Storing pre-compiled regexps in an array C<@compiled> allows us to
+simply loop through the regexps without any recompilation, thus gaining
+flexibility without sacrificing speed.
+
+
+=head2 Composing regular expressions at runtime
+
+Backtracking is more efficient than repeated tries with different regular
+expressions. If there are several regular expressions and a match with
+any of them is acceptable, then it is possible to combine them into a set
+of alternatives. If the individual expressions are input data, this
+can be done by programming a join operation. We'll exploit this idea in
+an improved version of the C<simple_grep> program: a program that matches
+multiple patterns:
+
+ % cat > multi_grep
+ #!/usr/bin/perl
+ # multi_grep - match any of <number> regexps
+ # usage: multi_grep <number> regexp1 regexp2 ... file1 file2 ...
+
+ $number = shift;
+ $regexp[$_] = shift foreach (0..$number-1);
+ $pattern = join '|', @regexp;
+
+ while ($line = <>) {
+ print $line if $line =~ /$pattern/o;
+ }
+ ^D
+
+ % multi_grep 2 shift for multi_grep
+ $number = shift;
+ $regexp[$_] = shift foreach (0..$number-1);
+
+Sometimes it is advantageous to construct a pattern from the I<input>
+that is to be analyzed and use the permissible values on the left
+hand side of the matching operations. As an example for this somewhat
+paradoxical situation, let's assume that our input contains a command
+verb which should match one out of a set of available command verbs,
+with the additional twist that commands may be abbreviated as long as
+the given string is unique. The program below demonstrates the basic
+algorithm.
+
+ % cat > keymatch
+ #!/usr/bin/perl
+ $kwds = 'copy compare list print';
+ while( $command = <> ){
+ $command =~ s/^\s+|\s+$//g; # trim leading and trailing spaces
+ if( ( @matches = $kwds =~ /\b$command\w*/g ) == 1 ){
+ print "command: '@matches'\n";
+ } elsif( @matches == 0 ){
+ print "no such command: '$command'\n";
+ } else {
+ print "not unique: '$command' (could be one of: @matches)\n";
+ }
+ }
+ ^D
+
+ % keymatch
+ li
+ command: 'list'
+ co
+ not unique: 'co' (could be one of: copy compare)
+ printer
+ no such command: 'printer'
+
+Rather than trying to match the input against the keywords, we match the
+combined set of keywords against the input. The pattern matching
+operation S<C<$kwds =~ /\b($command\w*)/g>> does several things at the
+same time. It makes sure that the given command begins where a keyword
+begins (C<\b>). It tolerates abbreviations due to the added C<\w*>. It
+tells us the number of matches (C<scalar @matches>) and all the keywords
+that were actually matched. You could hardly ask for more.
+
+=head2 Embedding comments and modifiers in a regular expression
+
+Starting with this section, we will be discussing Perl's set of
+I<extended patterns>. These are extensions to the traditional regular
+expression syntax that provide powerful new tools for pattern
+matching. We have already seen extensions in the form of the minimal
+matching constructs C<??>, C<*?>, C<+?>, C<{n,m}?>, and C<{n,}?>. The
+rest of the extensions below have the form C<(?char...)>, where the
+C<char> is a character that determines the type of extension.
+
+The first extension is an embedded comment C<(?#text)>. This embeds a
+comment into the regular expression without affecting its meaning. The
+comment should not have any closing parentheses in the text. An
+example is
+
+ /(?# Match an integer:)[+-]?\d+/;
+
+This style of commenting has been largely superseded by the raw,
+freeform commenting that is allowed with the C<//x> modifier.
+
+The modifiers C<//i>, C<//m>, C<//s> and C<//x> (or any
+combination thereof) can also be embedded in
+a regexp using C<(?i)>, C<(?m)>, C<(?s)>, and C<(?x)>. For instance,
+
+ /(?i)yes/; # match 'yes' case insensitively
+ /yes/i; # same thing
+ /(?x)( # freeform version of an integer regexp
+ [+-]? # match an optional sign
+ \d+ # match a sequence of digits
+ )
+ /x;
+
+Embedded modifiers can have two important advantages over the usual
+modifiers. Embedded modifiers allow a custom set of modifiers to
+I<each> regexp pattern. This is great for matching an array of regexps
+that must have different modifiers:
+
+ $pattern[0] = '(?i)doctor';
+ $pattern[1] = 'Johnson';
+ ...
+ while (<>) {
+ foreach $patt (@pattern) {
+ print if /$patt/;
+ }
+ }
+
+The second advantage is that embedded modifiers (except C<//p>, which
+modifies the entire regexp) only affect the regexp
+inside the group the embedded modifier is contained in. So grouping
+can be used to localize the modifier's effects:
+
+ /Answer: ((?i)yes)/; # matches 'Answer: yes', 'Answer: YES', etc.
+
+Embedded modifiers can also turn off any modifiers already present
+by using, e.g., C<(?-i)>. Modifiers can also be combined into
+a single expression, e.g., C<(?s-i)> turns on single line mode and
+turns off case insensitivity.
+
+Embedded modifiers may also be added to a non-capturing grouping.
+C<(?i-m:regexp)> is a non-capturing grouping that matches C<regexp>
+case insensitively and turns off multi-line mode.
+
+
+=head2 Looking ahead and looking behind
+
+This section concerns the lookahead and lookbehind assertions. First,
+a little background.
+
+In Perl regular expressions, most regexp elements 'eat up' a certain
+amount of string when they match. For instance, the regexp element
+C<[abc}]> eats up one character of the string when it matches, in the
+sense that Perl moves to the next character position in the string
+after the match. There are some elements, however, that don't eat up
+characters (advance the character position) if they match. The examples
+we have seen so far are the anchors. The anchor C<^> matches the
+beginning of the line, but doesn't eat any characters. Similarly, the
+word boundary anchor C<\b> matches wherever a character matching C<\w>
+is next to a character that doesn't, but it doesn't eat up any
+characters itself. Anchors are examples of I<zero-width assertions>.
+Zero-width, because they consume
+no characters, and assertions, because they test some property of the
+string. In the context of our walk in the woods analogy to regexp
+matching, most regexp elements move us along a trail, but anchors have
+us stop a moment and check our surroundings. If the local environment
+checks out, we can proceed forward. But if the local environment
+doesn't satisfy us, we must backtrack.
+
+Checking the environment entails either looking ahead on the trail,
+looking behind, or both. C<^> looks behind, to see that there are no
+characters before. C<$> looks ahead, to see that there are no
+characters after. C<\b> looks both ahead and behind, to see if the
+characters on either side differ in their "word-ness".
+
+The lookahead and lookbehind assertions are generalizations of the
+anchor concept. Lookahead and lookbehind are zero-width assertions
+that let us specify which characters we want to test for. The
+lookahead assertion is denoted by C<(?=regexp)> and the lookbehind
+assertion is denoted by C<< (?<=fixed-regexp) >>. Some examples are
+
+ $x = "I catch the housecat 'Tom-cat' with catnip";
+ $x =~ /cat(?=\s)/; # matches 'cat' in 'housecat'
+ @catwords = ($x =~ /(?<=\s)cat\w+/g); # matches,
+ # $catwords[0] = 'catch'
+ # $catwords[1] = 'catnip'
+ $x =~ /\bcat\b/; # matches 'cat' in 'Tom-cat'
+ $x =~ /(?<=\s)cat(?=\s)/; # doesn't match; no isolated 'cat' in
+ # middle of $x
+
+Note that the parentheses in C<(?=regexp)> and C<< (?<=regexp) >> are
+non-capturing, since these are zero-width assertions. Thus in the
+second regexp, the substrings captured are those of the whole regexp
+itself. Lookahead C<(?=regexp)> can match arbitrary regexps, but
+lookbehind C<< (?<=fixed-regexp) >> only works for regexps of fixed
+width, i.e., a fixed number of characters long. Thus
+C<< (?<=(ab|bc)) >> is fine, but C<< (?<=(ab)*) >> is not. The
+negated versions of the lookahead and lookbehind assertions are
+denoted by C<(?!regexp)> and C<< (?<!fixed-regexp) >> respectively.
+They evaluate true if the regexps do I<not> match:
+
+ $x = "foobar";
+ $x =~ /foo(?!bar)/; # doesn't match, 'bar' follows 'foo'
+ $x =~ /foo(?!baz)/; # matches, 'baz' doesn't follow 'foo'
+ $x =~ /(?<!\s)foo/; # matches, there is no \s before 'foo'
+
+The C<\C> is unsupported in lookbehind, because the already
+treacherous definition of C<\C> would become even more so
+when going backwards.
+
+Here is an example where a string containing blank-separated words,
+numbers and single dashes is to be split into its components.
+Using C</\s+/> alone won't work, because spaces are not required between
+dashes, or a word or a dash. Additional places for a split are established
+by looking ahead and behind:
+
+ $str = "one two - --6-8";
+ @toks = split / \s+ # a run of spaces
+ | (?<=\S) (?=-) # any non-space followed by '-'
+ | (?<=-) (?=\S) # a '-' followed by any non-space
+ /x, $str; # @toks = qw(one two - - - 6 - 8)
+
+
+=head2 Using independent subexpressions to prevent backtracking
+
+I<Independent subexpressions> are regular expressions, in the
+context of a larger regular expression, that function independently of
+the larger regular expression. That is, they consume as much or as
+little of the string as they wish without regard for the ability of
+the larger regexp to match. Independent subexpressions are represented
+by C<< (?>regexp) >>. We can illustrate their behavior by first
+considering an ordinary regexp:
+
+ $x = "ab";
+ $x =~ /a*ab/; # matches
+
+This obviously matches, but in the process of matching, the
+subexpression C<a*> first grabbed the C<a>. Doing so, however,
+wouldn't allow the whole regexp to match, so after backtracking, C<a*>
+eventually gave back the C<a> and matched the empty string. Here, what
+C<a*> matched was I<dependent> on what the rest of the regexp matched.
+
+Contrast that with an independent subexpression:
+
+ $x =~ /(?>a*)ab/; # doesn't match!
+
+The independent subexpression C<< (?>a*) >> doesn't care about the rest
+of the regexp, so it sees an C<a> and grabs it. Then the rest of the
+regexp C<ab> cannot match. Because C<< (?>a*) >> is independent, there
+is no backtracking and the independent subexpression does not give
+up its C<a>. Thus the match of the regexp as a whole fails. A similar
+behavior occurs with completely independent regexps:
+
+ $x = "ab";
+ $x =~ /a*/g; # matches, eats an 'a'
+ $x =~ /\Gab/g; # doesn't match, no 'a' available
+
+Here C<//g> and C<\G> create a 'tag team' handoff of the string from
+one regexp to the other. Regexps with an independent subexpression are
+much like this, with a handoff of the string to the independent
+subexpression, and a handoff of the string back to the enclosing
+regexp.
+
+The ability of an independent subexpression to prevent backtracking
+can be quite useful. Suppose we want to match a non-empty string
+enclosed in parentheses up to two levels deep. Then the following
+regexp matches:
+
+ $x = "abc(de(fg)h"; # unbalanced parentheses
+ $x =~ /\( ( [^()]+ | \([^()]*\) )+ \)/x;
+
+The regexp matches an open parenthesis, one or more copies of an
+alternation, and a close parenthesis. The alternation is two-way, with
+the first alternative C<[^()]+> matching a substring with no
+parentheses and the second alternative C<\([^()]*\)> matching a
+substring delimited by parentheses. The problem with this regexp is
+that it is pathological: it has nested indeterminate quantifiers
+of the form C<(a+|b)+>. We discussed in Part 1 how nested quantifiers
+like this could take an exponentially long time to execute if there
+was no match possible. To prevent the exponential blowup, we need to
+prevent useless backtracking at some point. This can be done by
+enclosing the inner quantifier as an independent subexpression:
+
+ $x =~ /\( ( (?>[^()]+) | \([^()]*\) )+ \)/x;
+
+Here, C<< (?>[^()]+) >> breaks the degeneracy of string partitioning
+by gobbling up as much of the string as possible and keeping it. Then
+match failures fail much more quickly.
+
+
+=head2 Conditional expressions
+
+A I<conditional expression> is a form of if-then-else statement
+that allows one to choose which patterns are to be matched, based on
+some condition. There are two types of conditional expression:
+C<(?(condition)yes-regexp)> and
+C<(?(condition)yes-regexp|no-regexp)>. C<(?(condition)yes-regexp)> is
+like an S<C<'if () {}'>> statement in Perl. If the C<condition> is true,
+the C<yes-regexp> will be matched. If the C<condition> is false, the
+C<yes-regexp> will be skipped and Perl will move onto the next regexp
+element. The second form is like an S<C<'if () {} else {}'>> statement
+in Perl. If the C<condition> is true, the C<yes-regexp> will be
+matched, otherwise the C<no-regexp> will be matched.
+
+The C<condition> can have several forms. The first form is simply an
+integer in parentheses C<(integer)>. It is true if the corresponding
+backreference C<\integer> matched earlier in the regexp. The same
+thing can be done with a name associated with a capture buffer, written
+as C<< (<name>) >> or C<< ('name') >>. The second form is a bare
+zero width assertion C<(?...)>, either a lookahead, a lookbehind, or a
+code assertion (discussed in the next section). The third set of forms
+provides tests that return true if the expression is executed within
+a recursion (C<(R)>) or is being called from some capturing group,
+referenced either by number (C<(R1)>, C<(R2)>,...) or by name
+(C<(R&name)>).
+
+The integer or name form of the C<condition> allows us to choose,
+with more flexibility, what to match based on what matched earlier in the
+regexp. This searches for words of the form C<"$x$x"> or C<"$x$y$y$x">:
+
+ % simple_grep '^(\w+)(\w+)?(?(2)\2\1|\1)$' /usr/dict/words
+ beriberi
+ coco
+ couscous
+ deed
+ ...
+ toot
+ toto
+ tutu
+
+The lookbehind C<condition> allows, along with backreferences,
+an earlier part of the match to influence a later part of the
+match. For instance,
+
+ /[ATGC]+(?(?<=AA)G|C)$/;
+
+matches a DNA sequence such that it either ends in C<AAG>, or some
+other base pair combination and C<C>. Note that the form is
+C<< (?(?<=AA)G|C) >> and not C<< (?((?<=AA))G|C) >>; for the
+lookahead, lookbehind or code assertions, the parentheses around the
+conditional are not needed.
+
+
+=head2 Defining named patterns
+
+Some regular expressions use identical subpatterns in several places.
+Starting with Perl 5.10, it is possible to define named subpatterns in
+a section of the pattern so that they can be called up by name
+anywhere in the pattern. This syntactic pattern for this definition
+group is C<< (?(DEFINE)(?<name>pattern)...) >>. An insertion
+of a named pattern is written as C<(?&name)>.
+
+The example below illustrates this feature using the pattern for
+floating point numbers that was presented earlier on. The three
+subpatterns that are used more than once are the optional sign, the
+digit sequence for an integer and the decimal fraction. The DEFINE
+group at the end of the pattern contains their definition. Notice
+that the decimal fraction pattern is the first place where we can
+reuse the integer pattern.
+
+ /^ (?&osg)\ * ( (?&int)(?&dec)? | (?&dec) )
+ (?: [eE](?&osg)(?&int) )?
+ $
+ (?(DEFINE)
+ (?<osg>[-+]?) # optional sign
+ (?<int>\d++) # integer
+ (?<dec>\.(?&int)) # decimal fraction
+ )/x
+
+
+=head2 Recursive patterns
+
+This feature (introduced in Perl 5.10) significantly extends the
+power of Perl's pattern matching. By referring to some other
+capture group anywhere in the pattern with the construct
+C<(?group-ref)>, the I<pattern> within the referenced group is used
+as an independent subpattern in place of the group reference itself.
+Because the group reference may be contained I<within> the group it
+refers to, it is now possible to apply pattern matching to tasks that
+hitherto required a recursive parser.
+
+To illustrate this feature, we'll design a pattern that matches if
+a string contains a palindrome. (This is a word or a sentence that,
+while ignoring spaces, interpunctuation and case, reads the same backwards
+as forwards. We begin by observing that the empty string or a string
+containing just one word character is a palindrome. Otherwise it must
+have a word character up front and the same at its end, with another
+palindrome in between.
+
+ /(?: (\w) (?...Here be a palindrome...) \g{-1} | \w? )/x
+
+Adding C<\W*> at either end to eliminate what is to be ignored, we already
+have the full pattern:
+
+ my $pp = qr/^(\W* (?: (\w) (?1) \g{-1} | \w? ) \W*)$/ix;
+ for $s ( "saippuakauppias", "A man, a plan, a canal: Panama!" ){
+ print "'$s' is a palindrome\n" if $s =~ /$pp/;
+ }
+
+In C<(?...)> both absolute and relative backreferences may be used.
+The entire pattern can be reinserted with C<(?R)> or C<(?0)>.
+If you prefer to name your buffers, you can use C<(?&name)> to
+recurse into that buffer.
+
+
+=head2 A bit of magic: executing Perl code in a regular expression
+
+Normally, regexps are a part of Perl expressions.
+I<Code evaluation> expressions turn that around by allowing
+arbitrary Perl code to be a part of a regexp. A code evaluation
+expression is denoted C<(?{code})>, with I<code> a string of Perl
+statements.
+
+Be warned that this feature is considered experimental, and may be
+changed without notice.
+
+Code expressions are zero-width assertions, and the value they return
+depends on their environment. There are two possibilities: either the
+code expression is used as a conditional in a conditional expression
+C<(?(condition)...)>, or it is not. If the code expression is a
+conditional, the code is evaluated and the result (i.e., the result of
+the last statement) is used to determine truth or falsehood. If the
+code expression is not used as a conditional, the assertion always
+evaluates true and the result is put into the special variable
+C<$^R>. The variable C<$^R> can then be used in code expressions later
+in the regexp. Here are some silly examples:
+
+ $x = "abcdef";
+ $x =~ /abc(?{print "Hi Mom!";})def/; # matches,
+ # prints 'Hi Mom!'
+ $x =~ /aaa(?{print "Hi Mom!";})def/; # doesn't match,
+ # no 'Hi Mom!'
+
+Pay careful attention to the next example:
+
+ $x =~ /abc(?{print "Hi Mom!";})ddd/; # doesn't match,
+ # no 'Hi Mom!'
+ # but why not?
+
+At first glance, you'd think that it shouldn't print, because obviously
+the C<ddd> isn't going to match the target string. But look at this
+example:
+
+ $x =~ /abc(?{print "Hi Mom!";})[d]dd/; # doesn't match,
+ # but _does_ print
+
+Hmm. What happened here? If you've been following along, you know that
+the above pattern should be effectively the same as the last one --
+enclosing the d in a character class isn't going to change what it
+matches. So why does the first not print while the second one does?
+
+The answer lies in the optimizations the regex engine makes. In the first
+case, all the engine sees are plain old characters (aside from the
+C<?{}> construct). It's smart enough to realize that the string 'ddd'
+doesn't occur in our target string before actually running the pattern
+through. But in the second case, we've tricked it into thinking that our
+pattern is more complicated than it is. It takes a look, sees our
+character class, and decides that it will have to actually run the
+pattern to determine whether or not it matches, and in the process of
+running it hits the print statement before it discovers that we don't
+have a match.
+
+To take a closer look at how the engine does optimizations, see the
+section L<"Pragmas and debugging"> below.
+
+More fun with C<?{}>:
+
+ $x =~ /(?{print "Hi Mom!";})/; # matches,
+ # prints 'Hi Mom!'
+ $x =~ /(?{$c = 1;})(?{print "$c";})/; # matches,
+ # prints '1'
+ $x =~ /(?{$c = 1;})(?{print "$^R";})/; # matches,
+ # prints '1'
+
+The bit of magic mentioned in the section title occurs when the regexp
+backtracks in the process of searching for a match. If the regexp
+backtracks over a code expression and if the variables used within are
+localized using C<local>, the changes in the variables produced by the
+code expression are undone! Thus, if we wanted to count how many times
+a character got matched inside a group, we could use, e.g.,
+
+ $x = "aaaa";
+ $count = 0; # initialize 'a' count
+ $c = "bob"; # test if $c gets clobbered
+ $x =~ /(?{local $c = 0;}) # initialize count
+ ( a # match 'a'
+ (?{local $c = $c + 1;}) # increment count
+ )* # do this any number of times,
+ aa # but match 'aa' at the end
+ (?{$count = $c;}) # copy local $c var into $count
+ /x;
+ print "'a' count is $count, \$c variable is '$c'\n";
+
+This prints
+
+ 'a' count is 2, $c variable is 'bob'
+
+If we replace the S<C< (?{local $c = $c + 1;})>> with
+S<C< (?{$c = $c + 1;})>>, the variable changes are I<not> undone
+during backtracking, and we get
+
+ 'a' count is 4, $c variable is 'bob'
+
+Note that only localized variable changes are undone. Other side
+effects of code expression execution are permanent. Thus
+
+ $x = "aaaa";
+ $x =~ /(a(?{print "Yow\n";}))*aa/;
+
+produces
+
+ Yow
+ Yow
+ Yow
+ Yow
+
+The result C<$^R> is automatically localized, so that it will behave
+properly in the presence of backtracking.
+
+This example uses a code expression in a conditional to match a
+definite article, either 'the' in English or 'der|die|das' in German:
+
+ $lang = 'DE'; # use German
+ ...
+ $text = "das";
+ print "matched\n"
+ if $text =~ /(?(?{
+ $lang eq 'EN'; # is the language English?
+ })
+ the | # if so, then match 'the'
+ (der|die|das) # else, match 'der|die|das'
+ )
+ /xi;
+
+Note that the syntax here is C<(?(?{...})yes-regexp|no-regexp)>, not
+C<(?((?{...}))yes-regexp|no-regexp)>. In other words, in the case of a
+code expression, we don't need the extra parentheses around the
+conditional.
+
+If you try to use code expressions with interpolating variables, Perl
+may surprise you:
+
+ $bar = 5;
+ $pat = '(?{ 1 })';
+ /foo(?{ $bar })bar/; # compiles ok, $bar not interpolated
+ /foo(?{ 1 })$bar/; # compile error!
+ /foo${pat}bar/; # compile error!
+
+ $pat = qr/(?{ $foo = 1 })/; # precompile code regexp
+ /foo${pat}bar/; # compiles ok
+
+If a regexp has (1) code expressions and interpolating variables, or
+(2) a variable that interpolates a code expression, Perl treats the
+regexp as an error. If the code expression is precompiled into a
+variable, however, interpolating is ok. The question is, why is this
+an error?
+
+The reason is that variable interpolation and code expressions
+together pose a security risk. The combination is dangerous because
+many programmers who write search engines often take user input and
+plug it directly into a regexp:
+
+ $regexp = <>; # read user-supplied regexp
+ $chomp $regexp; # get rid of possible newline
+ $text =~ /$regexp/; # search $text for the $regexp
+
+If the C<$regexp> variable contains a code expression, the user could
+then execute arbitrary Perl code. For instance, some joker could
+search for S<C<system('rm -rf *');>> to erase your files. In this
+sense, the combination of interpolation and code expressions I<taints>
+your regexp. So by default, using both interpolation and code
+expressions in the same regexp is not allowed. If you're not
+concerned about malicious users, it is possible to bypass this
+security check by invoking S<C<use re 'eval'>>:
+
+ use re 'eval'; # throw caution out the door
+ $bar = 5;
+ $pat = '(?{ 1 })';
+ /foo(?{ 1 })$bar/; # compiles ok
+ /foo${pat}bar/; # compiles ok
+
+Another form of code expression is the I<pattern code expression>.
+The pattern code expression is like a regular code expression, except
+that the result of the code evaluation is treated as a regular
+expression and matched immediately. A simple example is
+
+ $length = 5;
+ $char = 'a';
+ $x = 'aaaaabb';
+ $x =~ /(??{$char x $length})/x; # matches, there are 5 of 'a'
+
+
+This final example contains both ordinary and pattern code
+expressions. It detects whether a binary string C<1101010010001...> has a
+Fibonacci spacing 0,1,1,2,3,5,... of the C<1>'s:
+
+ $x = "1101010010001000001";
+ $z0 = ''; $z1 = '0'; # initial conditions
+ print "It is a Fibonacci sequence\n"
+ if $x =~ /^1 # match an initial '1'
+ (?:
+ ((??{ $z0 })) # match some '0'
+ 1 # and then a '1'
+ (?{ $z0 = $z1; $z1 .= $^N; })
+ )+ # repeat as needed
+ $ # that is all there is
+ /x;
+ printf "Largest sequence matched was %d\n", length($z1)-length($z0);
+
+Remember that C<$^N> is set to whatever was matched by the last
+completed capture group. This prints
+
+ It is a Fibonacci sequence
+ Largest sequence matched was 5
+
+Ha! Try that with your garden variety regexp package...
+
+Note that the variables C<$z0> and C<$z1> are not substituted when the
+regexp is compiled, as happens for ordinary variables outside a code
+expression. Rather, the code expressions are evaluated when Perl
+encounters them during the search for a match.
+
+The regexp without the C<//x> modifier is
+
+ /^1(?:((??{ $z0 }))1(?{ $z0 = $z1; $z1 .= $^N; }))+$/
+
+which shows that spaces are still possible in the code parts. Nevertheless,
+when working with code and conditional expressions, the extended form of
+regexps is almost necessary in creating and debugging regexps.
+
+
+=head2 Backtracking control verbs
+
+Perl 5.10 introduced a number of control verbs intended to provide
+detailed control over the backtracking process, by directly influencing
+the regexp engine and by providing monitoring techniques. As all
+the features in this group are experimental and subject to change or
+removal in a future version of Perl, the interested reader is
+referred to L<perlre/"Special Backtracking Control Verbs"> for a
+detailed description.
+
+Below is just one example, illustrating the control verb C<(*FAIL)>,
+which may be abbreviated as C<(*F)>. If this is inserted in a regexp
+it will cause to fail, just like at some mismatch between the pattern
+and the string. Processing of the regexp continues like after any "normal"
+failure, so that, for instance, the next position in the string or another
+alternative will be tried. As failing to match doesn't preserve capture
+buffers or produce results, it may be necessary to use this in
+combination with embedded code.
+
+ %count = ();
+ "supercalifragilisticexpialidoceous" =~
+ /([aeiou])(?{ $count{$1}++; })(*FAIL)/oi;
+ printf "%3d '%s'\n", $count{$_}, $_ for (sort keys %count);
+
+The pattern begins with a class matching a subset of letters. Whenever
+this matches, a statement like C<$count{'a'}++;> is executed, incrementing
+the letter's counter. Then C<(*FAIL)> does what it says, and
+the regexp engine proceeds according to the book: as long as the end of
+the string hasn't been reached, the position is advanced before looking
+for another vowel. Thus, match or no match makes no difference, and the
+regexp engine proceeds until the the entire string has been inspected.
+(It's remarkable that an alternative solution using something like
+
+ $count{lc($_)}++ for split('', "supercalifragilisticexpialidoceous");
+ printf "%3d '%s'\n", $count2{$_}, $_ for ( qw{ a e i o u } );
+
+is considerably slower.)
+
+
+=head2 Pragmas and debugging
+
+Speaking of debugging, there are several pragmas available to control
+and debug regexps in Perl. We have already encountered one pragma in
+the previous section, S<C<use re 'eval';>>, that allows variable
+interpolation and code expressions to coexist in a regexp. The other
+pragmas are
+
+ use re 'taint';
+ $tainted = <>;
+ @parts = ($tainted =~ /(\w+)\s+(\w+)/; # @parts is now tainted
+
+The C<taint> pragma causes any substrings from a match with a tainted
+variable to be tainted as well. This is not normally the case, as
+regexps are often used to extract the safe bits from a tainted
+variable. Use C<taint> when you are not extracting safe bits, but are
+performing some other processing. Both C<taint> and C<eval> pragmas
+are lexically scoped, which means they are in effect only until
+the end of the block enclosing the pragmas.
+
+ use re 'debug';
+ /^(.*)$/s; # output debugging info
+
+ use re 'debugcolor';
+ /^(.*)$/s; # output debugging info in living color
+
+The global C<debug> and C<debugcolor> pragmas allow one to get
+detailed debugging info about regexp compilation and
+execution. C<debugcolor> is the same as debug, except the debugging
+information is displayed in color on terminals that can display
+termcap color sequences. Here is example output:
+
+ % perl -e 'use re "debug"; "abc" =~ /a*b+c/;'
+ Compiling REx `a*b+c'
+ size 9 first at 1
+ 1: STAR(4)
+ 2: EXACT <a>(0)
+ 4: PLUS(7)
+ 5: EXACT <b>(0)
+ 7: EXACT <c>(9)
+ 9: END(0)
+ floating `bc' at 0..2147483647 (checking floating) minlen 2
+ Guessing start of match, REx `a*b+c' against `abc'...
+ Found floating substr `bc' at offset 1...
+ Guessed: match at offset 0
+ Matching REx `a*b+c' against `abc'
+ Setting an EVAL scope, savestack=3
+ 0 <> <abc> | 1: STAR
+ EXACT <a> can match 1 times out of 32767...
+ Setting an EVAL scope, savestack=3
+ 1 <a> <bc> | 4: PLUS
+ EXACT <b> can match 1 times out of 32767...
+ Setting an EVAL scope, savestack=3
+ 2 <ab> <c> | 7: EXACT <c>
+ 3 <abc> <> | 9: END
+ Match successful!
+ Freeing REx: `a*b+c'
+
+If you have gotten this far into the tutorial, you can probably guess
+what the different parts of the debugging output tell you. The first
+part
+
+ Compiling REx `a*b+c'
+ size 9 first at 1
+ 1: STAR(4)
+ 2: EXACT <a>(0)
+ 4: PLUS(7)
+ 5: EXACT <b>(0)
+ 7: EXACT <c>(9)
+ 9: END(0)
+
+describes the compilation stage. C<STAR(4)> means that there is a
+starred object, in this case C<'a'>, and if it matches, goto line 4,
+i.e., C<PLUS(7)>. The middle lines describe some heuristics and
+optimizations performed before a match:
+
+ floating `bc' at 0..2147483647 (checking floating) minlen 2
+ Guessing start of match, REx `a*b+c' against `abc'...
+ Found floating substr `bc' at offset 1...
+ Guessed: match at offset 0
+
+Then the match is executed and the remaining lines describe the
+process:
+
+ Matching REx `a*b+c' against `abc'
+ Setting an EVAL scope, savestack=3
+ 0 <> <abc> | 1: STAR
+ EXACT <a> can match 1 times out of 32767...
+ Setting an EVAL scope, savestack=3
+ 1 <a> <bc> | 4: PLUS
+ EXACT <b> can match 1 times out of 32767...
+ Setting an EVAL scope, savestack=3
+ 2 <ab> <c> | 7: EXACT <c>
+ 3 <abc> <> | 9: END
+ Match successful!
+ Freeing REx: `a*b+c'
+
+Each step is of the form S<C<< n <x> <y> >>>, with C<< <x> >> the
+part of the string matched and C<< <y> >> the part not yet
+matched. The S<C<< | 1: STAR >>> says that Perl is at line number 1
+n the compilation list above. See
+L<perldebguts/"Debugging regular expressions"> for much more detail.
+
+An alternative method of debugging regexps is to embed C<print>
+statements within the regexp. This provides a blow-by-blow account of
+the backtracking in an alternation:
+
+ "that this" =~ m@(?{print "Start at position ", pos, "\n";})
+ t(?{print "t1\n";})
+ h(?{print "h1\n";})
+ i(?{print "i1\n";})
+ s(?{print "s1\n";})
+ |
+ t(?{print "t2\n";})
+ h(?{print "h2\n";})
+ a(?{print "a2\n";})
+ t(?{print "t2\n";})
+ (?{print "Done at position ", pos, "\n";})
+ @x;
+
+prints
+
+ Start at position 0
+ t1
+ h1
+ t2
+ h2
+ a2
+ t2
+ Done at position 4
+
+=head1 BUGS
+
+Code expressions, conditional expressions, and independent expressions
+are I<experimental>. Don't use them in production code. Yet.
+
+=head1 SEE ALSO
+
+This is just a tutorial. For the full story on Perl regular
+expressions, see the L<perlre> regular expressions reference page.
+
+For more information on the matching C<m//> and substitution C<s///>
+operators, see L<perlop/"Regexp Quote-Like Operators">. For
+information on the C<split> operation, see L<perlfunc/split>.
+
+For an excellent all-around resource on the care and feeding of
+regular expressions, see the book I<Mastering Regular Expressions> by
+Jeffrey Friedl (published by O'Reilly, ISBN 1556592-257-3).
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 2000 Mark Kvale
+All rights reserved.
+
+This document may be distributed under the same terms as Perl itself.
+
+=head2 Acknowledgments
+
+The inspiration for the stop codon DNA example came from the ZIP
+code example in chapter 7 of I<Mastering Regular Expressions>.
+
+The author would like to thank Jeff Pinyan, Andrew Johnson, Peter
+Haworth, Ronald J Kimball, and Joe Smith for all their helpful
+comments.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlriscos.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlriscos.pod
new file mode 100755
index 00000000000..93c365bf654
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlriscos.pod
@@ -0,0 +1,67 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+README.riscos - Perl version 5 for RISC OS
+
+=head1 DESCRIPTION
+
+This document gives instructions for building Perl for RISC OS. It is
+complicated by the need to cross compile. There is a binary version of
+perl available from L<http://www.cp15.org/perl/> which you may wish to
+use instead of trying to compile it yourself.
+
+=head1 BUILD
+
+You need an installed and working gccsdk cross compiler
+L<http://gccsdk.riscos.info/> and REXEN
+L<http://www.cp15.org/programming/>
+
+Firstly, copy the source and build a native copy of perl for your host
+system.
+Then, in the source to be cross compiled:
+
+=over 4
+
+=item
+
+ $ ./Configure
+
+=item
+
+Select the riscos hint file. The default answers for the rest of the
+questions are usually sufficient.
+
+Note that, if you wish to run Configure non-interactively (see the INSTALL
+document for details), to have it select the correct hint file, you'll
+need to provide the argument -Dhintfile=riscos on the Configure
+command-line.
+
+=item
+
+ $ make miniperl
+
+=item
+
+This should build miniperl and then fail when it tries to run it.
+
+=item
+
+Copy the miniperl executable from the native build done earlier to
+replace the cross compiled miniperl.
+
+=item
+
+ $ make
+
+=item
+
+This will use miniperl to complete the rest of the build.
+
+=back
+
+=head1 AUTHOR
+
+Alex Waugh <alex@alexwaugh.com>
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlrun.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlrun.pod
new file mode 100755
index 00000000000..ec33d320f18
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlrun.pod
@@ -0,0 +1,1378 @@
+=head1 NAME
+
+perlrun - how to execute the Perl interpreter
+
+=head1 SYNOPSIS
+
+B<perl> S<[ B<-sTtuUWX> ]>
+ S<[ B<-hv> ] [ B<-V>[:I<configvar>] ]>
+ S<[ B<-cw> ] [ B<-d>[B<t>][:I<debugger>] ] [ B<-D>[I<number/list>] ]>
+ S<[ B<-pna> ] [ B<-F>I<pattern> ] [ B<-l>[I<octal>] ] [ B<-0>[I<octal/hexadecimal>] ]>
+ S<[ B<-I>I<dir> ] [ B<-m>[B<->]I<module> ] [ B<-M>[B<->]I<'module...'> ] [ B<-f> ]>
+ S<[ B<-C [I<number/list>] >]>
+ S<[ B<-P> ]>
+ S<[ B<-S> ]>
+ S<[ B<-x>[I<dir>] ]>
+ S<[ B<-i>[I<extension>] ]>
+ S<[ [B<-e>|B<-E>] I<'command'> ] [ B<--> ] [ I<programfile> ] [ I<argument> ]...>
+
+=head1 DESCRIPTION
+
+The normal way to run a Perl program is by making it directly
+executable, or else by passing the name of the source file as an
+argument on the command line. (An interactive Perl environment
+is also possible--see L<perldebug> for details on how to do that.)
+Upon startup, Perl looks for your program in one of the following
+places:
+
+=over 4
+
+=item 1.
+
+Specified line by line via B<-e> or B<-E> switches on the command line.
+
+=item 2.
+
+Contained in the file specified by the first filename on the command line.
+(Note that systems supporting the #! notation invoke interpreters this
+way. See L<Location of Perl>.)
+
+=item 3.
+
+Passed in implicitly via standard input. This works only if there are
+no filename arguments--to pass arguments to a STDIN-read program you
+must explicitly specify a "-" for the program name.
+
+=back
+
+With methods 2 and 3, Perl starts parsing the input file from the
+beginning, unless you've specified a B<-x> switch, in which case it
+scans for the first line starting with #! and containing the word
+"perl", and starts there instead. This is useful for running a program
+embedded in a larger message. (In this case you would indicate the end
+of the program using the C<__END__> token.)
+
+The #! line is always examined for switches as the line is being
+parsed. Thus, if you're on a machine that allows only one argument
+with the #! line, or worse, doesn't even recognize the #! line, you
+still can get consistent switch behavior regardless of how Perl was
+invoked, even if B<-x> was used to find the beginning of the program.
+
+Because historically some operating systems silently chopped off
+kernel interpretation of the #! line after 32 characters, some
+switches may be passed in on the command line, and some may not;
+you could even get a "-" without its letter, if you're not careful.
+You probably want to make sure that all your switches fall either
+before or after that 32-character boundary. Most switches don't
+actually care if they're processed redundantly, but getting a "-"
+instead of a complete switch could cause Perl to try to execute
+standard input instead of your program. And a partial B<-I> switch
+could also cause odd results.
+
+Some switches do care if they are processed twice, for instance
+combinations of B<-l> and B<-0>. Either put all the switches after
+the 32-character boundary (if applicable), or replace the use of
+B<-0>I<digits> by C<BEGIN{ $/ = "\0digits"; }>.
+
+Parsing of the #! switches starts wherever "perl" is mentioned in the line.
+The sequences "-*" and "- " are specifically ignored so that you could,
+if you were so inclined, say
+
+ #!/bin/sh
+ #! -*-perl-*-
+ eval 'exec perl -x -wS $0 ${1+"$@"}'
+ if 0;
+
+to let Perl see the B<-p> switch.
+
+A similar trick involves the B<env> program, if you have it.
+
+ #!/usr/bin/env perl
+
+The examples above use a relative path to the perl interpreter,
+getting whatever version is first in the user's path. If you want
+a specific version of Perl, say, perl5.005_57, you should place
+that directly in the #! line's path.
+
+If the #! line does not contain the word "perl", the program named after
+the #! is executed instead of the Perl interpreter. This is slightly
+bizarre, but it helps people on machines that don't do #!, because they
+can tell a program that their SHELL is F</usr/bin/perl>, and Perl will then
+dispatch the program to the correct interpreter for them.
+
+After locating your program, Perl compiles the entire program to an
+internal form. If there are any compilation errors, execution of the
+program is not attempted. (This is unlike the typical shell script,
+which might run part-way through before finding a syntax error.)
+
+If the program is syntactically correct, it is executed. If the program
+runs off the end without hitting an exit() or die() operator, an implicit
+C<exit(0)> is provided to indicate successful completion.
+
+=head2 #! and quoting on non-Unix systems
+X<hashbang> X<#!>
+
+Unix's #! technique can be simulated on other systems:
+
+=over 4
+
+=item OS/2
+
+Put
+
+ extproc perl -S -your_switches
+
+as the first line in C<*.cmd> file (B<-S> due to a bug in cmd.exe's
+`extproc' handling).
+
+=item MS-DOS
+
+Create a batch file to run your program, and codify it in
+C<ALTERNATE_SHEBANG> (see the F<dosish.h> file in the source
+distribution for more information).
+
+=item Win95/NT
+
+The Win95/NT installation, when using the ActiveState installer for Perl,
+will modify the Registry to associate the F<.pl> extension with the perl
+interpreter. If you install Perl by other means (including building from
+the sources), you may have to modify the Registry yourself. Note that
+this means you can no longer tell the difference between an executable
+Perl program and a Perl library file.
+
+=item Macintosh
+
+Under "Classic" MacOS, a perl program will have the appropriate Creator and
+Type, so that double-clicking them will invoke the MacPerl application.
+Under Mac OS X, clickable apps can be made from any C<#!> script using Wil
+Sanchez' DropScript utility: http://www.wsanchez.net/software/ .
+
+=item VMS
+
+Put
+
+ $ perl -mysw 'f$env("procedure")' 'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8' !
+ $ exit++ + ++$status != 0 and $exit = $status = undef;
+
+at the top of your program, where B<-mysw> are any command line switches you
+want to pass to Perl. You can now invoke the program directly, by saying
+C<perl program>, or as a DCL procedure, by saying C<@program> (or implicitly
+via F<DCL$PATH> by just using the name of the program).
+
+This incantation is a bit much to remember, but Perl will display it for
+you if you say C<perl "-V:startperl">.
+
+=back
+
+Command-interpreters on non-Unix systems have rather different ideas
+on quoting than Unix shells. You'll need to learn the special
+characters in your command-interpreter (C<*>, C<\> and C<"> are
+common) and how to protect whitespace and these characters to run
+one-liners (see B<-e> below).
+
+On some systems, you may have to change single-quotes to double ones,
+which you must I<not> do on Unix or Plan 9 systems. You might also
+have to change a single % to a %%.
+
+For example:
+
+ # Unix
+ perl -e 'print "Hello world\n"'
+
+ # MS-DOS, etc.
+ perl -e "print \"Hello world\n\""
+
+ # Macintosh
+ print "Hello world\n"
+ (then Run "Myscript" or Shift-Command-R)
+
+ # VMS
+ perl -e "print ""Hello world\n"""
+
+The problem is that none of this is reliable: it depends on the
+command and it is entirely possible neither works. If B<4DOS> were
+the command shell, this would probably work better:
+
+ perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""
+
+B<CMD.EXE> in Windows NT slipped a lot of standard Unix functionality in
+when nobody was looking, but just try to find documentation for its
+quoting rules.
+
+Under the Macintosh, it depends which environment you are using. The MacPerl
+shell, or MPW, is much like Unix shells in its support for several
+quoting variants, except that it makes free use of the Macintosh's non-ASCII
+characters as control characters.
+
+There is no general solution to all of this. It's just a mess.
+
+=head2 Location of Perl
+X<perl, location of interpreter>
+
+It may seem obvious to say, but Perl is useful only when users can
+easily find it. When possible, it's good for both F</usr/bin/perl>
+and F</usr/local/bin/perl> to be symlinks to the actual binary. If
+that can't be done, system administrators are strongly encouraged
+to put (symlinks to) perl and its accompanying utilities into a
+directory typically found along a user's PATH, or in some other
+obvious and convenient place.
+
+In this documentation, C<#!/usr/bin/perl> on the first line of the program
+will stand in for whatever method works on your system. You are
+advised to use a specific path if you care about a specific version.
+
+ #!/usr/local/bin/perl5.00554
+
+or if you just want to be running at least version, place a statement
+like this at the top of your program:
+
+ use 5.005_54;
+
+=head2 Command Switches
+X<perl, command switches> X<command switches>
+
+As with all standard commands, a single-character switch may be
+clustered with the following switch, if any.
+
+ #!/usr/bin/perl -spi.orig # same as -s -p -i.orig
+
+Switches include:
+
+=over 5
+
+=item B<-0>[I<octal/hexadecimal>]
+X<-0> X<$/>
+
+specifies the input record separator (C<$/>) as an octal or
+hexadecimal number. If there are no digits, the null character is the
+separator. Other switches may precede or follow the digits. For
+example, if you have a version of B<find> which can print filenames
+terminated by the null character, you can say this:
+
+ find . -name '*.orig' -print0 | perl -n0e unlink
+
+The special value 00 will cause Perl to slurp files in paragraph mode.
+The value 0777 will cause Perl to slurp files whole because there is no
+legal byte with that value.
+
+If you want to specify any Unicode character, use the hexadecimal
+format: C<-0xHHH...>, where the C<H> are valid hexadecimal digits.
+(This means that you cannot use the C<-x> with a directory name that
+consists of hexadecimal digits.)
+
+=item B<-a>
+X<-a> X<autosplit>
+
+turns on autosplit mode when used with a B<-n> or B<-p>. An implicit
+split command to the @F array is done as the first thing inside the
+implicit while loop produced by the B<-n> or B<-p>.
+
+ perl -ane 'print pop(@F), "\n";'
+
+is equivalent to
+
+ while (<>) {
+ @F = split(' ');
+ print pop(@F), "\n";
+ }
+
+An alternate delimiter may be specified using B<-F>.
+
+=item B<-C [I<number/list>]>
+X<-C>
+
+The C<-C> flag controls some of the Perl Unicode features.
+
+As of 5.8.1, the C<-C> can be followed either by a number or a list
+of option letters. The letters, their numeric values, and effects
+are as follows; listing the letters is equal to summing the numbers.
+
+ I 1 STDIN is assumed to be in UTF-8
+ O 2 STDOUT will be in UTF-8
+ E 4 STDERR will be in UTF-8
+ S 7 I + O + E
+ i 8 UTF-8 is the default PerlIO layer for input streams
+ o 16 UTF-8 is the default PerlIO layer for output streams
+ D 24 i + o
+ A 32 the @ARGV elements are expected to be strings encoded
+ in UTF-8
+ L 64 normally the "IOEioA" are unconditional,
+ the L makes them conditional on the locale environment
+ variables (the LC_ALL, LC_TYPE, and LANG, in the order
+ of decreasing precedence) -- if the variables indicate
+ UTF-8, then the selected "IOEioA" are in effect
+ a 256 Set ${^UTF8CACHE} to -1, to run the UTF-8 caching code in
+ debugging mode.
+
+=for documenting_the_underdocumented
+perl.h gives W/128 as PERL_UNICODE_WIDESYSCALLS "/* for Sarathy */"
+
+=for todo
+perltodo mentions Unicode in %ENV and filenames. I guess that these will be
+options e and f (or F).
+
+For example, C<-COE> and C<-C6> will both turn on UTF-8-ness on both
+STDOUT and STDERR. Repeating letters is just redundant, not cumulative
+nor toggling.
+
+The C<io> options mean that any subsequent open() (or similar I/O
+operations) will have the C<:utf8> PerlIO layer implicitly applied
+to them, in other words, UTF-8 is expected from any input stream,
+and UTF-8 is produced to any output stream. This is just the default,
+with explicit layers in open() and with binmode() one can manipulate
+streams as usual.
+
+C<-C> on its own (not followed by any number or option list), or the
+empty string C<""> for the C<PERL_UNICODE> environment variable, has the
+same effect as C<-CSDL>. In other words, the standard I/O handles and
+the default C<open()> layer are UTF-8-fied B<but> only if the locale
+environment variables indicate a UTF-8 locale. This behaviour follows
+the I<implicit> (and problematic) UTF-8 behaviour of Perl 5.8.0.
+
+You can use C<-C0> (or C<"0"> for C<PERL_UNICODE>) to explicitly
+disable all the above Unicode features.
+
+The read-only magic variable C<${^UNICODE}> reflects the numeric value
+of this setting. This is variable is set during Perl startup and is
+thereafter read-only. If you want runtime effects, use the three-arg
+open() (see L<perlfunc/open>), the two-arg binmode() (see L<perlfunc/binmode>),
+and the C<open> pragma (see L<open>).
+
+(In Perls earlier than 5.8.1 the C<-C> switch was a Win32-only switch
+that enabled the use of Unicode-aware "wide system call" Win32 APIs.
+This feature was practically unused, however, and the command line
+switch was therefore "recycled".)
+
+B<Note:> Since perl 5.10.1, if the -C option is used on the #! line, it
+must be specified on the command line as well, since the standard streams
+are already set up at this point in the execution of the perl interpreter.
+You can also use binmode() to set the encoding of an I/O stream.
+
+=item B<-c>
+X<-c>
+
+causes Perl to check the syntax of the program and then exit without
+executing it. Actually, it I<will> execute C<BEGIN>, C<UNITCHECK>,
+C<CHECK>, and C<use> blocks, because these are considered as occurring
+outside the execution of your program. C<INIT> and C<END> blocks,
+however, will be skipped.
+
+=item B<-d>
+X<-d> X<-dt>
+
+=item B<-dt>
+
+runs the program under the Perl debugger. See L<perldebug>.
+If B<t> is specified, it indicates to the debugger that threads
+will be used in the code being debugged.
+
+=item B<-d:>I<foo[=bar,baz]>
+X<-d> X<-dt>
+
+=item B<-dt:>I<foo[=bar,baz]>
+
+runs the program under the control of a debugging, profiling, or
+tracing module installed as Devel::foo. E.g., B<-d:DProf> executes
+the program using the Devel::DProf profiler. As with the B<-M>
+flag, options may be passed to the Devel::foo package where they
+will be received and interpreted by the Devel::foo::import routine.
+The comma-separated list of options must follow a C<=> character.
+If B<t> is specified, it indicates to the debugger that threads
+will be used in the code being debugged.
+See L<perldebug>.
+
+=item B<-D>I<letters>
+X<-D> X<DEBUGGING> X<-DDEBUGGING>
+
+=item B<-D>I<number>
+
+sets debugging flags. To watch how it executes your program, use
+B<-Dtls>. (This works only if debugging is compiled into your
+Perl.) Another nice value is B<-Dx>, which lists your compiled
+syntax tree. And B<-Dr> displays compiled regular expressions;
+the format of the output is explained in L<perldebguts>.
+
+As an alternative, specify a number instead of list of letters (e.g.,
+B<-D14> is equivalent to B<-Dtls>):
+
+ 1 p Tokenizing and parsing (with v, displays parse stack)
+ 2 s Stack snapshots (with v, displays all stacks)
+ 4 l Context (loop) stack processing
+ 8 t Trace execution
+ 16 o Method and overloading resolution
+ 32 c String/numeric conversions
+ 64 P Print profiling info, preprocessor command for -P, source file input state
+ 128 m Memory and SV allocation
+ 256 f Format processing
+ 512 r Regular expression parsing and execution
+ 1024 x Syntax tree dump
+ 2048 u Tainting checks
+ 4096 U Unofficial, User hacking (reserved for private, unreleased use)
+ 8192 H Hash dump -- usurps values()
+ 16384 X Scratchpad allocation
+ 32768 D Cleaning up
+ 65536 S Thread synchronization
+ 131072 T Tokenising
+ 262144 R Include reference counts of dumped variables (eg when using -Ds)
+ 524288 J Do not s,t,P-debug (Jump over) opcodes within package DB
+ 1048576 v Verbose: use in conjunction with other flags
+ 2097152 C Copy On Write
+ 4194304 A Consistency checks on internal structures
+ 8388608 q quiet - currently only suppresses the "EXECUTING" message
+
+All these flags require B<-DDEBUGGING> when you compile the Perl
+executable (but see L<Devel::Peek>, L<re> which may change this).
+See the F<INSTALL> file in the Perl source distribution
+for how to do this. This flag is automatically set if you include B<-g>
+option when C<Configure> asks you about optimizer/debugger flags.
+
+If you're just trying to get a print out of each line of Perl code
+as it executes, the way that C<sh -x> provides for shell scripts,
+you can't use Perl's B<-D> switch. Instead do this
+
+ # If you have "env" utility
+ env PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program
+
+ # Bourne shell syntax
+ $ PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program
+
+ # csh syntax
+ % (setenv PERLDB_OPTS "NonStop=1 AutoTrace=1 frame=2"; perl -dS program)
+
+See L<perldebug> for details and variations.
+
+=item B<-e> I<commandline>
+X<-e>
+
+may be used to enter one line of program. If B<-e> is given, Perl
+will not look for a filename in the argument list. Multiple B<-e>
+commands may be given to build up a multi-line script. Make sure
+to use semicolons where you would in a normal program.
+
+=item B<-E> I<commandline>
+X<-E>
+
+behaves just like B<-e>, except that it implicitly enables all
+optional features (in the main compilation unit). See L<feature>.
+
+=item B<-f>
+X<-f>
+
+Disable executing F<$Config{sitelib}/sitecustomize.pl> at startup.
+
+Perl can be built so that it by default will try to execute
+F<$Config{sitelib}/sitecustomize.pl> at startup (in a BEGIN block).
+This is a hook that allows the sysadmin to customize how perl behaves.
+It can for instance be used to add entries to the @INC array to make perl
+find modules in non-standard locations.
+
+=item B<-F>I<pattern>
+X<-F>
+
+specifies the pattern to split on if B<-a> is also in effect. The
+pattern may be surrounded by C<//>, C<"">, or C<''>, otherwise it will be
+put in single quotes. You can't use literal whitespace in the pattern.
+
+=item B<-h>
+X<-h>
+
+prints a summary of the options.
+
+=item B<-i>[I<extension>]
+X<-i> X<in-place>
+
+specifies that files processed by the C<E<lt>E<gt>> construct are to be
+edited in-place. It does this by renaming the input file, opening the
+output file by the original name, and selecting that output file as the
+default for print() statements. The extension, if supplied, is used to
+modify the name of the old file to make a backup copy, following these
+rules:
+
+If no extension is supplied, no backup is made and the current file is
+overwritten.
+
+If the extension doesn't contain a C<*>, then it is appended to the
+end of the current filename as a suffix. If the extension does
+contain one or more C<*> characters, then each C<*> is replaced
+with the current filename. In Perl terms, you could think of this
+as:
+
+ ($backup = $extension) =~ s/\*/$file_name/g;
+
+This allows you to add a prefix to the backup file, instead of (or in
+addition to) a suffix:
+
+ $ perl -pi'orig_*' -e 's/bar/baz/' fileA # backup to 'orig_fileA'
+
+Or even to place backup copies of the original files into another
+directory (provided the directory already exists):
+
+ $ perl -pi'old/*.orig' -e 's/bar/baz/' fileA # backup to 'old/fileA.orig'
+
+These sets of one-liners are equivalent:
+
+ $ perl -pi -e 's/bar/baz/' fileA # overwrite current file
+ $ perl -pi'*' -e 's/bar/baz/' fileA # overwrite current file
+
+ $ perl -pi'.orig' -e 's/bar/baz/' fileA # backup to 'fileA.orig'
+ $ perl -pi'*.orig' -e 's/bar/baz/' fileA # backup to 'fileA.orig'
+
+From the shell, saying
+
+ $ perl -p -i.orig -e "s/foo/bar/; ... "
+
+is the same as using the program:
+
+ #!/usr/bin/perl -pi.orig
+ s/foo/bar/;
+
+which is equivalent to
+
+ #!/usr/bin/perl
+ $extension = '.orig';
+ LINE: while (<>) {
+ if ($ARGV ne $oldargv) {
+ if ($extension !~ /\*/) {
+ $backup = $ARGV . $extension;
+ }
+ else {
+ ($backup = $extension) =~ s/\*/$ARGV/g;
+ }
+ rename($ARGV, $backup);
+ open(ARGVOUT, ">$ARGV");
+ select(ARGVOUT);
+ $oldargv = $ARGV;
+ }
+ s/foo/bar/;
+ }
+ continue {
+ print; # this prints to original filename
+ }
+ select(STDOUT);
+
+except that the B<-i> form doesn't need to compare $ARGV to $oldargv to
+know when the filename has changed. It does, however, use ARGVOUT for
+the selected filehandle. Note that STDOUT is restored as the default
+output filehandle after the loop.
+
+As shown above, Perl creates the backup file whether or not any output
+is actually changed. So this is just a fancy way to copy files:
+
+ $ perl -p -i'/some/file/path/*' -e 1 file1 file2 file3...
+or
+ $ perl -p -i'.orig' -e 1 file1 file2 file3...
+
+You can use C<eof> without parentheses to locate the end of each input
+file, in case you want to append to each file, or reset line numbering
+(see example in L<perlfunc/eof>).
+
+If, for a given file, Perl is unable to create the backup file as
+specified in the extension then it will skip that file and continue on
+with the next one (if it exists).
+
+For a discussion of issues surrounding file permissions and B<-i>,
+see L<perlfaq5/Why does Perl let me delete read-only files? Why does -i clobber protected files? Isn't this a bug in Perl?>.
+
+You cannot use B<-i> to create directories or to strip extensions from
+files.
+
+Perl does not expand C<~> in filenames, which is good, since some
+folks use it for their backup files:
+
+ $ perl -pi~ -e 's/foo/bar/' file1 file2 file3...
+
+Note that because B<-i> renames or deletes the original file before
+creating a new file of the same name, UNIX-style soft and hard links will
+not be preserved.
+
+Finally, the B<-i> switch does not impede execution when no
+files are given on the command line. In this case, no backup is made
+(the original file cannot, of course, be determined) and processing
+proceeds from STDIN to STDOUT as might be expected.
+
+=item B<-I>I<directory>
+X<-I> X<@INC>
+
+Directories specified by B<-I> are prepended to the search path for
+modules (C<@INC>), and also tells the C preprocessor where to search for
+include files. The C preprocessor is invoked with B<-P>; by default it
+searches /usr/include and /usr/lib/perl.
+
+=item B<-l>[I<octnum>]
+X<-l> X<$/> X<$\>
+
+enables automatic line-ending processing. It has two separate
+effects. First, it automatically chomps C<$/> (the input record
+separator) when used with B<-n> or B<-p>. Second, it assigns C<$\>
+(the output record separator) to have the value of I<octnum> so
+that any print statements will have that separator added back on.
+If I<octnum> is omitted, sets C<$\> to the current value of
+C<$/>. For instance, to trim lines to 80 columns:
+
+ perl -lpe 'substr($_, 80) = ""'
+
+Note that the assignment C<$\ = $/> is done when the switch is processed,
+so the input record separator can be different than the output record
+separator if the B<-l> switch is followed by a B<-0> switch:
+
+ gnufind / -print0 | perl -ln0e 'print "found $_" if -p'
+
+This sets C<$\> to newline and then sets C<$/> to the null character.
+
+=item B<-m>[B<->]I<module>
+X<-m> X<-M>
+
+=item B<-M>[B<->]I<module>
+
+=item B<-M>[B<->]I<'module ...'>
+
+=item B<-[mM]>[B<->]I<module=arg[,arg]...>
+
+B<-m>I<module> executes C<use> I<module> C<();> before executing your
+program.
+
+B<-M>I<module> executes C<use> I<module> C<;> before executing your
+program. You can use quotes to add extra code after the module name,
+e.g., C<'-Mmodule qw(foo bar)'>.
+
+If the first character after the B<-M> or B<-m> is a dash (C<->)
+then the 'use' is replaced with 'no'.
+
+A little builtin syntactic sugar means you can also say
+B<-mmodule=foo,bar> or B<-Mmodule=foo,bar> as a shortcut for
+C<'-Mmodule qw(foo bar)'>. This avoids the need to use quotes when
+importing symbols. The actual code generated by B<-Mmodule=foo,bar> is
+C<use module split(/,/,q{foo,bar})>. Note that the C<=> form
+removes the distinction between B<-m> and B<-M>.
+
+A consequence of this is that B<-MFoo=number> never does a version check
+(unless C<Foo::import()> itself is set up to do a version check, which
+could happen for example if Foo inherits from Exporter.)
+
+=item B<-n>
+X<-n>
+
+causes Perl to assume the following loop around your program, which
+makes it iterate over filename arguments somewhat like B<sed -n> or
+B<awk>:
+
+ LINE:
+ while (<>) {
+ ... # your program goes here
+ }
+
+Note that the lines are not printed by default. See B<-p> to have
+lines printed. If a file named by an argument cannot be opened for
+some reason, Perl warns you about it and moves on to the next file.
+
+Also note that C<< <> >> passes command line arguments to
+L<perlfunc/open>, which doesn't necessarily interpret them as file names.
+See L<perlop> for possible security implications.
+
+Here is an efficient way to delete all files that haven't been modified for
+at least a week:
+
+ find . -mtime +7 -print | perl -nle unlink
+
+This is faster than using the B<-exec> switch of B<find> because you don't
+have to start a process on every filename found. It does suffer from
+the bug of mishandling newlines in pathnames, which you can fix if
+you follow the example under B<-0>.
+
+C<BEGIN> and C<END> blocks may be used to capture control before or after
+the implicit program loop, just as in B<awk>.
+
+=item B<-p>
+X<-p>
+
+causes Perl to assume the following loop around your program, which
+makes it iterate over filename arguments somewhat like B<sed>:
+
+
+ LINE:
+ while (<>) {
+ ... # your program goes here
+ } continue {
+ print or die "-p destination: $!\n";
+ }
+
+If a file named by an argument cannot be opened for some reason, Perl
+warns you about it, and moves on to the next file. Note that the
+lines are printed automatically. An error occurring during printing is
+treated as fatal. To suppress printing use the B<-n> switch. A B<-p>
+overrides a B<-n> switch.
+
+C<BEGIN> and C<END> blocks may be used to capture control before or after
+the implicit loop, just as in B<awk>.
+
+=item B<-P>
+X<-P>
+
+B<NOTE: Use of -P is strongly discouraged because of its inherent
+problems, including poor portability. It is deprecated and will be
+removed in a future version of Perl.>
+
+This option causes your program to be run through the C preprocessor before
+compilation by Perl. Because both comments and B<cpp> directives begin
+with the # character, you should avoid starting comments with any words
+recognized by the C preprocessor such as C<"if">, C<"else">, or C<"define">.
+
+If you're considering using C<-P>, you might also want to look at the
+Filter::cpp module from CPAN.
+
+The problems of -P include, but are not limited to:
+
+=over 10
+
+=item *
+
+The C<#!> line is stripped, so any switches there don't apply.
+
+=item *
+
+A C<-P> on a C<#!> line doesn't work.
+
+=item *
+
+B<All> lines that begin with (whitespace and) a C<#> but
+do not look like cpp commands, are stripped, including anything
+inside Perl strings, regular expressions, and here-docs .
+
+=item *
+
+In some platforms the C preprocessor knows too much: it knows about
+the C++ -style until-end-of-line comments starting with C<"//">.
+This will cause problems with common Perl constructs like
+
+ s/foo//;
+
+because after -P this will became illegal code
+
+ s/foo
+
+The workaround is to use some other quoting separator than C<"/">,
+like for example C<"!">:
+
+ s!foo!!;
+
+
+
+=item *
+
+It requires not only a working C preprocessor but also a working
+F<sed>. If not on UNIX, you are probably out of luck on this.
+
+=item *
+
+Script line numbers are not preserved.
+
+=item *
+
+The C<-x> does not work with C<-P>.
+
+=back
+
+=item B<-s>
+X<-s>
+
+enables rudimentary switch parsing for switches on the command
+line after the program name but before any filename arguments (or before
+an argument of B<-->). Any switch found there is removed from @ARGV and sets the
+corresponding variable in the Perl program. The following program
+prints "1" if the program is invoked with a B<-xyz> switch, and "abc"
+if it is invoked with B<-xyz=abc>.
+
+ #!/usr/bin/perl -s
+ if ($xyz) { print "$xyz\n" }
+
+Do note that a switch like B<--help> creates the variable ${-help}, which is not compliant
+with C<strict refs>. Also, when using this option on a script with
+warnings enabled you may get a lot of spurious "used only once" warnings.
+
+=item B<-S>
+X<-S>
+
+makes Perl use the PATH environment variable to search for the
+program (unless the name of the program contains directory separators).
+
+On some platforms, this also makes Perl append suffixes to the
+filename while searching for it. For example, on Win32 platforms,
+the ".bat" and ".cmd" suffixes are appended if a lookup for the
+original name fails, and if the name does not already end in one
+of those suffixes. If your Perl was compiled with DEBUGGING turned
+on, using the -Dp switch to Perl shows how the search progresses.
+
+Typically this is used to emulate #! startup on platforms that don't
+support #!. Its also convenient when debugging a script that uses #!,
+and is thus normally found by the shell's $PATH search mechanism.
+
+This example works on many platforms that have a shell compatible with
+Bourne shell:
+
+ #!/usr/bin/perl
+ eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}'
+ if $running_under_some_shell;
+
+The system ignores the first line and feeds the program to F</bin/sh>,
+which proceeds to try to execute the Perl program as a shell script.
+The shell executes the second line as a normal shell command, and thus
+starts up the Perl interpreter. On some systems $0 doesn't always
+contain the full pathname, so the B<-S> tells Perl to search for the
+program if necessary. After Perl locates the program, it parses the
+lines and ignores them because the variable $running_under_some_shell
+is never true. If the program will be interpreted by csh, you will need
+to replace C<${1+"$@"}> with C<$*>, even though that doesn't understand
+embedded spaces (and such) in the argument list. To start up sh rather
+than csh, some systems may have to replace the #! line with a line
+containing just a colon, which will be politely ignored by Perl. Other
+systems can't control that, and need a totally devious construct that
+will work under any of B<csh>, B<sh>, or Perl, such as the following:
+
+ eval '(exit $?0)' && eval 'exec perl -wS $0 ${1+"$@"}'
+ & eval 'exec /usr/bin/perl -wS $0 $argv:q'
+ if $running_under_some_shell;
+
+If the filename supplied contains directory separators (i.e., is an
+absolute or relative pathname), and if that file is not found,
+platforms that append file extensions will do so and try to look
+for the file with those extensions added, one by one.
+
+On DOS-like platforms, if the program does not contain directory
+separators, it will first be searched for in the current directory
+before being searched for on the PATH. On Unix platforms, the
+program will be searched for strictly on the PATH.
+
+=item B<-t>
+X<-t>
+
+Like B<-T>, but taint checks will issue warnings rather than fatal
+errors. These warnings can be controlled normally with C<no warnings
+qw(taint)>.
+
+B<NOTE: this is not a substitute for -T.> This is meant only to be
+used as a temporary development aid while securing legacy code:
+for real production code and for new secure code written from scratch
+always use the real B<-T>.
+
+=item B<-T>
+X<-T>
+
+forces "taint" checks to be turned on so you can test them. Ordinarily
+these checks are done only when running setuid or setgid. It's a
+good idea to turn them on explicitly for programs that run on behalf
+of someone else whom you might not necessarily trust, such as CGI
+programs or any internet servers you might write in Perl. See
+L<perlsec> for details. For security reasons, this option must be
+seen by Perl quite early; usually this means it must appear early
+on the command line or in the #! line for systems which support
+that construct.
+
+=item B<-u>
+X<-u>
+
+This obsolete switch causes Perl to dump core after compiling your
+program. You can then in theory take this core dump and turn it
+into an executable file by using the B<undump> program (not supplied).
+This speeds startup at the expense of some disk space (which you
+can minimize by stripping the executable). (Still, a "hello world"
+executable comes out to about 200K on my machine.) If you want to
+execute a portion of your program before dumping, use the dump()
+operator instead. Note: availability of B<undump> is platform
+specific and may not be available for a specific port of Perl.
+
+=item B<-U>
+X<-U>
+
+allows Perl to do unsafe operations. Currently the only "unsafe"
+operations are attempting to unlink directories while running as
+superuser, and running setuid programs with fatal taint checks turned
+into warnings. Note that the B<-w> switch (or the C<$^W> variable)
+must be used along with this option to actually I<generate> the
+taint-check warnings.
+
+=item B<-v>
+X<-v>
+
+prints the version and patchlevel of your perl executable.
+
+=item B<-V>
+X<-V>
+
+prints summary of the major perl configuration values and the current
+values of @INC.
+
+=item B<-V:>I<configvar>
+
+Prints to STDOUT the value of the named configuration variable(s),
+with multiples when your configvar argument looks like a regex (has
+non-letters). For example:
+
+ $ perl -V:libc
+ libc='/lib/libc-2.2.4.so';
+ $ perl -V:lib.
+ libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc';
+ libc='/lib/libc-2.2.4.so';
+ $ perl -V:lib.*
+ libpth='/usr/local/lib /lib /usr/lib';
+ libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc';
+ lib_ext='.a';
+ libc='/lib/libc-2.2.4.so';
+ libperl='libperl.a';
+ ....
+
+Additionally, extra colons can be used to control formatting. A
+trailing colon suppresses the linefeed and terminator ';', allowing
+you to embed queries into shell commands. (mnemonic: PATH separator
+':'.)
+
+ $ echo "compression-vars: " `perl -V:z.*: ` " are here !"
+ compression-vars: zcat='' zip='zip' are here !
+
+A leading colon removes the 'name=' part of the response, this allows
+you to map to the name you need. (mnemonic: empty label)
+
+ $ echo "goodvfork="`./perl -Ilib -V::usevfork`
+ goodvfork=false;
+
+Leading and trailing colons can be used together if you need
+positional parameter values without the names. Note that in the case
+below, the PERL_API params are returned in alphabetical order.
+
+ $ echo building_on `perl -V::osname: -V::PERL_API_.*:` now
+ building_on 'linux' '5' '1' '9' now
+
+=item B<-w>
+X<-w>
+
+prints warnings about dubious constructs, such as variable names
+that are mentioned only once and scalar variables that are used
+before being set, redefined subroutines, references to undefined
+filehandles or filehandles opened read-only that you are attempting
+to write on, values used as a number that don't look like numbers,
+using an array as though it were a scalar, if your subroutines
+recurse more than 100 deep, and innumerable other things.
+
+This switch really just enables the internal C<$^W> variable. You
+can disable or promote into fatal errors specific warnings using
+C<__WARN__> hooks, as described in L<perlvar> and L<perlfunc/warn>.
+See also L<perldiag> and L<perltrap>. A new, fine-grained warning
+facility is also available if you want to manipulate entire classes
+of warnings; see L<warnings> or L<perllexwarn>.
+
+=item B<-W>
+X<-W>
+
+Enables all warnings regardless of C<no warnings> or C<$^W>.
+See L<perllexwarn>.
+
+=item B<-X>
+X<-X>
+
+Disables all warnings regardless of C<use warnings> or C<$^W>.
+See L<perllexwarn>.
+
+=item B<-x>
+X<-x>
+
+=item B<-x>I<directory>
+
+tells Perl that the program is embedded in a larger chunk of unrelated
+ASCII text, such as in a mail message. Leading garbage will be
+discarded until the first line that starts with #! and contains the
+string "perl". Any meaningful switches on that line will be applied.
+
+All references to line numbers by the program (warnings, errors, ...)
+will treat the #! line as the first line.
+Thus a warning on the 2nd line of the program (which is on the 100th
+line in the file) will be reported as line 2, and not as line 100.
+This can be overridden by using the #line directive.
+(See L<perlsyn/"Plain-Old-Comments-(Not!)">)
+
+If a directory name is specified, Perl will switch to that directory
+before running the program. The B<-x> switch controls only the
+disposal of leading garbage. The program must be terminated with
+C<__END__> if there is trailing garbage to be ignored (the program
+can process any or all of the trailing garbage via the DATA filehandle
+if desired).
+
+The directory, if specified, must appear immediately following the B<-x>
+with no intervening whitespace.
+
+=back
+
+=head1 ENVIRONMENT
+X<perl, environment variables>
+
+=over 12
+
+=item HOME
+X<HOME>
+
+Used if chdir has no argument.
+
+=item LOGDIR
+X<LOGDIR>
+
+Used if chdir has no argument and HOME is not set.
+
+=item PATH
+X<PATH>
+
+Used in executing subprocesses, and in finding the program if B<-S> is
+used.
+
+=item PERL5LIB
+X<PERL5LIB>
+
+A list of directories in which to look for Perl library
+files before looking in the standard library and the current
+directory. Any architecture-specific directories under the specified
+locations are automatically included if they exist (this lookup
+being done at interpreter startup time.)
+
+If PERL5LIB is not defined, PERLLIB is used. Directories are separated
+(like in PATH) by a colon on unixish platforms and by a semicolon on
+Windows (the proper path separator being given by the command C<perl
+-V:path_sep>).
+
+When running taint checks (either because the program was running setuid
+or setgid, or the B<-T> or B<-t> switch was specified), neither variable
+is used. The program should instead say:
+
+ use lib "/my/directory";
+
+=item PERL5OPT
+X<PERL5OPT>
+
+Command-line options (switches). Switches in this variable are taken
+as if they were on every Perl command line. Only the B<-[CDIMUdmtw]>
+switches are allowed. When running taint checks (because the program
+was running setuid or setgid, or the B<-T> switch was used), this
+variable is ignored. If PERL5OPT begins with B<-T>, tainting will be
+enabled, and any subsequent options ignored.
+
+=item PERLIO
+X<PERLIO>
+
+A space (or colon) separated list of PerlIO layers. If perl is built
+to use PerlIO system for IO (the default) these layers effect perl's IO.
+
+It is conventional to start layer names with a colon e.g. C<:perlio> to
+emphasise their similarity to variable "attributes". But the code that parses
+layer specification strings (which is also used to decode the PERLIO
+environment variable) treats the colon as a separator.
+
+An unset or empty PERLIO is equivalent to the default set of layers for
+your platform, for example C<:unix:perlio> on UNIX-like systems
+and C<:unix:crlf> on Windows and other DOS-like systems.
+
+The list becomes the default for I<all> perl's IO. Consequently only built-in
+layers can appear in this list, as external layers (such as :encoding()) need
+IO in order to load them!. See L<"open pragma"|open> for how to add external
+encodings as defaults.
+
+The layers that it makes sense to include in the PERLIO environment
+variable are briefly summarised below. For more details see L<PerlIO>.
+
+=over 8
+
+=item :bytes
+X<:bytes>
+
+A pseudolayer that turns I<off> the C<:utf8> flag for the layer below.
+Unlikely to be useful on its own in the global PERLIO environment variable.
+You perhaps were thinking of C<:crlf:bytes> or C<:perlio:bytes>.
+
+=item :crlf
+X<:crlf>
+
+A layer which does CRLF to "\n" translation distinguishing "text" and
+"binary" files in the manner of MS-DOS and similar operating systems.
+(It currently does I<not> mimic MS-DOS as far as treating of Control-Z
+as being an end-of-file marker.)
+
+=item :mmap
+X<:mmap>
+
+A layer which implements "reading" of files by using C<mmap()> to
+make (whole) file appear in the process's address space, and then
+using that as PerlIO's "buffer".
+
+=item :perlio
+X<:perlio>
+
+This is a re-implementation of "stdio-like" buffering written as a
+PerlIO "layer". As such it will call whatever layer is below it for
+its operations (typically C<:unix>).
+
+=item :pop
+X<:pop>
+
+An experimental pseudolayer that removes the topmost layer.
+Use with the same care as is reserved for nitroglycerin.
+
+=item :raw
+X<:raw>
+
+A pseudolayer that manipulates other layers. Applying the C<:raw>
+layer is equivalent to calling C<binmode($fh)>. It makes the stream
+pass each byte as-is without any translation. In particular CRLF
+translation, and/or :utf8 intuited from locale are disabled.
+
+Unlike in the earlier versions of Perl C<:raw> is I<not>
+just the inverse of C<:crlf> - other layers which would affect the
+binary nature of the stream are also removed or disabled.
+
+=item :stdio
+X<:stdio>
+
+This layer provides PerlIO interface by wrapping system's ANSI C "stdio"
+library calls. The layer provides both buffering and IO.
+Note that C<:stdio> layer does I<not> do CRLF translation even if that
+is platforms normal behaviour. You will need a C<:crlf> layer above it
+to do that.
+
+=item :unix
+X<:unix>
+
+Low level layer which calls C<read>, C<write> and C<lseek> etc.
+
+=item :utf8
+X<:utf8>
+
+A pseudolayer that turns on a flag on the layer below to tell perl
+that output should be in utf8 and that input should be regarded as
+already in valid utf8 form. It does not check for validity and as such
+should be handled with caution for input. Generally C<:encoding(utf8)> is
+the best option when reading UTF-8 encoded data.
+
+=item :win32
+X<:win32>
+
+On Win32 platforms this I<experimental> layer uses native "handle" IO
+rather than unix-like numeric file descriptor layer. Known to be
+buggy in this release.
+
+=back
+
+On all platforms the default set of layers should give acceptable results.
+
+For UNIX platforms that will equivalent of "unix perlio" or "stdio".
+Configure is setup to prefer "stdio" implementation if system's library
+provides for fast access to the buffer, otherwise it uses the "unix perlio"
+implementation.
+
+On Win32 the default in this release is "unix crlf". Win32's "stdio"
+has a number of bugs/mis-features for perl IO which are somewhat
+C compiler vendor/version dependent. Using our own C<crlf> layer as
+the buffer avoids those issues and makes things more uniform.
+The C<crlf> layer provides CRLF to/from "\n" conversion as well as
+buffering.
+
+This release uses C<unix> as the bottom layer on Win32 and so still uses C
+compiler's numeric file descriptor routines. There is an experimental native
+C<win32> layer which is expected to be enhanced and should eventually be
+the default under Win32.
+
+The PERLIO environment variable is completely ignored when perl
+is run in taint mode.
+
+=item PERLIO_DEBUG
+X<PERLIO_DEBUG>
+
+If set to the name of a file or device then certain operations of PerlIO
+sub-system will be logged to that file (opened as append). Typical uses
+are UNIX:
+
+ PERLIO_DEBUG=/dev/tty perl script ...
+
+and Win32 approximate equivalent:
+
+ set PERLIO_DEBUG=CON
+ perl script ...
+
+This functionality is disabled for setuid scripts and for scripts run
+with B<-T>.
+
+=item PERLLIB
+X<PERLLIB>
+
+A list of directories in which to look for Perl library
+files before looking in the standard library and the current directory.
+If PERL5LIB is defined, PERLLIB is not used.
+
+The PERLLIB environment variable is completely ignored when perl
+is run in taint mode.
+
+=item PERL5DB
+X<PERL5DB>
+
+The command used to load the debugger code. The default is:
+
+ BEGIN { require 'perl5db.pl' }
+
+The PERL5DB environment variable only used when perl is started with
+a bare B<-d> switch.
+
+=item PERL5DB_THREADED
+X<PERL5DB_THREADED>
+
+If set to a true value, indicates to the debugger that the code being
+debugged uses threads.
+
+=item PERL5SHELL (specific to the Win32 port)
+X<PERL5SHELL>
+
+May be set to an alternative shell that perl must use internally for
+executing "backtick" commands or system(). Default is C<cmd.exe /x/d/c>
+on WindowsNT and C<command.com /c> on Windows95. The value is considered
+to be space-separated. Precede any character that needs to be protected
+(like a space or backslash) with a backslash.
+
+Note that Perl doesn't use COMSPEC for this purpose because
+COMSPEC has a high degree of variability among users, leading to
+portability concerns. Besides, perl can use a shell that may not be
+fit for interactive use, and setting COMSPEC to such a shell may
+interfere with the proper functioning of other programs (which usually
+look in COMSPEC to find a shell fit for interactive use).
+
+Before Perl 5.10.0 and 5.8.8, PERL5SHELL was not taint checked
+when running external commands. It is recommended that
+you explicitly set (or delete) C<$ENV{PERL5SHELL}> when running
+in taint mode under Windows.
+
+=item PERL_ALLOW_NON_IFS_LSP (specific to the Win32 port)
+X<PERL_ALLOW_NON_IFS_LSP>
+
+Set to 1 to allow the use of non-IFS compatible LSP's.
+Perl normally searches for an IFS-compatible LSP because this is required
+for its emulation of Windows sockets as real filehandles. However, this may
+cause problems if you have a firewall such as McAfee Guardian which requires
+all applications to use its LSP which is not IFS-compatible, because clearly
+Perl will normally avoid using such an LSP.
+Setting this environment variable to 1 means that Perl will simply use the
+first suitable LSP enumerated in the catalog, which keeps McAfee Guardian
+happy (and in that particular case Perl still works too because McAfee
+Guardian's LSP actually plays some other games which allow applications
+requiring IFS compatibility to work).
+
+=item PERL_DEBUG_MSTATS
+X<PERL_DEBUG_MSTATS>
+
+Relevant only if perl is compiled with the malloc included with the perl
+distribution (that is, if C<perl -V:d_mymalloc> is 'define').
+If set, this causes memory statistics to be dumped after execution. If set
+to an integer greater than one, also causes memory statistics to be dumped
+after compilation.
+
+=item PERL_DESTRUCT_LEVEL
+X<PERL_DESTRUCT_LEVEL>
+
+Relevant only if your perl executable was built with B<-DDEBUGGING>,
+this controls the behavior of global destruction of objects and other
+references. See L<perlhack/PERL_DESTRUCT_LEVEL> for more information.
+
+=item PERL_DL_NONLAZY
+X<PERL_DL_NONLAZY>
+
+Set to one to have perl resolve B<all> undefined symbols when it loads
+a dynamic library. The default behaviour is to resolve symbols when
+they are used. Setting this variable is useful during testing of
+extensions as it ensures that you get an error on misspelled function
+names even if the test suite doesn't call it.
+
+=item PERL_ENCODING
+X<PERL_ENCODING>
+
+If using the C<encoding> pragma without an explicit encoding name, the
+PERL_ENCODING environment variable is consulted for an encoding name.
+
+=item PERL_HASH_SEED
+X<PERL_HASH_SEED>
+
+(Since Perl 5.8.1.) Used to randomise perl's internal hash function.
+To emulate the pre-5.8.1 behaviour, set to an integer (zero means
+exactly the same order as 5.8.0). "Pre-5.8.1" means, among other
+things, that hash keys will always have the same ordering between
+different runs of perl.
+
+Most hashes return elements in the same order as Perl 5.8.0 by default.
+On a hash by hash basis, if pathological data is detected during a hash
+key insertion, then that hash will switch to an alternative random hash
+seed.
+
+The default behaviour is to randomise unless the PERL_HASH_SEED is set.
+If perl has been compiled with C<-DUSE_HASH_SEED_EXPLICIT>, the default
+behaviour is B<not> to randomise unless the PERL_HASH_SEED is set.
+
+If PERL_HASH_SEED is unset or set to a non-numeric string, perl uses
+the pseudorandom seed supplied by the operating system and libraries.
+
+B<Please note that the hash seed is sensitive information>. Hashes are
+randomized to protect against local and remote attacks against Perl
+code. By manually setting a seed this protection may be partially or
+completely lost.
+
+See L<perlsec/"Algorithmic Complexity Attacks"> and
+L</PERL_HASH_SEED_DEBUG> for more information.
+
+=item PERL_HASH_SEED_DEBUG
+X<PERL_HASH_SEED_DEBUG>
+
+(Since Perl 5.8.1.) Set to one to display (to STDERR) the value of
+the hash seed at the beginning of execution. This, combined with
+L</PERL_HASH_SEED> is intended to aid in debugging nondeterministic
+behavior caused by hash randomization.
+
+B<Note that the hash seed is sensitive information>: by knowing it one
+can craft a denial-of-service attack against Perl code, even remotely,
+see L<perlsec/"Algorithmic Complexity Attacks"> for more information.
+B<Do not disclose the hash seed> to people who don't need to know it.
+See also hash_seed() of L<Hash::Util>.
+
+=item PERL_ROOT (specific to the VMS port)
+X<PERL_ROOT>
+
+A translation concealed rooted logical name that contains perl and the
+logical device for the @INC path on VMS only. Other logical names that
+affect perl on VMS include PERLSHR, PERL_ENV_TABLES, and
+SYS$TIMEZONE_DIFFERENTIAL but are optional and discussed further in
+L<perlvms> and in F<README.vms> in the Perl source distribution.
+
+=item PERL_SIGNALS
+X<PERL_SIGNALS>
+
+In Perls 5.8.1 and later. If set to C<unsafe> the pre-Perl-5.8.0
+signals behaviour (immediate but unsafe) is restored. If set to
+C<safe> the safe (or deferred) signals are used.
+See L<perlipc/"Deferred Signals (Safe Signals)">.
+
+=item PERL_UNICODE
+X<PERL_UNICODE>
+
+Equivalent to the B<-C> command-line switch. Note that this is not
+a boolean variable-- setting this to C<"1"> is not the right way to
+"enable Unicode" (whatever that would mean). You can use C<"0"> to
+"disable Unicode", though (or alternatively unset PERL_UNICODE in
+your shell before starting Perl). See the description of the C<-C>
+switch for more information.
+
+=item SYS$LOGIN (specific to the VMS port)
+X<SYS$LOGIN>
+
+Used if chdir has no argument and HOME and LOGDIR are not set.
+
+=back
+
+Perl also has environment variables that control how Perl handles data
+specific to particular natural languages. See L<perllocale>.
+
+Apart from these, Perl uses no other environment variables, except
+to make them available to the program being executed, and to child
+processes. However, programs running setuid would do well to execute
+the following lines before doing anything else, just to keep people
+honest:
+
+ $ENV{PATH} = '/bin:/usr/bin'; # or whatever you need
+ $ENV{SHELL} = '/bin/sh' if exists $ENV{SHELL};
+ delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlsec.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlsec.pod
new file mode 100755
index 00000000000..c117eeb0b6e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlsec.pod
@@ -0,0 +1,527 @@
+=head1 NAME
+
+perlsec - Perl security
+
+=head1 DESCRIPTION
+
+Perl is designed to make it easy to program securely even when running
+with extra privileges, like setuid or setgid programs. Unlike most
+command line shells, which are based on multiple substitution passes on
+each line of the script, Perl uses a more conventional evaluation scheme
+with fewer hidden snags. Additionally, because the language has more
+builtin functionality, it can rely less upon external (and possibly
+untrustworthy) programs to accomplish its purposes.
+
+=head1 SECURITY VULNERABILITY CONTACT INFORMATION
+
+If you believe you have found a security vulnerability in Perl, please email
+perl5-security-report@perl.org with details. This points to a closed
+subscription, unarchived mailing list. Please only use this address for
+security issues in the Perl core, not for modules independently distributed on
+CPAN.
+
+=head1 SECURITY MECHANISMS AND CONCERNS
+
+=head2 Taint mode
+
+Perl automatically enables a set of special security checks, called I<taint
+mode>, when it detects its program running with differing real and effective
+user or group IDs. The setuid bit in Unix permissions is mode 04000, the
+setgid bit mode 02000; either or both may be set. You can also enable taint
+mode explicitly by using the B<-T> command line flag. This flag is
+I<strongly> suggested for server programs and any program run on behalf of
+someone else, such as a CGI script. Once taint mode is on, it's on for
+the remainder of your script.
+
+While in this mode, Perl takes special precautions called I<taint
+checks> to prevent both obvious and subtle traps. Some of these checks
+are reasonably simple, such as verifying that path directories aren't
+writable by others; careful programmers have always used checks like
+these. Other checks, however, are best supported by the language itself,
+and it is these checks especially that contribute to making a set-id Perl
+program more secure than the corresponding C program.
+
+You may not use data derived from outside your program to affect
+something else outside your program--at least, not by accident. All
+command line arguments, environment variables, locale information (see
+L<perllocale>), results of certain system calls (C<readdir()>,
+C<readlink()>, the variable of C<shmread()>, the messages returned by
+C<msgrcv()>, the password, gcos and shell fields returned by the
+C<getpwxxx()> calls), and all file input are marked as "tainted".
+Tainted data may not be used directly or indirectly in any command
+that invokes a sub-shell, nor in any command that modifies files,
+directories, or processes, B<with the following exceptions>:
+
+=over 4
+
+=item *
+
+Arguments to C<print> and C<syswrite> are B<not> checked for taintedness.
+
+=item *
+
+Symbolic methods
+
+ $obj->$method(@args);
+
+and symbolic sub references
+
+ &{$foo}(@args);
+ $foo->(@args);
+
+are not checked for taintedness. This requires extra carefulness
+unless you want external data to affect your control flow. Unless
+you carefully limit what these symbolic values are, people are able
+to call functions B<outside> your Perl code, such as POSIX::system,
+in which case they are able to run arbitrary external code.
+
+=item *
+
+Hash keys are B<never> tainted.
+
+=back
+
+For efficiency reasons, Perl takes a conservative view of
+whether data is tainted. If an expression contains tainted data,
+any subexpression may be considered tainted, even if the value
+of the subexpression is not itself affected by the tainted data.
+
+Because taintedness is associated with each scalar value, some
+elements of an array or hash can be tainted and others not.
+The keys of a hash are B<never> tainted.
+
+For example:
+
+ $arg = shift; # $arg is tainted
+ $hid = $arg, 'bar'; # $hid is also tainted
+ $line = <>; # Tainted
+ $line = <STDIN>; # Also tainted
+ open FOO, "/home/me/bar" or die $!;
+ $line = <FOO>; # Still tainted
+ $path = $ENV{'PATH'}; # Tainted, but see below
+ $data = 'abc'; # Not tainted
+
+ system "echo $arg"; # Insecure
+ system "/bin/echo", $arg; # Considered insecure
+ # (Perl doesn't know about /bin/echo)
+ system "echo $hid"; # Insecure
+ system "echo $data"; # Insecure until PATH set
+
+ $path = $ENV{'PATH'}; # $path now tainted
+
+ $ENV{'PATH'} = '/bin:/usr/bin';
+ delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
+
+ $path = $ENV{'PATH'}; # $path now NOT tainted
+ system "echo $data"; # Is secure now!
+
+ open(FOO, "< $arg"); # OK - read-only file
+ open(FOO, "> $arg"); # Not OK - trying to write
+
+ open(FOO,"echo $arg|"); # Not OK
+ open(FOO,"-|")
+ or exec 'echo', $arg; # Also not OK
+
+ $shout = `echo $arg`; # Insecure, $shout now tainted
+
+ unlink $data, $arg; # Insecure
+ umask $arg; # Insecure
+
+ exec "echo $arg"; # Insecure
+ exec "echo", $arg; # Insecure
+ exec "sh", '-c', $arg; # Very insecure!
+
+ @files = <*.c>; # insecure (uses readdir() or similar)
+ @files = glob('*.c'); # insecure (uses readdir() or similar)
+
+ # In Perl releases older than 5.6.0 the <*.c> and glob('*.c') would
+ # have used an external program to do the filename expansion; but in
+ # either case the result is tainted since the list of filenames comes
+ # from outside of the program.
+
+ $bad = ($arg, 23); # $bad will be tainted
+ $arg, `true`; # Insecure (although it isn't really)
+
+If you try to do something insecure, you will get a fatal error saying
+something like "Insecure dependency" or "Insecure $ENV{PATH}".
+
+The exception to the principle of "one tainted value taints the whole
+expression" is with the ternary conditional operator C<?:>. Since code
+with a ternary conditional
+
+ $result = $tainted_value ? "Untainted" : "Also untainted";
+
+is effectively
+
+ if ( $tainted_value ) {
+ $result = "Untainted";
+ } else {
+ $result = "Also untainted";
+ }
+
+it doesn't make sense for C<$result> to be tainted.
+
+=head2 Laundering and Detecting Tainted Data
+
+To test whether a variable contains tainted data, and whose use would
+thus trigger an "Insecure dependency" message, you can use the
+C<tainted()> function of the Scalar::Util module, available in your
+nearby CPAN mirror, and included in Perl starting from the release 5.8.0.
+Or you may be able to use the following C<is_tainted()> function.
+
+ sub is_tainted {
+ return ! eval { eval("#" . substr(join("", @_), 0, 0)); 1 };
+ }
+
+This function makes use of the fact that the presence of tainted data
+anywhere within an expression renders the entire expression tainted. It
+would be inefficient for every operator to test every argument for
+taintedness. Instead, the slightly more efficient and conservative
+approach is used that if any tainted value has been accessed within the
+same expression, the whole expression is considered tainted.
+
+But testing for taintedness gets you only so far. Sometimes you have just
+to clear your data's taintedness. Values may be untainted by using them
+as keys in a hash; otherwise the only way to bypass the tainting
+mechanism is by referencing subpatterns from a regular expression match.
+Perl presumes that if you reference a substring using $1, $2, etc., that
+you knew what you were doing when you wrote the pattern. That means using
+a bit of thought--don't just blindly untaint anything, or you defeat the
+entire mechanism. It's better to verify that the variable has only good
+characters (for certain values of "good") rather than checking whether it
+has any bad characters. That's because it's far too easy to miss bad
+characters that you never thought of.
+
+Here's a test to make sure that the data contains nothing but "word"
+characters (alphabetics, numerics, and underscores), a hyphen, an at sign,
+or a dot.
+
+ if ($data =~ /^([-\@\w.]+)$/) {
+ $data = $1; # $data now untainted
+ } else {
+ die "Bad data in '$data'"; # log this somewhere
+ }
+
+This is fairly secure because C</\w+/> doesn't normally match shell
+metacharacters, nor are dot, dash, or at going to mean something special
+to the shell. Use of C</.+/> would have been insecure in theory because
+it lets everything through, but Perl doesn't check for that. The lesson
+is that when untainting, you must be exceedingly careful with your patterns.
+Laundering data using regular expression is the I<only> mechanism for
+untainting dirty data, unless you use the strategy detailed below to fork
+a child of lesser privilege.
+
+The example does not untaint C<$data> if C<use locale> is in effect,
+because the characters matched by C<\w> are determined by the locale.
+Perl considers that locale definitions are untrustworthy because they
+contain data from outside the program. If you are writing a
+locale-aware program, and want to launder data with a regular expression
+containing C<\w>, put C<no locale> ahead of the expression in the same
+block. See L<perllocale/SECURITY> for further discussion and examples.
+
+=head2 Switches On the "#!" Line
+
+When you make a script executable, in order to make it usable as a
+command, the system will pass switches to perl from the script's #!
+line. Perl checks that any command line switches given to a setuid
+(or setgid) script actually match the ones set on the #! line. Some
+Unix and Unix-like environments impose a one-switch limit on the #!
+line, so you may need to use something like C<-wU> instead of C<-w -U>
+under such systems. (This issue should arise only in Unix or
+Unix-like environments that support #! and setuid or setgid scripts.)
+
+=head2 Taint mode and @INC
+
+When the taint mode (C<-T>) is in effect, the "." directory is removed
+from C<@INC>, and the environment variables C<PERL5LIB> and C<PERLLIB>
+are ignored by Perl. You can still adjust C<@INC> from outside the
+program by using the C<-I> command line option as explained in
+L<perlrun>. The two environment variables are ignored because
+they are obscured, and a user running a program could be unaware that
+they are set, whereas the C<-I> option is clearly visible and
+therefore permitted.
+
+Another way to modify C<@INC> without modifying the program, is to use
+the C<lib> pragma, e.g.:
+
+ perl -Mlib=/foo program
+
+The benefit of using C<-Mlib=/foo> over C<-I/foo>, is that the former
+will automagically remove any duplicated directories, while the later
+will not.
+
+Note that if a tainted string is added to C<@INC>, the following
+problem will be reported:
+
+ Insecure dependency in require while running with -T switch
+
+=head2 Cleaning Up Your Path
+
+For "Insecure C<$ENV{PATH}>" messages, you need to set C<$ENV{'PATH'}> to
+a known value, and each directory in the path must be absolute and
+non-writable by others than its owner and group. You may be surprised to
+get this message even if the pathname to your executable is fully
+qualified. This is I<not> generated because you didn't supply a full path
+to the program; instead, it's generated because you never set your PATH
+environment variable, or you didn't set it to something that was safe.
+Because Perl can't guarantee that the executable in question isn't itself
+going to turn around and execute some other program that is dependent on
+your PATH, it makes sure you set the PATH.
+
+The PATH isn't the only environment variable which can cause problems.
+Because some shells may use the variables IFS, CDPATH, ENV, and
+BASH_ENV, Perl checks that those are either empty or untainted when
+starting subprocesses. You may wish to add something like this to your
+setid and taint-checking scripts.
+
+ delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
+
+It's also possible to get into trouble with other operations that don't
+care whether they use tainted values. Make judicious use of the file
+tests in dealing with any user-supplied filenames. When possible, do
+opens and such B<after> properly dropping any special user (or group!)
+privileges. Perl doesn't prevent you from opening tainted filenames for reading,
+so be careful what you print out. The tainting mechanism is intended to
+prevent stupid mistakes, not to remove the need for thought.
+
+Perl does not call the shell to expand wild cards when you pass C<system>
+and C<exec> explicit parameter lists instead of strings with possible shell
+wildcards in them. Unfortunately, the C<open>, C<glob>, and
+backtick functions provide no such alternate calling convention, so more
+subterfuge will be required.
+
+Perl provides a reasonably safe way to open a file or pipe from a setuid
+or setgid program: just create a child process with reduced privilege who
+does the dirty work for you. First, fork a child using the special
+C<open> syntax that connects the parent and child by a pipe. Now the
+child resets its ID set and any other per-process attributes, like
+environment variables, umasks, current working directories, back to the
+originals or known safe values. Then the child process, which no longer
+has any special permissions, does the C<open> or other system call.
+Finally, the child passes the data it managed to access back to the
+parent. Because the file or pipe was opened in the child while running
+under less privilege than the parent, it's not apt to be tricked into
+doing something it shouldn't.
+
+Here's a way to do backticks reasonably safely. Notice how the C<exec> is
+not called with a string that the shell could expand. This is by far the
+best way to call something that might be subjected to shell escapes: just
+never call the shell at all.
+
+ use English '-no_match_vars';
+ die "Can't fork: $!" unless defined($pid = open(KID, "-|"));
+ if ($pid) { # parent
+ while (<KID>) {
+ # do something
+ }
+ close KID;
+ } else {
+ my @temp = ($EUID, $EGID);
+ my $orig_uid = $UID;
+ my $orig_gid = $GID;
+ $EUID = $UID;
+ $EGID = $GID;
+ # Drop privileges
+ $UID = $orig_uid;
+ $GID = $orig_gid;
+ # Make sure privs are really gone
+ ($EUID, $EGID) = @temp;
+ die "Can't drop privileges"
+ unless $UID == $EUID && $GID eq $EGID;
+ $ENV{PATH} = "/bin:/usr/bin"; # Minimal PATH.
+ # Consider sanitizing the environment even more.
+ exec 'myprog', 'arg1', 'arg2'
+ or die "can't exec myprog: $!";
+ }
+
+A similar strategy would work for wildcard expansion via C<glob>, although
+you can use C<readdir> instead.
+
+Taint checking is most useful when although you trust yourself not to have
+written a program to give away the farm, you don't necessarily trust those
+who end up using it not to try to trick it into doing something bad. This
+is the kind of security checking that's useful for set-id programs and
+programs launched on someone else's behalf, like CGI programs.
+
+This is quite different, however, from not even trusting the writer of the
+code not to try to do something evil. That's the kind of trust needed
+when someone hands you a program you've never seen before and says, "Here,
+run this." For that kind of safety, check out the Safe module,
+included standard in the Perl distribution. This module allows the
+programmer to set up special compartments in which all system operations
+are trapped and namespace access is carefully controlled.
+
+=head2 Security Bugs
+
+Beyond the obvious problems that stem from giving special privileges to
+systems as flexible as scripts, on many versions of Unix, set-id scripts
+are inherently insecure right from the start. The problem is a race
+condition in the kernel. Between the time the kernel opens the file to
+see which interpreter to run and when the (now-set-id) interpreter turns
+around and reopens the file to interpret it, the file in question may have
+changed, especially if you have symbolic links on your system.
+
+Fortunately, sometimes this kernel "feature" can be disabled.
+Unfortunately, there are two ways to disable it. The system can simply
+outlaw scripts with any set-id bit set, which doesn't help much.
+Alternately, it can simply ignore the set-id bits on scripts. If the
+latter is true, Perl can emulate the setuid and setgid mechanism when it
+notices the otherwise useless setuid/gid bits on Perl scripts. It does
+this via a special executable called F<suidperl> that is automatically
+invoked for you if it's needed.
+
+B<The use of suidperl is considered deprecated>, and will be removed
+in Perl 5.12.0. It is I<strongly> recommended that all code uses
+the simplier and more secure C-wrappers described below.
+
+If the kernel set-id script feature isn't disabled, Perl will
+complain loudly that your set-id script is insecure. You'll need to
+either disable the kernel set-id script feature, or put a C wrapper around
+the script. A C wrapper is just a compiled program that does nothing
+except call your Perl program. Compiled programs are not subject to the
+kernel bug that plagues set-id scripts. Here's a simple wrapper, written
+in C:
+
+ #define REAL_PATH "/path/to/script"
+ main(ac, av)
+ char **av;
+ {
+ execv(REAL_PATH, av);
+ }
+
+Compile this wrapper into a binary executable and then make I<it> rather
+than your script setuid or setgid.
+
+In recent years, vendors have begun to supply systems free of this
+inherent security bug. On such systems, when the kernel passes the name
+of the set-id script to open to the interpreter, rather than using a
+pathname subject to meddling, it instead passes I</dev/fd/3>. This is a
+special file already opened on the script, so that there can be no race
+condition for evil scripts to exploit. On these systems, Perl should be
+compiled with C<-DSETUID_SCRIPTS_ARE_SECURE_NOW>. The F<Configure>
+program that builds Perl tries to figure this out for itself, so you
+should never have to specify this yourself. Most modern releases of
+SysVr4 and BSD 4.4 use this approach to avoid the kernel race condition.
+
+Prior to release 5.6.1 of Perl, bugs in the code of F<suidperl> could
+introduce a security hole. The use of F<suidperl> is considered
+deprecated, and will be removed in Perl 5.12.0.
+
+=head2 Protecting Your Programs
+
+There are a number of ways to hide the source to your Perl programs,
+with varying levels of "security".
+
+First of all, however, you I<can't> take away read permission, because
+the source code has to be readable in order to be compiled and
+interpreted. (That doesn't mean that a CGI script's source is
+readable by people on the web, though.) So you have to leave the
+permissions at the socially friendly 0755 level. This lets
+people on your local system only see your source.
+
+Some people mistakenly regard this as a security problem. If your program does
+insecure things, and relies on people not knowing how to exploit those
+insecurities, it is not secure. It is often possible for someone to
+determine the insecure things and exploit them without viewing the
+source. Security through obscurity, the name for hiding your bugs
+instead of fixing them, is little security indeed.
+
+You can try using encryption via source filters (Filter::* from CPAN,
+or Filter::Util::Call and Filter::Simple since Perl 5.8).
+But crackers might be able to decrypt it. You can try using the byte
+code compiler and interpreter described below, but crackers might be
+able to de-compile it. You can try using the native-code compiler
+described below, but crackers might be able to disassemble it. These
+pose varying degrees of difficulty to people wanting to get at your
+code, but none can definitively conceal it (this is true of every
+language, not just Perl).
+
+If you're concerned about people profiting from your code, then the
+bottom line is that nothing but a restrictive license will give you
+legal security. License your software and pepper it with threatening
+statements like "This is unpublished proprietary software of XYZ Corp.
+Your access to it does not give you permission to use it blah blah
+blah." You should see a lawyer to be sure your license's wording will
+stand up in court.
+
+=head2 Unicode
+
+Unicode is a new and complex technology and one may easily overlook
+certain security pitfalls. See L<perluniintro> for an overview and
+L<perlunicode> for details, and L<perlunicode/"Security Implications
+of Unicode"> for security implications in particular.
+
+=head2 Algorithmic Complexity Attacks
+
+Certain internal algorithms used in the implementation of Perl can
+be attacked by choosing the input carefully to consume large amounts
+of either time or space or both. This can lead into the so-called
+I<Denial of Service> (DoS) attacks.
+
+=over 4
+
+=item *
+
+Hash Function - the algorithm used to "order" hash elements has been
+changed several times during the development of Perl, mainly to be
+reasonably fast. In Perl 5.8.1 also the security aspect was taken
+into account.
+
+In Perls before 5.8.1 one could rather easily generate data that as
+hash keys would cause Perl to consume large amounts of time because
+internal structure of hashes would badly degenerate. In Perl 5.8.1
+the hash function is randomly perturbed by a pseudorandom seed which
+makes generating such naughty hash keys harder.
+See L<perlrun/PERL_HASH_SEED> for more information.
+
+In Perl 5.8.1 the random perturbation was done by default, but as of
+5.8.2 it is only used on individual hashes if the internals detect the
+insertion of pathological data. If one wants for some reason emulate the
+old behaviour (and expose oneself to DoS attacks) one can set the
+environment variable PERL_HASH_SEED to zero to disable the protection
+(or any other integer to force a known perturbation, rather than random).
+One possible reason for wanting to emulate the old behaviour is that in the
+new behaviour consecutive runs of Perl will order hash keys differently,
+which may confuse some applications (like Data::Dumper: the outputs of two
+different runs are no longer identical).
+
+B<Perl has never guaranteed any ordering of the hash keys>, and the
+ordering has already changed several times during the lifetime of
+Perl 5. Also, the ordering of hash keys has always been, and
+continues to be, affected by the insertion order.
+
+Also note that while the order of the hash elements might be
+randomised, this "pseudoordering" should B<not> be used for
+applications like shuffling a list randomly (use List::Util::shuffle()
+for that, see L<List::Util>, a standard core module since Perl 5.8.0;
+or the CPAN module Algorithm::Numerical::Shuffle), or for generating
+permutations (use e.g. the CPAN modules Algorithm::Permute or
+Algorithm::FastPermute), or for any cryptographic applications.
+
+=item *
+
+Regular expressions - Perl's regular expression engine is so called NFA
+(Non-deterministic Finite Automaton), which among other things means that
+it can rather easily consume large amounts of both time and space if the
+regular expression may match in several ways. Careful crafting of the
+regular expressions can help but quite often there really isn't much
+one can do (the book "Mastering Regular Expressions" is required
+reading, see L<perlfaq2>). Running out of space manifests itself by
+Perl running out of memory.
+
+=item *
+
+Sorting - the quicksort algorithm used in Perls before 5.8.0 to
+implement the sort() function is very easy to trick into misbehaving
+so that it consumes a lot of time. Starting from Perl 5.8.0 a different
+sorting algorithm, mergesort, is used by default. Mergesort cannot
+misbehave on any input.
+
+=back
+
+See L<http://www.cs.rice.edu/~scrosby/hash/> for more information,
+and any computer science textbook on algorithmic complexity.
+
+=head1 SEE ALSO
+
+L<perlrun> for its description of cleaning up environment variables.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlsolaris.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlsolaris.pod
new file mode 100755
index 00000000000..427e08de6ed
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlsolaris.pod
@@ -0,0 +1,690 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+README.solaris - Perl version 5 on Solaris systems
+
+=head1 DESCRIPTION
+
+This document describes various features of Sun's Solaris operating system
+that will affect how Perl version 5 (hereafter just perl) is
+compiled and/or runs. Some issues relating to the older SunOS 4.x are
+also discussed, though they may be out of date.
+
+For the most part, everything should just work.
+
+Starting with Solaris 8, perl5.00503 (or higher) is supplied with the
+operating system, so you might not even need to build a newer version
+of perl at all. The Sun-supplied version is installed in /usr/perl5
+with /usr/bin/perl pointing to /usr/perl5/bin/perl. Do not disturb
+that installation unless you really know what you are doing. If you
+remove the perl supplied with the OS, you will render some bits of
+your system inoperable. If you wish to install a newer version of perl,
+install it under a different prefix from /usr/perl5. Common prefixes
+to use are /usr/local and /opt/perl.
+
+You may wish to put your version of perl in the PATH of all users by
+changing the link /usr/bin/perl. This is probably OK, as most perl
+scripts shipped with Solaris use an explicit path. (There are a few
+exceptions, such as /usr/bin/rpm2cpio and /etc/rcm/scripts/README, but
+these are also sufficiently generic that the actual version of perl
+probably doesn't matter too much.)
+
+Solaris ships with a range of Solaris-specific modules. If you choose
+to install your own version of perl you will find the source of many of
+these modules is available on CPAN under the Sun::Solaris:: namespace.
+
+Solaris may include two versions of perl, e.g. Solaris 9 includes
+both 5.005_03 and 5.6.1. This is to provide stability across Solaris
+releases, in cases where a later perl version has incompatibilities
+with the version included in the preceeding Solaris release. The
+default perl version will always be the most recent, and in general
+the old version will only be retained for one Solaris release. Note
+also that the default perl will NOT be configured to search for modules
+in the older version, again due to compatibility/stability concerns.
+As a consequence if you upgrade Solaris, you will have to
+rebuild/reinstall any additional CPAN modules that you installed for
+the previous Solaris version. See the CPAN manpage under 'autobundle'
+for a quick way of doing this.
+
+As an interim measure, you may either change the #! line of your
+scripts to specifically refer to the old perl version, e.g. on
+Solaris 9 use #!/usr/perl5/5.00503/bin/perl to use the perl version
+that was the default for Solaris 8, or if you have a large number of
+scripts it may be more convenient to make the old version of perl the
+default on your system. You can do this by changing the appropriate
+symlinks under /usr/perl5 as follows (example for Solaris 9):
+
+ # cd /usr/perl5
+ # rm bin man pod
+ # ln -s ./5.00503/bin
+ # ln -s ./5.00503/man
+ # ln -s ./5.00503/lib/pod
+ # rm /usr/bin/perl
+ # ln -s ../perl5/5.00503/bin/perl /usr/bin/perl
+
+In both cases this should only be considered to be a temporary
+measure - you should upgrade to the later version of perl as soon as
+is practicable.
+
+Note also that the perl command-line utilities (e.g. perldoc) and any
+that are added by modules that you install will be under
+/usr/perl5/bin, so that directory should be added to your PATH.
+
+=head2 Solaris Version Numbers.
+
+For consistency with common usage, perl's Configure script performs
+some minor manipulations on the operating system name and version
+number as reported by uname. Here's a partial translation table:
+
+ Sun: perl's Configure:
+ uname uname -r Name osname osvers
+ SunOS 4.1.3 Solaris 1.1 sunos 4.1.3
+ SunOS 5.6 Solaris 2.6 solaris 2.6
+ SunOS 5.8 Solaris 8 solaris 2.8
+ SunOS 5.9 Solaris 9 solaris 2.9
+ SunOS 5.10 Solaris 10 solaris 2.10
+
+The complete table can be found in the Sun Managers' FAQ
+L<ftp://ftp.cs.toronto.edu/pub/jdd/sunmanagers/faq> under
+"9.1) Which Sun models run which versions of SunOS?".
+
+=head1 RESOURCES
+
+There are many, many sources for Solaris information. A few of the
+important ones for perl:
+
+=over 4
+
+=item Solaris FAQ
+
+The Solaris FAQ is available at
+L<http://www.science.uva.nl/pub/solaris/solaris2.html>.
+
+The Sun Managers' FAQ is available at
+L<ftp://ftp.cs.toronto.edu/pub/jdd/sunmanagers/faq>
+
+=item Precompiled Binaries
+
+Precompiled binaries, links to many sites, and much, much more are
+available at L<http://www.sunfreeware.com/> and
+L<http://www.blastwave.org/>.
+
+=item Solaris Documentation
+
+All Solaris documentation is available on-line at L<http://docs.sun.com/>.
+
+=back
+
+=head1 SETTING UP
+
+=head2 File Extraction Problems on Solaris.
+
+Be sure to use a tar program compiled under Solaris (not SunOS 4.x)
+to extract the perl-5.x.x.tar.gz file. Do not use GNU tar compiled
+for SunOS4 on Solaris. (GNU tar compiled for Solaris should be fine.)
+When you run SunOS4 binaries on Solaris, the run-time system magically
+alters pathnames matching m#lib/locale# so that when tar tries to create
+lib/locale.pm, a file named lib/oldlocale.pm gets created instead.
+If you found this advice too late and used a SunOS4-compiled tar
+anyway, you must find the incorrectly renamed file and move it back
+to lib/locale.pm.
+
+=head2 Compiler and Related Tools on Solaris.
+
+You must use an ANSI C compiler to build perl. Perl can be compiled
+with either Sun's add-on C compiler or with gcc. The C compiler that
+shipped with SunOS4 will not do.
+
+=head3 Include /usr/ccs/bin/ in your PATH.
+
+Several tools needed to build perl are located in /usr/ccs/bin/: ar,
+as, ld, and make. Make sure that /usr/ccs/bin/ is in your PATH.
+
+You need to make sure the following packages are installed
+(this info is extracted from the Solaris FAQ):
+
+for tools (sccs, lex, yacc, make, nm, truss, ld, as): SUNWbtool,
+SUNWsprot, SUNWtoo
+
+for libraries & headers: SUNWhea, SUNWarc, SUNWlibm, SUNWlibms, SUNWdfbh,
+SUNWcg6h, SUNWxwinc, SUNWolinc
+
+for 64 bit development: SUNWarcx, SUNWbtoox, SUNWdplx, SUNWscpux,
+SUNWsprox, SUNWtoox, SUNWlmsx, SUNWlmx, SUNWlibCx
+
+If you are in doubt which package contains a file you are missing,
+try to find an installation that has that file. Then do a
+
+ $ grep /my/missing/file /var/sadm/install/contents
+
+This will display a line like this:
+
+/usr/include/sys/errno.h f none 0644 root bin 7471 37605 956241356 SUNWhea
+
+The last item listed (SUNWhea in this example) is the package you need.
+
+=head3 Avoid /usr/ucb/cc.
+
+You don't need to have /usr/ucb/ in your PATH to build perl. If you
+want /usr/ucb/ in your PATH anyway, make sure that /usr/ucb/ is NOT
+in your PATH before the directory containing the right C compiler.
+
+=head3 Sun's C Compiler
+
+If you use Sun's C compiler, make sure the correct directory
+(usually /opt/SUNWspro/bin/) is in your PATH (before /usr/ucb/).
+
+=head3 GCC
+
+If you use gcc, make sure your installation is recent and complete.
+perl versions since 5.6.0 build fine with gcc > 2.8.1 on Solaris >=
+2.6.
+
+You must Configure perl with
+
+ $ sh Configure -Dcc=gcc
+
+If you don't, you may experience strange build errors.
+
+If you have updated your Solaris version, you may also have to update
+your gcc. For example, if you are running Solaris 2.6 and your gcc is
+installed under /usr/local, check in /usr/local/lib/gcc-lib and make
+sure you have the appropriate directory, sparc-sun-solaris2.6/ or
+i386-pc-solaris2.6/. If gcc's directory is for a different version of
+Solaris than you are running, then you will need to rebuild gcc for
+your new version of Solaris.
+
+You can get a precompiled version of gcc from
+L<http://www.sunfreeware.com/> or L<http://www.blastwave.org/>. Make
+sure you pick up the package for your Solaris release.
+
+If you wish to use gcc to build add-on modules for use with the perl
+shipped with Solaris, you should use the Solaris::PerlGcc module
+which is available from CPAN. The perl shipped with Solaris
+is configured and built with the Sun compilers, and the compiler
+configuration information stored in Config.pm is therefore only
+relevant to the Sun compilers. The Solaris:PerlGcc module contains a
+replacement Config.pm that is correct for gcc - see the module for
+details.
+
+=head3 GNU as and GNU ld
+
+The following information applies to gcc version 2. Volunteers to
+update it as appropropriate for gcc version 3 would be appreciated.
+
+The versions of as and ld supplied with Solaris work fine for building
+perl. There is normally no need to install the GNU versions to
+compile perl.
+
+If you decide to ignore this advice and use the GNU versions anyway,
+then be sure that they are relatively recent. Versions newer than 2.7
+are apparently new enough. Older versions may have trouble with
+dynamic loading.
+
+If you wish to use GNU ld, then you need to pass it the -Wl,-E flag.
+The hints/solaris_2.sh file tries to do this automatically by setting
+the following Configure variables:
+
+ ccdlflags="$ccdlflags -Wl,-E"
+ lddlflags="$lddlflags -Wl,-E -G"
+
+However, over the years, changes in gcc, GNU ld, and Solaris ld have made
+it difficult to automatically detect which ld ultimately gets called.
+You may have to manually edit config.sh and add the -Wl,-E flags
+yourself, or else run Configure interactively and add the flags at the
+appropriate prompts.
+
+If your gcc is configured to use GNU as and ld but you want to use the
+Solaris ones instead to build perl, then you'll need to add
+-B/usr/ccs/bin/ to the gcc command line. One convenient way to do
+that is with
+
+ $ sh Configure -Dcc='gcc -B/usr/ccs/bin/'
+
+Note that the trailing slash is required. This will result in some
+harmless warnings as Configure is run:
+
+ gcc: file path prefix `/usr/ccs/bin/' never used
+
+These messages may safely be ignored.
+(Note that for a SunOS4 system, you must use -B/bin/ instead.)
+
+Alternatively, you can use the GCC_EXEC_PREFIX environment variable to
+ensure that Sun's as and ld are used. Consult your gcc documentation
+for further information on the -B option and the GCC_EXEC_PREFIX variable.
+
+=head3 Sun and GNU make
+
+The make under /usr/ccs/bin works fine for building perl. If you
+have the Sun C compilers, you will also have a parallel version of
+make (dmake). This works fine to build perl, but can sometimes cause
+problems when running 'make test' due to underspecified dependencies
+between the different test harness files. The same problem can also
+affect the building of some add-on modules, so in those cases either
+specify '-m serial' on the dmake command line, or use
+/usr/ccs/bin/make instead. If you wish to use GNU make, be sure that
+the set-group-id bit is not set. If it is, then arrange your PATH so
+that /usr/ccs/bin/make is before GNU make or else have the system
+administrator disable the set-group-id bit on GNU make.
+
+=head3 Avoid libucb.
+
+Solaris provides some BSD-compatibility functions in /usr/ucblib/libucb.a.
+Perl will not build and run correctly if linked against -lucb since it
+contains routines that are incompatible with the standard Solaris libc.
+Normally this is not a problem since the solaris hints file prevents
+Configure from even looking in /usr/ucblib for libraries, and also
+explicitly omits -lucb.
+
+=head2 Environment for Compiling perl on Solaris
+
+=head3 PATH
+
+Make sure your PATH includes the compiler (/opt/SUNWspro/bin/ if you're
+using Sun's compiler) as well as /usr/ccs/bin/ to pick up the other
+development tools (such as make, ar, as, and ld). Make sure your path
+either doesn't include /usr/ucb or that it includes it after the
+compiler and compiler tools and other standard Solaris directories.
+You definitely don't want /usr/ucb/cc.
+
+=head3 LD_LIBRARY_PATH
+
+If you have the LD_LIBRARY_PATH environment variable set, be sure that
+it does NOT include /lib or /usr/lib. If you will be building
+extensions that call third-party shared libraries (e.g. Berkeley DB)
+then make sure that your LD_LIBRARY_PATH environment variable includes
+the directory with that library (e.g. /usr/local/lib).
+
+If you get an error message
+
+ dlopen: stub interception failed
+
+it is probably because your LD_LIBRARY_PATH environment variable
+includes a directory which is a symlink to /usr/lib (such as /lib).
+The reason this causes a problem is quite subtle. The file
+libdl.so.1.0 actually *only* contains functions which generate 'stub
+interception failed' errors! The runtime linker intercepts links to
+"/usr/lib/libdl.so.1.0" and links in internal implementations of those
+functions instead. [Thanks to Tim Bunce for this explanation.]
+
+=head1 RUN CONFIGURE.
+
+See the INSTALL file for general information regarding Configure.
+Only Solaris-specific issues are discussed here. Usually, the
+defaults should be fine.
+
+=head2 64-bit perl on Solaris.
+
+See the INSTALL file for general information regarding 64-bit compiles.
+In general, the defaults should be fine for most people.
+
+By default, perl-5.6.0 (or later) is compiled as a 32-bit application
+with largefile and long-long support.
+
+=head3 General 32-bit vs. 64-bit issues.
+
+Solaris 7 and above will run in either 32 bit or 64 bit mode on SPARC
+CPUs, via a reboot. You can build 64 bit apps whilst running 32 bit
+mode and vice-versa. 32 bit apps will run under Solaris running in
+either 32 or 64 bit mode. 64 bit apps require Solaris to be running
+64 bit mode.
+
+Existing 32 bit apps are properly known as LP32, i.e. Longs and
+Pointers are 32 bit. 64-bit apps are more properly known as LP64.
+The discriminating feature of a LP64 bit app is its ability to utilise a
+64-bit address space. It is perfectly possible to have a LP32 bit app
+that supports both 64-bit integers (long long) and largefiles (> 2GB),
+and this is the default for perl-5.6.0.
+
+For a more complete explanation of 64-bit issues, see the
+"Solaris 64-bit Developer's Guide" at L<http://docs.sun.com/>
+
+You can detect the OS mode using "isainfo -v", e.g.
+
+ $ isainfo -v # Ultra 30 in 64 bit mode
+ 64-bit sparcv9 applications
+ 32-bit sparc applications
+
+By default, perl will be compiled as a 32-bit application. Unless
+you want to allocate more than ~ 4GB of memory inside perl, or unless
+you need more than 255 open file descriptors, you probably don't need
+perl to be a 64-bit app.
+
+=head3 Large File Support
+
+For Solaris 2.6 and onwards, there are two different ways for 32-bit
+applications to manipulate large files (files whose size is > 2GByte).
+(A 64-bit application automatically has largefile support built in
+by default.)
+
+First is the "transitional compilation environment", described in
+lfcompile64(5). According to the man page,
+
+ The transitional compilation environment exports all the
+ explicit 64-bit functions (xxx64()) and types in addition to
+ all the regular functions (xxx()) and types. Both xxx() and
+ xxx64() functions are available to the program source. A
+ 32-bit application must use the xxx64() functions in order
+ to access large files. See the lf64(5) manual page for a
+ complete listing of the 64-bit transitional interfaces.
+
+The transitional compilation environment is obtained with the
+following compiler and linker flags:
+
+ getconf LFS64_CFLAGS -D_LARGEFILE64_SOURCE
+ getconf LFS64_LDFLAG # nothing special needed
+ getconf LFS64_LIBS # nothing special needed
+
+Second is the "large file compilation environment", described in
+lfcompile(5). According to the man page,
+
+ Each interface named xxx() that needs to access 64-bit entities
+ to access large files maps to a xxx64() call in the
+ resulting binary. All relevant data types are defined to be
+ of correct size (for example, off_t has a typedef definition
+ for a 64-bit entity).
+
+ An application compiled in this environment is able to use
+ the xxx() source interfaces to access both large and small
+ files, rather than having to explicitly utilize the transitional
+ xxx64() interface calls to access large files.
+
+Two exceptions are fseek() and ftell(). 32-bit applications should
+use fseeko(3C) and ftello(3C). These will get automatically mapped
+to fseeko64() and ftello64().
+
+The large file compilation environment is obtained with
+
+ getconf LFS_CFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
+ getconf LFS_LDFLAGS # nothing special needed
+ getconf LFS_LIBS # nothing special needed
+
+By default, perl uses the large file compilation environment and
+relies on Solaris to do the underlying mapping of interfaces.
+
+=head3 Building an LP64 perl
+
+To compile a 64-bit application on an UltraSparc with a recent Sun Compiler,
+you need to use the flag "-xarch=v9". getconf(1) will tell you this, e.g.
+
+ $ getconf -a | grep v9
+ XBS5_LP64_OFF64_CFLAGS: -xarch=v9
+ XBS5_LP64_OFF64_LDFLAGS: -xarch=v9
+ XBS5_LP64_OFF64_LINTFLAGS: -xarch=v9
+ XBS5_LPBIG_OFFBIG_CFLAGS: -xarch=v9
+ XBS5_LPBIG_OFFBIG_LDFLAGS: -xarch=v9
+ XBS5_LPBIG_OFFBIG_LINTFLAGS: -xarch=v9
+ _XBS5_LP64_OFF64_CFLAGS: -xarch=v9
+ _XBS5_LP64_OFF64_LDFLAGS: -xarch=v9
+ _XBS5_LP64_OFF64_LINTFLAGS: -xarch=v9
+ _XBS5_LPBIG_OFFBIG_CFLAGS: -xarch=v9
+ _XBS5_LPBIG_OFFBIG_LDFLAGS: -xarch=v9
+ _XBS5_LPBIG_OFFBIG_LINTFLAGS: -xarch=v9
+
+This flag is supported in Sun WorkShop Compilers 5.0 and onwards
+(now marketed under the name Forte) when used on Solaris 7 or later on
+UltraSparc systems.
+
+If you are using gcc, you would need to use -mcpu=v9 -m64 instead. This
+option is not yet supported as of gcc 2.95.2; from install/SPECIFIC
+in that release:
+
+ GCC version 2.95 is not able to compile code correctly for sparc64
+ targets. Users of the Linux kernel, at least, can use the sparc32
+ program to start up a new shell invocation with an environment that
+ causes configure to recognize (via uname -a) the system as sparc-*-*
+ instead.
+
+All this should be handled automatically by the hints file, if
+requested.
+
+=head3 Long Doubles.
+
+As of 5.8.1, long doubles are working if you use the Sun compilers
+(needed for additional math routines not included in libm).
+
+=head2 Threads in perl on Solaris.
+
+It is possible to build a threaded version of perl on Solaris. The entire
+perl thread implementation is still experimental, however, so beware.
+
+=head2 Malloc Issues with perl on Solaris.
+
+Starting from perl 5.7.1 perl uses the Solaris malloc, since the perl
+malloc breaks when dealing with more than 2GB of memory, and the Solaris
+malloc also seems to be faster.
+
+If you for some reason (such as binary backward compatibility) really
+need to use perl's malloc, you can rebuild perl from the sources
+and Configure the build with
+
+ $ sh Configure -Dusemymalloc
+
+You should not use perl's malloc if you are building with gcc. There
+are reports of core dumps, especially in the PDL module. The problem
+appears to go away under -DDEBUGGING, so it has been difficult to
+track down. Sun's compiler appears to be okay with or without perl's
+malloc. [XXX further investigation is needed here.]
+
+=head1 MAKE PROBLEMS.
+
+=over 4
+
+=item Dynamic Loading Problems With GNU as and GNU ld
+
+If you have problems with dynamic loading using gcc on SunOS or
+Solaris, and you are using GNU as and GNU ld, see the section
+L<"GNU as and GNU ld"> above.
+
+=item ld.so.1: ./perl: fatal: relocation error:
+
+If you get this message on SunOS or Solaris, and you're using gcc,
+it's probably the GNU as or GNU ld problem in the previous item
+L<"GNU as and GNU ld">.
+
+=item dlopen: stub interception failed
+
+The primary cause of the 'dlopen: stub interception failed' message is
+that the LD_LIBRARY_PATH environment variable includes a directory
+which is a symlink to /usr/lib (such as /lib). See
+L<"LD_LIBRARY_PATH"> above.
+
+=item #error "No DATAMODEL_NATIVE specified"
+
+This is a common error when trying to build perl on Solaris 2.6 with a
+gcc installation from Solaris 2.5 or 2.5.1. The Solaris header files
+changed, so you need to update your gcc installation. You can either
+rerun the fixincludes script from gcc or take the opportunity to
+update your gcc installation.
+
+=item sh: ar: not found
+
+This is a message from your shell telling you that the command 'ar'
+was not found. You need to check your PATH environment variable to
+make sure that it includes the directory with the 'ar' command. This
+is a common problem on Solaris, where 'ar' is in the /usr/ccs/bin/
+directory.
+
+=back
+
+=head1 MAKE TEST
+
+=head2 op/stat.t test 4 in Solaris
+
+op/stat.t test 4 may fail if you are on a tmpfs of some sort.
+Building in /tmp sometimes shows this behavior. The
+test suite detects if you are building in /tmp, but it may not be able
+to catch all tmpfs situations.
+
+=head2 nss_delete core dump from op/pwent or op/grent
+
+See L<perlhpux/"nss_delete core dump from op/pwent or op/grent">.
+
+=head1 PREBUILT BINARIES OF PERL FOR SOLARIS.
+
+You can pick up prebuilt binaries for Solaris from
+L<http://www.sunfreeware.com/>, L<http://www.blastwave.org>,
+ActiveState L<http://www.activestate.com/>, and
+L<http://www.perl.com/> under the Binaries list at the top of the
+page. There are probably other sources as well. Please note that
+these sites are under the control of their respective owners, not the
+perl developers.
+
+=head1 RUNTIME ISSUES FOR PERL ON SOLARIS.
+
+=head2 Limits on Numbers of Open Files on Solaris.
+
+The stdio(3C) manpage notes that for LP32 applications, only 255
+files may be opened using fopen(), and only file descriptors 0
+through 255 can be used in a stream. Since perl calls open() and
+then fdopen(3C) with the resulting file descriptor, perl is limited
+to 255 simultaneous open files, even if sysopen() is used. If this
+proves to be an insurmountable problem, you can compile perl as a
+LP64 application, see L<Building an LP64 perl> for details. Note
+also that the default resource limit for open file descriptors on
+Solaris is 255, so you will have to modify your ulimit or rctl
+(Solaris 9 onwards) appropriately.
+
+=head1 SOLARIS-SPECIFIC MODULES.
+
+See the modules under the Solaris:: and Sun::Solaris namespaces on CPAN,
+see L<http://www.cpan.org/modules/by-module/Solaris/> and
+L<http://www.cpan.org/modules/by-module/Sun/>.
+
+=head1 SOLARIS-SPECIFIC PROBLEMS WITH MODULES.
+
+=head2 Proc::ProcessTable on Solaris
+
+Proc::ProcessTable does not compile on Solaris with perl5.6.0 and higher
+if you have LARGEFILES defined. Since largefile support is the
+default in 5.6.0 and later, you have to take special steps to use this
+module.
+
+The problem is that various structures visible via procfs use off_t,
+and if you compile with largefile support these change from 32 bits to
+64 bits. Thus what you get back from procfs doesn't match up with
+the structures in perl, resulting in garbage. See proc(4) for further
+discussion.
+
+A fix for Proc::ProcessTable is to edit Makefile to
+explicitly remove the largefile flags from the ones MakeMaker picks up
+from Config.pm. This will result in Proc::ProcessTable being built
+under the correct environment. Everything should then be OK as long as
+Proc::ProcessTable doesn't try to share off_t's with the rest of perl,
+or if it does they should be explicitly specified as off64_t.
+
+=head2 BSD::Resource on Solaris
+
+BSD::Resource versions earlier than 1.09 do not compile on Solaris
+with perl 5.6.0 and higher, for the same reasons as Proc::ProcessTable.
+BSD::Resource versions starting from 1.09 have a workaround for the problem.
+
+=head2 Net::SSLeay on Solaris
+
+Net::SSLeay requires a /dev/urandom to be present. This device is
+available from Solaris 9 onwards. For earlier Solaris versions you
+can either get the package SUNWski (packaged with several Sun
+software products, for example the Sun WebServer, which is part of
+the Solaris Server Intranet Extension, or the Sun Directory Services,
+part of Solaris for ISPs) or download the ANDIrand package from
+L<http://www.cosy.sbg.ac.at/~andi/>. If you use SUNWski, make a
+symbolic link /dev/urandom pointing to /dev/random. For more details,
+see Document ID27606 entitled "Differing /dev/random support requirements
+within Solaris[TM] Operating Environments", available at
+http://sunsolve.sun.com .
+
+It may be possible to use the Entropy Gathering Daemon (written in
+Perl!), available from L<http://www.lothar.com/tech/crypto/>.
+
+=head1 SunOS 4.x
+
+In SunOS 4.x you most probably want to use the SunOS ld, /usr/bin/ld,
+since the more recent versions of GNU ld (like 2.13) do not seem to
+work for building Perl anymore. When linking the extensions, the
+GNU ld gets very unhappy and spews a lot of errors like this
+
+ ... relocation truncated to fit: BASE13 ...
+
+and dies. Therefore the SunOS 4.1 hints file explicitly sets the
+ld to be /usr/bin/ld.
+
+As of Perl 5.8.1 the dynamic loading of libraries (DynaLoader, XSLoader)
+also seems to have become broken in in SunOS 4.x. Therefore the default
+is to build Perl statically.
+
+Running the test suite in SunOS 4.1 is a bit tricky since the
+F<lib/Tie/File/t/09_gen_rs> test hangs (subtest #51, FWIW) for some
+unknown reason. Just stop the test and kill that particular Perl
+process.
+
+There are various other failures, that as of SunOS 4.1.4 and gcc 3.2.2
+look a lot like gcc bugs. Many of the failures happen in the Encode
+tests, where for example when the test expects "0" you get "&#48;"
+which should after a little squinting look very odd indeed.
+Another example is earlier in F<t/run/fresh_perl> where chr(0xff) is
+expected but the test fails because the result is chr(0xff). Exactly.
+
+This is the "make test" result from the said combination:
+
+ Failed 27 test scripts out of 745, 96.38% okay.
+
+Running the C<harness> is painful because of the many failing
+Unicode-related tests will output megabytes of failure messages,
+but if one patiently waits, one gets these results:
+
+ Failed Test Stat Wstat Total Fail Failed List of Failed
+ -----------------------------------------------------------------------------
+ ...
+ ../ext/Encode/t/at-cn.t 4 1024 29 4 13.79% 14-17
+ ../ext/Encode/t/at-tw.t 10 2560 17 10 58.82% 2 4 6 8 10 12
+ 14-17
+ ../ext/Encode/t/enc_data.t 29 7424 ?? ?? % ??
+ ../ext/Encode/t/enc_eucjp.t 29 7424 ?? ?? % ??
+ ../ext/Encode/t/enc_module.t 29 7424 ?? ?? % ??
+ ../ext/Encode/t/encoding.t 29 7424 ?? ?? % ??
+ ../ext/Encode/t/grow.t 12 3072 24 12 50.00% 2 4 6 8 10 12 14
+ 16 18 20 22 24
+ Failed Test Stat Wstat Total Fail Failed List of Failed
+ ------------------------------------------------------------------------------
+ ../ext/Encode/t/guess.t 255 65280 29 40 137.93% 10-29
+ ../ext/Encode/t/jperl.t 29 7424 15 30 200.00% 1-15
+ ../ext/Encode/t/mime-header.t 2 512 10 2 20.00% 2-3
+ ../ext/Encode/t/perlio.t 22 5632 38 22 57.89% 1-4 9-16 19-20
+ 23-24 27-32
+ ../ext/List/Util/t/shuffle.t 0 139 ?? ?? % ??
+ ../ext/PerlIO/t/encoding.t 14 1 7.14% 11
+ ../ext/PerlIO/t/fallback.t 9 2 22.22% 3 5
+ ../ext/Socket/t/socketpair.t 0 2 45 70 155.56% 11-45
+ ../lib/CPAN/t/vcmp.t 30 1 3.33% 25
+ ../lib/Tie/File/t/09_gen_rs.t 0 15 ?? ?? % ??
+ ../lib/Unicode/Collate/t/test.t 199 30 15.08% 7 26-27 71-75
+ 81-88 95 101
+ 103-104 106 108-
+ 109 122 124 161
+ 169-172
+ ../lib/sort.t 0 139 119 26 21.85% 107-119
+ op/alarm.t 4 1 25.00% 4
+ op/utfhash.t 97 1 1.03% 31
+ run/fresh_perl.t 91 1 1.10% 32
+ uni/tr_7jis.t ?? ?? % ??
+ uni/tr_eucjp.t 29 7424 6 12 200.00% 1-6
+ uni/tr_sjis.t 29 7424 6 12 200.00% 1-6
+ 56 tests and 467 subtests skipped.
+ Failed 27/811 test scripts, 96.67% okay. 1383/75399 subtests failed, 98.17% okay.
+
+The alarm() test failure is caused by system() apparently blocking
+alarm(). That is probably a libc bug, and given that SunOS 4.x
+has been end-of-lifed years ago, don't hold your breath for a fix.
+In addition to that, don't try anything too Unicode-y, especially
+with Encode, and you should be fine in SunOS 4.x.
+
+=head1 AUTHOR
+
+The original was written by Andy Dougherty F<doughera@lafayette.edu>
+drawing heavily on advice from Alan Burlison, Nick Ing-Simmons, Tim Bunce,
+and many other Solaris users over the years.
+
+Please report any errors, updates, or suggestions to F<perlbug@perl.org>.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlstyle.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlstyle.pod
new file mode 100755
index 00000000000..37dfaaf1413
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlstyle.pod
@@ -0,0 +1,303 @@
+=head1 NAME
+
+perlstyle - Perl style guide
+
+=head1 DESCRIPTION
+
+Each programmer will, of course, have his or her own preferences in
+regards to formatting, but there are some general guidelines that will
+make your programs easier to read, understand, and maintain.
+
+The most important thing is to run your programs under the B<-w>
+flag at all times. You may turn it off explicitly for particular
+portions of code via the C<no warnings> pragma or the C<$^W> variable
+if you must. You should also always run under C<use strict> or know the
+reason why not. The C<use sigtrap> and even C<use diagnostics> pragmas
+may also prove useful.
+
+Regarding aesthetics of code lay out, about the only thing Larry
+cares strongly about is that the closing curly bracket of
+a multi-line BLOCK should line up with the keyword that started the construct.
+Beyond that, he has other preferences that aren't so strong:
+
+=over 4
+
+=item *
+
+4-column indent.
+
+=item *
+
+Opening curly on same line as keyword, if possible, otherwise line up.
+
+=item *
+
+Space before the opening curly of a multi-line BLOCK.
+
+=item *
+
+One-line BLOCK may be put on one line, including curlies.
+
+=item *
+
+No space before the semicolon.
+
+=item *
+
+Semicolon omitted in "short" one-line BLOCK.
+
+=item *
+
+Space around most operators.
+
+=item *
+
+Space around a "complex" subscript (inside brackets).
+
+=item *
+
+Blank lines between chunks that do different things.
+
+=item *
+
+Uncuddled elses.
+
+=item *
+
+No space between function name and its opening parenthesis.
+
+=item *
+
+Space after each comma.
+
+=item *
+
+Long lines broken after an operator (except C<and> and C<or>).
+
+=item *
+
+Space after last parenthesis matching on current line.
+
+=item *
+
+Line up corresponding items vertically.
+
+=item *
+
+Omit redundant punctuation as long as clarity doesn't suffer.
+
+=back
+
+Larry has his reasons for each of these things, but he doesn't claim that
+everyone else's mind works the same as his does.
+
+Here are some other more substantive style issues to think about:
+
+=over 4
+
+=item *
+
+Just because you I<CAN> do something a particular way doesn't mean that
+you I<SHOULD> do it that way. Perl is designed to give you several
+ways to do anything, so consider picking the most readable one. For
+instance
+
+ open(FOO,$foo) || die "Can't open $foo: $!";
+
+is better than
+
+ die "Can't open $foo: $!" unless open(FOO,$foo);
+
+because the second way hides the main point of the statement in a
+modifier. On the other hand
+
+ print "Starting analysis\n" if $verbose;
+
+is better than
+
+ $verbose && print "Starting analysis\n";
+
+because the main point isn't whether the user typed B<-v> or not.
+
+Similarly, just because an operator lets you assume default arguments
+doesn't mean that you have to make use of the defaults. The defaults
+are there for lazy systems programmers writing one-shot programs. If
+you want your program to be readable, consider supplying the argument.
+
+Along the same lines, just because you I<CAN> omit parentheses in many
+places doesn't mean that you ought to:
+
+ return print reverse sort num values %array;
+ return print(reverse(sort num (values(%array))));
+
+When in doubt, parenthesize. At the very least it will let some poor
+schmuck bounce on the % key in B<vi>.
+
+Even if you aren't in doubt, consider the mental welfare of the person
+who has to maintain the code after you, and who will probably put
+parentheses in the wrong place.
+
+=item *
+
+Don't go through silly contortions to exit a loop at the top or the
+bottom, when Perl provides the C<last> operator so you can exit in
+the middle. Just "outdent" it a little to make it more visible:
+
+ LINE:
+ for (;;) {
+ statements;
+ last LINE if $foo;
+ next LINE if /^#/;
+ statements;
+ }
+
+=item *
+
+Don't be afraid to use loop labels--they're there to enhance
+readability as well as to allow multilevel loop breaks. See the
+previous example.
+
+=item *
+
+Avoid using C<grep()> (or C<map()>) or `backticks` in a void context, that is,
+when you just throw away their return values. Those functions all
+have return values, so use them. Otherwise use a C<foreach()> loop or
+the C<system()> function instead.
+
+=item *
+
+For portability, when using features that may not be implemented on
+every machine, test the construct in an eval to see if it fails. If
+you know what version or patchlevel a particular feature was
+implemented, you can test C<$]> (C<$PERL_VERSION> in C<English>) to see if it
+will be there. The C<Config> module will also let you interrogate values
+determined by the B<Configure> program when Perl was installed.
+
+=item *
+
+Choose mnemonic identifiers. If you can't remember what mnemonic means,
+you've got a problem.
+
+=item *
+
+While short identifiers like C<$gotit> are probably ok, use underscores to
+separate words in longer identifiers. It is generally easier to read
+C<$var_names_like_this> than C<$VarNamesLikeThis>, especially for
+non-native speakers of English. It's also a simple rule that works
+consistently with C<VAR_NAMES_LIKE_THIS>.
+
+Package names are sometimes an exception to this rule. Perl informally
+reserves lowercase module names for "pragma" modules like C<integer> and
+C<strict>. Other modules should begin with a capital letter and use mixed
+case, but probably without underscores due to limitations in primitive
+file systems' representations of module names as files that must fit into a
+few sparse bytes.
+
+=item *
+
+You may find it helpful to use letter case to indicate the scope
+or nature of a variable. For example:
+
+ $ALL_CAPS_HERE constants only (beware clashes with perl vars!)
+ $Some_Caps_Here package-wide global/static
+ $no_caps_here function scope my() or local() variables
+
+Function and method names seem to work best as all lowercase.
+E.g., C<$obj-E<gt>as_string()>.
+
+You can use a leading underscore to indicate that a variable or
+function should not be used outside the package that defined it.
+
+=item *
+
+If you have a really hairy regular expression, use the C</x> modifier and
+put in some whitespace to make it look a little less like line noise.
+Don't use slash as a delimiter when your regexp has slashes or backslashes.
+
+=item *
+
+Use the new C<and> and C<or> operators to avoid having to parenthesize
+list operators so much, and to reduce the incidence of punctuation
+operators like C<&&> and C<||>. Call your subroutines as if they were
+functions or list operators to avoid excessive ampersands and parentheses.
+
+=item *
+
+Use here documents instead of repeated C<print()> statements.
+
+=item *
+
+Line up corresponding things vertically, especially if it'd be too long
+to fit on one line anyway.
+
+ $IDX = $ST_MTIME;
+ $IDX = $ST_ATIME if $opt_u;
+ $IDX = $ST_CTIME if $opt_c;
+ $IDX = $ST_SIZE if $opt_s;
+
+ mkdir $tmpdir, 0700 or die "can't mkdir $tmpdir: $!";
+ chdir($tmpdir) or die "can't chdir $tmpdir: $!";
+ mkdir 'tmp', 0777 or die "can't mkdir $tmpdir/tmp: $!";
+
+=item *
+
+Always check the return codes of system calls. Good error messages should
+go to C<STDERR>, include which program caused the problem, what the failed
+system call and arguments were, and (VERY IMPORTANT) should contain the
+standard system error message for what went wrong. Here's a simple but
+sufficient example:
+
+ opendir(D, $dir) or die "can't opendir $dir: $!";
+
+=item *
+
+Line up your transliterations when it makes sense:
+
+ tr [abc]
+ [xyz];
+
+=item *
+
+Think about reusability. Why waste brainpower on a one-shot when you
+might want to do something like it again? Consider generalizing your
+code. Consider writing a module or object class. Consider making your
+code run cleanly with C<use strict> and C<use warnings> (or B<-w>) in
+effect. Consider giving away your code. Consider changing your whole
+world view. Consider... oh, never mind.
+
+=item *
+
+Try to document your code and use Pod formatting in a consistent way. Here
+are commonly expected conventions:
+
+=over 4
+
+=item *
+
+use C<CE<lt>E<gt>> for function, variable and module names (and more
+generally anything that can be considered part of code, like filehandles
+or specific values). Note that function names are considered more readable
+with parentheses after their name, that is C<function()>.
+
+=item *
+
+use C<BE<lt>E<gt>> for commands names like B<cat> or B<grep>.
+
+=item *
+
+use C<FE<lt>E<gt>> or C<CE<lt>E<gt>> for file names. C<FE<lt>E<gt>> should
+be the only Pod code for file names, but as most Pod formatters render it
+as italic, Unix and Windows paths with their slashes and backslashes may
+be less readable, and better rendered with C<CE<lt>E<gt>>.
+
+=back
+
+=item *
+
+Be consistent.
+
+=item *
+
+Be nice.
+
+=back
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlsub.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlsub.pod
new file mode 100755
index 00000000000..74d0b1ac26f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlsub.pod
@@ -0,0 +1,1463 @@
+=head1 NAME
+X<subroutine> X<function>
+
+perlsub - Perl subroutines
+
+=head1 SYNOPSIS
+
+To declare subroutines:
+X<subroutine, declaration> X<sub>
+
+ sub NAME; # A "forward" declaration.
+ sub NAME(PROTO); # ditto, but with prototypes
+ sub NAME : ATTRS; # with attributes
+ sub NAME(PROTO) : ATTRS; # with attributes and prototypes
+
+ sub NAME BLOCK # A declaration and a definition.
+ sub NAME(PROTO) BLOCK # ditto, but with prototypes
+ sub NAME : ATTRS BLOCK # with attributes
+ sub NAME(PROTO) : ATTRS BLOCK # with prototypes and attributes
+
+To define an anonymous subroutine at runtime:
+X<subroutine, anonymous>
+
+ $subref = sub BLOCK; # no proto
+ $subref = sub (PROTO) BLOCK; # with proto
+ $subref = sub : ATTRS BLOCK; # with attributes
+ $subref = sub (PROTO) : ATTRS BLOCK; # with proto and attributes
+
+To import subroutines:
+X<import>
+
+ use MODULE qw(NAME1 NAME2 NAME3);
+
+To call subroutines:
+X<subroutine, call> X<call>
+
+ NAME(LIST); # & is optional with parentheses.
+ NAME LIST; # Parentheses optional if predeclared/imported.
+ &NAME(LIST); # Circumvent prototypes.
+ &NAME; # Makes current @_ visible to called subroutine.
+
+=head1 DESCRIPTION
+
+Like many languages, Perl provides for user-defined subroutines.
+These may be located anywhere in the main program, loaded in from
+other files via the C<do>, C<require>, or C<use> keywords, or
+generated on the fly using C<eval> or anonymous subroutines.
+You can even call a function indirectly using a variable containing
+its name or a CODE reference.
+
+The Perl model for function call and return values is simple: all
+functions are passed as parameters one single flat list of scalars, and
+all functions likewise return to their caller one single flat list of
+scalars. Any arrays or hashes in these call and return lists will
+collapse, losing their identities--but you may always use
+pass-by-reference instead to avoid this. Both call and return lists may
+contain as many or as few scalar elements as you'd like. (Often a
+function without an explicit return statement is called a subroutine, but
+there's really no difference from Perl's perspective.)
+X<subroutine, parameter> X<parameter>
+
+Any arguments passed in show up in the array C<@_>. Therefore, if
+you called a function with two arguments, those would be stored in
+C<$_[0]> and C<$_[1]>. The array C<@_> is a local array, but its
+elements are aliases for the actual scalar parameters. In particular,
+if an element C<$_[0]> is updated, the corresponding argument is
+updated (or an error occurs if it is not updatable). If an argument
+is an array or hash element which did not exist when the function
+was called, that element is created only when (and if) it is modified
+or a reference to it is taken. (Some earlier versions of Perl
+created the element whether or not the element was assigned to.)
+Assigning to the whole array C<@_> removes that aliasing, and does
+not update any arguments.
+X<subroutine, argument> X<argument> X<@_>
+
+A C<return> statement may be used to exit a subroutine, optionally
+specifying the returned value, which will be evaluated in the
+appropriate context (list, scalar, or void) depending on the context of
+the subroutine call. If you specify no return value, the subroutine
+returns an empty list in list context, the undefined value in scalar
+context, or nothing in void context. If you return one or more
+aggregates (arrays and hashes), these will be flattened together into
+one large indistinguishable list.
+
+If no C<return> is found and if the last statement is an expression, its
+value is returned. If the last statement is a loop control structure
+like a C<foreach> or a C<while>, the returned value is unspecified. The
+empty sub returns the empty list.
+X<subroutine, return value> X<return value> X<return>
+
+Perl does not have named formal parameters. In practice all you
+do is assign to a C<my()> list of these. Variables that aren't
+declared to be private are global variables. For gory details
+on creating private variables, see L<"Private Variables via my()">
+and L<"Temporary Values via local()">. To create protected
+environments for a set of functions in a separate package (and
+probably a separate file), see L<perlmod/"Packages">.
+X<formal parameter> X<parameter, formal>
+
+Example:
+
+ sub max {
+ my $max = shift(@_);
+ foreach $foo (@_) {
+ $max = $foo if $max < $foo;
+ }
+ return $max;
+ }
+ $bestday = max($mon,$tue,$wed,$thu,$fri);
+
+Example:
+
+ # get a line, combining continuation lines
+ # that start with whitespace
+
+ sub get_line {
+ $thisline = $lookahead; # global variables!
+ LINE: while (defined($lookahead = <STDIN>)) {
+ if ($lookahead =~ /^[ \t]/) {
+ $thisline .= $lookahead;
+ }
+ else {
+ last LINE;
+ }
+ }
+ return $thisline;
+ }
+
+ $lookahead = <STDIN>; # get first line
+ while (defined($line = get_line())) {
+ ...
+ }
+
+Assigning to a list of private variables to name your arguments:
+
+ sub maybeset {
+ my($key, $value) = @_;
+ $Foo{$key} = $value unless $Foo{$key};
+ }
+
+Because the assignment copies the values, this also has the effect
+of turning call-by-reference into call-by-value. Otherwise a
+function is free to do in-place modifications of C<@_> and change
+its caller's values.
+X<call-by-reference> X<call-by-value>
+
+ upcase_in($v1, $v2); # this changes $v1 and $v2
+ sub upcase_in {
+ for (@_) { tr/a-z/A-Z/ }
+ }
+
+You aren't allowed to modify constants in this way, of course. If an
+argument were actually literal and you tried to change it, you'd take a
+(presumably fatal) exception. For example, this won't work:
+X<call-by-reference> X<call-by-value>
+
+ upcase_in("frederick");
+
+It would be much safer if the C<upcase_in()> function
+were written to return a copy of its parameters instead
+of changing them in place:
+
+ ($v3, $v4) = upcase($v1, $v2); # this doesn't change $v1 and $v2
+ sub upcase {
+ return unless defined wantarray; # void context, do nothing
+ my @parms = @_;
+ for (@parms) { tr/a-z/A-Z/ }
+ return wantarray ? @parms : $parms[0];
+ }
+
+Notice how this (unprototyped) function doesn't care whether it was
+passed real scalars or arrays. Perl sees all arguments as one big,
+long, flat parameter list in C<@_>. This is one area where
+Perl's simple argument-passing style shines. The C<upcase()>
+function would work perfectly well without changing the C<upcase()>
+definition even if we fed it things like this:
+
+ @newlist = upcase(@list1, @list2);
+ @newlist = upcase( split /:/, $var );
+
+Do not, however, be tempted to do this:
+
+ (@a, @b) = upcase(@list1, @list2);
+
+Like the flattened incoming parameter list, the return list is also
+flattened on return. So all you have managed to do here is stored
+everything in C<@a> and made C<@b> empty. See
+L<Pass by Reference> for alternatives.
+
+A subroutine may be called using an explicit C<&> prefix. The
+C<&> is optional in modern Perl, as are parentheses if the
+subroutine has been predeclared. The C<&> is I<not> optional
+when just naming the subroutine, such as when it's used as
+an argument to defined() or undef(). Nor is it optional when you
+want to do an indirect subroutine call with a subroutine name or
+reference using the C<&$subref()> or C<&{$subref}()> constructs,
+although the C<< $subref->() >> notation solves that problem.
+See L<perlref> for more about all that.
+X<&>
+
+Subroutines may be called recursively. If a subroutine is called
+using the C<&> form, the argument list is optional, and if omitted,
+no C<@_> array is set up for the subroutine: the C<@_> array at the
+time of the call is visible to subroutine instead. This is an
+efficiency mechanism that new users may wish to avoid.
+X<recursion>
+
+ &foo(1,2,3); # pass three arguments
+ foo(1,2,3); # the same
+
+ foo(); # pass a null list
+ &foo(); # the same
+
+ &foo; # foo() get current args, like foo(@_) !!
+ foo; # like foo() IFF sub foo predeclared, else "foo"
+
+Not only does the C<&> form make the argument list optional, it also
+disables any prototype checking on arguments you do provide. This
+is partly for historical reasons, and partly for having a convenient way
+to cheat if you know what you're doing. See L<Prototypes> below.
+X<&>
+
+Subroutines whose names are in all upper case are reserved to the Perl
+core, as are modules whose names are in all lower case. A subroutine in
+all capitals is a loosely-held convention meaning it will be called
+indirectly by the run-time system itself, usually due to a triggered event.
+Subroutines that do special, pre-defined things include C<AUTOLOAD>, C<CLONE>,
+C<DESTROY> plus all functions mentioned in L<perltie> and L<PerlIO::via>.
+
+The C<BEGIN>, C<UNITCHECK>, C<CHECK>, C<INIT> and C<END> subroutines
+are not so much subroutines as named special code blocks, of which you
+can have more than one in a package, and which you can B<not> call
+explicitly. See L<perlmod/"BEGIN, UNITCHECK, CHECK, INIT and END">
+
+=head2 Private Variables via my()
+X<my> X<variable, lexical> X<lexical> X<lexical variable> X<scope, lexical>
+X<lexical scope> X<attributes, my>
+
+Synopsis:
+
+ my $foo; # declare $foo lexically local
+ my (@wid, %get); # declare list of variables local
+ my $foo = "flurp"; # declare $foo lexical, and init it
+ my @oof = @bar; # declare @oof lexical, and init it
+ my $x : Foo = $y; # similar, with an attribute applied
+
+B<WARNING>: The use of attribute lists on C<my> declarations is still
+evolving. The current semantics and interface are subject to change.
+See L<attributes> and L<Attribute::Handlers>.
+
+The C<my> operator declares the listed variables to be lexically
+confined to the enclosing block, conditional (C<if/unless/elsif/else>),
+loop (C<for/foreach/while/until/continue>), subroutine, C<eval>,
+or C<do/require/use>'d file. If more than one value is listed, the
+list must be placed in parentheses. All listed elements must be
+legal lvalues. Only alphanumeric identifiers may be lexically
+scoped--magical built-ins like C<$/> must currently be C<local>ized
+with C<local> instead.
+
+Unlike dynamic variables created by the C<local> operator, lexical
+variables declared with C<my> are totally hidden from the outside
+world, including any called subroutines. This is true if it's the
+same subroutine called from itself or elsewhere--every call gets
+its own copy.
+X<local>
+
+This doesn't mean that a C<my> variable declared in a statically
+enclosing lexical scope would be invisible. Only dynamic scopes
+are cut off. For example, the C<bumpx()> function below has access
+to the lexical $x variable because both the C<my> and the C<sub>
+occurred at the same scope, presumably file scope.
+
+ my $x = 10;
+ sub bumpx { $x++ }
+
+An C<eval()>, however, can see lexical variables of the scope it is
+being evaluated in, so long as the names aren't hidden by declarations within
+the C<eval()> itself. See L<perlref>.
+X<eval, scope of>
+
+The parameter list to my() may be assigned to if desired, which allows you
+to initialize your variables. (If no initializer is given for a
+particular variable, it is created with the undefined value.) Commonly
+this is used to name input parameters to a subroutine. Examples:
+
+ $arg = "fred"; # "global" variable
+ $n = cube_root(27);
+ print "$arg thinks the root is $n\n";
+ fred thinks the root is 3
+
+ sub cube_root {
+ my $arg = shift; # name doesn't matter
+ $arg **= 1/3;
+ return $arg;
+ }
+
+The C<my> is simply a modifier on something you might assign to. So when
+you do assign to variables in its argument list, C<my> doesn't
+change whether those variables are viewed as a scalar or an array. So
+
+ my ($foo) = <STDIN>; # WRONG?
+ my @FOO = <STDIN>;
+
+both supply a list context to the right-hand side, while
+
+ my $foo = <STDIN>;
+
+supplies a scalar context. But the following declares only one variable:
+
+ my $foo, $bar = 1; # WRONG
+
+That has the same effect as
+
+ my $foo;
+ $bar = 1;
+
+The declared variable is not introduced (is not visible) until after
+the current statement. Thus,
+
+ my $x = $x;
+
+can be used to initialize a new $x with the value of the old $x, and
+the expression
+
+ my $x = 123 and $x == 123
+
+is false unless the old $x happened to have the value C<123>.
+
+Lexical scopes of control structures are not bounded precisely by the
+braces that delimit their controlled blocks; control expressions are
+part of that scope, too. Thus in the loop
+
+ while (my $line = <>) {
+ $line = lc $line;
+ } continue {
+ print $line;
+ }
+
+the scope of $line extends from its declaration throughout the rest of
+the loop construct (including the C<continue> clause), but not beyond
+it. Similarly, in the conditional
+
+ if ((my $answer = <STDIN>) =~ /^yes$/i) {
+ user_agrees();
+ } elsif ($answer =~ /^no$/i) {
+ user_disagrees();
+ } else {
+ chomp $answer;
+ die "'$answer' is neither 'yes' nor 'no'";
+ }
+
+the scope of $answer extends from its declaration through the rest
+of that conditional, including any C<elsif> and C<else> clauses,
+but not beyond it. See L<perlsyn/"Simple statements"> for information
+on the scope of variables in statements with modifiers.
+
+The C<foreach> loop defaults to scoping its index variable dynamically
+in the manner of C<local>. However, if the index variable is
+prefixed with the keyword C<my>, or if there is already a lexical
+by that name in scope, then a new lexical is created instead. Thus
+in the loop
+X<foreach> X<for>
+
+ for my $i (1, 2, 3) {
+ some_function();
+ }
+
+the scope of $i extends to the end of the loop, but not beyond it,
+rendering the value of $i inaccessible within C<some_function()>.
+X<foreach> X<for>
+
+Some users may wish to encourage the use of lexically scoped variables.
+As an aid to catching implicit uses to package variables,
+which are always global, if you say
+
+ use strict 'vars';
+
+then any variable mentioned from there to the end of the enclosing
+block must either refer to a lexical variable, be predeclared via
+C<our> or C<use vars>, or else must be fully qualified with the package name.
+A compilation error results otherwise. An inner block may countermand
+this with C<no strict 'vars'>.
+
+A C<my> has both a compile-time and a run-time effect. At compile
+time, the compiler takes notice of it. The principal usefulness
+of this is to quiet C<use strict 'vars'>, but it is also essential
+for generation of closures as detailed in L<perlref>. Actual
+initialization is delayed until run time, though, so it gets executed
+at the appropriate time, such as each time through a loop, for
+example.
+
+Variables declared with C<my> are not part of any package and are therefore
+never fully qualified with the package name. In particular, you're not
+allowed to try to make a package variable (or other global) lexical:
+
+ my $pack::var; # ERROR! Illegal syntax
+
+In fact, a dynamic variable (also known as package or global variables)
+are still accessible using the fully qualified C<::> notation even while a
+lexical of the same name is also visible:
+
+ package main;
+ local $x = 10;
+ my $x = 20;
+ print "$x and $::x\n";
+
+That will print out C<20> and C<10>.
+
+You may declare C<my> variables at the outermost scope of a file
+to hide any such identifiers from the world outside that file. This
+is similar in spirit to C's static variables when they are used at
+the file level. To do this with a subroutine requires the use of
+a closure (an anonymous function that accesses enclosing lexicals).
+If you want to create a private subroutine that cannot be called
+from outside that block, it can declare a lexical variable containing
+an anonymous sub reference:
+
+ my $secret_version = '1.001-beta';
+ my $secret_sub = sub { print $secret_version };
+ &$secret_sub();
+
+As long as the reference is never returned by any function within the
+module, no outside module can see the subroutine, because its name is not in
+any package's symbol table. Remember that it's not I<REALLY> called
+C<$some_pack::secret_version> or anything; it's just $secret_version,
+unqualified and unqualifiable.
+
+This does not work with object methods, however; all object methods
+have to be in the symbol table of some package to be found. See
+L<perlref/"Function Templates"> for something of a work-around to
+this.
+
+=head2 Persistent Private Variables
+X<state> X<state variable> X<static> X<variable, persistent> X<variable, static> X<closure>
+
+There are two ways to build persistent private variables in Perl 5.10.
+First, you can simply use the C<state> feature. Or, you can use closures,
+if you want to stay compatible with releases older than 5.10.
+
+=head3 Persistent variables via state()
+
+Beginning with perl 5.9.4, you can declare variables with the C<state>
+keyword in place of C<my>. For that to work, though, you must have
+enabled that feature beforehand, either by using the C<feature> pragma, or
+by using C<-E> on one-liners. (see L<feature>)
+
+For example, the following code maintains a private counter, incremented
+each time the gimme_another() function is called:
+
+ use feature 'state';
+ sub gimme_another { state $x; return ++$x }
+
+Also, since C<$x> is lexical, it can't be reached or modified by any Perl
+code outside.
+
+When combined with variable declaration, simple scalar assignment to C<state>
+variables (as in C<state $x = 42>) is executed only the first time. When such
+statements are evaluated subsequent times, the assignment is ignored. The
+behavior of this sort of assignment to non-scalar variables is undefined.
+
+=head3 Persistent variables with closures
+
+Just because a lexical variable is lexically (also called statically)
+scoped to its enclosing block, C<eval>, or C<do> FILE, this doesn't mean that
+within a function it works like a C static. It normally works more
+like a C auto, but with implicit garbage collection.
+
+Unlike local variables in C or C++, Perl's lexical variables don't
+necessarily get recycled just because their scope has exited.
+If something more permanent is still aware of the lexical, it will
+stick around. So long as something else references a lexical, that
+lexical won't be freed--which is as it should be. You wouldn't want
+memory being free until you were done using it, or kept around once you
+were done. Automatic garbage collection takes care of this for you.
+
+This means that you can pass back or save away references to lexical
+variables, whereas to return a pointer to a C auto is a grave error.
+It also gives us a way to simulate C's function statics. Here's a
+mechanism for giving a function private variables with both lexical
+scoping and a static lifetime. If you do want to create something like
+C's static variables, just enclose the whole function in an extra block,
+and put the static variable outside the function but in the block.
+
+ {
+ my $secret_val = 0;
+ sub gimme_another {
+ return ++$secret_val;
+ }
+ }
+ # $secret_val now becomes unreachable by the outside
+ # world, but retains its value between calls to gimme_another
+
+If this function is being sourced in from a separate file
+via C<require> or C<use>, then this is probably just fine. If it's
+all in the main program, you'll need to arrange for the C<my>
+to be executed early, either by putting the whole block above
+your main program, or more likely, placing merely a C<BEGIN>
+code block around it to make sure it gets executed before your program
+starts to run:
+
+ BEGIN {
+ my $secret_val = 0;
+ sub gimme_another {
+ return ++$secret_val;
+ }
+ }
+
+See L<perlmod/"BEGIN, UNITCHECK, CHECK, INIT and END"> about the
+special triggered code blocks, C<BEGIN>, C<UNITCHECK>, C<CHECK>,
+C<INIT> and C<END>.
+
+If declared at the outermost scope (the file scope), then lexicals
+work somewhat like C's file statics. They are available to all
+functions in that same file declared below them, but are inaccessible
+from outside that file. This strategy is sometimes used in modules
+to create private variables that the whole module can see.
+
+=head2 Temporary Values via local()
+X<local> X<scope, dynamic> X<dynamic scope> X<variable, local>
+X<variable, temporary>
+
+B<WARNING>: In general, you should be using C<my> instead of C<local>, because
+it's faster and safer. Exceptions to this include the global punctuation
+variables, global filehandles and formats, and direct manipulation of the
+Perl symbol table itself. C<local> is mostly used when the current value
+of a variable must be visible to called subroutines.
+
+Synopsis:
+
+ # localization of values
+
+ local $foo; # make $foo dynamically local
+ local (@wid, %get); # make list of variables local
+ local $foo = "flurp"; # make $foo dynamic, and init it
+ local @oof = @bar; # make @oof dynamic, and init it
+
+ local $hash{key} = "val"; # sets a local value for this hash entry
+ local ($cond ? $v1 : $v2); # several types of lvalues support
+ # localization
+
+ # localization of symbols
+
+ local *FH; # localize $FH, @FH, %FH, &FH ...
+ local *merlyn = *randal; # now $merlyn is really $randal, plus
+ # @merlyn is really @randal, etc
+ local *merlyn = 'randal'; # SAME THING: promote 'randal' to *randal
+ local *merlyn = \$randal; # just alias $merlyn, not @merlyn etc
+
+A C<local> modifies its listed variables to be "local" to the
+enclosing block, C<eval>, or C<do FILE>--and to I<any subroutine
+called from within that block>. A C<local> just gives temporary
+values to global (meaning package) variables. It does I<not> create
+a local variable. This is known as dynamic scoping. Lexical scoping
+is done with C<my>, which works more like C's auto declarations.
+
+Some types of lvalues can be localized as well : hash and array elements
+and slices, conditionals (provided that their result is always
+localizable), and symbolic references. As for simple variables, this
+creates new, dynamically scoped values.
+
+If more than one variable or expression is given to C<local>, they must be
+placed in parentheses. This operator works
+by saving the current values of those variables in its argument list on a
+hidden stack and restoring them upon exiting the block, subroutine, or
+eval. This means that called subroutines can also reference the local
+variable, but not the global one. The argument list may be assigned to if
+desired, which allows you to initialize your local variables. (If no
+initializer is given for a particular variable, it is created with an
+undefined value.)
+
+Because C<local> is a run-time operator, it gets executed each time
+through a loop. Consequently, it's more efficient to localize your
+variables outside the loop.
+
+=head3 Grammatical note on local()
+X<local, context>
+
+A C<local> is simply a modifier on an lvalue expression. When you assign to
+a C<local>ized variable, the C<local> doesn't change whether its list is viewed
+as a scalar or an array. So
+
+ local($foo) = <STDIN>;
+ local @FOO = <STDIN>;
+
+both supply a list context to the right-hand side, while
+
+ local $foo = <STDIN>;
+
+supplies a scalar context.
+
+=head3 Localization of special variables
+X<local, special variable>
+
+If you localize a special variable, you'll be giving a new value to it,
+but its magic won't go away. That means that all side-effects related
+to this magic still work with the localized value.
+
+This feature allows code like this to work :
+
+ # Read the whole contents of FILE in $slurp
+ { local $/ = undef; $slurp = <FILE>; }
+
+Note, however, that this restricts localization of some values ; for
+example, the following statement dies, as of perl 5.9.0, with an error
+I<Modification of a read-only value attempted>, because the $1 variable is
+magical and read-only :
+
+ local $1 = 2;
+
+Similarly, but in a way more difficult to spot, the following snippet will
+die in perl 5.9.0 :
+
+ sub f { local $_ = "foo"; print }
+ for ($1) {
+ # now $_ is aliased to $1, thus is magic and readonly
+ f();
+ }
+
+See next section for an alternative to this situation.
+
+B<WARNING>: Localization of tied arrays and hashes does not currently
+work as described.
+This will be fixed in a future release of Perl; in the meantime, avoid
+code that relies on any particular behaviour of localising tied arrays
+or hashes (localising individual elements is still okay).
+See L<perl58delta/"Localising Tied Arrays and Hashes Is Broken"> for more
+details.
+X<local, tie>
+
+=head3 Localization of globs
+X<local, glob> X<glob>
+
+The construct
+
+ local *name;
+
+creates a whole new symbol table entry for the glob C<name> in the
+current package. That means that all variables in its glob slot ($name,
+@name, %name, &name, and the C<name> filehandle) are dynamically reset.
+
+This implies, among other things, that any magic eventually carried by
+those variables is locally lost. In other words, saying C<local */>
+will not have any effect on the internal value of the input record
+separator.
+
+Notably, if you want to work with a brand new value of the default scalar
+$_, and avoid the potential problem listed above about $_ previously
+carrying a magic value, you should use C<local *_> instead of C<local $_>.
+As of perl 5.9.1, you can also use the lexical form of C<$_> (declaring it
+with C<my $_>), which avoids completely this problem.
+
+=head3 Localization of elements of composite types
+X<local, composite type element> X<local, array element> X<local, hash element>
+
+It's also worth taking a moment to explain what happens when you
+C<local>ize a member of a composite type (i.e. an array or hash element).
+In this case, the element is C<local>ized I<by name>. This means that
+when the scope of the C<local()> ends, the saved value will be
+restored to the hash element whose key was named in the C<local()>, or
+the array element whose index was named in the C<local()>. If that
+element was deleted while the C<local()> was in effect (e.g. by a
+C<delete()> from a hash or a C<shift()> of an array), it will spring
+back into existence, possibly extending an array and filling in the
+skipped elements with C<undef>. For instance, if you say
+
+ %hash = ( 'This' => 'is', 'a' => 'test' );
+ @ary = ( 0..5 );
+ {
+ local($ary[5]) = 6;
+ local($hash{'a'}) = 'drill';
+ while (my $e = pop(@ary)) {
+ print "$e . . .\n";
+ last unless $e > 3;
+ }
+ if (@ary) {
+ $hash{'only a'} = 'test';
+ delete $hash{'a'};
+ }
+ }
+ print join(' ', map { "$_ $hash{$_}" } sort keys %hash),".\n";
+ print "The array has ",scalar(@ary)," elements: ",
+ join(', ', map { defined $_ ? $_ : 'undef' } @ary),"\n";
+
+Perl will print
+
+ 6 . . .
+ 4 . . .
+ 3 . . .
+ This is a test only a test.
+ The array has 6 elements: 0, 1, 2, undef, undef, 5
+
+The behavior of local() on non-existent members of composite
+types is subject to change in future.
+
+=head2 Lvalue subroutines
+X<lvalue> X<subroutine, lvalue>
+
+B<WARNING>: Lvalue subroutines are still experimental and the
+implementation may change in future versions of Perl.
+
+It is possible to return a modifiable value from a subroutine.
+To do this, you have to declare the subroutine to return an lvalue.
+
+ my $val;
+ sub canmod : lvalue {
+ # return $val; this doesn't work, don't say "return"
+ $val;
+ }
+ sub nomod {
+ $val;
+ }
+
+ canmod() = 5; # assigns to $val
+ nomod() = 5; # ERROR
+
+The scalar/list context for the subroutine and for the right-hand
+side of assignment is determined as if the subroutine call is replaced
+by a scalar. For example, consider:
+
+ data(2,3) = get_data(3,4);
+
+Both subroutines here are called in a scalar context, while in:
+
+ (data(2,3)) = get_data(3,4);
+
+and in:
+
+ (data(2),data(3)) = get_data(3,4);
+
+all the subroutines are called in a list context.
+
+=over 4
+
+=item Lvalue subroutines are EXPERIMENTAL
+
+They appear to be convenient, but there are several reasons to be
+circumspect.
+
+You can't use the return keyword, you must pass out the value before
+falling out of subroutine scope. (see comment in example above). This
+is usually not a problem, but it disallows an explicit return out of a
+deeply nested loop, which is sometimes a nice way out.
+
+They violate encapsulation. A normal mutator can check the supplied
+argument before setting the attribute it is protecting, an lvalue
+subroutine never gets that chance. Consider;
+
+ my $some_array_ref = []; # protected by mutators ??
+
+ sub set_arr { # normal mutator
+ my $val = shift;
+ die("expected array, you supplied ", ref $val)
+ unless ref $val eq 'ARRAY';
+ $some_array_ref = $val;
+ }
+ sub set_arr_lv : lvalue { # lvalue mutator
+ $some_array_ref;
+ }
+
+ # set_arr_lv cannot stop this !
+ set_arr_lv() = { a => 1 };
+
+=back
+
+=head2 Passing Symbol Table Entries (typeglobs)
+X<typeglob> X<*>
+
+B<WARNING>: The mechanism described in this section was originally
+the only way to simulate pass-by-reference in older versions of
+Perl. While it still works fine in modern versions, the new reference
+mechanism is generally easier to work with. See below.
+
+Sometimes you don't want to pass the value of an array to a subroutine
+but rather the name of it, so that the subroutine can modify the global
+copy of it rather than working with a local copy. In perl you can
+refer to all objects of a particular name by prefixing the name
+with a star: C<*foo>. This is often known as a "typeglob", because the
+star on the front can be thought of as a wildcard match for all the
+funny prefix characters on variables and subroutines and such.
+
+When evaluated, the typeglob produces a scalar value that represents
+all the objects of that name, including any filehandle, format, or
+subroutine. When assigned to, it causes the name mentioned to refer to
+whatever C<*> value was assigned to it. Example:
+
+ sub doubleary {
+ local(*someary) = @_;
+ foreach $elem (@someary) {
+ $elem *= 2;
+ }
+ }
+ doubleary(*foo);
+ doubleary(*bar);
+
+Scalars are already passed by reference, so you can modify
+scalar arguments without using this mechanism by referring explicitly
+to C<$_[0]> etc. You can modify all the elements of an array by passing
+all the elements as scalars, but you have to use the C<*> mechanism (or
+the equivalent reference mechanism) to C<push>, C<pop>, or change the size of
+an array. It will certainly be faster to pass the typeglob (or reference).
+
+Even if you don't want to modify an array, this mechanism is useful for
+passing multiple arrays in a single LIST, because normally the LIST
+mechanism will merge all the array values so that you can't extract out
+the individual arrays. For more on typeglobs, see
+L<perldata/"Typeglobs and Filehandles">.
+
+=head2 When to Still Use local()
+X<local> X<variable, local>
+
+Despite the existence of C<my>, there are still three places where the
+C<local> operator still shines. In fact, in these three places, you
+I<must> use C<local> instead of C<my>.
+
+=over 4
+
+=item 1.
+
+You need to give a global variable a temporary value, especially $_.
+
+The global variables, like C<@ARGV> or the punctuation variables, must be
+C<local>ized with C<local()>. This block reads in F</etc/motd>, and splits
+it up into chunks separated by lines of equal signs, which are placed
+in C<@Fields>.
+
+ {
+ local @ARGV = ("/etc/motd");
+ local $/ = undef;
+ local $_ = <>;
+ @Fields = split /^\s*=+\s*$/;
+ }
+
+It particular, it's important to C<local>ize $_ in any routine that assigns
+to it. Look out for implicit assignments in C<while> conditionals.
+
+=item 2.
+
+You need to create a local file or directory handle or a local function.
+
+A function that needs a filehandle of its own must use
+C<local()> on a complete typeglob. This can be used to create new symbol
+table entries:
+
+ sub ioqueue {
+ local (*READER, *WRITER); # not my!
+ pipe (READER, WRITER) or die "pipe: $!";
+ return (*READER, *WRITER);
+ }
+ ($head, $tail) = ioqueue();
+
+See the Symbol module for a way to create anonymous symbol table
+entries.
+
+Because assignment of a reference to a typeglob creates an alias, this
+can be used to create what is effectively a local function, or at least,
+a local alias.
+
+ {
+ local *grow = \&shrink; # only until this block exists
+ grow(); # really calls shrink()
+ move(); # if move() grow()s, it shrink()s too
+ }
+ grow(); # get the real grow() again
+
+See L<perlref/"Function Templates"> for more about manipulating
+functions by name in this way.
+
+=item 3.
+
+You want to temporarily change just one element of an array or hash.
+
+You can C<local>ize just one element of an aggregate. Usually this
+is done on dynamics:
+
+ {
+ local $SIG{INT} = 'IGNORE';
+ funct(); # uninterruptible
+ }
+ # interruptibility automatically restored here
+
+But it also works on lexically declared aggregates. Prior to 5.005,
+this operation could on occasion misbehave.
+
+=back
+
+=head2 Pass by Reference
+X<pass by reference> X<pass-by-reference> X<reference>
+
+If you want to pass more than one array or hash into a function--or
+return them from it--and have them maintain their integrity, then
+you're going to have to use an explicit pass-by-reference. Before you
+do that, you need to understand references as detailed in L<perlref>.
+This section may not make much sense to you otherwise.
+
+Here are a few simple examples. First, let's pass in several arrays
+to a function and have it C<pop> all of then, returning a new list
+of all their former last elements:
+
+ @tailings = popmany ( \@a, \@b, \@c, \@d );
+
+ sub popmany {
+ my $aref;
+ my @retlist = ();
+ foreach $aref ( @_ ) {
+ push @retlist, pop @$aref;
+ }
+ return @retlist;
+ }
+
+Here's how you might write a function that returns a
+list of keys occurring in all the hashes passed to it:
+
+ @common = inter( \%foo, \%bar, \%joe );
+ sub inter {
+ my ($k, $href, %seen); # locals
+ foreach $href (@_) {
+ while ( $k = each %$href ) {
+ $seen{$k}++;
+ }
+ }
+ return grep { $seen{$_} == @_ } keys %seen;
+ }
+
+So far, we're using just the normal list return mechanism.
+What happens if you want to pass or return a hash? Well,
+if you're using only one of them, or you don't mind them
+concatenating, then the normal calling convention is ok, although
+a little expensive.
+
+Where people get into trouble is here:
+
+ (@a, @b) = func(@c, @d);
+or
+ (%a, %b) = func(%c, %d);
+
+That syntax simply won't work. It sets just C<@a> or C<%a> and
+clears the C<@b> or C<%b>. Plus the function didn't get passed
+into two separate arrays or hashes: it got one long list in C<@_>,
+as always.
+
+If you can arrange for everyone to deal with this through references, it's
+cleaner code, although not so nice to look at. Here's a function that
+takes two array references as arguments, returning the two array elements
+in order of how many elements they have in them:
+
+ ($aref, $bref) = func(\@c, \@d);
+ print "@$aref has more than @$bref\n";
+ sub func {
+ my ($cref, $dref) = @_;
+ if (@$cref > @$dref) {
+ return ($cref, $dref);
+ } else {
+ return ($dref, $cref);
+ }
+ }
+
+It turns out that you can actually do this also:
+
+ (*a, *b) = func(\@c, \@d);
+ print "@a has more than @b\n";
+ sub func {
+ local (*c, *d) = @_;
+ if (@c > @d) {
+ return (\@c, \@d);
+ } else {
+ return (\@d, \@c);
+ }
+ }
+
+Here we're using the typeglobs to do symbol table aliasing. It's
+a tad subtle, though, and also won't work if you're using C<my>
+variables, because only globals (even in disguise as C<local>s)
+are in the symbol table.
+
+If you're passing around filehandles, you could usually just use the bare
+typeglob, like C<*STDOUT>, but typeglobs references work, too.
+For example:
+
+ splutter(\*STDOUT);
+ sub splutter {
+ my $fh = shift;
+ print $fh "her um well a hmmm\n";
+ }
+
+ $rec = get_rec(\*STDIN);
+ sub get_rec {
+ my $fh = shift;
+ return scalar <$fh>;
+ }
+
+If you're planning on generating new filehandles, you could do this.
+Notice to pass back just the bare *FH, not its reference.
+
+ sub openit {
+ my $path = shift;
+ local *FH;
+ return open (FH, $path) ? *FH : undef;
+ }
+
+=head2 Prototypes
+X<prototype> X<subroutine, prototype>
+
+Perl supports a very limited kind of compile-time argument checking
+using function prototyping. If you declare
+
+ sub mypush (\@@)
+
+then C<mypush()> takes arguments exactly like C<push()> does. The
+function declaration must be visible at compile time. The prototype
+affects only interpretation of new-style calls to the function,
+where new-style is defined as not using the C<&> character. In
+other words, if you call it like a built-in function, then it behaves
+like a built-in function. If you call it like an old-fashioned
+subroutine, then it behaves like an old-fashioned subroutine. It
+naturally falls out from this rule that prototypes have no influence
+on subroutine references like C<\&foo> or on indirect subroutine
+calls like C<&{$subref}> or C<< $subref->() >>.
+
+Method calls are not influenced by prototypes either, because the
+function to be called is indeterminate at compile time, since
+the exact code called depends on inheritance.
+
+Because the intent of this feature is primarily to let you define
+subroutines that work like built-in functions, here are prototypes
+for some other functions that parse almost exactly like the
+corresponding built-in.
+
+ Declared as Called as
+
+ sub mylink ($$) mylink $old, $new
+ sub myvec ($$$) myvec $var, $offset, 1
+ sub myindex ($$;$) myindex &getstring, "substr"
+ sub mysyswrite ($$$;$) mysyswrite $buf, 0, length($buf) - $off, $off
+ sub myreverse (@) myreverse $a, $b, $c
+ sub myjoin ($@) myjoin ":", $a, $b, $c
+ sub mypop (\@) mypop @array
+ sub mysplice (\@$$@) mysplice @array, 0, 2, @pushme
+ sub mykeys (\%) mykeys %{$hashref}
+ sub myopen (*;$) myopen HANDLE, $name
+ sub mypipe (**) mypipe READHANDLE, WRITEHANDLE
+ sub mygrep (&@) mygrep { /foo/ } $a, $b, $c
+ sub myrand (;$) myrand 42
+ sub mytime () mytime
+
+Any backslashed prototype character represents an actual argument
+that absolutely must start with that character. The value passed
+as part of C<@_> will be a reference to the actual argument given
+in the subroutine call, obtained by applying C<\> to that argument.
+
+You can also backslash several argument types simultaneously by using
+the C<\[]> notation:
+
+ sub myref (\[$@%&*])
+
+will allow calling myref() as
+
+ myref $var
+ myref @array
+ myref %hash
+ myref &sub
+ myref *glob
+
+and the first argument of myref() will be a reference to
+a scalar, an array, a hash, a code, or a glob.
+
+Unbackslashed prototype characters have special meanings. Any
+unbackslashed C<@> or C<%> eats all remaining arguments, and forces
+list context. An argument represented by C<$> forces scalar context. An
+C<&> requires an anonymous subroutine, which, if passed as the first
+argument, does not require the C<sub> keyword or a subsequent comma.
+
+A C<*> allows the subroutine to accept a bareword, constant, scalar expression,
+typeglob, or a reference to a typeglob in that slot. The value will be
+available to the subroutine either as a simple scalar, or (in the latter
+two cases) as a reference to the typeglob. If you wish to always convert
+such arguments to a typeglob reference, use Symbol::qualify_to_ref() as
+follows:
+
+ use Symbol 'qualify_to_ref';
+
+ sub foo (*) {
+ my $fh = qualify_to_ref(shift, caller);
+ ...
+ }
+
+A semicolon (C<;>) separates mandatory arguments from optional arguments.
+It is redundant before C<@> or C<%>, which gobble up everything else.
+
+As the last character of a prototype, or just before a semicolon, you can
+use C<_> in place of C<$>: if this argument is not provided, C<$_> will be
+used instead.
+
+Note how the last three examples in the table above are treated
+specially by the parser. C<mygrep()> is parsed as a true list
+operator, C<myrand()> is parsed as a true unary operator with unary
+precedence the same as C<rand()>, and C<mytime()> is truly without
+arguments, just like C<time()>. That is, if you say
+
+ mytime +2;
+
+you'll get C<mytime() + 2>, not C<mytime(2)>, which is how it would be parsed
+without a prototype.
+
+The interesting thing about C<&> is that you can generate new syntax with it,
+provided it's in the initial position:
+X<&>
+
+ sub try (&@) {
+ my($try,$catch) = @_;
+ eval { &$try };
+ if ($@) {
+ local $_ = $@;
+ &$catch;
+ }
+ }
+ sub catch (&) { $_[0] }
+
+ try {
+ die "phooey";
+ } catch {
+ /phooey/ and print "unphooey\n";
+ };
+
+That prints C<"unphooey">. (Yes, there are still unresolved
+issues having to do with visibility of C<@_>. I'm ignoring that
+question for the moment. (But note that if we make C<@_> lexically
+scoped, those anonymous subroutines can act like closures... (Gee,
+is this sounding a little Lispish? (Never mind.))))
+
+And here's a reimplementation of the Perl C<grep> operator:
+X<grep>
+
+ sub mygrep (&@) {
+ my $code = shift;
+ my @result;
+ foreach $_ (@_) {
+ push(@result, $_) if &$code;
+ }
+ @result;
+ }
+
+Some folks would prefer full alphanumeric prototypes. Alphanumerics have
+been intentionally left out of prototypes for the express purpose of
+someday in the future adding named, formal parameters. The current
+mechanism's main goal is to let module writers provide better diagnostics
+for module users. Larry feels the notation quite understandable to Perl
+programmers, and that it will not intrude greatly upon the meat of the
+module, nor make it harder to read. The line noise is visually
+encapsulated into a small pill that's easy to swallow.
+
+If you try to use an alphanumeric sequence in a prototype you will
+generate an optional warning - "Illegal character in prototype...".
+Unfortunately earlier versions of Perl allowed the prototype to be
+used as long as its prefix was a valid prototype. The warning may be
+upgraded to a fatal error in a future version of Perl once the
+majority of offending code is fixed.
+
+It's probably best to prototype new functions, not retrofit prototyping
+into older ones. That's because you must be especially careful about
+silent impositions of differing list versus scalar contexts. For example,
+if you decide that a function should take just one parameter, like this:
+
+ sub func ($) {
+ my $n = shift;
+ print "you gave me $n\n";
+ }
+
+and someone has been calling it with an array or expression
+returning a list:
+
+ func(@foo);
+ func( split /:/ );
+
+Then you've just supplied an automatic C<scalar> in front of their
+argument, which can be more than a bit surprising. The old C<@foo>
+which used to hold one thing doesn't get passed in. Instead,
+C<func()> now gets passed in a C<1>; that is, the number of elements
+in C<@foo>. And the C<split> gets called in scalar context so it
+starts scribbling on your C<@_> parameter list. Ouch!
+
+This is all very powerful, of course, and should be used only in moderation
+to make the world a better place.
+
+=head2 Constant Functions
+X<constant>
+
+Functions with a prototype of C<()> are potential candidates for
+inlining. If the result after optimization and constant folding
+is either a constant or a lexically-scoped scalar which has no other
+references, then it will be used in place of function calls made
+without C<&>. Calls made using C<&> are never inlined. (See
+F<constant.pm> for an easy way to declare most constants.)
+
+The following functions would all be inlined:
+
+ sub pi () { 3.14159 } # Not exact, but close.
+ sub PI () { 4 * atan2 1, 1 } # As good as it gets,
+ # and it's inlined, too!
+ sub ST_DEV () { 0 }
+ sub ST_INO () { 1 }
+
+ sub FLAG_FOO () { 1 << 8 }
+ sub FLAG_BAR () { 1 << 9 }
+ sub FLAG_MASK () { FLAG_FOO | FLAG_BAR }
+
+ sub OPT_BAZ () { not (0x1B58 & FLAG_MASK) }
+
+ sub N () { int(OPT_BAZ) / 3 }
+
+ sub FOO_SET () { 1 if FLAG_MASK & FLAG_FOO }
+
+Be aware that these will not be inlined; as they contain inner scopes,
+the constant folding doesn't reduce them to a single constant:
+
+ sub foo_set () { if (FLAG_MASK & FLAG_FOO) { 1 } }
+
+ sub baz_val () {
+ if (OPT_BAZ) {
+ return 23;
+ }
+ else {
+ return 42;
+ }
+ }
+
+If you redefine a subroutine that was eligible for inlining, you'll get
+a mandatory warning. (You can use this warning to tell whether or not a
+particular subroutine is considered constant.) The warning is
+considered severe enough not to be optional because previously compiled
+invocations of the function will still be using the old value of the
+function. If you need to be able to redefine the subroutine, you need to
+ensure that it isn't inlined, either by dropping the C<()> prototype
+(which changes calling semantics, so beware) or by thwarting the
+inlining mechanism in some other way, such as
+
+ sub not_inlined () {
+ 23 if $];
+ }
+
+=head2 Overriding Built-in Functions
+X<built-in> X<override> X<CORE> X<CORE::GLOBAL>
+
+Many built-in functions may be overridden, though this should be tried
+only occasionally and for good reason. Typically this might be
+done by a package attempting to emulate missing built-in functionality
+on a non-Unix system.
+
+Overriding may be done only by importing the name from a module at
+compile time--ordinary predeclaration isn't good enough. However, the
+C<use subs> pragma lets you, in effect, predeclare subs
+via the import syntax, and these names may then override built-in ones:
+
+ use subs 'chdir', 'chroot', 'chmod', 'chown';
+ chdir $somewhere;
+ sub chdir { ... }
+
+To unambiguously refer to the built-in form, precede the
+built-in name with the special package qualifier C<CORE::>. For example,
+saying C<CORE::open()> always refers to the built-in C<open()>, even
+if the current package has imported some other subroutine called
+C<&open()> from elsewhere. Even though it looks like a regular
+function call, it isn't: you can't take a reference to it, such as
+the incorrect C<\&CORE::open> might appear to produce.
+
+Library modules should not in general export built-in names like C<open>
+or C<chdir> as part of their default C<@EXPORT> list, because these may
+sneak into someone else's namespace and change the semantics unexpectedly.
+Instead, if the module adds that name to C<@EXPORT_OK>, then it's
+possible for a user to import the name explicitly, but not implicitly.
+That is, they could say
+
+ use Module 'open';
+
+and it would import the C<open> override. But if they said
+
+ use Module;
+
+they would get the default imports without overrides.
+
+The foregoing mechanism for overriding built-in is restricted, quite
+deliberately, to the package that requests the import. There is a second
+method that is sometimes applicable when you wish to override a built-in
+everywhere, without regard to namespace boundaries. This is achieved by
+importing a sub into the special namespace C<CORE::GLOBAL::>. Here is an
+example that quite brazenly replaces the C<glob> operator with something
+that understands regular expressions.
+
+ package REGlob;
+ require Exporter;
+ @ISA = 'Exporter';
+ @EXPORT_OK = 'glob';
+
+ sub import {
+ my $pkg = shift;
+ return unless @_;
+ my $sym = shift;
+ my $where = ($sym =~ s/^GLOBAL_// ? 'CORE::GLOBAL' : caller(0));
+ $pkg->export($where, $sym, @_);
+ }
+
+ sub glob {
+ my $pat = shift;
+ my @got;
+ if (opendir my $d, '.') {
+ @got = grep /$pat/, readdir $d;
+ closedir $d;
+ }
+ return @got;
+ }
+ 1;
+
+And here's how it could be (ab)used:
+
+ #use REGlob 'GLOBAL_glob'; # override glob() in ALL namespaces
+ package Foo;
+ use REGlob 'glob'; # override glob() in Foo:: only
+ print for <^[a-z_]+\.pm\$>; # show all pragmatic modules
+
+The initial comment shows a contrived, even dangerous example.
+By overriding C<glob> globally, you would be forcing the new (and
+subversive) behavior for the C<glob> operator for I<every> namespace,
+without the complete cognizance or cooperation of the modules that own
+those namespaces. Naturally, this should be done with extreme caution--if
+it must be done at all.
+
+The C<REGlob> example above does not implement all the support needed to
+cleanly override perl's C<glob> operator. The built-in C<glob> has
+different behaviors depending on whether it appears in a scalar or list
+context, but our C<REGlob> doesn't. Indeed, many perl built-in have such
+context sensitive behaviors, and these must be adequately supported by
+a properly written override. For a fully functional example of overriding
+C<glob>, study the implementation of C<File::DosGlob> in the standard
+library.
+
+When you override a built-in, your replacement should be consistent (if
+possible) with the built-in native syntax. You can achieve this by using
+a suitable prototype. To get the prototype of an overridable built-in,
+use the C<prototype> function with an argument of C<"CORE::builtin_name">
+(see L<perlfunc/prototype>).
+
+Note however that some built-ins can't have their syntax expressed by a
+prototype (such as C<system> or C<chomp>). If you override them you won't
+be able to fully mimic their original syntax.
+
+The built-ins C<do>, C<require> and C<glob> can also be overridden, but due
+to special magic, their original syntax is preserved, and you don't have
+to define a prototype for their replacements. (You can't override the
+C<do BLOCK> syntax, though).
+
+C<require> has special additional dark magic: if you invoke your
+C<require> replacement as C<require Foo::Bar>, it will actually receive
+the argument C<"Foo/Bar.pm"> in @_. See L<perlfunc/require>.
+
+And, as you'll have noticed from the previous example, if you override
+C<glob>, the C<< <*> >> glob operator is overridden as well.
+
+In a similar fashion, overriding the C<readline> function also overrides
+the equivalent I/O operator C<< <FILEHANDLE> >>. Also, overriding
+C<readpipe> also overrides the operators C<``> and C<qx//>.
+
+Finally, some built-ins (e.g. C<exists> or C<grep>) can't be overridden.
+
+=head2 Autoloading
+X<autoloading> X<AUTOLOAD>
+
+If you call a subroutine that is undefined, you would ordinarily
+get an immediate, fatal error complaining that the subroutine doesn't
+exist. (Likewise for subroutines being used as methods, when the
+method doesn't exist in any base class of the class's package.)
+However, if an C<AUTOLOAD> subroutine is defined in the package or
+packages used to locate the original subroutine, then that
+C<AUTOLOAD> subroutine is called with the arguments that would have
+been passed to the original subroutine. The fully qualified name
+of the original subroutine magically appears in the global $AUTOLOAD
+variable of the same package as the C<AUTOLOAD> routine. The name
+is not passed as an ordinary argument because, er, well, just
+because, that's why. (As an exception, a method call to a nonexistent
+C<import> or C<unimport> method is just skipped instead.)
+
+Many C<AUTOLOAD> routines load in a definition for the requested
+subroutine using eval(), then execute that subroutine using a special
+form of goto() that erases the stack frame of the C<AUTOLOAD> routine
+without a trace. (See the source to the standard module documented
+in L<AutoLoader>, for example.) But an C<AUTOLOAD> routine can
+also just emulate the routine and never define it. For example,
+let's pretend that a function that wasn't defined should just invoke
+C<system> with those arguments. All you'd do is:
+
+ sub AUTOLOAD {
+ my $program = $AUTOLOAD;
+ $program =~ s/.*:://;
+ system($program, @_);
+ }
+ date();
+ who('am', 'i');
+ ls('-l');
+
+In fact, if you predeclare functions you want to call that way, you don't
+even need parentheses:
+
+ use subs qw(date who ls);
+ date;
+ who "am", "i";
+ ls '-l';
+
+A more complete example of this is the standard Shell module, which
+can treat undefined subroutine calls as calls to external programs.
+
+Mechanisms are available to help modules writers split their modules
+into autoloadable files. See the standard AutoLoader module
+described in L<AutoLoader> and in L<AutoSplit>, the standard
+SelfLoader modules in L<SelfLoader>, and the document on adding C
+functions to Perl code in L<perlxs>.
+
+=head2 Subroutine Attributes
+X<attribute> X<subroutine, attribute> X<attrs>
+
+A subroutine declaration or definition may have a list of attributes
+associated with it. If such an attribute list is present, it is
+broken up at space or colon boundaries and treated as though a
+C<use attributes> had been seen. See L<attributes> for details
+about what attributes are currently supported.
+Unlike the limitation with the obsolescent C<use attrs>, the
+C<sub : ATTRLIST> syntax works to associate the attributes with
+a pre-declaration, and not just with a subroutine definition.
+
+The attributes must be valid as simple identifier names (without any
+punctuation other than the '_' character). They may have a parameter
+list appended, which is only checked for whether its parentheses ('(',')')
+nest properly.
+
+Examples of valid syntax (even though the attributes are unknown):
+
+ sub fnord (&\%) : switch(10,foo(7,3)) : expensive;
+ sub plugh () : Ugly('\(") :Bad;
+ sub xyzzy : _5x5 { ... }
+
+Examples of invalid syntax:
+
+ sub fnord : switch(10,foo(); # ()-string not balanced
+ sub snoid : Ugly('('); # ()-string not balanced
+ sub xyzzy : 5x5; # "5x5" not a valid identifier
+ sub plugh : Y2::north; # "Y2::north" not a simple identifier
+ sub snurt : foo + bar; # "+" not a colon or space
+
+The attribute list is passed as a list of constant strings to the code
+which associates them with the subroutine. In particular, the second example
+of valid syntax above currently looks like this in terms of how it's
+parsed and invoked:
+
+ use attributes __PACKAGE__, \&plugh, q[Ugly('\(")], 'Bad';
+
+For further details on attribute lists and their manipulation,
+see L<attributes> and L<Attribute::Handlers>.
+
+=head1 SEE ALSO
+
+See L<perlref/"Function Templates"> for more about references and closures.
+See L<perlxs> if you'd like to learn about calling C subroutines from Perl.
+See L<perlembed> if you'd like to learn about calling Perl subroutines from C.
+See L<perlmod> to learn about bundling up your functions in separate files.
+See L<perlmodlib> to learn what library modules come standard on your system.
+See L<perltoot> to learn how to make object method calls.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlsymbian.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlsymbian.pod
new file mode 100755
index 00000000000..6bd36f5a75f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlsymbian.pod
@@ -0,0 +1,433 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.symbian - Perl version 5 on Symbian OS
+
+=head1 DESCRIPTION
+
+This document describes various features of the Symbian operating
+system that will affect how Perl version 5 (hereafter just Perl)
+is compiled and/or runs.
+
+B<NOTE: this port (as of 0.4.1) does not compile into a Symbian
+OS GUI application, but instead it results in a Symbian DLL.>
+The DLL includes a C++ class called CPerlBase, which one can then
+(derive from and) use to embed Perl into applications, see F<symbian/README>.
+
+The base port of Perl to Symbian only implements the basic POSIX-like
+functionality; it does not implement any further Symbian or Series 60,
+Series 80, or UIQ bindings for Perl.
+
+It is also possible to generate Symbian executables for "miniperl"
+and "perl", but since there is no standard command line interface
+for Symbian (nor full keyboards in the devices), these are useful
+mainly as demonstrations.
+
+=head2 Compiling Perl on Symbian
+
+(0) You need to have the appropriate Symbian SDK installed.
+
+ These instructions have been tested under various Nokia Series 60
+ Symbian SDKs (1.2 to 2.6, 2.8 should also work, 1.2 compiles but
+ does not work), Series 80 2.0, and Nokia 7710 (Series 90) SDK.
+ You can get the SDKs from Forum Nokia (http://www.forum.nokia.com/).
+ A very rough port ("it compiles") to UIQ 2.1 has also been made.
+
+ A prerequisite for any of the SDKs is to install ActivePerl
+ from ActiveState, http://www.activestate.com/Products/ActivePerl/
+
+ Having the SDK installed also means that you need to have either
+ the Metrowerks CodeWarrior installed (2.8 and 3.0 were used in testing)
+ or the Microsoft Visual C++ 6.0 installed (SP3 minimum, SP5 recommended).
+
+ Note that for example the Series 60 2.0 VC SDK installation talks
+ about ActivePerl build 518, which does no more (as of mid-2005) exist
+ at the ActiveState website. The ActivePerl 5.8.4 build 810 was
+ used successfully for compiling Perl on Symbian. The 5.6.x ActivePerls
+ do not work.
+
+ Other SDKs or compilers like Visual.NET, command-line-only
+ Visual.NET, Borland, GnuPoc, or sdk2unix have not been tried.
+
+ These instructions almost certainly won't work with older Symbian
+ releases or other SDKs. Patches to get this port running in other
+ releases, SDKs, compilers, platforms, or devices are naturally welcome.
+
+(1) Get a Perl source code distribution (for example the file
+ perl-5.9.2.tar.gz is fine) from http://www.cpan.org/src/
+ and unpack it in your the C:/Symbian directory of your Windows
+ system.
+
+(2) Change to the perl source directory.
+
+ cd c:\Symbian\perl-5.x.x
+
+(3) Run the following script using the perl coming with the SDK
+
+ perl symbian\config.pl
+
+ You must use the cmd.exe, the Cygwin shell will not work.
+ The PATH must include the SDK tools, including a Perl,
+ which should be the case under cmd.exe. If you do not
+ have that, see the end of symbian\sdk.pl for notes of
+ how your environment should be set up for Symbian compiles.
+
+(4) Build the project, either by
+
+ make all
+
+ in cmd.exe or by using either the Metrowerks CodeWarrior
+ or the Visual C++ 6.0, or the Visual Studio 8 (the Visual C++
+ 2005 Express Edition works fine).
+
+ If you use the VC IDE, you will have to run F<symbian\config.pl>
+ first using the cmd.exe, and then run 'make win.mf vc6.mf' to generate
+ the VC6 makefiles and workspaces. "make vc6" will compile for the VC6,
+ and "make cw" for the CodeWarrior.
+
+ The following SDK and compiler configurations and Nokia phones were
+ tested at some point in time (+ = compiled and PerlApp run, - = not),
+ both for Perl 5.8.x and 5.9.x:
+
+ SDK | VC | CW |
+ --------+----+----+---
+ S60 1.2 | + | + | 3650 (*)
+ S60 2.0 | + | + | 6600
+ S60 2.1 | - | + | 6670
+ S60 2.6 | + | + | 6630
+ S60 2.8 | + | + | (not tested in a device)
+ S80 2.6 | - | + | 9300
+ S90 1.1 | + | - | 7710
+ UIQ 2.1 | - | + | (not tested in a device)
+
+ (*) Compiles but does not work, unfortunately, a problem with Symbian.
+
+ If you are using the 'make' directly, it is the GNU make from the SDKs,
+ and it will invoke the right make commands for the Windows emulator
+ build and the Arm target builds ('thumb' by default) as necessary.
+
+ The build scripts assume the 'absolute style' SDK installs under C:,
+ the 'subst style' will not work.
+
+ If using the VC IDE, to build use for example the File->Open Workspace->
+ C:\Symbian\8.0a\S60_2nd_FP2\epoc32\build\symbian\perl\perl\wins\perl.dsw
+ The emulator binaries will appear in the same directory.
+
+ If using the VC IDE, you will a lot of warnings in the beginning of
+ the build because a lot of headers mentioned by the source cannot
+ be found, but this is not serious since those headers are not used.
+
+ The Metrowerks will give a lot of warnings about unused variables and
+ empty declarations, you can ignore those.
+
+ When the Windows and Arm DLLs are built do not be scared by a very long
+ messages whizzing by: it is the "export freeze" phase where the whole
+ (rather large) API of Perl is listed.
+
+ Once the build is completed you need to create the DLL SIS file by
+
+ make perldll.sis
+
+ which will create the file perlXYZ.sis (the XYZ being the Perl version)
+ which you can then install into your Symbian device: an easy way
+ to do this is to send them via Bluetooth or infrared and just open
+ the messages.
+
+ Since the total size of all Perl SIS files once installed is
+ over 2 MB, it is recommended to do the installation into a
+ memory card (drive E:) instead of the C: drive.
+
+ The size of the perlXYZ.SIS is about 370 kB but once it is in the
+ device it is about one 750 kB (according to the application manager).
+
+ The perlXYZ.sis includes only the Perl DLL: to create an additional
+ SIS file which includes some of the standard (pure) Perl libraries,
+ issue the command
+
+ make perllib.sis
+
+ Some of the standard Perl libraries are included, but not all:
+ see L</HISTORY> or F<symbian\install.cfg> for more details
+ (250 kB -> 700 kB).
+
+ Some of the standard Perl XS extensions (see L</HISTORY> are
+ also available:
+
+ make perlext.sis
+
+ which will create perlXYZext.sis (290 kB -> 770 kB).
+
+ To compile the demonstration application PerlApp you need first to
+ install the Perl headers under the SDK.
+
+ To install the Perl headers and the class CPerlBase documentation
+ so that you no more need the Perl sources around to compile Perl
+ applications using the SDK:
+
+ make sdkinstall
+
+ The destination directory is C:\Symbian\perl\X.Y.Z. For more
+ details, see F<symbian\PerlBase.pod>.
+
+ Once the headers have been installed, you can create a SIS for
+ the PerlApp:
+
+ make perlapp.sis
+
+ The perlapp.sis (11 kB -> 16 kB) will be built in the symbian
+ subdirectory, but a copy will also be made to the main directory.
+
+ If you want to package the Perl DLLs (one for WINS, one for ARMI),
+ the headers, and the documentation:
+
+ make perlsdk.zip
+
+ which will create perlXYZsdk.zip that can be used in another
+ Windows system with the SDK, without having to compile Perl in
+ that system.
+
+ If you want to package the PerlApp sources:
+
+ make perlapp.zip
+
+ If you want to package the perl.exe and miniperl.exe, you
+ can use the perlexe.sis and miniperlexe.sis make targets.
+ You also probably want the perllib.sis for the libraries
+ and maybe even the perlapp.sis for the recognizer.
+
+ The make target 'allsis' combines all the above SIS targets.
+
+ To clean up after compilation you can use either of
+
+ make clean
+ make distclean
+
+ depending on how clean you want to be.
+
+=head2 Compilation problems
+
+If you see right after "make" this
+
+ cat makefile.sh >makefile
+ 'cat' is not recognized as an internal or external command,
+ operable program or batch file.
+
+it means you need to (re)run the symbian\config.pl.
+
+If you get the error
+
+ 'perl' is not recognized as an internal or external command,
+ operable program or batch file.
+
+you may need to reinstall the ActivePerl.
+
+If you see this
+
+ ren makedef.pl nomakedef.pl
+ The system cannot find the file specified.
+ C:\Symbian\...\make.exe: [rename_makedef] Error 1 (ignored)
+
+please ignore it since it is nothing serious (the build process of
+renames the Perl makedef.pl as nomakedef.pl to avoid confusing it
+with a makedef.pl of the SDK).
+
+=head2 PerlApp
+
+The PerlApp application demonstrates how to embed Perl interpreters
+to a Symbian application. The "Time" menu item runs the following
+Perl code: C<print "Running in ", $^O, "\n", scalar localtime>,
+the "Oneliner" allows one to type in Perl code, and the "Run"
+opens a file chooser for selecting a Perl file to run.
+
+The PerlApp also is started when the "Perl recognizer" (also included
+and installed) detects a Perl file being activated througg the GUI,
+and offers either to install it under \Perl (if the Perl file is in
+the inbox of the messaging application) or to run it (if the Perl file
+is under \Perl).
+
+=head2 sisify.pl
+
+In the symbian subdirectory there is sisify.pl utility which can be
+used to package Perl scripts and/or Perl library directories into SIS
+files, which can be installed to the device. To run the sisify.pl
+utility, you will need to have the 'makesis' and 'uidcrc' utilities
+already installed. If you don't have the Win32 SDKs, you may try
+for example http://gnupoc.sourceforge.net/ or http://symbianos.org/~andreh/.
+
+=head2 Using Perl in Symbian
+
+First of all note that you have full access to the Symbian device
+when using Perl: you can do a lot of damage to your device (like
+removing system files) unless you are careful. Please do take
+backups before doing anything.
+
+The Perl port has been done for the most part using the Symbian
+standard POSIX-ish STDLIB library. It is a reasonably complete
+library, but certain corners of such emulation libraries that tend
+to be left unimplemented on non-UNIX platforms have been left
+unimplemented also this time: fork(), signals(), user/group ids,
+select() working for sockets, non-blocking sockets, and so forth.
+See the file symbian/config.sh and look for 'undef' to find the
+unsupported APIs (or from Perl use Config).
+
+The filesystem of Symbian devices uses DOSish syntax, "drives"
+separated from paths by a colon, and backslashes for the path. The
+exact assignment of the drives probably varies between platforms, but
+for example in Series 60 you might see C: as the (flash) main memory,
+D: as the RAM drive, E: as the memory card (MMC), Z: as the ROM. In
+Series 80 D: is the memory card. As far the devices go the NUL: is
+the bit bucket, the COMx: are the serial lines, IRCOMx: are the IR
+ports, TMP: might be C:\System\Temp. Remember to double those
+backslashes in doublequoted strings.
+
+The Perl DLL is installed in \System\Libs\. The Perl libraries and
+extension DLLs are installed in \System\Libs\Perl\X.Y.Z\. The PerlApp
+is installed in \System\Apps\, and the SIS also installs a couple of
+demo scripts in \Perl\ (C:\Mydocs\Perl\ on Nokia 7710).
+
+Note that the Symbian filesystem is very picky: it strongly prefers
+the \ instead of the /.
+
+When doing XS / Symbian C++ programming include first the Symbian
+headers, then any standard C/POSIX headers, then Perl headers, and finally
+any application headers.
+
+New() and Copy() are unfortunately used by both Symbian and Perl code
+so you'll have to play cpp games if you need them. PerlBase.h undefines
+the Perl definitions and redefines them as PerlNew() and PerlCopy().
+
+=head1 TO DO
+
+Lots. See F<symbian\TODO>.
+
+=head1 WARNING
+
+As of Perl Symbian port version 0.4.1 any part of Perl's standard
+regression test suite has not been run on a real Symbian device using
+the ported Perl, so innumerable bugs may lie in wait. Therefore there
+is absolutely no warranty.
+
+=head1 NOTE
+
+When creating and extending application programming interfaces (APIs)
+for Symbian or Series 60 or Series 80 or Series 90 it is suggested
+that trademarks, registered trademarks, or trade names are not used in
+the API names. Instead, developers should consider basing the API
+naming in the existing (C++, or maybe Java) public component and API
+naming, modified as appropriate by the rules of the programming
+language the new APIs are for.
+
+Nokia is a registered trademark of Nokia Corporation. Nokia's product
+names are trademarks or registered trademarks of Nokia. Other product
+and company names mentioned herein may be trademarks or trade names of
+their respective owners.
+
+=head1 AUTHOR
+
+Jarkko Hietaniemi
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004-2005 Nokia. All rights reserved.
+
+Copyright (c) 2006-2007 Jarkko Hietaniemi.
+
+=head1 LICENSE
+
+The Symbian port is licensed under the same terms as Perl itself.
+
+=head1 HISTORY
+
+=over 4
+
+=item *
+
+0.1.0: April 2005
+
+(This will show as "0.01" in the Symbian Installer.)
+
+ - The console window is a very simple console indeed: one can
+ get the newline with "000" and the "C" button is a backspace.
+ Do not expect a terminal capable of vt100 or ANSI sequences.
+ The console is also "ASCII", you cannot input e.g. any accented
+ letters. Because of obvious physical constraints the console is
+ also very small: (in Nokia 6600) 22 columns, 17 rows.
+ - The following libraries are available:
+ AnyDBM_File AutoLoader base Carp Config Cwd constant
+ DynaLoader Exporter File::Spec integer lib strict Symbol
+ vars warnings XSLoader
+ - The following extensions are available:
+ attrs Compress::Zlib Cwd Data::Dumper Devel::Peek Digest::MD5 DynaLoader
+ Fcntl File::Glob Filter::Util::Call IO List::Util MIME::Base64
+ PerlIO::scalar PerlIO::via SDBM_File Socket Storable Time::HiRes
+ - The following extensions are missing for various technical reasons:
+ B ByteLoader Devel::DProf Devel::PPPort Encode GDBM_File
+ I18N::Langinfo IPC::SysV NDBM_File Opcode PerlIO::encoding POSIX
+ re Safe Sys::Hostname Sys::Syslog
+ threads threads::shared Unicode::Normalize
+ - Using MakeMaker or the Module::* to build and install modules
+ is not supported.
+ - Building XS other than the ones in the core is not supported.
+
+Since this is 0.something release, any future releases are almost
+guaranteed to be binary incompatible. As a sign of this the Symbian
+symbol exports are kept unfrozen and the .def files fully rebuilt
+every time.
+
+=item *
+
+0.2.0: October 2005
+
+ - Perl 5.9.3 (patch level 25741)
+ - Compress::Zlib and IO::Zlib supported
+ - sisify.pl added
+
+We maintain the binary incompatibility.
+
+=item *
+
+0.3.0: October 2005
+
+ - Perl 5.9.3 (patch level 25911)
+ - Series 80 2.0 and UIQ 2.1 support
+
+We maintain the binary incompatibility.
+
+=item *
+
+0.4.0: November 2005
+
+ - Perl 5.9.3 (patch level 26052)
+ - adding a sample Symbian extension
+
+We maintain the binary incompatibility.
+
+=item *
+
+0.4.1: December 2006
+
+ - Perl 5.9.5-to-be (patch level 30002)
+ - added extensions: Compress/Raw/Zlib, Digest/SHA,
+ Hash/Util, Math/BigInt/FastCalc, Text/Soundex, Time/Piece
+ - port to S90 1.1 by alexander smishlajev
+
+We maintain the binary incompatibility.
+
+=item *
+
+0.4.2: March 2007
+
+ - catchup with Perl 5.9.5-to-be (patch level 30812)
+ - tested to build with Microsoft Visual C++ 2005 Express Edition
+ (which uses Microsoft Visual C 8, instead of the old VC6),
+ SDK used for testing S60_2nd_FP3 aka 8.1a
+
+We maintain the binary incompatibility.
+
+=back
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlsyn.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlsyn.pod
new file mode 100755
index 00000000000..cd9501211c3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlsyn.pod
@@ -0,0 +1,900 @@
+=head1 NAME
+X<syntax>
+
+perlsyn - Perl syntax
+
+=head1 DESCRIPTION
+
+A Perl program consists of a sequence of declarations and statements
+which run from the top to the bottom. Loops, subroutines and other
+control structures allow you to jump around within the code.
+
+Perl is a B<free-form> language, you can format and indent it however
+you like. Whitespace mostly serves to separate tokens, unlike
+languages like Python where it is an important part of the syntax.
+
+Many of Perl's syntactic elements are B<optional>. Rather than
+requiring you to put parentheses around every function call and
+declare every variable, you can often leave such explicit elements off
+and Perl will figure out what you meant. This is known as B<Do What I
+Mean>, abbreviated B<DWIM>. It allows programmers to be B<lazy> and to
+code in a style with which they are comfortable.
+
+Perl B<borrows syntax> and concepts from many languages: awk, sed, C,
+Bourne Shell, Smalltalk, Lisp and even English. Other
+languages have borrowed syntax from Perl, particularly its regular
+expression extensions. So if you have programmed in another language
+you will see familiar pieces in Perl. They often work the same, but
+see L<perltrap> for information about how they differ.
+
+=head2 Declarations
+X<declaration> X<undef> X<undefined> X<uninitialized>
+
+The only things you need to declare in Perl are report formats and
+subroutines (and sometimes not even subroutines). A variable holds
+the undefined value (C<undef>) until it has been assigned a defined
+value, which is anything other than C<undef>. When used as a number,
+C<undef> is treated as C<0>; when used as a string, it is treated as
+the empty string, C<"">; and when used as a reference that isn't being
+assigned to, it is treated as an error. If you enable warnings,
+you'll be notified of an uninitialized value whenever you treat
+C<undef> as a string or a number. Well, usually. Boolean contexts,
+such as:
+
+ my $a;
+ if ($a) {}
+
+are exempt from warnings (because they care about truth rather than
+definedness). Operators such as C<++>, C<-->, C<+=>,
+C<-=>, and C<.=>, that operate on undefined left values such as:
+
+ my $a;
+ $a++;
+
+are also always exempt from such warnings.
+
+A declaration can be put anywhere a statement can, but has no effect on
+the execution of the primary sequence of statements--declarations all
+take effect at compile time. Typically all the declarations are put at
+the beginning or the end of the script. However, if you're using
+lexically-scoped private variables created with C<my()>, you'll
+have to make sure
+your format or subroutine definition is within the same block scope
+as the my if you expect to be able to access those private variables.
+
+Declaring a subroutine allows a subroutine name to be used as if it were a
+list operator from that point forward in the program. You can declare a
+subroutine without defining it by saying C<sub name>, thus:
+X<subroutine, declaration>
+
+ sub myname;
+ $me = myname $0 or die "can't get myname";
+
+Note that myname() functions as a list operator, not as a unary operator;
+so be careful to use C<or> instead of C<||> in this case. However, if
+you were to declare the subroutine as C<sub myname ($)>, then
+C<myname> would function as a unary operator, so either C<or> or
+C<||> would work.
+
+Subroutines declarations can also be loaded up with the C<require> statement
+or both loaded and imported into your namespace with a C<use> statement.
+See L<perlmod> for details on this.
+
+A statement sequence may contain declarations of lexically-scoped
+variables, but apart from declaring a variable name, the declaration acts
+like an ordinary statement, and is elaborated within the sequence of
+statements as if it were an ordinary statement. That means it actually
+has both compile-time and run-time effects.
+
+=head2 Comments
+X<comment> X<#>
+
+Text from a C<"#"> character until the end of the line is a comment,
+and is ignored. Exceptions include C<"#"> inside a string or regular
+expression.
+
+=head2 Simple Statements
+X<statement> X<semicolon> X<expression> X<;>
+
+The only kind of simple statement is an expression evaluated for its
+side effects. Every simple statement must be terminated with a
+semicolon, unless it is the final statement in a block, in which case
+the semicolon is optional. (A semicolon is still encouraged if the
+block takes up more than one line, because you may eventually add
+another line.) Note that there are some operators like C<eval {}> and
+C<do {}> that look like compound statements, but aren't (they're just
+TERMs in an expression), and thus need an explicit termination if used
+as the last item in a statement.
+
+=head2 Truth and Falsehood
+X<truth> X<falsehood> X<true> X<false> X<!> X<not> X<negation> X<0>
+
+The number 0, the strings C<'0'> and C<''>, the empty list C<()>, and
+C<undef> are all false in a boolean context. All other values are true.
+Negation of a true value by C<!> or C<not> returns a special false value.
+When evaluated as a string it is treated as C<''>, but as a number, it
+is treated as 0.
+
+=head2 Statement Modifiers
+X<statement modifier> X<modifier> X<if> X<unless> X<while>
+X<until> X<foreach> X<for>
+
+Any simple statement may optionally be followed by a I<SINGLE> modifier,
+just before the terminating semicolon (or block ending). The possible
+modifiers are:
+
+ if EXPR
+ unless EXPR
+ while EXPR
+ until EXPR
+ foreach LIST
+
+The C<EXPR> following the modifier is referred to as the "condition".
+Its truth or falsehood determines how the modifier will behave.
+
+C<if> executes the statement once I<if> and only if the condition is
+true. C<unless> is the opposite, it executes the statement I<unless>
+the condition is true (i.e., if the condition is false).
+
+ print "Basset hounds got long ears" if length $ear >= 10;
+ go_outside() and play() unless $is_raining;
+
+The C<foreach> modifier is an iterator: it executes the statement once
+for each item in the LIST (with C<$_> aliased to each item in turn).
+
+ print "Hello $_!\n" foreach qw(world Dolly nurse);
+
+C<while> repeats the statement I<while> the condition is true.
+C<until> does the opposite, it repeats the statement I<until> the
+condition is true (or while the condition is false):
+
+ # Both of these count from 0 to 10.
+ print $i++ while $i <= 10;
+ print $j++ until $j > 10;
+
+The C<while> and C<until> modifiers have the usual "C<while> loop"
+semantics (conditional evaluated first), except when applied to a
+C<do>-BLOCK (or to the deprecated C<do>-SUBROUTINE statement), in
+which case the block executes once before the conditional is
+evaluated. This is so that you can write loops like:
+
+ do {
+ $line = <STDIN>;
+ ...
+ } until $line eq ".\n";
+
+See L<perlfunc/do>. Note also that the loop control statements described
+later will I<NOT> work in this construct, because modifiers don't take
+loop labels. Sorry. You can always put another block inside of it
+(for C<next>) or around it (for C<last>) to do that sort of thing.
+For C<next>, just double the braces:
+X<next> X<last> X<redo>
+
+ do {{
+ next if $x == $y;
+ # do something here
+ }} until $x++ > $z;
+
+For C<last>, you have to be more elaborate:
+X<last>
+
+ LOOP: {
+ do {
+ last if $x = $y**2;
+ # do something here
+ } while $x++ <= $z;
+ }
+
+B<NOTE:> The behaviour of a C<my> statement modified with a statement
+modifier conditional or loop construct (e.g. C<my $x if ...>) is
+B<undefined>. The value of the C<my> variable may be C<undef>, any
+previously assigned value, or possibly anything else. Don't rely on
+it. Future versions of perl might do something different from the
+version of perl you try it out on. Here be dragons.
+X<my>
+
+=head2 Compound Statements
+X<statement, compound> X<block> X<bracket, curly> X<curly bracket> X<brace>
+X<{> X<}> X<if> X<unless> X<while> X<until> X<foreach> X<for> X<continue>
+
+In Perl, a sequence of statements that defines a scope is called a block.
+Sometimes a block is delimited by the file containing it (in the case
+of a required file, or the program as a whole), and sometimes a block
+is delimited by the extent of a string (in the case of an eval).
+
+But generally, a block is delimited by curly brackets, also known as braces.
+We will call this syntactic construct a BLOCK.
+
+The following compound statements may be used to control flow:
+
+ if (EXPR) BLOCK
+ if (EXPR) BLOCK else BLOCK
+ if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK
+ LABEL while (EXPR) BLOCK
+ LABEL while (EXPR) BLOCK continue BLOCK
+ LABEL until (EXPR) BLOCK
+ LABEL until (EXPR) BLOCK continue BLOCK
+ LABEL for (EXPR; EXPR; EXPR) BLOCK
+ LABEL foreach VAR (LIST) BLOCK
+ LABEL foreach VAR (LIST) BLOCK continue BLOCK
+ LABEL BLOCK continue BLOCK
+
+Note that, unlike C and Pascal, these are defined in terms of BLOCKs,
+not statements. This means that the curly brackets are I<required>--no
+dangling statements allowed. If you want to write conditionals without
+curly brackets there are several other ways to do it. The following
+all do the same thing:
+
+ if (!open(FOO)) { die "Can't open $FOO: $!"; }
+ die "Can't open $FOO: $!" unless open(FOO);
+ open(FOO) or die "Can't open $FOO: $!"; # FOO or bust!
+ open(FOO) ? 'hi mom' : die "Can't open $FOO: $!";
+ # a bit exotic, that last one
+
+The C<if> statement is straightforward. Because BLOCKs are always
+bounded by curly brackets, there is never any ambiguity about which
+C<if> an C<else> goes with. If you use C<unless> in place of C<if>,
+the sense of the test is reversed.
+
+The C<while> statement executes the block as long as the expression is
+L<true|/"Truth and Falsehood">.
+The C<until> statement executes the block as long as the expression is
+false.
+The LABEL is optional, and if present, consists of an identifier followed
+by a colon. The LABEL identifies the loop for the loop control
+statements C<next>, C<last>, and C<redo>.
+If the LABEL is omitted, the loop control statement
+refers to the innermost enclosing loop. This may include dynamically
+looking back your call-stack at run time to find the LABEL. Such
+desperate behavior triggers a warning if you use the C<use warnings>
+pragma or the B<-w> flag.
+
+If there is a C<continue> BLOCK, it is always executed just before the
+conditional is about to be evaluated again. Thus it can be used to
+increment a loop variable, even when the loop has been continued via
+the C<next> statement.
+
+=head2 Loop Control
+X<loop control> X<loop, control> X<next> X<last> X<redo> X<continue>
+
+The C<next> command starts the next iteration of the loop:
+
+ LINE: while (<STDIN>) {
+ next LINE if /^#/; # discard comments
+ ...
+ }
+
+The C<last> command immediately exits the loop in question. The
+C<continue> block, if any, is not executed:
+
+ LINE: while (<STDIN>) {
+ last LINE if /^$/; # exit when done with header
+ ...
+ }
+
+The C<redo> command restarts the loop block without evaluating the
+conditional again. The C<continue> block, if any, is I<not> executed.
+This command is normally used by programs that want to lie to themselves
+about what was just input.
+
+For example, when processing a file like F</etc/termcap>.
+If your input lines might end in backslashes to indicate continuation, you
+want to skip ahead and get the next record.
+
+ while (<>) {
+ chomp;
+ if (s/\\$//) {
+ $_ .= <>;
+ redo unless eof();
+ }
+ # now process $_
+ }
+
+which is Perl short-hand for the more explicitly written version:
+
+ LINE: while (defined($line = <ARGV>)) {
+ chomp($line);
+ if ($line =~ s/\\$//) {
+ $line .= <ARGV>;
+ redo LINE unless eof(); # not eof(ARGV)!
+ }
+ # now process $line
+ }
+
+Note that if there were a C<continue> block on the above code, it would
+get executed only on lines discarded by the regex (since redo skips the
+continue block). A continue block is often used to reset line counters
+or C<?pat?> one-time matches:
+
+ # inspired by :1,$g/fred/s//WILMA/
+ while (<>) {
+ ?(fred)? && s//WILMA $1 WILMA/;
+ ?(barney)? && s//BETTY $1 BETTY/;
+ ?(homer)? && s//MARGE $1 MARGE/;
+ } continue {
+ print "$ARGV $.: $_";
+ close ARGV if eof(); # reset $.
+ reset if eof(); # reset ?pat?
+ }
+
+If the word C<while> is replaced by the word C<until>, the sense of the
+test is reversed, but the conditional is still tested before the first
+iteration.
+
+The loop control statements don't work in an C<if> or C<unless>, since
+they aren't loops. You can double the braces to make them such, though.
+
+ if (/pattern/) {{
+ last if /fred/;
+ next if /barney/; # same effect as "last", but doesn't document as well
+ # do something here
+ }}
+
+This is caused by the fact that a block by itself acts as a loop that
+executes once, see L<"Basic BLOCKs">.
+
+The form C<while/if BLOCK BLOCK>, available in Perl 4, is no longer
+available. Replace any occurrence of C<if BLOCK> by C<if (do BLOCK)>.
+
+=head2 For Loops
+X<for> X<foreach>
+
+Perl's C-style C<for> loop works like the corresponding C<while> loop;
+that means that this:
+
+ for ($i = 1; $i < 10; $i++) {
+ ...
+ }
+
+is the same as this:
+
+ $i = 1;
+ while ($i < 10) {
+ ...
+ } continue {
+ $i++;
+ }
+
+There is one minor difference: if variables are declared with C<my>
+in the initialization section of the C<for>, the lexical scope of
+those variables is exactly the C<for> loop (the body of the loop
+and the control sections).
+X<my>
+
+Besides the normal array index looping, C<for> can lend itself
+to many other interesting applications. Here's one that avoids the
+problem you get into if you explicitly test for end-of-file on
+an interactive file descriptor causing your program to appear to
+hang.
+X<eof> X<end-of-file> X<end of file>
+
+ $on_a_tty = -t STDIN && -t STDOUT;
+ sub prompt { print "yes? " if $on_a_tty }
+ for ( prompt(); <STDIN>; prompt() ) {
+ # do something
+ }
+
+Using C<readline> (or the operator form, C<< <EXPR> >>) as the
+conditional of a C<for> loop is shorthand for the following. This
+behaviour is the same as a C<while> loop conditional.
+X<readline> X<< <> >>
+
+ for ( prompt(); defined( $_ = <STDIN> ); prompt() ) {
+ # do something
+ }
+
+=head2 Foreach Loops
+X<for> X<foreach>
+
+The C<foreach> loop iterates over a normal list value and sets the
+variable VAR to be each element of the list in turn. If the variable
+is preceded with the keyword C<my>, then it is lexically scoped, and
+is therefore visible only within the loop. Otherwise, the variable is
+implicitly local to the loop and regains its former value upon exiting
+the loop. If the variable was previously declared with C<my>, it uses
+that variable instead of the global one, but it's still localized to
+the loop. This implicit localisation occurs I<only> in a C<foreach>
+loop.
+X<my> X<local>
+
+The C<foreach> keyword is actually a synonym for the C<for> keyword, so
+you can use C<foreach> for readability or C<for> for brevity. (Or because
+the Bourne shell is more familiar to you than I<csh>, so writing C<for>
+comes more naturally.) If VAR is omitted, C<$_> is set to each value.
+X<$_>
+
+If any element of LIST is an lvalue, you can modify it by modifying
+VAR inside the loop. Conversely, if any element of LIST is NOT an
+lvalue, any attempt to modify that element will fail. In other words,
+the C<foreach> loop index variable is an implicit alias for each item
+in the list that you're looping over.
+X<alias>
+
+If any part of LIST is an array, C<foreach> will get very confused if
+you add or remove elements within the loop body, for example with
+C<splice>. So don't do that.
+X<splice>
+
+C<foreach> probably won't do what you expect if VAR is a tied or other
+special variable. Don't do that either.
+
+Examples:
+
+ for (@ary) { s/foo/bar/ }
+
+ for my $elem (@elements) {
+ $elem *= 2;
+ }
+
+ for $count (10,9,8,7,6,5,4,3,2,1,'BOOM') {
+ print $count, "\n"; sleep(1);
+ }
+
+ for (1..15) { print "Merry Christmas\n"; }
+
+ foreach $item (split(/:[\\\n:]*/, $ENV{TERMCAP})) {
+ print "Item: $item\n";
+ }
+
+Here's how a C programmer might code up a particular algorithm in Perl:
+
+ for (my $i = 0; $i < @ary1; $i++) {
+ for (my $j = 0; $j < @ary2; $j++) {
+ if ($ary1[$i] > $ary2[$j]) {
+ last; # can't go to outer :-(
+ }
+ $ary1[$i] += $ary2[$j];
+ }
+ # this is where that last takes me
+ }
+
+Whereas here's how a Perl programmer more comfortable with the idiom might
+do it:
+
+ OUTER: for my $wid (@ary1) {
+ INNER: for my $jet (@ary2) {
+ next OUTER if $wid > $jet;
+ $wid += $jet;
+ }
+ }
+
+See how much easier this is? It's cleaner, safer, and faster. It's
+cleaner because it's less noisy. It's safer because if code gets added
+between the inner and outer loops later on, the new code won't be
+accidentally executed. The C<next> explicitly iterates the other loop
+rather than merely terminating the inner one. And it's faster because
+Perl executes a C<foreach> statement more rapidly than it would the
+equivalent C<for> loop.
+
+=head2 Basic BLOCKs
+X<block>
+
+A BLOCK by itself (labeled or not) is semantically equivalent to a
+loop that executes once. Thus you can use any of the loop control
+statements in it to leave or restart the block. (Note that this is
+I<NOT> true in C<eval{}>, C<sub{}>, or contrary to popular belief
+C<do{}> blocks, which do I<NOT> count as loops.) The C<continue>
+block is optional.
+
+The BLOCK construct can be used to emulate case structures.
+
+ SWITCH: {
+ if (/^abc/) { $abc = 1; last SWITCH; }
+ if (/^def/) { $def = 1; last SWITCH; }
+ if (/^xyz/) { $xyz = 1; last SWITCH; }
+ $nothing = 1;
+ }
+
+Such constructs are quite frequently used, because older versions
+of Perl had no official C<switch> statement.
+
+=head2 Switch statements
+X<switch> X<case> X<given> X<when> X<default>
+
+Starting from Perl 5.10, you can say
+
+ use feature "switch";
+
+which enables a switch feature that is closely based on the
+Perl 6 proposal.
+
+The keywords C<given> and C<when> are analogous
+to C<switch> and C<case> in other languages, so the code
+above could be written as
+
+ given($_) {
+ when (/^abc/) { $abc = 1; }
+ when (/^def/) { $def = 1; }
+ when (/^xyz/) { $xyz = 1; }
+ default { $nothing = 1; }
+ }
+
+This construct is very flexible and powerful. For example:
+
+ use feature ":5.10";
+ given($foo) {
+ when (undef) {
+ say '$foo is undefined';
+ }
+ when ("foo") {
+ say '$foo is the string "foo"';
+ }
+ when ([1,3,5,7,9]) {
+ say '$foo is an odd digit';
+ continue; # Fall through
+ }
+ when ($_ < 100) {
+ say '$foo is numerically less than 100';
+ }
+ when (\&complicated_check) {
+ say 'a complicated check for $foo is true';
+ }
+ default {
+ die q(I don't know what to do with $foo);
+ }
+ }
+
+C<given(EXPR)> will assign the value of EXPR to C<$_>
+within the lexical scope of the block, so it's similar to
+
+ do { my $_ = EXPR; ... }
+
+except that the block is automatically broken out of by a
+successful C<when> or an explicit C<break>.
+
+Most of the power comes from implicit smart matching:
+
+ when($foo)
+
+is exactly equivalent to
+
+ when($_ ~~ $foo)
+
+Most of the time, C<when(EXPR)> is treated as an implicit smart match of
+C<$_>, i.e. C<$_ ~~ EXPR>. (See L</"Smart matching in detail"> for more
+information on smart matching.) But when EXPR is one of the below
+exceptional cases, it is used directly as a boolean:
+
+=over 4
+
+=item *
+
+a subroutine or method call
+
+=item *
+
+a regular expression match, i.e. C</REGEX/> or C<$foo =~ /REGEX/>,
+or a negated regular expression match (C<!/REGEX/> or C<$foo !~ /REGEX/>).
+
+=item *
+
+a comparison such as C<$_ E<lt> 10> or C<$x eq "abc">
+(or of course C<$_ ~~ $c>)
+
+=item *
+
+C<defined(...)>, C<exists(...)>, or C<eof(...)>
+
+=item *
+
+a negated expression C<!(...)> or C<not (...)>, or a logical
+exclusive-or C<(...) xor (...)>.
+
+=item *
+
+a filetest operator, with the exception of C<-s>, C<-M>, C<-A>, and C<-C>,
+that return numerical values, not boolean ones.
+
+=item *
+
+the C<..> and C<...> flip-flop operators.
+
+=back
+
+In those cases the value of EXPR is used directly as a boolean.
+
+Furthermore:
+
+=over 4
+
+=item *
+
+If EXPR is C<... && ...> or C<... and ...>, the test
+is applied recursively to both arguments. If I<both>
+arguments pass the test, then the argument is treated
+as boolean.
+
+=item *
+
+If EXPR is C<... || ...>, C<... // ...> or C<... or ...>, the test
+is applied recursively to the first argument.
+
+=back
+
+These rules look complicated, but usually they will do what
+you want. For example you could write:
+
+ when (/^\d+$/ && $_ < 75) { ... }
+
+Another useful shortcut is that, if you use a literal array
+or hash as the argument to C<given>, it is turned into a
+reference. So C<given(@foo)> is the same as C<given(\@foo)>,
+for example.
+
+C<default> behaves exactly like C<when(1 == 1)>, which is
+to say that it always matches.
+
+=head3 Breaking out
+
+You can use the C<break> keyword to break out of the enclosing
+C<given> block. Every C<when> block is implicitly ended with
+a C<break>.
+
+=head3 Fall-through
+
+You can use the C<continue> keyword to fall through from one
+case to the next:
+
+ given($foo) {
+ when (/x/) { say '$foo contains an x'; continue }
+ when (/y/) { say '$foo contains a y' }
+ default { say '$foo does not contain a y' }
+ }
+
+=head3 Switching in a loop
+
+Instead of using C<given()>, you can use a C<foreach()> loop.
+For example, here's one way to count how many times a particular
+string occurs in an array:
+
+ my $count = 0;
+ for (@array) {
+ when ("foo") { ++$count }
+ }
+ print "\@array contains $count copies of 'foo'\n";
+
+On exit from the C<when> block, there is an implicit C<next>.
+You can override that with an explicit C<last> if you're only
+interested in the first match.
+
+This doesn't work if you explicitly specify a loop variable,
+as in C<for $item (@array)>. You have to use the default
+variable C<$_>. (You can use C<for my $_ (@array)>.)
+
+=head3 Smart matching in detail
+
+The behaviour of a smart match depends on what type of thing its arguments
+are. The behaviour is determined by the following table: the first row
+that applies determines the match behaviour (which is thus mostly
+determined by the type of the right operand). Note that the smart match
+implicitly dereferences any non-blessed hash or array ref, so the "Hash"
+and "Array" entries apply in those cases. (For blessed references, the
+"Object" entries apply.)
+
+Note that the "Matching Code" column is not always an exact rendition. For
+example, the smart match operator short-circuits whenever possible, but
+C<grep> does not.
+
+ $a $b Type of Match Implied Matching Code
+ ====== ===== ===================== =============
+ Any undef undefined !defined $a
+
+ Any Object invokes ~~ overloading on $object, or dies
+
+ Hash CodeRef sub truth for each key[1] !grep { !$b->($_) } keys %$a
+ Array CodeRef sub truth for each elt[1] !grep { !$b->($_) } @$a
+ Any CodeRef scalar sub truth $b->($a)
+
+ Hash Hash hash keys identical (every key is found in both hashes)
+ Array Hash hash slice existence grep { exists $b->{$_} } @$a
+ Regex Hash hash key grep grep /$a/, keys %$b
+ undef Hash always false (undef can't be a key)
+ Any Hash hash entry existence exists $b->{$a}
+
+ Hash Array hash slice existence grep { exists $a->{$_} } @$b
+ Array Array arrays are comparable[2]
+ Regex Array array grep grep /$a/, @$b
+ undef Array array contains undef grep !defined, @$b
+ Any Array match against an array element[3]
+ grep $a ~~ $_, @$b
+
+ Hash Regex hash key grep grep /$b/, keys %$a
+ Array Regex array grep grep /$b/, @$a
+ Any Regex pattern match $a =~ /$b/
+
+ Object Any invokes ~~ overloading on $object, or falls back:
+ Any Num numeric equality $a == $b
+ Num numish[4] numeric equality $a == $b
+ undef Any undefined !defined($b)
+ Any Any string equality $a eq $b
+
+ 1 - empty hashes or arrays will match.
+ 2 - that is, each element smart-matches the element of same index in the
+ other array. [3]
+ 3 - If a circular reference is found, we fall back to referential equality.
+ 4 - either a real number, or a string that looks like a number
+
+=head3 Custom matching via overloading
+
+You can change the way that an object is matched by overloading
+the C<~~> operator. This may alter the usual smart match semantics.
+
+It should be noted that C<~~> will refuse to work on objects that
+don't overload it (in order to avoid relying on the object's
+underlying structure).
+
+Note also that smart match's matching rules take precedence over
+overloading, so if C<$obj> has smart match overloading, then
+
+ $obj ~~ X
+
+will not automatically invoke the overload method with X as an argument;
+instead the table above is consulted as normal, and based in the type of X,
+overloading may or may not be invoked.
+
+See L<overload>.
+
+=head3 Differences from Perl 6
+
+The Perl 5 smart match and C<given>/C<when> constructs are not
+absolutely identical to their Perl 6 analogues. The most visible
+difference is that, in Perl 5, parentheses are required around
+the argument to C<given()> and C<when()>. Parentheses in Perl 6
+are always optional in a control construct such as C<if()>,
+C<while()>, or C<when()>; they can't be made optional in Perl
+5 without a great deal of potential confusion, because Perl 5
+would parse the expression
+
+ given $foo {
+ ...
+ }
+
+as though the argument to C<given> were an element of the hash
+C<%foo>, interpreting the braces as hash-element syntax.
+
+The table of smart matches is not identical to that proposed by the
+Perl 6 specification, mainly due to the differences between Perl 6's
+and Perl 5's data models.
+
+In Perl 6, C<when()> will always do an implicit smart match
+with its argument, whilst it is convenient in Perl 5 to
+suppress this implicit smart match in certain situations,
+as documented above. (The difference is largely because Perl 5
+does not, even internally, have a boolean type.)
+
+=head2 Goto
+X<goto>
+
+Although not for the faint of heart, Perl does support a C<goto>
+statement. There are three forms: C<goto>-LABEL, C<goto>-EXPR, and
+C<goto>-&NAME. A loop's LABEL is not actually a valid target for
+a C<goto>; it's just the name of the loop.
+
+The C<goto>-LABEL form finds the statement labeled with LABEL and resumes
+execution there. It may not be used to go into any construct that
+requires initialization, such as a subroutine or a C<foreach> loop. It
+also can't be used to go into a construct that is optimized away. It
+can be used to go almost anywhere else within the dynamic scope,
+including out of subroutines, but it's usually better to use some other
+construct such as C<last> or C<die>. The author of Perl has never felt the
+need to use this form of C<goto> (in Perl, that is--C is another matter).
+
+The C<goto>-EXPR form expects a label name, whose scope will be resolved
+dynamically. This allows for computed C<goto>s per FORTRAN, but isn't
+necessarily recommended if you're optimizing for maintainability:
+
+ goto(("FOO", "BAR", "GLARCH")[$i]);
+
+The C<goto>-&NAME form is highly magical, and substitutes a call to the
+named subroutine for the currently running subroutine. This is used by
+C<AUTOLOAD()> subroutines that wish to load another subroutine and then
+pretend that the other subroutine had been called in the first place
+(except that any modifications to C<@_> in the current subroutine are
+propagated to the other subroutine.) After the C<goto>, not even C<caller()>
+will be able to tell that this routine was called first.
+
+In almost all cases like this, it's usually a far, far better idea to use the
+structured control flow mechanisms of C<next>, C<last>, or C<redo> instead of
+resorting to a C<goto>. For certain applications, the catch and throw pair of
+C<eval{}> and die() for exception processing can also be a prudent approach.
+
+=head2 PODs: Embedded Documentation
+X<POD> X<documentation>
+
+Perl has a mechanism for intermixing documentation with source code.
+While it's expecting the beginning of a new statement, if the compiler
+encounters a line that begins with an equal sign and a word, like this
+
+ =head1 Here There Be Pods!
+
+Then that text and all remaining text up through and including a line
+beginning with C<=cut> will be ignored. The format of the intervening
+text is described in L<perlpod>.
+
+This allows you to intermix your source code
+and your documentation text freely, as in
+
+ =item snazzle($)
+
+ The snazzle() function will behave in the most spectacular
+ form that you can possibly imagine, not even excepting
+ cybernetic pyrotechnics.
+
+ =cut back to the compiler, nuff of this pod stuff!
+
+ sub snazzle($) {
+ my $thingie = shift;
+ .........
+ }
+
+Note that pod translators should look at only paragraphs beginning
+with a pod directive (it makes parsing easier), whereas the compiler
+actually knows to look for pod escapes even in the middle of a
+paragraph. This means that the following secret stuff will be
+ignored by both the compiler and the translators.
+
+ $a=3;
+ =secret stuff
+ warn "Neither POD nor CODE!?"
+ =cut back
+ print "got $a\n";
+
+You probably shouldn't rely upon the C<warn()> being podded out forever.
+Not all pod translators are well-behaved in this regard, and perhaps
+the compiler will become pickier.
+
+One may also use pod directives to quickly comment out a section
+of code.
+
+=head2 Plain Old Comments (Not!)
+X<comment> X<line> X<#> X<preprocessor> X<eval>
+
+Perl can process line directives, much like the C preprocessor. Using
+this, one can control Perl's idea of filenames and line numbers in
+error or warning messages (especially for strings that are processed
+with C<eval()>). The syntax for this mechanism is the same as for most
+C preprocessors: it matches the regular expression
+
+ # example: '# line 42 "new_filename.plx"'
+ /^\# \s*
+ line \s+ (\d+) \s*
+ (?:\s("?)([^"]+)\2)? \s*
+ $/x
+
+with C<$1> being the line number for the next line, and C<$3> being
+the optional filename (specified with or without quotes).
+
+There is a fairly obvious gotcha included with the line directive:
+Debuggers and profilers will only show the last source line to appear
+at a particular line number in a given file. Care should be taken not
+to cause line number collisions in code you'd like to debug later.
+
+Here are some examples that you should be able to type into your command
+shell:
+
+ % perl
+ # line 200 "bzzzt"
+ # the `#' on the previous line must be the first char on line
+ die 'foo';
+ __END__
+ foo at bzzzt line 201.
+
+ % perl
+ # line 200 "bzzzt"
+ eval qq[\n#line 2001 ""\ndie 'foo']; print $@;
+ __END__
+ foo at - line 2001.
+
+ % perl
+ eval qq[\n#line 200 "foo bar"\ndie 'foo']; print $@;
+ __END__
+ foo at foo bar line 200.
+
+ % perl
+ # line 345 "goop"
+ eval "\n#line " . __LINE__ . ' "' . __FILE__ ."\"\ndie 'foo'";
+ print $@;
+ __END__
+ foo at goop line 345.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlthrtut.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlthrtut.pod
new file mode 100755
index 00000000000..99fae89e902
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlthrtut.pod
@@ -0,0 +1,1177 @@
+=head1 NAME
+
+perlthrtut - Tutorial on threads in Perl
+
+=head1 DESCRIPTION
+
+This tutorial describes the use of Perl interpreter threads (sometimes
+referred to as I<ithreads>) that was first introduced in Perl 5.6.0. In this
+model, each thread runs in its own Perl interpreter, and any data sharing
+between threads must be explicit. The user-level interface for I<ithreads>
+uses the L<threads> class.
+
+B<NOTE>: There was another older Perl threading flavor called the 5.005 model
+that used the L<Threads> class. This old model was known to have problems, is
+deprecated, and was removed for release 5.10. You are
+strongly encouraged to migrate any existing 5.005 threads code to the new
+model as soon as possible.
+
+You can see which (or neither) threading flavour you have by
+running C<perl -V> and looking at the C<Platform> section.
+If you have C<useithreads=define> you have ithreads, if you
+have C<use5005threads=define> you have 5.005 threads.
+If you have neither, you don't have any thread support built in.
+If you have both, you are in trouble.
+
+The L<threads> and L<threads::shared> modules are included in the core Perl
+distribution. Additionally, they are maintained as a separate modules on
+CPAN, so you can check there for any updates.
+
+=head1 What Is A Thread Anyway?
+
+A thread is a flow of control through a program with a single
+execution point.
+
+Sounds an awful lot like a process, doesn't it? Well, it should.
+Threads are one of the pieces of a process. Every process has at least
+one thread and, up until now, every process running Perl had only one
+thread. With 5.8, though, you can create extra threads. We're going
+to show you how, when, and why.
+
+=head1 Threaded Program Models
+
+There are three basic ways that you can structure a threaded
+program. Which model you choose depends on what you need your program
+to do. For many non-trivial threaded programs, you'll need to choose
+different models for different pieces of your program.
+
+=head2 Boss/Worker
+
+The boss/worker model usually has one I<boss> thread and one or more
+I<worker> threads. The boss thread gathers or generates tasks that need
+to be done, then parcels those tasks out to the appropriate worker
+thread.
+
+This model is common in GUI and server programs, where a main thread
+waits for some event and then passes that event to the appropriate
+worker threads for processing. Once the event has been passed on, the
+boss thread goes back to waiting for another event.
+
+The boss thread does relatively little work. While tasks aren't
+necessarily performed faster than with any other method, it tends to
+have the best user-response times.
+
+=head2 Work Crew
+
+In the work crew model, several threads are created that do
+essentially the same thing to different pieces of data. It closely
+mirrors classical parallel processing and vector processors, where a
+large array of processors do the exact same thing to many pieces of
+data.
+
+This model is particularly useful if the system running the program
+will distribute multiple threads across different processors. It can
+also be useful in ray tracing or rendering engines, where the
+individual threads can pass on interim results to give the user visual
+feedback.
+
+=head2 Pipeline
+
+The pipeline model divides up a task into a series of steps, and
+passes the results of one step on to the thread processing the
+next. Each thread does one thing to each piece of data and passes the
+results to the next thread in line.
+
+This model makes the most sense if you have multiple processors so two
+or more threads will be executing in parallel, though it can often
+make sense in other contexts as well. It tends to keep the individual
+tasks small and simple, as well as allowing some parts of the pipeline
+to block (on I/O or system calls, for example) while other parts keep
+going. If you're running different parts of the pipeline on different
+processors you may also take advantage of the caches on each
+processor.
+
+This model is also handy for a form of recursive programming where,
+rather than having a subroutine call itself, it instead creates
+another thread. Prime and Fibonacci generators both map well to this
+form of the pipeline model. (A version of a prime number generator is
+presented later on.)
+
+=head1 What kind of threads are Perl threads?
+
+If you have experience with other thread implementations, you might
+find that things aren't quite what you expect. It's very important to
+remember when dealing with Perl threads that I<Perl Threads Are Not X
+Threads> for all values of X. They aren't POSIX threads, or
+DecThreads, or Java's Green threads, or Win32 threads. There are
+similarities, and the broad concepts are the same, but if you start
+looking for implementation details you're going to be either
+disappointed or confused. Possibly both.
+
+This is not to say that Perl threads are completely different from
+everything that's ever come before -- they're not. Perl's threading
+model owes a lot to other thread models, especially POSIX. Just as
+Perl is not C, though, Perl threads are not POSIX threads. So if you
+find yourself looking for mutexes, or thread priorities, it's time to
+step back a bit and think about what you want to do and how Perl can
+do it.
+
+However, it is important to remember that Perl threads cannot magically
+do things unless your operating system's threads allow it. So if your
+system blocks the entire process on C<sleep()>, Perl usually will, as well.
+
+B<Perl Threads Are Different.>
+
+=head1 Thread-Safe Modules
+
+The addition of threads has changed Perl's internals
+substantially. There are implications for people who write
+modules with XS code or external libraries. However, since Perl data is
+not shared among threads by default, Perl modules stand a high chance of
+being thread-safe or can be made thread-safe easily. Modules that are not
+tagged as thread-safe should be tested or code reviewed before being used
+in production code.
+
+Not all modules that you might use are thread-safe, and you should
+always assume a module is unsafe unless the documentation says
+otherwise. This includes modules that are distributed as part of the
+core. Threads are a relatively new feature, and even some of the standard
+modules aren't thread-safe.
+
+Even if a module is thread-safe, it doesn't mean that the module is optimized
+to work well with threads. A module could possibly be rewritten to utilize
+the new features in threaded Perl to increase performance in a threaded
+environment.
+
+If you're using a module that's not thread-safe for some reason, you
+can protect yourself by using it from one, and only one thread at all.
+If you need multiple threads to access such a module, you can use semaphores and
+lots of programming discipline to control access to it. Semaphores
+are covered in L</"Basic semaphores">.
+
+See also L</"Thread-Safety of System Libraries">.
+
+=head1 Thread Basics
+
+The L<threads> module provides the basic functions you need to write
+threaded programs. In the following sections, we'll cover the basics,
+showing you what you need to do to create a threaded program. After
+that, we'll go over some of the features of the L<threads> module that
+make threaded programming easier.
+
+=head2 Basic Thread Support
+
+Thread support is a Perl compile-time option -- it's something that's
+turned on or off when Perl is built at your site, rather than when
+your programs are compiled. If your Perl wasn't compiled with thread
+support enabled, then any attempt to use threads will fail.
+
+Your programs can use the Config module to check whether threads are
+enabled. If your program can't run without them, you can say something
+like:
+
+ use Config;
+ $Config{useithreads} or die('Recompile Perl with threads to run this program.');
+
+A possibly-threaded program using a possibly-threaded module might
+have code like this:
+
+ use Config;
+ use MyMod;
+
+ BEGIN {
+ if ($Config{useithreads}) {
+ # We have threads
+ require MyMod_threaded;
+ import MyMod_threaded;
+ } else {
+ require MyMod_unthreaded;
+ import MyMod_unthreaded;
+ }
+ }
+
+Since code that runs both with and without threads is usually pretty
+messy, it's best to isolate the thread-specific code in its own
+module. In our example above, that's what C<MyMod_threaded> is, and it's
+only imported if we're running on a threaded Perl.
+
+=head2 A Note about the Examples
+
+In a real situation, care should be taken that all threads are finished
+executing before the program exits. That care has B<not> been taken in these
+examples in the interest of simplicity. Running these examples I<as is> will
+produce error messages, usually caused by the fact that there are still
+threads running when the program exits. You should not be alarmed by this.
+
+=head2 Creating Threads
+
+The L<threads> module provides the tools you need to create new
+threads. Like any other module, you need to tell Perl that you want to use
+it; C<use threads;> imports all the pieces you need to create basic
+threads.
+
+The simplest, most straightforward way to create a thread is with C<create()>:
+
+ use threads;
+
+ my $thr = threads->create(\&sub1);
+
+ sub sub1 {
+ print("In the thread\n");
+ }
+
+The C<create()> method takes a reference to a subroutine and creates a new
+thread that starts executing in the referenced subroutine. Control
+then passes both to the subroutine and the caller.
+
+If you need to, your program can pass parameters to the subroutine as
+part of the thread startup. Just include the list of parameters as
+part of the C<threads-E<gt>create()> call, like this:
+
+ use threads;
+
+ my $Param3 = 'foo';
+ my $thr1 = threads->create(\&sub1, 'Param 1', 'Param 2', $Param3);
+ my @ParamList = (42, 'Hello', 3.14);
+ my $thr2 = threads->create(\&sub1, @ParamList);
+ my $thr3 = threads->create(\&sub1, qw(Param1 Param2 Param3));
+
+ sub sub1 {
+ my @InboundParameters = @_;
+ print("In the thread\n");
+ print('Got parameters >', join('<>', @InboundParameters), "<\n");
+ }
+
+The last example illustrates another feature of threads. You can spawn
+off several threads using the same subroutine. Each thread executes
+the same subroutine, but in a separate thread with a separate
+environment and potentially separate arguments.
+
+C<new()> is a synonym for C<create()>.
+
+=head2 Waiting For A Thread To Exit
+
+Since threads are also subroutines, they can return values. To wait
+for a thread to exit and extract any values it might return, you can
+use the C<join()> method:
+
+ use threads;
+
+ my ($thr) = threads->create(\&sub1);
+
+ my @ReturnData = $thr->join();
+ print('Thread returned ', join(', ', @ReturnData), "\n");
+
+ sub sub1 { return ('Fifty-six', 'foo', 2); }
+
+In the example above, the C<join()> method returns as soon as the thread
+ends. In addition to waiting for a thread to finish and gathering up
+any values that the thread might have returned, C<join()> also performs
+any OS cleanup necessary for the thread. That cleanup might be
+important, especially for long-running programs that spawn lots of
+threads. If you don't want the return values and don't want to wait
+for the thread to finish, you should call the C<detach()> method
+instead, as described next.
+
+NOTE: In the example above, the thread returns a list, thus necessitating
+that the thread creation call be made in list context (i.e., C<my ($thr)>).
+See L<threads/"$thr->join()"> and L<threads/"THREAD CONTEXT"> for more
+details on thread context and return values.
+
+=head2 Ignoring A Thread
+
+C<join()> does three things: it waits for a thread to exit, cleans up
+after it, and returns any data the thread may have produced. But what
+if you're not interested in the thread's return values, and you don't
+really care when the thread finishes? All you want is for the thread
+to get cleaned up after when it's done.
+
+In this case, you use the C<detach()> method. Once a thread is detached,
+it'll run until it's finished; then Perl will clean up after it
+automatically.
+
+ use threads;
+
+ my $thr = threads->create(\&sub1); # Spawn the thread
+
+ $thr->detach(); # Now we officially don't care any more
+
+ sleep(15); # Let thread run for awhile
+
+ sub sub1 {
+ $a = 0;
+ while (1) {
+ $a++;
+ print("\$a is $a\n");
+ sleep(1);
+ }
+ }
+
+Once a thread is detached, it may not be joined, and any return data
+that it might have produced (if it was done and waiting for a join) is
+lost.
+
+C<detach()> can also be called as a class method to allow a thread to
+detach itself:
+
+ use threads;
+
+ my $thr = threads->create(\&sub1);
+
+ sub sub1 {
+ threads->detach();
+ # Do more work
+ }
+
+=head2 Process and Thread Termination
+
+With threads one must be careful to make sure they all have a chance to
+run to completion, assuming that is what you want.
+
+An action that terminates a process will terminate I<all> running
+threads. die() and exit() have this property,
+and perl does an exit when the main thread exits,
+perhaps implicitly by falling off the end of your code,
+even if that's not what you want.
+
+As an example of this case, this code prints the message
+"Perl exited with active threads: 2 running and unjoined":
+
+ use threads;
+ my $thr1 = threads->new(\&thrsub, "test1");
+ my $thr2 = threads->new(\&thrsub, "test2");
+ sub thrsub {
+ my ($message) = @_;
+ sleep 1;
+ print "thread $message\n";
+ }
+
+But when the following lines are added at the end:
+
+ $thr1->join();
+ $thr2->join();
+
+it prints two lines of output, a perhaps more useful outcome.
+
+=head1 Threads And Data
+
+Now that we've covered the basics of threads, it's time for our next
+topic: Data. Threading introduces a couple of complications to data
+access that non-threaded programs never need to worry about.
+
+=head2 Shared And Unshared Data
+
+The biggest difference between Perl I<ithreads> and the old 5.005 style
+threading, or for that matter, to most other threading systems out there,
+is that by default, no data is shared. When a new Perl thread is created,
+all the data associated with the current thread is copied to the new
+thread, and is subsequently private to that new thread!
+This is similar in feel to what happens when a UNIX process forks,
+except that in this case, the data is just copied to a different part of
+memory within the same process rather than a real fork taking place.
+
+To make use of threading, however, one usually wants the threads to share
+at least some data between themselves. This is done with the
+L<threads::shared> module and the C<:shared> attribute:
+
+ use threads;
+ use threads::shared;
+
+ my $foo :shared = 1;
+ my $bar = 1;
+ threads->create(sub { $foo++; $bar++; })->join();
+
+ print("$foo\n"); # Prints 2 since $foo is shared
+ print("$bar\n"); # Prints 1 since $bar is not shared
+
+In the case of a shared array, all the array's elements are shared, and for
+a shared hash, all the keys and values are shared. This places
+restrictions on what may be assigned to shared array and hash elements: only
+simple values or references to shared variables are allowed - this is
+so that a private variable can't accidentally become shared. A bad
+assignment will cause the thread to die. For example:
+
+ use threads;
+ use threads::shared;
+
+ my $var = 1;
+ my $svar :shared = 2;
+ my %hash :shared;
+
+ ... create some threads ...
+
+ $hash{a} = 1; # All threads see exists($hash{a}) and $hash{a} == 1
+ $hash{a} = $var; # okay - copy-by-value: same effect as previous
+ $hash{a} = $svar; # okay - copy-by-value: same effect as previous
+ $hash{a} = \$svar; # okay - a reference to a shared variable
+ $hash{a} = \$var; # This will die
+ delete($hash{a}); # okay - all threads will see !exists($hash{a})
+
+Note that a shared variable guarantees that if two or more threads try to
+modify it at the same time, the internal state of the variable will not
+become corrupted. However, there are no guarantees beyond this, as
+explained in the next section.
+
+=head2 Thread Pitfalls: Races
+
+While threads bring a new set of useful tools, they also bring a
+number of pitfalls. One pitfall is the race condition:
+
+ use threads;
+ use threads::shared;
+
+ my $a :shared = 1;
+ my $thr1 = threads->create(\&sub1);
+ my $thr2 = threads->create(\&sub2);
+
+ $thr1->join();
+ $thr2->join();
+ print("$a\n");
+
+ sub sub1 { my $foo = $a; $a = $foo + 1; }
+ sub sub2 { my $bar = $a; $a = $bar + 1; }
+
+What do you think C<$a> will be? The answer, unfortunately, is I<it
+depends>. Both C<sub1()> and C<sub2()> access the global variable C<$a>, once
+to read and once to write. Depending on factors ranging from your
+thread implementation's scheduling algorithm to the phase of the moon,
+C<$a> can be 2 or 3.
+
+Race conditions are caused by unsynchronized access to shared
+data. Without explicit synchronization, there's no way to be sure that
+nothing has happened to the shared data between the time you access it
+and the time you update it. Even this simple code fragment has the
+possibility of error:
+
+ use threads;
+ my $a :shared = 2;
+ my $b :shared;
+ my $c :shared;
+ my $thr1 = threads->create(sub { $b = $a; $a = $b + 1; });
+ my $thr2 = threads->create(sub { $c = $a; $a = $c + 1; });
+ $thr1->join();
+ $thr2->join();
+
+Two threads both access C<$a>. Each thread can potentially be interrupted
+at any point, or be executed in any order. At the end, C<$a> could be 3
+or 4, and both C<$b> and C<$c> could be 2 or 3.
+
+Even C<$a += 5> or C<$a++> are not guaranteed to be atomic.
+
+Whenever your program accesses data or resources that can be accessed
+by other threads, you must take steps to coordinate access or risk
+data inconsistency and race conditions. Note that Perl will protect its
+internals from your race conditions, but it won't protect you from you.
+
+=head1 Synchronization and control
+
+Perl provides a number of mechanisms to coordinate the interactions
+between themselves and their data, to avoid race conditions and the like.
+Some of these are designed to resemble the common techniques used in thread
+libraries such as C<pthreads>; others are Perl-specific. Often, the
+standard techniques are clumsy and difficult to get right (such as
+condition waits). Where possible, it is usually easier to use Perlish
+techniques such as queues, which remove some of the hard work involved.
+
+=head2 Controlling access: lock()
+
+The C<lock()> function takes a shared variable and puts a lock on it.
+No other thread may lock the variable until the variable is unlocked
+by the thread holding the lock. Unlocking happens automatically
+when the locking thread exits the block that contains the call to the
+C<lock()> function. Using C<lock()> is straightforward: This example has
+several threads doing some calculations in parallel, and occasionally
+updating a running total:
+
+ use threads;
+ use threads::shared;
+
+ my $total :shared = 0;
+
+ sub calc {
+ while (1) {
+ my $result;
+ # (... do some calculations and set $result ...)
+ {
+ lock($total); # Block until we obtain the lock
+ $total += $result;
+ } # Lock implicitly released at end of scope
+ last if $result == 0;
+ }
+ }
+
+ my $thr1 = threads->create(\&calc);
+ my $thr2 = threads->create(\&calc);
+ my $thr3 = threads->create(\&calc);
+ $thr1->join();
+ $thr2->join();
+ $thr3->join();
+ print("total=$total\n");
+
+C<lock()> blocks the thread until the variable being locked is
+available. When C<lock()> returns, your thread can be sure that no other
+thread can lock that variable until the block containing the
+lock exits.
+
+It's important to note that locks don't prevent access to the variable
+in question, only lock attempts. This is in keeping with Perl's
+longstanding tradition of courteous programming, and the advisory file
+locking that C<flock()> gives you.
+
+You may lock arrays and hashes as well as scalars. Locking an array,
+though, will not block subsequent locks on array elements, just lock
+attempts on the array itself.
+
+Locks are recursive, which means it's okay for a thread to
+lock a variable more than once. The lock will last until the outermost
+C<lock()> on the variable goes out of scope. For example:
+
+ my $x :shared;
+ doit();
+
+ sub doit {
+ {
+ {
+ lock($x); # Wait for lock
+ lock($x); # NOOP - we already have the lock
+ {
+ lock($x); # NOOP
+ {
+ lock($x); # NOOP
+ lockit_some_more();
+ }
+ }
+ } # *** Implicit unlock here ***
+ }
+ }
+
+ sub lockit_some_more {
+ lock($x); # NOOP
+ } # Nothing happens here
+
+Note that there is no C<unlock()> function - the only way to unlock a
+variable is to allow it to go out of scope.
+
+A lock can either be used to guard the data contained within the variable
+being locked, or it can be used to guard something else, like a section
+of code. In this latter case, the variable in question does not hold any
+useful data, and exists only for the purpose of being locked. In this
+respect, the variable behaves like the mutexes and basic semaphores of
+traditional thread libraries.
+
+=head2 A Thread Pitfall: Deadlocks
+
+Locks are a handy tool to synchronize access to data, and using them
+properly is the key to safe shared data. Unfortunately, locks aren't
+without their dangers, especially when multiple locks are involved.
+Consider the following code:
+
+ use threads;
+
+ my $a :shared = 4;
+ my $b :shared = 'foo';
+ my $thr1 = threads->create(sub {
+ lock($a);
+ sleep(20);
+ lock($b);
+ });
+ my $thr2 = threads->create(sub {
+ lock($b);
+ sleep(20);
+ lock($a);
+ });
+
+This program will probably hang until you kill it. The only way it
+won't hang is if one of the two threads acquires both locks
+first. A guaranteed-to-hang version is more complicated, but the
+principle is the same.
+
+The first thread will grab a lock on C<$a>, then, after a pause during which
+the second thread has probably had time to do some work, try to grab a
+lock on C<$b>. Meanwhile, the second thread grabs a lock on C<$b>, then later
+tries to grab a lock on C<$a>. The second lock attempt for both threads will
+block, each waiting for the other to release its lock.
+
+This condition is called a deadlock, and it occurs whenever two or
+more threads are trying to get locks on resources that the others
+own. Each thread will block, waiting for the other to release a lock
+on a resource. That never happens, though, since the thread with the
+resource is itself waiting for a lock to be released.
+
+There are a number of ways to handle this sort of problem. The best
+way is to always have all threads acquire locks in the exact same
+order. If, for example, you lock variables C<$a>, C<$b>, and C<$c>, always lock
+C<$a> before C<$b>, and C<$b> before C<$c>. It's also best to hold on to locks for
+as short a period of time to minimize the risks of deadlock.
+
+The other synchronization primitives described below can suffer from
+similar problems.
+
+=head2 Queues: Passing Data Around
+
+A queue is a special thread-safe object that lets you put data in one
+end and take it out the other without having to worry about
+synchronization issues. They're pretty straightforward, and look like
+this:
+
+ use threads;
+ use Thread::Queue;
+
+ my $DataQueue = Thread::Queue->new();
+ my $thr = threads->create(sub {
+ while (my $DataElement = $DataQueue->dequeue()) {
+ print("Popped $DataElement off the queue\n");
+ }
+ });
+
+ $DataQueue->enqueue(12);
+ $DataQueue->enqueue("A", "B", "C");
+ sleep(10);
+ $DataQueue->enqueue(undef);
+ $thr->join();
+
+You create the queue with C<Thread::Queue-E<gt>new()>. Then you can
+add lists of scalars onto the end with C<enqueue()>, and pop scalars off
+the front of it with C<dequeue()>. A queue has no fixed size, and can grow
+as needed to hold everything pushed on to it.
+
+If a queue is empty, C<dequeue()> blocks until another thread enqueues
+something. This makes queues ideal for event loops and other
+communications between threads.
+
+=head2 Semaphores: Synchronizing Data Access
+
+Semaphores are a kind of generic locking mechanism. In their most basic
+form, they behave very much like lockable scalars, except that they
+can't hold data, and that they must be explicitly unlocked. In their
+advanced form, they act like a kind of counter, and can allow multiple
+threads to have the I<lock> at any one time.
+
+=head2 Basic semaphores
+
+Semaphores have two methods, C<down()> and C<up()>: C<down()> decrements the resource
+count, while C<up()> increments it. Calls to C<down()> will block if the
+semaphore's current count would decrement below zero. This program
+gives a quick demonstration:
+
+ use threads;
+ use Thread::Semaphore;
+
+ my $semaphore = Thread::Semaphore->new();
+ my $GlobalVariable :shared = 0;
+
+ $thr1 = threads->create(\&sample_sub, 1);
+ $thr2 = threads->create(\&sample_sub, 2);
+ $thr3 = threads->create(\&sample_sub, 3);
+
+ sub sample_sub {
+ my $SubNumber = shift(@_);
+ my $TryCount = 10;
+ my $LocalCopy;
+ sleep(1);
+ while ($TryCount--) {
+ $semaphore->down();
+ $LocalCopy = $GlobalVariable;
+ print("$TryCount tries left for sub $SubNumber (\$GlobalVariable is $GlobalVariable)\n");
+ sleep(2);
+ $LocalCopy++;
+ $GlobalVariable = $LocalCopy;
+ $semaphore->up();
+ }
+ }
+
+ $thr1->join();
+ $thr2->join();
+ $thr3->join();
+
+The three invocations of the subroutine all operate in sync. The
+semaphore, though, makes sure that only one thread is accessing the
+global variable at once.
+
+=head2 Advanced Semaphores
+
+By default, semaphores behave like locks, letting only one thread
+C<down()> them at a time. However, there are other uses for semaphores.
+
+Each semaphore has a counter attached to it. By default, semaphores are
+created with the counter set to one, C<down()> decrements the counter by
+one, and C<up()> increments by one. However, we can override any or all
+of these defaults simply by passing in different values:
+
+ use threads;
+ use Thread::Semaphore;
+
+ my $semaphore = Thread::Semaphore->new(5);
+ # Creates a semaphore with the counter set to five
+
+ my $thr1 = threads->create(\&sub1);
+ my $thr2 = threads->create(\&sub1);
+
+ sub sub1 {
+ $semaphore->down(5); # Decrements the counter by five
+ # Do stuff here
+ $semaphore->up(5); # Increment the counter by five
+ }
+
+ $thr1->detach();
+ $thr2->detach();
+
+If C<down()> attempts to decrement the counter below zero, it blocks until
+the counter is large enough. Note that while a semaphore can be created
+with a starting count of zero, any C<up()> or C<down()> always changes the
+counter by at least one, and so C<< $semaphore->down(0) >> is the same as
+C<< $semaphore->down(1) >>.
+
+The question, of course, is why would you do something like this? Why
+create a semaphore with a starting count that's not one, or why
+decrement or increment it by more than one? The answer is resource
+availability. Many resources that you want to manage access for can be
+safely used by more than one thread at once.
+
+For example, let's take a GUI driven program. It has a semaphore that
+it uses to synchronize access to the display, so only one thread is
+ever drawing at once. Handy, but of course you don't want any thread
+to start drawing until things are properly set up. In this case, you
+can create a semaphore with a counter set to zero, and up it when
+things are ready for drawing.
+
+Semaphores with counters greater than one are also useful for
+establishing quotas. Say, for example, that you have a number of
+threads that can do I/O at once. You don't want all the threads
+reading or writing at once though, since that can potentially swamp
+your I/O channels, or deplete your process' quota of filehandles. You
+can use a semaphore initialized to the number of concurrent I/O
+requests (or open files) that you want at any one time, and have your
+threads quietly block and unblock themselves.
+
+Larger increments or decrements are handy in those cases where a
+thread needs to check out or return a number of resources at once.
+
+=head2 Waiting for a Condition
+
+The functions C<cond_wait()> and C<cond_signal()>
+can be used in conjunction with locks to notify
+co-operating threads that a resource has become available. They are
+very similar in use to the functions found in C<pthreads>. However
+for most purposes, queues are simpler to use and more intuitive. See
+L<threads::shared> for more details.
+
+=head2 Giving up control
+
+There are times when you may find it useful to have a thread
+explicitly give up the CPU to another thread. You may be doing something
+processor-intensive and want to make sure that the user-interface thread
+gets called frequently. Regardless, there are times that you might want
+a thread to give up the processor.
+
+Perl's threading package provides the C<yield()> function that does
+this. C<yield()> is pretty straightforward, and works like this:
+
+ use threads;
+
+ sub loop {
+ my $thread = shift;
+ my $foo = 50;
+ while($foo--) { print("In thread $thread\n"); }
+ threads->yield();
+ $foo = 50;
+ while($foo--) { print("In thread $thread\n"); }
+ }
+
+ my $thr1 = threads->create(\&loop, 'first');
+ my $thr2 = threads->create(\&loop, 'second');
+ my $thr3 = threads->create(\&loop, 'third');
+
+It is important to remember that C<yield()> is only a hint to give up the CPU,
+it depends on your hardware, OS and threading libraries what actually happens.
+B<On many operating systems, yield() is a no-op.> Therefore it is important
+to note that one should not build the scheduling of the threads around
+C<yield()> calls. It might work on your platform but it won't work on another
+platform.
+
+=head1 General Thread Utility Routines
+
+We've covered the workhorse parts of Perl's threading package, and
+with these tools you should be well on your way to writing threaded
+code and packages. There are a few useful little pieces that didn't
+really fit in anyplace else.
+
+=head2 What Thread Am I In?
+
+The C<threads-E<gt>self()> class method provides your program with a way to
+get an object representing the thread it's currently in. You can use this
+object in the same way as the ones returned from thread creation.
+
+=head2 Thread IDs
+
+C<tid()> is a thread object method that returns the thread ID of the
+thread the object represents. Thread IDs are integers, with the main
+thread in a program being 0. Currently Perl assigns a unique TID to
+every thread ever created in your program, assigning the first thread
+to be created a TID of 1, and increasing the TID by 1 for each new
+thread that's created. When used as a class method, C<threads-E<gt>tid()>
+can be used by a thread to get its own TID.
+
+=head2 Are These Threads The Same?
+
+The C<equal()> method takes two thread objects and returns true
+if the objects represent the same thread, and false if they don't.
+
+Thread objects also have an overloaded C<==> comparison so that you can do
+comparison on them as you would with normal objects.
+
+=head2 What Threads Are Running?
+
+C<threads-E<gt>list()> returns a list of thread objects, one for each thread
+that's currently running and not detached. Handy for a number of things,
+including cleaning up at the end of your program (from the main Perl thread,
+of course):
+
+ # Loop through all the threads
+ foreach my $thr (threads->list()) {
+ $thr->join();
+ }
+
+If some threads have not finished running when the main Perl thread
+ends, Perl will warn you about it and die, since it is impossible for Perl
+to clean up itself while other threads are running.
+
+NOTE: The main Perl thread (thread 0) is in a I<detached> state, and so
+does not appear in the list returned by C<threads-E<gt>list()>.
+
+=head1 A Complete Example
+
+Confused yet? It's time for an example program to show some of the
+things we've covered. This program finds prime numbers using threads.
+
+ 1 #!/usr/bin/perl
+ 2 # prime-pthread, courtesy of Tom Christiansen
+ 3
+ 4 use strict;
+ 5 use warnings;
+ 6
+ 7 use threads;
+ 8 use Thread::Queue;
+ 9
+ 10 sub check_num {
+ 11 my ($upstream, $cur_prime) = @_;
+ 12 my $kid;
+ 13 my $downstream = Thread::Queue->new();
+ 14 while (my $num = $upstream->dequeue()) {
+ 15 next unless ($num % $cur_prime);
+ 16 if ($kid) {
+ 17 $downstream->enqueue($num);
+ 18 } else {
+ 19 print("Found prime: $num\n");
+ 20 $kid = threads->create(\&check_num, $downstream, $num);
+ 21 if (! $kid) {
+ 22 warn("Sorry. Ran out of threads.\n");
+ 23 last;
+ 24 }
+ 25 }
+ 26 }
+ 27 if ($kid) {
+ 28 $downstream->enqueue(undef);
+ 29 $kid->join();
+ 30 }
+ 31 }
+ 32
+ 33 my $stream = Thread::Queue->new(3..1000, undef);
+ 34 check_num($stream, 2);
+
+This program uses the pipeline model to generate prime numbers. Each
+thread in the pipeline has an input queue that feeds numbers to be
+checked, a prime number that it's responsible for, and an output queue
+into which it funnels numbers that have failed the check. If the thread
+has a number that's failed its check and there's no child thread, then
+the thread must have found a new prime number. In that case, a new
+child thread is created for that prime and stuck on the end of the
+pipeline.
+
+This probably sounds a bit more confusing than it really is, so let's
+go through this program piece by piece and see what it does. (For
+those of you who might be trying to remember exactly what a prime
+number is, it's a number that's only evenly divisible by itself and 1.)
+
+The bulk of the work is done by the C<check_num()> subroutine, which
+takes a reference to its input queue and a prime number that it's
+responsible for. After pulling in the input queue and the prime that
+the subroutine is checking (line 11), we create a new queue (line 13)
+and reserve a scalar for the thread that we're likely to create later
+(line 12).
+
+The while loop from line 14 to line 26 grabs a scalar off the input
+queue and checks against the prime this thread is responsible
+for. Line 15 checks to see if there's a remainder when we divide the
+number to be checked by our prime. If there is one, the number
+must not be evenly divisible by our prime, so we need to either pass
+it on to the next thread if we've created one (line 17) or create a
+new thread if we haven't.
+
+The new thread creation is line 20. We pass on to it a reference to
+the queue we've created, and the prime number we've found. In lines 21
+through 24, we check to make sure that our new thread got created, and
+if not, we stop checking any remaining numbers in the queue.
+
+Finally, once the loop terminates (because we got a 0 or C<undef> in the
+queue, which serves as a note to terminate), we pass on the notice to our
+child, and wait for it to exit if we've created a child (lines 27 and
+30).
+
+Meanwhile, back in the main thread, we first create a queue (line 33) and
+queue up all the numbers from 3 to 1000 for checking, plus a termination
+notice. Then all we have to do to get the ball rolling is pass the queue
+and the first prime to the C<check_num()> subroutine (line 34).
+
+That's how it works. It's pretty simple; as with many Perl programs,
+the explanation is much longer than the program.
+
+=head1 Different implementations of threads
+
+Some background on thread implementations from the operating system
+viewpoint. There are three basic categories of threads: user-mode threads,
+kernel threads, and multiprocessor kernel threads.
+
+User-mode threads are threads that live entirely within a program and
+its libraries. In this model, the OS knows nothing about threads. As
+far as it's concerned, your process is just a process.
+
+This is the easiest way to implement threads, and the way most OSes
+start. The big disadvantage is that, since the OS knows nothing about
+threads, if one thread blocks they all do. Typical blocking activities
+include most system calls, most I/O, and things like C<sleep()>.
+
+Kernel threads are the next step in thread evolution. The OS knows
+about kernel threads, and makes allowances for them. The main
+difference between a kernel thread and a user-mode thread is
+blocking. With kernel threads, things that block a single thread don't
+block other threads. This is not the case with user-mode threads,
+where the kernel blocks at the process level and not the thread level.
+
+This is a big step forward, and can give a threaded program quite a
+performance boost over non-threaded programs. Threads that block
+performing I/O, for example, won't block threads that are doing other
+things. Each process still has only one thread running at once,
+though, regardless of how many CPUs a system might have.
+
+Since kernel threading can interrupt a thread at any time, they will
+uncover some of the implicit locking assumptions you may make in your
+program. For example, something as simple as C<$a = $a + 2> can behave
+unpredictably with kernel threads if C<$a> is visible to other
+threads, as another thread may have changed C<$a> between the time it
+was fetched on the right hand side and the time the new value is
+stored.
+
+Multiprocessor kernel threads are the final step in thread
+support. With multiprocessor kernel threads on a machine with multiple
+CPUs, the OS may schedule two or more threads to run simultaneously on
+different CPUs.
+
+This can give a serious performance boost to your threaded program,
+since more than one thread will be executing at the same time. As a
+tradeoff, though, any of those nagging synchronization issues that
+might not have shown with basic kernel threads will appear with a
+vengeance.
+
+In addition to the different levels of OS involvement in threads,
+different OSes (and different thread implementations for a particular
+OS) allocate CPU cycles to threads in different ways.
+
+Cooperative multitasking systems have running threads give up control
+if one of two things happen. If a thread calls a yield function, it
+gives up control. It also gives up control if the thread does
+something that would cause it to block, such as perform I/O. In a
+cooperative multitasking implementation, one thread can starve all the
+others for CPU time if it so chooses.
+
+Preemptive multitasking systems interrupt threads at regular intervals
+while the system decides which thread should run next. In a preemptive
+multitasking system, one thread usually won't monopolize the CPU.
+
+On some systems, there can be cooperative and preemptive threads
+running simultaneously. (Threads running with realtime priorities
+often behave cooperatively, for example, while threads running at
+normal priorities behave preemptively.)
+
+Most modern operating systems support preemptive multitasking nowadays.
+
+=head1 Performance considerations
+
+The main thing to bear in mind when comparing Perl's I<ithreads> to other threading
+models is the fact that for each new thread created, a complete copy of
+all the variables and data of the parent thread has to be taken. Thus,
+thread creation can be quite expensive, both in terms of memory usage and
+time spent in creation. The ideal way to reduce these costs is to have a
+relatively short number of long-lived threads, all created fairly early
+on -- before the base thread has accumulated too much data. Of course, this
+may not always be possible, so compromises have to be made. However, after
+a thread has been created, its performance and extra memory usage should
+be little different than ordinary code.
+
+Also note that under the current implementation, shared variables
+use a little more memory and are a little slower than ordinary variables.
+
+=head1 Process-scope Changes
+
+Note that while threads themselves are separate execution threads and
+Perl data is thread-private unless explicitly shared, the threads can
+affect process-scope state, affecting all the threads.
+
+The most common example of this is changing the current working
+directory using C<chdir()>. One thread calls C<chdir()>, and the working
+directory of all the threads changes.
+
+Even more drastic example of a process-scope change is C<chroot()>:
+the root directory of all the threads changes, and no thread can
+undo it (as opposed to C<chdir()>).
+
+Further examples of process-scope changes include C<umask()> and
+changing uids and gids.
+
+Thinking of mixing C<fork()> and threads? Please lie down and wait
+until the feeling passes. Be aware that the semantics of C<fork()> vary
+between platforms. For example, some UNIX systems copy all the current
+threads into the child process, while others only copy the thread that
+called C<fork()>. You have been warned!
+
+Similarly, mixing signals and threads may be problematic.
+Implementations are platform-dependent, and even the POSIX
+semantics may not be what you expect (and Perl doesn't even
+give you the full POSIX API). For example, there is no way to
+guarantee that a signal sent to a multi-threaded Perl application
+will get intercepted by any particular thread. (However, a recently
+added feature does provide the capability to send signals between
+threads. See L<threads/"THREAD SIGNALLING> for more details.)
+
+=head1 Thread-Safety of System Libraries
+
+Whether various library calls are thread-safe is outside the control
+of Perl. Calls often suffering from not being thread-safe include:
+C<localtime()>, C<gmtime()>, functions fetching user, group and
+network information (such as C<getgrent()>, C<gethostent()>,
+C<getnetent()> and so on), C<readdir()>,
+C<rand()>, and C<srand()> -- in general, calls that depend on some global
+external state.
+
+If the system Perl is compiled in has thread-safe variants of such
+calls, they will be used. Beyond that, Perl is at the mercy of
+the thread-safety or -unsafety of the calls. Please consult your
+C library call documentation.
+
+On some platforms the thread-safe library interfaces may fail if the
+result buffer is too small (for example the user group databases may
+be rather large, and the reentrant interfaces may have to carry around
+a full snapshot of those databases). Perl will start with a small
+buffer, but keep retrying and growing the result buffer
+until the result fits. If this limitless growing sounds bad for
+security or memory consumption reasons you can recompile Perl with
+C<PERL_REENTRANT_MAXSIZE> defined to the maximum number of bytes you will
+allow.
+
+=head1 Conclusion
+
+A complete thread tutorial could fill a book (and has, many times),
+but with what we've covered in this introduction, you should be well
+on your way to becoming a threaded Perl expert.
+
+=head1 SEE ALSO
+
+Annotated POD for L<threads>:
+L<http://annocpan.org/?mode=search&field=Module&name=threads>
+
+Lastest version of L<threads> on CPAN:
+L<http://search.cpan.org/search?module=threads>
+
+Annotated POD for L<threads::shared>:
+L<http://annocpan.org/?mode=search&field=Module&name=threads%3A%3Ashared>
+
+Lastest version of L<threads::shared> on CPAN:
+L<http://search.cpan.org/search?module=threads%3A%3Ashared>
+
+Perl threads mailing list:
+L<http://lists.cpan.org/showlist.cgi?name=iThreads>
+
+=head1 Bibliography
+
+Here's a short bibliography courtesy of Jürgen Christoffel:
+
+=head2 Introductory Texts
+
+Birrell, Andrew D. An Introduction to Programming with
+Threads. Digital Equipment Corporation, 1989, DEC-SRC Research Report
+#35 online as
+http://gatekeeper.dec.com/pub/DEC/SRC/research-reports/abstracts/src-rr-035.html
+(highly recommended)
+
+Robbins, Kay. A., and Steven Robbins. Practical Unix Programming: A
+Guide to Concurrency, Communication, and
+Multithreading. Prentice-Hall, 1996.
+
+Lewis, Bill, and Daniel J. Berg. Multithreaded Programming with
+Pthreads. Prentice Hall, 1997, ISBN 0-13-443698-9 (a well-written
+introduction to threads).
+
+Nelson, Greg (editor). Systems Programming with Modula-3. Prentice
+Hall, 1991, ISBN 0-13-590464-1.
+
+Nichols, Bradford, Dick Buttlar, and Jacqueline Proulx Farrell.
+Pthreads Programming. O'Reilly & Associates, 1996, ISBN 156592-115-1
+(covers POSIX threads).
+
+=head2 OS-Related References
+
+Boykin, Joseph, David Kirschen, Alan Langerman, and Susan
+LoVerso. Programming under Mach. Addison-Wesley, 1994, ISBN
+0-201-52739-1.
+
+Tanenbaum, Andrew S. Distributed Operating Systems. Prentice Hall,
+1995, ISBN 0-13-219908-4 (great textbook).
+
+Silberschatz, Abraham, and Peter B. Galvin. Operating System Concepts,
+4th ed. Addison-Wesley, 1995, ISBN 0-201-59292-4
+
+=head2 Other References
+
+Arnold, Ken and James Gosling. The Java Programming Language, 2nd
+ed. Addison-Wesley, 1998, ISBN 0-201-31006-6.
+
+comp.programming.threads FAQ,
+L<http://www.serpentine.com/~bos/threads-faq/>
+
+Le Sergent, T. and B. Berthomieu. "Incremental MultiThreaded Garbage
+Collection on Virtually Shared Memory Architectures" in Memory
+Management: Proc. of the International Workshop IWMM 92, St. Malo,
+France, September 1992, Yves Bekkers and Jacques Cohen, eds. Springer,
+1992, ISBN 3540-55940-X (real-life thread applications).
+
+Artur Bergman, "Where Wizards Fear To Tread", June 11, 2002,
+L<http://www.perl.com/pub/a/2002/06/11/threads.html>
+
+=head1 Acknowledgements
+
+Thanks (in no particular order) to Chaim Frenkel, Steve Fink, Gurusamy
+Sarathy, Ilya Zakharevich, Benjamin Sugars, Jürgen Christoffel, Joshua
+Pritikin, and Alan Burlison, for their help in reality-checking and
+polishing this article. Big thanks to Tom Christiansen for his rewrite
+of the prime number generator.
+
+=head1 AUTHOR
+
+Dan Sugalski E<lt>dan@sidhe.org<gt>
+
+Slightly modified by Arthur Bergman to fit the new thread model/module.
+
+Reworked slightly by Jörg Walter E<lt>jwalt@cpan.org<gt> to be more concise
+about thread-safety of Perl code.
+
+Rearranged slightly by Elizabeth Mattijsen E<lt>liz@dijkmat.nl<gt> to put
+less emphasis on yield().
+
+=head1 Copyrights
+
+The original version of this article originally appeared in The Perl
+Journal #10, and is copyright 1998 The Perl Journal. It appears courtesy
+of Jon Orwant and The Perl Journal. This document may be distributed
+under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perltie.pod b/Master/tlpkg/tlperl.straw/lib/pods/perltie.pod
new file mode 100755
index 00000000000..3473667b8c3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perltie.pod
@@ -0,0 +1,1191 @@
+=head1 NAME
+X<tie>
+
+perltie - how to hide an object class in a simple variable
+
+=head1 SYNOPSIS
+
+ tie VARIABLE, CLASSNAME, LIST
+
+ $object = tied VARIABLE
+
+ untie VARIABLE
+
+=head1 DESCRIPTION
+
+Prior to release 5.0 of Perl, a programmer could use dbmopen()
+to connect an on-disk database in the standard Unix dbm(3x)
+format magically to a %HASH in their program. However, their Perl was either
+built with one particular dbm library or another, but not both, and
+you couldn't extend this mechanism to other packages or types of variables.
+
+Now you can.
+
+The tie() function binds a variable to a class (package) that will provide
+the implementation for access methods for that variable. Once this magic
+has been performed, accessing a tied variable automatically triggers
+method calls in the proper class. The complexity of the class is
+hidden behind magic methods calls. The method names are in ALL CAPS,
+which is a convention that Perl uses to indicate that they're called
+implicitly rather than explicitly--just like the BEGIN() and END()
+functions.
+
+In the tie() call, C<VARIABLE> is the name of the variable to be
+enchanted. C<CLASSNAME> is the name of a class implementing objects of
+the correct type. Any additional arguments in the C<LIST> are passed to
+the appropriate constructor method for that class--meaning TIESCALAR(),
+TIEARRAY(), TIEHASH(), or TIEHANDLE(). (Typically these are arguments
+such as might be passed to the dbminit() function of C.) The object
+returned by the "new" method is also returned by the tie() function,
+which would be useful if you wanted to access other methods in
+C<CLASSNAME>. (You don't actually have to return a reference to a right
+"type" (e.g., HASH or C<CLASSNAME>) so long as it's a properly blessed
+object.) You can also retrieve a reference to the underlying object
+using the tied() function.
+
+Unlike dbmopen(), the tie() function will not C<use> or C<require> a module
+for you--you need to do that explicitly yourself.
+
+=head2 Tying Scalars
+X<scalar, tying>
+
+A class implementing a tied scalar should define the following methods:
+TIESCALAR, FETCH, STORE, and possibly UNTIE and/or DESTROY.
+
+Let's look at each in turn, using as an example a tie class for
+scalars that allows the user to do something like:
+
+ tie $his_speed, 'Nice', getppid();
+ tie $my_speed, 'Nice', $$;
+
+And now whenever either of those variables is accessed, its current
+system priority is retrieved and returned. If those variables are set,
+then the process's priority is changed!
+
+We'll use Jarkko Hietaniemi <F<jhi@iki.fi>>'s BSD::Resource class (not
+included) to access the PRIO_PROCESS, PRIO_MIN, and PRIO_MAX constants
+from your system, as well as the getpriority() and setpriority() system
+calls. Here's the preamble of the class.
+
+ package Nice;
+ use Carp;
+ use BSD::Resource;
+ use strict;
+ $Nice::DEBUG = 0 unless defined $Nice::DEBUG;
+
+=over 4
+
+=item TIESCALAR classname, LIST
+X<TIESCALAR>
+
+This is the constructor for the class. That means it is
+expected to return a blessed reference to a new scalar
+(probably anonymous) that it's creating. For example:
+
+ sub TIESCALAR {
+ my $class = shift;
+ my $pid = shift || $$; # 0 means me
+
+ if ($pid !~ /^\d+$/) {
+ carp "Nice::Tie::Scalar got non-numeric pid $pid" if $^W;
+ return undef;
+ }
+
+ unless (kill 0, $pid) { # EPERM or ERSCH, no doubt
+ carp "Nice::Tie::Scalar got bad pid $pid: $!" if $^W;
+ return undef;
+ }
+
+ return bless \$pid, $class;
+ }
+
+This tie class has chosen to return an error rather than raising an
+exception if its constructor should fail. While this is how dbmopen() works,
+other classes may well not wish to be so forgiving. It checks the global
+variable C<$^W> to see whether to emit a bit of noise anyway.
+
+=item FETCH this
+X<FETCH>
+
+This method will be triggered every time the tied variable is accessed
+(read). It takes no arguments beyond its self reference, which is the
+object representing the scalar we're dealing with. Because in this case
+we're using just a SCALAR ref for the tied scalar object, a simple $$self
+allows the method to get at the real value stored there. In our example
+below, that real value is the process ID to which we've tied our variable.
+
+ sub FETCH {
+ my $self = shift;
+ confess "wrong type" unless ref $self;
+ croak "usage error" if @_;
+ my $nicety;
+ local($!) = 0;
+ $nicety = getpriority(PRIO_PROCESS, $$self);
+ if ($!) { croak "getpriority failed: $!" }
+ return $nicety;
+ }
+
+This time we've decided to blow up (raise an exception) if the renice
+fails--there's no place for us to return an error otherwise, and it's
+probably the right thing to do.
+
+=item STORE this, value
+X<STORE>
+
+This method will be triggered every time the tied variable is set
+(assigned). Beyond its self reference, it also expects one (and only one)
+argument--the new value the user is trying to assign. Don't worry about
+returning a value from STORE -- the semantic of assignment returning the
+assigned value is implemented with FETCH.
+
+ sub STORE {
+ my $self = shift;
+ confess "wrong type" unless ref $self;
+ my $new_nicety = shift;
+ croak "usage error" if @_;
+
+ if ($new_nicety < PRIO_MIN) {
+ carp sprintf
+ "WARNING: priority %d less than minimum system priority %d",
+ $new_nicety, PRIO_MIN if $^W;
+ $new_nicety = PRIO_MIN;
+ }
+
+ if ($new_nicety > PRIO_MAX) {
+ carp sprintf
+ "WARNING: priority %d greater than maximum system priority %d",
+ $new_nicety, PRIO_MAX if $^W;
+ $new_nicety = PRIO_MAX;
+ }
+
+ unless (defined setpriority(PRIO_PROCESS, $$self, $new_nicety)) {
+ confess "setpriority failed: $!";
+ }
+ }
+
+=item UNTIE this
+X<UNTIE>
+
+This method will be triggered when the C<untie> occurs. This can be useful
+if the class needs to know when no further calls will be made. (Except DESTROY
+of course.) See L<The C<untie> Gotcha> below for more details.
+
+=item DESTROY this
+X<DESTROY>
+
+This method will be triggered when the tied variable needs to be destructed.
+As with other object classes, such a method is seldom necessary, because Perl
+deallocates its moribund object's memory for you automatically--this isn't
+C++, you know. We'll use a DESTROY method here for debugging purposes only.
+
+ sub DESTROY {
+ my $self = shift;
+ confess "wrong type" unless ref $self;
+ carp "[ Nice::DESTROY pid $$self ]" if $Nice::DEBUG;
+ }
+
+=back
+
+That's about all there is to it. Actually, it's more than all there
+is to it, because we've done a few nice things here for the sake
+of completeness, robustness, and general aesthetics. Simpler
+TIESCALAR classes are certainly possible.
+
+=head2 Tying Arrays
+X<array, tying>
+
+A class implementing a tied ordinary array should define the following
+methods: TIEARRAY, FETCH, STORE, FETCHSIZE, STORESIZE and perhaps UNTIE and/or DESTROY.
+
+FETCHSIZE and STORESIZE are used to provide C<$#array> and
+equivalent C<scalar(@array)> access.
+
+The methods POP, PUSH, SHIFT, UNSHIFT, SPLICE, DELETE, and EXISTS are
+required if the perl operator with the corresponding (but lowercase) name
+is to operate on the tied array. The B<Tie::Array> class can be used as a
+base class to implement the first five of these in terms of the basic
+methods above. The default implementations of DELETE and EXISTS in
+B<Tie::Array> simply C<croak>.
+
+In addition EXTEND will be called when perl would have pre-extended
+allocation in a real array.
+
+For this discussion, we'll implement an array whose elements are a fixed
+size at creation. If you try to create an element larger than the fixed
+size, you'll take an exception. For example:
+
+ use FixedElem_Array;
+ tie @array, 'FixedElem_Array', 3;
+ $array[0] = 'cat'; # ok.
+ $array[1] = 'dogs'; # exception, length('dogs') > 3.
+
+The preamble code for the class is as follows:
+
+ package FixedElem_Array;
+ use Carp;
+ use strict;
+
+=over 4
+
+=item TIEARRAY classname, LIST
+X<TIEARRAY>
+
+This is the constructor for the class. That means it is expected to
+return a blessed reference through which the new array (probably an
+anonymous ARRAY ref) will be accessed.
+
+In our example, just to show you that you don't I<really> have to return an
+ARRAY reference, we'll choose a HASH reference to represent our object.
+A HASH works out well as a generic record type: the C<{ELEMSIZE}> field will
+store the maximum element size allowed, and the C<{ARRAY}> field will hold the
+true ARRAY ref. If someone outside the class tries to dereference the
+object returned (doubtless thinking it an ARRAY ref), they'll blow up.
+This just goes to show you that you should respect an object's privacy.
+
+ sub TIEARRAY {
+ my $class = shift;
+ my $elemsize = shift;
+ if ( @_ || $elemsize =~ /\D/ ) {
+ croak "usage: tie ARRAY, '" . __PACKAGE__ . "', elem_size";
+ }
+ return bless {
+ ELEMSIZE => $elemsize,
+ ARRAY => [],
+ }, $class;
+ }
+
+=item FETCH this, index
+X<FETCH>
+
+This method will be triggered every time an individual element the tied array
+is accessed (read). It takes one argument beyond its self reference: the
+index whose value we're trying to fetch.
+
+ sub FETCH {
+ my $self = shift;
+ my $index = shift;
+ return $self->{ARRAY}->[$index];
+ }
+
+If a negative array index is used to read from an array, the index
+will be translated to a positive one internally by calling FETCHSIZE
+before being passed to FETCH. You may disable this feature by
+assigning a true value to the variable C<$NEGATIVE_INDICES> in the
+tied array class.
+
+As you may have noticed, the name of the FETCH method (et al.) is the same
+for all accesses, even though the constructors differ in names (TIESCALAR
+vs TIEARRAY). While in theory you could have the same class servicing
+several tied types, in practice this becomes cumbersome, and it's easiest
+to keep them at simply one tie type per class.
+
+=item STORE this, index, value
+X<STORE>
+
+This method will be triggered every time an element in the tied array is set
+(written). It takes two arguments beyond its self reference: the index at
+which we're trying to store something and the value we're trying to put
+there.
+
+In our example, C<undef> is really C<$self-E<gt>{ELEMSIZE}> number of
+spaces so we have a little more work to do here:
+
+ sub STORE {
+ my $self = shift;
+ my( $index, $value ) = @_;
+ if ( length $value > $self->{ELEMSIZE} ) {
+ croak "length of $value is greater than $self->{ELEMSIZE}";
+ }
+ # fill in the blanks
+ $self->EXTEND( $index ) if $index > $self->FETCHSIZE();
+ # right justify to keep element size for smaller elements
+ $self->{ARRAY}->[$index] = sprintf "%$self->{ELEMSIZE}s", $value;
+ }
+
+Negative indexes are treated the same as with FETCH.
+
+=item FETCHSIZE this
+X<FETCHSIZE>
+
+Returns the total number of items in the tied array associated with
+object I<this>. (Equivalent to C<scalar(@array)>). For example:
+
+ sub FETCHSIZE {
+ my $self = shift;
+ return scalar @{$self->{ARRAY}};
+ }
+
+=item STORESIZE this, count
+X<STORESIZE>
+
+Sets the total number of items in the tied array associated with
+object I<this> to be I<count>. If this makes the array larger then
+class's mapping of C<undef> should be returned for new positions.
+If the array becomes smaller then entries beyond count should be
+deleted.
+
+In our example, 'undef' is really an element containing
+C<$self-E<gt>{ELEMSIZE}> number of spaces. Observe:
+
+ sub STORESIZE {
+ my $self = shift;
+ my $count = shift;
+ if ( $count > $self->FETCHSIZE() ) {
+ foreach ( $count - $self->FETCHSIZE() .. $count ) {
+ $self->STORE( $_, '' );
+ }
+ } elsif ( $count < $self->FETCHSIZE() ) {
+ foreach ( 0 .. $self->FETCHSIZE() - $count - 2 ) {
+ $self->POP();
+ }
+ }
+ }
+
+=item EXTEND this, count
+X<EXTEND>
+
+Informative call that array is likely to grow to have I<count> entries.
+Can be used to optimize allocation. This method need do nothing.
+
+In our example, we want to make sure there are no blank (C<undef>)
+entries, so C<EXTEND> will make use of C<STORESIZE> to fill elements
+as needed:
+
+ sub EXTEND {
+ my $self = shift;
+ my $count = shift;
+ $self->STORESIZE( $count );
+ }
+
+=item EXISTS this, key
+X<EXISTS>
+
+Verify that the element at index I<key> exists in the tied array I<this>.
+
+In our example, we will determine that if an element consists of
+C<$self-E<gt>{ELEMSIZE}> spaces only, it does not exist:
+
+ sub EXISTS {
+ my $self = shift;
+ my $index = shift;
+ return 0 if ! defined $self->{ARRAY}->[$index] ||
+ $self->{ARRAY}->[$index] eq ' ' x $self->{ELEMSIZE};
+ return 1;
+ }
+
+=item DELETE this, key
+X<DELETE>
+
+Delete the element at index I<key> from the tied array I<this>.
+
+In our example, a deleted item is C<$self-E<gt>{ELEMSIZE}> spaces:
+
+ sub DELETE {
+ my $self = shift;
+ my $index = shift;
+ return $self->STORE( $index, '' );
+ }
+
+=item CLEAR this
+X<CLEAR>
+
+Clear (remove, delete, ...) all values from the tied array associated with
+object I<this>. For example:
+
+ sub CLEAR {
+ my $self = shift;
+ return $self->{ARRAY} = [];
+ }
+
+=item PUSH this, LIST
+X<PUSH>
+
+Append elements of I<LIST> to the array. For example:
+
+ sub PUSH {
+ my $self = shift;
+ my @list = @_;
+ my $last = $self->FETCHSIZE();
+ $self->STORE( $last + $_, $list[$_] ) foreach 0 .. $#list;
+ return $self->FETCHSIZE();
+ }
+
+=item POP this
+X<POP>
+
+Remove last element of the array and return it. For example:
+
+ sub POP {
+ my $self = shift;
+ return pop @{$self->{ARRAY}};
+ }
+
+=item SHIFT this
+X<SHIFT>
+
+Remove the first element of the array (shifting other elements down)
+and return it. For example:
+
+ sub SHIFT {
+ my $self = shift;
+ return shift @{$self->{ARRAY}};
+ }
+
+=item UNSHIFT this, LIST
+X<UNSHIFT>
+
+Insert LIST elements at the beginning of the array, moving existing elements
+up to make room. For example:
+
+ sub UNSHIFT {
+ my $self = shift;
+ my @list = @_;
+ my $size = scalar( @list );
+ # make room for our list
+ @{$self->{ARRAY}}[ $size .. $#{$self->{ARRAY}} + $size ]
+ = @{$self->{ARRAY}};
+ $self->STORE( $_, $list[$_] ) foreach 0 .. $#list;
+ }
+
+=item SPLICE this, offset, length, LIST
+X<SPLICE>
+
+Perform the equivalent of C<splice> on the array.
+
+I<offset> is optional and defaults to zero, negative values count back
+from the end of the array.
+
+I<length> is optional and defaults to rest of the array.
+
+I<LIST> may be empty.
+
+Returns a list of the original I<length> elements at I<offset>.
+
+In our example, we'll use a little shortcut if there is a I<LIST>:
+
+ sub SPLICE {
+ my $self = shift;
+ my $offset = shift || 0;
+ my $length = shift || $self->FETCHSIZE() - $offset;
+ my @list = ();
+ if ( @_ ) {
+ tie @list, __PACKAGE__, $self->{ELEMSIZE};
+ @list = @_;
+ }
+ return splice @{$self->{ARRAY}}, $offset, $length, @list;
+ }
+
+=item UNTIE this
+X<UNTIE>
+
+Will be called when C<untie> happens. (See L<The C<untie> Gotcha> below.)
+
+=item DESTROY this
+X<DESTROY>
+
+This method will be triggered when the tied variable needs to be destructed.
+As with the scalar tie class, this is almost never needed in a
+language that does its own garbage collection, so this time we'll
+just leave it out.
+
+=back
+
+=head2 Tying Hashes
+X<hash, tying>
+
+Hashes were the first Perl data type to be tied (see dbmopen()). A class
+implementing a tied hash should define the following methods: TIEHASH is
+the constructor. FETCH and STORE access the key and value pairs. EXISTS
+reports whether a key is present in the hash, and DELETE deletes one.
+CLEAR empties the hash by deleting all the key and value pairs. FIRSTKEY
+and NEXTKEY implement the keys() and each() functions to iterate over all
+the keys. SCALAR is triggered when the tied hash is evaluated in scalar
+context. UNTIE is called when C<untie> happens, and DESTROY is called when
+the tied variable is garbage collected.
+
+If this seems like a lot, then feel free to inherit from merely the
+standard Tie::StdHash module for most of your methods, redefining only the
+interesting ones. See L<Tie::Hash> for details.
+
+Remember that Perl distinguishes between a key not existing in the hash,
+and the key existing in the hash but having a corresponding value of
+C<undef>. The two possibilities can be tested with the C<exists()> and
+C<defined()> functions.
+
+Here's an example of a somewhat interesting tied hash class: it gives you
+a hash representing a particular user's dot files. You index into the hash
+with the name of the file (minus the dot) and you get back that dot file's
+contents. For example:
+
+ use DotFiles;
+ tie %dot, 'DotFiles';
+ if ( $dot{profile} =~ /MANPATH/ ||
+ $dot{login} =~ /MANPATH/ ||
+ $dot{cshrc} =~ /MANPATH/ )
+ {
+ print "you seem to set your MANPATH\n";
+ }
+
+Or here's another sample of using our tied class:
+
+ tie %him, 'DotFiles', 'daemon';
+ foreach $f ( keys %him ) {
+ printf "daemon dot file %s is size %d\n",
+ $f, length $him{$f};
+ }
+
+In our tied hash DotFiles example, we use a regular
+hash for the object containing several important
+fields, of which only the C<{LIST}> field will be what the
+user thinks of as the real hash.
+
+=over 5
+
+=item USER
+
+whose dot files this object represents
+
+=item HOME
+
+where those dot files live
+
+=item CLOBBER
+
+whether we should try to change or remove those dot files
+
+=item LIST
+
+the hash of dot file names and content mappings
+
+=back
+
+Here's the start of F<Dotfiles.pm>:
+
+ package DotFiles;
+ use Carp;
+ sub whowasi { (caller(1))[3] . '()' }
+ my $DEBUG = 0;
+ sub debug { $DEBUG = @_ ? shift : 1 }
+
+For our example, we want to be able to emit debugging info to help in tracing
+during development. We keep also one convenience function around
+internally to help print out warnings; whowasi() returns the function name
+that calls it.
+
+Here are the methods for the DotFiles tied hash.
+
+=over 4
+
+=item TIEHASH classname, LIST
+X<TIEHASH>
+
+This is the constructor for the class. That means it is expected to
+return a blessed reference through which the new object (probably but not
+necessarily an anonymous hash) will be accessed.
+
+Here's the constructor:
+
+ sub TIEHASH {
+ my $self = shift;
+ my $user = shift || $>;
+ my $dotdir = shift || '';
+ croak "usage: @{[&whowasi]} [USER [DOTDIR]]" if @_;
+ $user = getpwuid($user) if $user =~ /^\d+$/;
+ my $dir = (getpwnam($user))[7]
+ || croak "@{[&whowasi]}: no user $user";
+ $dir .= "/$dotdir" if $dotdir;
+
+ my $node = {
+ USER => $user,
+ HOME => $dir,
+ LIST => {},
+ CLOBBER => 0,
+ };
+
+ opendir(DIR, $dir)
+ || croak "@{[&whowasi]}: can't opendir $dir: $!";
+ foreach $dot ( grep /^\./ && -f "$dir/$_", readdir(DIR)) {
+ $dot =~ s/^\.//;
+ $node->{LIST}{$dot} = undef;
+ }
+ closedir DIR;
+ return bless $node, $self;
+ }
+
+It's probably worth mentioning that if you're going to filetest the
+return values out of a readdir, you'd better prepend the directory
+in question. Otherwise, because we didn't chdir() there, it would
+have been testing the wrong file.
+
+=item FETCH this, key
+X<FETCH>
+
+This method will be triggered every time an element in the tied hash is
+accessed (read). It takes one argument beyond its self reference: the key
+whose value we're trying to fetch.
+
+Here's the fetch for our DotFiles example.
+
+ sub FETCH {
+ carp &whowasi if $DEBUG;
+ my $self = shift;
+ my $dot = shift;
+ my $dir = $self->{HOME};
+ my $file = "$dir/.$dot";
+
+ unless (exists $self->{LIST}->{$dot} || -f $file) {
+ carp "@{[&whowasi]}: no $dot file" if $DEBUG;
+ return undef;
+ }
+
+ if (defined $self->{LIST}->{$dot}) {
+ return $self->{LIST}->{$dot};
+ } else {
+ return $self->{LIST}->{$dot} = `cat $dir/.$dot`;
+ }
+ }
+
+It was easy to write by having it call the Unix cat(1) command, but it
+would probably be more portable to open the file manually (and somewhat
+more efficient). Of course, because dot files are a Unixy concept, we're
+not that concerned.
+
+=item STORE this, key, value
+X<STORE>
+
+This method will be triggered every time an element in the tied hash is set
+(written). It takes two arguments beyond its self reference: the index at
+which we're trying to store something, and the value we're trying to put
+there.
+
+Here in our DotFiles example, we'll be careful not to let
+them try to overwrite the file unless they've called the clobber()
+method on the original object reference returned by tie().
+
+ sub STORE {
+ carp &whowasi if $DEBUG;
+ my $self = shift;
+ my $dot = shift;
+ my $value = shift;
+ my $file = $self->{HOME} . "/.$dot";
+ my $user = $self->{USER};
+
+ croak "@{[&whowasi]}: $file not clobberable"
+ unless $self->{CLOBBER};
+
+ open(F, "> $file") || croak "can't open $file: $!";
+ print F $value;
+ close(F);
+ }
+
+If they wanted to clobber something, they might say:
+
+ $ob = tie %daemon_dots, 'daemon';
+ $ob->clobber(1);
+ $daemon_dots{signature} = "A true daemon\n";
+
+Another way to lay hands on a reference to the underlying object is to
+use the tied() function, so they might alternately have set clobber
+using:
+
+ tie %daemon_dots, 'daemon';
+ tied(%daemon_dots)->clobber(1);
+
+The clobber method is simply:
+
+ sub clobber {
+ my $self = shift;
+ $self->{CLOBBER} = @_ ? shift : 1;
+ }
+
+=item DELETE this, key
+X<DELETE>
+
+This method is triggered when we remove an element from the hash,
+typically by using the delete() function. Again, we'll
+be careful to check whether they really want to clobber files.
+
+ sub DELETE {
+ carp &whowasi if $DEBUG;
+
+ my $self = shift;
+ my $dot = shift;
+ my $file = $self->{HOME} . "/.$dot";
+ croak "@{[&whowasi]}: won't remove file $file"
+ unless $self->{CLOBBER};
+ delete $self->{LIST}->{$dot};
+ my $success = unlink($file);
+ carp "@{[&whowasi]}: can't unlink $file: $!" unless $success;
+ $success;
+ }
+
+The value returned by DELETE becomes the return value of the call
+to delete(). If you want to emulate the normal behavior of delete(),
+you should return whatever FETCH would have returned for this key.
+In this example, we have chosen instead to return a value which tells
+the caller whether the file was successfully deleted.
+
+=item CLEAR this
+X<CLEAR>
+
+This method is triggered when the whole hash is to be cleared, usually by
+assigning the empty list to it.
+
+In our example, that would remove all the user's dot files! It's such a
+dangerous thing that they'll have to set CLOBBER to something higher than
+1 to make it happen.
+
+ sub CLEAR {
+ carp &whowasi if $DEBUG;
+ my $self = shift;
+ croak "@{[&whowasi]}: won't remove all dot files for $self->{USER}"
+ unless $self->{CLOBBER} > 1;
+ my $dot;
+ foreach $dot ( keys %{$self->{LIST}}) {
+ $self->DELETE($dot);
+ }
+ }
+
+=item EXISTS this, key
+X<EXISTS>
+
+This method is triggered when the user uses the exists() function
+on a particular hash. In our example, we'll look at the C<{LIST}>
+hash element for this:
+
+ sub EXISTS {
+ carp &whowasi if $DEBUG;
+ my $self = shift;
+ my $dot = shift;
+ return exists $self->{LIST}->{$dot};
+ }
+
+=item FIRSTKEY this
+X<FIRSTKEY>
+
+This method will be triggered when the user is going
+to iterate through the hash, such as via a keys() or each()
+call.
+
+ sub FIRSTKEY {
+ carp &whowasi if $DEBUG;
+ my $self = shift;
+ my $a = keys %{$self->{LIST}}; # reset each() iterator
+ each %{$self->{LIST}}
+ }
+
+=item NEXTKEY this, lastkey
+X<NEXTKEY>
+
+This method gets triggered during a keys() or each() iteration. It has a
+second argument which is the last key that had been accessed. This is
+useful if you're carrying about ordering or calling the iterator from more
+than one sequence, or not really storing things in a hash anywhere.
+
+For our example, we're using a real hash so we'll do just the simple
+thing, but we'll have to go through the LIST field indirectly.
+
+ sub NEXTKEY {
+ carp &whowasi if $DEBUG;
+ my $self = shift;
+ return each %{ $self->{LIST} }
+ }
+
+=item SCALAR this
+X<SCALAR>
+
+This is called when the hash is evaluated in scalar context. In order
+to mimic the behaviour of untied hashes, this method should return a
+false value when the tied hash is considered empty. If this method does
+not exist, perl will make some educated guesses and return true when
+the hash is inside an iteration. If this isn't the case, FIRSTKEY is
+called, and the result will be a false value if FIRSTKEY returns the empty
+list, true otherwise.
+
+However, you should B<not> blindly rely on perl always doing the right
+thing. Particularly, perl will mistakenly return true when you clear the
+hash by repeatedly calling DELETE until it is empty. You are therefore
+advised to supply your own SCALAR method when you want to be absolutely
+sure that your hash behaves nicely in scalar context.
+
+In our example we can just call C<scalar> on the underlying hash
+referenced by C<$self-E<gt>{LIST}>:
+
+ sub SCALAR {
+ carp &whowasi if $DEBUG;
+ my $self = shift;
+ return scalar %{ $self->{LIST} }
+ }
+
+=item UNTIE this
+X<UNTIE>
+
+This is called when C<untie> occurs. See L<The C<untie> Gotcha> below.
+
+=item DESTROY this
+X<DESTROY>
+
+This method is triggered when a tied hash is about to go out of
+scope. You don't really need it unless you're trying to add debugging
+or have auxiliary state to clean up. Here's a very simple function:
+
+ sub DESTROY {
+ carp &whowasi if $DEBUG;
+ }
+
+=back
+
+Note that functions such as keys() and values() may return huge lists
+when used on large objects, like DBM files. You may prefer to use the
+each() function to iterate over such. Example:
+
+ # print out history file offsets
+ use NDBM_File;
+ tie(%HIST, 'NDBM_File', '/usr/lib/news/history', 1, 0);
+ while (($key,$val) = each %HIST) {
+ print $key, ' = ', unpack('L',$val), "\n";
+ }
+ untie(%HIST);
+
+=head2 Tying FileHandles
+X<filehandle, tying>
+
+This is partially implemented now.
+
+A class implementing a tied filehandle should define the following
+methods: TIEHANDLE, at least one of PRINT, PRINTF, WRITE, READLINE, GETC,
+READ, and possibly CLOSE, UNTIE and DESTROY. The class can also provide: BINMODE,
+OPEN, EOF, FILENO, SEEK, TELL - if the corresponding perl operators are
+used on the handle.
+
+When STDERR is tied, its PRINT method will be called to issue warnings
+and error messages. This feature is temporarily disabled during the call,
+which means you can use C<warn()> inside PRINT without starting a recursive
+loop. And just like C<__WARN__> and C<__DIE__> handlers, STDERR's PRINT
+method may be called to report parser errors, so the caveats mentioned under
+L<perlvar/%SIG> apply.
+
+All of this is especially useful when perl is embedded in some other
+program, where output to STDOUT and STDERR may have to be redirected
+in some special way. See nvi and the Apache module for examples.
+
+In our example we're going to create a shouting handle.
+
+ package Shout;
+
+=over 4
+
+=item TIEHANDLE classname, LIST
+X<TIEHANDLE>
+
+This is the constructor for the class. That means it is expected to
+return a blessed reference of some sort. The reference can be used to
+hold some internal information.
+
+ sub TIEHANDLE { print "<shout>\n"; my $i; bless \$i, shift }
+
+=item WRITE this, LIST
+X<WRITE>
+
+This method will be called when the handle is written to via the
+C<syswrite> function.
+
+ sub WRITE {
+ $r = shift;
+ my($buf,$len,$offset) = @_;
+ print "WRITE called, \$buf=$buf, \$len=$len, \$offset=$offset";
+ }
+
+=item PRINT this, LIST
+X<PRINT>
+
+This method will be triggered every time the tied handle is printed to
+with the C<print()> or C<say()> functions. Beyond its self reference
+it also expects the list that was passed to the print function.
+
+ sub PRINT { $r = shift; $$r++; print join($,,map(uc($_),@_)),$\ }
+
+C<say()> acts just like C<print()> except $\ will be localized to C<\n> so
+you need do nothing special to handle C<say()> in C<PRINT()>.
+
+=item PRINTF this, LIST
+X<PRINTF>
+
+This method will be triggered every time the tied handle is printed to
+with the C<printf()> function.
+Beyond its self reference it also expects the format and list that was
+passed to the printf function.
+
+ sub PRINTF {
+ shift;
+ my $fmt = shift;
+ print sprintf($fmt, @_);
+ }
+
+=item READ this, LIST
+X<READ>
+
+This method will be called when the handle is read from via the C<read>
+or C<sysread> functions.
+
+ sub READ {
+ my $self = shift;
+ my $bufref = \$_[0];
+ my(undef,$len,$offset) = @_;
+ print "READ called, \$buf=$bufref, \$len=$len, \$offset=$offset";
+ # add to $$bufref, set $len to number of characters read
+ $len;
+ }
+
+=item READLINE this
+X<READLINE>
+
+This method will be called when the handle is read from via <HANDLE>.
+The method should return undef when there is no more data.
+
+ sub READLINE { $r = shift; "READLINE called $$r times\n"; }
+
+=item GETC this
+X<GETC>
+
+This method will be called when the C<getc> function is called.
+
+ sub GETC { print "Don't GETC, Get Perl"; return "a"; }
+
+=item CLOSE this
+X<CLOSE>
+
+This method will be called when the handle is closed via the C<close>
+function.
+
+ sub CLOSE { print "CLOSE called.\n" }
+
+=item UNTIE this
+X<UNTIE>
+
+As with the other types of ties, this method will be called when C<untie> happens.
+It may be appropriate to "auto CLOSE" when this occurs. See
+L<The C<untie> Gotcha> below.
+
+=item DESTROY this
+X<DESTROY>
+
+As with the other types of ties, this method will be called when the
+tied handle is about to be destroyed. This is useful for debugging and
+possibly cleaning up.
+
+ sub DESTROY { print "</shout>\n" }
+
+=back
+
+Here's how to use our little example:
+
+ tie(*FOO,'Shout');
+ print FOO "hello\n";
+ $a = 4; $b = 6;
+ print FOO $a, " plus ", $b, " equals ", $a + $b, "\n";
+ print <FOO>;
+
+=head2 UNTIE this
+X<UNTIE>
+
+You can define for all tie types an UNTIE method that will be called
+at untie(). See L<The C<untie> Gotcha> below.
+
+=head2 The C<untie> Gotcha
+X<untie>
+
+If you intend making use of the object returned from either tie() or
+tied(), and if the tie's target class defines a destructor, there is a
+subtle gotcha you I<must> guard against.
+
+As setup, consider this (admittedly rather contrived) example of a
+tie; all it does is use a file to keep a log of the values assigned to
+a scalar.
+
+ package Remember;
+
+ use strict;
+ use warnings;
+ use IO::File;
+
+ sub TIESCALAR {
+ my $class = shift;
+ my $filename = shift;
+ my $handle = IO::File->new( "> $filename" )
+ or die "Cannot open $filename: $!\n";
+
+ print $handle "The Start\n";
+ bless {FH => $handle, Value => 0}, $class;
+ }
+
+ sub FETCH {
+ my $self = shift;
+ return $self->{Value};
+ }
+
+ sub STORE {
+ my $self = shift;
+ my $value = shift;
+ my $handle = $self->{FH};
+ print $handle "$value\n";
+ $self->{Value} = $value;
+ }
+
+ sub DESTROY {
+ my $self = shift;
+ my $handle = $self->{FH};
+ print $handle "The End\n";
+ close $handle;
+ }
+
+ 1;
+
+Here is an example that makes use of this tie:
+
+ use strict;
+ use Remember;
+
+ my $fred;
+ tie $fred, 'Remember', 'myfile.txt';
+ $fred = 1;
+ $fred = 4;
+ $fred = 5;
+ untie $fred;
+ system "cat myfile.txt";
+
+This is the output when it is executed:
+
+ The Start
+ 1
+ 4
+ 5
+ The End
+
+So far so good. Those of you who have been paying attention will have
+spotted that the tied object hasn't been used so far. So lets add an
+extra method to the Remember class to allow comments to be included in
+the file -- say, something like this:
+
+ sub comment {
+ my $self = shift;
+ my $text = shift;
+ my $handle = $self->{FH};
+ print $handle $text, "\n";
+ }
+
+And here is the previous example modified to use the C<comment> method
+(which requires the tied object):
+
+ use strict;
+ use Remember;
+
+ my ($fred, $x);
+ $x = tie $fred, 'Remember', 'myfile.txt';
+ $fred = 1;
+ $fred = 4;
+ comment $x "changing...";
+ $fred = 5;
+ untie $fred;
+ system "cat myfile.txt";
+
+When this code is executed there is no output. Here's why:
+
+When a variable is tied, it is associated with the object which is the
+return value of the TIESCALAR, TIEARRAY, or TIEHASH function. This
+object normally has only one reference, namely, the implicit reference
+from the tied variable. When untie() is called, that reference is
+destroyed. Then, as in the first example above, the object's
+destructor (DESTROY) is called, which is normal for objects that have
+no more valid references; and thus the file is closed.
+
+In the second example, however, we have stored another reference to
+the tied object in $x. That means that when untie() gets called
+there will still be a valid reference to the object in existence, so
+the destructor is not called at that time, and thus the file is not
+closed. The reason there is no output is because the file buffers
+have not been flushed to disk.
+
+Now that you know what the problem is, what can you do to avoid it?
+Prior to the introduction of the optional UNTIE method the only way
+was the good old C<-w> flag. Which will spot any instances where you call
+untie() and there are still valid references to the tied object. If
+the second script above this near the top C<use warnings 'untie'>
+or was run with the C<-w> flag, Perl prints this
+warning message:
+
+ untie attempted while 1 inner references still exist
+
+To get the script to work properly and silence the warning make sure
+there are no valid references to the tied object I<before> untie() is
+called:
+
+ undef $x;
+ untie $fred;
+
+Now that UNTIE exists the class designer can decide which parts of the
+class functionality are really associated with C<untie> and which with
+the object being destroyed. What makes sense for a given class depends
+on whether the inner references are being kept so that non-tie-related
+methods can be called on the object. But in most cases it probably makes
+sense to move the functionality that would have been in DESTROY to the UNTIE
+method.
+
+If the UNTIE method exists then the warning above does not occur. Instead the
+UNTIE method is passed the count of "extra" references and can issue its own
+warning if appropriate. e.g. to replicate the no UNTIE case this method can
+be used:
+
+ sub UNTIE
+ {
+ my ($obj,$count) = @_;
+ carp "untie attempted while $count inner references still exist" if $count;
+ }
+
+=head1 SEE ALSO
+
+See L<DB_File> or L<Config> for some interesting tie() implementations.
+A good starting point for many tie() implementations is with one of the
+modules L<Tie::Scalar>, L<Tie::Array>, L<Tie::Hash>, or L<Tie::Handle>.
+
+=head1 BUGS
+
+The bucket usage information provided by C<scalar(%hash)> is not
+available. What this means is that using %tied_hash in boolean
+context doesn't work right (currently this always tests false,
+regardless of whether the hash is empty or hash elements).
+
+Localizing tied arrays or hashes does not work. After exiting the
+scope the arrays or the hashes are not restored.
+
+Counting the number of entries in a hash via C<scalar(keys(%hash))>
+or C<scalar(values(%hash)>) is inefficient since it needs to iterate
+through all the entries with FIRSTKEY/NEXTKEY.
+
+Tied hash/array slices cause multiple FETCH/STORE pairs, there are no
+tie methods for slice operations.
+
+You cannot easily tie a multilevel data structure (such as a hash of
+hashes) to a dbm file. The first problem is that all but GDBM and
+Berkeley DB have size limitations, but beyond that, you also have problems
+with how references are to be represented on disk. One
+module that does attempt to address this need is DBM::Deep. Check your
+nearest CPAN site as described in L<perlmodlib> for source code. Note
+that despite its name, DBM::Deep does not use dbm. Another earlier attempt
+at solving the problem is MLDBM, which is also available on the CPAN, but
+which has some fairly serious limitations.
+
+Tied filehandles are still incomplete. sysopen(), truncate(),
+flock(), fcntl(), stat() and -X can't currently be trapped.
+
+=head1 AUTHOR
+
+Tom Christiansen
+
+TIEHANDLE by Sven Verdoolaege <F<skimo@dns.ufsia.ac.be>> and Doug MacEachern <F<dougm@osf.org>>
+
+UNTIE by Nick Ing-Simmons <F<nick@ing-simmons.net>>
+
+SCALAR by Tassilo von Parseval <F<tassilo.von.parseval@rwth-aachen.de>>
+
+Tying Arrays by Casey West <F<casey@geeknest.com>>
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perltoc.pod b/Master/tlpkg/tlperl.straw/lib/pods/perltoc.pod
new file mode 100755
index 00000000000..88804e3ec1e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perltoc.pod
@@ -0,0 +1,38976 @@
+
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is autogenerated by buildtoc from all the other pods.
+# Edit those files and run buildtoc --build-toc to effect changes.
+
+=head1 NAME
+
+perltoc - perl documentation table of contents
+
+=head1 DESCRIPTION
+
+This page provides a brief table of contents for the rest of the Perl
+documentation set. It is meant to be scanned quickly or grepped
+through to locate the proper section you're looking for.
+
+=head1 BASIC DOCUMENTATION
+
+=head2 perl - Practical Extraction and Report Language
+
+=over 4
+
+=item SYNOPSIS
+
+=over 4
+
+=item Overview
+
+=item Tutorials
+
+=item Reference Manual
+
+=item Internals and C Language Interface
+
+=item Miscellaneous
+
+=item Language-Specific
+
+=item Platform-Specific
+
+=back
+
+=item DESCRIPTION
+
+=item AVAILABILITY
+
+=item ENVIRONMENT
+
+=item AUTHOR
+
+=item FILES
+
+=item SEE ALSO
+
+=item DIAGNOSTICS
+
+=item BUGS
+
+=item NOTES
+
+=back
+
+=head2 perlintro -- a brief introduction and overview of Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item What is Perl?
+
+=item Running Perl programs
+
+=item Safety net
+
+=item Basic syntax overview
+
+=item Perl variable types
+
+Scalars, Arrays, Hashes
+
+=item Variable scoping
+
+=item Conditional and looping constructs
+
+if, while, for, foreach
+
+=item Builtin operators and functions
+
+Arithmetic, Numeric comparison, String comparison, Boolean logic,
+Miscellaneous
+
+=item Files and I/O
+
+=item Regular expressions
+
+Simple matching, Simple substitution, More complex regular expressions,
+Parentheses for capturing, Other regexp features
+
+=item Writing subroutines
+
+=item OO Perl
+
+=item Using Perl modules
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlreftut - Mark's very short tutorial about references
+
+=over 4
+
+=item DESCRIPTION
+
+=item Who Needs Complicated Data Structures?
+
+=item The Solution
+
+=item Syntax
+
+=over 4
+
+=item Making References
+
+=item Using References
+
+=item An Example
+
+=item Arrow Rule
+
+=back
+
+=item Solution
+
+=item The Rest
+
+=item Summary
+
+=item Credits
+
+=over 4
+
+=item Distribution Conditions
+
+=back
+
+=back
+
+=head2 perldsc - Perl Data Structures Cookbook
+
+=over 4
+
+=item DESCRIPTION
+
+arrays of arrays, hashes of arrays, arrays of hashes, hashes of hashes,
+more elaborate constructs
+
+=item REFERENCES
+X<reference> X<dereference> X<dereferencing> X<pointer>
+
+=item COMMON MISTAKES
+
+=item CAVEAT ON PRECEDENCE
+X<dereference, precedence> X<dereferencing, precedence>
+
+=item WHY YOU SHOULD ALWAYS C<use strict>
+
+=item DEBUGGING
+X<data structure, debugging> X<complex data structure, debugging>
+X<AoA, debugging> X<HoA, debugging> X<AoH, debugging> X<HoH, debugging>
+X<array of arrays, debugging> X<hash of arrays, debugging>
+X<array of hashes, debugging> X<hash of hashes, debugging>
+
+=item CODE EXAMPLES
+
+=item ARRAYS OF ARRAYS
+X<array of arrays> X<AoA>
+
+=over 4
+
+=item Declaration of an ARRAY OF ARRAYS
+
+=item Generation of an ARRAY OF ARRAYS
+
+=item Access and Printing of an ARRAY OF ARRAYS
+
+=back
+
+=item HASHES OF ARRAYS
+X<hash of arrays> X<HoA>
+
+=over 4
+
+=item Declaration of a HASH OF ARRAYS
+
+=item Generation of a HASH OF ARRAYS
+
+=item Access and Printing of a HASH OF ARRAYS
+
+=back
+
+=item ARRAYS OF HASHES
+X<array of hashes> X<AoH>
+
+=over 4
+
+=item Declaration of an ARRAY OF HASHES
+
+=item Generation of an ARRAY OF HASHES
+
+=item Access and Printing of an ARRAY OF HASHES
+
+=back
+
+=item HASHES OF HASHES
+X<hash of hashes> X<HoH>
+
+=over 4
+
+=item Declaration of a HASH OF HASHES
+
+=item Generation of a HASH OF HASHES
+
+=item Access and Printing of a HASH OF HASHES
+
+=back
+
+=item MORE ELABORATE RECORDS
+X<record> X<structure> X<struct>
+
+=over 4
+
+=item Declaration of MORE ELABORATE RECORDS
+
+=item Declaration of a HASH OF COMPLEX RECORDS
+
+=item Generation of a HASH OF COMPLEX RECORDS
+
+=back
+
+=item Database Ties
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perllol - Manipulating Arrays of Arrays in Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Declaration and Access of Arrays of Arrays
+
+=item Growing Your Own
+
+=item Access and Printing
+
+=item Slices
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perlrequick - Perl regular expressions quick start
+
+=over 4
+
+=item DESCRIPTION
+
+=item The Guide
+
+=over 4
+
+=item Simple word matching
+
+=item Using character classes
+
+=item Matching this or that
+
+=item Grouping things and hierarchical matching
+
+=item Extracting matches
+
+=item Matching repetitions
+
+=item More matching
+
+=item Search and replace
+
+=item The split operator
+
+=back
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHOR AND COPYRIGHT
+
+=over 4
+
+=item Acknowledgments
+
+=back
+
+=back
+
+=head2 perlretut - Perl regular expressions tutorial
+
+=over 4
+
+=item DESCRIPTION
+
+=item Part 1: The basics
+
+=over 4
+
+=item Simple word matching
+
+=item Using character classes
+
+=item Matching this or that
+
+=item Grouping things and hierarchical matching
+
+=item Extracting matches
+
+=item Backreferences
+
+=item Relative backreferences
+
+=item Named backreferences
+
+=item Alternative capture group numbering
+
+=item Position information
+
+=item Non-capturing groupings
+
+=item Matching repetitions
+
+=item Possessive quantifiers
+
+=item Building a regexp
+
+=item Using regular expressions in Perl
+
+=back
+
+=item Part 2: Power tools
+
+=over 4
+
+=item More on characters, strings, and character classes
+
+=item Compiling and saving regular expressions
+
+=item Composing regular expressions at runtime
+
+=item Embedding comments and modifiers in a regular expression
+
+=item Looking ahead and looking behind
+
+=item Using independent subexpressions to prevent backtracking
+
+=item Conditional expressions
+
+=item Defining named patterns
+
+=item Recursive patterns
+
+=item A bit of magic: executing Perl code in a regular expression
+
+=item Backtracking control verbs
+
+=item Pragmas and debugging
+
+=back
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHOR AND COPYRIGHT
+
+=over 4
+
+=item Acknowledgments
+
+=back
+
+=back
+
+=head2 perlboot - Beginner's Object-Oriented Tutorial
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item If we could talk to the animals...
+
+=item Introducing the method invocation arrow
+
+=item Invoking a barnyard
+
+=item The extra parameter of method invocation
+
+=item Calling a second method to simplify things
+
+=item Inheriting the windpipes
+
+=item A few notes about @ISA
+
+=item Overriding the methods
+
+=item Starting the search from a different place
+
+=item The SUPER way of doing things
+
+=item Let's review...
+
+=item A horse is a horse, of course of course -- or is it?
+
+=item Invoking an instance method
+
+=item Accessing the instance data
+
+=item How to build a horse
+
+=item Inheriting the constructor
+
+=item Making a method work with either classes or instances
+
+=item Adding parameters to a method
+
+=item More interesting instances
+
+=item A horse of a different color
+
+=item Summary
+
+=back
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 perltoot - Tom's object-oriented tutorial for perl
+
+=over 4
+
+=item DESCRIPTION
+
+=item Creating a Class
+
+=over 4
+
+=item Object Representation
+
+=item Class Interface
+
+=item Constructors and Instance Methods
+
+=item Planning for the Future: Better Constructors
+
+=item Destructors
+
+=item Other Object Methods
+
+=back
+
+=item Class Data
+
+=over 4
+
+=item Accessing Class Data
+
+=item Debugging Methods
+
+=item Class Destructors
+
+=item Documenting the Interface
+
+=back
+
+=item Aggregation
+
+=item Inheritance
+
+=over 4
+
+=item Overridden Methods
+
+=item Multiple Inheritance
+
+=item UNIVERSAL: The Root of All Objects
+
+=item Deeper UNIVERSAL details
+
+=back
+
+=item Alternate Object Representations
+
+=over 4
+
+=item Arrays as Objects
+
+=item Closures as Objects
+
+=back
+
+=item AUTOLOAD: Proxy Methods
+
+=over 4
+
+=item Autoloaded Data Methods
+
+=item Inherited Autoloaded Data Methods
+
+=back
+
+=item Metaclassical Tools
+
+=over 4
+
+=item Class::Struct
+
+=item Data Members as Variables
+
+=back
+
+=item NOTES
+
+=over 4
+
+=item Object Terminology
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR AND COPYRIGHT
+
+=item COPYRIGHT
+
+=over 4
+
+=item Acknowledgments
+
+=back
+
+=back
+
+=head2 perltooc - Tom's OO Tutorial for Class Data in Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=item Class Data in a Can
+
+=item Class Data as Package Variables
+
+=over 4
+
+=item Putting All Your Eggs in One Basket
+
+=item Inheritance Concerns
+
+=item The Eponymous Meta-Object
+
+=item Indirect References to Class Data
+
+=item Monadic Classes
+
+=item Translucent Attributes
+
+=back
+
+=item Class Data as Lexical Variables
+
+=over 4
+
+=item Privacy and Responsibility
+
+=item File-Scoped Lexicals
+
+=item More Inheritance Concerns
+
+=item Locking the Door and Throwing Away the Key
+
+=item Translucency Revisited
+
+=back
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR AND COPYRIGHT
+
+=item ACKNOWLEDGEMENTS
+
+=item HISTORY
+
+=back
+
+=head2 perlbot - Bag'o Object Tricks (the BOT)
+
+=over 4
+
+=item DESCRIPTION
+
+=item OO SCALING TIPS
+
+=item INSTANCE VARIABLES
+
+=item SCALAR INSTANCE VARIABLES
+
+=item INSTANCE VARIABLE INHERITANCE
+
+=item OBJECT RELATIONSHIPS
+
+=item OVERRIDING SUPERCLASS METHODS
+
+=item USING RELATIONSHIP WITH SDBM
+
+=item THINKING OF CODE REUSE
+
+=item CLASS CONTEXT AND THE OBJECT
+
+=item INHERITING A CONSTRUCTOR
+
+=item DELEGATION
+
+=item SEE ALSO
+
+=back
+
+=head2 perlperf - Perl Performance and Optimization Techniques
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERVIEW
+
+=over 4
+
+=item ONE STEP SIDEWAYS
+
+=item ONE STEP FORWARD
+
+=item ANOTHER STEP SIDEWAYS
+
+=back
+
+=item GENERAL GUIDELINES
+
+=item BENCHMARKS
+
+=over 4
+
+=item Assigning and Dereferencing Variables.
+
+=item Search and replace or tr
+
+=back
+
+=item PROFILING TOOLS
+
+=over 4
+
+=item Devel::DProf
+
+=item Devel::Profiler
+
+=item Devel::SmallProf
+
+=item Devel::FastProf
+
+=item Devel::NYTProf
+
+=back
+
+=item SORTING
+
+Elapsed Real Time, User CPU Time, System CPU Time
+
+=item LOGGING
+
+=over 4
+
+=item Logging if DEBUG (constant)
+
+=back
+
+=item POSTSCRIPT
+
+=item SEE ALSO
+
+=over 4
+
+=item PERLDOCS
+
+=item MAN PAGES
+
+=item MODULES
+
+=item URLS
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlstyle - Perl style guide
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 perlcheat - Perl 5 Cheat Sheet
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item The sheet
+
+=back
+
+=item ACKNOWLEDGEMENTS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perltrap - Perl traps for the unwary
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Awk Traps
+
+=item C/C++ Traps
+
+=item Sed Traps
+
+=item Shell Traps
+
+=item Perl Traps
+
+=item Perl4 to Perl5 Traps
+
+Discontinuance, Deprecation, and BugFix traps, Parsing Traps, Numerical
+Traps, General data type traps, Context Traps - scalar, list contexts,
+Precedence Traps, General Regular Expression Traps using s///, etc,
+Subroutine, Signal, Sorting Traps, OS Traps, DBM Traps, Unclassified Traps
+
+=item Discontinuance, Deprecation, and BugFix traps
+
+Symbols starting with "_" no longer forced into main, Double-colon valid
+package separator in variable name, 2nd and 3rd args to C<splice()> are now
+in scalar context, Can't do C<goto> into a block that is optimized away,
+Can't use whitespace as variable name or quote delimiter, C<while/if BLOCK
+BLOCK> gone, C<**> binds tighter than unary minus, C<foreach> changed when
+iterating over a list, C<split> with no args behavior changed, B<-e>
+behavior fixed, C<push> returns number of elements in resulting list, Some
+error messages differ, C<split()> honors subroutine args, Bugs removed
+
+=item Parsing Traps
+
+Space between . and = triggers syntax error, Better parsing in perl 5,
+Function parsing, String interpolation of C<$#array> differs, Perl guesses
+on C<map>, C<grep> followed by C<{> if it starts BLOCK or hash ref
+
+=item Numerical Traps
+
+Formatted output and significant digits, Auto-increment operator over
+signed int limit deleted, Assignment of return values from numeric equality
+tests doesn't work, Bitwise string ops
+
+=item General data type traps
+
+Negative array subscripts now count from the end of array, Setting
+C<$#array> lower now discards array elements, Hashes get defined before
+use, Glob assignment from localized variable to variable, Assigning
+C<undef> to glob, Changes in unary negation (of strings), Modifying of
+constants prohibited, C<defined $var> behavior changed, Variable Suicide
+
+=item Context Traps - scalar, list contexts
+
+Elements of argument lists for formats evaluated in list context,
+C<caller()> returns false value in scalar context if no caller present,
+Comma operator in scalar context gives scalar context to args, C<sprintf()>
+prototyped as C<($;@)>
+
+=item Precedence Traps
+
+LHS vs. RHS of any assignment operator, Semantic errors introduced due to
+precedence, Precedence of assignment operators same as the precedence of
+assignment, C<open> requires parentheses around filehandle, C<$:>
+precedence over C<$::> gone, Precedence of file test operators documented,
+C<keys>, C<each>, C<values> are regular named unary operators
+
+=item General Regular Expression Traps using s///, etc.
+
+C<s'$lhs'$rhs'> interpolates on either side, C<m//g> attaches its state to
+the searched string, C<m//o> used within an anonymous sub, C<$+> isn't set
+to whole match, Substitution now returns null string if it fails,
+C<s`lhs`rhs`> is now a normal substitution, Stricter parsing of variables
+in regular expressions, C<m?x?> matches only once, Failed matches don't
+reset the match variables
+
+=item Subroutine, Signal, Sorting Traps
+
+Barewords that used to look like strings look like subroutine calls,
+Reverse is no longer allowed as the name of a sort subroutine, C<warn()>
+won't let you specify a filehandle
+
+=item OS Traps
+
+SysV resets signal handler correctly, SysV C<seek()> appends correctly
+
+=item Interpolation Traps
+
+C<@> always interpolates an array in double-quotish strings, Double-quoted
+strings may no longer end with an unescaped $, Arbitrary expressions are
+evaluated inside braces within double quotes, C<$$x> now tries to
+dereference $x, Creation of hashes on the fly with C<eval "EXPR"> requires
+protection, Bugs in earlier perl versions, Array and hash brackets during
+interpolation, Interpolation of C<\$$foo{bar}>, C<qq()> string passed to
+C<eval> will not find string terminator
+
+=item DBM Traps
+
+Perl5 must have been linked with same dbm/ndbm as the default for
+C<dbmopen()>, DBM exceeding limit on the key/value size will cause perl5 to
+exit immediately
+
+=item Unclassified Traps
+
+C<require>/C<do> trap using returned value, C<split> on empty string with
+LIMIT specified
+
+=back
+
+=back
+
+=head2 perldebtut - Perl debugging tutorial
+
+=over 4
+
+=item DESCRIPTION
+
+=item use strict
+
+=item Looking at data and -w and v
+
+=item help
+
+=item Stepping through code
+
+=item Placeholder for a, w, t, T
+
+=item REGULAR EXPRESSIONS
+
+=item OUTPUT TIPS
+
+=item CGI
+
+=item GUIs
+
+=item SUMMARY
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item CONTRIBUTORS
+
+=back
+
+=head2 perlfaq - frequently asked questions about Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Where to get the perlfaq
+
+=item How to contribute to the perlfaq
+
+=item What will happen if you mail your Perl programming problems to the
+authors?
+
+=back
+
+=item CREDITS
+
+=item AUTHOR AND COPYRIGHT
+
+=item Table of Contents
+
+perlfaq - this document, perlfaq1 - General Questions About Perl, perlfaq2
+- Obtaining and Learning about Perl, perlfaq3 - Programming Tools, perlfaq4
+- Data Manipulation, perlfaq5 - Files and Formats, perlfaq6 - Regular
+Expressions, perlfaq7 - General Perl Language Issues, perlfaq8 - System
+Interaction, perlfaq9 - Networking
+
+=item The Questions
+
+=over 4
+
+=item L<perlfaq1>: General Questions About Perl
+
+=item L<perlfaq2>: Obtaining and Learning about Perl
+
+=item L<perlfaq3>: Programming Tools
+
+=item L<perlfaq4>: Data Manipulation
+
+=item L<perlfaq5>: Files and Formats
+
+=item L<perlfaq6>: Regular Expressions
+
+=item L<perlfaq7>: General Perl Language Issues
+
+=item L<perlfaq8>: System Interaction
+
+=item L<perlfaq9>: Networking
+
+=back
+
+=back
+
+=head2 perlfaq1 - General Questions About Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item What is Perl?
+
+=item Who supports Perl? Who develops it? Why is it free?
+
+=item Which version of Perl should I use?
+
+=item What are Perl 4, Perl 5, or Perl 6?
+
+=item What was Ponie?
+
+=item What is Perl 6?
+
+=item How stable is Perl?
+
+=item Is Perl difficult to learn?
+
+=item How does Perl compare with other languages like Java, Python, REXX,
+Scheme, or Tcl?
+
+=item Can I do [task] in Perl?
+
+=item When shouldn't I program in Perl?
+
+=item What's the difference between "perl" and "Perl"?
+
+=item Is it a Perl program or a Perl script?
+
+=item What is a JAPH?
+
+=item Where can I get a list of Larry Wall witticisms?
+
+=item How can I convince others to use Perl?
+
+http://perltraining.com.au/whyperl.html,
+http://www.perl.org/advocacy/whyperl.html
+
+=back
+
+=item REVISION
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq2 - Obtaining and Learning about Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item What machines support perl? Where do I get it?
+
+=item How can I get a binary version of perl?
+
+=item I don't have a C compiler. How can I build my own Perl interpreter?
+
+=item I copied the perl binary from one machine to another, but scripts
+don't work.
+
+=item I grabbed the sources and tried to compile but gdbm/dynamic
+loading/malloc/linking/... failed. How do I make it work?
+
+=item What modules and extensions are available for Perl? What is CPAN?
+What does CPAN/src/... mean?
+
+=item Is there an ISO or ANSI certified version of Perl?
+
+=item Where can I get information on Perl?
+
+=item What are the Perl newsgroups on Usenet? Where do I post questions?
+
+=item Where should I post source code?
+
+=item Perl Books
+
+References, Tutorials, Task-Oriented, Special Topics
+
+=item Which magazines have Perl content?
+
+=item What mailing lists are there for Perl?
+
+=item Where are the archives for comp.lang.perl.misc?
+
+=item Where can I buy a commercial version of perl?
+
+=item Where do I send bug reports?
+
+=item What is perl.com? Perl Mongers? pm.org? perl.org? cpan.org?
+
+=back
+
+=item REVISION
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq3 - Programming Tools
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item How do I do (anything)?
+
+=item How can I use Perl interactively?
+
+=item Is there a Perl shell?
+
+=item How do I find which modules are installed on my system?
+
+=item How do I debug my Perl programs?
+
+=item How do I profile my Perl programs?
+
+=item How do I cross-reference my Perl programs?
+
+=item Is there a pretty-printer (formatter) for Perl?
+
+=item Is there a ctags for Perl?
+
+=item Is there an IDE or Windows Perl Editor?
+
+Eclipse, Enginsite, Komodo, Open Perl IDE, OptiPerl, Padre, PerlBuilder,
+visiPerl+, Visual Perl, Zeus, GNU Emacs, MicroEMACS, XEmacs, Jed, Elvis,
+Vile, Vim, Codewright, MultiEdit, SlickEdit, ConTEXT, Bash, Ksh, Tcsh, Zsh,
+Affrus, Alpha, BBEdit and BBEdit Lite
+
+=item Where can I get Perl macros for vi?
+
+=item Where can I get perl-mode for emacs?
+
+=item How can I use curses with Perl?
+
+=item How can I write a GUI (X, Tk, Gtk, etc.) in Perl?
+X<GUI> X<Tk> X<Wx> X<WxWidgets> X<Gtk> X<Gtk2> X<CamelBones> X<Qt>
+
+Tk, Wx, Gtk and Gtk2, Win32::GUI, CamelBones, Qt, Athena
+
+=item How can I make my Perl program run faster?
+
+=item How can I make my Perl program take less memory?
+
+Don't slurp!, Use map and grep selectively, Avoid unnecessary quotes and
+stringification, Pass by reference, Tie large variables to disk
+
+=item Is it safe to return a reference to local or lexical data?
+
+=item How can I free an array or hash so my program shrinks?
+
+=item How can I make my CGI script more efficient?
+
+=item How can I hide the source for my Perl program?
+
+=item How can I compile my Perl program into byte code or C?
+
+=item How can I get C<#!perl> to work on [MS-DOS,NT,...]?
+
+=item Can I write useful Perl programs on the command line?
+
+=item Why don't Perl one-liners work on my DOS/Mac/VMS system?
+
+=item Where can I learn about CGI or Web programming in Perl?
+
+=item Where can I learn about object-oriented Perl programming?
+
+=item Where can I learn about linking C with Perl?
+
+=item I've read perlembed, perlguts, etc., but I can't embed perl in my C
+program; what am I doing wrong?
+
+=item When I tried to run my script, I got this message. What does it mean?
+
+=item What's MakeMaker?
+
+=back
+
+=item REVISION
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq4 - Data Manipulation
+
+=over 4
+
+=item DESCRIPTION
+
+=item Data: Numbers
+
+=over 4
+
+=item Why am I getting long decimals (eg, 19.9499999999999) instead of the
+numbers I should be getting (eg, 19.95)?
+
+=item Why is int() broken?
+
+=item Why isn't my octal data interpreted correctly?
+
+=item Does Perl have a round() function? What about ceil() and floor()?
+Trig functions?
+
+=item How do I convert between numeric representations/bases/radixes?
+
+How do I convert hexadecimal into decimal, How do I convert from decimal to
+hexadecimal, How do I convert from octal to decimal, How do I convert from
+decimal to octal, How do I convert from binary to decimal, How do I convert
+from decimal to binary
+
+=item Why doesn't & work the way I want it to?
+
+=item How do I multiply matrices?
+
+=item How do I perform an operation on a series of integers?
+
+=item How can I output Roman numerals?
+
+=item Why aren't my random numbers random?
+
+=item How do I get a random number between X and Y?
+
+=back
+
+=item Data: Dates
+
+=over 4
+
+=item How do I find the day or week of the year?
+
+=item How do I find the current century or millennium?
+
+=item How can I compare two dates and find the difference?
+
+=item How can I take a string and turn it into epoch seconds?
+
+=item How can I find the Julian Day?
+
+=item How do I find yesterday's date?
+X<date> X<yesterday> X<DateTime> X<Date::Calc> X<Time::Local>
+X<daylight saving time> X<day> X<Today_and_Now> X<localtime>
+X<timelocal>
+
+=item Does Perl have a Year 2000 problem? Is Perl Y2K compliant?
+
+=back
+
+=item Data: Strings
+
+=over 4
+
+=item How do I validate input?
+
+=item How do I unescape a string?
+
+=item How do I remove consecutive pairs of characters?
+
+=item How do I expand function calls in a string?
+
+=item How do I find matching/nesting anything?
+
+=item How do I reverse a string?
+
+=item How do I expand tabs in a string?
+
+=item How do I reformat a paragraph?
+
+=item How can I access or change N characters of a string?
+
+=item How do I change the Nth occurrence of something?
+
+=item How can I count the number of occurrences of a substring within a
+string?
+
+=item Does Perl have a Year 2038 problem?
+
+=item How do I capitalize all the words on one line?
+X<Text::Autoformat> X<capitalize> X<case, title> X<case, sentence>
+
+=item How can I split a [character] delimited string except when inside
+[character]?
+
+=item How do I strip blank space from the beginning/end of a string?
+
+=item How do I pad a string with blanks or pad a number with zeroes?
+
+=item How do I extract selected columns from a string?
+
+=item How do I find the soundex value of a string?
+
+=item How can I expand variables in text strings?
+
+=item What's wrong with always quoting "$vars"?
+
+=item Why don't my E<lt>E<lt>HERE documents work?
+
+There must be no space after the E<lt>E<lt> part, There (probably) should
+be a semicolon at the end, You can't (easily) have any space in front of
+the tag
+
+=back
+
+=item Data: Arrays
+
+=over 4
+
+=item What is the difference between a list and an array?
+
+=item What is the difference between $array[1] and @array[1]?
+
+=item How can I remove duplicate elements from a list or array?
+
+=item How can I tell whether a certain element is contained in a list or
+array?
+
+=item How do I compute the difference of two arrays? How do I compute the
+intersection of two arrays?
+
+=item How do I test whether two arrays or hashes are equal?
+
+=item How do I find the first array element for which a condition is true?
+
+=item How do I handle linked lists?
+
+=item How do I handle circular lists?
+X<circular> X<array> X<Tie::Cycle> X<Array::Iterator::Circular>
+X<cycle> X<modulus>
+
+=item How do I shuffle an array randomly?
+
+=item How do I process/modify each element of an array?
+
+=item How do I select a random element from an array?
+
+=item How do I permute N elements of a list?
+X<List::Permuter> X<permute> X<Algorithm::Loops> X<Knuth>
+X<The Art of Computer Programming> X<Fischer-Krause>
+
+=item How do I sort an array by (anything)?
+
+=item How do I manipulate arrays of bits?
+
+=item Why does defined() return true on empty arrays and hashes?
+
+=back
+
+=item Data: Hashes (Associative Arrays)
+
+=over 4
+
+=item How do I process an entire hash?
+
+=item How do I merge two hashes?
+X<hash> X<merge> X<slice, hash>
+
+=item What happens if I add or remove keys from a hash while iterating over
+it?
+
+=item How do I look up a hash element by value?
+
+=item How can I know how many entries are in a hash?
+
+=item How do I sort a hash (optionally by value instead of key)?
+
+=item How can I always keep my hash sorted?
+X<hash tie sort DB_File Tie::IxHash>
+
+=item What's the difference between "delete" and "undef" with hashes?
+
+=item Why don't my tied hashes make the defined/exists distinction?
+
+=item How do I reset an each() operation part-way through?
+
+=item How can I get the unique keys from two hashes?
+
+=item How can I store a multidimensional array in a DBM file?
+
+=item How can I make my hash remember the order I put elements into it?
+
+=item Why does passing a subroutine an undefined element in a hash create
+it?
+
+=item How can I make the Perl equivalent of a C structure/C++ class/hash or
+array of hashes or arrays?
+
+=item How can I use a reference as a hash key?
+
+=back
+
+=item Data: Misc
+
+=over 4
+
+=item How do I handle binary data correctly?
+
+=item How do I determine whether a scalar is a number/whole/integer/float?
+
+=item How do I keep persistent data across program calls?
+
+=item How do I print out or copy a recursive data structure?
+
+=item How do I define methods for every class/object?
+
+=item How do I verify a credit card checksum?
+
+=item How do I pack arrays of doubles or floats for XS code?
+
+=back
+
+=item REVISION
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq5 - Files and Formats
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item How do I flush/unbuffer an output filehandle? Why must I do this?
+X<flush> X<buffer> X<unbuffer> X<autoflush>
+
+=item How do I change, delete, or insert a line in a file, or append to the
+beginning of a file?
+X<file, editing>
+
+=item How do I count the number of lines in a file?
+X<file, counting lines> X<lines> X<line>
+
+=item How can I use Perl's C<-i> option from within a program?
+X<-i> X<in-place>
+
+=item How can I copy a file?
+X<copy> X<file, copy> X<File::Copy>
+
+=item How do I make a temporary file name?
+X<file, temporary>
+
+=item How can I manipulate fixed-record-length files?
+X<fixed-length> X<file, fixed-length records>
+
+=item How can I make a filehandle local to a subroutine? How do I pass
+filehandles between subroutines? How do I make an array of filehandles?
+X<filehandle, local> X<filehandle, passing> X<filehandle, reference>
+
+=item How can I use a filehandle indirectly?
+X<filehandle, indirect>
+
+=item How can I set up a footer format to be used with write()?
+X<footer>
+
+=item How can I write() into a string?
+X<write, into a string>
+
+=item How can I open a filehandle to a string?
+X<string> X<open> X<IO::String> X<filehandle>
+
+=item How can I output my numbers with commas added?
+X<number, commify>
+
+=item How can I translate tildes (~) in a filename?
+X<tilde> X<tilde expansion>
+
+=item How come when I open a file read-write it wipes it out?
+X<clobber> X<read-write> X<clobbering> X<truncate> X<truncating>
+
+=item Why do I sometimes get an "Argument list too long" when I use
+E<lt>*E<gt>?
+X<argument list too long>
+
+=item Is there a leak/bug in glob()?
+X<glob>
+
+=item How can I open a file with a leading ">" or trailing blanks?
+X<filename, special characters>
+
+=item How can I reliably rename a file?
+X<rename> X<mv> X<move> X<file, rename> X<ren>
+
+=item How can I lock a file?
+X<lock> X<file, lock> X<flock>
+
+=item Why can't I just open(FH, "E<gt>file.lock")?
+X<lock, lockfile race condition>
+
+=item I still don't get locking. I just want to increment the number in
+the file. How can I do this?
+X<counter> X<file, counter>
+
+=item All I want to do is append a small amount of text to the end of a
+file. Do I still have to use locking?
+X<append> X<file, append>
+
+=item How do I randomly update a binary file?
+X<file, binary patch>
+
+=item How do I get a file's timestamp in perl?
+X<timestamp> X<file, timestamp>
+
+=item How do I set a file's timestamp in perl?
+X<timestamp> X<file, timestamp>
+
+=item How do I print to more than one file at once?
+X<print, to multiple files>
+
+=item How can I read in an entire file all at once?
+X<slurp> X<file, slurping>
+
+=item How can I read in a file by paragraphs?
+X<file, reading by paragraphs>
+
+=item How can I read a single character from a file? From the keyboard?
+X<getc> X<file, reading one character at a time>
+
+=item How can I tell whether there's a character waiting on a filehandle?
+
+=item How do I do a C<tail -f> in perl?
+X<tail> X<IO::Handle> X<File::Tail> X<clearerr>
+
+=item How do I dup() a filehandle in Perl?
+X<dup>
+
+=item How do I close a file descriptor by number?
+X<file, closing file descriptors> X<POSIX> X<close>
+
+=item Why can't I use "C:\temp\foo" in DOS paths? Why doesn't
+`C:\temp\foo.exe` work?
+X<filename, DOS issues>
+
+=item Why doesn't glob("*.*") get all the files?
+X<glob>
+
+=item Why does Perl let me delete read-only files? Why does C<-i> clobber
+protected files? Isn't this a bug in Perl?
+
+=item How do I select a random line from a file?
+X<file, selecting a random line>
+
+=item Why do I get weird spaces when I print an array of lines?
+
+=item How do I traverse a directory tree?
+
+=item How do I delete a directory tree?
+
+=item How do I copy an entire directory?
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq6 - Regular Expressions
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item How can I hope to use regular expressions without creating illegible
+and unmaintainable code?
+X<regex, legibility> X<regexp, legibility>
+X<regular expression, legibility> X</x>
+
+Comments Outside the Regex, Comments Inside the Regex, Different Delimiters
+
+=item I'm having trouble matching over more than one line. What's wrong?
+X<regex, multiline> X<regexp, multiline> X<regular expression, multiline>
+
+=item How can I pull out lines between two patterns that are themselves on
+different lines?
+X<..>
+
+=item How do I match XML, HTML, or other nasty, ugly things with a regex?
+X<regex, XML> X<regex, HTML> X<XML> X<HTML> X<pain> X<frustration>
+X<sucking out, will to live>
+
+Solve the balanced text problem from another question in L<perlfaq6>, Try
+the recursive regex features in Perl 5.10 and later. See L<perlre>, Try
+defining a grammar using Perl 5.10's C<(?DEFINE)> feature, Break the
+problem down into sub-problems instead of trying to use a single regex,
+Convince everyone not to use XML or HTML in the first place
+
+=item I put a regular expression into $/ but it didn't work. What's wrong?
+X<$/, regexes in> X<$INPUT_RECORD_SEPARATOR, regexes in>
+X<$RS, regexes in>
+
+=item How do I substitute case insensitively on the LHS while preserving
+case on the RHS?
+X<replace, case preserving> X<substitute, case preserving>
+X<substitution, case preserving> X<s, case preserving>
+
+=item How can I make C<\w> match national character sets?
+X<\w>
+
+=item How can I match a locale-smart version of C</[a-zA-Z]/>?
+X<alpha>
+
+=item How can I quote a variable to use in a regex?
+X<regex, escaping> X<regexp, escaping> X<regular expression, escaping>
+
+=item What is C</o> really for?
+X</o, regular expressions> X<compile, regular expressions>
+
+=item How do I use a regular expression to strip C style comments from a
+file?
+
+=item Can I use Perl regular expressions to match balanced text?
+X<regex, matching balanced test> X<regexp, matching balanced test>
+X<regular expression, matching balanced test> X<possessive> X<PARNO>
+X<Text::Balanced> X<Regexp::Common> X<backtracking> X<recursion>
+
+=item What does it mean that regexes are greedy? How can I get around it?
+X<greedy> X<greediness>
+
+=item How do I process each word on each line?
+X<word>
+
+=item How can I print out a word-frequency or line-frequency summary?
+
+=item How can I do approximate matching?
+X<match, approximate> X<matching, approximate>
+
+=item How do I efficiently match many regular expressions at once?
+X<regex, efficiency> X<regexp, efficiency>
+X<regular expression, efficiency>
+
+=item Why don't word-boundary searches with C<\b> work for me?
+X<\b>
+
+=item Why does using $&, $`, or $' slow my program down?
+X<$MATCH> X<$&> X<$POSTMATCH> X<$'> X<$PREMATCH> X<$`>
+
+=item What good is C<\G> in a regular expression?
+X<\G>
+
+=item Are Perl regexes DFAs or NFAs? Are they POSIX compliant?
+X<DFA> X<NFA> X<POSIX>
+
+=item What's wrong with using grep in a void context?
+X<grep>
+
+=item How can I match strings with multibyte characters?
+X<regex, and multibyte characters> X<regexp, and multibyte characters>
+X<regular expression, and multibyte characters> X<martian> X<encoding,
+Martian>
+
+=item How do I match a regular expression that's in a variable?
+X<regex, in variable> X<eval> X<regex> X<quotemeta> X<\Q, regex>
+X<\E, regex>, X<qr//>
+
+=back
+
+=item REVISION
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq7 - General Perl Language Issues
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Can I get a BNF/yacc/RE for the Perl language?
+
+=item What are all these $@%&* punctuation signs, and how do I know when to
+use them?
+
+=item Do I always/never have to quote my strings or use semicolons and
+commas?
+
+=item How do I skip some return values?
+
+=item How do I temporarily block warnings?
+
+=item What's an extension?
+
+=item Why do Perl operators have different precedence than C operators?
+
+=item How do I declare/create a structure?
+
+=item How do I create a module?
+
+=item How do I adopt or take over a module already on CPAN?
+
+=item How do I create a class?
+X<class, creation> X<package>
+
+=item How can I tell if a variable is tainted?
+
+=item What's a closure?
+
+=item What is variable suicide and how can I prevent it?
+
+=item How can I pass/return a {Function, FileHandle, Array, Hash, Method,
+Regex}?
+
+Passing Variables and Functions, Passing Filehandles, Passing Regexes,
+Passing Methods
+
+=item How do I create a static variable?
+
+=item What's the difference between dynamic and lexical (static) scoping?
+Between local() and my()?
+
+=item How can I access a dynamic variable while a similarly named lexical
+is in scope?
+
+=item What's the difference between deep and shallow binding?
+
+=item Why doesn't "my($foo) = E<lt>FILEE<gt>;" work right?
+
+=item How do I redefine a builtin function, operator, or method?
+
+=item What's the difference between calling a function as &foo and foo()?
+
+=item How do I create a switch or case statement?
+
+=item How can I catch accesses to undefined variables, functions, or
+methods?
+
+=item Why can't a method included in this same file be found?
+
+=item How can I find out my current or calling package?
+
+=item How can I comment out a large block of Perl code?
+
+=item How do I clear a package?
+
+=item How can I use a variable as a variable name?
+
+=item What does "bad interpreter" mean?
+
+=back
+
+=item REVISION
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq8 - System Interaction
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item How do I find out which operating system I'm running under?
+
+=item How come exec() doesn't return?
+X<exec> X<system> X<fork> X<open> X<pipe>
+
+=item How do I do fancy stuff with the keyboard/screen/mouse?
+
+Keyboard, Screen, Mouse
+
+=item How do I print something out in color?
+
+=item How do I read just one key without waiting for a return key?
+
+=item How do I check whether input is ready on the keyboard?
+
+=item How do I clear the screen?
+
+=item How do I get the screen size?
+
+=item How do I ask the user for a password?
+
+=item How do I read and write the serial port?
+
+lockfiles, open mode, end of line, flushing output, non-blocking input
+
+=item How do I decode encrypted password files?
+
+=item How do I start a process in the background?
+
+STDIN, STDOUT, and STDERR are shared, Signals, Zombies
+
+=item How do I trap control characters/signals?
+
+=item How do I modify the shadow password file on a Unix system?
+
+=item How do I set the time and date?
+
+=item How can I sleep() or alarm() for under a second?
+X<Time::HiRes> X<BSD::Itimer> X<sleep> X<select>
+
+=item How can I measure time under a second?
+X<Time::HiRes> X<BSD::Itimer> X<sleep> X<select>
+
+=item How can I do an atexit() or setjmp()/longjmp()? (Exception handling)
+
+=item Why doesn't my sockets program work under System V (Solaris)? What
+does the error message "Protocol not supported" mean?
+
+=item How can I call my system's unique C functions from Perl?
+
+=item Where do I get the include files to do ioctl() or syscall()?
+
+=item Why do setuid perl scripts complain about kernel problems?
+
+=item How can I open a pipe both to and from a command?
+
+=item Why can't I get the output of a command with system()?
+
+=item How can I capture STDERR from an external command?
+
+=item Why doesn't open() return an error when a pipe open fails?
+
+=item What's wrong with using backticks in a void context?
+
+=item How can I call backticks without shell processing?
+
+=item Why can't my script read from STDIN after I gave it EOF (^D on Unix,
+^Z on MS-DOS)?
+
+=item How can I convert my shell script to perl?
+
+=item Can I use perl to run a telnet or ftp session?
+
+=item How can I write expect in Perl?
+
+=item Is there a way to hide perl's command line from programs such as
+"ps"?
+
+=item I {changed directory, modified my environment} in a perl script. How
+come the change disappeared when I exited the script? How do I get my
+changes to be visible?
+
+Unix
+
+=item How do I close a process's filehandle without waiting for it to
+complete?
+
+=item How do I fork a daemon process?
+
+=item How do I find out if I'm running interactively or not?
+
+=item How do I timeout a slow event?
+
+=item How do I set CPU limits?
+X<BSD::Resource> X<limit> X<CPU>
+
+=item How do I avoid zombies on a Unix system?
+
+=item How do I use an SQL database?
+
+=item How do I make a system() exit on control-C?
+
+=item How do I open a file without blocking?
+
+=item How do I tell the difference between errors from the shell and perl?
+
+=item How do I install a module from CPAN?
+
+=item What's the difference between require and use?
+
+=item How do I keep my own module/library directory?
+
+=item How do I add the directory my program lives in to the module/library
+search path?
+
+=item How do I add a directory to my include path (@INC) at runtime?
+
+the PERLLIB environment variable, the PERL5LIB environment variable, the
+perl -Idir command line flag, the use lib pragma:
+
+=item What is socket.ph and where do I get it?
+
+=back
+
+=item REVISION
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq9 - Networking
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item What is the correct form of response from a CGI script?
+
+=item My CGI script runs from the command line but not the browser. (500
+Server Error)
+
+=item How can I get better error messages from a CGI program?
+
+=item How do I remove HTML from a string?
+
+=item How do I extract URLs?
+
+=item How do I download a file from the user's machine? How do I open a
+file on another machine?
+
+=item How do I make an HTML pop-up menu with Perl?
+
+=item How do I fetch an HTML file?
+
+=item How do I automate an HTML form submission?
+
+=item How do I decode or create those %-encodings on the web?
+X<URI> X<CGI.pm> X<CGI> X<URI::Escape> X<RFC 2396>
+
+=item How do I redirect to another page?
+
+=item How do I put a password on my web pages?
+
+=item How do I edit my .htpasswd and .htgroup files with Perl?
+
+=item How do I make sure users can't enter values into a form that cause my
+CGI script to do bad things?
+
+=item How do I parse a mail header?
+
+=item How do I decode a CGI form?
+
+=item How do I check a valid mail address?
+
+=item How do I decode a MIME/BASE64 string?
+
+=item How do I return the user's mail address?
+
+=item How do I send mail?
+
+=item How do I use MIME to make an attachment to a mail message?
+
+=item How do I read mail?
+
+=item How do I find out my hostname, domainname, or IP address?
+X<hostname, domainname, IP address, host, domain, hostfqdn, inet_ntoa,
+gethostbyname, Socket, Net::Domain, Sys::Hostname>
+
+=item How do I fetch a news article or the active newsgroups?
+
+=item How do I fetch/put an FTP file?
+
+=item How can I do RPC in Perl?
+
+=back
+
+=item REVISION
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlsyn - Perl syntax
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Declarations
+X<declaration> X<undef> X<undefined> X<uninitialized>
+
+=item Comments
+X<comment> X<#>
+
+=item Simple Statements
+X<statement> X<semicolon> X<expression> X<;>
+
+=item Truth and Falsehood
+X<truth> X<falsehood> X<true> X<false> X<!> X<not> X<negation> X<0>
+
+=item Statement Modifiers
+X<statement modifier> X<modifier> X<if> X<unless> X<while>
+X<until> X<foreach> X<for>
+
+=item Compound Statements
+X<statement, compound> X<block> X<bracket, curly> X<curly bracket> X<brace>
+X<{> X<}> X<if> X<unless> X<while> X<until> X<foreach> X<for> X<continue>
+
+=item Loop Control
+X<loop control> X<loop, control> X<next> X<last> X<redo> X<continue>
+
+=item For Loops
+X<for> X<foreach>
+
+=item Foreach Loops
+X<for> X<foreach>
+
+=item Basic BLOCKs
+X<block>
+
+=item Switch statements
+X<switch> X<case> X<given> X<when> X<default>
+
+=item Goto
+X<goto>
+
+=item PODs: Embedded Documentation
+X<POD> X<documentation>
+
+=item Plain Old Comments (Not!)
+X<comment> X<line> X<#> X<preprocessor> X<eval>
+
+=back
+
+=back
+
+=head2 perldata - Perl data types
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Variable names
+X<variable, name> X<variable name> X<data type> X<type>
+
+=item Context
+X<context> X<scalar context> X<list context>
+
+=item Scalar values
+X<scalar> X<number> X<string> X<reference>
+
+=item Scalar value constructors
+X<scalar, literal> X<scalar, constant>
+
+=item List value constructors
+X<list>
+
+=item Subscripts
+
+=item Slices
+X<slice> X<array, slice> X<hash, slice>
+
+=item Typeglobs and Filehandles
+X<typeglob> X<filehandle> X<*>
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlop - Perl operators and precedence
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Operator Precedence and Associativity
+X<operator, precedence> X<precedence> X<associativity>
+
+=item Terms and List Operators (Leftward)
+X<list operator> X<operator, list> X<term>
+
+=item The Arrow Operator
+X<arrow> X<dereference> X<< -> >>
+
+=item Auto-increment and Auto-decrement
+X<increment> X<auto-increment> X<++> X<decrement> X<auto-decrement> X<-->
+
+=item Exponentiation
+X<**> X<exponentiation> X<power>
+
+=item Symbolic Unary Operators
+X<unary operator> X<operator, unary>
+
+=item Binding Operators
+X<binding> X<operator, binding> X<=~> X<!~>
+
+=item Multiplicative Operators
+X<operator, multiplicative>
+
+=item Additive Operators
+X<operator, additive>
+
+=item Shift Operators
+X<shift operator> X<operator, shift> X<<< << >>>
+X<<< >> >>> X<right shift> X<left shift> X<bitwise shift>
+X<shl> X<shr> X<shift, right> X<shift, left>
+
+=item Named Unary Operators
+X<operator, named unary>
+
+=item Relational Operators
+X<relational operator> X<operator, relational>
+
+=item Equality Operators
+X<equality> X<equal> X<equals> X<operator, equality>
+
+=item Bitwise And
+X<operator, bitwise, and> X<bitwise and> X<&>
+
+=item Bitwise Or and Exclusive Or
+X<operator, bitwise, or> X<bitwise or> X<|> X<operator, bitwise, xor>
+X<bitwise xor> X<^>
+
+=item C-style Logical And
+X<&&> X<logical and> X<operator, logical, and>
+
+=item C-style Logical Or
+X<||> X<operator, logical, or>
+
+=item C-style Logical Defined-Or
+X<//> X<operator, logical, defined-or>
+
+=item Range Operators
+X<operator, range> X<range> X<..> X<...>
+
+=item Conditional Operator
+X<operator, conditional> X<operator, ternary> X<ternary> X<?:>
+
+=item Assignment Operators
+X<assignment> X<operator, assignment> X<=> X<**=> X<+=> X<*=> X<&=>
+X<<< <<= >>> X<&&=> X<-=> X</=> X<|=> X<<< >>= >>> X<||=> X<//=> X<.=>
+X<%=> X<^=> X<x=>
+
+=item Comma Operator
+X<comma> X<operator, comma> X<,>
+
+=item List Operators (Rightward)
+X<operator, list, rightward> X<list operator>
+
+=item Logical Not
+X<operator, logical, not> X<not>
+
+=item Logical And
+X<operator, logical, and> X<and>
+
+=item Logical or, Defined or, and Exclusive Or
+X<operator, logical, or> X<operator, logical, xor>
+X<operator, logical, defined or> X<operator, logical, exclusive or>
+X<or> X<xor>
+
+=item C Operators Missing From Perl
+X<operator, missing from perl> X<&> X<*>
+X<typecasting> X<(TYPE)>
+
+unary &, unary *, (TYPE)
+
+=item Quote and Quote-like Operators
+X<operator, quote> X<operator, quote-like> X<q> X<qq> X<qx> X<qw> X<m>
+X<qr> X<s> X<tr> X<'> X<''> X<"> X<""> X<//> X<`> X<``> X<<< << >>>
+X<escape sequence> X<escape>
+
+=item Regexp Quote-Like Operators
+X<operator, regexp>
+
+qr/STRING/msixpo X<qr> X</i> X</m> X</o> X</s> X</x> X</p>,
+m/PATTERN/msixpogc X<m> X<operator, match> X<regexp, options> X<regexp>
+X<regex, options> X<regex> X</m> X</s> X</i> X</x> X</p> X</o> X</g> X</c>,
+/PATTERN/msixpogc, The empty pattern //, Matching in list context, \G
+assertion, ?PATTERN? X<?>, s/PATTERN/REPLACEMENT/msixpogce X<substitute>
+X<substitution> X<replace> X<regexp, replace> X<regexp, substitute> X</m>
+X</s> X</i> X</x> X</p> X</o> X</g> X</c> X</e>
+
+=item Quote-Like Operators
+X<operator, quote-like>
+
+q/STRING/ X<q> X<quote, single> X<'> X<''>, 'STRING', qq/STRING/ X<qq>
+X<quote, double> X<"> X<"">, "STRING", qx/STRING/ X<qx> X<`> X<``>
+X<backtick>, `STRING`, qw/STRING/ X<qw> X<quote, list> X<quote, words>,
+tr/SEARCHLIST/REPLACEMENTLIST/cds X<tr> X<y> X<transliterate> X</c> X</d>
+X</s>, y/SEARCHLIST/REPLACEMENTLIST/cds, <<EOF X<here-doc> X<heredoc>
+X<here-document> X<<< << >>>, Double Quotes, Single Quotes, Backticks
+
+=item Gory details of parsing quoted constructs
+X<quote, gory details>
+
+Finding the end, Interpolation X<interpolation>, C<<<'EOF'>, C<m''>, the
+pattern of C<s'''>, C<''>, C<q//>, C<tr'''>, C<y'''>, the replacement of
+C<s'''>, C<tr///>, C<y///>, C<"">, C<``>, C<qq//>, C<qx//>, C<< <file*glob>
+>>, C<<<"EOF">, the replacement of C<s///>, C<RE> in C<?RE?>, C</RE/>,
+C<m/RE/>, C<s/RE/foo/>,, parsing regular expressions X<regexp, parse>,
+Optimization of regular expressions X<regexp, optimization>
+
+=item I/O Operators
+X<operator, i/o> X<operator, io> X<io> X<while> X<filehandle>
+X<< <> >> X<@ARGV>
+
+=item Constant Folding
+X<constant folding> X<folding>
+
+=item No-ops
+X<no-op> X<nop>
+
+=item Bitwise String Operators
+X<operator, bitwise, string>
+
+=item Integer Arithmetic
+X<integer>
+
+=item Floating-point Arithmetic
+X<floating-point> X<floating point> X<float> X<real>
+
+=item Bigger Numbers
+X<number, arbitrary precision>
+
+=back
+
+=back
+
+=head2 perlsub - Perl subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Private Variables via my()
+X<my> X<variable, lexical> X<lexical> X<lexical variable> X<scope, lexical>
+X<lexical scope> X<attributes, my>
+
+=item Persistent Private Variables
+X<state> X<state variable> X<static> X<variable, persistent> X<variable,
+static> X<closure>
+
+=item Temporary Values via local()
+X<local> X<scope, dynamic> X<dynamic scope> X<variable, local>
+X<variable, temporary>
+
+=item Lvalue subroutines
+X<lvalue> X<subroutine, lvalue>
+
+Lvalue subroutines are EXPERIMENTAL
+
+=item Passing Symbol Table Entries (typeglobs)
+X<typeglob> X<*>
+
+=item When to Still Use local()
+X<local> X<variable, local>
+
+=item Pass by Reference
+X<pass by reference> X<pass-by-reference> X<reference>
+
+=item Prototypes
+X<prototype> X<subroutine, prototype>
+
+=item Constant Functions
+X<constant>
+
+=item Overriding Built-in Functions
+X<built-in> X<override> X<CORE> X<CORE::GLOBAL>
+
+=item Autoloading
+X<autoloading> X<AUTOLOAD>
+
+=item Subroutine Attributes
+X<attribute> X<subroutine, attribute> X<attrs>
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlfunc - Perl builtin functions
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Perl Functions by Category
+X<function>
+
+Functions for SCALARs or strings X<scalar> X<string> X<character>, Regular
+expressions and pattern matching X<regular expression> X<regex> X<regexp>,
+Numeric functions X<numeric> X<number> X<trigonometric> X<trigonometry>,
+Functions for real @ARRAYs X<array>, Functions for list data X<list>,
+Functions for real %HASHes X<hash>, Input and output functions X<I/O>
+X<input> X<output> X<dbm>, Functions for fixed length data or records,
+Functions for filehandles, files, or directories X<file> X<filehandle>
+X<directory> X<pipe> X<link> X<symlink>, Keywords related to the control
+flow of your Perl program X<control flow>, Keywords related to switch,
+Keywords related to scoping, Miscellaneous functions, Functions for
+processes and process groups X<process> X<pid> X<process id>, Keywords
+related to perl modules X<module>, Keywords related to classes and
+object-orientation X<object> X<class> X<package>, Low-level socket
+functions X<socket> X<sock>, System V interprocess communication functions
+X<IPC> X<System V> X<semaphore> X<shared memory> X<memory> X<message>,
+Fetching user and group info X<user> X<group> X<password> X<uid> X<gid>
+X<passwd> X</etc/passwd>, Fetching network info X<network> X<protocol>
+X<host> X<hostname> X<IP> X<address> X<service>, Time-related functions
+X<time> X<date>, Functions new in perl5 X<perl5>, Functions obsoleted in
+perl5
+
+=item Portability
+X<portability> X<Unix> X<portable>
+
+=item Alphabetical Listing of Perl Functions
+
+-I<X> FILEHANDLE
+X<-r>X<-w>X<-x>X<-o>X<-R>X<-W>X<-X>X<-O>X<-e>X<-z>X<-s>X<-f>X<-d>X<-l>X<-p>
+X<-S>X<-b>X<-c>X<-t>X<-u>X<-g>X<-k>X<-T>X<-B>X<-M>X<-A>X<-C>, -I<X> EXPR,
+-I<X> DIRHANDLE, -I<X>, abs VALUE X<abs> X<absolute>, abs, accept
+NEWSOCKET,GENERICSOCKET X<accept>, alarm SECONDS X<alarm> X<SIGALRM>
+X<timer>, alarm, atan2 Y,X X<atan2> X<arctangent> X<tan> X<tangent>, bind
+SOCKET,NAME X<bind>, binmode FILEHANDLE, LAYER X<binmode> X<binary> X<text>
+X<DOS> X<Windows>, binmode FILEHANDLE, bless REF,CLASSNAME X<bless>, bless
+REF, break, caller EXPR X<caller> X<call stack> X<stack> X<stack trace>,
+caller, chdir EXPR X<chdir> X<cd> X<directory, change>, chdir FILEHANDLE,
+chdir DIRHANDLE, chdir, chmod LIST X<chmod> X<permission> X<mode>, chomp
+VARIABLE X<chomp> X<INPUT_RECORD_SEPARATOR> X<$/> X<newline> X<eol>, chomp(
+LIST ), chomp, chop VARIABLE X<chop>, chop( LIST ), chop, chown LIST
+X<chown> X<owner> X<user> X<group>, chr NUMBER X<chr> X<character> X<ASCII>
+X<Unicode>, chr, chroot FILENAME X<chroot> X<root>, chroot, close
+FILEHANDLE X<close>, close, closedir DIRHANDLE X<closedir>, connect
+SOCKET,NAME X<connect>, continue BLOCK X<continue>, continue, cos EXPR
+X<cos> X<cosine> X<acos> X<arccosine>, cos, crypt PLAINTEXT,SALT X<crypt>
+X<digest> X<hash> X<salt> X<plaintext> X<password> X<decrypt>
+X<cryptography> X<passwd> X<encrypt>, dbmclose HASH X<dbmclose>, dbmopen
+HASH,DBNAME,MASK X<dbmopen> X<dbm> X<ndbm> X<sdbm> X<gdbm>, defined EXPR
+X<defined> X<undef> X<undefined>, defined, delete EXPR X<delete>, die LIST
+X<die> X<throw> X<exception> X<raise> X<$@> X<abort>, do BLOCK X<do>
+X<block>, do SUBROUTINE(LIST) X<do>, do EXPR X<do>, dump LABEL X<dump>
+X<core> X<undump>, dump, each HASH X<each> X<hash, iterator>, eof
+FILEHANDLE X<eof> X<end of file> X<end-of-file>, eof (), eof, eval EXPR
+X<eval> X<try> X<catch> X<evaluate> X<parse> X<execute> X<error, handling>
+X<exception, handling>, eval BLOCK, eval, exec LIST X<exec> X<execute>,
+exec PROGRAM LIST, exists EXPR X<exists> X<autovivification>, exit EXPR
+X<exit> X<terminate> X<abort>, exit, exp EXPR X<exp> X<exponential>
+X<antilog> X<antilogarithm> X<e>, exp, fcntl FILEHANDLE,FUNCTION,SCALAR
+X<fcntl>, fileno FILEHANDLE X<fileno>, flock FILEHANDLE,OPERATION X<flock>
+X<lock> X<locking>, fork X<fork> X<child> X<parent>, format X<format>,
+formline PICTURE,LIST X<formline>, getc FILEHANDLE X<getc> X<getchar>
+X<character> X<file, read>, getc, getlogin X<getlogin> X<login>,
+getpeername SOCKET X<getpeername> X<peer>, getpgrp PID X<getpgrp> X<group>,
+getppid X<getppid> X<parent> X<pid>, getpriority WHICH,WHO X<getpriority>
+X<priority> X<nice>, getpwnam NAME X<getpwnam> X<getgrnam> X<gethostbyname>
+X<getnetbyname> X<getprotobyname> X<getpwuid> X<getgrgid> X<getservbyname>
+X<gethostbyaddr> X<getnetbyaddr> X<getprotobynumber> X<getservbyport>
+X<getpwent> X<getgrent> X<gethostent> X<getnetent> X<getprotoent>
+X<getservent> X<setpwent> X<setgrent> X<sethostent> X<setnetent>
+X<setprotoent> X<setservent> X<endpwent> X<endgrent> X<endhostent>
+X<endnetent> X<endprotoent> X<endservent>, getgrnam NAME, gethostbyname
+NAME, getnetbyname NAME, getprotobyname NAME, getpwuid UID, getgrgid GID,
+getservbyname NAME,PROTO, gethostbyaddr ADDR,ADDRTYPE, getnetbyaddr
+ADDR,ADDRTYPE, getprotobynumber NUMBER, getservbyport PORT,PROTO, getpwent,
+getgrent, gethostent, getnetent, getprotoent, getservent, setpwent,
+setgrent, sethostent STAYOPEN, setnetent STAYOPEN, setprotoent STAYOPEN,
+setservent STAYOPEN, endpwent, endgrent, endhostent, endnetent,
+endprotoent, endservent, getsockname SOCKET X<getsockname>, getsockopt
+SOCKET,LEVEL,OPTNAME X<getsockopt>, glob EXPR X<glob> X<wildcard>
+X<filename, expansion> X<expand>, glob, gmtime EXPR X<gmtime> X<UTC>
+X<Greenwich>, gmtime, goto LABEL X<goto> X<jump> X<jmp>, goto EXPR, goto
+&NAME, grep BLOCK LIST X<grep>, grep EXPR,LIST, hex EXPR X<hex>
+X<hexadecimal>, hex, import LIST X<import>, index STR,SUBSTR,POSITION
+X<index> X<indexOf> X<InStr>, index STR,SUBSTR, int EXPR X<int> X<integer>
+X<truncate> X<trunc> X<floor>, int, ioctl FILEHANDLE,FUNCTION,SCALAR
+X<ioctl>, join EXPR,LIST X<join>, keys HASH X<keys> X<key>, kill SIGNAL,
+LIST X<kill> X<signal>, last LABEL X<last> X<break>, last, lc EXPR X<lc>
+X<lowercase>, lc, lcfirst EXPR X<lcfirst> X<lowercase>, lcfirst, length
+EXPR X<length> X<size>, length, link OLDFILE,NEWFILE X<link>, listen
+SOCKET,QUEUESIZE X<listen>, local EXPR X<local>, localtime EXPR
+X<localtime> X<ctime>, localtime, lock THING X<lock>, log EXPR X<log>
+X<logarithm> X<e> X<ln> X<base>, log, lstat EXPR X<lstat>, lstat, m//, map
+BLOCK LIST X<map>, map EXPR,LIST, mkdir FILENAME,MASK X<mkdir> X<md>
+X<directory, create>, mkdir FILENAME, mkdir, msgctl ID,CMD,ARG X<msgctl>,
+msgget KEY,FLAGS X<msgget>, msgrcv ID,VAR,SIZE,TYPE,FLAGS X<msgrcv>, msgsnd
+ID,MSG,FLAGS X<msgsnd>, my EXPR X<my>, my TYPE EXPR, my EXPR : ATTRS, my
+TYPE EXPR : ATTRS, next LABEL X<next> X<continue>, next, no Module VERSION
+LIST X<no>, no Module VERSION, no Module LIST, no Module, no VERSION, oct
+EXPR X<oct> X<octal> X<hex> X<hexadecimal> X<binary> X<bin>, oct, open
+FILEHANDLE,EXPR X<open> X<pipe> X<file, open> X<fopen>, open
+FILEHANDLE,MODE,EXPR, open FILEHANDLE,MODE,EXPR,LIST, open
+FILEHANDLE,MODE,REFERENCE, open FILEHANDLE, opendir DIRHANDLE,EXPR
+X<opendir>, ord EXPR X<ord> X<encoding>, ord, our EXPR X<our> X<global>,
+our TYPE EXPR, our EXPR : ATTRS, our TYPE EXPR : ATTRS, pack TEMPLATE,LIST
+X<pack>, package NAMESPACE X<package> X<module> X<namespace>, package, pipe
+READHANDLE,WRITEHANDLE X<pipe>, pop ARRAY X<pop> X<stack>, pop, pos SCALAR
+X<pos> X<match, position>, pos, print FILEHANDLE LIST X<print>, print LIST,
+print, printf FILEHANDLE FORMAT, LIST X<printf>, printf FORMAT, LIST,
+prototype FUNCTION X<prototype>, push ARRAY,LIST X<push> X<stack>,
+q/STRING/, qq/STRING/, qx/STRING/, qw/STRING/, qr/STRING/, quotemeta EXPR
+X<quotemeta> X<metacharacter>, quotemeta, rand EXPR X<rand> X<random>,
+rand, read FILEHANDLE,SCALAR,LENGTH,OFFSET X<read> X<file, read>, read
+FILEHANDLE,SCALAR,LENGTH, readdir DIRHANDLE X<readdir>, readline EXPR,
+readline X<readline> X<gets> X<fgets>, readlink EXPR X<readlink>, readlink,
+readpipe EXPR, readpipe X<readpipe>, recv SOCKET,SCALAR,LENGTH,FLAGS
+X<recv>, redo LABEL X<redo>, redo, ref EXPR X<ref> X<reference>, ref,
+rename OLDNAME,NEWNAME X<rename> X<move> X<mv> X<ren>, require VERSION
+X<require>, require EXPR, require, reset EXPR X<reset>, reset, return EXPR
+X<return>, return, reverse LIST X<reverse> X<rev> X<invert>, rewinddir
+DIRHANDLE X<rewinddir>, rindex STR,SUBSTR,POSITION X<rindex>, rindex
+STR,SUBSTR, rmdir FILENAME X<rmdir> X<rd> X<directory, remove>, rmdir,
+s///, say FILEHANDLE LIST X<say>, say LIST, say, scalar EXPR X<scalar>
+X<context>, seek FILEHANDLE,POSITION,WHENCE X<seek> X<fseek> X<filehandle,
+position>, seekdir DIRHANDLE,POS X<seekdir>, select FILEHANDLE X<select>
+X<filehandle, default>, select, select RBITS,WBITS,EBITS,TIMEOUT X<select>,
+semctl ID,SEMNUM,CMD,ARG X<semctl>, semget KEY,NSEMS,FLAGS X<semget>, semop
+KEY,OPSTRING X<semop>, send SOCKET,MSG,FLAGS,TO X<send>, send
+SOCKET,MSG,FLAGS, setpgrp PID,PGRP X<setpgrp> X<group>, setpriority
+WHICH,WHO,PRIORITY X<setpriority> X<priority> X<nice> X<renice>, setsockopt
+SOCKET,LEVEL,OPTNAME,OPTVAL X<setsockopt>, shift ARRAY X<shift>, shift,
+shmctl ID,CMD,ARG X<shmctl>, shmget KEY,SIZE,FLAGS X<shmget>, shmread
+ID,VAR,POS,SIZE X<shmread> X<shmwrite>, shmwrite ID,STRING,POS,SIZE,
+shutdown SOCKET,HOW X<shutdown>, sin EXPR X<sin> X<sine> X<asin>
+X<arcsine>, sin, sleep EXPR X<sleep> X<pause>, sleep, socket
+SOCKET,DOMAIN,TYPE,PROTOCOL X<socket>, socketpair
+SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL X<socketpair>, sort SUBNAME LIST
+X<sort> X<qsort> X<quicksort> X<mergesort>, sort BLOCK LIST, sort LIST,
+splice ARRAY,OFFSET,LENGTH,LIST X<splice>, splice ARRAY,OFFSET,LENGTH,
+splice ARRAY,OFFSET, splice ARRAY, split /PATTERN/,EXPR,LIMIT X<split>,
+split /PATTERN/,EXPR, split /PATTERN/, split, sprintf FORMAT, LIST
+X<sprintf>, format parameter index, flags, vector flag, (minimum) width,
+precision, or maximum width X<precision>, size, order of arguments, sqrt
+EXPR X<sqrt> X<root> X<square root>, sqrt, srand EXPR X<srand> X<seed>
+X<randseed>, srand, stat FILEHANDLE X<stat> X<file, status> X<ctime>, stat
+EXPR, stat DIRHANDLE, stat, state EXPR X<state>, state TYPE EXPR, state
+EXPR : ATTRS, state TYPE EXPR : ATTRS, study SCALAR X<study>, study, sub
+NAME BLOCK X<sub>, sub NAME (PROTO) BLOCK, sub NAME : ATTRS BLOCK, sub NAME
+(PROTO) : ATTRS BLOCK, substr EXPR,OFFSET,LENGTH,REPLACEMENT X<substr>
+X<substring> X<mid> X<left> X<right>, substr EXPR,OFFSET,LENGTH, substr
+EXPR,OFFSET, symlink OLDFILE,NEWFILE X<symlink> X<link> X<symbolic link>
+X<link, symbolic>, syscall NUMBER, LIST X<syscall> X<system call>, sysopen
+FILEHANDLE,FILENAME,MODE X<sysopen>, sysopen
+FILEHANDLE,FILENAME,MODE,PERMS, sysread FILEHANDLE,SCALAR,LENGTH,OFFSET
+X<sysread>, sysread FILEHANDLE,SCALAR,LENGTH, sysseek
+FILEHANDLE,POSITION,WHENCE X<sysseek> X<lseek>, system LIST X<system>
+X<shell>, system PROGRAM LIST, syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET
+X<syswrite>, syswrite FILEHANDLE,SCALAR,LENGTH, syswrite FILEHANDLE,SCALAR,
+tell FILEHANDLE X<tell>, tell, telldir DIRHANDLE X<telldir>, tie
+VARIABLE,CLASSNAME,LIST X<tie>, tied VARIABLE X<tied>, time X<time>
+X<epoch>, times X<times>, tr///, truncate FILEHANDLE,LENGTH X<truncate>,
+truncate EXPR,LENGTH, uc EXPR X<uc> X<uppercase> X<toupper>, uc, ucfirst
+EXPR X<ucfirst> X<uppercase>, ucfirst, umask EXPR X<umask>, umask, undef
+EXPR X<undef> X<undefine>, undef, unlink LIST X<unlink> X<delete> X<remove>
+X<rm> X<del>, unlink, unpack TEMPLATE,EXPR X<unpack>, unpack TEMPLATE,
+untie VARIABLE X<untie>, unshift ARRAY,LIST X<unshift>, use Module VERSION
+LIST X<use> X<module> X<import>, use Module VERSION, use Module LIST, use
+Module, use VERSION, utime LIST X<utime>, values HASH X<values>, vec
+EXPR,OFFSET,BITS X<vec> X<bit> X<bit vector>, wait X<wait>, waitpid
+PID,FLAGS X<waitpid>, wantarray X<wantarray> X<context>, warn LIST X<warn>
+X<warning> X<STDERR>, write FILEHANDLE X<write>, write EXPR, write, y///
+
+=back
+
+=back
+
+=head2 perlopentut - tutorial on opening things in Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=item Open E<agrave> la shell
+
+=over 4
+
+=item Simple Opens
+
+=item Indirect Filehandles
+
+=item Pipe Opens
+
+=item The Minus File
+
+=item Mixing Reads and Writes
+
+=item Filters
+
+=back
+
+=item Open E<agrave> la C
+
+=over 4
+
+=item Permissions E<agrave> la mode
+
+=back
+
+=item Obscure Open Tricks
+
+=over 4
+
+=item Re-Opening Files (dups)
+
+=item Dispelling the Dweomer
+
+=item Paths as Opens
+
+=item Single Argument Open
+
+=item Playing with STDIN and STDOUT
+
+=back
+
+=item Other I/O Issues
+
+=over 4
+
+=item Opening Non-File Files
+
+=item Opening Named Pipes
+
+=item Opening Sockets
+
+=item Binary Files
+
+=item File Locking
+
+=item IO Layers
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR and COPYRIGHT
+
+=item HISTORY
+
+=back
+
+=head2 perlpacktut - tutorial on C<pack> and C<unpack>
+
+=over 4
+
+=item DESCRIPTION
+
+=item The Basic Principle
+
+=item Packing Text
+
+=item Packing Numbers
+
+=over 4
+
+=item Integers
+
+=item Unpacking a Stack Frame
+
+=item How to Eat an Egg on a Net
+
+=item Byte-order modifiers
+
+=item Floating point Numbers
+
+=back
+
+=item Exotic Templates
+
+=over 4
+
+=item Bit Strings
+
+=item Uuencoding
+
+=item Doing Sums
+
+=item Unicode
+
+=item Another Portable Binary Encoding
+
+=back
+
+=item Template Grouping
+
+=item Lengths and Widths
+
+=over 4
+
+=item String Lengths
+
+=item Dynamic Templates
+
+=item Counting Repetitions
+
+=item Intel HEX
+
+=back
+
+=item Packing and Unpacking C Structures
+
+=over 4
+
+=item The Alignment Pit
+
+=item Dealing with Endian-ness
+
+=item Alignment, Take 2
+
+=item Alignment, Take 3
+
+=item Pointers for How to Use Them
+
+=back
+
+=item Pack Recipes
+
+=item Funnies Section
+
+=item Authors
+
+=back
+
+=head2 perlpod - the Plain Old Documentation format
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Ordinary Paragraph
+X<POD, ordinary paragraph>
+
+=item Verbatim Paragraph
+X<POD, verbatim paragraph> X<verbatim>
+
+=item Command Paragraph
+X<POD, command>
+
+C<=head1 I<Heading Text>> X<=head1> X<=head2> X<=head3> X<=head4> X<head1>
+X<head2> X<head3> X<head4>, C<=head2 I<Heading Text>>, C<=head3 I<Heading
+Text>>, C<=head4 I<Heading Text>>, C<=over I<indentlevel>> X<=over>
+X<=item> X<=back> X<over> X<item> X<back>, C<=item I<stuff...>>, C<=back>,
+C<=cut> X<=cut> X<cut>, C<=pod> X<=pod> X<pod>, C<=begin I<formatname>>
+X<=begin> X<=end> X<=for> X<begin> X<end> X<for>, C<=end I<formatname>>,
+C<=for I<formatname> I<text...>>, C<=encoding I<encodingname>> X<=encoding>
+X<encoding>
+
+=item Formatting Codes
+X<POD, formatting code> X<formatting code>
+X<POD, interior sequence> X<interior sequence>
+
+C<IE<lt>textE<gt>> -- italic text X<I> X<< IZ<><> >> X<POD, formatting
+code, italic> X<italic>, C<BE<lt>textE<gt>> -- bold text X<B> X<< BZ<><> >>
+X<POD, formatting code, bold> X<bold>, C<CE<lt>codeE<gt>> -- code text X<C>
+X<< CZ<><> >> X<POD, formatting code, code> X<code>, C<LE<lt>nameE<gt>> --
+a hyperlink X<L> X<< LZ<><> >> X<POD, formatting code, hyperlink>
+X<hyperlink>, C<EE<lt>escapeE<gt>> -- a character escape X<E> X<< EZ<><> >>
+X<POD, formatting code, escape> X<escape>, C<FE<lt>filenameE<gt>> -- used
+for filenames X<F> X<< FZ<><> >> X<POD, formatting code, filename>
+X<filename>, C<SE<lt>textE<gt>> -- text contains non-breaking spaces X<S>
+X<< SZ<><> >> X<POD, formatting code, non-breaking space> X<non-breaking
+space>, C<XE<lt>topic nameE<gt>> -- an index entry X<X> X<< XZ<><> >>
+X<POD, formatting code, index entry> X<index entry>, C<ZE<lt>E<gt>> -- a
+null (zero-effect) formatting code X<Z> X<< ZZ<><> >> X<POD, formatting
+code, null> X<null>
+
+=item The Intent
+X<POD, intent of>
+
+=item Embedding Pods in Perl Modules
+X<POD, embedding>
+
+=item Hints for Writing Pod
+
+X<podchecker> X<POD, validating>
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perlpodspec - Plain Old Documentation: format specification and
+notes
+
+=over 4
+
+=item DESCRIPTION
+
+=item Pod Definitions
+
+=item Pod Commands
+
+"=head1", "=head2", "=head3", "=head4", "=pod", "=cut", "=over", "=item",
+"=back", "=begin formatname", "=end formatname", "=for formatname text...",
+"=encoding encodingname"
+
+=item Pod Formatting Codes
+
+C<IE<lt>textE<gt>> -- italic text, C<BE<lt>textE<gt>> -- bold text,
+C<CE<lt>codeE<gt>> -- code text, C<FE<lt>filenameE<gt>> -- style for
+filenames, C<XE<lt>topic nameE<gt>> -- an index entry, C<ZE<lt>E<gt>> -- a
+null (zero-effect) formatting code, C<LE<lt>nameE<gt>> -- a hyperlink,
+C<EE<lt>escapeE<gt>> -- a character escape, C<SE<lt>textE<gt>> -- text
+contains non-breaking spaces
+
+=item Notes on Implementing Pod Processors
+
+=item About LE<lt>...E<gt> Codes
+
+First:, Second:, Third:, Fourth:, Fifth:, Sixth:
+
+=item About =over...=back Regions
+
+=item About Data Paragraphs and "=begin/=end" Regions
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perlrun - how to execute the Perl interpreter
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item #! and quoting on non-Unix systems
+X<hashbang> X<#!>
+
+OS/2, MS-DOS, Win95/NT, Macintosh, VMS
+
+=item Location of Perl
+X<perl, location of interpreter>
+
+=item Command Switches
+X<perl, command switches> X<command switches>
+
+B<-0>[I<octal/hexadecimal>] X<-0> X<$/>, B<-a> X<-a> X<autosplit>, B<-C
+[I<number/list>]> X<-C>, B<-c> X<-c>, B<-d> X<-d> X<-dt>, B<-dt>,
+B<-d:>I<foo[=bar,baz]> X<-d> X<-dt>, B<-dt:>I<foo[=bar,baz]>,
+B<-D>I<letters> X<-D> X<DEBUGGING> X<-DDEBUGGING>, B<-D>I<number>, B<-e>
+I<commandline> X<-e>, B<-E> I<commandline> X<-E>, B<-f> X<-f>,
+B<-F>I<pattern> X<-F>, B<-h> X<-h>, B<-i>[I<extension>] X<-i> X<in-place>,
+B<-I>I<directory> X<-I> X<@INC>, B<-l>[I<octnum>] X<-l> X<$/> X<$\>,
+B<-m>[B<->]I<module> X<-m> X<-M>, B<-M>[B<->]I<module>,
+B<-M>[B<->]I<'module ...'>, B<-[mM]>[B<->]I<module=arg[,arg]...>, B<-n>
+X<-n>, B<-p> X<-p>, B<-P> X<-P>, B<-s> X<-s>, B<-S> X<-S>, B<-t> X<-t>,
+B<-T> X<-T>, B<-u> X<-u>, B<-U> X<-U>, B<-v> X<-v>, B<-V> X<-V>,
+B<-V:>I<configvar>, B<-w> X<-w>, B<-W> X<-W>, B<-X> X<-X>, B<-x> X<-x>,
+B<-x>I<directory>
+
+=back
+
+=item ENVIRONMENT
+X<perl, environment variables>
+
+HOME X<HOME>, LOGDIR X<LOGDIR>, PATH X<PATH>, PERL5LIB X<PERL5LIB>,
+PERL5OPT X<PERL5OPT>, PERLIO X<PERLIO>, :bytes X<:bytes>, :crlf X<:crlf>,
+:mmap X<:mmap>, :perlio X<:perlio>, :pop X<:pop>, :raw X<:raw>, :stdio
+X<:stdio>, :unix X<:unix>, :utf8 X<:utf8>, :win32 X<:win32>, PERLIO_DEBUG
+X<PERLIO_DEBUG>, PERLLIB X<PERLLIB>, PERL5DB X<PERL5DB>, PERL5DB_THREADED
+X<PERL5DB_THREADED>, PERL5SHELL (specific to the Win32 port) X<PERL5SHELL>,
+PERL_ALLOW_NON_IFS_LSP (specific to the Win32 port)
+X<PERL_ALLOW_NON_IFS_LSP>, PERL_DEBUG_MSTATS X<PERL_DEBUG_MSTATS>,
+PERL_DESTRUCT_LEVEL X<PERL_DESTRUCT_LEVEL>, PERL_DL_NONLAZY
+X<PERL_DL_NONLAZY>, PERL_ENCODING X<PERL_ENCODING>, PERL_HASH_SEED
+X<PERL_HASH_SEED>, PERL_HASH_SEED_DEBUG X<PERL_HASH_SEED_DEBUG>, PERL_ROOT
+(specific to the VMS port) X<PERL_ROOT>, PERL_SIGNALS X<PERL_SIGNALS>,
+PERL_UNICODE X<PERL_UNICODE>, SYS$LOGIN (specific to the VMS port)
+X<SYS$LOGIN>
+
+=back
+
+=head2 perldiag - various Perl diagnostics
+
+=over 4
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 perllexwarn - Perl Lexical Warnings
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Default Warnings and Optional Warnings
+
+=item What's wrong with B<-w> and C<$^W>
+
+=item Controlling Warnings from the Command Line
+
+B<-w> X<-w>, B<-W> X<-W>, B<-X> X<-X>
+
+=item Backward Compatibility
+
+=item Category Hierarchy
+X<warning, categories>
+
+=item Fatal Warnings
+X<warning, fatal>
+
+=item Reporting Warnings from a Module
+X<warning, reporting> X<warning, registering>
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perldebug - Perl debugging
+
+=over 4
+
+=item DESCRIPTION
+
+=item The Perl Debugger
+
+=over 4
+
+=item Calling the debugger
+
+perl -d program_name, perl -d -e 0, perl -d:Ptkdb program_name, perl -dt
+threaded_program_name
+
+=item Debugger Commands
+
+h X<debugger command, h>, h [command], h h, p expr X<debugger command, p>,
+x [maxdepth] expr X<debugger command, x>, V [pkg [vars]] X<debugger
+command, V>, X [vars] X<debugger command, X>, y [level [vars]] X<debugger
+command, y>, T X<debugger command, T> X<backtrace> X<stack, backtrace>, s
+[expr] X<debugger command, s> X<step>, n [expr] X<debugger command, n>, r
+X<debugger command, r>, <CR>, c [line|sub] X<debugger command, c>, l
+X<debugger command, l>, l min+incr, l min-max, l line, l subname, -
+X<debugger command, ->, v [line] X<debugger command, v>, . X<debugger
+command, .>, f filename X<debugger command, f>, /pattern/, ?pattern?, L
+[abw] X<debugger command, L>, S [[!]regex] X<debugger command, S>, t
+X<debugger command, t>, t expr X<debugger command, t>, b X<breakpoint>
+X<debugger command, b>, b [line] [condition] X<breakpoint> X<debugger
+command, b>, b subname [condition] X<breakpoint> X<debugger command, b>, b
+postpone subname [condition] X<breakpoint> X<debugger command, b>, b load
+filename X<breakpoint> X<debugger command, b>, b compile subname
+X<breakpoint> X<debugger command, b>, B line X<breakpoint> X<debugger
+command, B>, B * X<breakpoint> X<debugger command, B>, a [line] command
+X<debugger command, a>, A line X<debugger command, A>, A * X<debugger
+command, A>, w expr X<debugger command, w>, W expr X<debugger command, W>,
+W * X<debugger command, W>, o X<debugger command, o>, o booloption ...
+X<debugger command, o>, o anyoption? ... X<debugger command, o>, o
+option=value ... X<debugger command, o>, < ? X<< debugger command, < >>, <
+[ command ] X<< debugger command, < >>, < * X<< debugger command, < >>, <<
+command X<< debugger command, << >>, > ? X<< debugger command, > >>, >
+command X<< debugger command, > >>, > * X<< debugger command, > >>, >>
+command X<<< debugger command, >> >>>, { ? X<debugger command, {>, { [
+command ], { * X<debugger command, {>, {{ command X<debugger command, {{>,
+! number X<debugger command, !>, ! -number X<debugger command, !>, !
+pattern X<debugger command, !>, !! cmd X<debugger command, !!>, source file
+X<debugger command, source>, H -number X<debugger command, H>, q or ^D
+X<debugger command, q> X<debugger command, ^D>, R X<debugger command, R>,
+|dbcmd X<debugger command, |>, ||dbcmd X<debugger command, ||>, command, m
+expr X<debugger command, m>, M X<debugger command, M>, man [manpage]
+X<debugger command, man>
+
+=item Configurable Options
+
+C<recallCommand>, C<ShellBang> X<debugger option, recallCommand> X<debugger
+option, ShellBang>, C<pager> X<debugger option, pager>, C<tkRunning>
+X<debugger option, tkRunning>, C<signalLevel>, C<warnLevel>, C<dieLevel>
+X<debugger option, signalLevel> X<debugger option, warnLevel> X<debugger
+option, dieLevel>, C<AutoTrace> X<debugger option, AutoTrace>, C<LineInfo>
+X<debugger option, LineInfo>, C<inhibit_exit> X<debugger option,
+inhibit_exit>, C<PrintRet> X<debugger option, PrintRet>, C<ornaments>
+X<debugger option, ornaments>, C<frame> X<debugger option, frame>,
+C<maxTraceLen> X<debugger option, maxTraceLen>, C<windowSize> X<debugger
+option, windowSize>, C<arrayDepth>, C<hashDepth> X<debugger option,
+arrayDepth> X<debugger option, hashDepth>, C<dumpDepth> X<debugger option,
+dumpDepth>, C<compactDump>, C<veryCompact> X<debugger option, compactDump>
+X<debugger option, veryCompact>, C<globPrint> X<debugger option,
+globPrint>, C<DumpDBFiles> X<debugger option, DumpDBFiles>, C<DumpPackages>
+X<debugger option, DumpPackages>, C<DumpReused> X<debugger option,
+DumpReused>, C<quote>, C<HighBit>, C<undefPrint> X<debugger option, quote>
+X<debugger option, HighBit> X<debugger option, undefPrint>, C<UsageOnly>
+X<debugger option, UsageOnly>, C<TTY> X<debugger option, TTY>, C<noTTY>
+X<debugger option, noTTY>, C<ReadLine> X<debugger option, ReadLine>,
+C<NonStop> X<debugger option, NonStop>
+
+=item Debugger input/output
+
+Prompt, Multiline commands, Stack backtrace X<backtrace> X<stack,
+backtrace>, Line Listing Format, Frame listing
+
+=item Debugging compile-time statements
+
+=item Debugger Customization
+
+=item Readline Support / History in the debugger
+
+=item Editor Support for Debugging
+
+=item The Perl Profiler
+X<profile> X<profiling> X<profiler>
+
+=back
+
+=item Debugging regular expressions
+X<regular expression, debugging>
+X<regex, debugging> X<regexp, debugging>
+
+=item Debugging memory usage
+X<memory usage>
+
+=item SEE ALSO
+
+=item BUGS
+
+=back
+
+=head2 perlvar - Perl predefined variables
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Predefined Names
+
+$ARG, $_ X<$_> X<$ARG>, $a, $b X<$a> X<$b>, $<I<digits>> X<$1> X<$2> X<$3>,
+$MATCH, $& X<$&> X<$MATCH>, ${^MATCH} X<${^MATCH}>, $PREMATCH, $` X<$`>
+X<$PREMATCH>, ${^PREMATCH} X<${^PREMATCH}>, $POSTMATCH, $' X<$'>
+X<$POSTMATCH>, ${^POSTMATCH} X<${^POSTMATCH}>, $LAST_PAREN_MATCH, $+ X<$+>
+X<$LAST_PAREN_MATCH>, $LAST_SUBMATCH_RESULT, $^N X<$^N>, @LAST_MATCH_END,
+@+ X<@+> X<@LAST_MATCH_END>, %LAST_PAREN_MATCH, %+ X<%+>,
+HANDLE->input_line_number(EXPR), $INPUT_LINE_NUMBER, $NR, $. X<$.> X<$NR>
+X<$INPUT_LINE_NUMBER> X<line number>,
+IO::Handle->input_record_separator(EXPR), $INPUT_RECORD_SEPARATOR, $RS, $/
+X<$/> X<$RS> X<$INPUT_RECORD_SEPARATOR>, HANDLE->autoflush(EXPR),
+$OUTPUT_AUTOFLUSH, $| X<$|> X<autoflush> X<flush> X<$OUTPUT_AUTOFLUSH>,
+IO::Handle->output_field_separator EXPR, $OUTPUT_FIELD_SEPARATOR, $OFS, $,
+X<$,> X<$OFS> X<$OUTPUT_FIELD_SEPARATOR>,
+IO::Handle->output_record_separator EXPR, $OUTPUT_RECORD_SEPARATOR, $ORS,
+$\ X<$\> X<$ORS> X<$OUTPUT_RECORD_SEPARATOR>, $LIST_SEPARATOR, $" X<$">
+X<$LIST_SEPARATOR>, $SUBSCRIPT_SEPARATOR, $SUBSEP, $; X<$;> X<$SUBSEP>
+X<SUBSCRIPT_SEPARATOR>, HANDLE->format_page_number(EXPR),
+$FORMAT_PAGE_NUMBER, $% X<$%> X<$FORMAT_PAGE_NUMBER>,
+HANDLE->format_lines_per_page(EXPR), $FORMAT_LINES_PER_PAGE, $= X<$=>
+X<$FORMAT_LINES_PER_PAGE>, HANDLE->format_lines_left(EXPR),
+$FORMAT_LINES_LEFT, $- X<$-> X<$FORMAT_LINES_LEFT>, @LAST_MATCH_START, @-
+X<@-> X<@LAST_MATCH_START>, C<$`> is the same as C<substr($var, 0, $-[0])>,
+C<$&> is the same as C<substr($var, $-[0], $+[0] - $-[0])>, C<$'> is the
+same as C<substr($var, $+[0])>, C<$1> is the same as C<substr($var, $-[1],
+$+[1] - $-[1])>, C<$2> is the same as C<substr($var, $-[2], $+[2] -
+$-[2])>, C<$3> is the same as C<substr($var, $-[3], $+[3] - $-[3])>, %-
+X<%->, HANDLE->format_name(EXPR), $FORMAT_NAME, $~ X<$~> X<$FORMAT_NAME>,
+HANDLE->format_top_name(EXPR), $FORMAT_TOP_NAME, $^ X<$^>
+X<$FORMAT_TOP_NAME>, IO::Handle->format_line_break_characters EXPR,
+$FORMAT_LINE_BREAK_CHARACTERS, $: X<$:> X<FORMAT_LINE_BREAK_CHARACTERS>,
+IO::Handle->format_formfeed EXPR, $FORMAT_FORMFEED, $^L X<$^L>
+X<$FORMAT_FORMFEED>, $ACCUMULATOR, $^A X<$^A> X<$ACCUMULATOR>,
+$CHILD_ERROR, $? X<$?> X<$CHILD_ERROR>, ${^CHILD_ERROR_NATIVE}
+X<$^CHILD_ERROR_NATIVE>, ${^ENCODING} X<$^ENCODING>, $OS_ERROR, $ERRNO, $!
+X<$!> X<$ERRNO> X<$OS_ERROR>, %OS_ERROR, %ERRNO, %! X<%!>,
+$EXTENDED_OS_ERROR, $^E X<$^E> X<$EXTENDED_OS_ERROR>, $EVAL_ERROR, $@ X<$@>
+X<$EVAL_ERROR>, $PROCESS_ID, $PID, $$ X<$$> X<$PID> X<$PROCESS_ID>,
+$REAL_USER_ID, $UID, $< X<< $< >> X<$UID> X<$REAL_USER_ID>,
+$EFFECTIVE_USER_ID, $EUID, $> X<< $> >> X<$EUID> X<$EFFECTIVE_USER_ID>,
+$REAL_GROUP_ID, $GID, $( X<$(> X<$GID> X<$REAL_GROUP_ID>,
+$EFFECTIVE_GROUP_ID, $EGID, $) X<$)> X<$EGID> X<$EFFECTIVE_GROUP_ID>,
+$PROGRAM_NAME, $0 X<$0> X<$PROGRAM_NAME>, $[ X<$[>, $] X<$]>, $COMPILING,
+$^C X<$^C> X<$COMPILING>, $DEBUGGING, $^D X<$^D> X<$DEBUGGING>,
+${^RE_DEBUG_FLAGS}, ${^RE_TRIE_MAXBUF}, $SYSTEM_FD_MAX, $^F X<$^F>
+X<$SYSTEM_FD_MAX>, $^H, %^H, $INPLACE_EDIT, $^I X<$^I> X<$INPLACE_EDIT>,
+$^M X<$^M>, $OSNAME, $^O X<$^O> X<$OSNAME>, ${^OPEN}, $PERLDB, $^P X<$^P>
+X<$PERLDB>, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200,
+0x400, $LAST_REGEXP_CODE_RESULT, $^R X<$^R> X<$LAST_REGEXP_CODE_RESULT>,
+$EXCEPTIONS_BEING_CAUGHT, $^S X<$^S> X<$EXCEPTIONS_BEING_CAUGHT>,
+$BASETIME, $^T X<$^T> X<$BASETIME>, ${^TAINT}, ${^UNICODE}, ${^UTF8CACHE},
+${^UTF8LOCALE}, $PERL_VERSION, $^V X<$^V> X<$PERL_VERSION>, $WARNING, $^W
+X<$^W> X<$WARNING>, ${^WARNING_BITS}, ${^WIN32_SLOPPY_STAT},
+$EXECUTABLE_NAME, $^X X<$^X> X<$EXECUTABLE_NAME>, ARGV X<ARGV>, $ARGV
+X<$ARGV>, @ARGV X<@ARGV>, ARGVOUT X<ARGVOUT>, @F X<@F>, @INC X<@INC>, @ARG,
+@_ X<@_> X<@ARG>, %INC X<%INC>, %ENV, $ENV{expr} X<%ENV>, %SIG, $SIG{expr}
+X<%SIG>
+
+=item Error Indicators
+X<error> X<exception>
+
+=item Technical Note on the Syntax of Variable Names
+
+=back
+
+=item BUGS
+
+=back
+
+=head2 perlre - Perl regular expressions
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Modifiers
+
+m X</m> X<regex, multiline> X<regexp, multiline> X<regular expression,
+multiline>, s X</s> X<regex, single-line> X<regexp, single-line> X<regular
+expression, single-line>, i X</i> X<regex, case-insensitive> X<regexp,
+case-insensitive> X<regular expression, case-insensitive>, x X</x>, p X</p>
+X<regex, preserve> X<regexp, preserve>, g and c X</g> X</c>
+
+=item Regular Expressions
+
+[1], [2], [3], [1], [2], [3], C<$>, C<+> C<< < >> C<=> C<< > >> C<|> C<~>,
+C<^> C<`>, cntrl X<cntrl>, graph X<graph>, print X<print>, punct X<punct>,
+xdigit X<xdigit>
+
+=item Extended Patterns
+
+C<(?#text)> X<(?#)>, C<(?pimsx-imsx)> X<(?)>, C<(?:pattern)> X<(?:)>,
+C<(?imsx-imsx:pattern)>, C<(?|pattern)> X<(?|)> X<Branch reset>,
+Look-Around Assertions X<look-around assertion> X<lookaround assertion>
+X<look-around> X<lookaround>, C<(?=pattern)> X<(?=)> X<look-ahead,
+positive> X<lookahead, positive>, C<(?!pattern)> X<(?!)> X<look-ahead,
+negative> X<lookahead, negative>, C<(?<=pattern)> C<\K> X<(?<=)>
+X<look-behind, positive> X<lookbehind, positive> X<\K>, C<(?<!pattern)>
+X<(?<!)> X<look-behind, negative> X<lookbehind, negative>,
+C<(?'NAME'pattern)>, C<< (?<NAME>pattern) >> X<< (?<NAME>) >> X<(?'NAME')>
+X<named capture> X<capture>, C<< \k<NAME> >>, C<< \k'NAME' >>, C<(?{ code
+})> X<(?{})> X<regex, code in> X<regexp, code in> X<regular expression,
+code in>, C<(??{ code })> X<(??{})> X<regex, postponed> X<regexp,
+postponed> X<regular expression, postponed>, C<(?PARNO)> C<(?-PARNO)>
+C<(?+PARNO)> C<(?R)> C<(?0)> X<(?PARNO)> X<(?1)> X<(?R)> X<(?0)> X<(?-1)>
+X<(?+1)> X<(?-PARNO)> X<(?+PARNO)> X<regex, recursive> X<regexp, recursive>
+X<regular expression, recursive> X<regex, relative recursion>, C<(?&NAME)>
+X<(?&NAME)>, C<(?(condition)yes-pattern|no-pattern)> X<(?()>,
+C<(?(condition)yes-pattern)>, (1) (2) .., (<NAME>) ('NAME'), (?{ CODE }),
+(R), (R1) (R2) .., (R&NAME), (DEFINE), C<< (?>pattern) >> X<backtrack>
+X<backtracking> X<atomic> X<possessive>
+
+=item Special Backtracking Control Verbs
+
+Verbs that take an argument, C<(*PRUNE)> C<(*PRUNE:NAME)> X<(*PRUNE)>
+X<(*PRUNE:NAME)>, C<(*SKIP)> C<(*SKIP:NAME)> X<(*SKIP)>, C<(*MARK:NAME)>
+C<(*:NAME)> X<(*MARK)> C<(*MARK:NAME)> C<(*:NAME)>, C<(*THEN)>
+C<(*THEN:NAME)>, C<(*COMMIT)> X<(*COMMIT)>, Verbs without an argument,
+C<(*FAIL)> C<(*F)> X<(*FAIL)> X<(*F)>, C<(*ACCEPT)> X<(*ACCEPT)>
+
+=item Backtracking
+X<backtrack> X<backtracking>
+
+=item Version 8 Regular Expressions
+X<regular expression, version 8> X<regex, version 8> X<regexp, version 8>
+
+=item Warning on \1 Instead of $1
+
+=item Repeated Patterns Matching a Zero-length Substring
+
+=item Combining RE Pieces
+
+C<ST>, C<S|T>, C<S{REPEAT_COUNT}>, C<S{min,max}>, C<S{min,max}?>, C<S?>,
+C<S*>, C<S+>, C<S??>, C<S*?>, C<S+?>, C<< (?>S) >>, C<(?=S)>, C<(?<=S)>,
+C<(?!S)>, C<(?<!S)>, C<(??{ EXPR })>, C<(?PARNO)>,
+C<(?(condition)yes-pattern|no-pattern)>
+
+=item Creating Custom RE Engines
+
+=back
+
+=item PCRE/Python Support
+
+C<< (?PE<lt>NAMEE<gt>pattern) >>, C<< (?P=NAME) >>, C<< (?P>NAME) >>
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 perlrebackslash - Perl Regular Expression Backslash Sequences and
+Escapes
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item The backslash
+
+[1]
+
+=item All the sequences and escapes
+
+=item Character Escapes
+
+[1], [2]
+
+=item Modifiers
+
+=item Character classes
+
+=item Referencing
+
+=item Assertions
+
+\A, \z, \Z, \G, \b, \B
+
+=item Misc
+
+\C, \K, \R, \X
+
+=back
+
+=back
+
+=head2 perlrecharclass - Perl Regular Expression Character Classes
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item The dot
+
+=item Backslashed sequences
+
+[1]
+
+=item Bracketed Character Classes
+
+cntrl, graph, print, punct
+
+=item Locale, Unicode and UTF-8
+
+=back
+
+=back
+
+=head2 perlreref - Perl Regular Expressions Reference
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item OPERATORS
+
+=item SYNTAX
+
+=item ESCAPE SEQUENCES
+
+=item CHARACTER CLASSES
+
+=item ANCHORS
+
+=item QUANTIFIERS
+
+=item EXTENDED CONSTRUCTS
+
+=item VARIABLES
+
+=item FUNCTIONS
+
+=item TERMINOLOGY
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item THANKS
+
+=back
+
+=head2 perlref - Perl references and nested data structures
+
+=over 4
+
+=item NOTE
+
+=item DESCRIPTION
+
+=over 4
+
+=item Making References
+X<reference, creation> X<referencing>
+
+1. X<\> X<backslash>, 2. X<array, anonymous> X<[> X<[]> X<square bracket>
+X<bracket, square> X<arrayref> X<array reference> X<reference, array>, 3.
+X<hash, anonymous> X<{> X<{}> X<curly bracket> X<bracket, curly> X<brace>
+X<hashref> X<hash reference> X<reference, hash>, 4. X<subroutine,
+anonymous> X<subroutine, reference> X<reference, subroutine> X<scope,
+lexical> X<closure> X<lexical> X<lexical scope>, 5. X<constructor> X<new>,
+6. X<autovivification>, 7. X<*foo{THING}> X<*>
+
+=item Using References
+X<reference, use> X<dereferencing> X<dereference>
+
+=item Symbolic references
+X<reference, symbolic> X<reference, soft>
+X<symbolic reference> X<soft reference>
+
+=item Not-so-symbolic references
+
+=item Pseudo-hashes: Using an array as a hash
+X<pseudo-hash> X<pseudo hash> X<pseudohash>
+
+=item Function Templates
+X<scope, lexical> X<closure> X<lexical> X<lexical scope>
+X<subroutine, nested> X<sub, nested> X<subroutine, local> X<sub, local>
+
+=back
+
+=item WARNING
+X<reference, string context> X<reference, use as hash key>
+
+=item SEE ALSO
+
+=back
+
+=head2 perlform - Perl formats
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Text Fields
+X<format, text field>
+
+=item Numeric Fields
+X<#> X<format, numeric field>
+
+=item The Field @* for Variable Width Multi-Line Text
+X<@*>
+
+=item The Field ^* for Variable Width One-line-at-a-time Text
+X<^*>
+
+=item Specifying Values
+X<format, specifying values>
+
+=item Using Fill Mode
+X<format, fill mode>
+
+=item Suppressing Lines Where All Fields Are Void
+X<format, suppressing lines>
+
+=item Repeating Format Lines
+X<format, repeating lines>
+
+=item Top of Form Processing
+X<format, top of form> X<top> X<header>
+
+=item Format Variables
+X<format variables>
+X<format, variables>
+
+=back
+
+=item NOTES
+
+=over 4
+
+=item Footers
+X<format, footer> X<footer>
+
+=item Accessing Formatting Internals
+X<format, internals>
+
+=back
+
+=item WARNINGS
+
+=back
+
+=head2 perlobj - Perl objects
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item An Object is Simply a Reference
+X<object> X<bless> X<constructor> X<new>
+
+=item A Class is Simply a Package
+X<class> X<package> X<@ISA> X<inheritance>
+
+=item A Method is Simply a Subroutine
+X<method>
+
+=item Method Invocation
+X<invocation> X<method> X<arrow> X<< -> >>
+
+=item Indirect Object Syntax
+X<indirect object syntax> X<invocation, indirect> X<indirect>
+
+=item Default UNIVERSAL methods
+X<UNIVERSAL>
+
+isa(CLASS) X<isa>, DOES(ROLE) X<DOES>, can(METHOD) X<can>, VERSION( [NEED]
+) X<VERSION>
+
+=item Destructors
+X<destructor> X<DESTROY>
+
+=item Summary
+
+=item Two-Phased Garbage Collection
+X<garbage collection> X<GC> X<circular reference>
+X<reference, circular> X<DESTROY> X<destructor>
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perltie - how to hide an object class in a simple variable
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Tying Scalars
+X<scalar, tying>
+
+TIESCALAR classname, LIST X<TIESCALAR>, FETCH this X<FETCH>, STORE this,
+value X<STORE>, UNTIE this X<UNTIE>, DESTROY this X<DESTROY>
+
+=item Tying Arrays
+X<array, tying>
+
+TIEARRAY classname, LIST X<TIEARRAY>, FETCH this, index X<FETCH>, STORE
+this, index, value X<STORE>, FETCHSIZE this X<FETCHSIZE>, STORESIZE this,
+count X<STORESIZE>, EXTEND this, count X<EXTEND>, EXISTS this, key
+X<EXISTS>, DELETE this, key X<DELETE>, CLEAR this X<CLEAR>, PUSH this, LIST
+ X<PUSH>, POP this X<POP>, SHIFT this X<SHIFT>, UNSHIFT this, LIST
+X<UNSHIFT>, SPLICE this, offset, length, LIST X<SPLICE>, UNTIE this
+X<UNTIE>, DESTROY this X<DESTROY>
+
+=item Tying Hashes
+X<hash, tying>
+
+USER, HOME, CLOBBER, LIST, TIEHASH classname, LIST X<TIEHASH>, FETCH this,
+key X<FETCH>, STORE this, key, value X<STORE>, DELETE this, key X<DELETE>,
+CLEAR this X<CLEAR>, EXISTS this, key X<EXISTS>, FIRSTKEY this X<FIRSTKEY>,
+NEXTKEY this, lastkey X<NEXTKEY>, SCALAR this X<SCALAR>, UNTIE this
+X<UNTIE>, DESTROY this X<DESTROY>
+
+=item Tying FileHandles
+X<filehandle, tying>
+
+TIEHANDLE classname, LIST X<TIEHANDLE>, WRITE this, LIST X<WRITE>, PRINT
+this, LIST X<PRINT>, PRINTF this, LIST X<PRINTF>, READ this, LIST X<READ>,
+READLINE this X<READLINE>, GETC this X<GETC>, CLOSE this X<CLOSE>, UNTIE
+this X<UNTIE>, DESTROY this X<DESTROY>
+
+=item UNTIE this
+X<UNTIE>
+
+=item The C<untie> Gotcha
+X<untie>
+
+=back
+
+=item SEE ALSO
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 perldbmfilter - Perl DBM Filters
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<filter_store_key>, B<filter_store_value>, B<filter_fetch_key>,
+B<filter_fetch_value>
+
+=over 4
+
+=item The Filter
+
+=item An Example -- the NULL termination problem.
+
+=item Another Example -- Key is a C int.
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perlipc - Perl interprocess communication (signals, fifos, pipes,
+safe subprocesses, sockets, and semaphores)
+
+=over 4
+
+=item DESCRIPTION
+
+=item Signals
+
+=over 4
+
+=item Handling the SIGHUP Signal in Daemons
+
+=back
+
+=item Named Pipes
+
+=over 4
+
+=item Deferred Signals (Safe Signals)
+
+Long-running opcodes, Interrupting IO, Restartable system calls, Signals as
+"faults", Signals triggered by operating system state
+
+=back
+
+=item Using open() for IPC
+
+=over 4
+
+=item Filehandles
+
+=item Background Processes
+
+=item Complete Dissociation of Child from Parent
+
+=item Safe Pipe Opens
+
+=item Avoiding Pipe Deadlocks
+
+=item Bidirectional Communication with Another Process
+
+=item Bidirectional Communication with Yourself
+
+=back
+
+=item Sockets: Client/Server Communication
+
+=over 4
+
+=item Internet Line Terminators
+
+=item Internet TCP Clients and Servers
+
+=item Unix-Domain TCP Clients and Servers
+
+=back
+
+=item TCP Clients with IO::Socket
+
+=over 4
+
+=item A Simple Client
+
+C<Proto>, C<PeerAddr>, C<PeerPort>
+
+=item A Webget Client
+
+=item Interactive Client with IO::Socket
+
+=back
+
+=item TCP Servers with IO::Socket
+
+Proto, LocalPort, Listen, Reuse
+
+=item UDP: Message Passing
+
+=item SysV IPC
+
+=item NOTES
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlfork - Perl's fork() emulation
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Behavior of other Perl features in forked pseudo-processes
+
+$$ or $PROCESS_ID, %ENV, chdir() and all other builtins that accept
+filenames, wait() and waitpid(), kill(), exec(), exit(), Open handles to
+files, directories and network sockets
+
+=item Resource limits
+
+=item Killing the parent process
+
+=item Lifetime of the parent process and pseudo-processes
+
+=item CAVEATS AND LIMITATIONS
+
+BEGIN blocks, Open filehandles, Forking pipe open() not yet implemented,
+Global state maintained by XSUBs, Interpreter embedded in larger
+application, Thread-safety of extensions
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlnumber - semantics of numbers and numeric operations in Perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Storing numbers
+
+=item Numeric operators and numeric conversions
+
+=item Flavors of Perl numeric operations
+
+Arithmetic operators, ++, Arithmetic operators during C<use integer>, Other
+mathematical operators, Bitwise operators, Bitwise operators during C<use
+integer>, Operators which expect an integer, Operators which expect a
+string
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlthrtut - Tutorial on threads in Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=item What Is A Thread Anyway?
+
+=item Threaded Program Models
+
+=over 4
+
+=item Boss/Worker
+
+=item Work Crew
+
+=item Pipeline
+
+=back
+
+=item What kind of threads are Perl threads?
+
+=item Thread-Safe Modules
+
+=item Thread Basics
+
+=over 4
+
+=item Basic Thread Support
+
+=item A Note about the Examples
+
+=item Creating Threads
+
+=item Waiting For A Thread To Exit
+
+=item Ignoring A Thread
+
+=item Process and Thread Termination
+
+=back
+
+=item Threads And Data
+
+=over 4
+
+=item Shared And Unshared Data
+
+=item Thread Pitfalls: Races
+
+=back
+
+=item Synchronization and control
+
+=over 4
+
+=item Controlling access: lock()
+
+=item A Thread Pitfall: Deadlocks
+
+=item Queues: Passing Data Around
+
+=item Semaphores: Synchronizing Data Access
+
+=item Basic semaphores
+
+=item Advanced Semaphores
+
+=item Waiting for a Condition
+
+=item Giving up control
+
+=back
+
+=item General Thread Utility Routines
+
+=over 4
+
+=item What Thread Am I In?
+
+=item Thread IDs
+
+=item Are These Threads The Same?
+
+=item What Threads Are Running?
+
+=back
+
+=item A Complete Example
+
+=item Different implementations of threads
+
+=item Performance considerations
+
+=item Process-scope Changes
+
+=item Thread-Safety of System Libraries
+
+=item Conclusion
+
+=item SEE ALSO
+
+=item Bibliography
+
+=over 4
+
+=item Introductory Texts
+
+=item OS-Related References
+
+=item Other References
+
+=back
+
+=item Acknowledgements
+
+=item AUTHOR
+
+=item Copyrights
+
+=back
+
+=head2 perlothrtut - old tutorial on threads in Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=item What Is A Thread Anyway?
+
+=item Threaded Program Models
+
+=over 4
+
+=item Boss/Worker
+
+=item Work Crew
+
+=item Pipeline
+
+=back
+
+=item Native threads
+
+=item What kind of threads are perl threads?
+
+=item Threadsafe Modules
+
+=item Thread Basics
+
+=over 4
+
+=item Basic Thread Support
+
+=item Creating Threads
+
+=item Giving up control
+
+=item Waiting For A Thread To Exit
+
+=item Errors In Threads
+
+=item Ignoring A Thread
+
+=back
+
+=item Threads And Data
+
+=over 4
+
+=item Shared And Unshared Data
+
+=item Thread Pitfall: Races
+
+=item Controlling access: lock()
+
+=item Thread Pitfall: Deadlocks
+
+=item Queues: Passing Data Around
+
+=back
+
+=item Threads And Code
+
+=over 4
+
+=item Semaphores: Synchronizing Data Access
+
+Basic semaphores, Advanced Semaphores
+
+=item Attributes: Restricting Access To Subroutines
+
+=item Subroutine Locks
+
+=item Methods
+
+=item Locking A Subroutine
+
+=back
+
+=item General Thread Utility Routines
+
+=over 4
+
+=item What Thread Am I In?
+
+=item Thread IDs
+
+=item Are These Threads The Same?
+
+=item What Threads Are Running?
+
+=back
+
+=item A Complete Example
+
+=item Conclusion
+
+=item Bibliography
+
+=over 4
+
+=item Introductory Texts
+
+=item OS-Related References
+
+=item Other References
+
+=back
+
+=item Acknowledgements
+
+=item AUTHOR
+
+=item Copyrights
+
+=back
+
+=head2 perlport - Writing portable Perl
+
+=over 4
+
+=item DESCRIPTION
+
+Not all Perl programs have to be portable, Nearly all of Perl already I<is>
+portable
+
+=item ISSUES
+
+=over 4
+
+=item Newlines
+
+=item Numbers endianness and Width
+
+=item Files and Filesystems
+
+=item System Interaction
+
+=item Command names versus file pathnames
+
+=item Networking
+
+=item Interprocess Communication (IPC)
+
+=item External Subroutines (XS)
+
+=item Standard Modules
+
+=item Time and Date
+
+=item Character sets and character encoding
+
+=item Internationalisation
+
+=item System Resources
+
+=item Security
+
+=item Style
+
+=back
+
+=item CPAN Testers
+
+=item PLATFORMS
+
+=over 4
+
+=item Unix
+
+=item DOS and Derivatives
+
+=item S<Mac OS>
+
+=item VMS
+
+=item VOS
+
+=item EBCDIC Platforms
+
+=item Acorn RISC OS
+
+=item Other perls
+
+=back
+
+=item FUNCTION IMPLEMENTATIONS
+
+=over 4
+
+=item Alphabetical Listing of Perl Functions
+
+-I<X>, atan2, binmode, chmod, chown, chroot, crypt, dbmclose, dbmopen,
+dump, exec, exit, fcntl, flock, fork, getlogin, getpgrp, getppid,
+getpriority, getpwnam, getgrnam, getnetbyname, getpwuid, getgrgid,
+getnetbyaddr, getprotobynumber, getservbyport, getpwent, getgrent,
+gethostbyname, gethostent, getnetent, getprotoent, getservent, sethostent,
+setnetent, setprotoent, setservent, endpwent, endgrent, endhostent,
+endnetent, endprotoent, endservent, getsockopt SOCKET,LEVEL,OPTNAME, glob,
+gmtime, ioctl FILEHANDLE,FUNCTION,SCALAR, kill, link, localtime, lstat,
+msgctl, msgget, msgsnd, msgrcv, open, pipe, readlink, rename, select,
+semctl, semget, semop, setgrent, setpgrp, setpriority, setpwent,
+setsockopt, shmctl, shmget, shmread, shmwrite, sockatmark, socketpair,
+stat, symlink, syscall, sysopen, system, times, truncate, umask, utime,
+wait, waitpid
+
+=back
+
+=item Supported Platforms
+
+=item SEE ALSO
+
+=item AUTHORS / CONTRIBUTORS
+
+=back
+
+=head2 perllocale - Perl locale handling (internationalization and
+localization)
+
+=over 4
+
+=item DESCRIPTION
+
+=item PREPARING TO USE LOCALES
+
+=item USING LOCALES
+
+=over 4
+
+=item The use locale pragma
+
+=item The setlocale function
+
+=item Finding locales
+
+=item LOCALE PROBLEMS
+
+=item Temporarily fixing locale problems
+
+=item Permanently fixing locale problems
+
+=item Permanently fixing your system's locale configuration
+
+=item Fixing system locale configuration
+
+=item The localeconv function
+
+=item I18N::Langinfo
+
+=back
+
+=item LOCALE CATEGORIES
+
+=over 4
+
+=item Category LC_COLLATE: Collation
+
+=item Category LC_CTYPE: Character Types
+
+=item Category LC_NUMERIC: Numeric Formatting
+
+=item Category LC_MONETARY: Formatting of monetary amounts
+
+=item LC_TIME
+
+=item Other categories
+
+=back
+
+=item SECURITY
+
+=item ENVIRONMENT
+
+PERL_BADLANG, LC_ALL, LANGUAGE, LC_CTYPE, LC_COLLATE, LC_MONETARY,
+LC_NUMERIC, LC_TIME, LANG
+
+=over 4
+
+=item Examples
+
+=back
+
+=item NOTES
+
+=over 4
+
+=item Backward compatibility
+
+=item I18N:Collate obsolete
+
+=item Sort speed and memory use impacts
+
+=item write() and LC_NUMERIC
+
+=item Freely available locale definitions
+
+=item I18n and l10n
+
+=item An imperfect standard
+
+=back
+
+=item Unicode and UTF-8
+
+=item BUGS
+
+=over 4
+
+=item Broken systems
+
+=back
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perluniintro - Perl Unicode introduction
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Unicode
+
+=item Perl's Unicode Support
+
+=item Perl's Unicode Model
+
+=item Unicode and EBCDIC
+
+=item Creating Unicode
+
+=item Handling Unicode
+
+=item Legacy Encodings
+
+=item Unicode I/O
+
+=item Displaying Unicode As Text
+
+=item Special Cases
+
+=item Advanced Topics
+
+=item Miscellaneous
+
+=item Questions With Answers
+
+=item Hexadecimal Notation
+
+=item Further Resources
+
+=back
+
+=item UNICODE IN OLDER PERLS
+
+=item SEE ALSO
+
+=item ACKNOWLEDGMENTS
+
+=item AUTHOR, COPYRIGHT, AND LICENSE
+
+=back
+
+=head2 perlunicode - Unicode support in Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Important Caveats
+
+Input and Output Layers, Regular Expressions, C<use utf8> still needed to
+enable UTF-8/UTF-EBCDIC in scripts, BOM-marked scripts and UTF-16 scripts
+autodetected, C<use encoding> needed to upgrade non-Latin-1 byte strings
+
+=item Byte and Character Semantics
+
+=item Effects of Character Semantics
+
+=item Unicode Character Properties
+
+General Category, Bidirectional Character Types, Scripts, Extended property
+classes, Use of "Is" Prefix, Blocks
+
+=item User-Defined Character Properties
+
+=item User-Defined Case Mappings
+
+=item Character Encodings for Input and Output
+
+=item Unicode Regular Expression Support Level
+
+=item Unicode Encodings
+
+=item Security Implications of Unicode
+
+=item Unicode in Perl on EBCDIC
+
+=item Locales
+
+=item When Unicode Does Not Happen
+
+=item Forcing Unicode in Perl (Or Unforcing Unicode in Perl)
+
+=item Using Unicode in XS
+
+=back
+
+=item BUGS
+
+=over 4
+
+=item Interaction with Locales
+
+=item Problems with characters whose ordinal numbers are in the range 128 -
+255 with no Locale specified
+
+=item Interaction with Extensions
+
+=item Speed
+
+=item Possible problems on EBCDIC platforms
+
+=item Porting code from perl-5.6.X
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlunifaq - Perl Unicode FAQ
+
+=over 4
+
+=item Q and A
+
+=over 4
+
+=item perlunitut isn't really a Unicode tutorial, is it?
+
+=item What character encodings does Perl support?
+
+=item Which version of perl should I use?
+
+=item What about binary data, like images?
+
+=item When should I decode or encode?
+
+=item What if I don't decode?
+
+=item What if I don't encode?
+
+=item Is there a way to automatically decode or encode?
+
+=item What if I don't know which encoding was used?
+
+=item Can I use Unicode in my Perl sources?
+
+=item Data::Dumper doesn't restore the UTF8 flag; is it broken?
+
+=item Why do regex character classes sometimes match only in the ASCII
+range?
+
+=item Why do some characters not uppercase or lowercase correctly?
+
+=item How can I determine if a string is a text string or a binary string?
+
+=item How do I convert from encoding FOO to encoding BAR?
+
+=item What are C<decode_utf8> and C<encode_utf8>?
+
+=item What is a "wide character"?
+
+=back
+
+=item INTERNALS
+
+=over 4
+
+=item What is "the UTF8 flag"?
+
+=item What about the C<use bytes> pragma?
+
+=item What about the C<use encoding> pragma?
+
+=item What is the difference between C<:encoding> and C<:utf8>?
+
+=item What's the difference between C<UTF-8> and C<utf8>?
+
+=item I lost track; what encoding is the internal format really?
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlunitut - Perl Unicode Tutorial
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Definitions
+
+=item Your new toolkit
+
+=item I/O flow (the actual 5 minute tutorial)
+
+=back
+
+=item SUMMARY
+
+=item Q and A (or FAQ)
+
+=item ACKNOWLEDGEMENTS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlebcdic - Considerations for running Perl on EBCDIC platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=item COMMON CHARACTER CODE SETS
+
+=over 4
+
+=item ASCII
+
+=item ISO 8859
+
+=item Latin 1 (ISO 8859-1)
+
+=item EBCDIC
+
+=item The 13 variant characters
+
+=item 0037
+
+=item 1047
+
+=item POSIX-BC
+
+=item Unicode code points versus EBCDIC code points
+
+=item Remaining Perl Unicode problems in EBCDIC
+
+=item Unicode and UTF
+
+=item Using Encode
+
+=back
+
+=item SINGLE OCTET TABLES
+
+recipe 0, recipe 1, recipe 2, recipe 3, recipe 4, recipe 5, recipe 6
+
+=item IDENTIFYING CHARACTER CODE SETS
+
+=item CONVERSIONS
+
+=over 4
+
+=item tr///
+
+=item iconv
+
+=item C RTL
+
+=back
+
+=item OPERATOR DIFFERENCES
+
+=item FUNCTION DIFFERENCES
+
+chr(), ord(), pack(), print(), printf(), sort(), sprintf(), unpack()
+
+=item REGULAR EXPRESSION DIFFERENCES
+
+=item SOCKETS
+
+=item SORTING
+
+=over 4
+
+=item Ignore ASCII vs. EBCDIC sort differences.
+
+=item MONO CASE then sort data.
+
+=item Convert, sort data, then re convert.
+
+=item Perform sorting on one type of platform only.
+
+=back
+
+=item TRANSFORMATION FORMATS
+
+=over 4
+
+=item URL decoding and encoding
+
+=item uu encoding and decoding
+
+=item Quoted-Printable encoding and decoding
+
+=item Caesarian ciphers
+
+=back
+
+=item Hashing order and checksums
+
+=item I18N AND L10N
+
+=item MULTI OCTET CHARACTER SETS
+
+=item OS ISSUES
+
+=over 4
+
+=item OS/400
+
+PASE, IFS access
+
+=item OS/390, z/OS
+
+chcp, dataset access, OS/390, z/OS iconv, locales
+
+=item VM/ESA?
+
+=item POSIX-BC?
+
+=back
+
+=item BUGS
+
+=item SEE ALSO
+
+=item REFERENCES
+
+=item HISTORY
+
+=item AUTHOR
+
+=back
+
+=head2 perlsec - Perl security
+
+=over 4
+
+=item DESCRIPTION
+
+=item SECURITY VULNERABILITY CONTACT INFORMATION
+
+=item SECURITY MECHANISMS AND CONCERNS
+
+=over 4
+
+=item Taint mode
+
+=item Laundering and Detecting Tainted Data
+
+=item Switches On the "#!" Line
+
+=item Taint mode and @INC
+
+=item Cleaning Up Your Path
+
+=item Security Bugs
+
+=item Protecting Your Programs
+
+=item Unicode
+
+=item Algorithmic Complexity Attacks
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlmod - Perl modules (packages and symbol tables)
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Packages
+X<package> X<namespace> X<variable, global> X<global variable> X<global>
+
+=item Symbol Tables
+X<symbol table> X<stash> X<%::> X<%main::> X<typeglob> X<glob> X<alias>
+
+=item BEGIN, UNITCHECK, CHECK, INIT and END
+X<BEGIN> X<UNITCHECK> X<CHECK> X<INIT> X<END>
+
+=item Perl Classes
+X<class> X<@ISA>
+
+=item Perl Modules
+X<module>
+
+=item Making your module threadsafe
+X<threadsafe> X<thread safe>
+X<module, threadsafe> X<module, thread safe>
+X<CLONE> X<CLONE_SKIP> X<thread> X<threads> X<ithread>
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlmodlib - constructing new Perl modules and finding existing ones
+
+=over 4
+
+=item THE PERL MODULE LIBRARY
+
+=over 4
+
+=item Pragmatic Modules
+
+attributes, attrs, autodie, autodie::exception, autodie::exception::system,
+autodie::hints, autouse, base, bigint, bignum, bigrat, blib, bytes,
+charnames, constant, diagnostics, encoding, encoding::warnings, feature,
+fields, filetest, if, integer, less, lib, locale, mro, open, ops, overload,
+overloading, parent, re, sigtrap, sort, strict, subs, threads,
+threads::shared, utf8, vars, version, vmsish, warnings, warnings::register
+
+=item Standard Modules
+
+AnyDBM_File, App::Prove, App::Prove::State, App::Prove::State::Result,
+App::Prove::State::Result::Test, Archive::Extract, Archive::Tar,
+Archive::Tar::File, Attribute::Handlers, AutoLoader, AutoSplit, B,
+B::Concise, B::Debug, B::Deparse, B::Lint, B::Lint::Debug, B::Showlex,
+B::Terse, B::Xref, Benchmark, CGI, CGI::Apache, CGI::Carp, CGI::Cookie,
+CGI::Fast, CGI::Pretty, CGI::Push, CGI::Switch, CGI::Util, CORE, CPAN,
+CPAN::API::HOWTO, CPAN::Distroprefs, CPAN::FirstTime, CPAN::Kwalify,
+CPAN::Nox, CPAN::Version, CPANPLUS, CPANPLUS::Dist::Base,
+CPANPLUS::Dist::Build, CPANPLUS::Dist::Build::Constants,
+CPANPLUS::Dist::Sample, CPANPLUS::Internals::Source::Memory,
+CPANPLUS::Internals::Source::SQLite, CPANPLUS::Shell::Classic,
+CPANPLUS::Shell::Default::Plugins::HOWTO, Carp, Carp::Heavy, Class::ISA,
+Class::Struct, Compress::Raw::Bzip2, Compress::Raw::Bzip2::FAQ,
+Compress::Raw::Zlib, Compress::Raw::Zlib::FAQ, Compress::Zlib, Config, Cwd,
+DB, DBM_Filter, DBM_Filter::compress, DBM_Filter::encode,
+DBM_Filter::int32, DBM_Filter::null, DBM_Filter::utf8, DB_File,
+Data::Dumper, Devel::DProf, Devel::InnerPackage, Devel::PPPort,
+Devel::Peek, Devel::SelfStubber, Digest, Digest::MD5, Digest::SHA,
+Digest::base, Digest::file, DirHandle, Dumpvalue, DynaLoader, Encode,
+Encode::Alias, Encode::Byte, Encode::CJKConstants, Encode::CN,
+Encode::CN::HZ, Encode::Config, Encode::EBCDIC, Encode::Encoder,
+Encode::Encoding, Encode::GSM0338, Encode::Guess, Encode::JP,
+Encode::JP::H2Z, Encode::JP::JIS7, Encode::KR, Encode::KR::2022_KR,
+Encode::MIME::Header, Encode::MIME::Name, Encode::PerlIO,
+Encode::Supported, Encode::Symbol, Encode::TW, Encode::Unicode,
+Encode::Unicode::UTF7, English, Env, Errno, Exporter, Exporter::Heavy,
+ExtUtils::CBuilder, ExtUtils::CBuilder::Platform::Windows,
+ExtUtils::Command, ExtUtils::Command::MM, ExtUtils::Constant,
+ExtUtils::Constant::Base, ExtUtils::Constant::Utils,
+ExtUtils::Constant::XS, ExtUtils::Embed, ExtUtils::Install,
+ExtUtils::Installed, ExtUtils::Liblist, ExtUtils::MM, ExtUtils::MM_AIX,
+ExtUtils::MM_Any, ExtUtils::MM_BeOS, ExtUtils::MM_Cygwin, ExtUtils::MM_DOS,
+ExtUtils::MM_Darwin, ExtUtils::MM_MacOS, ExtUtils::MM_NW5,
+ExtUtils::MM_OS2, ExtUtils::MM_QNX, ExtUtils::MM_UWIN, ExtUtils::MM_Unix,
+ExtUtils::MM_VMS, ExtUtils::MM_VOS, ExtUtils::MM_Win32, ExtUtils::MM_Win95,
+ExtUtils::MY, ExtUtils::MakeMaker, ExtUtils::MakeMaker::Config,
+ExtUtils::MakeMaker::FAQ, ExtUtils::MakeMaker::Tutorial,
+ExtUtils::Manifest, ExtUtils::Mkbootstrap, ExtUtils::Mksymlists,
+ExtUtils::Packlist, ExtUtils::ParseXS, ExtUtils::XSSymSet,
+ExtUtils::testlib, Fatal, Fcntl, File::Basename, File::CheckTree,
+File::Compare, File::Copy, File::DosGlob, File::Fetch, File::Find,
+File::Glob, File::GlobMapper, File::Path, File::Spec, File::Spec::Cygwin,
+File::Spec::Epoc, File::Spec::Functions, File::Spec::Mac, File::Spec::OS2,
+File::Spec::Unix, File::Spec::VMS, File::Spec::Win32, File::Temp,
+File::stat, FileCache, FileHandle, Filter::Simple, Filter::Util::Call,
+FindBin, GDBM_File, Getopt::Long, Getopt::Std, Hash::Util,
+Hash::Util::FieldHash, I18N::Collate, I18N::LangTags,
+I18N::LangTags::Detect, I18N::LangTags::List, I18N::Langinfo, IO,
+IO::Compress::Base, IO::Compress::Bzip2, IO::Compress::Deflate,
+IO::Compress::FAQ, IO::Compress::Gzip, IO::Compress::RawDeflate,
+IO::Compress::Zip, IO::Dir, IO::File, IO::Handle, IO::Pipe, IO::Poll,
+IO::Seekable, IO::Select, IO::Socket, IO::Socket::INET, IO::Socket::UNIX,
+IO::Uncompress::AnyInflate, IO::Uncompress::AnyUncompress,
+IO::Uncompress::Base, IO::Uncompress::Bunzip2, IO::Uncompress::Gunzip,
+IO::Uncompress::Inflate, IO::Uncompress::RawInflate, IO::Uncompress::Unzip,
+IO::Zlib, IPC::Cmd, IPC::Msg, IPC::Open2, IPC::Open3, IPC::Semaphore,
+IPC::SharedMem, IPC::SysV, List::Util, List::Util::XS, Locale::Constants,
+Locale::Country, Locale::Currency, Locale::Language, Locale::Maketext,
+Locale::Maketext::Simple, Locale::Maketext::TPJ13, Locale::Script,
+Log::Message, Log::Message::Config, Log::Message::Handlers,
+Log::Message::Item, MIME::Base64, MIME::QuotedPrint, Math::BigFloat,
+Math::BigInt, Math::BigInt::Calc, Math::BigInt::CalcEmu,
+Math::BigInt::FastCalc, Math::BigRat, Math::Complex, Math::Trig, Memoize,
+Memoize::AnyDBM_File, Memoize::Expire, Memoize::ExpireFile,
+Memoize::ExpireTest, Memoize::NDBM_File, Memoize::SDBM_File,
+Memoize::Storable, Module::Build, Module::Build::API,
+Module::Build::Authoring, Module::Build::Base, Module::Build::Compat,
+Module::Build::ConfigData, Module::Build::Cookbook,
+Module::Build::ModuleInfo, Module::Build::Notes, Module::Build::PPMMaker,
+Module::Build::Platform::Amiga, Module::Build::Platform::Default,
+Module::Build::Platform::EBCDIC, Module::Build::Platform::MPEiX,
+Module::Build::Platform::MacOS, Module::Build::Platform::RiscOS,
+Module::Build::Platform::Unix, Module::Build::Platform::VMS,
+Module::Build::Platform::VOS, Module::Build::Platform::Windows,
+Module::Build::Platform::aix, Module::Build::Platform::cygwin,
+Module::Build::Platform::darwin, Module::Build::Platform::os2,
+Module::Build::YAML, Module::CoreList, Module::Load,
+Module::Load::Conditional, Module::Loaded, Module::Pluggable,
+Module::Pluggable::Object, NDBM_File, NEXT, Net::Cmd, Net::Config,
+Net::Domain, Net::FTP, Net::NNTP, Net::Netrc, Net::POP3, Net::Ping,
+Net::SMTP, Net::Time, Net::hostent, Net::libnetFAQ, Net::netent,
+Net::protoent, Net::servent, O, ODBM_File, Opcode, POSIX,
+Package::Constants, Params::Check, Parse::CPAN::Meta, PerlIO,
+PerlIO::encoding, PerlIO::scalar, PerlIO::via, PerlIO::via::QuotedPrint,
+Pod::Checker, Pod::Escapes, Pod::Find, Pod::Functions, Pod::Html,
+Pod::InputObjects, Pod::LaTeX, Pod::Man, Pod::ParseLink, Pod::ParseUtils,
+Pod::Parser, Pod::Perldoc::ToChecker, Pod::Perldoc::ToMan,
+Pod::Perldoc::ToNroff, Pod::Perldoc::ToPod, Pod::Perldoc::ToRtf,
+Pod::Perldoc::ToText, Pod::Perldoc::ToTk, Pod::Perldoc::ToXml,
+Pod::PlainText, Pod::Plainer, Pod::Select, Pod::Simple,
+Pod::Simple::Checker, Pod::Simple::Debug, Pod::Simple::DumpAsText,
+Pod::Simple::DumpAsXML, Pod::Simple::HTML, Pod::Simple::HTMLBatch,
+Pod::Simple::LinkSection, Pod::Simple::Methody, Pod::Simple::PullParser,
+Pod::Simple::PullParserEndToken, Pod::Simple::PullParserStartToken,
+Pod::Simple::PullParserTextToken, Pod::Simple::PullParserToken,
+Pod::Simple::RTF, Pod::Simple::Search, Pod::Simple::SimpleTree,
+Pod::Simple::Subclassing, Pod::Simple::Text, Pod::Simple::TextContent,
+Pod::Simple::XHTML, Pod::Simple::XMLOutStream, Pod::Text, Pod::Text::Color,
+Pod::Text::Termcap, Pod::Usage, SDBM_File, Safe, Scalar::Util,
+Search::Dict, SelectSaver, SelfLoader, Shell, Socket, Storable, Switch,
+Symbol, Sys::Hostname, Sys::Syslog, Sys::Syslog::Win32, TAP::Base,
+TAP::Formatter::Color, TAP::Formatter::Console, TAP::Formatter::Console,
+TAP::Formatter::Console::ParallelSession, TAP::Formatter::Console::Session,
+TAP::Formatter::File, TAP::Formatter::File::Session,
+TAP::Formatter::Session, TAP::Harness, TAP::Object, TAP::Parser,
+TAP::Parser::Aggregator, TAP::Parser::Grammar, TAP::Parser::Iterator,
+TAP::Parser::Iterator::Array, TAP::Parser::Iterator::Process,
+TAP::Parser::Iterator::Stream, TAP::Parser::IteratorFactory,
+TAP::Parser::Multiplexer, TAP::Parser::Result,
+TAP::Parser::Result::Bailout, TAP::Parser::Result::Comment,
+TAP::Parser::Result::Plan, TAP::Parser::Result::Pragma,
+TAP::Parser::Result::Test, TAP::Parser::Result::Unknown,
+TAP::Parser::Result::Version, TAP::Parser::Result::YAML,
+TAP::Parser::ResultFactory, TAP::Parser::Scheduler,
+TAP::Parser::Scheduler::Job, TAP::Parser::Scheduler::Spinner,
+TAP::Parser::Source, TAP::Parser::Source::Perl, TAP::Parser::Utils,
+TAP::Parser::YAMLish::Reader, TAP::Parser::YAMLish::Writer,
+Term::ANSIColor, Term::Cap, Term::Complete, Term::ReadLine, Term::UI, Test,
+Test::Builder, Test::Builder::Module, Test::Builder::Tester,
+Test::Builder::Tester::Color, Test::Harness, Test::More, Test::Simple,
+Test::Tutorial, Text::Abbrev, Text::Balanced, Text::ParseWords,
+Text::Soundex, Text::Tabs, Text::Wrap, Thread, Thread::Queue,
+Thread::Semaphore, Tie::Array, Tie::File, Tie::Handle, Tie::Hash,
+Tie::Hash::NamedCapture, Tie::Memoize, Tie::RefHash, Tie::Scalar,
+Tie::StdHandle, Tie::SubstrHash, Time::HiRes, Time::Local, Time::Piece,
+Time::Seconds, Time::gmtime, Time::localtime, Time::tm, UNIVERSAL,
+Unicode::Collate, Unicode::Normalize, Unicode::UCD, User::grent,
+User::pwent, Win32, Win32API::File, Win32CORE, XS::APItest, XS::Typemap,
+XSLoader, version::Internal
+
+=item Extension Modules
+
+=back
+
+=item CPAN
+
+=over 4
+
+=item Africa
+
+South Africa
+
+=item Asia
+
+China, Indonesia, Israel, Japan, Malaysia, Russian Federation, Saudi
+Arabia, Singapore, South Korea, Taiwan, Thailand
+
+=item Central America
+
+Costa Rica
+
+=item Europe
+
+Austria, Belgium, Bosnia and Herzegovina, Bulgaria, Croatia, Czech
+Republic, Denmark, Estonia, Finland, France, Germany, Greece, Hungary,
+Iceland, Ireland, Italy, Latvia, Lithuania, Netherlands, Norway, Poland,
+Portugal, Romania, Russia, Slovakia, Slovenia, Spain, Sweden, Switzerland,
+Turkey, Ukraine, United Kingdom
+
+=item North America
+
+Canada, Alberta, Manitoba, Nova Scotia, Ontario, Mexico, United States,
+Alabama, California, Colorado, Delaware, District of Columbia, Florida,
+Indiana, Kentucky, Massachusetts, Michigan, Nevada, New Jersey, New York,
+North Carolina, Oklahoma, Oregon, Pennsylvania, Tennessee, Texas, Utah,
+Virginia, Washington, Wisconsin
+
+=item Oceania
+
+Australia, New Zealand, United States
+
+=item South America
+
+Argentina, Brazil, Chile
+
+=item RSYNC Mirrors
+
+=back
+
+=item Modules: Creation, Use, and Abuse
+
+=over 4
+
+=item Guidelines for Module Creation
+
+=item Guidelines for Converting Perl 4 Library Scripts into Modules
+
+=item Guidelines for Reusing Application Code
+
+=back
+
+=item NOTE
+
+=back
+
+=head2 perlmodstyle - Perl module style guide
+
+=over 4
+
+=item INTRODUCTION
+
+=item QUICK CHECKLIST
+
+=over 4
+
+=item Before you start
+
+=item The API
+
+=item Stability
+
+=item Documentation
+
+=item Release considerations
+
+=back
+
+=item BEFORE YOU START WRITING A MODULE
+
+=over 4
+
+=item Has it been done before?
+
+=item Do one thing and do it well
+
+=item What's in a name?
+
+=back
+
+=item DESIGNING AND WRITING YOUR MODULE
+
+=over 4
+
+=item To OO or not to OO?
+
+=item Designing your API
+
+Write simple routines to do simple things, Separate functionality from
+output, Provide sensible shortcuts and defaults, Naming conventions,
+Parameter passing
+
+=item Strictness and warnings
+
+=item Backwards compatibility
+
+=item Error handling and messages
+
+=back
+
+=item DOCUMENTING YOUR MODULE
+
+=over 4
+
+=item POD
+
+=item README, INSTALL, release notes, changelogs
+
+perl Makefile.PL, make, make test, make install, perl Build.PL, perl Build,
+perl Build test, perl Build install
+
+=back
+
+=item RELEASE CONSIDERATIONS
+
+=over 4
+
+=item Version numbering
+
+=item Pre-requisites
+
+=item Testing
+
+=item Packaging
+
+=item Licensing
+
+=back
+
+=item COMMON PITFALLS
+
+=over 4
+
+=item Reinventing the wheel
+
+=item Trying to do too much
+
+=item Inappropriate documentation
+
+=back
+
+=item SEE ALSO
+
+L<perlstyle>, L<perlnewmod>, L<perlpod>, L<podchecker>, Packaging Tools,
+Testing tools, http://pause.perl.org/, Any good book on software
+engineering
+
+=item AUTHOR
+
+=back
+
+=head2 perlmodinstall - Installing CPAN Modules
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item PREAMBLE
+
+B<DECOMPRESS> the file, B<UNPACK> the file into a directory, B<BUILD> the
+module (sometimes unnecessary), B<INSTALL> the module
+
+=back
+
+=item PORTABILITY
+
+=item HEY
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 perlnewmod - preparing a new module for distribution
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Warning
+
+=item What should I make into a module?
+
+=item Step-by-step: Preparing the ground
+
+Look around, Check it's new, Discuss the need, Choose a name, Check again
+
+=item Step-by-step: Making the module
+
+Start with F<module-starter> or F<h2xs>, Use L<strict|strict> and
+L<warnings|warnings>, Use L<Carp|Carp>, Use L<Exporter|Exporter> - wisely!,
+Use L<plain old documentation|perlpod>, Write tests, Write the README
+
+=item Step-by-step: Distributing your module
+
+Get a CPAN user ID, C<perl Makefile.PL; make test; make dist>, Upload the
+tarball, Announce to the modules list, Announce to clpa, Fix bugs!
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlpragma - how to write a user pragma
+
+=over 4
+
+=item DESCRIPTION
+
+=item A basic example
+
+=item Implementation details
+
+=back
+
+=head2 perlutil - utilities packaged with the Perl distribution
+
+=over 4
+
+=item DESCRIPTION
+
+=item LIST OF UTILITIES
+
+=over 4
+
+=item Documentation
+
+L<perldoc|perldoc>, L<pod2man|pod2man> and L<pod2text|pod2text>,
+L<pod2html|pod2html> and L<pod2latex|pod2latex>, L<pod2usage|pod2usage>,
+L<podselect|podselect>, L<podchecker|podchecker>, L<splain|splain>,
+L<roffitall|roffitall>
+
+=item Convertors
+
+L<a2p|a2p>, L<s2p|s2p> and L<psed>, L<find2perl|find2perl>
+
+=item Administration
+
+L<config_data|config_data>, L<libnetcfg|libnetcfg>, L<perlivp>
+
+=item Development
+
+L<perlbug|perlbug>, L<perlthanks|perlthanks>, L<h2ph|h2ph>, L<c2ph|c2ph>
+and L<pstruct|pstruct>, L<h2xs|h2xs>, L<enc2xs>, L<xsubpp>,
+L<dprofpp|dprofpp>, L<prove>, L<corelist>
+
+=item General tools
+
+L<piconv>, L<ptar>, L<ptardiff>, L<shasum>
+
+=item Installation
+
+L<cpan>, L<cpanp>, L<cpan2dist>, L<instmodsh>
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlcompile - Introduction to the Perl Compiler-Translator
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Layout
+
+B::Lint, B::Deparse, B::Xref
+
+=back
+
+=item Using The Back Ends
+
+=over 4
+
+=item The Cross Referencing Back End
+
+i, &, s, r
+
+=item The Decompiling Back End
+
+=item The Lint Back End
+
+=back
+
+=item Module List for the Compiler Suite
+
+B, O, B::Concise, B::Debug, B::Deparse, B::Lint, B::Showlex, B::Terse,
+B::Xref
+
+=item KNOWN PROBLEMS
+
+=item AUTHOR
+
+=back
+
+=head2 perlfilter - Source Filters
+
+=over 4
+
+=item DESCRIPTION
+
+=item CONCEPTS
+
+=item USING FILTERS
+
+=item WRITING A SOURCE FILTER
+
+=item WRITING A SOURCE FILTER IN C
+
+B<Decryption Filters>
+
+=item CREATING A SOURCE FILTER AS A SEPARATE EXECUTABLE
+
+=item WRITING A SOURCE FILTER IN PERL
+
+=item USING CONTEXT: THE DEBUG FILTER
+
+=item CONCLUSION
+
+=item THINGS TO LOOK OUT FOR
+
+Some Filters Clobber the C<DATA> Handle
+
+=item REQUIREMENTS
+
+=item AUTHOR
+
+=item Copyrights
+
+=back
+
+=head2 perlglossary - Perl Glossary
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item A
+
+accessor methods, actual arguments, address operator, algorithm, alias,
+alternatives, anonymous, architecture, argument, ARGV, arithmetical
+operator, array, array context, ASCII, assertion, assignment, assignment
+operator, associative array, associativity, asynchronous, atom, atomic
+operation, attribute, autogeneration, autoincrement, autoload, autosplit,
+autovivification, AV, awk
+
+=item B
+
+backreference, backtracking, backward compatibility, bareword, base class,
+big-endian, binary, binary operator, bind, bit, bit shift, bit string,
+bless, block, BLOCK, block buffering, Boolean, Boolean context, breakpoint,
+broadcast, BSD, bucket, buffer, built-in, bundle, byte, bytecode
+
+=item C
+
+C, C preprocessor, call by reference, call by value, callback, canonical,
+capturing, character, character class, character property, circumfix
+operator, class, class method, client, cloister, closure, cluster, CODE,
+code generator, code subpattern, collating sequence, command, command
+buffering, command name, command-line arguments, comment, compilation unit,
+compile phase, compile time, compiler, composer, concatenation,
+conditional, connection, construct, constructor, context, continuation,
+core dump, CPAN, cracker, current package, current working directory,
+currently selected output channel, CV
+
+=item D
+
+dangling statement, data structure, data type, datagram, DBM, declaration,
+decrement, default, defined, delimiter, deprecated modules and features,
+dereference, derived class, descriptor, destroy, destructor, device,
+directive, directory, directory handle, dispatch, distribution, (to be)
+dropped modules, dweomer, dwimmer, dynamic scoping
+
+=item E
+
+eclectic, element, embedding, empty subclass test, en passant,
+encapsulation, endian, environment, environment variable, EOF, errno,
+error, escape sequence, exception, exception handling, exec, executable
+file, execute, execute bit, exit status, export, expression, extension
+
+=item F
+
+false, FAQ, fatal error, field, FIFO, file, file descriptor, file test
+operator, fileglob, filehandle, filename, filesystem, filter, flag,
+floating point, flush, FMTEYEWTK, fork, formal arguments, format, freely
+available, freely redistributable, freeware, function, funny character,
+garbage collection
+
+=item G
+
+GID, glob, global, global destruction, glue language, granularity, greedy,
+grep, group, GV
+
+=item H
+
+hacker, handler, hard reference, hash, hash table, header file, here
+document, hexadecimal, home directory, host, hubris, HV
+
+=item I
+
+identifier, impatience, implementation, import, increment, indexing,
+indirect filehandle, indirect object, indirect object slot, indirection,
+infix, inheritance, instance, instance variable, integer, interface,
+interpolation, interpreter, invocant, invocation, I/O, IO, IP, IPC, is-a,
+iteration, iterator, IV
+
+=item J
+
+JAPH
+
+=item K
+
+key, keyword
+
+=item L
+
+label, laziness, left shift, leftmost longest, lexeme, lexer, lexical
+analysis, lexical scoping, lexical variable, library, LIFO, line, line
+buffering, line number, link, LIST, list, list context, list operator, list
+value, literal, little-endian, local, logical operator, lookahead,
+lookbehind, loop, loop control statement, loop label, lvaluable, lvalue,
+lvalue modifier
+
+=item M
+
+magic, magical increment, magical variables, Makefile, man, manpage,
+matching, member data, memory, metacharacter, metasymbol, method,
+minimalism, mode, modifier, module, modulus, monger, mortal,
+multidimensional array, multiple inheritance
+
+=item N
+
+named pipe, namespace, network address, newline, NFS, null character, null
+list, null string, numeric context, NV, nybble
+
+=item O
+
+object, octal, offset, one-liner, open source software, operand, operating
+system, operator, operator overloading, options, overloading, overriding,
+owner
+
+=item P
+
+package, pad, parameter, parent class, parse tree, parsing, patch, PATH,
+pathname, pattern, pattern matching, permission bits, Pern, pipe, pipeline,
+platform, pod, pointer, polymorphism, port, portable, porter, POSIX,
+postfix, pp, pragma, precedence, prefix, preprocessing, procedure, process,
+program generator, progressive matching, property, protocol, prototype,
+pseudofunction, pseudohash, pseudoliteral, public domain, pumpkin,
+pumpking, PV
+
+=item Q
+
+qualified, quantifier
+
+=item R
+
+readable, reaping, record, recursion, reference, referent, regex, regular
+expression, regular expression modifier, regular file, relational operator,
+reserved words, return value, RFC, right shift, root, RTFM, run phase, run
+time, run-time pattern, RV, rvalue
+
+=item S
+
+scalar, scalar context, scalar literal, scalar value, scalar variable,
+scope, scratchpad, script, script kiddie, sed, semaphore, separator,
+serialization, server, service, setgid, setuid, shared memory, shebang,
+shell, side effects, signal, signal handler, single inheritance, slice,
+slurp, socket, soft reference, source filter, stack, standard, standard
+error, standard I/O, standard input, standard output, stat structure,
+statement, statement modifier, static, static method, static scoping,
+static variable, status, STDERR, STDIN, STDIO, STDOUT, stream, string,
+string context, stringification, struct, structure, subclass, subpattern,
+subroutine, subscript, substitution, substring, superclass, superuser, SV,
+switch, switch cluster, switch statement, symbol, symbol table, symbolic
+debugger, symbolic link, symbolic reference, synchronous, syntactic sugar,
+syntax, syntax tree, syscall
+
+=item T
+
+tainted, TCP, term, terminator, ternary, text, thread, tie, TMTOWTDI,
+token, tokener, tokenizing, toolbox approach, transliterate, trigger,
+trinary, troff, true, truncating, type, type casting, typed lexical,
+typedef, typeglob, typemap
+
+=item U
+
+UDP, UID, umask, unary operator, Unicode, Unix
+
+=item V
+
+value, variable, variable interpolation, variadic, vector, virtual, void
+context, v-string
+
+=item W
+
+warning, watch expression, whitespace, word, working directory, wrapper,
+WYSIWYG
+
+=item X
+
+XS, XSUB
+
+=item Y
+
+yacc
+
+=item Z
+
+zero width, zombie
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlembed - how to embed perl in your C program
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item PREAMBLE
+
+B<Use C from Perl?>, B<Use a Unix program from Perl?>, B<Use Perl from
+Perl?>, B<Use C from C?>, B<Use Perl from C?>
+
+=item ROADMAP
+
+=item Compiling your C program
+
+=item Adding a Perl interpreter to your C program
+
+=item Calling a Perl subroutine from your C program
+
+=item Evaluating a Perl statement from your C program
+
+=item Performing Perl pattern matches and substitutions from your C program
+
+=item Fiddling with the Perl stack from your C program
+
+=item Maintaining a persistent interpreter
+
+=item Execution of END blocks
+
+=item $0 assignments
+
+=item Maintaining multiple interpreter instances
+
+=item Using Perl modules, which themselves use C libraries, from your C
+program
+
+=back
+
+=item Embedding Perl under Win32
+
+=item Hiding Perl_
+
+=item MORAL
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 perldebguts - Guts of Perl debugging
+
+=over 4
+
+=item DESCRIPTION
+
+=item Debugger Internals
+
+=over 4
+
+=item Writing Your Own Debugger
+
+=back
+
+=item Frame Listing Output Examples
+
+=item Debugging regular expressions
+
+=over 4
+
+=item Compile-time output
+
+C<anchored> I<STRING> C<at> I<POS>, C<floating> I<STRING> C<at>
+I<POS1..POS2>, C<matching floating/anchored>, C<minlen>, C<stclass>
+I<TYPE>, C<noscan>, C<isall>, C<GPOS>, C<plus>, C<implicit>, C<with eval>,
+C<anchored(TYPE)>
+
+=item Types of nodes
+
+=item Run-time output
+
+=back
+
+=item Debugging Perl memory usage
+
+=over 4
+
+=item Using C<$ENV{PERL_DEBUG_MSTATS}>
+
+C<buckets SMALLEST(APPROX)..GREATEST(APPROX)>, Free/Used, C<Total sbrk():
+SBRKed/SBRKs:CONTINUOUS>, C<pad: 0>, C<heads: 2192>, C<chain: 0>, C<tail:
+6144>
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlxstut, perlXStut - Tutorial for writing XSUBs
+
+=over 4
+
+=item DESCRIPTION
+
+=item SPECIAL NOTES
+
+=over 4
+
+=item make
+
+=item Version caveat
+
+=item Dynamic Loading versus Static Loading
+
+=back
+
+=item TUTORIAL
+
+=over 4
+
+=item EXAMPLE 1
+
+=item EXAMPLE 2
+
+=item What has gone on?
+
+=item Writing good test scripts
+
+=item EXAMPLE 3
+
+=item What's new here?
+
+=item Input and Output Parameters
+
+=item The XSUBPP Program
+
+=item The TYPEMAP file
+
+=item Warning about Output Arguments
+
+=item EXAMPLE 4
+
+=item What has happened here?
+
+=item Anatomy of .xs file
+
+=item Getting the fat out of XSUBs
+
+=item More about XSUB arguments
+
+=item The Argument Stack
+
+=item Extending your Extension
+
+=item Documenting your Extension
+
+=item Installing your Extension
+
+=item EXAMPLE 5
+
+=item New Things in this Example
+
+=item EXAMPLE 6
+
+=item New Things in this Example
+
+=item EXAMPLE 7 (Coming Soon)
+
+=item EXAMPLE 8 (Coming Soon)
+
+=item EXAMPLE 9 Passing open files to XSes
+
+=item Troubleshooting these Examples
+
+=back
+
+=item See also
+
+=item Author
+
+=over 4
+
+=item Last Changed
+
+=back
+
+=back
+
+=head2 perlxs - XS language reference manual
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Introduction
+
+=item On The Road
+
+=item The Anatomy of an XSUB
+
+=item The Argument Stack
+
+=item The RETVAL Variable
+
+=item Returning SVs, AVs and HVs through RETVAL
+
+=item The MODULE Keyword
+
+=item The PACKAGE Keyword
+
+=item The PREFIX Keyword
+
+=item The OUTPUT: Keyword
+
+=item The NO_OUTPUT Keyword
+
+=item The CODE: Keyword
+
+=item The INIT: Keyword
+
+=item The NO_INIT Keyword
+
+=item Initializing Function Parameters
+
+=item Default Parameter Values
+
+=item The PREINIT: Keyword
+
+=item The SCOPE: Keyword
+
+=item The INPUT: Keyword
+
+=item The IN/OUTLIST/IN_OUTLIST/OUT/IN_OUT Keywords
+
+=item The C<length(NAME)> Keyword
+
+=item Variable-length Parameter Lists
+
+=item The C_ARGS: Keyword
+
+=item The PPCODE: Keyword
+
+=item Returning Undef And Empty Lists
+
+=item The REQUIRE: Keyword
+
+=item The CLEANUP: Keyword
+
+=item The POSTCALL: Keyword
+
+=item The BOOT: Keyword
+
+=item The VERSIONCHECK: Keyword
+
+=item The PROTOTYPES: Keyword
+
+=item The PROTOTYPE: Keyword
+
+=item The ALIAS: Keyword
+
+=item The OVERLOAD: Keyword
+
+=item The FALLBACK: Keyword
+
+=item The INTERFACE: Keyword
+
+=item The INTERFACE_MACRO: Keyword
+
+=item The INCLUDE: Keyword
+
+=item The CASE: Keyword
+
+=item The & Unary Operator
+
+=item Inserting POD, Comments and C Preprocessor Directives
+
+=item Using XS With C++
+
+=item Interface Strategy
+
+=item Perl Objects And C Structures
+
+=item The Typemap
+
+=item Safely Storing Static Data in XS
+
+MY_CXT_KEY, typedef my_cxt_t, START_MY_CXT, MY_CXT_INIT, dMY_CXT, MY_CXT,
+aMY_CXT/pMY_CXT, MY_CXT_CLONE, MY_CXT_INIT_INTERP(my_perl),
+dMY_CXT_INTERP(my_perl)
+
+=item Thread-aware system interfaces
+
+=back
+
+=item EXAMPLES
+
+=item XS VERSION
+
+=item AUTHOR
+
+=back
+
+=head2 perlclib - Internal replacements for standard C library functions
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Conventions
+
+C<t>, C<p>, C<n>, C<s>
+
+=item File Operations
+
+=item File Input and Output
+
+=item File Positioning
+
+=item Memory Management and String Handling
+
+=item Character Class Tests
+
+=item F<stdlib.h> functions
+
+=item Miscellaneous functions
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlguts - Introduction to the Perl API
+
+=over 4
+
+=item DESCRIPTION
+
+=item Variables
+
+=over 4
+
+=item Datatypes
+
+=item What is an "IV"?
+
+=item Working with SVs
+
+=item Offsets
+
+=item What's Really Stored in an SV?
+
+=item Working with AVs
+
+=item Working with HVs
+
+=item Hash API Extensions
+
+=item AVs, HVs and undefined values
+
+=item References
+
+=item Blessed References and Class Objects
+
+=item Creating New Variables
+
+GV_ADDMULTI, GV_ADDWARN
+
+=item Reference Counts and Mortality
+
+=item Stashes and Globs
+
+=item Double-Typed SVs
+
+=item Magic Variables
+
+=item Assigning Magic
+
+=item Magic Virtual Tables
+
+=item Finding Magic
+
+=item Understanding the Magic of Tied Hashes and Arrays
+
+=item Localizing changes
+
+C<SAVEINT(int i)>, C<SAVEIV(IV i)>, C<SAVEI32(I32 i)>, C<SAVELONG(long i)>,
+C<SAVESPTR(s)>, C<SAVEPPTR(p)>, C<SAVEFREESV(SV *sv)>, C<SAVEMORTALIZESV(SV
+*sv)>, C<SAVEFREEOP(OP *op)>, C<SAVEFREEPV(p)>, C<SAVECLEARSV(SV *sv)>,
+C<SAVEDELETE(HV *hv, char *key, I32 length)>,
+C<SAVEDESTRUCTOR(DESTRUCTORFUNC_NOCONTEXT_t f, void *p)>,
+C<SAVEDESTRUCTOR_X(DESTRUCTORFUNC_t f, void *p)>, C<SAVESTACK_POS()>, C<SV*
+save_scalar(GV *gv)>, C<AV* save_ary(GV *gv)>, C<HV* save_hash(GV *gv)>,
+C<void save_item(SV *item)>, C<void save_list(SV **sarg, I32 maxsarg)>,
+C<SV* save_svref(SV **sptr)>, C<void save_aptr(AV **aptr)>, C<void
+save_hptr(HV **hptr)>
+
+=back
+
+=item Subroutines
+
+=over 4
+
+=item XSUBs and the Argument Stack
+
+=item Calling Perl Routines from within C Programs
+
+=item Memory Allocation
+
+=item PerlIO
+
+=item Putting a C value on Perl stack
+
+=item Scratchpads
+
+=item Scratchpads and recursion
+
+=back
+
+=item Compiled code
+
+=over 4
+
+=item Code tree
+
+=item Examining the tree
+
+=item Compile pass 1: check routines
+
+=item Compile pass 1a: constant folding
+
+=item Compile pass 2: context propagation
+
+=item Compile pass 3: peephole optimization
+
+=item Pluggable runops
+
+=back
+
+=item Examining internal data structures with the C<dump> functions
+
+=item How multiple interpreters and concurrency are supported
+
+=over 4
+
+=item Background and PERL_IMPLICIT_CONTEXT
+
+=item So what happened to dTHR?
+
+=item How do I use all this in extensions?
+
+=item Should I do anything special if I call perl from multiple threads?
+
+=item Future Plans and PERL_IMPLICIT_SYS
+
+=back
+
+=item Internal Functions
+
+A, p, d, s, n, r, f, M, o, x, m, X, E, b, others
+
+=over 4
+
+=item Formatted Printing of IVs, UVs, and NVs
+
+=item Pointer-To-Integer and Integer-To-Pointer
+
+=item Exception Handling
+
+=item Source Documentation
+
+=item Backwards compatibility
+
+=back
+
+=item Unicode Support
+
+=over 4
+
+=item What B<is> Unicode, anyway?
+
+=item How can I recognise a UTF-8 string?
+
+=item How does UTF-8 represent Unicode characters?
+
+=item How does Perl store UTF-8 strings?
+
+=item How do I convert a string to UTF-8?
+
+=item Is there anything else I need to know?
+
+=back
+
+=item Custom Operators
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 perlcall - Perl calling conventions from C
+
+=over 4
+
+=item DESCRIPTION
+
+An Error Handler, An Event Driven Program
+
+=item THE CALL_ FUNCTIONS
+
+call_sv, call_pv, call_method, call_argv
+
+=item FLAG VALUES
+
+=over 4
+
+=item G_VOID
+
+=item G_SCALAR
+
+=item G_ARRAY
+
+=item G_DISCARD
+
+=item G_NOARGS
+
+=item G_EVAL
+
+=item G_KEEPERR
+
+=item Determining the Context
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item No Parameters, Nothing returned
+
+=item Passing Parameters
+
+=item Returning a Scalar
+
+=item Returning a list of values
+
+=item Returning a list in a scalar context
+
+=item Returning Data from Perl via the parameter list
+
+=item Using G_EVAL
+
+=item Using G_KEEPERR
+
+=item Using call_sv
+
+=item Using call_argv
+
+=item Using call_method
+
+=item Using GIMME_V
+
+=item Using Perl to dispose of temporaries
+
+=item Strategies for storing Callback Context Information
+
+1. Ignore the problem - Allow only 1 callback, 2. Create a sequence of
+callbacks - hard wired limit, 3. Use a parameter to map to the Perl
+callback
+
+=item Alternate Stack Manipulation
+
+=item Creating and calling an anonymous subroutine in C
+
+=back
+
+=item LIGHTWEIGHT CALLBACKS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 perlmroapi - Perl method resolution plugin interface
+
+=over 4
+
+=item DESCRIPTION
+
+resolve, name, length, kflags, hash
+
+=item Callbacks
+
+=item Caching
+
+=item Examples
+
+=item AUTHORS
+
+=back
+
+=head2 perlreapi - perl regular expression plugin interface
+
+=over 4
+
+=item DESCRIPTION
+
+=item Callbacks
+
+=over 4
+
+=item comp
+
+C</m> - RXf_PMf_MULTILINE, C</s> - RXf_PMf_SINGLELINE, C</i> -
+RXf_PMf_FOLD, C</x> - RXf_PMf_EXTENDED, C</p> - RXf_PMf_KEEPCOPY,
+RXf_PMf_LOCALE, RXf_UTF8, RXf_SPLIT, RXf_SKIPWHITE, RXf_START_ONLY,
+RXf_WHITE, RXf_NULL
+
+=item exec
+
+=item intuit
+
+=item checkstr
+
+=item free
+
+=item Numbered capture callbacks
+
+=item Named capture callbacks
+
+=item qr_package
+
+=item dupe
+
+=back
+
+=item The REGEXP structure
+
+=over 4
+
+=item C<engine>
+
+=item C<mother_re>
+
+=item C<extflags>
+
+=item C<minlen> C<minlenret>
+
+=item C<gofs>
+
+=item C<substrs>
+
+=item C<nparens>, C<lasparen>, and C<lastcloseparen>
+
+=item C<intflags>
+
+=item C<pprivate>
+
+=item C<swap>
+
+=item C<offs>
+
+=item C<precomp> C<prelen>
+
+=item C<paren_names>
+
+=item C<substrs>
+
+=item C<subbeg> C<sublen> C<saved_copy>
+
+=item C<wrapped> C<wraplen>
+
+=item C<seen_evals>
+
+=item C<refcnt>
+
+=back
+
+=item HISTORY
+
+=item AUTHORS
+
+=item LICENSE
+
+=back
+
+=head2 perlreguts - Description of the Perl regular expression engine.
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERVIEW
+
+=over 4
+
+=item A quick note on terms
+
+=item What is a regular expression engine?
+
+=item Structure of a Regexp Program
+
+C<regnode_1>, C<regnode_2>, C<regnode_string>, C<regnode_charclass>,
+C<regnode_charclass_class>
+
+=back
+
+=item Process Overview
+
+A. Compilation, 1. Parsing for size, 2. Parsing for construction, 3.
+Peep-hole optimisation and analysis, B. Execution, 4. Start position and
+no-match optimisations, 5. Program execution
+
+=over 4
+
+=item Compilation
+
+anchored fixed strings, floating fixed strings, minimum and maximum length
+requirements, start class, Beginning/End of line positions
+
+=item Execution
+
+=back
+
+=item MISCELLANEOUS
+
+=over 4
+
+=item Unicode and Localisation Support
+
+=item Base Structures
+
+C<swap>, C<offsets>, C<regstclass>, C<data>, C<program>
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item LICENCE
+
+=item REFERENCES
+
+=back
+
+=head2 perlapi - autogenerated documentation for the perl public API
+
+=over 4
+
+=item DESCRIPTION
+X<Perl API> X<API> X<api>
+
+=item "Gimme" Values
+
+GIMME X<GIMME>, GIMME_V X<GIMME_V>, G_ARRAY X<G_ARRAY>, G_DISCARD
+X<G_DISCARD>, G_EVAL X<G_EVAL>, G_NOARGS X<G_NOARGS>, G_SCALAR X<G_SCALAR>,
+G_VOID X<G_VOID>
+
+=item Array Manipulation Functions
+
+AvFILL X<AvFILL>, av_clear X<av_clear>, av_create_and_push
+X<av_create_and_push>, av_create_and_unshift_one
+X<av_create_and_unshift_one>, av_delete X<av_delete>, av_exists
+X<av_exists>, av_extend X<av_extend>, av_fetch X<av_fetch>, av_fill
+X<av_fill>, av_len X<av_len>, av_make X<av_make>, av_pop X<av_pop>, av_push
+X<av_push>, av_shift X<av_shift>, av_store X<av_store>, av_undef
+X<av_undef>, av_unshift X<av_unshift>, get_av X<get_av>, newAV X<newAV>,
+sortsv X<sortsv>, sortsv_flags X<sortsv_flags>
+
+=item Callback Functions
+
+call_argv X<call_argv>, call_method X<call_method>, call_pv X<call_pv>,
+call_sv X<call_sv>, ENTER X<ENTER>, eval_pv X<eval_pv>, eval_sv X<eval_sv>,
+FREETMPS X<FREETMPS>, LEAVE X<LEAVE>, SAVETMPS X<SAVETMPS>
+
+=item Character classes
+
+isALNUM X<isALNUM>, isALPHA X<isALPHA>, isDIGIT X<isDIGIT>, isLOWER
+X<isLOWER>, isSPACE X<isSPACE>, isUPPER X<isUPPER>, toLOWER X<toLOWER>,
+toUPPER X<toUPPER>
+
+=item Cloning an interpreter
+
+perl_clone X<perl_clone>
+
+=item CV Manipulation Functions
+
+CvSTASH X<CvSTASH>, get_cv X<get_cv>, get_cvn_flags X<get_cvn_flags>
+
+=item Embedding Functions
+
+cv_undef X<cv_undef>, load_module X<load_module>, nothreadhook
+X<nothreadhook>, perl_alloc X<perl_alloc>, perl_construct
+X<perl_construct>, perl_destruct X<perl_destruct>, perl_free X<perl_free>,
+perl_parse X<perl_parse>, perl_run X<perl_run>, require_pv X<require_pv>
+
+=item Functions in file dump.c
+
+pv_display X<pv_display>, pv_escape X<pv_escape>, pv_pretty X<pv_pretty>
+
+=item Functions in file mathoms.c
+
+gv_fetchmethod X<gv_fetchmethod>, pack_cat X<pack_cat>, sv_2pvbyte_nolen
+X<sv_2pvbyte_nolen>, sv_2pvutf8_nolen X<sv_2pvutf8_nolen>, sv_2pv_nolen
+X<sv_2pv_nolen>, sv_catpvn_mg X<sv_catpvn_mg>, sv_catsv_mg X<sv_catsv_mg>,
+sv_force_normal X<sv_force_normal>, sv_iv X<sv_iv>, sv_nolocking
+X<sv_nolocking>, sv_nounlocking X<sv_nounlocking>, sv_nv X<sv_nv>, sv_pv
+X<sv_pv>, sv_pvbyte X<sv_pvbyte>, sv_pvbyten X<sv_pvbyten>, sv_pvn
+X<sv_pvn>, sv_pvutf8 X<sv_pvutf8>, sv_pvutf8n X<sv_pvutf8n>, sv_taint
+X<sv_taint>, sv_unref X<sv_unref>, sv_usepvn X<sv_usepvn>, sv_usepvn_mg
+X<sv_usepvn_mg>, sv_uv X<sv_uv>, unpack_str X<unpack_str>
+
+=item Functions in file perl.h
+
+PERL_SYS_INIT X<PERL_SYS_INIT>, PERL_SYS_INIT3 X<PERL_SYS_INIT3>,
+PERL_SYS_TERM X<PERL_SYS_TERM>
+
+=item Functions in file pp_ctl.c
+
+find_runcv X<find_runcv>
+
+=item Functions in file pp_pack.c
+
+packlist X<packlist>, unpackstring X<unpackstring>
+
+=item GV Functions
+
+GvSV X<GvSV>, gv_const_sv X<gv_const_sv>, gv_fetchmeth X<gv_fetchmeth>,
+gv_fetchmethod_autoload X<gv_fetchmethod_autoload>, gv_fetchmeth_autoload
+X<gv_fetchmeth_autoload>, gv_stashpv X<gv_stashpv>, gv_stashpvn
+X<gv_stashpvn>, gv_stashpvs X<gv_stashpvs>, gv_stashsv X<gv_stashsv>
+
+=item Handy Values
+
+Nullav X<Nullav>, Nullch X<Nullch>, Nullcv X<Nullcv>, Nullhv X<Nullhv>,
+Nullsv X<Nullsv>
+
+=item Hash Manipulation Functions
+
+get_hv X<get_hv>, HEf_SVKEY X<HEf_SVKEY>, HeHASH X<HeHASH>, HeKEY X<HeKEY>,
+HeKLEN X<HeKLEN>, HePV X<HePV>, HeSVKEY X<HeSVKEY>, HeSVKEY_force
+X<HeSVKEY_force>, HeSVKEY_set X<HeSVKEY_set>, HeUTF8 X<HeUTF8>, HeVAL
+X<HeVAL>, HvNAME X<HvNAME>, hv_assert X<hv_assert>, hv_clear X<hv_clear>,
+hv_clear_placeholders X<hv_clear_placeholders>, hv_delete X<hv_delete>,
+hv_delete_ent X<hv_delete_ent>, hv_exists X<hv_exists>, hv_exists_ent
+X<hv_exists_ent>, hv_fetch X<hv_fetch>, hv_fetchs X<hv_fetchs>,
+hv_fetch_ent X<hv_fetch_ent>, hv_iterinit X<hv_iterinit>, hv_iterkey
+X<hv_iterkey>, hv_iterkeysv X<hv_iterkeysv>, hv_iternext X<hv_iternext>,
+hv_iternextsv X<hv_iternextsv>, hv_iternext_flags X<hv_iternext_flags>,
+hv_iterval X<hv_iterval>, hv_magic X<hv_magic>, hv_scalar X<hv_scalar>,
+hv_store X<hv_store>, hv_stores X<hv_stores>, hv_store_ent X<hv_store_ent>,
+hv_undef X<hv_undef>, newHV X<newHV>
+
+=item Magical Functions
+
+mg_clear X<mg_clear>, mg_copy X<mg_copy>, mg_find X<mg_find>, mg_free
+X<mg_free>, mg_get X<mg_get>, mg_length X<mg_length>, mg_magical
+X<mg_magical>, mg_set X<mg_set>, SvGETMAGIC X<SvGETMAGIC>, SvLOCK
+X<SvLOCK>, SvSETMAGIC X<SvSETMAGIC>, SvSetMagicSV X<SvSetMagicSV>,
+SvSetMagicSV_nosteal X<SvSetMagicSV_nosteal>, SvSetSV X<SvSetSV>,
+SvSetSV_nosteal X<SvSetSV_nosteal>, SvSHARE X<SvSHARE>, SvUNLOCK
+X<SvUNLOCK>
+
+=item Memory Management
+
+Copy X<Copy>, CopyD X<CopyD>, Move X<Move>, MoveD X<MoveD>, Newx X<Newx>,
+Newxc X<Newxc>, Newxz X<Newxz>, Poison X<Poison>, PoisonFree X<PoisonFree>,
+PoisonNew X<PoisonNew>, PoisonWith X<PoisonWith>, Renew X<Renew>, Renewc
+X<Renewc>, Safefree X<Safefree>, savepv X<savepv>, savepvn X<savepvn>,
+savepvs X<savepvs>, savesharedpv X<savesharedpv>, savesharedpvn
+X<savesharedpvn>, savesvpv X<savesvpv>, StructCopy X<StructCopy>, Zero
+X<Zero>, ZeroD X<ZeroD>
+
+=item Miscellaneous Functions
+
+fbm_compile X<fbm_compile>, fbm_instr X<fbm_instr>, form X<form>, getcwd_sv
+X<getcwd_sv>, my_snprintf X<my_snprintf>, my_sprintf X<my_sprintf>,
+my_vsnprintf X<my_vsnprintf>, new_version X<new_version>, scan_version
+X<scan_version>, strEQ X<strEQ>, strGE X<strGE>, strGT X<strGT>, strLE
+X<strLE>, strLT X<strLT>, strNE X<strNE>, strnEQ X<strnEQ>, strnNE
+X<strnNE>, sv_destroyable X<sv_destroyable>, sv_nosharing X<sv_nosharing>,
+upg_version X<upg_version>, vcmp X<vcmp>, vnormal X<vnormal>, vnumify
+X<vnumify>, vstringify X<vstringify>, vverify X<vverify>
+
+=item MRO Functions
+
+mro_get_linear_isa X<mro_get_linear_isa>, mro_method_changed_in
+X<mro_method_changed_in>
+
+=item Multicall Functions
+
+dMULTICALL X<dMULTICALL>, MULTICALL X<MULTICALL>, POP_MULTICALL
+X<POP_MULTICALL>, PUSH_MULTICALL X<PUSH_MULTICALL>
+
+=item Numeric functions
+
+grok_bin X<grok_bin>, grok_hex X<grok_hex>, grok_number X<grok_number>,
+grok_numeric_radix X<grok_numeric_radix>, grok_oct X<grok_oct>,
+Perl_signbit X<Perl_signbit>, scan_bin X<scan_bin>, scan_hex X<scan_hex>,
+scan_oct X<scan_oct>
+
+=item Optree Manipulation Functions
+
+cv_const_sv X<cv_const_sv>, newCONSTSUB X<newCONSTSUB>, newXS X<newXS>
+
+=item Pad Data Structures
+
+pad_sv X<pad_sv>
+
+=item Per-Interpreter Variables
+
+PL_modglobal X<PL_modglobal>, PL_na X<PL_na>, PL_sv_no X<PL_sv_no>,
+PL_sv_undef X<PL_sv_undef>, PL_sv_yes X<PL_sv_yes>
+
+=item REGEXP Functions
+
+SvRX X<SvRX>, SvRXOK X<SvRXOK>
+
+=item Simple Exception Handling Macros
+
+dXCPT X<dXCPT>, XCPT_CATCH X<XCPT_CATCH>, XCPT_RETHROW X<XCPT_RETHROW>,
+XCPT_TRY_END X<XCPT_TRY_END>, XCPT_TRY_START X<XCPT_TRY_START>
+
+=item Stack Manipulation Macros
+
+dMARK X<dMARK>, dORIGMARK X<dORIGMARK>, dSP X<dSP>, EXTEND X<EXTEND>, MARK
+X<MARK>, mPUSHi X<mPUSHi>, mPUSHn X<mPUSHn>, mPUSHp X<mPUSHp>, mPUSHs
+X<mPUSHs>, mPUSHu X<mPUSHu>, mXPUSHi X<mXPUSHi>, mXPUSHn X<mXPUSHn>,
+mXPUSHp X<mXPUSHp>, mXPUSHs X<mXPUSHs>, mXPUSHu X<mXPUSHu>, ORIGMARK
+X<ORIGMARK>, POPi X<POPi>, POPl X<POPl>, POPn X<POPn>, POPp X<POPp>,
+POPpbytex X<POPpbytex>, POPpx X<POPpx>, POPs X<POPs>, PUSHi X<PUSHi>,
+PUSHMARK X<PUSHMARK>, PUSHmortal X<PUSHmortal>, PUSHn X<PUSHn>, PUSHp
+X<PUSHp>, PUSHs X<PUSHs>, PUSHu X<PUSHu>, PUTBACK X<PUTBACK>, SP X<SP>,
+SPAGAIN X<SPAGAIN>, XPUSHi X<XPUSHi>, XPUSHmortal X<XPUSHmortal>, XPUSHn
+X<XPUSHn>, XPUSHp X<XPUSHp>, XPUSHs X<XPUSHs>, XPUSHu X<XPUSHu>, XSRETURN
+X<XSRETURN>, XSRETURN_EMPTY X<XSRETURN_EMPTY>, XSRETURN_IV X<XSRETURN_IV>,
+XSRETURN_NO X<XSRETURN_NO>, XSRETURN_NV X<XSRETURN_NV>, XSRETURN_PV
+X<XSRETURN_PV>, XSRETURN_UNDEF X<XSRETURN_UNDEF>, XSRETURN_UV
+X<XSRETURN_UV>, XSRETURN_YES X<XSRETURN_YES>, XST_mIV X<XST_mIV>, XST_mNO
+X<XST_mNO>, XST_mNV X<XST_mNV>, XST_mPV X<XST_mPV>, XST_mUNDEF
+X<XST_mUNDEF>, XST_mYES X<XST_mYES>
+
+=item SV Flags
+
+svtype X<svtype>, SVt_IV X<SVt_IV>, SVt_NV X<SVt_NV>, SVt_PV X<SVt_PV>,
+SVt_PVAV X<SVt_PVAV>, SVt_PVCV X<SVt_PVCV>, SVt_PVHV X<SVt_PVHV>, SVt_PVMG
+X<SVt_PVMG>
+
+=item SV Manipulation Functions
+
+croak_xs_usage X<croak_xs_usage>, get_sv X<get_sv>, newRV_inc X<newRV_inc>,
+newSVpvn_utf8 X<newSVpvn_utf8>, SvCUR X<SvCUR>, SvCUR_set X<SvCUR_set>,
+SvEND X<SvEND>, SvGAMAGIC X<SvGAMAGIC>, SvGROW X<SvGROW>, SvIOK X<SvIOK>,
+SvIOKp X<SvIOKp>, SvIOK_notUV X<SvIOK_notUV>, SvIOK_off X<SvIOK_off>,
+SvIOK_on X<SvIOK_on>, SvIOK_only X<SvIOK_only>, SvIOK_only_UV
+X<SvIOK_only_UV>, SvIOK_UV X<SvIOK_UV>, SvIsCOW X<SvIsCOW>,
+SvIsCOW_shared_hash X<SvIsCOW_shared_hash>, SvIV X<SvIV>, SvIVX X<SvIVX>,
+SvIVx X<SvIVx>, SvIV_nomg X<SvIV_nomg>, SvIV_set X<SvIV_set>, SvLEN
+X<SvLEN>, SvLEN_set X<SvLEN_set>, SvMAGIC_set X<SvMAGIC_set>, SvNIOK
+X<SvNIOK>, SvNIOKp X<SvNIOKp>, SvNIOK_off X<SvNIOK_off>, SvNOK X<SvNOK>,
+SvNOKp X<SvNOKp>, SvNOK_off X<SvNOK_off>, SvNOK_on X<SvNOK_on>, SvNOK_only
+X<SvNOK_only>, SvNV X<SvNV>, SvNVX X<SvNVX>, SvNVx X<SvNVx>, SvNV_set
+X<SvNV_set>, SvOK X<SvOK>, SvOOK X<SvOOK>, SvPOK X<SvPOK>, SvPOKp
+X<SvPOKp>, SvPOK_off X<SvPOK_off>, SvPOK_on X<SvPOK_on>, SvPOK_only
+X<SvPOK_only>, SvPOK_only_UTF8 X<SvPOK_only_UTF8>, SvPV X<SvPV>, SvPVbyte
+X<SvPVbyte>, SvPVbytex X<SvPVbytex>, SvPVbytex_force X<SvPVbytex_force>,
+SvPVbyte_force X<SvPVbyte_force>, SvPVbyte_nolen X<SvPVbyte_nolen>,
+SvPVutf8 X<SvPVutf8>, SvPVutf8x X<SvPVutf8x>, SvPVutf8x_force
+X<SvPVutf8x_force>, SvPVutf8_force X<SvPVutf8_force>, SvPVutf8_nolen
+X<SvPVutf8_nolen>, SvPVX X<SvPVX>, SvPVx X<SvPVx>, SvPV_force
+X<SvPV_force>, SvPV_force_nomg X<SvPV_force_nomg>, SvPV_nolen
+X<SvPV_nolen>, SvPV_nomg X<SvPV_nomg>, SvPV_set X<SvPV_set>, SvREFCNT
+X<SvREFCNT>, SvREFCNT_dec X<SvREFCNT_dec>, SvREFCNT_inc X<SvREFCNT_inc>,
+SvREFCNT_inc_NN X<SvREFCNT_inc_NN>, SvREFCNT_inc_simple
+X<SvREFCNT_inc_simple>, SvREFCNT_inc_simple_NN X<SvREFCNT_inc_simple_NN>,
+SvREFCNT_inc_simple_void X<SvREFCNT_inc_simple_void>,
+SvREFCNT_inc_simple_void_NN X<SvREFCNT_inc_simple_void_NN>,
+SvREFCNT_inc_void X<SvREFCNT_inc_void>, SvREFCNT_inc_void_NN
+X<SvREFCNT_inc_void_NN>, SvROK X<SvROK>, SvROK_off X<SvROK_off>, SvROK_on
+X<SvROK_on>, SvRV X<SvRV>, SvRV_set X<SvRV_set>, SvSTASH X<SvSTASH>,
+SvSTASH_set X<SvSTASH_set>, SvTAINT X<SvTAINT>, SvTAINTED X<SvTAINTED>,
+SvTAINTED_off X<SvTAINTED_off>, SvTAINTED_on X<SvTAINTED_on>, SvTRUE
+X<SvTRUE>, SvTYPE X<SvTYPE>, SvUOK X<SvUOK>, SvUPGRADE X<SvUPGRADE>, SvUTF8
+X<SvUTF8>, SvUTF8_off X<SvUTF8_off>, SvUTF8_on X<SvUTF8_on>, SvUV X<SvUV>,
+SvUVX X<SvUVX>, SvUVx X<SvUVx>, SvUV_nomg X<SvUV_nomg>, SvUV_set
+X<SvUV_set>, SvVOK X<SvVOK>, sv_catpvn_nomg X<sv_catpvn_nomg>,
+sv_catsv_nomg X<sv_catsv_nomg>, sv_derived_from X<sv_derived_from>, sv_does
+X<sv_does>, sv_report_used X<sv_report_used>, sv_setsv_nomg
+X<sv_setsv_nomg>, sv_utf8_upgrade_nomg X<sv_utf8_upgrade_nomg>
+
+=item SV-Body Allocation
+
+looks_like_number X<looks_like_number>, newRV_noinc X<newRV_noinc>, newSV
+X<newSV>, newSVhek X<newSVhek>, newSViv X<newSViv>, newSVnv X<newSVnv>,
+newSVpv X<newSVpv>, newSVpvf X<newSVpvf>, newSVpvn X<newSVpvn>,
+newSVpvn_flags X<newSVpvn_flags>, newSVpvn_share X<newSVpvn_share>,
+newSVpvs X<newSVpvs>, newSVpvs_flags X<newSVpvs_flags>, newSVpvs_share
+X<newSVpvs_share>, newSVrv X<newSVrv>, newSVsv X<newSVsv>, newSVuv
+X<newSVuv>, newSV_type X<newSV_type>, sv_2bool X<sv_2bool>, sv_2cv
+X<sv_2cv>, sv_2io X<sv_2io>, sv_2iv_flags X<sv_2iv_flags>, sv_2mortal
+X<sv_2mortal>, sv_2nv X<sv_2nv>, sv_2pvbyte X<sv_2pvbyte>, sv_2pvutf8
+X<sv_2pvutf8>, sv_2pv_flags X<sv_2pv_flags>, sv_2uv_flags X<sv_2uv_flags>,
+sv_backoff X<sv_backoff>, sv_bless X<sv_bless>, sv_catpv X<sv_catpv>,
+sv_catpvf X<sv_catpvf>, sv_catpvf_mg X<sv_catpvf_mg>, sv_catpvn
+X<sv_catpvn>, sv_catpvn_flags X<sv_catpvn_flags>, sv_catpvs X<sv_catpvs>,
+sv_catpv_mg X<sv_catpv_mg>, sv_catsv X<sv_catsv>, sv_catsv_flags
+X<sv_catsv_flags>, sv_chop X<sv_chop>, sv_clear X<sv_clear>, sv_cmp
+X<sv_cmp>, sv_cmp_locale X<sv_cmp_locale>, sv_collxfrm X<sv_collxfrm>,
+sv_copypv X<sv_copypv>, sv_dec X<sv_dec>, sv_eq X<sv_eq>,
+sv_force_normal_flags X<sv_force_normal_flags>, sv_free X<sv_free>, sv_gets
+X<sv_gets>, sv_grow X<sv_grow>, sv_inc X<sv_inc>, sv_insert X<sv_insert>,
+sv_insert_flags X<sv_insert_flags>, sv_isa X<sv_isa>, sv_isobject
+X<sv_isobject>, sv_len X<sv_len>, sv_len_utf8 X<sv_len_utf8>, sv_magic
+X<sv_magic>, sv_magicext X<sv_magicext>, sv_mortalcopy X<sv_mortalcopy>,
+sv_newmortal X<sv_newmortal>, sv_newref X<sv_newref>, sv_pos_b2u
+X<sv_pos_b2u>, sv_pos_u2b X<sv_pos_u2b>, sv_pvbyten_force
+X<sv_pvbyten_force>, sv_pvn_force X<sv_pvn_force>, sv_pvn_force_flags
+X<sv_pvn_force_flags>, sv_pvutf8n_force X<sv_pvutf8n_force>, sv_reftype
+X<sv_reftype>, sv_replace X<sv_replace>, sv_reset X<sv_reset>, sv_rvweaken
+X<sv_rvweaken>, sv_setiv X<sv_setiv>, sv_setiv_mg X<sv_setiv_mg>, sv_setnv
+X<sv_setnv>, sv_setnv_mg X<sv_setnv_mg>, sv_setpv X<sv_setpv>, sv_setpvf
+X<sv_setpvf>, sv_setpvf_mg X<sv_setpvf_mg>, sv_setpviv X<sv_setpviv>,
+sv_setpviv_mg X<sv_setpviv_mg>, sv_setpvn X<sv_setpvn>, sv_setpvn_mg
+X<sv_setpvn_mg>, sv_setpvs X<sv_setpvs>, sv_setpv_mg X<sv_setpv_mg>,
+sv_setref_iv X<sv_setref_iv>, sv_setref_nv X<sv_setref_nv>, sv_setref_pv
+X<sv_setref_pv>, sv_setref_pvn X<sv_setref_pvn>, sv_setref_uv
+X<sv_setref_uv>, sv_setsv X<sv_setsv>, sv_setsv_flags X<sv_setsv_flags>,
+sv_setsv_mg X<sv_setsv_mg>, sv_setuv X<sv_setuv>, sv_setuv_mg
+X<sv_setuv_mg>, sv_tainted X<sv_tainted>, sv_true X<sv_true>, sv_unmagic
+X<sv_unmagic>, sv_unref_flags X<sv_unref_flags>, sv_untaint X<sv_untaint>,
+sv_upgrade X<sv_upgrade>, sv_usepvn_flags X<sv_usepvn_flags>,
+sv_utf8_decode X<sv_utf8_decode>, sv_utf8_downgrade X<sv_utf8_downgrade>,
+sv_utf8_encode X<sv_utf8_encode>, sv_utf8_upgrade X<sv_utf8_upgrade>,
+sv_utf8_upgrade_flags X<sv_utf8_upgrade_flags>, sv_utf8_upgrade_nomg
+X<sv_utf8_upgrade_nomg>, sv_vcatpvf X<sv_vcatpvf>, sv_vcatpvfn
+X<sv_vcatpvfn>, sv_vcatpvf_mg X<sv_vcatpvf_mg>, sv_vsetpvf X<sv_vsetpvf>,
+sv_vsetpvfn X<sv_vsetpvfn>, sv_vsetpvf_mg X<sv_vsetpvf_mg>
+
+=item Unicode Support
+
+bytes_from_utf8 X<bytes_from_utf8>, bytes_to_utf8 X<bytes_to_utf8>,
+ibcmp_utf8 X<ibcmp_utf8>, is_utf8_char X<is_utf8_char>, is_utf8_string
+X<is_utf8_string>, is_utf8_string_loc X<is_utf8_string_loc>,
+is_utf8_string_loclen X<is_utf8_string_loclen>, pv_uni_display
+X<pv_uni_display>, sv_cat_decode X<sv_cat_decode>, sv_recode_to_utf8
+X<sv_recode_to_utf8>, sv_uni_display X<sv_uni_display>, to_utf8_case
+X<to_utf8_case>, to_utf8_fold X<to_utf8_fold>, to_utf8_lower
+X<to_utf8_lower>, to_utf8_title X<to_utf8_title>, to_utf8_upper
+X<to_utf8_upper>, utf8n_to_uvchr X<utf8n_to_uvchr>, utf8n_to_uvuni
+X<utf8n_to_uvuni>, utf8_distance X<utf8_distance>, utf8_hop X<utf8_hop>,
+utf8_length X<utf8_length>, utf8_to_bytes X<utf8_to_bytes>, utf8_to_uvchr
+X<utf8_to_uvchr>, utf8_to_uvuni X<utf8_to_uvuni>, uvchr_to_utf8
+X<uvchr_to_utf8>, uvuni_to_utf8_flags X<uvuni_to_utf8_flags>
+
+=item Variables created by C<xsubpp> and C<xsubpp> internal functions
+
+ax X<ax>, CLASS X<CLASS>, dAX X<dAX>, dAXMARK X<dAXMARK>, dITEMS X<dITEMS>,
+dUNDERBAR X<dUNDERBAR>, dXSARGS X<dXSARGS>, dXSI32 X<dXSI32>, items
+X<items>, ix X<ix>, newXSproto X<newXSproto>, RETVAL X<RETVAL>, ST X<ST>,
+THIS X<THIS>, UNDERBAR X<UNDERBAR>, XS X<XS>, XS_VERSION X<XS_VERSION>,
+XS_VERSION_BOOTCHECK X<XS_VERSION_BOOTCHECK>
+
+=item Warning and Dieing
+
+croak X<croak>, warn X<warn>
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 perlintern - autogenerated documentation of purely B<internal>
+ Perl functions
+
+=over 4
+
+=item DESCRIPTION
+X<internal Perl functions> X<interpreter functions>
+
+=item CV reference counts and CvOUTSIDE
+
+CvWEAKOUTSIDE X<CvWEAKOUTSIDE>
+
+=item Functions in file pad.h
+
+CX_CURPAD_SAVE X<CX_CURPAD_SAVE>, CX_CURPAD_SV X<CX_CURPAD_SV>, PAD_BASE_SV
+X<PAD_BASE_SV>, PAD_CLONE_VARS X<PAD_CLONE_VARS>, PAD_COMPNAME_FLAGS
+X<PAD_COMPNAME_FLAGS>, PAD_COMPNAME_GEN X<PAD_COMPNAME_GEN>,
+PAD_COMPNAME_GEN_set X<PAD_COMPNAME_GEN_set>, PAD_COMPNAME_OURSTASH
+X<PAD_COMPNAME_OURSTASH>, PAD_COMPNAME_PV X<PAD_COMPNAME_PV>,
+PAD_COMPNAME_TYPE X<PAD_COMPNAME_TYPE>, PAD_DUP X<PAD_DUP>,
+PAD_RESTORE_LOCAL X<PAD_RESTORE_LOCAL>, PAD_SAVE_LOCAL X<PAD_SAVE_LOCAL>,
+PAD_SAVE_SETNULLPAD X<PAD_SAVE_SETNULLPAD>, PAD_SETSV X<PAD_SETSV>,
+PAD_SET_CUR X<PAD_SET_CUR>, PAD_SET_CUR_NOSAVE X<PAD_SET_CUR_NOSAVE>,
+PAD_SV X<PAD_SV>, PAD_SVl X<PAD_SVl>, SAVECLEARSV X<SAVECLEARSV>,
+SAVECOMPPAD X<SAVECOMPPAD>, SAVEPADSV X<SAVEPADSV>
+
+=item GV Functions
+
+is_gv_magical X<is_gv_magical>, is_gv_magical_sv X<is_gv_magical_sv>
+
+=item Hash Manipulation Functions
+
+refcounted_he_chain_2hv X<refcounted_he_chain_2hv>, refcounted_he_free
+X<refcounted_he_free>, refcounted_he_new X<refcounted_he_new>
+
+=item IO Functions
+
+start_glob X<start_glob>
+
+=item Magical Functions
+
+magic_clearhint X<magic_clearhint>, magic_sethint X<magic_sethint>,
+mg_localize X<mg_localize>
+
+=item MRO Functions
+
+mro_get_linear_isa_dfs X<mro_get_linear_isa_dfs>, mro_isa_changed_in
+X<mro_isa_changed_in>
+
+=item Pad Data Structures
+
+CvPADLIST X<CvPADLIST>, cv_clone X<cv_clone>, cv_dump X<cv_dump>,
+do_dump_pad X<do_dump_pad>, intro_my X<intro_my>, pad_add_anon
+X<pad_add_anon>, pad_add_name X<pad_add_name>, pad_alloc X<pad_alloc>,
+pad_block_start X<pad_block_start>, pad_check_dup X<pad_check_dup>,
+pad_findlex X<pad_findlex>, pad_findmy X<pad_findmy>, pad_fixup_inner_anons
+X<pad_fixup_inner_anons>, pad_free X<pad_free>, pad_leavemy X<pad_leavemy>,
+pad_new X<pad_new>, pad_push X<pad_push>, pad_reset X<pad_reset>, pad_setsv
+X<pad_setsv>, pad_swipe X<pad_swipe>, pad_tidy X<pad_tidy>, pad_undef
+X<pad_undef>
+
+=item Per-Interpreter Variables
+
+PL_DBsingle X<PL_DBsingle>, PL_DBsub X<PL_DBsub>, PL_DBtrace X<PL_DBtrace>,
+PL_dowarn X<PL_dowarn>, PL_last_in_gv X<PL_last_in_gv>, PL_ofs_sv
+X<PL_ofs_sv>, PL_rs X<PL_rs>
+
+=item Stack Manipulation Macros
+
+djSP X<djSP>, LVRET X<LVRET>
+
+=item SV Manipulation Functions
+
+sv_add_arena X<sv_add_arena>, sv_clean_all X<sv_clean_all>, sv_clean_objs
+X<sv_clean_objs>, sv_free_arenas X<sv_free_arenas>
+
+=item SV-Body Allocation
+
+sv_2num X<sv_2num>
+
+=item Unicode Support
+
+find_uninit_var X<find_uninit_var>, report_uninit X<report_uninit>
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 perliol - C API for Perl's implementation of IO in Layers.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item History and Background
+
+=item Basic Structure
+
+=item Layers vs Disciplines
+
+=item Data Structures
+
+=item Functions and Attributes
+
+=item Per-instance Data
+
+=item Layers in action.
+
+=item Per-instance flag bits
+
+PERLIO_F_EOF, PERLIO_F_CANWRITE, PERLIO_F_CANREAD, PERLIO_F_ERROR,
+PERLIO_F_TRUNCATE, PERLIO_F_APPEND, PERLIO_F_CRLF, PERLIO_F_UTF8,
+PERLIO_F_UNBUF, PERLIO_F_WRBUF, PERLIO_F_RDBUF, PERLIO_F_LINEBUF,
+PERLIO_F_TEMP, PERLIO_F_OPEN, PERLIO_F_FASTGETS
+
+=item Methods in Detail
+
+fsize, name, size, kind, PERLIO_K_BUFFERED, PERLIO_K_RAW, PERLIO_K_CANCRLF,
+PERLIO_K_FASTGETS, PERLIO_K_MULTIARG, Pushed, Popped, Open, Binmode,
+Getarg, Fileno, Dup, Read, Write, Seek, Tell, Close, Flush, Fill, Eof,
+Error, Clearerr, Setlinebuf, Get_base, Get_bufsiz, Get_ptr, Get_cnt,
+Set_ptrcnt
+
+=item Utilities
+
+=item Implementing PerlIO Layers
+
+C implementations, Perl implementations
+
+=item Core Layers
+
+"unix", "perlio", "stdio", "crlf", "mmap", "pending", "raw", "utf8"
+
+=item Extension Layers
+
+":encoding", ":scalar", ":via"
+
+=back
+
+=item TODO
+
+=back
+
+=head2 perlapio - perl's IO abstraction interface.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+1. USE_STDIO, 2. USE_SFIO, 3. USE_PERLIO, B<PerlIO_stdin()>,
+B<PerlIO_stdout()>, B<PerlIO_stderr()>, B<PerlIO_open(path, mode)>,
+B<PerlIO_fdopen(fd,mode)>, B<PerlIO_reopen(path,mode,f)>,
+B<PerlIO_printf(f,fmt,...)>, B<PerlIO_vprintf(f,fmt,a)>,
+B<PerlIO_stdoutf(fmt,...)>, B<PerlIO_read(f,buf,count)>,
+B<PerlIO_write(f,buf,count)>, B<PerlIO_close(f)>, B<PerlIO_puts(f,s)>,
+B<PerlIO_putc(f,c)>, B<PerlIO_ungetc(f,c)>, B<PerlIO_getc(f)>,
+B<PerlIO_eof(f)>, B<PerlIO_error(f)>, B<PerlIO_fileno(f)>,
+B<PerlIO_clearerr(f)>, B<PerlIO_flush(f)>, B<PerlIO_seek(f,offset,whence)>,
+B<PerlIO_tell(f)>, B<PerlIO_getpos(f,p)>, B<PerlIO_setpos(f,p)>,
+B<PerlIO_rewind(f)>, B<PerlIO_tmpfile()>, B<PerlIO_setlinebuf(f)>
+
+=over 4
+
+=item Co-existence with stdio
+
+B<PerlIO_importFILE(f,mode)>, B<PerlIO_exportFILE(f,mode)>,
+B<PerlIO_releaseFILE(p,f)>, B<PerlIO_findFILE(f)>
+
+=item "Fast gets" Functions
+
+B<PerlIO_fast_gets(f)>, B<PerlIO_has_cntptr(f)>, B<PerlIO_get_cnt(f)>,
+B<PerlIO_get_ptr(f)>, B<PerlIO_set_ptrcnt(f,p,c)>, B<PerlIO_canset_cnt(f)>,
+B<PerlIO_set_cnt(f,c)>, B<PerlIO_has_base(f)>, B<PerlIO_get_base(f)>,
+B<PerlIO_get_bufsiz(f)>
+
+=item Other Functions
+
+PerlIO_apply_layers(f,mode,layers), PerlIO_binmode(f,ptype,imode,layers),
+'E<lt>' read, 'E<gt>' write, '+' read/write, PerlIO_debug(fmt,...)
+
+=back
+
+=back
+
+=head2 perlhack - How to hack at the Perl internals
+
+=over 4
+
+=item DESCRIPTION
+
+Does concept match the general goals of Perl?, Where is the
+implementation?, Backwards compatibility, Could it be a module instead?, Is
+the feature generic enough?, Does it potentially introduce new bugs?, Does
+it preclude other desirable features?, Is the implementation robust?, Is
+the implementation generic enough to be portable?, Is the implementation
+tested?, Is there enough documentation?, Is there another way to do it?,
+Does it create too much work?, Patches speak louder than words
+
+=over 4
+
+=item Keeping in sync
+
+=item Perlbug administration
+
+=item Submitting patches
+
+L<perlguts>, L<perlxstut> and L<perlxs>, L<perlapi>,
+F<Porting/pumpkin.pod>, The perl5-porters FAQ
+
+=item Finding Your Way Around
+
+Core modules, Tests, Documentation, Configure, Interpreter
+
+=item Elements of the interpreter
+
+Startup, Parsing, Optimization, Running, Exception handing
+
+=item Internal Variable Types
+
+=item Op Trees
+
+=item Stacks
+
+Argument stack, Mark stack, Save stack
+
+=item Millions of Macros
+
+=item The .i Targets
+
+=back
+
+=item SOURCE CODE STATIC ANALYSIS
+
+=over 4
+
+=item lint, splint
+
+=item Coverity
+
+=item cpd (cut-and-paste detector)
+
+=item gcc warnings
+
+=item Warnings of other C compilers
+
+=item DEBUGGING
+
+=item Poking at Perl
+
+=item Using a source-level debugger
+
+run [args], break function_name, break source.c:xxx, step, next, continue,
+finish, 'enter', print
+
+=item gdb macro support
+
+=item Dumping Perl Data Structures
+
+=item Patching
+
+=item Patching a core module
+
+=item Adding a new function to the core
+
+=item Writing a test
+
+F<t/base/>, F<t/cmd/>, F<t/comp/>, F<t/io/>, F<t/lib/>, F<t/mro/>,
+F<t/op/>, F<t/pod/>, F<t/run/>, F<t/uni/>, F<t/win32/>, F<t/x2p>, t/base
+t/comp, t/cmd t/run t/io t/op, t/lib ext lib
+
+=item Special Make Test Targets
+
+coretest, test.deparse, test.taintwarn, minitest, test.valgrind
+check.valgrind utest.valgrind ucheck.valgrind, test.third check.third
+utest.third ucheck.third, test.torture torturetest, utest ucheck test.utf8
+check.utf8, minitest.utf16 test.utf16, test_harness, test-notty test_notty
+
+=item Running tests by hand
+
+-v, -torture, -re=PATTERN, -re LIST OF PATTERNS, PERL_CORE=1,
+PERL_DESTRUCT_LEVEL=2, PERL, PERL_SKIP_TTY_TEST, PERL_TEST_Net_Ping,
+PERL_TEST_NOVREXX, PERL_TEST_NUMCONVERTS
+
+=item Common problems when patching Perl source code
+
+=item Perl environment problems
+
+=item Portability problems
+
+=item Problematic System Interfaces
+
+=item Security problems
+
+=back
+
+=item EXTERNAL TOOLS FOR DEBUGGING PERL
+
+=over 4
+
+=item Rational Software's Purify
+
+=item Purify on Unix
+
+-Accflags=-DPURIFY, -Doptimize='-g', -Uusemymalloc, -Dusemultiplicity
+
+=item Purify on NT
+
+DEFINES, USE_MULTI = define, #PERL_MALLOC = define, CFG = Debug
+
+=item valgrind
+
+=item Compaq's/Digital's/HP's Third Degree
+
+=item PERL_DESTRUCT_LEVEL
+
+=item PERL_MEM_LOG
+
+=item Profiling
+
+=item Gprof Profiling
+
+-a, -b, -e routine, -f routine, -s, -z
+
+=item GCC gcov Profiling
+
+=item Pixie Profiling
+
+-h, -l, -p[rocedures], -h[eavy], -i[nvocations], -l[ines], -testcoverage,
+-z[ero]
+
+=item Miscellaneous tricks
+
+=back
+
+=item CONCLUSION
+
+I<The Road goes ever on and on, down from the door where it began.>
+
+=over 4
+
+=item Metaphoric Quotations
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlrepository - Using the Perl source repository
+
+=over 4
+
+=item SYNOPSIS
+
+=item GETTING ACCESS TO THE REPOSITORY
+
+=over 4
+
+=item READ ACCESS VIA THE WEB
+
+=item READ ACCESS VIA GIT
+
+=item WRITE ACCESS TO THE REPOSITORY
+
+=back
+
+=item OVERVIEW OF THE REPOSITORY
+
+=over 4
+
+=item FINDING OUT YOUR STATUS
+
+=back
+
+=item SUBMITTING A PATCH
+
+=over 4
+
+=item A note on derived files
+
+=item A note on binary files
+
+=item Getting your patch accepted
+
+Comments, Comments, Comments, Style, Testsuite
+
+=back
+
+=item ACCEPTING A PATCH
+
+=item CLEANING A WORKING DIRECTORY
+
+=item BISECTING
+
+=item SUBMITTING A PATCH VIA GITHUB
+
+=item MERGING FROM A BRANCH VIA GITHUB
+
+=item COMMITTING TO MAINTENANCE VERSIONS
+
+=item SEE ALSO
+
+=back
+
+=head2 perlbook - Perl book information
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 perlcommunity - a brief overview of the Perl community
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Where to find the community
+
+=item Mailing lists and Newsgroups
+
+=item IRC
+
+=item Websites
+
+L<http://perl.com/>, L<http://use.perl.org/>, L<http://www.perlmonks.org/>
+
+=item User Groups
+
+=item Workshops
+
+=item Hackathons
+
+=item Conventions
+
+=item Calendar of Perl Events
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perltodo - Perl TO-DO List
+
+=over 4
+
+=item DESCRIPTION
+
+=item Tasks that only need Perl knowledge
+
+=over 4
+
+=item Remove macperl references from tests
+
+=item Remove duplication of test setup.
+
+=item POD -E<gt> HTML conversion in the core still sucks
+
+=item Make ExtUtils::ParseXS use strict;
+
+=item Parallel testing
+
+=item Make Schwern poorer
+
+=item Improve the coverage of the core tests
+
+=item test B
+
+=item A decent benchmark
+
+=item fix tainting bugs
+
+=item Dual life everything
+
+=item Bundle dual life modules in ext/
+
+=item POSIX memory footprint
+
+=item embed.pl/makedef.pl
+
+=item use strict; and AutoLoad
+
+=item profile installman
+
+=back
+
+=item Tasks that need a little sysadmin-type knowledge
+
+=over 4
+
+=item make HTML install work
+
+=item compressed man pages
+
+=item Add a code coverage target to the Makefile
+
+=item Make Config.pm cope with differences between built and installed perl
+
+=item linker specification files
+
+=item Cross-compile support
+
+=item roffitall
+
+=item Split "linker" from "compiler"
+
+C<cc> (in F<cc.U>), C<ld> (in F<dlsrc.U>)
+
+=item Configure Windows using PowerShell
+
+=item decouple -g and -DDEBUGGING
+
+=back
+
+=item Tasks that need a little C knowledge
+
+=over 4
+
+=item Weed out needless PERL_UNUSED_ARG
+
+=item Modernize the order of directories in @INC
+
+=item -Duse32bit*
+
+=item Profile Perl - am I hot or not?
+
+=item Allocate OPs from arenas
+
+=item Improve win32/wince.c
+
+=item Use secure CRT functions when building with VC8 on Win32
+
+=item Fix POSIX::access() and chdir() on Win32
+
+=item strcat(), strcpy(), strncat(), strncpy(), sprintf(), vsprintf()
+
+=item -D_FORTIFY_SOURCE=2, -fstack-protector
+
+=item Arenas for GPs? For MAGIC?
+
+=item Shared arenas
+
+=back
+
+=item Tasks that need a knowledge of XS
+
+=over 4
+
+=item Remove the use of SVs as temporaries in dump.c
+
+=item safely supporting POSIX SA_SIGINFO
+
+=item autovivification
+
+=item Unicode in Filenames
+
+=item Unicode in %ENV
+
+=item Unicode and glob()
+
+=item Unicode and lc/uc operators
+
+=item use less 'memory'
+
+=item Re-implement C<:unique> in a way that is actually thread-safe
+
+=item Make tainting consistent
+
+=item readpipe(LIST)
+
+=item Audit the code for destruction ordering assumptions
+
+=item Extend PerlIO and PerlIO::Scalar
+
+=item -C on the #! line
+
+=item Duplicate logic in S_method_common() and
+Perl_gv_fetchmethod_autoload()
+
+=item Organize error messages
+
+=back
+
+=item Tasks that need a knowledge of the interpreter
+
+=over 4
+
+=item forbid labels with keyword names
+
+=item truncate() prototype
+
+=item decapsulation of smart match argument
+
+=item error reporting of [$a ; $b]
+
+=item lexicals used only once
+
+=item UTF-8 revamp
+
+=item Properly Unicode safe tokeniser and pads.
+
+=item state variable initialization in list context
+
+=item Implement $value ~~ 0 .. $range
+
+=item A does() built-in
+
+=item Tied filehandles and write() don't mix
+
+=item Propagate compilation hints to the debugger
+
+=item Attach/detach debugger from running program
+
+=item LVALUE functions for lists
+
+=item regexp optimiser optional
+
+=item delete &function
+
+=item C</w> regex modifier
+
+=item optional optimizer
+
+=item You WANT *how* many
+
+=item lexical aliases
+
+=item entersub XS vs Perl
+
+=item Self-ties
+
+=item Optimize away @_
+
+=item The yada yada yada operators
+
+=item Virtualize operating system access
+
+=item Investigate PADTMP hash pessimisation
+
+=item Store the current pad in the OP slab allocator
+
+=item repack the optree
+
+=item eliminate incorrect line numbers in warnings
+
+=item optimize tail-calls
+
+=item C<\N>
+
+=back
+
+=item Big projects
+
+=over 4
+
+=item make ithreads more robust
+
+=item iCOW
+
+=item (?{...}) closures in regexps
+
+=item A re-entrant regexp engine
+
+=item Add class set operations to regexp engine
+
+=back
+
+=item Tasks for microperl
+
+=over 4
+
+=item make creating uconfig.sh automatic
+
+=item make creating Makefile.micro automatic
+
+=item do away with fork/exec/wait?
+
+=item some of the uconfig.sh really needs to be probed (using cc) in
+buildtime:
+
+=back
+
+=back
+
+=head2 perldoc - Look up Perl documentation in Pod format.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+B<-h>, B<-v>, B<-t>, B<-u>, B<-m> I<module>, B<-l>, B<-F>, B<-f>
+I<perlfunc>, B<-q> I<perlfaq-search-regexp>, B<-T>, B<-d>
+I<destination-filename>, B<-o> I<output-formatname>, B<-M> I<module-name>,
+B<-w> I<option:value> or B<-w> I<option>, B<-X>, B<-L> I<language_code>,
+B<PageName|ModuleName|ProgramName>, B<-n> I<some-formatter>, B<-r>, B<-i>,
+B<-V>
+
+=item SECURITY
+
+=item ENVIRONMENT
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perlhist - the Perl history records
+
+=over 4
+
+=item DESCRIPTION
+
+=item INTRODUCTION
+
+=item THE KEEPERS OF THE PUMPKIN
+
+=over 4
+
+=item PUMPKIN?
+
+=back
+
+=item THE RECORDS
+
+=over 4
+
+=item SELECTED RELEASE SIZES
+
+=item SELECTED PATCH SIZES
+
+=back
+
+=item THE KEEPERS OF THE RECORDS
+
+=back
+
+=head2 perldelta - what is new for perl v5.10.1
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=over 4
+
+=item Switch statement changes
+
+flip-flop operators, defined-or operator
+
+=item Smart match changes
+
+=item Other incompatible changes
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item Unicode Character Database 5.1.0
+
+=item A proper interface for pluggable Method Resolution Orders
+
+=item The C<overloading> pragma
+
+=item Parallel tests
+
+=item DTrace support
+
+=item Support for C<configure_requires> in CPAN module metadata
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules and Pragmata
+
+C<autodie>, C<Compress::Raw::Bzip2>, C<parent>, C<Parse::CPAN::Meta>
+
+=item Pragmata Changes
+
+C<attributes>, C<attrs>, C<base>, C<bigint>, C<bignum>, C<bigrat>,
+C<charnames>, C<constant>, C<feature>, C<fields>, C<lib>, C<open>,
+C<overload>, C<overloading>, C<version>
+
+=item Updated Modules
+
+C<Archive::Extract>, C<Archive::Tar>, C<Attribute::Handlers>,
+C<AutoLoader>, C<AutoSplit>, C<B>, C<B::Debug>, C<B::Deparse>, C<B::Lint>,
+C<B::Xref>, C<Benchmark>, C<Carp>, C<CGI>, C<Compress::Zlib>, C<CPAN>,
+C<CPANPLUS>, C<CPANPLUS::Dist::Build>, C<Cwd>, C<Data::Dumper>, C<DB>,
+C<DB_File>, C<Devel::PPPort>, C<Digest::MD5>, C<Digest::SHA>, C<DirHandle>,
+C<Dumpvalue>, C<DynaLoader>, C<Encode>, C<Errno>, C<Exporter>,
+C<ExtUtils::CBuilder>, C<ExtUtils::Command>, C<ExtUtils::Constant>,
+C<ExtUtils::Embed>, C<ExtUtils::Install>, C<ExtUtils::MakeMaker>,
+C<ExtUtils::Manifest>, C<ExtUtils::ParseXS>, C<Fatal>, C<File::Basename>,
+C<File::Compare>, C<File::Copy>, C<File::Fetch>, C<File::Find>,
+C<File::Path>, C<File::Spec>, C<File::stat>, C<File::Temp>, C<FileCache>,
+C<FileHandle>, C<Filter::Simple>, C<Filter::Util::Call>, C<FindBin>,
+C<GDBM_File>, C<Getopt::Long>, C<Hash::Util::FieldHash>, C<I18N::Collate>,
+C<IO>, C<IO::Compress::*>, C<IO::Dir>, C<IO::Handle>, C<IO::Socket>,
+C<IO::Zlib>, C<IPC::Cmd>, C<IPC::Open3>, C<IPC::SysV>, C<lib>,
+C<List::Util>, C<Locale::MakeText>, C<Log::Message>, C<Math::BigFloat>,
+C<Math::BigInt>, C<Math::BigInt::FastCalc>, C<Math::BigRat>,
+C<Math::Complex>, C<Math::Trig>, C<Memoize>, C<Module::Build>,
+C<Module::CoreList>, C<Module::Load>, C<Module::Load::Conditional>,
+C<Module::Loaded>, C<Module::Pluggable>, C<NDBM_File>, C<Net::Ping>,
+C<NEXT>, C<Object::Accessor>, C<OS2::REXX>, C<Package::Constants>,
+C<PerlIO>, C<PerlIO::via>, C<Pod::Man>, C<Pod::Parser>, C<Pod::Simple>,
+C<Pod::Text>, C<POSIX>, C<Safe>, C<Scalar::Util>, C<SelectSaver>,
+C<SelfLoader>, C<Socket>, C<Storable>, C<Switch>, C<Symbol>,
+C<Sys::Syslog>, C<Term::ANSIColor>, C<Term::ReadLine>, C<Term::UI>,
+C<Test::Harness>, C<Test::Simple>, C<Text::ParseWords>, C<Text::Tabs>,
+C<Text::Wrap>, C<Thread::Queue>, C<Thread::Semaphore>, C<threads>,
+C<threads::shared>, C<Tie::RefHash>, C<Tie::StdHandle>, C<Time::HiRes>,
+C<Time::Local>, C<Time::Piece>, C<Unicode::Normalize>, C<Unicode::UCD>,
+C<UNIVERSAL>, C<Win32>, C<Win32API::File>, C<XSLoader>
+
+=back
+
+=item Utility Changes
+
+F<h2ph>, F<h2xs>, F<perl5db.pl>, F<perlthanks>
+
+=item New Documentation
+
+L<perlhaiku>, L<perlmroapi>, L<perlperf>, L<perlrepository>, L<perlthanks>
+
+=item Changes to Existing Documentation
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item F<ext/> reorganisation
+
+=item Configuration improvements
+
+=item Compilation improvements
+
+=item Platform Specific Changes
+
+AIX, Cygwin, FreeBSD, Irix, Haiku, MirOS BSD, NetBSD, Stratus VOS, Symbian,
+Win32, VMS
+
+=back
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+C<panic: sv_chop %s>, C<Can't locate package %s for the parents of %s>,
+C<v-string in use/require is non-portable>, C<Deep recursion on subroutine
+"%s">
+
+=item Changed Internals
+
+C<SVf_UTF8>, C<SVs_TEMP>
+
+=item New Tests
+
+t/comp/retainedlines.t, t/io/perlio_fail.t, t/io/perlio_leaks.t,
+t/io/perlio_open.t, t/io/perlio.t, t/io/pvbm.t, t/mro/package_aliases.t,
+t/op/dbm.t, t/op/index_thr.t, t/op/pat_thr.t, t/op/qr_gc.t,
+t/op/reg_email_thr.t, t/op/regexp_qr_embed_thr.t,
+t/op/regexp_unicode_prop.t, t/op/regexp_unicode_prop_thr.t,
+t/op/reg_nc_tie.t, t/op/reg_posixcc.t, t/op/re.t, t/op/setpgrpstack.t,
+t/op/substr_thr.t, t/op/upgrade.t, t/uni/lex_utf8.t, t/uni/tie.t
+
+=item Known Problems
+
+=item Deprecations
+
+=item Acknowledgements
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl5101delta, perldelta - what is new for perl v5.10.1
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=over 4
+
+=item Switch statement changes
+
+flip-flop operators, defined-or operator
+
+=item Smart match changes
+
+=item Other incompatible changes
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item Unicode Character Database 5.1.0
+
+=item A proper interface for pluggable Method Resolution Orders
+
+=item The C<overloading> pragma
+
+=item Parallel tests
+
+=item DTrace support
+
+=item Support for C<configure_requires> in CPAN module metadata
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules and Pragmata
+
+C<autodie>, C<Compress::Raw::Bzip2>, C<parent>, C<Parse::CPAN::Meta>
+
+=item Pragmata Changes
+
+C<attributes>, C<attrs>, C<base>, C<bigint>, C<bignum>, C<bigrat>,
+C<charnames>, C<constant>, C<feature>, C<fields>, C<lib>, C<open>,
+C<overload>, C<overloading>, C<version>
+
+=item Updated Modules
+
+C<Archive::Extract>, C<Archive::Tar>, C<Attribute::Handlers>,
+C<AutoLoader>, C<AutoSplit>, C<B>, C<B::Debug>, C<B::Deparse>, C<B::Lint>,
+C<B::Xref>, C<Benchmark>, C<Carp>, C<CGI>, C<Compress::Zlib>, C<CPAN>,
+C<CPANPLUS>, C<CPANPLUS::Dist::Build>, C<Cwd>, C<Data::Dumper>, C<DB>,
+C<DB_File>, C<Devel::PPPort>, C<Digest::MD5>, C<Digest::SHA>, C<DirHandle>,
+C<Dumpvalue>, C<DynaLoader>, C<Encode>, C<Errno>, C<Exporter>,
+C<ExtUtils::CBuilder>, C<ExtUtils::Command>, C<ExtUtils::Constant>,
+C<ExtUtils::Embed>, C<ExtUtils::Install>, C<ExtUtils::MakeMaker>,
+C<ExtUtils::Manifest>, C<ExtUtils::ParseXS>, C<Fatal>, C<File::Basename>,
+C<File::Compare>, C<File::Copy>, C<File::Fetch>, C<File::Find>,
+C<File::Path>, C<File::Spec>, C<File::stat>, C<File::Temp>, C<FileCache>,
+C<FileHandle>, C<Filter::Simple>, C<Filter::Util::Call>, C<FindBin>,
+C<GDBM_File>, C<Getopt::Long>, C<Hash::Util::FieldHash>, C<I18N::Collate>,
+C<IO>, C<IO::Compress::*>, C<IO::Dir>, C<IO::Handle>, C<IO::Socket>,
+C<IO::Zlib>, C<IPC::Cmd>, C<IPC::Open3>, C<IPC::SysV>, C<lib>,
+C<List::Util>, C<Locale::MakeText>, C<Log::Message>, C<Math::BigFloat>,
+C<Math::BigInt>, C<Math::BigInt::FastCalc>, C<Math::BigRat>,
+C<Math::Complex>, C<Math::Trig>, C<Memoize>, C<Module::Build>,
+C<Module::CoreList>, C<Module::Load>, C<Module::Load::Conditional>,
+C<Module::Loaded>, C<Module::Pluggable>, C<NDBM_File>, C<Net::Ping>,
+C<NEXT>, C<Object::Accessor>, C<OS2::REXX>, C<Package::Constants>,
+C<PerlIO>, C<PerlIO::via>, C<Pod::Man>, C<Pod::Parser>, C<Pod::Simple>,
+C<Pod::Text>, C<POSIX>, C<Safe>, C<Scalar::Util>, C<SelectSaver>,
+C<SelfLoader>, C<Socket>, C<Storable>, C<Switch>, C<Symbol>,
+C<Sys::Syslog>, C<Term::ANSIColor>, C<Term::ReadLine>, C<Term::UI>,
+C<Test::Harness>, C<Test::Simple>, C<Text::ParseWords>, C<Text::Tabs>,
+C<Text::Wrap>, C<Thread::Queue>, C<Thread::Semaphore>, C<threads>,
+C<threads::shared>, C<Tie::RefHash>, C<Tie::StdHandle>, C<Time::HiRes>,
+C<Time::Local>, C<Time::Piece>, C<Unicode::Normalize>, C<Unicode::UCD>,
+C<UNIVERSAL>, C<Win32>, C<Win32API::File>, C<XSLoader>
+
+=back
+
+=item Utility Changes
+
+F<h2ph>, F<h2xs>, F<perl5db.pl>, F<perlthanks>
+
+=item New Documentation
+
+L<perlhaiku>, L<perlmroapi>, L<perlperf>, L<perlrepository>, L<perlthanks>
+
+=item Changes to Existing Documentation
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item F<ext/> reorganisation
+
+=item Configuration improvements
+
+=item Compilation improvements
+
+=item Platform Specific Changes
+
+AIX, Cygwin, FreeBSD, Irix, Haiku, MirOS BSD, NetBSD, Stratus VOS, Symbian,
+Win32, VMS
+
+=back
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+C<panic: sv_chop %s>, C<Can't locate package %s for the parents of %s>,
+C<v-string in use/require is non-portable>, C<Deep recursion on subroutine
+"%s">
+
+=item Changed Internals
+
+C<SVf_UTF8>, C<SVs_TEMP>
+
+=item New Tests
+
+t/comp/retainedlines.t, t/io/perlio_fail.t, t/io/perlio_leaks.t,
+t/io/perlio_open.t, t/io/perlio.t, t/io/pvbm.t, t/mro/package_aliases.t,
+t/op/dbm.t, t/op/index_thr.t, t/op/pat_thr.t, t/op/qr_gc.t,
+t/op/reg_email_thr.t, t/op/regexp_qr_embed_thr.t,
+t/op/regexp_unicode_prop.t, t/op/regexp_unicode_prop_thr.t,
+t/op/reg_nc_tie.t, t/op/reg_posixcc.t, t/op/re.t, t/op/setpgrpstack.t,
+t/op/substr_thr.t, t/op/upgrade.t, t/uni/lex_utf8.t, t/uni/tie.t
+
+=item Known Problems
+
+=item Deprecations
+
+=item Acknowledgements
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl5100delta - what is new for perl 5.10.0
+
+=over 4
+
+=item DESCRIPTION
+
+=item Core Enhancements
+
+=over 4
+
+=item The C<feature> pragma
+
+=item New B<-E> command-line switch
+
+=item Defined-or operator
+
+=item Switch and Smart Match operator
+
+=item Regular expressions
+
+Recursive Patterns, Named Capture Buffers, Possessive Quantifiers,
+Backtracking control verbs, Relative backreferences, C<\K> escape, Vertical
+and horizontal whitespace, and linebreak
+
+=item C<say()>
+
+=item Lexical C<$_>
+
+=item The C<_> prototype
+
+=item UNITCHECK blocks
+
+=item New Pragma, C<mro>
+
+=item readdir() may return a "short filename" on Windows
+
+=item readpipe() is now overridable
+
+=item Default argument for readline()
+
+=item state() variables
+
+=item Stacked filetest operators
+
+=item UNIVERSAL::DOES()
+
+=item Formats
+
+=item Byte-order modifiers for pack() and unpack()
+
+=item C<no VERSION>
+
+=item C<chdir>, C<chmod> and C<chown> on filehandles
+
+=item OS groups
+
+=item Recursive sort subs
+
+=item Exceptions in constant folding
+
+=item Source filters in @INC
+
+=item New internal variables
+
+C<${^RE_DEBUG_FLAGS}>, C<${^CHILD_ERROR_NATIVE}>, C<${^RE_TRIE_MAXBUF}>,
+C<${^WIN32_SLOPPY_STAT}>
+
+=item Miscellaneous
+
+=item UCD 5.0.0
+
+=item MAD
+
+=item kill() on Windows
+
+=back
+
+=item Incompatible Changes
+
+=over 4
+
+=item Packing and UTF-8 strings
+
+=item Byte/character count feature in unpack()
+
+=item The C<$*> and C<$#> variables have been removed
+
+=item substr() lvalues are no longer fixed-length
+
+=item Parsing of C<-f _>
+
+=item C<:unique>
+
+=item Effect of pragmas in eval
+
+=item chdir FOO
+
+=item Handling of .pmc files
+
+=item $^V is now a C<version> object instead of a v-string
+
+=item @- and @+ in patterns
+
+=item $AUTOLOAD can now be tainted
+
+=item Tainting and printf
+
+=item undef and signal handlers
+
+=item strictures and dereferencing in defined()
+
+=item C<(?p{})> has been removed
+
+=item Pseudo-hashes have been removed
+
+=item Removal of the bytecode compiler and of perlcc
+
+=item Removal of the JPL
+
+=item Recursive inheritance detected earlier
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item Upgrading individual core modules
+
+=item Pragmata Changes
+
+C<feature>, C<mro>, Scoping of the C<sort> pragma, Scoping of C<bignum>,
+C<bigint>, C<bigrat>, C<base>, C<strict> and C<warnings>, C<version>,
+C<warnings>, C<less>
+
+=item New modules
+
+=item Selected Changes to Core Modules
+
+C<Attribute::Handlers>, C<B::Lint>, C<B>, C<Thread>
+
+=back
+
+=item Utility Changes
+
+perl -d, ptar, ptardiff, shasum, corelist, h2ph and h2xs, perlivp,
+find2perl, config_data, cpanp, cpan2dist, pod2html
+
+=item New Documentation
+
+=item Performance Enhancements
+
+=over 4
+
+=item In-place sorting
+
+=item Lexical array access
+
+=item XS-assisted SWASHGET
+
+=item Constant subroutines
+
+=item C<PERL_DONT_CREATE_GVSV>
+
+=item Weak references are cheaper
+
+=item sort() enhancements
+
+=item Memory optimisations
+
+=item UTF-8 cache optimisation
+
+=item Sloppy stat on Windows
+
+=item Regular expressions optimisations
+
+Engine de-recursivised, Single char char-classes treated as literals, Trie
+optimisation of literal string alternations, Aho-Corasick start-point
+optimisation
+
+=back
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item Configuration improvements
+
+C<-Dusesitecustomize>, Relocatable installations, strlcat() and strlcpy(),
+C<d_pseudofork> and C<d_printf_format_null>, Configure help
+
+=item Compilation improvements
+
+Parallel build, Borland's compilers support, Static build on Windows,
+ppport.h files, C++ compatibility, Support for Microsoft 64-bit compiler,
+Visual C++, Win32 builds
+
+=item Installation improvements
+
+Module auxiliary files
+
+=item New Or Improved Platforms
+
+=back
+
+=item Selected Bug Fixes
+
+strictures in regexp-eval blocks, Calling CORE::require(), Subscripts of
+slices, C<no warnings 'category'> works correctly with -w, threads
+improvements, chr() and negative values, PERL5SHELL and tainting, Using
+*FILE{IO}, Overloading and reblessing, Overloading and UTF-8, eval memory
+leaks fixed, Random device on Windows, PERLIO_DEBUG, PerlIO::scalar and
+read-only scalars, study() and UTF-8, Critical signals, @INC-hook fix,
+C<-t> switch fix, Duping UTF-8 filehandles, Localisation of hash elements
+
+=item New or Changed Diagnostics
+
+Use of uninitialized value, Deprecated use of my() in false conditional,
+!=~ should be !~, Newline in left-justified string, Too late for "-T"
+option, "%s" variable %s masks earlier declaration,
+readdir()/closedir()/etc. attempted on invalid dirhandle, Opening
+dirhandle/filehandle %s also as a file/directory, Use of -P is deprecated,
+v-string in use/require is non-portable, perl -V
+
+=item Changed Internals
+
+=over 4
+
+=item Reordering of SVt_* constants
+
+=item Elimination of SVt_PVBM
+
+=item New type SVt_BIND
+
+=item Removal of CPP symbols
+
+=item Less space is used by ops
+
+=item New parser
+
+=item Use of C<const>
+
+=item Mathoms
+
+=item C<AvFLAGS> has been removed
+
+=item C<av_*> changes
+
+=item $^H and %^H
+
+=item B:: modules inheritance changed
+
+=item Anonymous hash and array constructors
+
+=back
+
+=item Known Problems
+
+=over 4
+
+=item UTF-8 problems
+
+=back
+
+=item Platform Specific Problems
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl595delta - what is new for perl v5.9.5
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=over 4
+
+=item Tainting and printf
+
+=item undef and signal handlers
+
+=item strictures and array/hash dereferencing in defined()
+
+=item C<(?p{})> has been removed
+
+=item Pseudo-hashes have been removed
+
+=item Removal of the bytecode compiler and of perlcc
+
+=item Removal of the JPL
+
+=item Recursive inheritance detected earlier
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item Regular expressions
+
+Recursive Patterns, Named Capture Buffers, Possessive Quantifiers,
+Backtracking control verbs, Relative backreferences, C<\K> escape, Vertical
+and horizontal whitespace, and linebreak
+
+=item The C<_> prototype
+
+=item UNITCHECK blocks
+
+=item readpipe() is now overridable
+
+=item default argument for readline()
+
+=item UCD 5.0.0
+
+=item Smart match
+
+=item Implicit loading of C<feature>
+
+=back
+
+=item Modules and Pragmas
+
+=over 4
+
+=item New Pragma, C<mro>
+
+=item bignum, bigint, bigrat
+
+=item Math::BigInt/Math::BigFloat
+
+config(), import(), roundmode common, bpi(), bcos(), bsin(), batan(),
+batan2(), bmuladd(), bexp(), bnok(), from_hex(), from_oct(), and
+from_bin(), as_oct()
+
+=item New Core Modules
+
+=item Module changes
+
+C<assertions>, C<base>, C<strict> and C<warnings>, C<warnings>, C<less>,
+C<Attribute::Handlers>, C<B::Lint>, C<B>, C<Thread>
+
+=back
+
+=item Utility Changes
+
+=over 4
+
+=item C<cpanp>
+
+=item C<cpan2dist>
+
+=item C<pod2html>
+
+=back
+
+=item Documentation
+
+=over 4
+
+=item New manpage, perlunifaq
+
+=back
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item C++ compatibility
+
+=item Visual C++
+
+=item Static build on Win32
+
+=item win32 builds
+
+=item C<d_pseudofork> and C<d_printf_format_null>
+
+=item Help
+
+=item 64bit systems
+
+=item Ports
+
+=back
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=over 4
+
+=item Deprecations
+
+=back
+
+=item Changed Internals
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl594delta - what is new for perl v5.9.4
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=over 4
+
+=item chdir FOO
+
+=item Handling of pmc files
+
+=item @- and @+ in patterns
+
+=item $AUTOLOAD can now be tainted
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item state() variables
+
+=item UNIVERSAL::DOES()
+
+=item Exceptions in constant folding
+
+=item Source filters in @INC
+
+=item MAD
+
+=back
+
+=item Modules and Pragmas
+
+=over 4
+
+=item New Core Modules
+
+=back
+
+=item Utility Changes
+
+=over 4
+
+=item config_data
+
+=back
+
+=item Documentation
+
+=over 4
+
+=item New manpage, perlpragma
+
+=item New manpage, perlreguts
+
+=item New manpage, perlunitut
+
+=back
+
+=item Performance Enhancements
+
+=over 4
+
+=item Memory optimisations
+
+=item UTF-8 cache optimisation
+
+=item Regular expressions
+
+Engine de-recursivised, Single char char-classes treated as literals, Trie
+optimisation of literal string alternations, Aho-Corasick start-point
+optimisation
+
+=item Sloppy stat on Windows
+
+=back
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item Relocatable installations
+
+=item Ports
+
+=item Compilation improvements
+
+=item New probes
+
+=item Windows build improvements
+
+Building XS extensions, Support for 64-bit compiler
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item PERL5SHELL and tainting
+
+=item Using *FILE{IO}
+
+=item Overloading and reblessing
+
+=item Overloading and UTF-8
+
+=item eval memory leaks fixed
+
+=item Random device on Windows
+
+=back
+
+=item New or Changed Diagnostics
+
+State variable %s will be reinitialized
+
+=item Changed Internals
+
+=item Known Problems
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl593delta - what is new for perl v5.9.3
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=over 4
+
+=item Parsing of C<-f _>
+
+=item C<mkdir()>
+
+=item Magic goto and eval
+
+=item C<$#> has been removed
+
+=item C<:unique>
+
+=item Scoping of the C<sort> pragma
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item The C<feature> pragma
+
+=item Switch and Smart Match operator
+
+=item C<say()>
+
+=item C<CLONE_SKIP()>
+
+=item C<${^CHILD_ERROR_NATIVE}>
+
+=item Assertions
+
+=item Unicode Character Database 4.1.0
+
+=item C<no VERSION>
+
+=item Recursive sort subs
+
+=item Effect of pragmas in eval
+
+=item New B<-E> command-line switch
+
+=item C<chdir>, C<chmod> and C<chown> on filehandles
+
+=item OS groups
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Core Modules
+
+=back
+
+=item Utility Changes
+
+=over 4
+
+=item C<ptar>
+
+=item C<ptardiff>
+
+=item C<shasum>
+
+=item C<h2xs> enhancements
+
+=item C<perlivp> enhancements
+
+=back
+
+=item Documentation
+
+=over 4
+
+=item Perl Glossary
+
+=back
+
+=item Performance Enhancements
+
+=over 4
+
+=item XS-assisted SWASHGET
+
+=item Constant subroutines
+
+=item C<PERL_DONT_CREATE_GVSV>
+
+=item Weak references are cheaper
+
+=item sort() enhancements
+
+=back
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item Compilation improvements
+
+=item New Or Improved Platforms
+
+=item New probes
+
+=item Module auxiliary files
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item C<defined $$x>
+
+=item Calling CORE::require()
+
+=item Subscripts of slices
+
+=item Remove over-optimisation
+
+=item sprintf() fixes
+
+=item no warnings 'category' works correctly with -w
+
+=item Smaller fixes
+
+=item More Unicode Fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=over 4
+
+=item Attempt to set length of freed array
+
+=item Non-string passed as bitmask
+
+=item Search pattern not terminated or ternary operator parsed as search
+pattern
+
+=item "%s" variable %s masks earlier declaration
+
+=item readdir()/closedir()/etc. attempted on invalid dirhandle
+
+=back
+
+=item Changed Internals
+
+=over 4
+
+=item B:: modules inheritance changed
+
+=back
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl592delta - what is new for perl v5.9.2
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=over 4
+
+=item Packing and UTF-8 strings
+
+=item Miscellaneous
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item Malloc wrapping
+
+=item Unicode Character Database 4.0.1
+
+=item suidperl less insecure
+
+=item PERLIO_DEBUG
+
+=item Formats
+
+=item Unicode Character Classes
+
+=item Byte-order modifiers for pack() and unpack()
+
+=item Byte count feature in pack()
+
+=item New variables
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New modules
+
+=item Updated And Improved Modules and Pragmata
+
+B::Concise, Socket, Sys::Syslog, threads
+
+=back
+
+=item Utility Changes
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Known Problems
+
+=item Plans for the next release
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl591delta - what is new for perl v5.9.1
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=over 4
+
+=item substr() lvalues are no longer fixed-length
+
+=item The C<:unique> attribute is only meaningful for globals
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item Lexical C<$_>
+
+=item Tied hashes in scalar context
+
+=item Formats
+
+=item Stacked filetest operators
+
+=back
+
+=item Modules and Pragmata
+
+Benchmark, Carp, Exporter, FindBin, List::Util, threads::shared
+
+=item Utility Changes
+
+=item Documentation
+
+=item Performance Enhancements
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item UTF-8 bugs
+
+=item Threading bugs
+
+=item More bugs
+
+=back
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=over 4
+
+=item Reordering of SVt_* constants
+
+=item Removal of CPP symbols
+
+=item Less space is used by ops
+
+=item New parser
+
+=back
+
+=item Configuration and Building
+
+=item Known Problems
+
+=over 4
+
+=item Platform Specific Problems
+
+=back
+
+=item To-do for perl 5.10.0
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl590delta - what is new for perl v5.9.0
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=over 4
+
+=item Hash Randomisation
+
+=item UTF-8 On Filehandles No Longer Activated By Locale
+
+=item Single-number v-strings are no longer v-strings before "=>"
+
+=item (Win32) The -C Switch Has Been Repurposed
+
+=item (Win32) The /d Switch Of cmd.exe
+
+=item The C<$*> variable has been removed
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item Assertions
+
+=item Defined-or operators
+
+=item UTF-8 no longer default under UTF-8 locales
+
+=item Unsafe signals again available
+
+=item Tied Arrays with Negative Array Indices
+
+=item local ${$x}
+
+=item Unicode Character Database 4.0.0
+
+=item Miscellaneous Enhancements
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item Updated Modules And Pragmata
+
+base, B::Bytecode, B::Concise, B::Deparse, Benchmark, ByteLoader, bytes,
+CGI, charnames, CPAN, Data::Dumper, DB_File, Devel::PPPort, Digest::MD5,
+Encode, fields, libnet, Math::BigInt, MIME::Base64, NEXT, Net::Ping,
+PerlIO::scalar, podlators, Pod::LaTeX, PodParsers, Pod::Perldoc,
+Scalar::Util, Storable, strict, Term::ANSIcolor, Test::Harness, Test::More,
+Test::Simple, Text::Balanced, Time::HiRes, threads, threads::shared,
+Unicode::Collate, Unicode::Normalize, Win32::GetFolderPath,
+Win32::GetOSVersion
+
+=back
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item Platform-specific enhancements
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item Closures, eval and lexicals
+
+=item Generic fixes
+
+=item Platform-specific fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=over 4
+
+=item Changed "A thread exited while %d threads were running"
+
+=item Removed "Attempt to clear a restricted hash"
+
+=item New "Illegal declaration of anonymous subroutine"
+
+=item Changed "Invalid range "%s" in transliteration operator"
+
+=item New "Missing control char name in \c"
+
+=item New "Newline in left-justified string for %s"
+
+=item New "Possible precedence problem on bitwise %c operator"
+
+=item New "read() on %s filehandle %s"
+
+=item New "Tied variable freed while still in use"
+
+=item New "To%s: illegal mapping '%s'"
+
+=item New "Use of freed value in iteration"
+
+=back
+
+=item Changed Internals
+
+=item New Tests
+
+=item Known Problems
+
+=over 4
+
+=item Tied hashes in scalar context
+
+=item Net::Ping 450_service and 510_ping_udp failures
+
+=item B::C
+
+=back
+
+=item Platform Specific Problems
+
+=over 4
+
+=item EBCDIC Platforms
+
+=item Cygwin 1.5 problems
+
+=item HP-UX: HP cc warnings about sendfile and sendpath
+
+=item IRIX: t/uni/tr_7jis.t falsely failing
+
+=item Mac OS X: no usemymalloc
+
+=item Tru64: No threaded builds with GNU cc (gcc)
+
+=item Win32: sysopen, sysread, syswrite
+
+=back
+
+=item TODO
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl588delta - what is new for perl v5.8.8
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+=item Utility Changes
+
+=over 4
+
+=item C<h2xs> enhancements
+
+=item C<perlivp> enhancements
+
+=back
+
+=item New Documentation
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item no warnings 'category' works correctly with -w
+
+=item Remove over-optimisation
+
+=item sprintf() fixes
+
+=item Debugger and Unicode slowdown
+
+=item Smaller fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=over 4
+
+=item Attempt to set length of freed array
+
+=item Non-string passed as bitmask
+
+=item Search pattern not terminated or ternary operator parsed as search
+pattern
+
+=back
+
+=item Changed Internals
+
+=item Platform Specific Problems
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl589delta - what is new for perl v5.8.9
+
+=over 4
+
+=item DESCRIPTION
+
+=item Notice
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=over 4
+
+=item Unicode Character Database 5.1.0.
+
+=item stat and -X on directory handles
+
+=item Source filters in @INC
+
+=item Exceptions in constant folding
+
+=item C<no VERSION>
+
+=item Improved internal UTF-8 caching code
+
+=item Runtime relocatable installations
+
+=item New internal variables
+
+C<${^CHILD_ERROR_NATIVE}>, C<${^UTF8CACHE}>
+
+=item C<readpipe> is now overridable
+
+=item simple exception handling macros
+
+=item -D option enhancements
+
+=item XS-assisted SWASHGET
+
+=item Constant subroutines
+
+=back
+
+=item New Platforms
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules
+
+=item Updated Modules
+
+=back
+
+=item Utility Changes
+
+=over 4
+
+=item debugger upgraded to version 1.31
+
+=item F<perlthanks>
+
+=item F<perlbug>
+
+=item F<h2xs>
+
+=item F<h2ph>
+
+=back
+
+=item New Documentation
+
+=item Changes to Existing Documentation
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item Relocatable installations
+
+=item Configuration improvements
+
+=item Compilation improvements
+
+=item Installation improvements.
+
+=item Platform Specific Changes
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item Unicode
+
+=item PerlIO
+
+=item Magic
+
+=item Reblessing overloaded objects now works
+
+=item C<strict> now propagates correctly into string evals
+
+=item Other fixes
+
+=item Platform Specific Fixes
+
+=item Smaller fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=over 4
+
+=item panic: sv_chop %s
+
+=item Maximal count of pending signals (%s) exceeded
+
+=item panic: attempt to call %s in %s
+
+=item FETCHSIZE returned a negative value
+
+=item Can't upgrade %s (%d) to %d
+
+=item %s argument is not a HASH or ARRAY element or a subroutine
+
+=item Cannot make the non-overridable builtin %s fatal
+
+=item Unrecognized character '%s' in column %d
+
+=item Offset outside string
+
+=item Invalid escape in the specified encoding in regexp; marked by <--
+HERE in m/%s/
+
+=item Your machine doesn't support dump/undump.
+
+=back
+
+=item Changed Internals
+
+=over 4
+
+=item Macro cleanups
+
+=back
+
+=item New Tests
+
+ext/DynaLoader/t/DynaLoader.t, t/comp/fold.t, t/io/pvbm.t,
+t/lib/proxy_constant_subs.t, t/op/attrhand.t, t/op/dbm.t,
+t/op/inccode-tie.t, t/op/incfilter.t, t/op/kill0.t, t/op/qrstack.t,
+t/op/qr.t, t/op/regexp_qr_embed.t, t/op/regexp_qr.t, t/op/rxcode.t,
+t/op/studytied.t, t/op/substT.t, t/op/symbolcache.t, t/op/upgrade.t,
+t/mro/package_aliases.t, t/pod/twice.t, t/run/cloexec.t, t/uni/cache.t,
+t/uni/chr.t, t/uni/greek.t, t/uni/latin2.t, t/uni/overload.t, t/uni/tie.t
+
+=item Known Problems
+
+=item Platform Specific Notes
+
+=over 4
+
+=item Win32
+
+=item OS/2
+
+=item VMS
+
+=back
+
+=item Obituary
+
+=item Acknowledgements
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl587delta - what is new for perl v5.8.7
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=over 4
+
+=item Unicode Character Database 4.1.0
+
+=item suidperl less insecure
+
+=item Optional site customization script
+
+=item C<Config.pm> is now much smaller.
+
+=back
+
+=item Modules and Pragmata
+
+=item Utility Changes
+
+=over 4
+
+=item find2perl enhancements
+
+=back
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Known Problems
+
+=item Platform Specific Problems
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl586delta - what is new for perl v5.8.6
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+=item Utility Changes
+
+=item Performance Enhancements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item New Tests
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl585delta - what is new for perl v5.8.5
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+=item Utility Changes
+
+=over 4
+
+=item Perl's debugger
+
+=item h2ph
+
+=back
+
+=item Installation and Configuration Improvements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Known Problems
+
+=item Platform Specific Problems
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl584delta - what is new for perl v5.8.4
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=over 4
+
+=item Malloc wrapping
+
+=item Unicode Character Database 4.0.1
+
+=item suidperl less insecure
+
+=item format
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item Updated modules
+
+Attribute::Handlers, B, Benchmark, CGI, Carp, Cwd, Exporter, File::Find,
+IO, IPC::Open3, Local::Maketext, Math::BigFloat, Math::BigInt,
+Math::BigRat, MIME::Base64, ODBM_File, POSIX, Shell, Socket, Storable,
+Switch, Sys::Syslog, Term::ANSIColor, Time::HiRes, Unicode::UCD, Win32,
+base, open, threads, utf8
+
+=back
+
+=item Performance Enhancements
+
+=item Utility Changes
+
+=item Installation and Configuration Improvements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Future Directions
+
+=item Platform Specific Problems
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl583delta - what is new for perl v5.8.3
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+CGI, Cwd, Digest, Digest::MD5, Encode, File::Spec, FindBin, List::Util,
+Math::BigInt, PodParser, Pod::Perldoc, POSIX, Unicode::Collate,
+Unicode::Normalize, Test::Harness, threads::shared
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Installation and Configuration Improvements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Configuration and Building
+
+=item Platform Specific Problems
+
+=item Known Problems
+
+=item Future Directions
+
+=item Obituary
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl582delta - what is new for perl v5.8.2
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=over 4
+
+=item Hash Randomisation
+
+=item Threading
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item Updated Modules And Pragmata
+
+Devel::PPPort, Digest::MD5, I18N::LangTags, libnet, MIME::Base64,
+Pod::Perldoc, strict, Tie::Hash, Time::HiRes, Unicode::Collate,
+Unicode::Normalize, UNIVERSAL
+
+=back
+
+=item Selected Bug Fixes
+
+=item Changed Internals
+
+=item Platform Specific Problems
+
+=item Future Directions
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl581delta - what is new for perl v5.8.1
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=over 4
+
+=item Hash Randomisation
+
+=item UTF-8 On Filehandles No Longer Activated By Locale
+
+=item Single-number v-strings are no longer v-strings before "=>"
+
+=item (Win32) The -C Switch Has Been Repurposed
+
+=item (Win32) The /d Switch Of cmd.exe
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item UTF-8 no longer default under UTF-8 locales
+
+=item Unsafe signals again available
+
+=item Tied Arrays with Negative Array Indices
+
+=item local ${$x}
+
+=item Unicode Character Database 4.0.0
+
+=item Deprecation Warnings
+
+=item Miscellaneous Enhancements
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item Updated Modules And Pragmata
+
+base, B::Bytecode, B::Concise, B::Deparse, Benchmark, ByteLoader, bytes,
+CGI, charnames, CPAN, Data::Dumper, DB_File, Devel::PPPort, Digest::MD5,
+Encode, fields, libnet, Math::BigInt, MIME::Base64, NEXT, Net::Ping,
+PerlIO::scalar, podlators, Pod::LaTeX, PodParsers, Pod::Perldoc,
+Scalar::Util, Storable, strict, Term::ANSIcolor, Test::Harness, Test::More,
+Test::Simple, Text::Balanced, Time::HiRes, threads, threads::shared,
+Unicode::Collate, Unicode::Normalize, Win32::GetFolderPath,
+Win32::GetOSVersion
+
+=back
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item Platform-specific enhancements
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item Closures, eval and lexicals
+
+=item Generic fixes
+
+=item Platform-specific fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=over 4
+
+=item Changed "A thread exited while %d threads were running"
+
+=item Removed "Attempt to clear a restricted hash"
+
+=item New "Illegal declaration of anonymous subroutine"
+
+=item Changed "Invalid range "%s" in transliteration operator"
+
+=item New "Missing control char name in \c"
+
+=item New "Newline in left-justified string for %s"
+
+=item New "Possible precedence problem on bitwise %c operator"
+
+=item New "Pseudo-hashes are deprecated"
+
+=item New "read() on %s filehandle %s"
+
+=item New "5.005 threads are deprecated"
+
+=item New "Tied variable freed while still in use"
+
+=item New "To%s: illegal mapping '%s'"
+
+=item New "Use of freed value in iteration"
+
+=back
+
+=item Changed Internals
+
+=item New Tests
+
+=item Known Problems
+
+=over 4
+
+=item Tied hashes in scalar context
+
+=item Net::Ping 450_service and 510_ping_udp failures
+
+=item B::C
+
+=back
+
+=item Platform Specific Problems
+
+=over 4
+
+=item EBCDIC Platforms
+
+=item Cygwin 1.5 problems
+
+=item HP-UX: HP cc warnings about sendfile and sendpath
+
+=item IRIX: t/uni/tr_7jis.t falsely failing
+
+=item Mac OS X: no usemymalloc
+
+=item Tru64: No threaded builds with GNU cc (gcc)
+
+=item Win32: sysopen, sysread, syswrite
+
+=back
+
+=item Future Directions
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl58delta - what is new for perl v5.8.0
+
+=over 4
+
+=item DESCRIPTION
+
+=item Highlights In 5.8.0
+
+=item Incompatible Changes
+
+=over 4
+
+=item Binary Incompatibility
+
+=item 64-bit platforms and malloc
+
+=item AIX Dynaloading
+
+=item Attributes for C<my> variables now handled at run-time
+
+=item Socket Extension Dynamic in VMS
+
+=item IEEE-format Floating Point Default on OpenVMS Alpha
+
+=item New Unicode Semantics (no more C<use utf8>, almost)
+
+=item New Unicode Properties
+
+=item REF(...) Instead Of SCALAR(...)
+
+=item pack/unpack D/F recycled
+
+=item glob() now returns filenames in alphabetical order
+
+=item Deprecations
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item Unicode Overhaul
+
+=item PerlIO is Now The Default
+
+=item ithreads
+
+=item Restricted Hashes
+
+=item Safe Signals
+
+=item Understanding of Numbers
+
+=item Arrays now always interpolate into double-quoted strings [561]
+
+=item Miscellaneous Changes
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules and Pragmata
+
+=item Updated And Improved Modules and Pragmata
+
+=back
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item Generic Improvements
+
+=item New Or Improved Platforms
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item Platform Specific Changes and Fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Security Vulnerability Closed [561]
+
+=item New Tests
+
+=item Known Problems
+
+=over 4
+
+=item The Compiler Suite Is Still Very Experimental
+
+=item Localising Tied Arrays and Hashes Is Broken
+
+=item Building Extensions Can Fail Because Of Largefiles
+
+=item Modifying $_ Inside for(..)
+
+=item mod_perl 1.26 Doesn't Build With Threaded Perl
+
+=item lib/ftmp-security tests warn 'system possibly insecure'
+
+=item libwww-perl (LWP) fails base/date #51
+
+=item PDL failing some tests
+
+=item Perl_get_sv
+
+=item Self-tying Problems
+
+=item ext/threads/t/libc
+
+=item Failure of Thread (5.005-style) tests
+
+=item Timing problems
+
+=item Tied/Magical Array/Hash Elements Do Not Autovivify
+
+=item Unicode in package/class and subroutine names does not work
+
+=back
+
+=item Platform Specific Problems
+
+=over 4
+
+=item AIX
+
+=item Alpha systems with old gccs fail several tests
+
+=item AmigaOS
+
+=item BeOS
+
+=item Cygwin "unable to remap"
+
+=item Cygwin ndbm tests fail on FAT
+
+=item DJGPP Failures
+
+=item FreeBSD built with ithreads coredumps reading large directories
+
+=item FreeBSD Failing locale Test 117 For ISO 8859-15 Locales
+
+=item IRIX fails ext/List/Util/t/shuffle.t or Digest::MD5
+
+=item HP-UX lib/posix Subtest 9 Fails When LP64-Configured
+
+=item Linux with glibc 2.2.5 fails t/op/int subtest #6 with -Duse64bitint
+
+=item Linux With Sfio Fails op/misc Test 48
+
+=item Mac OS X
+
+=item Mac OS X dyld undefined symbols
+
+=item OS/2 Test Failures
+
+=item op/sprintf tests 91, 129, and 130
+
+=item SCO
+
+=item Solaris 2.5
+
+=item Solaris x86 Fails Tests With -Duse64bitint
+
+=item SUPER-UX (NEC SX)
+
+=item Term::ReadKey not working on Win32
+
+=item UNICOS/mk
+
+=item UTS
+
+=item VOS (Stratus)
+
+=item VMS
+
+=item Win32
+
+=item XML::Parser not working
+
+=item z/OS (OS/390)
+
+=item Unicode Support on EBCDIC Still Spotty
+
+=item Seen In Perl 5.7 But Gone Now
+
+=back
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl573delta - what's new for perl v5.7.3
+
+=over 4
+
+=item DESCRIPTION
+
+=item Changes
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl572delta - what's new for perl v5.7.2
+
+=over 4
+
+=item DESCRIPTION
+
+=item Security Vulnerability Closed
+
+=item Incompatible Changes
+
+=over 4
+
+=item 64-bit platforms and malloc
+
+=item AIX Dynaloading
+
+=item Socket Extension Dynamic in VMS
+
+=item Different Definition of the Unicode Character Classes \p{In...}
+
+=item Deprecations
+
+=back
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules and Distributions
+
+=item Updated And Improved Modules and Pragmata
+
+=back
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item New Or Improved Platforms
+
+=item Generic Improvements
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item Platform Specific Changes and Fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=item Source Code Enhancements
+
+=over 4
+
+=item MAGIC constants
+
+=item Better commented code
+
+=item Regex pre-/post-compilation items matched up
+
+=item gcc -Wall
+
+=back
+
+=item New Tests
+
+=item Known Problems
+
+=over 4
+
+=item AIX
+
+=item Amiga Perl Invoking Mystery
+
+=item lib/ftmp-security tests warn 'system possibly insecure'
+
+=item Cygwin intermittent failures of lib/Memoize/t/expire_file 11 and 12
+
+=item HP-UX lib/io_multihomed Fails When LP64-Configured
+
+=item HP-UX lib/posix Subtest 9 Fails When LP64-Configured
+
+=item Linux With Sfio Fails op/misc Test 48
+
+=item OS/390
+
+=item op/sprintf tests 129 and 130
+
+=item Failure of Thread tests
+
+=item UNICOS
+
+=item UTS
+
+=item VMS
+
+=item Win32
+
+=item Localising a Tied Variable Leaks Memory
+
+=item Self-tying of Arrays and Hashes Is Forbidden
+
+=item Variable Attributes are not Currently Usable for Tieing
+
+=item Building Extensions Can Fail Because Of Largefiles
+
+=item The Compiler Suite Is Still Experimental
+
+=item The Long Double Support is Still Experimental
+
+=back
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl571delta - what's new for perl v5.7.1
+
+=over 4
+
+=item DESCRIPTION
+
+=item Security Vulnerability Closed
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=over 4
+
+=item AUTOLOAD Is Now Lvaluable
+
+=item PerlIO is Now The Default
+
+=item Signals Are Now Safe
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules
+
+=item Updated And Improved Modules and Pragmata
+
+=back
+
+=item Performance Enhancements
+
+=item Utility Changes
+
+=item New Documentation
+
+=over 4
+
+=item perlclib
+
+=item perliol
+
+=item README.aix
+
+=item README.bs2000
+
+=item README.macos
+
+=item README.mpeix
+
+=item README.solaris
+
+=item README.vos
+
+=item Porting/repository.pod
+
+=back
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item New Or Improved Platforms
+
+=item Generic Improvements
+
+d_cmsghdr, d_fcntl_can_lock, d_fsync, d_getitimer, d_getpagsz, d_msghdr_s,
+need_va_copy, d_readv, d_recvmsg, d_sendmsg, sig_size, d_sockatmark,
+d_strtoq, d_u32align, d_ualarm, d_usleep
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item Platform Specific Changes and Fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item New Tests
+
+=item Known Problems
+
+=over 4
+
+=item AIX vac 5.0.0.0 May Produce Buggy Code For Perl
+
+=item lib/ftmp-security tests warn 'system possibly insecure'
+
+=item lib/io_multihomed Fails In LP64-Configured HP-UX
+
+=item Test lib/posix Subtest 9 Fails In LP64-Configured HP-UX
+
+=item lib/b test 19
+
+=item Linux With Sfio Fails op/misc Test 48
+
+=item sigaction test 13 in VMS
+
+=item sprintf tests 129 and 130
+
+=item Failure of Thread tests
+
+=item Localising a Tied Variable Leaks Memory
+
+=item Self-tying of Arrays and Hashes Is Forbidden
+
+=item Building Extensions Can Fail Because Of Largefiles
+
+=item The Compiler Suite Is Still Experimental
+
+=back
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl570delta - what's new for perl v5.7.0
+
+=over 4
+
+=item DESCRIPTION
+
+=item Security Vulnerability Closed
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules
+
+=item Updated And Improved Modules and Pragmata
+
+=back
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item Generic Improvements
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item Platform Specific Changes and Fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Known Problems
+
+=over 4
+
+=item Unicode Support Still Far From Perfect
+
+=item EBCDIC Still A Lost Platform
+
+=item Building Extensions Can Fail Because Of Largefiles
+
+=item ftmp-security tests warn 'system possibly insecure'
+
+=item Test lib/posix Subtest 9 Fails In LP64-Configured HP-UX
+
+=item Long Doubles Still Don't Work In Solaris
+
+=item Linux With Sfio Fails op/misc Test 48
+
+=item Storable tests fail in some platforms
+
+=item Threads Are Still Experimental
+
+=item The Compiler Suite Is Still Experimental
+
+=back
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl561delta - what's new for perl v5.6.x
+
+=over 4
+
+=item DESCRIPTION
+
+=item Summary of changes between 5.6.0 and 5.6.1
+
+=over 4
+
+=item Security Issues
+
+=item Core bug fixes
+
+C<UNIVERSAL::isa()>, Memory leaks, Numeric conversions, qw(a\\b), caller(),
+Bugs in regular expressions, "slurp" mode, Autovivification of symbolic
+references to special variables, Lexical warnings, Spurious warnings and
+errors, glob(), Tainting, sort(), #line directives, Subroutine prototypes,
+map(), Debugger, PERL5OPT, chop(), Unicode support, 64-bit support,
+Compiler, Lvalue subroutines, IO::Socket, File::Find, xsubpp, C<no
+Module;>, Tests
+
+=item Core features
+
+=item Configuration issues
+
+=item Documentation
+
+=item Bundled modules
+
+B::Concise, File::Temp, Pod::LaTeX, Pod::Text::Overstrike, CGI, CPAN,
+Class::Struct, DB_File, Devel::Peek, File::Find, Getopt::Long, IO::Poll,
+IPC::Open3, Math::BigFloat, Math::Complex, Net::Ping, Opcode, Pod::Parser,
+Pod::Text, SDBM_File, Sys::Syslog, Tie::RefHash, Tie::SubstrHash
+
+=item Platform-specific improvements
+
+NCR MP-RAS, NonStop-UX
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item Interpreter cloning, threads, and concurrency
+
+=item Lexically scoped warning categories
+
+=item Unicode and UTF-8 support
+
+=item Support for interpolating named characters
+
+=item "our" declarations
+
+=item Support for strings represented as a vector of ordinals
+
+=item Improved Perl version numbering system
+
+=item New syntax for declaring subroutine attributes
+
+=item File and directory handles can be autovivified
+
+=item open() with more than two arguments
+
+=item 64-bit support
+
+=item Large file support
+
+=item Long doubles
+
+=item "more bits"
+
+=item Enhanced support for sort() subroutines
+
+=item C<sort $coderef @foo> allowed
+
+=item File globbing implemented internally
+
+=item Support for CHECK blocks
+
+=item POSIX character class syntax [: :] supported
+
+=item Better pseudo-random number generator
+
+=item Improved C<qw//> operator
+
+=item Better worst-case behavior of hashes
+
+=item pack() format 'Z' supported
+
+=item pack() format modifier '!' supported
+
+=item pack() and unpack() support counted strings
+
+=item Comments in pack() templates
+
+=item Weak references
+
+=item Binary numbers supported
+
+=item Lvalue subroutines
+
+=item Some arrows may be omitted in calls through references
+
+=item Boolean assignment operators are legal lvalues
+
+=item exists() is supported on subroutine names
+
+=item exists() and delete() are supported on array elements
+
+=item Pseudo-hashes work better
+
+=item Automatic flushing of output buffers
+
+=item Better diagnostics on meaningless filehandle operations
+
+=item Where possible, buffered data discarded from duped input filehandle
+
+=item eof() has the same old magic as <>
+
+=item binmode() can be used to set :crlf and :raw modes
+
+=item C<-T> filetest recognizes UTF-8 encoded files as "text"
+
+=item system(), backticks and pipe open now reflect exec() failure
+
+=item Improved diagnostics
+
+=item Diagnostics follow STDERR
+
+=item More consistent close-on-exec behavior
+
+=item syswrite() ease-of-use
+
+=item Better syntax checks on parenthesized unary operators
+
+=item Bit operators support full native integer width
+
+=item Improved security features
+
+=item More functional bareword prototype (*)
+
+=item C<require> and C<do> may be overridden
+
+=item $^X variables may now have names longer than one character
+
+=item New variable $^C reflects C<-c> switch
+
+=item New variable $^V contains Perl version as a string
+
+=item Optional Y2K warnings
+
+=item Arrays now always interpolate into double-quoted strings
+
+=item @- and @+ provide starting/ending offsets of regex submatches
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item Modules
+
+attributes, B, Benchmark, ByteLoader, constant, charnames, Data::Dumper,
+DB, DB_File, Devel::DProf, Devel::Peek, Dumpvalue, DynaLoader, English,
+Env, Fcntl, File::Compare, File::Find, File::Glob, File::Spec,
+File::Spec::Functions, Getopt::Long, IO, JPL, lib, Math::BigInt,
+Math::Complex, Math::Trig, Pod::Parser, Pod::InputObjects, Pod::Checker,
+podchecker, Pod::ParseUtils, Pod::Find, Pod::Select, podselect, Pod::Usage,
+pod2usage, Pod::Text and Pod::Man, SDBM_File, Sys::Syslog, Sys::Hostname,
+Term::ANSIColor, Time::Local, Win32, XSLoader, DBM Filters
+
+=item Pragmata
+
+=back
+
+=item Utility Changes
+
+=over 4
+
+=item dprofpp
+
+=item find2perl
+
+=item h2xs
+
+=item perlcc
+
+=item perldoc
+
+=item The Perl Debugger
+
+=back
+
+=item Improved Documentation
+
+perlapi.pod, perlboot.pod, perlcompile.pod, perldbmfilter.pod,
+perldebug.pod, perldebguts.pod, perlfork.pod, perlfilter.pod, perlhack.pod,
+perlintern.pod, perllexwarn.pod, perlnumber.pod, perlopentut.pod,
+perlreftut.pod, perltootc.pod, perltodo.pod, perlunicode.pod
+
+=item Performance enhancements
+
+=over 4
+
+=item Simple sort() using { $a <=> $b } and the like are optimized
+
+=item Optimized assignments to lexical variables
+
+=item Faster subroutine calls
+
+=item delete(), each(), values() and hash iteration are faster
+
+=back
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item -Dusethreads means something different
+
+=item New Configure flags
+
+=item Threadedness and 64-bitness now more daring
+
+=item Long Doubles
+
+=item -Dusemorebits
+
+=item -Duselargefiles
+
+=item installusrbinperl
+
+=item SOCKS support
+
+=item C<-A> flag
+
+=item Enhanced Installation Directories
+
+=item gcc automatically tried if 'cc' does not seem to be working
+
+=back
+
+=item Platform specific changes
+
+=over 4
+
+=item Supported platforms
+
+=item DOS
+
+=item OS390 (OpenEdition MVS)
+
+=item VMS
+
+=item Win32
+
+=back
+
+=item Significant bug fixes
+
+=over 4
+
+=item <HANDLE> on empty files
+
+=item C<eval '...'> improvements
+
+=item All compilation errors are true errors
+
+=item Implicitly closed filehandles are safer
+
+=item Behavior of list slices is more consistent
+
+=item C<(\$)> prototype and C<$foo{a}>
+
+=item C<goto &sub> and AUTOLOAD
+
+=item C<-bareword> allowed under C<use integer>
+
+=item Failures in DESTROY()
+
+=item Locale bugs fixed
+
+=item Memory leaks
+
+=item Spurious subroutine stubs after failed subroutine calls
+
+=item Taint failures under C<-U>
+
+=item END blocks and the C<-c> switch
+
+=item Potential to leak DATA filehandles
+
+=back
+
+=item New or Changed Diagnostics
+
+"%s" variable %s masks earlier declaration in same %s, "my sub" not yet
+implemented, "our" variable %s redeclared, '!' allowed only after types %s,
+/ cannot take a count, / must be followed by a, A or Z, / must be followed
+by a*, A* or Z*, / must follow a numeric type, /%s/: Unrecognized escape
+\\%c passed through, /%s/: Unrecognized escape \\%c in character class
+passed through, /%s/ should probably be written as "%s", %s() called too
+early to check prototype, %s argument is not a HASH or ARRAY element, %s
+argument is not a HASH or ARRAY element or slice, %s argument is not a
+subroutine name, %s package attribute may clash with future reserved word:
+%s, (in cleanup) %s, <> should be quotes, Attempt to join self, Bad evalled
+substitution pattern, Bad realloc() ignored, Bareword found in conditional,
+Binary number > 0b11111111111111111111111111111111 non-portable, Bit vector
+size > 32 non-portable, Buffer overflow in prime_env_iter: %s, Can't check
+filesystem of script "%s", Can't declare class for non-scalar %s in "%s",
+Can't declare %s in "%s", Can't ignore signal CHLD, forcing to default,
+Can't modify non-lvalue subroutine call, Can't read CRTL environ, Can't
+remove %s: %s, skipping file, Can't return %s from lvalue subroutine, Can't
+weaken a nonreference, Character class [:%s:] unknown, Character class
+syntax [%s] belongs inside character classes, Constant is not %s reference,
+constant(%s): %s, CORE::%s is not a keyword, defined(@array) is deprecated,
+defined(%hash) is deprecated, Did not produce a valid header, (Did you mean
+"local" instead of "our"?), Document contains no data, entering effective
+%s failed, false [] range "%s" in regexp, Filehandle %s opened only for
+output, flock() on closed filehandle %s, Global symbol "%s" requires
+explicit package name, Hexadecimal number > 0xffffffff non-portable,
+Ill-formed CRTL environ value "%s", Ill-formed message in prime_env_iter:
+|%s|, Illegal binary digit %s, Illegal binary digit %s ignored, Illegal
+number of bits in vec, Integer overflow in %s number, Invalid %s attribute:
+%s, Invalid %s attributes: %s, invalid [] range "%s" in regexp, Invalid
+separator character %s in attribute list, Invalid separator character %s in
+subroutine attribute list, leaving effective %s failed, Lvalue subs
+returning %s not implemented yet, Method %s not permitted, Missing
+%sbrace%s on \N{}, Missing command in piped open, Missing name in "my sub",
+No %s specified for -%c, No package name allowed for variable %s in "our",
+No space allowed after -%c, no UTC offset information; assuming local time
+is UTC, Octal number > 037777777777 non-portable, panic: del_backref,
+panic: kid popen errno read, panic: magic_killbackrefs, Parentheses missing
+around "%s" list, Possible unintended interpolation of %s in string,
+Possible Y2K bug: %s, pragma "attrs" is deprecated, use "sub NAME : ATTRS"
+instead, Premature end of script headers, Repeat count in pack overflows,
+Repeat count in unpack overflows, realloc() of freed memory ignored,
+Reference is already weak, setpgrp can't take arguments, Strange *+?{} on
+zero-length expression, switching effective %s is not implemented, This
+Perl can't reset CRTL environ elements (%s), This Perl can't set CRTL
+environ elements (%s=%s), Too late to run %s block, Unknown open() mode
+'%s', Unknown process %x sent message to prime_env_iter: %s, Unrecognized
+escape \\%c passed through, Unterminated attribute parameter in attribute
+list, Unterminated attribute list, Unterminated attribute parameter in
+subroutine attribute list, Unterminated subroutine attribute list, Value of
+CLI symbol "%s" too long, Version number must be a constant number
+
+=item New tests
+
+=item Incompatible Changes
+
+=over 4
+
+=item Perl Source Incompatibilities
+
+CHECK is a new keyword, Treatment of list slices of undef has changed,
+Format of $English::PERL_VERSION is different, Literals of the form
+C<1.2.3> parse differently, Possibly changed pseudo-random number
+generator, Hashing function for hash keys has changed, C<undef> fails on
+read only values, Close-on-exec bit may be set on pipe and socket handles,
+Writing C<"$$1"> to mean C<"${$}1"> is unsupported, delete(), each(),
+values() and C<\(%h)>, vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS,
+Text of some diagnostic output has changed, C<%@> has been removed,
+Parenthesized not() behaves like a list operator, Semantics of bareword
+prototype C<(*)> have changed, Semantics of bit operators may have changed
+on 64-bit platforms, More builtins taint their results
+
+=item C Source Incompatibilities
+
+C<PERL_POLLUTE>, C<PERL_IMPLICIT_CONTEXT>, C<PERL_POLLUTE_MALLOC>
+
+=item Compatible C Source API Changes
+
+C<PATCHLEVEL> is now C<PERL_VERSION>
+
+=item Binary Incompatibilities
+
+=back
+
+=item Known Problems
+
+=over 4
+
+=item Localizing a tied hash element may leak memory
+
+=item Known test failures
+
+=item EBCDIC platforms not fully supported
+
+=item UNICOS/mk CC failures during Configure run
+
+=item Arrow operator and arrays
+
+=item Experimental features
+
+Threads, Unicode, 64-bit support, Lvalue subroutines, Weak references, The
+pseudo-hash data type, The Compiler suite, Internal implementation of file
+globbing, The DB module, The regular expression code constructs:
+
+=back
+
+=item Obsolete Diagnostics
+
+Character class syntax [: :] is reserved for future extensions, Ill-formed
+logical name |%s| in prime_env_iter, In string, @%s now must be written as
+\@%s, Probable precedence problem on %s, regexp too big, Use of "$$<digit>"
+to mean "${$}<digit>" is deprecated
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl56delta - what's new for perl v5.6.0
+
+=over 4
+
+=item DESCRIPTION
+
+=item Core Enhancements
+
+=over 4
+
+=item Interpreter cloning, threads, and concurrency
+
+=item Lexically scoped warning categories
+
+=item Unicode and UTF-8 support
+
+=item Support for interpolating named characters
+
+=item "our" declarations
+
+=item Support for strings represented as a vector of ordinals
+
+=item Improved Perl version numbering system
+
+=item New syntax for declaring subroutine attributes
+
+=item File and directory handles can be autovivified
+
+=item open() with more than two arguments
+
+=item 64-bit support
+
+=item Large file support
+
+=item Long doubles
+
+=item "more bits"
+
+=item Enhanced support for sort() subroutines
+
+=item C<sort $coderef @foo> allowed
+
+=item File globbing implemented internally
+
+=item Support for CHECK blocks
+
+=item POSIX character class syntax [: :] supported
+
+=item Better pseudo-random number generator
+
+=item Improved C<qw//> operator
+
+=item Better worst-case behavior of hashes
+
+=item pack() format 'Z' supported
+
+=item pack() format modifier '!' supported
+
+=item pack() and unpack() support counted strings
+
+=item Comments in pack() templates
+
+=item Weak references
+
+=item Binary numbers supported
+
+=item Lvalue subroutines
+
+=item Some arrows may be omitted in calls through references
+
+=item Boolean assignment operators are legal lvalues
+
+=item exists() is supported on subroutine names
+
+=item exists() and delete() are supported on array elements
+
+=item Pseudo-hashes work better
+
+=item Automatic flushing of output buffers
+
+=item Better diagnostics on meaningless filehandle operations
+
+=item Where possible, buffered data discarded from duped input filehandle
+
+=item eof() has the same old magic as <>
+
+=item binmode() can be used to set :crlf and :raw modes
+
+=item C<-T> filetest recognizes UTF-8 encoded files as "text"
+
+=item system(), backticks and pipe open now reflect exec() failure
+
+=item Improved diagnostics
+
+=item Diagnostics follow STDERR
+
+=item More consistent close-on-exec behavior
+
+=item syswrite() ease-of-use
+
+=item Better syntax checks on parenthesized unary operators
+
+=item Bit operators support full native integer width
+
+=item Improved security features
+
+=item More functional bareword prototype (*)
+
+=item C<require> and C<do> may be overridden
+
+=item $^X variables may now have names longer than one character
+
+=item New variable $^C reflects C<-c> switch
+
+=item New variable $^V contains Perl version as a string
+
+=item Optional Y2K warnings
+
+=item Arrays now always interpolate into double-quoted strings
+
+=item @- and @+ provide starting/ending offsets of regex matches
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item Modules
+
+attributes, B, Benchmark, ByteLoader, constant, charnames, Data::Dumper,
+DB, DB_File, Devel::DProf, Devel::Peek, Dumpvalue, DynaLoader, English,
+Env, Fcntl, File::Compare, File::Find, File::Glob, File::Spec,
+File::Spec::Functions, Getopt::Long, IO, JPL, lib, Math::BigInt,
+Math::Complex, Math::Trig, Pod::Parser, Pod::InputObjects, Pod::Checker,
+podchecker, Pod::ParseUtils, Pod::Find, Pod::Select, podselect, Pod::Usage,
+pod2usage, Pod::Text and Pod::Man, SDBM_File, Sys::Syslog, Sys::Hostname,
+Term::ANSIColor, Time::Local, Win32, XSLoader, DBM Filters
+
+=item Pragmata
+
+=back
+
+=item Utility Changes
+
+=over 4
+
+=item dprofpp
+
+=item find2perl
+
+=item h2xs
+
+=item perlcc
+
+=item perldoc
+
+=item The Perl Debugger
+
+=back
+
+=item Improved Documentation
+
+perlapi.pod, perlboot.pod, perlcompile.pod, perldbmfilter.pod,
+perldebug.pod, perldebguts.pod, perlfork.pod, perlfilter.pod, perlhack.pod,
+perlintern.pod, perllexwarn.pod, perlnumber.pod, perlopentut.pod,
+perlreftut.pod, perltootc.pod, perltodo.pod, perlunicode.pod
+
+=item Performance enhancements
+
+=over 4
+
+=item Simple sort() using { $a <=> $b } and the like are optimized
+
+=item Optimized assignments to lexical variables
+
+=item Faster subroutine calls
+
+=item delete(), each(), values() and hash iteration are faster
+
+=back
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item -Dusethreads means something different
+
+=item New Configure flags
+
+=item Threadedness and 64-bitness now more daring
+
+=item Long Doubles
+
+=item -Dusemorebits
+
+=item -Duselargefiles
+
+=item installusrbinperl
+
+=item SOCKS support
+
+=item C<-A> flag
+
+=item Enhanced Installation Directories
+
+=back
+
+=item Platform specific changes
+
+=over 4
+
+=item Supported platforms
+
+=item DOS
+
+=item OS390 (OpenEdition MVS)
+
+=item VMS
+
+=item Win32
+
+=back
+
+=item Significant bug fixes
+
+=over 4
+
+=item <HANDLE> on empty files
+
+=item C<eval '...'> improvements
+
+=item All compilation errors are true errors
+
+=item Implicitly closed filehandles are safer
+
+=item Behavior of list slices is more consistent
+
+=item C<(\$)> prototype and C<$foo{a}>
+
+=item C<goto &sub> and AUTOLOAD
+
+=item C<-bareword> allowed under C<use integer>
+
+=item Failures in DESTROY()
+
+=item Locale bugs fixed
+
+=item Memory leaks
+
+=item Spurious subroutine stubs after failed subroutine calls
+
+=item Taint failures under C<-U>
+
+=item END blocks and the C<-c> switch
+
+=item Potential to leak DATA filehandles
+
+=back
+
+=item New or Changed Diagnostics
+
+"%s" variable %s masks earlier declaration in same %s, "my sub" not yet
+implemented, "our" variable %s redeclared, '!' allowed only after types %s,
+/ cannot take a count, / must be followed by a, A or Z, / must be followed
+by a*, A* or Z*, / must follow a numeric type, /%s/: Unrecognized escape
+\\%c passed through, /%s/: Unrecognized escape \\%c in character class
+passed through, /%s/ should probably be written as "%s", %s() called too
+early to check prototype, %s argument is not a HASH or ARRAY element, %s
+argument is not a HASH or ARRAY element or slice, %s argument is not a
+subroutine name, %s package attribute may clash with future reserved word:
+%s, (in cleanup) %s, <> should be quotes, Attempt to join self, Bad evalled
+substitution pattern, Bad realloc() ignored, Bareword found in conditional,
+Binary number > 0b11111111111111111111111111111111 non-portable, Bit vector
+size > 32 non-portable, Buffer overflow in prime_env_iter: %s, Can't check
+filesystem of script "%s", Can't declare class for non-scalar %s in "%s",
+Can't declare %s in "%s", Can't ignore signal CHLD, forcing to default,
+Can't modify non-lvalue subroutine call, Can't read CRTL environ, Can't
+remove %s: %s, skipping file, Can't return %s from lvalue subroutine, Can't
+weaken a nonreference, Character class [:%s:] unknown, Character class
+syntax [%s] belongs inside character classes, Constant is not %s reference,
+constant(%s): %s, CORE::%s is not a keyword, defined(@array) is deprecated,
+defined(%hash) is deprecated, Did not produce a valid header, (Did you mean
+"local" instead of "our"?), Document contains no data, entering effective
+%s failed, false [] range "%s" in regexp, Filehandle %s opened only for
+output, flock() on closed filehandle %s, Global symbol "%s" requires
+explicit package name, Hexadecimal number > 0xffffffff non-portable,
+Ill-formed CRTL environ value "%s", Ill-formed message in prime_env_iter:
+|%s|, Illegal binary digit %s, Illegal binary digit %s ignored, Illegal
+number of bits in vec, Integer overflow in %s number, Invalid %s attribute:
+%s, Invalid %s attributes: %s, invalid [] range "%s" in regexp, Invalid
+separator character %s in attribute list, Invalid separator character %s in
+subroutine attribute list, leaving effective %s failed, Lvalue subs
+returning %s not implemented yet, Method %s not permitted, Missing
+%sbrace%s on \N{}, Missing command in piped open, Missing name in "my sub",
+No %s specified for -%c, No package name allowed for variable %s in "our",
+No space allowed after -%c, no UTC offset information; assuming local time
+is UTC, Octal number > 037777777777 non-portable, panic: del_backref,
+panic: kid popen errno read, panic: magic_killbackrefs, Parentheses missing
+around "%s" list, Possible unintended interpolation of %s in string,
+Possible Y2K bug: %s, pragma "attrs" is deprecated, use "sub NAME : ATTRS"
+instead, Premature end of script headers, Repeat count in pack overflows,
+Repeat count in unpack overflows, realloc() of freed memory ignored,
+Reference is already weak, setpgrp can't take arguments, Strange *+?{} on
+zero-length expression, switching effective %s is not implemented, This
+Perl can't reset CRTL environ elements (%s), This Perl can't set CRTL
+environ elements (%s=%s), Too late to run %s block, Unknown open() mode
+'%s', Unknown process %x sent message to prime_env_iter: %s, Unrecognized
+escape \\%c passed through, Unterminated attribute parameter in attribute
+list, Unterminated attribute list, Unterminated attribute parameter in
+subroutine attribute list, Unterminated subroutine attribute list, Value of
+CLI symbol "%s" too long, Version number must be a constant number
+
+=item New tests
+
+=item Incompatible Changes
+
+=over 4
+
+=item Perl Source Incompatibilities
+
+CHECK is a new keyword, Treatment of list slices of undef has changed,
+Format of $English::PERL_VERSION is different, Literals of the form
+C<1.2.3> parse differently, Possibly changed pseudo-random number
+generator, Hashing function for hash keys has changed, C<undef> fails on
+read only values, Close-on-exec bit may be set on pipe and socket handles,
+Writing C<"$$1"> to mean C<"${$}1"> is unsupported, delete(), each(),
+values() and C<\(%h)>, vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS,
+Text of some diagnostic output has changed, C<%@> has been removed,
+Parenthesized not() behaves like a list operator, Semantics of bareword
+prototype C<(*)> have changed, Semantics of bit operators may have changed
+on 64-bit platforms, More builtins taint their results
+
+=item C Source Incompatibilities
+
+C<PERL_POLLUTE>, C<PERL_IMPLICIT_CONTEXT>, C<PERL_POLLUTE_MALLOC>
+
+=item Compatible C Source API Changes
+
+C<PATCHLEVEL> is now C<PERL_VERSION>
+
+=item Binary Incompatibilities
+
+=back
+
+=item Known Problems
+
+=over 4
+
+=item Thread test failures
+
+=item EBCDIC platforms not supported
+
+=item In 64-bit HP-UX the lib/io_multihomed test may hang
+
+=item NEXTSTEP 3.3 POSIX test failure
+
+=item Tru64 (aka Digital UNIX, aka DEC OSF/1) lib/sdbm test failure with
+gcc
+
+=item UNICOS/mk CC failures during Configure run
+
+=item Arrow operator and arrays
+
+=item Experimental features
+
+Threads, Unicode, 64-bit support, Lvalue subroutines, Weak references, The
+pseudo-hash data type, The Compiler suite, Internal implementation of file
+globbing, The DB module, The regular expression code constructs:
+
+=back
+
+=item Obsolete Diagnostics
+
+Character class syntax [: :] is reserved for future extensions, Ill-formed
+logical name |%s| in prime_env_iter, In string, @%s now must be written as
+\@%s, Probable precedence problem on %s, regexp too big, Use of "$$<digit>"
+to mean "${$}<digit>" is deprecated
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl5005delta - what's new for perl5.005
+
+=over 4
+
+=item DESCRIPTION
+
+=item About the new versioning system
+
+=item Incompatible Changes
+
+=over 4
+
+=item WARNING: This version is not binary compatible with Perl 5.004.
+
+=item Default installation structure has changed
+
+=item Perl Source Compatibility
+
+=item C Source Compatibility
+
+=item Binary Compatibility
+
+=item Security fixes may affect compatibility
+
+=item Relaxed new mandatory warnings introduced in 5.004
+
+=item Licensing
+
+=back
+
+=item Core Changes
+
+=over 4
+
+=item Threads
+
+=item Compiler
+
+=item Regular Expressions
+
+Many new and improved optimizations, Many bug fixes, New regular expression
+constructs, New operator for precompiled regular expressions, Other
+improvements, Incompatible changes
+
+=item Improved malloc()
+
+=item Quicksort is internally implemented
+
+=item Reliable signals
+
+=item Reliable stack pointers
+
+=item More generous treatment of carriage returns
+
+=item Memory leaks
+
+=item Better support for multiple interpreters
+
+=item Behavior of local() on array and hash elements is now well-defined
+
+=item C<%!> is transparently tied to the L<Errno> module
+
+=item Pseudo-hashes are supported
+
+=item C<EXPR foreach EXPR> is supported
+
+=item Keywords can be globally overridden
+
+=item C<$^E> is meaningful on Win32
+
+=item C<foreach (1..1000000)> optimized
+
+=item C<Foo::> can be used as implicitly quoted package name
+
+=item C<exists $Foo::{Bar::}> tests existence of a package
+
+=item Better locale support
+
+=item Experimental support for 64-bit platforms
+
+=item prototype() returns useful results on builtins
+
+=item Extended support for exception handling
+
+=item Re-blessing in DESTROY() supported for chaining DESTROY() methods
+
+=item All C<printf> format conversions are handled internally
+
+=item New C<INIT> keyword
+
+=item New C<lock> keyword
+
+=item New C<qr//> operator
+
+=item C<our> is now a reserved word
+
+=item Tied arrays are now fully supported
+
+=item Tied handles support is better
+
+=item 4th argument to substr
+
+=item Negative LENGTH argument to splice
+
+=item Magic lvalues are now more magical
+
+=item <> now reads in records
+
+=back
+
+=item Supported Platforms
+
+=over 4
+
+=item New Platforms
+
+=item Changes in existing support
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules
+
+B, Data::Dumper, Dumpvalue, Errno, File::Spec, ExtUtils::Installed,
+ExtUtils::Packlist, Fatal, IPC::SysV, Test, Tie::Array, Tie::Handle,
+Thread, attrs, fields, re
+
+=item Changes in existing modules
+
+Benchmark, Carp, CGI, Fcntl, Math::Complex, Math::Trig, POSIX, DB_File,
+MakeMaker, CPAN, Cwd
+
+=back
+
+=item Utility Changes
+
+=item Documentation Changes
+
+=item New Diagnostics
+
+Ambiguous call resolved as CORE::%s(), qualify as such or use &, Bad index
+while coercing array into hash, Bareword "%s" refers to nonexistent
+package, Can't call method "%s" on an undefined value, Can't check
+filesystem of script "%s" for nosuid, Can't coerce array into hash, Can't
+goto subroutine from an eval-string, Can't localize pseudo-hash element,
+Can't use %%! because Errno.pm is not available, Cannot find an opnumber
+for "%s", Character class syntax [. .] is reserved for future extensions,
+Character class syntax [: :] is reserved for future extensions, Character
+class syntax [= =] is reserved for future extensions, %s: Eval-group in
+insecure regular expression, %s: Eval-group not allowed, use re 'eval', %s:
+Eval-group not allowed at run time, Explicit blessing to '' (assuming
+package main), Illegal hex digit ignored, No such array field, No such
+field "%s" in variable %s of type %s, Out of memory during ridiculously
+large request, Range iterator outside integer range, Recursive inheritance
+detected while looking for method '%s' %s, Reference found where even-sized
+list expected, Undefined value assigned to typeglob, Use of reserved word
+"%s" is deprecated, perl: warning: Setting locale failed
+
+=item Obsolete Diagnostics
+
+Can't mktemp(), Can't write to temp file for B<-e>: %s, Cannot open
+temporary file, regexp too big
+
+=item Configuration Changes
+
+=item BUGS
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl5004delta - what's new for perl5.004
+
+=over 4
+
+=item DESCRIPTION
+
+=item Supported Environments
+
+=item Core Changes
+
+=over 4
+
+=item List assignment to %ENV works
+
+=item Change to "Can't locate Foo.pm in @INC" error
+
+=item Compilation option: Binary compatibility with 5.003
+
+=item $PERL5OPT environment variable
+
+=item Limitations on B<-M>, B<-m>, and B<-T> options
+
+=item More precise warnings
+
+=item Deprecated: Inherited C<AUTOLOAD> for non-methods
+
+=item Previously deprecated %OVERLOAD is no longer usable
+
+=item Subroutine arguments created only when they're modified
+
+=item Group vector changeable with C<$)>
+
+=item Fixed parsing of $$<digit>, &$<digit>, etc.
+
+=item Fixed localization of $<digit>, $&, etc.
+
+=item No resetting of $. on implicit close
+
+=item C<wantarray> may return undef
+
+=item C<eval EXPR> determines value of EXPR in scalar context
+
+=item Changes to tainting checks
+
+No glob() or <*>, No spawning if tainted $CDPATH, $ENV, $BASH_ENV, No
+spawning if tainted $TERM doesn't look like a terminal name
+
+=item New Opcode module and revised Safe module
+
+=item Embedding improvements
+
+=item Internal change: FileHandle class based on IO::* classes
+
+=item Internal change: PerlIO abstraction interface
+
+=item New and changed syntax
+
+$coderef->(PARAMS)
+
+=item New and changed builtin constants
+
+__PACKAGE__
+
+=item New and changed builtin variables
+
+$^E, $^H, $^M
+
+=item New and changed builtin functions
+
+delete on slices, flock, printf and sprintf, keys as an lvalue, my() in
+Control Structures, pack() and unpack(), sysseek(), use VERSION, use Module
+VERSION LIST, prototype(FUNCTION), srand, $_ as Default, C<m//gc> does not
+reset search position on failure, C<m//x> ignores whitespace before ?*+{},
+nested C<sub{}> closures work now, formats work right on changing lexicals
+
+=item New builtin methods
+
+isa(CLASS), can(METHOD), VERSION( [NEED] )
+
+=item TIEHANDLE now supported
+
+TIEHANDLE classname, LIST, PRINT this, LIST, PRINTF this, LIST, READ this
+LIST, READLINE this, GETC this, DESTROY this
+
+=item Malloc enhancements
+
+-DPERL_EMERGENCY_SBRK, -DPACK_MALLOC, -DTWO_POT_OPTIMIZE
+
+=item Miscellaneous efficiency enhancements
+
+=back
+
+=item Support for More Operating Systems
+
+=over 4
+
+=item Win32
+
+=item Plan 9
+
+=item QNX
+
+=item AmigaOS
+
+=back
+
+=item Pragmata
+
+use autouse MODULE => qw(sub1 sub2 sub3), use blib, use blib 'dir', use
+constant NAME => VALUE, use locale, use ops, use vmsish
+
+=item Modules
+
+=over 4
+
+=item Required Updates
+
+=item Installation directories
+
+=item Module information summary
+
+=item Fcntl
+
+=item IO
+
+=item Math::Complex
+
+=item Math::Trig
+
+=item DB_File
+
+=item Net::Ping
+
+=item Object-oriented overrides for builtin operators
+
+=back
+
+=item Utility Changes
+
+=over 4
+
+=item pod2html
+
+Sends converted HTML to standard output
+
+=item xsubpp
+
+C<void> XSUBs now default to returning nothing
+
+=back
+
+=item C Language API Changes
+
+C<gv_fetchmethod> and C<perl_call_sv>, C<perl_eval_pv>, Extended API for
+manipulating hashes
+
+=item Documentation Changes
+
+L<perldelta>, L<perlfaq>, L<perllocale>, L<perltoot>, L<perlapio>,
+L<perlmodlib>, L<perldebug>, L<perlsec>
+
+=item New Diagnostics
+
+"my" variable %s masks earlier declaration in same scope, %s argument is
+not a HASH element or slice, Allocation too large: %lx, Allocation too
+large, Applying %s to %s will act on scalar(%s), Attempt to free
+nonexistent shared string, Attempt to use reference as lvalue in substr,
+Bareword "%s" refers to nonexistent package, Can't redefine active sort
+subroutine %s, Can't use bareword ("%s") as %s ref while "strict refs" in
+use, Cannot resolve method `%s' overloading `%s' in package `%s', Constant
+subroutine %s redefined, Constant subroutine %s undefined, Copy method did
+not return a reference, Died, Exiting pseudo-block via %s, Identifier too
+long, Illegal character %s (carriage return), Illegal switch in PERL5OPT:
+%s, Integer overflow in hex number, Integer overflow in octal number,
+internal error: glob failed, Invalid conversion in %s: "%s", Invalid type
+in pack: '%s', Invalid type in unpack: '%s', Name "%s::%s" used only once:
+possible typo, Null picture in formline, Offset outside string, Out of
+memory!, Out of memory during request for %s, panic: frexp, Possible
+attempt to put comments in qw() list, Possible attempt to separate words
+with commas, Scalar value @%s{%s} better written as $%s{%s}, Stub found
+while resolving method `%s' overloading `%s' in %s, Too late for "B<-T>"
+option, untie attempted while %d inner references still exist, Unrecognized
+character %s, Unsupported function fork, Use of "$$<digit>" to mean
+"${$}<digit>" is deprecated, Value of %s can be "0"; test with defined(),
+Variable "%s" may be unavailable, Variable "%s" will not stay shared,
+Warning: something's wrong, Ill-formed logical name |%s| in prime_env_iter,
+Got an error from DosAllocMem, Malformed PERLLIB_PREFIX, PERL_SH_DIR too
+long, Process terminated by SIG%s
+
+=item BUGS
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perlartistic - the Perl Artistic License
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item The "Artistic License"
+
+=over 4
+
+=item Preamble
+
+=item Definitions
+
+"Package", "Standard Version", "Copyright Holder", "You", "Reasonable
+copying fee", "Freely Available"
+
+=item Conditions
+
+a), b), c), d), a), b), c), d)
+
+=back
+
+=back
+
+=head2 perlgpl - the GNU General Public License, version 2
+
+=over 4
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item GNU GENERAL PUBLIC LICENSE
+
+=back
+
+=head2 perlaix, README.aix - Perl version 5 on IBM Unix (AIX) systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Compiling Perl 5 on AIX
+
+=item Supported Compilers
+
+=item Incompatibility with AIX Toolbox lib gdbm
+
+=item Perl 5.10 was successfully compiled and tested on:
+
+=item Building Dynamic Extensions on AIX
+
+=item Using Large Files with Perl
+
+=item Threaded Perl
+
+=item 64-bit Perl
+
+=item Recommended Options AIX 5.1/5.2/5.3 and 6.1 (threaded/32-bit)
+
+=item Recommended Options AIX 5.1/5.2/5.3 and 6.1 (32-bit)
+
+=item Recommended Options AIX 5.1/5.2/5.3 and 6.1 (threaded/64-bit)
+
+=item Recommended Options AIX 5.1/5.2/5.3 and 6.1(64-bit)
+
+=item Compiling Perl 5 on older AIX versions up to 4.3.3
+
+=item OS level
+
+=item Building Dynamic Extensions on AIX
+
+=item The IBM ANSI C Compiler
+
+=item The usenm option
+
+=item Using GNU's gcc for building Perl
+
+=item Using Large Files with Perl
+
+=item Threaded Perl
+
+=item 64-bit Perl
+
+=item AIX 4.2 and extensions using C++ with statics
+
+=back
+
+=item AUTHORS
+
+=item DATE
+
+=back
+
+=head2 perlamiga - Perl under Amiga OS
+
+=over 4
+
+=item NOTE
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Prerequisites for Compiling Perl on AmigaOS
+
+B<Unix emulation for AmigaOS: ixemul.library>, B<Version of Amiga OS>
+
+=item Starting Perl programs under AmigaOS
+
+=item Shortcomings of Perl under AmigaOS
+
+=back
+
+=item INSTALLATION
+
+=item Accessing documentation
+
+=over 4
+
+=item Manpages for Perl on AmigaOS
+
+=item Perl HTML Documentation on AmigaOS
+
+=item Perl GNU Info Files on AmigaOS
+
+=item Perl LaTeX Documentation on AmigaOS
+
+=back
+
+=item BUILDING PERL ON AMIGAOS
+
+=over 4
+
+=item Build Prerequisites for Perl on AmigaOS
+
+=item Getting the Perl Source for AmigaOS
+
+=item Making Perl on AmigaOS
+
+=item Testing Perl on AmigaOS
+
+=item Installing the built Perl on AmigaOS
+
+=back
+
+=item PERL 5.8.0 BROKEN IN AMIGAOS
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 perlapollo, README.apollo - Perl version 5 on Apollo DomainOS
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 perlbeos, README.beos - Perl version 5.8+ on BeOS
+
+=over 4
+
+=item DESCRIPTION
+
+=item BUILD AND INSTALL
+
+=over 4
+
+=item Requirements
+
+=item Configure
+
+=item Build
+
+=item Install
+
+=back
+
+=item KNOWN PROBLEMS
+
+=item CONTACT
+
+=back
+
+=head2 perlbs2000, README.BS2000 - building and installing Perl for BS2000.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item gzip on BS2000
+
+=item bison on BS2000
+
+=item Unpacking Perl Distribution on BS2000
+
+=item Compiling Perl on BS2000
+
+=item Testing Perl on BS2000
+
+=item Installing Perl on BS2000
+
+=item Using Perl in the Posix-Shell of BS2000
+
+=item Using Perl in "native" BS2000
+
+=item Floating point anomalies on BS2000
+
+=item Using PerlIO and different encodings on ASCII and EBCDIC partitions
+
+=back
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=over 4
+
+=item Mailing list
+
+=back
+
+=item HISTORY
+
+=back
+
+=head2 perlce - Perl for WinCE
+
+=over 4
+
+=item Building Perl for WinCE
+
+=over 4
+
+=item DESCRIPTION
+
+=item General explanations on cross-compiling WinCE
+
+=item BUILD
+
+Microsoft Embedded Visual Tools, Microsoft Visual C++, Rainer Keuchel's
+celib-sources, Rainer Keuchel's console-sources, go to C<./win32>
+subdirectory, edit file C<./win32/ce-helpers/compile.bat>, run
+compile.bat, run compile.bat dist
+
+=back
+
+=item Using Perl on WinCE
+
+=over 4
+
+=item DESCRIPTION
+
+=item LIMITATIONS
+
+=item ENVIRONMENT
+
+PERL5LIB, PATH, TMP, UNIXROOTPATH, ROWS/COLS, HOME, CONSOLEFONTSIZE
+
+=item REGISTRY
+
+=item XS
+
+=item BUGS
+
+=item INSTALLATION
+
+=back
+
+=item ACKNOWLEDGEMENTS
+
+=item History of WinCE port
+
+=item AUTHORS
+
+Rainer Keuchel <coyxc@rainer-keuchel.de>, Vadim Konovalov
+
+=back
+
+=head2 perlcygwin, README.cygwin - Perl for Cygwin
+
+=over 4
+
+=item SYNOPSIS
+
+=item PREREQUISITES FOR COMPILING PERL ON CYGWIN
+
+=over 4
+
+=item Cygwin = GNU+Cygnus+Windows (Don't leave UNIX without it)
+
+=item Cygwin Configuration
+
+C<PATH>, I<nroff>, Permissions
+
+=back
+
+=item CONFIGURE PERL ON CYGWIN
+
+=over 4
+
+=item Stripping Perl Binaries on Cygwin
+
+=item Optional Libraries for Perl on Cygwin
+
+C<-lcrypt>, C<-lgdbm_compat> (C<use GDBM_File>), C<-ldb> (C<use DB_File>),
+C<cygserver> (C<use IPC::SysV>), C<-lutil>
+
+=item Configure-time Options for Perl on Cygwin
+
+C<-Uusedl>, C<-Uusemymalloc>, C<-Uuseperlio>, C<-Dusemultiplicity>,
+C<-Duse64bitint>, C<-Duselongdouble>, C<-Dusethreads>, C<-Duselargefiles>,
+C<-Dmksymlinks>
+
+=item Suspicious Warnings on Cygwin
+
+Win9x and C<d_eofnblk>, Compiler/Preprocessor defines
+
+=back
+
+=item MAKE ON CYGWIN
+
+=item TEST ON CYGWIN
+
+=over 4
+
+=item File Permissions on Cygwin
+
+=item NDBM_File and ODBM_File do not work on FAT filesystems
+
+=item C<fork()> failures in io_* tests
+
+=back
+
+=item Specific features of the Cygwin port
+
+=over 4
+
+=item Script Portability on Cygwin
+
+Pathnames, Text/Binary, PerlIO, F<.exe>, Cygwin vs. Windows process ids,
+Cygwin vs. Windows errors, C<chown()>, Miscellaneous
+
+=item Prebuilt methods:
+
+C<Cwd::cwd>, C<Cygwin::pid_to_winpid>, C<Cygwin::winpid_to_pid>,
+C<Cygwin::win_to_posix_path>, C<Cygwin::posix_to_win_path>,
+C<Cygwin::mount_table()>, C<Cygwin::mount_flags>, C<Cygwin::is_binmount>
+
+=back
+
+=item INSTALL PERL ON CYGWIN
+
+=item MANIFEST ON CYGWIN
+
+Documentation, Build, Configure, Make, Install, Tests, Compiled Perl
+Source, Compiled Module Source, Perl Modules/Scripts, Perl Module Tests
+
+=item BUGS ON CYGWIN
+
+=item AUTHORS
+
+=item HISTORY
+
+=back
+
+=head2 perldgux - Perl under DG/UX.
+
+=over 4
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item BUILDING PERL ON DG/UX
+
+=over 4
+
+=item Non-threaded Perl on DG/UX
+
+=item Threaded Perl on DG/UX
+
+=item Testing Perl on DG/UX
+
+=item Installing the built perl on DG/UX
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perldos - Perl under DOS, W31, W95.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Prerequisites for Compiling Perl on DOS
+
+DJGPP, Pthreads
+
+=item Shortcomings of Perl under DOS
+
+=item Building Perl on DOS
+
+=item Testing Perl on DOS
+
+=item Installation of Perl on DOS
+
+=back
+
+=item BUILDING AND INSTALLING MODULES ON DOS
+
+=over 4
+
+=item Building Prerequisites for Perl on DOS
+
+=item Unpacking CPAN Modules on DOS
+
+=item Building Non-XS Modules on DOS
+
+=item Building XS Modules on DOS
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlepoc, README.epoc - Perl for EPOC
+
+=over 4
+
+=item SYNOPSIS
+
+=item INTRODUCTION
+
+=item INSTALLING PERL ON EPOC
+
+=item STARTING PERL ON EPOC
+
+=over 4
+
+=item Editors on Epoc
+
+=item Features of Perl on Epoc
+
+=item Restrictions of Perl on Epoc
+
+=item Compiling Perl 5 on the EPOC cross compiling environment
+
+=back
+
+=item SUPPORT STATUS OF PERL ON EPOC
+
+=item AUTHOR
+
+=item LAST UPDATE
+
+=back
+
+=head2 perlfreebsd, README.freebsd - Perl version 5 on FreeBSD systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item FreeBSD core dumps from readdir_r with ithreads
+
+=item $^X doesn't always contain a full path in FreeBSD
+
+=item Perl will no longer be part of "base FreeBSD"
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlhaiku, README.haiku - Perl version 5.10+ on Haiku
+
+=over 4
+
+=item DESCRIPTION
+
+=item BUILD AND INSTALL
+
+=item KNOWN PROBLEMS
+
+=item CONTACT
+
+=back
+
+=head2 perlhpux, README.hpux - Perl version 5 on Hewlett-Packard Unix
+(HP-UX) systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Using perl as shipped with HP-UX
+
+=item Using perl from HP's porting centre
+
+=item Compiling Perl 5 on HP-UX
+
+=item PA-RISC
+
+=item Portability Between PA-RISC Versions
+
+=item PA-RISC 1.0
+
+=item PA-RISC 1.1
+
+=item PA-RISC 2.0
+
+=item Itanium Processor Family (IPF) and HP-UX
+
+=item Itanium, Itanium 2 & Madison 6
+
+=item HP-UX versions
+
+=item Building Dynamic Extensions on HP-UX
+
+=item The HP ANSI C Compiler
+
+=item The GNU C Compiler
+
+=item Using Large Files with Perl on HP-UX
+
+=item Threaded Perl on HP-UX
+
+=item 64-bit Perl on HP-UX
+
+=item Oracle on HP-UX
+
+=item GDBM and Threads on HP-UX
+
+=item NFS filesystems and utime(2) on HP-UX
+
+=item perl -P and // and HP-UX
+
+=item HP-UX Kernel Parameters (maxdsiz) for Compiling Perl
+
+=back
+
+=item nss_delete core dump from op/pwent or op/grent
+
+=item Miscellaneous
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 perlhurd, README.hurd - Perl version 5 on Hurd
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Known Problems with Perl on Hurd
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlirix, README.irix - Perl version 5 on Irix systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Building 32-bit Perl in Irix
+
+=item Building 64-bit Perl in Irix
+
+=item About Compiler Versions of Irix
+
+=item Linker Problems in Irix
+
+=item Malloc in Irix
+
+=item Building with threads in Irix
+
+=item Irix 5.3
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perllinux, README.linux - Perl version 5 on Linux systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Experimental Support for Sun Studio Compilers for Linux OS
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlmachten, README.machten - Perl version 5 on Power MachTen
+systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Perl version 5.8.x and greater not supported
+
+=item Compiling Perl 5.6.x on MachTen
+
+=item Failures during C<make test> on MachTen
+
+op/lexassign.t, pragma/warnings.t
+
+=item Building external modules on MachTen
+
+=back
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 perlmacos, README.macos - Perl under Mac OS (Classic)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 perlmacosx, README.macosx - Perl under Mac OS X
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Installation Prefix
+
+=item SDK support
+
+=item Universal Binary support
+
+=item 64-bit PPC support
+
+=item libperl and Prebinding
+
+=item Updating Apple's Perl
+
+=item Known problems
+
+=item MacPerl
+
+=item Carbon
+
+=item Cocoa
+
+=back
+
+=item Starting From Scratch
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 perlmint, README.mint - Perl version 5 on Atari MiNT
+
+=over 4
+
+=item DESCRIPTION
+
+=item Known problems with Perl on MiNT
+
+=item AUTHOR
+
+=back
+
+=head2 perlmpeix, README.mpeix - Perl/iX for HP e3000 MPE
+
+=over 4
+
+=item SYNOPSIS
+
+=item NOTE
+
+=item Binary distribution from HP
+
+=item What's New in Perl for MPE/iX
+
+=item Welcome to Perl/iX
+
+=item System Requirements for Perl/iX
+
+=item How to Obtain Perl/iX
+
+=item Perl/iX Distribution Contents Highlights
+
+README, INSTALL, LIBSHP3K, PERL, .cpan/, lib/, man/,
+public_html/feedback.cgi, src/perl-5.6.0-mpe
+
+=item How to Compile Perl/iX
+
+ 4, 6
+
+=item Getting Started with Perl/iX
+
+=item MPE/iX Implementation Considerations
+
+=item Known Perl/iX Bugs Under Investigation
+
+=item Perl/iX To-Do List
+
+=item Perl/iX Change History
+
+=item AUTHOR
+
+=back
+
+=head2 perlnetware - Perl for NetWare
+
+=over 4
+
+=item DESCRIPTION
+
+=item BUILD
+
+=over 4
+
+=item Tools & SDK
+
+=item Setup
+
+SetNWBld.bat, Buildtype.bat
+
+=item Make
+
+=item Interpreter
+
+=item Extensions
+
+=back
+
+=item INSTALL
+
+=item BUILD NEW EXTENSIONS
+
+=item ACKNOWLEDGEMENTS
+
+=item AUTHORS
+
+=item DATE
+
+=back
+
+=head2 perlopenbsd, README.openbsd - Perl version 5 on OpenBSD systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item OpenBSD core dumps from getprotobyname_r and getservbyname_r with
+ithreads
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlos2 - Perl under OS/2, DOS, Win0.3*, Win0.95 and WinNT.
+
+=over 4
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Target
+
+=item Other OSes
+
+=item Prerequisites
+
+EMX, RSX, HPFS, pdksh
+
+=item Starting Perl programs under OS/2 (and DOS and...)
+
+=item Starting OS/2 (and DOS) programs under Perl
+
+=back
+
+=item Frequently asked questions
+
+=over 4
+
+=item "It does not work"
+
+=item I cannot run external programs
+
+=item I cannot embed perl into my program, or use F<perl.dll> from my
+program.
+
+Is your program EMX-compiled with C<-Zmt -Zcrtdll>?, Did you use
+L<ExtUtils::Embed>?
+
+=item C<``> and pipe-C<open> do not work under DOS.
+
+=item Cannot start C<find.exe "pattern" file>
+
+=back
+
+=item INSTALLATION
+
+=over 4
+
+=item Automatic binary installation
+
+C<PERL_BADLANG>, C<PERL_BADFREE>, F<Config.pm>
+
+=item Manual binary installation
+
+Perl VIO and PM executables (dynamically linked), Perl_ VIO executable
+(statically linked), Executables for Perl utilities, Main Perl library,
+Additional Perl modules, Tools to compile Perl modules, Manpages for Perl
+and utilities, Manpages for Perl modules, Source for Perl documentation,
+Perl manual in F<.INF> format, Pdksh
+
+=item B<Warning>
+
+=back
+
+=item Accessing documentation
+
+=over 4
+
+=item OS/2 F<.INF> file
+
+=item Plain text
+
+=item Manpages
+
+=item HTML
+
+=item GNU C<info> files
+
+=item F<PDF> files
+
+=item C<LaTeX> docs
+
+=back
+
+=item BUILD
+
+=over 4
+
+=item The short story
+
+=item Prerequisites
+
+=item Getting perl source
+
+=item Application of the patches
+
+=item Hand-editing
+
+=item Making
+
+=item Testing
+
+A lot of C<bad free>, Process terminated by SIGTERM/SIGINT, F<op/fs.t>,
+F<op/stat.t>
+
+=item Installing the built perl
+
+=item C<a.out>-style build
+
+=back
+
+=item Building a binary distribution
+
+=item Building custom F<.EXE> files
+
+=over 4
+
+=item Making executables with a custom collection of statically loaded
+extensions
+
+=item Making executables with a custom search-paths
+
+=back
+
+=item Build FAQ
+
+=over 4
+
+=item Some C</> became C<\> in pdksh.
+
+=item C<'errno'> - unresolved external
+
+=item Problems with tr or sed
+
+=item Some problem (forget which ;-)
+
+=item Library ... not found
+
+=item Segfault in make
+
+=item op/sprintf test failure
+
+=back
+
+=item Specific (mis)features of OS/2 port
+
+=over 4
+
+=item C<setpriority>, C<getpriority>
+
+=item C<system()>
+
+=item C<extproc> on the first line
+
+=item Additional modules:
+
+=item Prebuilt methods:
+
+C<File::Copy::syscopy>, C<DynaLoader::mod2fname>, C<Cwd::current_drive()>,
+ C<Cwd::sys_chdir(name)>, C<Cwd::change_drive(name)>,
+C<Cwd::sys_is_absolute(name)>, C<Cwd::sys_is_rooted(name)>,
+C<Cwd::sys_is_relative(name)>, C<Cwd::sys_cwd(name)>,
+C<Cwd::sys_abspath(name, dir)>, C<Cwd::extLibpath([type])>,
+C<Cwd::extLibpath_set( path [, type ] )>,
+C<OS2::Error(do_harderror,do_exception)>, C<OS2::Errors2Drive(drive)>,
+OS2::SysInfo(), OS2::BootDrive(), C<OS2::MorphPM(serve)>,
+C<OS2::UnMorphPM(serve)>, C<OS2::Serve_Messages(force)>,
+C<OS2::Process_Messages(force [, cnt])>, C<OS2::_control87(new,mask)>,
+OS2::get_control87(), C<OS2::set_control87_em(new=MCW_EM,mask=MCW_EM)>,
+C<OS2::DLLname([how [, \&xsub]])>
+
+=item Prebuilt variables:
+
+$OS2::emx_rev, $OS2::emx_env, $OS2::os_ver, $OS2::is_aout, $OS2::can_fork,
+$OS2::nsyserror
+
+=item Misfeatures
+
+=item Modifications
+
+C<popen>, C<tmpnam>, C<tmpfile>, C<ctermid>, C<stat>, C<mkdir>, C<rmdir>,
+C<flock>
+
+=item Identifying DLLs
+
+=item Centralized management of resources
+
+C<HAB>, C<HMQ>, Treating errors reported by OS/2 API,
+C<CheckOSError(expr)>, C<CheckWinError(expr)>, C<SaveWinError(expr)>,
+C<SaveCroakWinError(expr,die,name1,name2)>, C<WinError_2_Perl_rc>,
+C<FillWinError>, C<FillOSError(rc)>, Loading DLLs and ordinals in DLLs
+
+=back
+
+=item Perl flavors
+
+=over 4
+
+=item F<perl.exe>
+
+=item F<perl_.exe>
+
+=item F<perl__.exe>
+
+=item F<perl___.exe>
+
+=item Why strange names?
+
+=item Why dynamic linking?
+
+=item Why chimera build?
+
+=back
+
+=item ENVIRONMENT
+
+=over 4
+
+=item C<PERLLIB_PREFIX>
+
+=item C<PERL_BADLANG>
+
+=item C<PERL_BADFREE>
+
+=item C<PERL_SH_DIR>
+
+=item C<USE_PERL_FLOCK>
+
+=item C<TMP> or C<TEMP>
+
+=back
+
+=item Evolution
+
+=over 4
+
+=item Text-mode filehandles
+
+=item Priorities
+
+=item DLL name mangling: pre 5.6.2
+
+=item DLL name mangling: 5.6.2 and beyond
+
+Global DLLs, specific DLLs, C<BEGINLIBPATH> and C<ENDLIBPATH>, F<.> from
+C<LIBPATH>
+
+=item DLL forwarder generation
+
+=item Threading
+
+=item Calls to external programs
+
+=item Memory allocation
+
+=item Threads
+
+C<COND_WAIT>, F<os2.c>
+
+=back
+
+=item BUGS
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlos390, README.os390 - building and installing Perl for OS/390
+and z/OS
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Tools
+
+=item Unpacking Perl distribution on OS/390
+
+=item Setup and utilities for Perl on OS/390
+
+=item Configure Perl on OS/390
+
+=item Build, Test, Install Perl on OS/390
+
+=item Build Anomalies with Perl on OS/390
+
+=item Testing Anomalies with Perl on OS/390
+
+=item Installation Anomalies with Perl on OS/390
+
+=item Usage Hints for Perl on OS/390
+
+=item Floating Point Anomalies with Perl on OS/390
+
+=item Modules and Extensions for Perl on OS/390
+
+=back
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=over 4
+
+=item Mailing list for Perl on OS/390
+
+=back
+
+=item HISTORY
+
+=back
+
+=head2 perlos400, README.os400 - Perl version 5 on OS/400
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Compiling Perl for OS/400 PASE
+
+=item Installing Perl in OS/400 PASE
+
+=item Using Perl in OS/400 PASE
+
+=item Known Problems
+
+=item Perl on ILE
+
+=back
+
+=item AUTHORS
+
+=back
+
+=head2 perlplan9 - Plan 9-specific documentation for Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Invoking Perl
+
+=item What's in Plan 9 Perl
+
+=item What's not in Plan 9 Perl
+
+=item Perl5 Functions not currently supported in Plan 9 Perl
+
+=item Signals in Plan 9 Perl
+
+=back
+
+=item COMPILING AND INSTALLING PERL ON PLAN 9
+
+=over 4
+
+=item Installing Perl Documentation on Plan 9
+
+=back
+
+=item BUGS
+
+=item Revision date
+
+=item AUTHOR
+
+=back
+
+=head2 perlqnx, README.qnx - Perl version 5 on QNX
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Required Software for Compiling Perl on QNX4
+
+/bin/sh, ar, nm, cpp, make
+
+=item Outstanding Issues with Perl on QNX4
+
+=item QNX auxiliary files
+
+qnx/ar, qnx/cpp
+
+=item Outstanding issues with perl under QNX6
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlriscos, README.riscos - Perl version 5 for RISC OS
+
+=over 4
+
+=item DESCRIPTION
+
+=item BUILD
+
+=item AUTHOR
+
+=back
+
+=head2 perlsolaris, README.solaris - Perl version 5 on Solaris systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Solaris Version Numbers.
+
+=back
+
+=item RESOURCES
+
+Solaris FAQ, Precompiled Binaries, Solaris Documentation
+
+=item SETTING UP
+
+=over 4
+
+=item File Extraction Problems on Solaris.
+
+=item Compiler and Related Tools on Solaris.
+
+=item Environment for Compiling perl on Solaris
+
+=back
+
+=item RUN CONFIGURE.
+
+=over 4
+
+=item 64-bit perl on Solaris.
+
+=item Threads in perl on Solaris.
+
+=item Malloc Issues with perl on Solaris.
+
+=back
+
+=item MAKE PROBLEMS.
+
+Dynamic Loading Problems With GNU as and GNU ld, ld.so.1: ./perl: fatal:
+relocation error:, dlopen: stub interception failed, #error "No
+DATAMODEL_NATIVE specified", sh: ar: not found
+
+=item MAKE TEST
+
+=over 4
+
+=item op/stat.t test 4 in Solaris
+
+=item nss_delete core dump from op/pwent or op/grent
+
+=back
+
+=item PREBUILT BINARIES OF PERL FOR SOLARIS.
+
+=item RUNTIME ISSUES FOR PERL ON SOLARIS.
+
+=over 4
+
+=item Limits on Numbers of Open Files on Solaris.
+
+=back
+
+=item SOLARIS-SPECIFIC MODULES.
+
+=item SOLARIS-SPECIFIC PROBLEMS WITH MODULES.
+
+=over 4
+
+=item Proc::ProcessTable on Solaris
+
+=item BSD::Resource on Solaris
+
+=item Net::SSLeay on Solaris
+
+=back
+
+=item SunOS 4.x
+
+=item AUTHOR
+
+=back
+
+=head2 perlsymbian, README.symbian - Perl version 5 on Symbian OS
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Compiling Perl on Symbian
+
+=item Compilation problems
+
+=item PerlApp
+
+=item sisify.pl
+
+=item Using Perl in Symbian
+
+=back
+
+=item TO DO
+
+=item WARNING
+
+=item NOTE
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item LICENSE
+
+=item HISTORY
+
+=back
+
+=head2 perltru64, README.tru64 - Perl version 5 on Tru64 (formerly known as
+Digital UNIX formerly known as DEC OSF/1) systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Compiling Perl 5 on Tru64
+
+=item Using Large Files with Perl on Tru64
+
+=item Threaded Perl on Tru64
+
+=item Long Doubles on Tru64
+
+=item DB_File tests failing on Tru64
+
+=item 64-bit Perl on Tru64
+
+=item Warnings about floating-point overflow when compiling Perl on Tru64
+
+=back
+
+=item Testing Perl on Tru64
+
+=item ext/ODBM_File/odbm Test Failing With Static Builds
+
+=item Perl Fails Because Of Unresolved Symbol sockatmark
+
+=item AUTHOR
+
+=back
+
+=head2 perluts - Perl under UTS
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUILDING PERL ON UTS
+
+=item Installing the built perl on UTS
+
+=item AUTHOR
+
+=back
+
+=head2 perlvmesa, README.vmesa - building and installing Perl for VM/ESA.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Unpacking Perl Distribution on VM/ESA
+
+=item Setup Perl and utilities on VM/ESA
+
+=item Configure Perl on VM/ESA
+
+=item Testing Anomalies of Perl on VM/ESA
+
+=item Usage Hints for Perl on VM/ESA
+
+=back
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=over 4
+
+=item Mailing list for Perl on VM/ESA
+
+=back
+
+=back
+
+=head2 perlvms - VMS-specific documentation for Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=item Installation
+
+=item Organization of Perl Images
+
+=over 4
+
+=item Core Images
+
+=item Perl Extensions
+
+=item Installing static extensions
+
+=item Installing dynamic extensions
+
+=back
+
+=item File specifications
+
+=over 4
+
+=item Syntax
+
+=item Filename Case
+
+=item Symbolic Links
+
+=item Wildcard expansion
+
+=item Pipes
+
+=back
+
+=item PERL5LIB and PERLLIB
+
+=item The Perl Forked Debugger
+
+=item PERL_VMS_EXCEPTION_DEBUG
+
+=item Command line
+
+=over 4
+
+=item I/O redirection and backgrounding
+
+=item Command line switches
+
+-i, -S, -u
+
+=back
+
+=item Perl functions
+
+File tests, backticks, binmode FILEHANDLE, crypt PLAINTEXT, USER, die,
+dump, exec LIST, fork, getpwent, getpwnam, getpwuid, gmtime, kill, qx//,
+select (system call), stat EXPR, system LIST, time, times, unlink LIST,
+utime LIST, waitpid PID,FLAGS
+
+=item Perl variables
+
+%ENV, CRTL_ENV, CLISYM_[LOCAL], Any other string, $!, $^E, $?, $|
+
+=item Standard modules with VMS-specific differences
+
+=over 4
+
+=item SDBM_File
+
+=back
+
+=item Revision date
+
+=item AUTHOR
+
+=back
+
+=head2 perlvos, README.vos - Perl for Stratus VOS
+
+=over 4
+
+=item SYNOPSIS
+
+=item BUILDING PERL FOR VOS
+
+=item INSTALLING PERL IN VOS
+
+=item USING PERL IN VOS
+
+=over 4
+
+=item Restrictions of Perl on VOS
+
+=item Handling of underflow and overflow
+
+=back
+
+=item TEST STATUS
+
+=item SUPPORT STATUS
+
+=item AUTHOR
+
+=item LAST UPDATE
+
+=back
+
+=head2 perlwin32 - Perl under Windows
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Setting Up Perl on Win32
+
+Make, Command Shell, Borland C++, Microsoft Visual C++, Microsoft Visual
+C++ 2008 Express Edition, Microsoft Visual C++ 2005 Express Edition,
+Microsoft Visual C++ Toolkit 2003, Microsoft Platform SDK 64-bit Compiler,
+MinGW release 3 with gcc, MinGW release 1 with gcc
+
+=item Building
+
+=item Testing Perl on Win32
+
+=item Installation of Perl on Win32
+
+=item Usage Hints for Perl on Win32
+
+Environment Variables, File Globbing, Using perl from the command line,
+Building Extensions, Command-line Wildcard Expansion, Win32 Specific
+Extensions, Notes on 64-bit Windows
+
+=item Running Perl Scripts
+
+=item Miscellaneous Things
+
+=back
+
+=item BUGS AND CAVEATS
+
+=item ACKNOWLEDGEMENTS
+
+=item AUTHORS
+
+Gary Ng E<lt>71564.1743@CompuServe.COME<gt>, Gurusamy Sarathy
+E<lt>gsar@activestate.comE<gt>, Nick Ing-Simmons
+E<lt>nick@ing-simmons.netE<gt>, Jan Dubois E<lt>jand@activestate.comE<gt>,
+Steve Hay E<lt>steve.hay@uk.radan.comE<gt>
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head1 PRAGMA DOCUMENTATION
+
+=head2 attrs - set/get attributes of a subroutine (deprecated)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+method, locked
+
+=back
+
+=head2 mro - Method Resolution Order
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OVERVIEW
+
+=item The C3 MRO
+
+=over 4
+
+=item What is C3?
+
+=item How does C3 work
+
+=back
+
+=item Functions
+
+=over 4
+
+=item mro::get_linear_isa($classname[, $type])
+
+=item mro::set_mro($classname, $type)
+
+=item mro::get_mro($classname)
+
+=item mro::get_isarev($classname)
+
+=item mro::is_universal($classname)
+
+=item mro::invalidate_all_method_caches()
+
+=item mro::method_changed_in($classname)
+
+=item mro::get_pkg_gen($classname)
+
+=item next::method
+
+=item next::can
+
+=item maybe::next::method
+
+=back
+
+=item SEE ALSO
+
+=over 4
+
+=item The original Dylan paper
+
+L<http://www.webcom.com/haahr/dylan/linearization-oopsla96.html>
+
+=item The prototype Perl 6 Object Model uses C3
+
+L<http://svn.openfoundry.org/pugs/perl5/Perl6-MetaModel/>
+
+=item Parrot now uses C3
+
+L<http://aspn.activestate.com/ASPN/Mail/Message/perl6-internals/2746631>,
+L<http://use.perl.org/~autrijus/journal/25768>
+
+=item Python 2.3 MRO related links
+
+L<http://www.python.org/2.3/mro.html>,
+L<http://www.python.org/2.2.2/descrintro.html#mro>
+
+=item C3 for TinyCLOS
+
+L<http://www.call-with-current-continuation.org/eggs/c3.html>
+
+=item Class::C3
+
+L<Class::C3>
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 re - Perl pragma to alter regular expression behaviour
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item 'taint' mode
+
+=item 'eval' mode
+
+=item 'debug' mode
+
+=item 'Debug' mode
+
+Compile related options, COMPILE, PARSE, OPTIMISE, TRIEC, DUMP, Execute
+related options, EXECUTE, MATCH, TRIEE, INTUIT, Extra debugging options,
+EXTRA, BUFFERS, TRIEM, STATE, STACK, OPTIMISEM, OFFSETS, OFFSETSDBG, Other
+useful flags, ALL, All, MORE, More
+
+=item Exportable Functions
+
+is_regexp($ref), regexp_pattern($ref), regmust($ref), regname($name,$all),
+regnames($all), regnames_count()
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 threads-shared, threads::shared - Perl extension for sharing data
+structures between threads
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXPORT
+
+=item FUNCTIONS
+
+share VARIABLE, shared_clone REF, is_shared VARIABLE, lock VARIABLE,
+cond_wait VARIABLE, cond_wait CONDVAR, LOCKVAR, cond_timedwait VARIABLE,
+ABS_TIMEOUT, cond_timedwait CONDVAR, ABS_TIMEOUT, LOCKVAR, cond_signal
+VARIABLE, cond_broadcast VARIABLE
+
+=item OBJECTS
+
+=item NOTES
+
+=item BUGS AND LIMITATIONS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item LICENSE
+
+=back
+
+=head2 threads - Perl interpreter-based threads
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$thr = threads->create(FUNCTION, ARGS), $thr->join(), $thr->detach(),
+threads->detach(), threads->self(), $thr->tid(), threads->tid(), "$thr",
+threads->object($tid), threads->yield(), threads->list(),
+threads->list(threads::all), threads->list(threads::running),
+threads->list(threads::joinable), $thr1->equal($thr2), async BLOCK;,
+$thr->error(), $thr->_handle(), threads->_handle()
+
+=item EXITING A THREAD
+
+threads->exit(), threads->exit(status), die(), exit(status), use threads
+'exit' => 'threads_only', threads->create({'exit' => 'thread_only'}, ...),
+$thr->set_thread_exit_only(boolean), threads->set_thread_exit_only(boolean)
+
+=item THREAD STATE
+
+$thr->is_running(), $thr->is_joinable(), $thr->is_detached(),
+threads->is_detached()
+
+=item THREAD CONTEXT
+
+=over 4
+
+=item Explicit context
+
+=item Implicit context
+
+=item $thr->wantarray()
+
+=item threads->wantarray()
+
+=back
+
+=item THREAD STACK SIZE
+
+threads->get_stack_size();, $size = $thr->get_stack_size();, $old_size =
+threads->set_stack_size($new_size);, use threads ('stack_size' => VALUE);,
+$ENV{'PERL5_ITHREADS_STACK_SIZE'}, threads->create({'stack_size' => VALUE},
+FUNCTION, ARGS), $thr2 = $thr1->create(FUNCTION, ARGS)
+
+=item THREAD SIGNALLING
+
+$thr->kill('SIG...');
+
+=item WARNINGS
+
+Perl exited with active threads:, Thread creation failed: pthread_create
+returned #, Thread # terminated abnormally: .., Using minimum thread stack
+size of #, Thread creation failed: pthread_attr_setstacksize(I<SIZE>)
+returned 22
+
+=item ERRORS
+
+This Perl not built to support threads, Cannot change stack size of an
+existing thread, Cannot signal threads without safe signals, Unrecognized
+signal name: ..
+
+=item BUGS AND LIMITATIONS
+
+Thread-safe modules, Using non-thread-safe modules, Current working
+directory, Environment variables, Parent-child threads, Creating threads
+inside special blocks, Unsafe signals, Perl has been built with
+C<PERL_OLD_SIGNALS> (see C<perl -V>), The environment variable
+C<PERL_SIGNALS> is set to C<unsafe> (see L<perlrun/"PERL_SIGNALS">), The
+module L<Perl::Unsafe::Signals> is used, Returning closures from threads,
+Returning objects from threads, END blocks in threads, Perl Bugs and the
+CPAN Version of L<threads>
+
+=item REQUIREMENTS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item LICENSE
+
+=item ACKNOWLEDGEMENTS
+
+=back
+
+=head2 attributes - get/set subroutine or variable attributes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item What C<import> does
+
+=item Built-in Attributes
+
+locked, method, lvalue
+
+=item Available Subroutines
+
+get, reftype
+
+=item Package-specific Attribute Handling
+
+FETCH_I<type>_ATTRIBUTES, MODIFY_I<type>_ATTRIBUTES
+
+=item Syntax of Attribute Lists
+
+=back
+
+=item EXPORTS
+
+=over 4
+
+=item Default exports
+
+=item Available exports
+
+=item Export tags defined
+
+=back
+
+=item EXAMPLES
+
+=item MORE EXAMPLES
+
+=item SEE ALSO
+
+=back
+
+=head2 autodie - Replace functions with ones that succeed or die with
+lexical scope
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXCEPTIONS
+
+=item CATEGORIES
+
+=item FUNCTION SPECIFIC NOTES
+
+=over 4
+
+=item flock
+
+=item system/exec
+
+=back
+
+=item GOTCHAS
+
+=item DIAGNOSTICS
+
+:void cannot be used with lexical scope, No user hints defined for %s
+
+=item BUGS
+
+=over 4
+
+=item autodie and string eval
+
+=item REPORTING BUGS
+
+=back
+
+=item FEEDBACK
+
+=item AUTHOR
+
+=item LICENSE
+
+=item SEE ALSO
+
+=item ACKNOWLEDGEMENTS
+
+=back
+
+=head2 autodiexception, autodie::exception - Exceptions from autodying
+functions.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Common Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Advanced methods
+
+=back
+
+=over 4
+
+=item SEE ALSO
+
+=item LICENSE
+
+=item AUTHOR
+
+=back
+
+=head2 autodiexception::system, autodie::exception::system - Exceptions
+from autodying system().
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item stringify
+
+=back
+
+=over 4
+
+=item LICENSE
+
+=item AUTHOR
+
+=back
+
+=head2 autodie::hints - Provide hints about user subroutines to autodie
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Introduction
+
+=item What are hints?
+
+=item Example hints
+
+=back
+
+=item Manually setting hints from within your program
+
+=item Adding hints to your module
+
+=item Insisting on hints
+
+=back
+
+=over 4
+
+=item Diagnostics
+
+Attempts to set_hints_for unidentifiable subroutine, fail hints cannot be
+provided with either scalar or list hints for %s, %s hint missing for %s
+
+=item ACKNOWLEDGEMENTS
+
+=item AUTHOR
+
+=item LICENSE
+
+=item SEE ALSO
+
+=back
+
+=head2 autouse - postpone load of modules until a function is used
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item WARNING
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 base - Establish an ISA relationship with base classes at compile
+time
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item DIAGNOSTICS
+
+Base class package "%s" is empty, Class 'Foo' tried to inherit from itself
+
+=item HISTORY
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=back
+
+=head2 bigint - Transparent BigInteger support for Perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item use integer vs. use bigint
+
+=item Options
+
+a or accuracy, p or precision, t or trace, hex, oct, l, lib, try or only, v
+or version
+
+=item Math Library
+
+=item Internal Format
+
+=item Sign
+
+=item Methods
+
+inf(), NaN(), e, PI, bexp(), bpi(), upgrade(), in_effect()
+
+=item MATH LIBRARY
+
+=item Caveat
+
+=back
+
+=item CAVAETS
+
+in_effect(), hex()/oct()
+
+=item MODULES USED
+
+=item EXAMPLES
+
+=item LICENSE
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=back
+
+=head2 bignum - Transparent BigNumber support for Perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Options
+
+a or accuracy, p or precision, t or trace, l or lib, hex, oct, v or version
+
+=item Methods
+
+=item Caveats
+
+inf(), NaN(), e, PI(), bexp(), bpi(), upgrade(), in_effect()
+
+=item Math Library
+
+=item INTERNAL FORMAT
+
+=item SIGN
+
+=back
+
+=item CAVAETS
+
+in_effect(), hex()/oct()
+
+=item MODULES USED
+
+=item EXAMPLES
+
+=item LICENSE
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=back
+
+=head2 bigrat - Transparent BigNumber/BigRational support for Perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Modules Used
+
+=item Math Library
+
+=item Sign
+
+=item Methods
+
+inf(), NaN(), e, PI, bexp(), bpi(), upgrade(), in_effect()
+
+=item MATH LIBRARY
+
+=item Cavaet
+
+=item Options
+
+a or accuracy, p or precision, t or trace, l or lib, hex, oct, v or version
+
+=back
+
+=item CAVAETS
+
+in_effect(), hex()/oct()
+
+=item EXAMPLES
+
+ perl -Mbigrat -le 'print sqrt(33)'
+ perl -Mbigrat -le 'print 2*255'
+ perl -Mbigrat -le 'print 4.5+2*255'
+ perl -Mbigrat -le 'print 3/7 + 5/7 + 8/3'
+ perl -Mbigrat -le 'print 12->is_odd()';
+ perl -Mbignum=l,GMP -le 'print 7 ** 7777'
+
+=item LICENSE
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=back
+
+=head2 blib - Use MakeMaker's uninstalled version of a package
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 bytes - Perl pragma to force byte semantics rather than character
+semantics
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item LIMITATIONS
+
+=item SEE ALSO
+
+=back
+
+=head2 charnames - define character names for C<\N{named}> string literal
+escapes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item ALIASES
+
+=item CUSTOM ALIASES
+
+=over 4
+
+=item Anonymous hashes
+
+=item Alias file
+
+=item Alias shortcut
+
+=back
+
+=item charnames::viacode(code)
+
+=item charnames::vianame(name)
+
+=item CUSTOM TRANSLATORS
+
+=item ILLEGAL CHARACTERS
+
+=item BUGS
+
+=back
+
+=head2 constant - Perl pragma to declare constants
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=over 4
+
+=item List constants
+
+=item Defining multiple constants at once
+
+=item Magic constants
+
+=back
+
+=item TECHNICAL NOTES
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=item BUGS
+
+=item AUTHORS
+
+=item COPYRIGHT & LICENSE
+
+=back
+
+=head2 diagnostics, splain - produce verbose warning diagnostics
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item The C<diagnostics> Pragma
+
+=item The I<splain> Program
+
+=back
+
+=item EXAMPLES
+
+=item INTERNALS
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 encoding - allows you to write your script in non-ascii or non-utf8
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=over 4
+
+=item Literal Conversions
+
+=item PerlIO layers for C<STD(IN|OUT)>
+
+=item Implicit upgrading for byte strings
+
+=item Side effects
+
+=back
+
+=item FEATURES THAT REQUIRE 5.8.1
+
+"NON-EUC" doublebyte encodings, tr//, DATA pseudo-filehandle
+
+=item USAGE
+
+use encoding [I<ENCNAME>] ;, use encoding I<ENCNAME> [ STDIN =E<gt>
+I<ENCNAME_IN> ...] ;, use encoding I<ENCNAME> Filter=E<gt>1;, no encoding;
+
+=item The Filter Option
+
+=over 4
+
+=item Filter-related changes at Encode version 1.87
+
+=back
+
+=item CAVEATS
+
+=over 4
+
+=item NOT SCOPED
+
+=item DO NOT MIX MULTIPLE ENCODINGS
+
+=item tr/// with ranges
+
+Legend of characters above
+
+=back
+
+=item EXAMPLE - Greekperl
+
+=item KNOWN PROBLEMS
+
+literals in regex that are longer than 127 bytes, EBCDIC, format, Thread
+safety
+
+=over 4
+
+=item The Logic of :locale
+
+=back
+
+=item HISTORY
+
+=item SEE ALSO
+
+=back
+
+=head2 encoding::warnings - Warn on implicit encoding conversions
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overview of the problem
+
+=item Detecting the problem
+
+=item Solving the problem
+
+Upgrade both sides to unicode-strings, Downgrade both sides to
+byte-strings, Specify the encoding for implicit byte-string upgrading,
+PerlIO layers for B<STDIN> and B<STDOUT>, Literal conversions, Implicit
+upgrading for byte-strings
+
+=back
+
+=item CAVEATS
+
+=back
+
+=over 4
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 feature - Perl pragma to enable new syntactic features
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Lexical effect
+
+=item C<no feature>
+
+=item The 'switch' feature
+
+=item The 'say' feature
+
+=item the 'state' feature
+
+=back
+
+=item FEATURE BUNDLES
+
+=item IMPLICIT LOADING
+
+=back
+
+=head2 fields - compile-time class fields
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+new, phash
+
+=item SEE ALSO
+
+=back
+
+=head2 filetest - Perl pragma to control the filetest permission operators
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Consider this carefully
+
+=item The "access" sub-pragma
+
+=item Limitation with regard to C<_>
+
+=back
+
+=back
+
+=head2 if - C<use> a Perl module if a condition holds
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 integer - Perl pragma to use integer arithmetic instead of floating
+point
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 less - perl pragma to request less of something
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FOR MODULE AUTHORS
+
+=over 4
+
+=item C<< BOOLEAN = less->of( FEATURE ) >>
+
+=item C<< FEATURES = less->of() >>
+
+=back
+
+=item CAVEATS
+
+This probably does nothing, This works only on 5.10+
+
+=back
+
+=head2 lib - manipulate @INC at compile time
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Adding directories to @INC
+
+=item Deleting directories from @INC
+
+=item Restoring original @INC
+
+=back
+
+=item CAVEATS
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 locale - Perl pragma to use and avoid POSIX locales for built-in
+operations
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 open - perl pragma to set default PerlIO layers for input and output
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NONPERLIO FUNCTIONALITY
+
+=item IMPLEMENTATION DETAILS
+
+=item SEE ALSO
+
+=back
+
+=head2 ops - Perl pragma to restrict unsafe operations when compiling
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 overload - Package for overloading Perl operations
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Declaration of overloaded functions
+
+=item Calling Conventions for Binary Operations
+
+FALSE, TRUE, C<undef>
+
+=item Calling Conventions for Unary Operations
+
+=item Calling Conventions for Mutators
+
+C<++> and C<-->, C<x=> and other assignment versions
+
+=item Overloadable Operations
+
+I<Arithmetic operations>, I<Comparison operations>, I<Bit operations>,
+I<Increment and decrement>, I<Transcendental functions>, I<Boolean, string
+and numeric conversion>, I<Iteration>, I<Matching>, I<Dereferencing>,
+I<Special>
+
+=item Inheritance and overloading
+
+Strings as values of C<use overload> directive, Overloading of an operation
+is inherited by derived classes
+
+=back
+
+=item SPECIAL SYMBOLS FOR C<use overload>
+
+=over 4
+
+=item Last Resort
+
+=item Fallback
+
+C<undef>, TRUE, defined, but FALSE
+
+=item Copy Constructor
+
+B<Example>
+
+=back
+
+=item MAGIC AUTOGENERATION
+
+I<Assignment forms of arithmetic operations>, I<Conversion operations>,
+I<Increment and decrement>, C<abs($a)>, I<Unary minus>, I<Negation>,
+I<Concatenation>, I<Comparison operations>, I<Iterator>, I<Dereferencing>,
+I<Copy operator>
+
+=item Minimal set of overloaded operations
+
+=item Losing overloading
+
+=item Run-time Overloading
+
+=item Public functions
+
+overload::StrVal(arg), overload::Overloaded(arg), overload::Method(obj,op)
+
+=item Overloading constants
+
+integer, float, binary, q, qr
+
+=item IMPLEMENTATION
+
+=item Metaphor clash
+
+=item Cookbook
+
+=over 4
+
+=item Two-face scalars
+
+=item Two-face references
+
+=item Symbolic calculator
+
+=item I<Really> symbolic calculator
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item DIAGNOSTICS
+
+Odd number of arguments for overload::constant, `%s' is not an overloadable
+type, `%s' is not a code reference
+
+=item BUGS
+
+=back
+
+=head2 overloading - perl pragma to lexically control overloading
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<no overloading>, C<no overloading @ops>, C<use overloading>, C<use
+overloading @ops>
+
+=back
+
+=head2 parent - Establish an ISA relationship with base classes at compile
+time
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item DIAGNOSTICS
+
+Class 'Foo' tried to inherit from itself
+
+=item HISTORY
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=item AUTHORS AND CONTRIBUTORS
+
+=item MAINTAINER
+
+=item LICENSE
+
+=back
+
+=head2 sigtrap - Perl pragma to enable simple signal handling
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+=over 4
+
+=item SIGNAL HANDLERS
+
+B<stack-trace>, B<die>, B<handler> I<your-handler>
+
+=item SIGNAL LISTS
+
+B<normal-signals>, B<error-signals>, B<old-interface-signals>
+
+=item OTHER
+
+B<untrapped>, B<any>, I<signal>, I<number>
+
+=back
+
+=item EXAMPLES
+
+=back
+
+=head2 sort - perl pragma to control sort() behaviour
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEATS
+
+=back
+
+=head2 strict - Perl pragma to restrict unsafe constructs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<strict refs>, C<strict vars>, C<strict subs>
+
+=item HISTORY
+
+=back
+
+=head2 subs - Perl pragma to predeclare sub names
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 threadshared, threads::shared - Perl extension for sharing data
+structures between threads
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXPORT
+
+=item FUNCTIONS
+
+share VARIABLE, shared_clone REF, is_shared VARIABLE, lock VARIABLE,
+cond_wait VARIABLE, cond_wait CONDVAR, LOCKVAR, cond_timedwait VARIABLE,
+ABS_TIMEOUT, cond_timedwait CONDVAR, ABS_TIMEOUT, LOCKVAR, cond_signal
+VARIABLE, cond_broadcast VARIABLE
+
+=item OBJECTS
+
+=item NOTES
+
+=item BUGS AND LIMITATIONS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item LICENSE
+
+=back
+
+=head2 utf8 - Perl pragma to enable/disable UTF-8 (or UTF-EBCDIC) in source
+code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Utility functions
+
+$num_octets = utf8::upgrade($string), $success = utf8::downgrade($string[,
+FAIL_OK]), utf8::encode($string), $success = utf8::decode($string), $flag =
+utf8::is_utf8(STRING), $flag = utf8::valid(STRING)
+
+=back
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 vars - Perl pragma to predeclare global variable names (obsolete)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 version - Perl extension for Version Objects
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item TYPES OF VERSION OBJECTS
+
+Decimal Versions, Dotted Decimal Versions
+
+=item DECLARING VERSIONS
+
+=over 4
+
+=item How to convert a module from decimal to dotted-decimal
+
+=item How to C<declare()> a dotted-decimal version
+
+=back
+
+=item PARSING AND COMPARING VERSIONS
+
+=over 4
+
+=item How to C<parse()> a version
+
+=item How to compare version objects
+
+=back
+
+=item VERSION OBJECT DETAILS
+
+=over 4
+
+=item Equivalence between Decimal and Dotted-Decimal Versions
+
+=item Quoting rules
+
+=item What about v-strings?
+
+=item Alpha versions
+
+=back
+
+=item OBJECT METHODS
+
+=over 4
+
+=item is_alpha()
+
+=item is_qv()
+
+=item normal()
+
+=item numify()
+
+=item stringify()
+
+=back
+
+=item EXPORTED FUNCTIONS
+
+=over 4
+
+=item qv()
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 version::Internals, version::Internal - Perl extension for Version
+Objects
+
+=over 4
+
+=item DESCRIPTION
+
+=item What IS a version
+
+Decimal Versions, Dotted-Decimal Versions
+
+=over 4
+
+=item Decimal Versions
+
+=item Dotted-Decimal Versions
+
+=item Decimal Alpha Versions
+
+=back
+
+=item High level design
+
+=over 4
+
+=item version objects
+
+original, qv, alpha, version
+
+=item Replacement UNIVERSAL::VERSION
+
+=back
+
+=item Usage question
+
+=over 4
+
+=item Using modules that use version.pm
+
+Decimal versions always work, Dotted-Decimal version work sometimes
+
+=item Object Methods
+
+New Operator, qv(), Normal Form, Numification, Stringification, Comparison
+operators, Logical Operators
+
+=item Quoting
+
+=back
+
+=item SUBCLASSING
+
+=item EXPORT
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 vmsish - Perl pragma to control VMS-specific language features
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<vmsish status>, C<vmsish exit>, C<vmsish time>, C<vmsish hushed>
+
+=back
+
+=head2 warnings - Perl pragma to control optional warnings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+use warnings::register, warnings::enabled(), warnings::enabled($category),
+warnings::enabled($object), warnings::warn($message),
+warnings::warn($category, $message), warnings::warn($object, $message),
+warnings::warnif($message), warnings::warnif($category, $message),
+warnings::warnif($object, $message)
+
+=back
+
+=head2 warnings::register - warnings import function
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head1 MODULE DOCUMENTATION
+
+=head2 AnyDBM_File - provide framework for multiple DBMs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item DBM Comparisons
+
+[0], [1], [2], [3]
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 App::Prove - Implements the C<prove> command.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Attributes
+
+C<archive>, C<argv>, C<backwards>, C<blib>, C<color>, C<directives>,
+C<dry>, C<exec>, C<extension>, C<failures>, C<comments>, C<formatter>,
+C<harness>, C<ignore_exit>, C<includes>, C<jobs>, C<lib>, C<merge>,
+C<modules>, C<parse>, C<plugins>, C<quiet>, C<really_quiet>, C<recurse>,
+C<rules>, C<show_count>, C<show_help>, C<show_man>, C<show_version>,
+C<shuffle>, C<state>, C<state_class>, C<taint_fail>, C<taint_warn>,
+C<test_args>, C<timer>, C<verbose>, C<warnings_fail>, C<warnings_warn>
+
+=back
+
+=over 4
+
+=item PLUGINS
+
+=over 4
+
+=item Sample Plugin
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 App::Prove::State - State storage for the C<prove> command.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+C<store>, C<extension> (optional), C<result_class> (optional)
+
+=back
+
+=back
+
+=over 4
+
+=item C<result_class>
+
+=back
+
+=over 4
+
+=item C<extension>
+
+=back
+
+=over 4
+
+=item C<results>
+
+=back
+
+=over 4
+
+=item C<commit>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+C<last>, C<failed>, C<passed>, C<all>, C<hot>, C<todo>, C<slow>, C<fast>,
+C<new>, C<old>, C<save>
+
+=back
+
+=head2 App::Prove::State::Result - Individual test suite results.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item C<state_version>
+
+=back
+
+=over 4
+
+=item C<test_class>
+
+=back
+
+=head2 App::Prove::State::Result::Test - Individual test results.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 Archive::Extract - A generic archive extracting mechanism
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item $ae = Archive::Extract->new(archive => '/path/to/archive',[type =>
+TYPE])
+
+tar, tgz, gz, Z, zip, bz2, tbz, lzma
+
+=back
+
+=back
+
+=over 4
+
+=item $ae->extract( [to => '/output/path'] )
+
+$ae->extract_path, $ae->files
+
+=back
+
+=over 4
+
+=item ACCESSORS
+
+=over 4
+
+=item $ae->error([BOOL])
+
+=item $ae->extract_path
+
+=item $ae->files
+
+=item $ae->archive
+
+=item $ae->type
+
+=item $ae->types
+
+=back
+
+=back
+
+=over 4
+
+=item $ae->is_tgz
+
+=item $ae->is_tar
+
+=item $ae->is_gz
+
+=item $ae->is_Z
+
+=item $ae->is_zip
+
+=item $ae->is_lzma
+
+=back
+
+=over 4
+
+=item $ae->bin_tar
+
+=item $ae->bin_gzip
+
+=item $ae->bin_unzip
+
+=item $ae->bin_unlzma
+
+=back
+
+=over 4
+
+=item $bool = $ae->have_old_bunzip2
+
+=back
+
+=over 4
+
+=item HOW IT WORKS
+
+=item CAVEATS
+
+=over 4
+
+=item File Extensions
+
+=item Supporting Very Large Files
+
+=item Bunzip2 support of arbitrary extensions.
+
+=back
+
+=item GLOBAL VARIABLES
+
+=over 4
+
+=item $Archive::Extract::DEBUG
+
+=item $Archive::Extract::WARN
+
+=item $Archive::Extract::PREFER_BIN
+
+=back
+
+=item TODO / CAVEATS
+
+Mime magic support, Thread safety
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Archive::Tar - module for manipulations of tar archives
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Object Methods
+
+=over 4
+
+=item Archive::Tar->new( [$file, $compressed] )
+
+=back
+
+=back
+
+=over 4
+
+=item $tar->read ( $filename|$handle, [$compressed, {opt => 'val'}] )
+
+limit, filter, extract
+
+=back
+
+=over 4
+
+=item $tar->contains_file( $filename )
+
+=back
+
+=over 4
+
+=item $tar->extract( [@filenames] )
+
+=back
+
+=over 4
+
+=item $tar->extract_file( $file, [$extract_path] )
+
+=back
+
+=over 4
+
+=item $tar->list_files( [\@properties] )
+
+=back
+
+=over 4
+
+=item $tar->get_files( [@filenames] )
+
+=back
+
+=over 4
+
+=item $tar->get_content( $file )
+
+=back
+
+=over 4
+
+=item $tar->replace_content( $file, $content )
+
+=back
+
+=over 4
+
+=item $tar->rename( $file, $new_name )
+
+=back
+
+=over 4
+
+=item $tar->remove (@filenamelist)
+
+=back
+
+=over 4
+
+=item $tar->clear
+
+=back
+
+=over 4
+
+=item $tar->write ( [$file, $compressed, $prefix] )
+
+=back
+
+=over 4
+
+=item $tar->add_files( @filenamelist )
+
+=back
+
+=over 4
+
+=item $tar->add_data ( $filename, $data, [$opthashref] )
+
+FILE, HARDLINK, SYMLINK, CHARDEV, BLOCKDEV, DIR, FIFO, SOCKET
+
+=back
+
+=over 4
+
+=item $tar->error( [$BOOL] )
+
+=back
+
+=over 4
+
+=item $tar->setcwd( $cwd );
+
+=back
+
+=over 4
+
+=item Class Methods
+
+=over 4
+
+=item Archive::Tar->create_archive($file, $compressed, @filelist)
+
+=back
+
+=back
+
+=over 4
+
+=item Archive::Tar->iter( $filename, [ $compressed, {opt => $val} ] )
+
+=back
+
+=over 4
+
+=item Archive::Tar->list_archive($file, $compressed, [\@properties])
+
+=back
+
+=over 4
+
+=item Archive::Tar->extract_archive($file, $compressed)
+
+=back
+
+=over 4
+
+=item $bool = Archive::Tar->has_io_string
+
+=back
+
+=over 4
+
+=item $bool = Archive::Tar->has_perlio
+
+=back
+
+=over 4
+
+=item $bool = Archive::Tar->has_zlib_support
+
+=back
+
+=over 4
+
+=item $bool = Archive::Tar->has_bzip2_support
+
+=back
+
+=over 4
+
+=item Archive::Tar->can_handle_compressed_files
+
+=back
+
+=over 4
+
+=item GLOBAL VARIABLES
+
+=over 4
+
+=item $Archive::Tar::FOLLOW_SYMLINK
+
+=item $Archive::Tar::CHOWN
+
+=item $Archive::Tar::CHMOD
+
+=item $Archive::Tar::SAME_PERMISSIONS
+
+=item $Archive::Tar::DO_NOT_USE_PREFIX
+
+=item $Archive::Tar::DEBUG
+
+=item $Archive::Tar::WARN
+
+=item $Archive::Tar::error
+
+=item $Archive::Tar::INSECURE_EXTRACT_MODE
+
+=item $Archive::Tar::HAS_PERLIO
+
+=item $Archive::Tar::HAS_IO_STRING
+
+=back
+
+=item FAQ
+
+What's the minimum perl version required to run Archive::Tar?, Isn't
+Archive::Tar slow?, Isn't Archive::Tar heavier on memory than /bin/tar?,
+Can you lazy-load data instead?, How much memory will an X kb tar file
+need?, What do you do with unsupported filetypes in an archive?, I'm using
+WinZip, or some other non-POSIX client, and files are not being extracted
+properly!, How do I extract only files that have property X from an
+archive?, How do I access .tar.Z files?, How do I handle Unicode strings?
+
+=item CAVEATS
+
+=item TODO
+
+Check if passed in handles are open for read/write, Allow archives to be
+passed in as string, Facilitate processing an opened filehandle of a
+compressed archive
+
+=item SEE ALSO
+
+The GNU tar specification, The PAX format specication, A comparison of GNU
+and POSIX tar standards;
+C<http://www.delorie.com/gnu/docs/tar/tar_114.html>, GNU tar intends to
+switch to POSIX compatibility, A Comparison between various tar
+implementations
+
+=item AUTHOR
+
+=item ACKNOWLEDGEMENTS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Archive::Tar::File - a subclass for in-memory extracted file from
+Archive::Tar
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Accessors
+
+name, mode, uid, gid, size, mtime, chksum, type, linkname, magic, version,
+uname, gname, devmajor, devminor, prefix, raw
+
+=back
+
+=item Methods
+
+=over 4
+
+=item Archive::Tar::File->new( file => $path )
+
+=item Archive::Tar::File->new( data => $path, $data, $opt )
+
+=item Archive::Tar::File->new( chunk => $chunk )
+
+=back
+
+=back
+
+=over 4
+
+=item $bool = $file->extract( [ $alternative_name ] )
+
+=back
+
+=over 4
+
+=item $path = $file->full_path
+
+=back
+
+=over 4
+
+=item $bool = $file->validate
+
+=back
+
+=over 4
+
+=item $bool = $file->has_content
+
+=back
+
+=over 4
+
+=item $content = $file->get_content
+
+=back
+
+=over 4
+
+=item $cref = $file->get_content_by_ref
+
+=back
+
+=over 4
+
+=item $bool = $file->replace_content( $content )
+
+=back
+
+=over 4
+
+=item $bool = $file->rename( $new_name )
+
+=back
+
+=over 4
+
+=item Convenience methods
+
+$file->is_file, $file->is_dir, $file->is_hardlink, $file->is_symlink,
+$file->is_chardev, $file->is_blockdev, $file->is_fifo, $file->is_socket,
+$file->is_longlink, $file->is_label, $file->is_unknown
+
+=back
+
+=head2 Attribute-Handlers::lib::Attribute::Handlers, Attribute::Handlers -
+Simpler definition of attribute handlers
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+[0], [1], [2], [3], [4], [5], [6], [7]
+
+=over 4
+
+=item Typed lexicals
+
+=item Type-specific attribute handlers
+
+=item Non-interpretive attribute handlers
+
+=item Phase-specific attribute handlers
+
+=item Attributes as C<tie> interfaces
+
+=back
+
+=item EXAMPLES
+
+=item UTILITY FUNCTIONS
+
+findsym
+
+=item DIAGNOSTICS
+
+C<Bad attribute type: ATTR(%s)>, C<Attribute handler %s doesn't handle %s
+attributes>, C<Declaration of %s attribute in package %s may clash with
+future reserved word>, C<Can't have two ATTR specifiers on one subroutine>,
+C<Can't autotie a %s>, C<Internal error: %s symbol went missing>, C<Won't
+be able to apply END handler>
+
+=item AUTHOR
+
+=item BUGS
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Attribute::Handlers - Simpler definition of attribute handlers
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+[0], [1], [2], [3], [4], [5], [6], [7]
+
+=over 4
+
+=item Typed lexicals
+
+=item Type-specific attribute handlers
+
+=item Non-interpretive attribute handlers
+
+=item Phase-specific attribute handlers
+
+=item Attributes as C<tie> interfaces
+
+=back
+
+=item EXAMPLES
+
+=item UTILITY FUNCTIONS
+
+findsym
+
+=item DIAGNOSTICS
+
+C<Bad attribute type: ATTR(%s)>, C<Attribute handler %s doesn't handle %s
+attributes>, C<Declaration of %s attribute in package %s may clash with
+future reserved word>, C<Can't have two ATTR specifiers on one subroutine>,
+C<Can't autotie a %s>, C<Internal error: %s symbol went missing>, C<Won't
+be able to apply END handler>
+
+=item AUTHOR
+
+=item BUGS
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 AutoLoader - load subroutines only on demand
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Subroutine Stubs
+
+=item Using B<AutoLoader>'s AUTOLOAD Subroutine
+
+=item Overriding B<AutoLoader>'s AUTOLOAD Subroutine
+
+=item Package Lexicals
+
+=item Not Using AutoLoader
+
+=item B<AutoLoader> vs. B<SelfLoader>
+
+=back
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 AutoSplit - split a package for autoloading
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$keep, $check, $modtime
+
+=over 4
+
+=item Multiple packages
+
+=back
+
+=item DIAGNOSTICS
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 B - The Perl Compiler
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OVERVIEW
+
+=item Utility Functions
+
+=over 4
+
+=item Functions Returning C<B::SV>, C<B::AV>, C<B::HV>, and C<B::CV>
+objects
+
+sv_undef, sv_yes, sv_no, svref_2object(SVREF), amagic_generation, init_av,
+check_av, unitcheck_av, begin_av, end_av, comppadlist, regex_padav, main_cv
+
+=item Functions for Examining the Symbol Table
+
+walksymtable(SYMREF, METHOD, RECURSE, PREFIX)
+
+=item Functions Returning C<B::OP> objects or for walking op trees
+
+main_root, main_start, walkoptree(OP, METHOD), walkoptree_debug(DEBUG)
+
+=item Miscellaneous Utility Functions
+
+ppname(OPNUM), hash(STR), cast_I32(I), minus_c, cstring(STR),
+perlstring(STR), class(OBJ), threadsv_names
+
+=item Exported utility variabiles
+
+@optype, @specialsv_name
+
+=back
+
+=item OVERVIEW OF CLASSES
+
+=over 4
+
+=item SV-RELATED CLASSES
+
+=item B::SV Methods
+
+REFCNT, FLAGS, object_2svref
+
+=item B::IV Methods
+
+IV, IVX, UVX, int_value, needs64bits, packiv
+
+=item B::NV Methods
+
+NV, NVX
+
+=item B::RV Methods
+
+RV
+
+=item B::PV Methods
+
+PV, RV, PVX
+
+=item B::PVMG Methods
+
+MAGIC, SvSTASH
+
+=item B::MAGIC Methods
+
+MOREMAGIC, precomp, PRIVATE, TYPE, FLAGS, OBJ, PTR, REGEX
+
+=item B::PVLV Methods
+
+TARGOFF, TARGLEN, TYPE, TARG
+
+=item B::BM Methods
+
+USEFUL, PREVIOUS, RARE, TABLE
+
+=item B::GV Methods
+
+is_empty, NAME, SAFENAME, STASH, SV, IO, FORM, AV, HV, EGV, CV, CVGEN,
+LINE, FILE, FILEGV, GvREFCNT, FLAGS
+
+=item B::IO Methods
+
+LINES, PAGE, PAGE_LEN, LINES_LEFT, TOP_NAME, TOP_GV, FMT_NAME, FMT_GV,
+BOTTOM_NAME, BOTTOM_GV, SUBPROCESS, IoTYPE, IoFLAGS, IsSTD
+
+=item B::AV Methods
+
+FILL, MAX, ARRAY, ARRAYelt, OFF, AvFLAGS
+
+=item B::CV Methods
+
+STASH, START, ROOT, GV, FILE, DEPTH, PADLIST, OUTSIDE, OUTSIDE_SEQ, XSUB,
+XSUBANY, CvFLAGS, const_sv
+
+=item B::HV Methods
+
+FILL, MAX, KEYS, RITER, NAME, ARRAY, PMROOT
+
+=item OP-RELATED CLASSES
+
+=item B::OP Methods
+
+next, sibling, name, ppaddr, desc, targ, type, opt, flags, private, spare
+
+=item B::UNOP METHOD
+
+first
+
+=item B::BINOP METHOD
+
+last
+
+=item B::LOGOP METHOD
+
+other
+
+=item B::LISTOP METHOD
+
+children
+
+=item B::PMOP Methods
+
+pmreplroot, pmreplstart, pmnext, pmregexp, pmflags, extflags, precomp,
+pmoffset
+
+=item B::SVOP METHOD
+
+sv, gv
+
+=item B::PADOP METHOD
+
+padix
+
+=item B::PVOP METHOD
+
+pv
+
+=item B::LOOP Methods
+
+redoop, nextop, lastop
+
+=item B::COP Methods
+
+label, stash, stashpv, file, cop_seq, arybase, line, warnings, io, hints,
+hints_hash
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 B::Concise - Walk Perl syntax tree, printing concise info about ops
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLE
+
+=item OPTIONS
+
+=over 4
+
+=item Options for Opcode Ordering
+
+B<-basic>, B<-exec>, B<-tree>
+
+=item Options for Line-Style
+
+B<-concise>, B<-terse>, B<-linenoise>, B<-debug>, B<-env>
+
+=item Options for tree-specific formatting
+
+B<-compact>, B<-loose>, B<-vt>, B<-ascii>
+
+=item Options controlling sequence numbering
+
+B<-base>I<n>, B<-bigendian>, B<-littleendian>
+
+=item Other options
+
+B<-src>, B<-stash="somepackage">, B<-main>, B<-nomain>, B<-nobanner>,
+B<-banner>, B<-banneris> => subref
+
+=item Option Stickiness
+
+=back
+
+=item ABBREVIATIONS
+
+=over 4
+
+=item OP class abbreviations
+
+=item OP flags abbreviations
+
+=back
+
+=item FORMATTING SPECIFICATIONS
+
+=over 4
+
+=item Special Patterns
+
+B<(x(>I<exec_text>B<;>I<basic_text>B<)x)>, B<(*(>I<text>B<)*)>,
+B<(*(>I<text1>B<;>I<text2>B<)*)>, B<(?(>I<text1>B<#>I<var>I<Text2>B<)?)>,
+B<~>
+
+=item # Variables
+
+B<#>I<var>, B<#>I<var>I<N>, B<#>I<Var>, B<#addr>, B<#arg>, B<#class>,
+B<#classsym>, B<#coplabel>, B<#exname>, B<#extarg>, B<#firstaddr>,
+B<#flags>, B<#flagval>, B<#hints>, B<#hintsval>, B<#hyphseq>, B<#label>,
+B<#lastaddr>, B<#name>, B<#NAME>, B<#next>, B<#nextaddr>, B<#noise>,
+B<#private>, B<#privval>, B<#seq>, B<#seqnum>, B<#opt>, B<#sibaddr>,
+B<#svaddr>, B<#svclass>, B<#svval>, B<#targ>, B<#targarg>, B<#targarglife>,
+B<#typenum>
+
+=back
+
+=item One-Liner Command tips
+
+perl -MO=Concise,bar foo.pl, perl -MDigest::MD5=md5 -MO=Concise,md5 -e1,
+perl -MPOSIX -MO=Concise,_POSIX_ARG_MAX -e1, perl -MPOSIX -MO=Concise,a -e
+'print _POSIX_SAVED_IDS', perl -MPOSIX -MO=Concise,a -e 'sub
+a{_POSIX_SAVED_IDS}', perl -MB::Concise -e
+'B::Concise::compile("-exec","-src", \%B::Concise::)->()'
+
+=item Using B::Concise outside of the O framework
+
+=over 4
+
+=item Example: Altering Concise Renderings
+
+=item set_style()
+
+=item set_style_standard($name)
+
+=item add_style()
+
+=item add_callback()
+
+=item Running B::Concise::compile()
+
+=item B::Concise::reset_sequence()
+
+=item Errors
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 B::Debug - Walk Perl syntax tree, printing debug info about ops
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+=item Changes
+
+=item AUTHOR
+
+=item LICENSE
+
+=back
+
+=head2 B::Deparse - Perl compiler backend to produce perl code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+B<-d>, B<-f>I<FILE>, B<-l>, B<-p>, B<-P>, B<-q>, B<-s>I<LETTERS>, B<C>,
+B<i>I<NUMBER>, B<T>, B<v>I<STRING>B<.>, B<-x>I<LEVEL>
+
+=item USING B::Deparse AS A MODULE
+
+=over 4
+
+=item Synopsis
+
+=item Description
+
+=item new
+
+=item ambient_pragmas
+
+strict, $[, bytes, utf8, integer, re, warnings, hint_bits, warning_bits,
+%^H
+
+=item coderef2text
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 B::Lint - Perl lint
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS AND LINT CHECKS
+
+B<magic-diamond>, B<context>, B<implicit-read> and B<implicit-write>,
+B<bare-subs>, B<dollar-underscore>, B<private-names>, B<undefined-subs>,
+B<regexp-variables>, B<all>, B<none>
+
+=item NON LINT-CHECK OPTIONS
+
+B<-u Package>
+
+=item EXTENDING LINT
+
+=item TODO
+
+while(<FH>) stomps $_, strict oo, unchecked system calls, more tests,
+validate against older perls
+
+=item BUGS
+
+=item AUTHOR
+
+=item ACKNOWLEDGEMENTS
+
+=back
+
+=head2 B::Lint::Debug - Adds debugging stringification to B::
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 B::O, O - Generic interface to Perl Compiler backends
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONVENTIONS
+
+=item IMPLEMENTATION
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 B::Showlex - Show lexical variables used in functions or files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=over 4
+
+=item OPTIONS
+
+=back
+
+=item SEE ALSO
+
+=item TODO
+
+=item AUTHOR
+
+=back
+
+=head2 B::Terse - Walk Perl syntax tree, printing terse info about ops
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 B::Xref - Generates cross reference reports for Perl programs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+C<-oFILENAME>, C<-r>, C<-d>, C<-D[tO]>
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 Benchmark - benchmark running times of Perl code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Methods
+
+new, debug, iters
+
+=item Standard Exports
+
+timeit(COUNT, CODE), timethis ( COUNT, CODE, [ TITLE, [ STYLE ]] ),
+timethese ( COUNT, CODEHASHREF, [ STYLE ] ), timediff ( T1, T2 ), timestr (
+TIMEDIFF, [ STYLE, [ FORMAT ] ] )
+
+=item Optional Exports
+
+clearcache ( COUNT ), clearallcache ( ), cmpthese ( COUNT, CODEHASHREF, [
+STYLE ] ), cmpthese ( RESULTSHASHREF, [ STYLE ] ), countit(TIME, CODE),
+disablecache ( ), enablecache ( ), timesum ( T1, T2 )
+
+=item :hireswallclock
+
+=back
+
+=item NOTES
+
+=item EXAMPLES
+
+=item INHERITANCE
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item MODIFICATION HISTORY
+
+=back
+
+=head2 CGI - Handle Common Gateway Interface requests and responses
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item PROGRAMMING STYLE
+
+=item CALLING CGI.PM ROUTINES
+
+=item CREATING A NEW QUERY OBJECT (OBJECT-ORIENTED STYLE):
+
+=item CREATING A NEW QUERY OBJECT FROM AN INPUT FILE
+
+=item FETCHING A LIST OF KEYWORDS FROM THE QUERY:
+
+=item FETCHING THE NAMES OF ALL THE PARAMETERS PASSED TO YOUR SCRIPT:
+
+=item FETCHING THE VALUE OR VALUES OF A SINGLE NAMED PARAMETER:
+
+=item SETTING THE VALUE(S) OF A NAMED PARAMETER:
+
+=item APPENDING ADDITIONAL VALUES TO A NAMED PARAMETER:
+
+=item IMPORTING ALL PARAMETERS INTO A NAMESPACE:
+
+=item DELETING A PARAMETER COMPLETELY:
+
+=item DELETING ALL PARAMETERS:
+
+=item HANDLING NON-URLENCODED ARGUMENTS
+
+=item DIRECT ACCESS TO THE PARAMETER LIST:
+
+=item FETCHING THE PARAMETER LIST AS A HASH:
+
+=item SAVING THE STATE OF THE SCRIPT TO A FILE:
+
+=item RETRIEVING CGI ERRORS
+
+=item USING THE FUNCTION-ORIENTED INTERFACE
+
+B<:cgi>, B<:form>, B<:html2>, B<:html3>, B<:html4>, B<:netscape>, B<:html>,
+B<:standard>, B<:all>
+
+=item PRAGMAS
+
+-any, -compile, -nosticky, -tabindex, -no_undef_params, -no_xhtml, -utf8,
+-nph, -newstyle_urls, -oldstyle_urls, -autoload, -no_debug, -debug,
+-private_tempfiles
+
+=item SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS
+
+1. start_table() (generates a <table> tag), 2. end_table() (generates a
+</table> tag), 3. start_ul() (generates a <ul> tag), 4. end_ul() (generates
+a </ul> tag)
+
+=back
+
+=item GENERATING DYNAMIC DOCUMENTS
+
+=over 4
+
+=item CREATING A STANDARD HTTP HEADER:
+
+=item GENERATING A REDIRECTION HEADER
+
+=item CREATING THE HTML DOCUMENT HEADER
+
+B<Parameters:>, 4, 5, 6..
+
+=item ENDING THE HTML DOCUMENT:
+
+=item CREATING A SELF-REFERENCING URL THAT PRESERVES STATE INFORMATION:
+
+=item OBTAINING THE SCRIPT'S URL
+
+B<-absolute>, B<-relative>, B<-full>, B<-path> (B<-path_info>), B<-query>
+(B<-query_string>), B<-base>, B<-rewrite>
+
+=item MIXING POST AND URL PARAMETERS
+
+=back
+
+=item CREATING STANDARD HTML ELEMENTS:
+
+=over 4
+
+=item PROVIDING ARGUMENTS TO HTML SHORTCUTS
+
+=item THE DISTRIBUTIVE PROPERTY OF HTML SHORTCUTS
+
+=item HTML SHORTCUTS AND LIST INTERPOLATION
+
+=item NON-STANDARD HTML SHORTCUTS
+
+=item AUTOESCAPING HTML
+
+$escaped_string = escapeHTML("unescaped string");, $charset =
+charset([$charset]);, $flag = autoEscape([$flag]);
+
+=item PRETTY-PRINTING HTML
+
+=back
+
+=item CREATING FILL-OUT FORMS:
+
+=over 4
+
+=item CREATING AN ISINDEX TAG
+
+=item STARTING AND ENDING A FORM
+
+B<application/x-www-form-urlencoded>, B<multipart/form-data>
+
+=item FORM ELEMENTS
+
+B<-name>, B<-value>, B<-values>, B<-tabindex>, B<-id>, B<-override>,
+B<-onChange>, B<-onFocus>, B<-onBlur>, B<-onMouseOver>, B<-onMouseOut>,
+B<-onSelect>
+
+=item CREATING A TEXT FIELD
+
+B<Parameters>
+
+=item CREATING A BIG TEXT FIELD
+
+=item CREATING A PASSWORD FIELD
+
+=item CREATING A FILE UPLOAD FIELD
+
+B<Parameters>
+
+=item CREATING A POPUP MENU
+
+=item CREATING AN OPTION GROUP
+
+=item CREATING A SCROLLING LIST
+
+B<Parameters:>
+
+=item CREATING A GROUP OF RELATED CHECKBOXES
+
+B<Parameters:>
+
+=item CREATING A STANDALONE CHECKBOX
+
+B<Parameters:>
+
+=item CREATING A RADIO BUTTON GROUP
+
+B<Parameters:>
+
+=item CREATING A SUBMIT BUTTON
+
+B<Parameters:>
+
+=item CREATING A RESET BUTTON
+
+=item CREATING A DEFAULT BUTTON
+
+=item CREATING A HIDDEN FIELD
+
+B<Parameters:>
+
+=item CREATING A CLICKABLE IMAGE BUTTON
+
+B<Parameters:>, 3. The third option (-align, optional) is an alignment
+type, and may be TOP, BOTTOM or MIDDLE
+
+=item CREATING A JAVASCRIPT ACTION BUTTON
+
+=back
+
+=item HTTP COOKIES
+
+1. an expiration time, 2. a domain, 3. a path, 4. a "secure" flag,
+B<-name>, B<-value>, B<-path>, B<-domain>, B<-expires>, B<-secure>
+
+=item WORKING WITH FRAMES
+
+1. Create a <Frameset> document, 2. Specify the destination for the
+document in the HTTP header, 3. Specify the destination for the document in
+the <form> tag
+
+=item SUPPORT FOR JAVASCRIPT
+
+B<onLoad>, B<onUnload>, B<onSubmit>, B<onClick>, B<onChange>, B<onFocus>,
+B<onBlur>, B<onSelect>, B<onMouseOver>, B<onMouseOut>
+
+=item LIMITED SUPPORT FOR CASCADING STYLE SHEETS
+
+=item DEBUGGING
+
+=over 4
+
+=item DUMPING OUT ALL THE NAME/VALUE PAIRS
+
+=back
+
+=item FETCHING ENVIRONMENT VARIABLES
+
+B<Accept()>, B<raw_cookie()>, B<user_agent()>, B<path_info()>,
+B<path_translated()>, B<remote_host()>, B<script_name()> Return the script
+name as a partial URL, for self-refering scripts, B<referer()>, B<auth_type
+()>, B<server_name ()>, B<virtual_host ()>, B<server_port ()>,
+B<virtual_port ()>, B<server_software ()>, B<remote_user ()>, B<user_name
+()>, B<request_method()>, B<content_type()>, B<http()>, B<https()>
+
+=item USING NPH SCRIPTS
+
+In the B<use> statement, By calling the B<nph()> method:, By using B<-nph>
+parameters
+
+=item Server Push
+
+multipart_init(), multipart_start(), multipart_end(), multipart_final()
+
+=item Avoiding Denial of Service Attacks
+
+B<$CGI::POST_MAX>, B<$CGI::DISABLE_UPLOADS>, B<1. On a script-by-script
+basis>, B<2. Globally for all scripts>
+
+=item COMPATIBILITY WITH CGI-LIB.PL
+
+=item AUTHOR INFORMATION
+
+=item CREDITS
+
+Matt Heffron (heffron@falstaff.css.beckman.com), James Taylor
+(james.taylor@srs.gov), Scott Anguish <sanguish@digifix.com>, Mike Jewell
+(mlj3u@virginia.edu), Timothy Shimmin (tes@kbs.citri.edu.au), Joergen Haegg
+(jh@axis.se), Laurent Delfosse (delfosse@delfosse.com), Richard Resnick
+(applepi1@aol.com), Craig Bishop (csb@barwonwater.vic.gov.au), Tony Curtis
+(tc@vcpc.univie.ac.at), Tim Bunce (Tim.Bunce@ig.co.uk), Tom Christiansen
+(tchrist@convex.com), Andreas Koenig (k@franz.ww.TU-Berlin.DE), Tim
+MacKenzie (Tim.MacKenzie@fulcrum.com.au), Kevin B. Hendricks
+(kbhend@dogwood.tyler.wm.edu), Stephen Dahmen (joyfire@inxpress.net), Ed
+Jordan (ed@fidalgo.net), David Alan Pisoni (david@cnation.com), Doug
+MacEachern (dougm@opengroup.org), Robin Houston (robin@oneworld.org),
+...and many many more..
+
+=item A COMPLETE EXAMPLE OF A SIMPLE FORM-BASED SCRIPT
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Apache - Backward compatibility module for CGI.pm
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item AUTHOR INFORMATION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Carp, B<CGI::Carp> - CGI routines for writing to the HTTPD (or
+other) error log
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item REDIRECTING ERROR MESSAGES
+
+=item MAKING PERL ERRORS APPEAR IN THE BROWSER WINDOW
+
+=over 4
+
+=item Changing the default message
+
+=back
+
+=item DOING MORE THAN PRINTING A MESSAGE IN THE EVENT OF PERL ERRORS
+
+=item MAKING WARNINGS APPEAR AS HTML COMMENTS
+
+=item OVERRIDING THE NAME OF THE PROGRAM
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Cookie - Interface to Netscape Cookies
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USING CGI::Cookie
+
+B<1. expiration date>, B<2. domain>, B<3. path>, B<4. secure flag>, B<4.
+httponly flag>
+
+=over 4
+
+=item Creating New Cookies
+
+=item Sending the Cookie to the Browser
+
+=item Recovering Previous Cookies
+
+=item Manipulating Cookies
+
+B<name()>, B<value()>, B<domain()>, B<path()>, B<expires()>
+
+=back
+
+=item AUTHOR INFORMATION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Fast - CGI Interface for Fast CGI
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OTHER PIECES OF THE PUZZLE
+
+=item WRITING FASTCGI PERL SCRIPTS
+
+=item INSTALLING FASTCGI SCRIPTS
+
+=item USING FASTCGI SCRIPTS AS CGI SCRIPTS
+
+=item EXTERNAL FASTCGI SERVER INVOCATION
+
+FCGI_SOCKET_PATH, FCGI_LISTEN_QUEUE
+
+=item CAVEATS
+
+=item AUTHOR INFORMATION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Pretty - module to produce nicely formatted HTML code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Tags that won't be formatted
+
+=item Customizing the Indenting
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Push - Simple Interface to Server Push
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USING CGI::Push
+
+-next_page, -last_page, -type, -delay, -cookie, -target, -expires, -nph
+
+=over 4
+
+=item Heterogeneous Pages
+
+=item Changing the Page Delay on the Fly
+
+=back
+
+=item INSTALLING CGI::Push SCRIPTS
+
+=item AUTHOR INFORMATION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Switch - Backward compatibility module for defunct CGI::Switch
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item AUTHOR INFORMATION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Util - Internal utilities used by CGI module
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR INFORMATION
+
+=item SEE ALSO
+
+=back
+
+=head2 CORE - Pseudo-namespace for Perl's core routines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OVERRIDING CORE FUNCTIONS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 CPAN - query, download and build perl modules from CPAN sites
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item CPAN::shell([$prompt, $command]) Starting Interactive Mode
+
+Searching for authors, bundles, distribution files and modules, C<get>,
+C<make>, C<test>, C<install>, C<clean> modules or distributions, C<readme>,
+C<perldoc>, C<look> module or distribution, C<ls> author, C<ls>
+globbing_expression, C<failed>, Persistence between sessions, The C<force>
+and the C<fforce> pragma, Lockfile, Signals
+
+=item CPAN::Shell
+
+=item autobundle
+
+=item hosts
+
+=item mkmyconfig
+
+=item recent ***EXPERIMENTAL COMMAND***
+
+=item recompile
+
+=item report Bundle|Distribution|Module
+
+=item smoke ***EXPERIMENTAL COMMAND***
+
+=item upgrade [Module|/Regex/]...
+
+=item The four C<CPAN::*> Classes: Author, Bundle, Module, Distribution
+
+=item Integrating local directories
+
+=item Redirection
+
+=back
+
+=item CONFIGURATION
+
+completion support, displaying some help: o conf help, displaying current
+values: o conf [KEY], changing of scalar values: o conf KEY VALUE, changing
+of list values: o conf KEY SHIFT|UNSHIFT|PUSH|POP|SPLICE|LIST, reverting to
+saved: o conf defaults, saving the config: o conf commit
+
+=over 4
+
+=item Config Variables
+
+C<o conf E<lt>scalar optionE<gt>>, C<o conf E<lt>scalar optionE<gt>
+E<lt>valueE<gt>>, C<o conf E<lt>list optionE<gt>>, C<o conf E<lt>list
+optionE<gt> [shift|pop]>, C<o conf E<lt>list optionE<gt>
+[unshift|push|splice] E<lt>listE<gt>>, interactive editing: o conf init
+[MATCH|LIST]
+
+=item CPAN::anycwd($path): Note on config variable getcwd
+
+cwd, getcwd, fastcwd, backtickcwd
+
+=item Note on the format of the urllist parameter
+
+=item The urllist parameter has CD-ROM support
+
+=item Maintaining the urllist parameter
+
+=item The C<requires> and C<build_requires> dependency declarations
+
+=item Configuration for individual distributions (I<Distroprefs>)
+
+=item Filenames
+
+=item Fallback Data::Dumper and Storable
+
+=item Blueprint
+
+=item Language Specs
+
+comment [scalar], cpanconfig [hash], depends [hash] *** EXPERIMENTAL
+FEATURE ***, disabled [boolean], features [array] *** EXPERIMENTAL FEATURE
+***, goto [string], install [hash], make [hash], match [hash], patches
+[array], pl [hash], test [hash]
+
+=item Processing Instructions
+
+args [array], commandline, eexpect [hash], env [hash], expect [array]
+
+=item Schema verification with C<Kwalify>
+
+=item Example Distroprefs Files
+
+=back
+
+=item PROGRAMMER'S INTERFACE
+
+expand($type,@things), expandany(@things), Programming Examples
+
+=over 4
+
+=item Methods in the other Classes
+
+CPAN::Author::as_glimpse(), CPAN::Author::as_string(),
+CPAN::Author::email(), CPAN::Author::fullname(), CPAN::Author::name(),
+CPAN::Bundle::as_glimpse(), CPAN::Bundle::as_string(),
+CPAN::Bundle::clean(), CPAN::Bundle::contains(),
+CPAN::Bundle::force($method,@args), CPAN::Bundle::get(),
+CPAN::Bundle::inst_file(), CPAN::Bundle::inst_version(),
+CPAN::Bundle::uptodate(), CPAN::Bundle::install(), CPAN::Bundle::make(),
+CPAN::Bundle::readme(), CPAN::Bundle::test(),
+CPAN::Distribution::as_glimpse(), CPAN::Distribution::as_string(),
+CPAN::Distribution::author, CPAN::Distribution::pretty_id(),
+CPAN::Distribution::base_id(), CPAN::Distribution::clean(),
+CPAN::Distribution::containsmods(), CPAN::Distribution::cvs_import(),
+CPAN::Distribution::dir(), CPAN::Distribution::force($method,@args),
+CPAN::Distribution::get(), CPAN::Distribution::install(),
+CPAN::Distribution::install_tested(), CPAN::Distribution::isa_perl(),
+CPAN::Distribution::look(), CPAN::Distribution::make(),
+CPAN::Distribution::perldoc(), CPAN::Distribution::prefs(),
+CPAN::Distribution::prereq_pm(), CPAN::Distribution::readme(),
+CPAN::Distribution::reports(), CPAN::Distribution::read_yaml(),
+CPAN::Distribution::test(), CPAN::Distribution::uptodate(),
+CPAN::Index::force_reload(), CPAN::Index::reload(), CPAN::InfoObj::dump(),
+CPAN::Module::as_glimpse(), CPAN::Module::as_string(),
+CPAN::Module::clean(), CPAN::Module::cpan_file(),
+CPAN::Module::cpan_version(), CPAN::Module::cvs_import(),
+CPAN::Module::description(), CPAN::Module::distribution(),
+CPAN::Module::dslip_status(), CPAN::Module::force($method,@args),
+CPAN::Module::get(), CPAN::Module::inst_file(),
+CPAN::Module::available_file(), CPAN::Module::inst_version(),
+CPAN::Module::available_version(), CPAN::Module::install(),
+CPAN::Module::look(), CPAN::Module::make(),
+CPAN::Module::manpage_headline(), CPAN::Module::perldoc(),
+CPAN::Module::readme(), CPAN::Module::reports(), CPAN::Module::test(),
+CPAN::Module::uptodate(), CPAN::Module::userid()
+
+=item Cache Manager
+
+=item Bundles
+
+=back
+
+=item PREREQUISITES
+
+=item UTILITIES
+
+=over 4
+
+=item Finding packages and VERSION
+
+=item Debugging
+
+o debug package.., o debug -package.., o debug all, o debug number
+
+=item Floppy, Zip, Offline Mode
+
+=item Basic Utilities for Programmers
+
+has_inst($module), has_usable($module), instance($module)
+
+=back
+
+=item SECURITY
+
+=over 4
+
+=item Cryptographically signed modules
+
+=back
+
+=item EXPORT
+
+=item ENVIRONMENT
+
+=item POPULATE AN INSTALLATION WITH LOTS OF MODULES
+
+=item WORKING WITH CPAN.pm BEHIND FIREWALLS
+
+=over 4
+
+=item Three basic types of firewalls
+
+http firewall, ftp firewall, One-way visibility, SOCKS, IP Masquerade
+
+=item Configuring lynx or ncftp for going through a firewall
+
+=back
+
+=item FAQ
+
+1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17),
+18)
+
+=item COMPATIBILITY
+
+=over 4
+
+=item OLD PERL VERSIONS
+
+=item CPANPLUS
+
+=back
+
+=item SECURITY ADVICE
+
+=item BUGS
+
+=item AUTHOR
+
+=item LICENSE
+
+=item TRANSLATIONS
+
+=item SEE ALSO
+
+=back
+
+=head2 CPAN::API::HOWTO - a recipe book for programming with CPAN.pm
+
+=over 4
+
+=item RECIPES
+
+=over 4
+
+=item What distribution contains a particular module?
+
+=item What modules does a particular distribution contain?
+
+=back
+
+=item SEE ALSO
+
+=item LICENSE
+
+=item AUTHOR
+
+=back
+
+=head2 CPAN::Distroprefs -- read and match distroprefs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item INTERFACE
+
+a CPAN::Distroprefs::Result object, C<undef>, indicating that no prefs
+files remain to be found
+
+=item RESULTS
+
+=over 4
+
+=item Common
+
+=item Errors
+
+=item Successes
+
+=back
+
+=item PREFS
+
+=item LICENSE
+
+=back
+
+=head2 CPAN::FirstTime - Utility for CPAN::Config file Initialization
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+auto_commit, build_cache, build_dir, build_dir_reuse,
+build_requires_install_policy, cache_metadata, check_sigs, colorize_output,
+colorize_print, colorize_warn, colorize_debug, commandnumber_in_prompt,
+connect_to_internet_ok, ftp_passive, ftpstats_period, ftpstats_size,
+getcwd, halt_on_failure, histfile, histsize, inactivity_timeout,
+index_expire, inhibit_startup_message, keep_source_where,
+load_module_verbosity, makepl_arg, make_arg, make_install_arg,
+make_install_make_command, mbuildpl_arg, mbuild_arg, mbuild_install_arg,
+mbuild_install_build_command, pager, prefer_installer, prefs_dir,
+prerequisites_policy, randomize_urllist, scan_cache, shell,
+show_unparsable_versions, show_upload_date, show_zero_versions,
+tar_verbosity, term_is_latin, term_ornaments, test_report,
+perl5lib_verbosity, trust_test_report_history, use_sqlite, yaml_load_code,
+yaml_module
+
+=over 4
+
+=item LICENSE
+
+=back
+
+=head2 CPAN::Kwalify - Interface between CPAN.pm and Kwalify.pm
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+_validate($schema_name, $data, $file, $doc), yaml($schema_name)
+
+=item AUTHOR
+
+=item LICENSE
+
+=back
+
+=head2 CPAN::Version - utility functions to compare CPAN versions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item LICENSE
+
+=back
+
+=head2 CPANPLUS - API & CLI access to the CPAN mirrors
+
+=over 4
+
+=item SYNOPSIS
+
+=item GUIDE TO DOCUMENTATION
+
+=over 4
+
+=item GENERAL USAGE
+
+=item API REFERENCE
+
+=back
+
+=back
+
+=over 4
+
+=item COMMANDLINE TOOLS
+
+=over 4
+
+=item STARTING AN INTERACTIVE SHELL
+
+=item BUILDING PACKAGES
+
+=item $bool = install( Module::Name | /A/AU/AUTHOR/Module-Name-1.tgz )
+
+=item $where = fetch( Module::Name | /A/AU/AUTHOR/Module-Name-1.tgz )
+
+=item $where = get( Module::Name | /A/AU/AUTHOR/Module-Name-1.tgz )
+
+=item shell()
+
+=back
+
+=item FAQ
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=item CONTACT INFORMATION
+
+Bug reporting: I<bug-cpanplus@rt.cpan.org>, Questions & suggestions:
+I<cpanplus-devel@lists.sourceforge.net>
+
+=back
+
+=head2 CPANPLUS::Backend
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item ENVIRONMENT
+
+=item METHODS
+
+=over 4
+
+=item $cb = CPANPLUS::Backend->new( [CONFIGURE_OBJ] )
+
+Provide a valid C<CPANPLUS::Configure> object, No arguments
+
+=back
+
+=back
+
+=over 4
+
+=item $href = $cb->module_tree( [@modules_names_list] )
+
+=back
+
+=over 4
+
+=item $href = $cb->author_tree( [@author_names_list] )
+
+=back
+
+=over 4
+
+=item $conf = $cb->configure_object;
+
+=back
+
+=over 4
+
+=item $su = $cb->selfupdate_object;
+
+=back
+
+=over 4
+
+=item @mods = $cb->search( type => TYPE, allow => AREF, [data => AREF,
+verbose => BOOL] )
+
+=back
+
+=over 4
+
+=item $backend_rv = $cb->fetch( modules => \@mods )
+
+=item $backend_rv = $cb->extract( modules => \@mods )
+
+=item $backend_rv = $cb->install( modules => \@mods )
+
+=item $backend_rv = $cb->readme( modules => \@mods )
+
+=item $backend_rv = $cb->files( modules => \@mods )
+
+=item $backend_rv = $cb->distributions( modules => \@mods )
+
+=back
+
+=over 4
+
+=item $mod_obj = $cb->parse_module( module =>
+$modname|$distname|$modobj|URI|PATH )
+
+Text::Bastardize, Text-Bastardize, Text-Bastardize-1.06,
+AYRNIEU/Text-Bastardize, AYRNIEU/Text-Bastardize-1.06,
+AYRNIEU/Text-Bastardize-1.06.tar.gz,
+http://example.com/Text-Bastardize-1.06.tar.gz,
+file:///tmp/Text-Bastardize-1.06.tar.gz, /tmp/Text-Bastardize-1.06,
+./Text-Bastardize-1.06
+
+=back
+
+=over 4
+
+=item $bool = $cb->reload_indices( [update_source => BOOL, verbose => BOOL]
+);
+
+=back
+
+=over 4
+
+=item $bool = $cb->flush(CACHE_NAME)
+
+C<methods>, C<hosts>, C<modules>, C<lib>, C<load>, C<all>
+
+=back
+
+=over 4
+
+=item @mods = $cb->installed()
+
+=back
+
+=over 4
+
+=item $bool = $cb->local_mirror([path => '/dir/to/save/to', index_files =>
+BOOL, force => BOOL, verbose => BOOL] )
+
+path, index_files, force, verbose
+
+=back
+
+=over 4
+
+=item $file = $cb->autobundle([path => OUTPUT_PATH, force => BOOL, verbose
+=> BOOL])
+
+=back
+
+=over 4
+
+=item $bool = $cb->save_state
+
+=back
+
+=over 4
+
+=item CUSTOM MODULE SOURCES
+
+=over 4
+
+=item %files = $cb->list_custom_sources
+
+=back
+
+=back
+
+=over 4
+
+=item $local_index = $cb->add_custom_source( uri => URI, [verbose => BOOL]
+);
+
+=back
+
+=over 4
+
+=item $local_index = $cb->remove_custom_source( uri => URI, [verbose =>
+BOOL] );
+
+=back
+
+=over 4
+
+=item $bool = $cb->update_custom_source( [remote => URI] );
+
+=back
+
+=over 4
+
+=item $file = $cb->write_custom_source_index( path =>
+/path/to/package/root, [to => /path/to/index/file, verbose => BOOL] );
+
+=back
+
+=over 4
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 CPANPLUS::Backend::RV
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item new( ok => BOOL, args => DATA, rv => DATA, [function => $method_name]
+)
+
+ok, args, rv, function
+
+=back
+
+=back
+
+=over 4
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 CPANPLUS::Config
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONFIGURATION
+
+=back
+
+=over 4
+
+=item Section 'conf'
+
+hosts
+
+=back
+
+base
+
+buildflags
+
+cpantest
+
+cpantest_mx
+
+debug
+
+dist_type
+
+email
+
+extractdir
+
+fetchdir
+
+flush
+
+force
+
+lib
+
+makeflags
+
+makemakerflags
+
+md5
+
+no_update
+
+passive
+
+prefer_bin
+
+prefer_makefile
+
+prereqs
+
+shell
+
+show_startup_tip
+
+signature
+
+skiptest
+
+storable
+
+timeout
+
+verbose
+
+write_install_log
+
+source_engine
+
+cpantest_reporter_args
+
+editor
+
+make
+
+pager
+
+shell
+
+sudo
+
+perlwrapper
+
+=over 4
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 CPANPLUS::Configure
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item $Configure = CPANPLUS::Configure->new( load_configs => BOOL )
+
+load_configs
+
+=back
+
+=back
+
+=over 4
+
+=item $bool = $Configure->init( [rescan => BOOL])
+
+=back
+
+=over 4
+
+=item can_save( [$config_location] )
+
+=back
+
+=over 4
+
+=item $file = $conf->save( [$package_name] )
+
+=back
+
+=over 4
+
+=item options( type => TYPE )
+
+=back
+
+=over 4
+
+=item ACCESSORS
+
+=over 4
+
+=item get_SOMETHING( ITEM, [ITEM, ITEM, ... ] );
+
+=item set_SOMETHING( ITEM => VAL, [ITEM => VAL, ITEM => VAL, ... ] );
+
+=item add_SOMETHING( ITEM => VAL, [ITEM => VAL, ITEM => VAL, ... ] );
+
+set|get_conf, set|get_program, _set|_get_build, _set|_get_source,
+_set|_get_mirror, _set|_get_fetch
+
+=back
+
+=back
+
+=over 4
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 CPANPLUS::Dist
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item ACCESSORS
+
+parent(), status()
+
+=item STATUS ACCESSORS
+
+created(), installed(), uninstalled(), dist()
+
+=back
+
+=over 4
+
+=item $dist = CPANPLUS::Dist::YOUR_DIST_TYPE_HERE->new( module => MODOBJ );
+
+=back
+
+=over 4
+
+=item @dists = CPANPLUS::Dist->dist_types;
+
+=back
+
+=over 4
+
+=item $bool = CPANPLUS::Dist->rescan_dist_types;
+
+=back
+
+=over 4
+
+=item $bool = CPANPLUS::Dist->has_dist_type( $type )
+
+=back
+
+=over 4
+
+=item $bool = $dist->prereq_satisfied( modobj => $modobj, version =>
+$version_spec )
+
+=back
+
+=over 4
+
+=item $configure_requires = $dist->find_configure_requires( [file =>
+/path/to/META.yml] )
+
+=back
+
+=over 4
+
+=item $bool = $dist->_resolve_prereqs( ... )
+
+=back
+
+=head2 CPANPLUS::Dist::Autobundle
+
+=over 4
+
+=item SYNOPSIS
+
+=back
+
+=head2 CPANPLUS::Dist::Base - Base class for custom distribution classes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FLOW
+
+=item METHODS
+
+=back
+
+=over 4
+
+=item @subs = $Class->methods
+
+=back
+
+=over 4
+
+=item $bool = $Class->format_available
+
+=back
+
+=over 4
+
+=item $bool = $dist->init
+
+=back
+
+=over 4
+
+=item $bool = $dist->prepare
+
+=back
+
+=over 4
+
+=item $bool = $dist->create
+
+=back
+
+=over 4
+
+=item $bool = $dist->install
+
+=back
+
+=over 4
+
+=item $bool = $dist->uninstall
+
+=back
+
+=head2 CPANPLUS::Dist::Build - CPANPLUS plugin to install packages that use
+Build.PL
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item ACCESSORS
+
+C<parent()>, C<status()>
+
+=item STATUS ACCESSORS
+
+C<build_pl ()>, C<build ()>, C<test ()>, C<prepared ()>, C<distdir ()>,
+C<created ()>, C<installed ()>, uninstalled (), C<_create_args ()>,
+C<_install_args ()>
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item $bool = CPANPLUS::Dist::Build->format_available();
+
+=back
+
+=back
+
+=over 4
+
+=item $bool = $dist->init();
+
+=back
+
+=over 4
+
+=item $bool = $dist->prepare([perl => '/path/to/perl', buildflags =>
+'EXTRA=FLAGS', force => BOOL, verbose => BOOL])
+
+=back
+
+=over 4
+
+=item $dist->create([perl => '/path/to/perl', buildflags => 'EXTRA=FLAGS',
+prereq_target => TARGET, force => BOOL, verbose => BOOL, skiptest => BOOL])
+
+=back
+
+=over 4
+
+=item $dist->install([verbose => BOOL, perl => /path/to/perl])
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item LICENSE
+
+=back
+
+=head2 CPANPLUS::Dist::Build::Constants - Constants for
+CPANPLUS::Dist::Build
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item LICENSE
+
+=back
+
+=head2 CPANPLUS::Dist::MM
+
+=over 4
+
+=item SYNOPSIS
+
+=item ACCESSORS
+
+parent(), status()
+
+=item STATUS ACCESSORS
+
+makefile (), make (), test (), prepared (), distdir (), created (),
+installed (), uninstalled (), _create_args (), _install_args ()
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item $bool = $dist->format_available();
+
+=back
+
+=back
+
+=over 4
+
+=item $href = $dist->_find_prereqs( file => '/path/to/Makefile', [verbose
+=> BOOL])
+
+=back
+
+=over 4
+
+=item $bool = $dist->create([perl => '/path/to/perl', make =>
+'/path/to/make', makeflags => 'EXTRA=FLAGS', prereq_target => TARGET,
+skiptest => BOOL, force => BOOL, verbose => BOOL])
+
+=back
+
+=over 4
+
+=item $bool = $dist->install([make => '/path/to/make', makemakerflags =>
+'EXTRA=FLAGS', force => BOOL, verbose => BOOL])
+
+=back
+
+=over 4
+
+=item $bool = $dist->write_makefile_pl([force => BOOL, verbose => BOOL])
+
+=back
+
+=head2 CPANPLUS::Dist::Sample -- Sample code to create your own Dist::*
+plugin
+
+=over 4
+
+=item Description.
+
+=back
+
+=head2 CPANPLUS::Error
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=over 4
+
+=item cp_msg("message string" [,VERBOSE])
+
+=item msg()
+
+=item cp_error("error string" [,VERBOSE])
+
+=item error()
+
+=back
+
+=item CLASS METHODS
+
+=over 4
+
+=item CPANPLUS::Error->stack()
+
+=item CPANPLUS::Error->stack_as_string([TRACE])
+
+=item CPANPLUS::Error->flush()
+
+=back
+
+=back
+
+=over 4
+
+=item GLOBAL VARIABLES
+
+$ERROR_FH, $MSG_FH
+
+=back
+
+=head2 CPANPLUS::FAQ
+
+=over 4
+
+=item DESCRIPTION
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 CPANPLUS::Hacking
+
+=over 4
+
+=item DESCRIPTION
+
+=item OBTAINING CPANPLUS
+
+=item INSTALLING CPANPLUS
+
+=item CONFIGURING CPANPLUS
+
+=item RUNNING CPANPLUS FROM DEVELOPMENT ENVIRONMENT
+
+=item RUNNING CPANPLUS TESTS
+
+=item FINDING BUGS
+
+Problem description, Program demonstrating the bug, [OPTIONAL] A patch to
+the test suite to test for the bug, [OPTIONAL] A patch to the code + tests
++ documentation
+
+=item SUPPLYING PATCHES
+
+In C<diff -u> or C<diff -c> format, From the root of the snapshot,
+Including patches for code + tests + docs, Sent per mail to
+cpanplus-devel@lists.sourceforge.net, With subject containing C<[PATCH]> +
+description of the patch
+
+=back
+
+=head2 CPANPLUS::Internals
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item ACCESSORS
+
+_conf, _id
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item $internals = CPANPLUS::Internals->_init( _conf => CONFIG_OBJ )
+
+=back
+
+=back
+
+=over 4
+
+=item $bool = $internals->_flush( list => \@caches )
+
+=back
+
+=over 4
+
+=item $bool = $internals->_register_callback( name => CALLBACK_NAME, code
+=> CODEREF );
+
+install_prerequisite, send_test_report, munge_test_report,
+edit_test_report, proceed_on_test_failure, munge_dist_metafile
+
+=back
+
+=over 4
+
+=item $bool = $internals->_add_to_includepath( directories => \@dirs )
+
+=back
+
+=over 4
+
+=item $id = CPANPLUS::Internals->_last_id
+
+=item $id = CPANPLUS::Internals->_store_id( $internals )
+
+=item $obj = CPANPLUS::Internals->_retrieve_id( $ID )
+
+=item CPANPLUS::Internals->_remove_id( $ID )
+
+=item @objs = CPANPLUS::Internals->_return_all_objects
+
+=back
+
+=head2 CPANPLUS::Internals::Extract
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item $dir = _extract( module => $modobj, [perl => '/path/to/perl',
+extractdir => '/path/to/extract/to', prefer_bin => BOOL, verbose => BOOL,
+force => BOOL] )
+
+module, extractdir, prefer_bin, perl, verbose, force
+
+=back
+
+=back
+
+=head2 CPANPLUS::Internals::Fetch
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=back
+
+=over 4
+
+=item $path = _fetch( module => $modobj, [fetchdir => '/path/to/save/to',
+fetch_from => 'scheme://path/to/fetch/from', verbose => BOOL, force =>
+BOOL, prefer_bin => BOOL, ttl => $seconds] )
+
+=back
+
+=over 4
+
+=item _add_fail_host( host => $host_hashref )
+
+=item _host_ok( host => $host_hashref )
+
+=back
+
+=head2 CPANPLUS::Internals::Report
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item $bool = $cb->_have_query_report_modules
+
+=item $bool = $cb->_have_send_report_modules
+
+=back
+
+=back
+
+=over 4
+
+=item @list = $cb->_query_report( module => $modobj, [all_versions => BOOL,
+verbose => BOOL] )
+
+=back
+
+=over 4
+
+=item $bool = $cb->_send_report( module => $modobj, buffer => $make_output,
+failed => BOOL, [save => BOOL, address => $email_to, verbose => BOOL, force
+=> BOOL]);
+
+module, buffer, failed, save, address, verbose, force
+
+=back
+
+=head2 CPANPLUS::Internals::Search
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item _search_module_tree( type => TYPE, allow => \@regexes, [data =>
+\@previous_results ] )
+
+type, allow, data
+
+=back
+
+=back
+
+=over 4
+
+=item _search_author_tree( type => TYPE, allow => \@regexex, [data =>
+\@previous_results ] )
+
+type, allow, data
+
+=back
+
+=over 4
+
+=item _all_installed()
+
+=back
+
+=head2 CPANPLUS::Internals::Source
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=back
+
+=over 4
+
+=item $cb->_build_trees( uptodate => BOOL, [use_stored => BOOL, path =>
+$path, verbose => BOOL] )
+
+uptodate, path, verbose, use_stored
+
+=back
+
+=over 4
+
+=item $cb->_check_trees( [update_source => BOOL, path => PATH, verbose =>
+BOOL] )
+
+update_source, path, verbose
+
+=back
+
+=over 4
+
+=item $cb->__check_uptodate( file => $file, name => $name, [update_source
+=> BOOL, verbose => BOOL] )
+
+file, name, update_source, verbose
+
+=back
+
+=over 4
+
+=item $cb->_update_source( name => $name, [path => $path, verbose => BOOL]
+)
+
+name, path, verbose
+
+=back
+
+=over 4
+
+=item $cb->__create_author_tree([path => $path, uptodate => BOOL, verbose
+=> BOOL])
+
+uptodate, path, verbose
+
+=back
+
+=over 4
+
+=item $cb->_create_mod_tree([path => $path, uptodate => BOOL, verbose =>
+BOOL])
+
+uptodate, path, verbose
+
+=back
+
+=over 4
+
+=item $cb->__create_dslip_tree([path => $path, uptodate => BOOL, verbose =>
+BOOL])
+
+uptodate, path, verbose
+
+=back
+
+=over 4
+
+=item $cb->_dslip_defs ()
+
+=back
+
+=over 4
+
+=item $file = $cb->_add_custom_module_source( uri => URI, [verbose => BOOL]
+);
+
+=back
+
+=over 4
+
+=item $index = $cb->__custom_module_source_index_file( uri => $uri );
+
+=back
+
+=over 4
+
+=item $file = $cb->_remove_custom_module_source( uri => URI, [verbose =>
+BOOL] );
+
+=back
+
+=over 4
+
+=item %files = $cb->__list_custom_module_sources
+
+=back
+
+=over 4
+
+=item $bool = $cb->__update_custom_module_sources( [verbose => BOOL] );
+
+=back
+
+=over 4
+
+=item $ok = $cb->__update_custom_module_source
+
+=back
+
+=over 4
+
+=item $bool = $cb->__write_custom_module_index( path => /path/to/packages,
+[to => /path/to/index/file, verbose => BOOL] )
+
+=back
+
+=over 4
+
+=item $bool = $cb->__create_custom_module_entries( [verbose => BOOL] )
+
+=back
+
+=head2 CPANPLUS::Internals::Source::Memory - In memory implementation
+
+=over 4
+
+=item $cb->__memory_retrieve_source(name => $name, [path => $path, uptodate
+=> BOOL, verbose => BOOL])
+
+name, uptodate, path, verbose
+
+=back
+
+=over 4
+
+=item $cb->__memory_save_source([verbose => BOOL, path => $path])
+
+path, verbose
+
+=back
+
+=head2 CPANPLUS::Internals::Source::SQLite - SQLite implementation
+
+=head2 CPANPLUS::Internals::Utils
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item $cb->_mkdir( dir => '/some/dir' )
+
+=back
+
+=back
+
+=over 4
+
+=item $cb->_chdir( dir => '/some/dir' )
+
+=back
+
+=over 4
+
+=item $cb->_rmdir( dir => '/some/dir' );
+
+=back
+
+=over 4
+
+=item $cb->_perl_version ( perl => 'some/perl/binary' );
+
+=back
+
+=over 4
+
+=item $cb->_version_to_number( version => $version );
+
+=back
+
+=over 4
+
+=item $cb->_whoami
+
+=back
+
+=over 4
+
+=item _get_file_contents( file => $file );
+
+=back
+
+=over 4
+
+=item $cb->_mode_plus_w( file => '/path/to/file' );
+
+=back
+
+=over 4
+
+=item $uri = $cb->_host_to_uri( scheme => SCHEME, host => HOST, path =>
+PATH );
+
+=back
+
+=over 4
+
+=item $cb->_vcmp( VERSION, VERSION );
+
+=back
+
+=over 4
+
+=item $cb->_home_dir
+
+=back
+
+=over 4
+
+=item $path = $cb->_safe_path( path => $path );
+
+=back
+
+=over 4
+
+=item ($pkg, $version, $ext) = $cb->_split_package_string( package =>
+PACKAGE_STRING );
+
+=back
+
+=head2 CPANPLUS::Module
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item CLASS METHODS
+
+=over 4
+
+=item accessors ()
+
+=back
+
+=back
+
+=over 4
+
+=item ACCESSORS
+
+name, module, version, path, comment, package, description, dslip
+
+=back
+
+status, author, parent
+
+=over 4
+
+=item STATUS ACCESSORS
+
+installer_type, dist_cpan, dist, prereqs | requires, configure_requires,
+signature, extract, fetch, readme, uninstall, created, installed,
+checksums, checksum_ok, checksum_value
+
+=item METHODS
+
+=over 4
+
+=item $self = CPANPLUS::Module->new( OPTIONS )
+
+=back
+
+=back
+
+=over 4
+
+=item $mod->package_name( [$package_string] )
+
+=item $mod->package_version( [$package_string] )
+
+=item $mod->package_extension( [$package_string] )
+
+=item $mod->package_is_perl_core
+
+=item $mod->module_is_supplied_with_perl_core( [version => $]] )
+
+=item $mod->is_bundle
+
+=item $mod->is_autobundle;
+
+=item $mod->is_third_party
+
+=item $mod->third_party_information
+
+=back
+
+=over 4
+
+=item $clone = $self->clone
+
+=back
+
+=over 4
+
+=item $where = $self->fetch
+
+=back
+
+=over 4
+
+=item $path = $self->extract
+
+=back
+
+=over 4
+
+=item $type = $self->get_installer_type([prefer_makefile => BOOL])
+
+=back
+
+=over 4
+
+=item $dist = $self->dist([target => 'prepare|create', format =>
+DISTRIBUTION_TYPE, args => {key => val}]);
+
+=back
+
+=over 4
+
+=item $bool = $mod->prepare( )
+
+Convenience method around C<install()> that prepares a module
+without actually building it. This is equivalent to invoking C<install>
+with C<target> set to C<prepare>
+
+=back
+
+=over 4
+
+=item $bool = $mod->create( )
+
+=back
+
+=over 4
+
+=item $bool = $mod->test( )
+
+=back
+
+=over 4
+
+=item $bool = $self->install([ target => 'init|prepare|create|install',
+format => FORMAT_TYPE, extractdir => DIRECTORY, fetchdir => DIRECTORY,
+prefer_bin => BOOL, force => BOOL, verbose => BOOL, ..... ]);
+
+=back
+
+=over 4
+
+=item $text = $self->readme
+
+=back
+
+=over 4
+
+=item $version = $self->installed_version()
+
+=item $where = $self->installed_file()
+
+=item $dir = $self->installed_dir()
+
+=item $bool = $self->is_uptodate([version => VERSION_NUMBER])
+
+=back
+
+=over 4
+
+=item $href = $self->details()
+
+=back
+
+=over 4
+
+=item @list = $self->contains()
+
+=back
+
+=over 4
+
+=item @list_of_hrefs = $self->fetch_report()
+
+=back
+
+=over 4
+
+=item $bool = $self->uninstall([type => [all|man|prog])
+
+=back
+
+=over 4
+
+=item @modobj = $self->distributions()
+
+=back
+
+=over 4
+
+=item @list = $self->files ()
+
+=item @list = $self->directory_tree ()
+
+=item @list = $self->packlist ()
+
+=item @list = $self->validate ()
+
+=back
+
+=over 4
+
+=item $bool = $self->add_to_includepath;
+
+=item $path = $self->best_path_to_module_build();
+
+=back
+
+=over 4
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 CPANPLUS::Module::Author
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item ACCESSORS
+
+author, cpanid, email, parent
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item $auth = CPANPLUS::Module::Author->new( author => AUTHOR_NAME, cpanid
+=> CPAN_ID, _id => INTERNALS_ID [, email => AUTHOR_EMAIL] )
+
+=back
+
+=back
+
+=over 4
+
+=item @mod_objs = $auth->modules()
+
+=back
+
+=over 4
+
+=item @dists = $auth->distributions()
+
+=back
+
+=over 4
+
+=item CLASS METHODS
+
+=over 4
+
+=item accessors ()
+
+=back
+
+=back
+
+=head2 CPANPLUS::Module::Author::Fake
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item new( _id => DIGIT )
+
+=back
+
+=back
+
+=head2 CPANPLUS::Module::Checksums
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item $mod->checksums
+
+=back
+
+=back
+
+=head2 CPANPLUS::Module::Fake
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item new( module => $mod, path => $path, package => $pkg, [_id => DIGIT] )
+
+=back
+
+=back
+
+=head2 CPANPLUSelfupdate, CPANPLUS::Selfupdate
+
+=over 4
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item $self = CPANPLUS::Selfupdate->new( $backend_object );
+
+=back
+
+=back
+
+=over 4
+
+=item %list = $self->list_modules_to_update( update =>
+"core|dependencies|enabled_features|features|all", [latest => BOOL] )
+
+List which modules C<selfupdate> would upgrade. You can update either
+the core (CPANPLUS itself), the core dependencies, all features you have
+currently turned on, or all features available, or everything.
+
+=back
+
+=over 4
+
+=item @features = $self->list_features
+
+=back
+
+=over 4
+
+=item @features = $self->list_enabled_features
+
+=back
+
+=over 4
+
+=item @mods = $self->modules_for_feature( FEATURE [,AS_HASH] )
+
+=back
+
+=over 4
+
+=item @mods = $self->list_core_dependencies( [AS_HASH] )
+
+=back
+
+=over 4
+
+=item @mods = $self->list_core_modules( [AS_HASH] )
+
+=back
+
+=over 4
+
+=item CPANPLUS::Selfupdate::Module
+
+=back
+
+=over 4
+
+=item $version = $mod->version_required
+
+=back
+
+=over 4
+
+=item $bool = $mod->is_installed_version_sufficient
+
+=back
+
+=over 4
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 CPANPLUShell, CPANPLUS::Shell
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 CPANPLUShell::Classic, CPANPLUS::Shell::Classic - CPAN.pm emulation
+for CPANPLUS
+
+=over 4
+
+=item DESCRIPTION
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=over 4
+
+=item SEE ALSO
+
+=back
+
+=head2 CPANPLUShell::Default, CPANPLUS::Shell::Default
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 CPANPLUShell::Default::Plugins::CustomSource,
+CPANPLUS::Shell::Default::Plugins::CustomSource
+
+=over 4
+
+=item SYNOPSIS
+
+ ### elaborate help text
+ CPAN Terminal> /? cs
+
+=item DESCRIPTION
+
+=back
+
+=head2 CPANPLUShell::Default::Plugins::HOWTO,
+CPANPLUS::Shell::Default::Plugins::HOWTO -- documentation on how to write
+your own plugins
+
+=over 4
+
+=item SYNOPSIS
+
+=item HOWTO
+
+=over 4
+
+=item Registering Plugin Modules
+
+=item Registering Plugin Commands
+
+=item Registering Plugin Help
+
+=item Arguments to Plugin Commands
+
+Classname -- The name of your plugin class, Shell -- The
+CPANPLUS::Shell::Default object, Backend -- The CPANPLUS::Backend object,
+Command -- The command issued by the user, Input -- The input string
+from the user, Options -- A hashref of options provided by the user
+
+=back
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 CPANPLUShell::Default::Plugins::Remote,
+CPANPLUS::Shell::Default::Plugins::Remote
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 CPANPLUShell::Default::Plugins::Source,
+CPANPLUS::Shell::Default::Plugins::Source
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 CPANox, CPAN::Nox - Wrapper around CPAN.pm without using any XS
+module
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item LICENSE
+
+=item SEE ALSO
+
+=back
+
+=head2 Carp, carp - warn of errors (from perspective of caller)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Forcing a Stack Trace
+
+=back
+
+=item GLOBAL VARIABLES
+
+=over 4
+
+=item $Carp::MaxEvalLen
+
+=item $Carp::MaxArgLen
+
+=item $Carp::MaxArgNums
+
+=item $Carp::Verbose
+
+=item %Carp::Internal
+
+=item %Carp::CarpInternal
+
+=item $Carp::CarpLevel
+
+=back
+
+=item BUGS
+
+=back
+
+=head2 Carp::Heavy - heavy machinery, no user serviceable parts inside
+
+=head2 Class::ISA -- report the search path for a class's ISA tree
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+the function Class::ISA::super_path($CLASS), the function
+Class::ISA::self_and_super_path($CLASS), the function
+Class::ISA::self_and_super_versions($CLASS)
+
+=item CAUTIONARY NOTES
+
+=item COPYRIGHT
+
+=item AUTHOR
+
+=back
+
+=head2 Class::Struct - declare struct-like datatypes as Perl classes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item The C<struct()> function
+
+=item Class Creation at Compile Time
+
+=item Element Types and Accessor Methods
+
+Scalar (C<'$'> or C<'*$'>), Array (C<'@'> or C<'*@'>), Hash (C<'%'> or
+C<'*%'>), Class (C<'Class_Name'> or C<'*Class_Name'>)
+
+=item Initializing with C<new>
+
+=back
+
+=item EXAMPLES
+
+Example 1, Example 2, Example 3
+
+=item Author and Modification History
+
+=back
+
+=head2 Compress-Raw-Bzip2::lib::Compress::Raw::Bzip2, Compress::Raw::Bzip2
+- Low-Level Interface to bzip2 compression library
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Compression
+
+=over 4
+
+=item ($z, $status) = new Compress::Raw::Bzip2 $appendOutput,
+$blockSize100k, $workfactor;
+
+B<$appendOutput>, B<$blockSize100k>, B<$workfactor>
+
+=item $status = $bz->bzdeflate($input, $output);
+
+=item $status = $bz->bzflush($output);
+
+=item $status = $bz->bzclose($output);
+
+=item Example
+
+=back
+
+=item Uncompression
+
+=over 4
+
+=item ($z, $status) = new Compress::Raw::Bunzip2 $appendOutput,
+$consumeInput, $small, $limitOutput;
+
+B<$appendOutput>, B<$consumeInput>, B<$small>, B<$limitOutput>
+
+=item $status = $z->bzinflate($input, $output);
+
+=back
+
+=item Misc
+
+=over 4
+
+=item my $version = Compress::Raw::Bzip2::bzlibversion();
+
+=back
+
+=item Constants
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Compress-Raw-Bzip2::pod::FAQ, Compress::Raw::Bzip2::FAQ --
+Frequently Asked Questions about Compress::Raw::Bzip2
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Compatibility with Unix compress/uncompress.
+
+=item Accessing .tar.Z files
+
+=item Accessing Zip Files
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Compress-Raw-Zlib::Compress::Raw::Zlib, Compress::Raw::Zlib -
+Low-Level Interface to zlib compression library
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Compress::Raw::Zlib::Deflate
+
+=over 4
+
+=item B<($d, $status) = new Compress::Raw::Zlib::Deflate( [OPT] ) >
+
+B<-Level>, B<-Method>, B<-WindowBits>, B<-MemLevel>, B<-Strategy>,
+B<-Dictionary>, B<-Bufsize>, B<-AppendOutput>, B<-CRC32>, B<-ADLER32>
+
+=item B<$status = $d-E<gt>deflate($input, $output)>
+
+=item B<$status = $d-E<gt>flush($output [, $flush_type]) >
+
+=item B<$status = $d-E<gt>deflateReset() >
+
+=item B<$status = $d-E<gt>deflateParams([OPT])>
+
+B<-Level>, B<-Strategy>, B<-BufSize>
+
+=item B<$status = $d-E<gt>deflateTune($good_length, $max_lazy,
+$nice_length, $max_chain)>
+
+=item B<$d-E<gt>dict_adler()>
+
+=item B<$d-E<gt>crc32()>
+
+=item B<$d-E<gt>adler32()>
+
+=item B<$d-E<gt>msg()>
+
+=item B<$d-E<gt>total_in()>
+
+=item B<$d-E<gt>total_out()>
+
+=item B<$d-E<gt>get_Strategy()>
+
+=item B<$d-E<gt>get_Level()>
+
+=item B<$d-E<gt>get_BufSize()>
+
+=item Example
+
+=back
+
+=item Compress::Raw::Zlib::Inflate
+
+=over 4
+
+=item B< ($i, $status) = new Compress::Raw::Zlib::Inflate( [OPT] ) >
+
+B<-WindowBits>, B<-Bufsize>, B<-Dictionary>, B<-AppendOutput>, B<-CRC32>,
+B<-ADLER32>, B<-ConsumeInput>, B<-LimitOutput>
+
+=item B< $status = $i-E<gt>inflate($input, $output [,$eof]) >
+
+=item B<$status = $i-E<gt>inflateSync($input)>
+
+=item B<$i-E<gt>dict_adler()>
+
+=item B<$i-E<gt>crc32()>
+
+=item B<$i-E<gt>adler32()>
+
+=item B<$i-E<gt>msg()>
+
+=item B<$i-E<gt>total_in()>
+
+=item B<$i-E<gt>total_out()>
+
+=item B<$d-E<gt>get_BufSize()>
+
+=item Examples
+
+=back
+
+=item CHECKSUM FUNCTIONS
+
+=item Misc
+
+=over 4
+
+=item my $version = Compress::Raw::Zlib::zlib_version();
+
+=back
+
+=item The LimitOutput option.
+
+=item ACCESSING ZIP FILES
+
+=item CONSTANTS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Compress-Raw-Zlib::pod::FAQ, Compress::Raw::Zlib::FAQ -- Frequently
+Asked Questions about Compress::Raw::Zlib
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Compatibility with Unix compress/uncompress.
+
+=item Accessing .tar.Z files
+
+=item Accessing Zip Files
+
+=item Zlib Library Version Support
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Compress::Raw::Bzip2 - Low-Level Interface to bzip2 compression
+library
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Compression
+
+=over 4
+
+=item ($z, $status) = new Compress::Raw::Bzip2 $appendOutput,
+$blockSize100k, $workfactor;
+
+B<$appendOutput>, B<$blockSize100k>, B<$workfactor>
+
+=item $status = $bz->bzdeflate($input, $output);
+
+=item $status = $bz->bzflush($output);
+
+=item $status = $bz->bzclose($output);
+
+=item Example
+
+=back
+
+=item Uncompression
+
+=over 4
+
+=item ($z, $status) = new Compress::Raw::Bunzip2 $appendOutput,
+$consumeInput, $small, $limitOutput;
+
+B<$appendOutput>, B<$consumeInput>, B<$small>, B<$limitOutput>
+
+=item $status = $z->bzinflate($input, $output);
+
+=back
+
+=item Misc
+
+=over 4
+
+=item my $version = Compress::Raw::Bzip2::bzlibversion();
+
+=back
+
+=item Constants
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Compress::Raw::Zlib - Low-Level Interface to zlib compression
+library
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Compress::Raw::Zlib::Deflate
+
+=over 4
+
+=item B<($d, $status) = new Compress::Raw::Zlib::Deflate( [OPT] ) >
+
+B<-Level>, B<-Method>, B<-WindowBits>, B<-MemLevel>, B<-Strategy>,
+B<-Dictionary>, B<-Bufsize>, B<-AppendOutput>, B<-CRC32>, B<-ADLER32>
+
+=item B<$status = $d-E<gt>deflate($input, $output)>
+
+=item B<$status = $d-E<gt>flush($output [, $flush_type]) >
+
+=item B<$status = $d-E<gt>deflateReset() >
+
+=item B<$status = $d-E<gt>deflateParams([OPT])>
+
+B<-Level>, B<-Strategy>, B<-BufSize>
+
+=item B<$status = $d-E<gt>deflateTune($good_length, $max_lazy,
+$nice_length, $max_chain)>
+
+=item B<$d-E<gt>dict_adler()>
+
+=item B<$d-E<gt>crc32()>
+
+=item B<$d-E<gt>adler32()>
+
+=item B<$d-E<gt>msg()>
+
+=item B<$d-E<gt>total_in()>
+
+=item B<$d-E<gt>total_out()>
+
+=item B<$d-E<gt>get_Strategy()>
+
+=item B<$d-E<gt>get_Level()>
+
+=item B<$d-E<gt>get_BufSize()>
+
+=item Example
+
+=back
+
+=item Compress::Raw::Zlib::Inflate
+
+=over 4
+
+=item B< ($i, $status) = new Compress::Raw::Zlib::Inflate( [OPT] ) >
+
+B<-WindowBits>, B<-Bufsize>, B<-Dictionary>, B<-AppendOutput>, B<-CRC32>,
+B<-ADLER32>, B<-ConsumeInput>, B<-LimitOutput>
+
+=item B< $status = $i-E<gt>inflate($input, $output [,$eof]) >
+
+=item B<$status = $i-E<gt>inflateSync($input)>
+
+=item B<$i-E<gt>dict_adler()>
+
+=item B<$i-E<gt>crc32()>
+
+=item B<$i-E<gt>adler32()>
+
+=item B<$i-E<gt>msg()>
+
+=item B<$i-E<gt>total_in()>
+
+=item B<$i-E<gt>total_out()>
+
+=item B<$d-E<gt>get_BufSize()>
+
+=item Examples
+
+=back
+
+=item CHECKSUM FUNCTIONS
+
+=item Misc
+
+=over 4
+
+=item my $version = Compress::Raw::Zlib::zlib_version();
+
+=back
+
+=item The LimitOutput option.
+
+=item ACCESSING ZIP FILES
+
+=item CONSTANTS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Compress::Zlib - Interface to zlib compression library
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Notes for users of Compress::Zlib version 1
+
+=back
+
+=item GZIP INTERFACE
+
+B<$gz = gzopen($filename, $mode)>, B<$gz = gzopen($filehandle, $mode)>,
+B<$bytesread = $gz-E<gt>gzread($buffer [, $size]) ;>, B<$bytesread =
+$gz-E<gt>gzreadline($line) ;>, B<$byteswritten = $gz-E<gt>gzwrite($buffer)
+;>, B<$status = $gz-E<gt>gzflush($flush_type) ;>, B<$offset =
+$gz-E<gt>gztell() ;>, B<$status = $gz-E<gt>gzseek($offset, $whence) ;>,
+B<$gz-E<gt>gzclose>, B<$gz-E<gt>gzsetparams($level, $strategy>, B<$level>,
+B<$strategy>, B<$gz-E<gt>gzerror>, B<$gzerrno>
+
+=over 4
+
+=item Examples
+
+=item Compress::Zlib::memGzip
+
+=item Compress::Zlib::memGunzip
+
+=back
+
+=item COMPRESS/UNCOMPRESS
+
+B<$dest = compress($source [, $level] ) ;>, B<$dest = uncompress($source)
+;>
+
+=item Deflate Interface
+
+=over 4
+
+=item B<($d, $status) = deflateInit( [OPT] )>
+
+B<-Level>, B<-Method>, B<-WindowBits>, B<-MemLevel>, B<-Strategy>,
+B<-Dictionary>, B<-Bufsize>
+
+=item B<($out, $status) = $d-E<gt>deflate($buffer)>
+
+=item B<($out, $status) = $d-E<gt>flush()>
+=head2 B<($out, $status) = $d-E<gt>flush($flush_type)>
+
+=item B<$status = $d-E<gt>deflateParams([OPT])>
+
+B<-Level>, B<-Strategy>
+
+=item B<$d-E<gt>dict_adler()>
+
+=item B<$d-E<gt>msg()>
+
+=item B<$d-E<gt>total_in()>
+
+=item B<$d-E<gt>total_out()>
+
+=item Example
+
+=back
+
+=item Inflate Interface
+
+=over 4
+
+=item B<($i, $status) = inflateInit()>
+
+B<-WindowBits>, B<-Bufsize>, B<-Dictionary>
+
+=item B<($out, $status) = $i-E<gt>inflate($buffer)>
+
+=item B<$status = $i-E<gt>inflateSync($buffer)>
+
+=item B<$i-E<gt>dict_adler()>
+
+=item B<$i-E<gt>msg()>
+
+=item B<$i-E<gt>total_in()>
+
+=item B<$i-E<gt>total_out()>
+
+=item Example
+
+=back
+
+=item CHECKSUM FUNCTIONS
+
+=item Misc
+
+=over 4
+
+=item my $version = Compress::Zlib::zlib_version();
+
+=back
+
+=item CONSTANTS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Config - access Perl configuration information
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+myconfig(), config_sh(), config_re($regex), config_vars(@names)
+
+=item EXAMPLE
+
+=item WARNING
+
+=item GLOSSARY
+
+=back
+
+=over 4
+
+=item _
+
+=back
+
+C<_a>, C<_exe>, C<_o>
+
+=over 4
+
+=item a
+
+=back
+
+C<afs>, C<afsroot>, C<alignbytes>, C<ansi2knr>, C<aphostname>,
+C<api_revision>, C<api_subversion>, C<api_version>, C<api_versionstring>,
+C<ar>, C<archlib>, C<archlibexp>, C<archname>, C<archname64>, C<archobjs>,
+C<asctime_r_proto>, C<awk>
+
+=over 4
+
+=item b
+
+=back
+
+C<baserev>, C<bash>, C<bin>, C<binexp>, C<bison>, C<byacc>, C<byteorder>
+
+=over 4
+
+=item c
+
+=back
+
+C<c>, C<castflags>, C<cat>, C<cc>, C<cccdlflags>, C<ccdlflags>, C<ccflags>,
+C<ccflags_uselargefiles>, C<ccname>, C<ccsymbols>, C<ccversion>, C<cf_by>,
+C<cf_email>, C<cf_time>, C<chgrp>, C<chmod>, C<chown>, C<clocktype>,
+C<comm>, C<compress>, C<contains>, C<cp>, C<cpio>, C<cpp>, C<cpp_stuff>,
+C<cppccsymbols>, C<cppflags>, C<cpplast>, C<cppminus>, C<cpprun>,
+C<cppstdin>, C<cppsymbols>, C<crypt_r_proto>, C<cryptlib>, C<csh>,
+C<ctermid_r_proto>, C<ctime_r_proto>
+
+=over 4
+
+=item d
+
+=back
+
+C<d__fwalk>, C<d_access>, C<d_accessx>, C<d_aintl>, C<d_alarm>,
+C<d_archlib>, C<d_asctime64>, C<d_asctime_r>, C<d_atolf>, C<d_atoll>,
+C<d_attribute_deprecated>, C<d_attribute_format>, C<d_attribute_malloc>,
+C<d_attribute_nonnull>, C<d_attribute_noreturn>, C<d_attribute_pure>,
+C<d_attribute_unused>, C<d_attribute_warn_unused_result>, C<d_bcmp>,
+C<d_bcopy>, C<d_bsd>, C<d_bsdgetpgrp>, C<d_bsdsetpgrp>,
+C<d_builtin_choose_expr>, C<d_builtin_expect>, C<d_bzero>,
+C<d_c99_variadic_macros>, C<d_casti32>, C<d_castneg>, C<d_charvspr>,
+C<d_chown>, C<d_chroot>, C<d_chsize>, C<d_class>, C<d_clearenv>,
+C<d_closedir>, C<d_cmsghdr_s>, C<d_const>, C<d_copysignl>, C<d_cplusplus>,
+C<d_crypt>, C<d_crypt_r>, C<d_csh>, C<d_ctermid>, C<d_ctermid_r>,
+C<d_ctime64>, C<d_ctime_r>, C<d_cuserid>, C<d_dbl_dig>, C<d_dbminitproto>,
+C<d_difftime>, C<d_difftime64>, C<d_dir_dd_fd>, C<d_dirfd>, C<d_dirnamlen>,
+C<d_dlerror>, C<d_dlopen>, C<d_dlsymun>, C<d_dosuid>, C<d_drand48_r>,
+C<d_drand48proto>, C<d_dup2>, C<d_eaccess>, C<d_endgrent>, C<d_endgrent_r>,
+C<d_endhent>, C<d_endhostent_r>, C<d_endnent>, C<d_endnetent_r>,
+C<d_endpent>, C<d_endprotoent_r>, C<d_endpwent>, C<d_endpwent_r>,
+C<d_endsent>, C<d_endservent_r>, C<d_eofnblk>, C<d_eunice>, C<d_faststdio>,
+C<d_fchdir>, C<d_fchmod>, C<d_fchown>, C<d_fcntl>, C<d_fcntl_can_lock>,
+C<d_fd_macros>, C<d_fd_set>, C<d_fds_bits>, C<d_fgetpos>, C<d_finite>,
+C<d_finitel>, C<d_flexfnam>, C<d_flock>, C<d_flockproto>, C<d_fork>,
+C<d_fp_class>, C<d_fpathconf>, C<d_fpclass>, C<d_fpclassify>,
+C<d_fpclassl>, C<d_fpos64_t>, C<d_frexpl>, C<d_fs_data_s>, C<d_fseeko>,
+C<d_fsetpos>, C<d_fstatfs>, C<d_fstatvfs>, C<d_fsync>, C<d_ftello>,
+C<d_ftime>, C<d_futimes>, C<d_Gconvert>, C<d_gdbm_ndbm_h_uses_prototypes>,
+C<d_gdbmndbm_h_uses_prototypes>, C<d_getaddrinfo>, C<d_getcwd>,
+C<d_getespwnam>, C<d_getfsstat>, C<d_getgrent>, C<d_getgrent_r>,
+C<d_getgrgid_r>, C<d_getgrnam_r>, C<d_getgrps>, C<d_gethbyaddr>,
+C<d_gethbyname>, C<d_gethent>, C<d_gethname>, C<d_gethostbyaddr_r>,
+C<d_gethostbyname_r>, C<d_gethostent_r>, C<d_gethostprotos>,
+C<d_getitimer>, C<d_getlogin>, C<d_getlogin_r>, C<d_getmnt>,
+C<d_getmntent>, C<d_getnameinfo>, C<d_getnbyaddr>, C<d_getnbyname>,
+C<d_getnent>, C<d_getnetbyaddr_r>, C<d_getnetbyname_r>, C<d_getnetent_r>,
+C<d_getnetprotos>, C<d_getpagsz>, C<d_getpbyname>, C<d_getpbynumber>,
+C<d_getpent>, C<d_getpgid>, C<d_getpgrp>, C<d_getpgrp2>, C<d_getppid>,
+C<d_getprior>, C<d_getprotobyname_r>, C<d_getprotobynumber_r>,
+C<d_getprotoent_r>, C<d_getprotoprotos>, C<d_getprpwnam>, C<d_getpwent>,
+C<d_getpwent_r>, C<d_getpwnam_r>, C<d_getpwuid_r>, C<d_getsbyname>,
+C<d_getsbyport>, C<d_getsent>, C<d_getservbyname_r>, C<d_getservbyport_r>,
+C<d_getservent_r>, C<d_getservprotos>, C<d_getspnam>, C<d_getspnam_r>,
+C<d_gettimeod>, C<d_gmtime64>, C<d_gmtime_r>, C<d_gnulibc>, C<d_grpasswd>,
+C<d_hasmntopt>, C<d_htonl>, C<d_ilogbl>, C<d_inc_version_list>, C<d_index>,
+C<d_inetaton>, C<d_inetntop>, C<d_inetpton>, C<d_int64_t>, C<d_isascii>,
+C<d_isfinite>, C<d_isinf>, C<d_isnan>, C<d_isnanl>, C<d_killpg>,
+C<d_lchown>, C<d_ldbl_dig>, C<d_libm_lib_version>, C<d_link>,
+C<d_localtime64>, C<d_localtime_r>, C<d_localtime_r_needs_tzset>,
+C<d_locconv>, C<d_lockf>, C<d_longdbl>, C<d_longlong>, C<d_lseekproto>,
+C<d_lstat>, C<d_madvise>, C<d_malloc_good_size>, C<d_malloc_size>,
+C<d_mblen>, C<d_mbstowcs>, C<d_mbtowc>, C<d_memchr>, C<d_memcmp>,
+C<d_memcpy>, C<d_memmove>, C<d_memset>, C<d_mkdir>, C<d_mkdtemp>,
+C<d_mkfifo>, C<d_mkstemp>, C<d_mkstemps>, C<d_mktime>, C<d_mktime64>,
+C<d_mmap>, C<d_modfl>, C<d_modfl_pow32_bug>, C<d_modflproto>,
+C<d_mprotect>, C<d_msg>, C<d_msg_ctrunc>, C<d_msg_dontroute>, C<d_msg_oob>,
+C<d_msg_peek>, C<d_msg_proxy>, C<d_msgctl>, C<d_msgget>, C<d_msghdr_s>,
+C<d_msgrcv>, C<d_msgsnd>, C<d_msync>, C<d_munmap>, C<d_mymalloc>,
+C<d_ndbm>, C<d_ndbm_h_uses_prototypes>, C<d_nice>, C<d_nl_langinfo>,
+C<d_nv_preserves_uv>, C<d_nv_zero_is_allbits_zero>, C<d_off64_t>,
+C<d_old_pthread_create_joinable>, C<d_oldpthreads>, C<d_oldsock>,
+C<d_open3>, C<d_pathconf>, C<d_pause>, C<d_perl_otherlibdirs>,
+C<d_phostname>, C<d_pipe>, C<d_poll>, C<d_portable>, C<d_PRId64>,
+C<d_PRIeldbl>, C<d_PRIEUldbl>, C<d_PRIfldbl>, C<d_PRIFUldbl>,
+C<d_PRIgldbl>, C<d_PRIGUldbl>, C<d_PRIi64>, C<d_printf_format_null>,
+C<d_PRIo64>, C<d_PRIu64>, C<d_PRIx64>, C<d_PRIXU64>, C<d_procselfexe>,
+C<d_pseudofork>, C<d_pthread_atfork>, C<d_pthread_attr_setscope>,
+C<d_pthread_yield>, C<d_pwage>, C<d_pwchange>, C<d_pwclass>,
+C<d_pwcomment>, C<d_pwexpire>, C<d_pwgecos>, C<d_pwpasswd>, C<d_pwquota>,
+C<d_qgcvt>, C<d_quad>, C<d_random_r>, C<d_readdir>, C<d_readdir64_r>,
+C<d_readdir_r>, C<d_readlink>, C<d_readv>, C<d_recvmsg>, C<d_rename>,
+C<d_rewinddir>, C<d_rmdir>, C<d_safebcpy>, C<d_safemcpy>, C<d_sanemcmp>,
+C<d_sbrkproto>, C<d_scalbnl>, C<d_sched_yield>, C<d_scm_rights>,
+C<d_SCNfldbl>, C<d_seekdir>, C<d_select>, C<d_sem>, C<d_semctl>,
+C<d_semctl_semid_ds>, C<d_semctl_semun>, C<d_semget>, C<d_semop>,
+C<d_sendmsg>, C<d_setegid>, C<d_seteuid>, C<d_setgrent>, C<d_setgrent_r>,
+C<d_setgrps>, C<d_sethent>, C<d_sethostent_r>, C<d_setitimer>,
+C<d_setlinebuf>, C<d_setlocale>, C<d_setlocale_r>, C<d_setnent>,
+C<d_setnetent_r>, C<d_setpent>, C<d_setpgid>, C<d_setpgrp>, C<d_setpgrp2>,
+C<d_setprior>, C<d_setproctitle>, C<d_setprotoent_r>, C<d_setpwent>,
+C<d_setpwent_r>, C<d_setregid>, C<d_setresgid>, C<d_setresuid>,
+C<d_setreuid>, C<d_setrgid>, C<d_setruid>, C<d_setsent>, C<d_setservent_r>,
+C<d_setsid>, C<d_setvbuf>, C<d_sfio>, C<d_shm>, C<d_shmat>,
+C<d_shmatprototype>, C<d_shmctl>, C<d_shmdt>, C<d_shmget>, C<d_sigaction>,
+C<d_signbit>, C<d_sigprocmask>, C<d_sigsetjmp>, C<d_sitearch>,
+C<d_snprintf>, C<d_sockatmark>, C<d_sockatmarkproto>, C<d_socket>,
+C<d_socklen_t>, C<d_sockpair>, C<d_socks5_init>,
+C<d_sprintf_returns_strlen>, C<d_sqrtl>, C<d_srand48_r>, C<d_srandom_r>,
+C<d_sresgproto>, C<d_sresuproto>, C<d_statblks>, C<d_statfs_f_flags>,
+C<d_statfs_s>, C<d_statvfs>, C<d_stdio_cnt_lval>, C<d_stdio_ptr_lval>,
+C<d_stdio_ptr_lval_nochange_cnt>, C<d_stdio_ptr_lval_sets_cnt>,
+C<d_stdio_stream_array>, C<d_stdiobase>, C<d_stdstdio>, C<d_strchr>,
+C<d_strcoll>, C<d_strctcpy>, C<d_strerrm>, C<d_strerror>, C<d_strerror_r>,
+C<d_strftime>, C<d_strlcat>, C<d_strlcpy>, C<d_strtod>, C<d_strtol>,
+C<d_strtold>, C<d_strtoll>, C<d_strtoq>, C<d_strtoul>, C<d_strtoull>,
+C<d_strtouq>, C<d_strxfrm>, C<d_suidsafe>, C<d_symlink>, C<d_syscall>,
+C<d_syscallproto>, C<d_sysconf>, C<d_sysernlst>, C<d_syserrlst>,
+C<d_system>, C<d_tcgetpgrp>, C<d_tcsetpgrp>, C<d_telldir>,
+C<d_telldirproto>, C<d_time>, C<d_timegm>, C<d_times>, C<d_tm_tm_gmtoff>,
+C<d_tm_tm_zone>, C<d_tmpnam_r>, C<d_truncate>, C<d_ttyname_r>, C<d_tzname>,
+C<d_u32align>, C<d_ualarm>, C<d_umask>, C<d_uname>, C<d_union_semun>,
+C<d_unordered>, C<d_unsetenv>, C<d_usleep>, C<d_usleepproto>, C<d_ustat>,
+C<d_vendorarch>, C<d_vendorbin>, C<d_vendorlib>, C<d_vendorscript>,
+C<d_vfork>, C<d_void_closedir>, C<d_voidsig>, C<d_voidtty>, C<d_volatile>,
+C<d_vprintf>, C<d_vsnprintf>, C<d_wait4>, C<d_waitpid>, C<d_wcstombs>,
+C<d_wctomb>, C<d_writev>, C<d_xenix>, C<date>, C<db_hashtype>,
+C<db_prefixtype>, C<db_version_major>, C<db_version_minor>,
+C<db_version_patch>, C<defvoidused>, C<direntrytype>, C<dlext>, C<dlsrc>,
+C<doublesize>, C<drand01>, C<drand48_r_proto>, C<dtrace>, C<dynamic_ext>
+
+=over 4
+
+=item e
+
+=back
+
+C<eagain>, C<ebcdic>, C<echo>, C<egrep>, C<emacs>, C<endgrent_r_proto>,
+C<endhostent_r_proto>, C<endnetent_r_proto>, C<endprotoent_r_proto>,
+C<endpwent_r_proto>, C<endservent_r_proto>, C<eunicefix>, C<exe_ext>,
+C<expr>, C<extensions>, C<extern_C>, C<extras>
+
+=over 4
+
+=item f
+
+=back
+
+C<fflushall>, C<fflushNULL>, C<find>, C<firstmakefile>, C<flex>,
+C<fpossize>, C<fpostype>, C<freetype>, C<from>, C<full_ar>, C<full_csh>,
+C<full_sed>
+
+=over 4
+
+=item g
+
+=back
+
+C<gccansipedantic>, C<gccosandvers>, C<gccversion>, C<getgrent_r_proto>,
+C<getgrgid_r_proto>, C<getgrnam_r_proto>, C<gethostbyaddr_r_proto>,
+C<gethostbyname_r_proto>, C<gethostent_r_proto>, C<getlogin_r_proto>,
+C<getnetbyaddr_r_proto>, C<getnetbyname_r_proto>, C<getnetent_r_proto>,
+C<getprotobyname_r_proto>, C<getprotobynumber_r_proto>,
+C<getprotoent_r_proto>, C<getpwent_r_proto>, C<getpwnam_r_proto>,
+C<getpwuid_r_proto>, C<getservbyname_r_proto>, C<getservbyport_r_proto>,
+C<getservent_r_proto>, C<getspnam_r_proto>, C<gidformat>, C<gidsign>,
+C<gidsize>, C<gidtype>, C<glibpth>, C<gmake>, C<gmtime_r_proto>,
+C<gnulibc_version>, C<grep>, C<groupcat>, C<groupstype>, C<gzip>
+
+=over 4
+
+=item h
+
+=back
+
+C<h_fcntl>, C<h_sysfile>, C<hint>, C<hostcat>, C<html1dir>, C<html1direxp>,
+C<html3dir>, C<html3direxp>
+
+=over 4
+
+=item i
+
+=back
+
+C<i16size>, C<i16type>, C<i32size>, C<i32type>, C<i64size>, C<i64type>,
+C<i8size>, C<i8type>, C<i_arpainet>, C<i_assert>, C<i_bsdioctl>,
+C<i_crypt>, C<i_db>, C<i_dbm>, C<i_dirent>, C<i_dld>, C<i_dlfcn>,
+C<i_fcntl>, C<i_float>, C<i_fp>, C<i_fp_class>, C<i_gdbm>, C<i_gdbm_ndbm>,
+C<i_gdbmndbm>, C<i_grp>, C<i_ieeefp>, C<i_inttypes>, C<i_langinfo>,
+C<i_libutil>, C<i_limits>, C<i_locale>, C<i_machcthr>, C<i_malloc>,
+C<i_mallocmalloc>, C<i_math>, C<i_memory>, C<i_mntent>, C<i_ndbm>,
+C<i_netdb>, C<i_neterrno>, C<i_netinettcp>, C<i_niin>, C<i_poll>,
+C<i_prot>, C<i_pthread>, C<i_pwd>, C<i_rpcsvcdbm>, C<i_sfio>, C<i_sgtty>,
+C<i_shadow>, C<i_socks>, C<i_stdarg>, C<i_stddef>, C<i_stdlib>,
+C<i_string>, C<i_sunmath>, C<i_sysaccess>, C<i_sysdir>, C<i_sysfile>,
+C<i_sysfilio>, C<i_sysin>, C<i_sysioctl>, C<i_syslog>, C<i_sysmman>,
+C<i_sysmode>, C<i_sysmount>, C<i_sysndir>, C<i_sysparam>, C<i_syspoll>,
+C<i_sysresrc>, C<i_syssecrt>, C<i_sysselct>, C<i_syssockio>, C<i_sysstat>,
+C<i_sysstatfs>, C<i_sysstatvfs>, C<i_systime>, C<i_systimek>,
+C<i_systimes>, C<i_systypes>, C<i_sysuio>, C<i_sysun>, C<i_sysutsname>,
+C<i_sysvfs>, C<i_syswait>, C<i_termio>, C<i_termios>, C<i_time>,
+C<i_unistd>, C<i_ustat>, C<i_utime>, C<i_values>, C<i_varargs>,
+C<i_varhdr>, C<i_vfork>, C<ignore_versioned_solibs>, C<inc_version_list>,
+C<inc_version_list_init>, C<incpath>, C<inews>, C<initialinstalllocation>,
+C<installarchlib>, C<installbin>, C<installhtml1dir>, C<installhtml3dir>,
+C<installman1dir>, C<installman3dir>, C<installprefix>,
+C<installprefixexp>, C<installprivlib>, C<installscript>,
+C<installsitearch>, C<installsitebin>, C<installsitehtml1dir>,
+C<installsitehtml3dir>, C<installsitelib>, C<installsiteman1dir>,
+C<installsiteman3dir>, C<installsitescript>, C<installstyle>,
+C<installusrbinperl>, C<installvendorarch>, C<installvendorbin>,
+C<installvendorhtml1dir>, C<installvendorhtml3dir>, C<installvendorlib>,
+C<installvendorman1dir>, C<installvendorman3dir>, C<installvendorscript>,
+C<intsize>, C<issymlink>, C<ivdformat>, C<ivsize>, C<ivtype>
+
+=over 4
+
+=item k
+
+=back
+
+C<known_extensions>, C<ksh>
+
+=over 4
+
+=item l
+
+=back
+
+C<ld>, C<lddlflags>, C<ldflags>, C<ldflags_uselargefiles>, C<ldlibpthname>,
+C<less>, C<lib_ext>, C<libc>, C<libperl>, C<libpth>, C<libs>, C<libsdirs>,
+C<libsfiles>, C<libsfound>, C<libspath>, C<libswanted>,
+C<libswanted_uselargefiles>, C<line>, C<lint>, C<lkflags>, C<ln>, C<lns>,
+C<localtime_r_proto>, C<locincpth>, C<loclibpth>, C<longdblsize>,
+C<longlongsize>, C<longsize>, C<lp>, C<lpr>, C<ls>, C<lseeksize>,
+C<lseektype>
+
+=over 4
+
+=item m
+
+=back
+
+C<mad>, C<madlyh>, C<madlyobj>, C<madlysrc>, C<mail>, C<mailx>, C<make>,
+C<make_set_make>, C<mallocobj>, C<mallocsrc>, C<malloctype>, C<man1dir>,
+C<man1direxp>, C<man1ext>, C<man3dir>, C<man3direxp>, C<man3ext>,
+C<mips_type>, C<mistrustnm>, C<mkdir>, C<mmaptype>, C<modetype>, C<more>,
+C<multiarch>, C<mv>, C<myarchname>, C<mydomain>, C<myhostname>, C<myuname>
+
+=over 4
+
+=item n
+
+=back
+
+C<n>, C<need_va_copy>, C<netdb_hlen_type>, C<netdb_host_type>,
+C<netdb_name_type>, C<netdb_net_type>, C<nm>, C<nm_opt>, C<nm_so_opt>,
+C<nonxs_ext>, C<nroff>, C<nv_overflows_integers_at>,
+C<nv_preserves_uv_bits>, C<nveformat>, C<nvEUformat>, C<nvfformat>,
+C<nvFUformat>, C<nvgformat>, C<nvGUformat>, C<nvsize>, C<nvtype>
+
+=over 4
+
+=item o
+
+=back
+
+C<o_nonblock>, C<obj_ext>, C<old_pthread_create_joinable>, C<optimize>,
+C<orderlib>, C<osname>, C<osvers>, C<otherlibdirs>
+
+=over 4
+
+=item p
+
+=back
+
+C<package>, C<pager>, C<passcat>, C<patchlevel>, C<path_sep>, C<perl>,
+C<perl5>
+
+=over 4
+
+=item P
+
+=back
+
+C<PERL_API_REVISION>, C<PERL_API_SUBVERSION>, C<PERL_API_VERSION>,
+C<PERL_CONFIG_SH>, C<PERL_PATCHLEVEL>, C<perl_patchlevel>,
+C<PERL_REVISION>, C<PERL_SUBVERSION>, C<PERL_VERSION>, C<perladmin>,
+C<perllibs>, C<perlpath>, C<pg>, C<phostname>, C<pidtype>, C<plibpth>,
+C<pmake>, C<pr>, C<prefix>, C<prefixexp>, C<privlib>, C<privlibexp>,
+C<procselfexe>, C<prototype>, C<ptrsize>
+
+=over 4
+
+=item q
+
+=back
+
+C<quadkind>, C<quadtype>
+
+=over 4
+
+=item r
+
+=back
+
+C<randbits>, C<randfunc>, C<random_r_proto>, C<randseedtype>, C<ranlib>,
+C<rd_nodata>, C<readdir64_r_proto>, C<readdir_r_proto>, C<revision>, C<rm>,
+C<rm_try>, C<rmail>, C<run>, C<runnm>
+
+=over 4
+
+=item s
+
+=back
+
+C<sched_yield>, C<scriptdir>, C<scriptdirexp>, C<sed>, C<seedfunc>,
+C<selectminbits>, C<selecttype>, C<sendmail>, C<setgrent_r_proto>,
+C<sethostent_r_proto>, C<setlocale_r_proto>, C<setnetent_r_proto>,
+C<setprotoent_r_proto>, C<setpwent_r_proto>, C<setservent_r_proto>,
+C<sGMTIME_max>, C<sGMTIME_min>, C<sh>, C<shar>, C<sharpbang>, C<shmattype>,
+C<shortsize>, C<shrpenv>, C<shsharp>, C<sig_count>, C<sig_name>,
+C<sig_name_init>, C<sig_num>, C<sig_num_init>, C<sig_size>, C<signal_t>,
+C<sitearch>, C<sitearchexp>, C<sitebin>, C<sitebinexp>, C<sitehtml1dir>,
+C<sitehtml1direxp>, C<sitehtml3dir>, C<sitehtml3direxp>, C<sitelib>,
+C<sitelib_stem>, C<sitelibexp>, C<siteman1dir>, C<siteman1direxp>,
+C<siteman3dir>, C<siteman3direxp>, C<siteprefix>, C<siteprefixexp>,
+C<sitescript>, C<sitescriptexp>, C<sizesize>, C<sizetype>, C<sleep>,
+C<sLOCALTIME_max>, C<sLOCALTIME_min>, C<smail>, C<so>, C<sockethdr>,
+C<socketlib>, C<socksizetype>, C<sort>, C<spackage>, C<spitshell>,
+C<sPRId64>, C<sPRIeldbl>, C<sPRIEUldbl>, C<sPRIfldbl>, C<sPRIFUldbl>,
+C<sPRIgldbl>, C<sPRIGUldbl>, C<sPRIi64>, C<sPRIo64>, C<sPRIu64>,
+C<sPRIx64>, C<sPRIXU64>, C<srand48_r_proto>, C<srandom_r_proto>, C<src>,
+C<sSCNfldbl>, C<ssizetype>, C<startperl>, C<startsh>, C<static_ext>,
+C<stdchar>, C<stdio_base>, C<stdio_bufsiz>, C<stdio_cnt>, C<stdio_filbuf>,
+C<stdio_ptr>, C<stdio_stream_array>, C<strerror_r_proto>, C<strings>,
+C<submit>, C<subversion>, C<sysman>
+
+=over 4
+
+=item t
+
+=back
+
+C<tail>, C<tar>, C<targetarch>, C<tbl>, C<tee>, C<test>, C<timeincl>,
+C<timetype>, C<tmpnam_r_proto>, C<to>, C<touch>, C<tr>, C<trnl>, C<troff>,
+C<ttyname_r_proto>
+
+=over 4
+
+=item u
+
+=back
+
+C<u16size>, C<u16type>, C<u32size>, C<u32type>, C<u64size>, C<u64type>,
+C<u8size>, C<u8type>, C<uidformat>, C<uidsign>, C<uidsize>, C<uidtype>,
+C<uname>, C<uniq>, C<uquadtype>, C<use5005threads>, C<use64bitall>,
+C<use64bitint>, C<usecrosscompile>, C<usedevel>, C<usedl>, C<usedtrace>,
+C<usefaststdio>, C<useithreads>, C<uselargefiles>, C<uselongdouble>,
+C<usemallocwrap>, C<usemorebits>, C<usemultiplicity>, C<usemymalloc>,
+C<usenm>, C<useopcode>, C<useperlio>, C<useposix>, C<usereentrant>,
+C<userelocatableinc>, C<usesfio>, C<useshrplib>, C<usesitecustomize>,
+C<usesocks>, C<usethreads>, C<usevendorprefix>, C<usevfork>, C<usrinc>,
+C<uuname>, C<uvoformat>, C<uvsize>, C<uvtype>, C<uvuformat>, C<uvxformat>,
+C<uvXUformat>
+
+=over 4
+
+=item v
+
+=back
+
+C<vendorarch>, C<vendorarchexp>, C<vendorbin>, C<vendorbinexp>,
+C<vendorhtml1dir>, C<vendorhtml1direxp>, C<vendorhtml3dir>,
+C<vendorhtml3direxp>, C<vendorlib>, C<vendorlib_stem>, C<vendorlibexp>,
+C<vendorman1dir>, C<vendorman1direxp>, C<vendorman3dir>,
+C<vendorman3direxp>, C<vendorprefix>, C<vendorprefixexp>, C<vendorscript>,
+C<vendorscriptexp>, C<version>, C<version_patchlevel_string>,
+C<versiononly>, C<vi>, C<voidflags>
+
+=over 4
+
+=item x
+
+=back
+
+C<xlibpth>
+
+=over 4
+
+=item y
+
+=back
+
+C<yacc>, C<yaccflags>
+
+=over 4
+
+=item z
+
+=back
+
+C<zcat>, C<zip>
+
+=over 4
+
+=item GIT DATA
+
+=item NOTE
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+dynamic, nonxs, static
+
+=item AUTHOR
+
+=back
+
+=head2 Cwd - get pathname of current working directory
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item getcwd and friends
+
+getcwd, cwd, fastcwd, fastgetcwd, getdcwd
+
+=item abs_path and friends
+
+abs_path, realpath, fast_abs_path
+
+=item $ENV{PWD}
+
+=back
+
+=item NOTES
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 DB - programmatic interface to the Perl debugging API
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Global Variables
+
+ $DB::sub, %DB::sub, $DB::single, $DB::signal, $DB::trace, @DB::args,
+@DB::dbline, %DB::dbline, $DB::package, $DB::filename, $DB::subname,
+$DB::lineno
+
+=item API Methods
+
+CLIENT->register(), CLIENT->evalcode(STRING), CLIENT->skippkg('D::hide'),
+CLIENT->run(), CLIENT->step(), CLIENT->next(), CLIENT->done()
+
+=item Client Callback Methods
+
+CLIENT->init(), CLIENT->prestop([STRING]), CLIENT->stop(), CLIENT->idle(),
+CLIENT->poststop([STRING]), CLIENT->evalcode(STRING), CLIENT->cleanup(),
+CLIENT->output(LIST)
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 DBM_Filter -- Filter DBM keys/values
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item What is a DBM Filter?
+
+=over 4
+
+=item So what's new?
+
+=back
+
+=item METHODS
+
+=over 4
+
+=item $db->Filter_Push()
+
+=item $db->Filter_Key_Push()
+
+=item $db->Filter_Value_Push()
+
+Filter_Push, Filter_Key_Push, Filter_Value_Push
+
+=item $db->Filter_Pop()
+
+=item $db->Filtered()
+
+=back
+
+=item Writing a Filter
+
+=over 4
+
+=item Immediate Filters
+
+=item Canned Filters
+
+"name", params
+
+=back
+
+=item Filters Included
+
+utf8, encode, compress, int32, null
+
+=item NOTES
+
+=over 4
+
+=item Maintain Round Trip Integrity
+
+=item Don't mix filtered & non-filtered data in the same database file.
+
+=back
+
+=item EXAMPLE
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 DBM_Filter::compress - filter for DBM_Filter
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 DBM_Filter::encode - filter for DBM_Filter
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 DBM_Filter::int32 - filter for DBM_Filter
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 DBM_Filter::null - filter for DBM_Filter
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 DBM_Filter::utf8 - filter for DBM_Filter
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 DB_File - Perl5 access to Berkeley DB version 1.x
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<DB_HASH>, B<DB_BTREE>, B<DB_RECNO>
+
+=over 4
+
+=item Using DB_File with Berkeley DB version 2 or greater
+
+=item Interface to Berkeley DB
+
+=item Opening a Berkeley DB Database File
+
+=item Default Parameters
+
+=item In Memory Databases
+
+=back
+
+=item DB_HASH
+
+=over 4
+
+=item A Simple Example
+
+=back
+
+=item DB_BTREE
+
+=over 4
+
+=item Changing the BTREE sort order
+
+=item Handling Duplicate Keys
+
+=item The get_dup() Method
+
+=item The find_dup() Method
+
+=item The del_dup() Method
+
+=item Matching Partial Keys
+
+=back
+
+=item DB_RECNO
+
+=over 4
+
+=item The 'bval' Option
+
+=item A Simple Example
+
+=item Extra RECNO Methods
+
+B<$X-E<gt>push(list) ;>, B<$value = $X-E<gt>pop ;>, B<$X-E<gt>shift>,
+B<$X-E<gt>unshift(list) ;>, B<$X-E<gt>length>, B<$X-E<gt>splice(offset,
+length, elements);>
+
+=item Another Example
+
+=back
+
+=item THE API INTERFACE
+
+B<$status = $X-E<gt>get($key, $value [, $flags]) ;>, B<$status =
+$X-E<gt>put($key, $value [, $flags]) ;>, B<$status = $X-E<gt>del($key [,
+$flags]) ;>, B<$status = $X-E<gt>fd ;>, B<$status = $X-E<gt>seq($key,
+$value, $flags) ;>, B<$status = $X-E<gt>sync([$flags]) ;>
+
+=item DBM FILTERS
+
+B<filter_store_key>, B<filter_store_value>, B<filter_fetch_key>,
+B<filter_fetch_value>
+
+=over 4
+
+=item The Filter
+
+=item An Example -- the NULL termination problem.
+
+=item Another Example -- Key is a C int.
+
+=back
+
+=item HINTS AND TIPS
+
+=over 4
+
+=item Locking: The Trouble with fd
+
+=item Safe ways to lock a database
+
+B<Tie::DB_Lock>, B<Tie::DB_LockFile>, B<DB_File::Lock>
+
+=item Sharing Databases With C Applications
+
+=item The untie() Gotcha
+
+=back
+
+=item COMMON QUESTIONS
+
+=over 4
+
+=item Why is there Perl source in my database?
+
+=item How do I store complex data structures with DB_File?
+
+=item What does "Invalid Argument" mean?
+
+=item What does "Bareword 'DB_File' not allowed" mean?
+
+=back
+
+=item REFERENCES
+
+=item HISTORY
+
+=item BUGS
+
+=item AVAILABILITY
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Data-Dumper, Data::Dumper - stringified perl data structures,
+suitable for both printing and C<eval>
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Methods
+
+I<PACKAGE>->new(I<ARRAYREF [>, I<ARRAYREF]>), I<$OBJ>->Dump I<or>
+I<PACKAGE>->Dump(I<ARRAYREF [>, I<ARRAYREF]>), I<$OBJ>->Seen(I<[HASHREF]>),
+I<$OBJ>->Values(I<[ARRAYREF]>), I<$OBJ>->Names(I<[ARRAYREF]>),
+I<$OBJ>->Reset
+
+=item Functions
+
+Dumper(I<LIST>)
+
+=item Configuration Variables or Methods
+
+=item Exports
+
+Dumper
+
+=back
+
+=item EXAMPLES
+
+=item BUGS
+
+=over 4
+
+=item NOTE
+
+=back
+
+=item AUTHOR
+
+=item VERSION
+
+=item SEE ALSO
+
+=back
+
+=head2 Data::Dumper - stringified perl data structures, suitable for both
+printing and C<eval>
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Methods
+
+I<PACKAGE>->new(I<ARRAYREF [>, I<ARRAYREF]>), I<$OBJ>->Dump I<or>
+I<PACKAGE>->Dump(I<ARRAYREF [>, I<ARRAYREF]>), I<$OBJ>->Seen(I<[HASHREF]>),
+I<$OBJ>->Values(I<[ARRAYREF]>), I<$OBJ>->Names(I<[ARRAYREF]>),
+I<$OBJ>->Reset
+
+=item Functions
+
+Dumper(I<LIST>)
+
+=item Configuration Variables or Methods
+
+=item Exports
+
+Dumper
+
+=back
+
+=item EXAMPLES
+
+=item BUGS
+
+=over 4
+
+=item NOTE
+
+=back
+
+=item AUTHOR
+
+=item VERSION
+
+=item SEE ALSO
+
+=back
+
+=head2 Devel-DProf, Devel::DProf - a Perl code profiler
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item PROFILE FORMAT
+
+=item AUTOLOAD
+
+=item ENVIRONMENT
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Devel-PPPort, Devel::PPPort - Perl/Pollution/Portability
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Why use ppport.h?
+
+=item How to use ppport.h
+
+=item Running ppport.h
+
+=back
+
+=item FUNCTIONS
+
+=over 4
+
+=item WriteFile
+
+=back
+
+=item COMPATIBILITY
+
+=over 4
+
+=item Provided Perl compatibility API
+
+=item Perl API not supported by ppport.h
+
+perl 5.11.0, perl 5.10.0, perl 5.9.5, perl 5.9.4, perl 5.9.3, perl 5.9.2,
+perl 5.9.1, perl 5.9.0, perl 5.8.3, perl 5.8.1, perl 5.8.0, perl 5.7.3,
+perl 5.7.2, perl 5.7.1, perl 5.6.1, perl 5.6.0, perl 5.005_03, perl 5.005,
+perl 5.004_05, perl 5.004
+
+=back
+
+=item BUGS
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Devel-Peek, Devel::Peek - A data debugging tool for the XS
+programmer
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Runtime debugging
+
+=item Memory footprint debugging
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item A simple scalar string
+
+=item A simple scalar number
+
+=item A simple scalar with an extra reference
+
+=item A reference to a simple scalar
+
+=item A reference to an array
+
+=item A reference to a hash
+
+=item Dumping a large array or hash
+
+=item A reference to an SV which holds a C pointer
+
+=item A reference to a subroutine
+
+=back
+
+=item EXPORTS
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Devel::DProf - a Perl code profiler
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item PROFILE FORMAT
+
+=item AUTOLOAD
+
+=item ENVIRONMENT
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Devel::InnerPackage - find all the inner packages of a package
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item list_packages <package name>
+
+=back
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item COPYING
+
+=item BUGS
+
+=back
+
+=head2 Devel::PPPort - Perl/Pollution/Portability
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Why use ppport.h?
+
+=item How to use ppport.h
+
+=item Running ppport.h
+
+=back
+
+=item FUNCTIONS
+
+=over 4
+
+=item WriteFile
+
+=back
+
+=item COMPATIBILITY
+
+=over 4
+
+=item Provided Perl compatibility API
+
+=item Perl API not supported by ppport.h
+
+perl 5.11.0, perl 5.10.0, perl 5.9.5, perl 5.9.4, perl 5.9.3, perl 5.9.2,
+perl 5.9.1, perl 5.9.0, perl 5.8.3, perl 5.8.1, perl 5.8.0, perl 5.7.3,
+perl 5.7.2, perl 5.7.1, perl 5.6.1, perl 5.6.0, perl 5.005_03, perl 5.005,
+perl 5.004_05, perl 5.004
+
+=back
+
+=item BUGS
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Devel::Peek - A data debugging tool for the XS programmer
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Runtime debugging
+
+=item Memory footprint debugging
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item A simple scalar string
+
+=item A simple scalar number
+
+=item A simple scalar with an extra reference
+
+=item A reference to a simple scalar
+
+=item A reference to an array
+
+=item A reference to a hash
+
+=item Dumping a large array or hash
+
+=item A reference to an SV which holds a C pointer
+
+=item A reference to a subroutine
+
+=back
+
+=item EXPORTS
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Devel::SelfStubber - generate stubs for a SelfLoading module
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 Digest - Modules that calculate message digests
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+I<binary>, I<hex>, I<base64>
+
+=item OO INTERFACE
+
+$ctx = Digest->XXX($arg,...), $ctx = Digest->new(XXX => $arg,...), $ctx =
+Digest::XXX->new($arg,...), $other_ctx = $ctx->clone, $ctx->reset,
+$ctx->add( $data ), $ctx->add( $chunk1, $chunk2, ... ), $ctx->addfile(
+$io_handle ), $ctx->add_bits( $data, $nbits ), $ctx->add_bits( $bitstring
+), $ctx->digest, $ctx->hexdigest, $ctx->b64digest
+
+=item Digest speed
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Digest-MD5, Digest::MD5 - Perl interface to the MD5 Algorithm
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+md5($data,...), md5_hex($data,...), md5_base64($data,...)
+
+=item METHODS
+
+$md5 = Digest::MD5->new, $md5->reset, $md5->clone, $md5->add($data,...),
+$md5->addfile($io_handle), $md5->add_bits($data, $nbits),
+$md5->add_bits($bitstring), $md5->digest, $md5->hexdigest, $md5->b64digest
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=item AUTHORS
+
+=back
+
+=head2 Digest-SHA::lib::Digest::SHA, Digest::SHA - Perl extension for
+SHA-1/224/256/384/512
+
+=over 4
+
+=item SYNOPSIS
+
+=item SYNOPSIS (HMAC-SHA)
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item NIST STATEMENT ON SHA-1
+
+=item PADDING OF BASE64 DIGESTS
+
+=item EXPORT
+
+=item EXPORTABLE FUNCTIONS
+
+B<sha1($data, ...)>, B<sha224($data, ...)>, B<sha256($data, ...)>,
+B<sha384($data, ...)>, B<sha512($data, ...)>, B<sha1_hex($data, ...)>,
+B<sha224_hex($data, ...)>, B<sha256_hex($data, ...)>, B<sha384_hex($data,
+...)>, B<sha512_hex($data, ...)>, B<sha1_base64($data, ...)>,
+B<sha224_base64($data, ...)>, B<sha256_base64($data, ...)>,
+B<sha384_base64($data, ...)>, B<sha512_base64($data, ...)>, B<new($alg)>,
+B<reset($alg)>, B<hashsize>, B<algorithm>, B<clone>, B<add($data, ...)>,
+B<add_bits($data, $nbits)>, B<add_bits($bits)>, B<addfile(*FILE)>,
+B<addfile($filename [, $mode])>, B<dump($filename)>, B<load($filename)>,
+B<digest>, B<hexdigest>, B<b64digest>, B<hmac_sha1($data, $key)>,
+B<hmac_sha224($data, $key)>, B<hmac_sha256($data, $key)>,
+B<hmac_sha384($data, $key)>, B<hmac_sha512($data, $key)>,
+B<hmac_sha1_hex($data, $key)>, B<hmac_sha224_hex($data, $key)>,
+B<hmac_sha256_hex($data, $key)>, B<hmac_sha384_hex($data, $key)>,
+B<hmac_sha512_hex($data, $key)>, B<hmac_sha1_base64($data, $key)>,
+B<hmac_sha224_base64($data, $key)>, B<hmac_sha256_base64($data, $key)>,
+B<hmac_sha384_base64($data, $key)>, B<hmac_sha512_base64($data, $key)>
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item ACKNOWLEDGMENTS
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Digest::MD5 - Perl interface to the MD5 Algorithm
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+md5($data,...), md5_hex($data,...), md5_base64($data,...)
+
+=item METHODS
+
+$md5 = Digest::MD5->new, $md5->reset, $md5->clone, $md5->add($data,...),
+$md5->addfile($io_handle), $md5->add_bits($data, $nbits),
+$md5->add_bits($bitstring), $md5->digest, $md5->hexdigest, $md5->b64digest
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=item AUTHORS
+
+=back
+
+=head2 Digest::SHA - Perl extension for SHA-1/224/256/384/512
+
+=over 4
+
+=item SYNOPSIS
+
+=item SYNOPSIS (HMAC-SHA)
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item NIST STATEMENT ON SHA-1
+
+=item PADDING OF BASE64 DIGESTS
+
+=item EXPORT
+
+=item EXPORTABLE FUNCTIONS
+
+B<sha1($data, ...)>, B<sha224($data, ...)>, B<sha256($data, ...)>,
+B<sha384($data, ...)>, B<sha512($data, ...)>, B<sha1_hex($data, ...)>,
+B<sha224_hex($data, ...)>, B<sha256_hex($data, ...)>, B<sha384_hex($data,
+...)>, B<sha512_hex($data, ...)>, B<sha1_base64($data, ...)>,
+B<sha224_base64($data, ...)>, B<sha256_base64($data, ...)>,
+B<sha384_base64($data, ...)>, B<sha512_base64($data, ...)>, B<new($alg)>,
+B<reset($alg)>, B<hashsize>, B<algorithm>, B<clone>, B<add($data, ...)>,
+B<add_bits($data, $nbits)>, B<add_bits($bits)>, B<addfile(*FILE)>,
+B<addfile($filename [, $mode])>, B<dump($filename)>, B<load($filename)>,
+B<digest>, B<hexdigest>, B<b64digest>, B<hmac_sha1($data, $key)>,
+B<hmac_sha224($data, $key)>, B<hmac_sha256($data, $key)>,
+B<hmac_sha384($data, $key)>, B<hmac_sha512($data, $key)>,
+B<hmac_sha1_hex($data, $key)>, B<hmac_sha224_hex($data, $key)>,
+B<hmac_sha256_hex($data, $key)>, B<hmac_sha384_hex($data, $key)>,
+B<hmac_sha512_hex($data, $key)>, B<hmac_sha1_base64($data, $key)>,
+B<hmac_sha224_base64($data, $key)>, B<hmac_sha256_base64($data, $key)>,
+B<hmac_sha384_base64($data, $key)>, B<hmac_sha512_base64($data, $key)>
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item ACKNOWLEDGMENTS
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Digest::base - Digest base class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Digest::file - Calculate digests of files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+digest_file( $file, $algorithm, [$arg,...] ), digest_file_hex( $file,
+$algorithm, [$arg,...] ), digest_file_base64( $file, $algorithm, [$arg,...]
+)
+
+=item SEE ALSO
+
+=back
+
+=head2 DirHandle - supply object methods for directory handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=back
+
+=head2 Dumpvalue - provides screen dump of Perl data.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Creation
+
+C<arrayDepth>, C<hashDepth>, C<compactDump>, C<veryCompact>, C<globPrint>,
+C<dumpDBFiles>, C<dumpPackages>, C<dumpReused>, C<tick>, C<quoteHighBit>,
+C<printUndef>, C<usageOnly>, unctrl, subdump, bareStringify, quoteHighBit,
+stopDbSignal
+
+=item Methods
+
+dumpValue, dumpValues, stringify, dumpvars, set_quote, set_unctrl,
+compactDump, veryCompact, set, get
+
+=back
+
+=back
+
+=head2 DynaLoader - Dynamically load C libraries into Perl code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+@dl_library_path, @dl_resolve_using, @dl_require_symbols, @dl_librefs,
+@dl_modules, @dl_shared_objects, dl_error(), $dl_debug, dl_findfile(),
+dl_expandspec(), dl_load_file(), dl_unload_file(), dl_load_flags(),
+dl_find_symbol(), dl_find_symbol_anywhere(), dl_undef_symbols(),
+dl_install_xsub(), bootstrap()
+
+=item AUTHOR
+
+=back
+
+=head2 DynaLoader::XSLoader, XSLoader - Dynamically load C libraries into
+Perl code
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Migration from C<DynaLoader>
+
+=item Backward compatible boilerplate
+
+=back
+
+=item Order of initialization: early load()
+
+=over 4
+
+=item The most hairy case
+
+=back
+
+=item DIAGNOSTICS
+
+C<Can't find '%s' symbol in %s>, C<Can't load '%s' for module %s: %s>,
+C<Undefined symbols present after loading %s: %s>,
+C<XSLoader::load('Your::Module', $Your::Module::VERSION)>
+
+=item LIMITATIONS
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT & LICENSE
+
+=back
+
+=head2 Encode - character encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=over 4
+
+=item Table of Contents
+
+=back
+
+=item DESCRIPTION
+
+=over 4
+
+=item TERMINOLOGY
+
+=back
+
+=item PERL ENCODING API
+
+$octets = encode(ENCODING, $string [, CHECK]), $string = decode(ENCODING,
+$octets [, CHECK]), [$obj =] find_encoding(ENCODING), [$length =]
+from_to($octets, FROM_ENC, TO_ENC [, CHECK]), $octets =
+encode_utf8($string);, $string = decode_utf8($octets [, CHECK]);
+
+=over 4
+
+=item Listing available encodings
+
+=item Defining Aliases
+
+=item Finding IANA Character Set Registry names
+
+=back
+
+=item Encoding via PerlIO
+
+=item Handling Malformed Data
+
+B<NOTE:> Not all encoding support this feature, I<CHECK> =
+Encode::FB_DEFAULT ( == 0), I<CHECK> = Encode::FB_CROAK ( == 1), I<CHECK> =
+Encode::FB_QUIET, I<CHECK> = Encode::FB_WARN, perlqq mode (I<CHECK> =
+Encode::FB_PERLQQ), HTML charref mode (I<CHECK> = Encode::FB_HTMLCREF), XML
+charref mode (I<CHECK> = Encode::FB_XMLCREF), The bitmask,
+Encode::LEAVE_SRC
+
+=over 4
+
+=item coderef for CHECK
+
+=back
+
+=item Defining Encodings
+
+=item The UTF8 flag
+
+Goal #1:, Goal #2:, Goal #3:, Goal #4:
+
+=over 4
+
+=item Messing with Perl's Internals
+
+is_utf8(STRING [, CHECK]), _utf8_on(STRING), _utf8_off(STRING)
+
+=back
+
+=item UTF-8 vs. utf8 vs. UTF8
+
+=item SEE ALSO
+
+=item MAINTAINER
+
+=item COPYRIGHT
+
+=back
+
+=head2 Encode::Alias - alias definitions to encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+As a simple string, As a qr// compiled regular expression, e.g.:, As a code
+reference, e.g.:
+
+=over 4
+
+=item Alias overloading
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::Byte - Single Byte Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::CJKConstants -- Internally used by Encode::??::ISO_2022_*
+
+=head2 Encode::CN - China-based Chinese Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::CN::HZ -- internally used by Encode::CN
+
+=head2 Encode::Config -- internally used by Encode
+
+=head2 Encode::EBCDIC - EBCDIC Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::Encoding - Encode Implementation Base Class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Methods you should implement
+
+-E<gt>encode($string [,$check]), -E<gt>decode($octets [,$check]),
+-E<gt>cat_decode($destination, $octets, $offset, $terminator [,$check])
+
+=item Other methods defined in Encode::Encodings
+
+-E<gt>name, -E<gt>mime_name, -E<gt>renew, -E<gt>renewed, -E<gt>perlio_ok(),
+-E<gt>needs_lines()
+
+=item Example: Encode::ROT13
+
+=back
+
+=item Why the heck Encode API is different?
+
+=over 4
+
+=item Compiled Encodings
+
+=back
+
+=item SEE ALSO
+
+Scheme 1, Scheme 2, Other Schemes
+
+=back
+
+=head2 Encode::GSM0338 -- ESTI GSM 03.38 Encoding
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::Guess -- Guesses encoding from data
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+Encode::Guess->set_suspects, Encode::Guess->add_suspects,
+Encode::decode("Guess" ...), Encode::Guess->guess($data),
+guess_encoding($data, [, I<list of suspects>])
+
+=item CAVEATS
+
+=item TO DO
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::JP - Japanese Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item Note on ISO-2022-JP(-1)?
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::JP::H2Z -- internally used by Encode::JP::2022_JP*
+
+=head2 Encode::JP::JIS7 -- internally used by Encode::JP
+
+=head2 Encode::KR - Korean Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::KR::2022_KR -- internally used by Encode::KR
+
+=head2 Encode::MIME::Header -- MIME 'B' and 'Q' header encoding
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::MIME::Name, Encode::MIME::NAME -- internally used by Encode
+
+=over 4
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::PerlIO -- a detailed document on Encode and PerlIO
+
+=over 4
+
+=item Overview
+
+=item How does it work?
+
+=item Line Buffering
+
+=over 4
+
+=item How can I tell whether my encoding fully supports PerlIO ?
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::Supported -- Encodings supported by Encode
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Encoding Names
+
+=back
+
+=item Supported Encodings
+
+=over 4
+
+=item Built-in Encodings
+
+=item Encode::Unicode -- other Unicode encodings
+
+=item Encode::Byte -- Extended ASCII
+
+ISO-8859 and corresponding vendor mappings, KOI8 - De Facto Standard for
+the Cyrillic world
+
+=item gsm0338 - Hentai Latin 1
+
+gsm0338 support before 2.19
+
+=item CJK: Chinese, Japanese, Korean (Multibyte)
+
+Encode::CN -- Continental China, Encode::JP -- Japan, Encode::KR -- Korea,
+Encode::TW -- Taiwan, Encode::HanExtra -- More Chinese via CPAN,
+Encode::JIS2K -- JIS X 0213 encodings via CPAN
+
+=item Miscellaneous encodings
+
+Encode::EBCDIC, Encode::Symbols, Encode::MIME::Header, Encode::Guess
+
+=back
+
+=item Unsupported encodings
+
+ ISO-2022-JP-2 [RFC1554], ISO-2022-CN [RFC1922], Various HP-UX encodings,
+Cyrillic encoding ISO-IR-111, ISO-8859-8-1 [Hebrew], ISIRI 3342, Iran
+System, ISIRI 2900 [Farsi], Thai encoding TCVN, Vietnamese encodings VPS,
+Various Mac encodings, (Mac) Indic encodings
+
+=item Encoding vs. Charset -- terminology
+
+=item Encoding Classification (by Anton Tagunov and Dan Kogai)
+
+=over 4
+
+=item Microsoft-related naming mess
+
+KS_C_5601-1987, GB2312, Big5, Shift_JIS
+
+=back
+
+=item Glossary
+
+character repertoire, coded character set (CCS), character encoding scheme
+(CES), charset (in MIME context), EUC, ISO-2022, UCS, UCS-2, Unicode, UTF,
+UTF-16
+
+=item See Also
+
+=item References
+
+ECMA, ECMA-035 (eq C<ISO-2022>), IANA, Assigned Charset Names by IANA, ISO,
+RFC, UC, Unicode Glossary
+
+=over 4
+
+=item Other Notable Sites
+
+czyborra.com, CJK.inf, Jungshik Shin's Hangul FAQ, debian.org:
+"Introduction to i18n"
+
+=item Offline sources
+
+C<CJKV Information Processing> by Ken Lunde
+
+=back
+
+=back
+
+=head2 Encode::Symbol - Symbol Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::TW - Taiwan-based Chinese Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::Unicode -- Various Unicode Transformation Formats
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+L<http://www.unicode.org/glossary/> says:, Quick Reference
+
+=item Size, Endianness, and BOM
+
+=over 4
+
+=item by size
+
+=item by endianness
+
+BOM as integer when fetched in network byte order
+
+=back
+
+=item Surrogate Pairs
+
+=item Error Checking
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::Unicode::UTF7 -- UTF-7 encoding
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item In Practice
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encode::Alias, Encode::Alias - alias definitions to
+encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+As a simple string, As a qr// compiled regular expression, e.g.:, As a code
+reference, e.g.:
+
+=over 4
+
+=item Alias overloading
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encode::CJKConstants, Encode::CJKConstants.pm --
+Internally used by Encode::??::ISO_2022_*
+
+=head2 Encode::lib::Encode::CN::HZ, Encode::CN::HZ -- internally used by
+Encode::CN
+
+=head2 Encode::lib::Encode::Config, Encode::Config -- internally used by
+Encode
+
+=head2 Encode::lib::Encode::Encoding, Encode::Encoding - Encode
+Implementation Base Class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Methods you should implement
+
+-E<gt>encode($string [,$check]), -E<gt>decode($octets [,$check]),
+-E<gt>cat_decode($destination, $octets, $offset, $terminator [,$check])
+
+=item Other methods defined in Encode::Encodings
+
+-E<gt>name, -E<gt>mime_name, -E<gt>renew, -E<gt>renewed, -E<gt>perlio_ok(),
+-E<gt>needs_lines()
+
+=item Example: Encode::ROT13
+
+=back
+
+=item Why the heck Encode API is different?
+
+=over 4
+
+=item Compiled Encodings
+
+=back
+
+=item SEE ALSO
+
+Scheme 1, Scheme 2, Other Schemes
+
+=back
+
+=head2 Encode::lib::Encode::GSM0338, Encode::GSM0338 -- ESTI GSM 03.38
+Encoding
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encode::Guess, Encode::Guess -- Guesses encoding from
+data
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+Encode::Guess->set_suspects, Encode::Guess->add_suspects,
+Encode::decode("Guess" ...), Encode::Guess->guess($data),
+guess_encoding($data, [, I<list of suspects>])
+
+=item CAVEATS
+
+=item TO DO
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encode::JP::H2Z, Encode::JP::H2Z -- internally used by
+Encode::JP::2022_JP*
+
+=head2 Encode::lib::Encode::JP::JIS7, Encode::JP::JIS7 -- internally used
+by Encode::JP
+
+=head2 Encode::lib::Encode::KR::2022_KR, Encode::KR::2022_KR -- internally
+used by Encode::KR
+
+=head2 Encode::lib::Encode::MIME::Header, Encode::MIME::Header -- MIME 'B'
+and 'Q' header encoding
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encode::MIME::Name, Encode::MIME::NAME -- internally
+used by Encode
+
+=over 4
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encode::PerlIO, Encode::PerlIO -- a detailed document
+on Encode and PerlIO
+
+=over 4
+
+=item Overview
+
+=item How does it work?
+
+=item Line Buffering
+
+=over 4
+
+=item How can I tell whether my encoding fully supports PerlIO ?
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encode::Supported, Encode::Supported -- Encodings
+supported by Encode
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Encoding Names
+
+=back
+
+=item Supported Encodings
+
+=over 4
+
+=item Built-in Encodings
+
+=item Encode::Unicode -- other Unicode encodings
+
+=item Encode::Byte -- Extended ASCII
+
+ISO-8859 and corresponding vendor mappings, KOI8 - De Facto Standard for
+the Cyrillic world
+
+=item gsm0338 - Hentai Latin 1
+
+gsm0338 support before 2.19
+
+=item CJK: Chinese, Japanese, Korean (Multibyte)
+
+Encode::CN -- Continental China, Encode::JP -- Japan, Encode::KR -- Korea,
+Encode::TW -- Taiwan, Encode::HanExtra -- More Chinese via CPAN,
+Encode::JIS2K -- JIS X 0213 encodings via CPAN
+
+=item Miscellaneous encodings
+
+Encode::EBCDIC, Encode::Symbols, Encode::MIME::Header, Encode::Guess
+
+=back
+
+=item Unsupported encodings
+
+ ISO-2022-JP-2 [RFC1554], ISO-2022-CN [RFC1922], Various HP-UX encodings,
+Cyrillic encoding ISO-IR-111, ISO-8859-8-1 [Hebrew], ISIRI 3342, Iran
+System, ISIRI 2900 [Farsi], Thai encoding TCVN, Vietnamese encodings VPS,
+Various Mac encodings, (Mac) Indic encodings
+
+=item Encoding vs. Charset -- terminology
+
+=item Encoding Classification (by Anton Tagunov and Dan Kogai)
+
+=over 4
+
+=item Microsoft-related naming mess
+
+KS_C_5601-1987, GB2312, Big5, Shift_JIS
+
+=back
+
+=item Glossary
+
+character repertoire, coded character set (CCS), character encoding scheme
+(CES), charset (in MIME context), EUC, ISO-2022, UCS, UCS-2, Unicode, UTF,
+UTF-16
+
+=item See Also
+
+=item References
+
+ECMA, ECMA-035 (eq C<ISO-2022>), IANA, Assigned Charset Names by IANA, ISO,
+RFC, UC, Unicode Glossary
+
+=over 4
+
+=item Other Notable Sites
+
+czyborra.com, CJK.inf, Jungshik Shin's Hangul FAQ, debian.org:
+"Introduction to i18n"
+
+=item Offline sources
+
+C<CJKV Information Processing> by Ken Lunde
+
+=back
+
+=back
+
+=head2 Encode::lib::Encode::Unicode::UTF7, Encode::Unicode::UTF7 -- UTF-7
+encoding
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item In Practice
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encoder, Encode::Encoder -- Object Oriented Encoder
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item Description
+
+=over 4
+
+=item Predefined Methods
+
+$e = Encode::Encoder-E<gt>new([$data, $encoding]);, encoder(),
+$e-E<gt>data([$data]), $e-E<gt>encoding([$encoding]),
+$e-E<gt>bytes([$encoding])
+
+=item Example: base64 transcoder
+
+=item Operator Overloading
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Encodencoding, encoding - allows you to write your script in
+non-ascii or non-utf8
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=over 4
+
+=item Literal Conversions
+
+=item PerlIO layers for C<STD(IN|OUT)>
+
+=item Implicit upgrading for byte strings
+
+=item Side effects
+
+=back
+
+=item FEATURES THAT REQUIRE 5.8.1
+
+"NON-EUC" doublebyte encodings, tr//, DATA pseudo-filehandle
+
+=item USAGE
+
+use encoding [I<ENCNAME>] ;, use encoding I<ENCNAME> [ STDIN =E<gt>
+I<ENCNAME_IN> ...] ;, use encoding I<ENCNAME> Filter=E<gt>1;, no encoding;
+
+=item The Filter Option
+
+=over 4
+
+=item Filter-related changes at Encode version 1.87
+
+=back
+
+=item CAVEATS
+
+=over 4
+
+=item NOT SCOPED
+
+=item DO NOT MIX MULTIPLE ENCODINGS
+
+=item tr/// with ranges
+
+Legend of characters above
+
+=back
+
+=item EXAMPLE - Greekperl
+
+=item KNOWN PROBLEMS
+
+literals in regex that are longer than 127 bytes, EBCDIC, format, Thread
+safety
+
+=over 4
+
+=item The Logic of :locale
+
+=back
+
+=item HISTORY
+
+=item SEE ALSO
+
+=back
+
+=head2 Encoder, Encode::Encoder -- Object Oriented Encoder
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item Description
+
+=over 4
+
+=item Predefined Methods
+
+$e = Encode::Encoder-E<gt>new([$data, $encoding]);, encoder(),
+$e-E<gt>data([$data]), $e-E<gt>encoding([$encoding]),
+$e-E<gt>bytes([$encoding])
+
+=item Example: base64 transcoder
+
+=item Operator Overloading
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 English - use nice English (or awk) names for ugly punctuation
+variables
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item PERFORMANCE
+
+=back
+
+=head2 Env - perl module that imports environment variables as scalars or
+arrays
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item LIMITATIONS
+
+=item AUTHOR
+
+=back
+
+=head2 Errno - System errno constants
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEATS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Exporter - Implements default import method for modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item How to Export
+
+=item Selecting What To Export
+
+=item How to Import
+
+C<use YourModule;>, C<use YourModule ();>, C<use YourModule qw(...);>
+
+=back
+
+=item Advanced features
+
+=over 4
+
+=item Specialised Import Lists
+
+=item Exporting without using Exporter's import method
+
+=item Exporting without inheriting from Exporter
+
+=item Module Version Checking
+
+=item Managing Unknown Symbols
+
+=item Tag Handling Utility Functions
+
+=item Generating combined tags
+
+=item C<AUTOLOAD>ed Constants
+
+=back
+
+=item Good Practices
+
+=over 4
+
+=item Declaring C<@EXPORT_OK> and Friends
+
+=item Playing Safe
+
+=item What not to Export
+
+=back
+
+=item SEE ALSO
+
+=item LICENSE
+
+=back
+
+=head2 Exporter::Heavy - Exporter guts
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::CBuilder - Compile and link C code for Perl modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+new, have_compiler, compile, C<object_file>, C<include_dirs>,
+C<extra_compiler_flags>, link, lib_file, module_name, extra_linker_flags,
+link_executable, exe_file, object_file, lib_file, exe_file, prelink,
+need_prelink, extra_link_args_after_prelink
+
+=item TO DO
+
+=item HISTORY
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::CBuilder::Platform::Windows - Builder class for Windows
+platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::Command - utilities to replace common UNIX commands in
+Makefiles etc.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item FUNCTIONS
+
+=back
+
+=back
+
+cat
+
+eqtime
+
+rm_rf
+
+rm_f
+
+touch
+
+mv
+
+cp
+
+chmod
+
+mkpath
+
+test_f
+
+test_d
+
+dos2unix
+
+=over 4
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Command::MM - Commands for the MM's to use in Makefiles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<test_harness>
+
+=back
+
+B<pod2man>
+
+B<warn_if_old_packlist>
+
+B<perllocal_install>
+
+B<uninstall>
+
+=head2 ExtUtils::Constant - generate XS code to import C header constants
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USAGE
+
+IV, UV, NV, PV, PVN, SV, YES, NO, UNDEF
+
+=item FUNCTIONS
+
+=back
+
+constant_types
+
+XS_constant PACKAGE, TYPES, XS_SUBNAME, C_SUBNAME
+
+autoload PACKAGE, VERSION, AUTOLOADER
+
+WriteMakefileSnippet
+
+WriteConstants ATTRIBUTE =E<gt> VALUE [, ...], NAME, DEFAULT_TYPE,
+BREAKOUT_AT, NAMES, PROXYSUBS, C_FH, C_FILE, XS_FH, XS_FILE, XS_SUBNAME,
+C_SUBNAME
+
+=over 4
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Constant::Base - base class for ExtUtils::Constant objects
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USAGE
+
+=back
+
+header
+
+memEQ_clause args_hashref
+
+dump_names arg_hashref, ITEM..
+
+assign arg_hashref, VALUE..
+
+return_clause arg_hashref, ITEM
+
+switch_clause arg_hashref, NAMELEN, ITEMHASH, ITEM..
+
+params WHAT
+
+dogfood arg_hashref, ITEM..
+
+normalise_items args, default_type, seen_types, seen_items, ITEM..
+
+C_constant arg_hashref, ITEM.., name, type, value, macro, default, pre,
+post, def_pre, def_post, utf8, weight
+
+=over 4
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Constant::Utils - helper functions for ExtUtils::Constant
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USAGE
+
+C_stringify NAME
+
+=back
+
+perl_stringify NAME
+
+=over 4
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Constant::XS - generate C code for XS modules' constants.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Embed - Utilities for embedding Perl in C/C++ applications
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item @EXPORT
+
+=item FUNCTIONS
+
+xsinit(), Examples, ldopts(), Examples, perl_inc(), ccflags(), ccdlflags(),
+ccopts(), xsi_header(), xsi_protos(@modules), xsi_body(@modules)
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Install - install files from here to there
+
+=over 4
+
+=item SYNOPSIS
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+_chmod($$;$), _warnonce(@), _choke(@)
+
+=back
+
+_move_file_at_boot( $file, $target, $moan )
+
+_unlink_or_rename( $file, $tryhard, $installing )
+
+=over 4
+
+=item Functions
+
+_get_install_skip
+
+=back
+
+_have_write_access
+
+_can_write_dir(C<$dir>)
+
+_mkpath($dir,$show,$mode,$verbose,$dry_run)
+
+_copy($from,$to,$verbose,$dry_run)
+
+_chdir($from)
+
+B<install>
+
+_do_cleanup
+
+install_rooted_file( $file ), install_rooted_dir( $dir )
+
+forceunlink( $file, $tryhard )
+
+directory_not_empty( $dir )
+
+B<install_default> I<DISCOURAGED>
+
+B<uninstall>
+
+inc_uninstall($filepath,$libdir,$verbose,$dry_run,$ignore,$results)
+
+run_filter($cmd,$src,$dest)
+
+B<pm_to_blib>
+
+_autosplit
+
+_invokant
+
+=over 4
+
+=item ENVIRONMENT
+
+B<PERL_INSTALL_ROOT>, B<EU_INSTALL_IGNORE_SKIP>,
+B<EU_INSTALL_SITE_SKIPFILE>, B<EU_INSTALL_ALWAYS_COPY>
+
+=item AUTHOR
+
+=item LICENSE
+
+=back
+
+=head2 ExtUtils::Installed - Inventory management of installed modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USAGE
+
+=item METHODS
+
+new(), modules(), files(), directories(), directory_tree(), validate(),
+packlist(), version()
+
+=item EXAMPLE
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Liblist - determine libraries to use and how to use them
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+For static extensions, For dynamic extensions at build/link time, For
+dynamic extensions at load time
+
+=over 4
+
+=item EXTRALIBS
+
+=item LDLOADLIBS and LD_RUN_PATH
+
+=item BSLOADLIBS
+
+=back
+
+=item PORTABILITY
+
+=over 4
+
+=item VMS implementation
+
+=item Win32 implementation
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM - OS adjusted ExtUtils::MakeMaker subclass
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::MM_AIX - AIX specific subclass of ExtUtils::MM_Unix
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden methods
+
+=back
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM_Any - Platform-agnostic MM methods
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Cross-platform helper methods
+
+=back
+
+=back
+
+=over 4
+
+=item Targets
+
+=back
+
+=over 4
+
+=item Init methods
+
+=back
+
+=over 4
+
+=item Tools
+
+=back
+
+=over 4
+
+=item File::Spec wrappers
+
+=back
+
+=over 4
+
+=item Misc
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::MM_BeOS - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+os_flavor
+
+init_linker
+
+=head2 ExtUtils::MM_Cygwin - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+os_flavor
+
+=back
+
+cflags
+
+replace_manpage_separator
+
+init_linker
+
+maybe_command
+
+=head2 ExtUtils::MM_DOS - DOS specific subclass of ExtUtils::MM_Unix
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden methods
+
+os_flavor
+
+=back
+
+=back
+
+B<replace_manpage_separator>
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM_Darwin - special behaviors for OS X
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overriden Methods
+
+=back
+
+=back
+
+=head2 ExtUtils::MM_MacOS - once produced Makefiles for MacOS Classic
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::MM_NW5 - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+os_flavor
+
+init_platform, platform_constants
+
+const_cccmd
+
+static_lib
+
+dynamic_lib
+
+=head2 ExtUtils::MM_OS2 - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+init_dist
+
+=back
+
+init_linker
+
+os_flavor
+
+=head2 ExtUtils::MM_QNX - QNX specific subclass of ExtUtils::MM_Unix
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden methods
+
+=back
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM_UWIN - U/WIN specific subclass of ExtUtils::MM_Unix
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden methods
+
+os_flavor
+
+=back
+
+=back
+
+B<replace_manpage_separator>
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=back
+
+=over 4
+
+=item Methods
+
+os_flavor
+
+=back
+
+c_o (o)
+
+cflags (o)
+
+const_cccmd (o)
+
+const_config (o)
+
+const_loadlibs (o)
+
+constants (o)
+
+depend (o)
+
+init_DEST
+
+init_dist
+
+dist (o)
+
+dist_basics (o)
+
+dist_ci (o)
+
+dist_core (o)
+
+B<dist_target>
+
+B<tardist_target>
+
+B<zipdist_target>
+
+B<tarfile_target>
+
+zipfile_target
+
+uutardist_target
+
+shdist_target
+
+dlsyms (o)
+
+dynamic_bs (o)
+
+dynamic_lib (o)
+
+exescan
+
+extliblist
+
+find_perl
+
+fixin
+
+force (o)
+
+guess_name
+
+has_link_code
+
+init_dirscan
+
+init_MANPODS
+
+init_MAN1PODS
+
+init_MAN3PODS
+
+init_PM
+
+init_DIRFILESEP
+
+init_main
+
+init_others
+
+init_linker
+
+init_lib2arch
+
+init_PERL
+
+init_platform, platform_constants
+
+init_PERM
+
+init_xs
+
+install (o)
+
+installbin (o)
+
+linkext (o)
+
+lsdir
+
+macro (o)
+
+makeaperl (o)
+
+makefile (o)
+
+maybe_command
+
+needs_linking (o)
+
+parse_abstract
+
+parse_version
+
+pasthru (o)
+
+perl_script
+
+perldepend (o)
+
+pm_to_blib
+
+post_constants (o)
+
+post_initialize (o)
+
+postamble (o)
+
+ppd
+
+prefixify
+
+processPL (o)
+
+quote_paren
+
+replace_manpage_separator
+
+cd
+
+oneliner
+
+quote_literal
+
+escape_newlines
+
+max_exec_len
+
+static (o)
+
+static_lib (o)
+
+staticmake (o)
+
+subdir_x (o)
+
+subdirs (o)
+
+test (o)
+
+test_via_harness (override)
+
+test_via_script (override)
+
+tool_xsubpp (o)
+
+all_target
+
+top_targets (o)
+
+writedoc
+
+xs_c (o)
+
+xs_cpp (o)
+
+xs_o (o)
+
+=over 4
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM_VMS - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Methods always loaded
+
+wraplist
+
+=back
+
+=back
+
+=over 4
+
+=item Methods
+
+guess_name (override)
+
+=back
+
+find_perl (override)
+
+maybe_command (override)
+
+pasthru (override)
+
+pm_to_blib (override)
+
+perl_script (override)
+
+replace_manpage_separator
+
+init_DEST
+
+init_DIRFILESEP
+
+init_main (override)
+
+init_others (override)
+
+init_platform (override)
+
+platform_constants
+
+init_VERSION (override)
+
+constants (override)
+
+special_targets
+
+cflags (override)
+
+const_cccmd (override)
+
+tools_other (override)
+
+init_dist (override)
+
+c_o (override)
+
+xs_c (override)
+
+xs_o (override)
+
+dlsyms (override)
+
+dynamic_lib (override)
+
+static_lib (override)
+
+extra_clean_files
+
+zipfile_target, tarfile_target, shdist_target
+
+install (override)
+
+perldepend (override)
+
+makeaperl (override)
+
+maketext_filter (override)
+
+prefixify (override)
+
+cd
+
+oneliner
+
+B<echo>
+
+quote_literal
+
+escape_newlines
+
+max_exec_len
+
+init_linker
+
+catdir (override), catfile (override)
+
+eliminate_macros
+
+fixpath
+
+os_flavor
+
+=over 4
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::MM_VOS - VOS specific subclass of ExtUtils::MM_Unix
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden methods
+
+=back
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM_Win32 - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item Overridden methods
+
+B<dlsyms>
+
+=back
+
+replace_manpage_separator
+
+B<maybe_command>
+
+B<init_DIRFILESEP>
+
+B<init_others>
+
+init_platform, platform_constants
+
+special_targets
+
+static_lib
+
+dynamic_lib
+
+extra_clean_files
+
+init_linker
+
+perl_script
+
+xs_o
+
+pasthru
+
+arch_check (override)
+
+oneliner
+
+cd
+
+max_exec_len
+
+os_flavor
+
+cflags
+
+=head2 ExtUtils::MM_Win95 - method to customize MakeMaker for Win9X
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden methods
+
+xs_c
+
+=back
+
+=back
+
+xs_cpp
+
+xs_o
+
+max_exec_len
+
+os_flavor
+
+=over 4
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::MY - ExtUtils::MakeMaker subclass for customization
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::MakeMaker - Create a module Makefile
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item How To Write A Makefile.PL
+
+=item Default Makefile Behaviour
+
+=item make test
+
+=item make testdb
+
+=item make install
+
+=item INSTALL_BASE
+
+=item PREFIX and LIB attribute
+
+=item AFS users
+
+=item Static Linking of a new Perl Binary
+
+=item Determination of Perl Library and Installation Locations
+
+=item Which architecture dependent directory?
+
+=item Using Attributes and Parameters
+
+ABSTRACT, ABSTRACT_FROM, AUTHOR, BINARY_LOCATION, BUILD_REQUIRES, C,
+CCFLAGS, CONFIG, CONFIGURE, CONFIGURE_REQUIRES, DEFINE, DESTDIR, DIR,
+DISTNAME, DISTVNAME, DL_FUNCS, DL_VARS, EXCLUDE_EXT, EXE_FILES,
+FIRST_MAKEFILE, FULLPERL, FULLPERLRUN, FULLPERLRUNINST, FUNCLIST, H,
+IMPORTS, INC, INCLUDE_EXT, INSTALLARCHLIB, INSTALLBIN, INSTALLDIRS,
+INSTALLMAN1DIR, INSTALLMAN3DIR, INSTALLPRIVLIB, INSTALLSCRIPT,
+INSTALLSITEARCH, INSTALLSITEBIN, INSTALLSITELIB, INSTALLSITEMAN1DIR,
+INSTALLSITEMAN3DIR, INSTALLSITESCRIPT, INSTALLVENDORARCH, INSTALLVENDORBIN,
+INSTALLVENDORLIB, INSTALLVENDORMAN1DIR, INSTALLVENDORMAN3DIR,
+INSTALLVENDORSCRIPT, INST_ARCHLIB, INST_BIN, INST_LIB, INST_MAN1DIR,
+INST_MAN3DIR, INST_SCRIPT, LD, LDDLFLAGS, LDFROM, LIB, LIBPERL_A, LIBS,
+LICENSE, LINKTYPE, MAKE, MAKEAPERL, MAKEFILE_OLD, MAN1PODS, MAN3PODS,
+MAP_TARGET, META_ADD, META_MERGE, MIN_PERL_VERSION, MYEXTLIB, NAME,
+NEEDS_LINKING, NOECHO, NORECURS, NO_META, NO_VC, OBJECT, OPTIMIZE, PERL,
+PERL_CORE, PERLMAINCC, PERL_ARCHLIB, PERL_LIB, PERL_MALLOC_OK, PERLPREFIX,
+PERLRUN, PERLRUNINST, PERL_SRC, PERM_DIR, PERM_RW, PERM_RWX, PL_FILES, PM,
+PMLIBDIRS, PM_FILTER, POLLUTE, PPM_INSTALL_EXEC, PPM_INSTALL_SCRIPT,
+PREFIX, PREREQ_FATAL, PREREQ_PM, PREREQ_PRINT, PRINT_PREREQ, SITEPREFIX,
+SIGN, SKIP, TYPEMAPS, VENDORPREFIX, VERBINST, VERSION, VERSION_FROM,
+VERSION_SYM, XS, XSOPT, XSPROTOARG, XS_VERSION
+
+=item Additional lowercase attributes
+
+clean, depend, dist, dynamic_lib, linkext, macro, postamble, realclean,
+test, tool_autosplit
+
+=item Overriding MakeMaker Methods
+
+=item The End Of Cargo Cult Programming
+
+C<< MAN3PODS => ' ' >>
+
+=item Hintsfile support
+
+=item Distribution Support
+
+ make distcheck, make skipcheck, make distclean, make manifest,
+ make distdir, make disttest, make tardist, make dist, make
+uutardist, make shdist, make zipdist, make ci
+
+=item Module Meta-Data
+
+=item Disabling an extension
+
+=item Other Handy Functions
+
+prompt
+
+=back
+
+=item ENVIRONMENT
+
+PERL_MM_OPT, PERL_MM_USE_DEFAULT, PERL_CORE
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item LICENSE
+
+=back
+
+=head2 ExtUtils::MakeMaker::Config - Wrapper around Config.pm
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::MakeMaker::FAQ - Frequently Asked Questions About
+MakeMaker
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Module Installation
+
+How do I install a module into my home directory?, How do I get MakeMaker
+and Module::Build to install to the same place?, How do I keep from
+installing man pages?, How do I use a module without installing it?, PREFIX
+vs INSTALL_BASE from Module::Build::Cookbook
+
+=item Philosophy and History
+
+Why not just use <insert other build config tool here>?, What is
+Module::Build and how does it relate to MakeMaker?, pure perl. no make, no
+shell commands, easier to customize, cleaner internals, less cruft
+
+=item Module Writing
+
+How do I keep my $VERSION up to date without resetting it manually?, What's
+this F<META.yml> thing and how did it get in my F<MANIFEST>?!, How do I
+delete everything not in my F<MANIFEST>?, Which zip should I use on Windows
+for '[nd]make zipdist'?
+
+=item XS
+
+How to I prevent "object version X.XX does not match bootstrap parameter
+Y.YY" errors?, How do I make two or more XS files coexist in the same
+directory?
+
+=back
+
+=item PATCHING
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MakeMaker::Tutorial - Writing a module with MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item The Mantra
+
+=item The Layout
+
+Makefile.PL, MANIFEST, lib/, t/, Changes, README, INSTALL, MANIFEST.SKIP,
+bin/
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::Manifest - utilities to write and check a MANIFEST file
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Functions
+
+mkmanifest
+
+=back
+
+=back
+
+manifind
+
+manicheck
+
+filecheck
+
+fullcheck
+
+skipcheck
+
+maniread
+
+maniskip
+
+manicopy
+
+maniadd
+
+=over 4
+
+=item MANIFEST
+
+=item MANIFEST.SKIP
+
+#!include_default, #!include /Path/to/another/manifest.skip
+
+=item EXPORT_OK
+
+=item GLOBAL VARIABLES
+
+=back
+
+=over 4
+
+=item DIAGNOSTICS
+
+C<Not in MANIFEST:> I<file>, C<Skipping> I<file>, C<No such file:> I<file>,
+C<MANIFEST:> I<$!>, C<Added to MANIFEST:> I<file>
+
+=item ENVIRONMENT
+
+B<PERL_MM_MANIFEST_DEBUG>
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Miniperl, writemain - write the C code for perlmain.c
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::Mkbootstrap - make a bootstrap file for use by DynaLoader
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::Mksymlists - write linker options files for dynamic
+extension
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+DLBASE, DL_FUNCS, DL_VARS, FILE, FUNCLIST, IMPORTS, NAME
+
+=item AUTHOR
+
+=item REVISION
+
+mkfh()
+
+=back
+
+__find_relocations
+
+=head2 ExtUtils::Packlist - manage .packlist files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USAGE
+
+=item FUNCTIONS
+
+new(), read(), write(), validate(), packlist_file()
+
+=item EXAMPLE
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::ParseXS - converts Perl XS code into C code
+
+=over 4
+
+=item SYNOPSIS
+
+=item EXPORT
+
+=item FUNCTIONS
+
+process_xs(), B<C++>, B<hiertype>, B<except>, B<typemap>, B<prototypes>,
+B<versioncheck>, B<linenumbers>, B<optimize>, B<inout>, B<argtypes>, B<s>,
+errors()
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::XSSymSet - keep sets of symbol names palatable to the VMS
+linker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+new([$maxlen[,$silent]]), addsym($name[,$maxlen[,$silent]]),
+trimsym($name[,$maxlen[,$silent]]), delsym($name), get_orig($trimmed),
+get_trimmed($name), all_orig(), all_trimmed()
+
+=item AUTHOR
+
+=item REVISION
+
+=back
+
+=head2 ExtUtils::testlib - add blib/* directories to @INC
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 Fatal - Replace functions with equivalents which succeed or die
+
+=over 4
+
+=item SYNOPSIS
+
+=item BEST PRACTICE
+
+=item DESCRIPTION
+
+=item DIAGNOSTICS
+
+Bad subroutine name for Fatal: %s, %s is not a Perl subroutine, %s is
+neither a builtin, nor a Perl subroutine, Cannot make the non-overridable
+%s fatal, Internal error: %s
+
+=item BUGS
+
+=item AUTHOR
+
+=item LICENSE
+
+=item SEE ALSO
+
+=back
+
+=head2 Fcntl - load the C Fcntl.h defines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item EXPORTED SYMBOLS
+
+=back
+
+=head2 File-Glob, File::Glob - Perl extension for BSD glob routine
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item META CHARACTERS
+
+=item POSIX FLAGS
+
+C<GLOB_ERR>, C<GLOB_LIMIT>, C<GLOB_MARK>, C<GLOB_NOCASE>, C<GLOB_NOCHECK>,
+C<GLOB_NOSORT>, C<GLOB_BRACE>, C<GLOB_NOMAGIC>, C<GLOB_QUOTE>,
+C<GLOB_TILDE>, C<GLOB_CSH>, C<GLOB_ALPHASORT>
+
+=back
+
+=item DIAGNOSTICS
+
+C<GLOB_NOSPACE>, C<GLOB_ABEND>
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 File::Basename - Parse file paths into directory, filename and
+suffix.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+C<fileparse> X<fileparse>
+
+C<basename> X<basename> X<filename>
+
+C<dirname> X<dirname>
+
+C<fileparse_set_fstype> X<filesystem>
+
+=over 4
+
+=item SEE ALSO
+
+=back
+
+=head2 File::CheckTree - run many filetest checks on a tree
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item HISTORY
+
+=back
+
+=head2 File::Compare - Compare files or filehandles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item RETURN
+
+=item AUTHOR
+
+=back
+
+=head2 File::Copy - Copy files or filehandles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+copy X<copy> X<cp>, move X<move> X<mv> X<rename>, syscopy X<syscopy>,
+rmscopy($from,$to[,$date_flag]) X<rmscopy>
+
+=item RETURN
+
+=item NOTES
+
+=item AUTHOR
+
+=back
+
+=head2 File::DosGlob - DOS like globbing and then some
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=item EXPORTS (by request only)
+
+=item BUGS
+
+=item AUTHOR
+
+=item HISTORY
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Fetch - A generic file fetching mechanism
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item ACCESSORS
+
+$ff->uri, $ff->scheme, $ff->host, $ff->vol, $ff->share, $ff->path,
+$ff->file
+
+=back
+
+$ff->output_file
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item $ff = File::Fetch->new( uri => 'http://some.where.com/dir/file.txt'
+);
+
+=back
+
+=back
+
+=over 4
+
+=item $where = $ff->fetch( [to => /my/output/dir/ | \$scalar] )
+
+=back
+
+=over 4
+
+=item $ff->error([BOOL])
+
+=back
+
+=over 4
+
+=item HOW IT WORKS
+
+=item GLOBAL VARIABLES
+
+=over 4
+
+=item $File::Fetch::FROM_EMAIL
+
+=item $File::Fetch::USER_AGENT
+
+=item $File::Fetch::FTP_PASSIVE
+
+=item $File::Fetch::TIMEOUT
+
+=item $File::Fetch::WARN
+
+=item $File::Fetch::DEBUG
+
+=item $File::Fetch::BLACKLIST
+
+=item $File::Fetch::METHOD_FAIL
+
+=back
+
+=item MAPPING
+
+=item FREQUENTLY ASKED QUESTIONS
+
+=over 4
+
+=item So how do I use a proxy with File::Fetch?
+
+=item I used 'lynx' to fetch a file, but its contents is all wrong!
+
+=item Files I'm trying to fetch have reserved characters or non-ASCII
+characters in them. What do I do?
+
+=back
+
+=item TODO
+
+Implement $PREFER_BIN
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 File::Find - Traverse a directory tree.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<find>, B<finddepth>
+
+=over 4
+
+=item %options
+
+C<wanted>, C<bydepth>, C<preprocess>, C<postprocess>, C<follow>,
+C<follow_fast>, C<follow_skip>, C<dangling_symlinks>, C<no_chdir>,
+C<untaint>, C<untaint_pattern>, C<untaint_skip>
+
+=item The wanted function
+
+C<$File::Find::dir> is the current directory name,, C<$_> is the current
+filename within that directory, C<$File::Find::name> is the complete
+pathname to the file
+
+=back
+
+=item WARNINGS
+
+=item CAVEAT
+
+$dont_use_nlink, symlinks
+
+=item NOTES
+
+=item BUGS AND CAVEATS
+
+=item HISTORY
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Glob - Perl extension for BSD glob routine
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item META CHARACTERS
+
+=item POSIX FLAGS
+
+C<GLOB_ERR>, C<GLOB_LIMIT>, C<GLOB_MARK>, C<GLOB_NOCASE>, C<GLOB_NOCHECK>,
+C<GLOB_NOSORT>, C<GLOB_BRACE>, C<GLOB_NOMAGIC>, C<GLOB_QUOTE>,
+C<GLOB_TILDE>, C<GLOB_CSH>, C<GLOB_ALPHASORT>
+
+=back
+
+=item DIAGNOSTICS
+
+C<GLOB_NOSPACE>, C<GLOB_ABEND>
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 File::GlobMapper - Extend File Glob to Allow Input and Output Files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Behind The Scenes
+
+=item Limitations
+
+=item Input File Glob
+
+B<~>, B<~user>, B<.>, B<*>, B<?>, B<\>, B<[]>, B<{,}>, B<()>
+
+=item Output File Glob
+
+"*", #1
+
+=item Returned Data
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item A Rename script
+
+=item A few example globmaps
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 File::Path - Create or remove directory trees
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+make_path( $dir1, $dir2, .... ), make_path( $dir1, $dir2, ...., \%opts ),
+mode => $num, verbose => $bool, error => \$err, mkpath( $dir ), mkpath(
+$dir, $verbose, $mode ), mkpath( [$dir1, $dir2,...], $verbose, $mode ),
+mkpath( $dir1, $dir2,..., \%opt ), remove_tree( $dir1, $dir2, .... ),
+remove_tree( $dir1, $dir2, ...., \%opts ), verbose => $bool, safe => $bool,
+keep_root => $bool, result => \$res, error => \$err, rmtree( $dir ),
+rmtree( $dir, $verbose, $safe ), rmtree( [$dir1, $dir2,...], $verbose,
+$safe ), rmtree( $dir1, $dir2,..., \%opt )
+
+=over 4
+
+=item ERROR HANDLING
+
+B<NOTE:>
+
+=item NOTES
+
+=back
+
+=item DIAGNOSTICS
+
+mkdir [path]: [errmsg] (SEVERE), No root path(s) specified, No such file or
+directory, cannot fetch initial working directory: [errmsg], cannot stat
+initial working directory: [errmsg], cannot chdir to [dir]: [errmsg],
+directory [dir] changed before chdir, expected dev=[n] ino=[n], actual
+dev=[n] ino=[n], aborting. (FATAL), cannot make directory [dir]
+read+writeable: [errmsg], cannot read [dir]: [errmsg], cannot reset chmod
+[dir]: [errmsg], cannot remove [dir] when cwd is [dir], cannot chdir to
+[parent-dir] from [child-dir]: [errmsg], aborting. (FATAL), cannot stat
+prior working directory [dir]: [errmsg], aborting. (FATAL), previous
+directory [parent-dir] changed before entering [child-dir], expected
+dev=[n] ino=[n], actual dev=[n] ino=[n], aborting. (FATAL), cannot make
+directory [dir] writeable: [errmsg], cannot remove directory [dir]:
+[errmsg], cannot restore permissions of [dir] to [0nnn]: [errmsg], cannot
+make file [file] writeable: [errmsg], cannot unlink file [file]: [errmsg],
+cannot restore permissions of [file] to [0nnn]: [errmsg]
+
+=item SEE ALSO
+
+=item BUGS
+
+=item ACKNOWLEDGEMENTS
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=item LICENSE
+
+=back
+
+=head2 File::Spec - portably perform operations on file names
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+canonpath X<canonpath>, catdir X<catdir>, catfile X<catfile>, curdir
+X<curdir>, devnull X<devnull>, rootdir X<rootdir>, tmpdir X<tmpdir>, updir
+X<updir>, no_upwards, case_tolerant, file_name_is_absolute, path X<path>,
+join X<join, path>, splitpath X<splitpath> X<split, path>, splitdir
+X<splitdir> X<split, dir>, catpath(), abs2rel X<abs2rel> X<absolute, path>
+X<relative, path>, rel2abs() X<rel2abs> X<absolute, path> X<relative, path>
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 File::Spec::Cygwin - methods for Cygwin file specs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+canonpath
+
+file_name_is_absolute
+
+tmpdir (override)
+
+case_tolerant
+
+=over 4
+
+=item COPYRIGHT
+
+=back
+
+=head2 File::Spec::Epoc - methods for Epoc file specs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+canonpath()
+
+=over 4
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Spec::Functions - portably perform operations on file names
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Exports
+
+=back
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Spec::Mac - File::Spec for Mac OS (Classic)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+canonpath
+
+=back
+
+catdir()
+
+catfile
+
+curdir
+
+devnull
+
+rootdir
+
+tmpdir
+
+updir
+
+file_name_is_absolute
+
+path
+
+splitpath
+
+splitdir
+
+catpath
+
+abs2rel
+
+rel2abs
+
+=over 4
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Spec::OS2 - methods for OS/2 file specs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+tmpdir, splitpath
+
+=item COPYRIGHT
+
+=back
+
+=head2 File::Spec::Unix - File::Spec for Unix, base for other File::Spec
+modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+canonpath()
+
+=back
+
+catdir()
+
+catfile
+
+curdir
+
+devnull
+
+rootdir
+
+tmpdir
+
+updir
+
+no_upwards
+
+case_tolerant
+
+file_name_is_absolute
+
+path
+
+join
+
+splitpath
+
+splitdir
+
+catpath()
+
+abs2rel
+
+rel2abs()
+
+=over 4
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Spec::VMS - methods for VMS file specs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+canonpath (override)
+
+catdir (override)
+
+catfile (override)
+
+curdir (override)
+
+devnull (override)
+
+rootdir (override)
+
+tmpdir (override)
+
+updir (override)
+
+case_tolerant (override)
+
+path (override)
+
+file_name_is_absolute (override)
+
+splitpath (override)
+
+splitdir (override)
+
+catpath (override)
+
+abs2rel (override)
+
+rel2abs (override)
+
+=over 4
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Spec::Win32 - methods for Win32 file specs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+devnull
+
+=back
+
+tmpdir
+
+case_tolerant
+
+file_name_is_absolute
+
+catfile
+
+canonpath
+
+splitpath
+
+splitdir
+
+catpath
+
+=over 4
+
+=item Note For File::Spec::Win32 Maintainers
+
+=back
+
+=over 4
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Temp - return name and handle of a temporary file safely
+
+=over 4
+
+=item PORTABILITY
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item OBJECT-ORIENTED INTERFACE
+
+B<new>
+
+=back
+
+B<newdir>
+
+B<filename>
+
+B<dirname>, B<unlink_on_destroy>
+
+B<DESTROY>
+
+=over 4
+
+=item FUNCTIONS
+
+B<tempfile>
+
+=back
+
+B<tempdir>
+
+=over 4
+
+=item MKTEMP FUNCTIONS
+
+B<mkstemp>
+
+=back
+
+B<mkstemps>
+
+B<mkdtemp>
+
+B<mktemp>
+
+=over 4
+
+=item POSIX FUNCTIONS
+
+B<tmpnam>
+
+=back
+
+B<tmpfile>
+
+=over 4
+
+=item ADDITIONAL FUNCTIONS
+
+B<tempnam>
+
+=back
+
+=over 4
+
+=item UTILITY FUNCTIONS
+
+B<unlink0>
+
+=back
+
+B<cmpstat>
+
+B<unlink1>
+
+B<cleanup>
+
+=over 4
+
+=item PACKAGE VARIABLES
+
+B<safe_level>, STANDARD, MEDIUM, HIGH
+
+=back
+
+TopSystemUID
+
+B<$KEEP_ALL>, B<$DEBUG>
+
+=over 4
+
+=item WARNING
+
+=over 4
+
+=item Temporary files and NFS
+
+=item Forking
+
+=item Directory removal
+
+=item BINMODE
+
+=back
+
+=item HISTORY
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 File::stat - by-name interface to Perl's built-in stat() functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 FileCache - keep more files open than the system permits
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+cacheout EXPR, cacheout MODE, EXPR
+
+=item CAVEATS
+
+=item BUGS
+
+=back
+
+=head2 FileHandle - supply object methods for filehandles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$fh->print, $fh->printf, $fh->getline, $fh->getlines
+
+=item SEE ALSO
+
+=back
+
+=head2 Filter-Util-Call, Filter::Util::Call - Perl Source Filter Utility
+Module
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item B<use Filter::Util::Call>
+
+=item B<import()>
+
+=item B<filter() and anonymous sub>
+
+B<$_>, B<$status>, B<filter_read> and B<filter_read_exact>, B<filter_del>
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item Example 1: A simple filter.
+
+=item Example 2: Using the context
+
+=item Example 3: Using the context within the filter
+
+=item Example 4: Using filter_del
+
+=back
+
+=item Filter::Simple
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 Filter::Simple - Simplified source filtering
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item The Problem
+
+=item A Solution
+
+=item Disabling or changing <no> behaviour
+
+=item All-in-one interface
+
+=item Filtering only specific components of source code
+
+C<"code">, C<"code_no_comments">, C<"executable">,
+C<"executable_no_comments">, C<"quotelike">, C<"string">, C<"regex">,
+C<"all">
+
+=item Filtering only the code parts of source code
+
+Most source code ceases to be grammatically correct when it is broken up
+into the pieces between string literals and regexes. So the C<'code'>
+and C<'code_no_comments'> component filter behave slightly differently
+from the other partial filters described in the previous section.
+
+=item Using Filter::Simple with an explicit C<import> subroutine
+
+=item Using Filter::Simple and Exporter together
+
+=item How it works
+
+=back
+
+=item AUTHOR
+
+=item CONTACT
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Filter::Util::Call - Perl Source Filter Utility Module
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item B<use Filter::Util::Call>
+
+=item B<import()>
+
+=item B<filter() and anonymous sub>
+
+B<$_>, B<$status>, B<filter_read> and B<filter_read_exact>, B<filter_del>
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item Example 1: A simple filter.
+
+=item Example 2: Using the context
+
+=item Example 3: Using the context within the filter
+
+=item Example 4: Using filter_del
+
+=back
+
+=item Filter::Simple
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 FindBin - Locate directory of original perl script
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXPORTABLE VARIABLES
+
+=item KNOWN ISSUES
+
+=item KNOWN BUGS
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 GDBM_File - Perl5 access to the gdbm library.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AVAILABILITY
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Getopt::Long - Extended processing of command line options
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Command Line Options, an Introduction
+
+=item Getting Started with Getopt::Long
+
+=over 4
+
+=item Simple options
+
+=item A little bit less simple options
+
+=item Mixing command line option with other arguments
+
+=item Options with values
+
+=item Options with multiple values
+
+=item Options with hash values
+
+=item User-defined subroutines to handle options
+
+=item Options with multiple names
+
+=item Case and abbreviations
+
+=item Summary of Option Specifications
+
+!, +, s, i, o, f, : I<type> [ I<desttype> ], : I<number> [ I<desttype> ], :
++ [ I<desttype> ]
+
+=back
+
+=item Advanced Possibilities
+
+=over 4
+
+=item Object oriented interface
+
+=item Thread Safety
+
+=item Documentation and help texts
+
+=item Parsing options from an arbitrary array
+
+=item Parsing options from an arbitrary string
+
+=item Storing options values in a hash
+
+=item Bundling
+
+=item The lonesome dash
+
+=item Argument callback
+
+=back
+
+=item Configuring Getopt::Long
+
+default, posix_default, auto_abbrev, getopt_compat, gnu_compat, gnu_getopt,
+require_order, permute, bundling (default: disabled), bundling_override
+(default: disabled), ignore_case (default: enabled), ignore_case_always
+(default: disabled), auto_version (default:disabled), auto_help
+(default:disabled), pass_through (default: disabled), prefix,
+prefix_pattern, long_prefix_pattern, debug (default: disabled)
+
+=item Exportable Methods
+
+VersionMessage, C<-message>, C<-msg>, C<-exitval>, C<-output>, HelpMessage
+
+=item Return values and Errors
+
+=item Legacy
+
+=over 4
+
+=item Default destinations
+
+=item Alternative option starters
+
+=item Configuration variables
+
+=back
+
+=item Tips and Techniques
+
+=over 4
+
+=item Pushing multiple values in a hash option
+
+=back
+
+=item Troubleshooting
+
+=over 4
+
+=item GetOptions does not return a false result when an option is not
+supplied
+
+=item GetOptions does not split the command line correctly
+
+=item Undefined subroutine &main::GetOptions called
+
+=item How do I put a "-?" option into a Getopt::Long?
+
+=back
+
+=item AUTHOR
+
+=item COPYRIGHT AND DISCLAIMER
+
+=back
+
+=head2 Getopt::Std, getopt, getopts - Process single-character switches
+with switch clustering
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item C<--help> and C<--version>
+
+=back
+
+=head2 Hash-Util-FieldHash::lib::Hash::Util::FieldHash,
+Hash::Util::FieldHash - Support for Inside-Out Classes
+
+=over 4
+
+=item SYNOPSIS
+
+=item FUNCTIONS
+
+id, id_2obj, register, idhash, idhashes, fieldhash, fieldhashes
+
+=item DESCRIPTION
+
+=over 4
+
+=item The Inside-out Technique
+
+=item Problems of Inside-out
+
+=item Solutions
+
+=item More Problems
+
+=item The Generic Object
+
+=item How to use Field Hashes
+
+=item Garbage-Collected Hashes
+
+=back
+
+=item EXAMPLES
+
+C<init()>, C<first()>, C<last()>, C<name()>, C<Name_hash>, C<Name_id>,
+C<Name_idhash>, C<Name_id_reg>, C<Name_idhash_reg>, C<Name_fieldhash>
+
+=over 4
+
+=item Example 1
+
+=item Example 2
+
+=back
+
+=item GUTS
+
+=over 4
+
+=item The C<PERL_MAGIC_uvar> interface for hashes
+
+=item Weakrefs call uvar magic
+
+=item How field hashes work
+
+=item Internal function Hash::Util::FieldHash::_fieldhash
+
+=back
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Hash-Utilib::Hash::Util, Hash::Util - A selection of general-utility
+hash subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Restricted hashes
+
+B<lock_keys>, B<unlock_keys>
+
+=back
+
+=back
+
+B<lock_keys_plus>
+
+B<lock_value>, B<unlock_value>
+
+B<lock_hash>, B<unlock_hash>
+
+B<lock_hash_recurse>, B<unlock_hash_recurse>
+
+B<hash_unlocked>
+
+B<legal_keys>, B<hidden_keys>, B<all_keys>, B<hash_seed>
+
+B<hv_store>
+
+=over 4
+
+=item Operating on references to hashes.
+
+lock_ref_keys, unlock_ref_keys, lock_ref_keys_plus, lock_ref_value,
+unlock_ref_value, lock_hashref, unlock_hashref, lock_hashref_recurse,
+unlock_hashref_recurse, hash_ref_unlocked, legal_ref_keys, hidden_ref_keys
+
+=back
+
+=over 4
+
+=item CAVEATS
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Hash::Util - A selection of general-utility hash subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Restricted hashes
+
+B<lock_keys>, B<unlock_keys>
+
+=back
+
+=back
+
+B<lock_keys_plus>
+
+B<lock_value>, B<unlock_value>
+
+B<lock_hash>, B<unlock_hash>
+
+B<lock_hash_recurse>, B<unlock_hash_recurse>
+
+B<hash_unlocked>
+
+B<legal_keys>, B<hidden_keys>, B<all_keys>, B<hash_seed>
+
+B<hv_store>
+
+=over 4
+
+=item Operating on references to hashes.
+
+lock_ref_keys, unlock_ref_keys, lock_ref_keys_plus, lock_ref_value,
+unlock_ref_value, lock_hashref, unlock_hashref, lock_hashref_recurse,
+unlock_hashref_recurse, hash_ref_unlocked, legal_ref_keys, hidden_ref_keys
+
+=back
+
+=over 4
+
+=item CAVEATS
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Hash::Util::FieldHash - Support for Inside-Out Classes
+
+=over 4
+
+=item SYNOPSIS
+
+=item FUNCTIONS
+
+id, id_2obj, register, idhash, idhashes, fieldhash, fieldhashes
+
+=item DESCRIPTION
+
+=over 4
+
+=item The Inside-out Technique
+
+=item Problems of Inside-out
+
+=item Solutions
+
+=item More Problems
+
+=item The Generic Object
+
+=item How to use Field Hashes
+
+=item Garbage-Collected Hashes
+
+=back
+
+=item EXAMPLES
+
+C<init()>, C<first()>, C<last()>, C<name()>, C<Name_hash>, C<Name_id>,
+C<Name_idhash>, C<Name_id_reg>, C<Name_idhash_reg>, C<Name_fieldhash>
+
+=over 4
+
+=item Example 1
+
+=item Example 2
+
+=back
+
+=item GUTS
+
+=over 4
+
+=item The C<PERL_MAGIC_uvar> interface for hashes
+
+=item Weakrefs call uvar magic
+
+=item How field hashes work
+
+=item Internal function Hash::Util::FieldHash::_fieldhash
+
+=back
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 I18N-Langinfo, I18N::Langinfo - query locale information
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item EXPORT
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 I18N::Collate - compare 8-bit scalar data according to the current
+locale
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 I18N::LangTags - functions for dealing with RFC3066-style language
+tags
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+the function is_language_tag($lang1)
+
+the function extract_language_tags($whatever)
+
+the function same_language_tag($lang1, $lang2)
+
+the function similarity_language_tag($lang1, $lang2)
+
+the function is_dialect_of($lang1, $lang2)
+
+the function super_languages($lang1)
+
+the function locale2language_tag($locale_identifier)
+
+the function encode_language_tag($lang1)
+
+the function alternate_language_tags($lang1)
+
+the function @langs = panic_languages(@accept_languages)
+
+the function implicate_supers( ...languages... ), the function
+implicate_supers_strictly( ...languages... )
+
+=over 4
+
+=item ABOUT LOWERCASING
+
+=item ABOUT UNICODE PLAINTEXT LANGUAGE TAGS
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=item AUTHOR
+
+=back
+
+=head2 I18N::LangTags::Detect - detect the user's language preferences
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=item ENVIRONMENT
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=item AUTHOR
+
+=back
+
+=head2 I18N::LangTags::List -- tags and names for human languages
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item ABOUT LANGUAGE TAGS
+
+=item LIST OF LANGUAGES
+
+{ab} : Abkhazian, {ace} : Achinese, {ach} : Acoli, {ada} : Adangme, {ady} :
+Adyghe, {aa} : Afar, {afh} : Afrihili, {af} : Afrikaans, [{afa} :
+Afro-Asiatic (Other)], {ak} : Akan, {akk} : Akkadian, {sq} : Albanian,
+{ale} : Aleut, [{alg} : Algonquian languages], [{tut} : Altaic (Other)],
+{am} : Amharic, {i-ami} : Ami, [{apa} : Apache languages], {ar} : Arabic,
+{arc} : Aramaic, {arp} : Arapaho, {arn} : Araucanian, {arw} : Arawak, {hy}
+: Armenian, {an} : Aragonese, [{art} : Artificial (Other)], {ast} :
+Asturian, {as} : Assamese, [{ath} : Athapascan languages], [{aus} :
+Australian languages], [{map} : Austronesian (Other)], {av} : Avaric, {ae}
+: Avestan, {awa} : Awadhi, {ay} : Aymara, {az} : Azerbaijani, {ban} :
+Balinese, [{bat} : Baltic (Other)], {bal} : Baluchi, {bm} : Bambara, [{bai}
+: Bamileke languages], {bad} : Banda, [{bnt} : Bantu (Other)], {bas} :
+Basa, {ba} : Bashkir, {eu} : Basque, {btk} : Batak (Indonesia), {bej} :
+Beja, {be} : Belarusian, {bem} : Bemba, {bn} : Bengali, [{ber} : Berber
+(Other)], {bho} : Bhojpuri, {bh} : Bihari, {bik} : Bikol, {bin} : Bini,
+{bi} : Bislama, {bs} : Bosnian, {bra} : Braj, {br} : Breton, {bug} :
+Buginese, {bg} : Bulgarian, {i-bnn} : Bunun, {bua} : Buriat, {my} :
+Burmese, {cad} : Caddo, {car} : Carib, {ca} : Catalan, [{cau} : Caucasian
+(Other)], {ceb} : Cebuano, [{cel} : Celtic (Other)], [{cai} : Central
+American Indian (Other)], {chg} : Chagatai, [{cmc} : Chamic languages],
+{ch} : Chamorro, {ce} : Chechen, {chr} : Cherokee, {chy} : Cheyenne, {chb}
+: Chibcha, {ny} : Chichewa, {zh} : Chinese, {chn} : Chinook Jargon, {chp} :
+Chipewyan, {cho} : Choctaw, {cu} : Church Slavic, {chk} : Chuukese, {cv} :
+Chuvash, {cop} : Coptic, {kw} : Cornish, {co} : Corsican, {cr} : Cree,
+{mus} : Creek, [{cpe} : English-based Creoles and pidgins (Other)], [{cpf}
+: French-based Creoles and pidgins (Other)], [{cpp} : Portuguese-based
+Creoles and pidgins (Other)], [{crp} : Creoles and pidgins (Other)], {hr} :
+Croatian, [{cus} : Cushitic (Other)], {cs} : Czech, {dak} : Dakota, {da} :
+Danish, {dar} : Dargwa, {day} : Dayak, {i-default} : Default (Fallthru)
+Language, {del} : Delaware, {din} : Dinka, {dv} : Divehi, {doi} : Dogri,
+{dgr} : Dogrib, [{dra} : Dravidian (Other)], {dua} : Duala, {nl} : Dutch,
+{dum} : Middle Dutch (ca.1050-1350), {dyu} : Dyula, {dz} : Dzongkha, {efi}
+: Efik, {egy} : Ancient Egyptian, {eka} : Ekajuk, {elx} : Elamite, {en} :
+English, {enm} : Old English (1100-1500), {ang} : Old English
+(ca.450-1100), {i-enochian} : Enochian (Artificial), {myv} : Erzya, {eo} :
+Esperanto, {et} : Estonian, {ee} : Ewe, {ewo} : Ewondo, {fan} : Fang, {fat}
+: Fanti, {fo} : Faroese, {fj} : Fijian, {fi} : Finnish, [{fiu} :
+Finno-Ugrian (Other)], {fon} : Fon, {fr} : French, {frm} : Middle French
+(ca.1400-1600), {fro} : Old French (842-ca.1400), {fy} : Frisian, {fur} :
+Friulian, {ff} : Fulah, {gaa} : Ga, {gd} : Scots Gaelic, {gl} : Gallegan,
+{lg} : Ganda, {gay} : Gayo, {gba} : Gbaya, {gez} : Geez, {ka} : Georgian,
+{de} : German, {gmh} : Middle High German (ca.1050-1500), {goh} : Old High
+German (ca.750-1050), [{gem} : Germanic (Other)], {gil} : Gilbertese, {gon}
+: Gondi, {gor} : Gorontalo, {got} : Gothic, {grb} : Grebo, {grc} : Ancient
+Greek, {el} : Modern Greek, {gn} : Guarani, {gu} : Gujarati, {gwi} :
+Gwich'in, {hai} : Haida, {ht} : Haitian, {ha} : Hausa, {haw} : Hawaiian,
+{he} : Hebrew, {hz} : Herero, {hil} : Hiligaynon, {him} : Himachali, {hi} :
+Hindi, {ho} : Hiri Motu, {hit} : Hittite, {hmn} : Hmong, {hu} : Hungarian,
+{hup} : Hupa, {iba} : Iban, {is} : Icelandic, {io} : Ido, {ig} : Igbo,
+{ijo} : Ijo, {ilo} : Iloko, [{inc} : Indic (Other)], [{ine} : Indo-European
+(Other)], {id} : Indonesian, {inh} : Ingush, {ia} : Interlingua
+(International Auxiliary Language Association), {ie} : Interlingue, {iu} :
+Inuktitut, {ik} : Inupiaq, [{ira} : Iranian (Other)], {ga} : Irish, {mga} :
+Middle Irish (900-1200), {sga} : Old Irish (to 900), [{iro} : Iroquoian
+languages], {it} : Italian, {ja} : Japanese, {jv} : Javanese, {jrb} :
+Judeo-Arabic, {jpr} : Judeo-Persian, {kbd} : Kabardian, {kab} : Kabyle,
+{kac} : Kachin, {kl} : Kalaallisut, {xal} : Kalmyk, {kam} : Kamba, {kn} :
+Kannada, {kr} : Kanuri, {krc} : Karachay-Balkar, {kaa} : Kara-Kalpak, {kar}
+: Karen, {ks} : Kashmiri, {csb} : Kashubian, {kaw} : Kawi, {kk} : Kazakh,
+{kha} : Khasi, {km} : Khmer, [{khi} : Khoisan (Other)], {kho} : Khotanese,
+{ki} : Kikuyu, {kmb} : Kimbundu, {rw} : Kinyarwanda, {ky} : Kirghiz,
+{i-klingon} : Klingon, {kv} : Komi, {kg} : Kongo, {kok} : Konkani, {ko} :
+Korean, {kos} : Kosraean, {kpe} : Kpelle, {kro} : Kru, {kj} : Kuanyama,
+{kum} : Kumyk, {ku} : Kurdish, {kru} : Kurukh, {kut} : Kutenai, {lad} :
+Ladino, {lah} : Lahnda, {lam} : Lamba, {lo} : Lao, {la} : Latin, {lv} :
+Latvian, {lb} : Letzeburgesch, {lez} : Lezghian, {li} : Limburgish, {ln} :
+Lingala, {lt} : Lithuanian, {nds} : Low German, {art-lojban} : Lojban
+(Artificial), {loz} : Lozi, {lu} : Luba-Katanga, {lua} : Luba-Lulua, {lui}
+: Luiseno, {lun} : Lunda, {luo} : Luo (Kenya and Tanzania), {lus} : Lushai,
+{mk} : Macedonian, {mad} : Madurese, {mag} : Magahi, {mai} : Maithili,
+{mak} : Makasar, {mg} : Malagasy, {ms} : Malay, {ml} : Malayalam, {mt} :
+Maltese, {mnc} : Manchu, {mdr} : Mandar, {man} : Mandingo, {mni} :
+Manipuri, [{mno} : Manobo languages], {gv} : Manx, {mi} : Maori, {mr} :
+Marathi, {chm} : Mari, {mh} : Marshall, {mwr} : Marwari, {mas} : Masai,
+[{myn} : Mayan languages], {men} : Mende, {mic} : Micmac, {min} :
+Minangkabau, {i-mingo} : Mingo, [{mis} : Miscellaneous languages], {moh} :
+Mohawk, {mdf} : Moksha, {mo} : Moldavian, [{mkh} : Mon-Khmer (Other)],
+{lol} : Mongo, {mn} : Mongolian, {mos} : Mossi, [{mul} : Multiple
+languages], [{mun} : Munda languages], {nah} : Nahuatl, {nap} : Neapolitan,
+{na} : Nauru, {nv} : Navajo, {nd} : North Ndebele, {nr} : South Ndebele,
+{ng} : Ndonga, {ne} : Nepali, {new} : Newari, {nia} : Nias, [{nic} :
+Niger-Kordofanian (Other)], [{ssa} : Nilo-Saharan (Other)], {niu} : Niuean,
+{nog} : Nogai, {non} : Old Norse, [{nai} : North American Indian], {no} :
+Norwegian, {nb} : Norwegian Bokmal, {nn} : Norwegian Nynorsk, [{nub} :
+Nubian languages], {nym} : Nyamwezi, {nyn} : Nyankole, {nyo} : Nyoro, {nzi}
+: Nzima, {oc} : Occitan (post 1500), {oj} : Ojibwa, {or} : Oriya, {om} :
+Oromo, {osa} : Osage, {os} : Ossetian; Ossetic, [{oto} : Otomian
+languages], {pal} : Pahlavi, {i-pwn} : Paiwan, {pau} : Palauan, {pi} :
+Pali, {pam} : Pampanga, {pag} : Pangasinan, {pa} : Panjabi, {pap} :
+Papiamento, [{paa} : Papuan (Other)], {fa} : Persian, {peo} : Old Persian
+(ca.600-400 B.C.), [{phi} : Philippine (Other)], {phn} : Phoenician, {pon}
+: Pohnpeian, {pl} : Polish, {pt} : Portuguese, [{pra} : Prakrit languages],
+{pro} : Old Provencal (to 1500), {ps} : Pushto, {qu} : Quechua, {rm} :
+Raeto-Romance, {raj} : Rajasthani, {rap} : Rapanui, {rar} : Rarotongan,
+[{qaa - qtz} : Reserved for local use.], [{roa} : Romance (Other)], {ro} :
+Romanian, {rom} : Romany, {rn} : Rundi, {ru} : Russian, [{sal} : Salishan
+languages], {sam} : Samaritan Aramaic, {se} : Northern Sami, {sma} :
+Southern Sami, {smn} : Inari Sami, {smj} : Lule Sami, {sms} : Skolt Sami,
+[{smi} : Sami languages (Other)], {sm} : Samoan, {sad} : Sandawe, {sg} :
+Sango, {sa} : Sanskrit, {sat} : Santali, {sc} : Sardinian, {sas} : Sasak,
+{sco} : Scots, {sel} : Selkup, [{sem} : Semitic (Other)], {sr} : Serbian,
+{srr} : Serer, {shn} : Shan, {sn} : Shona, {sid} : Sidamo, {sgn-...} : Sign
+Languages, {bla} : Siksika, {sd} : Sindhi, {si} : Sinhalese, [{sit} :
+Sino-Tibetan (Other)], [{sio} : Siouan languages], {den} : Slave
+(Athapascan), [{sla} : Slavic (Other)], {sk} : Slovak, {sl} : Slovenian,
+{sog} : Sogdian, {so} : Somali, {son} : Songhai, {snk} : Soninke, {wen} :
+Sorbian languages, {nso} : Northern Sotho, {st} : Southern Sotho, [{sai} :
+South American Indian (Other)], {es} : Spanish, {suk} : Sukuma, {sux} :
+Sumerian, {su} : Sundanese, {sus} : Susu, {sw} : Swahili, {ss} : Swati,
+{sv} : Swedish, {syr} : Syriac, {tl} : Tagalog, {ty} : Tahitian, [{tai} :
+Tai (Other)], {tg} : Tajik, {tmh} : Tamashek, {ta} : Tamil, {i-tao} : Tao,
+{tt} : Tatar, {i-tay} : Tayal, {te} : Telugu, {ter} : Tereno, {tet} :
+Tetum, {th} : Thai, {bo} : Tibetan, {tig} : Tigre, {ti} : Tigrinya, {tem} :
+Timne, {tiv} : Tiv, {tli} : Tlingit, {tpi} : Tok Pisin, {tkl} : Tokelau,
+{tog} : Tonga (Nyasa), {to} : Tonga (Tonga Islands), {tsi} : Tsimshian,
+{ts} : Tsonga, {i-tsu} : Tsou, {tn} : Tswana, {tum} : Tumbuka, [{tup} :
+Tupi languages], {tr} : Turkish, {ota} : Ottoman Turkish (1500-1928), {crh}
+: Crimean Turkish, {tk} : Turkmen, {tvl} : Tuvalu, {tyv} : Tuvinian, {tw} :
+Twi, {udm} : Udmurt, {uga} : Ugaritic, {ug} : Uighur, {uk} : Ukrainian,
+{umb} : Umbundu, {und} : Undetermined, {ur} : Urdu, {uz} : Uzbek, {vai} :
+Vai, {ve} : Venda, {vi} : Vietnamese, {vo} : Volapuk, {vot} : Votic, [{wak}
+: Wakashan languages], {wa} : Walloon, {wal} : Walamo, {war} : Waray, {was}
+: Washo, {cy} : Welsh, {wo} : Wolof, {x-...} : Unregistered (Semi-Private
+Use), {xh} : Xhosa, {sah} : Yakut, {yao} : Yao, {yap} : Yapese, {ii} :
+Sichuan Yi, {yi} : Yiddish, {yo} : Yoruba, [{ypk} : Yupik languages], {znd}
+: Zande, [{zap} : Zapotec], {zen} : Zenaga, {za} : Zhuang, {zu} : Zulu,
+{zun} : Zuni
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMER
+
+=item AUTHOR
+
+=back
+
+=head2 IO - load various IO modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item DEPRECATED
+
+=back
+
+=head2 IO-Compress::lib::Compress::Zlib, Compress::Zlib - Interface to zlib
+compression library
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Notes for users of Compress::Zlib version 1
+
+=back
+
+=item GZIP INTERFACE
+
+B<$gz = gzopen($filename, $mode)>, B<$gz = gzopen($filehandle, $mode)>,
+B<$bytesread = $gz-E<gt>gzread($buffer [, $size]) ;>, B<$bytesread =
+$gz-E<gt>gzreadline($line) ;>, B<$byteswritten = $gz-E<gt>gzwrite($buffer)
+;>, B<$status = $gz-E<gt>gzflush($flush_type) ;>, B<$offset =
+$gz-E<gt>gztell() ;>, B<$status = $gz-E<gt>gzseek($offset, $whence) ;>,
+B<$gz-E<gt>gzclose>, B<$gz-E<gt>gzsetparams($level, $strategy>, B<$level>,
+B<$strategy>, B<$gz-E<gt>gzerror>, B<$gzerrno>
+
+=over 4
+
+=item Examples
+
+=item Compress::Zlib::memGzip
+
+=item Compress::Zlib::memGunzip
+
+=back
+
+=item COMPRESS/UNCOMPRESS
+
+B<$dest = compress($source [, $level] ) ;>, B<$dest = uncompress($source)
+;>
+
+=item Deflate Interface
+
+=over 4
+
+=item B<($d, $status) = deflateInit( [OPT] )>
+
+B<-Level>, B<-Method>, B<-WindowBits>, B<-MemLevel>, B<-Strategy>,
+B<-Dictionary>, B<-Bufsize>
+
+=item B<($out, $status) = $d-E<gt>deflate($buffer)>
+
+=item B<($out, $status) = $d-E<gt>flush()>
+=head2 B<($out, $status) = $d-E<gt>flush($flush_type)>
+
+=item B<$status = $d-E<gt>deflateParams([OPT])>
+
+B<-Level>, B<-Strategy>
+
+=item B<$d-E<gt>dict_adler()>
+
+=item B<$d-E<gt>msg()>
+
+=item B<$d-E<gt>total_in()>
+
+=item B<$d-E<gt>total_out()>
+
+=item Example
+
+=back
+
+=item Inflate Interface
+
+=over 4
+
+=item B<($i, $status) = inflateInit()>
+
+B<-WindowBits>, B<-Bufsize>, B<-Dictionary>
+
+=item B<($out, $status) = $i-E<gt>inflate($buffer)>
+
+=item B<$status = $i-E<gt>inflateSync($buffer)>
+
+=item B<$i-E<gt>dict_adler()>
+
+=item B<$i-E<gt>msg()>
+
+=item B<$i-E<gt>total_in()>
+
+=item B<$i-E<gt>total_out()>
+
+=item Example
+
+=back
+
+=item CHECKSUM FUNCTIONS
+
+=item Misc
+
+=over 4
+
+=item my $version = Compress::Zlib::zlib_version();
+
+=back
+
+=item CONSTANTS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::File::GlobMapper, File::GlobMapper - Extend File
+Glob to Allow Input and Output Files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Behind The Scenes
+
+=item Limitations
+
+=item Input File Glob
+
+B<~>, B<~user>, B<.>, B<*>, B<?>, B<\>, B<[]>, B<{,}>, B<()>
+
+=item Output File Glob
+
+"*", #1
+
+=item Returned Data
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item A Rename script
+
+=item A few example globmaps
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Compress::Base, IO::Compress::Base - Base
+Class for IO::Compress modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Compress::Bzip2, IO::Compress::Bzip2 - Write
+bzip2 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item bzip2 $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
+Filehandle, C<< BlockSize100K => number >>, C<< WorkFactor => number >>,
+C<< Strict => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item print
+
+=item printf
+
+=item syswrite
+
+=item write
+
+=item flush
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item newStream([OPTS])
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Apache::GZip Revisited
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Compress::Deflate, IO::Compress::Deflate -
+Write RFC 1950 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item deflate $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
+Filehandle, C<< Merge => 0|1 >>, -Level, -Strategy, C<< Strict => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item print
+
+=item printf
+
+=item syswrite
+
+=item write
+
+=item flush
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item newStream([OPTS])
+
+=item deflateParams
+
+=back
+
+=item Importing
+
+:all, :constants, :flush, :level, :strategy
+
+=item EXAMPLES
+
+=over 4
+
+=item Apache::GZip Revisited
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Compress::Gzip, IO::Compress::Gzip - Write RFC
+1952 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item gzip $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
+Filehandle, C<< Merge => 0|1 >>, -Level, -Strategy, C<< Minimal => 0|1 >>,
+C<< Comment => $comment >>, C<< Name => $string >>, C<< Time => $number >>,
+C<< TextFlag => 0|1 >>, C<< HeaderCRC => 0|1 >>, C<< OS_Code => $value >>,
+C<< ExtraField => $data >>, C<< ExtraFlags => $value >>, C<< Strict => 0|1
+>>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item print
+
+=item printf
+
+=item syswrite
+
+=item write
+
+=item flush
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item newStream([OPTS])
+
+=item deflateParams
+
+=back
+
+=item Importing
+
+:all, :constants, :flush, :level, :strategy
+
+=item EXAMPLES
+
+=over 4
+
+=item Apache::GZip Revisited
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Compress::RawDeflate, IO::Compress::RawDeflate
+- Write RFC 1951 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item rawdeflate $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
+Filehandle, C<< Merge => 0|1 >>, -Level, -Strategy, C<< Strict => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item print
+
+=item printf
+
+=item syswrite
+
+=item write
+
+=item flush
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item newStream([OPTS])
+
+=item deflateParams
+
+=back
+
+=item Importing
+
+:all, :constants, :flush, :level, :strategy
+
+=item EXAMPLES
+
+=over 4
+
+=item Apache::GZip Revisited
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Compress::Zip, IO::Compress::Zip - Write zip
+files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item zip $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
+Filehandle, C<< Name => $string >>, C<< Time => $number >>, C<< ExtAttr =>
+$attr >>, C<< exTime => [$atime, $mtime, $ctime] >>, C<< exUnix2 => [$uid,
+$gid] >>, C<< Comment => $comment >>, C<< ZipComment => $comment >>, C<<
+Method => $method >>, C<< Stream => 0|1 >>, C<< Zip64 => 0|1 >>, C<<
+TextFlag => 0|1 >>, C<< ExtraFieldLocal => $data >> =item C<<
+ExtraFieldCentral => $data >>, C<< Minimal => 1|0 >>, C<< BlockSize100K =>
+number >>, C<< WorkFactor => number >>, -Level, -Strategy, C<< Strict =>
+0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item print
+
+=item printf
+
+=item syswrite
+
+=item write
+
+=item flush
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item newStream([OPTS])
+
+=item deflateParams
+
+=back
+
+=item Importing
+
+:all, :constants, :flush, :level, :strategy, :zip_method
+
+=item EXAMPLES
+
+=over 4
+
+=item Apache::GZip Revisited
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Uncompress::AnyInflate,
+IO::Uncompress::AnyInflate - Uncompress zlib-based (zip, gzip) file/buffer
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+RFC 1950, RFC 1951 (optionally), gzip (RFC 1952), zip
+
+=item Functional Interface
+
+=over 4
+
+=item anyinflate $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< RawInflate => 0|1
+>>, C<< ParseExtra => 0|1 >> If the gzip FEXTRA header field is present and
+this option is set, it will force the module to check that it conforms to
+the sub-field structure as defined in RFC 1952
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item inflateSync
+
+=item getHeaderInfo
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Uncompress::AnyUncompress,
+IO::Uncompress::AnyUncompress - Uncompress gzip, zip, bzip2 or lzop
+file/buffer
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+RFC 1950, RFC 1951 (optionally), gzip (RFC 1952), zip, bzip2, lzop, lzf
+
+=item Functional Interface
+
+=over 4
+
+=item anyuncompress $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< RawInflate => 0|1
+>>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item getHeaderInfo
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Uncompress::Base, IO::Uncompress::Base - Base
+Class for IO::Uncompress modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Uncompress::Bunzip2, IO::Uncompress::Bunzip2 -
+Read bzip2 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item bunzip2 $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< Small => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item getHeaderInfo
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Uncompress::Gunzip, IO::Uncompress::Gunzip -
+Read RFC 1952 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item gunzip $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< ParseExtra => 0|1
+>> If the gzip FEXTRA header field is present and this option is set, it
+will force the module to check that it conforms to the sub-field structure
+as defined in RFC 1952
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item inflateSync
+
+=item getHeaderInfo
+
+Name, Comment
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Uncompress::Inflate, IO::Uncompress::Inflate -
+Read RFC 1950 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item inflate $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item inflateSync
+
+=item getHeaderInfo
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Uncompress::RawInflate,
+IO::Uncompress::RawInflate - Read RFC 1951 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item rawinflate $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item inflateSync
+
+=item getHeaderInfo
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::lib::IO::Uncompress::Unzip, IO::Uncompress::Unzip -
+Read zip files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item unzip $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item inflateSync
+
+=item getHeaderInfo
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO-Compress::pod::FAQ, IO::Compress::FAQ -- Frequently Asked
+Questions about IO::Compress
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Compatibility with Unix compress/uncompress.
+
+=item Accessing .tar.Z files
+
+=item Accessing Zip Files
+
+=item Compressed files and Net::FTP
+
+=item How do I recompress using a different compression?
+
+=item Apache::GZip Revisited
+
+=item Using C<InputLength> to uncompress data embedded in a larger
+file/buffer.
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Compress::Base - Base Class for IO::Compress modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Compress::Bzip2 - Write bzip2 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item bzip2 $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
+Filehandle, C<< BlockSize100K => number >>, C<< WorkFactor => number >>,
+C<< Strict => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item print
+
+=item printf
+
+=item syswrite
+
+=item write
+
+=item flush
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item newStream([OPTS])
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Apache::GZip Revisited
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Compress::Deflate - Write RFC 1950 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item deflate $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
+Filehandle, C<< Merge => 0|1 >>, -Level, -Strategy, C<< Strict => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item print
+
+=item printf
+
+=item syswrite
+
+=item write
+
+=item flush
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item newStream([OPTS])
+
+=item deflateParams
+
+=back
+
+=item Importing
+
+:all, :constants, :flush, :level, :strategy
+
+=item EXAMPLES
+
+=over 4
+
+=item Apache::GZip Revisited
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Compress::Gzip - Write RFC 1952 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item gzip $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
+Filehandle, C<< Merge => 0|1 >>, -Level, -Strategy, C<< Minimal => 0|1 >>,
+C<< Comment => $comment >>, C<< Name => $string >>, C<< Time => $number >>,
+C<< TextFlag => 0|1 >>, C<< HeaderCRC => 0|1 >>, C<< OS_Code => $value >>,
+C<< ExtraField => $data >>, C<< ExtraFlags => $value >>, C<< Strict => 0|1
+>>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item print
+
+=item printf
+
+=item syswrite
+
+=item write
+
+=item flush
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item newStream([OPTS])
+
+=item deflateParams
+
+=back
+
+=item Importing
+
+:all, :constants, :flush, :level, :strategy
+
+=item EXAMPLES
+
+=over 4
+
+=item Apache::GZip Revisited
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Compress::RawDeflate - Write RFC 1951 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item rawdeflate $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
+Filehandle, C<< Merge => 0|1 >>, -Level, -Strategy, C<< Strict => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item print
+
+=item printf
+
+=item syswrite
+
+=item write
+
+=item flush
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item newStream([OPTS])
+
+=item deflateParams
+
+=back
+
+=item Importing
+
+:all, :constants, :flush, :level, :strategy
+
+=item EXAMPLES
+
+=over 4
+
+=item Apache::GZip Revisited
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Compress::Zip - Write zip files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item zip $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
+Filehandle, C<< Name => $string >>, C<< Time => $number >>, C<< ExtAttr =>
+$attr >>, C<< exTime => [$atime, $mtime, $ctime] >>, C<< exUnix2 => [$uid,
+$gid] >>, C<< Comment => $comment >>, C<< ZipComment => $comment >>, C<<
+Method => $method >>, C<< Stream => 0|1 >>, C<< Zip64 => 0|1 >>, C<<
+TextFlag => 0|1 >>, C<< ExtraFieldLocal => $data >> =item C<<
+ExtraFieldCentral => $data >>, C<< Minimal => 1|0 >>, C<< BlockSize100K =>
+number >>, C<< WorkFactor => number >>, -Level, -Strategy, C<< Strict =>
+0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item print
+
+=item printf
+
+=item syswrite
+
+=item write
+
+=item flush
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item newStream([OPTS])
+
+=item deflateParams
+
+=back
+
+=item Importing
+
+:all, :constants, :flush, :level, :strategy, :zip_method
+
+=item EXAMPLES
+
+=over 4
+
+=item Apache::GZip Revisited
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Dir - supply object methods for directory handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+new ( [ DIRNAME ] ), open ( DIRNAME ), read (), seek ( POS ), tell (),
+rewind (), close (), tie %hash, 'IO::Dir', DIRNAME [, OPTIONS ]
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::File - supply object methods for filehandles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( FILENAME [,MODE [,PERMS]] ), new_tmpfile
+
+=item METHODS
+
+open( FILENAME [,MODE [,PERMS]] ), open( FILENAME, IOLAYERS ), binmode(
+[LAYER] )
+
+=item NOTE
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 IO::Handle - supply object methods for I/O handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new (), new_from_fd ( FD, MODE )
+
+=item METHODS
+
+$io->fdopen ( FD, MODE ), $io->opened, $io->getline, $io->getlines,
+$io->ungetc ( ORD ), $io->write ( BUF, LEN [, OFFSET ] ), $io->error,
+$io->clearerr, $io->sync, $io->flush, $io->printflush ( ARGS ),
+$io->blocking ( [ BOOL ] ), $io->untaint
+
+=item NOTE
+
+=item SEE ALSO
+
+=item BUGS
+
+=item HISTORY
+
+=back
+
+=head2 IO::Pipe - supply object methods for pipes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [READER, WRITER] )
+
+=item METHODS
+
+reader ([ARGS]), writer ([ARGS]), handles ()
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Poll - Object interface to system poll call
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+mask ( IO [, EVENT_MASK ] ), poll ( [ TIMEOUT ] ), events ( IO ), remove (
+IO ), handles( [ EVENT_MASK ] )
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Seekable - supply seek based methods for I/O objects
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$io->getpos, $io->setpos, $io->seek ( POS, WHENCE ), WHENCE=0 (SEEK_SET),
+WHENCE=1 (SEEK_CUR), WHENCE=2 (SEEK_END), $io->sysseek( POS, WHENCE ),
+$io->tell
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 IO::Select - OO interface to the select system call
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ HANDLES ] )
+
+=item METHODS
+
+add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read (
+[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_exception ( [ TIMEOUT ] ),
+count (), bits(), select ( READ, WRITE, EXCEPTION [, TIMEOUT ] )
+
+=item EXAMPLE
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Socket - Object interface to socket communications
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=item METHODS
+
+accept([PKG]), socketpair(DOMAIN, TYPE, PROTOCOL), atmark, connected,
+protocol, sockdomain, sockopt(OPT [, VAL]), socktype, timeout([VAL])
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Socket::INET - Object interface for AF_INET domain sockets
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=over 4
+
+=item METHODS
+
+sockaddr (), sockport (), sockhost (), peeraddr (), peerport (), peerhost
+()
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Socket::UNIX - Object interface for AF_UNIX domain sockets
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=item METHODS
+
+hostpath(), peerpath()
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Uncompress::AnyInflate - Uncompress zlib-based (zip, gzip)
+file/buffer
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+RFC 1950, RFC 1951 (optionally), gzip (RFC 1952), zip
+
+=item Functional Interface
+
+=over 4
+
+=item anyinflate $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< RawInflate => 0|1
+>>, C<< ParseExtra => 0|1 >> If the gzip FEXTRA header field is present and
+this option is set, it will force the module to check that it conforms to
+the sub-field structure as defined in RFC 1952
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item inflateSync
+
+=item getHeaderInfo
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Uncompress::AnyUncompress - Uncompress gzip, zip, bzip2 or lzop
+file/buffer
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+RFC 1950, RFC 1951 (optionally), gzip (RFC 1952), zip, bzip2, lzop, lzf
+
+=item Functional Interface
+
+=over 4
+
+=item anyuncompress $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< RawInflate => 0|1
+>>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item getHeaderInfo
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Uncompress::Base - Base Class for IO::Uncompress modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Uncompress::Bunzip2 - Read bzip2 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item bunzip2 $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< Small => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item getHeaderInfo
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Uncompress::Gunzip - Read RFC 1952 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item gunzip $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< ParseExtra => 0|1
+>> If the gzip FEXTRA header field is present and this option is set, it
+will force the module to check that it conforms to the sub-field structure
+as defined in RFC 1952
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item inflateSync
+
+=item getHeaderInfo
+
+Name, Comment
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Uncompress::Inflate - Read RFC 1950 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item inflate $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item inflateSync
+
+=item getHeaderInfo
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Uncompress::RawInflate - Read RFC 1951 files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item rawinflate $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item inflateSync
+
+=item getHeaderInfo
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Uncompress::Unzip - Read zip files/buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Functional Interface
+
+=over 4
+
+=item unzip $input => $output [, OPTS]
+
+A filename, A filehandle, A scalar reference, An array reference, An Input
+FileGlob string, A filename, A filehandle, A scalar reference, An Array
+Reference, An Output FileGlob
+
+=item Notes
+
+=item Optional Parameters
+
+C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
+C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
+
+=item Examples
+
+=back
+
+=item OO Interface
+
+=over 4
+
+=item Constructor
+
+A filename, A filehandle, A scalar reference
+
+=item Constructor Options
+
+C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
+>>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
+$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>
+
+=item Examples
+
+=back
+
+=item Methods
+
+=over 4
+
+=item read
+
+=item read
+
+=item getline
+
+=item getc
+
+=item ungetc
+
+=item inflateSync
+
+=item getHeaderInfo
+
+=item tell
+
+=item eof
+
+=item seek
+
+=item binmode
+
+=item opened
+
+=item autoflush
+
+=item input_line_number
+
+=item fileno
+
+=item close
+
+=item nextStream
+
+=item trailingData
+
+=back
+
+=item Importing
+
+:all
+
+=item EXAMPLES
+
+=over 4
+
+=item Working with Net::FTP
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item MODIFICATION HISTORY
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO::Zlib - IO:: style interface to L<Compress::Zlib>
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=item OBJECT METHODS
+
+open ( FILENAME, MODE ), opened, close, getc, getline, getlines, print (
+ARGS... ), read ( BUF, NBYTES, [OFFSET] ), eof, seek ( OFFSET, WHENCE ),
+tell, setpos ( POS ), getpos ( POS )
+
+=item USING THE EXTERNAL GZIP
+
+=item CLASS METHODS
+
+has_Compress_Zlib, gzip_external, gzip_used, gzip_read_open,
+gzip_write_open
+
+=item DIAGNOSTICS
+
+IO::Zlib::getlines: must be called in list context,
+IO::Zlib::gzopen_external: mode '...' is illegal, IO::Zlib::import: '...'
+is illegal, IO::Zlib::import: ':gzip_external' requires an argument,
+IO::Zlib::import: 'gzip_read_open' requires an argument, IO::Zlib::import:
+'gzip_read' '...' is illegal, IO::Zlib::import: 'gzip_write_open' requires
+an argument, IO::Zlib::import: 'gzip_write_open' '...' is illegal,
+IO::Zlib::import: no Compress::Zlib and no external gzip, IO::Zlib::open:
+needs a filename, IO::Zlib::READ: NBYTES must be specified,
+IO::Zlib::WRITE: too long LENGTH
+
+=item SEE ALSO
+
+=item HISTORY
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Dir, IO::Dir - supply object methods for directory
+handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+new ( [ DIRNAME ] ), open ( DIRNAME ), read (), seek ( POS ), tell (),
+rewind (), close (), tie %hash, 'IO::Dir', DIRNAME [, OPTIONS ]
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::File, IO::File - supply object methods for filehandles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( FILENAME [,MODE [,PERMS]] ), new_tmpfile
+
+=item METHODS
+
+open( FILENAME [,MODE [,PERMS]] ), open( FILENAME, IOLAYERS ), binmode(
+[LAYER] )
+
+=item NOTE
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 IO::lib::IO::Handle, IO::Handle - supply object methods for I/O
+handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new (), new_from_fd ( FD, MODE )
+
+=item METHODS
+
+$io->fdopen ( FD, MODE ), $io->opened, $io->getline, $io->getlines,
+$io->ungetc ( ORD ), $io->write ( BUF, LEN [, OFFSET ] ), $io->error,
+$io->clearerr, $io->sync, $io->flush, $io->printflush ( ARGS ),
+$io->blocking ( [ BOOL ] ), $io->untaint
+
+=item NOTE
+
+=item SEE ALSO
+
+=item BUGS
+
+=item HISTORY
+
+=back
+
+=head2 IO::lib::IO::Pipe, IO::Pipe - supply object methods for pipes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [READER, WRITER] )
+
+=item METHODS
+
+reader ([ARGS]), writer ([ARGS]), handles ()
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Poll, IO::Poll - Object interface to system poll call
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+mask ( IO [, EVENT_MASK ] ), poll ( [ TIMEOUT ] ), events ( IO ), remove (
+IO ), handles( [ EVENT_MASK ] )
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Seekable, IO::Seekable - supply seek based methods for
+I/O objects
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$io->getpos, $io->setpos, $io->seek ( POS, WHENCE ), WHENCE=0 (SEEK_SET),
+WHENCE=1 (SEEK_CUR), WHENCE=2 (SEEK_END), $io->sysseek( POS, WHENCE ),
+$io->tell
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 IO::lib::IO::Select, IO::Select - OO interface to the select system
+call
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ HANDLES ] )
+
+=item METHODS
+
+add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read (
+[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_exception ( [ TIMEOUT ] ),
+count (), bits(), select ( READ, WRITE, EXCEPTION [, TIMEOUT ] )
+
+=item EXAMPLE
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Socket, IO::Socket - Object interface to socket
+communications
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=item METHODS
+
+accept([PKG]), socketpair(DOMAIN, TYPE, PROTOCOL), atmark, connected,
+protocol, sockdomain, sockopt(OPT [, VAL]), socktype, timeout([VAL])
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Socket::INET, IO::Socket::INET - Object interface for
+AF_INET domain sockets
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=over 4
+
+=item METHODS
+
+sockaddr (), sockport (), sockhost (), peeraddr (), peerport (), peerhost
+()
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Socket::UNIX, IO::Socket::UNIX - Object interface for
+AF_UNIX domain sockets
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=item METHODS
+
+hostpath(), peerpath()
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IPC-SysV::lib::IPC::Msg, IPC::Msg - SysV Msg IPC object class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+new ( KEY , FLAGS ), id, rcv ( BUF, LEN [, TYPE [, FLAGS ]] ), remove, set
+( STAT ), set ( NAME => VALUE [, NAME => VALUE ...] ), snd ( TYPE, MSG [,
+FLAGS ] ), stat
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 IPC-SysV::lib::IPC::Semaphore, IPC::Semaphore - SysV Semaphore IPC
+object class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+new ( KEY , NSEMS , FLAGS ), getall, getncnt ( SEM ), getpid ( SEM ),
+getval ( SEM ), getzcnt ( SEM ), id, op ( OPLIST ), remove, set ( STAT ),
+set ( NAME => VALUE [, NAME => VALUE ...] ), setall ( VALUES ), setval ( N
+, VALUE ), stat
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 IPC-SysV::lib::IPC::SharedMem, IPC::SharedMem - SysV Shared Memory
+IPC object class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+new ( KEY , SIZE , FLAGS ), id, read ( POS, SIZE ), write ( STRING, POS,
+SIZE ), remove, is_removed, stat, attach ( [FLAG] ), detach, addr
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 IPC-SysV::lib::IPC::SysV, IPC::SysV - System V IPC constants and
+system calls
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+ftok( PATH ), ftok( PATH, ID ), shmat( ID, ADDR, FLAG ), shmdt( ADDR ),
+memread( ADDR, VAR, POS, SIZE ), memwrite( ADDR, STRING, POS, SIZE )
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 IPC::Open2, open2 - open a process for both reading and writing
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item WARNING
+
+=item SEE ALSO
+
+=back
+
+=head2 IPC::Open3, open3 - open a process for reading, writing, and error
+handling
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item See Also
+
+L<IPC::Open2>, L<IPC::Run>
+
+=item WARNING
+
+=back
+
+=head2 IPCmd, IPC::Cmd - finding and running system commands made easy
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CLASS METHODS
+
+=over 4
+
+=item $ipc_run_version = IPC::Cmd->can_use_ipc_run( [VERBOSE] )
+
+=back
+
+=back
+
+=over 4
+
+=item $ipc_open3_version = IPC::Cmd->can_use_ipc_open3( [VERBOSE] )
+
+=back
+
+=over 4
+
+=item $bool = IPC::Cmd->can_capture_buffer
+
+=back
+
+=over 4
+
+=item FUNCTIONS
+
+=over 4
+
+=item $path = can_run( PROGRAM );
+
+=back
+
+=back
+
+=over 4
+
+=item $ok | ($ok, $err, $full_buf, $stdout_buff, $stderr_buff) = run(
+command => COMMAND, [verbose => BOOL, buffer => \$SCALAR, timeout => DIGIT]
+);
+
+command, verbose, buffer, timeout, success, error message, full_buffer,
+out_buffer, error_buffer
+
+=back
+
+=over 4
+
+=item $q = QUOTE
+
+=back
+
+=over 4
+
+=item HOW IT WORKS
+
+=item Global Variables
+
+=over 4
+
+=item $IPC::Cmd::VERBOSE
+
+=item $IPC::Cmd::USE_IPC_RUN
+
+=item $IPC::Cmd::USE_IPC_OPEN3
+
+=item $IPC::Cmd::WARN
+
+=back
+
+=item Caveats
+
+Whitespace and IPC::Open3 / system(), Whitespace and IPC::Run, IO Redirect,
+Interleaving STDOUT/STDERR
+
+=item See Also
+
+=item ACKNOWLEDGEMENTS
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 List-Utilib::List::Util, List::Util - A selection of general-utility
+list subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+first BLOCK LIST, max LIST, maxstr LIST, min LIST, minstr LIST, reduce
+BLOCK LIST, shuffle LIST, sum LIST
+
+=item KNOWN BUGS
+
+=item SUGGESTED ADDITIONS
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 List-Utilib::List::Util::XS, List::Util::XS - Indicate if List::Util
+was compiled with a C compiler
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 List-Utilib::Scalar::Util, Scalar::Util - A selection of
+general-utility scalar subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+blessed EXPR, dualvar NUM, STRING, isvstring EXPR, isweak EXPR,
+looks_like_number EXPR, openhandle FH, refaddr EXPR, reftype EXPR,
+set_prototype CODEREF, PROTOTYPE, tainted EXPR, weaken REF
+
+=item DIAGNOSTICS
+
+Weak references are not implemented in the version of perl, Vstrings are
+not implemented in the version of perl, C<NAME> is only available with the
+XS version of Scalar::Util
+
+=item KNOWN BUGS
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 List::Util - A selection of general-utility list subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+first BLOCK LIST, max LIST, maxstr LIST, min LIST, minstr LIST, reduce
+BLOCK LIST, shuffle LIST, sum LIST
+
+=item KNOWN BUGS
+
+=item SUGGESTED ADDITIONS
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 List::Util::XS - Indicate if List::Util was compiled with a C
+compiler
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 Locale::Constants - constants for Locale codes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item KNOWN BUGS AND LIMITATIONS
+
+=item SEE ALSO
+
+Locale::Language, Locale::Country, Locale::Script, Locale::Currency
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Locale::Country - ISO codes for country identification (ISO 3166)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<alpha-2>, B<alpha-3>, B<numeric>
+
+=item CONVERSION ROUTINES
+
+code2country( CODE, [ CODESET ] ), country2code( STRING, [ CODESET ] ),
+country_code2code( CODE, CODESET, CODESET )
+
+=item QUERY ROUTINES
+
+C<all_country_codes( [ CODESET ] )>, C<all_country_names( [ CODESET ] )>
+
+=item SEMI-PRIVATE ROUTINES
+
+=over 4
+
+=item alias_code
+
+=item rename_country
+
+=back
+
+=item EXAMPLES
+
+=item DOMAIN NAMES
+
+=item KNOWN BUGS AND LIMITATIONS
+
+=item SEE ALSO
+
+Locale::Language, Locale::Script, Locale::Currency, Locale::SubCountry, ISO
+3166-1, http://www.iso.org/iso/en/prods-services/iso3166ma/index.html,
+http://www.egt.ie/standards/iso3166/iso3166-1-en.html,
+http://www.cia.gov/cia/publications/factbook/docs/app-d-1.html
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Locale::Currency - ISO three letter codes for currency
+identification (ISO 4217)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+XTS, XXX
+
+=item CONVERSION ROUTINES
+
+code2currency(), currency2code()
+
+=item QUERY ROUTINES
+
+C<all_currency_codes()>, C<all_currency_names()>
+
+=item EXAMPLES
+
+=item KNOWN BUGS AND LIMITATIONS
+
+=item SEE ALSO
+
+Locale::Country, Locale::Script, ISO 4217:1995,
+http://www.bsi-global.com/iso4217currency
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Locale::Language - ISO two letter codes for language identification
+(ISO 639)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONVERSION ROUTINES
+
+code2language(), language2code()
+
+=item QUERY ROUTINES
+
+C<all_language_codes()>, C<all_language_names()>
+
+=item EXAMPLES
+
+=item KNOWN BUGS AND LIMITATIONS
+
+=item SEE ALSO
+
+Locale::Country, Locale::Script, Locale::Currency, ISO 639:1988 (E/F),
+http://lcweb.loc.gov/standards/iso639-2/langhome.html
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Locale::Maketext - framework for localization
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item QUICK OVERVIEW
+
+=item METHODS
+
+=over 4
+
+=item Construction Methods
+
+=item The "maketext" Method
+
+$lh->fail_with I<or> $lh->fail_with(I<PARAM>), $lh->failure_handler_auto
+
+=item Utility Methods
+
+$language->quant($number, $singular), $language->quant($number, $singular,
+$plural), $language->quant($number, $singular, $plural, $negative),
+$language->numf($number), $language->sprintf($format, @items),
+$language->language_tag(), $language->encoding()
+
+=item Language Handle Attributes and Internals
+
+=back
+
+=item LANGUAGE CLASS HIERARCHIES
+
+=item ENTRIES IN EACH LEXICON
+
+=item BRACKET NOTATION
+
+=item AUTO LEXICONS
+
+=item CONTROLLING LOOKUP FAILURE
+
+=item HOW TO USE MAKETEXT
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMER
+
+=item AUTHOR
+
+=back
+
+=head2 Locale::Maketext::Simple - Simple interface to
+Locale::Maketext::Lexicon
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+=over 4
+
+=item Class
+
+=item Path
+
+=item Style
+
+=item Export
+
+=item Subclass
+
+=item Decode
+
+=item Encoding
+
+=back
+
+=back
+
+=over 4
+
+=item ACKNOWLEDGMENTS
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=over 4
+
+=item The "MIT" License
+
+=back
+
+=back
+
+=head2 Locale::Maketext::TPJ13 -- article about software localization
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Localization and Perl: gettext breaks, Maketext fixes
+
+=over 4
+
+=item A Localization Horror Story: It Could Happen To You
+
+=item The Linguistic View
+
+=item Breaking gettext
+
+=item Replacing gettext
+
+=item Buzzwords: Abstraction and Encapsulation
+
+=item Buzzword: Isomorphism
+
+=item Buzzword: Inheritance
+
+=item Buzzword: Concision
+
+=item The Devil in the Details
+
+=item The Proof in the Pudding: Localizing Web Sites
+
+=item References
+
+=back
+
+=back
+
+=head2 Locale::Script - ISO codes for script identification (ISO 15924)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<alpha-2>, B<alpha-3>, B<numeric>
+
+=over 4
+
+=item SPECIAL CODES
+
+=back
+
+=item CONVERSION ROUTINES
+
+code2script( CODE, [ CODESET ] ), script2code( STRING, [ CODESET ] ),
+script_code2code( CODE, CODESET, CODESET )
+
+=item QUERY ROUTINES
+
+C<all_script_codes ( [ CODESET ] )>, C<all_script_names ( [ CODESET ] )>
+
+=item EXAMPLES
+
+=item KNOWN BUGS AND LIMITATIONS
+
+=item SEE ALSO
+
+Locale::Language, Locale::Currency, Locale::Country, ISO 15924,
+http://www.evertype.com/standards/iso15924/
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Log::Message - A generic message storing mechanism;
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Hierarchy
+
+Log::Message, Log::Message::Item, Log::Message::Handlers,
+Log::Message::Config
+
+=item Options
+
+config, private, verbose, tag, level, remove, chrono
+
+=back
+
+=over 4
+
+=item Methods
+
+=over 4
+
+=item new
+
+=back
+
+=back
+
+=over 4
+
+=item store
+
+message, tag, level, extra
+
+=back
+
+=over 4
+
+=item retrieve
+
+tag, level, message, amount, chrono, remove
+
+=back
+
+=over 4
+
+=item first
+
+=back
+
+=over 4
+
+=item last
+
+=back
+
+=over 4
+
+=item flush
+
+=back
+
+=over 4
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item Acknowledgements
+
+=item COPYRIGHT
+
+=back
+
+=head2 Log::Message::Config - Configuration options for Log::Message
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item Acknowledgements
+
+=item COPYRIGHT
+
+=back
+
+=head2 Log::Message::Handlers - Message handlers for Log::Message
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Default Handlers
+
+=over 4
+
+=item log
+
+=back
+
+=back
+
+=over 4
+
+=item carp
+
+=back
+
+=over 4
+
+=item croak
+
+=back
+
+=over 4
+
+=item cluck
+
+=back
+
+=over 4
+
+=item confess
+
+=back
+
+=over 4
+
+=item die
+
+=back
+
+=over 4
+
+=item warn
+
+=back
+
+=over 4
+
+=item trace
+
+=back
+
+=over 4
+
+=item Custom Handlers
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item Acknowledgements
+
+=item COPYRIGHT
+
+=back
+
+=head2 Log::Message::Item - Message objects for Log::Message
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Methods and Accessors
+
+=over 4
+
+=item remove
+
+=item id
+
+=item when
+
+=item message
+
+=item level
+
+=item tag
+
+=item shortmess
+
+=item longmess
+
+=item parent
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item Acknowledgements
+
+=item COPYRIGHT
+
+=back
+
+=head2 Log::Message::Simple
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=over 4
+
+=item msg("message string" [,VERBOSE])
+
+=item debug("message string" [,VERBOSE])
+
+=item error("error string" [,VERBOSE])
+
+=back
+
+=back
+
+=over 4
+
+=item carp();
+
+=item croak();
+
+=item confess();
+
+=item cluck();
+
+=back
+
+=over 4
+
+=item CLASS METHODS
+
+=over 4
+
+=item Log::Message::Simple->stack()
+
+=item Log::Message::Simple->stack_as_string([TRACE])
+
+=item Log::Message::Simple->flush()
+
+=back
+
+=back
+
+=over 4
+
+=item GLOBAL VARIABLES
+
+$ERROR_FH, $MSG_FH, $DEBUG_FH, $STACKTRACE_ON_ERROR
+
+=back
+
+=head2 MIME-Base64, MIME::Base64 - Encoding and decoding of base64 strings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+encode_base64($str), encode_base64($str, $eol);, decode_base64($str)
+
+=item DIAGNOSTICS
+
+Premature end of base64 data, Premature padding of base64 data, Wide
+character in subroutine entry
+
+=item EXAMPLES
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 MIME-Base64::QuotedPrint, MIME::QuotedPrint - Encoding and decoding
+of quoted-printable strings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+encode_qp($str), encode_qp($str, $eol), encode_qp($str, $eol, $binmode),
+decode_qp($str);
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 MIME::Base64 - Encoding and decoding of base64 strings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+encode_base64($str), encode_base64($str, $eol);, decode_base64($str)
+
+=item DIAGNOSTICS
+
+Premature end of base64 data, Premature padding of base64 data, Wide
+character in subroutine entry
+
+=item EXAMPLES
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 MIME::QuotedPrint - Encoding and decoding of quoted-printable
+strings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+encode_qp($str), encode_qp($str, $eol), encode_qp($str, $eol, $binmode),
+decode_qp($str);
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Math-BigInt-FastCalc, Math::BigInt::FastCalc - Math::BigInt::Calc
+with some XS for more speed
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item STORAGE
+
+=item METHODS
+
+=item LICENSE
+
+This program is free software; you may redistribute it and/or modify it
+under
+the same terms as Perl itself.
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 Math::BigFloat - Arbitrary size floating point math package
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Canonical notation
+
+=item Output
+
+=item C<mantissa()>, C<exponent()> and C<parts()>
+
+=item Accuracy vs. Precision
+
+=item Rounding
+
+ffround ( +$scale ), ffround ( -$scale ), ffround ( 0 ), fround ( +$scale
+), fround ( -$scale ) and fround ( 0 )
+
+=back
+
+=item METHODS
+
+=over 4
+
+=item accuracy
+
+=item precision()
+
+=item bexp()
+
+=item bnok()
+
+=item bpi()
+
+=item bcos()
+
+=item bsin()
+
+=item batan2()
+
+=item batan()
+
+=item bmuladd()
+
+=back
+
+=item Autocreating constants
+
+=over 4
+
+=item Math library
+
+=item Using Math::BigInt::Lite
+
+=back
+
+=item EXPORTS
+
+=item BUGS
+
+=item CAVEATS
+
+stringify, bstr(), bdiv, brsft, Modifying and =, bpow, precision() vs.
+accuracy()
+
+=item SEE ALSO
+
+=item LICENSE
+
+=item AUTHORS
+
+=back
+
+=head2 Math::BigInt - Arbitrary size integer/float math package
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+Input, Output
+
+=item METHODS
+
+=over 4
+
+=item config()
+
+=item accuracy()
+
+=item precision()
+
+=item brsft()
+
+=item new()
+
+=item from_oct()
+
+=item from_hex()
+
+=item from_bin()
+
+=item bnan()
+
+=item bzero()
+
+=item binf()
+
+=item bone()
+
+=item is_one()/is_zero()/is_nan()/is_inf()
+
+=item is_pos()/is_neg()/is_positive()/is_negative()
+
+ $x->is_pos(); # true if > 0
+ $x->is_neg(); # true if < 0
+
+=item is_odd()/is_even()/is_int()
+
+=item bcmp()
+
+=item bacmp()
+
+=item sign()
+
+=item digit()
+
+=item bneg()
+
+=item babs()
+
+=item bnorm()
+
+=item bnot()
+
+=item binc()
+
+=item bdec()
+
+=item badd()
+
+=item bsub()
+
+=item bmul()
+
+=item bmuladd()
+
+=item bdiv()
+
+=item bmod()
+
+=item bmodinv()
+
+=item bmodpow()
+
+=item bpow()
+
+=item blog()
+
+=item bexp()
+
+=item bnok()
+
+=item bpi()
+
+=item bcos()
+
+=item bsin()
+
+=item batan2()
+
+=item batan()
+
+=item blsft()
+
+=item brsft()
+
+=item band()
+
+=item bior()
+
+=item bxor()
+
+=item bnot()
+
+=item bsqrt()
+
+=item broot()
+
+=item bfac()
+
+=item round()
+
+=item bround()
+
+=item bfround()
+
+=item bfloor()
+
+=item bceil()
+
+=item bgcd()
+
+=item blcm()
+
+=item exponent()
+
+=item mantissa()
+
+=item parts()
+
+=item copy()
+
+=item as_int()/as_number()
+
+=item bsstr()
+
+=item as_hex()
+
+=item as_bin()
+
+=item as_oct()
+
+=item numify()
+
+=item modify()
+
+=item upgrade()/downgrade()
+
+=item div_scale()
+
+=item round_mode()
+
+=back
+
+=item ACCURACY and PRECISION
+
+=over 4
+
+=item Precision P
+
+=item Accuracy A
+
+=item Fallback F
+
+=item Rounding mode R
+
+'trunc', 'even', 'odd', '+inf', '-inf', 'zero', 'common', Precision,
+Accuracy (significant digits), Setting/Accessing, Creating numbers, Usage,
+Precedence, Overriding globals, Local settings, Rounding, Default values,
+Remarks
+
+=back
+
+=item Infinity and Not a Number
+
+oct()/hex(), log(-inf), exp(), cos(), sin(), atan2()
+
+=item INTERNALS
+
+=over 4
+
+=item MATH LIBRARY
+
+=item SIGN
+
+=item mantissa(), exponent() and parts()
+
+=back
+
+=item EXAMPLES
+
+ use Math::BigInt;
+
+=item Autocreating constants
+
+=item PERFORMANCE
+
+=over 4
+
+=item Alternative math libraries
+
+=item SUBCLASSING
+
+=back
+
+=item Subclassing Math::BigInt
+
+=item UPGRADING
+
+=over 4
+
+=item Auto-upgrade
+
+bsqrt(), div(), blog(), bexp()
+
+=back
+
+=item EXPORTS
+
+=item CAVEATS
+
+bstr(), bsstr() and 'cmp', int(), length, bdiv, infinity handling,
+Modifying and =, bpow, Overloading -$x, Mixing different object types,
+bsqrt(), brsft()
+
+=item LICENSE
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=back
+
+=head2 Math::BigInt::Calc - Pure Perl module to support Math::BigInt
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item STORAGE
+
+=item METHODS
+
+=item WRAP YOUR OWN
+
+=item LICENSE
+
+This program is free software; you may redistribute it and/or modify it
+under
+the same terms as Perl itself.
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 Math::BigInt::CalcEmu - Emulate low-level math with BigInt code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item __emu_bxor
+
+=item __emu_band
+
+=item __emu_bior
+
+=back
+
+=item LICENSE
+
+This program is free software; you may redistribute it and/or modify it
+under
+the same terms as Perl itself.
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 Math::BigInt::FastCalc - Math::BigInt::Calc with some XS for more
+speed
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item STORAGE
+
+=item METHODS
+
+=item LICENSE
+
+This program is free software; you may redistribute it and/or modify it
+under
+the same terms as Perl itself.
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 Math::BigRat - Arbitrary big rational numbers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item MATH LIBRARY
+
+=back
+
+=item METHODS
+
+=over 4
+
+=item new()
+
+=item numerator()
+
+=item denominator()
+
+ $d = $x->denominator();
+
+=item parts()
+
+=item numify()
+
+=item as_int()/as_number()
+
+=item as_float()
+
+=item as_hex()
+
+=item as_bin()
+
+=item as_oct()
+
+=item from_hex()/from_bin()/from_oct()
+
+=item length()
+
+=item digit()
+
+=item bnorm()
+
+=item bfac()
+
+=item bround()/round()/bfround()
+
+=item bmod()
+
+=item bneg()
+
+=item is_one()
+
+=item is_zero()
+
+=item is_pos()/is_positive()
+
+=item is_neg()/is_negative()
+
+=item is_int()
+
+=item is_odd()
+
+=item is_even()
+
+=item bceil()
+
+=item bfloor()
+
+ $x->bfloor();
+
+=item bsqrt()
+
+ $x->bsqrt();
+
+=item broot()
+
+ $x->broot($n);
+
+=item badd()/bmul()/bsub()/bdiv()/bdec()/binc()
+
+=item copy()
+
+=item bstr()/bsstr()
+
+=item bacmp()/bcmp()
+
+=item blsft()/brsft()
+
+=item bpow()
+
+=item bexp()
+
+=item bnok()
+
+=item config()
+
+=item objectify()
+
+=back
+
+=item BUGS
+
+inf handling (partial), NaN handling (partial), rounding (not implemented
+except for bceil/bfloor), $x ** $y where $y is not an integer, bmod(),
+blog(), bmodinv() and bmodpow() (partial)
+
+=item LICENSE
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=back
+
+=head2 Math::Complex - complex numbers and associated mathematical
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPERATIONS
+
+=item CREATION
+
+=item DISPLAYING
+
+=over 4
+
+=item CHANGED IN PERL 5.6
+
+=back
+
+=item USAGE
+
+=item CONSTANTS
+
+=over 4
+
+=item PI
+
+=item Inf
+
+=back
+
+=item ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
+
+=item ERRORS DUE TO INDIGESTIBLE ARGUMENTS
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item LICENSE
+
+=back
+
+=head2 Math::Trig - trigonometric functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item TRIGONOMETRIC FUNCTIONS
+
+B<tan>
+
+=over 4
+
+=item ERRORS DUE TO DIVISION BY ZERO
+
+=item SIMPLE (REAL) ARGUMENTS, COMPLEX RESULTS
+
+=back
+
+=item PLANE ANGLE CONVERSIONS
+
+deg2rad, grad2rad, rad2deg, grad2deg, deg2grad, rad2grad, rad2rad, deg2deg,
+grad2grad
+
+=item RADIAL COORDINATE CONVERSIONS
+
+=over 4
+
+=item COORDINATE SYSTEMS
+
+=item 3-D ANGLE CONVERSIONS
+
+cartesian_to_cylindrical, cartesian_to_spherical, cylindrical_to_cartesian,
+cylindrical_to_spherical, spherical_to_cartesian, spherical_to_cylindrical
+
+=back
+
+=item GREAT CIRCLE DISTANCES AND DIRECTIONS
+
+=over 4
+
+=item great_circle_distance
+
+=item great_circle_direction
+
+=item great_circle_bearing
+
+=item great_circle_destination
+
+=item great_circle_midpoint
+
+=item great_circle_waypoint
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item CAVEAT FOR GREAT CIRCLE FORMULAS
+
+=item Real-valued asin and acos
+
+asin_real, acos_real
+
+=back
+
+=item BUGS
+
+=item AUTHORS
+
+=item LICENSE
+
+=back
+
+=head2 Memoize - Make functions faster by trading space for time
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item DETAILS
+
+=item OPTIONS
+
+=over 4
+
+=item INSTALL
+
+=item NORMALIZER
+
+=item C<SCALAR_CACHE>, C<LIST_CACHE>
+
+C<MEMORY>, C<HASH>, C<TIE>, C<FAULT>, C<MERGE>
+
+=back
+
+=item OTHER FACILITIES
+
+=over 4
+
+=item C<unmemoize>
+
+=item C<flush_cache>
+
+=back
+
+=item CAVEATS
+
+=item PERSISTENT CACHE SUPPORT
+
+=item EXPIRATION SUPPORT
+
+=item BUGS
+
+=item MAILING LIST
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=item THANK YOU
+
+=back
+
+=head2 Memoize::AnyDBM_File - glue to provide EXISTS for AnyDBM_File for
+Storable use
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 Memoize::Expire - Plug-in module for automatic expiration of
+memoized values
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item INTERFACE
+
+ TIEHASH, EXISTS, STORE
+
+=item ALTERNATIVES
+
+=item CAVEATS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Memoize::ExpireFile - test for Memoize expiration semantics
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 Memoize::ExpireTest - test for Memoize expiration semantics
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 Memoize::NDBM_File - glue to provide EXISTS for NDBM_File for
+Storable use
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 Memoize::SDBM_File - glue to provide EXISTS for SDBM_File for
+Storable use
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 Memoize::Storable - store Memoized data in Storable database
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 Module-Pluggable::lib::Devel::InnerPackage, Devel::InnerPackage -
+find all the inner packages of a package
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item list_packages <package name>
+
+=back
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item COPYING
+
+=item BUGS
+
+=back
+
+=head2 Module-Pluggable::lib::Module::Pluggable, Module::Pluggable -
+automatically give your module the ability to have plugins
+
+=over 4
+
+=item SYNOPSIS
+
+=item EXAMPLE
+
+=item DESCRIPTION
+
+=item ADVANCED USAGE
+
+=item INNER PACKAGES
+
+=item OPTIONS
+
+=over 4
+
+=item sub_name
+
+=item search_path
+
+=item search_dirs
+
+=item instantiate
+
+=item require
+
+=item inner
+
+=item only
+
+=item except
+
+=item package
+
+=item file_regex
+
+=item include_editor_junk
+
+=back
+
+=item METHODs
+
+=over 4
+
+=item search_path
+
+=back
+
+=item FUTURE PLANS
+
+=item AUTHOR
+
+=item COPYING
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Module-Pluggable::lib::Module::Pluggable::Object,
+Module::Pluggable::Object - automatically give your module the ability to
+have plugins
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+=item AUTHOR
+
+=item COPYING
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build - Build and install Perl modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item GUIDE TO DOCUMENTATION
+
+General Usage (L<Module::Build>), Authoring Reference
+(L<Module::Build::Authoring>), API Reference (L<Module::Build::API>),
+Cookbook (L<Module::Build::Cookbook>)
+
+=item ACTIONS
+
+build, clean, code, config_data, diff, dist, distcheck, distclean, distdir,
+distmeta, distsign, disttest, docs, fakeinstall, help, html, install,
+manifest, manpages, pardist, ppd, ppmdist, prereq_data, prereq_report,
+pure_install, realclean, retest, skipcheck, test, testall, testcover,
+testdb, testpod, testpodcoverage, versioninstall
+
+=item OPTIONS
+
+=over 4
+
+=item Command Line Options
+
+quiet, use_rcfile, verbose, allow_mb_mismatch, debug
+
+=item Default Options File (F<.modulebuildrc>)
+
+=back
+
+=item INSTALL PATHS
+
+lib, arch, script, bin, bindoc, libdoc, binhtml, libhtml, installdirs,
+install_path, install_base, destdir, prefix
+
+=item MOTIVATIONS
+
++, +
+
+=item TO DO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::API - API Reference for Module Authors
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item CONSTRUCTORS
+
+current(), new(), add_to_cleanup, auto_configure_requires, auto_features,
+autosplit, build_class, build_requires, create_packlist, c_source,
+conflicts, create_license, create_makefile_pl, create_readme,
+dist_abstract, dist_author, dist_name, dist_version, dist_version_from,
+dynamic_config, extra_compiler_flags, extra_linker_flags, get_options,
+type, store, default, include_dirs, install_path, installdirs, license,
+apache, artistic, artistic_2, bsd, gpl, lgpl, mit, mozilla, open_source,
+perl, restrictive, unrestricted, meta_add, meta_merge, module_name,
+PL_files, pm_files, pod_files, recommends, recursive_test_files, requires,
+script_files, sign, test_files, use_tap_harness, tap_harness_args,
+xs_files, new_from_context(%args), resume(), subclass(), add_property,
+C<default>, C<check>, property_error
+
+=item METHODS
+
+add_build_element($type), add_to_cleanup(@files), args(),
+autosplit_file($from, $to), base_dir(), build_requires(), can_action(
+$action ), cbuilder(), check_installed_status($module, $version),
+check_installed_version($module, $version), compare_versions($v1, $op,
+$v2), config($key), config($key, $value), config() [deprecated],
+config_data($name), config_data($name => $value), conflicts(),
+contains_pod($file), copy_if_modified(%parameters), create_build_script(),
+current_action(), depends_on(@actions), dir_contains($first_dir,
+$second_dir), dispatch($action, %args), dist_dir(), dist_name(),
+dist_version(), do_system($cmd, @args), feature($name), feature($name =>
+$value), fix_shebang_line(@files), have_c_compiler(),
+install_base_relpaths(), install_base_relpaths($type),
+install_base_relpaths($type => $path), install_destination($type),
+install_path(), install_path($type), install_path($type => $path),
+install_types(), invoked_action(), notes(), notes($key), notes($key =>
+$value), orig_dir(), os_type(), is_vmsish(), is_windowsish(), is_unixish(),
+prefix_relpaths(), prefix_relpaths($installdirs),
+prefix_relpaths($installdirs, $type), prefix_relpaths($installdirs, $type
+=> $path), prepare_metadata(), prereq_failures(), prereq_data(),
+prereq_report(), prompt($message, $default), recommends(), requires(),
+rscan_dir($dir, $pattern), runtime_params(), runtime_params($key),
+script_files(), up_to_date($source_file, $derived_file),
+up_to_date(\@source_files, \@derived_files), y_n($message, $default)
+
+=item Autogenerated Accessors
+
+PL_files(), allow_mb_mismatch(), auto_configure_requires(), autosplit(),
+base_dir(), bindoc_dirs(), blib(), build_bat(), build_class(),
+build_elements(), build_requires(), build_script(), c_source(),
+config_dir(), configure_requires(), conflicts(), create_license(),
+create_makefile_pl(), create_packlist(), create_readme(), debug(),
+debugger(), destdir(), get_options(), html_css(), include_dirs(),
+install_base(), install_sets(), installdirs(), libdoc_dirs(), license(),
+magic_number(), mb_version(), meta_add(), meta_merge(), metafile(),
+module_name(), orig_dir(), original_prefix(), perl(), pm_files(),
+pod_files(), pollute(), prefix(), prereq_action_types(), program_name(),
+quiet(), recommends(), recurse_into(), recursive_test_files(), requires(),
+scripts(), sign(), tap_harness_args(), test_file_exts(), use_rcfile(),
+use_tap_harness(), verbose(), xs_files()
+
+=back
+
+=item MODULE METADATA
+
+keywords, resources
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Authoring - Authoring Module::Build modules
+
+=over 4
+
+=item DESCRIPTION
+
+=item STRUCTURE
+
+=item SUBCLASSING
+
+=item PREREQUISITES
+
+=over 4
+
+=item Types of prerequisites
+
+configure_requires, build_requires, requires, recommends, conflicts
+
+=item Format of prerequisites
+
+=item XS Extensions
+
+=back
+
+=item SAVING CONFIGURATION INFORMATION
+
+=item STARTING MODULE DEVELOPMENT
+
+=item AUTOMATION
+
+=item MIGRATION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Base - Default methods for Module::Build
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Compat - Compatibility with ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+create_makefile_pl($style, $build), small, passthrough, traditional,
+run_build_pl(args => \@ARGV), args, script, write_makefile(), makefile
+
+=item SCENARIOS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::ConfigData - Configuration for Module::Build
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+config($name), feature($name), set_config($name, $value),
+set_feature($name, $value), config_names(), feature_names(),
+auto_feature_names(), write()
+
+=item AUTHOR
+
+=back
+
+=head2 Module::Build::Cookbook - Examples of Module::Build Usage
+
+=over 4
+
+=item DESCRIPTION
+
+=item BASIC RECIPES
+
+=over 4
+
+=item Installing modules that use Module::Build
+
+=item Modifying Config.pm values
+
+=item Installing modules using the programmatic interface
+
+=item Installing to a temporary directory
+
+=item Installing to a non-standard directory
+
+=item Installing in the same location as ExtUtils::MakeMaker
+
+=item Running a single test file
+
+=back
+
+=item ADVANCED RECIPES
+
+=over 4
+
+=item Making a CPAN.pm-compatible distribution
+
+=item Changing the order of the build process
+
+=item Adding new file types to the build process
+
+=item Adding new elements to the install process
+
+=back
+
+=item EXAMPLES ON CPAN
+
+=over 4
+
+=item SVN-Notify-Mirror
+
+1. Using C<auto_features>, I check to see whether two optional modules are
+available - SVN::Notify::Config and Net::SSH;, 2. If the S::N::Config
+module is loaded, I automatically generate test files for it during Build
+(using the C<PL_files> property), 3. If the C<ssh_feature> is available, I
+ask if the user wishes to perform the ssh tests (since it requires a little
+preliminary setup);, 4. Only if the user has C<ssh_feature> and answers yes
+to the testing, do I generate a test file
+
+=item Modifying an action
+
+=item Adding an action
+
+=item Bundling Module::Build
+
+=back
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::ModuleInfo, ModuleInfo - Gather package and POD
+information from a perl module file
+
+=over 4
+
+=item DESCRIPTION
+
+new_from_file($filename, collect_pod => 1), new_from_module($module,
+collect_pod => 1, inc => \@dirs), name(), version($package), filename(),
+packages_inside(), pod_inside(), contains_pod(), pod($section),
+find_module_by_name($module, \@dirs), find_module_dir_by_name($module,
+\@dirs)
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Notes, $notes_name - Configuration for $module_name
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+config(\$name), feature(\$name), set_config(\$name, \$value),
+set_feature(\$name, \$value), config_names(), feature_names(),
+auto_feature_names(), write()
+
+=item AUTHOR
+
+=back
+
+=head2 Module::Build::PPMMaker - Perl Package Manager file creation
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::Amiga - Builder class for Amiga platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::Default - Stub class for unknown platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::EBCDIC - Builder class for EBCDIC platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::MPEiX - Builder class for MPEiX platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::MacOS - Builder class for MacOS platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden Methods
+
+new(), make_executable(), dispatch(), ACTION_realclean()
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::RiscOS - Builder class for RiscOS platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::Unix - Builder class for Unix platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::VMS - Builder class for VMS platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden Methods
+
+_set_defaults
+
+=back
+
+=back
+
+cull_args
+
+manpage_separator
+
+prefixify
+
+_quote_args
+
+have_forkpipe
+
+_backticks
+
+do_system
+
+oneliner
+
+_infer_xs_spec
+
+rscan_dir
+
+dist_dir
+
+man3page_name
+
+expand_test_dir
+
+_detildefy
+
+find_perl_interpreter
+
+localize_file_path
+
+localize_dir_path
+
+ACTION_clean
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::VOS - Builder class for VOS platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::Windows - Builder class for Windows
+platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::aix - Builder class for AIX platform
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::cygwin - Builder class for Cygwin platform
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::darwin - Builder class for Mac OS X
+platform
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::Platform::os2 - Builder class for OS/2 platform
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Build::YAML - Provides just enough YAML support so that
+Module::Build works even if YAML.pm is not installed
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Module::CoreList - what modules shipped with versions of perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEATS
+
+=item HISTORY
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Load - runtime require of both modules and files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Rules
+
+=item Caveats
+
+=item ACKNOWLEDGEMENTS
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Module::Load::Conditional - Looking up module information / loading
+at runtime
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Methods
+
+=item $href = check_install( module => NAME [, version => VERSION, verbose
+=> BOOL ] );
+
+module, version, verbose, file, dir, version, uptodate
+
+=back
+
+=over 4
+
+=item $bool = can_load( modules => { NAME => VERSION [,NAME => VERSION] },
+[verbose => BOOL, nocache => BOOL] )
+
+modules, verbose, nocache
+
+=back
+
+=over 4
+
+=item @list = requires( MODULE );
+
+=back
+
+=over 4
+
+=item Global Variables
+
+=over 4
+
+=item $Module::Load::Conditional::VERBOSE
+
+=item $Module::Load::Conditional::FIND_VERSION
+
+=item $Module::Load::Conditional::CHECK_INC_HASH
+
+=item $Module::Load::Conditional::CACHE
+
+=item $Module::Load::Conditional::ERROR
+
+=back
+
+=item See Also
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Module::Loaded - mark modules as loaded or unloaded
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=over 4
+
+=item $bool = mark_as_loaded( PACKAGE );
+
+=back
+
+=back
+
+=over 4
+
+=item $bool = mark_as_unloaded( PACKAGE );
+
+=back
+
+=over 4
+
+=item $loc = is_loaded( PACKAGE );
+
+=back
+
+=over 4
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Module::Pluggable - automatically give your module the ability to
+have plugins
+
+=over 4
+
+=item SYNOPSIS
+
+=item EXAMPLE
+
+=item DESCRIPTION
+
+=item ADVANCED USAGE
+
+=item INNER PACKAGES
+
+=item OPTIONS
+
+=over 4
+
+=item sub_name
+
+=item search_path
+
+=item search_dirs
+
+=item instantiate
+
+=item require
+
+=item inner
+
+=item only
+
+=item except
+
+=item package
+
+=item file_regex
+
+=item include_editor_junk
+
+=back
+
+=item METHODs
+
+=over 4
+
+=item search_path
+
+=back
+
+=item FUTURE PLANS
+
+=item AUTHOR
+
+=item COPYING
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Module::Pluggable::Object - automatically give your module the
+ability to have plugins
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+=item AUTHOR
+
+=item COPYING
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 NDBM_File - Tied access to ndbm files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<O_RDONLY>, C<O_WRONLY>, C<O_RDWR>
+
+=item DIAGNOSTICS
+
+=over 4
+
+=item C<ndbm store returned -1, errno 22, key "..." at ...>
+
+=back
+
+=item BUGS AND WARNINGS
+
+=back
+
+=head2 NEXT - Provide a pseudo-class NEXT (et al) that allows method
+redispatch
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Enforcing redispatch
+
+=item Avoiding repetitions
+
+=item Invoking all versions of a method with a single call
+
+=item Using C<EVERY> methods
+
+=back
+
+=item AUTHOR
+
+=item BUGS AND IRRITATIONS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::Cmd - Network Command class (as used by FTP, SMTP etc)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USER METHODS
+
+debug ( VALUE ), message (), code (), ok (), status (), datasend ( DATA ),
+dataend ()
+
+=item CLASS METHODS
+
+debug_print ( DIR, TEXT ), debug_text ( TEXT ), command ( CMD [, ARGS, ...
+]), unsupported (), response (), parse_response ( TEXT ), getline (),
+ungetline ( TEXT ), rawdatasend ( DATA ), read_until_dot (), tied_fh ()
+
+=item EXPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::Config - Local configuration data for libnet
+
+=over 4
+
+=item SYNOPSYS
+
+=item DESCRIPTION
+
+=item METHODS
+
+requires_firewall HOST
+
+=item NetConfig VALUES
+
+nntp_hosts, snpp_hosts, pop3_hosts, smtp_hosts, ph_hosts, daytime_hosts,
+time_hosts, inet_domain, ftp_firewall, ftp_firewall_type, ftp_ext_passive,
+ftp_int_passive, local_netmask, test_hosts, test_exists
+
+=back
+
+=head2 Net::Domain - Attempt to evaluate the current host's internet name
+and domain
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+hostfqdn (), domainname (), hostname (), hostdomain ()
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::FTP - FTP Client class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OVERVIEW
+
+=item CONSTRUCTOR
+
+new ([ HOST ] [, OPTIONS ])
+
+=item METHODS
+
+login ([LOGIN [,PASSWORD [, ACCOUNT] ] ]), authorize ( [AUTH [, RESP]]),
+site (ARGS), ascii, binary, rename ( OLDNAME, NEWNAME ), delete ( FILENAME
+), cwd ( [ DIR ] ), cdup (), pwd (), restart ( WHERE ), rmdir ( DIR [,
+RECURSE ]), mkdir ( DIR [, RECURSE ]), alloc ( SIZE [, RECORD_SIZE] ), ls (
+[ DIR ] ), dir ( [ DIR ] ), get ( REMOTE_FILE [, LOCAL_FILE [, WHERE]] ),
+put ( LOCAL_FILE [, REMOTE_FILE ] ), put_unique ( LOCAL_FILE [, REMOTE_FILE
+] ), append ( LOCAL_FILE [, REMOTE_FILE ] ), unique_name (), mdtm ( FILE ),
+size ( FILE ), supported ( CMD ), hash ( [FILEHANDLE_GLOB_REF],[
+BYTES_PER_HASH_MARK] ), feature ( NAME ), nlst ( [ DIR ] ), list ( [ DIR ]
+), retr ( FILE ), stor ( FILE ), stou ( FILE ), appe ( FILE ), port ( [
+PORT ] ), pasv (), pasv_xfer ( SRC_FILE, DEST_SERVER [, DEST_FILE ] ),
+pasv_xfer_unique ( SRC_FILE, DEST_SERVER [, DEST_FILE ] ), pasv_wait (
+NON_PASV_SERVER ), abort (), quit ()
+
+=over 4
+
+=item Methods for the adventurous
+
+quot (CMD [,ARGS])
+
+=back
+
+=item THE dataconn CLASS
+
+read ( BUFFER, SIZE [, TIMEOUT ] ), write ( BUFFER, SIZE [, TIMEOUT ] ),
+bytes_read (), abort (), close ()
+
+=item UNIMPLEMENTED
+
+B<SMNT>, B<HELP>, B<MODE>, B<SYST>, B<STAT>, B<STRU>, B<REIN>
+
+=item REPORTING BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item USE EXAMPLES
+
+http://www.csh.rit.edu/~adam/Progs/
+
+=item CREDITS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::NNTP - NNTP Client class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ HOST ] [, OPTIONS ])
+
+=item METHODS
+
+article ( [ MSGID|MSGNUM ], [FH] ), body ( [ MSGID|MSGNUM ], [FH] ), head (
+[ MSGID|MSGNUM ], [FH] ), articlefh ( [ MSGID|MSGNUM ] ), bodyfh ( [
+MSGID|MSGNUM ] ), headfh ( [ MSGID|MSGNUM ] ), nntpstat ( [ MSGID|MSGNUM ]
+), group ( [ GROUP ] ), ihave ( MSGID [, MESSAGE ]), last (), date (),
+postok (), authinfo ( USER, PASS ), list (), newgroups ( SINCE [,
+DISTRIBUTIONS ]), newnews ( SINCE [, GROUPS [, DISTRIBUTIONS ]]), next (),
+post ( [ MESSAGE ] ), postfh (), slave (), quit ()
+
+=over 4
+
+=item Extension methods
+
+newsgroups ( [ PATTERN ] ), distributions (), subscriptions (),
+overview_fmt (), active_times (), active ( [ PATTERN ] ), xgtitle ( PATTERN
+), xhdr ( HEADER, MESSAGE-SPEC ), xover ( MESSAGE-SPEC ), xpath (
+MESSAGE-ID ), xpat ( HEADER, PATTERN, MESSAGE-SPEC), xrover, listgroup ( [
+GROUP ] ), reader
+
+=back
+
+=item UNSUPPORTED
+
+=item DEFINITIONS
+
+MESSAGE-SPEC, PATTERN, Examples, C<[^]-]>, C<*bdc>, C<[0-9a-zA-Z]>, C<a??d>
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::POP3 - Post Office Protocol 3 Client class (RFC1939)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ HOST ] [, OPTIONS ] 0
+
+=item METHODS
+
+auth ( USERNAME, PASSWORD ), user ( USER ), pass ( PASS ), login ( [ USER
+[, PASS ]] ), apop ( [ USER [, PASS ]] ), banner (), capa (), capabilities
+(), top ( MSGNUM [, NUMLINES ] ), list ( [ MSGNUM ] ), get ( MSGNUM [, FH ]
+), getfh ( MSGNUM ), last (), popstat (), ping ( USER ), uidl ( [ MSGNUM ]
+), delete ( MSGNUM ), reset (), quit ()
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::Ping - check a remote host for reachability
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Functions
+
+Net::Ping->new([$proto [, $def_timeout [, $bytes [, $device [, $tos
+]]]]]);, $p->ping($host [, $timeout]);, $p->source_verify( { 0 | 1 } );,
+$p->service_check( { 0 | 1 } );, $p->tcp_service_check( { 0 | 1 } );,
+$p->hires( { 0 | 1 } );, $p->bind($local_addr);, $p->open($host);, $p->ack(
+[ $host ] );, $p->nack( $failed_ack_host );, $p->close();,
+$p->port_number([$port_number]), pingecho($host [, $timeout]);
+
+=back
+
+=item NOTES
+
+=item INSTALL
+
+=item BUGS
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::SMTP - Simple Mail Transfer Protocol Client
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item CONSTRUCTOR
+
+new ( [ HOST ] [, OPTIONS ] )
+
+=item METHODS
+
+banner (), domain (), hello ( DOMAIN ), host (), etrn ( DOMAIN ), auth (
+USERNAME, PASSWORD ), mail ( ADDRESS [, OPTIONS] ), send ( ADDRESS ),
+send_or_mail ( ADDRESS ), send_and_mail ( ADDRESS ), reset (), recipient (
+ADDRESS [, ADDRESS, [...]] [, OPTIONS ] ), to ( ADDRESS [, ADDRESS [...]]
+), cc ( ADDRESS [, ADDRESS [...]] ), bcc ( ADDRESS [, ADDRESS [...]] ),
+data ( [ DATA ] ), expand ( ADDRESS ), verify ( ADDRESS ), help ( [
+$subject ] ), quit ()
+
+=item ADDRESSES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::Time - time and daytime network client interface
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+inet_time ( [HOST [, PROTOCOL [, TIMEOUT]]]), inet_daytime ( [HOST [,
+PROTOCOL [, TIMEOUT]]])
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::hostent - by-name interface to Perl's built-in gethost*()
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 Net::libnetFAQ, libnetFAQ - libnet Frequently Asked Questions
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Where to get this document
+
+=item How to contribute to this document
+
+=back
+
+=item Author and Copyright Information
+
+=over 4
+
+=item Disclaimer
+
+=back
+
+=item Obtaining and installing libnet
+
+=over 4
+
+=item What is libnet ?
+
+=item Which version of perl do I need ?
+
+=item What other modules do I need ?
+
+=item What machines support libnet ?
+
+=item Where can I get the latest libnet release
+
+=back
+
+=item Using Net::FTP
+
+=over 4
+
+=item How do I download files from an FTP server ?
+
+=item How do I transfer files in binary mode ?
+
+=item How can I get the size of a file on a remote FTP server ?
+
+=item How can I get the modification time of a file on a remote FTP server
+?
+
+=item How can I change the permissions of a file on a remote server ?
+
+=item Can I do a reget operation like the ftp command ?
+
+=item How do I get a directory listing from an FTP server ?
+
+=item Changing directory to "" does not fail ?
+
+=item I am behind a SOCKS firewall, but the Firewall option does not work ?
+
+=item I am behind an FTP proxy firewall, but cannot access machines outside
+?
+
+=item My ftp proxy firewall does not listen on port 21
+
+=item Is it possible to change the file permissions of a file on an FTP
+server ?
+
+=item I have seen scripts call a method message, but cannot find it
+documented ?
+
+=item Why does Net::FTP not implement mput and mget methods
+
+=back
+
+=item Using Net::SMTP
+
+=over 4
+
+=item Why can't the part of an Email address after the @ be used as the
+hostname ?
+
+=item Why does Net::SMTP not do DNS MX lookups ?
+
+=item The verify method always returns true ?
+
+=back
+
+=item Debugging scripts
+
+=over 4
+
+=item How can I debug my scripts that use Net::* modules ?
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 Net::netent - by-name interface to Perl's built-in getnet*()
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 Net::protoent - by-name interface to Perl's built-in getproto*()
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 Net::servent - by-name interface to Perl's built-in getserv*()
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 Netrc, Net::Netrc - OO interface to users netrc file
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item THE .netrc FILE
+
+machine name, default, login name, password string, account string, macdef
+name
+
+=item CONSTRUCTOR
+
+lookup ( MACHINE [, LOGIN ])
+
+=item METHODS
+
+login (), password (), account (), lpa ()
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 O - Generic interface to Perl Compiler backends
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONVENTIONS
+
+=item IMPLEMENTATION
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 ODBM_File - Tied access to odbm files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<O_RDONLY>, C<O_WRONLY>, C<O_RDWR>
+
+=item DIAGNOSTICS
+
+=over 4
+
+=item C<odbm store returned -1, errno 22, key "..." at ...>
+
+=back
+
+=item BUGS AND WARNINGS
+
+=back
+
+=head2 Object::Accessor
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item $object = Object::Accessor->new( [ARGS] );
+
+=back
+
+=back
+
+=over 4
+
+=item $bool = $object->mk_accessors( @ACCESSORS | \%ACCESSOR_MAP );
+
+=back
+
+=over 4
+
+=item @list = $self->ls_accessors;
+
+=back
+
+=over 4
+
+=item $ref = $self->ls_allow(KEY)
+
+=back
+
+=over 4
+
+=item $bool = $self->mk_aliases( alias => method, [alias2 => method2, ...]
+);
+
+=back
+
+=over 4
+
+=item $clone = $self->mk_clone;
+
+=back
+
+=over 4
+
+=item $bool = $self->mk_flush;
+
+=back
+
+=over 4
+
+=item $bool = $self->mk_verify;
+
+=back
+
+=over 4
+
+=item $bool = $self->register_callback( sub { ... } );
+
+=back
+
+=over 4
+
+=item $bool = $self->can( METHOD_NAME )
+
+=back
+
+=over 4
+
+=item $val = $self->___get( METHOD_NAME );
+
+=back
+
+=over 4
+
+=item $bool = $self->___set( METHOD_NAME => VALUE );
+
+=back
+
+=over 4
+
+=item $bool = $self->___alias( ALIAS => METHOD );
+
+=back
+
+=over 4
+
+=item LVALUE ACCESSORS
+
+=over 4
+
+=item CAVEATS
+
+Allow handlers, Callbacks
+
+=back
+
+=back
+
+=over 4
+
+=item GLOBAL VARIABLES
+
+=over 4
+
+=item $Object::Accessor::FATAL
+
+=item $Object::Accessor::DEBUG
+
+=back
+
+=item TODO
+
+=over 4
+
+=item Create read-only accessors
+
+=back
+
+=item CAVEATS
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Opcode - Disable named opcodes when compiling perl code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item WARNING
+
+=item Operator Names and Operator Lists
+
+an operator name (opname), an operator tag name (optag), a negated opname
+or optag, an operator set (opset)
+
+=item Opcode Functions
+
+opcodes, opset (OP, ...), opset_to_ops (OPSET), opset_to_hex (OPSET),
+full_opset, empty_opset, invert_opset (OPSET), verify_opset (OPSET, ...),
+define_optag (OPTAG, OPSET), opmask_add (OPSET), opmask, opdesc (OP, ...),
+opdump (PAT)
+
+=item Manipulating Opsets
+
+=item TO DO (maybe)
+
+=back
+
+=over 4
+
+=item Predefined Opcode Tags
+
+:base_core, :base_mem, :base_loop, :base_io, :base_orig, :base_math,
+:base_thread, :default, :filesys_read, :sys_db, :browse, :filesys_open,
+:filesys_write, :subprocess, :ownprocess, :others, :load,
+:still_to_be_decided, :dangerous
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=back
+
+=head2 Opcode::ops, ops - Perl pragma to restrict unsafe operations when
+compiling
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 POSIX - Perl interface to IEEE Std 1003.1
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item CAVEATS
+
+=item FUNCTIONS
+
+_exit, abort, abs, access, acos, alarm, asctime, asin, assert, atan, atan2,
+atexit, atof, atoi, atol, bsearch, calloc, ceil, chdir, chmod, chown,
+clearerr, clock, close, closedir, cos, cosh, creat, ctermid, ctime,
+cuserid, difftime, div, dup, dup2, errno, execl, execle, execlp, execv,
+execve, execvp, exit, exp, fabs, fclose, fcntl, fdopen, feof, ferror,
+fflush, fgetc, fgetpos, fgets, fileno, floor, fmod, fopen, fork, fpathconf,
+fprintf, fputc, fputs, fread, free, freopen, frexp, fscanf, fseek, fsetpos,
+fstat, fsync, ftell, fwrite, getc, getchar, getcwd, getegid, getenv,
+geteuid, getgid, getgrgid, getgrnam, getgroups, getlogin, getpgrp, getpid,
+getppid, getpwnam, getpwuid, gets, getuid, gmtime, isalnum, isalpha,
+isatty, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace,
+isupper, isxdigit, kill, labs, ldexp, ldiv, link, localeconv, localtime,
+log, log10, longjmp, lseek, malloc, mblen, mbstowcs, mbtowc, memchr,
+memcmp, memcpy, memmove, memset, mkdir, mkfifo, mktime, modf, nice,
+offsetof, open, opendir, pathconf, pause, perror, pipe, pow, printf, putc,
+putchar, puts, qsort, raise, rand, read, readdir, realloc, remove, rename,
+rewind, rewinddir, rmdir, scanf, setgid, setjmp, setlocale, setpgid,
+setsid, setuid, sigaction, siglongjmp, sigpending, sigprocmask, sigsetjmp,
+sigsuspend, sin, sinh, sleep, sprintf, sqrt, srand, sscanf, stat, strcat,
+strchr, strcmp, strcoll, strcpy, strcspn, strerror, strftime, strlen,
+strncat, strncmp, strncpy, strpbrk, strrchr, strspn, strstr, strtod,
+strtok, strtol, strtoul, strxfrm, sysconf, system, tan, tanh, tcdrain,
+tcflow, tcflush, tcgetpgrp, tcsendbreak, tcsetpgrp, time, times, tmpfile,
+tmpnam, tolower, toupper, ttyname, tzname, tzset, umask, uname, ungetc,
+unlink, utime, vfprintf, vprintf, vsprintf, wait, waitpid, wcstombs,
+wctomb, write
+
+=item CLASSES
+
+=over 4
+
+=item POSIX::SigAction
+
+new, handler, mask, flags, safe
+
+=item POSIX::SigRt
+
+%SIGRT, SIGRTMIN, SIGRTMAX
+
+=item POSIX::SigSet
+
+new, addset, delset, emptyset, fillset, ismember
+
+=item POSIX::Termios
+
+new, getattr, getcc, getcflag, getiflag, getispeed, getlflag, getoflag,
+getospeed, setattr, setcc, setcflag, setiflag, setispeed, setlflag,
+setoflag, setospeed, Baud rate values, Terminal interface values, c_cc
+field values, c_cflag field values, c_iflag field values, c_lflag field
+values, c_oflag field values
+
+=back
+
+=item PATHNAME CONSTANTS
+
+Constants
+
+=item POSIX CONSTANTS
+
+Constants
+
+=item SYSTEM CONFIGURATION
+
+Constants
+
+=item ERRNO
+
+Constants
+
+=item FCNTL
+
+Constants
+
+=item FLOAT
+
+Constants
+
+=item LIMITS
+
+Constants
+
+=item LOCALE
+
+Constants
+
+=item MATH
+
+Constants
+
+=item SIGNAL
+
+Constants
+
+=item STAT
+
+Constants, Macros
+
+=item STDLIB
+
+Constants
+
+=item STDIO
+
+Constants
+
+=item TIME
+
+Constants
+
+=item UNISTD
+
+Constants
+
+=item WAIT
+
+Constants, WNOHANG, WUNTRACED, Macros, WIFEXITED, WEXITSTATUS, WIFSIGNALED,
+WTERMSIG, WIFSTOPPED, WSTOPSIG
+
+=back
+
+=head2 Package::Constants - List all constants declared in a package
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CLASS METHODS
+
+=over 4
+
+=item @const = Package::Constants->list( PACKAGE_NAME );
+
+=back
+
+=back
+
+=over 4
+
+=item GLOBAL VARIABLES
+
+=over 4
+
+=item $Package::Constants::DEBUG
+
+=back
+
+=back
+
+=over 4
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Params::Check - A generic input parsing/checking mechanism.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Template
+
+default, required, strict_type, defined, no_override, store, allow
+
+=item Functions
+
+=over 4
+
+=item check( \%tmpl, \%args, [$verbose] );
+
+Template, Arguments, Verbose
+
+=back
+
+=back
+
+=over 4
+
+=item allow( $test_me, \@criteria );
+
+string, regexp, subroutine, array ref
+
+=back
+
+=over 4
+
+=item last_error()
+
+=back
+
+=over 4
+
+=item Global Variables
+
+=over 4
+
+=item $Params::Check::VERBOSE
+
+=item $Params::Check::STRICT_TYPE
+
+=item $Params::Check::ALLOW_UNKNOWN
+
+=item $Params::Check::STRIP_LEADING_DASHES
+
+=item $Params::Check::NO_DUPLICATES
+
+=item $Params::Check::PRESERVE_CASE
+
+=item $Params::Check::ONLY_ALLOW_DEFINED
+
+=item $Params::Check::SANITY_CHECK_TEMPLATE
+
+=item $Params::Check::WARNINGS_FATAL
+
+=item $Params::Check::CALLER_DEPTH
+
+=back
+
+=item AUTHOR
+
+=item Acknowledgements
+
+=item COPYRIGHT
+
+=back
+
+=head2 Parse::CPAN::Meta - Parse META.yml and other similar CPAN metadata
+files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=over 4
+
+=item Load
+
+=item LoadFile
+
+=back
+
+=item SUPPORT
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 PerlIO - On demand loader for PerlIO layers and root of PerlIO::*
+name space
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+:unix, :stdio, :perlio, :crlf, :mmap, :utf8, :bytes, :raw, :pop, :win32
+
+=over 4
+
+=item Custom Layers
+
+:encoding, :via
+
+=item Alternatives to raw
+
+=item Defaults and how to override them
+
+=item Querying the layers of filehandles
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 PerlIO-encoding, PerlIO::encoding - encoding layer
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 PerlIO-scalar, PerlIO::scalar - in-memory IO, scalar IO
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item IMPLEMENTATION NOTE
+
+=back
+
+=head2 PerlIO-via, PerlIO::via - Helper class for PerlIO layers implemented
+in perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXPECTED METHODS
+
+$class->PUSHED([$mode,[$fh]]), $obj->POPPED([$fh]),
+$obj->UTF8($bellowFlag,[$fh]), $obj->OPEN($path,$mode,[$fh]),
+$obj->BINMODE([$fh]), $obj->FDOPEN($fd,[$fh]),
+$obj->SYSOPEN($path,$imode,$perm,[$fh]), $obj->FILENO($fh),
+$obj->READ($buffer,$len,$fh), $obj->WRITE($buffer,$fh), $obj->FILL($fh),
+$obj->CLOSE($fh), $obj->SEEK($posn,$whence,$fh), $obj->TELL($fh),
+$obj->UNREAD($buffer,$fh), $obj->FLUSH($fh), $obj->SETLINEBUF($fh),
+$obj->CLEARERR($fh), $obj->ERROR($fh), $obj->EOF($fh)
+
+=item EXAMPLES
+
+=over 4
+
+=item Example - a Hexadecimal Handle
+
+=back
+
+=back
+
+=head2 PerlIO::encoding - encoding layer
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 PerlIO::scalar - in-memory IO, scalar IO
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item IMPLEMENTATION NOTE
+
+=back
+
+=head2 PerlIO::via - Helper class for PerlIO layers implemented in perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXPECTED METHODS
+
+$class->PUSHED([$mode,[$fh]]), $obj->POPPED([$fh]),
+$obj->UTF8($bellowFlag,[$fh]), $obj->OPEN($path,$mode,[$fh]),
+$obj->BINMODE([$fh]), $obj->FDOPEN($fd,[$fh]),
+$obj->SYSOPEN($path,$imode,$perm,[$fh]), $obj->FILENO($fh),
+$obj->READ($buffer,$len,$fh), $obj->WRITE($buffer,$fh), $obj->FILL($fh),
+$obj->CLOSE($fh), $obj->SEEK($posn,$whence,$fh), $obj->TELL($fh),
+$obj->UNREAD($buffer,$fh), $obj->FLUSH($fh), $obj->SETLINEBUF($fh),
+$obj->CLEARERR($fh), $obj->ERROR($fh), $obj->EOF($fh)
+
+=item EXAMPLES
+
+=over 4
+
+=item Example - a Hexadecimal Handle
+
+=back
+
+=back
+
+=head2 PerlIO::via::QuotedPrint - PerlIO layer for quoted-printable strings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item REQUIRED MODULES
+
+=item SEE ALSO
+
+=item ACKNOWLEDGEMENTS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Pod::Checker, podchecker() - check pod documents for syntax errors
+
+=over 4
+
+=item SYNOPSIS
+
+=item OPTIONS/ARGUMENTS
+
+=over 4
+
+=item podchecker()
+
+B<-warnings> =E<gt> I<val>
+
+=back
+
+=item DESCRIPTION
+
+=item DIAGNOSTICS
+
+=over 4
+
+=item Errors
+
+empty =headn, =over on line I<N> without closing =back, =item without
+previous =over, =back without previous =over, No argument for =begin, =end
+without =begin, Nested =begin's, =for without formatter specification,
+unresolved internal link I<NAME>, Unknown command "I<CMD>", Unknown
+interior-sequence "I<SEQ>", nested commands
+I<CMD>E<lt>...I<CMD>E<lt>...E<gt>...E<gt>, garbled entity I<STRING>, Entity
+number out of range, malformed link LE<lt>E<gt>, nonempty ZE<lt>E<gt>,
+empty XE<lt>E<gt>, Spurious text after =pod / =cut, Spurious character(s)
+after =back
+
+=item Warnings
+
+multiple occurrence of link target I<name>, line containing nothing but
+whitespace in paragraph, file does not start with =head, previous =item has
+no contents, preceding non-item paragraph(s), =item type mismatch (I<one>
+vs. I<two>), I<N> unescaped C<E<lt>E<gt>> in paragraph, Unknown entity, No
+items in =over, No argument for =item, empty section in previous paragraph,
+Verbatim paragraph in NAME section, =headI<n> without preceding higher
+level
+
+=item Hyperlinks
+
+ignoring leading/trailing whitespace in link, (section) in '$page'
+deprecated, alternative text/node '%s' contains non-escaped | or /
+
+=back
+
+=item RETURN VALUE
+
+=item EXAMPLES
+
+=item INTERFACE
+
+=back
+
+C<Pod::Checker-E<gt>new( %options )>
+
+C<$checker-E<gt>poderror( @args )>, C<$checker-E<gt>poderror( {%opts},
+@args )>
+
+C<$checker-E<gt>num_errors()>
+
+C<$checker-E<gt>num_warnings()>
+
+C<$checker-E<gt>name()>
+
+C<$checker-E<gt>node()>
+
+C<$checker-E<gt>idx()>
+
+C<$checker-E<gt>hyperlink()>
+
+=over 4
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Escapes -- for resolving Pod EE<lt>...E<gt> sequences
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item GOODIES
+
+e2char($e_content), e2charnum($e_content), $Name2character{I<name>},
+$Name2character_number{I<name>}, $Latin1Code_to_fallback{I<integer>},
+$Latin1Char_to_fallback{I<character>}, $Code2USASCII{I<integer>}
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Find - find POD documents in directory trees
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item C<pod_find( { %opts } , @directories )>
+
+C<-verbose =E<gt> 1>, C<-perl =E<gt> 1>, C<-script =E<gt> 1>, C<-inc =E<gt>
+1>
+
+=back
+
+=over 4
+
+=item C<simplify_name( $str )>
+
+=back
+
+=over 4
+
+=item C<pod_where( { %opts }, $pod )>
+
+C<-inc =E<gt> 1>, C<-dirs =E<gt> [ $dir1, $dir2, ... ]>, C<-verbose =E<gt>
+1>
+
+=back
+
+=over 4
+
+=item C<contains_pod( $file , $verbose )>
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Pod::Html - module to convert pod files to HTML
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=over 4
+
+=item pod2html
+
+backlink, cachedir, css, flush, header, help, hiddendirs, htmldir,
+htmlroot, index, infile, libpods, netscape, outfile, podpath, podroot,
+quiet, recurse, title, verbose
+
+=item htmlify
+
+=item anchorify
+
+=back
+
+=item ENVIRONMENT
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 Pod::InputObjects - objects representing POD input paragraphs,
+commands, etc.
+
+=over 4
+
+=item SYNOPSIS
+
+=item REQUIRES
+
+=item EXPORTS
+
+=item DESCRIPTION
+
+package B<Pod::InputSource>, package B<Pod::Paragraph>, package
+B<Pod::InteriorSequence>, package B<Pod::ParseTree>
+
+=back
+
+=over 4
+
+=item B<Pod::InputSource>
+
+=back
+
+=over 4
+
+=item B<new()>
+
+=back
+
+=over 4
+
+=item B<name()>
+
+=back
+
+=over 4
+
+=item B<handle()>
+
+=back
+
+=over 4
+
+=item B<was_cutting()>
+
+=back
+
+=over 4
+
+=item B<Pod::Paragraph>
+
+=back
+
+=over 4
+
+=item Pod::Paragraph-E<gt>B<new()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<cmd_name()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<text()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<raw_text()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<cmd_prefix()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<cmd_separator()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<parse_tree()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<file_line()>
+
+=back
+
+=over 4
+
+=item B<Pod::InteriorSequence>
+
+=back
+
+=over 4
+
+=item Pod::InteriorSequence-E<gt>B<new()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<cmd_name()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<prepend()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<append()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<nested()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<raw_text()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<left_delimiter()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<right_delimiter()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<parse_tree()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<file_line()>
+
+=back
+
+=over 4
+
+=item Pod::InteriorSequence::B<DESTROY()>
+
+=back
+
+=over 4
+
+=item B<Pod::ParseTree>
+
+=back
+
+=over 4
+
+=item Pod::ParseTree-E<gt>B<new()>
+
+=back
+
+=over 4
+
+=item $ptree-E<gt>B<top()>
+
+=back
+
+=over 4
+
+=item $ptree-E<gt>B<children()>
+
+=back
+
+=over 4
+
+=item $ptree-E<gt>B<prepend()>
+
+=back
+
+=over 4
+
+=item $ptree-E<gt>B<append()>
+
+=back
+
+=over 4
+
+=item $ptree-E<gt>B<raw_text()>
+
+=back
+
+=over 4
+
+=item Pod::ParseTree::B<DESTROY()>
+
+=back
+
+=over 4
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::LaTeX - Convert Pod data to formatted Latex
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item OBJECT METHODS
+
+C<initialize>
+
+=back
+
+=over 4
+
+=item Data Accessors
+
+B<AddPreamble>
+
+=back
+
+B<AddPostamble>
+
+B<Head1Level>
+
+B<Label>
+
+B<LevelNoNum>
+
+B<MakeIndex>
+
+B<ReplaceNAMEwithSection>
+
+B<StartWithNewPage>
+
+B<TableOfContents>
+
+B<UniqueLabels>
+
+B<UserPreamble>
+
+B<UserPostamble>
+
+B<Lists>
+
+=over 4
+
+=item Subclassed methods
+
+=back
+
+B<begin_pod>
+
+B<end_pod>
+
+B<command>
+
+B<verbatim>
+
+B<textblock>
+
+B<interior_sequence>
+
+=over 4
+
+=item List Methods
+
+B<begin_list>
+
+=back
+
+B<end_list>
+
+B<add_item>
+
+=over 4
+
+=item Methods for headings
+
+B<head>
+
+=back
+
+=over 4
+
+=item Internal methods
+
+B<_output>
+
+=back
+
+B<_replace_special_chars>
+
+B<_replace_special_chars_late>
+
+B<_create_label>
+
+B<_create_index>
+
+B<_clean_latex_commands>
+
+B<_split_delimited>
+
+=over 4
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=item REVISION
+
+=back
+
+=head2 Pod::Man - Convert POD data to formatted *roff input
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+center, date, fixed, fixedbold, fixeditalic, fixedbolditalic, name, quotes,
+release, section, stderr, utf8
+
+=item DIAGNOSTICS
+
+roff font should be 1 or 2 chars, not "%s", Invalid quote specification
+"%s"
+
+=item BUGS
+
+=item CAVEATS
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=item SEE ALSO
+
+=back
+
+=head2 Pod::ParseLink - Parse an LE<lt>E<gt> formatting code in POD text
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Pod::ParseUtils - helpers for POD parsing and conversion
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item Pod::List
+
+Pod::List-E<gt>new()
+
+=back
+
+$list-E<gt>file()
+
+$list-E<gt>start()
+
+$list-E<gt>indent()
+
+$list-E<gt>type()
+
+$list-E<gt>rx()
+
+$list-E<gt>item()
+
+$list-E<gt>parent()
+
+$list-E<gt>tag()
+
+=over 4
+
+=item Pod::Hyperlink
+
+Pod::Hyperlink-E<gt>new()
+
+=back
+
+$link-E<gt>parse($string)
+
+$link-E<gt>markup($string)
+
+$link-E<gt>text()
+
+$link-E<gt>warning()
+
+$link-E<gt>file(), $link-E<gt>line()
+
+$link-E<gt>page()
+
+$link-E<gt>node()
+
+$link-E<gt>alttext()
+
+$link-E<gt>type()
+
+$link-E<gt>link()
+
+=over 4
+
+=item Pod::Cache
+
+Pod::Cache-E<gt>new()
+
+=back
+
+$cache-E<gt>item()
+
+$cache-E<gt>find_page($name)
+
+=over 4
+
+=item Pod::Cache::Item
+
+Pod::Cache::Item-E<gt>new()
+
+=back
+
+$cacheitem-E<gt>page()
+
+$cacheitem-E<gt>description()
+
+$cacheitem-E<gt>path()
+
+$cacheitem-E<gt>file()
+
+$cacheitem-E<gt>nodes()
+
+$cacheitem-E<gt>find_node($name)
+
+$cacheitem-E<gt>idx()
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Pod::Parser - base class for creating POD filters and translators
+
+=over 4
+
+=item SYNOPSIS
+
+=item REQUIRES
+
+=item EXPORTS
+
+=item DESCRIPTION
+
+=item QUICK OVERVIEW
+
+=item PARSING OPTIONS
+
+B<-want_nonPODs> (default: unset), B<-process_cut_cmd> (default: unset),
+B<-warnings> (default: unset)
+
+=back
+
+=over 4
+
+=item RECOMMENDED SUBROUTINE/METHOD OVERRIDES
+
+=back
+
+=over 4
+
+=item B<command()>
+
+C<$cmd>, C<$text>, C<$line_num>, C<$pod_para>
+
+=back
+
+=over 4
+
+=item B<verbatim()>
+
+C<$text>, C<$line_num>, C<$pod_para>
+
+=back
+
+=over 4
+
+=item B<textblock()>
+
+C<$text>, C<$line_num>, C<$pod_para>
+
+=back
+
+=over 4
+
+=item B<interior_sequence()>
+
+=back
+
+=over 4
+
+=item OPTIONAL SUBROUTINE/METHOD OVERRIDES
+
+=back
+
+=over 4
+
+=item B<new()>
+
+=back
+
+=over 4
+
+=item B<initialize()>
+
+=back
+
+=over 4
+
+=item B<begin_pod()>
+
+=back
+
+=over 4
+
+=item B<begin_input()>
+
+=back
+
+=over 4
+
+=item B<end_input()>
+
+=back
+
+=over 4
+
+=item B<end_pod()>
+
+=back
+
+=over 4
+
+=item B<preprocess_line()>
+
+=back
+
+=over 4
+
+=item B<preprocess_paragraph()>
+
+=back
+
+=over 4
+
+=item METHODS FOR PARSING AND PROCESSING
+
+=back
+
+=over 4
+
+=item B<parse_text()>
+
+B<-expand_seq> =E<gt> I<code-ref>|I<method-name>, B<-expand_text> =E<gt>
+I<code-ref>|I<method-name>, B<-expand_ptree> =E<gt>
+I<code-ref>|I<method-name>
+
+=back
+
+=over 4
+
+=item B<interpolate()>
+
+=back
+
+=over 4
+
+=item B<parse_paragraph()>
+
+=back
+
+=over 4
+
+=item B<parse_from_filehandle()>
+
+=back
+
+=over 4
+
+=item B<parse_from_file()>
+
+=back
+
+=over 4
+
+=item ACCESSOR METHODS
+
+=back
+
+=over 4
+
+=item B<errorsub()>
+
+=back
+
+=over 4
+
+=item B<cutting()>
+
+=back
+
+=over 4
+
+=item B<parseopts()>
+
+=back
+
+=over 4
+
+=item B<output_file()>
+
+=back
+
+=over 4
+
+=item B<output_handle()>
+
+=back
+
+=over 4
+
+=item B<input_file()>
+
+=back
+
+=over 4
+
+=item B<input_handle()>
+
+=back
+
+=over 4
+
+=item B<input_streams()>
+
+=back
+
+=over 4
+
+=item B<top_stream()>
+
+=back
+
+=over 4
+
+=item PRIVATE METHODS AND DATA
+
+=back
+
+=over 4
+
+=item B<_push_input_stream()>
+
+=back
+
+=over 4
+
+=item B<_pop_input_stream()>
+
+=back
+
+=over 4
+
+=item TREE-BASED PARSING
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item LICENSE
+
+=back
+
+=head2 Pod::Perldoc::ToChecker - let Perldoc check Pod for errors
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToMan - let Perldoc render Pod as man pages
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEAT
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToNroff - let Perldoc convert Pod to nroff
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEAT
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToPod - let Perldoc render Pod as ... Pod!
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToRtf - let Perldoc render Pod as RTF
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToText - let Perldoc render Pod as plaintext
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEAT
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToTk - let Perldoc use Tk::Pod to render Pod
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToXml - let Perldoc render Pod as XML
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::PlainText - Convert POD data to formatted ASCII text
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+alt, indent, loose, sentence, width
+
+=item DIAGNOSTICS
+
+Bizarre space in item, Can't open %s for reading: %s, Unknown escape: %s,
+Unknown sequence: %s, Unmatched =back
+
+=item RESTRICTIONS
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Plainer - Perl extension for converting Pod to old style Pod.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item EXPORT
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Pod::Select, podselect() - extract selected sections of POD from
+input
+
+=over 4
+
+=item SYNOPSIS
+
+=item REQUIRES
+
+=item EXPORTS
+
+=item DESCRIPTION
+
+=item SECTION SPECIFICATIONS
+
+=item RANGE SPECIFICATIONS
+
+=back
+
+=over 4
+
+=item OBJECT METHODS
+
+=back
+
+=over 4
+
+=item B<curr_headings()>
+
+=back
+
+=over 4
+
+=item B<select()>
+
+=back
+
+=over 4
+
+=item B<add_selection()>
+
+=back
+
+=over 4
+
+=item B<clear_selections()>
+
+=back
+
+=over 4
+
+=item B<match_section()>
+
+=back
+
+=over 4
+
+=item B<is_selected()>
+
+=back
+
+=over 4
+
+=item EXPORTED FUNCTIONS
+
+=back
+
+=over 4
+
+=item B<podselect()>
+
+B<-output>, B<-sections>, B<-ranges>
+
+=back
+
+=over 4
+
+=item PRIVATE METHODS AND DATA
+
+=back
+
+=over 4
+
+=item B<_compile_section_spec()>
+
+=back
+
+=over 4
+
+=item $self->{_SECTION_HEADINGS}
+
+=back
+
+=over 4
+
+=item $self->{_SELECTED_SECTIONS}
+
+=back
+
+=over 4
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple - framework for parsing Pod
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item MAIN METHODS
+
+C<< $parser = I<SomeClass>->new(); >>, C<< $parser->output_fh( *OUT ); >>,
+C<< $parser->output_string( \$somestring ); >>, C<< $parser->parse_file(
+I<$some_filename> ); >>, C<< $parser->parse_file( *INPUT_FH ); >>, C<<
+$parser->parse_string_document( I<$all_content> ); >>, C<<
+$parser->parse_lines( I<...@lines...>, undef ); >>, C<<
+$parser->content_seen >>, C<< I<SomeClass>->filter( I<$filename> ); >>, C<<
+I<SomeClass>->filter( I<*INPUT_FH> ); >>, C<< I<SomeClass>->filter(
+I<\$document_content> ); >>
+
+=item SECONDARY METHODS
+
+C<< $parser->no_whining( I<SOMEVALUE> ) >>, C<< $parser->no_errata_section(
+I<SOMEVALUE> ) >>, C<< $parser->complain_stderr( I<SOMEVALUE> ) >>, C<<
+$parser->source_filename >>, C<< $parser->doc_has_started >>, C<<
+$parser->source_dead >>
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+Allison Randal C<allison@perl.org>, Hans Dieter Pearcey C<hdp@cpan.org>
+
+=back
+
+=head2 Pod::Simple::Checker -- check the Pod syntax of a document
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::Debug -- put Pod::Simple into trace/debug mode
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEATS
+
+=item GUTS
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::DumpAsText -- dump Pod-parsing events as text
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::DumpAsXML -- turn Pod into XML
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::HTML - convert Pod to HTML
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CALLING FROM THE COMMAND LINE
+
+=item CALLING FROM PERL
+
+=item METHODS
+
+=item SUBCLASSING
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::HTMLBatch - convert several Pod files to several HTML
+files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item FROM THE COMMAND LINE
+
+=back
+
+=item MAIN METHODS
+
+$batchconv = Pod::Simple::HTMLBatch->new;, $batchconv->batch_convert(
+I<indirs>, I<outdir> );, $batchconv->batch_convert( undef , ...);,
+$batchconv->batch_convert( q{@INC}, ...);, $batchconv->batch_convert(
+\@dirs , ...);, $batchconv->batch_convert( "somedir" , ...);,
+$batchconv->batch_convert( 'somedir:someother:also' , ...);,
+$batchconv->batch_convert( ... , undef );, $batchconv->batch_convert( ... ,
+'somedir' );
+
+=over 4
+
+=item ACCESSOR METHODS
+
+$batchconv->verbose( I<nonnegative_integer> );, $batchconv->index(
+I<true-or-false> );, $batchconv->contents_file( I<filename> );,
+$batchconv->contents_page_start( I<HTML_string> );,
+$batchconv->contents_page_end( I<HTML_string> );, $batchconv->add_css( $url
+);, $batchconv->add_javascript( $url );, $batchconv->css_flurry(
+I<true-or-false> );, $batchconv->javascript_flurry( I<true-or-false> );,
+$batchconv->no_contents_links( I<true-or-false> );,
+$batchconv->html_render_class( I<classname> );
+
+=back
+
+=item NOTES ON CUSTOMIZATION
+
+=item ASK ME!
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::LinkSection -- represent "section" attributes of L
+codes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::Methody -- turn Pod::Simple events into method calls
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHOD CALLING
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::PullParser -- a pull-parser interface to parsing Pod
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+my $token = $parser->get_token, $parser->unget_token( $token ),
+$parser->unget_token( $token1, $token2, ... ), $parser->set_source(
+$filename ), $parser->set_source( $filehandle_object ),
+$parser->set_source( \$document_source ), $parser->set_source(
+\@document_lines ), $parser->parse_file(...),
+$parser->parse_string_document(...), $parser->filter(...),
+$parser->parse_from_file(...), my $title_string = $parser->get_title, my
+$title_string = $parser->get_short_title, $author_name =
+$parser->get_author, $description_name = $parser->get_description,
+$version_block = $parser->get_version
+
+=item NOTE
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::PullParserEndToken -- end-tokens from
+Pod::Simple::PullParser
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$token->tagname, $token->tagname(I<somestring>), $token->tag(...),
+$token->is_tag(I<somestring>) or $token->is_tagname(I<somestring>)
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::PullParserStartToken -- start-tokens from
+Pod::Simple::PullParser
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$token->tagname, $token->tagname(I<somestring>), $token->tag(...),
+$token->is_tag(I<somestring>) or $token->is_tagname(I<somestring>),
+$token->attr(I<attrname>), $token->attr(I<attrname>, I<newvalue>),
+$token->attr_hash
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::PullParserTextToken -- text-tokens from
+Pod::Simple::PullParser
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$token->text, $token->text(I<somestring>), $token->text_r()
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::PullParserToken -- tokens from Pod::Simple::PullParser
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$token->type, $token->is_start, $token->is_text, $token->is_end,
+$token->dump
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::RTF -- format Pod as RTF
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FORMAT CONTROL ATTRIBUTES
+
+$parser->head1_halfpoint_size( I<halfpoint_integer> );,
+$parser->head2_halfpoint_size( I<halfpoint_integer> );,
+$parser->head3_halfpoint_size( I<halfpoint_integer> );,
+$parser->head4_halfpoint_size( I<halfpoint_integer> );,
+$parser->codeblock_halfpoint_size( I<halfpoint_integer> );,
+$parser->header_halfpoint_size( I<halfpoint_integer> );,
+$parser->normal_halfpoint_size( I<halfpoint_integer> );,
+$parser->no_proofing_exemptions( I<true_or_false> );, $parser->doc_lang(
+I<microsoft_decimal_language_code> )
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::Search - find POD documents in directory trees
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+=item ACCESSORS
+
+$search->inc( I<true-or-false> );, $search->verbose( I<nonnegative-number>
+);, $search->limit_glob( I<some-glob-string> );, $search->callback(
+I<\&some_routine> );, $search->laborious( I<true-or-false> );,
+$search->shadows( I<true-or-false> );, $search->limit_re( I<some-regxp> );,
+$search->dir_prefix( I<some-string-value> );, $search->progress(
+I<some-progress-object> );, $name2path = $self->name2path;, $path2name =
+$self->path2name;
+
+=item MAIN SEARCH METHODS
+
+=over 4
+
+=item C<< $search->survey( @directories ) >>
+
+C<name2path>, C<path2name>
+
+=item C<< $search->simplify_name( $str ) >>
+
+=item C<< $search->find( $pod ) >>
+
+=item C<< $search->find( $pod, @search_dirs ) >>
+
+=item C<< $self->contains_pod( $file ) >>
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Pod::Simple::Subclassing -- write a formatter as a Pod::Simple
+subclass
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Events
+
+C<< $parser->_handle_element_start( I<element_name>, I<attr_hashref> ) >>,
+C<< $parser->_handle_element_end( I<element_name> ) >>, C<<
+$parser->_handle_text( I<text_string> ) >>, events with an element_name
+of Document, events with an element_name of Para, events with an
+element_name of B, C, F, or I, events with an element_name of S, events
+with an element_name of X, events with an element_name of L, events with an
+element_name of E or Z, events with an element_name of Verbatim, events
+with an element_name of head1 .. head4, events with an element_name of
+over-bullet, events with an element_name of over-number, events with an
+element_name of over-text, events with an element_name of over-block,
+events with an element_name of item-bullet, events with an element_name of
+item-number, events with an element_name of item-text, events with an
+element_name of for, events with an element_name of Data
+
+=item More Pod::Simple Methods
+
+C<< $parser->accept_targets( I<SOMEVALUE> ) >>, C<<
+$parser->accept_targets_as_text( I<SOMEVALUE> ) >>, C<<
+$parser->accept_codes( I<Codename>, I<Codename>... ) >>, C<<
+$parser->accept_directive_as_data( I<directive_name> ) >>, C<<
+$parser->accept_directive_as_verbatim( I<directive_name> ) >>, C<<
+$parser->accept_directive_as_processed( I<directive_name> ) >>, C<<
+$parser->nbsp_for_S( I<BOOLEAN> ); >>, C<< $parser->version_report() >>,
+C<< $parser->pod_para_count() >>, C<< $parser->line_count() >>, C<<
+$parser->nix_X_codes( I<SOMEVALUE> ) >>, C<< $parser->merge_text(
+I<SOMEVALUE> ) >>, C<< $parser->code_handler( I<CODE_REF> ) >>, C<<
+$parser->cut_handler( I<CODE_REF> ) >>, C<< $parser->whine(
+I<linenumber>, I<complaint string> ) >>, C<< $parser->scream(
+I<linenumber>, I<complaint string> ) >>, C<< $parser->source_dead(1) >>,
+C<< $parser->hide_line_numbers( I<SOMEVALUE> ) >>, C<< $parser->no_whining(
+I<SOMEVALUE> ) >>, C<< $parser->no_errata_section( I<SOMEVALUE> ) >>, C<<
+$parser->complain_stderr( I<SOMEVALUE> ) >>, C<< $parser->bare_output(
+I<SOMEVALUE> ) >>, C<< $parser->preserve_whitespace( I<SOMEVALUE> ) >>
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::Text -- format Pod as plaintext
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::TextContent -- get the text content of Pod
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::XHTML -- format Pod as validating XHTML
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item perldoc_url_prefix
+
+=item perldoc_url_postfix
+
+=item title_prefix, title_postfix
+
+=item html_css
+
+=item html_javascript
+
+=item html_doctype
+
+=item html_header_tags
+
+=item default_title
+
+=item force_title
+
+=item html_header, html_footer
+
+=item index
+
+=back
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=back
+
+=over 4
+
+=item handle_text
+
+=back
+
+=over 4
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Simple::XMLOutStream -- turn Pod into XML
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item ABOUT EXTENDING POD
+
+=item ASK ME!
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::SimpleTree, Pod::Simple::SimpleTree -- parse Pod into a simple
+parse tree
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=item Tree Contents
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Text - Convert POD data to formatted ASCII text
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+alt, code, indent, loose, margin, quotes, sentence, stderr, utf8, width
+
+=item DIAGNOSTICS
+
+Bizarre space in item, Item called without tag, Can't open %s for reading:
+%s, Invalid quote specification "%s"
+
+=item BUGS
+
+=item CAVEATS
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Pod::Text::Color - Convert POD data to formatted color ASCII text
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Pod::Text::Overstrike, =for stopwords
+overstrike
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Pod::Text::Termcap - Convert POD data to ASCII text with format
+escapes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Pod::Usage, pod2usage() - print a usage message from embedded pod
+documentation
+
+=over 4
+
+=item SYNOPSIS
+
+=item ARGUMENTS
+
+C<-message>, C<-msg>, C<-exitval>, C<-verbose>, C<-sections>, C<-output>,
+C<-input>, C<-pathlist>, C<-noperldoc>
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=over 4
+
+=item Recommended Use
+
+=back
+
+=item CAVEATS
+
+=item AUTHOR
+
+=item ACKNOWLEDGMENTS
+
+=item SEE ALSO
+
+=back
+
+=head2 SDBM_File - Tied access to sdbm files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<O_RDONLY>, C<O_WRONLY>, C<O_RDWR>
+
+=item DIAGNOSTICS
+
+=over 4
+
+=item C<sdbm store returned -1, errno 22, key "..." at ...>
+
+=back
+
+=item BUGS AND WARNINGS
+
+=back
+
+=head2 Safe - Compile and execute code in restricted compartments
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+a new namespace, an operator mask
+
+=item WARNING
+
+=over 4
+
+=item RECENT CHANGES
+
+=item Methods in class Safe
+
+permit (OP, ...), permit_only (OP, ...), deny (OP, ...), deny_only (OP,
+...), trap (OP, ...), untrap (OP, ...), share (NAME, ...), share_from
+(PACKAGE, ARRAYREF), varglob (VARNAME), reval (STRING, STRICT), rdo
+(FILENAME), root (NAMESPACE), mask (MASK)
+
+=item Some Safety Issues
+
+Memory, CPU, Snooping, Signals, State Changes
+
+=item AUTHOR
+
+=back
+
+=back
+
+=head2 Scalar::Util - A selection of general-utility scalar subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+blessed EXPR, dualvar NUM, STRING, isvstring EXPR, isweak EXPR,
+looks_like_number EXPR, openhandle FH, refaddr EXPR, reftype EXPR,
+set_prototype CODEREF, PROTOTYPE, tainted EXPR, weaken REF
+
+=item DIAGNOSTICS
+
+Weak references are not implemented in the version of perl, Vstrings are
+not implemented in the version of perl, C<NAME> is only available with the
+XS version of Scalar::Util
+
+=item KNOWN BUGS
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 Search::Dict, look - search for key in dictionary file
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 SelectSaver - save and restore selected file handle
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 SelfLoader - load functions only on demand
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item The __DATA__ token
+
+=item SelfLoader autoloading
+
+=item Autoloading and package lexicals
+
+=item SelfLoader and AutoLoader
+
+=item __DATA__, __END__, and the FOOBAR::DATA filehandle.
+
+=item Classes and inherited methods.
+
+=back
+
+=item Multiple packages and fully qualified subroutine names
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+B<_make_cmd>
+
+=head2 Shell - run shell commands transparently within perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Caveats
+
+=item Escaping Magic Characters
+
+=item Configuration
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load the C
+socket.h defines and structure manipulators
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+inet_aton HOSTNAME, inet_ntoa IP_ADDRESS, INADDR_ANY, INADDR_BROADCAST,
+INADDR_LOOPBACK, INADDR_NONE, sockaddr_family SOCKADDR, sockaddr_in PORT,
+ADDRESS, sockaddr_in SOCKADDR_IN, pack_sockaddr_in PORT, IP_ADDRESS,
+unpack_sockaddr_in SOCKADDR_IN, sockaddr_un PATHNAME, sockaddr_un
+SOCKADDR_UN, pack_sockaddr_un PATH, unpack_sockaddr_un SOCKADDR_UN
+
+=back
+
+=head2 Storable - persistence for Perl data structures
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item MEMORY STORE
+
+=item ADVISORY LOCKING
+
+=item SPEED
+
+=item CANONICAL REPRESENTATION
+
+=item CODE REFERENCES
+
+=item FORWARD COMPATIBILITY
+
+utf8 data, restricted hashes, files from future versions of Storable
+
+=item ERROR REPORTING
+
+=item WIZARDS ONLY
+
+=over 4
+
+=item Hooks
+
+C<STORABLE_freeze> I<obj>, I<cloning>, C<STORABLE_thaw> I<obj>, I<cloning>,
+I<serialized>, .., C<STORABLE_attach> I<class>, I<cloning>, I<serialized>
+
+=item Predicates
+
+C<Storable::last_op_in_netorder>, C<Storable::is_storing>,
+C<Storable::is_retrieving>
+
+=item Recursion
+
+=item Deep Cloning
+
+=back
+
+=item Storable magic
+
+$info = Storable::file_magic( $filename ), C<version>, C<version_nv>,
+C<major>, C<minor>, C<hdrsize>, C<netorder>, C<byteorder>, C<intsize>,
+C<longsize>, C<ptrsize>, C<nvsize>, C<file>, $info = Storable::read_magic(
+$buffer ), $info = Storable::read_magic( $buffer, $must_be_file )
+
+=item EXAMPLES
+
+=item WARNING
+
+=item BUGS
+
+=over 4
+
+=item 64 bit data in perl 5.6.0 and 5.6.1
+
+=back
+
+=item CREDITS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Switch - A switch statement for Perl
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item BACKGROUND
+
+=item DESCRIPTION
+
+=over 4
+
+=item Allowing fall-through
+
+=item Automating fall-through
+
+=item Alternative syntax
+
+=item Higher-order Operations
+
+=back
+
+=item DEPENDENCIES
+
+=item AUTHOR
+
+=item BUGS
+
+=item LIMITATIONS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Symbol - manipulate Perl symbols and their names
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=back
+
+=head2 Sys-Hostname, Sys::Hostname - Try every conceivable way to get
+hostname
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 Sys-Syslog, Sys::Syslog - Perl interface to the UNIX syslog(3) calls
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXPORTS
+
+=item FUNCTIONS
+
+B<openlog($ident, $logopt, $facility)>, B<syslog($priority, $message)>,
+B<syslog($priority, $format, @args)>, B<Note>,
+B<setlogmask($mask_priority)>, B<setlogsock($sock_type)>,
+B<setlogsock($sock_type, $stream_location)> (added in Perl 5.004_02),
+B<setlogsock($sock_type, $stream_location, $sock_timeout)> (added in 0.25),
+B<Note>, B<closelog()>
+
+=item THE RULES OF SYS::SYSLOG
+
+=item EXAMPLES
+
+=item CONSTANTS
+
+=over 4
+
+=item Facilities
+
+=item Levels
+
+=back
+
+=item DIAGNOSTICS
+
+C<Invalid argument passed to setlogsock>, C<eventlog passed to setlogsock,
+but no Win32 API available>, C<no connection to syslog available>, C<stream
+passed to setlogsock, but %s is not writable>, C<stream passed to
+setlogsock, but could not find any device>, C<tcp passed to setlogsock, but
+tcp service unavailable>, C<syslog: expecting argument %s>, C<syslog:
+invalid level/facility: %s>, C<syslog: too many levels given: %s>,
+C<syslog: too many facilities given: %s>, C<syslog: level must be given>,
+C<udp passed to setlogsock, but udp service unavailable>, C<unix passed to
+setlogsock, but path not available>
+
+=item SEE ALSO
+
+=over 4
+
+=item Manual Pages
+
+=item RFCs
+
+=item Articles
+
+=item Event Log
+
+=back
+
+=item AUTHORS & ACKNOWLEDGEMENTS
+
+=item BUGS
+
+=item SUPPORT
+
+AnnoCPAN: Annotated CPAN documentation, CPAN Ratings, RT: CPAN's request
+tracker, Search CPAN, Kobes' CPAN Search, Perl Documentation
+
+=item COPYRIGHT
+
+=item LICENSE
+
+=back
+
+=head2 Sys-Syslog::win32::Win32, Sys::Syslog::Win32 - Win32 support for
+Sys::Syslog
+
+=over 4
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item LICENSE
+
+=back
+
+=head2 Sys::Hostname - Try every conceivable way to get hostname
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 TAP::Base - Base class that provides common functionality to
+L<TAP::Parser>
+and L<TAP::Harness>
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=head2 TAP::Formatter::Base, TAP::Formatter::Console - Harness output
+delegate for default console output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+C<verbosity>, C<verbose>, C<timer>, C<failures>, C<comments>, C<quiet>,
+C<really_quiet>, C<silent>, C<errors>, C<directives>, C<stdout>, C<color>,
+C<jobs>, C<show_count>
+
+=back
+
+=back
+
+=head2 TAP::Formatter::Color - Run Perl test scripts with color
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=head2 TAP::Formatter::Console - Harness output delegate for default
+console output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=over 4
+
+=item C<< open_test >>
+
+=back
+
+=back
+
+=head2 TAP::Formatter::Console::ParallelSession - Harness output delegate
+for parallel console output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=head2 TAP::Formatter::Console::Session - Harness output delegate for
+default console output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item C<< clear_for_close >>
+
+=item C<< close_test >>
+
+=item C<< header >>
+
+=item C<< result >>
+
+=back
+
+=head2 TAP::Formatter::File - Harness output delegate for file output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=over 4
+
+=item C<< open_test >>
+
+=back
+
+=back
+
+=head2 TAP::Formatter::File::Session - Harness output delegate for file
+output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item result
+
+=back
+
+=back
+
+=over 4
+
+=item close_test
+
+=back
+
+=head2 TAP::Formatter::Session - Abstract base class for harness output
+delegate
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+C<formatter>, C<parser>, C<name>, C<show_count>
+
+=back
+
+=back
+
+=head2 TAP::Harness - Run test scripts with statistics
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+C<verbosity>, C<timer>, C<failures>, C<comments>, C<show_count>,
+C<normalize>, C<lib>, C<switches>, C<test_args>, C<color>, C<exec>,
+C<merge>, C<aggregator_class>, C<formatter_class>, C<multiplexer_class>,
+C<parser_class>, C<scheduler_class>, C<formatter>, C<errors>,
+C<directives>, C<ignore_exit>, C<jobs>, C<rules>, C<stdout>
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+the file name of a test script to run, a reference to a [ file name,
+display name ] array
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Methods
+
+C<start>, C<tests>
+
+=back
+
+=back
+
+=over 4
+
+=item REPLACING
+
+=item SEE ALSO
+
+=back
+
+=head2 TAP::Object - Base class that provides common functionality to all
+C<TAP::*> modules
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 TAParser, TAP::Parser - Parse L<TAP|Test::Harness::TAP> output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+C<source>, C<tap>, C<exec>, C<callback>, C<switches>, C<test_args>,
+C<spool>, C<merge>, C<source_class>, C<perl_source_class>,
+C<grammar_class>, C<iterator_factory_class>, C<result_factory_class>
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=over 4
+
+=item INDIVIDUAL RESULTS
+
+=over 4
+
+=item Result types
+
+Version, Plan, Pragma, Test, Comment, Bailout, Unknown
+
+=item Common type methods
+
+=item C<plan> methods
+
+=item C<pragma> methods
+
+=item C<bailout> methods
+
+=item C<unknown> methods
+
+=item C<test> methods
+
+=back
+
+=item TOTAL RESULTS
+
+=over 4
+
+=item Individual Results
+
+=back
+
+=back
+
+=over 4
+
+=item Pragmas
+
+=back
+
+=over 4
+
+=item Summary Results
+
+=back
+
+=over 4
+
+=item C<ignore_exit>
+
+=back
+
+Misplaced plan, No plan, More than one plan, Test numbers out of sequence
+
+=over 4
+
+=item CALLBACKS
+
+C<test>, C<version>, C<plan>, C<comment>, C<bailout>, C<yaml>, C<unknown>,
+C<ELSE>, C<ALL>, C<EOF>
+
+=item TAP GRAMMAR
+
+=item BACKWARDS COMPATABILITY
+
+=over 4
+
+=item Differences
+
+TODO plans, 'Missing' tests
+
+=back
+
+=item SUBCLASSING
+
+=over 4
+
+=item Parser Components
+
+option 1, option 2
+
+=back
+
+=item ACKNOWLEDGEMENTS
+
+Michael Schwern, Andy Lester, chromatic, GEOFFR, Shlomi Fish, Torsten
+Schoenfeld, Jerry Gay, Aristotle, Adam Kennedy, Yves Orton, Adrian Howard,
+Sean & Lil, Andreas J. Koenig, Florian Ragwitz, Corion, Mark Stosberg, Matt
+Kraai, David Wheeler, Alex Vandiver
+
+=item AUTHORS
+
+=item BUGS
+
+=item COPYRIGHT & LICENSE
+
+=back
+
+=head2 TAParser::Aggregator, TAP::Parser::Aggregator - Aggregate
+TAP::Parser results
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=over 4
+
+=item Summary methods
+
+failed, parse_errors, passed, planned, skipped, todo, todo_passed, wait,
+exit
+
+=back
+
+Failed tests, Parse errors, Bad exit or wait status
+
+=over 4
+
+=item See Also
+
+=back
+
+=head2 TAParser::Grammar, TAP::Parser::Grammar - A grammar for the Test
+Anything Protocol.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=over 4
+
+=item TAP GRAMMAR
+
+=item SUBCLASSING
+
+=item SEE ALSO
+
+=back
+
+=head2 TAParser::Iterator, TAP::Parser::Iterator - Internal base class for
+TAP::Parser Iterators
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=item Instance Methods
+
+=back
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Example
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 TAParser::Iterator::Array, TAP::Parser::Iterator::Array - Internal
+TAP::Parser array Iterator
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=item Instance Methods
+
+=back
+
+=back
+
+=over 4
+
+=item ATTRIBUTION
+
+=item SEE ALSO
+
+=back
+
+=head2 TAParser::Iterator::Process, TAP::Parser::Iterator::Process -
+Internal TAP::Parser Iterator
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=item Instance Methods
+
+=back
+
+=back
+
+=over 4
+
+=item ATTRIBUTION
+
+=item SEE ALSO
+
+=back
+
+=head2 TAParser::Iterator::Stream, TAP::Parser::Iterator::Stream - Internal
+TAP::Parser Iterator
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=over 4
+
+=item ATTRIBUTION
+
+=item SEE ALSO
+
+=back
+
+=head2 TAParser::IteratorFactory, TAP::Parser::IteratorFactory - Internal
+TAP::Parser Iterator
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Example
+
+=back
+
+=item ATTRIBUTION
+
+=item SEE ALSO
+
+=back
+
+=head2 TAParser::Multiplexer, TAP::Parser::Multiplexer - Multiplex multiple
+TAP::Parsers
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=over 4
+
+=item See Also
+
+=back
+
+=head2 TAParser::Result, TAP::Parser::Result - Base class for TAP::Parser
+output objects
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=over 4
+
+=item DESCRIPTION
+
+=item METHODS
+
+=back
+
+=back
+
+=over 4
+
+=item Boolean methods
+
+C<is_plan>, C<is_pragma>, C<is_test>, C<is_comment>, C<is_bailout>,
+C<is_version>, C<is_unknown>, C<is_yaml>
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Example
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 TAParser::Result::Bailout, TAP::Parser::Result::Bailout - Bailout
+result token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 TAParser::Result::Comment, TAP::Parser::Result::Comment - Comment
+result token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 TAParser::Result::Plan, TAP::Parser::Result::Plan - Plan result
+token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>, C<raw>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 TAParser::Result::Pragma, TAP::Parser::Result::Pragma - TAP pragma
+token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>, C<raw>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 TAParser::Result::Test, TAP::Parser::Result::Test - Test result
+token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=back
+
+=head2 TAParser::Result::Unknown, TAP::Parser::Result::Unknown - Unknown
+result token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>, C<raw>
+
+=back
+
+=head2 TAParser::Result::Version, TAP::Parser::Result::Version - TAP syntax
+version token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>, C<raw>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 TAParser::Result::YAML, TAP::Parser::Result::YAML - YAML result
+token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>, C<raw>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 TAParser::ResultFactory, TAP::Parser::ResultFactory - Factory for
+creating TAP::Parser output objects
+
+=over 4
+
+=item SYNOPSIS
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item METHODS
+
+=item Class Methods
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Example
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 TAParser::Scheduler, TAP::Parser::Scheduler - Schedule tests during
+parallel testing
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=head2 TAParser::Scheduler::Job, TAP::Parser::Scheduler::Job - A single
+testing job.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=head2 TAParser::Scheduler::Spinner, TAP::Parser::Scheduler::Spinner - A
+no-op job.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=head2 TAParser::Source, TAP::Parser::Source - Stream output from some
+source
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Example
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 TAParser::Source::Perl, TAP::Parser::Source::Perl - Stream Perl
+output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=item Instance Methods
+
+=back
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Example
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 TAParser::Utils, TAP::Parser::Utils - Internal TAP::Parser utilities
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item INTERFACE
+
+=back
+
+=back
+
+=head2 TAParser::YAMLish::Reader, TAP::Parser::YAMLish::Reader - Read
+YAMLish data from iterator
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=item Instance Methods
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 TAParser::YAMLish::Writer, TAP::Parser::YAMLish::Writer - Write
+YAMLish data
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=item Instance Methods
+
+a reference to a scalar to append YAML to, the handle of an open file, a
+reference to an array into which YAML will be pushed, a code reference
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 Term::ANSIColor - Color screen output using ANSI escape sequences
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item DIAGNOSTICS
+
+Bad escape sequence %s, Bareword "%s" not allowed while "strict subs" in
+use, Invalid attribute name %s, Name "%s" used only once: possible typo, No
+comma allowed after filehandle, No name for escape sequence %s
+
+=item ENVIRONMENT
+
+ANSI_COLORS_DISABLED
+
+=item RESTRICTIONS
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Term::Cap - Perl termcap interface
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item METHODS
+
+=back
+
+=back
+
+B<Tgetent>, OSPEED, TERM
+
+B<Tpad>, B<$string>, B<$cnt>, B<$FH>
+
+B<Tputs>, B<$cap>, B<$cnt>, B<$FH>
+
+B<Tgoto>, B<$cap>, B<$col>, B<$row>, B<$FH>
+
+B<Trequire>
+
+=over 4
+
+=item EXAMPLES
+
+=item COPYRIGHT AND LICENSE
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Term::Complete - Perl word completion module
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+E<lt>tabE<gt>, ^D, ^U, E<lt>delE<gt>, E<lt>bsE<gt>
+
+=item DIAGNOSTICS
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 Term::ReadLine - Perl interface to various C<readline> packages.
+If no real package is found, substitutes stubs instead of basic functions.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Minimal set of supported functions
+
+C<ReadLine>, C<new>, C<readline>, C<addhistory>, C<IN>, C<OUT>, C<MinLine>,
+C<findConsole>, Attribs, C<Features>
+
+=item Additional supported functions
+
+C<tkRunning>, C<ornaments>, C<newTTY>
+
+=item EXPORTS
+
+=item ENVIRONMENT
+
+=item CAVEATS
+
+=back
+
+=head2 Term::UI - Term::ReadLine UI made easy
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item HOW IT WORKS
+
+=item METHODS
+
+=over 4
+
+=item $reply = $term->get_reply( prompt => 'question?', [choices => \@list,
+default => $list[0], multi => BOOL, print_me => "extra text to print &
+record", allow => $ref] );
+
+=back
+
+=back
+
+=over 4
+
+=item $bool = $term->ask_yn( prompt => "your question", [default =>
+(y|1,n|0), print_me => "extra text to print & record"] )
+
+=back
+
+=over 4
+
+=item ($opts, $munged) = $term->parse_options( STRING );
+
+=back
+
+=over 4
+
+=item $str = $term->history_as_string
+
+=back
+
+=over 4
+
+=item GLOBAL VARIABLES
+
+=over 4
+
+=item $Term::UI::VERBOSE
+
+=item $Term::UI::AUTOREPLY
+
+=item $Term::UI::INVALID
+
+=item $Term::UI::History::HISTORY_FH
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item Basic get_reply sample
+
+=item get_reply with choices
+
+=item get_reply with choices and default
+
+=item get_reply using print_me & multi
+
+=item get_reply & allow
+
+=item an elaborate ask_yn sample
+
+=back
+
+=item See Also
+
+=item BUG REPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Term::UI::History
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=over 4
+
+=item history("message string" [,VERBOSE])
+
+=back
+
+=back
+
+=over 4
+
+=item GLOBAL VARIABLES
+
+$HISTORY_FH
+
+=item See Also
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Test - provides a simple framework for writing test scripts
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item QUICK START GUIDE
+
+=over 4
+
+=item Functions
+
+C<plan(...)>, C<tests =E<gt> I<number>>, C<todo =E<gt> [I<1,5,14>]>,
+C<onfail =E<gt> sub { ... }>, C<onfail =E<gt> \&some_sub>
+
+=back
+
+=back
+
+B<_to_value>
+
+C<ok(...)>
+
+C<skip(I<skip_if_true>, I<args...>)>
+
+=over 4
+
+=item TEST TYPES
+
+NORMAL TESTS, SKIPPED TESTS, TODO TESTS
+
+=item ONFAIL
+
+=item BUGS and CAVEATS
+
+=item ENVIRONMENT
+
+=item NOTE
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Test-Harness::lib::App::Prove, App::Prove - Implements the C<prove>
+command.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Attributes
+
+C<archive>, C<argv>, C<backwards>, C<blib>, C<color>, C<directives>,
+C<dry>, C<exec>, C<extension>, C<failures>, C<comments>, C<formatter>,
+C<harness>, C<ignore_exit>, C<includes>, C<jobs>, C<lib>, C<merge>,
+C<modules>, C<parse>, C<plugins>, C<quiet>, C<really_quiet>, C<recurse>,
+C<rules>, C<show_count>, C<show_help>, C<show_man>, C<show_version>,
+C<shuffle>, C<state>, C<state_class>, C<taint_fail>, C<taint_warn>,
+C<test_args>, C<timer>, C<verbose>, C<warnings_fail>, C<warnings_warn>
+
+=back
+
+=over 4
+
+=item PLUGINS
+
+=over 4
+
+=item Sample Plugin
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Test-Harness::lib::App::Prove::State, App::Prove::State - State
+storage for the C<prove> command.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+C<store>, C<extension> (optional), C<result_class> (optional)
+
+=back
+
+=back
+
+=over 4
+
+=item C<result_class>
+
+=back
+
+=over 4
+
+=item C<extension>
+
+=back
+
+=over 4
+
+=item C<results>
+
+=back
+
+=over 4
+
+=item C<commit>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+C<last>, C<failed>, C<passed>, C<all>, C<hot>, C<todo>, C<slow>, C<fast>,
+C<new>, C<old>, C<save>
+
+=back
+
+=head2 Test-Harness::lib::App::Prove::State::Result,
+App::Prove::State::Result - Individual test suite results.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item C<state_version>
+
+=back
+
+=over 4
+
+=item C<test_class>
+
+=back
+
+=head2 Test-Harness::lib::App::Prove::State::Result::Test,
+App::Prove::State::Result::Test - Individual test results.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 Test-Harness::lib::TAP::Base, TAP::Base - Base class that provides
+common functionality to L<TAP::Parser>
+and L<TAP::Harness>
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=head2 Test-Harness::lib::TAP::Formatter::Base, TAP::Formatter::Console -
+Harness output delegate for default console output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+C<verbosity>, C<verbose>, C<timer>, C<failures>, C<comments>, C<quiet>,
+C<really_quiet>, C<silent>, C<errors>, C<directives>, C<stdout>, C<color>,
+C<jobs>, C<show_count>
+
+=back
+
+=back
+
+=head2 Test-Harness::lib::TAP::Formatter::Color, TAP::Formatter::Color -
+Run Perl test scripts with color
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=head2 Test-Harness::lib::TAP::Formatter::Console, TAP::Formatter::Console
+- Harness output delegate for default console output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=over 4
+
+=item C<< open_test >>
+
+=back
+
+=back
+
+=head2 Test-Harness::lib::TAP::Formatter::Console::ParallelSession,
+TAP::Formatter::Console::ParallelSession - Harness output delegate for
+parallel console output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=head2 Test-Harness::lib::TAP::Formatter::Console::Session,
+TAP::Formatter::Console::Session - Harness output delegate for default
+console output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item C<< clear_for_close >>
+
+=item C<< close_test >>
+
+=item C<< header >>
+
+=item C<< result >>
+
+=back
+
+=head2 Test-Harness::lib::TAP::Formatter::File, TAP::Formatter::File -
+Harness output delegate for file output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=over 4
+
+=item C<< open_test >>
+
+=back
+
+=back
+
+=head2 Test-Harness::lib::TAP::Formatter::File::Session,
+TAP::Formatter::File::Session - Harness output delegate for file output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item result
+
+=back
+
+=back
+
+=over 4
+
+=item close_test
+
+=back
+
+=head2 Test-Harness::lib::TAP::Formatter::Session, TAP::Formatter::Session
+- Abstract base class for harness output delegate
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+C<formatter>, C<parser>, C<name>, C<show_count>
+
+=back
+
+=back
+
+=head2 Test-Harness::lib::TAP::Harness, TAP::Harness - Run test scripts
+with statistics
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+C<verbosity>, C<timer>, C<failures>, C<comments>, C<show_count>,
+C<normalize>, C<lib>, C<switches>, C<test_args>, C<color>, C<exec>,
+C<merge>, C<aggregator_class>, C<formatter_class>, C<multiplexer_class>,
+C<parser_class>, C<scheduler_class>, C<formatter>, C<errors>,
+C<directives>, C<ignore_exit>, C<jobs>, C<rules>, C<stdout>
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+the file name of a test script to run, a reference to a [ file name,
+display name ] array
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Methods
+
+C<start>, C<tests>
+
+=back
+
+=back
+
+=over 4
+
+=item REPLACING
+
+=item SEE ALSO
+
+=back
+
+=head2 Test-Harness::lib::TAP::Object, TAP::Object - Base class that
+provides common functionality to all C<TAP::*> modules
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 Test-Harness::lib::TAParser, TAP::Parser - Parse
+L<TAP|Test::Harness::TAP> output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+C<source>, C<tap>, C<exec>, C<callback>, C<switches>, C<test_args>,
+C<spool>, C<merge>, C<source_class>, C<perl_source_class>,
+C<grammar_class>, C<iterator_factory_class>, C<result_factory_class>
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=over 4
+
+=item INDIVIDUAL RESULTS
+
+=over 4
+
+=item Result types
+
+Version, Plan, Pragma, Test, Comment, Bailout, Unknown
+
+=item Common type methods
+
+=item C<plan> methods
+
+=item C<pragma> methods
+
+=item C<bailout> methods
+
+=item C<unknown> methods
+
+=item C<test> methods
+
+=back
+
+=item TOTAL RESULTS
+
+=over 4
+
+=item Individual Results
+
+=back
+
+=back
+
+=over 4
+
+=item Pragmas
+
+=back
+
+=over 4
+
+=item Summary Results
+
+=back
+
+=over 4
+
+=item C<ignore_exit>
+
+=back
+
+Misplaced plan, No plan, More than one plan, Test numbers out of sequence
+
+=over 4
+
+=item CALLBACKS
+
+C<test>, C<version>, C<plan>, C<comment>, C<bailout>, C<yaml>, C<unknown>,
+C<ELSE>, C<ALL>, C<EOF>
+
+=item TAP GRAMMAR
+
+=item BACKWARDS COMPATABILITY
+
+=over 4
+
+=item Differences
+
+TODO plans, 'Missing' tests
+
+=back
+
+=item SUBCLASSING
+
+=over 4
+
+=item Parser Components
+
+option 1, option 2
+
+=back
+
+=item ACKNOWLEDGEMENTS
+
+Michael Schwern, Andy Lester, chromatic, GEOFFR, Shlomi Fish, Torsten
+Schoenfeld, Jerry Gay, Aristotle, Adam Kennedy, Yves Orton, Adrian Howard,
+Sean & Lil, Andreas J. Koenig, Florian Ragwitz, Corion, Mark Stosberg, Matt
+Kraai, David Wheeler, Alex Vandiver
+
+=item AUTHORS
+
+=item BUGS
+
+=item COPYRIGHT & LICENSE
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Aggregator, TAP::Parser::Aggregator -
+Aggregate TAP::Parser results
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=over 4
+
+=item Summary methods
+
+failed, parse_errors, passed, planned, skipped, todo, todo_passed, wait,
+exit
+
+=back
+
+Failed tests, Parse errors, Bad exit or wait status
+
+=over 4
+
+=item See Also
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Grammar, TAP::Parser::Grammar - A
+grammar for the Test Anything Protocol.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=over 4
+
+=item TAP GRAMMAR
+
+=item SUBCLASSING
+
+=item SEE ALSO
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Iterator, TAP::Parser::Iterator -
+Internal base class for TAP::Parser Iterators
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=item Instance Methods
+
+=back
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Example
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Iterator::Array,
+TAP::Parser::Iterator::Array - Internal TAP::Parser array Iterator
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=item Instance Methods
+
+=back
+
+=back
+
+=over 4
+
+=item ATTRIBUTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Iterator::Process,
+TAP::Parser::Iterator::Process - Internal TAP::Parser Iterator
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=item Instance Methods
+
+=back
+
+=back
+
+=over 4
+
+=item ATTRIBUTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Iterator::Stream,
+TAP::Parser::Iterator::Stream - Internal TAP::Parser Iterator
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=over 4
+
+=item ATTRIBUTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Test-Harness::lib::TAParser::IteratorFactory,
+TAP::Parser::IteratorFactory - Internal TAP::Parser Iterator
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Example
+
+=back
+
+=item ATTRIBUTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Multiplexer, TAP::Parser::Multiplexer -
+Multiplex multiple TAP::Parsers
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=over 4
+
+=item See Also
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Result, TAP::Parser::Result - Base
+class for TAP::Parser output objects
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=over 4
+
+=item DESCRIPTION
+
+=item METHODS
+
+=back
+
+=back
+
+=over 4
+
+=item Boolean methods
+
+C<is_plan>, C<is_pragma>, C<is_test>, C<is_comment>, C<is_bailout>,
+C<is_version>, C<is_unknown>, C<is_yaml>
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Example
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Result::Bailout,
+TAP::Parser::Result::Bailout - Bailout result token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Result::Comment,
+TAP::Parser::Result::Comment - Comment result token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Result::Plan, TAP::Parser::Result::Plan
+- Plan result token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>, C<raw>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Result::Pragma,
+TAP::Parser::Result::Pragma - TAP pragma token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>, C<raw>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Result::Test, TAP::Parser::Result::Test
+- Test result token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Result::Unknown,
+TAP::Parser::Result::Unknown - Unknown result token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>, C<raw>
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Result::Version,
+TAP::Parser::Result::Version - TAP syntax version token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>, C<raw>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Result::YAML, TAP::Parser::Result::YAML
+- YAML result token.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item OVERRIDDEN METHODS
+
+C<as_string>, C<raw>
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=head2 Test-Harness::lib::TAParser::ResultFactory,
+TAP::Parser::ResultFactory - Factory for creating TAP::Parser output
+objects
+
+=over 4
+
+=item SYNOPSIS
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item METHODS
+
+=item Class Methods
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Example
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Scheduler, TAP::Parser::Scheduler -
+Schedule tests during parallel testing
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Scheduler::Job,
+TAP::Parser::Scheduler::Job - A single testing job.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Scheduler::Spinner,
+TAP::Parser::Scheduler::Spinner - A no-op job.
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Source, TAP::Parser::Source - Stream
+output from some source
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=back
+
+=back
+
+=over 4
+
+=item Instance Methods
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Example
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Source::Perl, TAP::Parser::Source::Perl
+- Stream Perl output
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=item Instance Methods
+
+=back
+
+=back
+
+=over 4
+
+=item SUBCLASSING
+
+=over 4
+
+=item Example
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Test-Harness::lib::TAParser::Utils, TAP::Parser::Utils - Internal
+TAP::Parser utilities
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item INTERFACE
+
+=back
+
+=back
+
+=head2 Test-Harness::lib::TAParser::YAMLish::Reader,
+TAP::Parser::YAMLish::Reader - Read YAMLish data from iterator
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=item Instance Methods
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 Test-Harness::lib::TAParser::YAMLish::Writer,
+TAP::Parser::YAMLish::Writer - Write YAMLish data
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Class Methods
+
+=item Instance Methods
+
+a reference to a scalar to append YAML to, the handle of an open file, a
+reference to an array into which YAML will be pushed, a code reference
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 Test-Harness::lib::Test::Harness, Test::Harness - Run Perl standard
+test scripts with statistics
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=over 4
+
+=item runtests( @test_files )
+
+=back
+
+=back
+
+=over 4
+
+=item execute_tests( tests => \@test_files, out => \*FH )
+
+=back
+
+=over 4
+
+=item EXPORT
+
+=item ENVIRONMENT VARIABLES THAT TAP::HARNESS::COMPATIBLE SETS
+
+C<HARNESS_ACTIVE>, C<HARNESS_VERSION>
+
+=item ENVIRONMENT VARIABLES THAT AFFECT TEST::HARNESS
+
+C<HARNESS_TIMER>, C<HARNESS_VERBOSE>, C<HARNESS_OPTIONS>, C<< j<n> >>, C<<
+f >>
+
+=item Taint Mode
+
+=item SEE ALSO
+
+=item BUGS
+
+=item AUTHORS
+
+=item LICENCE AND COPYRIGHT
+
+=back
+
+=head2 Test::Builder - Backend for building test libraries
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Construction
+
+B<new>
+
+=back
+
+=back
+
+B<create>
+
+B<reset>
+
+=over 4
+
+=item Setting up tests
+
+B<plan>
+
+=back
+
+B<expected_tests>
+
+B<no_plan>
+
+B<_output_plan>
+
+B<done_testing>
+
+B<has_plan>
+
+B<skip_all>
+
+B<exported_to>
+
+=over 4
+
+=item Running tests
+
+B<ok>
+
+=back
+
+B<is_eq>, B<is_num>
+
+B<isnt_eq>, B<isnt_num>
+
+B<like>, B<unlike>
+
+B<cmp_ok>
+
+=over 4
+
+=item Other Testing Methods
+
+B<BAIL_OUT>
+
+=back
+
+B<skip>
+
+B<todo_skip>
+
+B<skip_rest>
+
+=over 4
+
+=item Test building utility methods
+
+B<maybe_regex>
+
+=back
+
+B<_try>
+
+B<is_fh>
+
+=over 4
+
+=item Test style
+
+B<level>
+
+=back
+
+B<use_numbers>
+
+B<no_diag>, B<no_ending>, B<no_header>
+
+=over 4
+
+=item Output
+
+B<diag>
+
+=back
+
+B<note>
+
+B<explain>
+
+B<_print>
+
+B<output>, B<failure_output>, B<todo_output>
+
+reset_outputs
+
+carp, croak
+
+=over 4
+
+=item Test Status and Info
+
+B<current_test>
+
+=back
+
+B<summary>
+
+B<details>
+
+B<todo>
+
+B<find_TODO>
+
+B<in_todo>
+
+B<todo_start>
+
+C<todo_end>
+
+B<caller>
+
+B<_sanity_check>
+
+B<_whoa>
+
+B<_my_exit>
+
+=over 4
+
+=item EXIT CODES
+
+=item THREADS
+
+=item MEMORY
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Test::Builder::Module - Base class for test modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Importing
+
+=back
+
+=back
+
+=over 4
+
+=item Builder
+
+=back
+
+=head2 Test::Builder::Tester - test testsuites that have been built with
+Test::Builder
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item Functions
+
+test_out, test_err
+
+=back
+
+test_fail
+
+test_diag
+
+test_test, title (synonym 'name', 'label'), skip_out, skip_err
+
+line_num
+
+color
+
+=over 4
+
+=item BUGS
+
+=item AUTHOR
+
+=item NOTES
+
+=item SEE ALSO
+
+=back
+
+=head2 Test::Builder::Tester::Color - turn on colour in
+Test::Builder::Tester
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Test::Harness - Run Perl standard test scripts with statistics
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=over 4
+
+=item runtests( @test_files )
+
+=back
+
+=back
+
+=over 4
+
+=item execute_tests( tests => \@test_files, out => \*FH )
+
+=back
+
+=over 4
+
+=item EXPORT
+
+=item ENVIRONMENT VARIABLES THAT TAP::HARNESS::COMPATIBLE SETS
+
+C<HARNESS_ACTIVE>, C<HARNESS_VERSION>
+
+=item ENVIRONMENT VARIABLES THAT AFFECT TEST::HARNESS
+
+C<HARNESS_TIMER>, C<HARNESS_VERBOSE>, C<HARNESS_OPTIONS>, C<< j<n> >>, C<<
+f >>
+
+=item Taint Mode
+
+=item SEE ALSO
+
+=item BUGS
+
+=item AUTHORS
+
+=item LICENCE AND COPYRIGHT
+
+=back
+
+=head2 Test::More - yet another framework for writing test scripts
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item I love it when a plan comes together
+
+=back
+
+=back
+
+B<done_testing>
+
+=over 4
+
+=item Test names
+
+=item I'm ok, you're not ok.
+
+B<ok>
+
+=back
+
+B<is>, B<isnt>
+
+B<like>
+
+B<unlike>
+
+B<cmp_ok>
+
+B<can_ok>
+
+B<isa_ok>
+
+B<new_ok>
+
+B<pass>, B<fail>
+
+=over 4
+
+=item Module tests
+
+B<use_ok>
+
+=back
+
+B<require_ok>
+
+=over 4
+
+=item Complex data structures
+
+B<is_deeply>
+
+=back
+
+=over 4
+
+=item Diagnostics
+
+B<diag>, B<note>
+
+=back
+
+B<explain>
+
+=over 4
+
+=item Conditional tests
+
+B<SKIP: BLOCK>
+
+=back
+
+B<TODO: BLOCK>, B<todo_skip>
+
+When do I use SKIP vs. TODO?
+
+=over 4
+
+=item Test control
+
+B<BAIL_OUT>
+
+=back
+
+=over 4
+
+=item Discouraged comparison functions
+
+B<eq_array>
+
+=back
+
+B<eq_hash>
+
+B<eq_set>
+
+=over 4
+
+=item Extending and Embedding Test::More
+
+B<builder>
+
+=back
+
+=over 4
+
+=item EXIT CODES
+
+=item CAVEATS and NOTES
+
+Backwards compatibility, utf8 / "Wide character in print", Overloaded
+objects, Threads, Test::Harness upgrade
+
+=item HISTORY
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item BUGS
+
+=item SOURCE
+
+=item COPYRIGHT
+
+=back
+
+=head2 Test::Simple - Basic utilities for writing tests.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<ok>
+
+=back
+
+=over 4
+
+=item EXAMPLE
+
+=item CAVEATS
+
+=item NOTES
+
+=item HISTORY
+
+=item SEE ALSO
+
+L<Test::More>
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Test::Tutorial - A tutorial about writing really basic tests
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Nuts and bolts of testing.
+
+=item Where to start?
+
+=item Names
+
+=item Test the manual
+
+=item Sometimes the tests are wrong
+
+=item Testing lots of values
+
+=item Informative names
+
+=item Skipping tests
+
+=item Todo tests
+
+=item Testing with taint mode.
+
+=back
+
+=item FOOTNOTES
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Text-Soundex, Text::Soundex - Implementation of the soundex
+algorithm.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item LIMITATIONS
+
+=item MAINTAINER
+
+=item HISTORY
+
+=back
+
+=head2 Text::Abbrev, abbrev - create an abbreviation table from a list
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLE
+
+=back
+
+=head2 Text::Balanced - Extract delimited text sequences from strings.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item General behaviour in list contexts
+
+[0], [1], [2]
+
+=item General behaviour in scalar and void contexts
+
+=item A note about prefixes
+
+=item C<extract_delimited>
+
+=item C<extract_bracketed>
+
+=item C<extract_variable>
+
+[0], [1], [2]
+
+=item C<extract_tagged>
+
+C<reject =E<gt> $listref>, C<ignore =E<gt> $listref>, C<fail =E<gt> $str>,
+[0], [1], [2], [3], [4], [5]
+
+=item C<gen_extract_tagged>
+
+=item C<extract_quotelike>
+
+[0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10]
+
+=item C<extract_quotelike> and "here documents"
+
+[0], [1], [2], [3], [4], [5], [6], [7..10]
+
+=item C<extract_codeblock>
+
+=item C<extract_multiple>
+
+=item C<gen_delimited_pat>
+
+=item C<delimited_pat>
+
+=back
+
+=item DIAGNOSTICS
+
+ C<Did not find a suitable bracket: "%s">, C<Did not find prefix: /%s/>,
+C<Did not find opening bracket after prefix: "%s">, C<No quotelike
+operator found after prefix: "%s">, C<Unmatched closing bracket: "%c">,
+C<Unmatched opening bracket(s): "%s">, C<Unmatched embedded quote (%s)>,
+C<Did not find closing delimiter to match '%s'>, C<Mismatched closing
+bracket: expected "%c" but found "%s">, C<No block delimiter found after
+quotelike "%s">, C<Did not find leading dereferencer>, C<Bad identifier
+after dereferencer>, C<Did not find expected opening bracket at %s>,
+C<Improperly nested codeblock at %s>, C<Missing second block for quotelike
+"%s">, C<No match found for opening bracket>, C<Did not find opening tag:
+/%s/>, C<Unable to construct closing tag to match: /%s/>, C<Found invalid
+nested tag: %s>, C<Found unbalanced nested tag: %s>, C<Did not find closing
+tag>
+
+=item AUTHOR
+
+=item BUGS AND IRRITATIONS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Text::ParseWords - parse text into an array of tokens or array of
+arrays
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item AUTHORS
+
+=back
+
+=head2 Text::Soundex - Implementation of the soundex algorithm.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item LIMITATIONS
+
+=item MAINTAINER
+
+=item HISTORY
+
+=back
+
+=head2 Text::Tabs -- expand and unexpand tabs per the unix expand(1) and
+unexpand(1)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLE
+
+=item LICENSE
+
+=back
+
+=head2 Text::Wrap - line wrapping to form simple paragraphs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OVERRIDES
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=item LICENSE
+
+=back
+
+=head2 Thread - Manipulate threads in Perl (for old code only)
+
+=over 4
+
+=item DEPRECATED
+
+=item HISTORY
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+$thread = Thread->new(\&start_sub), $thread = Thread->new(\&start_sub,
+LIST), lock VARIABLE, async BLOCK;, Thread->self, Thread->list, cond_wait
+VARIABLE, cond_signal VARIABLE, cond_broadcast VARIABLE, yield
+
+=item METHODS
+
+join, detach, equal, tid, done
+
+=item DEFUNCT
+
+lock(\&sub), eval, flags
+
+=item SEE ALSO
+
+=back
+
+=head2 Thread::Queue - Thread-safe queues
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+Ordinary scalars, Array refs, Hash refs, Scalar refs, Objects based on the
+above
+
+=item QUEUE CREATION
+
+->new(), ->new(LIST)
+
+=item BASIC METHODS
+
+->enqueue(LIST), ->dequeue(), ->dequeue(COUNT), ->dequeue_nb(),
+->dequeue_nb(COUNT), ->pending()
+
+=item ADVANCED METHODS
+
+->peek(), ->peek(INDEX), ->insert(INDEX, LIST), ->extract(),
+->extract(INDEX), ->extract(INDEX, COUNT)
+
+=item NOTES
+
+=item LIMITATIONS
+
+=item SEE ALSO
+
+=item MAINTAINER
+
+=item LICENSE
+
+=back
+
+=head2 Thread::Semaphore - Thread-safe semaphores
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+->new(), ->new(NUMBER), ->down(), ->down(NUMBER), ->up(), ->up(NUMBER)
+
+=item NOTES
+
+=item SEE ALSO
+
+=item MAINTAINER
+
+=item LICENSE
+
+=back
+
+=head2 Tie::Array - base class for tied arrays
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+TIEARRAY classname, LIST, STORE this, index, value, FETCH this, index,
+FETCHSIZE this, STORESIZE this, count, EXTEND this, count, EXISTS this,
+key, DELETE this, key, CLEAR this, DESTROY this, PUSH this, LIST, POP this,
+SHIFT this, UNSHIFT this, LIST, SPLICE this, offset, length, LIST
+
+=item CAVEATS
+
+=item AUTHOR
+
+=back
+
+=head2 Tie::File - Access the lines of a disk file via a Perl array
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item C<recsep>
+
+=item C<autochomp>
+
+=item C<mode>
+
+=item C<memory>
+
+=item C<dw_size>
+
+=item Option Format
+
+=back
+
+=item Public Methods
+
+=over 4
+
+=item C<flock>
+
+=item C<autochomp>
+
+=item C<defer>, C<flush>, C<discard>, and C<autodefer>
+
+=item C<offset>
+
+=back
+
+=item Tying to an already-opened filehandle
+
+=item Deferred Writing
+
+=over 4
+
+=item Autodeferring
+
+=back
+
+=item CONCURRENT ACCESS TO FILES
+
+=item CAVEATS
+
+=item SUBCLASSING
+
+=item WHAT ABOUT C<DB_File>?
+
+=item AUTHOR
+
+=item LICENSE
+
+=item WARRANTY
+
+=item THANKS
+
+=item TODO
+
+=back
+
+=head2 Tie::Handle - base class definitions for tied handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+TIEHANDLE classname, LIST, WRITE this, scalar, length, offset, PRINT this,
+LIST, PRINTF this, format, LIST, READ this, scalar, length, offset,
+READLINE this, GETC this, CLOSE this, OPEN this, filename, BINMODE this,
+EOF this, TELL this, SEEK this, offset, whence, DESTROY this
+
+=item MORE INFORMATION
+
+=item COMPATIBILITY
+
+=back
+
+=head2 Tie::Hash, Tie::StdHash, Tie::ExtraHash - base class definitions for
+tied hashes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+TIEHASH classname, LIST, STORE this, key, value, FETCH this, key, FIRSTKEY
+this, NEXTKEY this, lastkey, EXISTS this, key, DELETE this, key, CLEAR
+this, SCALAR this
+
+=item Inheriting from B<Tie::StdHash>
+
+=item Inheriting from B<Tie::ExtraHash>
+
+=item C<SCALAR>, C<UNTIE> and C<DESTROY>
+
+=item MORE INFORMATION
+
+=back
+
+=head2 Tie::Hash::NamedCapture - Named regexp capture buffers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Tie::Memoize - add data to hash when needed
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Inheriting from B<Tie::Memoize>
+
+=item EXAMPLE
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 Tie::RefHash - use references as hash keys
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLE
+
+=item THREAD SUPPORT
+
+=item STORABLE SUPPORT
+
+=item RELIC SUPPORT
+
+=item MAINTAINER
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Tie::Scalar, Tie::StdScalar - base class definitions for tied
+scalars
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+TIESCALAR classname, LIST, FETCH this, STORE this, value, DESTROY this
+
+=item MORE INFORMATION
+
+=back
+
+=head2 Tie::StdHandle - base class definitions for tied handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 Tie::SubstrHash - Fixed-table-size, fixed-key-length hashing
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEATS
+
+=back
+
+=head2 Time-HiRes, Time::HiRes - High resolution alarm, sleep,
+gettimeofday, interval timers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+gettimeofday (), usleep ( $useconds ), nanosleep ( $nanoseconds ), ualarm (
+$useconds [, $interval_useconds ] ), tv_interval, time (), sleep (
+$floating_seconds ), alarm ( $floating_seconds [,
+$interval_floating_seconds ] ), setitimer ( $which, $floating_seconds [,
+$interval_floating_seconds ] ), getitimer ( $which ), clock_gettime (
+$which ), clock_getres ( $which ), clock_nanosleep ( $which, $nanoseconds,
+$flags = 0), clock(), stat, stat FH, stat EXPR
+
+=item EXAMPLES
+
+=item C API
+
+=item DIAGNOSTICS
+
+=over 4
+
+=item useconds or interval more than ...
+
+=item negative time not invented yet
+
+=item internal error: useconds < 0 (unsigned ... signed ...)
+
+=item useconds or uinterval equal to or more than 1000000
+
+=item unimplemented in this platform
+
+=back
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Time-Piece, Time::Piece - Object Oriented time objects
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USAGE
+
+=over 4
+
+=item Local Locales
+
+=item Date Calculations
+
+=item Date Comparisons
+
+=item Date Parsing
+
+=item YYYY-MM-DDThh:mm:ss
+
+=item Week Number
+
+=item Global Overriding
+
+=back
+
+=item CAVEATS
+
+=over 4
+
+=item Setting $ENV{TZ} in Threads on Win32
+
+=back
+
+=item AUTHOR
+
+=item License
+
+=item SEE ALSO
+
+=item BUGS
+
+=back
+
+=head2 Time-Piece::Seconds, Time::Seconds - a simple API to convert seconds
+to other date values
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=item AUTHOR
+
+=item LICENSE
+
+=item Bugs
+
+=back
+
+=head2 Time::HiRes - High resolution alarm, sleep, gettimeofday, interval
+timers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+gettimeofday (), usleep ( $useconds ), nanosleep ( $nanoseconds ), ualarm (
+$useconds [, $interval_useconds ] ), tv_interval, time (), sleep (
+$floating_seconds ), alarm ( $floating_seconds [,
+$interval_floating_seconds ] ), setitimer ( $which, $floating_seconds [,
+$interval_floating_seconds ] ), getitimer ( $which ), clock_gettime (
+$which ), clock_getres ( $which ), clock_nanosleep ( $which, $nanoseconds,
+$flags = 0), clock(), stat, stat FH, stat EXPR
+
+=item EXAMPLES
+
+=item C API
+
+=item DIAGNOSTICS
+
+=over 4
+
+=item useconds or interval more than ...
+
+=item negative time not invented yet
+
+=item internal error: useconds < 0 (unsigned ... signed ...)
+
+=item useconds or uinterval equal to or more than 1000000
+
+=item unimplemented in this platform
+
+=back
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Time::Local - efficiently compute time from local and GMT time
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=over 4
+
+=item C<timelocal()> and C<timegm()>
+
+=item C<timelocal_nocheck()> and C<timegm_nocheck()>
+
+=item Year Value Interpretation
+
+=item Limits of time_t
+
+=item Ambiguous Local Times (DST)
+
+=item Non-Existent Local Times (DST)
+
+=item Negative Epoch Values
+
+=back
+
+=item IMPLEMENTATION
+
+=item BUGS
+
+=item SUPPORT
+
+=item COPYRIGHT
+
+=item AUTHOR
+
+=back
+
+=head2 Time::Piece - Object Oriented time objects
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USAGE
+
+=over 4
+
+=item Local Locales
+
+=item Date Calculations
+
+=item Date Comparisons
+
+=item Date Parsing
+
+=item YYYY-MM-DDThh:mm:ss
+
+=item Week Number
+
+=item Global Overriding
+
+=back
+
+=item CAVEATS
+
+=over 4
+
+=item Setting $ENV{TZ} in Threads on Win32
+
+=back
+
+=item AUTHOR
+
+=item License
+
+=item SEE ALSO
+
+=item BUGS
+
+=back
+
+=head2 Time::Seconds - a simple API to convert seconds to other date values
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=item AUTHOR
+
+=item LICENSE
+
+=item Bugs
+
+=back
+
+=head2 Time::gmtime - by-name interface to Perl's built-in gmtime()
+function
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 Time::localtime - by-name interface to Perl's built-in localtime()
+function
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 Time::tm - internal object used by Time::gmtime and Time::localtime
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 UNIVERSAL - base class for ALL classes (blessed references)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<< $obj->isa( TYPE ) >>, C<< CLASS->isa( TYPE ) >>, C<< eval { VAL->isa(
+TYPE ) } >>, C<TYPE>, C<$obj>, C<CLASS>, C<VAL>, C<< $obj->DOES( ROLE ) >>,
+C<< CLASS->DOES( ROLE ) >>, C<< $obj->can( METHOD ) >>, C<< CLASS->can(
+METHOD ) >>, C<< eval { VAL->can( METHOD ) } >>, C<VERSION ( [ REQUIRE ] )>
+
+=item WARNINGS
+
+=item EXPORTS
+
+=back
+
+=head2 Unicode-Normalize, Unicode::Normalize - Unicode Normalization Forms
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Normalization Forms
+
+C<$NFD_string = NFD($string)>, C<$NFC_string = NFC($string)>,
+C<$NFKD_string = NFKD($string)>, C<$NFKC_string = NFKC($string)>,
+C<$FCD_string = FCD($string)>, C<$FCC_string = FCC($string)>,
+C<$normalized_string = normalize($form_name, $string)>
+
+=item Decomposition and Composition
+
+C<$decomposed_string = decompose($string [, $useCompatMapping])>,
+C<$reordered_string = reorder($string)>, C<$composed_string =
+compose($string)>
+
+=item Quick Check
+
+C<$result = checkNFD($string)>, C<$result = checkNFC($string)>, C<$result =
+checkNFKD($string)>, C<$result = checkNFKC($string)>, C<$result =
+checkFCD($string)>, C<$result = checkFCC($string)>, C<$result =
+check($form_name, $string)>
+
+=item Character Data
+
+C<$canonical_decomposition = getCanon($code_point)>,
+C<$compatibility_decomposition = getCompat($code_point)>,
+C<$code_point_composite = getComposite($code_point_here,
+$code_point_next)>, C<$combining_class = getCombinClass($code_point)>,
+C<$may_be_composed_with_prev_char = isComp2nd($code_point)>,
+C<$is_exclusion = isExclusion($code_point)>, C<$is_singleton =
+isSingleton($code_point)>, C<$is_non_starter_decomposition =
+isNonStDecomp($code_point)>, C<$is_Full_Composition_Exclusion =
+isComp_Ex($code_point)>, C<$NFD_is_NO = isNFD_NO($code_point)>,
+C<$NFC_is_NO = isNFC_NO($code_point)>, C<$NFC_is_MAYBE =
+isNFC_MAYBE($code_point)>, C<$NFKD_is_NO = isNFKD_NO($code_point)>,
+C<$NFKC_is_NO = isNFKC_NO($code_point)>, C<$NFKC_is_MAYBE =
+isNFKC_MAYBE($code_point)>
+
+=back
+
+=item EXPORT
+
+=item CAVEATS
+
+Perl's version vs. Unicode version, Correction of decomposition mapping,
+Revised definition of canonical composition
+
+=item AUTHOR
+
+=item SEE ALSO
+
+http://www.unicode.org/reports/tr15/,
+http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt,
+http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt,
+http://www.unicode.org/Public/UNIDATA/NormalizationCorrections.txt,
+http://www.unicode.org/review/pr-29.html, http://www.unicode.org/notes/tn5/
+
+=back
+
+=head2 Unicode::Collate - Unicode Collation Algorithm
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Constructor and Tailoring
+
+UCA_Version, alternate, backwards, entry, hangul_terminator, ignoreChar,
+ignoreName, katakana_before_hiragana, level, normalization, overrideCJK,
+overrideHangul, preprocess, rearrange, table, undefChar, undefName,
+upper_before_lower, variable
+
+=item Methods for Collation
+
+C<@sorted = $Collator-E<gt>sort(@not_sorted)>, C<$result =
+$Collator-E<gt>cmp($a, $b)>, C<$result = $Collator-E<gt>eq($a, $b)>,
+C<$result = $Collator-E<gt>ne($a, $b)>, C<$result = $Collator-E<gt>lt($a,
+$b)>, C<$result = $Collator-E<gt>le($a, $b)>, C<$result =
+$Collator-E<gt>gt($a, $b)>, C<$result = $Collator-E<gt>ge($a, $b)>,
+C<$sortKey = $Collator-E<gt>getSortKey($string)>, C<$sortKeyForm =
+$Collator-E<gt>viewSortKey($string)>
+
+=item Methods for Searching
+
+C<$position = $Collator-E<gt>index($string, $substring[, $position])>,
+C<($position, $length) = $Collator-E<gt>index($string, $substring[,
+$position])>, C<$match_ref = $Collator-E<gt>match($string, $substring)>,
+C<($match) = $Collator-E<gt>match($string, $substring)>, C<@match =
+$Collator-E<gt>gmatch($string, $substring)>, C<$count =
+$Collator-E<gt>subst($string, $substring, $replacement)>, C<$count =
+$Collator-E<gt>gsubst($string, $substring, $replacement)>
+
+=item Other Methods
+
+C<%old_tailoring = $Collator-E<gt>change(%new_tailoring)>, C<$version =
+$Collator-E<gt>version()>, C<UCA_Version()>, C<Base_Unicode_Version()>
+
+=back
+
+=item EXPORT
+
+=item INSTALL
+
+=item CAVEATS
+
+Normalization, Conformance Test
+
+=item AUTHOR, COPYRIGHT AND LICENSE
+
+=item SEE ALSO
+
+Unicode Collation Algorithm - UTS #10, The Default Unicode Collation
+Element Table (DUCET), The conformance test for the UCA, Hangul Syllable
+Type, Unicode Normalization Forms - UAX #15
+
+=back
+
+=head2 Unicode::Normalize - Unicode Normalization Forms
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Normalization Forms
+
+C<$NFD_string = NFD($string)>, C<$NFC_string = NFC($string)>,
+C<$NFKD_string = NFKD($string)>, C<$NFKC_string = NFKC($string)>,
+C<$FCD_string = FCD($string)>, C<$FCC_string = FCC($string)>,
+C<$normalized_string = normalize($form_name, $string)>
+
+=item Decomposition and Composition
+
+C<$decomposed_string = decompose($string [, $useCompatMapping])>,
+C<$reordered_string = reorder($string)>, C<$composed_string =
+compose($string)>
+
+=item Quick Check
+
+C<$result = checkNFD($string)>, C<$result = checkNFC($string)>, C<$result =
+checkNFKD($string)>, C<$result = checkNFKC($string)>, C<$result =
+checkFCD($string)>, C<$result = checkFCC($string)>, C<$result =
+check($form_name, $string)>
+
+=item Character Data
+
+C<$canonical_decomposition = getCanon($code_point)>,
+C<$compatibility_decomposition = getCompat($code_point)>,
+C<$code_point_composite = getComposite($code_point_here,
+$code_point_next)>, C<$combining_class = getCombinClass($code_point)>,
+C<$may_be_composed_with_prev_char = isComp2nd($code_point)>,
+C<$is_exclusion = isExclusion($code_point)>, C<$is_singleton =
+isSingleton($code_point)>, C<$is_non_starter_decomposition =
+isNonStDecomp($code_point)>, C<$is_Full_Composition_Exclusion =
+isComp_Ex($code_point)>, C<$NFD_is_NO = isNFD_NO($code_point)>,
+C<$NFC_is_NO = isNFC_NO($code_point)>, C<$NFC_is_MAYBE =
+isNFC_MAYBE($code_point)>, C<$NFKD_is_NO = isNFKD_NO($code_point)>,
+C<$NFKC_is_NO = isNFKC_NO($code_point)>, C<$NFKC_is_MAYBE =
+isNFKC_MAYBE($code_point)>
+
+=back
+
+=item EXPORT
+
+=item CAVEATS
+
+Perl's version vs. Unicode version, Correction of decomposition mapping,
+Revised definition of canonical composition
+
+=item AUTHOR
+
+=item SEE ALSO
+
+http://www.unicode.org/reports/tr15/,
+http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt,
+http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt,
+http://www.unicode.org/Public/UNIDATA/NormalizationCorrections.txt,
+http://www.unicode.org/review/pr-29.html, http://www.unicode.org/notes/tn5/
+
+=back
+
+=head2 Unicode::UCD - Unicode character database
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item code point argument
+
+=item B<charinfo()>
+
+B<code>, B<name>, B<category>, B<combining>, B<bidi>, B<decomposition>,
+B<decimal>, B<digit>, B<numeric>, B<mirrored>, B<unicode10>, B<comment>,
+B<upper>, B<lower>, B<title>, B<block>, B<script>
+
+=back
+
+=back
+
+=over 4
+
+=item B<charblock()>
+
+=back
+
+=over 4
+
+=item B<charscript()>
+
+=back
+
+=over 4
+
+=item B<charblocks()>
+
+=back
+
+=over 4
+
+=item B<charscripts()>
+
+=back
+
+=over 4
+
+=item B<charinrange()>
+
+=back
+
+=over 4
+
+=item B<general_categories()>
+
+=back
+
+=over 4
+
+=item B<bidi_types()>
+
+=back
+
+=over 4
+
+=item B<compexcl()>
+
+=back
+
+=over 4
+
+=item B<casefold()>
+
+B<code>, B<full>, B<simple>, B<mapping>, B<status>, B<*>, B<*>, B<turkic>
+
+=back
+
+=over 4
+
+=item B<casespec()>
+
+B<code>, B<lower>, B<title>, B<lower>, B<condition>
+
+=back
+
+=over 4
+
+=item B<namedseq()>
+
+=back
+
+=over 4
+
+=item Unicode::UCD::UnicodeVersion
+
+=back
+
+=over 4
+
+=item B<Blocks versus Scripts>
+
+=item B<Matching Scripts and Blocks>
+
+=item Implementation Note
+
+=back
+
+=over 4
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 User::grent - by-name interface to Perl's built-in getgr*()
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 User::pwent - by-name interface to Perl's built-in getpw*()
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item System Specifics
+
+=back
+
+=item NOTE
+
+=item AUTHOR
+
+=item HISTORY
+
+March 18th, 2000
+
+=back
+
+=head2 Win32 - Interfaces to some Win32 API Functions
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Alphabetical Listing of Win32 Functions
+
+Win32::AbortSystemShutdown(MACHINE), Win32::BuildNumber(),
+Win32::CopyFile(FROM, TO, OVERWRITE), Win32::CreateDirectory(DIRECTORY),
+Win32::CreateFile(FILE), Win32::DomainName(),
+Win32::ExpandEnvironmentStrings(STRING), Win32::FormatMessage(ERRORCODE),
+Win32::FsType(), Win32::FreeLibrary(HANDLE),
+Win32::GetANSIPathName(FILENAME), Win32::GetArchName(),
+Win32::GetChipName(), Win32::GetCwd(), Win32::GetCurrentProcessId(),
+Win32::GetCurrentThreadId(), Win32::GetFileVersion(FILENAME),
+Win32::GetFolderPath(FOLDER [, CREATE]), Win32::GetFullPathName(FILENAME),
+Win32::GetLastError(), Win32::GetLongPathName(PATHNAME),
+Win32::GetNextAvailDrive(), Win32::GetOSVersion(), Win32::GetOSName(),
+Win32::GetShortPathName(PATHNAME), Win32::GetProcAddress(INSTANCE,
+PROCNAME), Win32::GetTickCount(), Win32::GuidGen(), Win32::IsAdminUser(),
+Win32::IsWinNT(), Win32::IsWin95(), Win32::LoadLibrary(LIBNAME),
+Win32::LoginName(), Win32::LookupAccountName(SYSTEM, ACCOUNT, DOMAIN, SID,
+SIDTYPE), Win32::LookupAccountSID(SYSTEM, SID, ACCOUNT, DOMAIN, SIDTYPE),
+Win32::MsgBox(MESSAGE [, FLAGS [, TITLE]]), Win32::NodeName(),
+Win32::OutputDebugString(STRING), Win32::RegisterServer(LIBRARYNAME),
+Win32::SetChildShowWindow(SHOWWINDOW), Win32::SetCwd(NEWDIRECTORY),
+Win32::SetLastError(ERROR), Win32::Sleep(TIME), Win32::Spawn(COMMAND, ARGS,
+PID), Win32::UnregisterServer(LIBRARYNAME)
+
+=back
+
+=back
+
+=head2 Win32API-File, Win32API::File - Low-level access to Win32 system API
+calls for files/dirs.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Object Oriented/Tied Handle Interface
+
+=item Exports
+
+C<":Func">, attrLetsToBits, C<$uBits= attrLetsToBits( $sAttributeLetters
+)>, C<"a">, C<"c">, C<"h">, C<"o">, C<"r">, C<"s">, C<"t">, createFile,
+C<$hObject= createFile( $sPath )>, C<$hObject= createFile( $sPath,
+$rvhvOptions )>, C<$hObject= createFile( $sPath, $svAccess )>, C<$hObject=
+createFile( $sPath, $svAccess, $rvhvOptions )>, C<$hObject= createFile(
+$sPath, $svAccess, $svShare )>, C<$hObject= createFile( $sPath, $svAccess,
+$svShare, $rvhvOptions )>, C<"q">, C<"r">, C<"w">, C<"k">, C<"t">, C<"n">,
+C<"c">, C<"e">, C<"kc">, C<"ke">, C<"tc">, C<"te">, C<"nc">, C<"ne">, Flags
+=> $uFlags, Attributes => $sAttributes, Security => $pSecurityAttributes,
+Model => $hModelFile, Access => $sAccess, Access => $uAccess, Create =>
+$sCreate, Create => $uCreate, Share => $sShare, Share => $uShare,
+getLogicalDrives, C<@roots= getLogicalDrives()>, CloseHandle,
+C<CloseHandle( $hObject )>, CopyFile, C<CopyFile( $sOldFileName,
+$sNewFileName, $bFailIfExists )>, CreateFile, C<$hObject= CreateFile(
+$sPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )>,
+C<"//./PhysicalDrive0">, C<"//./C:">, C<"//./A:">, C<"//./PIPE/PipeName">,
+DefineDosDevice, C<DefineDosDevice( $uFlags, $sDosDeviceName, $sTargetPath
+)>, C<DDD_RAW_TARGET_PATH>, C<DDD_REMOVE_DEFINITION>,
+C<DDD_EXACT_MATCH_ON_REMOVE>, DeleteFile, C<DeleteFile( $sFileName )>,
+DeviceIoControl, C<DeviceIoControl( $hDevice, $uIoControlCode, $pInBuf,
+$lInBuf, $opOutBuf, $lOutBuf, $olRetBytes, $pOverlapped )>, FdGetOsFHandle,
+C<$hNativeHandle= FdGetOsFHandle( $ivFd )>, fileConstant, C<$value=
+fileConstant( $sConstantName )>, fileLastError, C<$svError=
+fileLastError();>, C<fileLastError( $uError );>, GetDriveType,
+C<$uDriveType= GetDriveType( $sRootPath )>, C<DRIVE_UNKNOWN>,
+C<DRIVE_NO_ROOT_DIR>, C<DRIVE_REMOVABLE>, C<DRIVE_FIXED>, C<DRIVE_REMOTE>,
+C<DRIVE_CDROM>, C<DRIVE_RAMDISK>, GetFileAttributes, C<$uAttrs =
+GetFileAttributes( $sPath )>, C<FILE_ATTRIBUTE_ARCHIVE>,
+C<FILE_ATTRIBUTE_COMPRESSED>, C<FILE_ATTRIBUTE_DEVICE>,
+C<FILE_ATTRIBUTE_DIRECTORY>, C<FILE_ATTRIBUTE_ENCRYPTED>,
+C<FILE_ATTRIBUTE_HIDDEN>, C<FILE_ATTRIBUTE_NORMAL>,
+C<FILE_ATTRIBUTE_NOT_CONTENT_INDEXED>, C<FILE_ATTRIBUTE_OFFLINE>,
+C<FILE_ATTRIBUTE_READONLY>, C<FILE_ATTRIBUTE_REPARSE_POINT>,
+C<FILE_ATTRIBUTE_SPARSE_FILE>, C<FILE_ATTRIBUTE_SYSTEM>,
+C<FILE_ATTRIBUTE_TEMPORARY>, GetFileType, C<$uFileType= GetFileType( $hFile
+)>, C<FILE_TYPE_UNKNOWN>, C<FILE_TYPE_DISK>, C<FILE_TYPE_CHAR>,
+C<FILE_TYPE_PIPE>, getFileSize, C<$size= getFileSize( $hFile )>,
+GetFileSize, C<$iSizeLow= GetFileSize($win32Handle, $iSizeHigh)>,
+GetOverlappedResult, C<$bRetval= GetOverlappedResult( $win32Handle,
+$pOverlapped, $numBytesTransferred, $bWait )>, GetLogicalDrives,
+C<$uDriveBits= GetLogicalDrives()>, GetLogicalDriveStrings, C<$olOutLength=
+GetLogicalDriveStrings( $lBufSize, $osBuffer )>, GetHandleInformation,
+C<GetHandleInformation( $hObject, $ouFlags )>, GetOsFHandle,
+C<$hNativeHandle= GetOsFHandle( FILE )>, GetVolumeInformation,
+C<GetVolumeInformation( $sRootPath, $osVolName, $lVolName, $ouSerialNum,
+$ouMaxNameLen, $ouFsFlags, $osFsType, $lFsType )>, C<FS_CASE_IS_PRESERVED>,
+C<FS_CASE_SENSITIVE>, C<FS_UNICODE_STORED_ON_DISK>, C<FS_PERSISTENT_ACLS>,
+C<FS_FILE_COMPRESSION>, C<FS_VOL_IS_COMPRESSED>, IsRecognizedPartition,
+C<IsRecognizedPartition( $ivPartitionType )>, IsContainerPartition,
+C<IsContainerPartition( $ivPartitionType )>, MoveFile, C<MoveFile(
+$sOldName, $sNewName )>, MoveFileEx, C<MoveFileEx( $sOldName, $sNewName,
+$uFlags )>, C<MOVEFILE_REPLACE_EXISTING>, C<MOVEFILE_COPY_ALLOWED>,
+C<MOVEFILE_DELAY_UNTIL_REBOOT>, C<MOVEFILE_WRITE_THROUGH>, OsFHandleOpen,
+C<OsFHandleOpen( FILE, $hNativeHandle, $sMode )>, OsFHandleOpenFd, C<$ivFD=
+OsFHandleOpenFd( $hNativeHandle, $uMode )>, QueryDosDevice, C<$olTargetLen=
+QueryDosDevice( $sDosDeviceName, $osTargetPath, $lTargetBuf )>, ReadFile,
+C<ReadFile( $hFile, $opBuffer, $lBytes, $olBytesRead, $pOverlapped )>,
+SetErrorMode, C<$uOldMode= SetErrorMode( $uNewMode )>,
+C<SEM_FAILCRITICALERRORS>, C<SEM_NOALIGNMENTFAULTEXCEPT>,
+C<SEM_NOGPFAULTERRORBOX>, C<SEM_NOOPENFILEERRORBOX>, setFilePointer,
+C<$uNewPos = setFilePointer( $hFile, $ivOffset, $uFromWhere )>,
+SetFilePointer, C<$uNewPos = SetFilePointer( $hFile, $ivOffset,
+$ioivOffsetHigh, $uFromWhere )>, SetHandleInformation,
+C<SetHandleInformation( $hObject, $uMask, $uFlags )>, WriteFile,
+C<WriteFile( $hFile, $pBuffer, $lBytes, $ouBytesWritten, $pOverlapped )>,
+C<":FuncA">, C<":FuncW">, CopyFileW, C<CopyFileW( $swOldFileName,
+$swNewFileName, $bFailIfExists )>, CreateFileW, C<$hObject= CreateFileW(
+$swPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )>,
+DefineDosDeviceW, C<DefineDosDeviceW( $uFlags, $swDosDeviceName,
+$swTargetPath )>, DeleteFileW, C<DeleteFileW( $swFileName )>,
+GetDriveTypeW, C<$uDriveType= GetDriveTypeW( $swRootPath )>,
+GetFileAttributesW, C<$uAttrs= GetFileAttributesW( $swPath )>,
+GetLogicalDriveStringsW, C<$olwOutLength= GetLogicalDriveStringsW(
+$lwBufSize, $oswBuffer )>, GetVolumeInformationW, C<GetVolumeInformationW(
+$swRootPath, $oswVolName, $lwVolName, $ouSerialNum, $ouMaxNameLen,
+$ouFsFlags, $oswFsType, $lwFsType )>, MoveFileW, C<MoveFileW( $swOldName,
+$swNewName )>, MoveFileExW, C<MoveFileExW( $swOldName, $swNewName, $uFlags
+)>, QueryDosDeviceW, C<$olwTargetLen= QueryDosDeviceW( $swDeviceName,
+$oswTargetPath, $lwTargetBuf )>, C<":Misc">, C<":DDD_">, C<":DRIVE_">,
+C<":FILE_">, C<":FILE_ATTRIBUTE_">, C<":FILE_FLAG_">, C<":FILE_SHARE_">,
+C<":FILE_TYPE_">, C<":FS_">, C<":HANDLE_FLAG_">, HANDLE_FLAG_INHERIT,
+HANDLE_FLAG_PROTECT_FROM_CLOSE, C<":IOCTL_STORAGE_">,
+C<IOCTL_STORAGE_CHECK_VERIFY>, C<IOCTL_STORAGE_MEDIA_REMOVAL>,
+C<IOCTL_STORAGE_EJECT_MEDIA>, C<IOCTL_STORAGE_LOAD_MEDIA>,
+C<IOCTL_STORAGE_RESERVE>, C<IOCTL_STORAGE_RELEASE>,
+C<IOCTL_STORAGE_FIND_NEW_DEVICES>, C<IOCTL_STORAGE_GET_MEDIA_TYPES>,
+C<$ucCylsLow[$i]>, C<$ivcCylsHigh[$i]>, C<$uMediaType[$i]>,
+C<$uTracksPerCyl[$i]>, C<$uSectsPerTrack[$i]>, C<$uBytesPerSect[$i]>,
+C<":IOCTL_DISK_">, C<IOCTL_DISK_GET_DRIVE_GEOMETRY>, C<$ucCylsLow>,
+C<$ivcCylsHigh>, C<$uMediaType>, C<$uTracksPerCyl>, C<$uSectsPerTrack>,
+C<$uBytesPerSect>, C<IOCTL_DISK_GET_PARTITION_INFO>, C<$uStartLow> and
+C<$ivStartHigh>, C<$ucHiddenSects>, C<$uPartitionSeqNumber>,
+C<$uPartitionType>, C<$bActive>, C<$bRecognized>, C<$bToRewrite>,
+C<IOCTL_DISK_SET_PARTITION_INFO>, C<IOCTL_DISK_GET_DRIVE_LAYOUT>,
+C<$cPartitions>, C<$uDiskSignature>, C<IOCTL_DISK_GET_MEDIA_TYPES>,
+C<IOCTL_DISK_SET_DRIVE_LAYOUT>, C<IOCTL_DISK_VERIFY>, C<$uStartOffsetLow>
+and C<$ivStartOffsetHigh>, C<$uLength>, C<IOCTL_DISK_FORMAT_TRACKS>,
+C<IOCTL_DISK_REASSIGN_BLOCKS>, C<IOCTL_DISK_PERFORMANCE>,
+C<IOCTL_DISK_IS_WRITABLE>, C<IOCTL_DISK_LOGGING>, DISK_LOGGING_START,
+DISK_LOGGING_STOP, DISK_LOGGING_DUMP, DISK_LOGGING_BINNING,
+C<IOCTL_DISK_FORMAT_TRACKS_EX>, C<IOCTL_DISK_HISTOGRAM_STRUCTURE>,
+C<IOCTL_DISK_HISTOGRAM_DATA>, C<IOCTL_DISK_HISTOGRAM_RESET>,
+C<IOCTL_DISK_REQUEST_STRUCTURE>, C<IOCTL_DISK_REQUEST_DATA>, C<":FSCTL_">,
+C<FSCTL_SET_REPARSE_POINT>, C<FSCTL_GET_REPARSE_POINT>,
+C<FSCTL_DELETE_REPARSE_POINT>, C<":GENERIC_">, C<":MEDIA_TYPE">,
+C<Unknown>, C<F5_1Pt2_512>, C<F3_1Pt44_512>, C<F3_2Pt88_512>,
+C<F3_20Pt8_512>, C<F3_720_512>, C<F5_360_512>, C<F5_320_512>,
+C<F5_320_1024>, C<F5_180_512>, C<F5_160_512>, C<RemovableMedia>,
+C<FixedMedia>, C<F3_120M_512>, C<":MOVEFILE_">, C<":SECURITY_">,
+C<":SEM_">, C<":PARTITION_">, C<":ALL">
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Win32API::File - Low-level access to Win32 system API calls for
+files/dirs.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Object Oriented/Tied Handle Interface
+
+=item Exports
+
+C<":Func">, attrLetsToBits, C<$uBits= attrLetsToBits( $sAttributeLetters
+)>, C<"a">, C<"c">, C<"h">, C<"o">, C<"r">, C<"s">, C<"t">, createFile,
+C<$hObject= createFile( $sPath )>, C<$hObject= createFile( $sPath,
+$rvhvOptions )>, C<$hObject= createFile( $sPath, $svAccess )>, C<$hObject=
+createFile( $sPath, $svAccess, $rvhvOptions )>, C<$hObject= createFile(
+$sPath, $svAccess, $svShare )>, C<$hObject= createFile( $sPath, $svAccess,
+$svShare, $rvhvOptions )>, C<"q">, C<"r">, C<"w">, C<"k">, C<"t">, C<"n">,
+C<"c">, C<"e">, C<"kc">, C<"ke">, C<"tc">, C<"te">, C<"nc">, C<"ne">, Flags
+=> $uFlags, Attributes => $sAttributes, Security => $pSecurityAttributes,
+Model => $hModelFile, Access => $sAccess, Access => $uAccess, Create =>
+$sCreate, Create => $uCreate, Share => $sShare, Share => $uShare,
+getLogicalDrives, C<@roots= getLogicalDrives()>, CloseHandle,
+C<CloseHandle( $hObject )>, CopyFile, C<CopyFile( $sOldFileName,
+$sNewFileName, $bFailIfExists )>, CreateFile, C<$hObject= CreateFile(
+$sPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )>,
+C<"//./PhysicalDrive0">, C<"//./C:">, C<"//./A:">, C<"//./PIPE/PipeName">,
+DefineDosDevice, C<DefineDosDevice( $uFlags, $sDosDeviceName, $sTargetPath
+)>, C<DDD_RAW_TARGET_PATH>, C<DDD_REMOVE_DEFINITION>,
+C<DDD_EXACT_MATCH_ON_REMOVE>, DeleteFile, C<DeleteFile( $sFileName )>,
+DeviceIoControl, C<DeviceIoControl( $hDevice, $uIoControlCode, $pInBuf,
+$lInBuf, $opOutBuf, $lOutBuf, $olRetBytes, $pOverlapped )>, FdGetOsFHandle,
+C<$hNativeHandle= FdGetOsFHandle( $ivFd )>, fileConstant, C<$value=
+fileConstant( $sConstantName )>, fileLastError, C<$svError=
+fileLastError();>, C<fileLastError( $uError );>, GetDriveType,
+C<$uDriveType= GetDriveType( $sRootPath )>, C<DRIVE_UNKNOWN>,
+C<DRIVE_NO_ROOT_DIR>, C<DRIVE_REMOVABLE>, C<DRIVE_FIXED>, C<DRIVE_REMOTE>,
+C<DRIVE_CDROM>, C<DRIVE_RAMDISK>, GetFileAttributes, C<$uAttrs =
+GetFileAttributes( $sPath )>, C<FILE_ATTRIBUTE_ARCHIVE>,
+C<FILE_ATTRIBUTE_COMPRESSED>, C<FILE_ATTRIBUTE_DEVICE>,
+C<FILE_ATTRIBUTE_DIRECTORY>, C<FILE_ATTRIBUTE_ENCRYPTED>,
+C<FILE_ATTRIBUTE_HIDDEN>, C<FILE_ATTRIBUTE_NORMAL>,
+C<FILE_ATTRIBUTE_NOT_CONTENT_INDEXED>, C<FILE_ATTRIBUTE_OFFLINE>,
+C<FILE_ATTRIBUTE_READONLY>, C<FILE_ATTRIBUTE_REPARSE_POINT>,
+C<FILE_ATTRIBUTE_SPARSE_FILE>, C<FILE_ATTRIBUTE_SYSTEM>,
+C<FILE_ATTRIBUTE_TEMPORARY>, GetFileType, C<$uFileType= GetFileType( $hFile
+)>, C<FILE_TYPE_UNKNOWN>, C<FILE_TYPE_DISK>, C<FILE_TYPE_CHAR>,
+C<FILE_TYPE_PIPE>, getFileSize, C<$size= getFileSize( $hFile )>,
+GetFileSize, C<$iSizeLow= GetFileSize($win32Handle, $iSizeHigh)>,
+GetOverlappedResult, C<$bRetval= GetOverlappedResult( $win32Handle,
+$pOverlapped, $numBytesTransferred, $bWait )>, GetLogicalDrives,
+C<$uDriveBits= GetLogicalDrives()>, GetLogicalDriveStrings, C<$olOutLength=
+GetLogicalDriveStrings( $lBufSize, $osBuffer )>, GetHandleInformation,
+C<GetHandleInformation( $hObject, $ouFlags )>, GetOsFHandle,
+C<$hNativeHandle= GetOsFHandle( FILE )>, GetVolumeInformation,
+C<GetVolumeInformation( $sRootPath, $osVolName, $lVolName, $ouSerialNum,
+$ouMaxNameLen, $ouFsFlags, $osFsType, $lFsType )>, C<FS_CASE_IS_PRESERVED>,
+C<FS_CASE_SENSITIVE>, C<FS_UNICODE_STORED_ON_DISK>, C<FS_PERSISTENT_ACLS>,
+C<FS_FILE_COMPRESSION>, C<FS_VOL_IS_COMPRESSED>, IsRecognizedPartition,
+C<IsRecognizedPartition( $ivPartitionType )>, IsContainerPartition,
+C<IsContainerPartition( $ivPartitionType )>, MoveFile, C<MoveFile(
+$sOldName, $sNewName )>, MoveFileEx, C<MoveFileEx( $sOldName, $sNewName,
+$uFlags )>, C<MOVEFILE_REPLACE_EXISTING>, C<MOVEFILE_COPY_ALLOWED>,
+C<MOVEFILE_DELAY_UNTIL_REBOOT>, C<MOVEFILE_WRITE_THROUGH>, OsFHandleOpen,
+C<OsFHandleOpen( FILE, $hNativeHandle, $sMode )>, OsFHandleOpenFd, C<$ivFD=
+OsFHandleOpenFd( $hNativeHandle, $uMode )>, QueryDosDevice, C<$olTargetLen=
+QueryDosDevice( $sDosDeviceName, $osTargetPath, $lTargetBuf )>, ReadFile,
+C<ReadFile( $hFile, $opBuffer, $lBytes, $olBytesRead, $pOverlapped )>,
+SetErrorMode, C<$uOldMode= SetErrorMode( $uNewMode )>,
+C<SEM_FAILCRITICALERRORS>, C<SEM_NOALIGNMENTFAULTEXCEPT>,
+C<SEM_NOGPFAULTERRORBOX>, C<SEM_NOOPENFILEERRORBOX>, setFilePointer,
+C<$uNewPos = setFilePointer( $hFile, $ivOffset, $uFromWhere )>,
+SetFilePointer, C<$uNewPos = SetFilePointer( $hFile, $ivOffset,
+$ioivOffsetHigh, $uFromWhere )>, SetHandleInformation,
+C<SetHandleInformation( $hObject, $uMask, $uFlags )>, WriteFile,
+C<WriteFile( $hFile, $pBuffer, $lBytes, $ouBytesWritten, $pOverlapped )>,
+C<":FuncA">, C<":FuncW">, CopyFileW, C<CopyFileW( $swOldFileName,
+$swNewFileName, $bFailIfExists )>, CreateFileW, C<$hObject= CreateFileW(
+$swPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )>,
+DefineDosDeviceW, C<DefineDosDeviceW( $uFlags, $swDosDeviceName,
+$swTargetPath )>, DeleteFileW, C<DeleteFileW( $swFileName )>,
+GetDriveTypeW, C<$uDriveType= GetDriveTypeW( $swRootPath )>,
+GetFileAttributesW, C<$uAttrs= GetFileAttributesW( $swPath )>,
+GetLogicalDriveStringsW, C<$olwOutLength= GetLogicalDriveStringsW(
+$lwBufSize, $oswBuffer )>, GetVolumeInformationW, C<GetVolumeInformationW(
+$swRootPath, $oswVolName, $lwVolName, $ouSerialNum, $ouMaxNameLen,
+$ouFsFlags, $oswFsType, $lwFsType )>, MoveFileW, C<MoveFileW( $swOldName,
+$swNewName )>, MoveFileExW, C<MoveFileExW( $swOldName, $swNewName, $uFlags
+)>, QueryDosDeviceW, C<$olwTargetLen= QueryDosDeviceW( $swDeviceName,
+$oswTargetPath, $lwTargetBuf )>, C<":Misc">, C<":DDD_">, C<":DRIVE_">,
+C<":FILE_">, C<":FILE_ATTRIBUTE_">, C<":FILE_FLAG_">, C<":FILE_SHARE_">,
+C<":FILE_TYPE_">, C<":FS_">, C<":HANDLE_FLAG_">, HANDLE_FLAG_INHERIT,
+HANDLE_FLAG_PROTECT_FROM_CLOSE, C<":IOCTL_STORAGE_">,
+C<IOCTL_STORAGE_CHECK_VERIFY>, C<IOCTL_STORAGE_MEDIA_REMOVAL>,
+C<IOCTL_STORAGE_EJECT_MEDIA>, C<IOCTL_STORAGE_LOAD_MEDIA>,
+C<IOCTL_STORAGE_RESERVE>, C<IOCTL_STORAGE_RELEASE>,
+C<IOCTL_STORAGE_FIND_NEW_DEVICES>, C<IOCTL_STORAGE_GET_MEDIA_TYPES>,
+C<$ucCylsLow[$i]>, C<$ivcCylsHigh[$i]>, C<$uMediaType[$i]>,
+C<$uTracksPerCyl[$i]>, C<$uSectsPerTrack[$i]>, C<$uBytesPerSect[$i]>,
+C<":IOCTL_DISK_">, C<IOCTL_DISK_GET_DRIVE_GEOMETRY>, C<$ucCylsLow>,
+C<$ivcCylsHigh>, C<$uMediaType>, C<$uTracksPerCyl>, C<$uSectsPerTrack>,
+C<$uBytesPerSect>, C<IOCTL_DISK_GET_PARTITION_INFO>, C<$uStartLow> and
+C<$ivStartHigh>, C<$ucHiddenSects>, C<$uPartitionSeqNumber>,
+C<$uPartitionType>, C<$bActive>, C<$bRecognized>, C<$bToRewrite>,
+C<IOCTL_DISK_SET_PARTITION_INFO>, C<IOCTL_DISK_GET_DRIVE_LAYOUT>,
+C<$cPartitions>, C<$uDiskSignature>, C<IOCTL_DISK_GET_MEDIA_TYPES>,
+C<IOCTL_DISK_SET_DRIVE_LAYOUT>, C<IOCTL_DISK_VERIFY>, C<$uStartOffsetLow>
+and C<$ivStartOffsetHigh>, C<$uLength>, C<IOCTL_DISK_FORMAT_TRACKS>,
+C<IOCTL_DISK_REASSIGN_BLOCKS>, C<IOCTL_DISK_PERFORMANCE>,
+C<IOCTL_DISK_IS_WRITABLE>, C<IOCTL_DISK_LOGGING>, DISK_LOGGING_START,
+DISK_LOGGING_STOP, DISK_LOGGING_DUMP, DISK_LOGGING_BINNING,
+C<IOCTL_DISK_FORMAT_TRACKS_EX>, C<IOCTL_DISK_HISTOGRAM_STRUCTURE>,
+C<IOCTL_DISK_HISTOGRAM_DATA>, C<IOCTL_DISK_HISTOGRAM_RESET>,
+C<IOCTL_DISK_REQUEST_STRUCTURE>, C<IOCTL_DISK_REQUEST_DATA>, C<":FSCTL_">,
+C<FSCTL_SET_REPARSE_POINT>, C<FSCTL_GET_REPARSE_POINT>,
+C<FSCTL_DELETE_REPARSE_POINT>, C<":GENERIC_">, C<":MEDIA_TYPE">,
+C<Unknown>, C<F5_1Pt2_512>, C<F3_1Pt44_512>, C<F3_2Pt88_512>,
+C<F3_20Pt8_512>, C<F3_720_512>, C<F5_360_512>, C<F5_320_512>,
+C<F5_320_1024>, C<F5_180_512>, C<F5_160_512>, C<RemovableMedia>,
+C<FixedMedia>, C<F3_120M_512>, C<":MOVEFILE_">, C<":SECURITY_">,
+C<":SEM_">, C<":PARTITION_">, C<":ALL">
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Win32CORE - Win32 CORE function stubs
+
+=over 4
+
+=item DESCRIPTION
+
+=item HISTORY
+
+=back
+
+=head2 XS-APItest, XS::APItest - Test the perl C API
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=over 4
+
+=item EXPORT
+
+B<print_double>, B<print_long_double>, B<have_long_double>, B<print_nv>,
+B<print_iv>, B<print_uv>, B<print_int>, B<print_long>, B<print_float>,
+B<call_sv>, B<call_pv>, B<call_method>, B<eval_sv>, B<eval_pv>,
+B<require_pv>
+
+=back
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 XS-Typemap, XS::Typemap - module to test the XS typemaps distributed
+with perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item NOTES
+
+=item AUTHOR
+
+=back
+
+=head2 XSLoader - Dynamically load C libraries into Perl code
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Migration from C<DynaLoader>
+
+=item Backward compatible boilerplate
+
+=back
+
+=item Order of initialization: early load()
+
+=over 4
+
+=item The most hairy case
+
+=back
+
+=item DIAGNOSTICS
+
+C<Can't find '%s' symbol in %s>, C<Can't load '%s' for module %s: %s>,
+C<Undefined symbols present after loading %s: %s>,
+C<XSLoader::load('Your::Module', $Your::Module::VERSION)>
+
+=item LIMITATIONS
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT & LICENSE
+
+=back
+
+=head1 AUXILIARY DOCUMENTATION
+
+Here should be listed all the extra programs' documentation, but they
+don't all have manual pages yet:
+
+=over 4
+
+=item a2p
+
+=item c2ph
+
+=item dprofpp
+
+=item h2ph
+
+=item h2xs
+
+=item perlbug
+
+=item perldoc
+
+=item pl2pm
+
+=item pod2html
+
+=item pod2man
+
+=item s2p
+
+=item splain
+
+=item xsubpp
+
+=back
+
+=head1 AUTHOR
+
+Larry Wall <F<larry@wall.org>>, with the help of oodles
+of other folks.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perltodo.pod b/Master/tlpkg/tlperl.straw/lib/pods/perltodo.pod
new file mode 100755
index 00000000000..7e7a3526742
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perltodo.pod
@@ -0,0 +1,1229 @@
+=head1 NAME
+
+perltodo - Perl TO-DO List
+
+=head1 DESCRIPTION
+
+This is a list of wishes for Perl. The most up to date version of this file
+is at http://perl5.git.perl.org/perl.git/blob_plain/HEAD:/pod/perltodo.pod
+
+The tasks we think are smaller or easier are listed first. Anyone is welcome
+to work on any of these, but it's a good idea to first contact
+I<perl5-porters@perl.org> to avoid duplication of effort, and to learn from
+any previous attempts. By all means contact a pumpking privately first if you
+prefer.
+
+Whilst patches to make the list shorter are most welcome, ideas to add to
+the list are also encouraged. Check the perl5-porters archives for past
+ideas, and any discussion about them. One set of archives may be found at:
+
+ http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/
+
+What can we offer you in return? Fame, fortune, and everlasting glory? Maybe
+not, but if your patch is incorporated, then we'll add your name to the
+F<AUTHORS> file, which ships in the official distribution. How many other
+programming languages offer you 1 line of immortality?
+
+=head1 Tasks that only need Perl knowledge
+
+=head2 Remove macperl references from tests
+
+MacPerl is gone. The tests don't need to be there.
+
+=head2 Remove duplication of test setup.
+
+Schwern notes, that there's duplication of code - lots and lots of tests have
+some variation on the big block of C<$Is_Foo> checks. We can safely put this
+into a file, change it to build an C<%Is> hash and require it. Maybe just put
+it into F<test.pl>. Throw in the handy tainting subroutines.
+
+=head2 POD -E<gt> HTML conversion in the core still sucks
+
+Which is crazy given just how simple POD purports to be, and how simple HTML
+can be. It's not actually I<as> simple as it sounds, particularly with the
+flexibility POD allows for C<=item>, but it would be good to improve the
+visual appeal of the HTML generated, and to avoid it having any validation
+errors. See also L</make HTML install work>, as the layout of installation tree
+is needed to improve the cross-linking.
+
+The addition of C<Pod::Simple> and its related modules may make this task
+easier to complete.
+
+=head2 Make ExtUtils::ParseXS use strict;
+
+F<lib/ExtUtils/ParseXS.pm> contains this line
+
+ # use strict; # One of these days...
+
+Simply uncomment it, and fix all the resulting issues :-)
+
+The more practical approach, to break the task down into manageable chunks, is
+to work your way though the code from bottom to top, or if necessary adding
+extra C<{ ... }> blocks, and turning on strict within them.
+
+=head2 Parallel testing
+
+(This probably impacts much more than the core: also the Test::Harness
+and TAP::* modules on CPAN.)
+
+All of the tests in F<t/> can now be run in parallel, if C<$ENV{TEST_JOBS}>
+is set. However, tests within each directory in F<ext> and F<lib> are still
+run in series, with directories run in parallel. This is an adequate
+heuristic, but it might be possible to relax it further, and get more
+throughput. Specifically, it would be good to audit all of F<lib/*.t>, and
+make them use C<File::Temp>.
+
+=head2 Make Schwern poorer
+
+We should have tests for everything. When all the core's modules are tested,
+Schwern has promised to donate to $500 to TPF. We may need volunteers to
+hold him upside down and shake vigorously in order to actually extract the
+cash.
+
+=head2 Improve the coverage of the core tests
+
+Use Devel::Cover to ascertain the core modules's test coverage, then add
+tests that are currently missing.
+
+=head2 test B
+
+A full test suite for the B module would be nice.
+
+=head2 A decent benchmark
+
+C<perlbench> seems impervious to any recent changes made to the perl core. It
+would be useful to have a reasonable general benchmarking suite that roughly
+represented what current perl programs do, and measurably reported whether
+tweaks to the core improve, degrade or don't really affect performance, to
+guide people attempting to optimise the guts of perl. Gisle would welcome
+new tests for perlbench.
+
+=head2 fix tainting bugs
+
+Fix the bugs revealed by running the test suite with the C<-t> switch (via
+C<make test.taintwarn>).
+
+=head2 Dual life everything
+
+As part of the "dists" plan, anything that doesn't belong in the smallest perl
+distribution needs to be dual lifed. Anything else can be too. Figure out what
+changes would be needed to package that module and its tests up for CPAN, and
+do so. Test it with older perl releases, and fix the problems you find.
+
+To make a minimal perl distribution, it's useful to look at
+F<t/lib/commonsense.t>.
+
+=head2 Bundle dual life modules in ext/
+
+For maintenance (and branch merging) reasons, it would be useful to move
+some architecture-independent dual-life modules from lib/ to ext/, if this
+has no negative impact on the build of perl itself.
+
+=head2 POSIX memory footprint
+
+Ilya observed that use POSIX; eats memory like there's no tomorrow, and at
+various times worked to cut it down. There is probably still fat to cut out -
+for example POSIX passes Exporter some very memory hungry data structures.
+
+=head2 embed.pl/makedef.pl
+
+There is a script F<embed.pl> that generates several header files to prefix
+all of Perl's symbols in a consistent way, to provide some semblance of
+namespace support in C<C>. Functions are declared in F<embed.fnc>, variables
+in F<interpvar.h>. Quite a few of the functions and variables
+are conditionally declared there, using C<#ifdef>. However, F<embed.pl>
+doesn't understand the C macros, so the rules about which symbols are present
+when is duplicated in F<makedef.pl>. Writing things twice is bad, m'kay.
+It would be good to teach C<embed.pl> to understand the conditional
+compilation, and hence remove the duplication, and the mistakes it has caused.
+
+=head2 use strict; and AutoLoad
+
+Currently if you write
+
+ package Whack;
+ use AutoLoader 'AUTOLOAD';
+ use strict;
+ 1;
+ __END__
+ sub bloop {
+ print join (' ', No, strict, here), "!\n";
+ }
+
+then C<use strict;> isn't in force within the autoloaded subroutines. It would
+be more consistent (and less surprising) to arrange for all lexical pragmas
+in force at the __END__ block to be in force within each autoloaded subroutine.
+
+There's a similar problem with SelfLoader.
+
+=head2 profile installman
+
+The F<installman> script is slow. All it is doing text processing, which we're
+told is something Perl is good at. So it would be nice to know what it is doing
+that is taking so much CPU, and where possible address it.
+
+
+=head1 Tasks that need a little sysadmin-type knowledge
+
+Or if you prefer, tasks that you would learn from, and broaden your skills
+base...
+
+=head2 make HTML install work
+
+There is an C<installhtml> target in the Makefile. It's marked as
+"experimental". It would be good to get this tested, make it work reliably, and
+remove the "experimental" tag. This would include
+
+=over 4
+
+=item 1
+
+Checking that cross linking between various parts of the documentation works.
+In particular that links work between the modules (files with POD in F<lib/>)
+and the core documentation (files in F<pod/>)
+
+=item 2
+
+Work out how to split C<perlfunc> into chunks, preferably one per function
+group, preferably with general case code that could be used elsewhere.
+Challenges here are correctly identifying the groups of functions that go
+together, and making the right named external cross-links point to the right
+page. Things to be aware of are C<-X>, groups such as C<getpwnam> to
+C<endservent>, two or more C<=items> giving the different parameter lists, such
+as
+
+ =item substr EXPR,OFFSET,LENGTH,REPLACEMENT
+ =item substr EXPR,OFFSET,LENGTH
+ =item substr EXPR,OFFSET
+
+and different parameter lists having different meanings. (eg C<select>)
+
+=back
+
+=head2 compressed man pages
+
+Be able to install them. This would probably need a configure test to see how
+the system does compressed man pages (same directory/different directory?
+same filename/different filename), as well as tweaking the F<installman> script
+to compress as necessary.
+
+=head2 Add a code coverage target to the Makefile
+
+Make it easy for anyone to run Devel::Cover on the core's tests. The steps
+to do this manually are roughly
+
+=over 4
+
+=item *
+
+do a normal C<Configure>, but include Devel::Cover as a module to install
+(see F<INSTALL> for how to do this)
+
+=item *
+
+ make perl
+
+=item *
+
+ cd t; HARNESS_PERL_SWITCHES=-MDevel::Cover ./perl -I../lib harness
+
+=item *
+
+Process the resulting Devel::Cover database
+
+=back
+
+This just give you the coverage of the F<.pm>s. To also get the C level
+coverage you need to
+
+=over 4
+
+=item *
+
+Additionally tell C<Configure> to use the appropriate C compiler flags for
+C<gcov>
+
+=item *
+
+ make perl.gcov
+
+(instead of C<make perl>)
+
+=item *
+
+After running the tests run C<gcov> to generate all the F<.gcov> files.
+(Including down in the subdirectories of F<ext/>
+
+=item *
+
+(From the top level perl directory) run C<gcov2perl> on all the C<.gcov> files
+to get their stats into the cover_db directory.
+
+=item *
+
+Then process the Devel::Cover database
+
+=back
+
+It would be good to add a single switch to C<Configure> to specify that you
+wanted to perform perl level coverage, and another to specify C level
+coverage, and have C<Configure> and the F<Makefile> do all the right things
+automatically.
+
+=head2 Make Config.pm cope with differences between built and installed perl
+
+Quite often vendors ship a perl binary compiled with their (pay-for)
+compilers. People install a free compiler, such as gcc. To work out how to
+build extensions, Perl interrogates C<%Config>, so in this situation
+C<%Config> describes compilers that aren't there, and extension building
+fails. This forces people into choosing between re-compiling perl themselves
+using the compiler they have, or only using modules that the vendor ships.
+
+It would be good to find a way teach C<Config.pm> about the installation setup,
+possibly involving probing at install time or later, so that the C<%Config> in
+a binary distribution better describes the installed machine, when the
+installed machine differs from the build machine in some significant way.
+
+=head2 linker specification files
+
+Some platforms mandate that you provide a list of a shared library's external
+symbols to the linker, so the core already has the infrastructure in place to
+do this for generating shared perl libraries. My understanding is that the
+GNU toolchain can accept an optional linker specification file, and restrict
+visibility just to symbols declared in that file. It would be good to extend
+F<makedef.pl> to support this format, and to provide a means within
+C<Configure> to enable it. This would allow Unix users to test that the
+export list is correct, and to build a perl that does not pollute the global
+namespace with private symbols.
+
+=head2 Cross-compile support
+
+Currently C<Configure> understands C<-Dusecrosscompile> option. This option
+arranges for building C<miniperl> for TARGET machine, so this C<miniperl> is
+assumed then to be copied to TARGET machine and used as a replacement of full
+C<perl> executable.
+
+This could be done little differently. Namely C<miniperl> should be built for
+HOST and then full C<perl> with extensions should be compiled for TARGET.
+This, however, might require extra trickery for %Config: we have one config
+first for HOST and then another for TARGET. Tools like MakeMaker will be
+mightily confused. Having around two different types of executables and
+libraries (HOST and TARGET) makes life interesting for Makefiles and
+shell (and Perl) scripts. There is $Config{run}, normally empty, which
+can be used as an execution wrapper. Also note that in some
+cross-compilation/execution environments the HOST and the TARGET do
+not see the same filesystem(s), the $Config{run} may need to do some
+file/directory copying back and forth.
+
+=head2 roffitall
+
+Make F<pod/roffitall> be updated by F<pod/buildtoc>.
+
+=head2 Split "linker" from "compiler"
+
+Right now, Configure probes for two commands, and sets two variables:
+
+=over 4
+
+=item * C<cc> (in F<cc.U>)
+
+This variable holds the name of a command to execute a C compiler which
+can resolve multiple global references that happen to have the same
+name. Usual values are F<cc> and F<gcc>.
+Fervent ANSI compilers may be called F<c89>. AIX has F<xlc>.
+
+=item * C<ld> (in F<dlsrc.U>)
+
+This variable indicates the program to be used to link
+libraries for dynamic loading. On some systems, it is F<ld>.
+On ELF systems, it should be C<$cc>. Mostly, we'll try to respect
+the hint file setting.
+
+=back
+
+There is an implicit historical assumption from around Perl5.000alpha
+something, that C<$cc> is also the correct command for linking object files
+together to make an executable. This may be true on Unix, but it's not true
+on other platforms, and there are a maze of work arounds in other places (such
+as F<Makefile.SH>) to cope with this.
+
+Ideally, we should create a new variable to hold the name of the executable
+linker program, probe for it in F<Configure>, and centralise all the special
+case logic there or in hints files.
+
+A small bikeshed issue remains - what to call it, given that C<$ld> is already
+taken (arguably for the wrong thing now, but on SunOS 4.1 it is the command
+for creating dynamically-loadable modules) and C<$link> could be confused with
+the Unix command line executable of the same name, which does something
+completely different. Andy Dougherty makes the counter argument "In parrot, I
+tried to call the command used to link object files and libraries into an
+executable F<link>, since that's what my vaguely-remembered DOS and VMS
+experience suggested. I don't think any real confusion has ensued, so it's
+probably a reasonable name for perl5 to use."
+
+"Alas, I've always worried that introducing it would make things worse,
+since now the module building utilities would have to look for
+C<$Config{link}> and institute a fall-back plan if it weren't found."
+Although I can see that as confusing, given that C<$Config{d_link}> is true
+when (hard) links are available.
+
+=head2 Configure Windows using PowerShell
+
+Currently, Windows uses hard-coded config files based to build the
+config.h for compiling Perl. Makefiles are also hard-coded and need to be
+hand edited prior to building Perl. While this makes it easy to create a perl.exe
+that works across multiple Windows versions, being able to accurately
+configure a perl.exe for a specific Windows versions and VS C++ would be
+a nice enhancement. With PowerShell available on Windows XP and up, this
+may now be possible. Step 1 might be to investigate whether this is possible
+and use this to clean up our current makefile situation. Step 2 would be to
+see if there would be a way to use our existing metaconfig units to configure a
+Windows Perl or whether we go in a separate direction and make it so. Of
+course, we all know what step 3 is.
+
+=head2 decouple -g and -DDEBUGGING
+
+Currently F<Configure> automatically adds C<-DDEBUGGING> to the C compiler
+flags if it spots C<-g> in the optimiser flags. The pre-processor directive
+C<DEBUGGING> enables F<perl>'s command line <-D> options, but in the process
+makes F<perl> slower. It would be good to disentangle this logic, so that
+C-level debugging with C<-g> and Perl level debugging with C<-D> can easily
+be enabled independently.
+
+=head1 Tasks that need a little C knowledge
+
+These tasks would need a little C knowledge, but don't need any specific
+background or experience with XS, or how the Perl interpreter works
+
+=head2 Weed out needless PERL_UNUSED_ARG
+
+The C code uses the macro C<PERL_UNUSED_ARG> to stop compilers warning about
+unused arguments. Often the arguments can't be removed, as there is an
+external constraint that determines the prototype of the function, so this
+approach is valid. However, there are some cases where C<PERL_UNUSED_ARG>
+could be removed. Specifically
+
+=over 4
+
+=item *
+
+The prototypes of (nearly all) static functions can be changed
+
+=item *
+
+Unused arguments generated by short cut macros are wasteful - the short cut
+macro used can be changed.
+
+=back
+
+=head2 Modernize the order of directories in @INC
+
+The way @INC is laid out by default, one cannot upgrade core (dual-life)
+modules without overwriting files. This causes problems for binary
+package builders. One possible proposal is laid out in this
+message:
+L<http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2002-04/msg02380.html>.
+
+=head2 -Duse32bit*
+
+Natively 64-bit systems need neither -Duse64bitint nor -Duse64bitall.
+On these systems, it might be the default compilation mode, and there
+is currently no guarantee that passing no use64bitall option to the
+Configure process will build a 32bit perl. Implementing -Duse32bit*
+options would be nice for perl 5.12.
+
+=head2 Profile Perl - am I hot or not?
+
+The Perl source code is stable enough that it makes sense to profile it,
+identify and optimise the hotspots. It would be good to measure the
+performance of the Perl interpreter using free tools such as cachegrind,
+gprof, and dtrace, and work to reduce the bottlenecks they reveal.
+
+As part of this, the idea of F<pp_hot.c> is that it contains the I<hot> ops,
+the ops that are most commonly used. The idea is that by grouping them, their
+object code will be adjacent in the executable, so they have a greater chance
+of already being in the CPU cache (or swapped in) due to being near another op
+already in use.
+
+Except that it's not clear if these really are the most commonly used ops. So
+as part of exercising your skills with coverage and profiling tools you might
+want to determine what ops I<really> are the most commonly used. And in turn
+suggest evictions and promotions to achieve a better F<pp_hot.c>.
+
+One piece of Perl code that might make a good testbed is F<installman>.
+
+=head2 Allocate OPs from arenas
+
+Currently all new OP structures are individually malloc()ed and free()d.
+All C<malloc> implementations have space overheads, and are now as fast as
+custom allocates so it would both use less memory and less CPU to allocate
+the various OP structures from arenas. The SV arena code can probably be
+re-used for this.
+
+Note that Configuring perl with C<-Accflags=-DPL_OP_SLAB_ALLOC> will use
+Perl_Slab_alloc() to pack optrees into a contiguous block, which is
+probably superior to the use of OP arenas, esp. from a cache locality
+standpoint. See L<Profile Perl - am I hot or not?>.
+
+=head2 Improve win32/wince.c
+
+Currently, numerous functions look virtually, if not completely,
+identical in both C<win32/wince.c> and C<win32/win32.c> files, which can't
+be good.
+
+=head2 Use secure CRT functions when building with VC8 on Win32
+
+Visual C++ 2005 (VC++ 8.x) deprecated a number of CRT functions on the basis
+that they were "unsafe" and introduced differently named secure versions of
+them as replacements, e.g. instead of writing
+
+ FILE* f = fopen(__FILE__, "r");
+
+one should now write
+
+ FILE* f;
+ errno_t err = fopen_s(&f, __FILE__, "r");
+
+Currently, the warnings about these deprecations have been disabled by adding
+-D_CRT_SECURE_NO_DEPRECATE to the CFLAGS. It would be nice to remove that
+warning suppressant and actually make use of the new secure CRT functions.
+
+There is also a similar issue with POSIX CRT function names like fileno having
+been deprecated in favour of ISO C++ conformant names like _fileno. These
+warnings are also currently suppressed by adding -D_CRT_NONSTDC_NO_DEPRECATE. It
+might be nice to do as Microsoft suggest here too, although, unlike the secure
+functions issue, there is presumably little or no benefit in this case.
+
+=head2 Fix POSIX::access() and chdir() on Win32
+
+These functions currently take no account of DACLs and therefore do not behave
+correctly in situations where access is restricted by DACLs (as opposed to the
+read-only attribute).
+
+Furthermore, POSIX::access() behaves differently for directories having the
+read-only attribute set depending on what CRT library is being used. For
+example, the _access() function in the VC6 and VC7 CRTs (wrongly) claim that
+such directories are not writable, whereas in fact all directories are writable
+unless access is denied by DACLs. (In the case of directories, the read-only
+attribute actually only means that the directory cannot be deleted.) This CRT
+bug is fixed in the VC8 and VC9 CRTs (but, of course, the directory may still
+not actually be writable if access is indeed denied by DACLs).
+
+For the chdir() issue, see ActiveState bug #74552:
+http://bugs.activestate.com/show_bug.cgi?id=74552
+
+Therefore, DACLs should be checked both for consistency across CRTs and for
+the correct answer.
+
+(Note that perl's -w operator should not be modified to check DACLs. It has
+been written so that it reflects the state of the read-only attribute, even
+for directories (whatever CRT is being used), for symmetry with chmod().)
+
+=head2 strcat(), strcpy(), strncat(), strncpy(), sprintf(), vsprintf()
+
+Maybe create a utility that checks after each libperl.a creation that
+none of the above (nor sprintf(), vsprintf(), or *SHUDDER* gets())
+ever creep back to libperl.a.
+
+ nm libperl.a | ./miniperl -alne '$o = $F[0] if /:$/; print "$o $F[1]" if $F[0] eq "U" && $F[1] =~ /^(?:strn?c(?:at|py)|v?sprintf|gets)$/'
+
+Note, of course, that this will only tell whether B<your> platform
+is using those naughty interfaces.
+
+=head2 -D_FORTIFY_SOURCE=2, -fstack-protector
+
+Recent glibcs support C<-D_FORTIFY_SOURCE=2> and recent gcc
+(4.1 onwards?) supports C<-fstack-protector>, both of which give
+protection against various kinds of buffer overflow problems.
+These should probably be used for compiling Perl whenever available,
+Configure and/or hints files should be adjusted to probe for the
+availability of these features and enable them as appropriate.
+
+=head2 Arenas for GPs? For MAGIC?
+
+C<struct gp> and C<struct magic> are both currently allocated by C<malloc>.
+It might be a speed or memory saving to change to using arenas. Or it might
+not. It would need some suitable benchmarking first. In particular, C<GP>s
+can probably be changed with minimal compatibility impact (probably nothing
+outside of the core, or even outside of F<gv.c> allocates them), but they
+probably aren't allocated/deallocated often enough for a speed saving. Whereas
+C<MAGIC> is allocated/deallocated more often, but in turn, is also something
+more externally visible, so changing the rules here may bite external code.
+
+=head2 Shared arenas
+
+Several SV body structs are now the same size, notably PVMG and PVGV, PVAV and
+PVHV, and PVCV and PVFM. It should be possible to allocate and return same
+sized bodies from the same actual arena, rather than maintaining one arena for
+each. This could save 4-6K per thread, of memory no longer tied up in the
+not-yet-allocated part of an arena.
+
+
+=head1 Tasks that need a knowledge of XS
+
+These tasks would need C knowledge, and roughly the level of knowledge of
+the perl API that comes from writing modules that use XS to interface to
+C.
+
+=head2 Remove the use of SVs as temporaries in dump.c
+
+F<dump.c> contains debugging routines to dump out the contains of perl data
+structures, such as C<SV>s, C<AV>s and C<HV>s. Currently, the dumping code
+B<uses> C<SV>s for its temporary buffers, which was a logical initial
+implementation choice, as they provide ready made memory handling.
+
+However, they also lead to a lot of confusion when it happens that what you're
+trying to debug is seen by the code in F<dump.c>, correctly or incorrectly, as
+a temporary scalar it can use for a temporary buffer. It's also not possible
+to dump scalars before the interpreter is properly set up, such as during
+ithreads cloning. It would be good to progressively replace the use of scalars
+as string accumulation buffers with something much simpler, directly allocated
+by C<malloc>. The F<dump.c> code is (or should be) only producing 7 bit
+US-ASCII, so output character sets are not an issue.
+
+Producing and proving an internal simple buffer allocation would make it easier
+to re-write the internals of the PerlIO subsystem to avoid using C<SV>s for
+B<its> buffers, use of which can cause problems similar to those of F<dump.c>,
+at similar times.
+
+=head2 safely supporting POSIX SA_SIGINFO
+
+Some years ago Jarkko supplied patches to provide support for the POSIX
+SA_SIGINFO feature in Perl, passing the extra data to the Perl signal handler.
+
+Unfortunately, it only works with "unsafe" signals, because under safe
+signals, by the time Perl gets to run the signal handler, the extra
+information has been lost. Moreover, it's not easy to store it somewhere,
+as you can't call mutexs, or do anything else fancy, from inside a signal
+handler.
+
+So it strikes me that we could provide safe SA_SIGINFO support
+
+=over 4
+
+=item 1
+
+Provide global variables for two file descriptors
+
+=item 2
+
+When the first request is made via C<sigaction> for C<SA_SIGINFO>, create a
+pipe, store the reader in one, the writer in the other
+
+=item 3
+
+In the "safe" signal handler (C<Perl_csighandler()>/C<S_raise_signal()>), if
+the C<siginfo_t> pointer non-C<NULL>, and the writer file handle is open,
+
+=over 8
+
+=item 1
+
+serialise signal number, C<struct siginfo_t> (or at least the parts we care
+about) into a small auto char buff
+
+=item 2
+
+C<write()> that (non-blocking) to the writer fd
+
+=over 12
+
+=item 1
+
+if it writes 100%, flag the signal in a counter of "signals on the pipe" akin
+to the current per-signal-number counts
+
+=item 2
+
+if it writes 0%, assume the pipe is full. Flag the data as lost?
+
+=item 3
+
+if it writes partially, croak a panic, as your OS is broken.
+
+=back
+
+=back
+
+=item 4
+
+in the regular C<PERL_ASYNC_CHECK()> processing, if there are "signals on
+the pipe", read the data out, deserialise, build the Perl structures on
+the stack (code in C<Perl_sighandler()>, the "unsafe" handler), and call as
+usual.
+
+=back
+
+I think that this gets us decent C<SA_SIGINFO> support, without the current risk
+of running Perl code inside the signal handler context. (With all the dangers
+of things like C<malloc> corruption that that currently offers us)
+
+For more information see the thread starting with this message:
+http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2008-03/msg00305.html
+
+=head2 autovivification
+
+Make all autovivification consistent w.r.t LVALUE/RVALUE and strict/no strict;
+
+This task is incremental - even a little bit of work on it will help.
+
+=head2 Unicode in Filenames
+
+chdir, chmod, chown, chroot, exec, glob, link, lstat, mkdir, open,
+opendir, qx, readdir, readlink, rename, rmdir, stat, symlink, sysopen,
+system, truncate, unlink, utime, -X. All these could potentially accept
+Unicode filenames either as input or output (and in the case of system
+and qx Unicode in general, as input or output to/from the shell).
+Whether a filesystem - an operating system pair understands Unicode in
+filenames varies.
+
+Known combinations that have some level of understanding include
+Microsoft NTFS, Apple HFS+ (In Mac OS 9 and X) and Apple UFS (in Mac
+OS X), NFS v4 is rumored to be Unicode, and of course Plan 9. How to
+create Unicode filenames, what forms of Unicode are accepted and used
+(UCS-2, UTF-16, UTF-8), what (if any) is the normalization form used,
+and so on, varies. Finding the right level of interfacing to Perl
+requires some thought. Remember that an OS does not implicate a
+filesystem.
+
+(The Windows -C command flag "wide API support" has been at least
+temporarily retired in 5.8.1, and the -C has been repurposed, see
+L<perlrun>.)
+
+Most probably the right way to do this would be this:
+L</"Virtualize operating system access">.
+
+=head2 Unicode in %ENV
+
+Currently the %ENV entries are always byte strings.
+See L</"Virtualize operating system access">.
+
+=head2 Unicode and glob()
+
+Currently glob patterns and filenames returned from File::Glob::glob()
+are always byte strings. See L</"Virtualize operating system access">.
+
+=head2 Unicode and lc/uc operators
+
+Some built-in operators (C<lc>, C<uc>, etc.) behave differently, based on
+what the internal encoding of their argument is. That should not be the
+case. Maybe add a pragma to switch behaviour.
+
+=head2 use less 'memory'
+
+Investigate trade offs to switch out perl's choices on memory usage.
+Particularly perl should be able to give memory back.
+
+This task is incremental - even a little bit of work on it will help.
+
+=head2 Re-implement C<:unique> in a way that is actually thread-safe
+
+The old implementation made bad assumptions on several levels. A good 90%
+solution might be just to make C<:unique> work to share the string buffer
+of SvPVs. That way large constant strings can be shared between ithreads,
+such as the configuration information in F<Config>.
+
+=head2 Make tainting consistent
+
+Tainting would be easier to use if it didn't take documented shortcuts and
+allow taint to "leak" everywhere within an expression.
+
+=head2 readpipe(LIST)
+
+system() accepts a LIST syntax (and a PROGRAM LIST syntax) to avoid
+running a shell. readpipe() (the function behind qx//) could be similarly
+extended.
+
+=head2 Audit the code for destruction ordering assumptions
+
+Change 25773 notes
+
+ /* Need to check SvMAGICAL, as during global destruction it may be that
+ AvARYLEN(av) has been freed before av, and hence the SvANY() pointer
+ is now part of the linked list of SV heads, rather than pointing to
+ the original body. */
+ /* FIXME - audit the code for other bugs like this one. */
+
+adding the C<SvMAGICAL> check to
+
+ if (AvARYLEN(av) && SvMAGICAL(AvARYLEN(av))) {
+ MAGIC *mg = mg_find (AvARYLEN(av), PERL_MAGIC_arylen);
+
+Go through the core and look for similar assumptions that SVs have particular
+types, as all bets are off during global destruction.
+
+=head2 Extend PerlIO and PerlIO::Scalar
+
+PerlIO::Scalar doesn't know how to truncate(). Implementing this
+would require extending the PerlIO vtable.
+
+Similarly the PerlIO vtable doesn't know about formats (write()), or
+about stat(), or chmod()/chown(), utime(), or flock().
+
+(For PerlIO::Scalar it's hard to see what e.g. mode bits or ownership
+would mean.)
+
+PerlIO doesn't do directories or symlinks, either: mkdir(), rmdir(),
+opendir(), closedir(), seekdir(), rewinddir(), glob(); symlink(),
+readlink().
+
+See also L</"Virtualize operating system access">.
+
+=head2 -C on the #! line
+
+It should be possible to make -C work correctly if found on the #! line,
+given that all perl command line options are strict ASCII, and -C changes
+only the interpretation of non-ASCII characters, and not for the script file
+handle. To make it work needs some investigation of the ordering of function
+calls during startup, and (by implication) a bit of tweaking of that order.
+
+=head2 Duplicate logic in S_method_common() and Perl_gv_fetchmethod_autoload()
+
+A comment in C<S_method_common> notes
+
+ /* This code tries to figure out just what went wrong with
+ gv_fetchmethod. It therefore needs to duplicate a lot of
+ the internals of that function. We can't move it inside
+ Perl_gv_fetchmethod_autoload(), however, since that would
+ cause UNIVERSAL->can("NoSuchPackage::foo") to croak, and we
+ don't want that.
+ */
+
+If C<Perl_gv_fetchmethod_autoload> gets rewritten to take (more) flag bits,
+then it ought to be possible to move the logic from C<S_method_common> to
+the "right" place. When making this change it would probably be good to also
+pass in at least the method name length, if not also pre-computed hash values
+when known. (I'm contemplating a plan to pre-compute hash values for common
+fixed strings such as C<ISA> and pass them in to functions.)
+
+=head2 Organize error messages
+
+Perl's diagnostics (error messages, see L<perldiag>) could use
+reorganizing and formalizing so that each error message has its
+stable-for-all-eternity unique id, categorized by severity, type, and
+subsystem. (The error messages would be listed in a datafile outside
+of the Perl source code, and the source code would only refer to the
+messages by the id.) This clean-up and regularizing should apply
+for all croak() messages.
+
+This would enable all sorts of things: easier translation/localization
+of the messages (though please do keep in mind the caveats of
+L<Locale::Maketext> about too straightforward approaches to
+translation), filtering by severity, and instead of grepping for a
+particular error message one could look for a stable error id. (Of
+course, changing the error messages by default would break all the
+existing software depending on some particular error message...)
+
+This kind of functionality is known as I<message catalogs>. Look for
+inspiration for example in the catgets() system, possibly even use it
+if available-- but B<only> if available, all platforms will B<not>
+have catgets().
+
+For the really pure at heart, consider extending this item to cover
+also the warning messages (see L<perllexwarn>, C<warnings.pl>).
+
+=head1 Tasks that need a knowledge of the interpreter
+
+These tasks would need C knowledge, and knowledge of how the interpreter works,
+or a willingness to learn.
+
+=head2 forbid labels with keyword names
+
+Currently C<goto keyword> "computes" the label value:
+
+ $ perl -e 'goto print'
+ Can't find label 1 at -e line 1.
+
+It would be nice to forbid labels with keyword names, to avoid confusion.
+
+=head2 truncate() prototype
+
+The prototype of truncate() is currently C<$$>. It should probably
+be C<*$> instead. (This is changed in F<opcode.pl>)
+
+=head2 decapsulation of smart match argument
+
+Currently C<$foo ~~ $object> will die with the message "Smart matching a
+non-overloaded object breaks encapsulation". It would be nice to allow
+to bypass this by using explictly the syntax C<$foo ~~ %$object> or
+C<$foo ~~ @$object>.
+
+=head2 error reporting of [$a ; $b]
+
+Using C<;> inside brackets is a syntax error, and we don't propose to change
+that by giving it any meaning. However, it's not reported very helpfully:
+
+ $ perl -e '$a = [$b; $c];'
+ syntax error at -e line 1, near "$b;"
+ syntax error at -e line 1, near "$c]"
+ Execution of -e aborted due to compilation errors.
+
+It should be possible to hook into the tokeniser or the lexer, so that when a
+C<;> is parsed where it is not legal as a statement terminator (ie inside
+C<{}> used as a hashref, C<[]> or C<()>) it issues an error something like
+I<';' isn't legal inside an expression - if you need multiple statements use a
+do {...} block>. See the thread starting at
+http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2008-09/msg00573.html
+
+=head2 lexicals used only once
+
+This warns:
+
+ $ perl -we '$pie = 42'
+ Name "main::pie" used only once: possible typo at -e line 1.
+
+This does not:
+
+ $ perl -we 'my $pie = 42'
+
+Logically all lexicals used only once should warn, if the user asks for
+warnings. An unworked RT ticket (#5087) has been open for almost seven
+years for this discrepancy.
+
+=head2 UTF-8 revamp
+
+The handling of Unicode is unclean in many places. For example, the regexp
+engine matches in Unicode semantics whenever the string or the pattern is
+flagged as UTF-8, but that should not be dependent on an internal storage
+detail of the string. Likewise, case folding behaviour is dependent on the
+UTF8 internal flag being on or off.
+
+=head2 Properly Unicode safe tokeniser and pads.
+
+The tokeniser isn't actually very UTF-8 clean. C<use utf8;> is a hack -
+variable names are stored in stashes as raw bytes, without the utf-8 flag
+set. The pad API only takes a C<char *> pointer, so that's all bytes too. The
+tokeniser ignores the UTF-8-ness of C<PL_rsfp>, or any SVs returned from
+source filters. All this could be fixed.
+
+=head2 state variable initialization in list context
+
+Currently this is illegal:
+
+ state ($a, $b) = foo();
+
+In Perl 6, C<state ($a) = foo();> and C<(state $a) = foo();> have different
+semantics, which is tricky to implement in Perl 5 as currently they produce
+the same opcode trees. The Perl 6 design is firm, so it would be good to
+implement the necessary code in Perl 5. There are comments in
+C<Perl_newASSIGNOP()> that show the code paths taken by various assignment
+constructions involving state variables.
+
+=head2 Implement $value ~~ 0 .. $range
+
+It would be nice to extend the syntax of the C<~~> operator to also
+understand numeric (and maybe alphanumeric) ranges.
+
+=head2 A does() built-in
+
+Like ref(), only useful. It would call the C<DOES> method on objects; it
+would also tell whether something can be dereferenced as an
+array/hash/etc., or used as a regexp, etc.
+L<http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2007-03/msg00481.html>
+
+=head2 Tied filehandles and write() don't mix
+
+There is no method on tied filehandles to allow them to be called back by
+formats.
+
+=head2 Propagate compilation hints to the debugger
+
+Currently a debugger started with -dE on the command-line doesn't see the
+features enabled by -E. More generally hints (C<$^H> and C<%^H>) aren't
+propagated to the debugger. Probably it would be a good thing to propagate
+hints from the innermost non-C<DB::> scope: this would make code eval'ed
+in the debugger see the features (and strictures, etc.) currently in
+scope.
+
+=head2 Attach/detach debugger from running program
+
+The old perltodo notes "With C<gdb>, you can attach the debugger to a running
+program if you pass the process ID. It would be good to do this with the Perl
+debugger on a running Perl program, although I'm not sure how it would be
+done." ssh and screen do this with named pipes in /tmp. Maybe we can too.
+
+=head2 LVALUE functions for lists
+
+The old perltodo notes that lvalue functions don't work for list or hash
+slices. This would be good to fix.
+
+=head2 regexp optimiser optional
+
+The regexp optimiser is not optional. It should configurable to be, to allow
+its performance to be measured, and its bugs to be easily demonstrated.
+
+=head2 delete &function
+
+Allow to delete functions. One can already undef them, but they're still
+in the stash.
+
+=head2 C</w> regex modifier
+
+That flag would enable to match whole words, and also to interpolate
+arrays as alternations. With it, C</P/w> would be roughly equivalent to:
+
+ do { local $"='|'; /\b(?:P)\b/ }
+
+See L<http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2007-01/msg00400.html>
+for the discussion.
+
+=head2 optional optimizer
+
+Make the peephole optimizer optional. Currently it performs two tasks as
+it walks the optree - genuine peephole optimisations, and necessary fixups of
+ops. It would be good to find an efficient way to switch out the
+optimisations whilst keeping the fixups.
+
+=head2 You WANT *how* many
+
+Currently contexts are void, scalar and list. split has a special mechanism in
+place to pass in the number of return values wanted. It would be useful to
+have a general mechanism for this, backwards compatible and little speed hit.
+This would allow proposals such as short circuiting sort to be implemented
+as a module on CPAN.
+
+=head2 lexical aliases
+
+Allow lexical aliases (maybe via the syntax C<my \$alias = \$foo>.
+
+=head2 entersub XS vs Perl
+
+At the moment pp_entersub is huge, and has code to deal with entering both
+perl and XS subroutines. Subroutine implementations rarely change between
+perl and XS at run time, so investigate using 2 ops to enter subs (one for
+XS, one for perl) and swap between if a sub is redefined.
+
+=head2 Self-ties
+
+Self-ties are currently illegal because they caused too many segfaults. Maybe
+the causes of these could be tracked down and self-ties on all types
+reinstated.
+
+=head2 Optimize away @_
+
+The old perltodo notes "Look at the "reification" code in C<av.c>".
+
+=head2 The yada yada yada operators
+
+Perl 6's Synopsis 3 says:
+
+I<The ... operator is the "yada, yada, yada" list operator, which is used as
+the body in function prototypes. It complains bitterly (by calling fail)
+if it is ever executed. Variant ??? calls warn, and !!! calls die.>
+
+Those would be nice to add to Perl 5. That could be done without new ops.
+
+=head2 Virtualize operating system access
+
+Implement a set of "vtables" that virtualizes operating system access
+(open(), mkdir(), unlink(), readdir(), getenv(), etc.) At the very
+least these interfaces should take SVs as "name" arguments instead of
+bare char pointers; probably the most flexible and extensible way
+would be for the Perl-facing interfaces to accept HVs. The system
+needs to be per-operating-system and per-file-system
+hookable/filterable, preferably both from XS and Perl level
+(L<perlport/"Files and Filesystems"> is good reading at this point,
+in fact, all of L<perlport> is.)
+
+This has actually already been implemented (but only for Win32),
+take a look at F<iperlsys.h> and F<win32/perlhost.h>. While all Win32
+variants go through a set of "vtables" for operating system access,
+non-Win32 systems currently go straight for the POSIX/UNIX-style
+system/library call. Similar system as for Win32 should be
+implemented for all platforms. The existing Win32 implementation
+probably does not need to survive alongside this proposed new
+implementation, the approaches could be merged.
+
+What would this give us? One often-asked-for feature this would
+enable is using Unicode for filenames, and other "names" like %ENV,
+usernames, hostnames, and so forth.
+(See L<perlunicode/"When Unicode Does Not Happen">.)
+
+But this kind of virtualization would also allow for things like
+virtual filesystems, virtual networks, and "sandboxes" (though as long
+as dynamic loading of random object code is allowed, not very safe
+sandboxes since external code of course know not of Perl's vtables).
+An example of a smaller "sandbox" is that this feature can be used to
+implement per-thread working directories: Win32 already does this.
+
+See also L</"Extend PerlIO and PerlIO::Scalar">.
+
+=head2 Investigate PADTMP hash pessimisation
+
+The peephole optimiser converts constants used for hash key lookups to shared
+hash key scalars. Under ithreads, something is undoing this work.
+See http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2007-09/msg00793.html
+
+=head2 Store the current pad in the OP slab allocator
+
+=for clarification
+I hope that I got that "current pad" part correct
+
+Currently we leak ops in various cases of parse failure. I suggested that we
+could solve this by always using the op slab allocator, and walking it to
+free ops. Dave comments that as some ops are already freed during optree
+creation one would have to mark which ops are freed, and not double free them
+when walking the slab. He notes that one problem with this is that for some ops
+you have to know which pad was current at the time of allocation, which does
+change. I suggested storing a pointer to the current pad in the memory allocated
+for the slab, and swapping to a new slab each time the pad changes. Dave thinks
+that this would work.
+
+=head2 repack the optree
+
+Repacking the optree after execution order is determined could allow
+removal of NULL ops, and optimal ordering of OPs with respect to cache-line
+filling. The slab allocator could be reused for this purpose. I think that
+the best way to do this is to make it an optional step just before the
+completed optree is attached to anything else, and to use the slab allocator
+unchanged, so that freeing ops is identical whether or not this step runs.
+Note that the slab allocator allocates ops downwards in memory, so one would
+have to actually "allocate" the ops in reverse-execution order to get them
+contiguous in memory in execution order.
+
+See http://www.nntp.perl.org/group/perl.perl5.porters/2007/12/msg131975.html
+
+Note that running this copy, and then freeing all the old location ops would
+cause their slabs to be freed, which would eliminate possible memory wastage if
+the previous suggestion is implemented, and we swap slabs more frequently.
+
+=head2 eliminate incorrect line numbers in warnings
+
+This code
+
+ use warnings;
+ my $undef;
+
+ if ($undef == 3) {
+ } elsif ($undef == 0) {
+ }
+
+used to produce this output:
+
+ Use of uninitialized value in numeric eq (==) at wrong.pl line 4.
+ Use of uninitialized value in numeric eq (==) at wrong.pl line 4.
+
+where the line of the second warning was misreported - it should be line 5.
+Rafael fixed this - the problem arose because there was no nextstate OP
+between the execution of the C<if> and the C<elsif>, hence C<PL_curcop> still
+reports that the currently executing line is line 4. The solution was to inject
+a nextstate OPs for each C<elsif>, although it turned out that the nextstate
+OP needed to be a nulled OP, rather than a live nextstate OP, else other line
+numbers became misreported. (Jenga!)
+
+The problem is more general than C<elsif> (although the C<elsif> case is the
+most common and the most confusing). Ideally this code
+
+ use warnings;
+ my $undef;
+
+ my $a = $undef + 1;
+ my $b
+ = $undef
+ + 1;
+
+would produce this output
+
+ Use of uninitialized value $undef in addition (+) at wrong.pl line 4.
+ Use of uninitialized value $undef in addition (+) at wrong.pl line 7.
+
+(rather than lines 4 and 5), but this would seem to require every OP to carry
+(at least) line number information.
+
+What might work is to have an optional line number in memory just before the
+BASEOP structure, with a flag bit in the op to say whether it's present.
+Initially during compile every OP would carry its line number. Then add a late
+pass to the optimiser (potentially combined with L</repack the optree>) which
+looks at the two ops on every edge of the graph of the execution path. If
+the line number changes, flags the destination OP with this information.
+Once all paths are traced, replace every op with the flag with a
+nextstate-light op (that just updates C<PL_curcop>), which in turn then passes
+control on to the true op. All ops would then be replaced by variants that
+do not store the line number. (Which, logically, why it would work best in
+conjunction with L</repack the optree>, as that is already copying/reallocating
+all the OPs)
+
+(Although I should note that we're not certain that doing this for the general
+case is worth it)
+
+=head2 optimize tail-calls
+
+Tail-calls present an opportunity for broadly applicable optimization;
+anywhere that C<< return foo(...) >> is called, the outer return can
+be replaced by a goto, and foo will return directly to the outer
+caller, saving (conservatively) 25% of perl's call&return cost, which
+is relatively higher than in C. The scheme language is known to do
+this heavily. B::Concise provides good insight into where this
+optimization is possible, ie anywhere entersub,leavesub op-sequence
+occurs.
+
+ perl -MO=Concise,-exec,a,b,-main -e 'sub a{ 1 }; sub b {a()}; b(2)'
+
+Bottom line on this is probably a new pp_tailcall function which
+combines the code in pp_entersub, pp_leavesub. This should probably
+be done 1st in XS, and using B::Generate to patch the new OP into the
+optrees.
+
+=head2 C<\N>
+
+It should be possible to add a C<\N> regex assertion, meaning "every
+character except C<\n>° independently of the context. That would
+of course imply that C<\N> couldn't be followed by an opening C<{>.
+
+=head1 Big projects
+
+Tasks that will get your name mentioned in the description of the "Highlights
+of 5.12"
+
+=head2 make ithreads more robust
+
+Generally make ithreads more robust. See also L</iCOW>
+
+This task is incremental - even a little bit of work on it will help, and
+will be greatly appreciated.
+
+One bit would be to write the missing code in sv.c:Perl_dirp_dup.
+
+Fix Perl_sv_dup, et al so that threads can return objects.
+
+=head2 iCOW
+
+Sarathy and Arthur have a proposal for an improved Copy On Write which
+specifically will be able to COW new ithreads. If this can be implemented
+it would be a good thing.
+
+=head2 (?{...}) closures in regexps
+
+Fix (or rewrite) the implementation of the C</(?{...})/> closures.
+
+=head2 A re-entrant regexp engine
+
+This will allow the use of a regex from inside (?{ }), (??{ }) and
+(?(?{ })|) constructs.
+
+=head2 Add class set operations to regexp engine
+
+Apparently these are quite useful. Anyway, Jeffery Friedl wants them.
+
+demerphq has this on his todo list, but right at the bottom.
+
+
+=head1 Tasks for microperl
+
+
+[ Each and every one of these may be obsolete, but they were listed
+ in the old Todo.micro file]
+
+
+=head2 make creating uconfig.sh automatic
+
+=head2 make creating Makefile.micro automatic
+
+=head2 do away with fork/exec/wait?
+
+(system, popen should be enough?)
+
+=head2 some of the uconfig.sh really needs to be probed (using cc) in buildtime:
+
+(uConfigure? :-) native datatype widths and endianness come to mind
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perltooc.pod b/Master/tlpkg/tlperl.straw/lib/pods/perltooc.pod
new file mode 100755
index 00000000000..06f697cdef1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perltooc.pod
@@ -0,0 +1,1342 @@
+=head1 NAME
+
+perltooc - Tom's OO Tutorial for Class Data in Perl
+
+=head1 DESCRIPTION
+
+When designing an object class, you are sometimes faced with the situation
+of wanting common state shared by all objects of that class.
+Such I<class attributes> act somewhat like global variables for the entire
+class, but unlike program-wide globals, class attributes have meaning only to
+the class itself.
+
+Here are a few examples where class attributes might come in handy:
+
+=over 4
+
+=item *
+
+to keep a count of the objects you've created, or how many are
+still extant.
+
+=item *
+
+to extract the name or file descriptor for a logfile used by a debugging
+method.
+
+=item *
+
+to access collective data, like the total amount of cash dispensed by
+all ATMs in a network in a given day.
+
+=item *
+
+to access the last object created by a class, or the most accessed object,
+or to retrieve a list of all objects.
+
+=back
+
+Unlike a true global, class attributes should not be accessed directly.
+Instead, their state should be inspected, and perhaps altered, only
+through the mediated access of I<class methods>. These class attributes
+accessor methods are similar in spirit and function to accessors used
+to manipulate the state of instance attributes on an object. They provide a
+clear firewall between interface and implementation.
+
+You should allow access to class attributes through either the class
+name or any object of that class. If we assume that $an_object is of
+type Some_Class, and the &Some_Class::population_count method accesses
+class attributes, then these two invocations should both be possible,
+and almost certainly equivalent.
+
+ Some_Class->population_count()
+ $an_object->population_count()
+
+The question is, where do you store the state which that method accesses?
+Unlike more restrictive languages like C++, where these are called
+static data members, Perl provides no syntactic mechanism to declare
+class attributes, any more than it provides a syntactic mechanism to
+declare instance attributes. Perl provides the developer with a broad
+set of powerful but flexible features that can be uniquely crafted to
+the particular demands of the situation.
+
+A class in Perl is typically implemented in a module. A module consists
+of two complementary feature sets: a package for interfacing with the
+outside world, and a lexical file scope for privacy. Either of these
+two mechanisms can be used to implement class attributes. That means you
+get to decide whether to put your class attributes in package variables
+or to put them in lexical variables.
+
+And those aren't the only decisions to make. If you choose to use package
+variables, you can make your class attribute accessor methods either ignorant
+of inheritance or sensitive to it. If you choose lexical variables,
+you can elect to permit access to them from anywhere in the entire file
+scope, or you can limit direct data access exclusively to the methods
+implementing those attributes.
+
+=head1 Class Data in a Can
+
+One of the easiest ways to solve a hard problem is to let someone else
+do it for you! In this case, Class::Data::Inheritable (available on a
+CPAN near you) offers a canned solution to the class data problem
+using closures. So before you wade into this document, consider
+having a look at that module.
+
+
+=head1 Class Data as Package Variables
+
+Because a class in Perl is really just a package, using package variables
+to hold class attributes is the most natural choice. This makes it simple
+for each class to have its own class attributes. Let's say you have a class
+called Some_Class that needs a couple of different attributes that you'd
+like to be global to the entire class. The simplest thing to do is to
+use package variables like $Some_Class::CData1 and $Some_Class::CData2
+to hold these attributes. But we certainly don't want to encourage
+outsiders to touch those data directly, so we provide methods
+to mediate access.
+
+In the accessor methods below, we'll for now just ignore the first
+argument--that part to the left of the arrow on method invocation, which
+is either a class name or an object reference.
+
+ package Some_Class;
+ sub CData1 {
+ shift; # XXX: ignore calling class/object
+ $Some_Class::CData1 = shift if @_;
+ return $Some_Class::CData1;
+ }
+ sub CData2 {
+ shift; # XXX: ignore calling class/object
+ $Some_Class::CData2 = shift if @_;
+ return $Some_Class::CData2;
+ }
+
+This technique is highly legible and should be completely straightforward
+to even the novice Perl programmer. By fully qualifying the package
+variables, they stand out clearly when reading the code. Unfortunately,
+if you misspell one of these, you've introduced an error that's hard
+to catch. It's also somewhat disconcerting to see the class name itself
+hard-coded in so many places.
+
+Both these problems can be easily fixed. Just add the C<use strict>
+pragma, then pre-declare your package variables. (The C<our> operator
+will be new in 5.6, and will work for package globals just like C<my>
+works for scoped lexicals.)
+
+ package Some_Class;
+ use strict;
+ our($CData1, $CData2); # our() is new to perl5.6
+ sub CData1 {
+ shift; # XXX: ignore calling class/object
+ $CData1 = shift if @_;
+ return $CData1;
+ }
+ sub CData2 {
+ shift; # XXX: ignore calling class/object
+ $CData2 = shift if @_;
+ return $CData2;
+ }
+
+
+As with any other global variable, some programmers prefer to start their
+package variables with capital letters. This helps clarity somewhat, but
+by no longer fully qualifying the package variables, their significance
+can be lost when reading the code. You can fix this easily enough by
+choosing better names than were used here.
+
+=head2 Putting All Your Eggs in One Basket
+
+Just as the mindless enumeration of accessor methods for instance attributes
+grows tedious after the first few (see L<perltoot>), so too does the
+repetition begin to grate when listing out accessor methods for class
+data. Repetition runs counter to the primary virtue of a programmer:
+Laziness, here manifesting as that innate urge every programmer feels
+to factor out duplicate code whenever possible.
+
+Here's what to do. First, make just one hash to hold all class attributes.
+
+ package Some_Class;
+ use strict;
+ our %ClassData = ( # our() is new to perl5.6
+ CData1 => "",
+ CData2 => "",
+ );
+
+Using closures (see L<perlref>) and direct access to the package symbol
+table (see L<perlmod>), now clone an accessor method for each key in
+the %ClassData hash. Each of these methods is used to fetch or store
+values to the specific, named class attribute.
+
+ for my $datum (keys %ClassData) {
+ no strict "refs"; # to register new methods in package
+ *$datum = sub {
+ shift; # XXX: ignore calling class/object
+ $ClassData{$datum} = shift if @_;
+ return $ClassData{$datum};
+ }
+ }
+
+It's true that you could work out a solution employing an &AUTOLOAD
+method, but this approach is unlikely to prove satisfactory. Your
+function would have to distinguish between class attributes and object
+attributes; it could interfere with inheritance; and it would have to
+careful about DESTROY. Such complexity is uncalled for in most cases,
+and certainly in this one.
+
+You may wonder why we're rescinding strict refs for the loop. We're
+manipulating the package's symbol table to introduce new function names
+using symbolic references (indirect naming), which the strict pragma
+would otherwise forbid. Normally, symbolic references are a dodgy
+notion at best. This isn't just because they can be used accidentally
+when you aren't meaning to. It's also because for most uses
+to which beginning Perl programmers attempt to put symbolic references,
+we have much better approaches, like nested hashes or hashes of arrays.
+But there's nothing wrong with using symbolic references to manipulate
+something that is meaningful only from the perspective of the package
+symbol table, like method names or package variables. In other
+words, when you want to refer to the symbol table, use symbol references.
+
+Clustering all the class attributes in one place has several advantages.
+They're easy to spot, initialize, and change. The aggregation also
+makes them convenient to access externally, such as from a debugger
+or a persistence package. The only possible problem is that we don't
+automatically know the name of each class's class object, should it have
+one. This issue is addressed below in L<"The Eponymous Meta-Object">.
+
+=head2 Inheritance Concerns
+
+Suppose you have an instance of a derived class, and you access class
+data using an inherited method call. Should that end up referring
+to the base class's attributes, or to those in the derived class?
+How would it work in the earlier examples? The derived class inherits
+all the base class's methods, including those that access class attributes.
+But what package are the class attributes stored in?
+
+The answer is that, as written, class attributes are stored in the package into
+which those methods were compiled. When you invoke the &CData1 method
+on the name of the derived class or on one of that class's objects, the
+version shown above is still run, so you'll access $Some_Class::CData1--or
+in the method cloning version, C<$Some_Class::ClassData{CData1}>.
+
+Think of these class methods as executing in the context of their base
+class, not in that of their derived class. Sometimes this is exactly
+what you want. If Feline subclasses Carnivore, then the population of
+Carnivores in the world should go up when a new Feline is born.
+But what if you wanted to figure out how many Felines you have apart
+from Carnivores? The current approach doesn't support that.
+
+You'll have to decide on a case-by-case basis whether it makes any sense
+for class attributes to be package-relative. If you want it to be so,
+then stop ignoring the first argument to the function. Either it will
+be a package name if the method was invoked directly on a class name,
+or else it will be an object reference if the method was invoked on an
+object reference. In the latter case, the ref() function provides the
+class of that object.
+
+ package Some_Class;
+ sub CData1 {
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ my $varname = $class . "::CData1";
+ no strict "refs"; # to access package data symbolically
+ $$varname = shift if @_;
+ return $$varname;
+ }
+
+And then do likewise for all other class attributes (such as CData2,
+etc.) that you wish to access as package variables in the invoking package
+instead of the compiling package as we had previously.
+
+Once again we temporarily disable the strict references ban, because
+otherwise we couldn't use the fully-qualified symbolic name for
+the package global. This is perfectly reasonable: since all package
+variables by definition live in a package, there's nothing wrong with
+accessing them via that package's symbol table. That's what it's there
+for (well, somewhat).
+
+What about just using a single hash for everything and then cloning
+methods? What would that look like? The only difference would be the
+closure used to produce new method entries for the class's symbol table.
+
+ no strict "refs";
+ *$datum = sub {
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ my $varname = $class . "::ClassData";
+ $varname->{$datum} = shift if @_;
+ return $varname->{$datum};
+ }
+
+=head2 The Eponymous Meta-Object
+
+It could be argued that the %ClassData hash in the previous example is
+neither the most imaginative nor the most intuitive of names. Is there
+something else that might make more sense, be more useful, or both?
+
+As it happens, yes, there is. For the "class meta-object", we'll use
+a package variable of the same name as the package itself. Within the
+scope of a package Some_Class declaration, we'll use the eponymously
+named hash %Some_Class as that class's meta-object. (Using an eponymously
+named hash is somewhat reminiscent of classes that name their constructors
+eponymously in the Python or C++ fashion. That is, class Some_Class would
+use &Some_Class::Some_Class as a constructor, probably even exporting that
+name as well. The StrNum class in Recipe 13.14 in I<The Perl Cookbook>
+does this, if you're looking for an example.)
+
+This predictable approach has many benefits, including having a well-known
+identifier to aid in debugging, transparent persistence,
+or checkpointing. It's also the obvious name for monadic classes and
+translucent attributes, discussed later.
+
+Here's an example of such a class. Notice how the name of the
+hash storing the meta-object is the same as the name of the package
+used to implement the class.
+
+ package Some_Class;
+ use strict;
+
+ # create class meta-object using that most perfect of names
+ our %Some_Class = ( # our() is new to perl5.6
+ CData1 => "",
+ CData2 => "",
+ );
+
+ # this accessor is calling-package-relative
+ sub CData1 {
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ no strict "refs"; # to access eponymous meta-object
+ $class->{CData1} = shift if @_;
+ return $class->{CData1};
+ }
+
+ # but this accessor is not
+ sub CData2 {
+ shift; # XXX: ignore calling class/object
+ no strict "refs"; # to access eponymous meta-object
+ __PACKAGE__ -> {CData2} = shift if @_;
+ return __PACKAGE__ -> {CData2};
+ }
+
+In the second accessor method, the __PACKAGE__ notation was used for
+two reasons. First, to avoid hardcoding the literal package name
+in the code in case we later want to change that name. Second, to
+clarify to the reader that what matters here is the package currently
+being compiled into, not the package of the invoking object or class.
+If the long sequence of non-alphabetic characters bothers you, you can
+always put the __PACKAGE__ in a variable first.
+
+ sub CData2 {
+ shift; # XXX: ignore calling class/object
+ no strict "refs"; # to access eponymous meta-object
+ my $class = __PACKAGE__;
+ $class->{CData2} = shift if @_;
+ return $class->{CData2};
+ }
+
+Even though we're using symbolic references for good not evil, some
+folks tend to become unnerved when they see so many places with strict
+ref checking disabled. Given a symbolic reference, you can always
+produce a real reference (the reverse is not true, though). So we'll
+create a subroutine that does this conversion for us. If invoked as a
+function of no arguments, it returns a reference to the compiling class's
+eponymous hash. Invoked as a class method, it returns a reference to
+the eponymous hash of its caller. And when invoked as an object method,
+this function returns a reference to the eponymous hash for whatever
+class the object belongs to.
+
+ package Some_Class;
+ use strict;
+
+ our %Some_Class = ( # our() is new to perl5.6
+ CData1 => "",
+ CData2 => "",
+ );
+
+ # tri-natured: function, class method, or object method
+ sub _classobj {
+ my $obclass = shift || __PACKAGE__;
+ my $class = ref($obclass) || $obclass;
+ no strict "refs"; # to convert sym ref to real one
+ return \%$class;
+ }
+
+ for my $datum (keys %{ _classobj() } ) {
+ # turn off strict refs so that we can
+ # register a method in the symbol table
+ no strict "refs";
+ *$datum = sub {
+ use strict "refs";
+ my $self = shift->_classobj();
+ $self->{$datum} = shift if @_;
+ return $self->{$datum};
+ }
+ }
+
+=head2 Indirect References to Class Data
+
+A reasonably common strategy for handling class attributes is to store
+a reference to each package variable on the object itself. This is
+a strategy you've probably seen before, such as in L<perltoot> and
+L<perlbot>, but there may be variations in the example below that you
+haven't thought of before.
+
+ package Some_Class;
+ our($CData1, $CData2); # our() is new to perl5.6
+
+ sub new {
+ my $obclass = shift;
+ return bless my $self = {
+ ObData1 => "",
+ ObData2 => "",
+ CData1 => \$CData1,
+ CData2 => \$CData2,
+ } => (ref $obclass || $obclass);
+ }
+
+ sub ObData1 {
+ my $self = shift;
+ $self->{ObData1} = shift if @_;
+ return $self->{ObData1};
+ }
+
+ sub ObData2 {
+ my $self = shift;
+ $self->{ObData2} = shift if @_;
+ return $self->{ObData2};
+ }
+
+ sub CData1 {
+ my $self = shift;
+ my $dataref = ref $self
+ ? $self->{CData1}
+ : \$CData1;
+ $$dataref = shift if @_;
+ return $$dataref;
+ }
+
+ sub CData2 {
+ my $self = shift;
+ my $dataref = ref $self
+ ? $self->{CData2}
+ : \$CData2;
+ $$dataref = shift if @_;
+ return $$dataref;
+ }
+
+As written above, a derived class will inherit these methods, which
+will consequently access package variables in the base class's package.
+This is not necessarily expected behavior in all circumstances. Here's an
+example that uses a variable meta-object, taking care to access the
+proper package's data.
+
+ package Some_Class;
+ use strict;
+
+ our %Some_Class = ( # our() is new to perl5.6
+ CData1 => "",
+ CData2 => "",
+ );
+
+ sub _classobj {
+ my $self = shift;
+ my $class = ref($self) || $self;
+ no strict "refs";
+ # get (hard) ref to eponymous meta-object
+ return \%$class;
+ }
+
+ sub new {
+ my $obclass = shift;
+ my $classobj = $obclass->_classobj();
+ bless my $self = {
+ ObData1 => "",
+ ObData2 => "",
+ CData1 => \$classobj->{CData1},
+ CData2 => \$classobj->{CData2},
+ } => (ref $obclass || $obclass);
+ return $self;
+ }
+
+ sub ObData1 {
+ my $self = shift;
+ $self->{ObData1} = shift if @_;
+ return $self->{ObData1};
+ }
+
+ sub ObData2 {
+ my $self = shift;
+ $self->{ObData2} = shift if @_;
+ return $self->{ObData2};
+ }
+
+ sub CData1 {
+ my $self = shift;
+ $self = $self->_classobj() unless ref $self;
+ my $dataref = $self->{CData1};
+ $$dataref = shift if @_;
+ return $$dataref;
+ }
+
+ sub CData2 {
+ my $self = shift;
+ $self = $self->_classobj() unless ref $self;
+ my $dataref = $self->{CData2};
+ $$dataref = shift if @_;
+ return $$dataref;
+ }
+
+Not only are we now strict refs clean, using an eponymous meta-object
+seems to make the code cleaner. Unlike the previous version, this one
+does something interesting in the face of inheritance: it accesses the
+class meta-object in the invoking class instead of the one into which
+the method was initially compiled.
+
+You can easily access data in the class meta-object, making
+it easy to dump the complete class state using an external mechanism such
+as when debugging or implementing a persistent class. This works because
+the class meta-object is a package variable, has a well-known name, and
+clusters all its data together. (Transparent persistence
+is not always feasible, but it's certainly an appealing idea.)
+
+There's still no check that object accessor methods have not been
+invoked on a class name. If strict ref checking is enabled, you'd
+blow up. If not, then you get the eponymous meta-object. What you do
+with--or about--this is up to you. The next two sections demonstrate
+innovative uses for this powerful feature.
+
+=head2 Monadic Classes
+
+Some of the standard modules shipped with Perl provide class interfaces
+without any attribute methods whatsoever. The most commonly used module
+not numbered amongst the pragmata, the Exporter module, is a class with
+neither constructors nor attributes. Its job is simply to provide a
+standard interface for modules wishing to export part of their namespace
+into that of their caller. Modules use the Exporter's &import method by
+setting their inheritance list in their package's @ISA array to mention
+"Exporter". But class Exporter provides no constructor, so you can't
+have several instances of the class. In fact, you can't have any--it
+just doesn't make any sense. All you get is its methods. Its interface
+contains no statefulness, so state data is wholly superfluous.
+
+Another sort of class that pops up from time to time is one that supports
+a unique instance. Such classes are called I<monadic classes>, or less
+formally, I<singletons> or I<highlander classes>.
+
+If a class is monadic, where do you store its state, that is,
+its attributes? How do you make sure that there's never more than
+one instance? While you could merely use a slew of package variables,
+it's a lot cleaner to use the eponymously named hash. Here's a complete
+example of a monadic class:
+
+ package Cosmos;
+ %Cosmos = ();
+
+ # accessor method for "name" attribute
+ sub name {
+ my $self = shift;
+ $self->{name} = shift if @_;
+ return $self->{name};
+ }
+
+ # read-only accessor method for "birthday" attribute
+ sub birthday {
+ my $self = shift;
+ die "can't reset birthday" if @_; # XXX: croak() is better
+ return $self->{birthday};
+ }
+
+ # accessor method for "stars" attribute
+ sub stars {
+ my $self = shift;
+ $self->{stars} = shift if @_;
+ return $self->{stars};
+ }
+
+ # oh my - one of our stars just went out!
+ sub supernova {
+ my $self = shift;
+ my $count = $self->stars();
+ $self->stars($count - 1) if $count > 0;
+ }
+
+ # constructor/initializer method - fix by reboot
+ sub bigbang {
+ my $self = shift;
+ %$self = (
+ name => "the world according to tchrist",
+ birthday => time(),
+ stars => 0,
+ );
+ return $self; # yes, it's probably a class. SURPRISE!
+ }
+
+ # After the class is compiled, but before any use or require
+ # returns, we start off the universe with a bang.
+ __PACKAGE__ -> bigbang();
+
+Hold on, that doesn't look like anything special. Those attribute
+accessors look no different than they would if this were a regular class
+instead of a monadic one. The crux of the matter is there's nothing
+that says that $self must hold a reference to a blessed object. It merely
+has to be something you can invoke methods on. Here the package name
+itself, Cosmos, works as an object. Look at the &supernova method. Is that
+a class method or an object method? The answer is that static analysis
+cannot reveal the answer. Perl doesn't care, and neither should you.
+In the three attribute methods, C<%$self> is really accessing the %Cosmos
+package variable.
+
+If like Stephen Hawking, you posit the existence of multiple, sequential,
+and unrelated universes, then you can invoke the &bigbang method yourself
+at any time to start everything all over again. You might think of
+&bigbang as more of an initializer than a constructor, since the function
+doesn't allocate new memory; it only initializes what's already there.
+But like any other constructor, it does return a scalar value to use
+for later method invocations.
+
+Imagine that some day in the future, you decide that one universe just
+isn't enough. You could write a new class from scratch, but you already
+have an existing class that does what you want--except that it's monadic,
+and you want more than just one cosmos.
+
+That's what code reuse via subclassing is all about. Look how short
+the new code is:
+
+ package Multiverse;
+ use Cosmos;
+ @ISA = qw(Cosmos);
+
+ sub new {
+ my $protoverse = shift;
+ my $class = ref($protoverse) || $protoverse;
+ my $self = {};
+ return bless($self, $class)->bigbang();
+ }
+ 1;
+
+Because we were careful to be good little creators when we designed our
+Cosmos class, we can now reuse it without touching a single line of code
+when it comes time to write our Multiverse class. The same code that
+worked when invoked as a class method continues to work perfectly well
+when invoked against separate instances of a derived class.
+
+The astonishing thing about the Cosmos class above is that the value
+returned by the &bigbang "constructor" is not a reference to a blessed
+object at all. It's just the class's own name. A class name is, for
+virtually all intents and purposes, a perfectly acceptable object.
+It has state, behavior, and identity, the three crucial components
+of an object system. It even manifests inheritance, polymorphism,
+and encapsulation. And what more can you ask of an object?
+
+To understand object orientation in Perl, it's important to recognize the
+unification of what other programming languages might think of as class
+methods and object methods into just plain methods. "Class methods"
+and "object methods" are distinct only in the compartmentalizing mind
+of the Perl programmer, not in the Perl language itself.
+
+Along those same lines, a constructor is nothing special either, which
+is one reason why Perl has no pre-ordained name for them. "Constructor"
+is just an informal term loosely used to describe a method that returns
+a scalar value that you can make further method calls against. So long
+as it's either a class name or an object reference, that's good enough.
+It doesn't even have to be a reference to a brand new object.
+
+You can have as many--or as few--constructors as you want, and you can
+name them whatever you care to. Blindly and obediently using new()
+for each and every constructor you ever write is to speak Perl with
+such a severe C++ accent that you do a disservice to both languages.
+There's no reason to insist that each class have but one constructor,
+or that a constructor be named new(), or that a constructor be
+used solely as a class method and not an object method.
+
+The next section shows how useful it can be to further distance ourselves
+from any formal distinction between class method calls and object method
+calls, both in constructors and in accessor methods.
+
+=head2 Translucent Attributes
+
+A package's eponymous hash can be used for more than just containing
+per-class, global state data. It can also serve as a sort of template
+containing default settings for object attributes. These default
+settings can then be used in constructors for initialization of a
+particular object. The class's eponymous hash can also be used to
+implement I<translucent attributes>. A translucent attribute is one
+that has a class-wide default. Each object can set its own value for the
+attribute, in which case C<< $object->attribute() >> returns that value.
+But if no value has been set, then C<< $object->attribute() >> returns
+the class-wide default.
+
+We'll apply something of a copy-on-write approach to these translucent
+attributes. If you're just fetching values from them, you get
+translucency. But if you store a new value to them, that new value is
+set on the current object. On the other hand, if you use the class as
+an object and store the attribute value directly on the class, then the
+meta-object's value changes, and later fetch operations on objects with
+uninitialized values for those attributes will retrieve the meta-object's
+new values. Objects with their own initialized values, however, won't
+see any change.
+
+Let's look at some concrete examples of using these properties before we
+show how to implement them. Suppose that a class named Some_Class
+had a translucent data attribute called "color". First you set the color
+in the meta-object, then you create three objects using a constructor
+that happens to be named &spawn.
+
+ use Vermin;
+ Vermin->color("vermilion");
+
+ $ob1 = Vermin->spawn(); # so that's where Jedi come from
+ $ob2 = Vermin->spawn();
+ $ob3 = Vermin->spawn();
+
+ print $obj3->color(); # prints "vermilion"
+
+Each of these objects' colors is now "vermilion", because that's the
+meta-object's value for that attribute, and these objects do not have
+individual color values set.
+
+Changing the attribute on one object has no effect on other objects
+previously created.
+
+ $ob3->color("chartreuse");
+ print $ob3->color(); # prints "chartreuse"
+ print $ob1->color(); # prints "vermilion", translucently
+
+If you now use $ob3 to spawn off another object, the new object will
+take the color its parent held, which now happens to be "chartreuse".
+That's because the constructor uses the invoking object as its template
+for initializing attributes. When that invoking object is the
+class name, the object used as a template is the eponymous meta-object.
+When the invoking object is a reference to an instantiated object, the
+&spawn constructor uses that existing object as a template.
+
+ $ob4 = $ob3->spawn(); # $ob3 now template, not %Vermin
+ print $ob4->color(); # prints "chartreuse"
+
+Any actual values set on the template object will be copied to the
+new object. But attributes undefined in the template object, being
+translucent, will remain undefined and consequently translucent in the
+new one as well.
+
+Now let's change the color attribute on the entire class:
+
+ Vermin->color("azure");
+ print $ob1->color(); # prints "azure"
+ print $ob2->color(); # prints "azure"
+ print $ob3->color(); # prints "chartreuse"
+ print $ob4->color(); # prints "chartreuse"
+
+That color change took effect only in the first pair of objects, which
+were still translucently accessing the meta-object's values. The second
+pair had per-object initialized colors, and so didn't change.
+
+One important question remains. Changes to the meta-object are reflected
+in translucent attributes in the entire class, but what about
+changes to discrete objects? If you change the color of $ob3, does the
+value of $ob4 see that change? Or vice-versa. If you change the color
+of $ob4, does then the value of $ob3 shift?
+
+ $ob3->color("amethyst");
+ print $ob3->color(); # prints "amethyst"
+ print $ob4->color(); # hmm: "chartreuse" or "amethyst"?
+
+While one could argue that in certain rare cases it should, let's not
+do that. Good taste aside, we want the answer to the question posed in
+the comment above to be "chartreuse", not "amethyst". So we'll treat
+these attributes similar to the way process attributes like environment
+variables, user and group IDs, or the current working directory are
+treated across a fork(). You can change only yourself, but you will see
+those changes reflected in your unspawned children. Changes to one object
+will propagate neither up to the parent nor down to any existing child objects.
+Those objects made later, however, will see the changes.
+
+If you have an object with an actual attribute value, and you want to
+make that object's attribute value translucent again, what do you do?
+Let's design the class so that when you invoke an accessor method with
+C<undef> as its argument, that attribute returns to translucency.
+
+ $ob4->color(undef); # back to "azure"
+
+Here's a complete implementation of Vermin as described above.
+
+ package Vermin;
+
+ # here's the class meta-object, eponymously named.
+ # it holds all class attributes, and also all instance attributes
+ # so the latter can be used for both initialization
+ # and translucency.
+
+ our %Vermin = ( # our() is new to perl5.6
+ PopCount => 0, # capital for class attributes
+ color => "beige", # small for instance attributes
+ );
+
+ # constructor method
+ # invoked as class method or object method
+ sub spawn {
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ my $self = {};
+ bless($self, $class);
+ $class->{PopCount}++;
+ # init fields from invoking object, or omit if
+ # invoking object is the class to provide translucency
+ %$self = %$obclass if ref $obclass;
+ return $self;
+ }
+
+ # translucent accessor for "color" attribute
+ # invoked as class method or object method
+ sub color {
+ my $self = shift;
+ my $class = ref($self) || $self;
+
+ # handle class invocation
+ unless (ref $self) {
+ $class->{color} = shift if @_;
+ return $class->{color}
+ }
+
+ # handle object invocation
+ $self->{color} = shift if @_;
+ if (defined $self->{color}) { # not exists!
+ return $self->{color};
+ } else {
+ return $class->{color};
+ }
+ }
+
+ # accessor for "PopCount" class attribute
+ # invoked as class method or object method
+ # but uses object solely to locate meta-object
+ sub population {
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ return $class->{PopCount};
+ }
+
+ # instance destructor
+ # invoked only as object method
+ sub DESTROY {
+ my $self = shift;
+ my $class = ref $self;
+ $class->{PopCount}--;
+ }
+
+Here are a couple of helper methods that might be convenient. They aren't
+accessor methods at all. They're used to detect accessibility of data
+attributes. The &is_translucent method determines whether a particular
+object attribute is coming from the meta-object. The &has_attribute
+method detects whether a class implements a particular property at all.
+It could also be used to distinguish undefined properties from non-existent
+ones.
+
+ # detect whether an object attribute is translucent
+ # (typically?) invoked only as object method
+ sub is_translucent {
+ my($self, $attr) = @_;
+ return !defined $self->{$attr};
+ }
+
+ # test for presence of attribute in class
+ # invoked as class method or object method
+ sub has_attribute {
+ my($self, $attr) = @_;
+ my $class = ref($self) || $self;
+ return exists $class->{$attr};
+ }
+
+If you prefer to install your accessors more generically, you can make
+use of the upper-case versus lower-case convention to register into the
+package appropriate methods cloned from generic closures.
+
+ for my $datum (keys %{ +__PACKAGE__ }) {
+ *$datum = ($datum =~ /^[A-Z]/)
+ ? sub { # install class accessor
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ return $class->{$datum};
+ }
+ : sub { # install translucent accessor
+ my $self = shift;
+ my $class = ref($self) || $self;
+ unless (ref $self) {
+ $class->{$datum} = shift if @_;
+ return $class->{$datum}
+ }
+ $self->{$datum} = shift if @_;
+ return defined $self->{$datum}
+ ? $self -> {$datum}
+ : $class -> {$datum}
+ }
+ }
+
+Translations of this closure-based approach into C++, Java, and Python
+have been left as exercises for the reader. Be sure to send us mail as
+soon as you're done.
+
+=head1 Class Data as Lexical Variables
+
+=head2 Privacy and Responsibility
+
+Unlike conventions used by some Perl programmers, in the previous
+examples, we didn't prefix the package variables used for class attributes
+with an underscore, nor did we do so for the names of the hash keys used
+for instance attributes. You don't need little markers on data names to
+suggest nominal privacy on attribute variables or hash keys, because these
+are B<already> notionally private! Outsiders have no business whatsoever
+playing with anything within a class save through the mediated access of
+its documented interface; in other words, through method invocations.
+And not even through just any method, either. Methods that begin with
+an underscore are traditionally considered off-limits outside the class.
+If outsiders skip the documented method interface to poke around the
+internals of your class and end up breaking something, that's not your
+fault--it's theirs.
+
+Perl believes in individual responsibility rather than mandated control.
+Perl respects you enough to let you choose your own preferred level of
+pain, or of pleasure. Perl believes that you are creative, intelligent,
+and capable of making your own decisions--and fully expects you to
+take complete responsibility for your own actions. In a perfect world,
+these admonitions alone would suffice, and everyone would be intelligent,
+responsible, happy, and creative. And careful. One probably shouldn't
+forget careful, and that's a good bit harder to expect. Even Einstein
+would take wrong turns by accident and end up lost in the wrong part
+of town.
+
+Some folks get the heebie-jeebies when they see package variables
+hanging out there for anyone to reach over and alter them. Some folks
+live in constant fear that someone somewhere might do something wicked.
+The solution to that problem is simply to fire the wicked, of course.
+But unfortunately, it's not as simple as all that. These cautious
+types are also afraid that they or others will do something not so
+much wicked as careless, whether by accident or out of desperation.
+If we fire everyone who ever gets careless, pretty soon there won't be
+anybody left to get any work done.
+
+Whether it's needless paranoia or sensible caution, this uneasiness can
+be a problem for some people. We can take the edge off their discomfort
+by providing the option of storing class attributes as lexical variables
+instead of as package variables. The my() operator is the source of
+all privacy in Perl, and it is a powerful form of privacy indeed.
+
+It is widely perceived, and indeed has often been written, that Perl
+provides no data hiding, that it affords the class designer no privacy
+nor isolation, merely a rag-tag assortment of weak and unenforceable
+social conventions instead. This perception is demonstrably false and
+easily disproven. In the next section, we show how to implement forms
+of privacy that are far stronger than those provided in nearly any
+other object-oriented language.
+
+=head2 File-Scoped Lexicals
+
+A lexical variable is visible only through the end of its static scope.
+That means that the only code able to access that variable is code
+residing textually below the my() operator through the end of its block
+if it has one, or through the end of the current file if it doesn't.
+
+Starting again with our simplest example given at the start of this
+document, we replace our() variables with my() versions.
+
+ package Some_Class;
+ my($CData1, $CData2); # file scope, not in any package
+ sub CData1 {
+ shift; # XXX: ignore calling class/object
+ $CData1 = shift if @_;
+ return $CData1;
+ }
+ sub CData2 {
+ shift; # XXX: ignore calling class/object
+ $CData2 = shift if @_;
+ return $CData2;
+ }
+
+So much for that old $Some_Class::CData1 package variable and its brethren!
+Those are gone now, replaced with lexicals. No one outside the
+scope can reach in and alter the class state without resorting to the
+documented interface. Not even subclasses or superclasses of
+this one have unmediated access to $CData1. They have to invoke the &CData1
+method against Some_Class or an instance thereof, just like anybody else.
+
+To be scrupulously honest, that last statement assumes you haven't packed
+several classes together into the same file scope, nor strewn your class
+implementation across several different files. Accessibility of those
+variables is based uniquely on the static file scope. It has nothing to
+do with the package. That means that code in a different file but
+the same package (class) could not access those variables, yet code in the
+same file but a different package (class) could. There are sound reasons
+why we usually suggest a one-to-one mapping between files and packages
+and modules and classes. You don't have to stick to this suggestion if
+you really know what you're doing, but you're apt to confuse yourself
+otherwise, especially at first.
+
+If you'd like to aggregate your class attributes into one lexically scoped,
+composite structure, you're perfectly free to do so.
+
+ package Some_Class;
+ my %ClassData = (
+ CData1 => "",
+ CData2 => "",
+ );
+ sub CData1 {
+ shift; # XXX: ignore calling class/object
+ $ClassData{CData1} = shift if @_;
+ return $ClassData{CData1};
+ }
+ sub CData2 {
+ shift; # XXX: ignore calling class/object
+ $ClassData{CData2} = shift if @_;
+ return $ClassData{CData2};
+ }
+
+To make this more scalable as other class attributes are added, we can
+again register closures into the package symbol table to create accessor
+methods for them.
+
+ package Some_Class;
+ my %ClassData = (
+ CData1 => "",
+ CData2 => "",
+ );
+ for my $datum (keys %ClassData) {
+ no strict "refs";
+ *$datum = sub {
+ shift; # XXX: ignore calling class/object
+ $ClassData{$datum} = shift if @_;
+ return $ClassData{$datum};
+ };
+ }
+
+Requiring even your own class to use accessor methods like anybody else is
+probably a good thing. But demanding and expecting that everyone else,
+be they subclass or superclass, friend or foe, will all come to your
+object through mediation is more than just a good idea. It's absolutely
+critical to the model. Let there be in your mind no such thing as
+"public" data, nor even "protected" data, which is a seductive but
+ultimately destructive notion. Both will come back to bite at you.
+That's because as soon as you take that first step out of the solid
+position in which all state is considered completely private, save from the
+perspective of its own accessor methods, you have violated the envelope.
+And, having pierced that encapsulating envelope, you shall doubtless
+someday pay the price when future changes in the implementation break
+unrelated code. Considering that avoiding this infelicitous outcome was
+precisely why you consented to suffer the slings and arrows of obsequious
+abstraction by turning to object orientation in the first place, such
+breakage seems unfortunate in the extreme.
+
+=head2 More Inheritance Concerns
+
+Suppose that Some_Class were used as a base class from which to derive
+Another_Class. If you invoke a &CData method on the derived class or
+on an object of that class, what do you get? Would the derived class
+have its own state, or would it piggyback on its base class's versions
+of the class attributes?
+
+The answer is that under the scheme outlined above, the derived class
+would B<not> have its own state data. As before, whether you consider
+this a good thing or a bad one depends on the semantics of the classes
+involved.
+
+The cleanest, sanest, simplest way to address per-class state in a
+lexical is for the derived class to override its base class's version
+of the method that accesses the class attributes. Since the actual method
+called is the one in the object's derived class if this exists, you
+automatically get per-class state this way. Any urge to provide an
+unadvertised method to sneak out a reference to the %ClassData hash
+should be strenuously resisted.
+
+As with any other overridden method, the implementation in the
+derived class always has the option of invoking its base class's
+version of the method in addition to its own. Here's an example:
+
+ package Another_Class;
+ @ISA = qw(Some_Class);
+
+ my %ClassData = (
+ CData1 => "",
+ );
+
+ sub CData1 {
+ my($self, $newvalue) = @_;
+ if (@_ > 1) {
+ # set locally first
+ $ClassData{CData1} = $newvalue;
+
+ # then pass the buck up to the first
+ # overridden version, if there is one
+ if ($self->can("SUPER::CData1")) {
+ $self->SUPER::CData1($newvalue);
+ }
+ }
+ return $ClassData{CData1};
+ }
+
+Those dabbling in multiple inheritance might be concerned
+about there being more than one override.
+
+ for my $parent (@ISA) {
+ my $methname = $parent . "::CData1";
+ if ($self->can($methname)) {
+ $self->$methname($newvalue);
+ }
+ }
+
+Because the &UNIVERSAL::can method returns a reference
+to the function directly, you can use this directly
+for a significant performance improvement:
+
+ for my $parent (@ISA) {
+ if (my $coderef = $self->can($parent . "::CData1")) {
+ $self->$coderef($newvalue);
+ }
+ }
+
+If you override C<UNIVERSAL::can> in your own classes, be sure to return the
+reference appropriately.
+
+=head2 Locking the Door and Throwing Away the Key
+
+As currently implemented, any code within the same scope as the
+file-scoped lexical %ClassData can alter that hash directly. Is that
+ok? Is it acceptable or even desirable to allow other parts of the
+implementation of this class to access class attributes directly?
+
+That depends on how careful you want to be. Think back to the Cosmos
+class. If the &supernova method had directly altered $Cosmos::Stars or
+C<$Cosmos::Cosmos{stars}>, then we wouldn't have been able to reuse the
+class when it came to inventing a Multiverse. So letting even the class
+itself access its own class attributes without the mediating intervention of
+properly designed accessor methods is probably not a good idea after all.
+
+Restricting access to class attributes from the class itself is usually
+not enforceable even in strongly object-oriented languages. But in Perl,
+you can.
+
+Here's one way:
+
+ package Some_Class;
+
+ { # scope for hiding $CData1
+ my $CData1;
+ sub CData1 {
+ shift; # XXX: unused
+ $CData1 = shift if @_;
+ return $CData1;
+ }
+ }
+
+ { # scope for hiding $CData2
+ my $CData2;
+ sub CData2 {
+ shift; # XXX: unused
+ $CData2 = shift if @_;
+ return $CData2;
+ }
+ }
+
+No one--absolutely no one--is allowed to read or write the class
+attributes without the mediation of the managing accessor method, since
+only that method has access to the lexical variable it's managing.
+This use of mediated access to class attributes is a form of privacy far
+stronger than most OO languages provide.
+
+The repetition of code used to create per-datum accessor methods chafes
+at our Laziness, so we'll again use closures to create similar
+methods.
+
+ package Some_Class;
+
+ { # scope for ultra-private meta-object for class attributes
+ my %ClassData = (
+ CData1 => "",
+ CData2 => "",
+ );
+
+ for my $datum (keys %ClassData ) {
+ no strict "refs";
+ *$datum = sub {
+ use strict "refs";
+ my ($self, $newvalue) = @_;
+ $ClassData{$datum} = $newvalue if @_ > 1;
+ return $ClassData{$datum};
+ }
+ }
+
+ }
+
+The closure above can be modified to take inheritance into account using
+the &UNIVERSAL::can method and SUPER as shown previously.
+
+=head2 Translucency Revisited
+
+The Vermin class demonstrates translucency using a package variable,
+eponymously named %Vermin, as its meta-object. If you prefer to
+use absolutely no package variables beyond those necessary to appease
+inheritance or possibly the Exporter, this strategy is closed to you.
+That's too bad, because translucent attributes are an appealing
+technique, so it would be valuable to devise an implementation using
+only lexicals.
+
+There's a second reason why you might wish to avoid the eponymous
+package hash. If you use class names with double-colons in them, you
+would end up poking around somewhere you might not have meant to poke.
+
+ package Vermin;
+ $class = "Vermin";
+ $class->{PopCount}++;
+ # accesses $Vermin::Vermin{PopCount}
+
+ package Vermin::Noxious;
+ $class = "Vermin::Noxious";
+ $class->{PopCount}++;
+ # accesses $Vermin::Noxious{PopCount}
+
+In the first case, because the class name had no double-colons, we got
+the hash in the current package. But in the second case, instead of
+getting some hash in the current package, we got the hash %Noxious in
+the Vermin package. (The noxious vermin just invaded another package and
+sprayed their data around it. :-) Perl doesn't support relative packages
+in its naming conventions, so any double-colons trigger a fully-qualified
+lookup instead of just looking in the current package.
+
+In practice, it is unlikely that the Vermin class had an existing
+package variable named %Noxious that you just blew away. If you're
+still mistrustful, you could always stake out your own territory
+where you know the rules, such as using Eponymous::Vermin::Noxious or
+Hieronymus::Vermin::Boschious or Leave_Me_Alone::Vermin::Noxious as class
+names instead. Sure, it's in theory possible that someone else has
+a class named Eponymous::Vermin with its own %Noxious hash, but this
+kind of thing is always true. There's no arbiter of package names.
+It's always the case that globals like @Cwd::ISA would collide if more
+than one class uses the same Cwd package.
+
+If this still leaves you with an uncomfortable twinge of paranoia,
+we have another solution for you. There's nothing that says that you
+have to have a package variable to hold a class meta-object, either for
+monadic classes or for translucent attributes. Just code up the methods
+so that they access a lexical instead.
+
+Here's another implementation of the Vermin class with semantics identical
+to those given previously, but this time using no package variables.
+
+ package Vermin;
+
+
+ # Here's the class meta-object, eponymously named.
+ # It holds all class data, and also all instance data
+ # so the latter can be used for both initialization
+ # and translucency. it's a template.
+ my %ClassData = (
+ PopCount => 0, # capital for class attributes
+ color => "beige", # small for instance attributes
+ );
+
+ # constructor method
+ # invoked as class method or object method
+ sub spawn {
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ my $self = {};
+ bless($self, $class);
+ $ClassData{PopCount}++;
+ # init fields from invoking object, or omit if
+ # invoking object is the class to provide translucency
+ %$self = %$obclass if ref $obclass;
+ return $self;
+ }
+
+ # translucent accessor for "color" attribute
+ # invoked as class method or object method
+ sub color {
+ my $self = shift;
+
+ # handle class invocation
+ unless (ref $self) {
+ $ClassData{color} = shift if @_;
+ return $ClassData{color}
+ }
+
+ # handle object invocation
+ $self->{color} = shift if @_;
+ if (defined $self->{color}) { # not exists!
+ return $self->{color};
+ } else {
+ return $ClassData{color};
+ }
+ }
+
+ # class attribute accessor for "PopCount" attribute
+ # invoked as class method or object method
+ sub population {
+ return $ClassData{PopCount};
+ }
+
+ # instance destructor; invoked only as object method
+ sub DESTROY {
+ $ClassData{PopCount}--;
+ }
+
+ # detect whether an object attribute is translucent
+ # (typically?) invoked only as object method
+ sub is_translucent {
+ my($self, $attr) = @_;
+ $self = \%ClassData if !ref $self;
+ return !defined $self->{$attr};
+ }
+
+ # test for presence of attribute in class
+ # invoked as class method or object method
+ sub has_attribute {
+ my($self, $attr) = @_;
+ return exists $ClassData{$attr};
+ }
+
+=head1 NOTES
+
+Inheritance is a powerful but subtle device, best used only after careful
+forethought and design. Aggregation instead of inheritance is often a
+better approach.
+
+You can't use file-scoped lexicals in conjunction with the SelfLoader
+or the AutoLoader, because they alter the lexical scope in which the
+module's methods wind up getting compiled.
+
+The usual mealy-mouthed package-munging doubtless applies to setting
+up names of object attributes. For example, C<< $self->{ObData1} >>
+should probably be C<< $self->{ __PACKAGE__ . "_ObData1" } >>, but that
+would just confuse the examples.
+
+=head1 SEE ALSO
+
+L<perltoot>, L<perlobj>, L<perlmod>, and L<perlbot>.
+
+The Tie::SecureHash and Class::Data::Inheritable modules from CPAN are
+worth checking out.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1999 Tom Christiansen.
+All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain. You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit. A simple comment in the code giving
+credit would be courteous but is not required.
+
+=head1 ACKNOWLEDGEMENTS
+
+Russ Allbery, Jon Orwant, Randy Ray, Larry Rosler, Nat Torkington,
+and Stephen Warren all contributed suggestions and corrections to this
+piece. Thanks especially to Damian Conway for his ideas and feedback,
+and without whose indirect prodding I might never have taken the time
+to show others how much Perl has to offer in the way of objects once
+you start thinking outside the tiny little box that today's "popular"
+object-oriented languages enforce.
+
+=head1 HISTORY
+
+Last edit: Sun Feb 4 20:50:28 EST 2001
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perltoot.pod b/Master/tlpkg/tlperl.straw/lib/pods/perltoot.pod
new file mode 100755
index 00000000000..5180306688a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perltoot.pod
@@ -0,0 +1,1836 @@
+=head1 NAME
+
+perltoot - Tom's object-oriented tutorial for perl
+
+=head1 DESCRIPTION
+
+Object-oriented programming is a big seller these days. Some managers
+would rather have objects than sliced bread. Why is that? What's so
+special about an object? Just what I<is> an object anyway?
+
+An object is nothing but a way of tucking away complex behaviours into
+a neat little easy-to-use bundle. (This is what professors call
+abstraction.) Smart people who have nothing to do but sit around for
+weeks on end figuring out really hard problems make these nifty
+objects that even regular people can use. (This is what professors call
+software reuse.) Users (well, programmers) can play with this little
+bundle all they want, but they aren't to open it up and mess with the
+insides. Just like an expensive piece of hardware, the contract says
+that you void the warranty if you muck with the cover. So don't do that.
+
+The heart of objects is the class, a protected little private namespace
+full of data and functions. A class is a set of related routines that
+addresses some problem area. You can think of it as a user-defined type.
+The Perl package mechanism, also used for more traditional modules,
+is used for class modules as well. Objects "live" in a class, meaning
+that they belong to some package.
+
+More often than not, the class provides the user with little bundles.
+These bundles are objects. They know whose class they belong to,
+and how to behave. Users ask the class to do something, like "give
+me an object." Or they can ask one of these objects to do something.
+Asking a class to do something for you is calling a I<class method>.
+Asking an object to do something for you is calling an I<object method>.
+Asking either a class (usually) or an object (sometimes) to give you
+back an object is calling a I<constructor>, which is just a
+kind of method.
+
+That's all well and good, but how is an object different from any other
+Perl data type? Just what is an object I<really>; that is, what's its
+fundamental type? The answer to the first question is easy. An object
+is different from any other data type in Perl in one and only one way:
+you may dereference it using not merely string or numeric subscripts
+as with simple arrays and hashes, but with named subroutine calls.
+In a word, with I<methods>.
+
+The answer to the second question is that it's a reference, and not just
+any reference, mind you, but one whose referent has been I<bless>()ed
+into a particular class (read: package). What kind of reference? Well,
+the answer to that one is a bit less concrete. That's because in Perl
+the designer of the class can employ any sort of reference they'd like
+as the underlying intrinsic data type. It could be a scalar, an array,
+or a hash reference. It could even be a code reference. But because
+of its inherent flexibility, an object is usually a hash reference.
+
+=head1 Creating a Class
+
+Before you create a class, you need to decide what to name it. That's
+because the class (package) name governs the name of the file used to
+house it, just as with regular modules. Then, that class (package)
+should provide one or more ways to generate objects. Finally, it should
+provide mechanisms to allow users of its objects to indirectly manipulate
+these objects from a distance.
+
+For example, let's make a simple Person class module. It gets stored in
+the file Person.pm. If it were called a Happy::Person class, it would
+be stored in the file Happy/Person.pm, and its package would become
+Happy::Person instead of just Person. (On a personal computer not
+running Unix or Plan 9, but something like Mac OS or VMS, the directory
+separator may be different, but the principle is the same.) Do not assume
+any formal relationship between modules based on their directory names.
+This is merely a grouping convenience, and has no effect on inheritance,
+variable accessibility, or anything else.
+
+For this module we aren't going to use Exporter, because we're
+a well-behaved class module that doesn't export anything at all.
+In order to manufacture objects, a class needs to have a I<constructor
+method>. A constructor gives you back not just a regular data type,
+but a brand-new object in that class. This magic is taken care of by
+the bless() function, whose sole purpose is to enable its referent to
+be used as an object. Remember: being an object really means nothing
+more than that methods may now be called against it.
+
+While a constructor may be named anything you'd like, most Perl
+programmers seem to like to call theirs new(). However, new() is not
+a reserved word, and a class is under no obligation to supply such.
+Some programmers have also been known to use a function with
+the same name as the class as the constructor.
+
+=head2 Object Representation
+
+By far the most common mechanism used in Perl to represent a Pascal
+record, a C struct, or a C++ class is an anonymous hash. That's because a
+hash has an arbitrary number of data fields, each conveniently accessed by
+an arbitrary name of your own devising.
+
+If you were just doing a simple
+struct-like emulation, you would likely go about it something like this:
+
+ $rec = {
+ name => "Jason",
+ age => 23,
+ peers => [ "Norbert", "Rhys", "Phineas"],
+ };
+
+If you felt like it, you could add a bit of visual distinction
+by up-casing the hash keys:
+
+ $rec = {
+ NAME => "Jason",
+ AGE => 23,
+ PEERS => [ "Norbert", "Rhys", "Phineas"],
+ };
+
+And so you could get at C<< $rec->{NAME} >> to find "Jason", or
+C<< @{ $rec->{PEERS} } >> to get at "Norbert", "Rhys", and "Phineas".
+(Have you ever noticed how many 23-year-old programmers seem to
+be named "Jason" these days? :-)
+
+This same model is often used for classes, although it is not considered
+the pinnacle of programming propriety for folks from outside the
+class to come waltzing into an object, brazenly accessing its data
+members directly. Generally speaking, an object should be considered
+an opaque cookie that you use I<object methods> to access. Visually,
+methods look like you're dereffing a reference using a function name
+instead of brackets or braces.
+
+=head2 Class Interface
+
+Some languages provide a formal syntactic interface to a class's methods,
+but Perl does not. It relies on you to read the documentation of each
+class. If you try to call an undefined method on an object, Perl won't
+complain, but the program will trigger an exception while it's running.
+Likewise, if you call a method expecting a prime number as its argument
+with a non-prime one instead, you can't expect the compiler to catch this.
+(Well, you can expect it all you like, but it's not going to happen.)
+
+Let's suppose you have a well-educated user of your Person class,
+someone who has read the docs that explain the prescribed
+interface. Here's how they might use the Person class:
+
+ use Person;
+
+ $him = Person->new();
+ $him->name("Jason");
+ $him->age(23);
+ $him->peers( "Norbert", "Rhys", "Phineas" );
+
+ push @All_Recs, $him; # save object in array for later
+
+ printf "%s is %d years old.\n", $him->name, $him->age;
+ print "His peers are: ", join(", ", $him->peers), "\n";
+
+ printf "Last rec's name is %s\n", $All_Recs[-1]->name;
+
+As you can see, the user of the class doesn't know (or at least, has no
+business paying attention to the fact) that the object has one particular
+implementation or another. The interface to the class and its objects
+is exclusively via methods, and that's all the user of the class should
+ever play with.
+
+=head2 Constructors and Instance Methods
+
+Still, I<someone> has to know what's in the object. And that someone is
+the class. It implements methods that the programmer uses to access
+the object. Here's how to implement the Person class using the standard
+hash-ref-as-an-object idiom. We'll make a class method called new() to
+act as the constructor, and three object methods called name(), age(), and
+peers() to get at per-object data hidden away in our anonymous hash.
+
+ package Person;
+ use strict;
+
+ ##################################################
+ ## the object constructor (simplistic version) ##
+ ##################################################
+ sub new {
+ my $self = {};
+ $self->{NAME} = undef;
+ $self->{AGE} = undef;
+ $self->{PEERS} = [];
+ bless($self); # but see below
+ return $self;
+ }
+
+ ##############################################
+ ## methods to access per-object data ##
+ ## ##
+ ## With args, they set the value. Without ##
+ ## any, they only retrieve it/them. ##
+ ##############################################
+
+ sub name {
+ my $self = shift;
+ if (@_) { $self->{NAME} = shift }
+ return $self->{NAME};
+ }
+
+ sub age {
+ my $self = shift;
+ if (@_) { $self->{AGE} = shift }
+ return $self->{AGE};
+ }
+
+ sub peers {
+ my $self = shift;
+ if (@_) { @{ $self->{PEERS} } = @_ }
+ return @{ $self->{PEERS} };
+ }
+
+ 1; # so the require or use succeeds
+
+We've created three methods to access an object's data, name(), age(),
+and peers(). These are all substantially similar. If called with an
+argument, they set the appropriate field; otherwise they return the
+value held by that field, meaning the value of that hash key.
+
+=head2 Planning for the Future: Better Constructors
+
+Even though at this point you may not even know what it means, someday
+you're going to worry about inheritance. (You can safely ignore this
+for now and worry about it later if you'd like.) To ensure that this
+all works out smoothly, you must use the double-argument form of bless().
+The second argument is the class into which the referent will be blessed.
+By not assuming our own class as the default second argument and instead
+using the class passed into us, we make our constructor inheritable.
+
+ sub new {
+ my $class = shift;
+ my $self = {};
+ $self->{NAME} = undef;
+ $self->{AGE} = undef;
+ $self->{PEERS} = [];
+ bless ($self, $class);
+ return $self;
+ }
+
+That's about all there is for constructors. These methods bring objects
+to life, returning neat little opaque bundles to the user to be used in
+subsequent method calls.
+
+=head2 Destructors
+
+Every story has a beginning and an end. The beginning of the object's
+story is its constructor, explicitly called when the object comes into
+existence. But the ending of its story is the I<destructor>, a method
+implicitly called when an object leaves this life. Any per-object
+clean-up code is placed in the destructor, which must (in Perl) be called
+DESTROY.
+
+If constructors can have arbitrary names, then why not destructors?
+Because while a constructor is explicitly called, a destructor is not.
+Destruction happens automatically via Perl's garbage collection (GC)
+system, which is a quick but somewhat lazy reference-based GC system.
+To know what to call, Perl insists that the destructor be named DESTROY.
+Perl's notion of the right time to call a destructor is not well-defined
+currently, which is why your destructors should not rely on when they are
+called.
+
+Why is DESTROY in all caps? Perl on occasion uses purely uppercase
+function names as a convention to indicate that the function will
+be automatically called by Perl in some way. Others that are called
+implicitly include BEGIN, END, AUTOLOAD, plus all methods used by
+tied objects, described in L<perltie>.
+
+In really good object-oriented programming languages, the user doesn't
+care when the destructor is called. It just happens when it's supposed
+to. In low-level languages without any GC at all, there's no way to
+depend on this happening at the right time, so the programmer must
+explicitly call the destructor to clean up memory and state, crossing
+their fingers that it's the right time to do so. Unlike C++, an
+object destructor is nearly never needed in Perl, and even when it is,
+explicit invocation is uncalled for. In the case of our Person class,
+we don't need a destructor because Perl takes care of simple matters
+like memory deallocation.
+
+The only situation where Perl's reference-based GC won't work is
+when there's a circularity in the data structure, such as:
+
+ $this->{WHATEVER} = $this;
+
+In that case, you must delete the self-reference manually if you expect
+your program not to leak memory. While admittedly error-prone, this is
+the best we can do right now. Nonetheless, rest assured that when your
+program is finished, its objects' destructors are all duly called.
+So you are guaranteed that an object I<eventually> gets properly
+destroyed, except in the unique case of a program that never exits.
+(If you're running Perl embedded in another application, this full GC
+pass happens a bit more frequently--whenever a thread shuts down.)
+
+=head2 Other Object Methods
+
+The methods we've talked about so far have either been constructors or
+else simple "data methods", interfaces to data stored in the object.
+These are a bit like an object's data members in the C++ world, except
+that strangers don't access them as data. Instead, they should only
+access the object's data indirectly via its methods. This is an
+important rule: in Perl, access to an object's data should I<only>
+be made through methods.
+
+Perl doesn't impose restrictions on who gets to use which methods.
+The public-versus-private distinction is by convention, not syntax.
+(Well, unless you use the Alias module described below in
+L<Data Members as Variables>.) Occasionally you'll see method names beginning or ending
+with an underscore or two. This marking is a convention indicating
+that the methods are private to that class alone and sometimes to its
+closest acquaintances, its immediate subclasses. But this distinction
+is not enforced by Perl itself. It's up to the programmer to behave.
+
+There's no reason to limit methods to those that simply access data.
+Methods can do anything at all. The key point is that they're invoked
+against an object or a class. Let's say we'd like object methods that
+do more than fetch or set one particular field.
+
+ sub exclaim {
+ my $self = shift;
+ return sprintf "Hi, I'm %s, age %d, working with %s",
+ $self->{NAME}, $self->{AGE}, join(", ", @{$self->{PEERS}});
+ }
+
+Or maybe even one like this:
+
+ sub happy_birthday {
+ my $self = shift;
+ return ++$self->{AGE};
+ }
+
+Some might argue that one should go at these this way:
+
+ sub exclaim {
+ my $self = shift;
+ return sprintf "Hi, I'm %s, age %d, working with %s",
+ $self->name, $self->age, join(", ", $self->peers);
+ }
+
+ sub happy_birthday {
+ my $self = shift;
+ return $self->age( $self->age() + 1 );
+ }
+
+But since these methods are all executing in the class itself, this
+may not be critical. There are tradeoffs to be made. Using direct
+hash access is faster (about an order of magnitude faster, in fact), and
+it's more convenient when you want to interpolate in strings. But using
+methods (the external interface) internally shields not just the users of
+your class but even you yourself from changes in your data representation.
+
+=head1 Class Data
+
+What about "class data", data items common to each object in a class?
+What would you want that for? Well, in your Person class, you might
+like to keep track of the total people alive. How do you implement that?
+
+You I<could> make it a global variable called $Person::Census. But about
+only reason you'd do that would be if you I<wanted> people to be able to
+get at your class data directly. They could just say $Person::Census
+and play around with it. Maybe this is ok in your design scheme.
+You might even conceivably want to make it an exported variable. To be
+exportable, a variable must be a (package) global. If this were a
+traditional module rather than an object-oriented one, you might do that.
+
+While this approach is expected in most traditional modules, it's
+generally considered rather poor form in most object modules. In an
+object module, you should set up a protective veil to separate interface
+from implementation. So provide a class method to access class data
+just as you provide object methods to access object data.
+
+So, you I<could> still keep $Census as a package global and rely upon
+others to honor the contract of the module and therefore not play around
+with its implementation. You could even be supertricky and make $Census a
+tied object as described in L<perltie>, thereby intercepting all accesses.
+
+But more often than not, you just want to make your class data a
+file-scoped lexical. To do so, simply put this at the top of the file:
+
+ my $Census = 0;
+
+Even though the scope of a my() normally expires when the block in which
+it was declared is done (in this case the whole file being required or
+used), Perl's deep binding of lexical variables guarantees that the
+variable will not be deallocated, remaining accessible to functions
+declared within that scope. This doesn't work with global variables
+given temporary values via local(), though.
+
+Irrespective of whether you leave $Census a package global or make
+it instead a file-scoped lexical, you should make these
+changes to your Person::new() constructor:
+
+ sub new {
+ my $class = shift;
+ my $self = {};
+ $Census++;
+ $self->{NAME} = undef;
+ $self->{AGE} = undef;
+ $self->{PEERS} = [];
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub population {
+ return $Census;
+ }
+
+Now that we've done this, we certainly do need a destructor so that
+when Person is destroyed, the $Census goes down. Here's how
+this could be done:
+
+ sub DESTROY { --$Census }
+
+Notice how there's no memory to deallocate in the destructor? That's
+something that Perl takes care of for you all by itself.
+
+Alternatively, you could use the Class::Data::Inheritable module from
+CPAN.
+
+
+=head2 Accessing Class Data
+
+It turns out that this is not really a good way to go about handling
+class data. A good scalable rule is that I<you must never reference class
+data directly from an object method>. Otherwise you aren't building a
+scalable, inheritable class. The object must be the rendezvous point
+for all operations, especially from an object method. The globals
+(class data) would in some sense be in the "wrong" package in your
+derived classes. In Perl, methods execute in the context of the class
+they were defined in, I<not> that of the object that triggered them.
+Therefore, namespace visibility of package globals in methods is unrelated
+to inheritance.
+
+Got that? Maybe not. Ok, let's say that some other class "borrowed"
+(well, inherited) the DESTROY method as it was defined above. When those
+objects are destroyed, the original $Census variable will be altered,
+not the one in the new class's package namespace. Perhaps this is what
+you want, but probably it isn't.
+
+Here's how to fix this. We'll store a reference to the data in the
+value accessed by the hash key "_CENSUS". Why the underscore? Well,
+mostly because an initial underscore already conveys strong feelings
+of magicalness to a C programmer. It's really just a mnemonic device
+to remind ourselves that this field is special and not to be used as
+a public data member in the same way that NAME, AGE, and PEERS are.
+(Because we've been developing this code under the strict pragma, prior
+to perl version 5.004 we'll have to quote the field name.)
+
+ sub new {
+ my $class = shift;
+ my $self = {};
+ $self->{NAME} = undef;
+ $self->{AGE} = undef;
+ $self->{PEERS} = [];
+ # "private" data
+ $self->{"_CENSUS"} = \$Census;
+ bless ($self, $class);
+ ++ ${ $self->{"_CENSUS"} };
+ return $self;
+ }
+
+ sub population {
+ my $self = shift;
+ if (ref $self) {
+ return ${ $self->{"_CENSUS"} };
+ } else {
+ return $Census;
+ }
+ }
+
+ sub DESTROY {
+ my $self = shift;
+ -- ${ $self->{"_CENSUS"} };
+ }
+
+=head2 Debugging Methods
+
+It's common for a class to have a debugging mechanism. For example,
+you might want to see when objects are created or destroyed. To do that,
+add a debugging variable as a file-scoped lexical. For this, we'll pull
+in the standard Carp module to emit our warnings and fatal messages.
+That way messages will come out with the caller's filename and
+line number instead of our own; if we wanted them to be from our own
+perspective, we'd just use die() and warn() directly instead of croak()
+and carp() respectively.
+
+ use Carp;
+ my $Debugging = 0;
+
+Now add a new class method to access the variable.
+
+ sub debug {
+ my $class = shift;
+ if (ref $class) { confess "Class method called as object method" }
+ unless (@_ == 1) { confess "usage: CLASSNAME->debug(level)" }
+ $Debugging = shift;
+ }
+
+Now fix up DESTROY to murmur a bit as the moribund object expires:
+
+ sub DESTROY {
+ my $self = shift;
+ if ($Debugging) { carp "Destroying $self " . $self->name }
+ -- ${ $self->{"_CENSUS"} };
+ }
+
+One could conceivably make a per-object debug state. That
+way you could call both of these:
+
+ Person->debug(1); # entire class
+ $him->debug(1); # just this object
+
+To do so, we need our debugging method to be a "bimodal" one, one that
+works on both classes I<and> objects. Therefore, adjust the debug()
+and DESTROY methods as follows:
+
+ sub debug {
+ my $self = shift;
+ confess "usage: thing->debug(level)" unless @_ == 1;
+ my $level = shift;
+ if (ref($self)) {
+ $self->{"_DEBUG"} = $level; # just myself
+ } else {
+ $Debugging = $level; # whole class
+ }
+ }
+
+ sub DESTROY {
+ my $self = shift;
+ if ($Debugging || $self->{"_DEBUG"}) {
+ carp "Destroying $self " . $self->name;
+ }
+ -- ${ $self->{"_CENSUS"} };
+ }
+
+What happens if a derived class (which we'll call Employee) inherits
+methods from this Person base class? Then C<< Employee->debug() >>, when called
+as a class method, manipulates $Person::Debugging not $Employee::Debugging.
+
+=head2 Class Destructors
+
+The object destructor handles the death of each distinct object. But sometimes
+you want a bit of cleanup when the entire class is shut down, which
+currently only happens when the program exits. To make such a
+I<class destructor>, create a function in that class's package named
+END. This works just like the END function in traditional modules,
+meaning that it gets called whenever your program exits unless it execs
+or dies of an uncaught signal. For example,
+
+ sub END {
+ if ($Debugging) {
+ print "All persons are going away now.\n";
+ }
+ }
+
+When the program exits, all the class destructors (END functions) are
+be called in the opposite order that they were loaded in (LIFO order).
+
+=head2 Documenting the Interface
+
+And there you have it: we've just shown you the I<implementation> of this
+Person class. Its I<interface> would be its documentation. Usually this
+means putting it in pod ("plain old documentation") format right there
+in the same file. In our Person example, we would place the following
+docs anywhere in the Person.pm file. Even though it looks mostly like
+code, it's not. It's embedded documentation such as would be used by
+the pod2man, pod2html, or pod2text programs. The Perl compiler ignores
+pods entirely, just as the translators ignore code. Here's an example of
+some pods describing the informal interface:
+
+ =head1 NAME
+
+ Person - class to implement people
+
+ =head1 SYNOPSIS
+
+ use Person;
+
+ #################
+ # class methods #
+ #################
+ $ob = Person->new;
+ $count = Person->population;
+
+ #######################
+ # object data methods #
+ #######################
+
+ ### get versions ###
+ $who = $ob->name;
+ $years = $ob->age;
+ @pals = $ob->peers;
+
+ ### set versions ###
+ $ob->name("Jason");
+ $ob->age(23);
+ $ob->peers( "Norbert", "Rhys", "Phineas" );
+
+ ########################
+ # other object methods #
+ ########################
+
+ $phrase = $ob->exclaim;
+ $ob->happy_birthday;
+
+ =head1 DESCRIPTION
+
+ The Person class implements dah dee dah dee dah....
+
+That's all there is to the matter of interface versus implementation.
+A programmer who opens up the module and plays around with all the private
+little shiny bits that were safely locked up behind the interface contract
+has voided the warranty, and you shouldn't worry about their fate.
+
+=head1 Aggregation
+
+Suppose you later want to change the class to implement better names.
+Perhaps you'd like to support both given names (called Christian names,
+irrespective of one's religion) and family names (called surnames), plus
+nicknames and titles. If users of your Person class have been properly
+accessing it through its documented interface, then you can easily change
+the underlying implementation. If they haven't, then they lose and
+it's their fault for breaking the contract and voiding their warranty.
+
+To do this, we'll make another class, this one called Fullname. What's
+the Fullname class look like? To answer that question, you have to
+first figure out how you want to use it. How about we use it this way:
+
+ $him = Person->new();
+ $him->fullname->title("St");
+ $him->fullname->christian("Thomas");
+ $him->fullname->surname("Aquinas");
+ $him->fullname->nickname("Tommy");
+ printf "His normal name is %s\n", $him->name;
+ printf "But his real name is %s\n", $him->fullname->as_string;
+
+Ok. To do this, we'll change Person::new() so that it supports
+a full name field this way:
+
+ sub new {
+ my $class = shift;
+ my $self = {};
+ $self->{FULLNAME} = Fullname->new();
+ $self->{AGE} = undef;
+ $self->{PEERS} = [];
+ $self->{"_CENSUS"} = \$Census;
+ bless ($self, $class);
+ ++ ${ $self->{"_CENSUS"} };
+ return $self;
+ }
+
+ sub fullname {
+ my $self = shift;
+ return $self->{FULLNAME};
+ }
+
+Then to support old code, define Person::name() this way:
+
+ sub name {
+ my $self = shift;
+ return $self->{FULLNAME}->nickname(@_)
+ || $self->{FULLNAME}->christian(@_);
+ }
+
+Here's the Fullname class. We'll use the same technique
+of using a hash reference to hold data fields, and methods
+by the appropriate name to access them:
+
+ package Fullname;
+ use strict;
+
+ sub new {
+ my $class = shift;
+ my $self = {
+ TITLE => undef,
+ CHRISTIAN => undef,
+ SURNAME => undef,
+ NICK => undef,
+ };
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub christian {
+ my $self = shift;
+ if (@_) { $self->{CHRISTIAN} = shift }
+ return $self->{CHRISTIAN};
+ }
+
+ sub surname {
+ my $self = shift;
+ if (@_) { $self->{SURNAME} = shift }
+ return $self->{SURNAME};
+ }
+
+ sub nickname {
+ my $self = shift;
+ if (@_) { $self->{NICK} = shift }
+ return $self->{NICK};
+ }
+
+ sub title {
+ my $self = shift;
+ if (@_) { $self->{TITLE} = shift }
+ return $self->{TITLE};
+ }
+
+ sub as_string {
+ my $self = shift;
+ my $name = join(" ", @$self{'CHRISTIAN', 'SURNAME'});
+ if ($self->{TITLE}) {
+ $name = $self->{TITLE} . " " . $name;
+ }
+ return $name;
+ }
+
+ 1;
+
+Finally, here's the test program:
+
+ #!/usr/bin/perl -w
+ use strict;
+ use Person;
+ sub END { show_census() }
+
+ sub show_census () {
+ printf "Current population: %d\n", Person->population;
+ }
+
+ Person->debug(1);
+
+ show_census();
+
+ my $him = Person->new();
+
+ $him->fullname->christian("Thomas");
+ $him->fullname->surname("Aquinas");
+ $him->fullname->nickname("Tommy");
+ $him->fullname->title("St");
+ $him->age(1);
+
+ printf "%s is really %s.\n", $him->name, $him->fullname->as_string;
+ printf "%s's age: %d.\n", $him->name, $him->age;
+ $him->happy_birthday;
+ printf "%s's age: %d.\n", $him->name, $him->age;
+
+ show_census();
+
+=head1 Inheritance
+
+Object-oriented programming systems all support some notion of
+inheritance. Inheritance means allowing one class to piggy-back on
+top of another one so you don't have to write the same code again and
+again. It's about software reuse, and therefore related to Laziness,
+the principal virtue of a programmer. (The import/export mechanisms in
+traditional modules are also a form of code reuse, but a simpler one than
+the true inheritance that you find in object modules.)
+
+Sometimes the syntax of inheritance is built into the core of the
+language, and sometimes it's not. Perl has no special syntax for
+specifying the class (or classes) to inherit from. Instead, it's all
+strictly in the semantics. Each package can have a variable called @ISA,
+which governs (method) inheritance. If you try to call a method on an
+object or class, and that method is not found in that object's package,
+Perl then looks to @ISA for other packages to go looking through in
+search of the missing method.
+
+Like the special per-package variables recognized by Exporter (such as
+@EXPORT, @EXPORT_OK, @EXPORT_FAIL, %EXPORT_TAGS, and $VERSION), the @ISA
+array I<must> be a package-scoped global and not a file-scoped lexical
+created via my(). Most classes have just one item in their @ISA array.
+In this case, we have what's called "single inheritance", or SI for short.
+
+Consider this class:
+
+ package Employee;
+ use Person;
+ @ISA = ("Person");
+ 1;
+
+Not a lot to it, eh? All it's doing so far is loading in another
+class and stating that this one will inherit methods from that
+other class if need be. We have given it none of its own methods.
+We rely upon an Employee to behave just like a Person.
+
+Setting up an empty class like this is called the "empty subclass test";
+that is, making a derived class that does nothing but inherit from a
+base class. If the original base class has been designed properly,
+then the new derived class can be used as a drop-in replacement for the
+old one. This means you should be able to write a program like this:
+
+ use Employee;
+ my $empl = Employee->new();
+ $empl->name("Jason");
+ $empl->age(23);
+ printf "%s is age %d.\n", $empl->name, $empl->age;
+
+By proper design, we mean always using the two-argument form of bless(),
+avoiding direct access of global data, and not exporting anything. If you
+look back at the Person::new() function we defined above, we were careful
+to do that. There's a bit of package data used in the constructor,
+but the reference to this is stored on the object itself and all other
+methods access package data via that reference, so we should be ok.
+
+What do we mean by the Person::new() function -- isn't that actually
+a method? Well, in principle, yes. A method is just a function that
+expects as its first argument a class name (package) or object
+(blessed reference). Person::new() is the function that both the
+C<< Person->new() >> method and the C<< Employee->new() >> method end
+up calling. Understand that while a method call looks a lot like a
+function call, they aren't really quite the same, and if you treat them
+as the same, you'll very soon be left with nothing but broken programs.
+First, the actual underlying calling conventions are different: method
+calls get an extra argument. Second, function calls don't do inheritance,
+but methods do.
+
+ Method Call Resulting Function Call
+ ----------- ------------------------
+ Person->new() Person::new("Person")
+ Employee->new() Person::new("Employee")
+
+So don't use function calls when you mean to call a method.
+
+If an employee is just a Person, that's not all too very interesting.
+So let's add some other methods. We'll give our employee
+data fields to access their salary, their employee ID, and their
+start date.
+
+If you're getting a little tired of creating all these nearly identical
+methods just to get at the object's data, do not despair. Later,
+we'll describe several different convenience mechanisms for shortening
+this up. Meanwhile, here's the straight-forward way:
+
+ sub salary {
+ my $self = shift;
+ if (@_) { $self->{SALARY} = shift }
+ return $self->{SALARY};
+ }
+
+ sub id_number {
+ my $self = shift;
+ if (@_) { $self->{ID} = shift }
+ return $self->{ID};
+ }
+
+ sub start_date {
+ my $self = shift;
+ if (@_) { $self->{START_DATE} = shift }
+ return $self->{START_DATE};
+ }
+
+=head2 Overridden Methods
+
+What happens when both a derived class and its base class have the same
+method defined? Well, then you get the derived class's version of that
+method. For example, let's say that we want the peers() method called on
+an employee to act a bit differently. Instead of just returning the list
+of peer names, let's return slightly different strings. So doing this:
+
+ $empl->peers("Peter", "Paul", "Mary");
+ printf "His peers are: %s\n", join(", ", $empl->peers);
+
+will produce:
+
+ His peers are: PEON=PETER, PEON=PAUL, PEON=MARY
+
+To do this, merely add this definition into the Employee.pm file:
+
+ sub peers {
+ my $self = shift;
+ if (@_) { @{ $self->{PEERS} } = @_ }
+ return map { "PEON=\U$_" } @{ $self->{PEERS} };
+ }
+
+There, we've just demonstrated the high-falutin' concept known in certain
+circles as I<polymorphism>. We've taken on the form and behaviour of
+an existing object, and then we've altered it to suit our own purposes.
+This is a form of Laziness. (Getting polymorphed is also what happens
+when the wizard decides you'd look better as a frog.)
+
+Every now and then you'll want to have a method call trigger both its
+derived class (also known as "subclass") version as well as its base class
+(also known as "superclass") version. In practice, constructors and
+destructors are likely to want to do this, and it probably also makes
+sense in the debug() method we showed previously.
+
+To do this, add this to Employee.pm:
+
+ use Carp;
+ my $Debugging = 0;
+
+ sub debug {
+ my $self = shift;
+ confess "usage: thing->debug(level)" unless @_ == 1;
+ my $level = shift;
+ if (ref($self)) {
+ $self->{"_DEBUG"} = $level;
+ } else {
+ $Debugging = $level; # whole class
+ }
+ Person::debug($self, $Debugging); # don't really do this
+ }
+
+As you see, we turn around and call the Person package's debug() function.
+But this is far too fragile for good design. What if Person doesn't
+have a debug() function, but is inheriting I<its> debug() method
+from elsewhere? It would have been slightly better to say
+
+ Person->debug($Debugging);
+
+But even that's got too much hard-coded. It's somewhat better to say
+
+ $self->Person::debug($Debugging);
+
+Which is a funny way to say to start looking for a debug() method up
+in Person. This strategy is more often seen on overridden object methods
+than on overridden class methods.
+
+There is still something a bit off here. We've hard-coded our
+superclass's name. This in particular is bad if you change which classes
+you inherit from, or add others. Fortunately, the pseudoclass SUPER
+comes to the rescue here.
+
+ $self->SUPER::debug($Debugging);
+
+This way it starts looking in my class's @ISA. This only makes sense
+from I<within> a method call, though. Don't try to access anything
+in SUPER:: from anywhere else, because it doesn't exist outside
+an overridden method call. Note that C<SUPER> refers to the superclass of
+the current package, I<not> to the superclass of C<$self>.
+
+Things are getting a bit complicated here. Have we done anything
+we shouldn't? As before, one way to test whether we're designing
+a decent class is via the empty subclass test. Since we already have
+an Employee class that we're trying to check, we'd better get a new
+empty subclass that can derive from Employee. Here's one:
+
+ package Boss;
+ use Employee; # :-)
+ @ISA = qw(Employee);
+
+And here's the test program:
+
+ #!/usr/bin/perl -w
+ use strict;
+ use Boss;
+ Boss->debug(1);
+
+ my $boss = Boss->new();
+
+ $boss->fullname->title("Don");
+ $boss->fullname->surname("Pichon Alvarez");
+ $boss->fullname->christian("Federico Jesus");
+ $boss->fullname->nickname("Fred");
+
+ $boss->age(47);
+ $boss->peers("Frank", "Felipe", "Faust");
+
+ printf "%s is age %d.\n", $boss->fullname->as_string, $boss->age;
+ printf "His peers are: %s\n", join(", ", $boss->peers);
+
+Running it, we see that we're still ok. If you'd like to dump out your
+object in a nice format, somewhat like the way the 'x' command works in
+the debugger, you could use the Data::Dumper module from CPAN this way:
+
+ use Data::Dumper;
+ print "Here's the boss:\n";
+ print Dumper($boss);
+
+Which shows us something like this:
+
+ Here's the boss:
+ $VAR1 = bless( {
+ _CENSUS => \1,
+ FULLNAME => bless( {
+ TITLE => 'Don',
+ SURNAME => 'Pichon Alvarez',
+ NICK => 'Fred',
+ CHRISTIAN => 'Federico Jesus'
+ }, 'Fullname' ),
+ AGE => 47,
+ PEERS => [
+ 'Frank',
+ 'Felipe',
+ 'Faust'
+ ]
+ }, 'Boss' );
+
+Hm.... something's missing there. What about the salary, start date,
+and ID fields? Well, we never set them to anything, even undef, so they
+don't show up in the hash's keys. The Employee class has no new() method
+of its own, and the new() method in Person doesn't know about Employees.
+(Nor should it: proper OO design dictates that a subclass be allowed to
+know about its immediate superclass, but never vice-versa.) So let's
+fix up Employee::new() this way:
+
+ sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new();
+ $self->{SALARY} = undef;
+ $self->{ID} = undef;
+ $self->{START_DATE} = undef;
+ bless ($self, $class); # reconsecrate
+ return $self;
+ }
+
+Now if you dump out an Employee or Boss object, you'll find
+that new fields show up there now.
+
+=head2 Multiple Inheritance
+
+Ok, at the risk of confusing beginners and annoying OO gurus, it's
+time to confess that Perl's object system includes that controversial
+notion known as multiple inheritance, or MI for short. All this means
+is that rather than having just one parent class who in turn might
+itself have a parent class, etc., that you can directly inherit from
+two or more parents. It's true that some uses of MI can get you into
+trouble, although hopefully not quite so much trouble with Perl as with
+dubiously-OO languages like C++.
+
+The way it works is actually pretty simple: just put more than one package
+name in your @ISA array. When it comes time for Perl to go finding
+methods for your object, it looks at each of these packages in order.
+Well, kinda. It's actually a fully recursive, depth-first order by
+default (see L<mro> for alternate method resolution orders).
+Consider a bunch of @ISA arrays like this:
+
+ @First::ISA = qw( Alpha );
+ @Second::ISA = qw( Beta );
+ @Third::ISA = qw( First Second );
+
+If you have an object of class Third:
+
+ my $ob = Third->new();
+ $ob->spin();
+
+How do we find a spin() method (or a new() method for that matter)?
+Because the search is depth-first, classes will be looked up
+in the following order: Third, First, Alpha, Second, and Beta.
+
+In practice, few class modules have been seen that actually
+make use of MI. One nearly always chooses simple containership of
+one class within another over MI. That's why our Person
+object I<contained> a Fullname object. That doesn't mean
+it I<was> one.
+
+However, there is one particular area where MI in Perl is rampant:
+borrowing another class's class methods. This is rather common,
+especially with some bundled "objectless" classes,
+like Exporter, DynaLoader, AutoLoader, and SelfLoader. These classes
+do not provide constructors; they exist only so you may inherit their
+class methods. (It's not entirely clear why inheritance was done
+here rather than traditional module importation.)
+
+For example, here is the POSIX module's @ISA:
+
+ package POSIX;
+ @ISA = qw(Exporter DynaLoader);
+
+The POSIX module isn't really an object module, but then,
+neither are Exporter or DynaLoader. They're just lending their
+classes' behaviours to POSIX.
+
+Why don't people use MI for object methods much? One reason is that
+it can have complicated side-effects. For one thing, your inheritance
+graph (no longer a tree) might converge back to the same base class.
+Although Perl guards against recursive inheritance, merely having parents
+who are related to each other via a common ancestor, incestuous though
+it sounds, is not forbidden. What if in our Third class shown above we
+wanted its new() method to also call both overridden constructors in its
+two parent classes? The SUPER notation would only find the first one.
+Also, what about if the Alpha and Beta classes both had a common ancestor,
+like Nought? If you kept climbing up the inheritance tree calling
+overridden methods, you'd end up calling Nought::new() twice,
+which might well be a bad idea.
+
+=head2 UNIVERSAL: The Root of All Objects
+
+Wouldn't it be convenient if all objects were rooted at some ultimate
+base class? That way you could give every object common methods without
+having to go and add it to each and every @ISA. Well, it turns out that
+you can. You don't see it, but Perl tacitly and irrevocably assumes
+that there's an extra element at the end of @ISA: the class UNIVERSAL.
+In version 5.003, there were no predefined methods there, but you could put
+whatever you felt like into it.
+
+However, as of version 5.004 (or some subversive releases, like 5.003_08),
+UNIVERSAL has some methods in it already. These are builtin to your Perl
+binary, so they don't take any extra time to load. Predefined methods
+include isa(), can(), and VERSION(). isa() tells you whether an object or
+class "is" another one without having to traverse the hierarchy yourself:
+
+ $has_io = $fd->isa("IO::Handle");
+ $itza_handle = IO::Socket->isa("IO::Handle");
+
+The can() method, called against that object or class, reports back
+whether its string argument is a callable method name in that class.
+In fact, it gives you back a function reference to that method:
+
+ $his_print_method = $obj->can('as_string');
+
+Finally, the VERSION method checks whether the class (or the object's
+class) has a package global called $VERSION that's high enough, as in:
+
+ Some_Module->VERSION(3.0);
+ $his_vers = $ob->VERSION();
+
+However, we don't usually call VERSION ourselves. (Remember that an all
+uppercase function name is a Perl convention that indicates that the
+function will be automatically used by Perl in some way.) In this case,
+it happens when you say
+
+ use Some_Module 3.0;
+
+If you wanted to add version checking to your Person class explained
+above, just add this to Person.pm:
+
+ our $VERSION = '1.1';
+
+and then in Employee.pm you can say
+
+ use Person 1.1;
+
+And it would make sure that you have at least that version number or
+higher available. This is not the same as loading in that exact version
+number. No mechanism currently exists for concurrent installation of
+multiple versions of a module. Lamentably.
+
+=head2 Deeper UNIVERSAL details
+
+It is also valid (though perhaps unwise in most cases) to put other
+packages' names in @UNIVERSAL::ISA. These packages will also be
+implicitly inherited by all classes, just as UNIVERSAL itself is.
+However, neither UNIVERSAL nor any of its parents from the @ISA tree
+are explicit base classes of all objects. To clarify, given the
+following:
+
+ @UNIVERSAL::ISA = ('REALLYUNIVERSAL');
+
+ package REALLYUNIVERSAL;
+ sub special_method { return "123" }
+
+ package Foo;
+ sub normal_method { return "321" }
+
+Calling Foo->special_method() will return "123", but calling
+Foo->isa('REALLYUNIVERSAL') or Foo->isa('UNIVERSAL') will return
+false.
+
+If your class is using an alternate mro like C3 (see
+L<mro>), method resolution within UNIVERSAL / @UNIVERSAL::ISA will
+still occur in the default depth-first left-to-right manner,
+after the class's C3 mro is exhausted.
+
+All of the above is made more intuitive by realizing what really
+happens during method lookup, which is roughly like this
+ugly pseudo-code:
+
+ get_mro(class) {
+ # recurses down the @ISA's starting at class,
+ # builds a single linear array of all
+ # classes to search in the appropriate order.
+ # The method resolution order (mro) to use
+ # for the ordering is whichever mro "class"
+ # has set on it (either default (depth first
+ # l-to-r) or C3 ordering).
+ # The first entry in the list is the class
+ # itself.
+ }
+
+ find_method(class, methname) {
+ foreach $class (get_mro(class)) {
+ if($class->has_method(methname)) {
+ return ref_to($class->$methname);
+ }
+ }
+ foreach $class (get_mro(UNIVERSAL)) {
+ if($class->has_method(methname)) {
+ return ref_to($class->$methname);
+ }
+ }
+ return undef;
+ }
+
+However the code that implements UNIVERSAL::isa does not
+search in UNIVERSAL itself, only in the package's actual
+@ISA.
+
+=head1 Alternate Object Representations
+
+Nothing requires objects to be implemented as hash references. An object
+can be any sort of reference so long as its referent has been suitably
+blessed. That means scalar, array, and code references are also fair
+game.
+
+A scalar would work if the object has only one datum to hold. An array
+would work for most cases, but makes inheritance a bit dodgy because
+you have to invent new indices for the derived classes.
+
+=head2 Arrays as Objects
+
+If the user of your class honors the contract and sticks to the advertised
+interface, then you can change its underlying interface if you feel
+like it. Here's another implementation that conforms to the same
+interface specification. This time we'll use an array reference
+instead of a hash reference to represent the object.
+
+ package Person;
+ use strict;
+
+ my($NAME, $AGE, $PEERS) = ( 0 .. 2 );
+
+ ############################################
+ ## the object constructor (array version) ##
+ ############################################
+ sub new {
+ my $self = [];
+ $self->[$NAME] = undef; # this is unnecessary
+ $self->[$AGE] = undef; # as is this
+ $self->[$PEERS] = []; # but this isn't, really
+ bless($self);
+ return $self;
+ }
+
+ sub name {
+ my $self = shift;
+ if (@_) { $self->[$NAME] = shift }
+ return $self->[$NAME];
+ }
+
+ sub age {
+ my $self = shift;
+ if (@_) { $self->[$AGE] = shift }
+ return $self->[$AGE];
+ }
+
+ sub peers {
+ my $self = shift;
+ if (@_) { @{ $self->[$PEERS] } = @_ }
+ return @{ $self->[$PEERS] };
+ }
+
+ 1; # so the require or use succeeds
+
+You might guess that the array access would be a lot faster than the
+hash access, but they're actually comparable. The array is a I<little>
+bit faster, but not more than ten or fifteen percent, even when you
+replace the variables above like $AGE with literal numbers, like 1.
+A bigger difference between the two approaches can be found in memory use.
+A hash representation takes up more memory than an array representation
+because you have to allocate memory for the keys as well as for the values.
+However, it really isn't that bad, especially since as of version 5.004,
+memory is only allocated once for a given hash key, no matter how many
+hashes have that key. It's expected that sometime in the future, even
+these differences will fade into obscurity as more efficient underlying
+representations are devised.
+
+Still, the tiny edge in speed (and somewhat larger one in memory)
+is enough to make some programmers choose an array representation
+for simple classes. There's still a little problem with
+scalability, though, because later in life when you feel
+like creating subclasses, you'll find that hashes just work
+out better.
+
+=head2 Closures as Objects
+
+Using a code reference to represent an object offers some fascinating
+possibilities. We can create a new anonymous function (closure) who
+alone in all the world can see the object's data. This is because we
+put the data into an anonymous hash that's lexically visible only to
+the closure we create, bless, and return as the object. This object's
+methods turn around and call the closure as a regular subroutine call,
+passing it the field we want to affect. (Yes,
+the double-function call is slow, but if you wanted fast, you wouldn't
+be using objects at all, eh? :-)
+
+Use would be similar to before:
+
+ use Person;
+ $him = Person->new();
+ $him->name("Jason");
+ $him->age(23);
+ $him->peers( [ "Norbert", "Rhys", "Phineas" ] );
+ printf "%s is %d years old.\n", $him->name, $him->age;
+ print "His peers are: ", join(", ", @{$him->peers}), "\n";
+
+but the implementation would be radically, perhaps even sublimely
+different:
+
+ package Person;
+
+ sub new {
+ my $class = shift;
+ my $self = {
+ NAME => undef,
+ AGE => undef,
+ PEERS => [],
+ };
+ my $closure = sub {
+ my $field = shift;
+ if (@_) { $self->{$field} = shift }
+ return $self->{$field};
+ };
+ bless($closure, $class);
+ return $closure;
+ }
+
+ sub name { &{ $_[0] }("NAME", @_[ 1 .. $#_ ] ) }
+ sub age { &{ $_[0] }("AGE", @_[ 1 .. $#_ ] ) }
+ sub peers { &{ $_[0] }("PEERS", @_[ 1 .. $#_ ] ) }
+
+ 1;
+
+Because this object is hidden behind a code reference, it's probably a bit
+mysterious to those whose background is more firmly rooted in standard
+procedural or object-based programming languages than in functional
+programming languages whence closures derive. The object
+created and returned by the new() method is itself not a data reference
+as we've seen before. It's an anonymous code reference that has within
+it access to a specific version (lexical binding and instantiation)
+of the object's data, which are stored in the private variable $self.
+Although this is the same function each time, it contains a different
+version of $self.
+
+When a method like C<$him-E<gt>name("Jason")> is called, its implicit
+zeroth argument is the invoking object--just as it is with all method
+calls. But in this case, it's our code reference (something like a
+function pointer in C++, but with deep binding of lexical variables).
+There's not a lot to be done with a code reference beyond calling it, so
+that's just what we do when we say C<&{$_[0]}>. This is just a regular
+function call, not a method call. The initial argument is the string
+"NAME", and any remaining arguments are whatever had been passed to the
+method itself.
+
+Once we're executing inside the closure that had been created in new(),
+the $self hash reference suddenly becomes visible. The closure grabs
+its first argument ("NAME" in this case because that's what the name()
+method passed it), and uses that string to subscript into the private
+hash hidden in its unique version of $self.
+
+Nothing under the sun will allow anyone outside the executing method to
+be able to get at this hidden data. Well, nearly nothing. You I<could>
+single step through the program using the debugger and find out the
+pieces while you're in the method, but everyone else is out of luck.
+
+There, if that doesn't excite the Scheme folks, then I just don't know
+what will. Translation of this technique into C++, Java, or any other
+braindead-static language is left as a futile exercise for aficionados
+of those camps.
+
+You could even add a bit of nosiness via the caller() function and
+make the closure refuse to operate unless called via its own package.
+This would no doubt satisfy certain fastidious concerns of programming
+police and related puritans.
+
+If you were wondering when Hubris, the third principle virtue of a
+programmer, would come into play, here you have it. (More seriously,
+Hubris is just the pride in craftsmanship that comes from having written
+a sound bit of well-designed code.)
+
+=head1 AUTOLOAD: Proxy Methods
+
+Autoloading is a way to intercept calls to undefined methods. An autoload
+routine may choose to create a new function on the fly, either loaded
+from disk or perhaps just eval()ed right there. This define-on-the-fly
+strategy is why it's called autoloading.
+
+But that's only one possible approach. Another one is to just
+have the autoloaded method itself directly provide the
+requested service. When used in this way, you may think
+of autoloaded methods as "proxy" methods.
+
+When Perl tries to call an undefined function in a particular package
+and that function is not defined, it looks for a function in
+that same package called AUTOLOAD. If one exists, it's called
+with the same arguments as the original function would have had.
+The fully-qualified name of the function is stored in that package's
+global variable $AUTOLOAD. Once called, the function can do anything
+it would like, including defining a new function by the right name, and
+then doing a really fancy kind of C<goto> right to it, erasing itself
+from the call stack.
+
+What does this have to do with objects? After all, we keep talking about
+functions, not methods. Well, since a method is just a function with
+an extra argument and some fancier semantics about where it's found,
+we can use autoloading for methods, too. Perl doesn't start looking
+for an AUTOLOAD method until it has exhausted the recursive hunt up
+through @ISA, though. Some programmers have even been known to define
+a UNIVERSAL::AUTOLOAD method to trap unresolved method calls to any
+kind of object.
+
+=head2 Autoloaded Data Methods
+
+You probably began to get a little suspicious about the duplicated
+code way back earlier when we first showed you the Person class, and
+then later the Employee class. Each method used to access the
+hash fields looked virtually identical. This should have tickled
+that great programming virtue, Impatience, but for the time,
+we let Laziness win out, and so did nothing. Proxy methods can cure
+this.
+
+Instead of writing a new function every time we want a new data field,
+we'll use the autoload mechanism to generate (actually, mimic) methods on
+the fly. To verify that we're accessing a valid member, we will check
+against an C<_permitted> (pronounced "under-permitted") field, which
+is a reference to a file-scoped lexical (like a C file static) hash of permitted fields in this record
+called %fields. Why the underscore? For the same reason as the _CENSUS
+field we once used: as a marker that means "for internal use only".
+
+Here's what the module initialization code and class
+constructor will look like when taking this approach:
+
+ package Person;
+ use Carp;
+ our $AUTOLOAD; # it's a package global
+
+ my %fields = (
+ name => undef,
+ age => undef,
+ peers => undef,
+ );
+
+ sub new {
+ my $class = shift;
+ my $self = {
+ _permitted => \%fields,
+ %fields,
+ };
+ bless $self, $class;
+ return $self;
+ }
+
+If we wanted our record to have default values, we could fill those in
+where current we have C<undef> in the %fields hash.
+
+Notice how we saved a reference to our class data on the object itself?
+Remember that it's important to access class data through the object
+itself instead of having any method reference %fields directly, or else
+you won't have a decent inheritance.
+
+The real magic, though, is going to reside in our proxy method, which
+will handle all calls to undefined methods for objects of class Person
+(or subclasses of Person). It has to be called AUTOLOAD. Again, it's
+all caps because it's called for us implicitly by Perl itself, not by
+a user directly.
+
+ sub AUTOLOAD {
+ my $self = shift;
+ my $type = ref($self)
+ or croak "$self is not an object";
+
+ my $name = $AUTOLOAD;
+ $name =~ s/.*://; # strip fully-qualified portion
+
+ unless (exists $self->{_permitted}->{$name} ) {
+ croak "Can't access `$name' field in class $type";
+ }
+
+ if (@_) {
+ return $self->{$name} = shift;
+ } else {
+ return $self->{$name};
+ }
+ }
+
+Pretty nifty, eh? All we have to do to add new data fields
+is modify %fields. No new functions need be written.
+
+I could have avoided the C<_permitted> field entirely, but I
+wanted to demonstrate how to store a reference to class data on the
+object so you wouldn't have to access that class data
+directly from an object method.
+
+=head2 Inherited Autoloaded Data Methods
+
+But what about inheritance? Can we define our Employee
+class similarly? Yes, so long as we're careful enough.
+
+Here's how to be careful:
+
+ package Employee;
+ use Person;
+ use strict;
+ our @ISA = qw(Person);
+
+ my %fields = (
+ id => undef,
+ salary => undef,
+ );
+
+ sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new();
+ my($element);
+ foreach $element (keys %fields) {
+ $self->{_permitted}->{$element} = $fields{$element};
+ }
+ @{$self}{keys %fields} = values %fields;
+ return $self;
+ }
+
+Once we've done this, we don't even need to have an
+AUTOLOAD function in the Employee package, because
+we'll grab Person's version of that via inheritance,
+and it will all work out just fine.
+
+=head1 Metaclassical Tools
+
+Even though proxy methods can provide a more convenient approach to making
+more struct-like classes than tediously coding up data methods as
+functions, it still leaves a bit to be desired. For one thing, it means
+you have to handle bogus calls that you don't mean to trap via your proxy.
+It also means you have to be quite careful when dealing with inheritance,
+as detailed above.
+
+Perl programmers have responded to this by creating several different
+class construction classes. These metaclasses are classes
+that create other classes. A couple worth looking at are
+Class::Struct and Alias. These and other related metaclasses can be
+found in the modules directory on CPAN.
+
+=head2 Class::Struct
+
+One of the older ones is Class::Struct. In fact, its syntax and
+interface were sketched out long before perl5 even solidified into a
+real thing. What it does is provide you a way to "declare" a class
+as having objects whose fields are of a specific type. The function
+that does this is called, not surprisingly enough, struct(). Because
+structures or records are not base types in Perl, each time you want to
+create a class to provide a record-like data object, you yourself have
+to define a new() method, plus separate data-access methods for each of
+that record's fields. You'll quickly become bored with this process.
+The Class::Struct::struct() function alleviates this tedium.
+
+Here's a simple example of using it:
+
+ use Class::Struct qw(struct);
+ use Jobbie; # user-defined; see below
+
+ struct 'Fred' => {
+ one => '$',
+ many => '@',
+ profession => 'Jobbie', # does not call Jobbie->new()
+ };
+
+ $ob = Fred->new(profession => Jobbie->new());
+ $ob->one("hmmmm");
+
+ $ob->many(0, "here");
+ $ob->many(1, "you");
+ $ob->many(2, "go");
+ print "Just set: ", $ob->many(2), "\n";
+
+ $ob->profession->salary(10_000);
+
+You can declare types in the struct to be basic Perl types, or
+user-defined types (classes). User types will be initialized by calling
+that class's new() method.
+
+Take care that the C<Jobbie> object is not created automatically by the
+C<Fred> class's new() method, so you should specify a C<Jobbie> object
+when you create an instance of C<Fred>.
+
+Here's a real-world example of using struct generation. Let's say you
+wanted to override Perl's idea of gethostbyname() and gethostbyaddr() so
+that they would return objects that acted like C structures. We don't
+care about high-falutin' OO gunk. All we want is for these objects to
+act like structs in the C sense.
+
+ use Socket;
+ use Net::hostent;
+ $h = gethostbyname("perl.com"); # object return
+ printf "perl.com's real name is %s, address %s\n",
+ $h->name, inet_ntoa($h->addr);
+
+Here's how to do this using the Class::Struct module.
+The crux is going to be this call:
+
+ struct 'Net::hostent' => [ # note bracket
+ name => '$',
+ aliases => '@',
+ addrtype => '$',
+ 'length' => '$',
+ addr_list => '@',
+ ];
+
+Which creates object methods of those names and types.
+It even creates a new() method for us.
+
+We could also have implemented our object this way:
+
+ struct 'Net::hostent' => { # note brace
+ name => '$',
+ aliases => '@',
+ addrtype => '$',
+ 'length' => '$',
+ addr_list => '@',
+ };
+
+and then Class::Struct would have used an anonymous hash as the object
+type, instead of an anonymous array. The array is faster and smaller,
+but the hash works out better if you eventually want to do inheritance.
+Since for this struct-like object we aren't planning on inheritance,
+this time we'll opt for better speed and size over better flexibility.
+
+Here's the whole implementation:
+
+ package Net::hostent;
+ use strict;
+
+ BEGIN {
+ use Exporter ();
+ our @EXPORT = qw(gethostbyname gethostbyaddr gethost);
+ our @EXPORT_OK = qw(
+ $h_name @h_aliases
+ $h_addrtype $h_length
+ @h_addr_list $h_addr
+ );
+ our %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+ }
+ our @EXPORT_OK;
+
+ # Class::Struct forbids use of @ISA
+ sub import { goto &Exporter::import }
+
+ use Class::Struct qw(struct);
+ struct 'Net::hostent' => [
+ name => '$',
+ aliases => '@',
+ addrtype => '$',
+ 'length' => '$',
+ addr_list => '@',
+ ];
+
+ sub addr { shift->addr_list->[0] }
+
+ sub populate (@) {
+ return unless @_;
+ my $hob = new(); # Class::Struct made this!
+ $h_name = $hob->[0] = $_[0];
+ @h_aliases = @{ $hob->[1] } = split ' ', $_[1];
+ $h_addrtype = $hob->[2] = $_[2];
+ $h_length = $hob->[3] = $_[3];
+ $h_addr = $_[4];
+ @h_addr_list = @{ $hob->[4] } = @_[ (4 .. $#_) ];
+ return $hob;
+ }
+
+ sub gethostbyname ($) { populate(CORE::gethostbyname(shift)) }
+
+ sub gethostbyaddr ($;$) {
+ my ($addr, $addrtype);
+ $addr = shift;
+ require Socket unless @_;
+ $addrtype = @_ ? shift : Socket::AF_INET();
+ populate(CORE::gethostbyaddr($addr, $addrtype))
+ }
+
+ sub gethost($) {
+ if ($_[0] =~ /^\d+(?:\.\d+(?:\.\d+(?:\.\d+)?)?)?$/) {
+ require Socket;
+ &gethostbyaddr(Socket::inet_aton(shift));
+ } else {
+ &gethostbyname;
+ }
+ }
+
+ 1;
+
+We've snuck in quite a fair bit of other concepts besides just dynamic
+class creation, like overriding core functions, import/export bits,
+function prototyping, short-cut function call via C<&whatever>, and
+function replacement with C<goto &whatever>. These all mostly make
+sense from the perspective of a traditional module, but as you can see,
+we can also use them in an object module.
+
+You can look at other object-based, struct-like overrides of core
+functions in the 5.004 release of Perl in File::stat, Net::hostent,
+Net::netent, Net::protoent, Net::servent, Time::gmtime, Time::localtime,
+User::grent, and User::pwent. These modules have a final component
+that's all lowercase, by convention reserved for compiler pragmas,
+because they affect the compilation and change a builtin function.
+They also have the type names that a C programmer would most expect.
+
+=head2 Data Members as Variables
+
+If you're used to C++ objects, then you're accustomed to being able to
+get at an object's data members as simple variables from within a method.
+The Alias module provides for this, as well as a good bit more, such
+as the possibility of private methods that the object can call but folks
+outside the class cannot.
+
+Here's an example of creating a Person using the Alias module.
+When you update these magical instance variables, you automatically
+update value fields in the hash. Convenient, eh?
+
+ package Person;
+
+ # this is the same as before...
+ sub new {
+ my $class = shift;
+ my $self = {
+ NAME => undef,
+ AGE => undef,
+ PEERS => [],
+ };
+ bless($self, $class);
+ return $self;
+ }
+
+ use Alias qw(attr);
+ our ($NAME, $AGE, $PEERS);
+
+ sub name {
+ my $self = attr shift;
+ if (@_) { $NAME = shift; }
+ return $NAME;
+ }
+
+ sub age {
+ my $self = attr shift;
+ if (@_) { $AGE = shift; }
+ return $AGE;
+ }
+
+ sub peers {
+ my $self = attr shift;
+ if (@_) { @PEERS = @_; }
+ return @PEERS;
+ }
+
+ sub exclaim {
+ my $self = attr shift;
+ return sprintf "Hi, I'm %s, age %d, working with %s",
+ $NAME, $AGE, join(", ", @PEERS);
+ }
+
+ sub happy_birthday {
+ my $self = attr shift;
+ return ++$AGE;
+ }
+
+The need for the C<our> declaration is because what Alias does
+is play with package globals with the same name as the fields. To use
+globals while C<use strict> is in effect, you have to predeclare them.
+These package variables are localized to the block enclosing the attr()
+call just as if you'd used a local() on them. However, that means that
+they're still considered global variables with temporary values, just
+as with any other local().
+
+It would be nice to combine Alias with
+something like Class::Struct or Class::MethodMaker.
+
+=head1 NOTES
+
+=head2 Object Terminology
+
+In the various OO literature, it seems that a lot of different words
+are used to describe only a few different concepts. If you're not
+already an object programmer, then you don't need to worry about all
+these fancy words. But if you are, then you might like to know how to
+get at the same concepts in Perl.
+
+For example, it's common to call an object an I<instance> of a class
+and to call those objects' methods I<instance methods>. Data fields
+peculiar to each object are often called I<instance data> or I<object
+attributes>, and data fields common to all members of that class are
+I<class data>, I<class attributes>, or I<static data members>.
+
+Also, I<base class>, I<generic class>, and I<superclass> all describe
+the same notion, whereas I<derived class>, I<specific class>, and
+I<subclass> describe the other related one.
+
+C++ programmers have I<static methods> and I<virtual methods>,
+but Perl only has I<class methods> and I<object methods>.
+Actually, Perl only has methods. Whether a method gets used
+as a class or object method is by usage only. You could accidentally
+call a class method (one expecting a string argument) on an
+object (one expecting a reference), or vice versa.
+
+From the C++ perspective, all methods in Perl are virtual.
+This, by the way, is why they are never checked for function
+prototypes in the argument list as regular builtin and user-defined
+functions can be.
+
+Because a class is itself something of an object, Perl's classes can be
+taken as describing both a "class as meta-object" (also called I<object
+factory>) philosophy and the "class as type definition" (I<declaring>
+behaviour, not I<defining> mechanism) idea. C++ supports the latter
+notion, but not the former.
+
+=head1 SEE ALSO
+
+The following manpages will doubtless provide more
+background for this one:
+L<perlmod>,
+L<perlref>,
+L<perlobj>,
+L<perlbot>,
+L<perltie>,
+and
+L<overload>.
+
+L<perlboot> is a kinder, gentler introduction to object-oriented
+programming.
+
+L<perltooc> provides more detail on class data.
+
+Some modules which might prove interesting are Class::Accessor,
+Class::Class, Class::Contract, Class::Data::Inheritable,
+Class::MethodMaker and Tie::SecureHash
+
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997, 1998 Tom Christiansen
+All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain. You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit. A simple comment in the code giving
+credit would be courteous but is not required.
+
+=head1 COPYRIGHT
+
+=head2 Acknowledgments
+
+Thanks to
+Larry Wall,
+Roderick Schertler,
+Gurusamy Sarathy,
+Dean Roehrich,
+Raphael Manfredi,
+Brent Halsey,
+Greg Bacon,
+Brad Appleton,
+and many others for their helpful comments.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perltrap.pod b/Master/tlpkg/tlperl.straw/lib/pods/perltrap.pod
new file mode 100755
index 00000000000..b5f09351669
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perltrap.pod
@@ -0,0 +1,1590 @@
+=head1 NAME
+
+perltrap - Perl traps for the unwary
+
+=head1 DESCRIPTION
+
+The biggest trap of all is forgetting to C<use warnings> or use the B<-w>
+switch; see L<perllexwarn> and L<perlrun>. The second biggest trap is not
+making your entire program runnable under C<use strict>. The third biggest
+trap is not reading the list of changes in this version of Perl; see
+L<perldelta>.
+
+=head2 Awk Traps
+
+Accustomed B<awk> users should take special note of the following:
+
+=over 4
+
+=item *
+
+A Perl program executes only once, not once for each input line. You can
+do an implicit loop with C<-n> or C<-p>.
+
+=item *
+
+The English module, loaded via
+
+ use English;
+
+allows you to refer to special variables (like C<$/>) with names (like
+$RS), as though they were in B<awk>; see L<perlvar> for details.
+
+=item *
+
+Semicolons are required after all simple statements in Perl (except
+at the end of a block). Newline is not a statement delimiter.
+
+=item *
+
+Curly brackets are required on C<if>s and C<while>s.
+
+=item *
+
+Variables begin with "$", "@" or "%" in Perl.
+
+=item *
+
+Arrays index from 0. Likewise string positions in substr() and
+index().
+
+=item *
+
+You have to decide whether your array has numeric or string indices.
+
+=item *
+
+Hash values do not spring into existence upon mere reference.
+
+=item *
+
+You have to decide whether you want to use string or numeric
+comparisons.
+
+=item *
+
+Reading an input line does not split it for you. You get to split it
+to an array yourself. And the split() operator has different
+arguments than B<awk>'s.
+
+=item *
+
+The current input line is normally in $_, not $0. It generally does
+not have the newline stripped. ($0 is the name of the program
+executed.) See L<perlvar>.
+
+=item *
+
+$<I<digit>> does not refer to fields--it refers to substrings matched
+by the last match pattern.
+
+=item *
+
+The print() statement does not add field and record separators unless
+you set C<$,> and C<$\>. You can set $OFS and $ORS if you're using
+the English module.
+
+=item *
+
+You must open your files before you print to them.
+
+=item *
+
+The range operator is "..", not comma. The comma operator works as in
+C.
+
+=item *
+
+The match operator is "=~", not "~". ("~" is the one's complement
+operator, as in C.)
+
+=item *
+
+The exponentiation operator is "**", not "^". "^" is the XOR
+operator, as in C. (You know, one could get the feeling that B<awk> is
+basically incompatible with C.)
+
+=item *
+
+The concatenation operator is ".", not the null string. (Using the
+null string would render C</pat/ /pat/> unparsable, because the third slash
+would be interpreted as a division operator--the tokenizer is in fact
+slightly context sensitive for operators like "/", "?", and ">".
+And in fact, "." itself can be the beginning of a number.)
+
+=item *
+
+The C<next>, C<exit>, and C<continue> keywords work differently.
+
+=item *
+
+
+The following variables work differently:
+
+ Awk Perl
+ ARGC scalar @ARGV (compare with $#ARGV)
+ ARGV[0] $0
+ FILENAME $ARGV
+ FNR $. - something
+ FS (whatever you like)
+ NF $#Fld, or some such
+ NR $.
+ OFMT $#
+ OFS $,
+ ORS $\
+ RLENGTH length($&)
+ RS $/
+ RSTART length($`)
+ SUBSEP $;
+
+=item *
+
+You cannot set $RS to a pattern, only a string.
+
+=item *
+
+When in doubt, run the B<awk> construct through B<a2p> and see what it
+gives you.
+
+=back
+
+=head2 C/C++ Traps
+
+Cerebral C and C++ programmers should take note of the following:
+
+=over 4
+
+=item *
+
+Curly brackets are required on C<if>'s and C<while>'s.
+
+=item *
+
+You must use C<elsif> rather than C<else if>.
+
+=item *
+
+The C<break> and C<continue> keywords from C become in Perl C<last>
+and C<next>, respectively. Unlike in C, these do I<not> work within a
+C<do { } while> construct. See L<perlsyn/"Loop Control">.
+
+=item *
+
+The switch statement is called C<given/when> and only available in
+perl 5.10 or newer. See L<perlsyn/"Switch statements">.
+
+=item *
+
+Variables begin with "$", "@" or "%" in Perl.
+
+=item *
+
+Comments begin with "#", not "/*" or "//". Perl may interpret C/C++
+comments as division operators, unterminated regular expressions or
+the defined-or operator.
+
+=item *
+
+You can't take the address of anything, although a similar operator
+in Perl is the backslash, which creates a reference.
+
+=item *
+
+C<ARGV> must be capitalized. C<$ARGV[0]> is C's C<argv[1]>, and C<argv[0]>
+ends up in C<$0>.
+
+=item *
+
+System calls such as link(), unlink(), rename(), etc. return nonzero for
+success, not 0. (system(), however, returns zero for success.)
+
+=item *
+
+Signal handlers deal with signal names, not numbers. Use C<kill -l>
+to find their names on your system.
+
+=back
+
+=head2 Sed Traps
+
+Seasoned B<sed> programmers should take note of the following:
+
+=over 4
+
+=item *
+
+A Perl program executes only once, not once for each input line. You can
+do an implicit loop with C<-n> or C<-p>.
+
+=item *
+
+Backreferences in substitutions use "$" rather than "\".
+
+=item *
+
+The pattern matching metacharacters "(", ")", and "|" do not have backslashes
+in front.
+
+=item *
+
+The range operator is C<...>, rather than comma.
+
+=back
+
+=head2 Shell Traps
+
+Sharp shell programmers should take note of the following:
+
+=over 4
+
+=item *
+
+The backtick operator does variable interpolation without regard to
+the presence of single quotes in the command.
+
+=item *
+
+The backtick operator does no translation of the return value, unlike B<csh>.
+
+=item *
+
+Shells (especially B<csh>) do several levels of substitution on each
+command line. Perl does substitution in only certain constructs
+such as double quotes, backticks, angle brackets, and search patterns.
+
+=item *
+
+Shells interpret scripts a little bit at a time. Perl compiles the
+entire program before executing it (except for C<BEGIN> blocks, which
+execute at compile time).
+
+=item *
+
+The arguments are available via @ARGV, not $1, $2, etc.
+
+=item *
+
+The environment is not automatically made available as separate scalar
+variables.
+
+=item *
+
+The shell's C<test> uses "=", "!=", "<" etc for string comparisons and "-eq",
+"-ne", "-lt" etc for numeric comparisons. This is the reverse of Perl, which
+uses C<eq>, C<ne>, C<lt> for string comparisons, and C<==>, C<!=> C<< < >> etc
+for numeric comparisons.
+
+=back
+
+=head2 Perl Traps
+
+Practicing Perl Programmers should take note of the following:
+
+=over 4
+
+=item *
+
+Remember that many operations behave differently in a list
+context than they do in a scalar one. See L<perldata> for details.
+
+=item *
+
+Avoid barewords if you can, especially all lowercase ones.
+You can't tell by just looking at it whether a bareword is
+a function or a string. By using quotes on strings and
+parentheses on function calls, you won't ever get them confused.
+
+=item *
+
+You cannot discern from mere inspection which builtins
+are unary operators (like chop() and chdir())
+and which are list operators (like print() and unlink()).
+(Unless prototyped, user-defined subroutines can B<only> be list
+operators, never unary ones.) See L<perlop> and L<perlsub>.
+
+=item *
+
+People have a hard time remembering that some functions
+default to $_, or @ARGV, or whatever, but that others which
+you might expect to do not.
+
+=item *
+
+The <FH> construct is not the name of the filehandle, it is a readline
+operation on that handle. The data read is assigned to $_ only if the
+file read is the sole condition in a while loop:
+
+ while (<FH>) { }
+ while (defined($_ = <FH>)) { }..
+ <FH>; # data discarded!
+
+=item *
+
+Remember not to use C<=> when you need C<=~>;
+these two constructs are quite different:
+
+ $x = /foo/;
+ $x =~ /foo/;
+
+=item *
+
+The C<do {}> construct isn't a real loop that you can use
+loop control on.
+
+=item *
+
+Use C<my()> for local variables whenever you can get away with
+it (but see L<perlform> for where you can't).
+Using C<local()> actually gives a local value to a global
+variable, which leaves you open to unforeseen side-effects
+of dynamic scoping.
+
+=item *
+
+If you localize an exported variable in a module, its exported value will
+not change. The local name becomes an alias to a new value but the
+external name is still an alias for the original.
+
+=back
+
+=head2 Perl4 to Perl5 Traps
+
+Practicing Perl4 Programmers should take note of the following
+Perl4-to-Perl5 specific traps.
+
+They're crudely ordered according to the following list:
+
+=over 4
+
+=item Discontinuance, Deprecation, and BugFix traps
+
+Anything that's been fixed as a perl4 bug, removed as a perl4 feature
+or deprecated as a perl4 feature with the intent to encourage usage of
+some other perl5 feature.
+
+=item Parsing Traps
+
+Traps that appear to stem from the new parser.
+
+=item Numerical Traps
+
+Traps having to do with numerical or mathematical operators.
+
+=item General data type traps
+
+Traps involving perl standard data types.
+
+=item Context Traps - scalar, list contexts
+
+Traps related to context within lists, scalar statements/declarations.
+
+=item Precedence Traps
+
+Traps related to the precedence of parsing, evaluation, and execution of
+code.
+
+=item General Regular Expression Traps using s///, etc.
+
+Traps related to the use of pattern matching.
+
+=item Subroutine, Signal, Sorting Traps
+
+Traps related to the use of signals and signal handlers, general subroutines,
+and sorting, along with sorting subroutines.
+
+=item OS Traps
+
+OS-specific traps.
+
+=item DBM Traps
+
+Traps specific to the use of C<dbmopen()>, and specific dbm implementations.
+
+=item Unclassified Traps
+
+Everything else.
+
+=back
+
+If you find an example of a conversion trap that is not listed here,
+please submit it to <F<perlbug@perl.org>> for inclusion.
+Also note that at least some of these can be caught with the
+C<use warnings> pragma or the B<-w> switch.
+
+=head2 Discontinuance, Deprecation, and BugFix traps
+
+Anything that has been discontinued, deprecated, or fixed as
+a bug from perl4.
+
+=over 4
+
+=item * Symbols starting with "_" no longer forced into main
+
+Symbols starting with "_" are no longer forced into package main, except
+for C<$_> itself (and C<@_>, etc.).
+
+ package test;
+ $_legacy = 1;
+
+ package main;
+ print "\$_legacy is ",$_legacy,"\n";
+
+ # perl4 prints: $_legacy is 1
+ # perl5 prints: $_legacy is
+
+=item * Double-colon valid package separator in variable name
+
+Double-colon is now a valid package separator in a variable name. Thus these
+behave differently in perl4 vs. perl5, because the packages don't exist.
+
+ $a=1;$b=2;$c=3;$var=4;
+ print "$a::$b::$c ";
+ print "$var::abc::xyz\n";
+
+ # perl4 prints: 1::2::3 4::abc::xyz
+ # perl5 prints: 3
+
+Given that C<::> is now the preferred package delimiter, it is debatable
+whether this should be classed as a bug or not.
+(The older package delimiter, ' ,is used here)
+
+ $x = 10;
+ print "x=${'x}\n";
+
+ # perl4 prints: x=10
+ # perl5 prints: Can't find string terminator "'" anywhere before EOF
+
+You can avoid this problem, and remain compatible with perl4, if you
+always explicitly include the package name:
+
+ $x = 10;
+ print "x=${main'x}\n";
+
+Also see precedence traps, for parsing C<$:>.
+
+=item * 2nd and 3rd args to C<splice()> are now in scalar context
+
+The second and third arguments of C<splice()> are now evaluated in scalar
+context (as the Camel says) rather than list context.
+
+ sub sub1{return(0,2) } # return a 2-element list
+ sub sub2{ return(1,2,3)} # return a 3-element list
+ @a1 = ("a","b","c","d","e");
+ @a2 = splice(@a1,&sub1,&sub2);
+ print join(' ',@a2),"\n";
+
+ # perl4 prints: a b
+ # perl5 prints: c d e
+
+=item * Can't do C<goto> into a block that is optimized away
+
+You can't do a C<goto> into a block that is optimized away. Darn.
+
+ goto marker1;
+
+ for(1){
+ marker1:
+ print "Here I is!\n";
+ }
+
+ # perl4 prints: Here I is!
+ # perl5 errors: Can't "goto" into the middle of a foreach loop
+
+=item * Can't use whitespace as variable name or quote delimiter
+
+It is no longer syntactically legal to use whitespace as the name
+of a variable, or as a delimiter for any kind of quote construct.
+Double darn.
+
+ $a = ("foo bar");
+ $b = q baz;
+ print "a is $a, b is $b\n";
+
+ # perl4 prints: a is foo bar, b is baz
+ # perl5 errors: Bareword found where operator expected
+
+=item * C<while/if BLOCK BLOCK> gone
+
+The archaic while/if BLOCK BLOCK syntax is no longer supported.
+
+ if { 1 } {
+ print "True!";
+ }
+ else {
+ print "False!";
+ }
+
+ # perl4 prints: True!
+ # perl5 errors: syntax error at test.pl line 1, near "if {"
+
+=item * C<**> binds tighter than unary minus
+
+The C<**> operator now binds more tightly than unary minus.
+It was documented to work this way before, but didn't.
+
+ print -4**2,"\n";
+
+ # perl4 prints: 16
+ # perl5 prints: -16
+
+=item * C<foreach> changed when iterating over a list
+
+The meaning of C<foreach{}> has changed slightly when it is iterating over a
+list which is not an array. This used to assign the list to a
+temporary array, but no longer does so (for efficiency). This means
+that you'll now be iterating over the actual values, not over copies of
+the values. Modifications to the loop variable can change the original
+values.
+
+ @list = ('ab','abc','bcd','def');
+ foreach $var (grep(/ab/,@list)){
+ $var = 1;
+ }
+ print (join(':',@list));
+
+ # perl4 prints: ab:abc:bcd:def
+ # perl5 prints: 1:1:bcd:def
+
+To retain Perl4 semantics you need to assign your list
+explicitly to a temporary array and then iterate over that. For
+example, you might need to change
+
+ foreach $var (grep(/ab/,@list)){
+
+to
+
+ foreach $var (@tmp = grep(/ab/,@list)){
+
+Otherwise changing $var will clobber the values of @list. (This most often
+happens when you use C<$_> for the loop variable, and call subroutines in
+the loop that don't properly localize C<$_>.)
+
+=item * C<split> with no args behavior changed
+
+C<split> with no arguments now behaves like C<split ' '> (which doesn't
+return an initial null field if $_ starts with whitespace), it used to
+behave like C<split /\s+/> (which does).
+
+ $_ = ' hi mom';
+ print join(':', split);
+
+ # perl4 prints: :hi:mom
+ # perl5 prints: hi:mom
+
+=item * B<-e> behavior fixed
+
+Perl 4 would ignore any text which was attached to an B<-e> switch,
+always taking the code snippet from the following arg. Additionally, it
+would silently accept an B<-e> switch without a following arg. Both of
+these behaviors have been fixed.
+
+ perl -e'print "attached to -e"' 'print "separate arg"'
+
+ # perl4 prints: separate arg
+ # perl5 prints: attached to -e
+
+ perl -e
+
+ # perl4 prints:
+ # perl5 dies: No code specified for -e.
+
+=item * C<push> returns number of elements in resulting list
+
+In Perl 4 the return value of C<push> was undocumented, but it was
+actually the last value being pushed onto the target list. In Perl 5
+the return value of C<push> is documented, but has changed, it is the
+number of elements in the resulting list.
+
+ @x = ('existing');
+ print push(@x, 'first new', 'second new');
+
+ # perl4 prints: second new
+ # perl5 prints: 3
+
+=item * Some error messages differ
+
+Some error messages will be different.
+
+=item * C<split()> honors subroutine args
+
+In Perl 4, if in list context the delimiters to the first argument of
+C<split()> were C<??>, the result would be placed in C<@_> as well as
+being returned. Perl 5 has more respect for your subroutine arguments.
+
+=item * Bugs removed
+
+Some bugs may have been inadvertently removed. :-)
+
+=back
+
+=head2 Parsing Traps
+
+Perl4-to-Perl5 traps from having to do with parsing.
+
+=over 4
+
+=item * Space between . and = triggers syntax error
+
+Note the space between . and =
+
+ $string . = "more string";
+ print $string;
+
+ # perl4 prints: more string
+ # perl5 prints: syntax error at - line 1, near ". ="
+
+=item * Better parsing in perl 5
+
+Better parsing in perl 5
+
+ sub foo {}
+ &foo
+ print("hello, world\n");
+
+ # perl4 prints: hello, world
+ # perl5 prints: syntax error
+
+=item * Function parsing
+
+"if it looks like a function, it is a function" rule.
+
+ print
+ ($foo == 1) ? "is one\n" : "is zero\n";
+
+ # perl4 prints: is zero
+ # perl5 warns: "Useless use of a constant in void context" if using -w
+
+=item * String interpolation of C<$#array> differs
+
+String interpolation of the C<$#array> construct differs when braces
+are to used around the name.
+
+ @a = (1..3);
+ print "${#a}";
+
+ # perl4 prints: 2
+ # perl5 fails with syntax error
+
+ @ = (1..3);
+ print "$#{a}";
+
+ # perl4 prints: {a}
+ # perl5 prints: 2
+
+=item * Perl guesses on C<map>, C<grep> followed by C<{> if it starts BLOCK or hash ref
+
+When perl sees C<map {> (or C<grep {>), it has to guess whether the C<{>
+starts a BLOCK or a hash reference. If it guesses wrong, it will report
+a syntax error near the C<}> and the missing (or unexpected) comma.
+
+Use unary C<+> before C<{> on a hash reference, and unary C<+> applied
+to the first thing in a BLOCK (after C<{>), for perl to guess right all
+the time. (See L<perlfunc/map>.)
+
+=back
+
+=head2 Numerical Traps
+
+Perl4-to-Perl5 traps having to do with numerical operators,
+operands, or output from same.
+
+=over 5
+
+=item * Formatted output and significant digits
+
+Formatted output and significant digits. In general, Perl 5
+tries to be more precise. For example, on a Solaris Sparc:
+
+ print 7.373504 - 0, "\n";
+ printf "%20.18f\n", 7.373504 - 0;
+
+ # Perl4 prints:
+ 7.3750399999999996141
+ 7.375039999999999614
+
+ # Perl5 prints:
+ 7.373504
+ 7.375039999999999614
+
+Notice how the first result looks better in Perl 5.
+
+Your results may vary, since your floating point formatting routines
+and even floating point format may be slightly different.
+
+=item * Auto-increment operator over signed int limit deleted
+
+This specific item has been deleted. It demonstrated how the auto-increment
+operator would not catch when a number went over the signed int limit. Fixed
+in version 5.003_04. But always be wary when using large integers.
+If in doubt:
+
+ use Math::BigInt;
+
+=item * Assignment of return values from numeric equality tests doesn't work
+
+Assignment of return values from numeric equality tests
+does not work in perl5 when the test evaluates to false (0).
+Logical tests now return a null, instead of 0
+
+ $p = ($test == 1);
+ print $p,"\n";
+
+ # perl4 prints: 0
+ # perl5 prints:
+
+Also see L<"General Regular Expression Traps using s///, etc.">
+for another example of this new feature...
+
+=item * Bitwise string ops
+
+When bitwise operators which can operate upon either numbers or
+strings (C<& | ^ ~>) are given only strings as arguments, perl4 would
+treat the operands as bitstrings so long as the program contained a call
+to the C<vec()> function. perl5 treats the string operands as bitstrings.
+(See L<perlop/Bitwise String Operators> for more details.)
+
+ $fred = "10";
+ $barney = "12";
+ $betty = $fred & $barney;
+ print "$betty\n";
+ # Uncomment the next line to change perl4's behavior
+ # ($dummy) = vec("dummy", 0, 0);
+
+ # Perl4 prints:
+ 8
+
+ # Perl5 prints:
+ 10
+
+ # If vec() is used anywhere in the program, both print:
+ 10
+
+=back
+
+=head2 General data type traps
+
+Perl4-to-Perl5 traps involving most data-types, and their usage
+within certain expressions and/or context.
+
+=over 5
+
+=item * Negative array subscripts now count from the end of array
+
+Negative array subscripts now count from the end of the array.
+
+ @a = (1, 2, 3, 4, 5);
+ print "The third element of the array is $a[3] also expressed as $a[-2] \n";
+
+ # perl4 prints: The third element of the array is 4 also expressed as
+ # perl5 prints: The third element of the array is 4 also expressed as 4
+
+=item * Setting C<$#array> lower now discards array elements
+
+Setting C<$#array> lower now discards array elements, and makes them
+impossible to recover.
+
+ @a = (a,b,c,d,e);
+ print "Before: ",join('',@a);
+ $#a =1;
+ print ", After: ",join('',@a);
+ $#a =3;
+ print ", Recovered: ",join('',@a),"\n";
+
+ # perl4 prints: Before: abcde, After: ab, Recovered: abcd
+ # perl5 prints: Before: abcde, After: ab, Recovered: ab
+
+=item * Hashes get defined before use
+
+Hashes get defined before use
+
+ local($s,@a,%h);
+ die "scalar \$s defined" if defined($s);
+ die "array \@a defined" if defined(@a);
+ die "hash \%h defined" if defined(%h);
+
+ # perl4 prints:
+ # perl5 dies: hash %h defined
+
+Perl will now generate a warning when it sees defined(@a) and
+defined(%h).
+
+=item * Glob assignment from localized variable to variable
+
+glob assignment from variable to variable will fail if the assigned
+variable is localized subsequent to the assignment
+
+ @a = ("This is Perl 4");
+ *b = *a;
+ local(@a);
+ print @b,"\n";
+
+ # perl4 prints: This is Perl 4
+ # perl5 prints:
+
+=item * Assigning C<undef> to glob
+
+Assigning C<undef> to a glob has no effect in Perl 5. In Perl 4
+it undefines the associated scalar (but may have other side effects
+including SEGVs). Perl 5 will also warn if C<undef> is assigned to a
+typeglob. (Note that assigning C<undef> to a typeglob is different
+than calling the C<undef> function on a typeglob (C<undef *foo>), which
+has quite a few effects.
+
+ $foo = "bar";
+ *foo = undef;
+ print $foo;
+
+ # perl4 prints:
+ # perl4 warns: "Use of uninitialized variable" if using -w
+ # perl5 prints: bar
+ # perl5 warns: "Undefined value assigned to typeglob" if using -w
+
+=item * Changes in unary negation (of strings)
+
+Changes in unary negation (of strings)
+This change effects both the return value and what it
+does to auto(magic)increment.
+
+ $x = "aaa";
+ print ++$x," : ";
+ print -$x," : ";
+ print ++$x,"\n";
+
+ # perl4 prints: aab : -0 : 1
+ # perl5 prints: aab : -aab : aac
+
+=item * Modifying of constants prohibited
+
+perl 4 lets you modify constants:
+
+ $foo = "x";
+ &mod($foo);
+ for ($x = 0; $x < 3; $x++) {
+ &mod("a");
+ }
+ sub mod {
+ print "before: $_[0]";
+ $_[0] = "m";
+ print " after: $_[0]\n";
+ }
+
+ # perl4:
+ # before: x after: m
+ # before: a after: m
+ # before: m after: m
+ # before: m after: m
+
+ # Perl5:
+ # before: x after: m
+ # Modification of a read-only value attempted at foo.pl line 12.
+ # before: a
+
+=item * C<defined $var> behavior changed
+
+The behavior is slightly different for:
+
+ print "$x", defined $x
+
+ # perl 4: 1
+ # perl 5: <no output, $x is not called into existence>
+
+=item * Variable Suicide
+
+Variable suicide behavior is more consistent under Perl 5.
+Perl5 exhibits the same behavior for hashes and scalars,
+that perl4 exhibits for only scalars.
+
+ $aGlobal{ "aKey" } = "global value";
+ print "MAIN:", $aGlobal{"aKey"}, "\n";
+ $GlobalLevel = 0;
+ &test( *aGlobal );
+
+ sub test {
+ local( *theArgument ) = @_;
+ local( %aNewLocal ); # perl 4 != 5.001l,m
+ $aNewLocal{"aKey"} = "this should never appear";
+ print "SUB: ", $theArgument{"aKey"}, "\n";
+ $aNewLocal{"aKey"} = "level $GlobalLevel"; # what should print
+ $GlobalLevel++;
+ if( $GlobalLevel<4 ) {
+ &test( *aNewLocal );
+ }
+ }
+
+ # Perl4:
+ # MAIN:global value
+ # SUB: global value
+ # SUB: level 0
+ # SUB: level 1
+ # SUB: level 2
+
+ # Perl5:
+ # MAIN:global value
+ # SUB: global value
+ # SUB: this should never appear
+ # SUB: this should never appear
+ # SUB: this should never appear
+
+=back
+
+=head2 Context Traps - scalar, list contexts
+
+=over 5
+
+=item * Elements of argument lists for formats evaluated in list context
+
+The elements of argument lists for formats are now evaluated in list
+context. This means you can interpolate list values now.
+
+ @fmt = ("foo","bar","baz");
+ format STDOUT=
+ @<<<<< @||||| @>>>>>
+ @fmt;
+ .
+ write;
+
+ # perl4 errors: Please use commas to separate fields in file
+ # perl5 prints: foo bar baz
+
+=item * C<caller()> returns false value in scalar context if no caller present
+
+The C<caller()> function now returns a false value in a scalar context
+if there is no caller. This lets library files determine if they're
+being required.
+
+ caller() ? (print "You rang?\n") : (print "Got a 0\n");
+
+ # perl4 errors: There is no caller
+ # perl5 prints: Got a 0
+
+=item * Comma operator in scalar context gives scalar context to args
+
+The comma operator in a scalar context is now guaranteed to give a
+scalar context to its arguments.
+
+ @y= ('a','b','c');
+ $x = (1, 2, @y);
+ print "x = $x\n";
+
+ # Perl4 prints: x = c # Thinks list context interpolates list
+ # Perl5 prints: x = 3 # Knows scalar uses length of list
+
+=item * C<sprintf()> prototyped as C<($;@)>
+
+C<sprintf()> is prototyped as ($;@), so its first argument is given scalar
+context. Thus, if passed an array, it will probably not do what you want,
+unlike Perl 4:
+
+ @z = ('%s%s', 'foo', 'bar');
+ $x = sprintf(@z);
+ print $x;
+
+ # perl4 prints: foobar
+ # perl5 prints: 3
+
+C<printf()> works the same as it did in Perl 4, though:
+
+ @z = ('%s%s', 'foo', 'bar');
+ printf STDOUT (@z);
+
+ # perl4 prints: foobar
+ # perl5 prints: foobar
+
+=back
+
+=head2 Precedence Traps
+
+Perl4-to-Perl5 traps involving precedence order.
+
+Perl 4 has almost the same precedence rules as Perl 5 for the operators
+that they both have. Perl 4 however, seems to have had some
+inconsistencies that made the behavior differ from what was documented.
+
+=over 5
+
+=item * LHS vs. RHS of any assignment operator
+
+LHS vs. RHS of any assignment operator. LHS is evaluated first
+in perl4, second in perl5; this can affect the relationship
+between side-effects in sub-expressions.
+
+ @arr = ( 'left', 'right' );
+ $a{shift @arr} = shift @arr;
+ print join( ' ', keys %a );
+
+ # perl4 prints: left
+ # perl5 prints: right
+
+=item * Semantic errors introduced due to precedence
+
+These are now semantic errors because of precedence:
+
+ @list = (1,2,3,4,5);
+ %map = ("a",1,"b",2,"c",3,"d",4);
+ $n = shift @list + 2; # first item in list plus 2
+ print "n is $n, ";
+ $m = keys %map + 2; # number of items in hash plus 2
+ print "m is $m\n";
+
+ # perl4 prints: n is 3, m is 6
+ # perl5 errors and fails to compile
+
+=item * Precedence of assignment operators same as the precedence of assignment
+
+The precedence of assignment operators is now the same as the precedence
+of assignment. Perl 4 mistakenly gave them the precedence of the associated
+operator. So you now must parenthesize them in expressions like
+
+ /foo/ ? ($a += 2) : ($a -= 2);
+
+Otherwise
+
+ /foo/ ? $a += 2 : $a -= 2
+
+would be erroneously parsed as
+
+ (/foo/ ? $a += 2 : $a) -= 2;
+
+On the other hand,
+
+ $a += /foo/ ? 1 : 2;
+
+now works as a C programmer would expect.
+
+=item * C<open> requires parentheses around filehandle
+
+ open FOO || die;
+
+is now incorrect. You need parentheses around the filehandle.
+Otherwise, perl5 leaves the statement as its default precedence:
+
+ open(FOO || die);
+
+ # perl4 opens or dies
+ # perl5 opens FOO, dying only if 'FOO' is false, i.e. never
+
+=item * C<$:> precedence over C<$::> gone
+
+perl4 gives the special variable, C<$:> precedence, where perl5
+treats C<$::> as main C<package>
+
+ $a = "x"; print "$::a";
+
+ # perl 4 prints: -:a
+ # perl 5 prints: x
+
+=item * Precedence of file test operators documented
+
+perl4 had buggy precedence for the file test operators vis-a-vis
+the assignment operators. Thus, although the precedence table
+for perl4 leads one to believe C<-e $foo .= "q"> should parse as
+C<((-e $foo) .= "q")>, it actually parses as C<(-e ($foo .= "q"))>.
+In perl5, the precedence is as documented.
+
+ -e $foo .= "q"
+
+ # perl4 prints: no output
+ # perl5 prints: Can't modify -e in concatenation
+
+=item * C<keys>, C<each>, C<values> are regular named unary operators
+
+In perl4, keys(), each() and values() were special high-precedence operators
+that operated on a single hash, but in perl5, they are regular named unary
+operators. As documented, named unary operators have lower precedence
+than the arithmetic and concatenation operators C<+ - .>, but the perl4
+variants of these operators actually bind tighter than C<+ - .>.
+Thus, for:
+
+ %foo = 1..10;
+ print keys %foo - 1
+
+ # perl4 prints: 4
+ # perl5 prints: Type of arg 1 to keys must be hash (not subtraction)
+
+The perl4 behavior was probably more useful, if less consistent.
+
+=back
+
+=head2 General Regular Expression Traps using s///, etc.
+
+All types of RE traps.
+
+=over 5
+
+=item * C<s'$lhs'$rhs'> interpolates on either side
+
+C<s'$lhs'$rhs'> now does no interpolation on either side. It used to
+interpolate $lhs but not $rhs. (And still does not match a literal
+'$' in string)
+
+ $a=1;$b=2;
+ $string = '1 2 $a $b';
+ $string =~ s'$a'$b';
+ print $string,"\n";
+
+ # perl4 prints: $b 2 $a $b
+ # perl5 prints: 1 2 $a $b
+
+=item * C<m//g> attaches its state to the searched string
+
+C<m//g> now attaches its state to the searched string rather than the
+regular expression. (Once the scope of a block is left for the sub, the
+state of the searched string is lost)
+
+ $_ = "ababab";
+ while(m/ab/g){
+ &doit("blah");
+ }
+ sub doit{local($_) = shift; print "Got $_ "}
+
+ # perl4 prints: Got blah Got blah Got blah Got blah
+ # perl5 prints: infinite loop blah...
+
+=item * C<m//o> used within an anonymous sub
+
+Currently, if you use the C<m//o> qualifier on a regular expression
+within an anonymous sub, I<all> closures generated from that anonymous
+sub will use the regular expression as it was compiled when it was used
+the very first time in any such closure. For instance, if you say
+
+ sub build_match {
+ my($left,$right) = @_;
+ return sub { $_[0] =~ /$left stuff $right/o; };
+ }
+ $good = build_match('foo','bar');
+ $bad = build_match('baz','blarch');
+ print $good->('foo stuff bar') ? "ok\n" : "not ok\n";
+ print $bad->('baz stuff blarch') ? "ok\n" : "not ok\n";
+ print $bad->('foo stuff bar') ? "not ok\n" : "ok\n";
+
+For most builds of Perl5, this will print:
+ok
+not ok
+not ok
+
+build_match() will always return a sub which matches the contents of
+$left and $right as they were the I<first> time that build_match()
+was called, not as they are in the current call.
+
+=item * C<$+> isn't set to whole match
+
+If no parentheses are used in a match, Perl4 sets C<$+> to
+the whole match, just like C<$&>. Perl5 does not.
+
+ "abcdef" =~ /b.*e/;
+ print "\$+ = $+\n";
+
+ # perl4 prints: bcde
+ # perl5 prints:
+
+=item * Substitution now returns null string if it fails
+
+substitution now returns the null string if it fails
+
+ $string = "test";
+ $value = ($string =~ s/foo//);
+ print $value, "\n";
+
+ # perl4 prints: 0
+ # perl5 prints:
+
+Also see L<Numerical Traps> for another example of this new feature.
+
+=item * C<s`lhs`rhs`> is now a normal substitution
+
+C<s`lhs`rhs`> (using backticks) is now a normal substitution, with no
+backtick expansion
+
+ $string = "";
+ $string =~ s`^`hostname`;
+ print $string, "\n";
+
+ # perl4 prints: <the local hostname>
+ # perl5 prints: hostname
+
+=item * Stricter parsing of variables in regular expressions
+
+Stricter parsing of variables used in regular expressions
+
+ s/^([^$grpc]*$grpc[$opt$plus$rep]?)//o;
+
+ # perl4: compiles w/o error
+ # perl5: with Scalar found where operator expected ..., near "$opt$plus"
+
+an added component of this example, apparently from the same script, is
+the actual value of the s'd string after the substitution.
+C<[$opt]> is a character class in perl4 and an array subscript in perl5
+
+ $grpc = 'a';
+ $opt = 'r';
+ $_ = 'bar';
+ s/^([^$grpc]*$grpc[$opt]?)/foo/;
+ print;
+
+ # perl4 prints: foo
+ # perl5 prints: foobar
+
+=item * C<m?x?> matches only once
+
+Under perl5, C<m?x?> matches only once, like C<?x?>. Under perl4, it matched
+repeatedly, like C</x/> or C<m!x!>.
+
+ $test = "once";
+ sub match { $test =~ m?once?; }
+ &match();
+ if( &match() ) {
+ # m?x? matches more then once
+ print "perl4\n";
+ } else {
+ # m?x? matches only once
+ print "perl5\n";
+ }
+
+ # perl4 prints: perl4
+ # perl5 prints: perl5
+
+=item * Failed matches don't reset the match variables
+
+Unlike in Ruby, failed matches in Perl do not reset the match variables
+($1, $2, ..., C<$`>, ...).
+
+=back
+
+=head2 Subroutine, Signal, Sorting Traps
+
+The general group of Perl4-to-Perl5 traps having to do with
+Signals, Sorting, and their related subroutines, as well as
+general subroutine traps. Includes some OS-Specific traps.
+
+=over 5
+
+=item * Barewords that used to look like strings look like subroutine calls
+
+Barewords that used to look like strings to Perl will now look like subroutine
+calls if a subroutine by that name is defined before the compiler sees them.
+
+ sub SeeYa { warn"Hasta la vista, baby!" }
+ $SIG{'TERM'} = SeeYa;
+ print "SIGTERM is now $SIG{'TERM'}\n";
+
+ # perl4 prints: SIGTERM is now main'SeeYa
+ # perl5 prints: SIGTERM is now main::1 (and warns "Hasta la vista, baby!")
+
+Use B<-w> to catch this one
+
+=item * Reverse is no longer allowed as the name of a sort subroutine
+
+reverse is no longer allowed as the name of a sort subroutine.
+
+ sub reverse{ print "yup "; $a <=> $b }
+ print sort reverse (2,1,3);
+
+ # perl4 prints: yup yup 123
+ # perl5 prints: 123
+ # perl5 warns (if using -w): Ambiguous call resolved as CORE::reverse()
+
+=item * C<warn()> won't let you specify a filehandle.
+
+Although it _always_ printed to STDERR, warn() would let you specify a
+filehandle in perl4. With perl5 it does not.
+
+ warn STDERR "Foo!";
+
+ # perl4 prints: Foo!
+ # perl5 prints: String found where operator expected
+
+=back
+
+=head2 OS Traps
+
+=over 5
+
+=item * SysV resets signal handler correctly
+
+Under HPUX, and some other SysV OSes, one had to reset any signal handler,
+within the signal handler function, each time a signal was handled with
+perl4. With perl5, the reset is now done correctly. Any code relying
+on the handler _not_ being reset will have to be reworked.
+
+Since version 5.002, Perl uses sigaction() under SysV.
+
+ sub gotit {
+ print "Got @_... ";
+ }
+ $SIG{'INT'} = 'gotit';
+
+ $| = 1;
+ $pid = fork;
+ if ($pid) {
+ kill('INT', $pid);
+ sleep(1);
+ kill('INT', $pid);
+ } else {
+ while (1) {sleep(10);}
+ }
+
+ # perl4 (HPUX) prints: Got INT...
+ # perl5 (HPUX) prints: Got INT... Got INT...
+
+=item * SysV C<seek()> appends correctly
+
+Under SysV OSes, C<seek()> on a file opened to append C<<< >> >>> now does
+the right thing w.r.t. the fopen() manpage. e.g., - When a file is opened
+for append, it is impossible to overwrite information already in
+the file.
+
+ open(TEST,">>seek.test");
+ $start = tell TEST;
+ foreach(1 .. 9){
+ print TEST "$_ ";
+ }
+ $end = tell TEST;
+ seek(TEST,$start,0);
+ print TEST "18 characters here";
+
+ # perl4 (solaris) seek.test has: 18 characters here
+ # perl5 (solaris) seek.test has: 1 2 3 4 5 6 7 8 9 18 characters here
+
+
+
+=back
+
+=head2 Interpolation Traps
+
+Perl4-to-Perl5 traps having to do with how things get interpolated
+within certain expressions, statements, contexts, or whatever.
+
+=over 5
+
+=item * C<@> always interpolates an array in double-quotish strings
+
+@ now always interpolates an array in double-quotish strings.
+
+ print "To: someone@somewhere.com\n";
+
+ # perl4 prints: To:someone@somewhere.com
+ # perl < 5.6.1, error : In string, @somewhere now must be written as \@somewhere
+ # perl >= 5.6.1, warning : Possible unintended interpolation of @somewhere in string
+
+=item * Double-quoted strings may no longer end with an unescaped $
+
+Double-quoted strings may no longer end with an unescaped $.
+
+ $foo = "foo$";
+ print "foo is $foo\n";
+
+ # perl4 prints: foo is foo$
+ # perl5 errors: Final $ should be \$ or $name
+
+Note: perl5 DOES NOT error on the terminating @ in $bar
+
+=item * Arbitrary expressions are evaluated inside braces within double quotes
+
+Perl now sometimes evaluates arbitrary expressions inside braces that occur
+within double quotes (usually when the opening brace is preceded by C<$>
+or C<@>).
+
+ @www = "buz";
+ $foo = "foo";
+ $bar = "bar";
+ sub foo { return "bar" };
+ print "|@{w.w.w}|${main'foo}|";
+
+ # perl4 prints: |@{w.w.w}|foo|
+ # perl5 prints: |buz|bar|
+
+Note that you can C<use strict;> to ward off such trappiness under perl5.
+
+=item * C<$$x> now tries to dereference $x
+
+The construct "this is $$x" used to interpolate the pid at that point, but
+now tries to dereference $x. C<$$> by itself still works fine, however.
+
+ $s = "a reference";
+ $x = *s;
+ print "this is $$x\n";
+
+ # perl4 prints: this is XXXx (XXX is the current pid)
+ # perl5 prints: this is a reference
+
+=item * Creation of hashes on the fly with C<eval "EXPR"> requires protection
+
+Creation of hashes on the fly with C<eval "EXPR"> now requires either both
+C<$>'s to be protected in the specification of the hash name, or both curlies
+to be protected. If both curlies are protected, the result will be compatible
+with perl4 and perl5. This is a very common practice, and should be changed
+to use the block form of C<eval{}> if possible.
+
+ $hashname = "foobar";
+ $key = "baz";
+ $value = 1234;
+ eval "\$$hashname{'$key'} = q|$value|";
+ (defined($foobar{'baz'})) ? (print "Yup") : (print "Nope");
+
+ # perl4 prints: Yup
+ # perl5 prints: Nope
+
+Changing
+
+ eval "\$$hashname{'$key'} = q|$value|";
+
+to
+
+ eval "\$\$hashname{'$key'} = q|$value|";
+
+causes the following result:
+
+ # perl4 prints: Nope
+ # perl5 prints: Yup
+
+or, changing to
+
+ eval "\$$hashname\{'$key'\} = q|$value|";
+
+causes the following result:
+
+ # perl4 prints: Yup
+ # perl5 prints: Yup
+ # and is compatible for both versions
+
+
+=item * Bugs in earlier perl versions
+
+perl4 programs which unconsciously rely on the bugs in earlier perl versions.
+
+ perl -e '$bar=q/not/; print "This is $foo{$bar} perl5"'
+
+ # perl4 prints: This is not perl5
+ # perl5 prints: This is perl5
+
+=item * Array and hash brackets during interpolation
+
+You also have to be careful about array and hash brackets during
+interpolation.
+
+ print "$foo["
+
+ perl 4 prints: [
+ perl 5 prints: syntax error
+
+ print "$foo{"
+
+ perl 4 prints: {
+ perl 5 prints: syntax error
+
+Perl 5 is expecting to find an index or key name following the respective
+brackets, as well as an ending bracket of the appropriate type. In order
+to mimic the behavior of Perl 4, you must escape the bracket like so.
+
+ print "$foo\[";
+ print "$foo\{";
+
+=item * Interpolation of C<\$$foo{bar}>
+
+Similarly, watch out for: C<\$$foo{bar}>
+
+ $foo = "baz";
+ print "\$$foo{bar}\n";
+
+ # perl4 prints: $baz{bar}
+ # perl5 prints: $
+
+Perl 5 is looking for C<$foo{bar}> which doesn't exist, but perl 4 is
+happy just to expand $foo to "baz" by itself. Watch out for this
+especially in C<eval>'s.
+
+=item * C<qq()> string passed to C<eval> will not find string terminator
+
+C<qq()> string passed to C<eval>
+
+ eval qq(
+ foreach \$y (keys %\$x\) {
+ \$count++;
+ }
+ );
+
+ # perl4 runs this ok
+ # perl5 prints: Can't find string terminator ")"
+
+=back
+
+=head2 DBM Traps
+
+General DBM traps.
+
+=over 5
+
+=item * Perl5 must have been linked with same dbm/ndbm as the default for C<dbmopen()>
+
+Existing dbm databases created under perl4 (or any other dbm/ndbm tool)
+may cause the same script, run under perl5, to fail. The build of perl5
+must have been linked with the same dbm/ndbm as the default for C<dbmopen()>
+to function properly without C<tie>'ing to an extension dbm implementation.
+
+ dbmopen (%dbm, "file", undef);
+ print "ok\n";
+
+ # perl4 prints: ok
+ # perl5 prints: ok (IFF linked with -ldbm or -lndbm)
+
+
+=item * DBM exceeding limit on the key/value size will cause perl5 to exit immediately
+
+Existing dbm databases created under perl4 (or any other dbm/ndbm tool)
+may cause the same script, run under perl5, to fail. The error generated
+when exceeding the limit on the key/value size will cause perl5 to exit
+immediately.
+
+ dbmopen(DB, "testdb",0600) || die "couldn't open db! $!";
+ $DB{'trap'} = "x" x 1024; # value too large for most dbm/ndbm
+ print "YUP\n";
+
+ # perl4 prints:
+ dbm store returned -1, errno 28, key "trap" at - line 3.
+ YUP
+
+ # perl5 prints:
+ dbm store returned -1, errno 28, key "trap" at - line 3.
+
+=back
+
+=head2 Unclassified Traps
+
+Everything else.
+
+=over 5
+
+=item * C<require>/C<do> trap using returned value
+
+If the file doit.pl has:
+
+ sub foo {
+ $rc = do "./do.pl";
+ return 8;
+ }
+ print &foo, "\n";
+
+And the do.pl file has the following single line:
+
+ return 3;
+
+Running doit.pl gives the following:
+
+ # perl 4 prints: 3 (aborts the subroutine early)
+ # perl 5 prints: 8
+
+Same behavior if you replace C<do> with C<require>.
+
+=item * C<split> on empty string with LIMIT specified
+
+ $string = '';
+ @list = split(/foo/, $string, 2)
+
+Perl4 returns a one element list containing the empty string but Perl5
+returns an empty list.
+
+=back
+
+As always, if any of these are ever officially declared as bugs,
+they'll be fixed and removed.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perltru64.pod b/Master/tlpkg/tlperl.straw/lib/pods/perltru64.pod
new file mode 100755
index 00000000000..6961a0e7c17
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perltru64.pod
@@ -0,0 +1,172 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.tru64 - Perl version 5 on Tru64 (formerly known as Digital UNIX formerly known as DEC OSF/1) systems
+
+=head1 DESCRIPTION
+
+This document describes various features of HP's (formerly Compaq's,
+formerly Digital's) Unix operating system (Tru64) that will affect
+how Perl version 5 (hereafter just Perl) is configured, compiled
+and/or runs.
+
+=head2 Compiling Perl 5 on Tru64
+
+The recommended compiler to use in Tru64 is the native C compiler.
+The native compiler produces much faster code (the speed difference is
+noticeable: several dozen percentages) and also more correct code: if
+you are considering using the GNU C compiler you should use at the
+very least the release of 2.95.3 since all older gcc releases are
+known to produce broken code when compiling Perl. One manifestation
+of this brokenness is the lib/sdbm test dumping core; another is many
+of the op/regexp and op/pat, or ext/Storable tests dumping core
+(the exact pattern of failures depending on the GCC release and
+optimization flags).
+
+gcc 3.2.1 is known to work okay with Perl 5.8.0. However, when
+optimizing the toke.c gcc likes to have a lot of memory, 256 megabytes
+seems to be enough. The default setting of the process data section
+in Tru64 should be one gigabyte, but some sites/setups might have
+lowered that. The configuration process of Perl checks for too low
+process limits, and lowers the optimization for the toke.c if
+necessary, and also gives advice on how to raise the process limits.
+
+Also, Configure might abort with
+
+ Build a threading Perl? [n]
+ Configure[2437]: Syntax error at line 1 : `config.sh' is not expected.
+
+This indicates that Configure is being run with a broken Korn shell
+(even though you think you are using a Bourne shell by using
+"sh Configure" or "./Configure"). The Korn shell bug has been reported
+to Compaq as of February 1999 but in the meanwhile, the reason ksh is
+being used is that you have the environment variable BIN_SH set to
+'xpg4'. This causes /bin/sh to delegate its duties to /bin/posix/sh
+(a ksh). Unset the environment variable and rerun Configure.
+
+=head2 Using Large Files with Perl on Tru64
+
+In Tru64 Perl is automatically able to use large files, that is,
+files larger than 2 gigabytes, there is no need to use the Configure
+-Duselargefiles option as described in INSTALL (though using the option
+is harmless).
+
+=head2 Threaded Perl on Tru64
+
+If you want to use threads, you should primarily use the Perl
+5.8.0 threads model by running Configure with -Duseithreads.
+
+Perl threading is going to work only in Tru64 4.0 and newer releases,
+older operating releases like 3.2 aren't probably going to work
+properly with threads.
+
+In Tru64 V5 (at least V5.1A, V5.1B) you cannot build threaded Perl with gcc
+because the system header <pthread.h> explicitly checks for supported
+C compilers, gcc (at least 3.2.2) not being one of them. But the
+system C compiler should work just fine.
+
+=head2 Long Doubles on Tru64
+
+You cannot Configure Perl to use long doubles unless you have at least
+Tru64 V5.0, the long double support simply wasn't functional enough
+before that. Perl's Configure will override attempts to use the long
+doubles (you can notice this by Configure finding out that the modfl()
+function does not work as it should).
+
+At the time of this writing (June 2002), there is a known bug in the
+Tru64 libc printing of long doubles when not using "e" notation.
+The values are correct and usable, but you only get a limited number
+of digits displayed unless you force the issue by using C<printf
+"%.33e",$num> or the like. For Tru64 versions V5.0A through V5.1A, a
+patch is expected sometime after perl 5.8.0 is released. If your libc
+has not yet been patched, you'll get a warning from Configure when
+selecting long doubles.
+
+=head2 DB_File tests failing on Tru64
+
+The DB_File tests (db-btree.t, db-hash.t, db-recno.t) may fail you
+have installed a newer version of Berkeley DB into the system and the
+-I and -L compiler and linker flags introduce version conflicts with
+the DB 1.85 headers and libraries that came with the Tru64. For example,
+mixing a DB v2 library with the DB v1 headers is a bad idea. Watch
+out for Configure options -Dlocincpth and -Dloclibpth, and check your
+/usr/local/include and /usr/local/lib since they are included by default.
+
+The second option is to explicitly instruct Configure to detect the
+newer Berkeley DB installation, by supplying the right directories with
+C<-Dlocincpth=/some/include> and C<-Dloclibpth=/some/lib> B<and> before
+running "make test" setting your LD_LIBRARY_PATH to F</some/lib>.
+
+The third option is to work around the problem by disabling the
+DB_File completely when build Perl by specifying -Ui_db to Configure,
+and then using the BerkeleyDB module from CPAN instead of DB_File.
+The BerkeleyDB works with Berkeley DB versions 2.* or greater.
+
+The Berkeley DB 4.1.25 has been tested with Tru64 V5.1A and found
+to work. The latest Berkeley DB can be found from F<http://www.sleepycat.com>.
+
+=head2 64-bit Perl on Tru64
+
+In Tru64 Perl's integers are automatically 64-bit wide, there is
+no need to use the Configure -Duse64bitint option as described
+in INSTALL. Similarly, there is no need for -Duse64bitall
+since pointers are automatically 64-bit wide.
+
+=head2 Warnings about floating-point overflow when compiling Perl on Tru64
+
+When compiling Perl in Tru64 you may (depending on the compiler
+release) see two warnings like this
+
+ cc: Warning: numeric.c, line 104: In this statement, floating-point overflow occurs in evaluating the expression "1.8e308". (floatoverfl)
+ return HUGE_VAL;
+ -----------^
+
+and when compiling the POSIX extension
+
+ cc: Warning: const-c.inc, line 2007: In this statement, floating-point overflow occurs in evaluating the expression "1.8e308". (floatoverfl)
+ return HUGE_VAL;
+ -------------------^
+
+The exact line numbers may vary between Perl releases. The warnings
+are benign and can be ignored: in later C compiler releases the warnings
+should be gone.
+
+When the file F<pp_sys.c> is being compiled you may (depending on the
+operating system release) see an additional compiler flag being used:
+C<-DNO_EFF_ONLY_OK>. This is normal and refers to a feature that is
+relevant only if you use the C<filetest> pragma. In older releases of
+the operating system the feature was broken and the NO_EFF_ONLY_OK
+instructs Perl not to use the feature.
+
+=head1 Testing Perl on Tru64
+
+During "make test" the C<comp/cpp> will be skipped because on Tru64 it
+cannot be tested before Perl has been installed. The test refers to
+the use of the C<-P> option of Perl.
+
+=head1 ext/ODBM_File/odbm Test Failing With Static Builds
+
+The ext/ODBM_File/odbm is known to fail with static builds
+(Configure -Uusedl) due to a known bug in Tru64's static libdbm
+library. The good news is that you very probably don't need to ever
+use the ODBM_File extension since more advanced NDBM_File works fine,
+not to mention the even more advanced DB_File.
+
+=head1 Perl Fails Because Of Unresolved Symbol sockatmark
+
+If you get an error like
+
+ Can't load '.../OSF1/lib/perl5/5.8.0/alpha-dec_osf/auto/IO/IO.so' for module IO: Unresolved symbol in .../lib/perl5/5.8.0/alpha-dec_osf/auto/IO/IO.so: sockatmark at .../lib/perl5/5.8.0/alpha-dec_osf/XSLoader.pm line 75.
+
+you need to either recompile your Perl in Tru64 4.0D or upgrade your
+Tru64 4.0D to at least 4.0F: the sockatmark() system call was
+added in Tru64 4.0F, and the IO extension refers that symbol.
+
+=head1 AUTHOR
+
+Jarkko Hietaniemi <jhi@iki.fi>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perltw.pod b/Master/tlpkg/tlperl.straw/lib/pods/perltw.pod
new file mode 100755
index 00000000000..f2e5eb86318
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perltw.pod
@@ -0,0 +1,176 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+The following documentation is written in Big5 encoding.
+
+¦pªG§A¥Î¤@¯ëªº¤å¦r½s¿è¾¹¾\Äý³o¥÷¤å¥ó, ½Ð©¿²¤¤å¤¤©_¯Sªºµù°O¦r²Å.
+³o¥÷¤å¥ó¬O¥H POD (²©ú¤å¥ó®æ¦¡) ¼g¦¨; ³oºØ®æ¦¡¬O¬°¤F¯àÅý¤Hª½±µÅª¨ú,
+¦Ó¯S§O³]­pªº. Ãö©ó¦¹®æ¦¡ªº¶i¤@¨B¸ê°T, ½Ð°Ñ¦Ò perlpod ½u¤W¤å¥ó.
+
+=encoding big5
+
+=head1 NAME
+
+perltw - ¥¿Å餤¤å Perl «ü«n
+
+=head1 DESCRIPTION
+
+Åwªï¨Ó¨ì Perl ªº¤Ñ¦a!
+
+±q 5.8.0 ª©¶}©l, Perl ¨ã³Æ¤F§¹µ½ªº Unicode (¸U°ê½X) ¤ä´©,
+¤]³s±a¤ä´©¤F³\¦h©Ô¤B»y¨t¥H¥~ªº½s½X¤è¦¡; CJK (¤¤¤éÁú) «K¬O¨ä¤¤ªº¤@³¡¥÷.
+Unicode ¬O°ê»Ú©Êªº¼Ð·Ç, ¸Õ¹Ï²[»\¥@¬É¤W©Ò¦³ªº¦r²Å: ¦è¤è¥@¬É, ªF¤è¥@¬É,
+¥H¤Î¨âªÌ¶¡ªº¤@¤Á (§Æþ¤å, ±Ô§Q¨È¤å, ªü©Ô§B¤å, §Æ§B¨Ó¤å, ¦L«×¤å,
+¦L¦a¦w¤å, µ¥µ¥). ¥¦¤]®e¯Ç¤F¦hºØ§@·~¨t²Î»P¥­»O (¦p PC ¤Î³Áª÷¶ð).
+
+Perl ¥»¨­¥H Unicode ¶i¦æ¾Þ§@. ³oªí¥Ü Perl ¤º³¡ªº¦r¦ê¸ê®Æ¥i¥Î Unicode
+ªí¥Ü; Perl ªº¨ç¦¡»Pºâ²Å (¨Ò¦p¥¿³Wªí¥Ü¦¡¤ñ¹ï) ¤]¯à¹ï Unicode ¶i¦æ¾Þ§@.
+¦b¿é¤J¤Î¿é¥X®É, ¬°¤F³B²z¥H Unicode ¤§«eªº½s½X¤è¦¡Àx¦sªº¸ê®Æ, Perl
+´£¨Ñ¤F Encode ³o­Ó¼Ò²Õ, ¥i¥HÅý§A»´©ö¦aŪ¨ú¤Î¼g¤J¦³ªº½s½X¸ê®Æ.
+
+Encode ©µ¦ù¼Ò²Õ¤ä´©¤U¦C¥¿Å餤¤åªº½s½X¤è¦¡ ('big5' ªí¥Ü 'big5-eten'):
+
+ big5-eten Big5 ½s½X (§t­Ê¤Ñ©µ¦ù¦r§Î)
+ big5-hkscs Big5 + ­»´ä¥~¦r¶°, 2001 ¦~ª©
+ cp950 ¦r½X­¶ 950 (Big5 + ·L³n²K¥[ªº¦r²Å)
+
+Á|¨Ò¨Ó»¡, ±N Big5 ½s½XªºÀÉ®×Âন Unicode, ¯­»ÝÁä¤J¤U¦C«ü¥O:
+
+ perl -Mencoding=big5,STDOUT,utf8 -pe1 < file.big5 > file.utf8
+
+Perl ¤]¤ºªþ¤F "piconv", ¤@¤ä§¹¥þ¥H Perl ¼g¦¨ªº¦r²ÅÂà´«¤u¨ãµ{¦¡, ¥Îªk¦p¤U:
+
+ piconv -f big5 -t utf8 < file.big5 > file.utf8
+ piconv -f utf8 -t big5 < file.utf8 > file.big5
+
+¥t¥~, §Q¥Î encoding ¼Ò²Õ, §A¥i¥H»´©ö¼g¥X¥H¦r²Å¬°³æ¦ìªºµ{¦¡½X, ¦p¤U©Ò¥Ü:
+
+ #!/usr/bin/env perl
+ # ±Ò°Ê big5 ¦r¦ê¸ÑªR; ¼Ð·Ç¿é¥X¤J¤Î¼Ð·Ç¿ù»~³£³]¬° big5 ½s½X
+ use encoding 'big5', STDIN => 'big5', STDOUT => 'big5';
+ print length("Àd¾m"); # 2 (Âù¤Þ¸¹ªí¥Ü¦r²Å)
+ print length('Àd¾m'); # 4 (³æ¤Þ¸¹ªí¥Ü¦ì¤¸²Õ)
+ print index("½Î½Î±Ð»£", "να"); # -1 (¤£¥]§t¦¹¤l¦r¦ê)
+ print index('½Î½Î±Ð»£', 'να'); # 1 (±q²Ä¤G­Ó¦ì¤¸²Õ¶}©l)
+
+¦b³Ì«á¤@¦C¨Ò¤l¸Ì, "½Î" ªº²Ä¤G­Ó¦ì¤¸²Õ»P "½Î" ªº²Ä¤@­Ó¦ì¤¸²Õµ²¦X¦¨ Big5
+½Xªº "ν"; "½Î" ªº²Ä¤G­Ó¦ì¤¸²Õ«h»P "±Ð" ªº²Ä¤@­Ó¦ì¤¸²Õµ²¦X¦¨ "α".
+³o¸Ñ¨M¤F¥H«e Big5 ½X¤ñ¹ï³B²z¤W±`¨£ªº°ÝÃD.
+
+=head2 ÃB¥~ªº¤¤¤å½s½X
+
+¦pªG»Ý­n§ó¦hªº¤¤¤å½s½X, ¥i¥H±q CPAN (L<http://www.cpan.org/>) ¤U¸ü
+Encode::HanExtra ¼Ò²Õ. ¥¦¥Ø«e´£¨Ñ¤U¦C½s½X¤è¦¡:
+
+ cccii 1980 ¦~¤å«Ø·|ªº¤¤¤å¸ê°T¥æ´«½X
+ euc-tw Unix ©µ¦ù¦r²Å¶°, ¥]§t CNS11643 ¥­­± 1-7
+ big5plus ¤¤¤å¼Æ¦ì¤Æ§Þ³N±À¼s°òª÷·|ªº Big5+
+ big5ext ¤¤¤å¼Æ¦ì¤Æ§Þ³N±À¼s°òª÷·|ªº Big5e
+
+¥t¥~, Encode::HanConvert ¼Ò²Õ«h´£¨Ñ¤F²ÁcÂà´«¥Îªº¨âºØ½s½X:
+
+ big5-simp Big5 ¥¿Å餤¤å»P Unicode ²Å餤¤å¤¬Âà
+ gbk-trad GBK ²Å餤¤å»P Unicode ¥¿Å餤¤å¤¬Âà
+
+­Y·Q¦b GBK »P Big5 ¤§¶¡¤¬Âà, ½Ð°Ñ¦Ò¸Ó¼Ò²Õ¤ºªþªº b2g.pl »P g2b.pl ¨â¤äµ{¦¡,
+©Î¦bµ{¦¡¤º¨Ï¥Î¤U¦C¼gªk:
+
+ use Encode::HanConvert;
+ $euc_cn = big5_to_gb($big5); # ±q Big5 Âର GBK
+ $big5 = gb_to_big5($euc_cn); # ±q GBK Âର Big5
+
+=head2 ¶i¤@¨Bªº¸ê°T
+
+½Ð°Ñ¦Ò Perl ¤ºªþªº¤j¶q»¡©ú¤å¥ó (¤£©¯¥þ¬O¥Î­^¤å¼gªº), ¨Ó¾Ç²ß§ó¦hÃö©ó
+Perl ªºª¾ÃÑ, ¥H¤Î Unicode ªº¨Ï¥Î¤è¦¡. ¤£¹L, ¥~³¡ªº¸ê·½¬Û·íÂ×´I:
+
+=head2 ´£¨Ñ Perl ¸ê·½ªººô§}
+
+=over 4
+
+=item L<http://www.perl.com/>
+
+Perl ªº­º­¶ (¥Ñ¼ÚµÜ§¤½¥qºûÅ@)
+
+=item L<http://www.cpan.org/>
+
+Perl ºî¦X¨åÂúô (Comprehensive Perl Archive Network)
+
+=item L<http://lists.perl.org/>
+
+Perl ¶l»¼½×¾Â¤@Äý
+
+=back
+
+=head2 ¾Ç²ß Perl ªººô§}
+
+=over 4
+
+=item L<http://www.oreilly.com.tw/chinese/perl/index.html>
+
+¥¿Å餤¤åª©ªº¼ÚµÜ§ Perl ®ÑÂÇ
+
+=item L<http://groups.google.com/groups?q=tw.bbs.comp.lang.perl>
+
+»OÆW Perl ³s½u°Q½×°Ï (¤]´N¬O¦U¤j BBS ªº Perl ³s½uª©)
+
+=back
+
+=head2 Perl ¨Ï¥ÎªÌ¶°·|
+
+=over 4
+
+=item L<http://www.pm.org/groups/asia.html>
+
+»OÆW Perl ±À¼s²Õ¤@Äý
+
+=item L<http://irc.elixus.org/>
+
+ÃÀ¥ß¨ó½u¤W²á¤Ñ«Ç
+
+=back
+
+=head2 Unicode ¬ÛÃöºô§}
+
+=over 4
+
+=item L<http://www.unicode.org/>
+
+Unicode ¾Ç³N¾Ç·| (Unicode ¼Ð·Çªº¨î©wªÌ)
+
+=item L<http://www.cl.cam.ac.uk/%7Emgk25/unicode.html>
+
+Unix/Linux ¤Wªº UTF-8 ¤Î Unicode µª«È°Ý
+
+=back
+
+=head2 ¤¤¤å¤Æ¸ê°T
+
+=over 4
+
+=item ¬°¤°»ò¥s "¥¿Å餤¤å" ¤£¥s "ÁcÅ餤¤å"?
+
+L<http://www.csie.ntu.edu.tw/~b7506051/mozilla/faq.html#faqglossary>
+
+=item ¤¤¤å¤Æ³nÅéÁp·ù
+
+L<http://www.cpatch.org/>
+
+=item Linux ³nÅ餤¤å¤Æ­p¹º
+
+L<http://www.linux.org.tw/CLDP/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::TW>, L<encoding>, L<perluniintro>, L<perlunicode>
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi E<lt>jhi@iki.fiE<gt>
+
+Audrey Tang (­ð»ñ) E<lt>audreyt@audreyt.orgE<gt>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlunicode.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlunicode.pod
new file mode 100755
index 00000000000..5dbd3cd5232
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlunicode.pod
@@ -0,0 +1,1659 @@
+=head1 NAME
+
+perlunicode - Unicode support in Perl
+
+=head1 DESCRIPTION
+
+=head2 Important Caveats
+
+Unicode support is an extensive requirement. While Perl does not
+implement the Unicode standard or the accompanying technical reports
+from cover to cover, Perl does support many Unicode features.
+
+People who want to learn to use Unicode in Perl, should probably read
+L<the Perl Unicode tutorial, perlunitut|perlunitut>, before reading
+this reference document.
+
+=over 4
+
+=item Input and Output Layers
+
+Perl knows when a filehandle uses Perl's internal Unicode encodings
+(UTF-8, or UTF-EBCDIC if in EBCDIC) if the filehandle is opened with
+the ":utf8" layer. Other encodings can be converted to Perl's
+encoding on input or from Perl's encoding on output by use of the
+":encoding(...)" layer. See L<open>.
+
+To indicate that Perl source itself is in UTF-8, use C<use utf8;>.
+
+=item Regular Expressions
+
+The regular expression compiler produces polymorphic opcodes. That is,
+the pattern adapts to the data and automatically switches to the Unicode
+character scheme when presented with data that is internally encoded in
+UTF-8 -- or instead uses a traditional byte scheme when presented with
+byte data.
+
+=item C<use utf8> still needed to enable UTF-8/UTF-EBCDIC in scripts
+
+As a compatibility measure, the C<use utf8> pragma must be explicitly
+included to enable recognition of UTF-8 in the Perl scripts themselves
+(in string or regular expression literals, or in identifier names) on
+ASCII-based machines or to recognize UTF-EBCDIC on EBCDIC-based
+machines. B<These are the only times when an explicit C<use utf8>
+is needed.> See L<utf8>.
+
+=item BOM-marked scripts and UTF-16 scripts autodetected
+
+If a Perl script begins marked with the Unicode BOM (UTF-16LE, UTF16-BE,
+or UTF-8), or if the script looks like non-BOM-marked UTF-16 of either
+endianness, Perl will correctly read in the script as Unicode.
+(BOMless UTF-8 cannot be effectively recognized or differentiated from
+ISO 8859-1 or other eight-bit encodings.)
+
+=item C<use encoding> needed to upgrade non-Latin-1 byte strings
+
+By default, there is a fundamental asymmetry in Perl's Unicode model:
+implicit upgrading from byte strings to Unicode strings assumes that
+they were encoded in I<ISO 8859-1 (Latin-1)>, but Unicode strings are
+downgraded with UTF-8 encoding. This happens because the first 256
+codepoints in Unicode happens to agree with Latin-1.
+
+See L</"Byte and Character Semantics"> for more details.
+
+=back
+
+=head2 Byte and Character Semantics
+
+Beginning with version 5.6, Perl uses logically-wide characters to
+represent strings internally.
+
+In future, Perl-level operations will be expected to work with
+characters rather than bytes.
+
+However, as an interim compatibility measure, Perl aims to
+provide a safe migration path from byte semantics to character
+semantics for programs. For operations where Perl can unambiguously
+decide that the input data are characters, Perl switches to
+character semantics. For operations where this determination cannot
+be made without additional information from the user, Perl decides in
+favor of compatibility and chooses to use byte semantics.
+
+Under byte semantics, when C<use locale> is in effect, Perl uses the
+semantics associated with the current locale. Absent a C<use locale>, Perl
+currently uses US-ASCII (or Basic Latin in Unicode terminology) byte semantics,
+meaning that characters whose ordinal numbers are in the range 128 - 255 are
+undefined except for their ordinal numbers. This means that none have case
+(upper and lower), nor are any a member of character classes, like C<[:alpha:]>
+or C<\w>.
+(But all do belong to the C<\W> class or the Perl regular expression extension
+C<[:^alpha:]>.)
+
+This behavior preserves compatibility with earlier versions of Perl,
+which allowed byte semantics in Perl operations only if
+none of the program's inputs were marked as being as source of Unicode
+character data. Such data may come from filehandles, from calls to
+external programs, from information provided by the system (such as %ENV),
+or from literals and constants in the source text.
+
+The C<bytes> pragma will always, regardless of platform, force byte
+semantics in a particular lexical scope. See L<bytes>.
+
+The C<utf8> pragma is primarily a compatibility device that enables
+recognition of UTF-(8|EBCDIC) in literals encountered by the parser.
+Note that this pragma is only required while Perl defaults to byte
+semantics; when character semantics become the default, this pragma
+may become a no-op. See L<utf8>.
+
+Unless explicitly stated, Perl operators use character semantics
+for Unicode data and byte semantics for non-Unicode data.
+The decision to use character semantics is made transparently. If
+input data comes from a Unicode source--for example, if a character
+encoding layer is added to a filehandle or a literal Unicode
+string constant appears in a program--character semantics apply.
+Otherwise, byte semantics are in effect. The C<bytes> pragma should
+be used to force byte semantics on Unicode data.
+
+If strings operating under byte semantics and strings with Unicode
+character data are concatenated, the new string will have
+character semantics. This can cause surprises: See L</BUGS>, below
+
+Under character semantics, many operations that formerly operated on
+bytes now operate on characters. A character in Perl is
+logically just a number ranging from 0 to 2**31 or so. Larger
+characters may encode into longer sequences of bytes internally, but
+this internal detail is mostly hidden for Perl code.
+See L<perluniintro> for more.
+
+=head2 Effects of Character Semantics
+
+Character semantics have the following effects:
+
+=over 4
+
+=item *
+
+Strings--including hash keys--and regular expression patterns may
+contain characters that have an ordinal value larger than 255.
+
+If you use a Unicode editor to edit your program, Unicode characters may
+occur directly within the literal strings in UTF-8 encoding, or UTF-16.
+(The former requires a BOM or C<use utf8>, the latter requires a BOM.)
+
+Unicode characters can also be added to a string by using the C<\x{...}>
+notation. The Unicode code for the desired character, in hexadecimal,
+should be placed in the braces. For instance, a smiley face is
+C<\x{263A}>. This encoding scheme works for all characters, but
+for characters under 0x100, note that Perl may use an 8 bit encoding
+internally, for optimization and/or backward compatibility.
+
+Additionally, if you
+
+ use charnames ':full';
+
+you can use the C<\N{...}> notation and put the official Unicode
+character name within the braces, such as C<\N{WHITE SMILING FACE}>.
+
+=item *
+
+If an appropriate L<encoding> is specified, identifiers within the
+Perl script may contain Unicode alphanumeric characters, including
+ideographs. Perl does not currently attempt to canonicalize variable
+names.
+
+=item *
+
+Regular expressions match characters instead of bytes. "." matches
+a character instead of a byte.
+
+=item *
+
+Character classes in regular expressions match characters instead of
+bytes and match against the character properties specified in the
+Unicode properties database. C<\w> can be used to match a Japanese
+ideograph, for instance.
+
+=item *
+
+Named Unicode properties, scripts, and block ranges may be used like
+character classes via the C<\p{}> "matches property" construct and
+the C<\P{}> negation, "doesn't match property".
+
+See L</"Unicode Character Properties"> for more details.
+
+You can define your own character properties and use them
+in the regular expression with the C<\p{}> or C<\P{}> construct.
+
+See L</"User-Defined Character Properties"> for more details.
+
+=item *
+
+The special pattern C<\X> matches any extended Unicode
+sequence--"a combining character sequence" in Standardese--where the
+first character is a base character and subsequent characters are mark
+characters that apply to the base character. C<\X> is equivalent to
+C<< (?>\PM\pM*) >>.
+
+=item *
+
+The C<tr///> operator translates characters instead of bytes. Note
+that the C<tr///CU> functionality has been removed. For similar
+functionality see pack('U0', ...) and pack('C0', ...).
+
+=item *
+
+Case translation operators use the Unicode case translation tables
+when character input is provided. Note that C<uc()>, or C<\U> in
+interpolated strings, translates to uppercase, while C<ucfirst>,
+or C<\u> in interpolated strings, translates to titlecase in languages
+that make the distinction.
+
+=item *
+
+Most operators that deal with positions or lengths in a string will
+automatically switch to using character positions, including
+C<chop()>, C<chomp()>, C<substr()>, C<pos()>, C<index()>, C<rindex()>,
+C<sprintf()>, C<write()>, and C<length()>. An operator that
+specifically does not switch is C<vec()>. Operators that really don't
+care include operators that treat strings as a bucket of bits such as
+C<sort()>, and operators dealing with filenames.
+
+=item *
+
+The C<pack()>/C<unpack()> letter C<C> does I<not> change, since it is often
+used for byte-oriented formats. Again, think C<char> in the C language.
+
+There is a new C<U> specifier that converts between Unicode characters
+and code points. There is also a C<W> specifier that is the equivalent of
+C<chr>/C<ord> and properly handles character values even if they are above 255.
+
+=item *
+
+The C<chr()> and C<ord()> functions work on characters, similar to
+C<pack("W")> and C<unpack("W")>, I<not> C<pack("C")> and
+C<unpack("C")>. C<pack("C")> and C<unpack("C")> are methods for
+emulating byte-oriented C<chr()> and C<ord()> on Unicode strings.
+While these methods reveal the internal encoding of Unicode strings,
+that is not something one normally needs to care about at all.
+
+=item *
+
+The bit string operators, C<& | ^ ~>, can operate on character data.
+However, for backward compatibility, such as when using bit string
+operations when characters are all less than 256 in ordinal value, one
+should not use C<~> (the bit complement) with characters of both
+values less than 256 and values greater than 256. Most importantly,
+DeMorgan's laws (C<~($x|$y) eq ~$x&~$y> and C<~($x&$y) eq ~$x|~$y>)
+will not hold. The reason for this mathematical I<faux pas> is that
+the complement cannot return B<both> the 8-bit (byte-wide) bit
+complement B<and> the full character-wide bit complement.
+
+=item *
+
+lc(), uc(), lcfirst(), and ucfirst() work for the following cases:
+
+=over 8
+
+=item *
+
+the case mapping is from a single Unicode character to another
+single Unicode character, or
+
+=item *
+
+the case mapping is from a single Unicode character to more
+than one Unicode character.
+
+=back
+
+Things to do with locales (Lithuanian, Turkish, Azeri) do B<not> work
+since Perl does not understand the concept of Unicode locales.
+
+See the Unicode Technical Report #21, Case Mappings, for more details.
+
+But you can also define your own mappings to be used in the lc(),
+lcfirst(), uc(), and ucfirst() (or their string-inlined versions).
+
+See L</"User-Defined Case Mappings"> for more details.
+
+=back
+
+=over 4
+
+=item *
+
+And finally, C<scalar reverse()> reverses by character rather than by byte.
+
+=back
+
+=head2 Unicode Character Properties
+
+Named Unicode properties, scripts, and block ranges may be used like
+character classes via the C<\p{}> "matches property" construct and
+the C<\P{}> negation, "doesn't match property".
+
+For instance, C<\p{Lu}> matches any character with the Unicode "Lu"
+(Letter, uppercase) property, while C<\p{M}> matches any character
+with an "M" (mark--accents and such) property. Brackets are not
+required for single letter properties, so C<\p{M}> is equivalent to
+C<\pM>. Many predefined properties are available, such as
+C<\p{Mirrored}> and C<\p{Tibetan}>.
+
+The official Unicode script and block names have spaces and dashes as
+separators, but for convenience you can use dashes, spaces, or
+underbars, and case is unimportant. It is recommended, however, that
+for consistency you use the following naming: the official Unicode
+script, property, or block name (see below for the additional rules
+that apply to block names) with whitespace and dashes removed, and the
+words "uppercase-first-lowercase-rest". C<Latin-1 Supplement> thus
+becomes C<Latin1Supplement>.
+
+You can also use negation in both C<\p{}> and C<\P{}> by introducing a caret
+(^) between the first brace and the property name: C<\p{^Tamil}> is
+equal to C<\P{Tamil}>.
+
+B<NOTE: the properties, scripts, and blocks listed here are as of
+Unicode 5.0.0 in July 2006.>
+
+=over 4
+
+=item General Category
+
+Here are the basic Unicode General Category properties, followed by their
+long form. You can use either; C<\p{Lu}> and C<\p{UppercaseLetter}>,
+for instance, are identical.
+
+ Short Long
+
+ L Letter
+ LC CasedLetter
+ Lu UppercaseLetter
+ Ll LowercaseLetter
+ Lt TitlecaseLetter
+ Lm ModifierLetter
+ Lo OtherLetter
+
+ M Mark
+ Mn NonspacingMark
+ Mc SpacingMark
+ Me EnclosingMark
+
+ N Number
+ Nd DecimalNumber
+ Nl LetterNumber
+ No OtherNumber
+
+ P Punctuation
+ Pc ConnectorPunctuation
+ Pd DashPunctuation
+ Ps OpenPunctuation
+ Pe ClosePunctuation
+ Pi InitialPunctuation
+ (may behave like Ps or Pe depending on usage)
+ Pf FinalPunctuation
+ (may behave like Ps or Pe depending on usage)
+ Po OtherPunctuation
+
+ S Symbol
+ Sm MathSymbol
+ Sc CurrencySymbol
+ Sk ModifierSymbol
+ So OtherSymbol
+
+ Z Separator
+ Zs SpaceSeparator
+ Zl LineSeparator
+ Zp ParagraphSeparator
+
+ C Other
+ Cc Control
+ Cf Format
+ Cs Surrogate (not usable)
+ Co PrivateUse
+ Cn Unassigned
+
+Single-letter properties match all characters in any of the
+two-letter sub-properties starting with the same letter.
+C<LC> and C<L&> are special cases, which are aliases for the set of
+C<Ll>, C<Lu>, and C<Lt>.
+
+Because Perl hides the need for the user to understand the internal
+representation of Unicode characters, there is no need to implement
+the somewhat messy concept of surrogates. C<Cs> is therefore not
+supported.
+
+=item Bidirectional Character Types
+
+Because scripts differ in their directionality--Hebrew is
+written right to left, for example--Unicode supplies these properties in
+the BidiClass class:
+
+ Property Meaning
+
+ L Left-to-Right
+ LRE Left-to-Right Embedding
+ LRO Left-to-Right Override
+ R Right-to-Left
+ AL Right-to-Left Arabic
+ RLE Right-to-Left Embedding
+ RLO Right-to-Left Override
+ PDF Pop Directional Format
+ EN European Number
+ ES European Number Separator
+ ET European Number Terminator
+ AN Arabic Number
+ CS Common Number Separator
+ NSM Non-Spacing Mark
+ BN Boundary Neutral
+ B Paragraph Separator
+ S Segment Separator
+ WS Whitespace
+ ON Other Neutrals
+
+For example, C<\p{BidiClass:R}> matches characters that are normally
+written right to left.
+
+=item Scripts
+
+The script names which can be used by C<\p{...}> and C<\P{...}>,
+such as in C<\p{Latin}> or C<\p{Cyrillic}>, are as follows:
+
+ Arabic
+ Armenian
+ Balinese
+ Bengali
+ Bopomofo
+ Braille
+ Buginese
+ Buhid
+ CanadianAboriginal
+ Cherokee
+ Coptic
+ Cuneiform
+ Cypriot
+ Cyrillic
+ Deseret
+ Devanagari
+ Ethiopic
+ Georgian
+ Glagolitic
+ Gothic
+ Greek
+ Gujarati
+ Gurmukhi
+ Han
+ Hangul
+ Hanunoo
+ Hebrew
+ Hiragana
+ Inherited
+ Kannada
+ Katakana
+ Kharoshthi
+ Khmer
+ Lao
+ Latin
+ Limbu
+ LinearB
+ Malayalam
+ Mongolian
+ Myanmar
+ NewTaiLue
+ Nko
+ Ogham
+ OldItalic
+ OldPersian
+ Oriya
+ Osmanya
+ PhagsPa
+ Phoenician
+ Runic
+ Shavian
+ Sinhala
+ SylotiNagri
+ Syriac
+ Tagalog
+ Tagbanwa
+ TaiLe
+ Tamil
+ Telugu
+ Thaana
+ Thai
+ Tibetan
+ Tifinagh
+ Ugaritic
+ Yi
+
+=item Extended property classes
+
+Extended property classes can supplement the basic
+properties, defined by the F<PropList> Unicode database:
+
+ ASCIIHexDigit
+ BidiControl
+ Dash
+ Deprecated
+ Diacritic
+ Extender
+ HexDigit
+ Hyphen
+ Ideographic
+ IDSBinaryOperator
+ IDSTrinaryOperator
+ JoinControl
+ LogicalOrderException
+ NoncharacterCodePoint
+ OtherAlphabetic
+ OtherDefaultIgnorableCodePoint
+ OtherGraphemeExtend
+ OtherIDStart
+ OtherIDContinue
+ OtherLowercase
+ OtherMath
+ OtherUppercase
+ PatternSyntax
+ PatternWhiteSpace
+ QuotationMark
+ Radical
+ SoftDotted
+ STerm
+ TerminalPunctuation
+ UnifiedIdeograph
+ VariationSelector
+ WhiteSpace
+
+and there are further derived properties:
+
+ Alphabetic = Lu + Ll + Lt + Lm + Lo + Nl + OtherAlphabetic
+ Lowercase = Ll + OtherLowercase
+ Uppercase = Lu + OtherUppercase
+ Math = Sm + OtherMath
+
+ IDStart = Lu + Ll + Lt + Lm + Lo + Nl + OtherIDStart
+ IDContinue = IDStart + Mn + Mc + Nd + Pc + OtherIDContinue
+
+ DefaultIgnorableCodePoint
+ = OtherDefaultIgnorableCodePoint
+ + Cf + Cc + Cs + Noncharacters + VariationSelector
+ - WhiteSpace - FFF9..FFFB (Annotation Characters)
+
+ Any = Any code points (i.e. U+0000 to U+10FFFF)
+ Assigned = Any non-Cn code points (i.e. synonym for \P{Cn})
+ Unassigned = Synonym for \p{Cn}
+ ASCII = ASCII (i.e. U+0000 to U+007F)
+
+ Common = Any character (or unassigned code point)
+ not explicitly assigned to a script
+
+=item Use of "Is" Prefix
+
+For backward compatibility (with Perl 5.6), all properties mentioned
+so far may have C<Is> prepended to their name, so C<\P{IsLu}>, for
+example, is equal to C<\P{Lu}>.
+
+=item Blocks
+
+In addition to B<scripts>, Unicode also defines B<blocks> of
+characters. The difference between scripts and blocks is that the
+concept of scripts is closer to natural languages, while the concept
+of blocks is more of an artificial grouping based on groups of 256
+Unicode characters. For example, the C<Latin> script contains letters
+from many blocks but does not contain all the characters from those
+blocks. It does not, for example, contain digits, because digits are
+shared across many scripts. Digits and similar groups, like
+punctuation, are in a category called C<Common>.
+
+For more about scripts, see the UAX#24 "Script Names":
+
+ http://www.unicode.org/reports/tr24/
+
+For more about blocks, see:
+
+ http://www.unicode.org/Public/UNIDATA/Blocks.txt
+
+Block names are given with the C<In> prefix. For example, the
+Katakana block is referenced via C<\p{InKatakana}>. The C<In>
+prefix may be omitted if there is no naming conflict with a script
+or any other property, but it is recommended that C<In> always be used
+for block tests to avoid confusion.
+
+These block names are supported:
+
+ InAegeanNumbers
+ InAlphabeticPresentationForms
+ InAncientGreekMusicalNotation
+ InAncientGreekNumbers
+ InArabic
+ InArabicPresentationFormsA
+ InArabicPresentationFormsB
+ InArabicSupplement
+ InArmenian
+ InArrows
+ InBalinese
+ InBasicLatin
+ InBengali
+ InBlockElements
+ InBopomofo
+ InBopomofoExtended
+ InBoxDrawing
+ InBraillePatterns
+ InBuginese
+ InBuhid
+ InByzantineMusicalSymbols
+ InCJKCompatibility
+ InCJKCompatibilityForms
+ InCJKCompatibilityIdeographs
+ InCJKCompatibilityIdeographsSupplement
+ InCJKRadicalsSupplement
+ InCJKStrokes
+ InCJKSymbolsAndPunctuation
+ InCJKUnifiedIdeographs
+ InCJKUnifiedIdeographsExtensionA
+ InCJKUnifiedIdeographsExtensionB
+ InCherokee
+ InCombiningDiacriticalMarks
+ InCombiningDiacriticalMarksSupplement
+ InCombiningDiacriticalMarksforSymbols
+ InCombiningHalfMarks
+ InControlPictures
+ InCoptic
+ InCountingRodNumerals
+ InCuneiform
+ InCuneiformNumbersAndPunctuation
+ InCurrencySymbols
+ InCypriotSyllabary
+ InCyrillic
+ InCyrillicSupplement
+ InDeseret
+ InDevanagari
+ InDingbats
+ InEnclosedAlphanumerics
+ InEnclosedCJKLettersAndMonths
+ InEthiopic
+ InEthiopicExtended
+ InEthiopicSupplement
+ InGeneralPunctuation
+ InGeometricShapes
+ InGeorgian
+ InGeorgianSupplement
+ InGlagolitic
+ InGothic
+ InGreekExtended
+ InGreekAndCoptic
+ InGujarati
+ InGurmukhi
+ InHalfwidthAndFullwidthForms
+ InHangulCompatibilityJamo
+ InHangulJamo
+ InHangulSyllables
+ InHanunoo
+ InHebrew
+ InHighPrivateUseSurrogates
+ InHighSurrogates
+ InHiragana
+ InIPAExtensions
+ InIdeographicDescriptionCharacters
+ InKanbun
+ InKangxiRadicals
+ InKannada
+ InKatakana
+ InKatakanaPhoneticExtensions
+ InKharoshthi
+ InKhmer
+ InKhmerSymbols
+ InLao
+ InLatin1Supplement
+ InLatinExtendedA
+ InLatinExtendedAdditional
+ InLatinExtendedB
+ InLatinExtendedC
+ InLatinExtendedD
+ InLetterlikeSymbols
+ InLimbu
+ InLinearBIdeograms
+ InLinearBSyllabary
+ InLowSurrogates
+ InMalayalam
+ InMathematicalAlphanumericSymbols
+ InMathematicalOperators
+ InMiscellaneousMathematicalSymbolsA
+ InMiscellaneousMathematicalSymbolsB
+ InMiscellaneousSymbols
+ InMiscellaneousSymbolsAndArrows
+ InMiscellaneousTechnical
+ InModifierToneLetters
+ InMongolian
+ InMusicalSymbols
+ InMyanmar
+ InNKo
+ InNewTaiLue
+ InNumberForms
+ InOgham
+ InOldItalic
+ InOldPersian
+ InOpticalCharacterRecognition
+ InOriya
+ InOsmanya
+ InPhagspa
+ InPhoenician
+ InPhoneticExtensions
+ InPhoneticExtensionsSupplement
+ InPrivateUseArea
+ InRunic
+ InShavian
+ InSinhala
+ InSmallFormVariants
+ InSpacingModifierLetters
+ InSpecials
+ InSuperscriptsAndSubscripts
+ InSupplementalArrowsA
+ InSupplementalArrowsB
+ InSupplementalMathematicalOperators
+ InSupplementalPunctuation
+ InSupplementaryPrivateUseAreaA
+ InSupplementaryPrivateUseAreaB
+ InSylotiNagri
+ InSyriac
+ InTagalog
+ InTagbanwa
+ InTags
+ InTaiLe
+ InTaiXuanJingSymbols
+ InTamil
+ InTelugu
+ InThaana
+ InThai
+ InTibetan
+ InTifinagh
+ InUgaritic
+ InUnifiedCanadianAboriginalSyllabics
+ InVariationSelectors
+ InVariationSelectorsSupplement
+ InVerticalForms
+ InYiRadicals
+ InYiSyllables
+ InYijingHexagramSymbols
+
+=back
+
+=head2 User-Defined Character Properties
+
+You can define your own character properties by defining subroutines
+whose names begin with "In" or "Is". The subroutines can be defined in
+any package. The user-defined properties can be used in the regular
+expression C<\p> and C<\P> constructs; if you are using a user-defined
+property from a package other than the one you are in, you must specify
+its package in the C<\p> or C<\P> construct.
+
+ # assuming property IsForeign defined in Lang::
+ package main; # property package name required
+ if ($txt =~ /\p{Lang::IsForeign}+/) { ... }
+
+ package Lang; # property package name not required
+ if ($txt =~ /\p{IsForeign}+/) { ... }
+
+
+Note that the effect is compile-time and immutable once defined.
+
+The subroutines must return a specially-formatted string, with one
+or more newline-separated lines. Each line must be one of the following:
+
+=over 4
+
+=item *
+
+A single hexadecimal number denoting a Unicode code point to include.
+
+=item *
+
+Two hexadecimal numbers separated by horizontal whitespace (space or
+tabular characters) denoting a range of Unicode code points to include.
+
+=item *
+
+Something to include, prefixed by "+": a built-in character
+property (prefixed by "utf8::") or a user-defined character property,
+to represent all the characters in that property; two hexadecimal code
+points for a range; or a single hexadecimal code point.
+
+=item *
+
+Something to exclude, prefixed by "-": an existing character
+property (prefixed by "utf8::") or a user-defined character property,
+to represent all the characters in that property; two hexadecimal code
+points for a range; or a single hexadecimal code point.
+
+=item *
+
+Something to negate, prefixed "!": an existing character
+property (prefixed by "utf8::") or a user-defined character property,
+to represent all the characters in that property; two hexadecimal code
+points for a range; or a single hexadecimal code point.
+
+=item *
+
+Something to intersect with, prefixed by "&": an existing character
+property (prefixed by "utf8::") or a user-defined character property,
+for all the characters except the characters in the property; two
+hexadecimal code points for a range; or a single hexadecimal code point.
+
+=back
+
+For example, to define a property that covers both the Japanese
+syllabaries (hiragana and katakana), you can define
+
+ sub InKana {
+ return <<END;
+ 3040\t309F
+ 30A0\t30FF
+ END
+ }
+
+Imagine that the here-doc end marker is at the beginning of the line.
+Now you can use C<\p{InKana}> and C<\P{InKana}>.
+
+You could also have used the existing block property names:
+
+ sub InKana {
+ return <<'END';
+ +utf8::InHiragana
+ +utf8::InKatakana
+ END
+ }
+
+Suppose you wanted to match only the allocated characters,
+not the raw block ranges: in other words, you want to remove
+the non-characters:
+
+ sub InKana {
+ return <<'END';
+ +utf8::InHiragana
+ +utf8::InKatakana
+ -utf8::IsCn
+ END
+ }
+
+The negation is useful for defining (surprise!) negated classes.
+
+ sub InNotKana {
+ return <<'END';
+ !utf8::InHiragana
+ -utf8::InKatakana
+ +utf8::IsCn
+ END
+ }
+
+Intersection is useful for getting the common characters matched by
+two (or more) classes.
+
+ sub InFooAndBar {
+ return <<'END';
+ +main::Foo
+ &main::Bar
+ END
+ }
+
+It's important to remember not to use "&" for the first set -- that
+would be intersecting with nothing (resulting in an empty set).
+
+=head2 User-Defined Case Mappings
+
+You can also define your own mappings to be used in the lc(),
+lcfirst(), uc(), and ucfirst() (or their string-inlined versions).
+The principle is similar to that of user-defined character
+properties: to define subroutines in the C<main> package
+with names like C<ToLower> (for lc() and lcfirst()), C<ToTitle> (for
+the first character in ucfirst()), and C<ToUpper> (for uc(), and the
+rest of the characters in ucfirst()).
+
+The string returned by the subroutines needs now to be three
+hexadecimal numbers separated by tabulators: start of the source
+range, end of the source range, and start of the destination range.
+For example:
+
+ sub ToUpper {
+ return <<END;
+ 0061\t0063\t0041
+ END
+ }
+
+defines an uc() mapping that causes only the characters "a", "b", and
+"c" to be mapped to "A", "B", "C", all other characters will remain
+unchanged.
+
+If there is no source range to speak of, that is, the mapping is from
+a single character to another single character, leave the end of the
+source range empty, but the two tabulator characters are still needed.
+For example:
+
+ sub ToLower {
+ return <<END;
+ 0041\t\t0061
+ END
+ }
+
+defines a lc() mapping that causes only "A" to be mapped to "a", all
+other characters will remain unchanged.
+
+(For serious hackers only) If you want to introspect the default
+mappings, you can find the data in the directory
+C<$Config{privlib}>/F<unicore/To/>. The mapping data is returned as
+the here-document, and the C<utf8::ToSpecFoo> are special exception
+mappings derived from <$Config{privlib}>/F<unicore/SpecialCasing.txt>.
+The C<Digit> and C<Fold> mappings that one can see in the directory
+are not directly user-accessible, one can use either the
+C<Unicode::UCD> module, or just match case-insensitively (that's when
+the C<Fold> mapping is used).
+
+A final note on the user-defined case mappings: they will be used
+only if the scalar has been marked as having Unicode characters.
+Old byte-style strings will not be affected.
+
+=head2 Character Encodings for Input and Output
+
+See L<Encode>.
+
+=head2 Unicode Regular Expression Support Level
+
+The following list of Unicode support for regular expressions describes
+all the features currently supported. The references to "Level N"
+and the section numbers refer to the Unicode Technical Standard #18,
+"Unicode Regular Expressions", version 11, in May 2005.
+
+=over 4
+
+=item *
+
+Level 1 - Basic Unicode Support
+
+ RL1.1 Hex Notation - done [1]
+ RL1.2 Properties - done [2][3]
+ RL1.2a Compatibility Properties - done [4]
+ RL1.3 Subtraction and Intersection - MISSING [5]
+ RL1.4 Simple Word Boundaries - done [6]
+ RL1.5 Simple Loose Matches - done [7]
+ RL1.6 Line Boundaries - MISSING [8]
+ RL1.7 Supplementary Code Points - done [9]
+
+ [1] \x{...}
+ [2] \p{...} \P{...}
+ [3] supports not only minimal list (general category, scripts,
+ Alphabetic, Lowercase, Uppercase, WhiteSpace,
+ NoncharacterCodePoint, DefaultIgnorableCodePoint, Any,
+ ASCII, Assigned), but also bidirectional types, blocks, etc.
+ (see "Unicode Character Properties")
+ [4] \d \D \s \S \w \W \X [:prop:] [:^prop:]
+ [5] can use regular expression look-ahead [a] or
+ user-defined character properties [b] to emulate set operations
+ [6] \b \B
+ [7] note that Perl does Full case-folding in matching, not Simple:
+ for example U+1F88 is equivalent to U+1F00 U+03B9,
+ not with 1F80. This difference matters mainly for certain Greek
+ capital letters with certain modifiers: the Full case-folding
+ decomposes the letter, while the Simple case-folding would map
+ it to a single character.
+ [8] should do ^ and $ also on U+000B (\v in C), FF (\f), CR (\r),
+ CRLF (\r\n), NEL (U+0085), LS (U+2028), and PS (U+2029);
+ should also affect <>, $., and script line numbers;
+ should not split lines within CRLF [c] (i.e. there is no empty
+ line between \r and \n)
+ [9] UTF-8/UTF-EBDDIC used in perl allows not only U+10000 to U+10FFFF
+ but also beyond U+10FFFF [d]
+
+[a] You can mimic class subtraction using lookahead.
+For example, what UTS#18 might write as
+
+ [{Greek}-[{UNASSIGNED}]]
+
+in Perl can be written as:
+
+ (?!\p{Unassigned})\p{InGreekAndCoptic}
+ (?=\p{Assigned})\p{InGreekAndCoptic}
+
+But in this particular example, you probably really want
+
+ \p{GreekAndCoptic}
+
+which will match assigned characters known to be part of the Greek script.
+
+Also see the Unicode::Regex::Set module, it does implement the full
+UTS#18 grouping, intersection, union, and removal (subtraction) syntax.
+
+[b] '+' for union, '-' for removal (set-difference), '&' for intersection
+(see L</"User-Defined Character Properties">)
+
+[c] Try the C<:crlf> layer (see L<PerlIO>).
+
+[d] Avoid C<use warning 'utf8';> (or say C<no warning 'utf8';>) to allow
+U+FFFF (C<\x{FFFF}>).
+
+=item *
+
+Level 2 - Extended Unicode Support
+
+ RL2.1 Canonical Equivalents - MISSING [10][11]
+ RL2.2 Default Grapheme Clusters - MISSING [12][13]
+ RL2.3 Default Word Boundaries - MISSING [14]
+ RL2.4 Default Loose Matches - MISSING [15]
+ RL2.5 Name Properties - MISSING [16]
+ RL2.6 Wildcard Properties - MISSING
+
+ [10] see UAX#15 "Unicode Normalization Forms"
+ [11] have Unicode::Normalize but not integrated to regexes
+ [12] have \X but at this level . should equal that
+ [13] UAX#29 "Text Boundaries" considers CRLF and Hangul syllable
+ clusters as a single grapheme cluster.
+ [14] see UAX#29, Word Boundaries
+ [15] see UAX#21 "Case Mappings"
+ [16] have \N{...} but neither compute names of CJK Ideographs
+ and Hangul Syllables nor use a loose match [e]
+
+[e] C<\N{...}> allows namespaces (see L<charnames>).
+
+=item *
+
+Level 3 - Tailored Support
+
+ RL3.1 Tailored Punctuation - MISSING
+ RL3.2 Tailored Grapheme Clusters - MISSING [17][18]
+ RL3.3 Tailored Word Boundaries - MISSING
+ RL3.4 Tailored Loose Matches - MISSING
+ RL3.5 Tailored Ranges - MISSING
+ RL3.6 Context Matching - MISSING [19]
+ RL3.7 Incremental Matches - MISSING
+ ( RL3.8 Unicode Set Sharing )
+ RL3.9 Possible Match Sets - MISSING
+ RL3.10 Folded Matching - MISSING [20]
+ RL3.11 Submatchers - MISSING
+
+ [17] see UAX#10 "Unicode Collation Algorithms"
+ [18] have Unicode::Collate but not integrated to regexes
+ [19] have (?<=x) and (?=x), but look-aheads or look-behinds should see
+ outside of the target substring
+ [20] need insensitive matching for linguistic features other than case;
+ for example, hiragana to katakana, wide and narrow, simplified Han
+ to traditional Han (see UTR#30 "Character Foldings")
+
+=back
+
+=head2 Unicode Encodings
+
+Unicode characters are assigned to I<code points>, which are abstract
+numbers. To use these numbers, various encodings are needed.
+
+=over 4
+
+=item *
+
+UTF-8
+
+UTF-8 is a variable-length (1 to 6 bytes, current character allocations
+require 4 bytes), byte-order independent encoding. For ASCII (and we
+really do mean 7-bit ASCII, not another 8-bit encoding), UTF-8 is
+transparent.
+
+The following table is from Unicode 3.2.
+
+ Code Points 1st Byte 2nd Byte 3rd Byte 4th Byte
+
+ U+0000..U+007F 00..7F
+ U+0080..U+07FF C2..DF 80..BF
+ U+0800..U+0FFF E0 A0..BF 80..BF
+ U+1000..U+CFFF E1..EC 80..BF 80..BF
+ U+D000..U+D7FF ED 80..9F 80..BF
+ U+D800..U+DFFF ******* ill-formed *******
+ U+E000..U+FFFF EE..EF 80..BF 80..BF
+ U+10000..U+3FFFF F0 90..BF 80..BF 80..BF
+ U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF
+ U+100000..U+10FFFF F4 80..8F 80..BF 80..BF
+
+Note the C<A0..BF> in C<U+0800..U+0FFF>, the C<80..9F> in
+C<U+D000...U+D7FF>, the C<90..B>F in C<U+10000..U+3FFFF>, and the
+C<80...8F> in C<U+100000..U+10FFFF>. The "gaps" are caused by legal
+UTF-8 avoiding non-shortest encodings: it is technically possible to
+UTF-8-encode a single code point in different ways, but that is
+explicitly forbidden, and the shortest possible encoding should always
+be used. So that's what Perl does.
+
+Another way to look at it is via bits:
+
+ Code Points 1st Byte 2nd Byte 3rd Byte 4th Byte
+
+ 0aaaaaaa 0aaaaaaa
+ 00000bbbbbaaaaaa 110bbbbb 10aaaaaa
+ ccccbbbbbbaaaaaa 1110cccc 10bbbbbb 10aaaaaa
+ 00000dddccccccbbbbbbaaaaaa 11110ddd 10cccccc 10bbbbbb 10aaaaaa
+
+As you can see, the continuation bytes all begin with C<10>, and the
+leading bits of the start byte tell how many bytes the are in the
+encoded character.
+
+=item *
+
+UTF-EBCDIC
+
+Like UTF-8 but EBCDIC-safe, in the way that UTF-8 is ASCII-safe.
+
+=item *
+
+UTF-16, UTF-16BE, UTF-16LE, Surrogates, and BOMs (Byte Order Marks)
+
+The followings items are mostly for reference and general Unicode
+knowledge, Perl doesn't use these constructs internally.
+
+UTF-16 is a 2 or 4 byte encoding. The Unicode code points
+C<U+0000..U+FFFF> are stored in a single 16-bit unit, and the code
+points C<U+10000..U+10FFFF> in two 16-bit units. The latter case is
+using I<surrogates>, the first 16-bit unit being the I<high
+surrogate>, and the second being the I<low surrogate>.
+
+Surrogates are code points set aside to encode the C<U+10000..U+10FFFF>
+range of Unicode code points in pairs of 16-bit units. The I<high
+surrogates> are the range C<U+D800..U+DBFF>, and the I<low surrogates>
+are the range C<U+DC00..U+DFFF>. The surrogate encoding is
+
+ $hi = ($uni - 0x10000) / 0x400 + 0xD800;
+ $lo = ($uni - 0x10000) % 0x400 + 0xDC00;
+
+and the decoding is
+
+ $uni = 0x10000 + ($hi - 0xD800) * 0x400 + ($lo - 0xDC00);
+
+If you try to generate surrogates (for example by using chr()), you
+will get a warning if warnings are turned on, because those code
+points are not valid for a Unicode character.
+
+Because of the 16-bitness, UTF-16 is byte-order dependent. UTF-16
+itself can be used for in-memory computations, but if storage or
+transfer is required either UTF-16BE (big-endian) or UTF-16LE
+(little-endian) encodings must be chosen.
+
+This introduces another problem: what if you just know that your data
+is UTF-16, but you don't know which endianness? Byte Order Marks, or
+BOMs, are a solution to this. A special character has been reserved
+in Unicode to function as a byte order marker: the character with the
+code point C<U+FEFF> is the BOM.
+
+The trick is that if you read a BOM, you will know the byte order,
+since if it was written on a big-endian platform, you will read the
+bytes C<0xFE 0xFF>, but if it was written on a little-endian platform,
+you will read the bytes C<0xFF 0xFE>. (And if the originating platform
+was writing in UTF-8, you will read the bytes C<0xEF 0xBB 0xBF>.)
+
+The way this trick works is that the character with the code point
+C<U+FFFE> is guaranteed not to be a valid Unicode character, so the
+sequence of bytes C<0xFF 0xFE> is unambiguously "BOM, represented in
+little-endian format" and cannot be C<U+FFFE>, represented in big-endian
+format".
+
+=item *
+
+UTF-32, UTF-32BE, UTF-32LE
+
+The UTF-32 family is pretty much like the UTF-16 family, expect that
+the units are 32-bit, and therefore the surrogate scheme is not
+needed. The BOM signatures will be C<0x00 0x00 0xFE 0xFF> for BE and
+C<0xFF 0xFE 0x00 0x00> for LE.
+
+=item *
+
+UCS-2, UCS-4
+
+Encodings defined by the ISO 10646 standard. UCS-2 is a 16-bit
+encoding. Unlike UTF-16, UCS-2 is not extensible beyond C<U+FFFF>,
+because it does not use surrogates. UCS-4 is a 32-bit encoding,
+functionally identical to UTF-32.
+
+=item *
+
+UTF-7
+
+A seven-bit safe (non-eight-bit) encoding, which is useful if the
+transport or storage is not eight-bit safe. Defined by RFC 2152.
+
+=back
+
+=head2 Security Implications of Unicode
+
+=over 4
+
+=item *
+
+Malformed UTF-8
+
+Unfortunately, the specification of UTF-8 leaves some room for
+interpretation of how many bytes of encoded output one should generate
+from one input Unicode character. Strictly speaking, the shortest
+possible sequence of UTF-8 bytes should be generated,
+because otherwise there is potential for an input buffer overflow at
+the receiving end of a UTF-8 connection. Perl always generates the
+shortest length UTF-8, and with warnings on Perl will warn about
+non-shortest length UTF-8 along with other malformations, such as the
+surrogates, which are not real Unicode code points.
+
+=item *
+
+Regular expressions behave slightly differently between byte data and
+character (Unicode) data. For example, the "word character" character
+class C<\w> will work differently depending on if data is eight-bit bytes
+or Unicode.
+
+In the first case, the set of C<\w> characters is either small--the
+default set of alphabetic characters, digits, and the "_"--or, if you
+are using a locale (see L<perllocale>), the C<\w> might contain a few
+more letters according to your language and country.
+
+In the second case, the C<\w> set of characters is much, much larger.
+Most importantly, even in the set of the first 256 characters, it will
+probably match different characters: unlike most locales, which are
+specific to a language and country pair, Unicode classifies all the
+characters that are letters I<somewhere> as C<\w>. For example, your
+locale might not think that LATIN SMALL LETTER ETH is a letter (unless
+you happen to speak Icelandic), but Unicode does.
+
+As discussed elsewhere, Perl has one foot (two hooves?) planted in
+each of two worlds: the old world of bytes and the new world of
+characters, upgrading from bytes to characters when necessary.
+If your legacy code does not explicitly use Unicode, no automatic
+switch-over to characters should happen. Characters shouldn't get
+downgraded to bytes, either. It is possible to accidentally mix bytes
+and characters, however (see L<perluniintro>), in which case C<\w> in
+regular expressions might start behaving differently. Review your
+code. Use warnings and the C<strict> pragma.
+
+=back
+
+=head2 Unicode in Perl on EBCDIC
+
+The way Unicode is handled on EBCDIC platforms is still
+experimental. On such platforms, references to UTF-8 encoding in this
+document and elsewhere should be read as meaning the UTF-EBCDIC
+specified in Unicode Technical Report 16, unless ASCII vs. EBCDIC issues
+are specifically discussed. There is no C<utfebcdic> pragma or
+":utfebcdic" layer; rather, "utf8" and ":utf8" are reused to mean
+the platform's "natural" 8-bit encoding of Unicode. See L<perlebcdic>
+for more discussion of the issues.
+
+=head2 Locales
+
+Usually locale settings and Unicode do not affect each other, but
+there are a couple of exceptions:
+
+=over 4
+
+=item *
+
+You can enable automatic UTF-8-ification of your standard file
+handles, default C<open()> layer, and C<@ARGV> by using either
+the C<-C> command line switch or the C<PERL_UNICODE> environment
+variable, see L<perlrun> for the documentation of the C<-C> switch.
+
+=item *
+
+Perl tries really hard to work both with Unicode and the old
+byte-oriented world. Most often this is nice, but sometimes Perl's
+straddling of the proverbial fence causes problems.
+
+=back
+
+=head2 When Unicode Does Not Happen
+
+While Perl does have extensive ways to input and output in Unicode,
+and few other 'entry points' like the @ARGV which can be interpreted
+as Unicode (UTF-8), there still are many places where Unicode (in some
+encoding or another) could be given as arguments or received as
+results, or both, but it is not.
+
+The following are such interfaces. For all of these interfaces Perl
+currently (as of 5.8.3) simply assumes byte strings both as arguments
+and results, or UTF-8 strings if the C<encoding> pragma has been used.
+
+One reason why Perl does not attempt to resolve the role of Unicode in
+this cases is that the answers are highly dependent on the operating
+system and the file system(s). For example, whether filenames can be
+in Unicode, and in exactly what kind of encoding, is not exactly a
+portable concept. Similarly for the qx and system: how well will the
+'command line interface' (and which of them?) handle Unicode?
+
+=over 4
+
+=item *
+
+chdir, chmod, chown, chroot, exec, link, lstat, mkdir,
+rename, rmdir, stat, symlink, truncate, unlink, utime, -X
+
+=item *
+
+%ENV
+
+=item *
+
+glob (aka the <*>)
+
+=item *
+
+open, opendir, sysopen
+
+=item *
+
+qx (aka the backtick operator), system
+
+=item *
+
+readdir, readlink
+
+=back
+
+=head2 Forcing Unicode in Perl (Or Unforcing Unicode in Perl)
+
+Sometimes (see L</"When Unicode Does Not Happen">) there are
+situations where you simply need to force a byte
+string into UTF-8, or vice versa. The low-level calls
+utf8::upgrade($bytestring) and utf8::downgrade($utf8string[, FAIL_OK]) are
+the answers.
+
+Note that utf8::downgrade() can fail if the string contains characters
+that don't fit into a byte.
+
+=head2 Using Unicode in XS
+
+If you want to handle Perl Unicode in XS extensions, you may find the
+following C APIs useful. See also L<perlguts/"Unicode Support"> for an
+explanation about Unicode at the XS level, and L<perlapi> for the API
+details.
+
+=over 4
+
+=item *
+
+C<DO_UTF8(sv)> returns true if the C<UTF8> flag is on and the bytes
+pragma is not in effect. C<SvUTF8(sv)> returns true if the C<UTF8>
+flag is on; the bytes pragma is ignored. The C<UTF8> flag being on
+does B<not> mean that there are any characters of code points greater
+than 255 (or 127) in the scalar or that there are even any characters
+in the scalar. What the C<UTF8> flag means is that the sequence of
+octets in the representation of the scalar is the sequence of UTF-8
+encoded code points of the characters of a string. The C<UTF8> flag
+being off means that each octet in this representation encodes a
+single character with code point 0..255 within the string. Perl's
+Unicode model is not to use UTF-8 until it is absolutely necessary.
+
+=item *
+
+C<uvchr_to_utf8(buf, chr)> writes a Unicode character code point into
+a buffer encoding the code point as UTF-8, and returns a pointer
+pointing after the UTF-8 bytes. It works appropriately on EBCDIC machines.
+
+=item *
+
+C<utf8_to_uvchr(buf, lenp)> reads UTF-8 encoded bytes from a buffer and
+returns the Unicode character code point and, optionally, the length of
+the UTF-8 byte sequence. It works appropriately on EBCDIC machines.
+
+=item *
+
+C<utf8_length(start, end)> returns the length of the UTF-8 encoded buffer
+in characters. C<sv_len_utf8(sv)> returns the length of the UTF-8 encoded
+scalar.
+
+=item *
+
+C<sv_utf8_upgrade(sv)> converts the string of the scalar to its UTF-8
+encoded form. C<sv_utf8_downgrade(sv)> does the opposite, if
+possible. C<sv_utf8_encode(sv)> is like sv_utf8_upgrade except that
+it does not set the C<UTF8> flag. C<sv_utf8_decode()> does the
+opposite of C<sv_utf8_encode()>. Note that none of these are to be
+used as general-purpose encoding or decoding interfaces: C<use Encode>
+for that. C<sv_utf8_upgrade()> is affected by the encoding pragma
+but C<sv_utf8_downgrade()> is not (since the encoding pragma is
+designed to be a one-way street).
+
+=item *
+
+C<is_utf8_char(s)> returns true if the pointer points to a valid UTF-8
+character.
+
+=item *
+
+C<is_utf8_string(buf, len)> returns true if C<len> bytes of the buffer
+are valid UTF-8.
+
+=item *
+
+C<UTF8SKIP(buf)> will return the number of bytes in the UTF-8 encoded
+character in the buffer. C<UNISKIP(chr)> will return the number of bytes
+required to UTF-8-encode the Unicode character code point. C<UTF8SKIP()>
+is useful for example for iterating over the characters of a UTF-8
+encoded buffer; C<UNISKIP()> is useful, for example, in computing
+the size required for a UTF-8 encoded buffer.
+
+=item *
+
+C<utf8_distance(a, b)> will tell the distance in characters between the
+two pointers pointing to the same UTF-8 encoded buffer.
+
+=item *
+
+C<utf8_hop(s, off)> will return a pointer to a UTF-8 encoded buffer
+that is C<off> (positive or negative) Unicode characters displaced
+from the UTF-8 buffer C<s>. Be careful not to overstep the buffer:
+C<utf8_hop()> will merrily run off the end or the beginning of the
+buffer if told to do so.
+
+=item *
+
+C<pv_uni_display(dsv, spv, len, pvlim, flags)> and
+C<sv_uni_display(dsv, ssv, pvlim, flags)> are useful for debugging the
+output of Unicode strings and scalars. By default they are useful
+only for debugging--they display B<all> characters as hexadecimal code
+points--but with the flags C<UNI_DISPLAY_ISPRINT>,
+C<UNI_DISPLAY_BACKSLASH>, and C<UNI_DISPLAY_QQ> you can make the
+output more readable.
+
+=item *
+
+C<ibcmp_utf8(s1, pe1, l1, u1, s2, pe2, l2, u2)> can be used to
+compare two strings case-insensitively in Unicode. For case-sensitive
+comparisons you can just use C<memEQ()> and C<memNE()> as usual.
+
+=back
+
+For more information, see L<perlapi>, and F<utf8.c> and F<utf8.h>
+in the Perl source code distribution.
+
+=head1 BUGS
+
+=head2 Interaction with Locales
+
+Use of locales with Unicode data may lead to odd results. Currently,
+Perl attempts to attach 8-bit locale info to characters in the range
+0..255, but this technique is demonstrably incorrect for locales that
+use characters above that range when mapped into Unicode. Perl's
+Unicode support will also tend to run slower. Use of locales with
+Unicode is discouraged.
+
+=head2 Problems with characters whose ordinal numbers are in the range 128 - 255 with no Locale specified
+
+Without a locale specified, unlike all other characters or code points,
+these characters have very different semantics in byte semantics versus
+character semantics.
+In character semantics they are interpreted as Unicode code points, which means
+they are viewed as Latin-1 (ISO-8859-1).
+In byte semantics, they are considered to be unassigned characters,
+meaning that the only semantics they have is their
+ordinal numbers, and that they are not members of various character classes.
+None are considered to match C<\w> for example, but all match C<\W>.
+Besides these class matches,
+the known operations that this affects are those that change the case,
+regular expression matching while ignoring case,
+and B<quotemeta()>.
+This can lead to unexpected results in which a string's semantics suddenly
+change if a code point above 255 is appended to or removed from it,
+which changes the string's semantics from byte to character or vice versa.
+This behavior is scheduled to change in version 5.12, but in the meantime,
+a workaround is to always call utf8::upgrade($string), or to use the
+standard modules L<Encode> or L<charnames>.
+
+=head2 Interaction with Extensions
+
+When Perl exchanges data with an extension, the extension should be
+able to understand the UTF8 flag and act accordingly. If the
+extension doesn't know about the flag, it's likely that the extension
+will return incorrectly-flagged data.
+
+So if you're working with Unicode data, consult the documentation of
+every module you're using if there are any issues with Unicode data
+exchange. If the documentation does not talk about Unicode at all,
+suspect the worst and probably look at the source to learn how the
+module is implemented. Modules written completely in Perl shouldn't
+cause problems. Modules that directly or indirectly access code written
+in other programming languages are at risk.
+
+For affected functions, the simple strategy to avoid data corruption is
+to always make the encoding of the exchanged data explicit. Choose an
+encoding that you know the extension can handle. Convert arguments passed
+to the extensions to that encoding and convert results back from that
+encoding. Write wrapper functions that do the conversions for you, so
+you can later change the functions when the extension catches up.
+
+To provide an example, let's say the popular Foo::Bar::escape_html
+function doesn't deal with Unicode data yet. The wrapper function
+would convert the argument to raw UTF-8 and convert the result back to
+Perl's internal representation like so:
+
+ sub my_escape_html ($) {
+ my($what) = shift;
+ return unless defined $what;
+ Encode::decode_utf8(Foo::Bar::escape_html(Encode::encode_utf8($what)));
+ }
+
+Sometimes, when the extension does not convert data but just stores
+and retrieves them, you will be in a position to use the otherwise
+dangerous Encode::_utf8_on() function. Let's say the popular
+C<Foo::Bar> extension, written in C, provides a C<param> method that
+lets you store and retrieve data according to these prototypes:
+
+ $self->param($name, $value); # set a scalar
+ $value = $self->param($name); # retrieve a scalar
+
+If it does not yet provide support for any encoding, one could write a
+derived class with such a C<param> method:
+
+ sub param {
+ my($self,$name,$value) = @_;
+ utf8::upgrade($name); # make sure it is UTF-8 encoded
+ if (defined $value) {
+ utf8::upgrade($value); # make sure it is UTF-8 encoded
+ return $self->SUPER::param($name,$value);
+ } else {
+ my $ret = $self->SUPER::param($name);
+ Encode::_utf8_on($ret); # we know, it is UTF-8 encoded
+ return $ret;
+ }
+ }
+
+Some extensions provide filters on data entry/exit points, such as
+DB_File::filter_store_key and family. Look out for such filters in
+the documentation of your extensions, they can make the transition to
+Unicode data much easier.
+
+=head2 Speed
+
+Some functions are slower when working on UTF-8 encoded strings than
+on byte encoded strings. All functions that need to hop over
+characters such as length(), substr() or index(), or matching regular
+expressions can work B<much> faster when the underlying data are
+byte-encoded.
+
+In Perl 5.8.0 the slowness was often quite spectacular; in Perl 5.8.1
+a caching scheme was introduced which will hopefully make the slowness
+somewhat less spectacular, at least for some operations. In general,
+operations with UTF-8 encoded strings are still slower. As an example,
+the Unicode properties (character classes) like C<\p{Nd}> are known to
+be quite a bit slower (5-20 times) than their simpler counterparts
+like C<\d> (then again, there 268 Unicode characters matching C<Nd>
+compared with the 10 ASCII characters matching C<d>).
+
+=head2 Possible problems on EBCDIC platforms
+
+In earlier versions, when byte and character data were concatenated,
+the new string was sometimes created by
+decoding the byte strings as I<ISO 8859-1 (Latin-1)>, even if the
+old Unicode string used EBCDIC.
+
+If you find any of these, please report them as bugs.
+
+=head2 Porting code from perl-5.6.X
+
+Perl 5.8 has a different Unicode model from 5.6. In 5.6 the programmer
+was required to use the C<utf8> pragma to declare that a given scope
+expected to deal with Unicode data and had to make sure that only
+Unicode data were reaching that scope. If you have code that is
+working with 5.6, you will need some of the following adjustments to
+your code. The examples are written such that the code will continue
+to work under 5.6, so you should be safe to try them out.
+
+=over 4
+
+=item *
+
+A filehandle that should read or write UTF-8
+
+ if ($] > 5.007) {
+ binmode $fh, ":encoding(utf8)";
+ }
+
+=item *
+
+A scalar that is going to be passed to some extension
+
+Be it Compress::Zlib, Apache::Request or any extension that has no
+mention of Unicode in the manpage, you need to make sure that the
+UTF8 flag is stripped off. Note that at the time of this writing
+(October 2002) the mentioned modules are not UTF-8-aware. Please
+check the documentation to verify if this is still true.
+
+ if ($] > 5.007) {
+ require Encode;
+ $val = Encode::encode_utf8($val); # make octets
+ }
+
+=item *
+
+A scalar we got back from an extension
+
+If you believe the scalar comes back as UTF-8, you will most likely
+want the UTF8 flag restored:
+
+ if ($] > 5.007) {
+ require Encode;
+ $val = Encode::decode_utf8($val);
+ }
+
+=item *
+
+Same thing, if you are really sure it is UTF-8
+
+ if ($] > 5.007) {
+ require Encode;
+ Encode::_utf8_on($val);
+ }
+
+=item *
+
+A wrapper for fetchrow_array and fetchrow_hashref
+
+When the database contains only UTF-8, a wrapper function or method is
+a convenient way to replace all your fetchrow_array and
+fetchrow_hashref calls. A wrapper function will also make it easier to
+adapt to future enhancements in your database driver. Note that at the
+time of this writing (October 2002), the DBI has no standardized way
+to deal with UTF-8 data. Please check the documentation to verify if
+that is still true.
+
+ sub fetchrow {
+ my($self, $sth, $what) = @_; # $what is one of fetchrow_{array,hashref}
+ if ($] < 5.007) {
+ return $sth->$what;
+ } else {
+ require Encode;
+ if (wantarray) {
+ my @arr = $sth->$what;
+ for (@arr) {
+ defined && /[^\000-\177]/ && Encode::_utf8_on($_);
+ }
+ return @arr;
+ } else {
+ my $ret = $sth->$what;
+ if (ref $ret) {
+ for my $k (keys %$ret) {
+ defined && /[^\000-\177]/ && Encode::_utf8_on($_) for $ret->{$k};
+ }
+ return $ret;
+ } else {
+ defined && /[^\000-\177]/ && Encode::_utf8_on($_) for $ret;
+ return $ret;
+ }
+ }
+ }
+ }
+
+
+=item *
+
+A large scalar that you know can only contain ASCII
+
+Scalars that contain only ASCII and are marked as UTF-8 are sometimes
+a drag to your program. If you recognize such a situation, just remove
+the UTF8 flag:
+
+ utf8::downgrade($val) if $] > 5.007;
+
+=back
+
+=head1 SEE ALSO
+
+L<perlunitut>, L<perluniintro>, L<Encode>, L<open>, L<utf8>, L<bytes>,
+L<perlretut>, L<perlvar/"${^UNICODE}">
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlunifaq.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlunifaq.pod
new file mode 100755
index 00000000000..83edc7d4885
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlunifaq.pod
@@ -0,0 +1,307 @@
+=head1 NAME
+
+perlunifaq - Perl Unicode FAQ
+
+=head1 Q and A
+
+This is a list of questions and answers about Unicode in Perl, intended to be
+read after L<perlunitut>.
+
+=head2 perlunitut isn't really a Unicode tutorial, is it?
+
+No, and this isn't really a Unicode FAQ.
+
+Perl has an abstracted interface for all supported character encodings, so they
+is actually a generic C<Encode> tutorial and C<Encode> FAQ. But many people
+think that Unicode is special and magical, and I didn't want to disappoint
+them, so I decided to call the document a Unicode tutorial.
+
+=head2 What character encodings does Perl support?
+
+To find out which character encodings your Perl supports, run:
+
+ perl -MEncode -le "print for Encode->encodings(':all')"
+
+=head2 Which version of perl should I use?
+
+Well, if you can, upgrade to the most recent, but certainly C<5.8.1> or newer.
+The tutorial and FAQ are based on the status quo as of C<5.8.8>.
+
+You should also check your modules, and upgrade them if necessary. For example,
+HTML::Entities requires version >= 1.32 to function correctly, even though the
+changelog is silent about this.
+
+=head2 What about binary data, like images?
+
+Well, apart from a bare C<binmode $fh>, you shouldn't treat them specially.
+(The binmode is needed because otherwise Perl may convert line endings on Win32
+systems.)
+
+Be careful, though, to never combine text strings with binary strings. If you
+need text in a binary stream, encode your text strings first using the
+appropriate encoding, then join them with binary strings. See also: "What if I
+don't encode?".
+
+=head2 When should I decode or encode?
+
+Whenever you're communicating text with anything that is external to your perl
+process, like a database, a text file, a socket, or another program. Even if
+the thing you're communicating with is also written in Perl.
+
+=head2 What if I don't decode?
+
+Whenever your encoded, binary string is used together with a text string, Perl
+will assume that your binary string was encoded with ISO-8859-1, also known as
+latin-1. If it wasn't latin-1, then your data is unpleasantly converted. For
+example, if it was UTF-8, the individual bytes of multibyte characters are seen
+as separate characters, and then again converted to UTF-8. Such double encoding
+can be compared to double HTML encoding (C<&amp;gt;>), or double URI encoding
+(C<%253E>).
+
+This silent implicit decoding is known as "upgrading". That may sound
+positive, but it's best to avoid it.
+
+=head2 What if I don't encode?
+
+Your text string will be sent using the bytes in Perl's internal format. In
+some cases, Perl will warn you that you're doing something wrong, with a
+friendly warning:
+
+ Wide character in print at example.pl line 2.
+
+Because the internal format is often UTF-8, these bugs are hard to spot,
+because UTF-8 is usually the encoding you wanted! But don't be lazy, and don't
+use the fact that Perl's internal format is UTF-8 to your advantage. Encode
+explicitly to avoid weird bugs, and to show to maintenance programmers that you
+thought this through.
+
+=head2 Is there a way to automatically decode or encode?
+
+If all data that comes from a certain handle is encoded in exactly the same
+way, you can tell the PerlIO system to automatically decode everything, with
+the C<encoding> layer. If you do this, you can't accidentally forget to decode
+or encode anymore, on things that use the layered handle.
+
+You can provide this layer when C<open>ing the file:
+
+ open my $fh, '>:encoding(UTF-8)', $filename; # auto encoding on write
+ open my $fh, '<:encoding(UTF-8)', $filename; # auto decoding on read
+
+Or if you already have an open filehandle:
+
+ binmode $fh, ':encoding(UTF-8)';
+
+Some database drivers for DBI can also automatically encode and decode, but
+that is sometimes limited to the UTF-8 encoding.
+
+=head2 What if I don't know which encoding was used?
+
+Do whatever you can to find out, and if you have to: guess. (Don't forget to
+document your guess with a comment.)
+
+You could open the document in a web browser, and change the character set or
+character encoding until you can visually confirm that all characters look the
+way they should.
+
+There is no way to reliably detect the encoding automatically, so if people
+keep sending you data without charset indication, you may have to educate them.
+
+=head2 Can I use Unicode in my Perl sources?
+
+Yes, you can! If your sources are UTF-8 encoded, you can indicate that with the
+C<use utf8> pragma.
+
+ use utf8;
+
+This doesn't do anything to your input, or to your output. It only influences
+the way your sources are read. You can use Unicode in string literals, in
+identifiers (but they still have to be "word characters" according to C<\w>),
+and even in custom delimiters.
+
+=head2 Data::Dumper doesn't restore the UTF8 flag; is it broken?
+
+No, Data::Dumper's Unicode abilities are as they should be. There have been
+some complaints that it should restore the UTF8 flag when the data is read
+again with C<eval>. However, you should really not look at the flag, and
+nothing indicates that Data::Dumper should break this rule.
+
+Here's what happens: when Perl reads in a string literal, it sticks to 8 bit
+encoding as long as it can. (But perhaps originally it was internally encoded
+as UTF-8, when you dumped it.) When it has to give that up because other
+characters are added to the text string, it silently upgrades the string to
+UTF-8.
+
+If you properly encode your strings for output, none of this is of your
+concern, and you can just C<eval> dumped data as always.
+
+=head2 Why do regex character classes sometimes match only in the ASCII range?
+
+=head2 Why do some characters not uppercase or lowercase correctly?
+
+It seemed like a good idea at the time, to keep the semantics the same for
+standard strings, when Perl got Unicode support. While it might be repaired
+in the future, we now have to deal with the fact that Perl treats equal
+strings differently, depending on the internal state.
+
+Affected are C<uc>, C<lc>, C<ucfirst>, C<lcfirst>, C<\U>, C<\L>, C<\u>, C<\l>,
+C<\d>, C<\s>, C<\w>, C<\D>, C<\S>, C<\W>, C</.../i>, C<(?i:...)>,
+C</[[:posix:]]/>, and C<quotemeta> (though this last should not cause any real
+problems).
+
+To force Unicode semantics, you can upgrade the internal representation to
+by doing C<utf8::upgrade($string)>. This can be used
+safely on any string, as it checks and does not change strings that have
+already been upgraded.
+
+For a more detailed discussion, see L<Unicode::Semantics> on CPAN.
+
+=head2 How can I determine if a string is a text string or a binary string?
+
+You can't. Some use the UTF8 flag for this, but that's misuse, and makes well
+behaved modules like Data::Dumper look bad. The flag is useless for this
+purpose, because it's off when an 8 bit encoding (by default ISO-8859-1) is
+used to store the string.
+
+This is something you, the programmer, has to keep track of; sorry. You could
+consider adopting a kind of "Hungarian notation" to help with this.
+
+=head2 How do I convert from encoding FOO to encoding BAR?
+
+By first converting the FOO-encoded byte string to a text string, and then the
+text string to a BAR-encoded byte string:
+
+ my $text_string = decode('FOO', $foo_string);
+ my $bar_string = encode('BAR', $text_string);
+
+or by skipping the text string part, and going directly from one binary
+encoding to the other:
+
+ use Encode qw(from_to);
+ from_to($string, 'FOO', 'BAR'); # changes contents of $string
+
+or by letting automatic decoding and encoding do all the work:
+
+ open my $foofh, '<:encoding(FOO)', 'example.foo.txt';
+ open my $barfh, '>:encoding(BAR)', 'example.bar.txt';
+ print { $barfh } $_ while <$foofh>;
+
+=head2 What are C<decode_utf8> and C<encode_utf8>?
+
+These are alternate syntaxes for C<decode('utf8', ...)> and C<encode('utf8',
+...)>.
+
+=head2 What is a "wide character"?
+
+This is a term used both for characters with an ordinal value greater than 127,
+characters with an ordinal value greater than 255, or any character occupying
+than one byte, depending on the context.
+
+The Perl warning "Wide character in ..." is caused by a character with an
+ordinal value greater than 255. With no specified encoding layer, Perl tries to
+fit things in ISO-8859-1 for backward compatibility reasons. When it can't, it
+emits this warning (if warnings are enabled), and outputs UTF-8 encoded data
+instead.
+
+To avoid this warning and to avoid having different output encodings in a single
+stream, always specify an encoding explicitly, for example with a PerlIO layer:
+
+ binmode STDOUT, ":encoding(UTF-8)";
+
+=head1 INTERNALS
+
+=head2 What is "the UTF8 flag"?
+
+Please, unless you're hacking the internals, or debugging weirdness, don't
+think about the UTF8 flag at all. That means that you very probably shouldn't
+use C<is_utf8>, C<_utf8_on> or C<_utf8_off> at all.
+
+The UTF8 flag, also called SvUTF8, is an internal flag that indicates that the
+current internal representation is UTF-8. Without the flag, it is assumed to be
+ISO-8859-1. Perl converts between these automatically.
+
+One of Perl's internal formats happens to be UTF-8. Unfortunately, Perl can't
+keep a secret, so everyone knows about this. That is the source of much
+confusion. It's better to pretend that the internal format is some unknown
+encoding, and that you always have to encode and decode explicitly.
+
+=head2 What about the C<use bytes> pragma?
+
+Don't use it. It makes no sense to deal with bytes in a text string, and it
+makes no sense to deal with characters in a byte string. Do the proper
+conversions (by decoding/encoding), and things will work out well: you get
+character counts for decoded data, and byte counts for encoded data.
+
+C<use bytes> is usually a failed attempt to do something useful. Just forget
+about it.
+
+=head2 What about the C<use encoding> pragma?
+
+Don't use it. Unfortunately, it assumes that the programmer's environment and
+that of the user will use the same encoding. It will use the same encoding for
+the source code and for STDIN and STDOUT. When a program is copied to another
+machine, the source code does not change, but the STDIO environment might.
+
+If you need non-ASCII characters in your source code, make it a UTF-8 encoded
+file and C<use utf8>.
+
+If you need to set the encoding for STDIN, STDOUT, and STDERR, for example
+based on the user's locale, C<use open>.
+
+=head2 What is the difference between C<:encoding> and C<:utf8>?
+
+Because UTF-8 is one of Perl's internal formats, you can often just skip the
+encoding or decoding step, and manipulate the UTF8 flag directly.
+
+Instead of C<:encoding(UTF-8)>, you can simply use C<:utf8>, which skips the
+encoding step if the data was already represented as UTF8 internally. This is
+widely accepted as good behavior when you're writing, but it can be dangerous
+when reading, because it causes internal inconsistency when you have invalid
+byte sequences. Using C<:utf8> for input can sometimes result in security
+breaches, so please use C<:encoding(UTF-8)> instead.
+
+Instead of C<decode> and C<encode>, you could use C<_utf8_on> and C<_utf8_off>,
+but this is considered bad style. Especially C<_utf8_on> can be dangerous, for
+the same reason that C<:utf8> can.
+
+There are some shortcuts for oneliners; see C<-C> in L<perlrun>.
+
+=head2 What's the difference between C<UTF-8> and C<utf8>?
+
+C<UTF-8> is the official standard. C<utf8> is Perl's way of being liberal in
+what it accepts. If you have to communicate with things that aren't so liberal,
+you may want to consider using C<UTF-8>. If you have to communicate with things
+that are too liberal, you may have to use C<utf8>. The full explanation is in
+L<Encode>.
+
+C<UTF-8> is internally known as C<utf-8-strict>. The tutorial uses UTF-8
+consistently, even where utf8 is actually used internally, because the
+distinction can be hard to make, and is mostly irrelevant.
+
+For example, utf8 can be used for code points that don't exist in Unicode, like
+9999999, but if you encode that to UTF-8, you get a substitution character (by
+default; see L<Encode/"Handling Malformed Data"> for more ways of dealing with
+this.)
+
+Okay, if you insist: the "internal format" is utf8, not UTF-8. (When it's not
+some other encoding.)
+
+=head2 I lost track; what encoding is the internal format really?
+
+It's good that you lost track, because you shouldn't depend on the internal
+format being any specific encoding. But since you asked: by default, the
+internal format is either ISO-8859-1 (latin-1), or utf8, depending on the
+history of the string. On EBCDIC platforms, this may be different even.
+
+Perl knows how it stored the string internally, and will use that knowledge
+when you C<encode>. In other words: don't try to find out what the internal
+encoding for a certain string is, but instead just encode it into the encoding
+that you want.
+
+=head1 AUTHOR
+
+Juerd Waalboer <#####@juerd.nl>
+
+=head1 SEE ALSO
+
+L<perlunicode>, L<perluniintro>, L<Encode>
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perluniintro.pod b/Master/tlpkg/tlperl.straw/lib/pods/perluniintro.pod
new file mode 100755
index 00000000000..36f729c67b4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perluniintro.pod
@@ -0,0 +1,887 @@
+=head1 NAME
+
+perluniintro - Perl Unicode introduction
+
+=head1 DESCRIPTION
+
+This document gives a general idea of Unicode and how to use Unicode
+in Perl.
+
+=head2 Unicode
+
+Unicode is a character set standard which plans to codify all of the
+writing systems of the world, plus many other symbols.
+
+Unicode and ISO/IEC 10646 are coordinated standards that provide code
+points for characters in almost all modern character set standards,
+covering more than 30 writing systems and hundreds of languages,
+including all commercially-important modern languages. All characters
+in the largest Chinese, Japanese, and Korean dictionaries are also
+encoded. The standards will eventually cover almost all characters in
+more than 250 writing systems and thousands of languages.
+Unicode 1.0 was released in October 1991, and 4.0 in April 2003.
+
+A Unicode I<character> is an abstract entity. It is not bound to any
+particular integer width, especially not to the C language C<char>.
+Unicode is language-neutral and display-neutral: it does not encode the
+language of the text and it does not generally define fonts or other graphical
+layout details. Unicode operates on characters and on text built from
+those characters.
+
+Unicode defines characters like C<LATIN CAPITAL LETTER A> or C<GREEK
+SMALL LETTER ALPHA> and unique numbers for the characters, in this
+case 0x0041 and 0x03B1, respectively. These unique numbers are called
+I<code points>.
+
+The Unicode standard prefers using hexadecimal notation for the code
+points. If numbers like C<0x0041> are unfamiliar to you, take a peek
+at a later section, L</"Hexadecimal Notation">. The Unicode standard
+uses the notation C<U+0041 LATIN CAPITAL LETTER A>, to give the
+hexadecimal code point and the normative name of the character.
+
+Unicode also defines various I<properties> for the characters, like
+"uppercase" or "lowercase", "decimal digit", or "punctuation";
+these properties are independent of the names of the characters.
+Furthermore, various operations on the characters like uppercasing,
+lowercasing, and collating (sorting) are defined.
+
+A Unicode character consists either of a single code point, or a
+I<base character> (like C<LATIN CAPITAL LETTER A>), followed by one or
+more I<modifiers> (like C<COMBINING ACUTE ACCENT>). This sequence of
+base character and modifiers is called a I<combining character
+sequence>.
+
+Whether to call these combining character sequences "characters"
+depends on your point of view. If you are a programmer, you probably
+would tend towards seeing each element in the sequences as one unit,
+or "character". The whole sequence could be seen as one "character",
+however, from the user's point of view, since that's probably what it
+looks like in the context of the user's language.
+
+With this "whole sequence" view of characters, the total number of
+characters is open-ended. But in the programmer's "one unit is one
+character" point of view, the concept of "characters" is more
+deterministic. In this document, we take that second point of view:
+one "character" is one Unicode code point, be it a base character or
+a combining character.
+
+For some combinations, there are I<precomposed> characters.
+C<LATIN CAPITAL LETTER A WITH ACUTE>, for example, is defined as
+a single code point. These precomposed characters are, however,
+only available for some combinations, and are mainly
+meant to support round-trip conversions between Unicode and legacy
+standards (like the ISO 8859). In the general case, the composing
+method is more extensible. To support conversion between
+different compositions of the characters, various I<normalization
+forms> to standardize representations are also defined.
+
+Because of backward compatibility with legacy encodings, the "a unique
+number for every character" idea breaks down a bit: instead, there is
+"at least one number for every character". The same character could
+be represented differently in several legacy encodings. The
+converse is also not true: some code points do not have an assigned
+character. Firstly, there are unallocated code points within
+otherwise used blocks. Secondly, there are special Unicode control
+characters that do not represent true characters.
+
+A common myth about Unicode is that it would be "16-bit", that is,
+Unicode is only represented as C<0x10000> (or 65536) characters from
+C<0x0000> to C<0xFFFF>. B<This is untrue.> Since Unicode 2.0 (July
+1996), Unicode has been defined all the way up to 21 bits (C<0x10FFFF>),
+and since Unicode 3.1 (March 2001), characters have been defined
+beyond C<0xFFFF>. The first C<0x10000> characters are called the
+I<Plane 0>, or the I<Basic Multilingual Plane> (BMP). With Unicode
+3.1, 17 (yes, seventeen) planes in all were defined--but they are
+nowhere near full of defined characters, yet.
+
+Another myth is that the 256-character blocks have something to
+do with languages--that each block would define the characters used
+by a language or a set of languages. B<This is also untrue.>
+The division into blocks exists, but it is almost completely
+accidental--an artifact of how the characters have been and
+still are allocated. Instead, there is a concept called I<scripts>,
+which is more useful: there is C<Latin> script, C<Greek> script, and
+so on. Scripts usually span varied parts of several blocks.
+For further information see L<Unicode::UCD>.
+
+The Unicode code points are just abstract numbers. To input and
+output these abstract numbers, the numbers must be I<encoded> or
+I<serialised> somehow. Unicode defines several I<character encoding
+forms>, of which I<UTF-8> is perhaps the most popular. UTF-8 is a
+variable length encoding that encodes Unicode characters as 1 to 6
+bytes (only 4 with the currently defined characters). Other encodings
+include UTF-16 and UTF-32 and their big- and little-endian variants
+(UTF-8 is byte-order independent) The ISO/IEC 10646 defines the UCS-2
+and UCS-4 encoding forms.
+
+For more information about encodings--for instance, to learn what
+I<surrogates> and I<byte order marks> (BOMs) are--see L<perlunicode>.
+
+=head2 Perl's Unicode Support
+
+Starting from Perl 5.6.0, Perl has had the capacity to handle Unicode
+natively. Perl 5.8.0, however, is the first recommended release for
+serious Unicode work. The maintenance release 5.6.1 fixed many of the
+problems of the initial Unicode implementation, but for example
+regular expressions still do not work with Unicode in 5.6.1.
+
+B<Starting from Perl 5.8.0, the use of C<use utf8> is needed only in much more restricted circumstances.> In earlier releases the C<utf8> pragma was used to declare
+that operations in the current block or file would be Unicode-aware.
+This model was found to be wrong, or at least clumsy: the "Unicodeness"
+is now carried with the data, instead of being attached to the
+operations. Only one case remains where an explicit C<use utf8> is
+needed: if your Perl script itself is encoded in UTF-8, you can use
+UTF-8 in your identifier names, and in string and regular expression
+literals, by saying C<use utf8>. This is not the default because
+scripts with legacy 8-bit data in them would break. See L<utf8>.
+
+=head2 Perl's Unicode Model
+
+Perl supports both pre-5.6 strings of eight-bit native bytes, and
+strings of Unicode characters. The principle is that Perl tries to
+keep its data as eight-bit bytes for as long as possible, but as soon
+as Unicodeness cannot be avoided, the data is transparently upgraded
+to Unicode.
+
+Internally, Perl currently uses either whatever the native eight-bit
+character set of the platform (for example Latin-1) is, defaulting to
+UTF-8, to encode Unicode strings. Specifically, if all code points in
+the string are C<0xFF> or less, Perl uses the native eight-bit
+character set. Otherwise, it uses UTF-8.
+
+A user of Perl does not normally need to know nor care how Perl
+happens to encode its internal strings, but it becomes relevant when
+outputting Unicode strings to a stream without a PerlIO layer -- one with
+the "default" encoding. In such a case, the raw bytes used internally
+(the native character set or UTF-8, as appropriate for each string)
+will be used, and a "Wide character" warning will be issued if those
+strings contain a character beyond 0x00FF.
+
+For example,
+
+ perl -e 'print "\x{DF}\n", "\x{0100}\x{DF}\n"'
+
+produces a fairly useless mixture of native bytes and UTF-8, as well
+as a warning:
+
+ Wide character in print at ...
+
+To output UTF-8, use the C<:encoding> or C<:utf8> output layer. Prepending
+
+ binmode(STDOUT, ":utf8");
+
+to this sample program ensures that the output is completely UTF-8,
+and removes the program's warning.
+
+You can enable automatic UTF-8-ification of your standard file
+handles, default C<open()> layer, and C<@ARGV> by using either
+the C<-C> command line switch or the C<PERL_UNICODE> environment
+variable, see L<perlrun> for the documentation of the C<-C> switch.
+
+Note that this means that Perl expects other software to work, too:
+if Perl has been led to believe that STDIN should be UTF-8, but then
+STDIN coming in from another command is not UTF-8, Perl will complain
+about the malformed UTF-8.
+
+All features that combine Unicode and I/O also require using the new
+PerlIO feature. Almost all Perl 5.8 platforms do use PerlIO, though:
+you can see whether yours is by running "perl -V" and looking for
+C<useperlio=define>.
+
+=head2 Unicode and EBCDIC
+
+Perl 5.8.0 also supports Unicode on EBCDIC platforms. There,
+Unicode support is somewhat more complex to implement since
+additional conversions are needed at every step. Some problems
+remain, see L<perlebcdic> for details.
+
+In any case, the Unicode support on EBCDIC platforms is better than
+in the 5.6 series, which didn't work much at all for EBCDIC platform.
+On EBCDIC platforms, the internal Unicode encoding form is UTF-EBCDIC
+instead of UTF-8. The difference is that as UTF-8 is "ASCII-safe" in
+that ASCII characters encode to UTF-8 as-is, while UTF-EBCDIC is
+"EBCDIC-safe".
+
+=head2 Creating Unicode
+
+To create Unicode characters in literals for code points above C<0xFF>,
+use the C<\x{...}> notation in double-quoted strings:
+
+ my $smiley = "\x{263a}";
+
+Similarly, it can be used in regular expression literals
+
+ $smiley =~ /\x{263a}/;
+
+At run-time you can use C<chr()>:
+
+ my $hebrew_alef = chr(0x05d0);
+
+See L</"Further Resources"> for how to find all these numeric codes.
+
+Naturally, C<ord()> will do the reverse: it turns a character into
+a code point.
+
+Note that C<\x..> (no C<{}> and only two hexadecimal digits), C<\x{...}>,
+and C<chr(...)> for arguments less than C<0x100> (decimal 256)
+generate an eight-bit character for backward compatibility with older
+Perls. For arguments of C<0x100> or more, Unicode characters are
+always produced. If you want to force the production of Unicode
+characters regardless of the numeric value, use C<pack("U", ...)>
+instead of C<\x..>, C<\x{...}>, or C<chr()>.
+
+You can also use the C<charnames> pragma to invoke characters
+by name in double-quoted strings:
+
+ use charnames ':full';
+ my $arabic_alef = "\N{ARABIC LETTER ALEF}";
+
+And, as mentioned above, you can also C<pack()> numbers into Unicode
+characters:
+
+ my $georgian_an = pack("U", 0x10a0);
+
+Note that both C<\x{...}> and C<\N{...}> are compile-time string
+constants: you cannot use variables in them. if you want similar
+run-time functionality, use C<chr()> and C<charnames::vianame()>.
+
+If you want to force the result to Unicode characters, use the special
+C<"U0"> prefix. It consumes no arguments but causes the following bytes
+to be interpreted as the UTF-8 encoding of Unicode characters:
+
+ my $chars = pack("U0W*", 0x80, 0x42);
+
+Likewise, you can stop such UTF-8 interpretation by using the special
+C<"C0"> prefix.
+
+=head2 Handling Unicode
+
+Handling Unicode is for the most part transparent: just use the
+strings as usual. Functions like C<index()>, C<length()>, and
+C<substr()> will work on the Unicode characters; regular expressions
+will work on the Unicode characters (see L<perlunicode> and L<perlretut>).
+
+Note that Perl considers combining character sequences to be
+separate characters, so for example
+
+ use charnames ':full';
+ print length("\N{LATIN CAPITAL LETTER A}\N{COMBINING ACUTE ACCENT}"), "\n";
+
+will print 2, not 1. The only exception is that regular expressions
+have C<\X> for matching a combining character sequence.
+
+Life is not quite so transparent, however, when working with legacy
+encodings, I/O, and certain special cases:
+
+=head2 Legacy Encodings
+
+When you combine legacy data and Unicode the legacy data needs
+to be upgraded to Unicode. Normally ISO 8859-1 (or EBCDIC, if
+applicable) is assumed.
+
+The C<Encode> module knows about many encodings and has interfaces
+for doing conversions between those encodings:
+
+ use Encode 'decode';
+ $data = decode("iso-8859-3", $data); # convert from legacy to utf-8
+
+=head2 Unicode I/O
+
+Normally, writing out Unicode data
+
+ print FH $some_string_with_unicode, "\n";
+
+produces raw bytes that Perl happens to use to internally encode the
+Unicode string. Perl's internal encoding depends on the system as
+well as what characters happen to be in the string at the time. If
+any of the characters are at code points C<0x100> or above, you will get
+a warning. To ensure that the output is explicitly rendered in the
+encoding you desire--and to avoid the warning--open the stream with
+the desired encoding. Some examples:
+
+ open FH, ">:utf8", "file";
+
+ open FH, ">:encoding(ucs2)", "file";
+ open FH, ">:encoding(UTF-8)", "file";
+ open FH, ">:encoding(shift_jis)", "file";
+
+and on already open streams, use C<binmode()>:
+
+ binmode(STDOUT, ":utf8");
+
+ binmode(STDOUT, ":encoding(ucs2)");
+ binmode(STDOUT, ":encoding(UTF-8)");
+ binmode(STDOUT, ":encoding(shift_jis)");
+
+The matching of encoding names is loose: case does not matter, and
+many encodings have several aliases. Note that the C<:utf8> layer
+must always be specified exactly like that; it is I<not> subject to
+the loose matching of encoding names. Also note that C<:utf8> is unsafe for
+input, because it accepts the data without validating that it is indeed valid
+UTF8.
+
+See L<PerlIO> for the C<:utf8> layer, L<PerlIO::encoding> and
+L<Encode::PerlIO> for the C<:encoding()> layer, and
+L<Encode::Supported> for many encodings supported by the C<Encode>
+module.
+
+Reading in a file that you know happens to be encoded in one of the
+Unicode or legacy encodings does not magically turn the data into
+Unicode in Perl's eyes. To do that, specify the appropriate
+layer when opening files
+
+ open(my $fh,'<:encoding(utf8)', 'anything');
+ my $line_of_unicode = <$fh>;
+
+ open(my $fh,'<:encoding(Big5)', 'anything');
+ my $line_of_unicode = <$fh>;
+
+The I/O layers can also be specified more flexibly with
+the C<open> pragma. See L<open>, or look at the following example.
+
+ use open ':encoding(utf8)'; # input/output default encoding will be UTF-8
+ open X, ">file";
+ print X chr(0x100), "\n";
+ close X;
+ open Y, "<file";
+ printf "%#x\n", ord(<Y>); # this should print 0x100
+ close Y;
+
+With the C<open> pragma you can use the C<:locale> layer
+
+ BEGIN { $ENV{LC_ALL} = $ENV{LANG} = 'ru_RU.KOI8-R' }
+ # the :locale will probe the locale environment variables like LC_ALL
+ use open OUT => ':locale'; # russki parusski
+ open(O, ">koi8");
+ print O chr(0x430); # Unicode CYRILLIC SMALL LETTER A = KOI8-R 0xc1
+ close O;
+ open(I, "<koi8");
+ printf "%#x\n", ord(<I>), "\n"; # this should print 0xc1
+ close I;
+
+These methods install a transparent filter on the I/O stream that
+converts data from the specified encoding when it is read in from the
+stream. The result is always Unicode.
+
+The L<open> pragma affects all the C<open()> calls after the pragma by
+setting default layers. If you want to affect only certain
+streams, use explicit layers directly in the C<open()> call.
+
+You can switch encodings on an already opened stream by using
+C<binmode()>; see L<perlfunc/binmode>.
+
+The C<:locale> does not currently (as of Perl 5.8.0) work with
+C<open()> and C<binmode()>, only with the C<open> pragma. The
+C<:utf8> and C<:encoding(...)> methods do work with all of C<open()>,
+C<binmode()>, and the C<open> pragma.
+
+Similarly, you may use these I/O layers on output streams to
+automatically convert Unicode to the specified encoding when it is
+written to the stream. For example, the following snippet copies the
+contents of the file "text.jis" (encoded as ISO-2022-JP, aka JIS) to
+the file "text.utf8", encoded as UTF-8:
+
+ open(my $nihongo, '<:encoding(iso-2022-jp)', 'text.jis');
+ open(my $unicode, '>:utf8', 'text.utf8');
+ while (<$nihongo>) { print $unicode $_ }
+
+The naming of encodings, both by the C<open()> and by the C<open>
+pragma allows for flexible names: C<koi8-r> and C<KOI8R> will both be
+understood.
+
+Common encodings recognized by ISO, MIME, IANA, and various other
+standardisation organisations are recognised; for a more detailed
+list see L<Encode::Supported>.
+
+C<read()> reads characters and returns the number of characters.
+C<seek()> and C<tell()> operate on byte counts, as do C<sysread()>
+and C<sysseek()>.
+
+Notice that because of the default behaviour of not doing any
+conversion upon input if there is no default layer,
+it is easy to mistakenly write code that keeps on expanding a file
+by repeatedly encoding the data:
+
+ # BAD CODE WARNING
+ open F, "file";
+ local $/; ## read in the whole file of 8-bit characters
+ $t = <F>;
+ close F;
+ open F, ">:encoding(utf8)", "file";
+ print F $t; ## convert to UTF-8 on output
+ close F;
+
+If you run this code twice, the contents of the F<file> will be twice
+UTF-8 encoded. A C<use open ':encoding(utf8)'> would have avoided the
+bug, or explicitly opening also the F<file> for input as UTF-8.
+
+B<NOTE>: the C<:utf8> and C<:encoding> features work only if your
+Perl has been built with the new PerlIO feature (which is the default
+on most systems).
+
+=head2 Displaying Unicode As Text
+
+Sometimes you might want to display Perl scalars containing Unicode as
+simple ASCII (or EBCDIC) text. The following subroutine converts
+its argument so that Unicode characters with code points greater than
+255 are displayed as C<\x{...}>, control characters (like C<\n>) are
+displayed as C<\x..>, and the rest of the characters as themselves:
+
+ sub nice_string {
+ join("",
+ map { $_ > 255 ? # if wide character...
+ sprintf("\\x{%04X}", $_) : # \x{...}
+ chr($_) =~ /[[:cntrl:]]/ ? # else if control character ...
+ sprintf("\\x%02X", $_) : # \x..
+ quotemeta(chr($_)) # else quoted or as themselves
+ } unpack("W*", $_[0])); # unpack Unicode characters
+ }
+
+For example,
+
+ nice_string("foo\x{100}bar\n")
+
+returns the string
+
+ 'foo\x{0100}bar\x0A'
+
+which is ready to be printed.
+
+=head2 Special Cases
+
+=over 4
+
+=item *
+
+Bit Complement Operator ~ And vec()
+
+The bit complement operator C<~> may produce surprising results if
+used on strings containing characters with ordinal values above
+255. In such a case, the results are consistent with the internal
+encoding of the characters, but not with much else. So don't do
+that. Similarly for C<vec()>: you will be operating on the
+internally-encoded bit patterns of the Unicode characters, not on
+the code point values, which is very probably not what you want.
+
+=item *
+
+Peeking At Perl's Internal Encoding
+
+Normal users of Perl should never care how Perl encodes any particular
+Unicode string (because the normal ways to get at the contents of a
+string with Unicode--via input and output--should always be via
+explicitly-defined I/O layers). But if you must, there are two
+ways of looking behind the scenes.
+
+One way of peeking inside the internal encoding of Unicode characters
+is to use C<unpack("C*", ...> to get the bytes of whatever the string
+encoding happens to be, or C<unpack("U0..", ...)> to get the bytes of the
+UTF-8 encoding:
+
+ # this prints c4 80 for the UTF-8 bytes 0xc4 0x80
+ print join(" ", unpack("U0(H2)*", pack("U", 0x100))), "\n";
+
+Yet another way would be to use the Devel::Peek module:
+
+ perl -MDevel::Peek -e 'Dump(chr(0x100))'
+
+That shows the C<UTF8> flag in FLAGS and both the UTF-8 bytes
+and Unicode characters in C<PV>. See also later in this document
+the discussion about the C<utf8::is_utf8()> function.
+
+=back
+
+=head2 Advanced Topics
+
+=over 4
+
+=item *
+
+String Equivalence
+
+The question of string equivalence turns somewhat complicated
+in Unicode: what do you mean by "equal"?
+
+(Is C<LATIN CAPITAL LETTER A WITH ACUTE> equal to
+C<LATIN CAPITAL LETTER A>?)
+
+The short answer is that by default Perl compares equivalence (C<eq>,
+C<ne>) based only on code points of the characters. In the above
+case, the answer is no (because 0x00C1 != 0x0041). But sometimes, any
+CAPITAL LETTER As should be considered equal, or even As of any case.
+
+The long answer is that you need to consider character normalization
+and casing issues: see L<Unicode::Normalize>, Unicode Technical
+Reports #15 and #21, I<Unicode Normalization Forms> and I<Case
+Mappings>, L<http://www.unicode.org/unicode/reports/tr15/> and
+L<http://www.unicode.org/unicode/reports/tr21/>
+
+As of Perl 5.8.0, the "Full" case-folding of I<Case
+Mappings/SpecialCasing> is implemented.
+
+=item *
+
+String Collation
+
+People like to see their strings nicely sorted--or as Unicode
+parlance goes, collated. But again, what do you mean by collate?
+
+(Does C<LATIN CAPITAL LETTER A WITH ACUTE> come before or after
+C<LATIN CAPITAL LETTER A WITH GRAVE>?)
+
+The short answer is that by default, Perl compares strings (C<lt>,
+C<le>, C<cmp>, C<ge>, C<gt>) based only on the code points of the
+characters. In the above case, the answer is "after", since
+C<0x00C1> > C<0x00C0>.
+
+The long answer is that "it depends", and a good answer cannot be
+given without knowing (at the very least) the language context.
+See L<Unicode::Collate>, and I<Unicode Collation Algorithm>
+L<http://www.unicode.org/unicode/reports/tr10/>
+
+=back
+
+=head2 Miscellaneous
+
+=over 4
+
+=item *
+
+Character Ranges and Classes
+
+Character ranges in regular expression character classes (C</[a-z]/>)
+and in the C<tr///> (also known as C<y///>) operator are not magically
+Unicode-aware. What this means is that C<[A-Za-z]> will not magically start
+to mean "all alphabetic letters"; not that it does mean that even for
+8-bit characters, you should be using C</[[:alpha:]]/> in that case.
+
+For specifying character classes like that in regular expressions,
+you can use the various Unicode properties--C<\pL>, or perhaps
+C<\p{Alphabetic}>, in this particular case. You can use Unicode
+code points as the end points of character ranges, but there is no
+magic associated with specifying a certain range. For further
+information--there are dozens of Unicode character classes--see
+L<perlunicode>.
+
+=item *
+
+String-To-Number Conversions
+
+Unicode does define several other decimal--and numeric--characters
+besides the familiar 0 to 9, such as the Arabic and Indic digits.
+Perl does not support string-to-number conversion for digits other
+than ASCII 0 to 9 (and ASCII a to f for hexadecimal).
+
+=back
+
+=head2 Questions With Answers
+
+=over 4
+
+=item *
+
+Will My Old Scripts Break?
+
+Very probably not. Unless you are generating Unicode characters
+somehow, old behaviour should be preserved. About the only behaviour
+that has changed and which could start generating Unicode is the old
+behaviour of C<chr()> where supplying an argument more than 255
+produced a character modulo 255. C<chr(300)>, for example, was equal
+to C<chr(45)> or "-" (in ASCII), now it is LATIN CAPITAL LETTER I WITH
+BREVE.
+
+=item *
+
+How Do I Make My Scripts Work With Unicode?
+
+Very little work should be needed since nothing changes until you
+generate Unicode data. The most important thing is getting input as
+Unicode; for that, see the earlier I/O discussion.
+
+=item *
+
+How Do I Know Whether My String Is In Unicode?
+
+You shouldn't have to care. But you may, because currently the semantics of the
+characters whose ordinals are in the range 128 to 255 is different depending on
+whether the string they are contained within is in Unicode or not.
+(See L<perlunicode>.)
+
+To determine if a string is in Unicode, use:
+
+ print utf8::is_utf8($string) ? 1 : 0, "\n";
+
+But note that this doesn't mean that any of the characters in the
+string are necessary UTF-8 encoded, or that any of the characters have
+code points greater than 0xFF (255) or even 0x80 (128), or that the
+string has any characters at all. All the C<is_utf8()> does is to
+return the value of the internal "utf8ness" flag attached to the
+C<$string>. If the flag is off, the bytes in the scalar are interpreted
+as a single byte encoding. If the flag is on, the bytes in the scalar
+are interpreted as the (multi-byte, variable-length) UTF-8 encoded code
+points of the characters. Bytes added to an UTF-8 encoded string are
+automatically upgraded to UTF-8. If mixed non-UTF-8 and UTF-8 scalars
+are merged (double-quoted interpolation, explicit concatenation, and
+printf/sprintf parameter substitution), the result will be UTF-8 encoded
+as if copies of the byte strings were upgraded to UTF-8: for example,
+
+ $a = "ab\x80c";
+ $b = "\x{100}";
+ print "$a = $b\n";
+
+the output string will be UTF-8-encoded C<ab\x80c = \x{100}\n>, but
+C<$a> will stay byte-encoded.
+
+Sometimes you might really need to know the byte length of a string
+instead of the character length. For that use either the
+C<Encode::encode_utf8()> function or the C<bytes> pragma and
+the C<length()> function:
+
+ my $unicode = chr(0x100);
+ print length($unicode), "\n"; # will print 1
+ require Encode;
+ print length(Encode::encode_utf8($unicode)), "\n"; # will print 2
+ use bytes;
+ print length($unicode), "\n"; # will also print 2
+ # (the 0xC4 0x80 of the UTF-8)
+
+=item *
+
+How Do I Detect Data That's Not Valid In a Particular Encoding?
+
+Use the C<Encode> package to try converting it.
+For example,
+
+ use Encode 'decode_utf8';
+
+ if (eval { decode_utf8($string, Encode::FB_CROAK); 1 }) {
+ # $string is valid utf8
+ } else {
+ # $string is not valid utf8
+ }
+
+Or use C<unpack> to try decoding it:
+
+ use warnings;
+ @chars = unpack("C0U*", $string_of_bytes_that_I_think_is_utf8);
+
+If invalid, a C<Malformed UTF-8 character> warning is produced. The "C0" means
+"process the string character per character". Without that, the
+C<unpack("U*", ...)> would work in C<U0> mode (the default if the format
+string starts with C<U>) and it would return the bytes making up the UTF-8
+encoding of the target string, something that will always work.
+
+=item *
+
+How Do I Convert Binary Data Into a Particular Encoding, Or Vice Versa?
+
+This probably isn't as useful as you might think.
+Normally, you shouldn't need to.
+
+In one sense, what you are asking doesn't make much sense: encodings
+are for characters, and binary data are not "characters", so converting
+"data" into some encoding isn't meaningful unless you know in what
+character set and encoding the binary data is in, in which case it's
+not just binary data, now is it?
+
+If you have a raw sequence of bytes that you know should be
+interpreted via a particular encoding, you can use C<Encode>:
+
+ use Encode 'from_to';
+ from_to($data, "iso-8859-1", "utf-8"); # from latin-1 to utf-8
+
+The call to C<from_to()> changes the bytes in C<$data>, but nothing
+material about the nature of the string has changed as far as Perl is
+concerned. Both before and after the call, the string C<$data>
+contains just a bunch of 8-bit bytes. As far as Perl is concerned,
+the encoding of the string remains as "system-native 8-bit bytes".
+
+You might relate this to a fictional 'Translate' module:
+
+ use Translate;
+ my $phrase = "Yes";
+ Translate::from_to($phrase, 'english', 'deutsch');
+ ## phrase now contains "Ja"
+
+The contents of the string changes, but not the nature of the string.
+Perl doesn't know any more after the call than before that the
+contents of the string indicates the affirmative.
+
+Back to converting data. If you have (or want) data in your system's
+native 8-bit encoding (e.g. Latin-1, EBCDIC, etc.), you can use
+pack/unpack to convert to/from Unicode.
+
+ $native_string = pack("W*", unpack("U*", $Unicode_string));
+ $Unicode_string = pack("U*", unpack("W*", $native_string));
+
+If you have a sequence of bytes you B<know> is valid UTF-8,
+but Perl doesn't know it yet, you can make Perl a believer, too:
+
+ use Encode 'decode_utf8';
+ $Unicode = decode_utf8($bytes);
+
+or:
+
+ $Unicode = pack("U0a*", $bytes);
+
+You can find the bytes that make up a UTF-8 sequence with
+
+ @bytes = unpack("C*", $Unicode_string)
+
+and you can create well-formed Unicode with
+
+ $Unicode_string = pack("U*", 0xff, ...)
+
+=item *
+
+How Do I Display Unicode? How Do I Input Unicode?
+
+See L<http://www.alanwood.net/unicode/> and
+L<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
+
+=item *
+
+How Does Unicode Work With Traditional Locales?
+
+In Perl, not very well. Avoid using locales through the C<locale>
+pragma. Use only one or the other. But see L<perlrun> for the
+description of the C<-C> switch and its environment counterpart,
+C<$ENV{PERL_UNICODE}> to see how to enable various Unicode features,
+for example by using locale settings.
+
+=back
+
+=head2 Hexadecimal Notation
+
+The Unicode standard prefers using hexadecimal notation because
+that more clearly shows the division of Unicode into blocks of 256 characters.
+Hexadecimal is also simply shorter than decimal. You can use decimal
+notation, too, but learning to use hexadecimal just makes life easier
+with the Unicode standard. The C<U+HHHH> notation uses hexadecimal,
+for example.
+
+The C<0x> prefix means a hexadecimal number, the digits are 0-9 I<and>
+a-f (or A-F, case doesn't matter). Each hexadecimal digit represents
+four bits, or half a byte. C<print 0x..., "\n"> will show a
+hexadecimal number in decimal, and C<printf "%x\n", $decimal> will
+show a decimal number in hexadecimal. If you have just the
+"hex digits" of a hexadecimal number, you can use the C<hex()> function.
+
+ print 0x0009, "\n"; # 9
+ print 0x000a, "\n"; # 10
+ print 0x000f, "\n"; # 15
+ print 0x0010, "\n"; # 16
+ print 0x0011, "\n"; # 17
+ print 0x0100, "\n"; # 256
+
+ print 0x0041, "\n"; # 65
+
+ printf "%x\n", 65; # 41
+ printf "%#x\n", 65; # 0x41
+
+ print hex("41"), "\n"; # 65
+
+=head2 Further Resources
+
+=over 4
+
+=item *
+
+Unicode Consortium
+
+L<http://www.unicode.org/>
+
+=item *
+
+Unicode FAQ
+
+L<http://www.unicode.org/unicode/faq/>
+
+=item *
+
+Unicode Glossary
+
+L<http://www.unicode.org/glossary/>
+
+=item *
+
+Unicode Useful Resources
+
+L<http://www.unicode.org/unicode/onlinedat/resources.html>
+
+=item *
+
+Unicode and Multilingual Support in HTML, Fonts, Web Browsers and Other Applications
+
+L<http://www.alanwood.net/unicode/>
+
+=item *
+
+UTF-8 and Unicode FAQ for Unix/Linux
+
+L<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
+
+=item *
+
+Legacy Character Sets
+
+L<http://www.czyborra.com/>
+L<http://www.eki.ee/letter/>
+
+=item *
+
+The Unicode support files live within the Perl installation in the
+directory
+
+ $Config{installprivlib}/unicore
+
+in Perl 5.8.0 or newer, and
+
+ $Config{installprivlib}/unicode
+
+in the Perl 5.6 series. (The renaming to F<lib/unicore> was done to
+avoid naming conflicts with lib/Unicode in case-insensitive filesystems.)
+The main Unicode data file is F<UnicodeData.txt> (or F<Unicode.301> in
+Perl 5.6.1.) You can find the C<$Config{installprivlib}> by
+
+ perl "-V:installprivlib"
+
+You can explore various information from the Unicode data files using
+the C<Unicode::UCD> module.
+
+=back
+
+=head1 UNICODE IN OLDER PERLS
+
+If you cannot upgrade your Perl to 5.8.0 or later, you can still
+do some Unicode processing by using the modules C<Unicode::String>,
+C<Unicode::Map8>, and C<Unicode::Map>, available from CPAN.
+If you have the GNU recode installed, you can also use the
+Perl front-end C<Convert::Recode> for character conversions.
+
+The following are fast conversions from ISO 8859-1 (Latin-1) bytes
+to UTF-8 bytes and back, the code works even with older Perl 5 versions.
+
+ # ISO 8859-1 to UTF-8
+ s/([\x80-\xFF])/chr(0xC0|ord($1)>>6).chr(0x80|ord($1)&0x3F)/eg;
+
+ # UTF-8 to ISO 8859-1
+ s/([\xC2\xC3])([\x80-\xBF])/chr(ord($1)<<6&0xC0|ord($2)&0x3F)/eg;
+
+=head1 SEE ALSO
+
+L<perlunitut>, L<perlunicode>, L<Encode>, L<open>, L<utf8>, L<bytes>,
+L<perlretut>, L<perlrun>, L<Unicode::Collate>, L<Unicode::Normalize>,
+L<Unicode::UCD>
+
+=head1 ACKNOWLEDGMENTS
+
+Thanks to the kind readers of the perl5-porters@perl.org,
+perl-unicode@perl.org, linux-utf8@nl.linux.org, and unicore@unicode.org
+mailing lists for their valuable feedback.
+
+=head1 AUTHOR, COPYRIGHT, AND LICENSE
+
+Copyright 2001-2002 Jarkko Hietaniemi E<lt>jhi@iki.fiE<gt>
+
+This document may be distributed under the same terms as Perl itself.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlunitut.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlunitut.pod
new file mode 100755
index 00000000000..6c7dfb057e2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlunitut.pod
@@ -0,0 +1,209 @@
+=head1 NAME
+
+perlunitut - Perl Unicode Tutorial
+
+=head1 DESCRIPTION
+
+The days of just flinging strings around are over. It's well established that
+modern programs need to be capable of communicating funny accented letters, and
+things like euro symbols. This means that programmers need new habits. It's
+easy to program Unicode capable software, but it does require discipline to do
+it right.
+
+There's a lot to know about character sets, and text encodings. It's probably
+best to spend a full day learning all this, but the basics can be learned in
+minutes.
+
+These are not the very basics, though. It is assumed that you already
+know the difference between bytes and characters, and realise (and accept!)
+that there are many different character sets and encodings, and that your
+program has to be explicit about them. Recommended reading is "The Absolute
+Minimum Every Software Developer Absolutely, Positively Must Know About Unicode
+and Character Sets (No Excuses!)" by Joel Spolsky, at
+L<http://joelonsoftware.com/articles/Unicode.html>.
+
+This tutorial speaks in rather absolute terms, and provides only a limited view
+of the wealth of character string related features that Perl has to offer. For
+most projects, this information will probably suffice.
+
+=head2 Definitions
+
+It's important to set a few things straight first. This is the most important
+part of this tutorial. This view may conflict with other information that you
+may have found on the web, but that's mostly because many sources are wrong.
+
+You may have to re-read this entire section a few times...
+
+=head3 Unicode
+
+B<Unicode> is a character set with room for lots of characters. The ordinal
+value of a character is called a B<code point>.
+
+There are many, many code points, but computers work with bytes, and a byte can
+have only 256 values. Unicode has many more characters, so you need a method
+to make these accessible.
+
+Unicode is encoded using several competing encodings, of which UTF-8 is the
+most used. In a Unicode encoding, multiple subsequent bytes can be used to
+store a single code point, or simply: character.
+
+=head3 UTF-8
+
+B<UTF-8> is a Unicode encoding. Many people think that Unicode and UTF-8 are
+the same thing, but they're not. There are more Unicode encodings, but much of
+the world has standardized on UTF-8.
+
+UTF-8 treats the first 128 codepoints, 0..127, the same as ASCII. They take
+only one byte per character. All other characters are encoded as two or more
+(up to six) bytes using a complex scheme. Fortunately, Perl handles this for
+us, so we don't have to worry about this.
+
+=head3 Text strings (character strings)
+
+B<Text strings>, or B<character strings> are made of characters. Bytes are
+irrelevant here, and so are encodings. Each character is just that: the
+character.
+
+Text strings are also called B<Unicode strings>, because in Perl, every text
+string is a Unicode string.
+
+On a text string, you would do things like:
+
+ $text =~ s/foo/bar/;
+ if ($string =~ /^\d+$/) { ... }
+ $text = ucfirst $text;
+ my $character_count = length $text;
+
+The value of a character (C<ord>, C<chr>) is the corresponding Unicode code
+point.
+
+=head3 Binary strings (byte strings)
+
+B<Binary strings>, or B<byte strings> are made of bytes. Here, you don't have
+characters, just bytes. All communication with the outside world (anything
+outside of your current Perl process) is done in binary.
+
+On a binary string, you would do things like:
+
+ my (@length_content) = unpack "(V/a)*", $binary;
+ $binary =~ s/\x00\x0F/\xFF\xF0/; # for the brave :)
+ print {$fh} $binary;
+ my $byte_count = length $binary;
+
+=head3 Encoding
+
+B<Encoding> (as a verb) is the conversion from I<text> to I<binary>. To encode,
+you have to supply the target encoding, for example C<iso-8859-1> or C<UTF-8>.
+Some encodings, like the C<iso-8859> ("latin") range, do not support the full
+Unicode standard; characters that can't be represented are lost in the
+conversion.
+
+=head3 Decoding
+
+B<Decoding> is the conversion from I<binary> to I<text>. To decode, you have to
+know what encoding was used during the encoding phase. And most of all, it must
+be something decodable. It doesn't make much sense to decode a PNG image into a
+text string.
+
+=head3 Internal format
+
+Perl has an B<internal format>, an encoding that it uses to encode text strings
+so it can store them in memory. All text strings are in this internal format.
+In fact, text strings are never in any other format!
+
+You shouldn't worry about what this format is, because conversion is
+automatically done when you decode or encode.
+
+=head2 Your new toolkit
+
+Add to your standard heading the following line:
+
+ use Encode qw(encode decode);
+
+Or, if you're lazy, just:
+
+ use Encode;
+
+=head2 I/O flow (the actual 5 minute tutorial)
+
+The typical input/output flow of a program is:
+
+ 1. Receive and decode
+ 2. Process
+ 3. Encode and output
+
+If your input is binary, and is supposed to remain binary, you shouldn't decode
+it to a text string, of course. But in all other cases, you should decode it.
+
+Decoding can't happen reliably if you don't know how the data was encoded. If
+you get to choose, it's a good idea to standardize on UTF-8.
+
+ my $foo = decode('UTF-8', get 'http://example.com/');
+ my $bar = decode('ISO-8859-1', readline STDIN);
+ my $xyzzy = decode('Windows-1251', $cgi->param('foo'));
+
+Processing happens as you knew before. The only difference is that you're now
+using characters instead of bytes. That's very useful if you use things like
+C<substr>, or C<length>.
+
+It's important to realize that there are no bytes in a text string. Of course,
+Perl has its internal encoding to store the string in memory, but ignore that.
+If you have to do anything with the number of bytes, it's probably best to move
+that part to step 3, just after you've encoded the string. Then you know
+exactly how many bytes it will be in the destination string.
+
+The syntax for encoding text strings to binary strings is as simple as decoding:
+
+ $body = encode('UTF-8', $body);
+
+If you needed to know the length of the string in bytes, now's the perfect time
+for that. Because C<$body> is now a byte string, C<length> will report the
+number of bytes, instead of the number of characters. The number of
+characters is no longer known, because characters only exist in text strings.
+
+ my $byte_count = length $body;
+
+And if the protocol you're using supports a way of letting the recipient know
+which character encoding you used, please help the receiving end by using that
+feature! For example, E-mail and HTTP support MIME headers, so you can use the
+C<Content-Type> header. They can also have C<Content-Length> to indicate the
+number of I<bytes>, which is always a good idea to supply if the number is
+known.
+
+ "Content-Type: text/plain; charset=UTF-8",
+ "Content-Length: $byte_count"
+
+=head1 SUMMARY
+
+Decode everything you receive, encode everything you send out. (If it's text
+data.)
+
+=head1 Q and A (or FAQ)
+
+After reading this document, you ought to read L<perlunifaq> too.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Johan Vromans from Squirrel Consultancy. His UTF-8 rants during the
+Amsterdam Perl Mongers meetings got me interested and determined to find out
+how to use character encodings in Perl in ways that don't break easily.
+
+Thanks to Gerard Goossen from TTY. His presentation "UTF-8 in the wild" (Dutch
+Perl Workshop 2006) inspired me to publish my thoughts and write this tutorial.
+
+Thanks to the people who asked about this kind of stuff in several Perl IRC
+channels, and have constantly reminded me that a simpler explanation was
+needed.
+
+Thanks to the people who reviewed this document for me, before it went public.
+They are: Benjamin Smith, Jan-Pieter Cornet, Johan Vromans, Lukas Mai, Nathan
+Gray.
+
+=head1 AUTHOR
+
+Juerd Waalboer <#####@juerd.nl>
+
+=head1 SEE ALSO
+
+L<perlunifaq>, L<perlunicode>, L<perluniintro>, L<Encode>
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlutil.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlutil.pod
new file mode 100755
index 00000000000..e67ec1c23ea
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlutil.pod
@@ -0,0 +1,309 @@
+=head1 NAME
+
+perlutil - utilities packaged with the Perl distribution
+
+=head1 DESCRIPTION
+
+Along with the Perl interpreter itself, the Perl distribution installs a
+range of utilities on your system. There are also several utilities
+which are used by the Perl distribution itself as part of the install
+process. This document exists to list all of these utilities, explain
+what they are for and provide pointers to each module's documentation,
+if appropriate.
+
+=head1 LIST OF UTILITIES
+
+=head2 Documentation
+
+=over 3
+
+=item L<perldoc|perldoc>
+
+The main interface to Perl's documentation is C<perldoc>, although
+if you're reading this, it's more than likely that you've already found
+it. F<perldoc> will extract and format the documentation from any file
+in the current directory, any Perl module installed on the system, or
+any of the standard documentation pages, such as this one. Use
+C<perldoc E<lt>nameE<gt>> to get information on any of the utilities
+described in this document.
+
+=item L<pod2man|pod2man> and L<pod2text|pod2text>
+
+If it's run from a terminal, F<perldoc> will usually call F<pod2man> to
+translate POD (Plain Old Documentation - see L<perlpod> for an
+explanation) into a manpage, and then run F<man> to display it; if
+F<man> isn't available, F<pod2text> will be used instead and the output
+piped through your favourite pager.
+
+=item L<pod2html|pod2html> and L<pod2latex|pod2latex>
+
+As well as these two, there are two other converters: F<pod2html> will
+produce HTML pages from POD, and F<pod2latex>, which produces LaTeX
+files.
+
+=item L<pod2usage|pod2usage>
+
+If you just want to know how to use the utilities described here,
+F<pod2usage> will just extract the "USAGE" section; some of
+the utilities will automatically call F<pod2usage> on themselves when
+you call them with C<-help>.
+
+=item L<podselect|podselect>
+
+F<pod2usage> is a special case of F<podselect>, a utility to extract
+named sections from documents written in POD. For instance, while
+utilities have "USAGE" sections, Perl modules usually have "SYNOPSIS"
+sections: C<podselect -s "SYNOPSIS" ...> will extract this section for
+a given file.
+
+=item L<podchecker|podchecker>
+
+If you're writing your own documentation in POD, the F<podchecker>
+utility will look for errors in your markup.
+
+=item L<splain|splain>
+
+F<splain> is an interface to L<perldiag> - paste in your error message
+to it, and it'll explain it for you.
+
+=item L<roffitall|roffitall>
+
+The C<roffitall> utility is not installed on your system but lives in
+the F<pod/> directory of your Perl source kit; it converts all the
+documentation from the distribution to F<*roff> format, and produces a
+typeset PostScript or text file of the whole lot.
+
+=back
+
+=head2 Convertors
+
+To help you convert legacy programs to Perl, we've included three
+conversion filters:
+
+=over 3
+
+=item L<a2p|a2p>
+
+F<a2p> converts F<awk> scripts to Perl programs; for example, C<a2p -F:>
+on the simple F<awk> script C<{print $2}> will produce a Perl program
+based around this code:
+
+ while (<>) {
+ ($Fld1,$Fld2) = split(/[:\n]/, $_, 9999);
+ print $Fld2;
+ }
+
+=item L<s2p|s2p> and L<psed>
+
+Similarly, F<s2p> converts F<sed> scripts to Perl programs. F<s2p> run
+on C<s/foo/bar> will produce a Perl program based around this:
+
+ while (<>) {
+ chomp;
+ s/foo/bar/g;
+ print if $printit;
+ }
+
+When invoked as F<psed>, it behaves as a F<sed> implementation, written in
+Perl.
+
+=item L<find2perl|find2perl>
+
+Finally, F<find2perl> translates C<find> commands to Perl equivalents which
+use the L<File::Find|File::Find> module. As an example,
+C<find2perl . -user root -perm 4000 -print> produces the following callback
+subroutine for C<File::Find>:
+
+ sub wanted {
+ my ($dev,$ino,$mode,$nlink,$uid,$gid);
+ (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
+ $uid == $uid{'root'}) &&
+ (($mode & 0777) == 04000);
+ print("$name\n");
+ }
+
+=back
+
+As well as these filters for converting other languages, the
+L<pl2pm|pl2pm> utility will help you convert old-style Perl 4 libraries to
+new-style Perl5 modules.
+
+=head2 Administration
+
+=over 3
+
+=item L<config_data|config_data>
+
+Query or change configuration of Perl modules that use Module::Build-based
+configuration files for features and config data.
+
+=item L<libnetcfg|libnetcfg>
+
+To display and change the libnet configuration run the libnetcfg command.
+
+=item L<perlivp>
+
+The F<perlivp> program is set up at Perl source code build time to test
+the Perl version it was built under. It can be used after running C<make
+install> (or your platform's equivalent procedure) to verify that perl
+and its libraries have been installed correctly.
+
+=back
+
+=head2 Development
+
+There are a set of utilities which help you in developing Perl programs,
+and in particular, extending Perl with C.
+
+=over 3
+
+=item L<perlbug|perlbug>
+
+F<perlbug> is the recommended way to report bugs in the perl interpreter
+itself or any of the standard library modules back to the developers;
+please read through the documentation for F<perlbug> thoroughly before
+using it to submit a bug report.
+
+=item L<perlthanks|perlthanks>
+
+This program provides an easy way to send a thank-you message back to the
+authors and maintainers of perl. It's just F<perlbug> installed under
+another name.
+
+=item L<h2ph|h2ph>
+
+Back before Perl had the XS system for connecting with C libraries,
+programmers used to get library constants by reading through the C
+header files. You may still see C<require 'syscall.ph'> or similar
+around - the F<.ph> file should be created by running F<h2ph> on the
+corresponding F<.h> file. See the F<h2ph> documentation for more on how
+to convert a whole bunch of header files at once.
+
+=item L<c2ph|c2ph> and L<pstruct|pstruct>
+
+F<c2ph> and F<pstruct>, which are actually the same program but behave
+differently depending on how they are called, provide another way of
+getting at C with Perl - they'll convert C structures and union declarations
+to Perl code. This is deprecated in favour of F<h2xs> these days.
+
+=item L<h2xs|h2xs>
+
+F<h2xs> converts C header files into XS modules, and will try and write
+as much glue between C libraries and Perl modules as it can. It's also
+very useful for creating skeletons of pure Perl modules.
+
+=item L<enc2xs>
+
+F<enc2xs> builds a Perl extension for use by Encode from either
+Unicode Character Mapping files (.ucm) or Tcl Encoding Files (.enc).
+Besides being used internally during the build process of the Encode
+module, you can use F<enc2xs> to add your own encoding to perl.
+No knowledge of XS is necessary.
+
+=item L<xsubpp>
+
+F<xsubpp> is a compiler to convert Perl XS code into C code.
+It is typically run by the makefiles created by L<ExtUtils::MakeMaker>.
+
+F<xsubpp> will compile XS code into C code by embedding the constructs
+necessary to let C functions manipulate Perl values and creates the glue
+necessary to let Perl access those functions.
+
+=item L<dprofpp|dprofpp>
+
+Perl comes with a profiler, the F<Devel::DProf> module. The
+F<dprofpp> utility analyzes the output of this profiler and tells you
+which subroutines are taking up the most run time. See L<Devel::DProf>
+for more information.
+
+=item L<prove>
+
+F<prove> is a command-line interface to the test-running functionality of
+of F<Test::Harness>. It's an alternative to C<make test>.
+
+=item L<corelist>
+
+A command-line front-end to C<Module::CoreList>, to query what modules
+were shipped with given versions of perl.
+
+=back
+
+=head2 General tools
+
+A few general-purpose tools are shipped with perl, mostly because they
+came along modules included in the perl distribution.
+
+=over 3
+
+=item L<piconv>
+
+B<piconv> is a Perl version of B<iconv>, a character encoding converter
+widely available for various Unixen today. This script was primarily a
+technology demonstrator for Perl 5.8.0, but you can use piconv in the
+place of iconv for virtually any case.
+
+=item L<ptar>
+
+F<ptar> is a tar-like program, written in pure Perl.
+
+=item L<ptardiff>
+
+F<ptardiff> is a small utility that produces a diff between an extracted
+archive and an unextracted one. (Note that this utility requires the
+C<Text::Diff> module to function properly; this module isn't distributed
+with perl, but is available from the CPAN.)
+
+=item L<shasum>
+
+This utility, that comes with the C<Digest::SHA> module, is used to print
+or verify SHA checksums.
+
+=back
+
+=head2 Installation
+
+These utilities help manage extra Perl modules that don't come with the perl
+distribution.
+
+=over 3
+
+=item L<cpan>
+
+F<cpan> is a command-line interface to CPAN.pm. It allows you to install
+modules or distributions from CPAN, or just get information about them, and
+a lot more. It is similar to the command line mode of the L<CPAN> module,
+
+ perl -MCPAN -e shell
+
+=item L<cpanp>
+
+F<cpanp> is, like F<cpan>, a command-line interface to the CPAN, using
+the C<CPANPLUS> module as a back-end. It can be used interactively or
+imperatively.
+
+=item L<cpan2dist>
+
+F<cpan2dist> is a tool to create distributions (or packages) from CPAN
+modules, then suitable for your package manager of choice. Support for
+specific formats are available from CPAN as C<CPANPLUS::Dist::*> modules.
+
+=item L<instmodsh>
+
+A little interface to ExtUtils::Installed to examine installed modules,
+validate your packlists and even create a tarball from an installed module.
+
+=back
+
+=head1 SEE ALSO
+
+L<perldoc|perldoc>, L<pod2man|pod2man>, L<perlpod>,
+L<pod2html|pod2html>, L<pod2usage|pod2usage>, L<podselect|podselect>,
+L<podchecker|podchecker>, L<splain|splain>, L<perldiag>,
+L<roffitall|roffitall>, L<a2p|a2p>, L<s2p|s2p>, L<find2perl|find2perl>,
+L<File::Find|File::Find>, L<pl2pm|pl2pm>, L<perlbug|perlbug>,
+L<h2ph|h2ph>, L<c2ph|c2ph>, L<h2xs|h2xs>, L<dprofpp|dprofpp>,
+L<Devel::DProf>, L<enc2xs>, L<xsubpp>, L<cpan>, L<cpanp>, L<cpan2dist>,
+L<instmodsh>, L<piconv>, L<prove>, L<corelist>, L<ptar>, L<ptardiff>,
+L<shasum>
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perluts.pod b/Master/tlpkg/tlperl.straw/lib/pods/perluts.pod
new file mode 100755
index 00000000000..2025e37ef7a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perluts.pod
@@ -0,0 +1,107 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+perluts - Perl under UTS
+
+=head1 SYNOPSIS
+
+This document can be read I<as is>: as F<README.uts>, or you
+can read it after you build your package using "man perluts".
+
+The purpose is to help you build Perl for UTS, which, if you
+follow these instructions, should be easy, and result in
+a solidly working installation.
+
+=head1 DESCRIPTION
+
+Perl 5.7.2 (Developmental) or Perl 5.8.x (forthcoming) for UTS
+
+=head1 BUILDING PERL ON UTS
+
+NOTE: Some sites have redefined the way uname works, and if yours
+does this, special steps must be taken so that Configure can
+recognize your system as a UTS system. To see if you are in
+this category, issue the command "uname -a". It should look
+something like:
+
+ uts juno 4 4.4 9672 370
+
+At any rate, the first field should be "uts". If this is not
+the case; supposing it is, say telcoUTS, create a script, uts/uname
+(i.e. uname, in the subdirectory "uts" of the main Perl source dir):
+ # uname
+ /usr/bin/uname "$@" | sed -e 's/^telcoUTS/uts/'
+
+and when you execute Configure, do it as below, except for adding
+PATH=uts:$PATH as a prefix. I.e. do:
+
+ PATH=uts:$PATH ./Configure ...
+
+There is no need to do an interactive configure, just type
+
+ ./Configure -de [-Dusedevel] [-Doptimize=-g ] 2>&1 | tee Conf.out
+
+"-Dusedevel" may be required to configure Perl 5.7.2 non-interactively.
+Use -Doptimize=-g if you want to run Perl under sdb or gdb, OR
+if you want to be able to use the -D command line flags to perl,
+which are occasionally useful in debugging perl scripts.
+
+In this and the following steps, the "2>&1 | tee XXX.out" records all
+output from the process, which will be useful if anything unexpected
+goes wrong.
+
+Then do the compilation with
+
+ make 2>&1 | tee make.out
+
+Finally, test using
+
+ make test 2>&1 | tee make-test.out
+
+In the output, the only failures you should see should look like:
+
+ lib/Math/BigInt/t/bigfltpm.........Use of uninitialized value ...
+ FAILED at test 57
+ lib/Math/BigInt/t/bigintc..........ok
+ lib/Math/BigInt/t/bigintpm.........FAILED at test 204
+ lib/Math/BigInt/t/mbimbf...........Use of uninitialized value ...
+ Illegal division by zero at ../lib/Math/BigInt/Calc.pm line 314.
+ FAILED at test 71
+ lib/Math/Complex...................exp: OVERFLOW
+ FAILED at test 250
+ lib/Math/Trig......................exp: OVERFLOW
+ ok
+ lib/Memoize/t/array................ok
+ ...
+ lib/Net/protoent...................ok
+ lib/Net/servent....................FAILED at test 0
+
+This means that everything passes except for some problems in the
+packages "Math::BigInt", "Math::Complex", and "Math::Trig".
+The lib/Net/servent failure seems to be a bug in the test
+program. To confirm this, from the main Perl source dir, do:
+
+ LD_LIBRARY_PATH=`pwd` ./perl -Ilib lib/Net/servent.t
+
+and it should output
+
+ 1..3
+ ok 1
+ ok 2
+ ok 3
+
+=head1 Installing the built perl on UTS
+
+Run the command "make install"
+
+=head1 AUTHOR
+
+ Hal Morris
+ UTS Global LLC
+ email: hom00@utsglobal.com
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlvar.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlvar.pod
new file mode 100755
index 00000000000..914eebe2b3b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlvar.pod
@@ -0,0 +1,1737 @@
+=head1 NAME
+
+perlvar - Perl predefined variables
+
+=head1 DESCRIPTION
+
+=head2 Predefined Names
+
+The following names have special meaning to Perl. Most
+punctuation names have reasonable mnemonics, or analogs in the
+shells. Nevertheless, if you wish to use long variable names,
+you need only say
+
+ use English;
+
+at the top of your program. This aliases all the short names to the long
+names in the current package. Some even have medium names, generally
+borrowed from B<awk>. In general, it's best to use the
+
+ use English '-no_match_vars';
+
+invocation if you don't need $PREMATCH, $MATCH, or $POSTMATCH, as it avoids
+a certain performance hit with the use of regular expressions. See
+L<English>.
+
+Variables that depend on the currently selected filehandle may be set by
+calling an appropriate object method on the IO::Handle object, although
+this is less efficient than using the regular built-in variables. (Summary
+lines below for this contain the word HANDLE.) First you must say
+
+ use IO::Handle;
+
+after which you may use either
+
+ method HANDLE EXPR
+
+or more safely,
+
+ HANDLE->method(EXPR)
+
+Each method returns the old value of the IO::Handle attribute.
+The methods each take an optional EXPR, which, if supplied, specifies the
+new value for the IO::Handle attribute in question. If not supplied,
+most methods do nothing to the current value--except for
+autoflush(), which will assume a 1 for you, just to be different.
+
+Because loading in the IO::Handle class is an expensive operation, you should
+learn how to use the regular built-in variables.
+
+A few of these variables are considered "read-only". This means that if
+you try to assign to this variable, either directly or indirectly through
+a reference, you'll raise a run-time exception.
+
+You should be very careful when modifying the default values of most
+special variables described in this document. In most cases you want
+to localize these variables before changing them, since if you don't,
+the change may affect other modules which rely on the default values
+of the special variables that you have changed. This is one of the
+correct ways to read the whole file at once:
+
+ open my $fh, "<", "foo" or die $!;
+ local $/; # enable localized slurp mode
+ my $content = <$fh>;
+ close $fh;
+
+But the following code is quite bad:
+
+ open my $fh, "<", "foo" or die $!;
+ undef $/; # enable slurp mode
+ my $content = <$fh>;
+ close $fh;
+
+since some other module, may want to read data from some file in the
+default "line mode", so if the code we have just presented has been
+executed, the global value of C<$/> is now changed for any other code
+running inside the same Perl interpreter.
+
+Usually when a variable is localized you want to make sure that this
+change affects the shortest scope possible. So unless you are already
+inside some short C<{}> block, you should create one yourself. For
+example:
+
+ my $content = '';
+ open my $fh, "<", "foo" or die $!;
+ {
+ local $/;
+ $content = <$fh>;
+ }
+ close $fh;
+
+Here is an example of how your own code can go broken:
+
+ for (1..5){
+ nasty_break();
+ print "$_ ";
+ }
+ sub nasty_break {
+ $_ = 5;
+ # do something with $_
+ }
+
+You probably expect this code to print:
+
+ 1 2 3 4 5
+
+but instead you get:
+
+ 5 5 5 5 5
+
+Why? Because nasty_break() modifies C<$_> without localizing it
+first. The fix is to add local():
+
+ local $_ = 5;
+
+It's easy to notice the problem in such a short example, but in more
+complicated code you are looking for trouble if you don't localize
+changes to the special variables.
+
+The following list is ordered by scalar variables first, then the
+arrays, then the hashes.
+
+=over 8
+
+=item $ARG
+
+=item $_
+X<$_> X<$ARG>
+
+The default input and pattern-searching space. The following pairs are
+equivalent:
+
+ while (<>) {...} # equivalent only in while!
+ while (defined($_ = <>)) {...}
+
+ /^Subject:/
+ $_ =~ /^Subject:/
+
+ tr/a-z/A-Z/
+ $_ =~ tr/a-z/A-Z/
+
+ chomp
+ chomp($_)
+
+Here are the places where Perl will assume $_ even if you
+don't use it:
+
+=over 3
+
+=item *
+
+The following functions:
+
+abs, alarm, chomp, chop, chr, chroot, cos, defined, eval, exp, glob,
+hex, int, lc, lcfirst, length, log, lstat, mkdir, oct, ord, pos, print,
+quotemeta, readlink, readpipe, ref, require, reverse (in scalar context only),
+rmdir, sin, split (on its second argument), sqrt, stat, study, uc, ucfirst,
+unlink, unpack.
+
+=item *
+
+All file tests (C<-f>, C<-d>) except for C<-t>, which defaults to STDIN.
+See L<perlfunc/-X>
+
+
+=item *
+
+The pattern matching operations C<m//>, C<s///> and C<tr///> (aka C<y///>)
+when used without an C<=~> operator.
+
+=item *
+
+The default iterator variable in a C<foreach> loop if no other
+variable is supplied.
+
+=item *
+
+The implicit iterator variable in the grep() and map() functions.
+
+=item *
+
+The implicit variable of given().
+
+=item *
+
+The default place to put an input record when a C<< <FH> >>
+operation's result is tested by itself as the sole criterion of a C<while>
+test. Outside a C<while> test, this will not happen.
+
+=back
+
+As C<$_> is a global variable, this may lead in some cases to unwanted
+side-effects. As of perl 5.9.1, you can now use a lexical version of
+C<$_> by declaring it in a file or in a block with C<my>. Moreover,
+declaring C<our $_> restores the global C<$_> in the current scope.
+
+(Mnemonic: underline is understood in certain operations.)
+
+=back
+
+=over 8
+
+=item $a
+
+=item $b
+X<$a> X<$b>
+
+Special package variables when using sort(), see L<perlfunc/sort>.
+Because of this specialness $a and $b don't need to be declared
+(using use vars, or our()) even when using the C<strict 'vars'> pragma.
+Don't lexicalize them with C<my $a> or C<my $b> if you want to be
+able to use them in the sort() comparison block or function.
+
+=back
+
+=over 8
+
+=item $<I<digits>>
+X<$1> X<$2> X<$3>
+
+Contains the subpattern from the corresponding set of capturing
+parentheses from the last pattern match, not counting patterns
+matched in nested blocks that have been exited already. (Mnemonic:
+like \digits.) These variables are all read-only and dynamically
+scoped to the current BLOCK.
+
+=item $MATCH
+
+=item $&
+X<$&> X<$MATCH>
+
+The string matched by the last successful pattern match (not counting
+any matches hidden within a BLOCK or eval() enclosed by the current
+BLOCK). (Mnemonic: like & in some editors.) This variable is read-only
+and dynamically scoped to the current BLOCK.
+
+The use of this variable anywhere in a program imposes a considerable
+performance penalty on all regular expression matches. See L</BUGS>.
+
+See L</@-> for a replacement.
+
+=item ${^MATCH}
+X<${^MATCH}>
+
+This is similar to C<$&> (C<$MATCH>) except that it does not incur the
+performance penalty associated with that variable, and is only guaranteed
+to return a defined value when the pattern was compiled or executed with
+the C</p> modifier.
+
+=item $PREMATCH
+
+=item $`
+X<$`> X<$PREMATCH>
+
+The string preceding whatever was matched by the last successful
+pattern match (not counting any matches hidden within a BLOCK or eval
+enclosed by the current BLOCK). (Mnemonic: C<`> often precedes a quoted
+string.) This variable is read-only.
+
+The use of this variable anywhere in a program imposes a considerable
+performance penalty on all regular expression matches. See L</BUGS>.
+
+See L</@-> for a replacement.
+
+=item ${^PREMATCH}
+X<${^PREMATCH}>
+
+This is similar to C<$`> ($PREMATCH) except that it does not incur the
+performance penalty associated with that variable, and is only guaranteed
+to return a defined value when the pattern was compiled or executed with
+the C</p> modifier.
+
+=item $POSTMATCH
+
+=item $'
+X<$'> X<$POSTMATCH>
+
+The string following whatever was matched by the last successful
+pattern match (not counting any matches hidden within a BLOCK or eval()
+enclosed by the current BLOCK). (Mnemonic: C<'> often follows a quoted
+string.) Example:
+
+ local $_ = 'abcdefghi';
+ /def/;
+ print "$`:$&:$'\n"; # prints abc:def:ghi
+
+This variable is read-only and dynamically scoped to the current BLOCK.
+
+The use of this variable anywhere in a program imposes a considerable
+performance penalty on all regular expression matches. See L</BUGS>.
+
+See L</@-> for a replacement.
+
+=item ${^POSTMATCH}
+X<${^POSTMATCH}>
+
+This is similar to C<$'> (C<$POSTMATCH>) except that it does not incur the
+performance penalty associated with that variable, and is only guaranteed
+to return a defined value when the pattern was compiled or executed with
+the C</p> modifier.
+
+=item $LAST_PAREN_MATCH
+
+=item $+
+X<$+> X<$LAST_PAREN_MATCH>
+
+The text matched by the last bracket of the last successful search pattern.
+This is useful if you don't know which one of a set of alternative patterns
+matched. For example:
+
+ /Version: (.*)|Revision: (.*)/ && ($rev = $+);
+
+(Mnemonic: be positive and forward looking.)
+This variable is read-only and dynamically scoped to the current BLOCK.
+
+=item $LAST_SUBMATCH_RESULT
+
+=item $^N
+X<$^N>
+
+The text matched by the used group most-recently closed (i.e. the group
+with the rightmost closing parenthesis) of the last successful search
+pattern. (Mnemonic: the (possibly) Nested parenthesis that most
+recently closed.)
+
+This is primarily used inside C<(?{...})> blocks for examining text
+recently matched. For example, to effectively capture text to a variable
+(in addition to C<$1>, C<$2>, etc.), replace C<(...)> with
+
+ (?:(...)(?{ $var = $^N }))
+
+By setting and then using C<$var> in this way relieves you from having to
+worry about exactly which numbered set of parentheses they are.
+
+This variable is dynamically scoped to the current BLOCK.
+
+=item @LAST_MATCH_END
+
+=item @+
+X<@+> X<@LAST_MATCH_END>
+
+This array holds the offsets of the ends of the last successful
+submatches in the currently active dynamic scope. C<$+[0]> is
+the offset into the string of the end of the entire match. This
+is the same value as what the C<pos> function returns when called
+on the variable that was matched against. The I<n>th element
+of this array holds the offset of the I<n>th submatch, so
+C<$+[1]> is the offset past where $1 ends, C<$+[2]> the offset
+past where $2 ends, and so on. You can use C<$#+> to determine
+how many subgroups were in the last successful match. See the
+examples given for the C<@-> variable.
+
+=item %LAST_PAREN_MATCH
+
+=item %+
+X<%+>
+
+Similar to C<@+>, the C<%+> hash allows access to the named capture
+buffers, should they exist, in the last successful match in the
+currently active dynamic scope.
+
+For example, C<$+{foo}> is equivalent to C<$1> after the following match:
+
+ 'foo' =~ /(?<foo>foo)/;
+
+The keys of the C<%+> hash list only the names of buffers that have
+captured (and that are thus associated to defined values).
+
+The underlying behaviour of C<%+> is provided by the
+L<Tie::Hash::NamedCapture> module.
+
+B<Note:> C<%-> and C<%+> are tied views into a common internal hash
+associated with the last successful regular expression. Therefore mixing
+iterative access to them via C<each> may have unpredictable results.
+Likewise, if the last successful match changes, then the results may be
+surprising.
+
+=item HANDLE->input_line_number(EXPR)
+
+=item $INPUT_LINE_NUMBER
+
+=item $NR
+
+=item $.
+X<$.> X<$NR> X<$INPUT_LINE_NUMBER> X<line number>
+
+Current line number for the last filehandle accessed.
+
+Each filehandle in Perl counts the number of lines that have been read
+from it. (Depending on the value of C<$/>, Perl's idea of what
+constitutes a line may not match yours.) When a line is read from a
+filehandle (via readline() or C<< <> >>), or when tell() or seek() is
+called on it, C<$.> becomes an alias to the line counter for that
+filehandle.
+
+You can adjust the counter by assigning to C<$.>, but this will not
+actually move the seek pointer. I<Localizing C<$.> will not localize
+the filehandle's line count>. Instead, it will localize perl's notion
+of which filehandle C<$.> is currently aliased to.
+
+C<$.> is reset when the filehandle is closed, but B<not> when an open
+filehandle is reopened without an intervening close(). For more
+details, see L<perlop/"IE<sol>O Operators">. Because C<< <> >> never does
+an explicit close, line numbers increase across ARGV files (but see
+examples in L<perlfunc/eof>).
+
+You can also use C<< HANDLE->input_line_number(EXPR) >> to access the
+line counter for a given filehandle without having to worry about
+which handle you last accessed.
+
+(Mnemonic: many programs use "." to mean the current line number.)
+
+=item IO::Handle->input_record_separator(EXPR)
+
+=item $INPUT_RECORD_SEPARATOR
+
+=item $RS
+
+=item $/
+X<$/> X<$RS> X<$INPUT_RECORD_SEPARATOR>
+
+The input record separator, newline by default. This
+influences Perl's idea of what a "line" is. Works like B<awk>'s RS
+variable, including treating empty lines as a terminator if set to
+the null string. (An empty line cannot contain any spaces
+or tabs.) You may set it to a multi-character string to match a
+multi-character terminator, or to C<undef> to read through the end
+of file. Setting it to C<"\n\n"> means something slightly
+different than setting to C<"">, if the file contains consecutive
+empty lines. Setting to C<""> will treat two or more consecutive
+empty lines as a single empty line. Setting to C<"\n\n"> will
+blindly assume that the next input character belongs to the next
+paragraph, even if it's a newline. (Mnemonic: / delimits
+line boundaries when quoting poetry.)
+
+ local $/; # enable "slurp" mode
+ local $_ = <FH>; # whole file now here
+ s/\n[ \t]+/ /g;
+
+Remember: the value of C<$/> is a string, not a regex. B<awk> has to be
+better for something. :-)
+
+Setting C<$/> to a reference to an integer, scalar containing an integer, or
+scalar that's convertible to an integer will attempt to read records
+instead of lines, with the maximum record size being the referenced
+integer. So this:
+
+ local $/ = \32768; # or \"32768", or \$var_containing_32768
+ open my $fh, "<", $myfile or die $!;
+ local $_ = <$fh>;
+
+will read a record of no more than 32768 bytes from FILE. If you're
+not reading from a record-oriented file (or your OS doesn't have
+record-oriented files), then you'll likely get a full chunk of data
+with every read. If a record is larger than the record size you've
+set, you'll get the record back in pieces. Trying to set the record
+size to zero or less will cause reading in the (rest of the) whole file.
+
+On VMS, record reads are done with the equivalent of C<sysread>,
+so it's best not to mix record and non-record reads on the same
+file. (This is unlikely to be a problem, because any file you'd
+want to read in record mode is probably unusable in line mode.)
+Non-VMS systems do normal I/O, so it's safe to mix record and
+non-record reads of a file.
+
+See also L<perlport/"Newlines">. Also see C<$.>.
+
+=item HANDLE->autoflush(EXPR)
+
+=item $OUTPUT_AUTOFLUSH
+
+=item $|
+X<$|> X<autoflush> X<flush> X<$OUTPUT_AUTOFLUSH>
+
+If set to nonzero, forces a flush right away and after every write
+or print on the currently selected output channel. Default is 0
+(regardless of whether the channel is really buffered by the
+system or not; C<$|> tells you only whether you've asked Perl
+explicitly to flush after each write). STDOUT will
+typically be line buffered if output is to the terminal and block
+buffered otherwise. Setting this variable is useful primarily when
+you are outputting to a pipe or socket, such as when you are running
+a Perl program under B<rsh> and want to see the output as it's
+happening. This has no effect on input buffering. See L<perlfunc/getc>
+for that. See L<perldoc/select> on how to select the output channel.
+See also L<IO::Handle>. (Mnemonic: when you want your pipes to be piping hot.)
+
+=item IO::Handle->output_field_separator EXPR
+
+=item $OUTPUT_FIELD_SEPARATOR
+
+=item $OFS
+
+=item $,
+X<$,> X<$OFS> X<$OUTPUT_FIELD_SEPARATOR>
+
+The output field separator for the print operator. If defined, this
+value is printed between each of print's arguments. Default is C<undef>.
+(Mnemonic: what is printed when there is a "," in your print statement.)
+
+=item IO::Handle->output_record_separator EXPR
+
+=item $OUTPUT_RECORD_SEPARATOR
+
+=item $ORS
+
+=item $\
+X<$\> X<$ORS> X<$OUTPUT_RECORD_SEPARATOR>
+
+The output record separator for the print operator. If defined, this
+value is printed after the last of print's arguments. Default is C<undef>.
+(Mnemonic: you set C<$\> instead of adding "\n" at the end of the print.
+Also, it's just like C<$/>, but it's what you get "back" from Perl.)
+
+=item $LIST_SEPARATOR
+
+=item $"
+X<$"> X<$LIST_SEPARATOR>
+
+This is like C<$,> except that it applies to array and slice values
+interpolated into a double-quoted string (or similar interpreted
+string). Default is a space. (Mnemonic: obvious, I think.)
+
+=item $SUBSCRIPT_SEPARATOR
+
+=item $SUBSEP
+
+=item $;
+X<$;> X<$SUBSEP> X<SUBSCRIPT_SEPARATOR>
+
+The subscript separator for multidimensional array emulation. If you
+refer to a hash element as
+
+ $foo{$a,$b,$c}
+
+it really means
+
+ $foo{join($;, $a, $b, $c)}
+
+But don't put
+
+ @foo{$a,$b,$c} # a slice--note the @
+
+which means
+
+ ($foo{$a},$foo{$b},$foo{$c})
+
+Default is "\034", the same as SUBSEP in B<awk>. If your
+keys contain binary data there might not be any safe value for C<$;>.
+(Mnemonic: comma (the syntactic subscript separator) is a
+semi-semicolon. Yeah, I know, it's pretty lame, but C<$,> is already
+taken for something more important.)
+
+Consider using "real" multidimensional arrays as described
+in L<perllol>.
+
+=item HANDLE->format_page_number(EXPR)
+
+=item $FORMAT_PAGE_NUMBER
+
+=item $%
+X<$%> X<$FORMAT_PAGE_NUMBER>
+
+The current page number of the currently selected output channel.
+Used with formats.
+(Mnemonic: % is page number in B<nroff>.)
+
+=item HANDLE->format_lines_per_page(EXPR)
+
+=item $FORMAT_LINES_PER_PAGE
+
+=item $=
+X<$=> X<$FORMAT_LINES_PER_PAGE>
+
+The current page length (printable lines) of the currently selected
+output channel. Default is 60.
+Used with formats.
+(Mnemonic: = has horizontal lines.)
+
+=item HANDLE->format_lines_left(EXPR)
+
+=item $FORMAT_LINES_LEFT
+
+=item $-
+X<$-> X<$FORMAT_LINES_LEFT>
+
+The number of lines left on the page of the currently selected output
+channel.
+Used with formats.
+(Mnemonic: lines_on_page - lines_printed.)
+
+=item @LAST_MATCH_START
+
+=item @-
+X<@-> X<@LAST_MATCH_START>
+
+$-[0] is the offset of the start of the last successful match.
+C<$-[>I<n>C<]> is the offset of the start of the substring matched by
+I<n>-th subpattern, or undef if the subpattern did not match.
+
+Thus after a match against $_, $& coincides with C<substr $_, $-[0],
+$+[0] - $-[0]>. Similarly, $I<n> coincides with C<substr $_, $-[n],
+$+[n] - $-[n]> if C<$-[n]> is defined, and $+ coincides with
+C<substr $_, $-[$#-], $+[$#-] - $-[$#-]>. One can use C<$#-> to find the last
+matched subgroup in the last successful match. Contrast with
+C<$#+>, the number of subgroups in the regular expression. Compare
+with C<@+>.
+
+This array holds the offsets of the beginnings of the last
+successful submatches in the currently active dynamic scope.
+C<$-[0]> is the offset into the string of the beginning of the
+entire match. The I<n>th element of this array holds the offset
+of the I<n>th submatch, so C<$-[1]> is the offset where $1
+begins, C<$-[2]> the offset where $2 begins, and so on.
+
+After a match against some variable $var:
+
+=over 5
+
+=item C<$`> is the same as C<substr($var, 0, $-[0])>
+
+=item C<$&> is the same as C<substr($var, $-[0], $+[0] - $-[0])>
+
+=item C<$'> is the same as C<substr($var, $+[0])>
+
+=item C<$1> is the same as C<substr($var, $-[1], $+[1] - $-[1])>
+
+=item C<$2> is the same as C<substr($var, $-[2], $+[2] - $-[2])>
+
+=item C<$3> is the same as C<substr($var, $-[3], $+[3] - $-[3])>
+
+=back
+
+=item %-
+X<%->
+
+Similar to C<%+>, this variable allows access to the named capture buffers
+in the last successful match in the currently active dynamic scope. To
+each capture buffer name found in the regular expression, it associates a
+reference to an array containing the list of values captured by all
+buffers with that name (should there be several of them), in the order
+where they appear.
+
+Here's an example:
+
+ if ('1234' =~ /(?<A>1)(?<B>2)(?<A>3)(?<B>4)/) {
+ foreach my $bufname (sort keys %-) {
+ my $ary = $-{$bufname};
+ foreach my $idx (0..$#$ary) {
+ print "\$-{$bufname}[$idx] : ",
+ (defined($ary->[$idx]) ? "'$ary->[$idx]'" : "undef"),
+ "\n";
+ }
+ }
+ }
+
+would print out:
+
+ $-{A}[0] : '1'
+ $-{A}[1] : '3'
+ $-{B}[0] : '2'
+ $-{B}[1] : '4'
+
+The keys of the C<%-> hash correspond to all buffer names found in
+the regular expression.
+
+The behaviour of C<%-> is implemented via the
+L<Tie::Hash::NamedCapture> module.
+
+B<Note:> C<%-> and C<%+> are tied views into a common internal hash
+associated with the last successful regular expression. Therefore mixing
+iterative access to them via C<each> may have unpredictable results.
+Likewise, if the last successful match changes, then the results may be
+surprising.
+
+=item HANDLE->format_name(EXPR)
+
+=item $FORMAT_NAME
+
+=item $~
+X<$~> X<$FORMAT_NAME>
+
+The name of the current report format for the currently selected output
+channel. Default is the name of the filehandle. (Mnemonic: brother to
+C<$^>.)
+
+=item HANDLE->format_top_name(EXPR)
+
+=item $FORMAT_TOP_NAME
+
+=item $^
+X<$^> X<$FORMAT_TOP_NAME>
+
+The name of the current top-of-page format for the currently selected
+output channel. Default is the name of the filehandle with _TOP
+appended. (Mnemonic: points to top of page.)
+
+=item IO::Handle->format_line_break_characters EXPR
+
+=item $FORMAT_LINE_BREAK_CHARACTERS
+
+=item $:
+X<$:> X<FORMAT_LINE_BREAK_CHARACTERS>
+
+The current set of characters after which a string may be broken to
+fill continuation fields (starting with ^) in a format. Default is
+S<" \n-">, to break on whitespace or hyphens. (Mnemonic: a "colon" in
+poetry is a part of a line.)
+
+=item IO::Handle->format_formfeed EXPR
+
+=item $FORMAT_FORMFEED
+
+=item $^L
+X<$^L> X<$FORMAT_FORMFEED>
+
+What formats output as a form feed. Default is \f.
+
+=item $ACCUMULATOR
+
+=item $^A
+X<$^A> X<$ACCUMULATOR>
+
+The current value of the write() accumulator for format() lines. A format
+contains formline() calls that put their result into C<$^A>. After
+calling its format, write() prints out the contents of C<$^A> and empties.
+So you never really see the contents of C<$^A> unless you call
+formline() yourself and then look at it. See L<perlform> and
+L<perlfunc/formline()>.
+
+=item $CHILD_ERROR
+
+=item $?
+X<$?> X<$CHILD_ERROR>
+
+The status returned by the last pipe close, backtick (C<``>) command,
+successful call to wait() or waitpid(), or from the system()
+operator. This is just the 16-bit status word returned by the
+traditional Unix wait() system call (or else is made up to look like it). Thus, the
+exit value of the subprocess is really (C<<< $? >> 8 >>>), and
+C<$? & 127> gives which signal, if any, the process died from, and
+C<$? & 128> reports whether there was a core dump. (Mnemonic:
+similar to B<sh> and B<ksh>.)
+
+Additionally, if the C<h_errno> variable is supported in C, its value
+is returned via $? if any C<gethost*()> function fails.
+
+If you have installed a signal handler for C<SIGCHLD>, the
+value of C<$?> will usually be wrong outside that handler.
+
+Inside an C<END> subroutine C<$?> contains the value that is going to be
+given to C<exit()>. You can modify C<$?> in an C<END> subroutine to
+change the exit status of your program. For example:
+
+ END {
+ $? = 1 if $? == 255; # die would make it 255
+ }
+
+Under VMS, the pragma C<use vmsish 'status'> makes C<$?> reflect the
+actual VMS exit status, instead of the default emulation of POSIX
+status; see L<perlvms/$?> for details.
+
+Also see L<Error Indicators>.
+
+=item ${^CHILD_ERROR_NATIVE}
+X<$^CHILD_ERROR_NATIVE>
+
+The native status returned by the last pipe close, backtick (C<``>)
+command, successful call to wait() or waitpid(), or from the system()
+operator. On POSIX-like systems this value can be decoded with the
+WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WIFSTOPPED, WSTOPSIG
+and WIFCONTINUED functions provided by the L<POSIX> module.
+
+Under VMS this reflects the actual VMS exit status; i.e. it is the same
+as $? when the pragma C<use vmsish 'status'> is in effect.
+
+=item ${^ENCODING}
+X<$^ENCODING>
+
+The I<object reference> to the Encode object that is used to convert
+the source code to Unicode. Thanks to this variable your perl script
+does not have to be written in UTF-8. Default is I<undef>. The direct
+manipulation of this variable is highly discouraged.
+
+=item $OS_ERROR
+
+=item $ERRNO
+
+=item $!
+X<$!> X<$ERRNO> X<$OS_ERROR>
+
+If used numerically, yields the current value of the C C<errno>
+variable, or in other words, if a system or library call fails, it
+sets this variable. This means that the value of C<$!> is meaningful
+only I<immediately> after a B<failure>:
+
+ if (open my $fh, "<", $filename) {
+ # Here $! is meaningless.
+ ...
+ } else {
+ # ONLY here is $! meaningful.
+ ...
+ # Already here $! might be meaningless.
+ }
+ # Since here we might have either success or failure,
+ # here $! is meaningless.
+
+In the above I<meaningless> stands for anything: zero, non-zero,
+C<undef>. A successful system or library call does B<not> set
+the variable to zero.
+
+If used as a string, yields the corresponding system error string.
+You can assign a number to C<$!> to set I<errno> if, for instance,
+you want C<"$!"> to return the string for error I<n>, or you want
+to set the exit value for the die() operator. (Mnemonic: What just
+went bang?)
+
+Also see L<Error Indicators>.
+
+=item %OS_ERROR
+
+=item %ERRNO
+
+=item %!
+X<%!>
+
+Each element of C<%!> has a true value only if C<$!> is set to that
+value. For example, C<$!{ENOENT}> is true if and only if the current
+value of C<$!> is C<ENOENT>; that is, if the most recent error was
+"No such file or directory" (or its moral equivalent: not all operating
+systems give that exact error, and certainly not all languages).
+To check if a particular key is meaningful on your system, use
+C<exists $!{the_key}>; for a list of legal keys, use C<keys %!>.
+See L<Errno> for more information, and also see above for the
+validity of C<$!>.
+
+=item $EXTENDED_OS_ERROR
+
+=item $^E
+X<$^E> X<$EXTENDED_OS_ERROR>
+
+Error information specific to the current operating system. At
+the moment, this differs from C<$!> under only VMS, OS/2, and Win32
+(and for MacPerl). On all other platforms, C<$^E> is always just
+the same as C<$!>.
+
+Under VMS, C<$^E> provides the VMS status value from the last
+system error. This is more specific information about the last
+system error than that provided by C<$!>. This is particularly
+important when C<$!> is set to B<EVMSERR>.
+
+Under OS/2, C<$^E> is set to the error code of the last call to
+OS/2 API either via CRT, or directly from perl.
+
+Under Win32, C<$^E> always returns the last error information
+reported by the Win32 call C<GetLastError()> which describes
+the last error from within the Win32 API. Most Win32-specific
+code will report errors via C<$^E>. ANSI C and Unix-like calls
+set C<errno> and so most portable Perl code will report errors
+via C<$!>.
+
+Caveats mentioned in the description of C<$!> generally apply to
+C<$^E>, also. (Mnemonic: Extra error explanation.)
+
+Also see L<Error Indicators>.
+
+=item $EVAL_ERROR
+
+=item $@
+X<$@> X<$EVAL_ERROR>
+
+The Perl syntax error message from the last eval() operator.
+If $@ is the null string, the last eval() parsed and executed
+correctly (although the operations you invoked may have failed in the
+normal fashion). (Mnemonic: Where was the syntax error "at"?)
+
+Warning messages are not collected in this variable. You can,
+however, set up a routine to process warnings by setting C<$SIG{__WARN__}>
+as described below.
+
+Also see L<Error Indicators>.
+
+=item $PROCESS_ID
+
+=item $PID
+
+=item $$
+X<$$> X<$PID> X<$PROCESS_ID>
+
+The process number of the Perl running this script. You should
+consider this variable read-only, although it will be altered
+across fork() calls. (Mnemonic: same as shells.)
+
+Note for Linux users: on Linux, the C functions C<getpid()> and
+C<getppid()> return different values from different threads. In order to
+be portable, this behavior is not reflected by C<$$>, whose value remains
+consistent across threads. If you want to call the underlying C<getpid()>,
+you may use the CPAN module C<Linux::Pid>.
+
+=item $REAL_USER_ID
+
+=item $UID
+
+=item $<
+X<< $< >> X<$UID> X<$REAL_USER_ID>
+
+The real uid of this process. (Mnemonic: it's the uid you came I<from>,
+if you're running setuid.) You can change both the real uid and
+the effective uid at the same time by using POSIX::setuid(). Since
+changes to $< require a system call, check $! after a change attempt to
+detect any possible errors.
+
+=item $EFFECTIVE_USER_ID
+
+=item $EUID
+
+=item $>
+X<< $> >> X<$EUID> X<$EFFECTIVE_USER_ID>
+
+The effective uid of this process. Example:
+
+ $< = $>; # set real to effective uid
+ ($<,$>) = ($>,$<); # swap real and effective uid
+
+You can change both the effective uid and the real uid at the same
+time by using POSIX::setuid(). Changes to $> require a check to $!
+to detect any possible errors after an attempted change.
+
+(Mnemonic: it's the uid you went I<to>, if you're running setuid.)
+C<< $< >> and C<< $> >> can be swapped only on machines
+supporting setreuid().
+
+=item $REAL_GROUP_ID
+
+=item $GID
+
+=item $(
+X<$(> X<$GID> X<$REAL_GROUP_ID>
+
+The real gid of this process. If you are on a machine that supports
+membership in multiple groups simultaneously, gives a space separated
+list of groups you are in. The first number is the one returned by
+getgid(), and the subsequent ones by getgroups(), one of which may be
+the same as the first number.
+
+However, a value assigned to C<$(> must be a single number used to
+set the real gid. So the value given by C<$(> should I<not> be assigned
+back to C<$(> without being forced numeric, such as by adding zero. Note
+that this is different to the effective gid (C<$)>) which does take a
+list.
+
+You can change both the real gid and the effective gid at the same
+time by using POSIX::setgid(). Changes to $( require a check to $!
+to detect any possible errors after an attempted change.
+
+(Mnemonic: parentheses are used to I<group> things. The real gid is the
+group you I<left>, if you're running setgid.)
+
+=item $EFFECTIVE_GROUP_ID
+
+=item $EGID
+
+=item $)
+X<$)> X<$EGID> X<$EFFECTIVE_GROUP_ID>
+
+The effective gid of this process. If you are on a machine that
+supports membership in multiple groups simultaneously, gives a space
+separated list of groups you are in. The first number is the one
+returned by getegid(), and the subsequent ones by getgroups(), one of
+which may be the same as the first number.
+
+Similarly, a value assigned to C<$)> must also be a space-separated
+list of numbers. The first number sets the effective gid, and
+the rest (if any) are passed to setgroups(). To get the effect of an
+empty list for setgroups(), just repeat the new effective gid; that is,
+to force an effective gid of 5 and an effectively empty setgroups()
+list, say C< $) = "5 5" >.
+
+You can change both the effective gid and the real gid at the same
+time by using POSIX::setgid() (use only a single numeric argument).
+Changes to $) require a check to $! to detect any possible errors
+after an attempted change.
+
+(Mnemonic: parentheses are used to I<group> things. The effective gid
+is the group that's I<right> for you, if you're running setgid.)
+
+C<< $< >>, C<< $> >>, C<$(> and C<$)> can be set only on
+machines that support the corresponding I<set[re][ug]id()> routine. C<$(>
+and C<$)> can be swapped only on machines supporting setregid().
+
+=item $PROGRAM_NAME
+
+=item $0
+X<$0> X<$PROGRAM_NAME>
+
+Contains the name of the program being executed.
+
+On some (read: not all) operating systems assigning to C<$0> modifies
+the argument area that the C<ps> program sees. On some platforms you
+may have to use special C<ps> options or a different C<ps> to see the
+changes. Modifying the $0 is more useful as a way of indicating the
+current program state than it is for hiding the program you're
+running. (Mnemonic: same as B<sh> and B<ksh>.)
+
+Note that there are platform specific limitations on the maximum
+length of C<$0>. In the most extreme case it may be limited to the
+space occupied by the original C<$0>.
+
+In some platforms there may be arbitrary amount of padding, for
+example space characters, after the modified name as shown by C<ps>.
+In some platforms this padding may extend all the way to the original
+length of the argument area, no matter what you do (this is the case
+for example with Linux 2.2).
+
+Note for BSD users: setting C<$0> does not completely remove "perl"
+from the ps(1) output. For example, setting C<$0> to C<"foobar"> may
+result in C<"perl: foobar (perl)"> (whether both the C<"perl: "> prefix
+and the " (perl)" suffix are shown depends on your exact BSD variant
+and version). This is an operating system feature, Perl cannot help it.
+
+In multithreaded scripts Perl coordinates the threads so that any
+thread may modify its copy of the C<$0> and the change becomes visible
+to ps(1) (assuming the operating system plays along). Note that
+the view of C<$0> the other threads have will not change since they
+have their own copies of it.
+
+If the program has been given to perl via the switches C<-e> or C<-E>,
+C<$0> will contain the string C<"-e">.
+
+=item $[
+X<$[>
+
+The index of the first element in an array, and of the first character
+in a substring. Default is 0, but you could theoretically set it
+to 1 to make Perl behave more like B<awk> (or Fortran) when
+subscripting and when evaluating the index() and substr() functions.
+(Mnemonic: [ begins subscripts.)
+
+As of release 5 of Perl, assignment to C<$[> is treated as a compiler
+directive, and cannot influence the behavior of any other file.
+(That's why you can only assign compile-time constants to it.)
+Its use is highly discouraged.
+
+Note that, unlike other compile-time directives (such as L<strict>),
+assignment to C<$[> can be seen from outer lexical scopes in the same file.
+However, you can use local() on it to strictly bind its value to a
+lexical block.
+
+=item $]
+X<$]>
+
+The version + patchlevel / 1000 of the Perl interpreter. This variable
+can be used to determine whether the Perl interpreter executing a
+script is in the right range of versions. (Mnemonic: Is this version
+of perl in the right bracket?) Example:
+
+ warn "No checksumming!\n" if $] < 3.019;
+
+See also the documentation of C<use VERSION> and C<require VERSION>
+for a convenient way to fail if the running Perl interpreter is too old.
+
+The floating point representation can sometimes lead to inaccurate
+numeric comparisons. See C<$^V> for a more modern representation of
+the Perl version that allows accurate string comparisons.
+
+=item $COMPILING
+
+=item $^C
+X<$^C> X<$COMPILING>
+
+The current value of the flag associated with the B<-c> switch.
+Mainly of use with B<-MO=...> to allow code to alter its behavior
+when being compiled, such as for example to AUTOLOAD at compile
+time rather than normal, deferred loading. Setting
+C<$^C = 1> is similar to calling C<B::minus_c>.
+
+=item $DEBUGGING
+
+=item $^D
+X<$^D> X<$DEBUGGING>
+
+The current value of the debugging flags. (Mnemonic: value of B<-D>
+switch.) May be read or set. Like its command-line equivalent, you can use
+numeric or symbolic values, eg C<$^D = 10> or C<$^D = "st">.
+
+=item ${^RE_DEBUG_FLAGS}
+
+The current value of the regex debugging flags. Set to 0 for no debug output
+even when the re 'debug' module is loaded. See L<re> for details.
+
+=item ${^RE_TRIE_MAXBUF}
+
+Controls how certain regex optimisations are applied and how much memory they
+utilize. This value by default is 65536 which corresponds to a 512kB temporary
+cache. Set this to a higher value to trade memory for speed when matching
+large alternations. Set it to a lower value if you want the optimisations to
+be as conservative of memory as possible but still occur, and set it to a
+negative value to prevent the optimisation and conserve the most memory.
+Under normal situations this variable should be of no interest to you.
+
+=item $SYSTEM_FD_MAX
+
+=item $^F
+X<$^F> X<$SYSTEM_FD_MAX>
+
+The maximum system file descriptor, ordinarily 2. System file
+descriptors are passed to exec()ed processes, while higher file
+descriptors are not. Also, during an open(), system file descriptors are
+preserved even if the open() fails. (Ordinary file descriptors are
+closed before the open() is attempted.) The close-on-exec
+status of a file descriptor will be decided according to the value of
+C<$^F> when the corresponding file, pipe, or socket was opened, not the
+time of the exec().
+
+=item $^H
+
+WARNING: This variable is strictly for internal use only. Its availability,
+behavior, and contents are subject to change without notice.
+
+This variable contains compile-time hints for the Perl interpreter. At the
+end of compilation of a BLOCK the value of this variable is restored to the
+value when the interpreter started to compile the BLOCK.
+
+When perl begins to parse any block construct that provides a lexical scope
+(e.g., eval body, required file, subroutine body, loop body, or conditional
+block), the existing value of $^H is saved, but its value is left unchanged.
+When the compilation of the block is completed, it regains the saved value.
+Between the points where its value is saved and restored, code that
+executes within BEGIN blocks is free to change the value of $^H.
+
+This behavior provides the semantic of lexical scoping, and is used in,
+for instance, the C<use strict> pragma.
+
+The contents should be an integer; different bits of it are used for
+different pragmatic flags. Here's an example:
+
+ sub add_100 { $^H |= 0x100 }
+
+ sub foo {
+ BEGIN { add_100() }
+ bar->baz($boon);
+ }
+
+Consider what happens during execution of the BEGIN block. At this point
+the BEGIN block has already been compiled, but the body of foo() is still
+being compiled. The new value of $^H will therefore be visible only while
+the body of foo() is being compiled.
+
+Substitution of the above BEGIN block with:
+
+ BEGIN { require strict; strict->import('vars') }
+
+demonstrates how C<use strict 'vars'> is implemented. Here's a conditional
+version of the same lexical pragma:
+
+ BEGIN { require strict; strict->import('vars') if $condition }
+
+=item %^H
+
+The %^H hash provides the same scoping semantic as $^H. This makes it
+useful for implementation of lexically scoped pragmas. See L<perlpragma>.
+
+=item $INPLACE_EDIT
+
+=item $^I
+X<$^I> X<$INPLACE_EDIT>
+
+The current value of the inplace-edit extension. Use C<undef> to disable
+inplace editing. (Mnemonic: value of B<-i> switch.)
+
+=item $^M
+X<$^M>
+
+By default, running out of memory is an untrappable, fatal error.
+However, if suitably built, Perl can use the contents of C<$^M>
+as an emergency memory pool after die()ing. Suppose that your Perl
+were compiled with C<-DPERL_EMERGENCY_SBRK> and used Perl's malloc.
+Then
+
+ $^M = 'a' x (1 << 16);
+
+would allocate a 64K buffer for use in an emergency. See the
+F<INSTALL> file in the Perl distribution for information on how to
+add custom C compilation flags when compiling perl. To discourage casual
+use of this advanced feature, there is no L<English|English> long name for
+this variable.
+
+=item $OSNAME
+
+=item $^O
+X<$^O> X<$OSNAME>
+
+The name of the operating system under which this copy of Perl was
+built, as determined during the configuration process. The value
+is identical to C<$Config{'osname'}>. See also L<Config> and the
+B<-V> command-line switch documented in L<perlrun>.
+
+In Windows platforms, $^O is not very helpful: since it is always
+C<MSWin32>, it doesn't tell the difference between
+95/98/ME/NT/2000/XP/CE/.NET. Use Win32::GetOSName() or
+Win32::GetOSVersion() (see L<Win32> and L<perlport>) to distinguish
+between the variants.
+
+=item ${^OPEN}
+
+An internal variable used by PerlIO. A string in two parts, separated
+by a C<\0> byte, the first part describes the input layers, the second
+part describes the output layers.
+
+=item $PERLDB
+
+=item $^P
+X<$^P> X<$PERLDB>
+
+The internal variable for debugging support. The meanings of the
+various bits are subject to change, but currently indicate:
+
+=over 6
+
+=item 0x01
+
+Debug subroutine enter/exit.
+
+=item 0x02
+
+Line-by-line debugging. Causes DB::DB() subroutine to be called for each
+statement executed. Also causes saving source code lines (like 0x400).
+
+=item 0x04
+
+Switch off optimizations.
+
+=item 0x08
+
+Preserve more data for future interactive inspections.
+
+=item 0x10
+
+Keep info about source lines on which a subroutine is defined.
+
+=item 0x20
+
+Start with single-step on.
+
+=item 0x40
+
+Use subroutine address instead of name when reporting.
+
+=item 0x80
+
+Report C<goto &subroutine> as well.
+
+=item 0x100
+
+Provide informative "file" names for evals based on the place they were compiled.
+
+=item 0x200
+
+Provide informative names to anonymous subroutines based on the place they
+were compiled.
+
+=item 0x400
+
+Save source code lines into C<@{"_<$filename"}>.
+
+=back
+
+Some bits may be relevant at compile-time only, some at
+run-time only. This is a new mechanism and the details may change.
+See also L<perldebguts>.
+
+=item $LAST_REGEXP_CODE_RESULT
+
+=item $^R
+X<$^R> X<$LAST_REGEXP_CODE_RESULT>
+
+The result of evaluation of the last successful C<(?{ code })>
+regular expression assertion (see L<perlre>). May be written to.
+
+=item $EXCEPTIONS_BEING_CAUGHT
+
+=item $^S
+X<$^S> X<$EXCEPTIONS_BEING_CAUGHT>
+
+Current state of the interpreter.
+
+ $^S State
+ --------- -------------------
+ undef Parsing module/eval
+ true (1) Executing an eval
+ false (0) Otherwise
+
+The first state may happen in $SIG{__DIE__} and $SIG{__WARN__} handlers.
+
+=item $BASETIME
+
+=item $^T
+X<$^T> X<$BASETIME>
+
+The time at which the program began running, in seconds since the
+epoch (beginning of 1970). The values returned by the B<-M>, B<-A>,
+and B<-C> filetests are based on this value.
+
+=item ${^TAINT}
+
+Reflects if taint mode is on or off. 1 for on (the program was run with
+B<-T>), 0 for off, -1 when only taint warnings are enabled (i.e. with
+B<-t> or B<-TU>). This variable is read-only.
+
+=item ${^UNICODE}
+
+Reflects certain Unicode settings of Perl. See L<perlrun>
+documentation for the C<-C> switch for more information about
+the possible values. This variable is set during Perl startup
+and is thereafter read-only.
+
+=item ${^UTF8CACHE}
+
+This variable controls the state of the internal UTF-8 offset caching code.
+1 for on (the default), 0 for off, -1 to debug the caching code by checking
+all its results against linear scans, and panicking on any discrepancy.
+
+=item ${^UTF8LOCALE}
+
+This variable indicates whether an UTF-8 locale was detected by perl at
+startup. This information is used by perl when it's in
+adjust-utf8ness-to-locale mode (as when run with the C<-CL> command-line
+switch); see L<perlrun> for more info on this.
+
+=item $PERL_VERSION
+
+=item $^V
+X<$^V> X<$PERL_VERSION>
+
+The revision, version, and subversion of the Perl interpreter, represented
+as a C<version> object.
+
+This variable first appeared in perl 5.6.0; earlier versions of perl will
+see an undefined value. Before perl 5.10.0 $^V was represented as a v-string.
+
+$^V can be used to determine whether the Perl interpreter executing a
+script is in the right range of versions. (Mnemonic: use ^V for Version
+Control.) Example:
+
+ warn "Hashes not randomized!\n" if !$^V or $^V lt v5.8.1
+
+To convert C<$^V> into its string representation use sprintf()'s
+C<"%vd"> conversion:
+
+ printf "version is v%vd\n", $^V; # Perl's version
+
+See the documentation of C<use VERSION> and C<require VERSION>
+for a convenient way to fail if the running Perl interpreter is too old.
+
+See also C<$]> for an older representation of the Perl version.
+
+=item $WARNING
+
+=item $^W
+X<$^W> X<$WARNING>
+
+The current value of the warning switch, initially true if B<-w>
+was used, false otherwise, but directly modifiable. (Mnemonic:
+related to the B<-w> switch.) See also L<warnings>.
+
+=item ${^WARNING_BITS}
+
+The current set of warning checks enabled by the C<use warnings> pragma.
+See the documentation of C<warnings> for more details.
+
+=item ${^WIN32_SLOPPY_STAT}
+
+If this variable is set to a true value, then stat() on Windows will
+not try to open the file. This means that the link count cannot be
+determined and file attributes may be out of date if additional
+hardlinks to the file exist. On the other hand, not opening the file
+is considerably faster, especially for files on network drives.
+
+This variable could be set in the F<sitecustomize.pl> file to
+configure the local Perl installation to use "sloppy" stat() by
+default. See L<perlrun> for more information about site
+customization.
+
+=item $EXECUTABLE_NAME
+
+=item $^X
+X<$^X> X<$EXECUTABLE_NAME>
+
+The name used to execute the current copy of Perl, from C's
+C<argv[0]> or (where supported) F</proc/self/exe>.
+
+Depending on the host operating system, the value of $^X may be
+a relative or absolute pathname of the perl program file, or may
+be the string used to invoke perl but not the pathname of the
+perl program file. Also, most operating systems permit invoking
+programs that are not in the PATH environment variable, so there
+is no guarantee that the value of $^X is in PATH. For VMS, the
+value may or may not include a version number.
+
+You usually can use the value of $^X to re-invoke an independent
+copy of the same perl that is currently running, e.g.,
+
+ @first_run = `$^X -le "print int rand 100 for 1..100"`;
+
+But recall that not all operating systems support forking or
+capturing of the output of commands, so this complex statement
+may not be portable.
+
+It is not safe to use the value of $^X as a path name of a file,
+as some operating systems that have a mandatory suffix on
+executable files do not require use of the suffix when invoking
+a command. To convert the value of $^X to a path name, use the
+following statements:
+
+ # Build up a set of file names (not command names).
+ use Config;
+ $this_perl = $^X;
+ if ($^O ne 'VMS')
+ {$this_perl .= $Config{_exe}
+ unless $this_perl =~ m/$Config{_exe}$/i;}
+
+Because many operating systems permit anyone with read access to
+the Perl program file to make a copy of it, patch the copy, and
+then execute the copy, the security-conscious Perl programmer
+should take care to invoke the installed copy of perl, not the
+copy referenced by $^X. The following statements accomplish
+this goal, and produce a pathname that can be invoked as a
+command or referenced as a file.
+
+ use Config;
+ $secure_perl_path = $Config{perlpath};
+ if ($^O ne 'VMS')
+ {$secure_perl_path .= $Config{_exe}
+ unless $secure_perl_path =~ m/$Config{_exe}$/i;}
+
+=item ARGV
+X<ARGV>
+
+The special filehandle that iterates over command-line filenames in
+C<@ARGV>. Usually written as the null filehandle in the angle operator
+C<< <> >>. Note that currently C<ARGV> only has its magical effect
+within the C<< <> >> operator; elsewhere it is just a plain filehandle
+corresponding to the last file opened by C<< <> >>. In particular,
+passing C<\*ARGV> as a parameter to a function that expects a filehandle
+may not cause your function to automatically read the contents of all the
+files in C<@ARGV>.
+
+=item $ARGV
+X<$ARGV>
+
+contains the name of the current file when reading from <>.
+
+=item @ARGV
+X<@ARGV>
+
+The array @ARGV contains the command-line arguments intended for
+the script. C<$#ARGV> is generally the number of arguments minus
+one, because C<$ARGV[0]> is the first argument, I<not> the program's
+command name itself. See C<$0> for the command name.
+
+=item ARGVOUT
+X<ARGVOUT>
+
+The special filehandle that points to the currently open output file
+when doing edit-in-place processing with B<-i>. Useful when you have
+to do a lot of inserting and don't want to keep modifying $_. See
+L<perlrun> for the B<-i> switch.
+
+=item @F
+X<@F>
+
+The array @F contains the fields of each line read in when autosplit
+mode is turned on. See L<perlrun> for the B<-a> switch. This array
+is package-specific, and must be declared or given a full package name
+if not in package main when running under C<strict 'vars'>.
+
+=item @INC
+X<@INC>
+
+The array @INC contains the list of places that the C<do EXPR>,
+C<require>, or C<use> constructs look for their library files. It
+initially consists of the arguments to any B<-I> command-line
+switches, followed by the default Perl library, probably
+F</usr/local/lib/perl>, followed by ".", to represent the current
+directory. ("." will not be appended if taint checks are enabled, either by
+C<-T> or by C<-t>.) If you need to modify this at runtime, you should use
+the C<use lib> pragma to get the machine-dependent library properly
+loaded also:
+
+ use lib '/mypath/libdir/';
+ use SomeMod;
+
+You can also insert hooks into the file inclusion system by putting Perl
+code directly into @INC. Those hooks may be subroutine references, array
+references or blessed objects. See L<perlfunc/require> for details.
+
+=item @ARG
+
+=item @_
+X<@_> X<@ARG>
+
+Within a subroutine the array @_ contains the parameters passed to that
+subroutine. See L<perlsub>.
+
+=item %INC
+X<%INC>
+
+The hash %INC contains entries for each filename included via the
+C<do>, C<require>, or C<use> operators. The key is the filename
+you specified (with module names converted to pathnames), and the
+value is the location of the file found. The C<require>
+operator uses this hash to determine whether a particular file has
+already been included.
+
+If the file was loaded via a hook (e.g. a subroutine reference, see
+L<perlfunc/require> for a description of these hooks), this hook is
+by default inserted into %INC in place of a filename. Note, however,
+that the hook may have set the %INC entry by itself to provide some more
+specific info.
+
+=item %ENV
+
+=item $ENV{expr}
+X<%ENV>
+
+The hash %ENV contains your current environment. Setting a
+value in C<ENV> changes the environment for any child processes
+you subsequently fork() off.
+
+=item %SIG
+
+=item $SIG{expr}
+X<%SIG>
+
+The hash C<%SIG> contains signal handlers for signals. For example:
+
+ sub handler { # 1st argument is signal name
+ my($sig) = @_;
+ print "Caught a SIG$sig--shutting down\n";
+ close(LOG);
+ exit(0);
+ }
+
+ $SIG{'INT'} = \&handler;
+ $SIG{'QUIT'} = \&handler;
+ ...
+ $SIG{'INT'} = 'DEFAULT'; # restore default action
+ $SIG{'QUIT'} = 'IGNORE'; # ignore SIGQUIT
+
+Using a value of C<'IGNORE'> usually has the effect of ignoring the
+signal, except for the C<CHLD> signal. See L<perlipc> for more about
+this special case.
+
+Here are some other examples:
+
+ $SIG{"PIPE"} = "Plumber"; # assumes main::Plumber (not recommended)
+ $SIG{"PIPE"} = \&Plumber; # just fine; assume current Plumber
+ $SIG{"PIPE"} = *Plumber; # somewhat esoteric
+ $SIG{"PIPE"} = Plumber(); # oops, what did Plumber() return??
+
+Be sure not to use a bareword as the name of a signal handler,
+lest you inadvertently call it.
+
+If your system has the sigaction() function then signal handlers are
+installed using it. This means you get reliable signal handling.
+
+The default delivery policy of signals changed in Perl 5.8.0 from
+immediate (also known as "unsafe") to deferred, also known as
+"safe signals". See L<perlipc> for more information.
+
+Certain internal hooks can be also set using the %SIG hash. The
+routine indicated by C<$SIG{__WARN__}> is called when a warning message is
+about to be printed. The warning message is passed as the first
+argument. The presence of a C<__WARN__> hook causes the ordinary printing
+of warnings to C<STDERR> to be suppressed. You can use this to save warnings
+in a variable, or turn warnings into fatal errors, like this:
+
+ local $SIG{__WARN__} = sub { die $_[0] };
+ eval $proggie;
+
+As the C<'IGNORE'> hook is not supported by C<__WARN__>, you can
+disable warnings using the empty subroutine:
+
+ local $SIG{__WARN__} = sub {};
+
+The routine indicated by C<$SIG{__DIE__}> is called when a fatal exception
+is about to be thrown. The error message is passed as the first
+argument. When a C<__DIE__> hook routine returns, the exception
+processing continues as it would have in the absence of the hook,
+unless the hook routine itself exits via a C<goto>, a loop exit, or a C<die()>.
+The C<__DIE__> handler is explicitly disabled during the call, so that you
+can die from a C<__DIE__> handler. Similarly for C<__WARN__>.
+
+Due to an implementation glitch, the C<$SIG{__DIE__}> hook is called
+even inside an eval(). Do not use this to rewrite a pending exception
+in C<$@>, or as a bizarre substitute for overriding C<CORE::GLOBAL::die()>.
+This strange action at a distance may be fixed in a future release
+so that C<$SIG{__DIE__}> is only called if your program is about
+to exit, as was the original intent. Any other use is deprecated.
+
+C<__DIE__>/C<__WARN__> handlers are very special in one respect:
+they may be called to report (probable) errors found by the parser.
+In such a case the parser may be in inconsistent state, so any
+attempt to evaluate Perl code from such a handler will probably
+result in a segfault. This means that warnings or errors that
+result from parsing Perl should be used with extreme caution, like
+this:
+
+ require Carp if defined $^S;
+ Carp::confess("Something wrong") if defined &Carp::confess;
+ die "Something wrong, but could not load Carp to give backtrace...
+ To see backtrace try starting Perl with -MCarp switch";
+
+Here the first line will load Carp I<unless> it is the parser who
+called the handler. The second line will print backtrace and die if
+Carp was available. The third line will be executed only if Carp was
+not available.
+
+See L<perlfunc/die>, L<perlfunc/warn>, L<perlfunc/eval>, and
+L<warnings> for additional information.
+
+=back
+
+=head2 Error Indicators
+X<error> X<exception>
+
+The variables C<$@>, C<$!>, C<$^E>, and C<$?> contain information
+about different types of error conditions that may appear during
+execution of a Perl program. The variables are shown ordered by
+the "distance" between the subsystem which reported the error and
+the Perl process. They correspond to errors detected by the Perl
+interpreter, C library, operating system, or an external program,
+respectively.
+
+To illustrate the differences between these variables, consider the
+following Perl expression, which uses a single-quoted string:
+
+ eval q{
+ open my $pipe, "/cdrom/install |" or die $!;
+ my @res = <$pipe>;
+ close $pipe or die "bad pipe: $?, $!";
+ };
+
+After execution of this statement all 4 variables may have been set.
+
+C<$@> is set if the string to be C<eval>-ed did not compile (this
+may happen if C<open> or C<close> were imported with bad prototypes),
+or if Perl code executed during evaluation die()d . In these cases
+the value of $@ is the compile error, or the argument to C<die>
+(which will interpolate C<$!> and C<$?>). (See also L<Fatal>,
+though.)
+
+When the eval() expression above is executed, open(), C<< <PIPE> >>,
+and C<close> are translated to calls in the C run-time library and
+thence to the operating system kernel. C<$!> is set to the C library's
+C<errno> if one of these calls fails.
+
+Under a few operating systems, C<$^E> may contain a more verbose
+error indicator, such as in this case, "CDROM tray not closed."
+Systems that do not support extended error messages leave C<$^E>
+the same as C<$!>.
+
+Finally, C<$?> may be set to non-0 value if the external program
+F</cdrom/install> fails. The upper eight bits reflect specific
+error conditions encountered by the program (the program's exit()
+value). The lower eight bits reflect mode of failure, like signal
+death and core dump information See wait(2) for details. In
+contrast to C<$!> and C<$^E>, which are set only if error condition
+is detected, the variable C<$?> is set on each C<wait> or pipe
+C<close>, overwriting the old value. This is more like C<$@>, which
+on every eval() is always set on failure and cleared on success.
+
+For more details, see the individual descriptions at C<$@>, C<$!>, C<$^E>,
+and C<$?>.
+
+=head2 Technical Note on the Syntax of Variable Names
+
+Variable names in Perl can have several formats. Usually, they
+must begin with a letter or underscore, in which case they can be
+arbitrarily long (up to an internal limit of 251 characters) and
+may contain letters, digits, underscores, or the special sequence
+C<::> or C<'>. In this case, the part before the last C<::> or
+C<'> is taken to be a I<package qualifier>; see L<perlmod>.
+
+Perl variable names may also be a sequence of digits or a single
+punctuation or control character. These names are all reserved for
+special uses by Perl; for example, the all-digits names are used
+to hold data captured by backreferences after a regular expression
+match. Perl has a special syntax for the single-control-character
+names: It understands C<^X> (caret C<X>) to mean the control-C<X>
+character. For example, the notation C<$^W> (dollar-sign caret
+C<W>) is the scalar variable whose name is the single character
+control-C<W>. This is better than typing a literal control-C<W>
+into your program.
+
+Finally, new in Perl 5.6, Perl variable names may be alphanumeric
+strings that begin with control characters (or better yet, a caret).
+These variables must be written in the form C<${^Foo}>; the braces
+are not optional. C<${^Foo}> denotes the scalar variable whose
+name is a control-C<F> followed by two C<o>'s. These variables are
+reserved for future special uses by Perl, except for the ones that
+begin with C<^_> (control-underscore or caret-underscore). No
+control-character name that begins with C<^_> will acquire a special
+meaning in any future version of Perl; such names may therefore be
+used safely in programs. C<$^_> itself, however, I<is> reserved.
+
+Perl identifiers that begin with digits, control characters, or
+punctuation characters are exempt from the effects of the C<package>
+declaration and are always forced to be in package C<main>; they are
+also exempt from C<strict 'vars'> errors. A few other names are also
+exempt in these ways:
+
+ ENV STDIN
+ INC STDOUT
+ ARGV STDERR
+ ARGVOUT _
+ SIG
+
+In particular, the new special C<${^_XYZ}> variables are always taken
+to be in package C<main>, regardless of any C<package> declarations
+presently in scope.
+
+=head1 BUGS
+
+Due to an unfortunate accident of Perl's implementation, C<use
+English> imposes a considerable performance penalty on all regular
+expression matches in a program, regardless of whether they occur
+in the scope of C<use English>. For that reason, saying C<use
+English> in libraries is strongly discouraged. See the
+Devel::SawAmpersand module documentation from CPAN
+( http://www.cpan.org/modules/by-module/Devel/ )
+for more information. Writing C<use English '-no_match_vars';>
+avoids the performance penalty.
+
+Having to even think about the C<$^S> variable in your exception
+handlers is simply wrong. C<$SIG{__DIE__}> as currently implemented
+invites grievous and difficult to track down errors. Avoid it
+and use an C<END{}> or CORE::GLOBAL::die override instead.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlvmesa.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlvmesa.pod
new file mode 100755
index 00000000000..98fa5ec9cfd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlvmesa.pod
@@ -0,0 +1,131 @@
+
+This document is written in pod format hence there are punctuation
+characters in odd places. Do not worry, you've apparently got
+the ASCII->EBCDIC translation worked out correctly. You can read
+more about pod in pod/perlpod.pod or the short summary in the
+INSTALL file.
+
+=head1 NAME
+
+README.vmesa - building and installing Perl for VM/ESA.
+
+=head1 SYNOPSIS
+
+This document will help you Configure, build, test and install Perl
+on VM/ESA.
+
+=head1 DESCRIPTION
+
+This is a fully ported perl for VM/ESA 2.3.0. It may work on
+other versions, but that's the one we've tested it on.
+
+If you've downloaded the binary distribution, it needs to be
+installed below /usr/local. Source code distributions have an
+automated "make install" step that means you do not need to extract
+the source code below /usr/local (though that is where it will be
+installed by default). You may need to worry about the networking
+configuration files discussed in the last bullet below.
+
+=head2 Unpacking Perl Distribution on VM/ESA
+
+To extract an ASCII tar archive on VM/ESA, try this:
+
+ pax -o to=IBM-1047,from=ISO8859-1 -r < latest.tar
+
+=head2 Setup Perl and utilities on VM/ESA
+
+GNU make for VM/ESA, which may be required for the build of perl,
+is available from:
+
+ http://vm.marist.edu/~neale/vmoe.html
+
+=head2 Configure Perl on VM/ESA
+
+Once you've unpacked the distribution, run Configure (see INSTALL for
+full discussion of the Configure options), and then run make, then
+"make test" then "make install" (this last step may require UID=0
+privileges).
+
+There is a "hints" file for vmesa that specifies the correct values
+for most things. Some things to watch out for are:
+
+=over 4
+
+=item *
+
+this port does support dynamic loading but it's not had much testing
+
+=item *
+
+Don't turn on the compiler optimization flag "-O". There's
+a bug in the compiler (APAR PQ18812) that generates some bad code
+the optimizer is on.
+
+=item *
+
+As VM/ESA doesn't fully support the fork() API programs relying on
+this call will not work. I've replaced fork()/exec() with spawn()
+and the standalone exec() with spawn(). This has a side effect when
+opening unnamed pipes in a shell script: there is no child process
+generated under.
+
+=item *
+
+At the moment the hints file for VM/ESA basically bypasses all of the
+automatic configuration process. This is because Configure relies on:
+1. The header files living in the Byte File System (you could put the
+there if you want); 2. The C preprocessor including the #include
+statements in the preprocessor output (.i) file.
+
+=back
+
+=head2 Testing Anomalies of Perl on VM/ESA
+
+The "make test" step runs a Perl Verification Procedure, usually before
+installation. As the 5.6.1 kit was being assembled
+the following "failures" were known to appear on some machines
+during "make test" (mostly due to ASCII vs. EBCDIC conflicts),
+your results may differ:
+
+[the list of failures being compiled]
+
+=head2 Usage Hints for Perl on VM/ESA
+
+When using perl on VM/ESA please keep in mind that the EBCDIC and ASCII
+character sets are different. Perl builtin functions that may behave
+differently under EBCDIC are mentioned in the perlport.pod document.
+
+OpenEdition (UNIX System Services) does not (yet) support the #! means
+of script invocation.
+See:
+
+ head `whence perldoc`
+
+for an example of how to use the "eval exec" trick to ask the shell to
+have perl run your scripts for you.
+
+=head1 AUTHORS
+
+Neale Ferguson.
+
+=head1 SEE ALSO
+
+L<INSTALL>, L<perlport>, L<perlebcdic>.
+
+=head2 Mailing list for Perl on VM/ESA
+
+If you are interested in the VM/ESA, z/OS (formerly known as OS/390)
+and POSIX-BC (BS2000) ports of Perl then see the perl-mvs mailing list.
+To subscribe, send an empty message to perl-mvs-subscribe@perl.org.
+
+See also:
+
+ http://lists.perl.org/showlist.cgi?name=perl-mvs
+
+There are web archives of the mailing list at:
+
+ http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
+ http://archive.develooper.com/perl-mvs@perl.org/
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlvms.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlvms.pod
new file mode 100755
index 00000000000..9854ff855a2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlvms.pod
@@ -0,0 +1,1227 @@
+=head1 NAME
+
+perlvms - VMS-specific documentation for Perl
+
+=head1 DESCRIPTION
+
+Gathered below are notes describing details of Perl 5's
+behavior on VMS. They are a supplement to the regular Perl 5
+documentation, so we have focussed on the ways in which Perl
+5 functions differently under VMS than it does under Unix,
+and on the interactions between Perl and the rest of the
+operating system. We haven't tried to duplicate complete
+descriptions of Perl features from the main Perl
+documentation, which can be found in the F<[.pod]>
+subdirectory of the Perl distribution.
+
+We hope these notes will save you from confusion and lost
+sleep when writing Perl scripts on VMS. If you find we've
+missed something you think should appear here, please don't
+hesitate to drop a line to vmsperl@perl.org.
+
+=head1 Installation
+
+Directions for building and installing Perl 5 can be found in
+the file F<README.vms> in the main source directory of the
+Perl distribution..
+
+=head1 Organization of Perl Images
+
+=head2 Core Images
+
+During the installation process, three Perl images are produced.
+F<Miniperl.Exe> is an executable image which contains all of
+the basic functionality of Perl, but cannot take advantage of
+Perl extensions. It is used to generate several files needed
+to build the complete Perl and various extensions. Once you've
+finished installing Perl, you can delete this image.
+
+Most of the complete Perl resides in the shareable image
+F<PerlShr.Exe>, which provides a core to which the Perl executable
+image and all Perl extensions are linked. You should place this
+image in F<Sys$Share>, or define the logical name F<PerlShr> to
+translate to the full file specification of this image. It should
+be world readable. (Remember that if a user has execute only access
+to F<PerlShr>, VMS will treat it as if it were a privileged shareable
+image, and will therefore require all downstream shareable images to be
+INSTALLed, etc.)
+
+
+Finally, F<Perl.Exe> is an executable image containing the main
+entry point for Perl, as well as some initialization code. It
+should be placed in a public directory, and made world executable.
+In order to run Perl with command line arguments, you should
+define a foreign command to invoke this image.
+
+=head2 Perl Extensions
+
+Perl extensions are packages which provide both XS and Perl code
+to add new functionality to perl. (XS is a meta-language which
+simplifies writing C code which interacts with Perl, see
+L<perlxs> for more details.) The Perl code for an
+extension is treated like any other library module - it's
+made available in your script through the appropriate
+C<use> or C<require> statement, and usually defines a Perl
+package containing the extension.
+
+The portion of the extension provided by the XS code may be
+connected to the rest of Perl in either of two ways. In the
+B<static> configuration, the object code for the extension is
+linked directly into F<PerlShr.Exe>, and is initialized whenever
+Perl is invoked. In the B<dynamic> configuration, the extension's
+machine code is placed into a separate shareable image, which is
+mapped by Perl's DynaLoader when the extension is C<use>d or
+C<require>d in your script. This allows you to maintain the
+extension as a separate entity, at the cost of keeping track of the
+additional shareable image. Most extensions can be set up as either
+static or dynamic.
+
+The source code for an extension usually resides in its own
+directory. At least three files are generally provided:
+I<Extshortname>F<.xs> (where I<Extshortname> is the portion of
+the extension's name following the last C<::>), containing
+the XS code, I<Extshortname>F<.pm>, the Perl library module
+for the extension, and F<Makefile.PL>, a Perl script which uses
+the C<MakeMaker> library modules supplied with Perl to generate
+a F<Descrip.MMS> file for the extension.
+
+=head2 Installing static extensions
+
+Since static extensions are incorporated directly into
+F<PerlShr.Exe>, you'll have to rebuild Perl to incorporate a
+new extension. You should edit the main F<Descrip.MMS> or F<Makefile>
+you use to build Perl, adding the extension's name to the C<ext>
+macro, and the extension's object file to the C<extobj> macro.
+You'll also need to build the extension's object file, either
+by adding dependencies to the main F<Descrip.MMS>, or using a
+separate F<Descrip.MMS> for the extension. Then, rebuild
+F<PerlShr.Exe> to incorporate the new code.
+
+Finally, you'll need to copy the extension's Perl library
+module to the F<[.>I<Extname>F<]> subdirectory under one
+of the directories in C<@INC>, where I<Extname> is the name
+of the extension, with all C<::> replaced by C<.> (e.g.
+the library module for extension Foo::Bar would be copied
+to a F<[.Foo.Bar]> subdirectory).
+
+=head2 Installing dynamic extensions
+
+In general, the distributed kit for a Perl extension includes
+a file named Makefile.PL, which is a Perl program which is used
+to create a F<Descrip.MMS> file which can be used to build and
+install the files required by the extension. The kit should be
+unpacked into a directory tree B<not> under the main Perl source
+directory, and the procedure for building the extension is simply
+
+ $ perl Makefile.PL ! Create Descrip.MMS
+ $ mmk ! Build necessary files
+ $ mmk test ! Run test code, if supplied
+ $ mmk install ! Install into public Perl tree
+
+I<N.B.> The procedure by which extensions are built and
+tested creates several levels (at least 4) under the
+directory in which the extension's source files live.
+For this reason if you are running a version of VMS prior
+to V7.1 you shouldn't nest the source directory
+too deeply in your directory structure lest you exceed RMS'
+maximum of 8 levels of subdirectory in a filespec. (You
+can use rooted logical names to get another 8 levels of
+nesting, if you can't place the files near the top of
+the physical directory structure.)
+
+VMS support for this process in the current release of Perl
+is sufficient to handle most extensions. However, it does
+not yet recognize extra libraries required to build shareable
+images which are part of an extension, so these must be added
+to the linker options file for the extension by hand. For
+instance, if the F<PGPLOT> extension to Perl requires the
+F<PGPLOTSHR.EXE> shareable image in order to properly link
+the Perl extension, then the line C<PGPLOTSHR/Share> must
+be added to the linker options file F<PGPLOT.Opt> produced
+during the build process for the Perl extension.
+
+By default, the shareable image for an extension is placed in
+the F<[.lib.site_perl.auto>I<Arch>.I<Extname>F<]> directory of the
+installed Perl directory tree (where I<Arch> is F<VMS_VAX> or
+F<VMS_AXP>, and I<Extname> is the name of the extension, with
+each C<::> translated to C<.>). (See the MakeMaker documentation
+for more details on installation options for extensions.)
+However, it can be manually placed in any of several locations:
+
+=over 4
+
+=item *
+
+the F<[.Lib.Auto.>I<Arch>I<$PVers>I<Extname>F<]> subdirectory
+of one of the directories in C<@INC> (where I<PVers>
+is the version of Perl you're using, as supplied in C<$]>,
+with '.' converted to '_'), or
+
+=item *
+
+one of the directories in C<@INC>, or
+
+=item *
+
+a directory which the extensions Perl library module
+passes to the DynaLoader when asking it to map
+the shareable image, or
+
+=item *
+
+F<Sys$Share> or F<Sys$Library>.
+
+=back
+
+If the shareable image isn't in any of these places, you'll need
+to define a logical name I<Extshortname>, where I<Extshortname>
+is the portion of the extension's name after the last C<::>, which
+translates to the full file specification of the shareable image.
+
+=head1 File specifications
+
+=head2 Syntax
+
+We have tried to make Perl aware of both VMS-style and Unix-style file
+specifications wherever possible. You may use either style, or both,
+on the command line and in scripts, but you may not combine the two
+styles within a single file specification. VMS Perl interprets Unix
+pathnames in much the same way as the CRTL (I<e.g.> the first component
+of an absolute path is read as the device name for the VMS file
+specification). There are a set of functions provided in the
+C<VMS::Filespec> package for explicit interconversion between VMS and
+Unix syntax; its documentation provides more details.
+
+We've tried to minimize the dependence of Perl library
+modules on Unix syntax, but you may find that some of these,
+as well as some scripts written for Unix systems, will
+require that you use Unix syntax, since they will assume that
+'/' is the directory separator, I<etc.> If you find instances
+of this in the Perl distribution itself, please let us know,
+so we can try to work around them.
+
+Also when working on Perl programs on VMS, if you need a syntax
+in a specific operating system format, then you need either to
+check the appropriate DECC$ feature logical, or call a conversion
+routine to force it to that format.
+
+The feature logical name DECC$FILENAME_UNIX_REPORT modifies traditional
+Perl behavior in the conversion of file specifications from UNIX to VMS
+format in order to follow the extended character handling rules now
+expected by the CRTL. Specifically, when this feature is in effect, the
+C<./.../> in a UNIX path is now translated to C<[.^.^.^.]> instead of
+the traditional VMS C<[...]>. To be compatible with what MakeMaker
+expects, if a VMS path cannot be translated to a UNIX path, it is
+passed through unchanged, so C<unixify("[...]")> will return C<[...]>.
+
+The handling of extended characters is largely complete in the
+VMS-specific C infrastructure of Perl, but more work is still needed to
+fully support extended syntax filenames in several core modules. In
+particular, at this writing PathTools has only partial support for
+directories containing some extended characters.
+
+There are several ambiguous cases where a conversion routine cannot
+determine whether an input filename is in UNIX format or in VMS format,
+since now both VMS and UNIX file specifications may have characters in
+them that could be mistaken for syntax delimiters of the other type. So
+some pathnames simply cannot be used in a mode that allows either type
+of pathname to be present. Perl will tend to assume that an ambiguous
+filename is in UNIX format.
+
+Allowing "." as a version delimiter is simply incompatible with
+determining whether a pathname is in VMS format or in UNIX format with
+extended file syntax. There is no way to know whether "perl-5.8.6" is a
+UNIX "perl-5.8.6" or a VMS "perl-5.8;6" when passing it to unixify() or
+vmsify().
+
+The DECC$FILENAME_UNIX_REPORT logical name controls how Perl interprets
+filenames to the extent that Perl uses the CRTL internally for many
+purposes, and attempts to follow CRTL conventions for reporting
+filenames. The DECC$FILENAME_UNIX_ONLY feature differs in that it
+expects all filenames passed to the C run-time to be already in UNIX
+format. This feature is not yet supported in Perl since Perl uses
+traditional OpenVMS file specifications internally and in the test
+harness, and it is not yet clear whether this mode will be useful or
+useable. The feature logical name DECC$POSIX_COMPLIANT_PATHNAMES is new
+with the RMS Symbolic Link SDK and included with OpenVMS v8.3, but is
+not yet supported in Perl.
+
+=head2 Filename Case
+
+Perl follows VMS defaults and override settings in preserving (or not
+preserving) filename case. Case is not preserved on ODS-2 formatted
+volumes on any architecture. On ODS-5 volumes, filenames may be case
+preserved depending on process and feature settings. Perl now honors
+DECC$EFS_CASE_PRESERVE and DECC$ARGV_PARSE_STYLE on those systems where
+the CRTL supports these features. When these features are not enabled
+or the CRTL does not support them, Perl follows the traditional CRTL
+behavior of downcasing command-line arguments and returning file
+specifications in lower case only.
+
+I<N. B.> It is very easy to get tripped up using a mixture of other
+programs, external utilities, and Perl scripts that are in varying
+states of being able to handle case preservation. For example, a file
+created by an older version of an archive utility or a build utility
+such as MMK or MMS may generate a filename in all upper case even on an
+ODS-5 volume. If this filename is later retrieved by a Perl script or
+module in a case preserving environment, that upper case name may not
+match the mixed-case or lower-case expections of the Perl code. Your
+best bet is to follow an all-or-nothing approach to case preservation:
+either don't use it at all, or make sure your entire toolchain and
+application environment support and use it.
+
+OpenVMS Alpha v7.3-1 and later and all version of OpenVMS I64 support
+case sensitivity as a process setting (see C<SET PROCESS
+/CASE_LOOKUP=SENSITIVE>). Perl does not currently suppport case
+sensitivity on VMS, but it may in the future, so Perl programs should
+use the C<File::Spec->case_tolerant> method to determine the state, and
+not the C<$^O> variable.
+
+=head2 Symbolic Links
+
+When built on an ODS-5 volume with symbolic links enabled, Perl by
+default supports symbolic links when the requisite support is available
+in the filesystem and CRTL (generally 64-bit OpenVMS v8.3 and later).
+There are a number of limitations and caveats to be aware of when
+working with symbolic links on VMS. Most notably, the target of a valid
+symbolic link must be expressed as a UNIX-style path and it must exist
+on a volume visible from your POSIX root (see the C<SHOW ROOT> command
+in DCL help). For further details on symbolic link capabilities and
+requirements, see chapter 12 of the CRTL manual that ships with OpenVMS
+v8.3 or later.
+
+=head2 Wildcard expansion
+
+File specifications containing wildcards are allowed both on
+the command line and within Perl globs (e.g. C<E<lt>*.cE<gt>>). If
+the wildcard filespec uses VMS syntax, the resultant
+filespecs will follow VMS syntax; if a Unix-style filespec is
+passed in, Unix-style filespecs will be returned.
+Similar to the behavior of wildcard globbing for a Unix shell,
+one can escape command line wildcards with double quotation
+marks C<"> around a perl program command line argument. However,
+owing to the stripping of C<"> characters carried out by the C
+handling of argv you will need to escape a construct such as
+this one (in a directory containing the files F<PERL.C>, F<PERL.EXE>,
+F<PERL.H>, and F<PERL.OBJ>):
+
+ $ perl -e "print join(' ',@ARGV)" perl.*
+ perl.c perl.exe perl.h perl.obj
+
+in the following triple quoted manner:
+
+ $ perl -e "print join(' ',@ARGV)" """perl.*"""
+ perl.*
+
+In both the case of unquoted command line arguments or in calls
+to C<glob()> VMS wildcard expansion is performed. (csh-style
+wildcard expansion is available if you use C<File::Glob::glob>.)
+If the wildcard filespec contains a device or directory
+specification, then the resultant filespecs will also contain
+a device and directory; otherwise, device and directory
+information are removed. VMS-style resultant filespecs will
+contain a full device and directory, while Unix-style
+resultant filespecs will contain only as much of a directory
+path as was present in the input filespec. For example, if
+your default directory is Perl_Root:[000000], the expansion
+of C<[.t]*.*> will yield filespecs like
+"perl_root:[t]base.dir", while the expansion of C<t/*/*> will
+yield filespecs like "t/base.dir". (This is done to match
+the behavior of glob expansion performed by Unix shells.)
+
+Similarly, the resultant filespec will contain the file version
+only if one was present in the input filespec.
+
+
+=head2 Pipes
+
+Input and output pipes to Perl filehandles are supported; the
+"file name" is passed to lib$spawn() for asynchronous
+execution. You should be careful to close any pipes you have
+opened in a Perl script, lest you leave any "orphaned"
+subprocesses around when Perl exits.
+
+You may also use backticks to invoke a DCL subprocess, whose
+output is used as the return value of the expression. The
+string between the backticks is handled as if it were the
+argument to the C<system> operator (see below). In this case,
+Perl will wait for the subprocess to complete before continuing.
+
+The mailbox (MBX) that perl can create to communicate with a pipe
+defaults to a buffer size of 512. The default buffer size is
+adjustable via the logical name PERL_MBX_SIZE provided that the
+value falls between 128 and the SYSGEN parameter MAXBUF inclusive.
+For example, to double the MBX size from the default within
+a Perl program, use C<$ENV{'PERL_MBX_SIZE'} = 1024;> and then
+open and use pipe constructs. An alternative would be to issue
+the command:
+
+ $ Define PERL_MBX_SIZE 1024
+
+before running your wide record pipe program. A larger value may
+improve performance at the expense of the BYTLM UAF quota.
+
+=head1 PERL5LIB and PERLLIB
+
+The PERL5LIB and PERLLIB logical names work as documented in L<perl>,
+except that the element separator is '|' instead of ':'. The
+directory specifications may use either VMS or Unix syntax.
+
+=head1 The Perl Forked Debugger
+
+The Perl forked debugger places the debugger commands and output in a
+separate X-11 terminal window so that commands and output from multiple
+processes are not mixed together.
+
+Perl on VMS supports an emulation of the forked debugger when Perl is
+run on a VMS system that has X11 support installed.
+
+To use the forked debugger, you need to have the default display set to an
+X-11 Server and some environment variables set that Unix expects.
+
+The forked debugger requires the environment variable C<TERM> to be C<xterm>,
+and the environment variable C<DISPLAY> to exist. C<xterm> must be in
+lower case.
+
+ $define TERM "xterm"
+
+ $define DISPLAY "hostname:0.0"
+
+Currently the value of C<DISPLAY> is ignored. It is recommended that it be set
+to be the hostname of the display, the server and screen in UNIX notation. In
+the future the value of DISPLAY may be honored by Perl instead of using the
+default display.
+
+It may be helpful to always use the forked debugger so that script I/O is
+separated from debugger I/O. You can force the debugger to be forked by
+assigning a value to the logical name <PERLDB_PIDS> that is not a process
+identification number.
+
+ $define PERLDB_PIDS XXXX
+
+
+=head1 PERL_VMS_EXCEPTION_DEBUG
+
+The PERL_VMS_EXCEPTION_DEBUG being defined as "ENABLE" will cause the VMS
+debugger to be invoked if a fatal exception that is not otherwise
+handled is raised. The purpose of this is to allow debugging of
+internal Perl problems that would cause such a condition.
+
+This allows the programmer to look at the execution stack and variables to
+find out the cause of the exception. As the debugger is being invoked as
+the Perl interpreter is about to do a fatal exit, continuing the execution
+in debug mode is usally not practical.
+
+Starting Perl in the VMS debugger may change the program execution
+profile in a way that such problems are not reproduced.
+
+The C<kill> function can be used to test this functionality from within
+a program.
+
+In typical VMS style, only the first letter of the value of this logical
+name is actually checked in a case insensitive mode, and it is considered
+enabled if it is the value "T","1" or "E".
+
+This logical name must be defined before Perl is started.
+
+=head1 Command line
+
+=head2 I/O redirection and backgrounding
+
+Perl for VMS supports redirection of input and output on the
+command line, using a subset of Bourne shell syntax:
+
+=over 4
+
+=item *
+
+C<E<lt>file> reads stdin from C<file>,
+
+=item *
+
+C<E<gt>file> writes stdout to C<file>,
+
+=item *
+
+C<E<gt>E<gt>file> appends stdout to C<file>,
+
+=item *
+
+C<2E<gt>file> writes stderr to C<file>,
+
+=item *
+
+C<2E<gt>E<gt>file> appends stderr to C<file>, and
+
+=item *
+
+C<< 2>&1 >> redirects stderr to stdout.
+
+=back
+
+In addition, output may be piped to a subprocess, using the
+character '|'. Anything after this character on the command
+line is passed to a subprocess for execution; the subprocess
+takes the output of Perl as its input.
+
+Finally, if the command line ends with '&', the entire
+command is run in the background as an asynchronous
+subprocess.
+
+=head2 Command line switches
+
+The following command line switches behave differently under
+VMS than described in L<perlrun>. Note also that in order
+to pass uppercase switches to Perl, you need to enclose
+them in double-quotes on the command line, since the CRTL
+downcases all unquoted strings.
+
+On newer 64 bit versions of OpenVMS, a process setting now
+controls if the quoting is needed to preserve the case of
+command line arguments.
+
+=over 4
+
+=item -i
+
+If the C<-i> switch is present but no extension for a backup
+copy is given, then inplace editing creates a new version of
+a file; the existing copy is not deleted. (Note that if
+an extension is given, an existing file is renamed to the backup
+file, as is the case under other operating systems, so it does
+not remain as a previous version under the original filename.)
+
+=item -S
+
+If the C<"-S"> or C<-"S"> switch is present I<and> the script
+name does not contain a directory, then Perl translates the
+logical name DCL$PATH as a searchlist, using each translation
+as a directory in which to look for the script. In addition,
+if no file type is specified, Perl looks in each directory
+for a file matching the name specified, with a blank type,
+a type of F<.pl>, and a type of F<.com>, in that order.
+
+=item -u
+
+The C<-u> switch causes the VMS debugger to be invoked
+after the Perl program is compiled, but before it has
+run. It does not create a core dump file.
+
+=back
+
+=head1 Perl functions
+
+As of the time this document was last revised, the following
+Perl functions were implemented in the VMS port of Perl
+(functions marked with * are discussed in more detail below):
+
+ file tests*, abs, alarm, atan, backticks*, binmode*, bless,
+ caller, chdir, chmod, chown, chomp, chop, chr,
+ close, closedir, cos, crypt*, defined, delete, die, do, dump*,
+ each, endgrent, endpwent, eof, eval, exec*, exists, exit, exp,
+ fileno, flock getc, getgrent*, getgrgid*, getgrnam, getlogin, getppid,
+ getpwent*, getpwnam*, getpwuid*, glob, gmtime*, goto,
+ grep, hex, ioctl, import, index, int, join, keys, kill*,
+ last, lc, lcfirst, lchown*, length, link*, local, localtime, log, lstat, m//,
+ map, mkdir, my, next, no, oct, open, opendir, ord, pack,
+ pipe, pop, pos, print, printf, push, q//, qq//, qw//,
+ qx//*, quotemeta, rand, read, readdir, readlink*, redo, ref, rename,
+ require, reset, return, reverse, rewinddir, rindex,
+ rmdir, s///, scalar, seek, seekdir, select(internal),
+ select (system call)*, setgrent, setpwent, shift, sin, sleep,
+ socketpair, sort, splice, split, sprintf, sqrt, srand, stat,
+ study, substr, symlink*, sysread, system*, syswrite, tell,
+ telldir, tie, time, times*, tr///, uc, ucfirst, umask,
+ undef, unlink*, unpack, untie, unshift, use, utime*,
+ values, vec, wait, waitpid*, wantarray, warn, write, y///
+
+The following functions were not implemented in the VMS port,
+and calling them produces a fatal error (usually) or
+undefined behavior (rarely, we hope):
+
+ chroot, dbmclose, dbmopen, fork*, getpgrp, getpriority,
+ msgctl, msgget, msgsend, msgrcv, semctl,
+ semget, semop, setpgrp, setpriority, shmctl, shmget,
+ shmread, shmwrite, syscall
+
+The following functions are available on Perls compiled with Dec C
+5.2 or greater and running VMS 7.0 or greater:
+
+ truncate
+
+The following functions are available on Perls built on VMS 7.2 or
+greater:
+
+ fcntl (without locking)
+
+The following functions may or may not be implemented,
+depending on what type of socket support you've built into
+your copy of Perl:
+
+ accept, bind, connect, getpeername,
+ gethostbyname, getnetbyname, getprotobyname,
+ getservbyname, gethostbyaddr, getnetbyaddr,
+ getprotobynumber, getservbyport, gethostent,
+ getnetent, getprotoent, getservent, sethostent,
+ setnetent, setprotoent, setservent, endhostent,
+ endnetent, endprotoent, endservent, getsockname,
+ getsockopt, listen, recv, select(system call)*,
+ send, setsockopt, shutdown, socket
+
+The following function is available on Perls built on 64 bit OpenVMS v8.2
+with hard links enabled on an ODS-5 formatted build disk. CRTL support
+is in principle available as of OpenVMS v7.3-1, and better configuration
+support could detect this.
+
+ link
+
+The following functions are available on Perls built on 64 bit OpenVMS
+v8.2 and later. CRTL support is in principle available as of OpenVMS
+v7.3-2, and better configuration support could detect this.
+
+ getgrgid, getgrnam, getpwnam, getpwuid,
+ setgrent, ttyname
+
+The following functions are available on Perls built on 64 bit OpenVMS v8.2
+and later.
+
+ statvfs, socketpair
+
+=over 4
+
+=item File tests
+
+The tests C<-b>, C<-B>, C<-c>, C<-C>, C<-d>, C<-e>, C<-f>,
+C<-o>, C<-M>, C<-s>, C<-S>, C<-t>, C<-T>, and C<-z> work as
+advertised. The return values for C<-r>, C<-w>, and C<-x>
+tell you whether you can actually access the file; this may
+not reflect the UIC-based file protections. Since real and
+effective UIC don't differ under VMS, C<-O>, C<-R>, C<-W>,
+and C<-X> are equivalent to C<-o>, C<-r>, C<-w>, and C<-x>.
+Similarly, several other tests, including C<-A>, C<-g>, C<-k>,
+C<-l>, C<-p>, and C<-u>, aren't particularly meaningful under
+VMS, and the values returned by these tests reflect whatever
+your CRTL C<stat()> routine does to the equivalent bits in the
+st_mode field. Finally, C<-d> returns true if passed a device
+specification without an explicit directory (e.g. C<DUA1:>), as
+well as if passed a directory.
+
+There are DECC feature logical names AND ODS-5 volume attributes that
+also control what values are returned for the date fields.
+
+Note: Some sites have reported problems when using the file-access
+tests (C<-r>, C<-w>, and C<-x>) on files accessed via DEC's DFS.
+Specifically, since DFS does not currently provide access to the
+extended file header of files on remote volumes, attempts to
+examine the ACL fail, and the file tests will return false,
+with C<$!> indicating that the file does not exist. You can
+use C<stat> on these files, since that checks UIC-based protection
+only, and then manually check the appropriate bits, as defined by
+your C compiler's F<stat.h>, in the mode value it returns, if you
+need an approximation of the file's protections.
+
+=item backticks
+
+Backticks create a subprocess, and pass the enclosed string
+to it for execution as a DCL command. Since the subprocess is
+created directly via C<lib$spawn()>, any valid DCL command string
+may be specified.
+
+=item binmode FILEHANDLE
+
+The C<binmode> operator will attempt to insure that no translation
+of carriage control occurs on input from or output to this filehandle.
+Since this involves reopening the file and then restoring its
+file position indicator, if this function returns FALSE, the
+underlying filehandle may no longer point to an open file, or may
+point to a different position in the file than before C<binmode>
+was called.
+
+Note that C<binmode> is generally not necessary when using normal
+filehandles; it is provided so that you can control I/O to existing
+record-structured files when necessary. You can also use the
+C<vmsfopen> function in the VMS::Stdio extension to gain finer
+control of I/O to files and devices with different record structures.
+
+=item crypt PLAINTEXT, USER
+
+The C<crypt> operator uses the C<sys$hash_password> system
+service to generate the hashed representation of PLAINTEXT.
+If USER is a valid username, the algorithm and salt values
+are taken from that user's UAF record. If it is not, then
+the preferred algorithm and a salt of 0 are used. The
+quadword encrypted value is returned as an 8-character string.
+
+The value returned by C<crypt> may be compared against
+the encrypted password from the UAF returned by the C<getpw*>
+functions, in order to authenticate users. If you're
+going to do this, remember that the encrypted password in
+the UAF was generated using uppercase username and
+password strings; you'll have to upcase the arguments to
+C<crypt> to insure that you'll get the proper value:
+
+ sub validate_passwd {
+ my($user,$passwd) = @_;
+ my($pwdhash);
+ if ( !($pwdhash = (getpwnam($user))[1]) ||
+ $pwdhash ne crypt("\U$passwd","\U$name") ) {
+ intruder_alert($name);
+ }
+ return 1;
+ }
+
+
+=item die
+
+C<die> will force the native VMS exit status to be an SS$_ABORT code
+if neither of the $! or $? status values are ones that would cause
+the native status to be interpreted as being what VMS classifies as
+SEVERE_ERROR severity for DCL error handling.
+
+When C<PERL_VMS_POSIX_EXIT> is active (see L</"$?"> below), the native VMS exit
+status value will have either one of the C<$!> or C<$?> or C<$^E> or
+the UNIX value 255 encoded into it in a way that the effective original
+value can be decoded by other programs written in C, including Perl
+and the GNV package. As per the normal non-VMS behavior of C<die> if
+either C<$!> or C<$?> are non-zero, one of those values will be
+encoded into a native VMS status value. If both of the UNIX status
+values are 0, and the C<$^E> value is set one of ERROR or SEVERE_ERROR
+severity, then the C<$^E> value will be used as the exit code as is.
+If none of the above apply, the UNIX value of 255 will be encoded into
+a native VMS exit status value.
+
+Please note a significant difference in the behavior of C<die> in
+the C<PERL_VMS_POSIX_EXIT> mode is that it does not force a VMS
+SEVERE_ERROR status on exit. The UNIX exit values of 2 through
+255 will be encoded in VMS status values with severity levels of
+SUCCESS. The UNIX exit value of 1 will be encoded in a VMS status
+value with a severity level of ERROR. This is to be compatible with
+how the VMS C library encodes these values.
+
+The minimum severity level set by C<die> in C<PERL_VMS_POSIX_EXIT> mode
+may be changed to be ERROR or higher in the future depending on the
+results of testing and further review.
+
+See L</"$?"> for a description of the encoding of the UNIX value to
+produce a native VMS status containing it.
+
+
+=item dump
+
+Rather than causing Perl to abort and dump core, the C<dump>
+operator invokes the VMS debugger. If you continue to
+execute the Perl program under the debugger, control will
+be transferred to the label specified as the argument to
+C<dump>, or, if no label was specified, back to the
+beginning of the program. All other state of the program
+(I<e.g.> values of variables, open file handles) are not
+affected by calling C<dump>.
+
+=item exec LIST
+
+A call to C<exec> will cause Perl to exit, and to invoke the command
+given as an argument to C<exec> via C<lib$do_command>. If the
+argument begins with '@' or '$' (other than as part of a filespec),
+then it is executed as a DCL command. Otherwise, the first token on
+the command line is treated as the filespec of an image to run, and
+an attempt is made to invoke it (using F<.Exe> and the process
+defaults to expand the filespec) and pass the rest of C<exec>'s
+argument to it as parameters. If the token has no file type, and
+matches a file with null type, then an attempt is made to determine
+whether the file is an executable image which should be invoked
+using C<MCR> or a text file which should be passed to DCL as a
+command procedure.
+
+=item fork
+
+While in principle the C<fork> operator could be implemented via
+(and with the same rather severe limitations as) the CRTL C<vfork()>
+routine, and while some internal support to do just that is in
+place, the implementation has never been completed, making C<fork>
+currently unavailable. A true kernel C<fork()> is expected in a
+future version of VMS, and the pseudo-fork based on interpreter
+threads may be available in a future version of Perl on VMS (see
+L<perlfork>). In the meantime, use C<system>, backticks, or piped
+filehandles to create subprocesses.
+
+=item getpwent
+
+=item getpwnam
+
+=item getpwuid
+
+These operators obtain the information described in L<perlfunc>,
+if you have the privileges necessary to retrieve the named user's
+UAF information via C<sys$getuai>. If not, then only the C<$name>,
+C<$uid>, and C<$gid> items are returned. The C<$dir> item contains
+the login directory in VMS syntax, while the C<$comment> item
+contains the login directory in Unix syntax. The C<$gcos> item
+contains the owner field from the UAF record. The C<$quota>
+item is not used.
+
+=item gmtime
+
+The C<gmtime> operator will function properly if you have a
+working CRTL C<gmtime()> routine, or if the logical name
+SYS$TIMEZONE_DIFFERENTIAL is defined as the number of seconds
+which must be added to UTC to yield local time. (This logical
+name is defined automatically if you are running a version of
+VMS with built-in UTC support.) If neither of these cases is
+true, a warning message is printed, and C<undef> is returned.
+
+=item kill
+
+In most cases, C<kill> is implemented via the undocumented system
+service <$SIGPRC>, which has the same calling sequence as <$FORCEX>, but
+throws an exception in the target process rather than forcing it to call
+C<$EXIT>. Generally speaking, C<kill> follows the behavior of the
+CRTL's C<kill()> function, but unlike that function can be called from
+within a signal handler. Also, unlike the C<kill> in some versions of
+the CRTL, Perl's C<kill> checks the validity of the signal passed in and
+returns an error rather than attempting to send an unrecognized signal.
+
+Also, negative signal values don't do anything special under
+VMS; they're just converted to the corresponding positive value.
+
+=item qx//
+
+See the entry on C<backticks> above.
+
+=item select (system call)
+
+If Perl was not built with socket support, the system call
+version of C<select> is not available at all. If socket
+support is present, then the system call version of
+C<select> functions only for file descriptors attached
+to sockets. It will not provide information about regular
+files or pipes, since the CRTL C<select()> routine does not
+provide this functionality.
+
+=item stat EXPR
+
+Since VMS keeps track of files according to a different scheme
+than Unix, it's not really possible to represent the file's ID
+in the C<st_dev> and C<st_ino> fields of a C<struct stat>. Perl
+tries its best, though, and the values it uses are pretty unlikely
+to be the same for two different files. We can't guarantee this,
+though, so caveat scriptor.
+
+=item system LIST
+
+The C<system> operator creates a subprocess, and passes its
+arguments to the subprocess for execution as a DCL command.
+Since the subprocess is created directly via C<lib$spawn()>, any
+valid DCL command string may be specified. If the string begins with
+'@', it is treated as a DCL command unconditionally. Otherwise, if
+the first token contains a character used as a delimiter in file
+specification (e.g. C<:> or C<]>), an attempt is made to expand it
+using a default type of F<.Exe> and the process defaults, and if
+successful, the resulting file is invoked via C<MCR>. This allows you
+to invoke an image directly simply by passing the file specification
+to C<system>, a common Unixish idiom. If the token has no file type,
+and matches a file with null type, then an attempt is made to
+determine whether the file is an executable image which should be
+invoked using C<MCR> or a text file which should be passed to DCL
+as a command procedure.
+
+If LIST consists of the empty string, C<system> spawns an
+interactive DCL subprocess, in the same fashion as typing
+B<SPAWN> at the DCL prompt.
+
+Perl waits for the subprocess to complete before continuing
+execution in the current process. As described in L<perlfunc>,
+the return value of C<system> is a fake "status" which follows
+POSIX semantics unless the pragma C<use vmsish 'status'> is in
+effect; see the description of C<$?> in this document for more
+detail.
+
+=item time
+
+The value returned by C<time> is the offset in seconds from
+01-JAN-1970 00:00:00 (just like the CRTL's times() routine), in order
+to make life easier for code coming in from the POSIX/Unix world.
+
+=item times
+
+The array returned by the C<times> operator is divided up
+according to the same rules the CRTL C<times()> routine.
+Therefore, the "system time" elements will always be 0, since
+there is no difference between "user time" and "system" time
+under VMS, and the time accumulated by a subprocess may or may
+not appear separately in the "child time" field, depending on
+whether L<times> keeps track of subprocesses separately. Note
+especially that the VAXCRTL (at least) keeps track only of
+subprocesses spawned using L<fork> and L<exec>; it will not
+accumulate the times of subprocesses spawned via pipes, L<system>,
+or backticks.
+
+=item unlink LIST
+
+C<unlink> will delete the highest version of a file only; in
+order to delete all versions, you need to say
+
+ 1 while unlink LIST;
+
+You may need to make this change to scripts written for a
+Unix system which expect that after a call to C<unlink>,
+no files with the names passed to C<unlink> will exist.
+(Note: This can be changed at compile time; if you
+C<use Config> and C<$Config{'d_unlink_all_versions'}> is
+C<define>, then C<unlink> will delete all versions of a
+file on the first call.)
+
+C<unlink> will delete a file if at all possible, even if it
+requires changing file protection (though it won't try to
+change the protection of the parent directory). You can tell
+whether you've got explicit delete access to a file by using the
+C<VMS::Filespec::candelete> operator. For instance, in order
+to delete only files to which you have delete access, you could
+say something like
+
+ sub safe_unlink {
+ my($file,$num);
+ foreach $file (@_) {
+ next unless VMS::Filespec::candelete($file);
+ $num += unlink $file;
+ }
+ $num;
+ }
+
+(or you could just use C<VMS::Stdio::remove>, if you've installed
+the VMS::Stdio extension distributed with Perl). If C<unlink> has to
+change the file protection to delete the file, and you interrupt it
+in midstream, the file may be left intact, but with a changed ACL
+allowing you delete access.
+
+This behavior of C<unlink> is to be compatible with POSIX behavior
+and not traditional VMS behavior.
+
+=item utime LIST
+
+This operator changes only the modification time of the file (VMS
+revision date) on ODS-2 volumes and ODS-5 volumes without access
+dates enabled. On ODS-5 volumes with access dates enabled, the
+true access time is modified.
+
+=item waitpid PID,FLAGS
+
+If PID is a subprocess started by a piped C<open()> (see L<open>),
+C<waitpid> will wait for that subprocess, and return its final status
+value in C<$?>. If PID is a subprocess created in some other way (e.g.
+SPAWNed before Perl was invoked), C<waitpid> will simply check once per
+second whether the process has completed, and return when it has. (If
+PID specifies a process that isn't a subprocess of the current process,
+and you invoked Perl with the C<-w> switch, a warning will be issued.)
+
+Returns PID on success, -1 on error. The FLAGS argument is ignored
+in all cases.
+
+=back
+
+=head1 Perl variables
+
+The following VMS-specific information applies to the indicated
+"special" Perl variables, in addition to the general information
+in L<perlvar>. Where there is a conflict, this information
+takes precedence.
+
+=over 4
+
+=item %ENV
+
+The operation of the C<%ENV> array depends on the translation
+of the logical name F<PERL_ENV_TABLES>. If defined, it should
+be a search list, each element of which specifies a location
+for C<%ENV> elements. If you tell Perl to read or set the
+element C<$ENV{>I<name>C<}>, then Perl uses the translations of
+F<PERL_ENV_TABLES> as follows:
+
+=over 4
+
+=item CRTL_ENV
+
+This string tells Perl to consult the CRTL's internal C<environ>
+array of key-value pairs, using I<name> as the key. In most cases,
+this contains only a few keys, but if Perl was invoked via the C
+C<exec[lv]e()> function, as is the case for CGI processing by some
+HTTP servers, then the C<environ> array may have been populated by
+the calling program.
+
+=item CLISYM_[LOCAL]
+
+A string beginning with C<CLISYM_>tells Perl to consult the CLI's
+symbol tables, using I<name> as the name of the symbol. When reading
+an element of C<%ENV>, the local symbol table is scanned first, followed
+by the global symbol table.. The characters following C<CLISYM_> are
+significant when an element of C<%ENV> is set or deleted: if the
+complete string is C<CLISYM_LOCAL>, the change is made in the local
+symbol table; otherwise the global symbol table is changed.
+
+=item Any other string
+
+If an element of F<PERL_ENV_TABLES> translates to any other string,
+that string is used as the name of a logical name table, which is
+consulted using I<name> as the logical name. The normal search
+order of access modes is used.
+
+=back
+
+F<PERL_ENV_TABLES> is translated once when Perl starts up; any changes
+you make while Perl is running do not affect the behavior of C<%ENV>.
+If F<PERL_ENV_TABLES> is not defined, then Perl defaults to consulting
+first the logical name tables specified by F<LNM$FILE_DEV>, and then
+the CRTL C<environ> array.
+
+In all operations on %ENV, the key string is treated as if it
+were entirely uppercase, regardless of the case actually
+specified in the Perl expression.
+
+When an element of C<%ENV> is read, the locations to which
+F<PERL_ENV_TABLES> points are checked in order, and the value
+obtained from the first successful lookup is returned. If the
+name of the C<%ENV> element contains a semi-colon, it and
+any characters after it are removed. These are ignored when
+the CRTL C<environ> array or a CLI symbol table is consulted.
+However, the name is looked up in a logical name table, the
+suffix after the semi-colon is treated as the translation index
+to be used for the lookup. This lets you look up successive values
+for search list logical names. For instance, if you say
+
+ $ Define STORY once,upon,a,time,there,was
+ $ perl -e "for ($i = 0; $i <= 6; $i++) " -
+ _$ -e "{ print $ENV{'story;'.$i},' '}"
+
+Perl will print C<ONCE UPON A TIME THERE WAS>, assuming, of course,
+that F<PERL_ENV_TABLES> is set up so that the logical name C<story>
+is found, rather than a CLI symbol or CRTL C<environ> element with
+the same name.
+
+When an element of C<%ENV> is set to a defined string, the
+corresponding definition is made in the location to which the
+first translation of F<PERL_ENV_TABLES> points. If this causes a
+logical name to be created, it is defined in supervisor mode.
+(The same is done if an existing logical name was defined in
+executive or kernel mode; an existing user or supervisor mode
+logical name is reset to the new value.) If the value is an empty
+string, the logical name's translation is defined as a single NUL
+(ASCII 00) character, since a logical name cannot translate to a
+zero-length string. (This restriction does not apply to CLI symbols
+or CRTL C<environ> values; they are set to the empty string.)
+An element of the CRTL C<environ> array can be set only if your
+copy of Perl knows about the CRTL's C<setenv()> function. (This is
+present only in some versions of the DECCRTL; check C<$Config{d_setenv}>
+to see whether your copy of Perl was built with a CRTL that has this
+function.)
+
+When an element of C<%ENV> is set to C<undef>,
+the element is looked up as if it were being read, and if it is
+found, it is deleted. (An item "deleted" from the CRTL C<environ>
+array is set to the empty string; this can only be done if your
+copy of Perl knows about the CRTL C<setenv()> function.) Using
+C<delete> to remove an element from C<%ENV> has a similar effect,
+but after the element is deleted, another attempt is made to
+look up the element, so an inner-mode logical name or a name in
+another location will replace the logical name just deleted.
+In either case, only the first value found searching PERL_ENV_TABLES
+is altered. It is not possible at present to define a search list
+logical name via %ENV.
+
+The element C<$ENV{DEFAULT}> is special: when read, it returns
+Perl's current default device and directory, and when set, it
+resets them, regardless of the definition of F<PERL_ENV_TABLES>.
+It cannot be cleared or deleted; attempts to do so are silently
+ignored.
+
+Note that if you want to pass on any elements of the
+C-local environ array to a subprocess which isn't
+started by fork/exec, or isn't running a C program, you
+can "promote" them to logical names in the current
+process, which will then be inherited by all subprocesses,
+by saying
+
+ foreach my $key (qw[C-local keys you want promoted]) {
+ my $temp = $ENV{$key}; # read from C-local array
+ $ENV{$key} = $temp; # and define as logical name
+ }
+
+(You can't just say C<$ENV{$key} = $ENV{$key}>, since the
+Perl optimizer is smart enough to elide the expression.)
+
+Don't try to clear C<%ENV> by saying C<%ENV = ();>, it will throw
+a fatal error. This is equivalent to doing the following from DCL:
+
+ DELETE/LOGICAL *
+
+You can imagine how bad things would be if, for example, the SYS$MANAGER
+or SYS$SYSTEM logical names were deleted.
+
+At present, the first time you iterate over %ENV using
+C<keys>, or C<values>, you will incur a time penalty as all
+logical names are read, in order to fully populate %ENV.
+Subsequent iterations will not reread logical names, so they
+won't be as slow, but they also won't reflect any changes
+to logical name tables caused by other programs.
+
+You do need to be careful with the logical names representing
+process-permanent files, such as C<SYS$INPUT> and C<SYS$OUTPUT>.
+The translations for these logical names are prepended with a
+two-byte binary value (0x1B 0x00) that needs to be stripped off
+if you wantto use it. (In previous versions of Perl it wasn't
+possible to get the values of these logical names, as the null
+byte acted as an end-of-string marker)
+
+=item $!
+
+The string value of C<$!> is that returned by the CRTL's
+strerror() function, so it will include the VMS message for
+VMS-specific errors. The numeric value of C<$!> is the
+value of C<errno>, except if errno is EVMSERR, in which
+case C<$!> contains the value of vaxc$errno. Setting C<$!>
+always sets errno to the value specified. If this value is
+EVMSERR, it also sets vaxc$errno to 4 (NONAME-F-NOMSG), so
+that the string value of C<$!> won't reflect the VMS error
+message from before C<$!> was set.
+
+=item $^E
+
+This variable provides direct access to VMS status values
+in vaxc$errno, which are often more specific than the
+generic Unix-style error messages in C<$!>. Its numeric value
+is the value of vaxc$errno, and its string value is the
+corresponding VMS message string, as retrieved by sys$getmsg().
+Setting C<$^E> sets vaxc$errno to the value specified.
+
+While Perl attempts to keep the vaxc$errno value to be current, if
+errno is not EVMSERR, it may not be from the current operation.
+
+=item $?
+
+The "status value" returned in C<$?> is synthesized from the
+actual exit status of the subprocess in a way that approximates
+POSIX wait(5) semantics, in order to allow Perl programs to
+portably test for successful completion of subprocesses. The
+low order 8 bits of C<$?> are always 0 under VMS, since the
+termination status of a process may or may not have been
+generated by an exception.
+
+The next 8 bits contain the termination status of the program.
+
+If the child process follows the convention of C programs
+compiled with the _POSIX_EXIT macro set, the status value will
+contain the actual value of 0 to 255 returned by that program
+on a normal exit.
+
+With the _POSIX_EXIT macro set, the UNIX exit value of zero is
+represented as a VMS native status of 1, and the UNIX values
+from 2 to 255 are encoded by the equation:
+
+ VMS_status = 0x35a000 + (unix_value * 8) + 1.
+
+And in the special case of unix value 1 the encoding is:
+
+ VMS_status = 0x35a000 + 8 + 2 + 0x10000000.
+
+For other termination statuses, the severity portion of the
+subprocess' exit status is used: if the severity was success or
+informational, these bits are all 0; if the severity was
+warning, they contain a value of 1; if the severity was
+error or fatal error, they contain the actual severity bits,
+which turns out to be a value of 2 for error and 4 for severe_error.
+Fatal is another term for the severe_error status.
+
+As a result, C<$?> will always be zero if the subprocess' exit
+status indicated successful completion, and non-zero if a
+warning or error occurred or a program compliant with encoding
+_POSIX_EXIT values was run and set a status.
+
+How can you tell the difference between a non-zero status that is
+the result of a VMS native error status or an encoded UNIX status?
+You can not unless you look at the ${^CHILD_ERROR_NATIVE} value.
+The ${^CHILD_ERROR_NATIVE} value returns the actual VMS status value
+and check the severity bits. If the severity bits are equal to 1,
+then if the numeric value for C<$?> is between 2 and 255 or 0, then
+C<$?> accurately reflects a value passed back from a UNIX application.
+If C<$?> is 1, and the severity bits indicate a VMS error (2), then
+C<$?> is from a UNIX application exit value.
+
+In practice, Perl scripts that call programs that return _POSIX_EXIT
+type status values will be expecting those values, and programs that
+call traditional VMS programs will either be expecting the previous
+behavior or just checking for a non-zero status.
+
+And success is always the value 0 in all behaviors.
+
+When the actual VMS termination status of the child is an error,
+internally the C<$!> value will be set to the closest UNIX errno
+value to that error so that Perl scripts that test for error
+messages will see the expected UNIX style error message instead
+of a VMS message.
+
+Conversely, when setting C<$?> in an END block, an attempt is made
+to convert the POSIX value into a native status intelligible to
+the operating system upon exiting Perl. What this boils down to
+is that setting C<$?> to zero results in the generic success value
+SS$_NORMAL, and setting C<$?> to a non-zero value results in the
+generic failure status SS$_ABORT. See also L<perlport/exit>.
+
+With the C<PERL_VMS_POSIX_EXIT> logical name defined as "ENABLE",
+setting C<$?> will cause the new value to be encoded into C<$^E>
+so that either the original parent or child exit status values
+ 0 to 255 can be automatically recovered by C programs expecting
+_POSIX_EXIT behavior. If both a parent and a child exit value are
+non-zero, then it will be assumed that this is actually a VMS native
+status value to be passed through. The special value of 0xFFFF is
+almost a NOOP as it will cause the current native VMS status in the
+C library to become the current native Perl VMS status, and is handled
+this way as it is known to not be a valid native VMS status value.
+It is recommend that only values in the range of normal UNIX parent or
+child status numbers, 0 to 255 are used.
+
+The pragma C<use vmsish 'status'> makes C<$?> reflect the actual
+VMS exit status instead of the default emulation of POSIX status
+described above. This pragma also disables the conversion of
+non-zero values to SS$_ABORT when setting C<$?> in an END
+block (but zero will still be converted to SS$_NORMAL).
+
+Do not use the pragma C<use vmsish 'status'> with C<PERL_VMS_POSIX_EXIT>
+enabled, as they are at times requesting conflicting actions and the
+consequence of ignoring this advice will be undefined to allow future
+improvements in the POSIX exit handling.
+
+In general, with C<PERL_VMS_POSIX_EXIT> enabled, more detailed information
+will be availble in the exit status for DCL scripts or other native VMS tools,
+and will give the expected information for Posix programs. It has not been
+made the default in order to preserve backward compatibility.
+
+N.B. Setting C<DECC$FILENAME_UNIX_REPORT> implicitly enables
+C<PERL_VMS_POSIX_EXIT>.
+
+=item $|
+
+Setting C<$|> for an I/O stream causes data to be flushed
+all the way to disk on each write (I<i.e.> not just to
+the underlying RMS buffers for a file). In other words,
+it's equivalent to calling fflush() and fsync() from C.
+
+=back
+
+=head1 Standard modules with VMS-specific differences
+
+=head2 SDBM_File
+
+SDBM_File works properly on VMS. It has, however, one minor
+difference. The database directory file created has a F<.sdbm_dir>
+extension rather than a F<.dir> extension. F<.dir> files are VMS filesystem
+directory files, and using them for other purposes could cause unacceptable
+problems.
+
+=head1 Revision date
+
+Please see the git repository for revision history.
+
+=head1 AUTHOR
+
+Charles Bailey bailey@cor.newman.upenn.edu
+Craig Berry craigberry@mac.com
+Dan Sugalski dan@sidhe.org
+John Malmberg wb8tyw@qsl.net
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlvos.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlvos.pod
new file mode 100755
index 00000000000..9066297c7b0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlvos.pod
@@ -0,0 +1,163 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.vos - Perl for Stratus VOS
+
+=head1 SYNOPSIS
+
+This file contains notes for building perl on the Stratus VOS
+operating system. Perl is a scripting or macro language that is
+popular on many systems. See L<perlbook> for a number of good
+books on Perl.
+
+These are instructions for building Perl from source. Most
+people can simply download a pre-compiled distribution from the
+VOS anonymous FTP site. This version of Perl is not supported
+on VOS Release 14.2.0 or earlier releases. If you are running
+VOS Release 14.3.0 or later, download Perl from
+ftp://ftp.stratus.com/pub/vos/posix/ga/ga.html. Instructions
+for unbundling the Perl distribution file are at
+ftp://ftp.stratus.com/pub/vos/utility/utility.html.
+
+If you are running VOS Release 14.4.1 or later, you can obtain a
+pre-compiled, supported copy of perl by purchasing Release 2.0.1
+(or later) of the VOS GNU C/C++ and GNU Tools product from
+Stratus Technologies.
+
+=head1 BUILDING PERL FOR VOS
+
+To build perl from its source code on the Stratus Continuum
+platform, you must be have VOS Release 14.5.0 or later, the STCP
+product, and the GNU C/C++ and GNU Tools, Release 2.0.1 or
+later. On the V Series platform you must have VOS Release
+15.0.0 or later, and any version of the GNU C/C++ and GNU Tools
+product.
+
+To build full perl using the supplied Configure script and
+makefiles, change to the "vos" subdirectory and type the command
+"compile_full_perl" or "start_process compile_full_perl". This
+will configure, build, and test perl.
+
+=head1 INSTALLING PERL IN VOS
+
+=over 4
+
+=item 1
+
+If you have built perl using the Configure script, ensure that
+you have modify and default write permission to C<<
+>system>ported >> and all subdirectories. Then type
+
+ gmake install
+
+=item 2
+
+While there are currently no architecture-specific
+extensions or modules distributed with perl, the following
+directories can be used to hold such files:
+
+ >system>ported>lib>perl5>5.9.0>7100
+ >system>ported>lib>perl5>5.9.0>8000
+ >system>ported>lib>perl5>5.9.0>i786
+
+=item 3
+
+Site-specific perl extensions and modules can be installed in one of
+two places. Put architecture-independent files into:
+
+ >system>ported>lib>perl5>site_perl>5.9.0
+
+Put site-specific architecture-dependent files into one of the
+following directories:
+
+ >system>ported>lib>perl5>site_perl>5.9.0>7100
+ >system>ported>lib>perl5>site_perl>5.9.0>8000
+ >system>ported>lib>perl5>site_perl>5.9.0>i786
+
+=item 4
+
+You can examine the @INC variable from within a perl program
+to see the order in which Perl searches these directories.
+
+=back
+
+=head1 USING PERL IN VOS
+
+=head2 Restrictions of Perl on VOS
+
+This port of Perl version 5 to VOS prefers Unix-style,
+slash-separated pathnames over VOS-style greater-than-separated
+pathnames. VOS-style pathnames should work in most contexts, but
+if you have trouble, replace all greater-than characters by slash
+characters. Because the slash character is used as a pathname
+delimiter, Perl cannot process VOS pathnames containing a slash
+character in a directory or file name; these must be renamed.
+
+This port of Perl also uses Unix-epoch date values internally.
+As long as you are dealing with ASCII character string
+representations of dates, this should not be an issue. The
+supported epoch is January 1, 1980 to January 17, 2038.
+
+See the file pod/perlport.pod for more information about the VOS
+port of Perl.
+
+=head2 Handling of underflow and overflow
+
+Prior to VOS Release 14.7.0, VOS does not support automatically
+mapping overflowed floating-point values to +infinity, nor
+automatically mapping underflowed floating-point values to zero,
+unlike many other platforms. The Perl pack function has been
+modified to perform such mapping in software on VOS. Performing
+other floating-point computations that underflow or overflow
+will probably result in SIGFPE. Don't push your luck.
+
+As of VOS Release 14.7.0, the VOS POSIX runtime sets up the
+PA-RISC and IA-32 hardware floating-point status register so
+that the overflow and underflow exceptions do not trap, but
+instead automatically convert the result to infinity or zero, as
+appropriate. As of this writing, there are still floating-point
+operations that can trap, for example, subtracting two infinite
+values. This is recorded as suggestion posix-1022, which has
+been fixed in VOS Release 15.2 and higher.
+
+=head1 TEST STATUS
+
+When Perl 5.9.0 is built using the native build process on VOS
+Release 14.7.0 and GNU C++/GNU Tools 2.0.2a, all but nine
+attempted tests either pass or result in TODO (ignored)
+failures. The tests that fail are:
+
+t/io/dup, test 2
+t/io/tell, test 28
+t/op/pack, test 0
+ext/B/t/bytecode, test 1
+ext/Devel/Peek/t/Peek, test 1
+ext/Encode/t/enc_module, test 1
+ext/IO/t/io_dup, test 2
+lib/ExtUtils/t/MM_Unix, test 94
+lib/Net/ing/t/450_service, test 8
+
+=head1 SUPPORT STATUS
+
+I'm offering this port "as is". You can ask me questions, but I
+can't guarantee I'll be able to answer them. There are some
+excellent books available on the Perl language; consult a book
+seller.
+
+If you want a supported version of perl for VOS, purchase the
+VOS GNU C/C++ and GNU Tools Release 2.0.1 (or later) product from
+Stratus Technologies, along with a support contract (or from
+anyone else who will sell you support).
+
+=head1 AUTHOR
+
+Paul Green (Paul.Green@stratus.com)
+
+=head1 LAST UPDATE
+
+February 7, 2008
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlwin32.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlwin32.pod
new file mode 100755
index 00000000000..992301fbc6e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlwin32.pod
@@ -0,0 +1,1000 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+perlwin32 - Perl under Windows
+
+=head1 SYNOPSIS
+
+These are instructions for building Perl under Windows 9x/NT/2000/XP
+on the Intel x86 and Itanium architectures.
+
+=head1 DESCRIPTION
+
+Before you start, you should glance through the README file
+found in the top-level directory to which the Perl distribution
+was extracted. Make sure you read and understand the terms under
+which this software is being distributed.
+
+Also make sure you read L<BUGS AND CAVEATS> below for the
+known limitations of this port.
+
+The INSTALL file in the perl top-level has much information that is
+only relevant to people building Perl on Unix-like systems. In
+particular, you can safely ignore any information that talks about
+"Configure".
+
+You may also want to look at two other options for building
+a perl that will work on Windows NT: the README.cygwin and
+README.os2 files, each of which give a different set of rules to
+build a Perl that will work on Win32 platforms. Those two methods
+will probably enable you to build a more Unix-compatible perl, but
+you will also need to download and use various other build-time and
+run-time support software described in those files.
+
+This set of instructions is meant to describe a so-called "native"
+port of Perl to Win32 platforms. This includes both 32-bit and
+64-bit Windows operating systems. The resulting Perl requires no
+additional software to run (other than what came with your operating
+system). Currently, this port is capable of using one of the
+following compilers on the Intel x86 architecture:
+
+ Borland C++ version 5.02 or later
+ Microsoft Visual C++ version 2.0 or later
+ MinGW with gcc gcc version 2.95.2 or later
+
+The last of these is a high quality freeware compiler. Use version
+3.2.x or later for the best results with this compiler.
+
+The Borland C++ and Microsoft Visual C++ compilers are also now being given
+away free. The Borland compiler is available as "Borland C++ Compiler Free
+Command Line Tools" and is the same compiler that ships with the full
+"Borland C++ Builder" product. The Microsoft compiler is available as
+"Visual C++ Toolkit 2003" or "Visual C++ 2005/2008 Express Edition" (and also
+as part of the ".NET Framework SDK") and is the same compiler that ships with
+"Visual C++ .NET 2003 Professional" or "Visual C++ 2005/2008 Professional"
+respectively.
+
+This port can also be built on the Intel IA64 using:
+
+ Microsoft Platform SDK Nov 2001 (64-bit compiler and tools)
+
+The MS Platform SDK can be downloaded from http://www.microsoft.com/.
+
+This port fully supports MakeMaker (the set of modules that
+is used to build extensions to perl). Therefore, you should be
+able to build and install most extensions found in the CPAN sites.
+See L<Usage Hints for Perl on Win32> below for general hints about this.
+
+=head2 Setting Up Perl on Win32
+
+=over 4
+
+=item Make
+
+You need a "make" program to build the sources. If you are using
+Visual C++ or the Platform SDK tools under Windows NT/2000/XP, nmake
+will work. All other builds need dmake.
+
+dmake is a freely available make that has very nice macro features
+and parallelability.
+
+A port of dmake for Windows is available from:
+
+ http://search.cpan.org/dist/dmake/
+
+Fetch and install dmake somewhere on your path.
+
+There exists a minor coexistence problem with dmake and Borland C++
+compilers. Namely, if a distribution has C files named with mixed
+case letters, they will be compiled into appropriate .obj-files named
+with all lowercase letters, and every time dmake is invoked
+to bring files up to date, it will try to recompile such files again.
+For example, Tk distribution has a lot of such files, resulting in
+needless recompiles every time dmake is invoked. To avoid this, you
+may use the script "sync_ext.pl" after a successful build. It is
+available in the win32 subdirectory of the Perl source distribution.
+
+=item Command Shell
+
+Use the default "cmd" shell that comes with NT. Some versions of the
+popular 4DOS/NT shell have incompatibilities that may cause you trouble.
+If the build fails under that shell, try building again with the cmd
+shell.
+
+The nmake Makefile also has known incompatibilities with the
+"command.com" shell that comes with Windows 9x. You will need to
+use dmake and makefile.mk to build under Windows 9x.
+
+The surest way to build it is on Windows NT/2000/XP, using the cmd shell.
+
+Make sure the path to the build directory does not contain spaces. The
+build usually works in this circumstance, but some tests will fail.
+
+=item Borland C++
+
+If you are using the Borland compiler, you will need dmake.
+(The make that Borland supplies is seriously crippled and will not
+work for MakeMaker builds.)
+
+See L</"Make"> above.
+
+=item Microsoft Visual C++
+
+The nmake that comes with Visual C++ will suffice for building.
+You will need to run the VCVARS32.BAT file, usually found somewhere
+like C:\MSDEV4.2\BIN or C:\Program Files\Microsoft Visual Studio\VC98\Bin.
+This will set your build environment.
+
+You can also use dmake to build using Visual C++; provided, however,
+you set OSRELEASE to "microsft" (or whatever the directory name
+under which the Visual C dmake configuration lives) in your environment
+and edit win32/config.vc to change "make=nmake" into "make=dmake". The
+latter step is only essential if you want to use dmake as your default
+make for building extensions using MakeMaker.
+
+=item Microsoft Visual C++ 2008 Express Edition
+
+This free version of Visual C++ 2008 Professional contains the same compiler
+and linker that ship with the full version, and also contains everything
+necessary to build Perl, rather than requiring a separate download of the
+Platform SDK like previous versions did.
+
+This package can be downloaded by searching for "Visual Studio 2008 Express
+Edition" in the Download Center at
+http://www.microsoft.com/downloads/search.aspx?displaylang=en. (Providing exact
+links to these packages has proven a pointless task because the links keep on
+changing so often.)
+
+Install Visual C++ 2008, then setup your environment using
+
+ C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat
+
+(assuming the default installation location was chosen).
+
+Perl should now build using the win32/Makefile. You will need to edit that
+file to set
+
+ CCTYPE = MSVC90FREE
+
+first.
+
+=item Microsoft Visual C++ 2005 Express Edition
+
+This free version of Visual C++ 2005 Professional contains the same compiler
+and linker that ship with the full version, but doesn't contain everything
+necessary to build Perl.
+
+You will also need to download the "Platform SDK" (the "Core SDK" and "MDAC
+SDK" components are required) for more header files and libraries.
+
+These packages can both be downloaded by searching in the Download Center at
+http://www.microsoft.com/downloads/search.aspx?displaylang=en. (Providing exact
+links to these packages has proven a pointless task because the links keep on
+changing so often.)
+
+Try to obtain the latest version of the Platform SDK. Sometimes these packages
+contain a particular Windows OS version in their name, but actually work on
+other OS versions too. For example, the "Windows Server 2003 R2 Platform SDK"
+also runs on Windows XP SP2 and Windows 2000.
+
+According to the download pages these packages are only supported on Windows
+2000/XP/2003, so trying to use these tools on Windows 95/98/ME and even Windows
+NT probably won't work.
+
+Install Visual C++ 2005 first, then the Platform SDK. Setup your environment
+as follows (assuming default installation locations were chosen):
+
+ SET PlatformSDKDir=C:\Program Files\Microsoft Platform SDK
+
+ SET PATH=%SystemRoot%\system32;%SystemRoot%;C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;C:\Program Files\Microsoft Visual Studio 8\VC\BIN;C:\Program Files\Microsoft Visual Studio 8\Common7\Tools;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\bin;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 8\VC\VCPackages;%PlatformSDKDir%\Bin
+
+ SET INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;%PlatformSDKDir%\include
+
+ SET LIB=C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\lib;%PlatformSDKDir%\lib
+
+ SET LIBPATH=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
+
+(The PlatformSDKDir might need to be set differently depending on which version
+you are using. Earlier versions installed into "C:\Program Files\Microsoft SDK",
+while the latest versions install into version-specific locations such as
+"C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2".)
+
+Perl should now build using the win32/Makefile. You will need to edit that
+file to set
+
+ CCTYPE = MSVC80FREE
+
+and to set CCHOME, CCINCDIR and CCLIBDIR as per the environment setup above.
+
+=item Microsoft Visual C++ Toolkit 2003
+
+This free toolkit contains the same compiler and linker that ship with
+Visual C++ .NET 2003 Professional, but doesn't contain everything
+necessary to build Perl.
+
+You will also need to download the "Platform SDK" (the "Core SDK" and "MDAC
+SDK" components are required) for header files, libraries and rc.exe, and
+".NET Framework SDK" for more libraries and nmake.exe. Note that the latter
+(which also includes the free compiler and linker) requires the ".NET
+Framework Redistributable" to be installed first. This can be downloaded and
+installed separately, but is included in the "Visual C++ Toolkit 2003" anyway.
+
+These packages can all be downloaded by searching in the Download Center at
+http://www.microsoft.com/downloads/search.aspx?displaylang=en. (Providing exact
+links to these packages has proven a pointless task because the links keep on
+changing so often.)
+
+Try to obtain the latest version of the Platform SDK. Sometimes these packages
+contain a particular Windows OS version in their name, but actually work on
+other OS versions too. For example, the "Windows Server 2003 R2 Platform SDK"
+also runs on Windows XP SP2 and Windows 2000.
+
+According to the download pages these packages are only supported on Windows
+2000/XP/2003, so trying to use these tools on Windows 95/98/ME and even Windows
+NT probably won't work.
+
+Install the Toolkit first, then the Platform SDK, then the .NET Framework SDK.
+Setup your environment as follows (assuming default installation locations
+were chosen):
+
+ SET PlatformSDKDir=C:\Program Files\Microsoft Platform SDK
+
+ SET PATH=%SystemRoot%\system32;%SystemRoot%;C:\Program Files\Microsoft Visual C++ Toolkit 2003\bin;%PlatformSDKDir%\Bin;C:\Program Files\Microsoft.NET\SDK\v1.1\Bin
+
+ SET INCLUDE=C:\Program Files\Microsoft Visual C++ Toolkit 2003\include;%PlatformSDKDir%\include;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include
+
+ SET LIB=C:\Program Files\Microsoft Visual C++ Toolkit 2003\lib;%PlatformSDKDir%\lib;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib
+
+(The PlatformSDKDir might need to be set differently depending on which version
+you are using. Earlier versions installed into "C:\Program Files\Microsoft SDK",
+while the latest versions install into version-specific locations such as
+"C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2".)
+
+Several required files will still be missing:
+
+=over 4
+
+=item *
+
+cvtres.exe is required by link.exe when using a .res file. It is actually
+installed by the .NET Framework SDK, but into a location such as the
+following:
+
+ C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322
+
+Copy it from there to %PlatformSDKDir%\Bin
+
+=item *
+
+lib.exe is normally used to build libraries, but link.exe with the /lib
+option also works, so change win32/config.vc to use it instead:
+
+Change the line reading:
+
+ ar='lib'
+
+to:
+
+ ar='link /lib'
+
+It may also be useful to create a batch file called lib.bat in
+C:\Program Files\Microsoft Visual C++ Toolkit 2003\bin containing:
+
+ @echo off
+ link /lib %*
+
+for the benefit of any naughty C extension modules that you might want to build
+later which explicitly reference "lib" rather than taking their value from
+$Config{ar}.
+
+=item *
+
+setargv.obj is required to build perlglob.exe (and perl.exe if the USE_SETARGV
+option is enabled). The Platform SDK supplies this object file in source form
+in %PlatformSDKDir%\src\crt. Copy setargv.c, cruntime.h and
+internal.h from there to some temporary location and build setargv.obj using
+
+ cl.exe /c /I. /D_CRTBLD setargv.c
+
+Then copy setargv.obj to %PlatformSDKDir%\lib
+
+Alternatively, if you don't need perlglob.exe and don't need to enable the
+USE_SETARGV option then you can safely just remove all mention of $(GLOBEXE)
+from win32/Makefile and setargv.obj won't be required anyway.
+
+=back
+
+Perl should now build using the win32/Makefile. You will need to edit that
+file to set
+
+ CCTYPE = MSVC70FREE
+
+and to set CCHOME, CCINCDIR and CCLIBDIR as per the environment setup above.
+
+=item Microsoft Platform SDK 64-bit Compiler
+
+The nmake that comes with the Platform SDK will suffice for building
+Perl. Make sure you are building within one of the "Build Environment"
+shells available after you install the Platform SDK from the Start Menu.
+
+=item MinGW release 3 with gcc
+
+The latest release of MinGW at the time of writing is 3.1.0, which contains
+gcc-3.2.3. It can be downloaded here:
+
+ http://www.mingw.org/
+
+Perl also compiles with earlier releases of gcc (2.95.2 and up). See below
+for notes about using earlier versions of MinGW/gcc.
+
+You also need dmake. See L</"Make"> above on how to get it.
+
+=item MinGW release 1 with gcc
+
+The MinGW-1.1 bundle contains gcc-2.95.3.
+
+Make sure you install the binaries that work with MSVCRT.DLL as indicated
+in the README for the GCC bundle. You may need to set up a few environment
+variables (usually ran from a batch file).
+
+There are a couple of problems with the version of gcc-2.95.2-msvcrt.exe
+released 7 November 1999:
+
+=over
+
+=item *
+
+It left out a fix for certain command line quotes. To fix this, be sure
+to download and install the file fixes/quote-fix-msvcrt.exe from the above
+ftp location.
+
+=item *
+
+The definition of the fpos_t type in stdio.h may be wrong. If your
+stdio.h has this problem, you will see an exception when running the
+test t/lib/io_xs.t. To fix this, change the typedef for fpos_t from
+"long" to "long long" in the file i386-mingw32msvc/include/stdio.h,
+and rebuild.
+
+=back
+
+A potentially simpler to install (but probably soon-to-be-outdated) bundle
+of the above package with the mentioned fixes already applied is available
+here:
+
+ http://downloads.ActiveState.com/pub/staff/gsar/gcc-2.95.2-msvcrt.zip
+ ftp://ftp.ActiveState.com/pub/staff/gsar/gcc-2.95.2-msvcrt.zip
+
+=back
+
+=head2 Building
+
+=over 4
+
+=item *
+
+Make sure you are in the "win32" subdirectory under the perl toplevel.
+This directory contains a "Makefile" that will work with
+versions of nmake that come with Visual C++ or the Platform SDK, and
+a dmake "makefile.mk" that will work for all supported compilers. The
+defaults in the dmake makefile are setup to build using MinGW/gcc.
+
+=item *
+
+Edit the makefile.mk (or Makefile, if you're using nmake) and change
+the values of INST_DRV and INST_TOP. You can also enable various
+build flags. These are explained in the makefiles.
+
+Note that it is generally not a good idea to try to build a perl with
+INST_DRV and INST_TOP set to a path that already exists from a previous
+build. In particular, this may cause problems with the
+lib/ExtUtils/t/Embed.t test, which attempts to build a test program and
+may end up building against the installed perl's lib/CORE directory rather
+than the one being tested.
+
+You will have to make sure that CCTYPE is set correctly and that
+CCHOME points to wherever you installed your compiler.
+
+The default value for CCHOME in the makefiles for Visual C++
+may not be correct for some versions. Make sure the default exists
+and is valid.
+
+You may also need to comment out the C<DELAYLOAD = ...> line in the
+Makefile if you're using VC++ 6.0 without the latest service pack and
+the linker reports an internal error.
+
+If you are using VC++ 4.2 or earlier then you'll have to change the /EHsc
+option in the CXX_FLAG macro to the equivalent /GX option.
+
+If you have either the source or a library that contains des_fcrypt(),
+enable the appropriate option in the makefile. A ready-to-use version
+of fcrypt.c, based on the version originally written by Eric Young at
+ftp://ftp.funet.fi/pub/crypt/mirrors/dsi/libdes/, is bundled with the
+distribution and CRYPT_SRC is set to use it.
+Alternatively, if you have built a library that contains des_fcrypt(),
+you can set CRYPT_LIB to point to the library name.
+Perl will also build without des_fcrypt(), but the crypt() builtin will
+fail at run time.
+
+If you want build some core extensions statically into perl's dll, specify
+them in the STATIC_EXT macro.
+
+Be sure to read the instructions near the top of the makefiles carefully.
+
+=item *
+
+Type "dmake" (or "nmake" if you are using that make).
+
+This should build everything. Specifically, it will create perl.exe,
+perl510.dll at the perl toplevel, and various other extension dll's
+under the lib\auto directory. If the build fails for any reason, make
+sure you have done the previous steps correctly.
+
+=back
+
+=head2 Testing Perl on Win32
+
+Type "dmake test" (or "nmake test"). This will run most of the tests from
+the testsuite (many tests will be skipped).
+
+There should be no test failures when running under Windows NT/2000/XP.
+Many tests I<will> fail under Windows 9x due to the inferior command shell.
+
+Some test failures may occur if you use a command shell other than the
+native "cmd.exe", or if you are building from a path that contains
+spaces. So don't do that.
+
+If you are running the tests from a emacs shell window, you may see
+failures in op/stat.t. Run "dmake test-notty" in that case.
+
+If you're using the Borland compiler, you may see a failure in op/taint.t
+arising from the inability to find the Borland Runtime DLLs on the system
+default path. You will need to copy the DLLs reported by the messages
+from where Borland chose to install it, into the Windows system directory
+(usually somewhere like C:\WINNT\SYSTEM32) and rerun the test.
+
+If you're using Borland compiler versions 5.2 and below, you may run into
+problems finding the correct header files when building extensions. For
+example, building the "Tk" extension may fail because both perl and Tk
+contain a header file called "patchlevel.h". The latest Borland compiler
+(v5.5) is free of this misbehaviour, and it even supports an
+option -VI- for backward (bugward) compatibility for using the old Borland
+search algorithm to locate header files.
+
+If you run the tests on a FAT partition, you may see some failures for
+C<link()> related tests (I<op/write.t>, I<op/stat.t> ...). Testing on
+NTFS avoids these errors.
+
+Furthermore, you should make sure that during C<make test> you do not
+have any GNU tool packages in your path: some toolkits like Unixutils
+include some tools (C<type> for instance) which override the Windows
+ones and makes tests fail. Remove them from your path while testing to
+avoid these errors.
+
+Please report any other failures as described under L<BUGS AND CAVEATS>.
+
+=head2 Installation of Perl on Win32
+
+Type "dmake install" (or "nmake install"). This will put the newly
+built perl and the libraries under whatever C<INST_TOP> points to in the
+Makefile. It will also install the pod documentation under
+C<$INST_TOP\$INST_VER\lib\pod> and HTML versions of the same under
+C<$INST_TOP\$INST_VER\lib\pod\html>.
+
+To use the Perl you just installed you will need to add a new entry to
+your PATH environment variable: C<$INST_TOP\bin>, e.g.
+
+ set PATH=c:\perl\bin;%PATH%
+
+If you opted to uncomment C<INST_VER> and C<INST_ARCH> in the makefile
+then the installation structure is a little more complicated and you will
+need to add two new PATH components instead: C<$INST_TOP\$INST_VER\bin> and
+C<$INST_TOP\$INST_VER\bin\$ARCHNAME>, e.g.
+
+ set PATH=c:\perl\5.6.0\bin;c:\perl\5.6.0\bin\MSWin32-x86;%PATH%
+
+=head2 Usage Hints for Perl on Win32
+
+=over 4
+
+=item Environment Variables
+
+The installation paths that you set during the build get compiled
+into perl, so you don't have to do anything additional to start
+using that perl (except add its location to your PATH variable).
+
+If you put extensions in unusual places, you can set PERL5LIB
+to a list of paths separated by semicolons where you want perl
+to look for libraries. Look for descriptions of other environment
+variables you can set in L<perlrun>.
+
+You can also control the shell that perl uses to run system() and
+backtick commands via PERL5SHELL. See L<perlrun>.
+
+Perl does not depend on the registry, but it can look up certain default
+values if you choose to put them there. Perl attempts to read entries from
+C<HKEY_CURRENT_USER\Software\Perl> and C<HKEY_LOCAL_MACHINE\Software\Perl>.
+Entries in the former override entries in the latter. One or more of the
+following entries (of type REG_SZ or REG_EXPAND_SZ) may be set:
+
+ lib-$] version-specific standard library path to add to @INC
+ lib standard library path to add to @INC
+ sitelib-$] version-specific site library path to add to @INC
+ sitelib site library path to add to @INC
+ vendorlib-$] version-specific vendor library path to add to @INC
+ vendorlib vendor library path to add to @INC
+ PERL* fallback for all %ENV lookups that begin with "PERL"
+
+Note the C<$]> in the above is not literal. Substitute whatever version
+of perl you want to honor that entry, e.g. C<5.6.0>. Paths must be
+separated with semicolons, as usual on win32.
+
+=item File Globbing
+
+By default, perl handles file globbing using the File::Glob extension,
+which provides portable globbing.
+
+If you want perl to use globbing that emulates the quirks of DOS
+filename conventions, you might want to consider using File::DosGlob
+to override the internal glob() implementation. See L<File::DosGlob> for
+details.
+
+=item Using perl from the command line
+
+If you are accustomed to using perl from various command-line
+shells found in UNIX environments, you will be less than pleased
+with what Windows offers by way of a command shell.
+
+The crucial thing to understand about the Windows environment is that
+the command line you type in is processed twice before Perl sees it.
+First, your command shell (usually CMD.EXE on Windows NT, and
+COMMAND.COM on Windows 9x) preprocesses the command line, to handle
+redirection, environment variable expansion, and location of the
+executable to run. Then, the perl executable splits the remaining
+command line into individual arguments, using the C runtime library
+upon which Perl was built.
+
+It is particularly important to note that neither the shell nor the C
+runtime do any wildcard expansions of command-line arguments (so
+wildcards need not be quoted). Also, the quoting behaviours of the
+shell and the C runtime are rudimentary at best (and may, if you are
+using a non-standard shell, be inconsistent). The only (useful) quote
+character is the double quote ("). It can be used to protect spaces
+and other special characters in arguments.
+
+The Windows NT documentation has almost no description of how the
+quoting rules are implemented, but here are some general observations
+based on experiments: The C runtime breaks arguments at spaces and
+passes them to programs in argc/argv. Double quotes can be used to
+prevent arguments with spaces in them from being split up. You can
+put a double quote in an argument by escaping it with a backslash and
+enclosing the whole argument within double quotes. The backslash and
+the pair of double quotes surrounding the argument will be stripped by
+the C runtime.
+
+The file redirection characters "E<lt>", "E<gt>", and "|" can be quoted by
+double quotes (although there are suggestions that this may not always
+be true). Single quotes are not treated as quotes by the shell or
+the C runtime, they don't get stripped by the shell (just to make
+this type of quoting completely useless). The caret "^" has also
+been observed to behave as a quoting character, but this appears
+to be a shell feature, and the caret is not stripped from the command
+line, so Perl still sees it (and the C runtime phase does not treat
+the caret as a quote character).
+
+Here are some examples of usage of the "cmd" shell:
+
+This prints two doublequotes:
+
+ perl -e "print '\"\"' "
+
+This does the same:
+
+ perl -e "print \"\\\"\\\"\" "
+
+This prints "bar" and writes "foo" to the file "blurch":
+
+ perl -e "print 'foo'; print STDERR 'bar'" > blurch
+
+This prints "foo" ("bar" disappears into nowhereland):
+
+ perl -e "print 'foo'; print STDERR 'bar'" 2> nul
+
+This prints "bar" and writes "foo" into the file "blurch":
+
+ perl -e "print 'foo'; print STDERR 'bar'" 1> blurch
+
+This pipes "foo" to the "less" pager and prints "bar" on the console:
+
+ perl -e "print 'foo'; print STDERR 'bar'" | less
+
+This pipes "foo\nbar\n" to the less pager:
+
+ perl -le "print 'foo'; print STDERR 'bar'" 2>&1 | less
+
+This pipes "foo" to the pager and writes "bar" in the file "blurch":
+
+ perl -e "print 'foo'; print STDERR 'bar'" 2> blurch | less
+
+
+Discovering the usefulness of the "command.com" shell on Windows 9x
+is left as an exercise to the reader :)
+
+One particularly pernicious problem with the 4NT command shell for
+Windows NT is that it (nearly) always treats a % character as indicating
+that environment variable expansion is needed. Under this shell, it is
+therefore important to always double any % characters which you want
+Perl to see (for example, for hash variables), even when they are
+quoted.
+
+=item Building Extensions
+
+The Comprehensive Perl Archive Network (CPAN) offers a wealth
+of extensions, some of which require a C compiler to build.
+Look in http://www.cpan.org/ for more information on CPAN.
+
+Note that not all of the extensions available from CPAN may work
+in the Win32 environment; you should check the information at
+http://testers.cpan.org/ before investing too much effort into
+porting modules that don't readily build.
+
+Most extensions (whether they require a C compiler or not) can
+be built, tested and installed with the standard mantra:
+
+ perl Makefile.PL
+ $MAKE
+ $MAKE test
+ $MAKE install
+
+where $MAKE is whatever 'make' program you have configured perl to
+use. Use "perl -V:make" to find out what this is. Some extensions
+may not provide a testsuite (so "$MAKE test" may not do anything or
+fail), but most serious ones do.
+
+It is important that you use a supported 'make' program, and
+ensure Config.pm knows about it. If you don't have nmake, you can
+either get dmake from the location mentioned earlier or get an
+old version of nmake reportedly available from:
+
+ http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/nmake15.exe
+
+Another option is to use the make written in Perl, available from
+CPAN.
+
+ http://www.cpan.org/modules/by-module/Make/
+
+You may also use dmake. See L</"Make"> above on how to get it.
+
+Note that MakeMaker actually emits makefiles with different syntax
+depending on what 'make' it thinks you are using. Therefore, it is
+important that one of the following values appears in Config.pm:
+
+ make='nmake' # MakeMaker emits nmake syntax
+ make='dmake' # MakeMaker emits dmake syntax
+ any other value # MakeMaker emits generic make syntax
+ (e.g GNU make, or Perl make)
+
+If the value doesn't match the 'make' program you want to use,
+edit Config.pm to fix it.
+
+If a module implements XSUBs, you will need one of the supported
+C compilers. You must make sure you have set up the environment for
+the compiler for command-line compilation.
+
+If a module does not build for some reason, look carefully for
+why it failed, and report problems to the module author. If
+it looks like the extension building support is at fault, report
+that with full details of how the build failed using the perlbug
+utility.
+
+=item Command-line Wildcard Expansion
+
+The default command shells on DOS descendant operating systems (such
+as they are) usually do not expand wildcard arguments supplied to
+programs. They consider it the application's job to handle that.
+This is commonly achieved by linking the application (in our case,
+perl) with startup code that the C runtime libraries usually provide.
+However, doing that results in incompatible perl versions (since the
+behavior of the argv expansion code differs depending on the
+compiler, and it is even buggy on some compilers). Besides, it may
+be a source of frustration if you use such a perl binary with an
+alternate shell that *does* expand wildcards.
+
+Instead, the following solution works rather well. The nice things
+about it are 1) you can start using it right away; 2) it is more
+powerful, because it will do the right thing with a pattern like
+*/*/*.c; 3) you can decide whether you do/don't want to use it; and
+4) you can extend the method to add any customizations (or even
+entirely different kinds of wildcard expansion).
+
+ C:\> copy con c:\perl\lib\Wild.pm
+ # Wild.pm - emulate shell @ARGV expansion on shells that don't
+ use File::DosGlob;
+ @ARGV = map {
+ my @g = File::DosGlob::glob($_) if /[*?]/;
+ @g ? @g : $_;
+ } @ARGV;
+ 1;
+ ^Z
+ C:\> set PERL5OPT=-MWild
+ C:\> perl -le "for (@ARGV) { print }" */*/perl*.c
+ p4view/perl/perl.c
+ p4view/perl/perlio.c
+ p4view/perl/perly.c
+ perl5.005/win32/perlglob.c
+ perl5.005/win32/perllib.c
+ perl5.005/win32/perlglob.c
+ perl5.005/win32/perllib.c
+ perl5.005/win32/perlglob.c
+ perl5.005/win32/perllib.c
+
+Note there are two distinct steps there: 1) You'll have to create
+Wild.pm and put it in your perl lib directory. 2) You'll need to
+set the PERL5OPT environment variable. If you want argv expansion
+to be the default, just set PERL5OPT in your default startup
+environment.
+
+If you are using the Visual C compiler, you can get the C runtime's
+command line wildcard expansion built into perl binary. The resulting
+binary will always expand unquoted command lines, which may not be
+what you want if you use a shell that does that for you. The expansion
+done is also somewhat less powerful than the approach suggested above.
+
+=item Win32 Specific Extensions
+
+A number of extensions specific to the Win32 platform are available
+from CPAN. You may find that many of these extensions are meant to
+be used under the Activeware port of Perl, which used to be the only
+native port for the Win32 platform. Since the Activeware port does not
+have adequate support for Perl's extension building tools, these
+extensions typically do not support those tools either and, therefore,
+cannot be built using the generic steps shown in the previous section.
+
+To ensure smooth transitioning of existing code that uses the
+ActiveState port, there is a bundle of Win32 extensions that contains
+all of the ActiveState extensions and several other Win32 extensions from
+CPAN in source form, along with many added bugfixes, and with MakeMaker
+support. The latest version of this bundle is available at:
+
+ http://search.cpan.org/dist/libwin32/
+
+See the README in that distribution for building and installation
+instructions.
+
+=item Notes on 64-bit Windows
+
+Windows .NET Server supports the LLP64 data model on the Intel Itanium
+architecture.
+
+The LLP64 data model is different from the LP64 data model that is the
+norm on 64-bit Unix platforms. In the former, C<int> and C<long> are
+both 32-bit data types, while pointers are 64 bits wide. In addition,
+there is a separate 64-bit wide integral type, C<__int64>. In contrast,
+the LP64 data model that is pervasive on Unix platforms provides C<int>
+as the 32-bit type, while both the C<long> type and pointers are of
+64-bit precision. Note that both models provide for 64-bits of
+addressability.
+
+64-bit Windows running on Itanium is capable of running 32-bit x86
+binaries transparently. This means that you could use a 32-bit build
+of Perl on a 64-bit system. Given this, why would one want to build
+a 64-bit build of Perl? Here are some reasons why you would bother:
+
+=over
+
+=item *
+
+A 64-bit native application will run much more efficiently on
+Itanium hardware.
+
+=item *
+
+There is no 2GB limit on process size.
+
+=item *
+
+Perl automatically provides large file support when built under
+64-bit Windows.
+
+=item *
+
+Embedding Perl inside a 64-bit application.
+
+=back
+
+=back
+
+=head2 Running Perl Scripts
+
+Perl scripts on UNIX use the "#!" (a.k.a "shebang") line to
+indicate to the OS that it should execute the file using perl.
+Win32 has no comparable means to indicate arbitrary files are
+executables.
+
+Instead, all available methods to execute plain text files on
+Win32 rely on the file "extension". There are three methods
+to use this to execute perl scripts:
+
+=over 8
+
+=item 1
+
+There is a facility called "file extension associations" that will
+work in Windows NT 4.0. This can be manipulated via the two
+commands "assoc" and "ftype" that come standard with Windows NT
+4.0. Type "ftype /?" for a complete example of how to set this
+up for perl scripts (Say what? You thought Windows NT wasn't
+perl-ready? :).
+
+=item 2
+
+Since file associations don't work everywhere, and there are
+reportedly bugs with file associations where it does work, the
+old method of wrapping the perl script to make it look like a
+regular batch file to the OS, may be used. The install process
+makes available the "pl2bat.bat" script which can be used to wrap
+perl scripts into batch files. For example:
+
+ pl2bat foo.pl
+
+will create the file "FOO.BAT". Note "pl2bat" strips any
+.pl suffix and adds a .bat suffix to the generated file.
+
+If you use the 4DOS/NT or similar command shell, note that
+"pl2bat" uses the "%*" variable in the generated batch file to
+refer to all the command line arguments, so you may need to make
+sure that construct works in batch files. As of this writing,
+4DOS/NT users will need a "ParameterChar = *" statement in their
+4NT.INI file or will need to execute "setdos /p*" in the 4DOS/NT
+startup file to enable this to work.
+
+=item 3
+
+Using "pl2bat" has a few problems: the file name gets changed,
+so scripts that rely on C<$0> to find what they must do may not
+run properly; running "pl2bat" replicates the contents of the
+original script, and so this process can be maintenance intensive
+if the originals get updated often. A different approach that
+avoids both problems is possible.
+
+A script called "runperl.bat" is available that can be copied
+to any filename (along with the .bat suffix). For example,
+if you call it "foo.bat", it will run the file "foo" when it is
+executed. Since you can run batch files on Win32 platforms simply
+by typing the name (without the extension), this effectively
+runs the file "foo", when you type either "foo" or "foo.bat".
+With this method, "foo.bat" can even be in a different location
+than the file "foo", as long as "foo" is available somewhere on
+the PATH. If your scripts are on a filesystem that allows symbolic
+links, you can even avoid copying "runperl.bat".
+
+Here's a diversion: copy "runperl.bat" to "runperl", and type
+"runperl". Explain the observed behavior, or lack thereof. :)
+Hint: .gnidnats llits er'uoy fi ,"lrepnur" eteled :tniH
+
+=back
+
+=head2 Miscellaneous Things
+
+A full set of HTML documentation is installed, so you should be
+able to use it if you have a web browser installed on your
+system.
+
+C<perldoc> is also a useful tool for browsing information contained
+in the documentation, especially in conjunction with a pager
+like C<less> (recent versions of which have Win32 support). You may
+have to set the PAGER environment variable to use a specific pager.
+"perldoc -f foo" will print information about the perl operator
+"foo".
+
+One common mistake when using this port with a GUI library like C<Tk>
+is assuming that Perl's normal behavior of opening a command-line
+window will go away. This isn't the case. If you want to start a copy
+of C<perl> without opening a command-line window, use the C<wperl>
+executable built during the installation process. Usage is exactly
+the same as normal C<perl> on Win32, except that options like C<-h>
+don't work (since they need a command-line window to print to).
+
+If you find bugs in perl, you can run C<perlbug> to create a
+bug report (you may have to send it manually if C<perlbug> cannot
+find a mailer on your system).
+
+=head1 BUGS AND CAVEATS
+
+Norton AntiVirus interferes with the build process, particularly if
+set to "AutoProtect, All Files, when Opened". Unlike large applications
+the perl build process opens and modifies a lot of files. Having the
+the AntiVirus scan each and every one slows build the process significantly.
+Worse, with PERLIO=stdio the build process fails with peculiar messages
+as the virus checker interacts badly with miniperl.exe writing configure
+files (it seems to either catch file part written and treat it as suspicious,
+or virus checker may have it "locked" in a way which inhibits miniperl
+updating it). The build does complete with
+
+ set PERLIO=perlio
+
+but that may be just luck. Other AntiVirus software may have similar issues.
+
+Some of the built-in functions do not act exactly as documented in
+L<perlfunc>, and a few are not implemented at all. To avoid
+surprises, particularly if you have had prior exposure to Perl
+in other operating environments or if you intend to write code
+that will be portable to other environments, see L<perlport>
+for a reasonably definitive list of these differences.
+
+Not all extensions available from CPAN may build or work properly
+in the Win32 environment. See L</"Building Extensions">.
+
+Most C<socket()> related calls are supported, but they may not
+behave as on Unix platforms. See L<perlport> for the full list.
+Perl requires Winsock2 to be installed on the system. If you're
+running Win95, you can download Winsock upgrade from here:
+
+http://www.microsoft.com/windows95/downloads/contents/WUAdminTools/S_WUNetworkingTools/W95Sockets2/Default.asp
+
+Later OS versions already include Winsock2 support.
+
+Signal handling may not behave as on Unix platforms (where it
+doesn't exactly "behave", either :). For instance, calling C<die()>
+or C<exit()> from signal handlers will cause an exception, since most
+implementations of C<signal()> on Win32 are severely crippled.
+Thus, signals may work only for simple things like setting a flag
+variable in the handler. Using signals under this port should
+currently be considered unsupported.
+
+Please send detailed descriptions of any problems and solutions that
+you may find to E<lt>F<perlbug@perl.org>E<gt>, along with the output
+produced by C<perl -V>.
+
+=head1 ACKNOWLEDGEMENTS
+
+The use of a camel with the topic of Perl is a trademark
+of O'Reilly and Associates, Inc. Used with permission.
+
+=head1 AUTHORS
+
+=over 4
+
+=item Gary Ng E<lt>71564.1743@CompuServe.COME<gt>
+
+=item Gurusamy Sarathy E<lt>gsar@activestate.comE<gt>
+
+=item Nick Ing-Simmons E<lt>nick@ing-simmons.netE<gt>
+
+=item Jan Dubois E<lt>jand@activestate.comE<gt>
+
+=item Steve Hay E<lt>steve.hay@uk.radan.comE<gt>
+
+=back
+
+This document is maintained by Jan Dubois.
+
+=head1 SEE ALSO
+
+L<perl>
+
+=head1 HISTORY
+
+This port was originally contributed by Gary Ng around 5.003_24,
+and borrowed from the Hip Communications port that was available
+at the time. Various people have made numerous and sundry hacks
+since then.
+
+Borland support was added in 5.004_01 (Gurusamy Sarathy).
+
+GCC/mingw32 support was added in 5.005 (Nick Ing-Simmons).
+
+Support for PERL_OBJECT was added in 5.005 (ActiveState Tool Corp).
+
+Support for fork() emulation was added in 5.6 (ActiveState Tool Corp).
+
+Win9x support was added in 5.6 (Benjamin Stuhl).
+
+Support for 64-bit Windows added in 5.8 (ActiveState Corp).
+
+Last updated: 29 August 2007
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlxs.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlxs.pod
new file mode 100755
index 00000000000..5ad24d8aa3d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlxs.pod
@@ -0,0 +1,2126 @@
+=head1 NAME
+
+perlxs - XS language reference manual
+
+=head1 DESCRIPTION
+
+=head2 Introduction
+
+XS is an interface description file format used to create an extension
+interface between Perl and C code (or a C library) which one wishes
+to use with Perl. The XS interface is combined with the library to
+create a new library which can then be either dynamically loaded
+or statically linked into perl. The XS interface description is
+written in the XS language and is the core component of the Perl
+extension interface.
+
+An B<XSUB> forms the basic unit of the XS interface. After compilation
+by the B<xsubpp> compiler, each XSUB amounts to a C function definition
+which will provide the glue between Perl calling conventions and C
+calling conventions.
+
+The glue code pulls the arguments from the Perl stack, converts these
+Perl values to the formats expected by a C function, call this C function,
+transfers the return values of the C function back to Perl.
+Return values here may be a conventional C return value or any C
+function arguments that may serve as output parameters. These return
+values may be passed back to Perl either by putting them on the
+Perl stack, or by modifying the arguments supplied from the Perl side.
+
+The above is a somewhat simplified view of what really happens. Since
+Perl allows more flexible calling conventions than C, XSUBs may do much
+more in practice, such as checking input parameters for validity,
+throwing exceptions (or returning undef/empty list) if the return value
+from the C function indicates failure, calling different C functions
+based on numbers and types of the arguments, providing an object-oriented
+interface, etc.
+
+Of course, one could write such glue code directly in C. However, this
+would be a tedious task, especially if one needs to write glue for
+multiple C functions, and/or one is not familiar enough with the Perl
+stack discipline and other such arcana. XS comes to the rescue here:
+instead of writing this glue C code in long-hand, one can write
+a more concise short-hand I<description> of what should be done by
+the glue, and let the XS compiler B<xsubpp> handle the rest.
+
+The XS language allows one to describe the mapping between how the C
+routine is used, and how the corresponding Perl routine is used. It
+also allows creation of Perl routines which are directly translated to
+C code and which are not related to a pre-existing C function. In cases
+when the C interface coincides with the Perl interface, the XSUB
+declaration is almost identical to a declaration of a C function (in K&R
+style). In such circumstances, there is another tool called C<h2xs>
+that is able to translate an entire C header file into a corresponding
+XS file that will provide glue to the functions/macros described in
+the header file.
+
+The XS compiler is called B<xsubpp>. This compiler creates
+the constructs necessary to let an XSUB manipulate Perl values, and
+creates the glue necessary to let Perl call the XSUB. The compiler
+uses B<typemaps> to determine how to map C function parameters
+and output values to Perl values and back. The default typemap
+(which comes with Perl) handles many common C types. A supplementary
+typemap may also be needed to handle any special structures and types
+for the library being linked.
+
+A file in XS format starts with a C language section which goes until the
+first C<MODULE =Z<>> directive. Other XS directives and XSUB definitions
+may follow this line. The "language" used in this part of the file
+is usually referred to as the XS language. B<xsubpp> recognizes and
+skips POD (see L<perlpod>) in both the C and XS language sections, which
+allows the XS file to contain embedded documentation.
+
+See L<perlxstut> for a tutorial on the whole extension creation process.
+
+Note: For some extensions, Dave Beazley's SWIG system may provide a
+significantly more convenient mechanism for creating the extension
+glue code. See http://www.swig.org/ for more information.
+
+=head2 On The Road
+
+Many of the examples which follow will concentrate on creating an interface
+between Perl and the ONC+ RPC bind library functions. The rpcb_gettime()
+function is used to demonstrate many features of the XS language. This
+function has two parameters; the first is an input parameter and the second
+is an output parameter. The function also returns a status value.
+
+ bool_t rpcb_gettime(const char *host, time_t *timep);
+
+From C this function will be called with the following
+statements.
+
+ #include <rpc/rpc.h>
+ bool_t status;
+ time_t timep;
+ status = rpcb_gettime( "localhost", &timep );
+
+If an XSUB is created to offer a direct translation between this function
+and Perl, then this XSUB will be used from Perl with the following code.
+The $status and $timep variables will contain the output of the function.
+
+ use RPC;
+ $status = rpcb_gettime( "localhost", $timep );
+
+The following XS file shows an XS subroutine, or XSUB, which
+demonstrates one possible interface to the rpcb_gettime()
+function. This XSUB represents a direct translation between
+C and Perl and so preserves the interface even from Perl.
+This XSUB will be invoked from Perl with the usage shown
+above. Note that the first three #include statements, for
+C<EXTERN.h>, C<perl.h>, and C<XSUB.h>, will always be present at the
+beginning of an XS file. This approach and others will be
+expanded later in this document.
+
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
+ #include <rpc/rpc.h>
+
+ MODULE = RPC PACKAGE = RPC
+
+ bool_t
+ rpcb_gettime(host,timep)
+ char *host
+ time_t &timep
+ OUTPUT:
+ timep
+
+Any extension to Perl, including those containing XSUBs,
+should have a Perl module to serve as the bootstrap which
+pulls the extension into Perl. This module will export the
+extension's functions and variables to the Perl program and
+will cause the extension's XSUBs to be linked into Perl.
+The following module will be used for most of the examples
+in this document and should be used from Perl with the C<use>
+command as shown earlier. Perl modules are explained in
+more detail later in this document.
+
+ package RPC;
+
+ require Exporter;
+ require DynaLoader;
+ @ISA = qw(Exporter DynaLoader);
+ @EXPORT = qw( rpcb_gettime );
+
+ bootstrap RPC;
+ 1;
+
+Throughout this document a variety of interfaces to the rpcb_gettime()
+XSUB will be explored. The XSUBs will take their parameters in different
+orders or will take different numbers of parameters. In each case the
+XSUB is an abstraction between Perl and the real C rpcb_gettime()
+function, and the XSUB must always ensure that the real rpcb_gettime()
+function is called with the correct parameters. This abstraction will
+allow the programmer to create a more Perl-like interface to the C
+function.
+
+=head2 The Anatomy of an XSUB
+
+The simplest XSUBs consist of 3 parts: a description of the return
+value, the name of the XSUB routine and the names of its arguments,
+and a description of types or formats of the arguments.
+
+The following XSUB allows a Perl program to access a C library function
+called sin(). The XSUB will imitate the C function which takes a single
+argument and returns a single value.
+
+ double
+ sin(x)
+ double x
+
+Optionally, one can merge the description of types and the list of
+argument names, rewriting this as
+
+ double
+ sin(double x)
+
+This makes this XSUB look similar to an ANSI C declaration. An optional
+semicolon is allowed after the argument list, as in
+
+ double
+ sin(double x);
+
+Parameters with C pointer types can have different semantic: C functions
+with similar declarations
+
+ bool string_looks_as_a_number(char *s);
+ bool make_char_uppercase(char *c);
+
+are used in absolutely incompatible manner. Parameters to these functions
+could be described B<xsubpp> like this:
+
+ char * s
+ char &c
+
+Both these XS declarations correspond to the C<char*> C type, but they have
+different semantics, see L<"The & Unary Operator">.
+
+It is convenient to think that the indirection operator
+C<*> should be considered as a part of the type and the address operator C<&>
+should be considered part of the variable. See L<"The Typemap">
+for more info about handling qualifiers and unary operators in C types.
+
+The function name and the return type must be placed on
+separate lines and should be flush left-adjusted.
+
+ INCORRECT CORRECT
+
+ double sin(x) double
+ double x sin(x)
+ double x
+
+The rest of the function description may be indented or left-adjusted. The
+following example shows a function with its body left-adjusted. Most
+examples in this document will indent the body for better readability.
+
+ CORRECT
+
+ double
+ sin(x)
+ double x
+
+More complicated XSUBs may contain many other sections. Each section of
+an XSUB starts with the corresponding keyword, such as INIT: or CLEANUP:.
+However, the first two lines of an XSUB always contain the same data:
+descriptions of the return type and the names of the function and its
+parameters. Whatever immediately follows these is considered to be
+an INPUT: section unless explicitly marked with another keyword.
+(See L<The INPUT: Keyword>.)
+
+An XSUB section continues until another section-start keyword is found.
+
+=head2 The Argument Stack
+
+The Perl argument stack is used to store the values which are
+sent as parameters to the XSUB and to store the XSUB's
+return value(s). In reality all Perl functions (including non-XSUB
+ones) keep their values on this stack all the same time, each limited
+to its own range of positions on the stack. In this document the
+first position on that stack which belongs to the active
+function will be referred to as position 0 for that function.
+
+XSUBs refer to their stack arguments with the macro B<ST(x)>, where I<x>
+refers to a position in this XSUB's part of the stack. Position 0 for that
+function would be known to the XSUB as ST(0). The XSUB's incoming
+parameters and outgoing return values always begin at ST(0). For many
+simple cases the B<xsubpp> compiler will generate the code necessary to
+handle the argument stack by embedding code fragments found in the
+typemaps. In more complex cases the programmer must supply the code.
+
+=head2 The RETVAL Variable
+
+The RETVAL variable is a special C variable that is declared automatically
+for you. The C type of RETVAL matches the return type of the C library
+function. The B<xsubpp> compiler will declare this variable in each XSUB
+with non-C<void> return type. By default the generated C function
+will use RETVAL to hold the return value of the C library function being
+called. In simple cases the value of RETVAL will be placed in ST(0) of
+the argument stack where it can be received by Perl as the return value
+of the XSUB.
+
+If the XSUB has a return type of C<void> then the compiler will
+not declare a RETVAL variable for that function. When using
+a PPCODE: section no manipulation of the RETVAL variable is required, the
+section may use direct stack manipulation to place output values on the stack.
+
+If PPCODE: directive is not used, C<void> return value should be used
+only for subroutines which do not return a value, I<even if> CODE:
+directive is used which sets ST(0) explicitly.
+
+Older versions of this document recommended to use C<void> return
+value in such cases. It was discovered that this could lead to
+segfaults in cases when XSUB was I<truly> C<void>. This practice is
+now deprecated, and may be not supported at some future version. Use
+the return value C<SV *> in such cases. (Currently C<xsubpp> contains
+some heuristic code which tries to disambiguate between "truly-void"
+and "old-practice-declared-as-void" functions. Hence your code is at
+mercy of this heuristics unless you use C<SV *> as return value.)
+
+=head2 Returning SVs, AVs and HVs through RETVAL
+
+When you're using RETVAL to return an C<SV *>, there's some magic
+going on behind the scenes that should be mentioned. When you're
+manipulating the argument stack using the ST(x) macro, for example,
+you usually have to pay special attention to reference counts. (For
+more about reference counts, see L<perlguts>.) To make your life
+easier, the typemap file automatically makes C<RETVAL> mortal when
+you're returning an C<SV *>. Thus, the following two XSUBs are more
+or less equivalent:
+
+ void
+ alpha()
+ PPCODE:
+ ST(0) = newSVpv("Hello World",0);
+ sv_2mortal(ST(0));
+ XSRETURN(1);
+
+ SV *
+ beta()
+ CODE:
+ RETVAL = newSVpv("Hello World",0);
+ OUTPUT:
+ RETVAL
+
+This is quite useful as it usually improves readability. While
+this works fine for an C<SV *>, it's unfortunately not as easy
+to have C<AV *> or C<HV *> as a return value. You I<should> be
+able to write:
+
+ AV *
+ array()
+ CODE:
+ RETVAL = newAV();
+ /* do something with RETVAL */
+ OUTPUT:
+ RETVAL
+
+But due to an unfixable bug (fixing it would break lots of existing
+CPAN modules) in the typemap file, the reference count of the C<AV *>
+is not properly decremented. Thus, the above XSUB would leak memory
+whenever it is being called. The same problem exists for C<HV *>.
+
+When you're returning an C<AV *> or a C<HV *>, you have to make sure
+their reference count is decremented by making the AV or HV mortal:
+
+ AV *
+ array()
+ CODE:
+ RETVAL = newAV();
+ sv_2mortal((SV*)RETVAL);
+ /* do something with RETVAL */
+ OUTPUT:
+ RETVAL
+
+And also remember that you don't have to do this for an C<SV *>.
+
+=head2 The MODULE Keyword
+
+The MODULE keyword is used to start the XS code and to specify the package
+of the functions which are being defined. All text preceding the first
+MODULE keyword is considered C code and is passed through to the output with
+POD stripped, but otherwise untouched. Every XS module will have a
+bootstrap function which is used to hook the XSUBs into Perl. The package
+name of this bootstrap function will match the value of the last MODULE
+statement in the XS source files. The value of MODULE should always remain
+constant within the same XS file, though this is not required.
+
+The following example will start the XS code and will place
+all functions in a package named RPC.
+
+ MODULE = RPC
+
+=head2 The PACKAGE Keyword
+
+When functions within an XS source file must be separated into packages
+the PACKAGE keyword should be used. This keyword is used with the MODULE
+keyword and must follow immediately after it when used.
+
+ MODULE = RPC PACKAGE = RPC
+
+ [ XS code in package RPC ]
+
+ MODULE = RPC PACKAGE = RPCB
+
+ [ XS code in package RPCB ]
+
+ MODULE = RPC PACKAGE = RPC
+
+ [ XS code in package RPC ]
+
+The same package name can be used more than once, allowing for
+non-contiguous code. This is useful if you have a stronger ordering
+principle than package names.
+
+Although this keyword is optional and in some cases provides redundant
+information it should always be used. This keyword will ensure that the
+XSUBs appear in the desired package.
+
+=head2 The PREFIX Keyword
+
+The PREFIX keyword designates prefixes which should be
+removed from the Perl function names. If the C function is
+C<rpcb_gettime()> and the PREFIX value is C<rpcb_> then Perl will
+see this function as C<gettime()>.
+
+This keyword should follow the PACKAGE keyword when used.
+If PACKAGE is not used then PREFIX should follow the MODULE
+keyword.
+
+ MODULE = RPC PREFIX = rpc_
+
+ MODULE = RPC PACKAGE = RPCB PREFIX = rpcb_
+
+=head2 The OUTPUT: Keyword
+
+The OUTPUT: keyword indicates that certain function parameters should be
+updated (new values made visible to Perl) when the XSUB terminates or that
+certain values should be returned to the calling Perl function. For
+simple functions which have no CODE: or PPCODE: section,
+such as the sin() function above, the RETVAL variable is
+automatically designated as an output value. For more complex functions
+the B<xsubpp> compiler will need help to determine which variables are output
+variables.
+
+This keyword will normally be used to complement the CODE: keyword.
+The RETVAL variable is not recognized as an output variable when the
+CODE: keyword is present. The OUTPUT: keyword is used in this
+situation to tell the compiler that RETVAL really is an output
+variable.
+
+The OUTPUT: keyword can also be used to indicate that function parameters
+are output variables. This may be necessary when a parameter has been
+modified within the function and the programmer would like the update to
+be seen by Perl.
+
+ bool_t
+ rpcb_gettime(host,timep)
+ char *host
+ time_t &timep
+ OUTPUT:
+ timep
+
+The OUTPUT: keyword will also allow an output parameter to
+be mapped to a matching piece of code rather than to a
+typemap.
+
+ bool_t
+ rpcb_gettime(host,timep)
+ char *host
+ time_t &timep
+ OUTPUT:
+ timep sv_setnv(ST(1), (double)timep);
+
+B<xsubpp> emits an automatic C<SvSETMAGIC()> for all parameters in the
+OUTPUT section of the XSUB, except RETVAL. This is the usually desired
+behavior, as it takes care of properly invoking 'set' magic on output
+parameters (needed for hash or array element parameters that must be
+created if they didn't exist). If for some reason, this behavior is
+not desired, the OUTPUT section may contain a C<SETMAGIC: DISABLE> line
+to disable it for the remainder of the parameters in the OUTPUT section.
+Likewise, C<SETMAGIC: ENABLE> can be used to reenable it for the
+remainder of the OUTPUT section. See L<perlguts> for more details
+about 'set' magic.
+
+=head2 The NO_OUTPUT Keyword
+
+The NO_OUTPUT can be placed as the first token of the XSUB. This keyword
+indicates that while the C subroutine we provide an interface to has
+a non-C<void> return type, the return value of this C subroutine should not
+be returned from the generated Perl subroutine.
+
+With this keyword present L<The RETVAL Variable> is created, and in the
+generated call to the subroutine this variable is assigned to, but the value
+of this variable is not going to be used in the auto-generated code.
+
+This keyword makes sense only if C<RETVAL> is going to be accessed by the
+user-supplied code. It is especially useful to make a function interface
+more Perl-like, especially when the C return value is just an error condition
+indicator. For example,
+
+ NO_OUTPUT int
+ delete_file(char *name)
+ POSTCALL:
+ if (RETVAL != 0)
+ croak("Error %d while deleting file '%s'", RETVAL, name);
+
+Here the generated XS function returns nothing on success, and will die()
+with a meaningful error message on error.
+
+=head2 The CODE: Keyword
+
+This keyword is used in more complicated XSUBs which require
+special handling for the C function. The RETVAL variable is
+still declared, but it will not be returned unless it is specified
+in the OUTPUT: section.
+
+The following XSUB is for a C function which requires special handling of
+its parameters. The Perl usage is given first.
+
+ $status = rpcb_gettime( "localhost", $timep );
+
+The XSUB follows.
+
+ bool_t
+ rpcb_gettime(host,timep)
+ char *host
+ time_t timep
+ CODE:
+ RETVAL = rpcb_gettime( host, &timep );
+ OUTPUT:
+ timep
+ RETVAL
+
+=head2 The INIT: Keyword
+
+The INIT: keyword allows initialization to be inserted into the XSUB before
+the compiler generates the call to the C function. Unlike the CODE: keyword
+above, this keyword does not affect the way the compiler handles RETVAL.
+
+ bool_t
+ rpcb_gettime(host,timep)
+ char *host
+ time_t &timep
+ INIT:
+ printf("# Host is %s\n", host );
+ OUTPUT:
+ timep
+
+Another use for the INIT: section is to check for preconditions before
+making a call to the C function:
+
+ long long
+ lldiv(a,b)
+ long long a
+ long long b
+ INIT:
+ if (a == 0 && b == 0)
+ XSRETURN_UNDEF;
+ if (b == 0)
+ croak("lldiv: cannot divide by 0");
+
+=head2 The NO_INIT Keyword
+
+The NO_INIT keyword is used to indicate that a function
+parameter is being used only as an output value. The B<xsubpp>
+compiler will normally generate code to read the values of
+all function parameters from the argument stack and assign
+them to C variables upon entry to the function. NO_INIT
+will tell the compiler that some parameters will be used for
+output rather than for input and that they will be handled
+before the function terminates.
+
+The following example shows a variation of the rpcb_gettime() function.
+This function uses the timep variable only as an output variable and does
+not care about its initial contents.
+
+ bool_t
+ rpcb_gettime(host,timep)
+ char *host
+ time_t &timep = NO_INIT
+ OUTPUT:
+ timep
+
+=head2 Initializing Function Parameters
+
+C function parameters are normally initialized with their values from
+the argument stack (which in turn contains the parameters that were
+passed to the XSUB from Perl). The typemaps contain the
+code segments which are used to translate the Perl values to
+the C parameters. The programmer, however, is allowed to
+override the typemaps and supply alternate (or additional)
+initialization code. Initialization code starts with the first
+C<=>, C<;> or C<+> on a line in the INPUT: section. The only
+exception happens if this C<;> terminates the line, then this C<;>
+is quietly ignored.
+
+The following code demonstrates how to supply initialization code for
+function parameters. The initialization code is eval'ed within double
+quotes by the compiler before it is added to the output so anything
+which should be interpreted literally [mainly C<$>, C<@>, or C<\\>]
+must be protected with backslashes. The variables $var, $arg,
+and $type can be used as in typemaps.
+
+ bool_t
+ rpcb_gettime(host,timep)
+ char *host = (char *)SvPV_nolen($arg);
+ time_t &timep = 0;
+ OUTPUT:
+ timep
+
+This should not be used to supply default values for parameters. One
+would normally use this when a function parameter must be processed by
+another library function before it can be used. Default parameters are
+covered in the next section.
+
+If the initialization begins with C<=>, then it is output in
+the declaration for the input variable, replacing the initialization
+supplied by the typemap. If the initialization
+begins with C<;> or C<+>, then it is performed after
+all of the input variables have been declared. In the C<;>
+case the initialization normally supplied by the typemap is not performed.
+For the C<+> case, the declaration for the variable will include the
+initialization from the typemap. A global
+variable, C<%v>, is available for the truly rare case where
+information from one initialization is needed in another
+initialization.
+
+Here's a truly obscure example:
+
+ bool_t
+ rpcb_gettime(host,timep)
+ time_t &timep; /* \$v{timep}=@{[$v{timep}=$arg]} */
+ char *host + SvOK($v{timep}) ? SvPV_nolen($arg) : NULL;
+ OUTPUT:
+ timep
+
+The construct C<\$v{timep}=@{[$v{timep}=$arg]}> used in the above
+example has a two-fold purpose: first, when this line is processed by
+B<xsubpp>, the Perl snippet C<$v{timep}=$arg> is evaluated. Second,
+the text of the evaluated snippet is output into the generated C file
+(inside a C comment)! During the processing of C<char *host> line,
+$arg will evaluate to C<ST(0)>, and C<$v{timep}> will evaluate to
+C<ST(1)>.
+
+=head2 Default Parameter Values
+
+Default values for XSUB arguments can be specified by placing an
+assignment statement in the parameter list. The default value may
+be a number, a string or the special string C<NO_INIT>. Defaults should
+always be used on the right-most parameters only.
+
+To allow the XSUB for rpcb_gettime() to have a default host
+value the parameters to the XSUB could be rearranged. The
+XSUB will then call the real rpcb_gettime() function with
+the parameters in the correct order. This XSUB can be called
+from Perl with either of the following statements:
+
+ $status = rpcb_gettime( $timep, $host );
+
+ $status = rpcb_gettime( $timep );
+
+The XSUB will look like the code which follows. A CODE:
+block is used to call the real rpcb_gettime() function with
+the parameters in the correct order for that function.
+
+ bool_t
+ rpcb_gettime(timep,host="localhost")
+ char *host
+ time_t timep = NO_INIT
+ CODE:
+ RETVAL = rpcb_gettime( host, &timep );
+ OUTPUT:
+ timep
+ RETVAL
+
+=head2 The PREINIT: Keyword
+
+The PREINIT: keyword allows extra variables to be declared immediately
+before or after the declarations of the parameters from the INPUT: section
+are emitted.
+
+If a variable is declared inside a CODE: section it will follow any typemap
+code that is emitted for the input parameters. This may result in the
+declaration ending up after C code, which is C syntax error. Similar
+errors may happen with an explicit C<;>-type or C<+>-type initialization of
+parameters is used (see L<"Initializing Function Parameters">). Declaring
+these variables in an INIT: section will not help.
+
+In such cases, to force an additional variable to be declared together
+with declarations of other variables, place the declaration into a
+PREINIT: section. The PREINIT: keyword may be used one or more times
+within an XSUB.
+
+The following examples are equivalent, but if the code is using complex
+typemaps then the first example is safer.
+
+ bool_t
+ rpcb_gettime(timep)
+ time_t timep = NO_INIT
+ PREINIT:
+ char *host = "localhost";
+ CODE:
+ RETVAL = rpcb_gettime( host, &timep );
+ OUTPUT:
+ timep
+ RETVAL
+
+For this particular case an INIT: keyword would generate the
+same C code as the PREINIT: keyword. Another correct, but error-prone example:
+
+ bool_t
+ rpcb_gettime(timep)
+ time_t timep = NO_INIT
+ CODE:
+ char *host = "localhost";
+ RETVAL = rpcb_gettime( host, &timep );
+ OUTPUT:
+ timep
+ RETVAL
+
+Another way to declare C<host> is to use a C block in the CODE: section:
+
+ bool_t
+ rpcb_gettime(timep)
+ time_t timep = NO_INIT
+ CODE:
+ {
+ char *host = "localhost";
+ RETVAL = rpcb_gettime( host, &timep );
+ }
+ OUTPUT:
+ timep
+ RETVAL
+
+The ability to put additional declarations before the typemap entries are
+processed is very handy in the cases when typemap conversions manipulate
+some global state:
+
+ MyObject
+ mutate(o)
+ PREINIT:
+ MyState st = global_state;
+ INPUT:
+ MyObject o;
+ CLEANUP:
+ reset_to(global_state, st);
+
+Here we suppose that conversion to C<MyObject> in the INPUT: section and from
+MyObject when processing RETVAL will modify a global variable C<global_state>.
+After these conversions are performed, we restore the old value of
+C<global_state> (to avoid memory leaks, for example).
+
+There is another way to trade clarity for compactness: INPUT sections allow
+declaration of C variables which do not appear in the parameter list of
+a subroutine. Thus the above code for mutate() can be rewritten as
+
+ MyObject
+ mutate(o)
+ MyState st = global_state;
+ MyObject o;
+ CLEANUP:
+ reset_to(global_state, st);
+
+and the code for rpcb_gettime() can be rewritten as
+
+ bool_t
+ rpcb_gettime(timep)
+ time_t timep = NO_INIT
+ char *host = "localhost";
+ C_ARGS:
+ host, &timep
+ OUTPUT:
+ timep
+ RETVAL
+
+=head2 The SCOPE: Keyword
+
+The SCOPE: keyword allows scoping to be enabled for a particular XSUB. If
+enabled, the XSUB will invoke ENTER and LEAVE automatically.
+
+To support potentially complex type mappings, if a typemap entry used
+by an XSUB contains a comment like C</*scope*/> then scoping will
+be automatically enabled for that XSUB.
+
+To enable scoping:
+
+ SCOPE: ENABLE
+
+To disable scoping:
+
+ SCOPE: DISABLE
+
+=head2 The INPUT: Keyword
+
+The XSUB's parameters are usually evaluated immediately after entering the
+XSUB. The INPUT: keyword can be used to force those parameters to be
+evaluated a little later. The INPUT: keyword can be used multiple times
+within an XSUB and can be used to list one or more input variables. This
+keyword is used with the PREINIT: keyword.
+
+The following example shows how the input parameter C<timep> can be
+evaluated late, after a PREINIT.
+
+ bool_t
+ rpcb_gettime(host,timep)
+ char *host
+ PREINIT:
+ time_t tt;
+ INPUT:
+ time_t timep
+ CODE:
+ RETVAL = rpcb_gettime( host, &tt );
+ timep = tt;
+ OUTPUT:
+ timep
+ RETVAL
+
+The next example shows each input parameter evaluated late.
+
+ bool_t
+ rpcb_gettime(host,timep)
+ PREINIT:
+ time_t tt;
+ INPUT:
+ char *host
+ PREINIT:
+ char *h;
+ INPUT:
+ time_t timep
+ CODE:
+ h = host;
+ RETVAL = rpcb_gettime( h, &tt );
+ timep = tt;
+ OUTPUT:
+ timep
+ RETVAL
+
+Since INPUT sections allow declaration of C variables which do not appear
+in the parameter list of a subroutine, this may be shortened to:
+
+ bool_t
+ rpcb_gettime(host,timep)
+ time_t tt;
+ char *host;
+ char *h = host;
+ time_t timep;
+ CODE:
+ RETVAL = rpcb_gettime( h, &tt );
+ timep = tt;
+ OUTPUT:
+ timep
+ RETVAL
+
+(We used our knowledge that input conversion for C<char *> is a "simple" one,
+thus C<host> is initialized on the declaration line, and our assignment
+C<h = host> is not performed too early. Otherwise one would need to have the
+assignment C<h = host> in a CODE: or INIT: section.)
+
+=head2 The IN/OUTLIST/IN_OUTLIST/OUT/IN_OUT Keywords
+
+In the list of parameters for an XSUB, one can precede parameter names
+by the C<IN>/C<OUTLIST>/C<IN_OUTLIST>/C<OUT>/C<IN_OUT> keywords.
+C<IN> keyword is the default, the other keywords indicate how the Perl
+interface should differ from the C interface.
+
+Parameters preceded by C<OUTLIST>/C<IN_OUTLIST>/C<OUT>/C<IN_OUT>
+keywords are considered to be used by the C subroutine I<via
+pointers>. C<OUTLIST>/C<OUT> keywords indicate that the C subroutine
+does not inspect the memory pointed by this parameter, but will write
+through this pointer to provide additional return values.
+
+Parameters preceded by C<OUTLIST> keyword do not appear in the usage
+signature of the generated Perl function.
+
+Parameters preceded by C<IN_OUTLIST>/C<IN_OUT>/C<OUT> I<do> appear as
+parameters to the Perl function. With the exception of
+C<OUT>-parameters, these parameters are converted to the corresponding
+C type, then pointers to these data are given as arguments to the C
+function. It is expected that the C function will write through these
+pointers.
+
+The return list of the generated Perl function consists of the C return value
+from the function (unless the XSUB is of C<void> return type or
+C<The NO_OUTPUT Keyword> was used) followed by all the C<OUTLIST>
+and C<IN_OUTLIST> parameters (in the order of appearance). On the
+return from the XSUB the C<IN_OUT>/C<OUT> Perl parameter will be
+modified to have the values written by the C function.
+
+For example, an XSUB
+
+ void
+ day_month(OUTLIST day, IN unix_time, OUTLIST month)
+ int day
+ int unix_time
+ int month
+
+should be used from Perl as
+
+ my ($day, $month) = day_month(time);
+
+The C signature of the corresponding function should be
+
+ void day_month(int *day, int unix_time, int *month);
+
+The C<IN>/C<OUTLIST>/C<IN_OUTLIST>/C<IN_OUT>/C<OUT> keywords can be
+mixed with ANSI-style declarations, as in
+
+ void
+ day_month(OUTLIST int day, int unix_time, OUTLIST int month)
+
+(here the optional C<IN> keyword is omitted).
+
+The C<IN_OUT> parameters are identical with parameters introduced with
+L<The & Unary Operator> and put into the C<OUTPUT:> section (see
+L<The OUTPUT: Keyword>). The C<IN_OUTLIST> parameters are very similar,
+the only difference being that the value C function writes through the
+pointer would not modify the Perl parameter, but is put in the output
+list.
+
+The C<OUTLIST>/C<OUT> parameter differ from C<IN_OUTLIST>/C<IN_OUT>
+parameters only by the initial value of the Perl parameter not
+being read (and not being given to the C function - which gets some
+garbage instead). For example, the same C function as above can be
+interfaced with as
+
+ void day_month(OUT int day, int unix_time, OUT int month);
+
+or
+
+ void
+ day_month(day, unix_time, month)
+ int &day = NO_INIT
+ int unix_time
+ int &month = NO_INIT
+ OUTPUT:
+ day
+ month
+
+However, the generated Perl function is called in very C-ish style:
+
+ my ($day, $month);
+ day_month($day, time, $month);
+
+=head2 The C<length(NAME)> Keyword
+
+If one of the input arguments to the C function is the length of a string
+argument C<NAME>, one can substitute the name of the length-argument by
+C<length(NAME)> in the XSUB declaration. This argument must be omitted when
+the generated Perl function is called. E.g.,
+
+ void
+ dump_chars(char *s, short l)
+ {
+ short n = 0;
+ while (n < l) {
+ printf("s[%d] = \"\\%#03o\"\n", n, (int)s[n]);
+ n++;
+ }
+ }
+
+ MODULE = x PACKAGE = x
+
+ void dump_chars(char *s, short length(s))
+
+should be called as C<dump_chars($string)>.
+
+This directive is supported with ANSI-type function declarations only.
+
+=head2 Variable-length Parameter Lists
+
+XSUBs can have variable-length parameter lists by specifying an ellipsis
+C<(...)> in the parameter list. This use of the ellipsis is similar to that
+found in ANSI C. The programmer is able to determine the number of
+arguments passed to the XSUB by examining the C<items> variable which the
+B<xsubpp> compiler supplies for all XSUBs. By using this mechanism one can
+create an XSUB which accepts a list of parameters of unknown length.
+
+The I<host> parameter for the rpcb_gettime() XSUB can be
+optional so the ellipsis can be used to indicate that the
+XSUB will take a variable number of parameters. Perl should
+be able to call this XSUB with either of the following statements.
+
+ $status = rpcb_gettime( $timep, $host );
+
+ $status = rpcb_gettime( $timep );
+
+The XS code, with ellipsis, follows.
+
+ bool_t
+ rpcb_gettime(timep, ...)
+ time_t timep = NO_INIT
+ PREINIT:
+ char *host = "localhost";
+ CODE:
+ if( items > 1 )
+ host = (char *)SvPV_nolen(ST(1));
+ RETVAL = rpcb_gettime( host, &timep );
+ OUTPUT:
+ timep
+ RETVAL
+
+=head2 The C_ARGS: Keyword
+
+The C_ARGS: keyword allows creating of XSUBS which have different
+calling sequence from Perl than from C, without a need to write
+CODE: or PPCODE: section. The contents of the C_ARGS: paragraph is
+put as the argument to the called C function without any change.
+
+For example, suppose that a C function is declared as
+
+ symbolic nth_derivative(int n, symbolic function, int flags);
+
+and that the default flags are kept in a global C variable
+C<default_flags>. Suppose that you want to create an interface which
+is called as
+
+ $second_deriv = $function->nth_derivative(2);
+
+To do this, declare the XSUB as
+
+ symbolic
+ nth_derivative(function, n)
+ symbolic function
+ int n
+ C_ARGS:
+ n, function, default_flags
+
+=head2 The PPCODE: Keyword
+
+The PPCODE: keyword is an alternate form of the CODE: keyword and is used
+to tell the B<xsubpp> compiler that the programmer is supplying the code to
+control the argument stack for the XSUBs return values. Occasionally one
+will want an XSUB to return a list of values rather than a single value.
+In these cases one must use PPCODE: and then explicitly push the list of
+values on the stack. The PPCODE: and CODE: keywords should not be used
+together within the same XSUB.
+
+The actual difference between PPCODE: and CODE: sections is in the
+initialization of C<SP> macro (which stands for the I<current> Perl
+stack pointer), and in the handling of data on the stack when returning
+from an XSUB. In CODE: sections SP preserves the value which was on
+entry to the XSUB: SP is on the function pointer (which follows the
+last parameter). In PPCODE: sections SP is moved backward to the
+beginning of the parameter list, which allows C<PUSH*()> macros
+to place output values in the place Perl expects them to be when
+the XSUB returns back to Perl.
+
+The generated trailer for a CODE: section ensures that the number of return
+values Perl will see is either 0 or 1 (depending on the C<void>ness of the
+return value of the C function, and heuristics mentioned in
+L<"The RETVAL Variable">). The trailer generated for a PPCODE: section
+is based on the number of return values and on the number of times
+C<SP> was updated by C<[X]PUSH*()> macros.
+
+Note that macros C<ST(i)>, C<XST_m*()> and C<XSRETURN*()> work equally
+well in CODE: sections and PPCODE: sections.
+
+The following XSUB will call the C rpcb_gettime() function
+and will return its two output values, timep and status, to
+Perl as a single list.
+
+ void
+ rpcb_gettime(host)
+ char *host
+ PREINIT:
+ time_t timep;
+ bool_t status;
+ PPCODE:
+ status = rpcb_gettime( host, &timep );
+ EXTEND(SP, 2);
+ PUSHs(sv_2mortal(newSViv(status)));
+ PUSHs(sv_2mortal(newSViv(timep)));
+
+Notice that the programmer must supply the C code necessary
+to have the real rpcb_gettime() function called and to have
+the return values properly placed on the argument stack.
+
+The C<void> return type for this function tells the B<xsubpp> compiler that
+the RETVAL variable is not needed or used and that it should not be created.
+In most scenarios the void return type should be used with the PPCODE:
+directive.
+
+The EXTEND() macro is used to make room on the argument
+stack for 2 return values. The PPCODE: directive causes the
+B<xsubpp> compiler to create a stack pointer available as C<SP>, and it
+is this pointer which is being used in the EXTEND() macro.
+The values are then pushed onto the stack with the PUSHs()
+macro.
+
+Now the rpcb_gettime() function can be used from Perl with
+the following statement.
+
+ ($status, $timep) = rpcb_gettime("localhost");
+
+When handling output parameters with a PPCODE section, be sure to handle
+'set' magic properly. See L<perlguts> for details about 'set' magic.
+
+=head2 Returning Undef And Empty Lists
+
+Occasionally the programmer will want to return simply
+C<undef> or an empty list if a function fails rather than a
+separate status value. The rpcb_gettime() function offers
+just this situation. If the function succeeds we would like
+to have it return the time and if it fails we would like to
+have undef returned. In the following Perl code the value
+of $timep will either be undef or it will be a valid time.
+
+ $timep = rpcb_gettime( "localhost" );
+
+The following XSUB uses the C<SV *> return type as a mnemonic only,
+and uses a CODE: block to indicate to the compiler
+that the programmer has supplied all the necessary code. The
+sv_newmortal() call will initialize the return value to undef, making that
+the default return value.
+
+ SV *
+ rpcb_gettime(host)
+ char * host
+ PREINIT:
+ time_t timep;
+ bool_t x;
+ CODE:
+ ST(0) = sv_newmortal();
+ if( rpcb_gettime( host, &timep ) )
+ sv_setnv( ST(0), (double)timep);
+
+The next example demonstrates how one would place an explicit undef in the
+return value, should the need arise.
+
+ SV *
+ rpcb_gettime(host)
+ char * host
+ PREINIT:
+ time_t timep;
+ bool_t x;
+ CODE:
+ if( rpcb_gettime( host, &timep ) ){
+ ST(0) = sv_newmortal();
+ sv_setnv( ST(0), (double)timep);
+ }
+ else{
+ ST(0) = &PL_sv_undef;
+ }
+
+To return an empty list one must use a PPCODE: block and
+then not push return values on the stack.
+
+ void
+ rpcb_gettime(host)
+ char *host
+ PREINIT:
+ time_t timep;
+ PPCODE:
+ if( rpcb_gettime( host, &timep ) )
+ PUSHs(sv_2mortal(newSViv(timep)));
+ else{
+ /* Nothing pushed on stack, so an empty
+ * list is implicitly returned. */
+ }
+
+Some people may be inclined to include an explicit C<return> in the above
+XSUB, rather than letting control fall through to the end. In those
+situations C<XSRETURN_EMPTY> should be used, instead. This will ensure that
+the XSUB stack is properly adjusted. Consult L<perlapi> for other
+C<XSRETURN> macros.
+
+Since C<XSRETURN_*> macros can be used with CODE blocks as well, one can
+rewrite this example as:
+
+ int
+ rpcb_gettime(host)
+ char *host
+ PREINIT:
+ time_t timep;
+ CODE:
+ RETVAL = rpcb_gettime( host, &timep );
+ if (RETVAL == 0)
+ XSRETURN_UNDEF;
+ OUTPUT:
+ RETVAL
+
+In fact, one can put this check into a POSTCALL: section as well. Together
+with PREINIT: simplifications, this leads to:
+
+ int
+ rpcb_gettime(host)
+ char *host
+ time_t timep;
+ POSTCALL:
+ if (RETVAL == 0)
+ XSRETURN_UNDEF;
+
+=head2 The REQUIRE: Keyword
+
+The REQUIRE: keyword is used to indicate the minimum version of the
+B<xsubpp> compiler needed to compile the XS module. An XS module which
+contains the following statement will compile with only B<xsubpp> version
+1.922 or greater:
+
+ REQUIRE: 1.922
+
+=head2 The CLEANUP: Keyword
+
+This keyword can be used when an XSUB requires special cleanup procedures
+before it terminates. When the CLEANUP: keyword is used it must follow
+any CODE:, PPCODE:, or OUTPUT: blocks which are present in the XSUB. The
+code specified for the cleanup block will be added as the last statements
+in the XSUB.
+
+=head2 The POSTCALL: Keyword
+
+This keyword can be used when an XSUB requires special procedures
+executed after the C subroutine call is performed. When the POSTCALL:
+keyword is used it must precede OUTPUT: and CLEANUP: blocks which are
+present in the XSUB.
+
+See examples in L<"The NO_OUTPUT Keyword"> and L<"Returning Undef And Empty Lists">.
+
+The POSTCALL: block does not make a lot of sense when the C subroutine
+call is supplied by user by providing either CODE: or PPCODE: section.
+
+=head2 The BOOT: Keyword
+
+The BOOT: keyword is used to add code to the extension's bootstrap
+function. The bootstrap function is generated by the B<xsubpp> compiler and
+normally holds the statements necessary to register any XSUBs with Perl.
+With the BOOT: keyword the programmer can tell the compiler to add extra
+statements to the bootstrap function.
+
+This keyword may be used any time after the first MODULE keyword and should
+appear on a line by itself. The first blank line after the keyword will
+terminate the code block.
+
+ BOOT:
+ # The following message will be printed when the
+ # bootstrap function executes.
+ printf("Hello from the bootstrap!\n");
+
+=head2 The VERSIONCHECK: Keyword
+
+The VERSIONCHECK: keyword corresponds to B<xsubpp>'s C<-versioncheck> and
+C<-noversioncheck> options. This keyword overrides the command line
+options. Version checking is enabled by default. When version checking is
+enabled the XS module will attempt to verify that its version matches the
+version of the PM module.
+
+To enable version checking:
+
+ VERSIONCHECK: ENABLE
+
+To disable version checking:
+
+ VERSIONCHECK: DISABLE
+
+Note that if the version of the PM module is an NV (a floating point
+number), it will be stringified with a possible loss of precision
+(currently chopping to nine decimal places) so that it may not match
+the version of the XS module anymore. Quoting the $VERSION declaration
+to make it a string is recommended if long version numbers are used.
+
+=head2 The PROTOTYPES: Keyword
+
+The PROTOTYPES: keyword corresponds to B<xsubpp>'s C<-prototypes> and
+C<-noprototypes> options. This keyword overrides the command line options.
+Prototypes are enabled by default. When prototypes are enabled XSUBs will
+be given Perl prototypes. This keyword may be used multiple times in an XS
+module to enable and disable prototypes for different parts of the module.
+
+To enable prototypes:
+
+ PROTOTYPES: ENABLE
+
+To disable prototypes:
+
+ PROTOTYPES: DISABLE
+
+=head2 The PROTOTYPE: Keyword
+
+This keyword is similar to the PROTOTYPES: keyword above but can be used to
+force B<xsubpp> to use a specific prototype for the XSUB. This keyword
+overrides all other prototype options and keywords but affects only the
+current XSUB. Consult L<perlsub/Prototypes> for information about Perl
+prototypes.
+
+ bool_t
+ rpcb_gettime(timep, ...)
+ time_t timep = NO_INIT
+ PROTOTYPE: $;$
+ PREINIT:
+ char *host = "localhost";
+ CODE:
+ if( items > 1 )
+ host = (char *)SvPV_nolen(ST(1));
+ RETVAL = rpcb_gettime( host, &timep );
+ OUTPUT:
+ timep
+ RETVAL
+
+If the prototypes are enabled, you can disable it locally for a given
+XSUB as in the following example:
+
+ void
+ rpcb_gettime_noproto()
+ PROTOTYPE: DISABLE
+ ...
+
+=head2 The ALIAS: Keyword
+
+The ALIAS: keyword allows an XSUB to have two or more unique Perl names
+and to know which of those names was used when it was invoked. The Perl
+names may be fully-qualified with package names. Each alias is given an
+index. The compiler will setup a variable called C<ix> which contain the
+index of the alias which was used. When the XSUB is called with its
+declared name C<ix> will be 0.
+
+The following example will create aliases C<FOO::gettime()> and
+C<BAR::getit()> for this function.
+
+ bool_t
+ rpcb_gettime(host,timep)
+ char *host
+ time_t &timep
+ ALIAS:
+ FOO::gettime = 1
+ BAR::getit = 2
+ INIT:
+ printf("# ix = %d\n", ix );
+ OUTPUT:
+ timep
+
+=head2 The OVERLOAD: Keyword
+
+Instead of writing an overloaded interface using pure Perl, you
+can also use the OVERLOAD keyword to define additional Perl names
+for your functions (like the ALIAS: keyword above). However, the
+overloaded functions must be defined with three parameters (except
+for the nomethod() function which needs four parameters). If any
+function has the OVERLOAD: keyword, several additional lines
+will be defined in the c file generated by xsubpp in order to
+register with the overload magic.
+
+Since blessed objects are actually stored as RV's, it is useful
+to use the typemap features to preprocess parameters and extract
+the actual SV stored within the blessed RV. See the sample for
+T_PTROBJ_SPECIAL below.
+
+To use the OVERLOAD: keyword, create an XS function which takes
+three input parameters ( or use the c style '...' definition) like
+this:
+
+ SV *
+ cmp (lobj, robj, swap)
+ My_Module_obj lobj
+ My_Module_obj robj
+ IV swap
+ OVERLOAD: cmp <=>
+ { /* function defined here */}
+
+In this case, the function will overload both of the three way
+comparison operators. For all overload operations using non-alpha
+characters, you must type the parameter without quoting, separating
+multiple overloads with whitespace. Note that "" (the stringify
+overload) should be entered as \"\" (i.e. escaped).
+
+=head2 The FALLBACK: Keyword
+
+In addition to the OVERLOAD keyword, if you need to control how
+Perl autogenerates missing overloaded operators, you can set the
+FALLBACK keyword in the module header section, like this:
+
+ MODULE = RPC PACKAGE = RPC
+
+ FALLBACK: TRUE
+ ...
+
+where FALLBACK can take any of the three values TRUE, FALSE, or
+UNDEF. If you do not set any FALLBACK value when using OVERLOAD,
+it defaults to UNDEF. FALLBACK is not used except when one or
+more functions using OVERLOAD have been defined. Please see
+L<overload/Fallback> for more details.
+
+=head2 The INTERFACE: Keyword
+
+This keyword declares the current XSUB as a keeper of the given
+calling signature. If some text follows this keyword, it is
+considered as a list of functions which have this signature, and
+should be attached to the current XSUB.
+
+For example, if you have 4 C functions multiply(), divide(), add(),
+subtract() all having the signature:
+
+ symbolic f(symbolic, symbolic);
+
+you can make them all to use the same XSUB using this:
+
+ symbolic
+ interface_s_ss(arg1, arg2)
+ symbolic arg1
+ symbolic arg2
+ INTERFACE:
+ multiply divide
+ add subtract
+
+(This is the complete XSUB code for 4 Perl functions!) Four generated
+Perl function share names with corresponding C functions.
+
+The advantage of this approach comparing to ALIAS: keyword is that there
+is no need to code a switch statement, each Perl function (which shares
+the same XSUB) knows which C function it should call. Additionally, one
+can attach an extra function remainder() at runtime by using
+
+ CV *mycv = newXSproto("Symbolic::remainder",
+ XS_Symbolic_interface_s_ss, __FILE__, "$$");
+ XSINTERFACE_FUNC_SET(mycv, remainder);
+
+say, from another XSUB. (This example supposes that there was no
+INTERFACE_MACRO: section, otherwise one needs to use something else instead of
+C<XSINTERFACE_FUNC_SET>, see the next section.)
+
+=head2 The INTERFACE_MACRO: Keyword
+
+This keyword allows one to define an INTERFACE using a different way
+to extract a function pointer from an XSUB. The text which follows
+this keyword should give the name of macros which would extract/set a
+function pointer. The extractor macro is given return type, C<CV*>,
+and C<XSANY.any_dptr> for this C<CV*>. The setter macro is given cv,
+and the function pointer.
+
+The default value is C<XSINTERFACE_FUNC> and C<XSINTERFACE_FUNC_SET>.
+An INTERFACE keyword with an empty list of functions can be omitted if
+INTERFACE_MACRO keyword is used.
+
+Suppose that in the previous example functions pointers for
+multiply(), divide(), add(), subtract() are kept in a global C array
+C<fp[]> with offsets being C<multiply_off>, C<divide_off>, C<add_off>,
+C<subtract_off>. Then one can use
+
+ #define XSINTERFACE_FUNC_BYOFFSET(ret,cv,f) \
+ ((XSINTERFACE_CVT_ANON(ret))fp[CvXSUBANY(cv).any_i32])
+ #define XSINTERFACE_FUNC_BYOFFSET_set(cv,f) \
+ CvXSUBANY(cv).any_i32 = CAT2( f, _off )
+
+in C section,
+
+ symbolic
+ interface_s_ss(arg1, arg2)
+ symbolic arg1
+ symbolic arg2
+ INTERFACE_MACRO:
+ XSINTERFACE_FUNC_BYOFFSET
+ XSINTERFACE_FUNC_BYOFFSET_set
+ INTERFACE:
+ multiply divide
+ add subtract
+
+in XSUB section.
+
+=head2 The INCLUDE: Keyword
+
+This keyword can be used to pull other files into the XS module. The other
+files may have XS code. INCLUDE: can also be used to run a command to
+generate the XS code to be pulled into the module.
+
+The file F<Rpcb1.xsh> contains our C<rpcb_gettime()> function:
+
+ bool_t
+ rpcb_gettime(host,timep)
+ char *host
+ time_t &timep
+ OUTPUT:
+ timep
+
+The XS module can use INCLUDE: to pull that file into it.
+
+ INCLUDE: Rpcb1.xsh
+
+If the parameters to the INCLUDE: keyword are followed by a pipe (C<|>) then
+the compiler will interpret the parameters as a command.
+
+ INCLUDE: cat Rpcb1.xsh |
+
+=head2 The CASE: Keyword
+
+The CASE: keyword allows an XSUB to have multiple distinct parts with each
+part acting as a virtual XSUB. CASE: is greedy and if it is used then all
+other XS keywords must be contained within a CASE:. This means nothing may
+precede the first CASE: in the XSUB and anything following the last CASE: is
+included in that case.
+
+A CASE: might switch via a parameter of the XSUB, via the C<ix> ALIAS:
+variable (see L<"The ALIAS: Keyword">), or maybe via the C<items> variable
+(see L<"Variable-length Parameter Lists">). The last CASE: becomes the
+B<default> case if it is not associated with a conditional. The following
+example shows CASE switched via C<ix> with a function C<rpcb_gettime()>
+having an alias C<x_gettime()>. When the function is called as
+C<rpcb_gettime()> its parameters are the usual C<(char *host, time_t *timep)>,
+but when the function is called as C<x_gettime()> its parameters are
+reversed, C<(time_t *timep, char *host)>.
+
+ long
+ rpcb_gettime(a,b)
+ CASE: ix == 1
+ ALIAS:
+ x_gettime = 1
+ INPUT:
+ # 'a' is timep, 'b' is host
+ char *b
+ time_t a = NO_INIT
+ CODE:
+ RETVAL = rpcb_gettime( b, &a );
+ OUTPUT:
+ a
+ RETVAL
+ CASE:
+ # 'a' is host, 'b' is timep
+ char *a
+ time_t &b = NO_INIT
+ OUTPUT:
+ b
+ RETVAL
+
+That function can be called with either of the following statements. Note
+the different argument lists.
+
+ $status = rpcb_gettime( $host, $timep );
+
+ $status = x_gettime( $timep, $host );
+
+=head2 The & Unary Operator
+
+The C<&> unary operator in the INPUT: section is used to tell B<xsubpp>
+that it should convert a Perl value to/from C using the C type to the left
+of C<&>, but provide a pointer to this value when the C function is called.
+
+This is useful to avoid a CODE: block for a C function which takes a parameter
+by reference. Typically, the parameter should be not a pointer type (an
+C<int> or C<long> but not an C<int*> or C<long*>).
+
+The following XSUB will generate incorrect C code. The B<xsubpp> compiler will
+turn this into code which calls C<rpcb_gettime()> with parameters C<(char
+*host, time_t timep)>, but the real C<rpcb_gettime()> wants the C<timep>
+parameter to be of type C<time_t*> rather than C<time_t>.
+
+ bool_t
+ rpcb_gettime(host,timep)
+ char *host
+ time_t timep
+ OUTPUT:
+ timep
+
+That problem is corrected by using the C<&> operator. The B<xsubpp> compiler
+will now turn this into code which calls C<rpcb_gettime()> correctly with
+parameters C<(char *host, time_t *timep)>. It does this by carrying the
+C<&> through, so the function call looks like C<rpcb_gettime(host, &timep)>.
+
+ bool_t
+ rpcb_gettime(host,timep)
+ char *host
+ time_t &timep
+ OUTPUT:
+ timep
+
+=head2 Inserting POD, Comments and C Preprocessor Directives
+
+C preprocessor directives are allowed within BOOT:, PREINIT: INIT:, CODE:,
+PPCODE:, POSTCALL:, and CLEANUP: blocks, as well as outside the functions.
+Comments are allowed anywhere after the MODULE keyword. The compiler will
+pass the preprocessor directives through untouched and will remove the
+commented lines. POD documentation is allowed at any point, both in the
+C and XS language sections. POD must be terminated with a C<=cut> command;
+C<xsubpp> will exit with an error if it does not. It is very unlikely that
+human generated C code will be mistaken for POD, as most indenting styles
+result in whitespace in front of any line starting with C<=>. Machine
+generated XS files may fall into this trap unless care is taken to
+ensure that a space breaks the sequence "\n=".
+
+Comments can be added to XSUBs by placing a C<#> as the first
+non-whitespace of a line. Care should be taken to avoid making the
+comment look like a C preprocessor directive, lest it be interpreted as
+such. The simplest way to prevent this is to put whitespace in front of
+the C<#>.
+
+If you use preprocessor directives to choose one of two
+versions of a function, use
+
+ #if ... version1
+ #else /* ... version2 */
+ #endif
+
+and not
+
+ #if ... version1
+ #endif
+ #if ... version2
+ #endif
+
+because otherwise B<xsubpp> will believe that you made a duplicate
+definition of the function. Also, put a blank line before the
+#else/#endif so it will not be seen as part of the function body.
+
+=head2 Using XS With C++
+
+If an XSUB name contains C<::>, it is considered to be a C++ method.
+The generated Perl function will assume that
+its first argument is an object pointer. The object pointer
+will be stored in a variable called THIS. The object should
+have been created by C++ with the new() function and should
+be blessed by Perl with the sv_setref_pv() macro. The
+blessing of the object by Perl can be handled by a typemap. An example
+typemap is shown at the end of this section.
+
+If the return type of the XSUB includes C<static>, the method is considered
+to be a static method. It will call the C++
+function using the class::method() syntax. If the method is not static
+the function will be called using the THIS-E<gt>method() syntax.
+
+The next examples will use the following C++ class.
+
+ class color {
+ public:
+ color();
+ ~color();
+ int blue();
+ void set_blue( int );
+
+ private:
+ int c_blue;
+ };
+
+The XSUBs for the blue() and set_blue() methods are defined with the class
+name but the parameter for the object (THIS, or "self") is implicit and is
+not listed.
+
+ int
+ color::blue()
+
+ void
+ color::set_blue( val )
+ int val
+
+Both Perl functions will expect an object as the first parameter. In the
+generated C++ code the object is called C<THIS>, and the method call will
+be performed on this object. So in the C++ code the blue() and set_blue()
+methods will be called as this:
+
+ RETVAL = THIS->blue();
+
+ THIS->set_blue( val );
+
+You could also write a single get/set method using an optional argument:
+
+ int
+ color::blue( val = NO_INIT )
+ int val
+ PROTOTYPE $;$
+ CODE:
+ if (items > 1)
+ THIS->set_blue( val );
+ RETVAL = THIS->blue();
+ OUTPUT:
+ RETVAL
+
+If the function's name is B<DESTROY> then the C++ C<delete> function will be
+called and C<THIS> will be given as its parameter. The generated C++ code for
+
+ void
+ color::DESTROY()
+
+will look like this:
+
+ color *THIS = ...; // Initialized as in typemap
+
+ delete THIS;
+
+If the function's name is B<new> then the C++ C<new> function will be called
+to create a dynamic C++ object. The XSUB will expect the class name, which
+will be kept in a variable called C<CLASS>, to be given as the first
+argument.
+
+ color *
+ color::new()
+
+The generated C++ code will call C<new>.
+
+ RETVAL = new color();
+
+The following is an example of a typemap that could be used for this C++
+example.
+
+ TYPEMAP
+ color * O_OBJECT
+
+ OUTPUT
+ # The Perl object is blessed into 'CLASS', which should be a
+ # char* having the name of the package for the blessing.
+ O_OBJECT
+ sv_setref_pv( $arg, CLASS, (void*)$var );
+
+ INPUT
+ O_OBJECT
+ if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) )
+ $var = ($type)SvIV((SV*)SvRV( $arg ));
+ else{
+ warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" );
+ XSRETURN_UNDEF;
+ }
+
+=head2 Interface Strategy
+
+When designing an interface between Perl and a C library a straight
+translation from C to XS (such as created by C<h2xs -x>) is often sufficient.
+However, sometimes the interface will look
+very C-like and occasionally nonintuitive, especially when the C function
+modifies one of its parameters, or returns failure inband (as in "negative
+return values mean failure"). In cases where the programmer wishes to
+create a more Perl-like interface the following strategy may help to
+identify the more critical parts of the interface.
+
+Identify the C functions with input/output or output parameters. The XSUBs for
+these functions may be able to return lists to Perl.
+
+Identify the C functions which use some inband info as an indication
+of failure. They may be
+candidates to return undef or an empty list in case of failure. If the
+failure may be detected without a call to the C function, you may want to use
+an INIT: section to report the failure. For failures detectable after the C
+function returns one may want to use a POSTCALL: section to process the
+failure. In more complicated cases use CODE: or PPCODE: sections.
+
+If many functions use the same failure indication based on the return value,
+you may want to create a special typedef to handle this situation. Put
+
+ typedef int negative_is_failure;
+
+near the beginning of XS file, and create an OUTPUT typemap entry
+for C<negative_is_failure> which converts negative values to C<undef>, or
+maybe croak()s. After this the return value of type C<negative_is_failure>
+will create more Perl-like interface.
+
+Identify which values are used by only the C and XSUB functions
+themselves, say, when a parameter to a function should be a contents of a
+global variable. If Perl does not need to access the contents of the value
+then it may not be necessary to provide a translation for that value
+from C to Perl.
+
+Identify the pointers in the C function parameter lists and return
+values. Some pointers may be used to implement input/output or
+output parameters, they can be handled in XS with the C<&> unary operator,
+and, possibly, using the NO_INIT keyword.
+Some others will require handling of types like C<int *>, and one needs
+to decide what a useful Perl translation will do in such a case. When
+the semantic is clear, it is advisable to put the translation into a typemap
+file.
+
+Identify the structures used by the C functions. In many
+cases it may be helpful to use the T_PTROBJ typemap for
+these structures so they can be manipulated by Perl as
+blessed objects. (This is handled automatically by C<h2xs -x>.)
+
+If the same C type is used in several different contexts which require
+different translations, C<typedef> several new types mapped to this C type,
+and create separate F<typemap> entries for these new types. Use these
+types in declarations of return type and parameters to XSUBs.
+
+=head2 Perl Objects And C Structures
+
+When dealing with C structures one should select either
+B<T_PTROBJ> or B<T_PTRREF> for the XS type. Both types are
+designed to handle pointers to complex objects. The
+T_PTRREF type will allow the Perl object to be unblessed
+while the T_PTROBJ type requires that the object be blessed.
+By using T_PTROBJ one can achieve a form of type-checking
+because the XSUB will attempt to verify that the Perl object
+is of the expected type.
+
+The following XS code shows the getnetconfigent() function which is used
+with ONC+ TIRPC. The getnetconfigent() function will return a pointer to a
+C structure and has the C prototype shown below. The example will
+demonstrate how the C pointer will become a Perl reference. Perl will
+consider this reference to be a pointer to a blessed object and will
+attempt to call a destructor for the object. A destructor will be
+provided in the XS source to free the memory used by getnetconfigent().
+Destructors in XS can be created by specifying an XSUB function whose name
+ends with the word B<DESTROY>. XS destructors can be used to free memory
+which may have been malloc'd by another XSUB.
+
+ struct netconfig *getnetconfigent(const char *netid);
+
+A C<typedef> will be created for C<struct netconfig>. The Perl
+object will be blessed in a class matching the name of the C
+type, with the tag C<Ptr> appended, and the name should not
+have embedded spaces if it will be a Perl package name. The
+destructor will be placed in a class corresponding to the
+class of the object and the PREFIX keyword will be used to
+trim the name to the word DESTROY as Perl will expect.
+
+ typedef struct netconfig Netconfig;
+
+ MODULE = RPC PACKAGE = RPC
+
+ Netconfig *
+ getnetconfigent(netid)
+ char *netid
+
+ MODULE = RPC PACKAGE = NetconfigPtr PREFIX = rpcb_
+
+ void
+ rpcb_DESTROY(netconf)
+ Netconfig *netconf
+ CODE:
+ printf("Now in NetconfigPtr::DESTROY\n");
+ free( netconf );
+
+This example requires the following typemap entry. Consult the typemap
+section for more information about adding new typemaps for an extension.
+
+ TYPEMAP
+ Netconfig * T_PTROBJ
+
+This example will be used with the following Perl statements.
+
+ use RPC;
+ $netconf = getnetconfigent("udp");
+
+When Perl destroys the object referenced by $netconf it will send the
+object to the supplied XSUB DESTROY function. Perl cannot determine, and
+does not care, that this object is a C struct and not a Perl object. In
+this sense, there is no difference between the object created by the
+getnetconfigent() XSUB and an object created by a normal Perl subroutine.
+
+=head2 The Typemap
+
+The typemap is a collection of code fragments which are used by the B<xsubpp>
+compiler to map C function parameters and values to Perl values. The
+typemap file may consist of three sections labelled C<TYPEMAP>, C<INPUT>, and
+C<OUTPUT>. An unlabelled initial section is assumed to be a C<TYPEMAP>
+section. The INPUT section tells
+the compiler how to translate Perl values
+into variables of certain C types. The OUTPUT section tells the compiler
+how to translate the values from certain C types into values Perl can
+understand. The TYPEMAP section tells the compiler which of the INPUT and
+OUTPUT code fragments should be used to map a given C type to a Perl value.
+The section labels C<TYPEMAP>, C<INPUT>, or C<OUTPUT> must begin
+in the first column on a line by themselves, and must be in uppercase.
+
+The default typemap in the C<lib/ExtUtils> directory of the Perl source
+contains many useful types which can be used by Perl extensions. Some
+extensions define additional typemaps which they keep in their own directory.
+These additional typemaps may reference INPUT and OUTPUT maps in the main
+typemap. The B<xsubpp> compiler will allow the extension's own typemap to
+override any mappings which are in the default typemap.
+
+Most extensions which require a custom typemap will need only the TYPEMAP
+section of the typemap file. The custom typemap used in the
+getnetconfigent() example shown earlier demonstrates what may be the typical
+use of extension typemaps. That typemap is used to equate a C structure
+with the T_PTROBJ typemap. The typemap used by getnetconfigent() is shown
+here. Note that the C type is separated from the XS type with a tab and
+that the C unary operator C<*> is considered to be a part of the C type name.
+
+ TYPEMAP
+ Netconfig *<tab>T_PTROBJ
+
+Here's a more complicated example: suppose that you wanted C<struct
+netconfig> to be blessed into the class C<Net::Config>. One way to do
+this is to use underscores (_) to separate package names, as follows:
+
+ typedef struct netconfig * Net_Config;
+
+And then provide a typemap entry C<T_PTROBJ_SPECIAL> that maps underscores to
+double-colons (::), and declare C<Net_Config> to be of that type:
+
+
+ TYPEMAP
+ Net_Config T_PTROBJ_SPECIAL
+
+ INPUT
+ T_PTROBJ_SPECIAL
+ if (sv_derived_from($arg, \"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = INT2PTR($type, tmp);
+ }
+ else
+ croak(\"$var is not of type ${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\")
+
+ OUTPUT
+ T_PTROBJ_SPECIAL
+ sv_setref_pv($arg, \"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\",
+ (void*)$var);
+
+The INPUT and OUTPUT sections substitute underscores for double-colons
+on the fly, giving the desired effect. This example demonstrates some
+of the power and versatility of the typemap facility.
+
+The INT2PTR macro (defined in perl.h) casts an integer to a pointer,
+of a given type, taking care of the possible different size of integers
+and pointers. There are also PTR2IV, PTR2UV, PTR2NV macros,
+to map the other way, which may be useful in OUTPUT sections.
+
+=head2 Safely Storing Static Data in XS
+
+Starting with Perl 5.8, a macro framework has been defined to allow
+static data to be safely stored in XS modules that will be accessed from
+a multi-threaded Perl.
+
+Although primarily designed for use with multi-threaded Perl, the macros
+have been designed so that they will work with non-threaded Perl as well.
+
+It is therefore strongly recommended that these macros be used by all
+XS modules that make use of static data.
+
+The easiest way to get a template set of macros to use is by specifying
+the C<-g> (C<--global>) option with h2xs (see L<h2xs>).
+
+Below is an example module that makes use of the macros.
+
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
+
+ /* Global Data */
+
+ #define MY_CXT_KEY "BlindMice::_guts" XS_VERSION
+
+ typedef struct {
+ int count;
+ char name[3][100];
+ } my_cxt_t;
+
+ START_MY_CXT
+
+ MODULE = BlindMice PACKAGE = BlindMice
+
+ BOOT:
+ {
+ MY_CXT_INIT;
+ MY_CXT.count = 0;
+ strcpy(MY_CXT.name[0], "None");
+ strcpy(MY_CXT.name[1], "None");
+ strcpy(MY_CXT.name[2], "None");
+ }
+
+ int
+ newMouse(char * name)
+ char * name;
+ PREINIT:
+ dMY_CXT;
+ CODE:
+ if (MY_CXT.count >= 3) {
+ warn("Already have 3 blind mice");
+ RETVAL = 0;
+ }
+ else {
+ RETVAL = ++ MY_CXT.count;
+ strcpy(MY_CXT.name[MY_CXT.count - 1], name);
+ }
+
+ char *
+ get_mouse_name(index)
+ int index
+ CODE:
+ dMY_CXT;
+ RETVAL = MY_CXT.lives ++;
+ if (index > MY_CXT.count)
+ croak("There are only 3 blind mice.");
+ else
+ RETVAL = newSVpv(MY_CXT.name[index - 1]);
+
+ void
+ CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+B<REFERENCE>
+
+=over 5
+
+=item MY_CXT_KEY
+
+This macro is used to define a unique key to refer to the static data
+for an XS module. The suggested naming scheme, as used by h2xs, is to
+use a string that consists of the module name, the string "::_guts"
+and the module version number.
+
+ #define MY_CXT_KEY "MyModule::_guts" XS_VERSION
+
+=item typedef my_cxt_t
+
+This struct typedef I<must> always be called C<my_cxt_t> -- the other
+C<CXT*> macros assume the existence of the C<my_cxt_t> typedef name.
+
+Declare a typedef named C<my_cxt_t> that is a structure that contains
+all the data that needs to be interpreter-local.
+
+ typedef struct {
+ int some_value;
+ } my_cxt_t;
+
+=item START_MY_CXT
+
+Always place the START_MY_CXT macro directly after the declaration
+of C<my_cxt_t>.
+
+=item MY_CXT_INIT
+
+The MY_CXT_INIT macro initialises storage for the C<my_cxt_t> struct.
+
+It I<must> be called exactly once -- typically in a BOOT: section. If you
+are maintaining multiple interpreters, it should be called once in each
+interpreter instance, except for interpreters cloned from existing ones.
+(But see C<MY_CXT_CLONE> below.)
+
+=item dMY_CXT
+
+Use the dMY_CXT macro (a declaration) in all the functions that access
+MY_CXT.
+
+=item MY_CXT
+
+Use the MY_CXT macro to access members of the C<my_cxt_t> struct. For
+example, if C<my_cxt_t> is
+
+ typedef struct {
+ int index;
+ } my_cxt_t;
+
+then use this to access the C<index> member
+
+ dMY_CXT;
+ MY_CXT.index = 2;
+
+=item aMY_CXT/pMY_CXT
+
+C<dMY_CXT> may be quite expensive to calculate, and to avoid the overhead
+of invoking it in each function it is possible to pass the declaration
+onto other functions using the C<aMY_CXT>/C<pMY_CXT> macros, eg
+
+ void sub1() {
+ dMY_CXT;
+ MY_CXT.index = 1;
+ sub2(aMY_CXT);
+ }
+
+ void sub2(pMY_CXT) {
+ MY_CXT.index = 2;
+ }
+
+Analogously to C<pTHX>, there are equivalent forms for when the macro is the
+first or last in multiple arguments, where an underscore represents a
+comma, i.e. C<_aMY_CXT>, C<aMY_CXT_>, C<_pMY_CXT> and C<pMY_CXT_>.
+
+=item MY_CXT_CLONE
+
+By default, when a new interpreter is created as a copy of an existing one
+(eg via C<< threads->create() >>), both interpreters share the same physical
+my_cxt_t structure. Calling C<MY_CXT_CLONE> (typically via the package's
+C<CLONE()> function), causes a byte-for-byte copy of the structure to be
+taken, and any future dMY_CXT will cause the copy to be accessed instead.
+
+=item MY_CXT_INIT_INTERP(my_perl)
+
+=item dMY_CXT_INTERP(my_perl)
+
+These are versions of the macros which take an explicit interpreter as an
+argument.
+
+=back
+
+Note that these macros will only work together within the I<same> source
+file; that is, a dMY_CTX in one source file will access a different structure
+than a dMY_CTX in another source file.
+
+=head2 Thread-aware system interfaces
+
+Starting from Perl 5.8, in C/C++ level Perl knows how to wrap
+system/library interfaces that have thread-aware versions
+(e.g. getpwent_r()) into frontend macros (e.g. getpwent()) that
+correctly handle the multithreaded interaction with the Perl
+interpreter. This will happen transparently, the only thing
+you need to do is to instantiate a Perl interpreter.
+
+This wrapping happens always when compiling Perl core source
+(PERL_CORE is defined) or the Perl core extensions (PERL_EXT is
+defined). When compiling XS code outside of Perl core the wrapping
+does not take place. Note, however, that intermixing the _r-forms
+(as Perl compiled for multithreaded operation will do) and the _r-less
+forms is neither well-defined (inconsistent results, data corruption,
+or even crashes become more likely), nor is it very portable.
+
+=head1 EXAMPLES
+
+File C<RPC.xs>: Interface to some ONC+ RPC bind library functions.
+
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
+
+ #include <rpc/rpc.h>
+
+ typedef struct netconfig Netconfig;
+
+ MODULE = RPC PACKAGE = RPC
+
+ SV *
+ rpcb_gettime(host="localhost")
+ char *host
+ PREINIT:
+ time_t timep;
+ CODE:
+ ST(0) = sv_newmortal();
+ if( rpcb_gettime( host, &timep ) )
+ sv_setnv( ST(0), (double)timep );
+
+ Netconfig *
+ getnetconfigent(netid="udp")
+ char *netid
+
+ MODULE = RPC PACKAGE = NetconfigPtr PREFIX = rpcb_
+
+ void
+ rpcb_DESTROY(netconf)
+ Netconfig *netconf
+ CODE:
+ printf("NetconfigPtr::DESTROY\n");
+ free( netconf );
+
+File C<typemap>: Custom typemap for RPC.xs.
+
+ TYPEMAP
+ Netconfig * T_PTROBJ
+
+File C<RPC.pm>: Perl module for the RPC extension.
+
+ package RPC;
+
+ require Exporter;
+ require DynaLoader;
+ @ISA = qw(Exporter DynaLoader);
+ @EXPORT = qw(rpcb_gettime getnetconfigent);
+
+ bootstrap RPC;
+ 1;
+
+File C<rpctest.pl>: Perl test program for the RPC extension.
+
+ use RPC;
+
+ $netconf = getnetconfigent();
+ $a = rpcb_gettime();
+ print "time = $a\n";
+ print "netconf = $netconf\n";
+
+ $netconf = getnetconfigent("tcp");
+ $a = rpcb_gettime("poplar");
+ print "time = $a\n";
+ print "netconf = $netconf\n";
+
+
+=head1 XS VERSION
+
+This document covers features supported by C<xsubpp> 1.935.
+
+=head1 AUTHOR
+
+Originally written by Dean Roehrich <F<roehrich@cray.com>>.
+
+Maintained since 1996 by The Perl Porters <F<perlbug@perl.org>>.
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlxstut.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlxstut.pod
new file mode 100755
index 00000000000..090b14a9e76
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/pods/perlxstut.pod
@@ -0,0 +1,1378 @@
+=head1 NAME
+
+perlXStut - Tutorial for writing XSUBs
+
+=head1 DESCRIPTION
+
+This tutorial will educate the reader on the steps involved in creating
+a Perl extension. The reader is assumed to have access to L<perlguts>,
+L<perlapi> and L<perlxs>.
+
+This tutorial starts with very simple examples and becomes more complex,
+with each new example adding new features. Certain concepts may not be
+completely explained until later in the tutorial in order to slowly ease
+the reader into building extensions.
+
+This tutorial was written from a Unix point of view. Where I know them
+to be otherwise different for other platforms (e.g. Win32), I will list
+them. If you find something that was missed, please let me know.
+
+=head1 SPECIAL NOTES
+
+=head2 make
+
+This tutorial assumes that the make program that Perl is configured to
+use is called C<make>. Instead of running "make" in the examples that
+follow, you may have to substitute whatever make program Perl has been
+configured to use. Running B<perl -V:make> should tell you what it is.
+
+=head2 Version caveat
+
+When writing a Perl extension for general consumption, one should expect that
+the extension will be used with versions of Perl different from the
+version available on your machine. Since you are reading this document,
+the version of Perl on your machine is probably 5.005 or later, but the users
+of your extension may have more ancient versions.
+
+To understand what kinds of incompatibilities one may expect, and in the rare
+case that the version of Perl on your machine is older than this document,
+see the section on "Troubleshooting these Examples" for more information.
+
+If your extension uses some features of Perl which are not available on older
+releases of Perl, your users would appreciate an early meaningful warning.
+You would probably put this information into the F<README> file, but nowadays
+installation of extensions may be performed automatically, guided by F<CPAN.pm>
+module or other tools.
+
+In MakeMaker-based installations, F<Makefile.PL> provides the earliest
+opportunity to perform version checks. One can put something like this
+in F<Makefile.PL> for this purpose:
+
+ eval { require 5.007 }
+ or die <<EOD;
+ ############
+ ### This module uses frobnication framework which is not available before
+ ### version 5.007 of Perl. Upgrade your Perl before installing Kara::Mba.
+ ############
+ EOD
+
+=head2 Dynamic Loading versus Static Loading
+
+It is commonly thought that if a system does not have the capability to
+dynamically load a library, you cannot build XSUBs. This is incorrect.
+You I<can> build them, but you must link the XSUBs subroutines with the
+rest of Perl, creating a new executable. This situation is similar to
+Perl 4.
+
+This tutorial can still be used on such a system. The XSUB build mechanism
+will check the system and build a dynamically-loadable library if possible,
+or else a static library and then, optionally, a new statically-linked
+executable with that static library linked in.
+
+Should you wish to build a statically-linked executable on a system which
+can dynamically load libraries, you may, in all the following examples,
+where the command "C<make>" with no arguments is executed, run the command
+"C<make perl>" instead.
+
+If you have generated such a statically-linked executable by choice, then
+instead of saying "C<make test>", you should say "C<make test_static>".
+On systems that cannot build dynamically-loadable libraries at all, simply
+saying "C<make test>" is sufficient.
+
+=head1 TUTORIAL
+
+Now let's go on with the show!
+
+=head2 EXAMPLE 1
+
+Our first extension will be very simple. When we call the routine in the
+extension, it will print out a well-known message and return.
+
+Run "C<h2xs -A -n Mytest>". This creates a directory named Mytest,
+possibly under ext/ if that directory exists in the current working
+directory. Several files will be created under the Mytest dir, including
+MANIFEST, Makefile.PL, lib/Mytest.pm, Mytest.xs, t/Mytest.t, and Changes.
+
+The MANIFEST file contains the names of all the files just created in the
+Mytest directory.
+
+The file Makefile.PL should look something like this:
+
+ use ExtUtils::MakeMaker;
+ # See lib/ExtUtils/MakeMaker.pm for details of how to influence
+ # the contents of the Makefile that is written.
+ WriteMakefile(
+ NAME => 'Mytest',
+ VERSION_FROM => 'Mytest.pm', # finds $VERSION
+ LIBS => [''], # e.g., '-lm'
+ DEFINE => '', # e.g., '-DHAVE_SOMETHING'
+ INC => '', # e.g., '-I/usr/include/other'
+ );
+
+The file Mytest.pm should start with something like this:
+
+ package Mytest;
+
+ use 5.008008;
+ use strict;
+ use warnings;
+
+ require Exporter;
+
+ our @ISA = qw(Exporter);
+ our %EXPORT_TAGS = ( 'all' => [ qw(
+
+ ) ] );
+
+ our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
+
+ our @EXPORT = qw(
+
+ );
+
+ our $VERSION = '0.01';
+
+ require XSLoader;
+ XSLoader::load('Mytest', $VERSION);
+
+ # Preloaded methods go here.
+
+ 1;
+ __END__
+ # Below is the stub of documentation for your module. You better edit it!
+
+The rest of the .pm file contains sample code for providing documentation for
+the extension.
+
+Finally, the Mytest.xs file should look something like this:
+
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
+
+ #include "ppport.h"
+
+ MODULE = Mytest PACKAGE = Mytest
+
+Let's edit the .xs file by adding this to the end of the file:
+
+ void
+ hello()
+ CODE:
+ printf("Hello, world!\n");
+
+It is okay for the lines starting at the "CODE:" line to not be indented.
+However, for readability purposes, it is suggested that you indent CODE:
+one level and the lines following one more level.
+
+Now we'll run "C<perl Makefile.PL>". This will create a real Makefile,
+which make needs. Its output looks something like:
+
+ % perl Makefile.PL
+ Checking if your kit is complete...
+ Looks good
+ Writing Makefile for Mytest
+ %
+
+Now, running make will produce output that looks something like this (some
+long lines have been shortened for clarity and some extraneous lines have
+been deleted):
+
+ % make
+ cp lib/Mytest.pm blib/lib/Mytest.pm
+ perl xsubpp -typemap typemap Mytest.xs > Mytest.xsc && mv Mytest.xsc Mytest.c
+ Please specify prototyping behavior for Mytest.xs (see perlxs manual)
+ cc -c Mytest.c
+ Running Mkbootstrap for Mytest ()
+ chmod 644 Mytest.bs
+ rm -f blib/arch/auto/Mytest/Mytest.so
+ cc -shared -L/usr/local/lib Mytest.o -o blib/arch/auto/Mytest/Mytest.so \
+ \
+
+ chmod 755 blib/arch/auto/Mytest/Mytest.so
+ cp Mytest.bs blib/arch/auto/Mytest/Mytest.bs
+ chmod 644 blib/arch/auto/Mytest/Mytest.bs
+ Manifying blib/man3/Mytest.3pm
+ %
+
+You can safely ignore the line about "prototyping behavior" - it is
+explained in L<perlxs/"The PROTOTYPES: Keyword">.
+
+If you are on a Win32 system, and the build process fails with linker
+errors for functions in the C library, check if your Perl is configured
+to use PerlCRT (running B<perl -V:libc> should show you if this is the
+case). If Perl is configured to use PerlCRT, you have to make sure
+PerlCRT.lib is copied to the same location that msvcrt.lib lives in,
+so that the compiler can find it on its own. msvcrt.lib is usually
+found in the Visual C compiler's lib directory (e.g. C:/DevStudio/VC/lib).
+
+Perl has its own special way of easily writing test scripts, but for this
+example only, we'll create our own test script. Create a file called hello
+that looks like this:
+
+ #! /opt/perl5/bin/perl
+
+ use ExtUtils::testlib;
+
+ use Mytest;
+
+ Mytest::hello();
+
+Now we make the script executable (C<chmod +x hello>), run the script
+and we should see the following output:
+
+ % ./hello
+ Hello, world!
+ %
+
+=head2 EXAMPLE 2
+
+Now let's add to our extension a subroutine that will take a single numeric
+argument as input and return 0 if the number is even or 1 if the number
+is odd.
+
+Add the following to the end of Mytest.xs:
+
+ int
+ is_even(input)
+ int input
+ CODE:
+ RETVAL = (input % 2 == 0);
+ OUTPUT:
+ RETVAL
+
+There does not need to be whitespace at the start of the "C<int input>"
+line, but it is useful for improving readability. Placing a semi-colon at
+the end of that line is also optional. Any amount and kind of whitespace
+may be placed between the "C<int>" and "C<input>".
+
+Now re-run make to rebuild our new shared library.
+
+Now perform the same steps as before, generating a Makefile from the
+Makefile.PL file, and running make.
+
+In order to test that our extension works, we now need to look at the
+file Mytest.t. This file is set up to imitate the same kind of testing
+structure that Perl itself has. Within the test script, you perform a
+number of tests to confirm the behavior of the extension, printing "ok"
+when the test is correct, "not ok" when it is not.
+
+ use Test::More tests => 4;
+ BEGIN { use_ok('Mytest') };
+
+ #########################
+
+ # Insert your test code below, the Test::More module is use()ed here so read
+ # its man page ( perldoc Test::More ) for help writing this test script.
+
+ is(&Mytest::is_even(0), 1);
+ is(&Mytest::is_even(1), 0);
+ is(&Mytest::is_even(2), 1);
+
+We will be calling the test script through the command "C<make test>". You
+should see output that looks something like this:
+
+ %make test
+ PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
+ t/Mytest....ok
+ All tests successful.
+ Files=1, Tests=4, 0 wallclock secs ( 0.03 cusr + 0.00 csys = 0.03 CPU)
+ %
+
+=head2 What has gone on?
+
+The program h2xs is the starting point for creating extensions. In later
+examples we'll see how we can use h2xs to read header files and generate
+templates to connect to C routines.
+
+h2xs creates a number of files in the extension directory. The file
+Makefile.PL is a perl script which will generate a true Makefile to build
+the extension. We'll take a closer look at it later.
+
+The .pm and .xs files contain the meat of the extension. The .xs file holds
+the C routines that make up the extension. The .pm file contains routines
+that tell Perl how to load your extension.
+
+Generating the Makefile and running C<make> created a directory called blib
+(which stands for "build library") in the current working directory. This
+directory will contain the shared library that we will build. Once we have
+tested it, we can install it into its final location.
+
+Invoking the test script via "C<make test>" did something very important.
+It invoked perl with all those C<-I> arguments so that it could find the
+various files that are part of the extension. It is I<very> important that
+while you are still testing extensions that you use "C<make test>". If you
+try to run the test script all by itself, you will get a fatal error.
+Another reason it is important to use "C<make test>" to run your test
+script is that if you are testing an upgrade to an already-existing version,
+using "C<make test>" ensures that you will test your new extension, not the
+already-existing version.
+
+When Perl sees a C<use extension;>, it searches for a file with the same name
+as the C<use>'d extension that has a .pm suffix. If that file cannot be found,
+Perl dies with a fatal error. The default search path is contained in the
+C<@INC> array.
+
+In our case, Mytest.pm tells perl that it will need the Exporter and Dynamic
+Loader extensions. It then sets the C<@ISA> and C<@EXPORT> arrays and the
+C<$VERSION> scalar; finally it tells perl to bootstrap the module. Perl
+will call its dynamic loader routine (if there is one) and load the shared
+library.
+
+The two arrays C<@ISA> and C<@EXPORT> are very important. The C<@ISA>
+array contains a list of other packages in which to search for methods (or
+subroutines) that do not exist in the current package. This is usually
+only important for object-oriented extensions (which we will talk about
+much later), and so usually doesn't need to be modified.
+
+The C<@EXPORT> array tells Perl which of the extension's variables and
+subroutines should be placed into the calling package's namespace. Because
+you don't know if the user has already used your variable and subroutine
+names, it's vitally important to carefully select what to export. Do I<not>
+export method or variable names I<by default> without a good reason.
+
+As a general rule, if the module is trying to be object-oriented then don't
+export anything. If it's just a collection of functions and variables, then
+you can export them via another array, called C<@EXPORT_OK>. This array
+does not automatically place its subroutine and variable names into the
+namespace unless the user specifically requests that this be done.
+
+See L<perlmod> for more information.
+
+The C<$VERSION> variable is used to ensure that the .pm file and the shared
+library are "in sync" with each other. Any time you make changes to
+the .pm or .xs files, you should increment the value of this variable.
+
+=head2 Writing good test scripts
+
+The importance of writing good test scripts cannot be over-emphasized. You
+should closely follow the "ok/not ok" style that Perl itself uses, so that
+it is very easy and unambiguous to determine the outcome of each test case.
+When you find and fix a bug, make sure you add a test case for it.
+
+By running "C<make test>", you ensure that your Mytest.t script runs and uses
+the correct version of your extension. If you have many test cases,
+save your test files in the "t" directory and use the suffix ".t".
+When you run "C<make test>", all of these test files will be executed.
+
+=head2 EXAMPLE 3
+
+Our third extension will take one argument as its input, round off that
+value, and set the I<argument> to the rounded value.
+
+Add the following to the end of Mytest.xs:
+
+ void
+ round(arg)
+ double arg
+ CODE:
+ if (arg > 0.0) {
+ arg = floor(arg + 0.5);
+ } else if (arg < 0.0) {
+ arg = ceil(arg - 0.5);
+ } else {
+ arg = 0.0;
+ }
+ OUTPUT:
+ arg
+
+Edit the Makefile.PL file so that the corresponding line looks like this:
+
+ 'LIBS' => ['-lm'], # e.g., '-lm'
+
+Generate the Makefile and run make. Change the test number in Mytest.t to
+"9" and add the following tests:
+
+ $i = -1.5; &Mytest::round($i); is( $i, -2.0 );
+ $i = -1.1; &Mytest::round($i); is( $i, -1.0 );
+ $i = 0.0; &Mytest::round($i); is( $i, 0.0 );
+ $i = 0.5; &Mytest::round($i); is( $i, 1.0 );
+ $i = 1.2; &Mytest::round($i); is( $i, 1.0 );
+
+Running "C<make test>" should now print out that all nine tests are okay.
+
+Notice that in these new test cases, the argument passed to round was a
+scalar variable. You might be wondering if you can round a constant or
+literal. To see what happens, temporarily add the following line to Mytest.t:
+
+ &Mytest::round(3);
+
+Run "C<make test>" and notice that Perl dies with a fatal error. Perl won't
+let you change the value of constants!
+
+=head2 What's new here?
+
+=over 4
+
+=item *
+
+We've made some changes to Makefile.PL. In this case, we've specified an
+extra library to be linked into the extension's shared library, the math
+library libm in this case. We'll talk later about how to write XSUBs that
+can call every routine in a library.
+
+=item *
+
+The value of the function is not being passed back as the function's return
+value, but by changing the value of the variable that was passed into the
+function. You might have guessed that when you saw that the return value
+of round is of type "void".
+
+=back
+
+=head2 Input and Output Parameters
+
+You specify the parameters that will be passed into the XSUB on the line(s)
+after you declare the function's return value and name. Each input parameter
+line starts with optional whitespace, and may have an optional terminating
+semicolon.
+
+The list of output parameters occurs at the very end of the function, just
+after the OUTPUT: directive. The use of RETVAL tells Perl that you
+wish to send this value back as the return value of the XSUB function. In
+Example 3, we wanted the "return value" placed in the original variable
+which we passed in, so we listed it (and not RETVAL) in the OUTPUT: section.
+
+=head2 The XSUBPP Program
+
+The B<xsubpp> program takes the XS code in the .xs file and translates it into
+C code, placing it in a file whose suffix is .c. The C code created makes
+heavy use of the C functions within Perl.
+
+=head2 The TYPEMAP file
+
+The B<xsubpp> program uses rules to convert from Perl's data types (scalar,
+array, etc.) to C's data types (int, char, etc.). These rules are stored
+in the typemap file ($PERLLIB/ExtUtils/typemap). This file is split into
+three parts.
+
+The first section maps various C data types to a name, which corresponds
+somewhat with the various Perl types. The second section contains C code
+which B<xsubpp> uses to handle input parameters. The third section contains
+C code which B<xsubpp> uses to handle output parameters.
+
+Let's take a look at a portion of the .c file created for our extension.
+The file name is Mytest.c:
+
+ XS(XS_Mytest_round)
+ {
+ dXSARGS;
+ if (items != 1)
+ Perl_croak(aTHX_ "Usage: Mytest::round(arg)");
+ PERL_UNUSED_VAR(cv); /* -W */
+ {
+ double arg = (double)SvNV(ST(0)); /* XXXXX */
+ if (arg > 0.0) {
+ arg = floor(arg + 0.5);
+ } else if (arg < 0.0) {
+ arg = ceil(arg - 0.5);
+ } else {
+ arg = 0.0;
+ }
+ sv_setnv(ST(0), (double)arg); /* XXXXX */
+ SvSETMAGIC(ST(0));
+ }
+ XSRETURN_EMPTY;
+ }
+
+Notice the two lines commented with "XXXXX". If you check the first section
+of the typemap file, you'll see that doubles are of type T_DOUBLE. In the
+INPUT section, an argument that is T_DOUBLE is assigned to the variable
+arg by calling the routine SvNV on something, then casting it to double,
+then assigned to the variable arg. Similarly, in the OUTPUT section,
+once arg has its final value, it is passed to the sv_setnv function to
+be passed back to the calling subroutine. These two functions are explained
+in L<perlguts>; we'll talk more later about what that "ST(0)" means in the
+section on the argument stack.
+
+=head2 Warning about Output Arguments
+
+In general, it's not a good idea to write extensions that modify their input
+parameters, as in Example 3. Instead, you should probably return multiple
+values in an array and let the caller handle them (we'll do this in a later
+example). However, in order to better accommodate calling pre-existing C
+routines, which often do modify their input parameters, this behavior is
+tolerated.
+
+=head2 EXAMPLE 4
+
+In this example, we'll now begin to write XSUBs that will interact with
+pre-defined C libraries. To begin with, we will build a small library of
+our own, then let h2xs write our .pm and .xs files for us.
+
+Create a new directory called Mytest2 at the same level as the directory
+Mytest. In the Mytest2 directory, create another directory called mylib,
+and cd into that directory.
+
+Here we'll create some files that will generate a test library. These will
+include a C source file and a header file. We'll also create a Makefile.PL
+in this directory. Then we'll make sure that running make at the Mytest2
+level will automatically run this Makefile.PL file and the resulting Makefile.
+
+In the mylib directory, create a file mylib.h that looks like this:
+
+ #define TESTVAL 4
+
+ extern double foo(int, long, const char*);
+
+Also create a file mylib.c that looks like this:
+
+ #include <stdlib.h>
+ #include "./mylib.h"
+
+ double
+ foo(int a, long b, const char *c)
+ {
+ return (a + b + atof(c) + TESTVAL);
+ }
+
+And finally create a file Makefile.PL that looks like this:
+
+ use ExtUtils::MakeMaker;
+ $Verbose = 1;
+ WriteMakefile(
+ NAME => 'Mytest2::mylib',
+ SKIP => [qw(all static static_lib dynamic dynamic_lib)],
+ clean => {'FILES' => 'libmylib$(LIB_EXT)'},
+ );
+
+
+ sub MY::top_targets {
+ '
+ all :: static
+
+ pure_all :: static
+
+ static :: libmylib$(LIB_EXT)
+
+ libmylib$(LIB_EXT): $(O_FILES)
+ $(AR) cr libmylib$(LIB_EXT) $(O_FILES)
+ $(RANLIB) libmylib$(LIB_EXT)
+
+ ';
+ }
+
+Make sure you use a tab and not spaces on the lines beginning with "$(AR)"
+and "$(RANLIB)". Make will not function properly if you use spaces.
+It has also been reported that the "cr" argument to $(AR) is unnecessary
+on Win32 systems.
+
+We will now create the main top-level Mytest2 files. Change to the directory
+above Mytest2 and run the following command:
+
+ % h2xs -O -n Mytest2 ./Mytest2/mylib/mylib.h
+
+This will print out a warning about overwriting Mytest2, but that's okay.
+Our files are stored in Mytest2/mylib, and will be untouched.
+
+The normal Makefile.PL that h2xs generates doesn't know about the mylib
+directory. We need to tell it that there is a subdirectory and that we
+will be generating a library in it. Let's add the argument MYEXTLIB to
+the WriteMakefile call so that it looks like this:
+
+ WriteMakefile(
+ 'NAME' => 'Mytest2',
+ 'VERSION_FROM' => 'Mytest2.pm', # finds $VERSION
+ 'LIBS' => [''], # e.g., '-lm'
+ 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING'
+ 'INC' => '', # e.g., '-I/usr/include/other'
+ 'MYEXTLIB' => 'mylib/libmylib$(LIB_EXT)',
+ );
+
+and then at the end add a subroutine (which will override the pre-existing
+subroutine). Remember to use a tab character to indent the line beginning
+with "cd"!
+
+ sub MY::postamble {
+ '
+ $(MYEXTLIB): mylib/Makefile
+ cd mylib && $(MAKE) $(PASSTHRU)
+ ';
+ }
+
+Let's also fix the MANIFEST file so that it accurately reflects the contents
+of our extension. The single line that says "mylib" should be replaced by
+the following three lines:
+
+ mylib/Makefile.PL
+ mylib/mylib.c
+ mylib/mylib.h
+
+To keep our namespace nice and unpolluted, edit the .pm file and change
+the variable C<@EXPORT> to C<@EXPORT_OK>. Finally, in the
+.xs file, edit the #include line to read:
+
+ #include "mylib/mylib.h"
+
+And also add the following function definition to the end of the .xs file:
+
+ double
+ foo(a,b,c)
+ int a
+ long b
+ const char * c
+ OUTPUT:
+ RETVAL
+
+Now we also need to create a typemap file because the default Perl doesn't
+currently support the const char * type. Create a file called typemap in
+the Mytest2 directory and place the following in it:
+
+ const char * T_PV
+
+Now run perl on the top-level Makefile.PL. Notice that it also created a
+Makefile in the mylib directory. Run make and watch that it does cd into
+the mylib directory and run make in there as well.
+
+Now edit the Mytest2.t script and change the number of tests to "4",
+and add the following lines to the end of the script:
+
+ is( &Mytest2::foo(1, 2, "Hello, world!"), 7 );
+ is( &Mytest2::foo(1, 2, "0.0"), 7 );
+ ok( abs(&Mytest2::foo(0, 0, "-3.4") - 0.6) <= 0.01 );
+
+(When dealing with floating-point comparisons, it is best to not check for
+equality, but rather that the difference between the expected and actual
+result is below a certain amount (called epsilon) which is 0.01 in this case)
+
+Run "C<make test>" and all should be well. There are some warnings on missing tests
+for the Mytest2::mylib extension, but you can ignore them.
+
+=head2 What has happened here?
+
+Unlike previous examples, we've now run h2xs on a real include file. This
+has caused some extra goodies to appear in both the .pm and .xs files.
+
+=over 4
+
+=item *
+
+In the .xs file, there's now a #include directive with the absolute path to
+the mylib.h header file. We changed this to a relative path so that we
+could move the extension directory if we wanted to.
+
+=item *
+
+There's now some new C code that's been added to the .xs file. The purpose
+of the C<constant> routine is to make the values that are #define'd in the
+header file accessible by the Perl script (by calling either C<TESTVAL> or
+C<&Mytest2::TESTVAL>). There's also some XS code to allow calls to the
+C<constant> routine.
+
+=item *
+
+The .pm file originally exported the name C<TESTVAL> in the C<@EXPORT> array.
+This could lead to name clashes. A good rule of thumb is that if the #define
+is only going to be used by the C routines themselves, and not by the user,
+they should be removed from the C<@EXPORT> array. Alternately, if you don't
+mind using the "fully qualified name" of a variable, you could move most
+or all of the items from the C<@EXPORT> array into the C<@EXPORT_OK> array.
+
+=item *
+
+If our include file had contained #include directives, these would not have
+been processed by h2xs. There is no good solution to this right now.
+
+=item *
+
+We've also told Perl about the library that we built in the mylib
+subdirectory. That required only the addition of the C<MYEXTLIB> variable
+to the WriteMakefile call and the replacement of the postamble subroutine
+to cd into the subdirectory and run make. The Makefile.PL for the
+library is a bit more complicated, but not excessively so. Again we
+replaced the postamble subroutine to insert our own code. This code
+simply specified that the library to be created here was a static archive
+library (as opposed to a dynamically loadable library) and provided the
+commands to build it.
+
+=back
+
+=head2 Anatomy of .xs file
+
+The .xs file of L<"EXAMPLE 4"> contained some new elements. To understand
+the meaning of these elements, pay attention to the line which reads
+
+ MODULE = Mytest2 PACKAGE = Mytest2
+
+Anything before this line is plain C code which describes which headers
+to include, and defines some convenience functions. No translations are
+performed on this part, apart from having embedded POD documentation
+skipped over (see L<perlpod>) it goes into the generated output C file as is.
+
+Anything after this line is the description of XSUB functions.
+These descriptions are translated by B<xsubpp> into C code which
+implements these functions using Perl calling conventions, and which
+makes these functions visible from Perl interpreter.
+
+Pay a special attention to the function C<constant>. This name appears
+twice in the generated .xs file: once in the first part, as a static C
+function, then another time in the second part, when an XSUB interface to
+this static C function is defined.
+
+This is quite typical for .xs files: usually the .xs file provides
+an interface to an existing C function. Then this C function is defined
+somewhere (either in an external library, or in the first part of .xs file),
+and a Perl interface to this function (i.e. "Perl glue") is described in the
+second part of .xs file. The situation in L<"EXAMPLE 1">, L<"EXAMPLE 2">,
+and L<"EXAMPLE 3">, when all the work is done inside the "Perl glue", is
+somewhat of an exception rather than the rule.
+
+=head2 Getting the fat out of XSUBs
+
+In L<"EXAMPLE 4"> the second part of .xs file contained the following
+description of an XSUB:
+
+ double
+ foo(a,b,c)
+ int a
+ long b
+ const char * c
+ OUTPUT:
+ RETVAL
+
+Note that in contrast with L<"EXAMPLE 1">, L<"EXAMPLE 2"> and L<"EXAMPLE 3">,
+this description does not contain the actual I<code> for what is done
+is done during a call to Perl function foo(). To understand what is going
+on here, one can add a CODE section to this XSUB:
+
+ double
+ foo(a,b,c)
+ int a
+ long b
+ const char * c
+ CODE:
+ RETVAL = foo(a,b,c);
+ OUTPUT:
+ RETVAL
+
+However, these two XSUBs provide almost identical generated C code: B<xsubpp>
+compiler is smart enough to figure out the C<CODE:> section from the first
+two lines of the description of XSUB. What about C<OUTPUT:> section? In
+fact, that is absolutely the same! The C<OUTPUT:> section can be removed
+as well, I<as far as C<CODE:> section or C<PPCODE:> section> is not
+specified: B<xsubpp> can see that it needs to generate a function call
+section, and will autogenerate the OUTPUT section too. Thus one can
+shortcut the XSUB to become:
+
+ double
+ foo(a,b,c)
+ int a
+ long b
+ const char * c
+
+Can we do the same with an XSUB
+
+ int
+ is_even(input)
+ int input
+ CODE:
+ RETVAL = (input % 2 == 0);
+ OUTPUT:
+ RETVAL
+
+of L<"EXAMPLE 2">? To do this, one needs to define a C function C<int
+is_even(int input)>. As we saw in L<Anatomy of .xs file>, a proper place
+for this definition is in the first part of .xs file. In fact a C function
+
+ int
+ is_even(int arg)
+ {
+ return (arg % 2 == 0);
+ }
+
+is probably overkill for this. Something as simple as a C<#define> will
+do too:
+
+ #define is_even(arg) ((arg) % 2 == 0)
+
+After having this in the first part of .xs file, the "Perl glue" part becomes
+as simple as
+
+ int
+ is_even(input)
+ int input
+
+This technique of separation of the glue part from the workhorse part has
+obvious tradeoffs: if you want to change a Perl interface, you need to
+change two places in your code. However, it removes a lot of clutter,
+and makes the workhorse part independent from idiosyncrasies of Perl calling
+convention. (In fact, there is nothing Perl-specific in the above description,
+a different version of B<xsubpp> might have translated this to TCL glue or
+Python glue as well.)
+
+=head2 More about XSUB arguments
+
+With the completion of Example 4, we now have an easy way to simulate some
+real-life libraries whose interfaces may not be the cleanest in the world.
+We shall now continue with a discussion of the arguments passed to the
+B<xsubpp> compiler.
+
+When you specify arguments to routines in the .xs file, you are really
+passing three pieces of information for each argument listed. The first
+piece is the order of that argument relative to the others (first, second,
+etc). The second is the type of argument, and consists of the type
+declaration of the argument (e.g., int, char*, etc). The third piece is
+the calling convention for the argument in the call to the library function.
+
+While Perl passes arguments to functions by reference,
+C passes arguments by value; to implement a C function which modifies data
+of one of the "arguments", the actual argument of this C function would be
+a pointer to the data. Thus two C functions with declarations
+
+ int string_length(char *s);
+ int upper_case_char(char *cp);
+
+may have completely different semantics: the first one may inspect an array
+of chars pointed by s, and the second one may immediately dereference C<cp>
+and manipulate C<*cp> only (using the return value as, say, a success
+indicator). From Perl one would use these functions in
+a completely different manner.
+
+One conveys this info to B<xsubpp> by replacing C<*> before the
+argument by C<&>. C<&> means that the argument should be passed to a library
+function by its address. The above two function may be XSUB-ified as
+
+ int
+ string_length(s)
+ char * s
+
+ int
+ upper_case_char(cp)
+ char &cp
+
+For example, consider:
+
+ int
+ foo(a,b)
+ char &a
+ char * b
+
+The first Perl argument to this function would be treated as a char and assigned
+to the variable a, and its address would be passed into the function foo.
+The second Perl argument would be treated as a string pointer and assigned to the
+variable b. The I<value> of b would be passed into the function foo. The
+actual call to the function foo that B<xsubpp> generates would look like this:
+
+ foo(&a, b);
+
+B<xsubpp> will parse the following function argument lists identically:
+
+ char &a
+ char&a
+ char & a
+
+However, to help ease understanding, it is suggested that you place a "&"
+next to the variable name and away from the variable type), and place a
+"*" near the variable type, but away from the variable name (as in the
+call to foo above). By doing so, it is easy to understand exactly what
+will be passed to the C function -- it will be whatever is in the "last
+column".
+
+You should take great pains to try to pass the function the type of variable
+it wants, when possible. It will save you a lot of trouble in the long run.
+
+=head2 The Argument Stack
+
+If we look at any of the C code generated by any of the examples except
+example 1, you will notice a number of references to ST(n), where n is
+usually 0. "ST" is actually a macro that points to the n'th argument
+on the argument stack. ST(0) is thus the first argument on the stack and
+therefore the first argument passed to the XSUB, ST(1) is the second
+argument, and so on.
+
+When you list the arguments to the XSUB in the .xs file, that tells B<xsubpp>
+which argument corresponds to which of the argument stack (i.e., the first
+one listed is the first argument, and so on). You invite disaster if you
+do not list them in the same order as the function expects them.
+
+The actual values on the argument stack are pointers to the values passed
+in. When an argument is listed as being an OUTPUT value, its corresponding
+value on the stack (i.e., ST(0) if it was the first argument) is changed.
+You can verify this by looking at the C code generated for Example 3.
+The code for the round() XSUB routine contains lines that look like this:
+
+ double arg = (double)SvNV(ST(0));
+ /* Round the contents of the variable arg */
+ sv_setnv(ST(0), (double)arg);
+
+The arg variable is initially set by taking the value from ST(0), then is
+stored back into ST(0) at the end of the routine.
+
+XSUBs are also allowed to return lists, not just scalars. This must be
+done by manipulating stack values ST(0), ST(1), etc, in a subtly
+different way. See L<perlxs> for details.
+
+XSUBs are also allowed to avoid automatic conversion of Perl function arguments
+to C function arguments. See L<perlxs> for details. Some people prefer
+manual conversion by inspecting C<ST(i)> even in the cases when automatic
+conversion will do, arguing that this makes the logic of an XSUB call clearer.
+Compare with L<"Getting the fat out of XSUBs"> for a similar tradeoff of
+a complete separation of "Perl glue" and "workhorse" parts of an XSUB.
+
+While experts may argue about these idioms, a novice to Perl guts may
+prefer a way which is as little Perl-guts-specific as possible, meaning
+automatic conversion and automatic call generation, as in
+L<"Getting the fat out of XSUBs">. This approach has the additional
+benefit of protecting the XSUB writer from future changes to the Perl API.
+
+=head2 Extending your Extension
+
+Sometimes you might want to provide some extra methods or subroutines
+to assist in making the interface between Perl and your extension simpler
+or easier to understand. These routines should live in the .pm file.
+Whether they are automatically loaded when the extension itself is loaded
+or only loaded when called depends on where in the .pm file the subroutine
+definition is placed. You can also consult L<AutoLoader> for an alternate
+way to store and load your extra subroutines.
+
+=head2 Documenting your Extension
+
+There is absolutely no excuse for not documenting your extension.
+Documentation belongs in the .pm file. This file will be fed to pod2man,
+and the embedded documentation will be converted to the manpage format,
+then placed in the blib directory. It will be copied to Perl's
+manpage directory when the extension is installed.
+
+You may intersperse documentation and Perl code within the .pm file.
+In fact, if you want to use method autoloading, you must do this,
+as the comment inside the .pm file explains.
+
+See L<perlpod> for more information about the pod format.
+
+=head2 Installing your Extension
+
+Once your extension is complete and passes all its tests, installing it
+is quite simple: you simply run "make install". You will either need
+to have write permission into the directories where Perl is installed,
+or ask your system administrator to run the make for you.
+
+Alternately, you can specify the exact directory to place the extension's
+files by placing a "PREFIX=/destination/directory" after the make install.
+(or in between the make and install if you have a brain-dead version of make).
+This can be very useful if you are building an extension that will eventually
+be distributed to multiple systems. You can then just archive the files in
+the destination directory and distribute them to your destination systems.
+
+=head2 EXAMPLE 5
+
+In this example, we'll do some more work with the argument stack. The
+previous examples have all returned only a single value. We'll now
+create an extension that returns an array.
+
+This extension is very Unix-oriented (struct statfs and the statfs system
+call). If you are not running on a Unix system, you can substitute for
+statfs any other function that returns multiple values, you can hard-code
+values to be returned to the caller (although this will be a bit harder
+to test the error case), or you can simply not do this example. If you
+change the XSUB, be sure to fix the test cases to match the changes.
+
+Return to the Mytest directory and add the following code to the end of
+Mytest.xs:
+
+ void
+ statfs(path)
+ char * path
+ INIT:
+ int i;
+ struct statfs buf;
+
+ PPCODE:
+ i = statfs(path, &buf);
+ if (i == 0) {
+ XPUSHs(sv_2mortal(newSVnv(buf.f_bavail)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_bfree)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_blocks)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_bsize)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_ffree)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_files)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_type)));
+ } else {
+ XPUSHs(sv_2mortal(newSVnv(errno)));
+ }
+
+You'll also need to add the following code to the top of the .xs file, just
+after the include of "XSUB.h":
+
+ #include <sys/vfs.h>
+
+Also add the following code segment to Mytest.t while incrementing the "9"
+tests to "11":
+
+ @a = &Mytest::statfs("/blech");
+ ok( scalar(@a) == 1 && $a[0] == 2 );
+ @a = &Mytest::statfs("/");
+ is( scalar(@a), 7 );
+
+=head2 New Things in this Example
+
+This example added quite a few new concepts. We'll take them one at a time.
+
+=over 4
+
+=item *
+
+The INIT: directive contains code that will be placed immediately after
+the argument stack is decoded. C does not allow variable declarations at
+arbitrary locations inside a function,
+so this is usually the best way to declare local variables needed by the XSUB.
+(Alternatively, one could put the whole C<PPCODE:> section into braces, and
+put these declarations on top.)
+
+=item *
+
+This routine also returns a different number of arguments depending on the
+success or failure of the call to statfs. If there is an error, the error
+number is returned as a single-element array. If the call is successful,
+then a 9-element array is returned. Since only one argument is passed into
+this function, we need room on the stack to hold the 9 values which may be
+returned.
+
+We do this by using the PPCODE: directive, rather than the CODE: directive.
+This tells B<xsubpp> that we will be managing the return values that will be
+put on the argument stack by ourselves.
+
+=item *
+
+When we want to place values to be returned to the caller onto the stack,
+we use the series of macros that begin with "XPUSH". There are five
+different versions, for placing integers, unsigned integers, doubles,
+strings, and Perl scalars on the stack. In our example, we placed a
+Perl scalar onto the stack. (In fact this is the only macro which
+can be used to return multiple values.)
+
+The XPUSH* macros will automatically extend the return stack to prevent
+it from being overrun. You push values onto the stack in the order you
+want them seen by the calling program.
+
+=item *
+
+The values pushed onto the return stack of the XSUB are actually mortal SV's.
+They are made mortal so that once the values are copied by the calling
+program, the SV's that held the returned values can be deallocated.
+If they were not mortal, then they would continue to exist after the XSUB
+routine returned, but would not be accessible. This is a memory leak.
+
+=item *
+
+If we were interested in performance, not in code compactness, in the success
+branch we would not use C<XPUSHs> macros, but C<PUSHs> macros, and would
+pre-extend the stack before pushing the return values:
+
+ EXTEND(SP, 7);
+
+The tradeoff is that one needs to calculate the number of return values
+in advance (though overextending the stack will not typically hurt
+anything but memory consumption).
+
+Similarly, in the failure branch we could use C<PUSHs> I<without> extending
+the stack: the Perl function reference comes to an XSUB on the stack, thus
+the stack is I<always> large enough to take one return value.
+
+=back
+
+=head2 EXAMPLE 6
+
+In this example, we will accept a reference to an array as an input
+parameter, and return a reference to an array of hashes. This will
+demonstrate manipulation of complex Perl data types from an XSUB.
+
+This extension is somewhat contrived. It is based on the code in
+the previous example. It calls the statfs function multiple times,
+accepting a reference to an array of filenames as input, and returning
+a reference to an array of hashes containing the data for each of the
+filesystems.
+
+Return to the Mytest directory and add the following code to the end of
+Mytest.xs:
+
+ SV *
+ multi_statfs(paths)
+ SV * paths
+ INIT:
+ AV * results;
+ I32 numpaths = 0;
+ int i, n;
+ struct statfs buf;
+
+ if ((!SvROK(paths))
+ || (SvTYPE(SvRV(paths)) != SVt_PVAV)
+ || ((numpaths = av_len((AV *)SvRV(paths))) < 0))
+ {
+ XSRETURN_UNDEF;
+ }
+ results = (AV *)sv_2mortal((SV *)newAV());
+ CODE:
+ for (n = 0; n <= numpaths; n++) {
+ HV * rh;
+ STRLEN l;
+ char * fn = SvPV(*av_fetch((AV *)SvRV(paths), n, 0), l);
+
+ i = statfs(fn, &buf);
+ if (i != 0) {
+ av_push(results, newSVnv(errno));
+ continue;
+ }
+
+ rh = (HV *)sv_2mortal((SV *)newHV());
+
+ hv_store(rh, "f_bavail", 8, newSVnv(buf.f_bavail), 0);
+ hv_store(rh, "f_bfree", 7, newSVnv(buf.f_bfree), 0);
+ hv_store(rh, "f_blocks", 8, newSVnv(buf.f_blocks), 0);
+ hv_store(rh, "f_bsize", 7, newSVnv(buf.f_bsize), 0);
+ hv_store(rh, "f_ffree", 7, newSVnv(buf.f_ffree), 0);
+ hv_store(rh, "f_files", 7, newSVnv(buf.f_files), 0);
+ hv_store(rh, "f_type", 6, newSVnv(buf.f_type), 0);
+
+ av_push(results, newRV((SV *)rh));
+ }
+ RETVAL = newRV((SV *)results);
+ OUTPUT:
+ RETVAL
+
+And add the following code to Mytest.t, while incrementing the "11"
+tests to "13":
+
+ $results = Mytest::multi_statfs([ '/', '/blech' ]);
+ ok( ref $results->[0]) );
+ ok( ! ref $results->[1] );
+
+=head2 New Things in this Example
+
+There are a number of new concepts introduced here, described below:
+
+=over 4
+
+=item *
+
+This function does not use a typemap. Instead, we declare it as accepting
+one SV* (scalar) parameter, and returning an SV* value, and we take care of
+populating these scalars within the code. Because we are only returning
+one value, we don't need a C<PPCODE:> directive - instead, we use C<CODE:>
+and C<OUTPUT:> directives.
+
+=item *
+
+When dealing with references, it is important to handle them with caution.
+The C<INIT:> block first checks that
+C<SvROK> returns true, which indicates that paths is a valid reference. It
+then verifies that the object referenced by paths is an array, using C<SvRV>
+to dereference paths, and C<SvTYPE> to discover its type. As an added test,
+it checks that the array referenced by paths is non-empty, using the C<av_len>
+function (which returns -1 if the array is empty). The XSRETURN_UNDEF macro
+is used to abort the XSUB and return the undefined value whenever all three of
+these conditions are not met.
+
+=item *
+
+We manipulate several arrays in this XSUB. Note that an array is represented
+internally by an AV* pointer. The functions and macros for manipulating
+arrays are similar to the functions in Perl: C<av_len> returns the highest
+index in an AV*, much like $#array; C<av_fetch> fetches a single scalar value
+from an array, given its index; C<av_push> pushes a scalar value onto the
+end of the array, automatically extending the array as necessary.
+
+Specifically, we read pathnames one at a time from the input array, and
+store the results in an output array (results) in the same order. If
+statfs fails, the element pushed onto the return array is the value of
+errno after the failure. If statfs succeeds, though, the value pushed
+onto the return array is a reference to a hash containing some of the
+information in the statfs structure.
+
+As with the return stack, it would be possible (and a small performance win)
+to pre-extend the return array before pushing data into it, since we know
+how many elements we will return:
+
+ av_extend(results, numpaths);
+
+=item *
+
+We are performing only one hash operation in this function, which is storing
+a new scalar under a key using C<hv_store>. A hash is represented by an HV*
+pointer. Like arrays, the functions for manipulating hashes from an XSUB
+mirror the functionality available from Perl. See L<perlguts> and L<perlapi>
+for details.
+
+=item *
+
+To create a reference, we use the C<newRV> function. Note that you can
+cast an AV* or an HV* to type SV* in this case (and many others). This
+allows you to take references to arrays, hashes and scalars with the same
+function. Conversely, the C<SvRV> function always returns an SV*, which may
+need to be cast to the appropriate type if it is something other than a
+scalar (check with C<SvTYPE>).
+
+=item *
+
+At this point, xsubpp is doing very little work - the differences between
+Mytest.xs and Mytest.c are minimal.
+
+=back
+
+=head2 EXAMPLE 7 (Coming Soon)
+
+XPUSH args AND set RETVAL AND assign return value to array
+
+=head2 EXAMPLE 8 (Coming Soon)
+
+Setting $!
+
+=head2 EXAMPLE 9 Passing open files to XSes
+
+You would think passing files to an XS is difficult, with all the
+typeglobs and stuff. Well, it isn't.
+
+Suppose that for some strange reason we need a wrapper around the
+standard C library function C<fputs()>. This is all we need:
+
+ #define PERLIO_NOT_STDIO 0
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
+
+ #include <stdio.h>
+
+ int
+ fputs(s, stream)
+ char * s
+ FILE * stream
+
+The real work is done in the standard typemap.
+
+B<But> you loose all the fine stuff done by the perlio layers. This
+calls the stdio function C<fputs()>, which knows nothing about them.
+
+The standard typemap offers three variants of PerlIO *:
+C<InputStream> (T_IN), C<InOutStream> (T_INOUT) and C<OutputStream>
+(T_OUT). A bare C<PerlIO *> is considered a T_INOUT. If it matters
+in your code (see below for why it might) #define or typedef
+one of the specific names and use that as the argument or result
+type in your XS file.
+
+The standard typemap does not contain PerlIO * before perl 5.7,
+but it has the three stream variants. Using a PerlIO * directly
+is not backwards compatible unless you provide your own typemap.
+
+For streams coming I<from> perl the main difference is that
+C<OutputStream> will get the output PerlIO * - which may make
+a difference on a socket. Like in our example...
+
+For streams being handed I<to> perl a new file handle is created
+(i.e. a reference to a new glob) and associated with the PerlIO *
+provided. If the read/write state of the PerlIO * is not correct then you
+may get errors or warnings from when the file handle is used.
+So if you opened the PerlIO * as "w" it should really be an
+C<OutputStream> if open as "r" it should be an C<InputStream>.
+
+Now, suppose you want to use perlio layers in your XS. We'll use the
+perlio C<PerlIO_puts()> function as an example.
+
+In the C part of the XS file (above the first MODULE line) you
+have
+
+ #define OutputStream PerlIO *
+ or
+ typedef PerlIO * OutputStream;
+
+
+And this is the XS code:
+
+ int
+ perlioputs(s, stream)
+ char * s
+ OutputStream stream
+ CODE:
+ RETVAL = PerlIO_puts(stream, s);
+ OUTPUT:
+ RETVAL
+
+We have to use a C<CODE> section because C<PerlIO_puts()> has the arguments
+reversed compared to C<fputs()>, and we want to keep the arguments the same.
+
+Wanting to explore this thoroughly, we want to use the stdio C<fputs()>
+on a PerlIO *. This means we have to ask the perlio system for a stdio
+C<FILE *>:
+
+ int
+ perliofputs(s, stream)
+ char * s
+ OutputStream stream
+ PREINIT:
+ FILE *fp = PerlIO_findFILE(stream);
+ CODE:
+ if (fp != (FILE*) 0) {
+ RETVAL = fputs(s, fp);
+ } else {
+ RETVAL = -1;
+ }
+ OUTPUT:
+ RETVAL
+
+Note: C<PerlIO_findFILE()> will search the layers for a stdio
+layer. If it can't find one, it will call C<PerlIO_exportFILE()> to
+generate a new stdio C<FILE>. Please only call C<PerlIO_exportFILE()> if
+you want a I<new> C<FILE>. It will generate one on each call and push a
+new stdio layer. So don't call it repeatedly on the same
+file. C<PerlIO()>_findFILE will retrieve the stdio layer once it has been
+generated by C<PerlIO_exportFILE()>.
+
+This applies to the perlio system only. For versions before 5.7,
+C<PerlIO_exportFILE()> is equivalent to C<PerlIO_findFILE()>.
+
+=head2 Troubleshooting these Examples
+
+As mentioned at the top of this document, if you are having problems with
+these example extensions, you might see if any of these help you.
+
+=over 4
+
+=item *
+
+In versions of 5.002 prior to the gamma version, the test script in Example
+1 will not function properly. You need to change the "use lib" line to
+read:
+
+ use lib './blib';
+
+=item *
+
+In versions of 5.002 prior to version 5.002b1h, the test.pl file was not
+automatically created by h2xs. This means that you cannot say "make test"
+to run the test script. You will need to add the following line before the
+"use extension" statement:
+
+ use lib './blib';
+
+=item *
+
+In versions 5.000 and 5.001, instead of using the above line, you will need
+to use the following line:
+
+ BEGIN { unshift(@INC, "./blib") }
+
+=item *
+
+This document assumes that the executable named "perl" is Perl version 5.
+Some systems may have installed Perl version 5 as "perl5".
+
+=back
+
+=head1 See also
+
+For more information, consult L<perlguts>, L<perlapi>, L<perlxs>, L<perlmod>,
+and L<perlpod>.
+
+=head1 Author
+
+Jeff Okamoto <F<okamoto@corp.hp.com>>
+
+Reviewed and assisted by Dean Roehrich, Ilya Zakharevich, Andreas Koenig,
+and Tim Bunce.
+
+PerlIO material contributed by Lupe Christoph, with some clarification
+by Nick Ing-Simmons.
+
+Changes for h2xs as of Perl 5.8.x by Renee Baecker
+
+=head2 Last Changed
+
+2007/10/11
diff --git a/Master/tlpkg/tlperl.straw/lib/qd.pl b/Master/tlpkg/tlperl.straw/lib/qd.pl
new file mode 100755
index 00000000000..aafc8777a20
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/qd.pl
@@ -0,0 +1,898 @@
+#!/usr/local/bin/perl
+
+# $Id: qd.pl,v 1.1.1.1 2001/12/06 23:25:48 lstein Exp $
+
+# This is a package of routines that let you create Macintosh
+# PICT files from within perl. It implements a subset of Quickdraw
+# drawing commands, primarily those related to line drawing, rectangles,
+# ovals, polygons, and text. Flagrantly absent are: regions and the
+# snazzy color transfer modes. Regions are absent because they were
+# more trouble than I had time for, and the transfer modes because I
+# never use them. (The latter shouldn't be too hard to add.) Also
+# missing are the pixmap commands. If you want to do pixmaps, you
+# should be using the ppm utilities.
+
+# A QUICK TUTORIAL ON QUICKDRAW
+#
+# Quickdraw is not Postscript. You cannot write routines in it or get
+# (any useful) information out of it. Quickdraw pictures are a series of
+# drawing commands, concatenated together in a binary format.
+#
+# A Macintosh picture consists of a header describing the size of the
+# picture and its bounding rectangle, followed by a series of drawing
+# commands, followed by a termination code. This perl library is
+# modeled closely on the way that you would draw a picture on the Mac.
+# First you open the picture with the &qd'OpenPicture() command. This
+# initializes some data structures. Then you call a series of drawing
+# subroutines, such as &qd'TextFont(), &qd'MoveTo(), &qd'DrawString().
+# These routines append their data to the growing (but still private)
+# picture. You then close the picture with &qd'ClosePicture. This
+# returns a scalar variable containing the binary picture data.
+
+# RECTANGLES
+#
+# To open a picture you need to define a rectangle that will serve as
+# its frame and will define its drawing area. The rectangle is (of
+# course) a binary structure. The following utilities allow you to
+# create and manipulate rectangles:
+#
+# &qd'SetRect(*myRect,left,top,right,bottom); # Set the sides of $myRect
+# &qd'OffsetRect(*myRect,deltaH,deltaV); # Shift the rectangle as indicated
+# &qd'InsetRect(*myRect,deltaH,deltaV); # Shrink rectangle by size indicated
+
+
+# OPENING A PICTURE
+#
+# Pass a previously-defined rectangle to the routine OpenPicture. Only one picture
+# may be open at a time. The rectangle defines the drawing area in pixels.
+# A printer page is 8.5 x 11 inches, at 72 pixels per inch = 612 x 792 pixels.
+#
+# &qd'OpenPicture($myRect);
+#
+# You will next very likely want to set the clipping rectangle to the same rectangle
+# you used to open the picture with. Clipping rectangles limit quickdraw's drawing
+# to the area within the rectangle. Even if you don't use clipping, however, it's a
+# good idea to define the rectangle because some drawing programs behave eratically
+# when displaying unclipped pictures.
+#
+# You then issue drawing commands. When you're done you can get the picture data with
+# something like $pictData = &qd'ClosePicture;
+
+#
+# SETTING THE FOREGROUND AND BACKGROUND COLORS
+#
+# The foreground color is the color of the ink when a "frame" or "paint" command
+# is given. The background color is the color of the erased area when an "erase"
+# command is given. The defaults are black and white. The colors can be changed
+# in either of two ways:
+#
+# 1. The "old" 8-color system: black, white, red, green, blue, cyan, magenta, yellow
+# Call the routines &qd'FgColor() and &qd'BgColor() with one of the constants
+# $qd'REDCOLOR,$qd'GREENCOLOR, etc. This gives you a limited number of highly
+# satured colors.
+#
+# 2. The new 24-bit color system. Call the routines &qd'RGBForeColor() and
+# &qd'RGBBackColor(), passing the routines the red, green and blue components
+# of the color. These components are two-byte unsigned integers, so you can choose
+# any value between 0x000 and 0xFFFF. Higher is darker, so:
+# (0x0000,0x0000,0x0000) = BLACK
+# (0xFFFFF,0xFFFF,0xFFFF) = WHITE
+# (0xFFFFF,0x0000,0x0000) = PURE RED
+# etc.
+
+
+# SETTING THE PATTERN
+#
+# Like colors, the drawing commands use the current pattern, a 32 row x 32 column
+# bit array that defines the pattern of the "ink".
+# The default pattern is $qd'BLACK, which is solid black. The only
+# other pattern I've defined is $qd'GRAY, which is a 50% checkerboard. You
+# might want to define others.
+#
+# The current pattern is set using &qd'PenPat($myPattern).
+
+
+# LINE DRAWING
+#
+# Quickdraw has the concept of the "current point" of the pen. Generally
+# you move the pen to a point and then start drawing. The next time you draw,
+# the pen will be wherever the last drawing command left it. In addition, the
+# pen has a width, a pattern and a color. In the below descriptions,
+# h=horizontal, v=vertical
+#
+# &qd'MoveTo(h,v) # Move to indicated coordinates (0,0 is upper left of picture)
+# &qd'LineTo(h,v) # Draw from current position to indicated position
+# &qd'Line(dh,dv) # Draw a line dh pixels horizontally, dv pixels vertically,
+# starting at current position
+# &qd'PenSize(h,v) # Set the size of the pen to h pixels wide, v pixels high
+
+
+# PEN SCALING
+#
+# The original quickdraw was incapable of drawing at higher than the screen resolution,
+# so even if the PenSize is set to (1,1) the lines will appear chunky when printed out
+# on the laserwriter (which has four times the resolution of the screen). Call
+# &qd'Scale(1,4) to fix this problem by shrinking the pen down to a quarter of its
+# (1,1) size.
+#
+# &qd'Scale(numerator,denominator) # Scale the pen by the fraction numerator/denominator
+
+
+# TEXT
+#
+# &qd'TextFont(fontCode) # Set the current font to indicated code. Currently
+# defined fonts are $qd'TIMES, $qd'NEWCENTURYSCHOOLBK,
+# $qd'SYMBOL, $qd'HELVETICA, and $qd'COURIER.
+#
+# &qd'TextSize(size) # Set the current font size (in points). 12 point is typical
+#
+# &qd'TextFace(attributes) # Set one or more font style attributes. Currently defined
+# are $qd'PLAIN, $qd'BOLD, $qd'ITALIC, $qd'UNDERLINE, and
+# can be used in combination:
+# &qd'TextFace($qd'BOLD + $qd'ITALIC);
+#
+# &qd'DrawString(string) # Draw the indicated text. It will be drawn from the
+# current pen location. Word wrap is NOT supported.
+# Rotated text is NOT supported.
+#
+# &qd'TextWidth(string) # This will return an approximate width for the string
+# when it is printed in the current size, font and face.
+# Unfortunately, since perl has no access to the Macintosh
+# font description tables, the number returned by this
+# routine will be wildly inaccurate at best.
+# However, if you have X11R5 bdf fonts installed, we look
+# in the directory $qd'X11FONTS in order to find a bdf metrics
+# font to use. This will give you extremely accurate measurements.
+# Please set this variable to whatever is correct for your local
+# system. To add more fonts, put them in your bdf font directory
+# and update the %qd'font_metric_files array at the bottom of this
+# file. It maps a key consisting of the Quickdraw font number,
+# font size, and font style (0 for plain, 1 for italic, 2 for bold,
+# 3 for both) to the appropriate bdf file.
+
+# RECTANGLES
+#
+# Draw rectangles using the routines:
+# &qd'FrameRect($myRect); # Draw wire-frame rectangle
+# &qd'PaintRect($myRect); # Fill rectangle with current foreground
+# color and pattern
+# &qd'EraseRect($myRect); # Erase the rectangle (fill with bg color)
+# &qd'InvertRect($myRect); # Invert black and white in rectangle
+
+
+# OVALS
+#
+# Draw ovals using the routines:
+# &qd'FrameOval($myRect); # Draw wire-frame oval
+# &qd'PaintOval($myRect); # Fill oval with current foreground
+# color and pattern
+# &qd'EraseOval($myRect); # Erase the oval (fill with bg color)
+# &qd'InvertOval($myRect); # Invert black and white in oval
+# &qd'FillOval($myRect,$pat); # Fill with specified pattern
+#
+
+# ROUND RECTANGLES
+#
+# Draw round-cornered rectangles with these routines. They each take an oval radius
+# to determine the amount of curvature. Values of 10-20 are typical.
+# &qd'FrameRoundRect($myRect,$ovalWidth,$ovalHeight); # wire-frame outline
+# &qd'PaintRoundRect($myRect,$ovalWidth,$ovalHeight); # fill with current foreground
+# &qd'EraseRoundRect($myRect,$ovalWidth,$ovalHeight); # erase
+# &qd'InvertRoundRect($myRect,$ovalWidth,$ovalHeight);# invert
+# &qd'FillRoundRect($myRect,$ovalWidth,$ovalHeight,$pat); # fill with specified pattern
+
+# ARCS
+# Draw an arc subtending the specified rectangle. Angles are in degrees and
+# start pointing northward and get larger clockwise:
+# e.g. PaintArc($r,45,90) gives you a pie wedge from 2 o'clock to 5 o'clock
+# &qd'FrameArc($rect,$startAngle,$arcAngle); # wire-frame the arc
+# &qd'PaintArc($rect,$startAngle,$arcAngle); # fill with current foreground
+# &qd'EraseArc($rect,$startAngle,$arcAngle); # erase arc
+# &qd'InvertArc($rect,$startAngle,$arcAngle); # flip white and black
+# &qd'FillArc($rect,,$startAngle,$arcAngle,$pat); # fill with specified pattern
+
+# POLYGONS
+# Calling OpenPoly returns the name of a variable in which a growing
+# polygon structure will be stored. Once a polygon is opened, all drawing
+# commands cease to have an effect on the picture. Instead, all MoveTo,
+# LineTo and Line commands accumulate polygon vertices into the data structure.
+# Call ClosePoly to stop recording drawing commands. The polygon can now
+# be moved, scaled, drawn, filled and erased as many times as wished. Call
+# KillPoly to release the memory taken up by the polygon
+# $polygon = &qd'OpenPoly; # begin recording drawing commands
+# &qd'ClosePoly($polygon); # stop recording drawing commands
+# &qd'FramePoly($polygon); # wire-frame the polygon
+# &qd'PaintPoly($polygon); # fill with current foreground
+# &qd'ErasePoly($polygon); # erase polygon
+# &qd'FillPoly($polygon,$pat); # fill polygon with pattern
+# &qd'OffsetPoly($polygon,$dh,$dv); # translate poly by dh horizontally, dv vertically
+# &qd'MapPoly($polygon,$srcRect,$destRect); # map polygon from coordinate system defined by
+ # source rectangle to that defined by destination
+ # rectangle (moving or resizing it as needed)
+
+# PRINTING OUT THE PICTURE IN A FORM THAT THE MACINTOSH CAN READ
+#
+# The Mac expects its picture files to begin with 512 bytes of "application specific"
+# data. By default the picture data that you get will be proceeded by 512 bytes of
+# 0's. If you want something else, or if you just want the picture data, set the
+# package variable $qd'PICTHEADER to whatever you desire before calling ClosePicture.
+# In order for the picture data to be readable on the Macintosh, the file type must
+# be set to 'PICT'. A number of UNIX utilities, including mcvert and BinHex allow
+# you to do this. Or you can use the picttoppm utility (part of the netppm suite of
+# graphics tools) to translate the file into any format you desire.
+
+# A WORKING EXAMPLE
+# require "qd.pl";
+# &qd'SetRect(*myRect,0,0,500,500); # Define a 500 pixel square
+# &qd'OpenPicture($myRect); # Begin defining the picture
+# &qd'ClipRect($myRect); # Always a good idea
+# &qd'MoveTo(5,5); # Move the pen to a starting point
+# &qd'LineTo(400,400); # A diagonal line
+# &qd'TextFont($qd'COURIER); # Set the font
+# &qd'MoveTo(50,20); # Move the pen to a new starting point
+# &qd'DrawString("Hello there!"); # Friendly greeting
+# &qd'SetRect(*myRect,80,80,250,250); # New rectangle
+# &qd'RGBForeColor(0x0000,0x0000,0xFFFF); # Set the color to blue
+# &qd'PaintRect($myRect); # Fill rectangle with that color
+# $data = &qd'ClosePicture; # Close picture and retrieve data
+
+# # Pipe through binhex, setting the creator type to JVWR for JPEG Viewer
+# # Note: BinHex is available at <ftp://genome.wi.mit.edu/software/util/BinHex>
+# open (BINHEX "| BinHex -t PICT -c JVWR -n 'An Example'");
+# print BINHEX $data;
+# close BINHEX;
+
+# # Turn it into a GIF file, using the ppm utilities
+# open (GIF, "| picttoppm | ppmtogif -transparent white");
+# print GIF $data;
+# close GIF;
+
+
+# MISCELLANEOUS NOTES
+# NOTE: For some reason the various FILL routines don't work as
+# advertised. They are simulated by a PnPat followed by a paint
+
+# --------------------------------------------------------------------
+# Quickdraw-like functions -- now using PICT2
+# --------------------------------------------------------------------
+{
+package qd;
+
+# Directory to look in to find font metric definitions -- change this
+# for your installation
+$X11FONTS = '/usr/local/X11R5/X11/fonts/bdf';
+
+# Apple quickdraw constants
+$TIMES = 20;
+$HELVETICA = 21;
+$COURIER = 22;
+$SYMBOL = 23;
+$NEWCENTURYSCHOOLBK = 34;
+
+$PLAIN = 0;
+$BOLD = 1;
+$ITALIC = 2;
+$UNDERLINE = 4;
+
+# Some minimal patterns -- define your own if you like
+$GRAY = pack ('n4',0xAA55,0xAA55,0xAA55,0xAA55);
+$DKGRAY = pack ('n4',0xDD77,0xDD77,0xDD77,0xDD77);
+$LTGRAY = pack ('n4',0x8822,0x8822,0x8822,0x8822);
+$WHITE = pack('n4',0x0000,0x0000,0x0000,0x0000);
+$BLACK = pack ('n4',0xFFFF,0xFFFF,0xFFFF,0xFFFF);
+
+# absolute colors to be used with FgColor/BgColor
+# (for better control, use RGBFgColor/RGBBgColor)
+$BLACKCOLOR = 33;
+$WHITECOLOR = 30;
+$REDCOLOR = 209;
+$GREENCOLOR = 329;
+$BLUECOLOR = 389;
+$CYANCOLOR = 269;
+$MAGENTACOLOR = 149;
+$YELLOWCOLOR = 89;
+
+# This defines the header used at the beginning of PICT files:
+$PICTHEADER = "\0" x 512;
+
+# These are phoney font metrics which we use when no font metrics files are
+# around to help us out.
+$fudgefactor = 0.55;
+$ITALICEXTRA = 0.05;
+$BOLDEXTRA = 0.08;
+
+# Initial starting values
+$textFont = $HELVETICA;
+$textSize = 12;
+$textFace = $PLAIN;
+$rgbfgcolor = pack('n*',0xFFFF,0xFFFF,0xFFFF);
+$rgbbgcolor = pack('n*',0,0,0);
+$fgcolor = $BLACKCOLOR;
+$bgcolor = $WHITECOLOR;
+$polySave = undef;
+
+$_PnPattern = $BLACK;
+$_polyName = "polygon000";
+
+sub OpenPicture { # begin a picture
+ local($rect) = @_;
+ $currH = $currV = 0; # current pen position
+ $pict = $PICTHEADER; # the header
+ $pict .= pack('n',0); # size int (placeholder)
+ $pict .= $rect; # pict frame
+ $pict .= pack('n',0x0011); # Type 2 picture
+ $pict .= pack('n',0x02FF); # version number
+ $pict .= pack('nC24',0x0C00,0); # reserved header opcode + 24 bytes of reserved data
+ # initialize the font and size
+ &TextFont($textFont);
+ &TextSize($textSize);
+ &TextFace($textFace);
+}
+
+sub ClosePicture { # close pict and return it
+ $pict .= pack ('n',0x00FF); # end of pict code
+ substr($pict,512,2) = pack('n',length($pict) - 512); # fill in length
+ return $pict;
+}
+
+sub ClipRect {
+ local($rect) = @_;
+ $pict .= pack('nn',0x0001,0x0A) . $rect;
+}
+
+sub PenPat {
+ local($newpat) = @_;
+ return unless $newpat ne $_PnPattern;
+ $_PnPattern = $newpat;
+ $pict .= pack('n',0x0009) . $_PnPattern;
+}
+
+sub RGBForeColor {
+ local($rgb) = pack('n3',@_);
+ return unless $rgb ne $rgbfgcolor;
+ $rgbfgcolor = $rgb;
+ $pict .= pack('n',0x001A) . $rgbfgcolor;
+}
+
+sub RGBBackColor {
+ local($rgb) = pack('n3',@_);
+ return unless $rgb ne $rgbbgcolor;
+ $rgbbgcolor = $rgb;
+ $pict .= pack('n',0x001B) . $rgbbgcolor;
+}
+
+sub FgColor {
+ local($color) = @_;
+ return unless $color != $fgcolor;
+ $fgcolor = $color;
+ $pict .= pack('nL',0x000E,$color);
+}
+
+sub BgColor {
+ local($color) = @_;
+ return unless $color != $bgcolor;
+ $bgcolor = $color;
+ $pict .= pack('nL',0x000F,$color);
+}
+
+sub TextFont {
+ local($font) = @_;
+ $textFont = $font;
+ $pict .= pack('nn',0x0003,$font);
+}
+
+sub TextSize {
+ local($size) = @_;
+ $textSize = $size;
+ $pict .= pack('nn',0x000D,$size);
+}
+
+sub PenSize {
+ local($h,$v) = @_;
+ $pict .= pack('nnn',0x0007,$v,$h);
+}
+
+sub TextFace {
+ return if $textFace == @_[0];
+ $textFace = @_[0];
+ $pict .= pack ('nCC',0x0004,$textFace,0); # (zero added to pad to word)
+}
+
+sub DrawString {
+ local($text) = @_;
+ $text .= "\0" x ((length($text) + 1) % 2); # pad text to an odd length
+ $pict .= pack('nnnC',0x0028,$currV,$currH,length($text)) . $text;
+}
+
+# RECTANGLE MANIPULATION ROUTINES. Note that
+# the rectangles are passed by NAME rather than by value,
+# in accordance with the MacOS way of doing things.
+sub SetRect {
+ local(*r,$h1,$v1,$h2,$v2) = @_;
+ $r = pack ('n4',$v1,$h1,$v2,$h2);
+}
+
+sub OffsetRect {
+ local(*r,$x,$y) = @_;
+ local($v1,$h1,$v2,$h2) = unpack('n4',$r);
+ $h1 += $x; $h2 += $x;
+ $v1 += $y; $v2 += $y;
+ $r = pack ('n4',$v1,$h1,$v2,$h2);
+}
+
+sub InsetRect {
+ local(*r,$x,$y) = @_;
+ local($v1,$h1,$v2,$h2) = unpack('n4',$r);
+ $h1 -= int($x/2); $h2 -= int($x/2);
+ $v1 -= int($y/2); $v2 -= int($y/2);
+ $r = pack ('n4',$v1,$h1,$v2,$h2);
+}
+
+# A few utility routine to translate between perl
+# arrays and rectangles.
+
+# four-element perl array to quickdraw rect structure
+sub a2r {
+ local($top,$left,$bottom,$right) = @_;
+ return pack('n4',$top,$left,$bottom,$right);
+}
+
+# rectangle to four-element perl array
+sub r2a {
+ local($rect) = @_;
+ return unpack('n4',$rect);
+}
+
+# associative array in which the keys are 'top','left','bottom','right'
+# to quickdraw rect structure
+sub aa2r {
+ local(%r) = @_;
+ return pack('n4',$r{'top'},$r{'left'},$r{'bottom'},$r{'right'});
+}
+
+# quickdraw rect structure to associative array
+sub r2aa {
+ local($r) = @_;
+ local(%r);
+ ($r{'top'},$r{'left'},$r{'bottom'},$r{'right'}) = unpack('n4',$r);
+ return %r;
+}
+
+# LINE DRAWING ROUTINES
+sub MoveTo {
+ ($currH,$currV) = @_;
+}
+
+sub Move {
+ local($dh,$dv) = @_;
+ $currH += $dh;
+ $currV += $dv;
+}
+
+sub LineTo {
+ local($h,$v) = @_;
+ # Special handling for polygons
+ if (defined(@polySave)) {
+ &_addVertex(*polySave,$h,$v)
+ } else {
+ $pict .= pack('nn4',0x0020,$currV,$currH,$v,$h);
+ }
+ ($currH,$currV) = ($h,$v);
+}
+
+sub Line {
+ local($dh,$dv) = @_;
+ # Special handling for polygons
+ if (defined(@polySave)) {
+ &_addVertex(*polySave,$h,$v);
+ } else {
+ $pict .= pack('nn4',0x0020,$currV,$currH,$currV+$dv,$currH+$dh);
+ }
+ ($currH,$currV) = ($currH+$dh,$currV+$dv);
+}
+
+sub Scale { #use picComment to set laserwriter line scaling
+ local($numerator,$denominator)= @_;
+ $pict .= pack('nnnn2',0x00A1,182,4,$numerator,$denominator);
+}
+
+
+# Rectangles
+sub FrameRect {
+ local($rect) = @_;
+ $pict .= pack('n',0x0030) . $rect;
+}
+
+sub PaintRect {
+ local($rect) = @_;
+ $pict .= pack('n',0x0031) . $rect;
+}
+
+sub EraseRect {
+ local($rect) = @_;
+ $pict .= pack('n',0x0032) . $rect;
+}
+
+sub InvertRect {
+ local($rect) = @_;
+ $pict .= pack('n',0x0033) . $rect;
+}
+
+sub FillRect {
+ local($rect,$pattern) = @_;
+ local($oldpat) = $_PnPattern;
+ &PenPat($pattern);
+ &PaintRect($rect);
+ &PenPat($oldpat);
+}
+
+# Ovals
+sub FrameOval {
+ local($rect) = @_;
+ $pict .= pack('n',0x0050) . $rect;
+}
+
+sub PaintOval {
+ local($rect) = @_;
+ $pict .= pack('n',0x0051) . $rect;
+}
+
+sub EraseOval {
+ local($rect) = @_;
+ $pict .= pack('n',0x0052) . $rect;
+}
+
+sub InvertOval {
+ local($rect) = @_;
+ $pict .= pack('n',0x0053) . $rect;
+}
+
+sub FillOval {
+ local($rect,$pattern) = @_;
+ local($oldpat) = $_PnPattern;
+ &PenPat($pattern);
+ &PaintOval($rect);
+ &PenPat($oldpat);
+}
+
+# Arcs
+sub FrameArc {
+ local($rect,$startAngle,$arcAngle) = @_;
+ $pict .= pack('n',0x0060) . $rect;
+ $pict .= pack('nn',$startAngle,$arcAngle);
+}
+
+sub PaintArc {
+ local($rect,$startAngle,$arcAngle) = @_;
+ $pict .= pack('n',0x0061) . $rect;
+ $pict .= pack('nn',$startAngle,$arcAngle);
+}
+
+sub EraseArc {
+ local($rect,$startAngle,$arcAngle) = @_;
+ $pict .= pack('n',0x0062) . $rect;
+ $pict .= pack('nn',$startAngle,$arcAngle);
+}
+
+sub InvertArc {
+ local($rect,$startAngle,$arcAngle) = @_;
+ $pict .= pack('n',0x0063) . $rect;
+ $pict .= pack('nn',$startAngle,$arcAngle);
+}
+
+sub FillArc {
+ local($rect,$startAngle,$arcAngle,$pattern) = @_;
+ local($oldpat) = $_PnPattern;
+ &PenPat($pattern);
+ &PaintArc($rect,$startAngle,$arcAngle);
+ &PenPat($oldpat);
+}
+
+# Round rects
+sub FrameRoundRect {
+ local($rect,$ovalWidth,$ovalHeight) = @_;
+ unless ($_roundRectCurvature eq "$ovalWidth $ovalHeight") {
+ $pict .= pack('nn2',0x000B,$ovalHeight,$ovalWidth);
+ $_roundRectCurvature = "$ovalWidth $ovalHeight";
+ }
+ $pict .= pack('n',0x0040) . $rect;
+}
+
+sub PaintRoundRect {
+ local($rect,$ovalWidth,$ovalHeight) = @_;
+ unless ($_roundRectCurvature eq "$ovalWidth $ovalHeight") {
+ $pict .= pack('nn2',0x000B,$ovalHeight,$ovalWidth);
+ $_roundRectCurvature = "$ovalWidth $ovalHeight";
+ }
+ $pict .= pack('n',0x0041) . $rect;
+}
+
+sub EraseRoundRect {
+ local($rect,$ovalWidth,$ovalHeight) = @_;
+ unless ($_roundRectCurvature eq "$ovalWidth $ovalHeight") {
+ $pict .= pack('nn2',0x000B,$ovalHeight,$ovalWidth);
+ $_roundRectCurvature = "$ovalWidth $ovalHeight";
+ }
+ $pict .= pack('n',0x0042) . $rect;
+}
+
+sub InvertRoundRect {
+ local($rect,$ovalWidth,$ovalHeight) = @_;
+ unless ($_roundRectCurvature eq "$ovalWidth $ovalHeight") {
+ $pict .= pack('nn2',0x000B,$ovalHeight,$ovalWidth);
+ $_roundRectCurvature = "$ovalWidth $ovalHeight";
+ }
+ $pict .= pack('n',0x0043) . $rect;
+}
+
+sub FillRoundRect {
+ local($rect,$ovalWidth,$ovalHeight,$pattern) = @_;
+ local($oldpat) = $_PnPattern;
+ &PenPat($pattern);
+ &PaintRoundRect($rect,$ovalWidth,$ovalHeight);
+ &PenPat($oldpat);
+}
+
+# Polygons -- you are only allowed to create one polygon at a time.
+# You will be returned a "handle" which contains the growing polygon
+# structure. The "handle" is actually the NAME of the scalar
+sub OpenPoly {
+ $_polyName++;
+ undef $polySave; # close one if it was already defined
+ *polySave = $_polyName;
+ @polySave = (10,0,0,0,0); # initialize it to empty size and rectangle
+ return $_polyName;
+}
+
+sub ClosePoly {
+ *polySave = 'scratch';
+ undef @polySave;
+}
+
+# Kill the poly -- really a no-op in perl
+sub KillPoly {
+ local(*poly) = @_;
+ undef @poly;
+}
+
+# Polygon drawing
+sub FramePoly {
+ local(*poly) = @_;
+ return unless @poly;
+ $pict .= pack('n*',0x0070,@poly);
+}
+
+sub PaintPoly {
+ local(*poly) = @_;
+ return unless @poly;
+ $pict .= pack('n*',0x0071,@poly);
+}
+
+sub ErasePoly {
+ local(*poly) = @_;
+ return unless @poly;
+ $pict .= pack('n*',0x0072,@poly);
+}
+
+sub InvertPoly {
+ local(*poly) = @_;
+ return unless @poly;
+ $pict .= pack('n*',0x0073,@poly);
+}
+
+sub FillPoly {
+ local(*poly,$pattern) = @_;
+ return unless @poly;
+ local($oldpat) = $_PnPattern;
+ &PenPat($pattern);
+ &PaintPoly(*poly);
+ &PenPat($oldpat);
+}
+
+sub OffsetPoly {
+ local(*poly,$dh,$dv) = @_;
+ return unless @poly;
+ local($size,@vertices) = @poly;
+ local($i);
+ for ($i=0;$i<@vertices;$i+=2) {
+ $vertices[$i] += $dv;
+ $vertices[$i+1] += $dh;
+ }
+ @poly = ($size,@vertices);
+}
+
+sub MapPoly {
+ local(*poly,$srcRect,$destRect) = @_;
+ return unless @poly;
+ local($size,@vertices) = @poly;
+ local(@src) = unpack('n4',$srcRect);
+ local(@dest) = unpack('n4',$destRect);
+ local($factorV) = ($dest[2]-$dest[0])/($src[2]-$src[0]);
+ local($factorH) = ($dest[3]-$dest[1])/($src[3]-$src[1]);
+ for ($i=0;$i<@vertices;$i+=2) {
+ $vertices[$i] = int($dest[0] + ($vertices[$i] - $src[0]) * $factorV);
+ $vertices[$i+1] = int($dest[1] + ($vertices[$i+1] - $src[1]) * $factorH);
+ }
+ @poly = ($size,@vertices);
+}
+
+# A utility routine to add a vertex to the growing polygon structure
+# We need to grow both the size of the polygon and increase the bounding
+# rectangle. A special case occurs when we add the first vertex:
+# we store both the current position
+sub _addVertex {
+ local(*polygon,$h,$v) = @_;
+ local($size,$top,$left,$bottom,$right,@vertices) = @polygon;
+ # Special case for empty vertices -- add the current point
+ unless (@vertices) {
+ push(@vertices,$currV,$currH);
+ $size += 4;
+ $top = $bottom = $currV;
+ $left = $right = $currH;
+ }
+
+ # IM V1 implies that all vertices are stored relative to
+ # the first point -- I don't know if this is really the case
+ push (@vertices,$v,$h);
+
+ $size += 4;
+ $top = $v if $v < $top;
+ $bottom = $v if $v > $bottom;
+ $left = $h if $h < $left;
+ $right = $h if $h > $right;
+ @polygon=($size,$top,$left,$bottom,$right,@vertices);
+}
+
+# We try to get the metrics from an X11 bdf font file, if possible.
+sub TextWidth {
+ local($text) = @_;
+
+ # See if we can derive the character widths from a metrics file
+ local($face) = 0xFB & $textFace; # underlining don't count
+ local($metric_name) = &_getFontMetrics($textFont,$textSize,$face);
+ if ($metric_name && (*metrics = $metric_name) && defined(%metrics)) {
+ local($length);
+ foreach (split('',$text)) {
+ $length += $metrics{ord($_)};
+ }
+ return $length;
+ } else { # we get here if we don't have any metrics - make it up
+ local($extra);
+ $extra += $ITALICEXTRA if vec($textFace,$ITALIC,1);
+ $extra += $BOLDEXTRA if vec($textFace,$BOLD,1);
+ return length($text) * $textSize * ($fudgefactor+$extra);
+ }
+}
+
+# Utility routine to read text widths out of bdf files. We create a metrics
+# array on the fly. The names of the metrics files are stored in an array
+# called _metricsArrays. We return the name of the array, or undef if inapplicable.
+sub _getFontMetrics {
+ local($font,$size,$face) = @_;
+ local($key) = "$font $size $face";
+ return $_metricsArrays{$key} if $_metricsArrays{$key};
+
+ # If we get here, we don't have a metrics array to return. See if we can
+ # construct one from a bdf file.
+
+ # Don't bother unless this font is defined.
+ return undef unless $font_metric_files{$key};
+
+ # Don't bother if we tried before and failed
+ return undef if $_failed_metric{$key};
+
+ # Try to open up the bdf file. Remember if we fail
+ unless (open(BDF,"$font_metric_files{$key}")) {
+ $_failed_metric_files{$key}++;
+ return undef;
+ }
+
+ # Wow! We're golden. Create a new metrics array
+ $next_metric++; # bump up the name
+ local(*metrics) = $next_metric; local($char);
+ while (<BDF>) {
+ next unless /^STARTCHAR/../^ENDCHAR/;
+ if (/^ENCODING\s+(\d+)/) { $char = $1; }
+ elsif (/^DWIDTH\s+(\d+)/) { $metrics{$char}=$1; }
+ }
+ close(BDF);
+
+ # Remember the name of the metrics array and return it
+ return $_metricsArrays{$key} = $next_metric;
+}
+
+# Ugly stuff that I want to hide at the bottom
+
+# For the purposes of mapping from quickdraw fonts to X11fonts, we define
+# the following dictionary:
+%font_metric_files = (
+ "22 8 1","$X11FONTS/courB08.bdf",
+ "22 10 1","$X11FONTS/courB10.bdf",
+ "22 12 1","$X11FONTS/courB12.bdf",
+ "22 14 1","$X11FONTS/courB14.bdf",
+ "22 18 1","$X11FONTS/courB18.bdf",
+ "22 24 1","$X11FONTS/courB24.bdf",
+ "22 8 2","$X11FONTS/courO08.bdf",
+ "22 10 2","$X11FONTS/courO10.bdf",
+ "22 12 2","$X11FONTS/courO12.bdf",
+ "22 14 2","$X11FONTS/courO14.bdf",
+ "22 18 2","$X11FONTS/courO18.bdf",
+ "22 24 2","$X11FONTS/courO24.bdf",
+ "22 8 0","$X11FONTS/courR08.bdf",
+ "22 10 0","$X11FONTS/courR10.bdf",
+ "22 12 0","$X11FONTS/courR12.bdf",
+ "22 14 0","$X11FONTS/courR14.bdf",
+ "22 18 0","$X11FONTS/courR18.bdf",
+ "22 24 0","$X11FONTS/courR24.bdf",
+ "21 8 1","$X11FONTS/helvB08.bdf",
+ "21 10 1","$X11FONTS/helvB10.bdf",
+ "21 12 1","$X11FONTS/helvB12.bdf",
+ "21 14 1","$X11FONTS/helvB14.bdf",
+ "21 18 1","$X11FONTS/helvB18.bdf",
+ "21 24 1","$X11FONTS/helvB24.bdf",
+ "21 8 2","$X11FONTS/helvO08.bdf",
+ "21 10 2","$X11FONTS/helvO10.bdf",
+ "21 12 2","$X11FONTS/helvO12.bdf",
+ "21 14 2","$X11FONTS/helvO14.bdf",
+ "21 18 2","$X11FONTS/helvO18.bdf",
+ "21 24 2","$X11FONTS/helvO24.bdf",
+ "21 8 0","$X11FONTS/helvR08.bdf",
+ "21 10 0","$X11FONTS/helvR10.bdf",
+ "21 12 0","$X11FONTS/helvR12.bdf",
+ "21 14 0","$X11FONTS/helvR14.bdf",
+ "21 18 0","$X11FONTS/helvR18.bdf",
+ "21 24 0","$X11FONTS/helvR24.bdf",
+ "20 8 1","$X11FONTS/timB08.bdf",
+ "20 10 1","$X11FONTS/timB10.bdf",
+ "20 12 1","$X11FONTS/timB12.bdf",
+ "20 14 1","$X11FONTS/timB14.bdf",
+ "20 18 1","$X11FONTS/timB18.bdf",
+ "20 24 1","$X11FONTS/timB24.bdf",
+ "20 8 3","$X11FONTS/timBI08.bdf",
+ "20 10 3","$X11FONTS/timBI10.bdf",
+ "20 12 3","$X11FONTS/timBI12.bdf",
+ "20 14 3","$X11FONTS/timBI14.bdf",
+ "20 18 3","$X11FONTS/timBI18.bdf",
+ "20 24 3","$X11FONTS/timBI24.bdf",
+ "20 8 2","$X11FONTS/timI08.bdf",
+ "20 10 2","$X11FONTS/timI10.bdf",
+ "20 12 2","$X11FONTS/timI12.bdf",
+ "20 14 2","$X11FONTS/timI14.bdf",
+ "20 18 2","$X11FONTS/timI18.bdf",
+ "20 24 2","$X11FONTS/timI24.bdf",
+ "20 8 0","$X11FONTS/timR08.bdf",
+ "20 10 0","$X11FONTS/timR10.bdf",
+ "20 12 0","$X11FONTS/timR12.bdf",
+ "20 14 0","$X11FONTS/timR14.bdf",
+ "20 18 0","$X11FONTS/timR18.bdf",
+ "20 24 0","$X11FONTS/timR24.bdf",
+ "34 8 1","$X11FONTS/ncenB08.bdf",
+ "34 10 1","$X11FONTS/ncenB10.bdf",
+ "34 12 1","$X11FONTS/ncenB12.bdf",
+ "34 14 1","$X11FONTS/ncenB14.bdf",
+ "34 18 1","$X11FONTS/ncenB18.bdf",
+ "34 24 1","$X11FONTS/ncenB24.bdf",
+ "34 8 3","$X11FONTS/ncenBI08.bdf",
+ "34 10 3","$X11FONTS/ncenBI10.bdf",
+ "34 12 3","$X11FONTS/ncenBI12.bdf",
+ "34 14 3","$X11FONTS/ncenBI14.bdf",
+ "34 18 3","$X11FONTS/ncenBI18.bdf",
+ "34 24 3","$X11FONTS/ncenBI24.bdf",
+ "34 8 2","$X11FONTS/ncenI08.bdf",
+ "34 10 2","$X11FONTS/ncenI10.bdf",
+ "34 12 2","$X11FONTS/ncenI12.bdf",
+ "34 14 2","$X11FONTS/ncenI14.bdf",
+ "34 18 2","$X11FONTS/ncenI18.bdf",
+ "34 24 2","$X11FONTS/ncenI24.bdf",
+ "34 8 0","$X11FONTS/ncenR08.bdf",
+ "34 10 0","$X11FONTS/ncenR10.bdf",
+ "34 12 0","$X11FONTS/ncenR12.bdf",
+ "34 14 0","$X11FONTS/ncenR14.bdf",
+ "34 18 0","$X11FONTS/ncenR18.bdf",
+ "34 24 0","$X11FONTS/ncenR24.bdf"
+ );
+$next_metric = "metrics0000"; # name of our metrics arrays - dynamically allocated
+
+1;
+} #end of package qd
+
diff --git a/Master/tlpkg/tlperl.straw/lib/shellwords.pl b/Master/tlpkg/tlperl.straw/lib/shellwords.pl
new file mode 100755
index 00000000000..b3ef33ebd9f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/shellwords.pl
@@ -0,0 +1,14 @@
+;# shellwords.pl
+;#
+;# Usage:
+;# require 'shellwords.pl';
+;# @words = shellwords($line);
+;# or
+;# @words = shellwords(@lines);
+;# or
+;# @words = shellwords(); # defaults to $_ (and clobbers it)
+
+require Text::ParseWords;
+*shellwords = \&Text::ParseWords::old_shellwords;
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/sort.pm b/Master/tlpkg/tlperl.straw/lib/sort.pm
new file mode 100755
index 00000000000..922f82b4691
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/sort.pm
@@ -0,0 +1,196 @@
+package sort;
+
+our $VERSION = '2.01';
+
+# The hints for pp_sort are now stored in $^H{sort}; older versions
+# of perl used the global variable $sort::hints. -- rjh 2005-12-19
+
+$sort::quicksort_bit = 0x00000001;
+$sort::mergesort_bit = 0x00000002;
+$sort::sort_bits = 0x000000FF; # allow 256 different ones
+$sort::stable_bit = 0x00000100;
+
+use strict;
+
+sub import {
+ shift;
+ if (@_ == 0) {
+ require Carp;
+ Carp::croak("sort pragma requires arguments");
+ }
+ local $_;
+ $^H{sort} //= 0;
+ while ($_ = shift(@_)) {
+ if (/^_q(?:uick)?sort$/) {
+ $^H{sort} &= ~$sort::sort_bits;
+ $^H{sort} |= $sort::quicksort_bit;
+ } elsif ($_ eq '_mergesort') {
+ $^H{sort} &= ~$sort::sort_bits;
+ $^H{sort} |= $sort::mergesort_bit;
+ } elsif ($_ eq 'stable') {
+ $^H{sort} |= $sort::stable_bit;
+ } elsif ($_ eq 'defaults') {
+ $^H{sort} = 0;
+ } else {
+ require Carp;
+ Carp::croak("sort: unknown subpragma '$_'");
+ }
+ }
+}
+
+sub unimport {
+ shift;
+ if (@_ == 0) {
+ require Carp;
+ Carp::croak("sort pragma requires arguments");
+ }
+ local $_;
+ no warnings 'uninitialized'; # bitops would warn
+ while ($_ = shift(@_)) {
+ if (/^_q(?:uick)?sort$/) {
+ $^H{sort} &= ~$sort::sort_bits;
+ } elsif ($_ eq '_mergesort') {
+ $^H{sort} &= ~$sort::sort_bits;
+ } elsif ($_ eq 'stable') {
+ $^H{sort} &= ~$sort::stable_bit;
+ } else {
+ require Carp;
+ Carp::croak("sort: unknown subpragma '$_'");
+ }
+ }
+}
+
+sub current {
+ my @sort;
+ if ($^H{sort}) {
+ push @sort, 'quicksort' if $^H{sort} & $sort::quicksort_bit;
+ push @sort, 'mergesort' if $^H{sort} & $sort::mergesort_bit;
+ push @sort, 'stable' if $^H{sort} & $sort::stable_bit;
+ }
+ push @sort, 'mergesort' unless @sort;
+ join(' ', @sort);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+sort - perl pragma to control sort() behaviour
+
+=head1 SYNOPSIS
+
+ use sort 'stable'; # guarantee stability
+ use sort '_quicksort'; # use a quicksort algorithm
+ use sort '_mergesort'; # use a mergesort algorithm
+ use sort 'defaults'; # revert to default behavior
+ no sort 'stable'; # stability not important
+
+ use sort '_qsort'; # alias for quicksort
+
+ my $current;
+ BEGIN {
+ $current = sort::current(); # identify prevailing algorithm
+ }
+
+=head1 DESCRIPTION
+
+With the C<sort> pragma you can control the behaviour of the builtin
+C<sort()> function.
+
+In Perl versions 5.6 and earlier the quicksort algorithm was used to
+implement C<sort()>, but in Perl 5.8 a mergesort algorithm was also made
+available, mainly to guarantee worst case O(N log N) behaviour:
+the worst case of quicksort is O(N**2). In Perl 5.8 and later,
+quicksort defends against quadratic behaviour by shuffling large
+arrays before sorting.
+
+A stable sort means that for records that compare equal, the original
+input ordering is preserved. Mergesort is stable, quicksort is not.
+Stability will matter only if elements that compare equal can be
+distinguished in some other way. That means that simple numerical
+and lexical sorts do not profit from stability, since equal elements
+are indistinguishable. However, with a comparison such as
+
+ { substr($a, 0, 3) cmp substr($b, 0, 3) }
+
+stability might matter because elements that compare equal on the
+first 3 characters may be distinguished based on subsequent characters.
+In Perl 5.8 and later, quicksort can be stabilized, but doing so will
+add overhead, so it should only be done if it matters.
+
+The best algorithm depends on many things. On average, mergesort
+does fewer comparisons than quicksort, so it may be better when
+complicated comparison routines are used. Mergesort also takes
+advantage of pre-existing order, so it would be favored for using
+C<sort()> to merge several sorted arrays. On the other hand, quicksort
+is often faster for small arrays, and on arrays of a few distinct
+values, repeated many times. You can force the
+choice of algorithm with this pragma, but this feels heavy-handed,
+so the subpragmas beginning with a C<_> may not persist beyond Perl 5.8.
+The default algorithm is mergesort, which will be stable even if
+you do not explicitly demand it.
+But the stability of the default sort is a side-effect that could
+change in later versions. If stability is important, be sure to
+say so with a
+
+ use sort 'stable';
+
+The C<no sort> pragma doesn't
+I<forbid> what follows, it just leaves the choice open. Thus, after
+
+ no sort qw(_mergesort stable);
+
+a mergesort, which happens to be stable, will be employed anyway.
+Note that
+
+ no sort "_quicksort";
+ no sort "_mergesort";
+
+have exactly the same effect, leaving the choice of sort algorithm open.
+
+=head1 CAVEATS
+
+As of Perl 5.10, this pragma is lexically scoped and takes effect
+at compile time. In earlier versions its effect was global and took
+effect at run-time; the documentation suggested using C<eval()> to
+change the behaviour:
+
+ { eval 'use sort qw(defaults _quicksort)'; # force quicksort
+ eval 'no sort "stable"'; # stability not wanted
+ print sort::current . "\n";
+ @a = sort @b;
+ eval 'use sort "defaults"'; # clean up, for others
+ }
+ { eval 'use sort qw(defaults stable)'; # force stability
+ print sort::current . "\n";
+ @c = sort @d;
+ eval 'use sort "defaults"'; # clean up, for others
+ }
+
+Such code no longer has the desired effect, for two reasons.
+Firstly, the use of C<eval()> means that the sorting algorithm
+is not changed until runtime, by which time it's too late to
+have any effect. Secondly, C<sort::current> is also called at
+run-time, when in fact the compile-time value of C<sort::current>
+is the one that matters.
+
+So now this code would be written:
+
+ { use sort qw(defaults _quicksort); # force quicksort
+ no sort "stable"; # stability not wanted
+ my $current;
+ BEGIN { $current = print sort::current; }
+ print "$current\n";
+ @a = sort @b;
+ # Pragmas go out of scope at the end of the block
+ }
+ { use sort qw(defaults stable); # force stability
+ my $current;
+ BEGIN { $current = print sort::current; }
+ print "$current\n";
+ @c = sort @d;
+ }
+
+=cut
+
diff --git a/Master/tlpkg/tlperl.straw/lib/strict.pm b/Master/tlpkg/tlperl.straw/lib/strict.pm
new file mode 100755
index 00000000000..053aae75012
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/strict.pm
@@ -0,0 +1,147 @@
+package strict;
+
+$strict::VERSION = "1.04";
+
+# Verify that we're called correctly so that strictures will work.
+unless ( __FILE__ =~ /(^|[\/\\])\Q${\__PACKAGE__}\E\.pmc?$/ ) {
+ # Can't use Carp, since Carp uses us!
+ my (undef, $f, $l) = caller;
+ die("Incorrect use of pragma '${\__PACKAGE__}' at $f line $l.\n");
+}
+
+my %bitmask = (
+refs => 0x00000002,
+subs => 0x00000200,
+vars => 0x00000400
+);
+
+sub bits {
+ my $bits = 0;
+ my @wrong;
+ foreach my $s (@_) {
+ push @wrong, $s unless exists $bitmask{$s};
+ $bits |= $bitmask{$s} || 0;
+ }
+ if (@wrong) {
+ require Carp;
+ Carp::croak("Unknown 'strict' tag(s) '@wrong'");
+ }
+ $bits;
+}
+
+my $default_bits = bits(qw(refs subs vars));
+
+sub import {
+ shift;
+ $^H |= @_ ? bits(@_) : $default_bits;
+}
+
+sub unimport {
+ shift;
+ $^H &= ~ (@_ ? bits(@_) : $default_bits);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+strict - Perl pragma to restrict unsafe constructs
+
+=head1 SYNOPSIS
+
+ use strict;
+
+ use strict "vars";
+ use strict "refs";
+ use strict "subs";
+
+ use strict;
+ no strict "vars";
+
+=head1 DESCRIPTION
+
+If no import list is supplied, all possible restrictions are assumed.
+(This is the safest mode to operate in, but is sometimes too strict for
+casual programming.) Currently, there are three possible things to be
+strict about: "subs", "vars", and "refs".
+
+=over 6
+
+=item C<strict refs>
+
+This generates a runtime error if you
+use symbolic references (see L<perlref>).
+
+ use strict 'refs';
+ $ref = \$foo;
+ print $$ref; # ok
+ $ref = "foo";
+ print $$ref; # runtime error; normally ok
+ $file = "STDOUT";
+ print $file "Hi!"; # error; note: no comma after $file
+
+There is one exception to this rule:
+
+ $bar = \&{'foo'};
+ &$bar;
+
+is allowed so that C<goto &$AUTOLOAD> would not break under stricture.
+
+
+=item C<strict vars>
+
+This generates a compile-time error if you access a variable that wasn't
+declared via C<our> or C<use vars>,
+localized via C<my()>, or wasn't fully qualified. Because this is to avoid
+variable suicide problems and subtle dynamic scoping issues, a merely
+local() variable isn't good enough. See L<perlfunc/my> and
+L<perlfunc/local>.
+
+ use strict 'vars';
+ $X::foo = 1; # ok, fully qualified
+ my $foo = 10; # ok, my() var
+ local $foo = 9; # blows up
+
+ package Cinna;
+ our $bar; # Declares $bar in current package
+ $bar = 'HgS'; # ok, global declared via pragma
+
+The local() generated a compile-time error because you just touched a global
+name without fully qualifying it.
+
+Because of their special use by sort(), the variables $a and $b are
+exempted from this check.
+
+=item C<strict subs>
+
+This disables the poetry optimization, generating a compile-time error if
+you try to use a bareword identifier that's not a subroutine, unless it
+is a simple identifier (no colons) and that it appears in curly braces or
+on the left hand side of the C<< => >> symbol.
+
+ use strict 'subs';
+ $SIG{PIPE} = Plumber; # blows up
+ $SIG{PIPE} = "Plumber"; # just fine: quoted string is always ok
+ $SIG{PIPE} = \&Plumber; # preferred form
+
+=back
+
+See L<perlmodlib/Pragmatic Modules>.
+
+=head1 HISTORY
+
+C<strict 'subs'>, with Perl 5.6.1, erroneously permitted to use an unquoted
+compound identifier (e.g. C<Foo::Bar>) as a hash key (before C<< => >> or
+inside curlies), but without forcing it always to a literal string.
+
+Starting with Perl 5.8.1 strict is strict about its restrictions:
+if unknown restrictions are used, the strict pragma will abort with
+
+ Unknown 'strict' tag(s) '...'
+
+As of version 1.04 (Perl 5.10), strict verifies that it is used as
+"strict" to avoid the dreaded Strict trap on case insensitive file
+systems.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/subs.pm b/Master/tlpkg/tlperl.straw/lib/subs.pm
new file mode 100755
index 00000000000..e5a9aa8827d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/subs.pm
@@ -0,0 +1,40 @@
+package subs;
+
+our $VERSION = '1.00';
+
+=head1 NAME
+
+subs - Perl pragma to predeclare sub names
+
+=head1 SYNOPSIS
+
+ use subs qw(frob);
+ frob 3..10;
+
+=head1 DESCRIPTION
+
+This will predeclare all the subroutine whose names are
+in the list, allowing you to use them without parentheses
+even before they're declared.
+
+Unlike pragmas that affect the C<$^H> hints variable, the C<use vars> and
+C<use subs> declarations are not BLOCK-scoped. They are thus effective
+for the entire file in which they appear. You may not rescind such
+declarations with C<no vars> or C<no subs>.
+
+See L<perlmodlib/Pragmatic Modules> and L<strict/strict subs>.
+
+=cut
+
+require 5.000;
+
+sub import {
+ my $callpack = caller;
+ my $pack = shift;
+ my @imports = @_;
+ foreach $sym (@imports) {
+ *{"${callpack}::$sym"} = \&{"${callpack}::$sym"};
+ }
+};
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/syslog.pl b/Master/tlpkg/tlperl.straw/lib/syslog.pl
new file mode 100755
index 00000000000..f0dbb1c96a2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/syslog.pl
@@ -0,0 +1,199 @@
+#
+# syslog.pl
+#
+# $Log: syslog.pl,v $
+#
+# tom christiansen <tchrist@convex.com>
+# modified to use sockets by Larry Wall <lwall@jpl-devvax.jpl.nasa.gov>
+# NOTE: openlog now takes three arguments, just like openlog(3)
+#
+# call syslog() with a string priority and a list of printf() args
+# like syslog(3)
+#
+# usage: require 'syslog.pl';
+#
+# then (put these all in a script to test function)
+#
+#
+# do openlog($program,'cons,pid','user');
+# do syslog('info','this is another test');
+# do syslog('mail|warning','this is a better test: %d', time);
+# do closelog();
+#
+# do syslog('debug','this is the last test');
+# do openlog("$program $$",'ndelay','user');
+# do syslog('notice','fooprogram: this is really done');
+#
+# $! = 55;
+# do syslog('info','problem was %m'); # %m == $! in syslog(3)
+
+package syslog;
+
+use warnings::register;
+
+$host = 'localhost' unless $host; # set $syslog'host to change
+
+if ($] >= 5 && warnings::enabled()) {
+ warnings::warn("You should 'use Sys::Syslog' instead; continuing");
+}
+
+require 'syslog.ph';
+
+ eval 'use Socket; 1' ||
+ eval { require "socket.ph" } ||
+ require "sys/socket.ph";
+
+$maskpri = &LOG_UPTO(&LOG_DEBUG);
+
+sub main'openlog {
+ ($ident, $logopt, $facility) = @_; # package vars
+ $lo_pid = $logopt =~ /\bpid\b/;
+ $lo_ndelay = $logopt =~ /\bndelay\b/;
+ $lo_cons = $logopt =~ /\bcons\b/;
+ $lo_nowait = $logopt =~ /\bnowait\b/;
+ &connect if $lo_ndelay;
+}
+
+sub main'closelog {
+ $facility = $ident = '';
+ &disconnect;
+}
+
+sub main'setlogmask {
+ local($oldmask) = $maskpri;
+ $maskpri = shift;
+ $oldmask;
+}
+
+sub main'syslog {
+ local($priority) = shift;
+ local($mask) = shift;
+ local($message, $whoami);
+ local(@words, $num, $numpri, $numfac, $sum);
+ local($facility) = $facility; # may need to change temporarily.
+
+ die "syslog: expected both priority and mask" unless $mask && $priority;
+
+ @words = split(/\W+/, $priority, 2);# Allow "level" or "level|facility".
+ undef $numpri;
+ undef $numfac;
+ foreach (@words) {
+ $num = &xlate($_); # Translate word to number.
+ if (/^kern$/ || $num < 0) {
+ die "syslog: invalid level/facility: $_\n";
+ }
+ elsif ($num <= &LOG_PRIMASK) {
+ die "syslog: too many levels given: $_\n" if defined($numpri);
+ $numpri = $num;
+ return 0 unless &LOG_MASK($numpri) & $maskpri;
+ }
+ else {
+ die "syslog: too many facilities given: $_\n" if defined($numfac);
+ $facility = $_;
+ $numfac = $num;
+ }
+ }
+
+ die "syslog: level must be given\n" unless defined($numpri);
+
+ if (!defined($numfac)) { # Facility not specified in this call.
+ $facility = 'user' unless $facility;
+ $numfac = &xlate($facility);
+ }
+
+ &connect unless $connected;
+
+ $whoami = $ident;
+
+ if (!$ident && $mask =~ /^(\S.*):\s?(.*)/) {
+ $whoami = $1;
+ $mask = $2;
+ }
+
+ unless ($whoami) {
+ ($whoami = getlogin) ||
+ ($whoami = getpwuid($<)) ||
+ ($whoami = 'syslog');
+ }
+
+ $whoami .= "[$$]" if $lo_pid;
+
+ $mask =~ s/%m/$!/g;
+ $mask .= "\n" unless $mask =~ /\n$/;
+ $message = sprintf ($mask, @_);
+
+ $sum = $numpri + $numfac;
+ unless (send(SYSLOG,"<$sum>$whoami: $message",0)) {
+ if ($lo_cons) {
+ if ($pid = fork) {
+ unless ($lo_nowait) {
+ do {$died = wait;} until $died == $pid || $died < 0;
+ }
+ }
+ else {
+ open(CONS,">/dev/console");
+ print CONS "<$facility.$priority>$whoami: $message\r";
+ exit if defined $pid; # if fork failed, we're parent
+ close CONS;
+ }
+ }
+ }
+}
+
+sub xlate {
+ local($name) = @_;
+ $name = uc $name;
+ $name = "LOG_$name" unless $name =~ /^LOG_/;
+ $name = "syslog'$name";
+ defined &$name ? &$name : -1;
+}
+
+sub connect {
+ $pat = 'S n C4 x8';
+
+ $af_unix = &AF_UNIX;
+ $af_inet = &AF_INET;
+
+ $stream = &SOCK_STREAM;
+ $datagram = &SOCK_DGRAM;
+
+ ($name,$aliases,$proto) = getprotobyname('udp');
+ $udp = $proto;
+
+ ($name,$aliases,$port,$proto) = getservbyname('syslog','udp');
+ $syslog = $port;
+
+ if (chop($myname = `hostname`)) {
+ ($name,$aliases,$addrtype,$length,@addrs) = gethostbyname($myname);
+ die "Can't lookup $myname\n" unless $name;
+ @bytes = unpack("C4",$addrs[0]);
+ }
+ else {
+ @bytes = (0,0,0,0);
+ }
+ $this = pack($pat, $af_inet, 0, @bytes);
+
+ if ($host =~ /^\d+\./) {
+ @bytes = split(/\./,$host);
+ }
+ else {
+ ($name,$aliases,$addrtype,$length,@addrs) = gethostbyname($host);
+ die "Can't lookup $host\n" unless $name;
+ @bytes = unpack("C4",$addrs[0]);
+ }
+ $that = pack($pat,$af_inet,$syslog,@bytes);
+
+ socket(SYSLOG,$af_inet,$datagram,$udp) || die "socket: $!\n";
+ bind(SYSLOG,$this) || die "bind: $!\n";
+ connect(SYSLOG,$that) || die "connect: $!\n";
+
+ local($old) = select(SYSLOG); $| = 1; select($old);
+ $connected = 1;
+}
+
+sub disconnect {
+ close SYSLOG;
+ $connected = 0;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/tainted.pl b/Master/tlpkg/tlperl.straw/lib/tainted.pl
new file mode 100755
index 00000000000..6e24867a83d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/tainted.pl
@@ -0,0 +1,9 @@
+# This subroutine returns true if its argument is tainted, false otherwise.
+
+sub tainted {
+ local($@);
+ eval { kill 0 * $_[0] };
+ $@ =~ /^Insecure/;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/threads.pm b/Master/tlpkg/tlperl.straw/lib/threads.pm
new file mode 100755
index 00000000000..4552e50959b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/threads.pm
@@ -0,0 +1,1066 @@
+package threads;
+
+use 5.008;
+
+use strict;
+use warnings;
+
+our $VERSION = '1.75';
+my $XS_VERSION = $VERSION;
+$VERSION = eval $VERSION;
+
+# Verify this Perl supports threads
+require Config;
+if (! $Config::Config{useithreads}) {
+ die("This Perl not built to support threads\n");
+}
+
+# Complain if 'threads' is loaded after 'threads::shared'
+if ($threads::shared::threads_shared) {
+ warn <<'_MSG_';
+Warning, threads::shared has already been loaded. To
+enable shared variables, 'use threads' must be called
+before threads::shared or any module that uses it.
+_MSG_
+}
+
+# Declare that we have been loaded
+$threads::threads = 1;
+
+# Load the XS code
+require XSLoader;
+XSLoader::load('threads', $XS_VERSION);
+
+
+### Export ###
+
+sub import
+{
+ my $class = shift; # Not used
+
+ # Exported subroutines
+ my @EXPORT = qw(async);
+
+ # Handle args
+ while (my $sym = shift) {
+ if ($sym =~ /^(?:stack|exit)/i) {
+ if (defined(my $arg = shift)) {
+ if ($sym =~ /^stack/i) {
+ threads->set_stack_size($arg);
+ } else {
+ $threads::thread_exit_only = $arg =~ /^thread/i;
+ }
+ } else {
+ require Carp;
+ Carp::croak("threads: Missing argument for option: $sym");
+ }
+
+ } elsif ($sym =~ /^str/i) {
+ import overload ('""' => \&tid);
+
+ } elsif ($sym =~ /^(?::all|yield)$/) {
+ push(@EXPORT, qw(yield));
+
+ } else {
+ require Carp;
+ Carp::croak("threads: Unknown import option: $sym");
+ }
+ }
+
+ # Export subroutine names
+ my $caller = caller();
+ foreach my $sym (@EXPORT) {
+ no strict 'refs';
+ *{$caller.'::'.$sym} = \&{$sym};
+ }
+
+ # Set stack size via environment variable
+ if (exists($ENV{'PERL5_ITHREADS_STACK_SIZE'})) {
+ threads->set_stack_size($ENV{'PERL5_ITHREADS_STACK_SIZE'});
+ }
+}
+
+
+### Methods, etc. ###
+
+# Exit from a thread (only)
+sub exit
+{
+ my ($class, $status) = @_;
+ if (! defined($status)) {
+ $status = 0;
+ }
+
+ # Class method only
+ if (ref($class)) {
+ require Carp;
+ Carp::croak('Usage: threads->exit(status)');
+ }
+
+ $class->set_thread_exit_only(1);
+ CORE::exit($status);
+}
+
+# 'Constant' args for threads->list()
+sub threads::all { }
+sub threads::running { 1 }
+sub threads::joinable { 0 }
+
+# 'new' is an alias for 'create'
+*new = \&create;
+
+# 'async' is a function alias for the 'threads->create()' method
+sub async (&;@)
+{
+ unshift(@_, 'threads');
+ # Use "goto" trick to avoid pad problems from 5.8.1 (fixed in 5.8.2)
+ goto &create;
+}
+
+# Thread object equality checking
+use overload (
+ '==' => \&equal,
+ '!=' => sub { ! equal(@_) },
+ 'fallback' => 1
+);
+
+1;
+
+__END__
+
+=head1 NAME
+
+threads - Perl interpreter-based threads
+
+=head1 VERSION
+
+This document describes threads version 1.75
+
+=head1 SYNOPSIS
+
+ use threads ('yield',
+ 'stack_size' => 64*4096,
+ 'exit' => 'threads_only',
+ 'stringify');
+
+ sub start_thread {
+ my @args = @_;
+ print('Thread started: ', join(' ', @args), "\n");
+ }
+ my $thr = threads->create('start_thread', 'argument');
+ $thr->join();
+
+ threads->create(sub { print("I am a thread\n"); })->join();
+
+ my $thr2 = async { foreach (@files) { ... } };
+ $thr2->join();
+ if (my $err = $thr2->error()) {
+ warn("Thread error: $err\n");
+ }
+
+ # Invoke thread in list context (implicit) so it can return a list
+ my ($thr) = threads->create(sub { return (qw/a b c/); });
+ # or specify list context explicitly
+ my $thr = threads->create({'context' => 'list'},
+ sub { return (qw/a b c/); });
+ my @results = $thr->join();
+
+ $thr->detach();
+
+ # Get a thread's object
+ $thr = threads->self();
+ $thr = threads->object($tid);
+
+ # Get a thread's ID
+ $tid = threads->tid();
+ $tid = $thr->tid();
+ $tid = "$thr";
+
+ # Give other threads a chance to run
+ threads->yield();
+ yield();
+
+ # Lists of non-detached threads
+ my @threads = threads->list();
+ my $thread_count = threads->list();
+
+ my @running = threads->list(threads::running);
+ my @joinable = threads->list(threads::joinable);
+
+ # Test thread objects
+ if ($thr1 == $thr2) {
+ ...
+ }
+
+ # Manage thread stack size
+ $stack_size = threads->get_stack_size();
+ $old_size = threads->set_stack_size(32*4096);
+
+ # Create a thread with a specific context and stack size
+ my $thr = threads->create({ 'context' => 'list',
+ 'stack_size' => 32*4096,
+ 'exit' => 'thread_only' },
+ \&foo);
+
+ # Get thread's context
+ my $wantarray = $thr->wantarray();
+
+ # Check thread's state
+ if ($thr->is_running()) {
+ sleep(1);
+ }
+ if ($thr->is_joinable()) {
+ $thr->join();
+ }
+
+ # Send a signal to a thread
+ $thr->kill('SIGUSR1');
+
+ # Exit a thread
+ threads->exit();
+
+=head1 DESCRIPTION
+
+Since Perl 5.8, thread programming has been available using a model called
+I<interpreter threads> which provides a new Perl interpreter for each
+thread, and, by default, results in no data or state information being shared
+between threads.
+
+(Prior to Perl 5.8, I<5005threads> was available through the C<Thread.pm> API.
+This threading model has been deprecated, and was removed as of Perl 5.10.0.)
+
+As just mentioned, all variables are, by default, thread local. To use shared
+variables, you need to also load L<threads::shared>:
+
+ use threads;
+ use threads::shared;
+
+When loading L<threads::shared>, you must C<use threads> before you
+C<use threads::shared>. (C<threads> will emit a warning if you do it the
+other way around.)
+
+It is strongly recommended that you enable threads via C<use threads> as early
+as possible in your script.
+
+If needed, scripts can be written so as to run on both threaded and
+non-threaded Perls:
+
+ my $can_use_threads = eval 'use threads; 1';
+ if ($can_use_threads) {
+ # Do processing using threads
+ ...
+ } else {
+ # Do it without using threads
+ ...
+ }
+
+=over
+
+=item $thr = threads->create(FUNCTION, ARGS)
+
+This will create a new thread that will begin execution with the specified
+entry point function, and give it the I<ARGS> list as parameters. It will
+return the corresponding threads object, or C<undef> if thread creation failed.
+
+I<FUNCTION> may either be the name of a function, an anonymous subroutine, or
+a code ref.
+
+ my $thr = threads->create('func_name', ...);
+ # or
+ my $thr = threads->create(sub { ... }, ...);
+ # or
+ my $thr = threads->create(\&func, ...);
+
+The C<-E<gt>new()> method is an alias for C<-E<gt>create()>.
+
+=item $thr->join()
+
+This will wait for the corresponding thread to complete its execution. When
+the thread finishes, C<-E<gt>join()> will return the return value(s) of the
+entry point function.
+
+The context (void, scalar or list) for the return value(s) for C<-E<gt>join()>
+is determined at the time of thread creation.
+
+ # Create thread in list context (implicit)
+ my ($thr1) = threads->create(sub {
+ my @results = qw(a b c);
+ return (@results);
+ });
+ # or (explicit)
+ my $thr1 = threads->create({'context' => 'list'},
+ sub {
+ my @results = qw(a b c);
+ return (@results);
+ });
+ # Retrieve list results from thread
+ my @res1 = $thr1->join();
+
+ # Create thread in scalar context (implicit)
+ my $thr2 = threads->create(sub {
+ my $result = 42;
+ return ($result);
+ });
+ # Retrieve scalar result from thread
+ my $res2 = $thr2->join();
+
+ # Create a thread in void context (explicit)
+ my $thr3 = threads->create({'void' => 1},
+ sub { print("Hello, world\n"); });
+ # Join the thread in void context (i.e., no return value)
+ $thr3->join();
+
+See L</"THREAD CONTEXT"> for more details.
+
+If the program exits without all threads having either been joined or
+detached, then a warning will be issued.
+
+Calling C<-E<gt>join()> or C<-E<gt>detach()> on an already joined thread will
+cause an error to be thrown.
+
+=item $thr->detach()
+
+Makes the thread unjoinable, and causes any eventual return value to be
+discarded. When the program exits, any detached threads that are still
+running are silently terminated.
+
+If the program exits without all threads having either been joined or
+detached, then a warning will be issued.
+
+Calling C<-E<gt>join()> or C<-E<gt>detach()> on an already detached thread
+will cause an error to be thrown.
+
+=item threads->detach()
+
+Class method that allows a thread to detach itself.
+
+=item threads->self()
+
+Class method that allows a thread to obtain its own I<threads> object.
+
+=item $thr->tid()
+
+Returns the ID of the thread. Thread IDs are unique integers with the main
+thread in a program being 0, and incrementing by 1 for every thread created.
+
+=item threads->tid()
+
+Class method that allows a thread to obtain its own ID.
+
+=item "$thr"
+
+If you add the C<stringify> import option to your C<use threads> declaration,
+then using a threads object in a string or a string context (e.g., as a hash
+key) will cause its ID to be used as the value:
+
+ use threads qw(stringify);
+
+ my $thr = threads->create(...);
+ print("Thread $thr started...\n"); # Prints out: Thread 1 started...
+
+=item threads->object($tid)
+
+This will return the I<threads> object for the I<active> thread associated
+with the specified thread ID. Returns C<undef> if there is no thread
+associated with the TID, if the thread is joined or detached, if no TID is
+specified or if the specified TID is undef.
+
+=item threads->yield()
+
+This is a suggestion to the OS to let this thread yield CPU time to other
+threads. What actually happens is highly dependent upon the underlying
+thread implementation.
+
+You may do C<use threads qw(yield)>, and then just use C<yield()> in your
+code.
+
+=item threads->list()
+
+=item threads->list(threads::all)
+
+=item threads->list(threads::running)
+
+=item threads->list(threads::joinable)
+
+With no arguments (or using C<threads::all>) and in a list context, returns a
+list of all non-joined, non-detached I<threads> objects. In a scalar context,
+returns a count of the same.
+
+With a I<true> argument (using C<threads::running>), returns a list of all
+non-joined, non-detached I<threads> objects that are still running.
+
+With a I<false> argument (using C<threads::joinable>), returns a list of all
+non-joined, non-detached I<threads> objects that have finished running (i.e.,
+for which C<-E<gt>join()> will not I<block>).
+
+=item $thr1->equal($thr2)
+
+Tests if two threads objects are the same thread or not. This is overloaded
+to the more natural forms:
+
+ if ($thr1 == $thr2) {
+ print("Threads are the same\n");
+ }
+ # or
+ if ($thr1 != $thr2) {
+ print("Threads differ\n");
+ }
+
+(Thread comparison is based on thread IDs.)
+
+=item async BLOCK;
+
+C<async> creates a thread to execute the block immediately following
+it. This block is treated as an anonymous subroutine, and so must have a
+semicolon after the closing brace. Like C<threads-E<gt>create()>, C<async>
+returns a I<threads> object.
+
+=item $thr->error()
+
+Threads are executed in an C<eval> context. This method will return C<undef>
+if the thread terminates I<normally>. Otherwise, it returns the value of
+C<$@> associated with the thread's execution status in its C<eval> context.
+
+=item $thr->_handle()
+
+This I<private> method returns the memory location of the internal thread
+structure associated with a threads object. For Win32, this is a pointer to
+the C<HANDLE> value returned by C<CreateThread> (i.e., C<HANDLE *>); for other
+platforms, it is a pointer to the C<pthread_t> structure used in the
+C<pthread_create> call (i.e., C<pthread_t *>).
+
+This method is of no use for general Perl threads programming. Its intent is
+to provide other (XS-based) thread modules with the capability to access, and
+possibly manipulate, the underlying thread structure associated with a Perl
+thread.
+
+=item threads->_handle()
+
+Class method that allows a thread to obtain its own I<handle>.
+
+=back
+
+=head1 EXITING A THREAD
+
+The usual method for terminating a thread is to
+L<return()|perlfunc/"return EXPR"> from the entry point function with the
+appropriate return value(s).
+
+=over
+
+=item threads->exit()
+
+If needed, a thread can be exited at any time by calling
+C<threads-E<gt>exit()>. This will cause the thread to return C<undef> in a
+scalar context, or the empty list in a list context.
+
+When called from the I<main> thread, this behaves the same as C<exit(0)>.
+
+=item threads->exit(status)
+
+When called from a thread, this behaves like C<threads-E<gt>exit()> (i.e., the
+exit status code is ignored).
+
+When called from the I<main> thread, this behaves the same as C<exit(status)>.
+
+=item die()
+
+Calling C<die()> in a thread indicates an abnormal exit for the thread. Any
+C<$SIG{__DIE__}> handler in the thread will be called first, and then the
+thread will exit with a warning message that will contain any arguments passed
+in the C<die()> call.
+
+=item exit(status)
+
+Calling L<exit()|perlfunc/"exit EXPR"> inside a thread causes the whole
+application to terminate. Because of this, the use of C<exit()> inside
+threaded code, or in modules that might be used in threaded applications, is
+strongly discouraged.
+
+If C<exit()> really is needed, then consider using the following:
+
+ threads->exit() if threads->can('exit'); # Thread friendly
+ exit(status);
+
+=item use threads 'exit' => 'threads_only'
+
+This globally overrides the default behavior of calling C<exit()> inside a
+thread, and effectively causes such calls to behave the same as
+C<threads-E<gt>exit()>. In other words, with this setting, calling C<exit()>
+causes only the thread to terminate.
+
+Because of its global effect, this setting should not be used inside modules
+or the like.
+
+The I<main> thread is unaffected by this setting.
+
+=item threads->create({'exit' => 'thread_only'}, ...)
+
+This overrides the default behavior of C<exit()> inside the newly created
+thread only.
+
+=item $thr->set_thread_exit_only(boolean)
+
+This can be used to change the I<exit thread only> behavior for a thread after
+it has been created. With a I<true> argument, C<exit()> will cause only the
+thread to exit. With a I<false> argument, C<exit()> will terminate the
+application.
+
+The I<main> thread is unaffected by this call.
+
+=item threads->set_thread_exit_only(boolean)
+
+Class method for use inside a thread to change its own behavior for C<exit()>.
+
+The I<main> thread is unaffected by this call.
+
+=back
+
+=head1 THREAD STATE
+
+The following boolean methods are useful in determining the I<state> of a
+thread.
+
+=over
+
+=item $thr->is_running()
+
+Returns true if a thread is still running (i.e., if its entry point function
+has not yet finished or exited).
+
+=item $thr->is_joinable()
+
+Returns true if the thread has finished running, is not detached and has not
+yet been joined. In other words, the thread is ready to be joined, and a call
+to C<$thr-E<gt>join()> will not I<block>.
+
+=item $thr->is_detached()
+
+Returns true if the thread has been detached.
+
+=item threads->is_detached()
+
+Class method that allows a thread to determine whether or not it is detached.
+
+=back
+
+=head1 THREAD CONTEXT
+
+As with subroutines, the type of value returned from a thread's entry point
+function may be determined by the thread's I<context>: list, scalar or void.
+The thread's context is determined at thread creation. This is necessary so
+that the context is available to the entry point function via
+L<wantarray()|perlfunc/"wantarray">. The thread may then specify a value of
+the appropriate type to be returned from C<-E<gt>join()>.
+
+=head2 Explicit context
+
+Because thread creation and thread joining may occur in different contexts, it
+may be desirable to state the context explicitly to the thread's entry point
+function. This may be done by calling C<-E<gt>create()> with a hash reference
+as the first argument:
+
+ my $thr = threads->create({'context' => 'list'}, \&foo);
+ ...
+ my @results = $thr->join();
+
+In the above, the threads object is returned to the parent thread in scalar
+context, and the thread's entry point function C<foo> will be called in list
+(array) context such that the parent thread can receive a list (array) from
+the C<-E<gt>join()> call. (C<'array'> is synonymous with C<'list'>.)
+
+Similarly, if you need the threads object, but your thread will not be
+returning a value (i.e., I<void> context), you would do the following:
+
+ my $thr = threads->create({'context' => 'void'}, \&foo);
+ ...
+ $thr->join();
+
+The context type may also be used as the I<key> in the hash reference followed
+by a I<true> value:
+
+ threads->create({'scalar' => 1}, \&foo);
+ ...
+ my ($thr) = threads->list();
+ my $result = $thr->join();
+
+=head2 Implicit context
+
+If not explicitly stated, the thread's context is implied from the context
+of the C<-E<gt>create()> call:
+
+ # Create thread in list context
+ my ($thr) = threads->create(...);
+
+ # Create thread in scalar context
+ my $thr = threads->create(...);
+
+ # Create thread in void context
+ threads->create(...);
+
+=head2 $thr->wantarray()
+
+This returns the thread's context in the same manner as
+L<wantarray()|perlfunc/"wantarray">.
+
+=head2 threads->wantarray()
+
+Class method to return the current thread's context. This returns the same
+value as running L<wantarray()|perlfunc/"wantarray"> inside the current
+thread's entry point function.
+
+=head1 THREAD STACK SIZE
+
+The default per-thread stack size for different platforms varies
+significantly, and is almost always far more than is needed for most
+applications. On Win32, Perl's makefile explicitly sets the default stack to
+16 MB; on most other platforms, the system default is used, which again may be
+much larger than is needed.
+
+By tuning the stack size to more accurately reflect your application's needs,
+you may significantly reduce your application's memory usage, and increase the
+number of simultaneously running threads.
+
+Note that on Windows, address space allocation granularity is 64 KB,
+therefore, setting the stack smaller than that on Win32 Perl will not save any
+more memory.
+
+=over
+
+=item threads->get_stack_size();
+
+Returns the current default per-thread stack size. The default is zero, which
+means the system default stack size is currently in use.
+
+=item $size = $thr->get_stack_size();
+
+Returns the stack size for a particular thread. A return value of zero
+indicates the system default stack size was used for the thread.
+
+=item $old_size = threads->set_stack_size($new_size);
+
+Sets a new default per-thread stack size, and returns the previous setting.
+
+Some platforms have a minimum thread stack size. Trying to set the stack size
+below this value will result in a warning, and the minimum stack size will be
+used.
+
+Some Linux platforms have a maximum stack size. Setting too large of a stack
+size will cause thread creation to fail.
+
+If needed, C<$new_size> will be rounded up to the next multiple of the memory
+page size (usually 4096 or 8192).
+
+Threads created after the stack size is set will then either call
+C<pthread_attr_setstacksize()> I<(for pthreads platforms)>, or supply the
+stack size to C<CreateThread()> I<(for Win32 Perl)>.
+
+(Obviously, this call does not affect any currently extant threads.)
+
+=item use threads ('stack_size' => VALUE);
+
+This sets the default per-thread stack size at the start of the application.
+
+=item $ENV{'PERL5_ITHREADS_STACK_SIZE'}
+
+The default per-thread stack size may be set at the start of the application
+through the use of the environment variable C<PERL5_ITHREADS_STACK_SIZE>:
+
+ PERL5_ITHREADS_STACK_SIZE=1048576
+ export PERL5_ITHREADS_STACK_SIZE
+ perl -e'use threads; print(threads->get_stack_size(), "\n")'
+
+This value overrides any C<stack_size> parameter given to C<use threads>. Its
+primary purpose is to permit setting the per-thread stack size for legacy
+threaded applications.
+
+=item threads->create({'stack_size' => VALUE}, FUNCTION, ARGS)
+
+To specify a particular stack size for any individual thread, call
+C<-E<gt>create()> with a hash reference as the first argument:
+
+ my $thr = threads->create({'stack_size' => 32*4096}, \&foo, @args);
+
+=item $thr2 = $thr1->create(FUNCTION, ARGS)
+
+This creates a new thread (C<$thr2>) that inherits the stack size from an
+existing thread (C<$thr1>). This is shorthand for the following:
+
+ my $stack_size = $thr1->get_stack_size();
+ my $thr2 = threads->create({'stack_size' => $stack_size}, FUNCTION, ARGS);
+
+=back
+
+=head1 THREAD SIGNALLING
+
+When safe signals is in effect (the default behavior - see L</"Unsafe signals">
+for more details), then signals may be sent and acted upon by individual
+threads.
+
+=over 4
+
+=item $thr->kill('SIG...');
+
+Sends the specified signal to the thread. Signal names and (positive) signal
+numbers are the same as those supported by
+L<kill()|perlfunc/"kill SIGNAL, LIST">. For example, 'SIGTERM', 'TERM' and
+(depending on the OS) 15 are all valid arguments to C<-E<gt>kill()>.
+
+Returns the thread object to allow for method chaining:
+
+ $thr->kill('SIG...')->join();
+
+=back
+
+Signal handlers need to be set up in the threads for the signals they are
+expected to act upon. Here's an example for I<cancelling> a thread:
+
+ use threads;
+
+ sub thr_func
+ {
+ # Thread 'cancellation' signal handler
+ $SIG{'KILL'} = sub { threads->exit(); };
+
+ ...
+ }
+
+ # Create a thread
+ my $thr = threads->create('thr_func');
+
+ ...
+
+ # Signal the thread to terminate, and then detach
+ # it so that it will get cleaned up automatically
+ $thr->kill('KILL')->detach();
+
+Here's another simplistic example that illustrates the use of thread
+signalling in conjunction with a semaphore to provide rudimentary I<suspend>
+and I<resume> capabilities:
+
+ use threads;
+ use Thread::Semaphore;
+
+ sub thr_func
+ {
+ my $sema = shift;
+
+ # Thread 'suspend/resume' signal handler
+ $SIG{'STOP'} = sub {
+ $sema->down(); # Thread suspended
+ $sema->up(); # Thread resumes
+ };
+
+ ...
+ }
+
+ # Create a semaphore and pass it to a thread
+ my $sema = Thread::Semaphore->new();
+ my $thr = threads->create('thr_func', $sema);
+
+ # Suspend the thread
+ $sema->down();
+ $thr->kill('STOP');
+
+ ...
+
+ # Allow the thread to continue
+ $sema->up();
+
+CAVEAT: The thread signalling capability provided by this module does not
+actually send signals via the OS. It I<emulates> signals at the Perl-level
+such that signal handlers are called in the appropriate thread. For example,
+sending C<$thr-E<gt>kill('STOP')> does not actually suspend a thread (or the
+whole process), but does cause a C<$SIG{'STOP'}> handler to be called in that
+thread (as illustrated above).
+
+As such, signals that would normally not be appropriate to use in the
+C<kill()> command (e.g., C<kill('KILL', $$)>) are okay to use with the
+C<-E<gt>kill()> method (again, as illustrated above).
+
+Correspondingly, sending a signal to a thread does not disrupt the operation
+the thread is currently working on: The signal will be acted upon after the
+current operation has completed. For instance, if the thread is I<stuck> on
+an I/O call, sending it a signal will not cause the I/O call to be interrupted
+such that the signal is acted up immediately.
+
+Sending a signal to a terminated thread is ignored.
+
+=head1 WARNINGS
+
+=over 4
+
+=item Perl exited with active threads:
+
+If the program exits without all threads having either been joined or
+detached, then this warning will be issued.
+
+NOTE: If the I<main> thread exits, then this warning cannot be suppressed
+using C<no warnings 'threads';> as suggested below.
+
+=item Thread creation failed: pthread_create returned #
+
+See the appropriate I<man> page for C<pthread_create> to determine the actual
+cause for the failure.
+
+=item Thread # terminated abnormally: ...
+
+A thread terminated in some manner other than just returning from its entry
+point function, or by using C<threads-E<gt>exit()>. For example, the thread
+may have terminated because of an error, or by using C<die>.
+
+=item Using minimum thread stack size of #
+
+Some platforms have a minimum thread stack size. Trying to set the stack size
+below this value will result in the above warning, and the stack size will be
+set to the minimum.
+
+=item Thread creation failed: pthread_attr_setstacksize(I<SIZE>) returned 22
+
+The specified I<SIZE> exceeds the system's maximum stack size. Use a smaller
+value for the stack size.
+
+=back
+
+If needed, thread warnings can be suppressed by using:
+
+ no warnings 'threads';
+
+in the appropriate scope.
+
+=head1 ERRORS
+
+=over 4
+
+=item This Perl not built to support threads
+
+The particular copy of Perl that you're trying to use was not built using the
+C<useithreads> configuration option.
+
+Having threads support requires all of Perl and all of the XS modules in the
+Perl installation to be rebuilt; it is not just a question of adding the
+L<threads> module (i.e., threaded and non-threaded Perls are binary
+incompatible.)
+
+=item Cannot change stack size of an existing thread
+
+The stack size of currently extant threads cannot be changed, therefore, the
+following results in the above error:
+
+ $thr->set_stack_size($size);
+
+=item Cannot signal threads without safe signals
+
+Safe signals must be in effect to use the C<-E<gt>kill()> signalling method.
+See L</"Unsafe signals"> for more details.
+
+=item Unrecognized signal name: ...
+
+The particular copy of Perl that you're trying to use does not support the
+specified signal being used in a C<-E<gt>kill()> call.
+
+=back
+
+=head1 BUGS AND LIMITATIONS
+
+Before you consider posting a bug report, please consult, and possibly post a
+message to the discussion forum to see if what you've encountered is a known
+problem.
+
+=over
+
+=item Thread-safe modules
+
+See L<perlmod/"Making your module threadsafe"> when creating modules that may
+be used in threaded applications, especially if those modules use non-Perl
+data, or XS code.
+
+=item Using non-thread-safe modules
+
+Unfortunately, you may encounter Perl modules that are not I<thread-safe>.
+For example, they may crash the Perl interpreter during execution, or may dump
+core on termination. Depending on the module and the requirements of your
+application, it may be possible to work around such difficulties.
+
+If the module will only be used inside a thread, you can try loading the
+module from inside the thread entry point function using C<require> (and
+C<import> if needed):
+
+ sub thr_func
+ {
+ require Unsafe::Module
+ # Unsafe::Module->import(...);
+
+ ....
+ }
+
+If the module is needed inside the I<main> thread, try modifying your
+application so that the module is loaded (again using C<require> and
+C<-E<gt>import()>) after any threads are started, and in such a way that no
+other threads are started afterwards.
+
+If the above does not work, or is not adequate for your application, then file
+a bug report on L<http://rt.cpan.org/Public/> against the problematic module.
+
+=item Current working directory
+
+On all platforms except MSWin32, the setting for the current working directory
+is shared among all threads such that changing it in one thread (e.g., using
+C<chdir()>) will affect all the threads in the application.
+
+On MSWin32, each thread maintains its own the current working directory
+setting.
+
+=item Environment variables
+
+Currently, on all platforms except MSWin32, all I<system> calls (e.g., using
+C<system()> or back-ticks) made from threads use the environment variable
+settings from the I<main> thread. In other words, changes made to C<%ENV> in
+a thread will not be visible in I<system> calls made by that thread.
+
+To work around this, set environment variables as part of the I<system> call.
+For example:
+
+ my $msg = 'hello';
+ system("FOO=$msg; echo \$FOO"); # Outputs 'hello' to STDOUT
+
+On MSWin32, each thread maintains its own set of environment variables.
+
+=item Parent-child threads
+
+On some platforms, it might not be possible to destroy I<parent> threads while
+there are still existing I<child> threads.
+
+=item Creating threads inside special blocks
+
+Creating threads inside C<BEGIN>, C<CHECK> or C<INIT> blocks should not be
+relied upon. Depending on the Perl version and the application code, results
+may range from success, to (apparently harmless) warnings of leaked scalar, or
+all the way up to crashing of the Perl interpreter.
+
+=item Unsafe signals
+
+Since Perl 5.8.0, signals have been made safer in Perl by postponing their
+handling until the interpreter is in a I<safe> state. See
+L<perl58delta/"Safe Signals"> and L<perlipc/"Deferred Signals (Safe Signals)">
+for more details.
+
+Safe signals is the default behavior, and the old, immediate, unsafe
+signalling behavior is only in effect in the following situations:
+
+=over 4
+
+=item * Perl has been built with C<PERL_OLD_SIGNALS> (see C<perl -V>).
+
+=item * The environment variable C<PERL_SIGNALS> is set to C<unsafe> (see L<perlrun/"PERL_SIGNALS">).
+
+=item * The module L<Perl::Unsafe::Signals> is used.
+
+=back
+
+If unsafe signals is in effect, then signal handling is not thread-safe, and
+the C<-E<gt>kill()> signalling method cannot be used.
+
+=item Returning closures from threads
+
+Returning closures from threads should not be relied upon. Depending of the
+Perl version and the application code, results may range from success, to
+(apparently harmless) warnings of leaked scalar, or all the way up to crashing
+of the Perl interpreter.
+
+=item Returning objects from threads
+
+Returning objects from threads does not work. Depending on the classes
+involved, you may be able to work around this by returning a serialized
+version of the object (e.g., using L<Data::Dumper> or L<Storable>), and then
+reconstituting it in the joining thread. If you're using Perl 5.10.0 or
+later, and if the class supports L<shared objects|threads::shared/"OBJECTS">,
+you can pass them via L<shared queues| Thread::Queue>.
+
+=item END blocks in threads
+
+It is possible to add L<END blocks|perlmod/"BEGIN, UNITCHECK, CHECK, INIT and
+END"> to threads by using L<require|perlfunc/"require VERSION"> or
+L<eval|perlfunc/"eval EXPR"> with the appropriate code. These C<END> blocks
+will then be executed when the thread's interpreter is destroyed (i.e., either
+during a C<-E<gt>join()> call, or at program termination).
+
+However, calling any L<threads> methods in such an C<END> block will most
+likely I<fail> (e.g., the application may hang, or generate an error) due to
+mutexes that are needed to control functionality within the L<threads> module.
+
+For this reason, the use of C<END> blocks in threads is B<strongly>
+discouraged.
+
+=item Perl Bugs and the CPAN Version of L<threads>
+
+Support for threads extends beyond the code in this module (i.e.,
+F<threads.pm> and F<threads.xs>), and into the Perl interpreter itself. Older
+versions of Perl contain bugs that may manifest themselves despite using the
+latest version of L<threads> from CPAN. There is no workaround for this other
+than upgrading to the latest version of Perl.
+
+Even with the latest version of Perl, it is known that certain constructs
+with threads may result in warning messages concerning leaked scalars or
+unreferenced scalars. However, such warnings are harmless, and may safely be
+ignored.
+
+You can search for L<threads> related bug reports at
+L<http://rt.cpan.org/Public/>. If needed submit any new bugs, problems,
+patches, etc. to: L<http://rt.cpan.org/Public/Dist/Display.html?Name=threads>
+
+=back
+
+=head1 REQUIREMENTS
+
+Perl 5.8.0 or later
+
+=head1 SEE ALSO
+
+L<threads> Discussion Forum on CPAN:
+L<http://www.cpanforum.com/dist/threads>
+
+Annotated POD for L<threads>:
+L<http://annocpan.org/~JDHEDDEN/threads-1.75/threads.pm>
+
+Source repository:
+L<http://code.google.com/p/threads-shared/>
+
+L<threads::shared>, L<perlthrtut>
+
+L<http://www.perl.com/pub/a/2002/06/11/threads.html> and
+L<http://www.perl.com/pub/a/2002/09/04/threads.html>
+
+Perl threads mailing list:
+L<http://lists.cpan.org/showlist.cgi?name=iThreads>
+
+Stack size discussion:
+L<http://www.perlmonks.org/?node_id=532956>
+
+=head1 AUTHOR
+
+Artur Bergman E<lt>sky AT crucially DOT netE<gt>
+
+CPAN version produced by Jerry D. Hedden <jdhedden AT cpan DOT org>
+
+=head1 LICENSE
+
+threads is released under the same license as Perl.
+
+=head1 ACKNOWLEDGEMENTS
+
+Richard Soderberg E<lt>perl AT crystalflame DOT netE<gt> -
+Helping me out tons, trying to find reasons for races and other weird bugs!
+
+Simon Cozens E<lt>simon AT brecon DOT co DOT ukE<gt> -
+Being there to answer zillions of annoying questions
+
+Rocco Caputo E<lt>troc AT netrus DOT netE<gt>
+
+Vipul Ved Prakash E<lt>mail AT vipul DOT netE<gt> -
+Helping with debugging
+
+Dean Arnold E<lt>darnold AT presicient DOT comE<gt> -
+Stack size API
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/threads/shared.pm b/Master/tlpkg/tlperl.straw/lib/threads/shared.pm
new file mode 100755
index 00000000000..72192bc7a0d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/threads/shared.pm
@@ -0,0 +1,616 @@
+package threads::shared;
+
+use 5.008;
+
+use strict;
+use warnings;
+
+use Scalar::Util qw(reftype refaddr blessed);
+
+our $VERSION = '1.32';
+my $XS_VERSION = $VERSION;
+$VERSION = eval $VERSION;
+
+# Declare that we have been loaded
+$threads::shared::threads_shared = 1;
+
+# Load the XS code, if applicable
+if ($threads::threads) {
+ require XSLoader;
+ XSLoader::load('threads::shared', $XS_VERSION);
+
+ *is_shared = \&_id;
+
+} else {
+ # String eval is generally evil, but we don't want these subs to
+ # exist at all if 'threads' is not loaded successfully.
+ # Vivifying them conditionally this way saves on average about 4K
+ # of memory per thread.
+ eval <<'_MARKER_';
+ sub share (\[$@%]) { return $_[0] }
+ sub is_shared (\[$@%]) { undef }
+ sub cond_wait (\[$@%];\[$@%]) { undef }
+ sub cond_timedwait (\[$@%]$;\[$@%]) { undef }
+ sub cond_signal (\[$@%]) { undef }
+ sub cond_broadcast (\[$@%]) { undef }
+_MARKER_
+}
+
+
+### Export ###
+
+sub import
+{
+ # Exported subroutines
+ my @EXPORT = qw(share is_shared cond_wait cond_timedwait
+ cond_signal cond_broadcast shared_clone);
+ if ($threads::threads) {
+ push(@EXPORT, 'bless');
+ }
+
+ # Export subroutine names
+ my $caller = caller();
+ foreach my $sym (@EXPORT) {
+ no strict 'refs';
+ *{$caller.'::'.$sym} = \&{$sym};
+ }
+}
+
+
+# Predeclarations for internal functions
+my ($make_shared);
+
+
+### Methods, etc. ###
+
+sub threads::shared::tie::SPLICE
+{
+ require Carp;
+ Carp::croak('Splice not implemented for shared arrays');
+}
+
+
+# Create a thread-shared clone of a complex data structure or object
+sub shared_clone
+{
+ if (@_ != 1) {
+ require Carp;
+ Carp::croak('Usage: shared_clone(REF)');
+ }
+
+ return $make_shared->(shift, {});
+}
+
+
+### Internal Functions ###
+
+# Used by shared_clone() to recursively clone
+# a complex data structure or object
+$make_shared = sub {
+ my ($item, $cloned) = @_;
+
+ # Just return the item if:
+ # 1. Not a ref;
+ # 2. Already shared; or
+ # 3. Not running 'threads'.
+ return $item if (! ref($item) || is_shared($item) || ! $threads::threads);
+
+ # Check for previously cloned references
+ # (this takes care of circular refs as well)
+ my $addr = refaddr($item);
+ if (exists($cloned->{$addr})) {
+ # Return the already existing clone
+ return $cloned->{$addr};
+ }
+
+ # Make copies of array, hash and scalar refs and refs of refs
+ my $copy;
+ my $ref_type = reftype($item);
+
+ # Copy an array ref
+ if ($ref_type eq 'ARRAY') {
+ # Make empty shared array ref
+ $copy = &share([]);
+ # Add to clone checking hash
+ $cloned->{$addr} = $copy;
+ # Recursively copy and add contents
+ push(@$copy, map { $make_shared->($_, $cloned) } @$item);
+ }
+
+ # Copy a hash ref
+ elsif ($ref_type eq 'HASH') {
+ # Make empty shared hash ref
+ $copy = &share({});
+ # Add to clone checking hash
+ $cloned->{$addr} = $copy;
+ # Recursively copy and add contents
+ foreach my $key (keys(%{$item})) {
+ $copy->{$key} = $make_shared->($item->{$key}, $cloned);
+ }
+ }
+
+ # Copy a scalar ref
+ elsif ($ref_type eq 'SCALAR') {
+ $copy = \do{ my $scalar = $$item; };
+ share($copy);
+ # Add to clone checking hash
+ $cloned->{$addr} = $copy;
+ }
+
+ # Copy of a ref of a ref
+ elsif ($ref_type eq 'REF') {
+ # Special handling for $x = \$x
+ if ($addr == refaddr($$item)) {
+ $copy = \$copy;
+ share($copy);
+ $cloned->{$addr} = $copy;
+ } else {
+ my $tmp;
+ $copy = \$tmp;
+ share($copy);
+ # Add to clone checking hash
+ $cloned->{$addr} = $copy;
+ # Recursively copy and add contents
+ $tmp = $make_shared->($$item, $cloned);
+ }
+
+ } else {
+ require Carp;
+ Carp::croak("Unsupported ref type: ", $ref_type);
+ }
+
+ # If input item is an object, then bless the copy into the same class
+ if (my $class = blessed($item)) {
+ bless($copy, $class);
+ }
+
+ # Clone READONLY flag
+ if ($ref_type eq 'SCALAR') {
+ if (Internals::SvREADONLY($$item)) {
+ Internals::SvREADONLY($$copy, 1) if ($] >= 5.008003);
+ }
+ }
+ if (Internals::SvREADONLY($item)) {
+ Internals::SvREADONLY($copy, 1) if ($] >= 5.008003);
+ }
+
+ return $copy;
+};
+
+1;
+
+__END__
+
+=head1 NAME
+
+threads::shared - Perl extension for sharing data structures between threads
+
+=head1 VERSION
+
+This document describes threads::shared version 1.32
+
+=head1 SYNOPSIS
+
+ use threads;
+ use threads::shared;
+
+ my $var :shared;
+ my %hsh :shared;
+ my @ary :shared;
+
+ my ($scalar, @array, %hash);
+ share($scalar);
+ share(@array);
+ share(%hash);
+
+ $var = $scalar_value;
+ $var = $shared_ref_value;
+ $var = shared_clone($non_shared_ref_value);
+ $var = shared_clone({'foo' => [qw/foo bar baz/]});
+
+ $hsh{'foo'} = $scalar_value;
+ $hsh{'bar'} = $shared_ref_value;
+ $hsh{'baz'} = shared_clone($non_shared_ref_value);
+ $hsh{'quz'} = shared_clone([1..3]);
+
+ $ary[0] = $scalar_value;
+ $ary[1] = $shared_ref_value;
+ $ary[2] = shared_clone($non_shared_ref_value);
+ $ary[3] = shared_clone([ {}, [] ]);
+
+ { lock(%hash); ... }
+
+ cond_wait($scalar);
+ cond_timedwait($scalar, time() + 30);
+ cond_broadcast(@array);
+ cond_signal(%hash);
+
+ my $lockvar :shared;
+ # condition var != lock var
+ cond_wait($var, $lockvar);
+ cond_timedwait($var, time()+30, $lockvar);
+
+=head1 DESCRIPTION
+
+By default, variables are private to each thread, and each newly created
+thread gets a private copy of each existing variable. This module allows you
+to share variables across different threads (and pseudo-forks on Win32). It
+is used together with the L<threads> module.
+
+This module supports the sharing of the following data types only: scalars
+and scalar refs, arrays and array refs, and hashes and hash refs.
+
+=head1 EXPORT
+
+The following functions are exported by this module: C<share>,
+C<shared_clone>, C<is_shared>, C<cond_wait>, C<cond_timedwait>, C<cond_signal>
+and C<cond_broadcast>
+
+Note that if this module is imported when L<threads> has not yet been loaded,
+then these functions all become no-ops. This makes it possible to write
+modules that will work in both threaded and non-threaded environments.
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item share VARIABLE
+
+C<share> takes a variable and marks it as shared:
+
+ my ($scalar, @array, %hash);
+ share($scalar);
+ share(@array);
+ share(%hash);
+
+C<share> will return the shared rvalue, but always as a reference.
+
+Variables can also be marked as shared at compile time by using the
+C<:shared> attribute:
+
+ my ($var, %hash, @array) :shared;
+
+Shared variables can only store scalars, refs of shared variables, or
+refs of shared data (discussed in next section):
+
+ my ($var, %hash, @array) :shared;
+ my $bork;
+
+ # Storing scalars
+ $var = 1;
+ $hash{'foo'} = 'bar';
+ $array[0] = 1.5;
+
+ # Storing shared refs
+ $var = \%hash;
+ $hash{'ary'} = \@array;
+ $array[1] = \$var;
+
+ # The following are errors:
+ # $var = \$bork; # ref of non-shared variable
+ # $hash{'bork'} = []; # non-shared array ref
+ # push(@array, { 'x' => 1 }); # non-shared hash ref
+
+=item shared_clone REF
+
+C<shared_clone> takes a reference, and returns a shared version of its
+argument, performing a deep copy on any non-shared elements. Any shared
+elements in the argument are used as is (i.e., they are not cloned).
+
+ my $cpy = shared_clone({'foo' => [qw/foo bar baz/]});
+
+Object status (i.e., the class an object is blessed into) is also cloned.
+
+ my $obj = {'foo' => [qw/foo bar baz/]};
+ bless($obj, 'Foo');
+ my $cpy = shared_clone($obj);
+ print(ref($cpy), "\n"); # Outputs 'Foo'
+
+For cloning empty array or hash refs, the following may also be used:
+
+ $var = &share([]); # Same as $var = shared_clone([]);
+ $var = &share({}); # Same as $var = shared_clone({});
+
+=item is_shared VARIABLE
+
+C<is_shared> checks if the specified variable is shared or not. If shared,
+returns the variable's internal ID (similar to
+L<refaddr()|Scalar::Util/"refaddr EXPR">). Otherwise, returns C<undef>.
+
+ if (is_shared($var)) {
+ print("\$var is shared\n");
+ } else {
+ print("\$var is not shared\n");
+ }
+
+When used on an element of an array or hash, C<is_shared> checks if the
+specified element belongs to a shared array or hash. (It does not check
+the contents of that element.)
+
+ my %hash :shared;
+ if (is_shared(%hash)) {
+ print("\%hash is shared\n");
+ }
+
+ $hash{'elem'} = 1;
+ if (is_shared($hash{'elem'})) {
+ print("\$hash{'elem'} is in a shared hash\n");
+ }
+
+=item lock VARIABLE
+
+C<lock> places a B<advisory> lock on a variable until the lock goes out of
+scope. If the variable is locked by another thread, the C<lock> call will
+block until it's available. Multiple calls to C<lock> by the same thread from
+within dynamically nested scopes are safe -- the variable will remain locked
+until the outermost lock on the variable goes out of scope.
+
+C<lock> follows references exactly I<one> level:
+
+ my %hash :shared;
+ my $ref = \%hash;
+ lock($ref); # This is equivalent to lock(%hash)
+
+Note that you cannot explicitly unlock a variable; you can only wait for the
+lock to go out of scope. This is most easily accomplished by locking the
+variable inside a block.
+
+ my $var :shared;
+ {
+ lock($var);
+ # $var is locked from here to the end of the block
+ ...
+ }
+ # $var is now unlocked
+
+As locks are advisory, they do not prevent data access or modification by
+another thread that does not itself attempt to obtain a lock on the variable.
+
+You cannot lock the individual elements of a container variable:
+
+ my %hash :shared;
+ $hash{'foo'} = 'bar';
+ #lock($hash{'foo'}); # Error
+ lock(%hash); # Works
+
+If you need more fine-grained control over shared variable access, see
+L<Thread::Semaphore>.
+
+=item cond_wait VARIABLE
+
+=item cond_wait CONDVAR, LOCKVAR
+
+The C<cond_wait> function takes a B<locked> variable as a parameter, unlocks
+the variable, and blocks until another thread does a C<cond_signal> or
+C<cond_broadcast> for that same locked variable. The variable that
+C<cond_wait> blocked on is relocked after the C<cond_wait> is satisfied. If
+there are multiple threads C<cond_wait>ing on the same variable, all but one
+will re-block waiting to reacquire the lock on the variable. (So if you're only
+using C<cond_wait> for synchronisation, give up the lock as soon as possible).
+The two actions of unlocking the variable and entering the blocked wait state
+are atomic, the two actions of exiting from the blocked wait state and
+re-locking the variable are not.
+
+In its second form, C<cond_wait> takes a shared, B<unlocked> variable followed
+by a shared, B<locked> variable. The second variable is unlocked and thread
+execution suspended until another thread signals the first variable.
+
+It is important to note that the variable can be notified even if no thread
+C<cond_signal> or C<cond_broadcast> on the variable. It is therefore
+important to check the value of the variable and go back to waiting if the
+requirement is not fulfilled. For example, to pause until a shared counter
+drops to zero:
+
+ { lock($counter); cond_wait($counter) until $counter == 0; }
+
+=item cond_timedwait VARIABLE, ABS_TIMEOUT
+
+=item cond_timedwait CONDVAR, ABS_TIMEOUT, LOCKVAR
+
+In its two-argument form, C<cond_timedwait> takes a B<locked> variable and an
+absolute timeout as parameters, unlocks the variable, and blocks until the
+timeout is reached or another thread signals the variable. A false value is
+returned if the timeout is reached, and a true value otherwise. In either
+case, the variable is re-locked upon return.
+
+Like C<cond_wait>, this function may take a shared, B<locked> variable as an
+additional parameter; in this case the first parameter is an B<unlocked>
+condition variable protected by a distinct lock variable.
+
+Again like C<cond_wait>, waking up and reacquiring the lock are not atomic,
+and you should always check your desired condition after this function
+returns. Since the timeout is an absolute value, however, it does not have to
+be recalculated with each pass:
+
+ lock($var);
+ my $abs = time() + 15;
+ until ($ok = desired_condition($var)) {
+ last if !cond_timedwait($var, $abs);
+ }
+ # we got it if $ok, otherwise we timed out!
+
+=item cond_signal VARIABLE
+
+The C<cond_signal> function takes a B<locked> variable as a parameter and
+unblocks one thread that's C<cond_wait>ing on that variable. If more than one
+thread is blocked in a C<cond_wait> on that variable, only one (and which one
+is indeterminate) will be unblocked.
+
+If there are no threads blocked in a C<cond_wait> on the variable, the signal
+is discarded. By always locking before signaling, you can (with care), avoid
+signaling before another thread has entered cond_wait().
+
+C<cond_signal> will normally generate a warning if you attempt to use it on an
+unlocked variable. On the rare occasions where doing this may be sensible, you
+can suppress the warning with:
+
+ { no warnings 'threads'; cond_signal($foo); }
+
+=item cond_broadcast VARIABLE
+
+The C<cond_broadcast> function works similarly to C<cond_signal>.
+C<cond_broadcast>, though, will unblock B<all> the threads that are blocked in
+a C<cond_wait> on the locked variable, rather than only one.
+
+=back
+
+=head1 OBJECTS
+
+L<threads::shared> exports a version of L<bless()|perlfunc/"bless REF"> that
+works on shared objects such that I<blessings> propagate across threads.
+
+ # Create a shared 'Foo' object
+ my $foo :shared = shared_clone({});
+ bless($foo, 'Foo');
+
+ # Create a shared 'Bar' object
+ my $bar :shared = shared_clone({});
+ bless($bar, 'Bar');
+
+ # Put 'bar' inside 'foo'
+ $foo->{'bar'} = $bar;
+
+ # Rebless the objects via a thread
+ threads->create(sub {
+ # Rebless the outer object
+ bless($foo, 'Yin');
+
+ # Cannot directly rebless the inner object
+ #bless($foo->{'bar'}, 'Yang');
+
+ # Retrieve and rebless the inner object
+ my $obj = $foo->{'bar'};
+ bless($obj, 'Yang');
+ $foo->{'bar'} = $obj;
+
+ })->join();
+
+ print(ref($foo), "\n"); # Prints 'Yin'
+ print(ref($foo->{'bar'}), "\n"); # Prints 'Yang'
+ print(ref($bar), "\n"); # Also prints 'Yang'
+
+=head1 NOTES
+
+L<threads::shared> is designed to disable itself silently if threads are not
+available. This allows you to write modules and packages that can be used
+in both threaded and non-threaded applications.
+
+If you want access to threads, you must C<use threads> before you
+C<use threads::shared>. L<threads> will emit a warning if you use it after
+L<threads::shared>.
+
+=head1 BUGS AND LIMITATIONS
+
+When C<share> is used on arrays, hashes, array refs or hash refs, any data
+they contain will be lost.
+
+ my @arr = qw(foo bar baz);
+ share(@arr);
+ # @arr is now empty (i.e., == ());
+
+ # Create a 'foo' object
+ my $foo = { 'data' => 99 };
+ bless($foo, 'foo');
+
+ # Share the object
+ share($foo); # Contents are now wiped out
+ print("ERROR: \$foo is empty\n")
+ if (! exists($foo->{'data'}));
+
+Therefore, populate such variables B<after> declaring them as shared. (Scalar
+and scalar refs are not affected by this problem.)
+
+It is often not wise to share an object unless the class itself has been
+written to support sharing. For example, an object's destructor may get
+called multiple times, once for each thread's scope exit. Another danger is
+that the contents of hash-based objects will be lost due to the above
+mentioned limitation. See F<examples/class.pl> (in the CPAN distribution of
+this module) for how to create a class that supports object sharing.
+
+Does not support C<splice> on arrays!
+
+Taking references to the elements of shared arrays and hashes does not
+autovivify the elements, and neither does slicing a shared array/hash over
+non-existent indices/keys autovivify the elements.
+
+C<share()> allows you to C<< share($hashref->{key}) >> and
+C<< share($arrayref->[idx]) >> without giving any error message. But the
+C<< $hashref->{key} >> or C<< $arrayref->[idx] >> is B<not> shared, causing
+the error "lock can only be used on shared values" to occur when you attempt
+to C<< lock($hasref->{key}) >> or C<< lock($arrayref->[idx]) >> in another
+thread.
+
+Using L<refaddr()|Scalar::Util/"refaddr EXPR">) is unreliable for testing
+whether or not two shared references are equivalent (e.g., when testing for
+circular references). Use L<is_shared()/"is_shared VARIABLE">, instead:
+
+ use threads;
+ use threads::shared;
+ use Scalar::Util qw(refaddr);
+
+ # If ref is shared, use threads::shared's internal ID.
+ # Otherwise, use refaddr().
+ my $addr1 = is_shared($ref1) || refaddr($ref1);
+ my $addr2 = is_shared($ref2) || refaddr($ref2);
+
+ if ($addr1 == $addr2) {
+ # The refs are equivalent
+ }
+
+L<each()|perlfunc/"each HASH"> does not work properly on shared references
+embedded in shared structures. For example:
+
+ my %foo :shared;
+ $foo{'bar'} = shared_clone({'a'=>'x', 'b'=>'y', 'c'=>'z'});
+
+ while (my ($key, $val) = each(%{$foo{'bar'}})) {
+ ...
+ }
+
+Either of the following will work instead:
+
+ my $ref = $foo{'bar'};
+ while (my ($key, $val) = each(%{$ref})) {
+ ...
+ }
+
+ foreach my $key (keys(%{$foo{'bar'}})) {
+ my $val = $foo{'bar'}{$key};
+ ...
+ }
+
+View existing bug reports at, and submit any new bugs, problems, patches, etc.
+to: L<http://rt.cpan.org/Public/Dist/Display.html?Name=threads-shared>
+
+=head1 SEE ALSO
+
+L<threads::shared> Discussion Forum on CPAN:
+L<http://www.cpanforum.com/dist/threads-shared>
+
+Annotated POD for L<threads::shared>:
+L<http://annocpan.org/~JDHEDDEN/threads-shared-1.32/shared.pm>
+
+Source repository:
+L<http://code.google.com/p/threads-shared/>
+
+L<threads>, L<perlthrtut>
+
+L<http://www.perl.com/pub/a/2002/06/11/threads.html> and
+L<http://www.perl.com/pub/a/2002/09/04/threads.html>
+
+Perl threads mailing list:
+L<http://lists.cpan.org/showlist.cgi?name=iThreads>
+
+=head1 AUTHOR
+
+Artur Bergman E<lt>sky AT crucially DOT netE<gt>
+
+Documentation borrowed from the old Thread.pm.
+
+CPAN version produced by Jerry D. Hedden E<lt>jdhedden AT cpan DOT orgE<gt>.
+
+=head1 LICENSE
+
+threads::shared is released under the same license as Perl.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/timelocal.pl b/Master/tlpkg/tlperl.straw/lib/timelocal.pl
new file mode 100755
index 00000000000..ad322756e38
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/timelocal.pl
@@ -0,0 +1,18 @@
+;# timelocal.pl
+;#
+;# Usage:
+;# $time = timelocal($sec,$min,$hours,$mday,$mon,$year);
+;# $time = timegm($sec,$min,$hours,$mday,$mon,$year);
+
+;# This file has been superseded by the Time::Local library module.
+;# It is implemented as a call to that module for backwards compatibility
+;# with code written for perl4; new code should use Time::Local directly.
+
+;# The current implementation shares with the original the questionable
+;# behavior of defining the timelocal() and timegm() functions in the
+;# namespace of whatever package was current when the first instance of
+;# C<require 'timelocal.pl';> was executed in a program.
+
+use Time::Local;
+
+*timelocal::cheat = \&Time::Local::cheat;
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/ArabicShaping.txt b/Master/tlpkg/tlperl.straw/lib/unicore/ArabicShaping.txt
new file mode 100755
index 00000000000..56d8da872bb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/ArabicShaping.txt
@@ -0,0 +1,362 @@
+# ArabicShaping-5.1.0.txt
+# Date: 2008-03-20, 17:39:00 PDT [KW]
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# This file defines the shaping classes for Arabic and Syriac
+# positional shaping, repeating in machine readable form the
+# information printed in Tables 8-3, 8-7, 8-8, 8-11, 8-12, and
+# 8-13 of The Unicode Standard, Version 5.0.
+#
+# See sections 8.2 and 8.3 of The Unicode Standard, Version 5.0
+# for more information.
+#
+# Each line contains four fields, separated by a semicolon.
+#
+# Field 0: the code point, in 4-digit hexadecimal
+# form, of an Arabic or Syriac character.
+# Field 1: gives a short schematic name for that character,
+# abbreviated from the normative Unicode character name.
+# Field 2: defines the joining type (property name: Joining_Type)
+# R Right_Joining
+# L Left_Joining
+# D Dual_Joining
+# C Join_Causing
+# U Non_Joining
+# T Transparent
+# See the Arabic block description for more information on these types.
+# Field 3: defines the joining group (property name: Joining_Group)
+#
+# The values of the joining group are based schematically on character
+# names. Where a schematic character name consists of two or more parts separated
+# by spaces, the formal Joining_Group property value, as specified in
+# PropertyValueAliases.txt, consists of the same name parts joined by
+# underscores. Hence, the entry:
+#
+# 0629; TEH MARBUTA; R; TEH MARBUTA
+#
+# corresponds to [Joining_Group = Teh_Marbuta].
+#
+# Note: For historical reasons, the property value [Joining_Group = Hamza_On_Heh_Goal]
+# is anachronistically named. It used to apply to both of the following characters
+# in earlier versions of the standard:
+#
+# U+06C2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+# U+06C3 ARABIC LETTER TEH MARBUTA GOAL
+#
+# However, it currently applies only to U+06C3, and *not* to U+06C2.
+# To avoid destabilizing existing Joining_Group property aliases, the
+# value Hamza_On_Heh_Goal has not been changed, despite the fact that it
+# no longer applies to Hamza On Heh Goal, but only to Teh Marbuta Goal.
+#
+# Note: Code points that are not explicitly listed in this file are
+# either of joining type T or U:
+#
+# - Those that not explicitly listed that are of General Category Mn, Me, or Cf
+# have joining type T.
+# - All others not explicitly listed have type U.
+#
+# For an explicit listing of characters of joining type T, see
+# the derived property file DerivedJoiningType.txt.
+#
+# There are currently no characters of type L defined in Unicode.
+#
+# #############################################################
+
+# Unicode; Schematic Name; Joining Type; Joining Group
+
+# Arabic characters
+
+0600; ARABIC NUMBER SIGN; U; No_Joining_Group
+0601; ARABIC SIGN SANAH; U; No_Joining_Group
+0602; ARABIC FOOTNOTE MARKER; U; No_Joining_Group
+0603; ARABIC SIGN SAFHA; U; No_Joining_Group
+0608; ARABIC RAY; U; No_Joining_Group
+060B; AFGHANI SIGN; U; No_Joining_Group
+0621; HAMZA; U; No_Joining_Group
+0622; MADDA ON ALEF; R; ALEF
+0623; HAMZA ON ALEF; R; ALEF
+0624; HAMZA ON WAW; R; WAW
+0625; HAMZA UNDER ALEF; R; ALEF
+0626; HAMZA ON YEH; D; YEH
+0627; ALEF; R; ALEF
+0628; BEH; D; BEH
+0629; TEH MARBUTA; R; TEH MARBUTA
+062A; TEH; D; BEH
+062B; THEH; D; BEH
+062C; JEEM; D; HAH
+062D; HAH; D; HAH
+062E; KHAH; D; HAH
+062F; DAL; R; DAL
+0630; THAL; R; DAL
+0631; REH; R; REH
+0632; ZAIN; R; REH
+0633; SEEN; D; SEEN
+0634; SHEEN; D; SEEN
+0635; SAD; D; SAD
+0636; DAD; D; SAD
+0637; TAH; D; TAH
+0638; ZAH; D; TAH
+0639; AIN; D; AIN
+063A; GHAIN; D; AIN
+063B; KEHEH WITH 2 DOTS ABOVE; D; GAF
+063C; KEHEH WITH 3 DOTS BELOW; D; GAF
+063D; FARSI YEH WITH INVERTED V; D; YEH
+063E; FARSI YEH WITH 2 DOTS ABOVE; D; YEH
+063F; FARSI YEH WITH 3 DOTS ABOVE; D; YEH
+0640; TATWEEL; C; No_Joining_Group
+0641; FEH; D; FEH
+0642; QAF; D; QAF
+0643; KAF; D; KAF
+0644; LAM; D; LAM
+0645; MEEM; D; MEEM
+0646; NOON; D; NOON
+0647; HEH; D; HEH
+0648; WAW; R; WAW
+0649; ALEF MAKSURA; D; YEH
+064A; YEH; D; YEH
+066E; DOTLESS BEH; D; BEH
+066F; DOTLESS QAF; D; QAF
+0671; HAMZAT WASL ON ALEF; R; ALEF
+0672; WAVY HAMZA ON ALEF; R; ALEF
+0673; WAVY HAMZA UNDER ALEF; R; ALEF
+0674; HIGH HAMZA; U; No_Joining_Group
+0675; HIGH HAMZA ALEF; R; ALEF
+0676; HIGH HAMZA WAW; R; WAW
+0677; HIGH HAMZA WAW WITH DAMMA; R; WAW
+0678; HIGH HAMZA YEH; D; YEH
+0679; TEH WITH SMALL TAH; D; BEH
+067A; TEH WITH 2 DOTS VERTICAL ABOVE; D; BEH
+067B; BEH WITH 2 DOTS VERTICAL BELOW; D; BEH
+067C; TEH WITH RING; D; BEH
+067D; TEH WITH 3 DOTS ABOVE DOWNWARD; D; BEH
+067E; TEH WITH 3 DOTS BELOW; D; BEH
+067F; TEH WITH 4 DOTS ABOVE; D; BEH
+0680; BEH WITH 4 DOTS BELOW; D; BEH
+0681; HAMZA ON HAH; D; HAH
+0682; HAH WITH 2 DOTS VERTICAL ABOVE; D; HAH
+0683; HAH WITH MIDDLE 2 DOTS; D; HAH
+0684; HAH WITH MIDDLE 2 DOTS VERTICAL; D; HAH
+0685; HAH WITH 3 DOTS ABOVE; D; HAH
+0686; HAH WITH MIDDLE 3 DOTS DOWNWARD; D; HAH
+0687; HAH WITH MIDDLE 4 DOTS; D; HAH
+0688; DAL WITH SMALL TAH; R; DAL
+0689; DAL WITH RING; R; DAL
+068A; DAL WITH DOT BELOW; R; DAL
+068B; DAL WITH DOT BELOW AND SMALL TAH; R; DAL
+068C; DAL WITH 2 DOTS ABOVE; R; DAL
+068D; DAL WITH 2 DOTS BELOW; R; DAL
+068E; DAL WITH 3 DOTS ABOVE; R; DAL
+068F; DAL WITH 3 DOTS ABOVE DOWNWARD; R; DAL
+0690; DAL WITH 4 DOTS ABOVE; R; DAL
+0691; REH WITH SMALL TAH; R; REH
+0692; REH WITH SMALL V; R; REH
+0693; REH WITH RING; R; REH
+0694; REH WITH DOT BELOW; R; REH
+0695; REH WITH SMALL V BELOW; R; REH
+0696; REH WITH DOT BELOW AND DOT ABOVE; R; REH
+0697; REH WITH 2 DOTS ABOVE; R; REH
+0698; REH WITH 3 DOTS ABOVE; R; REH
+0699; REH WITH 4 DOTS ABOVE; R; REH
+069A; SEEN WITH DOT BELOW AND DOT ABOVE; D; SEEN
+069B; SEEN WITH 3 DOTS BELOW; D; SEEN
+069C; SEEN WITH 3 DOTS BELOW AND 3 DOTS ABOVE; D; SEEN
+069D; SAD WITH 2 DOTS BELOW; D; SAD
+069E; SAD WITH 3 DOTS ABOVE; D; SAD
+069F; TAH WITH 3 DOTS ABOVE; D; TAH
+06A0; AIN WITH 3 DOTS ABOVE; D; AIN
+06A1; DOTLESS FEH; D; FEH
+06A2; FEH WITH DOT MOVED BELOW; D; FEH
+06A3; FEH WITH DOT BELOW; D; FEH
+06A4; FEH WITH 3 DOTS ABOVE; D; FEH
+06A5; FEH WITH 3 DOTS BELOW; D; FEH
+06A6; FEH WITH 4 DOTS ABOVE; D; FEH
+06A7; QAF WITH DOT ABOVE; D; QAF
+06A8; QAF WITH 3 DOTS ABOVE; D; QAF
+06A9; KEHEH; D; GAF
+06AA; SWASH KAF; D; SWASH KAF
+06AB; KAF WITH RING; D; GAF
+06AC; KAF WITH DOT ABOVE; D; KAF
+06AD; KAF WITH 3 DOTS ABOVE; D; KAF
+06AE; KAF WITH 3 DOTS BELOW; D; KAF
+06AF; GAF; D; GAF
+06B0; GAF WITH RING; D; GAF
+06B1; GAF WITH 2 DOTS ABOVE; D; GAF
+06B2; GAF WITH 2 DOTS BELOW; D; GAF
+06B3; GAF WITH 2 DOTS VERTICAL BELOW; D; GAF
+06B4; GAF WITH 3 DOTS ABOVE; D; GAF
+06B5; LAM WITH SMALL V; D; LAM
+06B6; LAM WITH DOT ABOVE; D; LAM
+06B7; LAM WITH 3 DOTS ABOVE; D; LAM
+06B8; LAM WITH 3 DOTS BELOW; D; LAM
+06B9; NOON WITH DOT BELOW; D; NOON
+06BA; DOTLESS NOON; D; NOON
+06BB; DOTLESS NOON WITH SMALL TAH; D; NOON
+06BC; NOON WITH RING; D; NOON
+06BD; NOON WITH 3 DOTS ABOVE; D; NOON
+06BE; KNOTTED HEH; D; KNOTTED HEH
+06BF; HAH WITH MIDDLE 3 DOTS DOWNWARD AND DOT ABOVE; D; HAH
+06C0; HAMZA ON HEH; R; TEH MARBUTA
+06C1; HEH GOAL; D; HEH GOAL
+06C2; HAMZA ON HEH GOAL; D; HEH GOAL
+06C3; TEH MARBUTA GOAL; R; HAMZA ON HEH GOAL
+06C4; WAW WITH RING; R; WAW
+06C5; WAW WITH BAR; R; WAW
+06C6; WAW WITH SMALL V; R; WAW
+06C7; WAW WITH DAMMA; R; WAW
+06C8; WAW WITH ALEF ABOVE; R; WAW
+06C9; WAW WITH INVERTED SMALL V; R; WAW
+06CA; WAW WITH 2 DOTS ABOVE; R; WAW
+06CB; WAW WITH 3 DOTS ABOVE; R; WAW
+06CC; DOTLESS YEH; D; YEH
+06CD; YEH WITH TAIL; R; YEH WITH TAIL
+06CE; YEH WITH SMALL V; D; YEH
+06CF; WAW WITH DOT ABOVE; R; WAW
+06D0; YEH WITH 2 DOTS VERTICAL BELOW; D; YEH
+06D1; YEH WITH 3 DOTS BELOW; D; YEH
+06D2; YEH BARREE; R; YEH BARREE
+06D3; HAMZA ON YEH BARREE; R; YEH BARREE
+06D5; AE; R; TEH MARBUTA
+06DD; ARABIC END OF AYAH; U; No_Joining_Group
+06EE; DAL WITH INVERTED V; R; DAL
+06EF; REH WITH INVERTED V; R; REH
+06FA; SEEN WITH DOT BELOW AND 3 DOTS ABOVE; D; SEEN
+06FB; DAD WITH DOT BELOW; D; SAD
+06FC; GHAIN WITH DOT BELOW; D; AIN
+06FF; HEH WITH INVERTED V; D; KNOTTED HEH
+
+# Syriac characters
+
+0710; ALAPH; R; ALAPH
+0712; BETH; D; BETH
+0713; GAMAL; D; GAMAL
+0714; GAMAL GARSHUNI; D; GAMAL
+0715; DALATH; R; DALATH RISH
+0716; DOTLESS DALATH RISH; R; DALATH RISH
+0717; HE; R; HE
+0718; WAW; R; SYRIAC WAW
+0719; ZAIN; R; ZAIN
+071A; HETH; D; HETH
+071B; TETH; D; TETH
+071C; TETH GARSHUNI; D; TETH
+071D; YUDH; D; YUDH
+071E; YUDH HE; R; YUDH HE
+071F; KAPH; D; KAPH
+0720; LAMADH; D; LAMADH
+0721; MIM; D; MIM
+0722; NUN; D; NUN
+0723; SEMKATH; D; SEMKATH
+0724; FINAL SEMKATH; D; FINAL SEMKATH
+0725; E; D; E
+0726; PE; D; PE
+0727; REVERSED PE; D; REVERSED PE
+0728; SADHE; R; SADHE
+0729; QAPH; D; QAPH
+072A; RISH; R; DALATH RISH
+072B; SHIN; D; SHIN
+072C; TAW; R; TAW
+072D; PERSIAN BHETH; D; BETH
+072E; PERSIAN GHAMAL; D; GAMAL
+072F; PERSIAN DHALATH; R; DALATH RISH
+074D; SOGDIAN ZHAIN; R; ZHAIN
+074E; SOGDIAN KHAPH; D; KHAPH
+074F; SOGDIAN FE; D; FE
+
+# Arabic supplement characters
+
+0750; BEH WITH 3 DOTS HORIZONTALLY BELOW; D; BEH
+0751; BEH WITH DOT BELOW AND 3 DOTS ABOVE; D; BEH
+0752; BEH WITH 3 DOTS POINTING UPWARDS BELOW; D; BEH
+0753; BEH WITH 3 DOTS POINTING UPWARDS BELOW AND 2 DOTS ABOVE; D; BEH
+0754; BEH WITH 2 DOTS BELOW AND DOT ABOVE; D; BEH
+0755; BEH WITH INVERTED SMALL V BELOW; D; BEH
+0756; BEH WITH SMALL V; D; BEH
+0757; HAH WITH 2 DOTS ABOVE; D; HAH
+0758; HAH WITH 3 DOTS POINTING UPWARDS BELOW; D; HAH
+0759; DAL WITH 2 DOTS VERTICALLY BELOW AND SMALL TAH; R; DAL
+075A; DAL WITH INVERTED SMALL V BELOW; R; DAL
+075B; REH WITH STROKE; R; REH
+075C; SEEN WITH 4 DOTS ABOVE; D; SEEN
+075D; AIN WITH 2 DOTS ABOVE; D; AIN
+075E; AIN WITH 3 DOTS POINTING DOWNWARDS ABOVE; D; AIN
+075F; AIN WITH 2 DOTS VERTICALLY ABOVE; D; AIN
+0760; FEH WITH 2 DOTS BELOW; D; FEH
+0761; FEH WITH 3 DOTS POINTING UPWARDS BELOW; D; FEH
+0762; KEHEH WITH DOT ABOVE; D; GAF
+0763; KEHEH WITH 3 DOTS ABOVE; D; GAF
+0764; KEHEH WITH 3 DOTS POINTING UPWARDS BELOW; D; GAF
+0765; MEEM WITH DOT ABOVE; D; MEEM
+0766; MEEM WITH DOT BELOW; D; MEEM
+0767; NOON WITH 2 DOTS BELOW; D; NOON
+0768; NOON WITH SMALL TAH; D; NOON
+0769; NOON WITH SMALL V; D; NOON
+076A; LAM WITH BAR; D; LAM
+076B; REH WITH 2 DOTS VERTICALLY ABOVE; R; REH
+076C; REH WITH HAMZA ABOVE; R; REH
+076D; SEEN WITH 2 DOTS VERTICALLY ABOVE; D; SEEN
+076E; HAH WITH SMALL TAH BELOW; D; HAH
+076F; HAH WITH SMALL TAH AND 2 DOTS; D; HAH
+0770; SEEN WITH SMALL TAH AND 2 DOTS; D; SEEN
+0771; REH WITH SMALL TAH AND 2 DOTS; R; REH
+0772; HAH WITH SMALL TAH ABOVE; D; HAH
+0773; ALEF WITH DIGIT TWO ABOVE; R; ALEF
+0774; ALEF WITH DIGIT THREE ABOVE; R; ALEF
+0775; DOTLESS YEH WITH DIGIT TWO ABOVE; D; YEH
+0776; DOTLESS YEH WITH DIGIT THREE ABOVE; D; YEH
+0777; DOTLESS YEH WITH DIGIT FOUR BELOW; D; YEH
+0778; WAW WITH DIGIT TWO ABOVE; R; WAW
+0779; WAW WITH DIGIT THREE ABOVE; R; WAW
+077A; YEH BARREE WITH DIGIT TWO ABOVE; D; BURUSHASKI YEH BARREE
+077B; YEH BARREE WITH DIGIT THREE ABOVE; D; BURUSHASKI YEH BARREE
+077C; HAH WITH DIGIT FOUR BELOW; D; HAH
+077D; SEEN WITH DIGIT FOUR ABOVE; D; SEEN
+077E; SEEN WITH INVERTED V; D; SEEN
+077F; KAF WITH 2 DOTS ABOVE; D; KAF
+
+# N'Ko Characters
+
+07CA; NKO A; D; No_Joining_Group
+07CB; NKO EE; D; No_Joining_Group
+07CC; NKO I; D; No_Joining_Group
+07CD; NKO E; D; No_Joining_Group
+07CE; NKO U; D; No_Joining_Group
+07CF; NKO OO; D; No_Joining_Group
+07D0; NKO O; D; No_Joining_Group
+07D1; NKO DAGBASINNA; D; No_Joining_Group
+07D2; NKO N; D; No_Joining_Group
+07D3; NKO BA; D; No_Joining_Group
+07D4; NKO PA; D; No_Joining_Group
+07D5; NKO TA; D; No_Joining_Group
+07D6; NKO JA; D; No_Joining_Group
+07D7; NKO CHA; D; No_Joining_Group
+07D8; NKO DA; D; No_Joining_Group
+07D9; NKO RA; D; No_Joining_Group
+07DA; NKO RRA; D; No_Joining_Group
+07DB; NKO SA; D; No_Joining_Group
+07DC; NKO GBA; D; No_Joining_Group
+07DD; NKO FA; D; No_Joining_Group
+07DE; NKO KA; D; No_Joining_Group
+07DF; NKO LA; D; No_Joining_Group
+07E0; NKO NA WOLOSO; D; No_Joining_Group
+07E1; NKO MA; D; No_Joining_Group
+07E2; NKO NYA; D; No_Joining_Group
+07E3; NKO NA; D; No_Joining_Group
+07E4; NKO HA; D; No_Joining_Group
+07E5; NKO WA; D; No_Joining_Group
+07E6; NKO YA; D; No_Joining_Group
+07E7; NKO NYA WOLOSO; D; No_Joining_Group
+07E8; NKO JONA JA; D; No_Joining_Group
+07E9; NKO JONA CHA; D; No_Joining_Group
+07EA; NKO JONA RA; D; No_Joining_Group
+07FA; NKO LAJANYALAN; C; No_Joining_Group
+
+# Other
+
+200D; ZERO WIDTH JOINER; C; No_Joining_Group
+200C; ZERO WIDTH NON-JOINER; U; No_Joining_Group
+
+# EOF
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/BidiMirroring.txt b/Master/tlpkg/tlperl.straw/lib/unicore/BidiMirroring.txt
new file mode 100755
index 00000000000..64d29e44cdb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/BidiMirroring.txt
@@ -0,0 +1,588 @@
+# BidiMirroring-5.1.0.txt
+# Date: 2008-03-28, 10:22:00 PDT [KW]
+#
+# Bidi_Mirroring_Glyph Property
+#
+# This file is an informative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# This data file lists characters that have the mirrored property
+# where there is another Unicode character that typically has a glyph
+# that is the mirror image of the original character's glyph.
+# The repertoire covered by the file is Unicode 5.1.0.
+#
+# The file contains a list of lines with mappings from one code point
+# to another one for character-based mirroring.
+# Note that for "real" mirroring, a rendering engine needs to select
+# appropriate alternative glyphs, and that many Unicode characters do not
+# have a mirror-image Unicode character.
+#
+# Each mapping line contains two fields, separated by a semicolon (';').
+# Each of the two fields contains a code point represented as a
+# variable-length hexadecimal value with 4 to 6 digits.
+# A comment indicates where the characters are "BEST FIT" mirroring.
+#
+# Code points with the "mirrored" property but no appropriate mirrors are
+# listed as comments at the end of the file.
+#
+# For information on bidi mirroring, see UAX #9: Bidirectional Algorithm,
+# at http://www.unicode.org/unicode/reports/tr9/
+#
+# This file was originally created by Markus Scherer.
+# Extended for Unicode 3.2, 4.0, 4.1, 5.0, and 5.1 by Ken Whistler.
+#
+# ############################################################
+
+0028; 0029 # LEFT PARENTHESIS
+0029; 0028 # RIGHT PARENTHESIS
+003C; 003E # LESS-THAN SIGN
+003E; 003C # GREATER-THAN SIGN
+005B; 005D # LEFT SQUARE BRACKET
+005D; 005B # RIGHT SQUARE BRACKET
+007B; 007D # LEFT CURLY BRACKET
+007D; 007B # RIGHT CURLY BRACKET
+00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0F3A; 0F3B # TIBETAN MARK GUG RTAGS GYON
+0F3B; 0F3A # TIBETAN MARK GUG RTAGS GYAS
+0F3C; 0F3D # TIBETAN MARK ANG KHANG GYON
+0F3D; 0F3C # TIBETAN MARK ANG KHANG GYAS
+169B; 169C # OGHAM FEATHER MARK
+169C; 169B # OGHAM REVERSED FEATHER MARK
+2039; 203A # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A; 2039 # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+2045; 2046 # LEFT SQUARE BRACKET WITH QUILL
+2046; 2045 # RIGHT SQUARE BRACKET WITH QUILL
+207D; 207E # SUPERSCRIPT LEFT PARENTHESIS
+207E; 207D # SUPERSCRIPT RIGHT PARENTHESIS
+208D; 208E # SUBSCRIPT LEFT PARENTHESIS
+208E; 208D # SUBSCRIPT RIGHT PARENTHESIS
+2208; 220B # ELEMENT OF
+2209; 220C # NOT AN ELEMENT OF
+220A; 220D # SMALL ELEMENT OF
+220B; 2208 # CONTAINS AS MEMBER
+220C; 2209 # DOES NOT CONTAIN AS MEMBER
+220D; 220A # SMALL CONTAINS AS MEMBER
+2215; 29F5 # DIVISION SLASH
+223C; 223D # TILDE OPERATOR
+223D; 223C # REVERSED TILDE
+2243; 22CD # ASYMPTOTICALLY EQUAL TO
+2252; 2253 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253; 2252 # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254; 2255 # COLON EQUALS
+2255; 2254 # EQUALS COLON
+2264; 2265 # LESS-THAN OR EQUAL TO
+2265; 2264 # GREATER-THAN OR EQUAL TO
+2266; 2267 # LESS-THAN OVER EQUAL TO
+2267; 2266 # GREATER-THAN OVER EQUAL TO
+2268; 2269 # [BEST FIT] LESS-THAN BUT NOT EQUAL TO
+2269; 2268 # [BEST FIT] GREATER-THAN BUT NOT EQUAL TO
+226A; 226B # MUCH LESS-THAN
+226B; 226A # MUCH GREATER-THAN
+226E; 226F # [BEST FIT] NOT LESS-THAN
+226F; 226E # [BEST FIT] NOT GREATER-THAN
+2270; 2271 # [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO
+2271; 2270 # [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO
+2272; 2273 # [BEST FIT] LESS-THAN OR EQUIVALENT TO
+2273; 2272 # [BEST FIT] GREATER-THAN OR EQUIVALENT TO
+2274; 2275 # [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO
+2275; 2274 # [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276; 2277 # LESS-THAN OR GREATER-THAN
+2277; 2276 # GREATER-THAN OR LESS-THAN
+2278; 2279 # [BEST FIT] NEITHER LESS-THAN NOR GREATER-THAN
+2279; 2278 # [BEST FIT] NEITHER GREATER-THAN NOR LESS-THAN
+227A; 227B # PRECEDES
+227B; 227A # SUCCEEDS
+227C; 227D # PRECEDES OR EQUAL TO
+227D; 227C # SUCCEEDS OR EQUAL TO
+227E; 227F # [BEST FIT] PRECEDES OR EQUIVALENT TO
+227F; 227E # [BEST FIT] SUCCEEDS OR EQUIVALENT TO
+2280; 2281 # [BEST FIT] DOES NOT PRECEDE
+2281; 2280 # [BEST FIT] DOES NOT SUCCEED
+2282; 2283 # SUBSET OF
+2283; 2282 # SUPERSET OF
+2284; 2285 # [BEST FIT] NOT A SUBSET OF
+2285; 2284 # [BEST FIT] NOT A SUPERSET OF
+2286; 2287 # SUBSET OF OR EQUAL TO
+2287; 2286 # SUPERSET OF OR EQUAL TO
+2288; 2289 # [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO
+2289; 2288 # [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO
+228A; 228B # [BEST FIT] SUBSET OF WITH NOT EQUAL TO
+228B; 228A # [BEST FIT] SUPERSET OF WITH NOT EQUAL TO
+228F; 2290 # SQUARE IMAGE OF
+2290; 228F # SQUARE ORIGINAL OF
+2291; 2292 # SQUARE IMAGE OF OR EQUAL TO
+2292; 2291 # SQUARE ORIGINAL OF OR EQUAL TO
+2298; 29B8 # CIRCLED DIVISION SLASH
+22A2; 22A3 # RIGHT TACK
+22A3; 22A2 # LEFT TACK
+22A6; 2ADE # ASSERTION
+22A8; 2AE4 # TRUE
+22A9; 2AE3 # FORCES
+22AB; 2AE5 # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22B0; 22B1 # PRECEDES UNDER RELATION
+22B1; 22B0 # SUCCEEDS UNDER RELATION
+22B2; 22B3 # NORMAL SUBGROUP OF
+22B3; 22B2 # CONTAINS AS NORMAL SUBGROUP
+22B4; 22B5 # NORMAL SUBGROUP OF OR EQUAL TO
+22B5; 22B4 # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6; 22B7 # ORIGINAL OF
+22B7; 22B6 # IMAGE OF
+22C9; 22CA # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA; 22C9 # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB; 22CC # LEFT SEMIDIRECT PRODUCT
+22CC; 22CB # RIGHT SEMIDIRECT PRODUCT
+22CD; 2243 # REVERSED TILDE EQUALS
+22D0; 22D1 # DOUBLE SUBSET
+22D1; 22D0 # DOUBLE SUPERSET
+22D6; 22D7 # LESS-THAN WITH DOT
+22D7; 22D6 # GREATER-THAN WITH DOT
+22D8; 22D9 # VERY MUCH LESS-THAN
+22D9; 22D8 # VERY MUCH GREATER-THAN
+22DA; 22DB # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB; 22DA # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC; 22DD # EQUAL TO OR LESS-THAN
+22DD; 22DC # EQUAL TO OR GREATER-THAN
+22DE; 22DF # EQUAL TO OR PRECEDES
+22DF; 22DE # EQUAL TO OR SUCCEEDS
+22E0; 22E1 # [BEST FIT] DOES NOT PRECEDE OR EQUAL
+22E1; 22E0 # [BEST FIT] DOES NOT SUCCEED OR EQUAL
+22E2; 22E3 # [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO
+22E3; 22E2 # [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4; 22E5 # [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO
+22E5; 22E4 # [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6; 22E7 # [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO
+22E7; 22E6 # [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO
+22E8; 22E9 # [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO
+22E9; 22E8 # [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO
+22EA; 22EB # [BEST FIT] NOT NORMAL SUBGROUP OF
+22EB; 22EA # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC; 22ED # [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED; 22EC # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22F0; 22F1 # UP RIGHT DIAGONAL ELLIPSIS
+22F1; 22F0 # DOWN RIGHT DIAGONAL ELLIPSIS
+22F2; 22FA # ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3; 22FB # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4; 22FC # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F6; 22FD # ELEMENT OF WITH OVERBAR
+22F7; 22FE # SMALL ELEMENT OF WITH OVERBAR
+22FA; 22F2 # CONTAINS WITH LONG HORIZONTAL STROKE
+22FB; 22F3 # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC; 22F4 # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD; 22F6 # CONTAINS WITH OVERBAR
+22FE; 22F7 # SMALL CONTAINS WITH OVERBAR
+2308; 2309 # LEFT CEILING
+2309; 2308 # RIGHT CEILING
+230A; 230B # LEFT FLOOR
+230B; 230A # RIGHT FLOOR
+2329; 232A # LEFT-POINTING ANGLE BRACKET
+232A; 2329 # RIGHT-POINTING ANGLE BRACKET
+2768; 2769 # MEDIUM LEFT PARENTHESIS ORNAMENT
+2769; 2768 # MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A; 276B # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B; 276A # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C; 276D # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D; 276C # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E; 276F # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F; 276E # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770; 2771 # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771; 2770 # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772; 2773 # LIGHT LEFT TORTOISE SHELL BRACKET
+2773; 2772 # LIGHT RIGHT TORTOISE SHELL BRACKET
+2774; 2775 # MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775; 2774 # MEDIUM RIGHT CURLY BRACKET ORNAMENT
+27C3; 27C4 # OPEN SUBSET
+27C4; 27C3 # OPEN SUPERSET
+27C5; 27C6 # LEFT S-SHAPED BAG DELIMITER
+27C6; 27C5 # RIGHT S-SHAPED BAG DELIMITER
+27C8; 27C9 # REVERSE SOLIDUS PRECEDING SUBSET
+27C9; 27C8 # SUPERSET PRECEDING SOLIDUS
+27D5; 27D6 # LEFT OUTER JOIN
+27D6; 27D5 # RIGHT OUTER JOIN
+27DD; 27DE # LONG RIGHT TACK
+27DE; 27DD # LONG LEFT TACK
+27E2; 27E3 # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3; 27E2 # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4; 27E5 # WHITE SQUARE WITH LEFTWARDS TICK
+27E5; 27E4 # WHITE SQUARE WITH RIGHTWARDS TICK
+27E6; 27E7 # MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7; 27E6 # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8; 27E9 # MATHEMATICAL LEFT ANGLE BRACKET
+27E9; 27E8 # MATHEMATICAL RIGHT ANGLE BRACKET
+27EA; 27EB # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB; 27EA # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC; 27ED # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED; 27EC # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE; 27EF # MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF; 27EE # MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+2983; 2984 # LEFT WHITE CURLY BRACKET
+2984; 2983 # RIGHT WHITE CURLY BRACKET
+2985; 2986 # LEFT WHITE PARENTHESIS
+2986; 2985 # RIGHT WHITE PARENTHESIS
+2987; 2988 # Z NOTATION LEFT IMAGE BRACKET
+2988; 2987 # Z NOTATION RIGHT IMAGE BRACKET
+2989; 298A # Z NOTATION LEFT BINDING BRACKET
+298A; 2989 # Z NOTATION RIGHT BINDING BRACKET
+298B; 298C # LEFT SQUARE BRACKET WITH UNDERBAR
+298C; 298B # RIGHT SQUARE BRACKET WITH UNDERBAR
+298D; 2990 # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E; 298F # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F; 298E # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990; 298D # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991; 2992 # LEFT ANGLE BRACKET WITH DOT
+2992; 2991 # RIGHT ANGLE BRACKET WITH DOT
+2993; 2994 # LEFT ARC LESS-THAN BRACKET
+2994; 2993 # RIGHT ARC GREATER-THAN BRACKET
+2995; 2996 # DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996; 2995 # DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997; 2998 # LEFT BLACK TORTOISE SHELL BRACKET
+2998; 2997 # RIGHT BLACK TORTOISE SHELL BRACKET
+29B8; 2298 # CIRCLED REVERSE SOLIDUS
+29C0; 29C1 # CIRCLED LESS-THAN
+29C1; 29C0 # CIRCLED GREATER-THAN
+29C4; 29C5 # SQUARED RISING DIAGONAL SLASH
+29C5; 29C4 # SQUARED FALLING DIAGONAL SLASH
+29CF; 29D0 # LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0; 29CF # VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1; 29D2 # BOWTIE WITH LEFT HALF BLACK
+29D2; 29D1 # BOWTIE WITH RIGHT HALF BLACK
+29D4; 29D5 # TIMES WITH LEFT HALF BLACK
+29D5; 29D4 # TIMES WITH RIGHT HALF BLACK
+29D8; 29D9 # LEFT WIGGLY FENCE
+29D9; 29D8 # RIGHT WIGGLY FENCE
+29DA; 29DB # LEFT DOUBLE WIGGLY FENCE
+29DB; 29DA # RIGHT DOUBLE WIGGLY FENCE
+29F5; 2215 # REVERSE SOLIDUS OPERATOR
+29F8; 29F9 # BIG SOLIDUS
+29F9; 29F8 # BIG REVERSE SOLIDUS
+29FC; 29FD # LEFT-POINTING CURVED ANGLE BRACKET
+29FD; 29FC # RIGHT-POINTING CURVED ANGLE BRACKET
+2A2B; 2A2C # MINUS SIGN WITH FALLING DOTS
+2A2C; 2A2B # MINUS SIGN WITH RISING DOTS
+2A2D; 2A2E # PLUS SIGN IN LEFT HALF CIRCLE
+2A2E; 2A2D # PLUS SIGN IN RIGHT HALF CIRCLE
+2A34; 2A35 # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35; 2A34 # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A3C; 2A3D # INTERIOR PRODUCT
+2A3D; 2A3C # RIGHTHAND INTERIOR PRODUCT
+2A64; 2A65 # Z NOTATION DOMAIN ANTIRESTRICTION
+2A65; 2A64 # Z NOTATION RANGE ANTIRESTRICTION
+2A79; 2A7A # LESS-THAN WITH CIRCLE INSIDE
+2A7A; 2A79 # GREATER-THAN WITH CIRCLE INSIDE
+2A7D; 2A7E # LESS-THAN OR SLANTED EQUAL TO
+2A7E; 2A7D # GREATER-THAN OR SLANTED EQUAL TO
+2A7F; 2A80 # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80; 2A7F # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81; 2A82 # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82; 2A81 # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83; 2A84 # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84; 2A83 # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A8B; 2A8C # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C; 2A8B # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A91; 2A92 # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92; 2A91 # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93; 2A94 # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94; 2A93 # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95; 2A96 # SLANTED EQUAL TO OR LESS-THAN
+2A96; 2A95 # SLANTED EQUAL TO OR GREATER-THAN
+2A97; 2A98 # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98; 2A97 # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99; 2A9A # DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A; 2A99 # DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B; 2A9C # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C; 2A9B # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2AA1; 2AA2 # DOUBLE NESTED LESS-THAN
+2AA2; 2AA1 # DOUBLE NESTED GREATER-THAN
+2AA6; 2AA7 # LESS-THAN CLOSED BY CURVE
+2AA7; 2AA6 # GREATER-THAN CLOSED BY CURVE
+2AA8; 2AA9 # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9; 2AA8 # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA; 2AAB # SMALLER THAN
+2AAB; 2AAA # LARGER THAN
+2AAC; 2AAD # SMALLER THAN OR EQUAL TO
+2AAD; 2AAC # LARGER THAN OR EQUAL TO
+2AAF; 2AB0 # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0; 2AAF # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB3; 2AB4 # PRECEDES ABOVE EQUALS SIGN
+2AB4; 2AB3 # SUCCEEDS ABOVE EQUALS SIGN
+2ABB; 2ABC # DOUBLE PRECEDES
+2ABC; 2ABB # DOUBLE SUCCEEDS
+2ABD; 2ABE # SUBSET WITH DOT
+2ABE; 2ABD # SUPERSET WITH DOT
+2ABF; 2AC0 # SUBSET WITH PLUS SIGN BELOW
+2AC0; 2ABF # SUPERSET WITH PLUS SIGN BELOW
+2AC1; 2AC2 # SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2; 2AC1 # SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3; 2AC4 # SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4; 2AC3 # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5; 2AC6 # SUBSET OF ABOVE EQUALS SIGN
+2AC6; 2AC5 # SUPERSET OF ABOVE EQUALS SIGN
+2ACD; 2ACE # SQUARE LEFT OPEN BOX OPERATOR
+2ACE; 2ACD # SQUARE RIGHT OPEN BOX OPERATOR
+2ACF; 2AD0 # CLOSED SUBSET
+2AD0; 2ACF # CLOSED SUPERSET
+2AD1; 2AD2 # CLOSED SUBSET OR EQUAL TO
+2AD2; 2AD1 # CLOSED SUPERSET OR EQUAL TO
+2AD3; 2AD4 # SUBSET ABOVE SUPERSET
+2AD4; 2AD3 # SUPERSET ABOVE SUBSET
+2AD5; 2AD6 # SUBSET ABOVE SUBSET
+2AD6; 2AD5 # SUPERSET ABOVE SUPERSET
+2ADE; 22A6 # SHORT LEFT TACK
+2AE3; 22A9 # DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4; 22A8 # VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5; 22AB # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AEC; 2AED # DOUBLE STROKE NOT SIGN
+2AED; 2AEC # REVERSED DOUBLE STROKE NOT SIGN
+2AF7; 2AF8 # TRIPLE NESTED LESS-THAN
+2AF8; 2AF7 # TRIPLE NESTED GREATER-THAN
+2AF9; 2AFA # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA; 2AF9 # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+2E02; 2E03 # LEFT SUBSTITUTION BRACKET
+2E03; 2E02 # RIGHT SUBSTITUTION BRACKET
+2E04; 2E05 # LEFT DOTTED SUBSTITUTION BRACKET
+2E05; 2E04 # RIGHT DOTTED SUBSTITUTION BRACKET
+2E09; 2E0A # LEFT TRANSPOSITION BRACKET
+2E0A; 2E09 # RIGHT TRANSPOSITION BRACKET
+2E0C; 2E0D # LEFT RAISED OMISSION BRACKET
+2E0D; 2E0C # RIGHT RAISED OMISSION BRACKET
+2E1C; 2E1D # LEFT LOW PARAPHRASE BRACKET
+2E1D; 2E1C # RIGHT LOW PARAPHRASE BRACKET
+2E20; 2E21 # LEFT VERTICAL BAR WITH QUILL
+2E21; 2E20 # RIGHT VERTICAL BAR WITH QUILL
+2E22; 2E23 # TOP LEFT HALF BRACKET
+2E23; 2E22 # TOP RIGHT HALF BRACKET
+2E24; 2E25 # BOTTOM LEFT HALF BRACKET
+2E25; 2E24 # BOTTOM RIGHT HALF BRACKET
+2E26; 2E27 # LEFT SIDEWAYS U BRACKET
+2E27; 2E26 # RIGHT SIDEWAYS U BRACKET
+2E28; 2E29 # LEFT DOUBLE PARENTHESIS
+2E29; 2E28 # RIGHT DOUBLE PARENTHESIS
+3008; 3009 # LEFT ANGLE BRACKET
+3009; 3008 # RIGHT ANGLE BRACKET
+300A; 300B # LEFT DOUBLE ANGLE BRACKET
+300B; 300A # RIGHT DOUBLE ANGLE BRACKET
+300C; 300D # [BEST FIT] LEFT CORNER BRACKET
+300D; 300C # [BEST FIT] RIGHT CORNER BRACKET
+300E; 300F # [BEST FIT] LEFT WHITE CORNER BRACKET
+300F; 300E # [BEST FIT] RIGHT WHITE CORNER BRACKET
+3010; 3011 # LEFT BLACK LENTICULAR BRACKET
+3011; 3010 # RIGHT BLACK LENTICULAR BRACKET
+3014; 3015 # LEFT TORTOISE SHELL BRACKET
+3015; 3014 # RIGHT TORTOISE SHELL BRACKET
+3016; 3017 # LEFT WHITE LENTICULAR BRACKET
+3017; 3016 # RIGHT WHITE LENTICULAR BRACKET
+3018; 3019 # LEFT WHITE TORTOISE SHELL BRACKET
+3019; 3018 # RIGHT WHITE TORTOISE SHELL BRACKET
+301A; 301B # LEFT WHITE SQUARE BRACKET
+301B; 301A # RIGHT WHITE SQUARE BRACKET
+FE59; FE5A # SMALL LEFT PARENTHESIS
+FE5A; FE59 # SMALL RIGHT PARENTHESIS
+FE5B; FE5C # SMALL LEFT CURLY BRACKET
+FE5C; FE5B # SMALL RIGHT CURLY BRACKET
+FE5D; FE5E # SMALL LEFT TORTOISE SHELL BRACKET
+FE5E; FE5D # SMALL RIGHT TORTOISE SHELL BRACKET
+FE64; FE65 # SMALL LESS-THAN SIGN
+FE65; FE64 # SMALL GREATER-THAN SIGN
+FF08; FF09 # FULLWIDTH LEFT PARENTHESIS
+FF09; FF08 # FULLWIDTH RIGHT PARENTHESIS
+FF1C; FF1E # FULLWIDTH LESS-THAN SIGN
+FF1E; FF1C # FULLWIDTH GREATER-THAN SIGN
+FF3B; FF3D # FULLWIDTH LEFT SQUARE BRACKET
+FF3D; FF3B # FULLWIDTH RIGHT SQUARE BRACKET
+FF5B; FF5D # FULLWIDTH LEFT CURLY BRACKET
+FF5D; FF5B # FULLWIDTH RIGHT CURLY BRACKET
+FF5F; FF60 # FULLWIDTH LEFT WHITE PARENTHESIS
+FF60; FF5F # FULLWIDTH RIGHT WHITE PARENTHESIS
+FF62; FF63 # [BEST FIT] HALFWIDTH LEFT CORNER BRACKET
+FF63; FF62 # [BEST FIT] HALFWIDTH RIGHT CORNER BRACKET
+
+# The following characters have no appropriate mirroring character.
+# For these characters it is up to the rendering system
+# to provide mirrored glyphs.
+
+# 2140; DOUBLE-STRUCK N-ARY SUMMATION
+# 2201; COMPLEMENT
+# 2202; PARTIAL DIFFERENTIAL
+# 2203; THERE EXISTS
+# 2204; THERE DOES NOT EXIST
+# 2211; N-ARY SUMMATION
+# 2216; SET MINUS
+# 221A; SQUARE ROOT
+# 221B; CUBE ROOT
+# 221C; FOURTH ROOT
+# 221D; PROPORTIONAL TO
+# 221F; RIGHT ANGLE
+# 2220; ANGLE
+# 2221; MEASURED ANGLE
+# 2222; SPHERICAL ANGLE
+# 2224; DOES NOT DIVIDE
+# 2226; NOT PARALLEL TO
+# 222B; INTEGRAL
+# 222C; DOUBLE INTEGRAL
+# 222D; TRIPLE INTEGRAL
+# 222E; CONTOUR INTEGRAL
+# 222F; SURFACE INTEGRAL
+# 2230; VOLUME INTEGRAL
+# 2231; CLOCKWISE INTEGRAL
+# 2232; CLOCKWISE CONTOUR INTEGRAL
+# 2233; ANTICLOCKWISE CONTOUR INTEGRAL
+# 2239; EXCESS
+# 223B; HOMOTHETIC
+# 223E; INVERTED LAZY S
+# 223F; SINE WAVE
+# 2240; WREATH PRODUCT
+# 2241; NOT TILDE
+# 2242; MINUS TILDE
+# 2244; NOT ASYMPTOTICALLY EQUAL TO
+# 2245; APPROXIMATELY EQUAL TO
+# 2246; APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+# 2247; NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+# 2248; ALMOST EQUAL TO
+# 2249; NOT ALMOST EQUAL TO
+# 224A; ALMOST EQUAL OR EQUAL TO
+# 224B; TRIPLE TILDE
+# 224C; ALL EQUAL TO
+# 225F; QUESTIONED EQUAL TO
+# 2260; NOT EQUAL TO
+# 2262; NOT IDENTICAL TO
+# 228C; MULTISET
+# 22A7; MODELS
+# 22AA; TRIPLE VERTICAL BAR RIGHT TURNSTILE
+# 22AC; DOES NOT PROVE
+# 22AD; NOT TRUE
+# 22AE; DOES NOT FORCE
+# 22AF; NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+# 22B8; MULTIMAP
+# 22BE; RIGHT ANGLE WITH ARC
+# 22BF; RIGHT TRIANGLE
+# 22F5; ELEMENT OF WITH DOT ABOVE
+# 22F8; ELEMENT OF WITH UNDERBAR
+# 22F9; ELEMENT OF WITH TWO HORIZONTAL STROKES
+# 22FF; Z NOTATION BAG MEMBERSHIP
+# 2320; TOP HALF INTEGRAL
+# 2321; BOTTOM HALF INTEGRAL
+# 27CC; LONG DIVISION
+# 27C0; THREE DIMENSIONAL ANGLE
+# 27D3; LOWER RIGHT CORNER WITH DOT
+# 27D4; UPPER LEFT CORNER WITH DOT
+# 27DC; LEFT MULTIMAP
+# 299B; MEASURED ANGLE OPENING LEFT
+# 299C; RIGHT ANGLE VARIANT WITH SQUARE
+# 299D; MEASURED RIGHT ANGLE WITH DOT
+# 299E; ANGLE WITH S INSIDE
+# 299F; ACUTE ANGLE
+# 29A0; SPHERICAL ANGLE OPENING LEFT
+# 29A1; SPHERICAL ANGLE OPENING UP
+# 29A2; TURNED ANGLE
+# 29A3; REVERSED ANGLE
+# 29A4; ANGLE WITH UNDERBAR
+# 29A5; REVERSED ANGLE WITH UNDERBAR
+# 29A6; OBLIQUE ANGLE OPENING UP
+# 29A7; OBLIQUE ANGLE OPENING DOWN
+# 29A8; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+# 29A9; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+# 29AA; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+# 29AB; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+# 29AC; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+# 29AD; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+# 29AE; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+# 29AF; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+# 29C2; CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+# 29C3; CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+# 29C9; TWO JOINED SQUARES
+# 29CE; RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+# 29DC; INCOMPLETE INFINITY
+# 29E1; INCREASES AS
+# 29E3; EQUALS SIGN AND SLANTED PARALLEL
+# 29E4; EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+# 29E5; IDENTICAL TO AND SLANTED PARALLEL
+# 29E8; DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+# 29E9; DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+# 29F4; RULE-DELAYED
+# 29F6; SOLIDUS WITH OVERBAR
+# 29F7; REVERSE SOLIDUS WITH HORIZONTAL STROKE
+# 2A0A; MODULO TWO SUM
+# 2A0B; SUMMATION WITH INTEGRAL
+# 2A0C; QUADRUPLE INTEGRAL OPERATOR
+# 2A0D; FINITE PART INTEGRAL
+# 2A0E; INTEGRAL WITH DOUBLE STROKE
+# 2A0F; INTEGRAL AVERAGE WITH SLASH
+# 2A10; CIRCULATION FUNCTION
+# 2A11; ANTICLOCKWISE INTEGRATION
+# 2A12; LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+# 2A13; LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+# 2A14; LINE INTEGRATION NOT INCLUDING THE POLE
+# 2A15; INTEGRAL AROUND A POINT OPERATOR
+# 2A16; QUATERNION INTEGRAL OPERATOR
+# 2A17; INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+# 2A18; INTEGRAL WITH TIMES SIGN
+# 2A19; INTEGRAL WITH INTERSECTION
+# 2A1A; INTEGRAL WITH UNION
+# 2A1B; INTEGRAL WITH OVERBAR
+# 2A1C; INTEGRAL WITH UNDERBAR
+# 2A1E; LARGE LEFT TRIANGLE OPERATOR
+# 2A1F; Z NOTATION SCHEMA COMPOSITION
+# 2A20; Z NOTATION SCHEMA PIPING
+# 2A21; Z NOTATION SCHEMA PROJECTION
+# 2A24; PLUS SIGN WITH TILDE ABOVE
+# 2A26; PLUS SIGN WITH TILDE BELOW
+# 2A29; MINUS SIGN WITH COMMA ABOVE
+# 2A3E; Z NOTATION RELATIONAL COMPOSITION
+# 2A57; SLOPING LARGE OR
+# 2A58; SLOPING LARGE AND
+# 2A6A; TILDE OPERATOR WITH DOT ABOVE
+# 2A6B; TILDE OPERATOR WITH RISING DOTS
+# 2A6C; SIMILAR MINUS SIMILAR
+# 2A6D; CONGRUENT WITH DOT ABOVE
+# 2A6F; ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+# 2A70; APPROXIMATELY EQUAL OR EQUAL TO
+# 2A73; EQUALS SIGN ABOVE TILDE OPERATOR
+# 2A74; DOUBLE COLON EQUAL
+# 2A7B; LESS-THAN WITH QUESTION MARK ABOVE
+# 2A7C; GREATER-THAN WITH QUESTION MARK ABOVE
+# 2A85; LESS-THAN OR APPROXIMATE
+# 2A86; GREATER-THAN OR APPROXIMATE
+# 2A87; LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+# 2A88; GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+# 2A89; LESS-THAN AND NOT APPROXIMATE
+# 2A8A; GREATER-THAN AND NOT APPROXIMATE
+# 2A8D; LESS-THAN ABOVE SIMILAR OR EQUAL
+# 2A8E; GREATER-THAN ABOVE SIMILAR OR EQUAL
+# 2A8F; LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+# 2A90; GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+# 2A9D; SIMILAR OR LESS-THAN
+# 2A9E; SIMILAR OR GREATER-THAN
+# 2A9F; SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+# 2AA0; SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+# 2AA3; DOUBLE NESTED LESS-THAN WITH UNDERBAR
+# 2AB1; PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+# 2AB2; SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+# 2AB5; PRECEDES ABOVE NOT EQUAL TO
+# 2AB6; SUCCEEDS ABOVE NOT EQUAL TO
+# 2AB7; PRECEDES ABOVE ALMOST EQUAL TO
+# 2AB8; SUCCEEDS ABOVE ALMOST EQUAL TO
+# 2AB9; PRECEDES ABOVE NOT ALMOST EQUAL TO
+# 2ABA; SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+# 2AC7; SUBSET OF ABOVE TILDE OPERATOR
+# 2AC8; SUPERSET OF ABOVE TILDE OPERATOR
+# 2AC9; SUBSET OF ABOVE ALMOST EQUAL TO
+# 2ACA; SUPERSET OF ABOVE ALMOST EQUAL TO
+# 2ACB; SUBSET OF ABOVE NOT EQUAL TO
+# 2ACC; SUPERSET OF ABOVE NOT EQUAL TO
+# 2ADC; FORKING
+# 2AE2; VERTICAL BAR TRIPLE RIGHT TURNSTILE
+# 2AE6; LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+# 2AEE; DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+# 2AF3; PARALLEL WITH TILDE OPERATOR
+# 2AFB; TRIPLE SOLIDUS BINARY RELATION
+# 2AFD; DOUBLE SOLIDUS OPERATOR
+# 1D6DB; MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+# 1D715; MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+# 1D74F; MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+# 1D789; MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+# 1D7C3; MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+
+# EOF
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/Blocks.txt b/Master/tlpkg/tlperl.straw/lib/unicore/Blocks.txt
new file mode 100755
index 00000000000..7803f66cc08
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/Blocks.txt
@@ -0,0 +1,202 @@
+# Blocks-5.1.0.txt
+# Date: 2008-03-20, 17:41:00 PDT [KW]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# Note: The casing of block names is not normative.
+# For example, "Basic Latin" and "BASIC LATIN" are equivalent.
+#
+# Format:
+# Start Code..End Code; Block Name
+
+# ================================================
+
+# Note: When comparing block names, casing, whitespace, hyphens,
+# and underbars are ignored.
+# For example, "Latin Extended-A" and "latin extended a" are equivalent.
+# For more information on the comparison of property values,
+# see UCD.html.
+#
+# All code points not explicitly listed for Block
+# have the value No_Block.
+
+# Property: Block
+#
+# @missing: 0000..10FFFF; No_Block
+
+0000..007F; Basic Latin
+0080..00FF; Latin-1 Supplement
+0100..017F; Latin Extended-A
+0180..024F; Latin Extended-B
+0250..02AF; IPA Extensions
+02B0..02FF; Spacing Modifier Letters
+0300..036F; Combining Diacritical Marks
+0370..03FF; Greek and Coptic
+0400..04FF; Cyrillic
+0500..052F; Cyrillic Supplement
+0530..058F; Armenian
+0590..05FF; Hebrew
+0600..06FF; Arabic
+0700..074F; Syriac
+0750..077F; Arabic Supplement
+0780..07BF; Thaana
+07C0..07FF; NKo
+0900..097F; Devanagari
+0980..09FF; Bengali
+0A00..0A7F; Gurmukhi
+0A80..0AFF; Gujarati
+0B00..0B7F; Oriya
+0B80..0BFF; Tamil
+0C00..0C7F; Telugu
+0C80..0CFF; Kannada
+0D00..0D7F; Malayalam
+0D80..0DFF; Sinhala
+0E00..0E7F; Thai
+0E80..0EFF; Lao
+0F00..0FFF; Tibetan
+1000..109F; Myanmar
+10A0..10FF; Georgian
+1100..11FF; Hangul Jamo
+1200..137F; Ethiopic
+1380..139F; Ethiopic Supplement
+13A0..13FF; Cherokee
+1400..167F; Unified Canadian Aboriginal Syllabics
+1680..169F; Ogham
+16A0..16FF; Runic
+1700..171F; Tagalog
+1720..173F; Hanunoo
+1740..175F; Buhid
+1760..177F; Tagbanwa
+1780..17FF; Khmer
+1800..18AF; Mongolian
+1900..194F; Limbu
+1950..197F; Tai Le
+1980..19DF; New Tai Lue
+19E0..19FF; Khmer Symbols
+1A00..1A1F; Buginese
+1B00..1B7F; Balinese
+1B80..1BBF; Sundanese
+1C00..1C4F; Lepcha
+1C50..1C7F; Ol Chiki
+1D00..1D7F; Phonetic Extensions
+1D80..1DBF; Phonetic Extensions Supplement
+1DC0..1DFF; Combining Diacritical Marks Supplement
+1E00..1EFF; Latin Extended Additional
+1F00..1FFF; Greek Extended
+2000..206F; General Punctuation
+2070..209F; Superscripts and Subscripts
+20A0..20CF; Currency Symbols
+20D0..20FF; Combining Diacritical Marks for Symbols
+2100..214F; Letterlike Symbols
+2150..218F; Number Forms
+2190..21FF; Arrows
+2200..22FF; Mathematical Operators
+2300..23FF; Miscellaneous Technical
+2400..243F; Control Pictures
+2440..245F; Optical Character Recognition
+2460..24FF; Enclosed Alphanumerics
+2500..257F; Box Drawing
+2580..259F; Block Elements
+25A0..25FF; Geometric Shapes
+2600..26FF; Miscellaneous Symbols
+2700..27BF; Dingbats
+27C0..27EF; Miscellaneous Mathematical Symbols-A
+27F0..27FF; Supplemental Arrows-A
+2800..28FF; Braille Patterns
+2900..297F; Supplemental Arrows-B
+2980..29FF; Miscellaneous Mathematical Symbols-B
+2A00..2AFF; Supplemental Mathematical Operators
+2B00..2BFF; Miscellaneous Symbols and Arrows
+2C00..2C5F; Glagolitic
+2C60..2C7F; Latin Extended-C
+2C80..2CFF; Coptic
+2D00..2D2F; Georgian Supplement
+2D30..2D7F; Tifinagh
+2D80..2DDF; Ethiopic Extended
+2DE0..2DFF; Cyrillic Extended-A
+2E00..2E7F; Supplemental Punctuation
+2E80..2EFF; CJK Radicals Supplement
+2F00..2FDF; Kangxi Radicals
+2FF0..2FFF; Ideographic Description Characters
+3000..303F; CJK Symbols and Punctuation
+3040..309F; Hiragana
+30A0..30FF; Katakana
+3100..312F; Bopomofo
+3130..318F; Hangul Compatibility Jamo
+3190..319F; Kanbun
+31A0..31BF; Bopomofo Extended
+31C0..31EF; CJK Strokes
+31F0..31FF; Katakana Phonetic Extensions
+3200..32FF; Enclosed CJK Letters and Months
+3300..33FF; CJK Compatibility
+3400..4DBF; CJK Unified Ideographs Extension A
+4DC0..4DFF; Yijing Hexagram Symbols
+4E00..9FFF; CJK Unified Ideographs
+A000..A48F; Yi Syllables
+A490..A4CF; Yi Radicals
+A500..A63F; Vai
+A640..A69F; Cyrillic Extended-B
+A700..A71F; Modifier Tone Letters
+A720..A7FF; Latin Extended-D
+A800..A82F; Syloti Nagri
+A840..A87F; Phags-pa
+A880..A8DF; Saurashtra
+A900..A92F; Kayah Li
+A930..A95F; Rejang
+AA00..AA5F; Cham
+AC00..D7AF; Hangul Syllables
+D800..DB7F; High Surrogates
+DB80..DBFF; High Private Use Surrogates
+DC00..DFFF; Low Surrogates
+E000..F8FF; Private Use Area
+F900..FAFF; CJK Compatibility Ideographs
+FB00..FB4F; Alphabetic Presentation Forms
+FB50..FDFF; Arabic Presentation Forms-A
+FE00..FE0F; Variation Selectors
+FE10..FE1F; Vertical Forms
+FE20..FE2F; Combining Half Marks
+FE30..FE4F; CJK Compatibility Forms
+FE50..FE6F; Small Form Variants
+FE70..FEFF; Arabic Presentation Forms-B
+FF00..FFEF; Halfwidth and Fullwidth Forms
+FFF0..FFFF; Specials
+10000..1007F; Linear B Syllabary
+10080..100FF; Linear B Ideograms
+10100..1013F; Aegean Numbers
+10140..1018F; Ancient Greek Numbers
+10190..101CF; Ancient Symbols
+101D0..101FF; Phaistos Disc
+10280..1029F; Lycian
+102A0..102DF; Carian
+10300..1032F; Old Italic
+10330..1034F; Gothic
+10380..1039F; Ugaritic
+103A0..103DF; Old Persian
+10400..1044F; Deseret
+10450..1047F; Shavian
+10480..104AF; Osmanya
+10800..1083F; Cypriot Syllabary
+10900..1091F; Phoenician
+10920..1093F; Lydian
+10A00..10A5F; Kharoshthi
+12000..123FF; Cuneiform
+12400..1247F; Cuneiform Numbers and Punctuation
+1D000..1D0FF; Byzantine Musical Symbols
+1D100..1D1FF; Musical Symbols
+1D200..1D24F; Ancient Greek Musical Notation
+1D300..1D35F; Tai Xuan Jing Symbols
+1D360..1D37F; Counting Rod Numerals
+1D400..1D7FF; Mathematical Alphanumeric Symbols
+1F000..1F02F; Mahjong Tiles
+1F030..1F09F; Domino Tiles
+20000..2A6DF; CJK Unified Ideographs Extension B
+2F800..2FA1F; CJK Compatibility Ideographs Supplement
+E0000..E007F; Tags
+E0100..E01EF; Variation Selectors Supplement
+F0000..FFFFF; Supplementary Private Use Area-A
+100000..10FFFF; Supplementary Private Use Area-B
+
+# EOF \ No newline at end of file
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/Canonical.pl b/Master/tlpkg/tlperl.straw/lib/unicore/Canonical.pl
new file mode 100755
index 00000000000..9a490004ebb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/Canonical.pl
@@ -0,0 +1,1178 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+##
+## Data in this file used by ../utf8_heavy.pl
+##
+
+## Mapping from lc(canonical name) to filename in ./lib
+%utf8::Canonical = (
+
+ # InAegeanNumbers
+ aegeannumbers => 'InAegean',
+
+ alphabetic => 'Alphabet',
+
+ # InAlphabeticPresentationForms
+ alphabeticpresentationforms => 'InAlphab',
+
+ # InAncientGreekMusicalNotation
+ ancientgreekmusicalnotation => 'InAncie3',
+
+ # InAncientGreekNumbers
+ ancientgreeknumbers => 'InAncie2',
+
+ # InAncientSymbols
+ ancientsymbols => 'InAncien',
+
+ arabic => 'Arab',
+
+ # InArabicPresentationFormsA
+ arabicpresentationformsa => 'InArabi4',
+
+ # InArabicPresentationFormsB
+ arabicpresentationformsb => 'InArabi3',
+
+ # InArabicSupplement
+ arabicsupplement => 'InArabi2',
+
+ armenian => 'Armn',
+
+ # InArrows
+ arrows => 'InArrows',
+
+ # AsciiHexDigit
+ asciihexdigit => 'AsciiHex',
+
+ balinese => 'Bali',
+
+ # InBasicLatin
+ basiclatin => 'InBasicL',
+
+ bengali => 'Beng',
+
+ # BidiControl
+ bidicontrol => 'BidiCont',
+
+ # InBlockElements
+ blockelements => 'InBlockE',
+
+ bopomofo => 'Bopo',
+
+ # InBopomofoExtended
+ bopomofoextended => 'InBopom2',
+
+ # InBoxDrawing
+ boxdrawing => 'InBoxDra',
+
+ braille => 'Brai',
+
+ # InBraillePatterns
+ braillepatterns => 'InBraill',
+
+ buginese => 'Bugi',
+ buhid => 'Buhd',
+
+ # InByzantineMusicalSymbols
+ byzantinemusicalsymbols => 'InByzant',
+
+ # CanadianAboriginal
+ canadianaboriginal => 'Canadian',
+
+ carian => 'Cari',
+
+ # CasedLetter
+ casedletter => 'LC',
+
+ cham => 'Cham',
+ cherokee => 'Cher',
+
+ # InCjkCompatibility
+ cjkcompatibility => 'InCjkCom',
+
+ # InCjkCompatibilityForms
+ cjkcompatibilityforms => 'InCjkCo2',
+
+ # InCjkCompatibilityIdeographs
+ cjkcompatibilityideographs => 'InCjkCo3',
+
+ # InCjkCompatibilityIdeographsSupplement
+ cjkcompatibilityideographssupplement => 'InCjkCo4',
+
+ # InCjkRadicalsSupplement
+ cjkradicalssupplement => 'InCjkRad',
+
+ # InCjkStrokes
+ cjkstrokes => 'InCjkStr',
+
+ # InCjkSymbolsAndPunctuation
+ cjksymbolsandpunctuation => 'InCjkSym',
+
+ # InCjkUnifiedIdeographs
+ cjkunifiedideographs => 'InCjkUni',
+
+ # InCjkUnifiedIdeographsExtensionA
+ cjkunifiedideographsextensiona => 'InCjkUn3',
+
+ # InCjkUnifiedIdeographsExtensionB
+ cjkunifiedideographsextensionb => 'InCjkUn2',
+
+ # ClosePunctuation
+ closepunctuation => 'Pe',
+
+ # InCombiningDiacriticalMarks
+ combiningdiacriticalmarks => 'InCombi2',
+
+ # InCombiningDiacriticalMarksForSymbols
+ combiningdiacriticalmarksforsymbols => 'InCombi4',
+
+ # InCombiningDiacriticalMarksSupplement
+ combiningdiacriticalmarkssupplement => 'InCombi3',
+
+ # InCombiningHalfMarks
+ combininghalfmarks => 'InCombin',
+
+ common => 'Zyyy',
+
+ # ConnectorPunctuation
+ connectorpunctuation => 'Pc',
+
+ control => 'Cc',
+
+ # InControlPictures
+ controlpictures => 'InContro',
+
+ coptic => 'Copt',
+
+ # InCountingRodNumerals
+ countingrodnumerals => 'InCounti',
+
+ cuneiform => 'Xsux',
+
+ # InCuneiformNumbersAndPunctuation
+ cuneiformnumbersandpunctuation => 'InCunei2',
+
+ # CurrencySymbol
+ currencysymbol => 'Sc',
+
+ # InCurrencySymbols
+ currencysymbols => 'InCurren',
+
+ cypriot => 'Cprt',
+
+ # InCypriotSyllabary
+ cypriotsyllabary => 'InCyprio',
+
+ cyrillic => 'Cyrl',
+
+ # InCyrillicExtendedA
+ cyrillicextendeda => 'InCyril3',
+
+ # InCyrillicExtendedB
+ cyrillicextendedb => 'InCyril2',
+
+ # InCyrillicSupplement
+ cyrillicsupplement => 'InCyril4',
+
+ dash => 'Dash2',
+
+ # DashPunctuation
+ dashpunctuation => 'Pd',
+
+ # DecimalNumber
+ decimalnumber => 'Nd',
+
+ # DefaultIgnorableCodePoint
+ defaultignorablecodepoint => 'DefaultI',
+
+ deprecated => 'Deprecat',
+ deseret => 'Dsrt',
+ devanagari => 'Deva',
+ diacritic => 'Diacriti',
+
+ # InDingbats
+ dingbats => 'InDingba',
+
+ # InDominoTiles
+ dominotiles => 'InDomino',
+
+ # InEnclosedAlphanumerics
+ enclosedalphanumerics => 'InEnclos',
+
+ # InEnclosedCjkLettersAndMonths
+ enclosedcjklettersandmonths => 'InEnclo2',
+
+ # EnclosingMark
+ enclosingmark => 'Me',
+
+ ethiopic => 'Ethi',
+
+ # InEthiopicExtended
+ ethiopicextended => 'InEthio2',
+
+ # InEthiopicSupplement
+ ethiopicsupplement => 'InEthio3',
+
+ extender => 'Extender',
+
+ # FinalPunctuation
+ finalpunctuation => 'Pf',
+
+ format => 'Cf',
+
+ # InGeneralPunctuation
+ generalpunctuation => 'InGenera',
+
+ # InGeometricShapes
+ geometricshapes => 'InGeomet',
+
+ georgian => 'Geor',
+
+ # InGeorgianSupplement
+ georgiansupplement => 'InGeorg2',
+
+ glagolitic => 'Glag',
+ gothic => 'Goth',
+ greek => 'Grek',
+
+ # InGreekAndCoptic
+ greekandcoptic => 'InGreekA',
+
+ # InGreekExtended
+ greekextended => 'InGreekE',
+
+ gujarati => 'Gujr',
+ gurmukhi => 'Guru',
+
+ # InHalfwidthAndFullwidthForms
+ halfwidthandfullwidthforms => 'InHalfwi',
+
+ han => 'Hani',
+ hangul => 'Hang',
+
+ # InHangulCompatibilityJamo
+ hangulcompatibilityjamo => 'InHangu3',
+
+ # InHangulJamo
+ hanguljamo => 'InHangul',
+
+ # InHangulSyllables
+ hangulsyllables => 'InHangu2',
+
+ hanunoo => 'Hano',
+ hebrew => 'Hebr',
+
+ # HexDigit
+ hexdigit => 'HexDigit',
+
+ # InHighPrivateUseSurrogates
+ highprivateusesurrogates => 'InHighPr',
+
+ # InHighSurrogates
+ highsurrogates => 'InHighSu',
+
+ hiragana => 'Hira',
+ hyphen => 'Hyphen2',
+
+ # IdContinue
+ idcontinue => 'IdContin',
+
+ ideographic => 'Ideograp',
+
+ # InIdeographicDescriptionCharacters
+ ideographicdescriptioncharacters => 'InIdeogr',
+
+ # IdsBinaryOperator
+ idsbinaryoperator => 'IdsBinar',
+
+ # IdStart
+ idstart => 'IdStart',
+
+ # IdsTrinaryOperator
+ idstrinaryoperator => 'IdsTrina',
+
+ # InAegeanNumbers
+ inaegeannumbers => 'InAegean',
+
+ # InAlphabeticPresentationForms
+ inalphabeticpresentationforms => 'InAlphab',
+
+ # InAncientGreekMusicalNotation
+ inancientgreekmusicalnotation => 'InAncie3',
+
+ # InAncientGreekNumbers
+ inancientgreeknumbers => 'InAncie2',
+
+ # InAncientSymbols
+ inancientsymbols => 'InAncien',
+
+ # InArabic
+ inarabic => 'InArabic',
+
+ # InArabicPresentationFormsA
+ inarabicpresentationformsa => 'InArabi4',
+
+ # InArabicPresentationFormsB
+ inarabicpresentationformsb => 'InArabi3',
+
+ # InArabicSupplement
+ inarabicsupplement => 'InArabi2',
+
+ # InArmenian
+ inarmenian => 'InArmeni',
+
+ # InArrows
+ inarrows => 'InArrows',
+
+ # InBalinese
+ inbalinese => 'InBaline',
+
+ # InBasicLatin
+ inbasiclatin => 'InBasicL',
+
+ # InBengali
+ inbengali => 'InBengal',
+
+ # InBlockElements
+ inblockelements => 'InBlockE',
+
+ # InBopomofo
+ inbopomofo => 'InBopomo',
+
+ # InBopomofoExtended
+ inbopomofoextended => 'InBopom2',
+
+ # InBoxDrawing
+ inboxdrawing => 'InBoxDra',
+
+ # InBraillePatterns
+ inbraillepatterns => 'InBraill',
+
+ # InBuginese
+ inbuginese => 'InBugine',
+
+ # InBuhid
+ inbuhid => 'InBuhid',
+
+ # InByzantineMusicalSymbols
+ inbyzantinemusicalsymbols => 'InByzant',
+
+ # InCarian
+ incarian => 'InCarian',
+
+ # InCham
+ incham => 'InCham',
+
+ # InCherokee
+ incherokee => 'InCherok',
+
+ # InCjkCompatibility
+ incjkcompatibility => 'InCjkCom',
+
+ # InCjkCompatibilityForms
+ incjkcompatibilityforms => 'InCjkCo2',
+
+ # InCjkCompatibilityIdeographs
+ incjkcompatibilityideographs => 'InCjkCo3',
+
+ # InCjkCompatibilityIdeographsSupplement
+ incjkcompatibilityideographssupplement => 'InCjkCo4',
+
+ # InCjkRadicalsSupplement
+ incjkradicalssupplement => 'InCjkRad',
+
+ # InCjkStrokes
+ incjkstrokes => 'InCjkStr',
+
+ # InCjkSymbolsAndPunctuation
+ incjksymbolsandpunctuation => 'InCjkSym',
+
+ # InCjkUnifiedIdeographs
+ incjkunifiedideographs => 'InCjkUni',
+
+ # InCjkUnifiedIdeographsExtensionA
+ incjkunifiedideographsextensiona => 'InCjkUn3',
+
+ # InCjkUnifiedIdeographsExtensionB
+ incjkunifiedideographsextensionb => 'InCjkUn2',
+
+ # InCombiningDiacriticalMarks
+ incombiningdiacriticalmarks => 'InCombi2',
+
+ # InCombiningDiacriticalMarksForSymbols
+ incombiningdiacriticalmarksforsymbols => 'InCombi4',
+
+ # InCombiningDiacriticalMarksSupplement
+ incombiningdiacriticalmarkssupplement => 'InCombi3',
+
+ # InCombiningHalfMarks
+ incombininghalfmarks => 'InCombin',
+
+ # InControlPictures
+ incontrolpictures => 'InContro',
+
+ # InCoptic
+ incoptic => 'InCoptic',
+
+ # InCountingRodNumerals
+ incountingrodnumerals => 'InCounti',
+
+ # InCuneiform
+ incuneiform => 'InCuneif',
+
+ # InCuneiformNumbersAndPunctuation
+ incuneiformnumbersandpunctuation => 'InCunei2',
+
+ # InCurrencySymbols
+ incurrencysymbols => 'InCurren',
+
+ # InCypriotSyllabary
+ incypriotsyllabary => 'InCyprio',
+
+ # InCyrillic
+ incyrillic => 'InCyrill',
+
+ # InCyrillicExtendedA
+ incyrillicextendeda => 'InCyril3',
+
+ # InCyrillicExtendedB
+ incyrillicextendedb => 'InCyril2',
+
+ # InCyrillicSupplement
+ incyrillicsupplement => 'InCyril4',
+
+ # InDeseret
+ indeseret => 'InDesere',
+
+ # InDevanagari
+ indevanagari => 'InDevana',
+
+ # InDingbats
+ indingbats => 'InDingba',
+
+ # InDominoTiles
+ indominotiles => 'InDomino',
+
+ # InEnclosedAlphanumerics
+ inenclosedalphanumerics => 'InEnclos',
+
+ # InEnclosedCjkLettersAndMonths
+ inenclosedcjklettersandmonths => 'InEnclo2',
+
+ # InEthiopic
+ inethiopic => 'InEthiop',
+
+ # InEthiopicExtended
+ inethiopicextended => 'InEthio2',
+
+ # InEthiopicSupplement
+ inethiopicsupplement => 'InEthio3',
+
+ # InGeneralPunctuation
+ ingeneralpunctuation => 'InGenera',
+
+ # InGeometricShapes
+ ingeometricshapes => 'InGeomet',
+
+ # InGeorgian
+ ingeorgian => 'InGeorgi',
+
+ # InGeorgianSupplement
+ ingeorgiansupplement => 'InGeorg2',
+
+ # InGlagolitic
+ inglagolitic => 'InGlagol',
+
+ # InGothic
+ ingothic => 'InGothic',
+
+ # InGreekAndCoptic
+ ingreekandcoptic => 'InGreekA',
+
+ # InGreekExtended
+ ingreekextended => 'InGreekE',
+
+ # InGujarati
+ ingujarati => 'InGujara',
+
+ # InGurmukhi
+ ingurmukhi => 'InGurmuk',
+
+ # InHalfwidthAndFullwidthForms
+ inhalfwidthandfullwidthforms => 'InHalfwi',
+
+ # InHangulCompatibilityJamo
+ inhangulcompatibilityjamo => 'InHangu3',
+
+ # InHangulJamo
+ inhanguljamo => 'InHangul',
+
+ # InHangulSyllables
+ inhangulsyllables => 'InHangu2',
+
+ # InHanunoo
+ inhanunoo => 'InHanuno',
+
+ # InHebrew
+ inhebrew => 'InHebrew',
+
+ inherited => 'Qaai',
+
+ # InHighPrivateUseSurrogates
+ inhighprivateusesurrogates => 'InHighPr',
+
+ # InHighSurrogates
+ inhighsurrogates => 'InHighSu',
+
+ # InHiragana
+ inhiragana => 'InHiraga',
+
+ # InIdeographicDescriptionCharacters
+ inideographicdescriptioncharacters => 'InIdeogr',
+
+ # InIpaExtensions
+ inipaextensions => 'InIpaExt',
+
+ # InitialPunctuation
+ initialpunctuation => 'Pi',
+
+ # InKanbun
+ inkanbun => 'InKanbun',
+
+ # InKangxiRadicals
+ inkangxiradicals => 'InKangxi',
+
+ # InKannada
+ inkannada => 'InKannad',
+
+ # InKatakana
+ inkatakana => 'InKataka',
+
+ # InKatakanaPhoneticExtensions
+ inkatakanaphoneticextensions => 'InKatak2',
+
+ # InKayahLi
+ inkayahli => 'InKayahL',
+
+ # InKharoshthi
+ inkharoshthi => 'InKharos',
+
+ # InKhmer
+ inkhmer => 'InKhmer',
+
+ # InKhmerSymbols
+ inkhmersymbols => 'InKhmerS',
+
+ # InLao
+ inlao => 'InLao',
+
+ # InLatin1Supplement
+ inlatin1supplement => 'InLatin1',
+
+ # InLatinExtendedA
+ inlatinextendeda => 'InLatin2',
+
+ # InLatinExtendedAdditional
+ inlatinextendedadditional => 'InLatin5',
+
+ # InLatinExtendedB
+ inlatinextendedb => 'InLatinE',
+
+ # InLatinExtendedC
+ inlatinextendedc => 'InLatin4',
+
+ # InLatinExtendedD
+ inlatinextendedd => 'InLatin3',
+
+ # InLepcha
+ inlepcha => 'InLepcha',
+
+ # InLetterlikeSymbols
+ inletterlikesymbols => 'InLetter',
+
+ # InLimbu
+ inlimbu => 'InLimbu',
+
+ # InLinearBIdeograms
+ inlinearbideograms => 'InLinear',
+
+ # InLinearBSyllabary
+ inlinearbsyllabary => 'InLinea2',
+
+ # InLowSurrogates
+ inlowsurrogates => 'InLowSur',
+
+ # InLycian
+ inlycian => 'InLycian',
+
+ # InLydian
+ inlydian => 'InLydian',
+
+ # InMahjongTiles
+ inmahjongtiles => 'InMahjon',
+
+ # InMalayalam
+ inmalayalam => 'InMalaya',
+
+ # InMathematicalAlphanumericSymbols
+ inmathematicalalphanumericsymbols => 'InMathe2',
+
+ # InMathematicalOperators
+ inmathematicaloperators => 'InMathem',
+
+ # InMiscellaneousMathematicalSymbolsA
+ inmiscellaneousmathematicalsymbolsa => 'InMisce4',
+
+ # InMiscellaneousMathematicalSymbolsB
+ inmiscellaneousmathematicalsymbolsb => 'InMisce5',
+
+ # InMiscellaneousSymbols
+ inmiscellaneoussymbols => 'InMiscel',
+
+ # InMiscellaneousSymbolsAndArrows
+ inmiscellaneoussymbolsandarrows => 'InMisce3',
+
+ # InMiscellaneousTechnical
+ inmiscellaneoustechnical => 'InMisce2',
+
+ # InModifierToneLetters
+ inmodifiertoneletters => 'InModifi',
+
+ # InMongolian
+ inmongolian => 'InMongol',
+
+ # InMusicalSymbols
+ inmusicalsymbols => 'InMusica',
+
+ # InMyanmar
+ inmyanmar => 'InMyanma',
+
+ # InNewTaiLue
+ innewtailue => 'InNewTai',
+
+ # InNko
+ innko => 'InNko',
+
+ # InNumberForms
+ innumberforms => 'InNumber',
+
+ # InOgham
+ inogham => 'InOgham',
+
+ # InOlChiki
+ inolchiki => 'InOlChik',
+
+ # InOldItalic
+ inolditalic => 'InOldIta',
+
+ # InOldPersian
+ inoldpersian => 'InOldPer',
+
+ # InOpticalCharacterRecognition
+ inopticalcharacterrecognition => 'InOptica',
+
+ # InOriya
+ inoriya => 'InOriya',
+
+ # InOsmanya
+ inosmanya => 'InOsmany',
+
+ # InPhagsPa
+ inphagspa => 'InPhagsP',
+
+ # InPhaistosDisc
+ inphaistosdisc => 'InPhaist',
+
+ # InPhoenician
+ inphoenician => 'InPhoeni',
+
+ # InPhoneticExtensions
+ inphoneticextensions => 'InPhonet',
+
+ # InPhoneticExtensionsSupplement
+ inphoneticextensionssupplement => 'InPhone2',
+
+ # InPrivateUseArea
+ inprivateusearea => 'InPrivat',
+
+ # InRejang
+ inrejang => 'InRejang',
+
+ # InRunic
+ inrunic => 'InRunic',
+
+ # InSaurashtra
+ insaurashtra => 'InSauras',
+
+ # InShavian
+ inshavian => 'InShavia',
+
+ # InSinhala
+ insinhala => 'InSinhal',
+
+ # InSmallFormVariants
+ insmallformvariants => 'InSmallF',
+
+ # InSpacingModifierLetters
+ inspacingmodifierletters => 'InSpacin',
+
+ # InSpecials
+ inspecials => 'InSpecia',
+
+ # InSundanese
+ insundanese => 'InSundan',
+
+ # InSuperscriptsAndSubscripts
+ insuperscriptsandsubscripts => 'InSupers',
+
+ # InSupplementalArrowsA
+ insupplementalarrowsa => 'InSuppl2',
+
+ # InSupplementalArrowsB
+ insupplementalarrowsb => 'InSupple',
+
+ # InSupplementalMathematicalOperators
+ insupplementalmathematicaloperators => 'InSuppl6',
+
+ # InSupplementalPunctuation
+ insupplementalpunctuation => 'InSuppl3',
+
+ # InSupplementaryPrivateUseAreaA
+ insupplementaryprivateuseareaa => 'InSuppl4',
+
+ # InSupplementaryPrivateUseAreaB
+ insupplementaryprivateuseareab => 'InSuppl5',
+
+ # InSylotiNagri
+ insylotinagri => 'InSyloti',
+
+ # InSyriac
+ insyriac => 'InSyriac',
+
+ # InTagalog
+ intagalog => 'InTagalo',
+
+ # InTagbanwa
+ intagbanwa => 'InTagban',
+
+ # InTags
+ intags => 'InTags',
+
+ # InTaiLe
+ intaile => 'InTaiLe',
+
+ # InTaiXuanJingSymbols
+ intaixuanjingsymbols => 'InTaiXua',
+
+ # InTamil
+ intamil => 'InTamil',
+
+ # InTelugu
+ intelugu => 'InTelugu',
+
+ # InThaana
+ inthaana => 'InThaana',
+
+ # InThai
+ inthai => 'InThai',
+
+ # InTibetan
+ intibetan => 'InTibeta',
+
+ # InTifinagh
+ intifinagh => 'InTifina',
+
+ # InUgaritic
+ inugaritic => 'InUgarit',
+
+ # InUnifiedCanadianAboriginalSyllabics
+ inunifiedcanadianaboriginalsyllabics => 'InUnifie',
+
+ # InVai
+ invai => 'InVai',
+
+ # InVariationSelectors
+ invariationselectors => 'InVariat',
+
+ # InVariationSelectorsSupplement
+ invariationselectorssupplement => 'InVaria2',
+
+ # InVerticalForms
+ inverticalforms => 'InVertic',
+
+ # InYijingHexagramSymbols
+ inyijinghexagramsymbols => 'InYijing',
+
+ # InYiRadicals
+ inyiradicals => 'InYiRadi',
+
+ # InYiSyllables
+ inyisyllables => 'InYiSyll',
+
+ # InIpaExtensions
+ ipaextensions => 'InIpaExt',
+
+ # JoinControl
+ joincontrol => 'JoinCont',
+
+ # InKanbun
+ kanbun => 'InKanbun',
+
+ # InKangxiRadicals
+ kangxiradicals => 'InKangxi',
+
+ kannada => 'Knda',
+ katakana => 'Kana',
+
+ # InKatakanaPhoneticExtensions
+ katakanaphoneticextensions => 'InKatak2',
+
+ # KayahLi
+ kayahli => 'KayahLi',
+
+ kharoshthi => 'Khar',
+ khmer => 'Khmr',
+
+ # InKhmerSymbols
+ khmersymbols => 'InKhmerS',
+
+ lao => 'Laoo',
+ latin => 'Latn',
+
+ # InLatin1Supplement
+ latin1supplement => 'InLatin1',
+
+ # InLatinExtendedA
+ latinextendeda => 'InLatin2',
+
+ # InLatinExtendedAdditional
+ latinextendedadditional => 'InLatin5',
+
+ # InLatinExtendedB
+ latinextendedb => 'InLatinE',
+
+ # InLatinExtendedC
+ latinextendedc => 'InLatin4',
+
+ # InLatinExtendedD
+ latinextendedd => 'InLatin3',
+
+ lepcha => 'Lepc',
+ letter => 'L',
+
+ # InLetterlikeSymbols
+ letterlikesymbols => 'InLetter',
+
+ # LetterNumber
+ letternumber => 'Nl',
+
+ limbu => 'Limb',
+
+ # LinearB
+ linearb => 'LinearB',
+
+ # InLinearBIdeograms
+ linearbideograms => 'InLinear',
+
+ # InLinearBSyllabary
+ linearbsyllabary => 'InLinea2',
+
+ # LineSeparator
+ lineseparator => 'Zl',
+
+ # LogicalOrderException
+ logicalorderexception => 'LogicalO',
+
+ lowercase => 'Lowercas',
+
+ # LowercaseLetter
+ lowercaseletter => 'Ll',
+
+ # InLowSurrogates
+ lowsurrogates => 'InLowSur',
+
+ lycian => 'Lyci',
+ lydian => 'Lydi',
+
+ # InMahjongTiles
+ mahjongtiles => 'InMahjon',
+
+ malayalam => 'Mlym',
+ mark => 'M',
+ math => 'Math',
+
+ # InMathematicalAlphanumericSymbols
+ mathematicalalphanumericsymbols => 'InMathe2',
+
+ # InMathematicalOperators
+ mathematicaloperators => 'InMathem',
+
+ # MathSymbol
+ mathsymbol => 'Sm',
+
+ # InMiscellaneousMathematicalSymbolsA
+ miscellaneousmathematicalsymbolsa => 'InMisce4',
+
+ # InMiscellaneousMathematicalSymbolsB
+ miscellaneousmathematicalsymbolsb => 'InMisce5',
+
+ # InMiscellaneousSymbols
+ miscellaneoussymbols => 'InMiscel',
+
+ # InMiscellaneousSymbolsAndArrows
+ miscellaneoussymbolsandarrows => 'InMisce3',
+
+ # InMiscellaneousTechnical
+ miscellaneoustechnical => 'InMisce2',
+
+ # ModifierLetter
+ modifierletter => 'Lm',
+
+ # ModifierSymbol
+ modifiersymbol => 'Sk',
+
+ # InModifierToneLetters
+ modifiertoneletters => 'InModifi',
+
+ mongolian => 'Mong',
+
+ # InMusicalSymbols
+ musicalsymbols => 'InMusica',
+
+ myanmar => 'Mymr',
+
+ # NewTaiLue
+ newtailue => 'NewTaiLu',
+
+ nko => 'Nkoo',
+
+ # NoncharacterCodePoint
+ noncharactercodepoint => 'Nonchara',
+
+ # NonspacingMark
+ nonspacingmark => 'Mn',
+
+ number => 'N',
+
+ # InNumberForms
+ numberforms => 'InNumber',
+
+ ogham => 'Ogam',
+
+ # OlChiki
+ olchiki => 'OlChiki',
+
+ # OldItalic
+ olditalic => 'OldItali',
+
+ # OldPersian
+ oldpersian => 'OldPersi',
+
+ # OpenPunctuation
+ openpunctuation => 'Ps',
+
+ # InOpticalCharacterRecognition
+ opticalcharacterrecognition => 'InOptica',
+
+ oriya => 'Orya',
+ osmanya => 'Osma',
+ other => 'C',
+
+ # OtherAlphabetic
+ otheralphabetic => 'OtherAlp',
+
+ # OtherDefaultIgnorableCodePoint
+ otherdefaultignorablecodepoint => 'OtherDef',
+
+ # OtherGraphemeExtend
+ othergraphemeextend => 'OtherGra',
+
+ # OtherIdContinue
+ otheridcontinue => 'OtherIdC',
+
+ # OtherIdStart
+ otheridstart => 'OtherIdS',
+
+ # OtherLetter
+ otherletter => 'Lo',
+
+ # OtherLowercase
+ otherlowercase => 'OtherLow',
+
+ # OtherMath
+ othermath => 'OtherMat',
+
+ # OtherNumber
+ othernumber => 'No',
+
+ # OtherPunctuation
+ otherpunctuation => 'Po',
+
+ # OtherSymbol
+ othersymbol => 'So',
+
+ # OtherUppercase
+ otheruppercase => 'OtherUpp',
+
+ # ParagraphSeparator
+ paragraphseparator => 'Zp',
+
+ # PatternSyntax
+ patternsyntax => 'PatternS',
+
+ # PatternWhiteSpace
+ patternwhitespace => 'PatternW',
+
+ # PhagsPa
+ phagspa => 'PhagsPa',
+
+ # InPhaistosDisc
+ phaistosdisc => 'InPhaist',
+
+ phoenician => 'Phnx',
+
+ # InPhoneticExtensions
+ phoneticextensions => 'InPhonet',
+
+ # InPhoneticExtensionsSupplement
+ phoneticextensionssupplement => 'InPhone2',
+
+ # PrivateUse
+ privateuse => 'Co',
+
+ # InPrivateUseArea
+ privateusearea => 'InPrivat',
+
+ punctuation => 'P',
+
+ # QuotationMark
+ quotationmark => 'Quotatio',
+
+ radical => 'Radical2',
+ rejang => 'Rjng',
+ runic => 'Runr',
+ saurashtra => 'Saur',
+ separator => 'Z',
+ shavian => 'Shaw',
+ sinhala => 'Sinh',
+
+ # InSmallFormVariants
+ smallformvariants => 'InSmallF',
+
+ # SoftDotted
+ softdotted => 'SoftDott',
+
+ # SpaceSeparator
+ spaceseparator => 'Zs',
+
+ # SpacingMark
+ spacingmark => 'Mc',
+
+ # InSpacingModifierLetters
+ spacingmodifierletters => 'InSpacin',
+
+ # InSpecials
+ specials => 'InSpecia',
+
+ sterm => 'Sterm2',
+ sundanese => 'Sund',
+
+ # InSuperscriptsAndSubscripts
+ superscriptsandsubscripts => 'InSupers',
+
+ # InSupplementalArrowsA
+ supplementalarrowsa => 'InSuppl2',
+
+ # InSupplementalArrowsB
+ supplementalarrowsb => 'InSupple',
+
+ # InSupplementalMathematicalOperators
+ supplementalmathematicaloperators => 'InSuppl6',
+
+ # InSupplementalPunctuation
+ supplementalpunctuation => 'InSuppl3',
+
+ # InSupplementaryPrivateUseAreaA
+ supplementaryprivateuseareaa => 'InSuppl4',
+
+ # InSupplementaryPrivateUseAreaB
+ supplementaryprivateuseareab => 'InSuppl5',
+
+ surrogate => 'Cs',
+
+ # SylotiNagri
+ sylotinagri => 'SylotiNa',
+
+ symbol => 'S',
+ syriac => 'Syrc',
+ tagalog => 'Tglg',
+ tagbanwa => 'Tagb',
+
+ # InTags
+ tags => 'InTags',
+
+ # TaiLe
+ taile => 'TaiLe',
+
+ # InTaiXuanJingSymbols
+ taixuanjingsymbols => 'InTaiXua',
+
+ tamil => 'Taml',
+ telugu => 'Telu',
+
+ # TerminalPunctuation
+ terminalpunctuation => 'Terminal',
+
+ thaana => 'Thaa',
+ thai => 'Thai',
+ tibetan => 'Tibt',
+ tifinagh => 'Tfng',
+
+ # TitlecaseLetter
+ titlecaseletter => 'Lt',
+
+ ugaritic => 'Ugar',
+ unassigned => 'Cn',
+
+ # InUnifiedCanadianAboriginalSyllabics
+ unifiedcanadianaboriginalsyllabics => 'InUnifie',
+
+ # UnifiedIdeograph
+ unifiedideograph => 'UnifiedI',
+
+ uppercase => 'Uppercas',
+
+ # UppercaseLetter
+ uppercaseletter => 'Lu',
+
+ vai => 'Vaii',
+
+ # VariationSelector
+ variationselector => 'Variatio',
+
+ # InVariationSelectors
+ variationselectors => 'InVariat',
+
+ # InVariationSelectorsSupplement
+ variationselectorssupplement => 'InVaria2',
+
+ # InVerticalForms
+ verticalforms => 'InVertic',
+
+ # WhiteSpace
+ whitespace => 'WhiteSpa',
+
+ yi => 'Yiii',
+
+ # InYijingHexagramSymbols
+ yijinghexagramsymbols => 'InYijing',
+
+ # InYiRadicals
+ yiradicals => 'InYiRadi',
+
+ # InYiSyllables
+ yisyllables => 'InYiSyll',
+
+);
+1
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/CaseFolding.txt b/Master/tlpkg/tlperl.straw/lib/unicore/CaseFolding.txt
new file mode 100755
index 00000000000..9d28037776b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/CaseFolding.txt
@@ -0,0 +1,1196 @@
+# CaseFolding-5.1.0.txt
+# Date: 2008-03-03, 21:57:14 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# Case Folding Properties
+#
+# This file is a supplement to the UnicodeData file.
+# It provides a case folding mapping generated from the Unicode Character Database.
+# If all characters are mapped according to the full mapping below, then
+# case differences (according to UnicodeData.txt and SpecialCasing.txt)
+# are eliminated.
+#
+# The data supports both implementations that require simple case foldings
+# (where string lengths don't change), and implementations that allow full case folding
+# (where string lengths may grow). Note that where they can be supported, the
+# full case foldings are superior: for example, they allow "MASSE" and "Maße" to match.
+#
+# All code points not listed in this file map to themselves.
+#
+# NOTE: case folding does not preserve normalization formats!
+#
+# For information on case folding, including how to have case folding
+# preserve normalization formats, see Section 3.13 Default Case Algorithms in
+# The Unicode Standard, Version 5.0.
+#
+# ================================================================================
+# Format
+# ================================================================================
+# The entries in this file are in the following machine-readable format:
+#
+# <code>; <status>; <mapping>; # <name>
+#
+# The status field is:
+# C: common case folding, common mappings shared by both simple and full mappings.
+# F: full case folding, mappings that cause strings to grow in length. Multiple characters are separated by spaces.
+# S: simple case folding, mappings to single characters where different from F.
+# T: special case for uppercase I and dotted uppercase I
+# - For non-Turkic languages, this mapping is normally not used.
+# - For Turkic languages (tr, az), this mapping can be used instead of the normal mapping for these characters.
+# Note that the Turkic mappings do not maintain canonical equivalence without additional processing.
+# See the discussions of case mapping in the Unicode Standard for more information.
+#
+# Usage:
+# A. To do a simple case folding, use the mappings with status C + S.
+# B. To do a full case folding, use the mappings with status C + F.
+#
+# The mappings with status T can be used or omitted depending on the desired case-folding
+# behavior. (The default option is to exclude them.)
+#
+# =================================================================
+# @missing 0000..10FFFF; <codepoint>
+0041; C; 0061; # LATIN CAPITAL LETTER A
+0042; C; 0062; # LATIN CAPITAL LETTER B
+0043; C; 0063; # LATIN CAPITAL LETTER C
+0044; C; 0064; # LATIN CAPITAL LETTER D
+0045; C; 0065; # LATIN CAPITAL LETTER E
+0046; C; 0066; # LATIN CAPITAL LETTER F
+0047; C; 0067; # LATIN CAPITAL LETTER G
+0048; C; 0068; # LATIN CAPITAL LETTER H
+0049; C; 0069; # LATIN CAPITAL LETTER I
+0049; T; 0131; # LATIN CAPITAL LETTER I
+004A; C; 006A; # LATIN CAPITAL LETTER J
+004B; C; 006B; # LATIN CAPITAL LETTER K
+004C; C; 006C; # LATIN CAPITAL LETTER L
+004D; C; 006D; # LATIN CAPITAL LETTER M
+004E; C; 006E; # LATIN CAPITAL LETTER N
+004F; C; 006F; # LATIN CAPITAL LETTER O
+0050; C; 0070; # LATIN CAPITAL LETTER P
+0051; C; 0071; # LATIN CAPITAL LETTER Q
+0052; C; 0072; # LATIN CAPITAL LETTER R
+0053; C; 0073; # LATIN CAPITAL LETTER S
+0054; C; 0074; # LATIN CAPITAL LETTER T
+0055; C; 0075; # LATIN CAPITAL LETTER U
+0056; C; 0076; # LATIN CAPITAL LETTER V
+0057; C; 0077; # LATIN CAPITAL LETTER W
+0058; C; 0078; # LATIN CAPITAL LETTER X
+0059; C; 0079; # LATIN CAPITAL LETTER Y
+005A; C; 007A; # LATIN CAPITAL LETTER Z
+00B5; C; 03BC; # MICRO SIGN
+00C0; C; 00E0; # LATIN CAPITAL LETTER A WITH GRAVE
+00C1; C; 00E1; # LATIN CAPITAL LETTER A WITH ACUTE
+00C2; C; 00E2; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00C3; C; 00E3; # LATIN CAPITAL LETTER A WITH TILDE
+00C4; C; 00E4; # LATIN CAPITAL LETTER A WITH DIAERESIS
+00C5; C; 00E5; # LATIN CAPITAL LETTER A WITH RING ABOVE
+00C6; C; 00E6; # LATIN CAPITAL LETTER AE
+00C7; C; 00E7; # LATIN CAPITAL LETTER C WITH CEDILLA
+00C8; C; 00E8; # LATIN CAPITAL LETTER E WITH GRAVE
+00C9; C; 00E9; # LATIN CAPITAL LETTER E WITH ACUTE
+00CA; C; 00EA; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00CB; C; 00EB; # LATIN CAPITAL LETTER E WITH DIAERESIS
+00CC; C; 00EC; # LATIN CAPITAL LETTER I WITH GRAVE
+00CD; C; 00ED; # LATIN CAPITAL LETTER I WITH ACUTE
+00CE; C; 00EE; # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00CF; C; 00EF; # LATIN CAPITAL LETTER I WITH DIAERESIS
+00D0; C; 00F0; # LATIN CAPITAL LETTER ETH
+00D1; C; 00F1; # LATIN CAPITAL LETTER N WITH TILDE
+00D2; C; 00F2; # LATIN CAPITAL LETTER O WITH GRAVE
+00D3; C; 00F3; # LATIN CAPITAL LETTER O WITH ACUTE
+00D4; C; 00F4; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00D5; C; 00F5; # LATIN CAPITAL LETTER O WITH TILDE
+00D6; C; 00F6; # LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8; C; 00F8; # LATIN CAPITAL LETTER O WITH STROKE
+00D9; C; 00F9; # LATIN CAPITAL LETTER U WITH GRAVE
+00DA; C; 00FA; # LATIN CAPITAL LETTER U WITH ACUTE
+00DB; C; 00FB; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00DC; C; 00FC; # LATIN CAPITAL LETTER U WITH DIAERESIS
+00DD; C; 00FD; # LATIN CAPITAL LETTER Y WITH ACUTE
+00DE; C; 00FE; # LATIN CAPITAL LETTER THORN
+00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S
+0100; C; 0101; # LATIN CAPITAL LETTER A WITH MACRON
+0102; C; 0103; # LATIN CAPITAL LETTER A WITH BREVE
+0104; C; 0105; # LATIN CAPITAL LETTER A WITH OGONEK
+0106; C; 0107; # LATIN CAPITAL LETTER C WITH ACUTE
+0108; C; 0109; # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+010A; C; 010B; # LATIN CAPITAL LETTER C WITH DOT ABOVE
+010C; C; 010D; # LATIN CAPITAL LETTER C WITH CARON
+010E; C; 010F; # LATIN CAPITAL LETTER D WITH CARON
+0110; C; 0111; # LATIN CAPITAL LETTER D WITH STROKE
+0112; C; 0113; # LATIN CAPITAL LETTER E WITH MACRON
+0114; C; 0115; # LATIN CAPITAL LETTER E WITH BREVE
+0116; C; 0117; # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0118; C; 0119; # LATIN CAPITAL LETTER E WITH OGONEK
+011A; C; 011B; # LATIN CAPITAL LETTER E WITH CARON
+011C; C; 011D; # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011E; C; 011F; # LATIN CAPITAL LETTER G WITH BREVE
+0120; C; 0121; # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0122; C; 0123; # LATIN CAPITAL LETTER G WITH CEDILLA
+0124; C; 0125; # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0126; C; 0127; # LATIN CAPITAL LETTER H WITH STROKE
+0128; C; 0129; # LATIN CAPITAL LETTER I WITH TILDE
+012A; C; 012B; # LATIN CAPITAL LETTER I WITH MACRON
+012C; C; 012D; # LATIN CAPITAL LETTER I WITH BREVE
+012E; C; 012F; # LATIN CAPITAL LETTER I WITH OGONEK
+0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0132; C; 0133; # LATIN CAPITAL LIGATURE IJ
+0134; C; 0135; # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0136; C; 0137; # LATIN CAPITAL LETTER K WITH CEDILLA
+0139; C; 013A; # LATIN CAPITAL LETTER L WITH ACUTE
+013B; C; 013C; # LATIN CAPITAL LETTER L WITH CEDILLA
+013D; C; 013E; # LATIN CAPITAL LETTER L WITH CARON
+013F; C; 0140; # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0141; C; 0142; # LATIN CAPITAL LETTER L WITH STROKE
+0143; C; 0144; # LATIN CAPITAL LETTER N WITH ACUTE
+0145; C; 0146; # LATIN CAPITAL LETTER N WITH CEDILLA
+0147; C; 0148; # LATIN CAPITAL LETTER N WITH CARON
+0149; F; 02BC 006E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014A; C; 014B; # LATIN CAPITAL LETTER ENG
+014C; C; 014D; # LATIN CAPITAL LETTER O WITH MACRON
+014E; C; 014F; # LATIN CAPITAL LETTER O WITH BREVE
+0150; C; 0151; # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0152; C; 0153; # LATIN CAPITAL LIGATURE OE
+0154; C; 0155; # LATIN CAPITAL LETTER R WITH ACUTE
+0156; C; 0157; # LATIN CAPITAL LETTER R WITH CEDILLA
+0158; C; 0159; # LATIN CAPITAL LETTER R WITH CARON
+015A; C; 015B; # LATIN CAPITAL LETTER S WITH ACUTE
+015C; C; 015D; # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015E; C; 015F; # LATIN CAPITAL LETTER S WITH CEDILLA
+0160; C; 0161; # LATIN CAPITAL LETTER S WITH CARON
+0162; C; 0163; # LATIN CAPITAL LETTER T WITH CEDILLA
+0164; C; 0165; # LATIN CAPITAL LETTER T WITH CARON
+0166; C; 0167; # LATIN CAPITAL LETTER T WITH STROKE
+0168; C; 0169; # LATIN CAPITAL LETTER U WITH TILDE
+016A; C; 016B; # LATIN CAPITAL LETTER U WITH MACRON
+016C; C; 016D; # LATIN CAPITAL LETTER U WITH BREVE
+016E; C; 016F; # LATIN CAPITAL LETTER U WITH RING ABOVE
+0170; C; 0171; # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0172; C; 0173; # LATIN CAPITAL LETTER U WITH OGONEK
+0174; C; 0175; # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0176; C; 0177; # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0178; C; 00FF; # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179; C; 017A; # LATIN CAPITAL LETTER Z WITH ACUTE
+017B; C; 017C; # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017D; C; 017E; # LATIN CAPITAL LETTER Z WITH CARON
+017F; C; 0073; # LATIN SMALL LETTER LONG S
+0181; C; 0253; # LATIN CAPITAL LETTER B WITH HOOK
+0182; C; 0183; # LATIN CAPITAL LETTER B WITH TOPBAR
+0184; C; 0185; # LATIN CAPITAL LETTER TONE SIX
+0186; C; 0254; # LATIN CAPITAL LETTER OPEN O
+0187; C; 0188; # LATIN CAPITAL LETTER C WITH HOOK
+0189; C; 0256; # LATIN CAPITAL LETTER AFRICAN D
+018A; C; 0257; # LATIN CAPITAL LETTER D WITH HOOK
+018B; C; 018C; # LATIN CAPITAL LETTER D WITH TOPBAR
+018E; C; 01DD; # LATIN CAPITAL LETTER REVERSED E
+018F; C; 0259; # LATIN CAPITAL LETTER SCHWA
+0190; C; 025B; # LATIN CAPITAL LETTER OPEN E
+0191; C; 0192; # LATIN CAPITAL LETTER F WITH HOOK
+0193; C; 0260; # LATIN CAPITAL LETTER G WITH HOOK
+0194; C; 0263; # LATIN CAPITAL LETTER GAMMA
+0196; C; 0269; # LATIN CAPITAL LETTER IOTA
+0197; C; 0268; # LATIN CAPITAL LETTER I WITH STROKE
+0198; C; 0199; # LATIN CAPITAL LETTER K WITH HOOK
+019C; C; 026F; # LATIN CAPITAL LETTER TURNED M
+019D; C; 0272; # LATIN CAPITAL LETTER N WITH LEFT HOOK
+019F; C; 0275; # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01A0; C; 01A1; # LATIN CAPITAL LETTER O WITH HORN
+01A2; C; 01A3; # LATIN CAPITAL LETTER OI
+01A4; C; 01A5; # LATIN CAPITAL LETTER P WITH HOOK
+01A6; C; 0280; # LATIN LETTER YR
+01A7; C; 01A8; # LATIN CAPITAL LETTER TONE TWO
+01A9; C; 0283; # LATIN CAPITAL LETTER ESH
+01AC; C; 01AD; # LATIN CAPITAL LETTER T WITH HOOK
+01AE; C; 0288; # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01AF; C; 01B0; # LATIN CAPITAL LETTER U WITH HORN
+01B1; C; 028A; # LATIN CAPITAL LETTER UPSILON
+01B2; C; 028B; # LATIN CAPITAL LETTER V WITH HOOK
+01B3; C; 01B4; # LATIN CAPITAL LETTER Y WITH HOOK
+01B5; C; 01B6; # LATIN CAPITAL LETTER Z WITH STROKE
+01B7; C; 0292; # LATIN CAPITAL LETTER EZH
+01B8; C; 01B9; # LATIN CAPITAL LETTER EZH REVERSED
+01BC; C; 01BD; # LATIN CAPITAL LETTER TONE FIVE
+01C4; C; 01C6; # LATIN CAPITAL LETTER DZ WITH CARON
+01C5; C; 01C6; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C7; C; 01C9; # LATIN CAPITAL LETTER LJ
+01C8; C; 01C9; # LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01CA; C; 01CC; # LATIN CAPITAL LETTER NJ
+01CB; C; 01CC; # LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CD; C; 01CE; # LATIN CAPITAL LETTER A WITH CARON
+01CF; C; 01D0; # LATIN CAPITAL LETTER I WITH CARON
+01D1; C; 01D2; # LATIN CAPITAL LETTER O WITH CARON
+01D3; C; 01D4; # LATIN CAPITAL LETTER U WITH CARON
+01D5; C; 01D6; # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D7; C; 01D8; # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D9; C; 01DA; # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DB; C; 01DC; # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DE; C; 01DF; # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01E0; C; 01E1; # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E2; C; 01E3; # LATIN CAPITAL LETTER AE WITH MACRON
+01E4; C; 01E5; # LATIN CAPITAL LETTER G WITH STROKE
+01E6; C; 01E7; # LATIN CAPITAL LETTER G WITH CARON
+01E8; C; 01E9; # LATIN CAPITAL LETTER K WITH CARON
+01EA; C; 01EB; # LATIN CAPITAL LETTER O WITH OGONEK
+01EC; C; 01ED; # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01EE; C; 01EF; # LATIN CAPITAL LETTER EZH WITH CARON
+01F0; F; 006A 030C; # LATIN SMALL LETTER J WITH CARON
+01F1; C; 01F3; # LATIN CAPITAL LETTER DZ
+01F2; C; 01F3; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F4; C; 01F5; # LATIN CAPITAL LETTER G WITH ACUTE
+01F6; C; 0195; # LATIN CAPITAL LETTER HWAIR
+01F7; C; 01BF; # LATIN CAPITAL LETTER WYNN
+01F8; C; 01F9; # LATIN CAPITAL LETTER N WITH GRAVE
+01FA; C; 01FB; # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FC; C; 01FD; # LATIN CAPITAL LETTER AE WITH ACUTE
+01FE; C; 01FF; # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+0200; C; 0201; # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0202; C; 0203; # LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0204; C; 0205; # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0206; C; 0207; # LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0208; C; 0209; # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+020A; C; 020B; # LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020C; C; 020D; # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020E; C; 020F; # LATIN CAPITAL LETTER O WITH INVERTED BREVE
+0210; C; 0211; # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0212; C; 0213; # LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0214; C; 0215; # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0216; C; 0217; # LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0218; C; 0219; # LATIN CAPITAL LETTER S WITH COMMA BELOW
+021A; C; 021B; # LATIN CAPITAL LETTER T WITH COMMA BELOW
+021C; C; 021D; # LATIN CAPITAL LETTER YOGH
+021E; C; 021F; # LATIN CAPITAL LETTER H WITH CARON
+0220; C; 019E; # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0222; C; 0223; # LATIN CAPITAL LETTER OU
+0224; C; 0225; # LATIN CAPITAL LETTER Z WITH HOOK
+0226; C; 0227; # LATIN CAPITAL LETTER A WITH DOT ABOVE
+0228; C; 0229; # LATIN CAPITAL LETTER E WITH CEDILLA
+022A; C; 022B; # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022C; C; 022D; # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022E; C; 022F; # LATIN CAPITAL LETTER O WITH DOT ABOVE
+0230; C; 0231; # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0232; C; 0233; # LATIN CAPITAL LETTER Y WITH MACRON
+023A; C; 2C65; # LATIN CAPITAL LETTER A WITH STROKE
+023B; C; 023C; # LATIN CAPITAL LETTER C WITH STROKE
+023D; C; 019A; # LATIN CAPITAL LETTER L WITH BAR
+023E; C; 2C66; # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+0241; C; 0242; # LATIN CAPITAL LETTER GLOTTAL STOP
+0243; C; 0180; # LATIN CAPITAL LETTER B WITH STROKE
+0244; C; 0289; # LATIN CAPITAL LETTER U BAR
+0245; C; 028C; # LATIN CAPITAL LETTER TURNED V
+0246; C; 0247; # LATIN CAPITAL LETTER E WITH STROKE
+0248; C; 0249; # LATIN CAPITAL LETTER J WITH STROKE
+024A; C; 024B; # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+024C; C; 024D; # LATIN CAPITAL LETTER R WITH STROKE
+024E; C; 024F; # LATIN CAPITAL LETTER Y WITH STROKE
+0345; C; 03B9; # COMBINING GREEK YPOGEGRAMMENI
+0370; C; 0371; # GREEK CAPITAL LETTER HETA
+0372; C; 0373; # GREEK CAPITAL LETTER ARCHAIC SAMPI
+0376; C; 0377; # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+0386; C; 03AC; # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388; C; 03AD; # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389; C; 03AE; # GREEK CAPITAL LETTER ETA WITH TONOS
+038A; C; 03AF; # GREEK CAPITAL LETTER IOTA WITH TONOS
+038C; C; 03CC; # GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E; C; 03CD; # GREEK CAPITAL LETTER UPSILON WITH TONOS
+038F; C; 03CE; # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391; C; 03B1; # GREEK CAPITAL LETTER ALPHA
+0392; C; 03B2; # GREEK CAPITAL LETTER BETA
+0393; C; 03B3; # GREEK CAPITAL LETTER GAMMA
+0394; C; 03B4; # GREEK CAPITAL LETTER DELTA
+0395; C; 03B5; # GREEK CAPITAL LETTER EPSILON
+0396; C; 03B6; # GREEK CAPITAL LETTER ZETA
+0397; C; 03B7; # GREEK CAPITAL LETTER ETA
+0398; C; 03B8; # GREEK CAPITAL LETTER THETA
+0399; C; 03B9; # GREEK CAPITAL LETTER IOTA
+039A; C; 03BA; # GREEK CAPITAL LETTER KAPPA
+039B; C; 03BB; # GREEK CAPITAL LETTER LAMDA
+039C; C; 03BC; # GREEK CAPITAL LETTER MU
+039D; C; 03BD; # GREEK CAPITAL LETTER NU
+039E; C; 03BE; # GREEK CAPITAL LETTER XI
+039F; C; 03BF; # GREEK CAPITAL LETTER OMICRON
+03A0; C; 03C0; # GREEK CAPITAL LETTER PI
+03A1; C; 03C1; # GREEK CAPITAL LETTER RHO
+03A3; C; 03C3; # GREEK CAPITAL LETTER SIGMA
+03A4; C; 03C4; # GREEK CAPITAL LETTER TAU
+03A5; C; 03C5; # GREEK CAPITAL LETTER UPSILON
+03A6; C; 03C6; # GREEK CAPITAL LETTER PHI
+03A7; C; 03C7; # GREEK CAPITAL LETTER CHI
+03A8; C; 03C8; # GREEK CAPITAL LETTER PSI
+03A9; C; 03C9; # GREEK CAPITAL LETTER OMEGA
+03AA; C; 03CA; # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03AB; C; 03CB; # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03B0; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03C2; C; 03C3; # GREEK SMALL LETTER FINAL SIGMA
+03CF; C; 03D7; # GREEK CAPITAL KAI SYMBOL
+03D0; C; 03B2; # GREEK BETA SYMBOL
+03D1; C; 03B8; # GREEK THETA SYMBOL
+03D5; C; 03C6; # GREEK PHI SYMBOL
+03D6; C; 03C0; # GREEK PI SYMBOL
+03D8; C; 03D9; # GREEK LETTER ARCHAIC KOPPA
+03DA; C; 03DB; # GREEK LETTER STIGMA
+03DC; C; 03DD; # GREEK LETTER DIGAMMA
+03DE; C; 03DF; # GREEK LETTER KOPPA
+03E0; C; 03E1; # GREEK LETTER SAMPI
+03E2; C; 03E3; # COPTIC CAPITAL LETTER SHEI
+03E4; C; 03E5; # COPTIC CAPITAL LETTER FEI
+03E6; C; 03E7; # COPTIC CAPITAL LETTER KHEI
+03E8; C; 03E9; # COPTIC CAPITAL LETTER HORI
+03EA; C; 03EB; # COPTIC CAPITAL LETTER GANGIA
+03EC; C; 03ED; # COPTIC CAPITAL LETTER SHIMA
+03EE; C; 03EF; # COPTIC CAPITAL LETTER DEI
+03F0; C; 03BA; # GREEK KAPPA SYMBOL
+03F1; C; 03C1; # GREEK RHO SYMBOL
+03F4; C; 03B8; # GREEK CAPITAL THETA SYMBOL
+03F5; C; 03B5; # GREEK LUNATE EPSILON SYMBOL
+03F7; C; 03F8; # GREEK CAPITAL LETTER SHO
+03F9; C; 03F2; # GREEK CAPITAL LUNATE SIGMA SYMBOL
+03FA; C; 03FB; # GREEK CAPITAL LETTER SAN
+03FD; C; 037B; # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+03FE; C; 037C; # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+03FF; C; 037D; # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0400; C; 0450; # CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401; C; 0451; # CYRILLIC CAPITAL LETTER IO
+0402; C; 0452; # CYRILLIC CAPITAL LETTER DJE
+0403; C; 0453; # CYRILLIC CAPITAL LETTER GJE
+0404; C; 0454; # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405; C; 0455; # CYRILLIC CAPITAL LETTER DZE
+0406; C; 0456; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407; C; 0457; # CYRILLIC CAPITAL LETTER YI
+0408; C; 0458; # CYRILLIC CAPITAL LETTER JE
+0409; C; 0459; # CYRILLIC CAPITAL LETTER LJE
+040A; C; 045A; # CYRILLIC CAPITAL LETTER NJE
+040B; C; 045B; # CYRILLIC CAPITAL LETTER TSHE
+040C; C; 045C; # CYRILLIC CAPITAL LETTER KJE
+040D; C; 045D; # CYRILLIC CAPITAL LETTER I WITH GRAVE
+040E; C; 045E; # CYRILLIC CAPITAL LETTER SHORT U
+040F; C; 045F; # CYRILLIC CAPITAL LETTER DZHE
+0410; C; 0430; # CYRILLIC CAPITAL LETTER A
+0411; C; 0431; # CYRILLIC CAPITAL LETTER BE
+0412; C; 0432; # CYRILLIC CAPITAL LETTER VE
+0413; C; 0433; # CYRILLIC CAPITAL LETTER GHE
+0414; C; 0434; # CYRILLIC CAPITAL LETTER DE
+0415; C; 0435; # CYRILLIC CAPITAL LETTER IE
+0416; C; 0436; # CYRILLIC CAPITAL LETTER ZHE
+0417; C; 0437; # CYRILLIC CAPITAL LETTER ZE
+0418; C; 0438; # CYRILLIC CAPITAL LETTER I
+0419; C; 0439; # CYRILLIC CAPITAL LETTER SHORT I
+041A; C; 043A; # CYRILLIC CAPITAL LETTER KA
+041B; C; 043B; # CYRILLIC CAPITAL LETTER EL
+041C; C; 043C; # CYRILLIC CAPITAL LETTER EM
+041D; C; 043D; # CYRILLIC CAPITAL LETTER EN
+041E; C; 043E; # CYRILLIC CAPITAL LETTER O
+041F; C; 043F; # CYRILLIC CAPITAL LETTER PE
+0420; C; 0440; # CYRILLIC CAPITAL LETTER ER
+0421; C; 0441; # CYRILLIC CAPITAL LETTER ES
+0422; C; 0442; # CYRILLIC CAPITAL LETTER TE
+0423; C; 0443; # CYRILLIC CAPITAL LETTER U
+0424; C; 0444; # CYRILLIC CAPITAL LETTER EF
+0425; C; 0445; # CYRILLIC CAPITAL LETTER HA
+0426; C; 0446; # CYRILLIC CAPITAL LETTER TSE
+0427; C; 0447; # CYRILLIC CAPITAL LETTER CHE
+0428; C; 0448; # CYRILLIC CAPITAL LETTER SHA
+0429; C; 0449; # CYRILLIC CAPITAL LETTER SHCHA
+042A; C; 044A; # CYRILLIC CAPITAL LETTER HARD SIGN
+042B; C; 044B; # CYRILLIC CAPITAL LETTER YERU
+042C; C; 044C; # CYRILLIC CAPITAL LETTER SOFT SIGN
+042D; C; 044D; # CYRILLIC CAPITAL LETTER E
+042E; C; 044E; # CYRILLIC CAPITAL LETTER YU
+042F; C; 044F; # CYRILLIC CAPITAL LETTER YA
+0460; C; 0461; # CYRILLIC CAPITAL LETTER OMEGA
+0462; C; 0463; # CYRILLIC CAPITAL LETTER YAT
+0464; C; 0465; # CYRILLIC CAPITAL LETTER IOTIFIED E
+0466; C; 0467; # CYRILLIC CAPITAL LETTER LITTLE YUS
+0468; C; 0469; # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+046A; C; 046B; # CYRILLIC CAPITAL LETTER BIG YUS
+046C; C; 046D; # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046E; C; 046F; # CYRILLIC CAPITAL LETTER KSI
+0470; C; 0471; # CYRILLIC CAPITAL LETTER PSI
+0472; C; 0473; # CYRILLIC CAPITAL LETTER FITA
+0474; C; 0475; # CYRILLIC CAPITAL LETTER IZHITSA
+0476; C; 0477; # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478; C; 0479; # CYRILLIC CAPITAL LETTER UK
+047A; C; 047B; # CYRILLIC CAPITAL LETTER ROUND OMEGA
+047C; C; 047D; # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047E; C; 047F; # CYRILLIC CAPITAL LETTER OT
+0480; C; 0481; # CYRILLIC CAPITAL LETTER KOPPA
+048A; C; 048B; # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048C; C; 048D; # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048E; C; 048F; # CYRILLIC CAPITAL LETTER ER WITH TICK
+0490; C; 0491; # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0492; C; 0493; # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0494; C; 0495; # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0496; C; 0497; # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0498; C; 0499; # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+049A; C; 049B; # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049C; C; 049D; # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049E; C; 049F; # CYRILLIC CAPITAL LETTER KA WITH STROKE
+04A0; C; 04A1; # CYRILLIC CAPITAL LETTER BASHKIR KA
+04A2; C; 04A3; # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A4; C; 04A5; # CYRILLIC CAPITAL LIGATURE EN GHE
+04A6; C; 04A7; # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A8; C; 04A9; # CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04AA; C; 04AB; # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AC; C; 04AD; # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AE; C; 04AF; # CYRILLIC CAPITAL LETTER STRAIGHT U
+04B0; C; 04B1; # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B2; C; 04B3; # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B4; C; 04B5; # CYRILLIC CAPITAL LIGATURE TE TSE
+04B6; C; 04B7; # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B8; C; 04B9; # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04BA; C; 04BB; # CYRILLIC CAPITAL LETTER SHHA
+04BC; C; 04BD; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BE; C; 04BF; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0; C; 04CF; # CYRILLIC LETTER PALOCHKA
+04C1; C; 04C2; # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C3; C; 04C4; # CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C5; C; 04C6; # CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C7; C; 04C8; # CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C9; C; 04CA; # CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CB; C; 04CC; # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CD; C; 04CE; # CYRILLIC CAPITAL LETTER EM WITH TAIL
+04D0; C; 04D1; # CYRILLIC CAPITAL LETTER A WITH BREVE
+04D2; C; 04D3; # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D4; C; 04D5; # CYRILLIC CAPITAL LIGATURE A IE
+04D6; C; 04D7; # CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D8; C; 04D9; # CYRILLIC CAPITAL LETTER SCHWA
+04DA; C; 04DB; # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DC; C; 04DD; # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DE; C; 04DF; # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04E0; C; 04E1; # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E2; C; 04E3; # CYRILLIC CAPITAL LETTER I WITH MACRON
+04E4; C; 04E5; # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E6; C; 04E7; # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E8; C; 04E9; # CYRILLIC CAPITAL LETTER BARRED O
+04EA; C; 04EB; # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EC; C; 04ED; # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04EE; C; 04EF; # CYRILLIC CAPITAL LETTER U WITH MACRON
+04F0; C; 04F1; # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F2; C; 04F3; # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F4; C; 04F5; # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F6; C; 04F7; # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F8; C; 04F9; # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04FA; C; 04FB; # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+04FC; C; 04FD; # CYRILLIC CAPITAL LETTER HA WITH HOOK
+04FE; C; 04FF; # CYRILLIC CAPITAL LETTER HA WITH STROKE
+0500; C; 0501; # CYRILLIC CAPITAL LETTER KOMI DE
+0502; C; 0503; # CYRILLIC CAPITAL LETTER KOMI DJE
+0504; C; 0505; # CYRILLIC CAPITAL LETTER KOMI ZJE
+0506; C; 0507; # CYRILLIC CAPITAL LETTER KOMI DZJE
+0508; C; 0509; # CYRILLIC CAPITAL LETTER KOMI LJE
+050A; C; 050B; # CYRILLIC CAPITAL LETTER KOMI NJE
+050C; C; 050D; # CYRILLIC CAPITAL LETTER KOMI SJE
+050E; C; 050F; # CYRILLIC CAPITAL LETTER KOMI TJE
+0510; C; 0511; # CYRILLIC CAPITAL LETTER REVERSED ZE
+0512; C; 0513; # CYRILLIC CAPITAL LETTER EL WITH HOOK
+0514; C; 0515; # CYRILLIC CAPITAL LETTER LHA
+0516; C; 0517; # CYRILLIC CAPITAL LETTER RHA
+0518; C; 0519; # CYRILLIC CAPITAL LETTER YAE
+051A; C; 051B; # CYRILLIC CAPITAL LETTER QA
+051C; C; 051D; # CYRILLIC CAPITAL LETTER WE
+051E; C; 051F; # CYRILLIC CAPITAL LETTER ALEUT KA
+0520; C; 0521; # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+0522; C; 0523; # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+0531; C; 0561; # ARMENIAN CAPITAL LETTER AYB
+0532; C; 0562; # ARMENIAN CAPITAL LETTER BEN
+0533; C; 0563; # ARMENIAN CAPITAL LETTER GIM
+0534; C; 0564; # ARMENIAN CAPITAL LETTER DA
+0535; C; 0565; # ARMENIAN CAPITAL LETTER ECH
+0536; C; 0566; # ARMENIAN CAPITAL LETTER ZA
+0537; C; 0567; # ARMENIAN CAPITAL LETTER EH
+0538; C; 0568; # ARMENIAN CAPITAL LETTER ET
+0539; C; 0569; # ARMENIAN CAPITAL LETTER TO
+053A; C; 056A; # ARMENIAN CAPITAL LETTER ZHE
+053B; C; 056B; # ARMENIAN CAPITAL LETTER INI
+053C; C; 056C; # ARMENIAN CAPITAL LETTER LIWN
+053D; C; 056D; # ARMENIAN CAPITAL LETTER XEH
+053E; C; 056E; # ARMENIAN CAPITAL LETTER CA
+053F; C; 056F; # ARMENIAN CAPITAL LETTER KEN
+0540; C; 0570; # ARMENIAN CAPITAL LETTER HO
+0541; C; 0571; # ARMENIAN CAPITAL LETTER JA
+0542; C; 0572; # ARMENIAN CAPITAL LETTER GHAD
+0543; C; 0573; # ARMENIAN CAPITAL LETTER CHEH
+0544; C; 0574; # ARMENIAN CAPITAL LETTER MEN
+0545; C; 0575; # ARMENIAN CAPITAL LETTER YI
+0546; C; 0576; # ARMENIAN CAPITAL LETTER NOW
+0547; C; 0577; # ARMENIAN CAPITAL LETTER SHA
+0548; C; 0578; # ARMENIAN CAPITAL LETTER VO
+0549; C; 0579; # ARMENIAN CAPITAL LETTER CHA
+054A; C; 057A; # ARMENIAN CAPITAL LETTER PEH
+054B; C; 057B; # ARMENIAN CAPITAL LETTER JHEH
+054C; C; 057C; # ARMENIAN CAPITAL LETTER RA
+054D; C; 057D; # ARMENIAN CAPITAL LETTER SEH
+054E; C; 057E; # ARMENIAN CAPITAL LETTER VEW
+054F; C; 057F; # ARMENIAN CAPITAL LETTER TIWN
+0550; C; 0580; # ARMENIAN CAPITAL LETTER REH
+0551; C; 0581; # ARMENIAN CAPITAL LETTER CO
+0552; C; 0582; # ARMENIAN CAPITAL LETTER YIWN
+0553; C; 0583; # ARMENIAN CAPITAL LETTER PIWR
+0554; C; 0584; # ARMENIAN CAPITAL LETTER KEH
+0555; C; 0585; # ARMENIAN CAPITAL LETTER OH
+0556; C; 0586; # ARMENIAN CAPITAL LETTER FEH
+0587; F; 0565 0582; # ARMENIAN SMALL LIGATURE ECH YIWN
+10A0; C; 2D00; # GEORGIAN CAPITAL LETTER AN
+10A1; C; 2D01; # GEORGIAN CAPITAL LETTER BAN
+10A2; C; 2D02; # GEORGIAN CAPITAL LETTER GAN
+10A3; C; 2D03; # GEORGIAN CAPITAL LETTER DON
+10A4; C; 2D04; # GEORGIAN CAPITAL LETTER EN
+10A5; C; 2D05; # GEORGIAN CAPITAL LETTER VIN
+10A6; C; 2D06; # GEORGIAN CAPITAL LETTER ZEN
+10A7; C; 2D07; # GEORGIAN CAPITAL LETTER TAN
+10A8; C; 2D08; # GEORGIAN CAPITAL LETTER IN
+10A9; C; 2D09; # GEORGIAN CAPITAL LETTER KAN
+10AA; C; 2D0A; # GEORGIAN CAPITAL LETTER LAS
+10AB; C; 2D0B; # GEORGIAN CAPITAL LETTER MAN
+10AC; C; 2D0C; # GEORGIAN CAPITAL LETTER NAR
+10AD; C; 2D0D; # GEORGIAN CAPITAL LETTER ON
+10AE; C; 2D0E; # GEORGIAN CAPITAL LETTER PAR
+10AF; C; 2D0F; # GEORGIAN CAPITAL LETTER ZHAR
+10B0; C; 2D10; # GEORGIAN CAPITAL LETTER RAE
+10B1; C; 2D11; # GEORGIAN CAPITAL LETTER SAN
+10B2; C; 2D12; # GEORGIAN CAPITAL LETTER TAR
+10B3; C; 2D13; # GEORGIAN CAPITAL LETTER UN
+10B4; C; 2D14; # GEORGIAN CAPITAL LETTER PHAR
+10B5; C; 2D15; # GEORGIAN CAPITAL LETTER KHAR
+10B6; C; 2D16; # GEORGIAN CAPITAL LETTER GHAN
+10B7; C; 2D17; # GEORGIAN CAPITAL LETTER QAR
+10B8; C; 2D18; # GEORGIAN CAPITAL LETTER SHIN
+10B9; C; 2D19; # GEORGIAN CAPITAL LETTER CHIN
+10BA; C; 2D1A; # GEORGIAN CAPITAL LETTER CAN
+10BB; C; 2D1B; # GEORGIAN CAPITAL LETTER JIL
+10BC; C; 2D1C; # GEORGIAN CAPITAL LETTER CIL
+10BD; C; 2D1D; # GEORGIAN CAPITAL LETTER CHAR
+10BE; C; 2D1E; # GEORGIAN CAPITAL LETTER XAN
+10BF; C; 2D1F; # GEORGIAN CAPITAL LETTER JHAN
+10C0; C; 2D20; # GEORGIAN CAPITAL LETTER HAE
+10C1; C; 2D21; # GEORGIAN CAPITAL LETTER HE
+10C2; C; 2D22; # GEORGIAN CAPITAL LETTER HIE
+10C3; C; 2D23; # GEORGIAN CAPITAL LETTER WE
+10C4; C; 2D24; # GEORGIAN CAPITAL LETTER HAR
+10C5; C; 2D25; # GEORGIAN CAPITAL LETTER HOE
+1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW
+1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW
+1E06; C; 1E07; # LATIN CAPITAL LETTER B WITH LINE BELOW
+1E08; C; 1E09; # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E0A; C; 1E0B; # LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0C; C; 1E0D; # LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0E; C; 1E0F; # LATIN CAPITAL LETTER D WITH LINE BELOW
+1E10; C; 1E11; # LATIN CAPITAL LETTER D WITH CEDILLA
+1E12; C; 1E13; # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E14; C; 1E15; # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E16; C; 1E17; # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E18; C; 1E19; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E1A; C; 1E1B; # LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1C; C; 1E1D; # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1E; C; 1E1F; # LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E20; C; 1E21; # LATIN CAPITAL LETTER G WITH MACRON
+1E22; C; 1E23; # LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E24; C; 1E25; # LATIN CAPITAL LETTER H WITH DOT BELOW
+1E26; C; 1E27; # LATIN CAPITAL LETTER H WITH DIAERESIS
+1E28; C; 1E29; # LATIN CAPITAL LETTER H WITH CEDILLA
+1E2A; C; 1E2B; # LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2C; C; 1E2D; # LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2E; C; 1E2F; # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E30; C; 1E31; # LATIN CAPITAL LETTER K WITH ACUTE
+1E32; C; 1E33; # LATIN CAPITAL LETTER K WITH DOT BELOW
+1E34; C; 1E35; # LATIN CAPITAL LETTER K WITH LINE BELOW
+1E36; C; 1E37; # LATIN CAPITAL LETTER L WITH DOT BELOW
+1E38; C; 1E39; # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E3A; C; 1E3B; # LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3C; C; 1E3D; # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3E; C; 1E3F; # LATIN CAPITAL LETTER M WITH ACUTE
+1E40; C; 1E41; # LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E42; C; 1E43; # LATIN CAPITAL LETTER M WITH DOT BELOW
+1E44; C; 1E45; # LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E46; C; 1E47; # LATIN CAPITAL LETTER N WITH DOT BELOW
+1E48; C; 1E49; # LATIN CAPITAL LETTER N WITH LINE BELOW
+1E4A; C; 1E4B; # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4C; C; 1E4D; # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4E; C; 1E4F; # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E50; C; 1E51; # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E52; C; 1E53; # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E54; C; 1E55; # LATIN CAPITAL LETTER P WITH ACUTE
+1E56; C; 1E57; # LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E58; C; 1E59; # LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E5A; C; 1E5B; # LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5C; C; 1E5D; # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5E; C; 1E5F; # LATIN CAPITAL LETTER R WITH LINE BELOW
+1E60; C; 1E61; # LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E62; C; 1E63; # LATIN CAPITAL LETTER S WITH DOT BELOW
+1E64; C; 1E65; # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E66; C; 1E67; # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E68; C; 1E69; # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A; C; 1E6B; # LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6C; C; 1E6D; # LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6E; C; 1E6F; # LATIN CAPITAL LETTER T WITH LINE BELOW
+1E70; C; 1E71; # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E72; C; 1E73; # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E74; C; 1E75; # LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E76; C; 1E77; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E78; C; 1E79; # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E7A; C; 1E7B; # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7C; C; 1E7D; # LATIN CAPITAL LETTER V WITH TILDE
+1E7E; C; 1E7F; # LATIN CAPITAL LETTER V WITH DOT BELOW
+1E80; C; 1E81; # LATIN CAPITAL LETTER W WITH GRAVE
+1E82; C; 1E83; # LATIN CAPITAL LETTER W WITH ACUTE
+1E84; C; 1E85; # LATIN CAPITAL LETTER W WITH DIAERESIS
+1E86; C; 1E87; # LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E88; C; 1E89; # LATIN CAPITAL LETTER W WITH DOT BELOW
+1E8A; C; 1E8B; # LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8C; C; 1E8D; # LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8E; C; 1E8F; # LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E90; C; 1E91; # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E92; C; 1E93; # LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E94; C; 1E95; # LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E96; F; 0068 0331; # LATIN SMALL LETTER H WITH LINE BELOW
+1E97; F; 0074 0308; # LATIN SMALL LETTER T WITH DIAERESIS
+1E98; F; 0077 030A; # LATIN SMALL LETTER W WITH RING ABOVE
+1E99; F; 0079 030A; # LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A; F; 0061 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING
+1E9B; C; 1E61; # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1E9E; F; 0073 0073; # LATIN CAPITAL LETTER SHARP S
+1E9E; S; 00DF; # LATIN CAPITAL LETTER SHARP S
+1EA0; C; 1EA1; # LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA2; C; 1EA3; # LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA4; C; 1EA5; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6; C; 1EA7; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8; C; 1EA9; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA; C; 1EAB; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC; C; 1EAD; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE; C; 1EAF; # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EB0; C; 1EB1; # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB2; C; 1EB3; # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4; C; 1EB5; # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB6; C; 1EB7; # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB8; C; 1EB9; # LATIN CAPITAL LETTER E WITH DOT BELOW
+1EBA; C; 1EBB; # LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBC; C; 1EBD; # LATIN CAPITAL LETTER E WITH TILDE
+1EBE; C; 1EBF; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0; C; 1EC1; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2; C; 1EC3; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4; C; 1EC5; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6; C; 1EC7; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8; C; 1EC9; # LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1ECA; C; 1ECB; # LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECC; C; 1ECD; # LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECE; C; 1ECF; # LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ED0; C; 1ED1; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2; C; 1ED3; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4; C; 1ED5; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6; C; 1ED7; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8; C; 1ED9; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA; C; 1EDB; # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDC; C; 1EDD; # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDE; C; 1EDF; # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EE0; C; 1EE1; # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE2; C; 1EE3; # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE4; C; 1EE5; # LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE6; C; 1EE7; # LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE8; C; 1EE9; # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EEA; C; 1EEB; # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEC; C; 1EED; # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EEE; C; 1EEF; # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EF0; C; 1EF1; # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF2; C; 1EF3; # LATIN CAPITAL LETTER Y WITH GRAVE
+1EF4; C; 1EF5; # LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF6; C; 1EF7; # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF8; C; 1EF9; # LATIN CAPITAL LETTER Y WITH TILDE
+1EFA; C; 1EFB; # LATIN CAPITAL LETTER MIDDLE-WELSH LL
+1EFC; C; 1EFD; # LATIN CAPITAL LETTER MIDDLE-WELSH V
+1EFE; C; 1EFF; # LATIN CAPITAL LETTER Y WITH LOOP
+1F08; C; 1F00; # GREEK CAPITAL LETTER ALPHA WITH PSILI
+1F09; C; 1F01; # GREEK CAPITAL LETTER ALPHA WITH DASIA
+1F0A; C; 1F02; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1F0B; C; 1F03; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1F0C; C; 1F04; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1F0D; C; 1F05; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1F0E; C; 1F06; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F0F; C; 1F07; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F18; C; 1F10; # GREEK CAPITAL LETTER EPSILON WITH PSILI
+1F19; C; 1F11; # GREEK CAPITAL LETTER EPSILON WITH DASIA
+1F1A; C; 1F12; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1F1B; C; 1F13; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1F1C; C; 1F14; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1F1D; C; 1F15; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F28; C; 1F20; # GREEK CAPITAL LETTER ETA WITH PSILI
+1F29; C; 1F21; # GREEK CAPITAL LETTER ETA WITH DASIA
+1F2A; C; 1F22; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1F2B; C; 1F23; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1F2C; C; 1F24; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1F2D; C; 1F25; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1F2E; C; 1F26; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1F2F; C; 1F27; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F38; C; 1F30; # GREEK CAPITAL LETTER IOTA WITH PSILI
+1F39; C; 1F31; # GREEK CAPITAL LETTER IOTA WITH DASIA
+1F3A; C; 1F32; # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1F3B; C; 1F33; # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1F3C; C; 1F34; # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1F3D; C; 1F35; # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1F3E; C; 1F36; # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F3F; C; 1F37; # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F48; C; 1F40; # GREEK CAPITAL LETTER OMICRON WITH PSILI
+1F49; C; 1F41; # GREEK CAPITAL LETTER OMICRON WITH DASIA
+1F4A; C; 1F42; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1F4B; C; 1F43; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1F4C; C; 1F44; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1F4D; C; 1F45; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50; F; 03C5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI
+1F52; F; 03C5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F54; F; 03C5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F56; F; 03C5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1F59; C; 1F51; # GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B; C; 1F53; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D; C; 1F55; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F; C; 1F57; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F68; C; 1F60; # GREEK CAPITAL LETTER OMEGA WITH PSILI
+1F69; C; 1F61; # GREEK CAPITAL LETTER OMEGA WITH DASIA
+1F6A; C; 1F62; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1F6B; C; 1F63; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1F6C; C; 1F64; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1F6D; C; 1F65; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1F6E; C; 1F66; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F6F; C; 1F67; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F80; F; 1F00 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81; F; 1F01 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82; F; 1F02 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83; F; 1F03 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84; F; 1F04 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85; F; 1F05 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86; F; 1F06 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87; F; 1F07 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88; F; 1F00 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F88; S; 1F80; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89; F; 1F01 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F89; S; 1F81; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A; F; 1F02 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8A; S; 1F82; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B; F; 1F03 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8B; S; 1F83; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C; F; 1F04 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8C; S; 1F84; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D; F; 1F05 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8D; S; 1F85; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E; F; 1F06 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8E; S; 1F86; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F; F; 1F07 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F; S; 1F87; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90; F; 1F20 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91; F; 1F21 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92; F; 1F22 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93; F; 1F23 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94; F; 1F24 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95; F; 1F25 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96; F; 1F26 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97; F; 1F27 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98; F; 1F20 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F98; S; 1F90; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99; F; 1F21 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F99; S; 1F91; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A; F; 1F22 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9A; S; 1F92; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B; F; 1F23 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9B; S; 1F93; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C; F; 1F24 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9C; S; 1F94; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D; F; 1F25 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9D; S; 1F95; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E; F; 1F26 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9E; S; 1F96; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F; F; 1F27 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F; S; 1F97; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0; F; 1F60 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1; F; 1F61 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2; F; 1F62 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3; F; 1F63 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4; F; 1F64 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5; F; 1F65 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6; F; 1F66 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7; F; 1F67 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8; F; 1F60 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA8; S; 1FA0; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9; F; 1F61 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FA9; S; 1FA1; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA; F; 1F62 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAA; S; 1FA2; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB; F; 1F63 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAB; S; 1FA3; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC; F; 1F64 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAC; S; 1FA4; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD; F; 1F65 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAD; S; 1FA5; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE; F; 1F66 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAE; S; 1FA6; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF; F; 1F67 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF; S; 1FA7; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB2; F; 1F70 03B9; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB3; F; 03B1 03B9; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FB4; F; 03AC 03B9; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6; F; 03B1 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7; F; 03B1 0342 03B9; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FB8; C; 1FB0; # GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1FB9; C; 1FB1; # GREEK CAPITAL LETTER ALPHA WITH MACRON
+1FBA; C; 1F70; # GREEK CAPITAL LETTER ALPHA WITH VARIA
+1FBB; C; 1F71; # GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FBC; F; 03B1 03B9; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBC; S; 1FB3; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE; C; 03B9; # GREEK PROSGEGRAMMENI
+1FC2; F; 1F74 03B9; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC3; F; 03B7 03B9; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FC4; F; 03AE 03B9; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6; F; 03B7 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7; F; 03B7 0342 03B9; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC8; C; 1F72; # GREEK CAPITAL LETTER EPSILON WITH VARIA
+1FC9; C; 1F73; # GREEK CAPITAL LETTER EPSILON WITH OXIA
+1FCA; C; 1F74; # GREEK CAPITAL LETTER ETA WITH VARIA
+1FCB; C; 1F75; # GREEK CAPITAL LETTER ETA WITH OXIA
+1FCC; F; 03B7 03B9; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCC; S; 1FC3; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD2; F; 03B9 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6; F; 03B9 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7; F; 03B9 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8; C; 1FD0; # GREEK CAPITAL LETTER IOTA WITH VRACHY
+1FD9; C; 1FD1; # GREEK CAPITAL LETTER IOTA WITH MACRON
+1FDA; C; 1F76; # GREEK CAPITAL LETTER IOTA WITH VARIA
+1FDB; C; 1F77; # GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE2; F; 03C5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4; F; 03C1 0313; # GREEK SMALL LETTER RHO WITH PSILI
+1FE6; F; 03C5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7; F; 03C5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8; C; 1FE0; # GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1FE9; C; 1FE1; # GREEK CAPITAL LETTER UPSILON WITH MACRON
+1FEA; C; 1F7A; # GREEK CAPITAL LETTER UPSILON WITH VARIA
+1FEB; C; 1F7B; # GREEK CAPITAL LETTER UPSILON WITH OXIA
+1FEC; C; 1FE5; # GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2; F; 1F7C 03B9; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF3; F; 03C9 03B9; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FF4; F; 03CE 03B9; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6; F; 03C9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7; F; 03C9 0342 03B9; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF8; C; 1F78; # GREEK CAPITAL LETTER OMICRON WITH VARIA
+1FF9; C; 1F79; # GREEK CAPITAL LETTER OMICRON WITH OXIA
+1FFA; C; 1F7C; # GREEK CAPITAL LETTER OMEGA WITH VARIA
+1FFB; C; 1F7D; # GREEK CAPITAL LETTER OMEGA WITH OXIA
+1FFC; F; 03C9 03B9; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFC; S; 1FF3; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+2126; C; 03C9; # OHM SIGN
+212A; C; 006B; # KELVIN SIGN
+212B; C; 00E5; # ANGSTROM SIGN
+2132; C; 214E; # TURNED CAPITAL F
+2160; C; 2170; # ROMAN NUMERAL ONE
+2161; C; 2171; # ROMAN NUMERAL TWO
+2162; C; 2172; # ROMAN NUMERAL THREE
+2163; C; 2173; # ROMAN NUMERAL FOUR
+2164; C; 2174; # ROMAN NUMERAL FIVE
+2165; C; 2175; # ROMAN NUMERAL SIX
+2166; C; 2176; # ROMAN NUMERAL SEVEN
+2167; C; 2177; # ROMAN NUMERAL EIGHT
+2168; C; 2178; # ROMAN NUMERAL NINE
+2169; C; 2179; # ROMAN NUMERAL TEN
+216A; C; 217A; # ROMAN NUMERAL ELEVEN
+216B; C; 217B; # ROMAN NUMERAL TWELVE
+216C; C; 217C; # ROMAN NUMERAL FIFTY
+216D; C; 217D; # ROMAN NUMERAL ONE HUNDRED
+216E; C; 217E; # ROMAN NUMERAL FIVE HUNDRED
+216F; C; 217F; # ROMAN NUMERAL ONE THOUSAND
+2183; C; 2184; # ROMAN NUMERAL REVERSED ONE HUNDRED
+24B6; C; 24D0; # CIRCLED LATIN CAPITAL LETTER A
+24B7; C; 24D1; # CIRCLED LATIN CAPITAL LETTER B
+24B8; C; 24D2; # CIRCLED LATIN CAPITAL LETTER C
+24B9; C; 24D3; # CIRCLED LATIN CAPITAL LETTER D
+24BA; C; 24D4; # CIRCLED LATIN CAPITAL LETTER E
+24BB; C; 24D5; # CIRCLED LATIN CAPITAL LETTER F
+24BC; C; 24D6; # CIRCLED LATIN CAPITAL LETTER G
+24BD; C; 24D7; # CIRCLED LATIN CAPITAL LETTER H
+24BE; C; 24D8; # CIRCLED LATIN CAPITAL LETTER I
+24BF; C; 24D9; # CIRCLED LATIN CAPITAL LETTER J
+24C0; C; 24DA; # CIRCLED LATIN CAPITAL LETTER K
+24C1; C; 24DB; # CIRCLED LATIN CAPITAL LETTER L
+24C2; C; 24DC; # CIRCLED LATIN CAPITAL LETTER M
+24C3; C; 24DD; # CIRCLED LATIN CAPITAL LETTER N
+24C4; C; 24DE; # CIRCLED LATIN CAPITAL LETTER O
+24C5; C; 24DF; # CIRCLED LATIN CAPITAL LETTER P
+24C6; C; 24E0; # CIRCLED LATIN CAPITAL LETTER Q
+24C7; C; 24E1; # CIRCLED LATIN CAPITAL LETTER R
+24C8; C; 24E2; # CIRCLED LATIN CAPITAL LETTER S
+24C9; C; 24E3; # CIRCLED LATIN CAPITAL LETTER T
+24CA; C; 24E4; # CIRCLED LATIN CAPITAL LETTER U
+24CB; C; 24E5; # CIRCLED LATIN CAPITAL LETTER V
+24CC; C; 24E6; # CIRCLED LATIN CAPITAL LETTER W
+24CD; C; 24E7; # CIRCLED LATIN CAPITAL LETTER X
+24CE; C; 24E8; # CIRCLED LATIN CAPITAL LETTER Y
+24CF; C; 24E9; # CIRCLED LATIN CAPITAL LETTER Z
+2C00; C; 2C30; # GLAGOLITIC CAPITAL LETTER AZU
+2C01; C; 2C31; # GLAGOLITIC CAPITAL LETTER BUKY
+2C02; C; 2C32; # GLAGOLITIC CAPITAL LETTER VEDE
+2C03; C; 2C33; # GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C04; C; 2C34; # GLAGOLITIC CAPITAL LETTER DOBRO
+2C05; C; 2C35; # GLAGOLITIC CAPITAL LETTER YESTU
+2C06; C; 2C36; # GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C07; C; 2C37; # GLAGOLITIC CAPITAL LETTER DZELO
+2C08; C; 2C38; # GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C09; C; 2C39; # GLAGOLITIC CAPITAL LETTER IZHE
+2C0A; C; 2C3A; # GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C0B; C; 2C3B; # GLAGOLITIC CAPITAL LETTER I
+2C0C; C; 2C3C; # GLAGOLITIC CAPITAL LETTER DJERVI
+2C0D; C; 2C3D; # GLAGOLITIC CAPITAL LETTER KAKO
+2C0E; C; 2C3E; # GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C0F; C; 2C3F; # GLAGOLITIC CAPITAL LETTER MYSLITE
+2C10; C; 2C40; # GLAGOLITIC CAPITAL LETTER NASHI
+2C11; C; 2C41; # GLAGOLITIC CAPITAL LETTER ONU
+2C12; C; 2C42; # GLAGOLITIC CAPITAL LETTER POKOJI
+2C13; C; 2C43; # GLAGOLITIC CAPITAL LETTER RITSI
+2C14; C; 2C44; # GLAGOLITIC CAPITAL LETTER SLOVO
+2C15; C; 2C45; # GLAGOLITIC CAPITAL LETTER TVRIDO
+2C16; C; 2C46; # GLAGOLITIC CAPITAL LETTER UKU
+2C17; C; 2C47; # GLAGOLITIC CAPITAL LETTER FRITU
+2C18; C; 2C48; # GLAGOLITIC CAPITAL LETTER HERU
+2C19; C; 2C49; # GLAGOLITIC CAPITAL LETTER OTU
+2C1A; C; 2C4A; # GLAGOLITIC CAPITAL LETTER PE
+2C1B; C; 2C4B; # GLAGOLITIC CAPITAL LETTER SHTA
+2C1C; C; 2C4C; # GLAGOLITIC CAPITAL LETTER TSI
+2C1D; C; 2C4D; # GLAGOLITIC CAPITAL LETTER CHRIVI
+2C1E; C; 2C4E; # GLAGOLITIC CAPITAL LETTER SHA
+2C1F; C; 2C4F; # GLAGOLITIC CAPITAL LETTER YERU
+2C20; C; 2C50; # GLAGOLITIC CAPITAL LETTER YERI
+2C21; C; 2C51; # GLAGOLITIC CAPITAL LETTER YATI
+2C22; C; 2C52; # GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C23; C; 2C53; # GLAGOLITIC CAPITAL LETTER YU
+2C24; C; 2C54; # GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C25; C; 2C55; # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C26; C; 2C56; # GLAGOLITIC CAPITAL LETTER YO
+2C27; C; 2C57; # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C28; C; 2C58; # GLAGOLITIC CAPITAL LETTER BIG YUS
+2C29; C; 2C59; # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C2A; C; 2C5A; # GLAGOLITIC CAPITAL LETTER FITA
+2C2B; C; 2C5B; # GLAGOLITIC CAPITAL LETTER IZHITSA
+2C2C; C; 2C5C; # GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C2D; C; 2C5D; # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C2E; C; 2C5E; # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C60; C; 2C61; # LATIN CAPITAL LETTER L WITH DOUBLE BAR
+2C62; C; 026B; # LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+2C63; C; 1D7D; # LATIN CAPITAL LETTER P WITH STROKE
+2C64; C; 027D; # LATIN CAPITAL LETTER R WITH TAIL
+2C67; C; 2C68; # LATIN CAPITAL LETTER H WITH DESCENDER
+2C69; C; 2C6A; # LATIN CAPITAL LETTER K WITH DESCENDER
+2C6B; C; 2C6C; # LATIN CAPITAL LETTER Z WITH DESCENDER
+2C6D; C; 0251; # LATIN CAPITAL LETTER ALPHA
+2C6E; C; 0271; # LATIN CAPITAL LETTER M WITH HOOK
+2C6F; C; 0250; # LATIN CAPITAL LETTER TURNED A
+2C72; C; 2C73; # LATIN CAPITAL LETTER W WITH HOOK
+2C75; C; 2C76; # LATIN CAPITAL LETTER HALF H
+2C80; C; 2C81; # COPTIC CAPITAL LETTER ALFA
+2C82; C; 2C83; # COPTIC CAPITAL LETTER VIDA
+2C84; C; 2C85; # COPTIC CAPITAL LETTER GAMMA
+2C86; C; 2C87; # COPTIC CAPITAL LETTER DALDA
+2C88; C; 2C89; # COPTIC CAPITAL LETTER EIE
+2C8A; C; 2C8B; # COPTIC CAPITAL LETTER SOU
+2C8C; C; 2C8D; # COPTIC CAPITAL LETTER ZATA
+2C8E; C; 2C8F; # COPTIC CAPITAL LETTER HATE
+2C90; C; 2C91; # COPTIC CAPITAL LETTER THETHE
+2C92; C; 2C93; # COPTIC CAPITAL LETTER IAUDA
+2C94; C; 2C95; # COPTIC CAPITAL LETTER KAPA
+2C96; C; 2C97; # COPTIC CAPITAL LETTER LAULA
+2C98; C; 2C99; # COPTIC CAPITAL LETTER MI
+2C9A; C; 2C9B; # COPTIC CAPITAL LETTER NI
+2C9C; C; 2C9D; # COPTIC CAPITAL LETTER KSI
+2C9E; C; 2C9F; # COPTIC CAPITAL LETTER O
+2CA0; C; 2CA1; # COPTIC CAPITAL LETTER PI
+2CA2; C; 2CA3; # COPTIC CAPITAL LETTER RO
+2CA4; C; 2CA5; # COPTIC CAPITAL LETTER SIMA
+2CA6; C; 2CA7; # COPTIC CAPITAL LETTER TAU
+2CA8; C; 2CA9; # COPTIC CAPITAL LETTER UA
+2CAA; C; 2CAB; # COPTIC CAPITAL LETTER FI
+2CAC; C; 2CAD; # COPTIC CAPITAL LETTER KHI
+2CAE; C; 2CAF; # COPTIC CAPITAL LETTER PSI
+2CB0; C; 2CB1; # COPTIC CAPITAL LETTER OOU
+2CB2; C; 2CB3; # COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB4; C; 2CB5; # COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB6; C; 2CB7; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB8; C; 2CB9; # COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CBA; C; 2CBB; # COPTIC CAPITAL LETTER DIALECT-P NI
+2CBC; C; 2CBD; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBE; C; 2CBF; # COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CC0; C; 2CC1; # COPTIC CAPITAL LETTER SAMPI
+2CC2; C; 2CC3; # COPTIC CAPITAL LETTER CROSSED SHEI
+2CC4; C; 2CC5; # COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC6; C; 2CC7; # COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC8; C; 2CC9; # COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CCA; C; 2CCB; # COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCC; C; 2CCD; # COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCE; C; 2CCF; # COPTIC CAPITAL LETTER OLD COPTIC HA
+2CD0; C; 2CD1; # COPTIC CAPITAL LETTER L-SHAPED HA
+2CD2; C; 2CD3; # COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD4; C; 2CD5; # COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD6; C; 2CD7; # COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD8; C; 2CD9; # COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CDA; C; 2CDB; # COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDC; C; 2CDD; # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDE; C; 2CDF; # COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CE0; C; 2CE1; # COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE2; C; 2CE3; # COPTIC CAPITAL LETTER OLD NUBIAN WAU
+A640; C; A641; # CYRILLIC CAPITAL LETTER ZEMLYA
+A642; C; A643; # CYRILLIC CAPITAL LETTER DZELO
+A644; C; A645; # CYRILLIC CAPITAL LETTER REVERSED DZE
+A646; C; A647; # CYRILLIC CAPITAL LETTER IOTA
+A648; C; A649; # CYRILLIC CAPITAL LETTER DJERV
+A64A; C; A64B; # CYRILLIC CAPITAL LETTER MONOGRAPH UK
+A64C; C; A64D; # CYRILLIC CAPITAL LETTER BROAD OMEGA
+A64E; C; A64F; # CYRILLIC CAPITAL LETTER NEUTRAL YER
+A650; C; A651; # CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+A652; C; A653; # CYRILLIC CAPITAL LETTER IOTIFIED YAT
+A654; C; A655; # CYRILLIC CAPITAL LETTER REVERSED YU
+A656; C; A657; # CYRILLIC CAPITAL LETTER IOTIFIED A
+A658; C; A659; # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+A65A; C; A65B; # CYRILLIC CAPITAL LETTER BLENDED YUS
+A65C; C; A65D; # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+A65E; C; A65F; # CYRILLIC CAPITAL LETTER YN
+A662; C; A663; # CYRILLIC CAPITAL LETTER SOFT DE
+A664; C; A665; # CYRILLIC CAPITAL LETTER SOFT EL
+A666; C; A667; # CYRILLIC CAPITAL LETTER SOFT EM
+A668; C; A669; # CYRILLIC CAPITAL LETTER MONOCULAR O
+A66A; C; A66B; # CYRILLIC CAPITAL LETTER BINOCULAR O
+A66C; C; A66D; # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+A680; C; A681; # CYRILLIC CAPITAL LETTER DWE
+A682; C; A683; # CYRILLIC CAPITAL LETTER DZWE
+A684; C; A685; # CYRILLIC CAPITAL LETTER ZHWE
+A686; C; A687; # CYRILLIC CAPITAL LETTER CCHE
+A688; C; A689; # CYRILLIC CAPITAL LETTER DZZE
+A68A; C; A68B; # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+A68C; C; A68D; # CYRILLIC CAPITAL LETTER TWE
+A68E; C; A68F; # CYRILLIC CAPITAL LETTER TSWE
+A690; C; A691; # CYRILLIC CAPITAL LETTER TSSE
+A692; C; A693; # CYRILLIC CAPITAL LETTER TCHE
+A694; C; A695; # CYRILLIC CAPITAL LETTER HWE
+A696; C; A697; # CYRILLIC CAPITAL LETTER SHWE
+A722; C; A723; # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+A724; C; A725; # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+A726; C; A727; # LATIN CAPITAL LETTER HENG
+A728; C; A729; # LATIN CAPITAL LETTER TZ
+A72A; C; A72B; # LATIN CAPITAL LETTER TRESILLO
+A72C; C; A72D; # LATIN CAPITAL LETTER CUATRILLO
+A72E; C; A72F; # LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+A732; C; A733; # LATIN CAPITAL LETTER AA
+A734; C; A735; # LATIN CAPITAL LETTER AO
+A736; C; A737; # LATIN CAPITAL LETTER AU
+A738; C; A739; # LATIN CAPITAL LETTER AV
+A73A; C; A73B; # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+A73C; C; A73D; # LATIN CAPITAL LETTER AY
+A73E; C; A73F; # LATIN CAPITAL LETTER REVERSED C WITH DOT
+A740; C; A741; # LATIN CAPITAL LETTER K WITH STROKE
+A742; C; A743; # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+A744; C; A745; # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+A746; C; A747; # LATIN CAPITAL LETTER BROKEN L
+A748; C; A749; # LATIN CAPITAL LETTER L WITH HIGH STROKE
+A74A; C; A74B; # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+A74C; C; A74D; # LATIN CAPITAL LETTER O WITH LOOP
+A74E; C; A74F; # LATIN CAPITAL LETTER OO
+A750; C; A751; # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+A752; C; A753; # LATIN CAPITAL LETTER P WITH FLOURISH
+A754; C; A755; # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+A756; C; A757; # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+A758; C; A759; # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+A75A; C; A75B; # LATIN CAPITAL LETTER R ROTUNDA
+A75C; C; A75D; # LATIN CAPITAL LETTER RUM ROTUNDA
+A75E; C; A75F; # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+A760; C; A761; # LATIN CAPITAL LETTER VY
+A762; C; A763; # LATIN CAPITAL LETTER VISIGOTHIC Z
+A764; C; A765; # LATIN CAPITAL LETTER THORN WITH STROKE
+A766; C; A767; # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+A768; C; A769; # LATIN CAPITAL LETTER VEND
+A76A; C; A76B; # LATIN CAPITAL LETTER ET
+A76C; C; A76D; # LATIN CAPITAL LETTER IS
+A76E; C; A76F; # LATIN CAPITAL LETTER CON
+A779; C; A77A; # LATIN CAPITAL LETTER INSULAR D
+A77B; C; A77C; # LATIN CAPITAL LETTER INSULAR F
+A77D; C; 1D79; # LATIN CAPITAL LETTER INSULAR G
+A77E; C; A77F; # LATIN CAPITAL LETTER TURNED INSULAR G
+A780; C; A781; # LATIN CAPITAL LETTER TURNED L
+A782; C; A783; # LATIN CAPITAL LETTER INSULAR R
+A784; C; A785; # LATIN CAPITAL LETTER INSULAR S
+A786; C; A787; # LATIN CAPITAL LETTER INSULAR T
+A78B; C; A78C; # LATIN CAPITAL LETTER SALTILLO
+FB00; F; 0066 0066; # LATIN SMALL LIGATURE FF
+FB01; F; 0066 0069; # LATIN SMALL LIGATURE FI
+FB02; F; 0066 006C; # LATIN SMALL LIGATURE FL
+FB03; F; 0066 0066 0069; # LATIN SMALL LIGATURE FFI
+FB04; F; 0066 0066 006C; # LATIN SMALL LIGATURE FFL
+FB05; F; 0073 0074; # LATIN SMALL LIGATURE LONG S T
+FB06; F; 0073 0074; # LATIN SMALL LIGATURE ST
+FB13; F; 0574 0576; # ARMENIAN SMALL LIGATURE MEN NOW
+FB14; F; 0574 0565; # ARMENIAN SMALL LIGATURE MEN ECH
+FB15; F; 0574 056B; # ARMENIAN SMALL LIGATURE MEN INI
+FB16; F; 057E 0576; # ARMENIAN SMALL LIGATURE VEW NOW
+FB17; F; 0574 056D; # ARMENIAN SMALL LIGATURE MEN XEH
+FF21; C; FF41; # FULLWIDTH LATIN CAPITAL LETTER A
+FF22; C; FF42; # FULLWIDTH LATIN CAPITAL LETTER B
+FF23; C; FF43; # FULLWIDTH LATIN CAPITAL LETTER C
+FF24; C; FF44; # FULLWIDTH LATIN CAPITAL LETTER D
+FF25; C; FF45; # FULLWIDTH LATIN CAPITAL LETTER E
+FF26; C; FF46; # FULLWIDTH LATIN CAPITAL LETTER F
+FF27; C; FF47; # FULLWIDTH LATIN CAPITAL LETTER G
+FF28; C; FF48; # FULLWIDTH LATIN CAPITAL LETTER H
+FF29; C; FF49; # FULLWIDTH LATIN CAPITAL LETTER I
+FF2A; C; FF4A; # FULLWIDTH LATIN CAPITAL LETTER J
+FF2B; C; FF4B; # FULLWIDTH LATIN CAPITAL LETTER K
+FF2C; C; FF4C; # FULLWIDTH LATIN CAPITAL LETTER L
+FF2D; C; FF4D; # FULLWIDTH LATIN CAPITAL LETTER M
+FF2E; C; FF4E; # FULLWIDTH LATIN CAPITAL LETTER N
+FF2F; C; FF4F; # FULLWIDTH LATIN CAPITAL LETTER O
+FF30; C; FF50; # FULLWIDTH LATIN CAPITAL LETTER P
+FF31; C; FF51; # FULLWIDTH LATIN CAPITAL LETTER Q
+FF32; C; FF52; # FULLWIDTH LATIN CAPITAL LETTER R
+FF33; C; FF53; # FULLWIDTH LATIN CAPITAL LETTER S
+FF34; C; FF54; # FULLWIDTH LATIN CAPITAL LETTER T
+FF35; C; FF55; # FULLWIDTH LATIN CAPITAL LETTER U
+FF36; C; FF56; # FULLWIDTH LATIN CAPITAL LETTER V
+FF37; C; FF57; # FULLWIDTH LATIN CAPITAL LETTER W
+FF38; C; FF58; # FULLWIDTH LATIN CAPITAL LETTER X
+FF39; C; FF59; # FULLWIDTH LATIN CAPITAL LETTER Y
+FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z
+10400; C; 10428; # DESERET CAPITAL LETTER LONG I
+10401; C; 10429; # DESERET CAPITAL LETTER LONG E
+10402; C; 1042A; # DESERET CAPITAL LETTER LONG A
+10403; C; 1042B; # DESERET CAPITAL LETTER LONG AH
+10404; C; 1042C; # DESERET CAPITAL LETTER LONG O
+10405; C; 1042D; # DESERET CAPITAL LETTER LONG OO
+10406; C; 1042E; # DESERET CAPITAL LETTER SHORT I
+10407; C; 1042F; # DESERET CAPITAL LETTER SHORT E
+10408; C; 10430; # DESERET CAPITAL LETTER SHORT A
+10409; C; 10431; # DESERET CAPITAL LETTER SHORT AH
+1040A; C; 10432; # DESERET CAPITAL LETTER SHORT O
+1040B; C; 10433; # DESERET CAPITAL LETTER SHORT OO
+1040C; C; 10434; # DESERET CAPITAL LETTER AY
+1040D; C; 10435; # DESERET CAPITAL LETTER OW
+1040E; C; 10436; # DESERET CAPITAL LETTER WU
+1040F; C; 10437; # DESERET CAPITAL LETTER YEE
+10410; C; 10438; # DESERET CAPITAL LETTER H
+10411; C; 10439; # DESERET CAPITAL LETTER PEE
+10412; C; 1043A; # DESERET CAPITAL LETTER BEE
+10413; C; 1043B; # DESERET CAPITAL LETTER TEE
+10414; C; 1043C; # DESERET CAPITAL LETTER DEE
+10415; C; 1043D; # DESERET CAPITAL LETTER CHEE
+10416; C; 1043E; # DESERET CAPITAL LETTER JEE
+10417; C; 1043F; # DESERET CAPITAL LETTER KAY
+10418; C; 10440; # DESERET CAPITAL LETTER GAY
+10419; C; 10441; # DESERET CAPITAL LETTER EF
+1041A; C; 10442; # DESERET CAPITAL LETTER VEE
+1041B; C; 10443; # DESERET CAPITAL LETTER ETH
+1041C; C; 10444; # DESERET CAPITAL LETTER THEE
+1041D; C; 10445; # DESERET CAPITAL LETTER ES
+1041E; C; 10446; # DESERET CAPITAL LETTER ZEE
+1041F; C; 10447; # DESERET CAPITAL LETTER ESH
+10420; C; 10448; # DESERET CAPITAL LETTER ZHEE
+10421; C; 10449; # DESERET CAPITAL LETTER ER
+10422; C; 1044A; # DESERET CAPITAL LETTER EL
+10423; C; 1044B; # DESERET CAPITAL LETTER EM
+10424; C; 1044C; # DESERET CAPITAL LETTER EN
+10425; C; 1044D; # DESERET CAPITAL LETTER ENG
+10426; C; 1044E; # DESERET CAPITAL LETTER OI
+10427; C; 1044F; # DESERET CAPITAL LETTER EW
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/CombiningClass.pl b/Master/tlpkg/tlperl.straw/lib/unicore/CombiningClass.pl
new file mode 100755
index 00000000000..3c219d0bb1c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/CombiningClass.pl
@@ -0,0 +1,235 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+return <<'END';
+0300 0314 230
+0315 232
+0316 0319 220
+031A 232
+031B 216
+031C 0320 220
+0321 0322 202
+0323 0326 220
+0327 0328 202
+0329 0333 220
+0334 0338 1
+0339 033C 220
+033D 0344 230
+0345 240
+0346 230
+0347 0349 220
+034A 034C 230
+034D 034E 220
+0350 0352 230
+0353 0356 220
+0357 230
+0358 232
+0359 035A 220
+035B 230
+035C 233
+035D 035E 234
+035F 233
+0360 0361 234
+0362 233
+0363 036F 230
+0483 0487 230
+0591 220
+0592 0595 230
+0596 220
+0597 0599 230
+059A 222
+059B 220
+059C 05A1 230
+05A2 05A7 220
+05A8 05A9 230
+05AA 220
+05AB 05AC 230
+05AD 222
+05AE 228
+05AF 230
+05B0 10
+05B1 11
+05B2 12
+05B3 13
+05B4 14
+05B5 15
+05B6 16
+05B7 17
+05B8 18
+05B9 05BA 19
+05BB 20
+05BC 21
+05BD 22
+05BF 23
+05C1 24
+05C2 25
+05C4 230
+05C5 220
+05C7 18
+0610 0617 230
+0618 30
+0619 31
+061A 32
+064B 27
+064C 28
+064D 29
+064E 30
+064F 31
+0650 32
+0651 33
+0652 34
+0653 0654 230
+0655 0656 220
+0657 065B 230
+065C 220
+065D 065E 230
+0670 35
+06D6 06DC 230
+06DF 06E2 230
+06E3 220
+06E4 230
+06E7 06E8 230
+06EA 220
+06EB 06EC 230
+06ED 220
+0711 36
+0730 230
+0731 220
+0732 0733 230
+0734 220
+0735 0736 230
+0737 0739 220
+073A 230
+073B 073C 220
+073D 230
+073E 220
+073F 0741 230
+0742 220
+0743 230
+0744 220
+0745 230
+0746 220
+0747 230
+0748 220
+0749 074A 230
+07EB 07F1 230
+07F2 220
+07F3 230
+093C 7
+094D 9
+0951 230
+0952 220
+0953 0954 230
+09BC 7
+09CD 9
+0A3C 7
+0A4D 9
+0ABC 7
+0ACD 9
+0B3C 7
+0B4D 9
+0BCD 9
+0C4D 9
+0C55 84
+0C56 91
+0CBC 7
+0CCD 9
+0D4D 9
+0DCA 9
+0E38 0E39 103
+0E3A 9
+0E48 0E4B 107
+0EB8 0EB9 118
+0EC8 0ECB 122
+0F18 0F19 220
+0F35 220
+0F37 220
+0F39 216
+0F71 129
+0F72 130
+0F74 132
+0F7A 0F7D 130
+0F80 130
+0F82 0F83 230
+0F84 9
+0F86 0F87 230
+0FC6 220
+1037 7
+1039 103A 9
+108D 220
+135F 230
+1714 9
+1734 9
+17D2 9
+17DD 230
+18A9 228
+1939 222
+193A 230
+193B 220
+1A17 230
+1A18 220
+1B34 7
+1B44 9
+1B6B 230
+1B6C 220
+1B6D 1B73 230
+1BAA 9
+1C37 7
+1DC0 1DC1 230
+1DC2 220
+1DC3 1DC9 230
+1DCA 220
+1DCB 1DCC 230
+1DCD 234
+1DCE 214
+1DCF 220
+1DD0 202
+1DD1 1DE6 230
+1DFE 230
+1DFF 220
+20D0 20D1 230
+20D2 20D3 1
+20D4 20D7 230
+20D8 20DA 1
+20DB 20DC 230
+20E1 230
+20E5 20E6 1
+20E7 230
+20E8 220
+20E9 230
+20EA 20EB 1
+20EC 20EF 220
+20F0 230
+2DE0 2DFF 230
+302A 218
+302B 228
+302C 232
+302D 222
+302E 302F 224
+3099 309A 8
+A66F 230
+A67C A67D 230
+A806 9
+A8C4 9
+A92B A92D 220
+A953 9
+FB1E 26
+FE20 FE26 230
+101FD 220
+10A0D 220
+10A0F 230
+10A38 230
+10A39 1
+10A3A 220
+10A3F 9
+1D165 1D166 216
+1D167 1D169 1
+1D16D 226
+1D16E 1D172 216
+1D17B 1D182 220
+1D185 1D189 230
+1D18A 1D18B 220
+1D1AA 1D1AD 230
+1D242 1D244 230
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/CompositionExclusions.txt b/Master/tlpkg/tlperl.straw/lib/unicore/CompositionExclusions.txt
new file mode 100755
index 00000000000..d4428fca6a2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/CompositionExclusions.txt
@@ -0,0 +1,197 @@
+# CompositionExclusions-5.1.0.txt
+# Date: 2008-03-20, 17:45:00 PDT [KW]
+#
+# This file lists the characters for the Composition Exclusion Table
+# defined in UAX #15, Unicode Normalization Forms.
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# For more information, see
+# http://www.unicode.org/unicode/reports/tr15/#Primary Exclusion List Table
+#
+# For a full derivation of composition exclusions, see the derived property
+# Full_Composition_Exclusion in DerivedNormalizationProps.txt
+#
+
+# ================================================
+# (1) Script Specifics
+#
+# This list of characters cannot be derived from the UnicodeData.txt file.
+# ================================================
+
+0958 # DEVANAGARI LETTER QA
+0959 # DEVANAGARI LETTER KHHA
+095A # DEVANAGARI LETTER GHHA
+095B # DEVANAGARI LETTER ZA
+095C # DEVANAGARI LETTER DDDHA
+095D # DEVANAGARI LETTER RHA
+095E # DEVANAGARI LETTER FA
+095F # DEVANAGARI LETTER YYA
+09DC # BENGALI LETTER RRA
+09DD # BENGALI LETTER RHA
+09DF # BENGALI LETTER YYA
+0A33 # GURMUKHI LETTER LLA
+0A36 # GURMUKHI LETTER SHA
+0A59 # GURMUKHI LETTER KHHA
+0A5A # GURMUKHI LETTER GHHA
+0A5B # GURMUKHI LETTER ZA
+0A5E # GURMUKHI LETTER FA
+0B5C # ORIYA LETTER RRA
+0B5D # ORIYA LETTER RHA
+0F43 # TIBETAN LETTER GHA
+0F4D # TIBETAN LETTER DDHA
+0F52 # TIBETAN LETTER DHA
+0F57 # TIBETAN LETTER BHA
+0F5C # TIBETAN LETTER DZHA
+0F69 # TIBETAN LETTER KSSA
+0F76 # TIBETAN VOWEL SIGN VOCALIC R
+0F78 # TIBETAN VOWEL SIGN VOCALIC L
+0F93 # TIBETAN SUBJOINED LETTER GHA
+0F9D # TIBETAN SUBJOINED LETTER DDHA
+0FA2 # TIBETAN SUBJOINED LETTER DHA
+0FA7 # TIBETAN SUBJOINED LETTER BHA
+0FAC # TIBETAN SUBJOINED LETTER DZHA
+0FB9 # TIBETAN SUBJOINED LETTER KSSA
+FB1D # HEBREW LETTER YOD WITH HIRIQ
+FB1F # HEBREW LIGATURE YIDDISH YOD YOD PATAH
+FB2A # HEBREW LETTER SHIN WITH SHIN DOT
+FB2B # HEBREW LETTER SHIN WITH SIN DOT
+FB2C # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+FB2D # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+FB2E # HEBREW LETTER ALEF WITH PATAH
+FB2F # HEBREW LETTER ALEF WITH QAMATS
+FB30 # HEBREW LETTER ALEF WITH MAPIQ
+FB31 # HEBREW LETTER BET WITH DAGESH
+FB32 # HEBREW LETTER GIMEL WITH DAGESH
+FB33 # HEBREW LETTER DALET WITH DAGESH
+FB34 # HEBREW LETTER HE WITH MAPIQ
+FB35 # HEBREW LETTER VAV WITH DAGESH
+FB36 # HEBREW LETTER ZAYIN WITH DAGESH
+FB38 # HEBREW LETTER TET WITH DAGESH
+FB39 # HEBREW LETTER YOD WITH DAGESH
+FB3A # HEBREW LETTER FINAL KAF WITH DAGESH
+FB3B # HEBREW LETTER KAF WITH DAGESH
+FB3C # HEBREW LETTER LAMED WITH DAGESH
+FB3E # HEBREW LETTER MEM WITH DAGESH
+FB40 # HEBREW LETTER NUN WITH DAGESH
+FB41 # HEBREW LETTER SAMEKH WITH DAGESH
+FB43 # HEBREW LETTER FINAL PE WITH DAGESH
+FB44 # HEBREW LETTER PE WITH DAGESH
+FB46 # HEBREW LETTER TSADI WITH DAGESH
+FB47 # HEBREW LETTER QOF WITH DAGESH
+FB48 # HEBREW LETTER RESH WITH DAGESH
+FB49 # HEBREW LETTER SHIN WITH DAGESH
+FB4A # HEBREW LETTER TAV WITH DAGESH
+FB4B # HEBREW LETTER VAV WITH HOLAM
+FB4C # HEBREW LETTER BET WITH RAFE
+FB4D # HEBREW LETTER KAF WITH RAFE
+FB4E # HEBREW LETTER PE WITH RAFE
+
+# Total code points: 67
+
+# ================================================
+# (2) Post Composition Version precomposed characters
+#
+# These characters cannot be derived solely from the UnicodeData.txt file
+# in this version of Unicode.
+#
+# Note that characters added to the standard after the
+# Composition Version and which have canonical decomposition mappings
+# are not automatically added to this list of Post Composition
+# Version precomposed characters.
+# ================================================
+
+2ADC # FORKING
+1D15E # MUSICAL SYMBOL HALF NOTE
+1D15F # MUSICAL SYMBOL QUARTER NOTE
+1D160 # MUSICAL SYMBOL EIGHTH NOTE
+1D161 # MUSICAL SYMBOL SIXTEENTH NOTE
+1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE
+1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE
+1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D1BB # MUSICAL SYMBOL MINIMA
+1D1BC # MUSICAL SYMBOL MINIMA BLACK
+1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE
+1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK
+1D1BF # MUSICAL SYMBOL FUSA WHITE
+1D1C0 # MUSICAL SYMBOL FUSA BLACK
+
+# Total code points: 14
+
+# ================================================
+# (3) Singleton Decompositions
+#
+# These characters can be derived from the UnicodeData.txt file
+# by including all characters whose canonical decomposition
+# consists of a single character.
+#
+# These characters are simply quoted here for reference.
+# See also Full_Composition_Exclusion in DerivedNormalizationProps.txt
+# ================================================
+
+# 0340..0341 [2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK
+# 0343 COMBINING GREEK KORONIS
+# 0374 GREEK NUMERAL SIGN
+# 037E GREEK QUESTION MARK
+# 0387 GREEK ANO TELEIA
+# 1F71 GREEK SMALL LETTER ALPHA WITH OXIA
+# 1F73 GREEK SMALL LETTER EPSILON WITH OXIA
+# 1F75 GREEK SMALL LETTER ETA WITH OXIA
+# 1F77 GREEK SMALL LETTER IOTA WITH OXIA
+# 1F79 GREEK SMALL LETTER OMICRON WITH OXIA
+# 1F7B GREEK SMALL LETTER UPSILON WITH OXIA
+# 1F7D GREEK SMALL LETTER OMEGA WITH OXIA
+# 1FBB GREEK CAPITAL LETTER ALPHA WITH OXIA
+# 1FBE GREEK PROSGEGRAMMENI
+# 1FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA
+# 1FCB GREEK CAPITAL LETTER ETA WITH OXIA
+# 1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+# 1FDB GREEK CAPITAL LETTER IOTA WITH OXIA
+# 1FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+# 1FEB GREEK CAPITAL LETTER UPSILON WITH OXIA
+# 1FEE..1FEF [2] GREEK DIALYTIKA AND OXIA..GREEK VARIA
+# 1FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA
+# 1FFB GREEK CAPITAL LETTER OMEGA WITH OXIA
+# 1FFD GREEK OXIA
+# 2000..2001 [2] EN QUAD..EM QUAD
+# 2126 OHM SIGN
+# 212A..212B [2] KELVIN SIGN..ANGSTROM SIGN
+# 2329 LEFT-POINTING ANGLE BRACKET
+# 232A RIGHT-POINTING ANGLE BRACKET
+# F900..FA0D [270] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA0D
+# FA10 CJK COMPATIBILITY IDEOGRAPH-FA10
+# FA12 CJK COMPATIBILITY IDEOGRAPH-FA12
+# FA15..FA1E [10] CJK COMPATIBILITY IDEOGRAPH-FA15..CJK COMPATIBILITY IDEOGRAPH-FA1E
+# FA20 CJK COMPATIBILITY IDEOGRAPH-FA20
+# FA22 CJK COMPATIBILITY IDEOGRAPH-FA22
+# FA25..FA26 [2] CJK COMPATIBILITY IDEOGRAPH-FA25..CJK COMPATIBILITY IDEOGRAPH-FA26
+# FA2A..FA2D [4] CJK COMPATIBILITY IDEOGRAPH-FA2A..CJK COMPATIBILITY IDEOGRAPH-FA2D
+# FA30..FA6A [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A
+# FA70..FAD9 [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+# 2F800..2FA1D [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 1030
+
+# ================================================
+# (4) Non-Starter Decompositions
+#
+# These characters can be derived from the UnicodeData file
+# by including all characters whose canonical decomposition consists
+# of a sequence of characters, the first of which has a non-zero
+# combining class.
+#
+# These characters are simply quoted here for reference.
+# See also Full_Composition_Exclusion in DerivedNormalizationProps.txt
+# ================================================
+
+# 0344 COMBINING GREEK DIALYTIKA TONOS
+# 0F73 TIBETAN VOWEL SIGN II
+# 0F75 TIBETAN VOWEL SIGN UU
+# 0F81 TIBETAN VOWEL SIGN REVERSED II
+
+# Total code points: 4
+
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/Decomposition.pl b/Master/tlpkg/tlperl.straw/lib/unicore/Decomposition.pl
new file mode 100755
index 00000000000..b70e1f4569d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/Decomposition.pl
@@ -0,0 +1,5382 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+return <<'END';
+00A0 <noBreak> 0020
+00A8 <compat> 0020 0308
+00AA <super> 0061
+00AF <compat> 0020 0304
+00B2 <super> 0032
+00B3 <super> 0033
+00B4 <compat> 0020 0301
+00B5 <compat> 03BC
+00B8 <compat> 0020 0327
+00B9 <super> 0031
+00BA <super> 006F
+00BC <fraction> 0031 2044 0034
+00BD <fraction> 0031 2044 0032
+00BE <fraction> 0033 2044 0034
+00C0 0041 0300
+00C1 0041 0301
+00C2 0041 0302
+00C3 0041 0303
+00C4 0041 0308
+00C5 0041 030A
+00C7 0043 0327
+00C8 0045 0300
+00C9 0045 0301
+00CA 0045 0302
+00CB 0045 0308
+00CC 0049 0300
+00CD 0049 0301
+00CE 0049 0302
+00CF 0049 0308
+00D1 004E 0303
+00D2 004F 0300
+00D3 004F 0301
+00D4 004F 0302
+00D5 004F 0303
+00D6 004F 0308
+00D9 0055 0300
+00DA 0055 0301
+00DB 0055 0302
+00DC 0055 0308
+00DD 0059 0301
+00E0 0061 0300
+00E1 0061 0301
+00E2 0061 0302
+00E3 0061 0303
+00E4 0061 0308
+00E5 0061 030A
+00E7 0063 0327
+00E8 0065 0300
+00E9 0065 0301
+00EA 0065 0302
+00EB 0065 0308
+00EC 0069 0300
+00ED 0069 0301
+00EE 0069 0302
+00EF 0069 0308
+00F1 006E 0303
+00F2 006F 0300
+00F3 006F 0301
+00F4 006F 0302
+00F5 006F 0303
+00F6 006F 0308
+00F9 0075 0300
+00FA 0075 0301
+00FB 0075 0302
+00FC 0075 0308
+00FD 0079 0301
+00FF 0079 0308
+0100 0041 0304
+0101 0061 0304
+0102 0041 0306
+0103 0061 0306
+0104 0041 0328
+0105 0061 0328
+0106 0043 0301
+0107 0063 0301
+0108 0043 0302
+0109 0063 0302
+010A 0043 0307
+010B 0063 0307
+010C 0043 030C
+010D 0063 030C
+010E 0044 030C
+010F 0064 030C
+0112 0045 0304
+0113 0065 0304
+0114 0045 0306
+0115 0065 0306
+0116 0045 0307
+0117 0065 0307
+0118 0045 0328
+0119 0065 0328
+011A 0045 030C
+011B 0065 030C
+011C 0047 0302
+011D 0067 0302
+011E 0047 0306
+011F 0067 0306
+0120 0047 0307
+0121 0067 0307
+0122 0047 0327
+0123 0067 0327
+0124 0048 0302
+0125 0068 0302
+0128 0049 0303
+0129 0069 0303
+012A 0049 0304
+012B 0069 0304
+012C 0049 0306
+012D 0069 0306
+012E 0049 0328
+012F 0069 0328
+0130 0049 0307
+0132 <compat> 0049 004A
+0133 <compat> 0069 006A
+0134 004A 0302
+0135 006A 0302
+0136 004B 0327
+0137 006B 0327
+0139 004C 0301
+013A 006C 0301
+013B 004C 0327
+013C 006C 0327
+013D 004C 030C
+013E 006C 030C
+013F <compat> 004C 00B7
+0140 <compat> 006C 00B7
+0143 004E 0301
+0144 006E 0301
+0145 004E 0327
+0146 006E 0327
+0147 004E 030C
+0148 006E 030C
+0149 <compat> 02BC 006E
+014C 004F 0304
+014D 006F 0304
+014E 004F 0306
+014F 006F 0306
+0150 004F 030B
+0151 006F 030B
+0154 0052 0301
+0155 0072 0301
+0156 0052 0327
+0157 0072 0327
+0158 0052 030C
+0159 0072 030C
+015A 0053 0301
+015B 0073 0301
+015C 0053 0302
+015D 0073 0302
+015E 0053 0327
+015F 0073 0327
+0160 0053 030C
+0161 0073 030C
+0162 0054 0327
+0163 0074 0327
+0164 0054 030C
+0165 0074 030C
+0168 0055 0303
+0169 0075 0303
+016A 0055 0304
+016B 0075 0304
+016C 0055 0306
+016D 0075 0306
+016E 0055 030A
+016F 0075 030A
+0170 0055 030B
+0171 0075 030B
+0172 0055 0328
+0173 0075 0328
+0174 0057 0302
+0175 0077 0302
+0176 0059 0302
+0177 0079 0302
+0178 0059 0308
+0179 005A 0301
+017A 007A 0301
+017B 005A 0307
+017C 007A 0307
+017D 005A 030C
+017E 007A 030C
+017F <compat> 0073
+01A0 004F 031B
+01A1 006F 031B
+01AF 0055 031B
+01B0 0075 031B
+01C4 <compat> 0044 017D
+01C5 <compat> 0044 017E
+01C6 <compat> 0064 017E
+01C7 <compat> 004C 004A
+01C8 <compat> 004C 006A
+01C9 <compat> 006C 006A
+01CA <compat> 004E 004A
+01CB <compat> 004E 006A
+01CC <compat> 006E 006A
+01CD 0041 030C
+01CE 0061 030C
+01CF 0049 030C
+01D0 0069 030C
+01D1 004F 030C
+01D2 006F 030C
+01D3 0055 030C
+01D4 0075 030C
+01D5 00DC 0304
+01D6 00FC 0304
+01D7 00DC 0301
+01D8 00FC 0301
+01D9 00DC 030C
+01DA 00FC 030C
+01DB 00DC 0300
+01DC 00FC 0300
+01DE 00C4 0304
+01DF 00E4 0304
+01E0 0226 0304
+01E1 0227 0304
+01E2 00C6 0304
+01E3 00E6 0304
+01E6 0047 030C
+01E7 0067 030C
+01E8 004B 030C
+01E9 006B 030C
+01EA 004F 0328
+01EB 006F 0328
+01EC 01EA 0304
+01ED 01EB 0304
+01EE 01B7 030C
+01EF 0292 030C
+01F0 006A 030C
+01F1 <compat> 0044 005A
+01F2 <compat> 0044 007A
+01F3 <compat> 0064 007A
+01F4 0047 0301
+01F5 0067 0301
+01F8 004E 0300
+01F9 006E 0300
+01FA 00C5 0301
+01FB 00E5 0301
+01FC 00C6 0301
+01FD 00E6 0301
+01FE 00D8 0301
+01FF 00F8 0301
+0200 0041 030F
+0201 0061 030F
+0202 0041 0311
+0203 0061 0311
+0204 0045 030F
+0205 0065 030F
+0206 0045 0311
+0207 0065 0311
+0208 0049 030F
+0209 0069 030F
+020A 0049 0311
+020B 0069 0311
+020C 004F 030F
+020D 006F 030F
+020E 004F 0311
+020F 006F 0311
+0210 0052 030F
+0211 0072 030F
+0212 0052 0311
+0213 0072 0311
+0214 0055 030F
+0215 0075 030F
+0216 0055 0311
+0217 0075 0311
+0218 0053 0326
+0219 0073 0326
+021A 0054 0326
+021B 0074 0326
+021E 0048 030C
+021F 0068 030C
+0226 0041 0307
+0227 0061 0307
+0228 0045 0327
+0229 0065 0327
+022A 00D6 0304
+022B 00F6 0304
+022C 00D5 0304
+022D 00F5 0304
+022E 004F 0307
+022F 006F 0307
+0230 022E 0304
+0231 022F 0304
+0232 0059 0304
+0233 0079 0304
+02B0 <super> 0068
+02B1 <super> 0266
+02B2 <super> 006A
+02B3 <super> 0072
+02B4 <super> 0279
+02B5 <super> 027B
+02B6 <super> 0281
+02B7 <super> 0077
+02B8 <super> 0079
+02D8 <compat> 0020 0306
+02D9 <compat> 0020 0307
+02DA <compat> 0020 030A
+02DB <compat> 0020 0328
+02DC <compat> 0020 0303
+02DD <compat> 0020 030B
+02E0 <super> 0263
+02E1 <super> 006C
+02E2 <super> 0073
+02E3 <super> 0078
+02E4 <super> 0295
+0340 0300
+0341 0301
+0343 0313
+0344 0308 0301
+0374 02B9
+037A <compat> 0020 0345
+037E 003B
+0384 <compat> 0020 0301
+0385 00A8 0301
+0386 0391 0301
+0387 00B7
+0388 0395 0301
+0389 0397 0301
+038A 0399 0301
+038C 039F 0301
+038E 03A5 0301
+038F 03A9 0301
+0390 03CA 0301
+03AA 0399 0308
+03AB 03A5 0308
+03AC 03B1 0301
+03AD 03B5 0301
+03AE 03B7 0301
+03AF 03B9 0301
+03B0 03CB 0301
+03CA 03B9 0308
+03CB 03C5 0308
+03CC 03BF 0301
+03CD 03C5 0301
+03CE 03C9 0301
+03D0 <compat> 03B2
+03D1 <compat> 03B8
+03D2 <compat> 03A5
+03D3 03D2 0301
+03D4 03D2 0308
+03D5 <compat> 03C6
+03D6 <compat> 03C0
+03F0 <compat> 03BA
+03F1 <compat> 03C1
+03F2 <compat> 03C2
+03F4 <compat> 0398
+03F5 <compat> 03B5
+03F9 <compat> 03A3
+0400 0415 0300
+0401 0415 0308
+0403 0413 0301
+0407 0406 0308
+040C 041A 0301
+040D 0418 0300
+040E 0423 0306
+0419 0418 0306
+0439 0438 0306
+0450 0435 0300
+0451 0435 0308
+0453 0433 0301
+0457 0456 0308
+045C 043A 0301
+045D 0438 0300
+045E 0443 0306
+0476 0474 030F
+0477 0475 030F
+04C1 0416 0306
+04C2 0436 0306
+04D0 0410 0306
+04D1 0430 0306
+04D2 0410 0308
+04D3 0430 0308
+04D6 0415 0306
+04D7 0435 0306
+04DA 04D8 0308
+04DB 04D9 0308
+04DC 0416 0308
+04DD 0436 0308
+04DE 0417 0308
+04DF 0437 0308
+04E2 0418 0304
+04E3 0438 0304
+04E4 0418 0308
+04E5 0438 0308
+04E6 041E 0308
+04E7 043E 0308
+04EA 04E8 0308
+04EB 04E9 0308
+04EC 042D 0308
+04ED 044D 0308
+04EE 0423 0304
+04EF 0443 0304
+04F0 0423 0308
+04F1 0443 0308
+04F2 0423 030B
+04F3 0443 030B
+04F4 0427 0308
+04F5 0447 0308
+04F8 042B 0308
+04F9 044B 0308
+0587 <compat> 0565 0582
+0622 0627 0653
+0623 0627 0654
+0624 0648 0654
+0625 0627 0655
+0626 064A 0654
+0675 <compat> 0627 0674
+0676 <compat> 0648 0674
+0677 <compat> 06C7 0674
+0678 <compat> 064A 0674
+06C0 06D5 0654
+06C2 06C1 0654
+06D3 06D2 0654
+0929 0928 093C
+0931 0930 093C
+0934 0933 093C
+0958 0915 093C
+0959 0916 093C
+095A 0917 093C
+095B 091C 093C
+095C 0921 093C
+095D 0922 093C
+095E 092B 093C
+095F 092F 093C
+09CB 09C7 09BE
+09CC 09C7 09D7
+09DC 09A1 09BC
+09DD 09A2 09BC
+09DF 09AF 09BC
+0A33 0A32 0A3C
+0A36 0A38 0A3C
+0A59 0A16 0A3C
+0A5A 0A17 0A3C
+0A5B 0A1C 0A3C
+0A5E 0A2B 0A3C
+0B48 0B47 0B56
+0B4B 0B47 0B3E
+0B4C 0B47 0B57
+0B5C 0B21 0B3C
+0B5D 0B22 0B3C
+0B94 0B92 0BD7
+0BCA 0BC6 0BBE
+0BCB 0BC7 0BBE
+0BCC 0BC6 0BD7
+0C48 0C46 0C56
+0CC0 0CBF 0CD5
+0CC7 0CC6 0CD5
+0CC8 0CC6 0CD6
+0CCA 0CC6 0CC2
+0CCB 0CCA 0CD5
+0D4A 0D46 0D3E
+0D4B 0D47 0D3E
+0D4C 0D46 0D57
+0DDA 0DD9 0DCA
+0DDC 0DD9 0DCF
+0DDD 0DDC 0DCA
+0DDE 0DD9 0DDF
+0E33 <compat> 0E4D 0E32
+0EB3 <compat> 0ECD 0EB2
+0EDC <compat> 0EAB 0E99
+0EDD <compat> 0EAB 0EA1
+0F0C <noBreak> 0F0B
+0F43 0F42 0FB7
+0F4D 0F4C 0FB7
+0F52 0F51 0FB7
+0F57 0F56 0FB7
+0F5C 0F5B 0FB7
+0F69 0F40 0FB5
+0F73 0F71 0F72
+0F75 0F71 0F74
+0F76 0FB2 0F80
+0F77 <compat> 0FB2 0F81
+0F78 0FB3 0F80
+0F79 <compat> 0FB3 0F81
+0F81 0F71 0F80
+0F93 0F92 0FB7
+0F9D 0F9C 0FB7
+0FA2 0FA1 0FB7
+0FA7 0FA6 0FB7
+0FAC 0FAB 0FB7
+0FB9 0F90 0FB5
+1026 1025 102E
+10FC <super> 10DC
+1B06 1B05 1B35
+1B08 1B07 1B35
+1B0A 1B09 1B35
+1B0C 1B0B 1B35
+1B0E 1B0D 1B35
+1B12 1B11 1B35
+1B3B 1B3A 1B35
+1B3D 1B3C 1B35
+1B40 1B3E 1B35
+1B41 1B3F 1B35
+1B43 1B42 1B35
+1D2C <super> 0041
+1D2D <super> 00C6
+1D2E <super> 0042
+1D30 <super> 0044
+1D31 <super> 0045
+1D32 <super> 018E
+1D33 <super> 0047
+1D34 <super> 0048
+1D35 <super> 0049
+1D36 <super> 004A
+1D37 <super> 004B
+1D38 <super> 004C
+1D39 <super> 004D
+1D3A <super> 004E
+1D3C <super> 004F
+1D3D <super> 0222
+1D3E <super> 0050
+1D3F <super> 0052
+1D40 <super> 0054
+1D41 <super> 0055
+1D42 <super> 0057
+1D43 <super> 0061
+1D44 <super> 0250
+1D45 <super> 0251
+1D46 <super> 1D02
+1D47 <super> 0062
+1D48 <super> 0064
+1D49 <super> 0065
+1D4A <super> 0259
+1D4B <super> 025B
+1D4C <super> 025C
+1D4D <super> 0067
+1D4F <super> 006B
+1D50 <super> 006D
+1D51 <super> 014B
+1D52 <super> 006F
+1D53 <super> 0254
+1D54 <super> 1D16
+1D55 <super> 1D17
+1D56 <super> 0070
+1D57 <super> 0074
+1D58 <super> 0075
+1D59 <super> 1D1D
+1D5A <super> 026F
+1D5B <super> 0076
+1D5C <super> 1D25
+1D5D <super> 03B2
+1D5E <super> 03B3
+1D5F <super> 03B4
+1D60 <super> 03C6
+1D61 <super> 03C7
+1D62 <sub> 0069
+1D63 <sub> 0072
+1D64 <sub> 0075
+1D65 <sub> 0076
+1D66 <sub> 03B2
+1D67 <sub> 03B3
+1D68 <sub> 03C1
+1D69 <sub> 03C6
+1D6A <sub> 03C7
+1D78 <super> 043D
+1D9B <super> 0252
+1D9C <super> 0063
+1D9D <super> 0255
+1D9E <super> 00F0
+1D9F <super> 025C
+1DA0 <super> 0066
+1DA1 <super> 025F
+1DA2 <super> 0261
+1DA3 <super> 0265
+1DA4 <super> 0268
+1DA5 <super> 0269
+1DA6 <super> 026A
+1DA7 <super> 1D7B
+1DA8 <super> 029D
+1DA9 <super> 026D
+1DAA <super> 1D85
+1DAB <super> 029F
+1DAC <super> 0271
+1DAD <super> 0270
+1DAE <super> 0272
+1DAF <super> 0273
+1DB0 <super> 0274
+1DB1 <super> 0275
+1DB2 <super> 0278
+1DB3 <super> 0282
+1DB4 <super> 0283
+1DB5 <super> 01AB
+1DB6 <super> 0289
+1DB7 <super> 028A
+1DB8 <super> 1D1C
+1DB9 <super> 028B
+1DBA <super> 028C
+1DBB <super> 007A
+1DBC <super> 0290
+1DBD <super> 0291
+1DBE <super> 0292
+1DBF <super> 03B8
+1E00 0041 0325
+1E01 0061 0325
+1E02 0042 0307
+1E03 0062 0307
+1E04 0042 0323
+1E05 0062 0323
+1E06 0042 0331
+1E07 0062 0331
+1E08 00C7 0301
+1E09 00E7 0301
+1E0A 0044 0307
+1E0B 0064 0307
+1E0C 0044 0323
+1E0D 0064 0323
+1E0E 0044 0331
+1E0F 0064 0331
+1E10 0044 0327
+1E11 0064 0327
+1E12 0044 032D
+1E13 0064 032D
+1E14 0112 0300
+1E15 0113 0300
+1E16 0112 0301
+1E17 0113 0301
+1E18 0045 032D
+1E19 0065 032D
+1E1A 0045 0330
+1E1B 0065 0330
+1E1C 0228 0306
+1E1D 0229 0306
+1E1E 0046 0307
+1E1F 0066 0307
+1E20 0047 0304
+1E21 0067 0304
+1E22 0048 0307
+1E23 0068 0307
+1E24 0048 0323
+1E25 0068 0323
+1E26 0048 0308
+1E27 0068 0308
+1E28 0048 0327
+1E29 0068 0327
+1E2A 0048 032E
+1E2B 0068 032E
+1E2C 0049 0330
+1E2D 0069 0330
+1E2E 00CF 0301
+1E2F 00EF 0301
+1E30 004B 0301
+1E31 006B 0301
+1E32 004B 0323
+1E33 006B 0323
+1E34 004B 0331
+1E35 006B 0331
+1E36 004C 0323
+1E37 006C 0323
+1E38 1E36 0304
+1E39 1E37 0304
+1E3A 004C 0331
+1E3B 006C 0331
+1E3C 004C 032D
+1E3D 006C 032D
+1E3E 004D 0301
+1E3F 006D 0301
+1E40 004D 0307
+1E41 006D 0307
+1E42 004D 0323
+1E43 006D 0323
+1E44 004E 0307
+1E45 006E 0307
+1E46 004E 0323
+1E47 006E 0323
+1E48 004E 0331
+1E49 006E 0331
+1E4A 004E 032D
+1E4B 006E 032D
+1E4C 00D5 0301
+1E4D 00F5 0301
+1E4E 00D5 0308
+1E4F 00F5 0308
+1E50 014C 0300
+1E51 014D 0300
+1E52 014C 0301
+1E53 014D 0301
+1E54 0050 0301
+1E55 0070 0301
+1E56 0050 0307
+1E57 0070 0307
+1E58 0052 0307
+1E59 0072 0307
+1E5A 0052 0323
+1E5B 0072 0323
+1E5C 1E5A 0304
+1E5D 1E5B 0304
+1E5E 0052 0331
+1E5F 0072 0331
+1E60 0053 0307
+1E61 0073 0307
+1E62 0053 0323
+1E63 0073 0323
+1E64 015A 0307
+1E65 015B 0307
+1E66 0160 0307
+1E67 0161 0307
+1E68 1E62 0307
+1E69 1E63 0307
+1E6A 0054 0307
+1E6B 0074 0307
+1E6C 0054 0323
+1E6D 0074 0323
+1E6E 0054 0331
+1E6F 0074 0331
+1E70 0054 032D
+1E71 0074 032D
+1E72 0055 0324
+1E73 0075 0324
+1E74 0055 0330
+1E75 0075 0330
+1E76 0055 032D
+1E77 0075 032D
+1E78 0168 0301
+1E79 0169 0301
+1E7A 016A 0308
+1E7B 016B 0308
+1E7C 0056 0303
+1E7D 0076 0303
+1E7E 0056 0323
+1E7F 0076 0323
+1E80 0057 0300
+1E81 0077 0300
+1E82 0057 0301
+1E83 0077 0301
+1E84 0057 0308
+1E85 0077 0308
+1E86 0057 0307
+1E87 0077 0307
+1E88 0057 0323
+1E89 0077 0323
+1E8A 0058 0307
+1E8B 0078 0307
+1E8C 0058 0308
+1E8D 0078 0308
+1E8E 0059 0307
+1E8F 0079 0307
+1E90 005A 0302
+1E91 007A 0302
+1E92 005A 0323
+1E93 007A 0323
+1E94 005A 0331
+1E95 007A 0331
+1E96 0068 0331
+1E97 0074 0308
+1E98 0077 030A
+1E99 0079 030A
+1E9A <compat> 0061 02BE
+1E9B 017F 0307
+1EA0 0041 0323
+1EA1 0061 0323
+1EA2 0041 0309
+1EA3 0061 0309
+1EA4 00C2 0301
+1EA5 00E2 0301
+1EA6 00C2 0300
+1EA7 00E2 0300
+1EA8 00C2 0309
+1EA9 00E2 0309
+1EAA 00C2 0303
+1EAB 00E2 0303
+1EAC 1EA0 0302
+1EAD 1EA1 0302
+1EAE 0102 0301
+1EAF 0103 0301
+1EB0 0102 0300
+1EB1 0103 0300
+1EB2 0102 0309
+1EB3 0103 0309
+1EB4 0102 0303
+1EB5 0103 0303
+1EB6 1EA0 0306
+1EB7 1EA1 0306
+1EB8 0045 0323
+1EB9 0065 0323
+1EBA 0045 0309
+1EBB 0065 0309
+1EBC 0045 0303
+1EBD 0065 0303
+1EBE 00CA 0301
+1EBF 00EA 0301
+1EC0 00CA 0300
+1EC1 00EA 0300
+1EC2 00CA 0309
+1EC3 00EA 0309
+1EC4 00CA 0303
+1EC5 00EA 0303
+1EC6 1EB8 0302
+1EC7 1EB9 0302
+1EC8 0049 0309
+1EC9 0069 0309
+1ECA 0049 0323
+1ECB 0069 0323
+1ECC 004F 0323
+1ECD 006F 0323
+1ECE 004F 0309
+1ECF 006F 0309
+1ED0 00D4 0301
+1ED1 00F4 0301
+1ED2 00D4 0300
+1ED3 00F4 0300
+1ED4 00D4 0309
+1ED5 00F4 0309
+1ED6 00D4 0303
+1ED7 00F4 0303
+1ED8 1ECC 0302
+1ED9 1ECD 0302
+1EDA 01A0 0301
+1EDB 01A1 0301
+1EDC 01A0 0300
+1EDD 01A1 0300
+1EDE 01A0 0309
+1EDF 01A1 0309
+1EE0 01A0 0303
+1EE1 01A1 0303
+1EE2 01A0 0323
+1EE3 01A1 0323
+1EE4 0055 0323
+1EE5 0075 0323
+1EE6 0055 0309
+1EE7 0075 0309
+1EE8 01AF 0301
+1EE9 01B0 0301
+1EEA 01AF 0300
+1EEB 01B0 0300
+1EEC 01AF 0309
+1EED 01B0 0309
+1EEE 01AF 0303
+1EEF 01B0 0303
+1EF0 01AF 0323
+1EF1 01B0 0323
+1EF2 0059 0300
+1EF3 0079 0300
+1EF4 0059 0323
+1EF5 0079 0323
+1EF6 0059 0309
+1EF7 0079 0309
+1EF8 0059 0303
+1EF9 0079 0303
+1F00 03B1 0313
+1F01 03B1 0314
+1F02 1F00 0300
+1F03 1F01 0300
+1F04 1F00 0301
+1F05 1F01 0301
+1F06 1F00 0342
+1F07 1F01 0342
+1F08 0391 0313
+1F09 0391 0314
+1F0A 1F08 0300
+1F0B 1F09 0300
+1F0C 1F08 0301
+1F0D 1F09 0301
+1F0E 1F08 0342
+1F0F 1F09 0342
+1F10 03B5 0313
+1F11 03B5 0314
+1F12 1F10 0300
+1F13 1F11 0300
+1F14 1F10 0301
+1F15 1F11 0301
+1F18 0395 0313
+1F19 0395 0314
+1F1A 1F18 0300
+1F1B 1F19 0300
+1F1C 1F18 0301
+1F1D 1F19 0301
+1F20 03B7 0313
+1F21 03B7 0314
+1F22 1F20 0300
+1F23 1F21 0300
+1F24 1F20 0301
+1F25 1F21 0301
+1F26 1F20 0342
+1F27 1F21 0342
+1F28 0397 0313
+1F29 0397 0314
+1F2A 1F28 0300
+1F2B 1F29 0300
+1F2C 1F28 0301
+1F2D 1F29 0301
+1F2E 1F28 0342
+1F2F 1F29 0342
+1F30 03B9 0313
+1F31 03B9 0314
+1F32 1F30 0300
+1F33 1F31 0300
+1F34 1F30 0301
+1F35 1F31 0301
+1F36 1F30 0342
+1F37 1F31 0342
+1F38 0399 0313
+1F39 0399 0314
+1F3A 1F38 0300
+1F3B 1F39 0300
+1F3C 1F38 0301
+1F3D 1F39 0301
+1F3E 1F38 0342
+1F3F 1F39 0342
+1F40 03BF 0313
+1F41 03BF 0314
+1F42 1F40 0300
+1F43 1F41 0300
+1F44 1F40 0301
+1F45 1F41 0301
+1F48 039F 0313
+1F49 039F 0314
+1F4A 1F48 0300
+1F4B 1F49 0300
+1F4C 1F48 0301
+1F4D 1F49 0301
+1F50 03C5 0313
+1F51 03C5 0314
+1F52 1F50 0300
+1F53 1F51 0300
+1F54 1F50 0301
+1F55 1F51 0301
+1F56 1F50 0342
+1F57 1F51 0342
+1F59 03A5 0314
+1F5B 1F59 0300
+1F5D 1F59 0301
+1F5F 1F59 0342
+1F60 03C9 0313
+1F61 03C9 0314
+1F62 1F60 0300
+1F63 1F61 0300
+1F64 1F60 0301
+1F65 1F61 0301
+1F66 1F60 0342
+1F67 1F61 0342
+1F68 03A9 0313
+1F69 03A9 0314
+1F6A 1F68 0300
+1F6B 1F69 0300
+1F6C 1F68 0301
+1F6D 1F69 0301
+1F6E 1F68 0342
+1F6F 1F69 0342
+1F70 03B1 0300
+1F71 03AC
+1F72 03B5 0300
+1F73 03AD
+1F74 03B7 0300
+1F75 03AE
+1F76 03B9 0300
+1F77 03AF
+1F78 03BF 0300
+1F79 03CC
+1F7A 03C5 0300
+1F7B 03CD
+1F7C 03C9 0300
+1F7D 03CE
+1F80 1F00 0345
+1F81 1F01 0345
+1F82 1F02 0345
+1F83 1F03 0345
+1F84 1F04 0345
+1F85 1F05 0345
+1F86 1F06 0345
+1F87 1F07 0345
+1F88 1F08 0345
+1F89 1F09 0345
+1F8A 1F0A 0345
+1F8B 1F0B 0345
+1F8C 1F0C 0345
+1F8D 1F0D 0345
+1F8E 1F0E 0345
+1F8F 1F0F 0345
+1F90 1F20 0345
+1F91 1F21 0345
+1F92 1F22 0345
+1F93 1F23 0345
+1F94 1F24 0345
+1F95 1F25 0345
+1F96 1F26 0345
+1F97 1F27 0345
+1F98 1F28 0345
+1F99 1F29 0345
+1F9A 1F2A 0345
+1F9B 1F2B 0345
+1F9C 1F2C 0345
+1F9D 1F2D 0345
+1F9E 1F2E 0345
+1F9F 1F2F 0345
+1FA0 1F60 0345
+1FA1 1F61 0345
+1FA2 1F62 0345
+1FA3 1F63 0345
+1FA4 1F64 0345
+1FA5 1F65 0345
+1FA6 1F66 0345
+1FA7 1F67 0345
+1FA8 1F68 0345
+1FA9 1F69 0345
+1FAA 1F6A 0345
+1FAB 1F6B 0345
+1FAC 1F6C 0345
+1FAD 1F6D 0345
+1FAE 1F6E 0345
+1FAF 1F6F 0345
+1FB0 03B1 0306
+1FB1 03B1 0304
+1FB2 1F70 0345
+1FB3 03B1 0345
+1FB4 03AC 0345
+1FB6 03B1 0342
+1FB7 1FB6 0345
+1FB8 0391 0306
+1FB9 0391 0304
+1FBA 0391 0300
+1FBB 0386
+1FBC 0391 0345
+1FBD <compat> 0020 0313
+1FBE 03B9
+1FBF <compat> 0020 0313
+1FC0 <compat> 0020 0342
+1FC1 00A8 0342
+1FC2 1F74 0345
+1FC3 03B7 0345
+1FC4 03AE 0345
+1FC6 03B7 0342
+1FC7 1FC6 0345
+1FC8 0395 0300
+1FC9 0388
+1FCA 0397 0300
+1FCB 0389
+1FCC 0397 0345
+1FCD 1FBF 0300
+1FCE 1FBF 0301
+1FCF 1FBF 0342
+1FD0 03B9 0306
+1FD1 03B9 0304
+1FD2 03CA 0300
+1FD3 0390
+1FD6 03B9 0342
+1FD7 03CA 0342
+1FD8 0399 0306
+1FD9 0399 0304
+1FDA 0399 0300
+1FDB 038A
+1FDD 1FFE 0300
+1FDE 1FFE 0301
+1FDF 1FFE 0342
+1FE0 03C5 0306
+1FE1 03C5 0304
+1FE2 03CB 0300
+1FE3 03B0
+1FE4 03C1 0313
+1FE5 03C1 0314
+1FE6 03C5 0342
+1FE7 03CB 0342
+1FE8 03A5 0306
+1FE9 03A5 0304
+1FEA 03A5 0300
+1FEB 038E
+1FEC 03A1 0314
+1FED 00A8 0300
+1FEE 0385
+1FEF 0060
+1FF2 1F7C 0345
+1FF3 03C9 0345
+1FF4 03CE 0345
+1FF6 03C9 0342
+1FF7 1FF6 0345
+1FF8 039F 0300
+1FF9 038C
+1FFA 03A9 0300
+1FFB 038F
+1FFC 03A9 0345
+1FFD 00B4
+1FFE <compat> 0020 0314
+2000 2002
+2001 2003
+2002 2006 <compat> 0020
+2007 <noBreak> 0020
+2008 200A <compat> 0020
+2011 <noBreak> 2010
+2017 <compat> 0020 0333
+2024 <compat> 002E
+2025 <compat> 002E 002E
+2026 <compat> 002E 002E 002E
+202F <noBreak> 0020
+2033 <compat> 2032 2032
+2034 <compat> 2032 2032 2032
+2036 <compat> 2035 2035
+2037 <compat> 2035 2035 2035
+203C <compat> 0021 0021
+203E <compat> 0020 0305
+2047 <compat> 003F 003F
+2048 <compat> 003F 0021
+2049 <compat> 0021 003F
+2057 <compat> 2032 2032 2032 2032
+205F <compat> 0020
+2070 <super> 0030
+2071 <super> 0069
+2074 <super> 0034
+2075 <super> 0035
+2076 <super> 0036
+2077 <super> 0037
+2078 <super> 0038
+2079 <super> 0039
+207A <super> 002B
+207B <super> 2212
+207C <super> 003D
+207D <super> 0028
+207E <super> 0029
+207F <super> 006E
+2080 <sub> 0030
+2081 <sub> 0031
+2082 <sub> 0032
+2083 <sub> 0033
+2084 <sub> 0034
+2085 <sub> 0035
+2086 <sub> 0036
+2087 <sub> 0037
+2088 <sub> 0038
+2089 <sub> 0039
+208A <sub> 002B
+208B <sub> 2212
+208C <sub> 003D
+208D <sub> 0028
+208E <sub> 0029
+2090 <sub> 0061
+2091 <sub> 0065
+2092 <sub> 006F
+2093 <sub> 0078
+2094 <sub> 0259
+20A8 <compat> 0052 0073
+2100 <compat> 0061 002F 0063
+2101 <compat> 0061 002F 0073
+2102 <font> 0043
+2103 <compat> 00B0 0043
+2105 <compat> 0063 002F 006F
+2106 <compat> 0063 002F 0075
+2107 <compat> 0190
+2109 <compat> 00B0 0046
+210A <font> 0067
+210B 210D <font> 0048
+210E <font> 0068
+210F <font> 0127
+2110 2111 <font> 0049
+2112 <font> 004C
+2113 <font> 006C
+2115 <font> 004E
+2116 <compat> 004E 006F
+2119 <font> 0050
+211A <font> 0051
+211B 211D <font> 0052
+2120 <super> 0053 004D
+2121 <compat> 0054 0045 004C
+2122 <super> 0054 004D
+2124 <font> 005A
+2126 03A9
+2128 <font> 005A
+212A 004B
+212B 00C5
+212C <font> 0042
+212D <font> 0043
+212F <font> 0065
+2130 <font> 0045
+2131 <font> 0046
+2133 <font> 004D
+2134 <font> 006F
+2135 <compat> 05D0
+2136 <compat> 05D1
+2137 <compat> 05D2
+2138 <compat> 05D3
+2139 <font> 0069
+213B <compat> 0046 0041 0058
+213C <font> 03C0
+213D <font> 03B3
+213E <font> 0393
+213F <font> 03A0
+2140 <font> 2211
+2145 <font> 0044
+2146 <font> 0064
+2147 <font> 0065
+2148 <font> 0069
+2149 <font> 006A
+2153 <fraction> 0031 2044 0033
+2154 <fraction> 0032 2044 0033
+2155 <fraction> 0031 2044 0035
+2156 <fraction> 0032 2044 0035
+2157 <fraction> 0033 2044 0035
+2158 <fraction> 0034 2044 0035
+2159 <fraction> 0031 2044 0036
+215A <fraction> 0035 2044 0036
+215B <fraction> 0031 2044 0038
+215C <fraction> 0033 2044 0038
+215D <fraction> 0035 2044 0038
+215E <fraction> 0037 2044 0038
+215F <fraction> 0031 2044
+2160 <compat> 0049
+2161 <compat> 0049 0049
+2162 <compat> 0049 0049 0049
+2163 <compat> 0049 0056
+2164 <compat> 0056
+2165 <compat> 0056 0049
+2166 <compat> 0056 0049 0049
+2167 <compat> 0056 0049 0049 0049
+2168 <compat> 0049 0058
+2169 <compat> 0058
+216A <compat> 0058 0049
+216B <compat> 0058 0049 0049
+216C <compat> 004C
+216D <compat> 0043
+216E <compat> 0044
+216F <compat> 004D
+2170 <compat> 0069
+2171 <compat> 0069 0069
+2172 <compat> 0069 0069 0069
+2173 <compat> 0069 0076
+2174 <compat> 0076
+2175 <compat> 0076 0069
+2176 <compat> 0076 0069 0069
+2177 <compat> 0076 0069 0069 0069
+2178 <compat> 0069 0078
+2179 <compat> 0078
+217A <compat> 0078 0069
+217B <compat> 0078 0069 0069
+217C <compat> 006C
+217D <compat> 0063
+217E <compat> 0064
+217F <compat> 006D
+219A 2190 0338
+219B 2192 0338
+21AE 2194 0338
+21CD 21D0 0338
+21CE 21D4 0338
+21CF 21D2 0338
+2204 2203 0338
+2209 2208 0338
+220C 220B 0338
+2224 2223 0338
+2226 2225 0338
+222C <compat> 222B 222B
+222D <compat> 222B 222B 222B
+222F <compat> 222E 222E
+2230 <compat> 222E 222E 222E
+2241 223C 0338
+2244 2243 0338
+2247 2245 0338
+2249 2248 0338
+2260 003D 0338
+2262 2261 0338
+226D 224D 0338
+226E 003C 0338
+226F 003E 0338
+2270 2264 0338
+2271 2265 0338
+2274 2272 0338
+2275 2273 0338
+2278 2276 0338
+2279 2277 0338
+2280 227A 0338
+2281 227B 0338
+2284 2282 0338
+2285 2283 0338
+2288 2286 0338
+2289 2287 0338
+22AC 22A2 0338
+22AD 22A8 0338
+22AE 22A9 0338
+22AF 22AB 0338
+22E0 227C 0338
+22E1 227D 0338
+22E2 2291 0338
+22E3 2292 0338
+22EA 22B2 0338
+22EB 22B3 0338
+22EC 22B4 0338
+22ED 22B5 0338
+2329 3008
+232A 3009
+2460 <circle> 0031
+2461 <circle> 0032
+2462 <circle> 0033
+2463 <circle> 0034
+2464 <circle> 0035
+2465 <circle> 0036
+2466 <circle> 0037
+2467 <circle> 0038
+2468 <circle> 0039
+2469 <circle> 0031 0030
+246A <circle> 0031 0031
+246B <circle> 0031 0032
+246C <circle> 0031 0033
+246D <circle> 0031 0034
+246E <circle> 0031 0035
+246F <circle> 0031 0036
+2470 <circle> 0031 0037
+2471 <circle> 0031 0038
+2472 <circle> 0031 0039
+2473 <circle> 0032 0030
+2474 <compat> 0028 0031 0029
+2475 <compat> 0028 0032 0029
+2476 <compat> 0028 0033 0029
+2477 <compat> 0028 0034 0029
+2478 <compat> 0028 0035 0029
+2479 <compat> 0028 0036 0029
+247A <compat> 0028 0037 0029
+247B <compat> 0028 0038 0029
+247C <compat> 0028 0039 0029
+247D <compat> 0028 0031 0030 0029
+247E <compat> 0028 0031 0031 0029
+247F <compat> 0028 0031 0032 0029
+2480 <compat> 0028 0031 0033 0029
+2481 <compat> 0028 0031 0034 0029
+2482 <compat> 0028 0031 0035 0029
+2483 <compat> 0028 0031 0036 0029
+2484 <compat> 0028 0031 0037 0029
+2485 <compat> 0028 0031 0038 0029
+2486 <compat> 0028 0031 0039 0029
+2487 <compat> 0028 0032 0030 0029
+2488 <compat> 0031 002E
+2489 <compat> 0032 002E
+248A <compat> 0033 002E
+248B <compat> 0034 002E
+248C <compat> 0035 002E
+248D <compat> 0036 002E
+248E <compat> 0037 002E
+248F <compat> 0038 002E
+2490 <compat> 0039 002E
+2491 <compat> 0031 0030 002E
+2492 <compat> 0031 0031 002E
+2493 <compat> 0031 0032 002E
+2494 <compat> 0031 0033 002E
+2495 <compat> 0031 0034 002E
+2496 <compat> 0031 0035 002E
+2497 <compat> 0031 0036 002E
+2498 <compat> 0031 0037 002E
+2499 <compat> 0031 0038 002E
+249A <compat> 0031 0039 002E
+249B <compat> 0032 0030 002E
+249C <compat> 0028 0061 0029
+249D <compat> 0028 0062 0029
+249E <compat> 0028 0063 0029
+249F <compat> 0028 0064 0029
+24A0 <compat> 0028 0065 0029
+24A1 <compat> 0028 0066 0029
+24A2 <compat> 0028 0067 0029
+24A3 <compat> 0028 0068 0029
+24A4 <compat> 0028 0069 0029
+24A5 <compat> 0028 006A 0029
+24A6 <compat> 0028 006B 0029
+24A7 <compat> 0028 006C 0029
+24A8 <compat> 0028 006D 0029
+24A9 <compat> 0028 006E 0029
+24AA <compat> 0028 006F 0029
+24AB <compat> 0028 0070 0029
+24AC <compat> 0028 0071 0029
+24AD <compat> 0028 0072 0029
+24AE <compat> 0028 0073 0029
+24AF <compat> 0028 0074 0029
+24B0 <compat> 0028 0075 0029
+24B1 <compat> 0028 0076 0029
+24B2 <compat> 0028 0077 0029
+24B3 <compat> 0028 0078 0029
+24B4 <compat> 0028 0079 0029
+24B5 <compat> 0028 007A 0029
+24B6 <circle> 0041
+24B7 <circle> 0042
+24B8 <circle> 0043
+24B9 <circle> 0044
+24BA <circle> 0045
+24BB <circle> 0046
+24BC <circle> 0047
+24BD <circle> 0048
+24BE <circle> 0049
+24BF <circle> 004A
+24C0 <circle> 004B
+24C1 <circle> 004C
+24C2 <circle> 004D
+24C3 <circle> 004E
+24C4 <circle> 004F
+24C5 <circle> 0050
+24C6 <circle> 0051
+24C7 <circle> 0052
+24C8 <circle> 0053
+24C9 <circle> 0054
+24CA <circle> 0055
+24CB <circle> 0056
+24CC <circle> 0057
+24CD <circle> 0058
+24CE <circle> 0059
+24CF <circle> 005A
+24D0 <circle> 0061
+24D1 <circle> 0062
+24D2 <circle> 0063
+24D3 <circle> 0064
+24D4 <circle> 0065
+24D5 <circle> 0066
+24D6 <circle> 0067
+24D7 <circle> 0068
+24D8 <circle> 0069
+24D9 <circle> 006A
+24DA <circle> 006B
+24DB <circle> 006C
+24DC <circle> 006D
+24DD <circle> 006E
+24DE <circle> 006F
+24DF <circle> 0070
+24E0 <circle> 0071
+24E1 <circle> 0072
+24E2 <circle> 0073
+24E3 <circle> 0074
+24E4 <circle> 0075
+24E5 <circle> 0076
+24E6 <circle> 0077
+24E7 <circle> 0078
+24E8 <circle> 0079
+24E9 <circle> 007A
+24EA <circle> 0030
+2A0C <compat> 222B 222B 222B 222B
+2A74 <compat> 003A 003A 003D
+2A75 <compat> 003D 003D
+2A76 <compat> 003D 003D 003D
+2ADC 2ADD 0338
+2C7C <sub> 006A
+2C7D <super> 0056
+2D6F <super> 2D61
+2E9F <compat> 6BCD
+2EF3 <compat> 9F9F
+2F00 <compat> 4E00
+2F01 <compat> 4E28
+2F02 <compat> 4E36
+2F03 <compat> 4E3F
+2F04 <compat> 4E59
+2F05 <compat> 4E85
+2F06 <compat> 4E8C
+2F07 <compat> 4EA0
+2F08 <compat> 4EBA
+2F09 <compat> 513F
+2F0A <compat> 5165
+2F0B <compat> 516B
+2F0C <compat> 5182
+2F0D <compat> 5196
+2F0E <compat> 51AB
+2F0F <compat> 51E0
+2F10 <compat> 51F5
+2F11 <compat> 5200
+2F12 <compat> 529B
+2F13 <compat> 52F9
+2F14 <compat> 5315
+2F15 <compat> 531A
+2F16 <compat> 5338
+2F17 <compat> 5341
+2F18 <compat> 535C
+2F19 <compat> 5369
+2F1A <compat> 5382
+2F1B <compat> 53B6
+2F1C <compat> 53C8
+2F1D <compat> 53E3
+2F1E <compat> 56D7
+2F1F <compat> 571F
+2F20 <compat> 58EB
+2F21 <compat> 5902
+2F22 <compat> 590A
+2F23 <compat> 5915
+2F24 <compat> 5927
+2F25 <compat> 5973
+2F26 <compat> 5B50
+2F27 <compat> 5B80
+2F28 <compat> 5BF8
+2F29 <compat> 5C0F
+2F2A <compat> 5C22
+2F2B <compat> 5C38
+2F2C <compat> 5C6E
+2F2D <compat> 5C71
+2F2E <compat> 5DDB
+2F2F <compat> 5DE5
+2F30 <compat> 5DF1
+2F31 <compat> 5DFE
+2F32 <compat> 5E72
+2F33 <compat> 5E7A
+2F34 <compat> 5E7F
+2F35 <compat> 5EF4
+2F36 <compat> 5EFE
+2F37 <compat> 5F0B
+2F38 <compat> 5F13
+2F39 <compat> 5F50
+2F3A <compat> 5F61
+2F3B <compat> 5F73
+2F3C <compat> 5FC3
+2F3D <compat> 6208
+2F3E <compat> 6236
+2F3F <compat> 624B
+2F40 <compat> 652F
+2F41 <compat> 6534
+2F42 <compat> 6587
+2F43 <compat> 6597
+2F44 <compat> 65A4
+2F45 <compat> 65B9
+2F46 <compat> 65E0
+2F47 <compat> 65E5
+2F48 <compat> 66F0
+2F49 <compat> 6708
+2F4A <compat> 6728
+2F4B <compat> 6B20
+2F4C <compat> 6B62
+2F4D <compat> 6B79
+2F4E <compat> 6BB3
+2F4F <compat> 6BCB
+2F50 <compat> 6BD4
+2F51 <compat> 6BDB
+2F52 <compat> 6C0F
+2F53 <compat> 6C14
+2F54 <compat> 6C34
+2F55 <compat> 706B
+2F56 <compat> 722A
+2F57 <compat> 7236
+2F58 <compat> 723B
+2F59 <compat> 723F
+2F5A <compat> 7247
+2F5B <compat> 7259
+2F5C <compat> 725B
+2F5D <compat> 72AC
+2F5E <compat> 7384
+2F5F <compat> 7389
+2F60 <compat> 74DC
+2F61 <compat> 74E6
+2F62 <compat> 7518
+2F63 <compat> 751F
+2F64 <compat> 7528
+2F65 <compat> 7530
+2F66 <compat> 758B
+2F67 <compat> 7592
+2F68 <compat> 7676
+2F69 <compat> 767D
+2F6A <compat> 76AE
+2F6B <compat> 76BF
+2F6C <compat> 76EE
+2F6D <compat> 77DB
+2F6E <compat> 77E2
+2F6F <compat> 77F3
+2F70 <compat> 793A
+2F71 <compat> 79B8
+2F72 <compat> 79BE
+2F73 <compat> 7A74
+2F74 <compat> 7ACB
+2F75 <compat> 7AF9
+2F76 <compat> 7C73
+2F77 <compat> 7CF8
+2F78 <compat> 7F36
+2F79 <compat> 7F51
+2F7A <compat> 7F8A
+2F7B <compat> 7FBD
+2F7C <compat> 8001
+2F7D <compat> 800C
+2F7E <compat> 8012
+2F7F <compat> 8033
+2F80 <compat> 807F
+2F81 <compat> 8089
+2F82 <compat> 81E3
+2F83 <compat> 81EA
+2F84 <compat> 81F3
+2F85 <compat> 81FC
+2F86 <compat> 820C
+2F87 <compat> 821B
+2F88 <compat> 821F
+2F89 <compat> 826E
+2F8A <compat> 8272
+2F8B <compat> 8278
+2F8C <compat> 864D
+2F8D <compat> 866B
+2F8E <compat> 8840
+2F8F <compat> 884C
+2F90 <compat> 8863
+2F91 <compat> 897E
+2F92 <compat> 898B
+2F93 <compat> 89D2
+2F94 <compat> 8A00
+2F95 <compat> 8C37
+2F96 <compat> 8C46
+2F97 <compat> 8C55
+2F98 <compat> 8C78
+2F99 <compat> 8C9D
+2F9A <compat> 8D64
+2F9B <compat> 8D70
+2F9C <compat> 8DB3
+2F9D <compat> 8EAB
+2F9E <compat> 8ECA
+2F9F <compat> 8F9B
+2FA0 <compat> 8FB0
+2FA1 <compat> 8FB5
+2FA2 <compat> 9091
+2FA3 <compat> 9149
+2FA4 <compat> 91C6
+2FA5 <compat> 91CC
+2FA6 <compat> 91D1
+2FA7 <compat> 9577
+2FA8 <compat> 9580
+2FA9 <compat> 961C
+2FAA <compat> 96B6
+2FAB <compat> 96B9
+2FAC <compat> 96E8
+2FAD <compat> 9751
+2FAE <compat> 975E
+2FAF <compat> 9762
+2FB0 <compat> 9769
+2FB1 <compat> 97CB
+2FB2 <compat> 97ED
+2FB3 <compat> 97F3
+2FB4 <compat> 9801
+2FB5 <compat> 98A8
+2FB6 <compat> 98DB
+2FB7 <compat> 98DF
+2FB8 <compat> 9996
+2FB9 <compat> 9999
+2FBA <compat> 99AC
+2FBB <compat> 9AA8
+2FBC <compat> 9AD8
+2FBD <compat> 9ADF
+2FBE <compat> 9B25
+2FBF <compat> 9B2F
+2FC0 <compat> 9B32
+2FC1 <compat> 9B3C
+2FC2 <compat> 9B5A
+2FC3 <compat> 9CE5
+2FC4 <compat> 9E75
+2FC5 <compat> 9E7F
+2FC6 <compat> 9EA5
+2FC7 <compat> 9EBB
+2FC8 <compat> 9EC3
+2FC9 <compat> 9ECD
+2FCA <compat> 9ED1
+2FCB <compat> 9EF9
+2FCC <compat> 9EFD
+2FCD <compat> 9F0E
+2FCE <compat> 9F13
+2FCF <compat> 9F20
+2FD0 <compat> 9F3B
+2FD1 <compat> 9F4A
+2FD2 <compat> 9F52
+2FD3 <compat> 9F8D
+2FD4 <compat> 9F9C
+2FD5 <compat> 9FA0
+3000 <wide> 0020
+3036 <compat> 3012
+3038 <compat> 5341
+3039 <compat> 5344
+303A <compat> 5345
+304C 304B 3099
+304E 304D 3099
+3050 304F 3099
+3052 3051 3099
+3054 3053 3099
+3056 3055 3099
+3058 3057 3099
+305A 3059 3099
+305C 305B 3099
+305E 305D 3099
+3060 305F 3099
+3062 3061 3099
+3065 3064 3099
+3067 3066 3099
+3069 3068 3099
+3070 306F 3099
+3071 306F 309A
+3073 3072 3099
+3074 3072 309A
+3076 3075 3099
+3077 3075 309A
+3079 3078 3099
+307A 3078 309A
+307C 307B 3099
+307D 307B 309A
+3094 3046 3099
+309B <compat> 0020 3099
+309C <compat> 0020 309A
+309E 309D 3099
+309F <vertical> 3088 308A
+30AC 30AB 3099
+30AE 30AD 3099
+30B0 30AF 3099
+30B2 30B1 3099
+30B4 30B3 3099
+30B6 30B5 3099
+30B8 30B7 3099
+30BA 30B9 3099
+30BC 30BB 3099
+30BE 30BD 3099
+30C0 30BF 3099
+30C2 30C1 3099
+30C5 30C4 3099
+30C7 30C6 3099
+30C9 30C8 3099
+30D0 30CF 3099
+30D1 30CF 309A
+30D3 30D2 3099
+30D4 30D2 309A
+30D6 30D5 3099
+30D7 30D5 309A
+30D9 30D8 3099
+30DA 30D8 309A
+30DC 30DB 3099
+30DD 30DB 309A
+30F4 30A6 3099
+30F7 30EF 3099
+30F8 30F0 3099
+30F9 30F1 3099
+30FA 30F2 3099
+30FE 30FD 3099
+30FF <vertical> 30B3 30C8
+3131 <compat> 1100
+3132 <compat> 1101
+3133 <compat> 11AA
+3134 <compat> 1102
+3135 <compat> 11AC
+3136 <compat> 11AD
+3137 <compat> 1103
+3138 <compat> 1104
+3139 <compat> 1105
+313A <compat> 11B0
+313B <compat> 11B1
+313C <compat> 11B2
+313D <compat> 11B3
+313E <compat> 11B4
+313F <compat> 11B5
+3140 <compat> 111A
+3141 <compat> 1106
+3142 <compat> 1107
+3143 <compat> 1108
+3144 <compat> 1121
+3145 <compat> 1109
+3146 <compat> 110A
+3147 <compat> 110B
+3148 <compat> 110C
+3149 <compat> 110D
+314A <compat> 110E
+314B <compat> 110F
+314C <compat> 1110
+314D <compat> 1111
+314E <compat> 1112
+314F <compat> 1161
+3150 <compat> 1162
+3151 <compat> 1163
+3152 <compat> 1164
+3153 <compat> 1165
+3154 <compat> 1166
+3155 <compat> 1167
+3156 <compat> 1168
+3157 <compat> 1169
+3158 <compat> 116A
+3159 <compat> 116B
+315A <compat> 116C
+315B <compat> 116D
+315C <compat> 116E
+315D <compat> 116F
+315E <compat> 1170
+315F <compat> 1171
+3160 <compat> 1172
+3161 <compat> 1173
+3162 <compat> 1174
+3163 <compat> 1175
+3164 <compat> 1160
+3165 <compat> 1114
+3166 <compat> 1115
+3167 <compat> 11C7
+3168 <compat> 11C8
+3169 <compat> 11CC
+316A <compat> 11CE
+316B <compat> 11D3
+316C <compat> 11D7
+316D <compat> 11D9
+316E <compat> 111C
+316F <compat> 11DD
+3170 <compat> 11DF
+3171 <compat> 111D
+3172 <compat> 111E
+3173 <compat> 1120
+3174 <compat> 1122
+3175 <compat> 1123
+3176 <compat> 1127
+3177 <compat> 1129
+3178 <compat> 112B
+3179 <compat> 112C
+317A <compat> 112D
+317B <compat> 112E
+317C <compat> 112F
+317D <compat> 1132
+317E <compat> 1136
+317F <compat> 1140
+3180 <compat> 1147
+3181 <compat> 114C
+3182 <compat> 11F1
+3183 <compat> 11F2
+3184 <compat> 1157
+3185 <compat> 1158
+3186 <compat> 1159
+3187 <compat> 1184
+3188 <compat> 1185
+3189 <compat> 1188
+318A <compat> 1191
+318B <compat> 1192
+318C <compat> 1194
+318D <compat> 119E
+318E <compat> 11A1
+3192 <super> 4E00
+3193 <super> 4E8C
+3194 <super> 4E09
+3195 <super> 56DB
+3196 <super> 4E0A
+3197 <super> 4E2D
+3198 <super> 4E0B
+3199 <super> 7532
+319A <super> 4E59
+319B <super> 4E19
+319C <super> 4E01
+319D <super> 5929
+319E <super> 5730
+319F <super> 4EBA
+3200 <compat> 0028 1100 0029
+3201 <compat> 0028 1102 0029
+3202 <compat> 0028 1103 0029
+3203 <compat> 0028 1105 0029
+3204 <compat> 0028 1106 0029
+3205 <compat> 0028 1107 0029
+3206 <compat> 0028 1109 0029
+3207 <compat> 0028 110B 0029
+3208 <compat> 0028 110C 0029
+3209 <compat> 0028 110E 0029
+320A <compat> 0028 110F 0029
+320B <compat> 0028 1110 0029
+320C <compat> 0028 1111 0029
+320D <compat> 0028 1112 0029
+320E <compat> 0028 1100 1161 0029
+320F <compat> 0028 1102 1161 0029
+3210 <compat> 0028 1103 1161 0029
+3211 <compat> 0028 1105 1161 0029
+3212 <compat> 0028 1106 1161 0029
+3213 <compat> 0028 1107 1161 0029
+3214 <compat> 0028 1109 1161 0029
+3215 <compat> 0028 110B 1161 0029
+3216 <compat> 0028 110C 1161 0029
+3217 <compat> 0028 110E 1161 0029
+3218 <compat> 0028 110F 1161 0029
+3219 <compat> 0028 1110 1161 0029
+321A <compat> 0028 1111 1161 0029
+321B <compat> 0028 1112 1161 0029
+321C <compat> 0028 110C 116E 0029
+321D <compat> 0028 110B 1169 110C 1165 11AB 0029
+321E <compat> 0028 110B 1169 1112 116E 0029
+3220 <compat> 0028 4E00 0029
+3221 <compat> 0028 4E8C 0029
+3222 <compat> 0028 4E09 0029
+3223 <compat> 0028 56DB 0029
+3224 <compat> 0028 4E94 0029
+3225 <compat> 0028 516D 0029
+3226 <compat> 0028 4E03 0029
+3227 <compat> 0028 516B 0029
+3228 <compat> 0028 4E5D 0029
+3229 <compat> 0028 5341 0029
+322A <compat> 0028 6708 0029
+322B <compat> 0028 706B 0029
+322C <compat> 0028 6C34 0029
+322D <compat> 0028 6728 0029
+322E <compat> 0028 91D1 0029
+322F <compat> 0028 571F 0029
+3230 <compat> 0028 65E5 0029
+3231 <compat> 0028 682A 0029
+3232 <compat> 0028 6709 0029
+3233 <compat> 0028 793E 0029
+3234 <compat> 0028 540D 0029
+3235 <compat> 0028 7279 0029
+3236 <compat> 0028 8CA1 0029
+3237 <compat> 0028 795D 0029
+3238 <compat> 0028 52B4 0029
+3239 <compat> 0028 4EE3 0029
+323A <compat> 0028 547C 0029
+323B <compat> 0028 5B66 0029
+323C <compat> 0028 76E3 0029
+323D <compat> 0028 4F01 0029
+323E <compat> 0028 8CC7 0029
+323F <compat> 0028 5354 0029
+3240 <compat> 0028 796D 0029
+3241 <compat> 0028 4F11 0029
+3242 <compat> 0028 81EA 0029
+3243 <compat> 0028 81F3 0029
+3250 <square> 0050 0054 0045
+3251 <circle> 0032 0031
+3252 <circle> 0032 0032
+3253 <circle> 0032 0033
+3254 <circle> 0032 0034
+3255 <circle> 0032 0035
+3256 <circle> 0032 0036
+3257 <circle> 0032 0037
+3258 <circle> 0032 0038
+3259 <circle> 0032 0039
+325A <circle> 0033 0030
+325B <circle> 0033 0031
+325C <circle> 0033 0032
+325D <circle> 0033 0033
+325E <circle> 0033 0034
+325F <circle> 0033 0035
+3260 <circle> 1100
+3261 <circle> 1102
+3262 <circle> 1103
+3263 <circle> 1105
+3264 <circle> 1106
+3265 <circle> 1107
+3266 <circle> 1109
+3267 <circle> 110B
+3268 <circle> 110C
+3269 <circle> 110E
+326A <circle> 110F
+326B <circle> 1110
+326C <circle> 1111
+326D <circle> 1112
+326E <circle> 1100 1161
+326F <circle> 1102 1161
+3270 <circle> 1103 1161
+3271 <circle> 1105 1161
+3272 <circle> 1106 1161
+3273 <circle> 1107 1161
+3274 <circle> 1109 1161
+3275 <circle> 110B 1161
+3276 <circle> 110C 1161
+3277 <circle> 110E 1161
+3278 <circle> 110F 1161
+3279 <circle> 1110 1161
+327A <circle> 1111 1161
+327B <circle> 1112 1161
+327C <circle> 110E 1161 11B7 1100 1169
+327D <circle> 110C 116E 110B 1174
+327E <circle> 110B 116E
+3280 <circle> 4E00
+3281 <circle> 4E8C
+3282 <circle> 4E09
+3283 <circle> 56DB
+3284 <circle> 4E94
+3285 <circle> 516D
+3286 <circle> 4E03
+3287 <circle> 516B
+3288 <circle> 4E5D
+3289 <circle> 5341
+328A <circle> 6708
+328B <circle> 706B
+328C <circle> 6C34
+328D <circle> 6728
+328E <circle> 91D1
+328F <circle> 571F
+3290 <circle> 65E5
+3291 <circle> 682A
+3292 <circle> 6709
+3293 <circle> 793E
+3294 <circle> 540D
+3295 <circle> 7279
+3296 <circle> 8CA1
+3297 <circle> 795D
+3298 <circle> 52B4
+3299 <circle> 79D8
+329A <circle> 7537
+329B <circle> 5973
+329C <circle> 9069
+329D <circle> 512A
+329E <circle> 5370
+329F <circle> 6CE8
+32A0 <circle> 9805
+32A1 <circle> 4F11
+32A2 <circle> 5199
+32A3 <circle> 6B63
+32A4 <circle> 4E0A
+32A5 <circle> 4E2D
+32A6 <circle> 4E0B
+32A7 <circle> 5DE6
+32A8 <circle> 53F3
+32A9 <circle> 533B
+32AA <circle> 5B97
+32AB <circle> 5B66
+32AC <circle> 76E3
+32AD <circle> 4F01
+32AE <circle> 8CC7
+32AF <circle> 5354
+32B0 <circle> 591C
+32B1 <circle> 0033 0036
+32B2 <circle> 0033 0037
+32B3 <circle> 0033 0038
+32B4 <circle> 0033 0039
+32B5 <circle> 0034 0030
+32B6 <circle> 0034 0031
+32B7 <circle> 0034 0032
+32B8 <circle> 0034 0033
+32B9 <circle> 0034 0034
+32BA <circle> 0034 0035
+32BB <circle> 0034 0036
+32BC <circle> 0034 0037
+32BD <circle> 0034 0038
+32BE <circle> 0034 0039
+32BF <circle> 0035 0030
+32C0 <compat> 0031 6708
+32C1 <compat> 0032 6708
+32C2 <compat> 0033 6708
+32C3 <compat> 0034 6708
+32C4 <compat> 0035 6708
+32C5 <compat> 0036 6708
+32C6 <compat> 0037 6708
+32C7 <compat> 0038 6708
+32C8 <compat> 0039 6708
+32C9 <compat> 0031 0030 6708
+32CA <compat> 0031 0031 6708
+32CB <compat> 0031 0032 6708
+32CC <square> 0048 0067
+32CD <square> 0065 0072 0067
+32CE <square> 0065 0056
+32CF <square> 004C 0054 0044
+32D0 <circle> 30A2
+32D1 <circle> 30A4
+32D2 <circle> 30A6
+32D3 <circle> 30A8
+32D4 <circle> 30AA
+32D5 <circle> 30AB
+32D6 <circle> 30AD
+32D7 <circle> 30AF
+32D8 <circle> 30B1
+32D9 <circle> 30B3
+32DA <circle> 30B5
+32DB <circle> 30B7
+32DC <circle> 30B9
+32DD <circle> 30BB
+32DE <circle> 30BD
+32DF <circle> 30BF
+32E0 <circle> 30C1
+32E1 <circle> 30C4
+32E2 <circle> 30C6
+32E3 <circle> 30C8
+32E4 <circle> 30CA
+32E5 <circle> 30CB
+32E6 <circle> 30CC
+32E7 <circle> 30CD
+32E8 <circle> 30CE
+32E9 <circle> 30CF
+32EA <circle> 30D2
+32EB <circle> 30D5
+32EC <circle> 30D8
+32ED <circle> 30DB
+32EE <circle> 30DE
+32EF <circle> 30DF
+32F0 <circle> 30E0
+32F1 <circle> 30E1
+32F2 <circle> 30E2
+32F3 <circle> 30E4
+32F4 <circle> 30E6
+32F5 <circle> 30E8
+32F6 <circle> 30E9
+32F7 <circle> 30EA
+32F8 <circle> 30EB
+32F9 <circle> 30EC
+32FA <circle> 30ED
+32FB <circle> 30EF
+32FC <circle> 30F0
+32FD <circle> 30F1
+32FE <circle> 30F2
+3300 <square> 30A2 30D1 30FC 30C8
+3301 <square> 30A2 30EB 30D5 30A1
+3302 <square> 30A2 30F3 30DA 30A2
+3303 <square> 30A2 30FC 30EB
+3304 <square> 30A4 30CB 30F3 30B0
+3305 <square> 30A4 30F3 30C1
+3306 <square> 30A6 30A9 30F3
+3307 <square> 30A8 30B9 30AF 30FC 30C9
+3308 <square> 30A8 30FC 30AB 30FC
+3309 <square> 30AA 30F3 30B9
+330A <square> 30AA 30FC 30E0
+330B <square> 30AB 30A4 30EA
+330C <square> 30AB 30E9 30C3 30C8
+330D <square> 30AB 30ED 30EA 30FC
+330E <square> 30AC 30ED 30F3
+330F <square> 30AC 30F3 30DE
+3310 <square> 30AE 30AC
+3311 <square> 30AE 30CB 30FC
+3312 <square> 30AD 30E5 30EA 30FC
+3313 <square> 30AE 30EB 30C0 30FC
+3314 <square> 30AD 30ED
+3315 <square> 30AD 30ED 30B0 30E9 30E0
+3316 <square> 30AD 30ED 30E1 30FC 30C8 30EB
+3317 <square> 30AD 30ED 30EF 30C3 30C8
+3318 <square> 30B0 30E9 30E0
+3319 <square> 30B0 30E9 30E0 30C8 30F3
+331A <square> 30AF 30EB 30BC 30A4 30ED
+331B <square> 30AF 30ED 30FC 30CD
+331C <square> 30B1 30FC 30B9
+331D <square> 30B3 30EB 30CA
+331E <square> 30B3 30FC 30DD
+331F <square> 30B5 30A4 30AF 30EB
+3320 <square> 30B5 30F3 30C1 30FC 30E0
+3321 <square> 30B7 30EA 30F3 30B0
+3322 <square> 30BB 30F3 30C1
+3323 <square> 30BB 30F3 30C8
+3324 <square> 30C0 30FC 30B9
+3325 <square> 30C7 30B7
+3326 <square> 30C9 30EB
+3327 <square> 30C8 30F3
+3328 <square> 30CA 30CE
+3329 <square> 30CE 30C3 30C8
+332A <square> 30CF 30A4 30C4
+332B <square> 30D1 30FC 30BB 30F3 30C8
+332C <square> 30D1 30FC 30C4
+332D <square> 30D0 30FC 30EC 30EB
+332E <square> 30D4 30A2 30B9 30C8 30EB
+332F <square> 30D4 30AF 30EB
+3330 <square> 30D4 30B3
+3331 <square> 30D3 30EB
+3332 <square> 30D5 30A1 30E9 30C3 30C9
+3333 <square> 30D5 30A3 30FC 30C8
+3334 <square> 30D6 30C3 30B7 30A7 30EB
+3335 <square> 30D5 30E9 30F3
+3336 <square> 30D8 30AF 30BF 30FC 30EB
+3337 <square> 30DA 30BD
+3338 <square> 30DA 30CB 30D2
+3339 <square> 30D8 30EB 30C4
+333A <square> 30DA 30F3 30B9
+333B <square> 30DA 30FC 30B8
+333C <square> 30D9 30FC 30BF
+333D <square> 30DD 30A4 30F3 30C8
+333E <square> 30DC 30EB 30C8
+333F <square> 30DB 30F3
+3340 <square> 30DD 30F3 30C9
+3341 <square> 30DB 30FC 30EB
+3342 <square> 30DB 30FC 30F3
+3343 <square> 30DE 30A4 30AF 30ED
+3344 <square> 30DE 30A4 30EB
+3345 <square> 30DE 30C3 30CF
+3346 <square> 30DE 30EB 30AF
+3347 <square> 30DE 30F3 30B7 30E7 30F3
+3348 <square> 30DF 30AF 30ED 30F3
+3349 <square> 30DF 30EA
+334A <square> 30DF 30EA 30D0 30FC 30EB
+334B <square> 30E1 30AC
+334C <square> 30E1 30AC 30C8 30F3
+334D <square> 30E1 30FC 30C8 30EB
+334E <square> 30E4 30FC 30C9
+334F <square> 30E4 30FC 30EB
+3350 <square> 30E6 30A2 30F3
+3351 <square> 30EA 30C3 30C8 30EB
+3352 <square> 30EA 30E9
+3353 <square> 30EB 30D4 30FC
+3354 <square> 30EB 30FC 30D6 30EB
+3355 <square> 30EC 30E0
+3356 <square> 30EC 30F3 30C8 30B2 30F3
+3357 <square> 30EF 30C3 30C8
+3358 <compat> 0030 70B9
+3359 <compat> 0031 70B9
+335A <compat> 0032 70B9
+335B <compat> 0033 70B9
+335C <compat> 0034 70B9
+335D <compat> 0035 70B9
+335E <compat> 0036 70B9
+335F <compat> 0037 70B9
+3360 <compat> 0038 70B9
+3361 <compat> 0039 70B9
+3362 <compat> 0031 0030 70B9
+3363 <compat> 0031 0031 70B9
+3364 <compat> 0031 0032 70B9
+3365 <compat> 0031 0033 70B9
+3366 <compat> 0031 0034 70B9
+3367 <compat> 0031 0035 70B9
+3368 <compat> 0031 0036 70B9
+3369 <compat> 0031 0037 70B9
+336A <compat> 0031 0038 70B9
+336B <compat> 0031 0039 70B9
+336C <compat> 0032 0030 70B9
+336D <compat> 0032 0031 70B9
+336E <compat> 0032 0032 70B9
+336F <compat> 0032 0033 70B9
+3370 <compat> 0032 0034 70B9
+3371 <square> 0068 0050 0061
+3372 <square> 0064 0061
+3373 <square> 0041 0055
+3374 <square> 0062 0061 0072
+3375 <square> 006F 0056
+3376 <square> 0070 0063
+3377 <square> 0064 006D
+3378 <square> 0064 006D 00B2
+3379 <square> 0064 006D 00B3
+337A <square> 0049 0055
+337B <square> 5E73 6210
+337C <square> 662D 548C
+337D <square> 5927 6B63
+337E <square> 660E 6CBB
+337F <square> 682A 5F0F 4F1A 793E
+3380 <square> 0070 0041
+3381 <square> 006E 0041
+3382 <square> 03BC 0041
+3383 <square> 006D 0041
+3384 <square> 006B 0041
+3385 <square> 004B 0042
+3386 <square> 004D 0042
+3387 <square> 0047 0042
+3388 <square> 0063 0061 006C
+3389 <square> 006B 0063 0061 006C
+338A <square> 0070 0046
+338B <square> 006E 0046
+338C <square> 03BC 0046
+338D <square> 03BC 0067
+338E <square> 006D 0067
+338F <square> 006B 0067
+3390 <square> 0048 007A
+3391 <square> 006B 0048 007A
+3392 <square> 004D 0048 007A
+3393 <square> 0047 0048 007A
+3394 <square> 0054 0048 007A
+3395 <square> 03BC 2113
+3396 <square> 006D 2113
+3397 <square> 0064 2113
+3398 <square> 006B 2113
+3399 <square> 0066 006D
+339A <square> 006E 006D
+339B <square> 03BC 006D
+339C <square> 006D 006D
+339D <square> 0063 006D
+339E <square> 006B 006D
+339F <square> 006D 006D 00B2
+33A0 <square> 0063 006D 00B2
+33A1 <square> 006D 00B2
+33A2 <square> 006B 006D 00B2
+33A3 <square> 006D 006D 00B3
+33A4 <square> 0063 006D 00B3
+33A5 <square> 006D 00B3
+33A6 <square> 006B 006D 00B3
+33A7 <square> 006D 2215 0073
+33A8 <square> 006D 2215 0073 00B2
+33A9 <square> 0050 0061
+33AA <square> 006B 0050 0061
+33AB <square> 004D 0050 0061
+33AC <square> 0047 0050 0061
+33AD <square> 0072 0061 0064
+33AE <square> 0072 0061 0064 2215 0073
+33AF <square> 0072 0061 0064 2215 0073 00B2
+33B0 <square> 0070 0073
+33B1 <square> 006E 0073
+33B2 <square> 03BC 0073
+33B3 <square> 006D 0073
+33B4 <square> 0070 0056
+33B5 <square> 006E 0056
+33B6 <square> 03BC 0056
+33B7 <square> 006D 0056
+33B8 <square> 006B 0056
+33B9 <square> 004D 0056
+33BA <square> 0070 0057
+33BB <square> 006E 0057
+33BC <square> 03BC 0057
+33BD <square> 006D 0057
+33BE <square> 006B 0057
+33BF <square> 004D 0057
+33C0 <square> 006B 03A9
+33C1 <square> 004D 03A9
+33C2 <square> 0061 002E 006D 002E
+33C3 <square> 0042 0071
+33C4 <square> 0063 0063
+33C5 <square> 0063 0064
+33C6 <square> 0043 2215 006B 0067
+33C7 <square> 0043 006F 002E
+33C8 <square> 0064 0042
+33C9 <square> 0047 0079
+33CA <square> 0068 0061
+33CB <square> 0048 0050
+33CC <square> 0069 006E
+33CD <square> 004B 004B
+33CE <square> 004B 004D
+33CF <square> 006B 0074
+33D0 <square> 006C 006D
+33D1 <square> 006C 006E
+33D2 <square> 006C 006F 0067
+33D3 <square> 006C 0078
+33D4 <square> 006D 0062
+33D5 <square> 006D 0069 006C
+33D6 <square> 006D 006F 006C
+33D7 <square> 0050 0048
+33D8 <square> 0070 002E 006D 002E
+33D9 <square> 0050 0050 004D
+33DA <square> 0050 0052
+33DB <square> 0073 0072
+33DC <square> 0053 0076
+33DD <square> 0057 0062
+33DE <square> 0056 2215 006D
+33DF <square> 0041 2215 006D
+33E0 <compat> 0031 65E5
+33E1 <compat> 0032 65E5
+33E2 <compat> 0033 65E5
+33E3 <compat> 0034 65E5
+33E4 <compat> 0035 65E5
+33E5 <compat> 0036 65E5
+33E6 <compat> 0037 65E5
+33E7 <compat> 0038 65E5
+33E8 <compat> 0039 65E5
+33E9 <compat> 0031 0030 65E5
+33EA <compat> 0031 0031 65E5
+33EB <compat> 0031 0032 65E5
+33EC <compat> 0031 0033 65E5
+33ED <compat> 0031 0034 65E5
+33EE <compat> 0031 0035 65E5
+33EF <compat> 0031 0036 65E5
+33F0 <compat> 0031 0037 65E5
+33F1 <compat> 0031 0038 65E5
+33F2 <compat> 0031 0039 65E5
+33F3 <compat> 0032 0030 65E5
+33F4 <compat> 0032 0031 65E5
+33F5 <compat> 0032 0032 65E5
+33F6 <compat> 0032 0033 65E5
+33F7 <compat> 0032 0034 65E5
+33F8 <compat> 0032 0035 65E5
+33F9 <compat> 0032 0036 65E5
+33FA <compat> 0032 0037 65E5
+33FB <compat> 0032 0038 65E5
+33FC <compat> 0032 0039 65E5
+33FD <compat> 0033 0030 65E5
+33FE <compat> 0033 0031 65E5
+33FF <square> 0067 0061 006C
+A770 <super> A76F
+F900 8C48
+F901 66F4
+F902 8ECA
+F903 8CC8
+F904 6ED1
+F905 4E32
+F906 53E5
+F907 F908 9F9C
+F909 5951
+F90A 91D1
+F90B 5587
+F90C 5948
+F90D 61F6
+F90E 7669
+F90F 7F85
+F910 863F
+F911 87BA
+F912 88F8
+F913 908F
+F914 6A02
+F915 6D1B
+F916 70D9
+F917 73DE
+F918 843D
+F919 916A
+F91A 99F1
+F91B 4E82
+F91C 5375
+F91D 6B04
+F91E 721B
+F91F 862D
+F920 9E1E
+F921 5D50
+F922 6FEB
+F923 85CD
+F924 8964
+F925 62C9
+F926 81D8
+F927 881F
+F928 5ECA
+F929 6717
+F92A 6D6A
+F92B 72FC
+F92C 90CE
+F92D 4F86
+F92E 51B7
+F92F 52DE
+F930 64C4
+F931 6AD3
+F932 7210
+F933 76E7
+F934 8001
+F935 8606
+F936 865C
+F937 8DEF
+F938 9732
+F939 9B6F
+F93A 9DFA
+F93B 788C
+F93C 797F
+F93D 7DA0
+F93E 83C9
+F93F 9304
+F940 9E7F
+F941 8AD6
+F942 58DF
+F943 5F04
+F944 7C60
+F945 807E
+F946 7262
+F947 78CA
+F948 8CC2
+F949 96F7
+F94A 58D8
+F94B 5C62
+F94C 6A13
+F94D 6DDA
+F94E 6F0F
+F94F 7D2F
+F950 7E37
+F951 964B
+F952 52D2
+F953 808B
+F954 51DC
+F955 51CC
+F956 7A1C
+F957 7DBE
+F958 83F1
+F959 9675
+F95A 8B80
+F95B 62CF
+F95C 6A02
+F95D 8AFE
+F95E 4E39
+F95F 5BE7
+F960 6012
+F961 7387
+F962 7570
+F963 5317
+F964 78FB
+F965 4FBF
+F966 5FA9
+F967 4E0D
+F968 6CCC
+F969 6578
+F96A 7D22
+F96B 53C3
+F96C 585E
+F96D 7701
+F96E 8449
+F96F 8AAA
+F970 6BBA
+F971 8FB0
+F972 6C88
+F973 62FE
+F974 82E5
+F975 63A0
+F976 7565
+F977 4EAE
+F978 5169
+F979 51C9
+F97A 6881
+F97B 7CE7
+F97C 826F
+F97D 8AD2
+F97E 91CF
+F97F 52F5
+F980 5442
+F981 5973
+F982 5EEC
+F983 65C5
+F984 6FFE
+F985 792A
+F986 95AD
+F987 9A6A
+F988 9E97
+F989 9ECE
+F98A 529B
+F98B 66C6
+F98C 6B77
+F98D 8F62
+F98E 5E74
+F98F 6190
+F990 6200
+F991 649A
+F992 6F23
+F993 7149
+F994 7489
+F995 79CA
+F996 7DF4
+F997 806F
+F998 8F26
+F999 84EE
+F99A 9023
+F99B 934A
+F99C 5217
+F99D 52A3
+F99E 54BD
+F99F 70C8
+F9A0 88C2
+F9A1 8AAA
+F9A2 5EC9
+F9A3 5FF5
+F9A4 637B
+F9A5 6BAE
+F9A6 7C3E
+F9A7 7375
+F9A8 4EE4
+F9A9 56F9
+F9AA 5BE7
+F9AB 5DBA
+F9AC 601C
+F9AD 73B2
+F9AE 7469
+F9AF 7F9A
+F9B0 8046
+F9B1 9234
+F9B2 96F6
+F9B3 9748
+F9B4 9818
+F9B5 4F8B
+F9B6 79AE
+F9B7 91B4
+F9B8 96B8
+F9B9 60E1
+F9BA 4E86
+F9BB 50DA
+F9BC 5BEE
+F9BD 5C3F
+F9BE 6599
+F9BF 6A02
+F9C0 71CE
+F9C1 7642
+F9C2 84FC
+F9C3 907C
+F9C4 9F8D
+F9C5 6688
+F9C6 962E
+F9C7 5289
+F9C8 677B
+F9C9 67F3
+F9CA 6D41
+F9CB 6E9C
+F9CC 7409
+F9CD 7559
+F9CE 786B
+F9CF 7D10
+F9D0 985E
+F9D1 516D
+F9D2 622E
+F9D3 9678
+F9D4 502B
+F9D5 5D19
+F9D6 6DEA
+F9D7 8F2A
+F9D8 5F8B
+F9D9 6144
+F9DA 6817
+F9DB 7387
+F9DC 9686
+F9DD 5229
+F9DE 540F
+F9DF 5C65
+F9E0 6613
+F9E1 674E
+F9E2 68A8
+F9E3 6CE5
+F9E4 7406
+F9E5 75E2
+F9E6 7F79
+F9E7 88CF
+F9E8 88E1
+F9E9 91CC
+F9EA 96E2
+F9EB 533F
+F9EC 6EBA
+F9ED 541D
+F9EE 71D0
+F9EF 7498
+F9F0 85FA
+F9F1 96A3
+F9F2 9C57
+F9F3 9E9F
+F9F4 6797
+F9F5 6DCB
+F9F6 81E8
+F9F7 7ACB
+F9F8 7B20
+F9F9 7C92
+F9FA 72C0
+F9FB 7099
+F9FC 8B58
+F9FD 4EC0
+F9FE 8336
+F9FF 523A
+FA00 5207
+FA01 5EA6
+FA02 62D3
+FA03 7CD6
+FA04 5B85
+FA05 6D1E
+FA06 66B4
+FA07 8F3B
+FA08 884C
+FA09 964D
+FA0A 898B
+FA0B 5ED3
+FA0C 5140
+FA0D 55C0
+FA10 585A
+FA12 6674
+FA15 51DE
+FA16 732A
+FA17 76CA
+FA18 793C
+FA19 795E
+FA1A 7965
+FA1B 798F
+FA1C 9756
+FA1D 7CBE
+FA1E 7FBD
+FA20 8612
+FA22 8AF8
+FA25 9038
+FA26 90FD
+FA2A 98EF
+FA2B 98FC
+FA2C 9928
+FA2D 9DB4
+FA30 4FAE
+FA31 50E7
+FA32 514D
+FA33 52C9
+FA34 52E4
+FA35 5351
+FA36 559D
+FA37 5606
+FA38 5668
+FA39 5840
+FA3A 58A8
+FA3B 5C64
+FA3C 5C6E
+FA3D 6094
+FA3E 6168
+FA3F 618E
+FA40 61F2
+FA41 654F
+FA42 65E2
+FA43 6691
+FA44 6885
+FA45 6D77
+FA46 6E1A
+FA47 6F22
+FA48 716E
+FA49 722B
+FA4A 7422
+FA4B 7891
+FA4C 793E
+FA4D 7949
+FA4E 7948
+FA4F 7950
+FA50 7956
+FA51 795D
+FA52 798D
+FA53 798E
+FA54 7A40
+FA55 7A81
+FA56 7BC0
+FA57 7DF4
+FA58 7E09
+FA59 7E41
+FA5A 7F72
+FA5B 8005
+FA5C 81ED
+FA5D FA5E 8279
+FA5F 8457
+FA60 8910
+FA61 8996
+FA62 8B01
+FA63 8B39
+FA64 8CD3
+FA65 8D08
+FA66 8FB6
+FA67 9038
+FA68 96E3
+FA69 97FF
+FA6A 983B
+FA70 4E26
+FA71 51B5
+FA72 5168
+FA73 4F80
+FA74 5145
+FA75 5180
+FA76 52C7
+FA77 52FA
+FA78 559D
+FA79 5555
+FA7A 5599
+FA7B 55E2
+FA7C 585A
+FA7D 58B3
+FA7E 5944
+FA7F 5954
+FA80 5A62
+FA81 5B28
+FA82 5ED2
+FA83 5ED9
+FA84 5F69
+FA85 5FAD
+FA86 60D8
+FA87 614E
+FA88 6108
+FA89 618E
+FA8A 6160
+FA8B 61F2
+FA8C 6234
+FA8D 63C4
+FA8E 641C
+FA8F 6452
+FA90 6556
+FA91 6674
+FA92 6717
+FA93 671B
+FA94 6756
+FA95 6B79
+FA96 6BBA
+FA97 6D41
+FA98 6EDB
+FA99 6ECB
+FA9A 6F22
+FA9B 701E
+FA9C 716E
+FA9D 77A7
+FA9E 7235
+FA9F 72AF
+FAA0 732A
+FAA1 7471
+FAA2 7506
+FAA3 753B
+FAA4 761D
+FAA5 761F
+FAA6 76CA
+FAA7 76DB
+FAA8 76F4
+FAA9 774A
+FAAA 7740
+FAAB 78CC
+FAAC 7AB1
+FAAD 7BC0
+FAAE 7C7B
+FAAF 7D5B
+FAB0 7DF4
+FAB1 7F3E
+FAB2 8005
+FAB3 8352
+FAB4 83EF
+FAB5 8779
+FAB6 8941
+FAB7 8986
+FAB8 8996
+FAB9 8ABF
+FABA 8AF8
+FABB 8ACB
+FABC 8B01
+FABD 8AFE
+FABE 8AED
+FABF 8B39
+FAC0 8B8A
+FAC1 8D08
+FAC2 8F38
+FAC3 9072
+FAC4 9199
+FAC5 9276
+FAC6 967C
+FAC7 96E3
+FAC8 9756
+FAC9 97DB
+FACA 97FF
+FACB 980B
+FACC 983B
+FACD 9B12
+FACE 9F9C
+FACF 2284A
+FAD0 22844
+FAD1 233D5
+FAD2 3B9D
+FAD3 4018
+FAD4 4039
+FAD5 25249
+FAD6 25CD0
+FAD7 27ED3
+FAD8 9F43
+FAD9 9F8E
+FB00 <compat> 0066 0066
+FB01 <compat> 0066 0069
+FB02 <compat> 0066 006C
+FB03 <compat> 0066 0066 0069
+FB04 <compat> 0066 0066 006C
+FB05 <compat> 017F 0074
+FB06 <compat> 0073 0074
+FB13 <compat> 0574 0576
+FB14 <compat> 0574 0565
+FB15 <compat> 0574 056B
+FB16 <compat> 057E 0576
+FB17 <compat> 0574 056D
+FB1D 05D9 05B4
+FB1F 05F2 05B7
+FB20 <font> 05E2
+FB21 <font> 05D0
+FB22 <font> 05D3
+FB23 <font> 05D4
+FB24 <font> 05DB
+FB25 <font> 05DC
+FB26 <font> 05DD
+FB27 <font> 05E8
+FB28 <font> 05EA
+FB29 <font> 002B
+FB2A 05E9 05C1
+FB2B 05E9 05C2
+FB2C FB49 05C1
+FB2D FB49 05C2
+FB2E 05D0 05B7
+FB2F 05D0 05B8
+FB30 05D0 05BC
+FB31 05D1 05BC
+FB32 05D2 05BC
+FB33 05D3 05BC
+FB34 05D4 05BC
+FB35 05D5 05BC
+FB36 05D6 05BC
+FB38 05D8 05BC
+FB39 05D9 05BC
+FB3A 05DA 05BC
+FB3B 05DB 05BC
+FB3C 05DC 05BC
+FB3E 05DE 05BC
+FB40 05E0 05BC
+FB41 05E1 05BC
+FB43 05E3 05BC
+FB44 05E4 05BC
+FB46 05E6 05BC
+FB47 05E7 05BC
+FB48 05E8 05BC
+FB49 05E9 05BC
+FB4A 05EA 05BC
+FB4B 05D5 05B9
+FB4C 05D1 05BF
+FB4D 05DB 05BF
+FB4E 05E4 05BF
+FB4F <compat> 05D0 05DC
+FB50 <isolated> 0671
+FB51 <final> 0671
+FB52 <isolated> 067B
+FB53 <final> 067B
+FB54 <initial> 067B
+FB55 <medial> 067B
+FB56 <isolated> 067E
+FB57 <final> 067E
+FB58 <initial> 067E
+FB59 <medial> 067E
+FB5A <isolated> 0680
+FB5B <final> 0680
+FB5C <initial> 0680
+FB5D <medial> 0680
+FB5E <isolated> 067A
+FB5F <final> 067A
+FB60 <initial> 067A
+FB61 <medial> 067A
+FB62 <isolated> 067F
+FB63 <final> 067F
+FB64 <initial> 067F
+FB65 <medial> 067F
+FB66 <isolated> 0679
+FB67 <final> 0679
+FB68 <initial> 0679
+FB69 <medial> 0679
+FB6A <isolated> 06A4
+FB6B <final> 06A4
+FB6C <initial> 06A4
+FB6D <medial> 06A4
+FB6E <isolated> 06A6
+FB6F <final> 06A6
+FB70 <initial> 06A6
+FB71 <medial> 06A6
+FB72 <isolated> 0684
+FB73 <final> 0684
+FB74 <initial> 0684
+FB75 <medial> 0684
+FB76 <isolated> 0683
+FB77 <final> 0683
+FB78 <initial> 0683
+FB79 <medial> 0683
+FB7A <isolated> 0686
+FB7B <final> 0686
+FB7C <initial> 0686
+FB7D <medial> 0686
+FB7E <isolated> 0687
+FB7F <final> 0687
+FB80 <initial> 0687
+FB81 <medial> 0687
+FB82 <isolated> 068D
+FB83 <final> 068D
+FB84 <isolated> 068C
+FB85 <final> 068C
+FB86 <isolated> 068E
+FB87 <final> 068E
+FB88 <isolated> 0688
+FB89 <final> 0688
+FB8A <isolated> 0698
+FB8B <final> 0698
+FB8C <isolated> 0691
+FB8D <final> 0691
+FB8E <isolated> 06A9
+FB8F <final> 06A9
+FB90 <initial> 06A9
+FB91 <medial> 06A9
+FB92 <isolated> 06AF
+FB93 <final> 06AF
+FB94 <initial> 06AF
+FB95 <medial> 06AF
+FB96 <isolated> 06B3
+FB97 <final> 06B3
+FB98 <initial> 06B3
+FB99 <medial> 06B3
+FB9A <isolated> 06B1
+FB9B <final> 06B1
+FB9C <initial> 06B1
+FB9D <medial> 06B1
+FB9E <isolated> 06BA
+FB9F <final> 06BA
+FBA0 <isolated> 06BB
+FBA1 <final> 06BB
+FBA2 <initial> 06BB
+FBA3 <medial> 06BB
+FBA4 <isolated> 06C0
+FBA5 <final> 06C0
+FBA6 <isolated> 06C1
+FBA7 <final> 06C1
+FBA8 <initial> 06C1
+FBA9 <medial> 06C1
+FBAA <isolated> 06BE
+FBAB <final> 06BE
+FBAC <initial> 06BE
+FBAD <medial> 06BE
+FBAE <isolated> 06D2
+FBAF <final> 06D2
+FBB0 <isolated> 06D3
+FBB1 <final> 06D3
+FBD3 <isolated> 06AD
+FBD4 <final> 06AD
+FBD5 <initial> 06AD
+FBD6 <medial> 06AD
+FBD7 <isolated> 06C7
+FBD8 <final> 06C7
+FBD9 <isolated> 06C6
+FBDA <final> 06C6
+FBDB <isolated> 06C8
+FBDC <final> 06C8
+FBDD <isolated> 0677
+FBDE <isolated> 06CB
+FBDF <final> 06CB
+FBE0 <isolated> 06C5
+FBE1 <final> 06C5
+FBE2 <isolated> 06C9
+FBE3 <final> 06C9
+FBE4 <isolated> 06D0
+FBE5 <final> 06D0
+FBE6 <initial> 06D0
+FBE7 <medial> 06D0
+FBE8 <initial> 0649
+FBE9 <medial> 0649
+FBEA <isolated> 0626 0627
+FBEB <final> 0626 0627
+FBEC <isolated> 0626 06D5
+FBED <final> 0626 06D5
+FBEE <isolated> 0626 0648
+FBEF <final> 0626 0648
+FBF0 <isolated> 0626 06C7
+FBF1 <final> 0626 06C7
+FBF2 <isolated> 0626 06C6
+FBF3 <final> 0626 06C6
+FBF4 <isolated> 0626 06C8
+FBF5 <final> 0626 06C8
+FBF6 <isolated> 0626 06D0
+FBF7 <final> 0626 06D0
+FBF8 <initial> 0626 06D0
+FBF9 <isolated> 0626 0649
+FBFA <final> 0626 0649
+FBFB <initial> 0626 0649
+FBFC <isolated> 06CC
+FBFD <final> 06CC
+FBFE <initial> 06CC
+FBFF <medial> 06CC
+FC00 <isolated> 0626 062C
+FC01 <isolated> 0626 062D
+FC02 <isolated> 0626 0645
+FC03 <isolated> 0626 0649
+FC04 <isolated> 0626 064A
+FC05 <isolated> 0628 062C
+FC06 <isolated> 0628 062D
+FC07 <isolated> 0628 062E
+FC08 <isolated> 0628 0645
+FC09 <isolated> 0628 0649
+FC0A <isolated> 0628 064A
+FC0B <isolated> 062A 062C
+FC0C <isolated> 062A 062D
+FC0D <isolated> 062A 062E
+FC0E <isolated> 062A 0645
+FC0F <isolated> 062A 0649
+FC10 <isolated> 062A 064A
+FC11 <isolated> 062B 062C
+FC12 <isolated> 062B 0645
+FC13 <isolated> 062B 0649
+FC14 <isolated> 062B 064A
+FC15 <isolated> 062C 062D
+FC16 <isolated> 062C 0645
+FC17 <isolated> 062D 062C
+FC18 <isolated> 062D 0645
+FC19 <isolated> 062E 062C
+FC1A <isolated> 062E 062D
+FC1B <isolated> 062E 0645
+FC1C <isolated> 0633 062C
+FC1D <isolated> 0633 062D
+FC1E <isolated> 0633 062E
+FC1F <isolated> 0633 0645
+FC20 <isolated> 0635 062D
+FC21 <isolated> 0635 0645
+FC22 <isolated> 0636 062C
+FC23 <isolated> 0636 062D
+FC24 <isolated> 0636 062E
+FC25 <isolated> 0636 0645
+FC26 <isolated> 0637 062D
+FC27 <isolated> 0637 0645
+FC28 <isolated> 0638 0645
+FC29 <isolated> 0639 062C
+FC2A <isolated> 0639 0645
+FC2B <isolated> 063A 062C
+FC2C <isolated> 063A 0645
+FC2D <isolated> 0641 062C
+FC2E <isolated> 0641 062D
+FC2F <isolated> 0641 062E
+FC30 <isolated> 0641 0645
+FC31 <isolated> 0641 0649
+FC32 <isolated> 0641 064A
+FC33 <isolated> 0642 062D
+FC34 <isolated> 0642 0645
+FC35 <isolated> 0642 0649
+FC36 <isolated> 0642 064A
+FC37 <isolated> 0643 0627
+FC38 <isolated> 0643 062C
+FC39 <isolated> 0643 062D
+FC3A <isolated> 0643 062E
+FC3B <isolated> 0643 0644
+FC3C <isolated> 0643 0645
+FC3D <isolated> 0643 0649
+FC3E <isolated> 0643 064A
+FC3F <isolated> 0644 062C
+FC40 <isolated> 0644 062D
+FC41 <isolated> 0644 062E
+FC42 <isolated> 0644 0645
+FC43 <isolated> 0644 0649
+FC44 <isolated> 0644 064A
+FC45 <isolated> 0645 062C
+FC46 <isolated> 0645 062D
+FC47 <isolated> 0645 062E
+FC48 <isolated> 0645 0645
+FC49 <isolated> 0645 0649
+FC4A <isolated> 0645 064A
+FC4B <isolated> 0646 062C
+FC4C <isolated> 0646 062D
+FC4D <isolated> 0646 062E
+FC4E <isolated> 0646 0645
+FC4F <isolated> 0646 0649
+FC50 <isolated> 0646 064A
+FC51 <isolated> 0647 062C
+FC52 <isolated> 0647 0645
+FC53 <isolated> 0647 0649
+FC54 <isolated> 0647 064A
+FC55 <isolated> 064A 062C
+FC56 <isolated> 064A 062D
+FC57 <isolated> 064A 062E
+FC58 <isolated> 064A 0645
+FC59 <isolated> 064A 0649
+FC5A <isolated> 064A 064A
+FC5B <isolated> 0630 0670
+FC5C <isolated> 0631 0670
+FC5D <isolated> 0649 0670
+FC5E <isolated> 0020 064C 0651
+FC5F <isolated> 0020 064D 0651
+FC60 <isolated> 0020 064E 0651
+FC61 <isolated> 0020 064F 0651
+FC62 <isolated> 0020 0650 0651
+FC63 <isolated> 0020 0651 0670
+FC64 <final> 0626 0631
+FC65 <final> 0626 0632
+FC66 <final> 0626 0645
+FC67 <final> 0626 0646
+FC68 <final> 0626 0649
+FC69 <final> 0626 064A
+FC6A <final> 0628 0631
+FC6B <final> 0628 0632
+FC6C <final> 0628 0645
+FC6D <final> 0628 0646
+FC6E <final> 0628 0649
+FC6F <final> 0628 064A
+FC70 <final> 062A 0631
+FC71 <final> 062A 0632
+FC72 <final> 062A 0645
+FC73 <final> 062A 0646
+FC74 <final> 062A 0649
+FC75 <final> 062A 064A
+FC76 <final> 062B 0631
+FC77 <final> 062B 0632
+FC78 <final> 062B 0645
+FC79 <final> 062B 0646
+FC7A <final> 062B 0649
+FC7B <final> 062B 064A
+FC7C <final> 0641 0649
+FC7D <final> 0641 064A
+FC7E <final> 0642 0649
+FC7F <final> 0642 064A
+FC80 <final> 0643 0627
+FC81 <final> 0643 0644
+FC82 <final> 0643 0645
+FC83 <final> 0643 0649
+FC84 <final> 0643 064A
+FC85 <final> 0644 0645
+FC86 <final> 0644 0649
+FC87 <final> 0644 064A
+FC88 <final> 0645 0627
+FC89 <final> 0645 0645
+FC8A <final> 0646 0631
+FC8B <final> 0646 0632
+FC8C <final> 0646 0645
+FC8D <final> 0646 0646
+FC8E <final> 0646 0649
+FC8F <final> 0646 064A
+FC90 <final> 0649 0670
+FC91 <final> 064A 0631
+FC92 <final> 064A 0632
+FC93 <final> 064A 0645
+FC94 <final> 064A 0646
+FC95 <final> 064A 0649
+FC96 <final> 064A 064A
+FC97 <initial> 0626 062C
+FC98 <initial> 0626 062D
+FC99 <initial> 0626 062E
+FC9A <initial> 0626 0645
+FC9B <initial> 0626 0647
+FC9C <initial> 0628 062C
+FC9D <initial> 0628 062D
+FC9E <initial> 0628 062E
+FC9F <initial> 0628 0645
+FCA0 <initial> 0628 0647
+FCA1 <initial> 062A 062C
+FCA2 <initial> 062A 062D
+FCA3 <initial> 062A 062E
+FCA4 <initial> 062A 0645
+FCA5 <initial> 062A 0647
+FCA6 <initial> 062B 0645
+FCA7 <initial> 062C 062D
+FCA8 <initial> 062C 0645
+FCA9 <initial> 062D 062C
+FCAA <initial> 062D 0645
+FCAB <initial> 062E 062C
+FCAC <initial> 062E 0645
+FCAD <initial> 0633 062C
+FCAE <initial> 0633 062D
+FCAF <initial> 0633 062E
+FCB0 <initial> 0633 0645
+FCB1 <initial> 0635 062D
+FCB2 <initial> 0635 062E
+FCB3 <initial> 0635 0645
+FCB4 <initial> 0636 062C
+FCB5 <initial> 0636 062D
+FCB6 <initial> 0636 062E
+FCB7 <initial> 0636 0645
+FCB8 <initial> 0637 062D
+FCB9 <initial> 0638 0645
+FCBA <initial> 0639 062C
+FCBB <initial> 0639 0645
+FCBC <initial> 063A 062C
+FCBD <initial> 063A 0645
+FCBE <initial> 0641 062C
+FCBF <initial> 0641 062D
+FCC0 <initial> 0641 062E
+FCC1 <initial> 0641 0645
+FCC2 <initial> 0642 062D
+FCC3 <initial> 0642 0645
+FCC4 <initial> 0643 062C
+FCC5 <initial> 0643 062D
+FCC6 <initial> 0643 062E
+FCC7 <initial> 0643 0644
+FCC8 <initial> 0643 0645
+FCC9 <initial> 0644 062C
+FCCA <initial> 0644 062D
+FCCB <initial> 0644 062E
+FCCC <initial> 0644 0645
+FCCD <initial> 0644 0647
+FCCE <initial> 0645 062C
+FCCF <initial> 0645 062D
+FCD0 <initial> 0645 062E
+FCD1 <initial> 0645 0645
+FCD2 <initial> 0646 062C
+FCD3 <initial> 0646 062D
+FCD4 <initial> 0646 062E
+FCD5 <initial> 0646 0645
+FCD6 <initial> 0646 0647
+FCD7 <initial> 0647 062C
+FCD8 <initial> 0647 0645
+FCD9 <initial> 0647 0670
+FCDA <initial> 064A 062C
+FCDB <initial> 064A 062D
+FCDC <initial> 064A 062E
+FCDD <initial> 064A 0645
+FCDE <initial> 064A 0647
+FCDF <medial> 0626 0645
+FCE0 <medial> 0626 0647
+FCE1 <medial> 0628 0645
+FCE2 <medial> 0628 0647
+FCE3 <medial> 062A 0645
+FCE4 <medial> 062A 0647
+FCE5 <medial> 062B 0645
+FCE6 <medial> 062B 0647
+FCE7 <medial> 0633 0645
+FCE8 <medial> 0633 0647
+FCE9 <medial> 0634 0645
+FCEA <medial> 0634 0647
+FCEB <medial> 0643 0644
+FCEC <medial> 0643 0645
+FCED <medial> 0644 0645
+FCEE <medial> 0646 0645
+FCEF <medial> 0646 0647
+FCF0 <medial> 064A 0645
+FCF1 <medial> 064A 0647
+FCF2 <medial> 0640 064E 0651
+FCF3 <medial> 0640 064F 0651
+FCF4 <medial> 0640 0650 0651
+FCF5 <isolated> 0637 0649
+FCF6 <isolated> 0637 064A
+FCF7 <isolated> 0639 0649
+FCF8 <isolated> 0639 064A
+FCF9 <isolated> 063A 0649
+FCFA <isolated> 063A 064A
+FCFB <isolated> 0633 0649
+FCFC <isolated> 0633 064A
+FCFD <isolated> 0634 0649
+FCFE <isolated> 0634 064A
+FCFF <isolated> 062D 0649
+FD00 <isolated> 062D 064A
+FD01 <isolated> 062C 0649
+FD02 <isolated> 062C 064A
+FD03 <isolated> 062E 0649
+FD04 <isolated> 062E 064A
+FD05 <isolated> 0635 0649
+FD06 <isolated> 0635 064A
+FD07 <isolated> 0636 0649
+FD08 <isolated> 0636 064A
+FD09 <isolated> 0634 062C
+FD0A <isolated> 0634 062D
+FD0B <isolated> 0634 062E
+FD0C <isolated> 0634 0645
+FD0D <isolated> 0634 0631
+FD0E <isolated> 0633 0631
+FD0F <isolated> 0635 0631
+FD10 <isolated> 0636 0631
+FD11 <final> 0637 0649
+FD12 <final> 0637 064A
+FD13 <final> 0639 0649
+FD14 <final> 0639 064A
+FD15 <final> 063A 0649
+FD16 <final> 063A 064A
+FD17 <final> 0633 0649
+FD18 <final> 0633 064A
+FD19 <final> 0634 0649
+FD1A <final> 0634 064A
+FD1B <final> 062D 0649
+FD1C <final> 062D 064A
+FD1D <final> 062C 0649
+FD1E <final> 062C 064A
+FD1F <final> 062E 0649
+FD20 <final> 062E 064A
+FD21 <final> 0635 0649
+FD22 <final> 0635 064A
+FD23 <final> 0636 0649
+FD24 <final> 0636 064A
+FD25 <final> 0634 062C
+FD26 <final> 0634 062D
+FD27 <final> 0634 062E
+FD28 <final> 0634 0645
+FD29 <final> 0634 0631
+FD2A <final> 0633 0631
+FD2B <final> 0635 0631
+FD2C <final> 0636 0631
+FD2D <initial> 0634 062C
+FD2E <initial> 0634 062D
+FD2F <initial> 0634 062E
+FD30 <initial> 0634 0645
+FD31 <initial> 0633 0647
+FD32 <initial> 0634 0647
+FD33 <initial> 0637 0645
+FD34 <medial> 0633 062C
+FD35 <medial> 0633 062D
+FD36 <medial> 0633 062E
+FD37 <medial> 0634 062C
+FD38 <medial> 0634 062D
+FD39 <medial> 0634 062E
+FD3A <medial> 0637 0645
+FD3B <medial> 0638 0645
+FD3C <final> 0627 064B
+FD3D <isolated> 0627 064B
+FD50 <initial> 062A 062C 0645
+FD51 <final> 062A 062D 062C
+FD52 <initial> 062A 062D 062C
+FD53 <initial> 062A 062D 0645
+FD54 <initial> 062A 062E 0645
+FD55 <initial> 062A 0645 062C
+FD56 <initial> 062A 0645 062D
+FD57 <initial> 062A 0645 062E
+FD58 <final> 062C 0645 062D
+FD59 <initial> 062C 0645 062D
+FD5A <final> 062D 0645 064A
+FD5B <final> 062D 0645 0649
+FD5C <initial> 0633 062D 062C
+FD5D <initial> 0633 062C 062D
+FD5E <final> 0633 062C 0649
+FD5F <final> 0633 0645 062D
+FD60 <initial> 0633 0645 062D
+FD61 <initial> 0633 0645 062C
+FD62 <final> 0633 0645 0645
+FD63 <initial> 0633 0645 0645
+FD64 <final> 0635 062D 062D
+FD65 <initial> 0635 062D 062D
+FD66 <final> 0635 0645 0645
+FD67 <final> 0634 062D 0645
+FD68 <initial> 0634 062D 0645
+FD69 <final> 0634 062C 064A
+FD6A <final> 0634 0645 062E
+FD6B <initial> 0634 0645 062E
+FD6C <final> 0634 0645 0645
+FD6D <initial> 0634 0645 0645
+FD6E <final> 0636 062D 0649
+FD6F <final> 0636 062E 0645
+FD70 <initial> 0636 062E 0645
+FD71 <final> 0637 0645 062D
+FD72 <initial> 0637 0645 062D
+FD73 <initial> 0637 0645 0645
+FD74 <final> 0637 0645 064A
+FD75 <final> 0639 062C 0645
+FD76 <final> 0639 0645 0645
+FD77 <initial> 0639 0645 0645
+FD78 <final> 0639 0645 0649
+FD79 <final> 063A 0645 0645
+FD7A <final> 063A 0645 064A
+FD7B <final> 063A 0645 0649
+FD7C <final> 0641 062E 0645
+FD7D <initial> 0641 062E 0645
+FD7E <final> 0642 0645 062D
+FD7F <final> 0642 0645 0645
+FD80 <final> 0644 062D 0645
+FD81 <final> 0644 062D 064A
+FD82 <final> 0644 062D 0649
+FD83 <initial> 0644 062C 062C
+FD84 <final> 0644 062C 062C
+FD85 <final> 0644 062E 0645
+FD86 <initial> 0644 062E 0645
+FD87 <final> 0644 0645 062D
+FD88 <initial> 0644 0645 062D
+FD89 <initial> 0645 062D 062C
+FD8A <initial> 0645 062D 0645
+FD8B <final> 0645 062D 064A
+FD8C <initial> 0645 062C 062D
+FD8D <initial> 0645 062C 0645
+FD8E <initial> 0645 062E 062C
+FD8F <initial> 0645 062E 0645
+FD92 <initial> 0645 062C 062E
+FD93 <initial> 0647 0645 062C
+FD94 <initial> 0647 0645 0645
+FD95 <initial> 0646 062D 0645
+FD96 <final> 0646 062D 0649
+FD97 <final> 0646 062C 0645
+FD98 <initial> 0646 062C 0645
+FD99 <final> 0646 062C 0649
+FD9A <final> 0646 0645 064A
+FD9B <final> 0646 0645 0649
+FD9C <final> 064A 0645 0645
+FD9D <initial> 064A 0645 0645
+FD9E <final> 0628 062E 064A
+FD9F <final> 062A 062C 064A
+FDA0 <final> 062A 062C 0649
+FDA1 <final> 062A 062E 064A
+FDA2 <final> 062A 062E 0649
+FDA3 <final> 062A 0645 064A
+FDA4 <final> 062A 0645 0649
+FDA5 <final> 062C 0645 064A
+FDA6 <final> 062C 062D 0649
+FDA7 <final> 062C 0645 0649
+FDA8 <final> 0633 062E 0649
+FDA9 <final> 0635 062D 064A
+FDAA <final> 0634 062D 064A
+FDAB <final> 0636 062D 064A
+FDAC <final> 0644 062C 064A
+FDAD <final> 0644 0645 064A
+FDAE <final> 064A 062D 064A
+FDAF <final> 064A 062C 064A
+FDB0 <final> 064A 0645 064A
+FDB1 <final> 0645 0645 064A
+FDB2 <final> 0642 0645 064A
+FDB3 <final> 0646 062D 064A
+FDB4 <initial> 0642 0645 062D
+FDB5 <initial> 0644 062D 0645
+FDB6 <final> 0639 0645 064A
+FDB7 <final> 0643 0645 064A
+FDB8 <initial> 0646 062C 062D
+FDB9 <final> 0645 062E 064A
+FDBA <initial> 0644 062C 0645
+FDBB <final> 0643 0645 0645
+FDBC <final> 0644 062C 0645
+FDBD <final> 0646 062C 062D
+FDBE <final> 062C 062D 064A
+FDBF <final> 062D 062C 064A
+FDC0 <final> 0645 062C 064A
+FDC1 <final> 0641 0645 064A
+FDC2 <final> 0628 062D 064A
+FDC3 <initial> 0643 0645 0645
+FDC4 <initial> 0639 062C 0645
+FDC5 <initial> 0635 0645 0645
+FDC6 <final> 0633 062E 064A
+FDC7 <final> 0646 062C 064A
+FDF0 <isolated> 0635 0644 06D2
+FDF1 <isolated> 0642 0644 06D2
+FDF2 <isolated> 0627 0644 0644 0647
+FDF3 <isolated> 0627 0643 0628 0631
+FDF4 <isolated> 0645 062D 0645 062F
+FDF5 <isolated> 0635 0644 0639 0645
+FDF6 <isolated> 0631 0633 0648 0644
+FDF7 <isolated> 0639 0644 064A 0647
+FDF8 <isolated> 0648 0633 0644 0645
+FDF9 <isolated> 0635 0644 0649
+FDFA <isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645
+FDFB <isolated> 062C 0644 0020 062C 0644 0627 0644 0647
+FDFC <isolated> 0631 06CC 0627 0644
+FE10 <vertical> 002C
+FE11 <vertical> 3001
+FE12 <vertical> 3002
+FE13 <vertical> 003A
+FE14 <vertical> 003B
+FE15 <vertical> 0021
+FE16 <vertical> 003F
+FE17 <vertical> 3016
+FE18 <vertical> 3017
+FE19 <vertical> 2026
+FE30 <vertical> 2025
+FE31 <vertical> 2014
+FE32 <vertical> 2013
+FE33 FE34 <vertical> 005F
+FE35 <vertical> 0028
+FE36 <vertical> 0029
+FE37 <vertical> 007B
+FE38 <vertical> 007D
+FE39 <vertical> 3014
+FE3A <vertical> 3015
+FE3B <vertical> 3010
+FE3C <vertical> 3011
+FE3D <vertical> 300A
+FE3E <vertical> 300B
+FE3F <vertical> 3008
+FE40 <vertical> 3009
+FE41 <vertical> 300C
+FE42 <vertical> 300D
+FE43 <vertical> 300E
+FE44 <vertical> 300F
+FE47 <vertical> 005B
+FE48 <vertical> 005D
+FE49 FE4C <compat> 203E
+FE4D FE4F <compat> 005F
+FE50 <small> 002C
+FE51 <small> 3001
+FE52 <small> 002E
+FE54 <small> 003B
+FE55 <small> 003A
+FE56 <small> 003F
+FE57 <small> 0021
+FE58 <small> 2014
+FE59 <small> 0028
+FE5A <small> 0029
+FE5B <small> 007B
+FE5C <small> 007D
+FE5D <small> 3014
+FE5E <small> 3015
+FE5F <small> 0023
+FE60 <small> 0026
+FE61 <small> 002A
+FE62 <small> 002B
+FE63 <small> 002D
+FE64 <small> 003C
+FE65 <small> 003E
+FE66 <small> 003D
+FE68 <small> 005C
+FE69 <small> 0024
+FE6A <small> 0025
+FE6B <small> 0040
+FE70 <isolated> 0020 064B
+FE71 <medial> 0640 064B
+FE72 <isolated> 0020 064C
+FE74 <isolated> 0020 064D
+FE76 <isolated> 0020 064E
+FE77 <medial> 0640 064E
+FE78 <isolated> 0020 064F
+FE79 <medial> 0640 064F
+FE7A <isolated> 0020 0650
+FE7B <medial> 0640 0650
+FE7C <isolated> 0020 0651
+FE7D <medial> 0640 0651
+FE7E <isolated> 0020 0652
+FE7F <medial> 0640 0652
+FE80 <isolated> 0621
+FE81 <isolated> 0622
+FE82 <final> 0622
+FE83 <isolated> 0623
+FE84 <final> 0623
+FE85 <isolated> 0624
+FE86 <final> 0624
+FE87 <isolated> 0625
+FE88 <final> 0625
+FE89 <isolated> 0626
+FE8A <final> 0626
+FE8B <initial> 0626
+FE8C <medial> 0626
+FE8D <isolated> 0627
+FE8E <final> 0627
+FE8F <isolated> 0628
+FE90 <final> 0628
+FE91 <initial> 0628
+FE92 <medial> 0628
+FE93 <isolated> 0629
+FE94 <final> 0629
+FE95 <isolated> 062A
+FE96 <final> 062A
+FE97 <initial> 062A
+FE98 <medial> 062A
+FE99 <isolated> 062B
+FE9A <final> 062B
+FE9B <initial> 062B
+FE9C <medial> 062B
+FE9D <isolated> 062C
+FE9E <final> 062C
+FE9F <initial> 062C
+FEA0 <medial> 062C
+FEA1 <isolated> 062D
+FEA2 <final> 062D
+FEA3 <initial> 062D
+FEA4 <medial> 062D
+FEA5 <isolated> 062E
+FEA6 <final> 062E
+FEA7 <initial> 062E
+FEA8 <medial> 062E
+FEA9 <isolated> 062F
+FEAA <final> 062F
+FEAB <isolated> 0630
+FEAC <final> 0630
+FEAD <isolated> 0631
+FEAE <final> 0631
+FEAF <isolated> 0632
+FEB0 <final> 0632
+FEB1 <isolated> 0633
+FEB2 <final> 0633
+FEB3 <initial> 0633
+FEB4 <medial> 0633
+FEB5 <isolated> 0634
+FEB6 <final> 0634
+FEB7 <initial> 0634
+FEB8 <medial> 0634
+FEB9 <isolated> 0635
+FEBA <final> 0635
+FEBB <initial> 0635
+FEBC <medial> 0635
+FEBD <isolated> 0636
+FEBE <final> 0636
+FEBF <initial> 0636
+FEC0 <medial> 0636
+FEC1 <isolated> 0637
+FEC2 <final> 0637
+FEC3 <initial> 0637
+FEC4 <medial> 0637
+FEC5 <isolated> 0638
+FEC6 <final> 0638
+FEC7 <initial> 0638
+FEC8 <medial> 0638
+FEC9 <isolated> 0639
+FECA <final> 0639
+FECB <initial> 0639
+FECC <medial> 0639
+FECD <isolated> 063A
+FECE <final> 063A
+FECF <initial> 063A
+FED0 <medial> 063A
+FED1 <isolated> 0641
+FED2 <final> 0641
+FED3 <initial> 0641
+FED4 <medial> 0641
+FED5 <isolated> 0642
+FED6 <final> 0642
+FED7 <initial> 0642
+FED8 <medial> 0642
+FED9 <isolated> 0643
+FEDA <final> 0643
+FEDB <initial> 0643
+FEDC <medial> 0643
+FEDD <isolated> 0644
+FEDE <final> 0644
+FEDF <initial> 0644
+FEE0 <medial> 0644
+FEE1 <isolated> 0645
+FEE2 <final> 0645
+FEE3 <initial> 0645
+FEE4 <medial> 0645
+FEE5 <isolated> 0646
+FEE6 <final> 0646
+FEE7 <initial> 0646
+FEE8 <medial> 0646
+FEE9 <isolated> 0647
+FEEA <final> 0647
+FEEB <initial> 0647
+FEEC <medial> 0647
+FEED <isolated> 0648
+FEEE <final> 0648
+FEEF <isolated> 0649
+FEF0 <final> 0649
+FEF1 <isolated> 064A
+FEF2 <final> 064A
+FEF3 <initial> 064A
+FEF4 <medial> 064A
+FEF5 <isolated> 0644 0622
+FEF6 <final> 0644 0622
+FEF7 <isolated> 0644 0623
+FEF8 <final> 0644 0623
+FEF9 <isolated> 0644 0625
+FEFA <final> 0644 0625
+FEFB <isolated> 0644 0627
+FEFC <final> 0644 0627
+FF01 <wide> 0021
+FF02 <wide> 0022
+FF03 <wide> 0023
+FF04 <wide> 0024
+FF05 <wide> 0025
+FF06 <wide> 0026
+FF07 <wide> 0027
+FF08 <wide> 0028
+FF09 <wide> 0029
+FF0A <wide> 002A
+FF0B <wide> 002B
+FF0C <wide> 002C
+FF0D <wide> 002D
+FF0E <wide> 002E
+FF0F <wide> 002F
+FF10 <wide> 0030
+FF11 <wide> 0031
+FF12 <wide> 0032
+FF13 <wide> 0033
+FF14 <wide> 0034
+FF15 <wide> 0035
+FF16 <wide> 0036
+FF17 <wide> 0037
+FF18 <wide> 0038
+FF19 <wide> 0039
+FF1A <wide> 003A
+FF1B <wide> 003B
+FF1C <wide> 003C
+FF1D <wide> 003D
+FF1E <wide> 003E
+FF1F <wide> 003F
+FF20 <wide> 0040
+FF21 <wide> 0041
+FF22 <wide> 0042
+FF23 <wide> 0043
+FF24 <wide> 0044
+FF25 <wide> 0045
+FF26 <wide> 0046
+FF27 <wide> 0047
+FF28 <wide> 0048
+FF29 <wide> 0049
+FF2A <wide> 004A
+FF2B <wide> 004B
+FF2C <wide> 004C
+FF2D <wide> 004D
+FF2E <wide> 004E
+FF2F <wide> 004F
+FF30 <wide> 0050
+FF31 <wide> 0051
+FF32 <wide> 0052
+FF33 <wide> 0053
+FF34 <wide> 0054
+FF35 <wide> 0055
+FF36 <wide> 0056
+FF37 <wide> 0057
+FF38 <wide> 0058
+FF39 <wide> 0059
+FF3A <wide> 005A
+FF3B <wide> 005B
+FF3C <wide> 005C
+FF3D <wide> 005D
+FF3E <wide> 005E
+FF3F <wide> 005F
+FF40 <wide> 0060
+FF41 <wide> 0061
+FF42 <wide> 0062
+FF43 <wide> 0063
+FF44 <wide> 0064
+FF45 <wide> 0065
+FF46 <wide> 0066
+FF47 <wide> 0067
+FF48 <wide> 0068
+FF49 <wide> 0069
+FF4A <wide> 006A
+FF4B <wide> 006B
+FF4C <wide> 006C
+FF4D <wide> 006D
+FF4E <wide> 006E
+FF4F <wide> 006F
+FF50 <wide> 0070
+FF51 <wide> 0071
+FF52 <wide> 0072
+FF53 <wide> 0073
+FF54 <wide> 0074
+FF55 <wide> 0075
+FF56 <wide> 0076
+FF57 <wide> 0077
+FF58 <wide> 0078
+FF59 <wide> 0079
+FF5A <wide> 007A
+FF5B <wide> 007B
+FF5C <wide> 007C
+FF5D <wide> 007D
+FF5E <wide> 007E
+FF5F <wide> 2985
+FF60 <wide> 2986
+FF61 <narrow> 3002
+FF62 <narrow> 300C
+FF63 <narrow> 300D
+FF64 <narrow> 3001
+FF65 <narrow> 30FB
+FF66 <narrow> 30F2
+FF67 <narrow> 30A1
+FF68 <narrow> 30A3
+FF69 <narrow> 30A5
+FF6A <narrow> 30A7
+FF6B <narrow> 30A9
+FF6C <narrow> 30E3
+FF6D <narrow> 30E5
+FF6E <narrow> 30E7
+FF6F <narrow> 30C3
+FF70 <narrow> 30FC
+FF71 <narrow> 30A2
+FF72 <narrow> 30A4
+FF73 <narrow> 30A6
+FF74 <narrow> 30A8
+FF75 <narrow> 30AA
+FF76 <narrow> 30AB
+FF77 <narrow> 30AD
+FF78 <narrow> 30AF
+FF79 <narrow> 30B1
+FF7A <narrow> 30B3
+FF7B <narrow> 30B5
+FF7C <narrow> 30B7
+FF7D <narrow> 30B9
+FF7E <narrow> 30BB
+FF7F <narrow> 30BD
+FF80 <narrow> 30BF
+FF81 <narrow> 30C1
+FF82 <narrow> 30C4
+FF83 <narrow> 30C6
+FF84 <narrow> 30C8
+FF85 <narrow> 30CA
+FF86 <narrow> 30CB
+FF87 <narrow> 30CC
+FF88 <narrow> 30CD
+FF89 <narrow> 30CE
+FF8A <narrow> 30CF
+FF8B <narrow> 30D2
+FF8C <narrow> 30D5
+FF8D <narrow> 30D8
+FF8E <narrow> 30DB
+FF8F <narrow> 30DE
+FF90 <narrow> 30DF
+FF91 <narrow> 30E0
+FF92 <narrow> 30E1
+FF93 <narrow> 30E2
+FF94 <narrow> 30E4
+FF95 <narrow> 30E6
+FF96 <narrow> 30E8
+FF97 <narrow> 30E9
+FF98 <narrow> 30EA
+FF99 <narrow> 30EB
+FF9A <narrow> 30EC
+FF9B <narrow> 30ED
+FF9C <narrow> 30EF
+FF9D <narrow> 30F3
+FF9E <narrow> 3099
+FF9F <narrow> 309A
+FFA0 <narrow> 3164
+FFA1 <narrow> 3131
+FFA2 <narrow> 3132
+FFA3 <narrow> 3133
+FFA4 <narrow> 3134
+FFA5 <narrow> 3135
+FFA6 <narrow> 3136
+FFA7 <narrow> 3137
+FFA8 <narrow> 3138
+FFA9 <narrow> 3139
+FFAA <narrow> 313A
+FFAB <narrow> 313B
+FFAC <narrow> 313C
+FFAD <narrow> 313D
+FFAE <narrow> 313E
+FFAF <narrow> 313F
+FFB0 <narrow> 3140
+FFB1 <narrow> 3141
+FFB2 <narrow> 3142
+FFB3 <narrow> 3143
+FFB4 <narrow> 3144
+FFB5 <narrow> 3145
+FFB6 <narrow> 3146
+FFB7 <narrow> 3147
+FFB8 <narrow> 3148
+FFB9 <narrow> 3149
+FFBA <narrow> 314A
+FFBB <narrow> 314B
+FFBC <narrow> 314C
+FFBD <narrow> 314D
+FFBE <narrow> 314E
+FFC2 <narrow> 314F
+FFC3 <narrow> 3150
+FFC4 <narrow> 3151
+FFC5 <narrow> 3152
+FFC6 <narrow> 3153
+FFC7 <narrow> 3154
+FFCA <narrow> 3155
+FFCB <narrow> 3156
+FFCC <narrow> 3157
+FFCD <narrow> 3158
+FFCE <narrow> 3159
+FFCF <narrow> 315A
+FFD2 <narrow> 315B
+FFD3 <narrow> 315C
+FFD4 <narrow> 315D
+FFD5 <narrow> 315E
+FFD6 <narrow> 315F
+FFD7 <narrow> 3160
+FFDA <narrow> 3161
+FFDB <narrow> 3162
+FFDC <narrow> 3163
+FFE0 <wide> 00A2
+FFE1 <wide> 00A3
+FFE2 <wide> 00AC
+FFE3 <wide> 00AF
+FFE4 <wide> 00A6
+FFE5 <wide> 00A5
+FFE6 <wide> 20A9
+FFE8 <narrow> 2502
+FFE9 <narrow> 2190
+FFEA <narrow> 2191
+FFEB <narrow> 2192
+FFEC <narrow> 2193
+FFED <narrow> 25A0
+FFEE <narrow> 25CB
+1D15E 1D157 1D165
+1D15F 1D158 1D165
+1D160 1D15F 1D16E
+1D161 1D15F 1D16F
+1D162 1D15F 1D170
+1D163 1D15F 1D171
+1D164 1D15F 1D172
+1D1BB 1D1B9 1D165
+1D1BC 1D1BA 1D165
+1D1BD 1D1BB 1D16E
+1D1BE 1D1BC 1D16E
+1D1BF 1D1BB 1D16F
+1D1C0 1D1BC 1D16F
+1D400 <font> 0041
+1D401 <font> 0042
+1D402 <font> 0043
+1D403 <font> 0044
+1D404 <font> 0045
+1D405 <font> 0046
+1D406 <font> 0047
+1D407 <font> 0048
+1D408 <font> 0049
+1D409 <font> 004A
+1D40A <font> 004B
+1D40B <font> 004C
+1D40C <font> 004D
+1D40D <font> 004E
+1D40E <font> 004F
+1D40F <font> 0050
+1D410 <font> 0051
+1D411 <font> 0052
+1D412 <font> 0053
+1D413 <font> 0054
+1D414 <font> 0055
+1D415 <font> 0056
+1D416 <font> 0057
+1D417 <font> 0058
+1D418 <font> 0059
+1D419 <font> 005A
+1D41A <font> 0061
+1D41B <font> 0062
+1D41C <font> 0063
+1D41D <font> 0064
+1D41E <font> 0065
+1D41F <font> 0066
+1D420 <font> 0067
+1D421 <font> 0068
+1D422 <font> 0069
+1D423 <font> 006A
+1D424 <font> 006B
+1D425 <font> 006C
+1D426 <font> 006D
+1D427 <font> 006E
+1D428 <font> 006F
+1D429 <font> 0070
+1D42A <font> 0071
+1D42B <font> 0072
+1D42C <font> 0073
+1D42D <font> 0074
+1D42E <font> 0075
+1D42F <font> 0076
+1D430 <font> 0077
+1D431 <font> 0078
+1D432 <font> 0079
+1D433 <font> 007A
+1D434 <font> 0041
+1D435 <font> 0042
+1D436 <font> 0043
+1D437 <font> 0044
+1D438 <font> 0045
+1D439 <font> 0046
+1D43A <font> 0047
+1D43B <font> 0048
+1D43C <font> 0049
+1D43D <font> 004A
+1D43E <font> 004B
+1D43F <font> 004C
+1D440 <font> 004D
+1D441 <font> 004E
+1D442 <font> 004F
+1D443 <font> 0050
+1D444 <font> 0051
+1D445 <font> 0052
+1D446 <font> 0053
+1D447 <font> 0054
+1D448 <font> 0055
+1D449 <font> 0056
+1D44A <font> 0057
+1D44B <font> 0058
+1D44C <font> 0059
+1D44D <font> 005A
+1D44E <font> 0061
+1D44F <font> 0062
+1D450 <font> 0063
+1D451 <font> 0064
+1D452 <font> 0065
+1D453 <font> 0066
+1D454 <font> 0067
+1D456 <font> 0069
+1D457 <font> 006A
+1D458 <font> 006B
+1D459 <font> 006C
+1D45A <font> 006D
+1D45B <font> 006E
+1D45C <font> 006F
+1D45D <font> 0070
+1D45E <font> 0071
+1D45F <font> 0072
+1D460 <font> 0073
+1D461 <font> 0074
+1D462 <font> 0075
+1D463 <font> 0076
+1D464 <font> 0077
+1D465 <font> 0078
+1D466 <font> 0079
+1D467 <font> 007A
+1D468 <font> 0041
+1D469 <font> 0042
+1D46A <font> 0043
+1D46B <font> 0044
+1D46C <font> 0045
+1D46D <font> 0046
+1D46E <font> 0047
+1D46F <font> 0048
+1D470 <font> 0049
+1D471 <font> 004A
+1D472 <font> 004B
+1D473 <font> 004C
+1D474 <font> 004D
+1D475 <font> 004E
+1D476 <font> 004F
+1D477 <font> 0050
+1D478 <font> 0051
+1D479 <font> 0052
+1D47A <font> 0053
+1D47B <font> 0054
+1D47C <font> 0055
+1D47D <font> 0056
+1D47E <font> 0057
+1D47F <font> 0058
+1D480 <font> 0059
+1D481 <font> 005A
+1D482 <font> 0061
+1D483 <font> 0062
+1D484 <font> 0063
+1D485 <font> 0064
+1D486 <font> 0065
+1D487 <font> 0066
+1D488 <font> 0067
+1D489 <font> 0068
+1D48A <font> 0069
+1D48B <font> 006A
+1D48C <font> 006B
+1D48D <font> 006C
+1D48E <font> 006D
+1D48F <font> 006E
+1D490 <font> 006F
+1D491 <font> 0070
+1D492 <font> 0071
+1D493 <font> 0072
+1D494 <font> 0073
+1D495 <font> 0074
+1D496 <font> 0075
+1D497 <font> 0076
+1D498 <font> 0077
+1D499 <font> 0078
+1D49A <font> 0079
+1D49B <font> 007A
+1D49C <font> 0041
+1D49E <font> 0043
+1D49F <font> 0044
+1D4A2 <font> 0047
+1D4A5 <font> 004A
+1D4A6 <font> 004B
+1D4A9 <font> 004E
+1D4AA <font> 004F
+1D4AB <font> 0050
+1D4AC <font> 0051
+1D4AE <font> 0053
+1D4AF <font> 0054
+1D4B0 <font> 0055
+1D4B1 <font> 0056
+1D4B2 <font> 0057
+1D4B3 <font> 0058
+1D4B4 <font> 0059
+1D4B5 <font> 005A
+1D4B6 <font> 0061
+1D4B7 <font> 0062
+1D4B8 <font> 0063
+1D4B9 <font> 0064
+1D4BB <font> 0066
+1D4BD <font> 0068
+1D4BE <font> 0069
+1D4BF <font> 006A
+1D4C0 <font> 006B
+1D4C1 <font> 006C
+1D4C2 <font> 006D
+1D4C3 <font> 006E
+1D4C5 <font> 0070
+1D4C6 <font> 0071
+1D4C7 <font> 0072
+1D4C8 <font> 0073
+1D4C9 <font> 0074
+1D4CA <font> 0075
+1D4CB <font> 0076
+1D4CC <font> 0077
+1D4CD <font> 0078
+1D4CE <font> 0079
+1D4CF <font> 007A
+1D4D0 <font> 0041
+1D4D1 <font> 0042
+1D4D2 <font> 0043
+1D4D3 <font> 0044
+1D4D4 <font> 0045
+1D4D5 <font> 0046
+1D4D6 <font> 0047
+1D4D7 <font> 0048
+1D4D8 <font> 0049
+1D4D9 <font> 004A
+1D4DA <font> 004B
+1D4DB <font> 004C
+1D4DC <font> 004D
+1D4DD <font> 004E
+1D4DE <font> 004F
+1D4DF <font> 0050
+1D4E0 <font> 0051
+1D4E1 <font> 0052
+1D4E2 <font> 0053
+1D4E3 <font> 0054
+1D4E4 <font> 0055
+1D4E5 <font> 0056
+1D4E6 <font> 0057
+1D4E7 <font> 0058
+1D4E8 <font> 0059
+1D4E9 <font> 005A
+1D4EA <font> 0061
+1D4EB <font> 0062
+1D4EC <font> 0063
+1D4ED <font> 0064
+1D4EE <font> 0065
+1D4EF <font> 0066
+1D4F0 <font> 0067
+1D4F1 <font> 0068
+1D4F2 <font> 0069
+1D4F3 <font> 006A
+1D4F4 <font> 006B
+1D4F5 <font> 006C
+1D4F6 <font> 006D
+1D4F7 <font> 006E
+1D4F8 <font> 006F
+1D4F9 <font> 0070
+1D4FA <font> 0071
+1D4FB <font> 0072
+1D4FC <font> 0073
+1D4FD <font> 0074
+1D4FE <font> 0075
+1D4FF <font> 0076
+1D500 <font> 0077
+1D501 <font> 0078
+1D502 <font> 0079
+1D503 <font> 007A
+1D504 <font> 0041
+1D505 <font> 0042
+1D507 <font> 0044
+1D508 <font> 0045
+1D509 <font> 0046
+1D50A <font> 0047
+1D50D <font> 004A
+1D50E <font> 004B
+1D50F <font> 004C
+1D510 <font> 004D
+1D511 <font> 004E
+1D512 <font> 004F
+1D513 <font> 0050
+1D514 <font> 0051
+1D516 <font> 0053
+1D517 <font> 0054
+1D518 <font> 0055
+1D519 <font> 0056
+1D51A <font> 0057
+1D51B <font> 0058
+1D51C <font> 0059
+1D51E <font> 0061
+1D51F <font> 0062
+1D520 <font> 0063
+1D521 <font> 0064
+1D522 <font> 0065
+1D523 <font> 0066
+1D524 <font> 0067
+1D525 <font> 0068
+1D526 <font> 0069
+1D527 <font> 006A
+1D528 <font> 006B
+1D529 <font> 006C
+1D52A <font> 006D
+1D52B <font> 006E
+1D52C <font> 006F
+1D52D <font> 0070
+1D52E <font> 0071
+1D52F <font> 0072
+1D530 <font> 0073
+1D531 <font> 0074
+1D532 <font> 0075
+1D533 <font> 0076
+1D534 <font> 0077
+1D535 <font> 0078
+1D536 <font> 0079
+1D537 <font> 007A
+1D538 <font> 0041
+1D539 <font> 0042
+1D53B <font> 0044
+1D53C <font> 0045
+1D53D <font> 0046
+1D53E <font> 0047
+1D540 <font> 0049
+1D541 <font> 004A
+1D542 <font> 004B
+1D543 <font> 004C
+1D544 <font> 004D
+1D546 <font> 004F
+1D54A <font> 0053
+1D54B <font> 0054
+1D54C <font> 0055
+1D54D <font> 0056
+1D54E <font> 0057
+1D54F <font> 0058
+1D550 <font> 0059
+1D552 <font> 0061
+1D553 <font> 0062
+1D554 <font> 0063
+1D555 <font> 0064
+1D556 <font> 0065
+1D557 <font> 0066
+1D558 <font> 0067
+1D559 <font> 0068
+1D55A <font> 0069
+1D55B <font> 006A
+1D55C <font> 006B
+1D55D <font> 006C
+1D55E <font> 006D
+1D55F <font> 006E
+1D560 <font> 006F
+1D561 <font> 0070
+1D562 <font> 0071
+1D563 <font> 0072
+1D564 <font> 0073
+1D565 <font> 0074
+1D566 <font> 0075
+1D567 <font> 0076
+1D568 <font> 0077
+1D569 <font> 0078
+1D56A <font> 0079
+1D56B <font> 007A
+1D56C <font> 0041
+1D56D <font> 0042
+1D56E <font> 0043
+1D56F <font> 0044
+1D570 <font> 0045
+1D571 <font> 0046
+1D572 <font> 0047
+1D573 <font> 0048
+1D574 <font> 0049
+1D575 <font> 004A
+1D576 <font> 004B
+1D577 <font> 004C
+1D578 <font> 004D
+1D579 <font> 004E
+1D57A <font> 004F
+1D57B <font> 0050
+1D57C <font> 0051
+1D57D <font> 0052
+1D57E <font> 0053
+1D57F <font> 0054
+1D580 <font> 0055
+1D581 <font> 0056
+1D582 <font> 0057
+1D583 <font> 0058
+1D584 <font> 0059
+1D585 <font> 005A
+1D586 <font> 0061
+1D587 <font> 0062
+1D588 <font> 0063
+1D589 <font> 0064
+1D58A <font> 0065
+1D58B <font> 0066
+1D58C <font> 0067
+1D58D <font> 0068
+1D58E <font> 0069
+1D58F <font> 006A
+1D590 <font> 006B
+1D591 <font> 006C
+1D592 <font> 006D
+1D593 <font> 006E
+1D594 <font> 006F
+1D595 <font> 0070
+1D596 <font> 0071
+1D597 <font> 0072
+1D598 <font> 0073
+1D599 <font> 0074
+1D59A <font> 0075
+1D59B <font> 0076
+1D59C <font> 0077
+1D59D <font> 0078
+1D59E <font> 0079
+1D59F <font> 007A
+1D5A0 <font> 0041
+1D5A1 <font> 0042
+1D5A2 <font> 0043
+1D5A3 <font> 0044
+1D5A4 <font> 0045
+1D5A5 <font> 0046
+1D5A6 <font> 0047
+1D5A7 <font> 0048
+1D5A8 <font> 0049
+1D5A9 <font> 004A
+1D5AA <font> 004B
+1D5AB <font> 004C
+1D5AC <font> 004D
+1D5AD <font> 004E
+1D5AE <font> 004F
+1D5AF <font> 0050
+1D5B0 <font> 0051
+1D5B1 <font> 0052
+1D5B2 <font> 0053
+1D5B3 <font> 0054
+1D5B4 <font> 0055
+1D5B5 <font> 0056
+1D5B6 <font> 0057
+1D5B7 <font> 0058
+1D5B8 <font> 0059
+1D5B9 <font> 005A
+1D5BA <font> 0061
+1D5BB <font> 0062
+1D5BC <font> 0063
+1D5BD <font> 0064
+1D5BE <font> 0065
+1D5BF <font> 0066
+1D5C0 <font> 0067
+1D5C1 <font> 0068
+1D5C2 <font> 0069
+1D5C3 <font> 006A
+1D5C4 <font> 006B
+1D5C5 <font> 006C
+1D5C6 <font> 006D
+1D5C7 <font> 006E
+1D5C8 <font> 006F
+1D5C9 <font> 0070
+1D5CA <font> 0071
+1D5CB <font> 0072
+1D5CC <font> 0073
+1D5CD <font> 0074
+1D5CE <font> 0075
+1D5CF <font> 0076
+1D5D0 <font> 0077
+1D5D1 <font> 0078
+1D5D2 <font> 0079
+1D5D3 <font> 007A
+1D5D4 <font> 0041
+1D5D5 <font> 0042
+1D5D6 <font> 0043
+1D5D7 <font> 0044
+1D5D8 <font> 0045
+1D5D9 <font> 0046
+1D5DA <font> 0047
+1D5DB <font> 0048
+1D5DC <font> 0049
+1D5DD <font> 004A
+1D5DE <font> 004B
+1D5DF <font> 004C
+1D5E0 <font> 004D
+1D5E1 <font> 004E
+1D5E2 <font> 004F
+1D5E3 <font> 0050
+1D5E4 <font> 0051
+1D5E5 <font> 0052
+1D5E6 <font> 0053
+1D5E7 <font> 0054
+1D5E8 <font> 0055
+1D5E9 <font> 0056
+1D5EA <font> 0057
+1D5EB <font> 0058
+1D5EC <font> 0059
+1D5ED <font> 005A
+1D5EE <font> 0061
+1D5EF <font> 0062
+1D5F0 <font> 0063
+1D5F1 <font> 0064
+1D5F2 <font> 0065
+1D5F3 <font> 0066
+1D5F4 <font> 0067
+1D5F5 <font> 0068
+1D5F6 <font> 0069
+1D5F7 <font> 006A
+1D5F8 <font> 006B
+1D5F9 <font> 006C
+1D5FA <font> 006D
+1D5FB <font> 006E
+1D5FC <font> 006F
+1D5FD <font> 0070
+1D5FE <font> 0071
+1D5FF <font> 0072
+1D600 <font> 0073
+1D601 <font> 0074
+1D602 <font> 0075
+1D603 <font> 0076
+1D604 <font> 0077
+1D605 <font> 0078
+1D606 <font> 0079
+1D607 <font> 007A
+1D608 <font> 0041
+1D609 <font> 0042
+1D60A <font> 0043
+1D60B <font> 0044
+1D60C <font> 0045
+1D60D <font> 0046
+1D60E <font> 0047
+1D60F <font> 0048
+1D610 <font> 0049
+1D611 <font> 004A
+1D612 <font> 004B
+1D613 <font> 004C
+1D614 <font> 004D
+1D615 <font> 004E
+1D616 <font> 004F
+1D617 <font> 0050
+1D618 <font> 0051
+1D619 <font> 0052
+1D61A <font> 0053
+1D61B <font> 0054
+1D61C <font> 0055
+1D61D <font> 0056
+1D61E <font> 0057
+1D61F <font> 0058
+1D620 <font> 0059
+1D621 <font> 005A
+1D622 <font> 0061
+1D623 <font> 0062
+1D624 <font> 0063
+1D625 <font> 0064
+1D626 <font> 0065
+1D627 <font> 0066
+1D628 <font> 0067
+1D629 <font> 0068
+1D62A <font> 0069
+1D62B <font> 006A
+1D62C <font> 006B
+1D62D <font> 006C
+1D62E <font> 006D
+1D62F <font> 006E
+1D630 <font> 006F
+1D631 <font> 0070
+1D632 <font> 0071
+1D633 <font> 0072
+1D634 <font> 0073
+1D635 <font> 0074
+1D636 <font> 0075
+1D637 <font> 0076
+1D638 <font> 0077
+1D639 <font> 0078
+1D63A <font> 0079
+1D63B <font> 007A
+1D63C <font> 0041
+1D63D <font> 0042
+1D63E <font> 0043
+1D63F <font> 0044
+1D640 <font> 0045
+1D641 <font> 0046
+1D642 <font> 0047
+1D643 <font> 0048
+1D644 <font> 0049
+1D645 <font> 004A
+1D646 <font> 004B
+1D647 <font> 004C
+1D648 <font> 004D
+1D649 <font> 004E
+1D64A <font> 004F
+1D64B <font> 0050
+1D64C <font> 0051
+1D64D <font> 0052
+1D64E <font> 0053
+1D64F <font> 0054
+1D650 <font> 0055
+1D651 <font> 0056
+1D652 <font> 0057
+1D653 <font> 0058
+1D654 <font> 0059
+1D655 <font> 005A
+1D656 <font> 0061
+1D657 <font> 0062
+1D658 <font> 0063
+1D659 <font> 0064
+1D65A <font> 0065
+1D65B <font> 0066
+1D65C <font> 0067
+1D65D <font> 0068
+1D65E <font> 0069
+1D65F <font> 006A
+1D660 <font> 006B
+1D661 <font> 006C
+1D662 <font> 006D
+1D663 <font> 006E
+1D664 <font> 006F
+1D665 <font> 0070
+1D666 <font> 0071
+1D667 <font> 0072
+1D668 <font> 0073
+1D669 <font> 0074
+1D66A <font> 0075
+1D66B <font> 0076
+1D66C <font> 0077
+1D66D <font> 0078
+1D66E <font> 0079
+1D66F <font> 007A
+1D670 <font> 0041
+1D671 <font> 0042
+1D672 <font> 0043
+1D673 <font> 0044
+1D674 <font> 0045
+1D675 <font> 0046
+1D676 <font> 0047
+1D677 <font> 0048
+1D678 <font> 0049
+1D679 <font> 004A
+1D67A <font> 004B
+1D67B <font> 004C
+1D67C <font> 004D
+1D67D <font> 004E
+1D67E <font> 004F
+1D67F <font> 0050
+1D680 <font> 0051
+1D681 <font> 0052
+1D682 <font> 0053
+1D683 <font> 0054
+1D684 <font> 0055
+1D685 <font> 0056
+1D686 <font> 0057
+1D687 <font> 0058
+1D688 <font> 0059
+1D689 <font> 005A
+1D68A <font> 0061
+1D68B <font> 0062
+1D68C <font> 0063
+1D68D <font> 0064
+1D68E <font> 0065
+1D68F <font> 0066
+1D690 <font> 0067
+1D691 <font> 0068
+1D692 <font> 0069
+1D693 <font> 006A
+1D694 <font> 006B
+1D695 <font> 006C
+1D696 <font> 006D
+1D697 <font> 006E
+1D698 <font> 006F
+1D699 <font> 0070
+1D69A <font> 0071
+1D69B <font> 0072
+1D69C <font> 0073
+1D69D <font> 0074
+1D69E <font> 0075
+1D69F <font> 0076
+1D6A0 <font> 0077
+1D6A1 <font> 0078
+1D6A2 <font> 0079
+1D6A3 <font> 007A
+1D6A4 <font> 0131
+1D6A5 <font> 0237
+1D6A8 <font> 0391
+1D6A9 <font> 0392
+1D6AA <font> 0393
+1D6AB <font> 0394
+1D6AC <font> 0395
+1D6AD <font> 0396
+1D6AE <font> 0397
+1D6AF <font> 0398
+1D6B0 <font> 0399
+1D6B1 <font> 039A
+1D6B2 <font> 039B
+1D6B3 <font> 039C
+1D6B4 <font> 039D
+1D6B5 <font> 039E
+1D6B6 <font> 039F
+1D6B7 <font> 03A0
+1D6B8 <font> 03A1
+1D6B9 <font> 03F4
+1D6BA <font> 03A3
+1D6BB <font> 03A4
+1D6BC <font> 03A5
+1D6BD <font> 03A6
+1D6BE <font> 03A7
+1D6BF <font> 03A8
+1D6C0 <font> 03A9
+1D6C1 <font> 2207
+1D6C2 <font> 03B1
+1D6C3 <font> 03B2
+1D6C4 <font> 03B3
+1D6C5 <font> 03B4
+1D6C6 <font> 03B5
+1D6C7 <font> 03B6
+1D6C8 <font> 03B7
+1D6C9 <font> 03B8
+1D6CA <font> 03B9
+1D6CB <font> 03BA
+1D6CC <font> 03BB
+1D6CD <font> 03BC
+1D6CE <font> 03BD
+1D6CF <font> 03BE
+1D6D0 <font> 03BF
+1D6D1 <font> 03C0
+1D6D2 <font> 03C1
+1D6D3 <font> 03C2
+1D6D4 <font> 03C3
+1D6D5 <font> 03C4
+1D6D6 <font> 03C5
+1D6D7 <font> 03C6
+1D6D8 <font> 03C7
+1D6D9 <font> 03C8
+1D6DA <font> 03C9
+1D6DB <font> 2202
+1D6DC <font> 03F5
+1D6DD <font> 03D1
+1D6DE <font> 03F0
+1D6DF <font> 03D5
+1D6E0 <font> 03F1
+1D6E1 <font> 03D6
+1D6E2 <font> 0391
+1D6E3 <font> 0392
+1D6E4 <font> 0393
+1D6E5 <font> 0394
+1D6E6 <font> 0395
+1D6E7 <font> 0396
+1D6E8 <font> 0397
+1D6E9 <font> 0398
+1D6EA <font> 0399
+1D6EB <font> 039A
+1D6EC <font> 039B
+1D6ED <font> 039C
+1D6EE <font> 039D
+1D6EF <font> 039E
+1D6F0 <font> 039F
+1D6F1 <font> 03A0
+1D6F2 <font> 03A1
+1D6F3 <font> 03F4
+1D6F4 <font> 03A3
+1D6F5 <font> 03A4
+1D6F6 <font> 03A5
+1D6F7 <font> 03A6
+1D6F8 <font> 03A7
+1D6F9 <font> 03A8
+1D6FA <font> 03A9
+1D6FB <font> 2207
+1D6FC <font> 03B1
+1D6FD <font> 03B2
+1D6FE <font> 03B3
+1D6FF <font> 03B4
+1D700 <font> 03B5
+1D701 <font> 03B6
+1D702 <font> 03B7
+1D703 <font> 03B8
+1D704 <font> 03B9
+1D705 <font> 03BA
+1D706 <font> 03BB
+1D707 <font> 03BC
+1D708 <font> 03BD
+1D709 <font> 03BE
+1D70A <font> 03BF
+1D70B <font> 03C0
+1D70C <font> 03C1
+1D70D <font> 03C2
+1D70E <font> 03C3
+1D70F <font> 03C4
+1D710 <font> 03C5
+1D711 <font> 03C6
+1D712 <font> 03C7
+1D713 <font> 03C8
+1D714 <font> 03C9
+1D715 <font> 2202
+1D716 <font> 03F5
+1D717 <font> 03D1
+1D718 <font> 03F0
+1D719 <font> 03D5
+1D71A <font> 03F1
+1D71B <font> 03D6
+1D71C <font> 0391
+1D71D <font> 0392
+1D71E <font> 0393
+1D71F <font> 0394
+1D720 <font> 0395
+1D721 <font> 0396
+1D722 <font> 0397
+1D723 <font> 0398
+1D724 <font> 0399
+1D725 <font> 039A
+1D726 <font> 039B
+1D727 <font> 039C
+1D728 <font> 039D
+1D729 <font> 039E
+1D72A <font> 039F
+1D72B <font> 03A0
+1D72C <font> 03A1
+1D72D <font> 03F4
+1D72E <font> 03A3
+1D72F <font> 03A4
+1D730 <font> 03A5
+1D731 <font> 03A6
+1D732 <font> 03A7
+1D733 <font> 03A8
+1D734 <font> 03A9
+1D735 <font> 2207
+1D736 <font> 03B1
+1D737 <font> 03B2
+1D738 <font> 03B3
+1D739 <font> 03B4
+1D73A <font> 03B5
+1D73B <font> 03B6
+1D73C <font> 03B7
+1D73D <font> 03B8
+1D73E <font> 03B9
+1D73F <font> 03BA
+1D740 <font> 03BB
+1D741 <font> 03BC
+1D742 <font> 03BD
+1D743 <font> 03BE
+1D744 <font> 03BF
+1D745 <font> 03C0
+1D746 <font> 03C1
+1D747 <font> 03C2
+1D748 <font> 03C3
+1D749 <font> 03C4
+1D74A <font> 03C5
+1D74B <font> 03C6
+1D74C <font> 03C7
+1D74D <font> 03C8
+1D74E <font> 03C9
+1D74F <font> 2202
+1D750 <font> 03F5
+1D751 <font> 03D1
+1D752 <font> 03F0
+1D753 <font> 03D5
+1D754 <font> 03F1
+1D755 <font> 03D6
+1D756 <font> 0391
+1D757 <font> 0392
+1D758 <font> 0393
+1D759 <font> 0394
+1D75A <font> 0395
+1D75B <font> 0396
+1D75C <font> 0397
+1D75D <font> 0398
+1D75E <font> 0399
+1D75F <font> 039A
+1D760 <font> 039B
+1D761 <font> 039C
+1D762 <font> 039D
+1D763 <font> 039E
+1D764 <font> 039F
+1D765 <font> 03A0
+1D766 <font> 03A1
+1D767 <font> 03F4
+1D768 <font> 03A3
+1D769 <font> 03A4
+1D76A <font> 03A5
+1D76B <font> 03A6
+1D76C <font> 03A7
+1D76D <font> 03A8
+1D76E <font> 03A9
+1D76F <font> 2207
+1D770 <font> 03B1
+1D771 <font> 03B2
+1D772 <font> 03B3
+1D773 <font> 03B4
+1D774 <font> 03B5
+1D775 <font> 03B6
+1D776 <font> 03B7
+1D777 <font> 03B8
+1D778 <font> 03B9
+1D779 <font> 03BA
+1D77A <font> 03BB
+1D77B <font> 03BC
+1D77C <font> 03BD
+1D77D <font> 03BE
+1D77E <font> 03BF
+1D77F <font> 03C0
+1D780 <font> 03C1
+1D781 <font> 03C2
+1D782 <font> 03C3
+1D783 <font> 03C4
+1D784 <font> 03C5
+1D785 <font> 03C6
+1D786 <font> 03C7
+1D787 <font> 03C8
+1D788 <font> 03C9
+1D789 <font> 2202
+1D78A <font> 03F5
+1D78B <font> 03D1
+1D78C <font> 03F0
+1D78D <font> 03D5
+1D78E <font> 03F1
+1D78F <font> 03D6
+1D790 <font> 0391
+1D791 <font> 0392
+1D792 <font> 0393
+1D793 <font> 0394
+1D794 <font> 0395
+1D795 <font> 0396
+1D796 <font> 0397
+1D797 <font> 0398
+1D798 <font> 0399
+1D799 <font> 039A
+1D79A <font> 039B
+1D79B <font> 039C
+1D79C <font> 039D
+1D79D <font> 039E
+1D79E <font> 039F
+1D79F <font> 03A0
+1D7A0 <font> 03A1
+1D7A1 <font> 03F4
+1D7A2 <font> 03A3
+1D7A3 <font> 03A4
+1D7A4 <font> 03A5
+1D7A5 <font> 03A6
+1D7A6 <font> 03A7
+1D7A7 <font> 03A8
+1D7A8 <font> 03A9
+1D7A9 <font> 2207
+1D7AA <font> 03B1
+1D7AB <font> 03B2
+1D7AC <font> 03B3
+1D7AD <font> 03B4
+1D7AE <font> 03B5
+1D7AF <font> 03B6
+1D7B0 <font> 03B7
+1D7B1 <font> 03B8
+1D7B2 <font> 03B9
+1D7B3 <font> 03BA
+1D7B4 <font> 03BB
+1D7B5 <font> 03BC
+1D7B6 <font> 03BD
+1D7B7 <font> 03BE
+1D7B8 <font> 03BF
+1D7B9 <font> 03C0
+1D7BA <font> 03C1
+1D7BB <font> 03C2
+1D7BC <font> 03C3
+1D7BD <font> 03C4
+1D7BE <font> 03C5
+1D7BF <font> 03C6
+1D7C0 <font> 03C7
+1D7C1 <font> 03C8
+1D7C2 <font> 03C9
+1D7C3 <font> 2202
+1D7C4 <font> 03F5
+1D7C5 <font> 03D1
+1D7C6 <font> 03F0
+1D7C7 <font> 03D5
+1D7C8 <font> 03F1
+1D7C9 <font> 03D6
+1D7CA <font> 03DC
+1D7CB <font> 03DD
+1D7CE <font> 0030
+1D7CF <font> 0031
+1D7D0 <font> 0032
+1D7D1 <font> 0033
+1D7D2 <font> 0034
+1D7D3 <font> 0035
+1D7D4 <font> 0036
+1D7D5 <font> 0037
+1D7D6 <font> 0038
+1D7D7 <font> 0039
+1D7D8 <font> 0030
+1D7D9 <font> 0031
+1D7DA <font> 0032
+1D7DB <font> 0033
+1D7DC <font> 0034
+1D7DD <font> 0035
+1D7DE <font> 0036
+1D7DF <font> 0037
+1D7E0 <font> 0038
+1D7E1 <font> 0039
+1D7E2 <font> 0030
+1D7E3 <font> 0031
+1D7E4 <font> 0032
+1D7E5 <font> 0033
+1D7E6 <font> 0034
+1D7E7 <font> 0035
+1D7E8 <font> 0036
+1D7E9 <font> 0037
+1D7EA <font> 0038
+1D7EB <font> 0039
+1D7EC <font> 0030
+1D7ED <font> 0031
+1D7EE <font> 0032
+1D7EF <font> 0033
+1D7F0 <font> 0034
+1D7F1 <font> 0035
+1D7F2 <font> 0036
+1D7F3 <font> 0037
+1D7F4 <font> 0038
+1D7F5 <font> 0039
+1D7F6 <font> 0030
+1D7F7 <font> 0031
+1D7F8 <font> 0032
+1D7F9 <font> 0033
+1D7FA <font> 0034
+1D7FB <font> 0035
+1D7FC <font> 0036
+1D7FD <font> 0037
+1D7FE <font> 0038
+1D7FF <font> 0039
+2F800 4E3D
+2F801 4E38
+2F802 4E41
+2F803 20122
+2F804 4F60
+2F805 4FAE
+2F806 4FBB
+2F807 5002
+2F808 507A
+2F809 5099
+2F80A 50E7
+2F80B 50CF
+2F80C 349E
+2F80D 2063A
+2F80E 514D
+2F80F 5154
+2F810 5164
+2F811 5177
+2F812 2051C
+2F813 34B9
+2F814 5167
+2F815 518D
+2F816 2054B
+2F817 5197
+2F818 51A4
+2F819 4ECC
+2F81A 51AC
+2F81B 51B5
+2F81C 291DF
+2F81D 51F5
+2F81E 5203
+2F81F 34DF
+2F820 523B
+2F821 5246
+2F822 5272
+2F823 5277
+2F824 3515
+2F825 52C7
+2F826 52C9
+2F827 52E4
+2F828 52FA
+2F829 5305
+2F82A 5306
+2F82B 5317
+2F82C 5349
+2F82D 5351
+2F82E 535A
+2F82F 5373
+2F830 537D
+2F831 2F833 537F
+2F834 20A2C
+2F835 7070
+2F836 53CA
+2F837 53DF
+2F838 20B63
+2F839 53EB
+2F83A 53F1
+2F83B 5406
+2F83C 549E
+2F83D 5438
+2F83E 5448
+2F83F 5468
+2F840 54A2
+2F841 54F6
+2F842 5510
+2F843 5553
+2F844 5563
+2F845 2F846 5584
+2F847 5599
+2F848 55AB
+2F849 55B3
+2F84A 55C2
+2F84B 5716
+2F84C 5606
+2F84D 5717
+2F84E 5651
+2F84F 5674
+2F850 5207
+2F851 58EE
+2F852 57CE
+2F853 57F4
+2F854 580D
+2F855 578B
+2F856 5832
+2F857 5831
+2F858 58AC
+2F859 214E4
+2F85A 58F2
+2F85B 58F7
+2F85C 5906
+2F85D 591A
+2F85E 5922
+2F85F 5962
+2F860 216A8
+2F861 216EA
+2F862 59EC
+2F863 5A1B
+2F864 5A27
+2F865 59D8
+2F866 5A66
+2F867 36EE
+2F868 36FC
+2F869 5B08
+2F86A 2F86B 5B3E
+2F86C 219C8
+2F86D 5BC3
+2F86E 5BD8
+2F86F 5BE7
+2F870 5BF3
+2F871 21B18
+2F872 5BFF
+2F873 5C06
+2F874 5F53
+2F875 5C22
+2F876 3781
+2F877 5C60
+2F878 5C6E
+2F879 5CC0
+2F87A 5C8D
+2F87B 21DE4
+2F87C 5D43
+2F87D 21DE6
+2F87E 5D6E
+2F87F 5D6B
+2F880 5D7C
+2F881 5DE1
+2F882 5DE2
+2F883 382F
+2F884 5DFD
+2F885 5E28
+2F886 5E3D
+2F887 5E69
+2F888 3862
+2F889 22183
+2F88A 387C
+2F88B 5EB0
+2F88C 5EB3
+2F88D 5EB6
+2F88E 5ECA
+2F88F 2A392
+2F890 5EFE
+2F891 2F892 22331
+2F893 8201
+2F894 2F895 5F22
+2F896 38C7
+2F897 232B8
+2F898 261DA
+2F899 5F62
+2F89A 5F6B
+2F89B 38E3
+2F89C 5F9A
+2F89D 5FCD
+2F89E 5FD7
+2F89F 5FF9
+2F8A0 6081
+2F8A1 393A
+2F8A2 391C
+2F8A3 6094
+2F8A4 226D4
+2F8A5 60C7
+2F8A6 6148
+2F8A7 614C
+2F8A8 614E
+2F8A9 614C
+2F8AA 617A
+2F8AB 618E
+2F8AC 61B2
+2F8AD 61A4
+2F8AE 61AF
+2F8AF 61DE
+2F8B0 61F2
+2F8B1 61F6
+2F8B2 6210
+2F8B3 621B
+2F8B4 625D
+2F8B5 62B1
+2F8B6 62D4
+2F8B7 6350
+2F8B8 22B0C
+2F8B9 633D
+2F8BA 62FC
+2F8BB 6368
+2F8BC 6383
+2F8BD 63E4
+2F8BE 22BF1
+2F8BF 6422
+2F8C0 63C5
+2F8C1 63A9
+2F8C2 3A2E
+2F8C3 6469
+2F8C4 647E
+2F8C5 649D
+2F8C6 6477
+2F8C7 3A6C
+2F8C8 654F
+2F8C9 656C
+2F8CA 2300A
+2F8CB 65E3
+2F8CC 66F8
+2F8CD 6649
+2F8CE 3B19
+2F8CF 6691
+2F8D0 3B08
+2F8D1 3AE4
+2F8D2 5192
+2F8D3 5195
+2F8D4 6700
+2F8D5 669C
+2F8D6 80AD
+2F8D7 43D9
+2F8D8 6717
+2F8D9 671B
+2F8DA 6721
+2F8DB 675E
+2F8DC 6753
+2F8DD 233C3
+2F8DE 3B49
+2F8DF 67FA
+2F8E0 6785
+2F8E1 6852
+2F8E2 6885
+2F8E3 2346D
+2F8E4 688E
+2F8E5 681F
+2F8E6 6914
+2F8E7 3B9D
+2F8E8 6942
+2F8E9 69A3
+2F8EA 69EA
+2F8EB 6AA8
+2F8EC 236A3
+2F8ED 6ADB
+2F8EE 3C18
+2F8EF 6B21
+2F8F0 238A7
+2F8F1 6B54
+2F8F2 3C4E
+2F8F3 6B72
+2F8F4 6B9F
+2F8F5 6BBA
+2F8F6 6BBB
+2F8F7 23A8D
+2F8F8 21D0B
+2F8F9 23AFA
+2F8FA 6C4E
+2F8FB 23CBC
+2F8FC 6CBF
+2F8FD 6CCD
+2F8FE 6C67
+2F8FF 6D16
+2F900 6D3E
+2F901 6D77
+2F902 6D41
+2F903 6D69
+2F904 6D78
+2F905 6D85
+2F906 23D1E
+2F907 6D34
+2F908 6E2F
+2F909 6E6E
+2F90A 3D33
+2F90B 6ECB
+2F90C 6EC7
+2F90D 23ED1
+2F90E 6DF9
+2F90F 6F6E
+2F910 23F5E
+2F911 23F8E
+2F912 6FC6
+2F913 7039
+2F914 701E
+2F915 701B
+2F916 3D96
+2F917 704A
+2F918 707D
+2F919 7077
+2F91A 70AD
+2F91B 20525
+2F91C 7145
+2F91D 24263
+2F91E 719C
+2F91F 243AB
+2F920 7228
+2F921 7235
+2F922 7250
+2F923 24608
+2F924 7280
+2F925 7295
+2F926 24735
+2F927 24814
+2F928 737A
+2F929 738B
+2F92A 3EAC
+2F92B 73A5
+2F92C 2F92D 3EB8
+2F92E 7447
+2F92F 745C
+2F930 7471
+2F931 7485
+2F932 74CA
+2F933 3F1B
+2F934 7524
+2F935 24C36
+2F936 753E
+2F937 24C92
+2F938 7570
+2F939 2219F
+2F93A 7610
+2F93B 24FA1
+2F93C 24FB8
+2F93D 25044
+2F93E 3FFC
+2F93F 4008
+2F940 76F4
+2F941 250F3
+2F942 250F2
+2F943 25119
+2F944 25133
+2F945 771E
+2F946 2F947 771F
+2F948 774A
+2F949 4039
+2F94A 778B
+2F94B 4046
+2F94C 4096
+2F94D 2541D
+2F94E 784E
+2F94F 788C
+2F950 78CC
+2F951 40E3
+2F952 25626
+2F953 7956
+2F954 2569A
+2F955 256C5
+2F956 798F
+2F957 79EB
+2F958 412F
+2F959 7A40
+2F95A 7A4A
+2F95B 7A4F
+2F95C 2597C
+2F95D 2F95E 25AA7
+2F95F 7AEE
+2F960 4202
+2F961 25BAB
+2F962 7BC6
+2F963 7BC9
+2F964 4227
+2F965 25C80
+2F966 7CD2
+2F967 42A0
+2F968 7CE8
+2F969 7CE3
+2F96A 7D00
+2F96B 25F86
+2F96C 7D63
+2F96D 4301
+2F96E 7DC7
+2F96F 7E02
+2F970 7E45
+2F971 4334
+2F972 26228
+2F973 26247
+2F974 4359
+2F975 262D9
+2F976 7F7A
+2F977 2633E
+2F978 7F95
+2F979 7FFA
+2F97A 8005
+2F97B 264DA
+2F97C 26523
+2F97D 8060
+2F97E 265A8
+2F97F 8070
+2F980 2335F
+2F981 43D5
+2F982 80B2
+2F983 8103
+2F984 440B
+2F985 813E
+2F986 5AB5
+2F987 267A7
+2F988 267B5
+2F989 23393
+2F98A 2339C
+2F98B 8201
+2F98C 8204
+2F98D 8F9E
+2F98E 446B
+2F98F 8291
+2F990 828B
+2F991 829D
+2F992 52B3
+2F993 82B1
+2F994 82B3
+2F995 82BD
+2F996 82E6
+2F997 26B3C
+2F998 82E5
+2F999 831D
+2F99A 8363
+2F99B 83AD
+2F99C 8323
+2F99D 83BD
+2F99E 83E7
+2F99F 8457
+2F9A0 8353
+2F9A1 83CA
+2F9A2 83CC
+2F9A3 83DC
+2F9A4 26C36
+2F9A5 26D6B
+2F9A6 26CD5
+2F9A7 452B
+2F9A8 84F1
+2F9A9 84F3
+2F9AA 8516
+2F9AB 273CA
+2F9AC 8564
+2F9AD 26F2C
+2F9AE 455D
+2F9AF 4561
+2F9B0 26FB1
+2F9B1 270D2
+2F9B2 456B
+2F9B3 8650
+2F9B4 865C
+2F9B5 8667
+2F9B6 8669
+2F9B7 86A9
+2F9B8 8688
+2F9B9 870E
+2F9BA 86E2
+2F9BB 8779
+2F9BC 8728
+2F9BD 876B
+2F9BE 8786
+2F9BF 45D7
+2F9C0 87E1
+2F9C1 8801
+2F9C2 45F9
+2F9C3 8860
+2F9C4 8863
+2F9C5 27667
+2F9C6 88D7
+2F9C7 88DE
+2F9C8 4635
+2F9C9 88FA
+2F9CA 34BB
+2F9CB 278AE
+2F9CC 27966
+2F9CD 46BE
+2F9CE 46C7
+2F9CF 8AA0
+2F9D0 8AED
+2F9D1 8B8A
+2F9D2 8C55
+2F9D3 27CA8
+2F9D4 8CAB
+2F9D5 8CC1
+2F9D6 8D1B
+2F9D7 8D77
+2F9D8 27F2F
+2F9D9 20804
+2F9DA 8DCB
+2F9DB 8DBC
+2F9DC 8DF0
+2F9DD 208DE
+2F9DE 8ED4
+2F9DF 8F38
+2F9E0 285D2
+2F9E1 285ED
+2F9E2 9094
+2F9E3 90F1
+2F9E4 9111
+2F9E5 2872E
+2F9E6 911B
+2F9E7 9238
+2F9E8 92D7
+2F9E9 92D8
+2F9EA 927C
+2F9EB 93F9
+2F9EC 9415
+2F9ED 28BFA
+2F9EE 958B
+2F9EF 4995
+2F9F0 95B7
+2F9F1 28D77
+2F9F2 49E6
+2F9F3 96C3
+2F9F4 5DB2
+2F9F5 9723
+2F9F6 29145
+2F9F7 2921A
+2F9F8 4A6E
+2F9F9 4A76
+2F9FA 97E0
+2F9FB 2940A
+2F9FC 4AB2
+2F9FD 29496
+2F9FE 2F9FF 980B
+2FA00 9829
+2FA01 295B6
+2FA02 98E2
+2FA03 4B33
+2FA04 9929
+2FA05 99A7
+2FA06 99C2
+2FA07 99FE
+2FA08 4BCE
+2FA09 29B30
+2FA0A 9B12
+2FA0B 9C40
+2FA0C 9CFD
+2FA0D 4CCE
+2FA0E 4CED
+2FA0F 9D67
+2FA10 2A0CE
+2FA11 4CF8
+2FA12 2A105
+2FA13 2A20E
+2FA14 2A291
+2FA15 9EBB
+2FA16 4D56
+2FA17 9EF9
+2FA18 9EFE
+2FA19 9F05
+2FA1A 9F0F
+2FA1B 9F16
+2FA1C 9F3B
+2FA1D 2A600
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/EastAsianWidth.txt b/Master/tlpkg/tlperl.straw/lib/unicore/EastAsianWidth.txt
new file mode 100755
index 00000000000..07150fe32da
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/EastAsianWidth.txt
@@ -0,0 +1,19357 @@
+# EastAsianWidth-5.1.0.txt
+# Date: 2008-03-20, 17:42:00 PDT [KW]
+#
+# East Asian Width Properties
+#
+# This file is an informative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# The format is two fields separated by a semicolon.
+# Field 0: Unicode value
+# Field 1: East Asian Width property, consisting of one of the following values:
+# "N", "A", "H", "W", "F", "Na"
+# - All code points, assigned or unassigned, that are not listed
+# explicitly are given the value "N".
+# - Characters ranges are specified as for other property files in
+# the Unicode Character Database.
+#
+# The Unicode name of each character is provided in a comment for help
+# in identifying the characters.
+#
+# See UAX #11: East Asian Character Width, for more information.
+#
+# @missing: 0000..10FFFF; N
+0000;N # <control>
+0001;N # <control>
+0002;N # <control>
+0003;N # <control>
+0004;N # <control>
+0005;N # <control>
+0006;N # <control>
+0007;N # <control>
+0008;N # <control>
+0009;N # <control>
+000A;N # <control>
+000B;N # <control>
+000C;N # <control>
+000D;N # <control>
+000E;N # <control>
+000F;N # <control>
+0010;N # <control>
+0011;N # <control>
+0012;N # <control>
+0013;N # <control>
+0014;N # <control>
+0015;N # <control>
+0016;N # <control>
+0017;N # <control>
+0018;N # <control>
+0019;N # <control>
+001A;N # <control>
+001B;N # <control>
+001C;N # <control>
+001D;N # <control>
+001E;N # <control>
+001F;N # <control>
+0020;Na # SPACE
+0021;Na # EXCLAMATION MARK
+0022;Na # QUOTATION MARK
+0023;Na # NUMBER SIGN
+0024;Na # DOLLAR SIGN
+0025;Na # PERCENT SIGN
+0026;Na # AMPERSAND
+0027;Na # APOSTROPHE
+0028;Na # LEFT PARENTHESIS
+0029;Na # RIGHT PARENTHESIS
+002A;Na # ASTERISK
+002B;Na # PLUS SIGN
+002C;Na # COMMA
+002D;Na # HYPHEN-MINUS
+002E;Na # FULL STOP
+002F;Na # SOLIDUS
+0030;Na # DIGIT ZERO
+0031;Na # DIGIT ONE
+0032;Na # DIGIT TWO
+0033;Na # DIGIT THREE
+0034;Na # DIGIT FOUR
+0035;Na # DIGIT FIVE
+0036;Na # DIGIT SIX
+0037;Na # DIGIT SEVEN
+0038;Na # DIGIT EIGHT
+0039;Na # DIGIT NINE
+003A;Na # COLON
+003B;Na # SEMICOLON
+003C;Na # LESS-THAN SIGN
+003D;Na # EQUALS SIGN
+003E;Na # GREATER-THAN SIGN
+003F;Na # QUESTION MARK
+0040;Na # COMMERCIAL AT
+0041;Na # LATIN CAPITAL LETTER A
+0042;Na # LATIN CAPITAL LETTER B
+0043;Na # LATIN CAPITAL LETTER C
+0044;Na # LATIN CAPITAL LETTER D
+0045;Na # LATIN CAPITAL LETTER E
+0046;Na # LATIN CAPITAL LETTER F
+0047;Na # LATIN CAPITAL LETTER G
+0048;Na # LATIN CAPITAL LETTER H
+0049;Na # LATIN CAPITAL LETTER I
+004A;Na # LATIN CAPITAL LETTER J
+004B;Na # LATIN CAPITAL LETTER K
+004C;Na # LATIN CAPITAL LETTER L
+004D;Na # LATIN CAPITAL LETTER M
+004E;Na # LATIN CAPITAL LETTER N
+004F;Na # LATIN CAPITAL LETTER O
+0050;Na # LATIN CAPITAL LETTER P
+0051;Na # LATIN CAPITAL LETTER Q
+0052;Na # LATIN CAPITAL LETTER R
+0053;Na # LATIN CAPITAL LETTER S
+0054;Na # LATIN CAPITAL LETTER T
+0055;Na # LATIN CAPITAL LETTER U
+0056;Na # LATIN CAPITAL LETTER V
+0057;Na # LATIN CAPITAL LETTER W
+0058;Na # LATIN CAPITAL LETTER X
+0059;Na # LATIN CAPITAL LETTER Y
+005A;Na # LATIN CAPITAL LETTER Z
+005B;Na # LEFT SQUARE BRACKET
+005C;Na # REVERSE SOLIDUS
+005D;Na # RIGHT SQUARE BRACKET
+005E;Na # CIRCUMFLEX ACCENT
+005F;Na # LOW LINE
+0060;Na # GRAVE ACCENT
+0061;Na # LATIN SMALL LETTER A
+0062;Na # LATIN SMALL LETTER B
+0063;Na # LATIN SMALL LETTER C
+0064;Na # LATIN SMALL LETTER D
+0065;Na # LATIN SMALL LETTER E
+0066;Na # LATIN SMALL LETTER F
+0067;Na # LATIN SMALL LETTER G
+0068;Na # LATIN SMALL LETTER H
+0069;Na # LATIN SMALL LETTER I
+006A;Na # LATIN SMALL LETTER J
+006B;Na # LATIN SMALL LETTER K
+006C;Na # LATIN SMALL LETTER L
+006D;Na # LATIN SMALL LETTER M
+006E;Na # LATIN SMALL LETTER N
+006F;Na # LATIN SMALL LETTER O
+0070;Na # LATIN SMALL LETTER P
+0071;Na # LATIN SMALL LETTER Q
+0072;Na # LATIN SMALL LETTER R
+0073;Na # LATIN SMALL LETTER S
+0074;Na # LATIN SMALL LETTER T
+0075;Na # LATIN SMALL LETTER U
+0076;Na # LATIN SMALL LETTER V
+0077;Na # LATIN SMALL LETTER W
+0078;Na # LATIN SMALL LETTER X
+0079;Na # LATIN SMALL LETTER Y
+007A;Na # LATIN SMALL LETTER Z
+007B;Na # LEFT CURLY BRACKET
+007C;Na # VERTICAL LINE
+007D;Na # RIGHT CURLY BRACKET
+007E;Na # TILDE
+007F;N # <control>
+0080;N # <control>
+0081;N # <control>
+0082;N # <control>
+0083;N # <control>
+0084;N # <control>
+0085;N # <control>
+0086;N # <control>
+0087;N # <control>
+0088;N # <control>
+0089;N # <control>
+008A;N # <control>
+008B;N # <control>
+008C;N # <control>
+008D;N # <control>
+008E;N # <control>
+008F;N # <control>
+0090;N # <control>
+0091;N # <control>
+0092;N # <control>
+0093;N # <control>
+0094;N # <control>
+0095;N # <control>
+0096;N # <control>
+0097;N # <control>
+0098;N # <control>
+0099;N # <control>
+009A;N # <control>
+009B;N # <control>
+009C;N # <control>
+009D;N # <control>
+009E;N # <control>
+009F;N # <control>
+00A0;N # NO-BREAK SPACE
+00A1;A # INVERTED EXCLAMATION MARK
+00A2;Na # CENT SIGN
+00A3;Na # POUND SIGN
+00A4;A # CURRENCY SIGN
+00A5;Na # YEN SIGN
+00A6;Na # BROKEN BAR
+00A7;A # SECTION SIGN
+00A8;A # DIAERESIS
+00A9;N # COPYRIGHT SIGN
+00AA;A # FEMININE ORDINAL INDICATOR
+00AB;N # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC;Na # NOT SIGN
+00AD;A # SOFT HYPHEN
+00AE;A # REGISTERED SIGN
+00AF;Na # MACRON
+00B0;A # DEGREE SIGN
+00B1;A # PLUS-MINUS SIGN
+00B2;A # SUPERSCRIPT TWO
+00B3;A # SUPERSCRIPT THREE
+00B4;A # ACUTE ACCENT
+00B5;N # MICRO SIGN
+00B6;A # PILCROW SIGN
+00B7;A # MIDDLE DOT
+00B8;A # CEDILLA
+00B9;A # SUPERSCRIPT ONE
+00BA;A # MASCULINE ORDINAL INDICATOR
+00BB;N # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC;A # VULGAR FRACTION ONE QUARTER
+00BD;A # VULGAR FRACTION ONE HALF
+00BE;A # VULGAR FRACTION THREE QUARTERS
+00BF;A # INVERTED QUESTION MARK
+00C0;N # LATIN CAPITAL LETTER A WITH GRAVE
+00C1;N # LATIN CAPITAL LETTER A WITH ACUTE
+00C2;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00C3;N # LATIN CAPITAL LETTER A WITH TILDE
+00C4;N # LATIN CAPITAL LETTER A WITH DIAERESIS
+00C5;N # LATIN CAPITAL LETTER A WITH RING ABOVE
+00C6;A # LATIN CAPITAL LETTER AE
+00C7;N # LATIN CAPITAL LETTER C WITH CEDILLA
+00C8;N # LATIN CAPITAL LETTER E WITH GRAVE
+00C9;N # LATIN CAPITAL LETTER E WITH ACUTE
+00CA;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00CB;N # LATIN CAPITAL LETTER E WITH DIAERESIS
+00CC;N # LATIN CAPITAL LETTER I WITH GRAVE
+00CD;N # LATIN CAPITAL LETTER I WITH ACUTE
+00CE;N # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00CF;N # LATIN CAPITAL LETTER I WITH DIAERESIS
+00D0;A # LATIN CAPITAL LETTER ETH
+00D1;N # LATIN CAPITAL LETTER N WITH TILDE
+00D2;N # LATIN CAPITAL LETTER O WITH GRAVE
+00D3;N # LATIN CAPITAL LETTER O WITH ACUTE
+00D4;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00D5;N # LATIN CAPITAL LETTER O WITH TILDE
+00D6;N # LATIN CAPITAL LETTER O WITH DIAERESIS
+00D7;A # MULTIPLICATION SIGN
+00D8;A # LATIN CAPITAL LETTER O WITH STROKE
+00D9;N # LATIN CAPITAL LETTER U WITH GRAVE
+00DA;N # LATIN CAPITAL LETTER U WITH ACUTE
+00DB;N # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00DC;N # LATIN CAPITAL LETTER U WITH DIAERESIS
+00DD;N # LATIN CAPITAL LETTER Y WITH ACUTE
+00DE;A # LATIN CAPITAL LETTER THORN
+00DF;A # LATIN SMALL LETTER SHARP S
+00E0;A # LATIN SMALL LETTER A WITH GRAVE
+00E1;A # LATIN SMALL LETTER A WITH ACUTE
+00E2;N # LATIN SMALL LETTER A WITH CIRCUMFLEX
+00E3;N # LATIN SMALL LETTER A WITH TILDE
+00E4;N # LATIN SMALL LETTER A WITH DIAERESIS
+00E5;N # LATIN SMALL LETTER A WITH RING ABOVE
+00E6;A # LATIN SMALL LETTER AE
+00E7;N # LATIN SMALL LETTER C WITH CEDILLA
+00E8;A # LATIN SMALL LETTER E WITH GRAVE
+00E9;A # LATIN SMALL LETTER E WITH ACUTE
+00EA;A # LATIN SMALL LETTER E WITH CIRCUMFLEX
+00EB;N # LATIN SMALL LETTER E WITH DIAERESIS
+00EC;A # LATIN SMALL LETTER I WITH GRAVE
+00ED;A # LATIN SMALL LETTER I WITH ACUTE
+00EE;N # LATIN SMALL LETTER I WITH CIRCUMFLEX
+00EF;N # LATIN SMALL LETTER I WITH DIAERESIS
+00F0;A # LATIN SMALL LETTER ETH
+00F1;N # LATIN SMALL LETTER N WITH TILDE
+00F2;A # LATIN SMALL LETTER O WITH GRAVE
+00F3;A # LATIN SMALL LETTER O WITH ACUTE
+00F4;N # LATIN SMALL LETTER O WITH CIRCUMFLEX
+00F5;N # LATIN SMALL LETTER O WITH TILDE
+00F6;N # LATIN SMALL LETTER O WITH DIAERESIS
+00F7;A # DIVISION SIGN
+00F8;A # LATIN SMALL LETTER O WITH STROKE
+00F9;A # LATIN SMALL LETTER U WITH GRAVE
+00FA;A # LATIN SMALL LETTER U WITH ACUTE
+00FB;N # LATIN SMALL LETTER U WITH CIRCUMFLEX
+00FC;A # LATIN SMALL LETTER U WITH DIAERESIS
+00FD;N # LATIN SMALL LETTER Y WITH ACUTE
+00FE;A # LATIN SMALL LETTER THORN
+00FF;N # LATIN SMALL LETTER Y WITH DIAERESIS
+0100;N # LATIN CAPITAL LETTER A WITH MACRON
+0101;A # LATIN SMALL LETTER A WITH MACRON
+0102;N # LATIN CAPITAL LETTER A WITH BREVE
+0103;N # LATIN SMALL LETTER A WITH BREVE
+0104;N # LATIN CAPITAL LETTER A WITH OGONEK
+0105;N # LATIN SMALL LETTER A WITH OGONEK
+0106;N # LATIN CAPITAL LETTER C WITH ACUTE
+0107;N # LATIN SMALL LETTER C WITH ACUTE
+0108;N # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0109;N # LATIN SMALL LETTER C WITH CIRCUMFLEX
+010A;N # LATIN CAPITAL LETTER C WITH DOT ABOVE
+010B;N # LATIN SMALL LETTER C WITH DOT ABOVE
+010C;N # LATIN CAPITAL LETTER C WITH CARON
+010D;N # LATIN SMALL LETTER C WITH CARON
+010E;N # LATIN CAPITAL LETTER D WITH CARON
+010F;N # LATIN SMALL LETTER D WITH CARON
+0110;N # LATIN CAPITAL LETTER D WITH STROKE
+0111;A # LATIN SMALL LETTER D WITH STROKE
+0112;N # LATIN CAPITAL LETTER E WITH MACRON
+0113;A # LATIN SMALL LETTER E WITH MACRON
+0114;N # LATIN CAPITAL LETTER E WITH BREVE
+0115;N # LATIN SMALL LETTER E WITH BREVE
+0116;N # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0117;N # LATIN SMALL LETTER E WITH DOT ABOVE
+0118;N # LATIN CAPITAL LETTER E WITH OGONEK
+0119;N # LATIN SMALL LETTER E WITH OGONEK
+011A;N # LATIN CAPITAL LETTER E WITH CARON
+011B;A # LATIN SMALL LETTER E WITH CARON
+011C;N # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011D;N # LATIN SMALL LETTER G WITH CIRCUMFLEX
+011E;N # LATIN CAPITAL LETTER G WITH BREVE
+011F;N # LATIN SMALL LETTER G WITH BREVE
+0120;N # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0121;N # LATIN SMALL LETTER G WITH DOT ABOVE
+0122;N # LATIN CAPITAL LETTER G WITH CEDILLA
+0123;N # LATIN SMALL LETTER G WITH CEDILLA
+0124;N # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0125;N # LATIN SMALL LETTER H WITH CIRCUMFLEX
+0126;A # LATIN CAPITAL LETTER H WITH STROKE
+0127;A # LATIN SMALL LETTER H WITH STROKE
+0128;N # LATIN CAPITAL LETTER I WITH TILDE
+0129;N # LATIN SMALL LETTER I WITH TILDE
+012A;N # LATIN CAPITAL LETTER I WITH MACRON
+012B;A # LATIN SMALL LETTER I WITH MACRON
+012C;N # LATIN CAPITAL LETTER I WITH BREVE
+012D;N # LATIN SMALL LETTER I WITH BREVE
+012E;N # LATIN CAPITAL LETTER I WITH OGONEK
+012F;N # LATIN SMALL LETTER I WITH OGONEK
+0130;N # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0131;A # LATIN SMALL LETTER DOTLESS I
+0132;A # LATIN CAPITAL LIGATURE IJ
+0133;A # LATIN SMALL LIGATURE IJ
+0134;N # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0135;N # LATIN SMALL LETTER J WITH CIRCUMFLEX
+0136;N # LATIN CAPITAL LETTER K WITH CEDILLA
+0137;N # LATIN SMALL LETTER K WITH CEDILLA
+0138;A # LATIN SMALL LETTER KRA
+0139;N # LATIN CAPITAL LETTER L WITH ACUTE
+013A;N # LATIN SMALL LETTER L WITH ACUTE
+013B;N # LATIN CAPITAL LETTER L WITH CEDILLA
+013C;N # LATIN SMALL LETTER L WITH CEDILLA
+013D;N # LATIN CAPITAL LETTER L WITH CARON
+013E;N # LATIN SMALL LETTER L WITH CARON
+013F;A # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0140;A # LATIN SMALL LETTER L WITH MIDDLE DOT
+0141;A # LATIN CAPITAL LETTER L WITH STROKE
+0142;A # LATIN SMALL LETTER L WITH STROKE
+0143;N # LATIN CAPITAL LETTER N WITH ACUTE
+0144;A # LATIN SMALL LETTER N WITH ACUTE
+0145;N # LATIN CAPITAL LETTER N WITH CEDILLA
+0146;N # LATIN SMALL LETTER N WITH CEDILLA
+0147;N # LATIN CAPITAL LETTER N WITH CARON
+0148;A # LATIN SMALL LETTER N WITH CARON
+0149;A # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014A;A # LATIN CAPITAL LETTER ENG
+014B;A # LATIN SMALL LETTER ENG
+014C;N # LATIN CAPITAL LETTER O WITH MACRON
+014D;A # LATIN SMALL LETTER O WITH MACRON
+014E;N # LATIN CAPITAL LETTER O WITH BREVE
+014F;N # LATIN SMALL LETTER O WITH BREVE
+0150;N # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0151;N # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0152;A # LATIN CAPITAL LIGATURE OE
+0153;A # LATIN SMALL LIGATURE OE
+0154;N # LATIN CAPITAL LETTER R WITH ACUTE
+0155;N # LATIN SMALL LETTER R WITH ACUTE
+0156;N # LATIN CAPITAL LETTER R WITH CEDILLA
+0157;N # LATIN SMALL LETTER R WITH CEDILLA
+0158;N # LATIN CAPITAL LETTER R WITH CARON
+0159;N # LATIN SMALL LETTER R WITH CARON
+015A;N # LATIN CAPITAL LETTER S WITH ACUTE
+015B;N # LATIN SMALL LETTER S WITH ACUTE
+015C;N # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015D;N # LATIN SMALL LETTER S WITH CIRCUMFLEX
+015E;N # LATIN CAPITAL LETTER S WITH CEDILLA
+015F;N # LATIN SMALL LETTER S WITH CEDILLA
+0160;N # LATIN CAPITAL LETTER S WITH CARON
+0161;N # LATIN SMALL LETTER S WITH CARON
+0162;N # LATIN CAPITAL LETTER T WITH CEDILLA
+0163;N # LATIN SMALL LETTER T WITH CEDILLA
+0164;N # LATIN CAPITAL LETTER T WITH CARON
+0165;N # LATIN SMALL LETTER T WITH CARON
+0166;A # LATIN CAPITAL LETTER T WITH STROKE
+0167;A # LATIN SMALL LETTER T WITH STROKE
+0168;N # LATIN CAPITAL LETTER U WITH TILDE
+0169;N # LATIN SMALL LETTER U WITH TILDE
+016A;N # LATIN CAPITAL LETTER U WITH MACRON
+016B;A # LATIN SMALL LETTER U WITH MACRON
+016C;N # LATIN CAPITAL LETTER U WITH BREVE
+016D;N # LATIN SMALL LETTER U WITH BREVE
+016E;N # LATIN CAPITAL LETTER U WITH RING ABOVE
+016F;N # LATIN SMALL LETTER U WITH RING ABOVE
+0170;N # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0171;N # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0172;N # LATIN CAPITAL LETTER U WITH OGONEK
+0173;N # LATIN SMALL LETTER U WITH OGONEK
+0174;N # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0175;N # LATIN SMALL LETTER W WITH CIRCUMFLEX
+0176;N # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0177;N # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0178;N # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179;N # LATIN CAPITAL LETTER Z WITH ACUTE
+017A;N # LATIN SMALL LETTER Z WITH ACUTE
+017B;N # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017C;N # LATIN SMALL LETTER Z WITH DOT ABOVE
+017D;N # LATIN CAPITAL LETTER Z WITH CARON
+017E;N # LATIN SMALL LETTER Z WITH CARON
+017F;N # LATIN SMALL LETTER LONG S
+0180;N # LATIN SMALL LETTER B WITH STROKE
+0181;N # LATIN CAPITAL LETTER B WITH HOOK
+0182;N # LATIN CAPITAL LETTER B WITH TOPBAR
+0183;N # LATIN SMALL LETTER B WITH TOPBAR
+0184;N # LATIN CAPITAL LETTER TONE SIX
+0185;N # LATIN SMALL LETTER TONE SIX
+0186;N # LATIN CAPITAL LETTER OPEN O
+0187;N # LATIN CAPITAL LETTER C WITH HOOK
+0188;N # LATIN SMALL LETTER C WITH HOOK
+0189;N # LATIN CAPITAL LETTER AFRICAN D
+018A;N # LATIN CAPITAL LETTER D WITH HOOK
+018B;N # LATIN CAPITAL LETTER D WITH TOPBAR
+018C;N # LATIN SMALL LETTER D WITH TOPBAR
+018D;N # LATIN SMALL LETTER TURNED DELTA
+018E;N # LATIN CAPITAL LETTER REVERSED E
+018F;N # LATIN CAPITAL LETTER SCHWA
+0190;N # LATIN CAPITAL LETTER OPEN E
+0191;N # LATIN CAPITAL LETTER F WITH HOOK
+0192;N # LATIN SMALL LETTER F WITH HOOK
+0193;N # LATIN CAPITAL LETTER G WITH HOOK
+0194;N # LATIN CAPITAL LETTER GAMMA
+0195;N # LATIN SMALL LETTER HV
+0196;N # LATIN CAPITAL LETTER IOTA
+0197;N # LATIN CAPITAL LETTER I WITH STROKE
+0198;N # LATIN CAPITAL LETTER K WITH HOOK
+0199;N # LATIN SMALL LETTER K WITH HOOK
+019A;N # LATIN SMALL LETTER L WITH BAR
+019B;N # LATIN SMALL LETTER LAMBDA WITH STROKE
+019C;N # LATIN CAPITAL LETTER TURNED M
+019D;N # LATIN CAPITAL LETTER N WITH LEFT HOOK
+019E;N # LATIN SMALL LETTER N WITH LONG RIGHT LEG
+019F;N # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01A0;N # LATIN CAPITAL LETTER O WITH HORN
+01A1;N # LATIN SMALL LETTER O WITH HORN
+01A2;N # LATIN CAPITAL LETTER OI
+01A3;N # LATIN SMALL LETTER OI
+01A4;N # LATIN CAPITAL LETTER P WITH HOOK
+01A5;N # LATIN SMALL LETTER P WITH HOOK
+01A6;N # LATIN LETTER YR
+01A7;N # LATIN CAPITAL LETTER TONE TWO
+01A8;N # LATIN SMALL LETTER TONE TWO
+01A9;N # LATIN CAPITAL LETTER ESH
+01AA;N # LATIN LETTER REVERSED ESH LOOP
+01AB;N # LATIN SMALL LETTER T WITH PALATAL HOOK
+01AC;N # LATIN CAPITAL LETTER T WITH HOOK
+01AD;N # LATIN SMALL LETTER T WITH HOOK
+01AE;N # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01AF;N # LATIN CAPITAL LETTER U WITH HORN
+01B0;N # LATIN SMALL LETTER U WITH HORN
+01B1;N # LATIN CAPITAL LETTER UPSILON
+01B2;N # LATIN CAPITAL LETTER V WITH HOOK
+01B3;N # LATIN CAPITAL LETTER Y WITH HOOK
+01B4;N # LATIN SMALL LETTER Y WITH HOOK
+01B5;N # LATIN CAPITAL LETTER Z WITH STROKE
+01B6;N # LATIN SMALL LETTER Z WITH STROKE
+01B7;N # LATIN CAPITAL LETTER EZH
+01B8;N # LATIN CAPITAL LETTER EZH REVERSED
+01B9;N # LATIN SMALL LETTER EZH REVERSED
+01BA;N # LATIN SMALL LETTER EZH WITH TAIL
+01BB;N # LATIN LETTER TWO WITH STROKE
+01BC;N # LATIN CAPITAL LETTER TONE FIVE
+01BD;N # LATIN SMALL LETTER TONE FIVE
+01BE;N # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+01BF;N # LATIN LETTER WYNN
+01C0;N # LATIN LETTER DENTAL CLICK
+01C1;N # LATIN LETTER LATERAL CLICK
+01C2;N # LATIN LETTER ALVEOLAR CLICK
+01C3;N # LATIN LETTER RETROFLEX CLICK
+01C4;N # LATIN CAPITAL LETTER DZ WITH CARON
+01C5;N # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C6;N # LATIN SMALL LETTER DZ WITH CARON
+01C7;N # LATIN CAPITAL LETTER LJ
+01C8;N # LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01C9;N # LATIN SMALL LETTER LJ
+01CA;N # LATIN CAPITAL LETTER NJ
+01CB;N # LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CC;N # LATIN SMALL LETTER NJ
+01CD;N # LATIN CAPITAL LETTER A WITH CARON
+01CE;A # LATIN SMALL LETTER A WITH CARON
+01CF;N # LATIN CAPITAL LETTER I WITH CARON
+01D0;A # LATIN SMALL LETTER I WITH CARON
+01D1;N # LATIN CAPITAL LETTER O WITH CARON
+01D2;A # LATIN SMALL LETTER O WITH CARON
+01D3;N # LATIN CAPITAL LETTER U WITH CARON
+01D4;A # LATIN SMALL LETTER U WITH CARON
+01D5;N # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D6;A # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D7;N # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D8;A # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01D9;N # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DA;A # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01DB;N # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DC;A # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+01DD;N # LATIN SMALL LETTER TURNED E
+01DE;N # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01DF;N # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01E0;N # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E1;N # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01E2;N # LATIN CAPITAL LETTER AE WITH MACRON
+01E3;N # LATIN SMALL LETTER AE WITH MACRON
+01E4;N # LATIN CAPITAL LETTER G WITH STROKE
+01E5;N # LATIN SMALL LETTER G WITH STROKE
+01E6;N # LATIN CAPITAL LETTER G WITH CARON
+01E7;N # LATIN SMALL LETTER G WITH CARON
+01E8;N # LATIN CAPITAL LETTER K WITH CARON
+01E9;N # LATIN SMALL LETTER K WITH CARON
+01EA;N # LATIN CAPITAL LETTER O WITH OGONEK
+01EB;N # LATIN SMALL LETTER O WITH OGONEK
+01EC;N # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01ED;N # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01EE;N # LATIN CAPITAL LETTER EZH WITH CARON
+01EF;N # LATIN SMALL LETTER EZH WITH CARON
+01F0;N # LATIN SMALL LETTER J WITH CARON
+01F1;N # LATIN CAPITAL LETTER DZ
+01F2;N # LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F3;N # LATIN SMALL LETTER DZ
+01F4;N # LATIN CAPITAL LETTER G WITH ACUTE
+01F5;N # LATIN SMALL LETTER G WITH ACUTE
+01F6;N # LATIN CAPITAL LETTER HWAIR
+01F7;N # LATIN CAPITAL LETTER WYNN
+01F8;N # LATIN CAPITAL LETTER N WITH GRAVE
+01F9;N # LATIN SMALL LETTER N WITH GRAVE
+01FA;N # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FB;N # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01FC;N # LATIN CAPITAL LETTER AE WITH ACUTE
+01FD;N # LATIN SMALL LETTER AE WITH ACUTE
+01FE;N # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+01FF;N # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0200;N # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0201;N # LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0202;N # LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0203;N # LATIN SMALL LETTER A WITH INVERTED BREVE
+0204;N # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0205;N # LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0206;N # LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0207;N # LATIN SMALL LETTER E WITH INVERTED BREVE
+0208;N # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+0209;N # LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020A;N # LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020B;N # LATIN SMALL LETTER I WITH INVERTED BREVE
+020C;N # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020D;N # LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020E;N # LATIN CAPITAL LETTER O WITH INVERTED BREVE
+020F;N # LATIN SMALL LETTER O WITH INVERTED BREVE
+0210;N # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0211;N # LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0212;N # LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0213;N # LATIN SMALL LETTER R WITH INVERTED BREVE
+0214;N # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0215;N # LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0216;N # LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0217;N # LATIN SMALL LETTER U WITH INVERTED BREVE
+0218;N # LATIN CAPITAL LETTER S WITH COMMA BELOW
+0219;N # LATIN SMALL LETTER S WITH COMMA BELOW
+021A;N # LATIN CAPITAL LETTER T WITH COMMA BELOW
+021B;N # LATIN SMALL LETTER T WITH COMMA BELOW
+021C;N # LATIN CAPITAL LETTER YOGH
+021D;N # LATIN SMALL LETTER YOGH
+021E;N # LATIN CAPITAL LETTER H WITH CARON
+021F;N # LATIN SMALL LETTER H WITH CARON
+0220;N # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0221;N # LATIN SMALL LETTER D WITH CURL
+0222;N # LATIN CAPITAL LETTER OU
+0223;N # LATIN SMALL LETTER OU
+0224;N # LATIN CAPITAL LETTER Z WITH HOOK
+0225;N # LATIN SMALL LETTER Z WITH HOOK
+0226;N # LATIN CAPITAL LETTER A WITH DOT ABOVE
+0227;N # LATIN SMALL LETTER A WITH DOT ABOVE
+0228;N # LATIN CAPITAL LETTER E WITH CEDILLA
+0229;N # LATIN SMALL LETTER E WITH CEDILLA
+022A;N # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022B;N # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022C;N # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022D;N # LATIN SMALL LETTER O WITH TILDE AND MACRON
+022E;N # LATIN CAPITAL LETTER O WITH DOT ABOVE
+022F;N # LATIN SMALL LETTER O WITH DOT ABOVE
+0230;N # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0231;N # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0232;N # LATIN CAPITAL LETTER Y WITH MACRON
+0233;N # LATIN SMALL LETTER Y WITH MACRON
+0234;N # LATIN SMALL LETTER L WITH CURL
+0235;N # LATIN SMALL LETTER N WITH CURL
+0236;N # LATIN SMALL LETTER T WITH CURL
+0237;N # LATIN SMALL LETTER DOTLESS J
+0238;N # LATIN SMALL LETTER DB DIGRAPH
+0239;N # LATIN SMALL LETTER QP DIGRAPH
+023A;N # LATIN CAPITAL LETTER A WITH STROKE
+023B;N # LATIN CAPITAL LETTER C WITH STROKE
+023C;N # LATIN SMALL LETTER C WITH STROKE
+023D;N # LATIN CAPITAL LETTER L WITH BAR
+023E;N # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+023F;N # LATIN SMALL LETTER S WITH SWASH TAIL
+0240;N # LATIN SMALL LETTER Z WITH SWASH TAIL
+0241;N # LATIN CAPITAL LETTER GLOTTAL STOP
+0242;N # LATIN SMALL LETTER GLOTTAL STOP
+0243;N # LATIN CAPITAL LETTER B WITH STROKE
+0244;N # LATIN CAPITAL LETTER U BAR
+0245;N # LATIN CAPITAL LETTER TURNED V
+0246;N # LATIN CAPITAL LETTER E WITH STROKE
+0247;N # LATIN SMALL LETTER E WITH STROKE
+0248;N # LATIN CAPITAL LETTER J WITH STROKE
+0249;N # LATIN SMALL LETTER J WITH STROKE
+024A;N # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+024B;N # LATIN SMALL LETTER Q WITH HOOK TAIL
+024C;N # LATIN CAPITAL LETTER R WITH STROKE
+024D;N # LATIN SMALL LETTER R WITH STROKE
+024E;N # LATIN CAPITAL LETTER Y WITH STROKE
+024F;N # LATIN SMALL LETTER Y WITH STROKE
+0250;N # LATIN SMALL LETTER TURNED A
+0251;A # LATIN SMALL LETTER ALPHA
+0252;N # LATIN SMALL LETTER TURNED ALPHA
+0253;N # LATIN SMALL LETTER B WITH HOOK
+0254;N # LATIN SMALL LETTER OPEN O
+0255;N # LATIN SMALL LETTER C WITH CURL
+0256;N # LATIN SMALL LETTER D WITH TAIL
+0257;N # LATIN SMALL LETTER D WITH HOOK
+0258;N # LATIN SMALL LETTER REVERSED E
+0259;N # LATIN SMALL LETTER SCHWA
+025A;N # LATIN SMALL LETTER SCHWA WITH HOOK
+025B;N # LATIN SMALL LETTER OPEN E
+025C;N # LATIN SMALL LETTER REVERSED OPEN E
+025D;N # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025E;N # LATIN SMALL LETTER CLOSED REVERSED OPEN E
+025F;N # LATIN SMALL LETTER DOTLESS J WITH STROKE
+0260;N # LATIN SMALL LETTER G WITH HOOK
+0261;A # LATIN SMALL LETTER SCRIPT G
+0262;N # LATIN LETTER SMALL CAPITAL G
+0263;N # LATIN SMALL LETTER GAMMA
+0264;N # LATIN SMALL LETTER RAMS HORN
+0265;N # LATIN SMALL LETTER TURNED H
+0266;N # LATIN SMALL LETTER H WITH HOOK
+0267;N # LATIN SMALL LETTER HENG WITH HOOK
+0268;N # LATIN SMALL LETTER I WITH STROKE
+0269;N # LATIN SMALL LETTER IOTA
+026A;N # LATIN LETTER SMALL CAPITAL I
+026B;N # LATIN SMALL LETTER L WITH MIDDLE TILDE
+026C;N # LATIN SMALL LETTER L WITH BELT
+026D;N # LATIN SMALL LETTER L WITH RETROFLEX HOOK
+026E;N # LATIN SMALL LETTER LEZH
+026F;N # LATIN SMALL LETTER TURNED M
+0270;N # LATIN SMALL LETTER TURNED M WITH LONG LEG
+0271;N # LATIN SMALL LETTER M WITH HOOK
+0272;N # LATIN SMALL LETTER N WITH LEFT HOOK
+0273;N # LATIN SMALL LETTER N WITH RETROFLEX HOOK
+0274;N # LATIN LETTER SMALL CAPITAL N
+0275;N # LATIN SMALL LETTER BARRED O
+0276;N # LATIN LETTER SMALL CAPITAL OE
+0277;N # LATIN SMALL LETTER CLOSED OMEGA
+0278;N # LATIN SMALL LETTER PHI
+0279;N # LATIN SMALL LETTER TURNED R
+027A;N # LATIN SMALL LETTER TURNED R WITH LONG LEG
+027B;N # LATIN SMALL LETTER TURNED R WITH HOOK
+027C;N # LATIN SMALL LETTER R WITH LONG LEG
+027D;N # LATIN SMALL LETTER R WITH TAIL
+027E;N # LATIN SMALL LETTER R WITH FISHHOOK
+027F;N # LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0280;N # LATIN LETTER SMALL CAPITAL R
+0281;N # LATIN LETTER SMALL CAPITAL INVERTED R
+0282;N # LATIN SMALL LETTER S WITH HOOK
+0283;N # LATIN SMALL LETTER ESH
+0284;N # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+0285;N # LATIN SMALL LETTER SQUAT REVERSED ESH
+0286;N # LATIN SMALL LETTER ESH WITH CURL
+0287;N # LATIN SMALL LETTER TURNED T
+0288;N # LATIN SMALL LETTER T WITH RETROFLEX HOOK
+0289;N # LATIN SMALL LETTER U BAR
+028A;N # LATIN SMALL LETTER UPSILON
+028B;N # LATIN SMALL LETTER V WITH HOOK
+028C;N # LATIN SMALL LETTER TURNED V
+028D;N # LATIN SMALL LETTER TURNED W
+028E;N # LATIN SMALL LETTER TURNED Y
+028F;N # LATIN LETTER SMALL CAPITAL Y
+0290;N # LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+0291;N # LATIN SMALL LETTER Z WITH CURL
+0292;N # LATIN SMALL LETTER EZH
+0293;N # LATIN SMALL LETTER EZH WITH CURL
+0294;N # LATIN LETTER GLOTTAL STOP
+0295;N # LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+0296;N # LATIN LETTER INVERTED GLOTTAL STOP
+0297;N # LATIN LETTER STRETCHED C
+0298;N # LATIN LETTER BILABIAL CLICK
+0299;N # LATIN LETTER SMALL CAPITAL B
+029A;N # LATIN SMALL LETTER CLOSED OPEN E
+029B;N # LATIN LETTER SMALL CAPITAL G WITH HOOK
+029C;N # LATIN LETTER SMALL CAPITAL H
+029D;N # LATIN SMALL LETTER J WITH CROSSED-TAIL
+029E;N # LATIN SMALL LETTER TURNED K
+029F;N # LATIN LETTER SMALL CAPITAL L
+02A0;N # LATIN SMALL LETTER Q WITH HOOK
+02A1;N # LATIN LETTER GLOTTAL STOP WITH STROKE
+02A2;N # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+02A3;N # LATIN SMALL LETTER DZ DIGRAPH
+02A4;N # LATIN SMALL LETTER DEZH DIGRAPH
+02A5;N # LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+02A6;N # LATIN SMALL LETTER TS DIGRAPH
+02A7;N # LATIN SMALL LETTER TESH DIGRAPH
+02A8;N # LATIN SMALL LETTER TC DIGRAPH WITH CURL
+02A9;N # LATIN SMALL LETTER FENG DIGRAPH
+02AA;N # LATIN SMALL LETTER LS DIGRAPH
+02AB;N # LATIN SMALL LETTER LZ DIGRAPH
+02AC;N # LATIN LETTER BILABIAL PERCUSSIVE
+02AD;N # LATIN LETTER BIDENTAL PERCUSSIVE
+02AE;N # LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF;N # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0;N # MODIFIER LETTER SMALL H
+02B1;N # MODIFIER LETTER SMALL H WITH HOOK
+02B2;N # MODIFIER LETTER SMALL J
+02B3;N # MODIFIER LETTER SMALL R
+02B4;N # MODIFIER LETTER SMALL TURNED R
+02B5;N # MODIFIER LETTER SMALL TURNED R WITH HOOK
+02B6;N # MODIFIER LETTER SMALL CAPITAL INVERTED R
+02B7;N # MODIFIER LETTER SMALL W
+02B8;N # MODIFIER LETTER SMALL Y
+02B9;N # MODIFIER LETTER PRIME
+02BA;N # MODIFIER LETTER DOUBLE PRIME
+02BB;N # MODIFIER LETTER TURNED COMMA
+02BC;N # MODIFIER LETTER APOSTROPHE
+02BD;N # MODIFIER LETTER REVERSED COMMA
+02BE;N # MODIFIER LETTER RIGHT HALF RING
+02BF;N # MODIFIER LETTER LEFT HALF RING
+02C0;N # MODIFIER LETTER GLOTTAL STOP
+02C1;N # MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2;N # MODIFIER LETTER LEFT ARROWHEAD
+02C3;N # MODIFIER LETTER RIGHT ARROWHEAD
+02C4;A # MODIFIER LETTER UP ARROWHEAD
+02C5;N # MODIFIER LETTER DOWN ARROWHEAD
+02C6;N # MODIFIER LETTER CIRCUMFLEX ACCENT
+02C7;A # CARON
+02C8;N # MODIFIER LETTER VERTICAL LINE
+02C9;A # MODIFIER LETTER MACRON
+02CA;A # MODIFIER LETTER ACUTE ACCENT
+02CB;A # MODIFIER LETTER GRAVE ACCENT
+02CC;N # MODIFIER LETTER LOW VERTICAL LINE
+02CD;A # MODIFIER LETTER LOW MACRON
+02CE;N # MODIFIER LETTER LOW GRAVE ACCENT
+02CF;N # MODIFIER LETTER LOW ACUTE ACCENT
+02D0;A # MODIFIER LETTER TRIANGULAR COLON
+02D1;N # MODIFIER LETTER HALF TRIANGULAR COLON
+02D2;N # MODIFIER LETTER CENTRED RIGHT HALF RING
+02D3;N # MODIFIER LETTER CENTRED LEFT HALF RING
+02D4;N # MODIFIER LETTER UP TACK
+02D5;N # MODIFIER LETTER DOWN TACK
+02D6;N # MODIFIER LETTER PLUS SIGN
+02D7;N # MODIFIER LETTER MINUS SIGN
+02D8;A # BREVE
+02D9;A # DOT ABOVE
+02DA;A # RING ABOVE
+02DB;A # OGONEK
+02DC;N # SMALL TILDE
+02DD;A # DOUBLE ACUTE ACCENT
+02DE;N # MODIFIER LETTER RHOTIC HOOK
+02DF;A # MODIFIER LETTER CROSS ACCENT
+02E0;N # MODIFIER LETTER SMALL GAMMA
+02E1;N # MODIFIER LETTER SMALL L
+02E2;N # MODIFIER LETTER SMALL S
+02E3;N # MODIFIER LETTER SMALL X
+02E4;N # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5;N # MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6;N # MODIFIER LETTER HIGH TONE BAR
+02E7;N # MODIFIER LETTER MID TONE BAR
+02E8;N # MODIFIER LETTER LOW TONE BAR
+02E9;N # MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA;N # MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB;N # MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC;N # MODIFIER LETTER VOICING
+02ED;N # MODIFIER LETTER UNASPIRATED
+02EE;N # MODIFIER LETTER DOUBLE APOSTROPHE
+02EF;N # MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0;N # MODIFIER LETTER LOW UP ARROWHEAD
+02F1;N # MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2;N # MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3;N # MODIFIER LETTER LOW RING
+02F4;N # MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5;N # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6;N # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7;N # MODIFIER LETTER LOW TILDE
+02F8;N # MODIFIER LETTER RAISED COLON
+02F9;N # MODIFIER LETTER BEGIN HIGH TONE
+02FA;N # MODIFIER LETTER END HIGH TONE
+02FB;N # MODIFIER LETTER BEGIN LOW TONE
+02FC;N # MODIFIER LETTER END LOW TONE
+02FD;N # MODIFIER LETTER SHELF
+02FE;N # MODIFIER LETTER OPEN SHELF
+02FF;N # MODIFIER LETTER LOW LEFT ARROW
+0300;A # COMBINING GRAVE ACCENT
+0301;A # COMBINING ACUTE ACCENT
+0302;A # COMBINING CIRCUMFLEX ACCENT
+0303;A # COMBINING TILDE
+0304;A # COMBINING MACRON
+0305;A # COMBINING OVERLINE
+0306;A # COMBINING BREVE
+0307;A # COMBINING DOT ABOVE
+0308;A # COMBINING DIAERESIS
+0309;A # COMBINING HOOK ABOVE
+030A;A # COMBINING RING ABOVE
+030B;A # COMBINING DOUBLE ACUTE ACCENT
+030C;A # COMBINING CARON
+030D;A # COMBINING VERTICAL LINE ABOVE
+030E;A # COMBINING DOUBLE VERTICAL LINE ABOVE
+030F;A # COMBINING DOUBLE GRAVE ACCENT
+0310;A # COMBINING CANDRABINDU
+0311;A # COMBINING INVERTED BREVE
+0312;A # COMBINING TURNED COMMA ABOVE
+0313;A # COMBINING COMMA ABOVE
+0314;A # COMBINING REVERSED COMMA ABOVE
+0315;A # COMBINING COMMA ABOVE RIGHT
+0316;A # COMBINING GRAVE ACCENT BELOW
+0317;A # COMBINING ACUTE ACCENT BELOW
+0318;A # COMBINING LEFT TACK BELOW
+0319;A # COMBINING RIGHT TACK BELOW
+031A;A # COMBINING LEFT ANGLE ABOVE
+031B;A # COMBINING HORN
+031C;A # COMBINING LEFT HALF RING BELOW
+031D;A # COMBINING UP TACK BELOW
+031E;A # COMBINING DOWN TACK BELOW
+031F;A # COMBINING PLUS SIGN BELOW
+0320;A # COMBINING MINUS SIGN BELOW
+0321;A # COMBINING PALATALIZED HOOK BELOW
+0322;A # COMBINING RETROFLEX HOOK BELOW
+0323;A # COMBINING DOT BELOW
+0324;A # COMBINING DIAERESIS BELOW
+0325;A # COMBINING RING BELOW
+0326;A # COMBINING COMMA BELOW
+0327;A # COMBINING CEDILLA
+0328;A # COMBINING OGONEK
+0329;A # COMBINING VERTICAL LINE BELOW
+032A;A # COMBINING BRIDGE BELOW
+032B;A # COMBINING INVERTED DOUBLE ARCH BELOW
+032C;A # COMBINING CARON BELOW
+032D;A # COMBINING CIRCUMFLEX ACCENT BELOW
+032E;A # COMBINING BREVE BELOW
+032F;A # COMBINING INVERTED BREVE BELOW
+0330;A # COMBINING TILDE BELOW
+0331;A # COMBINING MACRON BELOW
+0332;A # COMBINING LOW LINE
+0333;A # COMBINING DOUBLE LOW LINE
+0334;A # COMBINING TILDE OVERLAY
+0335;A # COMBINING SHORT STROKE OVERLAY
+0336;A # COMBINING LONG STROKE OVERLAY
+0337;A # COMBINING SHORT SOLIDUS OVERLAY
+0338;A # COMBINING LONG SOLIDUS OVERLAY
+0339;A # COMBINING RIGHT HALF RING BELOW
+033A;A # COMBINING INVERTED BRIDGE BELOW
+033B;A # COMBINING SQUARE BELOW
+033C;A # COMBINING SEAGULL BELOW
+033D;A # COMBINING X ABOVE
+033E;A # COMBINING VERTICAL TILDE
+033F;A # COMBINING DOUBLE OVERLINE
+0340;A # COMBINING GRAVE TONE MARK
+0341;A # COMBINING ACUTE TONE MARK
+0342;A # COMBINING GREEK PERISPOMENI
+0343;A # COMBINING GREEK KORONIS
+0344;A # COMBINING GREEK DIALYTIKA TONOS
+0345;A # COMBINING GREEK YPOGEGRAMMENI
+0346;A # COMBINING BRIDGE ABOVE
+0347;A # COMBINING EQUALS SIGN BELOW
+0348;A # COMBINING DOUBLE VERTICAL LINE BELOW
+0349;A # COMBINING LEFT ANGLE BELOW
+034A;A # COMBINING NOT TILDE ABOVE
+034B;A # COMBINING HOMOTHETIC ABOVE
+034C;A # COMBINING ALMOST EQUAL TO ABOVE
+034D;A # COMBINING LEFT RIGHT ARROW BELOW
+034E;A # COMBINING UPWARDS ARROW BELOW
+034F;A # COMBINING GRAPHEME JOINER
+0350;A # COMBINING RIGHT ARROWHEAD ABOVE
+0351;A # COMBINING LEFT HALF RING ABOVE
+0352;A # COMBINING FERMATA
+0353;A # COMBINING X BELOW
+0354;A # COMBINING LEFT ARROWHEAD BELOW
+0355;A # COMBINING RIGHT ARROWHEAD BELOW
+0356;A # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357;A # COMBINING RIGHT HALF RING ABOVE
+0358;A # COMBINING DOT ABOVE RIGHT
+0359;A # COMBINING ASTERISK BELOW
+035A;A # COMBINING DOUBLE RING BELOW
+035B;A # COMBINING ZIGZAG ABOVE
+035C;A # COMBINING DOUBLE BREVE BELOW
+035D;A # COMBINING DOUBLE BREVE
+035E;A # COMBINING DOUBLE MACRON
+035F;A # COMBINING DOUBLE MACRON BELOW
+0360;A # COMBINING DOUBLE TILDE
+0361;A # COMBINING DOUBLE INVERTED BREVE
+0362;A # COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0363;A # COMBINING LATIN SMALL LETTER A
+0364;A # COMBINING LATIN SMALL LETTER E
+0365;A # COMBINING LATIN SMALL LETTER I
+0366;A # COMBINING LATIN SMALL LETTER O
+0367;A # COMBINING LATIN SMALL LETTER U
+0368;A # COMBINING LATIN SMALL LETTER C
+0369;A # COMBINING LATIN SMALL LETTER D
+036A;A # COMBINING LATIN SMALL LETTER H
+036B;A # COMBINING LATIN SMALL LETTER M
+036C;A # COMBINING LATIN SMALL LETTER R
+036D;A # COMBINING LATIN SMALL LETTER T
+036E;A # COMBINING LATIN SMALL LETTER V
+036F;A # COMBINING LATIN SMALL LETTER X
+0370;N # GREEK CAPITAL LETTER HETA
+0371;N # GREEK SMALL LETTER HETA
+0372;N # GREEK CAPITAL LETTER ARCHAIC SAMPI
+0373;N # GREEK SMALL LETTER ARCHAIC SAMPI
+0374;N # GREEK NUMERAL SIGN
+0375;N # GREEK LOWER NUMERAL SIGN
+0376;N # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+0377;N # GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A;N # GREEK YPOGEGRAMMENI
+037B;N # GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
+037C;N # GREEK SMALL DOTTED LUNATE SIGMA SYMBOL
+037D;N # GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+037E;N # GREEK QUESTION MARK
+0384;N # GREEK TONOS
+0385;N # GREEK DIALYTIKA TONOS
+0386;N # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387;N # GREEK ANO TELEIA
+0388;N # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389;N # GREEK CAPITAL LETTER ETA WITH TONOS
+038A;N # GREEK CAPITAL LETTER IOTA WITH TONOS
+038C;N # GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E;N # GREEK CAPITAL LETTER UPSILON WITH TONOS
+038F;N # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391;A # GREEK CAPITAL LETTER ALPHA
+0392;A # GREEK CAPITAL LETTER BETA
+0393;A # GREEK CAPITAL LETTER GAMMA
+0394;A # GREEK CAPITAL LETTER DELTA
+0395;A # GREEK CAPITAL LETTER EPSILON
+0396;A # GREEK CAPITAL LETTER ZETA
+0397;A # GREEK CAPITAL LETTER ETA
+0398;A # GREEK CAPITAL LETTER THETA
+0399;A # GREEK CAPITAL LETTER IOTA
+039A;A # GREEK CAPITAL LETTER KAPPA
+039B;A # GREEK CAPITAL LETTER LAMDA
+039C;A # GREEK CAPITAL LETTER MU
+039D;A # GREEK CAPITAL LETTER NU
+039E;A # GREEK CAPITAL LETTER XI
+039F;A # GREEK CAPITAL LETTER OMICRON
+03A0;A # GREEK CAPITAL LETTER PI
+03A1;A # GREEK CAPITAL LETTER RHO
+03A3;A # GREEK CAPITAL LETTER SIGMA
+03A4;A # GREEK CAPITAL LETTER TAU
+03A5;A # GREEK CAPITAL LETTER UPSILON
+03A6;A # GREEK CAPITAL LETTER PHI
+03A7;A # GREEK CAPITAL LETTER CHI
+03A8;A # GREEK CAPITAL LETTER PSI
+03A9;A # GREEK CAPITAL LETTER OMEGA
+03AA;N # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03AB;N # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03AC;N # GREEK SMALL LETTER ALPHA WITH TONOS
+03AD;N # GREEK SMALL LETTER EPSILON WITH TONOS
+03AE;N # GREEK SMALL LETTER ETA WITH TONOS
+03AF;N # GREEK SMALL LETTER IOTA WITH TONOS
+03B0;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03B1;A # GREEK SMALL LETTER ALPHA
+03B2;A # GREEK SMALL LETTER BETA
+03B3;A # GREEK SMALL LETTER GAMMA
+03B4;A # GREEK SMALL LETTER DELTA
+03B5;A # GREEK SMALL LETTER EPSILON
+03B6;A # GREEK SMALL LETTER ZETA
+03B7;A # GREEK SMALL LETTER ETA
+03B8;A # GREEK SMALL LETTER THETA
+03B9;A # GREEK SMALL LETTER IOTA
+03BA;A # GREEK SMALL LETTER KAPPA
+03BB;A # GREEK SMALL LETTER LAMDA
+03BC;A # GREEK SMALL LETTER MU
+03BD;A # GREEK SMALL LETTER NU
+03BE;A # GREEK SMALL LETTER XI
+03BF;A # GREEK SMALL LETTER OMICRON
+03C0;A # GREEK SMALL LETTER PI
+03C1;A # GREEK SMALL LETTER RHO
+03C2;N # GREEK SMALL LETTER FINAL SIGMA
+03C3;A # GREEK SMALL LETTER SIGMA
+03C4;A # GREEK SMALL LETTER TAU
+03C5;A # GREEK SMALL LETTER UPSILON
+03C6;A # GREEK SMALL LETTER PHI
+03C7;A # GREEK SMALL LETTER CHI
+03C8;A # GREEK SMALL LETTER PSI
+03C9;A # GREEK SMALL LETTER OMEGA
+03CA;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+03CB;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+03CC;N # GREEK SMALL LETTER OMICRON WITH TONOS
+03CD;N # GREEK SMALL LETTER UPSILON WITH TONOS
+03CE;N # GREEK SMALL LETTER OMEGA WITH TONOS
+03CF;N # GREEK CAPITAL KAI SYMBOL
+03D0;N # GREEK BETA SYMBOL
+03D1;N # GREEK THETA SYMBOL
+03D2;N # GREEK UPSILON WITH HOOK SYMBOL
+03D3;N # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+03D4;N # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+03D5;N # GREEK PHI SYMBOL
+03D6;N # GREEK PI SYMBOL
+03D7;N # GREEK KAI SYMBOL
+03D8;N # GREEK LETTER ARCHAIC KOPPA
+03D9;N # GREEK SMALL LETTER ARCHAIC KOPPA
+03DA;N # GREEK LETTER STIGMA
+03DB;N # GREEK SMALL LETTER STIGMA
+03DC;N # GREEK LETTER DIGAMMA
+03DD;N # GREEK SMALL LETTER DIGAMMA
+03DE;N # GREEK LETTER KOPPA
+03DF;N # GREEK SMALL LETTER KOPPA
+03E0;N # GREEK LETTER SAMPI
+03E1;N # GREEK SMALL LETTER SAMPI
+03E2;N # COPTIC CAPITAL LETTER SHEI
+03E3;N # COPTIC SMALL LETTER SHEI
+03E4;N # COPTIC CAPITAL LETTER FEI
+03E5;N # COPTIC SMALL LETTER FEI
+03E6;N # COPTIC CAPITAL LETTER KHEI
+03E7;N # COPTIC SMALL LETTER KHEI
+03E8;N # COPTIC CAPITAL LETTER HORI
+03E9;N # COPTIC SMALL LETTER HORI
+03EA;N # COPTIC CAPITAL LETTER GANGIA
+03EB;N # COPTIC SMALL LETTER GANGIA
+03EC;N # COPTIC CAPITAL LETTER SHIMA
+03ED;N # COPTIC SMALL LETTER SHIMA
+03EE;N # COPTIC CAPITAL LETTER DEI
+03EF;N # COPTIC SMALL LETTER DEI
+03F0;N # GREEK KAPPA SYMBOL
+03F1;N # GREEK RHO SYMBOL
+03F2;N # GREEK LUNATE SIGMA SYMBOL
+03F3;N # GREEK LETTER YOT
+03F4;N # GREEK CAPITAL THETA SYMBOL
+03F5;N # GREEK LUNATE EPSILON SYMBOL
+03F6;N # GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7;N # GREEK CAPITAL LETTER SHO
+03F8;N # GREEK SMALL LETTER SHO
+03F9;N # GREEK CAPITAL LUNATE SIGMA SYMBOL
+03FA;N # GREEK CAPITAL LETTER SAN
+03FB;N # GREEK SMALL LETTER SAN
+03FC;N # GREEK RHO WITH STROKE SYMBOL
+03FD;N # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+03FE;N # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+03FF;N # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0400;N # CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401;A # CYRILLIC CAPITAL LETTER IO
+0402;N # CYRILLIC CAPITAL LETTER DJE
+0403;N # CYRILLIC CAPITAL LETTER GJE
+0404;N # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405;N # CYRILLIC CAPITAL LETTER DZE
+0406;N # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407;N # CYRILLIC CAPITAL LETTER YI
+0408;N # CYRILLIC CAPITAL LETTER JE
+0409;N # CYRILLIC CAPITAL LETTER LJE
+040A;N # CYRILLIC CAPITAL LETTER NJE
+040B;N # CYRILLIC CAPITAL LETTER TSHE
+040C;N # CYRILLIC CAPITAL LETTER KJE
+040D;N # CYRILLIC CAPITAL LETTER I WITH GRAVE
+040E;N # CYRILLIC CAPITAL LETTER SHORT U
+040F;N # CYRILLIC CAPITAL LETTER DZHE
+0410;A # CYRILLIC CAPITAL LETTER A
+0411;A # CYRILLIC CAPITAL LETTER BE
+0412;A # CYRILLIC CAPITAL LETTER VE
+0413;A # CYRILLIC CAPITAL LETTER GHE
+0414;A # CYRILLIC CAPITAL LETTER DE
+0415;A # CYRILLIC CAPITAL LETTER IE
+0416;A # CYRILLIC CAPITAL LETTER ZHE
+0417;A # CYRILLIC CAPITAL LETTER ZE
+0418;A # CYRILLIC CAPITAL LETTER I
+0419;A # CYRILLIC CAPITAL LETTER SHORT I
+041A;A # CYRILLIC CAPITAL LETTER KA
+041B;A # CYRILLIC CAPITAL LETTER EL
+041C;A # CYRILLIC CAPITAL LETTER EM
+041D;A # CYRILLIC CAPITAL LETTER EN
+041E;A # CYRILLIC CAPITAL LETTER O
+041F;A # CYRILLIC CAPITAL LETTER PE
+0420;A # CYRILLIC CAPITAL LETTER ER
+0421;A # CYRILLIC CAPITAL LETTER ES
+0422;A # CYRILLIC CAPITAL LETTER TE
+0423;A # CYRILLIC CAPITAL LETTER U
+0424;A # CYRILLIC CAPITAL LETTER EF
+0425;A # CYRILLIC CAPITAL LETTER HA
+0426;A # CYRILLIC CAPITAL LETTER TSE
+0427;A # CYRILLIC CAPITAL LETTER CHE
+0428;A # CYRILLIC CAPITAL LETTER SHA
+0429;A # CYRILLIC CAPITAL LETTER SHCHA
+042A;A # CYRILLIC CAPITAL LETTER HARD SIGN
+042B;A # CYRILLIC CAPITAL LETTER YERU
+042C;A # CYRILLIC CAPITAL LETTER SOFT SIGN
+042D;A # CYRILLIC CAPITAL LETTER E
+042E;A # CYRILLIC CAPITAL LETTER YU
+042F;A # CYRILLIC CAPITAL LETTER YA
+0430;A # CYRILLIC SMALL LETTER A
+0431;A # CYRILLIC SMALL LETTER BE
+0432;A # CYRILLIC SMALL LETTER VE
+0433;A # CYRILLIC SMALL LETTER GHE
+0434;A # CYRILLIC SMALL LETTER DE
+0435;A # CYRILLIC SMALL LETTER IE
+0436;A # CYRILLIC SMALL LETTER ZHE
+0437;A # CYRILLIC SMALL LETTER ZE
+0438;A # CYRILLIC SMALL LETTER I
+0439;A # CYRILLIC SMALL LETTER SHORT I
+043A;A # CYRILLIC SMALL LETTER KA
+043B;A # CYRILLIC SMALL LETTER EL
+043C;A # CYRILLIC SMALL LETTER EM
+043D;A # CYRILLIC SMALL LETTER EN
+043E;A # CYRILLIC SMALL LETTER O
+043F;A # CYRILLIC SMALL LETTER PE
+0440;A # CYRILLIC SMALL LETTER ER
+0441;A # CYRILLIC SMALL LETTER ES
+0442;A # CYRILLIC SMALL LETTER TE
+0443;A # CYRILLIC SMALL LETTER U
+0444;A # CYRILLIC SMALL LETTER EF
+0445;A # CYRILLIC SMALL LETTER HA
+0446;A # CYRILLIC SMALL LETTER TSE
+0447;A # CYRILLIC SMALL LETTER CHE
+0448;A # CYRILLIC SMALL LETTER SHA
+0449;A # CYRILLIC SMALL LETTER SHCHA
+044A;A # CYRILLIC SMALL LETTER HARD SIGN
+044B;A # CYRILLIC SMALL LETTER YERU
+044C;A # CYRILLIC SMALL LETTER SOFT SIGN
+044D;A # CYRILLIC SMALL LETTER E
+044E;A # CYRILLIC SMALL LETTER YU
+044F;A # CYRILLIC SMALL LETTER YA
+0450;N # CYRILLIC SMALL LETTER IE WITH GRAVE
+0451;A # CYRILLIC SMALL LETTER IO
+0452;N # CYRILLIC SMALL LETTER DJE
+0453;N # CYRILLIC SMALL LETTER GJE
+0454;N # CYRILLIC SMALL LETTER UKRAINIAN IE
+0455;N # CYRILLIC SMALL LETTER DZE
+0456;N # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0457;N # CYRILLIC SMALL LETTER YI
+0458;N # CYRILLIC SMALL LETTER JE
+0459;N # CYRILLIC SMALL LETTER LJE
+045A;N # CYRILLIC SMALL LETTER NJE
+045B;N # CYRILLIC SMALL LETTER TSHE
+045C;N # CYRILLIC SMALL LETTER KJE
+045D;N # CYRILLIC SMALL LETTER I WITH GRAVE
+045E;N # CYRILLIC SMALL LETTER SHORT U
+045F;N # CYRILLIC SMALL LETTER DZHE
+0460;N # CYRILLIC CAPITAL LETTER OMEGA
+0461;N # CYRILLIC SMALL LETTER OMEGA
+0462;N # CYRILLIC CAPITAL LETTER YAT
+0463;N # CYRILLIC SMALL LETTER YAT
+0464;N # CYRILLIC CAPITAL LETTER IOTIFIED E
+0465;N # CYRILLIC SMALL LETTER IOTIFIED E
+0466;N # CYRILLIC CAPITAL LETTER LITTLE YUS
+0467;N # CYRILLIC SMALL LETTER LITTLE YUS
+0468;N # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469;N # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046A;N # CYRILLIC CAPITAL LETTER BIG YUS
+046B;N # CYRILLIC SMALL LETTER BIG YUS
+046C;N # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046D;N # CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046E;N # CYRILLIC CAPITAL LETTER KSI
+046F;N # CYRILLIC SMALL LETTER KSI
+0470;N # CYRILLIC CAPITAL LETTER PSI
+0471;N # CYRILLIC SMALL LETTER PSI
+0472;N # CYRILLIC CAPITAL LETTER FITA
+0473;N # CYRILLIC SMALL LETTER FITA
+0474;N # CYRILLIC CAPITAL LETTER IZHITSA
+0475;N # CYRILLIC SMALL LETTER IZHITSA
+0476;N # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0477;N # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478;N # CYRILLIC CAPITAL LETTER UK
+0479;N # CYRILLIC SMALL LETTER UK
+047A;N # CYRILLIC CAPITAL LETTER ROUND OMEGA
+047B;N # CYRILLIC SMALL LETTER ROUND OMEGA
+047C;N # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047D;N # CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047E;N # CYRILLIC CAPITAL LETTER OT
+047F;N # CYRILLIC SMALL LETTER OT
+0480;N # CYRILLIC CAPITAL LETTER KOPPA
+0481;N # CYRILLIC SMALL LETTER KOPPA
+0482;N # CYRILLIC THOUSANDS SIGN
+0483;N # COMBINING CYRILLIC TITLO
+0484;N # COMBINING CYRILLIC PALATALIZATION
+0485;N # COMBINING CYRILLIC DASIA PNEUMATA
+0486;N # COMBINING CYRILLIC PSILI PNEUMATA
+0487;N # COMBINING CYRILLIC POKRYTIE
+0488;N # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489;N # COMBINING CYRILLIC MILLIONS SIGN
+048A;N # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048B;N # CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048C;N # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048D;N # CYRILLIC SMALL LETTER SEMISOFT SIGN
+048E;N # CYRILLIC CAPITAL LETTER ER WITH TICK
+048F;N # CYRILLIC SMALL LETTER ER WITH TICK
+0490;N # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491;N # CYRILLIC SMALL LETTER GHE WITH UPTURN
+0492;N # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493;N # CYRILLIC SMALL LETTER GHE WITH STROKE
+0494;N # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495;N # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0496;N # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497;N # CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0498;N # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499;N # CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049A;N # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049B;N # CYRILLIC SMALL LETTER KA WITH DESCENDER
+049C;N # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049D;N # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049E;N # CYRILLIC CAPITAL LETTER KA WITH STROKE
+049F;N # CYRILLIC SMALL LETTER KA WITH STROKE
+04A0;N # CYRILLIC CAPITAL LETTER BASHKIR KA
+04A1;N # CYRILLIC SMALL LETTER BASHKIR KA
+04A2;N # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A3;N # CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A4;N # CYRILLIC CAPITAL LIGATURE EN GHE
+04A5;N # CYRILLIC SMALL LIGATURE EN GHE
+04A6;N # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A7;N # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A8;N # CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04A9;N # CYRILLIC SMALL LETTER ABKHASIAN HA
+04AA;N # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AB;N # CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AC;N # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AD;N # CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AE;N # CYRILLIC CAPITAL LETTER STRAIGHT U
+04AF;N # CYRILLIC SMALL LETTER STRAIGHT U
+04B0;N # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B1;N # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B2;N # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B3;N # CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B4;N # CYRILLIC CAPITAL LIGATURE TE TSE
+04B5;N # CYRILLIC SMALL LIGATURE TE TSE
+04B6;N # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B7;N # CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B8;N # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04B9;N # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04BA;N # CYRILLIC CAPITAL LETTER SHHA
+04BB;N # CYRILLIC SMALL LETTER SHHA
+04BC;N # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BD;N # CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BE;N # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04BF;N # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0;N # CYRILLIC LETTER PALOCHKA
+04C1;N # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C2;N # CYRILLIC SMALL LETTER ZHE WITH BREVE
+04C3;N # CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C4;N # CYRILLIC SMALL LETTER KA WITH HOOK
+04C5;N # CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C6;N # CYRILLIC SMALL LETTER EL WITH TAIL
+04C7;N # CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C8;N # CYRILLIC SMALL LETTER EN WITH HOOK
+04C9;N # CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CA;N # CYRILLIC SMALL LETTER EN WITH TAIL
+04CB;N # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CC;N # CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CD;N # CYRILLIC CAPITAL LETTER EM WITH TAIL
+04CE;N # CYRILLIC SMALL LETTER EM WITH TAIL
+04CF;N # CYRILLIC SMALL LETTER PALOCHKA
+04D0;N # CYRILLIC CAPITAL LETTER A WITH BREVE
+04D1;N # CYRILLIC SMALL LETTER A WITH BREVE
+04D2;N # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D3;N # CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D4;N # CYRILLIC CAPITAL LIGATURE A IE
+04D5;N # CYRILLIC SMALL LIGATURE A IE
+04D6;N # CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D7;N # CYRILLIC SMALL LETTER IE WITH BREVE
+04D8;N # CYRILLIC CAPITAL LETTER SCHWA
+04D9;N # CYRILLIC SMALL LETTER SCHWA
+04DA;N # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DB;N # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DC;N # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DD;N # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DE;N # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04DF;N # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E0;N # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E1;N # CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E2;N # CYRILLIC CAPITAL LETTER I WITH MACRON
+04E3;N # CYRILLIC SMALL LETTER I WITH MACRON
+04E4;N # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E5;N # CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E6;N # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E7;N # CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E8;N # CYRILLIC CAPITAL LETTER BARRED O
+04E9;N # CYRILLIC SMALL LETTER BARRED O
+04EA;N # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EB;N # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EC;N # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04ED;N # CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EE;N # CYRILLIC CAPITAL LETTER U WITH MACRON
+04EF;N # CYRILLIC SMALL LETTER U WITH MACRON
+04F0;N # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F1;N # CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F2;N # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F3;N # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F4;N # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F5;N # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F6;N # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F7;N # CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F8;N # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04F9;N # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+04FA;N # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+04FB;N # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+04FC;N # CYRILLIC CAPITAL LETTER HA WITH HOOK
+04FD;N # CYRILLIC SMALL LETTER HA WITH HOOK
+04FE;N # CYRILLIC CAPITAL LETTER HA WITH STROKE
+04FF;N # CYRILLIC SMALL LETTER HA WITH STROKE
+0500;N # CYRILLIC CAPITAL LETTER KOMI DE
+0501;N # CYRILLIC SMALL LETTER KOMI DE
+0502;N # CYRILLIC CAPITAL LETTER KOMI DJE
+0503;N # CYRILLIC SMALL LETTER KOMI DJE
+0504;N # CYRILLIC CAPITAL LETTER KOMI ZJE
+0505;N # CYRILLIC SMALL LETTER KOMI ZJE
+0506;N # CYRILLIC CAPITAL LETTER KOMI DZJE
+0507;N # CYRILLIC SMALL LETTER KOMI DZJE
+0508;N # CYRILLIC CAPITAL LETTER KOMI LJE
+0509;N # CYRILLIC SMALL LETTER KOMI LJE
+050A;N # CYRILLIC CAPITAL LETTER KOMI NJE
+050B;N # CYRILLIC SMALL LETTER KOMI NJE
+050C;N # CYRILLIC CAPITAL LETTER KOMI SJE
+050D;N # CYRILLIC SMALL LETTER KOMI SJE
+050E;N # CYRILLIC CAPITAL LETTER KOMI TJE
+050F;N # CYRILLIC SMALL LETTER KOMI TJE
+0510;N # CYRILLIC CAPITAL LETTER REVERSED ZE
+0511;N # CYRILLIC SMALL LETTER REVERSED ZE
+0512;N # CYRILLIC CAPITAL LETTER EL WITH HOOK
+0513;N # CYRILLIC SMALL LETTER EL WITH HOOK
+0514;N # CYRILLIC CAPITAL LETTER LHA
+0515;N # CYRILLIC SMALL LETTER LHA
+0516;N # CYRILLIC CAPITAL LETTER RHA
+0517;N # CYRILLIC SMALL LETTER RHA
+0518;N # CYRILLIC CAPITAL LETTER YAE
+0519;N # CYRILLIC SMALL LETTER YAE
+051A;N # CYRILLIC CAPITAL LETTER QA
+051B;N # CYRILLIC SMALL LETTER QA
+051C;N # CYRILLIC CAPITAL LETTER WE
+051D;N # CYRILLIC SMALL LETTER WE
+051E;N # CYRILLIC CAPITAL LETTER ALEUT KA
+051F;N # CYRILLIC SMALL LETTER ALEUT KA
+0520;N # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+0521;N # CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+0522;N # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+0523;N # CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+0531;N # ARMENIAN CAPITAL LETTER AYB
+0532;N # ARMENIAN CAPITAL LETTER BEN
+0533;N # ARMENIAN CAPITAL LETTER GIM
+0534;N # ARMENIAN CAPITAL LETTER DA
+0535;N # ARMENIAN CAPITAL LETTER ECH
+0536;N # ARMENIAN CAPITAL LETTER ZA
+0537;N # ARMENIAN CAPITAL LETTER EH
+0538;N # ARMENIAN CAPITAL LETTER ET
+0539;N # ARMENIAN CAPITAL LETTER TO
+053A;N # ARMENIAN CAPITAL LETTER ZHE
+053B;N # ARMENIAN CAPITAL LETTER INI
+053C;N # ARMENIAN CAPITAL LETTER LIWN
+053D;N # ARMENIAN CAPITAL LETTER XEH
+053E;N # ARMENIAN CAPITAL LETTER CA
+053F;N # ARMENIAN CAPITAL LETTER KEN
+0540;N # ARMENIAN CAPITAL LETTER HO
+0541;N # ARMENIAN CAPITAL LETTER JA
+0542;N # ARMENIAN CAPITAL LETTER GHAD
+0543;N # ARMENIAN CAPITAL LETTER CHEH
+0544;N # ARMENIAN CAPITAL LETTER MEN
+0545;N # ARMENIAN CAPITAL LETTER YI
+0546;N # ARMENIAN CAPITAL LETTER NOW
+0547;N # ARMENIAN CAPITAL LETTER SHA
+0548;N # ARMENIAN CAPITAL LETTER VO
+0549;N # ARMENIAN CAPITAL LETTER CHA
+054A;N # ARMENIAN CAPITAL LETTER PEH
+054B;N # ARMENIAN CAPITAL LETTER JHEH
+054C;N # ARMENIAN CAPITAL LETTER RA
+054D;N # ARMENIAN CAPITAL LETTER SEH
+054E;N # ARMENIAN CAPITAL LETTER VEW
+054F;N # ARMENIAN CAPITAL LETTER TIWN
+0550;N # ARMENIAN CAPITAL LETTER REH
+0551;N # ARMENIAN CAPITAL LETTER CO
+0552;N # ARMENIAN CAPITAL LETTER YIWN
+0553;N # ARMENIAN CAPITAL LETTER PIWR
+0554;N # ARMENIAN CAPITAL LETTER KEH
+0555;N # ARMENIAN CAPITAL LETTER OH
+0556;N # ARMENIAN CAPITAL LETTER FEH
+0559;N # ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A;N # ARMENIAN APOSTROPHE
+055B;N # ARMENIAN EMPHASIS MARK
+055C;N # ARMENIAN EXCLAMATION MARK
+055D;N # ARMENIAN COMMA
+055E;N # ARMENIAN QUESTION MARK
+055F;N # ARMENIAN ABBREVIATION MARK
+0561;N # ARMENIAN SMALL LETTER AYB
+0562;N # ARMENIAN SMALL LETTER BEN
+0563;N # ARMENIAN SMALL LETTER GIM
+0564;N # ARMENIAN SMALL LETTER DA
+0565;N # ARMENIAN SMALL LETTER ECH
+0566;N # ARMENIAN SMALL LETTER ZA
+0567;N # ARMENIAN SMALL LETTER EH
+0568;N # ARMENIAN SMALL LETTER ET
+0569;N # ARMENIAN SMALL LETTER TO
+056A;N # ARMENIAN SMALL LETTER ZHE
+056B;N # ARMENIAN SMALL LETTER INI
+056C;N # ARMENIAN SMALL LETTER LIWN
+056D;N # ARMENIAN SMALL LETTER XEH
+056E;N # ARMENIAN SMALL LETTER CA
+056F;N # ARMENIAN SMALL LETTER KEN
+0570;N # ARMENIAN SMALL LETTER HO
+0571;N # ARMENIAN SMALL LETTER JA
+0572;N # ARMENIAN SMALL LETTER GHAD
+0573;N # ARMENIAN SMALL LETTER CHEH
+0574;N # ARMENIAN SMALL LETTER MEN
+0575;N # ARMENIAN SMALL LETTER YI
+0576;N # ARMENIAN SMALL LETTER NOW
+0577;N # ARMENIAN SMALL LETTER SHA
+0578;N # ARMENIAN SMALL LETTER VO
+0579;N # ARMENIAN SMALL LETTER CHA
+057A;N # ARMENIAN SMALL LETTER PEH
+057B;N # ARMENIAN SMALL LETTER JHEH
+057C;N # ARMENIAN SMALL LETTER RA
+057D;N # ARMENIAN SMALL LETTER SEH
+057E;N # ARMENIAN SMALL LETTER VEW
+057F;N # ARMENIAN SMALL LETTER TIWN
+0580;N # ARMENIAN SMALL LETTER REH
+0581;N # ARMENIAN SMALL LETTER CO
+0582;N # ARMENIAN SMALL LETTER YIWN
+0583;N # ARMENIAN SMALL LETTER PIWR
+0584;N # ARMENIAN SMALL LETTER KEH
+0585;N # ARMENIAN SMALL LETTER OH
+0586;N # ARMENIAN SMALL LETTER FEH
+0587;N # ARMENIAN SMALL LIGATURE ECH YIWN
+0589;N # ARMENIAN FULL STOP
+058A;N # ARMENIAN HYPHEN
+0591;N # HEBREW ACCENT ETNAHTA
+0592;N # HEBREW ACCENT SEGOL
+0593;N # HEBREW ACCENT SHALSHELET
+0594;N # HEBREW ACCENT ZAQEF QATAN
+0595;N # HEBREW ACCENT ZAQEF GADOL
+0596;N # HEBREW ACCENT TIPEHA
+0597;N # HEBREW ACCENT REVIA
+0598;N # HEBREW ACCENT ZARQA
+0599;N # HEBREW ACCENT PASHTA
+059A;N # HEBREW ACCENT YETIV
+059B;N # HEBREW ACCENT TEVIR
+059C;N # HEBREW ACCENT GERESH
+059D;N # HEBREW ACCENT GERESH MUQDAM
+059E;N # HEBREW ACCENT GERSHAYIM
+059F;N # HEBREW ACCENT QARNEY PARA
+05A0;N # HEBREW ACCENT TELISHA GEDOLA
+05A1;N # HEBREW ACCENT PAZER
+05A2;N # HEBREW ACCENT ATNAH HAFUKH
+05A3;N # HEBREW ACCENT MUNAH
+05A4;N # HEBREW ACCENT MAHAPAKH
+05A5;N # HEBREW ACCENT MERKHA
+05A6;N # HEBREW ACCENT MERKHA KEFULA
+05A7;N # HEBREW ACCENT DARGA
+05A8;N # HEBREW ACCENT QADMA
+05A9;N # HEBREW ACCENT TELISHA QETANA
+05AA;N # HEBREW ACCENT YERAH BEN YOMO
+05AB;N # HEBREW ACCENT OLE
+05AC;N # HEBREW ACCENT ILUY
+05AD;N # HEBREW ACCENT DEHI
+05AE;N # HEBREW ACCENT ZINOR
+05AF;N # HEBREW MARK MASORA CIRCLE
+05B0;N # HEBREW POINT SHEVA
+05B1;N # HEBREW POINT HATAF SEGOL
+05B2;N # HEBREW POINT HATAF PATAH
+05B3;N # HEBREW POINT HATAF QAMATS
+05B4;N # HEBREW POINT HIRIQ
+05B5;N # HEBREW POINT TSERE
+05B6;N # HEBREW POINT SEGOL
+05B7;N # HEBREW POINT PATAH
+05B8;N # HEBREW POINT QAMATS
+05B9;N # HEBREW POINT HOLAM
+05BA;N # HEBREW POINT HOLAM HASER FOR VAV
+05BB;N # HEBREW POINT QUBUTS
+05BC;N # HEBREW POINT DAGESH OR MAPIQ
+05BD;N # HEBREW POINT METEG
+05BE;N # HEBREW PUNCTUATION MAQAF
+05BF;N # HEBREW POINT RAFE
+05C0;N # HEBREW PUNCTUATION PASEQ
+05C1;N # HEBREW POINT SHIN DOT
+05C2;N # HEBREW POINT SIN DOT
+05C3;N # HEBREW PUNCTUATION SOF PASUQ
+05C4;N # HEBREW MARK UPPER DOT
+05C5;N # HEBREW MARK LOWER DOT
+05C6;N # HEBREW PUNCTUATION NUN HAFUKHA
+05C7;N # HEBREW POINT QAMATS QATAN
+05D0;N # HEBREW LETTER ALEF
+05D1;N # HEBREW LETTER BET
+05D2;N # HEBREW LETTER GIMEL
+05D3;N # HEBREW LETTER DALET
+05D4;N # HEBREW LETTER HE
+05D5;N # HEBREW LETTER VAV
+05D6;N # HEBREW LETTER ZAYIN
+05D7;N # HEBREW LETTER HET
+05D8;N # HEBREW LETTER TET
+05D9;N # HEBREW LETTER YOD
+05DA;N # HEBREW LETTER FINAL KAF
+05DB;N # HEBREW LETTER KAF
+05DC;N # HEBREW LETTER LAMED
+05DD;N # HEBREW LETTER FINAL MEM
+05DE;N # HEBREW LETTER MEM
+05DF;N # HEBREW LETTER FINAL NUN
+05E0;N # HEBREW LETTER NUN
+05E1;N # HEBREW LETTER SAMEKH
+05E2;N # HEBREW LETTER AYIN
+05E3;N # HEBREW LETTER FINAL PE
+05E4;N # HEBREW LETTER PE
+05E5;N # HEBREW LETTER FINAL TSADI
+05E6;N # HEBREW LETTER TSADI
+05E7;N # HEBREW LETTER QOF
+05E8;N # HEBREW LETTER RESH
+05E9;N # HEBREW LETTER SHIN
+05EA;N # HEBREW LETTER TAV
+05F0;N # HEBREW LIGATURE YIDDISH DOUBLE VAV
+05F1;N # HEBREW LIGATURE YIDDISH VAV YOD
+05F2;N # HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3;N # HEBREW PUNCTUATION GERESH
+05F4;N # HEBREW PUNCTUATION GERSHAYIM
+0600;N # ARABIC NUMBER SIGN
+0601;N # ARABIC SIGN SANAH
+0602;N # ARABIC FOOTNOTE MARKER
+0603;N # ARABIC SIGN SAFHA
+0606;N # ARABIC-INDIC CUBE ROOT
+0607;N # ARABIC-INDIC FOURTH ROOT
+0608;N # ARABIC RAY
+0609;N # ARABIC-INDIC PER MILLE SIGN
+060A;N # ARABIC-INDIC PER TEN THOUSAND SIGN
+060B;N # AFGHANI SIGN
+060C;N # ARABIC COMMA
+060D;N # ARABIC DATE SEPARATOR
+060E;N # ARABIC POETIC VERSE SIGN
+060F;N # ARABIC SIGN MISRA
+0610;N # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611;N # ARABIC SIGN ALAYHE ASSALLAM
+0612;N # ARABIC SIGN RAHMATULLAH ALAYHE
+0613;N # ARABIC SIGN RADI ALLAHOU ANHU
+0614;N # ARABIC SIGN TAKHALLUS
+0615;N # ARABIC SMALL HIGH TAH
+0616;N # ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH
+0617;N # ARABIC SMALL HIGH ZAIN
+0618;N # ARABIC SMALL FATHA
+0619;N # ARABIC SMALL DAMMA
+061A;N # ARABIC SMALL KASRA
+061B;N # ARABIC SEMICOLON
+061E;N # ARABIC TRIPLE DOT PUNCTUATION MARK
+061F;N # ARABIC QUESTION MARK
+0621;N # ARABIC LETTER HAMZA
+0622;N # ARABIC LETTER ALEF WITH MADDA ABOVE
+0623;N # ARABIC LETTER ALEF WITH HAMZA ABOVE
+0624;N # ARABIC LETTER WAW WITH HAMZA ABOVE
+0625;N # ARABIC LETTER ALEF WITH HAMZA BELOW
+0626;N # ARABIC LETTER YEH WITH HAMZA ABOVE
+0627;N # ARABIC LETTER ALEF
+0628;N # ARABIC LETTER BEH
+0629;N # ARABIC LETTER TEH MARBUTA
+062A;N # ARABIC LETTER TEH
+062B;N # ARABIC LETTER THEH
+062C;N # ARABIC LETTER JEEM
+062D;N # ARABIC LETTER HAH
+062E;N # ARABIC LETTER KHAH
+062F;N # ARABIC LETTER DAL
+0630;N # ARABIC LETTER THAL
+0631;N # ARABIC LETTER REH
+0632;N # ARABIC LETTER ZAIN
+0633;N # ARABIC LETTER SEEN
+0634;N # ARABIC LETTER SHEEN
+0635;N # ARABIC LETTER SAD
+0636;N # ARABIC LETTER DAD
+0637;N # ARABIC LETTER TAH
+0638;N # ARABIC LETTER ZAH
+0639;N # ARABIC LETTER AIN
+063A;N # ARABIC LETTER GHAIN
+063B;N # ARABIC LETTER KEHEH WITH TWO DOTS ABOVE
+063C;N # ARABIC LETTER KEHEH WITH THREE DOTS BELOW
+063D;N # ARABIC LETTER FARSI YEH WITH INVERTED V
+063E;N # ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE
+063F;N # ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0640;N # ARABIC TATWEEL
+0641;N # ARABIC LETTER FEH
+0642;N # ARABIC LETTER QAF
+0643;N # ARABIC LETTER KAF
+0644;N # ARABIC LETTER LAM
+0645;N # ARABIC LETTER MEEM
+0646;N # ARABIC LETTER NOON
+0647;N # ARABIC LETTER HEH
+0648;N # ARABIC LETTER WAW
+0649;N # ARABIC LETTER ALEF MAKSURA
+064A;N # ARABIC LETTER YEH
+064B;N # ARABIC FATHATAN
+064C;N # ARABIC DAMMATAN
+064D;N # ARABIC KASRATAN
+064E;N # ARABIC FATHA
+064F;N # ARABIC DAMMA
+0650;N # ARABIC KASRA
+0651;N # ARABIC SHADDA
+0652;N # ARABIC SUKUN
+0653;N # ARABIC MADDAH ABOVE
+0654;N # ARABIC HAMZA ABOVE
+0655;N # ARABIC HAMZA BELOW
+0656;N # ARABIC SUBSCRIPT ALEF
+0657;N # ARABIC INVERTED DAMMA
+0658;N # ARABIC MARK NOON GHUNNA
+0659;N # ARABIC ZWARAKAY
+065A;N # ARABIC VOWEL SIGN SMALL V ABOVE
+065B;N # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
+065C;N # ARABIC VOWEL SIGN DOT BELOW
+065D;N # ARABIC REVERSED DAMMA
+065E;N # ARABIC FATHA WITH TWO DOTS
+0660;N # ARABIC-INDIC DIGIT ZERO
+0661;N # ARABIC-INDIC DIGIT ONE
+0662;N # ARABIC-INDIC DIGIT TWO
+0663;N # ARABIC-INDIC DIGIT THREE
+0664;N # ARABIC-INDIC DIGIT FOUR
+0665;N # ARABIC-INDIC DIGIT FIVE
+0666;N # ARABIC-INDIC DIGIT SIX
+0667;N # ARABIC-INDIC DIGIT SEVEN
+0668;N # ARABIC-INDIC DIGIT EIGHT
+0669;N # ARABIC-INDIC DIGIT NINE
+066A;N # ARABIC PERCENT SIGN
+066B;N # ARABIC DECIMAL SEPARATOR
+066C;N # ARABIC THOUSANDS SEPARATOR
+066D;N # ARABIC FIVE POINTED STAR
+066E;N # ARABIC LETTER DOTLESS BEH
+066F;N # ARABIC LETTER DOTLESS QAF
+0670;N # ARABIC LETTER SUPERSCRIPT ALEF
+0671;N # ARABIC LETTER ALEF WASLA
+0672;N # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0673;N # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0674;N # ARABIC LETTER HIGH HAMZA
+0675;N # ARABIC LETTER HIGH HAMZA ALEF
+0676;N # ARABIC LETTER HIGH HAMZA WAW
+0677;N # ARABIC LETTER U WITH HAMZA ABOVE
+0678;N # ARABIC LETTER HIGH HAMZA YEH
+0679;N # ARABIC LETTER TTEH
+067A;N # ARABIC LETTER TTEHEH
+067B;N # ARABIC LETTER BEEH
+067C;N # ARABIC LETTER TEH WITH RING
+067D;N # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067E;N # ARABIC LETTER PEH
+067F;N # ARABIC LETTER TEHEH
+0680;N # ARABIC LETTER BEHEH
+0681;N # ARABIC LETTER HAH WITH HAMZA ABOVE
+0682;N # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0683;N # ARABIC LETTER NYEH
+0684;N # ARABIC LETTER DYEH
+0685;N # ARABIC LETTER HAH WITH THREE DOTS ABOVE
+0686;N # ARABIC LETTER TCHEH
+0687;N # ARABIC LETTER TCHEHEH
+0688;N # ARABIC LETTER DDAL
+0689;N # ARABIC LETTER DAL WITH RING
+068A;N # ARABIC LETTER DAL WITH DOT BELOW
+068B;N # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068C;N # ARABIC LETTER DAHAL
+068D;N # ARABIC LETTER DDAHAL
+068E;N # ARABIC LETTER DUL
+068F;N # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690;N # ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+0691;N # ARABIC LETTER RREH
+0692;N # ARABIC LETTER REH WITH SMALL V
+0693;N # ARABIC LETTER REH WITH RING
+0694;N # ARABIC LETTER REH WITH DOT BELOW
+0695;N # ARABIC LETTER REH WITH SMALL V BELOW
+0696;N # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697;N # ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698;N # ARABIC LETTER JEH
+0699;N # ARABIC LETTER REH WITH FOUR DOTS ABOVE
+069A;N # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069B;N # ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C;N # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+069D;N # ARABIC LETTER SAD WITH TWO DOTS BELOW
+069E;N # ARABIC LETTER SAD WITH THREE DOTS ABOVE
+069F;N # ARABIC LETTER TAH WITH THREE DOTS ABOVE
+06A0;N # ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06A1;N # ARABIC LETTER DOTLESS FEH
+06A2;N # ARABIC LETTER FEH WITH DOT MOVED BELOW
+06A3;N # ARABIC LETTER FEH WITH DOT BELOW
+06A4;N # ARABIC LETTER VEH
+06A5;N # ARABIC LETTER FEH WITH THREE DOTS BELOW
+06A6;N # ARABIC LETTER PEHEH
+06A7;N # ARABIC LETTER QAF WITH DOT ABOVE
+06A8;N # ARABIC LETTER QAF WITH THREE DOTS ABOVE
+06A9;N # ARABIC LETTER KEHEH
+06AA;N # ARABIC LETTER SWASH KAF
+06AB;N # ARABIC LETTER KAF WITH RING
+06AC;N # ARABIC LETTER KAF WITH DOT ABOVE
+06AD;N # ARABIC LETTER NG
+06AE;N # ARABIC LETTER KAF WITH THREE DOTS BELOW
+06AF;N # ARABIC LETTER GAF
+06B0;N # ARABIC LETTER GAF WITH RING
+06B1;N # ARABIC LETTER NGOEH
+06B2;N # ARABIC LETTER GAF WITH TWO DOTS BELOW
+06B3;N # ARABIC LETTER GUEH
+06B4;N # ARABIC LETTER GAF WITH THREE DOTS ABOVE
+06B5;N # ARABIC LETTER LAM WITH SMALL V
+06B6;N # ARABIC LETTER LAM WITH DOT ABOVE
+06B7;N # ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06B8;N # ARABIC LETTER LAM WITH THREE DOTS BELOW
+06B9;N # ARABIC LETTER NOON WITH DOT BELOW
+06BA;N # ARABIC LETTER NOON GHUNNA
+06BB;N # ARABIC LETTER RNOON
+06BC;N # ARABIC LETTER NOON WITH RING
+06BD;N # ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06BE;N # ARABIC LETTER HEH DOACHASHMEE
+06BF;N # ARABIC LETTER TCHEH WITH DOT ABOVE
+06C0;N # ARABIC LETTER HEH WITH YEH ABOVE
+06C1;N # ARABIC LETTER HEH GOAL
+06C2;N # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+06C3;N # ARABIC LETTER TEH MARBUTA GOAL
+06C4;N # ARABIC LETTER WAW WITH RING
+06C5;N # ARABIC LETTER KIRGHIZ OE
+06C6;N # ARABIC LETTER OE
+06C7;N # ARABIC LETTER U
+06C8;N # ARABIC LETTER YU
+06C9;N # ARABIC LETTER KIRGHIZ YU
+06CA;N # ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06CB;N # ARABIC LETTER VE
+06CC;N # ARABIC LETTER FARSI YEH
+06CD;N # ARABIC LETTER YEH WITH TAIL
+06CE;N # ARABIC LETTER YEH WITH SMALL V
+06CF;N # ARABIC LETTER WAW WITH DOT ABOVE
+06D0;N # ARABIC LETTER E
+06D1;N # ARABIC LETTER YEH WITH THREE DOTS BELOW
+06D2;N # ARABIC LETTER YEH BARREE
+06D3;N # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4;N # ARABIC FULL STOP
+06D5;N # ARABIC LETTER AE
+06D6;N # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7;N # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8;N # ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9;N # ARABIC SMALL HIGH LAM ALEF
+06DA;N # ARABIC SMALL HIGH JEEM
+06DB;N # ARABIC SMALL HIGH THREE DOTS
+06DC;N # ARABIC SMALL HIGH SEEN
+06DD;N # ARABIC END OF AYAH
+06DE;N # ARABIC START OF RUB EL HIZB
+06DF;N # ARABIC SMALL HIGH ROUNDED ZERO
+06E0;N # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1;N # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2;N # ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3;N # ARABIC SMALL LOW SEEN
+06E4;N # ARABIC SMALL HIGH MADDA
+06E5;N # ARABIC SMALL WAW
+06E6;N # ARABIC SMALL YEH
+06E7;N # ARABIC SMALL HIGH YEH
+06E8;N # ARABIC SMALL HIGH NOON
+06E9;N # ARABIC PLACE OF SAJDAH
+06EA;N # ARABIC EMPTY CENTRE LOW STOP
+06EB;N # ARABIC EMPTY CENTRE HIGH STOP
+06EC;N # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED;N # ARABIC SMALL LOW MEEM
+06EE;N # ARABIC LETTER DAL WITH INVERTED V
+06EF;N # ARABIC LETTER REH WITH INVERTED V
+06F0;N # EXTENDED ARABIC-INDIC DIGIT ZERO
+06F1;N # EXTENDED ARABIC-INDIC DIGIT ONE
+06F2;N # EXTENDED ARABIC-INDIC DIGIT TWO
+06F3;N # EXTENDED ARABIC-INDIC DIGIT THREE
+06F4;N # EXTENDED ARABIC-INDIC DIGIT FOUR
+06F5;N # EXTENDED ARABIC-INDIC DIGIT FIVE
+06F6;N # EXTENDED ARABIC-INDIC DIGIT SIX
+06F7;N # EXTENDED ARABIC-INDIC DIGIT SEVEN
+06F8;N # EXTENDED ARABIC-INDIC DIGIT EIGHT
+06F9;N # EXTENDED ARABIC-INDIC DIGIT NINE
+06FA;N # ARABIC LETTER SHEEN WITH DOT BELOW
+06FB;N # ARABIC LETTER DAD WITH DOT BELOW
+06FC;N # ARABIC LETTER GHAIN WITH DOT BELOW
+06FD;N # ARABIC SIGN SINDHI AMPERSAND
+06FE;N # ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF;N # ARABIC LETTER HEH WITH INVERTED V
+0700;N # SYRIAC END OF PARAGRAPH
+0701;N # SYRIAC SUPRALINEAR FULL STOP
+0702;N # SYRIAC SUBLINEAR FULL STOP
+0703;N # SYRIAC SUPRALINEAR COLON
+0704;N # SYRIAC SUBLINEAR COLON
+0705;N # SYRIAC HORIZONTAL COLON
+0706;N # SYRIAC COLON SKEWED LEFT
+0707;N # SYRIAC COLON SKEWED RIGHT
+0708;N # SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709;N # SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070A;N # SYRIAC CONTRACTION
+070B;N # SYRIAC HARKLEAN OBELUS
+070C;N # SYRIAC HARKLEAN METOBELUS
+070D;N # SYRIAC HARKLEAN ASTERISCUS
+070F;N # SYRIAC ABBREVIATION MARK
+0710;N # SYRIAC LETTER ALAPH
+0711;N # SYRIAC LETTER SUPERSCRIPT ALAPH
+0712;N # SYRIAC LETTER BETH
+0713;N # SYRIAC LETTER GAMAL
+0714;N # SYRIAC LETTER GAMAL GARSHUNI
+0715;N # SYRIAC LETTER DALATH
+0716;N # SYRIAC LETTER DOTLESS DALATH RISH
+0717;N # SYRIAC LETTER HE
+0718;N # SYRIAC LETTER WAW
+0719;N # SYRIAC LETTER ZAIN
+071A;N # SYRIAC LETTER HETH
+071B;N # SYRIAC LETTER TETH
+071C;N # SYRIAC LETTER TETH GARSHUNI
+071D;N # SYRIAC LETTER YUDH
+071E;N # SYRIAC LETTER YUDH HE
+071F;N # SYRIAC LETTER KAPH
+0720;N # SYRIAC LETTER LAMADH
+0721;N # SYRIAC LETTER MIM
+0722;N # SYRIAC LETTER NUN
+0723;N # SYRIAC LETTER SEMKATH
+0724;N # SYRIAC LETTER FINAL SEMKATH
+0725;N # SYRIAC LETTER E
+0726;N # SYRIAC LETTER PE
+0727;N # SYRIAC LETTER REVERSED PE
+0728;N # SYRIAC LETTER SADHE
+0729;N # SYRIAC LETTER QAPH
+072A;N # SYRIAC LETTER RISH
+072B;N # SYRIAC LETTER SHIN
+072C;N # SYRIAC LETTER TAW
+072D;N # SYRIAC LETTER PERSIAN BHETH
+072E;N # SYRIAC LETTER PERSIAN GHAMAL
+072F;N # SYRIAC LETTER PERSIAN DHALATH
+0730;N # SYRIAC PTHAHA ABOVE
+0731;N # SYRIAC PTHAHA BELOW
+0732;N # SYRIAC PTHAHA DOTTED
+0733;N # SYRIAC ZQAPHA ABOVE
+0734;N # SYRIAC ZQAPHA BELOW
+0735;N # SYRIAC ZQAPHA DOTTED
+0736;N # SYRIAC RBASA ABOVE
+0737;N # SYRIAC RBASA BELOW
+0738;N # SYRIAC DOTTED ZLAMA HORIZONTAL
+0739;N # SYRIAC DOTTED ZLAMA ANGULAR
+073A;N # SYRIAC HBASA ABOVE
+073B;N # SYRIAC HBASA BELOW
+073C;N # SYRIAC HBASA-ESASA DOTTED
+073D;N # SYRIAC ESASA ABOVE
+073E;N # SYRIAC ESASA BELOW
+073F;N # SYRIAC RWAHA
+0740;N # SYRIAC FEMININE DOT
+0741;N # SYRIAC QUSHSHAYA
+0742;N # SYRIAC RUKKAKHA
+0743;N # SYRIAC TWO VERTICAL DOTS ABOVE
+0744;N # SYRIAC TWO VERTICAL DOTS BELOW
+0745;N # SYRIAC THREE DOTS ABOVE
+0746;N # SYRIAC THREE DOTS BELOW
+0747;N # SYRIAC OBLIQUE LINE ABOVE
+0748;N # SYRIAC OBLIQUE LINE BELOW
+0749;N # SYRIAC MUSIC
+074A;N # SYRIAC BARREKH
+074D;N # SYRIAC LETTER SOGDIAN ZHAIN
+074E;N # SYRIAC LETTER SOGDIAN KHAPH
+074F;N # SYRIAC LETTER SOGDIAN FE
+0750;N # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW
+0751;N # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE
+0752;N # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW
+0753;N # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE
+0754;N # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE
+0755;N # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW
+0756;N # ARABIC LETTER BEH WITH SMALL V
+0757;N # ARABIC LETTER HAH WITH TWO DOTS ABOVE
+0758;N # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW
+0759;N # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH
+075A;N # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW
+075B;N # ARABIC LETTER REH WITH STROKE
+075C;N # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE
+075D;N # ARABIC LETTER AIN WITH TWO DOTS ABOVE
+075E;N # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE
+075F;N # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE
+0760;N # ARABIC LETTER FEH WITH TWO DOTS BELOW
+0761;N # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW
+0762;N # ARABIC LETTER KEHEH WITH DOT ABOVE
+0763;N # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE
+0764;N # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW
+0765;N # ARABIC LETTER MEEM WITH DOT ABOVE
+0766;N # ARABIC LETTER MEEM WITH DOT BELOW
+0767;N # ARABIC LETTER NOON WITH TWO DOTS BELOW
+0768;N # ARABIC LETTER NOON WITH SMALL TAH
+0769;N # ARABIC LETTER NOON WITH SMALL V
+076A;N # ARABIC LETTER LAM WITH BAR
+076B;N # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE
+076C;N # ARABIC LETTER REH WITH HAMZA ABOVE
+076D;N # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+076E;N # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW
+076F;N # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0770;N # ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0771;N # ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0772;N # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE
+0773;N # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0774;N # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0775;N # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0776;N # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0777;N # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+0778;N # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0779;N # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+077A;N # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+077B;N # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+077C;N # ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+077D;N # ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE
+077E;N # ARABIC LETTER SEEN WITH INVERTED V
+077F;N # ARABIC LETTER KAF WITH TWO DOTS ABOVE
+0780;N # THAANA LETTER HAA
+0781;N # THAANA LETTER SHAVIYANI
+0782;N # THAANA LETTER NOONU
+0783;N # THAANA LETTER RAA
+0784;N # THAANA LETTER BAA
+0785;N # THAANA LETTER LHAVIYANI
+0786;N # THAANA LETTER KAAFU
+0787;N # THAANA LETTER ALIFU
+0788;N # THAANA LETTER VAAVU
+0789;N # THAANA LETTER MEEMU
+078A;N # THAANA LETTER FAAFU
+078B;N # THAANA LETTER DHAALU
+078C;N # THAANA LETTER THAA
+078D;N # THAANA LETTER LAAMU
+078E;N # THAANA LETTER GAAFU
+078F;N # THAANA LETTER GNAVIYANI
+0790;N # THAANA LETTER SEENU
+0791;N # THAANA LETTER DAVIYANI
+0792;N # THAANA LETTER ZAVIYANI
+0793;N # THAANA LETTER TAVIYANI
+0794;N # THAANA LETTER YAA
+0795;N # THAANA LETTER PAVIYANI
+0796;N # THAANA LETTER JAVIYANI
+0797;N # THAANA LETTER CHAVIYANI
+0798;N # THAANA LETTER TTAA
+0799;N # THAANA LETTER HHAA
+079A;N # THAANA LETTER KHAA
+079B;N # THAANA LETTER THAALU
+079C;N # THAANA LETTER ZAA
+079D;N # THAANA LETTER SHEENU
+079E;N # THAANA LETTER SAADHU
+079F;N # THAANA LETTER DAADHU
+07A0;N # THAANA LETTER TO
+07A1;N # THAANA LETTER ZO
+07A2;N # THAANA LETTER AINU
+07A3;N # THAANA LETTER GHAINU
+07A4;N # THAANA LETTER QAAFU
+07A5;N # THAANA LETTER WAAVU
+07A6;N # THAANA ABAFILI
+07A7;N # THAANA AABAAFILI
+07A8;N # THAANA IBIFILI
+07A9;N # THAANA EEBEEFILI
+07AA;N # THAANA UBUFILI
+07AB;N # THAANA OOBOOFILI
+07AC;N # THAANA EBEFILI
+07AD;N # THAANA EYBEYFILI
+07AE;N # THAANA OBOFILI
+07AF;N # THAANA OABOAFILI
+07B0;N # THAANA SUKUN
+07B1;N # THAANA LETTER NAA
+07C0;N # NKO DIGIT ZERO
+07C1;N # NKO DIGIT ONE
+07C2;N # NKO DIGIT TWO
+07C3;N # NKO DIGIT THREE
+07C4;N # NKO DIGIT FOUR
+07C5;N # NKO DIGIT FIVE
+07C6;N # NKO DIGIT SIX
+07C7;N # NKO DIGIT SEVEN
+07C8;N # NKO DIGIT EIGHT
+07C9;N # NKO DIGIT NINE
+07CA;N # NKO LETTER A
+07CB;N # NKO LETTER EE
+07CC;N # NKO LETTER I
+07CD;N # NKO LETTER E
+07CE;N # NKO LETTER U
+07CF;N # NKO LETTER OO
+07D0;N # NKO LETTER O
+07D1;N # NKO LETTER DAGBASINNA
+07D2;N # NKO LETTER N
+07D3;N # NKO LETTER BA
+07D4;N # NKO LETTER PA
+07D5;N # NKO LETTER TA
+07D6;N # NKO LETTER JA
+07D7;N # NKO LETTER CHA
+07D8;N # NKO LETTER DA
+07D9;N # NKO LETTER RA
+07DA;N # NKO LETTER RRA
+07DB;N # NKO LETTER SA
+07DC;N # NKO LETTER GBA
+07DD;N # NKO LETTER FA
+07DE;N # NKO LETTER KA
+07DF;N # NKO LETTER LA
+07E0;N # NKO LETTER NA WOLOSO
+07E1;N # NKO LETTER MA
+07E2;N # NKO LETTER NYA
+07E3;N # NKO LETTER NA
+07E4;N # NKO LETTER HA
+07E5;N # NKO LETTER WA
+07E6;N # NKO LETTER YA
+07E7;N # NKO LETTER NYA WOLOSO
+07E8;N # NKO LETTER JONA JA
+07E9;N # NKO LETTER JONA CHA
+07EA;N # NKO LETTER JONA RA
+07EB;N # NKO COMBINING SHORT HIGH TONE
+07EC;N # NKO COMBINING SHORT LOW TONE
+07ED;N # NKO COMBINING SHORT RISING TONE
+07EE;N # NKO COMBINING LONG DESCENDING TONE
+07EF;N # NKO COMBINING LONG HIGH TONE
+07F0;N # NKO COMBINING LONG LOW TONE
+07F1;N # NKO COMBINING LONG RISING TONE
+07F2;N # NKO COMBINING NASALIZATION MARK
+07F3;N # NKO COMBINING DOUBLE DOT ABOVE
+07F4;N # NKO HIGH TONE APOSTROPHE
+07F5;N # NKO LOW TONE APOSTROPHE
+07F6;N # NKO SYMBOL OO DENNEN
+07F7;N # NKO SYMBOL GBAKURUNEN
+07F8;N # NKO COMMA
+07F9;N # NKO EXCLAMATION MARK
+07FA;N # NKO LAJANYALAN
+0901;N # DEVANAGARI SIGN CANDRABINDU
+0902;N # DEVANAGARI SIGN ANUSVARA
+0903;N # DEVANAGARI SIGN VISARGA
+0904;N # DEVANAGARI LETTER SHORT A
+0905;N # DEVANAGARI LETTER A
+0906;N # DEVANAGARI LETTER AA
+0907;N # DEVANAGARI LETTER I
+0908;N # DEVANAGARI LETTER II
+0909;N # DEVANAGARI LETTER U
+090A;N # DEVANAGARI LETTER UU
+090B;N # DEVANAGARI LETTER VOCALIC R
+090C;N # DEVANAGARI LETTER VOCALIC L
+090D;N # DEVANAGARI LETTER CANDRA E
+090E;N # DEVANAGARI LETTER SHORT E
+090F;N # DEVANAGARI LETTER E
+0910;N # DEVANAGARI LETTER AI
+0911;N # DEVANAGARI LETTER CANDRA O
+0912;N # DEVANAGARI LETTER SHORT O
+0913;N # DEVANAGARI LETTER O
+0914;N # DEVANAGARI LETTER AU
+0915;N # DEVANAGARI LETTER KA
+0916;N # DEVANAGARI LETTER KHA
+0917;N # DEVANAGARI LETTER GA
+0918;N # DEVANAGARI LETTER GHA
+0919;N # DEVANAGARI LETTER NGA
+091A;N # DEVANAGARI LETTER CA
+091B;N # DEVANAGARI LETTER CHA
+091C;N # DEVANAGARI LETTER JA
+091D;N # DEVANAGARI LETTER JHA
+091E;N # DEVANAGARI LETTER NYA
+091F;N # DEVANAGARI LETTER TTA
+0920;N # DEVANAGARI LETTER TTHA
+0921;N # DEVANAGARI LETTER DDA
+0922;N # DEVANAGARI LETTER DDHA
+0923;N # DEVANAGARI LETTER NNA
+0924;N # DEVANAGARI LETTER TA
+0925;N # DEVANAGARI LETTER THA
+0926;N # DEVANAGARI LETTER DA
+0927;N # DEVANAGARI LETTER DHA
+0928;N # DEVANAGARI LETTER NA
+0929;N # DEVANAGARI LETTER NNNA
+092A;N # DEVANAGARI LETTER PA
+092B;N # DEVANAGARI LETTER PHA
+092C;N # DEVANAGARI LETTER BA
+092D;N # DEVANAGARI LETTER BHA
+092E;N # DEVANAGARI LETTER MA
+092F;N # DEVANAGARI LETTER YA
+0930;N # DEVANAGARI LETTER RA
+0931;N # DEVANAGARI LETTER RRA
+0932;N # DEVANAGARI LETTER LA
+0933;N # DEVANAGARI LETTER LLA
+0934;N # DEVANAGARI LETTER LLLA
+0935;N # DEVANAGARI LETTER VA
+0936;N # DEVANAGARI LETTER SHA
+0937;N # DEVANAGARI LETTER SSA
+0938;N # DEVANAGARI LETTER SA
+0939;N # DEVANAGARI LETTER HA
+093C;N # DEVANAGARI SIGN NUKTA
+093D;N # DEVANAGARI SIGN AVAGRAHA
+093E;N # DEVANAGARI VOWEL SIGN AA
+093F;N # DEVANAGARI VOWEL SIGN I
+0940;N # DEVANAGARI VOWEL SIGN II
+0941;N # DEVANAGARI VOWEL SIGN U
+0942;N # DEVANAGARI VOWEL SIGN UU
+0943;N # DEVANAGARI VOWEL SIGN VOCALIC R
+0944;N # DEVANAGARI VOWEL SIGN VOCALIC RR
+0945;N # DEVANAGARI VOWEL SIGN CANDRA E
+0946;N # DEVANAGARI VOWEL SIGN SHORT E
+0947;N # DEVANAGARI VOWEL SIGN E
+0948;N # DEVANAGARI VOWEL SIGN AI
+0949;N # DEVANAGARI VOWEL SIGN CANDRA O
+094A;N # DEVANAGARI VOWEL SIGN SHORT O
+094B;N # DEVANAGARI VOWEL SIGN O
+094C;N # DEVANAGARI VOWEL SIGN AU
+094D;N # DEVANAGARI SIGN VIRAMA
+0950;N # DEVANAGARI OM
+0951;N # DEVANAGARI STRESS SIGN UDATTA
+0952;N # DEVANAGARI STRESS SIGN ANUDATTA
+0953;N # DEVANAGARI GRAVE ACCENT
+0954;N # DEVANAGARI ACUTE ACCENT
+0958;N # DEVANAGARI LETTER QA
+0959;N # DEVANAGARI LETTER KHHA
+095A;N # DEVANAGARI LETTER GHHA
+095B;N # DEVANAGARI LETTER ZA
+095C;N # DEVANAGARI LETTER DDDHA
+095D;N # DEVANAGARI LETTER RHA
+095E;N # DEVANAGARI LETTER FA
+095F;N # DEVANAGARI LETTER YYA
+0960;N # DEVANAGARI LETTER VOCALIC RR
+0961;N # DEVANAGARI LETTER VOCALIC LL
+0962;N # DEVANAGARI VOWEL SIGN VOCALIC L
+0963;N # DEVANAGARI VOWEL SIGN VOCALIC LL
+0964;N # DEVANAGARI DANDA
+0965;N # DEVANAGARI DOUBLE DANDA
+0966;N # DEVANAGARI DIGIT ZERO
+0967;N # DEVANAGARI DIGIT ONE
+0968;N # DEVANAGARI DIGIT TWO
+0969;N # DEVANAGARI DIGIT THREE
+096A;N # DEVANAGARI DIGIT FOUR
+096B;N # DEVANAGARI DIGIT FIVE
+096C;N # DEVANAGARI DIGIT SIX
+096D;N # DEVANAGARI DIGIT SEVEN
+096E;N # DEVANAGARI DIGIT EIGHT
+096F;N # DEVANAGARI DIGIT NINE
+0970;N # DEVANAGARI ABBREVIATION SIGN
+0971;N # DEVANAGARI SIGN HIGH SPACING DOT
+0972;N # DEVANAGARI LETTER CANDRA A
+097B;N # DEVANAGARI LETTER GGA
+097C;N # DEVANAGARI LETTER JJA
+097D;N # DEVANAGARI LETTER GLOTTAL STOP
+097E;N # DEVANAGARI LETTER DDDA
+097F;N # DEVANAGARI LETTER BBA
+0981;N # BENGALI SIGN CANDRABINDU
+0982;N # BENGALI SIGN ANUSVARA
+0983;N # BENGALI SIGN VISARGA
+0985;N # BENGALI LETTER A
+0986;N # BENGALI LETTER AA
+0987;N # BENGALI LETTER I
+0988;N # BENGALI LETTER II
+0989;N # BENGALI LETTER U
+098A;N # BENGALI LETTER UU
+098B;N # BENGALI LETTER VOCALIC R
+098C;N # BENGALI LETTER VOCALIC L
+098F;N # BENGALI LETTER E
+0990;N # BENGALI LETTER AI
+0993;N # BENGALI LETTER O
+0994;N # BENGALI LETTER AU
+0995;N # BENGALI LETTER KA
+0996;N # BENGALI LETTER KHA
+0997;N # BENGALI LETTER GA
+0998;N # BENGALI LETTER GHA
+0999;N # BENGALI LETTER NGA
+099A;N # BENGALI LETTER CA
+099B;N # BENGALI LETTER CHA
+099C;N # BENGALI LETTER JA
+099D;N # BENGALI LETTER JHA
+099E;N # BENGALI LETTER NYA
+099F;N # BENGALI LETTER TTA
+09A0;N # BENGALI LETTER TTHA
+09A1;N # BENGALI LETTER DDA
+09A2;N # BENGALI LETTER DDHA
+09A3;N # BENGALI LETTER NNA
+09A4;N # BENGALI LETTER TA
+09A5;N # BENGALI LETTER THA
+09A6;N # BENGALI LETTER DA
+09A7;N # BENGALI LETTER DHA
+09A8;N # BENGALI LETTER NA
+09AA;N # BENGALI LETTER PA
+09AB;N # BENGALI LETTER PHA
+09AC;N # BENGALI LETTER BA
+09AD;N # BENGALI LETTER BHA
+09AE;N # BENGALI LETTER MA
+09AF;N # BENGALI LETTER YA
+09B0;N # BENGALI LETTER RA
+09B2;N # BENGALI LETTER LA
+09B6;N # BENGALI LETTER SHA
+09B7;N # BENGALI LETTER SSA
+09B8;N # BENGALI LETTER SA
+09B9;N # BENGALI LETTER HA
+09BC;N # BENGALI SIGN NUKTA
+09BD;N # BENGALI SIGN AVAGRAHA
+09BE;N # BENGALI VOWEL SIGN AA
+09BF;N # BENGALI VOWEL SIGN I
+09C0;N # BENGALI VOWEL SIGN II
+09C1;N # BENGALI VOWEL SIGN U
+09C2;N # BENGALI VOWEL SIGN UU
+09C3;N # BENGALI VOWEL SIGN VOCALIC R
+09C4;N # BENGALI VOWEL SIGN VOCALIC RR
+09C7;N # BENGALI VOWEL SIGN E
+09C8;N # BENGALI VOWEL SIGN AI
+09CB;N # BENGALI VOWEL SIGN O
+09CC;N # BENGALI VOWEL SIGN AU
+09CD;N # BENGALI SIGN VIRAMA
+09CE;N # BENGALI LETTER KHANDA TA
+09D7;N # BENGALI AU LENGTH MARK
+09DC;N # BENGALI LETTER RRA
+09DD;N # BENGALI LETTER RHA
+09DF;N # BENGALI LETTER YYA
+09E0;N # BENGALI LETTER VOCALIC RR
+09E1;N # BENGALI LETTER VOCALIC LL
+09E2;N # BENGALI VOWEL SIGN VOCALIC L
+09E3;N # BENGALI VOWEL SIGN VOCALIC LL
+09E6;N # BENGALI DIGIT ZERO
+09E7;N # BENGALI DIGIT ONE
+09E8;N # BENGALI DIGIT TWO
+09E9;N # BENGALI DIGIT THREE
+09EA;N # BENGALI DIGIT FOUR
+09EB;N # BENGALI DIGIT FIVE
+09EC;N # BENGALI DIGIT SIX
+09ED;N # BENGALI DIGIT SEVEN
+09EE;N # BENGALI DIGIT EIGHT
+09EF;N # BENGALI DIGIT NINE
+09F0;N # BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09F1;N # BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2;N # BENGALI RUPEE MARK
+09F3;N # BENGALI RUPEE SIGN
+09F4;N # BENGALI CURRENCY NUMERATOR ONE
+09F5;N # BENGALI CURRENCY NUMERATOR TWO
+09F6;N # BENGALI CURRENCY NUMERATOR THREE
+09F7;N # BENGALI CURRENCY NUMERATOR FOUR
+09F8;N # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9;N # BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA;N # BENGALI ISSHAR
+0A01;N # GURMUKHI SIGN ADAK BINDI
+0A02;N # GURMUKHI SIGN BINDI
+0A03;N # GURMUKHI SIGN VISARGA
+0A05;N # GURMUKHI LETTER A
+0A06;N # GURMUKHI LETTER AA
+0A07;N # GURMUKHI LETTER I
+0A08;N # GURMUKHI LETTER II
+0A09;N # GURMUKHI LETTER U
+0A0A;N # GURMUKHI LETTER UU
+0A0F;N # GURMUKHI LETTER EE
+0A10;N # GURMUKHI LETTER AI
+0A13;N # GURMUKHI LETTER OO
+0A14;N # GURMUKHI LETTER AU
+0A15;N # GURMUKHI LETTER KA
+0A16;N # GURMUKHI LETTER KHA
+0A17;N # GURMUKHI LETTER GA
+0A18;N # GURMUKHI LETTER GHA
+0A19;N # GURMUKHI LETTER NGA
+0A1A;N # GURMUKHI LETTER CA
+0A1B;N # GURMUKHI LETTER CHA
+0A1C;N # GURMUKHI LETTER JA
+0A1D;N # GURMUKHI LETTER JHA
+0A1E;N # GURMUKHI LETTER NYA
+0A1F;N # GURMUKHI LETTER TTA
+0A20;N # GURMUKHI LETTER TTHA
+0A21;N # GURMUKHI LETTER DDA
+0A22;N # GURMUKHI LETTER DDHA
+0A23;N # GURMUKHI LETTER NNA
+0A24;N # GURMUKHI LETTER TA
+0A25;N # GURMUKHI LETTER THA
+0A26;N # GURMUKHI LETTER DA
+0A27;N # GURMUKHI LETTER DHA
+0A28;N # GURMUKHI LETTER NA
+0A2A;N # GURMUKHI LETTER PA
+0A2B;N # GURMUKHI LETTER PHA
+0A2C;N # GURMUKHI LETTER BA
+0A2D;N # GURMUKHI LETTER BHA
+0A2E;N # GURMUKHI LETTER MA
+0A2F;N # GURMUKHI LETTER YA
+0A30;N # GURMUKHI LETTER RA
+0A32;N # GURMUKHI LETTER LA
+0A33;N # GURMUKHI LETTER LLA
+0A35;N # GURMUKHI LETTER VA
+0A36;N # GURMUKHI LETTER SHA
+0A38;N # GURMUKHI LETTER SA
+0A39;N # GURMUKHI LETTER HA
+0A3C;N # GURMUKHI SIGN NUKTA
+0A3E;N # GURMUKHI VOWEL SIGN AA
+0A3F;N # GURMUKHI VOWEL SIGN I
+0A40;N # GURMUKHI VOWEL SIGN II
+0A41;N # GURMUKHI VOWEL SIGN U
+0A42;N # GURMUKHI VOWEL SIGN UU
+0A47;N # GURMUKHI VOWEL SIGN EE
+0A48;N # GURMUKHI VOWEL SIGN AI
+0A4B;N # GURMUKHI VOWEL SIGN OO
+0A4C;N # GURMUKHI VOWEL SIGN AU
+0A4D;N # GURMUKHI SIGN VIRAMA
+0A51;N # GURMUKHI SIGN UDAAT
+0A59;N # GURMUKHI LETTER KHHA
+0A5A;N # GURMUKHI LETTER GHHA
+0A5B;N # GURMUKHI LETTER ZA
+0A5C;N # GURMUKHI LETTER RRA
+0A5E;N # GURMUKHI LETTER FA
+0A66;N # GURMUKHI DIGIT ZERO
+0A67;N # GURMUKHI DIGIT ONE
+0A68;N # GURMUKHI DIGIT TWO
+0A69;N # GURMUKHI DIGIT THREE
+0A6A;N # GURMUKHI DIGIT FOUR
+0A6B;N # GURMUKHI DIGIT FIVE
+0A6C;N # GURMUKHI DIGIT SIX
+0A6D;N # GURMUKHI DIGIT SEVEN
+0A6E;N # GURMUKHI DIGIT EIGHT
+0A6F;N # GURMUKHI DIGIT NINE
+0A70;N # GURMUKHI TIPPI
+0A71;N # GURMUKHI ADDAK
+0A72;N # GURMUKHI IRI
+0A73;N # GURMUKHI URA
+0A74;N # GURMUKHI EK ONKAR
+0A75;N # GURMUKHI SIGN YAKASH
+0A81;N # GUJARATI SIGN CANDRABINDU
+0A82;N # GUJARATI SIGN ANUSVARA
+0A83;N # GUJARATI SIGN VISARGA
+0A85;N # GUJARATI LETTER A
+0A86;N # GUJARATI LETTER AA
+0A87;N # GUJARATI LETTER I
+0A88;N # GUJARATI LETTER II
+0A89;N # GUJARATI LETTER U
+0A8A;N # GUJARATI LETTER UU
+0A8B;N # GUJARATI LETTER VOCALIC R
+0A8C;N # GUJARATI LETTER VOCALIC L
+0A8D;N # GUJARATI VOWEL CANDRA E
+0A8F;N # GUJARATI LETTER E
+0A90;N # GUJARATI LETTER AI
+0A91;N # GUJARATI VOWEL CANDRA O
+0A93;N # GUJARATI LETTER O
+0A94;N # GUJARATI LETTER AU
+0A95;N # GUJARATI LETTER KA
+0A96;N # GUJARATI LETTER KHA
+0A97;N # GUJARATI LETTER GA
+0A98;N # GUJARATI LETTER GHA
+0A99;N # GUJARATI LETTER NGA
+0A9A;N # GUJARATI LETTER CA
+0A9B;N # GUJARATI LETTER CHA
+0A9C;N # GUJARATI LETTER JA
+0A9D;N # GUJARATI LETTER JHA
+0A9E;N # GUJARATI LETTER NYA
+0A9F;N # GUJARATI LETTER TTA
+0AA0;N # GUJARATI LETTER TTHA
+0AA1;N # GUJARATI LETTER DDA
+0AA2;N # GUJARATI LETTER DDHA
+0AA3;N # GUJARATI LETTER NNA
+0AA4;N # GUJARATI LETTER TA
+0AA5;N # GUJARATI LETTER THA
+0AA6;N # GUJARATI LETTER DA
+0AA7;N # GUJARATI LETTER DHA
+0AA8;N # GUJARATI LETTER NA
+0AAA;N # GUJARATI LETTER PA
+0AAB;N # GUJARATI LETTER PHA
+0AAC;N # GUJARATI LETTER BA
+0AAD;N # GUJARATI LETTER BHA
+0AAE;N # GUJARATI LETTER MA
+0AAF;N # GUJARATI LETTER YA
+0AB0;N # GUJARATI LETTER RA
+0AB2;N # GUJARATI LETTER LA
+0AB3;N # GUJARATI LETTER LLA
+0AB5;N # GUJARATI LETTER VA
+0AB6;N # GUJARATI LETTER SHA
+0AB7;N # GUJARATI LETTER SSA
+0AB8;N # GUJARATI LETTER SA
+0AB9;N # GUJARATI LETTER HA
+0ABC;N # GUJARATI SIGN NUKTA
+0ABD;N # GUJARATI SIGN AVAGRAHA
+0ABE;N # GUJARATI VOWEL SIGN AA
+0ABF;N # GUJARATI VOWEL SIGN I
+0AC0;N # GUJARATI VOWEL SIGN II
+0AC1;N # GUJARATI VOWEL SIGN U
+0AC2;N # GUJARATI VOWEL SIGN UU
+0AC3;N # GUJARATI VOWEL SIGN VOCALIC R
+0AC4;N # GUJARATI VOWEL SIGN VOCALIC RR
+0AC5;N # GUJARATI VOWEL SIGN CANDRA E
+0AC7;N # GUJARATI VOWEL SIGN E
+0AC8;N # GUJARATI VOWEL SIGN AI
+0AC9;N # GUJARATI VOWEL SIGN CANDRA O
+0ACB;N # GUJARATI VOWEL SIGN O
+0ACC;N # GUJARATI VOWEL SIGN AU
+0ACD;N # GUJARATI SIGN VIRAMA
+0AD0;N # GUJARATI OM
+0AE0;N # GUJARATI LETTER VOCALIC RR
+0AE1;N # GUJARATI LETTER VOCALIC LL
+0AE2;N # GUJARATI VOWEL SIGN VOCALIC L
+0AE3;N # GUJARATI VOWEL SIGN VOCALIC LL
+0AE6;N # GUJARATI DIGIT ZERO
+0AE7;N # GUJARATI DIGIT ONE
+0AE8;N # GUJARATI DIGIT TWO
+0AE9;N # GUJARATI DIGIT THREE
+0AEA;N # GUJARATI DIGIT FOUR
+0AEB;N # GUJARATI DIGIT FIVE
+0AEC;N # GUJARATI DIGIT SIX
+0AED;N # GUJARATI DIGIT SEVEN
+0AEE;N # GUJARATI DIGIT EIGHT
+0AEF;N # GUJARATI DIGIT NINE
+0AF1;N # GUJARATI RUPEE SIGN
+0B01;N # ORIYA SIGN CANDRABINDU
+0B02;N # ORIYA SIGN ANUSVARA
+0B03;N # ORIYA SIGN VISARGA
+0B05;N # ORIYA LETTER A
+0B06;N # ORIYA LETTER AA
+0B07;N # ORIYA LETTER I
+0B08;N # ORIYA LETTER II
+0B09;N # ORIYA LETTER U
+0B0A;N # ORIYA LETTER UU
+0B0B;N # ORIYA LETTER VOCALIC R
+0B0C;N # ORIYA LETTER VOCALIC L
+0B0F;N # ORIYA LETTER E
+0B10;N # ORIYA LETTER AI
+0B13;N # ORIYA LETTER O
+0B14;N # ORIYA LETTER AU
+0B15;N # ORIYA LETTER KA
+0B16;N # ORIYA LETTER KHA
+0B17;N # ORIYA LETTER GA
+0B18;N # ORIYA LETTER GHA
+0B19;N # ORIYA LETTER NGA
+0B1A;N # ORIYA LETTER CA
+0B1B;N # ORIYA LETTER CHA
+0B1C;N # ORIYA LETTER JA
+0B1D;N # ORIYA LETTER JHA
+0B1E;N # ORIYA LETTER NYA
+0B1F;N # ORIYA LETTER TTA
+0B20;N # ORIYA LETTER TTHA
+0B21;N # ORIYA LETTER DDA
+0B22;N # ORIYA LETTER DDHA
+0B23;N # ORIYA LETTER NNA
+0B24;N # ORIYA LETTER TA
+0B25;N # ORIYA LETTER THA
+0B26;N # ORIYA LETTER DA
+0B27;N # ORIYA LETTER DHA
+0B28;N # ORIYA LETTER NA
+0B2A;N # ORIYA LETTER PA
+0B2B;N # ORIYA LETTER PHA
+0B2C;N # ORIYA LETTER BA
+0B2D;N # ORIYA LETTER BHA
+0B2E;N # ORIYA LETTER MA
+0B2F;N # ORIYA LETTER YA
+0B30;N # ORIYA LETTER RA
+0B32;N # ORIYA LETTER LA
+0B33;N # ORIYA LETTER LLA
+0B35;N # ORIYA LETTER VA
+0B36;N # ORIYA LETTER SHA
+0B37;N # ORIYA LETTER SSA
+0B38;N # ORIYA LETTER SA
+0B39;N # ORIYA LETTER HA
+0B3C;N # ORIYA SIGN NUKTA
+0B3D;N # ORIYA SIGN AVAGRAHA
+0B3E;N # ORIYA VOWEL SIGN AA
+0B3F;N # ORIYA VOWEL SIGN I
+0B40;N # ORIYA VOWEL SIGN II
+0B41;N # ORIYA VOWEL SIGN U
+0B42;N # ORIYA VOWEL SIGN UU
+0B43;N # ORIYA VOWEL SIGN VOCALIC R
+0B44;N # ORIYA VOWEL SIGN VOCALIC RR
+0B47;N # ORIYA VOWEL SIGN E
+0B48;N # ORIYA VOWEL SIGN AI
+0B4B;N # ORIYA VOWEL SIGN O
+0B4C;N # ORIYA VOWEL SIGN AU
+0B4D;N # ORIYA SIGN VIRAMA
+0B56;N # ORIYA AI LENGTH MARK
+0B57;N # ORIYA AU LENGTH MARK
+0B5C;N # ORIYA LETTER RRA
+0B5D;N # ORIYA LETTER RHA
+0B5F;N # ORIYA LETTER YYA
+0B60;N # ORIYA LETTER VOCALIC RR
+0B61;N # ORIYA LETTER VOCALIC LL
+0B62;N # ORIYA VOWEL SIGN VOCALIC L
+0B63;N # ORIYA VOWEL SIGN VOCALIC LL
+0B66;N # ORIYA DIGIT ZERO
+0B67;N # ORIYA DIGIT ONE
+0B68;N # ORIYA DIGIT TWO
+0B69;N # ORIYA DIGIT THREE
+0B6A;N # ORIYA DIGIT FOUR
+0B6B;N # ORIYA DIGIT FIVE
+0B6C;N # ORIYA DIGIT SIX
+0B6D;N # ORIYA DIGIT SEVEN
+0B6E;N # ORIYA DIGIT EIGHT
+0B6F;N # ORIYA DIGIT NINE
+0B70;N # ORIYA ISSHAR
+0B71;N # ORIYA LETTER WA
+0B82;N # TAMIL SIGN ANUSVARA
+0B83;N # TAMIL SIGN VISARGA
+0B85;N # TAMIL LETTER A
+0B86;N # TAMIL LETTER AA
+0B87;N # TAMIL LETTER I
+0B88;N # TAMIL LETTER II
+0B89;N # TAMIL LETTER U
+0B8A;N # TAMIL LETTER UU
+0B8E;N # TAMIL LETTER E
+0B8F;N # TAMIL LETTER EE
+0B90;N # TAMIL LETTER AI
+0B92;N # TAMIL LETTER O
+0B93;N # TAMIL LETTER OO
+0B94;N # TAMIL LETTER AU
+0B95;N # TAMIL LETTER KA
+0B99;N # TAMIL LETTER NGA
+0B9A;N # TAMIL LETTER CA
+0B9C;N # TAMIL LETTER JA
+0B9E;N # TAMIL LETTER NYA
+0B9F;N # TAMIL LETTER TTA
+0BA3;N # TAMIL LETTER NNA
+0BA4;N # TAMIL LETTER TA
+0BA8;N # TAMIL LETTER NA
+0BA9;N # TAMIL LETTER NNNA
+0BAA;N # TAMIL LETTER PA
+0BAE;N # TAMIL LETTER MA
+0BAF;N # TAMIL LETTER YA
+0BB0;N # TAMIL LETTER RA
+0BB1;N # TAMIL LETTER RRA
+0BB2;N # TAMIL LETTER LA
+0BB3;N # TAMIL LETTER LLA
+0BB4;N # TAMIL LETTER LLLA
+0BB5;N # TAMIL LETTER VA
+0BB6;N # TAMIL LETTER SHA
+0BB7;N # TAMIL LETTER SSA
+0BB8;N # TAMIL LETTER SA
+0BB9;N # TAMIL LETTER HA
+0BBE;N # TAMIL VOWEL SIGN AA
+0BBF;N # TAMIL VOWEL SIGN I
+0BC0;N # TAMIL VOWEL SIGN II
+0BC1;N # TAMIL VOWEL SIGN U
+0BC2;N # TAMIL VOWEL SIGN UU
+0BC6;N # TAMIL VOWEL SIGN E
+0BC7;N # TAMIL VOWEL SIGN EE
+0BC8;N # TAMIL VOWEL SIGN AI
+0BCA;N # TAMIL VOWEL SIGN O
+0BCB;N # TAMIL VOWEL SIGN OO
+0BCC;N # TAMIL VOWEL SIGN AU
+0BCD;N # TAMIL SIGN VIRAMA
+0BD0;N # TAMIL OM
+0BD7;N # TAMIL AU LENGTH MARK
+0BE6;N # TAMIL DIGIT ZERO
+0BE7;N # TAMIL DIGIT ONE
+0BE8;N # TAMIL DIGIT TWO
+0BE9;N # TAMIL DIGIT THREE
+0BEA;N # TAMIL DIGIT FOUR
+0BEB;N # TAMIL DIGIT FIVE
+0BEC;N # TAMIL DIGIT SIX
+0BED;N # TAMIL DIGIT SEVEN
+0BEE;N # TAMIL DIGIT EIGHT
+0BEF;N # TAMIL DIGIT NINE
+0BF0;N # TAMIL NUMBER TEN
+0BF1;N # TAMIL NUMBER ONE HUNDRED
+0BF2;N # TAMIL NUMBER ONE THOUSAND
+0BF3;N # TAMIL DAY SIGN
+0BF4;N # TAMIL MONTH SIGN
+0BF5;N # TAMIL YEAR SIGN
+0BF6;N # TAMIL DEBIT SIGN
+0BF7;N # TAMIL CREDIT SIGN
+0BF8;N # TAMIL AS ABOVE SIGN
+0BF9;N # TAMIL RUPEE SIGN
+0BFA;N # TAMIL NUMBER SIGN
+0C01;N # TELUGU SIGN CANDRABINDU
+0C02;N # TELUGU SIGN ANUSVARA
+0C03;N # TELUGU SIGN VISARGA
+0C05;N # TELUGU LETTER A
+0C06;N # TELUGU LETTER AA
+0C07;N # TELUGU LETTER I
+0C08;N # TELUGU LETTER II
+0C09;N # TELUGU LETTER U
+0C0A;N # TELUGU LETTER UU
+0C0B;N # TELUGU LETTER VOCALIC R
+0C0C;N # TELUGU LETTER VOCALIC L
+0C0E;N # TELUGU LETTER E
+0C0F;N # TELUGU LETTER EE
+0C10;N # TELUGU LETTER AI
+0C12;N # TELUGU LETTER O
+0C13;N # TELUGU LETTER OO
+0C14;N # TELUGU LETTER AU
+0C15;N # TELUGU LETTER KA
+0C16;N # TELUGU LETTER KHA
+0C17;N # TELUGU LETTER GA
+0C18;N # TELUGU LETTER GHA
+0C19;N # TELUGU LETTER NGA
+0C1A;N # TELUGU LETTER CA
+0C1B;N # TELUGU LETTER CHA
+0C1C;N # TELUGU LETTER JA
+0C1D;N # TELUGU LETTER JHA
+0C1E;N # TELUGU LETTER NYA
+0C1F;N # TELUGU LETTER TTA
+0C20;N # TELUGU LETTER TTHA
+0C21;N # TELUGU LETTER DDA
+0C22;N # TELUGU LETTER DDHA
+0C23;N # TELUGU LETTER NNA
+0C24;N # TELUGU LETTER TA
+0C25;N # TELUGU LETTER THA
+0C26;N # TELUGU LETTER DA
+0C27;N # TELUGU LETTER DHA
+0C28;N # TELUGU LETTER NA
+0C2A;N # TELUGU LETTER PA
+0C2B;N # TELUGU LETTER PHA
+0C2C;N # TELUGU LETTER BA
+0C2D;N # TELUGU LETTER BHA
+0C2E;N # TELUGU LETTER MA
+0C2F;N # TELUGU LETTER YA
+0C30;N # TELUGU LETTER RA
+0C31;N # TELUGU LETTER RRA
+0C32;N # TELUGU LETTER LA
+0C33;N # TELUGU LETTER LLA
+0C35;N # TELUGU LETTER VA
+0C36;N # TELUGU LETTER SHA
+0C37;N # TELUGU LETTER SSA
+0C38;N # TELUGU LETTER SA
+0C39;N # TELUGU LETTER HA
+0C3D;N # TELUGU SIGN AVAGRAHA
+0C3E;N # TELUGU VOWEL SIGN AA
+0C3F;N # TELUGU VOWEL SIGN I
+0C40;N # TELUGU VOWEL SIGN II
+0C41;N # TELUGU VOWEL SIGN U
+0C42;N # TELUGU VOWEL SIGN UU
+0C43;N # TELUGU VOWEL SIGN VOCALIC R
+0C44;N # TELUGU VOWEL SIGN VOCALIC RR
+0C46;N # TELUGU VOWEL SIGN E
+0C47;N # TELUGU VOWEL SIGN EE
+0C48;N # TELUGU VOWEL SIGN AI
+0C4A;N # TELUGU VOWEL SIGN O
+0C4B;N # TELUGU VOWEL SIGN OO
+0C4C;N # TELUGU VOWEL SIGN AU
+0C4D;N # TELUGU SIGN VIRAMA
+0C55;N # TELUGU LENGTH MARK
+0C56;N # TELUGU AI LENGTH MARK
+0C58;N # TELUGU LETTER TSA
+0C59;N # TELUGU LETTER DZA
+0C60;N # TELUGU LETTER VOCALIC RR
+0C61;N # TELUGU LETTER VOCALIC LL
+0C62;N # TELUGU VOWEL SIGN VOCALIC L
+0C63;N # TELUGU VOWEL SIGN VOCALIC LL
+0C66;N # TELUGU DIGIT ZERO
+0C67;N # TELUGU DIGIT ONE
+0C68;N # TELUGU DIGIT TWO
+0C69;N # TELUGU DIGIT THREE
+0C6A;N # TELUGU DIGIT FOUR
+0C6B;N # TELUGU DIGIT FIVE
+0C6C;N # TELUGU DIGIT SIX
+0C6D;N # TELUGU DIGIT SEVEN
+0C6E;N # TELUGU DIGIT EIGHT
+0C6F;N # TELUGU DIGIT NINE
+0C78;N # TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR
+0C79;N # TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR
+0C7A;N # TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR
+0C7B;N # TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR
+0C7C;N # TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR
+0C7D;N # TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR
+0C7E;N # TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
+0C7F;N # TELUGU SIGN TUUMU
+0C82;N # KANNADA SIGN ANUSVARA
+0C83;N # KANNADA SIGN VISARGA
+0C85;N # KANNADA LETTER A
+0C86;N # KANNADA LETTER AA
+0C87;N # KANNADA LETTER I
+0C88;N # KANNADA LETTER II
+0C89;N # KANNADA LETTER U
+0C8A;N # KANNADA LETTER UU
+0C8B;N # KANNADA LETTER VOCALIC R
+0C8C;N # KANNADA LETTER VOCALIC L
+0C8E;N # KANNADA LETTER E
+0C8F;N # KANNADA LETTER EE
+0C90;N # KANNADA LETTER AI
+0C92;N # KANNADA LETTER O
+0C93;N # KANNADA LETTER OO
+0C94;N # KANNADA LETTER AU
+0C95;N # KANNADA LETTER KA
+0C96;N # KANNADA LETTER KHA
+0C97;N # KANNADA LETTER GA
+0C98;N # KANNADA LETTER GHA
+0C99;N # KANNADA LETTER NGA
+0C9A;N # KANNADA LETTER CA
+0C9B;N # KANNADA LETTER CHA
+0C9C;N # KANNADA LETTER JA
+0C9D;N # KANNADA LETTER JHA
+0C9E;N # KANNADA LETTER NYA
+0C9F;N # KANNADA LETTER TTA
+0CA0;N # KANNADA LETTER TTHA
+0CA1;N # KANNADA LETTER DDA
+0CA2;N # KANNADA LETTER DDHA
+0CA3;N # KANNADA LETTER NNA
+0CA4;N # KANNADA LETTER TA
+0CA5;N # KANNADA LETTER THA
+0CA6;N # KANNADA LETTER DA
+0CA7;N # KANNADA LETTER DHA
+0CA8;N # KANNADA LETTER NA
+0CAA;N # KANNADA LETTER PA
+0CAB;N # KANNADA LETTER PHA
+0CAC;N # KANNADA LETTER BA
+0CAD;N # KANNADA LETTER BHA
+0CAE;N # KANNADA LETTER MA
+0CAF;N # KANNADA LETTER YA
+0CB0;N # KANNADA LETTER RA
+0CB1;N # KANNADA LETTER RRA
+0CB2;N # KANNADA LETTER LA
+0CB3;N # KANNADA LETTER LLA
+0CB5;N # KANNADA LETTER VA
+0CB6;N # KANNADA LETTER SHA
+0CB7;N # KANNADA LETTER SSA
+0CB8;N # KANNADA LETTER SA
+0CB9;N # KANNADA LETTER HA
+0CBC;N # KANNADA SIGN NUKTA
+0CBD;N # KANNADA SIGN AVAGRAHA
+0CBE;N # KANNADA VOWEL SIGN AA
+0CBF;N # KANNADA VOWEL SIGN I
+0CC0;N # KANNADA VOWEL SIGN II
+0CC1;N # KANNADA VOWEL SIGN U
+0CC2;N # KANNADA VOWEL SIGN UU
+0CC3;N # KANNADA VOWEL SIGN VOCALIC R
+0CC4;N # KANNADA VOWEL SIGN VOCALIC RR
+0CC6;N # KANNADA VOWEL SIGN E
+0CC7;N # KANNADA VOWEL SIGN EE
+0CC8;N # KANNADA VOWEL SIGN AI
+0CCA;N # KANNADA VOWEL SIGN O
+0CCB;N # KANNADA VOWEL SIGN OO
+0CCC;N # KANNADA VOWEL SIGN AU
+0CCD;N # KANNADA SIGN VIRAMA
+0CD5;N # KANNADA LENGTH MARK
+0CD6;N # KANNADA AI LENGTH MARK
+0CDE;N # KANNADA LETTER FA
+0CE0;N # KANNADA LETTER VOCALIC RR
+0CE1;N # KANNADA LETTER VOCALIC LL
+0CE2;N # KANNADA VOWEL SIGN VOCALIC L
+0CE3;N # KANNADA VOWEL SIGN VOCALIC LL
+0CE6;N # KANNADA DIGIT ZERO
+0CE7;N # KANNADA DIGIT ONE
+0CE8;N # KANNADA DIGIT TWO
+0CE9;N # KANNADA DIGIT THREE
+0CEA;N # KANNADA DIGIT FOUR
+0CEB;N # KANNADA DIGIT FIVE
+0CEC;N # KANNADA DIGIT SIX
+0CED;N # KANNADA DIGIT SEVEN
+0CEE;N # KANNADA DIGIT EIGHT
+0CEF;N # KANNADA DIGIT NINE
+0CF1;N # KANNADA SIGN JIHVAMULIYA
+0CF2;N # KANNADA SIGN UPADHMANIYA
+0D02;N # MALAYALAM SIGN ANUSVARA
+0D03;N # MALAYALAM SIGN VISARGA
+0D05;N # MALAYALAM LETTER A
+0D06;N # MALAYALAM LETTER AA
+0D07;N # MALAYALAM LETTER I
+0D08;N # MALAYALAM LETTER II
+0D09;N # MALAYALAM LETTER U
+0D0A;N # MALAYALAM LETTER UU
+0D0B;N # MALAYALAM LETTER VOCALIC R
+0D0C;N # MALAYALAM LETTER VOCALIC L
+0D0E;N # MALAYALAM LETTER E
+0D0F;N # MALAYALAM LETTER EE
+0D10;N # MALAYALAM LETTER AI
+0D12;N # MALAYALAM LETTER O
+0D13;N # MALAYALAM LETTER OO
+0D14;N # MALAYALAM LETTER AU
+0D15;N # MALAYALAM LETTER KA
+0D16;N # MALAYALAM LETTER KHA
+0D17;N # MALAYALAM LETTER GA
+0D18;N # MALAYALAM LETTER GHA
+0D19;N # MALAYALAM LETTER NGA
+0D1A;N # MALAYALAM LETTER CA
+0D1B;N # MALAYALAM LETTER CHA
+0D1C;N # MALAYALAM LETTER JA
+0D1D;N # MALAYALAM LETTER JHA
+0D1E;N # MALAYALAM LETTER NYA
+0D1F;N # MALAYALAM LETTER TTA
+0D20;N # MALAYALAM LETTER TTHA
+0D21;N # MALAYALAM LETTER DDA
+0D22;N # MALAYALAM LETTER DDHA
+0D23;N # MALAYALAM LETTER NNA
+0D24;N # MALAYALAM LETTER TA
+0D25;N # MALAYALAM LETTER THA
+0D26;N # MALAYALAM LETTER DA
+0D27;N # MALAYALAM LETTER DHA
+0D28;N # MALAYALAM LETTER NA
+0D2A;N # MALAYALAM LETTER PA
+0D2B;N # MALAYALAM LETTER PHA
+0D2C;N # MALAYALAM LETTER BA
+0D2D;N # MALAYALAM LETTER BHA
+0D2E;N # MALAYALAM LETTER MA
+0D2F;N # MALAYALAM LETTER YA
+0D30;N # MALAYALAM LETTER RA
+0D31;N # MALAYALAM LETTER RRA
+0D32;N # MALAYALAM LETTER LA
+0D33;N # MALAYALAM LETTER LLA
+0D34;N # MALAYALAM LETTER LLLA
+0D35;N # MALAYALAM LETTER VA
+0D36;N # MALAYALAM LETTER SHA
+0D37;N # MALAYALAM LETTER SSA
+0D38;N # MALAYALAM LETTER SA
+0D39;N # MALAYALAM LETTER HA
+0D3D;N # MALAYALAM SIGN AVAGRAHA
+0D3E;N # MALAYALAM VOWEL SIGN AA
+0D3F;N # MALAYALAM VOWEL SIGN I
+0D40;N # MALAYALAM VOWEL SIGN II
+0D41;N # MALAYALAM VOWEL SIGN U
+0D42;N # MALAYALAM VOWEL SIGN UU
+0D43;N # MALAYALAM VOWEL SIGN VOCALIC R
+0D44;N # MALAYALAM VOWEL SIGN VOCALIC RR
+0D46;N # MALAYALAM VOWEL SIGN E
+0D47;N # MALAYALAM VOWEL SIGN EE
+0D48;N # MALAYALAM VOWEL SIGN AI
+0D4A;N # MALAYALAM VOWEL SIGN O
+0D4B;N # MALAYALAM VOWEL SIGN OO
+0D4C;N # MALAYALAM VOWEL SIGN AU
+0D4D;N # MALAYALAM SIGN VIRAMA
+0D57;N # MALAYALAM AU LENGTH MARK
+0D60;N # MALAYALAM LETTER VOCALIC RR
+0D61;N # MALAYALAM LETTER VOCALIC LL
+0D62;N # MALAYALAM VOWEL SIGN VOCALIC L
+0D63;N # MALAYALAM VOWEL SIGN VOCALIC LL
+0D66;N # MALAYALAM DIGIT ZERO
+0D67;N # MALAYALAM DIGIT ONE
+0D68;N # MALAYALAM DIGIT TWO
+0D69;N # MALAYALAM DIGIT THREE
+0D6A;N # MALAYALAM DIGIT FOUR
+0D6B;N # MALAYALAM DIGIT FIVE
+0D6C;N # MALAYALAM DIGIT SIX
+0D6D;N # MALAYALAM DIGIT SEVEN
+0D6E;N # MALAYALAM DIGIT EIGHT
+0D6F;N # MALAYALAM DIGIT NINE
+0D70;N # MALAYALAM NUMBER TEN
+0D71;N # MALAYALAM NUMBER ONE HUNDRED
+0D72;N # MALAYALAM NUMBER ONE THOUSAND
+0D73;N # MALAYALAM FRACTION ONE QUARTER
+0D74;N # MALAYALAM FRACTION ONE HALF
+0D75;N # MALAYALAM FRACTION THREE QUARTERS
+0D79;N # MALAYALAM DATE MARK
+0D7A;N # MALAYALAM LETTER CHILLU NN
+0D7B;N # MALAYALAM LETTER CHILLU N
+0D7C;N # MALAYALAM LETTER CHILLU RR
+0D7D;N # MALAYALAM LETTER CHILLU L
+0D7E;N # MALAYALAM LETTER CHILLU LL
+0D7F;N # MALAYALAM LETTER CHILLU K
+0D82;N # SINHALA SIGN ANUSVARAYA
+0D83;N # SINHALA SIGN VISARGAYA
+0D85;N # SINHALA LETTER AYANNA
+0D86;N # SINHALA LETTER AAYANNA
+0D87;N # SINHALA LETTER AEYANNA
+0D88;N # SINHALA LETTER AEEYANNA
+0D89;N # SINHALA LETTER IYANNA
+0D8A;N # SINHALA LETTER IIYANNA
+0D8B;N # SINHALA LETTER UYANNA
+0D8C;N # SINHALA LETTER UUYANNA
+0D8D;N # SINHALA LETTER IRUYANNA
+0D8E;N # SINHALA LETTER IRUUYANNA
+0D8F;N # SINHALA LETTER ILUYANNA
+0D90;N # SINHALA LETTER ILUUYANNA
+0D91;N # SINHALA LETTER EYANNA
+0D92;N # SINHALA LETTER EEYANNA
+0D93;N # SINHALA LETTER AIYANNA
+0D94;N # SINHALA LETTER OYANNA
+0D95;N # SINHALA LETTER OOYANNA
+0D96;N # SINHALA LETTER AUYANNA
+0D9A;N # SINHALA LETTER ALPAPRAANA KAYANNA
+0D9B;N # SINHALA LETTER MAHAAPRAANA KAYANNA
+0D9C;N # SINHALA LETTER ALPAPRAANA GAYANNA
+0D9D;N # SINHALA LETTER MAHAAPRAANA GAYANNA
+0D9E;N # SINHALA LETTER KANTAJA NAASIKYAYA
+0D9F;N # SINHALA LETTER SANYAKA GAYANNA
+0DA0;N # SINHALA LETTER ALPAPRAANA CAYANNA
+0DA1;N # SINHALA LETTER MAHAAPRAANA CAYANNA
+0DA2;N # SINHALA LETTER ALPAPRAANA JAYANNA
+0DA3;N # SINHALA LETTER MAHAAPRAANA JAYANNA
+0DA4;N # SINHALA LETTER TAALUJA NAASIKYAYA
+0DA5;N # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6;N # SINHALA LETTER SANYAKA JAYANNA
+0DA7;N # SINHALA LETTER ALPAPRAANA TTAYANNA
+0DA8;N # SINHALA LETTER MAHAAPRAANA TTAYANNA
+0DA9;N # SINHALA LETTER ALPAPRAANA DDAYANNA
+0DAA;N # SINHALA LETTER MAHAAPRAANA DDAYANNA
+0DAB;N # SINHALA LETTER MUURDHAJA NAYANNA
+0DAC;N # SINHALA LETTER SANYAKA DDAYANNA
+0DAD;N # SINHALA LETTER ALPAPRAANA TAYANNA
+0DAE;N # SINHALA LETTER MAHAAPRAANA TAYANNA
+0DAF;N # SINHALA LETTER ALPAPRAANA DAYANNA
+0DB0;N # SINHALA LETTER MAHAAPRAANA DAYANNA
+0DB1;N # SINHALA LETTER DANTAJA NAYANNA
+0DB3;N # SINHALA LETTER SANYAKA DAYANNA
+0DB4;N # SINHALA LETTER ALPAPRAANA PAYANNA
+0DB5;N # SINHALA LETTER MAHAAPRAANA PAYANNA
+0DB6;N # SINHALA LETTER ALPAPRAANA BAYANNA
+0DB7;N # SINHALA LETTER MAHAAPRAANA BAYANNA
+0DB8;N # SINHALA LETTER MAYANNA
+0DB9;N # SINHALA LETTER AMBA BAYANNA
+0DBA;N # SINHALA LETTER YAYANNA
+0DBB;N # SINHALA LETTER RAYANNA
+0DBD;N # SINHALA LETTER DANTAJA LAYANNA
+0DC0;N # SINHALA LETTER VAYANNA
+0DC1;N # SINHALA LETTER TAALUJA SAYANNA
+0DC2;N # SINHALA LETTER MUURDHAJA SAYANNA
+0DC3;N # SINHALA LETTER DANTAJA SAYANNA
+0DC4;N # SINHALA LETTER HAYANNA
+0DC5;N # SINHALA LETTER MUURDHAJA LAYANNA
+0DC6;N # SINHALA LETTER FAYANNA
+0DCA;N # SINHALA SIGN AL-LAKUNA
+0DCF;N # SINHALA VOWEL SIGN AELA-PILLA
+0DD0;N # SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0DD1;N # SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2;N # SINHALA VOWEL SIGN KETTI IS-PILLA
+0DD3;N # SINHALA VOWEL SIGN DIGA IS-PILLA
+0DD4;N # SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6;N # SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8;N # SINHALA VOWEL SIGN GAETTA-PILLA
+0DD9;N # SINHALA VOWEL SIGN KOMBUVA
+0DDA;N # SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDB;N # SINHALA VOWEL SIGN KOMBU DEKA
+0DDC;N # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DDD;N # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDE;N # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DDF;N # SINHALA VOWEL SIGN GAYANUKITTA
+0DF2;N # SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0DF3;N # SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4;N # SINHALA PUNCTUATION KUNDDALIYA
+0E01;N # THAI CHARACTER KO KAI
+0E02;N # THAI CHARACTER KHO KHAI
+0E03;N # THAI CHARACTER KHO KHUAT
+0E04;N # THAI CHARACTER KHO KHWAI
+0E05;N # THAI CHARACTER KHO KHON
+0E06;N # THAI CHARACTER KHO RAKHANG
+0E07;N # THAI CHARACTER NGO NGU
+0E08;N # THAI CHARACTER CHO CHAN
+0E09;N # THAI CHARACTER CHO CHING
+0E0A;N # THAI CHARACTER CHO CHANG
+0E0B;N # THAI CHARACTER SO SO
+0E0C;N # THAI CHARACTER CHO CHOE
+0E0D;N # THAI CHARACTER YO YING
+0E0E;N # THAI CHARACTER DO CHADA
+0E0F;N # THAI CHARACTER TO PATAK
+0E10;N # THAI CHARACTER THO THAN
+0E11;N # THAI CHARACTER THO NANGMONTHO
+0E12;N # THAI CHARACTER THO PHUTHAO
+0E13;N # THAI CHARACTER NO NEN
+0E14;N # THAI CHARACTER DO DEK
+0E15;N # THAI CHARACTER TO TAO
+0E16;N # THAI CHARACTER THO THUNG
+0E17;N # THAI CHARACTER THO THAHAN
+0E18;N # THAI CHARACTER THO THONG
+0E19;N # THAI CHARACTER NO NU
+0E1A;N # THAI CHARACTER BO BAIMAI
+0E1B;N # THAI CHARACTER PO PLA
+0E1C;N # THAI CHARACTER PHO PHUNG
+0E1D;N # THAI CHARACTER FO FA
+0E1E;N # THAI CHARACTER PHO PHAN
+0E1F;N # THAI CHARACTER FO FAN
+0E20;N # THAI CHARACTER PHO SAMPHAO
+0E21;N # THAI CHARACTER MO MA
+0E22;N # THAI CHARACTER YO YAK
+0E23;N # THAI CHARACTER RO RUA
+0E24;N # THAI CHARACTER RU
+0E25;N # THAI CHARACTER LO LING
+0E26;N # THAI CHARACTER LU
+0E27;N # THAI CHARACTER WO WAEN
+0E28;N # THAI CHARACTER SO SALA
+0E29;N # THAI CHARACTER SO RUSI
+0E2A;N # THAI CHARACTER SO SUA
+0E2B;N # THAI CHARACTER HO HIP
+0E2C;N # THAI CHARACTER LO CHULA
+0E2D;N # THAI CHARACTER O ANG
+0E2E;N # THAI CHARACTER HO NOKHUK
+0E2F;N # THAI CHARACTER PAIYANNOI
+0E30;N # THAI CHARACTER SARA A
+0E31;N # THAI CHARACTER MAI HAN-AKAT
+0E32;N # THAI CHARACTER SARA AA
+0E33;N # THAI CHARACTER SARA AM
+0E34;N # THAI CHARACTER SARA I
+0E35;N # THAI CHARACTER SARA II
+0E36;N # THAI CHARACTER SARA UE
+0E37;N # THAI CHARACTER SARA UEE
+0E38;N # THAI CHARACTER SARA U
+0E39;N # THAI CHARACTER SARA UU
+0E3A;N # THAI CHARACTER PHINTHU
+0E3F;N # THAI CURRENCY SYMBOL BAHT
+0E40;N # THAI CHARACTER SARA E
+0E41;N # THAI CHARACTER SARA AE
+0E42;N # THAI CHARACTER SARA O
+0E43;N # THAI CHARACTER SARA AI MAIMUAN
+0E44;N # THAI CHARACTER SARA AI MAIMALAI
+0E45;N # THAI CHARACTER LAKKHANGYAO
+0E46;N # THAI CHARACTER MAIYAMOK
+0E47;N # THAI CHARACTER MAITAIKHU
+0E48;N # THAI CHARACTER MAI EK
+0E49;N # THAI CHARACTER MAI THO
+0E4A;N # THAI CHARACTER MAI TRI
+0E4B;N # THAI CHARACTER MAI CHATTAWA
+0E4C;N # THAI CHARACTER THANTHAKHAT
+0E4D;N # THAI CHARACTER NIKHAHIT
+0E4E;N # THAI CHARACTER YAMAKKAN
+0E4F;N # THAI CHARACTER FONGMAN
+0E50;N # THAI DIGIT ZERO
+0E51;N # THAI DIGIT ONE
+0E52;N # THAI DIGIT TWO
+0E53;N # THAI DIGIT THREE
+0E54;N # THAI DIGIT FOUR
+0E55;N # THAI DIGIT FIVE
+0E56;N # THAI DIGIT SIX
+0E57;N # THAI DIGIT SEVEN
+0E58;N # THAI DIGIT EIGHT
+0E59;N # THAI DIGIT NINE
+0E5A;N # THAI CHARACTER ANGKHANKHU
+0E5B;N # THAI CHARACTER KHOMUT
+0E81;N # LAO LETTER KO
+0E82;N # LAO LETTER KHO SUNG
+0E84;N # LAO LETTER KHO TAM
+0E87;N # LAO LETTER NGO
+0E88;N # LAO LETTER CO
+0E8A;N # LAO LETTER SO TAM
+0E8D;N # LAO LETTER NYO
+0E94;N # LAO LETTER DO
+0E95;N # LAO LETTER TO
+0E96;N # LAO LETTER THO SUNG
+0E97;N # LAO LETTER THO TAM
+0E99;N # LAO LETTER NO
+0E9A;N # LAO LETTER BO
+0E9B;N # LAO LETTER PO
+0E9C;N # LAO LETTER PHO SUNG
+0E9D;N # LAO LETTER FO TAM
+0E9E;N # LAO LETTER PHO TAM
+0E9F;N # LAO LETTER FO SUNG
+0EA1;N # LAO LETTER MO
+0EA2;N # LAO LETTER YO
+0EA3;N # LAO LETTER LO LING
+0EA5;N # LAO LETTER LO LOOT
+0EA7;N # LAO LETTER WO
+0EAA;N # LAO LETTER SO SUNG
+0EAB;N # LAO LETTER HO SUNG
+0EAD;N # LAO LETTER O
+0EAE;N # LAO LETTER HO TAM
+0EAF;N # LAO ELLIPSIS
+0EB0;N # LAO VOWEL SIGN A
+0EB1;N # LAO VOWEL SIGN MAI KAN
+0EB2;N # LAO VOWEL SIGN AA
+0EB3;N # LAO VOWEL SIGN AM
+0EB4;N # LAO VOWEL SIGN I
+0EB5;N # LAO VOWEL SIGN II
+0EB6;N # LAO VOWEL SIGN Y
+0EB7;N # LAO VOWEL SIGN YY
+0EB8;N # LAO VOWEL SIGN U
+0EB9;N # LAO VOWEL SIGN UU
+0EBB;N # LAO VOWEL SIGN MAI KON
+0EBC;N # LAO SEMIVOWEL SIGN LO
+0EBD;N # LAO SEMIVOWEL SIGN NYO
+0EC0;N # LAO VOWEL SIGN E
+0EC1;N # LAO VOWEL SIGN EI
+0EC2;N # LAO VOWEL SIGN O
+0EC3;N # LAO VOWEL SIGN AY
+0EC4;N # LAO VOWEL SIGN AI
+0EC6;N # LAO KO LA
+0EC8;N # LAO TONE MAI EK
+0EC9;N # LAO TONE MAI THO
+0ECA;N # LAO TONE MAI TI
+0ECB;N # LAO TONE MAI CATAWA
+0ECC;N # LAO CANCELLATION MARK
+0ECD;N # LAO NIGGAHITA
+0ED0;N # LAO DIGIT ZERO
+0ED1;N # LAO DIGIT ONE
+0ED2;N # LAO DIGIT TWO
+0ED3;N # LAO DIGIT THREE
+0ED4;N # LAO DIGIT FOUR
+0ED5;N # LAO DIGIT FIVE
+0ED6;N # LAO DIGIT SIX
+0ED7;N # LAO DIGIT SEVEN
+0ED8;N # LAO DIGIT EIGHT
+0ED9;N # LAO DIGIT NINE
+0EDC;N # LAO HO NO
+0EDD;N # LAO HO MO
+0F00;N # TIBETAN SYLLABLE OM
+0F01;N # TIBETAN MARK GTER YIG MGO TRUNCATED A
+0F02;N # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0F03;N # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04;N # TIBETAN MARK INITIAL YIG MGO MDUN MA
+0F05;N # TIBETAN MARK CLOSING YIG MGO SGAB MA
+0F06;N # TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0F07;N # TIBETAN MARK YIG MGO TSHEG SHAD MA
+0F08;N # TIBETAN MARK SBRUL SHAD
+0F09;N # TIBETAN MARK BSKUR YIG MGO
+0F0A;N # TIBETAN MARK BKA- SHOG YIG MGO
+0F0B;N # TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C;N # TIBETAN MARK DELIMITER TSHEG BSTAR
+0F0D;N # TIBETAN MARK SHAD
+0F0E;N # TIBETAN MARK NYIS SHAD
+0F0F;N # TIBETAN MARK TSHEG SHAD
+0F10;N # TIBETAN MARK NYIS TSHEG SHAD
+0F11;N # TIBETAN MARK RIN CHEN SPUNGS SHAD
+0F12;N # TIBETAN MARK RGYA GRAM SHAD
+0F13;N # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14;N # TIBETAN MARK GTER TSHEG
+0F15;N # TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0F16;N # TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0F17;N # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18;N # TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0F19;N # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A;N # TIBETAN SIGN RDEL DKAR GCIG
+0F1B;N # TIBETAN SIGN RDEL DKAR GNYIS
+0F1C;N # TIBETAN SIGN RDEL DKAR GSUM
+0F1D;N # TIBETAN SIGN RDEL NAG GCIG
+0F1E;N # TIBETAN SIGN RDEL NAG GNYIS
+0F1F;N # TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20;N # TIBETAN DIGIT ZERO
+0F21;N # TIBETAN DIGIT ONE
+0F22;N # TIBETAN DIGIT TWO
+0F23;N # TIBETAN DIGIT THREE
+0F24;N # TIBETAN DIGIT FOUR
+0F25;N # TIBETAN DIGIT FIVE
+0F26;N # TIBETAN DIGIT SIX
+0F27;N # TIBETAN DIGIT SEVEN
+0F28;N # TIBETAN DIGIT EIGHT
+0F29;N # TIBETAN DIGIT NINE
+0F2A;N # TIBETAN DIGIT HALF ONE
+0F2B;N # TIBETAN DIGIT HALF TWO
+0F2C;N # TIBETAN DIGIT HALF THREE
+0F2D;N # TIBETAN DIGIT HALF FOUR
+0F2E;N # TIBETAN DIGIT HALF FIVE
+0F2F;N # TIBETAN DIGIT HALF SIX
+0F30;N # TIBETAN DIGIT HALF SEVEN
+0F31;N # TIBETAN DIGIT HALF EIGHT
+0F32;N # TIBETAN DIGIT HALF NINE
+0F33;N # TIBETAN DIGIT HALF ZERO
+0F34;N # TIBETAN MARK BSDUS RTAGS
+0F35;N # TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36;N # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37;N # TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38;N # TIBETAN MARK CHE MGO
+0F39;N # TIBETAN MARK TSA -PHRU
+0F3A;N # TIBETAN MARK GUG RTAGS GYON
+0F3B;N # TIBETAN MARK GUG RTAGS GYAS
+0F3C;N # TIBETAN MARK ANG KHANG GYON
+0F3D;N # TIBETAN MARK ANG KHANG GYAS
+0F3E;N # TIBETAN SIGN YAR TSHES
+0F3F;N # TIBETAN SIGN MAR TSHES
+0F40;N # TIBETAN LETTER KA
+0F41;N # TIBETAN LETTER KHA
+0F42;N # TIBETAN LETTER GA
+0F43;N # TIBETAN LETTER GHA
+0F44;N # TIBETAN LETTER NGA
+0F45;N # TIBETAN LETTER CA
+0F46;N # TIBETAN LETTER CHA
+0F47;N # TIBETAN LETTER JA
+0F49;N # TIBETAN LETTER NYA
+0F4A;N # TIBETAN LETTER TTA
+0F4B;N # TIBETAN LETTER TTHA
+0F4C;N # TIBETAN LETTER DDA
+0F4D;N # TIBETAN LETTER DDHA
+0F4E;N # TIBETAN LETTER NNA
+0F4F;N # TIBETAN LETTER TA
+0F50;N # TIBETAN LETTER THA
+0F51;N # TIBETAN LETTER DA
+0F52;N # TIBETAN LETTER DHA
+0F53;N # TIBETAN LETTER NA
+0F54;N # TIBETAN LETTER PA
+0F55;N # TIBETAN LETTER PHA
+0F56;N # TIBETAN LETTER BA
+0F57;N # TIBETAN LETTER BHA
+0F58;N # TIBETAN LETTER MA
+0F59;N # TIBETAN LETTER TSA
+0F5A;N # TIBETAN LETTER TSHA
+0F5B;N # TIBETAN LETTER DZA
+0F5C;N # TIBETAN LETTER DZHA
+0F5D;N # TIBETAN LETTER WA
+0F5E;N # TIBETAN LETTER ZHA
+0F5F;N # TIBETAN LETTER ZA
+0F60;N # TIBETAN LETTER -A
+0F61;N # TIBETAN LETTER YA
+0F62;N # TIBETAN LETTER RA
+0F63;N # TIBETAN LETTER LA
+0F64;N # TIBETAN LETTER SHA
+0F65;N # TIBETAN LETTER SSA
+0F66;N # TIBETAN LETTER SA
+0F67;N # TIBETAN LETTER HA
+0F68;N # TIBETAN LETTER A
+0F69;N # TIBETAN LETTER KSSA
+0F6A;N # TIBETAN LETTER FIXED-FORM RA
+0F6B;N # TIBETAN LETTER KKA
+0F6C;N # TIBETAN LETTER RRA
+0F71;N # TIBETAN VOWEL SIGN AA
+0F72;N # TIBETAN VOWEL SIGN I
+0F73;N # TIBETAN VOWEL SIGN II
+0F74;N # TIBETAN VOWEL SIGN U
+0F75;N # TIBETAN VOWEL SIGN UU
+0F76;N # TIBETAN VOWEL SIGN VOCALIC R
+0F77;N # TIBETAN VOWEL SIGN VOCALIC RR
+0F78;N # TIBETAN VOWEL SIGN VOCALIC L
+0F79;N # TIBETAN VOWEL SIGN VOCALIC LL
+0F7A;N # TIBETAN VOWEL SIGN E
+0F7B;N # TIBETAN VOWEL SIGN EE
+0F7C;N # TIBETAN VOWEL SIGN O
+0F7D;N # TIBETAN VOWEL SIGN OO
+0F7E;N # TIBETAN SIGN RJES SU NGA RO
+0F7F;N # TIBETAN SIGN RNAM BCAD
+0F80;N # TIBETAN VOWEL SIGN REVERSED I
+0F81;N # TIBETAN VOWEL SIGN REVERSED II
+0F82;N # TIBETAN SIGN NYI ZLA NAA DA
+0F83;N # TIBETAN SIGN SNA LDAN
+0F84;N # TIBETAN MARK HALANTA
+0F85;N # TIBETAN MARK PALUTA
+0F86;N # TIBETAN SIGN LCI RTAGS
+0F87;N # TIBETAN SIGN YANG RTAGS
+0F88;N # TIBETAN SIGN LCE TSA CAN
+0F89;N # TIBETAN SIGN MCHU CAN
+0F8A;N # TIBETAN SIGN GRU CAN RGYINGS
+0F8B;N # TIBETAN SIGN GRU MED RGYINGS
+0F90;N # TIBETAN SUBJOINED LETTER KA
+0F91;N # TIBETAN SUBJOINED LETTER KHA
+0F92;N # TIBETAN SUBJOINED LETTER GA
+0F93;N # TIBETAN SUBJOINED LETTER GHA
+0F94;N # TIBETAN SUBJOINED LETTER NGA
+0F95;N # TIBETAN SUBJOINED LETTER CA
+0F96;N # TIBETAN SUBJOINED LETTER CHA
+0F97;N # TIBETAN SUBJOINED LETTER JA
+0F99;N # TIBETAN SUBJOINED LETTER NYA
+0F9A;N # TIBETAN SUBJOINED LETTER TTA
+0F9B;N # TIBETAN SUBJOINED LETTER TTHA
+0F9C;N # TIBETAN SUBJOINED LETTER DDA
+0F9D;N # TIBETAN SUBJOINED LETTER DDHA
+0F9E;N # TIBETAN SUBJOINED LETTER NNA
+0F9F;N # TIBETAN SUBJOINED LETTER TA
+0FA0;N # TIBETAN SUBJOINED LETTER THA
+0FA1;N # TIBETAN SUBJOINED LETTER DA
+0FA2;N # TIBETAN SUBJOINED LETTER DHA
+0FA3;N # TIBETAN SUBJOINED LETTER NA
+0FA4;N # TIBETAN SUBJOINED LETTER PA
+0FA5;N # TIBETAN SUBJOINED LETTER PHA
+0FA6;N # TIBETAN SUBJOINED LETTER BA
+0FA7;N # TIBETAN SUBJOINED LETTER BHA
+0FA8;N # TIBETAN SUBJOINED LETTER MA
+0FA9;N # TIBETAN SUBJOINED LETTER TSA
+0FAA;N # TIBETAN SUBJOINED LETTER TSHA
+0FAB;N # TIBETAN SUBJOINED LETTER DZA
+0FAC;N # TIBETAN SUBJOINED LETTER DZHA
+0FAD;N # TIBETAN SUBJOINED LETTER WA
+0FAE;N # TIBETAN SUBJOINED LETTER ZHA
+0FAF;N # TIBETAN SUBJOINED LETTER ZA
+0FB0;N # TIBETAN SUBJOINED LETTER -A
+0FB1;N # TIBETAN SUBJOINED LETTER YA
+0FB2;N # TIBETAN SUBJOINED LETTER RA
+0FB3;N # TIBETAN SUBJOINED LETTER LA
+0FB4;N # TIBETAN SUBJOINED LETTER SHA
+0FB5;N # TIBETAN SUBJOINED LETTER SSA
+0FB6;N # TIBETAN SUBJOINED LETTER SA
+0FB7;N # TIBETAN SUBJOINED LETTER HA
+0FB8;N # TIBETAN SUBJOINED LETTER A
+0FB9;N # TIBETAN SUBJOINED LETTER KSSA
+0FBA;N # TIBETAN SUBJOINED LETTER FIXED-FORM WA
+0FBB;N # TIBETAN SUBJOINED LETTER FIXED-FORM YA
+0FBC;N # TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE;N # TIBETAN KU RU KHA
+0FBF;N # TIBETAN KU RU KHA BZHI MIG CAN
+0FC0;N # TIBETAN CANTILLATION SIGN HEAVY BEAT
+0FC1;N # TIBETAN CANTILLATION SIGN LIGHT BEAT
+0FC2;N # TIBETAN CANTILLATION SIGN CANG TE-U
+0FC3;N # TIBETAN CANTILLATION SIGN SBUB -CHAL
+0FC4;N # TIBETAN SYMBOL DRIL BU
+0FC5;N # TIBETAN SYMBOL RDO RJE
+0FC6;N # TIBETAN SYMBOL PADMA GDAN
+0FC7;N # TIBETAN SYMBOL RDO RJE RGYA GRAM
+0FC8;N # TIBETAN SYMBOL PHUR PA
+0FC9;N # TIBETAN SYMBOL NOR BU
+0FCA;N # TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0FCB;N # TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0FCC;N # TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCE;N # TIBETAN SIGN RDEL NAG RDEL DKAR
+0FCF;N # TIBETAN SIGN RDEL NAG GSUM
+0FD0;N # TIBETAN MARK BSKA- SHOG GI MGO RGYAN
+0FD1;N # TIBETAN MARK MNYAM YIG GI MGO RGYAN
+0FD2;N # TIBETAN MARK NYIS TSHEG
+0FD3;N # TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA
+0FD4;N # TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA
+1000;N # MYANMAR LETTER KA
+1001;N # MYANMAR LETTER KHA
+1002;N # MYANMAR LETTER GA
+1003;N # MYANMAR LETTER GHA
+1004;N # MYANMAR LETTER NGA
+1005;N # MYANMAR LETTER CA
+1006;N # MYANMAR LETTER CHA
+1007;N # MYANMAR LETTER JA
+1008;N # MYANMAR LETTER JHA
+1009;N # MYANMAR LETTER NYA
+100A;N # MYANMAR LETTER NNYA
+100B;N # MYANMAR LETTER TTA
+100C;N # MYANMAR LETTER TTHA
+100D;N # MYANMAR LETTER DDA
+100E;N # MYANMAR LETTER DDHA
+100F;N # MYANMAR LETTER NNA
+1010;N # MYANMAR LETTER TA
+1011;N # MYANMAR LETTER THA
+1012;N # MYANMAR LETTER DA
+1013;N # MYANMAR LETTER DHA
+1014;N # MYANMAR LETTER NA
+1015;N # MYANMAR LETTER PA
+1016;N # MYANMAR LETTER PHA
+1017;N # MYANMAR LETTER BA
+1018;N # MYANMAR LETTER BHA
+1019;N # MYANMAR LETTER MA
+101A;N # MYANMAR LETTER YA
+101B;N # MYANMAR LETTER RA
+101C;N # MYANMAR LETTER LA
+101D;N # MYANMAR LETTER WA
+101E;N # MYANMAR LETTER SA
+101F;N # MYANMAR LETTER HA
+1020;N # MYANMAR LETTER LLA
+1021;N # MYANMAR LETTER A
+1022;N # MYANMAR LETTER SHAN A
+1023;N # MYANMAR LETTER I
+1024;N # MYANMAR LETTER II
+1025;N # MYANMAR LETTER U
+1026;N # MYANMAR LETTER UU
+1027;N # MYANMAR LETTER E
+1028;N # MYANMAR LETTER MON E
+1029;N # MYANMAR LETTER O
+102A;N # MYANMAR LETTER AU
+102B;N # MYANMAR VOWEL SIGN TALL AA
+102C;N # MYANMAR VOWEL SIGN AA
+102D;N # MYANMAR VOWEL SIGN I
+102E;N # MYANMAR VOWEL SIGN II
+102F;N # MYANMAR VOWEL SIGN U
+1030;N # MYANMAR VOWEL SIGN UU
+1031;N # MYANMAR VOWEL SIGN E
+1032;N # MYANMAR VOWEL SIGN AI
+1033;N # MYANMAR VOWEL SIGN MON II
+1034;N # MYANMAR VOWEL SIGN MON O
+1035;N # MYANMAR VOWEL SIGN E ABOVE
+1036;N # MYANMAR SIGN ANUSVARA
+1037;N # MYANMAR SIGN DOT BELOW
+1038;N # MYANMAR SIGN VISARGA
+1039;N # MYANMAR SIGN VIRAMA
+103A;N # MYANMAR SIGN ASAT
+103B;N # MYANMAR CONSONANT SIGN MEDIAL YA
+103C;N # MYANMAR CONSONANT SIGN MEDIAL RA
+103D;N # MYANMAR CONSONANT SIGN MEDIAL WA
+103E;N # MYANMAR CONSONANT SIGN MEDIAL HA
+103F;N # MYANMAR LETTER GREAT SA
+1040;N # MYANMAR DIGIT ZERO
+1041;N # MYANMAR DIGIT ONE
+1042;N # MYANMAR DIGIT TWO
+1043;N # MYANMAR DIGIT THREE
+1044;N # MYANMAR DIGIT FOUR
+1045;N # MYANMAR DIGIT FIVE
+1046;N # MYANMAR DIGIT SIX
+1047;N # MYANMAR DIGIT SEVEN
+1048;N # MYANMAR DIGIT EIGHT
+1049;N # MYANMAR DIGIT NINE
+104A;N # MYANMAR SIGN LITTLE SECTION
+104B;N # MYANMAR SIGN SECTION
+104C;N # MYANMAR SYMBOL LOCATIVE
+104D;N # MYANMAR SYMBOL COMPLETED
+104E;N # MYANMAR SYMBOL AFOREMENTIONED
+104F;N # MYANMAR SYMBOL GENITIVE
+1050;N # MYANMAR LETTER SHA
+1051;N # MYANMAR LETTER SSA
+1052;N # MYANMAR LETTER VOCALIC R
+1053;N # MYANMAR LETTER VOCALIC RR
+1054;N # MYANMAR LETTER VOCALIC L
+1055;N # MYANMAR LETTER VOCALIC LL
+1056;N # MYANMAR VOWEL SIGN VOCALIC R
+1057;N # MYANMAR VOWEL SIGN VOCALIC RR
+1058;N # MYANMAR VOWEL SIGN VOCALIC L
+1059;N # MYANMAR VOWEL SIGN VOCALIC LL
+105A;N # MYANMAR LETTER MON NGA
+105B;N # MYANMAR LETTER MON JHA
+105C;N # MYANMAR LETTER MON BBA
+105D;N # MYANMAR LETTER MON BBE
+105E;N # MYANMAR CONSONANT SIGN MON MEDIAL NA
+105F;N # MYANMAR CONSONANT SIGN MON MEDIAL MA
+1060;N # MYANMAR CONSONANT SIGN MON MEDIAL LA
+1061;N # MYANMAR LETTER SGAW KAREN SHA
+1062;N # MYANMAR VOWEL SIGN SGAW KAREN EU
+1063;N # MYANMAR TONE MARK SGAW KAREN HATHI
+1064;N # MYANMAR TONE MARK SGAW KAREN KE PHO
+1065;N # MYANMAR LETTER WESTERN PWO KAREN THA
+1066;N # MYANMAR LETTER WESTERN PWO KAREN PWA
+1067;N # MYANMAR VOWEL SIGN WESTERN PWO KAREN EU
+1068;N # MYANMAR VOWEL SIGN WESTERN PWO KAREN UE
+1069;N # MYANMAR SIGN WESTERN PWO KAREN TONE-1
+106A;N # MYANMAR SIGN WESTERN PWO KAREN TONE-2
+106B;N # MYANMAR SIGN WESTERN PWO KAREN TONE-3
+106C;N # MYANMAR SIGN WESTERN PWO KAREN TONE-4
+106D;N # MYANMAR SIGN WESTERN PWO KAREN TONE-5
+106E;N # MYANMAR LETTER EASTERN PWO KAREN NNA
+106F;N # MYANMAR LETTER EASTERN PWO KAREN YWA
+1070;N # MYANMAR LETTER EASTERN PWO KAREN GHWA
+1071;N # MYANMAR VOWEL SIGN GEBA KAREN I
+1072;N # MYANMAR VOWEL SIGN KAYAH OE
+1073;N # MYANMAR VOWEL SIGN KAYAH U
+1074;N # MYANMAR VOWEL SIGN KAYAH EE
+1075;N # MYANMAR LETTER SHAN KA
+1076;N # MYANMAR LETTER SHAN KHA
+1077;N # MYANMAR LETTER SHAN GA
+1078;N # MYANMAR LETTER SHAN CA
+1079;N # MYANMAR LETTER SHAN ZA
+107A;N # MYANMAR LETTER SHAN NYA
+107B;N # MYANMAR LETTER SHAN DA
+107C;N # MYANMAR LETTER SHAN NA
+107D;N # MYANMAR LETTER SHAN PHA
+107E;N # MYANMAR LETTER SHAN FA
+107F;N # MYANMAR LETTER SHAN BA
+1080;N # MYANMAR LETTER SHAN THA
+1081;N # MYANMAR LETTER SHAN HA
+1082;N # MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083;N # MYANMAR VOWEL SIGN SHAN AA
+1084;N # MYANMAR VOWEL SIGN SHAN E
+1085;N # MYANMAR VOWEL SIGN SHAN E ABOVE
+1086;N # MYANMAR VOWEL SIGN SHAN FINAL Y
+1087;N # MYANMAR SIGN SHAN TONE-2
+1088;N # MYANMAR SIGN SHAN TONE-3
+1089;N # MYANMAR SIGN SHAN TONE-5
+108A;N # MYANMAR SIGN SHAN TONE-6
+108B;N # MYANMAR SIGN SHAN COUNCIL TONE-2
+108C;N # MYANMAR SIGN SHAN COUNCIL TONE-3
+108D;N # MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+108E;N # MYANMAR LETTER RUMAI PALAUNG FA
+108F;N # MYANMAR SIGN RUMAI PALAUNG TONE-5
+1090;N # MYANMAR SHAN DIGIT ZERO
+1091;N # MYANMAR SHAN DIGIT ONE
+1092;N # MYANMAR SHAN DIGIT TWO
+1093;N # MYANMAR SHAN DIGIT THREE
+1094;N # MYANMAR SHAN DIGIT FOUR
+1095;N # MYANMAR SHAN DIGIT FIVE
+1096;N # MYANMAR SHAN DIGIT SIX
+1097;N # MYANMAR SHAN DIGIT SEVEN
+1098;N # MYANMAR SHAN DIGIT EIGHT
+1099;N # MYANMAR SHAN DIGIT NINE
+109E;N # MYANMAR SYMBOL SHAN ONE
+109F;N # MYANMAR SYMBOL SHAN EXCLAMATION
+10A0;N # GEORGIAN CAPITAL LETTER AN
+10A1;N # GEORGIAN CAPITAL LETTER BAN
+10A2;N # GEORGIAN CAPITAL LETTER GAN
+10A3;N # GEORGIAN CAPITAL LETTER DON
+10A4;N # GEORGIAN CAPITAL LETTER EN
+10A5;N # GEORGIAN CAPITAL LETTER VIN
+10A6;N # GEORGIAN CAPITAL LETTER ZEN
+10A7;N # GEORGIAN CAPITAL LETTER TAN
+10A8;N # GEORGIAN CAPITAL LETTER IN
+10A9;N # GEORGIAN CAPITAL LETTER KAN
+10AA;N # GEORGIAN CAPITAL LETTER LAS
+10AB;N # GEORGIAN CAPITAL LETTER MAN
+10AC;N # GEORGIAN CAPITAL LETTER NAR
+10AD;N # GEORGIAN CAPITAL LETTER ON
+10AE;N # GEORGIAN CAPITAL LETTER PAR
+10AF;N # GEORGIAN CAPITAL LETTER ZHAR
+10B0;N # GEORGIAN CAPITAL LETTER RAE
+10B1;N # GEORGIAN CAPITAL LETTER SAN
+10B2;N # GEORGIAN CAPITAL LETTER TAR
+10B3;N # GEORGIAN CAPITAL LETTER UN
+10B4;N # GEORGIAN CAPITAL LETTER PHAR
+10B5;N # GEORGIAN CAPITAL LETTER KHAR
+10B6;N # GEORGIAN CAPITAL LETTER GHAN
+10B7;N # GEORGIAN CAPITAL LETTER QAR
+10B8;N # GEORGIAN CAPITAL LETTER SHIN
+10B9;N # GEORGIAN CAPITAL LETTER CHIN
+10BA;N # GEORGIAN CAPITAL LETTER CAN
+10BB;N # GEORGIAN CAPITAL LETTER JIL
+10BC;N # GEORGIAN CAPITAL LETTER CIL
+10BD;N # GEORGIAN CAPITAL LETTER CHAR
+10BE;N # GEORGIAN CAPITAL LETTER XAN
+10BF;N # GEORGIAN CAPITAL LETTER JHAN
+10C0;N # GEORGIAN CAPITAL LETTER HAE
+10C1;N # GEORGIAN CAPITAL LETTER HE
+10C2;N # GEORGIAN CAPITAL LETTER HIE
+10C3;N # GEORGIAN CAPITAL LETTER WE
+10C4;N # GEORGIAN CAPITAL LETTER HAR
+10C5;N # GEORGIAN CAPITAL LETTER HOE
+10D0;N # GEORGIAN LETTER AN
+10D1;N # GEORGIAN LETTER BAN
+10D2;N # GEORGIAN LETTER GAN
+10D3;N # GEORGIAN LETTER DON
+10D4;N # GEORGIAN LETTER EN
+10D5;N # GEORGIAN LETTER VIN
+10D6;N # GEORGIAN LETTER ZEN
+10D7;N # GEORGIAN LETTER TAN
+10D8;N # GEORGIAN LETTER IN
+10D9;N # GEORGIAN LETTER KAN
+10DA;N # GEORGIAN LETTER LAS
+10DB;N # GEORGIAN LETTER MAN
+10DC;N # GEORGIAN LETTER NAR
+10DD;N # GEORGIAN LETTER ON
+10DE;N # GEORGIAN LETTER PAR
+10DF;N # GEORGIAN LETTER ZHAR
+10E0;N # GEORGIAN LETTER RAE
+10E1;N # GEORGIAN LETTER SAN
+10E2;N # GEORGIAN LETTER TAR
+10E3;N # GEORGIAN LETTER UN
+10E4;N # GEORGIAN LETTER PHAR
+10E5;N # GEORGIAN LETTER KHAR
+10E6;N # GEORGIAN LETTER GHAN
+10E7;N # GEORGIAN LETTER QAR
+10E8;N # GEORGIAN LETTER SHIN
+10E9;N # GEORGIAN LETTER CHIN
+10EA;N # GEORGIAN LETTER CAN
+10EB;N # GEORGIAN LETTER JIL
+10EC;N # GEORGIAN LETTER CIL
+10ED;N # GEORGIAN LETTER CHAR
+10EE;N # GEORGIAN LETTER XAN
+10EF;N # GEORGIAN LETTER JHAN
+10F0;N # GEORGIAN LETTER HAE
+10F1;N # GEORGIAN LETTER HE
+10F2;N # GEORGIAN LETTER HIE
+10F3;N # GEORGIAN LETTER WE
+10F4;N # GEORGIAN LETTER HAR
+10F5;N # GEORGIAN LETTER HOE
+10F6;N # GEORGIAN LETTER FI
+10F7;N # GEORGIAN LETTER YN
+10F8;N # GEORGIAN LETTER ELIFI
+10F9;N # GEORGIAN LETTER TURNED GAN
+10FA;N # GEORGIAN LETTER AIN
+10FB;N # GEORGIAN PARAGRAPH SEPARATOR
+10FC;N # MODIFIER LETTER GEORGIAN NAR
+1100;W # HANGUL CHOSEONG KIYEOK
+1101;W # HANGUL CHOSEONG SSANGKIYEOK
+1102;W # HANGUL CHOSEONG NIEUN
+1103;W # HANGUL CHOSEONG TIKEUT
+1104;W # HANGUL CHOSEONG SSANGTIKEUT
+1105;W # HANGUL CHOSEONG RIEUL
+1106;W # HANGUL CHOSEONG MIEUM
+1107;W # HANGUL CHOSEONG PIEUP
+1108;W # HANGUL CHOSEONG SSANGPIEUP
+1109;W # HANGUL CHOSEONG SIOS
+110A;W # HANGUL CHOSEONG SSANGSIOS
+110B;W # HANGUL CHOSEONG IEUNG
+110C;W # HANGUL CHOSEONG CIEUC
+110D;W # HANGUL CHOSEONG SSANGCIEUC
+110E;W # HANGUL CHOSEONG CHIEUCH
+110F;W # HANGUL CHOSEONG KHIEUKH
+1110;W # HANGUL CHOSEONG THIEUTH
+1111;W # HANGUL CHOSEONG PHIEUPH
+1112;W # HANGUL CHOSEONG HIEUH
+1113;W # HANGUL CHOSEONG NIEUN-KIYEOK
+1114;W # HANGUL CHOSEONG SSANGNIEUN
+1115;W # HANGUL CHOSEONG NIEUN-TIKEUT
+1116;W # HANGUL CHOSEONG NIEUN-PIEUP
+1117;W # HANGUL CHOSEONG TIKEUT-KIYEOK
+1118;W # HANGUL CHOSEONG RIEUL-NIEUN
+1119;W # HANGUL CHOSEONG SSANGRIEUL
+111A;W # HANGUL CHOSEONG RIEUL-HIEUH
+111B;W # HANGUL CHOSEONG KAPYEOUNRIEUL
+111C;W # HANGUL CHOSEONG MIEUM-PIEUP
+111D;W # HANGUL CHOSEONG KAPYEOUNMIEUM
+111E;W # HANGUL CHOSEONG PIEUP-KIYEOK
+111F;W # HANGUL CHOSEONG PIEUP-NIEUN
+1120;W # HANGUL CHOSEONG PIEUP-TIKEUT
+1121;W # HANGUL CHOSEONG PIEUP-SIOS
+1122;W # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123;W # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124;W # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125;W # HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126;W # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127;W # HANGUL CHOSEONG PIEUP-CIEUC
+1128;W # HANGUL CHOSEONG PIEUP-CHIEUCH
+1129;W # HANGUL CHOSEONG PIEUP-THIEUTH
+112A;W # HANGUL CHOSEONG PIEUP-PHIEUPH
+112B;W # HANGUL CHOSEONG KAPYEOUNPIEUP
+112C;W # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D;W # HANGUL CHOSEONG SIOS-KIYEOK
+112E;W # HANGUL CHOSEONG SIOS-NIEUN
+112F;W # HANGUL CHOSEONG SIOS-TIKEUT
+1130;W # HANGUL CHOSEONG SIOS-RIEUL
+1131;W # HANGUL CHOSEONG SIOS-MIEUM
+1132;W # HANGUL CHOSEONG SIOS-PIEUP
+1133;W # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134;W # HANGUL CHOSEONG SIOS-SSANGSIOS
+1135;W # HANGUL CHOSEONG SIOS-IEUNG
+1136;W # HANGUL CHOSEONG SIOS-CIEUC
+1137;W # HANGUL CHOSEONG SIOS-CHIEUCH
+1138;W # HANGUL CHOSEONG SIOS-KHIEUKH
+1139;W # HANGUL CHOSEONG SIOS-THIEUTH
+113A;W # HANGUL CHOSEONG SIOS-PHIEUPH
+113B;W # HANGUL CHOSEONG SIOS-HIEUH
+113C;W # HANGUL CHOSEONG CHITUEUMSIOS
+113D;W # HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E;W # HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F;W # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140;W # HANGUL CHOSEONG PANSIOS
+1141;W # HANGUL CHOSEONG IEUNG-KIYEOK
+1142;W # HANGUL CHOSEONG IEUNG-TIKEUT
+1143;W # HANGUL CHOSEONG IEUNG-MIEUM
+1144;W # HANGUL CHOSEONG IEUNG-PIEUP
+1145;W # HANGUL CHOSEONG IEUNG-SIOS
+1146;W # HANGUL CHOSEONG IEUNG-PANSIOS
+1147;W # HANGUL CHOSEONG SSANGIEUNG
+1148;W # HANGUL CHOSEONG IEUNG-CIEUC
+1149;W # HANGUL CHOSEONG IEUNG-CHIEUCH
+114A;W # HANGUL CHOSEONG IEUNG-THIEUTH
+114B;W # HANGUL CHOSEONG IEUNG-PHIEUPH
+114C;W # HANGUL CHOSEONG YESIEUNG
+114D;W # HANGUL CHOSEONG CIEUC-IEUNG
+114E;W # HANGUL CHOSEONG CHITUEUMCIEUC
+114F;W # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150;W # HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151;W # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152;W # HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153;W # HANGUL CHOSEONG CHIEUCH-HIEUH
+1154;W # HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155;W # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156;W # HANGUL CHOSEONG PHIEUPH-PIEUP
+1157;W # HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158;W # HANGUL CHOSEONG SSANGHIEUH
+1159;W # HANGUL CHOSEONG YEORINHIEUH
+115F;W # HANGUL CHOSEONG FILLER
+1160;N # HANGUL JUNGSEONG FILLER
+1161;N # HANGUL JUNGSEONG A
+1162;N # HANGUL JUNGSEONG AE
+1163;N # HANGUL JUNGSEONG YA
+1164;N # HANGUL JUNGSEONG YAE
+1165;N # HANGUL JUNGSEONG EO
+1166;N # HANGUL JUNGSEONG E
+1167;N # HANGUL JUNGSEONG YEO
+1168;N # HANGUL JUNGSEONG YE
+1169;N # HANGUL JUNGSEONG O
+116A;N # HANGUL JUNGSEONG WA
+116B;N # HANGUL JUNGSEONG WAE
+116C;N # HANGUL JUNGSEONG OE
+116D;N # HANGUL JUNGSEONG YO
+116E;N # HANGUL JUNGSEONG U
+116F;N # HANGUL JUNGSEONG WEO
+1170;N # HANGUL JUNGSEONG WE
+1171;N # HANGUL JUNGSEONG WI
+1172;N # HANGUL JUNGSEONG YU
+1173;N # HANGUL JUNGSEONG EU
+1174;N # HANGUL JUNGSEONG YI
+1175;N # HANGUL JUNGSEONG I
+1176;N # HANGUL JUNGSEONG A-O
+1177;N # HANGUL JUNGSEONG A-U
+1178;N # HANGUL JUNGSEONG YA-O
+1179;N # HANGUL JUNGSEONG YA-YO
+117A;N # HANGUL JUNGSEONG EO-O
+117B;N # HANGUL JUNGSEONG EO-U
+117C;N # HANGUL JUNGSEONG EO-EU
+117D;N # HANGUL JUNGSEONG YEO-O
+117E;N # HANGUL JUNGSEONG YEO-U
+117F;N # HANGUL JUNGSEONG O-EO
+1180;N # HANGUL JUNGSEONG O-E
+1181;N # HANGUL JUNGSEONG O-YE
+1182;N # HANGUL JUNGSEONG O-O
+1183;N # HANGUL JUNGSEONG O-U
+1184;N # HANGUL JUNGSEONG YO-YA
+1185;N # HANGUL JUNGSEONG YO-YAE
+1186;N # HANGUL JUNGSEONG YO-YEO
+1187;N # HANGUL JUNGSEONG YO-O
+1188;N # HANGUL JUNGSEONG YO-I
+1189;N # HANGUL JUNGSEONG U-A
+118A;N # HANGUL JUNGSEONG U-AE
+118B;N # HANGUL JUNGSEONG U-EO-EU
+118C;N # HANGUL JUNGSEONG U-YE
+118D;N # HANGUL JUNGSEONG U-U
+118E;N # HANGUL JUNGSEONG YU-A
+118F;N # HANGUL JUNGSEONG YU-EO
+1190;N # HANGUL JUNGSEONG YU-E
+1191;N # HANGUL JUNGSEONG YU-YEO
+1192;N # HANGUL JUNGSEONG YU-YE
+1193;N # HANGUL JUNGSEONG YU-U
+1194;N # HANGUL JUNGSEONG YU-I
+1195;N # HANGUL JUNGSEONG EU-U
+1196;N # HANGUL JUNGSEONG EU-EU
+1197;N # HANGUL JUNGSEONG YI-U
+1198;N # HANGUL JUNGSEONG I-A
+1199;N # HANGUL JUNGSEONG I-YA
+119A;N # HANGUL JUNGSEONG I-O
+119B;N # HANGUL JUNGSEONG I-U
+119C;N # HANGUL JUNGSEONG I-EU
+119D;N # HANGUL JUNGSEONG I-ARAEA
+119E;N # HANGUL JUNGSEONG ARAEA
+119F;N # HANGUL JUNGSEONG ARAEA-EO
+11A0;N # HANGUL JUNGSEONG ARAEA-U
+11A1;N # HANGUL JUNGSEONG ARAEA-I
+11A2;N # HANGUL JUNGSEONG SSANGARAEA
+11A8;N # HANGUL JONGSEONG KIYEOK
+11A9;N # HANGUL JONGSEONG SSANGKIYEOK
+11AA;N # HANGUL JONGSEONG KIYEOK-SIOS
+11AB;N # HANGUL JONGSEONG NIEUN
+11AC;N # HANGUL JONGSEONG NIEUN-CIEUC
+11AD;N # HANGUL JONGSEONG NIEUN-HIEUH
+11AE;N # HANGUL JONGSEONG TIKEUT
+11AF;N # HANGUL JONGSEONG RIEUL
+11B0;N # HANGUL JONGSEONG RIEUL-KIYEOK
+11B1;N # HANGUL JONGSEONG RIEUL-MIEUM
+11B2;N # HANGUL JONGSEONG RIEUL-PIEUP
+11B3;N # HANGUL JONGSEONG RIEUL-SIOS
+11B4;N # HANGUL JONGSEONG RIEUL-THIEUTH
+11B5;N # HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6;N # HANGUL JONGSEONG RIEUL-HIEUH
+11B7;N # HANGUL JONGSEONG MIEUM
+11B8;N # HANGUL JONGSEONG PIEUP
+11B9;N # HANGUL JONGSEONG PIEUP-SIOS
+11BA;N # HANGUL JONGSEONG SIOS
+11BB;N # HANGUL JONGSEONG SSANGSIOS
+11BC;N # HANGUL JONGSEONG IEUNG
+11BD;N # HANGUL JONGSEONG CIEUC
+11BE;N # HANGUL JONGSEONG CHIEUCH
+11BF;N # HANGUL JONGSEONG KHIEUKH
+11C0;N # HANGUL JONGSEONG THIEUTH
+11C1;N # HANGUL JONGSEONG PHIEUPH
+11C2;N # HANGUL JONGSEONG HIEUH
+11C3;N # HANGUL JONGSEONG KIYEOK-RIEUL
+11C4;N # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5;N # HANGUL JONGSEONG NIEUN-KIYEOK
+11C6;N # HANGUL JONGSEONG NIEUN-TIKEUT
+11C7;N # HANGUL JONGSEONG NIEUN-SIOS
+11C8;N # HANGUL JONGSEONG NIEUN-PANSIOS
+11C9;N # HANGUL JONGSEONG NIEUN-THIEUTH
+11CA;N # HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB;N # HANGUL JONGSEONG TIKEUT-RIEUL
+11CC;N # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD;N # HANGUL JONGSEONG RIEUL-NIEUN
+11CE;N # HANGUL JONGSEONG RIEUL-TIKEUT
+11CF;N # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0;N # HANGUL JONGSEONG SSANGRIEUL
+11D1;N # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2;N # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3;N # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4;N # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5;N # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6;N # HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7;N # HANGUL JONGSEONG RIEUL-PANSIOS
+11D8;N # HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9;N # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA;N # HANGUL JONGSEONG MIEUM-KIYEOK
+11DB;N # HANGUL JONGSEONG MIEUM-RIEUL
+11DC;N # HANGUL JONGSEONG MIEUM-PIEUP
+11DD;N # HANGUL JONGSEONG MIEUM-SIOS
+11DE;N # HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF;N # HANGUL JONGSEONG MIEUM-PANSIOS
+11E0;N # HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1;N # HANGUL JONGSEONG MIEUM-HIEUH
+11E2;N # HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3;N # HANGUL JONGSEONG PIEUP-RIEUL
+11E4;N # HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5;N # HANGUL JONGSEONG PIEUP-HIEUH
+11E6;N # HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7;N # HANGUL JONGSEONG SIOS-KIYEOK
+11E8;N # HANGUL JONGSEONG SIOS-TIKEUT
+11E9;N # HANGUL JONGSEONG SIOS-RIEUL
+11EA;N # HANGUL JONGSEONG SIOS-PIEUP
+11EB;N # HANGUL JONGSEONG PANSIOS
+11EC;N # HANGUL JONGSEONG IEUNG-KIYEOK
+11ED;N # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE;N # HANGUL JONGSEONG SSANGIEUNG
+11EF;N # HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0;N # HANGUL JONGSEONG YESIEUNG
+11F1;N # HANGUL JONGSEONG YESIEUNG-SIOS
+11F2;N # HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3;N # HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4;N # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5;N # HANGUL JONGSEONG HIEUH-NIEUN
+11F6;N # HANGUL JONGSEONG HIEUH-RIEUL
+11F7;N # HANGUL JONGSEONG HIEUH-MIEUM
+11F8;N # HANGUL JONGSEONG HIEUH-PIEUP
+11F9;N # HANGUL JONGSEONG YEORINHIEUH
+1200;N # ETHIOPIC SYLLABLE HA
+1201;N # ETHIOPIC SYLLABLE HU
+1202;N # ETHIOPIC SYLLABLE HI
+1203;N # ETHIOPIC SYLLABLE HAA
+1204;N # ETHIOPIC SYLLABLE HEE
+1205;N # ETHIOPIC SYLLABLE HE
+1206;N # ETHIOPIC SYLLABLE HO
+1207;N # ETHIOPIC SYLLABLE HOA
+1208;N # ETHIOPIC SYLLABLE LA
+1209;N # ETHIOPIC SYLLABLE LU
+120A;N # ETHIOPIC SYLLABLE LI
+120B;N # ETHIOPIC SYLLABLE LAA
+120C;N # ETHIOPIC SYLLABLE LEE
+120D;N # ETHIOPIC SYLLABLE LE
+120E;N # ETHIOPIC SYLLABLE LO
+120F;N # ETHIOPIC SYLLABLE LWA
+1210;N # ETHIOPIC SYLLABLE HHA
+1211;N # ETHIOPIC SYLLABLE HHU
+1212;N # ETHIOPIC SYLLABLE HHI
+1213;N # ETHIOPIC SYLLABLE HHAA
+1214;N # ETHIOPIC SYLLABLE HHEE
+1215;N # ETHIOPIC SYLLABLE HHE
+1216;N # ETHIOPIC SYLLABLE HHO
+1217;N # ETHIOPIC SYLLABLE HHWA
+1218;N # ETHIOPIC SYLLABLE MA
+1219;N # ETHIOPIC SYLLABLE MU
+121A;N # ETHIOPIC SYLLABLE MI
+121B;N # ETHIOPIC SYLLABLE MAA
+121C;N # ETHIOPIC SYLLABLE MEE
+121D;N # ETHIOPIC SYLLABLE ME
+121E;N # ETHIOPIC SYLLABLE MO
+121F;N # ETHIOPIC SYLLABLE MWA
+1220;N # ETHIOPIC SYLLABLE SZA
+1221;N # ETHIOPIC SYLLABLE SZU
+1222;N # ETHIOPIC SYLLABLE SZI
+1223;N # ETHIOPIC SYLLABLE SZAA
+1224;N # ETHIOPIC SYLLABLE SZEE
+1225;N # ETHIOPIC SYLLABLE SZE
+1226;N # ETHIOPIC SYLLABLE SZO
+1227;N # ETHIOPIC SYLLABLE SZWA
+1228;N # ETHIOPIC SYLLABLE RA
+1229;N # ETHIOPIC SYLLABLE RU
+122A;N # ETHIOPIC SYLLABLE RI
+122B;N # ETHIOPIC SYLLABLE RAA
+122C;N # ETHIOPIC SYLLABLE REE
+122D;N # ETHIOPIC SYLLABLE RE
+122E;N # ETHIOPIC SYLLABLE RO
+122F;N # ETHIOPIC SYLLABLE RWA
+1230;N # ETHIOPIC SYLLABLE SA
+1231;N # ETHIOPIC SYLLABLE SU
+1232;N # ETHIOPIC SYLLABLE SI
+1233;N # ETHIOPIC SYLLABLE SAA
+1234;N # ETHIOPIC SYLLABLE SEE
+1235;N # ETHIOPIC SYLLABLE SE
+1236;N # ETHIOPIC SYLLABLE SO
+1237;N # ETHIOPIC SYLLABLE SWA
+1238;N # ETHIOPIC SYLLABLE SHA
+1239;N # ETHIOPIC SYLLABLE SHU
+123A;N # ETHIOPIC SYLLABLE SHI
+123B;N # ETHIOPIC SYLLABLE SHAA
+123C;N # ETHIOPIC SYLLABLE SHEE
+123D;N # ETHIOPIC SYLLABLE SHE
+123E;N # ETHIOPIC SYLLABLE SHO
+123F;N # ETHIOPIC SYLLABLE SHWA
+1240;N # ETHIOPIC SYLLABLE QA
+1241;N # ETHIOPIC SYLLABLE QU
+1242;N # ETHIOPIC SYLLABLE QI
+1243;N # ETHIOPIC SYLLABLE QAA
+1244;N # ETHIOPIC SYLLABLE QEE
+1245;N # ETHIOPIC SYLLABLE QE
+1246;N # ETHIOPIC SYLLABLE QO
+1247;N # ETHIOPIC SYLLABLE QOA
+1248;N # ETHIOPIC SYLLABLE QWA
+124A;N # ETHIOPIC SYLLABLE QWI
+124B;N # ETHIOPIC SYLLABLE QWAA
+124C;N # ETHIOPIC SYLLABLE QWEE
+124D;N # ETHIOPIC SYLLABLE QWE
+1250;N # ETHIOPIC SYLLABLE QHA
+1251;N # ETHIOPIC SYLLABLE QHU
+1252;N # ETHIOPIC SYLLABLE QHI
+1253;N # ETHIOPIC SYLLABLE QHAA
+1254;N # ETHIOPIC SYLLABLE QHEE
+1255;N # ETHIOPIC SYLLABLE QHE
+1256;N # ETHIOPIC SYLLABLE QHO
+1258;N # ETHIOPIC SYLLABLE QHWA
+125A;N # ETHIOPIC SYLLABLE QHWI
+125B;N # ETHIOPIC SYLLABLE QHWAA
+125C;N # ETHIOPIC SYLLABLE QHWEE
+125D;N # ETHIOPIC SYLLABLE QHWE
+1260;N # ETHIOPIC SYLLABLE BA
+1261;N # ETHIOPIC SYLLABLE BU
+1262;N # ETHIOPIC SYLLABLE BI
+1263;N # ETHIOPIC SYLLABLE BAA
+1264;N # ETHIOPIC SYLLABLE BEE
+1265;N # ETHIOPIC SYLLABLE BE
+1266;N # ETHIOPIC SYLLABLE BO
+1267;N # ETHIOPIC SYLLABLE BWA
+1268;N # ETHIOPIC SYLLABLE VA
+1269;N # ETHIOPIC SYLLABLE VU
+126A;N # ETHIOPIC SYLLABLE VI
+126B;N # ETHIOPIC SYLLABLE VAA
+126C;N # ETHIOPIC SYLLABLE VEE
+126D;N # ETHIOPIC SYLLABLE VE
+126E;N # ETHIOPIC SYLLABLE VO
+126F;N # ETHIOPIC SYLLABLE VWA
+1270;N # ETHIOPIC SYLLABLE TA
+1271;N # ETHIOPIC SYLLABLE TU
+1272;N # ETHIOPIC SYLLABLE TI
+1273;N # ETHIOPIC SYLLABLE TAA
+1274;N # ETHIOPIC SYLLABLE TEE
+1275;N # ETHIOPIC SYLLABLE TE
+1276;N # ETHIOPIC SYLLABLE TO
+1277;N # ETHIOPIC SYLLABLE TWA
+1278;N # ETHIOPIC SYLLABLE CA
+1279;N # ETHIOPIC SYLLABLE CU
+127A;N # ETHIOPIC SYLLABLE CI
+127B;N # ETHIOPIC SYLLABLE CAA
+127C;N # ETHIOPIC SYLLABLE CEE
+127D;N # ETHIOPIC SYLLABLE CE
+127E;N # ETHIOPIC SYLLABLE CO
+127F;N # ETHIOPIC SYLLABLE CWA
+1280;N # ETHIOPIC SYLLABLE XA
+1281;N # ETHIOPIC SYLLABLE XU
+1282;N # ETHIOPIC SYLLABLE XI
+1283;N # ETHIOPIC SYLLABLE XAA
+1284;N # ETHIOPIC SYLLABLE XEE
+1285;N # ETHIOPIC SYLLABLE XE
+1286;N # ETHIOPIC SYLLABLE XO
+1287;N # ETHIOPIC SYLLABLE XOA
+1288;N # ETHIOPIC SYLLABLE XWA
+128A;N # ETHIOPIC SYLLABLE XWI
+128B;N # ETHIOPIC SYLLABLE XWAA
+128C;N # ETHIOPIC SYLLABLE XWEE
+128D;N # ETHIOPIC SYLLABLE XWE
+1290;N # ETHIOPIC SYLLABLE NA
+1291;N # ETHIOPIC SYLLABLE NU
+1292;N # ETHIOPIC SYLLABLE NI
+1293;N # ETHIOPIC SYLLABLE NAA
+1294;N # ETHIOPIC SYLLABLE NEE
+1295;N # ETHIOPIC SYLLABLE NE
+1296;N # ETHIOPIC SYLLABLE NO
+1297;N # ETHIOPIC SYLLABLE NWA
+1298;N # ETHIOPIC SYLLABLE NYA
+1299;N # ETHIOPIC SYLLABLE NYU
+129A;N # ETHIOPIC SYLLABLE NYI
+129B;N # ETHIOPIC SYLLABLE NYAA
+129C;N # ETHIOPIC SYLLABLE NYEE
+129D;N # ETHIOPIC SYLLABLE NYE
+129E;N # ETHIOPIC SYLLABLE NYO
+129F;N # ETHIOPIC SYLLABLE NYWA
+12A0;N # ETHIOPIC SYLLABLE GLOTTAL A
+12A1;N # ETHIOPIC SYLLABLE GLOTTAL U
+12A2;N # ETHIOPIC SYLLABLE GLOTTAL I
+12A3;N # ETHIOPIC SYLLABLE GLOTTAL AA
+12A4;N # ETHIOPIC SYLLABLE GLOTTAL EE
+12A5;N # ETHIOPIC SYLLABLE GLOTTAL E
+12A6;N # ETHIOPIC SYLLABLE GLOTTAL O
+12A7;N # ETHIOPIC SYLLABLE GLOTTAL WA
+12A8;N # ETHIOPIC SYLLABLE KA
+12A9;N # ETHIOPIC SYLLABLE KU
+12AA;N # ETHIOPIC SYLLABLE KI
+12AB;N # ETHIOPIC SYLLABLE KAA
+12AC;N # ETHIOPIC SYLLABLE KEE
+12AD;N # ETHIOPIC SYLLABLE KE
+12AE;N # ETHIOPIC SYLLABLE KO
+12AF;N # ETHIOPIC SYLLABLE KOA
+12B0;N # ETHIOPIC SYLLABLE KWA
+12B2;N # ETHIOPIC SYLLABLE KWI
+12B3;N # ETHIOPIC SYLLABLE KWAA
+12B4;N # ETHIOPIC SYLLABLE KWEE
+12B5;N # ETHIOPIC SYLLABLE KWE
+12B8;N # ETHIOPIC SYLLABLE KXA
+12B9;N # ETHIOPIC SYLLABLE KXU
+12BA;N # ETHIOPIC SYLLABLE KXI
+12BB;N # ETHIOPIC SYLLABLE KXAA
+12BC;N # ETHIOPIC SYLLABLE KXEE
+12BD;N # ETHIOPIC SYLLABLE KXE
+12BE;N # ETHIOPIC SYLLABLE KXO
+12C0;N # ETHIOPIC SYLLABLE KXWA
+12C2;N # ETHIOPIC SYLLABLE KXWI
+12C3;N # ETHIOPIC SYLLABLE KXWAA
+12C4;N # ETHIOPIC SYLLABLE KXWEE
+12C5;N # ETHIOPIC SYLLABLE KXWE
+12C8;N # ETHIOPIC SYLLABLE WA
+12C9;N # ETHIOPIC SYLLABLE WU
+12CA;N # ETHIOPIC SYLLABLE WI
+12CB;N # ETHIOPIC SYLLABLE WAA
+12CC;N # ETHIOPIC SYLLABLE WEE
+12CD;N # ETHIOPIC SYLLABLE WE
+12CE;N # ETHIOPIC SYLLABLE WO
+12CF;N # ETHIOPIC SYLLABLE WOA
+12D0;N # ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1;N # ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2;N # ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3;N # ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4;N # ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5;N # ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6;N # ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8;N # ETHIOPIC SYLLABLE ZA
+12D9;N # ETHIOPIC SYLLABLE ZU
+12DA;N # ETHIOPIC SYLLABLE ZI
+12DB;N # ETHIOPIC SYLLABLE ZAA
+12DC;N # ETHIOPIC SYLLABLE ZEE
+12DD;N # ETHIOPIC SYLLABLE ZE
+12DE;N # ETHIOPIC SYLLABLE ZO
+12DF;N # ETHIOPIC SYLLABLE ZWA
+12E0;N # ETHIOPIC SYLLABLE ZHA
+12E1;N # ETHIOPIC SYLLABLE ZHU
+12E2;N # ETHIOPIC SYLLABLE ZHI
+12E3;N # ETHIOPIC SYLLABLE ZHAA
+12E4;N # ETHIOPIC SYLLABLE ZHEE
+12E5;N # ETHIOPIC SYLLABLE ZHE
+12E6;N # ETHIOPIC SYLLABLE ZHO
+12E7;N # ETHIOPIC SYLLABLE ZHWA
+12E8;N # ETHIOPIC SYLLABLE YA
+12E9;N # ETHIOPIC SYLLABLE YU
+12EA;N # ETHIOPIC SYLLABLE YI
+12EB;N # ETHIOPIC SYLLABLE YAA
+12EC;N # ETHIOPIC SYLLABLE YEE
+12ED;N # ETHIOPIC SYLLABLE YE
+12EE;N # ETHIOPIC SYLLABLE YO
+12EF;N # ETHIOPIC SYLLABLE YOA
+12F0;N # ETHIOPIC SYLLABLE DA
+12F1;N # ETHIOPIC SYLLABLE DU
+12F2;N # ETHIOPIC SYLLABLE DI
+12F3;N # ETHIOPIC SYLLABLE DAA
+12F4;N # ETHIOPIC SYLLABLE DEE
+12F5;N # ETHIOPIC SYLLABLE DE
+12F6;N # ETHIOPIC SYLLABLE DO
+12F7;N # ETHIOPIC SYLLABLE DWA
+12F8;N # ETHIOPIC SYLLABLE DDA
+12F9;N # ETHIOPIC SYLLABLE DDU
+12FA;N # ETHIOPIC SYLLABLE DDI
+12FB;N # ETHIOPIC SYLLABLE DDAA
+12FC;N # ETHIOPIC SYLLABLE DDEE
+12FD;N # ETHIOPIC SYLLABLE DDE
+12FE;N # ETHIOPIC SYLLABLE DDO
+12FF;N # ETHIOPIC SYLLABLE DDWA
+1300;N # ETHIOPIC SYLLABLE JA
+1301;N # ETHIOPIC SYLLABLE JU
+1302;N # ETHIOPIC SYLLABLE JI
+1303;N # ETHIOPIC SYLLABLE JAA
+1304;N # ETHIOPIC SYLLABLE JEE
+1305;N # ETHIOPIC SYLLABLE JE
+1306;N # ETHIOPIC SYLLABLE JO
+1307;N # ETHIOPIC SYLLABLE JWA
+1308;N # ETHIOPIC SYLLABLE GA
+1309;N # ETHIOPIC SYLLABLE GU
+130A;N # ETHIOPIC SYLLABLE GI
+130B;N # ETHIOPIC SYLLABLE GAA
+130C;N # ETHIOPIC SYLLABLE GEE
+130D;N # ETHIOPIC SYLLABLE GE
+130E;N # ETHIOPIC SYLLABLE GO
+130F;N # ETHIOPIC SYLLABLE GOA
+1310;N # ETHIOPIC SYLLABLE GWA
+1312;N # ETHIOPIC SYLLABLE GWI
+1313;N # ETHIOPIC SYLLABLE GWAA
+1314;N # ETHIOPIC SYLLABLE GWEE
+1315;N # ETHIOPIC SYLLABLE GWE
+1318;N # ETHIOPIC SYLLABLE GGA
+1319;N # ETHIOPIC SYLLABLE GGU
+131A;N # ETHIOPIC SYLLABLE GGI
+131B;N # ETHIOPIC SYLLABLE GGAA
+131C;N # ETHIOPIC SYLLABLE GGEE
+131D;N # ETHIOPIC SYLLABLE GGE
+131E;N # ETHIOPIC SYLLABLE GGO
+131F;N # ETHIOPIC SYLLABLE GGWAA
+1320;N # ETHIOPIC SYLLABLE THA
+1321;N # ETHIOPIC SYLLABLE THU
+1322;N # ETHIOPIC SYLLABLE THI
+1323;N # ETHIOPIC SYLLABLE THAA
+1324;N # ETHIOPIC SYLLABLE THEE
+1325;N # ETHIOPIC SYLLABLE THE
+1326;N # ETHIOPIC SYLLABLE THO
+1327;N # ETHIOPIC SYLLABLE THWA
+1328;N # ETHIOPIC SYLLABLE CHA
+1329;N # ETHIOPIC SYLLABLE CHU
+132A;N # ETHIOPIC SYLLABLE CHI
+132B;N # ETHIOPIC SYLLABLE CHAA
+132C;N # ETHIOPIC SYLLABLE CHEE
+132D;N # ETHIOPIC SYLLABLE CHE
+132E;N # ETHIOPIC SYLLABLE CHO
+132F;N # ETHIOPIC SYLLABLE CHWA
+1330;N # ETHIOPIC SYLLABLE PHA
+1331;N # ETHIOPIC SYLLABLE PHU
+1332;N # ETHIOPIC SYLLABLE PHI
+1333;N # ETHIOPIC SYLLABLE PHAA
+1334;N # ETHIOPIC SYLLABLE PHEE
+1335;N # ETHIOPIC SYLLABLE PHE
+1336;N # ETHIOPIC SYLLABLE PHO
+1337;N # ETHIOPIC SYLLABLE PHWA
+1338;N # ETHIOPIC SYLLABLE TSA
+1339;N # ETHIOPIC SYLLABLE TSU
+133A;N # ETHIOPIC SYLLABLE TSI
+133B;N # ETHIOPIC SYLLABLE TSAA
+133C;N # ETHIOPIC SYLLABLE TSEE
+133D;N # ETHIOPIC SYLLABLE TSE
+133E;N # ETHIOPIC SYLLABLE TSO
+133F;N # ETHIOPIC SYLLABLE TSWA
+1340;N # ETHIOPIC SYLLABLE TZA
+1341;N # ETHIOPIC SYLLABLE TZU
+1342;N # ETHIOPIC SYLLABLE TZI
+1343;N # ETHIOPIC SYLLABLE TZAA
+1344;N # ETHIOPIC SYLLABLE TZEE
+1345;N # ETHIOPIC SYLLABLE TZE
+1346;N # ETHIOPIC SYLLABLE TZO
+1347;N # ETHIOPIC SYLLABLE TZOA
+1348;N # ETHIOPIC SYLLABLE FA
+1349;N # ETHIOPIC SYLLABLE FU
+134A;N # ETHIOPIC SYLLABLE FI
+134B;N # ETHIOPIC SYLLABLE FAA
+134C;N # ETHIOPIC SYLLABLE FEE
+134D;N # ETHIOPIC SYLLABLE FE
+134E;N # ETHIOPIC SYLLABLE FO
+134F;N # ETHIOPIC SYLLABLE FWA
+1350;N # ETHIOPIC SYLLABLE PA
+1351;N # ETHIOPIC SYLLABLE PU
+1352;N # ETHIOPIC SYLLABLE PI
+1353;N # ETHIOPIC SYLLABLE PAA
+1354;N # ETHIOPIC SYLLABLE PEE
+1355;N # ETHIOPIC SYLLABLE PE
+1356;N # ETHIOPIC SYLLABLE PO
+1357;N # ETHIOPIC SYLLABLE PWA
+1358;N # ETHIOPIC SYLLABLE RYA
+1359;N # ETHIOPIC SYLLABLE MYA
+135A;N # ETHIOPIC SYLLABLE FYA
+135F;N # ETHIOPIC COMBINING GEMINATION MARK
+1360;N # ETHIOPIC SECTION MARK
+1361;N # ETHIOPIC WORDSPACE
+1362;N # ETHIOPIC FULL STOP
+1363;N # ETHIOPIC COMMA
+1364;N # ETHIOPIC SEMICOLON
+1365;N # ETHIOPIC COLON
+1366;N # ETHIOPIC PREFACE COLON
+1367;N # ETHIOPIC QUESTION MARK
+1368;N # ETHIOPIC PARAGRAPH SEPARATOR
+1369;N # ETHIOPIC DIGIT ONE
+136A;N # ETHIOPIC DIGIT TWO
+136B;N # ETHIOPIC DIGIT THREE
+136C;N # ETHIOPIC DIGIT FOUR
+136D;N # ETHIOPIC DIGIT FIVE
+136E;N # ETHIOPIC DIGIT SIX
+136F;N # ETHIOPIC DIGIT SEVEN
+1370;N # ETHIOPIC DIGIT EIGHT
+1371;N # ETHIOPIC DIGIT NINE
+1372;N # ETHIOPIC NUMBER TEN
+1373;N # ETHIOPIC NUMBER TWENTY
+1374;N # ETHIOPIC NUMBER THIRTY
+1375;N # ETHIOPIC NUMBER FORTY
+1376;N # ETHIOPIC NUMBER FIFTY
+1377;N # ETHIOPIC NUMBER SIXTY
+1378;N # ETHIOPIC NUMBER SEVENTY
+1379;N # ETHIOPIC NUMBER EIGHTY
+137A;N # ETHIOPIC NUMBER NINETY
+137B;N # ETHIOPIC NUMBER HUNDRED
+137C;N # ETHIOPIC NUMBER TEN THOUSAND
+1380;N # ETHIOPIC SYLLABLE SEBATBEIT MWA
+1381;N # ETHIOPIC SYLLABLE MWI
+1382;N # ETHIOPIC SYLLABLE MWEE
+1383;N # ETHIOPIC SYLLABLE MWE
+1384;N # ETHIOPIC SYLLABLE SEBATBEIT BWA
+1385;N # ETHIOPIC SYLLABLE BWI
+1386;N # ETHIOPIC SYLLABLE BWEE
+1387;N # ETHIOPIC SYLLABLE BWE
+1388;N # ETHIOPIC SYLLABLE SEBATBEIT FWA
+1389;N # ETHIOPIC SYLLABLE FWI
+138A;N # ETHIOPIC SYLLABLE FWEE
+138B;N # ETHIOPIC SYLLABLE FWE
+138C;N # ETHIOPIC SYLLABLE SEBATBEIT PWA
+138D;N # ETHIOPIC SYLLABLE PWI
+138E;N # ETHIOPIC SYLLABLE PWEE
+138F;N # ETHIOPIC SYLLABLE PWE
+1390;N # ETHIOPIC TONAL MARK YIZET
+1391;N # ETHIOPIC TONAL MARK DERET
+1392;N # ETHIOPIC TONAL MARK RIKRIK
+1393;N # ETHIOPIC TONAL MARK SHORT RIKRIK
+1394;N # ETHIOPIC TONAL MARK DIFAT
+1395;N # ETHIOPIC TONAL MARK KENAT
+1396;N # ETHIOPIC TONAL MARK CHIRET
+1397;N # ETHIOPIC TONAL MARK HIDET
+1398;N # ETHIOPIC TONAL MARK DERET-HIDET
+1399;N # ETHIOPIC TONAL MARK KURT
+13A0;N # CHEROKEE LETTER A
+13A1;N # CHEROKEE LETTER E
+13A2;N # CHEROKEE LETTER I
+13A3;N # CHEROKEE LETTER O
+13A4;N # CHEROKEE LETTER U
+13A5;N # CHEROKEE LETTER V
+13A6;N # CHEROKEE LETTER GA
+13A7;N # CHEROKEE LETTER KA
+13A8;N # CHEROKEE LETTER GE
+13A9;N # CHEROKEE LETTER GI
+13AA;N # CHEROKEE LETTER GO
+13AB;N # CHEROKEE LETTER GU
+13AC;N # CHEROKEE LETTER GV
+13AD;N # CHEROKEE LETTER HA
+13AE;N # CHEROKEE LETTER HE
+13AF;N # CHEROKEE LETTER HI
+13B0;N # CHEROKEE LETTER HO
+13B1;N # CHEROKEE LETTER HU
+13B2;N # CHEROKEE LETTER HV
+13B3;N # CHEROKEE LETTER LA
+13B4;N # CHEROKEE LETTER LE
+13B5;N # CHEROKEE LETTER LI
+13B6;N # CHEROKEE LETTER LO
+13B7;N # CHEROKEE LETTER LU
+13B8;N # CHEROKEE LETTER LV
+13B9;N # CHEROKEE LETTER MA
+13BA;N # CHEROKEE LETTER ME
+13BB;N # CHEROKEE LETTER MI
+13BC;N # CHEROKEE LETTER MO
+13BD;N # CHEROKEE LETTER MU
+13BE;N # CHEROKEE LETTER NA
+13BF;N # CHEROKEE LETTER HNA
+13C0;N # CHEROKEE LETTER NAH
+13C1;N # CHEROKEE LETTER NE
+13C2;N # CHEROKEE LETTER NI
+13C3;N # CHEROKEE LETTER NO
+13C4;N # CHEROKEE LETTER NU
+13C5;N # CHEROKEE LETTER NV
+13C6;N # CHEROKEE LETTER QUA
+13C7;N # CHEROKEE LETTER QUE
+13C8;N # CHEROKEE LETTER QUI
+13C9;N # CHEROKEE LETTER QUO
+13CA;N # CHEROKEE LETTER QUU
+13CB;N # CHEROKEE LETTER QUV
+13CC;N # CHEROKEE LETTER SA
+13CD;N # CHEROKEE LETTER S
+13CE;N # CHEROKEE LETTER SE
+13CF;N # CHEROKEE LETTER SI
+13D0;N # CHEROKEE LETTER SO
+13D1;N # CHEROKEE LETTER SU
+13D2;N # CHEROKEE LETTER SV
+13D3;N # CHEROKEE LETTER DA
+13D4;N # CHEROKEE LETTER TA
+13D5;N # CHEROKEE LETTER DE
+13D6;N # CHEROKEE LETTER TE
+13D7;N # CHEROKEE LETTER DI
+13D8;N # CHEROKEE LETTER TI
+13D9;N # CHEROKEE LETTER DO
+13DA;N # CHEROKEE LETTER DU
+13DB;N # CHEROKEE LETTER DV
+13DC;N # CHEROKEE LETTER DLA
+13DD;N # CHEROKEE LETTER TLA
+13DE;N # CHEROKEE LETTER TLE
+13DF;N # CHEROKEE LETTER TLI
+13E0;N # CHEROKEE LETTER TLO
+13E1;N # CHEROKEE LETTER TLU
+13E2;N # CHEROKEE LETTER TLV
+13E3;N # CHEROKEE LETTER TSA
+13E4;N # CHEROKEE LETTER TSE
+13E5;N # CHEROKEE LETTER TSI
+13E6;N # CHEROKEE LETTER TSO
+13E7;N # CHEROKEE LETTER TSU
+13E8;N # CHEROKEE LETTER TSV
+13E9;N # CHEROKEE LETTER WA
+13EA;N # CHEROKEE LETTER WE
+13EB;N # CHEROKEE LETTER WI
+13EC;N # CHEROKEE LETTER WO
+13ED;N # CHEROKEE LETTER WU
+13EE;N # CHEROKEE LETTER WV
+13EF;N # CHEROKEE LETTER YA
+13F0;N # CHEROKEE LETTER YE
+13F1;N # CHEROKEE LETTER YI
+13F2;N # CHEROKEE LETTER YO
+13F3;N # CHEROKEE LETTER YU
+13F4;N # CHEROKEE LETTER YV
+1401;N # CANADIAN SYLLABICS E
+1402;N # CANADIAN SYLLABICS AAI
+1403;N # CANADIAN SYLLABICS I
+1404;N # CANADIAN SYLLABICS II
+1405;N # CANADIAN SYLLABICS O
+1406;N # CANADIAN SYLLABICS OO
+1407;N # CANADIAN SYLLABICS Y-CREE OO
+1408;N # CANADIAN SYLLABICS CARRIER EE
+1409;N # CANADIAN SYLLABICS CARRIER I
+140A;N # CANADIAN SYLLABICS A
+140B;N # CANADIAN SYLLABICS AA
+140C;N # CANADIAN SYLLABICS WE
+140D;N # CANADIAN SYLLABICS WEST-CREE WE
+140E;N # CANADIAN SYLLABICS WI
+140F;N # CANADIAN SYLLABICS WEST-CREE WI
+1410;N # CANADIAN SYLLABICS WII
+1411;N # CANADIAN SYLLABICS WEST-CREE WII
+1412;N # CANADIAN SYLLABICS WO
+1413;N # CANADIAN SYLLABICS WEST-CREE WO
+1414;N # CANADIAN SYLLABICS WOO
+1415;N # CANADIAN SYLLABICS WEST-CREE WOO
+1416;N # CANADIAN SYLLABICS NASKAPI WOO
+1417;N # CANADIAN SYLLABICS WA
+1418;N # CANADIAN SYLLABICS WEST-CREE WA
+1419;N # CANADIAN SYLLABICS WAA
+141A;N # CANADIAN SYLLABICS WEST-CREE WAA
+141B;N # CANADIAN SYLLABICS NASKAPI WAA
+141C;N # CANADIAN SYLLABICS AI
+141D;N # CANADIAN SYLLABICS Y-CREE W
+141E;N # CANADIAN SYLLABICS GLOTTAL STOP
+141F;N # CANADIAN SYLLABICS FINAL ACUTE
+1420;N # CANADIAN SYLLABICS FINAL GRAVE
+1421;N # CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422;N # CANADIAN SYLLABICS FINAL TOP HALF RING
+1423;N # CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424;N # CANADIAN SYLLABICS FINAL RING
+1425;N # CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426;N # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427;N # CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428;N # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429;N # CANADIAN SYLLABICS FINAL PLUS
+142A;N # CANADIAN SYLLABICS FINAL DOWN TACK
+142B;N # CANADIAN SYLLABICS EN
+142C;N # CANADIAN SYLLABICS IN
+142D;N # CANADIAN SYLLABICS ON
+142E;N # CANADIAN SYLLABICS AN
+142F;N # CANADIAN SYLLABICS PE
+1430;N # CANADIAN SYLLABICS PAAI
+1431;N # CANADIAN SYLLABICS PI
+1432;N # CANADIAN SYLLABICS PII
+1433;N # CANADIAN SYLLABICS PO
+1434;N # CANADIAN SYLLABICS POO
+1435;N # CANADIAN SYLLABICS Y-CREE POO
+1436;N # CANADIAN SYLLABICS CARRIER HEE
+1437;N # CANADIAN SYLLABICS CARRIER HI
+1438;N # CANADIAN SYLLABICS PA
+1439;N # CANADIAN SYLLABICS PAA
+143A;N # CANADIAN SYLLABICS PWE
+143B;N # CANADIAN SYLLABICS WEST-CREE PWE
+143C;N # CANADIAN SYLLABICS PWI
+143D;N # CANADIAN SYLLABICS WEST-CREE PWI
+143E;N # CANADIAN SYLLABICS PWII
+143F;N # CANADIAN SYLLABICS WEST-CREE PWII
+1440;N # CANADIAN SYLLABICS PWO
+1441;N # CANADIAN SYLLABICS WEST-CREE PWO
+1442;N # CANADIAN SYLLABICS PWOO
+1443;N # CANADIAN SYLLABICS WEST-CREE PWOO
+1444;N # CANADIAN SYLLABICS PWA
+1445;N # CANADIAN SYLLABICS WEST-CREE PWA
+1446;N # CANADIAN SYLLABICS PWAA
+1447;N # CANADIAN SYLLABICS WEST-CREE PWAA
+1448;N # CANADIAN SYLLABICS Y-CREE PWAA
+1449;N # CANADIAN SYLLABICS P
+144A;N # CANADIAN SYLLABICS WEST-CREE P
+144B;N # CANADIAN SYLLABICS CARRIER H
+144C;N # CANADIAN SYLLABICS TE
+144D;N # CANADIAN SYLLABICS TAAI
+144E;N # CANADIAN SYLLABICS TI
+144F;N # CANADIAN SYLLABICS TII
+1450;N # CANADIAN SYLLABICS TO
+1451;N # CANADIAN SYLLABICS TOO
+1452;N # CANADIAN SYLLABICS Y-CREE TOO
+1453;N # CANADIAN SYLLABICS CARRIER DEE
+1454;N # CANADIAN SYLLABICS CARRIER DI
+1455;N # CANADIAN SYLLABICS TA
+1456;N # CANADIAN SYLLABICS TAA
+1457;N # CANADIAN SYLLABICS TWE
+1458;N # CANADIAN SYLLABICS WEST-CREE TWE
+1459;N # CANADIAN SYLLABICS TWI
+145A;N # CANADIAN SYLLABICS WEST-CREE TWI
+145B;N # CANADIAN SYLLABICS TWII
+145C;N # CANADIAN SYLLABICS WEST-CREE TWII
+145D;N # CANADIAN SYLLABICS TWO
+145E;N # CANADIAN SYLLABICS WEST-CREE TWO
+145F;N # CANADIAN SYLLABICS TWOO
+1460;N # CANADIAN SYLLABICS WEST-CREE TWOO
+1461;N # CANADIAN SYLLABICS TWA
+1462;N # CANADIAN SYLLABICS WEST-CREE TWA
+1463;N # CANADIAN SYLLABICS TWAA
+1464;N # CANADIAN SYLLABICS WEST-CREE TWAA
+1465;N # CANADIAN SYLLABICS NASKAPI TWAA
+1466;N # CANADIAN SYLLABICS T
+1467;N # CANADIAN SYLLABICS TTE
+1468;N # CANADIAN SYLLABICS TTI
+1469;N # CANADIAN SYLLABICS TTO
+146A;N # CANADIAN SYLLABICS TTA
+146B;N # CANADIAN SYLLABICS KE
+146C;N # CANADIAN SYLLABICS KAAI
+146D;N # CANADIAN SYLLABICS KI
+146E;N # CANADIAN SYLLABICS KII
+146F;N # CANADIAN SYLLABICS KO
+1470;N # CANADIAN SYLLABICS KOO
+1471;N # CANADIAN SYLLABICS Y-CREE KOO
+1472;N # CANADIAN SYLLABICS KA
+1473;N # CANADIAN SYLLABICS KAA
+1474;N # CANADIAN SYLLABICS KWE
+1475;N # CANADIAN SYLLABICS WEST-CREE KWE
+1476;N # CANADIAN SYLLABICS KWI
+1477;N # CANADIAN SYLLABICS WEST-CREE KWI
+1478;N # CANADIAN SYLLABICS KWII
+1479;N # CANADIAN SYLLABICS WEST-CREE KWII
+147A;N # CANADIAN SYLLABICS KWO
+147B;N # CANADIAN SYLLABICS WEST-CREE KWO
+147C;N # CANADIAN SYLLABICS KWOO
+147D;N # CANADIAN SYLLABICS WEST-CREE KWOO
+147E;N # CANADIAN SYLLABICS KWA
+147F;N # CANADIAN SYLLABICS WEST-CREE KWA
+1480;N # CANADIAN SYLLABICS KWAA
+1481;N # CANADIAN SYLLABICS WEST-CREE KWAA
+1482;N # CANADIAN SYLLABICS NASKAPI KWAA
+1483;N # CANADIAN SYLLABICS K
+1484;N # CANADIAN SYLLABICS KW
+1485;N # CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486;N # CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487;N # CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488;N # CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489;N # CANADIAN SYLLABICS CE
+148A;N # CANADIAN SYLLABICS CAAI
+148B;N # CANADIAN SYLLABICS CI
+148C;N # CANADIAN SYLLABICS CII
+148D;N # CANADIAN SYLLABICS CO
+148E;N # CANADIAN SYLLABICS COO
+148F;N # CANADIAN SYLLABICS Y-CREE COO
+1490;N # CANADIAN SYLLABICS CA
+1491;N # CANADIAN SYLLABICS CAA
+1492;N # CANADIAN SYLLABICS CWE
+1493;N # CANADIAN SYLLABICS WEST-CREE CWE
+1494;N # CANADIAN SYLLABICS CWI
+1495;N # CANADIAN SYLLABICS WEST-CREE CWI
+1496;N # CANADIAN SYLLABICS CWII
+1497;N # CANADIAN SYLLABICS WEST-CREE CWII
+1498;N # CANADIAN SYLLABICS CWO
+1499;N # CANADIAN SYLLABICS WEST-CREE CWO
+149A;N # CANADIAN SYLLABICS CWOO
+149B;N # CANADIAN SYLLABICS WEST-CREE CWOO
+149C;N # CANADIAN SYLLABICS CWA
+149D;N # CANADIAN SYLLABICS WEST-CREE CWA
+149E;N # CANADIAN SYLLABICS CWAA
+149F;N # CANADIAN SYLLABICS WEST-CREE CWAA
+14A0;N # CANADIAN SYLLABICS NASKAPI CWAA
+14A1;N # CANADIAN SYLLABICS C
+14A2;N # CANADIAN SYLLABICS SAYISI TH
+14A3;N # CANADIAN SYLLABICS ME
+14A4;N # CANADIAN SYLLABICS MAAI
+14A5;N # CANADIAN SYLLABICS MI
+14A6;N # CANADIAN SYLLABICS MII
+14A7;N # CANADIAN SYLLABICS MO
+14A8;N # CANADIAN SYLLABICS MOO
+14A9;N # CANADIAN SYLLABICS Y-CREE MOO
+14AA;N # CANADIAN SYLLABICS MA
+14AB;N # CANADIAN SYLLABICS MAA
+14AC;N # CANADIAN SYLLABICS MWE
+14AD;N # CANADIAN SYLLABICS WEST-CREE MWE
+14AE;N # CANADIAN SYLLABICS MWI
+14AF;N # CANADIAN SYLLABICS WEST-CREE MWI
+14B0;N # CANADIAN SYLLABICS MWII
+14B1;N # CANADIAN SYLLABICS WEST-CREE MWII
+14B2;N # CANADIAN SYLLABICS MWO
+14B3;N # CANADIAN SYLLABICS WEST-CREE MWO
+14B4;N # CANADIAN SYLLABICS MWOO
+14B5;N # CANADIAN SYLLABICS WEST-CREE MWOO
+14B6;N # CANADIAN SYLLABICS MWA
+14B7;N # CANADIAN SYLLABICS WEST-CREE MWA
+14B8;N # CANADIAN SYLLABICS MWAA
+14B9;N # CANADIAN SYLLABICS WEST-CREE MWAA
+14BA;N # CANADIAN SYLLABICS NASKAPI MWAA
+14BB;N # CANADIAN SYLLABICS M
+14BC;N # CANADIAN SYLLABICS WEST-CREE M
+14BD;N # CANADIAN SYLLABICS MH
+14BE;N # CANADIAN SYLLABICS ATHAPASCAN M
+14BF;N # CANADIAN SYLLABICS SAYISI M
+14C0;N # CANADIAN SYLLABICS NE
+14C1;N # CANADIAN SYLLABICS NAAI
+14C2;N # CANADIAN SYLLABICS NI
+14C3;N # CANADIAN SYLLABICS NII
+14C4;N # CANADIAN SYLLABICS NO
+14C5;N # CANADIAN SYLLABICS NOO
+14C6;N # CANADIAN SYLLABICS Y-CREE NOO
+14C7;N # CANADIAN SYLLABICS NA
+14C8;N # CANADIAN SYLLABICS NAA
+14C9;N # CANADIAN SYLLABICS NWE
+14CA;N # CANADIAN SYLLABICS WEST-CREE NWE
+14CB;N # CANADIAN SYLLABICS NWA
+14CC;N # CANADIAN SYLLABICS WEST-CREE NWA
+14CD;N # CANADIAN SYLLABICS NWAA
+14CE;N # CANADIAN SYLLABICS WEST-CREE NWAA
+14CF;N # CANADIAN SYLLABICS NASKAPI NWAA
+14D0;N # CANADIAN SYLLABICS N
+14D1;N # CANADIAN SYLLABICS CARRIER NG
+14D2;N # CANADIAN SYLLABICS NH
+14D3;N # CANADIAN SYLLABICS LE
+14D4;N # CANADIAN SYLLABICS LAAI
+14D5;N # CANADIAN SYLLABICS LI
+14D6;N # CANADIAN SYLLABICS LII
+14D7;N # CANADIAN SYLLABICS LO
+14D8;N # CANADIAN SYLLABICS LOO
+14D9;N # CANADIAN SYLLABICS Y-CREE LOO
+14DA;N # CANADIAN SYLLABICS LA
+14DB;N # CANADIAN SYLLABICS LAA
+14DC;N # CANADIAN SYLLABICS LWE
+14DD;N # CANADIAN SYLLABICS WEST-CREE LWE
+14DE;N # CANADIAN SYLLABICS LWI
+14DF;N # CANADIAN SYLLABICS WEST-CREE LWI
+14E0;N # CANADIAN SYLLABICS LWII
+14E1;N # CANADIAN SYLLABICS WEST-CREE LWII
+14E2;N # CANADIAN SYLLABICS LWO
+14E3;N # CANADIAN SYLLABICS WEST-CREE LWO
+14E4;N # CANADIAN SYLLABICS LWOO
+14E5;N # CANADIAN SYLLABICS WEST-CREE LWOO
+14E6;N # CANADIAN SYLLABICS LWA
+14E7;N # CANADIAN SYLLABICS WEST-CREE LWA
+14E8;N # CANADIAN SYLLABICS LWAA
+14E9;N # CANADIAN SYLLABICS WEST-CREE LWAA
+14EA;N # CANADIAN SYLLABICS L
+14EB;N # CANADIAN SYLLABICS WEST-CREE L
+14EC;N # CANADIAN SYLLABICS MEDIAL L
+14ED;N # CANADIAN SYLLABICS SE
+14EE;N # CANADIAN SYLLABICS SAAI
+14EF;N # CANADIAN SYLLABICS SI
+14F0;N # CANADIAN SYLLABICS SII
+14F1;N # CANADIAN SYLLABICS SO
+14F2;N # CANADIAN SYLLABICS SOO
+14F3;N # CANADIAN SYLLABICS Y-CREE SOO
+14F4;N # CANADIAN SYLLABICS SA
+14F5;N # CANADIAN SYLLABICS SAA
+14F6;N # CANADIAN SYLLABICS SWE
+14F7;N # CANADIAN SYLLABICS WEST-CREE SWE
+14F8;N # CANADIAN SYLLABICS SWI
+14F9;N # CANADIAN SYLLABICS WEST-CREE SWI
+14FA;N # CANADIAN SYLLABICS SWII
+14FB;N # CANADIAN SYLLABICS WEST-CREE SWII
+14FC;N # CANADIAN SYLLABICS SWO
+14FD;N # CANADIAN SYLLABICS WEST-CREE SWO
+14FE;N # CANADIAN SYLLABICS SWOO
+14FF;N # CANADIAN SYLLABICS WEST-CREE SWOO
+1500;N # CANADIAN SYLLABICS SWA
+1501;N # CANADIAN SYLLABICS WEST-CREE SWA
+1502;N # CANADIAN SYLLABICS SWAA
+1503;N # CANADIAN SYLLABICS WEST-CREE SWAA
+1504;N # CANADIAN SYLLABICS NASKAPI SWAA
+1505;N # CANADIAN SYLLABICS S
+1506;N # CANADIAN SYLLABICS ATHAPASCAN S
+1507;N # CANADIAN SYLLABICS SW
+1508;N # CANADIAN SYLLABICS BLACKFOOT S
+1509;N # CANADIAN SYLLABICS MOOSE-CREE SK
+150A;N # CANADIAN SYLLABICS NASKAPI SKW
+150B;N # CANADIAN SYLLABICS NASKAPI S-W
+150C;N # CANADIAN SYLLABICS NASKAPI SPWA
+150D;N # CANADIAN SYLLABICS NASKAPI STWA
+150E;N # CANADIAN SYLLABICS NASKAPI SKWA
+150F;N # CANADIAN SYLLABICS NASKAPI SCWA
+1510;N # CANADIAN SYLLABICS SHE
+1511;N # CANADIAN SYLLABICS SHI
+1512;N # CANADIAN SYLLABICS SHII
+1513;N # CANADIAN SYLLABICS SHO
+1514;N # CANADIAN SYLLABICS SHOO
+1515;N # CANADIAN SYLLABICS SHA
+1516;N # CANADIAN SYLLABICS SHAA
+1517;N # CANADIAN SYLLABICS SHWE
+1518;N # CANADIAN SYLLABICS WEST-CREE SHWE
+1519;N # CANADIAN SYLLABICS SHWI
+151A;N # CANADIAN SYLLABICS WEST-CREE SHWI
+151B;N # CANADIAN SYLLABICS SHWII
+151C;N # CANADIAN SYLLABICS WEST-CREE SHWII
+151D;N # CANADIAN SYLLABICS SHWO
+151E;N # CANADIAN SYLLABICS WEST-CREE SHWO
+151F;N # CANADIAN SYLLABICS SHWOO
+1520;N # CANADIAN SYLLABICS WEST-CREE SHWOO
+1521;N # CANADIAN SYLLABICS SHWA
+1522;N # CANADIAN SYLLABICS WEST-CREE SHWA
+1523;N # CANADIAN SYLLABICS SHWAA
+1524;N # CANADIAN SYLLABICS WEST-CREE SHWAA
+1525;N # CANADIAN SYLLABICS SH
+1526;N # CANADIAN SYLLABICS YE
+1527;N # CANADIAN SYLLABICS YAAI
+1528;N # CANADIAN SYLLABICS YI
+1529;N # CANADIAN SYLLABICS YII
+152A;N # CANADIAN SYLLABICS YO
+152B;N # CANADIAN SYLLABICS YOO
+152C;N # CANADIAN SYLLABICS Y-CREE YOO
+152D;N # CANADIAN SYLLABICS YA
+152E;N # CANADIAN SYLLABICS YAA
+152F;N # CANADIAN SYLLABICS YWE
+1530;N # CANADIAN SYLLABICS WEST-CREE YWE
+1531;N # CANADIAN SYLLABICS YWI
+1532;N # CANADIAN SYLLABICS WEST-CREE YWI
+1533;N # CANADIAN SYLLABICS YWII
+1534;N # CANADIAN SYLLABICS WEST-CREE YWII
+1535;N # CANADIAN SYLLABICS YWO
+1536;N # CANADIAN SYLLABICS WEST-CREE YWO
+1537;N # CANADIAN SYLLABICS YWOO
+1538;N # CANADIAN SYLLABICS WEST-CREE YWOO
+1539;N # CANADIAN SYLLABICS YWA
+153A;N # CANADIAN SYLLABICS WEST-CREE YWA
+153B;N # CANADIAN SYLLABICS YWAA
+153C;N # CANADIAN SYLLABICS WEST-CREE YWAA
+153D;N # CANADIAN SYLLABICS NASKAPI YWAA
+153E;N # CANADIAN SYLLABICS Y
+153F;N # CANADIAN SYLLABICS BIBLE-CREE Y
+1540;N # CANADIAN SYLLABICS WEST-CREE Y
+1541;N # CANADIAN SYLLABICS SAYISI YI
+1542;N # CANADIAN SYLLABICS RE
+1543;N # CANADIAN SYLLABICS R-CREE RE
+1544;N # CANADIAN SYLLABICS WEST-CREE LE
+1545;N # CANADIAN SYLLABICS RAAI
+1546;N # CANADIAN SYLLABICS RI
+1547;N # CANADIAN SYLLABICS RII
+1548;N # CANADIAN SYLLABICS RO
+1549;N # CANADIAN SYLLABICS ROO
+154A;N # CANADIAN SYLLABICS WEST-CREE LO
+154B;N # CANADIAN SYLLABICS RA
+154C;N # CANADIAN SYLLABICS RAA
+154D;N # CANADIAN SYLLABICS WEST-CREE LA
+154E;N # CANADIAN SYLLABICS RWAA
+154F;N # CANADIAN SYLLABICS WEST-CREE RWAA
+1550;N # CANADIAN SYLLABICS R
+1551;N # CANADIAN SYLLABICS WEST-CREE R
+1552;N # CANADIAN SYLLABICS MEDIAL R
+1553;N # CANADIAN SYLLABICS FE
+1554;N # CANADIAN SYLLABICS FAAI
+1555;N # CANADIAN SYLLABICS FI
+1556;N # CANADIAN SYLLABICS FII
+1557;N # CANADIAN SYLLABICS FO
+1558;N # CANADIAN SYLLABICS FOO
+1559;N # CANADIAN SYLLABICS FA
+155A;N # CANADIAN SYLLABICS FAA
+155B;N # CANADIAN SYLLABICS FWAA
+155C;N # CANADIAN SYLLABICS WEST-CREE FWAA
+155D;N # CANADIAN SYLLABICS F
+155E;N # CANADIAN SYLLABICS THE
+155F;N # CANADIAN SYLLABICS N-CREE THE
+1560;N # CANADIAN SYLLABICS THI
+1561;N # CANADIAN SYLLABICS N-CREE THI
+1562;N # CANADIAN SYLLABICS THII
+1563;N # CANADIAN SYLLABICS N-CREE THII
+1564;N # CANADIAN SYLLABICS THO
+1565;N # CANADIAN SYLLABICS THOO
+1566;N # CANADIAN SYLLABICS THA
+1567;N # CANADIAN SYLLABICS THAA
+1568;N # CANADIAN SYLLABICS THWAA
+1569;N # CANADIAN SYLLABICS WEST-CREE THWAA
+156A;N # CANADIAN SYLLABICS TH
+156B;N # CANADIAN SYLLABICS TTHE
+156C;N # CANADIAN SYLLABICS TTHI
+156D;N # CANADIAN SYLLABICS TTHO
+156E;N # CANADIAN SYLLABICS TTHA
+156F;N # CANADIAN SYLLABICS TTH
+1570;N # CANADIAN SYLLABICS TYE
+1571;N # CANADIAN SYLLABICS TYI
+1572;N # CANADIAN SYLLABICS TYO
+1573;N # CANADIAN SYLLABICS TYA
+1574;N # CANADIAN SYLLABICS NUNAVIK HE
+1575;N # CANADIAN SYLLABICS NUNAVIK HI
+1576;N # CANADIAN SYLLABICS NUNAVIK HII
+1577;N # CANADIAN SYLLABICS NUNAVIK HO
+1578;N # CANADIAN SYLLABICS NUNAVIK HOO
+1579;N # CANADIAN SYLLABICS NUNAVIK HA
+157A;N # CANADIAN SYLLABICS NUNAVIK HAA
+157B;N # CANADIAN SYLLABICS NUNAVIK H
+157C;N # CANADIAN SYLLABICS NUNAVUT H
+157D;N # CANADIAN SYLLABICS HK
+157E;N # CANADIAN SYLLABICS QAAI
+157F;N # CANADIAN SYLLABICS QI
+1580;N # CANADIAN SYLLABICS QII
+1581;N # CANADIAN SYLLABICS QO
+1582;N # CANADIAN SYLLABICS QOO
+1583;N # CANADIAN SYLLABICS QA
+1584;N # CANADIAN SYLLABICS QAA
+1585;N # CANADIAN SYLLABICS Q
+1586;N # CANADIAN SYLLABICS TLHE
+1587;N # CANADIAN SYLLABICS TLHI
+1588;N # CANADIAN SYLLABICS TLHO
+1589;N # CANADIAN SYLLABICS TLHA
+158A;N # CANADIAN SYLLABICS WEST-CREE RE
+158B;N # CANADIAN SYLLABICS WEST-CREE RI
+158C;N # CANADIAN SYLLABICS WEST-CREE RO
+158D;N # CANADIAN SYLLABICS WEST-CREE RA
+158E;N # CANADIAN SYLLABICS NGAAI
+158F;N # CANADIAN SYLLABICS NGI
+1590;N # CANADIAN SYLLABICS NGII
+1591;N # CANADIAN SYLLABICS NGO
+1592;N # CANADIAN SYLLABICS NGOO
+1593;N # CANADIAN SYLLABICS NGA
+1594;N # CANADIAN SYLLABICS NGAA
+1595;N # CANADIAN SYLLABICS NG
+1596;N # CANADIAN SYLLABICS NNG
+1597;N # CANADIAN SYLLABICS SAYISI SHE
+1598;N # CANADIAN SYLLABICS SAYISI SHI
+1599;N # CANADIAN SYLLABICS SAYISI SHO
+159A;N # CANADIAN SYLLABICS SAYISI SHA
+159B;N # CANADIAN SYLLABICS WOODS-CREE THE
+159C;N # CANADIAN SYLLABICS WOODS-CREE THI
+159D;N # CANADIAN SYLLABICS WOODS-CREE THO
+159E;N # CANADIAN SYLLABICS WOODS-CREE THA
+159F;N # CANADIAN SYLLABICS WOODS-CREE TH
+15A0;N # CANADIAN SYLLABICS LHI
+15A1;N # CANADIAN SYLLABICS LHII
+15A2;N # CANADIAN SYLLABICS LHO
+15A3;N # CANADIAN SYLLABICS LHOO
+15A4;N # CANADIAN SYLLABICS LHA
+15A5;N # CANADIAN SYLLABICS LHAA
+15A6;N # CANADIAN SYLLABICS LH
+15A7;N # CANADIAN SYLLABICS TH-CREE THE
+15A8;N # CANADIAN SYLLABICS TH-CREE THI
+15A9;N # CANADIAN SYLLABICS TH-CREE THII
+15AA;N # CANADIAN SYLLABICS TH-CREE THO
+15AB;N # CANADIAN SYLLABICS TH-CREE THOO
+15AC;N # CANADIAN SYLLABICS TH-CREE THA
+15AD;N # CANADIAN SYLLABICS TH-CREE THAA
+15AE;N # CANADIAN SYLLABICS TH-CREE TH
+15AF;N # CANADIAN SYLLABICS AIVILIK B
+15B0;N # CANADIAN SYLLABICS BLACKFOOT E
+15B1;N # CANADIAN SYLLABICS BLACKFOOT I
+15B2;N # CANADIAN SYLLABICS BLACKFOOT O
+15B3;N # CANADIAN SYLLABICS BLACKFOOT A
+15B4;N # CANADIAN SYLLABICS BLACKFOOT WE
+15B5;N # CANADIAN SYLLABICS BLACKFOOT WI
+15B6;N # CANADIAN SYLLABICS BLACKFOOT WO
+15B7;N # CANADIAN SYLLABICS BLACKFOOT WA
+15B8;N # CANADIAN SYLLABICS BLACKFOOT NE
+15B9;N # CANADIAN SYLLABICS BLACKFOOT NI
+15BA;N # CANADIAN SYLLABICS BLACKFOOT NO
+15BB;N # CANADIAN SYLLABICS BLACKFOOT NA
+15BC;N # CANADIAN SYLLABICS BLACKFOOT KE
+15BD;N # CANADIAN SYLLABICS BLACKFOOT KI
+15BE;N # CANADIAN SYLLABICS BLACKFOOT KO
+15BF;N # CANADIAN SYLLABICS BLACKFOOT KA
+15C0;N # CANADIAN SYLLABICS SAYISI HE
+15C1;N # CANADIAN SYLLABICS SAYISI HI
+15C2;N # CANADIAN SYLLABICS SAYISI HO
+15C3;N # CANADIAN SYLLABICS SAYISI HA
+15C4;N # CANADIAN SYLLABICS CARRIER GHU
+15C5;N # CANADIAN SYLLABICS CARRIER GHO
+15C6;N # CANADIAN SYLLABICS CARRIER GHE
+15C7;N # CANADIAN SYLLABICS CARRIER GHEE
+15C8;N # CANADIAN SYLLABICS CARRIER GHI
+15C9;N # CANADIAN SYLLABICS CARRIER GHA
+15CA;N # CANADIAN SYLLABICS CARRIER RU
+15CB;N # CANADIAN SYLLABICS CARRIER RO
+15CC;N # CANADIAN SYLLABICS CARRIER RE
+15CD;N # CANADIAN SYLLABICS CARRIER REE
+15CE;N # CANADIAN SYLLABICS CARRIER RI
+15CF;N # CANADIAN SYLLABICS CARRIER RA
+15D0;N # CANADIAN SYLLABICS CARRIER WU
+15D1;N # CANADIAN SYLLABICS CARRIER WO
+15D2;N # CANADIAN SYLLABICS CARRIER WE
+15D3;N # CANADIAN SYLLABICS CARRIER WEE
+15D4;N # CANADIAN SYLLABICS CARRIER WI
+15D5;N # CANADIAN SYLLABICS CARRIER WA
+15D6;N # CANADIAN SYLLABICS CARRIER HWU
+15D7;N # CANADIAN SYLLABICS CARRIER HWO
+15D8;N # CANADIAN SYLLABICS CARRIER HWE
+15D9;N # CANADIAN SYLLABICS CARRIER HWEE
+15DA;N # CANADIAN SYLLABICS CARRIER HWI
+15DB;N # CANADIAN SYLLABICS CARRIER HWA
+15DC;N # CANADIAN SYLLABICS CARRIER THU
+15DD;N # CANADIAN SYLLABICS CARRIER THO
+15DE;N # CANADIAN SYLLABICS CARRIER THE
+15DF;N # CANADIAN SYLLABICS CARRIER THEE
+15E0;N # CANADIAN SYLLABICS CARRIER THI
+15E1;N # CANADIAN SYLLABICS CARRIER THA
+15E2;N # CANADIAN SYLLABICS CARRIER TTU
+15E3;N # CANADIAN SYLLABICS CARRIER TTO
+15E4;N # CANADIAN SYLLABICS CARRIER TTE
+15E5;N # CANADIAN SYLLABICS CARRIER TTEE
+15E6;N # CANADIAN SYLLABICS CARRIER TTI
+15E7;N # CANADIAN SYLLABICS CARRIER TTA
+15E8;N # CANADIAN SYLLABICS CARRIER PU
+15E9;N # CANADIAN SYLLABICS CARRIER PO
+15EA;N # CANADIAN SYLLABICS CARRIER PE
+15EB;N # CANADIAN SYLLABICS CARRIER PEE
+15EC;N # CANADIAN SYLLABICS CARRIER PI
+15ED;N # CANADIAN SYLLABICS CARRIER PA
+15EE;N # CANADIAN SYLLABICS CARRIER P
+15EF;N # CANADIAN SYLLABICS CARRIER GU
+15F0;N # CANADIAN SYLLABICS CARRIER GO
+15F1;N # CANADIAN SYLLABICS CARRIER GE
+15F2;N # CANADIAN SYLLABICS CARRIER GEE
+15F3;N # CANADIAN SYLLABICS CARRIER GI
+15F4;N # CANADIAN SYLLABICS CARRIER GA
+15F5;N # CANADIAN SYLLABICS CARRIER KHU
+15F6;N # CANADIAN SYLLABICS CARRIER KHO
+15F7;N # CANADIAN SYLLABICS CARRIER KHE
+15F8;N # CANADIAN SYLLABICS CARRIER KHEE
+15F9;N # CANADIAN SYLLABICS CARRIER KHI
+15FA;N # CANADIAN SYLLABICS CARRIER KHA
+15FB;N # CANADIAN SYLLABICS CARRIER KKU
+15FC;N # CANADIAN SYLLABICS CARRIER KKO
+15FD;N # CANADIAN SYLLABICS CARRIER KKE
+15FE;N # CANADIAN SYLLABICS CARRIER KKEE
+15FF;N # CANADIAN SYLLABICS CARRIER KKI
+1600;N # CANADIAN SYLLABICS CARRIER KKA
+1601;N # CANADIAN SYLLABICS CARRIER KK
+1602;N # CANADIAN SYLLABICS CARRIER NU
+1603;N # CANADIAN SYLLABICS CARRIER NO
+1604;N # CANADIAN SYLLABICS CARRIER NE
+1605;N # CANADIAN SYLLABICS CARRIER NEE
+1606;N # CANADIAN SYLLABICS CARRIER NI
+1607;N # CANADIAN SYLLABICS CARRIER NA
+1608;N # CANADIAN SYLLABICS CARRIER MU
+1609;N # CANADIAN SYLLABICS CARRIER MO
+160A;N # CANADIAN SYLLABICS CARRIER ME
+160B;N # CANADIAN SYLLABICS CARRIER MEE
+160C;N # CANADIAN SYLLABICS CARRIER MI
+160D;N # CANADIAN SYLLABICS CARRIER MA
+160E;N # CANADIAN SYLLABICS CARRIER YU
+160F;N # CANADIAN SYLLABICS CARRIER YO
+1610;N # CANADIAN SYLLABICS CARRIER YE
+1611;N # CANADIAN SYLLABICS CARRIER YEE
+1612;N # CANADIAN SYLLABICS CARRIER YI
+1613;N # CANADIAN SYLLABICS CARRIER YA
+1614;N # CANADIAN SYLLABICS CARRIER JU
+1615;N # CANADIAN SYLLABICS SAYISI JU
+1616;N # CANADIAN SYLLABICS CARRIER JO
+1617;N # CANADIAN SYLLABICS CARRIER JE
+1618;N # CANADIAN SYLLABICS CARRIER JEE
+1619;N # CANADIAN SYLLABICS CARRIER JI
+161A;N # CANADIAN SYLLABICS SAYISI JI
+161B;N # CANADIAN SYLLABICS CARRIER JA
+161C;N # CANADIAN SYLLABICS CARRIER JJU
+161D;N # CANADIAN SYLLABICS CARRIER JJO
+161E;N # CANADIAN SYLLABICS CARRIER JJE
+161F;N # CANADIAN SYLLABICS CARRIER JJEE
+1620;N # CANADIAN SYLLABICS CARRIER JJI
+1621;N # CANADIAN SYLLABICS CARRIER JJA
+1622;N # CANADIAN SYLLABICS CARRIER LU
+1623;N # CANADIAN SYLLABICS CARRIER LO
+1624;N # CANADIAN SYLLABICS CARRIER LE
+1625;N # CANADIAN SYLLABICS CARRIER LEE
+1626;N # CANADIAN SYLLABICS CARRIER LI
+1627;N # CANADIAN SYLLABICS CARRIER LA
+1628;N # CANADIAN SYLLABICS CARRIER DLU
+1629;N # CANADIAN SYLLABICS CARRIER DLO
+162A;N # CANADIAN SYLLABICS CARRIER DLE
+162B;N # CANADIAN SYLLABICS CARRIER DLEE
+162C;N # CANADIAN SYLLABICS CARRIER DLI
+162D;N # CANADIAN SYLLABICS CARRIER DLA
+162E;N # CANADIAN SYLLABICS CARRIER LHU
+162F;N # CANADIAN SYLLABICS CARRIER LHO
+1630;N # CANADIAN SYLLABICS CARRIER LHE
+1631;N # CANADIAN SYLLABICS CARRIER LHEE
+1632;N # CANADIAN SYLLABICS CARRIER LHI
+1633;N # CANADIAN SYLLABICS CARRIER LHA
+1634;N # CANADIAN SYLLABICS CARRIER TLHU
+1635;N # CANADIAN SYLLABICS CARRIER TLHO
+1636;N # CANADIAN SYLLABICS CARRIER TLHE
+1637;N # CANADIAN SYLLABICS CARRIER TLHEE
+1638;N # CANADIAN SYLLABICS CARRIER TLHI
+1639;N # CANADIAN SYLLABICS CARRIER TLHA
+163A;N # CANADIAN SYLLABICS CARRIER TLU
+163B;N # CANADIAN SYLLABICS CARRIER TLO
+163C;N # CANADIAN SYLLABICS CARRIER TLE
+163D;N # CANADIAN SYLLABICS CARRIER TLEE
+163E;N # CANADIAN SYLLABICS CARRIER TLI
+163F;N # CANADIAN SYLLABICS CARRIER TLA
+1640;N # CANADIAN SYLLABICS CARRIER ZU
+1641;N # CANADIAN SYLLABICS CARRIER ZO
+1642;N # CANADIAN SYLLABICS CARRIER ZE
+1643;N # CANADIAN SYLLABICS CARRIER ZEE
+1644;N # CANADIAN SYLLABICS CARRIER ZI
+1645;N # CANADIAN SYLLABICS CARRIER ZA
+1646;N # CANADIAN SYLLABICS CARRIER Z
+1647;N # CANADIAN SYLLABICS CARRIER INITIAL Z
+1648;N # CANADIAN SYLLABICS CARRIER DZU
+1649;N # CANADIAN SYLLABICS CARRIER DZO
+164A;N # CANADIAN SYLLABICS CARRIER DZE
+164B;N # CANADIAN SYLLABICS CARRIER DZEE
+164C;N # CANADIAN SYLLABICS CARRIER DZI
+164D;N # CANADIAN SYLLABICS CARRIER DZA
+164E;N # CANADIAN SYLLABICS CARRIER SU
+164F;N # CANADIAN SYLLABICS CARRIER SO
+1650;N # CANADIAN SYLLABICS CARRIER SE
+1651;N # CANADIAN SYLLABICS CARRIER SEE
+1652;N # CANADIAN SYLLABICS CARRIER SI
+1653;N # CANADIAN SYLLABICS CARRIER SA
+1654;N # CANADIAN SYLLABICS CARRIER SHU
+1655;N # CANADIAN SYLLABICS CARRIER SHO
+1656;N # CANADIAN SYLLABICS CARRIER SHE
+1657;N # CANADIAN SYLLABICS CARRIER SHEE
+1658;N # CANADIAN SYLLABICS CARRIER SHI
+1659;N # CANADIAN SYLLABICS CARRIER SHA
+165A;N # CANADIAN SYLLABICS CARRIER SH
+165B;N # CANADIAN SYLLABICS CARRIER TSU
+165C;N # CANADIAN SYLLABICS CARRIER TSO
+165D;N # CANADIAN SYLLABICS CARRIER TSE
+165E;N # CANADIAN SYLLABICS CARRIER TSEE
+165F;N # CANADIAN SYLLABICS CARRIER TSI
+1660;N # CANADIAN SYLLABICS CARRIER TSA
+1661;N # CANADIAN SYLLABICS CARRIER CHU
+1662;N # CANADIAN SYLLABICS CARRIER CHO
+1663;N # CANADIAN SYLLABICS CARRIER CHE
+1664;N # CANADIAN SYLLABICS CARRIER CHEE
+1665;N # CANADIAN SYLLABICS CARRIER CHI
+1666;N # CANADIAN SYLLABICS CARRIER CHA
+1667;N # CANADIAN SYLLABICS CARRIER TTSU
+1668;N # CANADIAN SYLLABICS CARRIER TTSO
+1669;N # CANADIAN SYLLABICS CARRIER TTSE
+166A;N # CANADIAN SYLLABICS CARRIER TTSEE
+166B;N # CANADIAN SYLLABICS CARRIER TTSI
+166C;N # CANADIAN SYLLABICS CARRIER TTSA
+166D;N # CANADIAN SYLLABICS CHI SIGN
+166E;N # CANADIAN SYLLABICS FULL STOP
+166F;N # CANADIAN SYLLABICS QAI
+1670;N # CANADIAN SYLLABICS NGAI
+1671;N # CANADIAN SYLLABICS NNGI
+1672;N # CANADIAN SYLLABICS NNGII
+1673;N # CANADIAN SYLLABICS NNGO
+1674;N # CANADIAN SYLLABICS NNGOO
+1675;N # CANADIAN SYLLABICS NNGA
+1676;N # CANADIAN SYLLABICS NNGAA
+1680;N # OGHAM SPACE MARK
+1681;N # OGHAM LETTER BEITH
+1682;N # OGHAM LETTER LUIS
+1683;N # OGHAM LETTER FEARN
+1684;N # OGHAM LETTER SAIL
+1685;N # OGHAM LETTER NION
+1686;N # OGHAM LETTER UATH
+1687;N # OGHAM LETTER DAIR
+1688;N # OGHAM LETTER TINNE
+1689;N # OGHAM LETTER COLL
+168A;N # OGHAM LETTER CEIRT
+168B;N # OGHAM LETTER MUIN
+168C;N # OGHAM LETTER GORT
+168D;N # OGHAM LETTER NGEADAL
+168E;N # OGHAM LETTER STRAIF
+168F;N # OGHAM LETTER RUIS
+1690;N # OGHAM LETTER AILM
+1691;N # OGHAM LETTER ONN
+1692;N # OGHAM LETTER UR
+1693;N # OGHAM LETTER EADHADH
+1694;N # OGHAM LETTER IODHADH
+1695;N # OGHAM LETTER EABHADH
+1696;N # OGHAM LETTER OR
+1697;N # OGHAM LETTER UILLEANN
+1698;N # OGHAM LETTER IFIN
+1699;N # OGHAM LETTER EAMHANCHOLL
+169A;N # OGHAM LETTER PEITH
+169B;N # OGHAM FEATHER MARK
+169C;N # OGHAM REVERSED FEATHER MARK
+16A0;N # RUNIC LETTER FEHU FEOH FE F
+16A1;N # RUNIC LETTER V
+16A2;N # RUNIC LETTER URUZ UR U
+16A3;N # RUNIC LETTER YR
+16A4;N # RUNIC LETTER Y
+16A5;N # RUNIC LETTER W
+16A6;N # RUNIC LETTER THURISAZ THURS THORN
+16A7;N # RUNIC LETTER ETH
+16A8;N # RUNIC LETTER ANSUZ A
+16A9;N # RUNIC LETTER OS O
+16AA;N # RUNIC LETTER AC A
+16AB;N # RUNIC LETTER AESC
+16AC;N # RUNIC LETTER LONG-BRANCH-OSS O
+16AD;N # RUNIC LETTER SHORT-TWIG-OSS O
+16AE;N # RUNIC LETTER O
+16AF;N # RUNIC LETTER OE
+16B0;N # RUNIC LETTER ON
+16B1;N # RUNIC LETTER RAIDO RAD REID R
+16B2;N # RUNIC LETTER KAUNA
+16B3;N # RUNIC LETTER CEN
+16B4;N # RUNIC LETTER KAUN K
+16B5;N # RUNIC LETTER G
+16B6;N # RUNIC LETTER ENG
+16B7;N # RUNIC LETTER GEBO GYFU G
+16B8;N # RUNIC LETTER GAR
+16B9;N # RUNIC LETTER WUNJO WYNN W
+16BA;N # RUNIC LETTER HAGLAZ H
+16BB;N # RUNIC LETTER HAEGL H
+16BC;N # RUNIC LETTER LONG-BRANCH-HAGALL H
+16BD;N # RUNIC LETTER SHORT-TWIG-HAGALL H
+16BE;N # RUNIC LETTER NAUDIZ NYD NAUD N
+16BF;N # RUNIC LETTER SHORT-TWIG-NAUD N
+16C0;N # RUNIC LETTER DOTTED-N
+16C1;N # RUNIC LETTER ISAZ IS ISS I
+16C2;N # RUNIC LETTER E
+16C3;N # RUNIC LETTER JERAN J
+16C4;N # RUNIC LETTER GER
+16C5;N # RUNIC LETTER LONG-BRANCH-AR AE
+16C6;N # RUNIC LETTER SHORT-TWIG-AR A
+16C7;N # RUNIC LETTER IWAZ EOH
+16C8;N # RUNIC LETTER PERTHO PEORTH P
+16C9;N # RUNIC LETTER ALGIZ EOLHX
+16CA;N # RUNIC LETTER SOWILO S
+16CB;N # RUNIC LETTER SIGEL LONG-BRANCH-SOL S
+16CC;N # RUNIC LETTER SHORT-TWIG-SOL S
+16CD;N # RUNIC LETTER C
+16CE;N # RUNIC LETTER Z
+16CF;N # RUNIC LETTER TIWAZ TIR TYR T
+16D0;N # RUNIC LETTER SHORT-TWIG-TYR T
+16D1;N # RUNIC LETTER D
+16D2;N # RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3;N # RUNIC LETTER SHORT-TWIG-BJARKAN B
+16D4;N # RUNIC LETTER DOTTED-P
+16D5;N # RUNIC LETTER OPEN-P
+16D6;N # RUNIC LETTER EHWAZ EH E
+16D7;N # RUNIC LETTER MANNAZ MAN M
+16D8;N # RUNIC LETTER LONG-BRANCH-MADR M
+16D9;N # RUNIC LETTER SHORT-TWIG-MADR M
+16DA;N # RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB;N # RUNIC LETTER DOTTED-L
+16DC;N # RUNIC LETTER INGWAZ
+16DD;N # RUNIC LETTER ING
+16DE;N # RUNIC LETTER DAGAZ DAEG D
+16DF;N # RUNIC LETTER OTHALAN ETHEL O
+16E0;N # RUNIC LETTER EAR
+16E1;N # RUNIC LETTER IOR
+16E2;N # RUNIC LETTER CWEORTH
+16E3;N # RUNIC LETTER CALC
+16E4;N # RUNIC LETTER CEALC
+16E5;N # RUNIC LETTER STAN
+16E6;N # RUNIC LETTER LONG-BRANCH-YR
+16E7;N # RUNIC LETTER SHORT-TWIG-YR
+16E8;N # RUNIC LETTER ICELANDIC-YR
+16E9;N # RUNIC LETTER Q
+16EA;N # RUNIC LETTER X
+16EB;N # RUNIC SINGLE PUNCTUATION
+16EC;N # RUNIC MULTIPLE PUNCTUATION
+16ED;N # RUNIC CROSS PUNCTUATION
+16EE;N # RUNIC ARLAUG SYMBOL
+16EF;N # RUNIC TVIMADUR SYMBOL
+16F0;N # RUNIC BELGTHOR SYMBOL
+1700;N # TAGALOG LETTER A
+1701;N # TAGALOG LETTER I
+1702;N # TAGALOG LETTER U
+1703;N # TAGALOG LETTER KA
+1704;N # TAGALOG LETTER GA
+1705;N # TAGALOG LETTER NGA
+1706;N # TAGALOG LETTER TA
+1707;N # TAGALOG LETTER DA
+1708;N # TAGALOG LETTER NA
+1709;N # TAGALOG LETTER PA
+170A;N # TAGALOG LETTER BA
+170B;N # TAGALOG LETTER MA
+170C;N # TAGALOG LETTER YA
+170E;N # TAGALOG LETTER LA
+170F;N # TAGALOG LETTER WA
+1710;N # TAGALOG LETTER SA
+1711;N # TAGALOG LETTER HA
+1712;N # TAGALOG VOWEL SIGN I
+1713;N # TAGALOG VOWEL SIGN U
+1714;N # TAGALOG SIGN VIRAMA
+1720;N # HANUNOO LETTER A
+1721;N # HANUNOO LETTER I
+1722;N # HANUNOO LETTER U
+1723;N # HANUNOO LETTER KA
+1724;N # HANUNOO LETTER GA
+1725;N # HANUNOO LETTER NGA
+1726;N # HANUNOO LETTER TA
+1727;N # HANUNOO LETTER DA
+1728;N # HANUNOO LETTER NA
+1729;N # HANUNOO LETTER PA
+172A;N # HANUNOO LETTER BA
+172B;N # HANUNOO LETTER MA
+172C;N # HANUNOO LETTER YA
+172D;N # HANUNOO LETTER RA
+172E;N # HANUNOO LETTER LA
+172F;N # HANUNOO LETTER WA
+1730;N # HANUNOO LETTER SA
+1731;N # HANUNOO LETTER HA
+1732;N # HANUNOO VOWEL SIGN I
+1733;N # HANUNOO VOWEL SIGN U
+1734;N # HANUNOO SIGN PAMUDPOD
+1735;N # PHILIPPINE SINGLE PUNCTUATION
+1736;N # PHILIPPINE DOUBLE PUNCTUATION
+1740;N # BUHID LETTER A
+1741;N # BUHID LETTER I
+1742;N # BUHID LETTER U
+1743;N # BUHID LETTER KA
+1744;N # BUHID LETTER GA
+1745;N # BUHID LETTER NGA
+1746;N # BUHID LETTER TA
+1747;N # BUHID LETTER DA
+1748;N # BUHID LETTER NA
+1749;N # BUHID LETTER PA
+174A;N # BUHID LETTER BA
+174B;N # BUHID LETTER MA
+174C;N # BUHID LETTER YA
+174D;N # BUHID LETTER RA
+174E;N # BUHID LETTER LA
+174F;N # BUHID LETTER WA
+1750;N # BUHID LETTER SA
+1751;N # BUHID LETTER HA
+1752;N # BUHID VOWEL SIGN I
+1753;N # BUHID VOWEL SIGN U
+1760;N # TAGBANWA LETTER A
+1761;N # TAGBANWA LETTER I
+1762;N # TAGBANWA LETTER U
+1763;N # TAGBANWA LETTER KA
+1764;N # TAGBANWA LETTER GA
+1765;N # TAGBANWA LETTER NGA
+1766;N # TAGBANWA LETTER TA
+1767;N # TAGBANWA LETTER DA
+1768;N # TAGBANWA LETTER NA
+1769;N # TAGBANWA LETTER PA
+176A;N # TAGBANWA LETTER BA
+176B;N # TAGBANWA LETTER MA
+176C;N # TAGBANWA LETTER YA
+176E;N # TAGBANWA LETTER LA
+176F;N # TAGBANWA LETTER WA
+1770;N # TAGBANWA LETTER SA
+1772;N # TAGBANWA VOWEL SIGN I
+1773;N # TAGBANWA VOWEL SIGN U
+1780;N # KHMER LETTER KA
+1781;N # KHMER LETTER KHA
+1782;N # KHMER LETTER KO
+1783;N # KHMER LETTER KHO
+1784;N # KHMER LETTER NGO
+1785;N # KHMER LETTER CA
+1786;N # KHMER LETTER CHA
+1787;N # KHMER LETTER CO
+1788;N # KHMER LETTER CHO
+1789;N # KHMER LETTER NYO
+178A;N # KHMER LETTER DA
+178B;N # KHMER LETTER TTHA
+178C;N # KHMER LETTER DO
+178D;N # KHMER LETTER TTHO
+178E;N # KHMER LETTER NNO
+178F;N # KHMER LETTER TA
+1790;N # KHMER LETTER THA
+1791;N # KHMER LETTER TO
+1792;N # KHMER LETTER THO
+1793;N # KHMER LETTER NO
+1794;N # KHMER LETTER BA
+1795;N # KHMER LETTER PHA
+1796;N # KHMER LETTER PO
+1797;N # KHMER LETTER PHO
+1798;N # KHMER LETTER MO
+1799;N # KHMER LETTER YO
+179A;N # KHMER LETTER RO
+179B;N # KHMER LETTER LO
+179C;N # KHMER LETTER VO
+179D;N # KHMER LETTER SHA
+179E;N # KHMER LETTER SSO
+179F;N # KHMER LETTER SA
+17A0;N # KHMER LETTER HA
+17A1;N # KHMER LETTER LA
+17A2;N # KHMER LETTER QA
+17A3;N # KHMER INDEPENDENT VOWEL QAQ
+17A4;N # KHMER INDEPENDENT VOWEL QAA
+17A5;N # KHMER INDEPENDENT VOWEL QI
+17A6;N # KHMER INDEPENDENT VOWEL QII
+17A7;N # KHMER INDEPENDENT VOWEL QU
+17A8;N # KHMER INDEPENDENT VOWEL QUK
+17A9;N # KHMER INDEPENDENT VOWEL QUU
+17AA;N # KHMER INDEPENDENT VOWEL QUUV
+17AB;N # KHMER INDEPENDENT VOWEL RY
+17AC;N # KHMER INDEPENDENT VOWEL RYY
+17AD;N # KHMER INDEPENDENT VOWEL LY
+17AE;N # KHMER INDEPENDENT VOWEL LYY
+17AF;N # KHMER INDEPENDENT VOWEL QE
+17B0;N # KHMER INDEPENDENT VOWEL QAI
+17B1;N # KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2;N # KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3;N # KHMER INDEPENDENT VOWEL QAU
+17B4;N # KHMER VOWEL INHERENT AQ
+17B5;N # KHMER VOWEL INHERENT AA
+17B6;N # KHMER VOWEL SIGN AA
+17B7;N # KHMER VOWEL SIGN I
+17B8;N # KHMER VOWEL SIGN II
+17B9;N # KHMER VOWEL SIGN Y
+17BA;N # KHMER VOWEL SIGN YY
+17BB;N # KHMER VOWEL SIGN U
+17BC;N # KHMER VOWEL SIGN UU
+17BD;N # KHMER VOWEL SIGN UA
+17BE;N # KHMER VOWEL SIGN OE
+17BF;N # KHMER VOWEL SIGN YA
+17C0;N # KHMER VOWEL SIGN IE
+17C1;N # KHMER VOWEL SIGN E
+17C2;N # KHMER VOWEL SIGN AE
+17C3;N # KHMER VOWEL SIGN AI
+17C4;N # KHMER VOWEL SIGN OO
+17C5;N # KHMER VOWEL SIGN AU
+17C6;N # KHMER SIGN NIKAHIT
+17C7;N # KHMER SIGN REAHMUK
+17C8;N # KHMER SIGN YUUKALEAPINTU
+17C9;N # KHMER SIGN MUUSIKATOAN
+17CA;N # KHMER SIGN TRIISAP
+17CB;N # KHMER SIGN BANTOC
+17CC;N # KHMER SIGN ROBAT
+17CD;N # KHMER SIGN TOANDAKHIAT
+17CE;N # KHMER SIGN KAKABAT
+17CF;N # KHMER SIGN AHSDA
+17D0;N # KHMER SIGN SAMYOK SANNYA
+17D1;N # KHMER SIGN VIRIAM
+17D2;N # KHMER SIGN COENG
+17D3;N # KHMER SIGN BATHAMASAT
+17D4;N # KHMER SIGN KHAN
+17D5;N # KHMER SIGN BARIYOOSAN
+17D6;N # KHMER SIGN CAMNUC PII KUUH
+17D7;N # KHMER SIGN LEK TOO
+17D8;N # KHMER SIGN BEYYAL
+17D9;N # KHMER SIGN PHNAEK MUAN
+17DA;N # KHMER SIGN KOOMUUT
+17DB;N # KHMER CURRENCY SYMBOL RIEL
+17DC;N # KHMER SIGN AVAKRAHASANYA
+17DD;N # KHMER SIGN ATTHACAN
+17E0;N # KHMER DIGIT ZERO
+17E1;N # KHMER DIGIT ONE
+17E2;N # KHMER DIGIT TWO
+17E3;N # KHMER DIGIT THREE
+17E4;N # KHMER DIGIT FOUR
+17E5;N # KHMER DIGIT FIVE
+17E6;N # KHMER DIGIT SIX
+17E7;N # KHMER DIGIT SEVEN
+17E8;N # KHMER DIGIT EIGHT
+17E9;N # KHMER DIGIT NINE
+17F0;N # KHMER SYMBOL LEK ATTAK SON
+17F1;N # KHMER SYMBOL LEK ATTAK MUOY
+17F2;N # KHMER SYMBOL LEK ATTAK PII
+17F3;N # KHMER SYMBOL LEK ATTAK BEI
+17F4;N # KHMER SYMBOL LEK ATTAK BUON
+17F5;N # KHMER SYMBOL LEK ATTAK PRAM
+17F6;N # KHMER SYMBOL LEK ATTAK PRAM-MUOY
+17F7;N # KHMER SYMBOL LEK ATTAK PRAM-PII
+17F8;N # KHMER SYMBOL LEK ATTAK PRAM-BEI
+17F9;N # KHMER SYMBOL LEK ATTAK PRAM-BUON
+1800;N # MONGOLIAN BIRGA
+1801;N # MONGOLIAN ELLIPSIS
+1802;N # MONGOLIAN COMMA
+1803;N # MONGOLIAN FULL STOP
+1804;N # MONGOLIAN COLON
+1805;N # MONGOLIAN FOUR DOTS
+1806;N # MONGOLIAN TODO SOFT HYPHEN
+1807;N # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808;N # MONGOLIAN MANCHU COMMA
+1809;N # MONGOLIAN MANCHU FULL STOP
+180A;N # MONGOLIAN NIRUGU
+180B;N # MONGOLIAN FREE VARIATION SELECTOR ONE
+180C;N # MONGOLIAN FREE VARIATION SELECTOR TWO
+180D;N # MONGOLIAN FREE VARIATION SELECTOR THREE
+180E;N # MONGOLIAN VOWEL SEPARATOR
+1810;N # MONGOLIAN DIGIT ZERO
+1811;N # MONGOLIAN DIGIT ONE
+1812;N # MONGOLIAN DIGIT TWO
+1813;N # MONGOLIAN DIGIT THREE
+1814;N # MONGOLIAN DIGIT FOUR
+1815;N # MONGOLIAN DIGIT FIVE
+1816;N # MONGOLIAN DIGIT SIX
+1817;N # MONGOLIAN DIGIT SEVEN
+1818;N # MONGOLIAN DIGIT EIGHT
+1819;N # MONGOLIAN DIGIT NINE
+1820;N # MONGOLIAN LETTER A
+1821;N # MONGOLIAN LETTER E
+1822;N # MONGOLIAN LETTER I
+1823;N # MONGOLIAN LETTER O
+1824;N # MONGOLIAN LETTER U
+1825;N # MONGOLIAN LETTER OE
+1826;N # MONGOLIAN LETTER UE
+1827;N # MONGOLIAN LETTER EE
+1828;N # MONGOLIAN LETTER NA
+1829;N # MONGOLIAN LETTER ANG
+182A;N # MONGOLIAN LETTER BA
+182B;N # MONGOLIAN LETTER PA
+182C;N # MONGOLIAN LETTER QA
+182D;N # MONGOLIAN LETTER GA
+182E;N # MONGOLIAN LETTER MA
+182F;N # MONGOLIAN LETTER LA
+1830;N # MONGOLIAN LETTER SA
+1831;N # MONGOLIAN LETTER SHA
+1832;N # MONGOLIAN LETTER TA
+1833;N # MONGOLIAN LETTER DA
+1834;N # MONGOLIAN LETTER CHA
+1835;N # MONGOLIAN LETTER JA
+1836;N # MONGOLIAN LETTER YA
+1837;N # MONGOLIAN LETTER RA
+1838;N # MONGOLIAN LETTER WA
+1839;N # MONGOLIAN LETTER FA
+183A;N # MONGOLIAN LETTER KA
+183B;N # MONGOLIAN LETTER KHA
+183C;N # MONGOLIAN LETTER TSA
+183D;N # MONGOLIAN LETTER ZA
+183E;N # MONGOLIAN LETTER HAA
+183F;N # MONGOLIAN LETTER ZRA
+1840;N # MONGOLIAN LETTER LHA
+1841;N # MONGOLIAN LETTER ZHI
+1842;N # MONGOLIAN LETTER CHI
+1843;N # MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844;N # MONGOLIAN LETTER TODO E
+1845;N # MONGOLIAN LETTER TODO I
+1846;N # MONGOLIAN LETTER TODO O
+1847;N # MONGOLIAN LETTER TODO U
+1848;N # MONGOLIAN LETTER TODO OE
+1849;N # MONGOLIAN LETTER TODO UE
+184A;N # MONGOLIAN LETTER TODO ANG
+184B;N # MONGOLIAN LETTER TODO BA
+184C;N # MONGOLIAN LETTER TODO PA
+184D;N # MONGOLIAN LETTER TODO QA
+184E;N # MONGOLIAN LETTER TODO GA
+184F;N # MONGOLIAN LETTER TODO MA
+1850;N # MONGOLIAN LETTER TODO TA
+1851;N # MONGOLIAN LETTER TODO DA
+1852;N # MONGOLIAN LETTER TODO CHA
+1853;N # MONGOLIAN LETTER TODO JA
+1854;N # MONGOLIAN LETTER TODO TSA
+1855;N # MONGOLIAN LETTER TODO YA
+1856;N # MONGOLIAN LETTER TODO WA
+1857;N # MONGOLIAN LETTER TODO KA
+1858;N # MONGOLIAN LETTER TODO GAA
+1859;N # MONGOLIAN LETTER TODO HAA
+185A;N # MONGOLIAN LETTER TODO JIA
+185B;N # MONGOLIAN LETTER TODO NIA
+185C;N # MONGOLIAN LETTER TODO DZA
+185D;N # MONGOLIAN LETTER SIBE E
+185E;N # MONGOLIAN LETTER SIBE I
+185F;N # MONGOLIAN LETTER SIBE IY
+1860;N # MONGOLIAN LETTER SIBE UE
+1861;N # MONGOLIAN LETTER SIBE U
+1862;N # MONGOLIAN LETTER SIBE ANG
+1863;N # MONGOLIAN LETTER SIBE KA
+1864;N # MONGOLIAN LETTER SIBE GA
+1865;N # MONGOLIAN LETTER SIBE HA
+1866;N # MONGOLIAN LETTER SIBE PA
+1867;N # MONGOLIAN LETTER SIBE SHA
+1868;N # MONGOLIAN LETTER SIBE TA
+1869;N # MONGOLIAN LETTER SIBE DA
+186A;N # MONGOLIAN LETTER SIBE JA
+186B;N # MONGOLIAN LETTER SIBE FA
+186C;N # MONGOLIAN LETTER SIBE GAA
+186D;N # MONGOLIAN LETTER SIBE HAA
+186E;N # MONGOLIAN LETTER SIBE TSA
+186F;N # MONGOLIAN LETTER SIBE ZA
+1870;N # MONGOLIAN LETTER SIBE RAA
+1871;N # MONGOLIAN LETTER SIBE CHA
+1872;N # MONGOLIAN LETTER SIBE ZHA
+1873;N # MONGOLIAN LETTER MANCHU I
+1874;N # MONGOLIAN LETTER MANCHU KA
+1875;N # MONGOLIAN LETTER MANCHU RA
+1876;N # MONGOLIAN LETTER MANCHU FA
+1877;N # MONGOLIAN LETTER MANCHU ZHA
+1880;N # MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881;N # MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882;N # MONGOLIAN LETTER ALI GALI DAMARU
+1883;N # MONGOLIAN LETTER ALI GALI UBADAMA
+1884;N # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885;N # MONGOLIAN LETTER ALI GALI BALUDA
+1886;N # MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887;N # MONGOLIAN LETTER ALI GALI A
+1888;N # MONGOLIAN LETTER ALI GALI I
+1889;N # MONGOLIAN LETTER ALI GALI KA
+188A;N # MONGOLIAN LETTER ALI GALI NGA
+188B;N # MONGOLIAN LETTER ALI GALI CA
+188C;N # MONGOLIAN LETTER ALI GALI TTA
+188D;N # MONGOLIAN LETTER ALI GALI TTHA
+188E;N # MONGOLIAN LETTER ALI GALI DDA
+188F;N # MONGOLIAN LETTER ALI GALI NNA
+1890;N # MONGOLIAN LETTER ALI GALI TA
+1891;N # MONGOLIAN LETTER ALI GALI DA
+1892;N # MONGOLIAN LETTER ALI GALI PA
+1893;N # MONGOLIAN LETTER ALI GALI PHA
+1894;N # MONGOLIAN LETTER ALI GALI SSA
+1895;N # MONGOLIAN LETTER ALI GALI ZHA
+1896;N # MONGOLIAN LETTER ALI GALI ZA
+1897;N # MONGOLIAN LETTER ALI GALI AH
+1898;N # MONGOLIAN LETTER TODO ALI GALI TA
+1899;N # MONGOLIAN LETTER TODO ALI GALI ZHA
+189A;N # MONGOLIAN LETTER MANCHU ALI GALI GHA
+189B;N # MONGOLIAN LETTER MANCHU ALI GALI NGA
+189C;N # MONGOLIAN LETTER MANCHU ALI GALI CA
+189D;N # MONGOLIAN LETTER MANCHU ALI GALI JHA
+189E;N # MONGOLIAN LETTER MANCHU ALI GALI TTA
+189F;N # MONGOLIAN LETTER MANCHU ALI GALI DDHA
+18A0;N # MONGOLIAN LETTER MANCHU ALI GALI TA
+18A1;N # MONGOLIAN LETTER MANCHU ALI GALI DHA
+18A2;N # MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A3;N # MONGOLIAN LETTER MANCHU ALI GALI CYA
+18A4;N # MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5;N # MONGOLIAN LETTER MANCHU ALI GALI ZA
+18A6;N # MONGOLIAN LETTER ALI GALI HALF U
+18A7;N # MONGOLIAN LETTER ALI GALI HALF YA
+18A8;N # MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9;N # MONGOLIAN LETTER ALI GALI DAGALGA
+18AA;N # MONGOLIAN LETTER MANCHU ALI GALI LHA
+1900;N # LIMBU VOWEL-CARRIER LETTER
+1901;N # LIMBU LETTER KA
+1902;N # LIMBU LETTER KHA
+1903;N # LIMBU LETTER GA
+1904;N # LIMBU LETTER GHA
+1905;N # LIMBU LETTER NGA
+1906;N # LIMBU LETTER CA
+1907;N # LIMBU LETTER CHA
+1908;N # LIMBU LETTER JA
+1909;N # LIMBU LETTER JHA
+190A;N # LIMBU LETTER YAN
+190B;N # LIMBU LETTER TA
+190C;N # LIMBU LETTER THA
+190D;N # LIMBU LETTER DA
+190E;N # LIMBU LETTER DHA
+190F;N # LIMBU LETTER NA
+1910;N # LIMBU LETTER PA
+1911;N # LIMBU LETTER PHA
+1912;N # LIMBU LETTER BA
+1913;N # LIMBU LETTER BHA
+1914;N # LIMBU LETTER MA
+1915;N # LIMBU LETTER YA
+1916;N # LIMBU LETTER RA
+1917;N # LIMBU LETTER LA
+1918;N # LIMBU LETTER WA
+1919;N # LIMBU LETTER SHA
+191A;N # LIMBU LETTER SSA
+191B;N # LIMBU LETTER SA
+191C;N # LIMBU LETTER HA
+1920;N # LIMBU VOWEL SIGN A
+1921;N # LIMBU VOWEL SIGN I
+1922;N # LIMBU VOWEL SIGN U
+1923;N # LIMBU VOWEL SIGN EE
+1924;N # LIMBU VOWEL SIGN AI
+1925;N # LIMBU VOWEL SIGN OO
+1926;N # LIMBU VOWEL SIGN AU
+1927;N # LIMBU VOWEL SIGN E
+1928;N # LIMBU VOWEL SIGN O
+1929;N # LIMBU SUBJOINED LETTER YA
+192A;N # LIMBU SUBJOINED LETTER RA
+192B;N # LIMBU SUBJOINED LETTER WA
+1930;N # LIMBU SMALL LETTER KA
+1931;N # LIMBU SMALL LETTER NGA
+1932;N # LIMBU SMALL LETTER ANUSVARA
+1933;N # LIMBU SMALL LETTER TA
+1934;N # LIMBU SMALL LETTER NA
+1935;N # LIMBU SMALL LETTER PA
+1936;N # LIMBU SMALL LETTER MA
+1937;N # LIMBU SMALL LETTER RA
+1938;N # LIMBU SMALL LETTER LA
+1939;N # LIMBU SIGN MUKPHRENG
+193A;N # LIMBU SIGN KEMPHRENG
+193B;N # LIMBU SIGN SA-I
+1940;N # LIMBU SIGN LOO
+1944;N # LIMBU EXCLAMATION MARK
+1945;N # LIMBU QUESTION MARK
+1946;N # LIMBU DIGIT ZERO
+1947;N # LIMBU DIGIT ONE
+1948;N # LIMBU DIGIT TWO
+1949;N # LIMBU DIGIT THREE
+194A;N # LIMBU DIGIT FOUR
+194B;N # LIMBU DIGIT FIVE
+194C;N # LIMBU DIGIT SIX
+194D;N # LIMBU DIGIT SEVEN
+194E;N # LIMBU DIGIT EIGHT
+194F;N # LIMBU DIGIT NINE
+1950;N # TAI LE LETTER KA
+1951;N # TAI LE LETTER XA
+1952;N # TAI LE LETTER NGA
+1953;N # TAI LE LETTER TSA
+1954;N # TAI LE LETTER SA
+1955;N # TAI LE LETTER YA
+1956;N # TAI LE LETTER TA
+1957;N # TAI LE LETTER THA
+1958;N # TAI LE LETTER LA
+1959;N # TAI LE LETTER PA
+195A;N # TAI LE LETTER PHA
+195B;N # TAI LE LETTER MA
+195C;N # TAI LE LETTER FA
+195D;N # TAI LE LETTER VA
+195E;N # TAI LE LETTER HA
+195F;N # TAI LE LETTER QA
+1960;N # TAI LE LETTER KHA
+1961;N # TAI LE LETTER TSHA
+1962;N # TAI LE LETTER NA
+1963;N # TAI LE LETTER A
+1964;N # TAI LE LETTER I
+1965;N # TAI LE LETTER EE
+1966;N # TAI LE LETTER EH
+1967;N # TAI LE LETTER U
+1968;N # TAI LE LETTER OO
+1969;N # TAI LE LETTER O
+196A;N # TAI LE LETTER UE
+196B;N # TAI LE LETTER E
+196C;N # TAI LE LETTER AUE
+196D;N # TAI LE LETTER AI
+1970;N # TAI LE LETTER TONE-2
+1971;N # TAI LE LETTER TONE-3
+1972;N # TAI LE LETTER TONE-4
+1973;N # TAI LE LETTER TONE-5
+1974;N # TAI LE LETTER TONE-6
+1980;N # NEW TAI LUE LETTER HIGH QA
+1981;N # NEW TAI LUE LETTER LOW QA
+1982;N # NEW TAI LUE LETTER HIGH KA
+1983;N # NEW TAI LUE LETTER HIGH XA
+1984;N # NEW TAI LUE LETTER HIGH NGA
+1985;N # NEW TAI LUE LETTER LOW KA
+1986;N # NEW TAI LUE LETTER LOW XA
+1987;N # NEW TAI LUE LETTER LOW NGA
+1988;N # NEW TAI LUE LETTER HIGH TSA
+1989;N # NEW TAI LUE LETTER HIGH SA
+198A;N # NEW TAI LUE LETTER HIGH YA
+198B;N # NEW TAI LUE LETTER LOW TSA
+198C;N # NEW TAI LUE LETTER LOW SA
+198D;N # NEW TAI LUE LETTER LOW YA
+198E;N # NEW TAI LUE LETTER HIGH TA
+198F;N # NEW TAI LUE LETTER HIGH THA
+1990;N # NEW TAI LUE LETTER HIGH NA
+1991;N # NEW TAI LUE LETTER LOW TA
+1992;N # NEW TAI LUE LETTER LOW THA
+1993;N # NEW TAI LUE LETTER LOW NA
+1994;N # NEW TAI LUE LETTER HIGH PA
+1995;N # NEW TAI LUE LETTER HIGH PHA
+1996;N # NEW TAI LUE LETTER HIGH MA
+1997;N # NEW TAI LUE LETTER LOW PA
+1998;N # NEW TAI LUE LETTER LOW PHA
+1999;N # NEW TAI LUE LETTER LOW MA
+199A;N # NEW TAI LUE LETTER HIGH FA
+199B;N # NEW TAI LUE LETTER HIGH VA
+199C;N # NEW TAI LUE LETTER HIGH LA
+199D;N # NEW TAI LUE LETTER LOW FA
+199E;N # NEW TAI LUE LETTER LOW VA
+199F;N # NEW TAI LUE LETTER LOW LA
+19A0;N # NEW TAI LUE LETTER HIGH HA
+19A1;N # NEW TAI LUE LETTER HIGH DA
+19A2;N # NEW TAI LUE LETTER HIGH BA
+19A3;N # NEW TAI LUE LETTER LOW HA
+19A4;N # NEW TAI LUE LETTER LOW DA
+19A5;N # NEW TAI LUE LETTER LOW BA
+19A6;N # NEW TAI LUE LETTER HIGH KVA
+19A7;N # NEW TAI LUE LETTER HIGH XVA
+19A8;N # NEW TAI LUE LETTER LOW KVA
+19A9;N # NEW TAI LUE LETTER LOW XVA
+19B0;N # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
+19B1;N # NEW TAI LUE VOWEL SIGN AA
+19B2;N # NEW TAI LUE VOWEL SIGN II
+19B3;N # NEW TAI LUE VOWEL SIGN U
+19B4;N # NEW TAI LUE VOWEL SIGN UU
+19B5;N # NEW TAI LUE VOWEL SIGN E
+19B6;N # NEW TAI LUE VOWEL SIGN AE
+19B7;N # NEW TAI LUE VOWEL SIGN O
+19B8;N # NEW TAI LUE VOWEL SIGN OA
+19B9;N # NEW TAI LUE VOWEL SIGN UE
+19BA;N # NEW TAI LUE VOWEL SIGN AY
+19BB;N # NEW TAI LUE VOWEL SIGN AAY
+19BC;N # NEW TAI LUE VOWEL SIGN UY
+19BD;N # NEW TAI LUE VOWEL SIGN OY
+19BE;N # NEW TAI LUE VOWEL SIGN OAY
+19BF;N # NEW TAI LUE VOWEL SIGN UEY
+19C0;N # NEW TAI LUE VOWEL SIGN IY
+19C1;N # NEW TAI LUE LETTER FINAL V
+19C2;N # NEW TAI LUE LETTER FINAL NG
+19C3;N # NEW TAI LUE LETTER FINAL N
+19C4;N # NEW TAI LUE LETTER FINAL M
+19C5;N # NEW TAI LUE LETTER FINAL K
+19C6;N # NEW TAI LUE LETTER FINAL D
+19C7;N # NEW TAI LUE LETTER FINAL B
+19C8;N # NEW TAI LUE TONE MARK-1
+19C9;N # NEW TAI LUE TONE MARK-2
+19D0;N # NEW TAI LUE DIGIT ZERO
+19D1;N # NEW TAI LUE DIGIT ONE
+19D2;N # NEW TAI LUE DIGIT TWO
+19D3;N # NEW TAI LUE DIGIT THREE
+19D4;N # NEW TAI LUE DIGIT FOUR
+19D5;N # NEW TAI LUE DIGIT FIVE
+19D6;N # NEW TAI LUE DIGIT SIX
+19D7;N # NEW TAI LUE DIGIT SEVEN
+19D8;N # NEW TAI LUE DIGIT EIGHT
+19D9;N # NEW TAI LUE DIGIT NINE
+19DE;N # NEW TAI LUE SIGN LAE
+19DF;N # NEW TAI LUE SIGN LAEV
+19E0;N # KHMER SYMBOL PATHAMASAT
+19E1;N # KHMER SYMBOL MUOY KOET
+19E2;N # KHMER SYMBOL PII KOET
+19E3;N # KHMER SYMBOL BEI KOET
+19E4;N # KHMER SYMBOL BUON KOET
+19E5;N # KHMER SYMBOL PRAM KOET
+19E6;N # KHMER SYMBOL PRAM-MUOY KOET
+19E7;N # KHMER SYMBOL PRAM-PII KOET
+19E8;N # KHMER SYMBOL PRAM-BEI KOET
+19E9;N # KHMER SYMBOL PRAM-BUON KOET
+19EA;N # KHMER SYMBOL DAP KOET
+19EB;N # KHMER SYMBOL DAP-MUOY KOET
+19EC;N # KHMER SYMBOL DAP-PII KOET
+19ED;N # KHMER SYMBOL DAP-BEI KOET
+19EE;N # KHMER SYMBOL DAP-BUON KOET
+19EF;N # KHMER SYMBOL DAP-PRAM KOET
+19F0;N # KHMER SYMBOL TUTEYASAT
+19F1;N # KHMER SYMBOL MUOY ROC
+19F2;N # KHMER SYMBOL PII ROC
+19F3;N # KHMER SYMBOL BEI ROC
+19F4;N # KHMER SYMBOL BUON ROC
+19F5;N # KHMER SYMBOL PRAM ROC
+19F6;N # KHMER SYMBOL PRAM-MUOY ROC
+19F7;N # KHMER SYMBOL PRAM-PII ROC
+19F8;N # KHMER SYMBOL PRAM-BEI ROC
+19F9;N # KHMER SYMBOL PRAM-BUON ROC
+19FA;N # KHMER SYMBOL DAP ROC
+19FB;N # KHMER SYMBOL DAP-MUOY ROC
+19FC;N # KHMER SYMBOL DAP-PII ROC
+19FD;N # KHMER SYMBOL DAP-BEI ROC
+19FE;N # KHMER SYMBOL DAP-BUON ROC
+19FF;N # KHMER SYMBOL DAP-PRAM ROC
+1A00;N # BUGINESE LETTER KA
+1A01;N # BUGINESE LETTER GA
+1A02;N # BUGINESE LETTER NGA
+1A03;N # BUGINESE LETTER NGKA
+1A04;N # BUGINESE LETTER PA
+1A05;N # BUGINESE LETTER BA
+1A06;N # BUGINESE LETTER MA
+1A07;N # BUGINESE LETTER MPA
+1A08;N # BUGINESE LETTER TA
+1A09;N # BUGINESE LETTER DA
+1A0A;N # BUGINESE LETTER NA
+1A0B;N # BUGINESE LETTER NRA
+1A0C;N # BUGINESE LETTER CA
+1A0D;N # BUGINESE LETTER JA
+1A0E;N # BUGINESE LETTER NYA
+1A0F;N # BUGINESE LETTER NYCA
+1A10;N # BUGINESE LETTER YA
+1A11;N # BUGINESE LETTER RA
+1A12;N # BUGINESE LETTER LA
+1A13;N # BUGINESE LETTER VA
+1A14;N # BUGINESE LETTER SA
+1A15;N # BUGINESE LETTER A
+1A16;N # BUGINESE LETTER HA
+1A17;N # BUGINESE VOWEL SIGN I
+1A18;N # BUGINESE VOWEL SIGN U
+1A19;N # BUGINESE VOWEL SIGN E
+1A1A;N # BUGINESE VOWEL SIGN O
+1A1B;N # BUGINESE VOWEL SIGN AE
+1A1E;N # BUGINESE PALLAWA
+1A1F;N # BUGINESE END OF SECTION
+1B00;N # BALINESE SIGN ULU RICEM
+1B01;N # BALINESE SIGN ULU CANDRA
+1B02;N # BALINESE SIGN CECEK
+1B03;N # BALINESE SIGN SURANG
+1B04;N # BALINESE SIGN BISAH
+1B05;N # BALINESE LETTER AKARA
+1B06;N # BALINESE LETTER AKARA TEDUNG
+1B07;N # BALINESE LETTER IKARA
+1B08;N # BALINESE LETTER IKARA TEDUNG
+1B09;N # BALINESE LETTER UKARA
+1B0A;N # BALINESE LETTER UKARA TEDUNG
+1B0B;N # BALINESE LETTER RA REPA
+1B0C;N # BALINESE LETTER RA REPA TEDUNG
+1B0D;N # BALINESE LETTER LA LENGA
+1B0E;N # BALINESE LETTER LA LENGA TEDUNG
+1B0F;N # BALINESE LETTER EKARA
+1B10;N # BALINESE LETTER AIKARA
+1B11;N # BALINESE LETTER OKARA
+1B12;N # BALINESE LETTER OKARA TEDUNG
+1B13;N # BALINESE LETTER KA
+1B14;N # BALINESE LETTER KA MAHAPRANA
+1B15;N # BALINESE LETTER GA
+1B16;N # BALINESE LETTER GA GORA
+1B17;N # BALINESE LETTER NGA
+1B18;N # BALINESE LETTER CA
+1B19;N # BALINESE LETTER CA LACA
+1B1A;N # BALINESE LETTER JA
+1B1B;N # BALINESE LETTER JA JERA
+1B1C;N # BALINESE LETTER NYA
+1B1D;N # BALINESE LETTER TA LATIK
+1B1E;N # BALINESE LETTER TA MURDA MAHAPRANA
+1B1F;N # BALINESE LETTER DA MURDA ALPAPRANA
+1B20;N # BALINESE LETTER DA MURDA MAHAPRANA
+1B21;N # BALINESE LETTER NA RAMBAT
+1B22;N # BALINESE LETTER TA
+1B23;N # BALINESE LETTER TA TAWA
+1B24;N # BALINESE LETTER DA
+1B25;N # BALINESE LETTER DA MADU
+1B26;N # BALINESE LETTER NA
+1B27;N # BALINESE LETTER PA
+1B28;N # BALINESE LETTER PA KAPAL
+1B29;N # BALINESE LETTER BA
+1B2A;N # BALINESE LETTER BA KEMBANG
+1B2B;N # BALINESE LETTER MA
+1B2C;N # BALINESE LETTER YA
+1B2D;N # BALINESE LETTER RA
+1B2E;N # BALINESE LETTER LA
+1B2F;N # BALINESE LETTER WA
+1B30;N # BALINESE LETTER SA SAGA
+1B31;N # BALINESE LETTER SA SAPA
+1B32;N # BALINESE LETTER SA
+1B33;N # BALINESE LETTER HA
+1B34;N # BALINESE SIGN REREKAN
+1B35;N # BALINESE VOWEL SIGN TEDUNG
+1B36;N # BALINESE VOWEL SIGN ULU
+1B37;N # BALINESE VOWEL SIGN ULU SARI
+1B38;N # BALINESE VOWEL SIGN SUKU
+1B39;N # BALINESE VOWEL SIGN SUKU ILUT
+1B3A;N # BALINESE VOWEL SIGN RA REPA
+1B3B;N # BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C;N # BALINESE VOWEL SIGN LA LENGA
+1B3D;N # BALINESE VOWEL SIGN LA LENGA TEDUNG
+1B3E;N # BALINESE VOWEL SIGN TALING
+1B3F;N # BALINESE VOWEL SIGN TALING REPA
+1B40;N # BALINESE VOWEL SIGN TALING TEDUNG
+1B41;N # BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42;N # BALINESE VOWEL SIGN PEPET
+1B43;N # BALINESE VOWEL SIGN PEPET TEDUNG
+1B44;N # BALINESE ADEG ADEG
+1B45;N # BALINESE LETTER KAF SASAK
+1B46;N # BALINESE LETTER KHOT SASAK
+1B47;N # BALINESE LETTER TZIR SASAK
+1B48;N # BALINESE LETTER EF SASAK
+1B49;N # BALINESE LETTER VE SASAK
+1B4A;N # BALINESE LETTER ZAL SASAK
+1B4B;N # BALINESE LETTER ASYURA SASAK
+1B50;N # BALINESE DIGIT ZERO
+1B51;N # BALINESE DIGIT ONE
+1B52;N # BALINESE DIGIT TWO
+1B53;N # BALINESE DIGIT THREE
+1B54;N # BALINESE DIGIT FOUR
+1B55;N # BALINESE DIGIT FIVE
+1B56;N # BALINESE DIGIT SIX
+1B57;N # BALINESE DIGIT SEVEN
+1B58;N # BALINESE DIGIT EIGHT
+1B59;N # BALINESE DIGIT NINE
+1B5A;N # BALINESE PANTI
+1B5B;N # BALINESE PAMADA
+1B5C;N # BALINESE WINDU
+1B5D;N # BALINESE CARIK PAMUNGKAH
+1B5E;N # BALINESE CARIK SIKI
+1B5F;N # BALINESE CARIK PAREREN
+1B60;N # BALINESE PAMENENG
+1B61;N # BALINESE MUSICAL SYMBOL DONG
+1B62;N # BALINESE MUSICAL SYMBOL DENG
+1B63;N # BALINESE MUSICAL SYMBOL DUNG
+1B64;N # BALINESE MUSICAL SYMBOL DANG
+1B65;N # BALINESE MUSICAL SYMBOL DANG SURANG
+1B66;N # BALINESE MUSICAL SYMBOL DING
+1B67;N # BALINESE MUSICAL SYMBOL DAENG
+1B68;N # BALINESE MUSICAL SYMBOL DEUNG
+1B69;N # BALINESE MUSICAL SYMBOL DAING
+1B6A;N # BALINESE MUSICAL SYMBOL DANG GEDE
+1B6B;N # BALINESE MUSICAL SYMBOL COMBINING TEGEH
+1B6C;N # BALINESE MUSICAL SYMBOL COMBINING ENDEP
+1B6D;N # BALINESE MUSICAL SYMBOL COMBINING KEMPUL
+1B6E;N # BALINESE MUSICAL SYMBOL COMBINING KEMPLI
+1B6F;N # BALINESE MUSICAL SYMBOL COMBINING JEGOGAN
+1B70;N # BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN
+1B71;N # BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN
+1B72;N # BALINESE MUSICAL SYMBOL COMBINING BENDE
+1B73;N # BALINESE MUSICAL SYMBOL COMBINING GONG
+1B74;N # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG
+1B75;N # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG
+1B76;N # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK
+1B77;N # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK
+1B78;N # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG
+1B79;N # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG
+1B7A;N # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK
+1B7B;N # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK
+1B7C;N # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+1B80;N # SUNDANESE SIGN PANYECEK
+1B81;N # SUNDANESE SIGN PANGLAYAR
+1B82;N # SUNDANESE SIGN PANGWISAD
+1B83;N # SUNDANESE LETTER A
+1B84;N # SUNDANESE LETTER I
+1B85;N # SUNDANESE LETTER U
+1B86;N # SUNDANESE LETTER AE
+1B87;N # SUNDANESE LETTER O
+1B88;N # SUNDANESE LETTER E
+1B89;N # SUNDANESE LETTER EU
+1B8A;N # SUNDANESE LETTER KA
+1B8B;N # SUNDANESE LETTER QA
+1B8C;N # SUNDANESE LETTER GA
+1B8D;N # SUNDANESE LETTER NGA
+1B8E;N # SUNDANESE LETTER CA
+1B8F;N # SUNDANESE LETTER JA
+1B90;N # SUNDANESE LETTER ZA
+1B91;N # SUNDANESE LETTER NYA
+1B92;N # SUNDANESE LETTER TA
+1B93;N # SUNDANESE LETTER DA
+1B94;N # SUNDANESE LETTER NA
+1B95;N # SUNDANESE LETTER PA
+1B96;N # SUNDANESE LETTER FA
+1B97;N # SUNDANESE LETTER VA
+1B98;N # SUNDANESE LETTER BA
+1B99;N # SUNDANESE LETTER MA
+1B9A;N # SUNDANESE LETTER YA
+1B9B;N # SUNDANESE LETTER RA
+1B9C;N # SUNDANESE LETTER LA
+1B9D;N # SUNDANESE LETTER WA
+1B9E;N # SUNDANESE LETTER SA
+1B9F;N # SUNDANESE LETTER XA
+1BA0;N # SUNDANESE LETTER HA
+1BA1;N # SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA2;N # SUNDANESE CONSONANT SIGN PANYAKRA
+1BA3;N # SUNDANESE CONSONANT SIGN PANYIKU
+1BA4;N # SUNDANESE VOWEL SIGN PANGHULU
+1BA5;N # SUNDANESE VOWEL SIGN PANYUKU
+1BA6;N # SUNDANESE VOWEL SIGN PANAELAENG
+1BA7;N # SUNDANESE VOWEL SIGN PANOLONG
+1BA8;N # SUNDANESE VOWEL SIGN PAMEPET
+1BA9;N # SUNDANESE VOWEL SIGN PANEULEUNG
+1BAA;N # SUNDANESE SIGN PAMAAEH
+1BAE;N # SUNDANESE LETTER KHA
+1BAF;N # SUNDANESE LETTER SYA
+1BB0;N # SUNDANESE DIGIT ZERO
+1BB1;N # SUNDANESE DIGIT ONE
+1BB2;N # SUNDANESE DIGIT TWO
+1BB3;N # SUNDANESE DIGIT THREE
+1BB4;N # SUNDANESE DIGIT FOUR
+1BB5;N # SUNDANESE DIGIT FIVE
+1BB6;N # SUNDANESE DIGIT SIX
+1BB7;N # SUNDANESE DIGIT SEVEN
+1BB8;N # SUNDANESE DIGIT EIGHT
+1BB9;N # SUNDANESE DIGIT NINE
+1C00;N # LEPCHA LETTER KA
+1C01;N # LEPCHA LETTER KLA
+1C02;N # LEPCHA LETTER KHA
+1C03;N # LEPCHA LETTER GA
+1C04;N # LEPCHA LETTER GLA
+1C05;N # LEPCHA LETTER NGA
+1C06;N # LEPCHA LETTER CA
+1C07;N # LEPCHA LETTER CHA
+1C08;N # LEPCHA LETTER JA
+1C09;N # LEPCHA LETTER NYA
+1C0A;N # LEPCHA LETTER TA
+1C0B;N # LEPCHA LETTER THA
+1C0C;N # LEPCHA LETTER DA
+1C0D;N # LEPCHA LETTER NA
+1C0E;N # LEPCHA LETTER PA
+1C0F;N # LEPCHA LETTER PLA
+1C10;N # LEPCHA LETTER PHA
+1C11;N # LEPCHA LETTER FA
+1C12;N # LEPCHA LETTER FLA
+1C13;N # LEPCHA LETTER BA
+1C14;N # LEPCHA LETTER BLA
+1C15;N # LEPCHA LETTER MA
+1C16;N # LEPCHA LETTER MLA
+1C17;N # LEPCHA LETTER TSA
+1C18;N # LEPCHA LETTER TSHA
+1C19;N # LEPCHA LETTER DZA
+1C1A;N # LEPCHA LETTER YA
+1C1B;N # LEPCHA LETTER RA
+1C1C;N # LEPCHA LETTER LA
+1C1D;N # LEPCHA LETTER HA
+1C1E;N # LEPCHA LETTER HLA
+1C1F;N # LEPCHA LETTER VA
+1C20;N # LEPCHA LETTER SA
+1C21;N # LEPCHA LETTER SHA
+1C22;N # LEPCHA LETTER WA
+1C23;N # LEPCHA LETTER A
+1C24;N # LEPCHA SUBJOINED LETTER YA
+1C25;N # LEPCHA SUBJOINED LETTER RA
+1C26;N # LEPCHA VOWEL SIGN AA
+1C27;N # LEPCHA VOWEL SIGN I
+1C28;N # LEPCHA VOWEL SIGN O
+1C29;N # LEPCHA VOWEL SIGN OO
+1C2A;N # LEPCHA VOWEL SIGN U
+1C2B;N # LEPCHA VOWEL SIGN UU
+1C2C;N # LEPCHA VOWEL SIGN E
+1C2D;N # LEPCHA CONSONANT SIGN K
+1C2E;N # LEPCHA CONSONANT SIGN M
+1C2F;N # LEPCHA CONSONANT SIGN L
+1C30;N # LEPCHA CONSONANT SIGN N
+1C31;N # LEPCHA CONSONANT SIGN P
+1C32;N # LEPCHA CONSONANT SIGN R
+1C33;N # LEPCHA CONSONANT SIGN T
+1C34;N # LEPCHA CONSONANT SIGN NYIN-DO
+1C35;N # LEPCHA CONSONANT SIGN KANG
+1C36;N # LEPCHA SIGN RAN
+1C37;N # LEPCHA SIGN NUKTA
+1C3B;N # LEPCHA PUNCTUATION TA-ROL
+1C3C;N # LEPCHA PUNCTUATION NYET THYOOM TA-ROL
+1C3D;N # LEPCHA PUNCTUATION CER-WA
+1C3E;N # LEPCHA PUNCTUATION TSHOOK CER-WA
+1C3F;N # LEPCHA PUNCTUATION TSHOOK
+1C40;N # LEPCHA DIGIT ZERO
+1C41;N # LEPCHA DIGIT ONE
+1C42;N # LEPCHA DIGIT TWO
+1C43;N # LEPCHA DIGIT THREE
+1C44;N # LEPCHA DIGIT FOUR
+1C45;N # LEPCHA DIGIT FIVE
+1C46;N # LEPCHA DIGIT SIX
+1C47;N # LEPCHA DIGIT SEVEN
+1C48;N # LEPCHA DIGIT EIGHT
+1C49;N # LEPCHA DIGIT NINE
+1C4D;N # LEPCHA LETTER TTA
+1C4E;N # LEPCHA LETTER TTHA
+1C4F;N # LEPCHA LETTER DDA
+1C50;N # OL CHIKI DIGIT ZERO
+1C51;N # OL CHIKI DIGIT ONE
+1C52;N # OL CHIKI DIGIT TWO
+1C53;N # OL CHIKI DIGIT THREE
+1C54;N # OL CHIKI DIGIT FOUR
+1C55;N # OL CHIKI DIGIT FIVE
+1C56;N # OL CHIKI DIGIT SIX
+1C57;N # OL CHIKI DIGIT SEVEN
+1C58;N # OL CHIKI DIGIT EIGHT
+1C59;N # OL CHIKI DIGIT NINE
+1C5A;N # OL CHIKI LETTER LA
+1C5B;N # OL CHIKI LETTER AT
+1C5C;N # OL CHIKI LETTER AG
+1C5D;N # OL CHIKI LETTER ANG
+1C5E;N # OL CHIKI LETTER AL
+1C5F;N # OL CHIKI LETTER LAA
+1C60;N # OL CHIKI LETTER AAK
+1C61;N # OL CHIKI LETTER AAJ
+1C62;N # OL CHIKI LETTER AAM
+1C63;N # OL CHIKI LETTER AAW
+1C64;N # OL CHIKI LETTER LI
+1C65;N # OL CHIKI LETTER IS
+1C66;N # OL CHIKI LETTER IH
+1C67;N # OL CHIKI LETTER INY
+1C68;N # OL CHIKI LETTER IR
+1C69;N # OL CHIKI LETTER LU
+1C6A;N # OL CHIKI LETTER UC
+1C6B;N # OL CHIKI LETTER UD
+1C6C;N # OL CHIKI LETTER UNN
+1C6D;N # OL CHIKI LETTER UY
+1C6E;N # OL CHIKI LETTER LE
+1C6F;N # OL CHIKI LETTER EP
+1C70;N # OL CHIKI LETTER EDD
+1C71;N # OL CHIKI LETTER EN
+1C72;N # OL CHIKI LETTER ERR
+1C73;N # OL CHIKI LETTER LO
+1C74;N # OL CHIKI LETTER OTT
+1C75;N # OL CHIKI LETTER OB
+1C76;N # OL CHIKI LETTER OV
+1C77;N # OL CHIKI LETTER OH
+1C78;N # OL CHIKI MU TTUDDAG
+1C79;N # OL CHIKI GAAHLAA TTUDDAAG
+1C7A;N # OL CHIKI MU-GAAHLAA TTUDDAAG
+1C7B;N # OL CHIKI RELAA
+1C7C;N # OL CHIKI PHAARKAA
+1C7D;N # OL CHIKI AHAD
+1C7E;N # OL CHIKI PUNCTUATION MUCAAD
+1C7F;N # OL CHIKI PUNCTUATION DOUBLE MUCAAD
+1D00;N # LATIN LETTER SMALL CAPITAL A
+1D01;N # LATIN LETTER SMALL CAPITAL AE
+1D02;N # LATIN SMALL LETTER TURNED AE
+1D03;N # LATIN LETTER SMALL CAPITAL BARRED B
+1D04;N # LATIN LETTER SMALL CAPITAL C
+1D05;N # LATIN LETTER SMALL CAPITAL D
+1D06;N # LATIN LETTER SMALL CAPITAL ETH
+1D07;N # LATIN LETTER SMALL CAPITAL E
+1D08;N # LATIN SMALL LETTER TURNED OPEN E
+1D09;N # LATIN SMALL LETTER TURNED I
+1D0A;N # LATIN LETTER SMALL CAPITAL J
+1D0B;N # LATIN LETTER SMALL CAPITAL K
+1D0C;N # LATIN LETTER SMALL CAPITAL L WITH STROKE
+1D0D;N # LATIN LETTER SMALL CAPITAL M
+1D0E;N # LATIN LETTER SMALL CAPITAL REVERSED N
+1D0F;N # LATIN LETTER SMALL CAPITAL O
+1D10;N # LATIN LETTER SMALL CAPITAL OPEN O
+1D11;N # LATIN SMALL LETTER SIDEWAYS O
+1D12;N # LATIN SMALL LETTER SIDEWAYS OPEN O
+1D13;N # LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+1D14;N # LATIN SMALL LETTER TURNED OE
+1D15;N # LATIN LETTER SMALL CAPITAL OU
+1D16;N # LATIN SMALL LETTER TOP HALF O
+1D17;N # LATIN SMALL LETTER BOTTOM HALF O
+1D18;N # LATIN LETTER SMALL CAPITAL P
+1D19;N # LATIN LETTER SMALL CAPITAL REVERSED R
+1D1A;N # LATIN LETTER SMALL CAPITAL TURNED R
+1D1B;N # LATIN LETTER SMALL CAPITAL T
+1D1C;N # LATIN LETTER SMALL CAPITAL U
+1D1D;N # LATIN SMALL LETTER SIDEWAYS U
+1D1E;N # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D1F;N # LATIN SMALL LETTER SIDEWAYS TURNED M
+1D20;N # LATIN LETTER SMALL CAPITAL V
+1D21;N # LATIN LETTER SMALL CAPITAL W
+1D22;N # LATIN LETTER SMALL CAPITAL Z
+1D23;N # LATIN LETTER SMALL CAPITAL EZH
+1D24;N # LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25;N # LATIN LETTER AIN
+1D26;N # GREEK LETTER SMALL CAPITAL GAMMA
+1D27;N # GREEK LETTER SMALL CAPITAL LAMDA
+1D28;N # GREEK LETTER SMALL CAPITAL PI
+1D29;N # GREEK LETTER SMALL CAPITAL RHO
+1D2A;N # GREEK LETTER SMALL CAPITAL PSI
+1D2B;N # CYRILLIC LETTER SMALL CAPITAL EL
+1D2C;N # MODIFIER LETTER CAPITAL A
+1D2D;N # MODIFIER LETTER CAPITAL AE
+1D2E;N # MODIFIER LETTER CAPITAL B
+1D2F;N # MODIFIER LETTER CAPITAL BARRED B
+1D30;N # MODIFIER LETTER CAPITAL D
+1D31;N # MODIFIER LETTER CAPITAL E
+1D32;N # MODIFIER LETTER CAPITAL REVERSED E
+1D33;N # MODIFIER LETTER CAPITAL G
+1D34;N # MODIFIER LETTER CAPITAL H
+1D35;N # MODIFIER LETTER CAPITAL I
+1D36;N # MODIFIER LETTER CAPITAL J
+1D37;N # MODIFIER LETTER CAPITAL K
+1D38;N # MODIFIER LETTER CAPITAL L
+1D39;N # MODIFIER LETTER CAPITAL M
+1D3A;N # MODIFIER LETTER CAPITAL N
+1D3B;N # MODIFIER LETTER CAPITAL REVERSED N
+1D3C;N # MODIFIER LETTER CAPITAL O
+1D3D;N # MODIFIER LETTER CAPITAL OU
+1D3E;N # MODIFIER LETTER CAPITAL P
+1D3F;N # MODIFIER LETTER CAPITAL R
+1D40;N # MODIFIER LETTER CAPITAL T
+1D41;N # MODIFIER LETTER CAPITAL U
+1D42;N # MODIFIER LETTER CAPITAL W
+1D43;N # MODIFIER LETTER SMALL A
+1D44;N # MODIFIER LETTER SMALL TURNED A
+1D45;N # MODIFIER LETTER SMALL ALPHA
+1D46;N # MODIFIER LETTER SMALL TURNED AE
+1D47;N # MODIFIER LETTER SMALL B
+1D48;N # MODIFIER LETTER SMALL D
+1D49;N # MODIFIER LETTER SMALL E
+1D4A;N # MODIFIER LETTER SMALL SCHWA
+1D4B;N # MODIFIER LETTER SMALL OPEN E
+1D4C;N # MODIFIER LETTER SMALL TURNED OPEN E
+1D4D;N # MODIFIER LETTER SMALL G
+1D4E;N # MODIFIER LETTER SMALL TURNED I
+1D4F;N # MODIFIER LETTER SMALL K
+1D50;N # MODIFIER LETTER SMALL M
+1D51;N # MODIFIER LETTER SMALL ENG
+1D52;N # MODIFIER LETTER SMALL O
+1D53;N # MODIFIER LETTER SMALL OPEN O
+1D54;N # MODIFIER LETTER SMALL TOP HALF O
+1D55;N # MODIFIER LETTER SMALL BOTTOM HALF O
+1D56;N # MODIFIER LETTER SMALL P
+1D57;N # MODIFIER LETTER SMALL T
+1D58;N # MODIFIER LETTER SMALL U
+1D59;N # MODIFIER LETTER SMALL SIDEWAYS U
+1D5A;N # MODIFIER LETTER SMALL TURNED M
+1D5B;N # MODIFIER LETTER SMALL V
+1D5C;N # MODIFIER LETTER SMALL AIN
+1D5D;N # MODIFIER LETTER SMALL BETA
+1D5E;N # MODIFIER LETTER SMALL GREEK GAMMA
+1D5F;N # MODIFIER LETTER SMALL DELTA
+1D60;N # MODIFIER LETTER SMALL GREEK PHI
+1D61;N # MODIFIER LETTER SMALL CHI
+1D62;N # LATIN SUBSCRIPT SMALL LETTER I
+1D63;N # LATIN SUBSCRIPT SMALL LETTER R
+1D64;N # LATIN SUBSCRIPT SMALL LETTER U
+1D65;N # LATIN SUBSCRIPT SMALL LETTER V
+1D66;N # GREEK SUBSCRIPT SMALL LETTER BETA
+1D67;N # GREEK SUBSCRIPT SMALL LETTER GAMMA
+1D68;N # GREEK SUBSCRIPT SMALL LETTER RHO
+1D69;N # GREEK SUBSCRIPT SMALL LETTER PHI
+1D6A;N # GREEK SUBSCRIPT SMALL LETTER CHI
+1D6B;N # LATIN SMALL LETTER UE
+1D6C;N # LATIN SMALL LETTER B WITH MIDDLE TILDE
+1D6D;N # LATIN SMALL LETTER D WITH MIDDLE TILDE
+1D6E;N # LATIN SMALL LETTER F WITH MIDDLE TILDE
+1D6F;N # LATIN SMALL LETTER M WITH MIDDLE TILDE
+1D70;N # LATIN SMALL LETTER N WITH MIDDLE TILDE
+1D71;N # LATIN SMALL LETTER P WITH MIDDLE TILDE
+1D72;N # LATIN SMALL LETTER R WITH MIDDLE TILDE
+1D73;N # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
+1D74;N # LATIN SMALL LETTER S WITH MIDDLE TILDE
+1D75;N # LATIN SMALL LETTER T WITH MIDDLE TILDE
+1D76;N # LATIN SMALL LETTER Z WITH MIDDLE TILDE
+1D77;N # LATIN SMALL LETTER TURNED G
+1D78;N # MODIFIER LETTER CYRILLIC EN
+1D79;N # LATIN SMALL LETTER INSULAR G
+1D7A;N # LATIN SMALL LETTER TH WITH STRIKETHROUGH
+1D7B;N # LATIN SMALL CAPITAL LETTER I WITH STROKE
+1D7C;N # LATIN SMALL LETTER IOTA WITH STROKE
+1D7D;N # LATIN SMALL LETTER P WITH STROKE
+1D7E;N # LATIN SMALL CAPITAL LETTER U WITH STROKE
+1D7F;N # LATIN SMALL LETTER UPSILON WITH STROKE
+1D80;N # LATIN SMALL LETTER B WITH PALATAL HOOK
+1D81;N # LATIN SMALL LETTER D WITH PALATAL HOOK
+1D82;N # LATIN SMALL LETTER F WITH PALATAL HOOK
+1D83;N # LATIN SMALL LETTER G WITH PALATAL HOOK
+1D84;N # LATIN SMALL LETTER K WITH PALATAL HOOK
+1D85;N # LATIN SMALL LETTER L WITH PALATAL HOOK
+1D86;N # LATIN SMALL LETTER M WITH PALATAL HOOK
+1D87;N # LATIN SMALL LETTER N WITH PALATAL HOOK
+1D88;N # LATIN SMALL LETTER P WITH PALATAL HOOK
+1D89;N # LATIN SMALL LETTER R WITH PALATAL HOOK
+1D8A;N # LATIN SMALL LETTER S WITH PALATAL HOOK
+1D8B;N # LATIN SMALL LETTER ESH WITH PALATAL HOOK
+1D8C;N # LATIN SMALL LETTER V WITH PALATAL HOOK
+1D8D;N # LATIN SMALL LETTER X WITH PALATAL HOOK
+1D8E;N # LATIN SMALL LETTER Z WITH PALATAL HOOK
+1D8F;N # LATIN SMALL LETTER A WITH RETROFLEX HOOK
+1D90;N # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK
+1D91;N # LATIN SMALL LETTER D WITH HOOK AND TAIL
+1D92;N # LATIN SMALL LETTER E WITH RETROFLEX HOOK
+1D93;N # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
+1D94;N # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK
+1D95;N # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK
+1D96;N # LATIN SMALL LETTER I WITH RETROFLEX HOOK
+1D97;N # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
+1D98;N # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK
+1D99;N # LATIN SMALL LETTER U WITH RETROFLEX HOOK
+1D9A;N # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B;N # MODIFIER LETTER SMALL TURNED ALPHA
+1D9C;N # MODIFIER LETTER SMALL C
+1D9D;N # MODIFIER LETTER SMALL C WITH CURL
+1D9E;N # MODIFIER LETTER SMALL ETH
+1D9F;N # MODIFIER LETTER SMALL REVERSED OPEN E
+1DA0;N # MODIFIER LETTER SMALL F
+1DA1;N # MODIFIER LETTER SMALL DOTLESS J WITH STROKE
+1DA2;N # MODIFIER LETTER SMALL SCRIPT G
+1DA3;N # MODIFIER LETTER SMALL TURNED H
+1DA4;N # MODIFIER LETTER SMALL I WITH STROKE
+1DA5;N # MODIFIER LETTER SMALL IOTA
+1DA6;N # MODIFIER LETTER SMALL CAPITAL I
+1DA7;N # MODIFIER LETTER SMALL CAPITAL I WITH STROKE
+1DA8;N # MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+1DA9;N # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK
+1DAA;N # MODIFIER LETTER SMALL L WITH PALATAL HOOK
+1DAB;N # MODIFIER LETTER SMALL CAPITAL L
+1DAC;N # MODIFIER LETTER SMALL M WITH HOOK
+1DAD;N # MODIFIER LETTER SMALL TURNED M WITH LONG LEG
+1DAE;N # MODIFIER LETTER SMALL N WITH LEFT HOOK
+1DAF;N # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK
+1DB0;N # MODIFIER LETTER SMALL CAPITAL N
+1DB1;N # MODIFIER LETTER SMALL BARRED O
+1DB2;N # MODIFIER LETTER SMALL PHI
+1DB3;N # MODIFIER LETTER SMALL S WITH HOOK
+1DB4;N # MODIFIER LETTER SMALL ESH
+1DB5;N # MODIFIER LETTER SMALL T WITH PALATAL HOOK
+1DB6;N # MODIFIER LETTER SMALL U BAR
+1DB7;N # MODIFIER LETTER SMALL UPSILON
+1DB8;N # MODIFIER LETTER SMALL CAPITAL U
+1DB9;N # MODIFIER LETTER SMALL V WITH HOOK
+1DBA;N # MODIFIER LETTER SMALL TURNED V
+1DBB;N # MODIFIER LETTER SMALL Z
+1DBC;N # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK
+1DBD;N # MODIFIER LETTER SMALL Z WITH CURL
+1DBE;N # MODIFIER LETTER SMALL EZH
+1DBF;N # MODIFIER LETTER SMALL THETA
+1DC0;N # COMBINING DOTTED GRAVE ACCENT
+1DC1;N # COMBINING DOTTED ACUTE ACCENT
+1DC2;N # COMBINING SNAKE BELOW
+1DC3;N # COMBINING SUSPENSION MARK
+1DC4;N # COMBINING MACRON-ACUTE
+1DC5;N # COMBINING GRAVE-MACRON
+1DC6;N # COMBINING MACRON-GRAVE
+1DC7;N # COMBINING ACUTE-MACRON
+1DC8;N # COMBINING GRAVE-ACUTE-GRAVE
+1DC9;N # COMBINING ACUTE-GRAVE-ACUTE
+1DCA;N # COMBINING LATIN SMALL LETTER R BELOW
+1DCB;N # COMBINING BREVE-MACRON
+1DCC;N # COMBINING MACRON-BREVE
+1DCD;N # COMBINING DOUBLE CIRCUMFLEX ABOVE
+1DCE;N # COMBINING OGONEK ABOVE
+1DCF;N # COMBINING ZIGZAG BELOW
+1DD0;N # COMBINING IS BELOW
+1DD1;N # COMBINING UR ABOVE
+1DD2;N # COMBINING US ABOVE
+1DD3;N # COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE
+1DD4;N # COMBINING LATIN SMALL LETTER AE
+1DD5;N # COMBINING LATIN SMALL LETTER AO
+1DD6;N # COMBINING LATIN SMALL LETTER AV
+1DD7;N # COMBINING LATIN SMALL LETTER C CEDILLA
+1DD8;N # COMBINING LATIN SMALL LETTER INSULAR D
+1DD9;N # COMBINING LATIN SMALL LETTER ETH
+1DDA;N # COMBINING LATIN SMALL LETTER G
+1DDB;N # COMBINING LATIN LETTER SMALL CAPITAL G
+1DDC;N # COMBINING LATIN SMALL LETTER K
+1DDD;N # COMBINING LATIN SMALL LETTER L
+1DDE;N # COMBINING LATIN LETTER SMALL CAPITAL L
+1DDF;N # COMBINING LATIN LETTER SMALL CAPITAL M
+1DE0;N # COMBINING LATIN SMALL LETTER N
+1DE1;N # COMBINING LATIN LETTER SMALL CAPITAL N
+1DE2;N # COMBINING LATIN LETTER SMALL CAPITAL R
+1DE3;N # COMBINING LATIN SMALL LETTER R ROTUNDA
+1DE4;N # COMBINING LATIN SMALL LETTER S
+1DE5;N # COMBINING LATIN SMALL LETTER LONG S
+1DE6;N # COMBINING LATIN SMALL LETTER Z
+1DFE;N # COMBINING LEFT ARROWHEAD ABOVE
+1DFF;N # COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1E00;N # LATIN CAPITAL LETTER A WITH RING BELOW
+1E01;N # LATIN SMALL LETTER A WITH RING BELOW
+1E02;N # LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E03;N # LATIN SMALL LETTER B WITH DOT ABOVE
+1E04;N # LATIN CAPITAL LETTER B WITH DOT BELOW
+1E05;N # LATIN SMALL LETTER B WITH DOT BELOW
+1E06;N # LATIN CAPITAL LETTER B WITH LINE BELOW
+1E07;N # LATIN SMALL LETTER B WITH LINE BELOW
+1E08;N # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E09;N # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1E0A;N # LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0B;N # LATIN SMALL LETTER D WITH DOT ABOVE
+1E0C;N # LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0D;N # LATIN SMALL LETTER D WITH DOT BELOW
+1E0E;N # LATIN CAPITAL LETTER D WITH LINE BELOW
+1E0F;N # LATIN SMALL LETTER D WITH LINE BELOW
+1E10;N # LATIN CAPITAL LETTER D WITH CEDILLA
+1E11;N # LATIN SMALL LETTER D WITH CEDILLA
+1E12;N # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E13;N # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1E14;N # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E15;N # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1E16;N # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E17;N # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1E18;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E19;N # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1E1A;N # LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1B;N # LATIN SMALL LETTER E WITH TILDE BELOW
+1E1C;N # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1D;N # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1E1E;N # LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E1F;N # LATIN SMALL LETTER F WITH DOT ABOVE
+1E20;N # LATIN CAPITAL LETTER G WITH MACRON
+1E21;N # LATIN SMALL LETTER G WITH MACRON
+1E22;N # LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E23;N # LATIN SMALL LETTER H WITH DOT ABOVE
+1E24;N # LATIN CAPITAL LETTER H WITH DOT BELOW
+1E25;N # LATIN SMALL LETTER H WITH DOT BELOW
+1E26;N # LATIN CAPITAL LETTER H WITH DIAERESIS
+1E27;N # LATIN SMALL LETTER H WITH DIAERESIS
+1E28;N # LATIN CAPITAL LETTER H WITH CEDILLA
+1E29;N # LATIN SMALL LETTER H WITH CEDILLA
+1E2A;N # LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2B;N # LATIN SMALL LETTER H WITH BREVE BELOW
+1E2C;N # LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2D;N # LATIN SMALL LETTER I WITH TILDE BELOW
+1E2E;N # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E2F;N # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1E30;N # LATIN CAPITAL LETTER K WITH ACUTE
+1E31;N # LATIN SMALL LETTER K WITH ACUTE
+1E32;N # LATIN CAPITAL LETTER K WITH DOT BELOW
+1E33;N # LATIN SMALL LETTER K WITH DOT BELOW
+1E34;N # LATIN CAPITAL LETTER K WITH LINE BELOW
+1E35;N # LATIN SMALL LETTER K WITH LINE BELOW
+1E36;N # LATIN CAPITAL LETTER L WITH DOT BELOW
+1E37;N # LATIN SMALL LETTER L WITH DOT BELOW
+1E38;N # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E39;N # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1E3A;N # LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3B;N # LATIN SMALL LETTER L WITH LINE BELOW
+1E3C;N # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3D;N # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1E3E;N # LATIN CAPITAL LETTER M WITH ACUTE
+1E3F;N # LATIN SMALL LETTER M WITH ACUTE
+1E40;N # LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E41;N # LATIN SMALL LETTER M WITH DOT ABOVE
+1E42;N # LATIN CAPITAL LETTER M WITH DOT BELOW
+1E43;N # LATIN SMALL LETTER M WITH DOT BELOW
+1E44;N # LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E45;N # LATIN SMALL LETTER N WITH DOT ABOVE
+1E46;N # LATIN CAPITAL LETTER N WITH DOT BELOW
+1E47;N # LATIN SMALL LETTER N WITH DOT BELOW
+1E48;N # LATIN CAPITAL LETTER N WITH LINE BELOW
+1E49;N # LATIN SMALL LETTER N WITH LINE BELOW
+1E4A;N # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4B;N # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1E4C;N # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4D;N # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1E4E;N # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E4F;N # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1E50;N # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E51;N # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1E52;N # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E53;N # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1E54;N # LATIN CAPITAL LETTER P WITH ACUTE
+1E55;N # LATIN SMALL LETTER P WITH ACUTE
+1E56;N # LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E57;N # LATIN SMALL LETTER P WITH DOT ABOVE
+1E58;N # LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E59;N # LATIN SMALL LETTER R WITH DOT ABOVE
+1E5A;N # LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5B;N # LATIN SMALL LETTER R WITH DOT BELOW
+1E5C;N # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5D;N # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1E5E;N # LATIN CAPITAL LETTER R WITH LINE BELOW
+1E5F;N # LATIN SMALL LETTER R WITH LINE BELOW
+1E60;N # LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E61;N # LATIN SMALL LETTER S WITH DOT ABOVE
+1E62;N # LATIN CAPITAL LETTER S WITH DOT BELOW
+1E63;N # LATIN SMALL LETTER S WITH DOT BELOW
+1E64;N # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E65;N # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1E66;N # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E67;N # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1E68;N # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E69;N # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A;N # LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6B;N # LATIN SMALL LETTER T WITH DOT ABOVE
+1E6C;N # LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6D;N # LATIN SMALL LETTER T WITH DOT BELOW
+1E6E;N # LATIN CAPITAL LETTER T WITH LINE BELOW
+1E6F;N # LATIN SMALL LETTER T WITH LINE BELOW
+1E70;N # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E71;N # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1E72;N # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E73;N # LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1E74;N # LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E75;N # LATIN SMALL LETTER U WITH TILDE BELOW
+1E76;N # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E77;N # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1E78;N # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E79;N # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1E7A;N # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7B;N # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1E7C;N # LATIN CAPITAL LETTER V WITH TILDE
+1E7D;N # LATIN SMALL LETTER V WITH TILDE
+1E7E;N # LATIN CAPITAL LETTER V WITH DOT BELOW
+1E7F;N # LATIN SMALL LETTER V WITH DOT BELOW
+1E80;N # LATIN CAPITAL LETTER W WITH GRAVE
+1E81;N # LATIN SMALL LETTER W WITH GRAVE
+1E82;N # LATIN CAPITAL LETTER W WITH ACUTE
+1E83;N # LATIN SMALL LETTER W WITH ACUTE
+1E84;N # LATIN CAPITAL LETTER W WITH DIAERESIS
+1E85;N # LATIN SMALL LETTER W WITH DIAERESIS
+1E86;N # LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E87;N # LATIN SMALL LETTER W WITH DOT ABOVE
+1E88;N # LATIN CAPITAL LETTER W WITH DOT BELOW
+1E89;N # LATIN SMALL LETTER W WITH DOT BELOW
+1E8A;N # LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8B;N # LATIN SMALL LETTER X WITH DOT ABOVE
+1E8C;N # LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8D;N # LATIN SMALL LETTER X WITH DIAERESIS
+1E8E;N # LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E8F;N # LATIN SMALL LETTER Y WITH DOT ABOVE
+1E90;N # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E91;N # LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1E92;N # LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E93;N # LATIN SMALL LETTER Z WITH DOT BELOW
+1E94;N # LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E95;N # LATIN SMALL LETTER Z WITH LINE BELOW
+1E96;N # LATIN SMALL LETTER H WITH LINE BELOW
+1E97;N # LATIN SMALL LETTER T WITH DIAERESIS
+1E98;N # LATIN SMALL LETTER W WITH RING ABOVE
+1E99;N # LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A;N # LATIN SMALL LETTER A WITH RIGHT HALF RING
+1E9B;N # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1E9C;N # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE
+1E9D;N # LATIN SMALL LETTER LONG S WITH HIGH STROKE
+1E9E;N # LATIN CAPITAL LETTER SHARP S
+1E9F;N # LATIN SMALL LETTER DELTA
+1EA0;N # LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA1;N # LATIN SMALL LETTER A WITH DOT BELOW
+1EA2;N # LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA3;N # LATIN SMALL LETTER A WITH HOOK ABOVE
+1EA4;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA5;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA7;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EA9;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAB;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAD;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE;N # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EAF;N # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1EB0;N # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB1;N # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1EB2;N # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB3;N # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4;N # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB5;N # LATIN SMALL LETTER A WITH BREVE AND TILDE
+1EB6;N # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB7;N # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1EB8;N # LATIN CAPITAL LETTER E WITH DOT BELOW
+1EB9;N # LATIN SMALL LETTER E WITH DOT BELOW
+1EBA;N # LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBB;N # LATIN SMALL LETTER E WITH HOOK ABOVE
+1EBC;N # LATIN CAPITAL LETTER E WITH TILDE
+1EBD;N # LATIN SMALL LETTER E WITH TILDE
+1EBE;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EBF;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC1;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC3;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC5;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC7;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8;N # LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1EC9;N # LATIN SMALL LETTER I WITH HOOK ABOVE
+1ECA;N # LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECB;N # LATIN SMALL LETTER I WITH DOT BELOW
+1ECC;N # LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECD;N # LATIN SMALL LETTER O WITH DOT BELOW
+1ECE;N # LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ECF;N # LATIN SMALL LETTER O WITH HOOK ABOVE
+1ED0;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED1;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED3;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED5;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED7;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1ED9;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA;N # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDB;N # LATIN SMALL LETTER O WITH HORN AND ACUTE
+1EDC;N # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDD;N # LATIN SMALL LETTER O WITH HORN AND GRAVE
+1EDE;N # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EDF;N # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1EE0;N # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE1;N # LATIN SMALL LETTER O WITH HORN AND TILDE
+1EE2;N # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE3;N # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1EE4;N # LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE5;N # LATIN SMALL LETTER U WITH DOT BELOW
+1EE6;N # LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE7;N # LATIN SMALL LETTER U WITH HOOK ABOVE
+1EE8;N # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EE9;N # LATIN SMALL LETTER U WITH HORN AND ACUTE
+1EEA;N # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEB;N # LATIN SMALL LETTER U WITH HORN AND GRAVE
+1EEC;N # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EED;N # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1EEE;N # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EEF;N # LATIN SMALL LETTER U WITH HORN AND TILDE
+1EF0;N # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF1;N # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1EF2;N # LATIN CAPITAL LETTER Y WITH GRAVE
+1EF3;N # LATIN SMALL LETTER Y WITH GRAVE
+1EF4;N # LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF5;N # LATIN SMALL LETTER Y WITH DOT BELOW
+1EF6;N # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF7;N # LATIN SMALL LETTER Y WITH HOOK ABOVE
+1EF8;N # LATIN CAPITAL LETTER Y WITH TILDE
+1EF9;N # LATIN SMALL LETTER Y WITH TILDE
+1EFA;N # LATIN CAPITAL LETTER MIDDLE-WELSH LL
+1EFB;N # LATIN SMALL LETTER MIDDLE-WELSH LL
+1EFC;N # LATIN CAPITAL LETTER MIDDLE-WELSH V
+1EFD;N # LATIN SMALL LETTER MIDDLE-WELSH V
+1EFE;N # LATIN CAPITAL LETTER Y WITH LOOP
+1EFF;N # LATIN SMALL LETTER Y WITH LOOP
+1F00;N # GREEK SMALL LETTER ALPHA WITH PSILI
+1F01;N # GREEK SMALL LETTER ALPHA WITH DASIA
+1F02;N # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+1F03;N # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+1F04;N # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+1F05;N # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+1F06;N # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F07;N # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F08;N # GREEK CAPITAL LETTER ALPHA WITH PSILI
+1F09;N # GREEK CAPITAL LETTER ALPHA WITH DASIA
+1F0A;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1F0B;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1F0C;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1F0D;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1F0E;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F0F;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F10;N # GREEK SMALL LETTER EPSILON WITH PSILI
+1F11;N # GREEK SMALL LETTER EPSILON WITH DASIA
+1F12;N # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+1F13;N # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+1F14;N # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+1F15;N # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18;N # GREEK CAPITAL LETTER EPSILON WITH PSILI
+1F19;N # GREEK CAPITAL LETTER EPSILON WITH DASIA
+1F1A;N # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1F1B;N # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1F1C;N # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1F1D;N # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20;N # GREEK SMALL LETTER ETA WITH PSILI
+1F21;N # GREEK SMALL LETTER ETA WITH DASIA
+1F22;N # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+1F23;N # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+1F24;N # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+1F25;N # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+1F26;N # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+1F27;N # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1F28;N # GREEK CAPITAL LETTER ETA WITH PSILI
+1F29;N # GREEK CAPITAL LETTER ETA WITH DASIA
+1F2A;N # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1F2B;N # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1F2C;N # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1F2D;N # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1F2E;N # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1F2F;N # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F30;N # GREEK SMALL LETTER IOTA WITH PSILI
+1F31;N # GREEK SMALL LETTER IOTA WITH DASIA
+1F32;N # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+1F33;N # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+1F34;N # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+1F35;N # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+1F36;N # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F37;N # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F38;N # GREEK CAPITAL LETTER IOTA WITH PSILI
+1F39;N # GREEK CAPITAL LETTER IOTA WITH DASIA
+1F3A;N # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1F3B;N # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1F3C;N # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1F3D;N # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1F3E;N # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F3F;N # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F40;N # GREEK SMALL LETTER OMICRON WITH PSILI
+1F41;N # GREEK SMALL LETTER OMICRON WITH DASIA
+1F42;N # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+1F43;N # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+1F44;N # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+1F45;N # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48;N # GREEK CAPITAL LETTER OMICRON WITH PSILI
+1F49;N # GREEK CAPITAL LETTER OMICRON WITH DASIA
+1F4A;N # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1F4B;N # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1F4C;N # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1F4D;N # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50;N # GREEK SMALL LETTER UPSILON WITH PSILI
+1F51;N # GREEK SMALL LETTER UPSILON WITH DASIA
+1F52;N # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F53;N # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+1F54;N # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F55;N # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+1F56;N # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1F57;N # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59;N # GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B;N # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D;N # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F;N # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F60;N # GREEK SMALL LETTER OMEGA WITH PSILI
+1F61;N # GREEK SMALL LETTER OMEGA WITH DASIA
+1F62;N # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+1F63;N # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+1F64;N # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+1F65;N # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+1F66;N # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F67;N # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F68;N # GREEK CAPITAL LETTER OMEGA WITH PSILI
+1F69;N # GREEK CAPITAL LETTER OMEGA WITH DASIA
+1F6A;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1F6B;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1F6C;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1F6D;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1F6E;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F6F;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F70;N # GREEK SMALL LETTER ALPHA WITH VARIA
+1F71;N # GREEK SMALL LETTER ALPHA WITH OXIA
+1F72;N # GREEK SMALL LETTER EPSILON WITH VARIA
+1F73;N # GREEK SMALL LETTER EPSILON WITH OXIA
+1F74;N # GREEK SMALL LETTER ETA WITH VARIA
+1F75;N # GREEK SMALL LETTER ETA WITH OXIA
+1F76;N # GREEK SMALL LETTER IOTA WITH VARIA
+1F77;N # GREEK SMALL LETTER IOTA WITH OXIA
+1F78;N # GREEK SMALL LETTER OMICRON WITH VARIA
+1F79;N # GREEK SMALL LETTER OMICRON WITH OXIA
+1F7A;N # GREEK SMALL LETTER UPSILON WITH VARIA
+1F7B;N # GREEK SMALL LETTER UPSILON WITH OXIA
+1F7C;N # GREEK SMALL LETTER OMEGA WITH VARIA
+1F7D;N # GREEK SMALL LETTER OMEGA WITH OXIA
+1F80;N # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81;N # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82;N # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83;N # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84;N # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85;N # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86;N # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87;N # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90;N # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91;N # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92;N # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93;N # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94;N # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95;N # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96;N # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97;N # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98;N # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99;N # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A;N # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B;N # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C;N # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D;N # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E;N # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F;N # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0;N # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1;N # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2;N # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3;N # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4;N # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5;N # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6;N # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7;N # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB0;N # GREEK SMALL LETTER ALPHA WITH VRACHY
+1FB1;N # GREEK SMALL LETTER ALPHA WITH MACRON
+1FB2;N # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB3;N # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FB4;N # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6;N # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7;N # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FB8;N # GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1FB9;N # GREEK CAPITAL LETTER ALPHA WITH MACRON
+1FBA;N # GREEK CAPITAL LETTER ALPHA WITH VARIA
+1FBB;N # GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FBC;N # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD;N # GREEK KORONIS
+1FBE;N # GREEK PROSGEGRAMMENI
+1FBF;N # GREEK PSILI
+1FC0;N # GREEK PERISPOMENI
+1FC1;N # GREEK DIALYTIKA AND PERISPOMENI
+1FC2;N # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC3;N # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FC4;N # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6;N # GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7;N # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC8;N # GREEK CAPITAL LETTER EPSILON WITH VARIA
+1FC9;N # GREEK CAPITAL LETTER EPSILON WITH OXIA
+1FCA;N # GREEK CAPITAL LETTER ETA WITH VARIA
+1FCB;N # GREEK CAPITAL LETTER ETA WITH OXIA
+1FCC;N # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD;N # GREEK PSILI AND VARIA
+1FCE;N # GREEK PSILI AND OXIA
+1FCF;N # GREEK PSILI AND PERISPOMENI
+1FD0;N # GREEK SMALL LETTER IOTA WITH VRACHY
+1FD1;N # GREEK SMALL LETTER IOTA WITH MACRON
+1FD2;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6;N # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8;N # GREEK CAPITAL LETTER IOTA WITH VRACHY
+1FD9;N # GREEK CAPITAL LETTER IOTA WITH MACRON
+1FDA;N # GREEK CAPITAL LETTER IOTA WITH VARIA
+1FDB;N # GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD;N # GREEK DASIA AND VARIA
+1FDE;N # GREEK DASIA AND OXIA
+1FDF;N # GREEK DASIA AND PERISPOMENI
+1FE0;N # GREEK SMALL LETTER UPSILON WITH VRACHY
+1FE1;N # GREEK SMALL LETTER UPSILON WITH MACRON
+1FE2;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4;N # GREEK SMALL LETTER RHO WITH PSILI
+1FE5;N # GREEK SMALL LETTER RHO WITH DASIA
+1FE6;N # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8;N # GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1FE9;N # GREEK CAPITAL LETTER UPSILON WITH MACRON
+1FEA;N # GREEK CAPITAL LETTER UPSILON WITH VARIA
+1FEB;N # GREEK CAPITAL LETTER UPSILON WITH OXIA
+1FEC;N # GREEK CAPITAL LETTER RHO WITH DASIA
+1FED;N # GREEK DIALYTIKA AND VARIA
+1FEE;N # GREEK DIALYTIKA AND OXIA
+1FEF;N # GREEK VARIA
+1FF2;N # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF3;N # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FF4;N # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6;N # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7;N # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF8;N # GREEK CAPITAL LETTER OMICRON WITH VARIA
+1FF9;N # GREEK CAPITAL LETTER OMICRON WITH OXIA
+1FFA;N # GREEK CAPITAL LETTER OMEGA WITH VARIA
+1FFB;N # GREEK CAPITAL LETTER OMEGA WITH OXIA
+1FFC;N # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD;N # GREEK OXIA
+1FFE;N # GREEK DASIA
+2000;N # EN QUAD
+2001;N # EM QUAD
+2002;N # EN SPACE
+2003;N # EM SPACE
+2004;N # THREE-PER-EM SPACE
+2005;N # FOUR-PER-EM SPACE
+2006;N # SIX-PER-EM SPACE
+2007;N # FIGURE SPACE
+2008;N # PUNCTUATION SPACE
+2009;N # THIN SPACE
+200A;N # HAIR SPACE
+200B;N # ZERO WIDTH SPACE
+200C;N # ZERO WIDTH NON-JOINER
+200D;N # ZERO WIDTH JOINER
+200E;N # LEFT-TO-RIGHT MARK
+200F;N # RIGHT-TO-LEFT MARK
+2010;A # HYPHEN
+2011;N # NON-BREAKING HYPHEN
+2012;N # FIGURE DASH
+2013;A # EN DASH
+2014;A # EM DASH
+2015;A # HORIZONTAL BAR
+2016;A # DOUBLE VERTICAL LINE
+2017;N # DOUBLE LOW LINE
+2018;A # LEFT SINGLE QUOTATION MARK
+2019;A # RIGHT SINGLE QUOTATION MARK
+201A;N # SINGLE LOW-9 QUOTATION MARK
+201B;N # SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C;A # LEFT DOUBLE QUOTATION MARK
+201D;A # RIGHT DOUBLE QUOTATION MARK
+201E;N # DOUBLE LOW-9 QUOTATION MARK
+201F;N # DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020;A # DAGGER
+2021;A # DOUBLE DAGGER
+2022;A # BULLET
+2023;N # TRIANGULAR BULLET
+2024;A # ONE DOT LEADER
+2025;A # TWO DOT LEADER
+2026;A # HORIZONTAL ELLIPSIS
+2027;A # HYPHENATION POINT
+2028;N # LINE SEPARATOR
+2029;N # PARAGRAPH SEPARATOR
+202A;N # LEFT-TO-RIGHT EMBEDDING
+202B;N # RIGHT-TO-LEFT EMBEDDING
+202C;N # POP DIRECTIONAL FORMATTING
+202D;N # LEFT-TO-RIGHT OVERRIDE
+202E;N # RIGHT-TO-LEFT OVERRIDE
+202F;N # NARROW NO-BREAK SPACE
+2030;A # PER MILLE SIGN
+2031;N # PER TEN THOUSAND SIGN
+2032;A # PRIME
+2033;A # DOUBLE PRIME
+2034;N # TRIPLE PRIME
+2035;A # REVERSED PRIME
+2036;N # REVERSED DOUBLE PRIME
+2037;N # REVERSED TRIPLE PRIME
+2038;N # CARET
+2039;N # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A;N # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B;A # REFERENCE MARK
+203C;N # DOUBLE EXCLAMATION MARK
+203D;N # INTERROBANG
+203E;A # OVERLINE
+203F;N # UNDERTIE
+2040;N # CHARACTER TIE
+2041;N # CARET INSERTION POINT
+2042;N # ASTERISM
+2043;N # HYPHEN BULLET
+2044;N # FRACTION SLASH
+2045;N # LEFT SQUARE BRACKET WITH QUILL
+2046;N # RIGHT SQUARE BRACKET WITH QUILL
+2047;N # DOUBLE QUESTION MARK
+2048;N # QUESTION EXCLAMATION MARK
+2049;N # EXCLAMATION QUESTION MARK
+204A;N # TIRONIAN SIGN ET
+204B;N # REVERSED PILCROW SIGN
+204C;N # BLACK LEFTWARDS BULLET
+204D;N # BLACK RIGHTWARDS BULLET
+204E;N # LOW ASTERISK
+204F;N # REVERSED SEMICOLON
+2050;N # CLOSE UP
+2051;N # TWO ASTERISKS ALIGNED VERTICALLY
+2052;N # COMMERCIAL MINUS SIGN
+2053;N # SWUNG DASH
+2054;N # INVERTED UNDERTIE
+2055;N # FLOWER PUNCTUATION MARK
+2056;N # THREE DOT PUNCTUATION
+2057;N # QUADRUPLE PRIME
+2058;N # FOUR DOT PUNCTUATION
+2059;N # FIVE DOT PUNCTUATION
+205A;N # TWO DOT PUNCTUATION
+205B;N # FOUR DOT MARK
+205C;N # DOTTED CROSS
+205D;N # TRICOLON
+205E;N # VERTICAL FOUR DOTS
+205F;N # MEDIUM MATHEMATICAL SPACE
+2060;N # WORD JOINER
+2061;N # FUNCTION APPLICATION
+2062;N # INVISIBLE TIMES
+2063;N # INVISIBLE SEPARATOR
+2064;N # INVISIBLE PLUS
+206A;N # INHIBIT SYMMETRIC SWAPPING
+206B;N # ACTIVATE SYMMETRIC SWAPPING
+206C;N # INHIBIT ARABIC FORM SHAPING
+206D;N # ACTIVATE ARABIC FORM SHAPING
+206E;N # NATIONAL DIGIT SHAPES
+206F;N # NOMINAL DIGIT SHAPES
+2070;N # SUPERSCRIPT ZERO
+2071;N # SUPERSCRIPT LATIN SMALL LETTER I
+2074;A # SUPERSCRIPT FOUR
+2075;N # SUPERSCRIPT FIVE
+2076;N # SUPERSCRIPT SIX
+2077;N # SUPERSCRIPT SEVEN
+2078;N # SUPERSCRIPT EIGHT
+2079;N # SUPERSCRIPT NINE
+207A;N # SUPERSCRIPT PLUS SIGN
+207B;N # SUPERSCRIPT MINUS
+207C;N # SUPERSCRIPT EQUALS SIGN
+207D;N # SUPERSCRIPT LEFT PARENTHESIS
+207E;N # SUPERSCRIPT RIGHT PARENTHESIS
+207F;A # SUPERSCRIPT LATIN SMALL LETTER N
+2080;N # SUBSCRIPT ZERO
+2081;A # SUBSCRIPT ONE
+2082;A # SUBSCRIPT TWO
+2083;A # SUBSCRIPT THREE
+2084;A # SUBSCRIPT FOUR
+2085;N # SUBSCRIPT FIVE
+2086;N # SUBSCRIPT SIX
+2087;N # SUBSCRIPT SEVEN
+2088;N # SUBSCRIPT EIGHT
+2089;N # SUBSCRIPT NINE
+208A;N # SUBSCRIPT PLUS SIGN
+208B;N # SUBSCRIPT MINUS
+208C;N # SUBSCRIPT EQUALS SIGN
+208D;N # SUBSCRIPT LEFT PARENTHESIS
+208E;N # SUBSCRIPT RIGHT PARENTHESIS
+2090;N # LATIN SUBSCRIPT SMALL LETTER A
+2091;N # LATIN SUBSCRIPT SMALL LETTER E
+2092;N # LATIN SUBSCRIPT SMALL LETTER O
+2093;N # LATIN SUBSCRIPT SMALL LETTER X
+2094;N # LATIN SUBSCRIPT SMALL LETTER SCHWA
+20A0;N # EURO-CURRENCY SIGN
+20A1;N # COLON SIGN
+20A2;N # CRUZEIRO SIGN
+20A3;N # FRENCH FRANC SIGN
+20A4;N # LIRA SIGN
+20A5;N # MILL SIGN
+20A6;N # NAIRA SIGN
+20A7;N # PESETA SIGN
+20A8;N # RUPEE SIGN
+20A9;H # WON SIGN
+20AA;N # NEW SHEQEL SIGN
+20AB;N # DONG SIGN
+20AC;A # EURO SIGN
+20AD;N # KIP SIGN
+20AE;N # TUGRIK SIGN
+20AF;N # DRACHMA SIGN
+20B0;N # GERMAN PENNY SIGN
+20B1;N # PESO SIGN
+20B2;N # GUARANI SIGN
+20B3;N # AUSTRAL SIGN
+20B4;N # HRYVNIA SIGN
+20B5;N # CEDI SIGN
+20D0;N # COMBINING LEFT HARPOON ABOVE
+20D1;N # COMBINING RIGHT HARPOON ABOVE
+20D2;N # COMBINING LONG VERTICAL LINE OVERLAY
+20D3;N # COMBINING SHORT VERTICAL LINE OVERLAY
+20D4;N # COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5;N # COMBINING CLOCKWISE ARROW ABOVE
+20D6;N # COMBINING LEFT ARROW ABOVE
+20D7;N # COMBINING RIGHT ARROW ABOVE
+20D8;N # COMBINING RING OVERLAY
+20D9;N # COMBINING CLOCKWISE RING OVERLAY
+20DA;N # COMBINING ANTICLOCKWISE RING OVERLAY
+20DB;N # COMBINING THREE DOTS ABOVE
+20DC;N # COMBINING FOUR DOTS ABOVE
+20DD;N # COMBINING ENCLOSING CIRCLE
+20DE;N # COMBINING ENCLOSING SQUARE
+20DF;N # COMBINING ENCLOSING DIAMOND
+20E0;N # COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1;N # COMBINING LEFT RIGHT ARROW ABOVE
+20E2;N # COMBINING ENCLOSING SCREEN
+20E3;N # COMBINING ENCLOSING KEYCAP
+20E4;N # COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5;N # COMBINING REVERSE SOLIDUS OVERLAY
+20E6;N # COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20E7;N # COMBINING ANNUITY SYMBOL
+20E8;N # COMBINING TRIPLE UNDERDOT
+20E9;N # COMBINING WIDE BRIDGE ABOVE
+20EA;N # COMBINING LEFTWARDS ARROW OVERLAY
+20EB;N # COMBINING LONG DOUBLE SOLIDUS OVERLAY
+20EC;N # COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+20ED;N # COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS
+20EE;N # COMBINING LEFT ARROW BELOW
+20EF;N # COMBINING RIGHT ARROW BELOW
+20F0;N # COMBINING ASTERISK ABOVE
+2100;N # ACCOUNT OF
+2101;N # ADDRESSED TO THE SUBJECT
+2102;N # DOUBLE-STRUCK CAPITAL C
+2103;A # DEGREE CELSIUS
+2104;N # CENTRE LINE SYMBOL
+2105;A # CARE OF
+2106;N # CADA UNA
+2107;N # EULER CONSTANT
+2108;N # SCRUPLE
+2109;A # DEGREE FAHRENHEIT
+210A;N # SCRIPT SMALL G
+210B;N # SCRIPT CAPITAL H
+210C;N # BLACK-LETTER CAPITAL H
+210D;N # DOUBLE-STRUCK CAPITAL H
+210E;N # PLANCK CONSTANT
+210F;N # PLANCK CONSTANT OVER TWO PI
+2110;N # SCRIPT CAPITAL I
+2111;N # BLACK-LETTER CAPITAL I
+2112;N # SCRIPT CAPITAL L
+2113;A # SCRIPT SMALL L
+2114;N # L B BAR SYMBOL
+2115;N # DOUBLE-STRUCK CAPITAL N
+2116;A # NUMERO SIGN
+2117;N # SOUND RECORDING COPYRIGHT
+2118;N # SCRIPT CAPITAL P
+2119;N # DOUBLE-STRUCK CAPITAL P
+211A;N # DOUBLE-STRUCK CAPITAL Q
+211B;N # SCRIPT CAPITAL R
+211C;N # BLACK-LETTER CAPITAL R
+211D;N # DOUBLE-STRUCK CAPITAL R
+211E;N # PRESCRIPTION TAKE
+211F;N # RESPONSE
+2120;N # SERVICE MARK
+2121;A # TELEPHONE SIGN
+2122;A # TRADE MARK SIGN
+2123;N # VERSICLE
+2124;N # DOUBLE-STRUCK CAPITAL Z
+2125;N # OUNCE SIGN
+2126;A # OHM SIGN
+2127;N # INVERTED OHM SIGN
+2128;N # BLACK-LETTER CAPITAL Z
+2129;N # TURNED GREEK SMALL LETTER IOTA
+212A;N # KELVIN SIGN
+212B;A # ANGSTROM SIGN
+212C;N # SCRIPT CAPITAL B
+212D;N # BLACK-LETTER CAPITAL C
+212E;N # ESTIMATED SYMBOL
+212F;N # SCRIPT SMALL E
+2130;N # SCRIPT CAPITAL E
+2131;N # SCRIPT CAPITAL F
+2132;N # TURNED CAPITAL F
+2133;N # SCRIPT CAPITAL M
+2134;N # SCRIPT SMALL O
+2135;N # ALEF SYMBOL
+2136;N # BET SYMBOL
+2137;N # GIMEL SYMBOL
+2138;N # DALET SYMBOL
+2139;N # INFORMATION SOURCE
+213A;N # ROTATED CAPITAL Q
+213B;N # FACSIMILE SIGN
+213C;N # DOUBLE-STRUCK SMALL PI
+213D;N # DOUBLE-STRUCK SMALL GAMMA
+213E;N # DOUBLE-STRUCK CAPITAL GAMMA
+213F;N # DOUBLE-STRUCK CAPITAL PI
+2140;N # DOUBLE-STRUCK N-ARY SUMMATION
+2141;N # TURNED SANS-SERIF CAPITAL G
+2142;N # TURNED SANS-SERIF CAPITAL L
+2143;N # REVERSED SANS-SERIF CAPITAL L
+2144;N # TURNED SANS-SERIF CAPITAL Y
+2145;N # DOUBLE-STRUCK ITALIC CAPITAL D
+2146;N # DOUBLE-STRUCK ITALIC SMALL D
+2147;N # DOUBLE-STRUCK ITALIC SMALL E
+2148;N # DOUBLE-STRUCK ITALIC SMALL I
+2149;N # DOUBLE-STRUCK ITALIC SMALL J
+214A;N # PROPERTY LINE
+214B;N # TURNED AMPERSAND
+214C;N # PER SIGN
+214D;N # AKTIESELSKAB
+214E;N # TURNED SMALL F
+214F;N # SYMBOL FOR SAMARITAN SOURCE
+2153;A # VULGAR FRACTION ONE THIRD
+2154;A # VULGAR FRACTION TWO THIRDS
+2155;N # VULGAR FRACTION ONE FIFTH
+2156;N # VULGAR FRACTION TWO FIFTHS
+2157;N # VULGAR FRACTION THREE FIFTHS
+2158;N # VULGAR FRACTION FOUR FIFTHS
+2159;N # VULGAR FRACTION ONE SIXTH
+215A;N # VULGAR FRACTION FIVE SIXTHS
+215B;A # VULGAR FRACTION ONE EIGHTH
+215C;A # VULGAR FRACTION THREE EIGHTHS
+215D;A # VULGAR FRACTION FIVE EIGHTHS
+215E;A # VULGAR FRACTION SEVEN EIGHTHS
+215F;N # FRACTION NUMERATOR ONE
+2160;A # ROMAN NUMERAL ONE
+2161;A # ROMAN NUMERAL TWO
+2162;A # ROMAN NUMERAL THREE
+2163;A # ROMAN NUMERAL FOUR
+2164;A # ROMAN NUMERAL FIVE
+2165;A # ROMAN NUMERAL SIX
+2166;A # ROMAN NUMERAL SEVEN
+2167;A # ROMAN NUMERAL EIGHT
+2168;A # ROMAN NUMERAL NINE
+2169;A # ROMAN NUMERAL TEN
+216A;A # ROMAN NUMERAL ELEVEN
+216B;A # ROMAN NUMERAL TWELVE
+216C;N # ROMAN NUMERAL FIFTY
+216D;N # ROMAN NUMERAL ONE HUNDRED
+216E;N # ROMAN NUMERAL FIVE HUNDRED
+216F;N # ROMAN NUMERAL ONE THOUSAND
+2170;A # SMALL ROMAN NUMERAL ONE
+2171;A # SMALL ROMAN NUMERAL TWO
+2172;A # SMALL ROMAN NUMERAL THREE
+2173;A # SMALL ROMAN NUMERAL FOUR
+2174;A # SMALL ROMAN NUMERAL FIVE
+2175;A # SMALL ROMAN NUMERAL SIX
+2176;A # SMALL ROMAN NUMERAL SEVEN
+2177;A # SMALL ROMAN NUMERAL EIGHT
+2178;A # SMALL ROMAN NUMERAL NINE
+2179;A # SMALL ROMAN NUMERAL TEN
+217A;N # SMALL ROMAN NUMERAL ELEVEN
+217B;N # SMALL ROMAN NUMERAL TWELVE
+217C;N # SMALL ROMAN NUMERAL FIFTY
+217D;N # SMALL ROMAN NUMERAL ONE HUNDRED
+217E;N # SMALL ROMAN NUMERAL FIVE HUNDRED
+217F;N # SMALL ROMAN NUMERAL ONE THOUSAND
+2180;N # ROMAN NUMERAL ONE THOUSAND C D
+2181;N # ROMAN NUMERAL FIVE THOUSAND
+2182;N # ROMAN NUMERAL TEN THOUSAND
+2183;N # ROMAN NUMERAL REVERSED ONE HUNDRED
+2184;N # LATIN SMALL LETTER REVERSED C
+2185;N # ROMAN NUMERAL SIX LATE FORM
+2186;N # ROMAN NUMERAL FIFTY EARLY FORM
+2187;N # ROMAN NUMERAL FIFTY THOUSAND
+2188;N # ROMAN NUMERAL ONE HUNDRED THOUSAND
+2190;A # LEFTWARDS ARROW
+2191;A # UPWARDS ARROW
+2192;A # RIGHTWARDS ARROW
+2193;A # DOWNWARDS ARROW
+2194;A # LEFT RIGHT ARROW
+2195;A # UP DOWN ARROW
+2196;A # NORTH WEST ARROW
+2197;A # NORTH EAST ARROW
+2198;A # SOUTH EAST ARROW
+2199;A # SOUTH WEST ARROW
+219A;N # LEFTWARDS ARROW WITH STROKE
+219B;N # RIGHTWARDS ARROW WITH STROKE
+219C;N # LEFTWARDS WAVE ARROW
+219D;N # RIGHTWARDS WAVE ARROW
+219E;N # LEFTWARDS TWO HEADED ARROW
+219F;N # UPWARDS TWO HEADED ARROW
+21A0;N # RIGHTWARDS TWO HEADED ARROW
+21A1;N # DOWNWARDS TWO HEADED ARROW
+21A2;N # LEFTWARDS ARROW WITH TAIL
+21A3;N # RIGHTWARDS ARROW WITH TAIL
+21A4;N # LEFTWARDS ARROW FROM BAR
+21A5;N # UPWARDS ARROW FROM BAR
+21A6;N # RIGHTWARDS ARROW FROM BAR
+21A7;N # DOWNWARDS ARROW FROM BAR
+21A8;N # UP DOWN ARROW WITH BASE
+21A9;N # LEFTWARDS ARROW WITH HOOK
+21AA;N # RIGHTWARDS ARROW WITH HOOK
+21AB;N # LEFTWARDS ARROW WITH LOOP
+21AC;N # RIGHTWARDS ARROW WITH LOOP
+21AD;N # LEFT RIGHT WAVE ARROW
+21AE;N # LEFT RIGHT ARROW WITH STROKE
+21AF;N # DOWNWARDS ZIGZAG ARROW
+21B0;N # UPWARDS ARROW WITH TIP LEFTWARDS
+21B1;N # UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2;N # DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3;N # DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4;N # RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21B5;N # DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21B6;N # ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7;N # CLOCKWISE TOP SEMICIRCLE ARROW
+21B8;A # NORTH WEST ARROW TO LONG BAR
+21B9;A # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21BA;N # ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB;N # CLOCKWISE OPEN CIRCLE ARROW
+21BC;N # LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD;N # LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE;N # UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF;N # UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0;N # RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1;N # RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2;N # DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3;N # DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4;N # RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5;N # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6;N # LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7;N # LEFTWARDS PAIRED ARROWS
+21C8;N # UPWARDS PAIRED ARROWS
+21C9;N # RIGHTWARDS PAIRED ARROWS
+21CA;N # DOWNWARDS PAIRED ARROWS
+21CB;N # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC;N # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD;N # LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE;N # LEFT RIGHT DOUBLE ARROW WITH STROKE
+21CF;N # RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0;N # LEFTWARDS DOUBLE ARROW
+21D1;N # UPWARDS DOUBLE ARROW
+21D2;A # RIGHTWARDS DOUBLE ARROW
+21D3;N # DOWNWARDS DOUBLE ARROW
+21D4;A # LEFT RIGHT DOUBLE ARROW
+21D5;N # UP DOWN DOUBLE ARROW
+21D6;N # NORTH WEST DOUBLE ARROW
+21D7;N # NORTH EAST DOUBLE ARROW
+21D8;N # SOUTH EAST DOUBLE ARROW
+21D9;N # SOUTH WEST DOUBLE ARROW
+21DA;N # LEFTWARDS TRIPLE ARROW
+21DB;N # RIGHTWARDS TRIPLE ARROW
+21DC;N # LEFTWARDS SQUIGGLE ARROW
+21DD;N # RIGHTWARDS SQUIGGLE ARROW
+21DE;N # UPWARDS ARROW WITH DOUBLE STROKE
+21DF;N # DOWNWARDS ARROW WITH DOUBLE STROKE
+21E0;N # LEFTWARDS DASHED ARROW
+21E1;N # UPWARDS DASHED ARROW
+21E2;N # RIGHTWARDS DASHED ARROW
+21E3;N # DOWNWARDS DASHED ARROW
+21E4;N # LEFTWARDS ARROW TO BAR
+21E5;N # RIGHTWARDS ARROW TO BAR
+21E6;N # LEFTWARDS WHITE ARROW
+21E7;A # UPWARDS WHITE ARROW
+21E8;N # RIGHTWARDS WHITE ARROW
+21E9;N # DOWNWARDS WHITE ARROW
+21EA;N # UPWARDS WHITE ARROW FROM BAR
+21EB;N # UPWARDS WHITE ARROW ON PEDESTAL
+21EC;N # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ED;N # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21EE;N # UPWARDS WHITE DOUBLE ARROW
+21EF;N # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21F0;N # RIGHTWARDS WHITE ARROW FROM WALL
+21F1;N # NORTH WEST ARROW TO CORNER
+21F2;N # SOUTH EAST ARROW TO CORNER
+21F3;N # UP DOWN WHITE ARROW
+21F4;N # RIGHT ARROW WITH SMALL CIRCLE
+21F5;N # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+21F6;N # THREE RIGHTWARDS ARROWS
+21F7;N # LEFTWARDS ARROW WITH VERTICAL STROKE
+21F8;N # RIGHTWARDS ARROW WITH VERTICAL STROKE
+21F9;N # LEFT RIGHT ARROW WITH VERTICAL STROKE
+21FA;N # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FB;N # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FC;N # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+21FD;N # LEFTWARDS OPEN-HEADED ARROW
+21FE;N # RIGHTWARDS OPEN-HEADED ARROW
+21FF;N # LEFT RIGHT OPEN-HEADED ARROW
+2200;A # FOR ALL
+2201;N # COMPLEMENT
+2202;A # PARTIAL DIFFERENTIAL
+2203;A # THERE EXISTS
+2204;N # THERE DOES NOT EXIST
+2205;N # EMPTY SET
+2206;N # INCREMENT
+2207;A # NABLA
+2208;A # ELEMENT OF
+2209;N # NOT AN ELEMENT OF
+220A;N # SMALL ELEMENT OF
+220B;A # CONTAINS AS MEMBER
+220C;N # DOES NOT CONTAIN AS MEMBER
+220D;N # SMALL CONTAINS AS MEMBER
+220E;N # END OF PROOF
+220F;A # N-ARY PRODUCT
+2210;N # N-ARY COPRODUCT
+2211;A # N-ARY SUMMATION
+2212;N # MINUS SIGN
+2213;N # MINUS-OR-PLUS SIGN
+2214;N # DOT PLUS
+2215;A # DIVISION SLASH
+2216;N # SET MINUS
+2217;N # ASTERISK OPERATOR
+2218;N # RING OPERATOR
+2219;N # BULLET OPERATOR
+221A;A # SQUARE ROOT
+221B;N # CUBE ROOT
+221C;N # FOURTH ROOT
+221D;A # PROPORTIONAL TO
+221E;A # INFINITY
+221F;A # RIGHT ANGLE
+2220;A # ANGLE
+2221;N # MEASURED ANGLE
+2222;N # SPHERICAL ANGLE
+2223;A # DIVIDES
+2224;N # DOES NOT DIVIDE
+2225;A # PARALLEL TO
+2226;N # NOT PARALLEL TO
+2227;A # LOGICAL AND
+2228;A # LOGICAL OR
+2229;A # INTERSECTION
+222A;A # UNION
+222B;A # INTEGRAL
+222C;A # DOUBLE INTEGRAL
+222D;N # TRIPLE INTEGRAL
+222E;A # CONTOUR INTEGRAL
+222F;N # SURFACE INTEGRAL
+2230;N # VOLUME INTEGRAL
+2231;N # CLOCKWISE INTEGRAL
+2232;N # CLOCKWISE CONTOUR INTEGRAL
+2233;N # ANTICLOCKWISE CONTOUR INTEGRAL
+2234;A # THEREFORE
+2235;A # BECAUSE
+2236;A # RATIO
+2237;A # PROPORTION
+2238;N # DOT MINUS
+2239;N # EXCESS
+223A;N # GEOMETRIC PROPORTION
+223B;N # HOMOTHETIC
+223C;A # TILDE OPERATOR
+223D;A # REVERSED TILDE
+223E;N # INVERTED LAZY S
+223F;N # SINE WAVE
+2240;N # WREATH PRODUCT
+2241;N # NOT TILDE
+2242;N # MINUS TILDE
+2243;N # ASYMPTOTICALLY EQUAL TO
+2244;N # NOT ASYMPTOTICALLY EQUAL TO
+2245;N # APPROXIMATELY EQUAL TO
+2246;N # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247;N # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+2248;A # ALMOST EQUAL TO
+2249;N # NOT ALMOST EQUAL TO
+224A;N # ALMOST EQUAL OR EQUAL TO
+224B;N # TRIPLE TILDE
+224C;A # ALL EQUAL TO
+224D;N # EQUIVALENT TO
+224E;N # GEOMETRICALLY EQUIVALENT TO
+224F;N # DIFFERENCE BETWEEN
+2250;N # APPROACHES THE LIMIT
+2251;N # GEOMETRICALLY EQUAL TO
+2252;A # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253;N # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254;N # COLON EQUALS
+2255;N # EQUALS COLON
+2256;N # RING IN EQUAL TO
+2257;N # RING EQUAL TO
+2258;N # CORRESPONDS TO
+2259;N # ESTIMATES
+225A;N # EQUIANGULAR TO
+225B;N # STAR EQUALS
+225C;N # DELTA EQUAL TO
+225D;N # EQUAL TO BY DEFINITION
+225E;N # MEASURED BY
+225F;N # QUESTIONED EQUAL TO
+2260;A # NOT EQUAL TO
+2261;A # IDENTICAL TO
+2262;N # NOT IDENTICAL TO
+2263;N # STRICTLY EQUIVALENT TO
+2264;A # LESS-THAN OR EQUAL TO
+2265;A # GREATER-THAN OR EQUAL TO
+2266;A # LESS-THAN OVER EQUAL TO
+2267;A # GREATER-THAN OVER EQUAL TO
+2268;N # LESS-THAN BUT NOT EQUAL TO
+2269;N # GREATER-THAN BUT NOT EQUAL TO
+226A;A # MUCH LESS-THAN
+226B;A # MUCH GREATER-THAN
+226C;N # BETWEEN
+226D;N # NOT EQUIVALENT TO
+226E;A # NOT LESS-THAN
+226F;A # NOT GREATER-THAN
+2270;N # NEITHER LESS-THAN NOR EQUAL TO
+2271;N # NEITHER GREATER-THAN NOR EQUAL TO
+2272;N # LESS-THAN OR EQUIVALENT TO
+2273;N # GREATER-THAN OR EQUIVALENT TO
+2274;N # NEITHER LESS-THAN NOR EQUIVALENT TO
+2275;N # NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276;N # LESS-THAN OR GREATER-THAN
+2277;N # GREATER-THAN OR LESS-THAN
+2278;N # NEITHER LESS-THAN NOR GREATER-THAN
+2279;N # NEITHER GREATER-THAN NOR LESS-THAN
+227A;N # PRECEDES
+227B;N # SUCCEEDS
+227C;N # PRECEDES OR EQUAL TO
+227D;N # SUCCEEDS OR EQUAL TO
+227E;N # PRECEDES OR EQUIVALENT TO
+227F;N # SUCCEEDS OR EQUIVALENT TO
+2280;N # DOES NOT PRECEDE
+2281;N # DOES NOT SUCCEED
+2282;A # SUBSET OF
+2283;A # SUPERSET OF
+2284;N # NOT A SUBSET OF
+2285;N # NOT A SUPERSET OF
+2286;A # SUBSET OF OR EQUAL TO
+2287;A # SUPERSET OF OR EQUAL TO
+2288;N # NEITHER A SUBSET OF NOR EQUAL TO
+2289;N # NEITHER A SUPERSET OF NOR EQUAL TO
+228A;N # SUBSET OF WITH NOT EQUAL TO
+228B;N # SUPERSET OF WITH NOT EQUAL TO
+228C;N # MULTISET
+228D;N # MULTISET MULTIPLICATION
+228E;N # MULTISET UNION
+228F;N # SQUARE IMAGE OF
+2290;N # SQUARE ORIGINAL OF
+2291;N # SQUARE IMAGE OF OR EQUAL TO
+2292;N # SQUARE ORIGINAL OF OR EQUAL TO
+2293;N # SQUARE CAP
+2294;N # SQUARE CUP
+2295;A # CIRCLED PLUS
+2296;N # CIRCLED MINUS
+2297;N # CIRCLED TIMES
+2298;N # CIRCLED DIVISION SLASH
+2299;A # CIRCLED DOT OPERATOR
+229A;N # CIRCLED RING OPERATOR
+229B;N # CIRCLED ASTERISK OPERATOR
+229C;N # CIRCLED EQUALS
+229D;N # CIRCLED DASH
+229E;N # SQUARED PLUS
+229F;N # SQUARED MINUS
+22A0;N # SQUARED TIMES
+22A1;N # SQUARED DOT OPERATOR
+22A2;N # RIGHT TACK
+22A3;N # LEFT TACK
+22A4;N # DOWN TACK
+22A5;A # UP TACK
+22A6;N # ASSERTION
+22A7;N # MODELS
+22A8;N # TRUE
+22A9;N # FORCES
+22AA;N # TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB;N # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC;N # DOES NOT PROVE
+22AD;N # NOT TRUE
+22AE;N # DOES NOT FORCE
+22AF;N # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22B0;N # PRECEDES UNDER RELATION
+22B1;N # SUCCEEDS UNDER RELATION
+22B2;N # NORMAL SUBGROUP OF
+22B3;N # CONTAINS AS NORMAL SUBGROUP
+22B4;N # NORMAL SUBGROUP OF OR EQUAL TO
+22B5;N # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6;N # ORIGINAL OF
+22B7;N # IMAGE OF
+22B8;N # MULTIMAP
+22B9;N # HERMITIAN CONJUGATE MATRIX
+22BA;N # INTERCALATE
+22BB;N # XOR
+22BC;N # NAND
+22BD;N # NOR
+22BE;N # RIGHT ANGLE WITH ARC
+22BF;A # RIGHT TRIANGLE
+22C0;N # N-ARY LOGICAL AND
+22C1;N # N-ARY LOGICAL OR
+22C2;N # N-ARY INTERSECTION
+22C3;N # N-ARY UNION
+22C4;N # DIAMOND OPERATOR
+22C5;N # DOT OPERATOR
+22C6;N # STAR OPERATOR
+22C7;N # DIVISION TIMES
+22C8;N # BOWTIE
+22C9;N # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA;N # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB;N # LEFT SEMIDIRECT PRODUCT
+22CC;N # RIGHT SEMIDIRECT PRODUCT
+22CD;N # REVERSED TILDE EQUALS
+22CE;N # CURLY LOGICAL OR
+22CF;N # CURLY LOGICAL AND
+22D0;N # DOUBLE SUBSET
+22D1;N # DOUBLE SUPERSET
+22D2;N # DOUBLE INTERSECTION
+22D3;N # DOUBLE UNION
+22D4;N # PITCHFORK
+22D5;N # EQUAL AND PARALLEL TO
+22D6;N # LESS-THAN WITH DOT
+22D7;N # GREATER-THAN WITH DOT
+22D8;N # VERY MUCH LESS-THAN
+22D9;N # VERY MUCH GREATER-THAN
+22DA;N # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB;N # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC;N # EQUAL TO OR LESS-THAN
+22DD;N # EQUAL TO OR GREATER-THAN
+22DE;N # EQUAL TO OR PRECEDES
+22DF;N # EQUAL TO OR SUCCEEDS
+22E0;N # DOES NOT PRECEDE OR EQUAL
+22E1;N # DOES NOT SUCCEED OR EQUAL
+22E2;N # NOT SQUARE IMAGE OF OR EQUAL TO
+22E3;N # NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4;N # SQUARE IMAGE OF OR NOT EQUAL TO
+22E5;N # SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6;N # LESS-THAN BUT NOT EQUIVALENT TO
+22E7;N # GREATER-THAN BUT NOT EQUIVALENT TO
+22E8;N # PRECEDES BUT NOT EQUIVALENT TO
+22E9;N # SUCCEEDS BUT NOT EQUIVALENT TO
+22EA;N # NOT NORMAL SUBGROUP OF
+22EB;N # DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC;N # NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED;N # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22EE;N # VERTICAL ELLIPSIS
+22EF;N # MIDLINE HORIZONTAL ELLIPSIS
+22F0;N # UP RIGHT DIAGONAL ELLIPSIS
+22F1;N # DOWN RIGHT DIAGONAL ELLIPSIS
+22F2;N # ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3;N # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4;N # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F5;N # ELEMENT OF WITH DOT ABOVE
+22F6;N # ELEMENT OF WITH OVERBAR
+22F7;N # SMALL ELEMENT OF WITH OVERBAR
+22F8;N # ELEMENT OF WITH UNDERBAR
+22F9;N # ELEMENT OF WITH TWO HORIZONTAL STROKES
+22FA;N # CONTAINS WITH LONG HORIZONTAL STROKE
+22FB;N # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC;N # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD;N # CONTAINS WITH OVERBAR
+22FE;N # SMALL CONTAINS WITH OVERBAR
+22FF;N # Z NOTATION BAG MEMBERSHIP
+2300;N # DIAMETER SIGN
+2301;N # ELECTRIC ARROW
+2302;N # HOUSE
+2303;N # UP ARROWHEAD
+2304;N # DOWN ARROWHEAD
+2305;N # PROJECTIVE
+2306;N # PERSPECTIVE
+2307;N # WAVY LINE
+2308;N # LEFT CEILING
+2309;N # RIGHT CEILING
+230A;N # LEFT FLOOR
+230B;N # RIGHT FLOOR
+230C;N # BOTTOM RIGHT CROP
+230D;N # BOTTOM LEFT CROP
+230E;N # TOP RIGHT CROP
+230F;N # TOP LEFT CROP
+2310;N # REVERSED NOT SIGN
+2311;N # SQUARE LOZENGE
+2312;A # ARC
+2313;N # SEGMENT
+2314;N # SECTOR
+2315;N # TELEPHONE RECORDER
+2316;N # POSITION INDICATOR
+2317;N # VIEWDATA SQUARE
+2318;N # PLACE OF INTEREST SIGN
+2319;N # TURNED NOT SIGN
+231A;N # WATCH
+231B;N # HOURGLASS
+231C;N # TOP LEFT CORNER
+231D;N # TOP RIGHT CORNER
+231E;N # BOTTOM LEFT CORNER
+231F;N # BOTTOM RIGHT CORNER
+2320;N # TOP HALF INTEGRAL
+2321;N # BOTTOM HALF INTEGRAL
+2322;N # FROWN
+2323;N # SMILE
+2324;N # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325;N # OPTION KEY
+2326;N # ERASE TO THE RIGHT
+2327;N # X IN A RECTANGLE BOX
+2328;N # KEYBOARD
+2329;W # LEFT-POINTING ANGLE BRACKET
+232A;W # RIGHT-POINTING ANGLE BRACKET
+232B;N # ERASE TO THE LEFT
+232C;N # BENZENE RING
+232D;N # CYLINDRICITY
+232E;N # ALL AROUND-PROFILE
+232F;N # SYMMETRY
+2330;N # TOTAL RUNOUT
+2331;N # DIMENSION ORIGIN
+2332;N # CONICAL TAPER
+2333;N # SLOPE
+2334;N # COUNTERBORE
+2335;N # COUNTERSINK
+2336;N # APL FUNCTIONAL SYMBOL I-BEAM
+2337;N # APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338;N # APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339;N # APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A;N # APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B;N # APL FUNCTIONAL SYMBOL QUAD JOT
+233C;N # APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D;N # APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E;N # APL FUNCTIONAL SYMBOL CIRCLE JOT
+233F;N # APL FUNCTIONAL SYMBOL SLASH BAR
+2340;N # APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341;N # APL FUNCTIONAL SYMBOL QUAD SLASH
+2342;N # APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343;N # APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344;N # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345;N # APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346;N # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347;N # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348;N # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349;N # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A;N # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234B;N # APL FUNCTIONAL SYMBOL DELTA STILE
+234C;N # APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D;N # APL FUNCTIONAL SYMBOL QUAD DELTA
+234E;N # APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234F;N # APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350;N # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351;N # APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352;N # APL FUNCTIONAL SYMBOL DEL STILE
+2353;N # APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354;N # APL FUNCTIONAL SYMBOL QUAD DEL
+2355;N # APL FUNCTIONAL SYMBOL UP TACK JOT
+2356;N # APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357;N # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358;N # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359;N # APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A;N # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B;N # APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C;N # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D;N # APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E;N # APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F;N # APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360;N # APL FUNCTIONAL SYMBOL QUAD COLON
+2361;N # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362;N # APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363;N # APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364;N # APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365;N # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366;N # APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367;N # APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368;N # APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369;N # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A;N # APL FUNCTIONAL SYMBOL COMMA BAR
+236B;N # APL FUNCTIONAL SYMBOL DEL TILDE
+236C;N # APL FUNCTIONAL SYMBOL ZILDE
+236D;N # APL FUNCTIONAL SYMBOL STILE TILDE
+236E;N # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F;N # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370;N # APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371;N # APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372;N # APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373;N # APL FUNCTIONAL SYMBOL IOTA
+2374;N # APL FUNCTIONAL SYMBOL RHO
+2375;N # APL FUNCTIONAL SYMBOL OMEGA
+2376;N # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377;N # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378;N # APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379;N # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A;N # APL FUNCTIONAL SYMBOL ALPHA
+237B;N # NOT CHECK MARK
+237C;N # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D;N # SHOULDERED OPEN BOX
+237E;N # BELL SYMBOL
+237F;N # VERTICAL LINE WITH MIDDLE DOT
+2380;N # INSERTION SYMBOL
+2381;N # CONTINUOUS UNDERLINE SYMBOL
+2382;N # DISCONTINUOUS UNDERLINE SYMBOL
+2383;N # EMPHASIS SYMBOL
+2384;N # COMPOSITION SYMBOL
+2385;N # WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386;N # ENTER SYMBOL
+2387;N # ALTERNATIVE KEY SYMBOL
+2388;N # HELM SYMBOL
+2389;N # CIRCLED HORIZONTAL BAR WITH NOTCH
+238A;N # CIRCLED TRIANGLE DOWN
+238B;N # BROKEN CIRCLE WITH NORTHWEST ARROW
+238C;N # UNDO SYMBOL
+238D;N # MONOSTABLE SYMBOL
+238E;N # HYSTERESIS SYMBOL
+238F;N # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390;N # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391;N # PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392;N # PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393;N # DIRECT CURRENT SYMBOL FORM TWO
+2394;N # SOFTWARE-FUNCTION SYMBOL
+2395;N # APL FUNCTIONAL SYMBOL QUAD
+2396;N # DECIMAL SEPARATOR KEY SYMBOL
+2397;N # PREVIOUS PAGE
+2398;N # NEXT PAGE
+2399;N # PRINT SCREEN SYMBOL
+239A;N # CLEAR SCREEN SYMBOL
+239B;N # LEFT PARENTHESIS UPPER HOOK
+239C;N # LEFT PARENTHESIS EXTENSION
+239D;N # LEFT PARENTHESIS LOWER HOOK
+239E;N # RIGHT PARENTHESIS UPPER HOOK
+239F;N # RIGHT PARENTHESIS EXTENSION
+23A0;N # RIGHT PARENTHESIS LOWER HOOK
+23A1;N # LEFT SQUARE BRACKET UPPER CORNER
+23A2;N # LEFT SQUARE BRACKET EXTENSION
+23A3;N # LEFT SQUARE BRACKET LOWER CORNER
+23A4;N # RIGHT SQUARE BRACKET UPPER CORNER
+23A5;N # RIGHT SQUARE BRACKET EXTENSION
+23A6;N # RIGHT SQUARE BRACKET LOWER CORNER
+23A7;N # LEFT CURLY BRACKET UPPER HOOK
+23A8;N # LEFT CURLY BRACKET MIDDLE PIECE
+23A9;N # LEFT CURLY BRACKET LOWER HOOK
+23AA;N # CURLY BRACKET EXTENSION
+23AB;N # RIGHT CURLY BRACKET UPPER HOOK
+23AC;N # RIGHT CURLY BRACKET MIDDLE PIECE
+23AD;N # RIGHT CURLY BRACKET LOWER HOOK
+23AE;N # INTEGRAL EXTENSION
+23AF;N # HORIZONTAL LINE EXTENSION
+23B0;N # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+23B1;N # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+23B2;N # SUMMATION TOP
+23B3;N # SUMMATION BOTTOM
+23B4;N # TOP SQUARE BRACKET
+23B5;N # BOTTOM SQUARE BRACKET
+23B6;N # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7;N # RADICAL SYMBOL BOTTOM
+23B8;N # LEFT VERTICAL BOX LINE
+23B9;N # RIGHT VERTICAL BOX LINE
+23BA;N # HORIZONTAL SCAN LINE-1
+23BB;N # HORIZONTAL SCAN LINE-3
+23BC;N # HORIZONTAL SCAN LINE-7
+23BD;N # HORIZONTAL SCAN LINE-9
+23BE;N # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+23BF;N # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+23C0;N # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
+23C1;N # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
+23C2;N # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
+23C3;N # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE
+23C4;N # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE
+23C5;N # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE
+23C6;N # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE
+23C7;N # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
+23C8;N # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
+23C9;N # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+23CA;N # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+23CB;N # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+23CC;N # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+23CD;N # SQUARE FOOT
+23CE;N # RETURN SYMBOL
+23CF;N # EJECT SYMBOL
+23D0;N # VERTICAL LINE EXTENSION
+23D1;N # METRICAL BREVE
+23D2;N # METRICAL LONG OVER SHORT
+23D3;N # METRICAL SHORT OVER LONG
+23D4;N # METRICAL LONG OVER TWO SHORTS
+23D5;N # METRICAL TWO SHORTS OVER LONG
+23D6;N # METRICAL TWO SHORTS JOINED
+23D7;N # METRICAL TRISEME
+23D8;N # METRICAL TETRASEME
+23D9;N # METRICAL PENTASEME
+23DA;N # EARTH GROUND
+23DB;N # FUSE
+23DC;N # TOP PARENTHESIS
+23DD;N # BOTTOM PARENTHESIS
+23DE;N # TOP CURLY BRACKET
+23DF;N # BOTTOM CURLY BRACKET
+23E0;N # TOP TORTOISE SHELL BRACKET
+23E1;N # BOTTOM TORTOISE SHELL BRACKET
+23E2;N # WHITE TRAPEZIUM
+23E3;N # BENZENE RING WITH CIRCLE
+23E4;N # STRAIGHTNESS
+23E5;N # FLATNESS
+23E6;N # AC CURRENT
+23E7;N # ELECTRICAL INTERSECTION
+2400;N # SYMBOL FOR NULL
+2401;N # SYMBOL FOR START OF HEADING
+2402;N # SYMBOL FOR START OF TEXT
+2403;N # SYMBOL FOR END OF TEXT
+2404;N # SYMBOL FOR END OF TRANSMISSION
+2405;N # SYMBOL FOR ENQUIRY
+2406;N # SYMBOL FOR ACKNOWLEDGE
+2407;N # SYMBOL FOR BELL
+2408;N # SYMBOL FOR BACKSPACE
+2409;N # SYMBOL FOR HORIZONTAL TABULATION
+240A;N # SYMBOL FOR LINE FEED
+240B;N # SYMBOL FOR VERTICAL TABULATION
+240C;N # SYMBOL FOR FORM FEED
+240D;N # SYMBOL FOR CARRIAGE RETURN
+240E;N # SYMBOL FOR SHIFT OUT
+240F;N # SYMBOL FOR SHIFT IN
+2410;N # SYMBOL FOR DATA LINK ESCAPE
+2411;N # SYMBOL FOR DEVICE CONTROL ONE
+2412;N # SYMBOL FOR DEVICE CONTROL TWO
+2413;N # SYMBOL FOR DEVICE CONTROL THREE
+2414;N # SYMBOL FOR DEVICE CONTROL FOUR
+2415;N # SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416;N # SYMBOL FOR SYNCHRONOUS IDLE
+2417;N # SYMBOL FOR END OF TRANSMISSION BLOCK
+2418;N # SYMBOL FOR CANCEL
+2419;N # SYMBOL FOR END OF MEDIUM
+241A;N # SYMBOL FOR SUBSTITUTE
+241B;N # SYMBOL FOR ESCAPE
+241C;N # SYMBOL FOR FILE SEPARATOR
+241D;N # SYMBOL FOR GROUP SEPARATOR
+241E;N # SYMBOL FOR RECORD SEPARATOR
+241F;N # SYMBOL FOR UNIT SEPARATOR
+2420;N # SYMBOL FOR SPACE
+2421;N # SYMBOL FOR DELETE
+2422;N # BLANK SYMBOL
+2423;N # OPEN BOX
+2424;N # SYMBOL FOR NEWLINE
+2425;N # SYMBOL FOR DELETE FORM TWO
+2426;N # SYMBOL FOR SUBSTITUTE FORM TWO
+2440;N # OCR HOOK
+2441;N # OCR CHAIR
+2442;N # OCR FORK
+2443;N # OCR INVERTED FORK
+2444;N # OCR BELT BUCKLE
+2445;N # OCR BOW TIE
+2446;N # OCR BRANCH BANK IDENTIFICATION
+2447;N # OCR AMOUNT OF CHECK
+2448;N # OCR DASH
+2449;N # OCR CUSTOMER ACCOUNT NUMBER
+244A;N # OCR DOUBLE BACKSLASH
+2460;A # CIRCLED DIGIT ONE
+2461;A # CIRCLED DIGIT TWO
+2462;A # CIRCLED DIGIT THREE
+2463;A # CIRCLED DIGIT FOUR
+2464;A # CIRCLED DIGIT FIVE
+2465;A # CIRCLED DIGIT SIX
+2466;A # CIRCLED DIGIT SEVEN
+2467;A # CIRCLED DIGIT EIGHT
+2468;A # CIRCLED DIGIT NINE
+2469;A # CIRCLED NUMBER TEN
+246A;A # CIRCLED NUMBER ELEVEN
+246B;A # CIRCLED NUMBER TWELVE
+246C;A # CIRCLED NUMBER THIRTEEN
+246D;A # CIRCLED NUMBER FOURTEEN
+246E;A # CIRCLED NUMBER FIFTEEN
+246F;A # CIRCLED NUMBER SIXTEEN
+2470;A # CIRCLED NUMBER SEVENTEEN
+2471;A # CIRCLED NUMBER EIGHTEEN
+2472;A # CIRCLED NUMBER NINETEEN
+2473;A # CIRCLED NUMBER TWENTY
+2474;A # PARENTHESIZED DIGIT ONE
+2475;A # PARENTHESIZED DIGIT TWO
+2476;A # PARENTHESIZED DIGIT THREE
+2477;A # PARENTHESIZED DIGIT FOUR
+2478;A # PARENTHESIZED DIGIT FIVE
+2479;A # PARENTHESIZED DIGIT SIX
+247A;A # PARENTHESIZED DIGIT SEVEN
+247B;A # PARENTHESIZED DIGIT EIGHT
+247C;A # PARENTHESIZED DIGIT NINE
+247D;A # PARENTHESIZED NUMBER TEN
+247E;A # PARENTHESIZED NUMBER ELEVEN
+247F;A # PARENTHESIZED NUMBER TWELVE
+2480;A # PARENTHESIZED NUMBER THIRTEEN
+2481;A # PARENTHESIZED NUMBER FOURTEEN
+2482;A # PARENTHESIZED NUMBER FIFTEEN
+2483;A # PARENTHESIZED NUMBER SIXTEEN
+2484;A # PARENTHESIZED NUMBER SEVENTEEN
+2485;A # PARENTHESIZED NUMBER EIGHTEEN
+2486;A # PARENTHESIZED NUMBER NINETEEN
+2487;A # PARENTHESIZED NUMBER TWENTY
+2488;A # DIGIT ONE FULL STOP
+2489;A # DIGIT TWO FULL STOP
+248A;A # DIGIT THREE FULL STOP
+248B;A # DIGIT FOUR FULL STOP
+248C;A # DIGIT FIVE FULL STOP
+248D;A # DIGIT SIX FULL STOP
+248E;A # DIGIT SEVEN FULL STOP
+248F;A # DIGIT EIGHT FULL STOP
+2490;A # DIGIT NINE FULL STOP
+2491;A # NUMBER TEN FULL STOP
+2492;A # NUMBER ELEVEN FULL STOP
+2493;A # NUMBER TWELVE FULL STOP
+2494;A # NUMBER THIRTEEN FULL STOP
+2495;A # NUMBER FOURTEEN FULL STOP
+2496;A # NUMBER FIFTEEN FULL STOP
+2497;A # NUMBER SIXTEEN FULL STOP
+2498;A # NUMBER SEVENTEEN FULL STOP
+2499;A # NUMBER EIGHTEEN FULL STOP
+249A;A # NUMBER NINETEEN FULL STOP
+249B;A # NUMBER TWENTY FULL STOP
+249C;A # PARENTHESIZED LATIN SMALL LETTER A
+249D;A # PARENTHESIZED LATIN SMALL LETTER B
+249E;A # PARENTHESIZED LATIN SMALL LETTER C
+249F;A # PARENTHESIZED LATIN SMALL LETTER D
+24A0;A # PARENTHESIZED LATIN SMALL LETTER E
+24A1;A # PARENTHESIZED LATIN SMALL LETTER F
+24A2;A # PARENTHESIZED LATIN SMALL LETTER G
+24A3;A # PARENTHESIZED LATIN SMALL LETTER H
+24A4;A # PARENTHESIZED LATIN SMALL LETTER I
+24A5;A # PARENTHESIZED LATIN SMALL LETTER J
+24A6;A # PARENTHESIZED LATIN SMALL LETTER K
+24A7;A # PARENTHESIZED LATIN SMALL LETTER L
+24A8;A # PARENTHESIZED LATIN SMALL LETTER M
+24A9;A # PARENTHESIZED LATIN SMALL LETTER N
+24AA;A # PARENTHESIZED LATIN SMALL LETTER O
+24AB;A # PARENTHESIZED LATIN SMALL LETTER P
+24AC;A # PARENTHESIZED LATIN SMALL LETTER Q
+24AD;A # PARENTHESIZED LATIN SMALL LETTER R
+24AE;A # PARENTHESIZED LATIN SMALL LETTER S
+24AF;A # PARENTHESIZED LATIN SMALL LETTER T
+24B0;A # PARENTHESIZED LATIN SMALL LETTER U
+24B1;A # PARENTHESIZED LATIN SMALL LETTER V
+24B2;A # PARENTHESIZED LATIN SMALL LETTER W
+24B3;A # PARENTHESIZED LATIN SMALL LETTER X
+24B4;A # PARENTHESIZED LATIN SMALL LETTER Y
+24B5;A # PARENTHESIZED LATIN SMALL LETTER Z
+24B6;A # CIRCLED LATIN CAPITAL LETTER A
+24B7;A # CIRCLED LATIN CAPITAL LETTER B
+24B8;A # CIRCLED LATIN CAPITAL LETTER C
+24B9;A # CIRCLED LATIN CAPITAL LETTER D
+24BA;A # CIRCLED LATIN CAPITAL LETTER E
+24BB;A # CIRCLED LATIN CAPITAL LETTER F
+24BC;A # CIRCLED LATIN CAPITAL LETTER G
+24BD;A # CIRCLED LATIN CAPITAL LETTER H
+24BE;A # CIRCLED LATIN CAPITAL LETTER I
+24BF;A # CIRCLED LATIN CAPITAL LETTER J
+24C0;A # CIRCLED LATIN CAPITAL LETTER K
+24C1;A # CIRCLED LATIN CAPITAL LETTER L
+24C2;A # CIRCLED LATIN CAPITAL LETTER M
+24C3;A # CIRCLED LATIN CAPITAL LETTER N
+24C4;A # CIRCLED LATIN CAPITAL LETTER O
+24C5;A # CIRCLED LATIN CAPITAL LETTER P
+24C6;A # CIRCLED LATIN CAPITAL LETTER Q
+24C7;A # CIRCLED LATIN CAPITAL LETTER R
+24C8;A # CIRCLED LATIN CAPITAL LETTER S
+24C9;A # CIRCLED LATIN CAPITAL LETTER T
+24CA;A # CIRCLED LATIN CAPITAL LETTER U
+24CB;A # CIRCLED LATIN CAPITAL LETTER V
+24CC;A # CIRCLED LATIN CAPITAL LETTER W
+24CD;A # CIRCLED LATIN CAPITAL LETTER X
+24CE;A # CIRCLED LATIN CAPITAL LETTER Y
+24CF;A # CIRCLED LATIN CAPITAL LETTER Z
+24D0;A # CIRCLED LATIN SMALL LETTER A
+24D1;A # CIRCLED LATIN SMALL LETTER B
+24D2;A # CIRCLED LATIN SMALL LETTER C
+24D3;A # CIRCLED LATIN SMALL LETTER D
+24D4;A # CIRCLED LATIN SMALL LETTER E
+24D5;A # CIRCLED LATIN SMALL LETTER F
+24D6;A # CIRCLED LATIN SMALL LETTER G
+24D7;A # CIRCLED LATIN SMALL LETTER H
+24D8;A # CIRCLED LATIN SMALL LETTER I
+24D9;A # CIRCLED LATIN SMALL LETTER J
+24DA;A # CIRCLED LATIN SMALL LETTER K
+24DB;A # CIRCLED LATIN SMALL LETTER L
+24DC;A # CIRCLED LATIN SMALL LETTER M
+24DD;A # CIRCLED LATIN SMALL LETTER N
+24DE;A # CIRCLED LATIN SMALL LETTER O
+24DF;A # CIRCLED LATIN SMALL LETTER P
+24E0;A # CIRCLED LATIN SMALL LETTER Q
+24E1;A # CIRCLED LATIN SMALL LETTER R
+24E2;A # CIRCLED LATIN SMALL LETTER S
+24E3;A # CIRCLED LATIN SMALL LETTER T
+24E4;A # CIRCLED LATIN SMALL LETTER U
+24E5;A # CIRCLED LATIN SMALL LETTER V
+24E6;A # CIRCLED LATIN SMALL LETTER W
+24E7;A # CIRCLED LATIN SMALL LETTER X
+24E8;A # CIRCLED LATIN SMALL LETTER Y
+24E9;A # CIRCLED LATIN SMALL LETTER Z
+24EA;N # CIRCLED DIGIT ZERO
+24EB;A # NEGATIVE CIRCLED NUMBER ELEVEN
+24EC;A # NEGATIVE CIRCLED NUMBER TWELVE
+24ED;A # NEGATIVE CIRCLED NUMBER THIRTEEN
+24EE;A # NEGATIVE CIRCLED NUMBER FOURTEEN
+24EF;A # NEGATIVE CIRCLED NUMBER FIFTEEN
+24F0;A # NEGATIVE CIRCLED NUMBER SIXTEEN
+24F1;A # NEGATIVE CIRCLED NUMBER SEVENTEEN
+24F2;A # NEGATIVE CIRCLED NUMBER EIGHTEEN
+24F3;A # NEGATIVE CIRCLED NUMBER NINETEEN
+24F4;A # NEGATIVE CIRCLED NUMBER TWENTY
+24F5;A # DOUBLE CIRCLED DIGIT ONE
+24F6;A # DOUBLE CIRCLED DIGIT TWO
+24F7;A # DOUBLE CIRCLED DIGIT THREE
+24F8;A # DOUBLE CIRCLED DIGIT FOUR
+24F9;A # DOUBLE CIRCLED DIGIT FIVE
+24FA;A # DOUBLE CIRCLED DIGIT SIX
+24FB;A # DOUBLE CIRCLED DIGIT SEVEN
+24FC;A # DOUBLE CIRCLED DIGIT EIGHT
+24FD;A # DOUBLE CIRCLED DIGIT NINE
+24FE;A # DOUBLE CIRCLED NUMBER TEN
+24FF;A # NEGATIVE CIRCLED DIGIT ZERO
+2500;A # BOX DRAWINGS LIGHT HORIZONTAL
+2501;A # BOX DRAWINGS HEAVY HORIZONTAL
+2502;A # BOX DRAWINGS LIGHT VERTICAL
+2503;A # BOX DRAWINGS HEAVY VERTICAL
+2504;A # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505;A # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506;A # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507;A # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508;A # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509;A # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A;A # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B;A # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C;A # BOX DRAWINGS LIGHT DOWN AND RIGHT
+250D;A # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E;A # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F;A # BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510;A # BOX DRAWINGS LIGHT DOWN AND LEFT
+2511;A # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512;A # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513;A # BOX DRAWINGS HEAVY DOWN AND LEFT
+2514;A # BOX DRAWINGS LIGHT UP AND RIGHT
+2515;A # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516;A # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517;A # BOX DRAWINGS HEAVY UP AND RIGHT
+2518;A # BOX DRAWINGS LIGHT UP AND LEFT
+2519;A # BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A;A # BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B;A # BOX DRAWINGS HEAVY UP AND LEFT
+251C;A # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251D;A # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251E;A # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F;A # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520;A # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521;A # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522;A # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523;A # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524;A # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525;A # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526;A # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527;A # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528;A # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529;A # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A;A # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B;A # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C;A # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252D;A # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E;A # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F;A # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530;A # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531;A # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532;A # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533;A # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534;A # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535;A # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536;A # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537;A # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538;A # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539;A # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A;A # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B;A # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C;A # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253D;A # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E;A # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F;A # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540;A # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541;A # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542;A # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543;A # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544;A # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545;A # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546;A # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547;A # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548;A # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549;A # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A;A # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B;A # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C;N # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D;N # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E;N # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F;N # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550;A # BOX DRAWINGS DOUBLE HORIZONTAL
+2551;A # BOX DRAWINGS DOUBLE VERTICAL
+2552;A # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553;A # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554;A # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555;A # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556;A # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557;A # BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558;A # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559;A # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A;A # BOX DRAWINGS DOUBLE UP AND RIGHT
+255B;A # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C;A # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D;A # BOX DRAWINGS DOUBLE UP AND LEFT
+255E;A # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F;A # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560;A # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561;A # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562;A # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563;A # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564;A # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565;A # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566;A # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567;A # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568;A # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569;A # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A;A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B;A # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C;A # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D;A # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E;A # BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F;A # BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570;A # BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571;A # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572;A # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573;A # BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574;N # BOX DRAWINGS LIGHT LEFT
+2575;N # BOX DRAWINGS LIGHT UP
+2576;N # BOX DRAWINGS LIGHT RIGHT
+2577;N # BOX DRAWINGS LIGHT DOWN
+2578;N # BOX DRAWINGS HEAVY LEFT
+2579;N # BOX DRAWINGS HEAVY UP
+257A;N # BOX DRAWINGS HEAVY RIGHT
+257B;N # BOX DRAWINGS HEAVY DOWN
+257C;N # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D;N # BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E;N # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F;N # BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580;A # UPPER HALF BLOCK
+2581;A # LOWER ONE EIGHTH BLOCK
+2582;A # LOWER ONE QUARTER BLOCK
+2583;A # LOWER THREE EIGHTHS BLOCK
+2584;A # LOWER HALF BLOCK
+2585;A # LOWER FIVE EIGHTHS BLOCK
+2586;A # LOWER THREE QUARTERS BLOCK
+2587;A # LOWER SEVEN EIGHTHS BLOCK
+2588;A # FULL BLOCK
+2589;A # LEFT SEVEN EIGHTHS BLOCK
+258A;A # LEFT THREE QUARTERS BLOCK
+258B;A # LEFT FIVE EIGHTHS BLOCK
+258C;A # LEFT HALF BLOCK
+258D;A # LEFT THREE EIGHTHS BLOCK
+258E;A # LEFT ONE QUARTER BLOCK
+258F;A # LEFT ONE EIGHTH BLOCK
+2590;N # RIGHT HALF BLOCK
+2591;N # LIGHT SHADE
+2592;A # MEDIUM SHADE
+2593;A # DARK SHADE
+2594;A # UPPER ONE EIGHTH BLOCK
+2595;A # RIGHT ONE EIGHTH BLOCK
+2596;N # QUADRANT LOWER LEFT
+2597;N # QUADRANT LOWER RIGHT
+2598;N # QUADRANT UPPER LEFT
+2599;N # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+259A;N # QUADRANT UPPER LEFT AND LOWER RIGHT
+259B;N # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+259C;N # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+259D;N # QUADRANT UPPER RIGHT
+259E;N # QUADRANT UPPER RIGHT AND LOWER LEFT
+259F;N # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+25A0;A # BLACK SQUARE
+25A1;A # WHITE SQUARE
+25A2;N # WHITE SQUARE WITH ROUNDED CORNERS
+25A3;A # WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4;A # SQUARE WITH HORIZONTAL FILL
+25A5;A # SQUARE WITH VERTICAL FILL
+25A6;A # SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7;A # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8;A # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9;A # SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA;N # BLACK SMALL SQUARE
+25AB;N # WHITE SMALL SQUARE
+25AC;N # BLACK RECTANGLE
+25AD;N # WHITE RECTANGLE
+25AE;N # BLACK VERTICAL RECTANGLE
+25AF;N # WHITE VERTICAL RECTANGLE
+25B0;N # BLACK PARALLELOGRAM
+25B1;N # WHITE PARALLELOGRAM
+25B2;A # BLACK UP-POINTING TRIANGLE
+25B3;A # WHITE UP-POINTING TRIANGLE
+25B4;N # BLACK UP-POINTING SMALL TRIANGLE
+25B5;N # WHITE UP-POINTING SMALL TRIANGLE
+25B6;A # BLACK RIGHT-POINTING TRIANGLE
+25B7;A # WHITE RIGHT-POINTING TRIANGLE
+25B8;N # BLACK RIGHT-POINTING SMALL TRIANGLE
+25B9;N # WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA;N # BLACK RIGHT-POINTING POINTER
+25BB;N # WHITE RIGHT-POINTING POINTER
+25BC;A # BLACK DOWN-POINTING TRIANGLE
+25BD;A # WHITE DOWN-POINTING TRIANGLE
+25BE;N # BLACK DOWN-POINTING SMALL TRIANGLE
+25BF;N # WHITE DOWN-POINTING SMALL TRIANGLE
+25C0;A # BLACK LEFT-POINTING TRIANGLE
+25C1;A # WHITE LEFT-POINTING TRIANGLE
+25C2;N # BLACK LEFT-POINTING SMALL TRIANGLE
+25C3;N # WHITE LEFT-POINTING SMALL TRIANGLE
+25C4;N # BLACK LEFT-POINTING POINTER
+25C5;N # WHITE LEFT-POINTING POINTER
+25C6;A # BLACK DIAMOND
+25C7;A # WHITE DIAMOND
+25C8;A # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9;N # FISHEYE
+25CA;N # LOZENGE
+25CB;A # WHITE CIRCLE
+25CC;N # DOTTED CIRCLE
+25CD;N # CIRCLE WITH VERTICAL FILL
+25CE;A # BULLSEYE
+25CF;A # BLACK CIRCLE
+25D0;A # CIRCLE WITH LEFT HALF BLACK
+25D1;A # CIRCLE WITH RIGHT HALF BLACK
+25D2;N # CIRCLE WITH LOWER HALF BLACK
+25D3;N # CIRCLE WITH UPPER HALF BLACK
+25D4;N # CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5;N # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6;N # LEFT HALF BLACK CIRCLE
+25D7;N # RIGHT HALF BLACK CIRCLE
+25D8;N # INVERSE BULLET
+25D9;N # INVERSE WHITE CIRCLE
+25DA;N # UPPER HALF INVERSE WHITE CIRCLE
+25DB;N # LOWER HALF INVERSE WHITE CIRCLE
+25DC;N # UPPER LEFT QUADRANT CIRCULAR ARC
+25DD;N # UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE;N # LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF;N # LOWER LEFT QUADRANT CIRCULAR ARC
+25E0;N # UPPER HALF CIRCLE
+25E1;N # LOWER HALF CIRCLE
+25E2;A # BLACK LOWER RIGHT TRIANGLE
+25E3;A # BLACK LOWER LEFT TRIANGLE
+25E4;A # BLACK UPPER LEFT TRIANGLE
+25E5;A # BLACK UPPER RIGHT TRIANGLE
+25E6;N # WHITE BULLET
+25E7;N # SQUARE WITH LEFT HALF BLACK
+25E8;N # SQUARE WITH RIGHT HALF BLACK
+25E9;N # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA;N # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB;N # WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC;N # WHITE UP-POINTING TRIANGLE WITH DOT
+25ED;N # UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE;N # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF;A # LARGE CIRCLE
+25F0;N # WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1;N # WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2;N # WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3;N # WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4;N # WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5;N # WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6;N # WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7;N # WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8;N # UPPER LEFT TRIANGLE
+25F9;N # UPPER RIGHT TRIANGLE
+25FA;N # LOWER LEFT TRIANGLE
+25FB;N # WHITE MEDIUM SQUARE
+25FC;N # BLACK MEDIUM SQUARE
+25FD;N # WHITE MEDIUM SMALL SQUARE
+25FE;N # BLACK MEDIUM SMALL SQUARE
+25FF;N # LOWER RIGHT TRIANGLE
+2600;N # BLACK SUN WITH RAYS
+2601;N # CLOUD
+2602;N # UMBRELLA
+2603;N # SNOWMAN
+2604;N # COMET
+2605;A # BLACK STAR
+2606;A # WHITE STAR
+2607;N # LIGHTNING
+2608;N # THUNDERSTORM
+2609;A # SUN
+260A;N # ASCENDING NODE
+260B;N # DESCENDING NODE
+260C;N # CONJUNCTION
+260D;N # OPPOSITION
+260E;A # BLACK TELEPHONE
+260F;A # WHITE TELEPHONE
+2610;N # BALLOT BOX
+2611;N # BALLOT BOX WITH CHECK
+2612;N # BALLOT BOX WITH X
+2613;N # SALTIRE
+2614;A # UMBRELLA WITH RAIN DROPS
+2615;A # HOT BEVERAGE
+2616;N # WHITE SHOGI PIECE
+2617;N # BLACK SHOGI PIECE
+2618;N # SHAMROCK
+2619;N # REVERSED ROTATED FLORAL HEART BULLET
+261A;N # BLACK LEFT POINTING INDEX
+261B;N # BLACK RIGHT POINTING INDEX
+261C;A # WHITE LEFT POINTING INDEX
+261D;N # WHITE UP POINTING INDEX
+261E;A # WHITE RIGHT POINTING INDEX
+261F;N # WHITE DOWN POINTING INDEX
+2620;N # SKULL AND CROSSBONES
+2621;N # CAUTION SIGN
+2622;N # RADIOACTIVE SIGN
+2623;N # BIOHAZARD SIGN
+2624;N # CADUCEUS
+2625;N # ANKH
+2626;N # ORTHODOX CROSS
+2627;N # CHI RHO
+2628;N # CROSS OF LORRAINE
+2629;N # CROSS OF JERUSALEM
+262A;N # STAR AND CRESCENT
+262B;N # FARSI SYMBOL
+262C;N # ADI SHAKTI
+262D;N # HAMMER AND SICKLE
+262E;N # PEACE SYMBOL
+262F;N # YIN YANG
+2630;N # TRIGRAM FOR HEAVEN
+2631;N # TRIGRAM FOR LAKE
+2632;N # TRIGRAM FOR FIRE
+2633;N # TRIGRAM FOR THUNDER
+2634;N # TRIGRAM FOR WIND
+2635;N # TRIGRAM FOR WATER
+2636;N # TRIGRAM FOR MOUNTAIN
+2637;N # TRIGRAM FOR EARTH
+2638;N # WHEEL OF DHARMA
+2639;N # WHITE FROWNING FACE
+263A;N # WHITE SMILING FACE
+263B;N # BLACK SMILING FACE
+263C;N # WHITE SUN WITH RAYS
+263D;N # FIRST QUARTER MOON
+263E;N # LAST QUARTER MOON
+263F;N # MERCURY
+2640;A # FEMALE SIGN
+2641;N # EARTH
+2642;A # MALE SIGN
+2643;N # JUPITER
+2644;N # SATURN
+2645;N # URANUS
+2646;N # NEPTUNE
+2647;N # PLUTO
+2648;N # ARIES
+2649;N # TAURUS
+264A;N # GEMINI
+264B;N # CANCER
+264C;N # LEO
+264D;N # VIRGO
+264E;N # LIBRA
+264F;N # SCORPIUS
+2650;N # SAGITTARIUS
+2651;N # CAPRICORN
+2652;N # AQUARIUS
+2653;N # PISCES
+2654;N # WHITE CHESS KING
+2655;N # WHITE CHESS QUEEN
+2656;N # WHITE CHESS ROOK
+2657;N # WHITE CHESS BISHOP
+2658;N # WHITE CHESS KNIGHT
+2659;N # WHITE CHESS PAWN
+265A;N # BLACK CHESS KING
+265B;N # BLACK CHESS QUEEN
+265C;N # BLACK CHESS ROOK
+265D;N # BLACK CHESS BISHOP
+265E;N # BLACK CHESS KNIGHT
+265F;N # BLACK CHESS PAWN
+2660;A # BLACK SPADE SUIT
+2661;A # WHITE HEART SUIT
+2662;N # WHITE DIAMOND SUIT
+2663;A # BLACK CLUB SUIT
+2664;A # WHITE SPADE SUIT
+2665;A # BLACK HEART SUIT
+2666;N # BLACK DIAMOND SUIT
+2667;A # WHITE CLUB SUIT
+2668;A # HOT SPRINGS
+2669;A # QUARTER NOTE
+266A;A # EIGHTH NOTE
+266B;N # BEAMED EIGHTH NOTES
+266C;A # BEAMED SIXTEENTH NOTES
+266D;A # MUSIC FLAT SIGN
+266E;N # MUSIC NATURAL SIGN
+266F;A # MUSIC SHARP SIGN
+2670;N # WEST SYRIAC CROSS
+2671;N # EAST SYRIAC CROSS
+2672;N # UNIVERSAL RECYCLING SYMBOL
+2673;N # RECYCLING SYMBOL FOR TYPE-1 PLASTICS
+2674;N # RECYCLING SYMBOL FOR TYPE-2 PLASTICS
+2675;N # RECYCLING SYMBOL FOR TYPE-3 PLASTICS
+2676;N # RECYCLING SYMBOL FOR TYPE-4 PLASTICS
+2677;N # RECYCLING SYMBOL FOR TYPE-5 PLASTICS
+2678;N # RECYCLING SYMBOL FOR TYPE-6 PLASTICS
+2679;N # RECYCLING SYMBOL FOR TYPE-7 PLASTICS
+267A;N # RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B;N # BLACK UNIVERSAL RECYCLING SYMBOL
+267C;N # RECYCLED PAPER SYMBOL
+267D;N # PARTIALLY-RECYCLED PAPER SYMBOL
+267E;N # PERMANENT PAPER SIGN
+267F;N # WHEELCHAIR SYMBOL
+2680;N # DIE FACE-1
+2681;N # DIE FACE-2
+2682;N # DIE FACE-3
+2683;N # DIE FACE-4
+2684;N # DIE FACE-5
+2685;N # DIE FACE-6
+2686;N # WHITE CIRCLE WITH DOT RIGHT
+2687;N # WHITE CIRCLE WITH TWO DOTS
+2688;N # BLACK CIRCLE WITH WHITE DOT RIGHT
+2689;N # BLACK CIRCLE WITH TWO WHITE DOTS
+268A;N # MONOGRAM FOR YANG
+268B;N # MONOGRAM FOR YIN
+268C;N # DIGRAM FOR GREATER YANG
+268D;N # DIGRAM FOR LESSER YIN
+268E;N # DIGRAM FOR LESSER YANG
+268F;N # DIGRAM FOR GREATER YIN
+2690;N # WHITE FLAG
+2691;N # BLACK FLAG
+2692;N # HAMMER AND PICK
+2693;N # ANCHOR
+2694;N # CROSSED SWORDS
+2695;N # STAFF OF AESCULAPIUS
+2696;N # SCALES
+2697;N # ALEMBIC
+2698;N # FLOWER
+2699;N # GEAR
+269A;N # STAFF OF HERMES
+269B;N # ATOM SYMBOL
+269C;N # FLEUR-DE-LIS
+269D;N # OUTLINED WHITE STAR
+26A0;N # WARNING SIGN
+26A1;N # HIGH VOLTAGE SIGN
+26A2;N # DOUBLED FEMALE SIGN
+26A3;N # DOUBLED MALE SIGN
+26A4;N # INTERLOCKED FEMALE AND MALE SIGN
+26A5;N # MALE AND FEMALE SIGN
+26A6;N # MALE WITH STROKE SIGN
+26A7;N # MALE WITH STROKE AND MALE AND FEMALE SIGN
+26A8;N # VERTICAL MALE WITH STROKE SIGN
+26A9;N # HORIZONTAL MALE WITH STROKE SIGN
+26AA;N # MEDIUM WHITE CIRCLE
+26AB;N # MEDIUM BLACK CIRCLE
+26AC;N # MEDIUM SMALL WHITE CIRCLE
+26AD;N # MARRIAGE SYMBOL
+26AE;N # DIVORCE SYMBOL
+26AF;N # UNMARRIED PARTNERSHIP SYMBOL
+26B0;N # COFFIN
+26B1;N # FUNERAL URN
+26B2;N # NEUTER
+26B3;N # CERES
+26B4;N # PALLAS
+26B5;N # JUNO
+26B6;N # VESTA
+26B7;N # CHIRON
+26B8;N # BLACK MOON LILITH
+26B9;N # SEXTILE
+26BA;N # SEMISEXTILE
+26BB;N # QUINCUNX
+26BC;N # SESQUIQUADRATE
+26C0;N # WHITE DRAUGHTS MAN
+26C1;N # WHITE DRAUGHTS KING
+26C2;N # BLACK DRAUGHTS MAN
+26C3;N # BLACK DRAUGHTS KING
+2701;N # UPPER BLADE SCISSORS
+2702;N # BLACK SCISSORS
+2703;N # LOWER BLADE SCISSORS
+2704;N # WHITE SCISSORS
+2706;N # TELEPHONE LOCATION SIGN
+2707;N # TAPE DRIVE
+2708;N # AIRPLANE
+2709;N # ENVELOPE
+270C;N # VICTORY HAND
+270D;N # WRITING HAND
+270E;N # LOWER RIGHT PENCIL
+270F;N # PENCIL
+2710;N # UPPER RIGHT PENCIL
+2711;N # WHITE NIB
+2712;N # BLACK NIB
+2713;N # CHECK MARK
+2714;N # HEAVY CHECK MARK
+2715;N # MULTIPLICATION X
+2716;N # HEAVY MULTIPLICATION X
+2717;N # BALLOT X
+2718;N # HEAVY BALLOT X
+2719;N # OUTLINED GREEK CROSS
+271A;N # HEAVY GREEK CROSS
+271B;N # OPEN CENTRE CROSS
+271C;N # HEAVY OPEN CENTRE CROSS
+271D;N # LATIN CROSS
+271E;N # SHADOWED WHITE LATIN CROSS
+271F;N # OUTLINED LATIN CROSS
+2720;N # MALTESE CROSS
+2721;N # STAR OF DAVID
+2722;N # FOUR TEARDROP-SPOKED ASTERISK
+2723;N # FOUR BALLOON-SPOKED ASTERISK
+2724;N # HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725;N # FOUR CLUB-SPOKED ASTERISK
+2726;N # BLACK FOUR POINTED STAR
+2727;N # WHITE FOUR POINTED STAR
+2729;N # STRESS OUTLINED WHITE STAR
+272A;N # CIRCLED WHITE STAR
+272B;N # OPEN CENTRE BLACK STAR
+272C;N # BLACK CENTRE WHITE STAR
+272D;N # OUTLINED BLACK STAR
+272E;N # HEAVY OUTLINED BLACK STAR
+272F;N # PINWHEEL STAR
+2730;N # SHADOWED WHITE STAR
+2731;N # HEAVY ASTERISK
+2732;N # OPEN CENTRE ASTERISK
+2733;N # EIGHT SPOKED ASTERISK
+2734;N # EIGHT POINTED BLACK STAR
+2735;N # EIGHT POINTED PINWHEEL STAR
+2736;N # SIX POINTED BLACK STAR
+2737;N # EIGHT POINTED RECTILINEAR BLACK STAR
+2738;N # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739;N # TWELVE POINTED BLACK STAR
+273A;N # SIXTEEN POINTED ASTERISK
+273B;N # TEARDROP-SPOKED ASTERISK
+273C;N # OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D;A # HEAVY TEARDROP-SPOKED ASTERISK
+273E;N # SIX PETALLED BLACK AND WHITE FLORETTE
+273F;N # BLACK FLORETTE
+2740;N # WHITE FLORETTE
+2741;N # EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742;N # CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743;N # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744;N # SNOWFLAKE
+2745;N # TIGHT TRIFOLIATE SNOWFLAKE
+2746;N # HEAVY CHEVRON SNOWFLAKE
+2747;N # SPARKLE
+2748;N # HEAVY SPARKLE
+2749;N # BALLOON-SPOKED ASTERISK
+274A;N # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B;N # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D;N # SHADOWED WHITE CIRCLE
+274F;N # LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750;N # UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751;N # LOWER RIGHT SHADOWED WHITE SQUARE
+2752;N # UPPER RIGHT SHADOWED WHITE SQUARE
+2756;N # BLACK DIAMOND MINUS WHITE X
+2758;N # LIGHT VERTICAL BAR
+2759;N # MEDIUM VERTICAL BAR
+275A;N # HEAVY VERTICAL BAR
+275B;N # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C;N # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D;N # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E;N # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761;N # CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762;N # HEAVY EXCLAMATION MARK ORNAMENT
+2763;N # HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764;N # HEAVY BLACK HEART
+2765;N # ROTATED HEAVY BLACK HEART BULLET
+2766;N # FLORAL HEART
+2767;N # ROTATED FLORAL HEART BULLET
+2768;N # MEDIUM LEFT PARENTHESIS ORNAMENT
+2769;N # MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A;N # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B;N # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C;N # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D;N # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E;N # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F;N # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770;N # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771;N # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772;N # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773;N # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774;N # MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775;N # MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776;A # DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777;A # DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778;A # DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779;A # DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277A;A # DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277B;A # DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277C;A # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277D;A # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277E;A # DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277F;A # DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780;N # DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781;N # DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782;N # DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783;N # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784;N # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785;N # DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786;N # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787;N # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788;N # DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789;N # DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278A;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278B;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278C;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278D;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278E;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278F;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794;N # HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798;N # HEAVY SOUTH EAST ARROW
+2799;N # HEAVY RIGHTWARDS ARROW
+279A;N # HEAVY NORTH EAST ARROW
+279B;N # DRAFTING POINT RIGHTWARDS ARROW
+279C;N # HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D;N # TRIANGLE-HEADED RIGHTWARDS ARROW
+279E;N # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F;N # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0;N # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1;N # BLACK RIGHTWARDS ARROW
+27A2;N # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3;N # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4;N # BLACK RIGHTWARDS ARROWHEAD
+27A5;N # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6;N # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7;N # SQUAT BLACK RIGHTWARDS ARROW
+27A8;N # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9;N # RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA;N # LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB;N # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC;N # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD;N # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE;N # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF;N # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1;N # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2;N # CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3;N # WHITE-FEATHERED RIGHTWARDS ARROW
+27B4;N # BLACK-FEATHERED SOUTH EAST ARROW
+27B5;N # BLACK-FEATHERED RIGHTWARDS ARROW
+27B6;N # BLACK-FEATHERED NORTH EAST ARROW
+27B7;N # HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8;N # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9;N # HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA;N # TEARDROP-BARBED RIGHTWARDS ARROW
+27BB;N # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC;N # WEDGE-TAILED RIGHTWARDS ARROW
+27BD;N # HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE;N # OPEN-OUTLINED RIGHTWARDS ARROW
+27C0;N # THREE DIMENSIONAL ANGLE
+27C1;N # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE
+27C2;N # PERPENDICULAR
+27C3;N # OPEN SUBSET
+27C4;N # OPEN SUPERSET
+27C5;N # LEFT S-SHAPED BAG DELIMITER
+27C6;N # RIGHT S-SHAPED BAG DELIMITER
+27C7;N # OR WITH DOT INSIDE
+27C8;N # REVERSE SOLIDUS PRECEDING SUBSET
+27C9;N # SUPERSET PRECEDING SOLIDUS
+27CA;N # VERTICAL BAR WITH HORIZONTAL STROKE
+27CC;N # LONG DIVISION
+27D0;N # WHITE DIAMOND WITH CENTRED DOT
+27D1;N # AND WITH DOT
+27D2;N # ELEMENT OF OPENING UPWARDS
+27D3;N # LOWER RIGHT CORNER WITH DOT
+27D4;N # UPPER LEFT CORNER WITH DOT
+27D5;N # LEFT OUTER JOIN
+27D6;N # RIGHT OUTER JOIN
+27D7;N # FULL OUTER JOIN
+27D8;N # LARGE UP TACK
+27D9;N # LARGE DOWN TACK
+27DA;N # LEFT AND RIGHT DOUBLE TURNSTILE
+27DB;N # LEFT AND RIGHT TACK
+27DC;N # LEFT MULTIMAP
+27DD;N # LONG RIGHT TACK
+27DE;N # LONG LEFT TACK
+27DF;N # UP TACK WITH CIRCLE ABOVE
+27E0;N # LOZENGE DIVIDED BY HORIZONTAL RULE
+27E1;N # WHITE CONCAVE-SIDED DIAMOND
+27E2;N # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3;N # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4;N # WHITE SQUARE WITH LEFTWARDS TICK
+27E5;N # WHITE SQUARE WITH RIGHTWARDS TICK
+27E6;Na # MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7;Na # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8;Na # MATHEMATICAL LEFT ANGLE BRACKET
+27E9;Na # MATHEMATICAL RIGHT ANGLE BRACKET
+27EA;Na # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB;Na # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC;Na # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED;Na # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE;N # MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF;N # MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0;N # UPWARDS QUADRUPLE ARROW
+27F1;N # DOWNWARDS QUADRUPLE ARROW
+27F2;N # ANTICLOCKWISE GAPPED CIRCLE ARROW
+27F3;N # CLOCKWISE GAPPED CIRCLE ARROW
+27F4;N # RIGHT ARROW WITH CIRCLED PLUS
+27F5;N # LONG LEFTWARDS ARROW
+27F6;N # LONG RIGHTWARDS ARROW
+27F7;N # LONG LEFT RIGHT ARROW
+27F8;N # LONG LEFTWARDS DOUBLE ARROW
+27F9;N # LONG RIGHTWARDS DOUBLE ARROW
+27FA;N # LONG LEFT RIGHT DOUBLE ARROW
+27FB;N # LONG LEFTWARDS ARROW FROM BAR
+27FC;N # LONG RIGHTWARDS ARROW FROM BAR
+27FD;N # LONG LEFTWARDS DOUBLE ARROW FROM BAR
+27FE;N # LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+27FF;N # LONG RIGHTWARDS SQUIGGLE ARROW
+2800;N # BRAILLE PATTERN BLANK
+2801;N # BRAILLE PATTERN DOTS-1
+2802;N # BRAILLE PATTERN DOTS-2
+2803;N # BRAILLE PATTERN DOTS-12
+2804;N # BRAILLE PATTERN DOTS-3
+2805;N # BRAILLE PATTERN DOTS-13
+2806;N # BRAILLE PATTERN DOTS-23
+2807;N # BRAILLE PATTERN DOTS-123
+2808;N # BRAILLE PATTERN DOTS-4
+2809;N # BRAILLE PATTERN DOTS-14
+280A;N # BRAILLE PATTERN DOTS-24
+280B;N # BRAILLE PATTERN DOTS-124
+280C;N # BRAILLE PATTERN DOTS-34
+280D;N # BRAILLE PATTERN DOTS-134
+280E;N # BRAILLE PATTERN DOTS-234
+280F;N # BRAILLE PATTERN DOTS-1234
+2810;N # BRAILLE PATTERN DOTS-5
+2811;N # BRAILLE PATTERN DOTS-15
+2812;N # BRAILLE PATTERN DOTS-25
+2813;N # BRAILLE PATTERN DOTS-125
+2814;N # BRAILLE PATTERN DOTS-35
+2815;N # BRAILLE PATTERN DOTS-135
+2816;N # BRAILLE PATTERN DOTS-235
+2817;N # BRAILLE PATTERN DOTS-1235
+2818;N # BRAILLE PATTERN DOTS-45
+2819;N # BRAILLE PATTERN DOTS-145
+281A;N # BRAILLE PATTERN DOTS-245
+281B;N # BRAILLE PATTERN DOTS-1245
+281C;N # BRAILLE PATTERN DOTS-345
+281D;N # BRAILLE PATTERN DOTS-1345
+281E;N # BRAILLE PATTERN DOTS-2345
+281F;N # BRAILLE PATTERN DOTS-12345
+2820;N # BRAILLE PATTERN DOTS-6
+2821;N # BRAILLE PATTERN DOTS-16
+2822;N # BRAILLE PATTERN DOTS-26
+2823;N # BRAILLE PATTERN DOTS-126
+2824;N # BRAILLE PATTERN DOTS-36
+2825;N # BRAILLE PATTERN DOTS-136
+2826;N # BRAILLE PATTERN DOTS-236
+2827;N # BRAILLE PATTERN DOTS-1236
+2828;N # BRAILLE PATTERN DOTS-46
+2829;N # BRAILLE PATTERN DOTS-146
+282A;N # BRAILLE PATTERN DOTS-246
+282B;N # BRAILLE PATTERN DOTS-1246
+282C;N # BRAILLE PATTERN DOTS-346
+282D;N # BRAILLE PATTERN DOTS-1346
+282E;N # BRAILLE PATTERN DOTS-2346
+282F;N # BRAILLE PATTERN DOTS-12346
+2830;N # BRAILLE PATTERN DOTS-56
+2831;N # BRAILLE PATTERN DOTS-156
+2832;N # BRAILLE PATTERN DOTS-256
+2833;N # BRAILLE PATTERN DOTS-1256
+2834;N # BRAILLE PATTERN DOTS-356
+2835;N # BRAILLE PATTERN DOTS-1356
+2836;N # BRAILLE PATTERN DOTS-2356
+2837;N # BRAILLE PATTERN DOTS-12356
+2838;N # BRAILLE PATTERN DOTS-456
+2839;N # BRAILLE PATTERN DOTS-1456
+283A;N # BRAILLE PATTERN DOTS-2456
+283B;N # BRAILLE PATTERN DOTS-12456
+283C;N # BRAILLE PATTERN DOTS-3456
+283D;N # BRAILLE PATTERN DOTS-13456
+283E;N # BRAILLE PATTERN DOTS-23456
+283F;N # BRAILLE PATTERN DOTS-123456
+2840;N # BRAILLE PATTERN DOTS-7
+2841;N # BRAILLE PATTERN DOTS-17
+2842;N # BRAILLE PATTERN DOTS-27
+2843;N # BRAILLE PATTERN DOTS-127
+2844;N # BRAILLE PATTERN DOTS-37
+2845;N # BRAILLE PATTERN DOTS-137
+2846;N # BRAILLE PATTERN DOTS-237
+2847;N # BRAILLE PATTERN DOTS-1237
+2848;N # BRAILLE PATTERN DOTS-47
+2849;N # BRAILLE PATTERN DOTS-147
+284A;N # BRAILLE PATTERN DOTS-247
+284B;N # BRAILLE PATTERN DOTS-1247
+284C;N # BRAILLE PATTERN DOTS-347
+284D;N # BRAILLE PATTERN DOTS-1347
+284E;N # BRAILLE PATTERN DOTS-2347
+284F;N # BRAILLE PATTERN DOTS-12347
+2850;N # BRAILLE PATTERN DOTS-57
+2851;N # BRAILLE PATTERN DOTS-157
+2852;N # BRAILLE PATTERN DOTS-257
+2853;N # BRAILLE PATTERN DOTS-1257
+2854;N # BRAILLE PATTERN DOTS-357
+2855;N # BRAILLE PATTERN DOTS-1357
+2856;N # BRAILLE PATTERN DOTS-2357
+2857;N # BRAILLE PATTERN DOTS-12357
+2858;N # BRAILLE PATTERN DOTS-457
+2859;N # BRAILLE PATTERN DOTS-1457
+285A;N # BRAILLE PATTERN DOTS-2457
+285B;N # BRAILLE PATTERN DOTS-12457
+285C;N # BRAILLE PATTERN DOTS-3457
+285D;N # BRAILLE PATTERN DOTS-13457
+285E;N # BRAILLE PATTERN DOTS-23457
+285F;N # BRAILLE PATTERN DOTS-123457
+2860;N # BRAILLE PATTERN DOTS-67
+2861;N # BRAILLE PATTERN DOTS-167
+2862;N # BRAILLE PATTERN DOTS-267
+2863;N # BRAILLE PATTERN DOTS-1267
+2864;N # BRAILLE PATTERN DOTS-367
+2865;N # BRAILLE PATTERN DOTS-1367
+2866;N # BRAILLE PATTERN DOTS-2367
+2867;N # BRAILLE PATTERN DOTS-12367
+2868;N # BRAILLE PATTERN DOTS-467
+2869;N # BRAILLE PATTERN DOTS-1467
+286A;N # BRAILLE PATTERN DOTS-2467
+286B;N # BRAILLE PATTERN DOTS-12467
+286C;N # BRAILLE PATTERN DOTS-3467
+286D;N # BRAILLE PATTERN DOTS-13467
+286E;N # BRAILLE PATTERN DOTS-23467
+286F;N # BRAILLE PATTERN DOTS-123467
+2870;N # BRAILLE PATTERN DOTS-567
+2871;N # BRAILLE PATTERN DOTS-1567
+2872;N # BRAILLE PATTERN DOTS-2567
+2873;N # BRAILLE PATTERN DOTS-12567
+2874;N # BRAILLE PATTERN DOTS-3567
+2875;N # BRAILLE PATTERN DOTS-13567
+2876;N # BRAILLE PATTERN DOTS-23567
+2877;N # BRAILLE PATTERN DOTS-123567
+2878;N # BRAILLE PATTERN DOTS-4567
+2879;N # BRAILLE PATTERN DOTS-14567
+287A;N # BRAILLE PATTERN DOTS-24567
+287B;N # BRAILLE PATTERN DOTS-124567
+287C;N # BRAILLE PATTERN DOTS-34567
+287D;N # BRAILLE PATTERN DOTS-134567
+287E;N # BRAILLE PATTERN DOTS-234567
+287F;N # BRAILLE PATTERN DOTS-1234567
+2880;N # BRAILLE PATTERN DOTS-8
+2881;N # BRAILLE PATTERN DOTS-18
+2882;N # BRAILLE PATTERN DOTS-28
+2883;N # BRAILLE PATTERN DOTS-128
+2884;N # BRAILLE PATTERN DOTS-38
+2885;N # BRAILLE PATTERN DOTS-138
+2886;N # BRAILLE PATTERN DOTS-238
+2887;N # BRAILLE PATTERN DOTS-1238
+2888;N # BRAILLE PATTERN DOTS-48
+2889;N # BRAILLE PATTERN DOTS-148
+288A;N # BRAILLE PATTERN DOTS-248
+288B;N # BRAILLE PATTERN DOTS-1248
+288C;N # BRAILLE PATTERN DOTS-348
+288D;N # BRAILLE PATTERN DOTS-1348
+288E;N # BRAILLE PATTERN DOTS-2348
+288F;N # BRAILLE PATTERN DOTS-12348
+2890;N # BRAILLE PATTERN DOTS-58
+2891;N # BRAILLE PATTERN DOTS-158
+2892;N # BRAILLE PATTERN DOTS-258
+2893;N # BRAILLE PATTERN DOTS-1258
+2894;N # BRAILLE PATTERN DOTS-358
+2895;N # BRAILLE PATTERN DOTS-1358
+2896;N # BRAILLE PATTERN DOTS-2358
+2897;N # BRAILLE PATTERN DOTS-12358
+2898;N # BRAILLE PATTERN DOTS-458
+2899;N # BRAILLE PATTERN DOTS-1458
+289A;N # BRAILLE PATTERN DOTS-2458
+289B;N # BRAILLE PATTERN DOTS-12458
+289C;N # BRAILLE PATTERN DOTS-3458
+289D;N # BRAILLE PATTERN DOTS-13458
+289E;N # BRAILLE PATTERN DOTS-23458
+289F;N # BRAILLE PATTERN DOTS-123458
+28A0;N # BRAILLE PATTERN DOTS-68
+28A1;N # BRAILLE PATTERN DOTS-168
+28A2;N # BRAILLE PATTERN DOTS-268
+28A3;N # BRAILLE PATTERN DOTS-1268
+28A4;N # BRAILLE PATTERN DOTS-368
+28A5;N # BRAILLE PATTERN DOTS-1368
+28A6;N # BRAILLE PATTERN DOTS-2368
+28A7;N # BRAILLE PATTERN DOTS-12368
+28A8;N # BRAILLE PATTERN DOTS-468
+28A9;N # BRAILLE PATTERN DOTS-1468
+28AA;N # BRAILLE PATTERN DOTS-2468
+28AB;N # BRAILLE PATTERN DOTS-12468
+28AC;N # BRAILLE PATTERN DOTS-3468
+28AD;N # BRAILLE PATTERN DOTS-13468
+28AE;N # BRAILLE PATTERN DOTS-23468
+28AF;N # BRAILLE PATTERN DOTS-123468
+28B0;N # BRAILLE PATTERN DOTS-568
+28B1;N # BRAILLE PATTERN DOTS-1568
+28B2;N # BRAILLE PATTERN DOTS-2568
+28B3;N # BRAILLE PATTERN DOTS-12568
+28B4;N # BRAILLE PATTERN DOTS-3568
+28B5;N # BRAILLE PATTERN DOTS-13568
+28B6;N # BRAILLE PATTERN DOTS-23568
+28B7;N # BRAILLE PATTERN DOTS-123568
+28B8;N # BRAILLE PATTERN DOTS-4568
+28B9;N # BRAILLE PATTERN DOTS-14568
+28BA;N # BRAILLE PATTERN DOTS-24568
+28BB;N # BRAILLE PATTERN DOTS-124568
+28BC;N # BRAILLE PATTERN DOTS-34568
+28BD;N # BRAILLE PATTERN DOTS-134568
+28BE;N # BRAILLE PATTERN DOTS-234568
+28BF;N # BRAILLE PATTERN DOTS-1234568
+28C0;N # BRAILLE PATTERN DOTS-78
+28C1;N # BRAILLE PATTERN DOTS-178
+28C2;N # BRAILLE PATTERN DOTS-278
+28C3;N # BRAILLE PATTERN DOTS-1278
+28C4;N # BRAILLE PATTERN DOTS-378
+28C5;N # BRAILLE PATTERN DOTS-1378
+28C6;N # BRAILLE PATTERN DOTS-2378
+28C7;N # BRAILLE PATTERN DOTS-12378
+28C8;N # BRAILLE PATTERN DOTS-478
+28C9;N # BRAILLE PATTERN DOTS-1478
+28CA;N # BRAILLE PATTERN DOTS-2478
+28CB;N # BRAILLE PATTERN DOTS-12478
+28CC;N # BRAILLE PATTERN DOTS-3478
+28CD;N # BRAILLE PATTERN DOTS-13478
+28CE;N # BRAILLE PATTERN DOTS-23478
+28CF;N # BRAILLE PATTERN DOTS-123478
+28D0;N # BRAILLE PATTERN DOTS-578
+28D1;N # BRAILLE PATTERN DOTS-1578
+28D2;N # BRAILLE PATTERN DOTS-2578
+28D3;N # BRAILLE PATTERN DOTS-12578
+28D4;N # BRAILLE PATTERN DOTS-3578
+28D5;N # BRAILLE PATTERN DOTS-13578
+28D6;N # BRAILLE PATTERN DOTS-23578
+28D7;N # BRAILLE PATTERN DOTS-123578
+28D8;N # BRAILLE PATTERN DOTS-4578
+28D9;N # BRAILLE PATTERN DOTS-14578
+28DA;N # BRAILLE PATTERN DOTS-24578
+28DB;N # BRAILLE PATTERN DOTS-124578
+28DC;N # BRAILLE PATTERN DOTS-34578
+28DD;N # BRAILLE PATTERN DOTS-134578
+28DE;N # BRAILLE PATTERN DOTS-234578
+28DF;N # BRAILLE PATTERN DOTS-1234578
+28E0;N # BRAILLE PATTERN DOTS-678
+28E1;N # BRAILLE PATTERN DOTS-1678
+28E2;N # BRAILLE PATTERN DOTS-2678
+28E3;N # BRAILLE PATTERN DOTS-12678
+28E4;N # BRAILLE PATTERN DOTS-3678
+28E5;N # BRAILLE PATTERN DOTS-13678
+28E6;N # BRAILLE PATTERN DOTS-23678
+28E7;N # BRAILLE PATTERN DOTS-123678
+28E8;N # BRAILLE PATTERN DOTS-4678
+28E9;N # BRAILLE PATTERN DOTS-14678
+28EA;N # BRAILLE PATTERN DOTS-24678
+28EB;N # BRAILLE PATTERN DOTS-124678
+28EC;N # BRAILLE PATTERN DOTS-34678
+28ED;N # BRAILLE PATTERN DOTS-134678
+28EE;N # BRAILLE PATTERN DOTS-234678
+28EF;N # BRAILLE PATTERN DOTS-1234678
+28F0;N # BRAILLE PATTERN DOTS-5678
+28F1;N # BRAILLE PATTERN DOTS-15678
+28F2;N # BRAILLE PATTERN DOTS-25678
+28F3;N # BRAILLE PATTERN DOTS-125678
+28F4;N # BRAILLE PATTERN DOTS-35678
+28F5;N # BRAILLE PATTERN DOTS-135678
+28F6;N # BRAILLE PATTERN DOTS-235678
+28F7;N # BRAILLE PATTERN DOTS-1235678
+28F8;N # BRAILLE PATTERN DOTS-45678
+28F9;N # BRAILLE PATTERN DOTS-145678
+28FA;N # BRAILLE PATTERN DOTS-245678
+28FB;N # BRAILLE PATTERN DOTS-1245678
+28FC;N # BRAILLE PATTERN DOTS-345678
+28FD;N # BRAILLE PATTERN DOTS-1345678
+28FE;N # BRAILLE PATTERN DOTS-2345678
+28FF;N # BRAILLE PATTERN DOTS-12345678
+2900;N # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2901;N # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2902;N # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2903;N # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2904;N # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+2905;N # RIGHTWARDS TWO-HEADED ARROW FROM BAR
+2906;N # LEFTWARDS DOUBLE ARROW FROM BAR
+2907;N # RIGHTWARDS DOUBLE ARROW FROM BAR
+2908;N # DOWNWARDS ARROW WITH HORIZONTAL STROKE
+2909;N # UPWARDS ARROW WITH HORIZONTAL STROKE
+290A;N # UPWARDS TRIPLE ARROW
+290B;N # DOWNWARDS TRIPLE ARROW
+290C;N # LEFTWARDS DOUBLE DASH ARROW
+290D;N # RIGHTWARDS DOUBLE DASH ARROW
+290E;N # LEFTWARDS TRIPLE DASH ARROW
+290F;N # RIGHTWARDS TRIPLE DASH ARROW
+2910;N # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+2911;N # RIGHTWARDS ARROW WITH DOTTED STEM
+2912;N # UPWARDS ARROW TO BAR
+2913;N # DOWNWARDS ARROW TO BAR
+2914;N # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2915;N # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2916;N # RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+2917;N # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2918;N # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2919;N # LEFTWARDS ARROW-TAIL
+291A;N # RIGHTWARDS ARROW-TAIL
+291B;N # LEFTWARDS DOUBLE ARROW-TAIL
+291C;N # RIGHTWARDS DOUBLE ARROW-TAIL
+291D;N # LEFTWARDS ARROW TO BLACK DIAMOND
+291E;N # RIGHTWARDS ARROW TO BLACK DIAMOND
+291F;N # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2920;N # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2921;N # NORTH WEST AND SOUTH EAST ARROW
+2922;N # NORTH EAST AND SOUTH WEST ARROW
+2923;N # NORTH WEST ARROW WITH HOOK
+2924;N # NORTH EAST ARROW WITH HOOK
+2925;N # SOUTH EAST ARROW WITH HOOK
+2926;N # SOUTH WEST ARROW WITH HOOK
+2927;N # NORTH WEST ARROW AND NORTH EAST ARROW
+2928;N # NORTH EAST ARROW AND SOUTH EAST ARROW
+2929;N # SOUTH EAST ARROW AND SOUTH WEST ARROW
+292A;N # SOUTH WEST ARROW AND NORTH WEST ARROW
+292B;N # RISING DIAGONAL CROSSING FALLING DIAGONAL
+292C;N # FALLING DIAGONAL CROSSING RISING DIAGONAL
+292D;N # SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+292E;N # NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+292F;N # FALLING DIAGONAL CROSSING NORTH EAST ARROW
+2930;N # RISING DIAGONAL CROSSING SOUTH EAST ARROW
+2931;N # NORTH EAST ARROW CROSSING NORTH WEST ARROW
+2932;N # NORTH WEST ARROW CROSSING NORTH EAST ARROW
+2933;N # WAVE ARROW POINTING DIRECTLY RIGHT
+2934;N # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+2935;N # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+2936;N # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+2937;N # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+2938;N # RIGHT-SIDE ARC CLOCKWISE ARROW
+2939;N # LEFT-SIDE ARC ANTICLOCKWISE ARROW
+293A;N # TOP ARC ANTICLOCKWISE ARROW
+293B;N # BOTTOM ARC ANTICLOCKWISE ARROW
+293C;N # TOP ARC CLOCKWISE ARROW WITH MINUS
+293D;N # TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+293E;N # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
+293F;N # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
+2940;N # ANTICLOCKWISE CLOSED CIRCLE ARROW
+2941;N # CLOCKWISE CLOSED CIRCLE ARROW
+2942;N # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+2943;N # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+2944;N # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+2945;N # RIGHTWARDS ARROW WITH PLUS BELOW
+2946;N # LEFTWARDS ARROW WITH PLUS BELOW
+2947;N # RIGHTWARDS ARROW THROUGH X
+2948;N # LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+2949;N # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+294A;N # LEFT BARB UP RIGHT BARB DOWN HARPOON
+294B;N # LEFT BARB DOWN RIGHT BARB UP HARPOON
+294C;N # UP BARB RIGHT DOWN BARB LEFT HARPOON
+294D;N # UP BARB LEFT DOWN BARB RIGHT HARPOON
+294E;N # LEFT BARB UP RIGHT BARB UP HARPOON
+294F;N # UP BARB RIGHT DOWN BARB RIGHT HARPOON
+2950;N # LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+2951;N # UP BARB LEFT DOWN BARB LEFT HARPOON
+2952;N # LEFTWARDS HARPOON WITH BARB UP TO BAR
+2953;N # RIGHTWARDS HARPOON WITH BARB UP TO BAR
+2954;N # UPWARDS HARPOON WITH BARB RIGHT TO BAR
+2955;N # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+2956;N # LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+2957;N # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+2958;N # UPWARDS HARPOON WITH BARB LEFT TO BAR
+2959;N # DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+295A;N # LEFTWARDS HARPOON WITH BARB UP FROM BAR
+295B;N # RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+295C;N # UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+295D;N # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+295E;N # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+295F;N # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+2960;N # UPWARDS HARPOON WITH BARB LEFT FROM BAR
+2961;N # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+2962;N # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+2963;N # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2964;N # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2965;N # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+2966;N # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+2967;N # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2968;N # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+2969;N # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+296A;N # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296B;N # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296C;N # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296D;N # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296E;N # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+296F;N # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2970;N # RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+2971;N # EQUALS SIGN ABOVE RIGHTWARDS ARROW
+2972;N # TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2973;N # LEFTWARDS ARROW ABOVE TILDE OPERATOR
+2974;N # RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+2975;N # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+2976;N # LESS-THAN ABOVE LEFTWARDS ARROW
+2977;N # LEFTWARDS ARROW THROUGH LESS-THAN
+2978;N # GREATER-THAN ABOVE RIGHTWARDS ARROW
+2979;N # SUBSET ABOVE RIGHTWARDS ARROW
+297A;N # LEFTWARDS ARROW THROUGH SUBSET
+297B;N # SUPERSET ABOVE LEFTWARDS ARROW
+297C;N # LEFT FISH TAIL
+297D;N # RIGHT FISH TAIL
+297E;N # UP FISH TAIL
+297F;N # DOWN FISH TAIL
+2980;N # TRIPLE VERTICAL BAR DELIMITER
+2981;N # Z NOTATION SPOT
+2982;N # Z NOTATION TYPE COLON
+2983;N # LEFT WHITE CURLY BRACKET
+2984;N # RIGHT WHITE CURLY BRACKET
+2985;Na # LEFT WHITE PARENTHESIS
+2986;Na # RIGHT WHITE PARENTHESIS
+2987;N # Z NOTATION LEFT IMAGE BRACKET
+2988;N # Z NOTATION RIGHT IMAGE BRACKET
+2989;N # Z NOTATION LEFT BINDING BRACKET
+298A;N # Z NOTATION RIGHT BINDING BRACKET
+298B;N # LEFT SQUARE BRACKET WITH UNDERBAR
+298C;N # RIGHT SQUARE BRACKET WITH UNDERBAR
+298D;N # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E;N # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F;N # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990;N # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991;N # LEFT ANGLE BRACKET WITH DOT
+2992;N # RIGHT ANGLE BRACKET WITH DOT
+2993;N # LEFT ARC LESS-THAN BRACKET
+2994;N # RIGHT ARC GREATER-THAN BRACKET
+2995;N # DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996;N # DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997;N # LEFT BLACK TORTOISE SHELL BRACKET
+2998;N # RIGHT BLACK TORTOISE SHELL BRACKET
+2999;N # DOTTED FENCE
+299A;N # VERTICAL ZIGZAG LINE
+299B;N # MEASURED ANGLE OPENING LEFT
+299C;N # RIGHT ANGLE VARIANT WITH SQUARE
+299D;N # MEASURED RIGHT ANGLE WITH DOT
+299E;N # ANGLE WITH S INSIDE
+299F;N # ACUTE ANGLE
+29A0;N # SPHERICAL ANGLE OPENING LEFT
+29A1;N # SPHERICAL ANGLE OPENING UP
+29A2;N # TURNED ANGLE
+29A3;N # REVERSED ANGLE
+29A4;N # ANGLE WITH UNDERBAR
+29A5;N # REVERSED ANGLE WITH UNDERBAR
+29A6;N # OBLIQUE ANGLE OPENING UP
+29A7;N # OBLIQUE ANGLE OPENING DOWN
+29A8;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+29A9;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+29AA;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+29AB;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+29AC;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+29AD;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+29AE;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+29AF;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+29B0;N # REVERSED EMPTY SET
+29B1;N # EMPTY SET WITH OVERBAR
+29B2;N # EMPTY SET WITH SMALL CIRCLE ABOVE
+29B3;N # EMPTY SET WITH RIGHT ARROW ABOVE
+29B4;N # EMPTY SET WITH LEFT ARROW ABOVE
+29B5;N # CIRCLE WITH HORIZONTAL BAR
+29B6;N # CIRCLED VERTICAL BAR
+29B7;N # CIRCLED PARALLEL
+29B8;N # CIRCLED REVERSE SOLIDUS
+29B9;N # CIRCLED PERPENDICULAR
+29BA;N # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
+29BB;N # CIRCLE WITH SUPERIMPOSED X
+29BC;N # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+29BD;N # UP ARROW THROUGH CIRCLE
+29BE;N # CIRCLED WHITE BULLET
+29BF;N # CIRCLED BULLET
+29C0;N # CIRCLED LESS-THAN
+29C1;N # CIRCLED GREATER-THAN
+29C2;N # CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+29C3;N # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+29C4;N # SQUARED RISING DIAGONAL SLASH
+29C5;N # SQUARED FALLING DIAGONAL SLASH
+29C6;N # SQUARED ASTERISK
+29C7;N # SQUARED SMALL CIRCLE
+29C8;N # SQUARED SQUARE
+29C9;N # TWO JOINED SQUARES
+29CA;N # TRIANGLE WITH DOT ABOVE
+29CB;N # TRIANGLE WITH UNDERBAR
+29CC;N # S IN TRIANGLE
+29CD;N # TRIANGLE WITH SERIFS AT BOTTOM
+29CE;N # RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+29CF;N # LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0;N # VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1;N # BOWTIE WITH LEFT HALF BLACK
+29D2;N # BOWTIE WITH RIGHT HALF BLACK
+29D3;N # BLACK BOWTIE
+29D4;N # TIMES WITH LEFT HALF BLACK
+29D5;N # TIMES WITH RIGHT HALF BLACK
+29D6;N # WHITE HOURGLASS
+29D7;N # BLACK HOURGLASS
+29D8;N # LEFT WIGGLY FENCE
+29D9;N # RIGHT WIGGLY FENCE
+29DA;N # LEFT DOUBLE WIGGLY FENCE
+29DB;N # RIGHT DOUBLE WIGGLY FENCE
+29DC;N # INCOMPLETE INFINITY
+29DD;N # TIE OVER INFINITY
+29DE;N # INFINITY NEGATED WITH VERTICAL BAR
+29DF;N # DOUBLE-ENDED MULTIMAP
+29E0;N # SQUARE WITH CONTOURED OUTLINE
+29E1;N # INCREASES AS
+29E2;N # SHUFFLE PRODUCT
+29E3;N # EQUALS SIGN AND SLANTED PARALLEL
+29E4;N # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+29E5;N # IDENTICAL TO AND SLANTED PARALLEL
+29E6;N # GLEICH STARK
+29E7;N # THERMODYNAMIC
+29E8;N # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+29E9;N # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+29EA;N # BLACK DIAMOND WITH DOWN ARROW
+29EB;N # BLACK LOZENGE
+29EC;N # WHITE CIRCLE WITH DOWN ARROW
+29ED;N # BLACK CIRCLE WITH DOWN ARROW
+29EE;N # ERROR-BARRED WHITE SQUARE
+29EF;N # ERROR-BARRED BLACK SQUARE
+29F0;N # ERROR-BARRED WHITE DIAMOND
+29F1;N # ERROR-BARRED BLACK DIAMOND
+29F2;N # ERROR-BARRED WHITE CIRCLE
+29F3;N # ERROR-BARRED BLACK CIRCLE
+29F4;N # RULE-DELAYED
+29F5;N # REVERSE SOLIDUS OPERATOR
+29F6;N # SOLIDUS WITH OVERBAR
+29F7;N # REVERSE SOLIDUS WITH HORIZONTAL STROKE
+29F8;N # BIG SOLIDUS
+29F9;N # BIG REVERSE SOLIDUS
+29FA;N # DOUBLE PLUS
+29FB;N # TRIPLE PLUS
+29FC;N # LEFT-POINTING CURVED ANGLE BRACKET
+29FD;N # RIGHT-POINTING CURVED ANGLE BRACKET
+29FE;N # TINY
+29FF;N # MINY
+2A00;N # N-ARY CIRCLED DOT OPERATOR
+2A01;N # N-ARY CIRCLED PLUS OPERATOR
+2A02;N # N-ARY CIRCLED TIMES OPERATOR
+2A03;N # N-ARY UNION OPERATOR WITH DOT
+2A04;N # N-ARY UNION OPERATOR WITH PLUS
+2A05;N # N-ARY SQUARE INTERSECTION OPERATOR
+2A06;N # N-ARY SQUARE UNION OPERATOR
+2A07;N # TWO LOGICAL AND OPERATOR
+2A08;N # TWO LOGICAL OR OPERATOR
+2A09;N # N-ARY TIMES OPERATOR
+2A0A;N # MODULO TWO SUM
+2A0B;N # SUMMATION WITH INTEGRAL
+2A0C;N # QUADRUPLE INTEGRAL OPERATOR
+2A0D;N # FINITE PART INTEGRAL
+2A0E;N # INTEGRAL WITH DOUBLE STROKE
+2A0F;N # INTEGRAL AVERAGE WITH SLASH
+2A10;N # CIRCULATION FUNCTION
+2A11;N # ANTICLOCKWISE INTEGRATION
+2A12;N # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+2A13;N # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+2A14;N # LINE INTEGRATION NOT INCLUDING THE POLE
+2A15;N # INTEGRAL AROUND A POINT OPERATOR
+2A16;N # QUATERNION INTEGRAL OPERATOR
+2A17;N # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+2A18;N # INTEGRAL WITH TIMES SIGN
+2A19;N # INTEGRAL WITH INTERSECTION
+2A1A;N # INTEGRAL WITH UNION
+2A1B;N # INTEGRAL WITH OVERBAR
+2A1C;N # INTEGRAL WITH UNDERBAR
+2A1D;N # JOIN
+2A1E;N # LARGE LEFT TRIANGLE OPERATOR
+2A1F;N # Z NOTATION SCHEMA COMPOSITION
+2A20;N # Z NOTATION SCHEMA PIPING
+2A21;N # Z NOTATION SCHEMA PROJECTION
+2A22;N # PLUS SIGN WITH SMALL CIRCLE ABOVE
+2A23;N # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+2A24;N # PLUS SIGN WITH TILDE ABOVE
+2A25;N # PLUS SIGN WITH DOT BELOW
+2A26;N # PLUS SIGN WITH TILDE BELOW
+2A27;N # PLUS SIGN WITH SUBSCRIPT TWO
+2A28;N # PLUS SIGN WITH BLACK TRIANGLE
+2A29;N # MINUS SIGN WITH COMMA ABOVE
+2A2A;N # MINUS SIGN WITH DOT BELOW
+2A2B;N # MINUS SIGN WITH FALLING DOTS
+2A2C;N # MINUS SIGN WITH RISING DOTS
+2A2D;N # PLUS SIGN IN LEFT HALF CIRCLE
+2A2E;N # PLUS SIGN IN RIGHT HALF CIRCLE
+2A2F;N # VECTOR OR CROSS PRODUCT
+2A30;N # MULTIPLICATION SIGN WITH DOT ABOVE
+2A31;N # MULTIPLICATION SIGN WITH UNDERBAR
+2A32;N # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+2A33;N # SMASH PRODUCT
+2A34;N # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35;N # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A36;N # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+2A37;N # MULTIPLICATION SIGN IN DOUBLE CIRCLE
+2A38;N # CIRCLED DIVISION SIGN
+2A39;N # PLUS SIGN IN TRIANGLE
+2A3A;N # MINUS SIGN IN TRIANGLE
+2A3B;N # MULTIPLICATION SIGN IN TRIANGLE
+2A3C;N # INTERIOR PRODUCT
+2A3D;N # RIGHTHAND INTERIOR PRODUCT
+2A3E;N # Z NOTATION RELATIONAL COMPOSITION
+2A3F;N # AMALGAMATION OR COPRODUCT
+2A40;N # INTERSECTION WITH DOT
+2A41;N # UNION WITH MINUS SIGN
+2A42;N # UNION WITH OVERBAR
+2A43;N # INTERSECTION WITH OVERBAR
+2A44;N # INTERSECTION WITH LOGICAL AND
+2A45;N # UNION WITH LOGICAL OR
+2A46;N # UNION ABOVE INTERSECTION
+2A47;N # INTERSECTION ABOVE UNION
+2A48;N # UNION ABOVE BAR ABOVE INTERSECTION
+2A49;N # INTERSECTION ABOVE BAR ABOVE UNION
+2A4A;N # UNION BESIDE AND JOINED WITH UNION
+2A4B;N # INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+2A4C;N # CLOSED UNION WITH SERIFS
+2A4D;N # CLOSED INTERSECTION WITH SERIFS
+2A4E;N # DOUBLE SQUARE INTERSECTION
+2A4F;N # DOUBLE SQUARE UNION
+2A50;N # CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+2A51;N # LOGICAL AND WITH DOT ABOVE
+2A52;N # LOGICAL OR WITH DOT ABOVE
+2A53;N # DOUBLE LOGICAL AND
+2A54;N # DOUBLE LOGICAL OR
+2A55;N # TWO INTERSECTING LOGICAL AND
+2A56;N # TWO INTERSECTING LOGICAL OR
+2A57;N # SLOPING LARGE OR
+2A58;N # SLOPING LARGE AND
+2A59;N # LOGICAL OR OVERLAPPING LOGICAL AND
+2A5A;N # LOGICAL AND WITH MIDDLE STEM
+2A5B;N # LOGICAL OR WITH MIDDLE STEM
+2A5C;N # LOGICAL AND WITH HORIZONTAL DASH
+2A5D;N # LOGICAL OR WITH HORIZONTAL DASH
+2A5E;N # LOGICAL AND WITH DOUBLE OVERBAR
+2A5F;N # LOGICAL AND WITH UNDERBAR
+2A60;N # LOGICAL AND WITH DOUBLE UNDERBAR
+2A61;N # SMALL VEE WITH UNDERBAR
+2A62;N # LOGICAL OR WITH DOUBLE OVERBAR
+2A63;N # LOGICAL OR WITH DOUBLE UNDERBAR
+2A64;N # Z NOTATION DOMAIN ANTIRESTRICTION
+2A65;N # Z NOTATION RANGE ANTIRESTRICTION
+2A66;N # EQUALS SIGN WITH DOT BELOW
+2A67;N # IDENTICAL WITH DOT ABOVE
+2A68;N # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
+2A69;N # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
+2A6A;N # TILDE OPERATOR WITH DOT ABOVE
+2A6B;N # TILDE OPERATOR WITH RISING DOTS
+2A6C;N # SIMILAR MINUS SIMILAR
+2A6D;N # CONGRUENT WITH DOT ABOVE
+2A6E;N # EQUALS WITH ASTERISK
+2A6F;N # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+2A70;N # APPROXIMATELY EQUAL OR EQUAL TO
+2A71;N # EQUALS SIGN ABOVE PLUS SIGN
+2A72;N # PLUS SIGN ABOVE EQUALS SIGN
+2A73;N # EQUALS SIGN ABOVE TILDE OPERATOR
+2A74;N # DOUBLE COLON EQUAL
+2A75;N # TWO CONSECUTIVE EQUALS SIGNS
+2A76;N # THREE CONSECUTIVE EQUALS SIGNS
+2A77;N # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+2A78;N # EQUIVALENT WITH FOUR DOTS ABOVE
+2A79;N # LESS-THAN WITH CIRCLE INSIDE
+2A7A;N # GREATER-THAN WITH CIRCLE INSIDE
+2A7B;N # LESS-THAN WITH QUESTION MARK ABOVE
+2A7C;N # GREATER-THAN WITH QUESTION MARK ABOVE
+2A7D;N # LESS-THAN OR SLANTED EQUAL TO
+2A7E;N # GREATER-THAN OR SLANTED EQUAL TO
+2A7F;N # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80;N # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81;N # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82;N # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83;N # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84;N # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A85;N # LESS-THAN OR APPROXIMATE
+2A86;N # GREATER-THAN OR APPROXIMATE
+2A87;N # LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+2A88;N # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+2A89;N # LESS-THAN AND NOT APPROXIMATE
+2A8A;N # GREATER-THAN AND NOT APPROXIMATE
+2A8B;N # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C;N # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A8D;N # LESS-THAN ABOVE SIMILAR OR EQUAL
+2A8E;N # GREATER-THAN ABOVE SIMILAR OR EQUAL
+2A8F;N # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+2A90;N # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+2A91;N # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92;N # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93;N # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94;N # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95;N # SLANTED EQUAL TO OR LESS-THAN
+2A96;N # SLANTED EQUAL TO OR GREATER-THAN
+2A97;N # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98;N # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99;N # DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A;N # DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B;N # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C;N # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2A9D;N # SIMILAR OR LESS-THAN
+2A9E;N # SIMILAR OR GREATER-THAN
+2A9F;N # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+2AA0;N # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+2AA1;N # DOUBLE NESTED LESS-THAN
+2AA2;N # DOUBLE NESTED GREATER-THAN
+2AA3;N # DOUBLE NESTED LESS-THAN WITH UNDERBAR
+2AA4;N # GREATER-THAN OVERLAPPING LESS-THAN
+2AA5;N # GREATER-THAN BESIDE LESS-THAN
+2AA6;N # LESS-THAN CLOSED BY CURVE
+2AA7;N # GREATER-THAN CLOSED BY CURVE
+2AA8;N # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9;N # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA;N # SMALLER THAN
+2AAB;N # LARGER THAN
+2AAC;N # SMALLER THAN OR EQUAL TO
+2AAD;N # LARGER THAN OR EQUAL TO
+2AAE;N # EQUALS SIGN WITH BUMPY ABOVE
+2AAF;N # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0;N # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB1;N # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+2AB2;N # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+2AB3;N # PRECEDES ABOVE EQUALS SIGN
+2AB4;N # SUCCEEDS ABOVE EQUALS SIGN
+2AB5;N # PRECEDES ABOVE NOT EQUAL TO
+2AB6;N # SUCCEEDS ABOVE NOT EQUAL TO
+2AB7;N # PRECEDES ABOVE ALMOST EQUAL TO
+2AB8;N # SUCCEEDS ABOVE ALMOST EQUAL TO
+2AB9;N # PRECEDES ABOVE NOT ALMOST EQUAL TO
+2ABA;N # SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+2ABB;N # DOUBLE PRECEDES
+2ABC;N # DOUBLE SUCCEEDS
+2ABD;N # SUBSET WITH DOT
+2ABE;N # SUPERSET WITH DOT
+2ABF;N # SUBSET WITH PLUS SIGN BELOW
+2AC0;N # SUPERSET WITH PLUS SIGN BELOW
+2AC1;N # SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2;N # SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3;N # SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4;N # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5;N # SUBSET OF ABOVE EQUALS SIGN
+2AC6;N # SUPERSET OF ABOVE EQUALS SIGN
+2AC7;N # SUBSET OF ABOVE TILDE OPERATOR
+2AC8;N # SUPERSET OF ABOVE TILDE OPERATOR
+2AC9;N # SUBSET OF ABOVE ALMOST EQUAL TO
+2ACA;N # SUPERSET OF ABOVE ALMOST EQUAL TO
+2ACB;N # SUBSET OF ABOVE NOT EQUAL TO
+2ACC;N # SUPERSET OF ABOVE NOT EQUAL TO
+2ACD;N # SQUARE LEFT OPEN BOX OPERATOR
+2ACE;N # SQUARE RIGHT OPEN BOX OPERATOR
+2ACF;N # CLOSED SUBSET
+2AD0;N # CLOSED SUPERSET
+2AD1;N # CLOSED SUBSET OR EQUAL TO
+2AD2;N # CLOSED SUPERSET OR EQUAL TO
+2AD3;N # SUBSET ABOVE SUPERSET
+2AD4;N # SUPERSET ABOVE SUBSET
+2AD5;N # SUBSET ABOVE SUBSET
+2AD6;N # SUPERSET ABOVE SUPERSET
+2AD7;N # SUPERSET BESIDE SUBSET
+2AD8;N # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+2AD9;N # ELEMENT OF OPENING DOWNWARDS
+2ADA;N # PITCHFORK WITH TEE TOP
+2ADB;N # TRANSVERSAL INTERSECTION
+2ADC;N # FORKING
+2ADD;N # NONFORKING
+2ADE;N # SHORT LEFT TACK
+2ADF;N # SHORT DOWN TACK
+2AE0;N # SHORT UP TACK
+2AE1;N # PERPENDICULAR WITH S
+2AE2;N # VERTICAL BAR TRIPLE RIGHT TURNSTILE
+2AE3;N # DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4;N # VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5;N # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE6;N # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+2AE7;N # SHORT DOWN TACK WITH OVERBAR
+2AE8;N # SHORT UP TACK WITH UNDERBAR
+2AE9;N # SHORT UP TACK ABOVE SHORT DOWN TACK
+2AEA;N # DOUBLE DOWN TACK
+2AEB;N # DOUBLE UP TACK
+2AEC;N # DOUBLE STROKE NOT SIGN
+2AED;N # REVERSED DOUBLE STROKE NOT SIGN
+2AEE;N # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+2AEF;N # VERTICAL LINE WITH CIRCLE ABOVE
+2AF0;N # VERTICAL LINE WITH CIRCLE BELOW
+2AF1;N # DOWN TACK WITH CIRCLE BELOW
+2AF2;N # PARALLEL WITH HORIZONTAL STROKE
+2AF3;N # PARALLEL WITH TILDE OPERATOR
+2AF4;N # TRIPLE VERTICAL BAR BINARY RELATION
+2AF5;N # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
+2AF6;N # TRIPLE COLON OPERATOR
+2AF7;N # TRIPLE NESTED LESS-THAN
+2AF8;N # TRIPLE NESTED GREATER-THAN
+2AF9;N # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA;N # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+2AFB;N # TRIPLE SOLIDUS BINARY RELATION
+2AFC;N # LARGE TRIPLE VERTICAL BAR OPERATOR
+2AFD;N # DOUBLE SOLIDUS OPERATOR
+2AFE;N # WHITE VERTICAL BAR
+2AFF;N # N-ARY WHITE VERTICAL BAR
+2B00;N # NORTH EAST WHITE ARROW
+2B01;N # NORTH WEST WHITE ARROW
+2B02;N # SOUTH EAST WHITE ARROW
+2B03;N # SOUTH WEST WHITE ARROW
+2B04;N # LEFT RIGHT WHITE ARROW
+2B05;N # LEFTWARDS BLACK ARROW
+2B06;N # UPWARDS BLACK ARROW
+2B07;N # DOWNWARDS BLACK ARROW
+2B08;N # NORTH EAST BLACK ARROW
+2B09;N # NORTH WEST BLACK ARROW
+2B0A;N # SOUTH EAST BLACK ARROW
+2B0B;N # SOUTH WEST BLACK ARROW
+2B0C;N # LEFT RIGHT BLACK ARROW
+2B0D;N # UP DOWN BLACK ARROW
+2B0E;N # RIGHTWARDS ARROW WITH TIP DOWNWARDS
+2B0F;N # RIGHTWARDS ARROW WITH TIP UPWARDS
+2B10;N # LEFTWARDS ARROW WITH TIP DOWNWARDS
+2B11;N # LEFTWARDS ARROW WITH TIP UPWARDS
+2B12;N # SQUARE WITH TOP HALF BLACK
+2B13;N # SQUARE WITH BOTTOM HALF BLACK
+2B14;N # SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK
+2B15;N # SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK
+2B16;N # DIAMOND WITH LEFT HALF BLACK
+2B17;N # DIAMOND WITH RIGHT HALF BLACK
+2B18;N # DIAMOND WITH TOP HALF BLACK
+2B19;N # DIAMOND WITH BOTTOM HALF BLACK
+2B1A;N # DOTTED SQUARE
+2B1B;N # BLACK LARGE SQUARE
+2B1C;N # WHITE LARGE SQUARE
+2B1D;N # BLACK VERY SMALL SQUARE
+2B1E;N # WHITE VERY SMALL SQUARE
+2B1F;N # BLACK PENTAGON
+2B20;N # WHITE PENTAGON
+2B21;N # WHITE HEXAGON
+2B22;N # BLACK HEXAGON
+2B23;N # HORIZONTAL BLACK HEXAGON
+2B24;N # BLACK LARGE CIRCLE
+2B25;N # BLACK MEDIUM DIAMOND
+2B26;N # WHITE MEDIUM DIAMOND
+2B27;N # BLACK MEDIUM LOZENGE
+2B28;N # WHITE MEDIUM LOZENGE
+2B29;N # BLACK SMALL DIAMOND
+2B2A;N # BLACK SMALL LOZENGE
+2B2B;N # WHITE SMALL LOZENGE
+2B2C;N # BLACK HORIZONTAL ELLIPSE
+2B2D;N # WHITE HORIZONTAL ELLIPSE
+2B2E;N # BLACK VERTICAL ELLIPSE
+2B2F;N # WHITE VERTICAL ELLIPSE
+2B30;N # LEFT ARROW WITH SMALL CIRCLE
+2B31;N # THREE LEFTWARDS ARROWS
+2B32;N # LEFT ARROW WITH CIRCLED PLUS
+2B33;N # LONG LEFTWARDS SQUIGGLE ARROW
+2B34;N # LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2B35;N # LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2B36;N # LEFTWARDS TWO-HEADED ARROW FROM BAR
+2B37;N # LEFTWARDS TWO-HEADED TRIPLE DASH ARROW
+2B38;N # LEFTWARDS ARROW WITH DOTTED STEM
+2B39;N # LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2B3A;N # LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2B3B;N # LEFTWARDS TWO-HEADED ARROW WITH TAIL
+2B3C;N # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2B3D;N # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2B3E;N # LEFTWARDS ARROW THROUGH X
+2B3F;N # WAVE ARROW POINTING DIRECTLY LEFT
+2B40;N # EQUALS SIGN ABOVE LEFTWARDS ARROW
+2B41;N # REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW
+2B42;N # LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
+2B43;N # RIGHTWARDS ARROW THROUGH GREATER-THAN
+2B44;N # RIGHTWARDS ARROW THROUGH SUPERSET
+2B45;N # LEFTWARDS QUADRUPLE ARROW
+2B46;N # RIGHTWARDS QUADRUPLE ARROW
+2B47;N # REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2B48;N # RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
+2B49;N # TILDE OPERATOR ABOVE LEFTWARDS ARROW
+2B4A;N # LEFTWARDS ARROW ABOVE ALMOST EQUAL TO
+2B4B;N # LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B4C;N # RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B50;N # WHITE MEDIUM STAR
+2B51;N # BLACK SMALL STAR
+2B52;N # WHITE SMALL STAR
+2B53;N # BLACK RIGHT-POINTING PENTAGON
+2B54;N # WHITE RIGHT-POINTING PENTAGON
+2C00;N # GLAGOLITIC CAPITAL LETTER AZU
+2C01;N # GLAGOLITIC CAPITAL LETTER BUKY
+2C02;N # GLAGOLITIC CAPITAL LETTER VEDE
+2C03;N # GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C04;N # GLAGOLITIC CAPITAL LETTER DOBRO
+2C05;N # GLAGOLITIC CAPITAL LETTER YESTU
+2C06;N # GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C07;N # GLAGOLITIC CAPITAL LETTER DZELO
+2C08;N # GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C09;N # GLAGOLITIC CAPITAL LETTER IZHE
+2C0A;N # GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C0B;N # GLAGOLITIC CAPITAL LETTER I
+2C0C;N # GLAGOLITIC CAPITAL LETTER DJERVI
+2C0D;N # GLAGOLITIC CAPITAL LETTER KAKO
+2C0E;N # GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C0F;N # GLAGOLITIC CAPITAL LETTER MYSLITE
+2C10;N # GLAGOLITIC CAPITAL LETTER NASHI
+2C11;N # GLAGOLITIC CAPITAL LETTER ONU
+2C12;N # GLAGOLITIC CAPITAL LETTER POKOJI
+2C13;N # GLAGOLITIC CAPITAL LETTER RITSI
+2C14;N # GLAGOLITIC CAPITAL LETTER SLOVO
+2C15;N # GLAGOLITIC CAPITAL LETTER TVRIDO
+2C16;N # GLAGOLITIC CAPITAL LETTER UKU
+2C17;N # GLAGOLITIC CAPITAL LETTER FRITU
+2C18;N # GLAGOLITIC CAPITAL LETTER HERU
+2C19;N # GLAGOLITIC CAPITAL LETTER OTU
+2C1A;N # GLAGOLITIC CAPITAL LETTER PE
+2C1B;N # GLAGOLITIC CAPITAL LETTER SHTA
+2C1C;N # GLAGOLITIC CAPITAL LETTER TSI
+2C1D;N # GLAGOLITIC CAPITAL LETTER CHRIVI
+2C1E;N # GLAGOLITIC CAPITAL LETTER SHA
+2C1F;N # GLAGOLITIC CAPITAL LETTER YERU
+2C20;N # GLAGOLITIC CAPITAL LETTER YERI
+2C21;N # GLAGOLITIC CAPITAL LETTER YATI
+2C22;N # GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C23;N # GLAGOLITIC CAPITAL LETTER YU
+2C24;N # GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C25;N # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C26;N # GLAGOLITIC CAPITAL LETTER YO
+2C27;N # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C28;N # GLAGOLITIC CAPITAL LETTER BIG YUS
+2C29;N # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C2A;N # GLAGOLITIC CAPITAL LETTER FITA
+2C2B;N # GLAGOLITIC CAPITAL LETTER IZHITSA
+2C2C;N # GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C2D;N # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C2E;N # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30;N # GLAGOLITIC SMALL LETTER AZU
+2C31;N # GLAGOLITIC SMALL LETTER BUKY
+2C32;N # GLAGOLITIC SMALL LETTER VEDE
+2C33;N # GLAGOLITIC SMALL LETTER GLAGOLI
+2C34;N # GLAGOLITIC SMALL LETTER DOBRO
+2C35;N # GLAGOLITIC SMALL LETTER YESTU
+2C36;N # GLAGOLITIC SMALL LETTER ZHIVETE
+2C37;N # GLAGOLITIC SMALL LETTER DZELO
+2C38;N # GLAGOLITIC SMALL LETTER ZEMLJA
+2C39;N # GLAGOLITIC SMALL LETTER IZHE
+2C3A;N # GLAGOLITIC SMALL LETTER INITIAL IZHE
+2C3B;N # GLAGOLITIC SMALL LETTER I
+2C3C;N # GLAGOLITIC SMALL LETTER DJERVI
+2C3D;N # GLAGOLITIC SMALL LETTER KAKO
+2C3E;N # GLAGOLITIC SMALL LETTER LJUDIJE
+2C3F;N # GLAGOLITIC SMALL LETTER MYSLITE
+2C40;N # GLAGOLITIC SMALL LETTER NASHI
+2C41;N # GLAGOLITIC SMALL LETTER ONU
+2C42;N # GLAGOLITIC SMALL LETTER POKOJI
+2C43;N # GLAGOLITIC SMALL LETTER RITSI
+2C44;N # GLAGOLITIC SMALL LETTER SLOVO
+2C45;N # GLAGOLITIC SMALL LETTER TVRIDO
+2C46;N # GLAGOLITIC SMALL LETTER UKU
+2C47;N # GLAGOLITIC SMALL LETTER FRITU
+2C48;N # GLAGOLITIC SMALL LETTER HERU
+2C49;N # GLAGOLITIC SMALL LETTER OTU
+2C4A;N # GLAGOLITIC SMALL LETTER PE
+2C4B;N # GLAGOLITIC SMALL LETTER SHTA
+2C4C;N # GLAGOLITIC SMALL LETTER TSI
+2C4D;N # GLAGOLITIC SMALL LETTER CHRIVI
+2C4E;N # GLAGOLITIC SMALL LETTER SHA
+2C4F;N # GLAGOLITIC SMALL LETTER YERU
+2C50;N # GLAGOLITIC SMALL LETTER YERI
+2C51;N # GLAGOLITIC SMALL LETTER YATI
+2C52;N # GLAGOLITIC SMALL LETTER SPIDERY HA
+2C53;N # GLAGOLITIC SMALL LETTER YU
+2C54;N # GLAGOLITIC SMALL LETTER SMALL YUS
+2C55;N # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+2C56;N # GLAGOLITIC SMALL LETTER YO
+2C57;N # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+2C58;N # GLAGOLITIC SMALL LETTER BIG YUS
+2C59;N # GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+2C5A;N # GLAGOLITIC SMALL LETTER FITA
+2C5B;N # GLAGOLITIC SMALL LETTER IZHITSA
+2C5C;N # GLAGOLITIC SMALL LETTER SHTAPIC
+2C5D;N # GLAGOLITIC SMALL LETTER TROKUTASTI A
+2C5E;N # GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C60;N # LATIN CAPITAL LETTER L WITH DOUBLE BAR
+2C61;N # LATIN SMALL LETTER L WITH DOUBLE BAR
+2C62;N # LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+2C63;N # LATIN CAPITAL LETTER P WITH STROKE
+2C64;N # LATIN CAPITAL LETTER R WITH TAIL
+2C65;N # LATIN SMALL LETTER A WITH STROKE
+2C66;N # LATIN SMALL LETTER T WITH DIAGONAL STROKE
+2C67;N # LATIN CAPITAL LETTER H WITH DESCENDER
+2C68;N # LATIN SMALL LETTER H WITH DESCENDER
+2C69;N # LATIN CAPITAL LETTER K WITH DESCENDER
+2C6A;N # LATIN SMALL LETTER K WITH DESCENDER
+2C6B;N # LATIN CAPITAL LETTER Z WITH DESCENDER
+2C6C;N # LATIN SMALL LETTER Z WITH DESCENDER
+2C6D;N # LATIN CAPITAL LETTER ALPHA
+2C6E;N # LATIN CAPITAL LETTER M WITH HOOK
+2C6F;N # LATIN CAPITAL LETTER TURNED A
+2C71;N # LATIN SMALL LETTER V WITH RIGHT HOOK
+2C72;N # LATIN CAPITAL LETTER W WITH HOOK
+2C73;N # LATIN SMALL LETTER W WITH HOOK
+2C74;N # LATIN SMALL LETTER V WITH CURL
+2C75;N # LATIN CAPITAL LETTER HALF H
+2C76;N # LATIN SMALL LETTER HALF H
+2C77;N # LATIN SMALL LETTER TAILLESS PHI
+2C78;N # LATIN SMALL LETTER E WITH NOTCH
+2C79;N # LATIN SMALL LETTER TURNED R WITH TAIL
+2C7A;N # LATIN SMALL LETTER O WITH LOW RING INSIDE
+2C7B;N # LATIN LETTER SMALL CAPITAL TURNED E
+2C7C;N # LATIN SUBSCRIPT SMALL LETTER J
+2C7D;N # MODIFIER LETTER CAPITAL V
+2C80;N # COPTIC CAPITAL LETTER ALFA
+2C81;N # COPTIC SMALL LETTER ALFA
+2C82;N # COPTIC CAPITAL LETTER VIDA
+2C83;N # COPTIC SMALL LETTER VIDA
+2C84;N # COPTIC CAPITAL LETTER GAMMA
+2C85;N # COPTIC SMALL LETTER GAMMA
+2C86;N # COPTIC CAPITAL LETTER DALDA
+2C87;N # COPTIC SMALL LETTER DALDA
+2C88;N # COPTIC CAPITAL LETTER EIE
+2C89;N # COPTIC SMALL LETTER EIE
+2C8A;N # COPTIC CAPITAL LETTER SOU
+2C8B;N # COPTIC SMALL LETTER SOU
+2C8C;N # COPTIC CAPITAL LETTER ZATA
+2C8D;N # COPTIC SMALL LETTER ZATA
+2C8E;N # COPTIC CAPITAL LETTER HATE
+2C8F;N # COPTIC SMALL LETTER HATE
+2C90;N # COPTIC CAPITAL LETTER THETHE
+2C91;N # COPTIC SMALL LETTER THETHE
+2C92;N # COPTIC CAPITAL LETTER IAUDA
+2C93;N # COPTIC SMALL LETTER IAUDA
+2C94;N # COPTIC CAPITAL LETTER KAPA
+2C95;N # COPTIC SMALL LETTER KAPA
+2C96;N # COPTIC CAPITAL LETTER LAULA
+2C97;N # COPTIC SMALL LETTER LAULA
+2C98;N # COPTIC CAPITAL LETTER MI
+2C99;N # COPTIC SMALL LETTER MI
+2C9A;N # COPTIC CAPITAL LETTER NI
+2C9B;N # COPTIC SMALL LETTER NI
+2C9C;N # COPTIC CAPITAL LETTER KSI
+2C9D;N # COPTIC SMALL LETTER KSI
+2C9E;N # COPTIC CAPITAL LETTER O
+2C9F;N # COPTIC SMALL LETTER O
+2CA0;N # COPTIC CAPITAL LETTER PI
+2CA1;N # COPTIC SMALL LETTER PI
+2CA2;N # COPTIC CAPITAL LETTER RO
+2CA3;N # COPTIC SMALL LETTER RO
+2CA4;N # COPTIC CAPITAL LETTER SIMA
+2CA5;N # COPTIC SMALL LETTER SIMA
+2CA6;N # COPTIC CAPITAL LETTER TAU
+2CA7;N # COPTIC SMALL LETTER TAU
+2CA8;N # COPTIC CAPITAL LETTER UA
+2CA9;N # COPTIC SMALL LETTER UA
+2CAA;N # COPTIC CAPITAL LETTER FI
+2CAB;N # COPTIC SMALL LETTER FI
+2CAC;N # COPTIC CAPITAL LETTER KHI
+2CAD;N # COPTIC SMALL LETTER KHI
+2CAE;N # COPTIC CAPITAL LETTER PSI
+2CAF;N # COPTIC SMALL LETTER PSI
+2CB0;N # COPTIC CAPITAL LETTER OOU
+2CB1;N # COPTIC SMALL LETTER OOU
+2CB2;N # COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB3;N # COPTIC SMALL LETTER DIALECT-P ALEF
+2CB4;N # COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB5;N # COPTIC SMALL LETTER OLD COPTIC AIN
+2CB6;N # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB7;N # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB8;N # COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CB9;N # COPTIC SMALL LETTER DIALECT-P KAPA
+2CBA;N # COPTIC CAPITAL LETTER DIALECT-P NI
+2CBB;N # COPTIC SMALL LETTER DIALECT-P NI
+2CBC;N # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBD;N # COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBE;N # COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CBF;N # COPTIC SMALL LETTER OLD COPTIC OOU
+2CC0;N # COPTIC CAPITAL LETTER SAMPI
+2CC1;N # COPTIC SMALL LETTER SAMPI
+2CC2;N # COPTIC CAPITAL LETTER CROSSED SHEI
+2CC3;N # COPTIC SMALL LETTER CROSSED SHEI
+2CC4;N # COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC5;N # COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC6;N # COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC7;N # COPTIC SMALL LETTER OLD COPTIC ESH
+2CC8;N # COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CC9;N # COPTIC SMALL LETTER AKHMIMIC KHEI
+2CCA;N # COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCB;N # COPTIC SMALL LETTER DIALECT-P HORI
+2CCC;N # COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCD;N # COPTIC SMALL LETTER OLD COPTIC HORI
+2CCE;N # COPTIC CAPITAL LETTER OLD COPTIC HA
+2CCF;N # COPTIC SMALL LETTER OLD COPTIC HA
+2CD0;N # COPTIC CAPITAL LETTER L-SHAPED HA
+2CD1;N # COPTIC SMALL LETTER L-SHAPED HA
+2CD2;N # COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD3;N # COPTIC SMALL LETTER OLD COPTIC HEI
+2CD4;N # COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD5;N # COPTIC SMALL LETTER OLD COPTIC HAT
+2CD6;N # COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD7;N # COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD8;N # COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CD9;N # COPTIC SMALL LETTER OLD COPTIC DJA
+2CDA;N # COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDB;N # COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDC;N # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDD;N # COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDE;N # COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CDF;N # COPTIC SMALL LETTER OLD NUBIAN NGI
+2CE0;N # COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE1;N # COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE2;N # COPTIC CAPITAL LETTER OLD NUBIAN WAU
+2CE3;N # COPTIC SMALL LETTER OLD NUBIAN WAU
+2CE4;N # COPTIC SYMBOL KAI
+2CE5;N # COPTIC SYMBOL MI RO
+2CE6;N # COPTIC SYMBOL PI RO
+2CE7;N # COPTIC SYMBOL STAUROS
+2CE8;N # COPTIC SYMBOL TAU RO
+2CE9;N # COPTIC SYMBOL KHI RO
+2CEA;N # COPTIC SYMBOL SHIMA SIMA
+2CF9;N # COPTIC OLD NUBIAN FULL STOP
+2CFA;N # COPTIC OLD NUBIAN DIRECT QUESTION MARK
+2CFB;N # COPTIC OLD NUBIAN INDIRECT QUESTION MARK
+2CFC;N # COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD;N # COPTIC FRACTION ONE HALF
+2CFE;N # COPTIC FULL STOP
+2CFF;N # COPTIC MORPHOLOGICAL DIVIDER
+2D00;N # GEORGIAN SMALL LETTER AN
+2D01;N # GEORGIAN SMALL LETTER BAN
+2D02;N # GEORGIAN SMALL LETTER GAN
+2D03;N # GEORGIAN SMALL LETTER DON
+2D04;N # GEORGIAN SMALL LETTER EN
+2D05;N # GEORGIAN SMALL LETTER VIN
+2D06;N # GEORGIAN SMALL LETTER ZEN
+2D07;N # GEORGIAN SMALL LETTER TAN
+2D08;N # GEORGIAN SMALL LETTER IN
+2D09;N # GEORGIAN SMALL LETTER KAN
+2D0A;N # GEORGIAN SMALL LETTER LAS
+2D0B;N # GEORGIAN SMALL LETTER MAN
+2D0C;N # GEORGIAN SMALL LETTER NAR
+2D0D;N # GEORGIAN SMALL LETTER ON
+2D0E;N # GEORGIAN SMALL LETTER PAR
+2D0F;N # GEORGIAN SMALL LETTER ZHAR
+2D10;N # GEORGIAN SMALL LETTER RAE
+2D11;N # GEORGIAN SMALL LETTER SAN
+2D12;N # GEORGIAN SMALL LETTER TAR
+2D13;N # GEORGIAN SMALL LETTER UN
+2D14;N # GEORGIAN SMALL LETTER PHAR
+2D15;N # GEORGIAN SMALL LETTER KHAR
+2D16;N # GEORGIAN SMALL LETTER GHAN
+2D17;N # GEORGIAN SMALL LETTER QAR
+2D18;N # GEORGIAN SMALL LETTER SHIN
+2D19;N # GEORGIAN SMALL LETTER CHIN
+2D1A;N # GEORGIAN SMALL LETTER CAN
+2D1B;N # GEORGIAN SMALL LETTER JIL
+2D1C;N # GEORGIAN SMALL LETTER CIL
+2D1D;N # GEORGIAN SMALL LETTER CHAR
+2D1E;N # GEORGIAN SMALL LETTER XAN
+2D1F;N # GEORGIAN SMALL LETTER JHAN
+2D20;N # GEORGIAN SMALL LETTER HAE
+2D21;N # GEORGIAN SMALL LETTER HE
+2D22;N # GEORGIAN SMALL LETTER HIE
+2D23;N # GEORGIAN SMALL LETTER WE
+2D24;N # GEORGIAN SMALL LETTER HAR
+2D25;N # GEORGIAN SMALL LETTER HOE
+2D30;N # TIFINAGH LETTER YA
+2D31;N # TIFINAGH LETTER YAB
+2D32;N # TIFINAGH LETTER YABH
+2D33;N # TIFINAGH LETTER YAG
+2D34;N # TIFINAGH LETTER YAGHH
+2D35;N # TIFINAGH LETTER BERBER ACADEMY YAJ
+2D36;N # TIFINAGH LETTER YAJ
+2D37;N # TIFINAGH LETTER YAD
+2D38;N # TIFINAGH LETTER YADH
+2D39;N # TIFINAGH LETTER YADD
+2D3A;N # TIFINAGH LETTER YADDH
+2D3B;N # TIFINAGH LETTER YEY
+2D3C;N # TIFINAGH LETTER YAF
+2D3D;N # TIFINAGH LETTER YAK
+2D3E;N # TIFINAGH LETTER TUAREG YAK
+2D3F;N # TIFINAGH LETTER YAKHH
+2D40;N # TIFINAGH LETTER YAH
+2D41;N # TIFINAGH LETTER BERBER ACADEMY YAH
+2D42;N # TIFINAGH LETTER TUAREG YAH
+2D43;N # TIFINAGH LETTER YAHH
+2D44;N # TIFINAGH LETTER YAA
+2D45;N # TIFINAGH LETTER YAKH
+2D46;N # TIFINAGH LETTER TUAREG YAKH
+2D47;N # TIFINAGH LETTER YAQ
+2D48;N # TIFINAGH LETTER TUAREG YAQ
+2D49;N # TIFINAGH LETTER YI
+2D4A;N # TIFINAGH LETTER YAZH
+2D4B;N # TIFINAGH LETTER AHAGGAR YAZH
+2D4C;N # TIFINAGH LETTER TUAREG YAZH
+2D4D;N # TIFINAGH LETTER YAL
+2D4E;N # TIFINAGH LETTER YAM
+2D4F;N # TIFINAGH LETTER YAN
+2D50;N # TIFINAGH LETTER TUAREG YAGN
+2D51;N # TIFINAGH LETTER TUAREG YANG
+2D52;N # TIFINAGH LETTER YAP
+2D53;N # TIFINAGH LETTER YU
+2D54;N # TIFINAGH LETTER YAR
+2D55;N # TIFINAGH LETTER YARR
+2D56;N # TIFINAGH LETTER YAGH
+2D57;N # TIFINAGH LETTER TUAREG YAGH
+2D58;N # TIFINAGH LETTER AYER YAGH
+2D59;N # TIFINAGH LETTER YAS
+2D5A;N # TIFINAGH LETTER YASS
+2D5B;N # TIFINAGH LETTER YASH
+2D5C;N # TIFINAGH LETTER YAT
+2D5D;N # TIFINAGH LETTER YATH
+2D5E;N # TIFINAGH LETTER YACH
+2D5F;N # TIFINAGH LETTER YATT
+2D60;N # TIFINAGH LETTER YAV
+2D61;N # TIFINAGH LETTER YAW
+2D62;N # TIFINAGH LETTER YAY
+2D63;N # TIFINAGH LETTER YAZ
+2D64;N # TIFINAGH LETTER TAWELLEMET YAZ
+2D65;N # TIFINAGH LETTER YAZZ
+2D6F;N # TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D80;N # ETHIOPIC SYLLABLE LOA
+2D81;N # ETHIOPIC SYLLABLE MOA
+2D82;N # ETHIOPIC SYLLABLE ROA
+2D83;N # ETHIOPIC SYLLABLE SOA
+2D84;N # ETHIOPIC SYLLABLE SHOA
+2D85;N # ETHIOPIC SYLLABLE BOA
+2D86;N # ETHIOPIC SYLLABLE TOA
+2D87;N # ETHIOPIC SYLLABLE COA
+2D88;N # ETHIOPIC SYLLABLE NOA
+2D89;N # ETHIOPIC SYLLABLE NYOA
+2D8A;N # ETHIOPIC SYLLABLE GLOTTAL OA
+2D8B;N # ETHIOPIC SYLLABLE ZOA
+2D8C;N # ETHIOPIC SYLLABLE DOA
+2D8D;N # ETHIOPIC SYLLABLE DDOA
+2D8E;N # ETHIOPIC SYLLABLE JOA
+2D8F;N # ETHIOPIC SYLLABLE THOA
+2D90;N # ETHIOPIC SYLLABLE CHOA
+2D91;N # ETHIOPIC SYLLABLE PHOA
+2D92;N # ETHIOPIC SYLLABLE POA
+2D93;N # ETHIOPIC SYLLABLE GGWA
+2D94;N # ETHIOPIC SYLLABLE GGWI
+2D95;N # ETHIOPIC SYLLABLE GGWEE
+2D96;N # ETHIOPIC SYLLABLE GGWE
+2DA0;N # ETHIOPIC SYLLABLE SSA
+2DA1;N # ETHIOPIC SYLLABLE SSU
+2DA2;N # ETHIOPIC SYLLABLE SSI
+2DA3;N # ETHIOPIC SYLLABLE SSAA
+2DA4;N # ETHIOPIC SYLLABLE SSEE
+2DA5;N # ETHIOPIC SYLLABLE SSE
+2DA6;N # ETHIOPIC SYLLABLE SSO
+2DA8;N # ETHIOPIC SYLLABLE CCA
+2DA9;N # ETHIOPIC SYLLABLE CCU
+2DAA;N # ETHIOPIC SYLLABLE CCI
+2DAB;N # ETHIOPIC SYLLABLE CCAA
+2DAC;N # ETHIOPIC SYLLABLE CCEE
+2DAD;N # ETHIOPIC SYLLABLE CCE
+2DAE;N # ETHIOPIC SYLLABLE CCO
+2DB0;N # ETHIOPIC SYLLABLE ZZA
+2DB1;N # ETHIOPIC SYLLABLE ZZU
+2DB2;N # ETHIOPIC SYLLABLE ZZI
+2DB3;N # ETHIOPIC SYLLABLE ZZAA
+2DB4;N # ETHIOPIC SYLLABLE ZZEE
+2DB5;N # ETHIOPIC SYLLABLE ZZE
+2DB6;N # ETHIOPIC SYLLABLE ZZO
+2DB8;N # ETHIOPIC SYLLABLE CCHA
+2DB9;N # ETHIOPIC SYLLABLE CCHU
+2DBA;N # ETHIOPIC SYLLABLE CCHI
+2DBB;N # ETHIOPIC SYLLABLE CCHAA
+2DBC;N # ETHIOPIC SYLLABLE CCHEE
+2DBD;N # ETHIOPIC SYLLABLE CCHE
+2DBE;N # ETHIOPIC SYLLABLE CCHO
+2DC0;N # ETHIOPIC SYLLABLE QYA
+2DC1;N # ETHIOPIC SYLLABLE QYU
+2DC2;N # ETHIOPIC SYLLABLE QYI
+2DC3;N # ETHIOPIC SYLLABLE QYAA
+2DC4;N # ETHIOPIC SYLLABLE QYEE
+2DC5;N # ETHIOPIC SYLLABLE QYE
+2DC6;N # ETHIOPIC SYLLABLE QYO
+2DC8;N # ETHIOPIC SYLLABLE KYA
+2DC9;N # ETHIOPIC SYLLABLE KYU
+2DCA;N # ETHIOPIC SYLLABLE KYI
+2DCB;N # ETHIOPIC SYLLABLE KYAA
+2DCC;N # ETHIOPIC SYLLABLE KYEE
+2DCD;N # ETHIOPIC SYLLABLE KYE
+2DCE;N # ETHIOPIC SYLLABLE KYO
+2DD0;N # ETHIOPIC SYLLABLE XYA
+2DD1;N # ETHIOPIC SYLLABLE XYU
+2DD2;N # ETHIOPIC SYLLABLE XYI
+2DD3;N # ETHIOPIC SYLLABLE XYAA
+2DD4;N # ETHIOPIC SYLLABLE XYEE
+2DD5;N # ETHIOPIC SYLLABLE XYE
+2DD6;N # ETHIOPIC SYLLABLE XYO
+2DD8;N # ETHIOPIC SYLLABLE GYA
+2DD9;N # ETHIOPIC SYLLABLE GYU
+2DDA;N # ETHIOPIC SYLLABLE GYI
+2DDB;N # ETHIOPIC SYLLABLE GYAA
+2DDC;N # ETHIOPIC SYLLABLE GYEE
+2DDD;N # ETHIOPIC SYLLABLE GYE
+2DDE;N # ETHIOPIC SYLLABLE GYO
+2DE0;N # COMBINING CYRILLIC LETTER BE
+2DE1;N # COMBINING CYRILLIC LETTER VE
+2DE2;N # COMBINING CYRILLIC LETTER GHE
+2DE3;N # COMBINING CYRILLIC LETTER DE
+2DE4;N # COMBINING CYRILLIC LETTER ZHE
+2DE5;N # COMBINING CYRILLIC LETTER ZE
+2DE6;N # COMBINING CYRILLIC LETTER KA
+2DE7;N # COMBINING CYRILLIC LETTER EL
+2DE8;N # COMBINING CYRILLIC LETTER EM
+2DE9;N # COMBINING CYRILLIC LETTER EN
+2DEA;N # COMBINING CYRILLIC LETTER O
+2DEB;N # COMBINING CYRILLIC LETTER PE
+2DEC;N # COMBINING CYRILLIC LETTER ER
+2DED;N # COMBINING CYRILLIC LETTER ES
+2DEE;N # COMBINING CYRILLIC LETTER TE
+2DEF;N # COMBINING CYRILLIC LETTER HA
+2DF0;N # COMBINING CYRILLIC LETTER TSE
+2DF1;N # COMBINING CYRILLIC LETTER CHE
+2DF2;N # COMBINING CYRILLIC LETTER SHA
+2DF3;N # COMBINING CYRILLIC LETTER SHCHA
+2DF4;N # COMBINING CYRILLIC LETTER FITA
+2DF5;N # COMBINING CYRILLIC LETTER ES-TE
+2DF6;N # COMBINING CYRILLIC LETTER A
+2DF7;N # COMBINING CYRILLIC LETTER IE
+2DF8;N # COMBINING CYRILLIC LETTER DJERV
+2DF9;N # COMBINING CYRILLIC LETTER MONOGRAPH UK
+2DFA;N # COMBINING CYRILLIC LETTER YAT
+2DFB;N # COMBINING CYRILLIC LETTER YU
+2DFC;N # COMBINING CYRILLIC LETTER IOTIFIED A
+2DFD;N # COMBINING CYRILLIC LETTER LITTLE YUS
+2DFE;N # COMBINING CYRILLIC LETTER BIG YUS
+2DFF;N # COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+2E00;N # RIGHT ANGLE SUBSTITUTION MARKER
+2E01;N # RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02;N # LEFT SUBSTITUTION BRACKET
+2E03;N # RIGHT SUBSTITUTION BRACKET
+2E04;N # LEFT DOTTED SUBSTITUTION BRACKET
+2E05;N # RIGHT DOTTED SUBSTITUTION BRACKET
+2E06;N # RAISED INTERPOLATION MARKER
+2E07;N # RAISED DOTTED INTERPOLATION MARKER
+2E08;N # DOTTED TRANSPOSITION MARKER
+2E09;N # LEFT TRANSPOSITION BRACKET
+2E0A;N # RIGHT TRANSPOSITION BRACKET
+2E0B;N # RAISED SQUARE
+2E0C;N # LEFT RAISED OMISSION BRACKET
+2E0D;N # RIGHT RAISED OMISSION BRACKET
+2E0E;N # EDITORIAL CORONIS
+2E0F;N # PARAGRAPHOS
+2E10;N # FORKED PARAGRAPHOS
+2E11;N # REVERSED FORKED PARAGRAPHOS
+2E12;N # HYPODIASTOLE
+2E13;N # DOTTED OBELOS
+2E14;N # DOWNWARDS ANCORA
+2E15;N # UPWARDS ANCORA
+2E16;N # DOTTED RIGHT-POINTING ANGLE
+2E17;N # DOUBLE OBLIQUE HYPHEN
+2E18;N # INVERTED INTERROBANG
+2E19;N # PALM BRANCH
+2E1A;N # HYPHEN WITH DIAERESIS
+2E1B;N # TILDE WITH RING ABOVE
+2E1C;N # LEFT LOW PARAPHRASE BRACKET
+2E1D;N # RIGHT LOW PARAPHRASE BRACKET
+2E1E;N # TILDE WITH DOT ABOVE
+2E1F;N # TILDE WITH DOT BELOW
+2E20;N # LEFT VERTICAL BAR WITH QUILL
+2E21;N # RIGHT VERTICAL BAR WITH QUILL
+2E22;N # TOP LEFT HALF BRACKET
+2E23;N # TOP RIGHT HALF BRACKET
+2E24;N # BOTTOM LEFT HALF BRACKET
+2E25;N # BOTTOM RIGHT HALF BRACKET
+2E26;N # LEFT SIDEWAYS U BRACKET
+2E27;N # RIGHT SIDEWAYS U BRACKET
+2E28;N # LEFT DOUBLE PARENTHESIS
+2E29;N # RIGHT DOUBLE PARENTHESIS
+2E2A;N # TWO DOTS OVER ONE DOT PUNCTUATION
+2E2B;N # ONE DOT OVER TWO DOTS PUNCTUATION
+2E2C;N # SQUARED FOUR DOT PUNCTUATION
+2E2D;N # FIVE DOT MARK
+2E2E;N # REVERSED QUESTION MARK
+2E2F;N # VERTICAL TILDE
+2E30;N # RING POINT
+2E80;W # CJK RADICAL REPEAT
+2E81;W # CJK RADICAL CLIFF
+2E82;W # CJK RADICAL SECOND ONE
+2E83;W # CJK RADICAL SECOND TWO
+2E84;W # CJK RADICAL SECOND THREE
+2E85;W # CJK RADICAL PERSON
+2E86;W # CJK RADICAL BOX
+2E87;W # CJK RADICAL TABLE
+2E88;W # CJK RADICAL KNIFE ONE
+2E89;W # CJK RADICAL KNIFE TWO
+2E8A;W # CJK RADICAL DIVINATION
+2E8B;W # CJK RADICAL SEAL
+2E8C;W # CJK RADICAL SMALL ONE
+2E8D;W # CJK RADICAL SMALL TWO
+2E8E;W # CJK RADICAL LAME ONE
+2E8F;W # CJK RADICAL LAME TWO
+2E90;W # CJK RADICAL LAME THREE
+2E91;W # CJK RADICAL LAME FOUR
+2E92;W # CJK RADICAL SNAKE
+2E93;W # CJK RADICAL THREAD
+2E94;W # CJK RADICAL SNOUT ONE
+2E95;W # CJK RADICAL SNOUT TWO
+2E96;W # CJK RADICAL HEART ONE
+2E97;W # CJK RADICAL HEART TWO
+2E98;W # CJK RADICAL HAND
+2E99;W # CJK RADICAL RAP
+2E9B;W # CJK RADICAL CHOKE
+2E9C;W # CJK RADICAL SUN
+2E9D;W # CJK RADICAL MOON
+2E9E;W # CJK RADICAL DEATH
+2E9F;W # CJK RADICAL MOTHER
+2EA0;W # CJK RADICAL CIVILIAN
+2EA1;W # CJK RADICAL WATER ONE
+2EA2;W # CJK RADICAL WATER TWO
+2EA3;W # CJK RADICAL FIRE
+2EA4;W # CJK RADICAL PAW ONE
+2EA5;W # CJK RADICAL PAW TWO
+2EA6;W # CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+2EA7;W # CJK RADICAL COW
+2EA8;W # CJK RADICAL DOG
+2EA9;W # CJK RADICAL JADE
+2EAA;W # CJK RADICAL BOLT OF CLOTH
+2EAB;W # CJK RADICAL EYE
+2EAC;W # CJK RADICAL SPIRIT ONE
+2EAD;W # CJK RADICAL SPIRIT TWO
+2EAE;W # CJK RADICAL BAMBOO
+2EAF;W # CJK RADICAL SILK
+2EB0;W # CJK RADICAL C-SIMPLIFIED SILK
+2EB1;W # CJK RADICAL NET ONE
+2EB2;W # CJK RADICAL NET TWO
+2EB3;W # CJK RADICAL NET THREE
+2EB4;W # CJK RADICAL NET FOUR
+2EB5;W # CJK RADICAL MESH
+2EB6;W # CJK RADICAL SHEEP
+2EB7;W # CJK RADICAL RAM
+2EB8;W # CJK RADICAL EWE
+2EB9;W # CJK RADICAL OLD
+2EBA;W # CJK RADICAL BRUSH ONE
+2EBB;W # CJK RADICAL BRUSH TWO
+2EBC;W # CJK RADICAL MEAT
+2EBD;W # CJK RADICAL MORTAR
+2EBE;W # CJK RADICAL GRASS ONE
+2EBF;W # CJK RADICAL GRASS TWO
+2EC0;W # CJK RADICAL GRASS THREE
+2EC1;W # CJK RADICAL TIGER
+2EC2;W # CJK RADICAL CLOTHES
+2EC3;W # CJK RADICAL WEST ONE
+2EC4;W # CJK RADICAL WEST TWO
+2EC5;W # CJK RADICAL C-SIMPLIFIED SEE
+2EC6;W # CJK RADICAL SIMPLIFIED HORN
+2EC7;W # CJK RADICAL HORN
+2EC8;W # CJK RADICAL C-SIMPLIFIED SPEECH
+2EC9;W # CJK RADICAL C-SIMPLIFIED SHELL
+2ECA;W # CJK RADICAL FOOT
+2ECB;W # CJK RADICAL C-SIMPLIFIED CART
+2ECC;W # CJK RADICAL SIMPLIFIED WALK
+2ECD;W # CJK RADICAL WALK ONE
+2ECE;W # CJK RADICAL WALK TWO
+2ECF;W # CJK RADICAL CITY
+2ED0;W # CJK RADICAL C-SIMPLIFIED GOLD
+2ED1;W # CJK RADICAL LONG ONE
+2ED2;W # CJK RADICAL LONG TWO
+2ED3;W # CJK RADICAL C-SIMPLIFIED LONG
+2ED4;W # CJK RADICAL C-SIMPLIFIED GATE
+2ED5;W # CJK RADICAL MOUND ONE
+2ED6;W # CJK RADICAL MOUND TWO
+2ED7;W # CJK RADICAL RAIN
+2ED8;W # CJK RADICAL BLUE
+2ED9;W # CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+2EDA;W # CJK RADICAL C-SIMPLIFIED LEAF
+2EDB;W # CJK RADICAL C-SIMPLIFIED WIND
+2EDC;W # CJK RADICAL C-SIMPLIFIED FLY
+2EDD;W # CJK RADICAL EAT ONE
+2EDE;W # CJK RADICAL EAT TWO
+2EDF;W # CJK RADICAL EAT THREE
+2EE0;W # CJK RADICAL C-SIMPLIFIED EAT
+2EE1;W # CJK RADICAL HEAD
+2EE2;W # CJK RADICAL C-SIMPLIFIED HORSE
+2EE3;W # CJK RADICAL BONE
+2EE4;W # CJK RADICAL GHOST
+2EE5;W # CJK RADICAL C-SIMPLIFIED FISH
+2EE6;W # CJK RADICAL C-SIMPLIFIED BIRD
+2EE7;W # CJK RADICAL C-SIMPLIFIED SALT
+2EE8;W # CJK RADICAL SIMPLIFIED WHEAT
+2EE9;W # CJK RADICAL SIMPLIFIED YELLOW
+2EEA;W # CJK RADICAL C-SIMPLIFIED FROG
+2EEB;W # CJK RADICAL J-SIMPLIFIED EVEN
+2EEC;W # CJK RADICAL C-SIMPLIFIED EVEN
+2EED;W # CJK RADICAL J-SIMPLIFIED TOOTH
+2EEE;W # CJK RADICAL C-SIMPLIFIED TOOTH
+2EEF;W # CJK RADICAL J-SIMPLIFIED DRAGON
+2EF0;W # CJK RADICAL C-SIMPLIFIED DRAGON
+2EF1;W # CJK RADICAL TURTLE
+2EF2;W # CJK RADICAL J-SIMPLIFIED TURTLE
+2EF3;W # CJK RADICAL C-SIMPLIFIED TURTLE
+2F00;W # KANGXI RADICAL ONE
+2F01;W # KANGXI RADICAL LINE
+2F02;W # KANGXI RADICAL DOT
+2F03;W # KANGXI RADICAL SLASH
+2F04;W # KANGXI RADICAL SECOND
+2F05;W # KANGXI RADICAL HOOK
+2F06;W # KANGXI RADICAL TWO
+2F07;W # KANGXI RADICAL LID
+2F08;W # KANGXI RADICAL MAN
+2F09;W # KANGXI RADICAL LEGS
+2F0A;W # KANGXI RADICAL ENTER
+2F0B;W # KANGXI RADICAL EIGHT
+2F0C;W # KANGXI RADICAL DOWN BOX
+2F0D;W # KANGXI RADICAL COVER
+2F0E;W # KANGXI RADICAL ICE
+2F0F;W # KANGXI RADICAL TABLE
+2F10;W # KANGXI RADICAL OPEN BOX
+2F11;W # KANGXI RADICAL KNIFE
+2F12;W # KANGXI RADICAL POWER
+2F13;W # KANGXI RADICAL WRAP
+2F14;W # KANGXI RADICAL SPOON
+2F15;W # KANGXI RADICAL RIGHT OPEN BOX
+2F16;W # KANGXI RADICAL HIDING ENCLOSURE
+2F17;W # KANGXI RADICAL TEN
+2F18;W # KANGXI RADICAL DIVINATION
+2F19;W # KANGXI RADICAL SEAL
+2F1A;W # KANGXI RADICAL CLIFF
+2F1B;W # KANGXI RADICAL PRIVATE
+2F1C;W # KANGXI RADICAL AGAIN
+2F1D;W # KANGXI RADICAL MOUTH
+2F1E;W # KANGXI RADICAL ENCLOSURE
+2F1F;W # KANGXI RADICAL EARTH
+2F20;W # KANGXI RADICAL SCHOLAR
+2F21;W # KANGXI RADICAL GO
+2F22;W # KANGXI RADICAL GO SLOWLY
+2F23;W # KANGXI RADICAL EVENING
+2F24;W # KANGXI RADICAL BIG
+2F25;W # KANGXI RADICAL WOMAN
+2F26;W # KANGXI RADICAL CHILD
+2F27;W # KANGXI RADICAL ROOF
+2F28;W # KANGXI RADICAL INCH
+2F29;W # KANGXI RADICAL SMALL
+2F2A;W # KANGXI RADICAL LAME
+2F2B;W # KANGXI RADICAL CORPSE
+2F2C;W # KANGXI RADICAL SPROUT
+2F2D;W # KANGXI RADICAL MOUNTAIN
+2F2E;W # KANGXI RADICAL RIVER
+2F2F;W # KANGXI RADICAL WORK
+2F30;W # KANGXI RADICAL ONESELF
+2F31;W # KANGXI RADICAL TURBAN
+2F32;W # KANGXI RADICAL DRY
+2F33;W # KANGXI RADICAL SHORT THREAD
+2F34;W # KANGXI RADICAL DOTTED CLIFF
+2F35;W # KANGXI RADICAL LONG STRIDE
+2F36;W # KANGXI RADICAL TWO HANDS
+2F37;W # KANGXI RADICAL SHOOT
+2F38;W # KANGXI RADICAL BOW
+2F39;W # KANGXI RADICAL SNOUT
+2F3A;W # KANGXI RADICAL BRISTLE
+2F3B;W # KANGXI RADICAL STEP
+2F3C;W # KANGXI RADICAL HEART
+2F3D;W # KANGXI RADICAL HALBERD
+2F3E;W # KANGXI RADICAL DOOR
+2F3F;W # KANGXI RADICAL HAND
+2F40;W # KANGXI RADICAL BRANCH
+2F41;W # KANGXI RADICAL RAP
+2F42;W # KANGXI RADICAL SCRIPT
+2F43;W # KANGXI RADICAL DIPPER
+2F44;W # KANGXI RADICAL AXE
+2F45;W # KANGXI RADICAL SQUARE
+2F46;W # KANGXI RADICAL NOT
+2F47;W # KANGXI RADICAL SUN
+2F48;W # KANGXI RADICAL SAY
+2F49;W # KANGXI RADICAL MOON
+2F4A;W # KANGXI RADICAL TREE
+2F4B;W # KANGXI RADICAL LACK
+2F4C;W # KANGXI RADICAL STOP
+2F4D;W # KANGXI RADICAL DEATH
+2F4E;W # KANGXI RADICAL WEAPON
+2F4F;W # KANGXI RADICAL DO NOT
+2F50;W # KANGXI RADICAL COMPARE
+2F51;W # KANGXI RADICAL FUR
+2F52;W # KANGXI RADICAL CLAN
+2F53;W # KANGXI RADICAL STEAM
+2F54;W # KANGXI RADICAL WATER
+2F55;W # KANGXI RADICAL FIRE
+2F56;W # KANGXI RADICAL CLAW
+2F57;W # KANGXI RADICAL FATHER
+2F58;W # KANGXI RADICAL DOUBLE X
+2F59;W # KANGXI RADICAL HALF TREE TRUNK
+2F5A;W # KANGXI RADICAL SLICE
+2F5B;W # KANGXI RADICAL FANG
+2F5C;W # KANGXI RADICAL COW
+2F5D;W # KANGXI RADICAL DOG
+2F5E;W # KANGXI RADICAL PROFOUND
+2F5F;W # KANGXI RADICAL JADE
+2F60;W # KANGXI RADICAL MELON
+2F61;W # KANGXI RADICAL TILE
+2F62;W # KANGXI RADICAL SWEET
+2F63;W # KANGXI RADICAL LIFE
+2F64;W # KANGXI RADICAL USE
+2F65;W # KANGXI RADICAL FIELD
+2F66;W # KANGXI RADICAL BOLT OF CLOTH
+2F67;W # KANGXI RADICAL SICKNESS
+2F68;W # KANGXI RADICAL DOTTED TENT
+2F69;W # KANGXI RADICAL WHITE
+2F6A;W # KANGXI RADICAL SKIN
+2F6B;W # KANGXI RADICAL DISH
+2F6C;W # KANGXI RADICAL EYE
+2F6D;W # KANGXI RADICAL SPEAR
+2F6E;W # KANGXI RADICAL ARROW
+2F6F;W # KANGXI RADICAL STONE
+2F70;W # KANGXI RADICAL SPIRIT
+2F71;W # KANGXI RADICAL TRACK
+2F72;W # KANGXI RADICAL GRAIN
+2F73;W # KANGXI RADICAL CAVE
+2F74;W # KANGXI RADICAL STAND
+2F75;W # KANGXI RADICAL BAMBOO
+2F76;W # KANGXI RADICAL RICE
+2F77;W # KANGXI RADICAL SILK
+2F78;W # KANGXI RADICAL JAR
+2F79;W # KANGXI RADICAL NET
+2F7A;W # KANGXI RADICAL SHEEP
+2F7B;W # KANGXI RADICAL FEATHER
+2F7C;W # KANGXI RADICAL OLD
+2F7D;W # KANGXI RADICAL AND
+2F7E;W # KANGXI RADICAL PLOW
+2F7F;W # KANGXI RADICAL EAR
+2F80;W # KANGXI RADICAL BRUSH
+2F81;W # KANGXI RADICAL MEAT
+2F82;W # KANGXI RADICAL MINISTER
+2F83;W # KANGXI RADICAL SELF
+2F84;W # KANGXI RADICAL ARRIVE
+2F85;W # KANGXI RADICAL MORTAR
+2F86;W # KANGXI RADICAL TONGUE
+2F87;W # KANGXI RADICAL OPPOSE
+2F88;W # KANGXI RADICAL BOAT
+2F89;W # KANGXI RADICAL STOPPING
+2F8A;W # KANGXI RADICAL COLOR
+2F8B;W # KANGXI RADICAL GRASS
+2F8C;W # KANGXI RADICAL TIGER
+2F8D;W # KANGXI RADICAL INSECT
+2F8E;W # KANGXI RADICAL BLOOD
+2F8F;W # KANGXI RADICAL WALK ENCLOSURE
+2F90;W # KANGXI RADICAL CLOTHES
+2F91;W # KANGXI RADICAL WEST
+2F92;W # KANGXI RADICAL SEE
+2F93;W # KANGXI RADICAL HORN
+2F94;W # KANGXI RADICAL SPEECH
+2F95;W # KANGXI RADICAL VALLEY
+2F96;W # KANGXI RADICAL BEAN
+2F97;W # KANGXI RADICAL PIG
+2F98;W # KANGXI RADICAL BADGER
+2F99;W # KANGXI RADICAL SHELL
+2F9A;W # KANGXI RADICAL RED
+2F9B;W # KANGXI RADICAL RUN
+2F9C;W # KANGXI RADICAL FOOT
+2F9D;W # KANGXI RADICAL BODY
+2F9E;W # KANGXI RADICAL CART
+2F9F;W # KANGXI RADICAL BITTER
+2FA0;W # KANGXI RADICAL MORNING
+2FA1;W # KANGXI RADICAL WALK
+2FA2;W # KANGXI RADICAL CITY
+2FA3;W # KANGXI RADICAL WINE
+2FA4;W # KANGXI RADICAL DISTINGUISH
+2FA5;W # KANGXI RADICAL VILLAGE
+2FA6;W # KANGXI RADICAL GOLD
+2FA7;W # KANGXI RADICAL LONG
+2FA8;W # KANGXI RADICAL GATE
+2FA9;W # KANGXI RADICAL MOUND
+2FAA;W # KANGXI RADICAL SLAVE
+2FAB;W # KANGXI RADICAL SHORT TAILED BIRD
+2FAC;W # KANGXI RADICAL RAIN
+2FAD;W # KANGXI RADICAL BLUE
+2FAE;W # KANGXI RADICAL WRONG
+2FAF;W # KANGXI RADICAL FACE
+2FB0;W # KANGXI RADICAL LEATHER
+2FB1;W # KANGXI RADICAL TANNED LEATHER
+2FB2;W # KANGXI RADICAL LEEK
+2FB3;W # KANGXI RADICAL SOUND
+2FB4;W # KANGXI RADICAL LEAF
+2FB5;W # KANGXI RADICAL WIND
+2FB6;W # KANGXI RADICAL FLY
+2FB7;W # KANGXI RADICAL EAT
+2FB8;W # KANGXI RADICAL HEAD
+2FB9;W # KANGXI RADICAL FRAGRANT
+2FBA;W # KANGXI RADICAL HORSE
+2FBB;W # KANGXI RADICAL BONE
+2FBC;W # KANGXI RADICAL TALL
+2FBD;W # KANGXI RADICAL HAIR
+2FBE;W # KANGXI RADICAL FIGHT
+2FBF;W # KANGXI RADICAL SACRIFICIAL WINE
+2FC0;W # KANGXI RADICAL CAULDRON
+2FC1;W # KANGXI RADICAL GHOST
+2FC2;W # KANGXI RADICAL FISH
+2FC3;W # KANGXI RADICAL BIRD
+2FC4;W # KANGXI RADICAL SALT
+2FC5;W # KANGXI RADICAL DEER
+2FC6;W # KANGXI RADICAL WHEAT
+2FC7;W # KANGXI RADICAL HEMP
+2FC8;W # KANGXI RADICAL YELLOW
+2FC9;W # KANGXI RADICAL MILLET
+2FCA;W # KANGXI RADICAL BLACK
+2FCB;W # KANGXI RADICAL EMBROIDERY
+2FCC;W # KANGXI RADICAL FROG
+2FCD;W # KANGXI RADICAL TRIPOD
+2FCE;W # KANGXI RADICAL DRUM
+2FCF;W # KANGXI RADICAL RAT
+2FD0;W # KANGXI RADICAL NOSE
+2FD1;W # KANGXI RADICAL EVEN
+2FD2;W # KANGXI RADICAL TOOTH
+2FD3;W # KANGXI RADICAL DRAGON
+2FD4;W # KANGXI RADICAL TURTLE
+2FD5;W # KANGXI RADICAL FLUTE
+2FF0;W # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1;W # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2;W # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3;W # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4;W # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB;W # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000;F # IDEOGRAPHIC SPACE
+3001;W # IDEOGRAPHIC COMMA
+3002;W # IDEOGRAPHIC FULL STOP
+3003;W # DITTO MARK
+3004;W # JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005;W # IDEOGRAPHIC ITERATION MARK
+3006;W # IDEOGRAPHIC CLOSING MARK
+3007;W # IDEOGRAPHIC NUMBER ZERO
+3008;W # LEFT ANGLE BRACKET
+3009;W # RIGHT ANGLE BRACKET
+300A;W # LEFT DOUBLE ANGLE BRACKET
+300B;W # RIGHT DOUBLE ANGLE BRACKET
+300C;W # LEFT CORNER BRACKET
+300D;W # RIGHT CORNER BRACKET
+300E;W # LEFT WHITE CORNER BRACKET
+300F;W # RIGHT WHITE CORNER BRACKET
+3010;W # LEFT BLACK LENTICULAR BRACKET
+3011;W # RIGHT BLACK LENTICULAR BRACKET
+3012;W # POSTAL MARK
+3013;W # GETA MARK
+3014;W # LEFT TORTOISE SHELL BRACKET
+3015;W # RIGHT TORTOISE SHELL BRACKET
+3016;W # LEFT WHITE LENTICULAR BRACKET
+3017;W # RIGHT WHITE LENTICULAR BRACKET
+3018;W # LEFT WHITE TORTOISE SHELL BRACKET
+3019;W # RIGHT WHITE TORTOISE SHELL BRACKET
+301A;W # LEFT WHITE SQUARE BRACKET
+301B;W # RIGHT WHITE SQUARE BRACKET
+301C;W # WAVE DASH
+301D;W # REVERSED DOUBLE PRIME QUOTATION MARK
+301E;W # DOUBLE PRIME QUOTATION MARK
+301F;W # LOW DOUBLE PRIME QUOTATION MARK
+3020;W # POSTAL MARK FACE
+3021;W # HANGZHOU NUMERAL ONE
+3022;W # HANGZHOU NUMERAL TWO
+3023;W # HANGZHOU NUMERAL THREE
+3024;W # HANGZHOU NUMERAL FOUR
+3025;W # HANGZHOU NUMERAL FIVE
+3026;W # HANGZHOU NUMERAL SIX
+3027;W # HANGZHOU NUMERAL SEVEN
+3028;W # HANGZHOU NUMERAL EIGHT
+3029;W # HANGZHOU NUMERAL NINE
+302A;W # IDEOGRAPHIC LEVEL TONE MARK
+302B;W # IDEOGRAPHIC RISING TONE MARK
+302C;W # IDEOGRAPHIC DEPARTING TONE MARK
+302D;W # IDEOGRAPHIC ENTERING TONE MARK
+302E;W # HANGUL SINGLE DOT TONE MARK
+302F;W # HANGUL DOUBLE DOT TONE MARK
+3030;W # WAVY DASH
+3031;W # VERTICAL KANA REPEAT MARK
+3032;W # VERTICAL KANA REPEAT WITH VOICED SOUND MARK
+3033;W # VERTICAL KANA REPEAT MARK UPPER HALF
+3034;W # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF
+3035;W # VERTICAL KANA REPEAT MARK LOWER HALF
+3036;W # CIRCLED POSTAL MARK
+3037;W # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+3038;W # HANGZHOU NUMERAL TEN
+3039;W # HANGZHOU NUMERAL TWENTY
+303A;W # HANGZHOU NUMERAL THIRTY
+303B;W # VERTICAL IDEOGRAPHIC ITERATION MARK
+303C;W # MASU MARK
+303D;W # PART ALTERNATION MARK
+303E;W # IDEOGRAPHIC VARIATION INDICATOR
+303F;N # IDEOGRAPHIC HALF FILL SPACE
+3041;W # HIRAGANA LETTER SMALL A
+3042;W # HIRAGANA LETTER A
+3043;W # HIRAGANA LETTER SMALL I
+3044;W # HIRAGANA LETTER I
+3045;W # HIRAGANA LETTER SMALL U
+3046;W # HIRAGANA LETTER U
+3047;W # HIRAGANA LETTER SMALL E
+3048;W # HIRAGANA LETTER E
+3049;W # HIRAGANA LETTER SMALL O
+304A;W # HIRAGANA LETTER O
+304B;W # HIRAGANA LETTER KA
+304C;W # HIRAGANA LETTER GA
+304D;W # HIRAGANA LETTER KI
+304E;W # HIRAGANA LETTER GI
+304F;W # HIRAGANA LETTER KU
+3050;W # HIRAGANA LETTER GU
+3051;W # HIRAGANA LETTER KE
+3052;W # HIRAGANA LETTER GE
+3053;W # HIRAGANA LETTER KO
+3054;W # HIRAGANA LETTER GO
+3055;W # HIRAGANA LETTER SA
+3056;W # HIRAGANA LETTER ZA
+3057;W # HIRAGANA LETTER SI
+3058;W # HIRAGANA LETTER ZI
+3059;W # HIRAGANA LETTER SU
+305A;W # HIRAGANA LETTER ZU
+305B;W # HIRAGANA LETTER SE
+305C;W # HIRAGANA LETTER ZE
+305D;W # HIRAGANA LETTER SO
+305E;W # HIRAGANA LETTER ZO
+305F;W # HIRAGANA LETTER TA
+3060;W # HIRAGANA LETTER DA
+3061;W # HIRAGANA LETTER TI
+3062;W # HIRAGANA LETTER DI
+3063;W # HIRAGANA LETTER SMALL TU
+3064;W # HIRAGANA LETTER TU
+3065;W # HIRAGANA LETTER DU
+3066;W # HIRAGANA LETTER TE
+3067;W # HIRAGANA LETTER DE
+3068;W # HIRAGANA LETTER TO
+3069;W # HIRAGANA LETTER DO
+306A;W # HIRAGANA LETTER NA
+306B;W # HIRAGANA LETTER NI
+306C;W # HIRAGANA LETTER NU
+306D;W # HIRAGANA LETTER NE
+306E;W # HIRAGANA LETTER NO
+306F;W # HIRAGANA LETTER HA
+3070;W # HIRAGANA LETTER BA
+3071;W # HIRAGANA LETTER PA
+3072;W # HIRAGANA LETTER HI
+3073;W # HIRAGANA LETTER BI
+3074;W # HIRAGANA LETTER PI
+3075;W # HIRAGANA LETTER HU
+3076;W # HIRAGANA LETTER BU
+3077;W # HIRAGANA LETTER PU
+3078;W # HIRAGANA LETTER HE
+3079;W # HIRAGANA LETTER BE
+307A;W # HIRAGANA LETTER PE
+307B;W # HIRAGANA LETTER HO
+307C;W # HIRAGANA LETTER BO
+307D;W # HIRAGANA LETTER PO
+307E;W # HIRAGANA LETTER MA
+307F;W # HIRAGANA LETTER MI
+3080;W # HIRAGANA LETTER MU
+3081;W # HIRAGANA LETTER ME
+3082;W # HIRAGANA LETTER MO
+3083;W # HIRAGANA LETTER SMALL YA
+3084;W # HIRAGANA LETTER YA
+3085;W # HIRAGANA LETTER SMALL YU
+3086;W # HIRAGANA LETTER YU
+3087;W # HIRAGANA LETTER SMALL YO
+3088;W # HIRAGANA LETTER YO
+3089;W # HIRAGANA LETTER RA
+308A;W # HIRAGANA LETTER RI
+308B;W # HIRAGANA LETTER RU
+308C;W # HIRAGANA LETTER RE
+308D;W # HIRAGANA LETTER RO
+308E;W # HIRAGANA LETTER SMALL WA
+308F;W # HIRAGANA LETTER WA
+3090;W # HIRAGANA LETTER WI
+3091;W # HIRAGANA LETTER WE
+3092;W # HIRAGANA LETTER WO
+3093;W # HIRAGANA LETTER N
+3094;W # HIRAGANA LETTER VU
+3095;W # HIRAGANA LETTER SMALL KA
+3096;W # HIRAGANA LETTER SMALL KE
+3099;W # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A;W # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B;W # KATAKANA-HIRAGANA VOICED SOUND MARK
+309C;W # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D;W # HIRAGANA ITERATION MARK
+309E;W # HIRAGANA VOICED ITERATION MARK
+309F;W # HIRAGANA DIGRAPH YORI
+30A0;W # KATAKANA-HIRAGANA DOUBLE HYPHEN
+30A1;W # KATAKANA LETTER SMALL A
+30A2;W # KATAKANA LETTER A
+30A3;W # KATAKANA LETTER SMALL I
+30A4;W # KATAKANA LETTER I
+30A5;W # KATAKANA LETTER SMALL U
+30A6;W # KATAKANA LETTER U
+30A7;W # KATAKANA LETTER SMALL E
+30A8;W # KATAKANA LETTER E
+30A9;W # KATAKANA LETTER SMALL O
+30AA;W # KATAKANA LETTER O
+30AB;W # KATAKANA LETTER KA
+30AC;W # KATAKANA LETTER GA
+30AD;W # KATAKANA LETTER KI
+30AE;W # KATAKANA LETTER GI
+30AF;W # KATAKANA LETTER KU
+30B0;W # KATAKANA LETTER GU
+30B1;W # KATAKANA LETTER KE
+30B2;W # KATAKANA LETTER GE
+30B3;W # KATAKANA LETTER KO
+30B4;W # KATAKANA LETTER GO
+30B5;W # KATAKANA LETTER SA
+30B6;W # KATAKANA LETTER ZA
+30B7;W # KATAKANA LETTER SI
+30B8;W # KATAKANA LETTER ZI
+30B9;W # KATAKANA LETTER SU
+30BA;W # KATAKANA LETTER ZU
+30BB;W # KATAKANA LETTER SE
+30BC;W # KATAKANA LETTER ZE
+30BD;W # KATAKANA LETTER SO
+30BE;W # KATAKANA LETTER ZO
+30BF;W # KATAKANA LETTER TA
+30C0;W # KATAKANA LETTER DA
+30C1;W # KATAKANA LETTER TI
+30C2;W # KATAKANA LETTER DI
+30C3;W # KATAKANA LETTER SMALL TU
+30C4;W # KATAKANA LETTER TU
+30C5;W # KATAKANA LETTER DU
+30C6;W # KATAKANA LETTER TE
+30C7;W # KATAKANA LETTER DE
+30C8;W # KATAKANA LETTER TO
+30C9;W # KATAKANA LETTER DO
+30CA;W # KATAKANA LETTER NA
+30CB;W # KATAKANA LETTER NI
+30CC;W # KATAKANA LETTER NU
+30CD;W # KATAKANA LETTER NE
+30CE;W # KATAKANA LETTER NO
+30CF;W # KATAKANA LETTER HA
+30D0;W # KATAKANA LETTER BA
+30D1;W # KATAKANA LETTER PA
+30D2;W # KATAKANA LETTER HI
+30D3;W # KATAKANA LETTER BI
+30D4;W # KATAKANA LETTER PI
+30D5;W # KATAKANA LETTER HU
+30D6;W # KATAKANA LETTER BU
+30D7;W # KATAKANA LETTER PU
+30D8;W # KATAKANA LETTER HE
+30D9;W # KATAKANA LETTER BE
+30DA;W # KATAKANA LETTER PE
+30DB;W # KATAKANA LETTER HO
+30DC;W # KATAKANA LETTER BO
+30DD;W # KATAKANA LETTER PO
+30DE;W # KATAKANA LETTER MA
+30DF;W # KATAKANA LETTER MI
+30E0;W # KATAKANA LETTER MU
+30E1;W # KATAKANA LETTER ME
+30E2;W # KATAKANA LETTER MO
+30E3;W # KATAKANA LETTER SMALL YA
+30E4;W # KATAKANA LETTER YA
+30E5;W # KATAKANA LETTER SMALL YU
+30E6;W # KATAKANA LETTER YU
+30E7;W # KATAKANA LETTER SMALL YO
+30E8;W # KATAKANA LETTER YO
+30E9;W # KATAKANA LETTER RA
+30EA;W # KATAKANA LETTER RI
+30EB;W # KATAKANA LETTER RU
+30EC;W # KATAKANA LETTER RE
+30ED;W # KATAKANA LETTER RO
+30EE;W # KATAKANA LETTER SMALL WA
+30EF;W # KATAKANA LETTER WA
+30F0;W # KATAKANA LETTER WI
+30F1;W # KATAKANA LETTER WE
+30F2;W # KATAKANA LETTER WO
+30F3;W # KATAKANA LETTER N
+30F4;W # KATAKANA LETTER VU
+30F5;W # KATAKANA LETTER SMALL KA
+30F6;W # KATAKANA LETTER SMALL KE
+30F7;W # KATAKANA LETTER VA
+30F8;W # KATAKANA LETTER VI
+30F9;W # KATAKANA LETTER VE
+30FA;W # KATAKANA LETTER VO
+30FB;W # KATAKANA MIDDLE DOT
+30FC;W # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FD;W # KATAKANA ITERATION MARK
+30FE;W # KATAKANA VOICED ITERATION MARK
+30FF;W # KATAKANA DIGRAPH KOTO
+3105;W # BOPOMOFO LETTER B
+3106;W # BOPOMOFO LETTER P
+3107;W # BOPOMOFO LETTER M
+3108;W # BOPOMOFO LETTER F
+3109;W # BOPOMOFO LETTER D
+310A;W # BOPOMOFO LETTER T
+310B;W # BOPOMOFO LETTER N
+310C;W # BOPOMOFO LETTER L
+310D;W # BOPOMOFO LETTER G
+310E;W # BOPOMOFO LETTER K
+310F;W # BOPOMOFO LETTER H
+3110;W # BOPOMOFO LETTER J
+3111;W # BOPOMOFO LETTER Q
+3112;W # BOPOMOFO LETTER X
+3113;W # BOPOMOFO LETTER ZH
+3114;W # BOPOMOFO LETTER CH
+3115;W # BOPOMOFO LETTER SH
+3116;W # BOPOMOFO LETTER R
+3117;W # BOPOMOFO LETTER Z
+3118;W # BOPOMOFO LETTER C
+3119;W # BOPOMOFO LETTER S
+311A;W # BOPOMOFO LETTER A
+311B;W # BOPOMOFO LETTER O
+311C;W # BOPOMOFO LETTER E
+311D;W # BOPOMOFO LETTER EH
+311E;W # BOPOMOFO LETTER AI
+311F;W # BOPOMOFO LETTER EI
+3120;W # BOPOMOFO LETTER AU
+3121;W # BOPOMOFO LETTER OU
+3122;W # BOPOMOFO LETTER AN
+3123;W # BOPOMOFO LETTER EN
+3124;W # BOPOMOFO LETTER ANG
+3125;W # BOPOMOFO LETTER ENG
+3126;W # BOPOMOFO LETTER ER
+3127;W # BOPOMOFO LETTER I
+3128;W # BOPOMOFO LETTER U
+3129;W # BOPOMOFO LETTER IU
+312A;W # BOPOMOFO LETTER V
+312B;W # BOPOMOFO LETTER NG
+312C;W # BOPOMOFO LETTER GN
+312D;W # BOPOMOFO LETTER IH
+3131;W # HANGUL LETTER KIYEOK
+3132;W # HANGUL LETTER SSANGKIYEOK
+3133;W # HANGUL LETTER KIYEOK-SIOS
+3134;W # HANGUL LETTER NIEUN
+3135;W # HANGUL LETTER NIEUN-CIEUC
+3136;W # HANGUL LETTER NIEUN-HIEUH
+3137;W # HANGUL LETTER TIKEUT
+3138;W # HANGUL LETTER SSANGTIKEUT
+3139;W # HANGUL LETTER RIEUL
+313A;W # HANGUL LETTER RIEUL-KIYEOK
+313B;W # HANGUL LETTER RIEUL-MIEUM
+313C;W # HANGUL LETTER RIEUL-PIEUP
+313D;W # HANGUL LETTER RIEUL-SIOS
+313E;W # HANGUL LETTER RIEUL-THIEUTH
+313F;W # HANGUL LETTER RIEUL-PHIEUPH
+3140;W # HANGUL LETTER RIEUL-HIEUH
+3141;W # HANGUL LETTER MIEUM
+3142;W # HANGUL LETTER PIEUP
+3143;W # HANGUL LETTER SSANGPIEUP
+3144;W # HANGUL LETTER PIEUP-SIOS
+3145;W # HANGUL LETTER SIOS
+3146;W # HANGUL LETTER SSANGSIOS
+3147;W # HANGUL LETTER IEUNG
+3148;W # HANGUL LETTER CIEUC
+3149;W # HANGUL LETTER SSANGCIEUC
+314A;W # HANGUL LETTER CHIEUCH
+314B;W # HANGUL LETTER KHIEUKH
+314C;W # HANGUL LETTER THIEUTH
+314D;W # HANGUL LETTER PHIEUPH
+314E;W # HANGUL LETTER HIEUH
+314F;W # HANGUL LETTER A
+3150;W # HANGUL LETTER AE
+3151;W # HANGUL LETTER YA
+3152;W # HANGUL LETTER YAE
+3153;W # HANGUL LETTER EO
+3154;W # HANGUL LETTER E
+3155;W # HANGUL LETTER YEO
+3156;W # HANGUL LETTER YE
+3157;W # HANGUL LETTER O
+3158;W # HANGUL LETTER WA
+3159;W # HANGUL LETTER WAE
+315A;W # HANGUL LETTER OE
+315B;W # HANGUL LETTER YO
+315C;W # HANGUL LETTER U
+315D;W # HANGUL LETTER WEO
+315E;W # HANGUL LETTER WE
+315F;W # HANGUL LETTER WI
+3160;W # HANGUL LETTER YU
+3161;W # HANGUL LETTER EU
+3162;W # HANGUL LETTER YI
+3163;W # HANGUL LETTER I
+3164;W # HANGUL FILLER
+3165;W # HANGUL LETTER SSANGNIEUN
+3166;W # HANGUL LETTER NIEUN-TIKEUT
+3167;W # HANGUL LETTER NIEUN-SIOS
+3168;W # HANGUL LETTER NIEUN-PANSIOS
+3169;W # HANGUL LETTER RIEUL-KIYEOK-SIOS
+316A;W # HANGUL LETTER RIEUL-TIKEUT
+316B;W # HANGUL LETTER RIEUL-PIEUP-SIOS
+316C;W # HANGUL LETTER RIEUL-PANSIOS
+316D;W # HANGUL LETTER RIEUL-YEORINHIEUH
+316E;W # HANGUL LETTER MIEUM-PIEUP
+316F;W # HANGUL LETTER MIEUM-SIOS
+3170;W # HANGUL LETTER MIEUM-PANSIOS
+3171;W # HANGUL LETTER KAPYEOUNMIEUM
+3172;W # HANGUL LETTER PIEUP-KIYEOK
+3173;W # HANGUL LETTER PIEUP-TIKEUT
+3174;W # HANGUL LETTER PIEUP-SIOS-KIYEOK
+3175;W # HANGUL LETTER PIEUP-SIOS-TIKEUT
+3176;W # HANGUL LETTER PIEUP-CIEUC
+3177;W # HANGUL LETTER PIEUP-THIEUTH
+3178;W # HANGUL LETTER KAPYEOUNPIEUP
+3179;W # HANGUL LETTER KAPYEOUNSSANGPIEUP
+317A;W # HANGUL LETTER SIOS-KIYEOK
+317B;W # HANGUL LETTER SIOS-NIEUN
+317C;W # HANGUL LETTER SIOS-TIKEUT
+317D;W # HANGUL LETTER SIOS-PIEUP
+317E;W # HANGUL LETTER SIOS-CIEUC
+317F;W # HANGUL LETTER PANSIOS
+3180;W # HANGUL LETTER SSANGIEUNG
+3181;W # HANGUL LETTER YESIEUNG
+3182;W # HANGUL LETTER YESIEUNG-SIOS
+3183;W # HANGUL LETTER YESIEUNG-PANSIOS
+3184;W # HANGUL LETTER KAPYEOUNPHIEUPH
+3185;W # HANGUL LETTER SSANGHIEUH
+3186;W # HANGUL LETTER YEORINHIEUH
+3187;W # HANGUL LETTER YO-YA
+3188;W # HANGUL LETTER YO-YAE
+3189;W # HANGUL LETTER YO-I
+318A;W # HANGUL LETTER YU-YEO
+318B;W # HANGUL LETTER YU-YE
+318C;W # HANGUL LETTER YU-I
+318D;W # HANGUL LETTER ARAEA
+318E;W # HANGUL LETTER ARAEAE
+3190;W # IDEOGRAPHIC ANNOTATION LINKING MARK
+3191;W # IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192;W # IDEOGRAPHIC ANNOTATION ONE MARK
+3193;W # IDEOGRAPHIC ANNOTATION TWO MARK
+3194;W # IDEOGRAPHIC ANNOTATION THREE MARK
+3195;W # IDEOGRAPHIC ANNOTATION FOUR MARK
+3196;W # IDEOGRAPHIC ANNOTATION TOP MARK
+3197;W # IDEOGRAPHIC ANNOTATION MIDDLE MARK
+3198;W # IDEOGRAPHIC ANNOTATION BOTTOM MARK
+3199;W # IDEOGRAPHIC ANNOTATION FIRST MARK
+319A;W # IDEOGRAPHIC ANNOTATION SECOND MARK
+319B;W # IDEOGRAPHIC ANNOTATION THIRD MARK
+319C;W # IDEOGRAPHIC ANNOTATION FOURTH MARK
+319D;W # IDEOGRAPHIC ANNOTATION HEAVEN MARK
+319E;W # IDEOGRAPHIC ANNOTATION EARTH MARK
+319F;W # IDEOGRAPHIC ANNOTATION MAN MARK
+31A0;W # BOPOMOFO LETTER BU
+31A1;W # BOPOMOFO LETTER ZI
+31A2;W # BOPOMOFO LETTER JI
+31A3;W # BOPOMOFO LETTER GU
+31A4;W # BOPOMOFO LETTER EE
+31A5;W # BOPOMOFO LETTER ENN
+31A6;W # BOPOMOFO LETTER OO
+31A7;W # BOPOMOFO LETTER ONN
+31A8;W # BOPOMOFO LETTER IR
+31A9;W # BOPOMOFO LETTER ANN
+31AA;W # BOPOMOFO LETTER INN
+31AB;W # BOPOMOFO LETTER UNN
+31AC;W # BOPOMOFO LETTER IM
+31AD;W # BOPOMOFO LETTER NGG
+31AE;W # BOPOMOFO LETTER AINN
+31AF;W # BOPOMOFO LETTER AUNN
+31B0;W # BOPOMOFO LETTER AM
+31B1;W # BOPOMOFO LETTER OM
+31B2;W # BOPOMOFO LETTER ONG
+31B3;W # BOPOMOFO LETTER INNN
+31B4;W # BOPOMOFO FINAL LETTER P
+31B5;W # BOPOMOFO FINAL LETTER T
+31B6;W # BOPOMOFO FINAL LETTER K
+31B7;W # BOPOMOFO FINAL LETTER H
+31C0;W # CJK STROKE T
+31C1;W # CJK STROKE WG
+31C2;W # CJK STROKE XG
+31C3;W # CJK STROKE BXG
+31C4;W # CJK STROKE SW
+31C5;W # CJK STROKE HZZ
+31C6;W # CJK STROKE HZG
+31C7;W # CJK STROKE HP
+31C8;W # CJK STROKE HZWG
+31C9;W # CJK STROKE SZWG
+31CA;W # CJK STROKE HZT
+31CB;W # CJK STROKE HZZP
+31CC;W # CJK STROKE HPWG
+31CD;W # CJK STROKE HZW
+31CE;W # CJK STROKE HZZZ
+31CF;W # CJK STROKE N
+31D0;W # CJK STROKE H
+31D1;W # CJK STROKE S
+31D2;W # CJK STROKE P
+31D3;W # CJK STROKE SP
+31D4;W # CJK STROKE D
+31D5;W # CJK STROKE HZ
+31D6;W # CJK STROKE HG
+31D7;W # CJK STROKE SZ
+31D8;W # CJK STROKE SWZ
+31D9;W # CJK STROKE ST
+31DA;W # CJK STROKE SG
+31DB;W # CJK STROKE PD
+31DC;W # CJK STROKE PZ
+31DD;W # CJK STROKE TN
+31DE;W # CJK STROKE SZZ
+31DF;W # CJK STROKE SWG
+31E0;W # CJK STROKE HXWG
+31E1;W # CJK STROKE HZZZG
+31E2;W # CJK STROKE PG
+31E3;W # CJK STROKE Q
+31F0;W # KATAKANA LETTER SMALL KU
+31F1;W # KATAKANA LETTER SMALL SI
+31F2;W # KATAKANA LETTER SMALL SU
+31F3;W # KATAKANA LETTER SMALL TO
+31F4;W # KATAKANA LETTER SMALL NU
+31F5;W # KATAKANA LETTER SMALL HA
+31F6;W # KATAKANA LETTER SMALL HI
+31F7;W # KATAKANA LETTER SMALL HU
+31F8;W # KATAKANA LETTER SMALL HE
+31F9;W # KATAKANA LETTER SMALL HO
+31FA;W # KATAKANA LETTER SMALL MU
+31FB;W # KATAKANA LETTER SMALL RA
+31FC;W # KATAKANA LETTER SMALL RI
+31FD;W # KATAKANA LETTER SMALL RU
+31FE;W # KATAKANA LETTER SMALL RE
+31FF;W # KATAKANA LETTER SMALL RO
+3200;W # PARENTHESIZED HANGUL KIYEOK
+3201;W # PARENTHESIZED HANGUL NIEUN
+3202;W # PARENTHESIZED HANGUL TIKEUT
+3203;W # PARENTHESIZED HANGUL RIEUL
+3204;W # PARENTHESIZED HANGUL MIEUM
+3205;W # PARENTHESIZED HANGUL PIEUP
+3206;W # PARENTHESIZED HANGUL SIOS
+3207;W # PARENTHESIZED HANGUL IEUNG
+3208;W # PARENTHESIZED HANGUL CIEUC
+3209;W # PARENTHESIZED HANGUL CHIEUCH
+320A;W # PARENTHESIZED HANGUL KHIEUKH
+320B;W # PARENTHESIZED HANGUL THIEUTH
+320C;W # PARENTHESIZED HANGUL PHIEUPH
+320D;W # PARENTHESIZED HANGUL HIEUH
+320E;W # PARENTHESIZED HANGUL KIYEOK A
+320F;W # PARENTHESIZED HANGUL NIEUN A
+3210;W # PARENTHESIZED HANGUL TIKEUT A
+3211;W # PARENTHESIZED HANGUL RIEUL A
+3212;W # PARENTHESIZED HANGUL MIEUM A
+3213;W # PARENTHESIZED HANGUL PIEUP A
+3214;W # PARENTHESIZED HANGUL SIOS A
+3215;W # PARENTHESIZED HANGUL IEUNG A
+3216;W # PARENTHESIZED HANGUL CIEUC A
+3217;W # PARENTHESIZED HANGUL CHIEUCH A
+3218;W # PARENTHESIZED HANGUL KHIEUKH A
+3219;W # PARENTHESIZED HANGUL THIEUTH A
+321A;W # PARENTHESIZED HANGUL PHIEUPH A
+321B;W # PARENTHESIZED HANGUL HIEUH A
+321C;W # PARENTHESIZED HANGUL CIEUC U
+321D;W # PARENTHESIZED KOREAN CHARACTER OJEON
+321E;W # PARENTHESIZED KOREAN CHARACTER O HU
+3220;W # PARENTHESIZED IDEOGRAPH ONE
+3221;W # PARENTHESIZED IDEOGRAPH TWO
+3222;W # PARENTHESIZED IDEOGRAPH THREE
+3223;W # PARENTHESIZED IDEOGRAPH FOUR
+3224;W # PARENTHESIZED IDEOGRAPH FIVE
+3225;W # PARENTHESIZED IDEOGRAPH SIX
+3226;W # PARENTHESIZED IDEOGRAPH SEVEN
+3227;W # PARENTHESIZED IDEOGRAPH EIGHT
+3228;W # PARENTHESIZED IDEOGRAPH NINE
+3229;W # PARENTHESIZED IDEOGRAPH TEN
+322A;W # PARENTHESIZED IDEOGRAPH MOON
+322B;W # PARENTHESIZED IDEOGRAPH FIRE
+322C;W # PARENTHESIZED IDEOGRAPH WATER
+322D;W # PARENTHESIZED IDEOGRAPH WOOD
+322E;W # PARENTHESIZED IDEOGRAPH METAL
+322F;W # PARENTHESIZED IDEOGRAPH EARTH
+3230;W # PARENTHESIZED IDEOGRAPH SUN
+3231;W # PARENTHESIZED IDEOGRAPH STOCK
+3232;W # PARENTHESIZED IDEOGRAPH HAVE
+3233;W # PARENTHESIZED IDEOGRAPH SOCIETY
+3234;W # PARENTHESIZED IDEOGRAPH NAME
+3235;W # PARENTHESIZED IDEOGRAPH SPECIAL
+3236;W # PARENTHESIZED IDEOGRAPH FINANCIAL
+3237;W # PARENTHESIZED IDEOGRAPH CONGRATULATION
+3238;W # PARENTHESIZED IDEOGRAPH LABOR
+3239;W # PARENTHESIZED IDEOGRAPH REPRESENT
+323A;W # PARENTHESIZED IDEOGRAPH CALL
+323B;W # PARENTHESIZED IDEOGRAPH STUDY
+323C;W # PARENTHESIZED IDEOGRAPH SUPERVISE
+323D;W # PARENTHESIZED IDEOGRAPH ENTERPRISE
+323E;W # PARENTHESIZED IDEOGRAPH RESOURCE
+323F;W # PARENTHESIZED IDEOGRAPH ALLIANCE
+3240;W # PARENTHESIZED IDEOGRAPH FESTIVAL
+3241;W # PARENTHESIZED IDEOGRAPH REST
+3242;W # PARENTHESIZED IDEOGRAPH SELF
+3243;W # PARENTHESIZED IDEOGRAPH REACH
+3250;W # PARTNERSHIP SIGN
+3251;W # CIRCLED NUMBER TWENTY ONE
+3252;W # CIRCLED NUMBER TWENTY TWO
+3253;W # CIRCLED NUMBER TWENTY THREE
+3254;W # CIRCLED NUMBER TWENTY FOUR
+3255;W # CIRCLED NUMBER TWENTY FIVE
+3256;W # CIRCLED NUMBER TWENTY SIX
+3257;W # CIRCLED NUMBER TWENTY SEVEN
+3258;W # CIRCLED NUMBER TWENTY EIGHT
+3259;W # CIRCLED NUMBER TWENTY NINE
+325A;W # CIRCLED NUMBER THIRTY
+325B;W # CIRCLED NUMBER THIRTY ONE
+325C;W # CIRCLED NUMBER THIRTY TWO
+325D;W # CIRCLED NUMBER THIRTY THREE
+325E;W # CIRCLED NUMBER THIRTY FOUR
+325F;W # CIRCLED NUMBER THIRTY FIVE
+3260;W # CIRCLED HANGUL KIYEOK
+3261;W # CIRCLED HANGUL NIEUN
+3262;W # CIRCLED HANGUL TIKEUT
+3263;W # CIRCLED HANGUL RIEUL
+3264;W # CIRCLED HANGUL MIEUM
+3265;W # CIRCLED HANGUL PIEUP
+3266;W # CIRCLED HANGUL SIOS
+3267;W # CIRCLED HANGUL IEUNG
+3268;W # CIRCLED HANGUL CIEUC
+3269;W # CIRCLED HANGUL CHIEUCH
+326A;W # CIRCLED HANGUL KHIEUKH
+326B;W # CIRCLED HANGUL THIEUTH
+326C;W # CIRCLED HANGUL PHIEUPH
+326D;W # CIRCLED HANGUL HIEUH
+326E;W # CIRCLED HANGUL KIYEOK A
+326F;W # CIRCLED HANGUL NIEUN A
+3270;W # CIRCLED HANGUL TIKEUT A
+3271;W # CIRCLED HANGUL RIEUL A
+3272;W # CIRCLED HANGUL MIEUM A
+3273;W # CIRCLED HANGUL PIEUP A
+3274;W # CIRCLED HANGUL SIOS A
+3275;W # CIRCLED HANGUL IEUNG A
+3276;W # CIRCLED HANGUL CIEUC A
+3277;W # CIRCLED HANGUL CHIEUCH A
+3278;W # CIRCLED HANGUL KHIEUKH A
+3279;W # CIRCLED HANGUL THIEUTH A
+327A;W # CIRCLED HANGUL PHIEUPH A
+327B;W # CIRCLED HANGUL HIEUH A
+327C;W # CIRCLED KOREAN CHARACTER CHAMKO
+327D;W # CIRCLED KOREAN CHARACTER JUEUI
+327E;W # CIRCLED HANGUL IEUNG U
+327F;W # KOREAN STANDARD SYMBOL
+3280;W # CIRCLED IDEOGRAPH ONE
+3281;W # CIRCLED IDEOGRAPH TWO
+3282;W # CIRCLED IDEOGRAPH THREE
+3283;W # CIRCLED IDEOGRAPH FOUR
+3284;W # CIRCLED IDEOGRAPH FIVE
+3285;W # CIRCLED IDEOGRAPH SIX
+3286;W # CIRCLED IDEOGRAPH SEVEN
+3287;W # CIRCLED IDEOGRAPH EIGHT
+3288;W # CIRCLED IDEOGRAPH NINE
+3289;W # CIRCLED IDEOGRAPH TEN
+328A;W # CIRCLED IDEOGRAPH MOON
+328B;W # CIRCLED IDEOGRAPH FIRE
+328C;W # CIRCLED IDEOGRAPH WATER
+328D;W # CIRCLED IDEOGRAPH WOOD
+328E;W # CIRCLED IDEOGRAPH METAL
+328F;W # CIRCLED IDEOGRAPH EARTH
+3290;W # CIRCLED IDEOGRAPH SUN
+3291;W # CIRCLED IDEOGRAPH STOCK
+3292;W # CIRCLED IDEOGRAPH HAVE
+3293;W # CIRCLED IDEOGRAPH SOCIETY
+3294;W # CIRCLED IDEOGRAPH NAME
+3295;W # CIRCLED IDEOGRAPH SPECIAL
+3296;W # CIRCLED IDEOGRAPH FINANCIAL
+3297;W # CIRCLED IDEOGRAPH CONGRATULATION
+3298;W # CIRCLED IDEOGRAPH LABOR
+3299;W # CIRCLED IDEOGRAPH SECRET
+329A;W # CIRCLED IDEOGRAPH MALE
+329B;W # CIRCLED IDEOGRAPH FEMALE
+329C;W # CIRCLED IDEOGRAPH SUITABLE
+329D;W # CIRCLED IDEOGRAPH EXCELLENT
+329E;W # CIRCLED IDEOGRAPH PRINT
+329F;W # CIRCLED IDEOGRAPH ATTENTION
+32A0;W # CIRCLED IDEOGRAPH ITEM
+32A1;W # CIRCLED IDEOGRAPH REST
+32A2;W # CIRCLED IDEOGRAPH COPY
+32A3;W # CIRCLED IDEOGRAPH CORRECT
+32A4;W # CIRCLED IDEOGRAPH HIGH
+32A5;W # CIRCLED IDEOGRAPH CENTRE
+32A6;W # CIRCLED IDEOGRAPH LOW
+32A7;W # CIRCLED IDEOGRAPH LEFT
+32A8;W # CIRCLED IDEOGRAPH RIGHT
+32A9;W # CIRCLED IDEOGRAPH MEDICINE
+32AA;W # CIRCLED IDEOGRAPH RELIGION
+32AB;W # CIRCLED IDEOGRAPH STUDY
+32AC;W # CIRCLED IDEOGRAPH SUPERVISE
+32AD;W # CIRCLED IDEOGRAPH ENTERPRISE
+32AE;W # CIRCLED IDEOGRAPH RESOURCE
+32AF;W # CIRCLED IDEOGRAPH ALLIANCE
+32B0;W # CIRCLED IDEOGRAPH NIGHT
+32B1;W # CIRCLED NUMBER THIRTY SIX
+32B2;W # CIRCLED NUMBER THIRTY SEVEN
+32B3;W # CIRCLED NUMBER THIRTY EIGHT
+32B4;W # CIRCLED NUMBER THIRTY NINE
+32B5;W # CIRCLED NUMBER FORTY
+32B6;W # CIRCLED NUMBER FORTY ONE
+32B7;W # CIRCLED NUMBER FORTY TWO
+32B8;W # CIRCLED NUMBER FORTY THREE
+32B9;W # CIRCLED NUMBER FORTY FOUR
+32BA;W # CIRCLED NUMBER FORTY FIVE
+32BB;W # CIRCLED NUMBER FORTY SIX
+32BC;W # CIRCLED NUMBER FORTY SEVEN
+32BD;W # CIRCLED NUMBER FORTY EIGHT
+32BE;W # CIRCLED NUMBER FORTY NINE
+32BF;W # CIRCLED NUMBER FIFTY
+32C0;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+32C1;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+32C2;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+32C3;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+32C4;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+32C5;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+32C6;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+32C7;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+32C8;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+32C9;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+32CA;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+32CB;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32CC;W # SQUARE HG
+32CD;W # SQUARE ERG
+32CE;W # SQUARE EV
+32CF;W # LIMITED LIABILITY SIGN
+32D0;W # CIRCLED KATAKANA A
+32D1;W # CIRCLED KATAKANA I
+32D2;W # CIRCLED KATAKANA U
+32D3;W # CIRCLED KATAKANA E
+32D4;W # CIRCLED KATAKANA O
+32D5;W # CIRCLED KATAKANA KA
+32D6;W # CIRCLED KATAKANA KI
+32D7;W # CIRCLED KATAKANA KU
+32D8;W # CIRCLED KATAKANA KE
+32D9;W # CIRCLED KATAKANA KO
+32DA;W # CIRCLED KATAKANA SA
+32DB;W # CIRCLED KATAKANA SI
+32DC;W # CIRCLED KATAKANA SU
+32DD;W # CIRCLED KATAKANA SE
+32DE;W # CIRCLED KATAKANA SO
+32DF;W # CIRCLED KATAKANA TA
+32E0;W # CIRCLED KATAKANA TI
+32E1;W # CIRCLED KATAKANA TU
+32E2;W # CIRCLED KATAKANA TE
+32E3;W # CIRCLED KATAKANA TO
+32E4;W # CIRCLED KATAKANA NA
+32E5;W # CIRCLED KATAKANA NI
+32E6;W # CIRCLED KATAKANA NU
+32E7;W # CIRCLED KATAKANA NE
+32E8;W # CIRCLED KATAKANA NO
+32E9;W # CIRCLED KATAKANA HA
+32EA;W # CIRCLED KATAKANA HI
+32EB;W # CIRCLED KATAKANA HU
+32EC;W # CIRCLED KATAKANA HE
+32ED;W # CIRCLED KATAKANA HO
+32EE;W # CIRCLED KATAKANA MA
+32EF;W # CIRCLED KATAKANA MI
+32F0;W # CIRCLED KATAKANA MU
+32F1;W # CIRCLED KATAKANA ME
+32F2;W # CIRCLED KATAKANA MO
+32F3;W # CIRCLED KATAKANA YA
+32F4;W # CIRCLED KATAKANA YU
+32F5;W # CIRCLED KATAKANA YO
+32F6;W # CIRCLED KATAKANA RA
+32F7;W # CIRCLED KATAKANA RI
+32F8;W # CIRCLED KATAKANA RU
+32F9;W # CIRCLED KATAKANA RE
+32FA;W # CIRCLED KATAKANA RO
+32FB;W # CIRCLED KATAKANA WA
+32FC;W # CIRCLED KATAKANA WI
+32FD;W # CIRCLED KATAKANA WE
+32FE;W # CIRCLED KATAKANA WO
+3300;W # SQUARE APAATO
+3301;W # SQUARE ARUHUA
+3302;W # SQUARE ANPEA
+3303;W # SQUARE AARU
+3304;W # SQUARE ININGU
+3305;W # SQUARE INTI
+3306;W # SQUARE UON
+3307;W # SQUARE ESUKUUDO
+3308;W # SQUARE EEKAA
+3309;W # SQUARE ONSU
+330A;W # SQUARE OOMU
+330B;W # SQUARE KAIRI
+330C;W # SQUARE KARATTO
+330D;W # SQUARE KARORII
+330E;W # SQUARE GARON
+330F;W # SQUARE GANMA
+3310;W # SQUARE GIGA
+3311;W # SQUARE GINII
+3312;W # SQUARE KYURII
+3313;W # SQUARE GIRUDAA
+3314;W # SQUARE KIRO
+3315;W # SQUARE KIROGURAMU
+3316;W # SQUARE KIROMEETORU
+3317;W # SQUARE KIROWATTO
+3318;W # SQUARE GURAMU
+3319;W # SQUARE GURAMUTON
+331A;W # SQUARE KURUZEIRO
+331B;W # SQUARE KUROONE
+331C;W # SQUARE KEESU
+331D;W # SQUARE KORUNA
+331E;W # SQUARE KOOPO
+331F;W # SQUARE SAIKURU
+3320;W # SQUARE SANTIIMU
+3321;W # SQUARE SIRINGU
+3322;W # SQUARE SENTI
+3323;W # SQUARE SENTO
+3324;W # SQUARE DAASU
+3325;W # SQUARE DESI
+3326;W # SQUARE DORU
+3327;W # SQUARE TON
+3328;W # SQUARE NANO
+3329;W # SQUARE NOTTO
+332A;W # SQUARE HAITU
+332B;W # SQUARE PAASENTO
+332C;W # SQUARE PAATU
+332D;W # SQUARE BAARERU
+332E;W # SQUARE PIASUTORU
+332F;W # SQUARE PIKURU
+3330;W # SQUARE PIKO
+3331;W # SQUARE BIRU
+3332;W # SQUARE HUARADDO
+3333;W # SQUARE HUIITO
+3334;W # SQUARE BUSSYERU
+3335;W # SQUARE HURAN
+3336;W # SQUARE HEKUTAARU
+3337;W # SQUARE PESO
+3338;W # SQUARE PENIHI
+3339;W # SQUARE HERUTU
+333A;W # SQUARE PENSU
+333B;W # SQUARE PEEZI
+333C;W # SQUARE BEETA
+333D;W # SQUARE POINTO
+333E;W # SQUARE BORUTO
+333F;W # SQUARE HON
+3340;W # SQUARE PONDO
+3341;W # SQUARE HOORU
+3342;W # SQUARE HOON
+3343;W # SQUARE MAIKURO
+3344;W # SQUARE MAIRU
+3345;W # SQUARE MAHHA
+3346;W # SQUARE MARUKU
+3347;W # SQUARE MANSYON
+3348;W # SQUARE MIKURON
+3349;W # SQUARE MIRI
+334A;W # SQUARE MIRIBAARU
+334B;W # SQUARE MEGA
+334C;W # SQUARE MEGATON
+334D;W # SQUARE MEETORU
+334E;W # SQUARE YAADO
+334F;W # SQUARE YAARU
+3350;W # SQUARE YUAN
+3351;W # SQUARE RITTORU
+3352;W # SQUARE RIRA
+3353;W # SQUARE RUPII
+3354;W # SQUARE RUUBURU
+3355;W # SQUARE REMU
+3356;W # SQUARE RENTOGEN
+3357;W # SQUARE WATTO
+3358;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+3359;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+335A;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+335B;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+335C;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+335D;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+335E;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+335F;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+3360;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+3361;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+3362;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+3363;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+3364;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+3365;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+3366;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+3367;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+3368;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+3369;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+336A;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+336B;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+336C;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+336D;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+336E;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+336F;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+3370;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+3371;W # SQUARE HPA
+3372;W # SQUARE DA
+3373;W # SQUARE AU
+3374;W # SQUARE BAR
+3375;W # SQUARE OV
+3376;W # SQUARE PC
+3377;W # SQUARE DM
+3378;W # SQUARE DM SQUARED
+3379;W # SQUARE DM CUBED
+337A;W # SQUARE IU
+337B;W # SQUARE ERA NAME HEISEI
+337C;W # SQUARE ERA NAME SYOUWA
+337D;W # SQUARE ERA NAME TAISYOU
+337E;W # SQUARE ERA NAME MEIZI
+337F;W # SQUARE CORPORATION
+3380;W # SQUARE PA AMPS
+3381;W # SQUARE NA
+3382;W # SQUARE MU A
+3383;W # SQUARE MA
+3384;W # SQUARE KA
+3385;W # SQUARE KB
+3386;W # SQUARE MB
+3387;W # SQUARE GB
+3388;W # SQUARE CAL
+3389;W # SQUARE KCAL
+338A;W # SQUARE PF
+338B;W # SQUARE NF
+338C;W # SQUARE MU F
+338D;W # SQUARE MU G
+338E;W # SQUARE MG
+338F;W # SQUARE KG
+3390;W # SQUARE HZ
+3391;W # SQUARE KHZ
+3392;W # SQUARE MHZ
+3393;W # SQUARE GHZ
+3394;W # SQUARE THZ
+3395;W # SQUARE MU L
+3396;W # SQUARE ML
+3397;W # SQUARE DL
+3398;W # SQUARE KL
+3399;W # SQUARE FM
+339A;W # SQUARE NM
+339B;W # SQUARE MU M
+339C;W # SQUARE MM
+339D;W # SQUARE CM
+339E;W # SQUARE KM
+339F;W # SQUARE MM SQUARED
+33A0;W # SQUARE CM SQUARED
+33A1;W # SQUARE M SQUARED
+33A2;W # SQUARE KM SQUARED
+33A3;W # SQUARE MM CUBED
+33A4;W # SQUARE CM CUBED
+33A5;W # SQUARE M CUBED
+33A6;W # SQUARE KM CUBED
+33A7;W # SQUARE M OVER S
+33A8;W # SQUARE M OVER S SQUARED
+33A9;W # SQUARE PA
+33AA;W # SQUARE KPA
+33AB;W # SQUARE MPA
+33AC;W # SQUARE GPA
+33AD;W # SQUARE RAD
+33AE;W # SQUARE RAD OVER S
+33AF;W # SQUARE RAD OVER S SQUARED
+33B0;W # SQUARE PS
+33B1;W # SQUARE NS
+33B2;W # SQUARE MU S
+33B3;W # SQUARE MS
+33B4;W # SQUARE PV
+33B5;W # SQUARE NV
+33B6;W # SQUARE MU V
+33B7;W # SQUARE MV
+33B8;W # SQUARE KV
+33B9;W # SQUARE MV MEGA
+33BA;W # SQUARE PW
+33BB;W # SQUARE NW
+33BC;W # SQUARE MU W
+33BD;W # SQUARE MW
+33BE;W # SQUARE KW
+33BF;W # SQUARE MW MEGA
+33C0;W # SQUARE K OHM
+33C1;W # SQUARE M OHM
+33C2;W # SQUARE AM
+33C3;W # SQUARE BQ
+33C4;W # SQUARE CC
+33C5;W # SQUARE CD
+33C6;W # SQUARE C OVER KG
+33C7;W # SQUARE CO
+33C8;W # SQUARE DB
+33C9;W # SQUARE GY
+33CA;W # SQUARE HA
+33CB;W # SQUARE HP
+33CC;W # SQUARE IN
+33CD;W # SQUARE KK
+33CE;W # SQUARE KM CAPITAL
+33CF;W # SQUARE KT
+33D0;W # SQUARE LM
+33D1;W # SQUARE LN
+33D2;W # SQUARE LOG
+33D3;W # SQUARE LX
+33D4;W # SQUARE MB SMALL
+33D5;W # SQUARE MIL
+33D6;W # SQUARE MOL
+33D7;W # SQUARE PH
+33D8;W # SQUARE PM
+33D9;W # SQUARE PPM
+33DA;W # SQUARE PR
+33DB;W # SQUARE SR
+33DC;W # SQUARE SV
+33DD;W # SQUARE WB
+33DE;W # SQUARE V OVER M
+33DF;W # SQUARE A OVER M
+33E0;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+33E1;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+33E2;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+33E3;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+33E4;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+33E5;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+33E6;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+33E7;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+33E8;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+33E9;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+33EA;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+33EB;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+33EC;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+33ED;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+33EE;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+33EF;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+33F0;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+33F1;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+33F2;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+33F3;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+33F4;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+33F5;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+33F6;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+33F7;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+33F8;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+33F9;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+33FA;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+33FB;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+33FC;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+33FD;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+33FE;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+33FF;W # SQUARE GAL
+3400..4DB5;W # <CJK Ideograph Extension A, First>..<CJK Ideograph Extension A, Last>
+4DC0;N # HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1;N # HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2;N # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3;N # HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4;N # HEXAGRAM FOR WAITING
+4DC5;N # HEXAGRAM FOR CONFLICT
+4DC6;N # HEXAGRAM FOR THE ARMY
+4DC7;N # HEXAGRAM FOR HOLDING TOGETHER
+4DC8;N # HEXAGRAM FOR SMALL TAMING
+4DC9;N # HEXAGRAM FOR TREADING
+4DCA;N # HEXAGRAM FOR PEACE
+4DCB;N # HEXAGRAM FOR STANDSTILL
+4DCC;N # HEXAGRAM FOR FELLOWSHIP
+4DCD;N # HEXAGRAM FOR GREAT POSSESSION
+4DCE;N # HEXAGRAM FOR MODESTY
+4DCF;N # HEXAGRAM FOR ENTHUSIASM
+4DD0;N # HEXAGRAM FOR FOLLOWING
+4DD1;N # HEXAGRAM FOR WORK ON THE DECAYED
+4DD2;N # HEXAGRAM FOR APPROACH
+4DD3;N # HEXAGRAM FOR CONTEMPLATION
+4DD4;N # HEXAGRAM FOR BITING THROUGH
+4DD5;N # HEXAGRAM FOR GRACE
+4DD6;N # HEXAGRAM FOR SPLITTING APART
+4DD7;N # HEXAGRAM FOR RETURN
+4DD8;N # HEXAGRAM FOR INNOCENCE
+4DD9;N # HEXAGRAM FOR GREAT TAMING
+4DDA;N # HEXAGRAM FOR MOUTH CORNERS
+4DDB;N # HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC;N # HEXAGRAM FOR THE ABYSMAL WATER
+4DDD;N # HEXAGRAM FOR THE CLINGING FIRE
+4DDE;N # HEXAGRAM FOR INFLUENCE
+4DDF;N # HEXAGRAM FOR DURATION
+4DE0;N # HEXAGRAM FOR RETREAT
+4DE1;N # HEXAGRAM FOR GREAT POWER
+4DE2;N # HEXAGRAM FOR PROGRESS
+4DE3;N # HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4;N # HEXAGRAM FOR THE FAMILY
+4DE5;N # HEXAGRAM FOR OPPOSITION
+4DE6;N # HEXAGRAM FOR OBSTRUCTION
+4DE7;N # HEXAGRAM FOR DELIVERANCE
+4DE8;N # HEXAGRAM FOR DECREASE
+4DE9;N # HEXAGRAM FOR INCREASE
+4DEA;N # HEXAGRAM FOR BREAKTHROUGH
+4DEB;N # HEXAGRAM FOR COMING TO MEET
+4DEC;N # HEXAGRAM FOR GATHERING TOGETHER
+4DED;N # HEXAGRAM FOR PUSHING UPWARD
+4DEE;N # HEXAGRAM FOR OPPRESSION
+4DEF;N # HEXAGRAM FOR THE WELL
+4DF0;N # HEXAGRAM FOR REVOLUTION
+4DF1;N # HEXAGRAM FOR THE CAULDRON
+4DF2;N # HEXAGRAM FOR THE AROUSING THUNDER
+4DF3;N # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4;N # HEXAGRAM FOR DEVELOPMENT
+4DF5;N # HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6;N # HEXAGRAM FOR ABUNDANCE
+4DF7;N # HEXAGRAM FOR THE WANDERER
+4DF8;N # HEXAGRAM FOR THE GENTLE WIND
+4DF9;N # HEXAGRAM FOR THE JOYOUS LAKE
+4DFA;N # HEXAGRAM FOR DISPERSION
+4DFB;N # HEXAGRAM FOR LIMITATION
+4DFC;N # HEXAGRAM FOR INNER TRUTH
+4DFD;N # HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE;N # HEXAGRAM FOR AFTER COMPLETION
+4DFF;N # HEXAGRAM FOR BEFORE COMPLETION
+4E00..9FC3;W # <CJK Ideograph, First>..<CJK Ideograph, Last>
+A000;W # YI SYLLABLE IT
+A001;W # YI SYLLABLE IX
+A002;W # YI SYLLABLE I
+A003;W # YI SYLLABLE IP
+A004;W # YI SYLLABLE IET
+A005;W # YI SYLLABLE IEX
+A006;W # YI SYLLABLE IE
+A007;W # YI SYLLABLE IEP
+A008;W # YI SYLLABLE AT
+A009;W # YI SYLLABLE AX
+A00A;W # YI SYLLABLE A
+A00B;W # YI SYLLABLE AP
+A00C;W # YI SYLLABLE UOX
+A00D;W # YI SYLLABLE UO
+A00E;W # YI SYLLABLE UOP
+A00F;W # YI SYLLABLE OT
+A010;W # YI SYLLABLE OX
+A011;W # YI SYLLABLE O
+A012;W # YI SYLLABLE OP
+A013;W # YI SYLLABLE EX
+A014;W # YI SYLLABLE E
+A015;W # YI SYLLABLE WU
+A016;W # YI SYLLABLE BIT
+A017;W # YI SYLLABLE BIX
+A018;W # YI SYLLABLE BI
+A019;W # YI SYLLABLE BIP
+A01A;W # YI SYLLABLE BIET
+A01B;W # YI SYLLABLE BIEX
+A01C;W # YI SYLLABLE BIE
+A01D;W # YI SYLLABLE BIEP
+A01E;W # YI SYLLABLE BAT
+A01F;W # YI SYLLABLE BAX
+A020;W # YI SYLLABLE BA
+A021;W # YI SYLLABLE BAP
+A022;W # YI SYLLABLE BUOX
+A023;W # YI SYLLABLE BUO
+A024;W # YI SYLLABLE BUOP
+A025;W # YI SYLLABLE BOT
+A026;W # YI SYLLABLE BOX
+A027;W # YI SYLLABLE BO
+A028;W # YI SYLLABLE BOP
+A029;W # YI SYLLABLE BEX
+A02A;W # YI SYLLABLE BE
+A02B;W # YI SYLLABLE BEP
+A02C;W # YI SYLLABLE BUT
+A02D;W # YI SYLLABLE BUX
+A02E;W # YI SYLLABLE BU
+A02F;W # YI SYLLABLE BUP
+A030;W # YI SYLLABLE BURX
+A031;W # YI SYLLABLE BUR
+A032;W # YI SYLLABLE BYT
+A033;W # YI SYLLABLE BYX
+A034;W # YI SYLLABLE BY
+A035;W # YI SYLLABLE BYP
+A036;W # YI SYLLABLE BYRX
+A037;W # YI SYLLABLE BYR
+A038;W # YI SYLLABLE PIT
+A039;W # YI SYLLABLE PIX
+A03A;W # YI SYLLABLE PI
+A03B;W # YI SYLLABLE PIP
+A03C;W # YI SYLLABLE PIEX
+A03D;W # YI SYLLABLE PIE
+A03E;W # YI SYLLABLE PIEP
+A03F;W # YI SYLLABLE PAT
+A040;W # YI SYLLABLE PAX
+A041;W # YI SYLLABLE PA
+A042;W # YI SYLLABLE PAP
+A043;W # YI SYLLABLE PUOX
+A044;W # YI SYLLABLE PUO
+A045;W # YI SYLLABLE PUOP
+A046;W # YI SYLLABLE POT
+A047;W # YI SYLLABLE POX
+A048;W # YI SYLLABLE PO
+A049;W # YI SYLLABLE POP
+A04A;W # YI SYLLABLE PUT
+A04B;W # YI SYLLABLE PUX
+A04C;W # YI SYLLABLE PU
+A04D;W # YI SYLLABLE PUP
+A04E;W # YI SYLLABLE PURX
+A04F;W # YI SYLLABLE PUR
+A050;W # YI SYLLABLE PYT
+A051;W # YI SYLLABLE PYX
+A052;W # YI SYLLABLE PY
+A053;W # YI SYLLABLE PYP
+A054;W # YI SYLLABLE PYRX
+A055;W # YI SYLLABLE PYR
+A056;W # YI SYLLABLE BBIT
+A057;W # YI SYLLABLE BBIX
+A058;W # YI SYLLABLE BBI
+A059;W # YI SYLLABLE BBIP
+A05A;W # YI SYLLABLE BBIET
+A05B;W # YI SYLLABLE BBIEX
+A05C;W # YI SYLLABLE BBIE
+A05D;W # YI SYLLABLE BBIEP
+A05E;W # YI SYLLABLE BBAT
+A05F;W # YI SYLLABLE BBAX
+A060;W # YI SYLLABLE BBA
+A061;W # YI SYLLABLE BBAP
+A062;W # YI SYLLABLE BBUOX
+A063;W # YI SYLLABLE BBUO
+A064;W # YI SYLLABLE BBUOP
+A065;W # YI SYLLABLE BBOT
+A066;W # YI SYLLABLE BBOX
+A067;W # YI SYLLABLE BBO
+A068;W # YI SYLLABLE BBOP
+A069;W # YI SYLLABLE BBEX
+A06A;W # YI SYLLABLE BBE
+A06B;W # YI SYLLABLE BBEP
+A06C;W # YI SYLLABLE BBUT
+A06D;W # YI SYLLABLE BBUX
+A06E;W # YI SYLLABLE BBU
+A06F;W # YI SYLLABLE BBUP
+A070;W # YI SYLLABLE BBURX
+A071;W # YI SYLLABLE BBUR
+A072;W # YI SYLLABLE BBYT
+A073;W # YI SYLLABLE BBYX
+A074;W # YI SYLLABLE BBY
+A075;W # YI SYLLABLE BBYP
+A076;W # YI SYLLABLE NBIT
+A077;W # YI SYLLABLE NBIX
+A078;W # YI SYLLABLE NBI
+A079;W # YI SYLLABLE NBIP
+A07A;W # YI SYLLABLE NBIEX
+A07B;W # YI SYLLABLE NBIE
+A07C;W # YI SYLLABLE NBIEP
+A07D;W # YI SYLLABLE NBAT
+A07E;W # YI SYLLABLE NBAX
+A07F;W # YI SYLLABLE NBA
+A080;W # YI SYLLABLE NBAP
+A081;W # YI SYLLABLE NBOT
+A082;W # YI SYLLABLE NBOX
+A083;W # YI SYLLABLE NBO
+A084;W # YI SYLLABLE NBOP
+A085;W # YI SYLLABLE NBUT
+A086;W # YI SYLLABLE NBUX
+A087;W # YI SYLLABLE NBU
+A088;W # YI SYLLABLE NBUP
+A089;W # YI SYLLABLE NBURX
+A08A;W # YI SYLLABLE NBUR
+A08B;W # YI SYLLABLE NBYT
+A08C;W # YI SYLLABLE NBYX
+A08D;W # YI SYLLABLE NBY
+A08E;W # YI SYLLABLE NBYP
+A08F;W # YI SYLLABLE NBYRX
+A090;W # YI SYLLABLE NBYR
+A091;W # YI SYLLABLE HMIT
+A092;W # YI SYLLABLE HMIX
+A093;W # YI SYLLABLE HMI
+A094;W # YI SYLLABLE HMIP
+A095;W # YI SYLLABLE HMIEX
+A096;W # YI SYLLABLE HMIE
+A097;W # YI SYLLABLE HMIEP
+A098;W # YI SYLLABLE HMAT
+A099;W # YI SYLLABLE HMAX
+A09A;W # YI SYLLABLE HMA
+A09B;W # YI SYLLABLE HMAP
+A09C;W # YI SYLLABLE HMUOX
+A09D;W # YI SYLLABLE HMUO
+A09E;W # YI SYLLABLE HMUOP
+A09F;W # YI SYLLABLE HMOT
+A0A0;W # YI SYLLABLE HMOX
+A0A1;W # YI SYLLABLE HMO
+A0A2;W # YI SYLLABLE HMOP
+A0A3;W # YI SYLLABLE HMUT
+A0A4;W # YI SYLLABLE HMUX
+A0A5;W # YI SYLLABLE HMU
+A0A6;W # YI SYLLABLE HMUP
+A0A7;W # YI SYLLABLE HMURX
+A0A8;W # YI SYLLABLE HMUR
+A0A9;W # YI SYLLABLE HMYX
+A0AA;W # YI SYLLABLE HMY
+A0AB;W # YI SYLLABLE HMYP
+A0AC;W # YI SYLLABLE HMYRX
+A0AD;W # YI SYLLABLE HMYR
+A0AE;W # YI SYLLABLE MIT
+A0AF;W # YI SYLLABLE MIX
+A0B0;W # YI SYLLABLE MI
+A0B1;W # YI SYLLABLE MIP
+A0B2;W # YI SYLLABLE MIEX
+A0B3;W # YI SYLLABLE MIE
+A0B4;W # YI SYLLABLE MIEP
+A0B5;W # YI SYLLABLE MAT
+A0B6;W # YI SYLLABLE MAX
+A0B7;W # YI SYLLABLE MA
+A0B8;W # YI SYLLABLE MAP
+A0B9;W # YI SYLLABLE MUOT
+A0BA;W # YI SYLLABLE MUOX
+A0BB;W # YI SYLLABLE MUO
+A0BC;W # YI SYLLABLE MUOP
+A0BD;W # YI SYLLABLE MOT
+A0BE;W # YI SYLLABLE MOX
+A0BF;W # YI SYLLABLE MO
+A0C0;W # YI SYLLABLE MOP
+A0C1;W # YI SYLLABLE MEX
+A0C2;W # YI SYLLABLE ME
+A0C3;W # YI SYLLABLE MUT
+A0C4;W # YI SYLLABLE MUX
+A0C5;W # YI SYLLABLE MU
+A0C6;W # YI SYLLABLE MUP
+A0C7;W # YI SYLLABLE MURX
+A0C8;W # YI SYLLABLE MUR
+A0C9;W # YI SYLLABLE MYT
+A0CA;W # YI SYLLABLE MYX
+A0CB;W # YI SYLLABLE MY
+A0CC;W # YI SYLLABLE MYP
+A0CD;W # YI SYLLABLE FIT
+A0CE;W # YI SYLLABLE FIX
+A0CF;W # YI SYLLABLE FI
+A0D0;W # YI SYLLABLE FIP
+A0D1;W # YI SYLLABLE FAT
+A0D2;W # YI SYLLABLE FAX
+A0D3;W # YI SYLLABLE FA
+A0D4;W # YI SYLLABLE FAP
+A0D5;W # YI SYLLABLE FOX
+A0D6;W # YI SYLLABLE FO
+A0D7;W # YI SYLLABLE FOP
+A0D8;W # YI SYLLABLE FUT
+A0D9;W # YI SYLLABLE FUX
+A0DA;W # YI SYLLABLE FU
+A0DB;W # YI SYLLABLE FUP
+A0DC;W # YI SYLLABLE FURX
+A0DD;W # YI SYLLABLE FUR
+A0DE;W # YI SYLLABLE FYT
+A0DF;W # YI SYLLABLE FYX
+A0E0;W # YI SYLLABLE FY
+A0E1;W # YI SYLLABLE FYP
+A0E2;W # YI SYLLABLE VIT
+A0E3;W # YI SYLLABLE VIX
+A0E4;W # YI SYLLABLE VI
+A0E5;W # YI SYLLABLE VIP
+A0E6;W # YI SYLLABLE VIET
+A0E7;W # YI SYLLABLE VIEX
+A0E8;W # YI SYLLABLE VIE
+A0E9;W # YI SYLLABLE VIEP
+A0EA;W # YI SYLLABLE VAT
+A0EB;W # YI SYLLABLE VAX
+A0EC;W # YI SYLLABLE VA
+A0ED;W # YI SYLLABLE VAP
+A0EE;W # YI SYLLABLE VOT
+A0EF;W # YI SYLLABLE VOX
+A0F0;W # YI SYLLABLE VO
+A0F1;W # YI SYLLABLE VOP
+A0F2;W # YI SYLLABLE VEX
+A0F3;W # YI SYLLABLE VEP
+A0F4;W # YI SYLLABLE VUT
+A0F5;W # YI SYLLABLE VUX
+A0F6;W # YI SYLLABLE VU
+A0F7;W # YI SYLLABLE VUP
+A0F8;W # YI SYLLABLE VURX
+A0F9;W # YI SYLLABLE VUR
+A0FA;W # YI SYLLABLE VYT
+A0FB;W # YI SYLLABLE VYX
+A0FC;W # YI SYLLABLE VY
+A0FD;W # YI SYLLABLE VYP
+A0FE;W # YI SYLLABLE VYRX
+A0FF;W # YI SYLLABLE VYR
+A100;W # YI SYLLABLE DIT
+A101;W # YI SYLLABLE DIX
+A102;W # YI SYLLABLE DI
+A103;W # YI SYLLABLE DIP
+A104;W # YI SYLLABLE DIEX
+A105;W # YI SYLLABLE DIE
+A106;W # YI SYLLABLE DIEP
+A107;W # YI SYLLABLE DAT
+A108;W # YI SYLLABLE DAX
+A109;W # YI SYLLABLE DA
+A10A;W # YI SYLLABLE DAP
+A10B;W # YI SYLLABLE DUOX
+A10C;W # YI SYLLABLE DUO
+A10D;W # YI SYLLABLE DOT
+A10E;W # YI SYLLABLE DOX
+A10F;W # YI SYLLABLE DO
+A110;W # YI SYLLABLE DOP
+A111;W # YI SYLLABLE DEX
+A112;W # YI SYLLABLE DE
+A113;W # YI SYLLABLE DEP
+A114;W # YI SYLLABLE DUT
+A115;W # YI SYLLABLE DUX
+A116;W # YI SYLLABLE DU
+A117;W # YI SYLLABLE DUP
+A118;W # YI SYLLABLE DURX
+A119;W # YI SYLLABLE DUR
+A11A;W # YI SYLLABLE TIT
+A11B;W # YI SYLLABLE TIX
+A11C;W # YI SYLLABLE TI
+A11D;W # YI SYLLABLE TIP
+A11E;W # YI SYLLABLE TIEX
+A11F;W # YI SYLLABLE TIE
+A120;W # YI SYLLABLE TIEP
+A121;W # YI SYLLABLE TAT
+A122;W # YI SYLLABLE TAX
+A123;W # YI SYLLABLE TA
+A124;W # YI SYLLABLE TAP
+A125;W # YI SYLLABLE TUOT
+A126;W # YI SYLLABLE TUOX
+A127;W # YI SYLLABLE TUO
+A128;W # YI SYLLABLE TUOP
+A129;W # YI SYLLABLE TOT
+A12A;W # YI SYLLABLE TOX
+A12B;W # YI SYLLABLE TO
+A12C;W # YI SYLLABLE TOP
+A12D;W # YI SYLLABLE TEX
+A12E;W # YI SYLLABLE TE
+A12F;W # YI SYLLABLE TEP
+A130;W # YI SYLLABLE TUT
+A131;W # YI SYLLABLE TUX
+A132;W # YI SYLLABLE TU
+A133;W # YI SYLLABLE TUP
+A134;W # YI SYLLABLE TURX
+A135;W # YI SYLLABLE TUR
+A136;W # YI SYLLABLE DDIT
+A137;W # YI SYLLABLE DDIX
+A138;W # YI SYLLABLE DDI
+A139;W # YI SYLLABLE DDIP
+A13A;W # YI SYLLABLE DDIEX
+A13B;W # YI SYLLABLE DDIE
+A13C;W # YI SYLLABLE DDIEP
+A13D;W # YI SYLLABLE DDAT
+A13E;W # YI SYLLABLE DDAX
+A13F;W # YI SYLLABLE DDA
+A140;W # YI SYLLABLE DDAP
+A141;W # YI SYLLABLE DDUOX
+A142;W # YI SYLLABLE DDUO
+A143;W # YI SYLLABLE DDUOP
+A144;W # YI SYLLABLE DDOT
+A145;W # YI SYLLABLE DDOX
+A146;W # YI SYLLABLE DDO
+A147;W # YI SYLLABLE DDOP
+A148;W # YI SYLLABLE DDEX
+A149;W # YI SYLLABLE DDE
+A14A;W # YI SYLLABLE DDEP
+A14B;W # YI SYLLABLE DDUT
+A14C;W # YI SYLLABLE DDUX
+A14D;W # YI SYLLABLE DDU
+A14E;W # YI SYLLABLE DDUP
+A14F;W # YI SYLLABLE DDURX
+A150;W # YI SYLLABLE DDUR
+A151;W # YI SYLLABLE NDIT
+A152;W # YI SYLLABLE NDIX
+A153;W # YI SYLLABLE NDI
+A154;W # YI SYLLABLE NDIP
+A155;W # YI SYLLABLE NDIEX
+A156;W # YI SYLLABLE NDIE
+A157;W # YI SYLLABLE NDAT
+A158;W # YI SYLLABLE NDAX
+A159;W # YI SYLLABLE NDA
+A15A;W # YI SYLLABLE NDAP
+A15B;W # YI SYLLABLE NDOT
+A15C;W # YI SYLLABLE NDOX
+A15D;W # YI SYLLABLE NDO
+A15E;W # YI SYLLABLE NDOP
+A15F;W # YI SYLLABLE NDEX
+A160;W # YI SYLLABLE NDE
+A161;W # YI SYLLABLE NDEP
+A162;W # YI SYLLABLE NDUT
+A163;W # YI SYLLABLE NDUX
+A164;W # YI SYLLABLE NDU
+A165;W # YI SYLLABLE NDUP
+A166;W # YI SYLLABLE NDURX
+A167;W # YI SYLLABLE NDUR
+A168;W # YI SYLLABLE HNIT
+A169;W # YI SYLLABLE HNIX
+A16A;W # YI SYLLABLE HNI
+A16B;W # YI SYLLABLE HNIP
+A16C;W # YI SYLLABLE HNIET
+A16D;W # YI SYLLABLE HNIEX
+A16E;W # YI SYLLABLE HNIE
+A16F;W # YI SYLLABLE HNIEP
+A170;W # YI SYLLABLE HNAT
+A171;W # YI SYLLABLE HNAX
+A172;W # YI SYLLABLE HNA
+A173;W # YI SYLLABLE HNAP
+A174;W # YI SYLLABLE HNUOX
+A175;W # YI SYLLABLE HNUO
+A176;W # YI SYLLABLE HNOT
+A177;W # YI SYLLABLE HNOX
+A178;W # YI SYLLABLE HNOP
+A179;W # YI SYLLABLE HNEX
+A17A;W # YI SYLLABLE HNE
+A17B;W # YI SYLLABLE HNEP
+A17C;W # YI SYLLABLE HNUT
+A17D;W # YI SYLLABLE NIT
+A17E;W # YI SYLLABLE NIX
+A17F;W # YI SYLLABLE NI
+A180;W # YI SYLLABLE NIP
+A181;W # YI SYLLABLE NIEX
+A182;W # YI SYLLABLE NIE
+A183;W # YI SYLLABLE NIEP
+A184;W # YI SYLLABLE NAX
+A185;W # YI SYLLABLE NA
+A186;W # YI SYLLABLE NAP
+A187;W # YI SYLLABLE NUOX
+A188;W # YI SYLLABLE NUO
+A189;W # YI SYLLABLE NUOP
+A18A;W # YI SYLLABLE NOT
+A18B;W # YI SYLLABLE NOX
+A18C;W # YI SYLLABLE NO
+A18D;W # YI SYLLABLE NOP
+A18E;W # YI SYLLABLE NEX
+A18F;W # YI SYLLABLE NE
+A190;W # YI SYLLABLE NEP
+A191;W # YI SYLLABLE NUT
+A192;W # YI SYLLABLE NUX
+A193;W # YI SYLLABLE NU
+A194;W # YI SYLLABLE NUP
+A195;W # YI SYLLABLE NURX
+A196;W # YI SYLLABLE NUR
+A197;W # YI SYLLABLE HLIT
+A198;W # YI SYLLABLE HLIX
+A199;W # YI SYLLABLE HLI
+A19A;W # YI SYLLABLE HLIP
+A19B;W # YI SYLLABLE HLIEX
+A19C;W # YI SYLLABLE HLIE
+A19D;W # YI SYLLABLE HLIEP
+A19E;W # YI SYLLABLE HLAT
+A19F;W # YI SYLLABLE HLAX
+A1A0;W # YI SYLLABLE HLA
+A1A1;W # YI SYLLABLE HLAP
+A1A2;W # YI SYLLABLE HLUOX
+A1A3;W # YI SYLLABLE HLUO
+A1A4;W # YI SYLLABLE HLUOP
+A1A5;W # YI SYLLABLE HLOX
+A1A6;W # YI SYLLABLE HLO
+A1A7;W # YI SYLLABLE HLOP
+A1A8;W # YI SYLLABLE HLEX
+A1A9;W # YI SYLLABLE HLE
+A1AA;W # YI SYLLABLE HLEP
+A1AB;W # YI SYLLABLE HLUT
+A1AC;W # YI SYLLABLE HLUX
+A1AD;W # YI SYLLABLE HLU
+A1AE;W # YI SYLLABLE HLUP
+A1AF;W # YI SYLLABLE HLURX
+A1B0;W # YI SYLLABLE HLUR
+A1B1;W # YI SYLLABLE HLYT
+A1B2;W # YI SYLLABLE HLYX
+A1B3;W # YI SYLLABLE HLY
+A1B4;W # YI SYLLABLE HLYP
+A1B5;W # YI SYLLABLE HLYRX
+A1B6;W # YI SYLLABLE HLYR
+A1B7;W # YI SYLLABLE LIT
+A1B8;W # YI SYLLABLE LIX
+A1B9;W # YI SYLLABLE LI
+A1BA;W # YI SYLLABLE LIP
+A1BB;W # YI SYLLABLE LIET
+A1BC;W # YI SYLLABLE LIEX
+A1BD;W # YI SYLLABLE LIE
+A1BE;W # YI SYLLABLE LIEP
+A1BF;W # YI SYLLABLE LAT
+A1C0;W # YI SYLLABLE LAX
+A1C1;W # YI SYLLABLE LA
+A1C2;W # YI SYLLABLE LAP
+A1C3;W # YI SYLLABLE LUOT
+A1C4;W # YI SYLLABLE LUOX
+A1C5;W # YI SYLLABLE LUO
+A1C6;W # YI SYLLABLE LUOP
+A1C7;W # YI SYLLABLE LOT
+A1C8;W # YI SYLLABLE LOX
+A1C9;W # YI SYLLABLE LO
+A1CA;W # YI SYLLABLE LOP
+A1CB;W # YI SYLLABLE LEX
+A1CC;W # YI SYLLABLE LE
+A1CD;W # YI SYLLABLE LEP
+A1CE;W # YI SYLLABLE LUT
+A1CF;W # YI SYLLABLE LUX
+A1D0;W # YI SYLLABLE LU
+A1D1;W # YI SYLLABLE LUP
+A1D2;W # YI SYLLABLE LURX
+A1D3;W # YI SYLLABLE LUR
+A1D4;W # YI SYLLABLE LYT
+A1D5;W # YI SYLLABLE LYX
+A1D6;W # YI SYLLABLE LY
+A1D7;W # YI SYLLABLE LYP
+A1D8;W # YI SYLLABLE LYRX
+A1D9;W # YI SYLLABLE LYR
+A1DA;W # YI SYLLABLE GIT
+A1DB;W # YI SYLLABLE GIX
+A1DC;W # YI SYLLABLE GI
+A1DD;W # YI SYLLABLE GIP
+A1DE;W # YI SYLLABLE GIET
+A1DF;W # YI SYLLABLE GIEX
+A1E0;W # YI SYLLABLE GIE
+A1E1;W # YI SYLLABLE GIEP
+A1E2;W # YI SYLLABLE GAT
+A1E3;W # YI SYLLABLE GAX
+A1E4;W # YI SYLLABLE GA
+A1E5;W # YI SYLLABLE GAP
+A1E6;W # YI SYLLABLE GUOT
+A1E7;W # YI SYLLABLE GUOX
+A1E8;W # YI SYLLABLE GUO
+A1E9;W # YI SYLLABLE GUOP
+A1EA;W # YI SYLLABLE GOT
+A1EB;W # YI SYLLABLE GOX
+A1EC;W # YI SYLLABLE GO
+A1ED;W # YI SYLLABLE GOP
+A1EE;W # YI SYLLABLE GET
+A1EF;W # YI SYLLABLE GEX
+A1F0;W # YI SYLLABLE GE
+A1F1;W # YI SYLLABLE GEP
+A1F2;W # YI SYLLABLE GUT
+A1F3;W # YI SYLLABLE GUX
+A1F4;W # YI SYLLABLE GU
+A1F5;W # YI SYLLABLE GUP
+A1F6;W # YI SYLLABLE GURX
+A1F7;W # YI SYLLABLE GUR
+A1F8;W # YI SYLLABLE KIT
+A1F9;W # YI SYLLABLE KIX
+A1FA;W # YI SYLLABLE KI
+A1FB;W # YI SYLLABLE KIP
+A1FC;W # YI SYLLABLE KIEX
+A1FD;W # YI SYLLABLE KIE
+A1FE;W # YI SYLLABLE KIEP
+A1FF;W # YI SYLLABLE KAT
+A200;W # YI SYLLABLE KAX
+A201;W # YI SYLLABLE KA
+A202;W # YI SYLLABLE KAP
+A203;W # YI SYLLABLE KUOX
+A204;W # YI SYLLABLE KUO
+A205;W # YI SYLLABLE KUOP
+A206;W # YI SYLLABLE KOT
+A207;W # YI SYLLABLE KOX
+A208;W # YI SYLLABLE KO
+A209;W # YI SYLLABLE KOP
+A20A;W # YI SYLLABLE KET
+A20B;W # YI SYLLABLE KEX
+A20C;W # YI SYLLABLE KE
+A20D;W # YI SYLLABLE KEP
+A20E;W # YI SYLLABLE KUT
+A20F;W # YI SYLLABLE KUX
+A210;W # YI SYLLABLE KU
+A211;W # YI SYLLABLE KUP
+A212;W # YI SYLLABLE KURX
+A213;W # YI SYLLABLE KUR
+A214;W # YI SYLLABLE GGIT
+A215;W # YI SYLLABLE GGIX
+A216;W # YI SYLLABLE GGI
+A217;W # YI SYLLABLE GGIEX
+A218;W # YI SYLLABLE GGIE
+A219;W # YI SYLLABLE GGIEP
+A21A;W # YI SYLLABLE GGAT
+A21B;W # YI SYLLABLE GGAX
+A21C;W # YI SYLLABLE GGA
+A21D;W # YI SYLLABLE GGAP
+A21E;W # YI SYLLABLE GGUOT
+A21F;W # YI SYLLABLE GGUOX
+A220;W # YI SYLLABLE GGUO
+A221;W # YI SYLLABLE GGUOP
+A222;W # YI SYLLABLE GGOT
+A223;W # YI SYLLABLE GGOX
+A224;W # YI SYLLABLE GGO
+A225;W # YI SYLLABLE GGOP
+A226;W # YI SYLLABLE GGET
+A227;W # YI SYLLABLE GGEX
+A228;W # YI SYLLABLE GGE
+A229;W # YI SYLLABLE GGEP
+A22A;W # YI SYLLABLE GGUT
+A22B;W # YI SYLLABLE GGUX
+A22C;W # YI SYLLABLE GGU
+A22D;W # YI SYLLABLE GGUP
+A22E;W # YI SYLLABLE GGURX
+A22F;W # YI SYLLABLE GGUR
+A230;W # YI SYLLABLE MGIEX
+A231;W # YI SYLLABLE MGIE
+A232;W # YI SYLLABLE MGAT
+A233;W # YI SYLLABLE MGAX
+A234;W # YI SYLLABLE MGA
+A235;W # YI SYLLABLE MGAP
+A236;W # YI SYLLABLE MGUOX
+A237;W # YI SYLLABLE MGUO
+A238;W # YI SYLLABLE MGUOP
+A239;W # YI SYLLABLE MGOT
+A23A;W # YI SYLLABLE MGOX
+A23B;W # YI SYLLABLE MGO
+A23C;W # YI SYLLABLE MGOP
+A23D;W # YI SYLLABLE MGEX
+A23E;W # YI SYLLABLE MGE
+A23F;W # YI SYLLABLE MGEP
+A240;W # YI SYLLABLE MGUT
+A241;W # YI SYLLABLE MGUX
+A242;W # YI SYLLABLE MGU
+A243;W # YI SYLLABLE MGUP
+A244;W # YI SYLLABLE MGURX
+A245;W # YI SYLLABLE MGUR
+A246;W # YI SYLLABLE HXIT
+A247;W # YI SYLLABLE HXIX
+A248;W # YI SYLLABLE HXI
+A249;W # YI SYLLABLE HXIP
+A24A;W # YI SYLLABLE HXIET
+A24B;W # YI SYLLABLE HXIEX
+A24C;W # YI SYLLABLE HXIE
+A24D;W # YI SYLLABLE HXIEP
+A24E;W # YI SYLLABLE HXAT
+A24F;W # YI SYLLABLE HXAX
+A250;W # YI SYLLABLE HXA
+A251;W # YI SYLLABLE HXAP
+A252;W # YI SYLLABLE HXUOT
+A253;W # YI SYLLABLE HXUOX
+A254;W # YI SYLLABLE HXUO
+A255;W # YI SYLLABLE HXUOP
+A256;W # YI SYLLABLE HXOT
+A257;W # YI SYLLABLE HXOX
+A258;W # YI SYLLABLE HXO
+A259;W # YI SYLLABLE HXOP
+A25A;W # YI SYLLABLE HXEX
+A25B;W # YI SYLLABLE HXE
+A25C;W # YI SYLLABLE HXEP
+A25D;W # YI SYLLABLE NGIEX
+A25E;W # YI SYLLABLE NGIE
+A25F;W # YI SYLLABLE NGIEP
+A260;W # YI SYLLABLE NGAT
+A261;W # YI SYLLABLE NGAX
+A262;W # YI SYLLABLE NGA
+A263;W # YI SYLLABLE NGAP
+A264;W # YI SYLLABLE NGUOT
+A265;W # YI SYLLABLE NGUOX
+A266;W # YI SYLLABLE NGUO
+A267;W # YI SYLLABLE NGOT
+A268;W # YI SYLLABLE NGOX
+A269;W # YI SYLLABLE NGO
+A26A;W # YI SYLLABLE NGOP
+A26B;W # YI SYLLABLE NGEX
+A26C;W # YI SYLLABLE NGE
+A26D;W # YI SYLLABLE NGEP
+A26E;W # YI SYLLABLE HIT
+A26F;W # YI SYLLABLE HIEX
+A270;W # YI SYLLABLE HIE
+A271;W # YI SYLLABLE HAT
+A272;W # YI SYLLABLE HAX
+A273;W # YI SYLLABLE HA
+A274;W # YI SYLLABLE HAP
+A275;W # YI SYLLABLE HUOT
+A276;W # YI SYLLABLE HUOX
+A277;W # YI SYLLABLE HUO
+A278;W # YI SYLLABLE HUOP
+A279;W # YI SYLLABLE HOT
+A27A;W # YI SYLLABLE HOX
+A27B;W # YI SYLLABLE HO
+A27C;W # YI SYLLABLE HOP
+A27D;W # YI SYLLABLE HEX
+A27E;W # YI SYLLABLE HE
+A27F;W # YI SYLLABLE HEP
+A280;W # YI SYLLABLE WAT
+A281;W # YI SYLLABLE WAX
+A282;W # YI SYLLABLE WA
+A283;W # YI SYLLABLE WAP
+A284;W # YI SYLLABLE WUOX
+A285;W # YI SYLLABLE WUO
+A286;W # YI SYLLABLE WUOP
+A287;W # YI SYLLABLE WOX
+A288;W # YI SYLLABLE WO
+A289;W # YI SYLLABLE WOP
+A28A;W # YI SYLLABLE WEX
+A28B;W # YI SYLLABLE WE
+A28C;W # YI SYLLABLE WEP
+A28D;W # YI SYLLABLE ZIT
+A28E;W # YI SYLLABLE ZIX
+A28F;W # YI SYLLABLE ZI
+A290;W # YI SYLLABLE ZIP
+A291;W # YI SYLLABLE ZIEX
+A292;W # YI SYLLABLE ZIE
+A293;W # YI SYLLABLE ZIEP
+A294;W # YI SYLLABLE ZAT
+A295;W # YI SYLLABLE ZAX
+A296;W # YI SYLLABLE ZA
+A297;W # YI SYLLABLE ZAP
+A298;W # YI SYLLABLE ZUOX
+A299;W # YI SYLLABLE ZUO
+A29A;W # YI SYLLABLE ZUOP
+A29B;W # YI SYLLABLE ZOT
+A29C;W # YI SYLLABLE ZOX
+A29D;W # YI SYLLABLE ZO
+A29E;W # YI SYLLABLE ZOP
+A29F;W # YI SYLLABLE ZEX
+A2A0;W # YI SYLLABLE ZE
+A2A1;W # YI SYLLABLE ZEP
+A2A2;W # YI SYLLABLE ZUT
+A2A3;W # YI SYLLABLE ZUX
+A2A4;W # YI SYLLABLE ZU
+A2A5;W # YI SYLLABLE ZUP
+A2A6;W # YI SYLLABLE ZURX
+A2A7;W # YI SYLLABLE ZUR
+A2A8;W # YI SYLLABLE ZYT
+A2A9;W # YI SYLLABLE ZYX
+A2AA;W # YI SYLLABLE ZY
+A2AB;W # YI SYLLABLE ZYP
+A2AC;W # YI SYLLABLE ZYRX
+A2AD;W # YI SYLLABLE ZYR
+A2AE;W # YI SYLLABLE CIT
+A2AF;W # YI SYLLABLE CIX
+A2B0;W # YI SYLLABLE CI
+A2B1;W # YI SYLLABLE CIP
+A2B2;W # YI SYLLABLE CIET
+A2B3;W # YI SYLLABLE CIEX
+A2B4;W # YI SYLLABLE CIE
+A2B5;W # YI SYLLABLE CIEP
+A2B6;W # YI SYLLABLE CAT
+A2B7;W # YI SYLLABLE CAX
+A2B8;W # YI SYLLABLE CA
+A2B9;W # YI SYLLABLE CAP
+A2BA;W # YI SYLLABLE CUOX
+A2BB;W # YI SYLLABLE CUO
+A2BC;W # YI SYLLABLE CUOP
+A2BD;W # YI SYLLABLE COT
+A2BE;W # YI SYLLABLE COX
+A2BF;W # YI SYLLABLE CO
+A2C0;W # YI SYLLABLE COP
+A2C1;W # YI SYLLABLE CEX
+A2C2;W # YI SYLLABLE CE
+A2C3;W # YI SYLLABLE CEP
+A2C4;W # YI SYLLABLE CUT
+A2C5;W # YI SYLLABLE CUX
+A2C6;W # YI SYLLABLE CU
+A2C7;W # YI SYLLABLE CUP
+A2C8;W # YI SYLLABLE CURX
+A2C9;W # YI SYLLABLE CUR
+A2CA;W # YI SYLLABLE CYT
+A2CB;W # YI SYLLABLE CYX
+A2CC;W # YI SYLLABLE CY
+A2CD;W # YI SYLLABLE CYP
+A2CE;W # YI SYLLABLE CYRX
+A2CF;W # YI SYLLABLE CYR
+A2D0;W # YI SYLLABLE ZZIT
+A2D1;W # YI SYLLABLE ZZIX
+A2D2;W # YI SYLLABLE ZZI
+A2D3;W # YI SYLLABLE ZZIP
+A2D4;W # YI SYLLABLE ZZIET
+A2D5;W # YI SYLLABLE ZZIEX
+A2D6;W # YI SYLLABLE ZZIE
+A2D7;W # YI SYLLABLE ZZIEP
+A2D8;W # YI SYLLABLE ZZAT
+A2D9;W # YI SYLLABLE ZZAX
+A2DA;W # YI SYLLABLE ZZA
+A2DB;W # YI SYLLABLE ZZAP
+A2DC;W # YI SYLLABLE ZZOX
+A2DD;W # YI SYLLABLE ZZO
+A2DE;W # YI SYLLABLE ZZOP
+A2DF;W # YI SYLLABLE ZZEX
+A2E0;W # YI SYLLABLE ZZE
+A2E1;W # YI SYLLABLE ZZEP
+A2E2;W # YI SYLLABLE ZZUX
+A2E3;W # YI SYLLABLE ZZU
+A2E4;W # YI SYLLABLE ZZUP
+A2E5;W # YI SYLLABLE ZZURX
+A2E6;W # YI SYLLABLE ZZUR
+A2E7;W # YI SYLLABLE ZZYT
+A2E8;W # YI SYLLABLE ZZYX
+A2E9;W # YI SYLLABLE ZZY
+A2EA;W # YI SYLLABLE ZZYP
+A2EB;W # YI SYLLABLE ZZYRX
+A2EC;W # YI SYLLABLE ZZYR
+A2ED;W # YI SYLLABLE NZIT
+A2EE;W # YI SYLLABLE NZIX
+A2EF;W # YI SYLLABLE NZI
+A2F0;W # YI SYLLABLE NZIP
+A2F1;W # YI SYLLABLE NZIEX
+A2F2;W # YI SYLLABLE NZIE
+A2F3;W # YI SYLLABLE NZIEP
+A2F4;W # YI SYLLABLE NZAT
+A2F5;W # YI SYLLABLE NZAX
+A2F6;W # YI SYLLABLE NZA
+A2F7;W # YI SYLLABLE NZAP
+A2F8;W # YI SYLLABLE NZUOX
+A2F9;W # YI SYLLABLE NZUO
+A2FA;W # YI SYLLABLE NZOX
+A2FB;W # YI SYLLABLE NZOP
+A2FC;W # YI SYLLABLE NZEX
+A2FD;W # YI SYLLABLE NZE
+A2FE;W # YI SYLLABLE NZUX
+A2FF;W # YI SYLLABLE NZU
+A300;W # YI SYLLABLE NZUP
+A301;W # YI SYLLABLE NZURX
+A302;W # YI SYLLABLE NZUR
+A303;W # YI SYLLABLE NZYT
+A304;W # YI SYLLABLE NZYX
+A305;W # YI SYLLABLE NZY
+A306;W # YI SYLLABLE NZYP
+A307;W # YI SYLLABLE NZYRX
+A308;W # YI SYLLABLE NZYR
+A309;W # YI SYLLABLE SIT
+A30A;W # YI SYLLABLE SIX
+A30B;W # YI SYLLABLE SI
+A30C;W # YI SYLLABLE SIP
+A30D;W # YI SYLLABLE SIEX
+A30E;W # YI SYLLABLE SIE
+A30F;W # YI SYLLABLE SIEP
+A310;W # YI SYLLABLE SAT
+A311;W # YI SYLLABLE SAX
+A312;W # YI SYLLABLE SA
+A313;W # YI SYLLABLE SAP
+A314;W # YI SYLLABLE SUOX
+A315;W # YI SYLLABLE SUO
+A316;W # YI SYLLABLE SUOP
+A317;W # YI SYLLABLE SOT
+A318;W # YI SYLLABLE SOX
+A319;W # YI SYLLABLE SO
+A31A;W # YI SYLLABLE SOP
+A31B;W # YI SYLLABLE SEX
+A31C;W # YI SYLLABLE SE
+A31D;W # YI SYLLABLE SEP
+A31E;W # YI SYLLABLE SUT
+A31F;W # YI SYLLABLE SUX
+A320;W # YI SYLLABLE SU
+A321;W # YI SYLLABLE SUP
+A322;W # YI SYLLABLE SURX
+A323;W # YI SYLLABLE SUR
+A324;W # YI SYLLABLE SYT
+A325;W # YI SYLLABLE SYX
+A326;W # YI SYLLABLE SY
+A327;W # YI SYLLABLE SYP
+A328;W # YI SYLLABLE SYRX
+A329;W # YI SYLLABLE SYR
+A32A;W # YI SYLLABLE SSIT
+A32B;W # YI SYLLABLE SSIX
+A32C;W # YI SYLLABLE SSI
+A32D;W # YI SYLLABLE SSIP
+A32E;W # YI SYLLABLE SSIEX
+A32F;W # YI SYLLABLE SSIE
+A330;W # YI SYLLABLE SSIEP
+A331;W # YI SYLLABLE SSAT
+A332;W # YI SYLLABLE SSAX
+A333;W # YI SYLLABLE SSA
+A334;W # YI SYLLABLE SSAP
+A335;W # YI SYLLABLE SSOT
+A336;W # YI SYLLABLE SSOX
+A337;W # YI SYLLABLE SSO
+A338;W # YI SYLLABLE SSOP
+A339;W # YI SYLLABLE SSEX
+A33A;W # YI SYLLABLE SSE
+A33B;W # YI SYLLABLE SSEP
+A33C;W # YI SYLLABLE SSUT
+A33D;W # YI SYLLABLE SSUX
+A33E;W # YI SYLLABLE SSU
+A33F;W # YI SYLLABLE SSUP
+A340;W # YI SYLLABLE SSYT
+A341;W # YI SYLLABLE SSYX
+A342;W # YI SYLLABLE SSY
+A343;W # YI SYLLABLE SSYP
+A344;W # YI SYLLABLE SSYRX
+A345;W # YI SYLLABLE SSYR
+A346;W # YI SYLLABLE ZHAT
+A347;W # YI SYLLABLE ZHAX
+A348;W # YI SYLLABLE ZHA
+A349;W # YI SYLLABLE ZHAP
+A34A;W # YI SYLLABLE ZHUOX
+A34B;W # YI SYLLABLE ZHUO
+A34C;W # YI SYLLABLE ZHUOP
+A34D;W # YI SYLLABLE ZHOT
+A34E;W # YI SYLLABLE ZHOX
+A34F;W # YI SYLLABLE ZHO
+A350;W # YI SYLLABLE ZHOP
+A351;W # YI SYLLABLE ZHET
+A352;W # YI SYLLABLE ZHEX
+A353;W # YI SYLLABLE ZHE
+A354;W # YI SYLLABLE ZHEP
+A355;W # YI SYLLABLE ZHUT
+A356;W # YI SYLLABLE ZHUX
+A357;W # YI SYLLABLE ZHU
+A358;W # YI SYLLABLE ZHUP
+A359;W # YI SYLLABLE ZHURX
+A35A;W # YI SYLLABLE ZHUR
+A35B;W # YI SYLLABLE ZHYT
+A35C;W # YI SYLLABLE ZHYX
+A35D;W # YI SYLLABLE ZHY
+A35E;W # YI SYLLABLE ZHYP
+A35F;W # YI SYLLABLE ZHYRX
+A360;W # YI SYLLABLE ZHYR
+A361;W # YI SYLLABLE CHAT
+A362;W # YI SYLLABLE CHAX
+A363;W # YI SYLLABLE CHA
+A364;W # YI SYLLABLE CHAP
+A365;W # YI SYLLABLE CHUOT
+A366;W # YI SYLLABLE CHUOX
+A367;W # YI SYLLABLE CHUO
+A368;W # YI SYLLABLE CHUOP
+A369;W # YI SYLLABLE CHOT
+A36A;W # YI SYLLABLE CHOX
+A36B;W # YI SYLLABLE CHO
+A36C;W # YI SYLLABLE CHOP
+A36D;W # YI SYLLABLE CHET
+A36E;W # YI SYLLABLE CHEX
+A36F;W # YI SYLLABLE CHE
+A370;W # YI SYLLABLE CHEP
+A371;W # YI SYLLABLE CHUX
+A372;W # YI SYLLABLE CHU
+A373;W # YI SYLLABLE CHUP
+A374;W # YI SYLLABLE CHURX
+A375;W # YI SYLLABLE CHUR
+A376;W # YI SYLLABLE CHYT
+A377;W # YI SYLLABLE CHYX
+A378;W # YI SYLLABLE CHY
+A379;W # YI SYLLABLE CHYP
+A37A;W # YI SYLLABLE CHYRX
+A37B;W # YI SYLLABLE CHYR
+A37C;W # YI SYLLABLE RRAX
+A37D;W # YI SYLLABLE RRA
+A37E;W # YI SYLLABLE RRUOX
+A37F;W # YI SYLLABLE RRUO
+A380;W # YI SYLLABLE RROT
+A381;W # YI SYLLABLE RROX
+A382;W # YI SYLLABLE RRO
+A383;W # YI SYLLABLE RROP
+A384;W # YI SYLLABLE RRET
+A385;W # YI SYLLABLE RREX
+A386;W # YI SYLLABLE RRE
+A387;W # YI SYLLABLE RREP
+A388;W # YI SYLLABLE RRUT
+A389;W # YI SYLLABLE RRUX
+A38A;W # YI SYLLABLE RRU
+A38B;W # YI SYLLABLE RRUP
+A38C;W # YI SYLLABLE RRURX
+A38D;W # YI SYLLABLE RRUR
+A38E;W # YI SYLLABLE RRYT
+A38F;W # YI SYLLABLE RRYX
+A390;W # YI SYLLABLE RRY
+A391;W # YI SYLLABLE RRYP
+A392;W # YI SYLLABLE RRYRX
+A393;W # YI SYLLABLE RRYR
+A394;W # YI SYLLABLE NRAT
+A395;W # YI SYLLABLE NRAX
+A396;W # YI SYLLABLE NRA
+A397;W # YI SYLLABLE NRAP
+A398;W # YI SYLLABLE NROX
+A399;W # YI SYLLABLE NRO
+A39A;W # YI SYLLABLE NROP
+A39B;W # YI SYLLABLE NRET
+A39C;W # YI SYLLABLE NREX
+A39D;W # YI SYLLABLE NRE
+A39E;W # YI SYLLABLE NREP
+A39F;W # YI SYLLABLE NRUT
+A3A0;W # YI SYLLABLE NRUX
+A3A1;W # YI SYLLABLE NRU
+A3A2;W # YI SYLLABLE NRUP
+A3A3;W # YI SYLLABLE NRURX
+A3A4;W # YI SYLLABLE NRUR
+A3A5;W # YI SYLLABLE NRYT
+A3A6;W # YI SYLLABLE NRYX
+A3A7;W # YI SYLLABLE NRY
+A3A8;W # YI SYLLABLE NRYP
+A3A9;W # YI SYLLABLE NRYRX
+A3AA;W # YI SYLLABLE NRYR
+A3AB;W # YI SYLLABLE SHAT
+A3AC;W # YI SYLLABLE SHAX
+A3AD;W # YI SYLLABLE SHA
+A3AE;W # YI SYLLABLE SHAP
+A3AF;W # YI SYLLABLE SHUOX
+A3B0;W # YI SYLLABLE SHUO
+A3B1;W # YI SYLLABLE SHUOP
+A3B2;W # YI SYLLABLE SHOT
+A3B3;W # YI SYLLABLE SHOX
+A3B4;W # YI SYLLABLE SHO
+A3B5;W # YI SYLLABLE SHOP
+A3B6;W # YI SYLLABLE SHET
+A3B7;W # YI SYLLABLE SHEX
+A3B8;W # YI SYLLABLE SHE
+A3B9;W # YI SYLLABLE SHEP
+A3BA;W # YI SYLLABLE SHUT
+A3BB;W # YI SYLLABLE SHUX
+A3BC;W # YI SYLLABLE SHU
+A3BD;W # YI SYLLABLE SHUP
+A3BE;W # YI SYLLABLE SHURX
+A3BF;W # YI SYLLABLE SHUR
+A3C0;W # YI SYLLABLE SHYT
+A3C1;W # YI SYLLABLE SHYX
+A3C2;W # YI SYLLABLE SHY
+A3C3;W # YI SYLLABLE SHYP
+A3C4;W # YI SYLLABLE SHYRX
+A3C5;W # YI SYLLABLE SHYR
+A3C6;W # YI SYLLABLE RAT
+A3C7;W # YI SYLLABLE RAX
+A3C8;W # YI SYLLABLE RA
+A3C9;W # YI SYLLABLE RAP
+A3CA;W # YI SYLLABLE RUOX
+A3CB;W # YI SYLLABLE RUO
+A3CC;W # YI SYLLABLE RUOP
+A3CD;W # YI SYLLABLE ROT
+A3CE;W # YI SYLLABLE ROX
+A3CF;W # YI SYLLABLE RO
+A3D0;W # YI SYLLABLE ROP
+A3D1;W # YI SYLLABLE REX
+A3D2;W # YI SYLLABLE RE
+A3D3;W # YI SYLLABLE REP
+A3D4;W # YI SYLLABLE RUT
+A3D5;W # YI SYLLABLE RUX
+A3D6;W # YI SYLLABLE RU
+A3D7;W # YI SYLLABLE RUP
+A3D8;W # YI SYLLABLE RURX
+A3D9;W # YI SYLLABLE RUR
+A3DA;W # YI SYLLABLE RYT
+A3DB;W # YI SYLLABLE RYX
+A3DC;W # YI SYLLABLE RY
+A3DD;W # YI SYLLABLE RYP
+A3DE;W # YI SYLLABLE RYRX
+A3DF;W # YI SYLLABLE RYR
+A3E0;W # YI SYLLABLE JIT
+A3E1;W # YI SYLLABLE JIX
+A3E2;W # YI SYLLABLE JI
+A3E3;W # YI SYLLABLE JIP
+A3E4;W # YI SYLLABLE JIET
+A3E5;W # YI SYLLABLE JIEX
+A3E6;W # YI SYLLABLE JIE
+A3E7;W # YI SYLLABLE JIEP
+A3E8;W # YI SYLLABLE JUOT
+A3E9;W # YI SYLLABLE JUOX
+A3EA;W # YI SYLLABLE JUO
+A3EB;W # YI SYLLABLE JUOP
+A3EC;W # YI SYLLABLE JOT
+A3ED;W # YI SYLLABLE JOX
+A3EE;W # YI SYLLABLE JO
+A3EF;W # YI SYLLABLE JOP
+A3F0;W # YI SYLLABLE JUT
+A3F1;W # YI SYLLABLE JUX
+A3F2;W # YI SYLLABLE JU
+A3F3;W # YI SYLLABLE JUP
+A3F4;W # YI SYLLABLE JURX
+A3F5;W # YI SYLLABLE JUR
+A3F6;W # YI SYLLABLE JYT
+A3F7;W # YI SYLLABLE JYX
+A3F8;W # YI SYLLABLE JY
+A3F9;W # YI SYLLABLE JYP
+A3FA;W # YI SYLLABLE JYRX
+A3FB;W # YI SYLLABLE JYR
+A3FC;W # YI SYLLABLE QIT
+A3FD;W # YI SYLLABLE QIX
+A3FE;W # YI SYLLABLE QI
+A3FF;W # YI SYLLABLE QIP
+A400;W # YI SYLLABLE QIET
+A401;W # YI SYLLABLE QIEX
+A402;W # YI SYLLABLE QIE
+A403;W # YI SYLLABLE QIEP
+A404;W # YI SYLLABLE QUOT
+A405;W # YI SYLLABLE QUOX
+A406;W # YI SYLLABLE QUO
+A407;W # YI SYLLABLE QUOP
+A408;W # YI SYLLABLE QOT
+A409;W # YI SYLLABLE QOX
+A40A;W # YI SYLLABLE QO
+A40B;W # YI SYLLABLE QOP
+A40C;W # YI SYLLABLE QUT
+A40D;W # YI SYLLABLE QUX
+A40E;W # YI SYLLABLE QU
+A40F;W # YI SYLLABLE QUP
+A410;W # YI SYLLABLE QURX
+A411;W # YI SYLLABLE QUR
+A412;W # YI SYLLABLE QYT
+A413;W # YI SYLLABLE QYX
+A414;W # YI SYLLABLE QY
+A415;W # YI SYLLABLE QYP
+A416;W # YI SYLLABLE QYRX
+A417;W # YI SYLLABLE QYR
+A418;W # YI SYLLABLE JJIT
+A419;W # YI SYLLABLE JJIX
+A41A;W # YI SYLLABLE JJI
+A41B;W # YI SYLLABLE JJIP
+A41C;W # YI SYLLABLE JJIET
+A41D;W # YI SYLLABLE JJIEX
+A41E;W # YI SYLLABLE JJIE
+A41F;W # YI SYLLABLE JJIEP
+A420;W # YI SYLLABLE JJUOX
+A421;W # YI SYLLABLE JJUO
+A422;W # YI SYLLABLE JJUOP
+A423;W # YI SYLLABLE JJOT
+A424;W # YI SYLLABLE JJOX
+A425;W # YI SYLLABLE JJO
+A426;W # YI SYLLABLE JJOP
+A427;W # YI SYLLABLE JJUT
+A428;W # YI SYLLABLE JJUX
+A429;W # YI SYLLABLE JJU
+A42A;W # YI SYLLABLE JJUP
+A42B;W # YI SYLLABLE JJURX
+A42C;W # YI SYLLABLE JJUR
+A42D;W # YI SYLLABLE JJYT
+A42E;W # YI SYLLABLE JJYX
+A42F;W # YI SYLLABLE JJY
+A430;W # YI SYLLABLE JJYP
+A431;W # YI SYLLABLE NJIT
+A432;W # YI SYLLABLE NJIX
+A433;W # YI SYLLABLE NJI
+A434;W # YI SYLLABLE NJIP
+A435;W # YI SYLLABLE NJIET
+A436;W # YI SYLLABLE NJIEX
+A437;W # YI SYLLABLE NJIE
+A438;W # YI SYLLABLE NJIEP
+A439;W # YI SYLLABLE NJUOX
+A43A;W # YI SYLLABLE NJUO
+A43B;W # YI SYLLABLE NJOT
+A43C;W # YI SYLLABLE NJOX
+A43D;W # YI SYLLABLE NJO
+A43E;W # YI SYLLABLE NJOP
+A43F;W # YI SYLLABLE NJUX
+A440;W # YI SYLLABLE NJU
+A441;W # YI SYLLABLE NJUP
+A442;W # YI SYLLABLE NJURX
+A443;W # YI SYLLABLE NJUR
+A444;W # YI SYLLABLE NJYT
+A445;W # YI SYLLABLE NJYX
+A446;W # YI SYLLABLE NJY
+A447;W # YI SYLLABLE NJYP
+A448;W # YI SYLLABLE NJYRX
+A449;W # YI SYLLABLE NJYR
+A44A;W # YI SYLLABLE NYIT
+A44B;W # YI SYLLABLE NYIX
+A44C;W # YI SYLLABLE NYI
+A44D;W # YI SYLLABLE NYIP
+A44E;W # YI SYLLABLE NYIET
+A44F;W # YI SYLLABLE NYIEX
+A450;W # YI SYLLABLE NYIE
+A451;W # YI SYLLABLE NYIEP
+A452;W # YI SYLLABLE NYUOX
+A453;W # YI SYLLABLE NYUO
+A454;W # YI SYLLABLE NYUOP
+A455;W # YI SYLLABLE NYOT
+A456;W # YI SYLLABLE NYOX
+A457;W # YI SYLLABLE NYO
+A458;W # YI SYLLABLE NYOP
+A459;W # YI SYLLABLE NYUT
+A45A;W # YI SYLLABLE NYUX
+A45B;W # YI SYLLABLE NYU
+A45C;W # YI SYLLABLE NYUP
+A45D;W # YI SYLLABLE XIT
+A45E;W # YI SYLLABLE XIX
+A45F;W # YI SYLLABLE XI
+A460;W # YI SYLLABLE XIP
+A461;W # YI SYLLABLE XIET
+A462;W # YI SYLLABLE XIEX
+A463;W # YI SYLLABLE XIE
+A464;W # YI SYLLABLE XIEP
+A465;W # YI SYLLABLE XUOX
+A466;W # YI SYLLABLE XUO
+A467;W # YI SYLLABLE XOT
+A468;W # YI SYLLABLE XOX
+A469;W # YI SYLLABLE XO
+A46A;W # YI SYLLABLE XOP
+A46B;W # YI SYLLABLE XYT
+A46C;W # YI SYLLABLE XYX
+A46D;W # YI SYLLABLE XY
+A46E;W # YI SYLLABLE XYP
+A46F;W # YI SYLLABLE XYRX
+A470;W # YI SYLLABLE XYR
+A471;W # YI SYLLABLE YIT
+A472;W # YI SYLLABLE YIX
+A473;W # YI SYLLABLE YI
+A474;W # YI SYLLABLE YIP
+A475;W # YI SYLLABLE YIET
+A476;W # YI SYLLABLE YIEX
+A477;W # YI SYLLABLE YIE
+A478;W # YI SYLLABLE YIEP
+A479;W # YI SYLLABLE YUOT
+A47A;W # YI SYLLABLE YUOX
+A47B;W # YI SYLLABLE YUO
+A47C;W # YI SYLLABLE YUOP
+A47D;W # YI SYLLABLE YOT
+A47E;W # YI SYLLABLE YOX
+A47F;W # YI SYLLABLE YO
+A480;W # YI SYLLABLE YOP
+A481;W # YI SYLLABLE YUT
+A482;W # YI SYLLABLE YUX
+A483;W # YI SYLLABLE YU
+A484;W # YI SYLLABLE YUP
+A485;W # YI SYLLABLE YURX
+A486;W # YI SYLLABLE YUR
+A487;W # YI SYLLABLE YYT
+A488;W # YI SYLLABLE YYX
+A489;W # YI SYLLABLE YY
+A48A;W # YI SYLLABLE YYP
+A48B;W # YI SYLLABLE YYRX
+A48C;W # YI SYLLABLE YYR
+A490;W # YI RADICAL QOT
+A491;W # YI RADICAL LI
+A492;W # YI RADICAL KIT
+A493;W # YI RADICAL NYIP
+A494;W # YI RADICAL CYP
+A495;W # YI RADICAL SSI
+A496;W # YI RADICAL GGOP
+A497;W # YI RADICAL GEP
+A498;W # YI RADICAL MI
+A499;W # YI RADICAL HXIT
+A49A;W # YI RADICAL LYR
+A49B;W # YI RADICAL BBUT
+A49C;W # YI RADICAL MOP
+A49D;W # YI RADICAL YO
+A49E;W # YI RADICAL PUT
+A49F;W # YI RADICAL HXUO
+A4A0;W # YI RADICAL TAT
+A4A1;W # YI RADICAL GA
+A4A2;W # YI RADICAL ZUP
+A4A3;W # YI RADICAL CYT
+A4A4;W # YI RADICAL DDUR
+A4A5;W # YI RADICAL BUR
+A4A6;W # YI RADICAL GGUO
+A4A7;W # YI RADICAL NYOP
+A4A8;W # YI RADICAL TU
+A4A9;W # YI RADICAL OP
+A4AA;W # YI RADICAL JJUT
+A4AB;W # YI RADICAL ZOT
+A4AC;W # YI RADICAL PYT
+A4AD;W # YI RADICAL HMO
+A4AE;W # YI RADICAL YIT
+A4AF;W # YI RADICAL VUR
+A4B0;W # YI RADICAL SHY
+A4B1;W # YI RADICAL VEP
+A4B2;W # YI RADICAL ZA
+A4B3;W # YI RADICAL JO
+A4B4;W # YI RADICAL NZUP
+A4B5;W # YI RADICAL JJY
+A4B6;W # YI RADICAL GOT
+A4B7;W # YI RADICAL JJIE
+A4B8;W # YI RADICAL WO
+A4B9;W # YI RADICAL DU
+A4BA;W # YI RADICAL SHUR
+A4BB;W # YI RADICAL LIE
+A4BC;W # YI RADICAL CY
+A4BD;W # YI RADICAL CUOP
+A4BE;W # YI RADICAL CIP
+A4BF;W # YI RADICAL HXOP
+A4C0;W # YI RADICAL SHAT
+A4C1;W # YI RADICAL ZUR
+A4C2;W # YI RADICAL SHOP
+A4C3;W # YI RADICAL CHE
+A4C4;W # YI RADICAL ZZIET
+A4C5;W # YI RADICAL NBIE
+A4C6;W # YI RADICAL KE
+A500;N # VAI SYLLABLE EE
+A501;N # VAI SYLLABLE EEN
+A502;N # VAI SYLLABLE HEE
+A503;N # VAI SYLLABLE WEE
+A504;N # VAI SYLLABLE WEEN
+A505;N # VAI SYLLABLE PEE
+A506;N # VAI SYLLABLE BHEE
+A507;N # VAI SYLLABLE BEE
+A508;N # VAI SYLLABLE MBEE
+A509;N # VAI SYLLABLE KPEE
+A50A;N # VAI SYLLABLE MGBEE
+A50B;N # VAI SYLLABLE GBEE
+A50C;N # VAI SYLLABLE FEE
+A50D;N # VAI SYLLABLE VEE
+A50E;N # VAI SYLLABLE TEE
+A50F;N # VAI SYLLABLE THEE
+A510;N # VAI SYLLABLE DHEE
+A511;N # VAI SYLLABLE DHHEE
+A512;N # VAI SYLLABLE LEE
+A513;N # VAI SYLLABLE REE
+A514;N # VAI SYLLABLE DEE
+A515;N # VAI SYLLABLE NDEE
+A516;N # VAI SYLLABLE SEE
+A517;N # VAI SYLLABLE SHEE
+A518;N # VAI SYLLABLE ZEE
+A519;N # VAI SYLLABLE ZHEE
+A51A;N # VAI SYLLABLE CEE
+A51B;N # VAI SYLLABLE JEE
+A51C;N # VAI SYLLABLE NJEE
+A51D;N # VAI SYLLABLE YEE
+A51E;N # VAI SYLLABLE KEE
+A51F;N # VAI SYLLABLE NGGEE
+A520;N # VAI SYLLABLE GEE
+A521;N # VAI SYLLABLE MEE
+A522;N # VAI SYLLABLE NEE
+A523;N # VAI SYLLABLE NYEE
+A524;N # VAI SYLLABLE I
+A525;N # VAI SYLLABLE IN
+A526;N # VAI SYLLABLE HI
+A527;N # VAI SYLLABLE HIN
+A528;N # VAI SYLLABLE WI
+A529;N # VAI SYLLABLE WIN
+A52A;N # VAI SYLLABLE PI
+A52B;N # VAI SYLLABLE BHI
+A52C;N # VAI SYLLABLE BI
+A52D;N # VAI SYLLABLE MBI
+A52E;N # VAI SYLLABLE KPI
+A52F;N # VAI SYLLABLE MGBI
+A530;N # VAI SYLLABLE GBI
+A531;N # VAI SYLLABLE FI
+A532;N # VAI SYLLABLE VI
+A533;N # VAI SYLLABLE TI
+A534;N # VAI SYLLABLE THI
+A535;N # VAI SYLLABLE DHI
+A536;N # VAI SYLLABLE DHHI
+A537;N # VAI SYLLABLE LI
+A538;N # VAI SYLLABLE RI
+A539;N # VAI SYLLABLE DI
+A53A;N # VAI SYLLABLE NDI
+A53B;N # VAI SYLLABLE SI
+A53C;N # VAI SYLLABLE SHI
+A53D;N # VAI SYLLABLE ZI
+A53E;N # VAI SYLLABLE ZHI
+A53F;N # VAI SYLLABLE CI
+A540;N # VAI SYLLABLE JI
+A541;N # VAI SYLLABLE NJI
+A542;N # VAI SYLLABLE YI
+A543;N # VAI SYLLABLE KI
+A544;N # VAI SYLLABLE NGGI
+A545;N # VAI SYLLABLE GI
+A546;N # VAI SYLLABLE MI
+A547;N # VAI SYLLABLE NI
+A548;N # VAI SYLLABLE NYI
+A549;N # VAI SYLLABLE A
+A54A;N # VAI SYLLABLE AN
+A54B;N # VAI SYLLABLE NGAN
+A54C;N # VAI SYLLABLE HA
+A54D;N # VAI SYLLABLE HAN
+A54E;N # VAI SYLLABLE WA
+A54F;N # VAI SYLLABLE WAN
+A550;N # VAI SYLLABLE PA
+A551;N # VAI SYLLABLE BHA
+A552;N # VAI SYLLABLE BA
+A553;N # VAI SYLLABLE MBA
+A554;N # VAI SYLLABLE KPA
+A555;N # VAI SYLLABLE KPAN
+A556;N # VAI SYLLABLE MGBA
+A557;N # VAI SYLLABLE GBA
+A558;N # VAI SYLLABLE FA
+A559;N # VAI SYLLABLE VA
+A55A;N # VAI SYLLABLE TA
+A55B;N # VAI SYLLABLE THA
+A55C;N # VAI SYLLABLE DHA
+A55D;N # VAI SYLLABLE DHHA
+A55E;N # VAI SYLLABLE LA
+A55F;N # VAI SYLLABLE RA
+A560;N # VAI SYLLABLE DA
+A561;N # VAI SYLLABLE NDA
+A562;N # VAI SYLLABLE SA
+A563;N # VAI SYLLABLE SHA
+A564;N # VAI SYLLABLE ZA
+A565;N # VAI SYLLABLE ZHA
+A566;N # VAI SYLLABLE CA
+A567;N # VAI SYLLABLE JA
+A568;N # VAI SYLLABLE NJA
+A569;N # VAI SYLLABLE YA
+A56A;N # VAI SYLLABLE KA
+A56B;N # VAI SYLLABLE KAN
+A56C;N # VAI SYLLABLE NGGA
+A56D;N # VAI SYLLABLE GA
+A56E;N # VAI SYLLABLE MA
+A56F;N # VAI SYLLABLE NA
+A570;N # VAI SYLLABLE NYA
+A571;N # VAI SYLLABLE OO
+A572;N # VAI SYLLABLE OON
+A573;N # VAI SYLLABLE HOO
+A574;N # VAI SYLLABLE WOO
+A575;N # VAI SYLLABLE WOON
+A576;N # VAI SYLLABLE POO
+A577;N # VAI SYLLABLE BHOO
+A578;N # VAI SYLLABLE BOO
+A579;N # VAI SYLLABLE MBOO
+A57A;N # VAI SYLLABLE KPOO
+A57B;N # VAI SYLLABLE MGBOO
+A57C;N # VAI SYLLABLE GBOO
+A57D;N # VAI SYLLABLE FOO
+A57E;N # VAI SYLLABLE VOO
+A57F;N # VAI SYLLABLE TOO
+A580;N # VAI SYLLABLE THOO
+A581;N # VAI SYLLABLE DHOO
+A582;N # VAI SYLLABLE DHHOO
+A583;N # VAI SYLLABLE LOO
+A584;N # VAI SYLLABLE ROO
+A585;N # VAI SYLLABLE DOO
+A586;N # VAI SYLLABLE NDOO
+A587;N # VAI SYLLABLE SOO
+A588;N # VAI SYLLABLE SHOO
+A589;N # VAI SYLLABLE ZOO
+A58A;N # VAI SYLLABLE ZHOO
+A58B;N # VAI SYLLABLE COO
+A58C;N # VAI SYLLABLE JOO
+A58D;N # VAI SYLLABLE NJOO
+A58E;N # VAI SYLLABLE YOO
+A58F;N # VAI SYLLABLE KOO
+A590;N # VAI SYLLABLE NGGOO
+A591;N # VAI SYLLABLE GOO
+A592;N # VAI SYLLABLE MOO
+A593;N # VAI SYLLABLE NOO
+A594;N # VAI SYLLABLE NYOO
+A595;N # VAI SYLLABLE U
+A596;N # VAI SYLLABLE UN
+A597;N # VAI SYLLABLE HU
+A598;N # VAI SYLLABLE HUN
+A599;N # VAI SYLLABLE WU
+A59A;N # VAI SYLLABLE WUN
+A59B;N # VAI SYLLABLE PU
+A59C;N # VAI SYLLABLE BHU
+A59D;N # VAI SYLLABLE BU
+A59E;N # VAI SYLLABLE MBU
+A59F;N # VAI SYLLABLE KPU
+A5A0;N # VAI SYLLABLE MGBU
+A5A1;N # VAI SYLLABLE GBU
+A5A2;N # VAI SYLLABLE FU
+A5A3;N # VAI SYLLABLE VU
+A5A4;N # VAI SYLLABLE TU
+A5A5;N # VAI SYLLABLE THU
+A5A6;N # VAI SYLLABLE DHU
+A5A7;N # VAI SYLLABLE DHHU
+A5A8;N # VAI SYLLABLE LU
+A5A9;N # VAI SYLLABLE RU
+A5AA;N # VAI SYLLABLE DU
+A5AB;N # VAI SYLLABLE NDU
+A5AC;N # VAI SYLLABLE SU
+A5AD;N # VAI SYLLABLE SHU
+A5AE;N # VAI SYLLABLE ZU
+A5AF;N # VAI SYLLABLE ZHU
+A5B0;N # VAI SYLLABLE CU
+A5B1;N # VAI SYLLABLE JU
+A5B2;N # VAI SYLLABLE NJU
+A5B3;N # VAI SYLLABLE YU
+A5B4;N # VAI SYLLABLE KU
+A5B5;N # VAI SYLLABLE NGGU
+A5B6;N # VAI SYLLABLE GU
+A5B7;N # VAI SYLLABLE MU
+A5B8;N # VAI SYLLABLE NU
+A5B9;N # VAI SYLLABLE NYU
+A5BA;N # VAI SYLLABLE O
+A5BB;N # VAI SYLLABLE ON
+A5BC;N # VAI SYLLABLE NGON
+A5BD;N # VAI SYLLABLE HO
+A5BE;N # VAI SYLLABLE HON
+A5BF;N # VAI SYLLABLE WO
+A5C0;N # VAI SYLLABLE WON
+A5C1;N # VAI SYLLABLE PO
+A5C2;N # VAI SYLLABLE BHO
+A5C3;N # VAI SYLLABLE BO
+A5C4;N # VAI SYLLABLE MBO
+A5C5;N # VAI SYLLABLE KPO
+A5C6;N # VAI SYLLABLE MGBO
+A5C7;N # VAI SYLLABLE GBO
+A5C8;N # VAI SYLLABLE GBON
+A5C9;N # VAI SYLLABLE FO
+A5CA;N # VAI SYLLABLE VO
+A5CB;N # VAI SYLLABLE TO
+A5CC;N # VAI SYLLABLE THO
+A5CD;N # VAI SYLLABLE DHO
+A5CE;N # VAI SYLLABLE DHHO
+A5CF;N # VAI SYLLABLE LO
+A5D0;N # VAI SYLLABLE RO
+A5D1;N # VAI SYLLABLE DO
+A5D2;N # VAI SYLLABLE NDO
+A5D3;N # VAI SYLLABLE SO
+A5D4;N # VAI SYLLABLE SHO
+A5D5;N # VAI SYLLABLE ZO
+A5D6;N # VAI SYLLABLE ZHO
+A5D7;N # VAI SYLLABLE CO
+A5D8;N # VAI SYLLABLE JO
+A5D9;N # VAI SYLLABLE NJO
+A5DA;N # VAI SYLLABLE YO
+A5DB;N # VAI SYLLABLE KO
+A5DC;N # VAI SYLLABLE NGGO
+A5DD;N # VAI SYLLABLE GO
+A5DE;N # VAI SYLLABLE MO
+A5DF;N # VAI SYLLABLE NO
+A5E0;N # VAI SYLLABLE NYO
+A5E1;N # VAI SYLLABLE E
+A5E2;N # VAI SYLLABLE EN
+A5E3;N # VAI SYLLABLE NGEN
+A5E4;N # VAI SYLLABLE HE
+A5E5;N # VAI SYLLABLE HEN
+A5E6;N # VAI SYLLABLE WE
+A5E7;N # VAI SYLLABLE WEN
+A5E8;N # VAI SYLLABLE PE
+A5E9;N # VAI SYLLABLE BHE
+A5EA;N # VAI SYLLABLE BE
+A5EB;N # VAI SYLLABLE MBE
+A5EC;N # VAI SYLLABLE KPE
+A5ED;N # VAI SYLLABLE KPEN
+A5EE;N # VAI SYLLABLE MGBE
+A5EF;N # VAI SYLLABLE GBE
+A5F0;N # VAI SYLLABLE GBEN
+A5F1;N # VAI SYLLABLE FE
+A5F2;N # VAI SYLLABLE VE
+A5F3;N # VAI SYLLABLE TE
+A5F4;N # VAI SYLLABLE THE
+A5F5;N # VAI SYLLABLE DHE
+A5F6;N # VAI SYLLABLE DHHE
+A5F7;N # VAI SYLLABLE LE
+A5F8;N # VAI SYLLABLE RE
+A5F9;N # VAI SYLLABLE DE
+A5FA;N # VAI SYLLABLE NDE
+A5FB;N # VAI SYLLABLE SE
+A5FC;N # VAI SYLLABLE SHE
+A5FD;N # VAI SYLLABLE ZE
+A5FE;N # VAI SYLLABLE ZHE
+A5FF;N # VAI SYLLABLE CE
+A600;N # VAI SYLLABLE JE
+A601;N # VAI SYLLABLE NJE
+A602;N # VAI SYLLABLE YE
+A603;N # VAI SYLLABLE KE
+A604;N # VAI SYLLABLE NGGE
+A605;N # VAI SYLLABLE NGGEN
+A606;N # VAI SYLLABLE GE
+A607;N # VAI SYLLABLE GEN
+A608;N # VAI SYLLABLE ME
+A609;N # VAI SYLLABLE NE
+A60A;N # VAI SYLLABLE NYE
+A60B;N # VAI SYLLABLE NG
+A60C;N # VAI SYLLABLE LENGTHENER
+A60D;N # VAI COMMA
+A60E;N # VAI FULL STOP
+A60F;N # VAI QUESTION MARK
+A610;N # VAI SYLLABLE NDOLE FA
+A611;N # VAI SYLLABLE NDOLE KA
+A612;N # VAI SYLLABLE NDOLE SOO
+A613;N # VAI SYMBOL FEENG
+A614;N # VAI SYMBOL KEENG
+A615;N # VAI SYMBOL TING
+A616;N # VAI SYMBOL NII
+A617;N # VAI SYMBOL BANG
+A618;N # VAI SYMBOL FAA
+A619;N # VAI SYMBOL TAA
+A61A;N # VAI SYMBOL DANG
+A61B;N # VAI SYMBOL DOONG
+A61C;N # VAI SYMBOL KUNG
+A61D;N # VAI SYMBOL TONG
+A61E;N # VAI SYMBOL DO-O
+A61F;N # VAI SYMBOL JONG
+A620;N # VAI DIGIT ZERO
+A621;N # VAI DIGIT ONE
+A622;N # VAI DIGIT TWO
+A623;N # VAI DIGIT THREE
+A624;N # VAI DIGIT FOUR
+A625;N # VAI DIGIT FIVE
+A626;N # VAI DIGIT SIX
+A627;N # VAI DIGIT SEVEN
+A628;N # VAI DIGIT EIGHT
+A629;N # VAI DIGIT NINE
+A62A;N # VAI SYLLABLE NDOLE MA
+A62B;N # VAI SYLLABLE NDOLE DO
+A640;N # CYRILLIC CAPITAL LETTER ZEMLYA
+A641;N # CYRILLIC SMALL LETTER ZEMLYA
+A642;N # CYRILLIC CAPITAL LETTER DZELO
+A643;N # CYRILLIC SMALL LETTER DZELO
+A644;N # CYRILLIC CAPITAL LETTER REVERSED DZE
+A645;N # CYRILLIC SMALL LETTER REVERSED DZE
+A646;N # CYRILLIC CAPITAL LETTER IOTA
+A647;N # CYRILLIC SMALL LETTER IOTA
+A648;N # CYRILLIC CAPITAL LETTER DJERV
+A649;N # CYRILLIC SMALL LETTER DJERV
+A64A;N # CYRILLIC CAPITAL LETTER MONOGRAPH UK
+A64B;N # CYRILLIC SMALL LETTER MONOGRAPH UK
+A64C;N # CYRILLIC CAPITAL LETTER BROAD OMEGA
+A64D;N # CYRILLIC SMALL LETTER BROAD OMEGA
+A64E;N # CYRILLIC CAPITAL LETTER NEUTRAL YER
+A64F;N # CYRILLIC SMALL LETTER NEUTRAL YER
+A650;N # CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+A651;N # CYRILLIC SMALL LETTER YERU WITH BACK YER
+A652;N # CYRILLIC CAPITAL LETTER IOTIFIED YAT
+A653;N # CYRILLIC SMALL LETTER IOTIFIED YAT
+A654;N # CYRILLIC CAPITAL LETTER REVERSED YU
+A655;N # CYRILLIC SMALL LETTER REVERSED YU
+A656;N # CYRILLIC CAPITAL LETTER IOTIFIED A
+A657;N # CYRILLIC SMALL LETTER IOTIFIED A
+A658;N # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+A659;N # CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+A65A;N # CYRILLIC CAPITAL LETTER BLENDED YUS
+A65B;N # CYRILLIC SMALL LETTER BLENDED YUS
+A65C;N # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+A65D;N # CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+A65E;N # CYRILLIC CAPITAL LETTER YN
+A65F;N # CYRILLIC SMALL LETTER YN
+A662;N # CYRILLIC CAPITAL LETTER SOFT DE
+A663;N # CYRILLIC SMALL LETTER SOFT DE
+A664;N # CYRILLIC CAPITAL LETTER SOFT EL
+A665;N # CYRILLIC SMALL LETTER SOFT EL
+A666;N # CYRILLIC CAPITAL LETTER SOFT EM
+A667;N # CYRILLIC SMALL LETTER SOFT EM
+A668;N # CYRILLIC CAPITAL LETTER MONOCULAR O
+A669;N # CYRILLIC SMALL LETTER MONOCULAR O
+A66A;N # CYRILLIC CAPITAL LETTER BINOCULAR O
+A66B;N # CYRILLIC SMALL LETTER BINOCULAR O
+A66C;N # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+A66D;N # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E;N # CYRILLIC LETTER MULTIOCULAR O
+A66F;N # COMBINING CYRILLIC VZMET
+A670;N # COMBINING CYRILLIC TEN MILLIONS SIGN
+A671;N # COMBINING CYRILLIC HUNDRED MILLIONS SIGN
+A672;N # COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A673;N # SLAVONIC ASTERISK
+A67C;N # COMBINING CYRILLIC KAVYKA
+A67D;N # COMBINING CYRILLIC PAYEROK
+A67E;N # CYRILLIC KAVYKA
+A67F;N # CYRILLIC PAYEROK
+A680;N # CYRILLIC CAPITAL LETTER DWE
+A681;N # CYRILLIC SMALL LETTER DWE
+A682;N # CYRILLIC CAPITAL LETTER DZWE
+A683;N # CYRILLIC SMALL LETTER DZWE
+A684;N # CYRILLIC CAPITAL LETTER ZHWE
+A685;N # CYRILLIC SMALL LETTER ZHWE
+A686;N # CYRILLIC CAPITAL LETTER CCHE
+A687;N # CYRILLIC SMALL LETTER CCHE
+A688;N # CYRILLIC CAPITAL LETTER DZZE
+A689;N # CYRILLIC SMALL LETTER DZZE
+A68A;N # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+A68B;N # CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+A68C;N # CYRILLIC CAPITAL LETTER TWE
+A68D;N # CYRILLIC SMALL LETTER TWE
+A68E;N # CYRILLIC CAPITAL LETTER TSWE
+A68F;N # CYRILLIC SMALL LETTER TSWE
+A690;N # CYRILLIC CAPITAL LETTER TSSE
+A691;N # CYRILLIC SMALL LETTER TSSE
+A692;N # CYRILLIC CAPITAL LETTER TCHE
+A693;N # CYRILLIC SMALL LETTER TCHE
+A694;N # CYRILLIC CAPITAL LETTER HWE
+A695;N # CYRILLIC SMALL LETTER HWE
+A696;N # CYRILLIC CAPITAL LETTER SHWE
+A697;N # CYRILLIC SMALL LETTER SHWE
+A700;N # MODIFIER LETTER CHINESE TONE YIN PING
+A701;N # MODIFIER LETTER CHINESE TONE YANG PING
+A702;N # MODIFIER LETTER CHINESE TONE YIN SHANG
+A703;N # MODIFIER LETTER CHINESE TONE YANG SHANG
+A704;N # MODIFIER LETTER CHINESE TONE YIN QU
+A705;N # MODIFIER LETTER CHINESE TONE YANG QU
+A706;N # MODIFIER LETTER CHINESE TONE YIN RU
+A707;N # MODIFIER LETTER CHINESE TONE YANG RU
+A708;N # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR
+A709;N # MODIFIER LETTER HIGH DOTTED TONE BAR
+A70A;N # MODIFIER LETTER MID DOTTED TONE BAR
+A70B;N # MODIFIER LETTER LOW DOTTED TONE BAR
+A70C;N # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR
+A70D;N # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR
+A70E;N # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR
+A70F;N # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR
+A710;N # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR
+A711;N # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR
+A712;N # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR
+A713;N # MODIFIER LETTER HIGH LEFT-STEM TONE BAR
+A714;N # MODIFIER LETTER MID LEFT-STEM TONE BAR
+A715;N # MODIFIER LETTER LOW LEFT-STEM TONE BAR
+A716;N # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717;N # MODIFIER LETTER DOT VERTICAL BAR
+A718;N # MODIFIER LETTER DOT SLASH
+A719;N # MODIFIER LETTER DOT HORIZONTAL BAR
+A71A;N # MODIFIER LETTER LOWER RIGHT CORNER ANGLE
+A71B;N # MODIFIER LETTER RAISED UP ARROW
+A71C;N # MODIFIER LETTER RAISED DOWN ARROW
+A71D;N # MODIFIER LETTER RAISED EXCLAMATION MARK
+A71E;N # MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK
+A71F;N # MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720;N # MODIFIER LETTER STRESS AND HIGH TONE
+A721;N # MODIFIER LETTER STRESS AND LOW TONE
+A722;N # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+A723;N # LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+A724;N # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+A725;N # LATIN SMALL LETTER EGYPTOLOGICAL AIN
+A726;N # LATIN CAPITAL LETTER HENG
+A727;N # LATIN SMALL LETTER HENG
+A728;N # LATIN CAPITAL LETTER TZ
+A729;N # LATIN SMALL LETTER TZ
+A72A;N # LATIN CAPITAL LETTER TRESILLO
+A72B;N # LATIN SMALL LETTER TRESILLO
+A72C;N # LATIN CAPITAL LETTER CUATRILLO
+A72D;N # LATIN SMALL LETTER CUATRILLO
+A72E;N # LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+A72F;N # LATIN SMALL LETTER CUATRILLO WITH COMMA
+A730;N # LATIN LETTER SMALL CAPITAL F
+A731;N # LATIN LETTER SMALL CAPITAL S
+A732;N # LATIN CAPITAL LETTER AA
+A733;N # LATIN SMALL LETTER AA
+A734;N # LATIN CAPITAL LETTER AO
+A735;N # LATIN SMALL LETTER AO
+A736;N # LATIN CAPITAL LETTER AU
+A737;N # LATIN SMALL LETTER AU
+A738;N # LATIN CAPITAL LETTER AV
+A739;N # LATIN SMALL LETTER AV
+A73A;N # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+A73B;N # LATIN SMALL LETTER AV WITH HORIZONTAL BAR
+A73C;N # LATIN CAPITAL LETTER AY
+A73D;N # LATIN SMALL LETTER AY
+A73E;N # LATIN CAPITAL LETTER REVERSED C WITH DOT
+A73F;N # LATIN SMALL LETTER REVERSED C WITH DOT
+A740;N # LATIN CAPITAL LETTER K WITH STROKE
+A741;N # LATIN SMALL LETTER K WITH STROKE
+A742;N # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+A743;N # LATIN SMALL LETTER K WITH DIAGONAL STROKE
+A744;N # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+A745;N # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+A746;N # LATIN CAPITAL LETTER BROKEN L
+A747;N # LATIN SMALL LETTER BROKEN L
+A748;N # LATIN CAPITAL LETTER L WITH HIGH STROKE
+A749;N # LATIN SMALL LETTER L WITH HIGH STROKE
+A74A;N # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+A74B;N # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+A74C;N # LATIN CAPITAL LETTER O WITH LOOP
+A74D;N # LATIN SMALL LETTER O WITH LOOP
+A74E;N # LATIN CAPITAL LETTER OO
+A74F;N # LATIN SMALL LETTER OO
+A750;N # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+A751;N # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+A752;N # LATIN CAPITAL LETTER P WITH FLOURISH
+A753;N # LATIN SMALL LETTER P WITH FLOURISH
+A754;N # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+A755;N # LATIN SMALL LETTER P WITH SQUIRREL TAIL
+A756;N # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+A757;N # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+A758;N # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+A759;N # LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+A75A;N # LATIN CAPITAL LETTER R ROTUNDA
+A75B;N # LATIN SMALL LETTER R ROTUNDA
+A75C;N # LATIN CAPITAL LETTER RUM ROTUNDA
+A75D;N # LATIN SMALL LETTER RUM ROTUNDA
+A75E;N # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+A75F;N # LATIN SMALL LETTER V WITH DIAGONAL STROKE
+A760;N # LATIN CAPITAL LETTER VY
+A761;N # LATIN SMALL LETTER VY
+A762;N # LATIN CAPITAL LETTER VISIGOTHIC Z
+A763;N # LATIN SMALL LETTER VISIGOTHIC Z
+A764;N # LATIN CAPITAL LETTER THORN WITH STROKE
+A765;N # LATIN SMALL LETTER THORN WITH STROKE
+A766;N # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+A767;N # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+A768;N # LATIN CAPITAL LETTER VEND
+A769;N # LATIN SMALL LETTER VEND
+A76A;N # LATIN CAPITAL LETTER ET
+A76B;N # LATIN SMALL LETTER ET
+A76C;N # LATIN CAPITAL LETTER IS
+A76D;N # LATIN SMALL LETTER IS
+A76E;N # LATIN CAPITAL LETTER CON
+A76F;N # LATIN SMALL LETTER CON
+A770;N # MODIFIER LETTER US
+A771;N # LATIN SMALL LETTER DUM
+A772;N # LATIN SMALL LETTER LUM
+A773;N # LATIN SMALL LETTER MUM
+A774;N # LATIN SMALL LETTER NUM
+A775;N # LATIN SMALL LETTER RUM
+A776;N # LATIN LETTER SMALL CAPITAL RUM
+A777;N # LATIN SMALL LETTER TUM
+A778;N # LATIN SMALL LETTER UM
+A779;N # LATIN CAPITAL LETTER INSULAR D
+A77A;N # LATIN SMALL LETTER INSULAR D
+A77B;N # LATIN CAPITAL LETTER INSULAR F
+A77C;N # LATIN SMALL LETTER INSULAR F
+A77D;N # LATIN CAPITAL LETTER INSULAR G
+A77E;N # LATIN CAPITAL LETTER TURNED INSULAR G
+A77F;N # LATIN SMALL LETTER TURNED INSULAR G
+A780;N # LATIN CAPITAL LETTER TURNED L
+A781;N # LATIN SMALL LETTER TURNED L
+A782;N # LATIN CAPITAL LETTER INSULAR R
+A783;N # LATIN SMALL LETTER INSULAR R
+A784;N # LATIN CAPITAL LETTER INSULAR S
+A785;N # LATIN SMALL LETTER INSULAR S
+A786;N # LATIN CAPITAL LETTER INSULAR T
+A787;N # LATIN SMALL LETTER INSULAR T
+A788;N # MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A789;N # MODIFIER LETTER COLON
+A78A;N # MODIFIER LETTER SHORT EQUALS SIGN
+A78B;N # LATIN CAPITAL LETTER SALTILLO
+A78C;N # LATIN SMALL LETTER SALTILLO
+A7FB;N # LATIN EPIGRAPHIC LETTER REVERSED F
+A7FC;N # LATIN EPIGRAPHIC LETTER REVERSED P
+A7FD;N # LATIN EPIGRAPHIC LETTER INVERTED M
+A7FE;N # LATIN EPIGRAPHIC LETTER I LONGA
+A7FF;N # LATIN EPIGRAPHIC LETTER ARCHAIC M
+A800;N # SYLOTI NAGRI LETTER A
+A801;N # SYLOTI NAGRI LETTER I
+A802;N # SYLOTI NAGRI SIGN DVISVARA
+A803;N # SYLOTI NAGRI LETTER U
+A804;N # SYLOTI NAGRI LETTER E
+A805;N # SYLOTI NAGRI LETTER O
+A806;N # SYLOTI NAGRI SIGN HASANTA
+A807;N # SYLOTI NAGRI LETTER KO
+A808;N # SYLOTI NAGRI LETTER KHO
+A809;N # SYLOTI NAGRI LETTER GO
+A80A;N # SYLOTI NAGRI LETTER GHO
+A80B;N # SYLOTI NAGRI SIGN ANUSVARA
+A80C;N # SYLOTI NAGRI LETTER CO
+A80D;N # SYLOTI NAGRI LETTER CHO
+A80E;N # SYLOTI NAGRI LETTER JO
+A80F;N # SYLOTI NAGRI LETTER JHO
+A810;N # SYLOTI NAGRI LETTER TTO
+A811;N # SYLOTI NAGRI LETTER TTHO
+A812;N # SYLOTI NAGRI LETTER DDO
+A813;N # SYLOTI NAGRI LETTER DDHO
+A814;N # SYLOTI NAGRI LETTER TO
+A815;N # SYLOTI NAGRI LETTER THO
+A816;N # SYLOTI NAGRI LETTER DO
+A817;N # SYLOTI NAGRI LETTER DHO
+A818;N # SYLOTI NAGRI LETTER NO
+A819;N # SYLOTI NAGRI LETTER PO
+A81A;N # SYLOTI NAGRI LETTER PHO
+A81B;N # SYLOTI NAGRI LETTER BO
+A81C;N # SYLOTI NAGRI LETTER BHO
+A81D;N # SYLOTI NAGRI LETTER MO
+A81E;N # SYLOTI NAGRI LETTER RO
+A81F;N # SYLOTI NAGRI LETTER LO
+A820;N # SYLOTI NAGRI LETTER RRO
+A821;N # SYLOTI NAGRI LETTER SO
+A822;N # SYLOTI NAGRI LETTER HO
+A823;N # SYLOTI NAGRI VOWEL SIGN A
+A824;N # SYLOTI NAGRI VOWEL SIGN I
+A825;N # SYLOTI NAGRI VOWEL SIGN U
+A826;N # SYLOTI NAGRI VOWEL SIGN E
+A827;N # SYLOTI NAGRI VOWEL SIGN OO
+A828;N # SYLOTI NAGRI POETRY MARK-1
+A829;N # SYLOTI NAGRI POETRY MARK-2
+A82A;N # SYLOTI NAGRI POETRY MARK-3
+A82B;N # SYLOTI NAGRI POETRY MARK-4
+A840;N # PHAGS-PA LETTER KA
+A841;N # PHAGS-PA LETTER KHA
+A842;N # PHAGS-PA LETTER GA
+A843;N # PHAGS-PA LETTER NGA
+A844;N # PHAGS-PA LETTER CA
+A845;N # PHAGS-PA LETTER CHA
+A846;N # PHAGS-PA LETTER JA
+A847;N # PHAGS-PA LETTER NYA
+A848;N # PHAGS-PA LETTER TA
+A849;N # PHAGS-PA LETTER THA
+A84A;N # PHAGS-PA LETTER DA
+A84B;N # PHAGS-PA LETTER NA
+A84C;N # PHAGS-PA LETTER PA
+A84D;N # PHAGS-PA LETTER PHA
+A84E;N # PHAGS-PA LETTER BA
+A84F;N # PHAGS-PA LETTER MA
+A850;N # PHAGS-PA LETTER TSA
+A851;N # PHAGS-PA LETTER TSHA
+A852;N # PHAGS-PA LETTER DZA
+A853;N # PHAGS-PA LETTER WA
+A854;N # PHAGS-PA LETTER ZHA
+A855;N # PHAGS-PA LETTER ZA
+A856;N # PHAGS-PA LETTER SMALL A
+A857;N # PHAGS-PA LETTER YA
+A858;N # PHAGS-PA LETTER RA
+A859;N # PHAGS-PA LETTER LA
+A85A;N # PHAGS-PA LETTER SHA
+A85B;N # PHAGS-PA LETTER SA
+A85C;N # PHAGS-PA LETTER HA
+A85D;N # PHAGS-PA LETTER A
+A85E;N # PHAGS-PA LETTER I
+A85F;N # PHAGS-PA LETTER U
+A860;N # PHAGS-PA LETTER E
+A861;N # PHAGS-PA LETTER O
+A862;N # PHAGS-PA LETTER QA
+A863;N # PHAGS-PA LETTER XA
+A864;N # PHAGS-PA LETTER FA
+A865;N # PHAGS-PA LETTER GGA
+A866;N # PHAGS-PA LETTER EE
+A867;N # PHAGS-PA SUBJOINED LETTER WA
+A868;N # PHAGS-PA SUBJOINED LETTER YA
+A869;N # PHAGS-PA LETTER TTA
+A86A;N # PHAGS-PA LETTER TTHA
+A86B;N # PHAGS-PA LETTER DDA
+A86C;N # PHAGS-PA LETTER NNA
+A86D;N # PHAGS-PA LETTER ALTERNATE YA
+A86E;N # PHAGS-PA LETTER VOICELESS SHA
+A86F;N # PHAGS-PA LETTER VOICED HA
+A870;N # PHAGS-PA LETTER ASPIRATED FA
+A871;N # PHAGS-PA SUBJOINED LETTER RA
+A872;N # PHAGS-PA SUPERFIXED LETTER RA
+A873;N # PHAGS-PA LETTER CANDRABINDU
+A874;N # PHAGS-PA SINGLE HEAD MARK
+A875;N # PHAGS-PA DOUBLE HEAD MARK
+A876;N # PHAGS-PA MARK SHAD
+A877;N # PHAGS-PA MARK DOUBLE SHAD
+A880;N # SAURASHTRA SIGN ANUSVARA
+A881;N # SAURASHTRA SIGN VISARGA
+A882;N # SAURASHTRA LETTER A
+A883;N # SAURASHTRA LETTER AA
+A884;N # SAURASHTRA LETTER I
+A885;N # SAURASHTRA LETTER II
+A886;N # SAURASHTRA LETTER U
+A887;N # SAURASHTRA LETTER UU
+A888;N # SAURASHTRA LETTER VOCALIC R
+A889;N # SAURASHTRA LETTER VOCALIC RR
+A88A;N # SAURASHTRA LETTER VOCALIC L
+A88B;N # SAURASHTRA LETTER VOCALIC LL
+A88C;N # SAURASHTRA LETTER E
+A88D;N # SAURASHTRA LETTER EE
+A88E;N # SAURASHTRA LETTER AI
+A88F;N # SAURASHTRA LETTER O
+A890;N # SAURASHTRA LETTER OO
+A891;N # SAURASHTRA LETTER AU
+A892;N # SAURASHTRA LETTER KA
+A893;N # SAURASHTRA LETTER KHA
+A894;N # SAURASHTRA LETTER GA
+A895;N # SAURASHTRA LETTER GHA
+A896;N # SAURASHTRA LETTER NGA
+A897;N # SAURASHTRA LETTER CA
+A898;N # SAURASHTRA LETTER CHA
+A899;N # SAURASHTRA LETTER JA
+A89A;N # SAURASHTRA LETTER JHA
+A89B;N # SAURASHTRA LETTER NYA
+A89C;N # SAURASHTRA LETTER TTA
+A89D;N # SAURASHTRA LETTER TTHA
+A89E;N # SAURASHTRA LETTER DDA
+A89F;N # SAURASHTRA LETTER DDHA
+A8A0;N # SAURASHTRA LETTER NNA
+A8A1;N # SAURASHTRA LETTER TA
+A8A2;N # SAURASHTRA LETTER THA
+A8A3;N # SAURASHTRA LETTER DA
+A8A4;N # SAURASHTRA LETTER DHA
+A8A5;N # SAURASHTRA LETTER NA
+A8A6;N # SAURASHTRA LETTER PA
+A8A7;N # SAURASHTRA LETTER PHA
+A8A8;N # SAURASHTRA LETTER BA
+A8A9;N # SAURASHTRA LETTER BHA
+A8AA;N # SAURASHTRA LETTER MA
+A8AB;N # SAURASHTRA LETTER YA
+A8AC;N # SAURASHTRA LETTER RA
+A8AD;N # SAURASHTRA LETTER LA
+A8AE;N # SAURASHTRA LETTER VA
+A8AF;N # SAURASHTRA LETTER SHA
+A8B0;N # SAURASHTRA LETTER SSA
+A8B1;N # SAURASHTRA LETTER SA
+A8B2;N # SAURASHTRA LETTER HA
+A8B3;N # SAURASHTRA LETTER LLA
+A8B4;N # SAURASHTRA CONSONANT SIGN HAARU
+A8B5;N # SAURASHTRA VOWEL SIGN AA
+A8B6;N # SAURASHTRA VOWEL SIGN I
+A8B7;N # SAURASHTRA VOWEL SIGN II
+A8B8;N # SAURASHTRA VOWEL SIGN U
+A8B9;N # SAURASHTRA VOWEL SIGN UU
+A8BA;N # SAURASHTRA VOWEL SIGN VOCALIC R
+A8BB;N # SAURASHTRA VOWEL SIGN VOCALIC RR
+A8BC;N # SAURASHTRA VOWEL SIGN VOCALIC L
+A8BD;N # SAURASHTRA VOWEL SIGN VOCALIC LL
+A8BE;N # SAURASHTRA VOWEL SIGN E
+A8BF;N # SAURASHTRA VOWEL SIGN EE
+A8C0;N # SAURASHTRA VOWEL SIGN AI
+A8C1;N # SAURASHTRA VOWEL SIGN O
+A8C2;N # SAURASHTRA VOWEL SIGN OO
+A8C3;N # SAURASHTRA VOWEL SIGN AU
+A8C4;N # SAURASHTRA SIGN VIRAMA
+A8CE;N # SAURASHTRA DANDA
+A8CF;N # SAURASHTRA DOUBLE DANDA
+A8D0;N # SAURASHTRA DIGIT ZERO
+A8D1;N # SAURASHTRA DIGIT ONE
+A8D2;N # SAURASHTRA DIGIT TWO
+A8D3;N # SAURASHTRA DIGIT THREE
+A8D4;N # SAURASHTRA DIGIT FOUR
+A8D5;N # SAURASHTRA DIGIT FIVE
+A8D6;N # SAURASHTRA DIGIT SIX
+A8D7;N # SAURASHTRA DIGIT SEVEN
+A8D8;N # SAURASHTRA DIGIT EIGHT
+A8D9;N # SAURASHTRA DIGIT NINE
+A900;N # KAYAH LI DIGIT ZERO
+A901;N # KAYAH LI DIGIT ONE
+A902;N # KAYAH LI DIGIT TWO
+A903;N # KAYAH LI DIGIT THREE
+A904;N # KAYAH LI DIGIT FOUR
+A905;N # KAYAH LI DIGIT FIVE
+A906;N # KAYAH LI DIGIT SIX
+A907;N # KAYAH LI DIGIT SEVEN
+A908;N # KAYAH LI DIGIT EIGHT
+A909;N # KAYAH LI DIGIT NINE
+A90A;N # KAYAH LI LETTER KA
+A90B;N # KAYAH LI LETTER KHA
+A90C;N # KAYAH LI LETTER GA
+A90D;N # KAYAH LI LETTER NGA
+A90E;N # KAYAH LI LETTER SA
+A90F;N # KAYAH LI LETTER SHA
+A910;N # KAYAH LI LETTER ZA
+A911;N # KAYAH LI LETTER NYA
+A912;N # KAYAH LI LETTER TA
+A913;N # KAYAH LI LETTER HTA
+A914;N # KAYAH LI LETTER NA
+A915;N # KAYAH LI LETTER PA
+A916;N # KAYAH LI LETTER PHA
+A917;N # KAYAH LI LETTER MA
+A918;N # KAYAH LI LETTER DA
+A919;N # KAYAH LI LETTER BA
+A91A;N # KAYAH LI LETTER RA
+A91B;N # KAYAH LI LETTER YA
+A91C;N # KAYAH LI LETTER LA
+A91D;N # KAYAH LI LETTER WA
+A91E;N # KAYAH LI LETTER THA
+A91F;N # KAYAH LI LETTER HA
+A920;N # KAYAH LI LETTER VA
+A921;N # KAYAH LI LETTER CA
+A922;N # KAYAH LI LETTER A
+A923;N # KAYAH LI LETTER OE
+A924;N # KAYAH LI LETTER I
+A925;N # KAYAH LI LETTER OO
+A926;N # KAYAH LI VOWEL UE
+A927;N # KAYAH LI VOWEL E
+A928;N # KAYAH LI VOWEL U
+A929;N # KAYAH LI VOWEL EE
+A92A;N # KAYAH LI VOWEL O
+A92B;N # KAYAH LI TONE PLOPHU
+A92C;N # KAYAH LI TONE CALYA
+A92D;N # KAYAH LI TONE CALYA PLOPHU
+A92E;N # KAYAH LI SIGN CWI
+A92F;N # KAYAH LI SIGN SHYA
+A930;N # REJANG LETTER KA
+A931;N # REJANG LETTER GA
+A932;N # REJANG LETTER NGA
+A933;N # REJANG LETTER TA
+A934;N # REJANG LETTER DA
+A935;N # REJANG LETTER NA
+A936;N # REJANG LETTER PA
+A937;N # REJANG LETTER BA
+A938;N # REJANG LETTER MA
+A939;N # REJANG LETTER CA
+A93A;N # REJANG LETTER JA
+A93B;N # REJANG LETTER NYA
+A93C;N # REJANG LETTER SA
+A93D;N # REJANG LETTER RA
+A93E;N # REJANG LETTER LA
+A93F;N # REJANG LETTER YA
+A940;N # REJANG LETTER WA
+A941;N # REJANG LETTER HA
+A942;N # REJANG LETTER MBA
+A943;N # REJANG LETTER NGGA
+A944;N # REJANG LETTER NDA
+A945;N # REJANG LETTER NYJA
+A946;N # REJANG LETTER A
+A947;N # REJANG VOWEL SIGN I
+A948;N # REJANG VOWEL SIGN U
+A949;N # REJANG VOWEL SIGN E
+A94A;N # REJANG VOWEL SIGN AI
+A94B;N # REJANG VOWEL SIGN O
+A94C;N # REJANG VOWEL SIGN AU
+A94D;N # REJANG VOWEL SIGN EU
+A94E;N # REJANG VOWEL SIGN EA
+A94F;N # REJANG CONSONANT SIGN NG
+A950;N # REJANG CONSONANT SIGN N
+A951;N # REJANG CONSONANT SIGN R
+A952;N # REJANG CONSONANT SIGN H
+A953;N # REJANG VIRAMA
+A95F;N # REJANG SECTION MARK
+AA00;N # CHAM LETTER A
+AA01;N # CHAM LETTER I
+AA02;N # CHAM LETTER U
+AA03;N # CHAM LETTER E
+AA04;N # CHAM LETTER AI
+AA05;N # CHAM LETTER O
+AA06;N # CHAM LETTER KA
+AA07;N # CHAM LETTER KHA
+AA08;N # CHAM LETTER GA
+AA09;N # CHAM LETTER GHA
+AA0A;N # CHAM LETTER NGUE
+AA0B;N # CHAM LETTER NGA
+AA0C;N # CHAM LETTER CHA
+AA0D;N # CHAM LETTER CHHA
+AA0E;N # CHAM LETTER JA
+AA0F;N # CHAM LETTER JHA
+AA10;N # CHAM LETTER NHUE
+AA11;N # CHAM LETTER NHA
+AA12;N # CHAM LETTER NHJA
+AA13;N # CHAM LETTER TA
+AA14;N # CHAM LETTER THA
+AA15;N # CHAM LETTER DA
+AA16;N # CHAM LETTER DHA
+AA17;N # CHAM LETTER NUE
+AA18;N # CHAM LETTER NA
+AA19;N # CHAM LETTER DDA
+AA1A;N # CHAM LETTER PA
+AA1B;N # CHAM LETTER PPA
+AA1C;N # CHAM LETTER PHA
+AA1D;N # CHAM LETTER BA
+AA1E;N # CHAM LETTER BHA
+AA1F;N # CHAM LETTER MUE
+AA20;N # CHAM LETTER MA
+AA21;N # CHAM LETTER BBA
+AA22;N # CHAM LETTER YA
+AA23;N # CHAM LETTER RA
+AA24;N # CHAM LETTER LA
+AA25;N # CHAM LETTER VA
+AA26;N # CHAM LETTER SSA
+AA27;N # CHAM LETTER SA
+AA28;N # CHAM LETTER HA
+AA29;N # CHAM VOWEL SIGN AA
+AA2A;N # CHAM VOWEL SIGN I
+AA2B;N # CHAM VOWEL SIGN II
+AA2C;N # CHAM VOWEL SIGN EI
+AA2D;N # CHAM VOWEL SIGN U
+AA2E;N # CHAM VOWEL SIGN OE
+AA2F;N # CHAM VOWEL SIGN O
+AA30;N # CHAM VOWEL SIGN AI
+AA31;N # CHAM VOWEL SIGN AU
+AA32;N # CHAM VOWEL SIGN UE
+AA33;N # CHAM CONSONANT SIGN YA
+AA34;N # CHAM CONSONANT SIGN RA
+AA35;N # CHAM CONSONANT SIGN LA
+AA36;N # CHAM CONSONANT SIGN WA
+AA40;N # CHAM LETTER FINAL K
+AA41;N # CHAM LETTER FINAL G
+AA42;N # CHAM LETTER FINAL NG
+AA43;N # CHAM CONSONANT SIGN FINAL NG
+AA44;N # CHAM LETTER FINAL CH
+AA45;N # CHAM LETTER FINAL T
+AA46;N # CHAM LETTER FINAL N
+AA47;N # CHAM LETTER FINAL P
+AA48;N # CHAM LETTER FINAL Y
+AA49;N # CHAM LETTER FINAL R
+AA4A;N # CHAM LETTER FINAL L
+AA4B;N # CHAM LETTER FINAL SS
+AA4C;N # CHAM CONSONANT SIGN FINAL M
+AA4D;N # CHAM CONSONANT SIGN FINAL H
+AA50;N # CHAM DIGIT ZERO
+AA51;N # CHAM DIGIT ONE
+AA52;N # CHAM DIGIT TWO
+AA53;N # CHAM DIGIT THREE
+AA54;N # CHAM DIGIT FOUR
+AA55;N # CHAM DIGIT FIVE
+AA56;N # CHAM DIGIT SIX
+AA57;N # CHAM DIGIT SEVEN
+AA58;N # CHAM DIGIT EIGHT
+AA59;N # CHAM DIGIT NINE
+AA5C;N # CHAM PUNCTUATION SPIRAL
+AA5D;N # CHAM PUNCTUATION DANDA
+AA5E;N # CHAM PUNCTUATION DOUBLE DANDA
+AA5F;N # CHAM PUNCTUATION TRIPLE DANDA
+AC00..D7A3;W # <Hangul Syllable, First>..<Hangul Syllable, Last>
+D800..DB7F;N # <Non Private Use High Surrogate, First>..<Non Private Use High Surrogate, Last>
+DB80..DBFF;N # <Private Use High Surrogate, First>..<Private Use High Surrogate, Last>
+DC00..DFFF;N # <Low Surrogate, First>..<Low Surrogate, Last>
+E000..F8FF;A # <Private Use, First>..<Private Use, Last>
+F900;W # CJK COMPATIBILITY IDEOGRAPH-F900
+F901;W # CJK COMPATIBILITY IDEOGRAPH-F901
+F902;W # CJK COMPATIBILITY IDEOGRAPH-F902
+F903;W # CJK COMPATIBILITY IDEOGRAPH-F903
+F904;W # CJK COMPATIBILITY IDEOGRAPH-F904
+F905;W # CJK COMPATIBILITY IDEOGRAPH-F905
+F906;W # CJK COMPATIBILITY IDEOGRAPH-F906
+F907;W # CJK COMPATIBILITY IDEOGRAPH-F907
+F908;W # CJK COMPATIBILITY IDEOGRAPH-F908
+F909;W # CJK COMPATIBILITY IDEOGRAPH-F909
+F90A;W # CJK COMPATIBILITY IDEOGRAPH-F90A
+F90B;W # CJK COMPATIBILITY IDEOGRAPH-F90B
+F90C;W # CJK COMPATIBILITY IDEOGRAPH-F90C
+F90D;W # CJK COMPATIBILITY IDEOGRAPH-F90D
+F90E;W # CJK COMPATIBILITY IDEOGRAPH-F90E
+F90F;W # CJK COMPATIBILITY IDEOGRAPH-F90F
+F910;W # CJK COMPATIBILITY IDEOGRAPH-F910
+F911;W # CJK COMPATIBILITY IDEOGRAPH-F911
+F912;W # CJK COMPATIBILITY IDEOGRAPH-F912
+F913;W # CJK COMPATIBILITY IDEOGRAPH-F913
+F914;W # CJK COMPATIBILITY IDEOGRAPH-F914
+F915;W # CJK COMPATIBILITY IDEOGRAPH-F915
+F916;W # CJK COMPATIBILITY IDEOGRAPH-F916
+F917;W # CJK COMPATIBILITY IDEOGRAPH-F917
+F918;W # CJK COMPATIBILITY IDEOGRAPH-F918
+F919;W # CJK COMPATIBILITY IDEOGRAPH-F919
+F91A;W # CJK COMPATIBILITY IDEOGRAPH-F91A
+F91B;W # CJK COMPATIBILITY IDEOGRAPH-F91B
+F91C;W # CJK COMPATIBILITY IDEOGRAPH-F91C
+F91D;W # CJK COMPATIBILITY IDEOGRAPH-F91D
+F91E;W # CJK COMPATIBILITY IDEOGRAPH-F91E
+F91F;W # CJK COMPATIBILITY IDEOGRAPH-F91F
+F920;W # CJK COMPATIBILITY IDEOGRAPH-F920
+F921;W # CJK COMPATIBILITY IDEOGRAPH-F921
+F922;W # CJK COMPATIBILITY IDEOGRAPH-F922
+F923;W # CJK COMPATIBILITY IDEOGRAPH-F923
+F924;W # CJK COMPATIBILITY IDEOGRAPH-F924
+F925;W # CJK COMPATIBILITY IDEOGRAPH-F925
+F926;W # CJK COMPATIBILITY IDEOGRAPH-F926
+F927;W # CJK COMPATIBILITY IDEOGRAPH-F927
+F928;W # CJK COMPATIBILITY IDEOGRAPH-F928
+F929;W # CJK COMPATIBILITY IDEOGRAPH-F929
+F92A;W # CJK COMPATIBILITY IDEOGRAPH-F92A
+F92B;W # CJK COMPATIBILITY IDEOGRAPH-F92B
+F92C;W # CJK COMPATIBILITY IDEOGRAPH-F92C
+F92D;W # CJK COMPATIBILITY IDEOGRAPH-F92D
+F92E;W # CJK COMPATIBILITY IDEOGRAPH-F92E
+F92F;W # CJK COMPATIBILITY IDEOGRAPH-F92F
+F930;W # CJK COMPATIBILITY IDEOGRAPH-F930
+F931;W # CJK COMPATIBILITY IDEOGRAPH-F931
+F932;W # CJK COMPATIBILITY IDEOGRAPH-F932
+F933;W # CJK COMPATIBILITY IDEOGRAPH-F933
+F934;W # CJK COMPATIBILITY IDEOGRAPH-F934
+F935;W # CJK COMPATIBILITY IDEOGRAPH-F935
+F936;W # CJK COMPATIBILITY IDEOGRAPH-F936
+F937;W # CJK COMPATIBILITY IDEOGRAPH-F937
+F938;W # CJK COMPATIBILITY IDEOGRAPH-F938
+F939;W # CJK COMPATIBILITY IDEOGRAPH-F939
+F93A;W # CJK COMPATIBILITY IDEOGRAPH-F93A
+F93B;W # CJK COMPATIBILITY IDEOGRAPH-F93B
+F93C;W # CJK COMPATIBILITY IDEOGRAPH-F93C
+F93D;W # CJK COMPATIBILITY IDEOGRAPH-F93D
+F93E;W # CJK COMPATIBILITY IDEOGRAPH-F93E
+F93F;W # CJK COMPATIBILITY IDEOGRAPH-F93F
+F940;W # CJK COMPATIBILITY IDEOGRAPH-F940
+F941;W # CJK COMPATIBILITY IDEOGRAPH-F941
+F942;W # CJK COMPATIBILITY IDEOGRAPH-F942
+F943;W # CJK COMPATIBILITY IDEOGRAPH-F943
+F944;W # CJK COMPATIBILITY IDEOGRAPH-F944
+F945;W # CJK COMPATIBILITY IDEOGRAPH-F945
+F946;W # CJK COMPATIBILITY IDEOGRAPH-F946
+F947;W # CJK COMPATIBILITY IDEOGRAPH-F947
+F948;W # CJK COMPATIBILITY IDEOGRAPH-F948
+F949;W # CJK COMPATIBILITY IDEOGRAPH-F949
+F94A;W # CJK COMPATIBILITY IDEOGRAPH-F94A
+F94B;W # CJK COMPATIBILITY IDEOGRAPH-F94B
+F94C;W # CJK COMPATIBILITY IDEOGRAPH-F94C
+F94D;W # CJK COMPATIBILITY IDEOGRAPH-F94D
+F94E;W # CJK COMPATIBILITY IDEOGRAPH-F94E
+F94F;W # CJK COMPATIBILITY IDEOGRAPH-F94F
+F950;W # CJK COMPATIBILITY IDEOGRAPH-F950
+F951;W # CJK COMPATIBILITY IDEOGRAPH-F951
+F952;W # CJK COMPATIBILITY IDEOGRAPH-F952
+F953;W # CJK COMPATIBILITY IDEOGRAPH-F953
+F954;W # CJK COMPATIBILITY IDEOGRAPH-F954
+F955;W # CJK COMPATIBILITY IDEOGRAPH-F955
+F956;W # CJK COMPATIBILITY IDEOGRAPH-F956
+F957;W # CJK COMPATIBILITY IDEOGRAPH-F957
+F958;W # CJK COMPATIBILITY IDEOGRAPH-F958
+F959;W # CJK COMPATIBILITY IDEOGRAPH-F959
+F95A;W # CJK COMPATIBILITY IDEOGRAPH-F95A
+F95B;W # CJK COMPATIBILITY IDEOGRAPH-F95B
+F95C;W # CJK COMPATIBILITY IDEOGRAPH-F95C
+F95D;W # CJK COMPATIBILITY IDEOGRAPH-F95D
+F95E;W # CJK COMPATIBILITY IDEOGRAPH-F95E
+F95F;W # CJK COMPATIBILITY IDEOGRAPH-F95F
+F960;W # CJK COMPATIBILITY IDEOGRAPH-F960
+F961;W # CJK COMPATIBILITY IDEOGRAPH-F961
+F962;W # CJK COMPATIBILITY IDEOGRAPH-F962
+F963;W # CJK COMPATIBILITY IDEOGRAPH-F963
+F964;W # CJK COMPATIBILITY IDEOGRAPH-F964
+F965;W # CJK COMPATIBILITY IDEOGRAPH-F965
+F966;W # CJK COMPATIBILITY IDEOGRAPH-F966
+F967;W # CJK COMPATIBILITY IDEOGRAPH-F967
+F968;W # CJK COMPATIBILITY IDEOGRAPH-F968
+F969;W # CJK COMPATIBILITY IDEOGRAPH-F969
+F96A;W # CJK COMPATIBILITY IDEOGRAPH-F96A
+F96B;W # CJK COMPATIBILITY IDEOGRAPH-F96B
+F96C;W # CJK COMPATIBILITY IDEOGRAPH-F96C
+F96D;W # CJK COMPATIBILITY IDEOGRAPH-F96D
+F96E;W # CJK COMPATIBILITY IDEOGRAPH-F96E
+F96F;W # CJK COMPATIBILITY IDEOGRAPH-F96F
+F970;W # CJK COMPATIBILITY IDEOGRAPH-F970
+F971;W # CJK COMPATIBILITY IDEOGRAPH-F971
+F972;W # CJK COMPATIBILITY IDEOGRAPH-F972
+F973;W # CJK COMPATIBILITY IDEOGRAPH-F973
+F974;W # CJK COMPATIBILITY IDEOGRAPH-F974
+F975;W # CJK COMPATIBILITY IDEOGRAPH-F975
+F976;W # CJK COMPATIBILITY IDEOGRAPH-F976
+F977;W # CJK COMPATIBILITY IDEOGRAPH-F977
+F978;W # CJK COMPATIBILITY IDEOGRAPH-F978
+F979;W # CJK COMPATIBILITY IDEOGRAPH-F979
+F97A;W # CJK COMPATIBILITY IDEOGRAPH-F97A
+F97B;W # CJK COMPATIBILITY IDEOGRAPH-F97B
+F97C;W # CJK COMPATIBILITY IDEOGRAPH-F97C
+F97D;W # CJK COMPATIBILITY IDEOGRAPH-F97D
+F97E;W # CJK COMPATIBILITY IDEOGRAPH-F97E
+F97F;W # CJK COMPATIBILITY IDEOGRAPH-F97F
+F980;W # CJK COMPATIBILITY IDEOGRAPH-F980
+F981;W # CJK COMPATIBILITY IDEOGRAPH-F981
+F982;W # CJK COMPATIBILITY IDEOGRAPH-F982
+F983;W # CJK COMPATIBILITY IDEOGRAPH-F983
+F984;W # CJK COMPATIBILITY IDEOGRAPH-F984
+F985;W # CJK COMPATIBILITY IDEOGRAPH-F985
+F986;W # CJK COMPATIBILITY IDEOGRAPH-F986
+F987;W # CJK COMPATIBILITY IDEOGRAPH-F987
+F988;W # CJK COMPATIBILITY IDEOGRAPH-F988
+F989;W # CJK COMPATIBILITY IDEOGRAPH-F989
+F98A;W # CJK COMPATIBILITY IDEOGRAPH-F98A
+F98B;W # CJK COMPATIBILITY IDEOGRAPH-F98B
+F98C;W # CJK COMPATIBILITY IDEOGRAPH-F98C
+F98D;W # CJK COMPATIBILITY IDEOGRAPH-F98D
+F98E;W # CJK COMPATIBILITY IDEOGRAPH-F98E
+F98F;W # CJK COMPATIBILITY IDEOGRAPH-F98F
+F990;W # CJK COMPATIBILITY IDEOGRAPH-F990
+F991;W # CJK COMPATIBILITY IDEOGRAPH-F991
+F992;W # CJK COMPATIBILITY IDEOGRAPH-F992
+F993;W # CJK COMPATIBILITY IDEOGRAPH-F993
+F994;W # CJK COMPATIBILITY IDEOGRAPH-F994
+F995;W # CJK COMPATIBILITY IDEOGRAPH-F995
+F996;W # CJK COMPATIBILITY IDEOGRAPH-F996
+F997;W # CJK COMPATIBILITY IDEOGRAPH-F997
+F998;W # CJK COMPATIBILITY IDEOGRAPH-F998
+F999;W # CJK COMPATIBILITY IDEOGRAPH-F999
+F99A;W # CJK COMPATIBILITY IDEOGRAPH-F99A
+F99B;W # CJK COMPATIBILITY IDEOGRAPH-F99B
+F99C;W # CJK COMPATIBILITY IDEOGRAPH-F99C
+F99D;W # CJK COMPATIBILITY IDEOGRAPH-F99D
+F99E;W # CJK COMPATIBILITY IDEOGRAPH-F99E
+F99F;W # CJK COMPATIBILITY IDEOGRAPH-F99F
+F9A0;W # CJK COMPATIBILITY IDEOGRAPH-F9A0
+F9A1;W # CJK COMPATIBILITY IDEOGRAPH-F9A1
+F9A2;W # CJK COMPATIBILITY IDEOGRAPH-F9A2
+F9A3;W # CJK COMPATIBILITY IDEOGRAPH-F9A3
+F9A4;W # CJK COMPATIBILITY IDEOGRAPH-F9A4
+F9A5;W # CJK COMPATIBILITY IDEOGRAPH-F9A5
+F9A6;W # CJK COMPATIBILITY IDEOGRAPH-F9A6
+F9A7;W # CJK COMPATIBILITY IDEOGRAPH-F9A7
+F9A8;W # CJK COMPATIBILITY IDEOGRAPH-F9A8
+F9A9;W # CJK COMPATIBILITY IDEOGRAPH-F9A9
+F9AA;W # CJK COMPATIBILITY IDEOGRAPH-F9AA
+F9AB;W # CJK COMPATIBILITY IDEOGRAPH-F9AB
+F9AC;W # CJK COMPATIBILITY IDEOGRAPH-F9AC
+F9AD;W # CJK COMPATIBILITY IDEOGRAPH-F9AD
+F9AE;W # CJK COMPATIBILITY IDEOGRAPH-F9AE
+F9AF;W # CJK COMPATIBILITY IDEOGRAPH-F9AF
+F9B0;W # CJK COMPATIBILITY IDEOGRAPH-F9B0
+F9B1;W # CJK COMPATIBILITY IDEOGRAPH-F9B1
+F9B2;W # CJK COMPATIBILITY IDEOGRAPH-F9B2
+F9B3;W # CJK COMPATIBILITY IDEOGRAPH-F9B3
+F9B4;W # CJK COMPATIBILITY IDEOGRAPH-F9B4
+F9B5;W # CJK COMPATIBILITY IDEOGRAPH-F9B5
+F9B6;W # CJK COMPATIBILITY IDEOGRAPH-F9B6
+F9B7;W # CJK COMPATIBILITY IDEOGRAPH-F9B7
+F9B8;W # CJK COMPATIBILITY IDEOGRAPH-F9B8
+F9B9;W # CJK COMPATIBILITY IDEOGRAPH-F9B9
+F9BA;W # CJK COMPATIBILITY IDEOGRAPH-F9BA
+F9BB;W # CJK COMPATIBILITY IDEOGRAPH-F9BB
+F9BC;W # CJK COMPATIBILITY IDEOGRAPH-F9BC
+F9BD;W # CJK COMPATIBILITY IDEOGRAPH-F9BD
+F9BE;W # CJK COMPATIBILITY IDEOGRAPH-F9BE
+F9BF;W # CJK COMPATIBILITY IDEOGRAPH-F9BF
+F9C0;W # CJK COMPATIBILITY IDEOGRAPH-F9C0
+F9C1;W # CJK COMPATIBILITY IDEOGRAPH-F9C1
+F9C2;W # CJK COMPATIBILITY IDEOGRAPH-F9C2
+F9C3;W # CJK COMPATIBILITY IDEOGRAPH-F9C3
+F9C4;W # CJK COMPATIBILITY IDEOGRAPH-F9C4
+F9C5;W # CJK COMPATIBILITY IDEOGRAPH-F9C5
+F9C6;W # CJK COMPATIBILITY IDEOGRAPH-F9C6
+F9C7;W # CJK COMPATIBILITY IDEOGRAPH-F9C7
+F9C8;W # CJK COMPATIBILITY IDEOGRAPH-F9C8
+F9C9;W # CJK COMPATIBILITY IDEOGRAPH-F9C9
+F9CA;W # CJK COMPATIBILITY IDEOGRAPH-F9CA
+F9CB;W # CJK COMPATIBILITY IDEOGRAPH-F9CB
+F9CC;W # CJK COMPATIBILITY IDEOGRAPH-F9CC
+F9CD;W # CJK COMPATIBILITY IDEOGRAPH-F9CD
+F9CE;W # CJK COMPATIBILITY IDEOGRAPH-F9CE
+F9CF;W # CJK COMPATIBILITY IDEOGRAPH-F9CF
+F9D0;W # CJK COMPATIBILITY IDEOGRAPH-F9D0
+F9D1;W # CJK COMPATIBILITY IDEOGRAPH-F9D1
+F9D2;W # CJK COMPATIBILITY IDEOGRAPH-F9D2
+F9D3;W # CJK COMPATIBILITY IDEOGRAPH-F9D3
+F9D4;W # CJK COMPATIBILITY IDEOGRAPH-F9D4
+F9D5;W # CJK COMPATIBILITY IDEOGRAPH-F9D5
+F9D6;W # CJK COMPATIBILITY IDEOGRAPH-F9D6
+F9D7;W # CJK COMPATIBILITY IDEOGRAPH-F9D7
+F9D8;W # CJK COMPATIBILITY IDEOGRAPH-F9D8
+F9D9;W # CJK COMPATIBILITY IDEOGRAPH-F9D9
+F9DA;W # CJK COMPATIBILITY IDEOGRAPH-F9DA
+F9DB;W # CJK COMPATIBILITY IDEOGRAPH-F9DB
+F9DC;W # CJK COMPATIBILITY IDEOGRAPH-F9DC
+F9DD;W # CJK COMPATIBILITY IDEOGRAPH-F9DD
+F9DE;W # CJK COMPATIBILITY IDEOGRAPH-F9DE
+F9DF;W # CJK COMPATIBILITY IDEOGRAPH-F9DF
+F9E0;W # CJK COMPATIBILITY IDEOGRAPH-F9E0
+F9E1;W # CJK COMPATIBILITY IDEOGRAPH-F9E1
+F9E2;W # CJK COMPATIBILITY IDEOGRAPH-F9E2
+F9E3;W # CJK COMPATIBILITY IDEOGRAPH-F9E3
+F9E4;W # CJK COMPATIBILITY IDEOGRAPH-F9E4
+F9E5;W # CJK COMPATIBILITY IDEOGRAPH-F9E5
+F9E6;W # CJK COMPATIBILITY IDEOGRAPH-F9E6
+F9E7;W # CJK COMPATIBILITY IDEOGRAPH-F9E7
+F9E8;W # CJK COMPATIBILITY IDEOGRAPH-F9E8
+F9E9;W # CJK COMPATIBILITY IDEOGRAPH-F9E9
+F9EA;W # CJK COMPATIBILITY IDEOGRAPH-F9EA
+F9EB;W # CJK COMPATIBILITY IDEOGRAPH-F9EB
+F9EC;W # CJK COMPATIBILITY IDEOGRAPH-F9EC
+F9ED;W # CJK COMPATIBILITY IDEOGRAPH-F9ED
+F9EE;W # CJK COMPATIBILITY IDEOGRAPH-F9EE
+F9EF;W # CJK COMPATIBILITY IDEOGRAPH-F9EF
+F9F0;W # CJK COMPATIBILITY IDEOGRAPH-F9F0
+F9F1;W # CJK COMPATIBILITY IDEOGRAPH-F9F1
+F9F2;W # CJK COMPATIBILITY IDEOGRAPH-F9F2
+F9F3;W # CJK COMPATIBILITY IDEOGRAPH-F9F3
+F9F4;W # CJK COMPATIBILITY IDEOGRAPH-F9F4
+F9F5;W # CJK COMPATIBILITY IDEOGRAPH-F9F5
+F9F6;W # CJK COMPATIBILITY IDEOGRAPH-F9F6
+F9F7;W # CJK COMPATIBILITY IDEOGRAPH-F9F7
+F9F8;W # CJK COMPATIBILITY IDEOGRAPH-F9F8
+F9F9;W # CJK COMPATIBILITY IDEOGRAPH-F9F9
+F9FA;W # CJK COMPATIBILITY IDEOGRAPH-F9FA
+F9FB;W # CJK COMPATIBILITY IDEOGRAPH-F9FB
+F9FC;W # CJK COMPATIBILITY IDEOGRAPH-F9FC
+F9FD;W # CJK COMPATIBILITY IDEOGRAPH-F9FD
+F9FE;W # CJK COMPATIBILITY IDEOGRAPH-F9FE
+F9FF;W # CJK COMPATIBILITY IDEOGRAPH-F9FF
+FA00;W # CJK COMPATIBILITY IDEOGRAPH-FA00
+FA01;W # CJK COMPATIBILITY IDEOGRAPH-FA01
+FA02;W # CJK COMPATIBILITY IDEOGRAPH-FA02
+FA03;W # CJK COMPATIBILITY IDEOGRAPH-FA03
+FA04;W # CJK COMPATIBILITY IDEOGRAPH-FA04
+FA05;W # CJK COMPATIBILITY IDEOGRAPH-FA05
+FA06;W # CJK COMPATIBILITY IDEOGRAPH-FA06
+FA07;W # CJK COMPATIBILITY IDEOGRAPH-FA07
+FA08;W # CJK COMPATIBILITY IDEOGRAPH-FA08
+FA09;W # CJK COMPATIBILITY IDEOGRAPH-FA09
+FA0A;W # CJK COMPATIBILITY IDEOGRAPH-FA0A
+FA0B;W # CJK COMPATIBILITY IDEOGRAPH-FA0B
+FA0C;W # CJK COMPATIBILITY IDEOGRAPH-FA0C
+FA0D;W # CJK COMPATIBILITY IDEOGRAPH-FA0D
+FA0E;W # CJK COMPATIBILITY IDEOGRAPH-FA0E
+FA0F;W # CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA10;W # CJK COMPATIBILITY IDEOGRAPH-FA10
+FA11;W # CJK COMPATIBILITY IDEOGRAPH-FA11
+FA12;W # CJK COMPATIBILITY IDEOGRAPH-FA12
+FA13;W # CJK COMPATIBILITY IDEOGRAPH-FA13
+FA14;W # CJK COMPATIBILITY IDEOGRAPH-FA14
+FA15;W # CJK COMPATIBILITY IDEOGRAPH-FA15
+FA16;W # CJK COMPATIBILITY IDEOGRAPH-FA16
+FA17;W # CJK COMPATIBILITY IDEOGRAPH-FA17
+FA18;W # CJK COMPATIBILITY IDEOGRAPH-FA18
+FA19;W # CJK COMPATIBILITY IDEOGRAPH-FA19
+FA1A;W # CJK COMPATIBILITY IDEOGRAPH-FA1A
+FA1B;W # CJK COMPATIBILITY IDEOGRAPH-FA1B
+FA1C;W # CJK COMPATIBILITY IDEOGRAPH-FA1C
+FA1D;W # CJK COMPATIBILITY IDEOGRAPH-FA1D
+FA1E;W # CJK COMPATIBILITY IDEOGRAPH-FA1E
+FA1F;W # CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA20;W # CJK COMPATIBILITY IDEOGRAPH-FA20
+FA21;W # CJK COMPATIBILITY IDEOGRAPH-FA21
+FA22;W # CJK COMPATIBILITY IDEOGRAPH-FA22
+FA23;W # CJK COMPATIBILITY IDEOGRAPH-FA23
+FA24;W # CJK COMPATIBILITY IDEOGRAPH-FA24
+FA25;W # CJK COMPATIBILITY IDEOGRAPH-FA25
+FA26;W # CJK COMPATIBILITY IDEOGRAPH-FA26
+FA27;W # CJK COMPATIBILITY IDEOGRAPH-FA27
+FA28;W # CJK COMPATIBILITY IDEOGRAPH-FA28
+FA29;W # CJK COMPATIBILITY IDEOGRAPH-FA29
+FA2A;W # CJK COMPATIBILITY IDEOGRAPH-FA2A
+FA2B;W # CJK COMPATIBILITY IDEOGRAPH-FA2B
+FA2C;W # CJK COMPATIBILITY IDEOGRAPH-FA2C
+FA2D;W # CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30;W # CJK COMPATIBILITY IDEOGRAPH-FA30
+FA31;W # CJK COMPATIBILITY IDEOGRAPH-FA31
+FA32;W # CJK COMPATIBILITY IDEOGRAPH-FA32
+FA33;W # CJK COMPATIBILITY IDEOGRAPH-FA33
+FA34;W # CJK COMPATIBILITY IDEOGRAPH-FA34
+FA35;W # CJK COMPATIBILITY IDEOGRAPH-FA35
+FA36;W # CJK COMPATIBILITY IDEOGRAPH-FA36
+FA37;W # CJK COMPATIBILITY IDEOGRAPH-FA37
+FA38;W # CJK COMPATIBILITY IDEOGRAPH-FA38
+FA39;W # CJK COMPATIBILITY IDEOGRAPH-FA39
+FA3A;W # CJK COMPATIBILITY IDEOGRAPH-FA3A
+FA3B;W # CJK COMPATIBILITY IDEOGRAPH-FA3B
+FA3C;W # CJK COMPATIBILITY IDEOGRAPH-FA3C
+FA3D;W # CJK COMPATIBILITY IDEOGRAPH-FA3D
+FA3E;W # CJK COMPATIBILITY IDEOGRAPH-FA3E
+FA3F;W # CJK COMPATIBILITY IDEOGRAPH-FA3F
+FA40;W # CJK COMPATIBILITY IDEOGRAPH-FA40
+FA41;W # CJK COMPATIBILITY IDEOGRAPH-FA41
+FA42;W # CJK COMPATIBILITY IDEOGRAPH-FA42
+FA43;W # CJK COMPATIBILITY IDEOGRAPH-FA43
+FA44;W # CJK COMPATIBILITY IDEOGRAPH-FA44
+FA45;W # CJK COMPATIBILITY IDEOGRAPH-FA45
+FA46;W # CJK COMPATIBILITY IDEOGRAPH-FA46
+FA47;W # CJK COMPATIBILITY IDEOGRAPH-FA47
+FA48;W # CJK COMPATIBILITY IDEOGRAPH-FA48
+FA49;W # CJK COMPATIBILITY IDEOGRAPH-FA49
+FA4A;W # CJK COMPATIBILITY IDEOGRAPH-FA4A
+FA4B;W # CJK COMPATIBILITY IDEOGRAPH-FA4B
+FA4C;W # CJK COMPATIBILITY IDEOGRAPH-FA4C
+FA4D;W # CJK COMPATIBILITY IDEOGRAPH-FA4D
+FA4E;W # CJK COMPATIBILITY IDEOGRAPH-FA4E
+FA4F;W # CJK COMPATIBILITY IDEOGRAPH-FA4F
+FA50;W # CJK COMPATIBILITY IDEOGRAPH-FA50
+FA51;W # CJK COMPATIBILITY IDEOGRAPH-FA51
+FA52;W # CJK COMPATIBILITY IDEOGRAPH-FA52
+FA53;W # CJK COMPATIBILITY IDEOGRAPH-FA53
+FA54;W # CJK COMPATIBILITY IDEOGRAPH-FA54
+FA55;W # CJK COMPATIBILITY IDEOGRAPH-FA55
+FA56;W # CJK COMPATIBILITY IDEOGRAPH-FA56
+FA57;W # CJK COMPATIBILITY IDEOGRAPH-FA57
+FA58;W # CJK COMPATIBILITY IDEOGRAPH-FA58
+FA59;W # CJK COMPATIBILITY IDEOGRAPH-FA59
+FA5A;W # CJK COMPATIBILITY IDEOGRAPH-FA5A
+FA5B;W # CJK COMPATIBILITY IDEOGRAPH-FA5B
+FA5C;W # CJK COMPATIBILITY IDEOGRAPH-FA5C
+FA5D;W # CJK COMPATIBILITY IDEOGRAPH-FA5D
+FA5E;W # CJK COMPATIBILITY IDEOGRAPH-FA5E
+FA5F;W # CJK COMPATIBILITY IDEOGRAPH-FA5F
+FA60;W # CJK COMPATIBILITY IDEOGRAPH-FA60
+FA61;W # CJK COMPATIBILITY IDEOGRAPH-FA61
+FA62;W # CJK COMPATIBILITY IDEOGRAPH-FA62
+FA63;W # CJK COMPATIBILITY IDEOGRAPH-FA63
+FA64;W # CJK COMPATIBILITY IDEOGRAPH-FA64
+FA65;W # CJK COMPATIBILITY IDEOGRAPH-FA65
+FA66;W # CJK COMPATIBILITY IDEOGRAPH-FA66
+FA67;W # CJK COMPATIBILITY IDEOGRAPH-FA67
+FA68;W # CJK COMPATIBILITY IDEOGRAPH-FA68
+FA69;W # CJK COMPATIBILITY IDEOGRAPH-FA69
+FA6A;W # CJK COMPATIBILITY IDEOGRAPH-FA6A
+FA70;W # CJK COMPATIBILITY IDEOGRAPH-FA70
+FA71;W # CJK COMPATIBILITY IDEOGRAPH-FA71
+FA72;W # CJK COMPATIBILITY IDEOGRAPH-FA72
+FA73;W # CJK COMPATIBILITY IDEOGRAPH-FA73
+FA74;W # CJK COMPATIBILITY IDEOGRAPH-FA74
+FA75;W # CJK COMPATIBILITY IDEOGRAPH-FA75
+FA76;W # CJK COMPATIBILITY IDEOGRAPH-FA76
+FA77;W # CJK COMPATIBILITY IDEOGRAPH-FA77
+FA78;W # CJK COMPATIBILITY IDEOGRAPH-FA78
+FA79;W # CJK COMPATIBILITY IDEOGRAPH-FA79
+FA7A;W # CJK COMPATIBILITY IDEOGRAPH-FA7A
+FA7B;W # CJK COMPATIBILITY IDEOGRAPH-FA7B
+FA7C;W # CJK COMPATIBILITY IDEOGRAPH-FA7C
+FA7D;W # CJK COMPATIBILITY IDEOGRAPH-FA7D
+FA7E;W # CJK COMPATIBILITY IDEOGRAPH-FA7E
+FA7F;W # CJK COMPATIBILITY IDEOGRAPH-FA7F
+FA80;W # CJK COMPATIBILITY IDEOGRAPH-FA80
+FA81;W # CJK COMPATIBILITY IDEOGRAPH-FA81
+FA82;W # CJK COMPATIBILITY IDEOGRAPH-FA82
+FA83;W # CJK COMPATIBILITY IDEOGRAPH-FA83
+FA84;W # CJK COMPATIBILITY IDEOGRAPH-FA84
+FA85;W # CJK COMPATIBILITY IDEOGRAPH-FA85
+FA86;W # CJK COMPATIBILITY IDEOGRAPH-FA86
+FA87;W # CJK COMPATIBILITY IDEOGRAPH-FA87
+FA88;W # CJK COMPATIBILITY IDEOGRAPH-FA88
+FA89;W # CJK COMPATIBILITY IDEOGRAPH-FA89
+FA8A;W # CJK COMPATIBILITY IDEOGRAPH-FA8A
+FA8B;W # CJK COMPATIBILITY IDEOGRAPH-FA8B
+FA8C;W # CJK COMPATIBILITY IDEOGRAPH-FA8C
+FA8D;W # CJK COMPATIBILITY IDEOGRAPH-FA8D
+FA8E;W # CJK COMPATIBILITY IDEOGRAPH-FA8E
+FA8F;W # CJK COMPATIBILITY IDEOGRAPH-FA8F
+FA90;W # CJK COMPATIBILITY IDEOGRAPH-FA90
+FA91;W # CJK COMPATIBILITY IDEOGRAPH-FA91
+FA92;W # CJK COMPATIBILITY IDEOGRAPH-FA92
+FA93;W # CJK COMPATIBILITY IDEOGRAPH-FA93
+FA94;W # CJK COMPATIBILITY IDEOGRAPH-FA94
+FA95;W # CJK COMPATIBILITY IDEOGRAPH-FA95
+FA96;W # CJK COMPATIBILITY IDEOGRAPH-FA96
+FA97;W # CJK COMPATIBILITY IDEOGRAPH-FA97
+FA98;W # CJK COMPATIBILITY IDEOGRAPH-FA98
+FA99;W # CJK COMPATIBILITY IDEOGRAPH-FA99
+FA9A;W # CJK COMPATIBILITY IDEOGRAPH-FA9A
+FA9B;W # CJK COMPATIBILITY IDEOGRAPH-FA9B
+FA9C;W # CJK COMPATIBILITY IDEOGRAPH-FA9C
+FA9D;W # CJK COMPATIBILITY IDEOGRAPH-FA9D
+FA9E;W # CJK COMPATIBILITY IDEOGRAPH-FA9E
+FA9F;W # CJK COMPATIBILITY IDEOGRAPH-FA9F
+FAA0;W # CJK COMPATIBILITY IDEOGRAPH-FAA0
+FAA1;W # CJK COMPATIBILITY IDEOGRAPH-FAA1
+FAA2;W # CJK COMPATIBILITY IDEOGRAPH-FAA2
+FAA3;W # CJK COMPATIBILITY IDEOGRAPH-FAA3
+FAA4;W # CJK COMPATIBILITY IDEOGRAPH-FAA4
+FAA5;W # CJK COMPATIBILITY IDEOGRAPH-FAA5
+FAA6;W # CJK COMPATIBILITY IDEOGRAPH-FAA6
+FAA7;W # CJK COMPATIBILITY IDEOGRAPH-FAA7
+FAA8;W # CJK COMPATIBILITY IDEOGRAPH-FAA8
+FAA9;W # CJK COMPATIBILITY IDEOGRAPH-FAA9
+FAAA;W # CJK COMPATIBILITY IDEOGRAPH-FAAA
+FAAB;W # CJK COMPATIBILITY IDEOGRAPH-FAAB
+FAAC;W # CJK COMPATIBILITY IDEOGRAPH-FAAC
+FAAD;W # CJK COMPATIBILITY IDEOGRAPH-FAAD
+FAAE;W # CJK COMPATIBILITY IDEOGRAPH-FAAE
+FAAF;W # CJK COMPATIBILITY IDEOGRAPH-FAAF
+FAB0;W # CJK COMPATIBILITY IDEOGRAPH-FAB0
+FAB1;W # CJK COMPATIBILITY IDEOGRAPH-FAB1
+FAB2;W # CJK COMPATIBILITY IDEOGRAPH-FAB2
+FAB3;W # CJK COMPATIBILITY IDEOGRAPH-FAB3
+FAB4;W # CJK COMPATIBILITY IDEOGRAPH-FAB4
+FAB5;W # CJK COMPATIBILITY IDEOGRAPH-FAB5
+FAB6;W # CJK COMPATIBILITY IDEOGRAPH-FAB6
+FAB7;W # CJK COMPATIBILITY IDEOGRAPH-FAB7
+FAB8;W # CJK COMPATIBILITY IDEOGRAPH-FAB8
+FAB9;W # CJK COMPATIBILITY IDEOGRAPH-FAB9
+FABA;W # CJK COMPATIBILITY IDEOGRAPH-FABA
+FABB;W # CJK COMPATIBILITY IDEOGRAPH-FABB
+FABC;W # CJK COMPATIBILITY IDEOGRAPH-FABC
+FABD;W # CJK COMPATIBILITY IDEOGRAPH-FABD
+FABE;W # CJK COMPATIBILITY IDEOGRAPH-FABE
+FABF;W # CJK COMPATIBILITY IDEOGRAPH-FABF
+FAC0;W # CJK COMPATIBILITY IDEOGRAPH-FAC0
+FAC1;W # CJK COMPATIBILITY IDEOGRAPH-FAC1
+FAC2;W # CJK COMPATIBILITY IDEOGRAPH-FAC2
+FAC3;W # CJK COMPATIBILITY IDEOGRAPH-FAC3
+FAC4;W # CJK COMPATIBILITY IDEOGRAPH-FAC4
+FAC5;W # CJK COMPATIBILITY IDEOGRAPH-FAC5
+FAC6;W # CJK COMPATIBILITY IDEOGRAPH-FAC6
+FAC7;W # CJK COMPATIBILITY IDEOGRAPH-FAC7
+FAC8;W # CJK COMPATIBILITY IDEOGRAPH-FAC8
+FAC9;W # CJK COMPATIBILITY IDEOGRAPH-FAC9
+FACA;W # CJK COMPATIBILITY IDEOGRAPH-FACA
+FACB;W # CJK COMPATIBILITY IDEOGRAPH-FACB
+FACC;W # CJK COMPATIBILITY IDEOGRAPH-FACC
+FACD;W # CJK COMPATIBILITY IDEOGRAPH-FACD
+FACE;W # CJK COMPATIBILITY IDEOGRAPH-FACE
+FACF;W # CJK COMPATIBILITY IDEOGRAPH-FACF
+FAD0;W # CJK COMPATIBILITY IDEOGRAPH-FAD0
+FAD1;W # CJK COMPATIBILITY IDEOGRAPH-FAD1
+FAD2;W # CJK COMPATIBILITY IDEOGRAPH-FAD2
+FAD3;W # CJK COMPATIBILITY IDEOGRAPH-FAD3
+FAD4;W # CJK COMPATIBILITY IDEOGRAPH-FAD4
+FAD5;W # CJK COMPATIBILITY IDEOGRAPH-FAD5
+FAD6;W # CJK COMPATIBILITY IDEOGRAPH-FAD6
+FAD7;W # CJK COMPATIBILITY IDEOGRAPH-FAD7
+FAD8;W # CJK COMPATIBILITY IDEOGRAPH-FAD8
+FAD9;W # CJK COMPATIBILITY IDEOGRAPH-FAD9
+FB00;N # LATIN SMALL LIGATURE FF
+FB01;N # LATIN SMALL LIGATURE FI
+FB02;N # LATIN SMALL LIGATURE FL
+FB03;N # LATIN SMALL LIGATURE FFI
+FB04;N # LATIN SMALL LIGATURE FFL
+FB05;N # LATIN SMALL LIGATURE LONG S T
+FB06;N # LATIN SMALL LIGATURE ST
+FB13;N # ARMENIAN SMALL LIGATURE MEN NOW
+FB14;N # ARMENIAN SMALL LIGATURE MEN ECH
+FB15;N # ARMENIAN SMALL LIGATURE MEN INI
+FB16;N # ARMENIAN SMALL LIGATURE VEW NOW
+FB17;N # ARMENIAN SMALL LIGATURE MEN XEH
+FB1D;N # HEBREW LETTER YOD WITH HIRIQ
+FB1E;N # HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F;N # HEBREW LIGATURE YIDDISH YOD YOD PATAH
+FB20;N # HEBREW LETTER ALTERNATIVE AYIN
+FB21;N # HEBREW LETTER WIDE ALEF
+FB22;N # HEBREW LETTER WIDE DALET
+FB23;N # HEBREW LETTER WIDE HE
+FB24;N # HEBREW LETTER WIDE KAF
+FB25;N # HEBREW LETTER WIDE LAMED
+FB26;N # HEBREW LETTER WIDE FINAL MEM
+FB27;N # HEBREW LETTER WIDE RESH
+FB28;N # HEBREW LETTER WIDE TAV
+FB29;N # HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A;N # HEBREW LETTER SHIN WITH SHIN DOT
+FB2B;N # HEBREW LETTER SHIN WITH SIN DOT
+FB2C;N # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+FB2D;N # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+FB2E;N # HEBREW LETTER ALEF WITH PATAH
+FB2F;N # HEBREW LETTER ALEF WITH QAMATS
+FB30;N # HEBREW LETTER ALEF WITH MAPIQ
+FB31;N # HEBREW LETTER BET WITH DAGESH
+FB32;N # HEBREW LETTER GIMEL WITH DAGESH
+FB33;N # HEBREW LETTER DALET WITH DAGESH
+FB34;N # HEBREW LETTER HE WITH MAPIQ
+FB35;N # HEBREW LETTER VAV WITH DAGESH
+FB36;N # HEBREW LETTER ZAYIN WITH DAGESH
+FB38;N # HEBREW LETTER TET WITH DAGESH
+FB39;N # HEBREW LETTER YOD WITH DAGESH
+FB3A;N # HEBREW LETTER FINAL KAF WITH DAGESH
+FB3B;N # HEBREW LETTER KAF WITH DAGESH
+FB3C;N # HEBREW LETTER LAMED WITH DAGESH
+FB3E;N # HEBREW LETTER MEM WITH DAGESH
+FB40;N # HEBREW LETTER NUN WITH DAGESH
+FB41;N # HEBREW LETTER SAMEKH WITH DAGESH
+FB43;N # HEBREW LETTER FINAL PE WITH DAGESH
+FB44;N # HEBREW LETTER PE WITH DAGESH
+FB46;N # HEBREW LETTER TSADI WITH DAGESH
+FB47;N # HEBREW LETTER QOF WITH DAGESH
+FB48;N # HEBREW LETTER RESH WITH DAGESH
+FB49;N # HEBREW LETTER SHIN WITH DAGESH
+FB4A;N # HEBREW LETTER TAV WITH DAGESH
+FB4B;N # HEBREW LETTER VAV WITH HOLAM
+FB4C;N # HEBREW LETTER BET WITH RAFE
+FB4D;N # HEBREW LETTER KAF WITH RAFE
+FB4E;N # HEBREW LETTER PE WITH RAFE
+FB4F;N # HEBREW LIGATURE ALEF LAMED
+FB50;N # ARABIC LETTER ALEF WASLA ISOLATED FORM
+FB51;N # ARABIC LETTER ALEF WASLA FINAL FORM
+FB52;N # ARABIC LETTER BEEH ISOLATED FORM
+FB53;N # ARABIC LETTER BEEH FINAL FORM
+FB54;N # ARABIC LETTER BEEH INITIAL FORM
+FB55;N # ARABIC LETTER BEEH MEDIAL FORM
+FB56;N # ARABIC LETTER PEH ISOLATED FORM
+FB57;N # ARABIC LETTER PEH FINAL FORM
+FB58;N # ARABIC LETTER PEH INITIAL FORM
+FB59;N # ARABIC LETTER PEH MEDIAL FORM
+FB5A;N # ARABIC LETTER BEHEH ISOLATED FORM
+FB5B;N # ARABIC LETTER BEHEH FINAL FORM
+FB5C;N # ARABIC LETTER BEHEH INITIAL FORM
+FB5D;N # ARABIC LETTER BEHEH MEDIAL FORM
+FB5E;N # ARABIC LETTER TTEHEH ISOLATED FORM
+FB5F;N # ARABIC LETTER TTEHEH FINAL FORM
+FB60;N # ARABIC LETTER TTEHEH INITIAL FORM
+FB61;N # ARABIC LETTER TTEHEH MEDIAL FORM
+FB62;N # ARABIC LETTER TEHEH ISOLATED FORM
+FB63;N # ARABIC LETTER TEHEH FINAL FORM
+FB64;N # ARABIC LETTER TEHEH INITIAL FORM
+FB65;N # ARABIC LETTER TEHEH MEDIAL FORM
+FB66;N # ARABIC LETTER TTEH ISOLATED FORM
+FB67;N # ARABIC LETTER TTEH FINAL FORM
+FB68;N # ARABIC LETTER TTEH INITIAL FORM
+FB69;N # ARABIC LETTER TTEH MEDIAL FORM
+FB6A;N # ARABIC LETTER VEH ISOLATED FORM
+FB6B;N # ARABIC LETTER VEH FINAL FORM
+FB6C;N # ARABIC LETTER VEH INITIAL FORM
+FB6D;N # ARABIC LETTER VEH MEDIAL FORM
+FB6E;N # ARABIC LETTER PEHEH ISOLATED FORM
+FB6F;N # ARABIC LETTER PEHEH FINAL FORM
+FB70;N # ARABIC LETTER PEHEH INITIAL FORM
+FB71;N # ARABIC LETTER PEHEH MEDIAL FORM
+FB72;N # ARABIC LETTER DYEH ISOLATED FORM
+FB73;N # ARABIC LETTER DYEH FINAL FORM
+FB74;N # ARABIC LETTER DYEH INITIAL FORM
+FB75;N # ARABIC LETTER DYEH MEDIAL FORM
+FB76;N # ARABIC LETTER NYEH ISOLATED FORM
+FB77;N # ARABIC LETTER NYEH FINAL FORM
+FB78;N # ARABIC LETTER NYEH INITIAL FORM
+FB79;N # ARABIC LETTER NYEH MEDIAL FORM
+FB7A;N # ARABIC LETTER TCHEH ISOLATED FORM
+FB7B;N # ARABIC LETTER TCHEH FINAL FORM
+FB7C;N # ARABIC LETTER TCHEH INITIAL FORM
+FB7D;N # ARABIC LETTER TCHEH MEDIAL FORM
+FB7E;N # ARABIC LETTER TCHEHEH ISOLATED FORM
+FB7F;N # ARABIC LETTER TCHEHEH FINAL FORM
+FB80;N # ARABIC LETTER TCHEHEH INITIAL FORM
+FB81;N # ARABIC LETTER TCHEHEH MEDIAL FORM
+FB82;N # ARABIC LETTER DDAHAL ISOLATED FORM
+FB83;N # ARABIC LETTER DDAHAL FINAL FORM
+FB84;N # ARABIC LETTER DAHAL ISOLATED FORM
+FB85;N # ARABIC LETTER DAHAL FINAL FORM
+FB86;N # ARABIC LETTER DUL ISOLATED FORM
+FB87;N # ARABIC LETTER DUL FINAL FORM
+FB88;N # ARABIC LETTER DDAL ISOLATED FORM
+FB89;N # ARABIC LETTER DDAL FINAL FORM
+FB8A;N # ARABIC LETTER JEH ISOLATED FORM
+FB8B;N # ARABIC LETTER JEH FINAL FORM
+FB8C;N # ARABIC LETTER RREH ISOLATED FORM
+FB8D;N # ARABIC LETTER RREH FINAL FORM
+FB8E;N # ARABIC LETTER KEHEH ISOLATED FORM
+FB8F;N # ARABIC LETTER KEHEH FINAL FORM
+FB90;N # ARABIC LETTER KEHEH INITIAL FORM
+FB91;N # ARABIC LETTER KEHEH MEDIAL FORM
+FB92;N # ARABIC LETTER GAF ISOLATED FORM
+FB93;N # ARABIC LETTER GAF FINAL FORM
+FB94;N # ARABIC LETTER GAF INITIAL FORM
+FB95;N # ARABIC LETTER GAF MEDIAL FORM
+FB96;N # ARABIC LETTER GUEH ISOLATED FORM
+FB97;N # ARABIC LETTER GUEH FINAL FORM
+FB98;N # ARABIC LETTER GUEH INITIAL FORM
+FB99;N # ARABIC LETTER GUEH MEDIAL FORM
+FB9A;N # ARABIC LETTER NGOEH ISOLATED FORM
+FB9B;N # ARABIC LETTER NGOEH FINAL FORM
+FB9C;N # ARABIC LETTER NGOEH INITIAL FORM
+FB9D;N # ARABIC LETTER NGOEH MEDIAL FORM
+FB9E;N # ARABIC LETTER NOON GHUNNA ISOLATED FORM
+FB9F;N # ARABIC LETTER NOON GHUNNA FINAL FORM
+FBA0;N # ARABIC LETTER RNOON ISOLATED FORM
+FBA1;N # ARABIC LETTER RNOON FINAL FORM
+FBA2;N # ARABIC LETTER RNOON INITIAL FORM
+FBA3;N # ARABIC LETTER RNOON MEDIAL FORM
+FBA4;N # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+FBA5;N # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+FBA6;N # ARABIC LETTER HEH GOAL ISOLATED FORM
+FBA7;N # ARABIC LETTER HEH GOAL FINAL FORM
+FBA8;N # ARABIC LETTER HEH GOAL INITIAL FORM
+FBA9;N # ARABIC LETTER HEH GOAL MEDIAL FORM
+FBAA;N # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+FBAB;N # ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+FBAC;N # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+FBAD;N # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+FBAE;N # ARABIC LETTER YEH BARREE ISOLATED FORM
+FBAF;N # ARABIC LETTER YEH BARREE FINAL FORM
+FBB0;N # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+FBB1;N # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3;N # ARABIC LETTER NG ISOLATED FORM
+FBD4;N # ARABIC LETTER NG FINAL FORM
+FBD5;N # ARABIC LETTER NG INITIAL FORM
+FBD6;N # ARABIC LETTER NG MEDIAL FORM
+FBD7;N # ARABIC LETTER U ISOLATED FORM
+FBD8;N # ARABIC LETTER U FINAL FORM
+FBD9;N # ARABIC LETTER OE ISOLATED FORM
+FBDA;N # ARABIC LETTER OE FINAL FORM
+FBDB;N # ARABIC LETTER YU ISOLATED FORM
+FBDC;N # ARABIC LETTER YU FINAL FORM
+FBDD;N # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+FBDE;N # ARABIC LETTER VE ISOLATED FORM
+FBDF;N # ARABIC LETTER VE FINAL FORM
+FBE0;N # ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+FBE1;N # ARABIC LETTER KIRGHIZ OE FINAL FORM
+FBE2;N # ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+FBE3;N # ARABIC LETTER KIRGHIZ YU FINAL FORM
+FBE4;N # ARABIC LETTER E ISOLATED FORM
+FBE5;N # ARABIC LETTER E FINAL FORM
+FBE6;N # ARABIC LETTER E INITIAL FORM
+FBE7;N # ARABIC LETTER E MEDIAL FORM
+FBE8;N # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+FBE9;N # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+FBEA;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+FBEB;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+FBEC;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+FBED;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+FBEE;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+FBEF;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+FBF0;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+FBF1;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+FBF2;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+FBF3;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+FBF4;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+FBF5;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+FBF6;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+FBF7;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+FBF8;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+FBF9;N # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FBFA;N # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FBFB;N # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+FBFC;N # ARABIC LETTER FARSI YEH ISOLATED FORM
+FBFD;N # ARABIC LETTER FARSI YEH FINAL FORM
+FBFE;N # ARABIC LETTER FARSI YEH INITIAL FORM
+FBFF;N # ARABIC LETTER FARSI YEH MEDIAL FORM
+FC00;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+FC01;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+FC02;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+FC03;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FC04;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+FC05;N # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+FC06;N # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+FC07;N # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+FC08;N # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+FC09;N # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+FC0A;N # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+FC0B;N # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+FC0C;N # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+FC0D;N # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+FC0E;N # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+FC0F;N # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+FC10;N # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+FC11;N # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+FC12;N # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+FC13;N # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+FC14;N # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+FC15;N # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+FC16;N # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+FC17;N # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+FC18;N # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+FC19;N # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+FC1A;N # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+FC1B;N # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+FC1C;N # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+FC1D;N # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+FC1E;N # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+FC1F;N # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+FC20;N # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+FC21;N # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+FC22;N # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+FC23;N # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+FC24;N # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+FC25;N # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+FC26;N # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+FC27;N # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+FC28;N # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+FC29;N # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+FC2A;N # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+FC2B;N # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+FC2C;N # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+FC2D;N # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+FC2E;N # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+FC2F;N # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+FC30;N # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+FC31;N # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+FC32;N # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+FC33;N # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+FC34;N # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+FC35;N # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+FC36;N # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+FC37;N # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+FC38;N # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+FC39;N # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+FC3A;N # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+FC3B;N # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+FC3C;N # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+FC3D;N # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+FC3E;N # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+FC3F;N # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+FC40;N # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+FC41;N # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+FC42;N # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+FC43;N # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+FC44;N # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+FC45;N # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+FC46;N # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+FC47;N # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+FC48;N # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+FC49;N # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+FC4A;N # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+FC4B;N # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+FC4C;N # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+FC4D;N # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+FC4E;N # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+FC4F;N # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+FC50;N # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+FC51;N # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+FC52;N # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+FC53;N # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+FC54;N # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+FC55;N # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+FC56;N # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+FC57;N # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+FC58;N # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+FC59;N # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+FC5A;N # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+FC5B;N # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5C;N # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5D;N # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5E;N # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+FC5F;N # ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+FC60;N # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+FC61;N # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+FC62;N # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+FC63;N # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC64;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+FC65;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+FC66;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+FC67;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+FC68;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FC69;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+FC6A;N # ARABIC LIGATURE BEH WITH REH FINAL FORM
+FC6B;N # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+FC6C;N # ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+FC6D;N # ARABIC LIGATURE BEH WITH NOON FINAL FORM
+FC6E;N # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+FC6F;N # ARABIC LIGATURE BEH WITH YEH FINAL FORM
+FC70;N # ARABIC LIGATURE TEH WITH REH FINAL FORM
+FC71;N # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+FC72;N # ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+FC73;N # ARABIC LIGATURE TEH WITH NOON FINAL FORM
+FC74;N # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+FC75;N # ARABIC LIGATURE TEH WITH YEH FINAL FORM
+FC76;N # ARABIC LIGATURE THEH WITH REH FINAL FORM
+FC77;N # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+FC78;N # ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+FC79;N # ARABIC LIGATURE THEH WITH NOON FINAL FORM
+FC7A;N # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+FC7B;N # ARABIC LIGATURE THEH WITH YEH FINAL FORM
+FC7C;N # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+FC7D;N # ARABIC LIGATURE FEH WITH YEH FINAL FORM
+FC7E;N # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+FC7F;N # ARABIC LIGATURE QAF WITH YEH FINAL FORM
+FC80;N # ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+FC81;N # ARABIC LIGATURE KAF WITH LAM FINAL FORM
+FC82;N # ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+FC83;N # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+FC84;N # ARABIC LIGATURE KAF WITH YEH FINAL FORM
+FC85;N # ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+FC86;N # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+FC87;N # ARABIC LIGATURE LAM WITH YEH FINAL FORM
+FC88;N # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+FC89;N # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+FC8A;N # ARABIC LIGATURE NOON WITH REH FINAL FORM
+FC8B;N # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+FC8C;N # ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+FC8D;N # ARABIC LIGATURE NOON WITH NOON FINAL FORM
+FC8E;N # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+FC8F;N # ARABIC LIGATURE NOON WITH YEH FINAL FORM
+FC90;N # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+FC91;N # ARABIC LIGATURE YEH WITH REH FINAL FORM
+FC92;N # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+FC93;N # ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+FC94;N # ARABIC LIGATURE YEH WITH NOON FINAL FORM
+FC95;N # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+FC96;N # ARABIC LIGATURE YEH WITH YEH FINAL FORM
+FC97;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+FC98;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+FC99;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+FC9A;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+FC9B;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+FC9C;N # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+FC9D;N # ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+FC9E;N # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+FC9F;N # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+FCA0;N # ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+FCA1;N # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+FCA2;N # ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+FCA3;N # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+FCA4;N # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+FCA5;N # ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+FCA6;N # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+FCA7;N # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+FCA8;N # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+FCA9;N # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+FCAA;N # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+FCAB;N # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+FCAC;N # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+FCAD;N # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+FCAE;N # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+FCAF;N # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+FCB0;N # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+FCB1;N # ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+FCB2;N # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+FCB3;N # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+FCB4;N # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+FCB5;N # ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+FCB6;N # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+FCB7;N # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+FCB8;N # ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+FCB9;N # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+FCBA;N # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+FCBB;N # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+FCBC;N # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+FCBD;N # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+FCBE;N # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+FCBF;N # ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+FCC0;N # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+FCC1;N # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+FCC2;N # ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+FCC3;N # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+FCC4;N # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+FCC5;N # ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+FCC6;N # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+FCC7;N # ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+FCC8;N # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+FCC9;N # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+FCCA;N # ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+FCCB;N # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+FCCC;N # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+FCCD;N # ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+FCCE;N # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+FCCF;N # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+FCD0;N # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+FCD1;N # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+FCD2;N # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+FCD3;N # ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+FCD4;N # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+FCD5;N # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+FCD6;N # ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+FCD7;N # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+FCD8;N # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+FCD9;N # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+FCDA;N # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+FCDB;N # ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+FCDC;N # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+FCDD;N # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+FCDE;N # ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+FCDF;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+FCE0;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+FCE1;N # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+FCE2;N # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+FCE3;N # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+FCE4;N # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+FCE5;N # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+FCE6;N # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+FCE7;N # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+FCE8;N # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+FCE9;N # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+FCEA;N # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+FCEB;N # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+FCEC;N # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+FCED;N # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+FCEE;N # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+FCEF;N # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+FCF0;N # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+FCF1;N # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+FCF2;N # ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+FCF3;N # ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+FCF4;N # ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+FCF5;N # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+FCF6;N # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+FCF7;N # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+FCF8;N # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+FCF9;N # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+FCFA;N # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+FCFB;N # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFC;N # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+FCFD;N # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFE;N # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+FCFF;N # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+FD00;N # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+FD01;N # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+FD02;N # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+FD03;N # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+FD04;N # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+FD05;N # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+FD06;N # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+FD07;N # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+FD08;N # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+FD09;N # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+FD0A;N # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+FD0B;N # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+FD0C;N # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+FD0D;N # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+FD0E;N # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+FD0F;N # ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+FD10;N # ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+FD11;N # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+FD12;N # ARABIC LIGATURE TAH WITH YEH FINAL FORM
+FD13;N # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+FD14;N # ARABIC LIGATURE AIN WITH YEH FINAL FORM
+FD15;N # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+FD16;N # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+FD17;N # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+FD18;N # ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+FD19;N # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+FD1A;N # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+FD1B;N # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+FD1C;N # ARABIC LIGATURE HAH WITH YEH FINAL FORM
+FD1D;N # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+FD1E;N # ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+FD1F;N # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+FD20;N # ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+FD21;N # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+FD22;N # ARABIC LIGATURE SAD WITH YEH FINAL FORM
+FD23;N # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+FD24;N # ARABIC LIGATURE DAD WITH YEH FINAL FORM
+FD25;N # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+FD26;N # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+FD27;N # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+FD28;N # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+FD29;N # ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+FD2A;N # ARABIC LIGATURE SEEN WITH REH FINAL FORM
+FD2B;N # ARABIC LIGATURE SAD WITH REH FINAL FORM
+FD2C;N # ARABIC LIGATURE DAD WITH REH FINAL FORM
+FD2D;N # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+FD2E;N # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+FD2F;N # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+FD30;N # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+FD31;N # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+FD32;N # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+FD33;N # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+FD34;N # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+FD35;N # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+FD36;N # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+FD37;N # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+FD38;N # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+FD39;N # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+FD3A;N # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+FD3B;N # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+FD3C;N # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+FD3D;N # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD3E;N # ORNATE LEFT PARENTHESIS
+FD3F;N # ORNATE RIGHT PARENTHESIS
+FD50;N # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+FD51;N # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+FD52;N # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+FD53;N # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+FD54;N # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+FD55;N # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+FD56;N # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+FD57;N # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+FD58;N # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+FD59;N # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+FD5A;N # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+FD5B;N # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD5C;N # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+FD5D;N # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+FD5E;N # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD5F;N # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+FD60;N # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+FD61;N # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+FD62;N # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+FD63;N # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+FD64;N # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+FD65;N # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+FD66;N # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+FD67;N # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+FD68;N # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+FD69;N # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+FD6A;N # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+FD6B;N # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+FD6C;N # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+FD6D;N # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+FD6E;N # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD6F;N # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+FD70;N # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+FD71;N # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+FD72;N # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+FD73;N # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+FD74;N # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+FD75;N # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+FD76;N # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+FD77;N # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+FD78;N # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD79;N # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+FD7A;N # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+FD7B;N # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD7C;N # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+FD7D;N # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+FD7E;N # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+FD7F;N # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+FD80;N # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+FD81;N # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+FD82;N # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD83;N # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+FD84;N # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+FD85;N # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+FD86;N # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+FD87;N # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+FD88;N # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+FD89;N # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+FD8A;N # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+FD8B;N # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+FD8C;N # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+FD8D;N # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+FD8E;N # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+FD8F;N # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92;N # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+FD93;N # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+FD94;N # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+FD95;N # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+FD96;N # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD97;N # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+FD98;N # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+FD99;N # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD9A;N # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+FD9B;N # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD9C;N # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+FD9D;N # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+FD9E;N # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+FD9F;N # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+FDA0;N # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FDA1;N # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+FDA2;N # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA3;N # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+FDA4;N # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA5;N # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+FDA6;N # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FDA7;N # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA8;N # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA9;N # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+FDAA;N # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+FDAB;N # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+FDAC;N # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+FDAD;N # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+FDAE;N # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+FDAF;N # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+FDB0;N # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+FDB1;N # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+FDB2;N # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+FDB3;N # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+FDB4;N # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+FDB5;N # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+FDB6;N # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+FDB7;N # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+FDB8;N # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+FDB9;N # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+FDBA;N # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+FDBB;N # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+FDBC;N # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+FDBD;N # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+FDBE;N # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+FDBF;N # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+FDC0;N # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+FDC1;N # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+FDC2;N # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+FDC3;N # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+FDC4;N # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+FDC5;N # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+FDC6;N # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+FDC7;N # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0;N # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF1;N # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF2;N # ARABIC LIGATURE ALLAH ISOLATED FORM
+FDF3;N # ARABIC LIGATURE AKBAR ISOLATED FORM
+FDF4;N # ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+FDF5;N # ARABIC LIGATURE SALAM ISOLATED FORM
+FDF6;N # ARABIC LIGATURE RASOUL ISOLATED FORM
+FDF7;N # ARABIC LIGATURE ALAYHE ISOLATED FORM
+FDF8;N # ARABIC LIGATURE WASALLAM ISOLATED FORM
+FDF9;N # ARABIC LIGATURE SALLA ISOLATED FORM
+FDFA;N # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+FDFB;N # ARABIC LIGATURE JALLAJALALOUHOU
+FDFC;N # RIAL SIGN
+FDFD;N # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE00;A # VARIATION SELECTOR-1
+FE01;A # VARIATION SELECTOR-2
+FE02;A # VARIATION SELECTOR-3
+FE03;A # VARIATION SELECTOR-4
+FE04;A # VARIATION SELECTOR-5
+FE05;A # VARIATION SELECTOR-6
+FE06;A # VARIATION SELECTOR-7
+FE07;A # VARIATION SELECTOR-8
+FE08;A # VARIATION SELECTOR-9
+FE09;A # VARIATION SELECTOR-10
+FE0A;A # VARIATION SELECTOR-11
+FE0B;A # VARIATION SELECTOR-12
+FE0C;A # VARIATION SELECTOR-13
+FE0D;A # VARIATION SELECTOR-14
+FE0E;A # VARIATION SELECTOR-15
+FE0F;A # VARIATION SELECTOR-16
+FE10;W # PRESENTATION FORM FOR VERTICAL COMMA
+FE11;W # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
+FE12;W # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP
+FE13;W # PRESENTATION FORM FOR VERTICAL COLON
+FE14;W # PRESENTATION FORM FOR VERTICAL SEMICOLON
+FE15;W # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
+FE16;W # PRESENTATION FORM FOR VERTICAL QUESTION MARK
+FE17;W # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+FE18;W # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+FE19;W # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE20;N # COMBINING LIGATURE LEFT HALF
+FE21;N # COMBINING LIGATURE RIGHT HALF
+FE22;N # COMBINING DOUBLE TILDE LEFT HALF
+FE23;N # COMBINING DOUBLE TILDE RIGHT HALF
+FE24;N # COMBINING MACRON LEFT HALF
+FE25;N # COMBINING MACRON RIGHT HALF
+FE26;N # COMBINING CONJOINING MACRON
+FE30;W # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31;W # PRESENTATION FORM FOR VERTICAL EM DASH
+FE32;W # PRESENTATION FORM FOR VERTICAL EN DASH
+FE33;W # PRESENTATION FORM FOR VERTICAL LOW LINE
+FE34;W # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35;W # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36;W # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37;W # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38;W # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39;W # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A;W # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B;W # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C;W # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D;W # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E;W # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F;W # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40;W # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41;W # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42;W # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43;W # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44;W # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45;W # SESAME DOT
+FE46;W # WHITE SESAME DOT
+FE47;W # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48;W # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49;W # DASHED OVERLINE
+FE4A;W # CENTRELINE OVERLINE
+FE4B;W # WAVY OVERLINE
+FE4C;W # DOUBLE WAVY OVERLINE
+FE4D;W # DASHED LOW LINE
+FE4E;W # CENTRELINE LOW LINE
+FE4F;W # WAVY LOW LINE
+FE50;W # SMALL COMMA
+FE51;W # SMALL IDEOGRAPHIC COMMA
+FE52;W # SMALL FULL STOP
+FE54;W # SMALL SEMICOLON
+FE55;W # SMALL COLON
+FE56;W # SMALL QUESTION MARK
+FE57;W # SMALL EXCLAMATION MARK
+FE58;W # SMALL EM DASH
+FE59;W # SMALL LEFT PARENTHESIS
+FE5A;W # SMALL RIGHT PARENTHESIS
+FE5B;W # SMALL LEFT CURLY BRACKET
+FE5C;W # SMALL RIGHT CURLY BRACKET
+FE5D;W # SMALL LEFT TORTOISE SHELL BRACKET
+FE5E;W # SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F;W # SMALL NUMBER SIGN
+FE60;W # SMALL AMPERSAND
+FE61;W # SMALL ASTERISK
+FE62;W # SMALL PLUS SIGN
+FE63;W # SMALL HYPHEN-MINUS
+FE64;W # SMALL LESS-THAN SIGN
+FE65;W # SMALL GREATER-THAN SIGN
+FE66;W # SMALL EQUALS SIGN
+FE68;W # SMALL REVERSE SOLIDUS
+FE69;W # SMALL DOLLAR SIGN
+FE6A;W # SMALL PERCENT SIGN
+FE6B;W # SMALL COMMERCIAL AT
+FE70;N # ARABIC FATHATAN ISOLATED FORM
+FE71;N # ARABIC TATWEEL WITH FATHATAN ABOVE
+FE72;N # ARABIC DAMMATAN ISOLATED FORM
+FE73;N # ARABIC TAIL FRAGMENT
+FE74;N # ARABIC KASRATAN ISOLATED FORM
+FE76;N # ARABIC FATHA ISOLATED FORM
+FE77;N # ARABIC FATHA MEDIAL FORM
+FE78;N # ARABIC DAMMA ISOLATED FORM
+FE79;N # ARABIC DAMMA MEDIAL FORM
+FE7A;N # ARABIC KASRA ISOLATED FORM
+FE7B;N # ARABIC KASRA MEDIAL FORM
+FE7C;N # ARABIC SHADDA ISOLATED FORM
+FE7D;N # ARABIC SHADDA MEDIAL FORM
+FE7E;N # ARABIC SUKUN ISOLATED FORM
+FE7F;N # ARABIC SUKUN MEDIAL FORM
+FE80;N # ARABIC LETTER HAMZA ISOLATED FORM
+FE81;N # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+FE82;N # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+FE83;N # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+FE84;N # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+FE85;N # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+FE86;N # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+FE87;N # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+FE88;N # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+FE89;N # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+FE8A;N # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+FE8B;N # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+FE8C;N # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+FE8D;N # ARABIC LETTER ALEF ISOLATED FORM
+FE8E;N # ARABIC LETTER ALEF FINAL FORM
+FE8F;N # ARABIC LETTER BEH ISOLATED FORM
+FE90;N # ARABIC LETTER BEH FINAL FORM
+FE91;N # ARABIC LETTER BEH INITIAL FORM
+FE92;N # ARABIC LETTER BEH MEDIAL FORM
+FE93;N # ARABIC LETTER TEH MARBUTA ISOLATED FORM
+FE94;N # ARABIC LETTER TEH MARBUTA FINAL FORM
+FE95;N # ARABIC LETTER TEH ISOLATED FORM
+FE96;N # ARABIC LETTER TEH FINAL FORM
+FE97;N # ARABIC LETTER TEH INITIAL FORM
+FE98;N # ARABIC LETTER TEH MEDIAL FORM
+FE99;N # ARABIC LETTER THEH ISOLATED FORM
+FE9A;N # ARABIC LETTER THEH FINAL FORM
+FE9B;N # ARABIC LETTER THEH INITIAL FORM
+FE9C;N # ARABIC LETTER THEH MEDIAL FORM
+FE9D;N # ARABIC LETTER JEEM ISOLATED FORM
+FE9E;N # ARABIC LETTER JEEM FINAL FORM
+FE9F;N # ARABIC LETTER JEEM INITIAL FORM
+FEA0;N # ARABIC LETTER JEEM MEDIAL FORM
+FEA1;N # ARABIC LETTER HAH ISOLATED FORM
+FEA2;N # ARABIC LETTER HAH FINAL FORM
+FEA3;N # ARABIC LETTER HAH INITIAL FORM
+FEA4;N # ARABIC LETTER HAH MEDIAL FORM
+FEA5;N # ARABIC LETTER KHAH ISOLATED FORM
+FEA6;N # ARABIC LETTER KHAH FINAL FORM
+FEA7;N # ARABIC LETTER KHAH INITIAL FORM
+FEA8;N # ARABIC LETTER KHAH MEDIAL FORM
+FEA9;N # ARABIC LETTER DAL ISOLATED FORM
+FEAA;N # ARABIC LETTER DAL FINAL FORM
+FEAB;N # ARABIC LETTER THAL ISOLATED FORM
+FEAC;N # ARABIC LETTER THAL FINAL FORM
+FEAD;N # ARABIC LETTER REH ISOLATED FORM
+FEAE;N # ARABIC LETTER REH FINAL FORM
+FEAF;N # ARABIC LETTER ZAIN ISOLATED FORM
+FEB0;N # ARABIC LETTER ZAIN FINAL FORM
+FEB1;N # ARABIC LETTER SEEN ISOLATED FORM
+FEB2;N # ARABIC LETTER SEEN FINAL FORM
+FEB3;N # ARABIC LETTER SEEN INITIAL FORM
+FEB4;N # ARABIC LETTER SEEN MEDIAL FORM
+FEB5;N # ARABIC LETTER SHEEN ISOLATED FORM
+FEB6;N # ARABIC LETTER SHEEN FINAL FORM
+FEB7;N # ARABIC LETTER SHEEN INITIAL FORM
+FEB8;N # ARABIC LETTER SHEEN MEDIAL FORM
+FEB9;N # ARABIC LETTER SAD ISOLATED FORM
+FEBA;N # ARABIC LETTER SAD FINAL FORM
+FEBB;N # ARABIC LETTER SAD INITIAL FORM
+FEBC;N # ARABIC LETTER SAD MEDIAL FORM
+FEBD;N # ARABIC LETTER DAD ISOLATED FORM
+FEBE;N # ARABIC LETTER DAD FINAL FORM
+FEBF;N # ARABIC LETTER DAD INITIAL FORM
+FEC0;N # ARABIC LETTER DAD MEDIAL FORM
+FEC1;N # ARABIC LETTER TAH ISOLATED FORM
+FEC2;N # ARABIC LETTER TAH FINAL FORM
+FEC3;N # ARABIC LETTER TAH INITIAL FORM
+FEC4;N # ARABIC LETTER TAH MEDIAL FORM
+FEC5;N # ARABIC LETTER ZAH ISOLATED FORM
+FEC6;N # ARABIC LETTER ZAH FINAL FORM
+FEC7;N # ARABIC LETTER ZAH INITIAL FORM
+FEC8;N # ARABIC LETTER ZAH MEDIAL FORM
+FEC9;N # ARABIC LETTER AIN ISOLATED FORM
+FECA;N # ARABIC LETTER AIN FINAL FORM
+FECB;N # ARABIC LETTER AIN INITIAL FORM
+FECC;N # ARABIC LETTER AIN MEDIAL FORM
+FECD;N # ARABIC LETTER GHAIN ISOLATED FORM
+FECE;N # ARABIC LETTER GHAIN FINAL FORM
+FECF;N # ARABIC LETTER GHAIN INITIAL FORM
+FED0;N # ARABIC LETTER GHAIN MEDIAL FORM
+FED1;N # ARABIC LETTER FEH ISOLATED FORM
+FED2;N # ARABIC LETTER FEH FINAL FORM
+FED3;N # ARABIC LETTER FEH INITIAL FORM
+FED4;N # ARABIC LETTER FEH MEDIAL FORM
+FED5;N # ARABIC LETTER QAF ISOLATED FORM
+FED6;N # ARABIC LETTER QAF FINAL FORM
+FED7;N # ARABIC LETTER QAF INITIAL FORM
+FED8;N # ARABIC LETTER QAF MEDIAL FORM
+FED9;N # ARABIC LETTER KAF ISOLATED FORM
+FEDA;N # ARABIC LETTER KAF FINAL FORM
+FEDB;N # ARABIC LETTER KAF INITIAL FORM
+FEDC;N # ARABIC LETTER KAF MEDIAL FORM
+FEDD;N # ARABIC LETTER LAM ISOLATED FORM
+FEDE;N # ARABIC LETTER LAM FINAL FORM
+FEDF;N # ARABIC LETTER LAM INITIAL FORM
+FEE0;N # ARABIC LETTER LAM MEDIAL FORM
+FEE1;N # ARABIC LETTER MEEM ISOLATED FORM
+FEE2;N # ARABIC LETTER MEEM FINAL FORM
+FEE3;N # ARABIC LETTER MEEM INITIAL FORM
+FEE4;N # ARABIC LETTER MEEM MEDIAL FORM
+FEE5;N # ARABIC LETTER NOON ISOLATED FORM
+FEE6;N # ARABIC LETTER NOON FINAL FORM
+FEE7;N # ARABIC LETTER NOON INITIAL FORM
+FEE8;N # ARABIC LETTER NOON MEDIAL FORM
+FEE9;N # ARABIC LETTER HEH ISOLATED FORM
+FEEA;N # ARABIC LETTER HEH FINAL FORM
+FEEB;N # ARABIC LETTER HEH INITIAL FORM
+FEEC;N # ARABIC LETTER HEH MEDIAL FORM
+FEED;N # ARABIC LETTER WAW ISOLATED FORM
+FEEE;N # ARABIC LETTER WAW FINAL FORM
+FEEF;N # ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+FEF0;N # ARABIC LETTER ALEF MAKSURA FINAL FORM
+FEF1;N # ARABIC LETTER YEH ISOLATED FORM
+FEF2;N # ARABIC LETTER YEH FINAL FORM
+FEF3;N # ARABIC LETTER YEH INITIAL FORM
+FEF4;N # ARABIC LETTER YEH MEDIAL FORM
+FEF5;N # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+FEF6;N # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+FEF7;N # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+FEF8;N # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+FEF9;N # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+FEFA;N # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+FEFB;N # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+FEFC;N # ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FEFF;N # ZERO WIDTH NO-BREAK SPACE
+FF01;F # FULLWIDTH EXCLAMATION MARK
+FF02;F # FULLWIDTH QUOTATION MARK
+FF03;F # FULLWIDTH NUMBER SIGN
+FF04;F # FULLWIDTH DOLLAR SIGN
+FF05;F # FULLWIDTH PERCENT SIGN
+FF06;F # FULLWIDTH AMPERSAND
+FF07;F # FULLWIDTH APOSTROPHE
+FF08;F # FULLWIDTH LEFT PARENTHESIS
+FF09;F # FULLWIDTH RIGHT PARENTHESIS
+FF0A;F # FULLWIDTH ASTERISK
+FF0B;F # FULLWIDTH PLUS SIGN
+FF0C;F # FULLWIDTH COMMA
+FF0D;F # FULLWIDTH HYPHEN-MINUS
+FF0E;F # FULLWIDTH FULL STOP
+FF0F;F # FULLWIDTH SOLIDUS
+FF10;F # FULLWIDTH DIGIT ZERO
+FF11;F # FULLWIDTH DIGIT ONE
+FF12;F # FULLWIDTH DIGIT TWO
+FF13;F # FULLWIDTH DIGIT THREE
+FF14;F # FULLWIDTH DIGIT FOUR
+FF15;F # FULLWIDTH DIGIT FIVE
+FF16;F # FULLWIDTH DIGIT SIX
+FF17;F # FULLWIDTH DIGIT SEVEN
+FF18;F # FULLWIDTH DIGIT EIGHT
+FF19;F # FULLWIDTH DIGIT NINE
+FF1A;F # FULLWIDTH COLON
+FF1B;F # FULLWIDTH SEMICOLON
+FF1C;F # FULLWIDTH LESS-THAN SIGN
+FF1D;F # FULLWIDTH EQUALS SIGN
+FF1E;F # FULLWIDTH GREATER-THAN SIGN
+FF1F;F # FULLWIDTH QUESTION MARK
+FF20;F # FULLWIDTH COMMERCIAL AT
+FF21;F # FULLWIDTH LATIN CAPITAL LETTER A
+FF22;F # FULLWIDTH LATIN CAPITAL LETTER B
+FF23;F # FULLWIDTH LATIN CAPITAL LETTER C
+FF24;F # FULLWIDTH LATIN CAPITAL LETTER D
+FF25;F # FULLWIDTH LATIN CAPITAL LETTER E
+FF26;F # FULLWIDTH LATIN CAPITAL LETTER F
+FF27;F # FULLWIDTH LATIN CAPITAL LETTER G
+FF28;F # FULLWIDTH LATIN CAPITAL LETTER H
+FF29;F # FULLWIDTH LATIN CAPITAL LETTER I
+FF2A;F # FULLWIDTH LATIN CAPITAL LETTER J
+FF2B;F # FULLWIDTH LATIN CAPITAL LETTER K
+FF2C;F # FULLWIDTH LATIN CAPITAL LETTER L
+FF2D;F # FULLWIDTH LATIN CAPITAL LETTER M
+FF2E;F # FULLWIDTH LATIN CAPITAL LETTER N
+FF2F;F # FULLWIDTH LATIN CAPITAL LETTER O
+FF30;F # FULLWIDTH LATIN CAPITAL LETTER P
+FF31;F # FULLWIDTH LATIN CAPITAL LETTER Q
+FF32;F # FULLWIDTH LATIN CAPITAL LETTER R
+FF33;F # FULLWIDTH LATIN CAPITAL LETTER S
+FF34;F # FULLWIDTH LATIN CAPITAL LETTER T
+FF35;F # FULLWIDTH LATIN CAPITAL LETTER U
+FF36;F # FULLWIDTH LATIN CAPITAL LETTER V
+FF37;F # FULLWIDTH LATIN CAPITAL LETTER W
+FF38;F # FULLWIDTH LATIN CAPITAL LETTER X
+FF39;F # FULLWIDTH LATIN CAPITAL LETTER Y
+FF3A;F # FULLWIDTH LATIN CAPITAL LETTER Z
+FF3B;F # FULLWIDTH LEFT SQUARE BRACKET
+FF3C;F # FULLWIDTH REVERSE SOLIDUS
+FF3D;F # FULLWIDTH RIGHT SQUARE BRACKET
+FF3E;F # FULLWIDTH CIRCUMFLEX ACCENT
+FF3F;F # FULLWIDTH LOW LINE
+FF40;F # FULLWIDTH GRAVE ACCENT
+FF41;F # FULLWIDTH LATIN SMALL LETTER A
+FF42;F # FULLWIDTH LATIN SMALL LETTER B
+FF43;F # FULLWIDTH LATIN SMALL LETTER C
+FF44;F # FULLWIDTH LATIN SMALL LETTER D
+FF45;F # FULLWIDTH LATIN SMALL LETTER E
+FF46;F # FULLWIDTH LATIN SMALL LETTER F
+FF47;F # FULLWIDTH LATIN SMALL LETTER G
+FF48;F # FULLWIDTH LATIN SMALL LETTER H
+FF49;F # FULLWIDTH LATIN SMALL LETTER I
+FF4A;F # FULLWIDTH LATIN SMALL LETTER J
+FF4B;F # FULLWIDTH LATIN SMALL LETTER K
+FF4C;F # FULLWIDTH LATIN SMALL LETTER L
+FF4D;F # FULLWIDTH LATIN SMALL LETTER M
+FF4E;F # FULLWIDTH LATIN SMALL LETTER N
+FF4F;F # FULLWIDTH LATIN SMALL LETTER O
+FF50;F # FULLWIDTH LATIN SMALL LETTER P
+FF51;F # FULLWIDTH LATIN SMALL LETTER Q
+FF52;F # FULLWIDTH LATIN SMALL LETTER R
+FF53;F # FULLWIDTH LATIN SMALL LETTER S
+FF54;F # FULLWIDTH LATIN SMALL LETTER T
+FF55;F # FULLWIDTH LATIN SMALL LETTER U
+FF56;F # FULLWIDTH LATIN SMALL LETTER V
+FF57;F # FULLWIDTH LATIN SMALL LETTER W
+FF58;F # FULLWIDTH LATIN SMALL LETTER X
+FF59;F # FULLWIDTH LATIN SMALL LETTER Y
+FF5A;F # FULLWIDTH LATIN SMALL LETTER Z
+FF5B;F # FULLWIDTH LEFT CURLY BRACKET
+FF5C;F # FULLWIDTH VERTICAL LINE
+FF5D;F # FULLWIDTH RIGHT CURLY BRACKET
+FF5E;F # FULLWIDTH TILDE
+FF5F;F # FULLWIDTH LEFT WHITE PARENTHESIS
+FF60;F # FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61;H # HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62;H # HALFWIDTH LEFT CORNER BRACKET
+FF63;H # HALFWIDTH RIGHT CORNER BRACKET
+FF64;H # HALFWIDTH IDEOGRAPHIC COMMA
+FF65;H # HALFWIDTH KATAKANA MIDDLE DOT
+FF66;H # HALFWIDTH KATAKANA LETTER WO
+FF67;H # HALFWIDTH KATAKANA LETTER SMALL A
+FF68;H # HALFWIDTH KATAKANA LETTER SMALL I
+FF69;H # HALFWIDTH KATAKANA LETTER SMALL U
+FF6A;H # HALFWIDTH KATAKANA LETTER SMALL E
+FF6B;H # HALFWIDTH KATAKANA LETTER SMALL O
+FF6C;H # HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D;H # HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E;H # HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F;H # HALFWIDTH KATAKANA LETTER SMALL TU
+FF70;H # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71;H # HALFWIDTH KATAKANA LETTER A
+FF72;H # HALFWIDTH KATAKANA LETTER I
+FF73;H # HALFWIDTH KATAKANA LETTER U
+FF74;H # HALFWIDTH KATAKANA LETTER E
+FF75;H # HALFWIDTH KATAKANA LETTER O
+FF76;H # HALFWIDTH KATAKANA LETTER KA
+FF77;H # HALFWIDTH KATAKANA LETTER KI
+FF78;H # HALFWIDTH KATAKANA LETTER KU
+FF79;H # HALFWIDTH KATAKANA LETTER KE
+FF7A;H # HALFWIDTH KATAKANA LETTER KO
+FF7B;H # HALFWIDTH KATAKANA LETTER SA
+FF7C;H # HALFWIDTH KATAKANA LETTER SI
+FF7D;H # HALFWIDTH KATAKANA LETTER SU
+FF7E;H # HALFWIDTH KATAKANA LETTER SE
+FF7F;H # HALFWIDTH KATAKANA LETTER SO
+FF80;H # HALFWIDTH KATAKANA LETTER TA
+FF81;H # HALFWIDTH KATAKANA LETTER TI
+FF82;H # HALFWIDTH KATAKANA LETTER TU
+FF83;H # HALFWIDTH KATAKANA LETTER TE
+FF84;H # HALFWIDTH KATAKANA LETTER TO
+FF85;H # HALFWIDTH KATAKANA LETTER NA
+FF86;H # HALFWIDTH KATAKANA LETTER NI
+FF87;H # HALFWIDTH KATAKANA LETTER NU
+FF88;H # HALFWIDTH KATAKANA LETTER NE
+FF89;H # HALFWIDTH KATAKANA LETTER NO
+FF8A;H # HALFWIDTH KATAKANA LETTER HA
+FF8B;H # HALFWIDTH KATAKANA LETTER HI
+FF8C;H # HALFWIDTH KATAKANA LETTER HU
+FF8D;H # HALFWIDTH KATAKANA LETTER HE
+FF8E;H # HALFWIDTH KATAKANA LETTER HO
+FF8F;H # HALFWIDTH KATAKANA LETTER MA
+FF90;H # HALFWIDTH KATAKANA LETTER MI
+FF91;H # HALFWIDTH KATAKANA LETTER MU
+FF92;H # HALFWIDTH KATAKANA LETTER ME
+FF93;H # HALFWIDTH KATAKANA LETTER MO
+FF94;H # HALFWIDTH KATAKANA LETTER YA
+FF95;H # HALFWIDTH KATAKANA LETTER YU
+FF96;H # HALFWIDTH KATAKANA LETTER YO
+FF97;H # HALFWIDTH KATAKANA LETTER RA
+FF98;H # HALFWIDTH KATAKANA LETTER RI
+FF99;H # HALFWIDTH KATAKANA LETTER RU
+FF9A;H # HALFWIDTH KATAKANA LETTER RE
+FF9B;H # HALFWIDTH KATAKANA LETTER RO
+FF9C;H # HALFWIDTH KATAKANA LETTER WA
+FF9D;H # HALFWIDTH KATAKANA LETTER N
+FF9E;H # HALFWIDTH KATAKANA VOICED SOUND MARK
+FF9F;H # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0;H # HALFWIDTH HANGUL FILLER
+FFA1;H # HALFWIDTH HANGUL LETTER KIYEOK
+FFA2;H # HALFWIDTH HANGUL LETTER SSANGKIYEOK
+FFA3;H # HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+FFA4;H # HALFWIDTH HANGUL LETTER NIEUN
+FFA5;H # HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+FFA6;H # HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+FFA7;H # HALFWIDTH HANGUL LETTER TIKEUT
+FFA8;H # HALFWIDTH HANGUL LETTER SSANGTIKEUT
+FFA9;H # HALFWIDTH HANGUL LETTER RIEUL
+FFAA;H # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+FFAB;H # HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+FFAC;H # HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+FFAD;H # HALFWIDTH HANGUL LETTER RIEUL-SIOS
+FFAE;H # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+FFAF;H # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+FFB0;H # HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+FFB1;H # HALFWIDTH HANGUL LETTER MIEUM
+FFB2;H # HALFWIDTH HANGUL LETTER PIEUP
+FFB3;H # HALFWIDTH HANGUL LETTER SSANGPIEUP
+FFB4;H # HALFWIDTH HANGUL LETTER PIEUP-SIOS
+FFB5;H # HALFWIDTH HANGUL LETTER SIOS
+FFB6;H # HALFWIDTH HANGUL LETTER SSANGSIOS
+FFB7;H # HALFWIDTH HANGUL LETTER IEUNG
+FFB8;H # HALFWIDTH HANGUL LETTER CIEUC
+FFB9;H # HALFWIDTH HANGUL LETTER SSANGCIEUC
+FFBA;H # HALFWIDTH HANGUL LETTER CHIEUCH
+FFBB;H # HALFWIDTH HANGUL LETTER KHIEUKH
+FFBC;H # HALFWIDTH HANGUL LETTER THIEUTH
+FFBD;H # HALFWIDTH HANGUL LETTER PHIEUPH
+FFBE;H # HALFWIDTH HANGUL LETTER HIEUH
+FFC2;H # HALFWIDTH HANGUL LETTER A
+FFC3;H # HALFWIDTH HANGUL LETTER AE
+FFC4;H # HALFWIDTH HANGUL LETTER YA
+FFC5;H # HALFWIDTH HANGUL LETTER YAE
+FFC6;H # HALFWIDTH HANGUL LETTER EO
+FFC7;H # HALFWIDTH HANGUL LETTER E
+FFCA;H # HALFWIDTH HANGUL LETTER YEO
+FFCB;H # HALFWIDTH HANGUL LETTER YE
+FFCC;H # HALFWIDTH HANGUL LETTER O
+FFCD;H # HALFWIDTH HANGUL LETTER WA
+FFCE;H # HALFWIDTH HANGUL LETTER WAE
+FFCF;H # HALFWIDTH HANGUL LETTER OE
+FFD2;H # HALFWIDTH HANGUL LETTER YO
+FFD3;H # HALFWIDTH HANGUL LETTER U
+FFD4;H # HALFWIDTH HANGUL LETTER WEO
+FFD5;H # HALFWIDTH HANGUL LETTER WE
+FFD6;H # HALFWIDTH HANGUL LETTER WI
+FFD7;H # HALFWIDTH HANGUL LETTER YU
+FFDA;H # HALFWIDTH HANGUL LETTER EU
+FFDB;H # HALFWIDTH HANGUL LETTER YI
+FFDC;H # HALFWIDTH HANGUL LETTER I
+FFE0;F # FULLWIDTH CENT SIGN
+FFE1;F # FULLWIDTH POUND SIGN
+FFE2;F # FULLWIDTH NOT SIGN
+FFE3;F # FULLWIDTH MACRON
+FFE4;F # FULLWIDTH BROKEN BAR
+FFE5;F # FULLWIDTH YEN SIGN
+FFE6;F # FULLWIDTH WON SIGN
+FFE8;H # HALFWIDTH FORMS LIGHT VERTICAL
+FFE9;H # HALFWIDTH LEFTWARDS ARROW
+FFEA;H # HALFWIDTH UPWARDS ARROW
+FFEB;H # HALFWIDTH RIGHTWARDS ARROW
+FFEC;H # HALFWIDTH DOWNWARDS ARROW
+FFED;H # HALFWIDTH BLACK SQUARE
+FFEE;H # HALFWIDTH WHITE CIRCLE
+FFF9;N # INTERLINEAR ANNOTATION ANCHOR
+FFFA;N # INTERLINEAR ANNOTATION SEPARATOR
+FFFB;N # INTERLINEAR ANNOTATION TERMINATOR
+FFFC;N # OBJECT REPLACEMENT CHARACTER
+FFFD;A # REPLACEMENT CHARACTER
+10000;N # LINEAR B SYLLABLE B008 A
+10001;N # LINEAR B SYLLABLE B038 E
+10002;N # LINEAR B SYLLABLE B028 I
+10003;N # LINEAR B SYLLABLE B061 O
+10004;N # LINEAR B SYLLABLE B010 U
+10005;N # LINEAR B SYLLABLE B001 DA
+10006;N # LINEAR B SYLLABLE B045 DE
+10007;N # LINEAR B SYLLABLE B007 DI
+10008;N # LINEAR B SYLLABLE B014 DO
+10009;N # LINEAR B SYLLABLE B051 DU
+1000A;N # LINEAR B SYLLABLE B057 JA
+1000B;N # LINEAR B SYLLABLE B046 JE
+1000D;N # LINEAR B SYLLABLE B036 JO
+1000E;N # LINEAR B SYLLABLE B065 JU
+1000F;N # LINEAR B SYLLABLE B077 KA
+10010;N # LINEAR B SYLLABLE B044 KE
+10011;N # LINEAR B SYLLABLE B067 KI
+10012;N # LINEAR B SYLLABLE B070 KO
+10013;N # LINEAR B SYLLABLE B081 KU
+10014;N # LINEAR B SYLLABLE B080 MA
+10015;N # LINEAR B SYLLABLE B013 ME
+10016;N # LINEAR B SYLLABLE B073 MI
+10017;N # LINEAR B SYLLABLE B015 MO
+10018;N # LINEAR B SYLLABLE B023 MU
+10019;N # LINEAR B SYLLABLE B006 NA
+1001A;N # LINEAR B SYLLABLE B024 NE
+1001B;N # LINEAR B SYLLABLE B030 NI
+1001C;N # LINEAR B SYLLABLE B052 NO
+1001D;N # LINEAR B SYLLABLE B055 NU
+1001E;N # LINEAR B SYLLABLE B003 PA
+1001F;N # LINEAR B SYLLABLE B072 PE
+10020;N # LINEAR B SYLLABLE B039 PI
+10021;N # LINEAR B SYLLABLE B011 PO
+10022;N # LINEAR B SYLLABLE B050 PU
+10023;N # LINEAR B SYLLABLE B016 QA
+10024;N # LINEAR B SYLLABLE B078 QE
+10025;N # LINEAR B SYLLABLE B021 QI
+10026;N # LINEAR B SYLLABLE B032 QO
+10028;N # LINEAR B SYLLABLE B060 RA
+10029;N # LINEAR B SYLLABLE B027 RE
+1002A;N # LINEAR B SYLLABLE B053 RI
+1002B;N # LINEAR B SYLLABLE B002 RO
+1002C;N # LINEAR B SYLLABLE B026 RU
+1002D;N # LINEAR B SYLLABLE B031 SA
+1002E;N # LINEAR B SYLLABLE B009 SE
+1002F;N # LINEAR B SYLLABLE B041 SI
+10030;N # LINEAR B SYLLABLE B012 SO
+10031;N # LINEAR B SYLLABLE B058 SU
+10032;N # LINEAR B SYLLABLE B059 TA
+10033;N # LINEAR B SYLLABLE B004 TE
+10034;N # LINEAR B SYLLABLE B037 TI
+10035;N # LINEAR B SYLLABLE B005 TO
+10036;N # LINEAR B SYLLABLE B069 TU
+10037;N # LINEAR B SYLLABLE B054 WA
+10038;N # LINEAR B SYLLABLE B075 WE
+10039;N # LINEAR B SYLLABLE B040 WI
+1003A;N # LINEAR B SYLLABLE B042 WO
+1003C;N # LINEAR B SYLLABLE B017 ZA
+1003D;N # LINEAR B SYLLABLE B074 ZE
+1003F;N # LINEAR B SYLLABLE B020 ZO
+10040;N # LINEAR B SYLLABLE B025 A2
+10041;N # LINEAR B SYLLABLE B043 A3
+10042;N # LINEAR B SYLLABLE B085 AU
+10043;N # LINEAR B SYLLABLE B071 DWE
+10044;N # LINEAR B SYLLABLE B090 DWO
+10045;N # LINEAR B SYLLABLE B048 NWA
+10046;N # LINEAR B SYLLABLE B029 PU2
+10047;N # LINEAR B SYLLABLE B062 PTE
+10048;N # LINEAR B SYLLABLE B076 RA2
+10049;N # LINEAR B SYLLABLE B033 RA3
+1004A;N # LINEAR B SYLLABLE B068 RO2
+1004B;N # LINEAR B SYLLABLE B066 TA2
+1004C;N # LINEAR B SYLLABLE B087 TWE
+1004D;N # LINEAR B SYLLABLE B091 TWO
+10050;N # LINEAR B SYMBOL B018
+10051;N # LINEAR B SYMBOL B019
+10052;N # LINEAR B SYMBOL B022
+10053;N # LINEAR B SYMBOL B034
+10054;N # LINEAR B SYMBOL B047
+10055;N # LINEAR B SYMBOL B049
+10056;N # LINEAR B SYMBOL B056
+10057;N # LINEAR B SYMBOL B063
+10058;N # LINEAR B SYMBOL B064
+10059;N # LINEAR B SYMBOL B079
+1005A;N # LINEAR B SYMBOL B082
+1005B;N # LINEAR B SYMBOL B083
+1005C;N # LINEAR B SYMBOL B086
+1005D;N # LINEAR B SYMBOL B089
+10080;N # LINEAR B IDEOGRAM B100 MAN
+10081;N # LINEAR B IDEOGRAM B102 WOMAN
+10082;N # LINEAR B IDEOGRAM B104 DEER
+10083;N # LINEAR B IDEOGRAM B105 EQUID
+10084;N # LINEAR B IDEOGRAM B105F MARE
+10085;N # LINEAR B IDEOGRAM B105M STALLION
+10086;N # LINEAR B IDEOGRAM B106F EWE
+10087;N # LINEAR B IDEOGRAM B106M RAM
+10088;N # LINEAR B IDEOGRAM B107F SHE-GOAT
+10089;N # LINEAR B IDEOGRAM B107M HE-GOAT
+1008A;N # LINEAR B IDEOGRAM B108F SOW
+1008B;N # LINEAR B IDEOGRAM B108M BOAR
+1008C;N # LINEAR B IDEOGRAM B109F COW
+1008D;N # LINEAR B IDEOGRAM B109M BULL
+1008E;N # LINEAR B IDEOGRAM B120 WHEAT
+1008F;N # LINEAR B IDEOGRAM B121 BARLEY
+10090;N # LINEAR B IDEOGRAM B122 OLIVE
+10091;N # LINEAR B IDEOGRAM B123 SPICE
+10092;N # LINEAR B IDEOGRAM B125 CYPERUS
+10093;N # LINEAR B MONOGRAM B127 KAPO
+10094;N # LINEAR B MONOGRAM B128 KANAKO
+10095;N # LINEAR B IDEOGRAM B130 OIL
+10096;N # LINEAR B IDEOGRAM B131 WINE
+10097;N # LINEAR B IDEOGRAM B132
+10098;N # LINEAR B MONOGRAM B133 AREPA
+10099;N # LINEAR B MONOGRAM B135 MERI
+1009A;N # LINEAR B IDEOGRAM B140 BRONZE
+1009B;N # LINEAR B IDEOGRAM B141 GOLD
+1009C;N # LINEAR B IDEOGRAM B142
+1009D;N # LINEAR B IDEOGRAM B145 WOOL
+1009E;N # LINEAR B IDEOGRAM B146
+1009F;N # LINEAR B IDEOGRAM B150
+100A0;N # LINEAR B IDEOGRAM B151 HORN
+100A1;N # LINEAR B IDEOGRAM B152
+100A2;N # LINEAR B IDEOGRAM B153
+100A3;N # LINEAR B IDEOGRAM B154
+100A4;N # LINEAR B MONOGRAM B156 TURO2
+100A5;N # LINEAR B IDEOGRAM B157
+100A6;N # LINEAR B IDEOGRAM B158
+100A7;N # LINEAR B IDEOGRAM B159 CLOTH
+100A8;N # LINEAR B IDEOGRAM B160
+100A9;N # LINEAR B IDEOGRAM B161
+100AA;N # LINEAR B IDEOGRAM B162 GARMENT
+100AB;N # LINEAR B IDEOGRAM B163 ARMOUR
+100AC;N # LINEAR B IDEOGRAM B164
+100AD;N # LINEAR B IDEOGRAM B165
+100AE;N # LINEAR B IDEOGRAM B166
+100AF;N # LINEAR B IDEOGRAM B167
+100B0;N # LINEAR B IDEOGRAM B168
+100B1;N # LINEAR B IDEOGRAM B169
+100B2;N # LINEAR B IDEOGRAM B170
+100B3;N # LINEAR B IDEOGRAM B171
+100B4;N # LINEAR B IDEOGRAM B172
+100B5;N # LINEAR B IDEOGRAM B173 MONTH
+100B6;N # LINEAR B IDEOGRAM B174
+100B7;N # LINEAR B IDEOGRAM B176 TREE
+100B8;N # LINEAR B IDEOGRAM B177
+100B9;N # LINEAR B IDEOGRAM B178
+100BA;N # LINEAR B IDEOGRAM B179
+100BB;N # LINEAR B IDEOGRAM B180
+100BC;N # LINEAR B IDEOGRAM B181
+100BD;N # LINEAR B IDEOGRAM B182
+100BE;N # LINEAR B IDEOGRAM B183
+100BF;N # LINEAR B IDEOGRAM B184
+100C0;N # LINEAR B IDEOGRAM B185
+100C1;N # LINEAR B IDEOGRAM B189
+100C2;N # LINEAR B IDEOGRAM B190
+100C3;N # LINEAR B IDEOGRAM B191 HELMET
+100C4;N # LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5;N # LINEAR B IDEOGRAM B225 BATHTUB
+100C6;N # LINEAR B IDEOGRAM B230 SPEAR
+100C7;N # LINEAR B IDEOGRAM B231 ARROW
+100C8;N # LINEAR B IDEOGRAM B232
+100C9;N # LINEAR B IDEOGRAM B233 SWORD
+100CA;N # LINEAR B IDEOGRAM B234
+100CB;N # LINEAR B IDEOGRAM B236
+100CC;N # LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD;N # LINEAR B IDEOGRAM B241 CHARIOT
+100CE;N # LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF;N # LINEAR B IDEOGRAM B243 WHEEL
+100D0;N # LINEAR B IDEOGRAM B245
+100D1;N # LINEAR B IDEOGRAM B246
+100D2;N # LINEAR B MONOGRAM B247 DIPTE
+100D3;N # LINEAR B IDEOGRAM B248
+100D4;N # LINEAR B IDEOGRAM B249
+100D5;N # LINEAR B IDEOGRAM B251
+100D6;N # LINEAR B IDEOGRAM B252
+100D7;N # LINEAR B IDEOGRAM B253
+100D8;N # LINEAR B IDEOGRAM B254 DART
+100D9;N # LINEAR B IDEOGRAM B255
+100DA;N # LINEAR B IDEOGRAM B256
+100DB;N # LINEAR B IDEOGRAM B257
+100DC;N # LINEAR B IDEOGRAM B258
+100DD;N # LINEAR B IDEOGRAM B259
+100DE;N # LINEAR B IDEOGRAM VESSEL B155
+100DF;N # LINEAR B IDEOGRAM VESSEL B200
+100E0;N # LINEAR B IDEOGRAM VESSEL B201
+100E1;N # LINEAR B IDEOGRAM VESSEL B202
+100E2;N # LINEAR B IDEOGRAM VESSEL B203
+100E3;N # LINEAR B IDEOGRAM VESSEL B204
+100E4;N # LINEAR B IDEOGRAM VESSEL B205
+100E5;N # LINEAR B IDEOGRAM VESSEL B206
+100E6;N # LINEAR B IDEOGRAM VESSEL B207
+100E7;N # LINEAR B IDEOGRAM VESSEL B208
+100E8;N # LINEAR B IDEOGRAM VESSEL B209
+100E9;N # LINEAR B IDEOGRAM VESSEL B210
+100EA;N # LINEAR B IDEOGRAM VESSEL B211
+100EB;N # LINEAR B IDEOGRAM VESSEL B212
+100EC;N # LINEAR B IDEOGRAM VESSEL B213
+100ED;N # LINEAR B IDEOGRAM VESSEL B214
+100EE;N # LINEAR B IDEOGRAM VESSEL B215
+100EF;N # LINEAR B IDEOGRAM VESSEL B216
+100F0;N # LINEAR B IDEOGRAM VESSEL B217
+100F1;N # LINEAR B IDEOGRAM VESSEL B218
+100F2;N # LINEAR B IDEOGRAM VESSEL B219
+100F3;N # LINEAR B IDEOGRAM VESSEL B221
+100F4;N # LINEAR B IDEOGRAM VESSEL B222
+100F5;N # LINEAR B IDEOGRAM VESSEL B226
+100F6;N # LINEAR B IDEOGRAM VESSEL B227
+100F7;N # LINEAR B IDEOGRAM VESSEL B228
+100F8;N # LINEAR B IDEOGRAM VESSEL B229
+100F9;N # LINEAR B IDEOGRAM VESSEL B250
+100FA;N # LINEAR B IDEOGRAM VESSEL B305
+10100;N # AEGEAN WORD SEPARATOR LINE
+10101;N # AEGEAN WORD SEPARATOR DOT
+10102;N # AEGEAN CHECK MARK
+10107;N # AEGEAN NUMBER ONE
+10108;N # AEGEAN NUMBER TWO
+10109;N # AEGEAN NUMBER THREE
+1010A;N # AEGEAN NUMBER FOUR
+1010B;N # AEGEAN NUMBER FIVE
+1010C;N # AEGEAN NUMBER SIX
+1010D;N # AEGEAN NUMBER SEVEN
+1010E;N # AEGEAN NUMBER EIGHT
+1010F;N # AEGEAN NUMBER NINE
+10110;N # AEGEAN NUMBER TEN
+10111;N # AEGEAN NUMBER TWENTY
+10112;N # AEGEAN NUMBER THIRTY
+10113;N # AEGEAN NUMBER FORTY
+10114;N # AEGEAN NUMBER FIFTY
+10115;N # AEGEAN NUMBER SIXTY
+10116;N # AEGEAN NUMBER SEVENTY
+10117;N # AEGEAN NUMBER EIGHTY
+10118;N # AEGEAN NUMBER NINETY
+10119;N # AEGEAN NUMBER ONE HUNDRED
+1011A;N # AEGEAN NUMBER TWO HUNDRED
+1011B;N # AEGEAN NUMBER THREE HUNDRED
+1011C;N # AEGEAN NUMBER FOUR HUNDRED
+1011D;N # AEGEAN NUMBER FIVE HUNDRED
+1011E;N # AEGEAN NUMBER SIX HUNDRED
+1011F;N # AEGEAN NUMBER SEVEN HUNDRED
+10120;N # AEGEAN NUMBER EIGHT HUNDRED
+10121;N # AEGEAN NUMBER NINE HUNDRED
+10122;N # AEGEAN NUMBER ONE THOUSAND
+10123;N # AEGEAN NUMBER TWO THOUSAND
+10124;N # AEGEAN NUMBER THREE THOUSAND
+10125;N # AEGEAN NUMBER FOUR THOUSAND
+10126;N # AEGEAN NUMBER FIVE THOUSAND
+10127;N # AEGEAN NUMBER SIX THOUSAND
+10128;N # AEGEAN NUMBER SEVEN THOUSAND
+10129;N # AEGEAN NUMBER EIGHT THOUSAND
+1012A;N # AEGEAN NUMBER NINE THOUSAND
+1012B;N # AEGEAN NUMBER TEN THOUSAND
+1012C;N # AEGEAN NUMBER TWENTY THOUSAND
+1012D;N # AEGEAN NUMBER THIRTY THOUSAND
+1012E;N # AEGEAN NUMBER FORTY THOUSAND
+1012F;N # AEGEAN NUMBER FIFTY THOUSAND
+10130;N # AEGEAN NUMBER SIXTY THOUSAND
+10131;N # AEGEAN NUMBER SEVENTY THOUSAND
+10132;N # AEGEAN NUMBER EIGHTY THOUSAND
+10133;N # AEGEAN NUMBER NINETY THOUSAND
+10137;N # AEGEAN WEIGHT BASE UNIT
+10138;N # AEGEAN WEIGHT FIRST SUBUNIT
+10139;N # AEGEAN WEIGHT SECOND SUBUNIT
+1013A;N # AEGEAN WEIGHT THIRD SUBUNIT
+1013B;N # AEGEAN WEIGHT FOURTH SUBUNIT
+1013C;N # AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D;N # AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E;N # AEGEAN MEASURE SECOND SUBUNIT
+1013F;N # AEGEAN MEASURE THIRD SUBUNIT
+10140;N # GREEK ACROPHONIC ATTIC ONE QUARTER
+10141;N # GREEK ACROPHONIC ATTIC ONE HALF
+10142;N # GREEK ACROPHONIC ATTIC ONE DRACHMA
+10143;N # GREEK ACROPHONIC ATTIC FIVE
+10144;N # GREEK ACROPHONIC ATTIC FIFTY
+10145;N # GREEK ACROPHONIC ATTIC FIVE HUNDRED
+10146;N # GREEK ACROPHONIC ATTIC FIVE THOUSAND
+10147;N # GREEK ACROPHONIC ATTIC FIFTY THOUSAND
+10148;N # GREEK ACROPHONIC ATTIC FIVE TALENTS
+10149;N # GREEK ACROPHONIC ATTIC TEN TALENTS
+1014A;N # GREEK ACROPHONIC ATTIC FIFTY TALENTS
+1014B;N # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS
+1014C;N # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS
+1014D;N # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS
+1014E;N # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS
+1014F;N # GREEK ACROPHONIC ATTIC FIVE STATERS
+10150;N # GREEK ACROPHONIC ATTIC TEN STATERS
+10151;N # GREEK ACROPHONIC ATTIC FIFTY STATERS
+10152;N # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS
+10153;N # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS
+10154;N # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS
+10155;N # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS
+10156;N # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS
+10157;N # GREEK ACROPHONIC ATTIC TEN MNAS
+10158;N # GREEK ACROPHONIC HERAEUM ONE PLETHRON
+10159;N # GREEK ACROPHONIC THESPIAN ONE
+1015A;N # GREEK ACROPHONIC HERMIONIAN ONE
+1015B;N # GREEK ACROPHONIC EPIDAUREAN TWO
+1015C;N # GREEK ACROPHONIC THESPIAN TWO
+1015D;N # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS
+1015E;N # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS
+1015F;N # GREEK ACROPHONIC TROEZENIAN FIVE
+10160;N # GREEK ACROPHONIC TROEZENIAN TEN
+10161;N # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM
+10162;N # GREEK ACROPHONIC HERMIONIAN TEN
+10163;N # GREEK ACROPHONIC MESSENIAN TEN
+10164;N # GREEK ACROPHONIC THESPIAN TEN
+10165;N # GREEK ACROPHONIC THESPIAN THIRTY
+10166;N # GREEK ACROPHONIC TROEZENIAN FIFTY
+10167;N # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
+10168;N # GREEK ACROPHONIC HERMIONIAN FIFTY
+10169;N # GREEK ACROPHONIC THESPIAN FIFTY
+1016A;N # GREEK ACROPHONIC THESPIAN ONE HUNDRED
+1016B;N # GREEK ACROPHONIC THESPIAN THREE HUNDRED
+1016C;N # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED
+1016D;N # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED
+1016E;N # GREEK ACROPHONIC THESPIAN FIVE HUNDRED
+1016F;N # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED
+10170;N # GREEK ACROPHONIC NAXIAN FIVE HUNDRED
+10171;N # GREEK ACROPHONIC THESPIAN ONE THOUSAND
+10172;N # GREEK ACROPHONIC THESPIAN FIVE THOUSAND
+10173;N # GREEK ACROPHONIC DELPHIC FIVE MNAS
+10174;N # GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175;N # GREEK ONE HALF SIGN
+10176;N # GREEK ONE HALF SIGN ALTERNATE FORM
+10177;N # GREEK TWO THIRDS SIGN
+10178;N # GREEK THREE QUARTERS SIGN
+10179;N # GREEK YEAR SIGN
+1017A;N # GREEK TALENT SIGN
+1017B;N # GREEK DRACHMA SIGN
+1017C;N # GREEK OBOL SIGN
+1017D;N # GREEK TWO OBOLS SIGN
+1017E;N # GREEK THREE OBOLS SIGN
+1017F;N # GREEK FOUR OBOLS SIGN
+10180;N # GREEK FIVE OBOLS SIGN
+10181;N # GREEK METRETES SIGN
+10182;N # GREEK KYATHOS BASE SIGN
+10183;N # GREEK LITRA SIGN
+10184;N # GREEK OUNKIA SIGN
+10185;N # GREEK XESTES SIGN
+10186;N # GREEK ARTABE SIGN
+10187;N # GREEK AROURA SIGN
+10188;N # GREEK GRAMMA SIGN
+10189;N # GREEK TRYBLION BASE SIGN
+1018A;N # GREEK ZERO SIGN
+10190;N # ROMAN SEXTANS SIGN
+10191;N # ROMAN UNCIA SIGN
+10192;N # ROMAN SEMUNCIA SIGN
+10193;N # ROMAN SEXTULA SIGN
+10194;N # ROMAN DIMIDIA SEXTULA SIGN
+10195;N # ROMAN SILIQUA SIGN
+10196;N # ROMAN DENARIUS SIGN
+10197;N # ROMAN QUINARIUS SIGN
+10198;N # ROMAN SESTERTIUS SIGN
+10199;N # ROMAN DUPONDIUS SIGN
+1019A;N # ROMAN AS SIGN
+1019B;N # ROMAN CENTURIAL SIGN
+101D0;N # PHAISTOS DISC SIGN PEDESTRIAN
+101D1;N # PHAISTOS DISC SIGN PLUMED HEAD
+101D2;N # PHAISTOS DISC SIGN TATTOOED HEAD
+101D3;N # PHAISTOS DISC SIGN CAPTIVE
+101D4;N # PHAISTOS DISC SIGN CHILD
+101D5;N # PHAISTOS DISC SIGN WOMAN
+101D6;N # PHAISTOS DISC SIGN HELMET
+101D7;N # PHAISTOS DISC SIGN GAUNTLET
+101D8;N # PHAISTOS DISC SIGN TIARA
+101D9;N # PHAISTOS DISC SIGN ARROW
+101DA;N # PHAISTOS DISC SIGN BOW
+101DB;N # PHAISTOS DISC SIGN SHIELD
+101DC;N # PHAISTOS DISC SIGN CLUB
+101DD;N # PHAISTOS DISC SIGN MANACLES
+101DE;N # PHAISTOS DISC SIGN MATTOCK
+101DF;N # PHAISTOS DISC SIGN SAW
+101E0;N # PHAISTOS DISC SIGN LID
+101E1;N # PHAISTOS DISC SIGN BOOMERANG
+101E2;N # PHAISTOS DISC SIGN CARPENTRY PLANE
+101E3;N # PHAISTOS DISC SIGN DOLIUM
+101E4;N # PHAISTOS DISC SIGN COMB
+101E5;N # PHAISTOS DISC SIGN SLING
+101E6;N # PHAISTOS DISC SIGN COLUMN
+101E7;N # PHAISTOS DISC SIGN BEEHIVE
+101E8;N # PHAISTOS DISC SIGN SHIP
+101E9;N # PHAISTOS DISC SIGN HORN
+101EA;N # PHAISTOS DISC SIGN HIDE
+101EB;N # PHAISTOS DISC SIGN BULLS LEG
+101EC;N # PHAISTOS DISC SIGN CAT
+101ED;N # PHAISTOS DISC SIGN RAM
+101EE;N # PHAISTOS DISC SIGN EAGLE
+101EF;N # PHAISTOS DISC SIGN DOVE
+101F0;N # PHAISTOS DISC SIGN TUNNY
+101F1;N # PHAISTOS DISC SIGN BEE
+101F2;N # PHAISTOS DISC SIGN PLANE TREE
+101F3;N # PHAISTOS DISC SIGN VINE
+101F4;N # PHAISTOS DISC SIGN PAPYRUS
+101F5;N # PHAISTOS DISC SIGN ROSETTE
+101F6;N # PHAISTOS DISC SIGN LILY
+101F7;N # PHAISTOS DISC SIGN OX BACK
+101F8;N # PHAISTOS DISC SIGN FLUTE
+101F9;N # PHAISTOS DISC SIGN GRATER
+101FA;N # PHAISTOS DISC SIGN STRAINER
+101FB;N # PHAISTOS DISC SIGN SMALL AXE
+101FC;N # PHAISTOS DISC SIGN WAVY BAND
+101FD;N # PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+10280;N # LYCIAN LETTER A
+10281;N # LYCIAN LETTER E
+10282;N # LYCIAN LETTER B
+10283;N # LYCIAN LETTER BH
+10284;N # LYCIAN LETTER G
+10285;N # LYCIAN LETTER D
+10286;N # LYCIAN LETTER I
+10287;N # LYCIAN LETTER W
+10288;N # LYCIAN LETTER Z
+10289;N # LYCIAN LETTER TH
+1028A;N # LYCIAN LETTER J
+1028B;N # LYCIAN LETTER K
+1028C;N # LYCIAN LETTER Q
+1028D;N # LYCIAN LETTER L
+1028E;N # LYCIAN LETTER M
+1028F;N # LYCIAN LETTER N
+10290;N # LYCIAN LETTER MM
+10291;N # LYCIAN LETTER NN
+10292;N # LYCIAN LETTER U
+10293;N # LYCIAN LETTER P
+10294;N # LYCIAN LETTER KK
+10295;N # LYCIAN LETTER R
+10296;N # LYCIAN LETTER S
+10297;N # LYCIAN LETTER T
+10298;N # LYCIAN LETTER TT
+10299;N # LYCIAN LETTER AN
+1029A;N # LYCIAN LETTER EN
+1029B;N # LYCIAN LETTER H
+1029C;N # LYCIAN LETTER X
+102A0;N # CARIAN LETTER A
+102A1;N # CARIAN LETTER P2
+102A2;N # CARIAN LETTER D
+102A3;N # CARIAN LETTER L
+102A4;N # CARIAN LETTER UUU
+102A5;N # CARIAN LETTER R
+102A6;N # CARIAN LETTER LD
+102A7;N # CARIAN LETTER A2
+102A8;N # CARIAN LETTER Q
+102A9;N # CARIAN LETTER B
+102AA;N # CARIAN LETTER M
+102AB;N # CARIAN LETTER O
+102AC;N # CARIAN LETTER D2
+102AD;N # CARIAN LETTER T
+102AE;N # CARIAN LETTER SH
+102AF;N # CARIAN LETTER SH2
+102B0;N # CARIAN LETTER S
+102B1;N # CARIAN LETTER C-18
+102B2;N # CARIAN LETTER U
+102B3;N # CARIAN LETTER NN
+102B4;N # CARIAN LETTER X
+102B5;N # CARIAN LETTER N
+102B6;N # CARIAN LETTER TT2
+102B7;N # CARIAN LETTER P
+102B8;N # CARIAN LETTER SS
+102B9;N # CARIAN LETTER I
+102BA;N # CARIAN LETTER E
+102BB;N # CARIAN LETTER UUUU
+102BC;N # CARIAN LETTER K
+102BD;N # CARIAN LETTER K2
+102BE;N # CARIAN LETTER ND
+102BF;N # CARIAN LETTER UU
+102C0;N # CARIAN LETTER G
+102C1;N # CARIAN LETTER G2
+102C2;N # CARIAN LETTER ST
+102C3;N # CARIAN LETTER ST2
+102C4;N # CARIAN LETTER NG
+102C5;N # CARIAN LETTER II
+102C6;N # CARIAN LETTER C-39
+102C7;N # CARIAN LETTER TT
+102C8;N # CARIAN LETTER UUU2
+102C9;N # CARIAN LETTER RR
+102CA;N # CARIAN LETTER MB
+102CB;N # CARIAN LETTER MB2
+102CC;N # CARIAN LETTER MB3
+102CD;N # CARIAN LETTER MB4
+102CE;N # CARIAN LETTER LD2
+102CF;N # CARIAN LETTER E2
+102D0;N # CARIAN LETTER UUU3
+10300;N # OLD ITALIC LETTER A
+10301;N # OLD ITALIC LETTER BE
+10302;N # OLD ITALIC LETTER KE
+10303;N # OLD ITALIC LETTER DE
+10304;N # OLD ITALIC LETTER E
+10305;N # OLD ITALIC LETTER VE
+10306;N # OLD ITALIC LETTER ZE
+10307;N # OLD ITALIC LETTER HE
+10308;N # OLD ITALIC LETTER THE
+10309;N # OLD ITALIC LETTER I
+1030A;N # OLD ITALIC LETTER KA
+1030B;N # OLD ITALIC LETTER EL
+1030C;N # OLD ITALIC LETTER EM
+1030D;N # OLD ITALIC LETTER EN
+1030E;N # OLD ITALIC LETTER ESH
+1030F;N # OLD ITALIC LETTER O
+10310;N # OLD ITALIC LETTER PE
+10311;N # OLD ITALIC LETTER SHE
+10312;N # OLD ITALIC LETTER KU
+10313;N # OLD ITALIC LETTER ER
+10314;N # OLD ITALIC LETTER ES
+10315;N # OLD ITALIC LETTER TE
+10316;N # OLD ITALIC LETTER U
+10317;N # OLD ITALIC LETTER EKS
+10318;N # OLD ITALIC LETTER PHE
+10319;N # OLD ITALIC LETTER KHE
+1031A;N # OLD ITALIC LETTER EF
+1031B;N # OLD ITALIC LETTER ERS
+1031C;N # OLD ITALIC LETTER CHE
+1031D;N # OLD ITALIC LETTER II
+1031E;N # OLD ITALIC LETTER UU
+10320;N # OLD ITALIC NUMERAL ONE
+10321;N # OLD ITALIC NUMERAL FIVE
+10322;N # OLD ITALIC NUMERAL TEN
+10323;N # OLD ITALIC NUMERAL FIFTY
+10330;N # GOTHIC LETTER AHSA
+10331;N # GOTHIC LETTER BAIRKAN
+10332;N # GOTHIC LETTER GIBA
+10333;N # GOTHIC LETTER DAGS
+10334;N # GOTHIC LETTER AIHVUS
+10335;N # GOTHIC LETTER QAIRTHRA
+10336;N # GOTHIC LETTER IUJA
+10337;N # GOTHIC LETTER HAGL
+10338;N # GOTHIC LETTER THIUTH
+10339;N # GOTHIC LETTER EIS
+1033A;N # GOTHIC LETTER KUSMA
+1033B;N # GOTHIC LETTER LAGUS
+1033C;N # GOTHIC LETTER MANNA
+1033D;N # GOTHIC LETTER NAUTHS
+1033E;N # GOTHIC LETTER JER
+1033F;N # GOTHIC LETTER URUS
+10340;N # GOTHIC LETTER PAIRTHRA
+10341;N # GOTHIC LETTER NINETY
+10342;N # GOTHIC LETTER RAIDA
+10343;N # GOTHIC LETTER SAUIL
+10344;N # GOTHIC LETTER TEIWS
+10345;N # GOTHIC LETTER WINJA
+10346;N # GOTHIC LETTER FAIHU
+10347;N # GOTHIC LETTER IGGWS
+10348;N # GOTHIC LETTER HWAIR
+10349;N # GOTHIC LETTER OTHAL
+1034A;N # GOTHIC LETTER NINE HUNDRED
+10380;N # UGARITIC LETTER ALPA
+10381;N # UGARITIC LETTER BETA
+10382;N # UGARITIC LETTER GAMLA
+10383;N # UGARITIC LETTER KHA
+10384;N # UGARITIC LETTER DELTA
+10385;N # UGARITIC LETTER HO
+10386;N # UGARITIC LETTER WO
+10387;N # UGARITIC LETTER ZETA
+10388;N # UGARITIC LETTER HOTA
+10389;N # UGARITIC LETTER TET
+1038A;N # UGARITIC LETTER YOD
+1038B;N # UGARITIC LETTER KAF
+1038C;N # UGARITIC LETTER SHIN
+1038D;N # UGARITIC LETTER LAMDA
+1038E;N # UGARITIC LETTER MEM
+1038F;N # UGARITIC LETTER DHAL
+10390;N # UGARITIC LETTER NUN
+10391;N # UGARITIC LETTER ZU
+10392;N # UGARITIC LETTER SAMKA
+10393;N # UGARITIC LETTER AIN
+10394;N # UGARITIC LETTER PU
+10395;N # UGARITIC LETTER SADE
+10396;N # UGARITIC LETTER QOPA
+10397;N # UGARITIC LETTER RASHA
+10398;N # UGARITIC LETTER THANNA
+10399;N # UGARITIC LETTER GHAIN
+1039A;N # UGARITIC LETTER TO
+1039B;N # UGARITIC LETTER I
+1039C;N # UGARITIC LETTER U
+1039D;N # UGARITIC LETTER SSU
+1039F;N # UGARITIC WORD DIVIDER
+103A0;N # OLD PERSIAN SIGN A
+103A1;N # OLD PERSIAN SIGN I
+103A2;N # OLD PERSIAN SIGN U
+103A3;N # OLD PERSIAN SIGN KA
+103A4;N # OLD PERSIAN SIGN KU
+103A5;N # OLD PERSIAN SIGN GA
+103A6;N # OLD PERSIAN SIGN GU
+103A7;N # OLD PERSIAN SIGN XA
+103A8;N # OLD PERSIAN SIGN CA
+103A9;N # OLD PERSIAN SIGN JA
+103AA;N # OLD PERSIAN SIGN JI
+103AB;N # OLD PERSIAN SIGN TA
+103AC;N # OLD PERSIAN SIGN TU
+103AD;N # OLD PERSIAN SIGN DA
+103AE;N # OLD PERSIAN SIGN DI
+103AF;N # OLD PERSIAN SIGN DU
+103B0;N # OLD PERSIAN SIGN THA
+103B1;N # OLD PERSIAN SIGN PA
+103B2;N # OLD PERSIAN SIGN BA
+103B3;N # OLD PERSIAN SIGN FA
+103B4;N # OLD PERSIAN SIGN NA
+103B5;N # OLD PERSIAN SIGN NU
+103B6;N # OLD PERSIAN SIGN MA
+103B7;N # OLD PERSIAN SIGN MI
+103B8;N # OLD PERSIAN SIGN MU
+103B9;N # OLD PERSIAN SIGN YA
+103BA;N # OLD PERSIAN SIGN VA
+103BB;N # OLD PERSIAN SIGN VI
+103BC;N # OLD PERSIAN SIGN RA
+103BD;N # OLD PERSIAN SIGN RU
+103BE;N # OLD PERSIAN SIGN LA
+103BF;N # OLD PERSIAN SIGN SA
+103C0;N # OLD PERSIAN SIGN ZA
+103C1;N # OLD PERSIAN SIGN SHA
+103C2;N # OLD PERSIAN SIGN SSA
+103C3;N # OLD PERSIAN SIGN HA
+103C8;N # OLD PERSIAN SIGN AURAMAZDAA
+103C9;N # OLD PERSIAN SIGN AURAMAZDAA-2
+103CA;N # OLD PERSIAN SIGN AURAMAZDAAHA
+103CB;N # OLD PERSIAN SIGN XSHAAYATHIYA
+103CC;N # OLD PERSIAN SIGN DAHYAAUSH
+103CD;N # OLD PERSIAN SIGN DAHYAAUSH-2
+103CE;N # OLD PERSIAN SIGN BAGA
+103CF;N # OLD PERSIAN SIGN BUUMISH
+103D0;N # OLD PERSIAN WORD DIVIDER
+103D1;N # OLD PERSIAN NUMBER ONE
+103D2;N # OLD PERSIAN NUMBER TWO
+103D3;N # OLD PERSIAN NUMBER TEN
+103D4;N # OLD PERSIAN NUMBER TWENTY
+103D5;N # OLD PERSIAN NUMBER HUNDRED
+10400;N # DESERET CAPITAL LETTER LONG I
+10401;N # DESERET CAPITAL LETTER LONG E
+10402;N # DESERET CAPITAL LETTER LONG A
+10403;N # DESERET CAPITAL LETTER LONG AH
+10404;N # DESERET CAPITAL LETTER LONG O
+10405;N # DESERET CAPITAL LETTER LONG OO
+10406;N # DESERET CAPITAL LETTER SHORT I
+10407;N # DESERET CAPITAL LETTER SHORT E
+10408;N # DESERET CAPITAL LETTER SHORT A
+10409;N # DESERET CAPITAL LETTER SHORT AH
+1040A;N # DESERET CAPITAL LETTER SHORT O
+1040B;N # DESERET CAPITAL LETTER SHORT OO
+1040C;N # DESERET CAPITAL LETTER AY
+1040D;N # DESERET CAPITAL LETTER OW
+1040E;N # DESERET CAPITAL LETTER WU
+1040F;N # DESERET CAPITAL LETTER YEE
+10410;N # DESERET CAPITAL LETTER H
+10411;N # DESERET CAPITAL LETTER PEE
+10412;N # DESERET CAPITAL LETTER BEE
+10413;N # DESERET CAPITAL LETTER TEE
+10414;N # DESERET CAPITAL LETTER DEE
+10415;N # DESERET CAPITAL LETTER CHEE
+10416;N # DESERET CAPITAL LETTER JEE
+10417;N # DESERET CAPITAL LETTER KAY
+10418;N # DESERET CAPITAL LETTER GAY
+10419;N # DESERET CAPITAL LETTER EF
+1041A;N # DESERET CAPITAL LETTER VEE
+1041B;N # DESERET CAPITAL LETTER ETH
+1041C;N # DESERET CAPITAL LETTER THEE
+1041D;N # DESERET CAPITAL LETTER ES
+1041E;N # DESERET CAPITAL LETTER ZEE
+1041F;N # DESERET CAPITAL LETTER ESH
+10420;N # DESERET CAPITAL LETTER ZHEE
+10421;N # DESERET CAPITAL LETTER ER
+10422;N # DESERET CAPITAL LETTER EL
+10423;N # DESERET CAPITAL LETTER EM
+10424;N # DESERET CAPITAL LETTER EN
+10425;N # DESERET CAPITAL LETTER ENG
+10426;N # DESERET CAPITAL LETTER OI
+10427;N # DESERET CAPITAL LETTER EW
+10428;N # DESERET SMALL LETTER LONG I
+10429;N # DESERET SMALL LETTER LONG E
+1042A;N # DESERET SMALL LETTER LONG A
+1042B;N # DESERET SMALL LETTER LONG AH
+1042C;N # DESERET SMALL LETTER LONG O
+1042D;N # DESERET SMALL LETTER LONG OO
+1042E;N # DESERET SMALL LETTER SHORT I
+1042F;N # DESERET SMALL LETTER SHORT E
+10430;N # DESERET SMALL LETTER SHORT A
+10431;N # DESERET SMALL LETTER SHORT AH
+10432;N # DESERET SMALL LETTER SHORT O
+10433;N # DESERET SMALL LETTER SHORT OO
+10434;N # DESERET SMALL LETTER AY
+10435;N # DESERET SMALL LETTER OW
+10436;N # DESERET SMALL LETTER WU
+10437;N # DESERET SMALL LETTER YEE
+10438;N # DESERET SMALL LETTER H
+10439;N # DESERET SMALL LETTER PEE
+1043A;N # DESERET SMALL LETTER BEE
+1043B;N # DESERET SMALL LETTER TEE
+1043C;N # DESERET SMALL LETTER DEE
+1043D;N # DESERET SMALL LETTER CHEE
+1043E;N # DESERET SMALL LETTER JEE
+1043F;N # DESERET SMALL LETTER KAY
+10440;N # DESERET SMALL LETTER GAY
+10441;N # DESERET SMALL LETTER EF
+10442;N # DESERET SMALL LETTER VEE
+10443;N # DESERET SMALL LETTER ETH
+10444;N # DESERET SMALL LETTER THEE
+10445;N # DESERET SMALL LETTER ES
+10446;N # DESERET SMALL LETTER ZEE
+10447;N # DESERET SMALL LETTER ESH
+10448;N # DESERET SMALL LETTER ZHEE
+10449;N # DESERET SMALL LETTER ER
+1044A;N # DESERET SMALL LETTER EL
+1044B;N # DESERET SMALL LETTER EM
+1044C;N # DESERET SMALL LETTER EN
+1044D;N # DESERET SMALL LETTER ENG
+1044E;N # DESERET SMALL LETTER OI
+1044F;N # DESERET SMALL LETTER EW
+10450;N # SHAVIAN LETTER PEEP
+10451;N # SHAVIAN LETTER TOT
+10452;N # SHAVIAN LETTER KICK
+10453;N # SHAVIAN LETTER FEE
+10454;N # SHAVIAN LETTER THIGH
+10455;N # SHAVIAN LETTER SO
+10456;N # SHAVIAN LETTER SURE
+10457;N # SHAVIAN LETTER CHURCH
+10458;N # SHAVIAN LETTER YEA
+10459;N # SHAVIAN LETTER HUNG
+1045A;N # SHAVIAN LETTER BIB
+1045B;N # SHAVIAN LETTER DEAD
+1045C;N # SHAVIAN LETTER GAG
+1045D;N # SHAVIAN LETTER VOW
+1045E;N # SHAVIAN LETTER THEY
+1045F;N # SHAVIAN LETTER ZOO
+10460;N # SHAVIAN LETTER MEASURE
+10461;N # SHAVIAN LETTER JUDGE
+10462;N # SHAVIAN LETTER WOE
+10463;N # SHAVIAN LETTER HA-HA
+10464;N # SHAVIAN LETTER LOLL
+10465;N # SHAVIAN LETTER MIME
+10466;N # SHAVIAN LETTER IF
+10467;N # SHAVIAN LETTER EGG
+10468;N # SHAVIAN LETTER ASH
+10469;N # SHAVIAN LETTER ADO
+1046A;N # SHAVIAN LETTER ON
+1046B;N # SHAVIAN LETTER WOOL
+1046C;N # SHAVIAN LETTER OUT
+1046D;N # SHAVIAN LETTER AH
+1046E;N # SHAVIAN LETTER ROAR
+1046F;N # SHAVIAN LETTER NUN
+10470;N # SHAVIAN LETTER EAT
+10471;N # SHAVIAN LETTER AGE
+10472;N # SHAVIAN LETTER ICE
+10473;N # SHAVIAN LETTER UP
+10474;N # SHAVIAN LETTER OAK
+10475;N # SHAVIAN LETTER OOZE
+10476;N # SHAVIAN LETTER OIL
+10477;N # SHAVIAN LETTER AWE
+10478;N # SHAVIAN LETTER ARE
+10479;N # SHAVIAN LETTER OR
+1047A;N # SHAVIAN LETTER AIR
+1047B;N # SHAVIAN LETTER ERR
+1047C;N # SHAVIAN LETTER ARRAY
+1047D;N # SHAVIAN LETTER EAR
+1047E;N # SHAVIAN LETTER IAN
+1047F;N # SHAVIAN LETTER YEW
+10480;N # OSMANYA LETTER ALEF
+10481;N # OSMANYA LETTER BA
+10482;N # OSMANYA LETTER TA
+10483;N # OSMANYA LETTER JA
+10484;N # OSMANYA LETTER XA
+10485;N # OSMANYA LETTER KHA
+10486;N # OSMANYA LETTER DEEL
+10487;N # OSMANYA LETTER RA
+10488;N # OSMANYA LETTER SA
+10489;N # OSMANYA LETTER SHIIN
+1048A;N # OSMANYA LETTER DHA
+1048B;N # OSMANYA LETTER CAYN
+1048C;N # OSMANYA LETTER GA
+1048D;N # OSMANYA LETTER FA
+1048E;N # OSMANYA LETTER QAAF
+1048F;N # OSMANYA LETTER KAAF
+10490;N # OSMANYA LETTER LAAN
+10491;N # OSMANYA LETTER MIIN
+10492;N # OSMANYA LETTER NUUN
+10493;N # OSMANYA LETTER WAW
+10494;N # OSMANYA LETTER HA
+10495;N # OSMANYA LETTER YA
+10496;N # OSMANYA LETTER A
+10497;N # OSMANYA LETTER E
+10498;N # OSMANYA LETTER I
+10499;N # OSMANYA LETTER O
+1049A;N # OSMANYA LETTER U
+1049B;N # OSMANYA LETTER AA
+1049C;N # OSMANYA LETTER EE
+1049D;N # OSMANYA LETTER OO
+104A0;N # OSMANYA DIGIT ZERO
+104A1;N # OSMANYA DIGIT ONE
+104A2;N # OSMANYA DIGIT TWO
+104A3;N # OSMANYA DIGIT THREE
+104A4;N # OSMANYA DIGIT FOUR
+104A5;N # OSMANYA DIGIT FIVE
+104A6;N # OSMANYA DIGIT SIX
+104A7;N # OSMANYA DIGIT SEVEN
+104A8;N # OSMANYA DIGIT EIGHT
+104A9;N # OSMANYA DIGIT NINE
+10800;N # CYPRIOT SYLLABLE A
+10801;N # CYPRIOT SYLLABLE E
+10802;N # CYPRIOT SYLLABLE I
+10803;N # CYPRIOT SYLLABLE O
+10804;N # CYPRIOT SYLLABLE U
+10805;N # CYPRIOT SYLLABLE JA
+10808;N # CYPRIOT SYLLABLE JO
+1080A;N # CYPRIOT SYLLABLE KA
+1080B;N # CYPRIOT SYLLABLE KE
+1080C;N # CYPRIOT SYLLABLE KI
+1080D;N # CYPRIOT SYLLABLE KO
+1080E;N # CYPRIOT SYLLABLE KU
+1080F;N # CYPRIOT SYLLABLE LA
+10810;N # CYPRIOT SYLLABLE LE
+10811;N # CYPRIOT SYLLABLE LI
+10812;N # CYPRIOT SYLLABLE LO
+10813;N # CYPRIOT SYLLABLE LU
+10814;N # CYPRIOT SYLLABLE MA
+10815;N # CYPRIOT SYLLABLE ME
+10816;N # CYPRIOT SYLLABLE MI
+10817;N # CYPRIOT SYLLABLE MO
+10818;N # CYPRIOT SYLLABLE MU
+10819;N # CYPRIOT SYLLABLE NA
+1081A;N # CYPRIOT SYLLABLE NE
+1081B;N # CYPRIOT SYLLABLE NI
+1081C;N # CYPRIOT SYLLABLE NO
+1081D;N # CYPRIOT SYLLABLE NU
+1081E;N # CYPRIOT SYLLABLE PA
+1081F;N # CYPRIOT SYLLABLE PE
+10820;N # CYPRIOT SYLLABLE PI
+10821;N # CYPRIOT SYLLABLE PO
+10822;N # CYPRIOT SYLLABLE PU
+10823;N # CYPRIOT SYLLABLE RA
+10824;N # CYPRIOT SYLLABLE RE
+10825;N # CYPRIOT SYLLABLE RI
+10826;N # CYPRIOT SYLLABLE RO
+10827;N # CYPRIOT SYLLABLE RU
+10828;N # CYPRIOT SYLLABLE SA
+10829;N # CYPRIOT SYLLABLE SE
+1082A;N # CYPRIOT SYLLABLE SI
+1082B;N # CYPRIOT SYLLABLE SO
+1082C;N # CYPRIOT SYLLABLE SU
+1082D;N # CYPRIOT SYLLABLE TA
+1082E;N # CYPRIOT SYLLABLE TE
+1082F;N # CYPRIOT SYLLABLE TI
+10830;N # CYPRIOT SYLLABLE TO
+10831;N # CYPRIOT SYLLABLE TU
+10832;N # CYPRIOT SYLLABLE WA
+10833;N # CYPRIOT SYLLABLE WE
+10834;N # CYPRIOT SYLLABLE WI
+10835;N # CYPRIOT SYLLABLE WO
+10837;N # CYPRIOT SYLLABLE XA
+10838;N # CYPRIOT SYLLABLE XE
+1083C;N # CYPRIOT SYLLABLE ZA
+1083F;N # CYPRIOT SYLLABLE ZO
+10900;N # PHOENICIAN LETTER ALF
+10901;N # PHOENICIAN LETTER BET
+10902;N # PHOENICIAN LETTER GAML
+10903;N # PHOENICIAN LETTER DELT
+10904;N # PHOENICIAN LETTER HE
+10905;N # PHOENICIAN LETTER WAU
+10906;N # PHOENICIAN LETTER ZAI
+10907;N # PHOENICIAN LETTER HET
+10908;N # PHOENICIAN LETTER TET
+10909;N # PHOENICIAN LETTER YOD
+1090A;N # PHOENICIAN LETTER KAF
+1090B;N # PHOENICIAN LETTER LAMD
+1090C;N # PHOENICIAN LETTER MEM
+1090D;N # PHOENICIAN LETTER NUN
+1090E;N # PHOENICIAN LETTER SEMK
+1090F;N # PHOENICIAN LETTER AIN
+10910;N # PHOENICIAN LETTER PE
+10911;N # PHOENICIAN LETTER SADE
+10912;N # PHOENICIAN LETTER QOF
+10913;N # PHOENICIAN LETTER ROSH
+10914;N # PHOENICIAN LETTER SHIN
+10915;N # PHOENICIAN LETTER TAU
+10916;N # PHOENICIAN NUMBER ONE
+10917;N # PHOENICIAN NUMBER TEN
+10918;N # PHOENICIAN NUMBER TWENTY
+10919;N # PHOENICIAN NUMBER ONE HUNDRED
+1091F;N # PHOENICIAN WORD SEPARATOR
+10920;N # LYDIAN LETTER A
+10921;N # LYDIAN LETTER B
+10922;N # LYDIAN LETTER G
+10923;N # LYDIAN LETTER D
+10924;N # LYDIAN LETTER E
+10925;N # LYDIAN LETTER V
+10926;N # LYDIAN LETTER I
+10927;N # LYDIAN LETTER Y
+10928;N # LYDIAN LETTER K
+10929;N # LYDIAN LETTER L
+1092A;N # LYDIAN LETTER M
+1092B;N # LYDIAN LETTER N
+1092C;N # LYDIAN LETTER O
+1092D;N # LYDIAN LETTER R
+1092E;N # LYDIAN LETTER SS
+1092F;N # LYDIAN LETTER T
+10930;N # LYDIAN LETTER U
+10931;N # LYDIAN LETTER F
+10932;N # LYDIAN LETTER Q
+10933;N # LYDIAN LETTER S
+10934;N # LYDIAN LETTER TT
+10935;N # LYDIAN LETTER AN
+10936;N # LYDIAN LETTER EN
+10937;N # LYDIAN LETTER LY
+10938;N # LYDIAN LETTER NN
+10939;N # LYDIAN LETTER C
+1093F;N # LYDIAN TRIANGULAR MARK
+10A00;N # KHAROSHTHI LETTER A
+10A01;N # KHAROSHTHI VOWEL SIGN I
+10A02;N # KHAROSHTHI VOWEL SIGN U
+10A03;N # KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05;N # KHAROSHTHI VOWEL SIGN E
+10A06;N # KHAROSHTHI VOWEL SIGN O
+10A0C;N # KHAROSHTHI VOWEL LENGTH MARK
+10A0D;N # KHAROSHTHI SIGN DOUBLE RING BELOW
+10A0E;N # KHAROSHTHI SIGN ANUSVARA
+10A0F;N # KHAROSHTHI SIGN VISARGA
+10A10;N # KHAROSHTHI LETTER KA
+10A11;N # KHAROSHTHI LETTER KHA
+10A12;N # KHAROSHTHI LETTER GA
+10A13;N # KHAROSHTHI LETTER GHA
+10A15;N # KHAROSHTHI LETTER CA
+10A16;N # KHAROSHTHI LETTER CHA
+10A17;N # KHAROSHTHI LETTER JA
+10A19;N # KHAROSHTHI LETTER NYA
+10A1A;N # KHAROSHTHI LETTER TTA
+10A1B;N # KHAROSHTHI LETTER TTHA
+10A1C;N # KHAROSHTHI LETTER DDA
+10A1D;N # KHAROSHTHI LETTER DDHA
+10A1E;N # KHAROSHTHI LETTER NNA
+10A1F;N # KHAROSHTHI LETTER TA
+10A20;N # KHAROSHTHI LETTER THA
+10A21;N # KHAROSHTHI LETTER DA
+10A22;N # KHAROSHTHI LETTER DHA
+10A23;N # KHAROSHTHI LETTER NA
+10A24;N # KHAROSHTHI LETTER PA
+10A25;N # KHAROSHTHI LETTER PHA
+10A26;N # KHAROSHTHI LETTER BA
+10A27;N # KHAROSHTHI LETTER BHA
+10A28;N # KHAROSHTHI LETTER MA
+10A29;N # KHAROSHTHI LETTER YA
+10A2A;N # KHAROSHTHI LETTER RA
+10A2B;N # KHAROSHTHI LETTER LA
+10A2C;N # KHAROSHTHI LETTER VA
+10A2D;N # KHAROSHTHI LETTER SHA
+10A2E;N # KHAROSHTHI LETTER SSA
+10A2F;N # KHAROSHTHI LETTER SA
+10A30;N # KHAROSHTHI LETTER ZA
+10A31;N # KHAROSHTHI LETTER HA
+10A32;N # KHAROSHTHI LETTER KKA
+10A33;N # KHAROSHTHI LETTER TTTHA
+10A38;N # KHAROSHTHI SIGN BAR ABOVE
+10A39;N # KHAROSHTHI SIGN CAUDA
+10A3A;N # KHAROSHTHI SIGN DOT BELOW
+10A3F;N # KHAROSHTHI VIRAMA
+10A40;N # KHAROSHTHI DIGIT ONE
+10A41;N # KHAROSHTHI DIGIT TWO
+10A42;N # KHAROSHTHI DIGIT THREE
+10A43;N # KHAROSHTHI DIGIT FOUR
+10A44;N # KHAROSHTHI NUMBER TEN
+10A45;N # KHAROSHTHI NUMBER TWENTY
+10A46;N # KHAROSHTHI NUMBER ONE HUNDRED
+10A47;N # KHAROSHTHI NUMBER ONE THOUSAND
+10A50;N # KHAROSHTHI PUNCTUATION DOT
+10A51;N # KHAROSHTHI PUNCTUATION SMALL CIRCLE
+10A52;N # KHAROSHTHI PUNCTUATION CIRCLE
+10A53;N # KHAROSHTHI PUNCTUATION CRESCENT BAR
+10A54;N # KHAROSHTHI PUNCTUATION MANGALAM
+10A55;N # KHAROSHTHI PUNCTUATION LOTUS
+10A56;N # KHAROSHTHI PUNCTUATION DANDA
+10A57;N # KHAROSHTHI PUNCTUATION DOUBLE DANDA
+10A58;N # KHAROSHTHI PUNCTUATION LINES
+12000;N # CUNEIFORM SIGN A
+12001;N # CUNEIFORM SIGN A TIMES A
+12002;N # CUNEIFORM SIGN A TIMES BAD
+12003;N # CUNEIFORM SIGN A TIMES GAN2 TENU
+12004;N # CUNEIFORM SIGN A TIMES HA
+12005;N # CUNEIFORM SIGN A TIMES IGI
+12006;N # CUNEIFORM SIGN A TIMES LAGAR GUNU
+12007;N # CUNEIFORM SIGN A TIMES MUSH
+12008;N # CUNEIFORM SIGN A TIMES SAG
+12009;N # CUNEIFORM SIGN A2
+1200A;N # CUNEIFORM SIGN AB
+1200B;N # CUNEIFORM SIGN AB TIMES ASH2
+1200C;N # CUNEIFORM SIGN AB TIMES DUN3 GUNU
+1200D;N # CUNEIFORM SIGN AB TIMES GAL
+1200E;N # CUNEIFORM SIGN AB TIMES GAN2 TENU
+1200F;N # CUNEIFORM SIGN AB TIMES HA
+12010;N # CUNEIFORM SIGN AB TIMES IGI GUNU
+12011;N # CUNEIFORM SIGN AB TIMES IMIN
+12012;N # CUNEIFORM SIGN AB TIMES LAGAB
+12013;N # CUNEIFORM SIGN AB TIMES SHESH
+12014;N # CUNEIFORM SIGN AB TIMES U PLUS U PLUS U
+12015;N # CUNEIFORM SIGN AB GUNU
+12016;N # CUNEIFORM SIGN AB2
+12017;N # CUNEIFORM SIGN AB2 TIMES BALAG
+12018;N # CUNEIFORM SIGN AB2 TIMES GAN2 TENU
+12019;N # CUNEIFORM SIGN AB2 TIMES ME PLUS EN
+1201A;N # CUNEIFORM SIGN AB2 TIMES SHA3
+1201B;N # CUNEIFORM SIGN AB2 TIMES TAK4
+1201C;N # CUNEIFORM SIGN AD
+1201D;N # CUNEIFORM SIGN AK
+1201E;N # CUNEIFORM SIGN AK TIMES ERIN2
+1201F;N # CUNEIFORM SIGN AK TIMES SHITA PLUS GISH
+12020;N # CUNEIFORM SIGN AL
+12021;N # CUNEIFORM SIGN AL TIMES AL
+12022;N # CUNEIFORM SIGN AL TIMES DIM2
+12023;N # CUNEIFORM SIGN AL TIMES GISH
+12024;N # CUNEIFORM SIGN AL TIMES HA
+12025;N # CUNEIFORM SIGN AL TIMES KAD3
+12026;N # CUNEIFORM SIGN AL TIMES KI
+12027;N # CUNEIFORM SIGN AL TIMES SHE
+12028;N # CUNEIFORM SIGN AL TIMES USH
+12029;N # CUNEIFORM SIGN ALAN
+1202A;N # CUNEIFORM SIGN ALEPH
+1202B;N # CUNEIFORM SIGN AMAR
+1202C;N # CUNEIFORM SIGN AMAR TIMES SHE
+1202D;N # CUNEIFORM SIGN AN
+1202E;N # CUNEIFORM SIGN AN OVER AN
+1202F;N # CUNEIFORM SIGN AN THREE TIMES
+12030;N # CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA
+12031;N # CUNEIFORM SIGN AN PLUS NAGA SQUARED
+12032;N # CUNEIFORM SIGN ANSHE
+12033;N # CUNEIFORM SIGN APIN
+12034;N # CUNEIFORM SIGN ARAD
+12035;N # CUNEIFORM SIGN ARAD TIMES KUR
+12036;N # CUNEIFORM SIGN ARKAB
+12037;N # CUNEIFORM SIGN ASAL2
+12038;N # CUNEIFORM SIGN ASH
+12039;N # CUNEIFORM SIGN ASH ZIDA TENU
+1203A;N # CUNEIFORM SIGN ASH KABA TENU
+1203B;N # CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP
+1203C;N # CUNEIFORM SIGN ASH OVER ASH OVER ASH
+1203D;N # CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH
+1203E;N # CUNEIFORM SIGN ASH2
+1203F;N # CUNEIFORM SIGN ASHGAB
+12040;N # CUNEIFORM SIGN BA
+12041;N # CUNEIFORM SIGN BAD
+12042;N # CUNEIFORM SIGN BAG3
+12043;N # CUNEIFORM SIGN BAHAR2
+12044;N # CUNEIFORM SIGN BAL
+12045;N # CUNEIFORM SIGN BAL OVER BAL
+12046;N # CUNEIFORM SIGN BALAG
+12047;N # CUNEIFORM SIGN BAR
+12048;N # CUNEIFORM SIGN BARA2
+12049;N # CUNEIFORM SIGN BI
+1204A;N # CUNEIFORM SIGN BI TIMES A
+1204B;N # CUNEIFORM SIGN BI TIMES GAR
+1204C;N # CUNEIFORM SIGN BI TIMES IGI GUNU
+1204D;N # CUNEIFORM SIGN BU
+1204E;N # CUNEIFORM SIGN BU OVER BU AB
+1204F;N # CUNEIFORM SIGN BU OVER BU UN
+12050;N # CUNEIFORM SIGN BU CROSSING BU
+12051;N # CUNEIFORM SIGN BULUG
+12052;N # CUNEIFORM SIGN BULUG OVER BULUG
+12053;N # CUNEIFORM SIGN BUR
+12054;N # CUNEIFORM SIGN BUR2
+12055;N # CUNEIFORM SIGN DA
+12056;N # CUNEIFORM SIGN DAG
+12057;N # CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH
+12058;N # CUNEIFORM SIGN DAG KISIM5 TIMES AMAR
+12059;N # CUNEIFORM SIGN DAG KISIM5 TIMES BALAG
+1205A;N # CUNEIFORM SIGN DAG KISIM5 TIMES BI
+1205B;N # CUNEIFORM SIGN DAG KISIM5 TIMES GA
+1205C;N # CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH
+1205D;N # CUNEIFORM SIGN DAG KISIM5 TIMES GI
+1205E;N # CUNEIFORM SIGN DAG KISIM5 TIMES GIR2
+1205F;N # CUNEIFORM SIGN DAG KISIM5 TIMES GUD
+12060;N # CUNEIFORM SIGN DAG KISIM5 TIMES HA
+12061;N # CUNEIFORM SIGN DAG KISIM5 TIMES IR
+12062;N # CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU
+12063;N # CUNEIFORM SIGN DAG KISIM5 TIMES KAK
+12064;N # CUNEIFORM SIGN DAG KISIM5 TIMES LA
+12065;N # CUNEIFORM SIGN DAG KISIM5 TIMES LU
+12066;N # CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2
+12067;N # CUNEIFORM SIGN DAG KISIM5 TIMES LUM
+12068;N # CUNEIFORM SIGN DAG KISIM5 TIMES NE
+12069;N # CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP
+1206A;N # CUNEIFORM SIGN DAG KISIM5 TIMES SI
+1206B;N # CUNEIFORM SIGN DAG KISIM5 TIMES TAK4
+1206C;N # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2
+1206D;N # CUNEIFORM SIGN DAG KISIM5 TIMES USH
+1206E;N # CUNEIFORM SIGN DAM
+1206F;N # CUNEIFORM SIGN DAR
+12070;N # CUNEIFORM SIGN DARA3
+12071;N # CUNEIFORM SIGN DARA4
+12072;N # CUNEIFORM SIGN DI
+12073;N # CUNEIFORM SIGN DIB
+12074;N # CUNEIFORM SIGN DIM
+12075;N # CUNEIFORM SIGN DIM TIMES SHE
+12076;N # CUNEIFORM SIGN DIM2
+12077;N # CUNEIFORM SIGN DIN
+12078;N # CUNEIFORM SIGN DIN KASKAL U GUNU DISH
+12079;N # CUNEIFORM SIGN DISH
+1207A;N # CUNEIFORM SIGN DU
+1207B;N # CUNEIFORM SIGN DU OVER DU
+1207C;N # CUNEIFORM SIGN DU GUNU
+1207D;N # CUNEIFORM SIGN DU SHESHIG
+1207E;N # CUNEIFORM SIGN DUB
+1207F;N # CUNEIFORM SIGN DUB TIMES ESH2
+12080;N # CUNEIFORM SIGN DUB2
+12081;N # CUNEIFORM SIGN DUG
+12082;N # CUNEIFORM SIGN DUGUD
+12083;N # CUNEIFORM SIGN DUH
+12084;N # CUNEIFORM SIGN DUN
+12085;N # CUNEIFORM SIGN DUN3
+12086;N # CUNEIFORM SIGN DUN3 GUNU
+12087;N # CUNEIFORM SIGN DUN3 GUNU GUNU
+12088;N # CUNEIFORM SIGN DUN4
+12089;N # CUNEIFORM SIGN DUR2
+1208A;N # CUNEIFORM SIGN E
+1208B;N # CUNEIFORM SIGN E TIMES PAP
+1208C;N # CUNEIFORM SIGN E OVER E NUN OVER NUN
+1208D;N # CUNEIFORM SIGN E2
+1208E;N # CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA
+1208F;N # CUNEIFORM SIGN E2 TIMES GAR
+12090;N # CUNEIFORM SIGN E2 TIMES MI
+12091;N # CUNEIFORM SIGN E2 TIMES SAL
+12092;N # CUNEIFORM SIGN E2 TIMES SHE
+12093;N # CUNEIFORM SIGN E2 TIMES U
+12094;N # CUNEIFORM SIGN EDIN
+12095;N # CUNEIFORM SIGN EGIR
+12096;N # CUNEIFORM SIGN EL
+12097;N # CUNEIFORM SIGN EN
+12098;N # CUNEIFORM SIGN EN TIMES GAN2
+12099;N # CUNEIFORM SIGN EN TIMES GAN2 TENU
+1209A;N # CUNEIFORM SIGN EN TIMES ME
+1209B;N # CUNEIFORM SIGN EN CROSSING EN
+1209C;N # CUNEIFORM SIGN EN OPPOSING EN
+1209D;N # CUNEIFORM SIGN EN SQUARED
+1209E;N # CUNEIFORM SIGN EREN
+1209F;N # CUNEIFORM SIGN ERIN2
+120A0;N # CUNEIFORM SIGN ESH2
+120A1;N # CUNEIFORM SIGN EZEN
+120A2;N # CUNEIFORM SIGN EZEN TIMES A
+120A3;N # CUNEIFORM SIGN EZEN TIMES A PLUS LAL
+120A4;N # CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL
+120A5;N # CUNEIFORM SIGN EZEN TIMES AN
+120A6;N # CUNEIFORM SIGN EZEN TIMES BAD
+120A7;N # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU
+120A8;N # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU
+120A9;N # CUNEIFORM SIGN EZEN TIMES HA
+120AA;N # CUNEIFORM SIGN EZEN TIMES HA GUNU
+120AB;N # CUNEIFORM SIGN EZEN TIMES IGI GUNU
+120AC;N # CUNEIFORM SIGN EZEN TIMES KASKAL
+120AD;N # CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED
+120AE;N # CUNEIFORM SIGN EZEN TIMES KU3
+120AF;N # CUNEIFORM SIGN EZEN TIMES LA
+120B0;N # CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL
+120B1;N # CUNEIFORM SIGN EZEN TIMES LI
+120B2;N # CUNEIFORM SIGN EZEN TIMES LU
+120B3;N # CUNEIFORM SIGN EZEN TIMES U2
+120B4;N # CUNEIFORM SIGN EZEN TIMES UD
+120B5;N # CUNEIFORM SIGN GA
+120B6;N # CUNEIFORM SIGN GA GUNU
+120B7;N # CUNEIFORM SIGN GA2
+120B8;N # CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA
+120B9;N # CUNEIFORM SIGN GA2 TIMES A PLUS HA
+120BA;N # CUNEIFORM SIGN GA2 TIMES A PLUS IGI
+120BB;N # CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB
+120BC;N # CUNEIFORM SIGN GA2 TIMES AN
+120BD;N # CUNEIFORM SIGN GA2 TIMES ASH
+120BE;N # CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL
+120BF;N # CUNEIFORM SIGN GA2 TIMES BAD
+120C0;N # CUNEIFORM SIGN GA2 TIMES BAR PLUS RA
+120C1;N # CUNEIFORM SIGN GA2 TIMES BUR
+120C2;N # CUNEIFORM SIGN GA2 TIMES BUR PLUS RA
+120C3;N # CUNEIFORM SIGN GA2 TIMES DA
+120C4;N # CUNEIFORM SIGN GA2 TIMES DI
+120C5;N # CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE
+120C6;N # CUNEIFORM SIGN GA2 TIMES DUB
+120C7;N # CUNEIFORM SIGN GA2 TIMES EL
+120C8;N # CUNEIFORM SIGN GA2 TIMES EL PLUS LA
+120C9;N # CUNEIFORM SIGN GA2 TIMES EN
+120CA;N # CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU
+120CB;N # CUNEIFORM SIGN GA2 TIMES GAN2 TENU
+120CC;N # CUNEIFORM SIGN GA2 TIMES GAR
+120CD;N # CUNEIFORM SIGN GA2 TIMES GI
+120CE;N # CUNEIFORM SIGN GA2 TIMES GI4
+120CF;N # CUNEIFORM SIGN GA2 TIMES GI4 PLUS A
+120D0;N # CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU
+120D1;N # CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2
+120D2;N # CUNEIFORM SIGN GA2 TIMES HAL
+120D3;N # CUNEIFORM SIGN GA2 TIMES HAL PLUS LA
+120D4;N # CUNEIFORM SIGN GA2 TIMES HI PLUS LI
+120D5;N # CUNEIFORM SIGN GA2 TIMES HUB2
+120D6;N # CUNEIFORM SIGN GA2 TIMES IGI GUNU
+120D7;N # CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH
+120D8;N # CUNEIFORM SIGN GA2 TIMES KAK
+120D9;N # CUNEIFORM SIGN GA2 TIMES KASKAL
+120DA;N # CUNEIFORM SIGN GA2 TIMES KID
+120DB;N # CUNEIFORM SIGN GA2 TIMES KID PLUS LAL
+120DC;N # CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN
+120DD;N # CUNEIFORM SIGN GA2 TIMES LA
+120DE;N # CUNEIFORM SIGN GA2 TIMES ME PLUS EN
+120DF;N # CUNEIFORM SIGN GA2 TIMES MI
+120E0;N # CUNEIFORM SIGN GA2 TIMES NUN
+120E1;N # CUNEIFORM SIGN GA2 TIMES NUN OVER NUN
+120E2;N # CUNEIFORM SIGN GA2 TIMES PA
+120E3;N # CUNEIFORM SIGN GA2 TIMES SAL
+120E4;N # CUNEIFORM SIGN GA2 TIMES SAR
+120E5;N # CUNEIFORM SIGN GA2 TIMES SHE
+120E6;N # CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR
+120E7;N # CUNEIFORM SIGN GA2 TIMES SHID
+120E8;N # CUNEIFORM SIGN GA2 TIMES SUM
+120E9;N # CUNEIFORM SIGN GA2 TIMES TAK4
+120EA;N # CUNEIFORM SIGN GA2 TIMES U
+120EB;N # CUNEIFORM SIGN GA2 TIMES UD
+120EC;N # CUNEIFORM SIGN GA2 TIMES UD PLUS DU
+120ED;N # CUNEIFORM SIGN GA2 OVER GA2
+120EE;N # CUNEIFORM SIGN GABA
+120EF;N # CUNEIFORM SIGN GABA CROSSING GABA
+120F0;N # CUNEIFORM SIGN GAD
+120F1;N # CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR
+120F2;N # CUNEIFORM SIGN GAL
+120F3;N # CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR
+120F4;N # CUNEIFORM SIGN GALAM
+120F5;N # CUNEIFORM SIGN GAM
+120F6;N # CUNEIFORM SIGN GAN
+120F7;N # CUNEIFORM SIGN GAN2
+120F8;N # CUNEIFORM SIGN GAN2 TENU
+120F9;N # CUNEIFORM SIGN GAN2 OVER GAN2
+120FA;N # CUNEIFORM SIGN GAN2 CROSSING GAN2
+120FB;N # CUNEIFORM SIGN GAR
+120FC;N # CUNEIFORM SIGN GAR3
+120FD;N # CUNEIFORM SIGN GASHAN
+120FE;N # CUNEIFORM SIGN GESHTIN
+120FF;N # CUNEIFORM SIGN GESHTIN TIMES KUR
+12100;N # CUNEIFORM SIGN GI
+12101;N # CUNEIFORM SIGN GI TIMES E
+12102;N # CUNEIFORM SIGN GI TIMES U
+12103;N # CUNEIFORM SIGN GI CROSSING GI
+12104;N # CUNEIFORM SIGN GI4
+12105;N # CUNEIFORM SIGN GI4 OVER GI4
+12106;N # CUNEIFORM SIGN GI4 CROSSING GI4
+12107;N # CUNEIFORM SIGN GIDIM
+12108;N # CUNEIFORM SIGN GIR2
+12109;N # CUNEIFORM SIGN GIR2 GUNU
+1210A;N # CUNEIFORM SIGN GIR3
+1210B;N # CUNEIFORM SIGN GIR3 TIMES A PLUS IGI
+1210C;N # CUNEIFORM SIGN GIR3 TIMES GAN2 TENU
+1210D;N # CUNEIFORM SIGN GIR3 TIMES IGI
+1210E;N # CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI
+1210F;N # CUNEIFORM SIGN GIR3 TIMES PA
+12110;N # CUNEIFORM SIGN GISAL
+12111;N # CUNEIFORM SIGN GISH
+12112;N # CUNEIFORM SIGN GISH CROSSING GISH
+12113;N # CUNEIFORM SIGN GISH TIMES BAD
+12114;N # CUNEIFORM SIGN GISH TIMES TAK4
+12115;N # CUNEIFORM SIGN GISH TENU
+12116;N # CUNEIFORM SIGN GU
+12117;N # CUNEIFORM SIGN GU CROSSING GU
+12118;N # CUNEIFORM SIGN GU2
+12119;N # CUNEIFORM SIGN GU2 TIMES KAK
+1211A;N # CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU
+1211B;N # CUNEIFORM SIGN GU2 TIMES NUN
+1211C;N # CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2
+1211D;N # CUNEIFORM SIGN GU2 GUNU
+1211E;N # CUNEIFORM SIGN GUD
+1211F;N # CUNEIFORM SIGN GUD TIMES A PLUS KUR
+12120;N # CUNEIFORM SIGN GUD TIMES KUR
+12121;N # CUNEIFORM SIGN GUD OVER GUD LUGAL
+12122;N # CUNEIFORM SIGN GUL
+12123;N # CUNEIFORM SIGN GUM
+12124;N # CUNEIFORM SIGN GUM TIMES SHE
+12125;N # CUNEIFORM SIGN GUR
+12126;N # CUNEIFORM SIGN GUR7
+12127;N # CUNEIFORM SIGN GURUN
+12128;N # CUNEIFORM SIGN GURUSH
+12129;N # CUNEIFORM SIGN HA
+1212A;N # CUNEIFORM SIGN HA TENU
+1212B;N # CUNEIFORM SIGN HA GUNU
+1212C;N # CUNEIFORM SIGN HAL
+1212D;N # CUNEIFORM SIGN HI
+1212E;N # CUNEIFORM SIGN HI TIMES ASH
+1212F;N # CUNEIFORM SIGN HI TIMES ASH2
+12130;N # CUNEIFORM SIGN HI TIMES BAD
+12131;N # CUNEIFORM SIGN HI TIMES DISH
+12132;N # CUNEIFORM SIGN HI TIMES GAD
+12133;N # CUNEIFORM SIGN HI TIMES KIN
+12134;N # CUNEIFORM SIGN HI TIMES NUN
+12135;N # CUNEIFORM SIGN HI TIMES SHE
+12136;N # CUNEIFORM SIGN HI TIMES U
+12137;N # CUNEIFORM SIGN HU
+12138;N # CUNEIFORM SIGN HUB2
+12139;N # CUNEIFORM SIGN HUB2 TIMES AN
+1213A;N # CUNEIFORM SIGN HUB2 TIMES HAL
+1213B;N # CUNEIFORM SIGN HUB2 TIMES KASKAL
+1213C;N # CUNEIFORM SIGN HUB2 TIMES LISH
+1213D;N # CUNEIFORM SIGN HUB2 TIMES UD
+1213E;N # CUNEIFORM SIGN HUL2
+1213F;N # CUNEIFORM SIGN I
+12140;N # CUNEIFORM SIGN I A
+12141;N # CUNEIFORM SIGN IB
+12142;N # CUNEIFORM SIGN IDIM
+12143;N # CUNEIFORM SIGN IDIM OVER IDIM BUR
+12144;N # CUNEIFORM SIGN IDIM OVER IDIM SQUARED
+12145;N # CUNEIFORM SIGN IG
+12146;N # CUNEIFORM SIGN IGI
+12147;N # CUNEIFORM SIGN IGI DIB
+12148;N # CUNEIFORM SIGN IGI RI
+12149;N # CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD
+1214A;N # CUNEIFORM SIGN IGI GUNU
+1214B;N # CUNEIFORM SIGN IL
+1214C;N # CUNEIFORM SIGN IL TIMES GAN2 TENU
+1214D;N # CUNEIFORM SIGN IL2
+1214E;N # CUNEIFORM SIGN IM
+1214F;N # CUNEIFORM SIGN IM TIMES TAK4
+12150;N # CUNEIFORM SIGN IM CROSSING IM
+12151;N # CUNEIFORM SIGN IM OPPOSING IM
+12152;N # CUNEIFORM SIGN IM SQUARED
+12153;N # CUNEIFORM SIGN IMIN
+12154;N # CUNEIFORM SIGN IN
+12155;N # CUNEIFORM SIGN IR
+12156;N # CUNEIFORM SIGN ISH
+12157;N # CUNEIFORM SIGN KA
+12158;N # CUNEIFORM SIGN KA TIMES A
+12159;N # CUNEIFORM SIGN KA TIMES AD
+1215A;N # CUNEIFORM SIGN KA TIMES AD PLUS KU3
+1215B;N # CUNEIFORM SIGN KA TIMES ASH2
+1215C;N # CUNEIFORM SIGN KA TIMES BAD
+1215D;N # CUNEIFORM SIGN KA TIMES BALAG
+1215E;N # CUNEIFORM SIGN KA TIMES BAR
+1215F;N # CUNEIFORM SIGN KA TIMES BI
+12160;N # CUNEIFORM SIGN KA TIMES ERIN2
+12161;N # CUNEIFORM SIGN KA TIMES ESH2
+12162;N # CUNEIFORM SIGN KA TIMES GA
+12163;N # CUNEIFORM SIGN KA TIMES GAL
+12164;N # CUNEIFORM SIGN KA TIMES GAN2 TENU
+12165;N # CUNEIFORM SIGN KA TIMES GAR
+12166;N # CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A
+12167;N # CUNEIFORM SIGN KA TIMES GI
+12168;N # CUNEIFORM SIGN KA TIMES GIR2
+12169;N # CUNEIFORM SIGN KA TIMES GISH PLUS SAR
+1216A;N # CUNEIFORM SIGN KA TIMES GISH CROSSING GISH
+1216B;N # CUNEIFORM SIGN KA TIMES GU
+1216C;N # CUNEIFORM SIGN KA TIMES GUR7
+1216D;N # CUNEIFORM SIGN KA TIMES IGI
+1216E;N # CUNEIFORM SIGN KA TIMES IM
+1216F;N # CUNEIFORM SIGN KA TIMES KAK
+12170;N # CUNEIFORM SIGN KA TIMES KI
+12171;N # CUNEIFORM SIGN KA TIMES KID
+12172;N # CUNEIFORM SIGN KA TIMES LI
+12173;N # CUNEIFORM SIGN KA TIMES LU
+12174;N # CUNEIFORM SIGN KA TIMES ME
+12175;N # CUNEIFORM SIGN KA TIMES ME PLUS DU
+12176;N # CUNEIFORM SIGN KA TIMES ME PLUS GI
+12177;N # CUNEIFORM SIGN KA TIMES ME PLUS TE
+12178;N # CUNEIFORM SIGN KA TIMES MI
+12179;N # CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ
+1217A;N # CUNEIFORM SIGN KA TIMES NE
+1217B;N # CUNEIFORM SIGN KA TIMES NUN
+1217C;N # CUNEIFORM SIGN KA TIMES PI
+1217D;N # CUNEIFORM SIGN KA TIMES RU
+1217E;N # CUNEIFORM SIGN KA TIMES SA
+1217F;N # CUNEIFORM SIGN KA TIMES SAR
+12180;N # CUNEIFORM SIGN KA TIMES SHA
+12181;N # CUNEIFORM SIGN KA TIMES SHE
+12182;N # CUNEIFORM SIGN KA TIMES SHID
+12183;N # CUNEIFORM SIGN KA TIMES SHU
+12184;N # CUNEIFORM SIGN KA TIMES SIG
+12185;N # CUNEIFORM SIGN KA TIMES SUHUR
+12186;N # CUNEIFORM SIGN KA TIMES TAR
+12187;N # CUNEIFORM SIGN KA TIMES U
+12188;N # CUNEIFORM SIGN KA TIMES U2
+12189;N # CUNEIFORM SIGN KA TIMES UD
+1218A;N # CUNEIFORM SIGN KA TIMES UMUM TIMES PA
+1218B;N # CUNEIFORM SIGN KA TIMES USH
+1218C;N # CUNEIFORM SIGN KA TIMES ZI
+1218D;N # CUNEIFORM SIGN KA2
+1218E;N # CUNEIFORM SIGN KA2 CROSSING KA2
+1218F;N # CUNEIFORM SIGN KAB
+12190;N # CUNEIFORM SIGN KAD2
+12191;N # CUNEIFORM SIGN KAD3
+12192;N # CUNEIFORM SIGN KAD4
+12193;N # CUNEIFORM SIGN KAD5
+12194;N # CUNEIFORM SIGN KAD5 OVER KAD5
+12195;N # CUNEIFORM SIGN KAK
+12196;N # CUNEIFORM SIGN KAK TIMES IGI GUNU
+12197;N # CUNEIFORM SIGN KAL
+12198;N # CUNEIFORM SIGN KAL TIMES BAD
+12199;N # CUNEIFORM SIGN KAL CROSSING KAL
+1219A;N # CUNEIFORM SIGN KAM2
+1219B;N # CUNEIFORM SIGN KAM4
+1219C;N # CUNEIFORM SIGN KASKAL
+1219D;N # CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219E;N # CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219F;N # CUNEIFORM SIGN KESH2
+121A0;N # CUNEIFORM SIGN KI
+121A1;N # CUNEIFORM SIGN KI TIMES BAD
+121A2;N # CUNEIFORM SIGN KI TIMES U
+121A3;N # CUNEIFORM SIGN KI TIMES UD
+121A4;N # CUNEIFORM SIGN KID
+121A5;N # CUNEIFORM SIGN KIN
+121A6;N # CUNEIFORM SIGN KISAL
+121A7;N # CUNEIFORM SIGN KISH
+121A8;N # CUNEIFORM SIGN KISIM5
+121A9;N # CUNEIFORM SIGN KISIM5 OVER KISIM5
+121AA;N # CUNEIFORM SIGN KU
+121AB;N # CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2
+121AC;N # CUNEIFORM SIGN KU3
+121AD;N # CUNEIFORM SIGN KU4
+121AE;N # CUNEIFORM SIGN KU4 VARIANT FORM
+121AF;N # CUNEIFORM SIGN KU7
+121B0;N # CUNEIFORM SIGN KUL
+121B1;N # CUNEIFORM SIGN KUL GUNU
+121B2;N # CUNEIFORM SIGN KUN
+121B3;N # CUNEIFORM SIGN KUR
+121B4;N # CUNEIFORM SIGN KUR OPPOSING KUR
+121B5;N # CUNEIFORM SIGN KUSHU2
+121B6;N # CUNEIFORM SIGN KWU318
+121B7;N # CUNEIFORM SIGN LA
+121B8;N # CUNEIFORM SIGN LAGAB
+121B9;N # CUNEIFORM SIGN LAGAB TIMES A
+121BA;N # CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA
+121BB;N # CUNEIFORM SIGN LAGAB TIMES A PLUS GAR
+121BC;N # CUNEIFORM SIGN LAGAB TIMES A PLUS LAL
+121BD;N # CUNEIFORM SIGN LAGAB TIMES AL
+121BE;N # CUNEIFORM SIGN LAGAB TIMES AN
+121BF;N # CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU
+121C0;N # CUNEIFORM SIGN LAGAB TIMES BAD
+121C1;N # CUNEIFORM SIGN LAGAB TIMES BI
+121C2;N # CUNEIFORM SIGN LAGAB TIMES DAR
+121C3;N # CUNEIFORM SIGN LAGAB TIMES EN
+121C4;N # CUNEIFORM SIGN LAGAB TIMES GA
+121C5;N # CUNEIFORM SIGN LAGAB TIMES GAR
+121C6;N # CUNEIFORM SIGN LAGAB TIMES GUD
+121C7;N # CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD
+121C8;N # CUNEIFORM SIGN LAGAB TIMES HA
+121C9;N # CUNEIFORM SIGN LAGAB TIMES HAL
+121CA;N # CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN
+121CB;N # CUNEIFORM SIGN LAGAB TIMES IGI GUNU
+121CC;N # CUNEIFORM SIGN LAGAB TIMES IM
+121CD;N # CUNEIFORM SIGN LAGAB TIMES IM PLUS HA
+121CE;N # CUNEIFORM SIGN LAGAB TIMES IM PLUS LU
+121CF;N # CUNEIFORM SIGN LAGAB TIMES KI
+121D0;N # CUNEIFORM SIGN LAGAB TIMES KIN
+121D1;N # CUNEIFORM SIGN LAGAB TIMES KU3
+121D2;N # CUNEIFORM SIGN LAGAB TIMES KUL
+121D3;N # CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A
+121D4;N # CUNEIFORM SIGN LAGAB TIMES LAGAB
+121D5;N # CUNEIFORM SIGN LAGAB TIMES LISH
+121D6;N # CUNEIFORM SIGN LAGAB TIMES LU
+121D7;N # CUNEIFORM SIGN LAGAB TIMES LUL
+121D8;N # CUNEIFORM SIGN LAGAB TIMES ME
+121D9;N # CUNEIFORM SIGN LAGAB TIMES ME PLUS EN
+121DA;N # CUNEIFORM SIGN LAGAB TIMES MUSH
+121DB;N # CUNEIFORM SIGN LAGAB TIMES NE
+121DC;N # CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM
+121DD;N # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2
+121DE;N # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU
+121DF;N # CUNEIFORM SIGN LAGAB TIMES SHU2
+121E0;N # CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2
+121E1;N # CUNEIFORM SIGN LAGAB TIMES SUM
+121E2;N # CUNEIFORM SIGN LAGAB TIMES TAG
+121E3;N # CUNEIFORM SIGN LAGAB TIMES TAK4
+121E4;N # CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA
+121E5;N # CUNEIFORM SIGN LAGAB TIMES U
+121E6;N # CUNEIFORM SIGN LAGAB TIMES U PLUS A
+121E7;N # CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U
+121E8;N # CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH
+121E9;N # CUNEIFORM SIGN LAGAB TIMES UD
+121EA;N # CUNEIFORM SIGN LAGAB TIMES USH
+121EB;N # CUNEIFORM SIGN LAGAB SQUARED
+121EC;N # CUNEIFORM SIGN LAGAR
+121ED;N # CUNEIFORM SIGN LAGAR TIMES SHE
+121EE;N # CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM
+121EF;N # CUNEIFORM SIGN LAGAR GUNU
+121F0;N # CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE
+121F1;N # CUNEIFORM SIGN LAHSHU
+121F2;N # CUNEIFORM SIGN LAL
+121F3;N # CUNEIFORM SIGN LAL TIMES LAL
+121F4;N # CUNEIFORM SIGN LAM
+121F5;N # CUNEIFORM SIGN LAM TIMES KUR
+121F6;N # CUNEIFORM SIGN LAM TIMES KUR PLUS RU
+121F7;N # CUNEIFORM SIGN LI
+121F8;N # CUNEIFORM SIGN LIL
+121F9;N # CUNEIFORM SIGN LIMMU2
+121FA;N # CUNEIFORM SIGN LISH
+121FB;N # CUNEIFORM SIGN LU
+121FC;N # CUNEIFORM SIGN LU TIMES BAD
+121FD;N # CUNEIFORM SIGN LU2
+121FE;N # CUNEIFORM SIGN LU2 TIMES AL
+121FF;N # CUNEIFORM SIGN LU2 TIMES BAD
+12200;N # CUNEIFORM SIGN LU2 TIMES ESH2
+12201;N # CUNEIFORM SIGN LU2 TIMES ESH2 TENU
+12202;N # CUNEIFORM SIGN LU2 TIMES GAN2 TENU
+12203;N # CUNEIFORM SIGN LU2 TIMES HI TIMES BAD
+12204;N # CUNEIFORM SIGN LU2 TIMES IM
+12205;N # CUNEIFORM SIGN LU2 TIMES KAD2
+12206;N # CUNEIFORM SIGN LU2 TIMES KAD3
+12207;N # CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH
+12208;N # CUNEIFORM SIGN LU2 TIMES KI
+12209;N # CUNEIFORM SIGN LU2 TIMES LA PLUS ASH
+1220A;N # CUNEIFORM SIGN LU2 TIMES LAGAB
+1220B;N # CUNEIFORM SIGN LU2 TIMES ME PLUS EN
+1220C;N # CUNEIFORM SIGN LU2 TIMES NE
+1220D;N # CUNEIFORM SIGN LU2 TIMES NU
+1220E;N # CUNEIFORM SIGN LU2 TIMES SI PLUS ASH
+1220F;N # CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU
+12210;N # CUNEIFORM SIGN LU2 TIMES TUG2
+12211;N # CUNEIFORM SIGN LU2 TENU
+12212;N # CUNEIFORM SIGN LU2 CROSSING LU2
+12213;N # CUNEIFORM SIGN LU2 OPPOSING LU2
+12214;N # CUNEIFORM SIGN LU2 SQUARED
+12215;N # CUNEIFORM SIGN LU2 SHESHIG
+12216;N # CUNEIFORM SIGN LU3
+12217;N # CUNEIFORM SIGN LUGAL
+12218;N # CUNEIFORM SIGN LUGAL OVER LUGAL
+12219;N # CUNEIFORM SIGN LUGAL OPPOSING LUGAL
+1221A;N # CUNEIFORM SIGN LUGAL SHESHIG
+1221B;N # CUNEIFORM SIGN LUH
+1221C;N # CUNEIFORM SIGN LUL
+1221D;N # CUNEIFORM SIGN LUM
+1221E;N # CUNEIFORM SIGN LUM OVER LUM
+1221F;N # CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR
+12220;N # CUNEIFORM SIGN MA
+12221;N # CUNEIFORM SIGN MA TIMES TAK4
+12222;N # CUNEIFORM SIGN MA GUNU
+12223;N # CUNEIFORM SIGN MA2
+12224;N # CUNEIFORM SIGN MAH
+12225;N # CUNEIFORM SIGN MAR
+12226;N # CUNEIFORM SIGN MASH
+12227;N # CUNEIFORM SIGN MASH2
+12228;N # CUNEIFORM SIGN ME
+12229;N # CUNEIFORM SIGN MES
+1222A;N # CUNEIFORM SIGN MI
+1222B;N # CUNEIFORM SIGN MIN
+1222C;N # CUNEIFORM SIGN MU
+1222D;N # CUNEIFORM SIGN MU OVER MU
+1222E;N # CUNEIFORM SIGN MUG
+1222F;N # CUNEIFORM SIGN MUG GUNU
+12230;N # CUNEIFORM SIGN MUNSUB
+12231;N # CUNEIFORM SIGN MURGU2
+12232;N # CUNEIFORM SIGN MUSH
+12233;N # CUNEIFORM SIGN MUSH TIMES A
+12234;N # CUNEIFORM SIGN MUSH TIMES KUR
+12235;N # CUNEIFORM SIGN MUSH TIMES ZA
+12236;N # CUNEIFORM SIGN MUSH OVER MUSH
+12237;N # CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA
+12238;N # CUNEIFORM SIGN MUSH CROSSING MUSH
+12239;N # CUNEIFORM SIGN MUSH3
+1223A;N # CUNEIFORM SIGN MUSH3 TIMES A
+1223B;N # CUNEIFORM SIGN MUSH3 TIMES A PLUS DI
+1223C;N # CUNEIFORM SIGN MUSH3 TIMES DI
+1223D;N # CUNEIFORM SIGN MUSH3 GUNU
+1223E;N # CUNEIFORM SIGN NA
+1223F;N # CUNEIFORM SIGN NA2
+12240;N # CUNEIFORM SIGN NAGA
+12241;N # CUNEIFORM SIGN NAGA INVERTED
+12242;N # CUNEIFORM SIGN NAGA TIMES SHU TENU
+12243;N # CUNEIFORM SIGN NAGA OPPOSING NAGA
+12244;N # CUNEIFORM SIGN NAGAR
+12245;N # CUNEIFORM SIGN NAM NUTILLU
+12246;N # CUNEIFORM SIGN NAM
+12247;N # CUNEIFORM SIGN NAM2
+12248;N # CUNEIFORM SIGN NE
+12249;N # CUNEIFORM SIGN NE TIMES A
+1224A;N # CUNEIFORM SIGN NE TIMES UD
+1224B;N # CUNEIFORM SIGN NE SHESHIG
+1224C;N # CUNEIFORM SIGN NI
+1224D;N # CUNEIFORM SIGN NI TIMES E
+1224E;N # CUNEIFORM SIGN NI2
+1224F;N # CUNEIFORM SIGN NIM
+12250;N # CUNEIFORM SIGN NIM TIMES GAN2 TENU
+12251;N # CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU
+12252;N # CUNEIFORM SIGN NINDA2
+12253;N # CUNEIFORM SIGN NINDA2 TIMES AN
+12254;N # CUNEIFORM SIGN NINDA2 TIMES ASH
+12255;N # CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH
+12256;N # CUNEIFORM SIGN NINDA2 TIMES GUD
+12257;N # CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU
+12258;N # CUNEIFORM SIGN NINDA2 TIMES NE
+12259;N # CUNEIFORM SIGN NINDA2 TIMES NUN
+1225A;N # CUNEIFORM SIGN NINDA2 TIMES SHE
+1225B;N # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN
+1225C;N # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH
+1225D;N # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH
+1225E;N # CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH
+1225F;N # CUNEIFORM SIGN NINDA2 TIMES USH
+12260;N # CUNEIFORM SIGN NISAG
+12261;N # CUNEIFORM SIGN NU
+12262;N # CUNEIFORM SIGN NU11
+12263;N # CUNEIFORM SIGN NUN
+12264;N # CUNEIFORM SIGN NUN LAGAR TIMES GAR
+12265;N # CUNEIFORM SIGN NUN LAGAR TIMES MASH
+12266;N # CUNEIFORM SIGN NUN LAGAR TIMES SAL
+12267;N # CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL
+12268;N # CUNEIFORM SIGN NUN LAGAR TIMES USH
+12269;N # CUNEIFORM SIGN NUN TENU
+1226A;N # CUNEIFORM SIGN NUN OVER NUN
+1226B;N # CUNEIFORM SIGN NUN CROSSING NUN
+1226C;N # CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR
+1226D;N # CUNEIFORM SIGN NUNUZ
+1226E;N # CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB
+1226F;N # CUNEIFORM SIGN NUNUZ AB2 TIMES BI
+12270;N # CUNEIFORM SIGN NUNUZ AB2 TIMES DUG
+12271;N # CUNEIFORM SIGN NUNUZ AB2 TIMES GUD
+12272;N # CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU
+12273;N # CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3
+12274;N # CUNEIFORM SIGN NUNUZ AB2 TIMES LA
+12275;N # CUNEIFORM SIGN NUNUZ AB2 TIMES NE
+12276;N # CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3
+12277;N # CUNEIFORM SIGN NUNUZ AB2 TIMES U2
+12278;N # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI
+12279;N # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U
+1227A;N # CUNEIFORM SIGN PA
+1227B;N # CUNEIFORM SIGN PAD
+1227C;N # CUNEIFORM SIGN PAN
+1227D;N # CUNEIFORM SIGN PAP
+1227E;N # CUNEIFORM SIGN PESH2
+1227F;N # CUNEIFORM SIGN PI
+12280;N # CUNEIFORM SIGN PI TIMES A
+12281;N # CUNEIFORM SIGN PI TIMES AB
+12282;N # CUNEIFORM SIGN PI TIMES BI
+12283;N # CUNEIFORM SIGN PI TIMES BU
+12284;N # CUNEIFORM SIGN PI TIMES E
+12285;N # CUNEIFORM SIGN PI TIMES I
+12286;N # CUNEIFORM SIGN PI TIMES IB
+12287;N # CUNEIFORM SIGN PI TIMES U
+12288;N # CUNEIFORM SIGN PI TIMES U2
+12289;N # CUNEIFORM SIGN PI CROSSING PI
+1228A;N # CUNEIFORM SIGN PIRIG
+1228B;N # CUNEIFORM SIGN PIRIG TIMES KAL
+1228C;N # CUNEIFORM SIGN PIRIG TIMES UD
+1228D;N # CUNEIFORM SIGN PIRIG TIMES ZA
+1228E;N # CUNEIFORM SIGN PIRIG OPPOSING PIRIG
+1228F;N # CUNEIFORM SIGN RA
+12290;N # CUNEIFORM SIGN RAB
+12291;N # CUNEIFORM SIGN RI
+12292;N # CUNEIFORM SIGN RU
+12293;N # CUNEIFORM SIGN SA
+12294;N # CUNEIFORM SIGN SAG NUTILLU
+12295;N # CUNEIFORM SIGN SAG
+12296;N # CUNEIFORM SIGN SAG TIMES A
+12297;N # CUNEIFORM SIGN SAG TIMES DU
+12298;N # CUNEIFORM SIGN SAG TIMES DUB
+12299;N # CUNEIFORM SIGN SAG TIMES HA
+1229A;N # CUNEIFORM SIGN SAG TIMES KAK
+1229B;N # CUNEIFORM SIGN SAG TIMES KUR
+1229C;N # CUNEIFORM SIGN SAG TIMES LUM
+1229D;N # CUNEIFORM SIGN SAG TIMES MI
+1229E;N # CUNEIFORM SIGN SAG TIMES NUN
+1229F;N # CUNEIFORM SIGN SAG TIMES SAL
+122A0;N # CUNEIFORM SIGN SAG TIMES SHID
+122A1;N # CUNEIFORM SIGN SAG TIMES TAB
+122A2;N # CUNEIFORM SIGN SAG TIMES U2
+122A3;N # CUNEIFORM SIGN SAG TIMES UB
+122A4;N # CUNEIFORM SIGN SAG TIMES UM
+122A5;N # CUNEIFORM SIGN SAG TIMES UR
+122A6;N # CUNEIFORM SIGN SAG TIMES USH
+122A7;N # CUNEIFORM SIGN SAG OVER SAG
+122A8;N # CUNEIFORM SIGN SAG GUNU
+122A9;N # CUNEIFORM SIGN SAL
+122AA;N # CUNEIFORM SIGN SAL LAGAB TIMES ASH2
+122AB;N # CUNEIFORM SIGN SANGA2
+122AC;N # CUNEIFORM SIGN SAR
+122AD;N # CUNEIFORM SIGN SHA
+122AE;N # CUNEIFORM SIGN SHA3
+122AF;N # CUNEIFORM SIGN SHA3 TIMES A
+122B0;N # CUNEIFORM SIGN SHA3 TIMES BAD
+122B1;N # CUNEIFORM SIGN SHA3 TIMES GISH
+122B2;N # CUNEIFORM SIGN SHA3 TIMES NE
+122B3;N # CUNEIFORM SIGN SHA3 TIMES SHU2
+122B4;N # CUNEIFORM SIGN SHA3 TIMES TUR
+122B5;N # CUNEIFORM SIGN SHA3 TIMES U
+122B6;N # CUNEIFORM SIGN SHA3 TIMES U PLUS A
+122B7;N # CUNEIFORM SIGN SHA6
+122B8;N # CUNEIFORM SIGN SHAB6
+122B9;N # CUNEIFORM SIGN SHAR2
+122BA;N # CUNEIFORM SIGN SHE
+122BB;N # CUNEIFORM SIGN SHE HU
+122BC;N # CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR
+122BD;N # CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR
+122BE;N # CUNEIFORM SIGN SHEG9
+122BF;N # CUNEIFORM SIGN SHEN
+122C0;N # CUNEIFORM SIGN SHESH
+122C1;N # CUNEIFORM SIGN SHESH2
+122C2;N # CUNEIFORM SIGN SHESHLAM
+122C3;N # CUNEIFORM SIGN SHID
+122C4;N # CUNEIFORM SIGN SHID TIMES A
+122C5;N # CUNEIFORM SIGN SHID TIMES IM
+122C6;N # CUNEIFORM SIGN SHIM
+122C7;N # CUNEIFORM SIGN SHIM TIMES A
+122C8;N # CUNEIFORM SIGN SHIM TIMES BAL
+122C9;N # CUNEIFORM SIGN SHIM TIMES BULUG
+122CA;N # CUNEIFORM SIGN SHIM TIMES DIN
+122CB;N # CUNEIFORM SIGN SHIM TIMES GAR
+122CC;N # CUNEIFORM SIGN SHIM TIMES IGI
+122CD;N # CUNEIFORM SIGN SHIM TIMES IGI GUNU
+122CE;N # CUNEIFORM SIGN SHIM TIMES KUSHU2
+122CF;N # CUNEIFORM SIGN SHIM TIMES LUL
+122D0;N # CUNEIFORM SIGN SHIM TIMES MUG
+122D1;N # CUNEIFORM SIGN SHIM TIMES SAL
+122D2;N # CUNEIFORM SIGN SHINIG
+122D3;N # CUNEIFORM SIGN SHIR
+122D4;N # CUNEIFORM SIGN SHIR TENU
+122D5;N # CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR
+122D6;N # CUNEIFORM SIGN SHITA
+122D7;N # CUNEIFORM SIGN SHU
+122D8;N # CUNEIFORM SIGN SHU OVER INVERTED SHU
+122D9;N # CUNEIFORM SIGN SHU2
+122DA;N # CUNEIFORM SIGN SHUBUR
+122DB;N # CUNEIFORM SIGN SI
+122DC;N # CUNEIFORM SIGN SI GUNU
+122DD;N # CUNEIFORM SIGN SIG
+122DE;N # CUNEIFORM SIGN SIG4
+122DF;N # CUNEIFORM SIGN SIG4 OVER SIG4 SHU2
+122E0;N # CUNEIFORM SIGN SIK2
+122E1;N # CUNEIFORM SIGN SILA3
+122E2;N # CUNEIFORM SIGN SU
+122E3;N # CUNEIFORM SIGN SU OVER SU
+122E4;N # CUNEIFORM SIGN SUD
+122E5;N # CUNEIFORM SIGN SUD2
+122E6;N # CUNEIFORM SIGN SUHUR
+122E7;N # CUNEIFORM SIGN SUM
+122E8;N # CUNEIFORM SIGN SUMASH
+122E9;N # CUNEIFORM SIGN SUR
+122EA;N # CUNEIFORM SIGN SUR9
+122EB;N # CUNEIFORM SIGN TA
+122EC;N # CUNEIFORM SIGN TA ASTERISK
+122ED;N # CUNEIFORM SIGN TA TIMES HI
+122EE;N # CUNEIFORM SIGN TA TIMES MI
+122EF;N # CUNEIFORM SIGN TA GUNU
+122F0;N # CUNEIFORM SIGN TAB
+122F1;N # CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH
+122F2;N # CUNEIFORM SIGN TAB SQUARED
+122F3;N # CUNEIFORM SIGN TAG
+122F4;N # CUNEIFORM SIGN TAG TIMES BI
+122F5;N # CUNEIFORM SIGN TAG TIMES GUD
+122F6;N # CUNEIFORM SIGN TAG TIMES SHE
+122F7;N # CUNEIFORM SIGN TAG TIMES SHU
+122F8;N # CUNEIFORM SIGN TAG TIMES TUG2
+122F9;N # CUNEIFORM SIGN TAG TIMES UD
+122FA;N # CUNEIFORM SIGN TAK4
+122FB;N # CUNEIFORM SIGN TAR
+122FC;N # CUNEIFORM SIGN TE
+122FD;N # CUNEIFORM SIGN TE GUNU
+122FE;N # CUNEIFORM SIGN TI
+122FF;N # CUNEIFORM SIGN TI TENU
+12300;N # CUNEIFORM SIGN TIL
+12301;N # CUNEIFORM SIGN TIR
+12302;N # CUNEIFORM SIGN TIR TIMES TAK4
+12303;N # CUNEIFORM SIGN TIR OVER TIR
+12304;N # CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR
+12305;N # CUNEIFORM SIGN TU
+12306;N # CUNEIFORM SIGN TUG2
+12307;N # CUNEIFORM SIGN TUK
+12308;N # CUNEIFORM SIGN TUM
+12309;N # CUNEIFORM SIGN TUR
+1230A;N # CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA
+1230B;N # CUNEIFORM SIGN U
+1230C;N # CUNEIFORM SIGN U GUD
+1230D;N # CUNEIFORM SIGN U U U
+1230E;N # CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR
+1230F;N # CUNEIFORM SIGN U OVER U SUR OVER SUR
+12310;N # CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED
+12311;N # CUNEIFORM SIGN U2
+12312;N # CUNEIFORM SIGN UB
+12313;N # CUNEIFORM SIGN UD
+12314;N # CUNEIFORM SIGN UD KUSHU2
+12315;N # CUNEIFORM SIGN UD TIMES BAD
+12316;N # CUNEIFORM SIGN UD TIMES MI
+12317;N # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U
+12318;N # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU
+12319;N # CUNEIFORM SIGN UD GUNU
+1231A;N # CUNEIFORM SIGN UD SHESHIG
+1231B;N # CUNEIFORM SIGN UD SHESHIG TIMES BAD
+1231C;N # CUNEIFORM SIGN UDUG
+1231D;N # CUNEIFORM SIGN UM
+1231E;N # CUNEIFORM SIGN UM TIMES LAGAB
+1231F;N # CUNEIFORM SIGN UM TIMES ME PLUS DA
+12320;N # CUNEIFORM SIGN UM TIMES SHA3
+12321;N # CUNEIFORM SIGN UM TIMES U
+12322;N # CUNEIFORM SIGN UMBIN
+12323;N # CUNEIFORM SIGN UMUM
+12324;N # CUNEIFORM SIGN UMUM TIMES KASKAL
+12325;N # CUNEIFORM SIGN UMUM TIMES PA
+12326;N # CUNEIFORM SIGN UN
+12327;N # CUNEIFORM SIGN UN GUNU
+12328;N # CUNEIFORM SIGN UR
+12329;N # CUNEIFORM SIGN UR CROSSING UR
+1232A;N # CUNEIFORM SIGN UR SHESHIG
+1232B;N # CUNEIFORM SIGN UR2
+1232C;N # CUNEIFORM SIGN UR2 TIMES A PLUS HA
+1232D;N # CUNEIFORM SIGN UR2 TIMES A PLUS NA
+1232E;N # CUNEIFORM SIGN UR2 TIMES AL
+1232F;N # CUNEIFORM SIGN UR2 TIMES HA
+12330;N # CUNEIFORM SIGN UR2 TIMES NUN
+12331;N # CUNEIFORM SIGN UR2 TIMES U2
+12332;N # CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH
+12333;N # CUNEIFORM SIGN UR2 TIMES U2 PLUS BI
+12334;N # CUNEIFORM SIGN UR4
+12335;N # CUNEIFORM SIGN URI
+12336;N # CUNEIFORM SIGN URI3
+12337;N # CUNEIFORM SIGN URU
+12338;N # CUNEIFORM SIGN URU TIMES A
+12339;N # CUNEIFORM SIGN URU TIMES ASHGAB
+1233A;N # CUNEIFORM SIGN URU TIMES BAR
+1233B;N # CUNEIFORM SIGN URU TIMES DUN
+1233C;N # CUNEIFORM SIGN URU TIMES GA
+1233D;N # CUNEIFORM SIGN URU TIMES GAL
+1233E;N # CUNEIFORM SIGN URU TIMES GAN2 TENU
+1233F;N # CUNEIFORM SIGN URU TIMES GAR
+12340;N # CUNEIFORM SIGN URU TIMES GU
+12341;N # CUNEIFORM SIGN URU TIMES HA
+12342;N # CUNEIFORM SIGN URU TIMES IGI
+12343;N # CUNEIFORM SIGN URU TIMES IM
+12344;N # CUNEIFORM SIGN URU TIMES ISH
+12345;N # CUNEIFORM SIGN URU TIMES KI
+12346;N # CUNEIFORM SIGN URU TIMES LUM
+12347;N # CUNEIFORM SIGN URU TIMES MIN
+12348;N # CUNEIFORM SIGN URU TIMES PA
+12349;N # CUNEIFORM SIGN URU TIMES SHE
+1234A;N # CUNEIFORM SIGN URU TIMES SIG4
+1234B;N # CUNEIFORM SIGN URU TIMES TU
+1234C;N # CUNEIFORM SIGN URU TIMES U PLUS GUD
+1234D;N # CUNEIFORM SIGN URU TIMES UD
+1234E;N # CUNEIFORM SIGN URU TIMES URUDA
+1234F;N # CUNEIFORM SIGN URUDA
+12350;N # CUNEIFORM SIGN URUDA TIMES U
+12351;N # CUNEIFORM SIGN USH
+12352;N # CUNEIFORM SIGN USH TIMES A
+12353;N # CUNEIFORM SIGN USH TIMES KU
+12354;N # CUNEIFORM SIGN USH TIMES KUR
+12355;N # CUNEIFORM SIGN USH TIMES TAK4
+12356;N # CUNEIFORM SIGN USHX
+12357;N # CUNEIFORM SIGN USH2
+12358;N # CUNEIFORM SIGN USHUMX
+12359;N # CUNEIFORM SIGN UTUKI
+1235A;N # CUNEIFORM SIGN UZ3
+1235B;N # CUNEIFORM SIGN UZ3 TIMES KASKAL
+1235C;N # CUNEIFORM SIGN UZU
+1235D;N # CUNEIFORM SIGN ZA
+1235E;N # CUNEIFORM SIGN ZA TENU
+1235F;N # CUNEIFORM SIGN ZA SQUARED TIMES KUR
+12360;N # CUNEIFORM SIGN ZAG
+12361;N # CUNEIFORM SIGN ZAMX
+12362;N # CUNEIFORM SIGN ZE2
+12363;N # CUNEIFORM SIGN ZI
+12364;N # CUNEIFORM SIGN ZI OVER ZI
+12365;N # CUNEIFORM SIGN ZI3
+12366;N # CUNEIFORM SIGN ZIB
+12367;N # CUNEIFORM SIGN ZIB KABA TENU
+12368;N # CUNEIFORM SIGN ZIG
+12369;N # CUNEIFORM SIGN ZIZ2
+1236A;N # CUNEIFORM SIGN ZU
+1236B;N # CUNEIFORM SIGN ZU5
+1236C;N # CUNEIFORM SIGN ZU5 TIMES A
+1236D;N # CUNEIFORM SIGN ZUBUR
+1236E;N # CUNEIFORM SIGN ZUM
+12400;N # CUNEIFORM NUMERIC SIGN TWO ASH
+12401;N # CUNEIFORM NUMERIC SIGN THREE ASH
+12402;N # CUNEIFORM NUMERIC SIGN FOUR ASH
+12403;N # CUNEIFORM NUMERIC SIGN FIVE ASH
+12404;N # CUNEIFORM NUMERIC SIGN SIX ASH
+12405;N # CUNEIFORM NUMERIC SIGN SEVEN ASH
+12406;N # CUNEIFORM NUMERIC SIGN EIGHT ASH
+12407;N # CUNEIFORM NUMERIC SIGN NINE ASH
+12408;N # CUNEIFORM NUMERIC SIGN THREE DISH
+12409;N # CUNEIFORM NUMERIC SIGN FOUR DISH
+1240A;N # CUNEIFORM NUMERIC SIGN FIVE DISH
+1240B;N # CUNEIFORM NUMERIC SIGN SIX DISH
+1240C;N # CUNEIFORM NUMERIC SIGN SEVEN DISH
+1240D;N # CUNEIFORM NUMERIC SIGN EIGHT DISH
+1240E;N # CUNEIFORM NUMERIC SIGN NINE DISH
+1240F;N # CUNEIFORM NUMERIC SIGN FOUR U
+12410;N # CUNEIFORM NUMERIC SIGN FIVE U
+12411;N # CUNEIFORM NUMERIC SIGN SIX U
+12412;N # CUNEIFORM NUMERIC SIGN SEVEN U
+12413;N # CUNEIFORM NUMERIC SIGN EIGHT U
+12414;N # CUNEIFORM NUMERIC SIGN NINE U
+12415;N # CUNEIFORM NUMERIC SIGN ONE GESH2
+12416;N # CUNEIFORM NUMERIC SIGN TWO GESH2
+12417;N # CUNEIFORM NUMERIC SIGN THREE GESH2
+12418;N # CUNEIFORM NUMERIC SIGN FOUR GESH2
+12419;N # CUNEIFORM NUMERIC SIGN FIVE GESH2
+1241A;N # CUNEIFORM NUMERIC SIGN SIX GESH2
+1241B;N # CUNEIFORM NUMERIC SIGN SEVEN GESH2
+1241C;N # CUNEIFORM NUMERIC SIGN EIGHT GESH2
+1241D;N # CUNEIFORM NUMERIC SIGN NINE GESH2
+1241E;N # CUNEIFORM NUMERIC SIGN ONE GESHU
+1241F;N # CUNEIFORM NUMERIC SIGN TWO GESHU
+12420;N # CUNEIFORM NUMERIC SIGN THREE GESHU
+12421;N # CUNEIFORM NUMERIC SIGN FOUR GESHU
+12422;N # CUNEIFORM NUMERIC SIGN FIVE GESHU
+12423;N # CUNEIFORM NUMERIC SIGN TWO SHAR2
+12424;N # CUNEIFORM NUMERIC SIGN THREE SHAR2
+12425;N # CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM
+12426;N # CUNEIFORM NUMERIC SIGN FOUR SHAR2
+12427;N # CUNEIFORM NUMERIC SIGN FIVE SHAR2
+12428;N # CUNEIFORM NUMERIC SIGN SIX SHAR2
+12429;N # CUNEIFORM NUMERIC SIGN SEVEN SHAR2
+1242A;N # CUNEIFORM NUMERIC SIGN EIGHT SHAR2
+1242B;N # CUNEIFORM NUMERIC SIGN NINE SHAR2
+1242C;N # CUNEIFORM NUMERIC SIGN ONE SHARU
+1242D;N # CUNEIFORM NUMERIC SIGN TWO SHARU
+1242E;N # CUNEIFORM NUMERIC SIGN THREE SHARU
+1242F;N # CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM
+12430;N # CUNEIFORM NUMERIC SIGN FOUR SHARU
+12431;N # CUNEIFORM NUMERIC SIGN FIVE SHARU
+12432;N # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH
+12433;N # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN
+12434;N # CUNEIFORM NUMERIC SIGN ONE BURU
+12435;N # CUNEIFORM NUMERIC SIGN TWO BURU
+12436;N # CUNEIFORM NUMERIC SIGN THREE BURU
+12437;N # CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM
+12438;N # CUNEIFORM NUMERIC SIGN FOUR BURU
+12439;N # CUNEIFORM NUMERIC SIGN FIVE BURU
+1243A;N # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16
+1243B;N # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21
+1243C;N # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU
+1243D;N # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4
+1243E;N # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A
+1243F;N # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B
+12440;N # CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9
+12441;N # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3
+12442;N # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A
+12443;N # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B
+12444;N # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU
+12445;N # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3
+12446;N # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU
+12447;N # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3
+12448;N # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4
+12449;N # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A
+1244A;N # CUNEIFORM NUMERIC SIGN TWO ASH TENU
+1244B;N # CUNEIFORM NUMERIC SIGN THREE ASH TENU
+1244C;N # CUNEIFORM NUMERIC SIGN FOUR ASH TENU
+1244D;N # CUNEIFORM NUMERIC SIGN FIVE ASH TENU
+1244E;N # CUNEIFORM NUMERIC SIGN SIX ASH TENU
+1244F;N # CUNEIFORM NUMERIC SIGN ONE BAN2
+12450;N # CUNEIFORM NUMERIC SIGN TWO BAN2
+12451;N # CUNEIFORM NUMERIC SIGN THREE BAN2
+12452;N # CUNEIFORM NUMERIC SIGN FOUR BAN2
+12453;N # CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM
+12454;N # CUNEIFORM NUMERIC SIGN FIVE BAN2
+12455;N # CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM
+12456;N # CUNEIFORM NUMERIC SIGN NIGIDAMIN
+12457;N # CUNEIFORM NUMERIC SIGN NIGIDAESH
+12458;N # CUNEIFORM NUMERIC SIGN ONE ESHE3
+12459;N # CUNEIFORM NUMERIC SIGN TWO ESHE3
+1245A;N # CUNEIFORM NUMERIC SIGN ONE THIRD DISH
+1245B;N # CUNEIFORM NUMERIC SIGN TWO THIRDS DISH
+1245C;N # CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH
+1245D;N # CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A
+1245E;N # CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A
+1245F;N # CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH
+12460;N # CUNEIFORM NUMERIC SIGN ONE QUARTER ASH
+12461;N # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH
+12462;N # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+12470;N # CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER
+12471;N # CUNEIFORM PUNCTUATION SIGN VERTICAL COLON
+12472;N # CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON
+12473;N # CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+1D000;N # BYZANTINE MUSICAL SYMBOL PSILI
+1D001;N # BYZANTINE MUSICAL SYMBOL DASEIA
+1D002;N # BYZANTINE MUSICAL SYMBOL PERISPOMENI
+1D003;N # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON
+1D004;N # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI
+1D005;N # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON
+1D006;N # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI
+1D007;N # BYZANTINE MUSICAL SYMBOL KATHISTI
+1D008;N # BYZANTINE MUSICAL SYMBOL SYRMATIKI
+1D009;N # BYZANTINE MUSICAL SYMBOL PARAKLITIKI
+1D00A;N # BYZANTINE MUSICAL SYMBOL YPOKRISIS
+1D00B;N # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI
+1D00C;N # BYZANTINE MUSICAL SYMBOL KREMASTI
+1D00D;N # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON
+1D00E;N # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON
+1D00F;N # BYZANTINE MUSICAL SYMBOL TELEIA
+1D010;N # BYZANTINE MUSICAL SYMBOL KENTIMATA
+1D011;N # BYZANTINE MUSICAL SYMBOL APOSTROFOS
+1D012;N # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI
+1D013;N # BYZANTINE MUSICAL SYMBOL SYNEVMA
+1D014;N # BYZANTINE MUSICAL SYMBOL THITA
+1D015;N # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION
+1D016;N # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION
+1D017;N # BYZANTINE MUSICAL SYMBOL PSILON
+1D018;N # BYZANTINE MUSICAL SYMBOL CHAMILON
+1D019;N # BYZANTINE MUSICAL SYMBOL VATHY
+1D01A;N # BYZANTINE MUSICAL SYMBOL ISON ARCHAION
+1D01B;N # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION
+1D01C;N # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION
+1D01D;N # BYZANTINE MUSICAL SYMBOL SAXIMATA
+1D01E;N # BYZANTINE MUSICAL SYMBOL PARICHON
+1D01F;N # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA
+1D020;N # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION
+1D021;N # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION
+1D022;N # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION
+1D023;N # BYZANTINE MUSICAL SYMBOL APOTHEMA
+1D024;N # BYZANTINE MUSICAL SYMBOL KLASMA
+1D025;N # BYZANTINE MUSICAL SYMBOL REVMA
+1D026;N # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION
+1D027;N # BYZANTINE MUSICAL SYMBOL TINAGMA
+1D028;N # BYZANTINE MUSICAL SYMBOL ANATRICHISMA
+1D029;N # BYZANTINE MUSICAL SYMBOL SEISMA
+1D02A;N # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION
+1D02B;N # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU
+1D02C;N # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION
+1D02D;N # BYZANTINE MUSICAL SYMBOL THEMA
+1D02E;N # BYZANTINE MUSICAL SYMBOL LEMOI
+1D02F;N # BYZANTINE MUSICAL SYMBOL DYO
+1D030;N # BYZANTINE MUSICAL SYMBOL TRIA
+1D031;N # BYZANTINE MUSICAL SYMBOL TESSERA
+1D032;N # BYZANTINE MUSICAL SYMBOL KRATIMATA
+1D033;N # BYZANTINE MUSICAL SYMBOL APESO EXO NEO
+1D034;N # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION
+1D035;N # BYZANTINE MUSICAL SYMBOL IMIFTHORA
+1D036;N # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION
+1D037;N # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON
+1D038;N # BYZANTINE MUSICAL SYMBOL PELASTON
+1D039;N # BYZANTINE MUSICAL SYMBOL PSIFISTON
+1D03A;N # BYZANTINE MUSICAL SYMBOL KONTEVMA
+1D03B;N # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION
+1D03C;N # BYZANTINE MUSICAL SYMBOL RAPISMA
+1D03D;N # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION
+1D03E;N # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION
+1D03F;N # BYZANTINE MUSICAL SYMBOL ICHADIN
+1D040;N # BYZANTINE MUSICAL SYMBOL NANA
+1D041;N # BYZANTINE MUSICAL SYMBOL PETASMA
+1D042;N # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO
+1D043;N # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO
+1D044;N # BYZANTINE MUSICAL SYMBOL STRAGGISMATA
+1D045;N # BYZANTINE MUSICAL SYMBOL GRONTHISMATA
+1D046;N # BYZANTINE MUSICAL SYMBOL ISON NEO
+1D047;N # BYZANTINE MUSICAL SYMBOL OLIGON NEO
+1D048;N # BYZANTINE MUSICAL SYMBOL OXEIA NEO
+1D049;N # BYZANTINE MUSICAL SYMBOL PETASTI
+1D04A;N # BYZANTINE MUSICAL SYMBOL KOUFISMA
+1D04B;N # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA
+1D04C;N # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA
+1D04D;N # BYZANTINE MUSICAL SYMBOL PELASTON NEO
+1D04E;N # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO
+1D04F;N # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO
+1D050;N # BYZANTINE MUSICAL SYMBOL YPSILI
+1D051;N # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO
+1D052;N # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO
+1D053;N # BYZANTINE MUSICAL SYMBOL YPORROI
+1D054;N # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON
+1D055;N # BYZANTINE MUSICAL SYMBOL ELAFRON
+1D056;N # BYZANTINE MUSICAL SYMBOL CHAMILI
+1D057;N # BYZANTINE MUSICAL SYMBOL MIKRON ISON
+1D058;N # BYZANTINE MUSICAL SYMBOL VAREIA NEO
+1D059;N # BYZANTINE MUSICAL SYMBOL PIASMA NEO
+1D05A;N # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO
+1D05B;N # BYZANTINE MUSICAL SYMBOL OMALON
+1D05C;N # BYZANTINE MUSICAL SYMBOL ANTIKENOMA
+1D05D;N # BYZANTINE MUSICAL SYMBOL LYGISMA
+1D05E;N # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO
+1D05F;N # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO
+1D060;N # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA
+1D061;N # BYZANTINE MUSICAL SYMBOL KYLISMA
+1D062;N # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA
+1D063;N # BYZANTINE MUSICAL SYMBOL TROMIKON NEO
+1D064;N # BYZANTINE MUSICAL SYMBOL EKSTREPTON
+1D065;N # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO
+1D066;N # BYZANTINE MUSICAL SYMBOL SYRMA
+1D067;N # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO
+1D068;N # BYZANTINE MUSICAL SYMBOL EPEGERMA
+1D069;N # BYZANTINE MUSICAL SYMBOL SEISMA NEO
+1D06A;N # BYZANTINE MUSICAL SYMBOL XIRON KLASMA
+1D06B;N # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON
+1D06C;N # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA
+1D06D;N # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA
+1D06E;N # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA
+1D06F;N # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA
+1D070;N # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA
+1D071;N # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA
+1D072;N # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON
+1D073;N # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON
+1D074;N # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON
+1D075;N # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO
+1D076;N # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO
+1D077;N # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO
+1D078;N # BYZANTINE MUSICAL SYMBOL THEMA APLOUN
+1D079;N # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES
+1D07A;N # BYZANTINE MUSICAL SYMBOL KATAVASMA
+1D07B;N # BYZANTINE MUSICAL SYMBOL ENDOFONON
+1D07C;N # BYZANTINE MUSICAL SYMBOL YFEN KATO
+1D07D;N # BYZANTINE MUSICAL SYMBOL YFEN ANO
+1D07E;N # BYZANTINE MUSICAL SYMBOL STAVROS
+1D07F;N # BYZANTINE MUSICAL SYMBOL KLASMA ANO
+1D080;N # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION
+1D081;N # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION
+1D082;N # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO
+1D083;N # BYZANTINE MUSICAL SYMBOL KRATIMA NEO
+1D084;N # BYZANTINE MUSICAL SYMBOL APODERMA NEO
+1D085;N # BYZANTINE MUSICAL SYMBOL APLI
+1D086;N # BYZANTINE MUSICAL SYMBOL DIPLI
+1D087;N # BYZANTINE MUSICAL SYMBOL TRIPLI
+1D088;N # BYZANTINE MUSICAL SYMBOL TETRAPLI
+1D089;N # BYZANTINE MUSICAL SYMBOL KORONIS
+1D08A;N # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU
+1D08B;N # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON
+1D08C;N # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON
+1D08D;N # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON
+1D08E;N # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU
+1D08F;N # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO
+1D090;N # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA
+1D091;N # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA
+1D092;N # BYZANTINE MUSICAL SYMBOL DIGORGON
+1D093;N # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO
+1D094;N # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO
+1D095;N # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA
+1D096;N # BYZANTINE MUSICAL SYMBOL TRIGORGON
+1D097;N # BYZANTINE MUSICAL SYMBOL ARGON
+1D098;N # BYZANTINE MUSICAL SYMBOL IMIDIARGON
+1D099;N # BYZANTINE MUSICAL SYMBOL DIARGON
+1D09A;N # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI
+1D09B;N # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI
+1D09C;N # BYZANTINE MUSICAL SYMBOL AGOGI ARGI
+1D09D;N # BYZANTINE MUSICAL SYMBOL AGOGI METRIA
+1D09E;N # BYZANTINE MUSICAL SYMBOL AGOGI MESI
+1D09F;N # BYZANTINE MUSICAL SYMBOL AGOGI GORGI
+1D0A0;N # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI
+1D0A1;N # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI
+1D0A2;N # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS
+1D0A3;N # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS
+1D0A4;N # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS
+1D0A5;N # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS
+1D0A6;N # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS
+1D0A7;N # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS
+1D0A8;N # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS
+1D0A9;N # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA;N # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS
+1D0AB;N # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS
+1D0AC;N # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS
+1D0AD;N # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS
+1D0AE;N # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS
+1D0AF;N # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS
+1D0B0;N # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS
+1D0B1;N # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS
+1D0B2;N # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS
+1D0B3;N # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4;N # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN
+1D0B5;N # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN
+1D0B6;N # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU
+1D0B7;N # BYZANTINE MUSICAL SYMBOL IMIFONON
+1D0B8;N # BYZANTINE MUSICAL SYMBOL IMIFTHORON
+1D0B9;N # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU
+1D0BA;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA
+1D0BB;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA
+1D0BC;N # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS
+1D0BD;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI
+1D0BE;N # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI
+1D0BF;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE
+1D0C0;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO
+1D0C1;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO
+1D0C2;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO
+1D0C3;N # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
+1D0C4;N # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
+1D0C5;N # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+1D0C6;N # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
+1D0C7;N # BYZANTINE MUSICAL SYMBOL FTHORA NENANO
+1D0C8;N # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
+1D0C9;N # BYZANTINE MUSICAL SYMBOL CHROA KLITON
+1D0CA;N # BYZANTINE MUSICAL SYMBOL CHROA SPATHI
+1D0CB;N # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION
+1D0CC;N # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA
+1D0CD;N # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION
+1D0CE;N # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION
+1D0CF;N # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION
+1D0D0;N # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA
+1D0D1;N # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2;N # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA
+1D0D3;N # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4;N # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA
+1D0D5;N # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6;N # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA
+1D0D7;N # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8;N # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS
+1D0D9;N # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS
+1D0DA;N # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI
+1D0DB;N # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI
+1D0DC;N # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI
+1D0DD;N # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS
+1D0DE;N # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS
+1D0DF;N # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU
+1D0E0;N # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU
+1D0E1;N # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU
+1D0E2;N # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS
+1D0E3;N # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU
+1D0E4;N # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU
+1D0E5;N # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU
+1D0E6;N # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG
+1D0E7;N # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU
+1D0E8;N # BYZANTINE MUSICAL SYMBOL STIGMA
+1D0E9;N # BYZANTINE MUSICAL SYMBOL ARKTIKO PA
+1D0EA;N # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU
+1D0EB;N # BYZANTINE MUSICAL SYMBOL ARKTIKO GA
+1D0EC;N # BYZANTINE MUSICAL SYMBOL ARKTIKO DI
+1D0ED;N # BYZANTINE MUSICAL SYMBOL ARKTIKO KE
+1D0EE;N # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO
+1D0EF;N # BYZANTINE MUSICAL SYMBOL ARKTIKO NI
+1D0F0;N # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO
+1D0F1;N # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO
+1D0F2;N # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO
+1D0F3;N # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO
+1D0F4;N # BYZANTINE MUSICAL SYMBOL KLASMA KATO
+1D0F5;N # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100;N # MUSICAL SYMBOL SINGLE BARLINE
+1D101;N # MUSICAL SYMBOL DOUBLE BARLINE
+1D102;N # MUSICAL SYMBOL FINAL BARLINE
+1D103;N # MUSICAL SYMBOL REVERSE FINAL BARLINE
+1D104;N # MUSICAL SYMBOL DASHED BARLINE
+1D105;N # MUSICAL SYMBOL SHORT BARLINE
+1D106;N # MUSICAL SYMBOL LEFT REPEAT SIGN
+1D107;N # MUSICAL SYMBOL RIGHT REPEAT SIGN
+1D108;N # MUSICAL SYMBOL REPEAT DOTS
+1D109;N # MUSICAL SYMBOL DAL SEGNO
+1D10A;N # MUSICAL SYMBOL DA CAPO
+1D10B;N # MUSICAL SYMBOL SEGNO
+1D10C;N # MUSICAL SYMBOL CODA
+1D10D;N # MUSICAL SYMBOL REPEATED FIGURE-1
+1D10E;N # MUSICAL SYMBOL REPEATED FIGURE-2
+1D10F;N # MUSICAL SYMBOL REPEATED FIGURE-3
+1D110;N # MUSICAL SYMBOL FERMATA
+1D111;N # MUSICAL SYMBOL FERMATA BELOW
+1D112;N # MUSICAL SYMBOL BREATH MARK
+1D113;N # MUSICAL SYMBOL CAESURA
+1D114;N # MUSICAL SYMBOL BRACE
+1D115;N # MUSICAL SYMBOL BRACKET
+1D116;N # MUSICAL SYMBOL ONE-LINE STAFF
+1D117;N # MUSICAL SYMBOL TWO-LINE STAFF
+1D118;N # MUSICAL SYMBOL THREE-LINE STAFF
+1D119;N # MUSICAL SYMBOL FOUR-LINE STAFF
+1D11A;N # MUSICAL SYMBOL FIVE-LINE STAFF
+1D11B;N # MUSICAL SYMBOL SIX-LINE STAFF
+1D11C;N # MUSICAL SYMBOL SIX-STRING FRETBOARD
+1D11D;N # MUSICAL SYMBOL FOUR-STRING FRETBOARD
+1D11E;N # MUSICAL SYMBOL G CLEF
+1D11F;N # MUSICAL SYMBOL G CLEF OTTAVA ALTA
+1D120;N # MUSICAL SYMBOL G CLEF OTTAVA BASSA
+1D121;N # MUSICAL SYMBOL C CLEF
+1D122;N # MUSICAL SYMBOL F CLEF
+1D123;N # MUSICAL SYMBOL F CLEF OTTAVA ALTA
+1D124;N # MUSICAL SYMBOL F CLEF OTTAVA BASSA
+1D125;N # MUSICAL SYMBOL DRUM CLEF-1
+1D126;N # MUSICAL SYMBOL DRUM CLEF-2
+1D129;N # MUSICAL SYMBOL MULTIPLE MEASURE REST
+1D12A;N # MUSICAL SYMBOL DOUBLE SHARP
+1D12B;N # MUSICAL SYMBOL DOUBLE FLAT
+1D12C;N # MUSICAL SYMBOL FLAT UP
+1D12D;N # MUSICAL SYMBOL FLAT DOWN
+1D12E;N # MUSICAL SYMBOL NATURAL UP
+1D12F;N # MUSICAL SYMBOL NATURAL DOWN
+1D130;N # MUSICAL SYMBOL SHARP UP
+1D131;N # MUSICAL SYMBOL SHARP DOWN
+1D132;N # MUSICAL SYMBOL QUARTER TONE SHARP
+1D133;N # MUSICAL SYMBOL QUARTER TONE FLAT
+1D134;N # MUSICAL SYMBOL COMMON TIME
+1D135;N # MUSICAL SYMBOL CUT TIME
+1D136;N # MUSICAL SYMBOL OTTAVA ALTA
+1D137;N # MUSICAL SYMBOL OTTAVA BASSA
+1D138;N # MUSICAL SYMBOL QUINDICESIMA ALTA
+1D139;N # MUSICAL SYMBOL QUINDICESIMA BASSA
+1D13A;N # MUSICAL SYMBOL MULTI REST
+1D13B;N # MUSICAL SYMBOL WHOLE REST
+1D13C;N # MUSICAL SYMBOL HALF REST
+1D13D;N # MUSICAL SYMBOL QUARTER REST
+1D13E;N # MUSICAL SYMBOL EIGHTH REST
+1D13F;N # MUSICAL SYMBOL SIXTEENTH REST
+1D140;N # MUSICAL SYMBOL THIRTY-SECOND REST
+1D141;N # MUSICAL SYMBOL SIXTY-FOURTH REST
+1D142;N # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST
+1D143;N # MUSICAL SYMBOL X NOTEHEAD
+1D144;N # MUSICAL SYMBOL PLUS NOTEHEAD
+1D145;N # MUSICAL SYMBOL CIRCLE X NOTEHEAD
+1D146;N # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE
+1D147;N # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK
+1D148;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE
+1D149;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK
+1D14A;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE
+1D14B;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK
+1D14C;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE
+1D14D;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK
+1D14E;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE
+1D14F;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK
+1D150;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE
+1D151;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK
+1D152;N # MUSICAL SYMBOL MOON NOTEHEAD WHITE
+1D153;N # MUSICAL SYMBOL MOON NOTEHEAD BLACK
+1D154;N # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE
+1D155;N # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK
+1D156;N # MUSICAL SYMBOL PARENTHESIS NOTEHEAD
+1D157;N # MUSICAL SYMBOL VOID NOTEHEAD
+1D158;N # MUSICAL SYMBOL NOTEHEAD BLACK
+1D159;N # MUSICAL SYMBOL NULL NOTEHEAD
+1D15A;N # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE
+1D15B;N # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK
+1D15C;N # MUSICAL SYMBOL BREVE
+1D15D;N # MUSICAL SYMBOL WHOLE NOTE
+1D15E;N # MUSICAL SYMBOL HALF NOTE
+1D15F;N # MUSICAL SYMBOL QUARTER NOTE
+1D160;N # MUSICAL SYMBOL EIGHTH NOTE
+1D161;N # MUSICAL SYMBOL SIXTEENTH NOTE
+1D162;N # MUSICAL SYMBOL THIRTY-SECOND NOTE
+1D163;N # MUSICAL SYMBOL SIXTY-FOURTH NOTE
+1D164;N # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D165;N # MUSICAL SYMBOL COMBINING STEM
+1D166;N # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167;N # MUSICAL SYMBOL COMBINING TREMOLO-1
+1D168;N # MUSICAL SYMBOL COMBINING TREMOLO-2
+1D169;N # MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A;N # MUSICAL SYMBOL FINGERED TREMOLO-1
+1D16B;N # MUSICAL SYMBOL FINGERED TREMOLO-2
+1D16C;N # MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D;N # MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+1D16E;N # MUSICAL SYMBOL COMBINING FLAG-1
+1D16F;N # MUSICAL SYMBOL COMBINING FLAG-2
+1D170;N # MUSICAL SYMBOL COMBINING FLAG-3
+1D171;N # MUSICAL SYMBOL COMBINING FLAG-4
+1D172;N # MUSICAL SYMBOL COMBINING FLAG-5
+1D173;N # MUSICAL SYMBOL BEGIN BEAM
+1D174;N # MUSICAL SYMBOL END BEAM
+1D175;N # MUSICAL SYMBOL BEGIN TIE
+1D176;N # MUSICAL SYMBOL END TIE
+1D177;N # MUSICAL SYMBOL BEGIN SLUR
+1D178;N # MUSICAL SYMBOL END SLUR
+1D179;N # MUSICAL SYMBOL BEGIN PHRASE
+1D17A;N # MUSICAL SYMBOL END PHRASE
+1D17B;N # MUSICAL SYMBOL COMBINING ACCENT
+1D17C;N # MUSICAL SYMBOL COMBINING STACCATO
+1D17D;N # MUSICAL SYMBOL COMBINING TENUTO
+1D17E;N # MUSICAL SYMBOL COMBINING STACCATISSIMO
+1D17F;N # MUSICAL SYMBOL COMBINING MARCATO
+1D180;N # MUSICAL SYMBOL COMBINING MARCATO-STACCATO
+1D181;N # MUSICAL SYMBOL COMBINING ACCENT-STACCATO
+1D182;N # MUSICAL SYMBOL COMBINING LOURE
+1D183;N # MUSICAL SYMBOL ARPEGGIATO UP
+1D184;N # MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185;N # MUSICAL SYMBOL COMBINING DOIT
+1D186;N # MUSICAL SYMBOL COMBINING RIP
+1D187;N # MUSICAL SYMBOL COMBINING FLIP
+1D188;N # MUSICAL SYMBOL COMBINING SMEAR
+1D189;N # MUSICAL SYMBOL COMBINING BEND
+1D18A;N # MUSICAL SYMBOL COMBINING DOUBLE TONGUE
+1D18B;N # MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C;N # MUSICAL SYMBOL RINFORZANDO
+1D18D;N # MUSICAL SYMBOL SUBITO
+1D18E;N # MUSICAL SYMBOL Z
+1D18F;N # MUSICAL SYMBOL PIANO
+1D190;N # MUSICAL SYMBOL MEZZO
+1D191;N # MUSICAL SYMBOL FORTE
+1D192;N # MUSICAL SYMBOL CRESCENDO
+1D193;N # MUSICAL SYMBOL DECRESCENDO
+1D194;N # MUSICAL SYMBOL GRACE NOTE SLASH
+1D195;N # MUSICAL SYMBOL GRACE NOTE NO SLASH
+1D196;N # MUSICAL SYMBOL TR
+1D197;N # MUSICAL SYMBOL TURN
+1D198;N # MUSICAL SYMBOL INVERTED TURN
+1D199;N # MUSICAL SYMBOL TURN SLASH
+1D19A;N # MUSICAL SYMBOL TURN UP
+1D19B;N # MUSICAL SYMBOL ORNAMENT STROKE-1
+1D19C;N # MUSICAL SYMBOL ORNAMENT STROKE-2
+1D19D;N # MUSICAL SYMBOL ORNAMENT STROKE-3
+1D19E;N # MUSICAL SYMBOL ORNAMENT STROKE-4
+1D19F;N # MUSICAL SYMBOL ORNAMENT STROKE-5
+1D1A0;N # MUSICAL SYMBOL ORNAMENT STROKE-6
+1D1A1;N # MUSICAL SYMBOL ORNAMENT STROKE-7
+1D1A2;N # MUSICAL SYMBOL ORNAMENT STROKE-8
+1D1A3;N # MUSICAL SYMBOL ORNAMENT STROKE-9
+1D1A4;N # MUSICAL SYMBOL ORNAMENT STROKE-10
+1D1A5;N # MUSICAL SYMBOL ORNAMENT STROKE-11
+1D1A6;N # MUSICAL SYMBOL HAUPTSTIMME
+1D1A7;N # MUSICAL SYMBOL NEBENSTIMME
+1D1A8;N # MUSICAL SYMBOL END OF STIMME
+1D1A9;N # MUSICAL SYMBOL DEGREE SLASH
+1D1AA;N # MUSICAL SYMBOL COMBINING DOWN BOW
+1D1AB;N # MUSICAL SYMBOL COMBINING UP BOW
+1D1AC;N # MUSICAL SYMBOL COMBINING HARMONIC
+1D1AD;N # MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D1AE;N # MUSICAL SYMBOL PEDAL MARK
+1D1AF;N # MUSICAL SYMBOL PEDAL UP MARK
+1D1B0;N # MUSICAL SYMBOL HALF PEDAL MARK
+1D1B1;N # MUSICAL SYMBOL GLISSANDO UP
+1D1B2;N # MUSICAL SYMBOL GLISSANDO DOWN
+1D1B3;N # MUSICAL SYMBOL WITH FINGERNAILS
+1D1B4;N # MUSICAL SYMBOL DAMP
+1D1B5;N # MUSICAL SYMBOL DAMP ALL
+1D1B6;N # MUSICAL SYMBOL MAXIMA
+1D1B7;N # MUSICAL SYMBOL LONGA
+1D1B8;N # MUSICAL SYMBOL BREVIS
+1D1B9;N # MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA;N # MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB;N # MUSICAL SYMBOL MINIMA
+1D1BC;N # MUSICAL SYMBOL MINIMA BLACK
+1D1BD;N # MUSICAL SYMBOL SEMIMINIMA WHITE
+1D1BE;N # MUSICAL SYMBOL SEMIMINIMA BLACK
+1D1BF;N # MUSICAL SYMBOL FUSA WHITE
+1D1C0;N # MUSICAL SYMBOL FUSA BLACK
+1D1C1;N # MUSICAL SYMBOL LONGA PERFECTA REST
+1D1C2;N # MUSICAL SYMBOL LONGA IMPERFECTA REST
+1D1C3;N # MUSICAL SYMBOL BREVIS REST
+1D1C4;N # MUSICAL SYMBOL SEMIBREVIS REST
+1D1C5;N # MUSICAL SYMBOL MINIMA REST
+1D1C6;N # MUSICAL SYMBOL SEMIMINIMA REST
+1D1C7;N # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA
+1D1C8;N # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA
+1D1C9;N # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1
+1D1CA;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA
+1D1CB;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA
+1D1CC;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1
+1D1CD;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2
+1D1CE;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3
+1D1CF;N # MUSICAL SYMBOL CROIX
+1D1D0;N # MUSICAL SYMBOL GREGORIAN C CLEF
+1D1D1;N # MUSICAL SYMBOL GREGORIAN F CLEF
+1D1D2;N # MUSICAL SYMBOL SQUARE B
+1D1D3;N # MUSICAL SYMBOL VIRGA
+1D1D4;N # MUSICAL SYMBOL PODATUS
+1D1D5;N # MUSICAL SYMBOL CLIVIS
+1D1D6;N # MUSICAL SYMBOL SCANDICUS
+1D1D7;N # MUSICAL SYMBOL CLIMACUS
+1D1D8;N # MUSICAL SYMBOL TORCULUS
+1D1D9;N # MUSICAL SYMBOL PORRECTUS
+1D1DA;N # MUSICAL SYMBOL PORRECTUS FLEXUS
+1D1DB;N # MUSICAL SYMBOL SCANDICUS FLEXUS
+1D1DC;N # MUSICAL SYMBOL TORCULUS RESUPINUS
+1D1DD;N # MUSICAL SYMBOL PES SUBPUNCTIS
+1D200;N # GREEK VOCAL NOTATION SYMBOL-1
+1D201;N # GREEK VOCAL NOTATION SYMBOL-2
+1D202;N # GREEK VOCAL NOTATION SYMBOL-3
+1D203;N # GREEK VOCAL NOTATION SYMBOL-4
+1D204;N # GREEK VOCAL NOTATION SYMBOL-5
+1D205;N # GREEK VOCAL NOTATION SYMBOL-6
+1D206;N # GREEK VOCAL NOTATION SYMBOL-7
+1D207;N # GREEK VOCAL NOTATION SYMBOL-8
+1D208;N # GREEK VOCAL NOTATION SYMBOL-9
+1D209;N # GREEK VOCAL NOTATION SYMBOL-10
+1D20A;N # GREEK VOCAL NOTATION SYMBOL-11
+1D20B;N # GREEK VOCAL NOTATION SYMBOL-12
+1D20C;N # GREEK VOCAL NOTATION SYMBOL-13
+1D20D;N # GREEK VOCAL NOTATION SYMBOL-14
+1D20E;N # GREEK VOCAL NOTATION SYMBOL-15
+1D20F;N # GREEK VOCAL NOTATION SYMBOL-16
+1D210;N # GREEK VOCAL NOTATION SYMBOL-17
+1D211;N # GREEK VOCAL NOTATION SYMBOL-18
+1D212;N # GREEK VOCAL NOTATION SYMBOL-19
+1D213;N # GREEK VOCAL NOTATION SYMBOL-20
+1D214;N # GREEK VOCAL NOTATION SYMBOL-21
+1D215;N # GREEK VOCAL NOTATION SYMBOL-22
+1D216;N # GREEK VOCAL NOTATION SYMBOL-23
+1D217;N # GREEK VOCAL NOTATION SYMBOL-24
+1D218;N # GREEK VOCAL NOTATION SYMBOL-50
+1D219;N # GREEK VOCAL NOTATION SYMBOL-51
+1D21A;N # GREEK VOCAL NOTATION SYMBOL-52
+1D21B;N # GREEK VOCAL NOTATION SYMBOL-53
+1D21C;N # GREEK VOCAL NOTATION SYMBOL-54
+1D21D;N # GREEK INSTRUMENTAL NOTATION SYMBOL-1
+1D21E;N # GREEK INSTRUMENTAL NOTATION SYMBOL-2
+1D21F;N # GREEK INSTRUMENTAL NOTATION SYMBOL-4
+1D220;N # GREEK INSTRUMENTAL NOTATION SYMBOL-5
+1D221;N # GREEK INSTRUMENTAL NOTATION SYMBOL-7
+1D222;N # GREEK INSTRUMENTAL NOTATION SYMBOL-8
+1D223;N # GREEK INSTRUMENTAL NOTATION SYMBOL-11
+1D224;N # GREEK INSTRUMENTAL NOTATION SYMBOL-12
+1D225;N # GREEK INSTRUMENTAL NOTATION SYMBOL-13
+1D226;N # GREEK INSTRUMENTAL NOTATION SYMBOL-14
+1D227;N # GREEK INSTRUMENTAL NOTATION SYMBOL-17
+1D228;N # GREEK INSTRUMENTAL NOTATION SYMBOL-18
+1D229;N # GREEK INSTRUMENTAL NOTATION SYMBOL-19
+1D22A;N # GREEK INSTRUMENTAL NOTATION SYMBOL-23
+1D22B;N # GREEK INSTRUMENTAL NOTATION SYMBOL-24
+1D22C;N # GREEK INSTRUMENTAL NOTATION SYMBOL-25
+1D22D;N # GREEK INSTRUMENTAL NOTATION SYMBOL-26
+1D22E;N # GREEK INSTRUMENTAL NOTATION SYMBOL-27
+1D22F;N # GREEK INSTRUMENTAL NOTATION SYMBOL-29
+1D230;N # GREEK INSTRUMENTAL NOTATION SYMBOL-30
+1D231;N # GREEK INSTRUMENTAL NOTATION SYMBOL-32
+1D232;N # GREEK INSTRUMENTAL NOTATION SYMBOL-36
+1D233;N # GREEK INSTRUMENTAL NOTATION SYMBOL-37
+1D234;N # GREEK INSTRUMENTAL NOTATION SYMBOL-38
+1D235;N # GREEK INSTRUMENTAL NOTATION SYMBOL-39
+1D236;N # GREEK INSTRUMENTAL NOTATION SYMBOL-40
+1D237;N # GREEK INSTRUMENTAL NOTATION SYMBOL-42
+1D238;N # GREEK INSTRUMENTAL NOTATION SYMBOL-43
+1D239;N # GREEK INSTRUMENTAL NOTATION SYMBOL-45
+1D23A;N # GREEK INSTRUMENTAL NOTATION SYMBOL-47
+1D23B;N # GREEK INSTRUMENTAL NOTATION SYMBOL-48
+1D23C;N # GREEK INSTRUMENTAL NOTATION SYMBOL-49
+1D23D;N # GREEK INSTRUMENTAL NOTATION SYMBOL-50
+1D23E;N # GREEK INSTRUMENTAL NOTATION SYMBOL-51
+1D23F;N # GREEK INSTRUMENTAL NOTATION SYMBOL-52
+1D240;N # GREEK INSTRUMENTAL NOTATION SYMBOL-53
+1D241;N # GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242;N # COMBINING GREEK MUSICAL TRISEME
+1D243;N # COMBINING GREEK MUSICAL TETRASEME
+1D244;N # COMBINING GREEK MUSICAL PENTASEME
+1D245;N # GREEK MUSICAL LEIMMA
+1D300;N # MONOGRAM FOR EARTH
+1D301;N # DIGRAM FOR HEAVENLY EARTH
+1D302;N # DIGRAM FOR HUMAN EARTH
+1D303;N # DIGRAM FOR EARTHLY HEAVEN
+1D304;N # DIGRAM FOR EARTHLY HUMAN
+1D305;N # DIGRAM FOR EARTH
+1D306;N # TETRAGRAM FOR CENTRE
+1D307;N # TETRAGRAM FOR FULL CIRCLE
+1D308;N # TETRAGRAM FOR MIRED
+1D309;N # TETRAGRAM FOR BARRIER
+1D30A;N # TETRAGRAM FOR KEEPING SMALL
+1D30B;N # TETRAGRAM FOR CONTRARIETY
+1D30C;N # TETRAGRAM FOR ASCENT
+1D30D;N # TETRAGRAM FOR OPPOSITION
+1D30E;N # TETRAGRAM FOR BRANCHING OUT
+1D30F;N # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310;N # TETRAGRAM FOR DIVERGENCE
+1D311;N # TETRAGRAM FOR YOUTHFULNESS
+1D312;N # TETRAGRAM FOR INCREASE
+1D313;N # TETRAGRAM FOR PENETRATION
+1D314;N # TETRAGRAM FOR REACH
+1D315;N # TETRAGRAM FOR CONTACT
+1D316;N # TETRAGRAM FOR HOLDING BACK
+1D317;N # TETRAGRAM FOR WAITING
+1D318;N # TETRAGRAM FOR FOLLOWING
+1D319;N # TETRAGRAM FOR ADVANCE
+1D31A;N # TETRAGRAM FOR RELEASE
+1D31B;N # TETRAGRAM FOR RESISTANCE
+1D31C;N # TETRAGRAM FOR EASE
+1D31D;N # TETRAGRAM FOR JOY
+1D31E;N # TETRAGRAM FOR CONTENTION
+1D31F;N # TETRAGRAM FOR ENDEAVOUR
+1D320;N # TETRAGRAM FOR DUTIES
+1D321;N # TETRAGRAM FOR CHANGE
+1D322;N # TETRAGRAM FOR DECISIVENESS
+1D323;N # TETRAGRAM FOR BOLD RESOLUTION
+1D324;N # TETRAGRAM FOR PACKING
+1D325;N # TETRAGRAM FOR LEGION
+1D326;N # TETRAGRAM FOR CLOSENESS
+1D327;N # TETRAGRAM FOR KINSHIP
+1D328;N # TETRAGRAM FOR GATHERING
+1D329;N # TETRAGRAM FOR STRENGTH
+1D32A;N # TETRAGRAM FOR PURITY
+1D32B;N # TETRAGRAM FOR FULLNESS
+1D32C;N # TETRAGRAM FOR RESIDENCE
+1D32D;N # TETRAGRAM FOR LAW OR MODEL
+1D32E;N # TETRAGRAM FOR RESPONSE
+1D32F;N # TETRAGRAM FOR GOING TO MEET
+1D330;N # TETRAGRAM FOR ENCOUNTERS
+1D331;N # TETRAGRAM FOR STOVE
+1D332;N # TETRAGRAM FOR GREATNESS
+1D333;N # TETRAGRAM FOR ENLARGEMENT
+1D334;N # TETRAGRAM FOR PATTERN
+1D335;N # TETRAGRAM FOR RITUAL
+1D336;N # TETRAGRAM FOR FLIGHT
+1D337;N # TETRAGRAM FOR VASTNESS OR WASTING
+1D338;N # TETRAGRAM FOR CONSTANCY
+1D339;N # TETRAGRAM FOR MEASURE
+1D33A;N # TETRAGRAM FOR ETERNITY
+1D33B;N # TETRAGRAM FOR UNITY
+1D33C;N # TETRAGRAM FOR DIMINISHMENT
+1D33D;N # TETRAGRAM FOR CLOSED MOUTH
+1D33E;N # TETRAGRAM FOR GUARDEDNESS
+1D33F;N # TETRAGRAM FOR GATHERING IN
+1D340;N # TETRAGRAM FOR MASSING
+1D341;N # TETRAGRAM FOR ACCUMULATION
+1D342;N # TETRAGRAM FOR EMBELLISHMENT
+1D343;N # TETRAGRAM FOR DOUBT
+1D344;N # TETRAGRAM FOR WATCH
+1D345;N # TETRAGRAM FOR SINKING
+1D346;N # TETRAGRAM FOR INNER
+1D347;N # TETRAGRAM FOR DEPARTURE
+1D348;N # TETRAGRAM FOR DARKENING
+1D349;N # TETRAGRAM FOR DIMMING
+1D34A;N # TETRAGRAM FOR EXHAUSTION
+1D34B;N # TETRAGRAM FOR SEVERANCE
+1D34C;N # TETRAGRAM FOR STOPPAGE
+1D34D;N # TETRAGRAM FOR HARDNESS
+1D34E;N # TETRAGRAM FOR COMPLETION
+1D34F;N # TETRAGRAM FOR CLOSURE
+1D350;N # TETRAGRAM FOR FAILURE
+1D351;N # TETRAGRAM FOR AGGRAVATION
+1D352;N # TETRAGRAM FOR COMPLIANCE
+1D353;N # TETRAGRAM FOR ON THE VERGE
+1D354;N # TETRAGRAM FOR DIFFICULTIES
+1D355;N # TETRAGRAM FOR LABOURING
+1D356;N # TETRAGRAM FOR FOSTERING
+1D360;N # COUNTING ROD UNIT DIGIT ONE
+1D361;N # COUNTING ROD UNIT DIGIT TWO
+1D362;N # COUNTING ROD UNIT DIGIT THREE
+1D363;N # COUNTING ROD UNIT DIGIT FOUR
+1D364;N # COUNTING ROD UNIT DIGIT FIVE
+1D365;N # COUNTING ROD UNIT DIGIT SIX
+1D366;N # COUNTING ROD UNIT DIGIT SEVEN
+1D367;N # COUNTING ROD UNIT DIGIT EIGHT
+1D368;N # COUNTING ROD UNIT DIGIT NINE
+1D369;N # COUNTING ROD TENS DIGIT ONE
+1D36A;N # COUNTING ROD TENS DIGIT TWO
+1D36B;N # COUNTING ROD TENS DIGIT THREE
+1D36C;N # COUNTING ROD TENS DIGIT FOUR
+1D36D;N # COUNTING ROD TENS DIGIT FIVE
+1D36E;N # COUNTING ROD TENS DIGIT SIX
+1D36F;N # COUNTING ROD TENS DIGIT SEVEN
+1D370;N # COUNTING ROD TENS DIGIT EIGHT
+1D371;N # COUNTING ROD TENS DIGIT NINE
+1D400;N # MATHEMATICAL BOLD CAPITAL A
+1D401;N # MATHEMATICAL BOLD CAPITAL B
+1D402;N # MATHEMATICAL BOLD CAPITAL C
+1D403;N # MATHEMATICAL BOLD CAPITAL D
+1D404;N # MATHEMATICAL BOLD CAPITAL E
+1D405;N # MATHEMATICAL BOLD CAPITAL F
+1D406;N # MATHEMATICAL BOLD CAPITAL G
+1D407;N # MATHEMATICAL BOLD CAPITAL H
+1D408;N # MATHEMATICAL BOLD CAPITAL I
+1D409;N # MATHEMATICAL BOLD CAPITAL J
+1D40A;N # MATHEMATICAL BOLD CAPITAL K
+1D40B;N # MATHEMATICAL BOLD CAPITAL L
+1D40C;N # MATHEMATICAL BOLD CAPITAL M
+1D40D;N # MATHEMATICAL BOLD CAPITAL N
+1D40E;N # MATHEMATICAL BOLD CAPITAL O
+1D40F;N # MATHEMATICAL BOLD CAPITAL P
+1D410;N # MATHEMATICAL BOLD CAPITAL Q
+1D411;N # MATHEMATICAL BOLD CAPITAL R
+1D412;N # MATHEMATICAL BOLD CAPITAL S
+1D413;N # MATHEMATICAL BOLD CAPITAL T
+1D414;N # MATHEMATICAL BOLD CAPITAL U
+1D415;N # MATHEMATICAL BOLD CAPITAL V
+1D416;N # MATHEMATICAL BOLD CAPITAL W
+1D417;N # MATHEMATICAL BOLD CAPITAL X
+1D418;N # MATHEMATICAL BOLD CAPITAL Y
+1D419;N # MATHEMATICAL BOLD CAPITAL Z
+1D41A;N # MATHEMATICAL BOLD SMALL A
+1D41B;N # MATHEMATICAL BOLD SMALL B
+1D41C;N # MATHEMATICAL BOLD SMALL C
+1D41D;N # MATHEMATICAL BOLD SMALL D
+1D41E;N # MATHEMATICAL BOLD SMALL E
+1D41F;N # MATHEMATICAL BOLD SMALL F
+1D420;N # MATHEMATICAL BOLD SMALL G
+1D421;N # MATHEMATICAL BOLD SMALL H
+1D422;N # MATHEMATICAL BOLD SMALL I
+1D423;N # MATHEMATICAL BOLD SMALL J
+1D424;N # MATHEMATICAL BOLD SMALL K
+1D425;N # MATHEMATICAL BOLD SMALL L
+1D426;N # MATHEMATICAL BOLD SMALL M
+1D427;N # MATHEMATICAL BOLD SMALL N
+1D428;N # MATHEMATICAL BOLD SMALL O
+1D429;N # MATHEMATICAL BOLD SMALL P
+1D42A;N # MATHEMATICAL BOLD SMALL Q
+1D42B;N # MATHEMATICAL BOLD SMALL R
+1D42C;N # MATHEMATICAL BOLD SMALL S
+1D42D;N # MATHEMATICAL BOLD SMALL T
+1D42E;N # MATHEMATICAL BOLD SMALL U
+1D42F;N # MATHEMATICAL BOLD SMALL V
+1D430;N # MATHEMATICAL BOLD SMALL W
+1D431;N # MATHEMATICAL BOLD SMALL X
+1D432;N # MATHEMATICAL BOLD SMALL Y
+1D433;N # MATHEMATICAL BOLD SMALL Z
+1D434;N # MATHEMATICAL ITALIC CAPITAL A
+1D435;N # MATHEMATICAL ITALIC CAPITAL B
+1D436;N # MATHEMATICAL ITALIC CAPITAL C
+1D437;N # MATHEMATICAL ITALIC CAPITAL D
+1D438;N # MATHEMATICAL ITALIC CAPITAL E
+1D439;N # MATHEMATICAL ITALIC CAPITAL F
+1D43A;N # MATHEMATICAL ITALIC CAPITAL G
+1D43B;N # MATHEMATICAL ITALIC CAPITAL H
+1D43C;N # MATHEMATICAL ITALIC CAPITAL I
+1D43D;N # MATHEMATICAL ITALIC CAPITAL J
+1D43E;N # MATHEMATICAL ITALIC CAPITAL K
+1D43F;N # MATHEMATICAL ITALIC CAPITAL L
+1D440;N # MATHEMATICAL ITALIC CAPITAL M
+1D441;N # MATHEMATICAL ITALIC CAPITAL N
+1D442;N # MATHEMATICAL ITALIC CAPITAL O
+1D443;N # MATHEMATICAL ITALIC CAPITAL P
+1D444;N # MATHEMATICAL ITALIC CAPITAL Q
+1D445;N # MATHEMATICAL ITALIC CAPITAL R
+1D446;N # MATHEMATICAL ITALIC CAPITAL S
+1D447;N # MATHEMATICAL ITALIC CAPITAL T
+1D448;N # MATHEMATICAL ITALIC CAPITAL U
+1D449;N # MATHEMATICAL ITALIC CAPITAL V
+1D44A;N # MATHEMATICAL ITALIC CAPITAL W
+1D44B;N # MATHEMATICAL ITALIC CAPITAL X
+1D44C;N # MATHEMATICAL ITALIC CAPITAL Y
+1D44D;N # MATHEMATICAL ITALIC CAPITAL Z
+1D44E;N # MATHEMATICAL ITALIC SMALL A
+1D44F;N # MATHEMATICAL ITALIC SMALL B
+1D450;N # MATHEMATICAL ITALIC SMALL C
+1D451;N # MATHEMATICAL ITALIC SMALL D
+1D452;N # MATHEMATICAL ITALIC SMALL E
+1D453;N # MATHEMATICAL ITALIC SMALL F
+1D454;N # MATHEMATICAL ITALIC SMALL G
+1D456;N # MATHEMATICAL ITALIC SMALL I
+1D457;N # MATHEMATICAL ITALIC SMALL J
+1D458;N # MATHEMATICAL ITALIC SMALL K
+1D459;N # MATHEMATICAL ITALIC SMALL L
+1D45A;N # MATHEMATICAL ITALIC SMALL M
+1D45B;N # MATHEMATICAL ITALIC SMALL N
+1D45C;N # MATHEMATICAL ITALIC SMALL O
+1D45D;N # MATHEMATICAL ITALIC SMALL P
+1D45E;N # MATHEMATICAL ITALIC SMALL Q
+1D45F;N # MATHEMATICAL ITALIC SMALL R
+1D460;N # MATHEMATICAL ITALIC SMALL S
+1D461;N # MATHEMATICAL ITALIC SMALL T
+1D462;N # MATHEMATICAL ITALIC SMALL U
+1D463;N # MATHEMATICAL ITALIC SMALL V
+1D464;N # MATHEMATICAL ITALIC SMALL W
+1D465;N # MATHEMATICAL ITALIC SMALL X
+1D466;N # MATHEMATICAL ITALIC SMALL Y
+1D467;N # MATHEMATICAL ITALIC SMALL Z
+1D468;N # MATHEMATICAL BOLD ITALIC CAPITAL A
+1D469;N # MATHEMATICAL BOLD ITALIC CAPITAL B
+1D46A;N # MATHEMATICAL BOLD ITALIC CAPITAL C
+1D46B;N # MATHEMATICAL BOLD ITALIC CAPITAL D
+1D46C;N # MATHEMATICAL BOLD ITALIC CAPITAL E
+1D46D;N # MATHEMATICAL BOLD ITALIC CAPITAL F
+1D46E;N # MATHEMATICAL BOLD ITALIC CAPITAL G
+1D46F;N # MATHEMATICAL BOLD ITALIC CAPITAL H
+1D470;N # MATHEMATICAL BOLD ITALIC CAPITAL I
+1D471;N # MATHEMATICAL BOLD ITALIC CAPITAL J
+1D472;N # MATHEMATICAL BOLD ITALIC CAPITAL K
+1D473;N # MATHEMATICAL BOLD ITALIC CAPITAL L
+1D474;N # MATHEMATICAL BOLD ITALIC CAPITAL M
+1D475;N # MATHEMATICAL BOLD ITALIC CAPITAL N
+1D476;N # MATHEMATICAL BOLD ITALIC CAPITAL O
+1D477;N # MATHEMATICAL BOLD ITALIC CAPITAL P
+1D478;N # MATHEMATICAL BOLD ITALIC CAPITAL Q
+1D479;N # MATHEMATICAL BOLD ITALIC CAPITAL R
+1D47A;N # MATHEMATICAL BOLD ITALIC CAPITAL S
+1D47B;N # MATHEMATICAL BOLD ITALIC CAPITAL T
+1D47C;N # MATHEMATICAL BOLD ITALIC CAPITAL U
+1D47D;N # MATHEMATICAL BOLD ITALIC CAPITAL V
+1D47E;N # MATHEMATICAL BOLD ITALIC CAPITAL W
+1D47F;N # MATHEMATICAL BOLD ITALIC CAPITAL X
+1D480;N # MATHEMATICAL BOLD ITALIC CAPITAL Y
+1D481;N # MATHEMATICAL BOLD ITALIC CAPITAL Z
+1D482;N # MATHEMATICAL BOLD ITALIC SMALL A
+1D483;N # MATHEMATICAL BOLD ITALIC SMALL B
+1D484;N # MATHEMATICAL BOLD ITALIC SMALL C
+1D485;N # MATHEMATICAL BOLD ITALIC SMALL D
+1D486;N # MATHEMATICAL BOLD ITALIC SMALL E
+1D487;N # MATHEMATICAL BOLD ITALIC SMALL F
+1D488;N # MATHEMATICAL BOLD ITALIC SMALL G
+1D489;N # MATHEMATICAL BOLD ITALIC SMALL H
+1D48A;N # MATHEMATICAL BOLD ITALIC SMALL I
+1D48B;N # MATHEMATICAL BOLD ITALIC SMALL J
+1D48C;N # MATHEMATICAL BOLD ITALIC SMALL K
+1D48D;N # MATHEMATICAL BOLD ITALIC SMALL L
+1D48E;N # MATHEMATICAL BOLD ITALIC SMALL M
+1D48F;N # MATHEMATICAL BOLD ITALIC SMALL N
+1D490;N # MATHEMATICAL BOLD ITALIC SMALL O
+1D491;N # MATHEMATICAL BOLD ITALIC SMALL P
+1D492;N # MATHEMATICAL BOLD ITALIC SMALL Q
+1D493;N # MATHEMATICAL BOLD ITALIC SMALL R
+1D494;N # MATHEMATICAL BOLD ITALIC SMALL S
+1D495;N # MATHEMATICAL BOLD ITALIC SMALL T
+1D496;N # MATHEMATICAL BOLD ITALIC SMALL U
+1D497;N # MATHEMATICAL BOLD ITALIC SMALL V
+1D498;N # MATHEMATICAL BOLD ITALIC SMALL W
+1D499;N # MATHEMATICAL BOLD ITALIC SMALL X
+1D49A;N # MATHEMATICAL BOLD ITALIC SMALL Y
+1D49B;N # MATHEMATICAL BOLD ITALIC SMALL Z
+1D49C;N # MATHEMATICAL SCRIPT CAPITAL A
+1D49E;N # MATHEMATICAL SCRIPT CAPITAL C
+1D49F;N # MATHEMATICAL SCRIPT CAPITAL D
+1D4A2;N # MATHEMATICAL SCRIPT CAPITAL G
+1D4A5;N # MATHEMATICAL SCRIPT CAPITAL J
+1D4A6;N # MATHEMATICAL SCRIPT CAPITAL K
+1D4A9;N # MATHEMATICAL SCRIPT CAPITAL N
+1D4AA;N # MATHEMATICAL SCRIPT CAPITAL O
+1D4AB;N # MATHEMATICAL SCRIPT CAPITAL P
+1D4AC;N # MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE;N # MATHEMATICAL SCRIPT CAPITAL S
+1D4AF;N # MATHEMATICAL SCRIPT CAPITAL T
+1D4B0;N # MATHEMATICAL SCRIPT CAPITAL U
+1D4B1;N # MATHEMATICAL SCRIPT CAPITAL V
+1D4B2;N # MATHEMATICAL SCRIPT CAPITAL W
+1D4B3;N # MATHEMATICAL SCRIPT CAPITAL X
+1D4B4;N # MATHEMATICAL SCRIPT CAPITAL Y
+1D4B5;N # MATHEMATICAL SCRIPT CAPITAL Z
+1D4B6;N # MATHEMATICAL SCRIPT SMALL A
+1D4B7;N # MATHEMATICAL SCRIPT SMALL B
+1D4B8;N # MATHEMATICAL SCRIPT SMALL C
+1D4B9;N # MATHEMATICAL SCRIPT SMALL D
+1D4BB;N # MATHEMATICAL SCRIPT SMALL F
+1D4BD;N # MATHEMATICAL SCRIPT SMALL H
+1D4BE;N # MATHEMATICAL SCRIPT SMALL I
+1D4BF;N # MATHEMATICAL SCRIPT SMALL J
+1D4C0;N # MATHEMATICAL SCRIPT SMALL K
+1D4C1;N # MATHEMATICAL SCRIPT SMALL L
+1D4C2;N # MATHEMATICAL SCRIPT SMALL M
+1D4C3;N # MATHEMATICAL SCRIPT SMALL N
+1D4C5;N # MATHEMATICAL SCRIPT SMALL P
+1D4C6;N # MATHEMATICAL SCRIPT SMALL Q
+1D4C7;N # MATHEMATICAL SCRIPT SMALL R
+1D4C8;N # MATHEMATICAL SCRIPT SMALL S
+1D4C9;N # MATHEMATICAL SCRIPT SMALL T
+1D4CA;N # MATHEMATICAL SCRIPT SMALL U
+1D4CB;N # MATHEMATICAL SCRIPT SMALL V
+1D4CC;N # MATHEMATICAL SCRIPT SMALL W
+1D4CD;N # MATHEMATICAL SCRIPT SMALL X
+1D4CE;N # MATHEMATICAL SCRIPT SMALL Y
+1D4CF;N # MATHEMATICAL SCRIPT SMALL Z
+1D4D0;N # MATHEMATICAL BOLD SCRIPT CAPITAL A
+1D4D1;N # MATHEMATICAL BOLD SCRIPT CAPITAL B
+1D4D2;N # MATHEMATICAL BOLD SCRIPT CAPITAL C
+1D4D3;N # MATHEMATICAL BOLD SCRIPT CAPITAL D
+1D4D4;N # MATHEMATICAL BOLD SCRIPT CAPITAL E
+1D4D5;N # MATHEMATICAL BOLD SCRIPT CAPITAL F
+1D4D6;N # MATHEMATICAL BOLD SCRIPT CAPITAL G
+1D4D7;N # MATHEMATICAL BOLD SCRIPT CAPITAL H
+1D4D8;N # MATHEMATICAL BOLD SCRIPT CAPITAL I
+1D4D9;N # MATHEMATICAL BOLD SCRIPT CAPITAL J
+1D4DA;N # MATHEMATICAL BOLD SCRIPT CAPITAL K
+1D4DB;N # MATHEMATICAL BOLD SCRIPT CAPITAL L
+1D4DC;N # MATHEMATICAL BOLD SCRIPT CAPITAL M
+1D4DD;N # MATHEMATICAL BOLD SCRIPT CAPITAL N
+1D4DE;N # MATHEMATICAL BOLD SCRIPT CAPITAL O
+1D4DF;N # MATHEMATICAL BOLD SCRIPT CAPITAL P
+1D4E0;N # MATHEMATICAL BOLD SCRIPT CAPITAL Q
+1D4E1;N # MATHEMATICAL BOLD SCRIPT CAPITAL R
+1D4E2;N # MATHEMATICAL BOLD SCRIPT CAPITAL S
+1D4E3;N # MATHEMATICAL BOLD SCRIPT CAPITAL T
+1D4E4;N # MATHEMATICAL BOLD SCRIPT CAPITAL U
+1D4E5;N # MATHEMATICAL BOLD SCRIPT CAPITAL V
+1D4E6;N # MATHEMATICAL BOLD SCRIPT CAPITAL W
+1D4E7;N # MATHEMATICAL BOLD SCRIPT CAPITAL X
+1D4E8;N # MATHEMATICAL BOLD SCRIPT CAPITAL Y
+1D4E9;N # MATHEMATICAL BOLD SCRIPT CAPITAL Z
+1D4EA;N # MATHEMATICAL BOLD SCRIPT SMALL A
+1D4EB;N # MATHEMATICAL BOLD SCRIPT SMALL B
+1D4EC;N # MATHEMATICAL BOLD SCRIPT SMALL C
+1D4ED;N # MATHEMATICAL BOLD SCRIPT SMALL D
+1D4EE;N # MATHEMATICAL BOLD SCRIPT SMALL E
+1D4EF;N # MATHEMATICAL BOLD SCRIPT SMALL F
+1D4F0;N # MATHEMATICAL BOLD SCRIPT SMALL G
+1D4F1;N # MATHEMATICAL BOLD SCRIPT SMALL H
+1D4F2;N # MATHEMATICAL BOLD SCRIPT SMALL I
+1D4F3;N # MATHEMATICAL BOLD SCRIPT SMALL J
+1D4F4;N # MATHEMATICAL BOLD SCRIPT SMALL K
+1D4F5;N # MATHEMATICAL BOLD SCRIPT SMALL L
+1D4F6;N # MATHEMATICAL BOLD SCRIPT SMALL M
+1D4F7;N # MATHEMATICAL BOLD SCRIPT SMALL N
+1D4F8;N # MATHEMATICAL BOLD SCRIPT SMALL O
+1D4F9;N # MATHEMATICAL BOLD SCRIPT SMALL P
+1D4FA;N # MATHEMATICAL BOLD SCRIPT SMALL Q
+1D4FB;N # MATHEMATICAL BOLD SCRIPT SMALL R
+1D4FC;N # MATHEMATICAL BOLD SCRIPT SMALL S
+1D4FD;N # MATHEMATICAL BOLD SCRIPT SMALL T
+1D4FE;N # MATHEMATICAL BOLD SCRIPT SMALL U
+1D4FF;N # MATHEMATICAL BOLD SCRIPT SMALL V
+1D500;N # MATHEMATICAL BOLD SCRIPT SMALL W
+1D501;N # MATHEMATICAL BOLD SCRIPT SMALL X
+1D502;N # MATHEMATICAL BOLD SCRIPT SMALL Y
+1D503;N # MATHEMATICAL BOLD SCRIPT SMALL Z
+1D504;N # MATHEMATICAL FRAKTUR CAPITAL A
+1D505;N # MATHEMATICAL FRAKTUR CAPITAL B
+1D507;N # MATHEMATICAL FRAKTUR CAPITAL D
+1D508;N # MATHEMATICAL FRAKTUR CAPITAL E
+1D509;N # MATHEMATICAL FRAKTUR CAPITAL F
+1D50A;N # MATHEMATICAL FRAKTUR CAPITAL G
+1D50D;N # MATHEMATICAL FRAKTUR CAPITAL J
+1D50E;N # MATHEMATICAL FRAKTUR CAPITAL K
+1D50F;N # MATHEMATICAL FRAKTUR CAPITAL L
+1D510;N # MATHEMATICAL FRAKTUR CAPITAL M
+1D511;N # MATHEMATICAL FRAKTUR CAPITAL N
+1D512;N # MATHEMATICAL FRAKTUR CAPITAL O
+1D513;N # MATHEMATICAL FRAKTUR CAPITAL P
+1D514;N # MATHEMATICAL FRAKTUR CAPITAL Q
+1D516;N # MATHEMATICAL FRAKTUR CAPITAL S
+1D517;N # MATHEMATICAL FRAKTUR CAPITAL T
+1D518;N # MATHEMATICAL FRAKTUR CAPITAL U
+1D519;N # MATHEMATICAL FRAKTUR CAPITAL V
+1D51A;N # MATHEMATICAL FRAKTUR CAPITAL W
+1D51B;N # MATHEMATICAL FRAKTUR CAPITAL X
+1D51C;N # MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E;N # MATHEMATICAL FRAKTUR SMALL A
+1D51F;N # MATHEMATICAL FRAKTUR SMALL B
+1D520;N # MATHEMATICAL FRAKTUR SMALL C
+1D521;N # MATHEMATICAL FRAKTUR SMALL D
+1D522;N # MATHEMATICAL FRAKTUR SMALL E
+1D523;N # MATHEMATICAL FRAKTUR SMALL F
+1D524;N # MATHEMATICAL FRAKTUR SMALL G
+1D525;N # MATHEMATICAL FRAKTUR SMALL H
+1D526;N # MATHEMATICAL FRAKTUR SMALL I
+1D527;N # MATHEMATICAL FRAKTUR SMALL J
+1D528;N # MATHEMATICAL FRAKTUR SMALL K
+1D529;N # MATHEMATICAL FRAKTUR SMALL L
+1D52A;N # MATHEMATICAL FRAKTUR SMALL M
+1D52B;N # MATHEMATICAL FRAKTUR SMALL N
+1D52C;N # MATHEMATICAL FRAKTUR SMALL O
+1D52D;N # MATHEMATICAL FRAKTUR SMALL P
+1D52E;N # MATHEMATICAL FRAKTUR SMALL Q
+1D52F;N # MATHEMATICAL FRAKTUR SMALL R
+1D530;N # MATHEMATICAL FRAKTUR SMALL S
+1D531;N # MATHEMATICAL FRAKTUR SMALL T
+1D532;N # MATHEMATICAL FRAKTUR SMALL U
+1D533;N # MATHEMATICAL FRAKTUR SMALL V
+1D534;N # MATHEMATICAL FRAKTUR SMALL W
+1D535;N # MATHEMATICAL FRAKTUR SMALL X
+1D536;N # MATHEMATICAL FRAKTUR SMALL Y
+1D537;N # MATHEMATICAL FRAKTUR SMALL Z
+1D538;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+1D539;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+1D53C;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+1D53D;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+1D53E;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+1D541;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+1D542;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+1D543;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+1D544;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+1D54B;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+1D54C;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+1D54D;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+1D54E;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+1D54F;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+1D550;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552;N # MATHEMATICAL DOUBLE-STRUCK SMALL A
+1D553;N # MATHEMATICAL DOUBLE-STRUCK SMALL B
+1D554;N # MATHEMATICAL DOUBLE-STRUCK SMALL C
+1D555;N # MATHEMATICAL DOUBLE-STRUCK SMALL D
+1D556;N # MATHEMATICAL DOUBLE-STRUCK SMALL E
+1D557;N # MATHEMATICAL DOUBLE-STRUCK SMALL F
+1D558;N # MATHEMATICAL DOUBLE-STRUCK SMALL G
+1D559;N # MATHEMATICAL DOUBLE-STRUCK SMALL H
+1D55A;N # MATHEMATICAL DOUBLE-STRUCK SMALL I
+1D55B;N # MATHEMATICAL DOUBLE-STRUCK SMALL J
+1D55C;N # MATHEMATICAL DOUBLE-STRUCK SMALL K
+1D55D;N # MATHEMATICAL DOUBLE-STRUCK SMALL L
+1D55E;N # MATHEMATICAL DOUBLE-STRUCK SMALL M
+1D55F;N # MATHEMATICAL DOUBLE-STRUCK SMALL N
+1D560;N # MATHEMATICAL DOUBLE-STRUCK SMALL O
+1D561;N # MATHEMATICAL DOUBLE-STRUCK SMALL P
+1D562;N # MATHEMATICAL DOUBLE-STRUCK SMALL Q
+1D563;N # MATHEMATICAL DOUBLE-STRUCK SMALL R
+1D564;N # MATHEMATICAL DOUBLE-STRUCK SMALL S
+1D565;N # MATHEMATICAL DOUBLE-STRUCK SMALL T
+1D566;N # MATHEMATICAL DOUBLE-STRUCK SMALL U
+1D567;N # MATHEMATICAL DOUBLE-STRUCK SMALL V
+1D568;N # MATHEMATICAL DOUBLE-STRUCK SMALL W
+1D569;N # MATHEMATICAL DOUBLE-STRUCK SMALL X
+1D56A;N # MATHEMATICAL DOUBLE-STRUCK SMALL Y
+1D56B;N # MATHEMATICAL DOUBLE-STRUCK SMALL Z
+1D56C;N # MATHEMATICAL BOLD FRAKTUR CAPITAL A
+1D56D;N # MATHEMATICAL BOLD FRAKTUR CAPITAL B
+1D56E;N # MATHEMATICAL BOLD FRAKTUR CAPITAL C
+1D56F;N # MATHEMATICAL BOLD FRAKTUR CAPITAL D
+1D570;N # MATHEMATICAL BOLD FRAKTUR CAPITAL E
+1D571;N # MATHEMATICAL BOLD FRAKTUR CAPITAL F
+1D572;N # MATHEMATICAL BOLD FRAKTUR CAPITAL G
+1D573;N # MATHEMATICAL BOLD FRAKTUR CAPITAL H
+1D574;N # MATHEMATICAL BOLD FRAKTUR CAPITAL I
+1D575;N # MATHEMATICAL BOLD FRAKTUR CAPITAL J
+1D576;N # MATHEMATICAL BOLD FRAKTUR CAPITAL K
+1D577;N # MATHEMATICAL BOLD FRAKTUR CAPITAL L
+1D578;N # MATHEMATICAL BOLD FRAKTUR CAPITAL M
+1D579;N # MATHEMATICAL BOLD FRAKTUR CAPITAL N
+1D57A;N # MATHEMATICAL BOLD FRAKTUR CAPITAL O
+1D57B;N # MATHEMATICAL BOLD FRAKTUR CAPITAL P
+1D57C;N # MATHEMATICAL BOLD FRAKTUR CAPITAL Q
+1D57D;N # MATHEMATICAL BOLD FRAKTUR CAPITAL R
+1D57E;N # MATHEMATICAL BOLD FRAKTUR CAPITAL S
+1D57F;N # MATHEMATICAL BOLD FRAKTUR CAPITAL T
+1D580;N # MATHEMATICAL BOLD FRAKTUR CAPITAL U
+1D581;N # MATHEMATICAL BOLD FRAKTUR CAPITAL V
+1D582;N # MATHEMATICAL BOLD FRAKTUR CAPITAL W
+1D583;N # MATHEMATICAL BOLD FRAKTUR CAPITAL X
+1D584;N # MATHEMATICAL BOLD FRAKTUR CAPITAL Y
+1D585;N # MATHEMATICAL BOLD FRAKTUR CAPITAL Z
+1D586;N # MATHEMATICAL BOLD FRAKTUR SMALL A
+1D587;N # MATHEMATICAL BOLD FRAKTUR SMALL B
+1D588;N # MATHEMATICAL BOLD FRAKTUR SMALL C
+1D589;N # MATHEMATICAL BOLD FRAKTUR SMALL D
+1D58A;N # MATHEMATICAL BOLD FRAKTUR SMALL E
+1D58B;N # MATHEMATICAL BOLD FRAKTUR SMALL F
+1D58C;N # MATHEMATICAL BOLD FRAKTUR SMALL G
+1D58D;N # MATHEMATICAL BOLD FRAKTUR SMALL H
+1D58E;N # MATHEMATICAL BOLD FRAKTUR SMALL I
+1D58F;N # MATHEMATICAL BOLD FRAKTUR SMALL J
+1D590;N # MATHEMATICAL BOLD FRAKTUR SMALL K
+1D591;N # MATHEMATICAL BOLD FRAKTUR SMALL L
+1D592;N # MATHEMATICAL BOLD FRAKTUR SMALL M
+1D593;N # MATHEMATICAL BOLD FRAKTUR SMALL N
+1D594;N # MATHEMATICAL BOLD FRAKTUR SMALL O
+1D595;N # MATHEMATICAL BOLD FRAKTUR SMALL P
+1D596;N # MATHEMATICAL BOLD FRAKTUR SMALL Q
+1D597;N # MATHEMATICAL BOLD FRAKTUR SMALL R
+1D598;N # MATHEMATICAL BOLD FRAKTUR SMALL S
+1D599;N # MATHEMATICAL BOLD FRAKTUR SMALL T
+1D59A;N # MATHEMATICAL BOLD FRAKTUR SMALL U
+1D59B;N # MATHEMATICAL BOLD FRAKTUR SMALL V
+1D59C;N # MATHEMATICAL BOLD FRAKTUR SMALL W
+1D59D;N # MATHEMATICAL BOLD FRAKTUR SMALL X
+1D59E;N # MATHEMATICAL BOLD FRAKTUR SMALL Y
+1D59F;N # MATHEMATICAL BOLD FRAKTUR SMALL Z
+1D5A0;N # MATHEMATICAL SANS-SERIF CAPITAL A
+1D5A1;N # MATHEMATICAL SANS-SERIF CAPITAL B
+1D5A2;N # MATHEMATICAL SANS-SERIF CAPITAL C
+1D5A3;N # MATHEMATICAL SANS-SERIF CAPITAL D
+1D5A4;N # MATHEMATICAL SANS-SERIF CAPITAL E
+1D5A5;N # MATHEMATICAL SANS-SERIF CAPITAL F
+1D5A6;N # MATHEMATICAL SANS-SERIF CAPITAL G
+1D5A7;N # MATHEMATICAL SANS-SERIF CAPITAL H
+1D5A8;N # MATHEMATICAL SANS-SERIF CAPITAL I
+1D5A9;N # MATHEMATICAL SANS-SERIF CAPITAL J
+1D5AA;N # MATHEMATICAL SANS-SERIF CAPITAL K
+1D5AB;N # MATHEMATICAL SANS-SERIF CAPITAL L
+1D5AC;N # MATHEMATICAL SANS-SERIF CAPITAL M
+1D5AD;N # MATHEMATICAL SANS-SERIF CAPITAL N
+1D5AE;N # MATHEMATICAL SANS-SERIF CAPITAL O
+1D5AF;N # MATHEMATICAL SANS-SERIF CAPITAL P
+1D5B0;N # MATHEMATICAL SANS-SERIF CAPITAL Q
+1D5B1;N # MATHEMATICAL SANS-SERIF CAPITAL R
+1D5B2;N # MATHEMATICAL SANS-SERIF CAPITAL S
+1D5B3;N # MATHEMATICAL SANS-SERIF CAPITAL T
+1D5B4;N # MATHEMATICAL SANS-SERIF CAPITAL U
+1D5B5;N # MATHEMATICAL SANS-SERIF CAPITAL V
+1D5B6;N # MATHEMATICAL SANS-SERIF CAPITAL W
+1D5B7;N # MATHEMATICAL SANS-SERIF CAPITAL X
+1D5B8;N # MATHEMATICAL SANS-SERIF CAPITAL Y
+1D5B9;N # MATHEMATICAL SANS-SERIF CAPITAL Z
+1D5BA;N # MATHEMATICAL SANS-SERIF SMALL A
+1D5BB;N # MATHEMATICAL SANS-SERIF SMALL B
+1D5BC;N # MATHEMATICAL SANS-SERIF SMALL C
+1D5BD;N # MATHEMATICAL SANS-SERIF SMALL D
+1D5BE;N # MATHEMATICAL SANS-SERIF SMALL E
+1D5BF;N # MATHEMATICAL SANS-SERIF SMALL F
+1D5C0;N # MATHEMATICAL SANS-SERIF SMALL G
+1D5C1;N # MATHEMATICAL SANS-SERIF SMALL H
+1D5C2;N # MATHEMATICAL SANS-SERIF SMALL I
+1D5C3;N # MATHEMATICAL SANS-SERIF SMALL J
+1D5C4;N # MATHEMATICAL SANS-SERIF SMALL K
+1D5C5;N # MATHEMATICAL SANS-SERIF SMALL L
+1D5C6;N # MATHEMATICAL SANS-SERIF SMALL M
+1D5C7;N # MATHEMATICAL SANS-SERIF SMALL N
+1D5C8;N # MATHEMATICAL SANS-SERIF SMALL O
+1D5C9;N # MATHEMATICAL SANS-SERIF SMALL P
+1D5CA;N # MATHEMATICAL SANS-SERIF SMALL Q
+1D5CB;N # MATHEMATICAL SANS-SERIF SMALL R
+1D5CC;N # MATHEMATICAL SANS-SERIF SMALL S
+1D5CD;N # MATHEMATICAL SANS-SERIF SMALL T
+1D5CE;N # MATHEMATICAL SANS-SERIF SMALL U
+1D5CF;N # MATHEMATICAL SANS-SERIF SMALL V
+1D5D0;N # MATHEMATICAL SANS-SERIF SMALL W
+1D5D1;N # MATHEMATICAL SANS-SERIF SMALL X
+1D5D2;N # MATHEMATICAL SANS-SERIF SMALL Y
+1D5D3;N # MATHEMATICAL SANS-SERIF SMALL Z
+1D5D4;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL A
+1D5D5;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL B
+1D5D6;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL C
+1D5D7;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL D
+1D5D8;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL E
+1D5D9;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL F
+1D5DA;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL G
+1D5DB;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL H
+1D5DC;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL I
+1D5DD;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL J
+1D5DE;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL K
+1D5DF;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL L
+1D5E0;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL M
+1D5E1;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL N
+1D5E2;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL O
+1D5E3;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL P
+1D5E4;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q
+1D5E5;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL R
+1D5E6;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL S
+1D5E7;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL T
+1D5E8;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL U
+1D5E9;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL V
+1D5EA;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL W
+1D5EB;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL X
+1D5EC;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y
+1D5ED;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z
+1D5EE;N # MATHEMATICAL SANS-SERIF BOLD SMALL A
+1D5EF;N # MATHEMATICAL SANS-SERIF BOLD SMALL B
+1D5F0;N # MATHEMATICAL SANS-SERIF BOLD SMALL C
+1D5F1;N # MATHEMATICAL SANS-SERIF BOLD SMALL D
+1D5F2;N # MATHEMATICAL SANS-SERIF BOLD SMALL E
+1D5F3;N # MATHEMATICAL SANS-SERIF BOLD SMALL F
+1D5F4;N # MATHEMATICAL SANS-SERIF BOLD SMALL G
+1D5F5;N # MATHEMATICAL SANS-SERIF BOLD SMALL H
+1D5F6;N # MATHEMATICAL SANS-SERIF BOLD SMALL I
+1D5F7;N # MATHEMATICAL SANS-SERIF BOLD SMALL J
+1D5F8;N # MATHEMATICAL SANS-SERIF BOLD SMALL K
+1D5F9;N # MATHEMATICAL SANS-SERIF BOLD SMALL L
+1D5FA;N # MATHEMATICAL SANS-SERIF BOLD SMALL M
+1D5FB;N # MATHEMATICAL SANS-SERIF BOLD SMALL N
+1D5FC;N # MATHEMATICAL SANS-SERIF BOLD SMALL O
+1D5FD;N # MATHEMATICAL SANS-SERIF BOLD SMALL P
+1D5FE;N # MATHEMATICAL SANS-SERIF BOLD SMALL Q
+1D5FF;N # MATHEMATICAL SANS-SERIF BOLD SMALL R
+1D600;N # MATHEMATICAL SANS-SERIF BOLD SMALL S
+1D601;N # MATHEMATICAL SANS-SERIF BOLD SMALL T
+1D602;N # MATHEMATICAL SANS-SERIF BOLD SMALL U
+1D603;N # MATHEMATICAL SANS-SERIF BOLD SMALL V
+1D604;N # MATHEMATICAL SANS-SERIF BOLD SMALL W
+1D605;N # MATHEMATICAL SANS-SERIF BOLD SMALL X
+1D606;N # MATHEMATICAL SANS-SERIF BOLD SMALL Y
+1D607;N # MATHEMATICAL SANS-SERIF BOLD SMALL Z
+1D608;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A
+1D609;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B
+1D60A;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C
+1D60B;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D
+1D60C;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E
+1D60D;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F
+1D60E;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G
+1D60F;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H
+1D610;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I
+1D611;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J
+1D612;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K
+1D613;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L
+1D614;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M
+1D615;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N
+1D616;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O
+1D617;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P
+1D618;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q
+1D619;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R
+1D61A;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S
+1D61B;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T
+1D61C;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U
+1D61D;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V
+1D61E;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W
+1D61F;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X
+1D620;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y
+1D621;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z
+1D622;N # MATHEMATICAL SANS-SERIF ITALIC SMALL A
+1D623;N # MATHEMATICAL SANS-SERIF ITALIC SMALL B
+1D624;N # MATHEMATICAL SANS-SERIF ITALIC SMALL C
+1D625;N # MATHEMATICAL SANS-SERIF ITALIC SMALL D
+1D626;N # MATHEMATICAL SANS-SERIF ITALIC SMALL E
+1D627;N # MATHEMATICAL SANS-SERIF ITALIC SMALL F
+1D628;N # MATHEMATICAL SANS-SERIF ITALIC SMALL G
+1D629;N # MATHEMATICAL SANS-SERIF ITALIC SMALL H
+1D62A;N # MATHEMATICAL SANS-SERIF ITALIC SMALL I
+1D62B;N # MATHEMATICAL SANS-SERIF ITALIC SMALL J
+1D62C;N # MATHEMATICAL SANS-SERIF ITALIC SMALL K
+1D62D;N # MATHEMATICAL SANS-SERIF ITALIC SMALL L
+1D62E;N # MATHEMATICAL SANS-SERIF ITALIC SMALL M
+1D62F;N # MATHEMATICAL SANS-SERIF ITALIC SMALL N
+1D630;N # MATHEMATICAL SANS-SERIF ITALIC SMALL O
+1D631;N # MATHEMATICAL SANS-SERIF ITALIC SMALL P
+1D632;N # MATHEMATICAL SANS-SERIF ITALIC SMALL Q
+1D633;N # MATHEMATICAL SANS-SERIF ITALIC SMALL R
+1D634;N # MATHEMATICAL SANS-SERIF ITALIC SMALL S
+1D635;N # MATHEMATICAL SANS-SERIF ITALIC SMALL T
+1D636;N # MATHEMATICAL SANS-SERIF ITALIC SMALL U
+1D637;N # MATHEMATICAL SANS-SERIF ITALIC SMALL V
+1D638;N # MATHEMATICAL SANS-SERIF ITALIC SMALL W
+1D639;N # MATHEMATICAL SANS-SERIF ITALIC SMALL X
+1D63A;N # MATHEMATICAL SANS-SERIF ITALIC SMALL Y
+1D63B;N # MATHEMATICAL SANS-SERIF ITALIC SMALL Z
+1D63C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A
+1D63D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B
+1D63E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C
+1D63F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D
+1D640;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E
+1D641;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F
+1D642;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G
+1D643;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H
+1D644;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I
+1D645;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J
+1D646;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K
+1D647;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L
+1D648;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M
+1D649;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N
+1D64A;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O
+1D64B;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P
+1D64C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q
+1D64D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R
+1D64E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S
+1D64F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T
+1D650;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U
+1D651;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V
+1D652;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W
+1D653;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X
+1D654;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y
+1D655;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z
+1D656;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A
+1D657;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B
+1D658;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C
+1D659;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D
+1D65A;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E
+1D65B;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F
+1D65C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G
+1D65D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H
+1D65E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I
+1D65F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+1D660;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K
+1D661;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L
+1D662;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M
+1D663;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N
+1D664;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O
+1D665;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P
+1D666;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q
+1D667;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R
+1D668;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S
+1D669;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T
+1D66A;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U
+1D66B;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V
+1D66C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W
+1D66D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X
+1D66E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y
+1D66F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z
+1D670;N # MATHEMATICAL MONOSPACE CAPITAL A
+1D671;N # MATHEMATICAL MONOSPACE CAPITAL B
+1D672;N # MATHEMATICAL MONOSPACE CAPITAL C
+1D673;N # MATHEMATICAL MONOSPACE CAPITAL D
+1D674;N # MATHEMATICAL MONOSPACE CAPITAL E
+1D675;N # MATHEMATICAL MONOSPACE CAPITAL F
+1D676;N # MATHEMATICAL MONOSPACE CAPITAL G
+1D677;N # MATHEMATICAL MONOSPACE CAPITAL H
+1D678;N # MATHEMATICAL MONOSPACE CAPITAL I
+1D679;N # MATHEMATICAL MONOSPACE CAPITAL J
+1D67A;N # MATHEMATICAL MONOSPACE CAPITAL K
+1D67B;N # MATHEMATICAL MONOSPACE CAPITAL L
+1D67C;N # MATHEMATICAL MONOSPACE CAPITAL M
+1D67D;N # MATHEMATICAL MONOSPACE CAPITAL N
+1D67E;N # MATHEMATICAL MONOSPACE CAPITAL O
+1D67F;N # MATHEMATICAL MONOSPACE CAPITAL P
+1D680;N # MATHEMATICAL MONOSPACE CAPITAL Q
+1D681;N # MATHEMATICAL MONOSPACE CAPITAL R
+1D682;N # MATHEMATICAL MONOSPACE CAPITAL S
+1D683;N # MATHEMATICAL MONOSPACE CAPITAL T
+1D684;N # MATHEMATICAL MONOSPACE CAPITAL U
+1D685;N # MATHEMATICAL MONOSPACE CAPITAL V
+1D686;N # MATHEMATICAL MONOSPACE CAPITAL W
+1D687;N # MATHEMATICAL MONOSPACE CAPITAL X
+1D688;N # MATHEMATICAL MONOSPACE CAPITAL Y
+1D689;N # MATHEMATICAL MONOSPACE CAPITAL Z
+1D68A;N # MATHEMATICAL MONOSPACE SMALL A
+1D68B;N # MATHEMATICAL MONOSPACE SMALL B
+1D68C;N # MATHEMATICAL MONOSPACE SMALL C
+1D68D;N # MATHEMATICAL MONOSPACE SMALL D
+1D68E;N # MATHEMATICAL MONOSPACE SMALL E
+1D68F;N # MATHEMATICAL MONOSPACE SMALL F
+1D690;N # MATHEMATICAL MONOSPACE SMALL G
+1D691;N # MATHEMATICAL MONOSPACE SMALL H
+1D692;N # MATHEMATICAL MONOSPACE SMALL I
+1D693;N # MATHEMATICAL MONOSPACE SMALL J
+1D694;N # MATHEMATICAL MONOSPACE SMALL K
+1D695;N # MATHEMATICAL MONOSPACE SMALL L
+1D696;N # MATHEMATICAL MONOSPACE SMALL M
+1D697;N # MATHEMATICAL MONOSPACE SMALL N
+1D698;N # MATHEMATICAL MONOSPACE SMALL O
+1D699;N # MATHEMATICAL MONOSPACE SMALL P
+1D69A;N # MATHEMATICAL MONOSPACE SMALL Q
+1D69B;N # MATHEMATICAL MONOSPACE SMALL R
+1D69C;N # MATHEMATICAL MONOSPACE SMALL S
+1D69D;N # MATHEMATICAL MONOSPACE SMALL T
+1D69E;N # MATHEMATICAL MONOSPACE SMALL U
+1D69F;N # MATHEMATICAL MONOSPACE SMALL V
+1D6A0;N # MATHEMATICAL MONOSPACE SMALL W
+1D6A1;N # MATHEMATICAL MONOSPACE SMALL X
+1D6A2;N # MATHEMATICAL MONOSPACE SMALL Y
+1D6A3;N # MATHEMATICAL MONOSPACE SMALL Z
+1D6A4;N # MATHEMATICAL ITALIC SMALL DOTLESS I
+1D6A5;N # MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8;N # MATHEMATICAL BOLD CAPITAL ALPHA
+1D6A9;N # MATHEMATICAL BOLD CAPITAL BETA
+1D6AA;N # MATHEMATICAL BOLD CAPITAL GAMMA
+1D6AB;N # MATHEMATICAL BOLD CAPITAL DELTA
+1D6AC;N # MATHEMATICAL BOLD CAPITAL EPSILON
+1D6AD;N # MATHEMATICAL BOLD CAPITAL ZETA
+1D6AE;N # MATHEMATICAL BOLD CAPITAL ETA
+1D6AF;N # MATHEMATICAL BOLD CAPITAL THETA
+1D6B0;N # MATHEMATICAL BOLD CAPITAL IOTA
+1D6B1;N # MATHEMATICAL BOLD CAPITAL KAPPA
+1D6B2;N # MATHEMATICAL BOLD CAPITAL LAMDA
+1D6B3;N # MATHEMATICAL BOLD CAPITAL MU
+1D6B4;N # MATHEMATICAL BOLD CAPITAL NU
+1D6B5;N # MATHEMATICAL BOLD CAPITAL XI
+1D6B6;N # MATHEMATICAL BOLD CAPITAL OMICRON
+1D6B7;N # MATHEMATICAL BOLD CAPITAL PI
+1D6B8;N # MATHEMATICAL BOLD CAPITAL RHO
+1D6B9;N # MATHEMATICAL BOLD CAPITAL THETA SYMBOL
+1D6BA;N # MATHEMATICAL BOLD CAPITAL SIGMA
+1D6BB;N # MATHEMATICAL BOLD CAPITAL TAU
+1D6BC;N # MATHEMATICAL BOLD CAPITAL UPSILON
+1D6BD;N # MATHEMATICAL BOLD CAPITAL PHI
+1D6BE;N # MATHEMATICAL BOLD CAPITAL CHI
+1D6BF;N # MATHEMATICAL BOLD CAPITAL PSI
+1D6C0;N # MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1;N # MATHEMATICAL BOLD NABLA
+1D6C2;N # MATHEMATICAL BOLD SMALL ALPHA
+1D6C3;N # MATHEMATICAL BOLD SMALL BETA
+1D6C4;N # MATHEMATICAL BOLD SMALL GAMMA
+1D6C5;N # MATHEMATICAL BOLD SMALL DELTA
+1D6C6;N # MATHEMATICAL BOLD SMALL EPSILON
+1D6C7;N # MATHEMATICAL BOLD SMALL ZETA
+1D6C8;N # MATHEMATICAL BOLD SMALL ETA
+1D6C9;N # MATHEMATICAL BOLD SMALL THETA
+1D6CA;N # MATHEMATICAL BOLD SMALL IOTA
+1D6CB;N # MATHEMATICAL BOLD SMALL KAPPA
+1D6CC;N # MATHEMATICAL BOLD SMALL LAMDA
+1D6CD;N # MATHEMATICAL BOLD SMALL MU
+1D6CE;N # MATHEMATICAL BOLD SMALL NU
+1D6CF;N # MATHEMATICAL BOLD SMALL XI
+1D6D0;N # MATHEMATICAL BOLD SMALL OMICRON
+1D6D1;N # MATHEMATICAL BOLD SMALL PI
+1D6D2;N # MATHEMATICAL BOLD SMALL RHO
+1D6D3;N # MATHEMATICAL BOLD SMALL FINAL SIGMA
+1D6D4;N # MATHEMATICAL BOLD SMALL SIGMA
+1D6D5;N # MATHEMATICAL BOLD SMALL TAU
+1D6D6;N # MATHEMATICAL BOLD SMALL UPSILON
+1D6D7;N # MATHEMATICAL BOLD SMALL PHI
+1D6D8;N # MATHEMATICAL BOLD SMALL CHI
+1D6D9;N # MATHEMATICAL BOLD SMALL PSI
+1D6DA;N # MATHEMATICAL BOLD SMALL OMEGA
+1D6DB;N # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC;N # MATHEMATICAL BOLD EPSILON SYMBOL
+1D6DD;N # MATHEMATICAL BOLD THETA SYMBOL
+1D6DE;N # MATHEMATICAL BOLD KAPPA SYMBOL
+1D6DF;N # MATHEMATICAL BOLD PHI SYMBOL
+1D6E0;N # MATHEMATICAL BOLD RHO SYMBOL
+1D6E1;N # MATHEMATICAL BOLD PI SYMBOL
+1D6E2;N # MATHEMATICAL ITALIC CAPITAL ALPHA
+1D6E3;N # MATHEMATICAL ITALIC CAPITAL BETA
+1D6E4;N # MATHEMATICAL ITALIC CAPITAL GAMMA
+1D6E5;N # MATHEMATICAL ITALIC CAPITAL DELTA
+1D6E6;N # MATHEMATICAL ITALIC CAPITAL EPSILON
+1D6E7;N # MATHEMATICAL ITALIC CAPITAL ZETA
+1D6E8;N # MATHEMATICAL ITALIC CAPITAL ETA
+1D6E9;N # MATHEMATICAL ITALIC CAPITAL THETA
+1D6EA;N # MATHEMATICAL ITALIC CAPITAL IOTA
+1D6EB;N # MATHEMATICAL ITALIC CAPITAL KAPPA
+1D6EC;N # MATHEMATICAL ITALIC CAPITAL LAMDA
+1D6ED;N # MATHEMATICAL ITALIC CAPITAL MU
+1D6EE;N # MATHEMATICAL ITALIC CAPITAL NU
+1D6EF;N # MATHEMATICAL ITALIC CAPITAL XI
+1D6F0;N # MATHEMATICAL ITALIC CAPITAL OMICRON
+1D6F1;N # MATHEMATICAL ITALIC CAPITAL PI
+1D6F2;N # MATHEMATICAL ITALIC CAPITAL RHO
+1D6F3;N # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL
+1D6F4;N # MATHEMATICAL ITALIC CAPITAL SIGMA
+1D6F5;N # MATHEMATICAL ITALIC CAPITAL TAU
+1D6F6;N # MATHEMATICAL ITALIC CAPITAL UPSILON
+1D6F7;N # MATHEMATICAL ITALIC CAPITAL PHI
+1D6F8;N # MATHEMATICAL ITALIC CAPITAL CHI
+1D6F9;N # MATHEMATICAL ITALIC CAPITAL PSI
+1D6FA;N # MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB;N # MATHEMATICAL ITALIC NABLA
+1D6FC;N # MATHEMATICAL ITALIC SMALL ALPHA
+1D6FD;N # MATHEMATICAL ITALIC SMALL BETA
+1D6FE;N # MATHEMATICAL ITALIC SMALL GAMMA
+1D6FF;N # MATHEMATICAL ITALIC SMALL DELTA
+1D700;N # MATHEMATICAL ITALIC SMALL EPSILON
+1D701;N # MATHEMATICAL ITALIC SMALL ZETA
+1D702;N # MATHEMATICAL ITALIC SMALL ETA
+1D703;N # MATHEMATICAL ITALIC SMALL THETA
+1D704;N # MATHEMATICAL ITALIC SMALL IOTA
+1D705;N # MATHEMATICAL ITALIC SMALL KAPPA
+1D706;N # MATHEMATICAL ITALIC SMALL LAMDA
+1D707;N # MATHEMATICAL ITALIC SMALL MU
+1D708;N # MATHEMATICAL ITALIC SMALL NU
+1D709;N # MATHEMATICAL ITALIC SMALL XI
+1D70A;N # MATHEMATICAL ITALIC SMALL OMICRON
+1D70B;N # MATHEMATICAL ITALIC SMALL PI
+1D70C;N # MATHEMATICAL ITALIC SMALL RHO
+1D70D;N # MATHEMATICAL ITALIC SMALL FINAL SIGMA
+1D70E;N # MATHEMATICAL ITALIC SMALL SIGMA
+1D70F;N # MATHEMATICAL ITALIC SMALL TAU
+1D710;N # MATHEMATICAL ITALIC SMALL UPSILON
+1D711;N # MATHEMATICAL ITALIC SMALL PHI
+1D712;N # MATHEMATICAL ITALIC SMALL CHI
+1D713;N # MATHEMATICAL ITALIC SMALL PSI
+1D714;N # MATHEMATICAL ITALIC SMALL OMEGA
+1D715;N # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716;N # MATHEMATICAL ITALIC EPSILON SYMBOL
+1D717;N # MATHEMATICAL ITALIC THETA SYMBOL
+1D718;N # MATHEMATICAL ITALIC KAPPA SYMBOL
+1D719;N # MATHEMATICAL ITALIC PHI SYMBOL
+1D71A;N # MATHEMATICAL ITALIC RHO SYMBOL
+1D71B;N # MATHEMATICAL ITALIC PI SYMBOL
+1D71C;N # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA
+1D71D;N # MATHEMATICAL BOLD ITALIC CAPITAL BETA
+1D71E;N # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA
+1D71F;N # MATHEMATICAL BOLD ITALIC CAPITAL DELTA
+1D720;N # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON
+1D721;N # MATHEMATICAL BOLD ITALIC CAPITAL ZETA
+1D722;N # MATHEMATICAL BOLD ITALIC CAPITAL ETA
+1D723;N # MATHEMATICAL BOLD ITALIC CAPITAL THETA
+1D724;N # MATHEMATICAL BOLD ITALIC CAPITAL IOTA
+1D725;N # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA
+1D726;N # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA
+1D727;N # MATHEMATICAL BOLD ITALIC CAPITAL MU
+1D728;N # MATHEMATICAL BOLD ITALIC CAPITAL NU
+1D729;N # MATHEMATICAL BOLD ITALIC CAPITAL XI
+1D72A;N # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON
+1D72B;N # MATHEMATICAL BOLD ITALIC CAPITAL PI
+1D72C;N # MATHEMATICAL BOLD ITALIC CAPITAL RHO
+1D72D;N # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL
+1D72E;N # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA
+1D72F;N # MATHEMATICAL BOLD ITALIC CAPITAL TAU
+1D730;N # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON
+1D731;N # MATHEMATICAL BOLD ITALIC CAPITAL PHI
+1D732;N # MATHEMATICAL BOLD ITALIC CAPITAL CHI
+1D733;N # MATHEMATICAL BOLD ITALIC CAPITAL PSI
+1D734;N # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735;N # MATHEMATICAL BOLD ITALIC NABLA
+1D736;N # MATHEMATICAL BOLD ITALIC SMALL ALPHA
+1D737;N # MATHEMATICAL BOLD ITALIC SMALL BETA
+1D738;N # MATHEMATICAL BOLD ITALIC SMALL GAMMA
+1D739;N # MATHEMATICAL BOLD ITALIC SMALL DELTA
+1D73A;N # MATHEMATICAL BOLD ITALIC SMALL EPSILON
+1D73B;N # MATHEMATICAL BOLD ITALIC SMALL ZETA
+1D73C;N # MATHEMATICAL BOLD ITALIC SMALL ETA
+1D73D;N # MATHEMATICAL BOLD ITALIC SMALL THETA
+1D73E;N # MATHEMATICAL BOLD ITALIC SMALL IOTA
+1D73F;N # MATHEMATICAL BOLD ITALIC SMALL KAPPA
+1D740;N # MATHEMATICAL BOLD ITALIC SMALL LAMDA
+1D741;N # MATHEMATICAL BOLD ITALIC SMALL MU
+1D742;N # MATHEMATICAL BOLD ITALIC SMALL NU
+1D743;N # MATHEMATICAL BOLD ITALIC SMALL XI
+1D744;N # MATHEMATICAL BOLD ITALIC SMALL OMICRON
+1D745;N # MATHEMATICAL BOLD ITALIC SMALL PI
+1D746;N # MATHEMATICAL BOLD ITALIC SMALL RHO
+1D747;N # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA
+1D748;N # MATHEMATICAL BOLD ITALIC SMALL SIGMA
+1D749;N # MATHEMATICAL BOLD ITALIC SMALL TAU
+1D74A;N # MATHEMATICAL BOLD ITALIC SMALL UPSILON
+1D74B;N # MATHEMATICAL BOLD ITALIC SMALL PHI
+1D74C;N # MATHEMATICAL BOLD ITALIC SMALL CHI
+1D74D;N # MATHEMATICAL BOLD ITALIC SMALL PSI
+1D74E;N # MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F;N # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750;N # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL
+1D751;N # MATHEMATICAL BOLD ITALIC THETA SYMBOL
+1D752;N # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL
+1D753;N # MATHEMATICAL BOLD ITALIC PHI SYMBOL
+1D754;N # MATHEMATICAL BOLD ITALIC RHO SYMBOL
+1D755;N # MATHEMATICAL BOLD ITALIC PI SYMBOL
+1D756;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA
+1D757;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA
+1D758;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA
+1D759;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA
+1D75A;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON
+1D75B;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA
+1D75C;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA
+1D75D;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA
+1D75E;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA
+1D75F;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA
+1D760;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA
+1D761;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU
+1D762;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU
+1D763;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI
+1D764;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON
+1D765;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI
+1D766;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO
+1D767;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL
+1D768;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA
+1D769;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU
+1D76A;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON
+1D76B;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI
+1D76C;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI
+1D76D;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI
+1D76E;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F;N # MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770;N # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA
+1D771;N # MATHEMATICAL SANS-SERIF BOLD SMALL BETA
+1D772;N # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA
+1D773;N # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA
+1D774;N # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON
+1D775;N # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA
+1D776;N # MATHEMATICAL SANS-SERIF BOLD SMALL ETA
+1D777;N # MATHEMATICAL SANS-SERIF BOLD SMALL THETA
+1D778;N # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA
+1D779;N # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA
+1D77A;N # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA
+1D77B;N # MATHEMATICAL SANS-SERIF BOLD SMALL MU
+1D77C;N # MATHEMATICAL SANS-SERIF BOLD SMALL NU
+1D77D;N # MATHEMATICAL SANS-SERIF BOLD SMALL XI
+1D77E;N # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON
+1D77F;N # MATHEMATICAL SANS-SERIF BOLD SMALL PI
+1D780;N # MATHEMATICAL SANS-SERIF BOLD SMALL RHO
+1D781;N # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA
+1D782;N # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA
+1D783;N # MATHEMATICAL SANS-SERIF BOLD SMALL TAU
+1D784;N # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON
+1D785;N # MATHEMATICAL SANS-SERIF BOLD SMALL PHI
+1D786;N # MATHEMATICAL SANS-SERIF BOLD SMALL CHI
+1D787;N # MATHEMATICAL SANS-SERIF BOLD SMALL PSI
+1D788;N # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789;N # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A;N # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL
+1D78B;N # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL
+1D78C;N # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL
+1D78D;N # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL
+1D78E;N # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL
+1D78F;N # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL
+1D790;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA
+1D791;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA
+1D792;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA
+1D793;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA
+1D794;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON
+1D795;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA
+1D796;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA
+1D797;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA
+1D798;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA
+1D799;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA
+1D79A;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA
+1D79B;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU
+1D79C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU
+1D79D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI
+1D79E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON
+1D79F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI
+1D7A0;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO
+1D7A1;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL
+1D7A2;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA
+1D7A3;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU
+1D7A4;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON
+1D7A5;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI
+1D7A6;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI
+1D7A7;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI
+1D7A8;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9;N # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA
+1D7AB;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA
+1D7AC;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA
+1D7AD;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA
+1D7AE;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON
+1D7AF;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA
+1D7B0;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA
+1D7B1;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA
+1D7B2;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA
+1D7B3;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA
+1D7B4;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA
+1D7B5;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU
+1D7B6;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU
+1D7B7;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI
+1D7B8;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON
+1D7B9;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI
+1D7BA;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO
+1D7BB;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA
+1D7BC;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA
+1D7BD;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU
+1D7BE;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON
+1D7BF;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI
+1D7C0;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI
+1D7C1;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI
+1D7C2;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3;N # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4;N # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL
+1D7C5;N # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL
+1D7C6;N # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL
+1D7C7;N # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL
+1D7C8;N # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL
+1D7C9;N # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+1D7CA;N # MATHEMATICAL BOLD CAPITAL DIGAMMA
+1D7CB;N # MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE;N # MATHEMATICAL BOLD DIGIT ZERO
+1D7CF;N # MATHEMATICAL BOLD DIGIT ONE
+1D7D0;N # MATHEMATICAL BOLD DIGIT TWO
+1D7D1;N # MATHEMATICAL BOLD DIGIT THREE
+1D7D2;N # MATHEMATICAL BOLD DIGIT FOUR
+1D7D3;N # MATHEMATICAL BOLD DIGIT FIVE
+1D7D4;N # MATHEMATICAL BOLD DIGIT SIX
+1D7D5;N # MATHEMATICAL BOLD DIGIT SEVEN
+1D7D6;N # MATHEMATICAL BOLD DIGIT EIGHT
+1D7D7;N # MATHEMATICAL BOLD DIGIT NINE
+1D7D8;N # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO
+1D7D9;N # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
+1D7DA;N # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO
+1D7DB;N # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE
+1D7DC;N # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR
+1D7DD;N # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE
+1D7DE;N # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX
+1D7DF;N # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN
+1D7E0;N # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT
+1D7E1;N # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE
+1D7E2;N # MATHEMATICAL SANS-SERIF DIGIT ZERO
+1D7E3;N # MATHEMATICAL SANS-SERIF DIGIT ONE
+1D7E4;N # MATHEMATICAL SANS-SERIF DIGIT TWO
+1D7E5;N # MATHEMATICAL SANS-SERIF DIGIT THREE
+1D7E6;N # MATHEMATICAL SANS-SERIF DIGIT FOUR
+1D7E7;N # MATHEMATICAL SANS-SERIF DIGIT FIVE
+1D7E8;N # MATHEMATICAL SANS-SERIF DIGIT SIX
+1D7E9;N # MATHEMATICAL SANS-SERIF DIGIT SEVEN
+1D7EA;N # MATHEMATICAL SANS-SERIF DIGIT EIGHT
+1D7EB;N # MATHEMATICAL SANS-SERIF DIGIT NINE
+1D7EC;N # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO
+1D7ED;N # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE
+1D7EE;N # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO
+1D7EF;N # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE
+1D7F0;N # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR
+1D7F1;N # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE
+1D7F2;N # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX
+1D7F3;N # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN
+1D7F4;N # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT
+1D7F5;N # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE
+1D7F6;N # MATHEMATICAL MONOSPACE DIGIT ZERO
+1D7F7;N # MATHEMATICAL MONOSPACE DIGIT ONE
+1D7F8;N # MATHEMATICAL MONOSPACE DIGIT TWO
+1D7F9;N # MATHEMATICAL MONOSPACE DIGIT THREE
+1D7FA;N # MATHEMATICAL MONOSPACE DIGIT FOUR
+1D7FB;N # MATHEMATICAL MONOSPACE DIGIT FIVE
+1D7FC;N # MATHEMATICAL MONOSPACE DIGIT SIX
+1D7FD;N # MATHEMATICAL MONOSPACE DIGIT SEVEN
+1D7FE;N # MATHEMATICAL MONOSPACE DIGIT EIGHT
+1D7FF;N # MATHEMATICAL MONOSPACE DIGIT NINE
+1F000;N # MAHJONG TILE EAST WIND
+1F001;N # MAHJONG TILE SOUTH WIND
+1F002;N # MAHJONG TILE WEST WIND
+1F003;N # MAHJONG TILE NORTH WIND
+1F004;N # MAHJONG TILE RED DRAGON
+1F005;N # MAHJONG TILE GREEN DRAGON
+1F006;N # MAHJONG TILE WHITE DRAGON
+1F007;N # MAHJONG TILE ONE OF CHARACTERS
+1F008;N # MAHJONG TILE TWO OF CHARACTERS
+1F009;N # MAHJONG TILE THREE OF CHARACTERS
+1F00A;N # MAHJONG TILE FOUR OF CHARACTERS
+1F00B;N # MAHJONG TILE FIVE OF CHARACTERS
+1F00C;N # MAHJONG TILE SIX OF CHARACTERS
+1F00D;N # MAHJONG TILE SEVEN OF CHARACTERS
+1F00E;N # MAHJONG TILE EIGHT OF CHARACTERS
+1F00F;N # MAHJONG TILE NINE OF CHARACTERS
+1F010;N # MAHJONG TILE ONE OF BAMBOOS
+1F011;N # MAHJONG TILE TWO OF BAMBOOS
+1F012;N # MAHJONG TILE THREE OF BAMBOOS
+1F013;N # MAHJONG TILE FOUR OF BAMBOOS
+1F014;N # MAHJONG TILE FIVE OF BAMBOOS
+1F015;N # MAHJONG TILE SIX OF BAMBOOS
+1F016;N # MAHJONG TILE SEVEN OF BAMBOOS
+1F017;N # MAHJONG TILE EIGHT OF BAMBOOS
+1F018;N # MAHJONG TILE NINE OF BAMBOOS
+1F019;N # MAHJONG TILE ONE OF CIRCLES
+1F01A;N # MAHJONG TILE TWO OF CIRCLES
+1F01B;N # MAHJONG TILE THREE OF CIRCLES
+1F01C;N # MAHJONG TILE FOUR OF CIRCLES
+1F01D;N # MAHJONG TILE FIVE OF CIRCLES
+1F01E;N # MAHJONG TILE SIX OF CIRCLES
+1F01F;N # MAHJONG TILE SEVEN OF CIRCLES
+1F020;N # MAHJONG TILE EIGHT OF CIRCLES
+1F021;N # MAHJONG TILE NINE OF CIRCLES
+1F022;N # MAHJONG TILE PLUM
+1F023;N # MAHJONG TILE ORCHID
+1F024;N # MAHJONG TILE BAMBOO
+1F025;N # MAHJONG TILE CHRYSANTHEMUM
+1F026;N # MAHJONG TILE SPRING
+1F027;N # MAHJONG TILE SUMMER
+1F028;N # MAHJONG TILE AUTUMN
+1F029;N # MAHJONG TILE WINTER
+1F02A;N # MAHJONG TILE JOKER
+1F02B;N # MAHJONG TILE BACK
+1F030;N # DOMINO TILE HORIZONTAL BACK
+1F031;N # DOMINO TILE HORIZONTAL-00-00
+1F032;N # DOMINO TILE HORIZONTAL-00-01
+1F033;N # DOMINO TILE HORIZONTAL-00-02
+1F034;N # DOMINO TILE HORIZONTAL-00-03
+1F035;N # DOMINO TILE HORIZONTAL-00-04
+1F036;N # DOMINO TILE HORIZONTAL-00-05
+1F037;N # DOMINO TILE HORIZONTAL-00-06
+1F038;N # DOMINO TILE HORIZONTAL-01-00
+1F039;N # DOMINO TILE HORIZONTAL-01-01
+1F03A;N # DOMINO TILE HORIZONTAL-01-02
+1F03B;N # DOMINO TILE HORIZONTAL-01-03
+1F03C;N # DOMINO TILE HORIZONTAL-01-04
+1F03D;N # DOMINO TILE HORIZONTAL-01-05
+1F03E;N # DOMINO TILE HORIZONTAL-01-06
+1F03F;N # DOMINO TILE HORIZONTAL-02-00
+1F040;N # DOMINO TILE HORIZONTAL-02-01
+1F041;N # DOMINO TILE HORIZONTAL-02-02
+1F042;N # DOMINO TILE HORIZONTAL-02-03
+1F043;N # DOMINO TILE HORIZONTAL-02-04
+1F044;N # DOMINO TILE HORIZONTAL-02-05
+1F045;N # DOMINO TILE HORIZONTAL-02-06
+1F046;N # DOMINO TILE HORIZONTAL-03-00
+1F047;N # DOMINO TILE HORIZONTAL-03-01
+1F048;N # DOMINO TILE HORIZONTAL-03-02
+1F049;N # DOMINO TILE HORIZONTAL-03-03
+1F04A;N # DOMINO TILE HORIZONTAL-03-04
+1F04B;N # DOMINO TILE HORIZONTAL-03-05
+1F04C;N # DOMINO TILE HORIZONTAL-03-06
+1F04D;N # DOMINO TILE HORIZONTAL-04-00
+1F04E;N # DOMINO TILE HORIZONTAL-04-01
+1F04F;N # DOMINO TILE HORIZONTAL-04-02
+1F050;N # DOMINO TILE HORIZONTAL-04-03
+1F051;N # DOMINO TILE HORIZONTAL-04-04
+1F052;N # DOMINO TILE HORIZONTAL-04-05
+1F053;N # DOMINO TILE HORIZONTAL-04-06
+1F054;N # DOMINO TILE HORIZONTAL-05-00
+1F055;N # DOMINO TILE HORIZONTAL-05-01
+1F056;N # DOMINO TILE HORIZONTAL-05-02
+1F057;N # DOMINO TILE HORIZONTAL-05-03
+1F058;N # DOMINO TILE HORIZONTAL-05-04
+1F059;N # DOMINO TILE HORIZONTAL-05-05
+1F05A;N # DOMINO TILE HORIZONTAL-05-06
+1F05B;N # DOMINO TILE HORIZONTAL-06-00
+1F05C;N # DOMINO TILE HORIZONTAL-06-01
+1F05D;N # DOMINO TILE HORIZONTAL-06-02
+1F05E;N # DOMINO TILE HORIZONTAL-06-03
+1F05F;N # DOMINO TILE HORIZONTAL-06-04
+1F060;N # DOMINO TILE HORIZONTAL-06-05
+1F061;N # DOMINO TILE HORIZONTAL-06-06
+1F062;N # DOMINO TILE VERTICAL BACK
+1F063;N # DOMINO TILE VERTICAL-00-00
+1F064;N # DOMINO TILE VERTICAL-00-01
+1F065;N # DOMINO TILE VERTICAL-00-02
+1F066;N # DOMINO TILE VERTICAL-00-03
+1F067;N # DOMINO TILE VERTICAL-00-04
+1F068;N # DOMINO TILE VERTICAL-00-05
+1F069;N # DOMINO TILE VERTICAL-00-06
+1F06A;N # DOMINO TILE VERTICAL-01-00
+1F06B;N # DOMINO TILE VERTICAL-01-01
+1F06C;N # DOMINO TILE VERTICAL-01-02
+1F06D;N # DOMINO TILE VERTICAL-01-03
+1F06E;N # DOMINO TILE VERTICAL-01-04
+1F06F;N # DOMINO TILE VERTICAL-01-05
+1F070;N # DOMINO TILE VERTICAL-01-06
+1F071;N # DOMINO TILE VERTICAL-02-00
+1F072;N # DOMINO TILE VERTICAL-02-01
+1F073;N # DOMINO TILE VERTICAL-02-02
+1F074;N # DOMINO TILE VERTICAL-02-03
+1F075;N # DOMINO TILE VERTICAL-02-04
+1F076;N # DOMINO TILE VERTICAL-02-05
+1F077;N # DOMINO TILE VERTICAL-02-06
+1F078;N # DOMINO TILE VERTICAL-03-00
+1F079;N # DOMINO TILE VERTICAL-03-01
+1F07A;N # DOMINO TILE VERTICAL-03-02
+1F07B;N # DOMINO TILE VERTICAL-03-03
+1F07C;N # DOMINO TILE VERTICAL-03-04
+1F07D;N # DOMINO TILE VERTICAL-03-05
+1F07E;N # DOMINO TILE VERTICAL-03-06
+1F07F;N # DOMINO TILE VERTICAL-04-00
+1F080;N # DOMINO TILE VERTICAL-04-01
+1F081;N # DOMINO TILE VERTICAL-04-02
+1F082;N # DOMINO TILE VERTICAL-04-03
+1F083;N # DOMINO TILE VERTICAL-04-04
+1F084;N # DOMINO TILE VERTICAL-04-05
+1F085;N # DOMINO TILE VERTICAL-04-06
+1F086;N # DOMINO TILE VERTICAL-05-00
+1F087;N # DOMINO TILE VERTICAL-05-01
+1F088;N # DOMINO TILE VERTICAL-05-02
+1F089;N # DOMINO TILE VERTICAL-05-03
+1F08A;N # DOMINO TILE VERTICAL-05-04
+1F08B;N # DOMINO TILE VERTICAL-05-05
+1F08C;N # DOMINO TILE VERTICAL-05-06
+1F08D;N # DOMINO TILE VERTICAL-06-00
+1F08E;N # DOMINO TILE VERTICAL-06-01
+1F08F;N # DOMINO TILE VERTICAL-06-02
+1F090;N # DOMINO TILE VERTICAL-06-03
+1F091;N # DOMINO TILE VERTICAL-06-04
+1F092;N # DOMINO TILE VERTICAL-06-05
+1F093;N # DOMINO TILE VERTICAL-06-06
+20000..2A6D6;W # <CJK Ideograph Extension B, First>..<CJK Ideograph Extension B, Last>
+2A6D7..2F7FF;W # <reserved>
+2F800;W # CJK COMPATIBILITY IDEOGRAPH-2F800
+2F801;W # CJK COMPATIBILITY IDEOGRAPH-2F801
+2F802;W # CJK COMPATIBILITY IDEOGRAPH-2F802
+2F803;W # CJK COMPATIBILITY IDEOGRAPH-2F803
+2F804;W # CJK COMPATIBILITY IDEOGRAPH-2F804
+2F805;W # CJK COMPATIBILITY IDEOGRAPH-2F805
+2F806;W # CJK COMPATIBILITY IDEOGRAPH-2F806
+2F807;W # CJK COMPATIBILITY IDEOGRAPH-2F807
+2F808;W # CJK COMPATIBILITY IDEOGRAPH-2F808
+2F809;W # CJK COMPATIBILITY IDEOGRAPH-2F809
+2F80A;W # CJK COMPATIBILITY IDEOGRAPH-2F80A
+2F80B;W # CJK COMPATIBILITY IDEOGRAPH-2F80B
+2F80C;W # CJK COMPATIBILITY IDEOGRAPH-2F80C
+2F80D;W # CJK COMPATIBILITY IDEOGRAPH-2F80D
+2F80E;W # CJK COMPATIBILITY IDEOGRAPH-2F80E
+2F80F;W # CJK COMPATIBILITY IDEOGRAPH-2F80F
+2F810;W # CJK COMPATIBILITY IDEOGRAPH-2F810
+2F811;W # CJK COMPATIBILITY IDEOGRAPH-2F811
+2F812;W # CJK COMPATIBILITY IDEOGRAPH-2F812
+2F813;W # CJK COMPATIBILITY IDEOGRAPH-2F813
+2F814;W # CJK COMPATIBILITY IDEOGRAPH-2F814
+2F815;W # CJK COMPATIBILITY IDEOGRAPH-2F815
+2F816;W # CJK COMPATIBILITY IDEOGRAPH-2F816
+2F817;W # CJK COMPATIBILITY IDEOGRAPH-2F817
+2F818;W # CJK COMPATIBILITY IDEOGRAPH-2F818
+2F819;W # CJK COMPATIBILITY IDEOGRAPH-2F819
+2F81A;W # CJK COMPATIBILITY IDEOGRAPH-2F81A
+2F81B;W # CJK COMPATIBILITY IDEOGRAPH-2F81B
+2F81C;W # CJK COMPATIBILITY IDEOGRAPH-2F81C
+2F81D;W # CJK COMPATIBILITY IDEOGRAPH-2F81D
+2F81E;W # CJK COMPATIBILITY IDEOGRAPH-2F81E
+2F81F;W # CJK COMPATIBILITY IDEOGRAPH-2F81F
+2F820;W # CJK COMPATIBILITY IDEOGRAPH-2F820
+2F821;W # CJK COMPATIBILITY IDEOGRAPH-2F821
+2F822;W # CJK COMPATIBILITY IDEOGRAPH-2F822
+2F823;W # CJK COMPATIBILITY IDEOGRAPH-2F823
+2F824;W # CJK COMPATIBILITY IDEOGRAPH-2F824
+2F825;W # CJK COMPATIBILITY IDEOGRAPH-2F825
+2F826;W # CJK COMPATIBILITY IDEOGRAPH-2F826
+2F827;W # CJK COMPATIBILITY IDEOGRAPH-2F827
+2F828;W # CJK COMPATIBILITY IDEOGRAPH-2F828
+2F829;W # CJK COMPATIBILITY IDEOGRAPH-2F829
+2F82A;W # CJK COMPATIBILITY IDEOGRAPH-2F82A
+2F82B;W # CJK COMPATIBILITY IDEOGRAPH-2F82B
+2F82C;W # CJK COMPATIBILITY IDEOGRAPH-2F82C
+2F82D;W # CJK COMPATIBILITY IDEOGRAPH-2F82D
+2F82E;W # CJK COMPATIBILITY IDEOGRAPH-2F82E
+2F82F;W # CJK COMPATIBILITY IDEOGRAPH-2F82F
+2F830;W # CJK COMPATIBILITY IDEOGRAPH-2F830
+2F831;W # CJK COMPATIBILITY IDEOGRAPH-2F831
+2F832;W # CJK COMPATIBILITY IDEOGRAPH-2F832
+2F833;W # CJK COMPATIBILITY IDEOGRAPH-2F833
+2F834;W # CJK COMPATIBILITY IDEOGRAPH-2F834
+2F835;W # CJK COMPATIBILITY IDEOGRAPH-2F835
+2F836;W # CJK COMPATIBILITY IDEOGRAPH-2F836
+2F837;W # CJK COMPATIBILITY IDEOGRAPH-2F837
+2F838;W # CJK COMPATIBILITY IDEOGRAPH-2F838
+2F839;W # CJK COMPATIBILITY IDEOGRAPH-2F839
+2F83A;W # CJK COMPATIBILITY IDEOGRAPH-2F83A
+2F83B;W # CJK COMPATIBILITY IDEOGRAPH-2F83B
+2F83C;W # CJK COMPATIBILITY IDEOGRAPH-2F83C
+2F83D;W # CJK COMPATIBILITY IDEOGRAPH-2F83D
+2F83E;W # CJK COMPATIBILITY IDEOGRAPH-2F83E
+2F83F;W # CJK COMPATIBILITY IDEOGRAPH-2F83F
+2F840;W # CJK COMPATIBILITY IDEOGRAPH-2F840
+2F841;W # CJK COMPATIBILITY IDEOGRAPH-2F841
+2F842;W # CJK COMPATIBILITY IDEOGRAPH-2F842
+2F843;W # CJK COMPATIBILITY IDEOGRAPH-2F843
+2F844;W # CJK COMPATIBILITY IDEOGRAPH-2F844
+2F845;W # CJK COMPATIBILITY IDEOGRAPH-2F845
+2F846;W # CJK COMPATIBILITY IDEOGRAPH-2F846
+2F847;W # CJK COMPATIBILITY IDEOGRAPH-2F847
+2F848;W # CJK COMPATIBILITY IDEOGRAPH-2F848
+2F849;W # CJK COMPATIBILITY IDEOGRAPH-2F849
+2F84A;W # CJK COMPATIBILITY IDEOGRAPH-2F84A
+2F84B;W # CJK COMPATIBILITY IDEOGRAPH-2F84B
+2F84C;W # CJK COMPATIBILITY IDEOGRAPH-2F84C
+2F84D;W # CJK COMPATIBILITY IDEOGRAPH-2F84D
+2F84E;W # CJK COMPATIBILITY IDEOGRAPH-2F84E
+2F84F;W # CJK COMPATIBILITY IDEOGRAPH-2F84F
+2F850;W # CJK COMPATIBILITY IDEOGRAPH-2F850
+2F851;W # CJK COMPATIBILITY IDEOGRAPH-2F851
+2F852;W # CJK COMPATIBILITY IDEOGRAPH-2F852
+2F853;W # CJK COMPATIBILITY IDEOGRAPH-2F853
+2F854;W # CJK COMPATIBILITY IDEOGRAPH-2F854
+2F855;W # CJK COMPATIBILITY IDEOGRAPH-2F855
+2F856;W # CJK COMPATIBILITY IDEOGRAPH-2F856
+2F857;W # CJK COMPATIBILITY IDEOGRAPH-2F857
+2F858;W # CJK COMPATIBILITY IDEOGRAPH-2F858
+2F859;W # CJK COMPATIBILITY IDEOGRAPH-2F859
+2F85A;W # CJK COMPATIBILITY IDEOGRAPH-2F85A
+2F85B;W # CJK COMPATIBILITY IDEOGRAPH-2F85B
+2F85C;W # CJK COMPATIBILITY IDEOGRAPH-2F85C
+2F85D;W # CJK COMPATIBILITY IDEOGRAPH-2F85D
+2F85E;W # CJK COMPATIBILITY IDEOGRAPH-2F85E
+2F85F;W # CJK COMPATIBILITY IDEOGRAPH-2F85F
+2F860;W # CJK COMPATIBILITY IDEOGRAPH-2F860
+2F861;W # CJK COMPATIBILITY IDEOGRAPH-2F861
+2F862;W # CJK COMPATIBILITY IDEOGRAPH-2F862
+2F863;W # CJK COMPATIBILITY IDEOGRAPH-2F863
+2F864;W # CJK COMPATIBILITY IDEOGRAPH-2F864
+2F865;W # CJK COMPATIBILITY IDEOGRAPH-2F865
+2F866;W # CJK COMPATIBILITY IDEOGRAPH-2F866
+2F867;W # CJK COMPATIBILITY IDEOGRAPH-2F867
+2F868;W # CJK COMPATIBILITY IDEOGRAPH-2F868
+2F869;W # CJK COMPATIBILITY IDEOGRAPH-2F869
+2F86A;W # CJK COMPATIBILITY IDEOGRAPH-2F86A
+2F86B;W # CJK COMPATIBILITY IDEOGRAPH-2F86B
+2F86C;W # CJK COMPATIBILITY IDEOGRAPH-2F86C
+2F86D;W # CJK COMPATIBILITY IDEOGRAPH-2F86D
+2F86E;W # CJK COMPATIBILITY IDEOGRAPH-2F86E
+2F86F;W # CJK COMPATIBILITY IDEOGRAPH-2F86F
+2F870;W # CJK COMPATIBILITY IDEOGRAPH-2F870
+2F871;W # CJK COMPATIBILITY IDEOGRAPH-2F871
+2F872;W # CJK COMPATIBILITY IDEOGRAPH-2F872
+2F873;W # CJK COMPATIBILITY IDEOGRAPH-2F873
+2F874;W # CJK COMPATIBILITY IDEOGRAPH-2F874
+2F875;W # CJK COMPATIBILITY IDEOGRAPH-2F875
+2F876;W # CJK COMPATIBILITY IDEOGRAPH-2F876
+2F877;W # CJK COMPATIBILITY IDEOGRAPH-2F877
+2F878;W # CJK COMPATIBILITY IDEOGRAPH-2F878
+2F879;W # CJK COMPATIBILITY IDEOGRAPH-2F879
+2F87A;W # CJK COMPATIBILITY IDEOGRAPH-2F87A
+2F87B;W # CJK COMPATIBILITY IDEOGRAPH-2F87B
+2F87C;W # CJK COMPATIBILITY IDEOGRAPH-2F87C
+2F87D;W # CJK COMPATIBILITY IDEOGRAPH-2F87D
+2F87E;W # CJK COMPATIBILITY IDEOGRAPH-2F87E
+2F87F;W # CJK COMPATIBILITY IDEOGRAPH-2F87F
+2F880;W # CJK COMPATIBILITY IDEOGRAPH-2F880
+2F881;W # CJK COMPATIBILITY IDEOGRAPH-2F881
+2F882;W # CJK COMPATIBILITY IDEOGRAPH-2F882
+2F883;W # CJK COMPATIBILITY IDEOGRAPH-2F883
+2F884;W # CJK COMPATIBILITY IDEOGRAPH-2F884
+2F885;W # CJK COMPATIBILITY IDEOGRAPH-2F885
+2F886;W # CJK COMPATIBILITY IDEOGRAPH-2F886
+2F887;W # CJK COMPATIBILITY IDEOGRAPH-2F887
+2F888;W # CJK COMPATIBILITY IDEOGRAPH-2F888
+2F889;W # CJK COMPATIBILITY IDEOGRAPH-2F889
+2F88A;W # CJK COMPATIBILITY IDEOGRAPH-2F88A
+2F88B;W # CJK COMPATIBILITY IDEOGRAPH-2F88B
+2F88C;W # CJK COMPATIBILITY IDEOGRAPH-2F88C
+2F88D;W # CJK COMPATIBILITY IDEOGRAPH-2F88D
+2F88E;W # CJK COMPATIBILITY IDEOGRAPH-2F88E
+2F88F;W # CJK COMPATIBILITY IDEOGRAPH-2F88F
+2F890;W # CJK COMPATIBILITY IDEOGRAPH-2F890
+2F891;W # CJK COMPATIBILITY IDEOGRAPH-2F891
+2F892;W # CJK COMPATIBILITY IDEOGRAPH-2F892
+2F893;W # CJK COMPATIBILITY IDEOGRAPH-2F893
+2F894;W # CJK COMPATIBILITY IDEOGRAPH-2F894
+2F895;W # CJK COMPATIBILITY IDEOGRAPH-2F895
+2F896;W # CJK COMPATIBILITY IDEOGRAPH-2F896
+2F897;W # CJK COMPATIBILITY IDEOGRAPH-2F897
+2F898;W # CJK COMPATIBILITY IDEOGRAPH-2F898
+2F899;W # CJK COMPATIBILITY IDEOGRAPH-2F899
+2F89A;W # CJK COMPATIBILITY IDEOGRAPH-2F89A
+2F89B;W # CJK COMPATIBILITY IDEOGRAPH-2F89B
+2F89C;W # CJK COMPATIBILITY IDEOGRAPH-2F89C
+2F89D;W # CJK COMPATIBILITY IDEOGRAPH-2F89D
+2F89E;W # CJK COMPATIBILITY IDEOGRAPH-2F89E
+2F89F;W # CJK COMPATIBILITY IDEOGRAPH-2F89F
+2F8A0;W # CJK COMPATIBILITY IDEOGRAPH-2F8A0
+2F8A1;W # CJK COMPATIBILITY IDEOGRAPH-2F8A1
+2F8A2;W # CJK COMPATIBILITY IDEOGRAPH-2F8A2
+2F8A3;W # CJK COMPATIBILITY IDEOGRAPH-2F8A3
+2F8A4;W # CJK COMPATIBILITY IDEOGRAPH-2F8A4
+2F8A5;W # CJK COMPATIBILITY IDEOGRAPH-2F8A5
+2F8A6;W # CJK COMPATIBILITY IDEOGRAPH-2F8A6
+2F8A7;W # CJK COMPATIBILITY IDEOGRAPH-2F8A7
+2F8A8;W # CJK COMPATIBILITY IDEOGRAPH-2F8A8
+2F8A9;W # CJK COMPATIBILITY IDEOGRAPH-2F8A9
+2F8AA;W # CJK COMPATIBILITY IDEOGRAPH-2F8AA
+2F8AB;W # CJK COMPATIBILITY IDEOGRAPH-2F8AB
+2F8AC;W # CJK COMPATIBILITY IDEOGRAPH-2F8AC
+2F8AD;W # CJK COMPATIBILITY IDEOGRAPH-2F8AD
+2F8AE;W # CJK COMPATIBILITY IDEOGRAPH-2F8AE
+2F8AF;W # CJK COMPATIBILITY IDEOGRAPH-2F8AF
+2F8B0;W # CJK COMPATIBILITY IDEOGRAPH-2F8B0
+2F8B1;W # CJK COMPATIBILITY IDEOGRAPH-2F8B1
+2F8B2;W # CJK COMPATIBILITY IDEOGRAPH-2F8B2
+2F8B3;W # CJK COMPATIBILITY IDEOGRAPH-2F8B3
+2F8B4;W # CJK COMPATIBILITY IDEOGRAPH-2F8B4
+2F8B5;W # CJK COMPATIBILITY IDEOGRAPH-2F8B5
+2F8B6;W # CJK COMPATIBILITY IDEOGRAPH-2F8B6
+2F8B7;W # CJK COMPATIBILITY IDEOGRAPH-2F8B7
+2F8B8;W # CJK COMPATIBILITY IDEOGRAPH-2F8B8
+2F8B9;W # CJK COMPATIBILITY IDEOGRAPH-2F8B9
+2F8BA;W # CJK COMPATIBILITY IDEOGRAPH-2F8BA
+2F8BB;W # CJK COMPATIBILITY IDEOGRAPH-2F8BB
+2F8BC;W # CJK COMPATIBILITY IDEOGRAPH-2F8BC
+2F8BD;W # CJK COMPATIBILITY IDEOGRAPH-2F8BD
+2F8BE;W # CJK COMPATIBILITY IDEOGRAPH-2F8BE
+2F8BF;W # CJK COMPATIBILITY IDEOGRAPH-2F8BF
+2F8C0;W # CJK COMPATIBILITY IDEOGRAPH-2F8C0
+2F8C1;W # CJK COMPATIBILITY IDEOGRAPH-2F8C1
+2F8C2;W # CJK COMPATIBILITY IDEOGRAPH-2F8C2
+2F8C3;W # CJK COMPATIBILITY IDEOGRAPH-2F8C3
+2F8C4;W # CJK COMPATIBILITY IDEOGRAPH-2F8C4
+2F8C5;W # CJK COMPATIBILITY IDEOGRAPH-2F8C5
+2F8C6;W # CJK COMPATIBILITY IDEOGRAPH-2F8C6
+2F8C7;W # CJK COMPATIBILITY IDEOGRAPH-2F8C7
+2F8C8;W # CJK COMPATIBILITY IDEOGRAPH-2F8C8
+2F8C9;W # CJK COMPATIBILITY IDEOGRAPH-2F8C9
+2F8CA;W # CJK COMPATIBILITY IDEOGRAPH-2F8CA
+2F8CB;W # CJK COMPATIBILITY IDEOGRAPH-2F8CB
+2F8CC;W # CJK COMPATIBILITY IDEOGRAPH-2F8CC
+2F8CD;W # CJK COMPATIBILITY IDEOGRAPH-2F8CD
+2F8CE;W # CJK COMPATIBILITY IDEOGRAPH-2F8CE
+2F8CF;W # CJK COMPATIBILITY IDEOGRAPH-2F8CF
+2F8D0;W # CJK COMPATIBILITY IDEOGRAPH-2F8D0
+2F8D1;W # CJK COMPATIBILITY IDEOGRAPH-2F8D1
+2F8D2;W # CJK COMPATIBILITY IDEOGRAPH-2F8D2
+2F8D3;W # CJK COMPATIBILITY IDEOGRAPH-2F8D3
+2F8D4;W # CJK COMPATIBILITY IDEOGRAPH-2F8D4
+2F8D5;W # CJK COMPATIBILITY IDEOGRAPH-2F8D5
+2F8D6;W # CJK COMPATIBILITY IDEOGRAPH-2F8D6
+2F8D7;W # CJK COMPATIBILITY IDEOGRAPH-2F8D7
+2F8D8;W # CJK COMPATIBILITY IDEOGRAPH-2F8D8
+2F8D9;W # CJK COMPATIBILITY IDEOGRAPH-2F8D9
+2F8DA;W # CJK COMPATIBILITY IDEOGRAPH-2F8DA
+2F8DB;W # CJK COMPATIBILITY IDEOGRAPH-2F8DB
+2F8DC;W # CJK COMPATIBILITY IDEOGRAPH-2F8DC
+2F8DD;W # CJK COMPATIBILITY IDEOGRAPH-2F8DD
+2F8DE;W # CJK COMPATIBILITY IDEOGRAPH-2F8DE
+2F8DF;W # CJK COMPATIBILITY IDEOGRAPH-2F8DF
+2F8E0;W # CJK COMPATIBILITY IDEOGRAPH-2F8E0
+2F8E1;W # CJK COMPATIBILITY IDEOGRAPH-2F8E1
+2F8E2;W # CJK COMPATIBILITY IDEOGRAPH-2F8E2
+2F8E3;W # CJK COMPATIBILITY IDEOGRAPH-2F8E3
+2F8E4;W # CJK COMPATIBILITY IDEOGRAPH-2F8E4
+2F8E5;W # CJK COMPATIBILITY IDEOGRAPH-2F8E5
+2F8E6;W # CJK COMPATIBILITY IDEOGRAPH-2F8E6
+2F8E7;W # CJK COMPATIBILITY IDEOGRAPH-2F8E7
+2F8E8;W # CJK COMPATIBILITY IDEOGRAPH-2F8E8
+2F8E9;W # CJK COMPATIBILITY IDEOGRAPH-2F8E9
+2F8EA;W # CJK COMPATIBILITY IDEOGRAPH-2F8EA
+2F8EB;W # CJK COMPATIBILITY IDEOGRAPH-2F8EB
+2F8EC;W # CJK COMPATIBILITY IDEOGRAPH-2F8EC
+2F8ED;W # CJK COMPATIBILITY IDEOGRAPH-2F8ED
+2F8EE;W # CJK COMPATIBILITY IDEOGRAPH-2F8EE
+2F8EF;W # CJK COMPATIBILITY IDEOGRAPH-2F8EF
+2F8F0;W # CJK COMPATIBILITY IDEOGRAPH-2F8F0
+2F8F1;W # CJK COMPATIBILITY IDEOGRAPH-2F8F1
+2F8F2;W # CJK COMPATIBILITY IDEOGRAPH-2F8F2
+2F8F3;W # CJK COMPATIBILITY IDEOGRAPH-2F8F3
+2F8F4;W # CJK COMPATIBILITY IDEOGRAPH-2F8F4
+2F8F5;W # CJK COMPATIBILITY IDEOGRAPH-2F8F5
+2F8F6;W # CJK COMPATIBILITY IDEOGRAPH-2F8F6
+2F8F7;W # CJK COMPATIBILITY IDEOGRAPH-2F8F7
+2F8F8;W # CJK COMPATIBILITY IDEOGRAPH-2F8F8
+2F8F9;W # CJK COMPATIBILITY IDEOGRAPH-2F8F9
+2F8FA;W # CJK COMPATIBILITY IDEOGRAPH-2F8FA
+2F8FB;W # CJK COMPATIBILITY IDEOGRAPH-2F8FB
+2F8FC;W # CJK COMPATIBILITY IDEOGRAPH-2F8FC
+2F8FD;W # CJK COMPATIBILITY IDEOGRAPH-2F8FD
+2F8FE;W # CJK COMPATIBILITY IDEOGRAPH-2F8FE
+2F8FF;W # CJK COMPATIBILITY IDEOGRAPH-2F8FF
+2F900;W # CJK COMPATIBILITY IDEOGRAPH-2F900
+2F901;W # CJK COMPATIBILITY IDEOGRAPH-2F901
+2F902;W # CJK COMPATIBILITY IDEOGRAPH-2F902
+2F903;W # CJK COMPATIBILITY IDEOGRAPH-2F903
+2F904;W # CJK COMPATIBILITY IDEOGRAPH-2F904
+2F905;W # CJK COMPATIBILITY IDEOGRAPH-2F905
+2F906;W # CJK COMPATIBILITY IDEOGRAPH-2F906
+2F907;W # CJK COMPATIBILITY IDEOGRAPH-2F907
+2F908;W # CJK COMPATIBILITY IDEOGRAPH-2F908
+2F909;W # CJK COMPATIBILITY IDEOGRAPH-2F909
+2F90A;W # CJK COMPATIBILITY IDEOGRAPH-2F90A
+2F90B;W # CJK COMPATIBILITY IDEOGRAPH-2F90B
+2F90C;W # CJK COMPATIBILITY IDEOGRAPH-2F90C
+2F90D;W # CJK COMPATIBILITY IDEOGRAPH-2F90D
+2F90E;W # CJK COMPATIBILITY IDEOGRAPH-2F90E
+2F90F;W # CJK COMPATIBILITY IDEOGRAPH-2F90F
+2F910;W # CJK COMPATIBILITY IDEOGRAPH-2F910
+2F911;W # CJK COMPATIBILITY IDEOGRAPH-2F911
+2F912;W # CJK COMPATIBILITY IDEOGRAPH-2F912
+2F913;W # CJK COMPATIBILITY IDEOGRAPH-2F913
+2F914;W # CJK COMPATIBILITY IDEOGRAPH-2F914
+2F915;W # CJK COMPATIBILITY IDEOGRAPH-2F915
+2F916;W # CJK COMPATIBILITY IDEOGRAPH-2F916
+2F917;W # CJK COMPATIBILITY IDEOGRAPH-2F917
+2F918;W # CJK COMPATIBILITY IDEOGRAPH-2F918
+2F919;W # CJK COMPATIBILITY IDEOGRAPH-2F919
+2F91A;W # CJK COMPATIBILITY IDEOGRAPH-2F91A
+2F91B;W # CJK COMPATIBILITY IDEOGRAPH-2F91B
+2F91C;W # CJK COMPATIBILITY IDEOGRAPH-2F91C
+2F91D;W # CJK COMPATIBILITY IDEOGRAPH-2F91D
+2F91E;W # CJK COMPATIBILITY IDEOGRAPH-2F91E
+2F91F;W # CJK COMPATIBILITY IDEOGRAPH-2F91F
+2F920;W # CJK COMPATIBILITY IDEOGRAPH-2F920
+2F921;W # CJK COMPATIBILITY IDEOGRAPH-2F921
+2F922;W # CJK COMPATIBILITY IDEOGRAPH-2F922
+2F923;W # CJK COMPATIBILITY IDEOGRAPH-2F923
+2F924;W # CJK COMPATIBILITY IDEOGRAPH-2F924
+2F925;W # CJK COMPATIBILITY IDEOGRAPH-2F925
+2F926;W # CJK COMPATIBILITY IDEOGRAPH-2F926
+2F927;W # CJK COMPATIBILITY IDEOGRAPH-2F927
+2F928;W # CJK COMPATIBILITY IDEOGRAPH-2F928
+2F929;W # CJK COMPATIBILITY IDEOGRAPH-2F929
+2F92A;W # CJK COMPATIBILITY IDEOGRAPH-2F92A
+2F92B;W # CJK COMPATIBILITY IDEOGRAPH-2F92B
+2F92C;W # CJK COMPATIBILITY IDEOGRAPH-2F92C
+2F92D;W # CJK COMPATIBILITY IDEOGRAPH-2F92D
+2F92E;W # CJK COMPATIBILITY IDEOGRAPH-2F92E
+2F92F;W # CJK COMPATIBILITY IDEOGRAPH-2F92F
+2F930;W # CJK COMPATIBILITY IDEOGRAPH-2F930
+2F931;W # CJK COMPATIBILITY IDEOGRAPH-2F931
+2F932;W # CJK COMPATIBILITY IDEOGRAPH-2F932
+2F933;W # CJK COMPATIBILITY IDEOGRAPH-2F933
+2F934;W # CJK COMPATIBILITY IDEOGRAPH-2F934
+2F935;W # CJK COMPATIBILITY IDEOGRAPH-2F935
+2F936;W # CJK COMPATIBILITY IDEOGRAPH-2F936
+2F937;W # CJK COMPATIBILITY IDEOGRAPH-2F937
+2F938;W # CJK COMPATIBILITY IDEOGRAPH-2F938
+2F939;W # CJK COMPATIBILITY IDEOGRAPH-2F939
+2F93A;W # CJK COMPATIBILITY IDEOGRAPH-2F93A
+2F93B;W # CJK COMPATIBILITY IDEOGRAPH-2F93B
+2F93C;W # CJK COMPATIBILITY IDEOGRAPH-2F93C
+2F93D;W # CJK COMPATIBILITY IDEOGRAPH-2F93D
+2F93E;W # CJK COMPATIBILITY IDEOGRAPH-2F93E
+2F93F;W # CJK COMPATIBILITY IDEOGRAPH-2F93F
+2F940;W # CJK COMPATIBILITY IDEOGRAPH-2F940
+2F941;W # CJK COMPATIBILITY IDEOGRAPH-2F941
+2F942;W # CJK COMPATIBILITY IDEOGRAPH-2F942
+2F943;W # CJK COMPATIBILITY IDEOGRAPH-2F943
+2F944;W # CJK COMPATIBILITY IDEOGRAPH-2F944
+2F945;W # CJK COMPATIBILITY IDEOGRAPH-2F945
+2F946;W # CJK COMPATIBILITY IDEOGRAPH-2F946
+2F947;W # CJK COMPATIBILITY IDEOGRAPH-2F947
+2F948;W # CJK COMPATIBILITY IDEOGRAPH-2F948
+2F949;W # CJK COMPATIBILITY IDEOGRAPH-2F949
+2F94A;W # CJK COMPATIBILITY IDEOGRAPH-2F94A
+2F94B;W # CJK COMPATIBILITY IDEOGRAPH-2F94B
+2F94C;W # CJK COMPATIBILITY IDEOGRAPH-2F94C
+2F94D;W # CJK COMPATIBILITY IDEOGRAPH-2F94D
+2F94E;W # CJK COMPATIBILITY IDEOGRAPH-2F94E
+2F94F;W # CJK COMPATIBILITY IDEOGRAPH-2F94F
+2F950;W # CJK COMPATIBILITY IDEOGRAPH-2F950
+2F951;W # CJK COMPATIBILITY IDEOGRAPH-2F951
+2F952;W # CJK COMPATIBILITY IDEOGRAPH-2F952
+2F953;W # CJK COMPATIBILITY IDEOGRAPH-2F953
+2F954;W # CJK COMPATIBILITY IDEOGRAPH-2F954
+2F955;W # CJK COMPATIBILITY IDEOGRAPH-2F955
+2F956;W # CJK COMPATIBILITY IDEOGRAPH-2F956
+2F957;W # CJK COMPATIBILITY IDEOGRAPH-2F957
+2F958;W # CJK COMPATIBILITY IDEOGRAPH-2F958
+2F959;W # CJK COMPATIBILITY IDEOGRAPH-2F959
+2F95A;W # CJK COMPATIBILITY IDEOGRAPH-2F95A
+2F95B;W # CJK COMPATIBILITY IDEOGRAPH-2F95B
+2F95C;W # CJK COMPATIBILITY IDEOGRAPH-2F95C
+2F95D;W # CJK COMPATIBILITY IDEOGRAPH-2F95D
+2F95E;W # CJK COMPATIBILITY IDEOGRAPH-2F95E
+2F95F;W # CJK COMPATIBILITY IDEOGRAPH-2F95F
+2F960;W # CJK COMPATIBILITY IDEOGRAPH-2F960
+2F961;W # CJK COMPATIBILITY IDEOGRAPH-2F961
+2F962;W # CJK COMPATIBILITY IDEOGRAPH-2F962
+2F963;W # CJK COMPATIBILITY IDEOGRAPH-2F963
+2F964;W # CJK COMPATIBILITY IDEOGRAPH-2F964
+2F965;W # CJK COMPATIBILITY IDEOGRAPH-2F965
+2F966;W # CJK COMPATIBILITY IDEOGRAPH-2F966
+2F967;W # CJK COMPATIBILITY IDEOGRAPH-2F967
+2F968;W # CJK COMPATIBILITY IDEOGRAPH-2F968
+2F969;W # CJK COMPATIBILITY IDEOGRAPH-2F969
+2F96A;W # CJK COMPATIBILITY IDEOGRAPH-2F96A
+2F96B;W # CJK COMPATIBILITY IDEOGRAPH-2F96B
+2F96C;W # CJK COMPATIBILITY IDEOGRAPH-2F96C
+2F96D;W # CJK COMPATIBILITY IDEOGRAPH-2F96D
+2F96E;W # CJK COMPATIBILITY IDEOGRAPH-2F96E
+2F96F;W # CJK COMPATIBILITY IDEOGRAPH-2F96F
+2F970;W # CJK COMPATIBILITY IDEOGRAPH-2F970
+2F971;W # CJK COMPATIBILITY IDEOGRAPH-2F971
+2F972;W # CJK COMPATIBILITY IDEOGRAPH-2F972
+2F973;W # CJK COMPATIBILITY IDEOGRAPH-2F973
+2F974;W # CJK COMPATIBILITY IDEOGRAPH-2F974
+2F975;W # CJK COMPATIBILITY IDEOGRAPH-2F975
+2F976;W # CJK COMPATIBILITY IDEOGRAPH-2F976
+2F977;W # CJK COMPATIBILITY IDEOGRAPH-2F977
+2F978;W # CJK COMPATIBILITY IDEOGRAPH-2F978
+2F979;W # CJK COMPATIBILITY IDEOGRAPH-2F979
+2F97A;W # CJK COMPATIBILITY IDEOGRAPH-2F97A
+2F97B;W # CJK COMPATIBILITY IDEOGRAPH-2F97B
+2F97C;W # CJK COMPATIBILITY IDEOGRAPH-2F97C
+2F97D;W # CJK COMPATIBILITY IDEOGRAPH-2F97D
+2F97E;W # CJK COMPATIBILITY IDEOGRAPH-2F97E
+2F97F;W # CJK COMPATIBILITY IDEOGRAPH-2F97F
+2F980;W # CJK COMPATIBILITY IDEOGRAPH-2F980
+2F981;W # CJK COMPATIBILITY IDEOGRAPH-2F981
+2F982;W # CJK COMPATIBILITY IDEOGRAPH-2F982
+2F983;W # CJK COMPATIBILITY IDEOGRAPH-2F983
+2F984;W # CJK COMPATIBILITY IDEOGRAPH-2F984
+2F985;W # CJK COMPATIBILITY IDEOGRAPH-2F985
+2F986;W # CJK COMPATIBILITY IDEOGRAPH-2F986
+2F987;W # CJK COMPATIBILITY IDEOGRAPH-2F987
+2F988;W # CJK COMPATIBILITY IDEOGRAPH-2F988
+2F989;W # CJK COMPATIBILITY IDEOGRAPH-2F989
+2F98A;W # CJK COMPATIBILITY IDEOGRAPH-2F98A
+2F98B;W # CJK COMPATIBILITY IDEOGRAPH-2F98B
+2F98C;W # CJK COMPATIBILITY IDEOGRAPH-2F98C
+2F98D;W # CJK COMPATIBILITY IDEOGRAPH-2F98D
+2F98E;W # CJK COMPATIBILITY IDEOGRAPH-2F98E
+2F98F;W # CJK COMPATIBILITY IDEOGRAPH-2F98F
+2F990;W # CJK COMPATIBILITY IDEOGRAPH-2F990
+2F991;W # CJK COMPATIBILITY IDEOGRAPH-2F991
+2F992;W # CJK COMPATIBILITY IDEOGRAPH-2F992
+2F993;W # CJK COMPATIBILITY IDEOGRAPH-2F993
+2F994;W # CJK COMPATIBILITY IDEOGRAPH-2F994
+2F995;W # CJK COMPATIBILITY IDEOGRAPH-2F995
+2F996;W # CJK COMPATIBILITY IDEOGRAPH-2F996
+2F997;W # CJK COMPATIBILITY IDEOGRAPH-2F997
+2F998;W # CJK COMPATIBILITY IDEOGRAPH-2F998
+2F999;W # CJK COMPATIBILITY IDEOGRAPH-2F999
+2F99A;W # CJK COMPATIBILITY IDEOGRAPH-2F99A
+2F99B;W # CJK COMPATIBILITY IDEOGRAPH-2F99B
+2F99C;W # CJK COMPATIBILITY IDEOGRAPH-2F99C
+2F99D;W # CJK COMPATIBILITY IDEOGRAPH-2F99D
+2F99E;W # CJK COMPATIBILITY IDEOGRAPH-2F99E
+2F99F;W # CJK COMPATIBILITY IDEOGRAPH-2F99F
+2F9A0;W # CJK COMPATIBILITY IDEOGRAPH-2F9A0
+2F9A1;W # CJK COMPATIBILITY IDEOGRAPH-2F9A1
+2F9A2;W # CJK COMPATIBILITY IDEOGRAPH-2F9A2
+2F9A3;W # CJK COMPATIBILITY IDEOGRAPH-2F9A3
+2F9A4;W # CJK COMPATIBILITY IDEOGRAPH-2F9A4
+2F9A5;W # CJK COMPATIBILITY IDEOGRAPH-2F9A5
+2F9A6;W # CJK COMPATIBILITY IDEOGRAPH-2F9A6
+2F9A7;W # CJK COMPATIBILITY IDEOGRAPH-2F9A7
+2F9A8;W # CJK COMPATIBILITY IDEOGRAPH-2F9A8
+2F9A9;W # CJK COMPATIBILITY IDEOGRAPH-2F9A9
+2F9AA;W # CJK COMPATIBILITY IDEOGRAPH-2F9AA
+2F9AB;W # CJK COMPATIBILITY IDEOGRAPH-2F9AB
+2F9AC;W # CJK COMPATIBILITY IDEOGRAPH-2F9AC
+2F9AD;W # CJK COMPATIBILITY IDEOGRAPH-2F9AD
+2F9AE;W # CJK COMPATIBILITY IDEOGRAPH-2F9AE
+2F9AF;W # CJK COMPATIBILITY IDEOGRAPH-2F9AF
+2F9B0;W # CJK COMPATIBILITY IDEOGRAPH-2F9B0
+2F9B1;W # CJK COMPATIBILITY IDEOGRAPH-2F9B1
+2F9B2;W # CJK COMPATIBILITY IDEOGRAPH-2F9B2
+2F9B3;W # CJK COMPATIBILITY IDEOGRAPH-2F9B3
+2F9B4;W # CJK COMPATIBILITY IDEOGRAPH-2F9B4
+2F9B5;W # CJK COMPATIBILITY IDEOGRAPH-2F9B5
+2F9B6;W # CJK COMPATIBILITY IDEOGRAPH-2F9B6
+2F9B7;W # CJK COMPATIBILITY IDEOGRAPH-2F9B7
+2F9B8;W # CJK COMPATIBILITY IDEOGRAPH-2F9B8
+2F9B9;W # CJK COMPATIBILITY IDEOGRAPH-2F9B9
+2F9BA;W # CJK COMPATIBILITY IDEOGRAPH-2F9BA
+2F9BB;W # CJK COMPATIBILITY IDEOGRAPH-2F9BB
+2F9BC;W # CJK COMPATIBILITY IDEOGRAPH-2F9BC
+2F9BD;W # CJK COMPATIBILITY IDEOGRAPH-2F9BD
+2F9BE;W # CJK COMPATIBILITY IDEOGRAPH-2F9BE
+2F9BF;W # CJK COMPATIBILITY IDEOGRAPH-2F9BF
+2F9C0;W # CJK COMPATIBILITY IDEOGRAPH-2F9C0
+2F9C1;W # CJK COMPATIBILITY IDEOGRAPH-2F9C1
+2F9C2;W # CJK COMPATIBILITY IDEOGRAPH-2F9C2
+2F9C3;W # CJK COMPATIBILITY IDEOGRAPH-2F9C3
+2F9C4;W # CJK COMPATIBILITY IDEOGRAPH-2F9C4
+2F9C5;W # CJK COMPATIBILITY IDEOGRAPH-2F9C5
+2F9C6;W # CJK COMPATIBILITY IDEOGRAPH-2F9C6
+2F9C7;W # CJK COMPATIBILITY IDEOGRAPH-2F9C7
+2F9C8;W # CJK COMPATIBILITY IDEOGRAPH-2F9C8
+2F9C9;W # CJK COMPATIBILITY IDEOGRAPH-2F9C9
+2F9CA;W # CJK COMPATIBILITY IDEOGRAPH-2F9CA
+2F9CB;W # CJK COMPATIBILITY IDEOGRAPH-2F9CB
+2F9CC;W # CJK COMPATIBILITY IDEOGRAPH-2F9CC
+2F9CD;W # CJK COMPATIBILITY IDEOGRAPH-2F9CD
+2F9CE;W # CJK COMPATIBILITY IDEOGRAPH-2F9CE
+2F9CF;W # CJK COMPATIBILITY IDEOGRAPH-2F9CF
+2F9D0;W # CJK COMPATIBILITY IDEOGRAPH-2F9D0
+2F9D1;W # CJK COMPATIBILITY IDEOGRAPH-2F9D1
+2F9D2;W # CJK COMPATIBILITY IDEOGRAPH-2F9D2
+2F9D3;W # CJK COMPATIBILITY IDEOGRAPH-2F9D3
+2F9D4;W # CJK COMPATIBILITY IDEOGRAPH-2F9D4
+2F9D5;W # CJK COMPATIBILITY IDEOGRAPH-2F9D5
+2F9D6;W # CJK COMPATIBILITY IDEOGRAPH-2F9D6
+2F9D7;W # CJK COMPATIBILITY IDEOGRAPH-2F9D7
+2F9D8;W # CJK COMPATIBILITY IDEOGRAPH-2F9D8
+2F9D9;W # CJK COMPATIBILITY IDEOGRAPH-2F9D9
+2F9DA;W # CJK COMPATIBILITY IDEOGRAPH-2F9DA
+2F9DB;W # CJK COMPATIBILITY IDEOGRAPH-2F9DB
+2F9DC;W # CJK COMPATIBILITY IDEOGRAPH-2F9DC
+2F9DD;W # CJK COMPATIBILITY IDEOGRAPH-2F9DD
+2F9DE;W # CJK COMPATIBILITY IDEOGRAPH-2F9DE
+2F9DF;W # CJK COMPATIBILITY IDEOGRAPH-2F9DF
+2F9E0;W # CJK COMPATIBILITY IDEOGRAPH-2F9E0
+2F9E1;W # CJK COMPATIBILITY IDEOGRAPH-2F9E1
+2F9E2;W # CJK COMPATIBILITY IDEOGRAPH-2F9E2
+2F9E3;W # CJK COMPATIBILITY IDEOGRAPH-2F9E3
+2F9E4;W # CJK COMPATIBILITY IDEOGRAPH-2F9E4
+2F9E5;W # CJK COMPATIBILITY IDEOGRAPH-2F9E5
+2F9E6;W # CJK COMPATIBILITY IDEOGRAPH-2F9E6
+2F9E7;W # CJK COMPATIBILITY IDEOGRAPH-2F9E7
+2F9E8;W # CJK COMPATIBILITY IDEOGRAPH-2F9E8
+2F9E9;W # CJK COMPATIBILITY IDEOGRAPH-2F9E9
+2F9EA;W # CJK COMPATIBILITY IDEOGRAPH-2F9EA
+2F9EB;W # CJK COMPATIBILITY IDEOGRAPH-2F9EB
+2F9EC;W # CJK COMPATIBILITY IDEOGRAPH-2F9EC
+2F9ED;W # CJK COMPATIBILITY IDEOGRAPH-2F9ED
+2F9EE;W # CJK COMPATIBILITY IDEOGRAPH-2F9EE
+2F9EF;W # CJK COMPATIBILITY IDEOGRAPH-2F9EF
+2F9F0;W # CJK COMPATIBILITY IDEOGRAPH-2F9F0
+2F9F1;W # CJK COMPATIBILITY IDEOGRAPH-2F9F1
+2F9F2;W # CJK COMPATIBILITY IDEOGRAPH-2F9F2
+2F9F3;W # CJK COMPATIBILITY IDEOGRAPH-2F9F3
+2F9F4;W # CJK COMPATIBILITY IDEOGRAPH-2F9F4
+2F9F5;W # CJK COMPATIBILITY IDEOGRAPH-2F9F5
+2F9F6;W # CJK COMPATIBILITY IDEOGRAPH-2F9F6
+2F9F7;W # CJK COMPATIBILITY IDEOGRAPH-2F9F7
+2F9F8;W # CJK COMPATIBILITY IDEOGRAPH-2F9F8
+2F9F9;W # CJK COMPATIBILITY IDEOGRAPH-2F9F9
+2F9FA;W # CJK COMPATIBILITY IDEOGRAPH-2F9FA
+2F9FB;W # CJK COMPATIBILITY IDEOGRAPH-2F9FB
+2F9FC;W # CJK COMPATIBILITY IDEOGRAPH-2F9FC
+2F9FD;W # CJK COMPATIBILITY IDEOGRAPH-2F9FD
+2F9FE;W # CJK COMPATIBILITY IDEOGRAPH-2F9FE
+2F9FF;W # CJK COMPATIBILITY IDEOGRAPH-2F9FF
+2FA00;W # CJK COMPATIBILITY IDEOGRAPH-2FA00
+2FA01;W # CJK COMPATIBILITY IDEOGRAPH-2FA01
+2FA02;W # CJK COMPATIBILITY IDEOGRAPH-2FA02
+2FA03;W # CJK COMPATIBILITY IDEOGRAPH-2FA03
+2FA04;W # CJK COMPATIBILITY IDEOGRAPH-2FA04
+2FA05;W # CJK COMPATIBILITY IDEOGRAPH-2FA05
+2FA06;W # CJK COMPATIBILITY IDEOGRAPH-2FA06
+2FA07;W # CJK COMPATIBILITY IDEOGRAPH-2FA07
+2FA08;W # CJK COMPATIBILITY IDEOGRAPH-2FA08
+2FA09;W # CJK COMPATIBILITY IDEOGRAPH-2FA09
+2FA0A;W # CJK COMPATIBILITY IDEOGRAPH-2FA0A
+2FA0B;W # CJK COMPATIBILITY IDEOGRAPH-2FA0B
+2FA0C;W # CJK COMPATIBILITY IDEOGRAPH-2FA0C
+2FA0D;W # CJK COMPATIBILITY IDEOGRAPH-2FA0D
+2FA0E;W # CJK COMPATIBILITY IDEOGRAPH-2FA0E
+2FA0F;W # CJK COMPATIBILITY IDEOGRAPH-2FA0F
+2FA10;W # CJK COMPATIBILITY IDEOGRAPH-2FA10
+2FA11;W # CJK COMPATIBILITY IDEOGRAPH-2FA11
+2FA12;W # CJK COMPATIBILITY IDEOGRAPH-2FA12
+2FA13;W # CJK COMPATIBILITY IDEOGRAPH-2FA13
+2FA14;W # CJK COMPATIBILITY IDEOGRAPH-2FA14
+2FA15;W # CJK COMPATIBILITY IDEOGRAPH-2FA15
+2FA16;W # CJK COMPATIBILITY IDEOGRAPH-2FA16
+2FA17;W # CJK COMPATIBILITY IDEOGRAPH-2FA17
+2FA18;W # CJK COMPATIBILITY IDEOGRAPH-2FA18
+2FA19;W # CJK COMPATIBILITY IDEOGRAPH-2FA19
+2FA1A;W # CJK COMPATIBILITY IDEOGRAPH-2FA1A
+2FA1B;W # CJK COMPATIBILITY IDEOGRAPH-2FA1B
+2FA1C;W # CJK COMPATIBILITY IDEOGRAPH-2FA1C
+2FA1D;W # CJK COMPATIBILITY IDEOGRAPH-2FA1D
+2FA1E..2FFFD;W # <reserved>
+30000..3FFFD;W # <reserved>
+E0001;N # LANGUAGE TAG
+E0020;N # TAG SPACE
+E0021;N # TAG EXCLAMATION MARK
+E0022;N # TAG QUOTATION MARK
+E0023;N # TAG NUMBER SIGN
+E0024;N # TAG DOLLAR SIGN
+E0025;N # TAG PERCENT SIGN
+E0026;N # TAG AMPERSAND
+E0027;N # TAG APOSTROPHE
+E0028;N # TAG LEFT PARENTHESIS
+E0029;N # TAG RIGHT PARENTHESIS
+E002A;N # TAG ASTERISK
+E002B;N # TAG PLUS SIGN
+E002C;N # TAG COMMA
+E002D;N # TAG HYPHEN-MINUS
+E002E;N # TAG FULL STOP
+E002F;N # TAG SOLIDUS
+E0030;N # TAG DIGIT ZERO
+E0031;N # TAG DIGIT ONE
+E0032;N # TAG DIGIT TWO
+E0033;N # TAG DIGIT THREE
+E0034;N # TAG DIGIT FOUR
+E0035;N # TAG DIGIT FIVE
+E0036;N # TAG DIGIT SIX
+E0037;N # TAG DIGIT SEVEN
+E0038;N # TAG DIGIT EIGHT
+E0039;N # TAG DIGIT NINE
+E003A;N # TAG COLON
+E003B;N # TAG SEMICOLON
+E003C;N # TAG LESS-THAN SIGN
+E003D;N # TAG EQUALS SIGN
+E003E;N # TAG GREATER-THAN SIGN
+E003F;N # TAG QUESTION MARK
+E0040;N # TAG COMMERCIAL AT
+E0041;N # TAG LATIN CAPITAL LETTER A
+E0042;N # TAG LATIN CAPITAL LETTER B
+E0043;N # TAG LATIN CAPITAL LETTER C
+E0044;N # TAG LATIN CAPITAL LETTER D
+E0045;N # TAG LATIN CAPITAL LETTER E
+E0046;N # TAG LATIN CAPITAL LETTER F
+E0047;N # TAG LATIN CAPITAL LETTER G
+E0048;N # TAG LATIN CAPITAL LETTER H
+E0049;N # TAG LATIN CAPITAL LETTER I
+E004A;N # TAG LATIN CAPITAL LETTER J
+E004B;N # TAG LATIN CAPITAL LETTER K
+E004C;N # TAG LATIN CAPITAL LETTER L
+E004D;N # TAG LATIN CAPITAL LETTER M
+E004E;N # TAG LATIN CAPITAL LETTER N
+E004F;N # TAG LATIN CAPITAL LETTER O
+E0050;N # TAG LATIN CAPITAL LETTER P
+E0051;N # TAG LATIN CAPITAL LETTER Q
+E0052;N # TAG LATIN CAPITAL LETTER R
+E0053;N # TAG LATIN CAPITAL LETTER S
+E0054;N # TAG LATIN CAPITAL LETTER T
+E0055;N # TAG LATIN CAPITAL LETTER U
+E0056;N # TAG LATIN CAPITAL LETTER V
+E0057;N # TAG LATIN CAPITAL LETTER W
+E0058;N # TAG LATIN CAPITAL LETTER X
+E0059;N # TAG LATIN CAPITAL LETTER Y
+E005A;N # TAG LATIN CAPITAL LETTER Z
+E005B;N # TAG LEFT SQUARE BRACKET
+E005C;N # TAG REVERSE SOLIDUS
+E005D;N # TAG RIGHT SQUARE BRACKET
+E005E;N # TAG CIRCUMFLEX ACCENT
+E005F;N # TAG LOW LINE
+E0060;N # TAG GRAVE ACCENT
+E0061;N # TAG LATIN SMALL LETTER A
+E0062;N # TAG LATIN SMALL LETTER B
+E0063;N # TAG LATIN SMALL LETTER C
+E0064;N # TAG LATIN SMALL LETTER D
+E0065;N # TAG LATIN SMALL LETTER E
+E0066;N # TAG LATIN SMALL LETTER F
+E0067;N # TAG LATIN SMALL LETTER G
+E0068;N # TAG LATIN SMALL LETTER H
+E0069;N # TAG LATIN SMALL LETTER I
+E006A;N # TAG LATIN SMALL LETTER J
+E006B;N # TAG LATIN SMALL LETTER K
+E006C;N # TAG LATIN SMALL LETTER L
+E006D;N # TAG LATIN SMALL LETTER M
+E006E;N # TAG LATIN SMALL LETTER N
+E006F;N # TAG LATIN SMALL LETTER O
+E0070;N # TAG LATIN SMALL LETTER P
+E0071;N # TAG LATIN SMALL LETTER Q
+E0072;N # TAG LATIN SMALL LETTER R
+E0073;N # TAG LATIN SMALL LETTER S
+E0074;N # TAG LATIN SMALL LETTER T
+E0075;N # TAG LATIN SMALL LETTER U
+E0076;N # TAG LATIN SMALL LETTER V
+E0077;N # TAG LATIN SMALL LETTER W
+E0078;N # TAG LATIN SMALL LETTER X
+E0079;N # TAG LATIN SMALL LETTER Y
+E007A;N # TAG LATIN SMALL LETTER Z
+E007B;N # TAG LEFT CURLY BRACKET
+E007C;N # TAG VERTICAL LINE
+E007D;N # TAG RIGHT CURLY BRACKET
+E007E;N # TAG TILDE
+E007F;N # CANCEL TAG
+E0100;A # VARIATION SELECTOR-17
+E0101;A # VARIATION SELECTOR-18
+E0102;A # VARIATION SELECTOR-19
+E0103;A # VARIATION SELECTOR-20
+E0104;A # VARIATION SELECTOR-21
+E0105;A # VARIATION SELECTOR-22
+E0106;A # VARIATION SELECTOR-23
+E0107;A # VARIATION SELECTOR-24
+E0108;A # VARIATION SELECTOR-25
+E0109;A # VARIATION SELECTOR-26
+E010A;A # VARIATION SELECTOR-27
+E010B;A # VARIATION SELECTOR-28
+E010C;A # VARIATION SELECTOR-29
+E010D;A # VARIATION SELECTOR-30
+E010E;A # VARIATION SELECTOR-31
+E010F;A # VARIATION SELECTOR-32
+E0110;A # VARIATION SELECTOR-33
+E0111;A # VARIATION SELECTOR-34
+E0112;A # VARIATION SELECTOR-35
+E0113;A # VARIATION SELECTOR-36
+E0114;A # VARIATION SELECTOR-37
+E0115;A # VARIATION SELECTOR-38
+E0116;A # VARIATION SELECTOR-39
+E0117;A # VARIATION SELECTOR-40
+E0118;A # VARIATION SELECTOR-41
+E0119;A # VARIATION SELECTOR-42
+E011A;A # VARIATION SELECTOR-43
+E011B;A # VARIATION SELECTOR-44
+E011C;A # VARIATION SELECTOR-45
+E011D;A # VARIATION SELECTOR-46
+E011E;A # VARIATION SELECTOR-47
+E011F;A # VARIATION SELECTOR-48
+E0120;A # VARIATION SELECTOR-49
+E0121;A # VARIATION SELECTOR-50
+E0122;A # VARIATION SELECTOR-51
+E0123;A # VARIATION SELECTOR-52
+E0124;A # VARIATION SELECTOR-53
+E0125;A # VARIATION SELECTOR-54
+E0126;A # VARIATION SELECTOR-55
+E0127;A # VARIATION SELECTOR-56
+E0128;A # VARIATION SELECTOR-57
+E0129;A # VARIATION SELECTOR-58
+E012A;A # VARIATION SELECTOR-59
+E012B;A # VARIATION SELECTOR-60
+E012C;A # VARIATION SELECTOR-61
+E012D;A # VARIATION SELECTOR-62
+E012E;A # VARIATION SELECTOR-63
+E012F;A # VARIATION SELECTOR-64
+E0130;A # VARIATION SELECTOR-65
+E0131;A # VARIATION SELECTOR-66
+E0132;A # VARIATION SELECTOR-67
+E0133;A # VARIATION SELECTOR-68
+E0134;A # VARIATION SELECTOR-69
+E0135;A # VARIATION SELECTOR-70
+E0136;A # VARIATION SELECTOR-71
+E0137;A # VARIATION SELECTOR-72
+E0138;A # VARIATION SELECTOR-73
+E0139;A # VARIATION SELECTOR-74
+E013A;A # VARIATION SELECTOR-75
+E013B;A # VARIATION SELECTOR-76
+E013C;A # VARIATION SELECTOR-77
+E013D;A # VARIATION SELECTOR-78
+E013E;A # VARIATION SELECTOR-79
+E013F;A # VARIATION SELECTOR-80
+E0140;A # VARIATION SELECTOR-81
+E0141;A # VARIATION SELECTOR-82
+E0142;A # VARIATION SELECTOR-83
+E0143;A # VARIATION SELECTOR-84
+E0144;A # VARIATION SELECTOR-85
+E0145;A # VARIATION SELECTOR-86
+E0146;A # VARIATION SELECTOR-87
+E0147;A # VARIATION SELECTOR-88
+E0148;A # VARIATION SELECTOR-89
+E0149;A # VARIATION SELECTOR-90
+E014A;A # VARIATION SELECTOR-91
+E014B;A # VARIATION SELECTOR-92
+E014C;A # VARIATION SELECTOR-93
+E014D;A # VARIATION SELECTOR-94
+E014E;A # VARIATION SELECTOR-95
+E014F;A # VARIATION SELECTOR-96
+E0150;A # VARIATION SELECTOR-97
+E0151;A # VARIATION SELECTOR-98
+E0152;A # VARIATION SELECTOR-99
+E0153;A # VARIATION SELECTOR-100
+E0154;A # VARIATION SELECTOR-101
+E0155;A # VARIATION SELECTOR-102
+E0156;A # VARIATION SELECTOR-103
+E0157;A # VARIATION SELECTOR-104
+E0158;A # VARIATION SELECTOR-105
+E0159;A # VARIATION SELECTOR-106
+E015A;A # VARIATION SELECTOR-107
+E015B;A # VARIATION SELECTOR-108
+E015C;A # VARIATION SELECTOR-109
+E015D;A # VARIATION SELECTOR-110
+E015E;A # VARIATION SELECTOR-111
+E015F;A # VARIATION SELECTOR-112
+E0160;A # VARIATION SELECTOR-113
+E0161;A # VARIATION SELECTOR-114
+E0162;A # VARIATION SELECTOR-115
+E0163;A # VARIATION SELECTOR-116
+E0164;A # VARIATION SELECTOR-117
+E0165;A # VARIATION SELECTOR-118
+E0166;A # VARIATION SELECTOR-119
+E0167;A # VARIATION SELECTOR-120
+E0168;A # VARIATION SELECTOR-121
+E0169;A # VARIATION SELECTOR-122
+E016A;A # VARIATION SELECTOR-123
+E016B;A # VARIATION SELECTOR-124
+E016C;A # VARIATION SELECTOR-125
+E016D;A # VARIATION SELECTOR-126
+E016E;A # VARIATION SELECTOR-127
+E016F;A # VARIATION SELECTOR-128
+E0170;A # VARIATION SELECTOR-129
+E0171;A # VARIATION SELECTOR-130
+E0172;A # VARIATION SELECTOR-131
+E0173;A # VARIATION SELECTOR-132
+E0174;A # VARIATION SELECTOR-133
+E0175;A # VARIATION SELECTOR-134
+E0176;A # VARIATION SELECTOR-135
+E0177;A # VARIATION SELECTOR-136
+E0178;A # VARIATION SELECTOR-137
+E0179;A # VARIATION SELECTOR-138
+E017A;A # VARIATION SELECTOR-139
+E017B;A # VARIATION SELECTOR-140
+E017C;A # VARIATION SELECTOR-141
+E017D;A # VARIATION SELECTOR-142
+E017E;A # VARIATION SELECTOR-143
+E017F;A # VARIATION SELECTOR-144
+E0180;A # VARIATION SELECTOR-145
+E0181;A # VARIATION SELECTOR-146
+E0182;A # VARIATION SELECTOR-147
+E0183;A # VARIATION SELECTOR-148
+E0184;A # VARIATION SELECTOR-149
+E0185;A # VARIATION SELECTOR-150
+E0186;A # VARIATION SELECTOR-151
+E0187;A # VARIATION SELECTOR-152
+E0188;A # VARIATION SELECTOR-153
+E0189;A # VARIATION SELECTOR-154
+E018A;A # VARIATION SELECTOR-155
+E018B;A # VARIATION SELECTOR-156
+E018C;A # VARIATION SELECTOR-157
+E018D;A # VARIATION SELECTOR-158
+E018E;A # VARIATION SELECTOR-159
+E018F;A # VARIATION SELECTOR-160
+E0190;A # VARIATION SELECTOR-161
+E0191;A # VARIATION SELECTOR-162
+E0192;A # VARIATION SELECTOR-163
+E0193;A # VARIATION SELECTOR-164
+E0194;A # VARIATION SELECTOR-165
+E0195;A # VARIATION SELECTOR-166
+E0196;A # VARIATION SELECTOR-167
+E0197;A # VARIATION SELECTOR-168
+E0198;A # VARIATION SELECTOR-169
+E0199;A # VARIATION SELECTOR-170
+E019A;A # VARIATION SELECTOR-171
+E019B;A # VARIATION SELECTOR-172
+E019C;A # VARIATION SELECTOR-173
+E019D;A # VARIATION SELECTOR-174
+E019E;A # VARIATION SELECTOR-175
+E019F;A # VARIATION SELECTOR-176
+E01A0;A # VARIATION SELECTOR-177
+E01A1;A # VARIATION SELECTOR-178
+E01A2;A # VARIATION SELECTOR-179
+E01A3;A # VARIATION SELECTOR-180
+E01A4;A # VARIATION SELECTOR-181
+E01A5;A # VARIATION SELECTOR-182
+E01A6;A # VARIATION SELECTOR-183
+E01A7;A # VARIATION SELECTOR-184
+E01A8;A # VARIATION SELECTOR-185
+E01A9;A # VARIATION SELECTOR-186
+E01AA;A # VARIATION SELECTOR-187
+E01AB;A # VARIATION SELECTOR-188
+E01AC;A # VARIATION SELECTOR-189
+E01AD;A # VARIATION SELECTOR-190
+E01AE;A # VARIATION SELECTOR-191
+E01AF;A # VARIATION SELECTOR-192
+E01B0;A # VARIATION SELECTOR-193
+E01B1;A # VARIATION SELECTOR-194
+E01B2;A # VARIATION SELECTOR-195
+E01B3;A # VARIATION SELECTOR-196
+E01B4;A # VARIATION SELECTOR-197
+E01B5;A # VARIATION SELECTOR-198
+E01B6;A # VARIATION SELECTOR-199
+E01B7;A # VARIATION SELECTOR-200
+E01B8;A # VARIATION SELECTOR-201
+E01B9;A # VARIATION SELECTOR-202
+E01BA;A # VARIATION SELECTOR-203
+E01BB;A # VARIATION SELECTOR-204
+E01BC;A # VARIATION SELECTOR-205
+E01BD;A # VARIATION SELECTOR-206
+E01BE;A # VARIATION SELECTOR-207
+E01BF;A # VARIATION SELECTOR-208
+E01C0;A # VARIATION SELECTOR-209
+E01C1;A # VARIATION SELECTOR-210
+E01C2;A # VARIATION SELECTOR-211
+E01C3;A # VARIATION SELECTOR-212
+E01C4;A # VARIATION SELECTOR-213
+E01C5;A # VARIATION SELECTOR-214
+E01C6;A # VARIATION SELECTOR-215
+E01C7;A # VARIATION SELECTOR-216
+E01C8;A # VARIATION SELECTOR-217
+E01C9;A # VARIATION SELECTOR-218
+E01CA;A # VARIATION SELECTOR-219
+E01CB;A # VARIATION SELECTOR-220
+E01CC;A # VARIATION SELECTOR-221
+E01CD;A # VARIATION SELECTOR-222
+E01CE;A # VARIATION SELECTOR-223
+E01CF;A # VARIATION SELECTOR-224
+E01D0;A # VARIATION SELECTOR-225
+E01D1;A # VARIATION SELECTOR-226
+E01D2;A # VARIATION SELECTOR-227
+E01D3;A # VARIATION SELECTOR-228
+E01D4;A # VARIATION SELECTOR-229
+E01D5;A # VARIATION SELECTOR-230
+E01D6;A # VARIATION SELECTOR-231
+E01D7;A # VARIATION SELECTOR-232
+E01D8;A # VARIATION SELECTOR-233
+E01D9;A # VARIATION SELECTOR-234
+E01DA;A # VARIATION SELECTOR-235
+E01DB;A # VARIATION SELECTOR-236
+E01DC;A # VARIATION SELECTOR-237
+E01DD;A # VARIATION SELECTOR-238
+E01DE;A # VARIATION SELECTOR-239
+E01DF;A # VARIATION SELECTOR-240
+E01E0;A # VARIATION SELECTOR-241
+E01E1;A # VARIATION SELECTOR-242
+E01E2;A # VARIATION SELECTOR-243
+E01E3;A # VARIATION SELECTOR-244
+E01E4;A # VARIATION SELECTOR-245
+E01E5;A # VARIATION SELECTOR-246
+E01E6;A # VARIATION SELECTOR-247
+E01E7;A # VARIATION SELECTOR-248
+E01E8;A # VARIATION SELECTOR-249
+E01E9;A # VARIATION SELECTOR-250
+E01EA;A # VARIATION SELECTOR-251
+E01EB;A # VARIATION SELECTOR-252
+E01EC;A # VARIATION SELECTOR-253
+E01ED;A # VARIATION SELECTOR-254
+E01EE;A # VARIATION SELECTOR-255
+E01EF;A # VARIATION SELECTOR-256
+F0000..FFFFD;A # <Plane 15 Private Use, First>..<Plane 15 Private Use, Last>
+100000..10FFFD;A # <Plane 16 Private Use, First>..<Plane 16 Private Use, Last>
+
+# EOF
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/Exact.pl b/Master/tlpkg/tlperl.straw/lib/unicore/Exact.pl
new file mode 100755
index 00000000000..5d4e9936898
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/Exact.pl
@@ -0,0 +1,88 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+##
+## Data in this file used by ../utf8_heavy.pl
+##
+
+## Mapping from name to filename in ./lib/gc_sc
+%utf8::Exact = (
+ ASCII => 'ASCII',
+ All => 'Any',
+ Alnum => 'Alnum',
+ Alpha => 'Alpha',
+ Any => 'Any',
+ Assigned => 'Assigned',
+ Blank => 'Blank',
+ C => 'C',
+ Cc => 'Cc',
+ Cf => 'Cf',
+ Cn => 'Cn',
+ Cntrl => 'Cntrl',
+ Co => 'Co',
+ Cs => 'Cs',
+ Digit => 'Digit',
+ Graph => 'Graph',
+ HorizSpace => 'HorizSpa',
+ InGreek => 'InGreekA',
+ L => 'L',
+ LC => 'LC',
+ Ll => 'Ll',
+ Lm => 'Lm',
+ Lo => 'Lo',
+ Lower => 'Lower',
+ Lt => 'Lt',
+ Lu => 'Lu',
+ M => 'M',
+ Mc => 'Mc',
+ Me => 'Me',
+ Mn => 'Mn',
+ N => 'N',
+ Nd => 'Nd',
+ Nl => 'Nl',
+ No => 'No',
+ P => 'P',
+ Pc => 'Pc',
+ Pd => 'Pd',
+ Pe => 'Pe',
+ PerlSpace => 'PerlSpac',
+ PerlWord => 'PerlWord',
+ Pf => 'Pf',
+ Pi => 'Pi',
+ Po => 'Po',
+ PosixAlnum => 'PosixAln',
+ PosixAlpha => 'PosixAlp',
+ PosixBlank => 'PosixBla',
+ PosixCntrl => 'PosixCnt',
+ PosixDigit => 'PosixDig',
+ PosixGraph => 'PosixGra',
+ PosixLower => 'PosixLow',
+ PosixPrint => 'PosixPri',
+ PosixPunct => 'PosixPun',
+ PosixSpace => 'PosixSpa',
+ PosixUpper => 'PosixUpp',
+ Print => 'Print',
+ Ps => 'Ps',
+ Punct => 'Punct',
+ S => 'S',
+ Sc => 'Sc',
+ Sk => 'Sk',
+ Sm => 'Sm',
+ So => 'So',
+ Space => 'Space',
+ SpacePerl => 'SpacePer',
+ Title => 'Title',
+ Upper => 'Upper',
+ VertSpace => 'VertSpac',
+ Word => 'Word',
+ XDigit => 'XDigit',
+ Z => 'Z',
+ Zl => 'Zl',
+ Zp => 'Zp',
+ Zs => 'Zs',
+ _CanonDCIJ => '_CanonDC',
+ _CaseIgnorable => '_CaseIgn',
+ _CombAbove => '_CombAbo',
+);
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/HangulSyllableType.txt b/Master/tlpkg/tlperl.straw/lib/unicore/HangulSyllableType.txt
new file mode 100755
index 00000000000..c5a8b5fd72f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/HangulSyllableType.txt
@@ -0,0 +1,855 @@
+# HangulSyllableType-5.1.0.txt
+# Date: 2008-03-03, 21:57:58 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+
+# ================================================
+
+# Property: Hangul_Syllable_Type
+
+# All code points not explicitly listed for Hangul_Syllable_Type
+# have the value Not_Applicable (NA).
+
+# @missing: 0000..10FFFF; Not_Applicable
+
+# ================================================
+
+# Hangul_Syllable_Type=Leading_Jamo
+
+1100..1159 ; L # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH
+115F ; L # Lo HANGUL CHOSEONG FILLER
+
+# Total code points: 91
+
+# ================================================
+
+# Hangul_Syllable_Type=Vowel_Jamo
+
+1160..11A2 ; V # Lo [67] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA
+
+# Total code points: 67
+
+# ================================================
+
+# Hangul_Syllable_Type=Trailing_Jamo
+
+11A8..11F9 ; T # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH
+
+# Total code points: 82
+
+# ================================================
+
+# Hangul_Syllable_Type=LV_Syllable
+
+AC00 ; LV # Lo HANGUL SYLLABLE GA
+AC1C ; LV # Lo HANGUL SYLLABLE GAE
+AC38 ; LV # Lo HANGUL SYLLABLE GYA
+AC54 ; LV # Lo HANGUL SYLLABLE GYAE
+AC70 ; LV # Lo HANGUL SYLLABLE GEO
+AC8C ; LV # Lo HANGUL SYLLABLE GE
+ACA8 ; LV # Lo HANGUL SYLLABLE GYEO
+ACC4 ; LV # Lo HANGUL SYLLABLE GYE
+ACE0 ; LV # Lo HANGUL SYLLABLE GO
+ACFC ; LV # Lo HANGUL SYLLABLE GWA
+AD18 ; LV # Lo HANGUL SYLLABLE GWAE
+AD34 ; LV # Lo HANGUL SYLLABLE GOE
+AD50 ; LV # Lo HANGUL SYLLABLE GYO
+AD6C ; LV # Lo HANGUL SYLLABLE GU
+AD88 ; LV # Lo HANGUL SYLLABLE GWEO
+ADA4 ; LV # Lo HANGUL SYLLABLE GWE
+ADC0 ; LV # Lo HANGUL SYLLABLE GWI
+ADDC ; LV # Lo HANGUL SYLLABLE GYU
+ADF8 ; LV # Lo HANGUL SYLLABLE GEU
+AE14 ; LV # Lo HANGUL SYLLABLE GYI
+AE30 ; LV # Lo HANGUL SYLLABLE GI
+AE4C ; LV # Lo HANGUL SYLLABLE GGA
+AE68 ; LV # Lo HANGUL SYLLABLE GGAE
+AE84 ; LV # Lo HANGUL SYLLABLE GGYA
+AEA0 ; LV # Lo HANGUL SYLLABLE GGYAE
+AEBC ; LV # Lo HANGUL SYLLABLE GGEO
+AED8 ; LV # Lo HANGUL SYLLABLE GGE
+AEF4 ; LV # Lo HANGUL SYLLABLE GGYEO
+AF10 ; LV # Lo HANGUL SYLLABLE GGYE
+AF2C ; LV # Lo HANGUL SYLLABLE GGO
+AF48 ; LV # Lo HANGUL SYLLABLE GGWA
+AF64 ; LV # Lo HANGUL SYLLABLE GGWAE
+AF80 ; LV # Lo HANGUL SYLLABLE GGOE
+AF9C ; LV # Lo HANGUL SYLLABLE GGYO
+AFB8 ; LV # Lo HANGUL SYLLABLE GGU
+AFD4 ; LV # Lo HANGUL SYLLABLE GGWEO
+AFF0 ; LV # Lo HANGUL SYLLABLE GGWE
+B00C ; LV # Lo HANGUL SYLLABLE GGWI
+B028 ; LV # Lo HANGUL SYLLABLE GGYU
+B044 ; LV # Lo HANGUL SYLLABLE GGEU
+B060 ; LV # Lo HANGUL SYLLABLE GGYI
+B07C ; LV # Lo HANGUL SYLLABLE GGI
+B098 ; LV # Lo HANGUL SYLLABLE NA
+B0B4 ; LV # Lo HANGUL SYLLABLE NAE
+B0D0 ; LV # Lo HANGUL SYLLABLE NYA
+B0EC ; LV # Lo HANGUL SYLLABLE NYAE
+B108 ; LV # Lo HANGUL SYLLABLE NEO
+B124 ; LV # Lo HANGUL SYLLABLE NE
+B140 ; LV # Lo HANGUL SYLLABLE NYEO
+B15C ; LV # Lo HANGUL SYLLABLE NYE
+B178 ; LV # Lo HANGUL SYLLABLE NO
+B194 ; LV # Lo HANGUL SYLLABLE NWA
+B1B0 ; LV # Lo HANGUL SYLLABLE NWAE
+B1CC ; LV # Lo HANGUL SYLLABLE NOE
+B1E8 ; LV # Lo HANGUL SYLLABLE NYO
+B204 ; LV # Lo HANGUL SYLLABLE NU
+B220 ; LV # Lo HANGUL SYLLABLE NWEO
+B23C ; LV # Lo HANGUL SYLLABLE NWE
+B258 ; LV # Lo HANGUL SYLLABLE NWI
+B274 ; LV # Lo HANGUL SYLLABLE NYU
+B290 ; LV # Lo HANGUL SYLLABLE NEU
+B2AC ; LV # Lo HANGUL SYLLABLE NYI
+B2C8 ; LV # Lo HANGUL SYLLABLE NI
+B2E4 ; LV # Lo HANGUL SYLLABLE DA
+B300 ; LV # Lo HANGUL SYLLABLE DAE
+B31C ; LV # Lo HANGUL SYLLABLE DYA
+B338 ; LV # Lo HANGUL SYLLABLE DYAE
+B354 ; LV # Lo HANGUL SYLLABLE DEO
+B370 ; LV # Lo HANGUL SYLLABLE DE
+B38C ; LV # Lo HANGUL SYLLABLE DYEO
+B3A8 ; LV # Lo HANGUL SYLLABLE DYE
+B3C4 ; LV # Lo HANGUL SYLLABLE DO
+B3E0 ; LV # Lo HANGUL SYLLABLE DWA
+B3FC ; LV # Lo HANGUL SYLLABLE DWAE
+B418 ; LV # Lo HANGUL SYLLABLE DOE
+B434 ; LV # Lo HANGUL SYLLABLE DYO
+B450 ; LV # Lo HANGUL SYLLABLE DU
+B46C ; LV # Lo HANGUL SYLLABLE DWEO
+B488 ; LV # Lo HANGUL SYLLABLE DWE
+B4A4 ; LV # Lo HANGUL SYLLABLE DWI
+B4C0 ; LV # Lo HANGUL SYLLABLE DYU
+B4DC ; LV # Lo HANGUL SYLLABLE DEU
+B4F8 ; LV # Lo HANGUL SYLLABLE DYI
+B514 ; LV # Lo HANGUL SYLLABLE DI
+B530 ; LV # Lo HANGUL SYLLABLE DDA
+B54C ; LV # Lo HANGUL SYLLABLE DDAE
+B568 ; LV # Lo HANGUL SYLLABLE DDYA
+B584 ; LV # Lo HANGUL SYLLABLE DDYAE
+B5A0 ; LV # Lo HANGUL SYLLABLE DDEO
+B5BC ; LV # Lo HANGUL SYLLABLE DDE
+B5D8 ; LV # Lo HANGUL SYLLABLE DDYEO
+B5F4 ; LV # Lo HANGUL SYLLABLE DDYE
+B610 ; LV # Lo HANGUL SYLLABLE DDO
+B62C ; LV # Lo HANGUL SYLLABLE DDWA
+B648 ; LV # Lo HANGUL SYLLABLE DDWAE
+B664 ; LV # Lo HANGUL SYLLABLE DDOE
+B680 ; LV # Lo HANGUL SYLLABLE DDYO
+B69C ; LV # Lo HANGUL SYLLABLE DDU
+B6B8 ; LV # Lo HANGUL SYLLABLE DDWEO
+B6D4 ; LV # Lo HANGUL SYLLABLE DDWE
+B6F0 ; LV # Lo HANGUL SYLLABLE DDWI
+B70C ; LV # Lo HANGUL SYLLABLE DDYU
+B728 ; LV # Lo HANGUL SYLLABLE DDEU
+B744 ; LV # Lo HANGUL SYLLABLE DDYI
+B760 ; LV # Lo HANGUL SYLLABLE DDI
+B77C ; LV # Lo HANGUL SYLLABLE RA
+B798 ; LV # Lo HANGUL SYLLABLE RAE
+B7B4 ; LV # Lo HANGUL SYLLABLE RYA
+B7D0 ; LV # Lo HANGUL SYLLABLE RYAE
+B7EC ; LV # Lo HANGUL SYLLABLE REO
+B808 ; LV # Lo HANGUL SYLLABLE RE
+B824 ; LV # Lo HANGUL SYLLABLE RYEO
+B840 ; LV # Lo HANGUL SYLLABLE RYE
+B85C ; LV # Lo HANGUL SYLLABLE RO
+B878 ; LV # Lo HANGUL SYLLABLE RWA
+B894 ; LV # Lo HANGUL SYLLABLE RWAE
+B8B0 ; LV # Lo HANGUL SYLLABLE ROE
+B8CC ; LV # Lo HANGUL SYLLABLE RYO
+B8E8 ; LV # Lo HANGUL SYLLABLE RU
+B904 ; LV # Lo HANGUL SYLLABLE RWEO
+B920 ; LV # Lo HANGUL SYLLABLE RWE
+B93C ; LV # Lo HANGUL SYLLABLE RWI
+B958 ; LV # Lo HANGUL SYLLABLE RYU
+B974 ; LV # Lo HANGUL SYLLABLE REU
+B990 ; LV # Lo HANGUL SYLLABLE RYI
+B9AC ; LV # Lo HANGUL SYLLABLE RI
+B9C8 ; LV # Lo HANGUL SYLLABLE MA
+B9E4 ; LV # Lo HANGUL SYLLABLE MAE
+BA00 ; LV # Lo HANGUL SYLLABLE MYA
+BA1C ; LV # Lo HANGUL SYLLABLE MYAE
+BA38 ; LV # Lo HANGUL SYLLABLE MEO
+BA54 ; LV # Lo HANGUL SYLLABLE ME
+BA70 ; LV # Lo HANGUL SYLLABLE MYEO
+BA8C ; LV # Lo HANGUL SYLLABLE MYE
+BAA8 ; LV # Lo HANGUL SYLLABLE MO
+BAC4 ; LV # Lo HANGUL SYLLABLE MWA
+BAE0 ; LV # Lo HANGUL SYLLABLE MWAE
+BAFC ; LV # Lo HANGUL SYLLABLE MOE
+BB18 ; LV # Lo HANGUL SYLLABLE MYO
+BB34 ; LV # Lo HANGUL SYLLABLE MU
+BB50 ; LV # Lo HANGUL SYLLABLE MWEO
+BB6C ; LV # Lo HANGUL SYLLABLE MWE
+BB88 ; LV # Lo HANGUL SYLLABLE MWI
+BBA4 ; LV # Lo HANGUL SYLLABLE MYU
+BBC0 ; LV # Lo HANGUL SYLLABLE MEU
+BBDC ; LV # Lo HANGUL SYLLABLE MYI
+BBF8 ; LV # Lo HANGUL SYLLABLE MI
+BC14 ; LV # Lo HANGUL SYLLABLE BA
+BC30 ; LV # Lo HANGUL SYLLABLE BAE
+BC4C ; LV # Lo HANGUL SYLLABLE BYA
+BC68 ; LV # Lo HANGUL SYLLABLE BYAE
+BC84 ; LV # Lo HANGUL SYLLABLE BEO
+BCA0 ; LV # Lo HANGUL SYLLABLE BE
+BCBC ; LV # Lo HANGUL SYLLABLE BYEO
+BCD8 ; LV # Lo HANGUL SYLLABLE BYE
+BCF4 ; LV # Lo HANGUL SYLLABLE BO
+BD10 ; LV # Lo HANGUL SYLLABLE BWA
+BD2C ; LV # Lo HANGUL SYLLABLE BWAE
+BD48 ; LV # Lo HANGUL SYLLABLE BOE
+BD64 ; LV # Lo HANGUL SYLLABLE BYO
+BD80 ; LV # Lo HANGUL SYLLABLE BU
+BD9C ; LV # Lo HANGUL SYLLABLE BWEO
+BDB8 ; LV # Lo HANGUL SYLLABLE BWE
+BDD4 ; LV # Lo HANGUL SYLLABLE BWI
+BDF0 ; LV # Lo HANGUL SYLLABLE BYU
+BE0C ; LV # Lo HANGUL SYLLABLE BEU
+BE28 ; LV # Lo HANGUL SYLLABLE BYI
+BE44 ; LV # Lo HANGUL SYLLABLE BI
+BE60 ; LV # Lo HANGUL SYLLABLE BBA
+BE7C ; LV # Lo HANGUL SYLLABLE BBAE
+BE98 ; LV # Lo HANGUL SYLLABLE BBYA
+BEB4 ; LV # Lo HANGUL SYLLABLE BBYAE
+BED0 ; LV # Lo HANGUL SYLLABLE BBEO
+BEEC ; LV # Lo HANGUL SYLLABLE BBE
+BF08 ; LV # Lo HANGUL SYLLABLE BBYEO
+BF24 ; LV # Lo HANGUL SYLLABLE BBYE
+BF40 ; LV # Lo HANGUL SYLLABLE BBO
+BF5C ; LV # Lo HANGUL SYLLABLE BBWA
+BF78 ; LV # Lo HANGUL SYLLABLE BBWAE
+BF94 ; LV # Lo HANGUL SYLLABLE BBOE
+BFB0 ; LV # Lo HANGUL SYLLABLE BBYO
+BFCC ; LV # Lo HANGUL SYLLABLE BBU
+BFE8 ; LV # Lo HANGUL SYLLABLE BBWEO
+C004 ; LV # Lo HANGUL SYLLABLE BBWE
+C020 ; LV # Lo HANGUL SYLLABLE BBWI
+C03C ; LV # Lo HANGUL SYLLABLE BBYU
+C058 ; LV # Lo HANGUL SYLLABLE BBEU
+C074 ; LV # Lo HANGUL SYLLABLE BBYI
+C090 ; LV # Lo HANGUL SYLLABLE BBI
+C0AC ; LV # Lo HANGUL SYLLABLE SA
+C0C8 ; LV # Lo HANGUL SYLLABLE SAE
+C0E4 ; LV # Lo HANGUL SYLLABLE SYA
+C100 ; LV # Lo HANGUL SYLLABLE SYAE
+C11C ; LV # Lo HANGUL SYLLABLE SEO
+C138 ; LV # Lo HANGUL SYLLABLE SE
+C154 ; LV # Lo HANGUL SYLLABLE SYEO
+C170 ; LV # Lo HANGUL SYLLABLE SYE
+C18C ; LV # Lo HANGUL SYLLABLE SO
+C1A8 ; LV # Lo HANGUL SYLLABLE SWA
+C1C4 ; LV # Lo HANGUL SYLLABLE SWAE
+C1E0 ; LV # Lo HANGUL SYLLABLE SOE
+C1FC ; LV # Lo HANGUL SYLLABLE SYO
+C218 ; LV # Lo HANGUL SYLLABLE SU
+C234 ; LV # Lo HANGUL SYLLABLE SWEO
+C250 ; LV # Lo HANGUL SYLLABLE SWE
+C26C ; LV # Lo HANGUL SYLLABLE SWI
+C288 ; LV # Lo HANGUL SYLLABLE SYU
+C2A4 ; LV # Lo HANGUL SYLLABLE SEU
+C2C0 ; LV # Lo HANGUL SYLLABLE SYI
+C2DC ; LV # Lo HANGUL SYLLABLE SI
+C2F8 ; LV # Lo HANGUL SYLLABLE SSA
+C314 ; LV # Lo HANGUL SYLLABLE SSAE
+C330 ; LV # Lo HANGUL SYLLABLE SSYA
+C34C ; LV # Lo HANGUL SYLLABLE SSYAE
+C368 ; LV # Lo HANGUL SYLLABLE SSEO
+C384 ; LV # Lo HANGUL SYLLABLE SSE
+C3A0 ; LV # Lo HANGUL SYLLABLE SSYEO
+C3BC ; LV # Lo HANGUL SYLLABLE SSYE
+C3D8 ; LV # Lo HANGUL SYLLABLE SSO
+C3F4 ; LV # Lo HANGUL SYLLABLE SSWA
+C410 ; LV # Lo HANGUL SYLLABLE SSWAE
+C42C ; LV # Lo HANGUL SYLLABLE SSOE
+C448 ; LV # Lo HANGUL SYLLABLE SSYO
+C464 ; LV # Lo HANGUL SYLLABLE SSU
+C480 ; LV # Lo HANGUL SYLLABLE SSWEO
+C49C ; LV # Lo HANGUL SYLLABLE SSWE
+C4B8 ; LV # Lo HANGUL SYLLABLE SSWI
+C4D4 ; LV # Lo HANGUL SYLLABLE SSYU
+C4F0 ; LV # Lo HANGUL SYLLABLE SSEU
+C50C ; LV # Lo HANGUL SYLLABLE SSYI
+C528 ; LV # Lo HANGUL SYLLABLE SSI
+C544 ; LV # Lo HANGUL SYLLABLE A
+C560 ; LV # Lo HANGUL SYLLABLE AE
+C57C ; LV # Lo HANGUL SYLLABLE YA
+C598 ; LV # Lo HANGUL SYLLABLE YAE
+C5B4 ; LV # Lo HANGUL SYLLABLE EO
+C5D0 ; LV # Lo HANGUL SYLLABLE E
+C5EC ; LV # Lo HANGUL SYLLABLE YEO
+C608 ; LV # Lo HANGUL SYLLABLE YE
+C624 ; LV # Lo HANGUL SYLLABLE O
+C640 ; LV # Lo HANGUL SYLLABLE WA
+C65C ; LV # Lo HANGUL SYLLABLE WAE
+C678 ; LV # Lo HANGUL SYLLABLE OE
+C694 ; LV # Lo HANGUL SYLLABLE YO
+C6B0 ; LV # Lo HANGUL SYLLABLE U
+C6CC ; LV # Lo HANGUL SYLLABLE WEO
+C6E8 ; LV # Lo HANGUL SYLLABLE WE
+C704 ; LV # Lo HANGUL SYLLABLE WI
+C720 ; LV # Lo HANGUL SYLLABLE YU
+C73C ; LV # Lo HANGUL SYLLABLE EU
+C758 ; LV # Lo HANGUL SYLLABLE YI
+C774 ; LV # Lo HANGUL SYLLABLE I
+C790 ; LV # Lo HANGUL SYLLABLE JA
+C7AC ; LV # Lo HANGUL SYLLABLE JAE
+C7C8 ; LV # Lo HANGUL SYLLABLE JYA
+C7E4 ; LV # Lo HANGUL SYLLABLE JYAE
+C800 ; LV # Lo HANGUL SYLLABLE JEO
+C81C ; LV # Lo HANGUL SYLLABLE JE
+C838 ; LV # Lo HANGUL SYLLABLE JYEO
+C854 ; LV # Lo HANGUL SYLLABLE JYE
+C870 ; LV # Lo HANGUL SYLLABLE JO
+C88C ; LV # Lo HANGUL SYLLABLE JWA
+C8A8 ; LV # Lo HANGUL SYLLABLE JWAE
+C8C4 ; LV # Lo HANGUL SYLLABLE JOE
+C8E0 ; LV # Lo HANGUL SYLLABLE JYO
+C8FC ; LV # Lo HANGUL SYLLABLE JU
+C918 ; LV # Lo HANGUL SYLLABLE JWEO
+C934 ; LV # Lo HANGUL SYLLABLE JWE
+C950 ; LV # Lo HANGUL SYLLABLE JWI
+C96C ; LV # Lo HANGUL SYLLABLE JYU
+C988 ; LV # Lo HANGUL SYLLABLE JEU
+C9A4 ; LV # Lo HANGUL SYLLABLE JYI
+C9C0 ; LV # Lo HANGUL SYLLABLE JI
+C9DC ; LV # Lo HANGUL SYLLABLE JJA
+C9F8 ; LV # Lo HANGUL SYLLABLE JJAE
+CA14 ; LV # Lo HANGUL SYLLABLE JJYA
+CA30 ; LV # Lo HANGUL SYLLABLE JJYAE
+CA4C ; LV # Lo HANGUL SYLLABLE JJEO
+CA68 ; LV # Lo HANGUL SYLLABLE JJE
+CA84 ; LV # Lo HANGUL SYLLABLE JJYEO
+CAA0 ; LV # Lo HANGUL SYLLABLE JJYE
+CABC ; LV # Lo HANGUL SYLLABLE JJO
+CAD8 ; LV # Lo HANGUL SYLLABLE JJWA
+CAF4 ; LV # Lo HANGUL SYLLABLE JJWAE
+CB10 ; LV # Lo HANGUL SYLLABLE JJOE
+CB2C ; LV # Lo HANGUL SYLLABLE JJYO
+CB48 ; LV # Lo HANGUL SYLLABLE JJU
+CB64 ; LV # Lo HANGUL SYLLABLE JJWEO
+CB80 ; LV # Lo HANGUL SYLLABLE JJWE
+CB9C ; LV # Lo HANGUL SYLLABLE JJWI
+CBB8 ; LV # Lo HANGUL SYLLABLE JJYU
+CBD4 ; LV # Lo HANGUL SYLLABLE JJEU
+CBF0 ; LV # Lo HANGUL SYLLABLE JJYI
+CC0C ; LV # Lo HANGUL SYLLABLE JJI
+CC28 ; LV # Lo HANGUL SYLLABLE CA
+CC44 ; LV # Lo HANGUL SYLLABLE CAE
+CC60 ; LV # Lo HANGUL SYLLABLE CYA
+CC7C ; LV # Lo HANGUL SYLLABLE CYAE
+CC98 ; LV # Lo HANGUL SYLLABLE CEO
+CCB4 ; LV # Lo HANGUL SYLLABLE CE
+CCD0 ; LV # Lo HANGUL SYLLABLE CYEO
+CCEC ; LV # Lo HANGUL SYLLABLE CYE
+CD08 ; LV # Lo HANGUL SYLLABLE CO
+CD24 ; LV # Lo HANGUL SYLLABLE CWA
+CD40 ; LV # Lo HANGUL SYLLABLE CWAE
+CD5C ; LV # Lo HANGUL SYLLABLE COE
+CD78 ; LV # Lo HANGUL SYLLABLE CYO
+CD94 ; LV # Lo HANGUL SYLLABLE CU
+CDB0 ; LV # Lo HANGUL SYLLABLE CWEO
+CDCC ; LV # Lo HANGUL SYLLABLE CWE
+CDE8 ; LV # Lo HANGUL SYLLABLE CWI
+CE04 ; LV # Lo HANGUL SYLLABLE CYU
+CE20 ; LV # Lo HANGUL SYLLABLE CEU
+CE3C ; LV # Lo HANGUL SYLLABLE CYI
+CE58 ; LV # Lo HANGUL SYLLABLE CI
+CE74 ; LV # Lo HANGUL SYLLABLE KA
+CE90 ; LV # Lo HANGUL SYLLABLE KAE
+CEAC ; LV # Lo HANGUL SYLLABLE KYA
+CEC8 ; LV # Lo HANGUL SYLLABLE KYAE
+CEE4 ; LV # Lo HANGUL SYLLABLE KEO
+CF00 ; LV # Lo HANGUL SYLLABLE KE
+CF1C ; LV # Lo HANGUL SYLLABLE KYEO
+CF38 ; LV # Lo HANGUL SYLLABLE KYE
+CF54 ; LV # Lo HANGUL SYLLABLE KO
+CF70 ; LV # Lo HANGUL SYLLABLE KWA
+CF8C ; LV # Lo HANGUL SYLLABLE KWAE
+CFA8 ; LV # Lo HANGUL SYLLABLE KOE
+CFC4 ; LV # Lo HANGUL SYLLABLE KYO
+CFE0 ; LV # Lo HANGUL SYLLABLE KU
+CFFC ; LV # Lo HANGUL SYLLABLE KWEO
+D018 ; LV # Lo HANGUL SYLLABLE KWE
+D034 ; LV # Lo HANGUL SYLLABLE KWI
+D050 ; LV # Lo HANGUL SYLLABLE KYU
+D06C ; LV # Lo HANGUL SYLLABLE KEU
+D088 ; LV # Lo HANGUL SYLLABLE KYI
+D0A4 ; LV # Lo HANGUL SYLLABLE KI
+D0C0 ; LV # Lo HANGUL SYLLABLE TA
+D0DC ; LV # Lo HANGUL SYLLABLE TAE
+D0F8 ; LV # Lo HANGUL SYLLABLE TYA
+D114 ; LV # Lo HANGUL SYLLABLE TYAE
+D130 ; LV # Lo HANGUL SYLLABLE TEO
+D14C ; LV # Lo HANGUL SYLLABLE TE
+D168 ; LV # Lo HANGUL SYLLABLE TYEO
+D184 ; LV # Lo HANGUL SYLLABLE TYE
+D1A0 ; LV # Lo HANGUL SYLLABLE TO
+D1BC ; LV # Lo HANGUL SYLLABLE TWA
+D1D8 ; LV # Lo HANGUL SYLLABLE TWAE
+D1F4 ; LV # Lo HANGUL SYLLABLE TOE
+D210 ; LV # Lo HANGUL SYLLABLE TYO
+D22C ; LV # Lo HANGUL SYLLABLE TU
+D248 ; LV # Lo HANGUL SYLLABLE TWEO
+D264 ; LV # Lo HANGUL SYLLABLE TWE
+D280 ; LV # Lo HANGUL SYLLABLE TWI
+D29C ; LV # Lo HANGUL SYLLABLE TYU
+D2B8 ; LV # Lo HANGUL SYLLABLE TEU
+D2D4 ; LV # Lo HANGUL SYLLABLE TYI
+D2F0 ; LV # Lo HANGUL SYLLABLE TI
+D30C ; LV # Lo HANGUL SYLLABLE PA
+D328 ; LV # Lo HANGUL SYLLABLE PAE
+D344 ; LV # Lo HANGUL SYLLABLE PYA
+D360 ; LV # Lo HANGUL SYLLABLE PYAE
+D37C ; LV # Lo HANGUL SYLLABLE PEO
+D398 ; LV # Lo HANGUL SYLLABLE PE
+D3B4 ; LV # Lo HANGUL SYLLABLE PYEO
+D3D0 ; LV # Lo HANGUL SYLLABLE PYE
+D3EC ; LV # Lo HANGUL SYLLABLE PO
+D408 ; LV # Lo HANGUL SYLLABLE PWA
+D424 ; LV # Lo HANGUL SYLLABLE PWAE
+D440 ; LV # Lo HANGUL SYLLABLE POE
+D45C ; LV # Lo HANGUL SYLLABLE PYO
+D478 ; LV # Lo HANGUL SYLLABLE PU
+D494 ; LV # Lo HANGUL SYLLABLE PWEO
+D4B0 ; LV # Lo HANGUL SYLLABLE PWE
+D4CC ; LV # Lo HANGUL SYLLABLE PWI
+D4E8 ; LV # Lo HANGUL SYLLABLE PYU
+D504 ; LV # Lo HANGUL SYLLABLE PEU
+D520 ; LV # Lo HANGUL SYLLABLE PYI
+D53C ; LV # Lo HANGUL SYLLABLE PI
+D558 ; LV # Lo HANGUL SYLLABLE HA
+D574 ; LV # Lo HANGUL SYLLABLE HAE
+D590 ; LV # Lo HANGUL SYLLABLE HYA
+D5AC ; LV # Lo HANGUL SYLLABLE HYAE
+D5C8 ; LV # Lo HANGUL SYLLABLE HEO
+D5E4 ; LV # Lo HANGUL SYLLABLE HE
+D600 ; LV # Lo HANGUL SYLLABLE HYEO
+D61C ; LV # Lo HANGUL SYLLABLE HYE
+D638 ; LV # Lo HANGUL SYLLABLE HO
+D654 ; LV # Lo HANGUL SYLLABLE HWA
+D670 ; LV # Lo HANGUL SYLLABLE HWAE
+D68C ; LV # Lo HANGUL SYLLABLE HOE
+D6A8 ; LV # Lo HANGUL SYLLABLE HYO
+D6C4 ; LV # Lo HANGUL SYLLABLE HU
+D6E0 ; LV # Lo HANGUL SYLLABLE HWEO
+D6FC ; LV # Lo HANGUL SYLLABLE HWE
+D718 ; LV # Lo HANGUL SYLLABLE HWI
+D734 ; LV # Lo HANGUL SYLLABLE HYU
+D750 ; LV # Lo HANGUL SYLLABLE HEU
+D76C ; LV # Lo HANGUL SYLLABLE HYI
+D788 ; LV # Lo HANGUL SYLLABLE HI
+
+# Total code points: 399
+
+# ================================================
+
+# Hangul_Syllable_Type=LVT_Syllable
+
+AC01..AC1B ; LVT # Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH
+AC1D..AC37 ; LVT # Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH
+AC39..AC53 ; LVT # Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH
+AC55..AC6F ; LVT # Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH
+AC71..AC8B ; LVT # Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH
+AC8D..ACA7 ; LVT # Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH
+ACA9..ACC3 ; LVT # Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH
+ACC5..ACDF ; LVT # Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH
+ACE1..ACFB ; LVT # Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH
+ACFD..AD17 ; LVT # Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH
+AD19..AD33 ; LVT # Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH
+AD35..AD4F ; LVT # Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH
+AD51..AD6B ; LVT # Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH
+AD6D..AD87 ; LVT # Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH
+AD89..ADA3 ; LVT # Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH
+ADA5..ADBF ; LVT # Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH
+ADC1..ADDB ; LVT # Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH
+ADDD..ADF7 ; LVT # Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH
+ADF9..AE13 ; LVT # Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH
+AE15..AE2F ; LVT # Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH
+AE31..AE4B ; LVT # Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH
+AE4D..AE67 ; LVT # Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH
+AE69..AE83 ; LVT # Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH
+AE85..AE9F ; LVT # Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH
+AEA1..AEBB ; LVT # Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH
+AEBD..AED7 ; LVT # Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH
+AED9..AEF3 ; LVT # Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH
+AEF5..AF0F ; LVT # Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH
+AF11..AF2B ; LVT # Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH
+AF2D..AF47 ; LVT # Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH
+AF49..AF63 ; LVT # Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH
+AF65..AF7F ; LVT # Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH
+AF81..AF9B ; LVT # Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH
+AF9D..AFB7 ; LVT # Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH
+AFB9..AFD3 ; LVT # Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH
+AFD5..AFEF ; LVT # Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH
+AFF1..B00B ; LVT # Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH
+B00D..B027 ; LVT # Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH
+B029..B043 ; LVT # Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH
+B045..B05F ; LVT # Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH
+B061..B07B ; LVT # Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH
+B07D..B097 ; LVT # Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH
+B099..B0B3 ; LVT # Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH
+B0B5..B0CF ; LVT # Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH
+B0D1..B0EB ; LVT # Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH
+B0ED..B107 ; LVT # Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH
+B109..B123 ; LVT # Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH
+B125..B13F ; LVT # Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH
+B141..B15B ; LVT # Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH
+B15D..B177 ; LVT # Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH
+B179..B193 ; LVT # Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH
+B195..B1AF ; LVT # Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH
+B1B1..B1CB ; LVT # Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH
+B1CD..B1E7 ; LVT # Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH
+B1E9..B203 ; LVT # Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH
+B205..B21F ; LVT # Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH
+B221..B23B ; LVT # Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH
+B23D..B257 ; LVT # Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH
+B259..B273 ; LVT # Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH
+B275..B28F ; LVT # Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH
+B291..B2AB ; LVT # Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH
+B2AD..B2C7 ; LVT # Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH
+B2C9..B2E3 ; LVT # Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH
+B2E5..B2FF ; LVT # Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH
+B301..B31B ; LVT # Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH
+B31D..B337 ; LVT # Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH
+B339..B353 ; LVT # Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH
+B355..B36F ; LVT # Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH
+B371..B38B ; LVT # Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH
+B38D..B3A7 ; LVT # Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH
+B3A9..B3C3 ; LVT # Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH
+B3C5..B3DF ; LVT # Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH
+B3E1..B3FB ; LVT # Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH
+B3FD..B417 ; LVT # Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH
+B419..B433 ; LVT # Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH
+B435..B44F ; LVT # Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH
+B451..B46B ; LVT # Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH
+B46D..B487 ; LVT # Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH
+B489..B4A3 ; LVT # Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH
+B4A5..B4BF ; LVT # Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH
+B4C1..B4DB ; LVT # Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH
+B4DD..B4F7 ; LVT # Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH
+B4F9..B513 ; LVT # Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH
+B515..B52F ; LVT # Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH
+B531..B54B ; LVT # Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH
+B54D..B567 ; LVT # Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH
+B569..B583 ; LVT # Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH
+B585..B59F ; LVT # Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH
+B5A1..B5BB ; LVT # Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH
+B5BD..B5D7 ; LVT # Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH
+B5D9..B5F3 ; LVT # Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH
+B5F5..B60F ; LVT # Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH
+B611..B62B ; LVT # Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH
+B62D..B647 ; LVT # Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH
+B649..B663 ; LVT # Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH
+B665..B67F ; LVT # Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH
+B681..B69B ; LVT # Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH
+B69D..B6B7 ; LVT # Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH
+B6B9..B6D3 ; LVT # Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH
+B6D5..B6EF ; LVT # Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH
+B6F1..B70B ; LVT # Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH
+B70D..B727 ; LVT # Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH
+B729..B743 ; LVT # Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH
+B745..B75F ; LVT # Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH
+B761..B77B ; LVT # Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH
+B77D..B797 ; LVT # Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH
+B799..B7B3 ; LVT # Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH
+B7B5..B7CF ; LVT # Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH
+B7D1..B7EB ; LVT # Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH
+B7ED..B807 ; LVT # Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH
+B809..B823 ; LVT # Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH
+B825..B83F ; LVT # Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH
+B841..B85B ; LVT # Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH
+B85D..B877 ; LVT # Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH
+B879..B893 ; LVT # Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH
+B895..B8AF ; LVT # Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH
+B8B1..B8CB ; LVT # Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH
+B8CD..B8E7 ; LVT # Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH
+B8E9..B903 ; LVT # Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH
+B905..B91F ; LVT # Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH
+B921..B93B ; LVT # Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH
+B93D..B957 ; LVT # Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH
+B959..B973 ; LVT # Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH
+B975..B98F ; LVT # Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH
+B991..B9AB ; LVT # Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH
+B9AD..B9C7 ; LVT # Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH
+B9C9..B9E3 ; LVT # Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH
+B9E5..B9FF ; LVT # Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH
+BA01..BA1B ; LVT # Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH
+BA1D..BA37 ; LVT # Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH
+BA39..BA53 ; LVT # Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH
+BA55..BA6F ; LVT # Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH
+BA71..BA8B ; LVT # Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH
+BA8D..BAA7 ; LVT # Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH
+BAA9..BAC3 ; LVT # Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH
+BAC5..BADF ; LVT # Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH
+BAE1..BAFB ; LVT # Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH
+BAFD..BB17 ; LVT # Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH
+BB19..BB33 ; LVT # Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH
+BB35..BB4F ; LVT # Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH
+BB51..BB6B ; LVT # Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH
+BB6D..BB87 ; LVT # Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH
+BB89..BBA3 ; LVT # Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH
+BBA5..BBBF ; LVT # Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH
+BBC1..BBDB ; LVT # Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH
+BBDD..BBF7 ; LVT # Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH
+BBF9..BC13 ; LVT # Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH
+BC15..BC2F ; LVT # Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH
+BC31..BC4B ; LVT # Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH
+BC4D..BC67 ; LVT # Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH
+BC69..BC83 ; LVT # Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH
+BC85..BC9F ; LVT # Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH
+BCA1..BCBB ; LVT # Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH
+BCBD..BCD7 ; LVT # Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH
+BCD9..BCF3 ; LVT # Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH
+BCF5..BD0F ; LVT # Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH
+BD11..BD2B ; LVT # Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH
+BD2D..BD47 ; LVT # Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH
+BD49..BD63 ; LVT # Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH
+BD65..BD7F ; LVT # Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH
+BD81..BD9B ; LVT # Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH
+BD9D..BDB7 ; LVT # Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH
+BDB9..BDD3 ; LVT # Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH
+BDD5..BDEF ; LVT # Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH
+BDF1..BE0B ; LVT # Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH
+BE0D..BE27 ; LVT # Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH
+BE29..BE43 ; LVT # Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH
+BE45..BE5F ; LVT # Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH
+BE61..BE7B ; LVT # Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH
+BE7D..BE97 ; LVT # Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH
+BE99..BEB3 ; LVT # Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH
+BEB5..BECF ; LVT # Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH
+BED1..BEEB ; LVT # Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH
+BEED..BF07 ; LVT # Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH
+BF09..BF23 ; LVT # Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH
+BF25..BF3F ; LVT # Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH
+BF41..BF5B ; LVT # Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH
+BF5D..BF77 ; LVT # Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH
+BF79..BF93 ; LVT # Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH
+BF95..BFAF ; LVT # Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH
+BFB1..BFCB ; LVT # Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH
+BFCD..BFE7 ; LVT # Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH
+BFE9..C003 ; LVT # Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH
+C005..C01F ; LVT # Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH
+C021..C03B ; LVT # Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH
+C03D..C057 ; LVT # Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH
+C059..C073 ; LVT # Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH
+C075..C08F ; LVT # Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH
+C091..C0AB ; LVT # Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH
+C0AD..C0C7 ; LVT # Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH
+C0C9..C0E3 ; LVT # Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH
+C0E5..C0FF ; LVT # Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH
+C101..C11B ; LVT # Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH
+C11D..C137 ; LVT # Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH
+C139..C153 ; LVT # Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH
+C155..C16F ; LVT # Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH
+C171..C18B ; LVT # Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH
+C18D..C1A7 ; LVT # Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH
+C1A9..C1C3 ; LVT # Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH
+C1C5..C1DF ; LVT # Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH
+C1E1..C1FB ; LVT # Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH
+C1FD..C217 ; LVT # Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH
+C219..C233 ; LVT # Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH
+C235..C24F ; LVT # Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH
+C251..C26B ; LVT # Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH
+C26D..C287 ; LVT # Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH
+C289..C2A3 ; LVT # Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH
+C2A5..C2BF ; LVT # Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH
+C2C1..C2DB ; LVT # Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH
+C2DD..C2F7 ; LVT # Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH
+C2F9..C313 ; LVT # Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH
+C315..C32F ; LVT # Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH
+C331..C34B ; LVT # Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH
+C34D..C367 ; LVT # Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH
+C369..C383 ; LVT # Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH
+C385..C39F ; LVT # Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH
+C3A1..C3BB ; LVT # Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH
+C3BD..C3D7 ; LVT # Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH
+C3D9..C3F3 ; LVT # Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH
+C3F5..C40F ; LVT # Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH
+C411..C42B ; LVT # Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH
+C42D..C447 ; LVT # Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH
+C449..C463 ; LVT # Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH
+C465..C47F ; LVT # Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH
+C481..C49B ; LVT # Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH
+C49D..C4B7 ; LVT # Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH
+C4B9..C4D3 ; LVT # Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH
+C4D5..C4EF ; LVT # Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH
+C4F1..C50B ; LVT # Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH
+C50D..C527 ; LVT # Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH
+C529..C543 ; LVT # Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH
+C545..C55F ; LVT # Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH
+C561..C57B ; LVT # Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH
+C57D..C597 ; LVT # Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH
+C599..C5B3 ; LVT # Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH
+C5B5..C5CF ; LVT # Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH
+C5D1..C5EB ; LVT # Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH
+C5ED..C607 ; LVT # Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH
+C609..C623 ; LVT # Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH
+C625..C63F ; LVT # Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH
+C641..C65B ; LVT # Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH
+C65D..C677 ; LVT # Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH
+C679..C693 ; LVT # Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH
+C695..C6AF ; LVT # Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH
+C6B1..C6CB ; LVT # Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH
+C6CD..C6E7 ; LVT # Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH
+C6E9..C703 ; LVT # Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH
+C705..C71F ; LVT # Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH
+C721..C73B ; LVT # Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH
+C73D..C757 ; LVT # Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH
+C759..C773 ; LVT # Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH
+C775..C78F ; LVT # Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH
+C791..C7AB ; LVT # Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH
+C7AD..C7C7 ; LVT # Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH
+C7C9..C7E3 ; LVT # Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH
+C7E5..C7FF ; LVT # Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH
+C801..C81B ; LVT # Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH
+C81D..C837 ; LVT # Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH
+C839..C853 ; LVT # Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH
+C855..C86F ; LVT # Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH
+C871..C88B ; LVT # Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH
+C88D..C8A7 ; LVT # Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH
+C8A9..C8C3 ; LVT # Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH
+C8C5..C8DF ; LVT # Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH
+C8E1..C8FB ; LVT # Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH
+C8FD..C917 ; LVT # Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH
+C919..C933 ; LVT # Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH
+C935..C94F ; LVT # Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH
+C951..C96B ; LVT # Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH
+C96D..C987 ; LVT # Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH
+C989..C9A3 ; LVT # Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH
+C9A5..C9BF ; LVT # Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH
+C9C1..C9DB ; LVT # Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH
+C9DD..C9F7 ; LVT # Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH
+C9F9..CA13 ; LVT # Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH
+CA15..CA2F ; LVT # Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH
+CA31..CA4B ; LVT # Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH
+CA4D..CA67 ; LVT # Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH
+CA69..CA83 ; LVT # Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH
+CA85..CA9F ; LVT # Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH
+CAA1..CABB ; LVT # Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH
+CABD..CAD7 ; LVT # Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH
+CAD9..CAF3 ; LVT # Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH
+CAF5..CB0F ; LVT # Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH
+CB11..CB2B ; LVT # Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH
+CB2D..CB47 ; LVT # Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH
+CB49..CB63 ; LVT # Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH
+CB65..CB7F ; LVT # Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH
+CB81..CB9B ; LVT # Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH
+CB9D..CBB7 ; LVT # Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH
+CBB9..CBD3 ; LVT # Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH
+CBD5..CBEF ; LVT # Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH
+CBF1..CC0B ; LVT # Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH
+CC0D..CC27 ; LVT # Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH
+CC29..CC43 ; LVT # Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH
+CC45..CC5F ; LVT # Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH
+CC61..CC7B ; LVT # Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH
+CC7D..CC97 ; LVT # Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH
+CC99..CCB3 ; LVT # Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH
+CCB5..CCCF ; LVT # Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH
+CCD1..CCEB ; LVT # Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH
+CCED..CD07 ; LVT # Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH
+CD09..CD23 ; LVT # Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH
+CD25..CD3F ; LVT # Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH
+CD41..CD5B ; LVT # Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH
+CD5D..CD77 ; LVT # Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH
+CD79..CD93 ; LVT # Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH
+CD95..CDAF ; LVT # Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH
+CDB1..CDCB ; LVT # Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH
+CDCD..CDE7 ; LVT # Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH
+CDE9..CE03 ; LVT # Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH
+CE05..CE1F ; LVT # Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH
+CE21..CE3B ; LVT # Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH
+CE3D..CE57 ; LVT # Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH
+CE59..CE73 ; LVT # Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH
+CE75..CE8F ; LVT # Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH
+CE91..CEAB ; LVT # Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH
+CEAD..CEC7 ; LVT # Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH
+CEC9..CEE3 ; LVT # Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH
+CEE5..CEFF ; LVT # Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH
+CF01..CF1B ; LVT # Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH
+CF1D..CF37 ; LVT # Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH
+CF39..CF53 ; LVT # Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH
+CF55..CF6F ; LVT # Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH
+CF71..CF8B ; LVT # Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH
+CF8D..CFA7 ; LVT # Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH
+CFA9..CFC3 ; LVT # Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH
+CFC5..CFDF ; LVT # Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH
+CFE1..CFFB ; LVT # Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH
+CFFD..D017 ; LVT # Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH
+D019..D033 ; LVT # Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH
+D035..D04F ; LVT # Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH
+D051..D06B ; LVT # Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH
+D06D..D087 ; LVT # Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH
+D089..D0A3 ; LVT # Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH
+D0A5..D0BF ; LVT # Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH
+D0C1..D0DB ; LVT # Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH
+D0DD..D0F7 ; LVT # Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH
+D0F9..D113 ; LVT # Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH
+D115..D12F ; LVT # Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH
+D131..D14B ; LVT # Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH
+D14D..D167 ; LVT # Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH
+D169..D183 ; LVT # Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH
+D185..D19F ; LVT # Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH
+D1A1..D1BB ; LVT # Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH
+D1BD..D1D7 ; LVT # Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH
+D1D9..D1F3 ; LVT # Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH
+D1F5..D20F ; LVT # Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH
+D211..D22B ; LVT # Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH
+D22D..D247 ; LVT # Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH
+D249..D263 ; LVT # Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH
+D265..D27F ; LVT # Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH
+D281..D29B ; LVT # Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH
+D29D..D2B7 ; LVT # Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH
+D2B9..D2D3 ; LVT # Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH
+D2D5..D2EF ; LVT # Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH
+D2F1..D30B ; LVT # Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH
+D30D..D327 ; LVT # Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH
+D329..D343 ; LVT # Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH
+D345..D35F ; LVT # Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH
+D361..D37B ; LVT # Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH
+D37D..D397 ; LVT # Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH
+D399..D3B3 ; LVT # Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH
+D3B5..D3CF ; LVT # Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH
+D3D1..D3EB ; LVT # Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH
+D3ED..D407 ; LVT # Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH
+D409..D423 ; LVT # Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH
+D425..D43F ; LVT # Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH
+D441..D45B ; LVT # Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH
+D45D..D477 ; LVT # Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH
+D479..D493 ; LVT # Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH
+D495..D4AF ; LVT # Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH
+D4B1..D4CB ; LVT # Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH
+D4CD..D4E7 ; LVT # Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH
+D4E9..D503 ; LVT # Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH
+D505..D51F ; LVT # Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH
+D521..D53B ; LVT # Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH
+D53D..D557 ; LVT # Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH
+D559..D573 ; LVT # Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH
+D575..D58F ; LVT # Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH
+D591..D5AB ; LVT # Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH
+D5AD..D5C7 ; LVT # Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH
+D5C9..D5E3 ; LVT # Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH
+D5E5..D5FF ; LVT # Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH
+D601..D61B ; LVT # Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH
+D61D..D637 ; LVT # Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH
+D639..D653 ; LVT # Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH
+D655..D66F ; LVT # Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH
+D671..D68B ; LVT # Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH
+D68D..D6A7 ; LVT # Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH
+D6A9..D6C3 ; LVT # Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH
+D6C5..D6DF ; LVT # Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH
+D6E1..D6FB ; LVT # Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH
+D6FD..D717 ; LVT # Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH
+D719..D733 ; LVT # Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH
+D735..D74F ; LVT # Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH
+D751..D76B ; LVT # Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH
+D76D..D787 ; LVT # Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH
+D789..D7A3 ; LVT # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH
+
+# Total code points: 10773
+
+# EOF
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/Index.txt b/Master/tlpkg/tlperl.straw/lib/unicore/Index.txt
new file mode 100755
index 00000000000..dd53c446e96
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/Index.txt
@@ -0,0 +1,5245 @@
+A WITH ACUTE, LATIN CAPITAL LETTER 00C1
+A WITH ACUTE, LATIN SMALL LETTER 00E1
+A WITH BREVE, LATIN SMALL LETTER 0103
+A WITH CARON, LATIN SMALL LETTER 01CE
+A WITH CIRCUMFLEX, LATIN CAPITAL LETTER 00C2
+A WITH CIRCUMFLEX, LATIN SMALL LETTER 00E2
+A WITH DIAERESIS, LATIN CAPITAL LETTER 00C4
+A WITH DIAERESIS, LATIN SMALL LETTER 00E4
+A WITH DOT ABOVE, LATIN SMALL LETTER 0227
+A WITH DOT BELOW, LATIN SMALL LETTER 1EA1
+A WITH DOUBLE GRAVE, LATIN SMALL LETTER 0201
+A WITH GRAVE, LATIN CAPITAL LETTER 00C0
+A WITH GRAVE, LATIN SMALL LETTER 00E0
+A WITH HOOK ABOVE, LATIN SMALL LETTER 1EA3
+A WITH INVERTED BREVE, LATIN SMALL LETTER 0203
+A WITH MACRON, LATIN SMALL LETTER 0101
+A WITH OGONEK, LATIN SMALL LETTER 0105
+A WITH RIGHT HALF RING, LATIN SMALL LETTER 1E9A
+A WITH RING ABOVE, LATIN CAPITAL LETTER 00C5
+A WITH RING ABOVE, LATIN SMALL LETTER 00E5
+A WITH RING BELOW, LATIN SMALL LETTER 1E01
+A WITH STROKE, LATIN CAPITAL LETTER 023A
+A WITH TILDE, LATIN CAPITAL LETTER 00C3
+A WITH TILDE, LATIN SMALL LETTER 00E3
+A, COMBINING LATIN SMALL LETTER 0363
+A, LATIN LETTER SMALL CAPITAL 1D00
+a, latin small letter script 0251
+A, LATIN SMALL LETTER TURNED 0250
+ABBREVIATION MARK, ARMENIAN 055F
+ABBREVIATION MARK, SYRIAC 070F
+ABBREVIATION SIGN, DEVANAGARI 0970
+Abbreviations, Squared Latin 3371
+Aboriginal Syllabics, Unified Canadian 1400
+ABOVE RIGHT, COMBINING COMMA 0315
+ABOVE RIGHT, COMBINING DOT 0358
+above, cedilla 0312
+ABOVE, COMBINING ALMOST EQUAL TO 034C
+ABOVE, COMBINING ANTICLOCKWISE ARROW 20D4
+ABOVE, COMBINING ASTERISK 20F0
+ABOVE, COMBINING BRIDGE 0346
+ABOVE, COMBINING CLOCKWISE ARROW 20D5
+ABOVE, COMBINING COMMA 0313
+above, combining counterclockwise arrow 20D4
+ABOVE, COMBINING DOT 0307
+ABOVE, COMBINING DOUBLE VERTICAL LINE 030E
+ABOVE, COMBINING FOUR DOTS 20DC
+ABOVE, COMBINING HOMOTHETIC 034B
+ABOVE, COMBINING HOOK 0309
+ABOVE, COMBINING LEFT ANGLE 031A
+ABOVE, COMBINING LEFT ARROW 20D6
+ABOVE, COMBINING LEFT HALF RING 0351
+ABOVE, COMBINING LEFT HARPOON 20D0
+ABOVE, COMBINING LEFT RIGHT ARROW 20E1
+ABOVE, COMBINING NOT TILDE 034A
+ABOVE, COMBINING REVERSED COMMA 0314
+ABOVE, COMBINING RIGHT ARROW 20D7
+ABOVE, COMBINING RIGHT ARROWHEAD 0350
+ABOVE, COMBINING RIGHT HALF RING 0357
+ABOVE, COMBINING RIGHT HARPOON 20D1
+ABOVE, COMBINING RING 030A
+ABOVE, COMBINING THREE DOTS 20DB
+ABOVE, COMBINING TURNED COMMA 0312
+ABOVE, COMBINING VERTICAL LINE 030D
+ABOVE, COMBINING WIDE BRIDGE 20E9
+ABOVE, COMBINING X 033D
+ABOVE, COMBINING ZIGZAG 035B
+ABOVE, DOT 02D9
+above, double dot 0308
+ABOVE, RING 02DA
+above, v 030C
+absolute continuity 2AA1
+absolute value 007C
+abstract syntax bracket, left 301A
+abstract syntax bracket, right 301B
+AC CURRENT 23E6
+ACCENT BELOW, COMBINING ACUTE 0317
+ACCENT BELOW, COMBINING CIRCUMFLEX 032D
+ACCENT BELOW, COMBINING GRAVE 0316
+ACCENT, ACUTE 00B4
+ACCENT, CIRCUMFLEX 005E
+ACCENT, COMBINING ACUTE 0301
+ACCENT, COMBINING CIRCUMFLEX 0302
+ACCENT, COMBINING DOUBLE ACUTE 030B
+ACCENT, COMBINING DOUBLE GRAVE 030F
+ACCENT, COMBINING GRAVE 0300
+ACCENT, DOUBLE ACUTE 02DD
+ACCENT, GRAVE 0060
+ACCENT, MODIFIER LETTER ACUTE 02CA
+ACCENT, MODIFIER LETTER CIRCUMFLEX 02C6
+ACCENT, MODIFIER LETTER CROSS 02DF
+ACCENT, MODIFIER LETTER GRAVE 02CB
+ACCENT, MODIFIER LETTER LOW ACUTE 02CF
+ACCENT, MODIFIER LETTER LOW GRAVE 02CE
+accent, spacing acute 00B4
+accent, spacing circumflex 005E
+accent, spacing grave 0060
+accent, swedish grave 02DF
+ACCOUNT OF 2100
+ACKNOWLEDGE 0006
+ACKNOWLEDGE, NEGATIVE 0015
+ACKNOWLEDGE, SYMBOL FOR 2406
+ACKNOWLEDGE, SYMBOL FOR NEGATIVE 2415
+acrophonic symbol three, epidaurean 205D
+actuarial bend 20E7
+ACUTE ACCENT 00B4
+ACUTE ACCENT BELOW, COMBINING 0317
+ACUTE ACCENT, COMBINING 0301
+ACUTE ACCENT, COMBINING DOUBLE 030B
+ACUTE ACCENT, DOUBLE 02DD
+ACUTE ACCENT, MODIFIER LETTER 02CA
+ACUTE ACCENT, MODIFIER LETTER LOW 02CF
+acute accent, spacing 00B4
+ACUTE TONE MARK, COMBINING 0341
+ADDAK, GURMUKHI 0A71
+ADDRESSED TO THE SUBJECT 2101
+ADI SHAKTI 262C
+AE, LATIN CAPITAL LETTER 00C6
+ae, latin capital ligature 00C6
+AE, LATIN LETTER SMALL CAPITAL 1D01
+AE, LATIN SMALL LETTER 00E6
+AE, LATIN SMALL LETTER TURNED 1D02
+ae, latin small ligature 00E6
+AEGEAN WORD SEPARATOR DOT 10101
+AEGEAN WORD SEPARATOR LINE 10100
+AESCULAPIUS, STAFF OF 2695
+AFGHANI SIGN 060B
+African Letters for Clicks 01C0
+AIN, LATIN LETTER 1D25
+Ainu, Katakana Extensions for 31F0
+AIRPLANE 2708
+AKTIESELSKAB 214D
+AL-LAKUNA, SINHALA SIGN 0DCA
+aldus leaf 2766
+ALEF SYMBOL 2135
+ALEMBIC 2697
+ALL AROUND-PROFILE 232E
+ALL EQUAL TO 224C
+ALL, FOR 2200
+ALMOST EQUAL TO 2248
+ALMOST EQUAL TO ABOVE, COMBINING 034C
+ALMOST EQUAL TO, NOT 2249
+ALPHA, LATIN SMALL LETTER 0251
+ALPHA, LATIN SMALL LETTER TURNED 0252
+Alphabetic Presentation Forms FB00
+Alphanumeric Symbols, Mathematical 1D400
+Alphanumerics, Enclosed 2460
+alternating current 223F
+ALTERNATIVE KEY SYMBOL 2387
+ALVEOLAR CLICK, LATIN LETTER 01C2
+always 25FB
+AMPERSAND 0026
+AMPERSAND, TURNED 214B
+ANCHOR 2693
+ANCHOR, INTERLINEAR ANNOTATION FFF9
+AND, CURLY LOGICAL 22CF
+AND, LOGICAL 2227
+AND, N-ARY LOGICAL 22C0
+Ands and Ors, Logical 2A51
+ANGKHANKHU, THAI CHARACTER 0E5A
+ANGLE 2220
+ANGLE ABOVE, COMBINING LEFT 031A
+angle arc 2222
+ANGLE BELOW, COMBINING LEFT 0349
+ANGLE BRACKET, LEFT 3008
+ANGLE BRACKET, LEFT DOUBLE 300A
+ANGLE BRACKET, LEFT-POINTING 2329
+ANGLE BRACKET, MATHEMATICAL LEFT 27E8
+ANGLE BRACKET, MATHEMATICAL LEFT DOUBLE 27EA
+ANGLE BRACKET, MATHEMATICAL RIGHT 27E9
+ANGLE BRACKET, MATHEMATICAL RIGHT DOUBLE 27EB
+ANGLE BRACKET, RIGHT 3009
+ANGLE BRACKET, RIGHT DOUBLE 300B
+ANGLE BRACKET, RIGHT-POINTING 232A
+Angle Brackets, CJK 3008
+ANGLE QUOTATION MARK, LEFT-POINTING DOUBLE 00AB
+ANGLE QUOTATION MARK, RIGHT-POINTING DOUBLE 00BB
+ANGLE QUOTATION MARK, SINGLE LEFT-POINTING 2039
+ANGLE QUOTATION MARK, SINGLE RIGHT-POINTING 203A
+Angle Quotation Marks, Ornamental 276E
+ANGLE WITH ARC, RIGHT 22BE
+ANGLE, MEASURED 2221
+ANGLE, RIGHT 221F
+ANGLE, SPHERICAL 2222
+angled dash 00AC
+Angles 221F
+Angles and Measured Angles 299B
+ANGSTROM SIGN 212B
+ANKH 2625
+ANNOTATION ANCHOR, INTERLINEAR FFF9
+ANNOTATION SEPARATOR, INTERLINEAR FFFA
+Annotation Signs, Arabic Koranic 06D6
+Annotation Signs, Arabic Qur'anic 06D6
+ANNOTATION TERMINATOR, INTERLINEAR FFFB
+Annotation, Interlinear FFF9
+Annotation, Japanese Kanbun Ideographic 3190
+ANNUITY SYMBOL, COMBINING 20E7
+ano teleia, greek 00B7
+ANTICLOCKWISE ARROW ABOVE, COMBINING 20D4
+ANTICLOCKWISE CONTOUR INTEGRAL 2233
+ANTICLOCKWISE INTEGRATION 2A11
+ANTICLOCKWISE RING OVERLAY, COMBINING 20DA
+antisigma, claudian 2183
+anunasika, devanagari 0901
+ANUSVARA, DEVANAGARI SIGN 0902
+anusvara, khmer 17C6
+anusvara, tibetan 0F7E
+apl downstile 230A
+APL Functional Symbols 2336
+apl jot 2218
+apl overbar 00AF
+apl quote 0027
+apl stile 2223
+apl tilde 223C
+apl upstile 2308
+APOSTROPHE 0027
+apostrophe 2019
+APOSTROPHE, ARMENIAN 055A
+APOSTROPHE, MODIFIER LETTER 02BC
+APOSTROPHE, MODIFIER LETTER DOUBLE 02EE
+apostrophe, neutral 02BC
+apostrophe-quote 0027
+apostrophic c 2183
+APPLICATION PROGRAM COMMAND 009F
+APPLICATION, FUNCTION 2061
+APPROACHES THE LIMIT 2250
+APPROXIMATELY EQUAL TO 2245
+approximately equal to 2257
+AQUARIUS 2652
+Arabic 0600
+Arabic Alphabet 0621
+Arabic Combining Marks 0653
+ARABIC COMMA 060C
+Arabic Contextual Form Glyphs FB50
+Arabic Contextual Form Glyphs FE80
+ARABIC DATE SEPARATOR 060D
+ARABIC DECIMAL SEPARATOR 066B
+Arabic Extensions 0671
+ARABIC FULL STOP 06D4
+Arabic Harakat 064B
+Arabic Honorifics 0610
+arabic kashida 0640
+Arabic Koranic Annotation Signs 06D6
+arabic letter hamzah on ha 06C0
+ARABIC LETTER HEH WITH YEH ABOVE 06C0
+Arabic Letters, Extended 0671
+Arabic Letters, Extended 0750
+ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM FDFD
+Arabic Ligatures FBEA
+arabic phrase separator 066C
+Arabic Points, Glyphs for Spacing Forms of FE70
+Arabic Presentation Forms-A FB50
+Arabic Presentation Forms-B FE70
+Arabic Punctuation 060C
+ARABIC QUESTION MARK 061F
+Arabic Qur'anic Annotation Signs 06D6
+ARABIC SEMICOLON 061B
+Arabic Subtending Marks 0600
+Arabic Supplement 0750
+ARABIC TATWEEL 0640
+ARABIC THOUSANDS SEPARATOR 066C
+Arabic-Indic Digits 0660
+Arabic-Indic Digits, Eastern 06F0
+ARC 2312
+arc, angle 2222
+ARC, RIGHT ANGLE WITH 22BE
+ARCH BELOW, COMBINING INVERTED DOUBLE 032B
+Arcs 25DC
+Area, Asian Scripts AC00
+Area, CJK Ideographs 3400
+Area, CJK Phonetics and Symbols 2E80
+Area, Compatibility and Specials F900
+Area, General Scripts 0000
+Area, Korean Hangul Syllables AC00
+Area, Private Use E000
+Area, Supplementary CJK Ideographs 20000
+Area, Supplementary General Scripts 10000
+Area, Surrogates D800
+Area, Symbols 2000
+Area-A, Supplementary Private Use FFF80
+Area-B, Supplementary Private Use 10FF80
+argentinian former currency 20B3
+ARIES 2648
+ARMENIAN ABBREVIATION MARK 055F
+Armenian Alphabet 0530
+ARMENIAN APOSTROPHE 055A
+armenian batsaganchakan nshan 055C
+armenian bowt 055D
+Armenian Capital Letters 0531
+ARMENIAN COMMA 055D
+ARMENIAN EMPHASIS MARK 055B
+ARMENIAN EXCLAMATION MARK 055C
+ARMENIAN FULL STOP 0589
+armenian hartsakan nshan 055E
+ARMENIAN HYPHEN 058A
+Armenian Ligatures FB13
+armenian patiw 055F
+ARMENIAN QUESTION MARK 055E
+armenian shesht 055B
+Armenian Small Letters 0561
+armenian vertsaket 0589
+armenian yentamna 058A
+ARROW ABOVE, COMBINING ANTICLOCKWISE 20D4
+ARROW ABOVE, COMBINING CLOCKWISE 20D5
+arrow above, combining counterclockwise 20D4
+ARROW ABOVE, COMBINING LEFT 20D6
+ARROW ABOVE, COMBINING LEFT RIGHT 20E1
+ARROW ABOVE, COMBINING RIGHT 20D7
+ARROW BELOW, COMBINING DOUBLE RIGHTWARDS 0362
+ARROW BELOW, COMBINING LEFT 20EE
+ARROW BELOW, COMBINING LEFT RIGHT 034D
+ARROW BELOW, COMBINING RIGHT 20EF
+ARROW BELOW, COMBINING UPWARDS 034E
+Arrow Dingbats 2794
+arrow indicator, backward 25C5
+arrow indicator, forward 25BB
+ARROW OVERLAY, COMBINING LEFTWARDS 20EA
+ARROW, DOWNWARDS 2193
+ARROW, ELECTRIC 2301
+ARROW, LEFTWARDS 2190
+ARROW, RIGHTWARDS 2192
+ARROW, UPWARDS 2191
+ARROWHEAD ABOVE, COMBINING RIGHT 0350
+ARROWHEAD BELOW, COMBINING LEFT 0354
+ARROWHEAD BELOW, COMBINING RIGHT 0355
+ARROWHEAD, DOWN 2304
+ARROWHEAD, UP 2303
+Arrowheads, Modifier Letter 02C2
+Arrows 2190
+Arrows, Dingbat 2794
+Arrows, Double 21CD
+Arrows, Long 27F5
+Arrows, Mathematical 2B30
+Arrows, Miscellaneous 2B00
+Arrows-A Supplement 27F0
+Arrows-B, Supplemental 2900
+ASCENDING NODE 260A
+ASCII C0 Control Codes 0000
+ASCII Digits 0030
+ASCII Punctuation and Symbols 0020
+ASCII Variants, Fullwidth FF01
+ash 00E6
+Asian Scripts Area AC00
+ASSERTION 22A6
+ASTERISK 002A
+ASTERISK ABOVE, COMBINING 20F0
+ASTERISK BELOW, COMBINING 0359
+Asterisk Dingbats 2722
+ASTERISK OPERATOR 2217
+ASTERISK OPERATOR, CIRCLED 229B
+ASTERISK, LOW 204E
+Asterisks 2722
+ASTERISKS ALIGNED VERTICALLY, TWO 2051
+ASTERISM 2042
+Astrological Signs 26B3
+Astrological Signs, Tibetan 0F15
+Astrological Symbols 263D
+Astrological Symbols, Weather and 2600
+asymptotic to 2248
+ASYMPTOTICALLY EQUAL TO 2243
+ASYMPTOTICALLY EQUAL TO, NOT 2244
+at sign 0040
+AT, COMMERCIAL 0040
+ATOM SYMBOL 269B
+AUSTRAL SIGN 20B3
+AVAGRAHA, DEVANAGARI SIGN 093D
+aytham, tamil 0B83
+B WITH DOT ABOVE, LATIN SMALL LETTER 1E03
+B WITH DOT BELOW, LATIN SMALL LETTER 1E05
+B WITH HOOK, LATIN CAPITAL LETTER 0181
+B WITH HOOK, LATIN SMALL LETTER 0253
+B WITH LINE BELOW, LATIN SMALL LETTER 1E07
+B WITH STROKE, LATIN CAPITAL LETTER 0243
+B WITH STROKE, LATIN SMALL LETTER 0180
+B WITH TOPBAR, LATIN SMALL LETTER 0183
+B, LATIN LETTER SMALL CAPITAL 0299
+B, LATIN LETTER SMALL CAPITAL BARRED 1D03
+B, SCRIPT CAPITAL 212C
+baby gamma, latin small letter 0264
+backslash 005C
+BACKSLASH, COMBINING ENCLOSING CIRCLE 20E0
+BACKSPACE 0008
+BACKSPACE, SYMBOL FOR 2408
+backward arrow indicator 25C5
+backward difference 2207
+BACKWARD, PARTIAL LINE 008C
+bag addition 228E
+bag bracket, left 27E6
+bag bracket, right 27E7
+bag count, infix 266F
+BAG MEMBERSHIP, Z NOTATION 22FF
+bag subtraction 2A41
+BAHT, THAI CURRENCY SYMBOL 0E3F
+Balinese 1B00
+Balinese Digits 1B50
+Balinese Musical Symbols 1B61
+BALLOT BOX 2610
+BALLOT BOX WITH CHECK 2611
+BALLOT BOX WITH X 2612
+BALLOT X 2717
+BALLOT X, HEAVY 2718
+bang 0021
+Bar Dingbats, Vertical 2758
+Bar Symbols, Error 29EE
+BAR, BROKEN 00A6
+BAR, HORIZONTAL 2015
+bar, vertical 007C
+BAR, WHITE VERTICAL 2AFE
+BARRED B, LATIN LETTER SMALL CAPITAL 1D03
+barred o, latin capital letter 019F
+BARRED O, LATIN SMALL LETTER 0275
+base 22A5
+batsaganchakan nshan, armenian 055C
+battleground symbol 2694
+BEAMED EIGHTH NOTES 266B
+BEAMED SIXTEENTH NOTES 266C
+BECAUSE 2235
+BELL 0007
+BELL SYMBOL 237E
+BELL, SYMBOL FOR 2407
+BELOW, COMBINING ACUTE ACCENT 0317
+BELOW, COMBINING ASTERISK 0359
+BELOW, COMBINING BREVE 032E
+BELOW, COMBINING BRIDGE 032A
+BELOW, COMBINING CARON 032C
+BELOW, COMBINING CIRCUMFLEX ACCENT 032D
+BELOW, COMBINING COMMA 0326
+BELOW, COMBINING DIAERESIS 0324
+BELOW, COMBINING DOT 0323
+BELOW, COMBINING DOUBLE BREVE 035C
+BELOW, COMBINING DOUBLE MACRON 035F
+BELOW, COMBINING DOUBLE RIGHTWARDS ARROW 0362
+BELOW, COMBINING DOUBLE RING 035A
+BELOW, COMBINING DOUBLE VERTICAL LINE 0348
+BELOW, COMBINING DOWN TACK 031E
+BELOW, COMBINING EQUALS SIGN 0347
+BELOW, COMBINING GRAVE ACCENT 0316
+BELOW, COMBINING INVERTED BREVE 032F
+BELOW, COMBINING INVERTED BRIDGE 033A
+BELOW, COMBINING INVERTED DOUBLE ARCH 032B
+BELOW, COMBINING LEFT ANGLE 0349
+BELOW, COMBINING LEFT ARROW 20EE
+BELOW, COMBINING LEFT ARROWHEAD 0354
+BELOW, COMBINING LEFT HALF RING 031C
+BELOW, COMBINING LEFT RIGHT ARROW 034D
+BELOW, COMBINING LEFT TACK 0318
+BELOW, COMBINING MACRON 0331
+BELOW, COMBINING MINUS SIGN 0320
+BELOW, COMBINING PALATALIZED HOOK 0321
+BELOW, COMBINING PLUS SIGN 031F
+BELOW, COMBINING RETROFLEX HOOK 0322
+BELOW, COMBINING RIGHT ARROW 20EF
+BELOW, COMBINING RIGHT ARROWHEAD 0355
+BELOW, COMBINING RIGHT HALF RING 0339
+BELOW, COMBINING RIGHT TACK 0319
+BELOW, COMBINING RING 0325
+BELOW, COMBINING SEAGULL 033C
+BELOW, COMBINING SQUARE 033B
+BELOW, COMBINING TILDE 0330
+BELOW, COMBINING UP TACK 031D
+BELOW, COMBINING UPWARDS ARROW 034E
+BELOW, COMBINING VERTICAL LINE 0329
+BELOW, COMBINING X 0353
+BELT, LATIN SMALL LETTER L WITH 026C
+bend, actuarial 20E7
+Bengali 0980
+Bengali Consonants 0995
+Bengali Currency Signs 09F2
+Bengali Dependent Vowel Signs 09BE
+Bengali Digits 09E6
+bengali hasant 09CD
+Bengali Independent Vowels 0985
+BENGALI ISSHAR 09FA
+BENGALI RUPEE MARK 09F2
+BENGALI RUPEE SIGN 09F3
+BENZENE RING 232C
+bernoulli function 212C
+BET SYMBOL 2136
+BETA SYMBOL, GREEK 03D0
+beta, curled 03D0
+BETWEEN 226C
+BEVERAGE, HOT 2615
+Bidirectional Format Characters 202A
+Big 5, Duplicate Characters from FA0C
+BIG REVERSE SOLIDUS 29F9
+BIG SOLIDUS 29F8
+bijection 2916
+BILABIAL CLICK, LATIN LETTER 0298
+BILABIAL PERCUSSIVE, LATIN LETTER 02AC
+bindu, devanagari 0902
+BIOHAZARD SIGN 2623
+BIRGA, MONGOLIAN 1800
+BISMILLAH AR-RAHMAN AR-RAHEEM, ARABIC LIGATURE FDFD
+BLACK CIRCLE 25CF
+BLACK CIRCLE, MEDIUM 26AB
+BLACK FLAG 2691
+BLACK HOURGLASS 29D7
+BLACK LEFT POINTING INDEX 261A
+BLACK LEFTWARDS BULLET 204C
+BLACK LENTICULAR BRACKET, LEFT 3010
+BLACK LENTICULAR BRACKET, RIGHT 3011
+BLACK LOZENGE 29EB
+BLACK MEDIUM SMALL SQUARE 25FE
+BLACK MEDIUM SQUARE 25FC
+BLACK NIB 2712
+BLACK PARALLELOGRAM 25B0
+BLACK RIGHT POINTING INDEX 261B
+BLACK RIGHTWARDS BULLET 204D
+BLACK SCISSORS 2702
+BLACK SHOGI PIECE 2617
+black small circle 2022
+BLACK SMILING FACE 263B
+BLACK STAR 2605
+BLACK SUN WITH RAYS 2600
+BLACK TELEPHONE 260E
+BLACK-LETTER CAPITAL C 212D
+BLACK-LETTER CAPITAL H 210C
+BLACK-LETTER CAPITAL I 2111
+BLACK-LETTER CAPITAL R 211C
+BLACK-LETTER CAPITAL Z 2128
+Black-letter Mathematical Symbols 1D504
+BLANK SYMBOL 2422
+Block Elements 2580
+BLOCK, END OF TRANSMISSION 0017
+BLOCK, FULL 2588
+BLOCK, SYMBOL FOR END OF TRANSMISSION 2417
+Bohairic Coptic 2C80
+Bold Digits 1D7CE
+Bold Digits, Sans-serif 1D7EC
+Bold Fraktur Mathematical Symbols 1D56C
+Bold Greek Mathematical Symbols 1D6A8
+Bold Greek Mathematical Symbols, Sans-serif 1D756
+Bold Italic Greek Mathematical Symbols 1D71C
+Bold Italic Greek Mathematical Symbols, Sans-serif 1D790
+Bold Italic Mathematical Symbols 1D468
+Bold Italic Mathematical Symbols, Sans-serif 1D63C
+Bold Mathematical Symbols 1D400
+Bold Mathematical Symbols, Sans-serif 1D5D4
+Bold Script Mathematical Symbols 1D4D0
+bom FEFF
+Bopomofo Extensions, Chinese 31A0
+Bopomofo, Chinese 3100
+bottom 22A5
+bowt, armenian 055D
+BOWTIE 22C8
+Bowtie Symbols 29D1
+bowtie, large 2A1D
+bowtie, vertical 29D6
+Box Drawing 2500
+BOX WITH CHECK, BALLOT 2611
+BOX WITH X, BALLOT 2612
+BOX, BALLOT 2610
+BOX, OPEN 2423
+BOX, SHOULDERED OPEN 237D
+BOX, X IN A RECTANGLE 2327
+bra 27E8
+brace, closing 007D
+brace, opening 007B
+Bracket Pieces 239B
+Bracket Pieces 23B0
+Bracket Variants for Vertical Text 23DC
+BRACKET WITH QUILL, LEFT SQUARE 2045
+BRACKET WITH QUILL, RIGHT SQUARE 2046
+bracket, closing curly 007D
+bracket, closing square 005D
+bracket, left abstract syntax 301A
+BRACKET, LEFT ANGLE 3008
+bracket, left bag 27E6
+BRACKET, LEFT BLACK LENTICULAR 3010
+bracket, left chevron 27EA
+BRACKET, LEFT CORNER 300C
+BRACKET, LEFT CURLY 007B
+BRACKET, LEFT DOUBLE ANGLE 300A
+bracket, left sequence 27E8
+BRACKET, LEFT SQUARE 005B
+BRACKET, LEFT TORTOISE SHELL 3014
+BRACKET, LEFT WHITE CORNER 300E
+BRACKET, LEFT WHITE CURLY 2983
+BRACKET, LEFT WHITE LENTICULAR 3016
+BRACKET, LEFT WHITE SQUARE 301A
+BRACKET, LEFT WHITE TORTOISE SHELL 3018
+BRACKET, LEFT-POINTING ANGLE 2329
+BRACKET, MATHEMATICAL LEFT ANGLE 27E8
+BRACKET, MATHEMATICAL LEFT DOUBLE ANGLE 27EA
+BRACKET, MATHEMATICAL RIGHT ANGLE 27E9
+BRACKET, MATHEMATICAL RIGHT DOUBLE ANGLE 27EB
+bracket, opening curly 007B
+bracket, opening square 005B
+bracket, right abstract syntax 301B
+BRACKET, RIGHT ANGLE 3009
+bracket, right bag 27E7
+BRACKET, RIGHT BLACK LENTICULAR 3011
+bracket, right chevron 27EB
+BRACKET, RIGHT CORNER 300D
+BRACKET, RIGHT CURLY 007D
+BRACKET, RIGHT DOUBLE ANGLE 300B
+bracket, right sequence 27E9
+BRACKET, RIGHT SQUARE 005D
+BRACKET, RIGHT TORTOISE SHELL 3015
+BRACKET, RIGHT WHITE CORNER 300F
+BRACKET, RIGHT WHITE CURLY 2984
+BRACKET, RIGHT WHITE LENTICULAR 3017
+BRACKET, RIGHT WHITE SQUARE 301B
+BRACKET, RIGHT WHITE TORTOISE SHELL 3019
+BRACKET, RIGHT-POINTING ANGLE 232A
+Brackets 2983
+Brackets, CJK Angle 3008
+Brackets, CJK Corner 300C
+Brackets, Corner 2308
+Brackets, Mathematical 27E6
+Brackets, Ornamental 2768
+Brackets, Vertical 23B4
+Braille Patterns 2800
+brazilian currency 20A2
+BREAK HERE, NO 0083
+BREAK PERMITTED HERE 0082
+breathing mark, greek rough 0314
+breathing mark, greek smooth 0313
+BREVE 02D8
+BREVE BELOW, COMBINING 032E
+BREVE BELOW, COMBINING DOUBLE 035C
+BREVE BELOW, COMBINING INVERTED 032F
+BREVE, COMBINING 0306
+BREVE, COMBINING DOUBLE 035D
+BREVE, COMBINING DOUBLE INVERTED 0361
+BREVE, COMBINING INVERTED 0311
+BRIDGE ABOVE, COMBINING 0346
+BRIDGE ABOVE, COMBINING WIDE 20E9
+BRIDGE BELOW, COMBINING 032A
+BRIDGE BELOW, COMBINING INVERTED 033A
+BROKEN BAR 00A6
+broken vertical bar 00A6
+Buginese 1A00
+Buhid 1740
+BULLET 2022
+BULLET OPERATOR 2219
+BULLET, BLACK LEFTWARDS 204C
+BULLET, BLACK RIGHTWARDS 204D
+BULLET, HYPHEN 2043
+BULLET, REVERSED ROTATED FLORAL HEART 2619
+bullet, tainome japanese 25C9
+BULLET, TRIANGULAR 2023
+BULLET, WHITE 25E6
+BULLSEYE 25CE
+bullseye, latin letter 0298
+buried symbol 26B0
+Burmese 1000
+by definition, equal to 225C
+BY DEFINITION, EQUAL TO 225D
+BY, MEASURED 225E
+byte order mark FEFF
+Byzantine Musical Symbols 1D000
+C WITH ACUTE, LATIN SMALL LETTER 0107
+C WITH CARON, LATIN SMALL LETTER 010D
+C WITH CEDILLA, LATIN CAPITAL LETTER 00C7
+C WITH CEDILLA, LATIN SMALL LETTER 00E7
+C WITH CIRCUMFLEX, LATIN SMALL LETTER 0109
+C WITH CURL, LATIN SMALL LETTER 0255
+C WITH DOT ABOVE, LATIN SMALL LETTER 010B
+C WITH HOOK, LATIN SMALL LETTER 0188
+C WITH STROKE, LATIN CAPITAL LETTER 023B
+C WITH STROKE, LATIN SMALL LETTER 023C
+c, apostrophic 2183
+C, BLACK-LETTER CAPITAL 212D
+C, COMBINING LATIN SMALL LETTER 0368
+C, DOUBLE-STRUCK CAPITAL 2102
+C, LATIN LETTER SMALL CAPITAL 1D04
+C, LATIN LETTER STRETCHED 0297
+C, LATIN SMALL LETTER REVERSED 2184
+C0 Control Codes, ASCII 0000
+C1 Control Codes 0080
+CADA UNA 2106
+CADUCEUS 2624
+Cambodian 1780
+Canadian Aboriginal Syllabics, Unified 1400
+CANADIAN SYLLABICS FULL STOP 166E
+Canadian Syllabics Punctuation 166D
+CANCEL 0018
+CANCEL CHARACTER 0094
+CANCEL TAG E007F
+CANCEL, SYMBOL FOR 2418
+CANCELLATION MARK, LAO 0ECC
+CANCER 264B
+CANDRABINDU, COMBINING 0310
+CANDRABINDU, DEVANAGARI SIGN 0901
+Cantillation Marks, Hebrew 0591
+Cantillation Signs, Tibetan 0FC0
+cap 2229
+CAP, SQUARE 2293
+Capital Letters, Armenian 0531
+Capital Letters, Cyrillic 0400
+Capital Letters, Georgian 10A0
+Capital Letters, Greek 0391
+Capital Letters, Latin 0041
+CAPRICORN 2651
+caps lock 21EA
+caps lock 21EC
+Card Suits, Playing 2660
+cardinal, first transfinite 2135
+cardinal, fourth transfinite 2138
+cardinal, second transfinite 2136
+cardinal, third transfinite 2137
+CARE OF 2105
+caret 028C
+CARET 2038
+CARET INSERTION POINT 2041
+Carian 102A0
+CARON 02C7
+CARON BELOW, COMBINING 032C
+CARON, COMBINING 030C
+CARRIAGE RETURN 000D
+CARRIAGE RETURN, SYMBOL FOR 240D
+cartesian product 00D7
+CAUTION SIGN 2621
+CEDI SIGN 20B5
+CEDILLA 00B8
+cedilla above 0312
+CEDILLA, COMBINING 0327
+CEDILLA, LATIN CAPITAL LETTER C WITH 00C7
+CEDILLA, LATIN SMALL LETTER C WITH 00E7
+cedilla, spacing 00B8
+CEILING, LEFT 2308
+CEILING, RIGHT 2309
+CELSIUS, DEGREE 2103
+CENT SIGN 00A2
+center 2385
+centigrade, degrees 2103
+CENTRE LINE SYMBOL 2104
+CENTRELINE LOW LINE FE4E
+CENTRELINE OVERLINE FE4A
+cgj 034F
+Cham AA00
+chandrakkala, malayalam 0D4D
+CHARACTER INTRODUCER, SINGLE 009A
+CHARACTER TABULATION 0009
+CHARACTER TABULATION SET 0088
+CHARACTER TABULATION WITH JUSTIFICATION 0089
+CHARACTER TIE 2040
+Chart Components, Form and 2500
+CHECK MARK 2713
+CHECK MARK, HEAVY 2714
+CHECK MARK, NOT 237B
+CHECK, BALLOT BOX WITH 2611
+Checkers, Symbols for Draughts and 26C0
+Cherokee 13A0
+Chess Symbols 2654
+Chess Symbols, Japanese 2616
+chevron bracket, left 27EA
+chevron bracket, right 27EB
+chevrons 00AB
+CHI RHO 2627
+Chillu Letters, Malayalam 0D7A
+Chinese Bopomofo 3100
+Chinese Bopomofo Extensions 31A0
+chinese fifth or neutral tone, mandarin 02D9
+chinese first tone, mandarin 02C9
+chinese fourth tone, mandarin 02CB
+chinese second tone, mandarin 02CA
+chinese third tone, mandarin 02C7
+Chinese, Corner Tone Marks for A700
+choice, dijkstra 2AFE
+choice, n-ary dijkstra 2AFF
+christogram 2627
+CIRCLE BACKSLASH, COMBINING ENCLOSING 20E0
+Circle Symbols 29B5
+CIRCLE, BLACK 25CF
+circle, black small 2022
+CIRCLE, COMBINING ENCLOSING 20DD
+CIRCLE, DOTTED 25CC
+circle, jis composition 20DD
+CIRCLE, LARGE 25EF
+CIRCLE, MEDIUM BLACK 26AB
+CIRCLE, MEDIUM SMALL WHITE 26AC
+CIRCLE, MEDIUM WHITE 26AA
+CIRCLE, SHADOWED WHITE 274D
+CIRCLE, WHITE 25CB
+CIRCLED ASTERISK OPERATOR 229B
+CIRCLED DASH 229D
+CIRCLED DIGIT ZERO 24EA
+Circled Digits, Dingbat 2776
+CIRCLED DIVISION SIGN 2A38
+CIRCLED DIVISION SLASH 2298
+CIRCLED DOT OPERATOR 2299
+CIRCLED DOT OPERATOR, N-ARY 2A00
+CIRCLED EQUALS 229C
+Circled Ideographs 3280
+Circled Inverse Numbers 2776
+Circled Katakana 32D0
+Circled Korean Hangul Elements 3260
+Circled Korean Hangul Syllables 326E
+Circled Latin Letters 24B6
+CIRCLED MINUS 2296
+Circled Numbers 2460
+Circled Numbers 3251
+Circled Numbers 32B1
+Circled Numbers, Double 24F5
+Circled Numbers, White on Black 24EB
+CIRCLED PLUS 2295
+CIRCLED PLUS OPERATOR, N-ARY 2A01
+CIRCLED POSTAL MARK 3036
+CIRCLED RING OPERATOR 229A
+CIRCLED TIMES 2297
+CIRCLED TIMES OPERATOR, N-ARY 2A02
+Circles 25CB
+CIRCUMFLEX ACCENT 005E
+CIRCUMFLEX ACCENT BELOW, COMBINING 032D
+CIRCUMFLEX ACCENT, COMBINING 0302
+CIRCUMFLEX ACCENT, MODIFIER LETTER 02C6
+circumflex accent, spacing 005E
+CJK Angle Brackets 3008
+CJK Compatibility 3300
+CJK Compatibility Forms FE30
+CJK Compatibility Ideographs F900
+CJK Compatibility Ideographs Supplement 2F800
+CJK Corner Brackets 300C
+CJK Diacritics 302A
+CJK Ideographic Description Characters 2FF0
+CJK Ideographs Area 3400
+CJK Ideographs Area, Supplementary 20000
+CJK Ideographs, Parenthesized 3220
+CJK Kangxi Radicals 2F00
+CJK Letters and Months, Enclosed 3200
+CJK Phonetics and Symbols Area 2E80
+CJK Punctuation, Halfwidth FF61
+CJK Quotation Marks 300C
+CJK Radicals Supplement 2E80
+CJK Strokes 31C0
+CJK Symbols and Punctuation 3000
+CJK Unified Ideographs 4E00
+CJK Unified Ideographs Extension A 3400
+CJK Unified Ideographs Extension B 20000
+claudian antisigma 2183
+claudian digamma inversum 2133
+clear key 2327
+CLEAR SCREEN SYMBOL 239A
+clear weather 2600
+CLICK, LATIN LETTER ALVEOLAR 01C2
+CLICK, LATIN LETTER BILABIAL 0298
+CLICK, LATIN LETTER DENTAL 01C0
+CLICK, LATIN LETTER LATERAL 01C1
+CLICK, LATIN LETTER RETROFLEX 01C3
+Clicks, African Letters for 01C0
+CLOCKWISE ARROW ABOVE, COMBINING 20D5
+CLOCKWISE CONTOUR INTEGRAL 2232
+CLOCKWISE INTEGRAL 2231
+CLOCKWISE RING OVERLAY, COMBINING 20D9
+clone 2104
+Clones of Diacritics, Spacing 02D8
+CLOSE UP 2050
+closed epsilon, latin small letter 029A
+CLOSED OMEGA, LATIN SMALL LETTER 0277
+CLOSED OPEN E, LATIN SMALL LETTER 029A
+closed reversed epsilon, latin small letter 025E
+CLOSED REVERSED OPEN E, LATIN SMALL LETTER 025E
+closing brace 007D
+closing curly bracket 007D
+CLOSING MARK, IDEOGRAPHIC 3006
+closing parenthesis 0029
+closing square bracket 005D
+CLOUD 2601
+cloudy weather 2601
+CNS 11643-1992, Duplicate Characters from 2F800
+coffee, cup of 2615
+COFFIN 26B0
+COLON 003A
+COLON EQUALS 2254
+colon right arrow 29F4
+COLON SIGN 20A1
+COLON, EQUALS 2255
+COLON, ETHIOPIC 1365
+COLON, ETHIOPIC PREFACE 1366
+COLON, MODIFIER LETTER HALF TRIANGULAR 02D1
+COLON, MODIFIER LETTER TRIANGULAR 02D0
+COLON, MONGOLIAN 1804
+COLON, Z NOTATION TYPE 2982
+COMBINING ACUTE ACCENT 0301
+COMBINING ACUTE ACCENT BELOW 0317
+COMBINING ACUTE TONE MARK 0341
+COMBINING ALMOST EQUAL TO ABOVE 034C
+Combining Alphabet, Korean Hangul Jamo 1100
+COMBINING ANNUITY SYMBOL 20E7
+COMBINING ANTICLOCKWISE ARROW ABOVE 20D4
+COMBINING ANTICLOCKWISE RING OVERLAY 20DA
+COMBINING ASTERISK ABOVE 20F0
+COMBINING ASTERISK BELOW 0359
+COMBINING BREVE 0306
+COMBINING BREVE BELOW 032E
+COMBINING BRIDGE ABOVE 0346
+COMBINING BRIDGE BELOW 032A
+COMBINING CANDRABINDU 0310
+COMBINING CARON 030C
+COMBINING CARON BELOW 032C
+COMBINING CEDILLA 0327
+Combining Characters, Cyrillic 0483
+COMBINING CIRCUMFLEX ACCENT 0302
+COMBINING CIRCUMFLEX ACCENT BELOW 032D
+COMBINING CLOCKWISE ARROW ABOVE 20D5
+COMBINING CLOCKWISE RING OVERLAY 20D9
+COMBINING COMMA ABOVE 0313
+COMBINING COMMA ABOVE RIGHT 0315
+COMBINING COMMA BELOW 0326
+COMBINING CONJOINING MACRON FE26
+combining counterclockwise arrow above 20D4
+combining counterclockwise ring overlay 20DA
+Combining Diacritical Marks 0300
+Combining Diacritical Marks for Symbols 20D0
+COMBINING DIAERESIS 0308
+COMBINING DIAERESIS BELOW 0324
+COMBINING DOT ABOVE 0307
+COMBINING DOT ABOVE RIGHT 0358
+COMBINING DOT BELOW 0323
+COMBINING DOUBLE ACUTE ACCENT 030B
+COMBINING DOUBLE BREVE 035D
+COMBINING DOUBLE BREVE BELOW 035C
+COMBINING DOUBLE GRAVE ACCENT 030F
+COMBINING DOUBLE INVERTED BREVE 0361
+COMBINING DOUBLE LOW LINE 0333
+COMBINING DOUBLE MACRON 035E
+COMBINING DOUBLE MACRON BELOW 035F
+COMBINING DOUBLE OVERLINE 033F
+COMBINING DOUBLE RIGHTWARDS ARROW BELOW 0362
+COMBINING DOUBLE RING BELOW 035A
+COMBINING DOUBLE TILDE 0360
+COMBINING DOUBLE VERTICAL LINE ABOVE 030E
+COMBINING DOUBLE VERTICAL LINE BELOW 0348
+COMBINING DOUBLE VERTICAL STROKE OVERLAY 20E6
+COMBINING DOWN TACK BELOW 031E
+COMBINING ENCLOSING CIRCLE 20DD
+COMBINING ENCLOSING CIRCLE BACKSLASH 20E0
+COMBINING ENCLOSING DIAMOND 20DF
+COMBINING ENCLOSING KEYCAP 20E3
+COMBINING ENCLOSING SCREEN 20E2
+COMBINING ENCLOSING SQUARE 20DE
+COMBINING ENCLOSING UPWARD POINTING TRIANGLE 20E4
+COMBINING EQUALS SIGN BELOW 0347
+COMBINING FERMATA 0352
+COMBINING FOUR DOTS ABOVE 20DC
+COMBINING GRAPHEME JOINER 034F
+COMBINING GRAVE ACCENT 0300
+COMBINING GRAVE ACCENT BELOW 0316
+COMBINING GRAVE TONE MARK 0340
+COMBINING GREEK DIALYTIKA TONOS 0344
+COMBINING GREEK KORONIS 0343
+COMBINING GREEK PERISPOMENI 0342
+COMBINING GREEK YPOGEGRAMMENI 0345
+combining hacek 030C
+Combining Half Marks FE20
+COMBINING HOMOTHETIC ABOVE 034B
+COMBINING HOOK ABOVE 0309
+COMBINING HORN 031B
+COMBINING INVERTED BREVE 0311
+COMBINING INVERTED BREVE BELOW 032F
+COMBINING INVERTED BRIDGE BELOW 033A
+COMBINING INVERTED DOUBLE ARCH BELOW 032B
+combining japanese daku-on 3099
+combining japanese han-daku-on 309A
+Combining Latin Small Letters 0363
+COMBINING LEFT ANGLE ABOVE 031A
+COMBINING LEFT ANGLE BELOW 0349
+COMBINING LEFT ARROW ABOVE 20D6
+COMBINING LEFT ARROW BELOW 20EE
+COMBINING LEFT ARROWHEAD BELOW 0354
+COMBINING LEFT HALF RING ABOVE 0351
+COMBINING LEFT HALF RING BELOW 031C
+COMBINING LEFT HARPOON ABOVE 20D0
+COMBINING LEFT RIGHT ARROW ABOVE 20E1
+COMBINING LEFT RIGHT ARROW BELOW 034D
+COMBINING LEFT TACK BELOW 0318
+COMBINING LEFTWARDS ARROW OVERLAY 20EA
+COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS 20ED
+COMBINING LONG DOUBLE SOLIDUS OVERLAY 20EB
+COMBINING LONG SOLIDUS OVERLAY 0338
+COMBINING LONG STROKE OVERLAY 0336
+COMBINING LONG VERTICAL LINE OVERLAY 20D2
+COMBINING LOW LINE 0332
+COMBINING MACRON 0304
+COMBINING MACRON BELOW 0331
+COMBINING MACRON LEFT HALF FE24
+COMBINING MACRON RIGHT HALF FE25
+Combining Marks, Arabic 0653
+COMBINING MINUS SIGN BELOW 0320
+COMBINING NOT TILDE ABOVE 034A
+COMBINING OGONEK 0328
+COMBINING OVERLINE 0305
+COMBINING PALATALIZED HOOK BELOW 0321
+COMBINING PLUS SIGN BELOW 031F
+COMBINING RETROFLEX HOOK BELOW 0322
+COMBINING REVERSE SOLIDUS OVERLAY 20E5
+COMBINING REVERSED COMMA ABOVE 0314
+COMBINING RIGHT ARROW ABOVE 20D7
+COMBINING RIGHT ARROW BELOW 20EF
+COMBINING RIGHT ARROWHEAD ABOVE 0350
+COMBINING RIGHT ARROWHEAD BELOW 0355
+COMBINING RIGHT HALF RING ABOVE 0357
+COMBINING RIGHT HALF RING BELOW 0339
+COMBINING RIGHT HARPOON ABOVE 20D1
+COMBINING RIGHT TACK BELOW 0319
+COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS 20EC
+COMBINING RING ABOVE 030A
+COMBINING RING BELOW 0325
+COMBINING RING OVERLAY 20D8
+COMBINING SEAGULL BELOW 033C
+COMBINING SHORT SOLIDUS OVERLAY 0337
+COMBINING SHORT STROKE OVERLAY 0335
+COMBINING SHORT VERTICAL LINE OVERLAY 20D3
+COMBINING SQUARE BELOW 033B
+COMBINING THREE DOTS ABOVE 20DB
+COMBINING TILDE 0303
+COMBINING TILDE BELOW 0330
+COMBINING TILDE OVERLAY 0334
+COMBINING TRIPLE UNDERDOT 20E8
+COMBINING TURNED COMMA ABOVE 0312
+COMBINING UP TACK BELOW 031D
+COMBINING UPWARDS ARROW BELOW 034E
+COMBINING VERTICAL LINE ABOVE 030D
+COMBINING VERTICAL LINE BELOW 0329
+COMBINING VERTICAL TILDE 033E
+COMBINING WIDE BRIDGE ABOVE 20E9
+COMBINING X ABOVE 033D
+COMBINING X BELOW 0353
+COMBINING ZIGZAG ABOVE 035B
+COMET 2604
+COMMA 002C
+COMMA ABOVE RIGHT, COMBINING 0315
+COMMA ABOVE, COMBINING 0313
+COMMA ABOVE, COMBINING REVERSED 0314
+COMMA ABOVE, COMBINING TURNED 0312
+COMMA BELOW, COMBINING 0326
+comma quotation mark, double 201D
+comma quotation mark, double reversed 201F
+comma quotation mark, double turned 201C
+comma quotation mark, low double 201E
+comma quotation mark, low single 201A
+comma quotation mark, single 2019
+comma quotation mark, single reversed 201B
+comma quotation mark, single turned 2018
+COMMA, ARABIC 060C
+COMMA, ARMENIAN 055D
+COMMA, ETHIOPIC 1363
+comma, georgian 00B7
+COMMA, IDEOGRAPHIC 3001
+comma, invisible 2063
+COMMA, MODIFIER LETTER REVERSED 02BD
+COMMA, MODIFIER LETTER TURNED 02BB
+COMMA, MONGOLIAN 1802
+COMMA, MONGOLIAN MANCHU 1808
+command key 2318
+COMMAND, APPLICATION PROGRAM 009F
+COMMAND, OPERATING SYSTEM 009D
+COMMERCIAL AT 0040
+COMMERCIAL MINUS SIGN 2052
+compass 263C
+Compatibility and Specials Area F900
+Compatibility Forms, CJK FE30
+Compatibility Ideographs Supplement, CJK 2F800
+Compatibility Ideographs, CJK F900
+Compatibility Ideographs, DPRK FA70
+Compatibility Ideographs, JIS X 0213 FA30
+Compatibility Jamo, Korean Hangul 3130
+Compatibility, CJK 3300
+COMPLEMENT 2201
+complex numbers 2102
+component, radial 27DF
+Components, Form and Chart 2500
+composite function 2218
+composition circle, jis 20DD
+COMPOSITION SYMBOL 2384
+concatenation, sequence 2040
+CONICAL TAPER 2332
+CONJOINING MACRON, COMBINING FE26
+CONJUGATE MATRIX, HERMITIAN 22B9
+conjunction 2227
+CONJUNCTION 260C
+constant pi, mathematical 03C0
+CONSTANT, EULER 2107
+CONSTANT, PLANCK 210E
+constantine's cross 2627
+CONTAINS AS MEMBER 220B
+CONTAINS AS MEMBER, SMALL 220D
+CONTAINS AS NORMAL SUBGROUP 22B3
+Contextual Form Glyphs, Arabic FB50
+Contextual Form Glyphs, Arabic FE80
+continuity, absolute 2AA1
+CONTINUOUS UNDERLINE SYMBOL 2381
+continuum, second transfinite cardinal 2136
+CONTOUR INTEGRAL 222E
+CONTOUR INTEGRAL, ANTICLOCKWISE 2233
+CONTOUR INTEGRAL, CLOCKWISE 2232
+contour integral, counterclockwise 2233
+contraction operator 20E9
+control 2388
+Control Code Graphics, Quadrant 25F0
+Control Codes, ASCII C0 0000
+Control Codes, C0 0000
+Control Codes, C1 0080
+Control Codes, Graphic Pictures for 2400
+Control Codes, Graphics for 237D
+CONTROL SEQUENCE INTRODUCER 009B
+Controls, Bidirectional Format 202A
+Controls, Mongolian Format 180B
+coproduct sign 2210
+COPRODUCT, N-ARY 2210
+Coptic Letters Derived from Demotic 03E2
+Coptic, Bohairic 2C80
+Coptic, Continuous Macrons for FE24
+Coptic, Extended 2CB2
+COPYRIGHT SIGN 00A9
+COPYRIGHT, SOUND RECORDING 2117
+Corner Brackets 2308
+Corner Brackets, CJK 300C
+Corner Tone Marks for Chinese A700
+Corners, Quine 231C
+CORRESPONDS TO 2258
+corresponds to 2259
+costa rican currency 20A1
+countable, first transfinite cardinal 2135
+COUNTERBORE 2334
+counterclockwise arrow above, combining 20D4
+counterclockwise contour integral 2233
+counterclockwise integration 2A11
+counterclockwise ring overlay, combining 20DA
+COUNTERSINK 2335
+cr 000D
+CREDIT SIGN, TAMIL 0BF7
+cremated symbol 26B1
+CRESCENT, STAR AND 262A
+Croatian Digraphs Matching Serbian Cyrillic Letters 01C4
+Crops 230C
+CROSS ACCENT, MODIFIER LETTER 02DF
+Cross Dingbats 2719
+CROSS OF JERUSALEM 2629
+CROSS OF LORRAINE 2628
+cross ratio 211E
+cross, constantine's 2627
+CROSS, DOTTED 205C
+CROSS, EAST SYRIAC 2671
+CROSS, LATIN 271D
+cross, long 2020
+CROSS, MALTESE 2720
+CROSS, ORTHODOX 2626
+cross, st. andrew's 2613
+CROSS, WEST SYRIAC 2670
+CROSSED SWORDS 2694
+Crosses 2719
+crosshatch 0023
+CRUZEIRO SIGN 20A2
+CUBE ROOT 221B
+cubed 00B3
+Cuneiform 12000
+Cuneiform Numbers and Punctuation 12400
+cup 222A
+cup of coffee 2615
+cup of tea 2615
+CUP, SQUARE 2294
+curled beta 03D0
+curly bracket, closing 007D
+CURLY BRACKET, LEFT 007B
+CURLY BRACKET, LEFT WHITE 2983
+curly bracket, opening 007B
+CURLY BRACKET, RIGHT 007D
+CURLY BRACKET, RIGHT WHITE 2984
+CURLY LOGICAL AND 22CF
+CURLY LOGICAL OR 22CE
+CURRENCY SIGN 00A4
+Currency Signs, Bengali 09F2
+CURRENCY SYMBOL BAHT, THAI 0E3F
+CURRENCY SYMBOL RIEL, KHMER 17DB
+currency symbol, florin 0192
+Currency Symbols 20A0
+currency, argentinian former 20B3
+currency, brazilian 20A2
+currency, costa rican 20A1
+currency, el salvadorian 20A1
+currency, euro european 20AC
+currency, french 20A3
+currency, ghana 20B5
+currency, greek 20AF
+currency, indian 20A8
+currency, iranian FDFC
+currency, israeli 20AA
+currency, italian 20A4
+currency, korean 20A9
+currency, laotian 20AD
+currency, mongolian 20AE
+currency, nigerian 20A6
+currency, paraguayan 20B2
+currency, phillipine 20B1
+currency, spanish 20A7
+currency, turkish 20A4
+currency, ukrainian 20B4
+currency, vietnamese 20AB
+CURRENT SYMBOL FORM TWO, DIRECT 2393
+CURRENT, AC 23E6
+current, alternating 223F
+cursor down, fast 21A1
+cursor left, fast 219E
+cursor right, fast 21A0
+cursor up, fast 219F
+cycle 223C
+CYLINDRICITY 232D
+Cypriot Syllabary 10800
+Cyrillic 0400
+Cyrillic Capital Letters 0400
+Cyrillic Combining Characters 0483
+Cyrillic Extended-A 2DE0
+Cyrillic Extended-B A640
+Cyrillic Extensions 0450
+Cyrillic Extensions 048A
+Cyrillic Historic Letters 0460
+Cyrillic Small Letters 0430
+Cyrillic Supplement 0500
+d retroflex hook, latin small letter 0256
+D WITH CARON, LATIN SMALL LETTER 010F
+D WITH CEDILLA, LATIN SMALL LETTER 1E11
+D WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER 1E13
+D WITH CURL, LATIN SMALL LETTER 0221
+D WITH DOT ABOVE, LATIN SMALL LETTER 1E0B
+D WITH DOT BELOW, LATIN SMALL LETTER 1E0D
+D WITH HOOK, LATIN CAPITAL LETTER 018A
+D WITH HOOK, LATIN SMALL LETTER 0257
+D WITH LINE BELOW, LATIN SMALL LETTER 1E0F
+D WITH STROKE, LATIN SMALL LETTER 0111
+D WITH TAIL, LATIN SMALL LETTER 0256
+D WITH TOPBAR, LATIN SMALL LETTER 018C
+d'alembertian 29E0
+D, COMBINING LATIN SMALL LETTER 0369
+D, DOUBLE-STRUCK ITALIC CAPITAL 2145
+D, DOUBLE-STRUCK ITALIC SMALL 2146
+D, LATIN CAPITAL LETTER AFRICAN 0189
+D, LATIN LETTER SMALL CAPITAL 1D05
+DAGGER 2020
+DAGGER, DOUBLE 2021
+daku-on, combining japanese 3099
+daku-on, japanese 309B
+DALET SYMBOL 2138
+DANDA, DEVANAGARI 0964
+DANDA, DEVANAGARI DOUBLE 0965
+dash, angled 00AC
+DASH, CIRCLED 229D
+DASH, EM 2014
+DASH, EN 2013
+DASH, FIGURE 2012
+dash, quotation 2015
+DASH, SWUNG 2053
+DASH, WAVE 301C
+DASH, WAVY 3030
+DASHED LOW LINE FE4D
+DASHED OVERLINE FE49
+Dashes 2010
+dasia, greek 0314
+DATA LINK ESCAPE 0010
+DATA LINK ESCAPE, SYMBOL FOR 2410
+Database Theory Operators 27D5
+DAVID, STAR OF 2721
+DAY SIGN, TAMIL 0BF3
+Days, Ideographic Telegraph Symbols for 33E0
+DB DIGRAPH, LATIN SMALL LETTER 0238
+DEBIT SIGN, TAMIL 0BF6
+decimal point 002E
+decimal separator 002C
+DECIMAL SEPARATOR KEY SYMBOL 2396
+DECIMAL SEPARATOR, ARABIC 066B
+deergh viram, devanagari 0965
+DEGREE CELSIUS 2103
+DEGREE FAHRENHEIT 2109
+DEGREE SIGN 00B0
+degrees centigrade 2103
+del 2207
+DELETE 007F
+DELETE FORM TWO, SYMBOL FOR 2425
+delete to the left key 232B
+delete to the right key 2326
+DELETE, SYMBOL FOR 2421
+DELTA EQUAL TO 225C
+DELTA, LATIN SMALL LETTER TURNED 018D
+Demotic, Coptic Letters Derived from 03E2
+DENTAL CLICK, LATIN LETTER 01C0
+Dentistry Notation Symbols 23BE
+depth symbol 21A7
+derivative 0307
+derivative, double 0308
+derivative, fourth 20DC
+derivative, third 20DB
+DESCENDING NODE 260B
+Deseret 10400
+Devanagari 0900
+devanagari bindu 0902
+Devanagari Consonants 0915
+DEVANAGARI DANDA 0964
+devanagari deergh viram 0965
+Devanagari Dependent Vowel Signs 093E
+Devanagari Digits 0966
+DEVANAGARI DOUBLE DANDA 0965
+Devanagari Extensions 0951
+Devanagari Independent Vowels 0904
+DEVANAGARI OM 0950
+devanagari purna viram 0964
+DEVANAGARI SIGN ANUSVARA 0902
+DEVANAGARI SIGN AVAGRAHA 093D
+DEVANAGARI SIGN CANDRABINDU 0901
+DEVANAGARI SIGN NUKTA 093C
+DEVANAGARI SIGN VIRAMA 094D
+DEVANAGARI SIGN VISARGA 0903
+Device Controls 0011
+Device Controls, Symbols for 2411
+DHARMA, WHEEL OF 2638
+diacritic, finite function 20E6
+Diacritical Marks for Symbols, Combining 20D0
+Diacritical Marks, Combining 0300
+Diacritics for Greek 0342
+Diacritics for IPA 0346
+Diacritics for Uralic Phonetic Alphabet 0350
+Diacritics, CJK 302A
+Diacritics, Double 035C
+Diacritics, Enclosing 20DD
+Diacritics, Medieval Superscript Letter 0363
+Diacritics, Ordinary 0300
+Diacritics, Overstruck 0334
+Diacritics, Spacing Clones of 02D8
+DIAERESIS 00A8
+DIAERESIS BELOW, COMBINING 0324
+DIAERESIS, COMBINING 0308
+diaeresis, spacing 00A8
+DIAGONAL ELLIPSIS, DOWN RIGHT 22F1
+DIAGONAL ELLIPSIS, UP RIGHT 22F0
+DIALYTIKA TONOS, COMBINING GREEK 0344
+dialytika, greek 0308
+DIAMETER SIGN 2300
+DIAMOND OPERATOR 22C4
+DIAMOND, COMBINING ENCLOSING 20DF
+Diamonds 25C6
+Diamonds and Lozenges 2B25
+Dice 2680
+Dictionary and Map Symbols 2690
+Dictionary Punctuation 2E1A
+diesis 2021
+difference between 223C
+DIFFERENCE BETWEEN 224F
+difference or sum, positive 2A24
+difference, backward 2207
+difference, forward 2206
+difference, sum or positive 2A26
+difference, symmetric 2206
+difference, symmetric 2238
+difference, symmetric 2296
+DIFFERENTIAL, PARTIAL 2202
+digamma inversum, claudian 2133
+DIGIT ZERO, CIRCLED 24EA
+Digits Minus Half, Tibetan 0F2A
+Digits Symbols, Mathematical 1D7CE
+Digits, Arabic-Indic 0660
+Digits, ASCII 0030
+Digits, Balinese 1B50
+Digits, Bengali 09E6
+Digits, Bold 1D7CE
+Digits, Devanagari 0966
+Digits, Dingbat Circled 2776
+Digits, Double-struck 1D7D8
+Digits, Eastern Arabic-Indic 06F0
+Digits, Ethiopic 1369
+Digits, Gujarati 0AE6
+Digits, Gurmukhi 0A66
+Digits, Kannada 0CE6
+Digits, Kharoshthi 10A40
+Digits, Khmer 17E0
+Digits, Lao 0ED0
+Digits, Limbu 1946
+Digits, Malayalam 0D66
+Digits, Mongolian 1810
+Digits, Monospace 1D7F6
+Digits, Myanmar 1040
+Digits, New Tai Lue 19D0
+Digits, Oriya 0B66
+Digits, Osmanya 104A0
+Digits, Sans-serif 1D7E2
+Digits, Sans-serif Bold 1D7EC
+Digits, Subscript 2080
+Digits, Superscript 2070
+Digits, Tamil 0BE7
+Digits, Telugu 0C66
+Digits, Thai 0E50
+Digits, Tibetan 0F20
+Digram Symbols, Yijing / I Ching Monogram and 268A
+Digraphs Matching Serbian Cyrillic Letters, Croatian 01C4
+Digraphs, Phonetic 02A3
+Digraphs, Yiddish 05F0
+dijkstra choice 2AFE
+dijkstra choice, n-ary 2AFF
+DIMENSION ORIGIN 2331
+Dingbat Arrows 2794
+Dingbat Circled Digits 2776
+Dingbats 2700
+Dingbats Series 100, ITC Zapf 2700
+Dingbats, Arrow 2794
+Dingbats, Asterisk 2722
+Dingbats, Cross 2719
+Dingbats, Drop-shadowed 274D
+Dingbats, Hazard 2620
+Dingbats, Heart 2763
+Dingbats, Miscellaneous 2600
+Dingbats, Music 2669
+Dingbats, Pencil 270E
+Dingbats, Pointing Index Finger 261A
+Dingbats, Quotation Mark 275B
+Dingbats, Scissors 2701
+Dingbats, Snowflake 2744
+Dingbats, Star 2726
+Dingbats, Vertical Bar 2758
+Dingbats, Warning 2620
+Dingbats, Weather 2600
+Dingbats, Zapf 2700
+DIRECT CURRENT SYMBOL FORM TWO 2393
+direct product 2299
+direct sum 2295
+Directional Format Characters 202A
+DIRECTIONAL FORMATTING, POP 202C
+DISCONTINUOUS UNDERLINE SYMBOL 2382
+discretionary hyphen 00AD
+disjunction 2228
+DITTO MARK 3003
+DIVIDES 2223
+Divination, Khmer Numeric Symbols for 17F0
+DIVISION SIGN 00F7
+Division Sign Operators, Multiplication and 2A2F
+DIVISION SIGN, CIRCLED 2A38
+DIVISION SLASH 2215
+DIVISION SLASH, CIRCLED 2298
+DIVISION TIMES 22C7
+DIVISION, LONG 27CC
+DIVORCE SYMBOL 26AE
+DOES NOT CONTAIN AS MEMBER 220C
+DOES NOT DIVIDE 2224
+DOES NOT EXIST, THERE 2204
+does not yield 22A3
+DOLLAR SIGN 0024
+domain restriction 25C1
+Domino Tiles 1F030
+DONG SIGN 20AB
+dot 002E
+DOT ABOVE 02D9
+DOT ABOVE RIGHT, COMBINING 0358
+DOT ABOVE, COMBINING 0307
+dot above, double 0308
+DOT BELOW, COMBINING 0323
+DOT BELOW, MYANMAR SIGN 1037
+DOT LEADER, ONE 2024
+dot leader, three 2026
+DOT LEADER, TWO 2025
+DOT MINUS 2238
+DOT OPERATOR 22C5
+DOT OPERATOR, CIRCLED 2299
+DOT OPERATOR, SQUARED 22A1
+DOT PLUS 2214
+DOT PUNCTUATION, FIVE 2059
+DOT PUNCTUATION, FOUR 2058
+DOT PUNCTUATION, THREE 2056
+DOT PUNCTUATION, TWO 205A
+dot, greek middle 00B7
+DOT, KATAKANA MIDDLE 30FB
+dot, latin capital letter i 0130
+DOT, MIDDLE 00B7
+DOT, SESAME FE45
+DOT, VERTICAL LINE WITH MIDDLE 237F
+DOT, WHITE SESAME FE46
+DOTLESS I, LATIN SMALL LETTER 0131
+DOTLESS J WITH STROKE, LATIN SMALL LETTER 025F
+DOTLESS J, LATIN SMALL LETTER 0237
+Dotless Mathematical Symbols 1D6A4
+DOTS ABOVE, COMBINING FOUR 20DC
+DOTS ABOVE, COMBINING THREE 20DB
+DOTS, MONGOLIAN FOUR 1805
+DOTS, VERTICAL FOUR 205E
+DOTTED CIRCLE 25CC
+DOTTED CROSS 205C
+DOTTED FENCE 2999
+Dotted Mathematical Operators 2234
+DOUBLE ACUTE ACCENT 02DD
+DOUBLE ACUTE ACCENT, COMBINING 030B
+DOUBLE ANGLE BRACKET, LEFT 300A
+DOUBLE ANGLE BRACKET, MATHEMATICAL LEFT 27EA
+DOUBLE ANGLE BRACKET, MATHEMATICAL RIGHT 27EB
+DOUBLE ANGLE BRACKET, RIGHT 300B
+DOUBLE ANGLE QUOTATION MARK, LEFT-POINTING 00AB
+DOUBLE ANGLE QUOTATION MARK, RIGHT-POINTING 00BB
+DOUBLE APOSTROPHE, MODIFIER LETTER 02EE
+DOUBLE ARCH BELOW, COMBINING INVERTED 032B
+Double Arrows 21CD
+DOUBLE BREVE BELOW, COMBINING 035C
+DOUBLE BREVE, COMBINING 035D
+Double Circled Numbers 24F5
+double comma quotation mark 201D
+double comma quotation mark, low 201E
+DOUBLE DAGGER 2021
+DOUBLE DANDA, DEVANAGARI 0965
+double derivative 0308
+Double Diacritics 035C
+double dot above 0308
+DOUBLE EXCLAMATION MARK 203C
+DOUBLE GRAVE ACCENT, COMBINING 030F
+DOUBLE HIGH-REVERSED-9 QUOTATION MARK 201F
+DOUBLE HYPHEN, KATAKANA-HIRAGANA 30A0
+DOUBLE INTEGRAL 222C
+DOUBLE INTERSECTION 22D2
+DOUBLE INVERTED BREVE, COMBINING 0361
+DOUBLE LOGICAL AND 2A53
+DOUBLE LOGICAL OR 2A54
+DOUBLE LOW LINE 2017
+DOUBLE LOW LINE, COMBINING 0333
+DOUBLE LOW-9 QUOTATION MARK 201E
+DOUBLE MACRON BELOW, COMBINING 035F
+DOUBLE MACRON, COMBINING 035E
+Double Operators 22D0
+DOUBLE OVERLINE, COMBINING 033F
+double pipe 01C1
+DOUBLE PLUS 29FA
+DOUBLE PRECEDES 2ABB
+DOUBLE PRIME 2033
+DOUBLE PRIME QUOTATION MARK 301E
+DOUBLE PRIME QUOTATION MARK, LOW 301F
+DOUBLE PRIME QUOTATION MARK, REVERSED 301D
+DOUBLE PRIME, MODIFIER LETTER 02BA
+DOUBLE PRIME, REVERSED 2036
+Double Punctuation for Vertical Text 2047
+DOUBLE PUNCTUATION, PHILIPPINE 1736
+DOUBLE QUESTION MARK 2047
+DOUBLE QUOTATION MARK, LEFT 201C
+DOUBLE QUOTATION MARK, RIGHT 201D
+double reversed comma quotation mark 201F
+DOUBLE RIGHTWARDS ARROW BELOW, COMBINING 0362
+DOUBLE RING BELOW, COMBINING 035A
+double slash overlay, long 20EB
+DOUBLE SOLIDUS OPERATOR 2AFD
+DOUBLE SOLIDUS OVERLAY, COMBINING LONG 20EB
+DOUBLE SUBSET 22D0
+DOUBLE SUCCEEDS 2ABC
+DOUBLE SUPERSET 22D1
+DOUBLE TILDE, COMBINING 0360
+double turned comma quotation mark 201C
+double underline 0333
+double underscore 0333
+double underscore, spacing 2017
+DOUBLE UNION 22D3
+DOUBLE VERTICAL LINE 2016
+DOUBLE VERTICAL LINE ABOVE, COMBINING 030E
+DOUBLE VERTICAL LINE BELOW, COMBINING 0348
+DOUBLE VERTICAL STROKE OVERLAY, COMBINING 20E6
+DOUBLE WAVY OVERLINE FE4C
+double-barred pipe 01C2
+Double-struck Digits 1D7D8
+Double-struck Greek Letters 213C
+Double-struck Greek Letters 213D
+Double-struck Italic Mathematical Symbols 2145
+Double-struck Mathematical Symbols 1D538
+DOWN ARROWHEAD 2304
+DOWN POINTING INDEX, WHITE 261F
+DOWN RIGHT DIAGONAL ELLIPSIS 22F1
+DOWN TACK 22A4
+DOWN TACK BELOW, COMBINING 031E
+down, page 21DF
+downstile, apl 230A
+DOWNWARDS ARROW 2193
+DPRK Compatibility Ideographs FA70
+DRACHMA SIGN 20AF
+Drafting Symbols 232D
+dram 0292
+Draughts and Checkers, Symbols for 26C0
+drop 264F
+Drop-shadowed Dingbats 274D
+Duplicate Characters from Big 5 FA0C
+Duplicate Characters from CNS 11643-1992 2F800
+E WITH ACUTE, LATIN CAPITAL LETTER 00C9
+E WITH ACUTE, LATIN SMALL LETTER 00E9
+E WITH BREVE, LATIN SMALL LETTER 0115
+E WITH CARON, LATIN SMALL LETTER 011B
+E WITH CEDILLA, LATIN SMALL LETTER 0229
+E WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER 1E19
+E WITH CIRCUMFLEX, LATIN CAPITAL LETTER 00CA
+E WITH CIRCUMFLEX, LATIN SMALL LETTER 00EA
+E WITH DIAERESIS, LATIN CAPITAL LETTER 00CB
+E WITH DIAERESIS, LATIN SMALL LETTER 00EB
+E WITH DOT ABOVE, LATIN SMALL LETTER 0117
+E WITH DOT BELOW, LATIN SMALL LETTER 1EB9
+E WITH DOUBLE GRAVE, LATIN SMALL LETTER 0205
+E WITH GRAVE, LATIN CAPITAL LETTER 00C8
+E WITH GRAVE, LATIN SMALL LETTER 00E8
+E WITH HOOK ABOVE, LATIN SMALL LETTER 1EBB
+E WITH HOOK, LATIN SMALL LETTER REVERSED OPEN 025D
+E WITH INVERTED BREVE, LATIN SMALL LETTER 0207
+E WITH MACRON, LATIN SMALL LETTER 0113
+E WITH OGONEK, LATIN SMALL LETTER 0119
+E WITH STROKE, LATIN CAPITAL LETTER 0246
+E WITH STROKE, LATIN SMALL LETTER 0247
+E WITH TILDE BELOW, LATIN SMALL LETTER 1E1B
+E WITH TILDE, LATIN SMALL LETTER 1EBD
+E, COMBINING LATIN SMALL LETTER 0364
+E, DOUBLE-STRUCK ITALIC SMALL 2147
+E, LATIN CAPITAL LETTER OPEN 0190
+E, LATIN CAPITAL LETTER REVERSED 018E
+e, latin capital letter turned 018E
+E, LATIN LETTER SMALL CAPITAL 1D07
+E, LATIN SMALL LETTER CLOSED OPEN 029A
+E, LATIN SMALL LETTER CLOSED REVERSED OPEN 025E
+e, latin small letter o 0153
+E, LATIN SMALL LETTER OPEN 025B
+E, LATIN SMALL LETTER REVERSED 0258
+E, LATIN SMALL LETTER REVERSED OPEN 025C
+E, LATIN SMALL LETTER TURNED 01DD
+E, LATIN SMALL LETTER TURNED OPEN 1D08
+E, SCRIPT CAPITAL 2130
+E, SCRIPT SMALL 212F
+EARTH 2641
+EARTH GROUND 23DA
+EAST SYRIAC CROSS 2671
+Eastern Arabic-Indic Digits 06F0
+Editorial Symbols, New Testament 2E00
+egressive airflow 2191
+EIGHTH NOTE 266A
+EIGHTH NOTES, BEAMED 266B
+Eighths, Fractions 215B
+eject media 23CF
+EK ONKAR, GURMUKHI 0A74
+el salvadorian currency 20A1
+ELECTRIC ARROW 2301
+ELECTRICAL INTERSECTION 23E7
+electrolysis 21AF
+electromotive force 2130
+Electrotechnical Symbols 238D
+ELEMENT OF 2208
+ELEMENT OF, NOT AN 2209
+ELEMENT OF, SMALL 220A
+element, unique 2129
+Ellipses 2B2C
+ELLIPSIS, DOWN RIGHT DIAGONAL 22F1
+ELLIPSIS, HORIZONTAL 2026
+ELLIPSIS, LAO 0EAF
+ELLIPSIS, MIDLINE HORIZONTAL 22EF
+ELLIPSIS, MONGOLIAN 1801
+ELLIPSIS, UP RIGHT DIAGONAL 22F0
+ELLIPSIS, VERTICAL 22EE
+elliptic function, weierstrass 2118
+EM DASH 2014
+EM QUAD 2001
+EM SPACE 2003
+EMBEDDING, LEFT-TO-RIGHT 202A
+EMBEDDING, RIGHT-TO-LEFT 202B
+emf 2130
+EMPHASIS MARK, ARMENIAN 055B
+Emphasis Marks, Sidelining FE45
+EMPHASIS SYMBOL 2383
+EMPTY SET 2205
+Empty Sets 29B0
+EN DASH 2013
+EN QUAD 2000
+EN SPACE 2002
+Enclosed Alphanumerics 2460
+Enclosed CJK Letters and Months 3200
+Enclosed Mathematical Operators 2295
+ENCLOSING CIRCLE BACKSLASH, COMBINING 20E0
+ENCLOSING CIRCLE, COMBINING 20DD
+Enclosing Diacritics 20DD
+ENCLOSING DIAMOND, COMBINING 20DF
+ENCLOSING KEYCAP, COMBINING 20E3
+ENCLOSING SCREEN, COMBINING 20E2
+ENCLOSING SQUARE, COMBINING 20DE
+ENCLOSING UPWARD POINTING TRIANGLE, COMBINING 20E4
+end 21F2
+END OF GUARDED AREA 0097
+end of line 000A
+END OF MEDIUM 0019
+end of medium, symbol for 237F
+END OF MEDIUM, SYMBOL FOR 2419
+END OF PROOF 220E
+END OF SELECTED AREA 0087
+END OF TEXT 0003
+END OF TEXT, SYMBOL FOR 2403
+END OF TRANSMISSION 0004
+END OF TRANSMISSION BLOCK 0017
+END OF TRANSMISSION BLOCK, SYMBOL FOR 2417
+end of transmission symbol 2301
+END OF TRANSMISSION, SYMBOL FOR 2404
+ENG, LATIN SMALL LETTER 014B
+enn, tamil 0BFA
+enotikon, greek 203F
+ENQUIRY 0005
+ENQUIRY, SYMBOL FOR 2405
+enter key 2324
+ENTER SYMBOL 2386
+entity &iinfin;, isotech 29DC
+ENVELOPE 2709
+eol 000A
+epidaurean acrophonic symbol three 205D
+EPSILON SYMBOL, GREEK LUNATE 03F5
+EPSILON SYMBOL, GREEK REVERSED LUNATE 03F6
+epsilon, latin capital letter 0190
+epsilon, latin small letter 025B
+epsilon, latin small letter closed 029A
+epsilon, latin small letter closed reversed 025E
+epsilon, reversed straight 03F6
+epsilon, reversed straight 220D
+epsilon, straight 03F5
+EQUAL TO ABOVE, COMBINING ALMOST 034C
+equal to by definition 225C
+EQUAL TO BY DEFINITION 225D
+EQUAL TO, ALL 224C
+EQUAL TO, ALMOST 2248
+EQUAL TO, APPROXIMATELY 2245
+equal to, approximately 2257
+EQUAL TO, ASYMPTOTICALLY 2243
+EQUAL TO, DELTA 225C
+EQUAL TO, GEOMETRICALLY 2251
+EQUAL TO, GREATER-THAN OR 2265
+EQUAL TO, LESS-THAN OR 2264
+EQUAL TO, NOT 2260
+EQUAL TO, QUESTIONED 225F
+EQUAL TO, RING 2257
+EQUAL TO, RING IN 2256
+Equality and Inequality Signs 2243
+Equality and Inequality Signs 22D5
+EQUALS COLON 2255
+EQUALS SIGN 003D
+EQUALS SIGN BELOW, COMBINING 0347
+EQUALS, CIRCLED 229C
+EQUALS, COLON 2254
+equals, nearly 2252
+EQUALS, REVERSED TILDE 22CD
+EQUALS, STAR 225B
+equiangular 225C
+EQUIANGULAR TO 225A
+EQUIVALENT TO 224D
+EQUIVALENT TO, GEOMETRICALLY 224E
+EQUIVALENT TO, STRICTLY 2263
+equivalent, tautological 29E6
+Era Names, Japanese 337B
+ERASE TO THE LEFT 232B
+ERASE TO THE RIGHT 2326
+error 212F
+Error Bar Symbols 29EE
+ESCAPE 001B
+escape 238B
+ESCAPE, DATA LINK 0010
+ESCAPE, SYMBOL FOR 241B
+ESCAPE, SYMBOL FOR DATA LINK 2410
+escudo 0024
+ESH LOOP, LATIN LETTER REVERSED 01AA
+ESH, LATIN CAPITAL LETTER 01A9
+ESH, LATIN SMALL LETTER 0283
+ESH, LATIN SMALL LETTER SQUAT REVERSED 0285
+ESTIMATED SYMBOL 212E
+ESTIMATES 2259
+eszett 00DF
+ET, TIRONIAN SIGN 204A
+ETH, LATIN CAPITAL LETTER 00D0
+ETH, LATIN LETTER SMALL CAPITAL 1D06
+ETH, LATIN SMALL LETTER 00F0
+ethel 0153
+ETHIOPIC COLON 1365
+ETHIOPIC COMMA 1363
+Ethiopic Digits 1369
+Ethiopic Extended 2D80
+ETHIOPIC FULL STOP 1362
+Ethiopic Numbers 1369
+ETHIOPIC PARAGRAPH SEPARATOR 1368
+ETHIOPIC PREFACE COLON 1366
+Ethiopic Punctuation 1361
+ETHIOPIC QUESTION MARK 1367
+ETHIOPIC SEMICOLON 1364
+Ethiopic Supplement 1380
+Ethiopic Syllables 1200
+ETHIOPIC WORDSPACE 1361
+EULER CONSTANT 2107
+euro european currency 20AC
+EURO SIGN 20AC
+European Latin 0100
+european paragraph sign 00A7
+european section sign 00B6
+EXCESS 2239
+EXCLAMATION MARK 0021
+EXCLAMATION MARK ORNAMENT, HEAVY 2762
+EXCLAMATION MARK, ARMENIAN 055C
+EXCLAMATION MARK, DOUBLE 203C
+EXCLAMATION MARK, INVERTED 00A1
+exclamation mark, latin letter 01C3
+EXCLAMATION MARK, LIMBU 1944
+EXCLAMATION MARK, QUESTION 2048
+EXCLAMATION QUESTION MARK 2049
+EXIST, THERE DOES NOT 2204
+existential quantifier 2203
+EXISTS, THERE 2203
+exponent, natural 212F
+Extensions for Ainu, Katakana 31F0
+EZH REVERSED, LATIN SMALL LETTER 01B9
+EZH WITH CARON, LATIN SMALL LETTER 01EF
+EZH, LATIN CAPITAL LETTER 01B7
+EZH, LATIN LETTER SMALL CAPITAL 1D23
+EZH, LATIN SMALL LETTER 0292
+F WITH DOT ABOVE, LATIN SMALL LETTER 1E1F
+F WITH HOOK, LATIN SMALL LETTER 0192
+f, latin small letter script 0192
+F, SCRIPT CAPITAL 2131
+F, TURNED CAPITAL 2132
+F, TURNED SMALL 214E
+FACE, BLACK SMILING 263B
+FACE, POSTAL MARK 3020
+FACE, WHITE FROWNING 2639
+FACE, WHITE SMILING 263A
+FACSIMILE SIGN 213B
+factorial 0021
+FAHRENHEIT, DEGREE 2109
+fast cursor down 21A1
+fast cursor left 219E
+fast cursor right 21A0
+fast cursor up 219F
+feet 2032
+FEMALE SIGN 2640
+FEMININE ORDINAL INDICATOR 00AA
+FENCE, DOTTED 2999
+Fences 2999
+Fences, Wiggly 29D8
+FERMATA, COMBINING 0352
+ff 000C
+Fifths, Fractions 2155
+FIGURE DASH 2012
+FIGURE SPACE 2007
+file separator 001C
+FILE SEPARATOR, SYMBOL FOR 241C
+FILL SPACE, IDEOGRAPHIC HALF 303F
+FILLER, HANGUL 3164
+Finger Dingbats, Pointing Index 261A
+finite function 21FB
+finite function diacritic 20E6
+finite injection 2915
+finite relation 21FC
+finite surjection 2901
+finite surjective injection 2918
+FIRST QUARTER MOON 263D
+Fish Tails 297C
+FISHEYE 25C9
+fist 261E
+FIVE DOT PUNCTUATION 2059
+FLAG, BLACK 2691
+FLAG, WHITE 2690
+FLAT SIGN, MUSIC 266D
+FLATNESS 23E5
+FLEUR-DE-LIS 269C
+FLOOR, LEFT 230A
+FLOOR, RIGHT 230B
+FLORAL HEART BULLET, REVERSED ROTATED 2619
+florin currency symbol 0192
+folder 0192
+FONGMAN, THAI CHARACTER 0E4F
+FOR ALL 2200
+FORCES 22A9
+Forfeda Supplement, Ogham 1695
+Forks 2AD9
+Form and Chart Components 2500
+FORM FEED 000C
+form feed 21A1
+FORM FEED, SYMBOL FOR 240C
+Format Characters 200C
+Format Characters, Directional 202A
+Format Controls, Mongolian 180B
+FORMATTING, POP DIRECTIONAL 202C
+forward arrow indicator 25BB
+forward difference 2206
+FOUR DOT MARK 205B
+FOUR DOT PUNCTUATION 2058
+FOUR DOTS ABOVE, COMBINING 20DC
+FOUR DOTS, MONGOLIAN 1805
+FOUR DOTS, VERTICAL 205E
+FOUR-PER-EM SPACE 2005
+fourier transform 2131
+fourth derivative 20DC
+FOURTH ROOT 221C
+fourth tone, mandarin chinese 02CB
+Fourths, Fractions 00BC
+FRACTION NUMERATOR ONE 215F
+FRACTION ONE HALF, VULGAR 00BD
+FRACTION ONE QUARTER, VULGAR 00BC
+FRACTION SLASH 2044
+FRACTION THREE QUARTERS, VULGAR 00BE
+Fractions Eighths 215B
+Fractions Fifths 2155
+Fractions Fourths 00BC
+Fractions Quarters 00BC
+Fractions Sixths 2159
+Fractions Thirds 2153
+Fractions, Vulgar 2153
+Fraktur Mathematical Symbols 1D504
+Fraktur Mathematical Symbols, Bold 1D56C
+framus, white 29D6
+FRANC SIGN, FRENCH 20A3
+FRICATIVE, LATIN LETTER PHARYNGEAL VOICED 0295
+FROWN 2322
+FROWNING FACE, WHITE 2639
+FULL BLOCK 2588
+FULL STOP 002E
+FULL STOP, ARABIC 06D4
+FULL STOP, ARMENIAN 0589
+FULL STOP, CANADIAN SYLLABICS 166E
+FULL STOP, ETHIOPIC 1362
+full stop, georgian 0589
+FULL STOP, IDEOGRAPHIC 3002
+FULL STOP, MONGOLIAN 1803
+FULL STOP, MONGOLIAN MANCHU 1809
+Fullwidth ASCII Variants FF01
+Fullwidth Forms, Halfwidth and FF00
+Fullwidth Symbol Variants FFE0
+FUNCTION APPLICATION 2061
+function symbol 0192
+function, bernoulli 212C
+function, composite 2218
+function, finite 21FB
+function, gamma 0393
+function, partial 21F8
+function, total 2192
+function, weierstrass elliptic 2118
+Functional Symbols, APL 2336
+FUNERAL URN 26B1
+FUSE 23DB
+fvs1 180B
+G WITH ACUTE, LATIN SMALL LETTER 01F5
+G WITH BREVE, LATIN SMALL LETTER 011F
+G WITH CARON, LATIN SMALL LETTER 01E7
+G WITH CEDILLA, LATIN SMALL LETTER 0123
+G WITH CIRCUMFLEX, LATIN SMALL LETTER 011D
+G WITH DOT ABOVE, LATIN SMALL LETTER 0121
+G WITH HOOK, LATIN CAPITAL LETTER 0193
+G WITH HOOK, LATIN LETTER SMALL CAPITAL 029B
+G WITH HOOK, LATIN SMALL LETTER 0260
+G WITH MACRON, LATIN SMALL LETTER 1E21
+G WITH STROKE, LATIN SMALL LETTER 01E5
+G, LATIN LETTER SMALL CAPITAL 0262
+G, LATIN SMALL LETTER SCRIPT 0261
+G, SCRIPT SMALL 210A
+G, TURNED SANS-SERIF CAPITAL 2141
+game 2141
+gamma function 0393
+GAMMA, DOUBLE-STRUCK CAPITAL 213E
+GAMMA, DOUBLE-STRUCK SMALL 213D
+GAMMA, LATIN CAPITAL LETTER 0194
+GAMMA, LATIN SMALL LETTER 0263
+gamma, latin small letter baby 0264
+GAMMA, MODIFIER LETTER SMALL 02E0
+GEAR 2699
+GEMINI 264A
+Gender Symbols 26A2
+Genealogical Symbols 26AD
+General Punctuation 2000
+General Scripts Area 0000
+General Scripts Area, Supplementary 10000
+generalized intersection 22C2
+generalized union 22C3
+GEOMETRIC PROPORTION 223A
+Geometric Shapes 25A0
+GEOMETRICALLY EQUAL TO 2251
+GEOMETRICALLY EQUIVALENT TO 224E
+Georgian 10A0
+Georgian Alphabet 10D0
+Georgian Capital Letters 10A0
+georgian comma 00B7
+Georgian Extensions 10F1
+georgian full stop 0589
+Georgian Khutsuri 10A0
+Georgian Mkhedruli 10D0
+GEORGIAN PARAGRAPH SEPARATOR 10FB
+Georgian Small Letters 10D0
+Georgian Supplement 2D00
+german mark pre-wwii 2133
+GERMAN PENNY SIGN 20B0
+GETA MARK 3013
+ghana currency 20B5
+GIMEL SYMBOL 2137
+Glagolitic 2C00
+GLEICH STARK 29E6
+glottal stop 02BC
+GLOTTAL STOP, LATIN CAPITAL LETTER 0241
+GLOTTAL STOP, LATIN LETTER 0294
+GLOTTAL STOP, LATIN LETTER INVERTED 0296
+glottal stop, latin letter reversed 0295
+GLOTTAL STOP, LATIN SMALL LETTER 0242
+GLOTTAL STOP, MODIFIER LETTER 02C0
+GLOTTAL STOP, MODIFIER LETTER REVERSED 02C1
+GLOTTAL STOP, MODIFIER LETTER SMALL REVERSED 02E4
+gnaborretni 2E18
+Go Markers 2686
+Golden Numbers, Runic 16EE
+Gothic 10330
+GRAPHEME JOINER, COMBINING 034F
+Graphic Characters, Terminal 23B7
+Graphic Characters, Terminal 2596
+Graphic Pictures for Control Codes 2400
+Graphics for Control Codes 237D
+Graphics, Quadrant Control Code 25F0
+GRAVE ACCENT 0060
+GRAVE ACCENT BELOW, COMBINING 0316
+GRAVE ACCENT, COMBINING 0300
+GRAVE ACCENT, COMBINING DOUBLE 030F
+GRAVE ACCENT, MODIFIER LETTER 02CB
+GRAVE ACCENT, MODIFIER LETTER LOW 02CE
+grave accent, spacing 0060
+grave accent, swedish 02DF
+GRAVE TONE MARK, COMBINING 0340
+GREATER-THAN OR EQUAL TO 2265
+GREATER-THAN SIGN 003E
+GREATER-THAN, MUCH 226B
+GREATER-THAN, VERY MUCH 22D9
+Greek 0370
+Greek Alphabet 0391
+greek ano teleia 00B7
+Greek Archaic Letters 03D8
+GREEK BETA SYMBOL 03D0
+Greek Capital Letters 0391
+greek currency 20AF
+greek dasia 0314
+greek dialytika 0308
+GREEK DIALYTIKA TONOS, COMBINING 0344
+greek enotikon 203F
+Greek Extended 1F00
+greek iota subscript 0345
+GREEK KORONIS, COMBINING 0343
+Greek Letters, Double-struck 213C
+GREEK LUNATE EPSILON SYMBOL 03F5
+GREEK LUNATE SIGMA SYMBOL 03F2
+Greek Mathematical Symbols 1D6A8
+Greek Mathematical Symbols, Bold 1D6A8
+Greek Mathematical Symbols, Bold Italic 1D71C
+Greek Mathematical Symbols, Italic 1D6E2
+Greek Mathematical Symbols, Sans-serif Bold 1D756
+Greek Mathematical Symbols, Sans-serif Bold Italic 1D790
+greek middle dot 00B7
+Greek Musical Notation, Ancient 1D200
+greek non-spacing iota below 0345
+Greek Numbers, Ancient 10140
+greek old testament 1D516
+greek oxia 0301
+greek pentonkion 2059
+GREEK PERISPOMENI, COMBINING 0342
+GREEK PHI SYMBOL 03D5
+GREEK PI SYMBOL 03D6
+greek psili 0313
+Greek Punctuation and Signs 0374
+greek question mark 003B
+GREEK QUESTION MARK 037E
+GREEK REVERSED LUNATE EPSILON SYMBOL 03F6
+greek rough breathing mark 0314
+GREEK SMALL LETTER IOTA, TURNED 2129
+greek small letter lunate sigma 03F2
+GREEK SMALL LETTER PI 03C0
+Greek Small Letters 03B1
+greek smooth breathing mark 0313
+Greek Textual Symbols, Ancient 2E0E
+GREEK THETA SYMBOL 03D1
+greek tonos 0301
+greek varia 0300
+Greek Variant Letterforms 03D0
+greek vrachy 0306
+GREEK YPOGEGRAMMENI, COMBINING 0345
+Greek, Diacritics for 0342
+Greek, Precomposed Polytonic 1F00
+GROUND, EARTH 23DA
+group lock 21F0
+group separator 001D
+GROUP SEPARATOR, SYMBOL FOR 241D
+GUARANI SIGN 20B2
+GUARDED AREA, END OF 0097
+GUARDED AREA, START OF 0096
+guillemet, left pointing 00AB
+guillemet, left pointing single 2039
+guillemet, right pointing 00BB
+guillemet, right pointing single 203A
+Gujarati 0A80
+Gujarati Consonants 0A95
+Gujarati Dependent Vowel Signs 0ABE
+Gujarati Digits 0AE6
+Gujarati Independent Vowels 0A85
+GUJARATI RUPEE SIGN 0AF1
+Gurmukhi 0A00
+GURMUKHI ADDAK 0A71
+Gurmukhi Consonants 0A15
+Gurmukhi Dependent Vowel Signs 0A3E
+Gurmukhi Digits 0A66
+GURMUKHI EK ONKAR 0A74
+Gurmukhi Independent Vowels 0A05
+gurmukhi khanda 262C
+GURMUKHI TIPPI 0A70
+H WITH BREVE BELOW, LATIN SMALL LETTER 1E2B
+H WITH CARON, LATIN SMALL LETTER 021F
+H WITH CEDILLA, LATIN SMALL LETTER 1E29
+H WITH CIRCUMFLEX, LATIN SMALL LETTER 0125
+H WITH DIAERESIS, LATIN SMALL LETTER 1E27
+H WITH DOT ABOVE, LATIN SMALL LETTER 1E23
+H WITH DOT BELOW, LATIN SMALL LETTER 1E25
+H WITH FISHHOOK, LATIN SMALL LETTER TURNED 02AE
+H WITH HOOK, LATIN SMALL LETTER 0266
+H WITH LINE BELOW, LATIN SMALL LETTER 1E96
+H WITH STROKE, LATIN SMALL LETTER 0127
+H, BLACK-LETTER CAPITAL 210C
+H, COMBINING LATIN SMALL LETTER 036A
+H, DOUBLE-STRUCK CAPITAL 210D
+H, LATIN LETTER SMALL CAPITAL 029C
+H, LATIN SMALL LETTER TURNED 0265
+H, MODIFIER LETTER SMALL 02B0
+H, SCRIPT CAPITAL 210B
+hacek, combining 030C
+hacek, modifier letter 02C7
+HAIR SPACE 200A
+halant 094D
+HALANTA, TIBETAN MARK 0F84
+HALF FILL SPACE, IDEOGRAPHIC 303F
+HALF INTEGRAL, BOTTOM 2321
+HALF INTEGRAL, TOP 2320
+Half Marks, Combining FE20
+HALF RING ABOVE, COMBINING LEFT 0351
+HALF RING ABOVE, COMBINING RIGHT 0357
+HALF RING BELOW, COMBINING LEFT 031C
+HALF RING BELOW, COMBINING RIGHT 0339
+HALF RING, ARMENIAN MODIFIER LETTER LEFT 0559
+half ring, armenian modifier letter right 055A
+HALF RING, MODIFIER LETTER CENTRED LEFT 02D3
+HALF RING, MODIFIER LETTER LEFT 02BF
+HALF TRIANGULAR COLON, MODIFIER LETTER 02D1
+HALF, VULGAR FRACTION ONE 00BD
+Halfwidth and Fullwidth Forms FF00
+Halfwidth CJK Punctuation FF61
+Halfwidth Japanese Katakana Variants FF61
+Halfwidth Korean Hangul Variants FFA0
+Halfwidth Symbol Variants FFE8
+hamilton operator 25BD
+HAMMER AND PICK 2692
+HAMMER AND SICKLE 262D
+hamzah on ha, arabic letter 06C0
+Han Ideographs 4E00
+han-daku-on, combining japanese 309A
+han-daku-on, japanese 309C
+Hand Symbols, Pointing 261A
+HAND, VICTORY 270C
+HAND, WRITING 270D
+Hangul Archaic Letters, Korean 3165
+HANGUL CHOSEONG FILLER 115F
+Hangul Compatibility Jamo, Korean 3130
+Hangul Elements, Circled Korean 3260
+Hangul Elements, Parenthesized Korean 3200
+HANGUL FILLER 3164
+Hangul Jamo Combining Alphabet, Korean 1100
+HANGUL JUNGSEONG FILLER 1160
+Hangul Syllables Area, Korean AC00
+Hangul Syllables, Circled Korean 326E
+Hangul Syllables, Parenthesized Korean 320E
+Hangul Variants, Halfwidth Korean FFA0
+Hangzhou Numerals 3021
+Hanunoo 1720
+Harakat, Arabic 064B
+harbor symbol 2693
+HARPOON ABOVE, COMBINING LEFT 20D0
+HARPOON ABOVE, COMBINING RIGHT 20D1
+HARPOON WITH BARB DOWNWARDS, COMBINING LEFTWARDS 20ED
+HARPOON WITH BARB DOWNWARDS, COMBINING RIGHTWARDS 20EC
+Harpoons 21BC
+Harpoons, Miscellaneous 294A
+hartsakan nshan, armenian 055E
+hasant, bengali 09CD
+HASANTA, SYLOTI NAGRI SIGN A806
+hash 0023
+hat 0302
+hat 2229
+have a nice day! 263A
+Hazard Dingbats 2620
+Head Marks, Tibetan 0F01
+HEADING, START OF 0001
+HEADING, SYMBOL FOR START OF 2401
+HEART BULLET, REVERSED ROTATED FLORAL 2619
+Heart Dingbats 2763
+Heart Ornaments 2763
+HEAVY BALLOT X 2718
+HEAVY CHECK MARK 2714
+HEAVY EXCLAMATION MARK ORNAMENT 2762
+HEAVY MULTIPLICATION X 2716
+HEAVY SPARKLE 2748
+Hebrew 0590
+Hebrew Alphabet 05D0
+Hebrew Cantillation Marks 0591
+Hebrew Letterlike Mathematical Symbols 2135
+Hebrew Points and Punctuation 05B0
+Hebrew Presentation Forms FB1D
+hedera 2767
+HEH WITH YEH ABOVE, ARABIC LETTER 06C0
+HELM SYMBOL 2388
+HERMES, STAFF OF 269A
+HERMITIAN CONJUGATE MATRIX 22B9
+Hexagram Symbols, Yijing / I Ching 4DC0
+High Surrogates D800
+HIGH VOLTAGE SIGN 26A1
+HIGH-REVERSED-9 QUOTATION MARK, DOUBLE 201F
+HIGH-REVERSED-9 QUOTATION MARK, SINGLE 201B
+higher rank than 227B
+hilbert space 210C
+Hiragana 3040
+HIRAGANA ITERATION MARK 309D
+HIRAGANA LETTER SMALL KA 3095
+HIRAGANA LETTER SMALL KE 3096
+Hiragana Supplement 3095
+HIRAGANA VOICED ITERATION MARK 309E
+histogram marker 25AE
+holler 2365
+home 21B8
+home 21F1
+HOMOTHETIC 223B
+HOMOTHETIC ABOVE, COMBINING 034B
+Honorifics, Arabic 0610
+HOOK ABOVE, COMBINING 0309
+HOOK BELOW, COMBINING PALATALIZED 0321
+HOOK BELOW, COMBINING RETROFLEX 0322
+HOOK, MODIFIER LETTER RHOTIC 02DE
+hook, nasal 0328
+hoot 2364
+HORIZONTAL BAR 2015
+HORIZONTAL ELLIPSIS 2026
+HORIZONTAL ELLIPSIS, MIDLINE 22EF
+Horizontal Scan Lines 23BA
+horizontal tabulation 0009
+HORIZONTAL TABULATION, SYMBOL FOR 2409
+HORN, COMBINING 031B
+HOT BEVERAGE 2615
+HOT SPRINGS 2668
+HOURGLASS 231B
+HOURGLASS, BLACK 29D7
+Hours, Ideographic Telegraph Symbols for 3358
+HOUSE 2302
+HRYVNIA SIGN 20B4
+ht 0009
+HV, LATIN SMALL LETTER 0195
+HWAIR, LATIN CAPITAL LETTER 01F6
+HYPHEN 2010
+HYPHEN BULLET 2043
+hyphen or minus sign 002D
+HYPHEN, ARMENIAN 058A
+hyphen, discretionary 00AD
+HYPHEN, KATAKANA-HIRAGANA DOUBLE 30A0
+HYPHEN, MONGOLIAN TODO SOFT 1806
+HYPHEN, NON-BREAKING 2011
+hyphen, papyrological 035C
+HYPHEN, SOFT 00AD
+HYPHEN-MINUS 002D
+HYPHENATION POINT 2027
+hyphus 002D
+HYSTERESIS SYMBOL 238E
+i bar, latin capital letter 0197
+I Ching / Yijing Hexagram Symbols 4DC0
+I Ching / Yijing Monogram and Digram Symbols 268A
+I Ching / Yijing Trigram Symbols 2630
+i dot, latin capital letter 0130
+I WITH ACUTE, LATIN CAPITAL LETTER 00CD
+I WITH ACUTE, LATIN SMALL LETTER 00ED
+I WITH BREVE, LATIN SMALL LETTER 012D
+I WITH CARON, LATIN SMALL LETTER 01D0
+I WITH CIRCUMFLEX, LATIN CAPITAL LETTER 00CE
+I WITH CIRCUMFLEX, LATIN SMALL LETTER 00EE
+I WITH DIAERESIS, LATIN CAPITAL LETTER 00CF
+I WITH DIAERESIS, LATIN SMALL LETTER 00EF
+I WITH DOT ABOVE, LATIN CAPITAL LETTER 0130
+I WITH DOT BELOW, LATIN SMALL LETTER 1ECB
+I WITH DOUBLE GRAVE, LATIN SMALL LETTER 0209
+I WITH GRAVE, LATIN CAPITAL LETTER 00CC
+I WITH GRAVE, LATIN SMALL LETTER 00EC
+I WITH HOOK ABOVE, LATIN SMALL LETTER 1EC9
+I WITH INVERTED BREVE, LATIN SMALL LETTER 020B
+I WITH MACRON, LATIN SMALL LETTER 012B
+I WITH OGONEK, LATIN SMALL LETTER 012F
+I WITH STROKE, LATIN CAPITAL LETTER 0197
+I WITH STROKE, LATIN SMALL LETTER 0268
+I WITH TILDE BELOW, LATIN SMALL LETTER 1E2D
+I WITH TILDE, LATIN SMALL LETTER 0129
+I, BLACK-LETTER CAPITAL 2111
+I, COMBINING LATIN SMALL LETTER 0365
+I, DOUBLE-STRUCK ITALIC SMALL 2148
+I, LATIN LETTER SMALL CAPITAL 026A
+I, LATIN SMALL LETTER DOTLESS 0131
+I, LATIN SMALL LETTER TURNED 1D09
+I, LATIN SUBSCRIPT SMALL LETTER 1D62
+I, SCRIPT CAPITAL 2110
+I, SUPERSCRIPT LATIN SMALL LETTER 2071
+IDENTICAL TO 2261
+IDENTICAL TO, NOT 2262
+Ideograms, Linear B 10080
+Ideographic Annotation, Japanese Kanbun 3190
+IDEOGRAPHIC CLOSING MARK 3006
+IDEOGRAPHIC COMMA 3001
+Ideographic Description Characters, CJK 2FF0
+IDEOGRAPHIC FULL STOP 3002
+IDEOGRAPHIC HALF FILL SPACE 303F
+IDEOGRAPHIC ITERATION MARK 3005
+IDEOGRAPHIC ITERATION MARK, VERTICAL 303B
+IDEOGRAPHIC NUMBER ZERO 3007
+IDEOGRAPHIC SPACE 3000
+Ideographic Telegraph Symbols for Days 33E0
+Ideographic Telegraph Symbols for Hours 3358
+Ideographic Telegraph Symbols for Months 32C0
+Ideographic Tone Marks 302A
+IDEOGRAPHIC VARIATION INDICATOR 303E
+Ideographs Area, CJK 3400
+Ideographs Area, Supplementary CJK 20000
+Ideographs Extension A, CJK Unified 3400
+Ideographs Extension B, CJK Unified 20000
+Ideographs Supplement, CJK Compatibility 2F800
+Ideographs, Circled 3280
+Ideographs, CJK Compatibility F900
+Ideographs, CJK Unified 4E00
+Ideographs, DPRK Compatibility FA70
+Ideographs, Han 4E00
+Ideographs, JIS X 0213 Compatibility FA30
+Ideographs, Parenthesized CJK 3220
+IDLE, SYMBOL FOR SYNCHRONOUS 2416
+IDLE, SYNCHRONOUS 0016
+IJ, LATIN SMALL LIGATURE 0133
+IMAGE OF 22B7
+IMAGE OF, SQUARE 228F
+imaginary part 2111
+implies 22A2
+inches 2033
+included in set 2282
+includes in set 2283
+incorporated, japanese 337F
+INCREMENT 2206
+independence 2AEB
+independent 2ADD
+independent, not 2ADC
+Index Finger Dingbats, Pointing 261A
+INDEX, BLACK LEFT POINTING 261A
+INDEX, BLACK RIGHT POINTING 261B
+INDEX, WHITE DOWN POINTING 261F
+INDEX, WHITE LEFT POINTING 261C
+INDEX, WHITE RIGHT POINTING 261E
+INDEX, WHITE UP POINTING 261D
+indian currency 20A8
+indicator, backward arrow 25C5
+indicator, forward arrow 25BB
+Inequality Signs, Equality and 2243
+Inequality Signs, Equality and 22D5
+INFINITY 221E
+infix bag count 266F
+INFORMATION SEPARATOR FOUR 001C
+INFORMATION SEPARATOR ONE 001F
+INFORMATION SEPARATOR THREE 001D
+INFORMATION SEPARATOR TWO 001E
+INFORMATION SOURCE 2139
+ingressive airflow 2193
+injection, finite 2915
+injection, finite surjective 2918
+injection, partial 2914
+injection, surjective 2917
+injection, total 21A3
+INSERTION POINT, CARET 2041
+INSERTION SYMBOL 2380
+integers 2124
+INTEGRAL 222B
+INTEGRAL OPERATOR, QUATERNION 2A16
+Integral Signs 222B
+INTEGRAL, ANTICLOCKWISE CONTOUR 2233
+INTEGRAL, BOTTOM HALF 2321
+INTEGRAL, CLOCKWISE 2231
+INTEGRAL, CLOCKWISE CONTOUR 2232
+INTEGRAL, CONTOUR 222E
+integral, counterclockwise contour 2233
+INTEGRAL, DOUBLE 222C
+integral, lower 2A1C
+integral, riemann 211B
+INTEGRAL, SURFACE 222F
+INTEGRAL, TOP HALF 2320
+INTEGRAL, TRIPLE 222D
+integral, upper 2A1B
+INTEGRAL, VOLUME 2230
+Integrals, Summations and 2A0A
+INTEGRATION, ANTICLOCKWISE 2A11
+integration, counterclockwise 2A11
+INTERCALATE 22BA
+INTEREST SIGN, PLACE OF 2318
+INTERIOR PRODUCT 2A3C
+INTERIOR PRODUCT, RIGHTHAND 2A3D
+interleave 2AF4
+Interlinear Annotation FFF9
+INTERLINEAR ANNOTATION ANCHOR FFF9
+INTERLINEAR ANNOTATION SEPARATOR FFFA
+INTERLINEAR ANNOTATION TERMINATOR FFFB
+INTERROBANG 203D
+INTERROBANG, INVERTED 2E18
+interrupt 238A
+INTERSECTION 2229
+INTERSECTION, DOUBLE 22D2
+INTERSECTION, ELECTRICAL 23E7
+intersection, generalized 22C2
+INTERSECTION, N-ARY 22C2
+intersection, proper 22D4
+Intersections and Unions 2A40
+INTERSYLLABIC TSHEG, TIBETAN MARK 0F0B
+INTRODUCER, CONTROL SEQUENCE 009B
+INTRODUCER, SINGLE CHARACTER 009A
+Inverse Numbers, Circled 2776
+INVERTED BREVE BELOW, COMBINING 032F
+INVERTED BREVE, COMBINING 0311
+INVERTED BREVE, COMBINING DOUBLE 0361
+INVERTED BRIDGE BELOW, COMBINING 033A
+INVERTED DOUBLE ARCH BELOW, COMBINING 032B
+INVERTED EXCLAMATION MARK 00A1
+INVERTED GLOTTAL STOP, LATIN LETTER 0296
+INVERTED INTERROBANG 2E18
+INVERTED LAZY S 223E
+INVERTED OHM SIGN 2127
+INVERTED QUESTION MARK 00BF
+INVERTED R, LATIN LETTER SMALL CAPITAL 0281
+INVERTED R, MODIFIER LETTER SMALL CAPITAL 02B6
+INVERTED UNDERTIE 2054
+invisible comma 2063
+INVISIBLE PLUS 2064
+INVISIBLE SEPARATOR 2063
+INVISIBLE TIMES 2062
+iota below, greek non-spacing 0345
+iota subscript, greek 0345
+IOTA, LATIN CAPITAL LETTER 0196
+IOTA, LATIN SMALL LETTER 0269
+IOTA, TURNED GREEK SMALL LETTER 2129
+IPA Extensions 0250
+IPA, Diacritics for 0346
+iranian currency FDFC
+irish punt 00A3
+isotech entity &iinfin; 29DC
+israeli currency 20AA
+ISSHAR, BENGALI 09FA
+ISSHAR, ORIYA 0B70
+italian currency 20A4
+italian lira 00A3
+Italic Greek Mathematical Symbols 1D6E2
+Italic Greek Mathematical Symbols, Bold 1D71C
+Italic Greek Mathematical Symbols, Sans-serif Bold 1D790
+Italic Mathematical Symbols 1D434
+Italic Mathematical Symbols, Bold 1D468
+Italic Mathematical Symbols, Sans-serif 1D608
+Italic Mathematical Symbols, Sans-serif Bold 1D63C
+Italic, Old 10300
+ITC Zapf Dingbats Series 100 2700
+ITERATION MARK, HIRAGANA 309D
+ITERATION MARK, HIRAGANA VOICED 309E
+ITERATION MARK, IDEOGRAPHIC 3005
+ITERATION MARK, KATAKANA 30FD
+ITERATION MARK, KATAKANA VOICED 30FE
+ITERATION MARK, VERTICAL IDEOGRAPHIC 303B
+ivy leaf 2767
+izafet 06C0
+J WITH CARON, LATIN SMALL LETTER 01F0
+J WITH CIRCUMFLEX, LATIN SMALL LETTER 0135
+J WITH CROSSED-TAIL, LATIN SMALL LETTER 029D
+J WITH STROKE, LATIN CAPITAL LETTER 0248
+J WITH STROKE, LATIN SMALL LETTER 0249
+J WITH STROKE, LATIN SMALL LETTER DOTLESS 025F
+J, DOUBLE-STRUCK ITALIC SMALL 2149
+J, LATIN LETTER SMALL CAPITAL 1D0A
+J, LATIN SMALL LETTER DOTLESS 0237
+J, MODIFIER LETTER SMALL 02B2
+jack 2749
+Jamo Combining Alphabet, Korean Hangul 1100
+Jamo, Korean Hangul Compatibility 3130
+japanese bullet, tainome 25C9
+Japanese Chess Symbols 2616
+Japanese Era Names 337B
+Japanese Hiragana 3040
+japanese incorporated 337F
+JAPANESE INDUSTRIAL STANDARD SYMBOL 3004
+Japanese Kanbun Ideographic Annotation 3190
+Japanese Katakana 30A0
+Japanese Katakana Variants, Halfwidth FF61
+Japanese Katakana Words, Squared 3300
+Japanese Katakana, Circled 32D0
+japanese kome 203B
+JERUSALEM, CROSS OF 2629
+jis composition circle 20DD
+JIS X 0213 Compatibility Ideographs FA30
+JOIN 2A1D
+JOINER, COMBINING GRAPHEME 034F
+JOINER, WORD 2060
+JOINER, ZERO WIDTH 200D
+jolly roger 2620
+jot, apl 2218
+JUPITER 2643
+jurisprudence symbol 2696
+K WITH ACUTE, LATIN SMALL LETTER 1E31
+K WITH CARON, LATIN SMALL LETTER 01E9
+K WITH CEDILLA, LATIN SMALL LETTER 0137
+K WITH DOT BELOW, LATIN SMALL LETTER 1E33
+K WITH HOOK, LATIN SMALL LETTER 0199
+K WITH LINE BELOW, LATIN SMALL LETTER 1E35
+K, LATIN LETTER SMALL CAPITAL 1D0B
+K, LATIN SMALL LETTER TURNED 029E
+KA, HIRAGANA LETTER SMALL 3095
+kabusiki-gaisya 337F
+Kana Repeat Marks 3031
+Kanbun Ideographic Annotation, Japanese 3190
+Kangxi Radicals, CJK 2F00
+Kannada 0C80
+Kannada Consonants 0C95
+Kannada Dependent Vowel Signs 0CBE
+Kannada Digits 0CE6
+Kannada Independent Vowels 0C85
+kashida, arabic 0640
+Katakana 30A0
+KATAKANA DIGRAPH KOTO 30FF
+Katakana Extensions for Ainu 31F0
+KATAKANA ITERATION MARK 30FD
+KATAKANA MIDDLE DOT 30FB
+Katakana Phonetic Extensions 31F0
+Katakana Variants, Halfwidth Japanese FF61
+KATAKANA VOICED ITERATION MARK 30FE
+Katakana Words, Squared 3300
+Katakana, Circled 32D0
+KATAKANA-HIRAGANA DOUBLE HYPHEN 30A0
+KATAKANA-HIRAGANA PROLONGED SOUND MARK 30FC
+Kayah Li A900
+KELVIN SIGN 212A
+ket 27E9
+key, clear 2327
+key, command 2318
+key, delete to the left 232B
+key, delete to the right 2326
+key, enter 2324
+KEY, OPTION 2325
+KEYBOARD 2328
+keyboard symbol for no break space 237D
+Keyboard Symbols 21E6
+Keyboard Symbols 2324
+Keyboard Symbols 2380
+Keyboard Symbols 2396
+KEYCAP, COMBINING ENCLOSING 20E3
+khanda, gurmukhi 262C
+Kharoshthi 10A00
+Kharoshthi Digits 10A40
+Khmer 1780
+khmer anusvara 17C6
+Khmer Consonants 1780
+KHMER CURRENCY SYMBOL RIEL 17DB
+Khmer Dependent Vowel Signs 17B6
+Khmer Digits 17E0
+Khmer Independent Vowels 17A5
+Khmer Numeric Symbols for Divination 17F0
+KHMER SIGN NIKAHIT 17C6
+KHMER SIGN REAHMUK 17C7
+Khmer Signs 17C6
+khmer srak ah 17C7
+khmer srak am 17C6
+Khmer Symbols 19E0
+khmer visarga 17C7
+KHOMUT, THAI CHARACTER 0E5B
+Khutsuri, Georgian 10A0
+killer, myanmar 1039
+KIP SIGN 20AD
+kissen 2311
+kome, japanese 203B
+Komi Letters 0500
+Koranic Annotation Signs, Arabic 06D6
+Korean Combining Alphabet 1100
+korean currency 20A9
+Korean Hangul Archaic Letters 3165
+Korean Hangul Compatibility Jamo 3130
+Korean Hangul Elements, Circled 3260
+Korean Hangul Elements, Parenthesized 3200
+Korean Hangul Jamo Combining Alphabet 1100
+Korean Hangul Syllables AC00
+Korean Hangul Syllables, Circled 326E
+Korean Hangul Syllables, Parenthesized 320E
+Korean Hangul Variants, Halfwidth FFA0
+KOREAN STANDARD SYMBOL 327F
+KORONIS, COMBINING GREEK 0343
+KOTO, KATAKANA DIGRAPH 30FF
+KRA, LATIN SMALL LETTER 0138
+L B BAR SYMBOL 2114
+L WITH ACUTE, LATIN SMALL LETTER 013A
+L WITH BAR, LATIN CAPITAL LETTER 023D
+L WITH BAR, LATIN SMALL LETTER 019A
+L WITH BELT, LATIN SMALL LETTER 026C
+L WITH CARON, LATIN SMALL LETTER 013E
+L WITH CEDILLA, LATIN SMALL LETTER 013C
+L WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER 1E3D
+L WITH CURL, LATIN SMALL LETTER 0234
+L WITH DOT BELOW, LATIN SMALL LETTER 1E37
+L WITH LINE BELOW, LATIN SMALL LETTER 1E3B
+L WITH MIDDLE DOT, LATIN SMALL LETTER 0140
+L WITH MIDDLE TILDE, LATIN SMALL LETTER 026B
+L WITH RETROFLEX HOOK, LATIN SMALL LETTER 026D
+L WITH STROKE, LATIN LETTER SMALL CAPITAL 1D0C
+L WITH STROKE, LATIN SMALL LETTER 0142
+L, LATIN LETTER SMALL CAPITAL 029F
+L, MODIFIER LETTER SMALL 02E1
+L, REVERSED SANS-SERIF CAPITAL 2143
+L, SCRIPT CAPITAL 2112
+L, SCRIPT SMALL 2113
+L, TURNED SANS-SERIF CAPITAL 2142
+lambda bar, latin letter 019B
+LANGUAGE TAG E0001
+Lao 0E80
+LAO CANCELLATION MARK 0ECC
+Lao Consonants 0E81
+Lao Digits 0ED0
+LAO ELLIPSIS 0EAF
+Lao Marks and Signs 0EC8
+LAO NIGGAHITA 0ECD
+Lao Vowels 0EB0
+laotian currency 20AD
+laplace operator 2206
+laplace transform 2112
+large bowtie 2A1D
+LARGE CIRCLE 25EF
+Large Operators 29F8
+LAST QUARTER MOON 263E
+LATERAL CLICK, LATIN LETTER 01C1
+Latin Abbreviations, Squared 3371
+Latin Abbreviations, Squared 3380
+LATIN CROSS 271D
+Latin Extended Additional 1E00
+Latin Extended-A 0100
+Latin Extended-B 0180
+Latin Extended-C 2C60
+Latin Extended-D A720
+Latin Extensions 1D00
+LATIN LETTER AIN 1D25
+LATIN LETTER ALVEOLAR CLICK 01C2
+LATIN LETTER BIDENTAL PERCUSSIVE 02AD
+LATIN LETTER BILABIAL CLICK 0298
+LATIN LETTER BILABIAL PERCUSSIVE 02AC
+latin letter bullseye 0298
+LATIN LETTER DENTAL CLICK 01C0
+latin letter exclamation mark 01C3
+LATIN LETTER GLOTTAL STOP 0294
+LATIN LETTER INVERTED GLOTTAL STOP 0296
+latin letter lambda bar 019B
+LATIN LETTER LATERAL CLICK 01C1
+LATIN LETTER PHARYNGEAL VOICED FRICATIVE 0295
+LATIN LETTER RETROFLEX CLICK 01C3
+LATIN LETTER REVERSED ESH LOOP 01AA
+latin letter reversed glottal stop 0295
+LATIN LETTER STRETCHED C 0297
+LATIN LETTER VOICED LARYNGEAL SPIRANT 1D24
+LATIN LETTER WYNN 01BF
+LATIN LETTER YR 01A6
+Latin Letters, Circled 24B6
+Latin Letters, Parenthesized 249C
+Latin Letters, Phonetic Modifiers Derived from 02B0
+Latin Ligatures FB00
+Latin Lowercase Alphabet 0061
+LATIN SMALL LETTER AE 00E6
+LATIN SMALL LETTER ALPHA 0251
+latin small letter baby gamma 0264
+latin small letter closed epsilon 029A
+LATIN SMALL LETTER CLOSED OMEGA 0277
+latin small letter closed reversed epsilon 025E
+LATIN SMALL LETTER DB DIGRAPH 0238
+LATIN SMALL LETTER ENG 014B
+latin small letter epsilon 025B
+LATIN SMALL LETTER ESH 0283
+LATIN SMALL LETTER ETH 00F0
+LATIN SMALL LETTER EZH 0292
+LATIN SMALL LETTER EZH REVERSED 01B9
+LATIN SMALL LETTER EZH WITH CARON 01EF
+LATIN SMALL LETTER GAMMA 0263
+LATIN SMALL LETTER GLOTTAL STOP 0242
+LATIN SMALL LETTER HV 0195
+LATIN SMALL LETTER IOTA 0269
+LATIN SMALL LETTER KRA 0138
+LATIN SMALL LETTER LEZH 026E
+LATIN SMALL LETTER OI 01A3
+LATIN SMALL LETTER OU 0223
+LATIN SMALL LETTER PHI 0278
+LATIN SMALL LETTER QP DIGRAPH 0239
+LATIN SMALL LETTER RAMS HORN 0264
+LATIN SMALL LETTER SCHWA 0259
+LATIN SMALL LETTER SQUAT REVERSED ESH 0285
+LATIN SMALL LETTER THORN 00FE
+LATIN SMALL LETTER TONE SIX 0185
+LATIN SMALL LETTER TURNED AE 1D02
+LATIN SMALL LETTER TURNED ALPHA 0252
+LATIN SMALL LETTER TURNED DELTA 018D
+LATIN SMALL LETTER TURNED OE 1D14
+LATIN SMALL LETTER UPSILON 028A
+LATIN SMALL LETTER YOGH 021D
+Latin Small Letters 0061
+Latin Small Letters, Combining 0363
+latin small ligature ae 00E6
+LATIN SMALL LIGATURE IJ 0133
+LATIN SMALL LIGATURE OE 0153
+Latin Superscript Modifier Letters 02B0
+Latin Uppercase Alphabet 0041
+Latin, Basic 0000
+Latin, European 0100
+Latin-1 Punctuation and Symbols 00A0
+Latin-1 Supplement 00A0
+lazy s 223D
+LAZY S, INVERTED 223E
+LEADER, ONE DOT 2024
+leader, three dot 2026
+LEADER, TWO DOT 2025
+leaf, aldus 2766
+leaf, ivy 2767
+left abstract syntax bracket 301A
+LEFT ANGLE ABOVE, COMBINING 031A
+LEFT ANGLE BELOW, COMBINING 0349
+LEFT ANGLE BRACKET 3008
+LEFT ANGLE BRACKET, MATHEMATICAL 27E8
+LEFT ARROW ABOVE, COMBINING 20D6
+LEFT ARROW BELOW, COMBINING 20EE
+LEFT ARROWHEAD BELOW, COMBINING 0354
+left bag bracket 27E6
+LEFT BLACK LENTICULAR BRACKET 3010
+LEFT CEILING 2308
+left chevron bracket 27EA
+LEFT CORNER BRACKET 300C
+LEFT CURLY BRACKET 007B
+LEFT DOUBLE ANGLE BRACKET 300A
+LEFT DOUBLE ANGLE BRACKET, MATHEMATICAL 27EA
+LEFT DOUBLE QUOTATION MARK 201C
+LEFT FLOOR 230A
+LEFT HALF RING ABOVE, COMBINING 0351
+LEFT HALF RING BELOW, COMBINING 031C
+LEFT HALF RING, ARMENIAN MODIFIER LETTER 0559
+LEFT HALF RING, MODIFIER LETTER 02BF
+LEFT HALF RING, MODIFIER LETTER CENTRED 02D3
+LEFT HARPOON ABOVE, COMBINING 20D0
+LEFT HOOK, LATIN CAPITAL LETTER N WITH 019D
+LEFT HOOK, LATIN SMALL LETTER N WITH 0272
+left key, delete to the 232B
+left moustache 23B0
+LEFT NORMAL FACTOR SEMIDIRECT PRODUCT 22C9
+LEFT PARENTHESIS 0028
+LEFT PARENTHESIS, ORNATE FD3E
+left pointing guillemet 00AB
+LEFT POINTING INDEX, BLACK 261A
+LEFT POINTING INDEX, WHITE 261C
+left pointing single guillemet 2039
+LEFT RIGHT ARROW ABOVE, COMBINING 20E1
+LEFT RIGHT ARROW BELOW, COMBINING 034D
+LEFT SEMIDIRECT PRODUCT 22CB
+left sequence bracket 27E8
+LEFT SINGLE QUOTATION MARK 2018
+LEFT SQUARE BRACKET 005B
+LEFT SQUARE BRACKET WITH QUILL 2045
+LEFT TACK 22A3
+LEFT TACK BELOW, COMBINING 0318
+LEFT TORTOISE SHELL BRACKET 3014
+LEFT WHITE CORNER BRACKET 300E
+LEFT WHITE CURLY BRACKET 2983
+LEFT WHITE LENTICULAR BRACKET 3016
+LEFT WHITE PARENTHESIS 2985
+LEFT WHITE SQUARE BRACKET 301A
+LEFT WHITE TORTOISE SHELL BRACKET 3018
+LEFT, ERASE TO THE 232B
+left, fast cursor 219E
+LEFT-POINTING ANGLE BRACKET 2329
+LEFT-POINTING ANGLE QUOTATION MARK, SINGLE 2039
+LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 00AB
+LEFT-TO-RIGHT EMBEDDING 202A
+LEFT-TO-RIGHT MARK 200E
+LEFT-TO-RIGHT OVERRIDE 202D
+leftward tab 21E4
+LEFTWARDS ARROW 2190
+LEFTWARDS ARROW OVERLAY, COMBINING 20EA
+LEFTWARDS BULLET, BLACK 204C
+LEFTWARDS HARPOON WITH BARB DOWNWARDS, COMBINING 20ED
+LENTICULAR BRACKET, LEFT BLACK 3010
+LENTICULAR BRACKET, LEFT WHITE 3016
+LENTICULAR BRACKET, RIGHT BLACK 3011
+LENTICULAR BRACKET, RIGHT WHITE 3017
+LEO 264C
+Lepcha 1C00
+LESS-THAN OR EQUAL TO 2264
+LESS-THAN SIGN 003C
+LESS-THAN, MUCH 226A
+LESS-THAN, VERY MUCH 22D8
+Letterlike Mathematical Symbols, Hebrew 2135
+Letterlike Symbols 2100
+level 2 lock 21EB
+level 3 lock 21EF
+level 3 select 21EE
+LEZH, LATIN SMALL LETTER 026E
+lf 000A
+lgroup 27EE
+LIBRA 264E
+ligature ae, latin capital 00C6
+ligature ae, latin small 00E6
+LIGATURE IJ, LATIN SMALL 0133
+LIGATURE OE, LATIN SMALL 0153
+ligature tie 0361
+ligature tie below 035C
+Ligatures, Arabic FBEA
+Ligatures, Armenian FB13
+Ligatures, Latin FB00
+LIGHTNING 2607
+Limbu 1900
+Limbu Digits 1946
+LIMBU EXCLAMATION MARK 1944
+LIMBU QUESTION MARK 1945
+Limbu Signs 1939
+LIMIT, APPROACHES THE 2250
+LINE ABOVE, COMBINING DOUBLE VERTICAL 030E
+LINE ABOVE, COMBINING VERTICAL 030D
+LINE BACKWARD, PARTIAL 008C
+LINE BELOW, COMBINING DOUBLE VERTICAL 0348
+LINE BELOW, COMBINING VERTICAL 0329
+LINE FEED 000A
+line feed 21B4
+LINE FEED, REVERSE 008D
+LINE FEED, SYMBOL FOR 240A
+LINE FORWARD, PARTIAL 008B
+line marker 2319
+Line Operators, Vertical 2AEE
+LINE OVERLAY, COMBINING LONG VERTICAL 20D2
+LINE OVERLAY, COMBINING SHORT VERTICAL 20D3
+LINE SEPARATOR 2028
+LINE SYMBOL, CENTRE 2104
+LINE TABULATION 000B
+LINE TABULATION SET 008A
+LINE WITH MIDDLE DOT, VERTICAL 237F
+line, beginning of 2310
+LINE, CENTRELINE LOW FE4E
+LINE, COMBINING DOUBLE LOW 0333
+LINE, COMBINING LOW 0332
+LINE, DASHED LOW FE4D
+LINE, DOUBLE LOW 2017
+LINE, DOUBLE VERTICAL 2016
+line, end of 000A
+LINE, LOW 005F
+LINE, MODIFIER LETTER LOW VERTICAL 02CC
+LINE, MODIFIER LETTER VERTICAL 02C8
+line, new 000A
+LINE, NEXT 0085
+LINE, PROPERTY 214A
+LINE, VERTICAL 007C
+LINE, WAVY 2307
+LINE, WAVY LOW FE4F
+Linear B Ideograms 10080
+Linear B Syllabary 10000
+Lines, Horizontal Scan 23BA
+Lines, Vertical 2223
+LIRA SIGN 20A4
+lira, italian 00A3
+lira, turkish 00A3
+liter 2113
+lock, caps 21EA
+lock, caps 21EC
+lock, numerics 21ED
+Logic Operators, Modal 27D8
+Logic Operators, Modal 27E0
+LOGICAL AND 2227
+LOGICAL AND, CURLY 22CF
+LOGICAL AND, N-ARY 22C0
+Logical Ands and Ors 2A51
+LOGICAL OR 2228
+LOGICAL OR, CURLY 22CE
+LOGICAL OR, N-ARY 22C1
+long 0304
+Long Arrows 27F5
+LONG DIVISION 27CC
+long double slash overlay 20EB
+LONG S, LATIN SMALL LETTER 017F
+long slash overlay 0338
+LONG SOLIDUS OVERLAY, COMBINING 0338
+LONG STROKE OVERLAY, COMBINING 0336
+LONG VERTICAL LINE OVERLAY, COMBINING 20D2
+LORRAINE, CROSS OF 2628
+LOW ACUTE ACCENT, MODIFIER LETTER 02CF
+LOW ASTERISK 204E
+low double comma quotation mark 201E
+LOW DOUBLE PRIME QUOTATION MARK 301F
+LOW GRAVE ACCENT, MODIFIER LETTER 02CE
+LOW LINE 005F
+LOW LINE, CENTRELINE FE4E
+LOW LINE, COMBINING 0332
+LOW LINE, COMBINING DOUBLE 0333
+LOW LINE, DASHED FE4D
+LOW LINE, DOUBLE 2017
+LOW LINE, WAVY FE4F
+LOW MACRON, MODIFIER LETTER 02CD
+low single comma quotation mark 201A
+Low Surrogates DC00
+LOW VERTICAL LINE, MODIFIER LETTER 02CC
+LOW-9 QUOTATION MARK, DOUBLE 201E
+LOW-9 QUOTATION MARK, SINGLE 201A
+lower integral 2A1C
+lower rank than 227A
+Lowercase Alphabet, Latin 0061
+LOZENGE 25CA
+LOZENGE, BLACK 29EB
+LOZENGE, SQUARE 2311
+lre 202A
+lrm 200E
+lro 202D
+LUNATE EPSILON SYMBOL, GREEK 03F5
+LUNATE EPSILON SYMBOL, GREEK REVERSED 03F6
+LUNATE SIGMA SYMBOL, GREEK 03F2
+Lycian 10280
+Lydian 10920
+M WITH ACUTE, LATIN SMALL LETTER 1E3F
+M WITH DOT ABOVE, LATIN SMALL LETTER 1E41
+M WITH DOT BELOW, LATIN SMALL LETTER 1E43
+M WITH HOOK, LATIN SMALL LETTER 0271
+M WITH LONG LEG, LATIN SMALL LETTER TURNED 0270
+M, COMBINING LATIN SMALL LETTER 036B
+M, LATIN CAPITAL LETTER TURNED 019C
+M, LATIN LETTER SMALL CAPITAL 1D0D
+M, LATIN SMALL LETTER SIDEWAYS TURNED 1D1F
+M, LATIN SMALL LETTER TURNED 026F
+M, SCRIPT CAPITAL 2133
+m-matrix 2133
+maatham, tamil 0BF4
+MACRON 00AF
+MACRON BELOW, COMBINING 0331
+MACRON BELOW, COMBINING DOUBLE 035F
+MACRON LEFT HALF, COMBINING FE24
+MACRON RIGHT HALF, COMBINING FE25
+MACRON, COMBINING 0304
+MACRON, COMBINING DOUBLE 035E
+MACRON, MODIFIER LETTER 02C9
+MACRON, MODIFIER LETTER LOW 02CD
+macron, spacing 00AF
+Mahjong Tiles 1F000
+Malayalam 0D00
+malayalam chandrakkala 0D4D
+Malayalam Chillu Letters 0D7A
+Malayalam Consonants 0D15
+Malayalam Dependent Vowel Signs 0D3E
+Malayalam Digits 0D66
+Malayalam Independent Vowels 0D05
+MALAYALAM SIGN VIRAMA 0D4D
+malayalam vowel half-u 0D4D
+MALE SIGN 2642
+MALTESE CROSS 2720
+MANCHU COMMA, MONGOLIAN 1808
+MANCHU FULL STOP, MONGOLIAN 1809
+mandarin chinese fifth or neutral tone 02D9
+mandarin chinese first tone 02C9
+mandarin chinese fourth tone 02CB
+mandarin chinese second tone 02CA
+mandarin chinese third tone 02C7
+Map Symbols, Dictionary and 2690
+maplet 21A6
+maps from 27FB
+maps from 2906
+maps to 27FC
+maps to 2905
+maps to 2907
+mark pre-wwii, german 2133
+marker, histogram 25AE
+marker, line 2319
+Markers, Go 2686
+Marks, Combining Diacritical 0300
+Marks, Combining Half FE20
+MARRIAGE SYMBOL 26AD
+mars 2642
+MASCULINE ORDINAL INDICATOR 00BA
+MASU MARK 303C
+Mathematical Alphanumeric Symbols 1D400
+Mathematical Brackets 27E6
+mathematical constant 3.141592... pi 03C0
+Mathematical Digits Symbols 1D7CE
+Mathematical Operators 2200
+Mathematical Operators, Dotted 2234
+Mathematical Operators, Enclosed 2295
+Mathematical Operators, Supplemental 2A00
+Mathematical Operators, Tilde 223B
+MATHEMATICAL SPACE, MEDIUM 205F
+Mathematical Symbols 27C0
+Mathematical Symbols 2980
+Mathematical Symbols, Black-letter 1D504
+Mathematical Symbols, Bold Fraktur 1D56C
+Mathematical Symbols, Bold Greek 1D6A8
+Mathematical Symbols, Bold Italic 1D468
+Mathematical Symbols, Bold Italic Greek 1D71C
+Mathematical Symbols, Bold Script 1D4D0
+Mathematical Symbols, Dotless 1D6A4
+Mathematical Symbols, Double-struck 1D538
+Mathematical Symbols, Fraktur 1D504
+Mathematical Symbols, Greek 1D6A8
+Mathematical Symbols, Hebrew Letterlike 2135
+Mathematical Symbols, Italic 1D434
+Mathematical Symbols, Italic Greek 1D6E2
+Mathematical Symbols, Monospace 1D670
+Mathematical Symbols, Sans-serif 1D5A0
+Mathematical Symbols, Sans-serif Bold 1D5D4
+Mathematical Symbols, Sans-serif Bold Greek 1D756
+Mathematical Symbols, Sans-serif Bold Italic 1D63C
+Mathematical Symbols, Sans-serif Bold Italic Greek 1D790
+Mathematical Symbols, Sans-serif Italic 1D608
+Mathematical Symbols, Script 1D49C
+Mathematical Symbols-A, Miscellaneous 27C0
+Mathematical Symbols-B, Miscellaneous 2980
+MATRIX, HERMITIAN CONJUGATE 22B9
+MEASURED ANGLE 2221
+Measured Angles, Angles and 299B
+MEASURED BY 225E
+med avdrag av 2052
+Medieval Superscript Letter Diacritics 0363
+Medieval Superscript Letter Diacritics, Latin 1DD3
+Medievalist Punctuation 2E2A
+MEDIUM BLACK CIRCLE 26AB
+MEDIUM MATHEMATICAL SPACE 205F
+MEDIUM SMALL SQUARE, BLACK 25FE
+MEDIUM SMALL WHITE CIRCLE 26AC
+MEDIUM SQUARE, BLACK 25FC
+MEDIUM WHITE CIRCLE 26AA
+MEDIUM, END OF 0019
+MEDIUM, SYMBOL FOR END OF 2419
+MEMBER, CONTAINS AS 220B
+MEMBER, DOES NOT CONTAIN AS 220C
+MEMBER, SMALL CONTAINS AS 220D
+Membership Signs, Set 2208
+MEMBERSHIP, Z NOTATION BAG 22FF
+MERCURY 263F
+merge 2A07
+merpadi, tamil 0BF8
+MESSAGE WAITING 0095
+MESSAGE, PRIVACY 009E
+Metrical Symbols 23D1
+mho 2127
+MICRO SIGN 00B5
+mid space 2005
+MIDDLE DOT 00B7
+middle dot, greek 00B7
+MIDDLE DOT, KATAKANA 30FB
+MIDDLE DOT, LATIN SMALL LETTER L WITH 0140
+MIDDLE DOT, VERTICAL LINE WITH 237F
+MIDDLE TILDE, LATIN CAPITAL LETTER O WITH 019F
+MIDDLE TILDE, LATIN SMALL LETTER L WITH 026B
+MIDLINE HORIZONTAL ELLIPSIS 22EF
+midpoint 00B7
+MILL SIGN 20A5
+MILLE SIGN, PER 2030
+milreis 0024
+minim 264F
+minim alternate glyph 264D
+mining symbol 2692
+MINUS SIGN 2212
+MINUS SIGN BELOW, COMBINING 0320
+Minus Sign Operators, Plus and 2A22
+MINUS SIGN, COMMERCIAL 2052
+minus sign, hyphen or 002D
+MINUS SIGN, MODIFIER LETTER 02D7
+MINUS TILDE 2242
+MINUS, CIRCLED 2296
+MINUS, DOT 2238
+MINUS, SET 2216
+MINUS, SQUARED 229F
+MINUS-OR-PLUS SIGN 2213
+minutes 2032
+MINY 29FF
+Mkhedruli, Georgian 10D0
+mmsp 205F
+Modal Logic Operators 27E0
+MODELS 22A7
+Modifier Letter Extensions 1D2C
+Modifier Letters, Latin Superscript 02B0
+Modifier Letters, Spacing 02B0
+Modifier Tone Letters A700
+Modifiers Derived from Latin Letters, Phonetic 02B0
+Modifiers, Phonetic 02B9
+Modifiers, UPA 02EF
+Mongolian 1800
+Mongolian Basic Letters 1820
+MONGOLIAN BIRGA 1800
+MONGOLIAN COLON 1804
+MONGOLIAN COMMA 1802
+mongolian currency 20AE
+Mongolian Digits 1810
+MONGOLIAN ELLIPSIS 1801
+Mongolian Extensions 1843
+Mongolian Format Controls 180B
+MONGOLIAN FOUR DOTS 1805
+MONGOLIAN FREE VARIATION SELECTOR ONE 180B
+MONGOLIAN FREE VARIATION SELECTOR THREE 180D
+MONGOLIAN FREE VARIATION SELECTOR TWO 180C
+MONGOLIAN FULL STOP 1803
+MONGOLIAN MANCHU COMMA 1808
+MONGOLIAN MANCHU FULL STOP 1809
+MONGOLIAN NIRUGU 180A
+Mongolian Punctuation 1800
+MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER 1807
+MONGOLIAN TODO SOFT HYPHEN 1806
+MONGOLIAN VOWEL SEPARATOR 180E
+Monogram and Digram Symbols, Yijing / I Ching 268A
+Monospace Digits 1D7F6
+Monospace Mathematical Symbols 1D670
+MONOSTABLE SYMBOL 238D
+MONTH SIGN, TAMIL 0BF4
+Months, Enclosed CJK Letters and 3200
+Months, Ideographic Telegraph Symbols for 32C0
+MOON, FIRST QUARTER 263D
+MOON, LAST QUARTER 263E
+most positive 223E
+moustache, left 23B0
+moustache, right 23B1
+MUCH GREATER-THAN 226B
+MUCH GREATER-THAN, VERY 22D9
+MUCH LESS-THAN 226A
+MUCH LESS-THAN, VERY 22D8
+MULTIMAP 22B8
+Multiplication and Division Sign Operators 2A2F
+MULTIPLICATION SIGN 00D7
+MULTIPLICATION X 2715
+MULTIPLICATION X, HEAVY 2716
+MULTIPLICATION, MULTISET 228D
+MULTISET 228C
+MULTISET MULTIPLICATION 228D
+MULTISET UNION 228E
+Music Dingbats 2669
+MUSIC FLAT SIGN 266D
+MUSIC NATURAL SIGN 266E
+MUSIC SHARP SIGN 266F
+Musical Notation, Ancient Greek 1D200
+Musical Symbols 1D100
+Musical Symbols, Balinese 1B61
+Musical Symbols, Basic 2669
+Musical Symbols, Byzantine 1D000
+mutton 2003
+mutton quad 2001
+Myanmar 1000
+Myanmar Consonants 1000
+Myanmar Dependent Vowel Signs 102C
+Myanmar Digits 1040
+Myanmar Independent Vowels 1021
+myanmar killer 1039
+MYANMAR SIGN VIRAMA 1039
+Myanmar Signs 1036
+N WITH ACUTE, LATIN SMALL LETTER 0144
+N WITH CARON, LATIN SMALL LETTER 0148
+N WITH CEDILLA, LATIN SMALL LETTER 0146
+N WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER 1E4B
+N WITH CURL, LATIN SMALL LETTER 0235
+N WITH DOT ABOVE, LATIN SMALL LETTER 1E45
+N WITH DOT BELOW, LATIN SMALL LETTER 1E47
+N WITH GRAVE, LATIN SMALL LETTER 01F9
+N WITH LEFT HOOK, LATIN CAPITAL LETTER 019D
+N WITH LEFT HOOK, LATIN SMALL LETTER 0272
+N WITH LINE BELOW, LATIN SMALL LETTER 1E49
+N WITH LONG RIGHT LEG, LATIN CAPITAL LETTER 0220
+N WITH LONG RIGHT LEG, LATIN SMALL LETTER 019E
+N WITH RETROFLEX HOOK, LATIN SMALL LETTER 0273
+N WITH TILDE, LATIN CAPITAL LETTER 00D1
+N WITH TILDE, LATIN SMALL LETTER 00F1
+N, DOUBLE-STRUCK CAPITAL 2115
+N, LATIN LETTER SMALL CAPITAL 0274
+N, LATIN LETTER SMALL CAPITAL REVERSED 1D0E
+N-ARY COPRODUCT 2210
+n-ary dijkstra choice 2AFF
+N-ARY INTERSECTION 22C2
+N-ARY LOGICAL AND 22C0
+N-ARY LOGICAL OR 22C1
+N-ary Operators 22C0
+N-ary Operators 2A00
+N-ARY PRODUCT 220F
+N-ARY SUMMATION 2211
+N-ARY SUMMATION, DOUBLE-STRUCK 2140
+N-ARY TIMES OPERATOR 2A09
+N-ARY UNION 22C3
+N-ARY WHITE VERTICAL BAR 2AFF
+naal, tamil 0BF3
+NABLA 2207
+NAIRA SIGN 20A6
+NAND 22BC
+NARROW NO-BREAK SPACE 202F
+nasal hook 0328
+natural exponent 212F
+natural number 2115
+NATURAL SIGN, MUSIC 266E
+nbsp 00A0
+nearly equals 2252
+necessarily satisfies 2AF1
+NEGATIVE ACKNOWLEDGE 0015
+NEGATIVE ACKNOWLEDGE, SYMBOL FOR 2415
+nel 0085
+NEPTUNE 2646
+NEUTER 26B2
+neutral quotation mark 0022
+neutral single quotation mark 0027
+neutral tone, mandarin chinese fifth or 02D9
+new line 000A
+NEW SHEQEL SIGN 20AA
+New Tai Lue 1980
+New Tai Lue Digits 19D0
+New Testament Editorial Symbols 2E00
+new testament majority text 1D510
+NEWLINE, SYMBOL FOR 2424
+NEXT LINE 0085
+NEXT PAGE 2398
+NIB, BLACK 2712
+NIB, WHITE 2711
+nigerian currency 20A6
+NIGGAHITA, LAO 0ECD
+NIKAHIT, KHMER SIGN 17C6
+NIKHAHIT, THAI CHARACTER 0E4D
+nim-addition 2A27
+NIRUGU, MONGOLIAN 180A
+NKo 07C0
+nl 000A
+nnbsp 202F
+no 20E0
+NO BREAK HERE 0083
+no break space, keyboard symbol for 237D
+NO-BREAK SPACE 00A0
+NO-BREAK SPACE, NARROW 202F
+NO-BREAK SPACE, ZERO WIDTH FEFF
+NODE, ASCENDING 260A
+NODE, DESCENDING 260B
+NON-BREAKING HYPHEN 2011
+non-breaking space 00A0
+NON-JOINER, ZERO WIDTH 200C
+non-spacing iota below, greek 0345
+non-theorem 22A3
+Noncharacters *FFFE
+Noncharacters *FFFF
+Noncharacters FDD*
+Noncharacters FDE*
+NOR 22BD
+NORMAL FACTOR SEMIDIRECT PRODUCT, LEFT 22C9
+NORMAL FACTOR SEMIDIRECT PRODUCT, RIGHT 22CA
+NORMAL SUBGROUP OF 22B2
+Normal Subgroup Signs 22EA
+NORMAL SUBGROUP, CONTAINS AS 22B3
+not 223C
+NOT A SUBSET OF 2284
+NOT A SUPERSET OF 2285
+NOT ALMOST EQUAL TO 2249
+NOT AN ELEMENT OF 2209
+NOT ASYMPTOTICALLY EQUAL TO 2244
+NOT CHECK MARK 237B
+NOT EQUAL TO 2260
+NOT IDENTICAL TO 2262
+not independent 2ADC
+NOT PARALLEL TO 2226
+NOT SIGN 00AC
+NOT SIGN, REVERSED 2310
+NOT SIGN, TURNED 2319
+NOT TILDE 2241
+NOT TILDE ABOVE, COMBINING 034A
+not yield, does 22A3
+NOTE, EIGHTH 266A
+NOTE, QUARTER 2669
+NOTES, BEAMED EIGHTH 266B
+NOTES, BEAMED SIXTEENTH 266C
+NUKTA, DEVANAGARI SIGN 093C
+NULL 0000
+null set 2205
+NULL, SYMBOL FOR 2400
+Number Forms 2150
+NUMBER SIGN 0023
+NUMBER SIGN, TAMIL 0BFA
+number symbol, real 210A
+NUMBER ZERO, IDEOGRAPHIC 3007
+number, natural 2115
+Numbers and Punctuation, Cuneiform 12400
+Numbers Followed by Period 2488
+Numbers, Ancient Greek 10140
+Numbers, Circled 2460
+Numbers, Circled 3251
+Numbers, Circled 32B1
+Numbers, Circled Inverse 2776
+numbers, complex 2102
+Numbers, Double Circled 24F5
+Numbers, Ethiopic 1369
+Numbers, Parenthesized 2474
+numbers, rational 211A
+numbers, real 211D
+Numbers, Runic Golden 16EE
+Numbers, Tamil 0BE7
+Numbers, White on Black Circled 24EB
+Numerals, Hangzhou 3021
+Numerals, Old Italic 10320
+Numerals, Roman 2160
+Numerals, Suzhou 3021
+NUMERATOR ONE, FRACTION 215F
+Numeric Symbols for Divination, Khmer 17F0
+numerics lock 21ED
+NUMERO SIGN 2116
+nut 2002
+o bar, latin capital letter 019F
+o bar, latin small letter 0275
+o e, latin small letter 0153
+o slash, latin capital letter 00D8
+o slash, latin small letter 00F8
+O WITH ACUTE, LATIN CAPITAL LETTER 00D3
+O WITH ACUTE, LATIN SMALL LETTER 00F3
+O WITH BREVE, LATIN SMALL LETTER 014F
+O WITH CARON, LATIN SMALL LETTER 01D2
+O WITH CIRCUMFLEX, LATIN CAPITAL LETTER 00D4
+O WITH CIRCUMFLEX, LATIN SMALL LETTER 00F4
+O WITH DIAERESIS, LATIN CAPITAL LETTER 00D6
+O WITH DIAERESIS, LATIN SMALL LETTER 00F6
+O WITH DOT ABOVE, LATIN SMALL LETTER 022F
+O WITH DOT BELOW, LATIN SMALL LETTER 1ECD
+O WITH DOUBLE ACUTE, LATIN SMALL LETTER 0151
+O WITH DOUBLE GRAVE, LATIN SMALL LETTER 020D
+O WITH GRAVE, LATIN CAPITAL LETTER 00D2
+O WITH GRAVE, LATIN SMALL LETTER 00F2
+O WITH HOOK ABOVE, LATIN SMALL LETTER 1ECF
+O WITH HORN, LATIN SMALL LETTER 01A1
+O WITH INVERTED BREVE, LATIN SMALL LETTER 020F
+O WITH MACRON, LATIN SMALL LETTER 014D
+O WITH MIDDLE TILDE, LATIN CAPITAL LETTER 019F
+O WITH OGONEK, LATIN SMALL LETTER 01EB
+O WITH STROKE, LATIN CAPITAL LETTER 00D8
+O WITH STROKE, LATIN SMALL LETTER 00F8
+O WITH STROKE, LATIN SMALL LETTER SIDEWAYS 1D13
+O WITH TILDE, LATIN CAPITAL LETTER 00D5
+O WITH TILDE, LATIN SMALL LETTER 00F5
+O, COMBINING LATIN SMALL LETTER 0366
+o, latin capital letter barred 019F
+O, LATIN CAPITAL LETTER OPEN 0186
+O, LATIN LETTER SMALL CAPITAL 1D0F
+O, LATIN LETTER SMALL CAPITAL OPEN 1D10
+O, LATIN SMALL LETTER BARRED 0275
+O, LATIN SMALL LETTER BOTTOM HALF 1D17
+O, LATIN SMALL LETTER OPEN 0254
+O, LATIN SMALL LETTER SIDEWAYS 1D11
+O, LATIN SMALL LETTER SIDEWAYS OPEN 1D12
+O, LATIN SMALL LETTER TOP HALF 1D16
+O, SCRIPT SMALL 2134
+OBJECT REPLACEMENT CHARACTER FFFC
+OCR, Optical Character Recognition 2440
+octothorpe 0023
+OE, LATIN LETTER SMALL CAPITAL 0276
+OE, LATIN SMALL LETTER TURNED 1D14
+OE, LATIN SMALL LIGATURE 0153
+Ogham 1680
+Ogham Forfeda Supplement 1695
+Ogham Punctuation 169B
+OGHAM SPACE MARK 1680
+Ogham Traditional Letters 1681
+OGONEK 02DB
+OGONEK, COMBINING 0328
+OHM SIGN 2126
+OHM SIGN, INVERTED 2127
+OI, LATIN SMALL LETTER 01A3
+Ol Chiki 1C50
+Old Italic 10300
+Old Persian 103A0
+old testament, greek 1D516
+OM, DEVANAGARI 0950
+OM, TIBETAN SYLLABLE 0F00
+omega pi 03D6
+OMEGA, LATIN SMALL LETTER CLOSED 0277
+ONE DOT LEADER 2024
+ONE HALF, VULGAR FRACTION 00BD
+ONE QUARTER, VULGAR FRACTION 00BC
+ONE, FRACTION NUMERATOR 215F
+ONE, SUPERSCRIPT 00B9
+OPEN BOX 2423
+OPEN BOX, SHOULDERED 237D
+OPEN E WITH HOOK, LATIN SMALL LETTER REVERSED 025D
+OPEN E, LATIN CAPITAL LETTER 0190
+OPEN E, LATIN SMALL LETTER 025B
+OPEN E, LATIN SMALL LETTER CLOSED 029A
+OPEN E, LATIN SMALL LETTER CLOSED REVERSED 025E
+OPEN E, LATIN SMALL LETTER REVERSED 025C
+OPEN E, LATIN SMALL LETTER TURNED 1D08
+OPEN O, LATIN CAPITAL LETTER 0186
+OPEN O, LATIN LETTER SMALL CAPITAL 1D10
+OPEN O, LATIN SMALL LETTER 0254
+OPEN O, LATIN SMALL LETTER SIDEWAYS 1D12
+opening brace 007B
+opening curly bracket 007B
+opening parenthesis 0028
+opening square bracket 005B
+OPERATING SYSTEM COMMAND 009D
+Operators Supplement, Mathematical 2A00
+Operators, Database Theory 27D5
+Operators, Dotted Mathematical 2234
+Operators, Double 22D0
+Operators, Enclosed Mathematical 2295
+Operators, Invisible 2061
+Operators, Large 29F8
+Operators, Mathematical 2200
+Operators, Modal Logic 27E0
+Operators, Multiplication and Division Sign 2A2F
+Operators, N-ary 22C0
+Operators, N-ary 2A00
+Operators, Plus and Minus Sign 2A22
+Operators, Relational 29E3
+Operators, Specialized Plus Sign 29FA
+Operators, Supplemental Mathematical 2A00
+Operators, Tilde Mathematical 223B
+Operators, Vertical Line 2AEE
+OPPOSITION 260D
+Optical Character Recognition, OCR 2440
+OPTION KEY 2325
+OR, CURLY LOGICAL 22CE
+OR, DOUBLE LOGICAL 2A54
+OR, LOGICAL 2228
+OR, N-ARY LOGICAL 22C1
+order 2134
+Order Relation Precedence Signs 227A
+Order Relation Precedence Signs 22DE
+ORDINAL INDICATOR, FEMININE 00AA
+ORDINAL INDICATOR, MASCULINE 00BA
+ordinarily satisfies 2AE2
+Ordinary Diacritics 0300
+ORIGIN, DIMENSION 2331
+ORIGINAL OF 22B6
+ORIGINAL OF, SQUARE 2290
+Oriya 0B00
+Oriya Consonants 0B15
+Oriya Dependent Vowel Signs 0B3E
+Oriya Digits 0B66
+Oriya Independent Vowels 0B05
+ORIYA ISSHAR 0B70
+Ornamental Angle Quotation Marks 276E
+Ornamental Brackets 2768
+Ornaments, Heart 2763
+Ornaments, Punctuation 275B
+Ornaments, Quotation Mark 275B
+ORNATE LEFT PARENTHESIS FD3E
+ORNATE RIGHT PARENTHESIS FD3F
+Ors, Logical Ands and 2A51
+ORTHODOX CROSS 2626
+orthogonal to 22A5
+Osmanya 10480
+Osmanya Digits 104A0
+OU, LATIN LETTER SMALL CAPITAL 1D15
+OU, LATIN SMALL LETTER 0223
+OUNCE SIGN 2125
+overbar, apl 00AF
+OVERLAY, COMBINING ANTICLOCKWISE RING 20DA
+OVERLAY, COMBINING CLOCKWISE RING 20D9
+overlay, combining counterclockwise ring 20DA
+OVERLAY, COMBINING DOUBLE VERTICAL STROKE 20E6
+OVERLAY, COMBINING LEFTWARDS ARROW 20EA
+OVERLAY, COMBINING LONG DOUBLE SOLIDUS 20EB
+OVERLAY, COMBINING LONG SOLIDUS 0338
+OVERLAY, COMBINING LONG STROKE 0336
+OVERLAY, COMBINING LONG VERTICAL LINE 20D2
+OVERLAY, COMBINING REVERSE SOLIDUS 20E5
+OVERLAY, COMBINING RING 20D8
+OVERLAY, COMBINING SHORT SOLIDUS 0337
+OVERLAY, COMBINING SHORT STROKE 0335
+OVERLAY, COMBINING SHORT VERTICAL LINE 20D3
+OVERLAY, COMBINING TILDE 0334
+overlay, long double slash 20EB
+overlay, long slash 0338
+overlay, short slash 0337
+overline 00AF
+OVERLINE 203E
+OVERLINE, CENTRELINE FE4A
+OVERLINE, COMBINING 0305
+OVERLINE, COMBINING DOUBLE 033F
+OVERLINE, DASHED FE49
+OVERLINE, DOUBLE WAVY FE4C
+OVERLINE, WAVY FE4B
+OVERRIDE, LEFT-TO-RIGHT 202D
+OVERRIDE, RIGHT-TO-LEFT 202E
+overscore 0305
+overscore, spacing 203E
+Overscores and Underscores FE49
+Overstruck Diacritics 0334
+oxia, greek 0301
+P WITH ACUTE, LATIN SMALL LETTER 1E55
+P WITH DOT ABOVE, LATIN SMALL LETTER 1E57
+P WITH HOOK, LATIN SMALL LETTER 01A5
+P, DOUBLE-STRUCK CAPITAL 2119
+P, LATIN LETTER SMALL CAPITAL 1D18
+P, SCRIPT CAPITAL 2118
+page down 21DF
+page up 21DE
+PAGE, NEXT 2398
+PAGE, PREVIOUS 2397
+PALATAL HOOK, LATIN SMALL LETTER T WITH 01AB
+PALATALIZED HOOK BELOW, COMBINING 0321
+PALM BRANCH 2E19
+PALUTA, TIBETAN MARK 0F85
+PAMUDPOD, HANUNOO SIGN 1734
+PAPER SIGN, PERMANENT 267E
+PAPER SYMBOL, PARTIALLY-RECYCLED 267D
+PAPER SYMBOL, RECYCLED 267C
+papyrological hyphen 035C
+PARAGRAPH SEPARATOR 2029
+PARAGRAPH SEPARATOR, ETHIOPIC 1368
+PARAGRAPH SEPARATOR, GEORGIAN 10FB
+paragraph separator, urdu 203B
+paragraph sign 00B6
+PARAGRAPH SIGN ORNAMENT, CURVED STEM 2761
+paragraph sign, european 00A7
+paraguayan currency 20B2
+PARALLEL TO 2225
+PARALLEL TO, NOT 2226
+PARALLELOGRAM, BLACK 25B0
+parenthesis, closing 0029
+PARENTHESIS, LEFT 0028
+PARENTHESIS, LEFT WHITE 2985
+parenthesis, opening 0028
+PARENTHESIS, ORNATE LEFT FD3E
+PARENTHESIS, ORNATE RIGHT FD3F
+PARENTHESIS, RIGHT 0029
+PARENTHESIS, RIGHT WHITE 2986
+Parenthesized CJK Ideographs 3220
+Parenthesized Korean Hangul Elements 3200
+Parenthesized Korean Hangul Syllables 320E
+Parenthesized Latin Letters 249C
+Parenthesized Numbers 2474
+parted rule 00A6
+PARTIAL DIFFERENTIAL 2202
+partial function 21F8
+partial injection 2914
+PARTIAL LINE BACKWARD 008C
+PARTIAL LINE FORWARD 008B
+partial relation 21F9
+partial surjection 2900
+PARTIALLY-RECYCLED PAPER SYMBOL 267D
+PARTNERSHIP SYMBOL, UNMARRIED 26AF
+patiw, armenian 055F
+patru, tamil 0BF6
+pause 2389
+pdf 202C
+PEACE SYMBOL 262E
+PENCIL 270F
+Pencil Dingbats 270E
+PENCIL, LOWER RIGHT 270E
+PENCIL, UPPER RIGHT 2710
+PENNY SIGN, GERMAN 20B0
+pentonkion, greek 2059
+PER MILLE SIGN 2030
+PER SIGN 214C
+PER TEN THOUSAND SIGN 2031
+per thousand 2030
+PERCENT SIGN 0025
+PERCUSSIVE, LATIN LETTER BIDENTAL 02AD
+PERCUSSIVE, LATIN LETTER BILABIAL 02AC
+period 002E
+Period, Numbers Followed by 2488
+PERISPOMENI, COMBINING GREEK 0342
+PERMANENT PAPER SIGN 267E
+perpendicular 22A5
+Persian, Old 103A0
+PERSPECTIVE 2306
+PESETA SIGN 20A7
+PESO SIGN 20B1
+Phags-pa A840
+Phaistos Disc 101D0
+PHARYNGEAL VOICED FRICATIVE, LATIN LETTER 0295
+PHI SYMBOL, GREEK 03D5
+PHI, LATIN SMALL LETTER 0278
+PHILIPPINE DOUBLE PUNCTUATION 1736
+PHILIPPINE SINGLE PUNCTUATION 1735
+phillipine currency 20B1
+Phoenician 10900
+Phonetic Digraphs 02A3
+Phonetic Extensions 1D00
+Phonetic Extensions, Katakana 31F0
+Phonetic Modifiers 02B9
+Phonetic Modifiers Derived from Latin Letters 02B0
+Phonetics and Symbols Area, CJK 2E80
+phonorecord sign 2117
+phul 2055
+PI SYMBOL, GREEK 03D6
+PI, DOUBLE-STRUCK CAPITAL 213F
+PI, DOUBLE-STRUCK SMALL 213C
+PI, GREEK SMALL LETTER 03C0
+pi, mathematical constant 3.141592... 03C0
+Pictures for Control Codes, Graphic 2400
+PILCROW SIGN 00B6
+PILCROW SIGN, REVERSED 204B
+pillow 2311
+pipe 01C0
+pipe, double 01C1
+pipe, double-barred 01C2
+PISCES 2653
+piska 2052
+PITCHFORK 22D4
+PLACE OF INTEREST SIGN 2318
+plaintiff 226C
+PLANCK CONSTANT 210E
+PLANCK CONSTANT OVER TWO PI 210F
+Planet Symbols 263F
+Plastics Recycling Symbols 2673
+Playing Card Suits 2660
+Plus and Minus Sign Operators 2A22
+PLUS SIGN 002B
+PLUS SIGN BELOW, COMBINING 031F
+Plus Sign Operators, Specialized 29FA
+PLUS SIGN, MODIFIER LETTER 02D6
+PLUS, CIRCLED 2295
+PLUS, DOT 2214
+PLUS, DOUBLE 29FA
+PLUS, INVISIBLE 2064
+PLUS, SQUARED 229E
+PLUS, TRIPLE 29FB
+PLUS-MINUS SIGN 00B1
+PLUTO 2647
+point, decimal 002E
+POINT, HYPHENATION 2027
+Pointers 25BA
+Pointing Hand Symbols 261A
+Pointing Index Finger Dingbats 261A
+POINTING INDEX, BLACK LEFT 261A
+POINTING INDEX, BLACK RIGHT 261B
+POINTING INDEX, WHITE DOWN 261F
+POINTING INDEX, WHITE LEFT 261C
+POINTING INDEX, WHITE RIGHT 261E
+POINTING INDEX, WHITE UP 261D
+Points and Punctuation, Hebrew 05B0
+Points, Hebrew 05B0
+Points, Syriac 0730
+poison 2620
+Political Symbols, Religious and 2625
+Polygonal Symbols 2B12
+Polytonic Greek, Precomposed 1F00
+POP DIRECTIONAL FORMATTING 202C
+POSITION INDICATOR 2316
+positive difference or sum 2A24
+positive difference, sum or 2A26
+positive, most 223E
+POSTAL MARK 3012
+POSTAL MARK FACE 3020
+POSTAL MARK, CIRCLED 3036
+pound sign 0023
+POUND SIGN 00A3
+pound sterling 00A3
+pounds 2114
+power set 1D4AB
+Precedence Signs, Order Relation 227A
+Precedence Signs, Order Relation 22DE
+PRECEDES 227A
+PRECEDES UNDER RELATION 22B0
+PRECEDES, DOUBLE 2ABB
+Precomposed Polytonic Greek 1F00
+PRESCRIPTION TAKE 211E
+Presentation Forms, Alphabetic FB00
+Presentation Forms, Hebrew FB1D
+Presentation Forms-A, Arabic FB50
+Presentation Forms-B, Arabic FE70
+PREVIOUS PAGE 2397
+PRIME 2032
+PRIME QUOTATION MARK, DOUBLE 301E
+PRIME QUOTATION MARK, LOW DOUBLE 301F
+PRIME QUOTATION MARK, REVERSED DOUBLE 301D
+PRIME, DOUBLE 2033
+PRIME, MODIFIER LETTER 02B9
+PRIME, MODIFIER LETTER DOUBLE 02BA
+PRIME, QUADRUPLE 2057
+PRIME, REVERSED 2035
+PRIME, REVERSED DOUBLE 2036
+PRIME, REVERSED TRIPLE 2037
+PRIME, TRIPLE 2034
+PRINT SCREEN SYMBOL 2399
+PRIVACY MESSAGE 009E
+Private Use Area E000
+Private Use Area-A, Supplementary F0000
+Private Use Area-B, Supplementary 100000
+PRIVATE USE ONE 0091
+PRIVATE USE TWO 0092
+product sign 220F
+product, cartesian 00D7
+product, direct 2299
+PRODUCT, INTERIOR 2A3C
+PRODUCT, LEFT NORMAL FACTOR SEMIDIRECT 22C9
+PRODUCT, LEFT SEMIDIRECT 22CB
+PRODUCT, N-ARY 220F
+PRODUCT, RIGHT NORMAL FACTOR SEMIDIRECT 22CA
+PRODUCT, RIGHT SEMIDIRECT 22CC
+PRODUCT, RIGHTHAND INTERIOR 2A3D
+PRODUCT, SHUFFLE 29E2
+PRODUCT, SMASH 2A33
+product, tensor 2297
+PRODUCT, VECTOR OR CROSS 2A2F
+PRODUCT, WREATH 2240
+PROGRAM COMMAND, APPLICATION 009F
+prohibition 20E0
+PROJECTIVE 2305
+PROOF, END OF 220E
+proper intersection 22D4
+PROPERTY LINE 214A
+PROPORTION 2237
+PROPORTION, GEOMETRIC 223A
+PROPORTIONAL TO 221D
+proportional to 223C
+proves 22A2
+psili, greek 0313
+published 2117
+pullback 27D3
+Punctuation and Signs, Greek 0374
+Punctuation and Signs, Myanmar 104A
+Punctuation and Signs, Syriac 0700
+Punctuation and Symbols, ASCII 0020
+Punctuation and Symbols, Latin-1 00A0
+Punctuation for Vertical Text, Double 2047
+Punctuation Ornaments 275B
+PUNCTUATION SPACE 2008
+Punctuation, Arabic 060C
+Punctuation, Canadian Syllabics 166D
+Punctuation, CJK Symbols and 3000
+Punctuation, Cuneiform Numbers and 12400
+Punctuation, Ethiopic 1361
+Punctuation, General 2000
+Punctuation, Halfwidth CJK FF61
+Punctuation, Hebrew Points and 05B0
+Punctuation, Mongolian 1800
+Punctuation, Ogham 169B
+PUNCTUATION, PHILIPPINE DOUBLE 1736
+PUNCTUATION, PHILIPPINE SINGLE 1735
+Punctuation, Runic 16EB
+Punctuation, Supplemental 2E00
+punt, irish 00A3
+purna viram, devanagari 0964
+pushout 27D4
+puspika 2055
+Q WITH HOOK TAIL, LATIN CAPITAL LETTER SMALL 024A
+Q WITH HOOK TAIL, LATIN SMALL LETTER 024B
+Q WITH HOOK, LATIN SMALL LETTER 02A0
+Q, DOUBLE-STRUCK CAPITAL 211A
+Q, ROTATED CAPITAL 213A
+q.e.d. 220E
+QP DIGRAPH, LATIN SMALL LETTER 0239
+QUAD, EM 2001
+QUAD, EN 2000
+quad, mutton 2001
+Quadrant Control Code Graphics 25F0
+quadrature 25A1
+QUADRUPLE PRIME 2057
+quantic 226C
+quantifier, existential 2203
+quantifier, universal 2200
+QUARTER MOON, FIRST 263D
+QUARTER MOON, LAST 263E
+QUARTER NOTE 2669
+QUARTER, VULGAR FRACTION ONE 00BC
+Quarters, Fractions 00BC
+QUARTERS, VULGAR FRACTION THREE 00BE
+QUATERNION INTEGRAL OPERATOR 2A16
+QUESTION EXCLAMATION MARK 2048
+QUESTION MARK 003F
+QUESTION MARK, ARABIC 061F
+QUESTION MARK, ARMENIAN 055E
+QUESTION MARK, DOUBLE 2047
+QUESTION MARK, ETHIOPIC 1367
+QUESTION MARK, EXCLAMATION 2049
+question mark, greek 003B
+QUESTION MARK, GREEK 037E
+QUESTION MARK, INVERTED 00BF
+QUESTION MARK, LIMBU 1945
+question mark, turned 00BF
+QUESTIONED EQUAL TO 225F
+QUILL, LEFT SQUARE BRACKET WITH 2045
+QUILL, RIGHT SQUARE BRACKET WITH 2046
+Quine Corners 231C
+quotation dash 2015
+QUOTATION MARK 0022
+Quotation Mark Dingbats 275B
+Quotation Mark Ornaments 275B
+quotation mark, double comma 201D
+QUOTATION MARK, DOUBLE HIGH-REVERSED-9 201F
+QUOTATION MARK, DOUBLE LOW-9 201E
+QUOTATION MARK, DOUBLE PRIME 301E
+quotation mark, double reversed comma 201F
+quotation mark, double turned comma 201C
+QUOTATION MARK, LEFT DOUBLE 201C
+QUOTATION MARK, LEFT SINGLE 2018
+QUOTATION MARK, LEFT-POINTING DOUBLE ANGLE 00AB
+quotation mark, low double comma 201E
+QUOTATION MARK, LOW DOUBLE PRIME 301F
+quotation mark, low single comma 201A
+quotation mark, neutral 0022
+quotation mark, neutral single 0027
+QUOTATION MARK, REVERSED DOUBLE PRIME 301D
+QUOTATION MARK, RIGHT DOUBLE 201D
+QUOTATION MARK, RIGHT SINGLE 2019
+QUOTATION MARK, RIGHT-POINTING DOUBLE ANGLE 00BB
+quotation mark, single comma 2019
+QUOTATION MARK, SINGLE HIGH-REVERSED-9 201B
+QUOTATION MARK, SINGLE LEFT-POINTING ANGLE 2039
+QUOTATION MARK, SINGLE LOW-9 201A
+quotation mark, single reversed comma 201B
+QUOTATION MARK, SINGLE RIGHT-POINTING ANGLE 203A
+quotation mark, single turned comma 2018
+Quotation Marks 2018
+Quotation Marks, CJK 300C
+Quotation Marks, Ornamental Angle 276E
+quote, apl 0027
+Qur'anic Annotation Signs, Arabic 06D6
+R WITH ACUTE, LATIN SMALL LETTER 0155
+R WITH CARON, LATIN SMALL LETTER 0159
+R WITH CEDILLA, LATIN SMALL LETTER 0157
+R WITH DOT ABOVE, LATIN SMALL LETTER 1E59
+R WITH DOT BELOW, LATIN SMALL LETTER 1E5B
+R WITH DOUBLE GRAVE, LATIN SMALL LETTER 0211
+R WITH FISHHOOK, LATIN SMALL LETTER 027E
+R WITH FISHHOOK, LATIN SMALL LETTER REVERSED 027F
+R WITH HOOK, LATIN SMALL LETTER TURNED 027B
+R WITH INVERTED BREVE, LATIN SMALL LETTER 0213
+R WITH LINE BELOW, LATIN SMALL LETTER 1E5F
+R WITH LONG LEG, LATIN SMALL LETTER 027C
+R WITH LONG LEG, LATIN SMALL LETTER TURNED 027A
+R WITH STROKE, LATIN CAPITAL LETTER 024C
+R WITH STROKE, LATIN SMALL LETTER 024D
+R WITH TAIL, LATIN SMALL LETTER 027D
+R, BLACK-LETTER CAPITAL 211C
+R, COMBINING LATIN SMALL LETTER 036C
+R, DOUBLE-STRUCK CAPITAL 211D
+R, LATIN LETTER SMALL CAPITAL 0280
+R, LATIN LETTER SMALL CAPITAL INVERTED 0281
+R, LATIN LETTER SMALL CAPITAL REVERSED 1D19
+R, LATIN LETTER SMALL CAPITAL TURNED 1D1A
+R, LATIN SMALL LETTER TURNED 0279
+R, LATIN SUBSCRIPT SMALL LETTER 1D63
+R, MODIFIER LETTER SMALL 02B3
+R, MODIFIER LETTER SMALL CAPITAL INVERTED 02B6
+R, MODIFIER LETTER SMALL TURNED 02B4
+R, SCRIPT CAPITAL 211B
+radial component 27DF
+radical sign 221A
+Radicals Supplement, CJK 2E80
+Radicals, CJK Kangxi 2F00
+Radicals, Yi A490
+RADIOACTIVE SIGN 2622
+RAIN DROPS, UMBRELLA WITH 2614
+rainy weather 2602
+RAMS HORN, LATIN SMALL LETTER 0264
+range restriction 25B7
+RATIO 2236
+ratio, cross 211E
+rational numbers 211A
+REAHMUK, KHMER SIGN 17C7
+real number symbol 210A
+real numbers 211D
+real part 211C
+recipe 211E
+record separator 001E
+RECORD SEPARATOR, SYMBOL FOR 241E
+RECORDER, TELEPHONE 2315
+RECORDING COPYRIGHT, SOUND 2117
+RECTANGLE BOX, X IN A 2327
+Rectangles 25AC
+RECYCLED PAPER SYMBOL 267C
+RECYCLED PAPER SYMBOL, PARTIALLY- 267D
+RECYCLING SYMBOL, UNIVERSAL 2672
+Recycling Symbols 2672
+Recycling Symbols, Plastics 2673
+reduces to 22A6
+reducible 22A2
+REFERENCE MARK 203B
+REGISTERED SIGN 00AE
+registered trade mark sign 00AE
+Rejang A930
+relation 2194
+relation, finite 21FC
+relation, partial 21F9
+Relational Operators 29E3
+Relations, Subset and Superset 2ABD
+Religious and Political Symbols 2626
+Repeat Marks, Kana 3031
+REPLACEMENT CHARACTER FFFD
+REPLACEMENT CHARACTER, OBJECT FFFC
+RESPONSE 211F
+restriction, domain 25C1
+restriction, range 25B7
+results in 22A8
+RETROFLEX CLICK, LATIN LETTER 01C3
+RETROFLEX HOOK BELOW, COMBINING 0322
+RETROFLEX HOOK, LATIN CAPITAL LETTER T WITH 01AE
+retroflex hook, latin small letter d 0256
+RETROFLEX HOOK, LATIN SMALL LETTER L WITH 026D
+RETROFLEX HOOK, LATIN SMALL LETTER N WITH 0273
+RETROFLEX HOOK, LATIN SMALL LETTER T WITH 0288
+RETROFLEX HOOK, LATIN SMALL LETTER Z WITH 0290
+RETURN SYMBOL 23CE
+RETURN, CARRIAGE 000D
+RETURN, SYMBOL FOR CARRIAGE 240D
+REVERSE LINE FEED 008D
+REVERSE SOLIDUS 005C
+REVERSE SOLIDUS OPERATOR 29F5
+REVERSE SOLIDUS OVERLAY, COMBINING 20E5
+REVERSE SOLIDUS, BIG 29F9
+reverse turnstile 22A3
+REVERSED C, LATIN SMALL LETTER 2184
+REVERSED COMMA ABOVE, COMBINING 0314
+reversed comma quotation mark, double 201F
+reversed comma quotation mark, single 201B
+REVERSED COMMA, MODIFIER LETTER 02BD
+REVERSED DOUBLE PRIME 2036
+REVERSED DOUBLE PRIME QUOTATION MARK 301D
+REVERSED E, LATIN CAPITAL LETTER 018E
+REVERSED E, LATIN SMALL LETTER 0258
+reversed epsilon, latin small letter closed 025E
+REVERSED ESH LOOP, LATIN LETTER 01AA
+REVERSED ESH, LATIN SMALL LETTER SQUAT 0285
+reversed glottal stop, latin letter 0295
+REVERSED GLOTTAL STOP, MODIFIER LETTER 02C1
+REVERSED GLOTTAL STOP, MODIFIER LETTER SMALL 02E4
+REVERSED LUNATE EPSILON SYMBOL, GREEK 03F6
+REVERSED N, LATIN LETTER SMALL CAPITAL 1D0E
+REVERSED NOT SIGN 2310
+REVERSED OPEN E WITH HOOK, LATIN SMALL LETTER 025D
+REVERSED OPEN E, LATIN SMALL LETTER 025C
+REVERSED OPEN E, LATIN SMALL LETTER CLOSED 025E
+REVERSED PILCROW SIGN 204B
+REVERSED PRIME 2035
+REVERSED R WITH FISHHOOK, LATIN SMALL LETTER 027F
+REVERSED R, LATIN LETTER SMALL CAPITAL 1D19
+REVERSED ROTATED FLORAL HEART BULLET 2619
+REVERSED SANS-SERIF CAPITAL L 2143
+REVERSED SEMICOLON 204F
+reversed straight epsilon 03F6
+REVERSED TILDE 223D
+REVERSED TILDE EQUALS 22CD
+REVERSED TRIPLE PRIME 2037
+REVERSED, LATIN SMALL LETTER EZH 01B9
+rgroup 27EF
+RHOTIC HOOK, MODIFIER LETTER 02DE
+RIAL SIGN FDFC
+RIEL, KHMER CURRENCY SYMBOL 17DB
+riemann integral 211B
+right abstract syntax bracket 301B
+RIGHT ANGLE 221F
+RIGHT ANGLE BRACKET 3009
+RIGHT ANGLE BRACKET, MATHEMATICAL 27E9
+RIGHT ANGLE WITH ARC 22BE
+RIGHT ARROW ABOVE, COMBINING 20D7
+RIGHT ARROW ABOVE, COMBINING LEFT 20E1
+RIGHT ARROW BELOW, COMBINING 20EF
+RIGHT ARROW BELOW, COMBINING LEFT 034D
+right arrow, colon 29F4
+RIGHT ARROWHEAD ABOVE, COMBINING 0350
+RIGHT ARROWHEAD BELOW, COMBINING 0355
+right bag bracket 27E7
+RIGHT BLACK LENTICULAR BRACKET 3011
+RIGHT CEILING 2309
+right chevron bracket 27EB
+RIGHT CORNER BRACKET 300D
+RIGHT CURLY BRACKET 007D
+RIGHT DIAGONAL ELLIPSIS, DOWN 22F1
+RIGHT DIAGONAL ELLIPSIS, UP 22F0
+RIGHT DOUBLE ANGLE BRACKET 300B
+RIGHT DOUBLE ANGLE BRACKET, MATHEMATICAL 27EB
+RIGHT DOUBLE QUOTATION MARK 201D
+RIGHT FLOOR 230B
+RIGHT HALF RING ABOVE, COMBINING 0357
+RIGHT HALF RING BELOW, COMBINING 0339
+right half ring, armenian modifier letter 055A
+RIGHT HARPOON ABOVE, COMBINING 20D1
+right key, delete to the 2326
+right moustache 23B1
+RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT 22CA
+RIGHT PARENTHESIS 0029
+RIGHT PARENTHESIS, ORNATE FD3F
+RIGHT PENCIL, LOWER 270E
+RIGHT PENCIL, UPPER 2710
+right pointing guillemet 00BB
+RIGHT POINTING INDEX, BLACK 261B
+RIGHT POINTING INDEX, WHITE 261E
+right pointing single guillemet 203A
+RIGHT SEMIDIRECT PRODUCT 22CC
+right sequence bracket 27E9
+RIGHT SINGLE QUOTATION MARK 2019
+RIGHT SQUARE BRACKET 005D
+RIGHT SQUARE BRACKET WITH QUILL 2046
+RIGHT TACK 22A2
+RIGHT TACK BELOW, COMBINING 0319
+RIGHT TORTOISE SHELL BRACKET 3015
+RIGHT TRIANGLE 22BF
+RIGHT WHITE CORNER BRACKET 300F
+RIGHT WHITE CURLY BRACKET 2984
+RIGHT WHITE LENTICULAR BRACKET 3017
+RIGHT WHITE PARENTHESIS 2986
+RIGHT WHITE SQUARE BRACKET 301B
+RIGHT WHITE TORTOISE SHELL BRACKET 3019
+RIGHT, COMBINING COMMA ABOVE 0315
+RIGHT, COMBINING DOT ABOVE 0358
+RIGHT, ERASE TO THE 2326
+right, fast cursor 21A0
+RIGHT-POINTING ANGLE BRACKET 232A
+RIGHT-POINTING ANGLE QUOTATION MARK, SINGLE 203A
+RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 00BB
+RIGHT-TO-LEFT EMBEDDING 202B
+RIGHT-TO-LEFT MARK 200F
+RIGHT-TO-LEFT OVERRIDE 202E
+RIGHTHAND INTERIOR PRODUCT 2A3D
+rightward tab 21E5
+RIGHTWARDS ARROW 2192
+RIGHTWARDS ARROW BELOW, COMBINING DOUBLE 0362
+RIGHTWARDS BULLET, BLACK 204D
+RIGHTWARDS HARPOON WITH BARB DOWNWARDS, COMBINING 20EC
+RING ABOVE 02DA
+RING ABOVE, COMBINING 030A
+RING ABOVE, COMBINING LEFT HALF 0351
+RING ABOVE, COMBINING RIGHT HALF 0357
+RING ABOVE, LATIN CAPITAL LETTER A WITH 00C5
+RING ABOVE, LATIN SMALL LETTER A WITH 00E5
+RING BELOW, COMBINING 0325
+RING BELOW, COMBINING DOUBLE 035A
+RING BELOW, COMBINING LEFT HALF 031C
+RING BELOW, COMBINING RIGHT HALF 0339
+RING BELOW, LATIN SMALL LETTER A WITH 1E01
+RING EQUAL TO 2257
+RING IN EQUAL TO 2256
+RING OPERATOR 2218
+RING OPERATOR, CIRCLED 229A
+RING OVERLAY, COMBINING 20D8
+RING OVERLAY, COMBINING ANTICLOCKWISE 20DA
+RING OVERLAY, COMBINING CLOCKWISE 20D9
+ring overlay, combining counterclockwise 20DA
+RING, ARMENIAN MODIFIER LETTER LEFT HALF 0559
+ring, armenian modifier letter right half 055A
+RING, BENZENE 232C
+RING, MODIFIER LETTER CENTRED LEFT HALF 02D3
+RING, MODIFIER LETTER LEFT HALF 02BF
+RJES SU NGA RO, TIBETAN SIGN 0F7E
+rle 202B
+rlm 200F
+rlo 202E
+RNAM BCAD, TIBETAN SIGN 0F7F
+Roman Numerals 2160
+Roman Numerals, Archaic 2185
+Roman Symbols 10190
+ROOT, CUBE 221B
+ROOT, FOURTH 221C
+ROOT, SQUARE 221A
+ROTATED CAPITAL Q 213A
+rough breathing mark, greek 0314
+rule, parted 00A6
+RULE-DELAYED 29F4
+Runic 16A0
+Runic Golden Numbers 16EE
+Runic Punctuation 16EB
+RUNOUT, TOTAL 2330
+rupai, tamil 0BF9
+RUPEE MARK, BENGALI 09F2
+RUPEE SIGN 20A8
+RUPEE SIGN, BENGALI 09F3
+RUPEE SIGN, GUJARATI 0AF1
+RUPEE SIGN, TAMIL 0BF9
+Russian Alphabet 0410
+S WITH ACUTE, LATIN SMALL LETTER 015B
+S WITH CARON, LATIN SMALL LETTER 0161
+S WITH CEDILLA, LATIN SMALL LETTER 015F
+S WITH CIRCUMFLEX, LATIN SMALL LETTER 015D
+S WITH COMMA BELOW, LATIN SMALL LETTER 0219
+S WITH DOT ABOVE, LATIN SMALL LETTER 1E61
+S WITH DOT ABOVE, LATIN SMALL LETTER LONG 1E9B
+S WITH DOT BELOW, LATIN SMALL LETTER 1E63
+S WITH HOOK, LATIN SMALL LETTER 0282
+S WITH SWASH TAIL, LATIN SMALL LETTER 023F
+S, INVERTED LAZY 223E
+S, LATIN SMALL LETTER LONG 017F
+S, LATIN SMALL LETTER SHARP 00DF
+s, lazy 223D
+S, MODIFIER LETTER SMALL 02E2
+SAGITTARIUS 2650
+SALTIRE 2613
+sam, syriac 070F
+SAMARITAN SOURCE, SYMBOL FOR 214F
+Sans-serif Bold Digits 1D7EC
+Sans-serif Bold Greek Mathematical Symbols 1D756
+Sans-serif Bold Italic Greek Mathematical Symbols 1D790
+Sans-serif Bold Italic Mathematical Symbols 1D63C
+Sans-serif Bold Mathematical Symbols 1D5D4
+SANS-SERIF CAPITAL G, TURNED 2141
+SANS-SERIF CAPITAL L, REVERSED 2143
+SANS-SERIF CAPITAL L, TURNED 2142
+SANS-SERIF CAPITAL Y, TURNED 2144
+Sans-serif Digits 1D7E2
+Sans-serif Italic Mathematical Symbols 1D608
+Sans-serif Mathematical Symbols 1D5A0
+satisfies 22A8
+satisfies, necessarily 2AF1
+satisfies, ordinarily 2AE2
+saturating subtraction 2238
+SATURN 2644
+Saurashtra A880
+SCALES 2696
+Scan Lines, Horizontal 23BA
+schema hiding 29F9
+SCHWA, LATIN CAPITAL LETTER 018F
+SCHWA, LATIN SMALL LETTER 0259
+SCISSORS, BLACK 2702
+SCISSORS, UPPER BLADE 2701
+SCISSORS, WHITE 2704
+SCORPIUS 264F
+SCREEN SYMBOL, CLEAR 239A
+SCREEN SYMBOL, PRINT 2399
+SCREEN, COMBINING ENCLOSING 20E2
+script a, latin small letter 0251
+SCRIPT CAPITAL B 212C
+SCRIPT CAPITAL E 2130
+SCRIPT CAPITAL F 2131
+SCRIPT CAPITAL H 210B
+SCRIPT CAPITAL I 2110
+SCRIPT CAPITAL L 2112
+SCRIPT CAPITAL M 2133
+SCRIPT CAPITAL P 2118
+SCRIPT CAPITAL R 211B
+script f, latin small letter 0192
+SCRIPT G, LATIN SMALL LETTER 0261
+Script Mathematical Symbols 1D49C
+Script Mathematical Symbols, Bold 1D4D0
+SCRIPT SMALL E 212F
+SCRIPT SMALL G 210A
+SCRIPT SMALL L 2113
+SCRIPT SMALL O 2134
+script theta 03D1
+script v, latin capital letter 01B2
+script v, latin small letter 028B
+scrolling 21F3
+SCRUPLE 2108
+SEAGULL BELOW, COMBINING 033C
+second tone, mandarin chinese 02CA
+seconds 2033
+SECTION SIGN 00A7
+section sign, european 00B6
+SECTOR 2314
+SEGMENT 2313
+SELECTED AREA, END OF 0087
+SELECTED AREA, START OF 0086
+Selectors Supplement, Variation E0100
+Selectors, Variation FE00
+SEMICOLON 003B
+SEMICOLON, ARABIC 061B
+SEMICOLON, ETHIOPIC 1364
+SEMICOLON, REVERSED 204F
+SEMIDIRECT PRODUCT, LEFT 22CB
+SEMIDIRECT PRODUCT, LEFT NORMAL FACTOR 22C9
+SEMIDIRECT PRODUCT, RIGHT 22CC
+SEMIDIRECT PRODUCT, RIGHT NORMAL FACTOR 22CA
+SEPARATOR DOT, AEGEAN WORD 10101
+SEPARATOR KEY SYMBOL, DECIMAL 2396
+SEPARATOR LINE, AEGEAN WORD 10100
+SEPARATOR, ARABIC DATE 060D
+SEPARATOR, ARABIC DECIMAL 066B
+separator, arabic phrase 066C
+SEPARATOR, ARABIC THOUSANDS 066C
+separator, decimal 002C
+separator, devanagari phrase 0964
+SEPARATOR, ETHIOPIC PARAGRAPH 1368
+separator, file 001C
+SEPARATOR, GEORGIAN PARAGRAPH 10FB
+separator, group 001D
+SEPARATOR, INTERLINEAR ANNOTATION FFFA
+SEPARATOR, INVISIBLE 2063
+SEPARATOR, LINE 2028
+SEPARATOR, MONGOLIAN VOWEL 180E
+SEPARATOR, PARAGRAPH 2029
+separator, record 001E
+separator, unit 001F
+separator, urdu paragraph 203B
+septuagint 1D516
+sequence bracket, left 27E8
+sequence bracket, right 27E9
+sequence concatenation 2040
+SEQUENCE INTRODUCER, CONTROL 009B
+SERVICE MARK 2120
+SESAME DOT FE45
+SESAME DOT, WHITE FE46
+Set Membership Signs 2208
+SET MINUS 2216
+set of complex numbers, the 2102
+set of integers, the 2124
+set of rational numbers, the 211A
+set of real numbers, the 211D
+SET TRANSMIT STATE 0093
+SET, EMPTY 2205
+set, included in 2282
+set, includes in 2283
+set, null 2205
+set, power 1D4AB
+Sets, Empty 29B0
+sextile 2736
+Shade Characters 2591
+SHADOWED WHITE CIRCLE 274D
+SHAMROCK 2618
+shamrock 2663
+Shapes, Geometric 25A0
+SHARP S, LATIN SMALL LETTER 00DF
+SHARP SIGN, MUSIC 266F
+Shavian 10450
+SHEQEL SIGN, NEW 20AA
+shesht, armenian 055B
+shift 21E7
+SHIFT IN 000F
+SHIFT IN, SYMBOL FOR 240F
+SHIFT OUT 000E
+SHIFT OUT, SYMBOL FOR 240E
+SHOGI PIECE, BLACK 2617
+SHOGI PIECE, WHITE 2616
+short 0306
+short slash overlay 0337
+SHORT SOLIDUS OVERLAY, COMBINING 0337
+SHORT STROKE OVERLAY, COMBINING 0335
+SHORT VERTICAL LINE OVERLAY, COMBINING 20D3
+SHOULDERED OPEN BOX 237D
+showery weather 2614
+SHUFFLE PRODUCT 29E2
+shy 00AD
+SIBE SYLLABLE BOUNDARY MARKER, MONGOLIAN 1807
+Sidelining Emphasis Marks FE45
+SIDEWAYS DIAERESIZED U, LATIN SMALL LETTER 1D1E
+SIDEWAYS O WITH STROKE, LATIN SMALL LETTER 1D13
+SIDEWAYS O, LATIN SMALL LETTER 1D11
+SIDEWAYS OPEN O, LATIN SMALL LETTER 1D12
+SIDEWAYS TURNED M, LATIN SMALL LETTER 1D1F
+SIDEWAYS U, LATIN SMALL LETTER 1D1D
+SIGMA SYMBOL, GREEK LUNATE 03F2
+sigma, greek small letter lunate 03F2
+Signs, Warning 2620
+Signs, Warning 26A0
+similar to 223C
+SINE WAVE 223F
+SINGLE CHARACTER INTRODUCER 009A
+single comma quotation mark 2019
+single comma quotation mark, low 201A
+single guillemet, left pointing 2039
+single guillemet, right pointing 203A
+SINGLE HIGH-REVERSED-9 QUOTATION MARK 201B
+SINGLE LEFT-POINTING ANGLE QUOTATION MARK 2039
+SINGLE LOW-9 QUOTATION MARK 201A
+SINGLE PUNCTUATION, PHILIPPINE 1735
+SINGLE QUOTATION MARK, LEFT 2018
+single quotation mark, neutral 0027
+SINGLE QUOTATION MARK, RIGHT 2019
+single reversed comma quotation mark 201B
+SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 203A
+SINGLE SHIFT THREE 008F
+SINGLE SHIFT TWO 008E
+single turned comma quotation mark 2018
+Sinhala 0D80
+Sinhala Consonants 0D9A
+Sinhala Dependent Vowel Signs 0DCF
+Sinhala Independent Vowels 0D85
+SINHALA SIGN AL-LAKUNA 0DCA
+sinhala virama 0DCA
+SIX-PER-EM SPACE 2006
+SIXTEENTH NOTES, BEAMED 266C
+Sixths, Fractions 2159
+SKULL AND CROSSBONES 2620
+slash 002F
+slash overlay, long 0338
+slash overlay, long double 20EB
+slash overlay, short 0337
+SLASH, CIRCLED DIVISION 2298
+SLASH, DIVISION 2215
+SLASH, FRACTION 2044
+slash, latin capital letter o 00D8
+slash, latin small letter o 00F8
+SLOPE 2333
+SMALL CAPITAL AE, LATIN LETTER 1D01
+SMALL CAPITAL ETH, LATIN LETTER 1D06
+SMALL CAPITAL EZH, LATIN LETTER 1D23
+SMALL CAPITAL OE, LATIN LETTER 0276
+SMALL CAPITAL OU, LATIN LETTER 1D15
+small circle, black 2022
+SMALL CONTAINS AS MEMBER 220D
+SMALL ELEMENT OF 220A
+Small Form Variants FE50
+SMALL GAMMA, DOUBLE-STRUCK 213D
+SMALL GAMMA, MODIFIER LETTER 02E0
+SMALL KA, HIRAGANA LETTER 3095
+SMALL KE, HIRAGANA LETTER 3096
+Small Letters, Armenian 0561
+Small Letters, Combining Latin 0363
+Small Letters, Cyrillic 0430
+Small Letters, Georgian 10D0
+Small Letters, Greek 03B1
+Small Letters, Latin 0061
+small ligature ae, latin 00E6
+SMALL LIGATURE IJ, LATIN 0133
+SMALL LIGATURE OE, LATIN 0153
+SMALL PI, DOUBLE-STRUCK 213C
+SMALL REVERSED GLOTTAL STOP, MODIFIER LETTER 02E4
+SMALL SQUARE, BLACK MEDIUM 25FE
+SMALL TILDE 02DC
+SMALL WHITE CIRCLE, MEDIUM 26AC
+SMASH PRODUCT 2A33
+SMILE 2323
+SMILING FACE, BLACK 263B
+SMILING FACE, WHITE 263A
+smirk 2368
+smooth breathing mark, greek 0313
+Snowflake Dingbats 2744
+Snowflakes 2721
+SNOWMAN 2603
+snowy weather 2603
+SOFT HYPHEN 00AD
+SOFT HYPHEN, MONGOLIAN TODO 1806
+SOFTWARE-FUNCTION SYMBOL 2394
+solid 2588
+SOLIDUS 002F
+solidus 2044
+SOLIDUS OPERATOR, DOUBLE 2AFD
+SOLIDUS OPERATOR, REVERSE 29F5
+SOLIDUS OVERLAY, COMBINING LONG 0338
+SOLIDUS OVERLAY, COMBINING LONG DOUBLE 20EB
+SOLIDUS OVERLAY, COMBINING REVERSE 20E5
+SOLIDUS OVERLAY, COMBINING SHORT 0337
+SOLIDUS, BIG 29F8
+SOLIDUS, BIG REVERSE 29F9
+SOLIDUS, REVERSE 005C
+SOUND RECORDING COPYRIGHT 2117
+SOURCE, INFORMATION 2139
+SPACE 0020
+SPACE MARK, OGHAM 1680
+SPACE, EM 2003
+SPACE, EN 2002
+SPACE, FIGURE 2007
+SPACE, FOUR-PER-EM 2005
+space, graphic for 2423
+SPACE, HAIR 200A
+space, hilbert 210C
+SPACE, IDEOGRAPHIC 3000
+SPACE, IDEOGRAPHIC HALF FILL 303F
+space, keyboard symbol for no break 237D
+SPACE, MEDIUM MATHEMATICAL 205F
+space, mid 2005
+SPACE, NARROW NO-BREAK 202F
+SPACE, NO-BREAK 00A0
+space, non-breaking 00A0
+SPACE, PUNCTUATION 2008
+SPACE, SIX-PER-EM 2006
+SPACE, SYMBOL FOR 2420
+space, thick 2004
+SPACE, THIN 2009
+SPACE, THREE-PER-EM 2004
+SPACE, ZERO WIDTH 200B
+SPACE, ZERO WIDTH NO-BREAK FEFF
+Spaces 2000
+spacing acute accent 00B4
+spacing cedilla 00B8
+spacing circumflex accent 005E
+Spacing Clones of Diacritics 02D8
+spacing diaeresis 00A8
+spacing double underscore 2017
+spacing grave accent 0060
+spacing macron 00AF
+Spacing Modifier Letters 02B0
+spacing overscore 203E
+spacing tilde 007E
+spacing underscore 005F
+spanish currency 20A7
+SPARKLE 2747
+SPARKLE, HEAVY 2748
+Specials FFF0
+Specials Area, Compatibility and F900
+SPHERICAL ANGLE 2222
+SQUARE BELOW, COMBINING 033B
+SQUARE BRACKET WITH QUILL, LEFT 2045
+SQUARE BRACKET WITH QUILL, RIGHT 2046
+square bracket, closing 005D
+SQUARE BRACKET, LEFT 005B
+SQUARE BRACKET, LEFT WHITE 301A
+square bracket, opening 005B
+SQUARE BRACKET, RIGHT 005D
+SQUARE BRACKET, RIGHT WHITE 301B
+SQUARE CAP 2293
+SQUARE CUP 2294
+SQUARE FOOT 23CD
+SQUARE IMAGE OF 228F
+SQUARE LOZENGE 2311
+SQUARE ORIGINAL OF 2290
+SQUARE ROOT 221A
+Square Symbols 29C4
+SQUARE, BLACK MEDIUM 25FC
+SQUARE, BLACK MEDIUM SMALL 25FE
+SQUARE, COMBINING ENCLOSING 20DE
+SQUARE, VIEWDATA 2317
+squared 00B2
+SQUARED DOT OPERATOR 22A1
+Squared Japanese Katakana Words 3300
+Squared Latin Abbreviations 3371
+SQUARED MINUS 229F
+SQUARED PLUS 229E
+SQUARED TIMES 22A0
+Squares 25A0
+Squares 2B1A
+SQUAT REVERSED ESH, LATIN SMALL LETTER 0285
+srak ah, khmer 17C7
+srak am, khmer 17C6
+srog med, tibetan 0F84
+st. andrew's cross 2613
+STAFF OF AESCULAPIUS 2695
+STAFF OF HERMES 269A
+star 002A
+STAR AND CRESCENT 262A
+Star Dingbats 2726
+STAR EQUALS 225B
+STAR OF DAVID 2721
+STAR OPERATOR 22C6
+STAR, ARABIC FIVE POINTED 066D
+STAR, BLACK 2605
+STAR, WHITE 2606
+starburst 273A
+Stars 2721
+START OF GUARDED AREA 0096
+START OF HEADING 0001
+START OF HEADING, SYMBOL FOR 2401
+START OF SELECTED AREA 0086
+START OF STRING 0098
+START OF TEXT 0002
+START OF TEXT, SYMBOL FOR 2402
+statement is true 22A8
+sterling, pound 00A3
+stile, apl 2223
+straight epsilon 03F5
+straight epsilon, reversed 03F6
+STRAIGHTNESS 23E4
+stress mark 0301
+STRETCHED C, LATIN LETTER 0297
+STRICTLY EQUIVALENT TO 2263
+STRING TERMINATOR 009C
+STRING, DEVICE CONTROL 0090
+STRING, START OF 0098
+STROKE OVERLAY, COMBINING DOUBLE VERTICAL 20E6
+STROKE OVERLAY, COMBINING LONG 0336
+STROKE OVERLAY, COMBINING SHORT 0335
+STROKE, LATIN CAPITAL LETTER O WITH 00D8
+STROKE, LATIN SMALL LETTER O WITH 00F8
+Strokes, CJK 31C0
+SUBGROUP OF, NORMAL 22B2
+Subgroup Signs, Normal 22EA
+SUBGROUP, CONTAINS AS NORMAL 22B3
+Subjoined Consonants, Tibetan 0F90
+Subscript Digits 2080
+subscript, greek iota 0345
+Subscripts 2080
+Subset and Superset Relations 2ABD
+SUBSET OF 2282
+SUBSET OF, NOT A 2284
+Subset Signs, Superset and 2282
+SUBSET, DOUBLE 22D0
+SUBSTITUTE 001A
+SUBSTITUTE FORM TWO, SYMBOL FOR 2426
+SUBSTITUTE, SYMBOL FOR 241A
+Subtending Marks, Arabic 0600
+subtraction, bag 2A41
+subtraction, saturating 2238
+SUCCEEDS 227B
+SUCCEEDS UNDER RELATION 22B1
+SUCCEEDS, DOUBLE 2ABC
+such that 220B
+such that 2223
+Suits, Playing Card 2660
+sum or positive difference 2A26
+sum, direct 2295
+sum, positive difference or 2A24
+summation sign 2211
+Summation Sign Parts 23B2
+SUMMATION, DOUBLE-STRUCK N-ARY 2140
+SUMMATION, N-ARY 2211
+Summations and Integrals 2A0A
+SUN 2609
+SUN WITH RAYS, BLACK 2600
+SUN WITH RAYS, WHITE 263C
+Sundanese 1B80
+sunna, telugu 0C02
+Superscript Digits 2070
+Superscript Letter Diacritics, Latin Medieval 1DD3
+Superscript Letter Diacritics, Medieval 0363
+Superscript Modifier Letters, Latin 02B0
+SUPERSCRIPT ONE 00B9
+SUPERSCRIPT THREE 00B3
+SUPERSCRIPT TWO 00B2
+SUPERSCRIPT ZERO 2070
+Superscripts 2070
+Superset and Subset Signs 2282
+SUPERSET OF 2283
+SUPERSET OF, NOT A 2285
+Superset Relations, Subset and 2ABD
+SUPERSET, DOUBLE 22D1
+Supplemental Arrows-B 2900
+Supplemental Mathematical Operators 2A00
+Supplemental Punctuation 2E00
+Supplementary CJK Ideographs Area 20000
+Supplementary General Scripts Area 10000
+Supplementary Private Use Area-A F0000
+Supplementary Private Use Area-B 100000
+SURFACE INTEGRAL 222F
+surjection, finite 2901
+surjection, partial 2900
+surjection, total 21A0
+surjective injection 2917
+surjective injection, finite 2918
+Surrogates Area D800
+Surrogates, High D800
+Surrogates, Low DC00
+Suzhou Numerals 3021
+SWASH TAIL, LATIN SMALL LETTER S WITH 023F
+SWASH TAIL, LATIN SMALL LETTER Z WITH 0240
+swedish grave accent 02DF
+SWORDS, CROSSED 2694
+SWUNG DASH 2053
+Syllabary, Cypriot 10800
+Syllabary, Linear B 10000
+SYLLABICS FULL STOP, CANADIAN 166E
+Syllabics Punctuation, Canadian 166D
+Syllabics, Unified Canadian Aboriginal 1400
+Syllables, Cherokee 13A0
+Syllables, Circled Korean Hangul 326E
+Syllables, Ethiopic 1200
+Syllables, Korean Hangul AC00
+Syllables, Parenthesized Korean Hangul 320E
+Syllables, Yi A000
+Syloti Nagri A800
+Symbol Variants, Fullwidth FFE0
+Symbol Variants, Halfwidth FFE8
+Symbols and Punctuation, CJK 3000
+Symbols Area 2000
+Symbols Area, CJK Phonetics and 2E80
+Symbols for Days, Ideographic Telegraph 33E0
+Symbols for Divination, Khmer Numeric 17F0
+Symbols for Hours, Ideographic Telegraph 3358
+Symbols for Months, Ideographic Telegraph 32C0
+Symbols, Ancient Greek Textual 2E0E
+Symbols, APL Functional 2336
+Symbols, ASCII Punctuation and 0020
+Symbols, Astrological 263D
+Symbols, Balinese Musical 1B61
+Symbols, Basic Musical 2669
+Symbols, Bowtie 29D1
+Symbols, Byzantine Musical 1D000
+Symbols, Chess 2654
+Symbols, Circle 29B5
+Symbols, Combining Diacritical Marks for 20D0
+Symbols, Currency 20A0
+Symbols, Dentistry Notation 23BE
+Symbols, Diacritical Marks for 20D0
+Symbols, Dictionary and Map 2690
+Symbols, Drafting 232D
+Symbols, Electrotechnical 238D
+Symbols, Error Bar 29EE
+Symbols, Gender 26A2
+Symbols, Genealogical 26AD
+Symbols, Greek Mathematical 1D6A8
+Symbols, Hebrew Letterlike Mathematical 2135
+Symbols, I Ching / Yijing Hexagram 4DC0
+Symbols, I Ching / Yijing Monogram and Digram 268A
+Symbols, I Ching / Yijing Trigram 2630
+Symbols, Japanese Chess 2616
+Symbols, Keyboard 21E6
+Symbols, Keyboard 2324
+Symbols, Keyboard 2380
+Symbols, Keyboard 2396
+Symbols, Khmer 19E0
+Symbols, Latin-1 Punctuation and 00A0
+Symbols, Letterlike 2100
+Symbols, Mathematical 27C0
+Symbols, Mathematical 2980
+Symbols, Mathematical Alphanumeric 1D400
+Symbols, Mathematical Digits 1D7CE
+Symbols, Metrical 23D1
+Symbols, Miscellaneous 2600
+Symbols, Musical 1D100
+Symbols, New Testament Editorial 2E00
+Symbols, Planet 263F
+Symbols, Plastics Recycling 2673
+Symbols, Playing Card 2660
+Symbols, Pointing Hand 261A
+Symbols, Polygonal 2B12
+Symbols, Recycling 2672
+Symbols, Religious and Political 2625
+Symbols, Square 29C4
+Symbols, Tai Xuan Jing 1D300
+Symbols, Tamil 0BF3
+Symbols, Tibetan 0FC4
+Symbols, Triangle 29CA
+Symbols, Weather and Astrological 2600
+Symbols, Yijing / I Ching Hexagram 4DC0
+Symbols, Yijing / I Ching Monogram and Digram 268A
+Symbols, Yijing / I Ching Trigram 2630
+Symbols, Zodiacal 2648
+Symbols-A, Miscellaneous Mathematical 27C0
+Symbols-B, Miscellaneous Mathematical 2980
+symmetric difference 2206
+symmetric difference 2238
+symmetric difference 2296
+SYMMETRY 232F
+SYNCHRONOUS IDLE 0016
+SYNCHRONOUS IDLE, SYMBOL FOR 2416
+Syriac 0700
+SYRIAC CROSS, EAST 2671
+SYRIAC CROSS, WEST 2670
+Syriac Letters 0710
+Syriac Punctuation and Signs 0700
+syriac sam 070F
+T WITH CARON, LATIN SMALL LETTER 0165
+T WITH CEDILLA, LATIN SMALL LETTER 0163
+T WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER 1E71
+T WITH COMMA BELOW, LATIN SMALL LETTER 021B
+T WITH CURL, LATIN SMALL LETTER 0236
+T WITH DIAERESIS, LATIN SMALL LETTER 1E97
+T WITH DIAGONAL STROKE, LATIN CAPITAL LETTER 023E
+T WITH DOT ABOVE, LATIN SMALL LETTER 1E6B
+T WITH DOT BELOW, LATIN SMALL LETTER 1E6D
+T WITH HOOK, LATIN SMALL LETTER 01AD
+T WITH LINE BELOW, LATIN SMALL LETTER 1E6F
+T WITH PALATAL HOOK, LATIN SMALL LETTER 01AB
+T WITH RETROFLEX HOOK, LATIN CAPITAL LETTER 01AE
+T WITH RETROFLEX HOOK, LATIN SMALL LETTER 0288
+T WITH STROKE, LATIN SMALL LETTER 0167
+T, COMBINING LATIN SMALL LETTER 036D
+T, LATIN LETTER SMALL CAPITAL 1D1B
+T, LATIN SMALL LETTER TURNED 0287
+tab 0009
+tab with shift tab 21B9
+tab, leftward 21E4
+tab, rightward 21E5
+TABULATION SET, CHARACTER 0088
+TABULATION SET, LINE 008A
+TABULATION WITH JUSTIFICATION, CHARACTER 0089
+TABULATION, CHARACTER 0009
+tabulation, horizontal 0009
+TABULATION, LINE 000B
+TABULATION, SYMBOL FOR HORIZONTAL 2409
+TABULATION, SYMBOL FOR VERTICAL 240B
+tabulation, vertical 000B
+TACK BELOW, COMBINING DOWN 031E
+TACK BELOW, COMBINING LEFT 0318
+TACK BELOW, COMBINING RIGHT 0319
+TACK BELOW, COMBINING UP 031D
+TACK, DOWN 22A4
+TACK, LEFT 22A3
+TACK, MODIFIER LETTER UP 02D4
+TACK, RIGHT 22A2
+TACK, UP 22A5
+Tacks and Turnstiles 22A2
+Tacks and Turnstiles 27D8
+Tacks and Turnstiles 2ADE
+Tagalog 1700
+TAGALOG SIGN VIRAMA 1714
+Tagbanwa 1760
+Tags E0000
+Tai Le 1950
+Tai Lue Digits, New 19D0
+Tai Lue, New 1980
+Tai Xuan Jing Symbols 1D300
+Tails, Fish 297C
+tainome japanese bullet 25C9
+TAKE, PRESCRIPTION 211E
+Tamil 0B80
+TAMIL AS ABOVE SIGN 0BF8
+tamil aytham 0B83
+Tamil Consonants 0B95
+TAMIL CREDIT SIGN 0BF7
+TAMIL DAY SIGN 0BF3
+TAMIL DEBIT SIGN 0BF6
+Tamil Dependent Vowel Signs 0BBE
+Tamil Digits 0BE7
+tamil enn 0BFA
+Tamil Independent Vowels 0B85
+tamil maatham 0BF4
+tamil merpadi 0BF8
+TAMIL MONTH SIGN 0BF4
+tamil naal 0BF3
+TAMIL NUMBER SIGN 0BFA
+Tamil Numbers 0BE7
+tamil patru 0BF6
+tamil rupai 0BF9
+TAMIL RUPEE SIGN 0BF9
+TAMIL SIGN VISARGA 0B83
+Tamil Symbols 0BF3
+tamil varavu 0BF7
+tamil varudam 0BF5
+TAMIL YEAR SIGN 0BF5
+TAPE DRIVE 2707
+TAPER, CONICAL 2332
+TATWEEL, ARABIC 0640
+TAURUS 2649
+tautological equivalent 29E6
+tautology 22A8
+tea, cup of 2615
+Technical, Miscellaneous 2300
+Telegraph Symbols for Days, Ideographic 33E0
+Telegraph Symbols for Hours, Ideographic 3358
+Telegraph Symbols for Months, Ideographic 32C0
+TELEPHONE LOCATION SIGN 2706
+TELEPHONE RECORDER 2315
+TELEPHONE SIGN 2121
+TELEPHONE, BLACK 260E
+TELEPHONE, WHITE 260F
+Telugu 0C00
+Telugu Consonants 0C15
+Telugu Dependent Vowel Signs 0C3E
+Telugu Digits 0C66
+Telugu Independent Vowels 0C05
+TELUGU SIGN ANUSVARA 0C02
+telugu sunna 0C02
+TEN THOUSAND SIGN, PER 2031
+tensor product 2297
+Terminal Graphic Characters 23B7
+Terminal Graphic Characters 2596
+TERMINATOR, INTERLINEAR ANNOTATION FFFB
+TERMINATOR, STRING 009C
+TEXT, END OF 0003
+TEXT, START OF 0002
+TEXT, SYMBOL FOR END OF 2403
+TEXT, SYMBOL FOR START OF 2402
+Thaana 0780
+Thai 0E00
+THAI CHARACTER ANGKHANKHU 0E5A
+THAI CHARACTER FONGMAN 0E4F
+THAI CHARACTER KHOMUT 0E5B
+THAI CHARACTER NIKHAHIT 0E4D
+THAI CHARACTER THANTHAKHAT 0E4C
+THAI CHARACTER YAMAKKAN 0E4E
+Thai Consonants 0E01
+THAI CURRENCY SYMBOL BAHT 0E3F
+Thai Digits 0E50
+Thai Marks and Signs 0E48
+Thai Vowels 0E30
+THANTHAKHAT, THAI CHARACTER 0E4C
+THERE DOES NOT EXIST 2204
+THERE EXISTS 2203
+THEREFORE 2234
+THERMODYNAMIC 29E7
+THETA SYMBOL, GREEK 03D1
+theta, script 03D1
+thick space 2004
+THIN SPACE 2009
+third derivative 20DB
+third tone, mandarin chinese 02C7
+Thirds, Fractions 2153
+THORN, LATIN CAPITAL LETTER 00DE
+THORN, LATIN SMALL LETTER 00FE
+THOUSANDS SEPARATOR, ARABIC 066C
+three dot leader 2026
+THREE DOT PUNCTUATION 2056
+THREE DOTS ABOVE, COMBINING 20DB
+THREE QUARTERS, VULGAR FRACTION 00BE
+THREE, SUPERSCRIPT 00B3
+THREE-PER-EM SPACE 2004
+THUNDERSTORM 2608
+Tibetan 0F00
+tibetan anusvara 0F7E
+Tibetan Astrological Signs 0F15
+Tibetan Cantillation Signs 0FC0
+Tibetan Consonants 0F40
+Tibetan Dependent Vowel Signs 0F71
+Tibetan Digits 0F20
+Tibetan Digits Minus Half 0F2A
+Tibetan Head Marks 0F01
+TIBETAN KU RU KHA 0FBE
+TIBETAN KU RU KHA BZHI MIG CAN 0FBF
+TIBETAN MARK DELIMITER TSHEG BSTAR 0F0C
+TIBETAN MARK HALANTA 0F84
+TIBETAN MARK INTERSYLLABIC TSHEG 0F0B
+TIBETAN MARK PALUTA 0F85
+Tibetan Marks and Signs 0F08
+Tibetan Marks and Signs 0F34
+Tibetan Marks and Signs 0F82
+Tibetan Marks and Signs 0FBE
+TIBETAN SIGN RJES SU NGA RO 0F7E
+TIBETAN SIGN RNAM BCAD 0F7F
+tibetan srog med 0F84
+Tibetan Subjoined Consonants 0F90
+TIBETAN SYLLABLE OM 0F00
+Tibetan Symbols 0FC4
+tibetan visarga 0F7F
+Tibetan Vocalic Modification 0F7E
+tie below, ligature 035C
+TIE, CHARACTER 2040
+tie, ligature 0361
+Tifinagh 2D30
+TILDE 007E
+TILDE ABOVE, COMBINING NOT 034A
+TILDE BELOW, COMBINING 0330
+TILDE EQUALS, REVERSED 22CD
+Tilde Mathematical Operators 223B
+TILDE OPERATOR 223C
+TILDE OVERLAY, COMBINING 0334
+tilde, apl 223C
+TILDE, COMBINING 0303
+TILDE, COMBINING DOUBLE 0360
+TILDE, COMBINING VERTICAL 033E
+TILDE, MINUS 2242
+TILDE, NOT 2241
+TILDE, REVERSED 223D
+TILDE, SMALL 02DC
+tilde, spacing 007E
+TILDE, TRIPLE 224B
+Tiles, Domino 1F030
+Tiles, Mahjong 1F000
+TIMES OPERATOR, N-ARY 2A09
+TIMES, CIRCLED 2297
+TIMES, DIVISION 22C7
+TIMES, INVISIBLE 2062
+TIMES, SQUARED 22A0
+TINY 29FE
+TIPPI, GURMUKHI 0A70
+TIRONIAN SIGN ET 204A
+TODO SOFT HYPHEN, MONGOLIAN 1806
+Tone Letters 02E5
+Tone Letters, Modifier A700
+TONE MARK, COMBINING ACUTE 0341
+TONE MARK, COMBINING GRAVE 0340
+Tone Marks for Chinese, Corner A700
+Tone Marks, Contour 1DCB
+Tone Marks, Ideographic 302A
+tone, mandarin chinese fifth or neutral 02D9
+tone, mandarin chinese first 02C9
+tone, mandarin chinese fourth 02CB
+tone, mandarin chinese second 02CA
+tone, mandarin chinese third 02C7
+TONOS, COMBINING GREEK DIALYTIKA 0344
+tonos, greek 0301
+top 22A4
+TOP HALF INTEGRAL 2320
+TORTOISE SHELL BRACKET, LEFT 3014
+TORTOISE SHELL BRACKET, LEFT WHITE 3018
+TORTOISE SHELL BRACKET, RIGHT 3015
+TORTOISE SHELL BRACKET, RIGHT WHITE 3019
+total function 2192
+total injection 21A3
+TOTAL RUNOUT 2330
+total surjection 21A0
+TRADE MARK SIGN 2122
+trade mark sign, registered 00AE
+transfinite cardinal, first 2135
+transfinite cardinal, fourth 2138
+transfinite cardinal, second 2136
+transfinite cardinal, third 2137
+transform, fourier 2131
+TRANSMISSION BLOCK, END OF 0017
+TRANSMISSION BLOCK, SYMBOL FOR END OF 2417
+transmission symbol, end of 2301
+TRANSMISSION, END OF 0004
+TRANSMISSION, SYMBOL FOR END OF 2404
+TRANSMIT STATE, SET 0093
+TRAPEZIUM, WHITE 23E2
+Triangle Symbols 29CA
+TRIANGLE, COMBINING ENCLOSING UPWARD POINTING 20E4
+TRIANGLE, RIGHT 22BF
+Triangles 25B2
+TRIANGULAR BULLET 2023
+TRIANGULAR COLON, MODIFIER LETTER 02D0
+TRIANGULAR COLON, MODIFIER LETTER HALF 02D1
+TRICOLON 205D
+Trigram Symbols, Yijing / I Ching 2630
+trine 25B3
+TRIPLE INTEGRAL 222D
+TRIPLE PLUS 29FB
+TRIPLE PRIME 2034
+TRIPLE PRIME, REVERSED 2037
+TRIPLE TILDE 224B
+TRIPLE UNDERDOT, COMBINING 20E8
+TRUE 22A8
+TSHEG BSTAR, TIBETAN MARK DELIMITER 0F0C
+TSHEG, TIBETAN MARK INTERSYLLABIC 0F0B
+TUGRIK SIGN 20AE
+turbofan 274B
+turkish currency 20A4
+turkish lira 00A3
+TURNED A, LATIN SMALL LETTER 0250
+TURNED AE, LATIN SMALL LETTER 1D02
+TURNED ALPHA, LATIN SMALL LETTER 0252
+TURNED AMPERSAND 214B
+TURNED CAPITAL F 2132
+TURNED COMMA ABOVE, COMBINING 0312
+turned comma quotation mark, double 201C
+turned comma quotation mark, single 2018
+TURNED COMMA, MODIFIER LETTER 02BB
+TURNED DELTA, LATIN SMALL LETTER 018D
+turned e, latin capital letter 018E
+TURNED E, LATIN SMALL LETTER 01DD
+TURNED GREEK SMALL LETTER IOTA 2129
+TURNED H WITH FISHHOOK, LATIN SMALL LETTER 02AE
+TURNED H, LATIN SMALL LETTER 0265
+TURNED I, LATIN SMALL LETTER 1D09
+TURNED K, LATIN SMALL LETTER 029E
+TURNED M WITH LONG LEG, LATIN SMALL LETTER 0270
+TURNED M, LATIN CAPITAL LETTER 019C
+TURNED M, LATIN SMALL LETTER 026F
+TURNED M, LATIN SMALL LETTER SIDEWAYS 1D1F
+TURNED NOT SIGN 2319
+TURNED OE, LATIN SMALL LETTER 1D14
+TURNED OPEN E, LATIN SMALL LETTER 1D08
+turned question mark 00BF
+TURNED R WITH HOOK, LATIN SMALL LETTER 027B
+TURNED R WITH LONG LEG, LATIN SMALL LETTER 027A
+TURNED R, LATIN LETTER SMALL CAPITAL 1D1A
+TURNED R, LATIN SMALL LETTER 0279
+TURNED R, MODIFIER LETTER SMALL 02B4
+TURNED SANS-SERIF CAPITAL G 2141
+TURNED SANS-SERIF CAPITAL L 2142
+TURNED SANS-SERIF CAPITAL Y 2144
+TURNED SMALL F 214E
+TURNED T, LATIN SMALL LETTER 0287
+TURNED V, LATIN CAPITAL LETTER 0245
+TURNED V, LATIN SMALL LETTER 028C
+TURNED W, LATIN SMALL LETTER 028D
+TURNED Y, LATIN SMALL LETTER 028E
+turnstile 22A2
+turnstile, reverse 22A3
+Turnstiles, Tacks and 22A2
+Turnstiles, Tacks and 27D8
+Turnstiles, Tacks and 2ADE
+TWO ASTERISKS ALIGNED VERTICALLY 2051
+TWO DOT LEADER 2025
+TWO DOT PUNCTUATION 205A
+TWO, SUPERSCRIPT 00B2
+U BAR, LATIN CAPITAL LETTER 0244
+U BAR, LATIN SMALL LETTER 0289
+U WITH ACUTE, LATIN CAPITAL LETTER 00DA
+U WITH ACUTE, LATIN SMALL LETTER 00FA
+U WITH BREVE, LATIN SMALL LETTER 016D
+U WITH CARON, LATIN SMALL LETTER 01D4
+U WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER 1E77
+U WITH CIRCUMFLEX, LATIN CAPITAL LETTER 00DB
+U WITH CIRCUMFLEX, LATIN SMALL LETTER 00FB
+U WITH DIAERESIS BELOW, LATIN SMALL LETTER 1E73
+U WITH DIAERESIS, LATIN CAPITAL LETTER 00DC
+U WITH DIAERESIS, LATIN SMALL LETTER 00FC
+U WITH DOT BELOW, LATIN SMALL LETTER 1EE5
+U WITH DOUBLE ACUTE, LATIN SMALL LETTER 0171
+U WITH DOUBLE GRAVE, LATIN SMALL LETTER 0215
+U WITH GRAVE, LATIN CAPITAL LETTER 00D9
+U WITH GRAVE, LATIN SMALL LETTER 00F9
+U WITH HOOK ABOVE, LATIN SMALL LETTER 1EE7
+U WITH HORN, LATIN SMALL LETTER 01B0
+U WITH INVERTED BREVE, LATIN SMALL LETTER 0217
+U WITH MACRON, LATIN SMALL LETTER 016B
+U WITH OGONEK, LATIN SMALL LETTER 0173
+U WITH RING ABOVE, LATIN SMALL LETTER 016F
+U WITH TILDE BELOW, LATIN SMALL LETTER 1E75
+U WITH TILDE, LATIN SMALL LETTER 0169
+U, COMBINING LATIN SMALL LETTER 0367
+U, LATIN LETTER SMALL CAPITAL 1D1C
+U, LATIN SMALL LETTER SIDEWAYS 1D1D
+U, LATIN SMALL LETTER SIDEWAYS DIAERESIZED 1D1E
+U, LATIN SUBSCRIPT SMALL LETTER 1D64
+Ugaritic 10380
+ukrainian currency 20B4
+UMBRELLA 2602
+UMBRELLA WITH RAIN DROPS 2614
+umlaut 0308
+UNASPIRATED, MODIFIER LETTER 02ED
+UNDERDOT, COMBINING TRIPLE 20E8
+underline 0332
+UNDERLINE SYMBOL, CONTINUOUS 2381
+UNDERLINE SYMBOL, DISCONTINUOUS 2382
+underline, double 0333
+underscore 0332
+underscore, double 0333
+underscore, spacing 005F
+underscore, spacing double 2017
+Underscores, Overscores and FE49
+UNDERTIE 203F
+UNDERTIE, INVERTED 2054
+UNDO SYMBOL 238C
+Unified Canadian Aboriginal Syllabics 1400
+Unified Ideographs Extension A, CJK 3400
+Unified Ideographs Extension B, CJK 20000
+Unified Ideographs, CJK 4E00
+UNION 222A
+UNION, DOUBLE 22D3
+union, generalized 22C3
+UNION, MULTISET 228E
+UNION, N-ARY 22C3
+Unions, Intersections and 2A40
+unique element 2129
+unit separator 001F
+UNIT SEPARATOR, SYMBOL FOR 241F
+universal quantifier 2200
+UNIVERSAL RECYCLING SYMBOL 2672
+UNMARRIED PARTNERSHIP SYMBOL 26AF
+UP ARROWHEAD 2303
+UP POINTING INDEX, WHITE 261D
+UP RIGHT DIAGONAL ELLIPSIS 22F0
+UP TACK 22A5
+UP TACK BELOW, COMBINING 031D
+UP TACK, MODIFIER LETTER 02D4
+UP, CLOSE 2050
+up, fast cursor 219F
+up, page 21DE
+UPA Modifiers 02EF
+UPPER BLADE SCISSORS 2701
+upper integral 2A1B
+UPPER RIGHT PENCIL 2710
+Uppercase Alphabet, Latin 0041
+UPSILON, LATIN CAPITAL LETTER 01B1
+UPSILON, LATIN SMALL LETTER 028A
+upstile, apl 2308
+UPWARD POINTING TRIANGLE, COMBINING ENCLOSING 20E4
+UPWARDS ARROW 2191
+UPWARDS ARROW BELOW, COMBINING 034E
+Uralic Phonetic Alphabet, Diacritics for 0350
+URANUS 2645
+urdu paragraph separator 203B
+URN, FUNERAL 26B1
+v above 030C
+V WITH DOT BELOW, LATIN SMALL LETTER 1E7F
+V WITH HOOK, LATIN CAPITAL LETTER 01B2
+V WITH HOOK, LATIN SMALL LETTER 028B
+V WITH TILDE, LATIN SMALL LETTER 1E7D
+V, COMBINING LATIN SMALL LETTER 036E
+v, latin capital letter script 01B2
+V, LATIN CAPITAL LETTER TURNED 0245
+V, LATIN LETTER SMALL CAPITAL 1D20
+v, latin small letter script 028B
+V, LATIN SMALL LETTER TURNED 028C
+V, LATIN SUBSCRIPT SMALL LETTER 1D65
+Vai A500
+valentine 2665
+valid 22A8
+varavu, tamil 0BF7
+varia, greek 0300
+VARIATION INDICATOR, IDEOGRAPHIC 303E
+VARIATION SELECTOR ONE, MONGOLIAN FREE 180B
+VARIATION SELECTOR THREE, MONGOLIAN FREE 180D
+VARIATION SELECTOR TWO, MONGOLIAN FREE 180C
+VARIATION SELECTOR-1 FE00
+Variation Selectors FE00
+Variation Selectors Supplement E0100
+varies with 223C
+varudam, tamil 0BF5
+vector 20D1
+vector 20D7
+VECTOR OR CROSS PRODUCT 2A2F
+vector pointing into page 2295
+vector pointing into page 2297
+vector pointing out of page 2299
+vee 2228
+venus 2640
+VERSICLE 2123
+vertical bar 007C
+VERTICAL BAR DELIMITER, TRIPLE 2980
+Vertical Bar Dingbats 2758
+vertical bar, broken 00A6
+VERTICAL BAR, N-ARY WHITE 2AFF
+VERTICAL BAR, WHITE 2AFE
+vertical bowtie 29D6
+Vertical Brackets 23B4
+VERTICAL ELLIPSIS 22EE
+Vertical Form Variants FE30
+VERTICAL FOUR DOTS 205E
+VERTICAL IDEOGRAPHIC ITERATION MARK 303B
+VERTICAL LINE 007C
+VERTICAL LINE ABOVE, COMBINING 030D
+VERTICAL LINE ABOVE, COMBINING DOUBLE 030E
+VERTICAL LINE BELOW, COMBINING 0329
+VERTICAL LINE BELOW, COMBINING DOUBLE 0348
+Vertical Line Operators 2AEE
+VERTICAL LINE OVERLAY, COMBINING LONG 20D2
+VERTICAL LINE OVERLAY, COMBINING SHORT 20D3
+VERTICAL LINE WITH MIDDLE DOT 237F
+VERTICAL LINE, DOUBLE 2016
+VERTICAL LINE, MODIFIER LETTER 02C8
+VERTICAL LINE, MODIFIER LETTER LOW 02CC
+Vertical Lines 2223
+VERTICAL STROKE OVERLAY, COMBINING DOUBLE 20E6
+vertical tabulation 000B
+VERTICAL TABULATION, SYMBOL FOR 240B
+Vertical Text, Bracket Variants for 23DC
+Vertical Text, Double Punctuation for 2047
+VERTICAL TILDE, COMBINING 033E
+Vertical Variants, Glyphs for FE10
+Vertical Variants, Glyphs for FE30
+vertsaket, armenian 0589
+VERY MUCH GREATER-THAN 22D9
+VERY MUCH LESS-THAN 22D8
+VICTORY HAND 270C
+vietnamese currency 20AB
+VIEWDATA SQUARE 2317
+vinculum 0305
+viram, devanagari deergh 0965
+viram, devanagari purna 0964
+VIRAMA, DEVANAGARI SIGN 094D
+VIRAMA, MALAYALAM SIGN 0D4D
+VIRAMA, MYANMAR SIGN 1039
+virama, sinhala 0DCA
+VIRAMA, TAGALOG SIGN 1714
+VIRGO 264D
+virgule 002F
+VISARGA, DEVANAGARI SIGN 0903
+visarga, khmer 17C7
+VISARGA, TAMIL SIGN 0B83
+visarga, tibetan 0F7F
+VOICED FRICATIVE, LATIN LETTER PHARYNGEAL 0295
+VOICED ITERATION MARK, HIRAGANA 309E
+VOICED ITERATION MARK, KATAKANA 30FE
+VOICING, MODIFIER LETTER 02EC
+VOLTAGE SIGN, HIGH 26A1
+VOLUME INTEGRAL 2230
+vrachy, greek 0306
+vs1 FE00
+vs17 E0100
+vt 000B
+VULGAR FRACTION ONE HALF 00BD
+VULGAR FRACTION ONE QUARTER 00BC
+VULGAR FRACTION THREE QUARTERS 00BE
+Vulgar Fractions 2153
+W WITH ACUTE, LATIN SMALL LETTER 1E83
+W WITH CIRCUMFLEX, LATIN SMALL LETTER 0175
+W WITH DIAERESIS, LATIN SMALL LETTER 1E85
+W WITH DOT ABOVE, LATIN SMALL LETTER 1E87
+W WITH DOT BELOW, LATIN SMALL LETTER 1E89
+W WITH GRAVE, LATIN SMALL LETTER 1E81
+W WITH RING ABOVE, LATIN SMALL LETTER 1E98
+W, LATIN LETTER SMALL CAPITAL 1D21
+W, LATIN SMALL LETTER TURNED 028D
+W, MODIFIER LETTER SMALL 02B7
+WAITING, MESSAGE 0095
+WARNING SIGN 26A0
+Warning Signs 2620
+WATCH 231A
+WAVE DASH 301C
+WAVE, SINE 223F
+WAVY DASH 3030
+WAVY LINE 2307
+WAVY LOW LINE FE4F
+WAVY OVERLINE FE4B
+WAVY OVERLINE, DOUBLE FE4C
+Weather and Astrological Symbols 2600
+weather, clear 2600
+weather, cloudy 2601
+weather, rainy 2602
+weather, showery 2614
+weather, snowy 2603
+wedge 028C
+wedge 2227
+weierstrass elliptic function 2118
+WEST SYRIAC CROSS 2670
+WHEEL OF DHARMA 2638
+WHEELCHAIR SYMBOL 267F
+WHITE BULLET 25E6
+WHITE CIRCLE 25CB
+WHITE CIRCLE, MEDIUM 26AA
+WHITE CIRCLE, MEDIUM SMALL 26AC
+WHITE CIRCLE, SHADOWED 274D
+WHITE CORNER BRACKET, LEFT 300E
+WHITE CORNER BRACKET, RIGHT 300F
+WHITE CURLY BRACKET, LEFT 2983
+WHITE CURLY BRACKET, RIGHT 2984
+WHITE DOWN POINTING INDEX 261F
+WHITE FLAG 2690
+white framus 29D6
+WHITE FROWNING FACE 2639
+WHITE LEFT POINTING INDEX 261C
+WHITE LENTICULAR BRACKET, LEFT 3016
+WHITE LENTICULAR BRACKET, RIGHT 3017
+WHITE NIB 2711
+White on Black Circled Numbers 24EB
+WHITE PARENTHESIS, LEFT 2985
+WHITE PARENTHESIS, RIGHT 2986
+WHITE RIGHT POINTING INDEX 261E
+WHITE SCISSORS 2704
+WHITE SESAME DOT FE46
+WHITE SHOGI PIECE 2616
+WHITE SMILING FACE 263A
+WHITE SQUARE BRACKET, LEFT 301A
+WHITE SQUARE BRACKET, RIGHT 301B
+WHITE STAR 2606
+WHITE SUN WITH RAYS 263C
+WHITE TELEPHONE 260F
+WHITE TORTOISE SHELL BRACKET, LEFT 3018
+WHITE TORTOISE SHELL BRACKET, RIGHT 3019
+WHITE TRAPEZIUM 23E2
+WHITE UP POINTING INDEX 261D
+WHITE VERTICAL BAR 2AFE
+WHITE VERTICAL BAR, N-ARY 2AFF
+WIDE BRIDGE ABOVE, COMBINING 20E9
+Wiggly Fences 29D8
+wj 2060
+WON SIGN 20A9
+WORD JOINER 2060
+Word Separators, Aegean 10100
+Words, Squared Katakana 3300
+WORDSPACE, ETHIOPIC 1361
+working day symbol 2692
+WREATH PRODUCT 2240
+WRITING HAND 270D
+WYNN, LATIN CAPITAL LETTER 01F7
+WYNN, LATIN LETTER 01BF
+X ABOVE, COMBINING 033D
+X BELOW, COMBINING 0353
+X IN A RECTANGLE BOX 2327
+X WITH DIAERESIS, LATIN SMALL LETTER 1E8D
+X WITH DOT ABOVE, LATIN SMALL LETTER 1E8B
+X, BALLOT 2717
+X, BALLOT BOX WITH 2612
+X, COMBINING LATIN SMALL LETTER 036F
+X, HEAVY BALLOT 2718
+X, HEAVY MULTIPLICATION 2716
+X, MODIFIER LETTER SMALL 02E3
+X, MULTIPLICATION 2715
+XOR 22BB
+Y WITH ACUTE, LATIN CAPITAL LETTER 00DD
+Y WITH ACUTE, LATIN SMALL LETTER 00FD
+Y WITH CIRCUMFLEX, LATIN SMALL LETTER 0177
+Y WITH DIAERESIS, LATIN CAPITAL LETTER 0178
+Y WITH DIAERESIS, LATIN SMALL LETTER 00FF
+Y WITH DOT ABOVE, LATIN SMALL LETTER 1E8F
+Y WITH DOT BELOW, LATIN SMALL LETTER 1EF5
+Y WITH GRAVE, LATIN SMALL LETTER 1EF3
+Y WITH HOOK ABOVE, LATIN SMALL LETTER 1EF7
+Y WITH HOOK, LATIN SMALL LETTER 01B4
+Y WITH MACRON, LATIN SMALL LETTER 0233
+Y WITH RING ABOVE, LATIN SMALL LETTER 1E99
+Y WITH STROKE, LATIN CAPITAL LETTER 024E
+Y WITH STROKE, LATIN SMALL LETTER 024F
+Y WITH TILDE, LATIN SMALL LETTER 1EF9
+Y, LATIN LETTER SMALL CAPITAL 028F
+Y, LATIN SMALL LETTER TURNED 028E
+Y, MODIFIER LETTER SMALL 02B8
+Y, TURNED SANS-SERIF CAPITAL 2144
+YAMAKKAN, THAI CHARACTER 0E4E
+YEAR SIGN, TAMIL 0BF5
+YEN SIGN 00A5
+yentamna, armenian 058A
+Yi Radicals A490
+Yi Syllables A000
+Yiddish Digraphs 05F0
+yield, does not 22A3
+yields 22A2
+Yijing / I Ching Hexagram Symbols 4DC0
+Yijing / I Ching Monogram and Digram Symbols 268A
+Yijing / I Ching Trigram Symbols 2630
+YIN YANG 262F
+YOGH, LATIN SMALL LETTER 021D
+YPOGEGRAMMENI, COMBINING GREEK 0345
+YR, LATIN LETTER 01A6
+yuan sign 00A5
+z bar, latin small letter 01B6
+Z NOTATION BAG MEMBERSHIP 22FF
+Z NOTATION SPOT 2981
+Z NOTATION TYPE COLON 2982
+Z WITH ACUTE, LATIN SMALL LETTER 017A
+Z WITH CARON, LATIN SMALL LETTER 017E
+Z WITH CIRCUMFLEX, LATIN SMALL LETTER 1E91
+Z WITH CURL, LATIN SMALL LETTER 0291
+Z WITH DOT ABOVE, LATIN SMALL LETTER 017C
+Z WITH DOT BELOW, LATIN SMALL LETTER 1E93
+Z WITH HOOK, LATIN SMALL LETTER 0225
+Z WITH LINE BELOW, LATIN SMALL LETTER 1E95
+Z WITH RETROFLEX HOOK, LATIN SMALL LETTER 0290
+Z WITH STROKE, LATIN SMALL LETTER 01B6
+Z WITH SWASH TAIL, LATIN SMALL LETTER 0240
+Z, BLACK-LETTER CAPITAL 2128
+Z, DOUBLE-STRUCK CAPITAL 2124
+Z, LATIN LETTER SMALL CAPITAL 1D22
+Zapf Dingbats Series 100, ITC 2700
+ZERO WIDTH JOINER 200D
+ZERO WIDTH NO-BREAK SPACE FEFF
+ZERO WIDTH NON-JOINER 200C
+ZERO WIDTH SPACE 200B
+ZERO, CIRCLED DIGIT 24EA
+ZERO, IDEOGRAPHIC NUMBER 3007
+ZERO, SUPERSCRIPT 2070
+ZIGZAG ABOVE, COMBINING 035B
+Zodiacal Symbols 2648
+zwj 200D
+zwnbsp FEFF
+zwnj 200C
+zwsp 200B
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/Jamo.txt b/Master/tlpkg/tlperl.straw/lib/unicore/Jamo.txt
new file mode 100755
index 00000000000..1fde508fbe4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/Jamo.txt
@@ -0,0 +1,92 @@
+# Jamo-5.1.0.txt
+# Date: 2008-03-20, 17:59:00 PDT [KW]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# This file defines the Jamo Short Name property.
+#
+# See Section 3.12 of The Unicode Standard, Version 5.0
+# for more information.
+#
+# Each line contains two fields, separated by a semicolon.
+#
+# The first field gives the code point, in 4-digit hexadecimal
+# form, of a combining jamo character that participates in
+# the algorithmic determination Hangul syllable character names.
+# The second field gives the Jamo Short Name as a one-, two-,
+# or three-character ASCII string (or in one case, for U+110B,
+# the null string).
+#
+# #############################################################
+
+1100; G # HANGUL CHOSEONG KIYEOK
+1101; GG # HANGUL CHOSEONG SSANGKIYEOK
+1102; N # HANGUL CHOSEONG NIEUN
+1103; D # HANGUL CHOSEONG TIKEUT
+1104; DD # HANGUL CHOSEONG SSANGTIKEUT
+1105; R # HANGUL CHOSEONG RIEUL
+1106; M # HANGUL CHOSEONG MIEUM
+1107; B # HANGUL CHOSEONG PIEUP
+1108; BB # HANGUL CHOSEONG SSANGPIEUP
+1109; S # HANGUL CHOSEONG SIOS
+110A; SS # HANGUL CHOSEONG SSANGSIOS
+110B; # HANGUL CHOSEONG IEUNG
+110C; J # HANGUL CHOSEONG CIEUC
+110D; JJ # HANGUL CHOSEONG SSANGCIEUC
+110E; C # HANGUL CHOSEONG CHIEUCH
+110F; K # HANGUL CHOSEONG KHIEUKH
+1110; T # HANGUL CHOSEONG THIEUTH
+1111; P # HANGUL CHOSEONG PHIEUPH
+1112; H # HANGUL CHOSEONG HIEUH
+1161; A # HANGUL JUNGSEONG A
+1162; AE # HANGUL JUNGSEONG AE
+1163; YA # HANGUL JUNGSEONG YA
+1164; YAE # HANGUL JUNGSEONG YAE
+1165; EO # HANGUL JUNGSEONG EO
+1166; E # HANGUL JUNGSEONG E
+1167; YEO # HANGUL JUNGSEONG YEO
+1168; YE # HANGUL JUNGSEONG YE
+1169; O # HANGUL JUNGSEONG O
+116A; WA # HANGUL JUNGSEONG WA
+116B; WAE # HANGUL JUNGSEONG WAE
+116C; OE # HANGUL JUNGSEONG OE
+116D; YO # HANGUL JUNGSEONG YO
+116E; U # HANGUL JUNGSEONG U
+116F; WEO # HANGUL JUNGSEONG WEO
+1170; WE # HANGUL JUNGSEONG WE
+1171; WI # HANGUL JUNGSEONG WI
+1172; YU # HANGUL JUNGSEONG YU
+1173; EU # HANGUL JUNGSEONG EU
+1174; YI # HANGUL JUNGSEONG YI
+1175; I # HANGUL JUNGSEONG I
+11A8; G # HANGUL JONGSEONG KIYEOK
+11A9; GG # HANGUL JONGSEONG SSANGKIYEOK
+11AA; GS # HANGUL JONGSEONG KIYEOK-SIOS
+11AB; N # HANGUL JONGSEONG NIEUN
+11AC; NJ # HANGUL JONGSEONG NIEUN-CIEUC
+11AD; NH # HANGUL JONGSEONG NIEUN-HIEUH
+11AE; D # HANGUL JONGSEONG TIKEUT
+11AF; L # HANGUL JONGSEONG RIEUL
+11B0; LG # HANGUL JONGSEONG RIEUL-KIYEOK
+11B1; LM # HANGUL JONGSEONG RIEUL-MIEUM
+11B2; LB # HANGUL JONGSEONG RIEUL-PIEUP
+11B3; LS # HANGUL JONGSEONG RIEUL-SIOS
+11B4; LT # HANGUL JONGSEONG RIEUL-THIEUTH
+11B5; LP # HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6; LH # HANGUL JONGSEONG RIEUL-HIEUH
+11B7; M # HANGUL JONGSEONG MIEUM
+11B8; B # HANGUL JONGSEONG PIEUP
+11B9; BS # HANGUL JONGSEONG PIEUP-SIOS
+11BA; S # HANGUL JONGSEONG SIOS
+11BB; SS # HANGUL JONGSEONG SSANGSIOS
+11BC; NG # HANGUL JONGSEONG IEUNG
+11BD; J # HANGUL JONGSEONG CIEUC
+11BE; C # HANGUL JONGSEONG CHIEUCH
+11BF; K # HANGUL JONGSEONG KHIEUKH
+11C0; T # HANGUL JONGSEONG THIEUTH
+11C1; P # HANGUL JONGSEONG PHIEUPH
+11C2; H # HANGUL JONGSEONG HIEUH
+
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/LineBreak.txt b/Master/tlpkg/tlperl.straw/lib/unicore/LineBreak.txt
new file mode 100755
index 00000000000..d4eb2521cce
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/LineBreak.txt
@@ -0,0 +1,20158 @@
+# LineBreak-5.1.0.txt
+# Date: 2008-03-20, 17:43:00 PST [KW]
+#
+# Line Break Properties
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+# It contains both normative and informative data.
+#
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# The format is two fields separated by a semicolon.
+# Field 0: Unicode value
+# Field 1: LineBreak property, consisting of one of the following values:
+# Normative:
+# "BK", "CR", "LF", "CM", "SG", "GL", "CB", "SP", "ZW",
+# "NL", "WJ", "JL", "JV", "JT", "H2", "H3"
+# Informative:
+# "XX", "OP", "CL", "QU", "NS", "EX", "SY",
+# "IS", "PR", "PO", "NU", "AL", "ID", "IN", "HY",
+# "BB", "BA", "SA", "AI", "B2"
+# - All code points, assigned and unassigned, that are not listed
+# explicitly are given the value "XX".
+# - Characters ranges are specified as for other property files in
+# the Unicode Character Database.
+#
+# The Unicode name of each character is provided in a comment for help
+# in identifying the characters.
+#
+# See UAX #14: Line Breaking Properties, for more information
+#
+# @missing: 0000..10FFFF; XX
+0000;CM # <control>
+0001;CM # <control>
+0002;CM # <control>
+0003;CM # <control>
+0004;CM # <control>
+0005;CM # <control>
+0006;CM # <control>
+0007;CM # <control>
+0008;CM # <control>
+0009;BA # <control>
+000A;LF # <control>
+000B;BK # <control>
+000C;BK # <control>
+000D;CR # <control>
+000E;CM # <control>
+000F;CM # <control>
+0010;CM # <control>
+0011;CM # <control>
+0012;CM # <control>
+0013;CM # <control>
+0014;CM # <control>
+0015;CM # <control>
+0016;CM # <control>
+0017;CM # <control>
+0018;CM # <control>
+0019;CM # <control>
+001A;CM # <control>
+001B;CM # <control>
+001C;CM # <control>
+001D;CM # <control>
+001E;CM # <control>
+001F;CM # <control>
+0020;SP # SPACE
+0021;EX # EXCLAMATION MARK
+0022;QU # QUOTATION MARK
+0023;AL # NUMBER SIGN
+0024;PR # DOLLAR SIGN
+0025;PO # PERCENT SIGN
+0026;AL # AMPERSAND
+0027;QU # APOSTROPHE
+0028;OP # LEFT PARENTHESIS
+0029;CL # RIGHT PARENTHESIS
+002A;AL # ASTERISK
+002B;PR # PLUS SIGN
+002C;IS # COMMA
+002D;HY # HYPHEN-MINUS
+002E;IS # FULL STOP
+002F;SY # SOLIDUS
+0030;NU # DIGIT ZERO
+0031;NU # DIGIT ONE
+0032;NU # DIGIT TWO
+0033;NU # DIGIT THREE
+0034;NU # DIGIT FOUR
+0035;NU # DIGIT FIVE
+0036;NU # DIGIT SIX
+0037;NU # DIGIT SEVEN
+0038;NU # DIGIT EIGHT
+0039;NU # DIGIT NINE
+003A;IS # COLON
+003B;IS # SEMICOLON
+003C;AL # LESS-THAN SIGN
+003D;AL # EQUALS SIGN
+003E;AL # GREATER-THAN SIGN
+003F;EX # QUESTION MARK
+0040;AL # COMMERCIAL AT
+0041;AL # LATIN CAPITAL LETTER A
+0042;AL # LATIN CAPITAL LETTER B
+0043;AL # LATIN CAPITAL LETTER C
+0044;AL # LATIN CAPITAL LETTER D
+0045;AL # LATIN CAPITAL LETTER E
+0046;AL # LATIN CAPITAL LETTER F
+0047;AL # LATIN CAPITAL LETTER G
+0048;AL # LATIN CAPITAL LETTER H
+0049;AL # LATIN CAPITAL LETTER I
+004A;AL # LATIN CAPITAL LETTER J
+004B;AL # LATIN CAPITAL LETTER K
+004C;AL # LATIN CAPITAL LETTER L
+004D;AL # LATIN CAPITAL LETTER M
+004E;AL # LATIN CAPITAL LETTER N
+004F;AL # LATIN CAPITAL LETTER O
+0050;AL # LATIN CAPITAL LETTER P
+0051;AL # LATIN CAPITAL LETTER Q
+0052;AL # LATIN CAPITAL LETTER R
+0053;AL # LATIN CAPITAL LETTER S
+0054;AL # LATIN CAPITAL LETTER T
+0055;AL # LATIN CAPITAL LETTER U
+0056;AL # LATIN CAPITAL LETTER V
+0057;AL # LATIN CAPITAL LETTER W
+0058;AL # LATIN CAPITAL LETTER X
+0059;AL # LATIN CAPITAL LETTER Y
+005A;AL # LATIN CAPITAL LETTER Z
+005B;OP # LEFT SQUARE BRACKET
+005C;PR # REVERSE SOLIDUS
+005D;CL # RIGHT SQUARE BRACKET
+005E;AL # CIRCUMFLEX ACCENT
+005F;AL # LOW LINE
+0060;AL # GRAVE ACCENT
+0061;AL # LATIN SMALL LETTER A
+0062;AL # LATIN SMALL LETTER B
+0063;AL # LATIN SMALL LETTER C
+0064;AL # LATIN SMALL LETTER D
+0065;AL # LATIN SMALL LETTER E
+0066;AL # LATIN SMALL LETTER F
+0067;AL # LATIN SMALL LETTER G
+0068;AL # LATIN SMALL LETTER H
+0069;AL # LATIN SMALL LETTER I
+006A;AL # LATIN SMALL LETTER J
+006B;AL # LATIN SMALL LETTER K
+006C;AL # LATIN SMALL LETTER L
+006D;AL # LATIN SMALL LETTER M
+006E;AL # LATIN SMALL LETTER N
+006F;AL # LATIN SMALL LETTER O
+0070;AL # LATIN SMALL LETTER P
+0071;AL # LATIN SMALL LETTER Q
+0072;AL # LATIN SMALL LETTER R
+0073;AL # LATIN SMALL LETTER S
+0074;AL # LATIN SMALL LETTER T
+0075;AL # LATIN SMALL LETTER U
+0076;AL # LATIN SMALL LETTER V
+0077;AL # LATIN SMALL LETTER W
+0078;AL # LATIN SMALL LETTER X
+0079;AL # LATIN SMALL LETTER Y
+007A;AL # LATIN SMALL LETTER Z
+007B;OP # LEFT CURLY BRACKET
+007C;BA # VERTICAL LINE
+007D;CL # RIGHT CURLY BRACKET
+007E;AL # TILDE
+007F;CM # <control>
+0080;CM # <control>
+0081;CM # <control>
+0082;CM # <control>
+0083;CM # <control>
+0084;CM # <control>
+0085;NL # <control>
+0086;CM # <control>
+0087;CM # <control>
+0088;CM # <control>
+0089;CM # <control>
+008A;CM # <control>
+008B;CM # <control>
+008C;CM # <control>
+008D;CM # <control>
+008E;CM # <control>
+008F;CM # <control>
+0090;CM # <control>
+0091;CM # <control>
+0092;CM # <control>
+0093;CM # <control>
+0094;CM # <control>
+0095;CM # <control>
+0096;CM # <control>
+0097;CM # <control>
+0098;CM # <control>
+0099;CM # <control>
+009A;CM # <control>
+009B;CM # <control>
+009C;CM # <control>
+009D;CM # <control>
+009E;CM # <control>
+009F;CM # <control>
+00A0;GL # NO-BREAK SPACE
+00A1;OP # INVERTED EXCLAMATION MARK
+00A2;PO # CENT SIGN
+00A3;PR # POUND SIGN
+00A4;PR # CURRENCY SIGN
+00A5;PR # YEN SIGN
+00A6;AL # BROKEN BAR
+00A7;AI # SECTION SIGN
+00A8;AI # DIAERESIS
+00A9;AL # COPYRIGHT SIGN
+00AA;AI # FEMININE ORDINAL INDICATOR
+00AB;QU # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC;AL # NOT SIGN
+00AD;BA # SOFT HYPHEN
+00AE;AL # REGISTERED SIGN
+00AF;AL # MACRON
+00B0;PO # DEGREE SIGN
+00B1;PR # PLUS-MINUS SIGN
+00B2;AI # SUPERSCRIPT TWO
+00B3;AI # SUPERSCRIPT THREE
+00B4;BB # ACUTE ACCENT
+00B5;AL # MICRO SIGN
+00B6;AI # PILCROW SIGN
+00B7;AI # MIDDLE DOT
+00B8;AI # CEDILLA
+00B9;AI # SUPERSCRIPT ONE
+00BA;AI # MASCULINE ORDINAL INDICATOR
+00BB;QU # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC;AI # VULGAR FRACTION ONE QUARTER
+00BD;AI # VULGAR FRACTION ONE HALF
+00BE;AI # VULGAR FRACTION THREE QUARTERS
+00BF;OP # INVERTED QUESTION MARK
+00C0;AL # LATIN CAPITAL LETTER A WITH GRAVE
+00C1;AL # LATIN CAPITAL LETTER A WITH ACUTE
+00C2;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00C3;AL # LATIN CAPITAL LETTER A WITH TILDE
+00C4;AL # LATIN CAPITAL LETTER A WITH DIAERESIS
+00C5;AL # LATIN CAPITAL LETTER A WITH RING ABOVE
+00C6;AL # LATIN CAPITAL LETTER AE
+00C7;AL # LATIN CAPITAL LETTER C WITH CEDILLA
+00C8;AL # LATIN CAPITAL LETTER E WITH GRAVE
+00C9;AL # LATIN CAPITAL LETTER E WITH ACUTE
+00CA;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00CB;AL # LATIN CAPITAL LETTER E WITH DIAERESIS
+00CC;AL # LATIN CAPITAL LETTER I WITH GRAVE
+00CD;AL # LATIN CAPITAL LETTER I WITH ACUTE
+00CE;AL # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00CF;AL # LATIN CAPITAL LETTER I WITH DIAERESIS
+00D0;AL # LATIN CAPITAL LETTER ETH
+00D1;AL # LATIN CAPITAL LETTER N WITH TILDE
+00D2;AL # LATIN CAPITAL LETTER O WITH GRAVE
+00D3;AL # LATIN CAPITAL LETTER O WITH ACUTE
+00D4;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00D5;AL # LATIN CAPITAL LETTER O WITH TILDE
+00D6;AL # LATIN CAPITAL LETTER O WITH DIAERESIS
+00D7;AI # MULTIPLICATION SIGN
+00D8;AL # LATIN CAPITAL LETTER O WITH STROKE
+00D9;AL # LATIN CAPITAL LETTER U WITH GRAVE
+00DA;AL # LATIN CAPITAL LETTER U WITH ACUTE
+00DB;AL # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00DC;AL # LATIN CAPITAL LETTER U WITH DIAERESIS
+00DD;AL # LATIN CAPITAL LETTER Y WITH ACUTE
+00DE;AL # LATIN CAPITAL LETTER THORN
+00DF;AL # LATIN SMALL LETTER SHARP S
+00E0;AL # LATIN SMALL LETTER A WITH GRAVE
+00E1;AL # LATIN SMALL LETTER A WITH ACUTE
+00E2;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX
+00E3;AL # LATIN SMALL LETTER A WITH TILDE
+00E4;AL # LATIN SMALL LETTER A WITH DIAERESIS
+00E5;AL # LATIN SMALL LETTER A WITH RING ABOVE
+00E6;AL # LATIN SMALL LETTER AE
+00E7;AL # LATIN SMALL LETTER C WITH CEDILLA
+00E8;AL # LATIN SMALL LETTER E WITH GRAVE
+00E9;AL # LATIN SMALL LETTER E WITH ACUTE
+00EA;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX
+00EB;AL # LATIN SMALL LETTER E WITH DIAERESIS
+00EC;AL # LATIN SMALL LETTER I WITH GRAVE
+00ED;AL # LATIN SMALL LETTER I WITH ACUTE
+00EE;AL # LATIN SMALL LETTER I WITH CIRCUMFLEX
+00EF;AL # LATIN SMALL LETTER I WITH DIAERESIS
+00F0;AL # LATIN SMALL LETTER ETH
+00F1;AL # LATIN SMALL LETTER N WITH TILDE
+00F2;AL # LATIN SMALL LETTER O WITH GRAVE
+00F3;AL # LATIN SMALL LETTER O WITH ACUTE
+00F4;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX
+00F5;AL # LATIN SMALL LETTER O WITH TILDE
+00F6;AL # LATIN SMALL LETTER O WITH DIAERESIS
+00F7;AI # DIVISION SIGN
+00F8;AL # LATIN SMALL LETTER O WITH STROKE
+00F9;AL # LATIN SMALL LETTER U WITH GRAVE
+00FA;AL # LATIN SMALL LETTER U WITH ACUTE
+00FB;AL # LATIN SMALL LETTER U WITH CIRCUMFLEX
+00FC;AL # LATIN SMALL LETTER U WITH DIAERESIS
+00FD;AL # LATIN SMALL LETTER Y WITH ACUTE
+00FE;AL # LATIN SMALL LETTER THORN
+00FF;AL # LATIN SMALL LETTER Y WITH DIAERESIS
+0100;AL # LATIN CAPITAL LETTER A WITH MACRON
+0101;AL # LATIN SMALL LETTER A WITH MACRON
+0102;AL # LATIN CAPITAL LETTER A WITH BREVE
+0103;AL # LATIN SMALL LETTER A WITH BREVE
+0104;AL # LATIN CAPITAL LETTER A WITH OGONEK
+0105;AL # LATIN SMALL LETTER A WITH OGONEK
+0106;AL # LATIN CAPITAL LETTER C WITH ACUTE
+0107;AL # LATIN SMALL LETTER C WITH ACUTE
+0108;AL # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0109;AL # LATIN SMALL LETTER C WITH CIRCUMFLEX
+010A;AL # LATIN CAPITAL LETTER C WITH DOT ABOVE
+010B;AL # LATIN SMALL LETTER C WITH DOT ABOVE
+010C;AL # LATIN CAPITAL LETTER C WITH CARON
+010D;AL # LATIN SMALL LETTER C WITH CARON
+010E;AL # LATIN CAPITAL LETTER D WITH CARON
+010F;AL # LATIN SMALL LETTER D WITH CARON
+0110;AL # LATIN CAPITAL LETTER D WITH STROKE
+0111;AL # LATIN SMALL LETTER D WITH STROKE
+0112;AL # LATIN CAPITAL LETTER E WITH MACRON
+0113;AL # LATIN SMALL LETTER E WITH MACRON
+0114;AL # LATIN CAPITAL LETTER E WITH BREVE
+0115;AL # LATIN SMALL LETTER E WITH BREVE
+0116;AL # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0117;AL # LATIN SMALL LETTER E WITH DOT ABOVE
+0118;AL # LATIN CAPITAL LETTER E WITH OGONEK
+0119;AL # LATIN SMALL LETTER E WITH OGONEK
+011A;AL # LATIN CAPITAL LETTER E WITH CARON
+011B;AL # LATIN SMALL LETTER E WITH CARON
+011C;AL # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011D;AL # LATIN SMALL LETTER G WITH CIRCUMFLEX
+011E;AL # LATIN CAPITAL LETTER G WITH BREVE
+011F;AL # LATIN SMALL LETTER G WITH BREVE
+0120;AL # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0121;AL # LATIN SMALL LETTER G WITH DOT ABOVE
+0122;AL # LATIN CAPITAL LETTER G WITH CEDILLA
+0123;AL # LATIN SMALL LETTER G WITH CEDILLA
+0124;AL # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0125;AL # LATIN SMALL LETTER H WITH CIRCUMFLEX
+0126;AL # LATIN CAPITAL LETTER H WITH STROKE
+0127;AL # LATIN SMALL LETTER H WITH STROKE
+0128;AL # LATIN CAPITAL LETTER I WITH TILDE
+0129;AL # LATIN SMALL LETTER I WITH TILDE
+012A;AL # LATIN CAPITAL LETTER I WITH MACRON
+012B;AL # LATIN SMALL LETTER I WITH MACRON
+012C;AL # LATIN CAPITAL LETTER I WITH BREVE
+012D;AL # LATIN SMALL LETTER I WITH BREVE
+012E;AL # LATIN CAPITAL LETTER I WITH OGONEK
+012F;AL # LATIN SMALL LETTER I WITH OGONEK
+0130;AL # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0131;AL # LATIN SMALL LETTER DOTLESS I
+0132;AL # LATIN CAPITAL LIGATURE IJ
+0133;AL # LATIN SMALL LIGATURE IJ
+0134;AL # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0135;AL # LATIN SMALL LETTER J WITH CIRCUMFLEX
+0136;AL # LATIN CAPITAL LETTER K WITH CEDILLA
+0137;AL # LATIN SMALL LETTER K WITH CEDILLA
+0138;AL # LATIN SMALL LETTER KRA
+0139;AL # LATIN CAPITAL LETTER L WITH ACUTE
+013A;AL # LATIN SMALL LETTER L WITH ACUTE
+013B;AL # LATIN CAPITAL LETTER L WITH CEDILLA
+013C;AL # LATIN SMALL LETTER L WITH CEDILLA
+013D;AL # LATIN CAPITAL LETTER L WITH CARON
+013E;AL # LATIN SMALL LETTER L WITH CARON
+013F;AL # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0140;AL # LATIN SMALL LETTER L WITH MIDDLE DOT
+0141;AL # LATIN CAPITAL LETTER L WITH STROKE
+0142;AL # LATIN SMALL LETTER L WITH STROKE
+0143;AL # LATIN CAPITAL LETTER N WITH ACUTE
+0144;AL # LATIN SMALL LETTER N WITH ACUTE
+0145;AL # LATIN CAPITAL LETTER N WITH CEDILLA
+0146;AL # LATIN SMALL LETTER N WITH CEDILLA
+0147;AL # LATIN CAPITAL LETTER N WITH CARON
+0148;AL # LATIN SMALL LETTER N WITH CARON
+0149;AL # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014A;AL # LATIN CAPITAL LETTER ENG
+014B;AL # LATIN SMALL LETTER ENG
+014C;AL # LATIN CAPITAL LETTER O WITH MACRON
+014D;AL # LATIN SMALL LETTER O WITH MACRON
+014E;AL # LATIN CAPITAL LETTER O WITH BREVE
+014F;AL # LATIN SMALL LETTER O WITH BREVE
+0150;AL # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0151;AL # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0152;AL # LATIN CAPITAL LIGATURE OE
+0153;AL # LATIN SMALL LIGATURE OE
+0154;AL # LATIN CAPITAL LETTER R WITH ACUTE
+0155;AL # LATIN SMALL LETTER R WITH ACUTE
+0156;AL # LATIN CAPITAL LETTER R WITH CEDILLA
+0157;AL # LATIN SMALL LETTER R WITH CEDILLA
+0158;AL # LATIN CAPITAL LETTER R WITH CARON
+0159;AL # LATIN SMALL LETTER R WITH CARON
+015A;AL # LATIN CAPITAL LETTER S WITH ACUTE
+015B;AL # LATIN SMALL LETTER S WITH ACUTE
+015C;AL # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015D;AL # LATIN SMALL LETTER S WITH CIRCUMFLEX
+015E;AL # LATIN CAPITAL LETTER S WITH CEDILLA
+015F;AL # LATIN SMALL LETTER S WITH CEDILLA
+0160;AL # LATIN CAPITAL LETTER S WITH CARON
+0161;AL # LATIN SMALL LETTER S WITH CARON
+0162;AL # LATIN CAPITAL LETTER T WITH CEDILLA
+0163;AL # LATIN SMALL LETTER T WITH CEDILLA
+0164;AL # LATIN CAPITAL LETTER T WITH CARON
+0165;AL # LATIN SMALL LETTER T WITH CARON
+0166;AL # LATIN CAPITAL LETTER T WITH STROKE
+0167;AL # LATIN SMALL LETTER T WITH STROKE
+0168;AL # LATIN CAPITAL LETTER U WITH TILDE
+0169;AL # LATIN SMALL LETTER U WITH TILDE
+016A;AL # LATIN CAPITAL LETTER U WITH MACRON
+016B;AL # LATIN SMALL LETTER U WITH MACRON
+016C;AL # LATIN CAPITAL LETTER U WITH BREVE
+016D;AL # LATIN SMALL LETTER U WITH BREVE
+016E;AL # LATIN CAPITAL LETTER U WITH RING ABOVE
+016F;AL # LATIN SMALL LETTER U WITH RING ABOVE
+0170;AL # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0171;AL # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0172;AL # LATIN CAPITAL LETTER U WITH OGONEK
+0173;AL # LATIN SMALL LETTER U WITH OGONEK
+0174;AL # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0175;AL # LATIN SMALL LETTER W WITH CIRCUMFLEX
+0176;AL # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0177;AL # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0178;AL # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179;AL # LATIN CAPITAL LETTER Z WITH ACUTE
+017A;AL # LATIN SMALL LETTER Z WITH ACUTE
+017B;AL # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017C;AL # LATIN SMALL LETTER Z WITH DOT ABOVE
+017D;AL # LATIN CAPITAL LETTER Z WITH CARON
+017E;AL # LATIN SMALL LETTER Z WITH CARON
+017F;AL # LATIN SMALL LETTER LONG S
+0180;AL # LATIN SMALL LETTER B WITH STROKE
+0181;AL # LATIN CAPITAL LETTER B WITH HOOK
+0182;AL # LATIN CAPITAL LETTER B WITH TOPBAR
+0183;AL # LATIN SMALL LETTER B WITH TOPBAR
+0184;AL # LATIN CAPITAL LETTER TONE SIX
+0185;AL # LATIN SMALL LETTER TONE SIX
+0186;AL # LATIN CAPITAL LETTER OPEN O
+0187;AL # LATIN CAPITAL LETTER C WITH HOOK
+0188;AL # LATIN SMALL LETTER C WITH HOOK
+0189;AL # LATIN CAPITAL LETTER AFRICAN D
+018A;AL # LATIN CAPITAL LETTER D WITH HOOK
+018B;AL # LATIN CAPITAL LETTER D WITH TOPBAR
+018C;AL # LATIN SMALL LETTER D WITH TOPBAR
+018D;AL # LATIN SMALL LETTER TURNED DELTA
+018E;AL # LATIN CAPITAL LETTER REVERSED E
+018F;AL # LATIN CAPITAL LETTER SCHWA
+0190;AL # LATIN CAPITAL LETTER OPEN E
+0191;AL # LATIN CAPITAL LETTER F WITH HOOK
+0192;AL # LATIN SMALL LETTER F WITH HOOK
+0193;AL # LATIN CAPITAL LETTER G WITH HOOK
+0194;AL # LATIN CAPITAL LETTER GAMMA
+0195;AL # LATIN SMALL LETTER HV
+0196;AL # LATIN CAPITAL LETTER IOTA
+0197;AL # LATIN CAPITAL LETTER I WITH STROKE
+0198;AL # LATIN CAPITAL LETTER K WITH HOOK
+0199;AL # LATIN SMALL LETTER K WITH HOOK
+019A;AL # LATIN SMALL LETTER L WITH BAR
+019B;AL # LATIN SMALL LETTER LAMBDA WITH STROKE
+019C;AL # LATIN CAPITAL LETTER TURNED M
+019D;AL # LATIN CAPITAL LETTER N WITH LEFT HOOK
+019E;AL # LATIN SMALL LETTER N WITH LONG RIGHT LEG
+019F;AL # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01A0;AL # LATIN CAPITAL LETTER O WITH HORN
+01A1;AL # LATIN SMALL LETTER O WITH HORN
+01A2;AL # LATIN CAPITAL LETTER OI
+01A3;AL # LATIN SMALL LETTER OI
+01A4;AL # LATIN CAPITAL LETTER P WITH HOOK
+01A5;AL # LATIN SMALL LETTER P WITH HOOK
+01A6;AL # LATIN LETTER YR
+01A7;AL # LATIN CAPITAL LETTER TONE TWO
+01A8;AL # LATIN SMALL LETTER TONE TWO
+01A9;AL # LATIN CAPITAL LETTER ESH
+01AA;AL # LATIN LETTER REVERSED ESH LOOP
+01AB;AL # LATIN SMALL LETTER T WITH PALATAL HOOK
+01AC;AL # LATIN CAPITAL LETTER T WITH HOOK
+01AD;AL # LATIN SMALL LETTER T WITH HOOK
+01AE;AL # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01AF;AL # LATIN CAPITAL LETTER U WITH HORN
+01B0;AL # LATIN SMALL LETTER U WITH HORN
+01B1;AL # LATIN CAPITAL LETTER UPSILON
+01B2;AL # LATIN CAPITAL LETTER V WITH HOOK
+01B3;AL # LATIN CAPITAL LETTER Y WITH HOOK
+01B4;AL # LATIN SMALL LETTER Y WITH HOOK
+01B5;AL # LATIN CAPITAL LETTER Z WITH STROKE
+01B6;AL # LATIN SMALL LETTER Z WITH STROKE
+01B7;AL # LATIN CAPITAL LETTER EZH
+01B8;AL # LATIN CAPITAL LETTER EZH REVERSED
+01B9;AL # LATIN SMALL LETTER EZH REVERSED
+01BA;AL # LATIN SMALL LETTER EZH WITH TAIL
+01BB;AL # LATIN LETTER TWO WITH STROKE
+01BC;AL # LATIN CAPITAL LETTER TONE FIVE
+01BD;AL # LATIN SMALL LETTER TONE FIVE
+01BE;AL # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+01BF;AL # LATIN LETTER WYNN
+01C0;AL # LATIN LETTER DENTAL CLICK
+01C1;AL # LATIN LETTER LATERAL CLICK
+01C2;AL # LATIN LETTER ALVEOLAR CLICK
+01C3;AL # LATIN LETTER RETROFLEX CLICK
+01C4;AL # LATIN CAPITAL LETTER DZ WITH CARON
+01C5;AL # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C6;AL # LATIN SMALL LETTER DZ WITH CARON
+01C7;AL # LATIN CAPITAL LETTER LJ
+01C8;AL # LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01C9;AL # LATIN SMALL LETTER LJ
+01CA;AL # LATIN CAPITAL LETTER NJ
+01CB;AL # LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CC;AL # LATIN SMALL LETTER NJ
+01CD;AL # LATIN CAPITAL LETTER A WITH CARON
+01CE;AL # LATIN SMALL LETTER A WITH CARON
+01CF;AL # LATIN CAPITAL LETTER I WITH CARON
+01D0;AL # LATIN SMALL LETTER I WITH CARON
+01D1;AL # LATIN CAPITAL LETTER O WITH CARON
+01D2;AL # LATIN SMALL LETTER O WITH CARON
+01D3;AL # LATIN CAPITAL LETTER U WITH CARON
+01D4;AL # LATIN SMALL LETTER U WITH CARON
+01D5;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D6;AL # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D7;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D8;AL # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01D9;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DA;AL # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01DB;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DC;AL # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+01DD;AL # LATIN SMALL LETTER TURNED E
+01DE;AL # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01DF;AL # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01E0;AL # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E1;AL # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01E2;AL # LATIN CAPITAL LETTER AE WITH MACRON
+01E3;AL # LATIN SMALL LETTER AE WITH MACRON
+01E4;AL # LATIN CAPITAL LETTER G WITH STROKE
+01E5;AL # LATIN SMALL LETTER G WITH STROKE
+01E6;AL # LATIN CAPITAL LETTER G WITH CARON
+01E7;AL # LATIN SMALL LETTER G WITH CARON
+01E8;AL # LATIN CAPITAL LETTER K WITH CARON
+01E9;AL # LATIN SMALL LETTER K WITH CARON
+01EA;AL # LATIN CAPITAL LETTER O WITH OGONEK
+01EB;AL # LATIN SMALL LETTER O WITH OGONEK
+01EC;AL # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01ED;AL # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01EE;AL # LATIN CAPITAL LETTER EZH WITH CARON
+01EF;AL # LATIN SMALL LETTER EZH WITH CARON
+01F0;AL # LATIN SMALL LETTER J WITH CARON
+01F1;AL # LATIN CAPITAL LETTER DZ
+01F2;AL # LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F3;AL # LATIN SMALL LETTER DZ
+01F4;AL # LATIN CAPITAL LETTER G WITH ACUTE
+01F5;AL # LATIN SMALL LETTER G WITH ACUTE
+01F6;AL # LATIN CAPITAL LETTER HWAIR
+01F7;AL # LATIN CAPITAL LETTER WYNN
+01F8;AL # LATIN CAPITAL LETTER N WITH GRAVE
+01F9;AL # LATIN SMALL LETTER N WITH GRAVE
+01FA;AL # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FB;AL # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01FC;AL # LATIN CAPITAL LETTER AE WITH ACUTE
+01FD;AL # LATIN SMALL LETTER AE WITH ACUTE
+01FE;AL # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+01FF;AL # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0200;AL # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0201;AL # LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0202;AL # LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0203;AL # LATIN SMALL LETTER A WITH INVERTED BREVE
+0204;AL # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0205;AL # LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0206;AL # LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0207;AL # LATIN SMALL LETTER E WITH INVERTED BREVE
+0208;AL # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+0209;AL # LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020A;AL # LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020B;AL # LATIN SMALL LETTER I WITH INVERTED BREVE
+020C;AL # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020D;AL # LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020E;AL # LATIN CAPITAL LETTER O WITH INVERTED BREVE
+020F;AL # LATIN SMALL LETTER O WITH INVERTED BREVE
+0210;AL # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0211;AL # LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0212;AL # LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0213;AL # LATIN SMALL LETTER R WITH INVERTED BREVE
+0214;AL # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0215;AL # LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0216;AL # LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0217;AL # LATIN SMALL LETTER U WITH INVERTED BREVE
+0218;AL # LATIN CAPITAL LETTER S WITH COMMA BELOW
+0219;AL # LATIN SMALL LETTER S WITH COMMA BELOW
+021A;AL # LATIN CAPITAL LETTER T WITH COMMA BELOW
+021B;AL # LATIN SMALL LETTER T WITH COMMA BELOW
+021C;AL # LATIN CAPITAL LETTER YOGH
+021D;AL # LATIN SMALL LETTER YOGH
+021E;AL # LATIN CAPITAL LETTER H WITH CARON
+021F;AL # LATIN SMALL LETTER H WITH CARON
+0220;AL # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0221;AL # LATIN SMALL LETTER D WITH CURL
+0222;AL # LATIN CAPITAL LETTER OU
+0223;AL # LATIN SMALL LETTER OU
+0224;AL # LATIN CAPITAL LETTER Z WITH HOOK
+0225;AL # LATIN SMALL LETTER Z WITH HOOK
+0226;AL # LATIN CAPITAL LETTER A WITH DOT ABOVE
+0227;AL # LATIN SMALL LETTER A WITH DOT ABOVE
+0228;AL # LATIN CAPITAL LETTER E WITH CEDILLA
+0229;AL # LATIN SMALL LETTER E WITH CEDILLA
+022A;AL # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022B;AL # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022C;AL # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022D;AL # LATIN SMALL LETTER O WITH TILDE AND MACRON
+022E;AL # LATIN CAPITAL LETTER O WITH DOT ABOVE
+022F;AL # LATIN SMALL LETTER O WITH DOT ABOVE
+0230;AL # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0231;AL # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0232;AL # LATIN CAPITAL LETTER Y WITH MACRON
+0233;AL # LATIN SMALL LETTER Y WITH MACRON
+0234;AL # LATIN SMALL LETTER L WITH CURL
+0235;AL # LATIN SMALL LETTER N WITH CURL
+0236;AL # LATIN SMALL LETTER T WITH CURL
+0237;AL # LATIN SMALL LETTER DOTLESS J
+0238;AL # LATIN SMALL LETTER DB DIGRAPH
+0239;AL # LATIN SMALL LETTER QP DIGRAPH
+023A;AL # LATIN CAPITAL LETTER A WITH STROKE
+023B;AL # LATIN CAPITAL LETTER C WITH STROKE
+023C;AL # LATIN SMALL LETTER C WITH STROKE
+023D;AL # LATIN CAPITAL LETTER L WITH BAR
+023E;AL # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+023F;AL # LATIN SMALL LETTER S WITH SWASH TAIL
+0240;AL # LATIN SMALL LETTER Z WITH SWASH TAIL
+0241;AL # LATIN CAPITAL LETTER GLOTTAL STOP
+0242;AL # LATIN SMALL LETTER GLOTTAL STOP
+0243;AL # LATIN CAPITAL LETTER B WITH STROKE
+0244;AL # LATIN CAPITAL LETTER U BAR
+0245;AL # LATIN CAPITAL LETTER TURNED V
+0246;AL # LATIN CAPITAL LETTER E WITH STROKE
+0247;AL # LATIN SMALL LETTER E WITH STROKE
+0248;AL # LATIN CAPITAL LETTER J WITH STROKE
+0249;AL # LATIN SMALL LETTER J WITH STROKE
+024A;AL # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+024B;AL # LATIN SMALL LETTER Q WITH HOOK TAIL
+024C;AL # LATIN CAPITAL LETTER R WITH STROKE
+024D;AL # LATIN SMALL LETTER R WITH STROKE
+024E;AL # LATIN CAPITAL LETTER Y WITH STROKE
+024F;AL # LATIN SMALL LETTER Y WITH STROKE
+0250;AL # LATIN SMALL LETTER TURNED A
+0251;AL # LATIN SMALL LETTER ALPHA
+0252;AL # LATIN SMALL LETTER TURNED ALPHA
+0253;AL # LATIN SMALL LETTER B WITH HOOK
+0254;AL # LATIN SMALL LETTER OPEN O
+0255;AL # LATIN SMALL LETTER C WITH CURL
+0256;AL # LATIN SMALL LETTER D WITH TAIL
+0257;AL # LATIN SMALL LETTER D WITH HOOK
+0258;AL # LATIN SMALL LETTER REVERSED E
+0259;AL # LATIN SMALL LETTER SCHWA
+025A;AL # LATIN SMALL LETTER SCHWA WITH HOOK
+025B;AL # LATIN SMALL LETTER OPEN E
+025C;AL # LATIN SMALL LETTER REVERSED OPEN E
+025D;AL # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025E;AL # LATIN SMALL LETTER CLOSED REVERSED OPEN E
+025F;AL # LATIN SMALL LETTER DOTLESS J WITH STROKE
+0260;AL # LATIN SMALL LETTER G WITH HOOK
+0261;AL # LATIN SMALL LETTER SCRIPT G
+0262;AL # LATIN LETTER SMALL CAPITAL G
+0263;AL # LATIN SMALL LETTER GAMMA
+0264;AL # LATIN SMALL LETTER RAMS HORN
+0265;AL # LATIN SMALL LETTER TURNED H
+0266;AL # LATIN SMALL LETTER H WITH HOOK
+0267;AL # LATIN SMALL LETTER HENG WITH HOOK
+0268;AL # LATIN SMALL LETTER I WITH STROKE
+0269;AL # LATIN SMALL LETTER IOTA
+026A;AL # LATIN LETTER SMALL CAPITAL I
+026B;AL # LATIN SMALL LETTER L WITH MIDDLE TILDE
+026C;AL # LATIN SMALL LETTER L WITH BELT
+026D;AL # LATIN SMALL LETTER L WITH RETROFLEX HOOK
+026E;AL # LATIN SMALL LETTER LEZH
+026F;AL # LATIN SMALL LETTER TURNED M
+0270;AL # LATIN SMALL LETTER TURNED M WITH LONG LEG
+0271;AL # LATIN SMALL LETTER M WITH HOOK
+0272;AL # LATIN SMALL LETTER N WITH LEFT HOOK
+0273;AL # LATIN SMALL LETTER N WITH RETROFLEX HOOK
+0274;AL # LATIN LETTER SMALL CAPITAL N
+0275;AL # LATIN SMALL LETTER BARRED O
+0276;AL # LATIN LETTER SMALL CAPITAL OE
+0277;AL # LATIN SMALL LETTER CLOSED OMEGA
+0278;AL # LATIN SMALL LETTER PHI
+0279;AL # LATIN SMALL LETTER TURNED R
+027A;AL # LATIN SMALL LETTER TURNED R WITH LONG LEG
+027B;AL # LATIN SMALL LETTER TURNED R WITH HOOK
+027C;AL # LATIN SMALL LETTER R WITH LONG LEG
+027D;AL # LATIN SMALL LETTER R WITH TAIL
+027E;AL # LATIN SMALL LETTER R WITH FISHHOOK
+027F;AL # LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0280;AL # LATIN LETTER SMALL CAPITAL R
+0281;AL # LATIN LETTER SMALL CAPITAL INVERTED R
+0282;AL # LATIN SMALL LETTER S WITH HOOK
+0283;AL # LATIN SMALL LETTER ESH
+0284;AL # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+0285;AL # LATIN SMALL LETTER SQUAT REVERSED ESH
+0286;AL # LATIN SMALL LETTER ESH WITH CURL
+0287;AL # LATIN SMALL LETTER TURNED T
+0288;AL # LATIN SMALL LETTER T WITH RETROFLEX HOOK
+0289;AL # LATIN SMALL LETTER U BAR
+028A;AL # LATIN SMALL LETTER UPSILON
+028B;AL # LATIN SMALL LETTER V WITH HOOK
+028C;AL # LATIN SMALL LETTER TURNED V
+028D;AL # LATIN SMALL LETTER TURNED W
+028E;AL # LATIN SMALL LETTER TURNED Y
+028F;AL # LATIN LETTER SMALL CAPITAL Y
+0290;AL # LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+0291;AL # LATIN SMALL LETTER Z WITH CURL
+0292;AL # LATIN SMALL LETTER EZH
+0293;AL # LATIN SMALL LETTER EZH WITH CURL
+0294;AL # LATIN LETTER GLOTTAL STOP
+0295;AL # LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+0296;AL # LATIN LETTER INVERTED GLOTTAL STOP
+0297;AL # LATIN LETTER STRETCHED C
+0298;AL # LATIN LETTER BILABIAL CLICK
+0299;AL # LATIN LETTER SMALL CAPITAL B
+029A;AL # LATIN SMALL LETTER CLOSED OPEN E
+029B;AL # LATIN LETTER SMALL CAPITAL G WITH HOOK
+029C;AL # LATIN LETTER SMALL CAPITAL H
+029D;AL # LATIN SMALL LETTER J WITH CROSSED-TAIL
+029E;AL # LATIN SMALL LETTER TURNED K
+029F;AL # LATIN LETTER SMALL CAPITAL L
+02A0;AL # LATIN SMALL LETTER Q WITH HOOK
+02A1;AL # LATIN LETTER GLOTTAL STOP WITH STROKE
+02A2;AL # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+02A3;AL # LATIN SMALL LETTER DZ DIGRAPH
+02A4;AL # LATIN SMALL LETTER DEZH DIGRAPH
+02A5;AL # LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+02A6;AL # LATIN SMALL LETTER TS DIGRAPH
+02A7;AL # LATIN SMALL LETTER TESH DIGRAPH
+02A8;AL # LATIN SMALL LETTER TC DIGRAPH WITH CURL
+02A9;AL # LATIN SMALL LETTER FENG DIGRAPH
+02AA;AL # LATIN SMALL LETTER LS DIGRAPH
+02AB;AL # LATIN SMALL LETTER LZ DIGRAPH
+02AC;AL # LATIN LETTER BILABIAL PERCUSSIVE
+02AD;AL # LATIN LETTER BIDENTAL PERCUSSIVE
+02AE;AL # LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF;AL # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0;AL # MODIFIER LETTER SMALL H
+02B1;AL # MODIFIER LETTER SMALL H WITH HOOK
+02B2;AL # MODIFIER LETTER SMALL J
+02B3;AL # MODIFIER LETTER SMALL R
+02B4;AL # MODIFIER LETTER SMALL TURNED R
+02B5;AL # MODIFIER LETTER SMALL TURNED R WITH HOOK
+02B6;AL # MODIFIER LETTER SMALL CAPITAL INVERTED R
+02B7;AL # MODIFIER LETTER SMALL W
+02B8;AL # MODIFIER LETTER SMALL Y
+02B9;AL # MODIFIER LETTER PRIME
+02BA;AL # MODIFIER LETTER DOUBLE PRIME
+02BB;AL # MODIFIER LETTER TURNED COMMA
+02BC;AL # MODIFIER LETTER APOSTROPHE
+02BD;AL # MODIFIER LETTER REVERSED COMMA
+02BE;AL # MODIFIER LETTER RIGHT HALF RING
+02BF;AL # MODIFIER LETTER LEFT HALF RING
+02C0;AL # MODIFIER LETTER GLOTTAL STOP
+02C1;AL # MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2;AL # MODIFIER LETTER LEFT ARROWHEAD
+02C3;AL # MODIFIER LETTER RIGHT ARROWHEAD
+02C4;AL # MODIFIER LETTER UP ARROWHEAD
+02C5;AL # MODIFIER LETTER DOWN ARROWHEAD
+02C6;AL # MODIFIER LETTER CIRCUMFLEX ACCENT
+02C7;AI # CARON
+02C8;BB # MODIFIER LETTER VERTICAL LINE
+02C9;AI # MODIFIER LETTER MACRON
+02CA;AI # MODIFIER LETTER ACUTE ACCENT
+02CB;AI # MODIFIER LETTER GRAVE ACCENT
+02CC;BB # MODIFIER LETTER LOW VERTICAL LINE
+02CD;AI # MODIFIER LETTER LOW MACRON
+02CE;AL # MODIFIER LETTER LOW GRAVE ACCENT
+02CF;AL # MODIFIER LETTER LOW ACUTE ACCENT
+02D0;AI # MODIFIER LETTER TRIANGULAR COLON
+02D1;AL # MODIFIER LETTER HALF TRIANGULAR COLON
+02D2;AL # MODIFIER LETTER CENTRED RIGHT HALF RING
+02D3;AL # MODIFIER LETTER CENTRED LEFT HALF RING
+02D4;AL # MODIFIER LETTER UP TACK
+02D5;AL # MODIFIER LETTER DOWN TACK
+02D6;AL # MODIFIER LETTER PLUS SIGN
+02D7;AL # MODIFIER LETTER MINUS SIGN
+02D8;AI # BREVE
+02D9;AI # DOT ABOVE
+02DA;AI # RING ABOVE
+02DB;AI # OGONEK
+02DC;AL # SMALL TILDE
+02DD;AI # DOUBLE ACUTE ACCENT
+02DE;AL # MODIFIER LETTER RHOTIC HOOK
+02DF;BB # MODIFIER LETTER CROSS ACCENT
+02E0;AL # MODIFIER LETTER SMALL GAMMA
+02E1;AL # MODIFIER LETTER SMALL L
+02E2;AL # MODIFIER LETTER SMALL S
+02E3;AL # MODIFIER LETTER SMALL X
+02E4;AL # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5;AL # MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6;AL # MODIFIER LETTER HIGH TONE BAR
+02E7;AL # MODIFIER LETTER MID TONE BAR
+02E8;AL # MODIFIER LETTER LOW TONE BAR
+02E9;AL # MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA;AL # MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB;AL # MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC;AL # MODIFIER LETTER VOICING
+02ED;AL # MODIFIER LETTER UNASPIRATED
+02EE;AL # MODIFIER LETTER DOUBLE APOSTROPHE
+02EF;AL # MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0;AL # MODIFIER LETTER LOW UP ARROWHEAD
+02F1;AL # MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2;AL # MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3;AL # MODIFIER LETTER LOW RING
+02F4;AL # MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5;AL # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6;AL # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7;AL # MODIFIER LETTER LOW TILDE
+02F8;AL # MODIFIER LETTER RAISED COLON
+02F9;AL # MODIFIER LETTER BEGIN HIGH TONE
+02FA;AL # MODIFIER LETTER END HIGH TONE
+02FB;AL # MODIFIER LETTER BEGIN LOW TONE
+02FC;AL # MODIFIER LETTER END LOW TONE
+02FD;AL # MODIFIER LETTER SHELF
+02FE;AL # MODIFIER LETTER OPEN SHELF
+02FF;AL # MODIFIER LETTER LOW LEFT ARROW
+0300;CM # COMBINING GRAVE ACCENT
+0301;CM # COMBINING ACUTE ACCENT
+0302;CM # COMBINING CIRCUMFLEX ACCENT
+0303;CM # COMBINING TILDE
+0304;CM # COMBINING MACRON
+0305;CM # COMBINING OVERLINE
+0306;CM # COMBINING BREVE
+0307;CM # COMBINING DOT ABOVE
+0308;CM # COMBINING DIAERESIS
+0309;CM # COMBINING HOOK ABOVE
+030A;CM # COMBINING RING ABOVE
+030B;CM # COMBINING DOUBLE ACUTE ACCENT
+030C;CM # COMBINING CARON
+030D;CM # COMBINING VERTICAL LINE ABOVE
+030E;CM # COMBINING DOUBLE VERTICAL LINE ABOVE
+030F;CM # COMBINING DOUBLE GRAVE ACCENT
+0310;CM # COMBINING CANDRABINDU
+0311;CM # COMBINING INVERTED BREVE
+0312;CM # COMBINING TURNED COMMA ABOVE
+0313;CM # COMBINING COMMA ABOVE
+0314;CM # COMBINING REVERSED COMMA ABOVE
+0315;CM # COMBINING COMMA ABOVE RIGHT
+0316;CM # COMBINING GRAVE ACCENT BELOW
+0317;CM # COMBINING ACUTE ACCENT BELOW
+0318;CM # COMBINING LEFT TACK BELOW
+0319;CM # COMBINING RIGHT TACK BELOW
+031A;CM # COMBINING LEFT ANGLE ABOVE
+031B;CM # COMBINING HORN
+031C;CM # COMBINING LEFT HALF RING BELOW
+031D;CM # COMBINING UP TACK BELOW
+031E;CM # COMBINING DOWN TACK BELOW
+031F;CM # COMBINING PLUS SIGN BELOW
+0320;CM # COMBINING MINUS SIGN BELOW
+0321;CM # COMBINING PALATALIZED HOOK BELOW
+0322;CM # COMBINING RETROFLEX HOOK BELOW
+0323;CM # COMBINING DOT BELOW
+0324;CM # COMBINING DIAERESIS BELOW
+0325;CM # COMBINING RING BELOW
+0326;CM # COMBINING COMMA BELOW
+0327;CM # COMBINING CEDILLA
+0328;CM # COMBINING OGONEK
+0329;CM # COMBINING VERTICAL LINE BELOW
+032A;CM # COMBINING BRIDGE BELOW
+032B;CM # COMBINING INVERTED DOUBLE ARCH BELOW
+032C;CM # COMBINING CARON BELOW
+032D;CM # COMBINING CIRCUMFLEX ACCENT BELOW
+032E;CM # COMBINING BREVE BELOW
+032F;CM # COMBINING INVERTED BREVE BELOW
+0330;CM # COMBINING TILDE BELOW
+0331;CM # COMBINING MACRON BELOW
+0332;CM # COMBINING LOW LINE
+0333;CM # COMBINING DOUBLE LOW LINE
+0334;CM # COMBINING TILDE OVERLAY
+0335;CM # COMBINING SHORT STROKE OVERLAY
+0336;CM # COMBINING LONG STROKE OVERLAY
+0337;CM # COMBINING SHORT SOLIDUS OVERLAY
+0338;CM # COMBINING LONG SOLIDUS OVERLAY
+0339;CM # COMBINING RIGHT HALF RING BELOW
+033A;CM # COMBINING INVERTED BRIDGE BELOW
+033B;CM # COMBINING SQUARE BELOW
+033C;CM # COMBINING SEAGULL BELOW
+033D;CM # COMBINING X ABOVE
+033E;CM # COMBINING VERTICAL TILDE
+033F;CM # COMBINING DOUBLE OVERLINE
+0340;CM # COMBINING GRAVE TONE MARK
+0341;CM # COMBINING ACUTE TONE MARK
+0342;CM # COMBINING GREEK PERISPOMENI
+0343;CM # COMBINING GREEK KORONIS
+0344;CM # COMBINING GREEK DIALYTIKA TONOS
+0345;CM # COMBINING GREEK YPOGEGRAMMENI
+0346;CM # COMBINING BRIDGE ABOVE
+0347;CM # COMBINING EQUALS SIGN BELOW
+0348;CM # COMBINING DOUBLE VERTICAL LINE BELOW
+0349;CM # COMBINING LEFT ANGLE BELOW
+034A;CM # COMBINING NOT TILDE ABOVE
+034B;CM # COMBINING HOMOTHETIC ABOVE
+034C;CM # COMBINING ALMOST EQUAL TO ABOVE
+034D;CM # COMBINING LEFT RIGHT ARROW BELOW
+034E;CM # COMBINING UPWARDS ARROW BELOW
+034F;GL # COMBINING GRAPHEME JOINER
+0350;CM # COMBINING RIGHT ARROWHEAD ABOVE
+0351;CM # COMBINING LEFT HALF RING ABOVE
+0352;CM # COMBINING FERMATA
+0353;CM # COMBINING X BELOW
+0354;CM # COMBINING LEFT ARROWHEAD BELOW
+0355;CM # COMBINING RIGHT ARROWHEAD BELOW
+0356;CM # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357;CM # COMBINING RIGHT HALF RING ABOVE
+0358;CM # COMBINING DOT ABOVE RIGHT
+0359;CM # COMBINING ASTERISK BELOW
+035A;CM # COMBINING DOUBLE RING BELOW
+035B;CM # COMBINING ZIGZAG ABOVE
+035C;GL # COMBINING DOUBLE BREVE BELOW
+035D;GL # COMBINING DOUBLE BREVE
+035E;GL # COMBINING DOUBLE MACRON
+035F;GL # COMBINING DOUBLE MACRON BELOW
+0360;GL # COMBINING DOUBLE TILDE
+0361;GL # COMBINING DOUBLE INVERTED BREVE
+0362;GL # COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0363;CM # COMBINING LATIN SMALL LETTER A
+0364;CM # COMBINING LATIN SMALL LETTER E
+0365;CM # COMBINING LATIN SMALL LETTER I
+0366;CM # COMBINING LATIN SMALL LETTER O
+0367;CM # COMBINING LATIN SMALL LETTER U
+0368;CM # COMBINING LATIN SMALL LETTER C
+0369;CM # COMBINING LATIN SMALL LETTER D
+036A;CM # COMBINING LATIN SMALL LETTER H
+036B;CM # COMBINING LATIN SMALL LETTER M
+036C;CM # COMBINING LATIN SMALL LETTER R
+036D;CM # COMBINING LATIN SMALL LETTER T
+036E;CM # COMBINING LATIN SMALL LETTER V
+036F;CM # COMBINING LATIN SMALL LETTER X
+0370;AL # GREEK CAPITAL LETTER HETA
+0371;AL # GREEK SMALL LETTER HETA
+0372;AL # GREEK CAPITAL LETTER ARCHAIC SAMPI
+0373;AL # GREEK SMALL LETTER ARCHAIC SAMPI
+0374;AL # GREEK NUMERAL SIGN
+0375;AL # GREEK LOWER NUMERAL SIGN
+0376;AL # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+0377;AL # GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A;AL # GREEK YPOGEGRAMMENI
+037B;AL # GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
+037C;AL # GREEK SMALL DOTTED LUNATE SIGMA SYMBOL
+037D;AL # GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+037E;IS # GREEK QUESTION MARK
+0384;AL # GREEK TONOS
+0385;AL # GREEK DIALYTIKA TONOS
+0386;AL # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387;AL # GREEK ANO TELEIA
+0388;AL # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389;AL # GREEK CAPITAL LETTER ETA WITH TONOS
+038A;AL # GREEK CAPITAL LETTER IOTA WITH TONOS
+038C;AL # GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E;AL # GREEK CAPITAL LETTER UPSILON WITH TONOS
+038F;AL # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391;AL # GREEK CAPITAL LETTER ALPHA
+0392;AL # GREEK CAPITAL LETTER BETA
+0393;AL # GREEK CAPITAL LETTER GAMMA
+0394;AL # GREEK CAPITAL LETTER DELTA
+0395;AL # GREEK CAPITAL LETTER EPSILON
+0396;AL # GREEK CAPITAL LETTER ZETA
+0397;AL # GREEK CAPITAL LETTER ETA
+0398;AL # GREEK CAPITAL LETTER THETA
+0399;AL # GREEK CAPITAL LETTER IOTA
+039A;AL # GREEK CAPITAL LETTER KAPPA
+039B;AL # GREEK CAPITAL LETTER LAMDA
+039C;AL # GREEK CAPITAL LETTER MU
+039D;AL # GREEK CAPITAL LETTER NU
+039E;AL # GREEK CAPITAL LETTER XI
+039F;AL # GREEK CAPITAL LETTER OMICRON
+03A0;AL # GREEK CAPITAL LETTER PI
+03A1;AL # GREEK CAPITAL LETTER RHO
+03A3;AL # GREEK CAPITAL LETTER SIGMA
+03A4;AL # GREEK CAPITAL LETTER TAU
+03A5;AL # GREEK CAPITAL LETTER UPSILON
+03A6;AL # GREEK CAPITAL LETTER PHI
+03A7;AL # GREEK CAPITAL LETTER CHI
+03A8;AL # GREEK CAPITAL LETTER PSI
+03A9;AL # GREEK CAPITAL LETTER OMEGA
+03AA;AL # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03AB;AL # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03AC;AL # GREEK SMALL LETTER ALPHA WITH TONOS
+03AD;AL # GREEK SMALL LETTER EPSILON WITH TONOS
+03AE;AL # GREEK SMALL LETTER ETA WITH TONOS
+03AF;AL # GREEK SMALL LETTER IOTA WITH TONOS
+03B0;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03B1;AL # GREEK SMALL LETTER ALPHA
+03B2;AL # GREEK SMALL LETTER BETA
+03B3;AL # GREEK SMALL LETTER GAMMA
+03B4;AL # GREEK SMALL LETTER DELTA
+03B5;AL # GREEK SMALL LETTER EPSILON
+03B6;AL # GREEK SMALL LETTER ZETA
+03B7;AL # GREEK SMALL LETTER ETA
+03B8;AL # GREEK SMALL LETTER THETA
+03B9;AL # GREEK SMALL LETTER IOTA
+03BA;AL # GREEK SMALL LETTER KAPPA
+03BB;AL # GREEK SMALL LETTER LAMDA
+03BC;AL # GREEK SMALL LETTER MU
+03BD;AL # GREEK SMALL LETTER NU
+03BE;AL # GREEK SMALL LETTER XI
+03BF;AL # GREEK SMALL LETTER OMICRON
+03C0;AL # GREEK SMALL LETTER PI
+03C1;AL # GREEK SMALL LETTER RHO
+03C2;AL # GREEK SMALL LETTER FINAL SIGMA
+03C3;AL # GREEK SMALL LETTER SIGMA
+03C4;AL # GREEK SMALL LETTER TAU
+03C5;AL # GREEK SMALL LETTER UPSILON
+03C6;AL # GREEK SMALL LETTER PHI
+03C7;AL # GREEK SMALL LETTER CHI
+03C8;AL # GREEK SMALL LETTER PSI
+03C9;AL # GREEK SMALL LETTER OMEGA
+03CA;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+03CB;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+03CC;AL # GREEK SMALL LETTER OMICRON WITH TONOS
+03CD;AL # GREEK SMALL LETTER UPSILON WITH TONOS
+03CE;AL # GREEK SMALL LETTER OMEGA WITH TONOS
+03CF;AL # GREEK CAPITAL KAI SYMBOL
+03D0;AL # GREEK BETA SYMBOL
+03D1;AL # GREEK THETA SYMBOL
+03D2;AL # GREEK UPSILON WITH HOOK SYMBOL
+03D3;AL # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+03D4;AL # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+03D5;AL # GREEK PHI SYMBOL
+03D6;AL # GREEK PI SYMBOL
+03D7;AL # GREEK KAI SYMBOL
+03D8;AL # GREEK LETTER ARCHAIC KOPPA
+03D9;AL # GREEK SMALL LETTER ARCHAIC KOPPA
+03DA;AL # GREEK LETTER STIGMA
+03DB;AL # GREEK SMALL LETTER STIGMA
+03DC;AL # GREEK LETTER DIGAMMA
+03DD;AL # GREEK SMALL LETTER DIGAMMA
+03DE;AL # GREEK LETTER KOPPA
+03DF;AL # GREEK SMALL LETTER KOPPA
+03E0;AL # GREEK LETTER SAMPI
+03E1;AL # GREEK SMALL LETTER SAMPI
+03E2;AL # COPTIC CAPITAL LETTER SHEI
+03E3;AL # COPTIC SMALL LETTER SHEI
+03E4;AL # COPTIC CAPITAL LETTER FEI
+03E5;AL # COPTIC SMALL LETTER FEI
+03E6;AL # COPTIC CAPITAL LETTER KHEI
+03E7;AL # COPTIC SMALL LETTER KHEI
+03E8;AL # COPTIC CAPITAL LETTER HORI
+03E9;AL # COPTIC SMALL LETTER HORI
+03EA;AL # COPTIC CAPITAL LETTER GANGIA
+03EB;AL # COPTIC SMALL LETTER GANGIA
+03EC;AL # COPTIC CAPITAL LETTER SHIMA
+03ED;AL # COPTIC SMALL LETTER SHIMA
+03EE;AL # COPTIC CAPITAL LETTER DEI
+03EF;AL # COPTIC SMALL LETTER DEI
+03F0;AL # GREEK KAPPA SYMBOL
+03F1;AL # GREEK RHO SYMBOL
+03F2;AL # GREEK LUNATE SIGMA SYMBOL
+03F3;AL # GREEK LETTER YOT
+03F4;AL # GREEK CAPITAL THETA SYMBOL
+03F5;AL # GREEK LUNATE EPSILON SYMBOL
+03F6;AL # GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7;AL # GREEK CAPITAL LETTER SHO
+03F8;AL # GREEK SMALL LETTER SHO
+03F9;AL # GREEK CAPITAL LUNATE SIGMA SYMBOL
+03FA;AL # GREEK CAPITAL LETTER SAN
+03FB;AL # GREEK SMALL LETTER SAN
+03FC;AL # GREEK RHO WITH STROKE SYMBOL
+03FD;AL # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+03FE;AL # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+03FF;AL # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0400;AL # CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401;AL # CYRILLIC CAPITAL LETTER IO
+0402;AL # CYRILLIC CAPITAL LETTER DJE
+0403;AL # CYRILLIC CAPITAL LETTER GJE
+0404;AL # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405;AL # CYRILLIC CAPITAL LETTER DZE
+0406;AL # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407;AL # CYRILLIC CAPITAL LETTER YI
+0408;AL # CYRILLIC CAPITAL LETTER JE
+0409;AL # CYRILLIC CAPITAL LETTER LJE
+040A;AL # CYRILLIC CAPITAL LETTER NJE
+040B;AL # CYRILLIC CAPITAL LETTER TSHE
+040C;AL # CYRILLIC CAPITAL LETTER KJE
+040D;AL # CYRILLIC CAPITAL LETTER I WITH GRAVE
+040E;AL # CYRILLIC CAPITAL LETTER SHORT U
+040F;AL # CYRILLIC CAPITAL LETTER DZHE
+0410;AL # CYRILLIC CAPITAL LETTER A
+0411;AL # CYRILLIC CAPITAL LETTER BE
+0412;AL # CYRILLIC CAPITAL LETTER VE
+0413;AL # CYRILLIC CAPITAL LETTER GHE
+0414;AL # CYRILLIC CAPITAL LETTER DE
+0415;AL # CYRILLIC CAPITAL LETTER IE
+0416;AL # CYRILLIC CAPITAL LETTER ZHE
+0417;AL # CYRILLIC CAPITAL LETTER ZE
+0418;AL # CYRILLIC CAPITAL LETTER I
+0419;AL # CYRILLIC CAPITAL LETTER SHORT I
+041A;AL # CYRILLIC CAPITAL LETTER KA
+041B;AL # CYRILLIC CAPITAL LETTER EL
+041C;AL # CYRILLIC CAPITAL LETTER EM
+041D;AL # CYRILLIC CAPITAL LETTER EN
+041E;AL # CYRILLIC CAPITAL LETTER O
+041F;AL # CYRILLIC CAPITAL LETTER PE
+0420;AL # CYRILLIC CAPITAL LETTER ER
+0421;AL # CYRILLIC CAPITAL LETTER ES
+0422;AL # CYRILLIC CAPITAL LETTER TE
+0423;AL # CYRILLIC CAPITAL LETTER U
+0424;AL # CYRILLIC CAPITAL LETTER EF
+0425;AL # CYRILLIC CAPITAL LETTER HA
+0426;AL # CYRILLIC CAPITAL LETTER TSE
+0427;AL # CYRILLIC CAPITAL LETTER CHE
+0428;AL # CYRILLIC CAPITAL LETTER SHA
+0429;AL # CYRILLIC CAPITAL LETTER SHCHA
+042A;AL # CYRILLIC CAPITAL LETTER HARD SIGN
+042B;AL # CYRILLIC CAPITAL LETTER YERU
+042C;AL # CYRILLIC CAPITAL LETTER SOFT SIGN
+042D;AL # CYRILLIC CAPITAL LETTER E
+042E;AL # CYRILLIC CAPITAL LETTER YU
+042F;AL # CYRILLIC CAPITAL LETTER YA
+0430;AL # CYRILLIC SMALL LETTER A
+0431;AL # CYRILLIC SMALL LETTER BE
+0432;AL # CYRILLIC SMALL LETTER VE
+0433;AL # CYRILLIC SMALL LETTER GHE
+0434;AL # CYRILLIC SMALL LETTER DE
+0435;AL # CYRILLIC SMALL LETTER IE
+0436;AL # CYRILLIC SMALL LETTER ZHE
+0437;AL # CYRILLIC SMALL LETTER ZE
+0438;AL # CYRILLIC SMALL LETTER I
+0439;AL # CYRILLIC SMALL LETTER SHORT I
+043A;AL # CYRILLIC SMALL LETTER KA
+043B;AL # CYRILLIC SMALL LETTER EL
+043C;AL # CYRILLIC SMALL LETTER EM
+043D;AL # CYRILLIC SMALL LETTER EN
+043E;AL # CYRILLIC SMALL LETTER O
+043F;AL # CYRILLIC SMALL LETTER PE
+0440;AL # CYRILLIC SMALL LETTER ER
+0441;AL # CYRILLIC SMALL LETTER ES
+0442;AL # CYRILLIC SMALL LETTER TE
+0443;AL # CYRILLIC SMALL LETTER U
+0444;AL # CYRILLIC SMALL LETTER EF
+0445;AL # CYRILLIC SMALL LETTER HA
+0446;AL # CYRILLIC SMALL LETTER TSE
+0447;AL # CYRILLIC SMALL LETTER CHE
+0448;AL # CYRILLIC SMALL LETTER SHA
+0449;AL # CYRILLIC SMALL LETTER SHCHA
+044A;AL # CYRILLIC SMALL LETTER HARD SIGN
+044B;AL # CYRILLIC SMALL LETTER YERU
+044C;AL # CYRILLIC SMALL LETTER SOFT SIGN
+044D;AL # CYRILLIC SMALL LETTER E
+044E;AL # CYRILLIC SMALL LETTER YU
+044F;AL # CYRILLIC SMALL LETTER YA
+0450;AL # CYRILLIC SMALL LETTER IE WITH GRAVE
+0451;AL # CYRILLIC SMALL LETTER IO
+0452;AL # CYRILLIC SMALL LETTER DJE
+0453;AL # CYRILLIC SMALL LETTER GJE
+0454;AL # CYRILLIC SMALL LETTER UKRAINIAN IE
+0455;AL # CYRILLIC SMALL LETTER DZE
+0456;AL # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0457;AL # CYRILLIC SMALL LETTER YI
+0458;AL # CYRILLIC SMALL LETTER JE
+0459;AL # CYRILLIC SMALL LETTER LJE
+045A;AL # CYRILLIC SMALL LETTER NJE
+045B;AL # CYRILLIC SMALL LETTER TSHE
+045C;AL # CYRILLIC SMALL LETTER KJE
+045D;AL # CYRILLIC SMALL LETTER I WITH GRAVE
+045E;AL # CYRILLIC SMALL LETTER SHORT U
+045F;AL # CYRILLIC SMALL LETTER DZHE
+0460;AL # CYRILLIC CAPITAL LETTER OMEGA
+0461;AL # CYRILLIC SMALL LETTER OMEGA
+0462;AL # CYRILLIC CAPITAL LETTER YAT
+0463;AL # CYRILLIC SMALL LETTER YAT
+0464;AL # CYRILLIC CAPITAL LETTER IOTIFIED E
+0465;AL # CYRILLIC SMALL LETTER IOTIFIED E
+0466;AL # CYRILLIC CAPITAL LETTER LITTLE YUS
+0467;AL # CYRILLIC SMALL LETTER LITTLE YUS
+0468;AL # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469;AL # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046A;AL # CYRILLIC CAPITAL LETTER BIG YUS
+046B;AL # CYRILLIC SMALL LETTER BIG YUS
+046C;AL # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046D;AL # CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046E;AL # CYRILLIC CAPITAL LETTER KSI
+046F;AL # CYRILLIC SMALL LETTER KSI
+0470;AL # CYRILLIC CAPITAL LETTER PSI
+0471;AL # CYRILLIC SMALL LETTER PSI
+0472;AL # CYRILLIC CAPITAL LETTER FITA
+0473;AL # CYRILLIC SMALL LETTER FITA
+0474;AL # CYRILLIC CAPITAL LETTER IZHITSA
+0475;AL # CYRILLIC SMALL LETTER IZHITSA
+0476;AL # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0477;AL # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478;AL # CYRILLIC CAPITAL LETTER UK
+0479;AL # CYRILLIC SMALL LETTER UK
+047A;AL # CYRILLIC CAPITAL LETTER ROUND OMEGA
+047B;AL # CYRILLIC SMALL LETTER ROUND OMEGA
+047C;AL # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047D;AL # CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047E;AL # CYRILLIC CAPITAL LETTER OT
+047F;AL # CYRILLIC SMALL LETTER OT
+0480;AL # CYRILLIC CAPITAL LETTER KOPPA
+0481;AL # CYRILLIC SMALL LETTER KOPPA
+0482;AL # CYRILLIC THOUSANDS SIGN
+0483;CM # COMBINING CYRILLIC TITLO
+0484;CM # COMBINING CYRILLIC PALATALIZATION
+0485;CM # COMBINING CYRILLIC DASIA PNEUMATA
+0486;CM # COMBINING CYRILLIC PSILI PNEUMATA
+0487;CM # COMBINING CYRILLIC POKRYTIE
+0488;CM # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489;CM # COMBINING CYRILLIC MILLIONS SIGN
+048A;AL # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048B;AL # CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048C;AL # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048D;AL # CYRILLIC SMALL LETTER SEMISOFT SIGN
+048E;AL # CYRILLIC CAPITAL LETTER ER WITH TICK
+048F;AL # CYRILLIC SMALL LETTER ER WITH TICK
+0490;AL # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491;AL # CYRILLIC SMALL LETTER GHE WITH UPTURN
+0492;AL # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493;AL # CYRILLIC SMALL LETTER GHE WITH STROKE
+0494;AL # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495;AL # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0496;AL # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497;AL # CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0498;AL # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499;AL # CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049A;AL # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049B;AL # CYRILLIC SMALL LETTER KA WITH DESCENDER
+049C;AL # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049D;AL # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049E;AL # CYRILLIC CAPITAL LETTER KA WITH STROKE
+049F;AL # CYRILLIC SMALL LETTER KA WITH STROKE
+04A0;AL # CYRILLIC CAPITAL LETTER BASHKIR KA
+04A1;AL # CYRILLIC SMALL LETTER BASHKIR KA
+04A2;AL # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A3;AL # CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A4;AL # CYRILLIC CAPITAL LIGATURE EN GHE
+04A5;AL # CYRILLIC SMALL LIGATURE EN GHE
+04A6;AL # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A7;AL # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A8;AL # CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04A9;AL # CYRILLIC SMALL LETTER ABKHASIAN HA
+04AA;AL # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AB;AL # CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AC;AL # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AD;AL # CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AE;AL # CYRILLIC CAPITAL LETTER STRAIGHT U
+04AF;AL # CYRILLIC SMALL LETTER STRAIGHT U
+04B0;AL # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B1;AL # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B2;AL # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B3;AL # CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B4;AL # CYRILLIC CAPITAL LIGATURE TE TSE
+04B5;AL # CYRILLIC SMALL LIGATURE TE TSE
+04B6;AL # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B7;AL # CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B8;AL # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04B9;AL # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04BA;AL # CYRILLIC CAPITAL LETTER SHHA
+04BB;AL # CYRILLIC SMALL LETTER SHHA
+04BC;AL # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BD;AL # CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BE;AL # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04BF;AL # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0;AL # CYRILLIC LETTER PALOCHKA
+04C1;AL # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C2;AL # CYRILLIC SMALL LETTER ZHE WITH BREVE
+04C3;AL # CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C4;AL # CYRILLIC SMALL LETTER KA WITH HOOK
+04C5;AL # CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C6;AL # CYRILLIC SMALL LETTER EL WITH TAIL
+04C7;AL # CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C8;AL # CYRILLIC SMALL LETTER EN WITH HOOK
+04C9;AL # CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CA;AL # CYRILLIC SMALL LETTER EN WITH TAIL
+04CB;AL # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CC;AL # CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CD;AL # CYRILLIC CAPITAL LETTER EM WITH TAIL
+04CE;AL # CYRILLIC SMALL LETTER EM WITH TAIL
+04CF;AL # CYRILLIC SMALL LETTER PALOCHKA
+04D0;AL # CYRILLIC CAPITAL LETTER A WITH BREVE
+04D1;AL # CYRILLIC SMALL LETTER A WITH BREVE
+04D2;AL # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D3;AL # CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D4;AL # CYRILLIC CAPITAL LIGATURE A IE
+04D5;AL # CYRILLIC SMALL LIGATURE A IE
+04D6;AL # CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D7;AL # CYRILLIC SMALL LETTER IE WITH BREVE
+04D8;AL # CYRILLIC CAPITAL LETTER SCHWA
+04D9;AL # CYRILLIC SMALL LETTER SCHWA
+04DA;AL # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DB;AL # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DC;AL # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DD;AL # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DE;AL # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04DF;AL # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E0;AL # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E1;AL # CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E2;AL # CYRILLIC CAPITAL LETTER I WITH MACRON
+04E3;AL # CYRILLIC SMALL LETTER I WITH MACRON
+04E4;AL # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E5;AL # CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E6;AL # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E7;AL # CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E8;AL # CYRILLIC CAPITAL LETTER BARRED O
+04E9;AL # CYRILLIC SMALL LETTER BARRED O
+04EA;AL # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EB;AL # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EC;AL # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04ED;AL # CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EE;AL # CYRILLIC CAPITAL LETTER U WITH MACRON
+04EF;AL # CYRILLIC SMALL LETTER U WITH MACRON
+04F0;AL # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F1;AL # CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F2;AL # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F3;AL # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F4;AL # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F5;AL # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F6;AL # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F7;AL # CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F8;AL # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04F9;AL # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+04FA;AL # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+04FB;AL # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+04FC;AL # CYRILLIC CAPITAL LETTER HA WITH HOOK
+04FD;AL # CYRILLIC SMALL LETTER HA WITH HOOK
+04FE;AL # CYRILLIC CAPITAL LETTER HA WITH STROKE
+04FF;AL # CYRILLIC SMALL LETTER HA WITH STROKE
+0500;AL # CYRILLIC CAPITAL LETTER KOMI DE
+0501;AL # CYRILLIC SMALL LETTER KOMI DE
+0502;AL # CYRILLIC CAPITAL LETTER KOMI DJE
+0503;AL # CYRILLIC SMALL LETTER KOMI DJE
+0504;AL # CYRILLIC CAPITAL LETTER KOMI ZJE
+0505;AL # CYRILLIC SMALL LETTER KOMI ZJE
+0506;AL # CYRILLIC CAPITAL LETTER KOMI DZJE
+0507;AL # CYRILLIC SMALL LETTER KOMI DZJE
+0508;AL # CYRILLIC CAPITAL LETTER KOMI LJE
+0509;AL # CYRILLIC SMALL LETTER KOMI LJE
+050A;AL # CYRILLIC CAPITAL LETTER KOMI NJE
+050B;AL # CYRILLIC SMALL LETTER KOMI NJE
+050C;AL # CYRILLIC CAPITAL LETTER KOMI SJE
+050D;AL # CYRILLIC SMALL LETTER KOMI SJE
+050E;AL # CYRILLIC CAPITAL LETTER KOMI TJE
+050F;AL # CYRILLIC SMALL LETTER KOMI TJE
+0510;AL # CYRILLIC CAPITAL LETTER REVERSED ZE
+0511;AL # CYRILLIC SMALL LETTER REVERSED ZE
+0512;AL # CYRILLIC CAPITAL LETTER EL WITH HOOK
+0513;AL # CYRILLIC SMALL LETTER EL WITH HOOK
+0514;AL # CYRILLIC CAPITAL LETTER LHA
+0515;AL # CYRILLIC SMALL LETTER LHA
+0516;AL # CYRILLIC CAPITAL LETTER RHA
+0517;AL # CYRILLIC SMALL LETTER RHA
+0518;AL # CYRILLIC CAPITAL LETTER YAE
+0519;AL # CYRILLIC SMALL LETTER YAE
+051A;AL # CYRILLIC CAPITAL LETTER QA
+051B;AL # CYRILLIC SMALL LETTER QA
+051C;AL # CYRILLIC CAPITAL LETTER WE
+051D;AL # CYRILLIC SMALL LETTER WE
+051E;AL # CYRILLIC CAPITAL LETTER ALEUT KA
+051F;AL # CYRILLIC SMALL LETTER ALEUT KA
+0520;AL # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+0521;AL # CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+0522;AL # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+0523;AL # CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+0531;AL # ARMENIAN CAPITAL LETTER AYB
+0532;AL # ARMENIAN CAPITAL LETTER BEN
+0533;AL # ARMENIAN CAPITAL LETTER GIM
+0534;AL # ARMENIAN CAPITAL LETTER DA
+0535;AL # ARMENIAN CAPITAL LETTER ECH
+0536;AL # ARMENIAN CAPITAL LETTER ZA
+0537;AL # ARMENIAN CAPITAL LETTER EH
+0538;AL # ARMENIAN CAPITAL LETTER ET
+0539;AL # ARMENIAN CAPITAL LETTER TO
+053A;AL # ARMENIAN CAPITAL LETTER ZHE
+053B;AL # ARMENIAN CAPITAL LETTER INI
+053C;AL # ARMENIAN CAPITAL LETTER LIWN
+053D;AL # ARMENIAN CAPITAL LETTER XEH
+053E;AL # ARMENIAN CAPITAL LETTER CA
+053F;AL # ARMENIAN CAPITAL LETTER KEN
+0540;AL # ARMENIAN CAPITAL LETTER HO
+0541;AL # ARMENIAN CAPITAL LETTER JA
+0542;AL # ARMENIAN CAPITAL LETTER GHAD
+0543;AL # ARMENIAN CAPITAL LETTER CHEH
+0544;AL # ARMENIAN CAPITAL LETTER MEN
+0545;AL # ARMENIAN CAPITAL LETTER YI
+0546;AL # ARMENIAN CAPITAL LETTER NOW
+0547;AL # ARMENIAN CAPITAL LETTER SHA
+0548;AL # ARMENIAN CAPITAL LETTER VO
+0549;AL # ARMENIAN CAPITAL LETTER CHA
+054A;AL # ARMENIAN CAPITAL LETTER PEH
+054B;AL # ARMENIAN CAPITAL LETTER JHEH
+054C;AL # ARMENIAN CAPITAL LETTER RA
+054D;AL # ARMENIAN CAPITAL LETTER SEH
+054E;AL # ARMENIAN CAPITAL LETTER VEW
+054F;AL # ARMENIAN CAPITAL LETTER TIWN
+0550;AL # ARMENIAN CAPITAL LETTER REH
+0551;AL # ARMENIAN CAPITAL LETTER CO
+0552;AL # ARMENIAN CAPITAL LETTER YIWN
+0553;AL # ARMENIAN CAPITAL LETTER PIWR
+0554;AL # ARMENIAN CAPITAL LETTER KEH
+0555;AL # ARMENIAN CAPITAL LETTER OH
+0556;AL # ARMENIAN CAPITAL LETTER FEH
+0559;AL # ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A;AL # ARMENIAN APOSTROPHE
+055B;AL # ARMENIAN EMPHASIS MARK
+055C;AL # ARMENIAN EXCLAMATION MARK
+055D;AL # ARMENIAN COMMA
+055E;AL # ARMENIAN QUESTION MARK
+055F;AL # ARMENIAN ABBREVIATION MARK
+0561;AL # ARMENIAN SMALL LETTER AYB
+0562;AL # ARMENIAN SMALL LETTER BEN
+0563;AL # ARMENIAN SMALL LETTER GIM
+0564;AL # ARMENIAN SMALL LETTER DA
+0565;AL # ARMENIAN SMALL LETTER ECH
+0566;AL # ARMENIAN SMALL LETTER ZA
+0567;AL # ARMENIAN SMALL LETTER EH
+0568;AL # ARMENIAN SMALL LETTER ET
+0569;AL # ARMENIAN SMALL LETTER TO
+056A;AL # ARMENIAN SMALL LETTER ZHE
+056B;AL # ARMENIAN SMALL LETTER INI
+056C;AL # ARMENIAN SMALL LETTER LIWN
+056D;AL # ARMENIAN SMALL LETTER XEH
+056E;AL # ARMENIAN SMALL LETTER CA
+056F;AL # ARMENIAN SMALL LETTER KEN
+0570;AL # ARMENIAN SMALL LETTER HO
+0571;AL # ARMENIAN SMALL LETTER JA
+0572;AL # ARMENIAN SMALL LETTER GHAD
+0573;AL # ARMENIAN SMALL LETTER CHEH
+0574;AL # ARMENIAN SMALL LETTER MEN
+0575;AL # ARMENIAN SMALL LETTER YI
+0576;AL # ARMENIAN SMALL LETTER NOW
+0577;AL # ARMENIAN SMALL LETTER SHA
+0578;AL # ARMENIAN SMALL LETTER VO
+0579;AL # ARMENIAN SMALL LETTER CHA
+057A;AL # ARMENIAN SMALL LETTER PEH
+057B;AL # ARMENIAN SMALL LETTER JHEH
+057C;AL # ARMENIAN SMALL LETTER RA
+057D;AL # ARMENIAN SMALL LETTER SEH
+057E;AL # ARMENIAN SMALL LETTER VEW
+057F;AL # ARMENIAN SMALL LETTER TIWN
+0580;AL # ARMENIAN SMALL LETTER REH
+0581;AL # ARMENIAN SMALL LETTER CO
+0582;AL # ARMENIAN SMALL LETTER YIWN
+0583;AL # ARMENIAN SMALL LETTER PIWR
+0584;AL # ARMENIAN SMALL LETTER KEH
+0585;AL # ARMENIAN SMALL LETTER OH
+0586;AL # ARMENIAN SMALL LETTER FEH
+0587;AL # ARMENIAN SMALL LIGATURE ECH YIWN
+0589;IS # ARMENIAN FULL STOP
+058A;BA # ARMENIAN HYPHEN
+0591;CM # HEBREW ACCENT ETNAHTA
+0592;CM # HEBREW ACCENT SEGOL
+0593;CM # HEBREW ACCENT SHALSHELET
+0594;CM # HEBREW ACCENT ZAQEF QATAN
+0595;CM # HEBREW ACCENT ZAQEF GADOL
+0596;CM # HEBREW ACCENT TIPEHA
+0597;CM # HEBREW ACCENT REVIA
+0598;CM # HEBREW ACCENT ZARQA
+0599;CM # HEBREW ACCENT PASHTA
+059A;CM # HEBREW ACCENT YETIV
+059B;CM # HEBREW ACCENT TEVIR
+059C;CM # HEBREW ACCENT GERESH
+059D;CM # HEBREW ACCENT GERESH MUQDAM
+059E;CM # HEBREW ACCENT GERSHAYIM
+059F;CM # HEBREW ACCENT QARNEY PARA
+05A0;CM # HEBREW ACCENT TELISHA GEDOLA
+05A1;CM # HEBREW ACCENT PAZER
+05A2;CM # HEBREW ACCENT ATNAH HAFUKH
+05A3;CM # HEBREW ACCENT MUNAH
+05A4;CM # HEBREW ACCENT MAHAPAKH
+05A5;CM # HEBREW ACCENT MERKHA
+05A6;CM # HEBREW ACCENT MERKHA KEFULA
+05A7;CM # HEBREW ACCENT DARGA
+05A8;CM # HEBREW ACCENT QADMA
+05A9;CM # HEBREW ACCENT TELISHA QETANA
+05AA;CM # HEBREW ACCENT YERAH BEN YOMO
+05AB;CM # HEBREW ACCENT OLE
+05AC;CM # HEBREW ACCENT ILUY
+05AD;CM # HEBREW ACCENT DEHI
+05AE;CM # HEBREW ACCENT ZINOR
+05AF;CM # HEBREW MARK MASORA CIRCLE
+05B0;CM # HEBREW POINT SHEVA
+05B1;CM # HEBREW POINT HATAF SEGOL
+05B2;CM # HEBREW POINT HATAF PATAH
+05B3;CM # HEBREW POINT HATAF QAMATS
+05B4;CM # HEBREW POINT HIRIQ
+05B5;CM # HEBREW POINT TSERE
+05B6;CM # HEBREW POINT SEGOL
+05B7;CM # HEBREW POINT PATAH
+05B8;CM # HEBREW POINT QAMATS
+05B9;CM # HEBREW POINT HOLAM
+05BA;CM # HEBREW POINT HOLAM HASER FOR VAV
+05BB;CM # HEBREW POINT QUBUTS
+05BC;CM # HEBREW POINT DAGESH OR MAPIQ
+05BD;CM # HEBREW POINT METEG
+05BE;BA # HEBREW PUNCTUATION MAQAF
+05BF;CM # HEBREW POINT RAFE
+05C0;AL # HEBREW PUNCTUATION PASEQ
+05C1;CM # HEBREW POINT SHIN DOT
+05C2;CM # HEBREW POINT SIN DOT
+05C3;AL # HEBREW PUNCTUATION SOF PASUQ
+05C4;CM # HEBREW MARK UPPER DOT
+05C5;CM # HEBREW MARK LOWER DOT
+05C6;EX # HEBREW PUNCTUATION NUN HAFUKHA
+05C7;CM # HEBREW POINT QAMATS QATAN
+05D0;AL # HEBREW LETTER ALEF
+05D1;AL # HEBREW LETTER BET
+05D2;AL # HEBREW LETTER GIMEL
+05D3;AL # HEBREW LETTER DALET
+05D4;AL # HEBREW LETTER HE
+05D5;AL # HEBREW LETTER VAV
+05D6;AL # HEBREW LETTER ZAYIN
+05D7;AL # HEBREW LETTER HET
+05D8;AL # HEBREW LETTER TET
+05D9;AL # HEBREW LETTER YOD
+05DA;AL # HEBREW LETTER FINAL KAF
+05DB;AL # HEBREW LETTER KAF
+05DC;AL # HEBREW LETTER LAMED
+05DD;AL # HEBREW LETTER FINAL MEM
+05DE;AL # HEBREW LETTER MEM
+05DF;AL # HEBREW LETTER FINAL NUN
+05E0;AL # HEBREW LETTER NUN
+05E1;AL # HEBREW LETTER SAMEKH
+05E2;AL # HEBREW LETTER AYIN
+05E3;AL # HEBREW LETTER FINAL PE
+05E4;AL # HEBREW LETTER PE
+05E5;AL # HEBREW LETTER FINAL TSADI
+05E6;AL # HEBREW LETTER TSADI
+05E7;AL # HEBREW LETTER QOF
+05E8;AL # HEBREW LETTER RESH
+05E9;AL # HEBREW LETTER SHIN
+05EA;AL # HEBREW LETTER TAV
+05F0;AL # HEBREW LIGATURE YIDDISH DOUBLE VAV
+05F1;AL # HEBREW LIGATURE YIDDISH VAV YOD
+05F2;AL # HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3;AL # HEBREW PUNCTUATION GERESH
+05F4;AL # HEBREW PUNCTUATION GERSHAYIM
+0600;AL # ARABIC NUMBER SIGN
+0601;AL # ARABIC SIGN SANAH
+0602;AL # ARABIC FOOTNOTE MARKER
+0603;AL # ARABIC SIGN SAFHA
+0606;AL # ARABIC-INDIC CUBE ROOT
+0607;AL # ARABIC-INDIC FOURTH ROOT
+0608;AL # ARABIC RAY
+0609;PO # ARABIC-INDIC PER MILLE SIGN
+060A;PO # ARABIC-INDIC PER TEN THOUSAND SIGN
+060B;PO # AFGHANI SIGN
+060C;IS # ARABIC COMMA
+060D;IS # ARABIC DATE SEPARATOR
+060E;AL # ARABIC POETIC VERSE SIGN
+060F;AL # ARABIC SIGN MISRA
+0610;CM # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611;CM # ARABIC SIGN ALAYHE ASSALLAM
+0612;CM # ARABIC SIGN RAHMATULLAH ALAYHE
+0613;CM # ARABIC SIGN RADI ALLAHOU ANHU
+0614;CM # ARABIC SIGN TAKHALLUS
+0615;CM # ARABIC SMALL HIGH TAH
+0616;CM # ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH
+0617;CM # ARABIC SMALL HIGH ZAIN
+0618;CM # ARABIC SMALL FATHA
+0619;CM # ARABIC SMALL DAMMA
+061A;CM # ARABIC SMALL KASRA
+061B;EX # ARABIC SEMICOLON
+061E;EX # ARABIC TRIPLE DOT PUNCTUATION MARK
+061F;EX # ARABIC QUESTION MARK
+0621;AL # ARABIC LETTER HAMZA
+0622;AL # ARABIC LETTER ALEF WITH MADDA ABOVE
+0623;AL # ARABIC LETTER ALEF WITH HAMZA ABOVE
+0624;AL # ARABIC LETTER WAW WITH HAMZA ABOVE
+0625;AL # ARABIC LETTER ALEF WITH HAMZA BELOW
+0626;AL # ARABIC LETTER YEH WITH HAMZA ABOVE
+0627;AL # ARABIC LETTER ALEF
+0628;AL # ARABIC LETTER BEH
+0629;AL # ARABIC LETTER TEH MARBUTA
+062A;AL # ARABIC LETTER TEH
+062B;AL # ARABIC LETTER THEH
+062C;AL # ARABIC LETTER JEEM
+062D;AL # ARABIC LETTER HAH
+062E;AL # ARABIC LETTER KHAH
+062F;AL # ARABIC LETTER DAL
+0630;AL # ARABIC LETTER THAL
+0631;AL # ARABIC LETTER REH
+0632;AL # ARABIC LETTER ZAIN
+0633;AL # ARABIC LETTER SEEN
+0634;AL # ARABIC LETTER SHEEN
+0635;AL # ARABIC LETTER SAD
+0636;AL # ARABIC LETTER DAD
+0637;AL # ARABIC LETTER TAH
+0638;AL # ARABIC LETTER ZAH
+0639;AL # ARABIC LETTER AIN
+063A;AL # ARABIC LETTER GHAIN
+063B;AL # ARABIC LETTER KEHEH WITH TWO DOTS ABOVE
+063C;AL # ARABIC LETTER KEHEH WITH THREE DOTS BELOW
+063D;AL # ARABIC LETTER FARSI YEH WITH INVERTED V
+063E;AL # ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE
+063F;AL # ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0640;AL # ARABIC TATWEEL
+0641;AL # ARABIC LETTER FEH
+0642;AL # ARABIC LETTER QAF
+0643;AL # ARABIC LETTER KAF
+0644;AL # ARABIC LETTER LAM
+0645;AL # ARABIC LETTER MEEM
+0646;AL # ARABIC LETTER NOON
+0647;AL # ARABIC LETTER HEH
+0648;AL # ARABIC LETTER WAW
+0649;AL # ARABIC LETTER ALEF MAKSURA
+064A;AL # ARABIC LETTER YEH
+064B;CM # ARABIC FATHATAN
+064C;CM # ARABIC DAMMATAN
+064D;CM # ARABIC KASRATAN
+064E;CM # ARABIC FATHA
+064F;CM # ARABIC DAMMA
+0650;CM # ARABIC KASRA
+0651;CM # ARABIC SHADDA
+0652;CM # ARABIC SUKUN
+0653;CM # ARABIC MADDAH ABOVE
+0654;CM # ARABIC HAMZA ABOVE
+0655;CM # ARABIC HAMZA BELOW
+0656;CM # ARABIC SUBSCRIPT ALEF
+0657;CM # ARABIC INVERTED DAMMA
+0658;CM # ARABIC MARK NOON GHUNNA
+0659;CM # ARABIC ZWARAKAY
+065A;CM # ARABIC VOWEL SIGN SMALL V ABOVE
+065B;CM # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
+065C;CM # ARABIC VOWEL SIGN DOT BELOW
+065D;CM # ARABIC REVERSED DAMMA
+065E;CM # ARABIC FATHA WITH TWO DOTS
+0660;NU # ARABIC-INDIC DIGIT ZERO
+0661;NU # ARABIC-INDIC DIGIT ONE
+0662;NU # ARABIC-INDIC DIGIT TWO
+0663;NU # ARABIC-INDIC DIGIT THREE
+0664;NU # ARABIC-INDIC DIGIT FOUR
+0665;NU # ARABIC-INDIC DIGIT FIVE
+0666;NU # ARABIC-INDIC DIGIT SIX
+0667;NU # ARABIC-INDIC DIGIT SEVEN
+0668;NU # ARABIC-INDIC DIGIT EIGHT
+0669;NU # ARABIC-INDIC DIGIT NINE
+066A;PO # ARABIC PERCENT SIGN
+066B;NU # ARABIC DECIMAL SEPARATOR
+066C;NU # ARABIC THOUSANDS SEPARATOR
+066D;AL # ARABIC FIVE POINTED STAR
+066E;AL # ARABIC LETTER DOTLESS BEH
+066F;AL # ARABIC LETTER DOTLESS QAF
+0670;CM # ARABIC LETTER SUPERSCRIPT ALEF
+0671;AL # ARABIC LETTER ALEF WASLA
+0672;AL # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0673;AL # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0674;AL # ARABIC LETTER HIGH HAMZA
+0675;AL # ARABIC LETTER HIGH HAMZA ALEF
+0676;AL # ARABIC LETTER HIGH HAMZA WAW
+0677;AL # ARABIC LETTER U WITH HAMZA ABOVE
+0678;AL # ARABIC LETTER HIGH HAMZA YEH
+0679;AL # ARABIC LETTER TTEH
+067A;AL # ARABIC LETTER TTEHEH
+067B;AL # ARABIC LETTER BEEH
+067C;AL # ARABIC LETTER TEH WITH RING
+067D;AL # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067E;AL # ARABIC LETTER PEH
+067F;AL # ARABIC LETTER TEHEH
+0680;AL # ARABIC LETTER BEHEH
+0681;AL # ARABIC LETTER HAH WITH HAMZA ABOVE
+0682;AL # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0683;AL # ARABIC LETTER NYEH
+0684;AL # ARABIC LETTER DYEH
+0685;AL # ARABIC LETTER HAH WITH THREE DOTS ABOVE
+0686;AL # ARABIC LETTER TCHEH
+0687;AL # ARABIC LETTER TCHEHEH
+0688;AL # ARABIC LETTER DDAL
+0689;AL # ARABIC LETTER DAL WITH RING
+068A;AL # ARABIC LETTER DAL WITH DOT BELOW
+068B;AL # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068C;AL # ARABIC LETTER DAHAL
+068D;AL # ARABIC LETTER DDAHAL
+068E;AL # ARABIC LETTER DUL
+068F;AL # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690;AL # ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+0691;AL # ARABIC LETTER RREH
+0692;AL # ARABIC LETTER REH WITH SMALL V
+0693;AL # ARABIC LETTER REH WITH RING
+0694;AL # ARABIC LETTER REH WITH DOT BELOW
+0695;AL # ARABIC LETTER REH WITH SMALL V BELOW
+0696;AL # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697;AL # ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698;AL # ARABIC LETTER JEH
+0699;AL # ARABIC LETTER REH WITH FOUR DOTS ABOVE
+069A;AL # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069B;AL # ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C;AL # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+069D;AL # ARABIC LETTER SAD WITH TWO DOTS BELOW
+069E;AL # ARABIC LETTER SAD WITH THREE DOTS ABOVE
+069F;AL # ARABIC LETTER TAH WITH THREE DOTS ABOVE
+06A0;AL # ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06A1;AL # ARABIC LETTER DOTLESS FEH
+06A2;AL # ARABIC LETTER FEH WITH DOT MOVED BELOW
+06A3;AL # ARABIC LETTER FEH WITH DOT BELOW
+06A4;AL # ARABIC LETTER VEH
+06A5;AL # ARABIC LETTER FEH WITH THREE DOTS BELOW
+06A6;AL # ARABIC LETTER PEHEH
+06A7;AL # ARABIC LETTER QAF WITH DOT ABOVE
+06A8;AL # ARABIC LETTER QAF WITH THREE DOTS ABOVE
+06A9;AL # ARABIC LETTER KEHEH
+06AA;AL # ARABIC LETTER SWASH KAF
+06AB;AL # ARABIC LETTER KAF WITH RING
+06AC;AL # ARABIC LETTER KAF WITH DOT ABOVE
+06AD;AL # ARABIC LETTER NG
+06AE;AL # ARABIC LETTER KAF WITH THREE DOTS BELOW
+06AF;AL # ARABIC LETTER GAF
+06B0;AL # ARABIC LETTER GAF WITH RING
+06B1;AL # ARABIC LETTER NGOEH
+06B2;AL # ARABIC LETTER GAF WITH TWO DOTS BELOW
+06B3;AL # ARABIC LETTER GUEH
+06B4;AL # ARABIC LETTER GAF WITH THREE DOTS ABOVE
+06B5;AL # ARABIC LETTER LAM WITH SMALL V
+06B6;AL # ARABIC LETTER LAM WITH DOT ABOVE
+06B7;AL # ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06B8;AL # ARABIC LETTER LAM WITH THREE DOTS BELOW
+06B9;AL # ARABIC LETTER NOON WITH DOT BELOW
+06BA;AL # ARABIC LETTER NOON GHUNNA
+06BB;AL # ARABIC LETTER RNOON
+06BC;AL # ARABIC LETTER NOON WITH RING
+06BD;AL # ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06BE;AL # ARABIC LETTER HEH DOACHASHMEE
+06BF;AL # ARABIC LETTER TCHEH WITH DOT ABOVE
+06C0;AL # ARABIC LETTER HEH WITH YEH ABOVE
+06C1;AL # ARABIC LETTER HEH GOAL
+06C2;AL # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+06C3;AL # ARABIC LETTER TEH MARBUTA GOAL
+06C4;AL # ARABIC LETTER WAW WITH RING
+06C5;AL # ARABIC LETTER KIRGHIZ OE
+06C6;AL # ARABIC LETTER OE
+06C7;AL # ARABIC LETTER U
+06C8;AL # ARABIC LETTER YU
+06C9;AL # ARABIC LETTER KIRGHIZ YU
+06CA;AL # ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06CB;AL # ARABIC LETTER VE
+06CC;AL # ARABIC LETTER FARSI YEH
+06CD;AL # ARABIC LETTER YEH WITH TAIL
+06CE;AL # ARABIC LETTER YEH WITH SMALL V
+06CF;AL # ARABIC LETTER WAW WITH DOT ABOVE
+06D0;AL # ARABIC LETTER E
+06D1;AL # ARABIC LETTER YEH WITH THREE DOTS BELOW
+06D2;AL # ARABIC LETTER YEH BARREE
+06D3;AL # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4;EX # ARABIC FULL STOP
+06D5;AL # ARABIC LETTER AE
+06D6;CM # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7;CM # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8;CM # ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9;CM # ARABIC SMALL HIGH LAM ALEF
+06DA;CM # ARABIC SMALL HIGH JEEM
+06DB;CM # ARABIC SMALL HIGH THREE DOTS
+06DC;CM # ARABIC SMALL HIGH SEEN
+06DD;AL # ARABIC END OF AYAH
+06DE;CM # ARABIC START OF RUB EL HIZB
+06DF;CM # ARABIC SMALL HIGH ROUNDED ZERO
+06E0;CM # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1;CM # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2;CM # ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3;CM # ARABIC SMALL LOW SEEN
+06E4;CM # ARABIC SMALL HIGH MADDA
+06E5;AL # ARABIC SMALL WAW
+06E6;AL # ARABIC SMALL YEH
+06E7;CM # ARABIC SMALL HIGH YEH
+06E8;CM # ARABIC SMALL HIGH NOON
+06E9;AL # ARABIC PLACE OF SAJDAH
+06EA;CM # ARABIC EMPTY CENTRE LOW STOP
+06EB;CM # ARABIC EMPTY CENTRE HIGH STOP
+06EC;CM # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED;CM # ARABIC SMALL LOW MEEM
+06EE;AL # ARABIC LETTER DAL WITH INVERTED V
+06EF;AL # ARABIC LETTER REH WITH INVERTED V
+06F0;NU # EXTENDED ARABIC-INDIC DIGIT ZERO
+06F1;NU # EXTENDED ARABIC-INDIC DIGIT ONE
+06F2;NU # EXTENDED ARABIC-INDIC DIGIT TWO
+06F3;NU # EXTENDED ARABIC-INDIC DIGIT THREE
+06F4;NU # EXTENDED ARABIC-INDIC DIGIT FOUR
+06F5;NU # EXTENDED ARABIC-INDIC DIGIT FIVE
+06F6;NU # EXTENDED ARABIC-INDIC DIGIT SIX
+06F7;NU # EXTENDED ARABIC-INDIC DIGIT SEVEN
+06F8;NU # EXTENDED ARABIC-INDIC DIGIT EIGHT
+06F9;NU # EXTENDED ARABIC-INDIC DIGIT NINE
+06FA;AL # ARABIC LETTER SHEEN WITH DOT BELOW
+06FB;AL # ARABIC LETTER DAD WITH DOT BELOW
+06FC;AL # ARABIC LETTER GHAIN WITH DOT BELOW
+06FD;AL # ARABIC SIGN SINDHI AMPERSAND
+06FE;AL # ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF;AL # ARABIC LETTER HEH WITH INVERTED V
+0700;AL # SYRIAC END OF PARAGRAPH
+0701;AL # SYRIAC SUPRALINEAR FULL STOP
+0702;AL # SYRIAC SUBLINEAR FULL STOP
+0703;AL # SYRIAC SUPRALINEAR COLON
+0704;AL # SYRIAC SUBLINEAR COLON
+0705;AL # SYRIAC HORIZONTAL COLON
+0706;AL # SYRIAC COLON SKEWED LEFT
+0707;AL # SYRIAC COLON SKEWED RIGHT
+0708;AL # SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709;AL # SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070A;AL # SYRIAC CONTRACTION
+070B;AL # SYRIAC HARKLEAN OBELUS
+070C;AL # SYRIAC HARKLEAN METOBELUS
+070D;AL # SYRIAC HARKLEAN ASTERISCUS
+070F;AL # SYRIAC ABBREVIATION MARK
+0710;AL # SYRIAC LETTER ALAPH
+0711;CM # SYRIAC LETTER SUPERSCRIPT ALAPH
+0712;AL # SYRIAC LETTER BETH
+0713;AL # SYRIAC LETTER GAMAL
+0714;AL # SYRIAC LETTER GAMAL GARSHUNI
+0715;AL # SYRIAC LETTER DALATH
+0716;AL # SYRIAC LETTER DOTLESS DALATH RISH
+0717;AL # SYRIAC LETTER HE
+0718;AL # SYRIAC LETTER WAW
+0719;AL # SYRIAC LETTER ZAIN
+071A;AL # SYRIAC LETTER HETH
+071B;AL # SYRIAC LETTER TETH
+071C;AL # SYRIAC LETTER TETH GARSHUNI
+071D;AL # SYRIAC LETTER YUDH
+071E;AL # SYRIAC LETTER YUDH HE
+071F;AL # SYRIAC LETTER KAPH
+0720;AL # SYRIAC LETTER LAMADH
+0721;AL # SYRIAC LETTER MIM
+0722;AL # SYRIAC LETTER NUN
+0723;AL # SYRIAC LETTER SEMKATH
+0724;AL # SYRIAC LETTER FINAL SEMKATH
+0725;AL # SYRIAC LETTER E
+0726;AL # SYRIAC LETTER PE
+0727;AL # SYRIAC LETTER REVERSED PE
+0728;AL # SYRIAC LETTER SADHE
+0729;AL # SYRIAC LETTER QAPH
+072A;AL # SYRIAC LETTER RISH
+072B;AL # SYRIAC LETTER SHIN
+072C;AL # SYRIAC LETTER TAW
+072D;AL # SYRIAC LETTER PERSIAN BHETH
+072E;AL # SYRIAC LETTER PERSIAN GHAMAL
+072F;AL # SYRIAC LETTER PERSIAN DHALATH
+0730;CM # SYRIAC PTHAHA ABOVE
+0731;CM # SYRIAC PTHAHA BELOW
+0732;CM # SYRIAC PTHAHA DOTTED
+0733;CM # SYRIAC ZQAPHA ABOVE
+0734;CM # SYRIAC ZQAPHA BELOW
+0735;CM # SYRIAC ZQAPHA DOTTED
+0736;CM # SYRIAC RBASA ABOVE
+0737;CM # SYRIAC RBASA BELOW
+0738;CM # SYRIAC DOTTED ZLAMA HORIZONTAL
+0739;CM # SYRIAC DOTTED ZLAMA ANGULAR
+073A;CM # SYRIAC HBASA ABOVE
+073B;CM # SYRIAC HBASA BELOW
+073C;CM # SYRIAC HBASA-ESASA DOTTED
+073D;CM # SYRIAC ESASA ABOVE
+073E;CM # SYRIAC ESASA BELOW
+073F;CM # SYRIAC RWAHA
+0740;CM # SYRIAC FEMININE DOT
+0741;CM # SYRIAC QUSHSHAYA
+0742;CM # SYRIAC RUKKAKHA
+0743;CM # SYRIAC TWO VERTICAL DOTS ABOVE
+0744;CM # SYRIAC TWO VERTICAL DOTS BELOW
+0745;CM # SYRIAC THREE DOTS ABOVE
+0746;CM # SYRIAC THREE DOTS BELOW
+0747;CM # SYRIAC OBLIQUE LINE ABOVE
+0748;CM # SYRIAC OBLIQUE LINE BELOW
+0749;CM # SYRIAC MUSIC
+074A;CM # SYRIAC BARREKH
+074D;AL # SYRIAC LETTER SOGDIAN ZHAIN
+074E;AL # SYRIAC LETTER SOGDIAN KHAPH
+074F;AL # SYRIAC LETTER SOGDIAN FE
+0750;AL # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW
+0751;AL # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE
+0752;AL # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW
+0753;AL # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE
+0754;AL # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE
+0755;AL # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW
+0756;AL # ARABIC LETTER BEH WITH SMALL V
+0757;AL # ARABIC LETTER HAH WITH TWO DOTS ABOVE
+0758;AL # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW
+0759;AL # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH
+075A;AL # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW
+075B;AL # ARABIC LETTER REH WITH STROKE
+075C;AL # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE
+075D;AL # ARABIC LETTER AIN WITH TWO DOTS ABOVE
+075E;AL # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE
+075F;AL # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE
+0760;AL # ARABIC LETTER FEH WITH TWO DOTS BELOW
+0761;AL # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW
+0762;AL # ARABIC LETTER KEHEH WITH DOT ABOVE
+0763;AL # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE
+0764;AL # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW
+0765;AL # ARABIC LETTER MEEM WITH DOT ABOVE
+0766;AL # ARABIC LETTER MEEM WITH DOT BELOW
+0767;AL # ARABIC LETTER NOON WITH TWO DOTS BELOW
+0768;AL # ARABIC LETTER NOON WITH SMALL TAH
+0769;AL # ARABIC LETTER NOON WITH SMALL V
+076A;AL # ARABIC LETTER LAM WITH BAR
+076B;AL # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE
+076C;AL # ARABIC LETTER REH WITH HAMZA ABOVE
+076D;AL # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+076E;AL # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW
+076F;AL # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0770;AL # ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0771;AL # ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0772;AL # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE
+0773;AL # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0774;AL # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0775;AL # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0776;AL # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0777;AL # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+0778;AL # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0779;AL # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+077A;AL # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+077B;AL # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+077C;AL # ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+077D;AL # ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE
+077E;AL # ARABIC LETTER SEEN WITH INVERTED V
+077F;AL # ARABIC LETTER KAF WITH TWO DOTS ABOVE
+0780;AL # THAANA LETTER HAA
+0781;AL # THAANA LETTER SHAVIYANI
+0782;AL # THAANA LETTER NOONU
+0783;AL # THAANA LETTER RAA
+0784;AL # THAANA LETTER BAA
+0785;AL # THAANA LETTER LHAVIYANI
+0786;AL # THAANA LETTER KAAFU
+0787;AL # THAANA LETTER ALIFU
+0788;AL # THAANA LETTER VAAVU
+0789;AL # THAANA LETTER MEEMU
+078A;AL # THAANA LETTER FAAFU
+078B;AL # THAANA LETTER DHAALU
+078C;AL # THAANA LETTER THAA
+078D;AL # THAANA LETTER LAAMU
+078E;AL # THAANA LETTER GAAFU
+078F;AL # THAANA LETTER GNAVIYANI
+0790;AL # THAANA LETTER SEENU
+0791;AL # THAANA LETTER DAVIYANI
+0792;AL # THAANA LETTER ZAVIYANI
+0793;AL # THAANA LETTER TAVIYANI
+0794;AL # THAANA LETTER YAA
+0795;AL # THAANA LETTER PAVIYANI
+0796;AL # THAANA LETTER JAVIYANI
+0797;AL # THAANA LETTER CHAVIYANI
+0798;AL # THAANA LETTER TTAA
+0799;AL # THAANA LETTER HHAA
+079A;AL # THAANA LETTER KHAA
+079B;AL # THAANA LETTER THAALU
+079C;AL # THAANA LETTER ZAA
+079D;AL # THAANA LETTER SHEENU
+079E;AL # THAANA LETTER SAADHU
+079F;AL # THAANA LETTER DAADHU
+07A0;AL # THAANA LETTER TO
+07A1;AL # THAANA LETTER ZO
+07A2;AL # THAANA LETTER AINU
+07A3;AL # THAANA LETTER GHAINU
+07A4;AL # THAANA LETTER QAAFU
+07A5;AL # THAANA LETTER WAAVU
+07A6;CM # THAANA ABAFILI
+07A7;CM # THAANA AABAAFILI
+07A8;CM # THAANA IBIFILI
+07A9;CM # THAANA EEBEEFILI
+07AA;CM # THAANA UBUFILI
+07AB;CM # THAANA OOBOOFILI
+07AC;CM # THAANA EBEFILI
+07AD;CM # THAANA EYBEYFILI
+07AE;CM # THAANA OBOFILI
+07AF;CM # THAANA OABOAFILI
+07B0;CM # THAANA SUKUN
+07B1;AL # THAANA LETTER NAA
+07C0;NU # NKO DIGIT ZERO
+07C1;NU # NKO DIGIT ONE
+07C2;NU # NKO DIGIT TWO
+07C3;NU # NKO DIGIT THREE
+07C4;NU # NKO DIGIT FOUR
+07C5;NU # NKO DIGIT FIVE
+07C6;NU # NKO DIGIT SIX
+07C7;NU # NKO DIGIT SEVEN
+07C8;NU # NKO DIGIT EIGHT
+07C9;NU # NKO DIGIT NINE
+07CA;AL # NKO LETTER A
+07CB;AL # NKO LETTER EE
+07CC;AL # NKO LETTER I
+07CD;AL # NKO LETTER E
+07CE;AL # NKO LETTER U
+07CF;AL # NKO LETTER OO
+07D0;AL # NKO LETTER O
+07D1;AL # NKO LETTER DAGBASINNA
+07D2;AL # NKO LETTER N
+07D3;AL # NKO LETTER BA
+07D4;AL # NKO LETTER PA
+07D5;AL # NKO LETTER TA
+07D6;AL # NKO LETTER JA
+07D7;AL # NKO LETTER CHA
+07D8;AL # NKO LETTER DA
+07D9;AL # NKO LETTER RA
+07DA;AL # NKO LETTER RRA
+07DB;AL # NKO LETTER SA
+07DC;AL # NKO LETTER GBA
+07DD;AL # NKO LETTER FA
+07DE;AL # NKO LETTER KA
+07DF;AL # NKO LETTER LA
+07E0;AL # NKO LETTER NA WOLOSO
+07E1;AL # NKO LETTER MA
+07E2;AL # NKO LETTER NYA
+07E3;AL # NKO LETTER NA
+07E4;AL # NKO LETTER HA
+07E5;AL # NKO LETTER WA
+07E6;AL # NKO LETTER YA
+07E7;AL # NKO LETTER NYA WOLOSO
+07E8;AL # NKO LETTER JONA JA
+07E9;AL # NKO LETTER JONA CHA
+07EA;AL # NKO LETTER JONA RA
+07EB;CM # NKO COMBINING SHORT HIGH TONE
+07EC;CM # NKO COMBINING SHORT LOW TONE
+07ED;CM # NKO COMBINING SHORT RISING TONE
+07EE;CM # NKO COMBINING LONG DESCENDING TONE
+07EF;CM # NKO COMBINING LONG HIGH TONE
+07F0;CM # NKO COMBINING LONG LOW TONE
+07F1;CM # NKO COMBINING LONG RISING TONE
+07F2;CM # NKO COMBINING NASALIZATION MARK
+07F3;CM # NKO COMBINING DOUBLE DOT ABOVE
+07F4;AL # NKO HIGH TONE APOSTROPHE
+07F5;AL # NKO LOW TONE APOSTROPHE
+07F6;AL # NKO SYMBOL OO DENNEN
+07F7;AL # NKO SYMBOL GBAKURUNEN
+07F8;IS # NKO COMMA
+07F9;EX # NKO EXCLAMATION MARK
+07FA;AL # NKO LAJANYALAN
+0901;CM # DEVANAGARI SIGN CANDRABINDU
+0902;CM # DEVANAGARI SIGN ANUSVARA
+0903;CM # DEVANAGARI SIGN VISARGA
+0904;AL # DEVANAGARI LETTER SHORT A
+0905;AL # DEVANAGARI LETTER A
+0906;AL # DEVANAGARI LETTER AA
+0907;AL # DEVANAGARI LETTER I
+0908;AL # DEVANAGARI LETTER II
+0909;AL # DEVANAGARI LETTER U
+090A;AL # DEVANAGARI LETTER UU
+090B;AL # DEVANAGARI LETTER VOCALIC R
+090C;AL # DEVANAGARI LETTER VOCALIC L
+090D;AL # DEVANAGARI LETTER CANDRA E
+090E;AL # DEVANAGARI LETTER SHORT E
+090F;AL # DEVANAGARI LETTER E
+0910;AL # DEVANAGARI LETTER AI
+0911;AL # DEVANAGARI LETTER CANDRA O
+0912;AL # DEVANAGARI LETTER SHORT O
+0913;AL # DEVANAGARI LETTER O
+0914;AL # DEVANAGARI LETTER AU
+0915;AL # DEVANAGARI LETTER KA
+0916;AL # DEVANAGARI LETTER KHA
+0917;AL # DEVANAGARI LETTER GA
+0918;AL # DEVANAGARI LETTER GHA
+0919;AL # DEVANAGARI LETTER NGA
+091A;AL # DEVANAGARI LETTER CA
+091B;AL # DEVANAGARI LETTER CHA
+091C;AL # DEVANAGARI LETTER JA
+091D;AL # DEVANAGARI LETTER JHA
+091E;AL # DEVANAGARI LETTER NYA
+091F;AL # DEVANAGARI LETTER TTA
+0920;AL # DEVANAGARI LETTER TTHA
+0921;AL # DEVANAGARI LETTER DDA
+0922;AL # DEVANAGARI LETTER DDHA
+0923;AL # DEVANAGARI LETTER NNA
+0924;AL # DEVANAGARI LETTER TA
+0925;AL # DEVANAGARI LETTER THA
+0926;AL # DEVANAGARI LETTER DA
+0927;AL # DEVANAGARI LETTER DHA
+0928;AL # DEVANAGARI LETTER NA
+0929;AL # DEVANAGARI LETTER NNNA
+092A;AL # DEVANAGARI LETTER PA
+092B;AL # DEVANAGARI LETTER PHA
+092C;AL # DEVANAGARI LETTER BA
+092D;AL # DEVANAGARI LETTER BHA
+092E;AL # DEVANAGARI LETTER MA
+092F;AL # DEVANAGARI LETTER YA
+0930;AL # DEVANAGARI LETTER RA
+0931;AL # DEVANAGARI LETTER RRA
+0932;AL # DEVANAGARI LETTER LA
+0933;AL # DEVANAGARI LETTER LLA
+0934;AL # DEVANAGARI LETTER LLLA
+0935;AL # DEVANAGARI LETTER VA
+0936;AL # DEVANAGARI LETTER SHA
+0937;AL # DEVANAGARI LETTER SSA
+0938;AL # DEVANAGARI LETTER SA
+0939;AL # DEVANAGARI LETTER HA
+093C;CM # DEVANAGARI SIGN NUKTA
+093D;AL # DEVANAGARI SIGN AVAGRAHA
+093E;CM # DEVANAGARI VOWEL SIGN AA
+093F;CM # DEVANAGARI VOWEL SIGN I
+0940;CM # DEVANAGARI VOWEL SIGN II
+0941;CM # DEVANAGARI VOWEL SIGN U
+0942;CM # DEVANAGARI VOWEL SIGN UU
+0943;CM # DEVANAGARI VOWEL SIGN VOCALIC R
+0944;CM # DEVANAGARI VOWEL SIGN VOCALIC RR
+0945;CM # DEVANAGARI VOWEL SIGN CANDRA E
+0946;CM # DEVANAGARI VOWEL SIGN SHORT E
+0947;CM # DEVANAGARI VOWEL SIGN E
+0948;CM # DEVANAGARI VOWEL SIGN AI
+0949;CM # DEVANAGARI VOWEL SIGN CANDRA O
+094A;CM # DEVANAGARI VOWEL SIGN SHORT O
+094B;CM # DEVANAGARI VOWEL SIGN O
+094C;CM # DEVANAGARI VOWEL SIGN AU
+094D;CM # DEVANAGARI SIGN VIRAMA
+0950;AL # DEVANAGARI OM
+0951;CM # DEVANAGARI STRESS SIGN UDATTA
+0952;CM # DEVANAGARI STRESS SIGN ANUDATTA
+0953;CM # DEVANAGARI GRAVE ACCENT
+0954;CM # DEVANAGARI ACUTE ACCENT
+0958;AL # DEVANAGARI LETTER QA
+0959;AL # DEVANAGARI LETTER KHHA
+095A;AL # DEVANAGARI LETTER GHHA
+095B;AL # DEVANAGARI LETTER ZA
+095C;AL # DEVANAGARI LETTER DDDHA
+095D;AL # DEVANAGARI LETTER RHA
+095E;AL # DEVANAGARI LETTER FA
+095F;AL # DEVANAGARI LETTER YYA
+0960;AL # DEVANAGARI LETTER VOCALIC RR
+0961;AL # DEVANAGARI LETTER VOCALIC LL
+0962;CM # DEVANAGARI VOWEL SIGN VOCALIC L
+0963;CM # DEVANAGARI VOWEL SIGN VOCALIC LL
+0964;BA # DEVANAGARI DANDA
+0965;BA # DEVANAGARI DOUBLE DANDA
+0966;NU # DEVANAGARI DIGIT ZERO
+0967;NU # DEVANAGARI DIGIT ONE
+0968;NU # DEVANAGARI DIGIT TWO
+0969;NU # DEVANAGARI DIGIT THREE
+096A;NU # DEVANAGARI DIGIT FOUR
+096B;NU # DEVANAGARI DIGIT FIVE
+096C;NU # DEVANAGARI DIGIT SIX
+096D;NU # DEVANAGARI DIGIT SEVEN
+096E;NU # DEVANAGARI DIGIT EIGHT
+096F;NU # DEVANAGARI DIGIT NINE
+0970;AL # DEVANAGARI ABBREVIATION SIGN
+0971;AL # DEVANAGARI SIGN HIGH SPACING DOT
+0972;AL # DEVANAGARI LETTER CANDRA A
+097B;AL # DEVANAGARI LETTER GGA
+097C;AL # DEVANAGARI LETTER JJA
+097D;AL # DEVANAGARI LETTER GLOTTAL STOP
+097E;AL # DEVANAGARI LETTER DDDA
+097F;AL # DEVANAGARI LETTER BBA
+0981;CM # BENGALI SIGN CANDRABINDU
+0982;CM # BENGALI SIGN ANUSVARA
+0983;CM # BENGALI SIGN VISARGA
+0985;AL # BENGALI LETTER A
+0986;AL # BENGALI LETTER AA
+0987;AL # BENGALI LETTER I
+0988;AL # BENGALI LETTER II
+0989;AL # BENGALI LETTER U
+098A;AL # BENGALI LETTER UU
+098B;AL # BENGALI LETTER VOCALIC R
+098C;AL # BENGALI LETTER VOCALIC L
+098F;AL # BENGALI LETTER E
+0990;AL # BENGALI LETTER AI
+0993;AL # BENGALI LETTER O
+0994;AL # BENGALI LETTER AU
+0995;AL # BENGALI LETTER KA
+0996;AL # BENGALI LETTER KHA
+0997;AL # BENGALI LETTER GA
+0998;AL # BENGALI LETTER GHA
+0999;AL # BENGALI LETTER NGA
+099A;AL # BENGALI LETTER CA
+099B;AL # BENGALI LETTER CHA
+099C;AL # BENGALI LETTER JA
+099D;AL # BENGALI LETTER JHA
+099E;AL # BENGALI LETTER NYA
+099F;AL # BENGALI LETTER TTA
+09A0;AL # BENGALI LETTER TTHA
+09A1;AL # BENGALI LETTER DDA
+09A2;AL # BENGALI LETTER DDHA
+09A3;AL # BENGALI LETTER NNA
+09A4;AL # BENGALI LETTER TA
+09A5;AL # BENGALI LETTER THA
+09A6;AL # BENGALI LETTER DA
+09A7;AL # BENGALI LETTER DHA
+09A8;AL # BENGALI LETTER NA
+09AA;AL # BENGALI LETTER PA
+09AB;AL # BENGALI LETTER PHA
+09AC;AL # BENGALI LETTER BA
+09AD;AL # BENGALI LETTER BHA
+09AE;AL # BENGALI LETTER MA
+09AF;AL # BENGALI LETTER YA
+09B0;AL # BENGALI LETTER RA
+09B2;AL # BENGALI LETTER LA
+09B6;AL # BENGALI LETTER SHA
+09B7;AL # BENGALI LETTER SSA
+09B8;AL # BENGALI LETTER SA
+09B9;AL # BENGALI LETTER HA
+09BC;CM # BENGALI SIGN NUKTA
+09BD;AL # BENGALI SIGN AVAGRAHA
+09BE;CM # BENGALI VOWEL SIGN AA
+09BF;CM # BENGALI VOWEL SIGN I
+09C0;CM # BENGALI VOWEL SIGN II
+09C1;CM # BENGALI VOWEL SIGN U
+09C2;CM # BENGALI VOWEL SIGN UU
+09C3;CM # BENGALI VOWEL SIGN VOCALIC R
+09C4;CM # BENGALI VOWEL SIGN VOCALIC RR
+09C7;CM # BENGALI VOWEL SIGN E
+09C8;CM # BENGALI VOWEL SIGN AI
+09CB;CM # BENGALI VOWEL SIGN O
+09CC;CM # BENGALI VOWEL SIGN AU
+09CD;CM # BENGALI SIGN VIRAMA
+09CE;AL # BENGALI LETTER KHANDA TA
+09D7;CM # BENGALI AU LENGTH MARK
+09DC;AL # BENGALI LETTER RRA
+09DD;AL # BENGALI LETTER RHA
+09DF;AL # BENGALI LETTER YYA
+09E0;AL # BENGALI LETTER VOCALIC RR
+09E1;AL # BENGALI LETTER VOCALIC LL
+09E2;CM # BENGALI VOWEL SIGN VOCALIC L
+09E3;CM # BENGALI VOWEL SIGN VOCALIC LL
+09E6;NU # BENGALI DIGIT ZERO
+09E7;NU # BENGALI DIGIT ONE
+09E8;NU # BENGALI DIGIT TWO
+09E9;NU # BENGALI DIGIT THREE
+09EA;NU # BENGALI DIGIT FOUR
+09EB;NU # BENGALI DIGIT FIVE
+09EC;NU # BENGALI DIGIT SIX
+09ED;NU # BENGALI DIGIT SEVEN
+09EE;NU # BENGALI DIGIT EIGHT
+09EF;NU # BENGALI DIGIT NINE
+09F0;AL # BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09F1;AL # BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2;PR # BENGALI RUPEE MARK
+09F3;PR # BENGALI RUPEE SIGN
+09F4;AL # BENGALI CURRENCY NUMERATOR ONE
+09F5;AL # BENGALI CURRENCY NUMERATOR TWO
+09F6;AL # BENGALI CURRENCY NUMERATOR THREE
+09F7;AL # BENGALI CURRENCY NUMERATOR FOUR
+09F8;AL # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9;AL # BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA;AL # BENGALI ISSHAR
+0A01;CM # GURMUKHI SIGN ADAK BINDI
+0A02;CM # GURMUKHI SIGN BINDI
+0A03;CM # GURMUKHI SIGN VISARGA
+0A05;AL # GURMUKHI LETTER A
+0A06;AL # GURMUKHI LETTER AA
+0A07;AL # GURMUKHI LETTER I
+0A08;AL # GURMUKHI LETTER II
+0A09;AL # GURMUKHI LETTER U
+0A0A;AL # GURMUKHI LETTER UU
+0A0F;AL # GURMUKHI LETTER EE
+0A10;AL # GURMUKHI LETTER AI
+0A13;AL # GURMUKHI LETTER OO
+0A14;AL # GURMUKHI LETTER AU
+0A15;AL # GURMUKHI LETTER KA
+0A16;AL # GURMUKHI LETTER KHA
+0A17;AL # GURMUKHI LETTER GA
+0A18;AL # GURMUKHI LETTER GHA
+0A19;AL # GURMUKHI LETTER NGA
+0A1A;AL # GURMUKHI LETTER CA
+0A1B;AL # GURMUKHI LETTER CHA
+0A1C;AL # GURMUKHI LETTER JA
+0A1D;AL # GURMUKHI LETTER JHA
+0A1E;AL # GURMUKHI LETTER NYA
+0A1F;AL # GURMUKHI LETTER TTA
+0A20;AL # GURMUKHI LETTER TTHA
+0A21;AL # GURMUKHI LETTER DDA
+0A22;AL # GURMUKHI LETTER DDHA
+0A23;AL # GURMUKHI LETTER NNA
+0A24;AL # GURMUKHI LETTER TA
+0A25;AL # GURMUKHI LETTER THA
+0A26;AL # GURMUKHI LETTER DA
+0A27;AL # GURMUKHI LETTER DHA
+0A28;AL # GURMUKHI LETTER NA
+0A2A;AL # GURMUKHI LETTER PA
+0A2B;AL # GURMUKHI LETTER PHA
+0A2C;AL # GURMUKHI LETTER BA
+0A2D;AL # GURMUKHI LETTER BHA
+0A2E;AL # GURMUKHI LETTER MA
+0A2F;AL # GURMUKHI LETTER YA
+0A30;AL # GURMUKHI LETTER RA
+0A32;AL # GURMUKHI LETTER LA
+0A33;AL # GURMUKHI LETTER LLA
+0A35;AL # GURMUKHI LETTER VA
+0A36;AL # GURMUKHI LETTER SHA
+0A38;AL # GURMUKHI LETTER SA
+0A39;AL # GURMUKHI LETTER HA
+0A3C;CM # GURMUKHI SIGN NUKTA
+0A3E;CM # GURMUKHI VOWEL SIGN AA
+0A3F;CM # GURMUKHI VOWEL SIGN I
+0A40;CM # GURMUKHI VOWEL SIGN II
+0A41;CM # GURMUKHI VOWEL SIGN U
+0A42;CM # GURMUKHI VOWEL SIGN UU
+0A47;CM # GURMUKHI VOWEL SIGN EE
+0A48;CM # GURMUKHI VOWEL SIGN AI
+0A4B;CM # GURMUKHI VOWEL SIGN OO
+0A4C;CM # GURMUKHI VOWEL SIGN AU
+0A4D;CM # GURMUKHI SIGN VIRAMA
+0A51;CM # GURMUKHI SIGN UDAAT
+0A59;AL # GURMUKHI LETTER KHHA
+0A5A;AL # GURMUKHI LETTER GHHA
+0A5B;AL # GURMUKHI LETTER ZA
+0A5C;AL # GURMUKHI LETTER RRA
+0A5E;AL # GURMUKHI LETTER FA
+0A66;NU # GURMUKHI DIGIT ZERO
+0A67;NU # GURMUKHI DIGIT ONE
+0A68;NU # GURMUKHI DIGIT TWO
+0A69;NU # GURMUKHI DIGIT THREE
+0A6A;NU # GURMUKHI DIGIT FOUR
+0A6B;NU # GURMUKHI DIGIT FIVE
+0A6C;NU # GURMUKHI DIGIT SIX
+0A6D;NU # GURMUKHI DIGIT SEVEN
+0A6E;NU # GURMUKHI DIGIT EIGHT
+0A6F;NU # GURMUKHI DIGIT NINE
+0A70;CM # GURMUKHI TIPPI
+0A71;CM # GURMUKHI ADDAK
+0A72;AL # GURMUKHI IRI
+0A73;AL # GURMUKHI URA
+0A74;AL # GURMUKHI EK ONKAR
+0A75;CM # GURMUKHI SIGN YAKASH
+0A81;CM # GUJARATI SIGN CANDRABINDU
+0A82;CM # GUJARATI SIGN ANUSVARA
+0A83;CM # GUJARATI SIGN VISARGA
+0A85;AL # GUJARATI LETTER A
+0A86;AL # GUJARATI LETTER AA
+0A87;AL # GUJARATI LETTER I
+0A88;AL # GUJARATI LETTER II
+0A89;AL # GUJARATI LETTER U
+0A8A;AL # GUJARATI LETTER UU
+0A8B;AL # GUJARATI LETTER VOCALIC R
+0A8C;AL # GUJARATI LETTER VOCALIC L
+0A8D;AL # GUJARATI VOWEL CANDRA E
+0A8F;AL # GUJARATI LETTER E
+0A90;AL # GUJARATI LETTER AI
+0A91;AL # GUJARATI VOWEL CANDRA O
+0A93;AL # GUJARATI LETTER O
+0A94;AL # GUJARATI LETTER AU
+0A95;AL # GUJARATI LETTER KA
+0A96;AL # GUJARATI LETTER KHA
+0A97;AL # GUJARATI LETTER GA
+0A98;AL # GUJARATI LETTER GHA
+0A99;AL # GUJARATI LETTER NGA
+0A9A;AL # GUJARATI LETTER CA
+0A9B;AL # GUJARATI LETTER CHA
+0A9C;AL # GUJARATI LETTER JA
+0A9D;AL # GUJARATI LETTER JHA
+0A9E;AL # GUJARATI LETTER NYA
+0A9F;AL # GUJARATI LETTER TTA
+0AA0;AL # GUJARATI LETTER TTHA
+0AA1;AL # GUJARATI LETTER DDA
+0AA2;AL # GUJARATI LETTER DDHA
+0AA3;AL # GUJARATI LETTER NNA
+0AA4;AL # GUJARATI LETTER TA
+0AA5;AL # GUJARATI LETTER THA
+0AA6;AL # GUJARATI LETTER DA
+0AA7;AL # GUJARATI LETTER DHA
+0AA8;AL # GUJARATI LETTER NA
+0AAA;AL # GUJARATI LETTER PA
+0AAB;AL # GUJARATI LETTER PHA
+0AAC;AL # GUJARATI LETTER BA
+0AAD;AL # GUJARATI LETTER BHA
+0AAE;AL # GUJARATI LETTER MA
+0AAF;AL # GUJARATI LETTER YA
+0AB0;AL # GUJARATI LETTER RA
+0AB2;AL # GUJARATI LETTER LA
+0AB3;AL # GUJARATI LETTER LLA
+0AB5;AL # GUJARATI LETTER VA
+0AB6;AL # GUJARATI LETTER SHA
+0AB7;AL # GUJARATI LETTER SSA
+0AB8;AL # GUJARATI LETTER SA
+0AB9;AL # GUJARATI LETTER HA
+0ABC;CM # GUJARATI SIGN NUKTA
+0ABD;AL # GUJARATI SIGN AVAGRAHA
+0ABE;CM # GUJARATI VOWEL SIGN AA
+0ABF;CM # GUJARATI VOWEL SIGN I
+0AC0;CM # GUJARATI VOWEL SIGN II
+0AC1;CM # GUJARATI VOWEL SIGN U
+0AC2;CM # GUJARATI VOWEL SIGN UU
+0AC3;CM # GUJARATI VOWEL SIGN VOCALIC R
+0AC4;CM # GUJARATI VOWEL SIGN VOCALIC RR
+0AC5;CM # GUJARATI VOWEL SIGN CANDRA E
+0AC7;CM # GUJARATI VOWEL SIGN E
+0AC8;CM # GUJARATI VOWEL SIGN AI
+0AC9;CM # GUJARATI VOWEL SIGN CANDRA O
+0ACB;CM # GUJARATI VOWEL SIGN O
+0ACC;CM # GUJARATI VOWEL SIGN AU
+0ACD;CM # GUJARATI SIGN VIRAMA
+0AD0;AL # GUJARATI OM
+0AE0;AL # GUJARATI LETTER VOCALIC RR
+0AE1;AL # GUJARATI LETTER VOCALIC LL
+0AE2;CM # GUJARATI VOWEL SIGN VOCALIC L
+0AE3;CM # GUJARATI VOWEL SIGN VOCALIC LL
+0AE6;NU # GUJARATI DIGIT ZERO
+0AE7;NU # GUJARATI DIGIT ONE
+0AE8;NU # GUJARATI DIGIT TWO
+0AE9;NU # GUJARATI DIGIT THREE
+0AEA;NU # GUJARATI DIGIT FOUR
+0AEB;NU # GUJARATI DIGIT FIVE
+0AEC;NU # GUJARATI DIGIT SIX
+0AED;NU # GUJARATI DIGIT SEVEN
+0AEE;NU # GUJARATI DIGIT EIGHT
+0AEF;NU # GUJARATI DIGIT NINE
+0AF1;PR # GUJARATI RUPEE SIGN
+0B01;CM # ORIYA SIGN CANDRABINDU
+0B02;CM # ORIYA SIGN ANUSVARA
+0B03;CM # ORIYA SIGN VISARGA
+0B05;AL # ORIYA LETTER A
+0B06;AL # ORIYA LETTER AA
+0B07;AL # ORIYA LETTER I
+0B08;AL # ORIYA LETTER II
+0B09;AL # ORIYA LETTER U
+0B0A;AL # ORIYA LETTER UU
+0B0B;AL # ORIYA LETTER VOCALIC R
+0B0C;AL # ORIYA LETTER VOCALIC L
+0B0F;AL # ORIYA LETTER E
+0B10;AL # ORIYA LETTER AI
+0B13;AL # ORIYA LETTER O
+0B14;AL # ORIYA LETTER AU
+0B15;AL # ORIYA LETTER KA
+0B16;AL # ORIYA LETTER KHA
+0B17;AL # ORIYA LETTER GA
+0B18;AL # ORIYA LETTER GHA
+0B19;AL # ORIYA LETTER NGA
+0B1A;AL # ORIYA LETTER CA
+0B1B;AL # ORIYA LETTER CHA
+0B1C;AL # ORIYA LETTER JA
+0B1D;AL # ORIYA LETTER JHA
+0B1E;AL # ORIYA LETTER NYA
+0B1F;AL # ORIYA LETTER TTA
+0B20;AL # ORIYA LETTER TTHA
+0B21;AL # ORIYA LETTER DDA
+0B22;AL # ORIYA LETTER DDHA
+0B23;AL # ORIYA LETTER NNA
+0B24;AL # ORIYA LETTER TA
+0B25;AL # ORIYA LETTER THA
+0B26;AL # ORIYA LETTER DA
+0B27;AL # ORIYA LETTER DHA
+0B28;AL # ORIYA LETTER NA
+0B2A;AL # ORIYA LETTER PA
+0B2B;AL # ORIYA LETTER PHA
+0B2C;AL # ORIYA LETTER BA
+0B2D;AL # ORIYA LETTER BHA
+0B2E;AL # ORIYA LETTER MA
+0B2F;AL # ORIYA LETTER YA
+0B30;AL # ORIYA LETTER RA
+0B32;AL # ORIYA LETTER LA
+0B33;AL # ORIYA LETTER LLA
+0B35;AL # ORIYA LETTER VA
+0B36;AL # ORIYA LETTER SHA
+0B37;AL # ORIYA LETTER SSA
+0B38;AL # ORIYA LETTER SA
+0B39;AL # ORIYA LETTER HA
+0B3C;CM # ORIYA SIGN NUKTA
+0B3D;AL # ORIYA SIGN AVAGRAHA
+0B3E;CM # ORIYA VOWEL SIGN AA
+0B3F;CM # ORIYA VOWEL SIGN I
+0B40;CM # ORIYA VOWEL SIGN II
+0B41;CM # ORIYA VOWEL SIGN U
+0B42;CM # ORIYA VOWEL SIGN UU
+0B43;CM # ORIYA VOWEL SIGN VOCALIC R
+0B44;CM # ORIYA VOWEL SIGN VOCALIC RR
+0B47;CM # ORIYA VOWEL SIGN E
+0B48;CM # ORIYA VOWEL SIGN AI
+0B4B;CM # ORIYA VOWEL SIGN O
+0B4C;CM # ORIYA VOWEL SIGN AU
+0B4D;CM # ORIYA SIGN VIRAMA
+0B56;CM # ORIYA AI LENGTH MARK
+0B57;CM # ORIYA AU LENGTH MARK
+0B5C;AL # ORIYA LETTER RRA
+0B5D;AL # ORIYA LETTER RHA
+0B5F;AL # ORIYA LETTER YYA
+0B60;AL # ORIYA LETTER VOCALIC RR
+0B61;AL # ORIYA LETTER VOCALIC LL
+0B62;CM # ORIYA VOWEL SIGN VOCALIC L
+0B63;CM # ORIYA VOWEL SIGN VOCALIC LL
+0B66;NU # ORIYA DIGIT ZERO
+0B67;NU # ORIYA DIGIT ONE
+0B68;NU # ORIYA DIGIT TWO
+0B69;NU # ORIYA DIGIT THREE
+0B6A;NU # ORIYA DIGIT FOUR
+0B6B;NU # ORIYA DIGIT FIVE
+0B6C;NU # ORIYA DIGIT SIX
+0B6D;NU # ORIYA DIGIT SEVEN
+0B6E;NU # ORIYA DIGIT EIGHT
+0B6F;NU # ORIYA DIGIT NINE
+0B70;AL # ORIYA ISSHAR
+0B71;AL # ORIYA LETTER WA
+0B82;CM # TAMIL SIGN ANUSVARA
+0B83;AL # TAMIL SIGN VISARGA
+0B85;AL # TAMIL LETTER A
+0B86;AL # TAMIL LETTER AA
+0B87;AL # TAMIL LETTER I
+0B88;AL # TAMIL LETTER II
+0B89;AL # TAMIL LETTER U
+0B8A;AL # TAMIL LETTER UU
+0B8E;AL # TAMIL LETTER E
+0B8F;AL # TAMIL LETTER EE
+0B90;AL # TAMIL LETTER AI
+0B92;AL # TAMIL LETTER O
+0B93;AL # TAMIL LETTER OO
+0B94;AL # TAMIL LETTER AU
+0B95;AL # TAMIL LETTER KA
+0B99;AL # TAMIL LETTER NGA
+0B9A;AL # TAMIL LETTER CA
+0B9C;AL # TAMIL LETTER JA
+0B9E;AL # TAMIL LETTER NYA
+0B9F;AL # TAMIL LETTER TTA
+0BA3;AL # TAMIL LETTER NNA
+0BA4;AL # TAMIL LETTER TA
+0BA8;AL # TAMIL LETTER NA
+0BA9;AL # TAMIL LETTER NNNA
+0BAA;AL # TAMIL LETTER PA
+0BAE;AL # TAMIL LETTER MA
+0BAF;AL # TAMIL LETTER YA
+0BB0;AL # TAMIL LETTER RA
+0BB1;AL # TAMIL LETTER RRA
+0BB2;AL # TAMIL LETTER LA
+0BB3;AL # TAMIL LETTER LLA
+0BB4;AL # TAMIL LETTER LLLA
+0BB5;AL # TAMIL LETTER VA
+0BB6;AL # TAMIL LETTER SHA
+0BB7;AL # TAMIL LETTER SSA
+0BB8;AL # TAMIL LETTER SA
+0BB9;AL # TAMIL LETTER HA
+0BBE;CM # TAMIL VOWEL SIGN AA
+0BBF;CM # TAMIL VOWEL SIGN I
+0BC0;CM # TAMIL VOWEL SIGN II
+0BC1;CM # TAMIL VOWEL SIGN U
+0BC2;CM # TAMIL VOWEL SIGN UU
+0BC6;CM # TAMIL VOWEL SIGN E
+0BC7;CM # TAMIL VOWEL SIGN EE
+0BC8;CM # TAMIL VOWEL SIGN AI
+0BCA;CM # TAMIL VOWEL SIGN O
+0BCB;CM # TAMIL VOWEL SIGN OO
+0BCC;CM # TAMIL VOWEL SIGN AU
+0BCD;CM # TAMIL SIGN VIRAMA
+0BD0;AL # TAMIL OM
+0BD7;CM # TAMIL AU LENGTH MARK
+0BE6;NU # TAMIL DIGIT ZERO
+0BE7;NU # TAMIL DIGIT ONE
+0BE8;NU # TAMIL DIGIT TWO
+0BE9;NU # TAMIL DIGIT THREE
+0BEA;NU # TAMIL DIGIT FOUR
+0BEB;NU # TAMIL DIGIT FIVE
+0BEC;NU # TAMIL DIGIT SIX
+0BED;NU # TAMIL DIGIT SEVEN
+0BEE;NU # TAMIL DIGIT EIGHT
+0BEF;NU # TAMIL DIGIT NINE
+0BF0;AL # TAMIL NUMBER TEN
+0BF1;AL # TAMIL NUMBER ONE HUNDRED
+0BF2;AL # TAMIL NUMBER ONE THOUSAND
+0BF3;AL # TAMIL DAY SIGN
+0BF4;AL # TAMIL MONTH SIGN
+0BF5;AL # TAMIL YEAR SIGN
+0BF6;AL # TAMIL DEBIT SIGN
+0BF7;AL # TAMIL CREDIT SIGN
+0BF8;AL # TAMIL AS ABOVE SIGN
+0BF9;PR # TAMIL RUPEE SIGN
+0BFA;AL # TAMIL NUMBER SIGN
+0C01;CM # TELUGU SIGN CANDRABINDU
+0C02;CM # TELUGU SIGN ANUSVARA
+0C03;CM # TELUGU SIGN VISARGA
+0C05;AL # TELUGU LETTER A
+0C06;AL # TELUGU LETTER AA
+0C07;AL # TELUGU LETTER I
+0C08;AL # TELUGU LETTER II
+0C09;AL # TELUGU LETTER U
+0C0A;AL # TELUGU LETTER UU
+0C0B;AL # TELUGU LETTER VOCALIC R
+0C0C;AL # TELUGU LETTER VOCALIC L
+0C0E;AL # TELUGU LETTER E
+0C0F;AL # TELUGU LETTER EE
+0C10;AL # TELUGU LETTER AI
+0C12;AL # TELUGU LETTER O
+0C13;AL # TELUGU LETTER OO
+0C14;AL # TELUGU LETTER AU
+0C15;AL # TELUGU LETTER KA
+0C16;AL # TELUGU LETTER KHA
+0C17;AL # TELUGU LETTER GA
+0C18;AL # TELUGU LETTER GHA
+0C19;AL # TELUGU LETTER NGA
+0C1A;AL # TELUGU LETTER CA
+0C1B;AL # TELUGU LETTER CHA
+0C1C;AL # TELUGU LETTER JA
+0C1D;AL # TELUGU LETTER JHA
+0C1E;AL # TELUGU LETTER NYA
+0C1F;AL # TELUGU LETTER TTA
+0C20;AL # TELUGU LETTER TTHA
+0C21;AL # TELUGU LETTER DDA
+0C22;AL # TELUGU LETTER DDHA
+0C23;AL # TELUGU LETTER NNA
+0C24;AL # TELUGU LETTER TA
+0C25;AL # TELUGU LETTER THA
+0C26;AL # TELUGU LETTER DA
+0C27;AL # TELUGU LETTER DHA
+0C28;AL # TELUGU LETTER NA
+0C2A;AL # TELUGU LETTER PA
+0C2B;AL # TELUGU LETTER PHA
+0C2C;AL # TELUGU LETTER BA
+0C2D;AL # TELUGU LETTER BHA
+0C2E;AL # TELUGU LETTER MA
+0C2F;AL # TELUGU LETTER YA
+0C30;AL # TELUGU LETTER RA
+0C31;AL # TELUGU LETTER RRA
+0C32;AL # TELUGU LETTER LA
+0C33;AL # TELUGU LETTER LLA
+0C35;AL # TELUGU LETTER VA
+0C36;AL # TELUGU LETTER SHA
+0C37;AL # TELUGU LETTER SSA
+0C38;AL # TELUGU LETTER SA
+0C39;AL # TELUGU LETTER HA
+0C3D;AL # TELUGU SIGN AVAGRAHA
+0C3E;CM # TELUGU VOWEL SIGN AA
+0C3F;CM # TELUGU VOWEL SIGN I
+0C40;CM # TELUGU VOWEL SIGN II
+0C41;CM # TELUGU VOWEL SIGN U
+0C42;CM # TELUGU VOWEL SIGN UU
+0C43;CM # TELUGU VOWEL SIGN VOCALIC R
+0C44;CM # TELUGU VOWEL SIGN VOCALIC RR
+0C46;CM # TELUGU VOWEL SIGN E
+0C47;CM # TELUGU VOWEL SIGN EE
+0C48;CM # TELUGU VOWEL SIGN AI
+0C4A;CM # TELUGU VOWEL SIGN O
+0C4B;CM # TELUGU VOWEL SIGN OO
+0C4C;CM # TELUGU VOWEL SIGN AU
+0C4D;CM # TELUGU SIGN VIRAMA
+0C55;CM # TELUGU LENGTH MARK
+0C56;CM # TELUGU AI LENGTH MARK
+0C58;AL # TELUGU LETTER TSA
+0C59;AL # TELUGU LETTER DZA
+0C60;AL # TELUGU LETTER VOCALIC RR
+0C61;AL # TELUGU LETTER VOCALIC LL
+0C62;CM # TELUGU VOWEL SIGN VOCALIC L
+0C63;CM # TELUGU VOWEL SIGN VOCALIC LL
+0C66;NU # TELUGU DIGIT ZERO
+0C67;NU # TELUGU DIGIT ONE
+0C68;NU # TELUGU DIGIT TWO
+0C69;NU # TELUGU DIGIT THREE
+0C6A;NU # TELUGU DIGIT FOUR
+0C6B;NU # TELUGU DIGIT FIVE
+0C6C;NU # TELUGU DIGIT SIX
+0C6D;NU # TELUGU DIGIT SEVEN
+0C6E;NU # TELUGU DIGIT EIGHT
+0C6F;NU # TELUGU DIGIT NINE
+0C78;AL # TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR
+0C79;AL # TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR
+0C7A;AL # TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR
+0C7B;AL # TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR
+0C7C;AL # TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR
+0C7D;AL # TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR
+0C7E;AL # TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
+0C7F;AL # TELUGU SIGN TUUMU
+0C82;CM # KANNADA SIGN ANUSVARA
+0C83;CM # KANNADA SIGN VISARGA
+0C85;AL # KANNADA LETTER A
+0C86;AL # KANNADA LETTER AA
+0C87;AL # KANNADA LETTER I
+0C88;AL # KANNADA LETTER II
+0C89;AL # KANNADA LETTER U
+0C8A;AL # KANNADA LETTER UU
+0C8B;AL # KANNADA LETTER VOCALIC R
+0C8C;AL # KANNADA LETTER VOCALIC L
+0C8E;AL # KANNADA LETTER E
+0C8F;AL # KANNADA LETTER EE
+0C90;AL # KANNADA LETTER AI
+0C92;AL # KANNADA LETTER O
+0C93;AL # KANNADA LETTER OO
+0C94;AL # KANNADA LETTER AU
+0C95;AL # KANNADA LETTER KA
+0C96;AL # KANNADA LETTER KHA
+0C97;AL # KANNADA LETTER GA
+0C98;AL # KANNADA LETTER GHA
+0C99;AL # KANNADA LETTER NGA
+0C9A;AL # KANNADA LETTER CA
+0C9B;AL # KANNADA LETTER CHA
+0C9C;AL # KANNADA LETTER JA
+0C9D;AL # KANNADA LETTER JHA
+0C9E;AL # KANNADA LETTER NYA
+0C9F;AL # KANNADA LETTER TTA
+0CA0;AL # KANNADA LETTER TTHA
+0CA1;AL # KANNADA LETTER DDA
+0CA2;AL # KANNADA LETTER DDHA
+0CA3;AL # KANNADA LETTER NNA
+0CA4;AL # KANNADA LETTER TA
+0CA5;AL # KANNADA LETTER THA
+0CA6;AL # KANNADA LETTER DA
+0CA7;AL # KANNADA LETTER DHA
+0CA8;AL # KANNADA LETTER NA
+0CAA;AL # KANNADA LETTER PA
+0CAB;AL # KANNADA LETTER PHA
+0CAC;AL # KANNADA LETTER BA
+0CAD;AL # KANNADA LETTER BHA
+0CAE;AL # KANNADA LETTER MA
+0CAF;AL # KANNADA LETTER YA
+0CB0;AL # KANNADA LETTER RA
+0CB1;AL # KANNADA LETTER RRA
+0CB2;AL # KANNADA LETTER LA
+0CB3;AL # KANNADA LETTER LLA
+0CB5;AL # KANNADA LETTER VA
+0CB6;AL # KANNADA LETTER SHA
+0CB7;AL # KANNADA LETTER SSA
+0CB8;AL # KANNADA LETTER SA
+0CB9;AL # KANNADA LETTER HA
+0CBC;CM # KANNADA SIGN NUKTA
+0CBD;AL # KANNADA SIGN AVAGRAHA
+0CBE;CM # KANNADA VOWEL SIGN AA
+0CBF;CM # KANNADA VOWEL SIGN I
+0CC0;CM # KANNADA VOWEL SIGN II
+0CC1;CM # KANNADA VOWEL SIGN U
+0CC2;CM # KANNADA VOWEL SIGN UU
+0CC3;CM # KANNADA VOWEL SIGN VOCALIC R
+0CC4;CM # KANNADA VOWEL SIGN VOCALIC RR
+0CC6;CM # KANNADA VOWEL SIGN E
+0CC7;CM # KANNADA VOWEL SIGN EE
+0CC8;CM # KANNADA VOWEL SIGN AI
+0CCA;CM # KANNADA VOWEL SIGN O
+0CCB;CM # KANNADA VOWEL SIGN OO
+0CCC;CM # KANNADA VOWEL SIGN AU
+0CCD;CM # KANNADA SIGN VIRAMA
+0CD5;CM # KANNADA LENGTH MARK
+0CD6;CM # KANNADA AI LENGTH MARK
+0CDE;AL # KANNADA LETTER FA
+0CE0;AL # KANNADA LETTER VOCALIC RR
+0CE1;AL # KANNADA LETTER VOCALIC LL
+0CE2;CM # KANNADA VOWEL SIGN VOCALIC L
+0CE3;CM # KANNADA VOWEL SIGN VOCALIC LL
+0CE6;NU # KANNADA DIGIT ZERO
+0CE7;NU # KANNADA DIGIT ONE
+0CE8;NU # KANNADA DIGIT TWO
+0CE9;NU # KANNADA DIGIT THREE
+0CEA;NU # KANNADA DIGIT FOUR
+0CEB;NU # KANNADA DIGIT FIVE
+0CEC;NU # KANNADA DIGIT SIX
+0CED;NU # KANNADA DIGIT SEVEN
+0CEE;NU # KANNADA DIGIT EIGHT
+0CEF;NU # KANNADA DIGIT NINE
+0CF1;AL # KANNADA SIGN JIHVAMULIYA
+0CF2;AL # KANNADA SIGN UPADHMANIYA
+0D02;CM # MALAYALAM SIGN ANUSVARA
+0D03;CM # MALAYALAM SIGN VISARGA
+0D05;AL # MALAYALAM LETTER A
+0D06;AL # MALAYALAM LETTER AA
+0D07;AL # MALAYALAM LETTER I
+0D08;AL # MALAYALAM LETTER II
+0D09;AL # MALAYALAM LETTER U
+0D0A;AL # MALAYALAM LETTER UU
+0D0B;AL # MALAYALAM LETTER VOCALIC R
+0D0C;AL # MALAYALAM LETTER VOCALIC L
+0D0E;AL # MALAYALAM LETTER E
+0D0F;AL # MALAYALAM LETTER EE
+0D10;AL # MALAYALAM LETTER AI
+0D12;AL # MALAYALAM LETTER O
+0D13;AL # MALAYALAM LETTER OO
+0D14;AL # MALAYALAM LETTER AU
+0D15;AL # MALAYALAM LETTER KA
+0D16;AL # MALAYALAM LETTER KHA
+0D17;AL # MALAYALAM LETTER GA
+0D18;AL # MALAYALAM LETTER GHA
+0D19;AL # MALAYALAM LETTER NGA
+0D1A;AL # MALAYALAM LETTER CA
+0D1B;AL # MALAYALAM LETTER CHA
+0D1C;AL # MALAYALAM LETTER JA
+0D1D;AL # MALAYALAM LETTER JHA
+0D1E;AL # MALAYALAM LETTER NYA
+0D1F;AL # MALAYALAM LETTER TTA
+0D20;AL # MALAYALAM LETTER TTHA
+0D21;AL # MALAYALAM LETTER DDA
+0D22;AL # MALAYALAM LETTER DDHA
+0D23;AL # MALAYALAM LETTER NNA
+0D24;AL # MALAYALAM LETTER TA
+0D25;AL # MALAYALAM LETTER THA
+0D26;AL # MALAYALAM LETTER DA
+0D27;AL # MALAYALAM LETTER DHA
+0D28;AL # MALAYALAM LETTER NA
+0D2A;AL # MALAYALAM LETTER PA
+0D2B;AL # MALAYALAM LETTER PHA
+0D2C;AL # MALAYALAM LETTER BA
+0D2D;AL # MALAYALAM LETTER BHA
+0D2E;AL # MALAYALAM LETTER MA
+0D2F;AL # MALAYALAM LETTER YA
+0D30;AL # MALAYALAM LETTER RA
+0D31;AL # MALAYALAM LETTER RRA
+0D32;AL # MALAYALAM LETTER LA
+0D33;AL # MALAYALAM LETTER LLA
+0D34;AL # MALAYALAM LETTER LLLA
+0D35;AL # MALAYALAM LETTER VA
+0D36;AL # MALAYALAM LETTER SHA
+0D37;AL # MALAYALAM LETTER SSA
+0D38;AL # MALAYALAM LETTER SA
+0D39;AL # MALAYALAM LETTER HA
+0D3D;AL # MALAYALAM SIGN AVAGRAHA
+0D3E;CM # MALAYALAM VOWEL SIGN AA
+0D3F;CM # MALAYALAM VOWEL SIGN I
+0D40;CM # MALAYALAM VOWEL SIGN II
+0D41;CM # MALAYALAM VOWEL SIGN U
+0D42;CM # MALAYALAM VOWEL SIGN UU
+0D43;CM # MALAYALAM VOWEL SIGN VOCALIC R
+0D44;CM # MALAYALAM VOWEL SIGN VOCALIC RR
+0D46;CM # MALAYALAM VOWEL SIGN E
+0D47;CM # MALAYALAM VOWEL SIGN EE
+0D48;CM # MALAYALAM VOWEL SIGN AI
+0D4A;CM # MALAYALAM VOWEL SIGN O
+0D4B;CM # MALAYALAM VOWEL SIGN OO
+0D4C;CM # MALAYALAM VOWEL SIGN AU
+0D4D;CM # MALAYALAM SIGN VIRAMA
+0D57;CM # MALAYALAM AU LENGTH MARK
+0D60;AL # MALAYALAM LETTER VOCALIC RR
+0D61;AL # MALAYALAM LETTER VOCALIC LL
+0D62;CM # MALAYALAM VOWEL SIGN VOCALIC L
+0D63;CM # MALAYALAM VOWEL SIGN VOCALIC LL
+0D66;NU # MALAYALAM DIGIT ZERO
+0D67;NU # MALAYALAM DIGIT ONE
+0D68;NU # MALAYALAM DIGIT TWO
+0D69;NU # MALAYALAM DIGIT THREE
+0D6A;NU # MALAYALAM DIGIT FOUR
+0D6B;NU # MALAYALAM DIGIT FIVE
+0D6C;NU # MALAYALAM DIGIT SIX
+0D6D;NU # MALAYALAM DIGIT SEVEN
+0D6E;NU # MALAYALAM DIGIT EIGHT
+0D6F;NU # MALAYALAM DIGIT NINE
+0D70;AL # MALAYALAM NUMBER TEN
+0D71;AL # MALAYALAM NUMBER ONE HUNDRED
+0D72;AL # MALAYALAM NUMBER ONE THOUSAND
+0D73;AL # MALAYALAM FRACTION ONE QUARTER
+0D74;AL # MALAYALAM FRACTION ONE HALF
+0D75;AL # MALAYALAM FRACTION THREE QUARTERS
+0D79;PO # MALAYALAM DATE MARK
+0D7A;AL # MALAYALAM LETTER CHILLU NN
+0D7B;AL # MALAYALAM LETTER CHILLU N
+0D7C;AL # MALAYALAM LETTER CHILLU RR
+0D7D;AL # MALAYALAM LETTER CHILLU L
+0D7E;AL # MALAYALAM LETTER CHILLU LL
+0D7F;AL # MALAYALAM LETTER CHILLU K
+0D82;CM # SINHALA SIGN ANUSVARAYA
+0D83;CM # SINHALA SIGN VISARGAYA
+0D85;AL # SINHALA LETTER AYANNA
+0D86;AL # SINHALA LETTER AAYANNA
+0D87;AL # SINHALA LETTER AEYANNA
+0D88;AL # SINHALA LETTER AEEYANNA
+0D89;AL # SINHALA LETTER IYANNA
+0D8A;AL # SINHALA LETTER IIYANNA
+0D8B;AL # SINHALA LETTER UYANNA
+0D8C;AL # SINHALA LETTER UUYANNA
+0D8D;AL # SINHALA LETTER IRUYANNA
+0D8E;AL # SINHALA LETTER IRUUYANNA
+0D8F;AL # SINHALA LETTER ILUYANNA
+0D90;AL # SINHALA LETTER ILUUYANNA
+0D91;AL # SINHALA LETTER EYANNA
+0D92;AL # SINHALA LETTER EEYANNA
+0D93;AL # SINHALA LETTER AIYANNA
+0D94;AL # SINHALA LETTER OYANNA
+0D95;AL # SINHALA LETTER OOYANNA
+0D96;AL # SINHALA LETTER AUYANNA
+0D9A;AL # SINHALA LETTER ALPAPRAANA KAYANNA
+0D9B;AL # SINHALA LETTER MAHAAPRAANA KAYANNA
+0D9C;AL # SINHALA LETTER ALPAPRAANA GAYANNA
+0D9D;AL # SINHALA LETTER MAHAAPRAANA GAYANNA
+0D9E;AL # SINHALA LETTER KANTAJA NAASIKYAYA
+0D9F;AL # SINHALA LETTER SANYAKA GAYANNA
+0DA0;AL # SINHALA LETTER ALPAPRAANA CAYANNA
+0DA1;AL # SINHALA LETTER MAHAAPRAANA CAYANNA
+0DA2;AL # SINHALA LETTER ALPAPRAANA JAYANNA
+0DA3;AL # SINHALA LETTER MAHAAPRAANA JAYANNA
+0DA4;AL # SINHALA LETTER TAALUJA NAASIKYAYA
+0DA5;AL # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6;AL # SINHALA LETTER SANYAKA JAYANNA
+0DA7;AL # SINHALA LETTER ALPAPRAANA TTAYANNA
+0DA8;AL # SINHALA LETTER MAHAAPRAANA TTAYANNA
+0DA9;AL # SINHALA LETTER ALPAPRAANA DDAYANNA
+0DAA;AL # SINHALA LETTER MAHAAPRAANA DDAYANNA
+0DAB;AL # SINHALA LETTER MUURDHAJA NAYANNA
+0DAC;AL # SINHALA LETTER SANYAKA DDAYANNA
+0DAD;AL # SINHALA LETTER ALPAPRAANA TAYANNA
+0DAE;AL # SINHALA LETTER MAHAAPRAANA TAYANNA
+0DAF;AL # SINHALA LETTER ALPAPRAANA DAYANNA
+0DB0;AL # SINHALA LETTER MAHAAPRAANA DAYANNA
+0DB1;AL # SINHALA LETTER DANTAJA NAYANNA
+0DB3;AL # SINHALA LETTER SANYAKA DAYANNA
+0DB4;AL # SINHALA LETTER ALPAPRAANA PAYANNA
+0DB5;AL # SINHALA LETTER MAHAAPRAANA PAYANNA
+0DB6;AL # SINHALA LETTER ALPAPRAANA BAYANNA
+0DB7;AL # SINHALA LETTER MAHAAPRAANA BAYANNA
+0DB8;AL # SINHALA LETTER MAYANNA
+0DB9;AL # SINHALA LETTER AMBA BAYANNA
+0DBA;AL # SINHALA LETTER YAYANNA
+0DBB;AL # SINHALA LETTER RAYANNA
+0DBD;AL # SINHALA LETTER DANTAJA LAYANNA
+0DC0;AL # SINHALA LETTER VAYANNA
+0DC1;AL # SINHALA LETTER TAALUJA SAYANNA
+0DC2;AL # SINHALA LETTER MUURDHAJA SAYANNA
+0DC3;AL # SINHALA LETTER DANTAJA SAYANNA
+0DC4;AL # SINHALA LETTER HAYANNA
+0DC5;AL # SINHALA LETTER MUURDHAJA LAYANNA
+0DC6;AL # SINHALA LETTER FAYANNA
+0DCA;CM # SINHALA SIGN AL-LAKUNA
+0DCF;CM # SINHALA VOWEL SIGN AELA-PILLA
+0DD0;CM # SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0DD1;CM # SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2;CM # SINHALA VOWEL SIGN KETTI IS-PILLA
+0DD3;CM # SINHALA VOWEL SIGN DIGA IS-PILLA
+0DD4;CM # SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6;CM # SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8;CM # SINHALA VOWEL SIGN GAETTA-PILLA
+0DD9;CM # SINHALA VOWEL SIGN KOMBUVA
+0DDA;CM # SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDB;CM # SINHALA VOWEL SIGN KOMBU DEKA
+0DDC;CM # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DDD;CM # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDE;CM # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DDF;CM # SINHALA VOWEL SIGN GAYANUKITTA
+0DF2;CM # SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0DF3;CM # SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4;AL # SINHALA PUNCTUATION KUNDDALIYA
+0E01;SA # THAI CHARACTER KO KAI
+0E02;SA # THAI CHARACTER KHO KHAI
+0E03;SA # THAI CHARACTER KHO KHUAT
+0E04;SA # THAI CHARACTER KHO KHWAI
+0E05;SA # THAI CHARACTER KHO KHON
+0E06;SA # THAI CHARACTER KHO RAKHANG
+0E07;SA # THAI CHARACTER NGO NGU
+0E08;SA # THAI CHARACTER CHO CHAN
+0E09;SA # THAI CHARACTER CHO CHING
+0E0A;SA # THAI CHARACTER CHO CHANG
+0E0B;SA # THAI CHARACTER SO SO
+0E0C;SA # THAI CHARACTER CHO CHOE
+0E0D;SA # THAI CHARACTER YO YING
+0E0E;SA # THAI CHARACTER DO CHADA
+0E0F;SA # THAI CHARACTER TO PATAK
+0E10;SA # THAI CHARACTER THO THAN
+0E11;SA # THAI CHARACTER THO NANGMONTHO
+0E12;SA # THAI CHARACTER THO PHUTHAO
+0E13;SA # THAI CHARACTER NO NEN
+0E14;SA # THAI CHARACTER DO DEK
+0E15;SA # THAI CHARACTER TO TAO
+0E16;SA # THAI CHARACTER THO THUNG
+0E17;SA # THAI CHARACTER THO THAHAN
+0E18;SA # THAI CHARACTER THO THONG
+0E19;SA # THAI CHARACTER NO NU
+0E1A;SA # THAI CHARACTER BO BAIMAI
+0E1B;SA # THAI CHARACTER PO PLA
+0E1C;SA # THAI CHARACTER PHO PHUNG
+0E1D;SA # THAI CHARACTER FO FA
+0E1E;SA # THAI CHARACTER PHO PHAN
+0E1F;SA # THAI CHARACTER FO FAN
+0E20;SA # THAI CHARACTER PHO SAMPHAO
+0E21;SA # THAI CHARACTER MO MA
+0E22;SA # THAI CHARACTER YO YAK
+0E23;SA # THAI CHARACTER RO RUA
+0E24;SA # THAI CHARACTER RU
+0E25;SA # THAI CHARACTER LO LING
+0E26;SA # THAI CHARACTER LU
+0E27;SA # THAI CHARACTER WO WAEN
+0E28;SA # THAI CHARACTER SO SALA
+0E29;SA # THAI CHARACTER SO RUSI
+0E2A;SA # THAI CHARACTER SO SUA
+0E2B;SA # THAI CHARACTER HO HIP
+0E2C;SA # THAI CHARACTER LO CHULA
+0E2D;SA # THAI CHARACTER O ANG
+0E2E;SA # THAI CHARACTER HO NOKHUK
+0E2F;SA # THAI CHARACTER PAIYANNOI
+0E30;SA # THAI CHARACTER SARA A
+0E31;SA # THAI CHARACTER MAI HAN-AKAT
+0E32;SA # THAI CHARACTER SARA AA
+0E33;SA # THAI CHARACTER SARA AM
+0E34;SA # THAI CHARACTER SARA I
+0E35;SA # THAI CHARACTER SARA II
+0E36;SA # THAI CHARACTER SARA UE
+0E37;SA # THAI CHARACTER SARA UEE
+0E38;SA # THAI CHARACTER SARA U
+0E39;SA # THAI CHARACTER SARA UU
+0E3A;SA # THAI CHARACTER PHINTHU
+0E3F;PR # THAI CURRENCY SYMBOL BAHT
+0E40;SA # THAI CHARACTER SARA E
+0E41;SA # THAI CHARACTER SARA AE
+0E42;SA # THAI CHARACTER SARA O
+0E43;SA # THAI CHARACTER SARA AI MAIMUAN
+0E44;SA # THAI CHARACTER SARA AI MAIMALAI
+0E45;SA # THAI CHARACTER LAKKHANGYAO
+0E46;SA # THAI CHARACTER MAIYAMOK
+0E47;SA # THAI CHARACTER MAITAIKHU
+0E48;SA # THAI CHARACTER MAI EK
+0E49;SA # THAI CHARACTER MAI THO
+0E4A;SA # THAI CHARACTER MAI TRI
+0E4B;SA # THAI CHARACTER MAI CHATTAWA
+0E4C;SA # THAI CHARACTER THANTHAKHAT
+0E4D;SA # THAI CHARACTER NIKHAHIT
+0E4E;SA # THAI CHARACTER YAMAKKAN
+0E4F;AL # THAI CHARACTER FONGMAN
+0E50;NU # THAI DIGIT ZERO
+0E51;NU # THAI DIGIT ONE
+0E52;NU # THAI DIGIT TWO
+0E53;NU # THAI DIGIT THREE
+0E54;NU # THAI DIGIT FOUR
+0E55;NU # THAI DIGIT FIVE
+0E56;NU # THAI DIGIT SIX
+0E57;NU # THAI DIGIT SEVEN
+0E58;NU # THAI DIGIT EIGHT
+0E59;NU # THAI DIGIT NINE
+0E5A;BA # THAI CHARACTER ANGKHANKHU
+0E5B;BA # THAI CHARACTER KHOMUT
+0E81;SA # LAO LETTER KO
+0E82;SA # LAO LETTER KHO SUNG
+0E84;SA # LAO LETTER KHO TAM
+0E87;SA # LAO LETTER NGO
+0E88;SA # LAO LETTER CO
+0E8A;SA # LAO LETTER SO TAM
+0E8D;SA # LAO LETTER NYO
+0E94;SA # LAO LETTER DO
+0E95;SA # LAO LETTER TO
+0E96;SA # LAO LETTER THO SUNG
+0E97;SA # LAO LETTER THO TAM
+0E99;SA # LAO LETTER NO
+0E9A;SA # LAO LETTER BO
+0E9B;SA # LAO LETTER PO
+0E9C;SA # LAO LETTER PHO SUNG
+0E9D;SA # LAO LETTER FO TAM
+0E9E;SA # LAO LETTER PHO TAM
+0E9F;SA # LAO LETTER FO SUNG
+0EA1;SA # LAO LETTER MO
+0EA2;SA # LAO LETTER YO
+0EA3;SA # LAO LETTER LO LING
+0EA5;SA # LAO LETTER LO LOOT
+0EA7;SA # LAO LETTER WO
+0EAA;SA # LAO LETTER SO SUNG
+0EAB;SA # LAO LETTER HO SUNG
+0EAD;SA # LAO LETTER O
+0EAE;SA # LAO LETTER HO TAM
+0EAF;SA # LAO ELLIPSIS
+0EB0;SA # LAO VOWEL SIGN A
+0EB1;SA # LAO VOWEL SIGN MAI KAN
+0EB2;SA # LAO VOWEL SIGN AA
+0EB3;SA # LAO VOWEL SIGN AM
+0EB4;SA # LAO VOWEL SIGN I
+0EB5;SA # LAO VOWEL SIGN II
+0EB6;SA # LAO VOWEL SIGN Y
+0EB7;SA # LAO VOWEL SIGN YY
+0EB8;SA # LAO VOWEL SIGN U
+0EB9;SA # LAO VOWEL SIGN UU
+0EBB;SA # LAO VOWEL SIGN MAI KON
+0EBC;SA # LAO SEMIVOWEL SIGN LO
+0EBD;SA # LAO SEMIVOWEL SIGN NYO
+0EC0;SA # LAO VOWEL SIGN E
+0EC1;SA # LAO VOWEL SIGN EI
+0EC2;SA # LAO VOWEL SIGN O
+0EC3;SA # LAO VOWEL SIGN AY
+0EC4;SA # LAO VOWEL SIGN AI
+0EC6;SA # LAO KO LA
+0EC8;SA # LAO TONE MAI EK
+0EC9;SA # LAO TONE MAI THO
+0ECA;SA # LAO TONE MAI TI
+0ECB;SA # LAO TONE MAI CATAWA
+0ECC;SA # LAO CANCELLATION MARK
+0ECD;SA # LAO NIGGAHITA
+0ED0;NU # LAO DIGIT ZERO
+0ED1;NU # LAO DIGIT ONE
+0ED2;NU # LAO DIGIT TWO
+0ED3;NU # LAO DIGIT THREE
+0ED4;NU # LAO DIGIT FOUR
+0ED5;NU # LAO DIGIT FIVE
+0ED6;NU # LAO DIGIT SIX
+0ED7;NU # LAO DIGIT SEVEN
+0ED8;NU # LAO DIGIT EIGHT
+0ED9;NU # LAO DIGIT NINE
+0EDC;SA # LAO HO NO
+0EDD;SA # LAO HO MO
+0F00;AL # TIBETAN SYLLABLE OM
+0F01;BB # TIBETAN MARK GTER YIG MGO TRUNCATED A
+0F02;BB # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0F03;BB # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04;BB # TIBETAN MARK INITIAL YIG MGO MDUN MA
+0F05;AL # TIBETAN MARK CLOSING YIG MGO SGAB MA
+0F06;BB # TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0F07;BB # TIBETAN MARK YIG MGO TSHEG SHAD MA
+0F08;GL # TIBETAN MARK SBRUL SHAD
+0F09;BB # TIBETAN MARK BSKUR YIG MGO
+0F0A;BB # TIBETAN MARK BKA- SHOG YIG MGO
+0F0B;BA # TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C;GL # TIBETAN MARK DELIMITER TSHEG BSTAR
+0F0D;EX # TIBETAN MARK SHAD
+0F0E;EX # TIBETAN MARK NYIS SHAD
+0F0F;EX # TIBETAN MARK TSHEG SHAD
+0F10;EX # TIBETAN MARK NYIS TSHEG SHAD
+0F11;EX # TIBETAN MARK RIN CHEN SPUNGS SHAD
+0F12;GL # TIBETAN MARK RGYA GRAM SHAD
+0F13;AL # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14;EX # TIBETAN MARK GTER TSHEG
+0F15;AL # TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0F16;AL # TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0F17;AL # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18;CM # TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0F19;CM # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A;AL # TIBETAN SIGN RDEL DKAR GCIG
+0F1B;AL # TIBETAN SIGN RDEL DKAR GNYIS
+0F1C;AL # TIBETAN SIGN RDEL DKAR GSUM
+0F1D;AL # TIBETAN SIGN RDEL NAG GCIG
+0F1E;AL # TIBETAN SIGN RDEL NAG GNYIS
+0F1F;AL # TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20;NU # TIBETAN DIGIT ZERO
+0F21;NU # TIBETAN DIGIT ONE
+0F22;NU # TIBETAN DIGIT TWO
+0F23;NU # TIBETAN DIGIT THREE
+0F24;NU # TIBETAN DIGIT FOUR
+0F25;NU # TIBETAN DIGIT FIVE
+0F26;NU # TIBETAN DIGIT SIX
+0F27;NU # TIBETAN DIGIT SEVEN
+0F28;NU # TIBETAN DIGIT EIGHT
+0F29;NU # TIBETAN DIGIT NINE
+0F2A;AL # TIBETAN DIGIT HALF ONE
+0F2B;AL # TIBETAN DIGIT HALF TWO
+0F2C;AL # TIBETAN DIGIT HALF THREE
+0F2D;AL # TIBETAN DIGIT HALF FOUR
+0F2E;AL # TIBETAN DIGIT HALF FIVE
+0F2F;AL # TIBETAN DIGIT HALF SIX
+0F30;AL # TIBETAN DIGIT HALF SEVEN
+0F31;AL # TIBETAN DIGIT HALF EIGHT
+0F32;AL # TIBETAN DIGIT HALF NINE
+0F33;AL # TIBETAN DIGIT HALF ZERO
+0F34;BA # TIBETAN MARK BSDUS RTAGS
+0F35;CM # TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36;AL # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37;CM # TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38;AL # TIBETAN MARK CHE MGO
+0F39;CM # TIBETAN MARK TSA -PHRU
+0F3A;OP # TIBETAN MARK GUG RTAGS GYON
+0F3B;CL # TIBETAN MARK GUG RTAGS GYAS
+0F3C;OP # TIBETAN MARK ANG KHANG GYON
+0F3D;CL # TIBETAN MARK ANG KHANG GYAS
+0F3E;CM # TIBETAN SIGN YAR TSHES
+0F3F;CM # TIBETAN SIGN MAR TSHES
+0F40;AL # TIBETAN LETTER KA
+0F41;AL # TIBETAN LETTER KHA
+0F42;AL # TIBETAN LETTER GA
+0F43;AL # TIBETAN LETTER GHA
+0F44;AL # TIBETAN LETTER NGA
+0F45;AL # TIBETAN LETTER CA
+0F46;AL # TIBETAN LETTER CHA
+0F47;AL # TIBETAN LETTER JA
+0F49;AL # TIBETAN LETTER NYA
+0F4A;AL # TIBETAN LETTER TTA
+0F4B;AL # TIBETAN LETTER TTHA
+0F4C;AL # TIBETAN LETTER DDA
+0F4D;AL # TIBETAN LETTER DDHA
+0F4E;AL # TIBETAN LETTER NNA
+0F4F;AL # TIBETAN LETTER TA
+0F50;AL # TIBETAN LETTER THA
+0F51;AL # TIBETAN LETTER DA
+0F52;AL # TIBETAN LETTER DHA
+0F53;AL # TIBETAN LETTER NA
+0F54;AL # TIBETAN LETTER PA
+0F55;AL # TIBETAN LETTER PHA
+0F56;AL # TIBETAN LETTER BA
+0F57;AL # TIBETAN LETTER BHA
+0F58;AL # TIBETAN LETTER MA
+0F59;AL # TIBETAN LETTER TSA
+0F5A;AL # TIBETAN LETTER TSHA
+0F5B;AL # TIBETAN LETTER DZA
+0F5C;AL # TIBETAN LETTER DZHA
+0F5D;AL # TIBETAN LETTER WA
+0F5E;AL # TIBETAN LETTER ZHA
+0F5F;AL # TIBETAN LETTER ZA
+0F60;AL # TIBETAN LETTER -A
+0F61;AL # TIBETAN LETTER YA
+0F62;AL # TIBETAN LETTER RA
+0F63;AL # TIBETAN LETTER LA
+0F64;AL # TIBETAN LETTER SHA
+0F65;AL # TIBETAN LETTER SSA
+0F66;AL # TIBETAN LETTER SA
+0F67;AL # TIBETAN LETTER HA
+0F68;AL # TIBETAN LETTER A
+0F69;AL # TIBETAN LETTER KSSA
+0F6A;AL # TIBETAN LETTER FIXED-FORM RA
+0F6B;AL # TIBETAN LETTER KKA
+0F6C;AL # TIBETAN LETTER RRA
+0F71;CM # TIBETAN VOWEL SIGN AA
+0F72;CM # TIBETAN VOWEL SIGN I
+0F73;CM # TIBETAN VOWEL SIGN II
+0F74;CM # TIBETAN VOWEL SIGN U
+0F75;CM # TIBETAN VOWEL SIGN UU
+0F76;CM # TIBETAN VOWEL SIGN VOCALIC R
+0F77;CM # TIBETAN VOWEL SIGN VOCALIC RR
+0F78;CM # TIBETAN VOWEL SIGN VOCALIC L
+0F79;CM # TIBETAN VOWEL SIGN VOCALIC LL
+0F7A;CM # TIBETAN VOWEL SIGN E
+0F7B;CM # TIBETAN VOWEL SIGN EE
+0F7C;CM # TIBETAN VOWEL SIGN O
+0F7D;CM # TIBETAN VOWEL SIGN OO
+0F7E;CM # TIBETAN SIGN RJES SU NGA RO
+0F7F;BA # TIBETAN SIGN RNAM BCAD
+0F80;CM # TIBETAN VOWEL SIGN REVERSED I
+0F81;CM # TIBETAN VOWEL SIGN REVERSED II
+0F82;CM # TIBETAN SIGN NYI ZLA NAA DA
+0F83;CM # TIBETAN SIGN SNA LDAN
+0F84;CM # TIBETAN MARK HALANTA
+0F85;BA # TIBETAN MARK PALUTA
+0F86;CM # TIBETAN SIGN LCI RTAGS
+0F87;CM # TIBETAN SIGN YANG RTAGS
+0F88;AL # TIBETAN SIGN LCE TSA CAN
+0F89;AL # TIBETAN SIGN MCHU CAN
+0F8A;AL # TIBETAN SIGN GRU CAN RGYINGS
+0F8B;AL # TIBETAN SIGN GRU MED RGYINGS
+0F90;CM # TIBETAN SUBJOINED LETTER KA
+0F91;CM # TIBETAN SUBJOINED LETTER KHA
+0F92;CM # TIBETAN SUBJOINED LETTER GA
+0F93;CM # TIBETAN SUBJOINED LETTER GHA
+0F94;CM # TIBETAN SUBJOINED LETTER NGA
+0F95;CM # TIBETAN SUBJOINED LETTER CA
+0F96;CM # TIBETAN SUBJOINED LETTER CHA
+0F97;CM # TIBETAN SUBJOINED LETTER JA
+0F99;CM # TIBETAN SUBJOINED LETTER NYA
+0F9A;CM # TIBETAN SUBJOINED LETTER TTA
+0F9B;CM # TIBETAN SUBJOINED LETTER TTHA
+0F9C;CM # TIBETAN SUBJOINED LETTER DDA
+0F9D;CM # TIBETAN SUBJOINED LETTER DDHA
+0F9E;CM # TIBETAN SUBJOINED LETTER NNA
+0F9F;CM # TIBETAN SUBJOINED LETTER TA
+0FA0;CM # TIBETAN SUBJOINED LETTER THA
+0FA1;CM # TIBETAN SUBJOINED LETTER DA
+0FA2;CM # TIBETAN SUBJOINED LETTER DHA
+0FA3;CM # TIBETAN SUBJOINED LETTER NA
+0FA4;CM # TIBETAN SUBJOINED LETTER PA
+0FA5;CM # TIBETAN SUBJOINED LETTER PHA
+0FA6;CM # TIBETAN SUBJOINED LETTER BA
+0FA7;CM # TIBETAN SUBJOINED LETTER BHA
+0FA8;CM # TIBETAN SUBJOINED LETTER MA
+0FA9;CM # TIBETAN SUBJOINED LETTER TSA
+0FAA;CM # TIBETAN SUBJOINED LETTER TSHA
+0FAB;CM # TIBETAN SUBJOINED LETTER DZA
+0FAC;CM # TIBETAN SUBJOINED LETTER DZHA
+0FAD;CM # TIBETAN SUBJOINED LETTER WA
+0FAE;CM # TIBETAN SUBJOINED LETTER ZHA
+0FAF;CM # TIBETAN SUBJOINED LETTER ZA
+0FB0;CM # TIBETAN SUBJOINED LETTER -A
+0FB1;CM # TIBETAN SUBJOINED LETTER YA
+0FB2;CM # TIBETAN SUBJOINED LETTER RA
+0FB3;CM # TIBETAN SUBJOINED LETTER LA
+0FB4;CM # TIBETAN SUBJOINED LETTER SHA
+0FB5;CM # TIBETAN SUBJOINED LETTER SSA
+0FB6;CM # TIBETAN SUBJOINED LETTER SA
+0FB7;CM # TIBETAN SUBJOINED LETTER HA
+0FB8;CM # TIBETAN SUBJOINED LETTER A
+0FB9;CM # TIBETAN SUBJOINED LETTER KSSA
+0FBA;CM # TIBETAN SUBJOINED LETTER FIXED-FORM WA
+0FBB;CM # TIBETAN SUBJOINED LETTER FIXED-FORM YA
+0FBC;CM # TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE;BA # TIBETAN KU RU KHA
+0FBF;BA # TIBETAN KU RU KHA BZHI MIG CAN
+0FC0;AL # TIBETAN CANTILLATION SIGN HEAVY BEAT
+0FC1;AL # TIBETAN CANTILLATION SIGN LIGHT BEAT
+0FC2;AL # TIBETAN CANTILLATION SIGN CANG TE-U
+0FC3;AL # TIBETAN CANTILLATION SIGN SBUB -CHAL
+0FC4;AL # TIBETAN SYMBOL DRIL BU
+0FC5;AL # TIBETAN SYMBOL RDO RJE
+0FC6;CM # TIBETAN SYMBOL PADMA GDAN
+0FC7;AL # TIBETAN SYMBOL RDO RJE RGYA GRAM
+0FC8;AL # TIBETAN SYMBOL PHUR PA
+0FC9;AL # TIBETAN SYMBOL NOR BU
+0FCA;AL # TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0FCB;AL # TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0FCC;AL # TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCE;AL # TIBETAN SIGN RDEL NAG RDEL DKAR
+0FCF;AL # TIBETAN SIGN RDEL NAG GSUM
+0FD0;BB # TIBETAN MARK BSKA- SHOG GI MGO RGYAN
+0FD1;BB # TIBETAN MARK MNYAM YIG GI MGO RGYAN
+0FD2;BA # TIBETAN MARK NYIS TSHEG
+0FD3;BB # TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA
+0FD4;AL # TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA
+1000;SA # MYANMAR LETTER KA
+1001;SA # MYANMAR LETTER KHA
+1002;SA # MYANMAR LETTER GA
+1003;SA # MYANMAR LETTER GHA
+1004;SA # MYANMAR LETTER NGA
+1005;SA # MYANMAR LETTER CA
+1006;SA # MYANMAR LETTER CHA
+1007;SA # MYANMAR LETTER JA
+1008;SA # MYANMAR LETTER JHA
+1009;SA # MYANMAR LETTER NYA
+100A;SA # MYANMAR LETTER NNYA
+100B;SA # MYANMAR LETTER TTA
+100C;SA # MYANMAR LETTER TTHA
+100D;SA # MYANMAR LETTER DDA
+100E;SA # MYANMAR LETTER DDHA
+100F;SA # MYANMAR LETTER NNA
+1010;SA # MYANMAR LETTER TA
+1011;SA # MYANMAR LETTER THA
+1012;SA # MYANMAR LETTER DA
+1013;SA # MYANMAR LETTER DHA
+1014;SA # MYANMAR LETTER NA
+1015;SA # MYANMAR LETTER PA
+1016;SA # MYANMAR LETTER PHA
+1017;SA # MYANMAR LETTER BA
+1018;SA # MYANMAR LETTER BHA
+1019;SA # MYANMAR LETTER MA
+101A;SA # MYANMAR LETTER YA
+101B;SA # MYANMAR LETTER RA
+101C;SA # MYANMAR LETTER LA
+101D;SA # MYANMAR LETTER WA
+101E;SA # MYANMAR LETTER SA
+101F;SA # MYANMAR LETTER HA
+1020;SA # MYANMAR LETTER LLA
+1021;SA # MYANMAR LETTER A
+1022;SA # MYANMAR LETTER SHAN A
+1023;SA # MYANMAR LETTER I
+1024;SA # MYANMAR LETTER II
+1025;SA # MYANMAR LETTER U
+1026;SA # MYANMAR LETTER UU
+1027;SA # MYANMAR LETTER E
+1028;SA # MYANMAR LETTER MON E
+1029;SA # MYANMAR LETTER O
+102A;SA # MYANMAR LETTER AU
+102B;SA # MYANMAR VOWEL SIGN TALL AA
+102C;SA # MYANMAR VOWEL SIGN AA
+102D;SA # MYANMAR VOWEL SIGN I
+102E;SA # MYANMAR VOWEL SIGN II
+102F;SA # MYANMAR VOWEL SIGN U
+1030;SA # MYANMAR VOWEL SIGN UU
+1031;SA # MYANMAR VOWEL SIGN E
+1032;SA # MYANMAR VOWEL SIGN AI
+1033;SA # MYANMAR VOWEL SIGN MON II
+1034;SA # MYANMAR VOWEL SIGN MON O
+1035;SA # MYANMAR VOWEL SIGN E ABOVE
+1036;SA # MYANMAR SIGN ANUSVARA
+1037;SA # MYANMAR SIGN DOT BELOW
+1038;SA # MYANMAR SIGN VISARGA
+1039;SA # MYANMAR SIGN VIRAMA
+103A;SA # MYANMAR SIGN ASAT
+103B;SA # MYANMAR CONSONANT SIGN MEDIAL YA
+103C;SA # MYANMAR CONSONANT SIGN MEDIAL RA
+103D;SA # MYANMAR CONSONANT SIGN MEDIAL WA
+103E;SA # MYANMAR CONSONANT SIGN MEDIAL HA
+103F;SA # MYANMAR LETTER GREAT SA
+1040;NU # MYANMAR DIGIT ZERO
+1041;NU # MYANMAR DIGIT ONE
+1042;NU # MYANMAR DIGIT TWO
+1043;NU # MYANMAR DIGIT THREE
+1044;NU # MYANMAR DIGIT FOUR
+1045;NU # MYANMAR DIGIT FIVE
+1046;NU # MYANMAR DIGIT SIX
+1047;NU # MYANMAR DIGIT SEVEN
+1048;NU # MYANMAR DIGIT EIGHT
+1049;NU # MYANMAR DIGIT NINE
+104A;BA # MYANMAR SIGN LITTLE SECTION
+104B;BA # MYANMAR SIGN SECTION
+104C;AL # MYANMAR SYMBOL LOCATIVE
+104D;AL # MYANMAR SYMBOL COMPLETED
+104E;AL # MYANMAR SYMBOL AFOREMENTIONED
+104F;AL # MYANMAR SYMBOL GENITIVE
+1050;SA # MYANMAR LETTER SHA
+1051;SA # MYANMAR LETTER SSA
+1052;SA # MYANMAR LETTER VOCALIC R
+1053;SA # MYANMAR LETTER VOCALIC RR
+1054;SA # MYANMAR LETTER VOCALIC L
+1055;SA # MYANMAR LETTER VOCALIC LL
+1056;SA # MYANMAR VOWEL SIGN VOCALIC R
+1057;SA # MYANMAR VOWEL SIGN VOCALIC RR
+1058;SA # MYANMAR VOWEL SIGN VOCALIC L
+1059;SA # MYANMAR VOWEL SIGN VOCALIC LL
+105A;SA # MYANMAR LETTER MON NGA
+105B;SA # MYANMAR LETTER MON JHA
+105C;SA # MYANMAR LETTER MON BBA
+105D;SA # MYANMAR LETTER MON BBE
+105E;SA # MYANMAR CONSONANT SIGN MON MEDIAL NA
+105F;SA # MYANMAR CONSONANT SIGN MON MEDIAL MA
+1060;SA # MYANMAR CONSONANT SIGN MON MEDIAL LA
+1061;SA # MYANMAR LETTER SGAW KAREN SHA
+1062;SA # MYANMAR VOWEL SIGN SGAW KAREN EU
+1063;SA # MYANMAR TONE MARK SGAW KAREN HATHI
+1064;SA # MYANMAR TONE MARK SGAW KAREN KE PHO
+1065;SA # MYANMAR LETTER WESTERN PWO KAREN THA
+1066;SA # MYANMAR LETTER WESTERN PWO KAREN PWA
+1067;SA # MYANMAR VOWEL SIGN WESTERN PWO KAREN EU
+1068;SA # MYANMAR VOWEL SIGN WESTERN PWO KAREN UE
+1069;SA # MYANMAR SIGN WESTERN PWO KAREN TONE-1
+106A;SA # MYANMAR SIGN WESTERN PWO KAREN TONE-2
+106B;SA # MYANMAR SIGN WESTERN PWO KAREN TONE-3
+106C;SA # MYANMAR SIGN WESTERN PWO KAREN TONE-4
+106D;SA # MYANMAR SIGN WESTERN PWO KAREN TONE-5
+106E;SA # MYANMAR LETTER EASTERN PWO KAREN NNA
+106F;SA # MYANMAR LETTER EASTERN PWO KAREN YWA
+1070;SA # MYANMAR LETTER EASTERN PWO KAREN GHWA
+1071;SA # MYANMAR VOWEL SIGN GEBA KAREN I
+1072;SA # MYANMAR VOWEL SIGN KAYAH OE
+1073;SA # MYANMAR VOWEL SIGN KAYAH U
+1074;SA # MYANMAR VOWEL SIGN KAYAH EE
+1075;SA # MYANMAR LETTER SHAN KA
+1076;SA # MYANMAR LETTER SHAN KHA
+1077;SA # MYANMAR LETTER SHAN GA
+1078;SA # MYANMAR LETTER SHAN CA
+1079;SA # MYANMAR LETTER SHAN ZA
+107A;SA # MYANMAR LETTER SHAN NYA
+107B;SA # MYANMAR LETTER SHAN DA
+107C;SA # MYANMAR LETTER SHAN NA
+107D;SA # MYANMAR LETTER SHAN PHA
+107E;SA # MYANMAR LETTER SHAN FA
+107F;SA # MYANMAR LETTER SHAN BA
+1080;SA # MYANMAR LETTER SHAN THA
+1081;SA # MYANMAR LETTER SHAN HA
+1082;SA # MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083;SA # MYANMAR VOWEL SIGN SHAN AA
+1084;SA # MYANMAR VOWEL SIGN SHAN E
+1085;SA # MYANMAR VOWEL SIGN SHAN E ABOVE
+1086;SA # MYANMAR VOWEL SIGN SHAN FINAL Y
+1087;SA # MYANMAR SIGN SHAN TONE-2
+1088;SA # MYANMAR SIGN SHAN TONE-3
+1089;SA # MYANMAR SIGN SHAN TONE-5
+108A;SA # MYANMAR SIGN SHAN TONE-6
+108B;SA # MYANMAR SIGN SHAN COUNCIL TONE-2
+108C;SA # MYANMAR SIGN SHAN COUNCIL TONE-3
+108D;SA # MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+108E;SA # MYANMAR LETTER RUMAI PALAUNG FA
+108F;SA # MYANMAR SIGN RUMAI PALAUNG TONE-5
+1090;NU # MYANMAR SHAN DIGIT ZERO
+1091;NU # MYANMAR SHAN DIGIT ONE
+1092;NU # MYANMAR SHAN DIGIT TWO
+1093;NU # MYANMAR SHAN DIGIT THREE
+1094;NU # MYANMAR SHAN DIGIT FOUR
+1095;NU # MYANMAR SHAN DIGIT FIVE
+1096;NU # MYANMAR SHAN DIGIT SIX
+1097;NU # MYANMAR SHAN DIGIT SEVEN
+1098;NU # MYANMAR SHAN DIGIT EIGHT
+1099;NU # MYANMAR SHAN DIGIT NINE
+109E;SA # MYANMAR SYMBOL SHAN ONE
+109F;SA # MYANMAR SYMBOL SHAN EXCLAMATION
+10A0;AL # GEORGIAN CAPITAL LETTER AN
+10A1;AL # GEORGIAN CAPITAL LETTER BAN
+10A2;AL # GEORGIAN CAPITAL LETTER GAN
+10A3;AL # GEORGIAN CAPITAL LETTER DON
+10A4;AL # GEORGIAN CAPITAL LETTER EN
+10A5;AL # GEORGIAN CAPITAL LETTER VIN
+10A6;AL # GEORGIAN CAPITAL LETTER ZEN
+10A7;AL # GEORGIAN CAPITAL LETTER TAN
+10A8;AL # GEORGIAN CAPITAL LETTER IN
+10A9;AL # GEORGIAN CAPITAL LETTER KAN
+10AA;AL # GEORGIAN CAPITAL LETTER LAS
+10AB;AL # GEORGIAN CAPITAL LETTER MAN
+10AC;AL # GEORGIAN CAPITAL LETTER NAR
+10AD;AL # GEORGIAN CAPITAL LETTER ON
+10AE;AL # GEORGIAN CAPITAL LETTER PAR
+10AF;AL # GEORGIAN CAPITAL LETTER ZHAR
+10B0;AL # GEORGIAN CAPITAL LETTER RAE
+10B1;AL # GEORGIAN CAPITAL LETTER SAN
+10B2;AL # GEORGIAN CAPITAL LETTER TAR
+10B3;AL # GEORGIAN CAPITAL LETTER UN
+10B4;AL # GEORGIAN CAPITAL LETTER PHAR
+10B5;AL # GEORGIAN CAPITAL LETTER KHAR
+10B6;AL # GEORGIAN CAPITAL LETTER GHAN
+10B7;AL # GEORGIAN CAPITAL LETTER QAR
+10B8;AL # GEORGIAN CAPITAL LETTER SHIN
+10B9;AL # GEORGIAN CAPITAL LETTER CHIN
+10BA;AL # GEORGIAN CAPITAL LETTER CAN
+10BB;AL # GEORGIAN CAPITAL LETTER JIL
+10BC;AL # GEORGIAN CAPITAL LETTER CIL
+10BD;AL # GEORGIAN CAPITAL LETTER CHAR
+10BE;AL # GEORGIAN CAPITAL LETTER XAN
+10BF;AL # GEORGIAN CAPITAL LETTER JHAN
+10C0;AL # GEORGIAN CAPITAL LETTER HAE
+10C1;AL # GEORGIAN CAPITAL LETTER HE
+10C2;AL # GEORGIAN CAPITAL LETTER HIE
+10C3;AL # GEORGIAN CAPITAL LETTER WE
+10C4;AL # GEORGIAN CAPITAL LETTER HAR
+10C5;AL # GEORGIAN CAPITAL LETTER HOE
+10D0;AL # GEORGIAN LETTER AN
+10D1;AL # GEORGIAN LETTER BAN
+10D2;AL # GEORGIAN LETTER GAN
+10D3;AL # GEORGIAN LETTER DON
+10D4;AL # GEORGIAN LETTER EN
+10D5;AL # GEORGIAN LETTER VIN
+10D6;AL # GEORGIAN LETTER ZEN
+10D7;AL # GEORGIAN LETTER TAN
+10D8;AL # GEORGIAN LETTER IN
+10D9;AL # GEORGIAN LETTER KAN
+10DA;AL # GEORGIAN LETTER LAS
+10DB;AL # GEORGIAN LETTER MAN
+10DC;AL # GEORGIAN LETTER NAR
+10DD;AL # GEORGIAN LETTER ON
+10DE;AL # GEORGIAN LETTER PAR
+10DF;AL # GEORGIAN LETTER ZHAR
+10E0;AL # GEORGIAN LETTER RAE
+10E1;AL # GEORGIAN LETTER SAN
+10E2;AL # GEORGIAN LETTER TAR
+10E3;AL # GEORGIAN LETTER UN
+10E4;AL # GEORGIAN LETTER PHAR
+10E5;AL # GEORGIAN LETTER KHAR
+10E6;AL # GEORGIAN LETTER GHAN
+10E7;AL # GEORGIAN LETTER QAR
+10E8;AL # GEORGIAN LETTER SHIN
+10E9;AL # GEORGIAN LETTER CHIN
+10EA;AL # GEORGIAN LETTER CAN
+10EB;AL # GEORGIAN LETTER JIL
+10EC;AL # GEORGIAN LETTER CIL
+10ED;AL # GEORGIAN LETTER CHAR
+10EE;AL # GEORGIAN LETTER XAN
+10EF;AL # GEORGIAN LETTER JHAN
+10F0;AL # GEORGIAN LETTER HAE
+10F1;AL # GEORGIAN LETTER HE
+10F2;AL # GEORGIAN LETTER HIE
+10F3;AL # GEORGIAN LETTER WE
+10F4;AL # GEORGIAN LETTER HAR
+10F5;AL # GEORGIAN LETTER HOE
+10F6;AL # GEORGIAN LETTER FI
+10F7;AL # GEORGIAN LETTER YN
+10F8;AL # GEORGIAN LETTER ELIFI
+10F9;AL # GEORGIAN LETTER TURNED GAN
+10FA;AL # GEORGIAN LETTER AIN
+10FB;AL # GEORGIAN PARAGRAPH SEPARATOR
+10FC;AL # MODIFIER LETTER GEORGIAN NAR
+1100;JL # HANGUL CHOSEONG KIYEOK
+1101;JL # HANGUL CHOSEONG SSANGKIYEOK
+1102;JL # HANGUL CHOSEONG NIEUN
+1103;JL # HANGUL CHOSEONG TIKEUT
+1104;JL # HANGUL CHOSEONG SSANGTIKEUT
+1105;JL # HANGUL CHOSEONG RIEUL
+1106;JL # HANGUL CHOSEONG MIEUM
+1107;JL # HANGUL CHOSEONG PIEUP
+1108;JL # HANGUL CHOSEONG SSANGPIEUP
+1109;JL # HANGUL CHOSEONG SIOS
+110A;JL # HANGUL CHOSEONG SSANGSIOS
+110B;JL # HANGUL CHOSEONG IEUNG
+110C;JL # HANGUL CHOSEONG CIEUC
+110D;JL # HANGUL CHOSEONG SSANGCIEUC
+110E;JL # HANGUL CHOSEONG CHIEUCH
+110F;JL # HANGUL CHOSEONG KHIEUKH
+1110;JL # HANGUL CHOSEONG THIEUTH
+1111;JL # HANGUL CHOSEONG PHIEUPH
+1112;JL # HANGUL CHOSEONG HIEUH
+1113;JL # HANGUL CHOSEONG NIEUN-KIYEOK
+1114;JL # HANGUL CHOSEONG SSANGNIEUN
+1115;JL # HANGUL CHOSEONG NIEUN-TIKEUT
+1116;JL # HANGUL CHOSEONG NIEUN-PIEUP
+1117;JL # HANGUL CHOSEONG TIKEUT-KIYEOK
+1118;JL # HANGUL CHOSEONG RIEUL-NIEUN
+1119;JL # HANGUL CHOSEONG SSANGRIEUL
+111A;JL # HANGUL CHOSEONG RIEUL-HIEUH
+111B;JL # HANGUL CHOSEONG KAPYEOUNRIEUL
+111C;JL # HANGUL CHOSEONG MIEUM-PIEUP
+111D;JL # HANGUL CHOSEONG KAPYEOUNMIEUM
+111E;JL # HANGUL CHOSEONG PIEUP-KIYEOK
+111F;JL # HANGUL CHOSEONG PIEUP-NIEUN
+1120;JL # HANGUL CHOSEONG PIEUP-TIKEUT
+1121;JL # HANGUL CHOSEONG PIEUP-SIOS
+1122;JL # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123;JL # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124;JL # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125;JL # HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126;JL # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127;JL # HANGUL CHOSEONG PIEUP-CIEUC
+1128;JL # HANGUL CHOSEONG PIEUP-CHIEUCH
+1129;JL # HANGUL CHOSEONG PIEUP-THIEUTH
+112A;JL # HANGUL CHOSEONG PIEUP-PHIEUPH
+112B;JL # HANGUL CHOSEONG KAPYEOUNPIEUP
+112C;JL # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D;JL # HANGUL CHOSEONG SIOS-KIYEOK
+112E;JL # HANGUL CHOSEONG SIOS-NIEUN
+112F;JL # HANGUL CHOSEONG SIOS-TIKEUT
+1130;JL # HANGUL CHOSEONG SIOS-RIEUL
+1131;JL # HANGUL CHOSEONG SIOS-MIEUM
+1132;JL # HANGUL CHOSEONG SIOS-PIEUP
+1133;JL # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134;JL # HANGUL CHOSEONG SIOS-SSANGSIOS
+1135;JL # HANGUL CHOSEONG SIOS-IEUNG
+1136;JL # HANGUL CHOSEONG SIOS-CIEUC
+1137;JL # HANGUL CHOSEONG SIOS-CHIEUCH
+1138;JL # HANGUL CHOSEONG SIOS-KHIEUKH
+1139;JL # HANGUL CHOSEONG SIOS-THIEUTH
+113A;JL # HANGUL CHOSEONG SIOS-PHIEUPH
+113B;JL # HANGUL CHOSEONG SIOS-HIEUH
+113C;JL # HANGUL CHOSEONG CHITUEUMSIOS
+113D;JL # HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E;JL # HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F;JL # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140;JL # HANGUL CHOSEONG PANSIOS
+1141;JL # HANGUL CHOSEONG IEUNG-KIYEOK
+1142;JL # HANGUL CHOSEONG IEUNG-TIKEUT
+1143;JL # HANGUL CHOSEONG IEUNG-MIEUM
+1144;JL # HANGUL CHOSEONG IEUNG-PIEUP
+1145;JL # HANGUL CHOSEONG IEUNG-SIOS
+1146;JL # HANGUL CHOSEONG IEUNG-PANSIOS
+1147;JL # HANGUL CHOSEONG SSANGIEUNG
+1148;JL # HANGUL CHOSEONG IEUNG-CIEUC
+1149;JL # HANGUL CHOSEONG IEUNG-CHIEUCH
+114A;JL # HANGUL CHOSEONG IEUNG-THIEUTH
+114B;JL # HANGUL CHOSEONG IEUNG-PHIEUPH
+114C;JL # HANGUL CHOSEONG YESIEUNG
+114D;JL # HANGUL CHOSEONG CIEUC-IEUNG
+114E;JL # HANGUL CHOSEONG CHITUEUMCIEUC
+114F;JL # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150;JL # HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151;JL # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152;JL # HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153;JL # HANGUL CHOSEONG CHIEUCH-HIEUH
+1154;JL # HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155;JL # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156;JL # HANGUL CHOSEONG PHIEUPH-PIEUP
+1157;JL # HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158;JL # HANGUL CHOSEONG SSANGHIEUH
+1159;JL # HANGUL CHOSEONG YEORINHIEUH
+115F;JL # HANGUL CHOSEONG FILLER
+1160;JV # HANGUL JUNGSEONG FILLER
+1161;JV # HANGUL JUNGSEONG A
+1162;JV # HANGUL JUNGSEONG AE
+1163;JV # HANGUL JUNGSEONG YA
+1164;JV # HANGUL JUNGSEONG YAE
+1165;JV # HANGUL JUNGSEONG EO
+1166;JV # HANGUL JUNGSEONG E
+1167;JV # HANGUL JUNGSEONG YEO
+1168;JV # HANGUL JUNGSEONG YE
+1169;JV # HANGUL JUNGSEONG O
+116A;JV # HANGUL JUNGSEONG WA
+116B;JV # HANGUL JUNGSEONG WAE
+116C;JV # HANGUL JUNGSEONG OE
+116D;JV # HANGUL JUNGSEONG YO
+116E;JV # HANGUL JUNGSEONG U
+116F;JV # HANGUL JUNGSEONG WEO
+1170;JV # HANGUL JUNGSEONG WE
+1171;JV # HANGUL JUNGSEONG WI
+1172;JV # HANGUL JUNGSEONG YU
+1173;JV # HANGUL JUNGSEONG EU
+1174;JV # HANGUL JUNGSEONG YI
+1175;JV # HANGUL JUNGSEONG I
+1176;JV # HANGUL JUNGSEONG A-O
+1177;JV # HANGUL JUNGSEONG A-U
+1178;JV # HANGUL JUNGSEONG YA-O
+1179;JV # HANGUL JUNGSEONG YA-YO
+117A;JV # HANGUL JUNGSEONG EO-O
+117B;JV # HANGUL JUNGSEONG EO-U
+117C;JV # HANGUL JUNGSEONG EO-EU
+117D;JV # HANGUL JUNGSEONG YEO-O
+117E;JV # HANGUL JUNGSEONG YEO-U
+117F;JV # HANGUL JUNGSEONG O-EO
+1180;JV # HANGUL JUNGSEONG O-E
+1181;JV # HANGUL JUNGSEONG O-YE
+1182;JV # HANGUL JUNGSEONG O-O
+1183;JV # HANGUL JUNGSEONG O-U
+1184;JV # HANGUL JUNGSEONG YO-YA
+1185;JV # HANGUL JUNGSEONG YO-YAE
+1186;JV # HANGUL JUNGSEONG YO-YEO
+1187;JV # HANGUL JUNGSEONG YO-O
+1188;JV # HANGUL JUNGSEONG YO-I
+1189;JV # HANGUL JUNGSEONG U-A
+118A;JV # HANGUL JUNGSEONG U-AE
+118B;JV # HANGUL JUNGSEONG U-EO-EU
+118C;JV # HANGUL JUNGSEONG U-YE
+118D;JV # HANGUL JUNGSEONG U-U
+118E;JV # HANGUL JUNGSEONG YU-A
+118F;JV # HANGUL JUNGSEONG YU-EO
+1190;JV # HANGUL JUNGSEONG YU-E
+1191;JV # HANGUL JUNGSEONG YU-YEO
+1192;JV # HANGUL JUNGSEONG YU-YE
+1193;JV # HANGUL JUNGSEONG YU-U
+1194;JV # HANGUL JUNGSEONG YU-I
+1195;JV # HANGUL JUNGSEONG EU-U
+1196;JV # HANGUL JUNGSEONG EU-EU
+1197;JV # HANGUL JUNGSEONG YI-U
+1198;JV # HANGUL JUNGSEONG I-A
+1199;JV # HANGUL JUNGSEONG I-YA
+119A;JV # HANGUL JUNGSEONG I-O
+119B;JV # HANGUL JUNGSEONG I-U
+119C;JV # HANGUL JUNGSEONG I-EU
+119D;JV # HANGUL JUNGSEONG I-ARAEA
+119E;JV # HANGUL JUNGSEONG ARAEA
+119F;JV # HANGUL JUNGSEONG ARAEA-EO
+11A0;JV # HANGUL JUNGSEONG ARAEA-U
+11A1;JV # HANGUL JUNGSEONG ARAEA-I
+11A2;JV # HANGUL JUNGSEONG SSANGARAEA
+11A8;JT # HANGUL JONGSEONG KIYEOK
+11A9;JT # HANGUL JONGSEONG SSANGKIYEOK
+11AA;JT # HANGUL JONGSEONG KIYEOK-SIOS
+11AB;JT # HANGUL JONGSEONG NIEUN
+11AC;JT # HANGUL JONGSEONG NIEUN-CIEUC
+11AD;JT # HANGUL JONGSEONG NIEUN-HIEUH
+11AE;JT # HANGUL JONGSEONG TIKEUT
+11AF;JT # HANGUL JONGSEONG RIEUL
+11B0;JT # HANGUL JONGSEONG RIEUL-KIYEOK
+11B1;JT # HANGUL JONGSEONG RIEUL-MIEUM
+11B2;JT # HANGUL JONGSEONG RIEUL-PIEUP
+11B3;JT # HANGUL JONGSEONG RIEUL-SIOS
+11B4;JT # HANGUL JONGSEONG RIEUL-THIEUTH
+11B5;JT # HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6;JT # HANGUL JONGSEONG RIEUL-HIEUH
+11B7;JT # HANGUL JONGSEONG MIEUM
+11B8;JT # HANGUL JONGSEONG PIEUP
+11B9;JT # HANGUL JONGSEONG PIEUP-SIOS
+11BA;JT # HANGUL JONGSEONG SIOS
+11BB;JT # HANGUL JONGSEONG SSANGSIOS
+11BC;JT # HANGUL JONGSEONG IEUNG
+11BD;JT # HANGUL JONGSEONG CIEUC
+11BE;JT # HANGUL JONGSEONG CHIEUCH
+11BF;JT # HANGUL JONGSEONG KHIEUKH
+11C0;JT # HANGUL JONGSEONG THIEUTH
+11C1;JT # HANGUL JONGSEONG PHIEUPH
+11C2;JT # HANGUL JONGSEONG HIEUH
+11C3;JT # HANGUL JONGSEONG KIYEOK-RIEUL
+11C4;JT # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5;JT # HANGUL JONGSEONG NIEUN-KIYEOK
+11C6;JT # HANGUL JONGSEONG NIEUN-TIKEUT
+11C7;JT # HANGUL JONGSEONG NIEUN-SIOS
+11C8;JT # HANGUL JONGSEONG NIEUN-PANSIOS
+11C9;JT # HANGUL JONGSEONG NIEUN-THIEUTH
+11CA;JT # HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB;JT # HANGUL JONGSEONG TIKEUT-RIEUL
+11CC;JT # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD;JT # HANGUL JONGSEONG RIEUL-NIEUN
+11CE;JT # HANGUL JONGSEONG RIEUL-TIKEUT
+11CF;JT # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0;JT # HANGUL JONGSEONG SSANGRIEUL
+11D1;JT # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2;JT # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3;JT # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4;JT # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5;JT # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6;JT # HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7;JT # HANGUL JONGSEONG RIEUL-PANSIOS
+11D8;JT # HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9;JT # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA;JT # HANGUL JONGSEONG MIEUM-KIYEOK
+11DB;JT # HANGUL JONGSEONG MIEUM-RIEUL
+11DC;JT # HANGUL JONGSEONG MIEUM-PIEUP
+11DD;JT # HANGUL JONGSEONG MIEUM-SIOS
+11DE;JT # HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF;JT # HANGUL JONGSEONG MIEUM-PANSIOS
+11E0;JT # HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1;JT # HANGUL JONGSEONG MIEUM-HIEUH
+11E2;JT # HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3;JT # HANGUL JONGSEONG PIEUP-RIEUL
+11E4;JT # HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5;JT # HANGUL JONGSEONG PIEUP-HIEUH
+11E6;JT # HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7;JT # HANGUL JONGSEONG SIOS-KIYEOK
+11E8;JT # HANGUL JONGSEONG SIOS-TIKEUT
+11E9;JT # HANGUL JONGSEONG SIOS-RIEUL
+11EA;JT # HANGUL JONGSEONG SIOS-PIEUP
+11EB;JT # HANGUL JONGSEONG PANSIOS
+11EC;JT # HANGUL JONGSEONG IEUNG-KIYEOK
+11ED;JT # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE;JT # HANGUL JONGSEONG SSANGIEUNG
+11EF;JT # HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0;JT # HANGUL JONGSEONG YESIEUNG
+11F1;JT # HANGUL JONGSEONG YESIEUNG-SIOS
+11F2;JT # HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3;JT # HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4;JT # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5;JT # HANGUL JONGSEONG HIEUH-NIEUN
+11F6;JT # HANGUL JONGSEONG HIEUH-RIEUL
+11F7;JT # HANGUL JONGSEONG HIEUH-MIEUM
+11F8;JT # HANGUL JONGSEONG HIEUH-PIEUP
+11F9;JT # HANGUL JONGSEONG YEORINHIEUH
+1200;AL # ETHIOPIC SYLLABLE HA
+1201;AL # ETHIOPIC SYLLABLE HU
+1202;AL # ETHIOPIC SYLLABLE HI
+1203;AL # ETHIOPIC SYLLABLE HAA
+1204;AL # ETHIOPIC SYLLABLE HEE
+1205;AL # ETHIOPIC SYLLABLE HE
+1206;AL # ETHIOPIC SYLLABLE HO
+1207;AL # ETHIOPIC SYLLABLE HOA
+1208;AL # ETHIOPIC SYLLABLE LA
+1209;AL # ETHIOPIC SYLLABLE LU
+120A;AL # ETHIOPIC SYLLABLE LI
+120B;AL # ETHIOPIC SYLLABLE LAA
+120C;AL # ETHIOPIC SYLLABLE LEE
+120D;AL # ETHIOPIC SYLLABLE LE
+120E;AL # ETHIOPIC SYLLABLE LO
+120F;AL # ETHIOPIC SYLLABLE LWA
+1210;AL # ETHIOPIC SYLLABLE HHA
+1211;AL # ETHIOPIC SYLLABLE HHU
+1212;AL # ETHIOPIC SYLLABLE HHI
+1213;AL # ETHIOPIC SYLLABLE HHAA
+1214;AL # ETHIOPIC SYLLABLE HHEE
+1215;AL # ETHIOPIC SYLLABLE HHE
+1216;AL # ETHIOPIC SYLLABLE HHO
+1217;AL # ETHIOPIC SYLLABLE HHWA
+1218;AL # ETHIOPIC SYLLABLE MA
+1219;AL # ETHIOPIC SYLLABLE MU
+121A;AL # ETHIOPIC SYLLABLE MI
+121B;AL # ETHIOPIC SYLLABLE MAA
+121C;AL # ETHIOPIC SYLLABLE MEE
+121D;AL # ETHIOPIC SYLLABLE ME
+121E;AL # ETHIOPIC SYLLABLE MO
+121F;AL # ETHIOPIC SYLLABLE MWA
+1220;AL # ETHIOPIC SYLLABLE SZA
+1221;AL # ETHIOPIC SYLLABLE SZU
+1222;AL # ETHIOPIC SYLLABLE SZI
+1223;AL # ETHIOPIC SYLLABLE SZAA
+1224;AL # ETHIOPIC SYLLABLE SZEE
+1225;AL # ETHIOPIC SYLLABLE SZE
+1226;AL # ETHIOPIC SYLLABLE SZO
+1227;AL # ETHIOPIC SYLLABLE SZWA
+1228;AL # ETHIOPIC SYLLABLE RA
+1229;AL # ETHIOPIC SYLLABLE RU
+122A;AL # ETHIOPIC SYLLABLE RI
+122B;AL # ETHIOPIC SYLLABLE RAA
+122C;AL # ETHIOPIC SYLLABLE REE
+122D;AL # ETHIOPIC SYLLABLE RE
+122E;AL # ETHIOPIC SYLLABLE RO
+122F;AL # ETHIOPIC SYLLABLE RWA
+1230;AL # ETHIOPIC SYLLABLE SA
+1231;AL # ETHIOPIC SYLLABLE SU
+1232;AL # ETHIOPIC SYLLABLE SI
+1233;AL # ETHIOPIC SYLLABLE SAA
+1234;AL # ETHIOPIC SYLLABLE SEE
+1235;AL # ETHIOPIC SYLLABLE SE
+1236;AL # ETHIOPIC SYLLABLE SO
+1237;AL # ETHIOPIC SYLLABLE SWA
+1238;AL # ETHIOPIC SYLLABLE SHA
+1239;AL # ETHIOPIC SYLLABLE SHU
+123A;AL # ETHIOPIC SYLLABLE SHI
+123B;AL # ETHIOPIC SYLLABLE SHAA
+123C;AL # ETHIOPIC SYLLABLE SHEE
+123D;AL # ETHIOPIC SYLLABLE SHE
+123E;AL # ETHIOPIC SYLLABLE SHO
+123F;AL # ETHIOPIC SYLLABLE SHWA
+1240;AL # ETHIOPIC SYLLABLE QA
+1241;AL # ETHIOPIC SYLLABLE QU
+1242;AL # ETHIOPIC SYLLABLE QI
+1243;AL # ETHIOPIC SYLLABLE QAA
+1244;AL # ETHIOPIC SYLLABLE QEE
+1245;AL # ETHIOPIC SYLLABLE QE
+1246;AL # ETHIOPIC SYLLABLE QO
+1247;AL # ETHIOPIC SYLLABLE QOA
+1248;AL # ETHIOPIC SYLLABLE QWA
+124A;AL # ETHIOPIC SYLLABLE QWI
+124B;AL # ETHIOPIC SYLLABLE QWAA
+124C;AL # ETHIOPIC SYLLABLE QWEE
+124D;AL # ETHIOPIC SYLLABLE QWE
+1250;AL # ETHIOPIC SYLLABLE QHA
+1251;AL # ETHIOPIC SYLLABLE QHU
+1252;AL # ETHIOPIC SYLLABLE QHI
+1253;AL # ETHIOPIC SYLLABLE QHAA
+1254;AL # ETHIOPIC SYLLABLE QHEE
+1255;AL # ETHIOPIC SYLLABLE QHE
+1256;AL # ETHIOPIC SYLLABLE QHO
+1258;AL # ETHIOPIC SYLLABLE QHWA
+125A;AL # ETHIOPIC SYLLABLE QHWI
+125B;AL # ETHIOPIC SYLLABLE QHWAA
+125C;AL # ETHIOPIC SYLLABLE QHWEE
+125D;AL # ETHIOPIC SYLLABLE QHWE
+1260;AL # ETHIOPIC SYLLABLE BA
+1261;AL # ETHIOPIC SYLLABLE BU
+1262;AL # ETHIOPIC SYLLABLE BI
+1263;AL # ETHIOPIC SYLLABLE BAA
+1264;AL # ETHIOPIC SYLLABLE BEE
+1265;AL # ETHIOPIC SYLLABLE BE
+1266;AL # ETHIOPIC SYLLABLE BO
+1267;AL # ETHIOPIC SYLLABLE BWA
+1268;AL # ETHIOPIC SYLLABLE VA
+1269;AL # ETHIOPIC SYLLABLE VU
+126A;AL # ETHIOPIC SYLLABLE VI
+126B;AL # ETHIOPIC SYLLABLE VAA
+126C;AL # ETHIOPIC SYLLABLE VEE
+126D;AL # ETHIOPIC SYLLABLE VE
+126E;AL # ETHIOPIC SYLLABLE VO
+126F;AL # ETHIOPIC SYLLABLE VWA
+1270;AL # ETHIOPIC SYLLABLE TA
+1271;AL # ETHIOPIC SYLLABLE TU
+1272;AL # ETHIOPIC SYLLABLE TI
+1273;AL # ETHIOPIC SYLLABLE TAA
+1274;AL # ETHIOPIC SYLLABLE TEE
+1275;AL # ETHIOPIC SYLLABLE TE
+1276;AL # ETHIOPIC SYLLABLE TO
+1277;AL # ETHIOPIC SYLLABLE TWA
+1278;AL # ETHIOPIC SYLLABLE CA
+1279;AL # ETHIOPIC SYLLABLE CU
+127A;AL # ETHIOPIC SYLLABLE CI
+127B;AL # ETHIOPIC SYLLABLE CAA
+127C;AL # ETHIOPIC SYLLABLE CEE
+127D;AL # ETHIOPIC SYLLABLE CE
+127E;AL # ETHIOPIC SYLLABLE CO
+127F;AL # ETHIOPIC SYLLABLE CWA
+1280;AL # ETHIOPIC SYLLABLE XA
+1281;AL # ETHIOPIC SYLLABLE XU
+1282;AL # ETHIOPIC SYLLABLE XI
+1283;AL # ETHIOPIC SYLLABLE XAA
+1284;AL # ETHIOPIC SYLLABLE XEE
+1285;AL # ETHIOPIC SYLLABLE XE
+1286;AL # ETHIOPIC SYLLABLE XO
+1287;AL # ETHIOPIC SYLLABLE XOA
+1288;AL # ETHIOPIC SYLLABLE XWA
+128A;AL # ETHIOPIC SYLLABLE XWI
+128B;AL # ETHIOPIC SYLLABLE XWAA
+128C;AL # ETHIOPIC SYLLABLE XWEE
+128D;AL # ETHIOPIC SYLLABLE XWE
+1290;AL # ETHIOPIC SYLLABLE NA
+1291;AL # ETHIOPIC SYLLABLE NU
+1292;AL # ETHIOPIC SYLLABLE NI
+1293;AL # ETHIOPIC SYLLABLE NAA
+1294;AL # ETHIOPIC SYLLABLE NEE
+1295;AL # ETHIOPIC SYLLABLE NE
+1296;AL # ETHIOPIC SYLLABLE NO
+1297;AL # ETHIOPIC SYLLABLE NWA
+1298;AL # ETHIOPIC SYLLABLE NYA
+1299;AL # ETHIOPIC SYLLABLE NYU
+129A;AL # ETHIOPIC SYLLABLE NYI
+129B;AL # ETHIOPIC SYLLABLE NYAA
+129C;AL # ETHIOPIC SYLLABLE NYEE
+129D;AL # ETHIOPIC SYLLABLE NYE
+129E;AL # ETHIOPIC SYLLABLE NYO
+129F;AL # ETHIOPIC SYLLABLE NYWA
+12A0;AL # ETHIOPIC SYLLABLE GLOTTAL A
+12A1;AL # ETHIOPIC SYLLABLE GLOTTAL U
+12A2;AL # ETHIOPIC SYLLABLE GLOTTAL I
+12A3;AL # ETHIOPIC SYLLABLE GLOTTAL AA
+12A4;AL # ETHIOPIC SYLLABLE GLOTTAL EE
+12A5;AL # ETHIOPIC SYLLABLE GLOTTAL E
+12A6;AL # ETHIOPIC SYLLABLE GLOTTAL O
+12A7;AL # ETHIOPIC SYLLABLE GLOTTAL WA
+12A8;AL # ETHIOPIC SYLLABLE KA
+12A9;AL # ETHIOPIC SYLLABLE KU
+12AA;AL # ETHIOPIC SYLLABLE KI
+12AB;AL # ETHIOPIC SYLLABLE KAA
+12AC;AL # ETHIOPIC SYLLABLE KEE
+12AD;AL # ETHIOPIC SYLLABLE KE
+12AE;AL # ETHIOPIC SYLLABLE KO
+12AF;AL # ETHIOPIC SYLLABLE KOA
+12B0;AL # ETHIOPIC SYLLABLE KWA
+12B2;AL # ETHIOPIC SYLLABLE KWI
+12B3;AL # ETHIOPIC SYLLABLE KWAA
+12B4;AL # ETHIOPIC SYLLABLE KWEE
+12B5;AL # ETHIOPIC SYLLABLE KWE
+12B8;AL # ETHIOPIC SYLLABLE KXA
+12B9;AL # ETHIOPIC SYLLABLE KXU
+12BA;AL # ETHIOPIC SYLLABLE KXI
+12BB;AL # ETHIOPIC SYLLABLE KXAA
+12BC;AL # ETHIOPIC SYLLABLE KXEE
+12BD;AL # ETHIOPIC SYLLABLE KXE
+12BE;AL # ETHIOPIC SYLLABLE KXO
+12C0;AL # ETHIOPIC SYLLABLE KXWA
+12C2;AL # ETHIOPIC SYLLABLE KXWI
+12C3;AL # ETHIOPIC SYLLABLE KXWAA
+12C4;AL # ETHIOPIC SYLLABLE KXWEE
+12C5;AL # ETHIOPIC SYLLABLE KXWE
+12C8;AL # ETHIOPIC SYLLABLE WA
+12C9;AL # ETHIOPIC SYLLABLE WU
+12CA;AL # ETHIOPIC SYLLABLE WI
+12CB;AL # ETHIOPIC SYLLABLE WAA
+12CC;AL # ETHIOPIC SYLLABLE WEE
+12CD;AL # ETHIOPIC SYLLABLE WE
+12CE;AL # ETHIOPIC SYLLABLE WO
+12CF;AL # ETHIOPIC SYLLABLE WOA
+12D0;AL # ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1;AL # ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2;AL # ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3;AL # ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4;AL # ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5;AL # ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6;AL # ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8;AL # ETHIOPIC SYLLABLE ZA
+12D9;AL # ETHIOPIC SYLLABLE ZU
+12DA;AL # ETHIOPIC SYLLABLE ZI
+12DB;AL # ETHIOPIC SYLLABLE ZAA
+12DC;AL # ETHIOPIC SYLLABLE ZEE
+12DD;AL # ETHIOPIC SYLLABLE ZE
+12DE;AL # ETHIOPIC SYLLABLE ZO
+12DF;AL # ETHIOPIC SYLLABLE ZWA
+12E0;AL # ETHIOPIC SYLLABLE ZHA
+12E1;AL # ETHIOPIC SYLLABLE ZHU
+12E2;AL # ETHIOPIC SYLLABLE ZHI
+12E3;AL # ETHIOPIC SYLLABLE ZHAA
+12E4;AL # ETHIOPIC SYLLABLE ZHEE
+12E5;AL # ETHIOPIC SYLLABLE ZHE
+12E6;AL # ETHIOPIC SYLLABLE ZHO
+12E7;AL # ETHIOPIC SYLLABLE ZHWA
+12E8;AL # ETHIOPIC SYLLABLE YA
+12E9;AL # ETHIOPIC SYLLABLE YU
+12EA;AL # ETHIOPIC SYLLABLE YI
+12EB;AL # ETHIOPIC SYLLABLE YAA
+12EC;AL # ETHIOPIC SYLLABLE YEE
+12ED;AL # ETHIOPIC SYLLABLE YE
+12EE;AL # ETHIOPIC SYLLABLE YO
+12EF;AL # ETHIOPIC SYLLABLE YOA
+12F0;AL # ETHIOPIC SYLLABLE DA
+12F1;AL # ETHIOPIC SYLLABLE DU
+12F2;AL # ETHIOPIC SYLLABLE DI
+12F3;AL # ETHIOPIC SYLLABLE DAA
+12F4;AL # ETHIOPIC SYLLABLE DEE
+12F5;AL # ETHIOPIC SYLLABLE DE
+12F6;AL # ETHIOPIC SYLLABLE DO
+12F7;AL # ETHIOPIC SYLLABLE DWA
+12F8;AL # ETHIOPIC SYLLABLE DDA
+12F9;AL # ETHIOPIC SYLLABLE DDU
+12FA;AL # ETHIOPIC SYLLABLE DDI
+12FB;AL # ETHIOPIC SYLLABLE DDAA
+12FC;AL # ETHIOPIC SYLLABLE DDEE
+12FD;AL # ETHIOPIC SYLLABLE DDE
+12FE;AL # ETHIOPIC SYLLABLE DDO
+12FF;AL # ETHIOPIC SYLLABLE DDWA
+1300;AL # ETHIOPIC SYLLABLE JA
+1301;AL # ETHIOPIC SYLLABLE JU
+1302;AL # ETHIOPIC SYLLABLE JI
+1303;AL # ETHIOPIC SYLLABLE JAA
+1304;AL # ETHIOPIC SYLLABLE JEE
+1305;AL # ETHIOPIC SYLLABLE JE
+1306;AL # ETHIOPIC SYLLABLE JO
+1307;AL # ETHIOPIC SYLLABLE JWA
+1308;AL # ETHIOPIC SYLLABLE GA
+1309;AL # ETHIOPIC SYLLABLE GU
+130A;AL # ETHIOPIC SYLLABLE GI
+130B;AL # ETHIOPIC SYLLABLE GAA
+130C;AL # ETHIOPIC SYLLABLE GEE
+130D;AL # ETHIOPIC SYLLABLE GE
+130E;AL # ETHIOPIC SYLLABLE GO
+130F;AL # ETHIOPIC SYLLABLE GOA
+1310;AL # ETHIOPIC SYLLABLE GWA
+1312;AL # ETHIOPIC SYLLABLE GWI
+1313;AL # ETHIOPIC SYLLABLE GWAA
+1314;AL # ETHIOPIC SYLLABLE GWEE
+1315;AL # ETHIOPIC SYLLABLE GWE
+1318;AL # ETHIOPIC SYLLABLE GGA
+1319;AL # ETHIOPIC SYLLABLE GGU
+131A;AL # ETHIOPIC SYLLABLE GGI
+131B;AL # ETHIOPIC SYLLABLE GGAA
+131C;AL # ETHIOPIC SYLLABLE GGEE
+131D;AL # ETHIOPIC SYLLABLE GGE
+131E;AL # ETHIOPIC SYLLABLE GGO
+131F;AL # ETHIOPIC SYLLABLE GGWAA
+1320;AL # ETHIOPIC SYLLABLE THA
+1321;AL # ETHIOPIC SYLLABLE THU
+1322;AL # ETHIOPIC SYLLABLE THI
+1323;AL # ETHIOPIC SYLLABLE THAA
+1324;AL # ETHIOPIC SYLLABLE THEE
+1325;AL # ETHIOPIC SYLLABLE THE
+1326;AL # ETHIOPIC SYLLABLE THO
+1327;AL # ETHIOPIC SYLLABLE THWA
+1328;AL # ETHIOPIC SYLLABLE CHA
+1329;AL # ETHIOPIC SYLLABLE CHU
+132A;AL # ETHIOPIC SYLLABLE CHI
+132B;AL # ETHIOPIC SYLLABLE CHAA
+132C;AL # ETHIOPIC SYLLABLE CHEE
+132D;AL # ETHIOPIC SYLLABLE CHE
+132E;AL # ETHIOPIC SYLLABLE CHO
+132F;AL # ETHIOPIC SYLLABLE CHWA
+1330;AL # ETHIOPIC SYLLABLE PHA
+1331;AL # ETHIOPIC SYLLABLE PHU
+1332;AL # ETHIOPIC SYLLABLE PHI
+1333;AL # ETHIOPIC SYLLABLE PHAA
+1334;AL # ETHIOPIC SYLLABLE PHEE
+1335;AL # ETHIOPIC SYLLABLE PHE
+1336;AL # ETHIOPIC SYLLABLE PHO
+1337;AL # ETHIOPIC SYLLABLE PHWA
+1338;AL # ETHIOPIC SYLLABLE TSA
+1339;AL # ETHIOPIC SYLLABLE TSU
+133A;AL # ETHIOPIC SYLLABLE TSI
+133B;AL # ETHIOPIC SYLLABLE TSAA
+133C;AL # ETHIOPIC SYLLABLE TSEE
+133D;AL # ETHIOPIC SYLLABLE TSE
+133E;AL # ETHIOPIC SYLLABLE TSO
+133F;AL # ETHIOPIC SYLLABLE TSWA
+1340;AL # ETHIOPIC SYLLABLE TZA
+1341;AL # ETHIOPIC SYLLABLE TZU
+1342;AL # ETHIOPIC SYLLABLE TZI
+1343;AL # ETHIOPIC SYLLABLE TZAA
+1344;AL # ETHIOPIC SYLLABLE TZEE
+1345;AL # ETHIOPIC SYLLABLE TZE
+1346;AL # ETHIOPIC SYLLABLE TZO
+1347;AL # ETHIOPIC SYLLABLE TZOA
+1348;AL # ETHIOPIC SYLLABLE FA
+1349;AL # ETHIOPIC SYLLABLE FU
+134A;AL # ETHIOPIC SYLLABLE FI
+134B;AL # ETHIOPIC SYLLABLE FAA
+134C;AL # ETHIOPIC SYLLABLE FEE
+134D;AL # ETHIOPIC SYLLABLE FE
+134E;AL # ETHIOPIC SYLLABLE FO
+134F;AL # ETHIOPIC SYLLABLE FWA
+1350;AL # ETHIOPIC SYLLABLE PA
+1351;AL # ETHIOPIC SYLLABLE PU
+1352;AL # ETHIOPIC SYLLABLE PI
+1353;AL # ETHIOPIC SYLLABLE PAA
+1354;AL # ETHIOPIC SYLLABLE PEE
+1355;AL # ETHIOPIC SYLLABLE PE
+1356;AL # ETHIOPIC SYLLABLE PO
+1357;AL # ETHIOPIC SYLLABLE PWA
+1358;AL # ETHIOPIC SYLLABLE RYA
+1359;AL # ETHIOPIC SYLLABLE MYA
+135A;AL # ETHIOPIC SYLLABLE FYA
+135F;CM # ETHIOPIC COMBINING GEMINATION MARK
+1360;AL # ETHIOPIC SECTION MARK
+1361;BA # ETHIOPIC WORDSPACE
+1362;AL # ETHIOPIC FULL STOP
+1363;AL # ETHIOPIC COMMA
+1364;AL # ETHIOPIC SEMICOLON
+1365;AL # ETHIOPIC COLON
+1366;AL # ETHIOPIC PREFACE COLON
+1367;AL # ETHIOPIC QUESTION MARK
+1368;AL # ETHIOPIC PARAGRAPH SEPARATOR
+1369;AL # ETHIOPIC DIGIT ONE
+136A;AL # ETHIOPIC DIGIT TWO
+136B;AL # ETHIOPIC DIGIT THREE
+136C;AL # ETHIOPIC DIGIT FOUR
+136D;AL # ETHIOPIC DIGIT FIVE
+136E;AL # ETHIOPIC DIGIT SIX
+136F;AL # ETHIOPIC DIGIT SEVEN
+1370;AL # ETHIOPIC DIGIT EIGHT
+1371;AL # ETHIOPIC DIGIT NINE
+1372;AL # ETHIOPIC NUMBER TEN
+1373;AL # ETHIOPIC NUMBER TWENTY
+1374;AL # ETHIOPIC NUMBER THIRTY
+1375;AL # ETHIOPIC NUMBER FORTY
+1376;AL # ETHIOPIC NUMBER FIFTY
+1377;AL # ETHIOPIC NUMBER SIXTY
+1378;AL # ETHIOPIC NUMBER SEVENTY
+1379;AL # ETHIOPIC NUMBER EIGHTY
+137A;AL # ETHIOPIC NUMBER NINETY
+137B;AL # ETHIOPIC NUMBER HUNDRED
+137C;AL # ETHIOPIC NUMBER TEN THOUSAND
+1380;AL # ETHIOPIC SYLLABLE SEBATBEIT MWA
+1381;AL # ETHIOPIC SYLLABLE MWI
+1382;AL # ETHIOPIC SYLLABLE MWEE
+1383;AL # ETHIOPIC SYLLABLE MWE
+1384;AL # ETHIOPIC SYLLABLE SEBATBEIT BWA
+1385;AL # ETHIOPIC SYLLABLE BWI
+1386;AL # ETHIOPIC SYLLABLE BWEE
+1387;AL # ETHIOPIC SYLLABLE BWE
+1388;AL # ETHIOPIC SYLLABLE SEBATBEIT FWA
+1389;AL # ETHIOPIC SYLLABLE FWI
+138A;AL # ETHIOPIC SYLLABLE FWEE
+138B;AL # ETHIOPIC SYLLABLE FWE
+138C;AL # ETHIOPIC SYLLABLE SEBATBEIT PWA
+138D;AL # ETHIOPIC SYLLABLE PWI
+138E;AL # ETHIOPIC SYLLABLE PWEE
+138F;AL # ETHIOPIC SYLLABLE PWE
+1390;AL # ETHIOPIC TONAL MARK YIZET
+1391;AL # ETHIOPIC TONAL MARK DERET
+1392;AL # ETHIOPIC TONAL MARK RIKRIK
+1393;AL # ETHIOPIC TONAL MARK SHORT RIKRIK
+1394;AL # ETHIOPIC TONAL MARK DIFAT
+1395;AL # ETHIOPIC TONAL MARK KENAT
+1396;AL # ETHIOPIC TONAL MARK CHIRET
+1397;AL # ETHIOPIC TONAL MARK HIDET
+1398;AL # ETHIOPIC TONAL MARK DERET-HIDET
+1399;AL # ETHIOPIC TONAL MARK KURT
+13A0;AL # CHEROKEE LETTER A
+13A1;AL # CHEROKEE LETTER E
+13A2;AL # CHEROKEE LETTER I
+13A3;AL # CHEROKEE LETTER O
+13A4;AL # CHEROKEE LETTER U
+13A5;AL # CHEROKEE LETTER V
+13A6;AL # CHEROKEE LETTER GA
+13A7;AL # CHEROKEE LETTER KA
+13A8;AL # CHEROKEE LETTER GE
+13A9;AL # CHEROKEE LETTER GI
+13AA;AL # CHEROKEE LETTER GO
+13AB;AL # CHEROKEE LETTER GU
+13AC;AL # CHEROKEE LETTER GV
+13AD;AL # CHEROKEE LETTER HA
+13AE;AL # CHEROKEE LETTER HE
+13AF;AL # CHEROKEE LETTER HI
+13B0;AL # CHEROKEE LETTER HO
+13B1;AL # CHEROKEE LETTER HU
+13B2;AL # CHEROKEE LETTER HV
+13B3;AL # CHEROKEE LETTER LA
+13B4;AL # CHEROKEE LETTER LE
+13B5;AL # CHEROKEE LETTER LI
+13B6;AL # CHEROKEE LETTER LO
+13B7;AL # CHEROKEE LETTER LU
+13B8;AL # CHEROKEE LETTER LV
+13B9;AL # CHEROKEE LETTER MA
+13BA;AL # CHEROKEE LETTER ME
+13BB;AL # CHEROKEE LETTER MI
+13BC;AL # CHEROKEE LETTER MO
+13BD;AL # CHEROKEE LETTER MU
+13BE;AL # CHEROKEE LETTER NA
+13BF;AL # CHEROKEE LETTER HNA
+13C0;AL # CHEROKEE LETTER NAH
+13C1;AL # CHEROKEE LETTER NE
+13C2;AL # CHEROKEE LETTER NI
+13C3;AL # CHEROKEE LETTER NO
+13C4;AL # CHEROKEE LETTER NU
+13C5;AL # CHEROKEE LETTER NV
+13C6;AL # CHEROKEE LETTER QUA
+13C7;AL # CHEROKEE LETTER QUE
+13C8;AL # CHEROKEE LETTER QUI
+13C9;AL # CHEROKEE LETTER QUO
+13CA;AL # CHEROKEE LETTER QUU
+13CB;AL # CHEROKEE LETTER QUV
+13CC;AL # CHEROKEE LETTER SA
+13CD;AL # CHEROKEE LETTER S
+13CE;AL # CHEROKEE LETTER SE
+13CF;AL # CHEROKEE LETTER SI
+13D0;AL # CHEROKEE LETTER SO
+13D1;AL # CHEROKEE LETTER SU
+13D2;AL # CHEROKEE LETTER SV
+13D3;AL # CHEROKEE LETTER DA
+13D4;AL # CHEROKEE LETTER TA
+13D5;AL # CHEROKEE LETTER DE
+13D6;AL # CHEROKEE LETTER TE
+13D7;AL # CHEROKEE LETTER DI
+13D8;AL # CHEROKEE LETTER TI
+13D9;AL # CHEROKEE LETTER DO
+13DA;AL # CHEROKEE LETTER DU
+13DB;AL # CHEROKEE LETTER DV
+13DC;AL # CHEROKEE LETTER DLA
+13DD;AL # CHEROKEE LETTER TLA
+13DE;AL # CHEROKEE LETTER TLE
+13DF;AL # CHEROKEE LETTER TLI
+13E0;AL # CHEROKEE LETTER TLO
+13E1;AL # CHEROKEE LETTER TLU
+13E2;AL # CHEROKEE LETTER TLV
+13E3;AL # CHEROKEE LETTER TSA
+13E4;AL # CHEROKEE LETTER TSE
+13E5;AL # CHEROKEE LETTER TSI
+13E6;AL # CHEROKEE LETTER TSO
+13E7;AL # CHEROKEE LETTER TSU
+13E8;AL # CHEROKEE LETTER TSV
+13E9;AL # CHEROKEE LETTER WA
+13EA;AL # CHEROKEE LETTER WE
+13EB;AL # CHEROKEE LETTER WI
+13EC;AL # CHEROKEE LETTER WO
+13ED;AL # CHEROKEE LETTER WU
+13EE;AL # CHEROKEE LETTER WV
+13EF;AL # CHEROKEE LETTER YA
+13F0;AL # CHEROKEE LETTER YE
+13F1;AL # CHEROKEE LETTER YI
+13F2;AL # CHEROKEE LETTER YO
+13F3;AL # CHEROKEE LETTER YU
+13F4;AL # CHEROKEE LETTER YV
+1401;AL # CANADIAN SYLLABICS E
+1402;AL # CANADIAN SYLLABICS AAI
+1403;AL # CANADIAN SYLLABICS I
+1404;AL # CANADIAN SYLLABICS II
+1405;AL # CANADIAN SYLLABICS O
+1406;AL # CANADIAN SYLLABICS OO
+1407;AL # CANADIAN SYLLABICS Y-CREE OO
+1408;AL # CANADIAN SYLLABICS CARRIER EE
+1409;AL # CANADIAN SYLLABICS CARRIER I
+140A;AL # CANADIAN SYLLABICS A
+140B;AL # CANADIAN SYLLABICS AA
+140C;AL # CANADIAN SYLLABICS WE
+140D;AL # CANADIAN SYLLABICS WEST-CREE WE
+140E;AL # CANADIAN SYLLABICS WI
+140F;AL # CANADIAN SYLLABICS WEST-CREE WI
+1410;AL # CANADIAN SYLLABICS WII
+1411;AL # CANADIAN SYLLABICS WEST-CREE WII
+1412;AL # CANADIAN SYLLABICS WO
+1413;AL # CANADIAN SYLLABICS WEST-CREE WO
+1414;AL # CANADIAN SYLLABICS WOO
+1415;AL # CANADIAN SYLLABICS WEST-CREE WOO
+1416;AL # CANADIAN SYLLABICS NASKAPI WOO
+1417;AL # CANADIAN SYLLABICS WA
+1418;AL # CANADIAN SYLLABICS WEST-CREE WA
+1419;AL # CANADIAN SYLLABICS WAA
+141A;AL # CANADIAN SYLLABICS WEST-CREE WAA
+141B;AL # CANADIAN SYLLABICS NASKAPI WAA
+141C;AL # CANADIAN SYLLABICS AI
+141D;AL # CANADIAN SYLLABICS Y-CREE W
+141E;AL # CANADIAN SYLLABICS GLOTTAL STOP
+141F;AL # CANADIAN SYLLABICS FINAL ACUTE
+1420;AL # CANADIAN SYLLABICS FINAL GRAVE
+1421;AL # CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422;AL # CANADIAN SYLLABICS FINAL TOP HALF RING
+1423;AL # CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424;AL # CANADIAN SYLLABICS FINAL RING
+1425;AL # CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426;AL # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427;AL # CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428;AL # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429;AL # CANADIAN SYLLABICS FINAL PLUS
+142A;AL # CANADIAN SYLLABICS FINAL DOWN TACK
+142B;AL # CANADIAN SYLLABICS EN
+142C;AL # CANADIAN SYLLABICS IN
+142D;AL # CANADIAN SYLLABICS ON
+142E;AL # CANADIAN SYLLABICS AN
+142F;AL # CANADIAN SYLLABICS PE
+1430;AL # CANADIAN SYLLABICS PAAI
+1431;AL # CANADIAN SYLLABICS PI
+1432;AL # CANADIAN SYLLABICS PII
+1433;AL # CANADIAN SYLLABICS PO
+1434;AL # CANADIAN SYLLABICS POO
+1435;AL # CANADIAN SYLLABICS Y-CREE POO
+1436;AL # CANADIAN SYLLABICS CARRIER HEE
+1437;AL # CANADIAN SYLLABICS CARRIER HI
+1438;AL # CANADIAN SYLLABICS PA
+1439;AL # CANADIAN SYLLABICS PAA
+143A;AL # CANADIAN SYLLABICS PWE
+143B;AL # CANADIAN SYLLABICS WEST-CREE PWE
+143C;AL # CANADIAN SYLLABICS PWI
+143D;AL # CANADIAN SYLLABICS WEST-CREE PWI
+143E;AL # CANADIAN SYLLABICS PWII
+143F;AL # CANADIAN SYLLABICS WEST-CREE PWII
+1440;AL # CANADIAN SYLLABICS PWO
+1441;AL # CANADIAN SYLLABICS WEST-CREE PWO
+1442;AL # CANADIAN SYLLABICS PWOO
+1443;AL # CANADIAN SYLLABICS WEST-CREE PWOO
+1444;AL # CANADIAN SYLLABICS PWA
+1445;AL # CANADIAN SYLLABICS WEST-CREE PWA
+1446;AL # CANADIAN SYLLABICS PWAA
+1447;AL # CANADIAN SYLLABICS WEST-CREE PWAA
+1448;AL # CANADIAN SYLLABICS Y-CREE PWAA
+1449;AL # CANADIAN SYLLABICS P
+144A;AL # CANADIAN SYLLABICS WEST-CREE P
+144B;AL # CANADIAN SYLLABICS CARRIER H
+144C;AL # CANADIAN SYLLABICS TE
+144D;AL # CANADIAN SYLLABICS TAAI
+144E;AL # CANADIAN SYLLABICS TI
+144F;AL # CANADIAN SYLLABICS TII
+1450;AL # CANADIAN SYLLABICS TO
+1451;AL # CANADIAN SYLLABICS TOO
+1452;AL # CANADIAN SYLLABICS Y-CREE TOO
+1453;AL # CANADIAN SYLLABICS CARRIER DEE
+1454;AL # CANADIAN SYLLABICS CARRIER DI
+1455;AL # CANADIAN SYLLABICS TA
+1456;AL # CANADIAN SYLLABICS TAA
+1457;AL # CANADIAN SYLLABICS TWE
+1458;AL # CANADIAN SYLLABICS WEST-CREE TWE
+1459;AL # CANADIAN SYLLABICS TWI
+145A;AL # CANADIAN SYLLABICS WEST-CREE TWI
+145B;AL # CANADIAN SYLLABICS TWII
+145C;AL # CANADIAN SYLLABICS WEST-CREE TWII
+145D;AL # CANADIAN SYLLABICS TWO
+145E;AL # CANADIAN SYLLABICS WEST-CREE TWO
+145F;AL # CANADIAN SYLLABICS TWOO
+1460;AL # CANADIAN SYLLABICS WEST-CREE TWOO
+1461;AL # CANADIAN SYLLABICS TWA
+1462;AL # CANADIAN SYLLABICS WEST-CREE TWA
+1463;AL # CANADIAN SYLLABICS TWAA
+1464;AL # CANADIAN SYLLABICS WEST-CREE TWAA
+1465;AL # CANADIAN SYLLABICS NASKAPI TWAA
+1466;AL # CANADIAN SYLLABICS T
+1467;AL # CANADIAN SYLLABICS TTE
+1468;AL # CANADIAN SYLLABICS TTI
+1469;AL # CANADIAN SYLLABICS TTO
+146A;AL # CANADIAN SYLLABICS TTA
+146B;AL # CANADIAN SYLLABICS KE
+146C;AL # CANADIAN SYLLABICS KAAI
+146D;AL # CANADIAN SYLLABICS KI
+146E;AL # CANADIAN SYLLABICS KII
+146F;AL # CANADIAN SYLLABICS KO
+1470;AL # CANADIAN SYLLABICS KOO
+1471;AL # CANADIAN SYLLABICS Y-CREE KOO
+1472;AL # CANADIAN SYLLABICS KA
+1473;AL # CANADIAN SYLLABICS KAA
+1474;AL # CANADIAN SYLLABICS KWE
+1475;AL # CANADIAN SYLLABICS WEST-CREE KWE
+1476;AL # CANADIAN SYLLABICS KWI
+1477;AL # CANADIAN SYLLABICS WEST-CREE KWI
+1478;AL # CANADIAN SYLLABICS KWII
+1479;AL # CANADIAN SYLLABICS WEST-CREE KWII
+147A;AL # CANADIAN SYLLABICS KWO
+147B;AL # CANADIAN SYLLABICS WEST-CREE KWO
+147C;AL # CANADIAN SYLLABICS KWOO
+147D;AL # CANADIAN SYLLABICS WEST-CREE KWOO
+147E;AL # CANADIAN SYLLABICS KWA
+147F;AL # CANADIAN SYLLABICS WEST-CREE KWA
+1480;AL # CANADIAN SYLLABICS KWAA
+1481;AL # CANADIAN SYLLABICS WEST-CREE KWAA
+1482;AL # CANADIAN SYLLABICS NASKAPI KWAA
+1483;AL # CANADIAN SYLLABICS K
+1484;AL # CANADIAN SYLLABICS KW
+1485;AL # CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486;AL # CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487;AL # CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488;AL # CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489;AL # CANADIAN SYLLABICS CE
+148A;AL # CANADIAN SYLLABICS CAAI
+148B;AL # CANADIAN SYLLABICS CI
+148C;AL # CANADIAN SYLLABICS CII
+148D;AL # CANADIAN SYLLABICS CO
+148E;AL # CANADIAN SYLLABICS COO
+148F;AL # CANADIAN SYLLABICS Y-CREE COO
+1490;AL # CANADIAN SYLLABICS CA
+1491;AL # CANADIAN SYLLABICS CAA
+1492;AL # CANADIAN SYLLABICS CWE
+1493;AL # CANADIAN SYLLABICS WEST-CREE CWE
+1494;AL # CANADIAN SYLLABICS CWI
+1495;AL # CANADIAN SYLLABICS WEST-CREE CWI
+1496;AL # CANADIAN SYLLABICS CWII
+1497;AL # CANADIAN SYLLABICS WEST-CREE CWII
+1498;AL # CANADIAN SYLLABICS CWO
+1499;AL # CANADIAN SYLLABICS WEST-CREE CWO
+149A;AL # CANADIAN SYLLABICS CWOO
+149B;AL # CANADIAN SYLLABICS WEST-CREE CWOO
+149C;AL # CANADIAN SYLLABICS CWA
+149D;AL # CANADIAN SYLLABICS WEST-CREE CWA
+149E;AL # CANADIAN SYLLABICS CWAA
+149F;AL # CANADIAN SYLLABICS WEST-CREE CWAA
+14A0;AL # CANADIAN SYLLABICS NASKAPI CWAA
+14A1;AL # CANADIAN SYLLABICS C
+14A2;AL # CANADIAN SYLLABICS SAYISI TH
+14A3;AL # CANADIAN SYLLABICS ME
+14A4;AL # CANADIAN SYLLABICS MAAI
+14A5;AL # CANADIAN SYLLABICS MI
+14A6;AL # CANADIAN SYLLABICS MII
+14A7;AL # CANADIAN SYLLABICS MO
+14A8;AL # CANADIAN SYLLABICS MOO
+14A9;AL # CANADIAN SYLLABICS Y-CREE MOO
+14AA;AL # CANADIAN SYLLABICS MA
+14AB;AL # CANADIAN SYLLABICS MAA
+14AC;AL # CANADIAN SYLLABICS MWE
+14AD;AL # CANADIAN SYLLABICS WEST-CREE MWE
+14AE;AL # CANADIAN SYLLABICS MWI
+14AF;AL # CANADIAN SYLLABICS WEST-CREE MWI
+14B0;AL # CANADIAN SYLLABICS MWII
+14B1;AL # CANADIAN SYLLABICS WEST-CREE MWII
+14B2;AL # CANADIAN SYLLABICS MWO
+14B3;AL # CANADIAN SYLLABICS WEST-CREE MWO
+14B4;AL # CANADIAN SYLLABICS MWOO
+14B5;AL # CANADIAN SYLLABICS WEST-CREE MWOO
+14B6;AL # CANADIAN SYLLABICS MWA
+14B7;AL # CANADIAN SYLLABICS WEST-CREE MWA
+14B8;AL # CANADIAN SYLLABICS MWAA
+14B9;AL # CANADIAN SYLLABICS WEST-CREE MWAA
+14BA;AL # CANADIAN SYLLABICS NASKAPI MWAA
+14BB;AL # CANADIAN SYLLABICS M
+14BC;AL # CANADIAN SYLLABICS WEST-CREE M
+14BD;AL # CANADIAN SYLLABICS MH
+14BE;AL # CANADIAN SYLLABICS ATHAPASCAN M
+14BF;AL # CANADIAN SYLLABICS SAYISI M
+14C0;AL # CANADIAN SYLLABICS NE
+14C1;AL # CANADIAN SYLLABICS NAAI
+14C2;AL # CANADIAN SYLLABICS NI
+14C3;AL # CANADIAN SYLLABICS NII
+14C4;AL # CANADIAN SYLLABICS NO
+14C5;AL # CANADIAN SYLLABICS NOO
+14C6;AL # CANADIAN SYLLABICS Y-CREE NOO
+14C7;AL # CANADIAN SYLLABICS NA
+14C8;AL # CANADIAN SYLLABICS NAA
+14C9;AL # CANADIAN SYLLABICS NWE
+14CA;AL # CANADIAN SYLLABICS WEST-CREE NWE
+14CB;AL # CANADIAN SYLLABICS NWA
+14CC;AL # CANADIAN SYLLABICS WEST-CREE NWA
+14CD;AL # CANADIAN SYLLABICS NWAA
+14CE;AL # CANADIAN SYLLABICS WEST-CREE NWAA
+14CF;AL # CANADIAN SYLLABICS NASKAPI NWAA
+14D0;AL # CANADIAN SYLLABICS N
+14D1;AL # CANADIAN SYLLABICS CARRIER NG
+14D2;AL # CANADIAN SYLLABICS NH
+14D3;AL # CANADIAN SYLLABICS LE
+14D4;AL # CANADIAN SYLLABICS LAAI
+14D5;AL # CANADIAN SYLLABICS LI
+14D6;AL # CANADIAN SYLLABICS LII
+14D7;AL # CANADIAN SYLLABICS LO
+14D8;AL # CANADIAN SYLLABICS LOO
+14D9;AL # CANADIAN SYLLABICS Y-CREE LOO
+14DA;AL # CANADIAN SYLLABICS LA
+14DB;AL # CANADIAN SYLLABICS LAA
+14DC;AL # CANADIAN SYLLABICS LWE
+14DD;AL # CANADIAN SYLLABICS WEST-CREE LWE
+14DE;AL # CANADIAN SYLLABICS LWI
+14DF;AL # CANADIAN SYLLABICS WEST-CREE LWI
+14E0;AL # CANADIAN SYLLABICS LWII
+14E1;AL # CANADIAN SYLLABICS WEST-CREE LWII
+14E2;AL # CANADIAN SYLLABICS LWO
+14E3;AL # CANADIAN SYLLABICS WEST-CREE LWO
+14E4;AL # CANADIAN SYLLABICS LWOO
+14E5;AL # CANADIAN SYLLABICS WEST-CREE LWOO
+14E6;AL # CANADIAN SYLLABICS LWA
+14E7;AL # CANADIAN SYLLABICS WEST-CREE LWA
+14E8;AL # CANADIAN SYLLABICS LWAA
+14E9;AL # CANADIAN SYLLABICS WEST-CREE LWAA
+14EA;AL # CANADIAN SYLLABICS L
+14EB;AL # CANADIAN SYLLABICS WEST-CREE L
+14EC;AL # CANADIAN SYLLABICS MEDIAL L
+14ED;AL # CANADIAN SYLLABICS SE
+14EE;AL # CANADIAN SYLLABICS SAAI
+14EF;AL # CANADIAN SYLLABICS SI
+14F0;AL # CANADIAN SYLLABICS SII
+14F1;AL # CANADIAN SYLLABICS SO
+14F2;AL # CANADIAN SYLLABICS SOO
+14F3;AL # CANADIAN SYLLABICS Y-CREE SOO
+14F4;AL # CANADIAN SYLLABICS SA
+14F5;AL # CANADIAN SYLLABICS SAA
+14F6;AL # CANADIAN SYLLABICS SWE
+14F7;AL # CANADIAN SYLLABICS WEST-CREE SWE
+14F8;AL # CANADIAN SYLLABICS SWI
+14F9;AL # CANADIAN SYLLABICS WEST-CREE SWI
+14FA;AL # CANADIAN SYLLABICS SWII
+14FB;AL # CANADIAN SYLLABICS WEST-CREE SWII
+14FC;AL # CANADIAN SYLLABICS SWO
+14FD;AL # CANADIAN SYLLABICS WEST-CREE SWO
+14FE;AL # CANADIAN SYLLABICS SWOO
+14FF;AL # CANADIAN SYLLABICS WEST-CREE SWOO
+1500;AL # CANADIAN SYLLABICS SWA
+1501;AL # CANADIAN SYLLABICS WEST-CREE SWA
+1502;AL # CANADIAN SYLLABICS SWAA
+1503;AL # CANADIAN SYLLABICS WEST-CREE SWAA
+1504;AL # CANADIAN SYLLABICS NASKAPI SWAA
+1505;AL # CANADIAN SYLLABICS S
+1506;AL # CANADIAN SYLLABICS ATHAPASCAN S
+1507;AL # CANADIAN SYLLABICS SW
+1508;AL # CANADIAN SYLLABICS BLACKFOOT S
+1509;AL # CANADIAN SYLLABICS MOOSE-CREE SK
+150A;AL # CANADIAN SYLLABICS NASKAPI SKW
+150B;AL # CANADIAN SYLLABICS NASKAPI S-W
+150C;AL # CANADIAN SYLLABICS NASKAPI SPWA
+150D;AL # CANADIAN SYLLABICS NASKAPI STWA
+150E;AL # CANADIAN SYLLABICS NASKAPI SKWA
+150F;AL # CANADIAN SYLLABICS NASKAPI SCWA
+1510;AL # CANADIAN SYLLABICS SHE
+1511;AL # CANADIAN SYLLABICS SHI
+1512;AL # CANADIAN SYLLABICS SHII
+1513;AL # CANADIAN SYLLABICS SHO
+1514;AL # CANADIAN SYLLABICS SHOO
+1515;AL # CANADIAN SYLLABICS SHA
+1516;AL # CANADIAN SYLLABICS SHAA
+1517;AL # CANADIAN SYLLABICS SHWE
+1518;AL # CANADIAN SYLLABICS WEST-CREE SHWE
+1519;AL # CANADIAN SYLLABICS SHWI
+151A;AL # CANADIAN SYLLABICS WEST-CREE SHWI
+151B;AL # CANADIAN SYLLABICS SHWII
+151C;AL # CANADIAN SYLLABICS WEST-CREE SHWII
+151D;AL # CANADIAN SYLLABICS SHWO
+151E;AL # CANADIAN SYLLABICS WEST-CREE SHWO
+151F;AL # CANADIAN SYLLABICS SHWOO
+1520;AL # CANADIAN SYLLABICS WEST-CREE SHWOO
+1521;AL # CANADIAN SYLLABICS SHWA
+1522;AL # CANADIAN SYLLABICS WEST-CREE SHWA
+1523;AL # CANADIAN SYLLABICS SHWAA
+1524;AL # CANADIAN SYLLABICS WEST-CREE SHWAA
+1525;AL # CANADIAN SYLLABICS SH
+1526;AL # CANADIAN SYLLABICS YE
+1527;AL # CANADIAN SYLLABICS YAAI
+1528;AL # CANADIAN SYLLABICS YI
+1529;AL # CANADIAN SYLLABICS YII
+152A;AL # CANADIAN SYLLABICS YO
+152B;AL # CANADIAN SYLLABICS YOO
+152C;AL # CANADIAN SYLLABICS Y-CREE YOO
+152D;AL # CANADIAN SYLLABICS YA
+152E;AL # CANADIAN SYLLABICS YAA
+152F;AL # CANADIAN SYLLABICS YWE
+1530;AL # CANADIAN SYLLABICS WEST-CREE YWE
+1531;AL # CANADIAN SYLLABICS YWI
+1532;AL # CANADIAN SYLLABICS WEST-CREE YWI
+1533;AL # CANADIAN SYLLABICS YWII
+1534;AL # CANADIAN SYLLABICS WEST-CREE YWII
+1535;AL # CANADIAN SYLLABICS YWO
+1536;AL # CANADIAN SYLLABICS WEST-CREE YWO
+1537;AL # CANADIAN SYLLABICS YWOO
+1538;AL # CANADIAN SYLLABICS WEST-CREE YWOO
+1539;AL # CANADIAN SYLLABICS YWA
+153A;AL # CANADIAN SYLLABICS WEST-CREE YWA
+153B;AL # CANADIAN SYLLABICS YWAA
+153C;AL # CANADIAN SYLLABICS WEST-CREE YWAA
+153D;AL # CANADIAN SYLLABICS NASKAPI YWAA
+153E;AL # CANADIAN SYLLABICS Y
+153F;AL # CANADIAN SYLLABICS BIBLE-CREE Y
+1540;AL # CANADIAN SYLLABICS WEST-CREE Y
+1541;AL # CANADIAN SYLLABICS SAYISI YI
+1542;AL # CANADIAN SYLLABICS RE
+1543;AL # CANADIAN SYLLABICS R-CREE RE
+1544;AL # CANADIAN SYLLABICS WEST-CREE LE
+1545;AL # CANADIAN SYLLABICS RAAI
+1546;AL # CANADIAN SYLLABICS RI
+1547;AL # CANADIAN SYLLABICS RII
+1548;AL # CANADIAN SYLLABICS RO
+1549;AL # CANADIAN SYLLABICS ROO
+154A;AL # CANADIAN SYLLABICS WEST-CREE LO
+154B;AL # CANADIAN SYLLABICS RA
+154C;AL # CANADIAN SYLLABICS RAA
+154D;AL # CANADIAN SYLLABICS WEST-CREE LA
+154E;AL # CANADIAN SYLLABICS RWAA
+154F;AL # CANADIAN SYLLABICS WEST-CREE RWAA
+1550;AL # CANADIAN SYLLABICS R
+1551;AL # CANADIAN SYLLABICS WEST-CREE R
+1552;AL # CANADIAN SYLLABICS MEDIAL R
+1553;AL # CANADIAN SYLLABICS FE
+1554;AL # CANADIAN SYLLABICS FAAI
+1555;AL # CANADIAN SYLLABICS FI
+1556;AL # CANADIAN SYLLABICS FII
+1557;AL # CANADIAN SYLLABICS FO
+1558;AL # CANADIAN SYLLABICS FOO
+1559;AL # CANADIAN SYLLABICS FA
+155A;AL # CANADIAN SYLLABICS FAA
+155B;AL # CANADIAN SYLLABICS FWAA
+155C;AL # CANADIAN SYLLABICS WEST-CREE FWAA
+155D;AL # CANADIAN SYLLABICS F
+155E;AL # CANADIAN SYLLABICS THE
+155F;AL # CANADIAN SYLLABICS N-CREE THE
+1560;AL # CANADIAN SYLLABICS THI
+1561;AL # CANADIAN SYLLABICS N-CREE THI
+1562;AL # CANADIAN SYLLABICS THII
+1563;AL # CANADIAN SYLLABICS N-CREE THII
+1564;AL # CANADIAN SYLLABICS THO
+1565;AL # CANADIAN SYLLABICS THOO
+1566;AL # CANADIAN SYLLABICS THA
+1567;AL # CANADIAN SYLLABICS THAA
+1568;AL # CANADIAN SYLLABICS THWAA
+1569;AL # CANADIAN SYLLABICS WEST-CREE THWAA
+156A;AL # CANADIAN SYLLABICS TH
+156B;AL # CANADIAN SYLLABICS TTHE
+156C;AL # CANADIAN SYLLABICS TTHI
+156D;AL # CANADIAN SYLLABICS TTHO
+156E;AL # CANADIAN SYLLABICS TTHA
+156F;AL # CANADIAN SYLLABICS TTH
+1570;AL # CANADIAN SYLLABICS TYE
+1571;AL # CANADIAN SYLLABICS TYI
+1572;AL # CANADIAN SYLLABICS TYO
+1573;AL # CANADIAN SYLLABICS TYA
+1574;AL # CANADIAN SYLLABICS NUNAVIK HE
+1575;AL # CANADIAN SYLLABICS NUNAVIK HI
+1576;AL # CANADIAN SYLLABICS NUNAVIK HII
+1577;AL # CANADIAN SYLLABICS NUNAVIK HO
+1578;AL # CANADIAN SYLLABICS NUNAVIK HOO
+1579;AL # CANADIAN SYLLABICS NUNAVIK HA
+157A;AL # CANADIAN SYLLABICS NUNAVIK HAA
+157B;AL # CANADIAN SYLLABICS NUNAVIK H
+157C;AL # CANADIAN SYLLABICS NUNAVUT H
+157D;AL # CANADIAN SYLLABICS HK
+157E;AL # CANADIAN SYLLABICS QAAI
+157F;AL # CANADIAN SYLLABICS QI
+1580;AL # CANADIAN SYLLABICS QII
+1581;AL # CANADIAN SYLLABICS QO
+1582;AL # CANADIAN SYLLABICS QOO
+1583;AL # CANADIAN SYLLABICS QA
+1584;AL # CANADIAN SYLLABICS QAA
+1585;AL # CANADIAN SYLLABICS Q
+1586;AL # CANADIAN SYLLABICS TLHE
+1587;AL # CANADIAN SYLLABICS TLHI
+1588;AL # CANADIAN SYLLABICS TLHO
+1589;AL # CANADIAN SYLLABICS TLHA
+158A;AL # CANADIAN SYLLABICS WEST-CREE RE
+158B;AL # CANADIAN SYLLABICS WEST-CREE RI
+158C;AL # CANADIAN SYLLABICS WEST-CREE RO
+158D;AL # CANADIAN SYLLABICS WEST-CREE RA
+158E;AL # CANADIAN SYLLABICS NGAAI
+158F;AL # CANADIAN SYLLABICS NGI
+1590;AL # CANADIAN SYLLABICS NGII
+1591;AL # CANADIAN SYLLABICS NGO
+1592;AL # CANADIAN SYLLABICS NGOO
+1593;AL # CANADIAN SYLLABICS NGA
+1594;AL # CANADIAN SYLLABICS NGAA
+1595;AL # CANADIAN SYLLABICS NG
+1596;AL # CANADIAN SYLLABICS NNG
+1597;AL # CANADIAN SYLLABICS SAYISI SHE
+1598;AL # CANADIAN SYLLABICS SAYISI SHI
+1599;AL # CANADIAN SYLLABICS SAYISI SHO
+159A;AL # CANADIAN SYLLABICS SAYISI SHA
+159B;AL # CANADIAN SYLLABICS WOODS-CREE THE
+159C;AL # CANADIAN SYLLABICS WOODS-CREE THI
+159D;AL # CANADIAN SYLLABICS WOODS-CREE THO
+159E;AL # CANADIAN SYLLABICS WOODS-CREE THA
+159F;AL # CANADIAN SYLLABICS WOODS-CREE TH
+15A0;AL # CANADIAN SYLLABICS LHI
+15A1;AL # CANADIAN SYLLABICS LHII
+15A2;AL # CANADIAN SYLLABICS LHO
+15A3;AL # CANADIAN SYLLABICS LHOO
+15A4;AL # CANADIAN SYLLABICS LHA
+15A5;AL # CANADIAN SYLLABICS LHAA
+15A6;AL # CANADIAN SYLLABICS LH
+15A7;AL # CANADIAN SYLLABICS TH-CREE THE
+15A8;AL # CANADIAN SYLLABICS TH-CREE THI
+15A9;AL # CANADIAN SYLLABICS TH-CREE THII
+15AA;AL # CANADIAN SYLLABICS TH-CREE THO
+15AB;AL # CANADIAN SYLLABICS TH-CREE THOO
+15AC;AL # CANADIAN SYLLABICS TH-CREE THA
+15AD;AL # CANADIAN SYLLABICS TH-CREE THAA
+15AE;AL # CANADIAN SYLLABICS TH-CREE TH
+15AF;AL # CANADIAN SYLLABICS AIVILIK B
+15B0;AL # CANADIAN SYLLABICS BLACKFOOT E
+15B1;AL # CANADIAN SYLLABICS BLACKFOOT I
+15B2;AL # CANADIAN SYLLABICS BLACKFOOT O
+15B3;AL # CANADIAN SYLLABICS BLACKFOOT A
+15B4;AL # CANADIAN SYLLABICS BLACKFOOT WE
+15B5;AL # CANADIAN SYLLABICS BLACKFOOT WI
+15B6;AL # CANADIAN SYLLABICS BLACKFOOT WO
+15B7;AL # CANADIAN SYLLABICS BLACKFOOT WA
+15B8;AL # CANADIAN SYLLABICS BLACKFOOT NE
+15B9;AL # CANADIAN SYLLABICS BLACKFOOT NI
+15BA;AL # CANADIAN SYLLABICS BLACKFOOT NO
+15BB;AL # CANADIAN SYLLABICS BLACKFOOT NA
+15BC;AL # CANADIAN SYLLABICS BLACKFOOT KE
+15BD;AL # CANADIAN SYLLABICS BLACKFOOT KI
+15BE;AL # CANADIAN SYLLABICS BLACKFOOT KO
+15BF;AL # CANADIAN SYLLABICS BLACKFOOT KA
+15C0;AL # CANADIAN SYLLABICS SAYISI HE
+15C1;AL # CANADIAN SYLLABICS SAYISI HI
+15C2;AL # CANADIAN SYLLABICS SAYISI HO
+15C3;AL # CANADIAN SYLLABICS SAYISI HA
+15C4;AL # CANADIAN SYLLABICS CARRIER GHU
+15C5;AL # CANADIAN SYLLABICS CARRIER GHO
+15C6;AL # CANADIAN SYLLABICS CARRIER GHE
+15C7;AL # CANADIAN SYLLABICS CARRIER GHEE
+15C8;AL # CANADIAN SYLLABICS CARRIER GHI
+15C9;AL # CANADIAN SYLLABICS CARRIER GHA
+15CA;AL # CANADIAN SYLLABICS CARRIER RU
+15CB;AL # CANADIAN SYLLABICS CARRIER RO
+15CC;AL # CANADIAN SYLLABICS CARRIER RE
+15CD;AL # CANADIAN SYLLABICS CARRIER REE
+15CE;AL # CANADIAN SYLLABICS CARRIER RI
+15CF;AL # CANADIAN SYLLABICS CARRIER RA
+15D0;AL # CANADIAN SYLLABICS CARRIER WU
+15D1;AL # CANADIAN SYLLABICS CARRIER WO
+15D2;AL # CANADIAN SYLLABICS CARRIER WE
+15D3;AL # CANADIAN SYLLABICS CARRIER WEE
+15D4;AL # CANADIAN SYLLABICS CARRIER WI
+15D5;AL # CANADIAN SYLLABICS CARRIER WA
+15D6;AL # CANADIAN SYLLABICS CARRIER HWU
+15D7;AL # CANADIAN SYLLABICS CARRIER HWO
+15D8;AL # CANADIAN SYLLABICS CARRIER HWE
+15D9;AL # CANADIAN SYLLABICS CARRIER HWEE
+15DA;AL # CANADIAN SYLLABICS CARRIER HWI
+15DB;AL # CANADIAN SYLLABICS CARRIER HWA
+15DC;AL # CANADIAN SYLLABICS CARRIER THU
+15DD;AL # CANADIAN SYLLABICS CARRIER THO
+15DE;AL # CANADIAN SYLLABICS CARRIER THE
+15DF;AL # CANADIAN SYLLABICS CARRIER THEE
+15E0;AL # CANADIAN SYLLABICS CARRIER THI
+15E1;AL # CANADIAN SYLLABICS CARRIER THA
+15E2;AL # CANADIAN SYLLABICS CARRIER TTU
+15E3;AL # CANADIAN SYLLABICS CARRIER TTO
+15E4;AL # CANADIAN SYLLABICS CARRIER TTE
+15E5;AL # CANADIAN SYLLABICS CARRIER TTEE
+15E6;AL # CANADIAN SYLLABICS CARRIER TTI
+15E7;AL # CANADIAN SYLLABICS CARRIER TTA
+15E8;AL # CANADIAN SYLLABICS CARRIER PU
+15E9;AL # CANADIAN SYLLABICS CARRIER PO
+15EA;AL # CANADIAN SYLLABICS CARRIER PE
+15EB;AL # CANADIAN SYLLABICS CARRIER PEE
+15EC;AL # CANADIAN SYLLABICS CARRIER PI
+15ED;AL # CANADIAN SYLLABICS CARRIER PA
+15EE;AL # CANADIAN SYLLABICS CARRIER P
+15EF;AL # CANADIAN SYLLABICS CARRIER GU
+15F0;AL # CANADIAN SYLLABICS CARRIER GO
+15F1;AL # CANADIAN SYLLABICS CARRIER GE
+15F2;AL # CANADIAN SYLLABICS CARRIER GEE
+15F3;AL # CANADIAN SYLLABICS CARRIER GI
+15F4;AL # CANADIAN SYLLABICS CARRIER GA
+15F5;AL # CANADIAN SYLLABICS CARRIER KHU
+15F6;AL # CANADIAN SYLLABICS CARRIER KHO
+15F7;AL # CANADIAN SYLLABICS CARRIER KHE
+15F8;AL # CANADIAN SYLLABICS CARRIER KHEE
+15F9;AL # CANADIAN SYLLABICS CARRIER KHI
+15FA;AL # CANADIAN SYLLABICS CARRIER KHA
+15FB;AL # CANADIAN SYLLABICS CARRIER KKU
+15FC;AL # CANADIAN SYLLABICS CARRIER KKO
+15FD;AL # CANADIAN SYLLABICS CARRIER KKE
+15FE;AL # CANADIAN SYLLABICS CARRIER KKEE
+15FF;AL # CANADIAN SYLLABICS CARRIER KKI
+1600;AL # CANADIAN SYLLABICS CARRIER KKA
+1601;AL # CANADIAN SYLLABICS CARRIER KK
+1602;AL # CANADIAN SYLLABICS CARRIER NU
+1603;AL # CANADIAN SYLLABICS CARRIER NO
+1604;AL # CANADIAN SYLLABICS CARRIER NE
+1605;AL # CANADIAN SYLLABICS CARRIER NEE
+1606;AL # CANADIAN SYLLABICS CARRIER NI
+1607;AL # CANADIAN SYLLABICS CARRIER NA
+1608;AL # CANADIAN SYLLABICS CARRIER MU
+1609;AL # CANADIAN SYLLABICS CARRIER MO
+160A;AL # CANADIAN SYLLABICS CARRIER ME
+160B;AL # CANADIAN SYLLABICS CARRIER MEE
+160C;AL # CANADIAN SYLLABICS CARRIER MI
+160D;AL # CANADIAN SYLLABICS CARRIER MA
+160E;AL # CANADIAN SYLLABICS CARRIER YU
+160F;AL # CANADIAN SYLLABICS CARRIER YO
+1610;AL # CANADIAN SYLLABICS CARRIER YE
+1611;AL # CANADIAN SYLLABICS CARRIER YEE
+1612;AL # CANADIAN SYLLABICS CARRIER YI
+1613;AL # CANADIAN SYLLABICS CARRIER YA
+1614;AL # CANADIAN SYLLABICS CARRIER JU
+1615;AL # CANADIAN SYLLABICS SAYISI JU
+1616;AL # CANADIAN SYLLABICS CARRIER JO
+1617;AL # CANADIAN SYLLABICS CARRIER JE
+1618;AL # CANADIAN SYLLABICS CARRIER JEE
+1619;AL # CANADIAN SYLLABICS CARRIER JI
+161A;AL # CANADIAN SYLLABICS SAYISI JI
+161B;AL # CANADIAN SYLLABICS CARRIER JA
+161C;AL # CANADIAN SYLLABICS CARRIER JJU
+161D;AL # CANADIAN SYLLABICS CARRIER JJO
+161E;AL # CANADIAN SYLLABICS CARRIER JJE
+161F;AL # CANADIAN SYLLABICS CARRIER JJEE
+1620;AL # CANADIAN SYLLABICS CARRIER JJI
+1621;AL # CANADIAN SYLLABICS CARRIER JJA
+1622;AL # CANADIAN SYLLABICS CARRIER LU
+1623;AL # CANADIAN SYLLABICS CARRIER LO
+1624;AL # CANADIAN SYLLABICS CARRIER LE
+1625;AL # CANADIAN SYLLABICS CARRIER LEE
+1626;AL # CANADIAN SYLLABICS CARRIER LI
+1627;AL # CANADIAN SYLLABICS CARRIER LA
+1628;AL # CANADIAN SYLLABICS CARRIER DLU
+1629;AL # CANADIAN SYLLABICS CARRIER DLO
+162A;AL # CANADIAN SYLLABICS CARRIER DLE
+162B;AL # CANADIAN SYLLABICS CARRIER DLEE
+162C;AL # CANADIAN SYLLABICS CARRIER DLI
+162D;AL # CANADIAN SYLLABICS CARRIER DLA
+162E;AL # CANADIAN SYLLABICS CARRIER LHU
+162F;AL # CANADIAN SYLLABICS CARRIER LHO
+1630;AL # CANADIAN SYLLABICS CARRIER LHE
+1631;AL # CANADIAN SYLLABICS CARRIER LHEE
+1632;AL # CANADIAN SYLLABICS CARRIER LHI
+1633;AL # CANADIAN SYLLABICS CARRIER LHA
+1634;AL # CANADIAN SYLLABICS CARRIER TLHU
+1635;AL # CANADIAN SYLLABICS CARRIER TLHO
+1636;AL # CANADIAN SYLLABICS CARRIER TLHE
+1637;AL # CANADIAN SYLLABICS CARRIER TLHEE
+1638;AL # CANADIAN SYLLABICS CARRIER TLHI
+1639;AL # CANADIAN SYLLABICS CARRIER TLHA
+163A;AL # CANADIAN SYLLABICS CARRIER TLU
+163B;AL # CANADIAN SYLLABICS CARRIER TLO
+163C;AL # CANADIAN SYLLABICS CARRIER TLE
+163D;AL # CANADIAN SYLLABICS CARRIER TLEE
+163E;AL # CANADIAN SYLLABICS CARRIER TLI
+163F;AL # CANADIAN SYLLABICS CARRIER TLA
+1640;AL # CANADIAN SYLLABICS CARRIER ZU
+1641;AL # CANADIAN SYLLABICS CARRIER ZO
+1642;AL # CANADIAN SYLLABICS CARRIER ZE
+1643;AL # CANADIAN SYLLABICS CARRIER ZEE
+1644;AL # CANADIAN SYLLABICS CARRIER ZI
+1645;AL # CANADIAN SYLLABICS CARRIER ZA
+1646;AL # CANADIAN SYLLABICS CARRIER Z
+1647;AL # CANADIAN SYLLABICS CARRIER INITIAL Z
+1648;AL # CANADIAN SYLLABICS CARRIER DZU
+1649;AL # CANADIAN SYLLABICS CARRIER DZO
+164A;AL # CANADIAN SYLLABICS CARRIER DZE
+164B;AL # CANADIAN SYLLABICS CARRIER DZEE
+164C;AL # CANADIAN SYLLABICS CARRIER DZI
+164D;AL # CANADIAN SYLLABICS CARRIER DZA
+164E;AL # CANADIAN SYLLABICS CARRIER SU
+164F;AL # CANADIAN SYLLABICS CARRIER SO
+1650;AL # CANADIAN SYLLABICS CARRIER SE
+1651;AL # CANADIAN SYLLABICS CARRIER SEE
+1652;AL # CANADIAN SYLLABICS CARRIER SI
+1653;AL # CANADIAN SYLLABICS CARRIER SA
+1654;AL # CANADIAN SYLLABICS CARRIER SHU
+1655;AL # CANADIAN SYLLABICS CARRIER SHO
+1656;AL # CANADIAN SYLLABICS CARRIER SHE
+1657;AL # CANADIAN SYLLABICS CARRIER SHEE
+1658;AL # CANADIAN SYLLABICS CARRIER SHI
+1659;AL # CANADIAN SYLLABICS CARRIER SHA
+165A;AL # CANADIAN SYLLABICS CARRIER SH
+165B;AL # CANADIAN SYLLABICS CARRIER TSU
+165C;AL # CANADIAN SYLLABICS CARRIER TSO
+165D;AL # CANADIAN SYLLABICS CARRIER TSE
+165E;AL # CANADIAN SYLLABICS CARRIER TSEE
+165F;AL # CANADIAN SYLLABICS CARRIER TSI
+1660;AL # CANADIAN SYLLABICS CARRIER TSA
+1661;AL # CANADIAN SYLLABICS CARRIER CHU
+1662;AL # CANADIAN SYLLABICS CARRIER CHO
+1663;AL # CANADIAN SYLLABICS CARRIER CHE
+1664;AL # CANADIAN SYLLABICS CARRIER CHEE
+1665;AL # CANADIAN SYLLABICS CARRIER CHI
+1666;AL # CANADIAN SYLLABICS CARRIER CHA
+1667;AL # CANADIAN SYLLABICS CARRIER TTSU
+1668;AL # CANADIAN SYLLABICS CARRIER TTSO
+1669;AL # CANADIAN SYLLABICS CARRIER TTSE
+166A;AL # CANADIAN SYLLABICS CARRIER TTSEE
+166B;AL # CANADIAN SYLLABICS CARRIER TTSI
+166C;AL # CANADIAN SYLLABICS CARRIER TTSA
+166D;AL # CANADIAN SYLLABICS CHI SIGN
+166E;AL # CANADIAN SYLLABICS FULL STOP
+166F;AL # CANADIAN SYLLABICS QAI
+1670;AL # CANADIAN SYLLABICS NGAI
+1671;AL # CANADIAN SYLLABICS NNGI
+1672;AL # CANADIAN SYLLABICS NNGII
+1673;AL # CANADIAN SYLLABICS NNGO
+1674;AL # CANADIAN SYLLABICS NNGOO
+1675;AL # CANADIAN SYLLABICS NNGA
+1676;AL # CANADIAN SYLLABICS NNGAA
+1680;BA # OGHAM SPACE MARK
+1681;AL # OGHAM LETTER BEITH
+1682;AL # OGHAM LETTER LUIS
+1683;AL # OGHAM LETTER FEARN
+1684;AL # OGHAM LETTER SAIL
+1685;AL # OGHAM LETTER NION
+1686;AL # OGHAM LETTER UATH
+1687;AL # OGHAM LETTER DAIR
+1688;AL # OGHAM LETTER TINNE
+1689;AL # OGHAM LETTER COLL
+168A;AL # OGHAM LETTER CEIRT
+168B;AL # OGHAM LETTER MUIN
+168C;AL # OGHAM LETTER GORT
+168D;AL # OGHAM LETTER NGEADAL
+168E;AL # OGHAM LETTER STRAIF
+168F;AL # OGHAM LETTER RUIS
+1690;AL # OGHAM LETTER AILM
+1691;AL # OGHAM LETTER ONN
+1692;AL # OGHAM LETTER UR
+1693;AL # OGHAM LETTER EADHADH
+1694;AL # OGHAM LETTER IODHADH
+1695;AL # OGHAM LETTER EABHADH
+1696;AL # OGHAM LETTER OR
+1697;AL # OGHAM LETTER UILLEANN
+1698;AL # OGHAM LETTER IFIN
+1699;AL # OGHAM LETTER EAMHANCHOLL
+169A;AL # OGHAM LETTER PEITH
+169B;OP # OGHAM FEATHER MARK
+169C;CL # OGHAM REVERSED FEATHER MARK
+16A0;AL # RUNIC LETTER FEHU FEOH FE F
+16A1;AL # RUNIC LETTER V
+16A2;AL # RUNIC LETTER URUZ UR U
+16A3;AL # RUNIC LETTER YR
+16A4;AL # RUNIC LETTER Y
+16A5;AL # RUNIC LETTER W
+16A6;AL # RUNIC LETTER THURISAZ THURS THORN
+16A7;AL # RUNIC LETTER ETH
+16A8;AL # RUNIC LETTER ANSUZ A
+16A9;AL # RUNIC LETTER OS O
+16AA;AL # RUNIC LETTER AC A
+16AB;AL # RUNIC LETTER AESC
+16AC;AL # RUNIC LETTER LONG-BRANCH-OSS O
+16AD;AL # RUNIC LETTER SHORT-TWIG-OSS O
+16AE;AL # RUNIC LETTER O
+16AF;AL # RUNIC LETTER OE
+16B0;AL # RUNIC LETTER ON
+16B1;AL # RUNIC LETTER RAIDO RAD REID R
+16B2;AL # RUNIC LETTER KAUNA
+16B3;AL # RUNIC LETTER CEN
+16B4;AL # RUNIC LETTER KAUN K
+16B5;AL # RUNIC LETTER G
+16B6;AL # RUNIC LETTER ENG
+16B7;AL # RUNIC LETTER GEBO GYFU G
+16B8;AL # RUNIC LETTER GAR
+16B9;AL # RUNIC LETTER WUNJO WYNN W
+16BA;AL # RUNIC LETTER HAGLAZ H
+16BB;AL # RUNIC LETTER HAEGL H
+16BC;AL # RUNIC LETTER LONG-BRANCH-HAGALL H
+16BD;AL # RUNIC LETTER SHORT-TWIG-HAGALL H
+16BE;AL # RUNIC LETTER NAUDIZ NYD NAUD N
+16BF;AL # RUNIC LETTER SHORT-TWIG-NAUD N
+16C0;AL # RUNIC LETTER DOTTED-N
+16C1;AL # RUNIC LETTER ISAZ IS ISS I
+16C2;AL # RUNIC LETTER E
+16C3;AL # RUNIC LETTER JERAN J
+16C4;AL # RUNIC LETTER GER
+16C5;AL # RUNIC LETTER LONG-BRANCH-AR AE
+16C6;AL # RUNIC LETTER SHORT-TWIG-AR A
+16C7;AL # RUNIC LETTER IWAZ EOH
+16C8;AL # RUNIC LETTER PERTHO PEORTH P
+16C9;AL # RUNIC LETTER ALGIZ EOLHX
+16CA;AL # RUNIC LETTER SOWILO S
+16CB;AL # RUNIC LETTER SIGEL LONG-BRANCH-SOL S
+16CC;AL # RUNIC LETTER SHORT-TWIG-SOL S
+16CD;AL # RUNIC LETTER C
+16CE;AL # RUNIC LETTER Z
+16CF;AL # RUNIC LETTER TIWAZ TIR TYR T
+16D0;AL # RUNIC LETTER SHORT-TWIG-TYR T
+16D1;AL # RUNIC LETTER D
+16D2;AL # RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3;AL # RUNIC LETTER SHORT-TWIG-BJARKAN B
+16D4;AL # RUNIC LETTER DOTTED-P
+16D5;AL # RUNIC LETTER OPEN-P
+16D6;AL # RUNIC LETTER EHWAZ EH E
+16D7;AL # RUNIC LETTER MANNAZ MAN M
+16D8;AL # RUNIC LETTER LONG-BRANCH-MADR M
+16D9;AL # RUNIC LETTER SHORT-TWIG-MADR M
+16DA;AL # RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB;AL # RUNIC LETTER DOTTED-L
+16DC;AL # RUNIC LETTER INGWAZ
+16DD;AL # RUNIC LETTER ING
+16DE;AL # RUNIC LETTER DAGAZ DAEG D
+16DF;AL # RUNIC LETTER OTHALAN ETHEL O
+16E0;AL # RUNIC LETTER EAR
+16E1;AL # RUNIC LETTER IOR
+16E2;AL # RUNIC LETTER CWEORTH
+16E3;AL # RUNIC LETTER CALC
+16E4;AL # RUNIC LETTER CEALC
+16E5;AL # RUNIC LETTER STAN
+16E6;AL # RUNIC LETTER LONG-BRANCH-YR
+16E7;AL # RUNIC LETTER SHORT-TWIG-YR
+16E8;AL # RUNIC LETTER ICELANDIC-YR
+16E9;AL # RUNIC LETTER Q
+16EA;AL # RUNIC LETTER X
+16EB;BA # RUNIC SINGLE PUNCTUATION
+16EC;BA # RUNIC MULTIPLE PUNCTUATION
+16ED;BA # RUNIC CROSS PUNCTUATION
+16EE;AL # RUNIC ARLAUG SYMBOL
+16EF;AL # RUNIC TVIMADUR SYMBOL
+16F0;AL # RUNIC BELGTHOR SYMBOL
+1700;AL # TAGALOG LETTER A
+1701;AL # TAGALOG LETTER I
+1702;AL # TAGALOG LETTER U
+1703;AL # TAGALOG LETTER KA
+1704;AL # TAGALOG LETTER GA
+1705;AL # TAGALOG LETTER NGA
+1706;AL # TAGALOG LETTER TA
+1707;AL # TAGALOG LETTER DA
+1708;AL # TAGALOG LETTER NA
+1709;AL # TAGALOG LETTER PA
+170A;AL # TAGALOG LETTER BA
+170B;AL # TAGALOG LETTER MA
+170C;AL # TAGALOG LETTER YA
+170E;AL # TAGALOG LETTER LA
+170F;AL # TAGALOG LETTER WA
+1710;AL # TAGALOG LETTER SA
+1711;AL # TAGALOG LETTER HA
+1712;CM # TAGALOG VOWEL SIGN I
+1713;CM # TAGALOG VOWEL SIGN U
+1714;CM # TAGALOG SIGN VIRAMA
+1720;AL # HANUNOO LETTER A
+1721;AL # HANUNOO LETTER I
+1722;AL # HANUNOO LETTER U
+1723;AL # HANUNOO LETTER KA
+1724;AL # HANUNOO LETTER GA
+1725;AL # HANUNOO LETTER NGA
+1726;AL # HANUNOO LETTER TA
+1727;AL # HANUNOO LETTER DA
+1728;AL # HANUNOO LETTER NA
+1729;AL # HANUNOO LETTER PA
+172A;AL # HANUNOO LETTER BA
+172B;AL # HANUNOO LETTER MA
+172C;AL # HANUNOO LETTER YA
+172D;AL # HANUNOO LETTER RA
+172E;AL # HANUNOO LETTER LA
+172F;AL # HANUNOO LETTER WA
+1730;AL # HANUNOO LETTER SA
+1731;AL # HANUNOO LETTER HA
+1732;CM # HANUNOO VOWEL SIGN I
+1733;CM # HANUNOO VOWEL SIGN U
+1734;CM # HANUNOO SIGN PAMUDPOD
+1735;BA # PHILIPPINE SINGLE PUNCTUATION
+1736;BA # PHILIPPINE DOUBLE PUNCTUATION
+1740;AL # BUHID LETTER A
+1741;AL # BUHID LETTER I
+1742;AL # BUHID LETTER U
+1743;AL # BUHID LETTER KA
+1744;AL # BUHID LETTER GA
+1745;AL # BUHID LETTER NGA
+1746;AL # BUHID LETTER TA
+1747;AL # BUHID LETTER DA
+1748;AL # BUHID LETTER NA
+1749;AL # BUHID LETTER PA
+174A;AL # BUHID LETTER BA
+174B;AL # BUHID LETTER MA
+174C;AL # BUHID LETTER YA
+174D;AL # BUHID LETTER RA
+174E;AL # BUHID LETTER LA
+174F;AL # BUHID LETTER WA
+1750;AL # BUHID LETTER SA
+1751;AL # BUHID LETTER HA
+1752;CM # BUHID VOWEL SIGN I
+1753;CM # BUHID VOWEL SIGN U
+1760;AL # TAGBANWA LETTER A
+1761;AL # TAGBANWA LETTER I
+1762;AL # TAGBANWA LETTER U
+1763;AL # TAGBANWA LETTER KA
+1764;AL # TAGBANWA LETTER GA
+1765;AL # TAGBANWA LETTER NGA
+1766;AL # TAGBANWA LETTER TA
+1767;AL # TAGBANWA LETTER DA
+1768;AL # TAGBANWA LETTER NA
+1769;AL # TAGBANWA LETTER PA
+176A;AL # TAGBANWA LETTER BA
+176B;AL # TAGBANWA LETTER MA
+176C;AL # TAGBANWA LETTER YA
+176E;AL # TAGBANWA LETTER LA
+176F;AL # TAGBANWA LETTER WA
+1770;AL # TAGBANWA LETTER SA
+1772;CM # TAGBANWA VOWEL SIGN I
+1773;CM # TAGBANWA VOWEL SIGN U
+1780;SA # KHMER LETTER KA
+1781;SA # KHMER LETTER KHA
+1782;SA # KHMER LETTER KO
+1783;SA # KHMER LETTER KHO
+1784;SA # KHMER LETTER NGO
+1785;SA # KHMER LETTER CA
+1786;SA # KHMER LETTER CHA
+1787;SA # KHMER LETTER CO
+1788;SA # KHMER LETTER CHO
+1789;SA # KHMER LETTER NYO
+178A;SA # KHMER LETTER DA
+178B;SA # KHMER LETTER TTHA
+178C;SA # KHMER LETTER DO
+178D;SA # KHMER LETTER TTHO
+178E;SA # KHMER LETTER NNO
+178F;SA # KHMER LETTER TA
+1790;SA # KHMER LETTER THA
+1791;SA # KHMER LETTER TO
+1792;SA # KHMER LETTER THO
+1793;SA # KHMER LETTER NO
+1794;SA # KHMER LETTER BA
+1795;SA # KHMER LETTER PHA
+1796;SA # KHMER LETTER PO
+1797;SA # KHMER LETTER PHO
+1798;SA # KHMER LETTER MO
+1799;SA # KHMER LETTER YO
+179A;SA # KHMER LETTER RO
+179B;SA # KHMER LETTER LO
+179C;SA # KHMER LETTER VO
+179D;SA # KHMER LETTER SHA
+179E;SA # KHMER LETTER SSO
+179F;SA # KHMER LETTER SA
+17A0;SA # KHMER LETTER HA
+17A1;SA # KHMER LETTER LA
+17A2;SA # KHMER LETTER QA
+17A3;SA # KHMER INDEPENDENT VOWEL QAQ
+17A4;SA # KHMER INDEPENDENT VOWEL QAA
+17A5;SA # KHMER INDEPENDENT VOWEL QI
+17A6;SA # KHMER INDEPENDENT VOWEL QII
+17A7;SA # KHMER INDEPENDENT VOWEL QU
+17A8;SA # KHMER INDEPENDENT VOWEL QUK
+17A9;SA # KHMER INDEPENDENT VOWEL QUU
+17AA;SA # KHMER INDEPENDENT VOWEL QUUV
+17AB;SA # KHMER INDEPENDENT VOWEL RY
+17AC;SA # KHMER INDEPENDENT VOWEL RYY
+17AD;SA # KHMER INDEPENDENT VOWEL LY
+17AE;SA # KHMER INDEPENDENT VOWEL LYY
+17AF;SA # KHMER INDEPENDENT VOWEL QE
+17B0;SA # KHMER INDEPENDENT VOWEL QAI
+17B1;SA # KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2;SA # KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3;SA # KHMER INDEPENDENT VOWEL QAU
+17B4;SA # KHMER VOWEL INHERENT AQ
+17B5;SA # KHMER VOWEL INHERENT AA
+17B6;SA # KHMER VOWEL SIGN AA
+17B7;SA # KHMER VOWEL SIGN I
+17B8;SA # KHMER VOWEL SIGN II
+17B9;SA # KHMER VOWEL SIGN Y
+17BA;SA # KHMER VOWEL SIGN YY
+17BB;SA # KHMER VOWEL SIGN U
+17BC;SA # KHMER VOWEL SIGN UU
+17BD;SA # KHMER VOWEL SIGN UA
+17BE;SA # KHMER VOWEL SIGN OE
+17BF;SA # KHMER VOWEL SIGN YA
+17C0;SA # KHMER VOWEL SIGN IE
+17C1;SA # KHMER VOWEL SIGN E
+17C2;SA # KHMER VOWEL SIGN AE
+17C3;SA # KHMER VOWEL SIGN AI
+17C4;SA # KHMER VOWEL SIGN OO
+17C5;SA # KHMER VOWEL SIGN AU
+17C6;SA # KHMER SIGN NIKAHIT
+17C7;SA # KHMER SIGN REAHMUK
+17C8;SA # KHMER SIGN YUUKALEAPINTU
+17C9;SA # KHMER SIGN MUUSIKATOAN
+17CA;SA # KHMER SIGN TRIISAP
+17CB;SA # KHMER SIGN BANTOC
+17CC;SA # KHMER SIGN ROBAT
+17CD;SA # KHMER SIGN TOANDAKHIAT
+17CE;SA # KHMER SIGN KAKABAT
+17CF;SA # KHMER SIGN AHSDA
+17D0;SA # KHMER SIGN SAMYOK SANNYA
+17D1;SA # KHMER SIGN VIRIAM
+17D2;SA # KHMER SIGN COENG
+17D3;SA # KHMER SIGN BATHAMASAT
+17D4;BA # KHMER SIGN KHAN
+17D5;BA # KHMER SIGN BARIYOOSAN
+17D6;NS # KHMER SIGN CAMNUC PII KUUH
+17D7;SA # KHMER SIGN LEK TOO
+17D8;BA # KHMER SIGN BEYYAL
+17D9;AL # KHMER SIGN PHNAEK MUAN
+17DA;BA # KHMER SIGN KOOMUUT
+17DB;PR # KHMER CURRENCY SYMBOL RIEL
+17DC;SA # KHMER SIGN AVAKRAHASANYA
+17DD;SA # KHMER SIGN ATTHACAN
+17E0;NU # KHMER DIGIT ZERO
+17E1;NU # KHMER DIGIT ONE
+17E2;NU # KHMER DIGIT TWO
+17E3;NU # KHMER DIGIT THREE
+17E4;NU # KHMER DIGIT FOUR
+17E5;NU # KHMER DIGIT FIVE
+17E6;NU # KHMER DIGIT SIX
+17E7;NU # KHMER DIGIT SEVEN
+17E8;NU # KHMER DIGIT EIGHT
+17E9;NU # KHMER DIGIT NINE
+17F0;AL # KHMER SYMBOL LEK ATTAK SON
+17F1;AL # KHMER SYMBOL LEK ATTAK MUOY
+17F2;AL # KHMER SYMBOL LEK ATTAK PII
+17F3;AL # KHMER SYMBOL LEK ATTAK BEI
+17F4;AL # KHMER SYMBOL LEK ATTAK BUON
+17F5;AL # KHMER SYMBOL LEK ATTAK PRAM
+17F6;AL # KHMER SYMBOL LEK ATTAK PRAM-MUOY
+17F7;AL # KHMER SYMBOL LEK ATTAK PRAM-PII
+17F8;AL # KHMER SYMBOL LEK ATTAK PRAM-BEI
+17F9;AL # KHMER SYMBOL LEK ATTAK PRAM-BUON
+1800;AL # MONGOLIAN BIRGA
+1801;AL # MONGOLIAN ELLIPSIS
+1802;EX # MONGOLIAN COMMA
+1803;EX # MONGOLIAN FULL STOP
+1804;BA # MONGOLIAN COLON
+1805;BA # MONGOLIAN FOUR DOTS
+1806;BB # MONGOLIAN TODO SOFT HYPHEN
+1807;AL # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808;EX # MONGOLIAN MANCHU COMMA
+1809;EX # MONGOLIAN MANCHU FULL STOP
+180A;AL # MONGOLIAN NIRUGU
+180B;CM # MONGOLIAN FREE VARIATION SELECTOR ONE
+180C;CM # MONGOLIAN FREE VARIATION SELECTOR TWO
+180D;CM # MONGOLIAN FREE VARIATION SELECTOR THREE
+180E;GL # MONGOLIAN VOWEL SEPARATOR
+1810;NU # MONGOLIAN DIGIT ZERO
+1811;NU # MONGOLIAN DIGIT ONE
+1812;NU # MONGOLIAN DIGIT TWO
+1813;NU # MONGOLIAN DIGIT THREE
+1814;NU # MONGOLIAN DIGIT FOUR
+1815;NU # MONGOLIAN DIGIT FIVE
+1816;NU # MONGOLIAN DIGIT SIX
+1817;NU # MONGOLIAN DIGIT SEVEN
+1818;NU # MONGOLIAN DIGIT EIGHT
+1819;NU # MONGOLIAN DIGIT NINE
+1820;AL # MONGOLIAN LETTER A
+1821;AL # MONGOLIAN LETTER E
+1822;AL # MONGOLIAN LETTER I
+1823;AL # MONGOLIAN LETTER O
+1824;AL # MONGOLIAN LETTER U
+1825;AL # MONGOLIAN LETTER OE
+1826;AL # MONGOLIAN LETTER UE
+1827;AL # MONGOLIAN LETTER EE
+1828;AL # MONGOLIAN LETTER NA
+1829;AL # MONGOLIAN LETTER ANG
+182A;AL # MONGOLIAN LETTER BA
+182B;AL # MONGOLIAN LETTER PA
+182C;AL # MONGOLIAN LETTER QA
+182D;AL # MONGOLIAN LETTER GA
+182E;AL # MONGOLIAN LETTER MA
+182F;AL # MONGOLIAN LETTER LA
+1830;AL # MONGOLIAN LETTER SA
+1831;AL # MONGOLIAN LETTER SHA
+1832;AL # MONGOLIAN LETTER TA
+1833;AL # MONGOLIAN LETTER DA
+1834;AL # MONGOLIAN LETTER CHA
+1835;AL # MONGOLIAN LETTER JA
+1836;AL # MONGOLIAN LETTER YA
+1837;AL # MONGOLIAN LETTER RA
+1838;AL # MONGOLIAN LETTER WA
+1839;AL # MONGOLIAN LETTER FA
+183A;AL # MONGOLIAN LETTER KA
+183B;AL # MONGOLIAN LETTER KHA
+183C;AL # MONGOLIAN LETTER TSA
+183D;AL # MONGOLIAN LETTER ZA
+183E;AL # MONGOLIAN LETTER HAA
+183F;AL # MONGOLIAN LETTER ZRA
+1840;AL # MONGOLIAN LETTER LHA
+1841;AL # MONGOLIAN LETTER ZHI
+1842;AL # MONGOLIAN LETTER CHI
+1843;AL # MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844;AL # MONGOLIAN LETTER TODO E
+1845;AL # MONGOLIAN LETTER TODO I
+1846;AL # MONGOLIAN LETTER TODO O
+1847;AL # MONGOLIAN LETTER TODO U
+1848;AL # MONGOLIAN LETTER TODO OE
+1849;AL # MONGOLIAN LETTER TODO UE
+184A;AL # MONGOLIAN LETTER TODO ANG
+184B;AL # MONGOLIAN LETTER TODO BA
+184C;AL # MONGOLIAN LETTER TODO PA
+184D;AL # MONGOLIAN LETTER TODO QA
+184E;AL # MONGOLIAN LETTER TODO GA
+184F;AL # MONGOLIAN LETTER TODO MA
+1850;AL # MONGOLIAN LETTER TODO TA
+1851;AL # MONGOLIAN LETTER TODO DA
+1852;AL # MONGOLIAN LETTER TODO CHA
+1853;AL # MONGOLIAN LETTER TODO JA
+1854;AL # MONGOLIAN LETTER TODO TSA
+1855;AL # MONGOLIAN LETTER TODO YA
+1856;AL # MONGOLIAN LETTER TODO WA
+1857;AL # MONGOLIAN LETTER TODO KA
+1858;AL # MONGOLIAN LETTER TODO GAA
+1859;AL # MONGOLIAN LETTER TODO HAA
+185A;AL # MONGOLIAN LETTER TODO JIA
+185B;AL # MONGOLIAN LETTER TODO NIA
+185C;AL # MONGOLIAN LETTER TODO DZA
+185D;AL # MONGOLIAN LETTER SIBE E
+185E;AL # MONGOLIAN LETTER SIBE I
+185F;AL # MONGOLIAN LETTER SIBE IY
+1860;AL # MONGOLIAN LETTER SIBE UE
+1861;AL # MONGOLIAN LETTER SIBE U
+1862;AL # MONGOLIAN LETTER SIBE ANG
+1863;AL # MONGOLIAN LETTER SIBE KA
+1864;AL # MONGOLIAN LETTER SIBE GA
+1865;AL # MONGOLIAN LETTER SIBE HA
+1866;AL # MONGOLIAN LETTER SIBE PA
+1867;AL # MONGOLIAN LETTER SIBE SHA
+1868;AL # MONGOLIAN LETTER SIBE TA
+1869;AL # MONGOLIAN LETTER SIBE DA
+186A;AL # MONGOLIAN LETTER SIBE JA
+186B;AL # MONGOLIAN LETTER SIBE FA
+186C;AL # MONGOLIAN LETTER SIBE GAA
+186D;AL # MONGOLIAN LETTER SIBE HAA
+186E;AL # MONGOLIAN LETTER SIBE TSA
+186F;AL # MONGOLIAN LETTER SIBE ZA
+1870;AL # MONGOLIAN LETTER SIBE RAA
+1871;AL # MONGOLIAN LETTER SIBE CHA
+1872;AL # MONGOLIAN LETTER SIBE ZHA
+1873;AL # MONGOLIAN LETTER MANCHU I
+1874;AL # MONGOLIAN LETTER MANCHU KA
+1875;AL # MONGOLIAN LETTER MANCHU RA
+1876;AL # MONGOLIAN LETTER MANCHU FA
+1877;AL # MONGOLIAN LETTER MANCHU ZHA
+1880;AL # MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881;AL # MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882;AL # MONGOLIAN LETTER ALI GALI DAMARU
+1883;AL # MONGOLIAN LETTER ALI GALI UBADAMA
+1884;AL # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885;AL # MONGOLIAN LETTER ALI GALI BALUDA
+1886;AL # MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887;AL # MONGOLIAN LETTER ALI GALI A
+1888;AL # MONGOLIAN LETTER ALI GALI I
+1889;AL # MONGOLIAN LETTER ALI GALI KA
+188A;AL # MONGOLIAN LETTER ALI GALI NGA
+188B;AL # MONGOLIAN LETTER ALI GALI CA
+188C;AL # MONGOLIAN LETTER ALI GALI TTA
+188D;AL # MONGOLIAN LETTER ALI GALI TTHA
+188E;AL # MONGOLIAN LETTER ALI GALI DDA
+188F;AL # MONGOLIAN LETTER ALI GALI NNA
+1890;AL # MONGOLIAN LETTER ALI GALI TA
+1891;AL # MONGOLIAN LETTER ALI GALI DA
+1892;AL # MONGOLIAN LETTER ALI GALI PA
+1893;AL # MONGOLIAN LETTER ALI GALI PHA
+1894;AL # MONGOLIAN LETTER ALI GALI SSA
+1895;AL # MONGOLIAN LETTER ALI GALI ZHA
+1896;AL # MONGOLIAN LETTER ALI GALI ZA
+1897;AL # MONGOLIAN LETTER ALI GALI AH
+1898;AL # MONGOLIAN LETTER TODO ALI GALI TA
+1899;AL # MONGOLIAN LETTER TODO ALI GALI ZHA
+189A;AL # MONGOLIAN LETTER MANCHU ALI GALI GHA
+189B;AL # MONGOLIAN LETTER MANCHU ALI GALI NGA
+189C;AL # MONGOLIAN LETTER MANCHU ALI GALI CA
+189D;AL # MONGOLIAN LETTER MANCHU ALI GALI JHA
+189E;AL # MONGOLIAN LETTER MANCHU ALI GALI TTA
+189F;AL # MONGOLIAN LETTER MANCHU ALI GALI DDHA
+18A0;AL # MONGOLIAN LETTER MANCHU ALI GALI TA
+18A1;AL # MONGOLIAN LETTER MANCHU ALI GALI DHA
+18A2;AL # MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A3;AL # MONGOLIAN LETTER MANCHU ALI GALI CYA
+18A4;AL # MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5;AL # MONGOLIAN LETTER MANCHU ALI GALI ZA
+18A6;AL # MONGOLIAN LETTER ALI GALI HALF U
+18A7;AL # MONGOLIAN LETTER ALI GALI HALF YA
+18A8;AL # MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9;CM # MONGOLIAN LETTER ALI GALI DAGALGA
+18AA;AL # MONGOLIAN LETTER MANCHU ALI GALI LHA
+1900;AL # LIMBU VOWEL-CARRIER LETTER
+1901;AL # LIMBU LETTER KA
+1902;AL # LIMBU LETTER KHA
+1903;AL # LIMBU LETTER GA
+1904;AL # LIMBU LETTER GHA
+1905;AL # LIMBU LETTER NGA
+1906;AL # LIMBU LETTER CA
+1907;AL # LIMBU LETTER CHA
+1908;AL # LIMBU LETTER JA
+1909;AL # LIMBU LETTER JHA
+190A;AL # LIMBU LETTER YAN
+190B;AL # LIMBU LETTER TA
+190C;AL # LIMBU LETTER THA
+190D;AL # LIMBU LETTER DA
+190E;AL # LIMBU LETTER DHA
+190F;AL # LIMBU LETTER NA
+1910;AL # LIMBU LETTER PA
+1911;AL # LIMBU LETTER PHA
+1912;AL # LIMBU LETTER BA
+1913;AL # LIMBU LETTER BHA
+1914;AL # LIMBU LETTER MA
+1915;AL # LIMBU LETTER YA
+1916;AL # LIMBU LETTER RA
+1917;AL # LIMBU LETTER LA
+1918;AL # LIMBU LETTER WA
+1919;AL # LIMBU LETTER SHA
+191A;AL # LIMBU LETTER SSA
+191B;AL # LIMBU LETTER SA
+191C;AL # LIMBU LETTER HA
+1920;CM # LIMBU VOWEL SIGN A
+1921;CM # LIMBU VOWEL SIGN I
+1922;CM # LIMBU VOWEL SIGN U
+1923;CM # LIMBU VOWEL SIGN EE
+1924;CM # LIMBU VOWEL SIGN AI
+1925;CM # LIMBU VOWEL SIGN OO
+1926;CM # LIMBU VOWEL SIGN AU
+1927;CM # LIMBU VOWEL SIGN E
+1928;CM # LIMBU VOWEL SIGN O
+1929;CM # LIMBU SUBJOINED LETTER YA
+192A;CM # LIMBU SUBJOINED LETTER RA
+192B;CM # LIMBU SUBJOINED LETTER WA
+1930;CM # LIMBU SMALL LETTER KA
+1931;CM # LIMBU SMALL LETTER NGA
+1932;CM # LIMBU SMALL LETTER ANUSVARA
+1933;CM # LIMBU SMALL LETTER TA
+1934;CM # LIMBU SMALL LETTER NA
+1935;CM # LIMBU SMALL LETTER PA
+1936;CM # LIMBU SMALL LETTER MA
+1937;CM # LIMBU SMALL LETTER RA
+1938;CM # LIMBU SMALL LETTER LA
+1939;CM # LIMBU SIGN MUKPHRENG
+193A;CM # LIMBU SIGN KEMPHRENG
+193B;CM # LIMBU SIGN SA-I
+1940;AL # LIMBU SIGN LOO
+1944;EX # LIMBU EXCLAMATION MARK
+1945;EX # LIMBU QUESTION MARK
+1946;NU # LIMBU DIGIT ZERO
+1947;NU # LIMBU DIGIT ONE
+1948;NU # LIMBU DIGIT TWO
+1949;NU # LIMBU DIGIT THREE
+194A;NU # LIMBU DIGIT FOUR
+194B;NU # LIMBU DIGIT FIVE
+194C;NU # LIMBU DIGIT SIX
+194D;NU # LIMBU DIGIT SEVEN
+194E;NU # LIMBU DIGIT EIGHT
+194F;NU # LIMBU DIGIT NINE
+1950;SA # TAI LE LETTER KA
+1951;SA # TAI LE LETTER XA
+1952;SA # TAI LE LETTER NGA
+1953;SA # TAI LE LETTER TSA
+1954;SA # TAI LE LETTER SA
+1955;SA # TAI LE LETTER YA
+1956;SA # TAI LE LETTER TA
+1957;SA # TAI LE LETTER THA
+1958;SA # TAI LE LETTER LA
+1959;SA # TAI LE LETTER PA
+195A;SA # TAI LE LETTER PHA
+195B;SA # TAI LE LETTER MA
+195C;SA # TAI LE LETTER FA
+195D;SA # TAI LE LETTER VA
+195E;SA # TAI LE LETTER HA
+195F;SA # TAI LE LETTER QA
+1960;SA # TAI LE LETTER KHA
+1961;SA # TAI LE LETTER TSHA
+1962;SA # TAI LE LETTER NA
+1963;SA # TAI LE LETTER A
+1964;SA # TAI LE LETTER I
+1965;SA # TAI LE LETTER EE
+1966;SA # TAI LE LETTER EH
+1967;SA # TAI LE LETTER U
+1968;SA # TAI LE LETTER OO
+1969;SA # TAI LE LETTER O
+196A;SA # TAI LE LETTER UE
+196B;SA # TAI LE LETTER E
+196C;SA # TAI LE LETTER AUE
+196D;SA # TAI LE LETTER AI
+1970;SA # TAI LE LETTER TONE-2
+1971;SA # TAI LE LETTER TONE-3
+1972;SA # TAI LE LETTER TONE-4
+1973;SA # TAI LE LETTER TONE-5
+1974;SA # TAI LE LETTER TONE-6
+1980;SA # NEW TAI LUE LETTER HIGH QA
+1981;SA # NEW TAI LUE LETTER LOW QA
+1982;SA # NEW TAI LUE LETTER HIGH KA
+1983;SA # NEW TAI LUE LETTER HIGH XA
+1984;SA # NEW TAI LUE LETTER HIGH NGA
+1985;SA # NEW TAI LUE LETTER LOW KA
+1986;SA # NEW TAI LUE LETTER LOW XA
+1987;SA # NEW TAI LUE LETTER LOW NGA
+1988;SA # NEW TAI LUE LETTER HIGH TSA
+1989;SA # NEW TAI LUE LETTER HIGH SA
+198A;SA # NEW TAI LUE LETTER HIGH YA
+198B;SA # NEW TAI LUE LETTER LOW TSA
+198C;SA # NEW TAI LUE LETTER LOW SA
+198D;SA # NEW TAI LUE LETTER LOW YA
+198E;SA # NEW TAI LUE LETTER HIGH TA
+198F;SA # NEW TAI LUE LETTER HIGH THA
+1990;SA # NEW TAI LUE LETTER HIGH NA
+1991;SA # NEW TAI LUE LETTER LOW TA
+1992;SA # NEW TAI LUE LETTER LOW THA
+1993;SA # NEW TAI LUE LETTER LOW NA
+1994;SA # NEW TAI LUE LETTER HIGH PA
+1995;SA # NEW TAI LUE LETTER HIGH PHA
+1996;SA # NEW TAI LUE LETTER HIGH MA
+1997;SA # NEW TAI LUE LETTER LOW PA
+1998;SA # NEW TAI LUE LETTER LOW PHA
+1999;SA # NEW TAI LUE LETTER LOW MA
+199A;SA # NEW TAI LUE LETTER HIGH FA
+199B;SA # NEW TAI LUE LETTER HIGH VA
+199C;SA # NEW TAI LUE LETTER HIGH LA
+199D;SA # NEW TAI LUE LETTER LOW FA
+199E;SA # NEW TAI LUE LETTER LOW VA
+199F;SA # NEW TAI LUE LETTER LOW LA
+19A0;SA # NEW TAI LUE LETTER HIGH HA
+19A1;SA # NEW TAI LUE LETTER HIGH DA
+19A2;SA # NEW TAI LUE LETTER HIGH BA
+19A3;SA # NEW TAI LUE LETTER LOW HA
+19A4;SA # NEW TAI LUE LETTER LOW DA
+19A5;SA # NEW TAI LUE LETTER LOW BA
+19A6;SA # NEW TAI LUE LETTER HIGH KVA
+19A7;SA # NEW TAI LUE LETTER HIGH XVA
+19A8;SA # NEW TAI LUE LETTER LOW KVA
+19A9;SA # NEW TAI LUE LETTER LOW XVA
+19B0;SA # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
+19B1;SA # NEW TAI LUE VOWEL SIGN AA
+19B2;SA # NEW TAI LUE VOWEL SIGN II
+19B3;SA # NEW TAI LUE VOWEL SIGN U
+19B4;SA # NEW TAI LUE VOWEL SIGN UU
+19B5;SA # NEW TAI LUE VOWEL SIGN E
+19B6;SA # NEW TAI LUE VOWEL SIGN AE
+19B7;SA # NEW TAI LUE VOWEL SIGN O
+19B8;SA # NEW TAI LUE VOWEL SIGN OA
+19B9;SA # NEW TAI LUE VOWEL SIGN UE
+19BA;SA # NEW TAI LUE VOWEL SIGN AY
+19BB;SA # NEW TAI LUE VOWEL SIGN AAY
+19BC;SA # NEW TAI LUE VOWEL SIGN UY
+19BD;SA # NEW TAI LUE VOWEL SIGN OY
+19BE;SA # NEW TAI LUE VOWEL SIGN OAY
+19BF;SA # NEW TAI LUE VOWEL SIGN UEY
+19C0;SA # NEW TAI LUE VOWEL SIGN IY
+19C1;SA # NEW TAI LUE LETTER FINAL V
+19C2;SA # NEW TAI LUE LETTER FINAL NG
+19C3;SA # NEW TAI LUE LETTER FINAL N
+19C4;SA # NEW TAI LUE LETTER FINAL M
+19C5;SA # NEW TAI LUE LETTER FINAL K
+19C6;SA # NEW TAI LUE LETTER FINAL D
+19C7;SA # NEW TAI LUE LETTER FINAL B
+19C8;SA # NEW TAI LUE TONE MARK-1
+19C9;SA # NEW TAI LUE TONE MARK-2
+19D0;NU # NEW TAI LUE DIGIT ZERO
+19D1;NU # NEW TAI LUE DIGIT ONE
+19D2;NU # NEW TAI LUE DIGIT TWO
+19D3;NU # NEW TAI LUE DIGIT THREE
+19D4;NU # NEW TAI LUE DIGIT FOUR
+19D5;NU # NEW TAI LUE DIGIT FIVE
+19D6;NU # NEW TAI LUE DIGIT SIX
+19D7;NU # NEW TAI LUE DIGIT SEVEN
+19D8;NU # NEW TAI LUE DIGIT EIGHT
+19D9;NU # NEW TAI LUE DIGIT NINE
+19DE;SA # NEW TAI LUE SIGN LAE
+19DF;SA # NEW TAI LUE SIGN LAEV
+19E0;AL # KHMER SYMBOL PATHAMASAT
+19E1;AL # KHMER SYMBOL MUOY KOET
+19E2;AL # KHMER SYMBOL PII KOET
+19E3;AL # KHMER SYMBOL BEI KOET
+19E4;AL # KHMER SYMBOL BUON KOET
+19E5;AL # KHMER SYMBOL PRAM KOET
+19E6;AL # KHMER SYMBOL PRAM-MUOY KOET
+19E7;AL # KHMER SYMBOL PRAM-PII KOET
+19E8;AL # KHMER SYMBOL PRAM-BEI KOET
+19E9;AL # KHMER SYMBOL PRAM-BUON KOET
+19EA;AL # KHMER SYMBOL DAP KOET
+19EB;AL # KHMER SYMBOL DAP-MUOY KOET
+19EC;AL # KHMER SYMBOL DAP-PII KOET
+19ED;AL # KHMER SYMBOL DAP-BEI KOET
+19EE;AL # KHMER SYMBOL DAP-BUON KOET
+19EF;AL # KHMER SYMBOL DAP-PRAM KOET
+19F0;AL # KHMER SYMBOL TUTEYASAT
+19F1;AL # KHMER SYMBOL MUOY ROC
+19F2;AL # KHMER SYMBOL PII ROC
+19F3;AL # KHMER SYMBOL BEI ROC
+19F4;AL # KHMER SYMBOL BUON ROC
+19F5;AL # KHMER SYMBOL PRAM ROC
+19F6;AL # KHMER SYMBOL PRAM-MUOY ROC
+19F7;AL # KHMER SYMBOL PRAM-PII ROC
+19F8;AL # KHMER SYMBOL PRAM-BEI ROC
+19F9;AL # KHMER SYMBOL PRAM-BUON ROC
+19FA;AL # KHMER SYMBOL DAP ROC
+19FB;AL # KHMER SYMBOL DAP-MUOY ROC
+19FC;AL # KHMER SYMBOL DAP-PII ROC
+19FD;AL # KHMER SYMBOL DAP-BEI ROC
+19FE;AL # KHMER SYMBOL DAP-BUON ROC
+19FF;AL # KHMER SYMBOL DAP-PRAM ROC
+1A00;AL # BUGINESE LETTER KA
+1A01;AL # BUGINESE LETTER GA
+1A02;AL # BUGINESE LETTER NGA
+1A03;AL # BUGINESE LETTER NGKA
+1A04;AL # BUGINESE LETTER PA
+1A05;AL # BUGINESE LETTER BA
+1A06;AL # BUGINESE LETTER MA
+1A07;AL # BUGINESE LETTER MPA
+1A08;AL # BUGINESE LETTER TA
+1A09;AL # BUGINESE LETTER DA
+1A0A;AL # BUGINESE LETTER NA
+1A0B;AL # BUGINESE LETTER NRA
+1A0C;AL # BUGINESE LETTER CA
+1A0D;AL # BUGINESE LETTER JA
+1A0E;AL # BUGINESE LETTER NYA
+1A0F;AL # BUGINESE LETTER NYCA
+1A10;AL # BUGINESE LETTER YA
+1A11;AL # BUGINESE LETTER RA
+1A12;AL # BUGINESE LETTER LA
+1A13;AL # BUGINESE LETTER VA
+1A14;AL # BUGINESE LETTER SA
+1A15;AL # BUGINESE LETTER A
+1A16;AL # BUGINESE LETTER HA
+1A17;CM # BUGINESE VOWEL SIGN I
+1A18;CM # BUGINESE VOWEL SIGN U
+1A19;CM # BUGINESE VOWEL SIGN E
+1A1A;CM # BUGINESE VOWEL SIGN O
+1A1B;CM # BUGINESE VOWEL SIGN AE
+1A1E;AL # BUGINESE PALLAWA
+1A1F;AL # BUGINESE END OF SECTION
+1B00;CM # BALINESE SIGN ULU RICEM
+1B01;CM # BALINESE SIGN ULU CANDRA
+1B02;CM # BALINESE SIGN CECEK
+1B03;CM # BALINESE SIGN SURANG
+1B04;CM # BALINESE SIGN BISAH
+1B05;AL # BALINESE LETTER AKARA
+1B06;AL # BALINESE LETTER AKARA TEDUNG
+1B07;AL # BALINESE LETTER IKARA
+1B08;AL # BALINESE LETTER IKARA TEDUNG
+1B09;AL # BALINESE LETTER UKARA
+1B0A;AL # BALINESE LETTER UKARA TEDUNG
+1B0B;AL # BALINESE LETTER RA REPA
+1B0C;AL # BALINESE LETTER RA REPA TEDUNG
+1B0D;AL # BALINESE LETTER LA LENGA
+1B0E;AL # BALINESE LETTER LA LENGA TEDUNG
+1B0F;AL # BALINESE LETTER EKARA
+1B10;AL # BALINESE LETTER AIKARA
+1B11;AL # BALINESE LETTER OKARA
+1B12;AL # BALINESE LETTER OKARA TEDUNG
+1B13;AL # BALINESE LETTER KA
+1B14;AL # BALINESE LETTER KA MAHAPRANA
+1B15;AL # BALINESE LETTER GA
+1B16;AL # BALINESE LETTER GA GORA
+1B17;AL # BALINESE LETTER NGA
+1B18;AL # BALINESE LETTER CA
+1B19;AL # BALINESE LETTER CA LACA
+1B1A;AL # BALINESE LETTER JA
+1B1B;AL # BALINESE LETTER JA JERA
+1B1C;AL # BALINESE LETTER NYA
+1B1D;AL # BALINESE LETTER TA LATIK
+1B1E;AL # BALINESE LETTER TA MURDA MAHAPRANA
+1B1F;AL # BALINESE LETTER DA MURDA ALPAPRANA
+1B20;AL # BALINESE LETTER DA MURDA MAHAPRANA
+1B21;AL # BALINESE LETTER NA RAMBAT
+1B22;AL # BALINESE LETTER TA
+1B23;AL # BALINESE LETTER TA TAWA
+1B24;AL # BALINESE LETTER DA
+1B25;AL # BALINESE LETTER DA MADU
+1B26;AL # BALINESE LETTER NA
+1B27;AL # BALINESE LETTER PA
+1B28;AL # BALINESE LETTER PA KAPAL
+1B29;AL # BALINESE LETTER BA
+1B2A;AL # BALINESE LETTER BA KEMBANG
+1B2B;AL # BALINESE LETTER MA
+1B2C;AL # BALINESE LETTER YA
+1B2D;AL # BALINESE LETTER RA
+1B2E;AL # BALINESE LETTER LA
+1B2F;AL # BALINESE LETTER WA
+1B30;AL # BALINESE LETTER SA SAGA
+1B31;AL # BALINESE LETTER SA SAPA
+1B32;AL # BALINESE LETTER SA
+1B33;AL # BALINESE LETTER HA
+1B34;CM # BALINESE SIGN REREKAN
+1B35;CM # BALINESE VOWEL SIGN TEDUNG
+1B36;CM # BALINESE VOWEL SIGN ULU
+1B37;CM # BALINESE VOWEL SIGN ULU SARI
+1B38;CM # BALINESE VOWEL SIGN SUKU
+1B39;CM # BALINESE VOWEL SIGN SUKU ILUT
+1B3A;CM # BALINESE VOWEL SIGN RA REPA
+1B3B;CM # BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C;CM # BALINESE VOWEL SIGN LA LENGA
+1B3D;CM # BALINESE VOWEL SIGN LA LENGA TEDUNG
+1B3E;CM # BALINESE VOWEL SIGN TALING
+1B3F;CM # BALINESE VOWEL SIGN TALING REPA
+1B40;CM # BALINESE VOWEL SIGN TALING TEDUNG
+1B41;CM # BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42;CM # BALINESE VOWEL SIGN PEPET
+1B43;CM # BALINESE VOWEL SIGN PEPET TEDUNG
+1B44;CM # BALINESE ADEG ADEG
+1B45;AL # BALINESE LETTER KAF SASAK
+1B46;AL # BALINESE LETTER KHOT SASAK
+1B47;AL # BALINESE LETTER TZIR SASAK
+1B48;AL # BALINESE LETTER EF SASAK
+1B49;AL # BALINESE LETTER VE SASAK
+1B4A;AL # BALINESE LETTER ZAL SASAK
+1B4B;AL # BALINESE LETTER ASYURA SASAK
+1B50;NU # BALINESE DIGIT ZERO
+1B51;NU # BALINESE DIGIT ONE
+1B52;NU # BALINESE DIGIT TWO
+1B53;NU # BALINESE DIGIT THREE
+1B54;NU # BALINESE DIGIT FOUR
+1B55;NU # BALINESE DIGIT FIVE
+1B56;NU # BALINESE DIGIT SIX
+1B57;NU # BALINESE DIGIT SEVEN
+1B58;NU # BALINESE DIGIT EIGHT
+1B59;NU # BALINESE DIGIT NINE
+1B5A;BA # BALINESE PANTI
+1B5B;BA # BALINESE PAMADA
+1B5C;BA # BALINESE WINDU
+1B5D;BA # BALINESE CARIK PAMUNGKAH
+1B5E;BA # BALINESE CARIK SIKI
+1B5F;BA # BALINESE CARIK PAREREN
+1B60;BA # BALINESE PAMENENG
+1B61;AL # BALINESE MUSICAL SYMBOL DONG
+1B62;AL # BALINESE MUSICAL SYMBOL DENG
+1B63;AL # BALINESE MUSICAL SYMBOL DUNG
+1B64;AL # BALINESE MUSICAL SYMBOL DANG
+1B65;AL # BALINESE MUSICAL SYMBOL DANG SURANG
+1B66;AL # BALINESE MUSICAL SYMBOL DING
+1B67;AL # BALINESE MUSICAL SYMBOL DAENG
+1B68;AL # BALINESE MUSICAL SYMBOL DEUNG
+1B69;AL # BALINESE MUSICAL SYMBOL DAING
+1B6A;AL # BALINESE MUSICAL SYMBOL DANG GEDE
+1B6B;CM # BALINESE MUSICAL SYMBOL COMBINING TEGEH
+1B6C;CM # BALINESE MUSICAL SYMBOL COMBINING ENDEP
+1B6D;CM # BALINESE MUSICAL SYMBOL COMBINING KEMPUL
+1B6E;CM # BALINESE MUSICAL SYMBOL COMBINING KEMPLI
+1B6F;CM # BALINESE MUSICAL SYMBOL COMBINING JEGOGAN
+1B70;CM # BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN
+1B71;CM # BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN
+1B72;CM # BALINESE MUSICAL SYMBOL COMBINING BENDE
+1B73;CM # BALINESE MUSICAL SYMBOL COMBINING GONG
+1B74;AL # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG
+1B75;AL # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG
+1B76;AL # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK
+1B77;AL # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK
+1B78;AL # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG
+1B79;AL # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG
+1B7A;AL # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK
+1B7B;AL # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK
+1B7C;AL # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+1B80;CM # SUNDANESE SIGN PANYECEK
+1B81;CM # SUNDANESE SIGN PANGLAYAR
+1B82;CM # SUNDANESE SIGN PANGWISAD
+1B83;AL # SUNDANESE LETTER A
+1B84;AL # SUNDANESE LETTER I
+1B85;AL # SUNDANESE LETTER U
+1B86;AL # SUNDANESE LETTER AE
+1B87;AL # SUNDANESE LETTER O
+1B88;AL # SUNDANESE LETTER E
+1B89;AL # SUNDANESE LETTER EU
+1B8A;AL # SUNDANESE LETTER KA
+1B8B;AL # SUNDANESE LETTER QA
+1B8C;AL # SUNDANESE LETTER GA
+1B8D;AL # SUNDANESE LETTER NGA
+1B8E;AL # SUNDANESE LETTER CA
+1B8F;AL # SUNDANESE LETTER JA
+1B90;AL # SUNDANESE LETTER ZA
+1B91;AL # SUNDANESE LETTER NYA
+1B92;AL # SUNDANESE LETTER TA
+1B93;AL # SUNDANESE LETTER DA
+1B94;AL # SUNDANESE LETTER NA
+1B95;AL # SUNDANESE LETTER PA
+1B96;AL # SUNDANESE LETTER FA
+1B97;AL # SUNDANESE LETTER VA
+1B98;AL # SUNDANESE LETTER BA
+1B99;AL # SUNDANESE LETTER MA
+1B9A;AL # SUNDANESE LETTER YA
+1B9B;AL # SUNDANESE LETTER RA
+1B9C;AL # SUNDANESE LETTER LA
+1B9D;AL # SUNDANESE LETTER WA
+1B9E;AL # SUNDANESE LETTER SA
+1B9F;AL # SUNDANESE LETTER XA
+1BA0;AL # SUNDANESE LETTER HA
+1BA1;CM # SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA2;CM # SUNDANESE CONSONANT SIGN PANYAKRA
+1BA3;CM # SUNDANESE CONSONANT SIGN PANYIKU
+1BA4;CM # SUNDANESE VOWEL SIGN PANGHULU
+1BA5;CM # SUNDANESE VOWEL SIGN PANYUKU
+1BA6;CM # SUNDANESE VOWEL SIGN PANAELAENG
+1BA7;CM # SUNDANESE VOWEL SIGN PANOLONG
+1BA8;CM # SUNDANESE VOWEL SIGN PAMEPET
+1BA9;CM # SUNDANESE VOWEL SIGN PANEULEUNG
+1BAA;CM # SUNDANESE SIGN PAMAAEH
+1BAE;AL # SUNDANESE LETTER KHA
+1BAF;AL # SUNDANESE LETTER SYA
+1BB0;NU # SUNDANESE DIGIT ZERO
+1BB1;NU # SUNDANESE DIGIT ONE
+1BB2;NU # SUNDANESE DIGIT TWO
+1BB3;NU # SUNDANESE DIGIT THREE
+1BB4;NU # SUNDANESE DIGIT FOUR
+1BB5;NU # SUNDANESE DIGIT FIVE
+1BB6;NU # SUNDANESE DIGIT SIX
+1BB7;NU # SUNDANESE DIGIT SEVEN
+1BB8;NU # SUNDANESE DIGIT EIGHT
+1BB9;NU # SUNDANESE DIGIT NINE
+1C00;AL # LEPCHA LETTER KA
+1C01;AL # LEPCHA LETTER KLA
+1C02;AL # LEPCHA LETTER KHA
+1C03;AL # LEPCHA LETTER GA
+1C04;AL # LEPCHA LETTER GLA
+1C05;AL # LEPCHA LETTER NGA
+1C06;AL # LEPCHA LETTER CA
+1C07;AL # LEPCHA LETTER CHA
+1C08;AL # LEPCHA LETTER JA
+1C09;AL # LEPCHA LETTER NYA
+1C0A;AL # LEPCHA LETTER TA
+1C0B;AL # LEPCHA LETTER THA
+1C0C;AL # LEPCHA LETTER DA
+1C0D;AL # LEPCHA LETTER NA
+1C0E;AL # LEPCHA LETTER PA
+1C0F;AL # LEPCHA LETTER PLA
+1C10;AL # LEPCHA LETTER PHA
+1C11;AL # LEPCHA LETTER FA
+1C12;AL # LEPCHA LETTER FLA
+1C13;AL # LEPCHA LETTER BA
+1C14;AL # LEPCHA LETTER BLA
+1C15;AL # LEPCHA LETTER MA
+1C16;AL # LEPCHA LETTER MLA
+1C17;AL # LEPCHA LETTER TSA
+1C18;AL # LEPCHA LETTER TSHA
+1C19;AL # LEPCHA LETTER DZA
+1C1A;AL # LEPCHA LETTER YA
+1C1B;AL # LEPCHA LETTER RA
+1C1C;AL # LEPCHA LETTER LA
+1C1D;AL # LEPCHA LETTER HA
+1C1E;AL # LEPCHA LETTER HLA
+1C1F;AL # LEPCHA LETTER VA
+1C20;AL # LEPCHA LETTER SA
+1C21;AL # LEPCHA LETTER SHA
+1C22;AL # LEPCHA LETTER WA
+1C23;AL # LEPCHA LETTER A
+1C24;CM # LEPCHA SUBJOINED LETTER YA
+1C25;CM # LEPCHA SUBJOINED LETTER RA
+1C26;CM # LEPCHA VOWEL SIGN AA
+1C27;CM # LEPCHA VOWEL SIGN I
+1C28;CM # LEPCHA VOWEL SIGN O
+1C29;CM # LEPCHA VOWEL SIGN OO
+1C2A;CM # LEPCHA VOWEL SIGN U
+1C2B;CM # LEPCHA VOWEL SIGN UU
+1C2C;CM # LEPCHA VOWEL SIGN E
+1C2D;CM # LEPCHA CONSONANT SIGN K
+1C2E;CM # LEPCHA CONSONANT SIGN M
+1C2F;CM # LEPCHA CONSONANT SIGN L
+1C30;CM # LEPCHA CONSONANT SIGN N
+1C31;CM # LEPCHA CONSONANT SIGN P
+1C32;CM # LEPCHA CONSONANT SIGN R
+1C33;CM # LEPCHA CONSONANT SIGN T
+1C34;CM # LEPCHA CONSONANT SIGN NYIN-DO
+1C35;CM # LEPCHA CONSONANT SIGN KANG
+1C36;CM # LEPCHA SIGN RAN
+1C37;CM # LEPCHA SIGN NUKTA
+1C3B;BA # LEPCHA PUNCTUATION TA-ROL
+1C3C;BA # LEPCHA PUNCTUATION NYET THYOOM TA-ROL
+1C3D;BA # LEPCHA PUNCTUATION CER-WA
+1C3E;BA # LEPCHA PUNCTUATION TSHOOK CER-WA
+1C3F;BA # LEPCHA PUNCTUATION TSHOOK
+1C40;NU # LEPCHA DIGIT ZERO
+1C41;NU # LEPCHA DIGIT ONE
+1C42;NU # LEPCHA DIGIT TWO
+1C43;NU # LEPCHA DIGIT THREE
+1C44;NU # LEPCHA DIGIT FOUR
+1C45;NU # LEPCHA DIGIT FIVE
+1C46;NU # LEPCHA DIGIT SIX
+1C47;NU # LEPCHA DIGIT SEVEN
+1C48;NU # LEPCHA DIGIT EIGHT
+1C49;NU # LEPCHA DIGIT NINE
+1C4D;AL # LEPCHA LETTER TTA
+1C4E;AL # LEPCHA LETTER TTHA
+1C4F;AL # LEPCHA LETTER DDA
+1C50;NU # OL CHIKI DIGIT ZERO
+1C51;NU # OL CHIKI DIGIT ONE
+1C52;NU # OL CHIKI DIGIT TWO
+1C53;NU # OL CHIKI DIGIT THREE
+1C54;NU # OL CHIKI DIGIT FOUR
+1C55;NU # OL CHIKI DIGIT FIVE
+1C56;NU # OL CHIKI DIGIT SIX
+1C57;NU # OL CHIKI DIGIT SEVEN
+1C58;NU # OL CHIKI DIGIT EIGHT
+1C59;NU # OL CHIKI DIGIT NINE
+1C5A;AL # OL CHIKI LETTER LA
+1C5B;AL # OL CHIKI LETTER AT
+1C5C;AL # OL CHIKI LETTER AG
+1C5D;AL # OL CHIKI LETTER ANG
+1C5E;AL # OL CHIKI LETTER AL
+1C5F;AL # OL CHIKI LETTER LAA
+1C60;AL # OL CHIKI LETTER AAK
+1C61;AL # OL CHIKI LETTER AAJ
+1C62;AL # OL CHIKI LETTER AAM
+1C63;AL # OL CHIKI LETTER AAW
+1C64;AL # OL CHIKI LETTER LI
+1C65;AL # OL CHIKI LETTER IS
+1C66;AL # OL CHIKI LETTER IH
+1C67;AL # OL CHIKI LETTER INY
+1C68;AL # OL CHIKI LETTER IR
+1C69;AL # OL CHIKI LETTER LU
+1C6A;AL # OL CHIKI LETTER UC
+1C6B;AL # OL CHIKI LETTER UD
+1C6C;AL # OL CHIKI LETTER UNN
+1C6D;AL # OL CHIKI LETTER UY
+1C6E;AL # OL CHIKI LETTER LE
+1C6F;AL # OL CHIKI LETTER EP
+1C70;AL # OL CHIKI LETTER EDD
+1C71;AL # OL CHIKI LETTER EN
+1C72;AL # OL CHIKI LETTER ERR
+1C73;AL # OL CHIKI LETTER LO
+1C74;AL # OL CHIKI LETTER OTT
+1C75;AL # OL CHIKI LETTER OB
+1C76;AL # OL CHIKI LETTER OV
+1C77;AL # OL CHIKI LETTER OH
+1C78;AL # OL CHIKI MU TTUDDAG
+1C79;AL # OL CHIKI GAAHLAA TTUDDAAG
+1C7A;AL # OL CHIKI MU-GAAHLAA TTUDDAAG
+1C7B;AL # OL CHIKI RELAA
+1C7C;AL # OL CHIKI PHAARKAA
+1C7D;AL # OL CHIKI AHAD
+1C7E;BA # OL CHIKI PUNCTUATION MUCAAD
+1C7F;BA # OL CHIKI PUNCTUATION DOUBLE MUCAAD
+1D00;AL # LATIN LETTER SMALL CAPITAL A
+1D01;AL # LATIN LETTER SMALL CAPITAL AE
+1D02;AL # LATIN SMALL LETTER TURNED AE
+1D03;AL # LATIN LETTER SMALL CAPITAL BARRED B
+1D04;AL # LATIN LETTER SMALL CAPITAL C
+1D05;AL # LATIN LETTER SMALL CAPITAL D
+1D06;AL # LATIN LETTER SMALL CAPITAL ETH
+1D07;AL # LATIN LETTER SMALL CAPITAL E
+1D08;AL # LATIN SMALL LETTER TURNED OPEN E
+1D09;AL # LATIN SMALL LETTER TURNED I
+1D0A;AL # LATIN LETTER SMALL CAPITAL J
+1D0B;AL # LATIN LETTER SMALL CAPITAL K
+1D0C;AL # LATIN LETTER SMALL CAPITAL L WITH STROKE
+1D0D;AL # LATIN LETTER SMALL CAPITAL M
+1D0E;AL # LATIN LETTER SMALL CAPITAL REVERSED N
+1D0F;AL # LATIN LETTER SMALL CAPITAL O
+1D10;AL # LATIN LETTER SMALL CAPITAL OPEN O
+1D11;AL # LATIN SMALL LETTER SIDEWAYS O
+1D12;AL # LATIN SMALL LETTER SIDEWAYS OPEN O
+1D13;AL # LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+1D14;AL # LATIN SMALL LETTER TURNED OE
+1D15;AL # LATIN LETTER SMALL CAPITAL OU
+1D16;AL # LATIN SMALL LETTER TOP HALF O
+1D17;AL # LATIN SMALL LETTER BOTTOM HALF O
+1D18;AL # LATIN LETTER SMALL CAPITAL P
+1D19;AL # LATIN LETTER SMALL CAPITAL REVERSED R
+1D1A;AL # LATIN LETTER SMALL CAPITAL TURNED R
+1D1B;AL # LATIN LETTER SMALL CAPITAL T
+1D1C;AL # LATIN LETTER SMALL CAPITAL U
+1D1D;AL # LATIN SMALL LETTER SIDEWAYS U
+1D1E;AL # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D1F;AL # LATIN SMALL LETTER SIDEWAYS TURNED M
+1D20;AL # LATIN LETTER SMALL CAPITAL V
+1D21;AL # LATIN LETTER SMALL CAPITAL W
+1D22;AL # LATIN LETTER SMALL CAPITAL Z
+1D23;AL # LATIN LETTER SMALL CAPITAL EZH
+1D24;AL # LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25;AL # LATIN LETTER AIN
+1D26;AL # GREEK LETTER SMALL CAPITAL GAMMA
+1D27;AL # GREEK LETTER SMALL CAPITAL LAMDA
+1D28;AL # GREEK LETTER SMALL CAPITAL PI
+1D29;AL # GREEK LETTER SMALL CAPITAL RHO
+1D2A;AL # GREEK LETTER SMALL CAPITAL PSI
+1D2B;AL # CYRILLIC LETTER SMALL CAPITAL EL
+1D2C;AL # MODIFIER LETTER CAPITAL A
+1D2D;AL # MODIFIER LETTER CAPITAL AE
+1D2E;AL # MODIFIER LETTER CAPITAL B
+1D2F;AL # MODIFIER LETTER CAPITAL BARRED B
+1D30;AL # MODIFIER LETTER CAPITAL D
+1D31;AL # MODIFIER LETTER CAPITAL E
+1D32;AL # MODIFIER LETTER CAPITAL REVERSED E
+1D33;AL # MODIFIER LETTER CAPITAL G
+1D34;AL # MODIFIER LETTER CAPITAL H
+1D35;AL # MODIFIER LETTER CAPITAL I
+1D36;AL # MODIFIER LETTER CAPITAL J
+1D37;AL # MODIFIER LETTER CAPITAL K
+1D38;AL # MODIFIER LETTER CAPITAL L
+1D39;AL # MODIFIER LETTER CAPITAL M
+1D3A;AL # MODIFIER LETTER CAPITAL N
+1D3B;AL # MODIFIER LETTER CAPITAL REVERSED N
+1D3C;AL # MODIFIER LETTER CAPITAL O
+1D3D;AL # MODIFIER LETTER CAPITAL OU
+1D3E;AL # MODIFIER LETTER CAPITAL P
+1D3F;AL # MODIFIER LETTER CAPITAL R
+1D40;AL # MODIFIER LETTER CAPITAL T
+1D41;AL # MODIFIER LETTER CAPITAL U
+1D42;AL # MODIFIER LETTER CAPITAL W
+1D43;AL # MODIFIER LETTER SMALL A
+1D44;AL # MODIFIER LETTER SMALL TURNED A
+1D45;AL # MODIFIER LETTER SMALL ALPHA
+1D46;AL # MODIFIER LETTER SMALL TURNED AE
+1D47;AL # MODIFIER LETTER SMALL B
+1D48;AL # MODIFIER LETTER SMALL D
+1D49;AL # MODIFIER LETTER SMALL E
+1D4A;AL # MODIFIER LETTER SMALL SCHWA
+1D4B;AL # MODIFIER LETTER SMALL OPEN E
+1D4C;AL # MODIFIER LETTER SMALL TURNED OPEN E
+1D4D;AL # MODIFIER LETTER SMALL G
+1D4E;AL # MODIFIER LETTER SMALL TURNED I
+1D4F;AL # MODIFIER LETTER SMALL K
+1D50;AL # MODIFIER LETTER SMALL M
+1D51;AL # MODIFIER LETTER SMALL ENG
+1D52;AL # MODIFIER LETTER SMALL O
+1D53;AL # MODIFIER LETTER SMALL OPEN O
+1D54;AL # MODIFIER LETTER SMALL TOP HALF O
+1D55;AL # MODIFIER LETTER SMALL BOTTOM HALF O
+1D56;AL # MODIFIER LETTER SMALL P
+1D57;AL # MODIFIER LETTER SMALL T
+1D58;AL # MODIFIER LETTER SMALL U
+1D59;AL # MODIFIER LETTER SMALL SIDEWAYS U
+1D5A;AL # MODIFIER LETTER SMALL TURNED M
+1D5B;AL # MODIFIER LETTER SMALL V
+1D5C;AL # MODIFIER LETTER SMALL AIN
+1D5D;AL # MODIFIER LETTER SMALL BETA
+1D5E;AL # MODIFIER LETTER SMALL GREEK GAMMA
+1D5F;AL # MODIFIER LETTER SMALL DELTA
+1D60;AL # MODIFIER LETTER SMALL GREEK PHI
+1D61;AL # MODIFIER LETTER SMALL CHI
+1D62;AL # LATIN SUBSCRIPT SMALL LETTER I
+1D63;AL # LATIN SUBSCRIPT SMALL LETTER R
+1D64;AL # LATIN SUBSCRIPT SMALL LETTER U
+1D65;AL # LATIN SUBSCRIPT SMALL LETTER V
+1D66;AL # GREEK SUBSCRIPT SMALL LETTER BETA
+1D67;AL # GREEK SUBSCRIPT SMALL LETTER GAMMA
+1D68;AL # GREEK SUBSCRIPT SMALL LETTER RHO
+1D69;AL # GREEK SUBSCRIPT SMALL LETTER PHI
+1D6A;AL # GREEK SUBSCRIPT SMALL LETTER CHI
+1D6B;AL # LATIN SMALL LETTER UE
+1D6C;AL # LATIN SMALL LETTER B WITH MIDDLE TILDE
+1D6D;AL # LATIN SMALL LETTER D WITH MIDDLE TILDE
+1D6E;AL # LATIN SMALL LETTER F WITH MIDDLE TILDE
+1D6F;AL # LATIN SMALL LETTER M WITH MIDDLE TILDE
+1D70;AL # LATIN SMALL LETTER N WITH MIDDLE TILDE
+1D71;AL # LATIN SMALL LETTER P WITH MIDDLE TILDE
+1D72;AL # LATIN SMALL LETTER R WITH MIDDLE TILDE
+1D73;AL # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
+1D74;AL # LATIN SMALL LETTER S WITH MIDDLE TILDE
+1D75;AL # LATIN SMALL LETTER T WITH MIDDLE TILDE
+1D76;AL # LATIN SMALL LETTER Z WITH MIDDLE TILDE
+1D77;AL # LATIN SMALL LETTER TURNED G
+1D78;AL # MODIFIER LETTER CYRILLIC EN
+1D79;AL # LATIN SMALL LETTER INSULAR G
+1D7A;AL # LATIN SMALL LETTER TH WITH STRIKETHROUGH
+1D7B;AL # LATIN SMALL CAPITAL LETTER I WITH STROKE
+1D7C;AL # LATIN SMALL LETTER IOTA WITH STROKE
+1D7D;AL # LATIN SMALL LETTER P WITH STROKE
+1D7E;AL # LATIN SMALL CAPITAL LETTER U WITH STROKE
+1D7F;AL # LATIN SMALL LETTER UPSILON WITH STROKE
+1D80;AL # LATIN SMALL LETTER B WITH PALATAL HOOK
+1D81;AL # LATIN SMALL LETTER D WITH PALATAL HOOK
+1D82;AL # LATIN SMALL LETTER F WITH PALATAL HOOK
+1D83;AL # LATIN SMALL LETTER G WITH PALATAL HOOK
+1D84;AL # LATIN SMALL LETTER K WITH PALATAL HOOK
+1D85;AL # LATIN SMALL LETTER L WITH PALATAL HOOK
+1D86;AL # LATIN SMALL LETTER M WITH PALATAL HOOK
+1D87;AL # LATIN SMALL LETTER N WITH PALATAL HOOK
+1D88;AL # LATIN SMALL LETTER P WITH PALATAL HOOK
+1D89;AL # LATIN SMALL LETTER R WITH PALATAL HOOK
+1D8A;AL # LATIN SMALL LETTER S WITH PALATAL HOOK
+1D8B;AL # LATIN SMALL LETTER ESH WITH PALATAL HOOK
+1D8C;AL # LATIN SMALL LETTER V WITH PALATAL HOOK
+1D8D;AL # LATIN SMALL LETTER X WITH PALATAL HOOK
+1D8E;AL # LATIN SMALL LETTER Z WITH PALATAL HOOK
+1D8F;AL # LATIN SMALL LETTER A WITH RETROFLEX HOOK
+1D90;AL # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK
+1D91;AL # LATIN SMALL LETTER D WITH HOOK AND TAIL
+1D92;AL # LATIN SMALL LETTER E WITH RETROFLEX HOOK
+1D93;AL # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
+1D94;AL # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK
+1D95;AL # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK
+1D96;AL # LATIN SMALL LETTER I WITH RETROFLEX HOOK
+1D97;AL # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
+1D98;AL # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK
+1D99;AL # LATIN SMALL LETTER U WITH RETROFLEX HOOK
+1D9A;AL # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B;AL # MODIFIER LETTER SMALL TURNED ALPHA
+1D9C;AL # MODIFIER LETTER SMALL C
+1D9D;AL # MODIFIER LETTER SMALL C WITH CURL
+1D9E;AL # MODIFIER LETTER SMALL ETH
+1D9F;AL # MODIFIER LETTER SMALL REVERSED OPEN E
+1DA0;AL # MODIFIER LETTER SMALL F
+1DA1;AL # MODIFIER LETTER SMALL DOTLESS J WITH STROKE
+1DA2;AL # MODIFIER LETTER SMALL SCRIPT G
+1DA3;AL # MODIFIER LETTER SMALL TURNED H
+1DA4;AL # MODIFIER LETTER SMALL I WITH STROKE
+1DA5;AL # MODIFIER LETTER SMALL IOTA
+1DA6;AL # MODIFIER LETTER SMALL CAPITAL I
+1DA7;AL # MODIFIER LETTER SMALL CAPITAL I WITH STROKE
+1DA8;AL # MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+1DA9;AL # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK
+1DAA;AL # MODIFIER LETTER SMALL L WITH PALATAL HOOK
+1DAB;AL # MODIFIER LETTER SMALL CAPITAL L
+1DAC;AL # MODIFIER LETTER SMALL M WITH HOOK
+1DAD;AL # MODIFIER LETTER SMALL TURNED M WITH LONG LEG
+1DAE;AL # MODIFIER LETTER SMALL N WITH LEFT HOOK
+1DAF;AL # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK
+1DB0;AL # MODIFIER LETTER SMALL CAPITAL N
+1DB1;AL # MODIFIER LETTER SMALL BARRED O
+1DB2;AL # MODIFIER LETTER SMALL PHI
+1DB3;AL # MODIFIER LETTER SMALL S WITH HOOK
+1DB4;AL # MODIFIER LETTER SMALL ESH
+1DB5;AL # MODIFIER LETTER SMALL T WITH PALATAL HOOK
+1DB6;AL # MODIFIER LETTER SMALL U BAR
+1DB7;AL # MODIFIER LETTER SMALL UPSILON
+1DB8;AL # MODIFIER LETTER SMALL CAPITAL U
+1DB9;AL # MODIFIER LETTER SMALL V WITH HOOK
+1DBA;AL # MODIFIER LETTER SMALL TURNED V
+1DBB;AL # MODIFIER LETTER SMALL Z
+1DBC;AL # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK
+1DBD;AL # MODIFIER LETTER SMALL Z WITH CURL
+1DBE;AL # MODIFIER LETTER SMALL EZH
+1DBF;AL # MODIFIER LETTER SMALL THETA
+1DC0;CM # COMBINING DOTTED GRAVE ACCENT
+1DC1;CM # COMBINING DOTTED ACUTE ACCENT
+1DC2;CM # COMBINING SNAKE BELOW
+1DC3;CM # COMBINING SUSPENSION MARK
+1DC4;CM # COMBINING MACRON-ACUTE
+1DC5;CM # COMBINING GRAVE-MACRON
+1DC6;CM # COMBINING MACRON-GRAVE
+1DC7;CM # COMBINING ACUTE-MACRON
+1DC8;CM # COMBINING GRAVE-ACUTE-GRAVE
+1DC9;CM # COMBINING ACUTE-GRAVE-ACUTE
+1DCA;CM # COMBINING LATIN SMALL LETTER R BELOW
+1DCB;CM # COMBINING BREVE-MACRON
+1DCC;CM # COMBINING MACRON-BREVE
+1DCD;CM # COMBINING DOUBLE CIRCUMFLEX ABOVE
+1DCE;CM # COMBINING OGONEK ABOVE
+1DCF;CM # COMBINING ZIGZAG BELOW
+1DD0;CM # COMBINING IS BELOW
+1DD1;CM # COMBINING UR ABOVE
+1DD2;CM # COMBINING US ABOVE
+1DD3;CM # COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE
+1DD4;CM # COMBINING LATIN SMALL LETTER AE
+1DD5;CM # COMBINING LATIN SMALL LETTER AO
+1DD6;CM # COMBINING LATIN SMALL LETTER AV
+1DD7;CM # COMBINING LATIN SMALL LETTER C CEDILLA
+1DD8;CM # COMBINING LATIN SMALL LETTER INSULAR D
+1DD9;CM # COMBINING LATIN SMALL LETTER ETH
+1DDA;CM # COMBINING LATIN SMALL LETTER G
+1DDB;CM # COMBINING LATIN LETTER SMALL CAPITAL G
+1DDC;CM # COMBINING LATIN SMALL LETTER K
+1DDD;CM # COMBINING LATIN SMALL LETTER L
+1DDE;CM # COMBINING LATIN LETTER SMALL CAPITAL L
+1DDF;CM # COMBINING LATIN LETTER SMALL CAPITAL M
+1DE0;CM # COMBINING LATIN SMALL LETTER N
+1DE1;CM # COMBINING LATIN LETTER SMALL CAPITAL N
+1DE2;CM # COMBINING LATIN LETTER SMALL CAPITAL R
+1DE3;CM # COMBINING LATIN SMALL LETTER R ROTUNDA
+1DE4;CM # COMBINING LATIN SMALL LETTER S
+1DE5;CM # COMBINING LATIN SMALL LETTER LONG S
+1DE6;CM # COMBINING LATIN SMALL LETTER Z
+1DFE;CM # COMBINING LEFT ARROWHEAD ABOVE
+1DFF;CM # COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1E00;AL # LATIN CAPITAL LETTER A WITH RING BELOW
+1E01;AL # LATIN SMALL LETTER A WITH RING BELOW
+1E02;AL # LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E03;AL # LATIN SMALL LETTER B WITH DOT ABOVE
+1E04;AL # LATIN CAPITAL LETTER B WITH DOT BELOW
+1E05;AL # LATIN SMALL LETTER B WITH DOT BELOW
+1E06;AL # LATIN CAPITAL LETTER B WITH LINE BELOW
+1E07;AL # LATIN SMALL LETTER B WITH LINE BELOW
+1E08;AL # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E09;AL # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1E0A;AL # LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0B;AL # LATIN SMALL LETTER D WITH DOT ABOVE
+1E0C;AL # LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0D;AL # LATIN SMALL LETTER D WITH DOT BELOW
+1E0E;AL # LATIN CAPITAL LETTER D WITH LINE BELOW
+1E0F;AL # LATIN SMALL LETTER D WITH LINE BELOW
+1E10;AL # LATIN CAPITAL LETTER D WITH CEDILLA
+1E11;AL # LATIN SMALL LETTER D WITH CEDILLA
+1E12;AL # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E13;AL # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1E14;AL # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E15;AL # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1E16;AL # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E17;AL # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1E18;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E19;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1E1A;AL # LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1B;AL # LATIN SMALL LETTER E WITH TILDE BELOW
+1E1C;AL # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1D;AL # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1E1E;AL # LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E1F;AL # LATIN SMALL LETTER F WITH DOT ABOVE
+1E20;AL # LATIN CAPITAL LETTER G WITH MACRON
+1E21;AL # LATIN SMALL LETTER G WITH MACRON
+1E22;AL # LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E23;AL # LATIN SMALL LETTER H WITH DOT ABOVE
+1E24;AL # LATIN CAPITAL LETTER H WITH DOT BELOW
+1E25;AL # LATIN SMALL LETTER H WITH DOT BELOW
+1E26;AL # LATIN CAPITAL LETTER H WITH DIAERESIS
+1E27;AL # LATIN SMALL LETTER H WITH DIAERESIS
+1E28;AL # LATIN CAPITAL LETTER H WITH CEDILLA
+1E29;AL # LATIN SMALL LETTER H WITH CEDILLA
+1E2A;AL # LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2B;AL # LATIN SMALL LETTER H WITH BREVE BELOW
+1E2C;AL # LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2D;AL # LATIN SMALL LETTER I WITH TILDE BELOW
+1E2E;AL # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E2F;AL # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1E30;AL # LATIN CAPITAL LETTER K WITH ACUTE
+1E31;AL # LATIN SMALL LETTER K WITH ACUTE
+1E32;AL # LATIN CAPITAL LETTER K WITH DOT BELOW
+1E33;AL # LATIN SMALL LETTER K WITH DOT BELOW
+1E34;AL # LATIN CAPITAL LETTER K WITH LINE BELOW
+1E35;AL # LATIN SMALL LETTER K WITH LINE BELOW
+1E36;AL # LATIN CAPITAL LETTER L WITH DOT BELOW
+1E37;AL # LATIN SMALL LETTER L WITH DOT BELOW
+1E38;AL # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E39;AL # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1E3A;AL # LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3B;AL # LATIN SMALL LETTER L WITH LINE BELOW
+1E3C;AL # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3D;AL # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1E3E;AL # LATIN CAPITAL LETTER M WITH ACUTE
+1E3F;AL # LATIN SMALL LETTER M WITH ACUTE
+1E40;AL # LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E41;AL # LATIN SMALL LETTER M WITH DOT ABOVE
+1E42;AL # LATIN CAPITAL LETTER M WITH DOT BELOW
+1E43;AL # LATIN SMALL LETTER M WITH DOT BELOW
+1E44;AL # LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E45;AL # LATIN SMALL LETTER N WITH DOT ABOVE
+1E46;AL # LATIN CAPITAL LETTER N WITH DOT BELOW
+1E47;AL # LATIN SMALL LETTER N WITH DOT BELOW
+1E48;AL # LATIN CAPITAL LETTER N WITH LINE BELOW
+1E49;AL # LATIN SMALL LETTER N WITH LINE BELOW
+1E4A;AL # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4B;AL # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1E4C;AL # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4D;AL # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1E4E;AL # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E4F;AL # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1E50;AL # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E51;AL # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1E52;AL # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E53;AL # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1E54;AL # LATIN CAPITAL LETTER P WITH ACUTE
+1E55;AL # LATIN SMALL LETTER P WITH ACUTE
+1E56;AL # LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E57;AL # LATIN SMALL LETTER P WITH DOT ABOVE
+1E58;AL # LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E59;AL # LATIN SMALL LETTER R WITH DOT ABOVE
+1E5A;AL # LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5B;AL # LATIN SMALL LETTER R WITH DOT BELOW
+1E5C;AL # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5D;AL # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1E5E;AL # LATIN CAPITAL LETTER R WITH LINE BELOW
+1E5F;AL # LATIN SMALL LETTER R WITH LINE BELOW
+1E60;AL # LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E61;AL # LATIN SMALL LETTER S WITH DOT ABOVE
+1E62;AL # LATIN CAPITAL LETTER S WITH DOT BELOW
+1E63;AL # LATIN SMALL LETTER S WITH DOT BELOW
+1E64;AL # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E65;AL # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1E66;AL # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E67;AL # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1E68;AL # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E69;AL # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A;AL # LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6B;AL # LATIN SMALL LETTER T WITH DOT ABOVE
+1E6C;AL # LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6D;AL # LATIN SMALL LETTER T WITH DOT BELOW
+1E6E;AL # LATIN CAPITAL LETTER T WITH LINE BELOW
+1E6F;AL # LATIN SMALL LETTER T WITH LINE BELOW
+1E70;AL # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E71;AL # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1E72;AL # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E73;AL # LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1E74;AL # LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E75;AL # LATIN SMALL LETTER U WITH TILDE BELOW
+1E76;AL # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E77;AL # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1E78;AL # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E79;AL # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1E7A;AL # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7B;AL # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1E7C;AL # LATIN CAPITAL LETTER V WITH TILDE
+1E7D;AL # LATIN SMALL LETTER V WITH TILDE
+1E7E;AL # LATIN CAPITAL LETTER V WITH DOT BELOW
+1E7F;AL # LATIN SMALL LETTER V WITH DOT BELOW
+1E80;AL # LATIN CAPITAL LETTER W WITH GRAVE
+1E81;AL # LATIN SMALL LETTER W WITH GRAVE
+1E82;AL # LATIN CAPITAL LETTER W WITH ACUTE
+1E83;AL # LATIN SMALL LETTER W WITH ACUTE
+1E84;AL # LATIN CAPITAL LETTER W WITH DIAERESIS
+1E85;AL # LATIN SMALL LETTER W WITH DIAERESIS
+1E86;AL # LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E87;AL # LATIN SMALL LETTER W WITH DOT ABOVE
+1E88;AL # LATIN CAPITAL LETTER W WITH DOT BELOW
+1E89;AL # LATIN SMALL LETTER W WITH DOT BELOW
+1E8A;AL # LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8B;AL # LATIN SMALL LETTER X WITH DOT ABOVE
+1E8C;AL # LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8D;AL # LATIN SMALL LETTER X WITH DIAERESIS
+1E8E;AL # LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E8F;AL # LATIN SMALL LETTER Y WITH DOT ABOVE
+1E90;AL # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E91;AL # LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1E92;AL # LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E93;AL # LATIN SMALL LETTER Z WITH DOT BELOW
+1E94;AL # LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E95;AL # LATIN SMALL LETTER Z WITH LINE BELOW
+1E96;AL # LATIN SMALL LETTER H WITH LINE BELOW
+1E97;AL # LATIN SMALL LETTER T WITH DIAERESIS
+1E98;AL # LATIN SMALL LETTER W WITH RING ABOVE
+1E99;AL # LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A;AL # LATIN SMALL LETTER A WITH RIGHT HALF RING
+1E9B;AL # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1E9C;AL # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE
+1E9D;AL # LATIN SMALL LETTER LONG S WITH HIGH STROKE
+1E9E;AL # LATIN CAPITAL LETTER SHARP S
+1E9F;AL # LATIN SMALL LETTER DELTA
+1EA0;AL # LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA1;AL # LATIN SMALL LETTER A WITH DOT BELOW
+1EA2;AL # LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA3;AL # LATIN SMALL LETTER A WITH HOOK ABOVE
+1EA4;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA5;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA7;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EA9;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAB;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAD;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE;AL # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EAF;AL # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1EB0;AL # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB1;AL # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1EB2;AL # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB3;AL # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4;AL # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB5;AL # LATIN SMALL LETTER A WITH BREVE AND TILDE
+1EB6;AL # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB7;AL # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1EB8;AL # LATIN CAPITAL LETTER E WITH DOT BELOW
+1EB9;AL # LATIN SMALL LETTER E WITH DOT BELOW
+1EBA;AL # LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBB;AL # LATIN SMALL LETTER E WITH HOOK ABOVE
+1EBC;AL # LATIN CAPITAL LETTER E WITH TILDE
+1EBD;AL # LATIN SMALL LETTER E WITH TILDE
+1EBE;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EBF;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC1;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC3;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC5;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC7;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8;AL # LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1EC9;AL # LATIN SMALL LETTER I WITH HOOK ABOVE
+1ECA;AL # LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECB;AL # LATIN SMALL LETTER I WITH DOT BELOW
+1ECC;AL # LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECD;AL # LATIN SMALL LETTER O WITH DOT BELOW
+1ECE;AL # LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ECF;AL # LATIN SMALL LETTER O WITH HOOK ABOVE
+1ED0;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED1;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED3;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED5;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED7;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1ED9;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA;AL # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDB;AL # LATIN SMALL LETTER O WITH HORN AND ACUTE
+1EDC;AL # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDD;AL # LATIN SMALL LETTER O WITH HORN AND GRAVE
+1EDE;AL # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EDF;AL # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1EE0;AL # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE1;AL # LATIN SMALL LETTER O WITH HORN AND TILDE
+1EE2;AL # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE3;AL # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1EE4;AL # LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE5;AL # LATIN SMALL LETTER U WITH DOT BELOW
+1EE6;AL # LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE7;AL # LATIN SMALL LETTER U WITH HOOK ABOVE
+1EE8;AL # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EE9;AL # LATIN SMALL LETTER U WITH HORN AND ACUTE
+1EEA;AL # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEB;AL # LATIN SMALL LETTER U WITH HORN AND GRAVE
+1EEC;AL # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EED;AL # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1EEE;AL # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EEF;AL # LATIN SMALL LETTER U WITH HORN AND TILDE
+1EF0;AL # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF1;AL # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1EF2;AL # LATIN CAPITAL LETTER Y WITH GRAVE
+1EF3;AL # LATIN SMALL LETTER Y WITH GRAVE
+1EF4;AL # LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF5;AL # LATIN SMALL LETTER Y WITH DOT BELOW
+1EF6;AL # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF7;AL # LATIN SMALL LETTER Y WITH HOOK ABOVE
+1EF8;AL # LATIN CAPITAL LETTER Y WITH TILDE
+1EF9;AL # LATIN SMALL LETTER Y WITH TILDE
+1EFA;AL # LATIN CAPITAL LETTER MIDDLE-WELSH LL
+1EFB;AL # LATIN SMALL LETTER MIDDLE-WELSH LL
+1EFC;AL # LATIN CAPITAL LETTER MIDDLE-WELSH V
+1EFD;AL # LATIN SMALL LETTER MIDDLE-WELSH V
+1EFE;AL # LATIN CAPITAL LETTER Y WITH LOOP
+1EFF;AL # LATIN SMALL LETTER Y WITH LOOP
+1F00;AL # GREEK SMALL LETTER ALPHA WITH PSILI
+1F01;AL # GREEK SMALL LETTER ALPHA WITH DASIA
+1F02;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+1F03;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+1F04;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+1F05;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+1F06;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F07;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F08;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI
+1F09;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA
+1F0A;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1F0B;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1F0C;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1F0D;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1F0E;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F0F;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F10;AL # GREEK SMALL LETTER EPSILON WITH PSILI
+1F11;AL # GREEK SMALL LETTER EPSILON WITH DASIA
+1F12;AL # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+1F13;AL # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+1F14;AL # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+1F15;AL # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18;AL # GREEK CAPITAL LETTER EPSILON WITH PSILI
+1F19;AL # GREEK CAPITAL LETTER EPSILON WITH DASIA
+1F1A;AL # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1F1B;AL # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1F1C;AL # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1F1D;AL # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20;AL # GREEK SMALL LETTER ETA WITH PSILI
+1F21;AL # GREEK SMALL LETTER ETA WITH DASIA
+1F22;AL # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+1F23;AL # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+1F24;AL # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+1F25;AL # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+1F26;AL # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+1F27;AL # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1F28;AL # GREEK CAPITAL LETTER ETA WITH PSILI
+1F29;AL # GREEK CAPITAL LETTER ETA WITH DASIA
+1F2A;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1F2B;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1F2C;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1F2D;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1F2E;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1F2F;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F30;AL # GREEK SMALL LETTER IOTA WITH PSILI
+1F31;AL # GREEK SMALL LETTER IOTA WITH DASIA
+1F32;AL # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+1F33;AL # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+1F34;AL # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+1F35;AL # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+1F36;AL # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F37;AL # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F38;AL # GREEK CAPITAL LETTER IOTA WITH PSILI
+1F39;AL # GREEK CAPITAL LETTER IOTA WITH DASIA
+1F3A;AL # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1F3B;AL # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1F3C;AL # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1F3D;AL # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1F3E;AL # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F3F;AL # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F40;AL # GREEK SMALL LETTER OMICRON WITH PSILI
+1F41;AL # GREEK SMALL LETTER OMICRON WITH DASIA
+1F42;AL # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+1F43;AL # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+1F44;AL # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+1F45;AL # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48;AL # GREEK CAPITAL LETTER OMICRON WITH PSILI
+1F49;AL # GREEK CAPITAL LETTER OMICRON WITH DASIA
+1F4A;AL # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1F4B;AL # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1F4C;AL # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1F4D;AL # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50;AL # GREEK SMALL LETTER UPSILON WITH PSILI
+1F51;AL # GREEK SMALL LETTER UPSILON WITH DASIA
+1F52;AL # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F53;AL # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+1F54;AL # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F55;AL # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+1F56;AL # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1F57;AL # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59;AL # GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B;AL # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D;AL # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F;AL # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F60;AL # GREEK SMALL LETTER OMEGA WITH PSILI
+1F61;AL # GREEK SMALL LETTER OMEGA WITH DASIA
+1F62;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+1F63;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+1F64;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+1F65;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+1F66;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F67;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F68;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI
+1F69;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA
+1F6A;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1F6B;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1F6C;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1F6D;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1F6E;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F6F;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F70;AL # GREEK SMALL LETTER ALPHA WITH VARIA
+1F71;AL # GREEK SMALL LETTER ALPHA WITH OXIA
+1F72;AL # GREEK SMALL LETTER EPSILON WITH VARIA
+1F73;AL # GREEK SMALL LETTER EPSILON WITH OXIA
+1F74;AL # GREEK SMALL LETTER ETA WITH VARIA
+1F75;AL # GREEK SMALL LETTER ETA WITH OXIA
+1F76;AL # GREEK SMALL LETTER IOTA WITH VARIA
+1F77;AL # GREEK SMALL LETTER IOTA WITH OXIA
+1F78;AL # GREEK SMALL LETTER OMICRON WITH VARIA
+1F79;AL # GREEK SMALL LETTER OMICRON WITH OXIA
+1F7A;AL # GREEK SMALL LETTER UPSILON WITH VARIA
+1F7B;AL # GREEK SMALL LETTER UPSILON WITH OXIA
+1F7C;AL # GREEK SMALL LETTER OMEGA WITH VARIA
+1F7D;AL # GREEK SMALL LETTER OMEGA WITH OXIA
+1F80;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90;AL # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91;AL # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92;AL # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93;AL # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94;AL # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95;AL # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96;AL # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97;AL # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB0;AL # GREEK SMALL LETTER ALPHA WITH VRACHY
+1FB1;AL # GREEK SMALL LETTER ALPHA WITH MACRON
+1FB2;AL # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB3;AL # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FB4;AL # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6;AL # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7;AL # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FB8;AL # GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1FB9;AL # GREEK CAPITAL LETTER ALPHA WITH MACRON
+1FBA;AL # GREEK CAPITAL LETTER ALPHA WITH VARIA
+1FBB;AL # GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FBC;AL # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD;AL # GREEK KORONIS
+1FBE;AL # GREEK PROSGEGRAMMENI
+1FBF;AL # GREEK PSILI
+1FC0;AL # GREEK PERISPOMENI
+1FC1;AL # GREEK DIALYTIKA AND PERISPOMENI
+1FC2;AL # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC3;AL # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FC4;AL # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6;AL # GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7;AL # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC8;AL # GREEK CAPITAL LETTER EPSILON WITH VARIA
+1FC9;AL # GREEK CAPITAL LETTER EPSILON WITH OXIA
+1FCA;AL # GREEK CAPITAL LETTER ETA WITH VARIA
+1FCB;AL # GREEK CAPITAL LETTER ETA WITH OXIA
+1FCC;AL # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD;AL # GREEK PSILI AND VARIA
+1FCE;AL # GREEK PSILI AND OXIA
+1FCF;AL # GREEK PSILI AND PERISPOMENI
+1FD0;AL # GREEK SMALL LETTER IOTA WITH VRACHY
+1FD1;AL # GREEK SMALL LETTER IOTA WITH MACRON
+1FD2;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6;AL # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8;AL # GREEK CAPITAL LETTER IOTA WITH VRACHY
+1FD9;AL # GREEK CAPITAL LETTER IOTA WITH MACRON
+1FDA;AL # GREEK CAPITAL LETTER IOTA WITH VARIA
+1FDB;AL # GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD;AL # GREEK DASIA AND VARIA
+1FDE;AL # GREEK DASIA AND OXIA
+1FDF;AL # GREEK DASIA AND PERISPOMENI
+1FE0;AL # GREEK SMALL LETTER UPSILON WITH VRACHY
+1FE1;AL # GREEK SMALL LETTER UPSILON WITH MACRON
+1FE2;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4;AL # GREEK SMALL LETTER RHO WITH PSILI
+1FE5;AL # GREEK SMALL LETTER RHO WITH DASIA
+1FE6;AL # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8;AL # GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1FE9;AL # GREEK CAPITAL LETTER UPSILON WITH MACRON
+1FEA;AL # GREEK CAPITAL LETTER UPSILON WITH VARIA
+1FEB;AL # GREEK CAPITAL LETTER UPSILON WITH OXIA
+1FEC;AL # GREEK CAPITAL LETTER RHO WITH DASIA
+1FED;AL # GREEK DIALYTIKA AND VARIA
+1FEE;AL # GREEK DIALYTIKA AND OXIA
+1FEF;AL # GREEK VARIA
+1FF2;AL # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF3;AL # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FF4;AL # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6;AL # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7;AL # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF8;AL # GREEK CAPITAL LETTER OMICRON WITH VARIA
+1FF9;AL # GREEK CAPITAL LETTER OMICRON WITH OXIA
+1FFA;AL # GREEK CAPITAL LETTER OMEGA WITH VARIA
+1FFB;AL # GREEK CAPITAL LETTER OMEGA WITH OXIA
+1FFC;AL # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD;BB # GREEK OXIA
+1FFE;AL # GREEK DASIA
+2000;BA # EN QUAD
+2001;BA # EM QUAD
+2002;BA # EN SPACE
+2003;BA # EM SPACE
+2004;BA # THREE-PER-EM SPACE
+2005;BA # FOUR-PER-EM SPACE
+2006;BA # SIX-PER-EM SPACE
+2007;GL # FIGURE SPACE
+2008;BA # PUNCTUATION SPACE
+2009;BA # THIN SPACE
+200A;BA # HAIR SPACE
+200B;ZW # ZERO WIDTH SPACE
+200C;CM # ZERO WIDTH NON-JOINER
+200D;CM # ZERO WIDTH JOINER
+200E;CM # LEFT-TO-RIGHT MARK
+200F;CM # RIGHT-TO-LEFT MARK
+2010;BA # HYPHEN
+2011;GL # NON-BREAKING HYPHEN
+2012;BA # FIGURE DASH
+2013;BA # EN DASH
+2014;B2 # EM DASH
+2015;AI # HORIZONTAL BAR
+2016;AI # DOUBLE VERTICAL LINE
+2017;AL # DOUBLE LOW LINE
+2018;QU # LEFT SINGLE QUOTATION MARK
+2019;QU # RIGHT SINGLE QUOTATION MARK
+201A;OP # SINGLE LOW-9 QUOTATION MARK
+201B;QU # SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C;QU # LEFT DOUBLE QUOTATION MARK
+201D;QU # RIGHT DOUBLE QUOTATION MARK
+201E;OP # DOUBLE LOW-9 QUOTATION MARK
+201F;QU # DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020;AI # DAGGER
+2021;AI # DOUBLE DAGGER
+2022;AL # BULLET
+2023;AL # TRIANGULAR BULLET
+2024;IN # ONE DOT LEADER
+2025;IN # TWO DOT LEADER
+2026;IN # HORIZONTAL ELLIPSIS
+2027;BA # HYPHENATION POINT
+2028;BK # LINE SEPARATOR
+2029;BK # PARAGRAPH SEPARATOR
+202A;CM # LEFT-TO-RIGHT EMBEDDING
+202B;CM # RIGHT-TO-LEFT EMBEDDING
+202C;CM # POP DIRECTIONAL FORMATTING
+202D;CM # LEFT-TO-RIGHT OVERRIDE
+202E;CM # RIGHT-TO-LEFT OVERRIDE
+202F;GL # NARROW NO-BREAK SPACE
+2030;PO # PER MILLE SIGN
+2031;PO # PER TEN THOUSAND SIGN
+2032;PO # PRIME
+2033;PO # DOUBLE PRIME
+2034;PO # TRIPLE PRIME
+2035;PO # REVERSED PRIME
+2036;PO # REVERSED DOUBLE PRIME
+2037;PO # REVERSED TRIPLE PRIME
+2038;AL # CARET
+2039;QU # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A;QU # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B;AI # REFERENCE MARK
+203C;NS # DOUBLE EXCLAMATION MARK
+203D;NS # INTERROBANG
+203E;AL # OVERLINE
+203F;AL # UNDERTIE
+2040;AL # CHARACTER TIE
+2041;AL # CARET INSERTION POINT
+2042;AL # ASTERISM
+2043;AL # HYPHEN BULLET
+2044;IS # FRACTION SLASH
+2045;OP # LEFT SQUARE BRACKET WITH QUILL
+2046;CL # RIGHT SQUARE BRACKET WITH QUILL
+2047;NS # DOUBLE QUESTION MARK
+2048;NS # QUESTION EXCLAMATION MARK
+2049;NS # EXCLAMATION QUESTION MARK
+204A;AL # TIRONIAN SIGN ET
+204B;AL # REVERSED PILCROW SIGN
+204C;AL # BLACK LEFTWARDS BULLET
+204D;AL # BLACK RIGHTWARDS BULLET
+204E;AL # LOW ASTERISK
+204F;AL # REVERSED SEMICOLON
+2050;AL # CLOSE UP
+2051;AL # TWO ASTERISKS ALIGNED VERTICALLY
+2052;AL # COMMERCIAL MINUS SIGN
+2053;AL # SWUNG DASH
+2054;AL # INVERTED UNDERTIE
+2055;AL # FLOWER PUNCTUATION MARK
+2056;BA # THREE DOT PUNCTUATION
+2057;AL # QUADRUPLE PRIME
+2058;BA # FOUR DOT PUNCTUATION
+2059;BA # FIVE DOT PUNCTUATION
+205A;BA # TWO DOT PUNCTUATION
+205B;BA # FOUR DOT MARK
+205C;AL # DOTTED CROSS
+205D;BA # TRICOLON
+205E;BA # VERTICAL FOUR DOTS
+205F;BA # MEDIUM MATHEMATICAL SPACE
+2060;WJ # WORD JOINER
+2061;AL # FUNCTION APPLICATION
+2062;AL # INVISIBLE TIMES
+2063;AL # INVISIBLE SEPARATOR
+2064;AL # INVISIBLE PLUS
+206A;CM # INHIBIT SYMMETRIC SWAPPING
+206B;CM # ACTIVATE SYMMETRIC SWAPPING
+206C;CM # INHIBIT ARABIC FORM SHAPING
+206D;CM # ACTIVATE ARABIC FORM SHAPING
+206E;CM # NATIONAL DIGIT SHAPES
+206F;CM # NOMINAL DIGIT SHAPES
+2070;AL # SUPERSCRIPT ZERO
+2071;AL # SUPERSCRIPT LATIN SMALL LETTER I
+2074;AI # SUPERSCRIPT FOUR
+2075;AL # SUPERSCRIPT FIVE
+2076;AL # SUPERSCRIPT SIX
+2077;AL # SUPERSCRIPT SEVEN
+2078;AL # SUPERSCRIPT EIGHT
+2079;AL # SUPERSCRIPT NINE
+207A;AL # SUPERSCRIPT PLUS SIGN
+207B;AL # SUPERSCRIPT MINUS
+207C;AL # SUPERSCRIPT EQUALS SIGN
+207D;OP # SUPERSCRIPT LEFT PARENTHESIS
+207E;CL # SUPERSCRIPT RIGHT PARENTHESIS
+207F;AI # SUPERSCRIPT LATIN SMALL LETTER N
+2080;AL # SUBSCRIPT ZERO
+2081;AI # SUBSCRIPT ONE
+2082;AI # SUBSCRIPT TWO
+2083;AI # SUBSCRIPT THREE
+2084;AI # SUBSCRIPT FOUR
+2085;AL # SUBSCRIPT FIVE
+2086;AL # SUBSCRIPT SIX
+2087;AL # SUBSCRIPT SEVEN
+2088;AL # SUBSCRIPT EIGHT
+2089;AL # SUBSCRIPT NINE
+208A;AL # SUBSCRIPT PLUS SIGN
+208B;AL # SUBSCRIPT MINUS
+208C;AL # SUBSCRIPT EQUALS SIGN
+208D;OP # SUBSCRIPT LEFT PARENTHESIS
+208E;CL # SUBSCRIPT RIGHT PARENTHESIS
+2090;AL # LATIN SUBSCRIPT SMALL LETTER A
+2091;AL # LATIN SUBSCRIPT SMALL LETTER E
+2092;AL # LATIN SUBSCRIPT SMALL LETTER O
+2093;AL # LATIN SUBSCRIPT SMALL LETTER X
+2094;AL # LATIN SUBSCRIPT SMALL LETTER SCHWA
+20A0;PR # EURO-CURRENCY SIGN
+20A1;PR # COLON SIGN
+20A2;PR # CRUZEIRO SIGN
+20A3;PR # FRENCH FRANC SIGN
+20A4;PR # LIRA SIGN
+20A5;PR # MILL SIGN
+20A6;PR # NAIRA SIGN
+20A7;PO # PESETA SIGN
+20A8;PR # RUPEE SIGN
+20A9;PR # WON SIGN
+20AA;PR # NEW SHEQEL SIGN
+20AB;PR # DONG SIGN
+20AC;PR # EURO SIGN
+20AD;PR # KIP SIGN
+20AE;PR # TUGRIK SIGN
+20AF;PR # DRACHMA SIGN
+20B0;PR # GERMAN PENNY SIGN
+20B1;PR # PESO SIGN
+20B2;PR # GUARANI SIGN
+20B3;PR # AUSTRAL SIGN
+20B4;PR # HRYVNIA SIGN
+20B5;PR # CEDI SIGN
+20D0;CM # COMBINING LEFT HARPOON ABOVE
+20D1;CM # COMBINING RIGHT HARPOON ABOVE
+20D2;CM # COMBINING LONG VERTICAL LINE OVERLAY
+20D3;CM # COMBINING SHORT VERTICAL LINE OVERLAY
+20D4;CM # COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5;CM # COMBINING CLOCKWISE ARROW ABOVE
+20D6;CM # COMBINING LEFT ARROW ABOVE
+20D7;CM # COMBINING RIGHT ARROW ABOVE
+20D8;CM # COMBINING RING OVERLAY
+20D9;CM # COMBINING CLOCKWISE RING OVERLAY
+20DA;CM # COMBINING ANTICLOCKWISE RING OVERLAY
+20DB;CM # COMBINING THREE DOTS ABOVE
+20DC;CM # COMBINING FOUR DOTS ABOVE
+20DD;CM # COMBINING ENCLOSING CIRCLE
+20DE;CM # COMBINING ENCLOSING SQUARE
+20DF;CM # COMBINING ENCLOSING DIAMOND
+20E0;CM # COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1;CM # COMBINING LEFT RIGHT ARROW ABOVE
+20E2;CM # COMBINING ENCLOSING SCREEN
+20E3;CM # COMBINING ENCLOSING KEYCAP
+20E4;CM # COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5;CM # COMBINING REVERSE SOLIDUS OVERLAY
+20E6;CM # COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20E7;CM # COMBINING ANNUITY SYMBOL
+20E8;CM # COMBINING TRIPLE UNDERDOT
+20E9;CM # COMBINING WIDE BRIDGE ABOVE
+20EA;CM # COMBINING LEFTWARDS ARROW OVERLAY
+20EB;CM # COMBINING LONG DOUBLE SOLIDUS OVERLAY
+20EC;CM # COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+20ED;CM # COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS
+20EE;CM # COMBINING LEFT ARROW BELOW
+20EF;CM # COMBINING RIGHT ARROW BELOW
+20F0;CM # COMBINING ASTERISK ABOVE
+2100;AL # ACCOUNT OF
+2101;AL # ADDRESSED TO THE SUBJECT
+2102;AL # DOUBLE-STRUCK CAPITAL C
+2103;PO # DEGREE CELSIUS
+2104;AL # CENTRE LINE SYMBOL
+2105;AI # CARE OF
+2106;AL # CADA UNA
+2107;AL # EULER CONSTANT
+2108;AL # SCRUPLE
+2109;PO # DEGREE FAHRENHEIT
+210A;AL # SCRIPT SMALL G
+210B;AL # SCRIPT CAPITAL H
+210C;AL # BLACK-LETTER CAPITAL H
+210D;AL # DOUBLE-STRUCK CAPITAL H
+210E;AL # PLANCK CONSTANT
+210F;AL # PLANCK CONSTANT OVER TWO PI
+2110;AL # SCRIPT CAPITAL I
+2111;AL # BLACK-LETTER CAPITAL I
+2112;AL # SCRIPT CAPITAL L
+2113;AI # SCRIPT SMALL L
+2114;AL # L B BAR SYMBOL
+2115;AL # DOUBLE-STRUCK CAPITAL N
+2116;PR # NUMERO SIGN
+2117;AL # SOUND RECORDING COPYRIGHT
+2118;AL # SCRIPT CAPITAL P
+2119;AL # DOUBLE-STRUCK CAPITAL P
+211A;AL # DOUBLE-STRUCK CAPITAL Q
+211B;AL # SCRIPT CAPITAL R
+211C;AL # BLACK-LETTER CAPITAL R
+211D;AL # DOUBLE-STRUCK CAPITAL R
+211E;AL # PRESCRIPTION TAKE
+211F;AL # RESPONSE
+2120;AL # SERVICE MARK
+2121;AI # TELEPHONE SIGN
+2122;AI # TRADE MARK SIGN
+2123;AL # VERSICLE
+2124;AL # DOUBLE-STRUCK CAPITAL Z
+2125;AL # OUNCE SIGN
+2126;AL # OHM SIGN
+2127;AL # INVERTED OHM SIGN
+2128;AL # BLACK-LETTER CAPITAL Z
+2129;AL # TURNED GREEK SMALL LETTER IOTA
+212A;AL # KELVIN SIGN
+212B;AI # ANGSTROM SIGN
+212C;AL # SCRIPT CAPITAL B
+212D;AL # BLACK-LETTER CAPITAL C
+212E;AL # ESTIMATED SYMBOL
+212F;AL # SCRIPT SMALL E
+2130;AL # SCRIPT CAPITAL E
+2131;AL # SCRIPT CAPITAL F
+2132;AL # TURNED CAPITAL F
+2133;AL # SCRIPT CAPITAL M
+2134;AL # SCRIPT SMALL O
+2135;AL # ALEF SYMBOL
+2136;AL # BET SYMBOL
+2137;AL # GIMEL SYMBOL
+2138;AL # DALET SYMBOL
+2139;AL # INFORMATION SOURCE
+213A;AL # ROTATED CAPITAL Q
+213B;AL # FACSIMILE SIGN
+213C;AL # DOUBLE-STRUCK SMALL PI
+213D;AL # DOUBLE-STRUCK SMALL GAMMA
+213E;AL # DOUBLE-STRUCK CAPITAL GAMMA
+213F;AL # DOUBLE-STRUCK CAPITAL PI
+2140;AL # DOUBLE-STRUCK N-ARY SUMMATION
+2141;AL # TURNED SANS-SERIF CAPITAL G
+2142;AL # TURNED SANS-SERIF CAPITAL L
+2143;AL # REVERSED SANS-SERIF CAPITAL L
+2144;AL # TURNED SANS-SERIF CAPITAL Y
+2145;AL # DOUBLE-STRUCK ITALIC CAPITAL D
+2146;AL # DOUBLE-STRUCK ITALIC SMALL D
+2147;AL # DOUBLE-STRUCK ITALIC SMALL E
+2148;AL # DOUBLE-STRUCK ITALIC SMALL I
+2149;AL # DOUBLE-STRUCK ITALIC SMALL J
+214A;AL # PROPERTY LINE
+214B;AL # TURNED AMPERSAND
+214C;AL # PER SIGN
+214D;AL # AKTIESELSKAB
+214E;AL # TURNED SMALL F
+214F;AL # SYMBOL FOR SAMARITAN SOURCE
+2153;AL # VULGAR FRACTION ONE THIRD
+2154;AI # VULGAR FRACTION TWO THIRDS
+2155;AI # VULGAR FRACTION ONE FIFTH
+2156;AL # VULGAR FRACTION TWO FIFTHS
+2157;AL # VULGAR FRACTION THREE FIFTHS
+2158;AL # VULGAR FRACTION FOUR FIFTHS
+2159;AL # VULGAR FRACTION ONE SIXTH
+215A;AL # VULGAR FRACTION FIVE SIXTHS
+215B;AI # VULGAR FRACTION ONE EIGHTH
+215C;AL # VULGAR FRACTION THREE EIGHTHS
+215D;AL # VULGAR FRACTION FIVE EIGHTHS
+215E;AI # VULGAR FRACTION SEVEN EIGHTHS
+215F;AL # FRACTION NUMERATOR ONE
+2160;AI # ROMAN NUMERAL ONE
+2161;AI # ROMAN NUMERAL TWO
+2162;AI # ROMAN NUMERAL THREE
+2163;AI # ROMAN NUMERAL FOUR
+2164;AI # ROMAN NUMERAL FIVE
+2165;AI # ROMAN NUMERAL SIX
+2166;AI # ROMAN NUMERAL SEVEN
+2167;AI # ROMAN NUMERAL EIGHT
+2168;AI # ROMAN NUMERAL NINE
+2169;AI # ROMAN NUMERAL TEN
+216A;AI # ROMAN NUMERAL ELEVEN
+216B;AI # ROMAN NUMERAL TWELVE
+216C;AL # ROMAN NUMERAL FIFTY
+216D;AL # ROMAN NUMERAL ONE HUNDRED
+216E;AL # ROMAN NUMERAL FIVE HUNDRED
+216F;AL # ROMAN NUMERAL ONE THOUSAND
+2170;AI # SMALL ROMAN NUMERAL ONE
+2171;AI # SMALL ROMAN NUMERAL TWO
+2172;AI # SMALL ROMAN NUMERAL THREE
+2173;AI # SMALL ROMAN NUMERAL FOUR
+2174;AI # SMALL ROMAN NUMERAL FIVE
+2175;AI # SMALL ROMAN NUMERAL SIX
+2176;AI # SMALL ROMAN NUMERAL SEVEN
+2177;AI # SMALL ROMAN NUMERAL EIGHT
+2178;AI # SMALL ROMAN NUMERAL NINE
+2179;AI # SMALL ROMAN NUMERAL TEN
+217A;AL # SMALL ROMAN NUMERAL ELEVEN
+217B;AL # SMALL ROMAN NUMERAL TWELVE
+217C;AL # SMALL ROMAN NUMERAL FIFTY
+217D;AL # SMALL ROMAN NUMERAL ONE HUNDRED
+217E;AL # SMALL ROMAN NUMERAL FIVE HUNDRED
+217F;AL # SMALL ROMAN NUMERAL ONE THOUSAND
+2180;AL # ROMAN NUMERAL ONE THOUSAND C D
+2181;AL # ROMAN NUMERAL FIVE THOUSAND
+2182;AL # ROMAN NUMERAL TEN THOUSAND
+2183;AL # ROMAN NUMERAL REVERSED ONE HUNDRED
+2184;AL # LATIN SMALL LETTER REVERSED C
+2185;AL # ROMAN NUMERAL SIX LATE FORM
+2186;AL # ROMAN NUMERAL FIFTY EARLY FORM
+2187;AL # ROMAN NUMERAL FIFTY THOUSAND
+2188;AL # ROMAN NUMERAL ONE HUNDRED THOUSAND
+2190;AI # LEFTWARDS ARROW
+2191;AI # UPWARDS ARROW
+2192;AI # RIGHTWARDS ARROW
+2193;AI # DOWNWARDS ARROW
+2194;AI # LEFT RIGHT ARROW
+2195;AI # UP DOWN ARROW
+2196;AI # NORTH WEST ARROW
+2197;AI # NORTH EAST ARROW
+2198;AI # SOUTH EAST ARROW
+2199;AI # SOUTH WEST ARROW
+219A;AL # LEFTWARDS ARROW WITH STROKE
+219B;AL # RIGHTWARDS ARROW WITH STROKE
+219C;AL # LEFTWARDS WAVE ARROW
+219D;AL # RIGHTWARDS WAVE ARROW
+219E;AL # LEFTWARDS TWO HEADED ARROW
+219F;AL # UPWARDS TWO HEADED ARROW
+21A0;AL # RIGHTWARDS TWO HEADED ARROW
+21A1;AL # DOWNWARDS TWO HEADED ARROW
+21A2;AL # LEFTWARDS ARROW WITH TAIL
+21A3;AL # RIGHTWARDS ARROW WITH TAIL
+21A4;AL # LEFTWARDS ARROW FROM BAR
+21A5;AL # UPWARDS ARROW FROM BAR
+21A6;AL # RIGHTWARDS ARROW FROM BAR
+21A7;AL # DOWNWARDS ARROW FROM BAR
+21A8;AL # UP DOWN ARROW WITH BASE
+21A9;AL # LEFTWARDS ARROW WITH HOOK
+21AA;AL # RIGHTWARDS ARROW WITH HOOK
+21AB;AL # LEFTWARDS ARROW WITH LOOP
+21AC;AL # RIGHTWARDS ARROW WITH LOOP
+21AD;AL # LEFT RIGHT WAVE ARROW
+21AE;AL # LEFT RIGHT ARROW WITH STROKE
+21AF;AL # DOWNWARDS ZIGZAG ARROW
+21B0;AL # UPWARDS ARROW WITH TIP LEFTWARDS
+21B1;AL # UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2;AL # DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3;AL # DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4;AL # RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21B5;AL # DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21B6;AL # ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7;AL # CLOCKWISE TOP SEMICIRCLE ARROW
+21B8;AL # NORTH WEST ARROW TO LONG BAR
+21B9;AL # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21BA;AL # ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB;AL # CLOCKWISE OPEN CIRCLE ARROW
+21BC;AL # LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD;AL # LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE;AL # UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF;AL # UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0;AL # RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1;AL # RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2;AL # DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3;AL # DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4;AL # RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5;AL # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6;AL # LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7;AL # LEFTWARDS PAIRED ARROWS
+21C8;AL # UPWARDS PAIRED ARROWS
+21C9;AL # RIGHTWARDS PAIRED ARROWS
+21CA;AL # DOWNWARDS PAIRED ARROWS
+21CB;AL # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC;AL # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD;AL # LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE;AL # LEFT RIGHT DOUBLE ARROW WITH STROKE
+21CF;AL # RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0;AL # LEFTWARDS DOUBLE ARROW
+21D1;AL # UPWARDS DOUBLE ARROW
+21D2;AI # RIGHTWARDS DOUBLE ARROW
+21D3;AL # DOWNWARDS DOUBLE ARROW
+21D4;AI # LEFT RIGHT DOUBLE ARROW
+21D5;AL # UP DOWN DOUBLE ARROW
+21D6;AL # NORTH WEST DOUBLE ARROW
+21D7;AL # NORTH EAST DOUBLE ARROW
+21D8;AL # SOUTH EAST DOUBLE ARROW
+21D9;AL # SOUTH WEST DOUBLE ARROW
+21DA;AL # LEFTWARDS TRIPLE ARROW
+21DB;AL # RIGHTWARDS TRIPLE ARROW
+21DC;AL # LEFTWARDS SQUIGGLE ARROW
+21DD;AL # RIGHTWARDS SQUIGGLE ARROW
+21DE;AL # UPWARDS ARROW WITH DOUBLE STROKE
+21DF;AL # DOWNWARDS ARROW WITH DOUBLE STROKE
+21E0;AL # LEFTWARDS DASHED ARROW
+21E1;AL # UPWARDS DASHED ARROW
+21E2;AL # RIGHTWARDS DASHED ARROW
+21E3;AL # DOWNWARDS DASHED ARROW
+21E4;AL # LEFTWARDS ARROW TO BAR
+21E5;AL # RIGHTWARDS ARROW TO BAR
+21E6;AL # LEFTWARDS WHITE ARROW
+21E7;AL # UPWARDS WHITE ARROW
+21E8;AL # RIGHTWARDS WHITE ARROW
+21E9;AL # DOWNWARDS WHITE ARROW
+21EA;AL # UPWARDS WHITE ARROW FROM BAR
+21EB;AL # UPWARDS WHITE ARROW ON PEDESTAL
+21EC;AL # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ED;AL # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21EE;AL # UPWARDS WHITE DOUBLE ARROW
+21EF;AL # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21F0;AL # RIGHTWARDS WHITE ARROW FROM WALL
+21F1;AL # NORTH WEST ARROW TO CORNER
+21F2;AL # SOUTH EAST ARROW TO CORNER
+21F3;AL # UP DOWN WHITE ARROW
+21F4;AL # RIGHT ARROW WITH SMALL CIRCLE
+21F5;AL # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+21F6;AL # THREE RIGHTWARDS ARROWS
+21F7;AL # LEFTWARDS ARROW WITH VERTICAL STROKE
+21F8;AL # RIGHTWARDS ARROW WITH VERTICAL STROKE
+21F9;AL # LEFT RIGHT ARROW WITH VERTICAL STROKE
+21FA;AL # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FB;AL # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FC;AL # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+21FD;AL # LEFTWARDS OPEN-HEADED ARROW
+21FE;AL # RIGHTWARDS OPEN-HEADED ARROW
+21FF;AL # LEFT RIGHT OPEN-HEADED ARROW
+2200;AI # FOR ALL
+2201;AL # COMPLEMENT
+2202;AI # PARTIAL DIFFERENTIAL
+2203;AI # THERE EXISTS
+2204;AL # THERE DOES NOT EXIST
+2205;AL # EMPTY SET
+2206;AL # INCREMENT
+2207;AI # NABLA
+2208;AI # ELEMENT OF
+2209;AL # NOT AN ELEMENT OF
+220A;AL # SMALL ELEMENT OF
+220B;AI # CONTAINS AS MEMBER
+220C;AL # DOES NOT CONTAIN AS MEMBER
+220D;AL # SMALL CONTAINS AS MEMBER
+220E;AL # END OF PROOF
+220F;AI # N-ARY PRODUCT
+2210;AL # N-ARY COPRODUCT
+2211;AI # N-ARY SUMMATION
+2212;PR # MINUS SIGN
+2213;PR # MINUS-OR-PLUS SIGN
+2214;AL # DOT PLUS
+2215;AI # DIVISION SLASH
+2216;AL # SET MINUS
+2217;AL # ASTERISK OPERATOR
+2218;AL # RING OPERATOR
+2219;AL # BULLET OPERATOR
+221A;AI # SQUARE ROOT
+221B;AL # CUBE ROOT
+221C;AL # FOURTH ROOT
+221D;AI # PROPORTIONAL TO
+221E;AI # INFINITY
+221F;AI # RIGHT ANGLE
+2220;AI # ANGLE
+2221;AL # MEASURED ANGLE
+2222;AL # SPHERICAL ANGLE
+2223;AI # DIVIDES
+2224;AL # DOES NOT DIVIDE
+2225;AI # PARALLEL TO
+2226;AL # NOT PARALLEL TO
+2227;AI # LOGICAL AND
+2228;AI # LOGICAL OR
+2229;AI # INTERSECTION
+222A;AI # UNION
+222B;AI # INTEGRAL
+222C;AI # DOUBLE INTEGRAL
+222D;AL # TRIPLE INTEGRAL
+222E;AI # CONTOUR INTEGRAL
+222F;AL # SURFACE INTEGRAL
+2230;AL # VOLUME INTEGRAL
+2231;AL # CLOCKWISE INTEGRAL
+2232;AL # CLOCKWISE CONTOUR INTEGRAL
+2233;AL # ANTICLOCKWISE CONTOUR INTEGRAL
+2234;AI # THEREFORE
+2235;AI # BECAUSE
+2236;AI # RATIO
+2237;AI # PROPORTION
+2238;AL # DOT MINUS
+2239;AL # EXCESS
+223A;AL # GEOMETRIC PROPORTION
+223B;AL # HOMOTHETIC
+223C;AI # TILDE OPERATOR
+223D;AI # REVERSED TILDE
+223E;AL # INVERTED LAZY S
+223F;AL # SINE WAVE
+2240;AL # WREATH PRODUCT
+2241;AL # NOT TILDE
+2242;AL # MINUS TILDE
+2243;AL # ASYMPTOTICALLY EQUAL TO
+2244;AL # NOT ASYMPTOTICALLY EQUAL TO
+2245;AL # APPROXIMATELY EQUAL TO
+2246;AL # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247;AL # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+2248;AI # ALMOST EQUAL TO
+2249;AL # NOT ALMOST EQUAL TO
+224A;AL # ALMOST EQUAL OR EQUAL TO
+224B;AL # TRIPLE TILDE
+224C;AI # ALL EQUAL TO
+224D;AL # EQUIVALENT TO
+224E;AL # GEOMETRICALLY EQUIVALENT TO
+224F;AL # DIFFERENCE BETWEEN
+2250;AL # APPROACHES THE LIMIT
+2251;AL # GEOMETRICALLY EQUAL TO
+2252;AI # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253;AL # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254;AL # COLON EQUALS
+2255;AL # EQUALS COLON
+2256;AL # RING IN EQUAL TO
+2257;AL # RING EQUAL TO
+2258;AL # CORRESPONDS TO
+2259;AL # ESTIMATES
+225A;AL # EQUIANGULAR TO
+225B;AL # STAR EQUALS
+225C;AL # DELTA EQUAL TO
+225D;AL # EQUAL TO BY DEFINITION
+225E;AL # MEASURED BY
+225F;AL # QUESTIONED EQUAL TO
+2260;AI # NOT EQUAL TO
+2261;AI # IDENTICAL TO
+2262;AL # NOT IDENTICAL TO
+2263;AL # STRICTLY EQUIVALENT TO
+2264;AI # LESS-THAN OR EQUAL TO
+2265;AI # GREATER-THAN OR EQUAL TO
+2266;AI # LESS-THAN OVER EQUAL TO
+2267;AI # GREATER-THAN OVER EQUAL TO
+2268;AL # LESS-THAN BUT NOT EQUAL TO
+2269;AL # GREATER-THAN BUT NOT EQUAL TO
+226A;AI # MUCH LESS-THAN
+226B;AI # MUCH GREATER-THAN
+226C;AL # BETWEEN
+226D;AL # NOT EQUIVALENT TO
+226E;AI # NOT LESS-THAN
+226F;AI # NOT GREATER-THAN
+2270;AL # NEITHER LESS-THAN NOR EQUAL TO
+2271;AL # NEITHER GREATER-THAN NOR EQUAL TO
+2272;AL # LESS-THAN OR EQUIVALENT TO
+2273;AL # GREATER-THAN OR EQUIVALENT TO
+2274;AL # NEITHER LESS-THAN NOR EQUIVALENT TO
+2275;AL # NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276;AL # LESS-THAN OR GREATER-THAN
+2277;AL # GREATER-THAN OR LESS-THAN
+2278;AL # NEITHER LESS-THAN NOR GREATER-THAN
+2279;AL # NEITHER GREATER-THAN NOR LESS-THAN
+227A;AL # PRECEDES
+227B;AL # SUCCEEDS
+227C;AL # PRECEDES OR EQUAL TO
+227D;AL # SUCCEEDS OR EQUAL TO
+227E;AL # PRECEDES OR EQUIVALENT TO
+227F;AL # SUCCEEDS OR EQUIVALENT TO
+2280;AL # DOES NOT PRECEDE
+2281;AL # DOES NOT SUCCEED
+2282;AI # SUBSET OF
+2283;AI # SUPERSET OF
+2284;AL # NOT A SUBSET OF
+2285;AL # NOT A SUPERSET OF
+2286;AI # SUBSET OF OR EQUAL TO
+2287;AI # SUPERSET OF OR EQUAL TO
+2288;AL # NEITHER A SUBSET OF NOR EQUAL TO
+2289;AL # NEITHER A SUPERSET OF NOR EQUAL TO
+228A;AL # SUBSET OF WITH NOT EQUAL TO
+228B;AL # SUPERSET OF WITH NOT EQUAL TO
+228C;AL # MULTISET
+228D;AL # MULTISET MULTIPLICATION
+228E;AL # MULTISET UNION
+228F;AL # SQUARE IMAGE OF
+2290;AL # SQUARE ORIGINAL OF
+2291;AL # SQUARE IMAGE OF OR EQUAL TO
+2292;AL # SQUARE ORIGINAL OF OR EQUAL TO
+2293;AL # SQUARE CAP
+2294;AL # SQUARE CUP
+2295;AI # CIRCLED PLUS
+2296;AL # CIRCLED MINUS
+2297;AL # CIRCLED TIMES
+2298;AL # CIRCLED DIVISION SLASH
+2299;AI # CIRCLED DOT OPERATOR
+229A;AL # CIRCLED RING OPERATOR
+229B;AL # CIRCLED ASTERISK OPERATOR
+229C;AL # CIRCLED EQUALS
+229D;AL # CIRCLED DASH
+229E;AL # SQUARED PLUS
+229F;AL # SQUARED MINUS
+22A0;AL # SQUARED TIMES
+22A1;AL # SQUARED DOT OPERATOR
+22A2;AL # RIGHT TACK
+22A3;AL # LEFT TACK
+22A4;AL # DOWN TACK
+22A5;AI # UP TACK
+22A6;AL # ASSERTION
+22A7;AL # MODELS
+22A8;AL # TRUE
+22A9;AL # FORCES
+22AA;AL # TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB;AL # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC;AL # DOES NOT PROVE
+22AD;AL # NOT TRUE
+22AE;AL # DOES NOT FORCE
+22AF;AL # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22B0;AL # PRECEDES UNDER RELATION
+22B1;AL # SUCCEEDS UNDER RELATION
+22B2;AL # NORMAL SUBGROUP OF
+22B3;AL # CONTAINS AS NORMAL SUBGROUP
+22B4;AL # NORMAL SUBGROUP OF OR EQUAL TO
+22B5;AL # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6;AL # ORIGINAL OF
+22B7;AL # IMAGE OF
+22B8;AL # MULTIMAP
+22B9;AL # HERMITIAN CONJUGATE MATRIX
+22BA;AL # INTERCALATE
+22BB;AL # XOR
+22BC;AL # NAND
+22BD;AL # NOR
+22BE;AL # RIGHT ANGLE WITH ARC
+22BF;AI # RIGHT TRIANGLE
+22C0;AL # N-ARY LOGICAL AND
+22C1;AL # N-ARY LOGICAL OR
+22C2;AL # N-ARY INTERSECTION
+22C3;AL # N-ARY UNION
+22C4;AL # DIAMOND OPERATOR
+22C5;AL # DOT OPERATOR
+22C6;AL # STAR OPERATOR
+22C7;AL # DIVISION TIMES
+22C8;AL # BOWTIE
+22C9;AL # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA;AL # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB;AL # LEFT SEMIDIRECT PRODUCT
+22CC;AL # RIGHT SEMIDIRECT PRODUCT
+22CD;AL # REVERSED TILDE EQUALS
+22CE;AL # CURLY LOGICAL OR
+22CF;AL # CURLY LOGICAL AND
+22D0;AL # DOUBLE SUBSET
+22D1;AL # DOUBLE SUPERSET
+22D2;AL # DOUBLE INTERSECTION
+22D3;AL # DOUBLE UNION
+22D4;AL # PITCHFORK
+22D5;AL # EQUAL AND PARALLEL TO
+22D6;AL # LESS-THAN WITH DOT
+22D7;AL # GREATER-THAN WITH DOT
+22D8;AL # VERY MUCH LESS-THAN
+22D9;AL # VERY MUCH GREATER-THAN
+22DA;AL # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB;AL # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC;AL # EQUAL TO OR LESS-THAN
+22DD;AL # EQUAL TO OR GREATER-THAN
+22DE;AL # EQUAL TO OR PRECEDES
+22DF;AL # EQUAL TO OR SUCCEEDS
+22E0;AL # DOES NOT PRECEDE OR EQUAL
+22E1;AL # DOES NOT SUCCEED OR EQUAL
+22E2;AL # NOT SQUARE IMAGE OF OR EQUAL TO
+22E3;AL # NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4;AL # SQUARE IMAGE OF OR NOT EQUAL TO
+22E5;AL # SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6;AL # LESS-THAN BUT NOT EQUIVALENT TO
+22E7;AL # GREATER-THAN BUT NOT EQUIVALENT TO
+22E8;AL # PRECEDES BUT NOT EQUIVALENT TO
+22E9;AL # SUCCEEDS BUT NOT EQUIVALENT TO
+22EA;AL # NOT NORMAL SUBGROUP OF
+22EB;AL # DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC;AL # NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED;AL # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22EE;AL # VERTICAL ELLIPSIS
+22EF;AL # MIDLINE HORIZONTAL ELLIPSIS
+22F0;AL # UP RIGHT DIAGONAL ELLIPSIS
+22F1;AL # DOWN RIGHT DIAGONAL ELLIPSIS
+22F2;AL # ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3;AL # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4;AL # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F5;AL # ELEMENT OF WITH DOT ABOVE
+22F6;AL # ELEMENT OF WITH OVERBAR
+22F7;AL # SMALL ELEMENT OF WITH OVERBAR
+22F8;AL # ELEMENT OF WITH UNDERBAR
+22F9;AL # ELEMENT OF WITH TWO HORIZONTAL STROKES
+22FA;AL # CONTAINS WITH LONG HORIZONTAL STROKE
+22FB;AL # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC;AL # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD;AL # CONTAINS WITH OVERBAR
+22FE;AL # SMALL CONTAINS WITH OVERBAR
+22FF;AL # Z NOTATION BAG MEMBERSHIP
+2300;AL # DIAMETER SIGN
+2301;AL # ELECTRIC ARROW
+2302;AL # HOUSE
+2303;AL # UP ARROWHEAD
+2304;AL # DOWN ARROWHEAD
+2305;AL # PROJECTIVE
+2306;AL # PERSPECTIVE
+2307;AL # WAVY LINE
+2308;AL # LEFT CEILING
+2309;AL # RIGHT CEILING
+230A;AL # LEFT FLOOR
+230B;AL # RIGHT FLOOR
+230C;AL # BOTTOM RIGHT CROP
+230D;AL # BOTTOM LEFT CROP
+230E;AL # TOP RIGHT CROP
+230F;AL # TOP LEFT CROP
+2310;AL # REVERSED NOT SIGN
+2311;AL # SQUARE LOZENGE
+2312;AI # ARC
+2313;AL # SEGMENT
+2314;AL # SECTOR
+2315;AL # TELEPHONE RECORDER
+2316;AL # POSITION INDICATOR
+2317;AL # VIEWDATA SQUARE
+2318;AL # PLACE OF INTEREST SIGN
+2319;AL # TURNED NOT SIGN
+231A;AL # WATCH
+231B;AL # HOURGLASS
+231C;AL # TOP LEFT CORNER
+231D;AL # TOP RIGHT CORNER
+231E;AL # BOTTOM LEFT CORNER
+231F;AL # BOTTOM RIGHT CORNER
+2320;AL # TOP HALF INTEGRAL
+2321;AL # BOTTOM HALF INTEGRAL
+2322;AL # FROWN
+2323;AL # SMILE
+2324;AL # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325;AL # OPTION KEY
+2326;AL # ERASE TO THE RIGHT
+2327;AL # X IN A RECTANGLE BOX
+2328;AL # KEYBOARD
+2329;OP # LEFT-POINTING ANGLE BRACKET
+232A;CL # RIGHT-POINTING ANGLE BRACKET
+232B;AL # ERASE TO THE LEFT
+232C;AL # BENZENE RING
+232D;AL # CYLINDRICITY
+232E;AL # ALL AROUND-PROFILE
+232F;AL # SYMMETRY
+2330;AL # TOTAL RUNOUT
+2331;AL # DIMENSION ORIGIN
+2332;AL # CONICAL TAPER
+2333;AL # SLOPE
+2334;AL # COUNTERBORE
+2335;AL # COUNTERSINK
+2336;AL # APL FUNCTIONAL SYMBOL I-BEAM
+2337;AL # APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338;AL # APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339;AL # APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A;AL # APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B;AL # APL FUNCTIONAL SYMBOL QUAD JOT
+233C;AL # APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D;AL # APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E;AL # APL FUNCTIONAL SYMBOL CIRCLE JOT
+233F;AL # APL FUNCTIONAL SYMBOL SLASH BAR
+2340;AL # APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341;AL # APL FUNCTIONAL SYMBOL QUAD SLASH
+2342;AL # APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343;AL # APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344;AL # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345;AL # APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346;AL # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347;AL # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348;AL # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349;AL # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A;AL # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234B;AL # APL FUNCTIONAL SYMBOL DELTA STILE
+234C;AL # APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D;AL # APL FUNCTIONAL SYMBOL QUAD DELTA
+234E;AL # APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234F;AL # APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350;AL # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351;AL # APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352;AL # APL FUNCTIONAL SYMBOL DEL STILE
+2353;AL # APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354;AL # APL FUNCTIONAL SYMBOL QUAD DEL
+2355;AL # APL FUNCTIONAL SYMBOL UP TACK JOT
+2356;AL # APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357;AL # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358;AL # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359;AL # APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A;AL # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B;AL # APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C;AL # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D;AL # APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E;AL # APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F;AL # APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360;AL # APL FUNCTIONAL SYMBOL QUAD COLON
+2361;AL # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362;AL # APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363;AL # APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364;AL # APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365;AL # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366;AL # APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367;AL # APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368;AL # APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369;AL # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A;AL # APL FUNCTIONAL SYMBOL COMMA BAR
+236B;AL # APL FUNCTIONAL SYMBOL DEL TILDE
+236C;AL # APL FUNCTIONAL SYMBOL ZILDE
+236D;AL # APL FUNCTIONAL SYMBOL STILE TILDE
+236E;AL # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F;AL # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370;AL # APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371;AL # APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372;AL # APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373;AL # APL FUNCTIONAL SYMBOL IOTA
+2374;AL # APL FUNCTIONAL SYMBOL RHO
+2375;AL # APL FUNCTIONAL SYMBOL OMEGA
+2376;AL # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377;AL # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378;AL # APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379;AL # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A;AL # APL FUNCTIONAL SYMBOL ALPHA
+237B;AL # NOT CHECK MARK
+237C;AL # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D;AL # SHOULDERED OPEN BOX
+237E;AL # BELL SYMBOL
+237F;AL # VERTICAL LINE WITH MIDDLE DOT
+2380;AL # INSERTION SYMBOL
+2381;AL # CONTINUOUS UNDERLINE SYMBOL
+2382;AL # DISCONTINUOUS UNDERLINE SYMBOL
+2383;AL # EMPHASIS SYMBOL
+2384;AL # COMPOSITION SYMBOL
+2385;AL # WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386;AL # ENTER SYMBOL
+2387;AL # ALTERNATIVE KEY SYMBOL
+2388;AL # HELM SYMBOL
+2389;AL # CIRCLED HORIZONTAL BAR WITH NOTCH
+238A;AL # CIRCLED TRIANGLE DOWN
+238B;AL # BROKEN CIRCLE WITH NORTHWEST ARROW
+238C;AL # UNDO SYMBOL
+238D;AL # MONOSTABLE SYMBOL
+238E;AL # HYSTERESIS SYMBOL
+238F;AL # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390;AL # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391;AL # PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392;AL # PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393;AL # DIRECT CURRENT SYMBOL FORM TWO
+2394;AL # SOFTWARE-FUNCTION SYMBOL
+2395;AL # APL FUNCTIONAL SYMBOL QUAD
+2396;AL # DECIMAL SEPARATOR KEY SYMBOL
+2397;AL # PREVIOUS PAGE
+2398;AL # NEXT PAGE
+2399;AL # PRINT SCREEN SYMBOL
+239A;AL # CLEAR SCREEN SYMBOL
+239B;AL # LEFT PARENTHESIS UPPER HOOK
+239C;AL # LEFT PARENTHESIS EXTENSION
+239D;AL # LEFT PARENTHESIS LOWER HOOK
+239E;AL # RIGHT PARENTHESIS UPPER HOOK
+239F;AL # RIGHT PARENTHESIS EXTENSION
+23A0;AL # RIGHT PARENTHESIS LOWER HOOK
+23A1;AL # LEFT SQUARE BRACKET UPPER CORNER
+23A2;AL # LEFT SQUARE BRACKET EXTENSION
+23A3;AL # LEFT SQUARE BRACKET LOWER CORNER
+23A4;AL # RIGHT SQUARE BRACKET UPPER CORNER
+23A5;AL # RIGHT SQUARE BRACKET EXTENSION
+23A6;AL # RIGHT SQUARE BRACKET LOWER CORNER
+23A7;AL # LEFT CURLY BRACKET UPPER HOOK
+23A8;AL # LEFT CURLY BRACKET MIDDLE PIECE
+23A9;AL # LEFT CURLY BRACKET LOWER HOOK
+23AA;AL # CURLY BRACKET EXTENSION
+23AB;AL # RIGHT CURLY BRACKET UPPER HOOK
+23AC;AL # RIGHT CURLY BRACKET MIDDLE PIECE
+23AD;AL # RIGHT CURLY BRACKET LOWER HOOK
+23AE;AL # INTEGRAL EXTENSION
+23AF;AL # HORIZONTAL LINE EXTENSION
+23B0;AL # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+23B1;AL # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+23B2;AL # SUMMATION TOP
+23B3;AL # SUMMATION BOTTOM
+23B4;AL # TOP SQUARE BRACKET
+23B5;AL # BOTTOM SQUARE BRACKET
+23B6;AL # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7;AL # RADICAL SYMBOL BOTTOM
+23B8;AL # LEFT VERTICAL BOX LINE
+23B9;AL # RIGHT VERTICAL BOX LINE
+23BA;AL # HORIZONTAL SCAN LINE-1
+23BB;AL # HORIZONTAL SCAN LINE-3
+23BC;AL # HORIZONTAL SCAN LINE-7
+23BD;AL # HORIZONTAL SCAN LINE-9
+23BE;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+23BF;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+23C0;AL # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
+23C1;AL # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
+23C2;AL # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
+23C3;AL # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE
+23C4;AL # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE
+23C5;AL # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE
+23C6;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE
+23C7;AL # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
+23C8;AL # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
+23C9;AL # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+23CA;AL # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+23CB;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+23CC;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+23CD;AL # SQUARE FOOT
+23CE;AL # RETURN SYMBOL
+23CF;AL # EJECT SYMBOL
+23D0;AL # VERTICAL LINE EXTENSION
+23D1;AL # METRICAL BREVE
+23D2;AL # METRICAL LONG OVER SHORT
+23D3;AL # METRICAL SHORT OVER LONG
+23D4;AL # METRICAL LONG OVER TWO SHORTS
+23D5;AL # METRICAL TWO SHORTS OVER LONG
+23D6;AL # METRICAL TWO SHORTS JOINED
+23D7;AL # METRICAL TRISEME
+23D8;AL # METRICAL TETRASEME
+23D9;AL # METRICAL PENTASEME
+23DA;AL # EARTH GROUND
+23DB;AL # FUSE
+23DC;AL # TOP PARENTHESIS
+23DD;AL # BOTTOM PARENTHESIS
+23DE;AL # TOP CURLY BRACKET
+23DF;AL # BOTTOM CURLY BRACKET
+23E0;AL # TOP TORTOISE SHELL BRACKET
+23E1;AL # BOTTOM TORTOISE SHELL BRACKET
+23E2;AL # WHITE TRAPEZIUM
+23E3;AL # BENZENE RING WITH CIRCLE
+23E4;AL # STRAIGHTNESS
+23E5;AL # FLATNESS
+23E6;AL # AC CURRENT
+23E7;AL # ELECTRICAL INTERSECTION
+2400;AL # SYMBOL FOR NULL
+2401;AL # SYMBOL FOR START OF HEADING
+2402;AL # SYMBOL FOR START OF TEXT
+2403;AL # SYMBOL FOR END OF TEXT
+2404;AL # SYMBOL FOR END OF TRANSMISSION
+2405;AL # SYMBOL FOR ENQUIRY
+2406;AL # SYMBOL FOR ACKNOWLEDGE
+2407;AL # SYMBOL FOR BELL
+2408;AL # SYMBOL FOR BACKSPACE
+2409;AL # SYMBOL FOR HORIZONTAL TABULATION
+240A;AL # SYMBOL FOR LINE FEED
+240B;AL # SYMBOL FOR VERTICAL TABULATION
+240C;AL # SYMBOL FOR FORM FEED
+240D;AL # SYMBOL FOR CARRIAGE RETURN
+240E;AL # SYMBOL FOR SHIFT OUT
+240F;AL # SYMBOL FOR SHIFT IN
+2410;AL # SYMBOL FOR DATA LINK ESCAPE
+2411;AL # SYMBOL FOR DEVICE CONTROL ONE
+2412;AL # SYMBOL FOR DEVICE CONTROL TWO
+2413;AL # SYMBOL FOR DEVICE CONTROL THREE
+2414;AL # SYMBOL FOR DEVICE CONTROL FOUR
+2415;AL # SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416;AL # SYMBOL FOR SYNCHRONOUS IDLE
+2417;AL # SYMBOL FOR END OF TRANSMISSION BLOCK
+2418;AL # SYMBOL FOR CANCEL
+2419;AL # SYMBOL FOR END OF MEDIUM
+241A;AL # SYMBOL FOR SUBSTITUTE
+241B;AL # SYMBOL FOR ESCAPE
+241C;AL # SYMBOL FOR FILE SEPARATOR
+241D;AL # SYMBOL FOR GROUP SEPARATOR
+241E;AL # SYMBOL FOR RECORD SEPARATOR
+241F;AL # SYMBOL FOR UNIT SEPARATOR
+2420;AL # SYMBOL FOR SPACE
+2421;AL # SYMBOL FOR DELETE
+2422;AL # BLANK SYMBOL
+2423;AL # OPEN BOX
+2424;AL # SYMBOL FOR NEWLINE
+2425;AL # SYMBOL FOR DELETE FORM TWO
+2426;AL # SYMBOL FOR SUBSTITUTE FORM TWO
+2440;AL # OCR HOOK
+2441;AL # OCR CHAIR
+2442;AL # OCR FORK
+2443;AL # OCR INVERTED FORK
+2444;AL # OCR BELT BUCKLE
+2445;AL # OCR BOW TIE
+2446;AL # OCR BRANCH BANK IDENTIFICATION
+2447;AL # OCR AMOUNT OF CHECK
+2448;AL # OCR DASH
+2449;AL # OCR CUSTOMER ACCOUNT NUMBER
+244A;AL # OCR DOUBLE BACKSLASH
+2460;AI # CIRCLED DIGIT ONE
+2461;AI # CIRCLED DIGIT TWO
+2462;AI # CIRCLED DIGIT THREE
+2463;AI # CIRCLED DIGIT FOUR
+2464;AI # CIRCLED DIGIT FIVE
+2465;AI # CIRCLED DIGIT SIX
+2466;AI # CIRCLED DIGIT SEVEN
+2467;AI # CIRCLED DIGIT EIGHT
+2468;AI # CIRCLED DIGIT NINE
+2469;AI # CIRCLED NUMBER TEN
+246A;AI # CIRCLED NUMBER ELEVEN
+246B;AI # CIRCLED NUMBER TWELVE
+246C;AI # CIRCLED NUMBER THIRTEEN
+246D;AI # CIRCLED NUMBER FOURTEEN
+246E;AI # CIRCLED NUMBER FIFTEEN
+246F;AI # CIRCLED NUMBER SIXTEEN
+2470;AI # CIRCLED NUMBER SEVENTEEN
+2471;AI # CIRCLED NUMBER EIGHTEEN
+2472;AI # CIRCLED NUMBER NINETEEN
+2473;AI # CIRCLED NUMBER TWENTY
+2474;AI # PARENTHESIZED DIGIT ONE
+2475;AI # PARENTHESIZED DIGIT TWO
+2476;AI # PARENTHESIZED DIGIT THREE
+2477;AI # PARENTHESIZED DIGIT FOUR
+2478;AI # PARENTHESIZED DIGIT FIVE
+2479;AI # PARENTHESIZED DIGIT SIX
+247A;AI # PARENTHESIZED DIGIT SEVEN
+247B;AI # PARENTHESIZED DIGIT EIGHT
+247C;AI # PARENTHESIZED DIGIT NINE
+247D;AI # PARENTHESIZED NUMBER TEN
+247E;AI # PARENTHESIZED NUMBER ELEVEN
+247F;AI # PARENTHESIZED NUMBER TWELVE
+2480;AI # PARENTHESIZED NUMBER THIRTEEN
+2481;AI # PARENTHESIZED NUMBER FOURTEEN
+2482;AI # PARENTHESIZED NUMBER FIFTEEN
+2483;AI # PARENTHESIZED NUMBER SIXTEEN
+2484;AI # PARENTHESIZED NUMBER SEVENTEEN
+2485;AI # PARENTHESIZED NUMBER EIGHTEEN
+2486;AI # PARENTHESIZED NUMBER NINETEEN
+2487;AI # PARENTHESIZED NUMBER TWENTY
+2488;AI # DIGIT ONE FULL STOP
+2489;AI # DIGIT TWO FULL STOP
+248A;AI # DIGIT THREE FULL STOP
+248B;AI # DIGIT FOUR FULL STOP
+248C;AI # DIGIT FIVE FULL STOP
+248D;AI # DIGIT SIX FULL STOP
+248E;AI # DIGIT SEVEN FULL STOP
+248F;AI # DIGIT EIGHT FULL STOP
+2490;AI # DIGIT NINE FULL STOP
+2491;AI # NUMBER TEN FULL STOP
+2492;AI # NUMBER ELEVEN FULL STOP
+2493;AI # NUMBER TWELVE FULL STOP
+2494;AI # NUMBER THIRTEEN FULL STOP
+2495;AI # NUMBER FOURTEEN FULL STOP
+2496;AI # NUMBER FIFTEEN FULL STOP
+2497;AI # NUMBER SIXTEEN FULL STOP
+2498;AI # NUMBER SEVENTEEN FULL STOP
+2499;AI # NUMBER EIGHTEEN FULL STOP
+249A;AI # NUMBER NINETEEN FULL STOP
+249B;AI # NUMBER TWENTY FULL STOP
+249C;AI # PARENTHESIZED LATIN SMALL LETTER A
+249D;AI # PARENTHESIZED LATIN SMALL LETTER B
+249E;AI # PARENTHESIZED LATIN SMALL LETTER C
+249F;AI # PARENTHESIZED LATIN SMALL LETTER D
+24A0;AI # PARENTHESIZED LATIN SMALL LETTER E
+24A1;AI # PARENTHESIZED LATIN SMALL LETTER F
+24A2;AI # PARENTHESIZED LATIN SMALL LETTER G
+24A3;AI # PARENTHESIZED LATIN SMALL LETTER H
+24A4;AI # PARENTHESIZED LATIN SMALL LETTER I
+24A5;AI # PARENTHESIZED LATIN SMALL LETTER J
+24A6;AI # PARENTHESIZED LATIN SMALL LETTER K
+24A7;AI # PARENTHESIZED LATIN SMALL LETTER L
+24A8;AI # PARENTHESIZED LATIN SMALL LETTER M
+24A9;AI # PARENTHESIZED LATIN SMALL LETTER N
+24AA;AI # PARENTHESIZED LATIN SMALL LETTER O
+24AB;AI # PARENTHESIZED LATIN SMALL LETTER P
+24AC;AI # PARENTHESIZED LATIN SMALL LETTER Q
+24AD;AI # PARENTHESIZED LATIN SMALL LETTER R
+24AE;AI # PARENTHESIZED LATIN SMALL LETTER S
+24AF;AI # PARENTHESIZED LATIN SMALL LETTER T
+24B0;AI # PARENTHESIZED LATIN SMALL LETTER U
+24B1;AI # PARENTHESIZED LATIN SMALL LETTER V
+24B2;AI # PARENTHESIZED LATIN SMALL LETTER W
+24B3;AI # PARENTHESIZED LATIN SMALL LETTER X
+24B4;AI # PARENTHESIZED LATIN SMALL LETTER Y
+24B5;AI # PARENTHESIZED LATIN SMALL LETTER Z
+24B6;AI # CIRCLED LATIN CAPITAL LETTER A
+24B7;AI # CIRCLED LATIN CAPITAL LETTER B
+24B8;AI # CIRCLED LATIN CAPITAL LETTER C
+24B9;AI # CIRCLED LATIN CAPITAL LETTER D
+24BA;AI # CIRCLED LATIN CAPITAL LETTER E
+24BB;AI # CIRCLED LATIN CAPITAL LETTER F
+24BC;AI # CIRCLED LATIN CAPITAL LETTER G
+24BD;AI # CIRCLED LATIN CAPITAL LETTER H
+24BE;AI # CIRCLED LATIN CAPITAL LETTER I
+24BF;AI # CIRCLED LATIN CAPITAL LETTER J
+24C0;AI # CIRCLED LATIN CAPITAL LETTER K
+24C1;AI # CIRCLED LATIN CAPITAL LETTER L
+24C2;AI # CIRCLED LATIN CAPITAL LETTER M
+24C3;AI # CIRCLED LATIN CAPITAL LETTER N
+24C4;AI # CIRCLED LATIN CAPITAL LETTER O
+24C5;AI # CIRCLED LATIN CAPITAL LETTER P
+24C6;AI # CIRCLED LATIN CAPITAL LETTER Q
+24C7;AI # CIRCLED LATIN CAPITAL LETTER R
+24C8;AI # CIRCLED LATIN CAPITAL LETTER S
+24C9;AI # CIRCLED LATIN CAPITAL LETTER T
+24CA;AI # CIRCLED LATIN CAPITAL LETTER U
+24CB;AI # CIRCLED LATIN CAPITAL LETTER V
+24CC;AI # CIRCLED LATIN CAPITAL LETTER W
+24CD;AI # CIRCLED LATIN CAPITAL LETTER X
+24CE;AI # CIRCLED LATIN CAPITAL LETTER Y
+24CF;AI # CIRCLED LATIN CAPITAL LETTER Z
+24D0;AI # CIRCLED LATIN SMALL LETTER A
+24D1;AI # CIRCLED LATIN SMALL LETTER B
+24D2;AI # CIRCLED LATIN SMALL LETTER C
+24D3;AI # CIRCLED LATIN SMALL LETTER D
+24D4;AI # CIRCLED LATIN SMALL LETTER E
+24D5;AI # CIRCLED LATIN SMALL LETTER F
+24D6;AI # CIRCLED LATIN SMALL LETTER G
+24D7;AI # CIRCLED LATIN SMALL LETTER H
+24D8;AI # CIRCLED LATIN SMALL LETTER I
+24D9;AI # CIRCLED LATIN SMALL LETTER J
+24DA;AI # CIRCLED LATIN SMALL LETTER K
+24DB;AI # CIRCLED LATIN SMALL LETTER L
+24DC;AI # CIRCLED LATIN SMALL LETTER M
+24DD;AI # CIRCLED LATIN SMALL LETTER N
+24DE;AI # CIRCLED LATIN SMALL LETTER O
+24DF;AI # CIRCLED LATIN SMALL LETTER P
+24E0;AI # CIRCLED LATIN SMALL LETTER Q
+24E1;AI # CIRCLED LATIN SMALL LETTER R
+24E2;AI # CIRCLED LATIN SMALL LETTER S
+24E3;AI # CIRCLED LATIN SMALL LETTER T
+24E4;AI # CIRCLED LATIN SMALL LETTER U
+24E5;AI # CIRCLED LATIN SMALL LETTER V
+24E6;AI # CIRCLED LATIN SMALL LETTER W
+24E7;AI # CIRCLED LATIN SMALL LETTER X
+24E8;AI # CIRCLED LATIN SMALL LETTER Y
+24E9;AI # CIRCLED LATIN SMALL LETTER Z
+24EA;AI # CIRCLED DIGIT ZERO
+24EB;AI # NEGATIVE CIRCLED NUMBER ELEVEN
+24EC;AI # NEGATIVE CIRCLED NUMBER TWELVE
+24ED;AI # NEGATIVE CIRCLED NUMBER THIRTEEN
+24EE;AI # NEGATIVE CIRCLED NUMBER FOURTEEN
+24EF;AI # NEGATIVE CIRCLED NUMBER FIFTEEN
+24F0;AI # NEGATIVE CIRCLED NUMBER SIXTEEN
+24F1;AI # NEGATIVE CIRCLED NUMBER SEVENTEEN
+24F2;AI # NEGATIVE CIRCLED NUMBER EIGHTEEN
+24F3;AI # NEGATIVE CIRCLED NUMBER NINETEEN
+24F4;AI # NEGATIVE CIRCLED NUMBER TWENTY
+24F5;AI # DOUBLE CIRCLED DIGIT ONE
+24F6;AI # DOUBLE CIRCLED DIGIT TWO
+24F7;AI # DOUBLE CIRCLED DIGIT THREE
+24F8;AI # DOUBLE CIRCLED DIGIT FOUR
+24F9;AI # DOUBLE CIRCLED DIGIT FIVE
+24FA;AI # DOUBLE CIRCLED DIGIT SIX
+24FB;AI # DOUBLE CIRCLED DIGIT SEVEN
+24FC;AI # DOUBLE CIRCLED DIGIT EIGHT
+24FD;AI # DOUBLE CIRCLED DIGIT NINE
+24FE;AI # DOUBLE CIRCLED NUMBER TEN
+24FF;AL # NEGATIVE CIRCLED DIGIT ZERO
+2500;AI # BOX DRAWINGS LIGHT HORIZONTAL
+2501;AI # BOX DRAWINGS HEAVY HORIZONTAL
+2502;AI # BOX DRAWINGS LIGHT VERTICAL
+2503;AI # BOX DRAWINGS HEAVY VERTICAL
+2504;AI # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505;AI # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506;AI # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507;AI # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508;AI # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509;AI # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A;AI # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B;AI # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C;AI # BOX DRAWINGS LIGHT DOWN AND RIGHT
+250D;AI # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E;AI # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F;AI # BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510;AI # BOX DRAWINGS LIGHT DOWN AND LEFT
+2511;AI # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512;AI # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513;AI # BOX DRAWINGS HEAVY DOWN AND LEFT
+2514;AI # BOX DRAWINGS LIGHT UP AND RIGHT
+2515;AI # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516;AI # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517;AI # BOX DRAWINGS HEAVY UP AND RIGHT
+2518;AI # BOX DRAWINGS LIGHT UP AND LEFT
+2519;AI # BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A;AI # BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B;AI # BOX DRAWINGS HEAVY UP AND LEFT
+251C;AI # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251D;AI # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251E;AI # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F;AI # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520;AI # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521;AI # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522;AI # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523;AI # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524;AI # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525;AI # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526;AI # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527;AI # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528;AI # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529;AI # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A;AI # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B;AI # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C;AI # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252D;AI # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E;AI # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F;AI # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530;AI # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531;AI # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532;AI # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533;AI # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534;AI # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535;AI # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536;AI # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537;AI # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538;AI # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539;AI # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A;AI # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B;AI # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C;AI # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253D;AI # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E;AI # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F;AI # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540;AI # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541;AI # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542;AI # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543;AI # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544;AI # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545;AI # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546;AI # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547;AI # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548;AI # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549;AI # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A;AI # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B;AI # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C;AL # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D;AL # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E;AL # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F;AL # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550;AI # BOX DRAWINGS DOUBLE HORIZONTAL
+2551;AI # BOX DRAWINGS DOUBLE VERTICAL
+2552;AI # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553;AI # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554;AI # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555;AI # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556;AI # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557;AI # BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558;AI # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559;AI # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A;AI # BOX DRAWINGS DOUBLE UP AND RIGHT
+255B;AI # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C;AI # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D;AI # BOX DRAWINGS DOUBLE UP AND LEFT
+255E;AI # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F;AI # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560;AI # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561;AI # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562;AI # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563;AI # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564;AI # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565;AI # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566;AI # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567;AI # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568;AI # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569;AI # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A;AI # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B;AI # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C;AI # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D;AI # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E;AI # BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F;AI # BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570;AI # BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571;AI # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572;AI # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573;AI # BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574;AI # BOX DRAWINGS LIGHT LEFT
+2575;AL # BOX DRAWINGS LIGHT UP
+2576;AL # BOX DRAWINGS LIGHT RIGHT
+2577;AL # BOX DRAWINGS LIGHT DOWN
+2578;AL # BOX DRAWINGS HEAVY LEFT
+2579;AL # BOX DRAWINGS HEAVY UP
+257A;AL # BOX DRAWINGS HEAVY RIGHT
+257B;AL # BOX DRAWINGS HEAVY DOWN
+257C;AL # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D;AL # BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E;AL # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F;AL # BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580;AI # UPPER HALF BLOCK
+2581;AI # LOWER ONE EIGHTH BLOCK
+2582;AI # LOWER ONE QUARTER BLOCK
+2583;AI # LOWER THREE EIGHTHS BLOCK
+2584;AI # LOWER HALF BLOCK
+2585;AI # LOWER FIVE EIGHTHS BLOCK
+2586;AI # LOWER THREE QUARTERS BLOCK
+2587;AI # LOWER SEVEN EIGHTHS BLOCK
+2588;AI # FULL BLOCK
+2589;AI # LEFT SEVEN EIGHTHS BLOCK
+258A;AI # LEFT THREE QUARTERS BLOCK
+258B;AI # LEFT FIVE EIGHTHS BLOCK
+258C;AI # LEFT HALF BLOCK
+258D;AI # LEFT THREE EIGHTHS BLOCK
+258E;AI # LEFT ONE QUARTER BLOCK
+258F;AI # LEFT ONE EIGHTH BLOCK
+2590;AL # RIGHT HALF BLOCK
+2591;AL # LIGHT SHADE
+2592;AI # MEDIUM SHADE
+2593;AI # DARK SHADE
+2594;AI # UPPER ONE EIGHTH BLOCK
+2595;AI # RIGHT ONE EIGHTH BLOCK
+2596;AL # QUADRANT LOWER LEFT
+2597;AL # QUADRANT LOWER RIGHT
+2598;AL # QUADRANT UPPER LEFT
+2599;AL # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+259A;AL # QUADRANT UPPER LEFT AND LOWER RIGHT
+259B;AL # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+259C;AL # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+259D;AL # QUADRANT UPPER RIGHT
+259E;AL # QUADRANT UPPER RIGHT AND LOWER LEFT
+259F;AL # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+25A0;AI # BLACK SQUARE
+25A1;AI # WHITE SQUARE
+25A2;AL # WHITE SQUARE WITH ROUNDED CORNERS
+25A3;AI # WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4;AI # SQUARE WITH HORIZONTAL FILL
+25A5;AI # SQUARE WITH VERTICAL FILL
+25A6;AI # SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7;AI # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8;AI # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9;AI # SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA;AL # BLACK SMALL SQUARE
+25AB;AL # WHITE SMALL SQUARE
+25AC;AL # BLACK RECTANGLE
+25AD;AL # WHITE RECTANGLE
+25AE;AL # BLACK VERTICAL RECTANGLE
+25AF;AL # WHITE VERTICAL RECTANGLE
+25B0;AL # BLACK PARALLELOGRAM
+25B1;AL # WHITE PARALLELOGRAM
+25B2;AI # BLACK UP-POINTING TRIANGLE
+25B3;AI # WHITE UP-POINTING TRIANGLE
+25B4;AL # BLACK UP-POINTING SMALL TRIANGLE
+25B5;AL # WHITE UP-POINTING SMALL TRIANGLE
+25B6;AI # BLACK RIGHT-POINTING TRIANGLE
+25B7;AI # WHITE RIGHT-POINTING TRIANGLE
+25B8;AL # BLACK RIGHT-POINTING SMALL TRIANGLE
+25B9;AL # WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA;AL # BLACK RIGHT-POINTING POINTER
+25BB;AL # WHITE RIGHT-POINTING POINTER
+25BC;AI # BLACK DOWN-POINTING TRIANGLE
+25BD;AI # WHITE DOWN-POINTING TRIANGLE
+25BE;AL # BLACK DOWN-POINTING SMALL TRIANGLE
+25BF;AL # WHITE DOWN-POINTING SMALL TRIANGLE
+25C0;AI # BLACK LEFT-POINTING TRIANGLE
+25C1;AI # WHITE LEFT-POINTING TRIANGLE
+25C2;AL # BLACK LEFT-POINTING SMALL TRIANGLE
+25C3;AL # WHITE LEFT-POINTING SMALL TRIANGLE
+25C4;AL # BLACK LEFT-POINTING POINTER
+25C5;AL # WHITE LEFT-POINTING POINTER
+25C6;AI # BLACK DIAMOND
+25C7;AI # WHITE DIAMOND
+25C8;AI # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9;AL # FISHEYE
+25CA;AL # LOZENGE
+25CB;AI # WHITE CIRCLE
+25CC;AL # DOTTED CIRCLE
+25CD;AL # CIRCLE WITH VERTICAL FILL
+25CE;AI # BULLSEYE
+25CF;AI # BLACK CIRCLE
+25D0;AI # CIRCLE WITH LEFT HALF BLACK
+25D1;AI # CIRCLE WITH RIGHT HALF BLACK
+25D2;AL # CIRCLE WITH LOWER HALF BLACK
+25D3;AL # CIRCLE WITH UPPER HALF BLACK
+25D4;AL # CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5;AL # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6;AL # LEFT HALF BLACK CIRCLE
+25D7;AL # RIGHT HALF BLACK CIRCLE
+25D8;AL # INVERSE BULLET
+25D9;AL # INVERSE WHITE CIRCLE
+25DA;AL # UPPER HALF INVERSE WHITE CIRCLE
+25DB;AL # LOWER HALF INVERSE WHITE CIRCLE
+25DC;AL # UPPER LEFT QUADRANT CIRCULAR ARC
+25DD;AL # UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE;AL # LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF;AL # LOWER LEFT QUADRANT CIRCULAR ARC
+25E0;AL # UPPER HALF CIRCLE
+25E1;AL # LOWER HALF CIRCLE
+25E2;AI # BLACK LOWER RIGHT TRIANGLE
+25E3;AI # BLACK LOWER LEFT TRIANGLE
+25E4;AI # BLACK UPPER LEFT TRIANGLE
+25E5;AI # BLACK UPPER RIGHT TRIANGLE
+25E6;AL # WHITE BULLET
+25E7;AL # SQUARE WITH LEFT HALF BLACK
+25E8;AL # SQUARE WITH RIGHT HALF BLACK
+25E9;AL # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA;AL # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB;AL # WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC;AL # WHITE UP-POINTING TRIANGLE WITH DOT
+25ED;AL # UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE;AL # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF;AI # LARGE CIRCLE
+25F0;AL # WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1;AL # WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2;AL # WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3;AL # WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4;AL # WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5;AL # WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6;AL # WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7;AL # WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8;AL # UPPER LEFT TRIANGLE
+25F9;AL # UPPER RIGHT TRIANGLE
+25FA;AL # LOWER LEFT TRIANGLE
+25FB;AL # WHITE MEDIUM SQUARE
+25FC;AL # BLACK MEDIUM SQUARE
+25FD;AL # WHITE MEDIUM SMALL SQUARE
+25FE;AL # BLACK MEDIUM SMALL SQUARE
+25FF;AL # LOWER RIGHT TRIANGLE
+2600;AL # BLACK SUN WITH RAYS
+2601;AL # CLOUD
+2602;AL # UMBRELLA
+2603;AL # SNOWMAN
+2604;AL # COMET
+2605;AI # BLACK STAR
+2606;AI # WHITE STAR
+2607;AL # LIGHTNING
+2608;AL # THUNDERSTORM
+2609;AI # SUN
+260A;AL # ASCENDING NODE
+260B;AL # DESCENDING NODE
+260C;AL # CONJUNCTION
+260D;AL # OPPOSITION
+260E;AI # BLACK TELEPHONE
+260F;AI # WHITE TELEPHONE
+2610;AL # BALLOT BOX
+2611;AL # BALLOT BOX WITH CHECK
+2612;AL # BALLOT BOX WITH X
+2613;AL # SALTIRE
+2614;AI # UMBRELLA WITH RAIN DROPS
+2615;AI # HOT BEVERAGE
+2616;AI # WHITE SHOGI PIECE
+2617;AI # BLACK SHOGI PIECE
+2618;AL # SHAMROCK
+2619;AL # REVERSED ROTATED FLORAL HEART BULLET
+261A;AL # BLACK LEFT POINTING INDEX
+261B;AL # BLACK RIGHT POINTING INDEX
+261C;AI # WHITE LEFT POINTING INDEX
+261D;AL # WHITE UP POINTING INDEX
+261E;AI # WHITE RIGHT POINTING INDEX
+261F;AL # WHITE DOWN POINTING INDEX
+2620;AL # SKULL AND CROSSBONES
+2621;AL # CAUTION SIGN
+2622;AL # RADIOACTIVE SIGN
+2623;AL # BIOHAZARD SIGN
+2624;AL # CADUCEUS
+2625;AL # ANKH
+2626;AL # ORTHODOX CROSS
+2627;AL # CHI RHO
+2628;AL # CROSS OF LORRAINE
+2629;AL # CROSS OF JERUSALEM
+262A;AL # STAR AND CRESCENT
+262B;AL # FARSI SYMBOL
+262C;AL # ADI SHAKTI
+262D;AL # HAMMER AND SICKLE
+262E;AL # PEACE SYMBOL
+262F;AL # YIN YANG
+2630;AL # TRIGRAM FOR HEAVEN
+2631;AL # TRIGRAM FOR LAKE
+2632;AL # TRIGRAM FOR FIRE
+2633;AL # TRIGRAM FOR THUNDER
+2634;AL # TRIGRAM FOR WIND
+2635;AL # TRIGRAM FOR WATER
+2636;AL # TRIGRAM FOR MOUNTAIN
+2637;AL # TRIGRAM FOR EARTH
+2638;AL # WHEEL OF DHARMA
+2639;AL # WHITE FROWNING FACE
+263A;AL # WHITE SMILING FACE
+263B;AL # BLACK SMILING FACE
+263C;AL # WHITE SUN WITH RAYS
+263D;AL # FIRST QUARTER MOON
+263E;AL # LAST QUARTER MOON
+263F;AL # MERCURY
+2640;AI # FEMALE SIGN
+2641;AL # EARTH
+2642;AI # MALE SIGN
+2643;AL # JUPITER
+2644;AL # SATURN
+2645;AL # URANUS
+2646;AL # NEPTUNE
+2647;AL # PLUTO
+2648;AL # ARIES
+2649;AL # TAURUS
+264A;AL # GEMINI
+264B;AL # CANCER
+264C;AL # LEO
+264D;AL # VIRGO
+264E;AL # LIBRA
+264F;AL # SCORPIUS
+2650;AL # SAGITTARIUS
+2651;AL # CAPRICORN
+2652;AL # AQUARIUS
+2653;AL # PISCES
+2654;AL # WHITE CHESS KING
+2655;AL # WHITE CHESS QUEEN
+2656;AL # WHITE CHESS ROOK
+2657;AL # WHITE CHESS BISHOP
+2658;AL # WHITE CHESS KNIGHT
+2659;AL # WHITE CHESS PAWN
+265A;AL # BLACK CHESS KING
+265B;AL # BLACK CHESS QUEEN
+265C;AL # BLACK CHESS ROOK
+265D;AL # BLACK CHESS BISHOP
+265E;AL # BLACK CHESS KNIGHT
+265F;AL # BLACK CHESS PAWN
+2660;AI # BLACK SPADE SUIT
+2661;AI # WHITE HEART SUIT
+2662;AL # WHITE DIAMOND SUIT
+2663;AI # BLACK CLUB SUIT
+2664;AI # WHITE SPADE SUIT
+2665;AI # BLACK HEART SUIT
+2666;AL # BLACK DIAMOND SUIT
+2667;AI # WHITE CLUB SUIT
+2668;AI # HOT SPRINGS
+2669;AI # QUARTER NOTE
+266A;AI # EIGHTH NOTE
+266B;AL # BEAMED EIGHTH NOTES
+266C;AI # BEAMED SIXTEENTH NOTES
+266D;AI # MUSIC FLAT SIGN
+266E;AL # MUSIC NATURAL SIGN
+266F;AI # MUSIC SHARP SIGN
+2670;AL # WEST SYRIAC CROSS
+2671;AL # EAST SYRIAC CROSS
+2672;AL # UNIVERSAL RECYCLING SYMBOL
+2673;AL # RECYCLING SYMBOL FOR TYPE-1 PLASTICS
+2674;AL # RECYCLING SYMBOL FOR TYPE-2 PLASTICS
+2675;AL # RECYCLING SYMBOL FOR TYPE-3 PLASTICS
+2676;AL # RECYCLING SYMBOL FOR TYPE-4 PLASTICS
+2677;AL # RECYCLING SYMBOL FOR TYPE-5 PLASTICS
+2678;AL # RECYCLING SYMBOL FOR TYPE-6 PLASTICS
+2679;AL # RECYCLING SYMBOL FOR TYPE-7 PLASTICS
+267A;AL # RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B;AL # BLACK UNIVERSAL RECYCLING SYMBOL
+267C;AL # RECYCLED PAPER SYMBOL
+267D;AL # PARTIALLY-RECYCLED PAPER SYMBOL
+267E;AL # PERMANENT PAPER SIGN
+267F;AL # WHEELCHAIR SYMBOL
+2680;AL # DIE FACE-1
+2681;AL # DIE FACE-2
+2682;AL # DIE FACE-3
+2683;AL # DIE FACE-4
+2684;AL # DIE FACE-5
+2685;AL # DIE FACE-6
+2686;AL # WHITE CIRCLE WITH DOT RIGHT
+2687;AL # WHITE CIRCLE WITH TWO DOTS
+2688;AL # BLACK CIRCLE WITH WHITE DOT RIGHT
+2689;AL # BLACK CIRCLE WITH TWO WHITE DOTS
+268A;AL # MONOGRAM FOR YANG
+268B;AL # MONOGRAM FOR YIN
+268C;AL # DIGRAM FOR GREATER YANG
+268D;AL # DIGRAM FOR LESSER YIN
+268E;AL # DIGRAM FOR LESSER YANG
+268F;AL # DIGRAM FOR GREATER YIN
+2690;AL # WHITE FLAG
+2691;AL # BLACK FLAG
+2692;AL # HAMMER AND PICK
+2693;AL # ANCHOR
+2694;AL # CROSSED SWORDS
+2695;AL # STAFF OF AESCULAPIUS
+2696;AL # SCALES
+2697;AL # ALEMBIC
+2698;AL # FLOWER
+2699;AL # GEAR
+269A;AL # STAFF OF HERMES
+269B;AL # ATOM SYMBOL
+269C;AL # FLEUR-DE-LIS
+269D;AL # OUTLINED WHITE STAR
+26A0;AL # WARNING SIGN
+26A1;AL # HIGH VOLTAGE SIGN
+26A2;AL # DOUBLED FEMALE SIGN
+26A3;AL # DOUBLED MALE SIGN
+26A4;AL # INTERLOCKED FEMALE AND MALE SIGN
+26A5;AL # MALE AND FEMALE SIGN
+26A6;AL # MALE WITH STROKE SIGN
+26A7;AL # MALE WITH STROKE AND MALE AND FEMALE SIGN
+26A8;AL # VERTICAL MALE WITH STROKE SIGN
+26A9;AL # HORIZONTAL MALE WITH STROKE SIGN
+26AA;AL # MEDIUM WHITE CIRCLE
+26AB;AL # MEDIUM BLACK CIRCLE
+26AC;AL # MEDIUM SMALL WHITE CIRCLE
+26AD;AL # MARRIAGE SYMBOL
+26AE;AL # DIVORCE SYMBOL
+26AF;AL # UNMARRIED PARTNERSHIP SYMBOL
+26B0;AL # COFFIN
+26B1;AL # FUNERAL URN
+26B2;AL # NEUTER
+26B3;AL # CERES
+26B4;AL # PALLAS
+26B5;AL # JUNO
+26B6;AL # VESTA
+26B7;AL # CHIRON
+26B8;AL # BLACK MOON LILITH
+26B9;AL # SEXTILE
+26BA;AL # SEMISEXTILE
+26BB;AL # QUINCUNX
+26BC;AL # SESQUIQUADRATE
+26C0;AL # WHITE DRAUGHTS MAN
+26C1;AL # WHITE DRAUGHTS KING
+26C2;AL # BLACK DRAUGHTS MAN
+26C3;AL # BLACK DRAUGHTS KING
+2701;AL # UPPER BLADE SCISSORS
+2702;AL # BLACK SCISSORS
+2703;AL # LOWER BLADE SCISSORS
+2704;AL # WHITE SCISSORS
+2706;AL # TELEPHONE LOCATION SIGN
+2707;AL # TAPE DRIVE
+2708;AL # AIRPLANE
+2709;AL # ENVELOPE
+270C;AL # VICTORY HAND
+270D;AL # WRITING HAND
+270E;AL # LOWER RIGHT PENCIL
+270F;AL # PENCIL
+2710;AL # UPPER RIGHT PENCIL
+2711;AL # WHITE NIB
+2712;AL # BLACK NIB
+2713;AL # CHECK MARK
+2714;AL # HEAVY CHECK MARK
+2715;AL # MULTIPLICATION X
+2716;AL # HEAVY MULTIPLICATION X
+2717;AL # BALLOT X
+2718;AL # HEAVY BALLOT X
+2719;AL # OUTLINED GREEK CROSS
+271A;AL # HEAVY GREEK CROSS
+271B;AL # OPEN CENTRE CROSS
+271C;AL # HEAVY OPEN CENTRE CROSS
+271D;AL # LATIN CROSS
+271E;AL # SHADOWED WHITE LATIN CROSS
+271F;AL # OUTLINED LATIN CROSS
+2720;AL # MALTESE CROSS
+2721;AL # STAR OF DAVID
+2722;AL # FOUR TEARDROP-SPOKED ASTERISK
+2723;AL # FOUR BALLOON-SPOKED ASTERISK
+2724;AL # HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725;AL # FOUR CLUB-SPOKED ASTERISK
+2726;AL # BLACK FOUR POINTED STAR
+2727;AL # WHITE FOUR POINTED STAR
+2729;AL # STRESS OUTLINED WHITE STAR
+272A;AL # CIRCLED WHITE STAR
+272B;AL # OPEN CENTRE BLACK STAR
+272C;AL # BLACK CENTRE WHITE STAR
+272D;AL # OUTLINED BLACK STAR
+272E;AL # HEAVY OUTLINED BLACK STAR
+272F;AL # PINWHEEL STAR
+2730;AL # SHADOWED WHITE STAR
+2731;AL # HEAVY ASTERISK
+2732;AL # OPEN CENTRE ASTERISK
+2733;AL # EIGHT SPOKED ASTERISK
+2734;AL # EIGHT POINTED BLACK STAR
+2735;AL # EIGHT POINTED PINWHEEL STAR
+2736;AL # SIX POINTED BLACK STAR
+2737;AL # EIGHT POINTED RECTILINEAR BLACK STAR
+2738;AL # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739;AL # TWELVE POINTED BLACK STAR
+273A;AL # SIXTEEN POINTED ASTERISK
+273B;AL # TEARDROP-SPOKED ASTERISK
+273C;AL # OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D;AL # HEAVY TEARDROP-SPOKED ASTERISK
+273E;AL # SIX PETALLED BLACK AND WHITE FLORETTE
+273F;AL # BLACK FLORETTE
+2740;AL # WHITE FLORETTE
+2741;AL # EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742;AL # CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743;AL # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744;AL # SNOWFLAKE
+2745;AL # TIGHT TRIFOLIATE SNOWFLAKE
+2746;AL # HEAVY CHEVRON SNOWFLAKE
+2747;AL # SPARKLE
+2748;AL # HEAVY SPARKLE
+2749;AL # BALLOON-SPOKED ASTERISK
+274A;AL # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B;AL # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D;AL # SHADOWED WHITE CIRCLE
+274F;AL # LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750;AL # UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751;AL # LOWER RIGHT SHADOWED WHITE SQUARE
+2752;AL # UPPER RIGHT SHADOWED WHITE SQUARE
+2756;AL # BLACK DIAMOND MINUS WHITE X
+2758;AL # LIGHT VERTICAL BAR
+2759;AL # MEDIUM VERTICAL BAR
+275A;AL # HEAVY VERTICAL BAR
+275B;QU # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C;QU # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D;QU # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E;QU # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761;AL # CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762;EX # HEAVY EXCLAMATION MARK ORNAMENT
+2763;EX # HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764;AL # HEAVY BLACK HEART
+2765;AL # ROTATED HEAVY BLACK HEART BULLET
+2766;AL # FLORAL HEART
+2767;AL # ROTATED FLORAL HEART BULLET
+2768;OP # MEDIUM LEFT PARENTHESIS ORNAMENT
+2769;CL # MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A;OP # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B;CL # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C;OP # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D;CL # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E;OP # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F;CL # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770;OP # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771;CL # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772;OP # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773;CL # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774;OP # MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775;CL # MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776;AI # DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777;AI # DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778;AI # DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779;AI # DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277A;AI # DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277B;AI # DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277C;AI # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277D;AI # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277E;AI # DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277F;AI # DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780;AI # DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781;AI # DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782;AI # DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783;AI # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784;AI # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785;AI # DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786;AI # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787;AI # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788;AI # DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789;AI # DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278A;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278B;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278C;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278D;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278E;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278F;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794;AL # HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798;AL # HEAVY SOUTH EAST ARROW
+2799;AL # HEAVY RIGHTWARDS ARROW
+279A;AL # HEAVY NORTH EAST ARROW
+279B;AL # DRAFTING POINT RIGHTWARDS ARROW
+279C;AL # HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D;AL # TRIANGLE-HEADED RIGHTWARDS ARROW
+279E;AL # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F;AL # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0;AL # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1;AL # BLACK RIGHTWARDS ARROW
+27A2;AL # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3;AL # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4;AL # BLACK RIGHTWARDS ARROWHEAD
+27A5;AL # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6;AL # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7;AL # SQUAT BLACK RIGHTWARDS ARROW
+27A8;AL # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9;AL # RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA;AL # LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB;AL # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC;AL # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD;AL # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE;AL # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF;AL # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1;AL # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2;AL # CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3;AL # WHITE-FEATHERED RIGHTWARDS ARROW
+27B4;AL # BLACK-FEATHERED SOUTH EAST ARROW
+27B5;AL # BLACK-FEATHERED RIGHTWARDS ARROW
+27B6;AL # BLACK-FEATHERED NORTH EAST ARROW
+27B7;AL # HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8;AL # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9;AL # HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA;AL # TEARDROP-BARBED RIGHTWARDS ARROW
+27BB;AL # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC;AL # WEDGE-TAILED RIGHTWARDS ARROW
+27BD;AL # HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE;AL # OPEN-OUTLINED RIGHTWARDS ARROW
+27C0;AL # THREE DIMENSIONAL ANGLE
+27C1;AL # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE
+27C2;AL # PERPENDICULAR
+27C3;AL # OPEN SUBSET
+27C4;AL # OPEN SUPERSET
+27C5;OP # LEFT S-SHAPED BAG DELIMITER
+27C6;CL # RIGHT S-SHAPED BAG DELIMITER
+27C7;AL # OR WITH DOT INSIDE
+27C8;AL # REVERSE SOLIDUS PRECEDING SUBSET
+27C9;AL # SUPERSET PRECEDING SOLIDUS
+27CA;AL # VERTICAL BAR WITH HORIZONTAL STROKE
+27CC;AL # LONG DIVISION
+27D0;AL # WHITE DIAMOND WITH CENTRED DOT
+27D1;AL # AND WITH DOT
+27D2;AL # ELEMENT OF OPENING UPWARDS
+27D3;AL # LOWER RIGHT CORNER WITH DOT
+27D4;AL # UPPER LEFT CORNER WITH DOT
+27D5;AL # LEFT OUTER JOIN
+27D6;AL # RIGHT OUTER JOIN
+27D7;AL # FULL OUTER JOIN
+27D8;AL # LARGE UP TACK
+27D9;AL # LARGE DOWN TACK
+27DA;AL # LEFT AND RIGHT DOUBLE TURNSTILE
+27DB;AL # LEFT AND RIGHT TACK
+27DC;AL # LEFT MULTIMAP
+27DD;AL # LONG RIGHT TACK
+27DE;AL # LONG LEFT TACK
+27DF;AL # UP TACK WITH CIRCLE ABOVE
+27E0;AL # LOZENGE DIVIDED BY HORIZONTAL RULE
+27E1;AL # WHITE CONCAVE-SIDED DIAMOND
+27E2;AL # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3;AL # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4;AL # WHITE SQUARE WITH LEFTWARDS TICK
+27E5;AL # WHITE SQUARE WITH RIGHTWARDS TICK
+27E6;OP # MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7;CL # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8;OP # MATHEMATICAL LEFT ANGLE BRACKET
+27E9;CL # MATHEMATICAL RIGHT ANGLE BRACKET
+27EA;OP # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB;CL # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC;OP # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED;CL # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE;OP # MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF;CL # MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0;AL # UPWARDS QUADRUPLE ARROW
+27F1;AL # DOWNWARDS QUADRUPLE ARROW
+27F2;AL # ANTICLOCKWISE GAPPED CIRCLE ARROW
+27F3;AL # CLOCKWISE GAPPED CIRCLE ARROW
+27F4;AL # RIGHT ARROW WITH CIRCLED PLUS
+27F5;AL # LONG LEFTWARDS ARROW
+27F6;AL # LONG RIGHTWARDS ARROW
+27F7;AL # LONG LEFT RIGHT ARROW
+27F8;AL # LONG LEFTWARDS DOUBLE ARROW
+27F9;AL # LONG RIGHTWARDS DOUBLE ARROW
+27FA;AL # LONG LEFT RIGHT DOUBLE ARROW
+27FB;AL # LONG LEFTWARDS ARROW FROM BAR
+27FC;AL # LONG RIGHTWARDS ARROW FROM BAR
+27FD;AL # LONG LEFTWARDS DOUBLE ARROW FROM BAR
+27FE;AL # LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+27FF;AL # LONG RIGHTWARDS SQUIGGLE ARROW
+2800;AL # BRAILLE PATTERN BLANK
+2801;AL # BRAILLE PATTERN DOTS-1
+2802;AL # BRAILLE PATTERN DOTS-2
+2803;AL # BRAILLE PATTERN DOTS-12
+2804;AL # BRAILLE PATTERN DOTS-3
+2805;AL # BRAILLE PATTERN DOTS-13
+2806;AL # BRAILLE PATTERN DOTS-23
+2807;AL # BRAILLE PATTERN DOTS-123
+2808;AL # BRAILLE PATTERN DOTS-4
+2809;AL # BRAILLE PATTERN DOTS-14
+280A;AL # BRAILLE PATTERN DOTS-24
+280B;AL # BRAILLE PATTERN DOTS-124
+280C;AL # BRAILLE PATTERN DOTS-34
+280D;AL # BRAILLE PATTERN DOTS-134
+280E;AL # BRAILLE PATTERN DOTS-234
+280F;AL # BRAILLE PATTERN DOTS-1234
+2810;AL # BRAILLE PATTERN DOTS-5
+2811;AL # BRAILLE PATTERN DOTS-15
+2812;AL # BRAILLE PATTERN DOTS-25
+2813;AL # BRAILLE PATTERN DOTS-125
+2814;AL # BRAILLE PATTERN DOTS-35
+2815;AL # BRAILLE PATTERN DOTS-135
+2816;AL # BRAILLE PATTERN DOTS-235
+2817;AL # BRAILLE PATTERN DOTS-1235
+2818;AL # BRAILLE PATTERN DOTS-45
+2819;AL # BRAILLE PATTERN DOTS-145
+281A;AL # BRAILLE PATTERN DOTS-245
+281B;AL # BRAILLE PATTERN DOTS-1245
+281C;AL # BRAILLE PATTERN DOTS-345
+281D;AL # BRAILLE PATTERN DOTS-1345
+281E;AL # BRAILLE PATTERN DOTS-2345
+281F;AL # BRAILLE PATTERN DOTS-12345
+2820;AL # BRAILLE PATTERN DOTS-6
+2821;AL # BRAILLE PATTERN DOTS-16
+2822;AL # BRAILLE PATTERN DOTS-26
+2823;AL # BRAILLE PATTERN DOTS-126
+2824;AL # BRAILLE PATTERN DOTS-36
+2825;AL # BRAILLE PATTERN DOTS-136
+2826;AL # BRAILLE PATTERN DOTS-236
+2827;AL # BRAILLE PATTERN DOTS-1236
+2828;AL # BRAILLE PATTERN DOTS-46
+2829;AL # BRAILLE PATTERN DOTS-146
+282A;AL # BRAILLE PATTERN DOTS-246
+282B;AL # BRAILLE PATTERN DOTS-1246
+282C;AL # BRAILLE PATTERN DOTS-346
+282D;AL # BRAILLE PATTERN DOTS-1346
+282E;AL # BRAILLE PATTERN DOTS-2346
+282F;AL # BRAILLE PATTERN DOTS-12346
+2830;AL # BRAILLE PATTERN DOTS-56
+2831;AL # BRAILLE PATTERN DOTS-156
+2832;AL # BRAILLE PATTERN DOTS-256
+2833;AL # BRAILLE PATTERN DOTS-1256
+2834;AL # BRAILLE PATTERN DOTS-356
+2835;AL # BRAILLE PATTERN DOTS-1356
+2836;AL # BRAILLE PATTERN DOTS-2356
+2837;AL # BRAILLE PATTERN DOTS-12356
+2838;AL # BRAILLE PATTERN DOTS-456
+2839;AL # BRAILLE PATTERN DOTS-1456
+283A;AL # BRAILLE PATTERN DOTS-2456
+283B;AL # BRAILLE PATTERN DOTS-12456
+283C;AL # BRAILLE PATTERN DOTS-3456
+283D;AL # BRAILLE PATTERN DOTS-13456
+283E;AL # BRAILLE PATTERN DOTS-23456
+283F;AL # BRAILLE PATTERN DOTS-123456
+2840;AL # BRAILLE PATTERN DOTS-7
+2841;AL # BRAILLE PATTERN DOTS-17
+2842;AL # BRAILLE PATTERN DOTS-27
+2843;AL # BRAILLE PATTERN DOTS-127
+2844;AL # BRAILLE PATTERN DOTS-37
+2845;AL # BRAILLE PATTERN DOTS-137
+2846;AL # BRAILLE PATTERN DOTS-237
+2847;AL # BRAILLE PATTERN DOTS-1237
+2848;AL # BRAILLE PATTERN DOTS-47
+2849;AL # BRAILLE PATTERN DOTS-147
+284A;AL # BRAILLE PATTERN DOTS-247
+284B;AL # BRAILLE PATTERN DOTS-1247
+284C;AL # BRAILLE PATTERN DOTS-347
+284D;AL # BRAILLE PATTERN DOTS-1347
+284E;AL # BRAILLE PATTERN DOTS-2347
+284F;AL # BRAILLE PATTERN DOTS-12347
+2850;AL # BRAILLE PATTERN DOTS-57
+2851;AL # BRAILLE PATTERN DOTS-157
+2852;AL # BRAILLE PATTERN DOTS-257
+2853;AL # BRAILLE PATTERN DOTS-1257
+2854;AL # BRAILLE PATTERN DOTS-357
+2855;AL # BRAILLE PATTERN DOTS-1357
+2856;AL # BRAILLE PATTERN DOTS-2357
+2857;AL # BRAILLE PATTERN DOTS-12357
+2858;AL # BRAILLE PATTERN DOTS-457
+2859;AL # BRAILLE PATTERN DOTS-1457
+285A;AL # BRAILLE PATTERN DOTS-2457
+285B;AL # BRAILLE PATTERN DOTS-12457
+285C;AL # BRAILLE PATTERN DOTS-3457
+285D;AL # BRAILLE PATTERN DOTS-13457
+285E;AL # BRAILLE PATTERN DOTS-23457
+285F;AL # BRAILLE PATTERN DOTS-123457
+2860;AL # BRAILLE PATTERN DOTS-67
+2861;AL # BRAILLE PATTERN DOTS-167
+2862;AL # BRAILLE PATTERN DOTS-267
+2863;AL # BRAILLE PATTERN DOTS-1267
+2864;AL # BRAILLE PATTERN DOTS-367
+2865;AL # BRAILLE PATTERN DOTS-1367
+2866;AL # BRAILLE PATTERN DOTS-2367
+2867;AL # BRAILLE PATTERN DOTS-12367
+2868;AL # BRAILLE PATTERN DOTS-467
+2869;AL # BRAILLE PATTERN DOTS-1467
+286A;AL # BRAILLE PATTERN DOTS-2467
+286B;AL # BRAILLE PATTERN DOTS-12467
+286C;AL # BRAILLE PATTERN DOTS-3467
+286D;AL # BRAILLE PATTERN DOTS-13467
+286E;AL # BRAILLE PATTERN DOTS-23467
+286F;AL # BRAILLE PATTERN DOTS-123467
+2870;AL # BRAILLE PATTERN DOTS-567
+2871;AL # BRAILLE PATTERN DOTS-1567
+2872;AL # BRAILLE PATTERN DOTS-2567
+2873;AL # BRAILLE PATTERN DOTS-12567
+2874;AL # BRAILLE PATTERN DOTS-3567
+2875;AL # BRAILLE PATTERN DOTS-13567
+2876;AL # BRAILLE PATTERN DOTS-23567
+2877;AL # BRAILLE PATTERN DOTS-123567
+2878;AL # BRAILLE PATTERN DOTS-4567
+2879;AL # BRAILLE PATTERN DOTS-14567
+287A;AL # BRAILLE PATTERN DOTS-24567
+287B;AL # BRAILLE PATTERN DOTS-124567
+287C;AL # BRAILLE PATTERN DOTS-34567
+287D;AL # BRAILLE PATTERN DOTS-134567
+287E;AL # BRAILLE PATTERN DOTS-234567
+287F;AL # BRAILLE PATTERN DOTS-1234567
+2880;AL # BRAILLE PATTERN DOTS-8
+2881;AL # BRAILLE PATTERN DOTS-18
+2882;AL # BRAILLE PATTERN DOTS-28
+2883;AL # BRAILLE PATTERN DOTS-128
+2884;AL # BRAILLE PATTERN DOTS-38
+2885;AL # BRAILLE PATTERN DOTS-138
+2886;AL # BRAILLE PATTERN DOTS-238
+2887;AL # BRAILLE PATTERN DOTS-1238
+2888;AL # BRAILLE PATTERN DOTS-48
+2889;AL # BRAILLE PATTERN DOTS-148
+288A;AL # BRAILLE PATTERN DOTS-248
+288B;AL # BRAILLE PATTERN DOTS-1248
+288C;AL # BRAILLE PATTERN DOTS-348
+288D;AL # BRAILLE PATTERN DOTS-1348
+288E;AL # BRAILLE PATTERN DOTS-2348
+288F;AL # BRAILLE PATTERN DOTS-12348
+2890;AL # BRAILLE PATTERN DOTS-58
+2891;AL # BRAILLE PATTERN DOTS-158
+2892;AL # BRAILLE PATTERN DOTS-258
+2893;AL # BRAILLE PATTERN DOTS-1258
+2894;AL # BRAILLE PATTERN DOTS-358
+2895;AL # BRAILLE PATTERN DOTS-1358
+2896;AL # BRAILLE PATTERN DOTS-2358
+2897;AL # BRAILLE PATTERN DOTS-12358
+2898;AL # BRAILLE PATTERN DOTS-458
+2899;AL # BRAILLE PATTERN DOTS-1458
+289A;AL # BRAILLE PATTERN DOTS-2458
+289B;AL # BRAILLE PATTERN DOTS-12458
+289C;AL # BRAILLE PATTERN DOTS-3458
+289D;AL # BRAILLE PATTERN DOTS-13458
+289E;AL # BRAILLE PATTERN DOTS-23458
+289F;AL # BRAILLE PATTERN DOTS-123458
+28A0;AL # BRAILLE PATTERN DOTS-68
+28A1;AL # BRAILLE PATTERN DOTS-168
+28A2;AL # BRAILLE PATTERN DOTS-268
+28A3;AL # BRAILLE PATTERN DOTS-1268
+28A4;AL # BRAILLE PATTERN DOTS-368
+28A5;AL # BRAILLE PATTERN DOTS-1368
+28A6;AL # BRAILLE PATTERN DOTS-2368
+28A7;AL # BRAILLE PATTERN DOTS-12368
+28A8;AL # BRAILLE PATTERN DOTS-468
+28A9;AL # BRAILLE PATTERN DOTS-1468
+28AA;AL # BRAILLE PATTERN DOTS-2468
+28AB;AL # BRAILLE PATTERN DOTS-12468
+28AC;AL # BRAILLE PATTERN DOTS-3468
+28AD;AL # BRAILLE PATTERN DOTS-13468
+28AE;AL # BRAILLE PATTERN DOTS-23468
+28AF;AL # BRAILLE PATTERN DOTS-123468
+28B0;AL # BRAILLE PATTERN DOTS-568
+28B1;AL # BRAILLE PATTERN DOTS-1568
+28B2;AL # BRAILLE PATTERN DOTS-2568
+28B3;AL # BRAILLE PATTERN DOTS-12568
+28B4;AL # BRAILLE PATTERN DOTS-3568
+28B5;AL # BRAILLE PATTERN DOTS-13568
+28B6;AL # BRAILLE PATTERN DOTS-23568
+28B7;AL # BRAILLE PATTERN DOTS-123568
+28B8;AL # BRAILLE PATTERN DOTS-4568
+28B9;AL # BRAILLE PATTERN DOTS-14568
+28BA;AL # BRAILLE PATTERN DOTS-24568
+28BB;AL # BRAILLE PATTERN DOTS-124568
+28BC;AL # BRAILLE PATTERN DOTS-34568
+28BD;AL # BRAILLE PATTERN DOTS-134568
+28BE;AL # BRAILLE PATTERN DOTS-234568
+28BF;AL # BRAILLE PATTERN DOTS-1234568
+28C0;AL # BRAILLE PATTERN DOTS-78
+28C1;AL # BRAILLE PATTERN DOTS-178
+28C2;AL # BRAILLE PATTERN DOTS-278
+28C3;AL # BRAILLE PATTERN DOTS-1278
+28C4;AL # BRAILLE PATTERN DOTS-378
+28C5;AL # BRAILLE PATTERN DOTS-1378
+28C6;AL # BRAILLE PATTERN DOTS-2378
+28C7;AL # BRAILLE PATTERN DOTS-12378
+28C8;AL # BRAILLE PATTERN DOTS-478
+28C9;AL # BRAILLE PATTERN DOTS-1478
+28CA;AL # BRAILLE PATTERN DOTS-2478
+28CB;AL # BRAILLE PATTERN DOTS-12478
+28CC;AL # BRAILLE PATTERN DOTS-3478
+28CD;AL # BRAILLE PATTERN DOTS-13478
+28CE;AL # BRAILLE PATTERN DOTS-23478
+28CF;AL # BRAILLE PATTERN DOTS-123478
+28D0;AL # BRAILLE PATTERN DOTS-578
+28D1;AL # BRAILLE PATTERN DOTS-1578
+28D2;AL # BRAILLE PATTERN DOTS-2578
+28D3;AL # BRAILLE PATTERN DOTS-12578
+28D4;AL # BRAILLE PATTERN DOTS-3578
+28D5;AL # BRAILLE PATTERN DOTS-13578
+28D6;AL # BRAILLE PATTERN DOTS-23578
+28D7;AL # BRAILLE PATTERN DOTS-123578
+28D8;AL # BRAILLE PATTERN DOTS-4578
+28D9;AL # BRAILLE PATTERN DOTS-14578
+28DA;AL # BRAILLE PATTERN DOTS-24578
+28DB;AL # BRAILLE PATTERN DOTS-124578
+28DC;AL # BRAILLE PATTERN DOTS-34578
+28DD;AL # BRAILLE PATTERN DOTS-134578
+28DE;AL # BRAILLE PATTERN DOTS-234578
+28DF;AL # BRAILLE PATTERN DOTS-1234578
+28E0;AL # BRAILLE PATTERN DOTS-678
+28E1;AL # BRAILLE PATTERN DOTS-1678
+28E2;AL # BRAILLE PATTERN DOTS-2678
+28E3;AL # BRAILLE PATTERN DOTS-12678
+28E4;AL # BRAILLE PATTERN DOTS-3678
+28E5;AL # BRAILLE PATTERN DOTS-13678
+28E6;AL # BRAILLE PATTERN DOTS-23678
+28E7;AL # BRAILLE PATTERN DOTS-123678
+28E8;AL # BRAILLE PATTERN DOTS-4678
+28E9;AL # BRAILLE PATTERN DOTS-14678
+28EA;AL # BRAILLE PATTERN DOTS-24678
+28EB;AL # BRAILLE PATTERN DOTS-124678
+28EC;AL # BRAILLE PATTERN DOTS-34678
+28ED;AL # BRAILLE PATTERN DOTS-134678
+28EE;AL # BRAILLE PATTERN DOTS-234678
+28EF;AL # BRAILLE PATTERN DOTS-1234678
+28F0;AL # BRAILLE PATTERN DOTS-5678
+28F1;AL # BRAILLE PATTERN DOTS-15678
+28F2;AL # BRAILLE PATTERN DOTS-25678
+28F3;AL # BRAILLE PATTERN DOTS-125678
+28F4;AL # BRAILLE PATTERN DOTS-35678
+28F5;AL # BRAILLE PATTERN DOTS-135678
+28F6;AL # BRAILLE PATTERN DOTS-235678
+28F7;AL # BRAILLE PATTERN DOTS-1235678
+28F8;AL # BRAILLE PATTERN DOTS-45678
+28F9;AL # BRAILLE PATTERN DOTS-145678
+28FA;AL # BRAILLE PATTERN DOTS-245678
+28FB;AL # BRAILLE PATTERN DOTS-1245678
+28FC;AL # BRAILLE PATTERN DOTS-345678
+28FD;AL # BRAILLE PATTERN DOTS-1345678
+28FE;AL # BRAILLE PATTERN DOTS-2345678
+28FF;AL # BRAILLE PATTERN DOTS-12345678
+2900;AL # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2901;AL # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2902;AL # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2903;AL # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2904;AL # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+2905;AL # RIGHTWARDS TWO-HEADED ARROW FROM BAR
+2906;AL # LEFTWARDS DOUBLE ARROW FROM BAR
+2907;AL # RIGHTWARDS DOUBLE ARROW FROM BAR
+2908;AL # DOWNWARDS ARROW WITH HORIZONTAL STROKE
+2909;AL # UPWARDS ARROW WITH HORIZONTAL STROKE
+290A;AL # UPWARDS TRIPLE ARROW
+290B;AL # DOWNWARDS TRIPLE ARROW
+290C;AL # LEFTWARDS DOUBLE DASH ARROW
+290D;AL # RIGHTWARDS DOUBLE DASH ARROW
+290E;AL # LEFTWARDS TRIPLE DASH ARROW
+290F;AL # RIGHTWARDS TRIPLE DASH ARROW
+2910;AL # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+2911;AL # RIGHTWARDS ARROW WITH DOTTED STEM
+2912;AL # UPWARDS ARROW TO BAR
+2913;AL # DOWNWARDS ARROW TO BAR
+2914;AL # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2915;AL # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2916;AL # RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+2917;AL # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2918;AL # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2919;AL # LEFTWARDS ARROW-TAIL
+291A;AL # RIGHTWARDS ARROW-TAIL
+291B;AL # LEFTWARDS DOUBLE ARROW-TAIL
+291C;AL # RIGHTWARDS DOUBLE ARROW-TAIL
+291D;AL # LEFTWARDS ARROW TO BLACK DIAMOND
+291E;AL # RIGHTWARDS ARROW TO BLACK DIAMOND
+291F;AL # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2920;AL # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2921;AL # NORTH WEST AND SOUTH EAST ARROW
+2922;AL # NORTH EAST AND SOUTH WEST ARROW
+2923;AL # NORTH WEST ARROW WITH HOOK
+2924;AL # NORTH EAST ARROW WITH HOOK
+2925;AL # SOUTH EAST ARROW WITH HOOK
+2926;AL # SOUTH WEST ARROW WITH HOOK
+2927;AL # NORTH WEST ARROW AND NORTH EAST ARROW
+2928;AL # NORTH EAST ARROW AND SOUTH EAST ARROW
+2929;AL # SOUTH EAST ARROW AND SOUTH WEST ARROW
+292A;AL # SOUTH WEST ARROW AND NORTH WEST ARROW
+292B;AL # RISING DIAGONAL CROSSING FALLING DIAGONAL
+292C;AL # FALLING DIAGONAL CROSSING RISING DIAGONAL
+292D;AL # SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+292E;AL # NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+292F;AL # FALLING DIAGONAL CROSSING NORTH EAST ARROW
+2930;AL # RISING DIAGONAL CROSSING SOUTH EAST ARROW
+2931;AL # NORTH EAST ARROW CROSSING NORTH WEST ARROW
+2932;AL # NORTH WEST ARROW CROSSING NORTH EAST ARROW
+2933;AL # WAVE ARROW POINTING DIRECTLY RIGHT
+2934;AL # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+2935;AL # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+2936;AL # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+2937;AL # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+2938;AL # RIGHT-SIDE ARC CLOCKWISE ARROW
+2939;AL # LEFT-SIDE ARC ANTICLOCKWISE ARROW
+293A;AL # TOP ARC ANTICLOCKWISE ARROW
+293B;AL # BOTTOM ARC ANTICLOCKWISE ARROW
+293C;AL # TOP ARC CLOCKWISE ARROW WITH MINUS
+293D;AL # TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+293E;AL # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
+293F;AL # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
+2940;AL # ANTICLOCKWISE CLOSED CIRCLE ARROW
+2941;AL # CLOCKWISE CLOSED CIRCLE ARROW
+2942;AL # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+2943;AL # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+2944;AL # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+2945;AL # RIGHTWARDS ARROW WITH PLUS BELOW
+2946;AL # LEFTWARDS ARROW WITH PLUS BELOW
+2947;AL # RIGHTWARDS ARROW THROUGH X
+2948;AL # LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+2949;AL # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+294A;AL # LEFT BARB UP RIGHT BARB DOWN HARPOON
+294B;AL # LEFT BARB DOWN RIGHT BARB UP HARPOON
+294C;AL # UP BARB RIGHT DOWN BARB LEFT HARPOON
+294D;AL # UP BARB LEFT DOWN BARB RIGHT HARPOON
+294E;AL # LEFT BARB UP RIGHT BARB UP HARPOON
+294F;AL # UP BARB RIGHT DOWN BARB RIGHT HARPOON
+2950;AL # LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+2951;AL # UP BARB LEFT DOWN BARB LEFT HARPOON
+2952;AL # LEFTWARDS HARPOON WITH BARB UP TO BAR
+2953;AL # RIGHTWARDS HARPOON WITH BARB UP TO BAR
+2954;AL # UPWARDS HARPOON WITH BARB RIGHT TO BAR
+2955;AL # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+2956;AL # LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+2957;AL # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+2958;AL # UPWARDS HARPOON WITH BARB LEFT TO BAR
+2959;AL # DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+295A;AL # LEFTWARDS HARPOON WITH BARB UP FROM BAR
+295B;AL # RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+295C;AL # UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+295D;AL # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+295E;AL # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+295F;AL # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+2960;AL # UPWARDS HARPOON WITH BARB LEFT FROM BAR
+2961;AL # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+2962;AL # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+2963;AL # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2964;AL # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2965;AL # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+2966;AL # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+2967;AL # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2968;AL # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+2969;AL # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+296A;AL # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296B;AL # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296C;AL # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296D;AL # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296E;AL # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+296F;AL # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2970;AL # RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+2971;AL # EQUALS SIGN ABOVE RIGHTWARDS ARROW
+2972;AL # TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2973;AL # LEFTWARDS ARROW ABOVE TILDE OPERATOR
+2974;AL # RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+2975;AL # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+2976;AL # LESS-THAN ABOVE LEFTWARDS ARROW
+2977;AL # LEFTWARDS ARROW THROUGH LESS-THAN
+2978;AL # GREATER-THAN ABOVE RIGHTWARDS ARROW
+2979;AL # SUBSET ABOVE RIGHTWARDS ARROW
+297A;AL # LEFTWARDS ARROW THROUGH SUBSET
+297B;AL # SUPERSET ABOVE LEFTWARDS ARROW
+297C;AL # LEFT FISH TAIL
+297D;AL # RIGHT FISH TAIL
+297E;AL # UP FISH TAIL
+297F;AL # DOWN FISH TAIL
+2980;AL # TRIPLE VERTICAL BAR DELIMITER
+2981;AL # Z NOTATION SPOT
+2982;AL # Z NOTATION TYPE COLON
+2983;OP # LEFT WHITE CURLY BRACKET
+2984;CL # RIGHT WHITE CURLY BRACKET
+2985;OP # LEFT WHITE PARENTHESIS
+2986;CL # RIGHT WHITE PARENTHESIS
+2987;OP # Z NOTATION LEFT IMAGE BRACKET
+2988;CL # Z NOTATION RIGHT IMAGE BRACKET
+2989;OP # Z NOTATION LEFT BINDING BRACKET
+298A;CL # Z NOTATION RIGHT BINDING BRACKET
+298B;OP # LEFT SQUARE BRACKET WITH UNDERBAR
+298C;CL # RIGHT SQUARE BRACKET WITH UNDERBAR
+298D;OP # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E;CL # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F;OP # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990;CL # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991;OP # LEFT ANGLE BRACKET WITH DOT
+2992;CL # RIGHT ANGLE BRACKET WITH DOT
+2993;OP # LEFT ARC LESS-THAN BRACKET
+2994;CL # RIGHT ARC GREATER-THAN BRACKET
+2995;OP # DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996;CL # DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997;OP # LEFT BLACK TORTOISE SHELL BRACKET
+2998;CL # RIGHT BLACK TORTOISE SHELL BRACKET
+2999;AL # DOTTED FENCE
+299A;AL # VERTICAL ZIGZAG LINE
+299B;AL # MEASURED ANGLE OPENING LEFT
+299C;AL # RIGHT ANGLE VARIANT WITH SQUARE
+299D;AL # MEASURED RIGHT ANGLE WITH DOT
+299E;AL # ANGLE WITH S INSIDE
+299F;AL # ACUTE ANGLE
+29A0;AL # SPHERICAL ANGLE OPENING LEFT
+29A1;AL # SPHERICAL ANGLE OPENING UP
+29A2;AL # TURNED ANGLE
+29A3;AL # REVERSED ANGLE
+29A4;AL # ANGLE WITH UNDERBAR
+29A5;AL # REVERSED ANGLE WITH UNDERBAR
+29A6;AL # OBLIQUE ANGLE OPENING UP
+29A7;AL # OBLIQUE ANGLE OPENING DOWN
+29A8;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+29A9;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+29AA;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+29AB;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+29AC;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+29AD;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+29AE;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+29AF;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+29B0;AL # REVERSED EMPTY SET
+29B1;AL # EMPTY SET WITH OVERBAR
+29B2;AL # EMPTY SET WITH SMALL CIRCLE ABOVE
+29B3;AL # EMPTY SET WITH RIGHT ARROW ABOVE
+29B4;AL # EMPTY SET WITH LEFT ARROW ABOVE
+29B5;AL # CIRCLE WITH HORIZONTAL BAR
+29B6;AL # CIRCLED VERTICAL BAR
+29B7;AL # CIRCLED PARALLEL
+29B8;AL # CIRCLED REVERSE SOLIDUS
+29B9;AL # CIRCLED PERPENDICULAR
+29BA;AL # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
+29BB;AL # CIRCLE WITH SUPERIMPOSED X
+29BC;AL # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+29BD;AL # UP ARROW THROUGH CIRCLE
+29BE;AL # CIRCLED WHITE BULLET
+29BF;AL # CIRCLED BULLET
+29C0;AL # CIRCLED LESS-THAN
+29C1;AL # CIRCLED GREATER-THAN
+29C2;AL # CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+29C3;AL # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+29C4;AL # SQUARED RISING DIAGONAL SLASH
+29C5;AL # SQUARED FALLING DIAGONAL SLASH
+29C6;AL # SQUARED ASTERISK
+29C7;AL # SQUARED SMALL CIRCLE
+29C8;AL # SQUARED SQUARE
+29C9;AL # TWO JOINED SQUARES
+29CA;AL # TRIANGLE WITH DOT ABOVE
+29CB;AL # TRIANGLE WITH UNDERBAR
+29CC;AL # S IN TRIANGLE
+29CD;AL # TRIANGLE WITH SERIFS AT BOTTOM
+29CE;AL # RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+29CF;AL # LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0;AL # VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1;AL # BOWTIE WITH LEFT HALF BLACK
+29D2;AL # BOWTIE WITH RIGHT HALF BLACK
+29D3;AL # BLACK BOWTIE
+29D4;AL # TIMES WITH LEFT HALF BLACK
+29D5;AL # TIMES WITH RIGHT HALF BLACK
+29D6;AL # WHITE HOURGLASS
+29D7;AL # BLACK HOURGLASS
+29D8;OP # LEFT WIGGLY FENCE
+29D9;CL # RIGHT WIGGLY FENCE
+29DA;OP # LEFT DOUBLE WIGGLY FENCE
+29DB;CL # RIGHT DOUBLE WIGGLY FENCE
+29DC;AL # INCOMPLETE INFINITY
+29DD;AL # TIE OVER INFINITY
+29DE;AL # INFINITY NEGATED WITH VERTICAL BAR
+29DF;AL # DOUBLE-ENDED MULTIMAP
+29E0;AL # SQUARE WITH CONTOURED OUTLINE
+29E1;AL # INCREASES AS
+29E2;AL # SHUFFLE PRODUCT
+29E3;AL # EQUALS SIGN AND SLANTED PARALLEL
+29E4;AL # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+29E5;AL # IDENTICAL TO AND SLANTED PARALLEL
+29E6;AL # GLEICH STARK
+29E7;AL # THERMODYNAMIC
+29E8;AL # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+29E9;AL # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+29EA;AL # BLACK DIAMOND WITH DOWN ARROW
+29EB;AL # BLACK LOZENGE
+29EC;AL # WHITE CIRCLE WITH DOWN ARROW
+29ED;AL # BLACK CIRCLE WITH DOWN ARROW
+29EE;AL # ERROR-BARRED WHITE SQUARE
+29EF;AL # ERROR-BARRED BLACK SQUARE
+29F0;AL # ERROR-BARRED WHITE DIAMOND
+29F1;AL # ERROR-BARRED BLACK DIAMOND
+29F2;AL # ERROR-BARRED WHITE CIRCLE
+29F3;AL # ERROR-BARRED BLACK CIRCLE
+29F4;AL # RULE-DELAYED
+29F5;AL # REVERSE SOLIDUS OPERATOR
+29F6;AL # SOLIDUS WITH OVERBAR
+29F7;AL # REVERSE SOLIDUS WITH HORIZONTAL STROKE
+29F8;AL # BIG SOLIDUS
+29F9;AL # BIG REVERSE SOLIDUS
+29FA;AL # DOUBLE PLUS
+29FB;AL # TRIPLE PLUS
+29FC;OP # LEFT-POINTING CURVED ANGLE BRACKET
+29FD;CL # RIGHT-POINTING CURVED ANGLE BRACKET
+29FE;AL # TINY
+29FF;AL # MINY
+2A00;AL # N-ARY CIRCLED DOT OPERATOR
+2A01;AL # N-ARY CIRCLED PLUS OPERATOR
+2A02;AL # N-ARY CIRCLED TIMES OPERATOR
+2A03;AL # N-ARY UNION OPERATOR WITH DOT
+2A04;AL # N-ARY UNION OPERATOR WITH PLUS
+2A05;AL # N-ARY SQUARE INTERSECTION OPERATOR
+2A06;AL # N-ARY SQUARE UNION OPERATOR
+2A07;AL # TWO LOGICAL AND OPERATOR
+2A08;AL # TWO LOGICAL OR OPERATOR
+2A09;AL # N-ARY TIMES OPERATOR
+2A0A;AL # MODULO TWO SUM
+2A0B;AL # SUMMATION WITH INTEGRAL
+2A0C;AL # QUADRUPLE INTEGRAL OPERATOR
+2A0D;AL # FINITE PART INTEGRAL
+2A0E;AL # INTEGRAL WITH DOUBLE STROKE
+2A0F;AL # INTEGRAL AVERAGE WITH SLASH
+2A10;AL # CIRCULATION FUNCTION
+2A11;AL # ANTICLOCKWISE INTEGRATION
+2A12;AL # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+2A13;AL # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+2A14;AL # LINE INTEGRATION NOT INCLUDING THE POLE
+2A15;AL # INTEGRAL AROUND A POINT OPERATOR
+2A16;AL # QUATERNION INTEGRAL OPERATOR
+2A17;AL # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+2A18;AL # INTEGRAL WITH TIMES SIGN
+2A19;AL # INTEGRAL WITH INTERSECTION
+2A1A;AL # INTEGRAL WITH UNION
+2A1B;AL # INTEGRAL WITH OVERBAR
+2A1C;AL # INTEGRAL WITH UNDERBAR
+2A1D;AL # JOIN
+2A1E;AL # LARGE LEFT TRIANGLE OPERATOR
+2A1F;AL # Z NOTATION SCHEMA COMPOSITION
+2A20;AL # Z NOTATION SCHEMA PIPING
+2A21;AL # Z NOTATION SCHEMA PROJECTION
+2A22;AL # PLUS SIGN WITH SMALL CIRCLE ABOVE
+2A23;AL # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+2A24;AL # PLUS SIGN WITH TILDE ABOVE
+2A25;AL # PLUS SIGN WITH DOT BELOW
+2A26;AL # PLUS SIGN WITH TILDE BELOW
+2A27;AL # PLUS SIGN WITH SUBSCRIPT TWO
+2A28;AL # PLUS SIGN WITH BLACK TRIANGLE
+2A29;AL # MINUS SIGN WITH COMMA ABOVE
+2A2A;AL # MINUS SIGN WITH DOT BELOW
+2A2B;AL # MINUS SIGN WITH FALLING DOTS
+2A2C;AL # MINUS SIGN WITH RISING DOTS
+2A2D;AL # PLUS SIGN IN LEFT HALF CIRCLE
+2A2E;AL # PLUS SIGN IN RIGHT HALF CIRCLE
+2A2F;AL # VECTOR OR CROSS PRODUCT
+2A30;AL # MULTIPLICATION SIGN WITH DOT ABOVE
+2A31;AL # MULTIPLICATION SIGN WITH UNDERBAR
+2A32;AL # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+2A33;AL # SMASH PRODUCT
+2A34;AL # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35;AL # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A36;AL # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+2A37;AL # MULTIPLICATION SIGN IN DOUBLE CIRCLE
+2A38;AL # CIRCLED DIVISION SIGN
+2A39;AL # PLUS SIGN IN TRIANGLE
+2A3A;AL # MINUS SIGN IN TRIANGLE
+2A3B;AL # MULTIPLICATION SIGN IN TRIANGLE
+2A3C;AL # INTERIOR PRODUCT
+2A3D;AL # RIGHTHAND INTERIOR PRODUCT
+2A3E;AL # Z NOTATION RELATIONAL COMPOSITION
+2A3F;AL # AMALGAMATION OR COPRODUCT
+2A40;AL # INTERSECTION WITH DOT
+2A41;AL # UNION WITH MINUS SIGN
+2A42;AL # UNION WITH OVERBAR
+2A43;AL # INTERSECTION WITH OVERBAR
+2A44;AL # INTERSECTION WITH LOGICAL AND
+2A45;AL # UNION WITH LOGICAL OR
+2A46;AL # UNION ABOVE INTERSECTION
+2A47;AL # INTERSECTION ABOVE UNION
+2A48;AL # UNION ABOVE BAR ABOVE INTERSECTION
+2A49;AL # INTERSECTION ABOVE BAR ABOVE UNION
+2A4A;AL # UNION BESIDE AND JOINED WITH UNION
+2A4B;AL # INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+2A4C;AL # CLOSED UNION WITH SERIFS
+2A4D;AL # CLOSED INTERSECTION WITH SERIFS
+2A4E;AL # DOUBLE SQUARE INTERSECTION
+2A4F;AL # DOUBLE SQUARE UNION
+2A50;AL # CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+2A51;AL # LOGICAL AND WITH DOT ABOVE
+2A52;AL # LOGICAL OR WITH DOT ABOVE
+2A53;AL # DOUBLE LOGICAL AND
+2A54;AL # DOUBLE LOGICAL OR
+2A55;AL # TWO INTERSECTING LOGICAL AND
+2A56;AL # TWO INTERSECTING LOGICAL OR
+2A57;AL # SLOPING LARGE OR
+2A58;AL # SLOPING LARGE AND
+2A59;AL # LOGICAL OR OVERLAPPING LOGICAL AND
+2A5A;AL # LOGICAL AND WITH MIDDLE STEM
+2A5B;AL # LOGICAL OR WITH MIDDLE STEM
+2A5C;AL # LOGICAL AND WITH HORIZONTAL DASH
+2A5D;AL # LOGICAL OR WITH HORIZONTAL DASH
+2A5E;AL # LOGICAL AND WITH DOUBLE OVERBAR
+2A5F;AL # LOGICAL AND WITH UNDERBAR
+2A60;AL # LOGICAL AND WITH DOUBLE UNDERBAR
+2A61;AL # SMALL VEE WITH UNDERBAR
+2A62;AL # LOGICAL OR WITH DOUBLE OVERBAR
+2A63;AL # LOGICAL OR WITH DOUBLE UNDERBAR
+2A64;AL # Z NOTATION DOMAIN ANTIRESTRICTION
+2A65;AL # Z NOTATION RANGE ANTIRESTRICTION
+2A66;AL # EQUALS SIGN WITH DOT BELOW
+2A67;AL # IDENTICAL WITH DOT ABOVE
+2A68;AL # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
+2A69;AL # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
+2A6A;AL # TILDE OPERATOR WITH DOT ABOVE
+2A6B;AL # TILDE OPERATOR WITH RISING DOTS
+2A6C;AL # SIMILAR MINUS SIMILAR
+2A6D;AL # CONGRUENT WITH DOT ABOVE
+2A6E;AL # EQUALS WITH ASTERISK
+2A6F;AL # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+2A70;AL # APPROXIMATELY EQUAL OR EQUAL TO
+2A71;AL # EQUALS SIGN ABOVE PLUS SIGN
+2A72;AL # PLUS SIGN ABOVE EQUALS SIGN
+2A73;AL # EQUALS SIGN ABOVE TILDE OPERATOR
+2A74;AL # DOUBLE COLON EQUAL
+2A75;AL # TWO CONSECUTIVE EQUALS SIGNS
+2A76;AL # THREE CONSECUTIVE EQUALS SIGNS
+2A77;AL # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+2A78;AL # EQUIVALENT WITH FOUR DOTS ABOVE
+2A79;AL # LESS-THAN WITH CIRCLE INSIDE
+2A7A;AL # GREATER-THAN WITH CIRCLE INSIDE
+2A7B;AL # LESS-THAN WITH QUESTION MARK ABOVE
+2A7C;AL # GREATER-THAN WITH QUESTION MARK ABOVE
+2A7D;AL # LESS-THAN OR SLANTED EQUAL TO
+2A7E;AL # GREATER-THAN OR SLANTED EQUAL TO
+2A7F;AL # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80;AL # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81;AL # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82;AL # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83;AL # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84;AL # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A85;AL # LESS-THAN OR APPROXIMATE
+2A86;AL # GREATER-THAN OR APPROXIMATE
+2A87;AL # LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+2A88;AL # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+2A89;AL # LESS-THAN AND NOT APPROXIMATE
+2A8A;AL # GREATER-THAN AND NOT APPROXIMATE
+2A8B;AL # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C;AL # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A8D;AL # LESS-THAN ABOVE SIMILAR OR EQUAL
+2A8E;AL # GREATER-THAN ABOVE SIMILAR OR EQUAL
+2A8F;AL # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+2A90;AL # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+2A91;AL # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92;AL # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93;AL # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94;AL # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95;AL # SLANTED EQUAL TO OR LESS-THAN
+2A96;AL # SLANTED EQUAL TO OR GREATER-THAN
+2A97;AL # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98;AL # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99;AL # DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A;AL # DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B;AL # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C;AL # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2A9D;AL # SIMILAR OR LESS-THAN
+2A9E;AL # SIMILAR OR GREATER-THAN
+2A9F;AL # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+2AA0;AL # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+2AA1;AL # DOUBLE NESTED LESS-THAN
+2AA2;AL # DOUBLE NESTED GREATER-THAN
+2AA3;AL # DOUBLE NESTED LESS-THAN WITH UNDERBAR
+2AA4;AL # GREATER-THAN OVERLAPPING LESS-THAN
+2AA5;AL # GREATER-THAN BESIDE LESS-THAN
+2AA6;AL # LESS-THAN CLOSED BY CURVE
+2AA7;AL # GREATER-THAN CLOSED BY CURVE
+2AA8;AL # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9;AL # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA;AL # SMALLER THAN
+2AAB;AL # LARGER THAN
+2AAC;AL # SMALLER THAN OR EQUAL TO
+2AAD;AL # LARGER THAN OR EQUAL TO
+2AAE;AL # EQUALS SIGN WITH BUMPY ABOVE
+2AAF;AL # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0;AL # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB1;AL # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+2AB2;AL # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+2AB3;AL # PRECEDES ABOVE EQUALS SIGN
+2AB4;AL # SUCCEEDS ABOVE EQUALS SIGN
+2AB5;AL # PRECEDES ABOVE NOT EQUAL TO
+2AB6;AL # SUCCEEDS ABOVE NOT EQUAL TO
+2AB7;AL # PRECEDES ABOVE ALMOST EQUAL TO
+2AB8;AL # SUCCEEDS ABOVE ALMOST EQUAL TO
+2AB9;AL # PRECEDES ABOVE NOT ALMOST EQUAL TO
+2ABA;AL # SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+2ABB;AL # DOUBLE PRECEDES
+2ABC;AL # DOUBLE SUCCEEDS
+2ABD;AL # SUBSET WITH DOT
+2ABE;AL # SUPERSET WITH DOT
+2ABF;AL # SUBSET WITH PLUS SIGN BELOW
+2AC0;AL # SUPERSET WITH PLUS SIGN BELOW
+2AC1;AL # SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2;AL # SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3;AL # SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4;AL # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5;AL # SUBSET OF ABOVE EQUALS SIGN
+2AC6;AL # SUPERSET OF ABOVE EQUALS SIGN
+2AC7;AL # SUBSET OF ABOVE TILDE OPERATOR
+2AC8;AL # SUPERSET OF ABOVE TILDE OPERATOR
+2AC9;AL # SUBSET OF ABOVE ALMOST EQUAL TO
+2ACA;AL # SUPERSET OF ABOVE ALMOST EQUAL TO
+2ACB;AL # SUBSET OF ABOVE NOT EQUAL TO
+2ACC;AL # SUPERSET OF ABOVE NOT EQUAL TO
+2ACD;AL # SQUARE LEFT OPEN BOX OPERATOR
+2ACE;AL # SQUARE RIGHT OPEN BOX OPERATOR
+2ACF;AL # CLOSED SUBSET
+2AD0;AL # CLOSED SUPERSET
+2AD1;AL # CLOSED SUBSET OR EQUAL TO
+2AD2;AL # CLOSED SUPERSET OR EQUAL TO
+2AD3;AL # SUBSET ABOVE SUPERSET
+2AD4;AL # SUPERSET ABOVE SUBSET
+2AD5;AL # SUBSET ABOVE SUBSET
+2AD6;AL # SUPERSET ABOVE SUPERSET
+2AD7;AL # SUPERSET BESIDE SUBSET
+2AD8;AL # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+2AD9;AL # ELEMENT OF OPENING DOWNWARDS
+2ADA;AL # PITCHFORK WITH TEE TOP
+2ADB;AL # TRANSVERSAL INTERSECTION
+2ADC;AL # FORKING
+2ADD;AL # NONFORKING
+2ADE;AL # SHORT LEFT TACK
+2ADF;AL # SHORT DOWN TACK
+2AE0;AL # SHORT UP TACK
+2AE1;AL # PERPENDICULAR WITH S
+2AE2;AL # VERTICAL BAR TRIPLE RIGHT TURNSTILE
+2AE3;AL # DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4;AL # VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5;AL # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE6;AL # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+2AE7;AL # SHORT DOWN TACK WITH OVERBAR
+2AE8;AL # SHORT UP TACK WITH UNDERBAR
+2AE9;AL # SHORT UP TACK ABOVE SHORT DOWN TACK
+2AEA;AL # DOUBLE DOWN TACK
+2AEB;AL # DOUBLE UP TACK
+2AEC;AL # DOUBLE STROKE NOT SIGN
+2AED;AL # REVERSED DOUBLE STROKE NOT SIGN
+2AEE;AL # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+2AEF;AL # VERTICAL LINE WITH CIRCLE ABOVE
+2AF0;AL # VERTICAL LINE WITH CIRCLE BELOW
+2AF1;AL # DOWN TACK WITH CIRCLE BELOW
+2AF2;AL # PARALLEL WITH HORIZONTAL STROKE
+2AF3;AL # PARALLEL WITH TILDE OPERATOR
+2AF4;AL # TRIPLE VERTICAL BAR BINARY RELATION
+2AF5;AL # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
+2AF6;AL # TRIPLE COLON OPERATOR
+2AF7;AL # TRIPLE NESTED LESS-THAN
+2AF8;AL # TRIPLE NESTED GREATER-THAN
+2AF9;AL # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA;AL # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+2AFB;AL # TRIPLE SOLIDUS BINARY RELATION
+2AFC;AL # LARGE TRIPLE VERTICAL BAR OPERATOR
+2AFD;AL # DOUBLE SOLIDUS OPERATOR
+2AFE;AL # WHITE VERTICAL BAR
+2AFF;AL # N-ARY WHITE VERTICAL BAR
+2B00;AL # NORTH EAST WHITE ARROW
+2B01;AL # NORTH WEST WHITE ARROW
+2B02;AL # SOUTH EAST WHITE ARROW
+2B03;AL # SOUTH WEST WHITE ARROW
+2B04;AL # LEFT RIGHT WHITE ARROW
+2B05;AL # LEFTWARDS BLACK ARROW
+2B06;AL # UPWARDS BLACK ARROW
+2B07;AL # DOWNWARDS BLACK ARROW
+2B08;AL # NORTH EAST BLACK ARROW
+2B09;AL # NORTH WEST BLACK ARROW
+2B0A;AL # SOUTH EAST BLACK ARROW
+2B0B;AL # SOUTH WEST BLACK ARROW
+2B0C;AL # LEFT RIGHT BLACK ARROW
+2B0D;AL # UP DOWN BLACK ARROW
+2B0E;AL # RIGHTWARDS ARROW WITH TIP DOWNWARDS
+2B0F;AL # RIGHTWARDS ARROW WITH TIP UPWARDS
+2B10;AL # LEFTWARDS ARROW WITH TIP DOWNWARDS
+2B11;AL # LEFTWARDS ARROW WITH TIP UPWARDS
+2B12;AL # SQUARE WITH TOP HALF BLACK
+2B13;AL # SQUARE WITH BOTTOM HALF BLACK
+2B14;AL # SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK
+2B15;AL # SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK
+2B16;AL # DIAMOND WITH LEFT HALF BLACK
+2B17;AL # DIAMOND WITH RIGHT HALF BLACK
+2B18;AL # DIAMOND WITH TOP HALF BLACK
+2B19;AL # DIAMOND WITH BOTTOM HALF BLACK
+2B1A;AL # DOTTED SQUARE
+2B1B;AL # BLACK LARGE SQUARE
+2B1C;AL # WHITE LARGE SQUARE
+2B1D;AL # BLACK VERY SMALL SQUARE
+2B1E;AL # WHITE VERY SMALL SQUARE
+2B1F;AL # BLACK PENTAGON
+2B20;AL # WHITE PENTAGON
+2B21;AL # WHITE HEXAGON
+2B22;AL # BLACK HEXAGON
+2B23;AL # HORIZONTAL BLACK HEXAGON
+2B24;AL # BLACK LARGE CIRCLE
+2B25;AL # BLACK MEDIUM DIAMOND
+2B26;AL # WHITE MEDIUM DIAMOND
+2B27;AL # BLACK MEDIUM LOZENGE
+2B28;AL # WHITE MEDIUM LOZENGE
+2B29;AL # BLACK SMALL DIAMOND
+2B2A;AL # BLACK SMALL LOZENGE
+2B2B;AL # WHITE SMALL LOZENGE
+2B2C;AL # BLACK HORIZONTAL ELLIPSE
+2B2D;AL # WHITE HORIZONTAL ELLIPSE
+2B2E;AL # BLACK VERTICAL ELLIPSE
+2B2F;AL # WHITE VERTICAL ELLIPSE
+2B30;AL # LEFT ARROW WITH SMALL CIRCLE
+2B31;AL # THREE LEFTWARDS ARROWS
+2B32;AL # LEFT ARROW WITH CIRCLED PLUS
+2B33;AL # LONG LEFTWARDS SQUIGGLE ARROW
+2B34;AL # LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2B35;AL # LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2B36;AL # LEFTWARDS TWO-HEADED ARROW FROM BAR
+2B37;AL # LEFTWARDS TWO-HEADED TRIPLE DASH ARROW
+2B38;AL # LEFTWARDS ARROW WITH DOTTED STEM
+2B39;AL # LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2B3A;AL # LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2B3B;AL # LEFTWARDS TWO-HEADED ARROW WITH TAIL
+2B3C;AL # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2B3D;AL # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2B3E;AL # LEFTWARDS ARROW THROUGH X
+2B3F;AL # WAVE ARROW POINTING DIRECTLY LEFT
+2B40;AL # EQUALS SIGN ABOVE LEFTWARDS ARROW
+2B41;AL # REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW
+2B42;AL # LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
+2B43;AL # RIGHTWARDS ARROW THROUGH GREATER-THAN
+2B44;AL # RIGHTWARDS ARROW THROUGH SUPERSET
+2B45;AL # LEFTWARDS QUADRUPLE ARROW
+2B46;AL # RIGHTWARDS QUADRUPLE ARROW
+2B47;AL # REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2B48;AL # RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
+2B49;AL # TILDE OPERATOR ABOVE LEFTWARDS ARROW
+2B4A;AL # LEFTWARDS ARROW ABOVE ALMOST EQUAL TO
+2B4B;AL # LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B4C;AL # RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B50;AL # WHITE MEDIUM STAR
+2B51;AL # BLACK SMALL STAR
+2B52;AL # WHITE SMALL STAR
+2B53;AL # BLACK RIGHT-POINTING PENTAGON
+2B54;AL # WHITE RIGHT-POINTING PENTAGON
+2C00;AL # GLAGOLITIC CAPITAL LETTER AZU
+2C01;AL # GLAGOLITIC CAPITAL LETTER BUKY
+2C02;AL # GLAGOLITIC CAPITAL LETTER VEDE
+2C03;AL # GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C04;AL # GLAGOLITIC CAPITAL LETTER DOBRO
+2C05;AL # GLAGOLITIC CAPITAL LETTER YESTU
+2C06;AL # GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C07;AL # GLAGOLITIC CAPITAL LETTER DZELO
+2C08;AL # GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C09;AL # GLAGOLITIC CAPITAL LETTER IZHE
+2C0A;AL # GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C0B;AL # GLAGOLITIC CAPITAL LETTER I
+2C0C;AL # GLAGOLITIC CAPITAL LETTER DJERVI
+2C0D;AL # GLAGOLITIC CAPITAL LETTER KAKO
+2C0E;AL # GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C0F;AL # GLAGOLITIC CAPITAL LETTER MYSLITE
+2C10;AL # GLAGOLITIC CAPITAL LETTER NASHI
+2C11;AL # GLAGOLITIC CAPITAL LETTER ONU
+2C12;AL # GLAGOLITIC CAPITAL LETTER POKOJI
+2C13;AL # GLAGOLITIC CAPITAL LETTER RITSI
+2C14;AL # GLAGOLITIC CAPITAL LETTER SLOVO
+2C15;AL # GLAGOLITIC CAPITAL LETTER TVRIDO
+2C16;AL # GLAGOLITIC CAPITAL LETTER UKU
+2C17;AL # GLAGOLITIC CAPITAL LETTER FRITU
+2C18;AL # GLAGOLITIC CAPITAL LETTER HERU
+2C19;AL # GLAGOLITIC CAPITAL LETTER OTU
+2C1A;AL # GLAGOLITIC CAPITAL LETTER PE
+2C1B;AL # GLAGOLITIC CAPITAL LETTER SHTA
+2C1C;AL # GLAGOLITIC CAPITAL LETTER TSI
+2C1D;AL # GLAGOLITIC CAPITAL LETTER CHRIVI
+2C1E;AL # GLAGOLITIC CAPITAL LETTER SHA
+2C1F;AL # GLAGOLITIC CAPITAL LETTER YERU
+2C20;AL # GLAGOLITIC CAPITAL LETTER YERI
+2C21;AL # GLAGOLITIC CAPITAL LETTER YATI
+2C22;AL # GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C23;AL # GLAGOLITIC CAPITAL LETTER YU
+2C24;AL # GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C25;AL # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C26;AL # GLAGOLITIC CAPITAL LETTER YO
+2C27;AL # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C28;AL # GLAGOLITIC CAPITAL LETTER BIG YUS
+2C29;AL # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C2A;AL # GLAGOLITIC CAPITAL LETTER FITA
+2C2B;AL # GLAGOLITIC CAPITAL LETTER IZHITSA
+2C2C;AL # GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C2D;AL # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C2E;AL # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30;AL # GLAGOLITIC SMALL LETTER AZU
+2C31;AL # GLAGOLITIC SMALL LETTER BUKY
+2C32;AL # GLAGOLITIC SMALL LETTER VEDE
+2C33;AL # GLAGOLITIC SMALL LETTER GLAGOLI
+2C34;AL # GLAGOLITIC SMALL LETTER DOBRO
+2C35;AL # GLAGOLITIC SMALL LETTER YESTU
+2C36;AL # GLAGOLITIC SMALL LETTER ZHIVETE
+2C37;AL # GLAGOLITIC SMALL LETTER DZELO
+2C38;AL # GLAGOLITIC SMALL LETTER ZEMLJA
+2C39;AL # GLAGOLITIC SMALL LETTER IZHE
+2C3A;AL # GLAGOLITIC SMALL LETTER INITIAL IZHE
+2C3B;AL # GLAGOLITIC SMALL LETTER I
+2C3C;AL # GLAGOLITIC SMALL LETTER DJERVI
+2C3D;AL # GLAGOLITIC SMALL LETTER KAKO
+2C3E;AL # GLAGOLITIC SMALL LETTER LJUDIJE
+2C3F;AL # GLAGOLITIC SMALL LETTER MYSLITE
+2C40;AL # GLAGOLITIC SMALL LETTER NASHI
+2C41;AL # GLAGOLITIC SMALL LETTER ONU
+2C42;AL # GLAGOLITIC SMALL LETTER POKOJI
+2C43;AL # GLAGOLITIC SMALL LETTER RITSI
+2C44;AL # GLAGOLITIC SMALL LETTER SLOVO
+2C45;AL # GLAGOLITIC SMALL LETTER TVRIDO
+2C46;AL # GLAGOLITIC SMALL LETTER UKU
+2C47;AL # GLAGOLITIC SMALL LETTER FRITU
+2C48;AL # GLAGOLITIC SMALL LETTER HERU
+2C49;AL # GLAGOLITIC SMALL LETTER OTU
+2C4A;AL # GLAGOLITIC SMALL LETTER PE
+2C4B;AL # GLAGOLITIC SMALL LETTER SHTA
+2C4C;AL # GLAGOLITIC SMALL LETTER TSI
+2C4D;AL # GLAGOLITIC SMALL LETTER CHRIVI
+2C4E;AL # GLAGOLITIC SMALL LETTER SHA
+2C4F;AL # GLAGOLITIC SMALL LETTER YERU
+2C50;AL # GLAGOLITIC SMALL LETTER YERI
+2C51;AL # GLAGOLITIC SMALL LETTER YATI
+2C52;AL # GLAGOLITIC SMALL LETTER SPIDERY HA
+2C53;AL # GLAGOLITIC SMALL LETTER YU
+2C54;AL # GLAGOLITIC SMALL LETTER SMALL YUS
+2C55;AL # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+2C56;AL # GLAGOLITIC SMALL LETTER YO
+2C57;AL # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+2C58;AL # GLAGOLITIC SMALL LETTER BIG YUS
+2C59;AL # GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+2C5A;AL # GLAGOLITIC SMALL LETTER FITA
+2C5B;AL # GLAGOLITIC SMALL LETTER IZHITSA
+2C5C;AL # GLAGOLITIC SMALL LETTER SHTAPIC
+2C5D;AL # GLAGOLITIC SMALL LETTER TROKUTASTI A
+2C5E;AL # GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C60;AL # LATIN CAPITAL LETTER L WITH DOUBLE BAR
+2C61;AL # LATIN SMALL LETTER L WITH DOUBLE BAR
+2C62;AL # LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+2C63;AL # LATIN CAPITAL LETTER P WITH STROKE
+2C64;AL # LATIN CAPITAL LETTER R WITH TAIL
+2C65;AL # LATIN SMALL LETTER A WITH STROKE
+2C66;AL # LATIN SMALL LETTER T WITH DIAGONAL STROKE
+2C67;AL # LATIN CAPITAL LETTER H WITH DESCENDER
+2C68;AL # LATIN SMALL LETTER H WITH DESCENDER
+2C69;AL # LATIN CAPITAL LETTER K WITH DESCENDER
+2C6A;AL # LATIN SMALL LETTER K WITH DESCENDER
+2C6B;AL # LATIN CAPITAL LETTER Z WITH DESCENDER
+2C6C;AL # LATIN SMALL LETTER Z WITH DESCENDER
+2C6D;AL # LATIN CAPITAL LETTER ALPHA
+2C6E;AL # LATIN CAPITAL LETTER M WITH HOOK
+2C6F;AL # LATIN CAPITAL LETTER TURNED A
+2C71;AL # LATIN SMALL LETTER V WITH RIGHT HOOK
+2C72;AL # LATIN CAPITAL LETTER W WITH HOOK
+2C73;AL # LATIN SMALL LETTER W WITH HOOK
+2C74;AL # LATIN SMALL LETTER V WITH CURL
+2C75;AL # LATIN CAPITAL LETTER HALF H
+2C76;AL # LATIN SMALL LETTER HALF H
+2C77;AL # LATIN SMALL LETTER TAILLESS PHI
+2C78;AL # LATIN SMALL LETTER E WITH NOTCH
+2C79;AL # LATIN SMALL LETTER TURNED R WITH TAIL
+2C7A;AL # LATIN SMALL LETTER O WITH LOW RING INSIDE
+2C7B;AL # LATIN LETTER SMALL CAPITAL TURNED E
+2C7C;AL # LATIN SUBSCRIPT SMALL LETTER J
+2C7D;AL # MODIFIER LETTER CAPITAL V
+2C80;AL # COPTIC CAPITAL LETTER ALFA
+2C81;AL # COPTIC SMALL LETTER ALFA
+2C82;AL # COPTIC CAPITAL LETTER VIDA
+2C83;AL # COPTIC SMALL LETTER VIDA
+2C84;AL # COPTIC CAPITAL LETTER GAMMA
+2C85;AL # COPTIC SMALL LETTER GAMMA
+2C86;AL # COPTIC CAPITAL LETTER DALDA
+2C87;AL # COPTIC SMALL LETTER DALDA
+2C88;AL # COPTIC CAPITAL LETTER EIE
+2C89;AL # COPTIC SMALL LETTER EIE
+2C8A;AL # COPTIC CAPITAL LETTER SOU
+2C8B;AL # COPTIC SMALL LETTER SOU
+2C8C;AL # COPTIC CAPITAL LETTER ZATA
+2C8D;AL # COPTIC SMALL LETTER ZATA
+2C8E;AL # COPTIC CAPITAL LETTER HATE
+2C8F;AL # COPTIC SMALL LETTER HATE
+2C90;AL # COPTIC CAPITAL LETTER THETHE
+2C91;AL # COPTIC SMALL LETTER THETHE
+2C92;AL # COPTIC CAPITAL LETTER IAUDA
+2C93;AL # COPTIC SMALL LETTER IAUDA
+2C94;AL # COPTIC CAPITAL LETTER KAPA
+2C95;AL # COPTIC SMALL LETTER KAPA
+2C96;AL # COPTIC CAPITAL LETTER LAULA
+2C97;AL # COPTIC SMALL LETTER LAULA
+2C98;AL # COPTIC CAPITAL LETTER MI
+2C99;AL # COPTIC SMALL LETTER MI
+2C9A;AL # COPTIC CAPITAL LETTER NI
+2C9B;AL # COPTIC SMALL LETTER NI
+2C9C;AL # COPTIC CAPITAL LETTER KSI
+2C9D;AL # COPTIC SMALL LETTER KSI
+2C9E;AL # COPTIC CAPITAL LETTER O
+2C9F;AL # COPTIC SMALL LETTER O
+2CA0;AL # COPTIC CAPITAL LETTER PI
+2CA1;AL # COPTIC SMALL LETTER PI
+2CA2;AL # COPTIC CAPITAL LETTER RO
+2CA3;AL # COPTIC SMALL LETTER RO
+2CA4;AL # COPTIC CAPITAL LETTER SIMA
+2CA5;AL # COPTIC SMALL LETTER SIMA
+2CA6;AL # COPTIC CAPITAL LETTER TAU
+2CA7;AL # COPTIC SMALL LETTER TAU
+2CA8;AL # COPTIC CAPITAL LETTER UA
+2CA9;AL # COPTIC SMALL LETTER UA
+2CAA;AL # COPTIC CAPITAL LETTER FI
+2CAB;AL # COPTIC SMALL LETTER FI
+2CAC;AL # COPTIC CAPITAL LETTER KHI
+2CAD;AL # COPTIC SMALL LETTER KHI
+2CAE;AL # COPTIC CAPITAL LETTER PSI
+2CAF;AL # COPTIC SMALL LETTER PSI
+2CB0;AL # COPTIC CAPITAL LETTER OOU
+2CB1;AL # COPTIC SMALL LETTER OOU
+2CB2;AL # COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB3;AL # COPTIC SMALL LETTER DIALECT-P ALEF
+2CB4;AL # COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB5;AL # COPTIC SMALL LETTER OLD COPTIC AIN
+2CB6;AL # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB7;AL # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB8;AL # COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CB9;AL # COPTIC SMALL LETTER DIALECT-P KAPA
+2CBA;AL # COPTIC CAPITAL LETTER DIALECT-P NI
+2CBB;AL # COPTIC SMALL LETTER DIALECT-P NI
+2CBC;AL # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBD;AL # COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBE;AL # COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CBF;AL # COPTIC SMALL LETTER OLD COPTIC OOU
+2CC0;AL # COPTIC CAPITAL LETTER SAMPI
+2CC1;AL # COPTIC SMALL LETTER SAMPI
+2CC2;AL # COPTIC CAPITAL LETTER CROSSED SHEI
+2CC3;AL # COPTIC SMALL LETTER CROSSED SHEI
+2CC4;AL # COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC5;AL # COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC6;AL # COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC7;AL # COPTIC SMALL LETTER OLD COPTIC ESH
+2CC8;AL # COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CC9;AL # COPTIC SMALL LETTER AKHMIMIC KHEI
+2CCA;AL # COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCB;AL # COPTIC SMALL LETTER DIALECT-P HORI
+2CCC;AL # COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCD;AL # COPTIC SMALL LETTER OLD COPTIC HORI
+2CCE;AL # COPTIC CAPITAL LETTER OLD COPTIC HA
+2CCF;AL # COPTIC SMALL LETTER OLD COPTIC HA
+2CD0;AL # COPTIC CAPITAL LETTER L-SHAPED HA
+2CD1;AL # COPTIC SMALL LETTER L-SHAPED HA
+2CD2;AL # COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD3;AL # COPTIC SMALL LETTER OLD COPTIC HEI
+2CD4;AL # COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD5;AL # COPTIC SMALL LETTER OLD COPTIC HAT
+2CD6;AL # COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD7;AL # COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD8;AL # COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CD9;AL # COPTIC SMALL LETTER OLD COPTIC DJA
+2CDA;AL # COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDB;AL # COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDC;AL # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDD;AL # COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDE;AL # COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CDF;AL # COPTIC SMALL LETTER OLD NUBIAN NGI
+2CE0;AL # COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE1;AL # COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE2;AL # COPTIC CAPITAL LETTER OLD NUBIAN WAU
+2CE3;AL # COPTIC SMALL LETTER OLD NUBIAN WAU
+2CE4;AL # COPTIC SYMBOL KAI
+2CE5;AL # COPTIC SYMBOL MI RO
+2CE6;AL # COPTIC SYMBOL PI RO
+2CE7;AL # COPTIC SYMBOL STAUROS
+2CE8;AL # COPTIC SYMBOL TAU RO
+2CE9;AL # COPTIC SYMBOL KHI RO
+2CEA;AL # COPTIC SYMBOL SHIMA SIMA
+2CF9;EX # COPTIC OLD NUBIAN FULL STOP
+2CFA;BA # COPTIC OLD NUBIAN DIRECT QUESTION MARK
+2CFB;BA # COPTIC OLD NUBIAN INDIRECT QUESTION MARK
+2CFC;BA # COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD;AL # COPTIC FRACTION ONE HALF
+2CFE;EX # COPTIC FULL STOP
+2CFF;BA # COPTIC MORPHOLOGICAL DIVIDER
+2D00;AL # GEORGIAN SMALL LETTER AN
+2D01;AL # GEORGIAN SMALL LETTER BAN
+2D02;AL # GEORGIAN SMALL LETTER GAN
+2D03;AL # GEORGIAN SMALL LETTER DON
+2D04;AL # GEORGIAN SMALL LETTER EN
+2D05;AL # GEORGIAN SMALL LETTER VIN
+2D06;AL # GEORGIAN SMALL LETTER ZEN
+2D07;AL # GEORGIAN SMALL LETTER TAN
+2D08;AL # GEORGIAN SMALL LETTER IN
+2D09;AL # GEORGIAN SMALL LETTER KAN
+2D0A;AL # GEORGIAN SMALL LETTER LAS
+2D0B;AL # GEORGIAN SMALL LETTER MAN
+2D0C;AL # GEORGIAN SMALL LETTER NAR
+2D0D;AL # GEORGIAN SMALL LETTER ON
+2D0E;AL # GEORGIAN SMALL LETTER PAR
+2D0F;AL # GEORGIAN SMALL LETTER ZHAR
+2D10;AL # GEORGIAN SMALL LETTER RAE
+2D11;AL # GEORGIAN SMALL LETTER SAN
+2D12;AL # GEORGIAN SMALL LETTER TAR
+2D13;AL # GEORGIAN SMALL LETTER UN
+2D14;AL # GEORGIAN SMALL LETTER PHAR
+2D15;AL # GEORGIAN SMALL LETTER KHAR
+2D16;AL # GEORGIAN SMALL LETTER GHAN
+2D17;AL # GEORGIAN SMALL LETTER QAR
+2D18;AL # GEORGIAN SMALL LETTER SHIN
+2D19;AL # GEORGIAN SMALL LETTER CHIN
+2D1A;AL # GEORGIAN SMALL LETTER CAN
+2D1B;AL # GEORGIAN SMALL LETTER JIL
+2D1C;AL # GEORGIAN SMALL LETTER CIL
+2D1D;AL # GEORGIAN SMALL LETTER CHAR
+2D1E;AL # GEORGIAN SMALL LETTER XAN
+2D1F;AL # GEORGIAN SMALL LETTER JHAN
+2D20;AL # GEORGIAN SMALL LETTER HAE
+2D21;AL # GEORGIAN SMALL LETTER HE
+2D22;AL # GEORGIAN SMALL LETTER HIE
+2D23;AL # GEORGIAN SMALL LETTER WE
+2D24;AL # GEORGIAN SMALL LETTER HAR
+2D25;AL # GEORGIAN SMALL LETTER HOE
+2D30;AL # TIFINAGH LETTER YA
+2D31;AL # TIFINAGH LETTER YAB
+2D32;AL # TIFINAGH LETTER YABH
+2D33;AL # TIFINAGH LETTER YAG
+2D34;AL # TIFINAGH LETTER YAGHH
+2D35;AL # TIFINAGH LETTER BERBER ACADEMY YAJ
+2D36;AL # TIFINAGH LETTER YAJ
+2D37;AL # TIFINAGH LETTER YAD
+2D38;AL # TIFINAGH LETTER YADH
+2D39;AL # TIFINAGH LETTER YADD
+2D3A;AL # TIFINAGH LETTER YADDH
+2D3B;AL # TIFINAGH LETTER YEY
+2D3C;AL # TIFINAGH LETTER YAF
+2D3D;AL # TIFINAGH LETTER YAK
+2D3E;AL # TIFINAGH LETTER TUAREG YAK
+2D3F;AL # TIFINAGH LETTER YAKHH
+2D40;AL # TIFINAGH LETTER YAH
+2D41;AL # TIFINAGH LETTER BERBER ACADEMY YAH
+2D42;AL # TIFINAGH LETTER TUAREG YAH
+2D43;AL # TIFINAGH LETTER YAHH
+2D44;AL # TIFINAGH LETTER YAA
+2D45;AL # TIFINAGH LETTER YAKH
+2D46;AL # TIFINAGH LETTER TUAREG YAKH
+2D47;AL # TIFINAGH LETTER YAQ
+2D48;AL # TIFINAGH LETTER TUAREG YAQ
+2D49;AL # TIFINAGH LETTER YI
+2D4A;AL # TIFINAGH LETTER YAZH
+2D4B;AL # TIFINAGH LETTER AHAGGAR YAZH
+2D4C;AL # TIFINAGH LETTER TUAREG YAZH
+2D4D;AL # TIFINAGH LETTER YAL
+2D4E;AL # TIFINAGH LETTER YAM
+2D4F;AL # TIFINAGH LETTER YAN
+2D50;AL # TIFINAGH LETTER TUAREG YAGN
+2D51;AL # TIFINAGH LETTER TUAREG YANG
+2D52;AL # TIFINAGH LETTER YAP
+2D53;AL # TIFINAGH LETTER YU
+2D54;AL # TIFINAGH LETTER YAR
+2D55;AL # TIFINAGH LETTER YARR
+2D56;AL # TIFINAGH LETTER YAGH
+2D57;AL # TIFINAGH LETTER TUAREG YAGH
+2D58;AL # TIFINAGH LETTER AYER YAGH
+2D59;AL # TIFINAGH LETTER YAS
+2D5A;AL # TIFINAGH LETTER YASS
+2D5B;AL # TIFINAGH LETTER YASH
+2D5C;AL # TIFINAGH LETTER YAT
+2D5D;AL # TIFINAGH LETTER YATH
+2D5E;AL # TIFINAGH LETTER YACH
+2D5F;AL # TIFINAGH LETTER YATT
+2D60;AL # TIFINAGH LETTER YAV
+2D61;AL # TIFINAGH LETTER YAW
+2D62;AL # TIFINAGH LETTER YAY
+2D63;AL # TIFINAGH LETTER YAZ
+2D64;AL # TIFINAGH LETTER TAWELLEMET YAZ
+2D65;AL # TIFINAGH LETTER YAZZ
+2D6F;AL # TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D80;AL # ETHIOPIC SYLLABLE LOA
+2D81;AL # ETHIOPIC SYLLABLE MOA
+2D82;AL # ETHIOPIC SYLLABLE ROA
+2D83;AL # ETHIOPIC SYLLABLE SOA
+2D84;AL # ETHIOPIC SYLLABLE SHOA
+2D85;AL # ETHIOPIC SYLLABLE BOA
+2D86;AL # ETHIOPIC SYLLABLE TOA
+2D87;AL # ETHIOPIC SYLLABLE COA
+2D88;AL # ETHIOPIC SYLLABLE NOA
+2D89;AL # ETHIOPIC SYLLABLE NYOA
+2D8A;AL # ETHIOPIC SYLLABLE GLOTTAL OA
+2D8B;AL # ETHIOPIC SYLLABLE ZOA
+2D8C;AL # ETHIOPIC SYLLABLE DOA
+2D8D;AL # ETHIOPIC SYLLABLE DDOA
+2D8E;AL # ETHIOPIC SYLLABLE JOA
+2D8F;AL # ETHIOPIC SYLLABLE THOA
+2D90;AL # ETHIOPIC SYLLABLE CHOA
+2D91;AL # ETHIOPIC SYLLABLE PHOA
+2D92;AL # ETHIOPIC SYLLABLE POA
+2D93;AL # ETHIOPIC SYLLABLE GGWA
+2D94;AL # ETHIOPIC SYLLABLE GGWI
+2D95;AL # ETHIOPIC SYLLABLE GGWEE
+2D96;AL # ETHIOPIC SYLLABLE GGWE
+2DA0;AL # ETHIOPIC SYLLABLE SSA
+2DA1;AL # ETHIOPIC SYLLABLE SSU
+2DA2;AL # ETHIOPIC SYLLABLE SSI
+2DA3;AL # ETHIOPIC SYLLABLE SSAA
+2DA4;AL # ETHIOPIC SYLLABLE SSEE
+2DA5;AL # ETHIOPIC SYLLABLE SSE
+2DA6;AL # ETHIOPIC SYLLABLE SSO
+2DA8;AL # ETHIOPIC SYLLABLE CCA
+2DA9;AL # ETHIOPIC SYLLABLE CCU
+2DAA;AL # ETHIOPIC SYLLABLE CCI
+2DAB;AL # ETHIOPIC SYLLABLE CCAA
+2DAC;AL # ETHIOPIC SYLLABLE CCEE
+2DAD;AL # ETHIOPIC SYLLABLE CCE
+2DAE;AL # ETHIOPIC SYLLABLE CCO
+2DB0;AL # ETHIOPIC SYLLABLE ZZA
+2DB1;AL # ETHIOPIC SYLLABLE ZZU
+2DB2;AL # ETHIOPIC SYLLABLE ZZI
+2DB3;AL # ETHIOPIC SYLLABLE ZZAA
+2DB4;AL # ETHIOPIC SYLLABLE ZZEE
+2DB5;AL # ETHIOPIC SYLLABLE ZZE
+2DB6;AL # ETHIOPIC SYLLABLE ZZO
+2DB8;AL # ETHIOPIC SYLLABLE CCHA
+2DB9;AL # ETHIOPIC SYLLABLE CCHU
+2DBA;AL # ETHIOPIC SYLLABLE CCHI
+2DBB;AL # ETHIOPIC SYLLABLE CCHAA
+2DBC;AL # ETHIOPIC SYLLABLE CCHEE
+2DBD;AL # ETHIOPIC SYLLABLE CCHE
+2DBE;AL # ETHIOPIC SYLLABLE CCHO
+2DC0;AL # ETHIOPIC SYLLABLE QYA
+2DC1;AL # ETHIOPIC SYLLABLE QYU
+2DC2;AL # ETHIOPIC SYLLABLE QYI
+2DC3;AL # ETHIOPIC SYLLABLE QYAA
+2DC4;AL # ETHIOPIC SYLLABLE QYEE
+2DC5;AL # ETHIOPIC SYLLABLE QYE
+2DC6;AL # ETHIOPIC SYLLABLE QYO
+2DC8;AL # ETHIOPIC SYLLABLE KYA
+2DC9;AL # ETHIOPIC SYLLABLE KYU
+2DCA;AL # ETHIOPIC SYLLABLE KYI
+2DCB;AL # ETHIOPIC SYLLABLE KYAA
+2DCC;AL # ETHIOPIC SYLLABLE KYEE
+2DCD;AL # ETHIOPIC SYLLABLE KYE
+2DCE;AL # ETHIOPIC SYLLABLE KYO
+2DD0;AL # ETHIOPIC SYLLABLE XYA
+2DD1;AL # ETHIOPIC SYLLABLE XYU
+2DD2;AL # ETHIOPIC SYLLABLE XYI
+2DD3;AL # ETHIOPIC SYLLABLE XYAA
+2DD4;AL # ETHIOPIC SYLLABLE XYEE
+2DD5;AL # ETHIOPIC SYLLABLE XYE
+2DD6;AL # ETHIOPIC SYLLABLE XYO
+2DD8;AL # ETHIOPIC SYLLABLE GYA
+2DD9;AL # ETHIOPIC SYLLABLE GYU
+2DDA;AL # ETHIOPIC SYLLABLE GYI
+2DDB;AL # ETHIOPIC SYLLABLE GYAA
+2DDC;AL # ETHIOPIC SYLLABLE GYEE
+2DDD;AL # ETHIOPIC SYLLABLE GYE
+2DDE;AL # ETHIOPIC SYLLABLE GYO
+2DE0;CM # COMBINING CYRILLIC LETTER BE
+2DE1;CM # COMBINING CYRILLIC LETTER VE
+2DE2;CM # COMBINING CYRILLIC LETTER GHE
+2DE3;CM # COMBINING CYRILLIC LETTER DE
+2DE4;CM # COMBINING CYRILLIC LETTER ZHE
+2DE5;CM # COMBINING CYRILLIC LETTER ZE
+2DE6;CM # COMBINING CYRILLIC LETTER KA
+2DE7;CM # COMBINING CYRILLIC LETTER EL
+2DE8;CM # COMBINING CYRILLIC LETTER EM
+2DE9;CM # COMBINING CYRILLIC LETTER EN
+2DEA;CM # COMBINING CYRILLIC LETTER O
+2DEB;CM # COMBINING CYRILLIC LETTER PE
+2DEC;CM # COMBINING CYRILLIC LETTER ER
+2DED;CM # COMBINING CYRILLIC LETTER ES
+2DEE;CM # COMBINING CYRILLIC LETTER TE
+2DEF;CM # COMBINING CYRILLIC LETTER HA
+2DF0;CM # COMBINING CYRILLIC LETTER TSE
+2DF1;CM # COMBINING CYRILLIC LETTER CHE
+2DF2;CM # COMBINING CYRILLIC LETTER SHA
+2DF3;CM # COMBINING CYRILLIC LETTER SHCHA
+2DF4;CM # COMBINING CYRILLIC LETTER FITA
+2DF5;CM # COMBINING CYRILLIC LETTER ES-TE
+2DF6;CM # COMBINING CYRILLIC LETTER A
+2DF7;CM # COMBINING CYRILLIC LETTER IE
+2DF8;CM # COMBINING CYRILLIC LETTER DJERV
+2DF9;CM # COMBINING CYRILLIC LETTER MONOGRAPH UK
+2DFA;CM # COMBINING CYRILLIC LETTER YAT
+2DFB;CM # COMBINING CYRILLIC LETTER YU
+2DFC;CM # COMBINING CYRILLIC LETTER IOTIFIED A
+2DFD;CM # COMBINING CYRILLIC LETTER LITTLE YUS
+2DFE;CM # COMBINING CYRILLIC LETTER BIG YUS
+2DFF;CM # COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+2E00;QU # RIGHT ANGLE SUBSTITUTION MARKER
+2E01;QU # RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02;QU # LEFT SUBSTITUTION BRACKET
+2E03;QU # RIGHT SUBSTITUTION BRACKET
+2E04;QU # LEFT DOTTED SUBSTITUTION BRACKET
+2E05;QU # RIGHT DOTTED SUBSTITUTION BRACKET
+2E06;QU # RAISED INTERPOLATION MARKER
+2E07;QU # RAISED DOTTED INTERPOLATION MARKER
+2E08;QU # DOTTED TRANSPOSITION MARKER
+2E09;QU # LEFT TRANSPOSITION BRACKET
+2E0A;QU # RIGHT TRANSPOSITION BRACKET
+2E0B;QU # RAISED SQUARE
+2E0C;QU # LEFT RAISED OMISSION BRACKET
+2E0D;QU # RIGHT RAISED OMISSION BRACKET
+2E0E;BA # EDITORIAL CORONIS
+2E0F;BA # PARAGRAPHOS
+2E10;BA # FORKED PARAGRAPHOS
+2E11;BA # REVERSED FORKED PARAGRAPHOS
+2E12;BA # HYPODIASTOLE
+2E13;BA # DOTTED OBELOS
+2E14;BA # DOWNWARDS ANCORA
+2E15;BA # UPWARDS ANCORA
+2E16;AL # DOTTED RIGHT-POINTING ANGLE
+2E17;BA # DOUBLE OBLIQUE HYPHEN
+2E18;OP # INVERTED INTERROBANG
+2E19;BA # PALM BRANCH
+2E1A;AL # HYPHEN WITH DIAERESIS
+2E1B;AL # TILDE WITH RING ABOVE
+2E1C;QU # LEFT LOW PARAPHRASE BRACKET
+2E1D;QU # RIGHT LOW PARAPHRASE BRACKET
+2E1E;AL # TILDE WITH DOT ABOVE
+2E1F;AL # TILDE WITH DOT BELOW
+2E20;QU # LEFT VERTICAL BAR WITH QUILL
+2E21;QU # RIGHT VERTICAL BAR WITH QUILL
+2E22;OP # TOP LEFT HALF BRACKET
+2E23;CL # TOP RIGHT HALF BRACKET
+2E24;OP # BOTTOM LEFT HALF BRACKET
+2E25;CL # BOTTOM RIGHT HALF BRACKET
+2E26;OP # LEFT SIDEWAYS U BRACKET
+2E27;CL # RIGHT SIDEWAYS U BRACKET
+2E28;OP # LEFT DOUBLE PARENTHESIS
+2E29;CL # RIGHT DOUBLE PARENTHESIS
+2E2A;BA # TWO DOTS OVER ONE DOT PUNCTUATION
+2E2B;BA # ONE DOT OVER TWO DOTS PUNCTUATION
+2E2C;BA # SQUARED FOUR DOT PUNCTUATION
+2E2D;BA # FIVE DOT MARK
+2E2E;EX # REVERSED QUESTION MARK
+2E2F;AL # VERTICAL TILDE
+2E30;BA # RING POINT
+2E80;ID # CJK RADICAL REPEAT
+2E81;ID # CJK RADICAL CLIFF
+2E82;ID # CJK RADICAL SECOND ONE
+2E83;ID # CJK RADICAL SECOND TWO
+2E84;ID # CJK RADICAL SECOND THREE
+2E85;ID # CJK RADICAL PERSON
+2E86;ID # CJK RADICAL BOX
+2E87;ID # CJK RADICAL TABLE
+2E88;ID # CJK RADICAL KNIFE ONE
+2E89;ID # CJK RADICAL KNIFE TWO
+2E8A;ID # CJK RADICAL DIVINATION
+2E8B;ID # CJK RADICAL SEAL
+2E8C;ID # CJK RADICAL SMALL ONE
+2E8D;ID # CJK RADICAL SMALL TWO
+2E8E;ID # CJK RADICAL LAME ONE
+2E8F;ID # CJK RADICAL LAME TWO
+2E90;ID # CJK RADICAL LAME THREE
+2E91;ID # CJK RADICAL LAME FOUR
+2E92;ID # CJK RADICAL SNAKE
+2E93;ID # CJK RADICAL THREAD
+2E94;ID # CJK RADICAL SNOUT ONE
+2E95;ID # CJK RADICAL SNOUT TWO
+2E96;ID # CJK RADICAL HEART ONE
+2E97;ID # CJK RADICAL HEART TWO
+2E98;ID # CJK RADICAL HAND
+2E99;ID # CJK RADICAL RAP
+2E9B;ID # CJK RADICAL CHOKE
+2E9C;ID # CJK RADICAL SUN
+2E9D;ID # CJK RADICAL MOON
+2E9E;ID # CJK RADICAL DEATH
+2E9F;ID # CJK RADICAL MOTHER
+2EA0;ID # CJK RADICAL CIVILIAN
+2EA1;ID # CJK RADICAL WATER ONE
+2EA2;ID # CJK RADICAL WATER TWO
+2EA3;ID # CJK RADICAL FIRE
+2EA4;ID # CJK RADICAL PAW ONE
+2EA5;ID # CJK RADICAL PAW TWO
+2EA6;ID # CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+2EA7;ID # CJK RADICAL COW
+2EA8;ID # CJK RADICAL DOG
+2EA9;ID # CJK RADICAL JADE
+2EAA;ID # CJK RADICAL BOLT OF CLOTH
+2EAB;ID # CJK RADICAL EYE
+2EAC;ID # CJK RADICAL SPIRIT ONE
+2EAD;ID # CJK RADICAL SPIRIT TWO
+2EAE;ID # CJK RADICAL BAMBOO
+2EAF;ID # CJK RADICAL SILK
+2EB0;ID # CJK RADICAL C-SIMPLIFIED SILK
+2EB1;ID # CJK RADICAL NET ONE
+2EB2;ID # CJK RADICAL NET TWO
+2EB3;ID # CJK RADICAL NET THREE
+2EB4;ID # CJK RADICAL NET FOUR
+2EB5;ID # CJK RADICAL MESH
+2EB6;ID # CJK RADICAL SHEEP
+2EB7;ID # CJK RADICAL RAM
+2EB8;ID # CJK RADICAL EWE
+2EB9;ID # CJK RADICAL OLD
+2EBA;ID # CJK RADICAL BRUSH ONE
+2EBB;ID # CJK RADICAL BRUSH TWO
+2EBC;ID # CJK RADICAL MEAT
+2EBD;ID # CJK RADICAL MORTAR
+2EBE;ID # CJK RADICAL GRASS ONE
+2EBF;ID # CJK RADICAL GRASS TWO
+2EC0;ID # CJK RADICAL GRASS THREE
+2EC1;ID # CJK RADICAL TIGER
+2EC2;ID # CJK RADICAL CLOTHES
+2EC3;ID # CJK RADICAL WEST ONE
+2EC4;ID # CJK RADICAL WEST TWO
+2EC5;ID # CJK RADICAL C-SIMPLIFIED SEE
+2EC6;ID # CJK RADICAL SIMPLIFIED HORN
+2EC7;ID # CJK RADICAL HORN
+2EC8;ID # CJK RADICAL C-SIMPLIFIED SPEECH
+2EC9;ID # CJK RADICAL C-SIMPLIFIED SHELL
+2ECA;ID # CJK RADICAL FOOT
+2ECB;ID # CJK RADICAL C-SIMPLIFIED CART
+2ECC;ID # CJK RADICAL SIMPLIFIED WALK
+2ECD;ID # CJK RADICAL WALK ONE
+2ECE;ID # CJK RADICAL WALK TWO
+2ECF;ID # CJK RADICAL CITY
+2ED0;ID # CJK RADICAL C-SIMPLIFIED GOLD
+2ED1;ID # CJK RADICAL LONG ONE
+2ED2;ID # CJK RADICAL LONG TWO
+2ED3;ID # CJK RADICAL C-SIMPLIFIED LONG
+2ED4;ID # CJK RADICAL C-SIMPLIFIED GATE
+2ED5;ID # CJK RADICAL MOUND ONE
+2ED6;ID # CJK RADICAL MOUND TWO
+2ED7;ID # CJK RADICAL RAIN
+2ED8;ID # CJK RADICAL BLUE
+2ED9;ID # CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+2EDA;ID # CJK RADICAL C-SIMPLIFIED LEAF
+2EDB;ID # CJK RADICAL C-SIMPLIFIED WIND
+2EDC;ID # CJK RADICAL C-SIMPLIFIED FLY
+2EDD;ID # CJK RADICAL EAT ONE
+2EDE;ID # CJK RADICAL EAT TWO
+2EDF;ID # CJK RADICAL EAT THREE
+2EE0;ID # CJK RADICAL C-SIMPLIFIED EAT
+2EE1;ID # CJK RADICAL HEAD
+2EE2;ID # CJK RADICAL C-SIMPLIFIED HORSE
+2EE3;ID # CJK RADICAL BONE
+2EE4;ID # CJK RADICAL GHOST
+2EE5;ID # CJK RADICAL C-SIMPLIFIED FISH
+2EE6;ID # CJK RADICAL C-SIMPLIFIED BIRD
+2EE7;ID # CJK RADICAL C-SIMPLIFIED SALT
+2EE8;ID # CJK RADICAL SIMPLIFIED WHEAT
+2EE9;ID # CJK RADICAL SIMPLIFIED YELLOW
+2EEA;ID # CJK RADICAL C-SIMPLIFIED FROG
+2EEB;ID # CJK RADICAL J-SIMPLIFIED EVEN
+2EEC;ID # CJK RADICAL C-SIMPLIFIED EVEN
+2EED;ID # CJK RADICAL J-SIMPLIFIED TOOTH
+2EEE;ID # CJK RADICAL C-SIMPLIFIED TOOTH
+2EEF;ID # CJK RADICAL J-SIMPLIFIED DRAGON
+2EF0;ID # CJK RADICAL C-SIMPLIFIED DRAGON
+2EF1;ID # CJK RADICAL TURTLE
+2EF2;ID # CJK RADICAL J-SIMPLIFIED TURTLE
+2EF3;ID # CJK RADICAL C-SIMPLIFIED TURTLE
+2F00;ID # KANGXI RADICAL ONE
+2F01;ID # KANGXI RADICAL LINE
+2F02;ID # KANGXI RADICAL DOT
+2F03;ID # KANGXI RADICAL SLASH
+2F04;ID # KANGXI RADICAL SECOND
+2F05;ID # KANGXI RADICAL HOOK
+2F06;ID # KANGXI RADICAL TWO
+2F07;ID # KANGXI RADICAL LID
+2F08;ID # KANGXI RADICAL MAN
+2F09;ID # KANGXI RADICAL LEGS
+2F0A;ID # KANGXI RADICAL ENTER
+2F0B;ID # KANGXI RADICAL EIGHT
+2F0C;ID # KANGXI RADICAL DOWN BOX
+2F0D;ID # KANGXI RADICAL COVER
+2F0E;ID # KANGXI RADICAL ICE
+2F0F;ID # KANGXI RADICAL TABLE
+2F10;ID # KANGXI RADICAL OPEN BOX
+2F11;ID # KANGXI RADICAL KNIFE
+2F12;ID # KANGXI RADICAL POWER
+2F13;ID # KANGXI RADICAL WRAP
+2F14;ID # KANGXI RADICAL SPOON
+2F15;ID # KANGXI RADICAL RIGHT OPEN BOX
+2F16;ID # KANGXI RADICAL HIDING ENCLOSURE
+2F17;ID # KANGXI RADICAL TEN
+2F18;ID # KANGXI RADICAL DIVINATION
+2F19;ID # KANGXI RADICAL SEAL
+2F1A;ID # KANGXI RADICAL CLIFF
+2F1B;ID # KANGXI RADICAL PRIVATE
+2F1C;ID # KANGXI RADICAL AGAIN
+2F1D;ID # KANGXI RADICAL MOUTH
+2F1E;ID # KANGXI RADICAL ENCLOSURE
+2F1F;ID # KANGXI RADICAL EARTH
+2F20;ID # KANGXI RADICAL SCHOLAR
+2F21;ID # KANGXI RADICAL GO
+2F22;ID # KANGXI RADICAL GO SLOWLY
+2F23;ID # KANGXI RADICAL EVENING
+2F24;ID # KANGXI RADICAL BIG
+2F25;ID # KANGXI RADICAL WOMAN
+2F26;ID # KANGXI RADICAL CHILD
+2F27;ID # KANGXI RADICAL ROOF
+2F28;ID # KANGXI RADICAL INCH
+2F29;ID # KANGXI RADICAL SMALL
+2F2A;ID # KANGXI RADICAL LAME
+2F2B;ID # KANGXI RADICAL CORPSE
+2F2C;ID # KANGXI RADICAL SPROUT
+2F2D;ID # KANGXI RADICAL MOUNTAIN
+2F2E;ID # KANGXI RADICAL RIVER
+2F2F;ID # KANGXI RADICAL WORK
+2F30;ID # KANGXI RADICAL ONESELF
+2F31;ID # KANGXI RADICAL TURBAN
+2F32;ID # KANGXI RADICAL DRY
+2F33;ID # KANGXI RADICAL SHORT THREAD
+2F34;ID # KANGXI RADICAL DOTTED CLIFF
+2F35;ID # KANGXI RADICAL LONG STRIDE
+2F36;ID # KANGXI RADICAL TWO HANDS
+2F37;ID # KANGXI RADICAL SHOOT
+2F38;ID # KANGXI RADICAL BOW
+2F39;ID # KANGXI RADICAL SNOUT
+2F3A;ID # KANGXI RADICAL BRISTLE
+2F3B;ID # KANGXI RADICAL STEP
+2F3C;ID # KANGXI RADICAL HEART
+2F3D;ID # KANGXI RADICAL HALBERD
+2F3E;ID # KANGXI RADICAL DOOR
+2F3F;ID # KANGXI RADICAL HAND
+2F40;ID # KANGXI RADICAL BRANCH
+2F41;ID # KANGXI RADICAL RAP
+2F42;ID # KANGXI RADICAL SCRIPT
+2F43;ID # KANGXI RADICAL DIPPER
+2F44;ID # KANGXI RADICAL AXE
+2F45;ID # KANGXI RADICAL SQUARE
+2F46;ID # KANGXI RADICAL NOT
+2F47;ID # KANGXI RADICAL SUN
+2F48;ID # KANGXI RADICAL SAY
+2F49;ID # KANGXI RADICAL MOON
+2F4A;ID # KANGXI RADICAL TREE
+2F4B;ID # KANGXI RADICAL LACK
+2F4C;ID # KANGXI RADICAL STOP
+2F4D;ID # KANGXI RADICAL DEATH
+2F4E;ID # KANGXI RADICAL WEAPON
+2F4F;ID # KANGXI RADICAL DO NOT
+2F50;ID # KANGXI RADICAL COMPARE
+2F51;ID # KANGXI RADICAL FUR
+2F52;ID # KANGXI RADICAL CLAN
+2F53;ID # KANGXI RADICAL STEAM
+2F54;ID # KANGXI RADICAL WATER
+2F55;ID # KANGXI RADICAL FIRE
+2F56;ID # KANGXI RADICAL CLAW
+2F57;ID # KANGXI RADICAL FATHER
+2F58;ID # KANGXI RADICAL DOUBLE X
+2F59;ID # KANGXI RADICAL HALF TREE TRUNK
+2F5A;ID # KANGXI RADICAL SLICE
+2F5B;ID # KANGXI RADICAL FANG
+2F5C;ID # KANGXI RADICAL COW
+2F5D;ID # KANGXI RADICAL DOG
+2F5E;ID # KANGXI RADICAL PROFOUND
+2F5F;ID # KANGXI RADICAL JADE
+2F60;ID # KANGXI RADICAL MELON
+2F61;ID # KANGXI RADICAL TILE
+2F62;ID # KANGXI RADICAL SWEET
+2F63;ID # KANGXI RADICAL LIFE
+2F64;ID # KANGXI RADICAL USE
+2F65;ID # KANGXI RADICAL FIELD
+2F66;ID # KANGXI RADICAL BOLT OF CLOTH
+2F67;ID # KANGXI RADICAL SICKNESS
+2F68;ID # KANGXI RADICAL DOTTED TENT
+2F69;ID # KANGXI RADICAL WHITE
+2F6A;ID # KANGXI RADICAL SKIN
+2F6B;ID # KANGXI RADICAL DISH
+2F6C;ID # KANGXI RADICAL EYE
+2F6D;ID # KANGXI RADICAL SPEAR
+2F6E;ID # KANGXI RADICAL ARROW
+2F6F;ID # KANGXI RADICAL STONE
+2F70;ID # KANGXI RADICAL SPIRIT
+2F71;ID # KANGXI RADICAL TRACK
+2F72;ID # KANGXI RADICAL GRAIN
+2F73;ID # KANGXI RADICAL CAVE
+2F74;ID # KANGXI RADICAL STAND
+2F75;ID # KANGXI RADICAL BAMBOO
+2F76;ID # KANGXI RADICAL RICE
+2F77;ID # KANGXI RADICAL SILK
+2F78;ID # KANGXI RADICAL JAR
+2F79;ID # KANGXI RADICAL NET
+2F7A;ID # KANGXI RADICAL SHEEP
+2F7B;ID # KANGXI RADICAL FEATHER
+2F7C;ID # KANGXI RADICAL OLD
+2F7D;ID # KANGXI RADICAL AND
+2F7E;ID # KANGXI RADICAL PLOW
+2F7F;ID # KANGXI RADICAL EAR
+2F80;ID # KANGXI RADICAL BRUSH
+2F81;ID # KANGXI RADICAL MEAT
+2F82;ID # KANGXI RADICAL MINISTER
+2F83;ID # KANGXI RADICAL SELF
+2F84;ID # KANGXI RADICAL ARRIVE
+2F85;ID # KANGXI RADICAL MORTAR
+2F86;ID # KANGXI RADICAL TONGUE
+2F87;ID # KANGXI RADICAL OPPOSE
+2F88;ID # KANGXI RADICAL BOAT
+2F89;ID # KANGXI RADICAL STOPPING
+2F8A;ID # KANGXI RADICAL COLOR
+2F8B;ID # KANGXI RADICAL GRASS
+2F8C;ID # KANGXI RADICAL TIGER
+2F8D;ID # KANGXI RADICAL INSECT
+2F8E;ID # KANGXI RADICAL BLOOD
+2F8F;ID # KANGXI RADICAL WALK ENCLOSURE
+2F90;ID # KANGXI RADICAL CLOTHES
+2F91;ID # KANGXI RADICAL WEST
+2F92;ID # KANGXI RADICAL SEE
+2F93;ID # KANGXI RADICAL HORN
+2F94;ID # KANGXI RADICAL SPEECH
+2F95;ID # KANGXI RADICAL VALLEY
+2F96;ID # KANGXI RADICAL BEAN
+2F97;ID # KANGXI RADICAL PIG
+2F98;ID # KANGXI RADICAL BADGER
+2F99;ID # KANGXI RADICAL SHELL
+2F9A;ID # KANGXI RADICAL RED
+2F9B;ID # KANGXI RADICAL RUN
+2F9C;ID # KANGXI RADICAL FOOT
+2F9D;ID # KANGXI RADICAL BODY
+2F9E;ID # KANGXI RADICAL CART
+2F9F;ID # KANGXI RADICAL BITTER
+2FA0;ID # KANGXI RADICAL MORNING
+2FA1;ID # KANGXI RADICAL WALK
+2FA2;ID # KANGXI RADICAL CITY
+2FA3;ID # KANGXI RADICAL WINE
+2FA4;ID # KANGXI RADICAL DISTINGUISH
+2FA5;ID # KANGXI RADICAL VILLAGE
+2FA6;ID # KANGXI RADICAL GOLD
+2FA7;ID # KANGXI RADICAL LONG
+2FA8;ID # KANGXI RADICAL GATE
+2FA9;ID # KANGXI RADICAL MOUND
+2FAA;ID # KANGXI RADICAL SLAVE
+2FAB;ID # KANGXI RADICAL SHORT TAILED BIRD
+2FAC;ID # KANGXI RADICAL RAIN
+2FAD;ID # KANGXI RADICAL BLUE
+2FAE;ID # KANGXI RADICAL WRONG
+2FAF;ID # KANGXI RADICAL FACE
+2FB0;ID # KANGXI RADICAL LEATHER
+2FB1;ID # KANGXI RADICAL TANNED LEATHER
+2FB2;ID # KANGXI RADICAL LEEK
+2FB3;ID # KANGXI RADICAL SOUND
+2FB4;ID # KANGXI RADICAL LEAF
+2FB5;ID # KANGXI RADICAL WIND
+2FB6;ID # KANGXI RADICAL FLY
+2FB7;ID # KANGXI RADICAL EAT
+2FB8;ID # KANGXI RADICAL HEAD
+2FB9;ID # KANGXI RADICAL FRAGRANT
+2FBA;ID # KANGXI RADICAL HORSE
+2FBB;ID # KANGXI RADICAL BONE
+2FBC;ID # KANGXI RADICAL TALL
+2FBD;ID # KANGXI RADICAL HAIR
+2FBE;ID # KANGXI RADICAL FIGHT
+2FBF;ID # KANGXI RADICAL SACRIFICIAL WINE
+2FC0;ID # KANGXI RADICAL CAULDRON
+2FC1;ID # KANGXI RADICAL GHOST
+2FC2;ID # KANGXI RADICAL FISH
+2FC3;ID # KANGXI RADICAL BIRD
+2FC4;ID # KANGXI RADICAL SALT
+2FC5;ID # KANGXI RADICAL DEER
+2FC6;ID # KANGXI RADICAL WHEAT
+2FC7;ID # KANGXI RADICAL HEMP
+2FC8;ID # KANGXI RADICAL YELLOW
+2FC9;ID # KANGXI RADICAL MILLET
+2FCA;ID # KANGXI RADICAL BLACK
+2FCB;ID # KANGXI RADICAL EMBROIDERY
+2FCC;ID # KANGXI RADICAL FROG
+2FCD;ID # KANGXI RADICAL TRIPOD
+2FCE;ID # KANGXI RADICAL DRUM
+2FCF;ID # KANGXI RADICAL RAT
+2FD0;ID # KANGXI RADICAL NOSE
+2FD1;ID # KANGXI RADICAL EVEN
+2FD2;ID # KANGXI RADICAL TOOTH
+2FD3;ID # KANGXI RADICAL DRAGON
+2FD4;ID # KANGXI RADICAL TURTLE
+2FD5;ID # KANGXI RADICAL FLUTE
+2FF0;ID # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1;ID # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2;ID # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3;ID # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4;ID # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB;ID # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000;ID # IDEOGRAPHIC SPACE
+3001;CL # IDEOGRAPHIC COMMA
+3002;CL # IDEOGRAPHIC FULL STOP
+3003;ID # DITTO MARK
+3004;ID # JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005;NS # IDEOGRAPHIC ITERATION MARK
+3006;ID # IDEOGRAPHIC CLOSING MARK
+3007;ID # IDEOGRAPHIC NUMBER ZERO
+3008;OP # LEFT ANGLE BRACKET
+3009;CL # RIGHT ANGLE BRACKET
+300A;OP # LEFT DOUBLE ANGLE BRACKET
+300B;CL # RIGHT DOUBLE ANGLE BRACKET
+300C;OP # LEFT CORNER BRACKET
+300D;CL # RIGHT CORNER BRACKET
+300E;OP # LEFT WHITE CORNER BRACKET
+300F;CL # RIGHT WHITE CORNER BRACKET
+3010;OP # LEFT BLACK LENTICULAR BRACKET
+3011;CL # RIGHT BLACK LENTICULAR BRACKET
+3012;ID # POSTAL MARK
+3013;ID # GETA MARK
+3014;OP # LEFT TORTOISE SHELL BRACKET
+3015;CL # RIGHT TORTOISE SHELL BRACKET
+3016;OP # LEFT WHITE LENTICULAR BRACKET
+3017;CL # RIGHT WHITE LENTICULAR BRACKET
+3018;OP # LEFT WHITE TORTOISE SHELL BRACKET
+3019;CL # RIGHT WHITE TORTOISE SHELL BRACKET
+301A;OP # LEFT WHITE SQUARE BRACKET
+301B;CL # RIGHT WHITE SQUARE BRACKET
+301C;NS # WAVE DASH
+301D;OP # REVERSED DOUBLE PRIME QUOTATION MARK
+301E;CL # DOUBLE PRIME QUOTATION MARK
+301F;CL # LOW DOUBLE PRIME QUOTATION MARK
+3020;ID # POSTAL MARK FACE
+3021;ID # HANGZHOU NUMERAL ONE
+3022;ID # HANGZHOU NUMERAL TWO
+3023;ID # HANGZHOU NUMERAL THREE
+3024;ID # HANGZHOU NUMERAL FOUR
+3025;ID # HANGZHOU NUMERAL FIVE
+3026;ID # HANGZHOU NUMERAL SIX
+3027;ID # HANGZHOU NUMERAL SEVEN
+3028;ID # HANGZHOU NUMERAL EIGHT
+3029;ID # HANGZHOU NUMERAL NINE
+302A;CM # IDEOGRAPHIC LEVEL TONE MARK
+302B;CM # IDEOGRAPHIC RISING TONE MARK
+302C;CM # IDEOGRAPHIC DEPARTING TONE MARK
+302D;CM # IDEOGRAPHIC ENTERING TONE MARK
+302E;CM # HANGUL SINGLE DOT TONE MARK
+302F;CM # HANGUL DOUBLE DOT TONE MARK
+3030;ID # WAVY DASH
+3031;ID # VERTICAL KANA REPEAT MARK
+3032;ID # VERTICAL KANA REPEAT WITH VOICED SOUND MARK
+3033;ID # VERTICAL KANA REPEAT MARK UPPER HALF
+3034;ID # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF
+3035;ID # VERTICAL KANA REPEAT MARK LOWER HALF
+3036;ID # CIRCLED POSTAL MARK
+3037;ID # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+3038;ID # HANGZHOU NUMERAL TEN
+3039;ID # HANGZHOU NUMERAL TWENTY
+303A;ID # HANGZHOU NUMERAL THIRTY
+303B;NS # VERTICAL IDEOGRAPHIC ITERATION MARK
+303C;NS # MASU MARK
+303D;ID # PART ALTERNATION MARK
+303E;ID # IDEOGRAPHIC VARIATION INDICATOR
+303F;ID # IDEOGRAPHIC HALF FILL SPACE
+3041;NS # HIRAGANA LETTER SMALL A
+3042;ID # HIRAGANA LETTER A
+3043;NS # HIRAGANA LETTER SMALL I
+3044;ID # HIRAGANA LETTER I
+3045;NS # HIRAGANA LETTER SMALL U
+3046;ID # HIRAGANA LETTER U
+3047;NS # HIRAGANA LETTER SMALL E
+3048;ID # HIRAGANA LETTER E
+3049;NS # HIRAGANA LETTER SMALL O
+304A;ID # HIRAGANA LETTER O
+304B;ID # HIRAGANA LETTER KA
+304C;ID # HIRAGANA LETTER GA
+304D;ID # HIRAGANA LETTER KI
+304E;ID # HIRAGANA LETTER GI
+304F;ID # HIRAGANA LETTER KU
+3050;ID # HIRAGANA LETTER GU
+3051;ID # HIRAGANA LETTER KE
+3052;ID # HIRAGANA LETTER GE
+3053;ID # HIRAGANA LETTER KO
+3054;ID # HIRAGANA LETTER GO
+3055;ID # HIRAGANA LETTER SA
+3056;ID # HIRAGANA LETTER ZA
+3057;ID # HIRAGANA LETTER SI
+3058;ID # HIRAGANA LETTER ZI
+3059;ID # HIRAGANA LETTER SU
+305A;ID # HIRAGANA LETTER ZU
+305B;ID # HIRAGANA LETTER SE
+305C;ID # HIRAGANA LETTER ZE
+305D;ID # HIRAGANA LETTER SO
+305E;ID # HIRAGANA LETTER ZO
+305F;ID # HIRAGANA LETTER TA
+3060;ID # HIRAGANA LETTER DA
+3061;ID # HIRAGANA LETTER TI
+3062;ID # HIRAGANA LETTER DI
+3063;NS # HIRAGANA LETTER SMALL TU
+3064;ID # HIRAGANA LETTER TU
+3065;ID # HIRAGANA LETTER DU
+3066;ID # HIRAGANA LETTER TE
+3067;ID # HIRAGANA LETTER DE
+3068;ID # HIRAGANA LETTER TO
+3069;ID # HIRAGANA LETTER DO
+306A;ID # HIRAGANA LETTER NA
+306B;ID # HIRAGANA LETTER NI
+306C;ID # HIRAGANA LETTER NU
+306D;ID # HIRAGANA LETTER NE
+306E;ID # HIRAGANA LETTER NO
+306F;ID # HIRAGANA LETTER HA
+3070;ID # HIRAGANA LETTER BA
+3071;ID # HIRAGANA LETTER PA
+3072;ID # HIRAGANA LETTER HI
+3073;ID # HIRAGANA LETTER BI
+3074;ID # HIRAGANA LETTER PI
+3075;ID # HIRAGANA LETTER HU
+3076;ID # HIRAGANA LETTER BU
+3077;ID # HIRAGANA LETTER PU
+3078;ID # HIRAGANA LETTER HE
+3079;ID # HIRAGANA LETTER BE
+307A;ID # HIRAGANA LETTER PE
+307B;ID # HIRAGANA LETTER HO
+307C;ID # HIRAGANA LETTER BO
+307D;ID # HIRAGANA LETTER PO
+307E;ID # HIRAGANA LETTER MA
+307F;ID # HIRAGANA LETTER MI
+3080;ID # HIRAGANA LETTER MU
+3081;ID # HIRAGANA LETTER ME
+3082;ID # HIRAGANA LETTER MO
+3083;NS # HIRAGANA LETTER SMALL YA
+3084;ID # HIRAGANA LETTER YA
+3085;NS # HIRAGANA LETTER SMALL YU
+3086;ID # HIRAGANA LETTER YU
+3087;NS # HIRAGANA LETTER SMALL YO
+3088;ID # HIRAGANA LETTER YO
+3089;ID # HIRAGANA LETTER RA
+308A;ID # HIRAGANA LETTER RI
+308B;ID # HIRAGANA LETTER RU
+308C;ID # HIRAGANA LETTER RE
+308D;ID # HIRAGANA LETTER RO
+308E;NS # HIRAGANA LETTER SMALL WA
+308F;ID # HIRAGANA LETTER WA
+3090;ID # HIRAGANA LETTER WI
+3091;ID # HIRAGANA LETTER WE
+3092;ID # HIRAGANA LETTER WO
+3093;ID # HIRAGANA LETTER N
+3094;ID # HIRAGANA LETTER VU
+3095;NS # HIRAGANA LETTER SMALL KA
+3096;NS # HIRAGANA LETTER SMALL KE
+3099;CM # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A;CM # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B;NS # KATAKANA-HIRAGANA VOICED SOUND MARK
+309C;NS # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D;NS # HIRAGANA ITERATION MARK
+309E;NS # HIRAGANA VOICED ITERATION MARK
+309F;ID # HIRAGANA DIGRAPH YORI
+30A0;NS # KATAKANA-HIRAGANA DOUBLE HYPHEN
+30A1;NS # KATAKANA LETTER SMALL A
+30A2;ID # KATAKANA LETTER A
+30A3;NS # KATAKANA LETTER SMALL I
+30A4;ID # KATAKANA LETTER I
+30A5;NS # KATAKANA LETTER SMALL U
+30A6;ID # KATAKANA LETTER U
+30A7;NS # KATAKANA LETTER SMALL E
+30A8;ID # KATAKANA LETTER E
+30A9;NS # KATAKANA LETTER SMALL O
+30AA;ID # KATAKANA LETTER O
+30AB;ID # KATAKANA LETTER KA
+30AC;ID # KATAKANA LETTER GA
+30AD;ID # KATAKANA LETTER KI
+30AE;ID # KATAKANA LETTER GI
+30AF;ID # KATAKANA LETTER KU
+30B0;ID # KATAKANA LETTER GU
+30B1;ID # KATAKANA LETTER KE
+30B2;ID # KATAKANA LETTER GE
+30B3;ID # KATAKANA LETTER KO
+30B4;ID # KATAKANA LETTER GO
+30B5;ID # KATAKANA LETTER SA
+30B6;ID # KATAKANA LETTER ZA
+30B7;ID # KATAKANA LETTER SI
+30B8;ID # KATAKANA LETTER ZI
+30B9;ID # KATAKANA LETTER SU
+30BA;ID # KATAKANA LETTER ZU
+30BB;ID # KATAKANA LETTER SE
+30BC;ID # KATAKANA LETTER ZE
+30BD;ID # KATAKANA LETTER SO
+30BE;ID # KATAKANA LETTER ZO
+30BF;ID # KATAKANA LETTER TA
+30C0;ID # KATAKANA LETTER DA
+30C1;ID # KATAKANA LETTER TI
+30C2;ID # KATAKANA LETTER DI
+30C3;NS # KATAKANA LETTER SMALL TU
+30C4;ID # KATAKANA LETTER TU
+30C5;ID # KATAKANA LETTER DU
+30C6;ID # KATAKANA LETTER TE
+30C7;ID # KATAKANA LETTER DE
+30C8;ID # KATAKANA LETTER TO
+30C9;ID # KATAKANA LETTER DO
+30CA;ID # KATAKANA LETTER NA
+30CB;ID # KATAKANA LETTER NI
+30CC;ID # KATAKANA LETTER NU
+30CD;ID # KATAKANA LETTER NE
+30CE;ID # KATAKANA LETTER NO
+30CF;ID # KATAKANA LETTER HA
+30D0;ID # KATAKANA LETTER BA
+30D1;ID # KATAKANA LETTER PA
+30D2;ID # KATAKANA LETTER HI
+30D3;ID # KATAKANA LETTER BI
+30D4;ID # KATAKANA LETTER PI
+30D5;ID # KATAKANA LETTER HU
+30D6;ID # KATAKANA LETTER BU
+30D7;ID # KATAKANA LETTER PU
+30D8;ID # KATAKANA LETTER HE
+30D9;ID # KATAKANA LETTER BE
+30DA;ID # KATAKANA LETTER PE
+30DB;ID # KATAKANA LETTER HO
+30DC;ID # KATAKANA LETTER BO
+30DD;ID # KATAKANA LETTER PO
+30DE;ID # KATAKANA LETTER MA
+30DF;ID # KATAKANA LETTER MI
+30E0;ID # KATAKANA LETTER MU
+30E1;ID # KATAKANA LETTER ME
+30E2;ID # KATAKANA LETTER MO
+30E3;NS # KATAKANA LETTER SMALL YA
+30E4;ID # KATAKANA LETTER YA
+30E5;NS # KATAKANA LETTER SMALL YU
+30E6;ID # KATAKANA LETTER YU
+30E7;NS # KATAKANA LETTER SMALL YO
+30E8;ID # KATAKANA LETTER YO
+30E9;ID # KATAKANA LETTER RA
+30EA;ID # KATAKANA LETTER RI
+30EB;ID # KATAKANA LETTER RU
+30EC;ID # KATAKANA LETTER RE
+30ED;ID # KATAKANA LETTER RO
+30EE;NS # KATAKANA LETTER SMALL WA
+30EF;ID # KATAKANA LETTER WA
+30F0;ID # KATAKANA LETTER WI
+30F1;ID # KATAKANA LETTER WE
+30F2;ID # KATAKANA LETTER WO
+30F3;ID # KATAKANA LETTER N
+30F4;ID # KATAKANA LETTER VU
+30F5;NS # KATAKANA LETTER SMALL KA
+30F6;NS # KATAKANA LETTER SMALL KE
+30F7;ID # KATAKANA LETTER VA
+30F8;ID # KATAKANA LETTER VI
+30F9;ID # KATAKANA LETTER VE
+30FA;ID # KATAKANA LETTER VO
+30FB;NS # KATAKANA MIDDLE DOT
+30FC;NS # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FD;NS # KATAKANA ITERATION MARK
+30FE;NS # KATAKANA VOICED ITERATION MARK
+30FF;ID # KATAKANA DIGRAPH KOTO
+3105;ID # BOPOMOFO LETTER B
+3106;ID # BOPOMOFO LETTER P
+3107;ID # BOPOMOFO LETTER M
+3108;ID # BOPOMOFO LETTER F
+3109;ID # BOPOMOFO LETTER D
+310A;ID # BOPOMOFO LETTER T
+310B;ID # BOPOMOFO LETTER N
+310C;ID # BOPOMOFO LETTER L
+310D;ID # BOPOMOFO LETTER G
+310E;ID # BOPOMOFO LETTER K
+310F;ID # BOPOMOFO LETTER H
+3110;ID # BOPOMOFO LETTER J
+3111;ID # BOPOMOFO LETTER Q
+3112;ID # BOPOMOFO LETTER X
+3113;ID # BOPOMOFO LETTER ZH
+3114;ID # BOPOMOFO LETTER CH
+3115;ID # BOPOMOFO LETTER SH
+3116;ID # BOPOMOFO LETTER R
+3117;ID # BOPOMOFO LETTER Z
+3118;ID # BOPOMOFO LETTER C
+3119;ID # BOPOMOFO LETTER S
+311A;ID # BOPOMOFO LETTER A
+311B;ID # BOPOMOFO LETTER O
+311C;ID # BOPOMOFO LETTER E
+311D;ID # BOPOMOFO LETTER EH
+311E;ID # BOPOMOFO LETTER AI
+311F;ID # BOPOMOFO LETTER EI
+3120;ID # BOPOMOFO LETTER AU
+3121;ID # BOPOMOFO LETTER OU
+3122;ID # BOPOMOFO LETTER AN
+3123;ID # BOPOMOFO LETTER EN
+3124;ID # BOPOMOFO LETTER ANG
+3125;ID # BOPOMOFO LETTER ENG
+3126;ID # BOPOMOFO LETTER ER
+3127;ID # BOPOMOFO LETTER I
+3128;ID # BOPOMOFO LETTER U
+3129;ID # BOPOMOFO LETTER IU
+312A;ID # BOPOMOFO LETTER V
+312B;ID # BOPOMOFO LETTER NG
+312C;ID # BOPOMOFO LETTER GN
+312D;ID # BOPOMOFO LETTER IH
+3131;ID # HANGUL LETTER KIYEOK
+3132;ID # HANGUL LETTER SSANGKIYEOK
+3133;ID # HANGUL LETTER KIYEOK-SIOS
+3134;ID # HANGUL LETTER NIEUN
+3135;ID # HANGUL LETTER NIEUN-CIEUC
+3136;ID # HANGUL LETTER NIEUN-HIEUH
+3137;ID # HANGUL LETTER TIKEUT
+3138;ID # HANGUL LETTER SSANGTIKEUT
+3139;ID # HANGUL LETTER RIEUL
+313A;ID # HANGUL LETTER RIEUL-KIYEOK
+313B;ID # HANGUL LETTER RIEUL-MIEUM
+313C;ID # HANGUL LETTER RIEUL-PIEUP
+313D;ID # HANGUL LETTER RIEUL-SIOS
+313E;ID # HANGUL LETTER RIEUL-THIEUTH
+313F;ID # HANGUL LETTER RIEUL-PHIEUPH
+3140;ID # HANGUL LETTER RIEUL-HIEUH
+3141;ID # HANGUL LETTER MIEUM
+3142;ID # HANGUL LETTER PIEUP
+3143;ID # HANGUL LETTER SSANGPIEUP
+3144;ID # HANGUL LETTER PIEUP-SIOS
+3145;ID # HANGUL LETTER SIOS
+3146;ID # HANGUL LETTER SSANGSIOS
+3147;ID # HANGUL LETTER IEUNG
+3148;ID # HANGUL LETTER CIEUC
+3149;ID # HANGUL LETTER SSANGCIEUC
+314A;ID # HANGUL LETTER CHIEUCH
+314B;ID # HANGUL LETTER KHIEUKH
+314C;ID # HANGUL LETTER THIEUTH
+314D;ID # HANGUL LETTER PHIEUPH
+314E;ID # HANGUL LETTER HIEUH
+314F;ID # HANGUL LETTER A
+3150;ID # HANGUL LETTER AE
+3151;ID # HANGUL LETTER YA
+3152;ID # HANGUL LETTER YAE
+3153;ID # HANGUL LETTER EO
+3154;ID # HANGUL LETTER E
+3155;ID # HANGUL LETTER YEO
+3156;ID # HANGUL LETTER YE
+3157;ID # HANGUL LETTER O
+3158;ID # HANGUL LETTER WA
+3159;ID # HANGUL LETTER WAE
+315A;ID # HANGUL LETTER OE
+315B;ID # HANGUL LETTER YO
+315C;ID # HANGUL LETTER U
+315D;ID # HANGUL LETTER WEO
+315E;ID # HANGUL LETTER WE
+315F;ID # HANGUL LETTER WI
+3160;ID # HANGUL LETTER YU
+3161;ID # HANGUL LETTER EU
+3162;ID # HANGUL LETTER YI
+3163;ID # HANGUL LETTER I
+3164;ID # HANGUL FILLER
+3165;ID # HANGUL LETTER SSANGNIEUN
+3166;ID # HANGUL LETTER NIEUN-TIKEUT
+3167;ID # HANGUL LETTER NIEUN-SIOS
+3168;ID # HANGUL LETTER NIEUN-PANSIOS
+3169;ID # HANGUL LETTER RIEUL-KIYEOK-SIOS
+316A;ID # HANGUL LETTER RIEUL-TIKEUT
+316B;ID # HANGUL LETTER RIEUL-PIEUP-SIOS
+316C;ID # HANGUL LETTER RIEUL-PANSIOS
+316D;ID # HANGUL LETTER RIEUL-YEORINHIEUH
+316E;ID # HANGUL LETTER MIEUM-PIEUP
+316F;ID # HANGUL LETTER MIEUM-SIOS
+3170;ID # HANGUL LETTER MIEUM-PANSIOS
+3171;ID # HANGUL LETTER KAPYEOUNMIEUM
+3172;ID # HANGUL LETTER PIEUP-KIYEOK
+3173;ID # HANGUL LETTER PIEUP-TIKEUT
+3174;ID # HANGUL LETTER PIEUP-SIOS-KIYEOK
+3175;ID # HANGUL LETTER PIEUP-SIOS-TIKEUT
+3176;ID # HANGUL LETTER PIEUP-CIEUC
+3177;ID # HANGUL LETTER PIEUP-THIEUTH
+3178;ID # HANGUL LETTER KAPYEOUNPIEUP
+3179;ID # HANGUL LETTER KAPYEOUNSSANGPIEUP
+317A;ID # HANGUL LETTER SIOS-KIYEOK
+317B;ID # HANGUL LETTER SIOS-NIEUN
+317C;ID # HANGUL LETTER SIOS-TIKEUT
+317D;ID # HANGUL LETTER SIOS-PIEUP
+317E;ID # HANGUL LETTER SIOS-CIEUC
+317F;ID # HANGUL LETTER PANSIOS
+3180;ID # HANGUL LETTER SSANGIEUNG
+3181;ID # HANGUL LETTER YESIEUNG
+3182;ID # HANGUL LETTER YESIEUNG-SIOS
+3183;ID # HANGUL LETTER YESIEUNG-PANSIOS
+3184;ID # HANGUL LETTER KAPYEOUNPHIEUPH
+3185;ID # HANGUL LETTER SSANGHIEUH
+3186;ID # HANGUL LETTER YEORINHIEUH
+3187;ID # HANGUL LETTER YO-YA
+3188;ID # HANGUL LETTER YO-YAE
+3189;ID # HANGUL LETTER YO-I
+318A;ID # HANGUL LETTER YU-YEO
+318B;ID # HANGUL LETTER YU-YE
+318C;ID # HANGUL LETTER YU-I
+318D;ID # HANGUL LETTER ARAEA
+318E;ID # HANGUL LETTER ARAEAE
+3190;ID # IDEOGRAPHIC ANNOTATION LINKING MARK
+3191;ID # IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192;ID # IDEOGRAPHIC ANNOTATION ONE MARK
+3193;ID # IDEOGRAPHIC ANNOTATION TWO MARK
+3194;ID # IDEOGRAPHIC ANNOTATION THREE MARK
+3195;ID # IDEOGRAPHIC ANNOTATION FOUR MARK
+3196;ID # IDEOGRAPHIC ANNOTATION TOP MARK
+3197;ID # IDEOGRAPHIC ANNOTATION MIDDLE MARK
+3198;ID # IDEOGRAPHIC ANNOTATION BOTTOM MARK
+3199;ID # IDEOGRAPHIC ANNOTATION FIRST MARK
+319A;ID # IDEOGRAPHIC ANNOTATION SECOND MARK
+319B;ID # IDEOGRAPHIC ANNOTATION THIRD MARK
+319C;ID # IDEOGRAPHIC ANNOTATION FOURTH MARK
+319D;ID # IDEOGRAPHIC ANNOTATION HEAVEN MARK
+319E;ID # IDEOGRAPHIC ANNOTATION EARTH MARK
+319F;ID # IDEOGRAPHIC ANNOTATION MAN MARK
+31A0;ID # BOPOMOFO LETTER BU
+31A1;ID # BOPOMOFO LETTER ZI
+31A2;ID # BOPOMOFO LETTER JI
+31A3;ID # BOPOMOFO LETTER GU
+31A4;ID # BOPOMOFO LETTER EE
+31A5;ID # BOPOMOFO LETTER ENN
+31A6;ID # BOPOMOFO LETTER OO
+31A7;ID # BOPOMOFO LETTER ONN
+31A8;ID # BOPOMOFO LETTER IR
+31A9;ID # BOPOMOFO LETTER ANN
+31AA;ID # BOPOMOFO LETTER INN
+31AB;ID # BOPOMOFO LETTER UNN
+31AC;ID # BOPOMOFO LETTER IM
+31AD;ID # BOPOMOFO LETTER NGG
+31AE;ID # BOPOMOFO LETTER AINN
+31AF;ID # BOPOMOFO LETTER AUNN
+31B0;ID # BOPOMOFO LETTER AM
+31B1;ID # BOPOMOFO LETTER OM
+31B2;ID # BOPOMOFO LETTER ONG
+31B3;ID # BOPOMOFO LETTER INNN
+31B4;ID # BOPOMOFO FINAL LETTER P
+31B5;ID # BOPOMOFO FINAL LETTER T
+31B6;ID # BOPOMOFO FINAL LETTER K
+31B7;ID # BOPOMOFO FINAL LETTER H
+31C0;ID # CJK STROKE T
+31C1;ID # CJK STROKE WG
+31C2;ID # CJK STROKE XG
+31C3;ID # CJK STROKE BXG
+31C4;ID # CJK STROKE SW
+31C5;ID # CJK STROKE HZZ
+31C6;ID # CJK STROKE HZG
+31C7;ID # CJK STROKE HP
+31C8;ID # CJK STROKE HZWG
+31C9;ID # CJK STROKE SZWG
+31CA;ID # CJK STROKE HZT
+31CB;ID # CJK STROKE HZZP
+31CC;ID # CJK STROKE HPWG
+31CD;ID # CJK STROKE HZW
+31CE;ID # CJK STROKE HZZZ
+31CF;ID # CJK STROKE N
+31D0;ID # CJK STROKE H
+31D1;ID # CJK STROKE S
+31D2;ID # CJK STROKE P
+31D3;ID # CJK STROKE SP
+31D4;ID # CJK STROKE D
+31D5;ID # CJK STROKE HZ
+31D6;ID # CJK STROKE HG
+31D7;ID # CJK STROKE SZ
+31D8;ID # CJK STROKE SWZ
+31D9;ID # CJK STROKE ST
+31DA;ID # CJK STROKE SG
+31DB;ID # CJK STROKE PD
+31DC;ID # CJK STROKE PZ
+31DD;ID # CJK STROKE TN
+31DE;ID # CJK STROKE SZZ
+31DF;ID # CJK STROKE SWG
+31E0;ID # CJK STROKE HXWG
+31E1;ID # CJK STROKE HZZZG
+31E2;ID # CJK STROKE PG
+31E3;ID # CJK STROKE Q
+31F0;NS # KATAKANA LETTER SMALL KU
+31F1;NS # KATAKANA LETTER SMALL SI
+31F2;NS # KATAKANA LETTER SMALL SU
+31F3;NS # KATAKANA LETTER SMALL TO
+31F4;NS # KATAKANA LETTER SMALL NU
+31F5;NS # KATAKANA LETTER SMALL HA
+31F6;NS # KATAKANA LETTER SMALL HI
+31F7;NS # KATAKANA LETTER SMALL HU
+31F8;NS # KATAKANA LETTER SMALL HE
+31F9;NS # KATAKANA LETTER SMALL HO
+31FA;NS # KATAKANA LETTER SMALL MU
+31FB;NS # KATAKANA LETTER SMALL RA
+31FC;NS # KATAKANA LETTER SMALL RI
+31FD;NS # KATAKANA LETTER SMALL RU
+31FE;NS # KATAKANA LETTER SMALL RE
+31FF;NS # KATAKANA LETTER SMALL RO
+3200;ID # PARENTHESIZED HANGUL KIYEOK
+3201;ID # PARENTHESIZED HANGUL NIEUN
+3202;ID # PARENTHESIZED HANGUL TIKEUT
+3203;ID # PARENTHESIZED HANGUL RIEUL
+3204;ID # PARENTHESIZED HANGUL MIEUM
+3205;ID # PARENTHESIZED HANGUL PIEUP
+3206;ID # PARENTHESIZED HANGUL SIOS
+3207;ID # PARENTHESIZED HANGUL IEUNG
+3208;ID # PARENTHESIZED HANGUL CIEUC
+3209;ID # PARENTHESIZED HANGUL CHIEUCH
+320A;ID # PARENTHESIZED HANGUL KHIEUKH
+320B;ID # PARENTHESIZED HANGUL THIEUTH
+320C;ID # PARENTHESIZED HANGUL PHIEUPH
+320D;ID # PARENTHESIZED HANGUL HIEUH
+320E;ID # PARENTHESIZED HANGUL KIYEOK A
+320F;ID # PARENTHESIZED HANGUL NIEUN A
+3210;ID # PARENTHESIZED HANGUL TIKEUT A
+3211;ID # PARENTHESIZED HANGUL RIEUL A
+3212;ID # PARENTHESIZED HANGUL MIEUM A
+3213;ID # PARENTHESIZED HANGUL PIEUP A
+3214;ID # PARENTHESIZED HANGUL SIOS A
+3215;ID # PARENTHESIZED HANGUL IEUNG A
+3216;ID # PARENTHESIZED HANGUL CIEUC A
+3217;ID # PARENTHESIZED HANGUL CHIEUCH A
+3218;ID # PARENTHESIZED HANGUL KHIEUKH A
+3219;ID # PARENTHESIZED HANGUL THIEUTH A
+321A;ID # PARENTHESIZED HANGUL PHIEUPH A
+321B;ID # PARENTHESIZED HANGUL HIEUH A
+321C;ID # PARENTHESIZED HANGUL CIEUC U
+321D;ID # PARENTHESIZED KOREAN CHARACTER OJEON
+321E;ID # PARENTHESIZED KOREAN CHARACTER O HU
+3220;ID # PARENTHESIZED IDEOGRAPH ONE
+3221;ID # PARENTHESIZED IDEOGRAPH TWO
+3222;ID # PARENTHESIZED IDEOGRAPH THREE
+3223;ID # PARENTHESIZED IDEOGRAPH FOUR
+3224;ID # PARENTHESIZED IDEOGRAPH FIVE
+3225;ID # PARENTHESIZED IDEOGRAPH SIX
+3226;ID # PARENTHESIZED IDEOGRAPH SEVEN
+3227;ID # PARENTHESIZED IDEOGRAPH EIGHT
+3228;ID # PARENTHESIZED IDEOGRAPH NINE
+3229;ID # PARENTHESIZED IDEOGRAPH TEN
+322A;ID # PARENTHESIZED IDEOGRAPH MOON
+322B;ID # PARENTHESIZED IDEOGRAPH FIRE
+322C;ID # PARENTHESIZED IDEOGRAPH WATER
+322D;ID # PARENTHESIZED IDEOGRAPH WOOD
+322E;ID # PARENTHESIZED IDEOGRAPH METAL
+322F;ID # PARENTHESIZED IDEOGRAPH EARTH
+3230;ID # PARENTHESIZED IDEOGRAPH SUN
+3231;ID # PARENTHESIZED IDEOGRAPH STOCK
+3232;ID # PARENTHESIZED IDEOGRAPH HAVE
+3233;ID # PARENTHESIZED IDEOGRAPH SOCIETY
+3234;ID # PARENTHESIZED IDEOGRAPH NAME
+3235;ID # PARENTHESIZED IDEOGRAPH SPECIAL
+3236;ID # PARENTHESIZED IDEOGRAPH FINANCIAL
+3237;ID # PARENTHESIZED IDEOGRAPH CONGRATULATION
+3238;ID # PARENTHESIZED IDEOGRAPH LABOR
+3239;ID # PARENTHESIZED IDEOGRAPH REPRESENT
+323A;ID # PARENTHESIZED IDEOGRAPH CALL
+323B;ID # PARENTHESIZED IDEOGRAPH STUDY
+323C;ID # PARENTHESIZED IDEOGRAPH SUPERVISE
+323D;ID # PARENTHESIZED IDEOGRAPH ENTERPRISE
+323E;ID # PARENTHESIZED IDEOGRAPH RESOURCE
+323F;ID # PARENTHESIZED IDEOGRAPH ALLIANCE
+3240;ID # PARENTHESIZED IDEOGRAPH FESTIVAL
+3241;ID # PARENTHESIZED IDEOGRAPH REST
+3242;ID # PARENTHESIZED IDEOGRAPH SELF
+3243;ID # PARENTHESIZED IDEOGRAPH REACH
+3250;ID # PARTNERSHIP SIGN
+3251;ID # CIRCLED NUMBER TWENTY ONE
+3252;ID # CIRCLED NUMBER TWENTY TWO
+3253;ID # CIRCLED NUMBER TWENTY THREE
+3254;ID # CIRCLED NUMBER TWENTY FOUR
+3255;ID # CIRCLED NUMBER TWENTY FIVE
+3256;ID # CIRCLED NUMBER TWENTY SIX
+3257;ID # CIRCLED NUMBER TWENTY SEVEN
+3258;ID # CIRCLED NUMBER TWENTY EIGHT
+3259;ID # CIRCLED NUMBER TWENTY NINE
+325A;ID # CIRCLED NUMBER THIRTY
+325B;ID # CIRCLED NUMBER THIRTY ONE
+325C;ID # CIRCLED NUMBER THIRTY TWO
+325D;ID # CIRCLED NUMBER THIRTY THREE
+325E;ID # CIRCLED NUMBER THIRTY FOUR
+325F;ID # CIRCLED NUMBER THIRTY FIVE
+3260;ID # CIRCLED HANGUL KIYEOK
+3261;ID # CIRCLED HANGUL NIEUN
+3262;ID # CIRCLED HANGUL TIKEUT
+3263;ID # CIRCLED HANGUL RIEUL
+3264;ID # CIRCLED HANGUL MIEUM
+3265;ID # CIRCLED HANGUL PIEUP
+3266;ID # CIRCLED HANGUL SIOS
+3267;ID # CIRCLED HANGUL IEUNG
+3268;ID # CIRCLED HANGUL CIEUC
+3269;ID # CIRCLED HANGUL CHIEUCH
+326A;ID # CIRCLED HANGUL KHIEUKH
+326B;ID # CIRCLED HANGUL THIEUTH
+326C;ID # CIRCLED HANGUL PHIEUPH
+326D;ID # CIRCLED HANGUL HIEUH
+326E;ID # CIRCLED HANGUL KIYEOK A
+326F;ID # CIRCLED HANGUL NIEUN A
+3270;ID # CIRCLED HANGUL TIKEUT A
+3271;ID # CIRCLED HANGUL RIEUL A
+3272;ID # CIRCLED HANGUL MIEUM A
+3273;ID # CIRCLED HANGUL PIEUP A
+3274;ID # CIRCLED HANGUL SIOS A
+3275;ID # CIRCLED HANGUL IEUNG A
+3276;ID # CIRCLED HANGUL CIEUC A
+3277;ID # CIRCLED HANGUL CHIEUCH A
+3278;ID # CIRCLED HANGUL KHIEUKH A
+3279;ID # CIRCLED HANGUL THIEUTH A
+327A;ID # CIRCLED HANGUL PHIEUPH A
+327B;ID # CIRCLED HANGUL HIEUH A
+327C;ID # CIRCLED KOREAN CHARACTER CHAMKO
+327D;ID # CIRCLED KOREAN CHARACTER JUEUI
+327E;ID # CIRCLED HANGUL IEUNG U
+327F;ID # KOREAN STANDARD SYMBOL
+3280;ID # CIRCLED IDEOGRAPH ONE
+3281;ID # CIRCLED IDEOGRAPH TWO
+3282;ID # CIRCLED IDEOGRAPH THREE
+3283;ID # CIRCLED IDEOGRAPH FOUR
+3284;ID # CIRCLED IDEOGRAPH FIVE
+3285;ID # CIRCLED IDEOGRAPH SIX
+3286;ID # CIRCLED IDEOGRAPH SEVEN
+3287;ID # CIRCLED IDEOGRAPH EIGHT
+3288;ID # CIRCLED IDEOGRAPH NINE
+3289;ID # CIRCLED IDEOGRAPH TEN
+328A;ID # CIRCLED IDEOGRAPH MOON
+328B;ID # CIRCLED IDEOGRAPH FIRE
+328C;ID # CIRCLED IDEOGRAPH WATER
+328D;ID # CIRCLED IDEOGRAPH WOOD
+328E;ID # CIRCLED IDEOGRAPH METAL
+328F;ID # CIRCLED IDEOGRAPH EARTH
+3290;ID # CIRCLED IDEOGRAPH SUN
+3291;ID # CIRCLED IDEOGRAPH STOCK
+3292;ID # CIRCLED IDEOGRAPH HAVE
+3293;ID # CIRCLED IDEOGRAPH SOCIETY
+3294;ID # CIRCLED IDEOGRAPH NAME
+3295;ID # CIRCLED IDEOGRAPH SPECIAL
+3296;ID # CIRCLED IDEOGRAPH FINANCIAL
+3297;ID # CIRCLED IDEOGRAPH CONGRATULATION
+3298;ID # CIRCLED IDEOGRAPH LABOR
+3299;ID # CIRCLED IDEOGRAPH SECRET
+329A;ID # CIRCLED IDEOGRAPH MALE
+329B;ID # CIRCLED IDEOGRAPH FEMALE
+329C;ID # CIRCLED IDEOGRAPH SUITABLE
+329D;ID # CIRCLED IDEOGRAPH EXCELLENT
+329E;ID # CIRCLED IDEOGRAPH PRINT
+329F;ID # CIRCLED IDEOGRAPH ATTENTION
+32A0;ID # CIRCLED IDEOGRAPH ITEM
+32A1;ID # CIRCLED IDEOGRAPH REST
+32A2;ID # CIRCLED IDEOGRAPH COPY
+32A3;ID # CIRCLED IDEOGRAPH CORRECT
+32A4;ID # CIRCLED IDEOGRAPH HIGH
+32A5;ID # CIRCLED IDEOGRAPH CENTRE
+32A6;ID # CIRCLED IDEOGRAPH LOW
+32A7;ID # CIRCLED IDEOGRAPH LEFT
+32A8;ID # CIRCLED IDEOGRAPH RIGHT
+32A9;ID # CIRCLED IDEOGRAPH MEDICINE
+32AA;ID # CIRCLED IDEOGRAPH RELIGION
+32AB;ID # CIRCLED IDEOGRAPH STUDY
+32AC;ID # CIRCLED IDEOGRAPH SUPERVISE
+32AD;ID # CIRCLED IDEOGRAPH ENTERPRISE
+32AE;ID # CIRCLED IDEOGRAPH RESOURCE
+32AF;ID # CIRCLED IDEOGRAPH ALLIANCE
+32B0;ID # CIRCLED IDEOGRAPH NIGHT
+32B1;ID # CIRCLED NUMBER THIRTY SIX
+32B2;ID # CIRCLED NUMBER THIRTY SEVEN
+32B3;ID # CIRCLED NUMBER THIRTY EIGHT
+32B4;ID # CIRCLED NUMBER THIRTY NINE
+32B5;ID # CIRCLED NUMBER FORTY
+32B6;ID # CIRCLED NUMBER FORTY ONE
+32B7;ID # CIRCLED NUMBER FORTY TWO
+32B8;ID # CIRCLED NUMBER FORTY THREE
+32B9;ID # CIRCLED NUMBER FORTY FOUR
+32BA;ID # CIRCLED NUMBER FORTY FIVE
+32BB;ID # CIRCLED NUMBER FORTY SIX
+32BC;ID # CIRCLED NUMBER FORTY SEVEN
+32BD;ID # CIRCLED NUMBER FORTY EIGHT
+32BE;ID # CIRCLED NUMBER FORTY NINE
+32BF;ID # CIRCLED NUMBER FIFTY
+32C0;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+32C1;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+32C2;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+32C3;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+32C4;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+32C5;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+32C6;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+32C7;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+32C8;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+32C9;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+32CA;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+32CB;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32CC;ID # SQUARE HG
+32CD;ID # SQUARE ERG
+32CE;ID # SQUARE EV
+32CF;ID # LIMITED LIABILITY SIGN
+32D0;ID # CIRCLED KATAKANA A
+32D1;ID # CIRCLED KATAKANA I
+32D2;ID # CIRCLED KATAKANA U
+32D3;ID # CIRCLED KATAKANA E
+32D4;ID # CIRCLED KATAKANA O
+32D5;ID # CIRCLED KATAKANA KA
+32D6;ID # CIRCLED KATAKANA KI
+32D7;ID # CIRCLED KATAKANA KU
+32D8;ID # CIRCLED KATAKANA KE
+32D9;ID # CIRCLED KATAKANA KO
+32DA;ID # CIRCLED KATAKANA SA
+32DB;ID # CIRCLED KATAKANA SI
+32DC;ID # CIRCLED KATAKANA SU
+32DD;ID # CIRCLED KATAKANA SE
+32DE;ID # CIRCLED KATAKANA SO
+32DF;ID # CIRCLED KATAKANA TA
+32E0;ID # CIRCLED KATAKANA TI
+32E1;ID # CIRCLED KATAKANA TU
+32E2;ID # CIRCLED KATAKANA TE
+32E3;ID # CIRCLED KATAKANA TO
+32E4;ID # CIRCLED KATAKANA NA
+32E5;ID # CIRCLED KATAKANA NI
+32E6;ID # CIRCLED KATAKANA NU
+32E7;ID # CIRCLED KATAKANA NE
+32E8;ID # CIRCLED KATAKANA NO
+32E9;ID # CIRCLED KATAKANA HA
+32EA;ID # CIRCLED KATAKANA HI
+32EB;ID # CIRCLED KATAKANA HU
+32EC;ID # CIRCLED KATAKANA HE
+32ED;ID # CIRCLED KATAKANA HO
+32EE;ID # CIRCLED KATAKANA MA
+32EF;ID # CIRCLED KATAKANA MI
+32F0;ID # CIRCLED KATAKANA MU
+32F1;ID # CIRCLED KATAKANA ME
+32F2;ID # CIRCLED KATAKANA MO
+32F3;ID # CIRCLED KATAKANA YA
+32F4;ID # CIRCLED KATAKANA YU
+32F5;ID # CIRCLED KATAKANA YO
+32F6;ID # CIRCLED KATAKANA RA
+32F7;ID # CIRCLED KATAKANA RI
+32F8;ID # CIRCLED KATAKANA RU
+32F9;ID # CIRCLED KATAKANA RE
+32FA;ID # CIRCLED KATAKANA RO
+32FB;ID # CIRCLED KATAKANA WA
+32FC;ID # CIRCLED KATAKANA WI
+32FD;ID # CIRCLED KATAKANA WE
+32FE;ID # CIRCLED KATAKANA WO
+3300;ID # SQUARE APAATO
+3301;ID # SQUARE ARUHUA
+3302;ID # SQUARE ANPEA
+3303;ID # SQUARE AARU
+3304;ID # SQUARE ININGU
+3305;ID # SQUARE INTI
+3306;ID # SQUARE UON
+3307;ID # SQUARE ESUKUUDO
+3308;ID # SQUARE EEKAA
+3309;ID # SQUARE ONSU
+330A;ID # SQUARE OOMU
+330B;ID # SQUARE KAIRI
+330C;ID # SQUARE KARATTO
+330D;ID # SQUARE KARORII
+330E;ID # SQUARE GARON
+330F;ID # SQUARE GANMA
+3310;ID # SQUARE GIGA
+3311;ID # SQUARE GINII
+3312;ID # SQUARE KYURII
+3313;ID # SQUARE GIRUDAA
+3314;ID # SQUARE KIRO
+3315;ID # SQUARE KIROGURAMU
+3316;ID # SQUARE KIROMEETORU
+3317;ID # SQUARE KIROWATTO
+3318;ID # SQUARE GURAMU
+3319;ID # SQUARE GURAMUTON
+331A;ID # SQUARE KURUZEIRO
+331B;ID # SQUARE KUROONE
+331C;ID # SQUARE KEESU
+331D;ID # SQUARE KORUNA
+331E;ID # SQUARE KOOPO
+331F;ID # SQUARE SAIKURU
+3320;ID # SQUARE SANTIIMU
+3321;ID # SQUARE SIRINGU
+3322;ID # SQUARE SENTI
+3323;ID # SQUARE SENTO
+3324;ID # SQUARE DAASU
+3325;ID # SQUARE DESI
+3326;ID # SQUARE DORU
+3327;ID # SQUARE TON
+3328;ID # SQUARE NANO
+3329;ID # SQUARE NOTTO
+332A;ID # SQUARE HAITU
+332B;ID # SQUARE PAASENTO
+332C;ID # SQUARE PAATU
+332D;ID # SQUARE BAARERU
+332E;ID # SQUARE PIASUTORU
+332F;ID # SQUARE PIKURU
+3330;ID # SQUARE PIKO
+3331;ID # SQUARE BIRU
+3332;ID # SQUARE HUARADDO
+3333;ID # SQUARE HUIITO
+3334;ID # SQUARE BUSSYERU
+3335;ID # SQUARE HURAN
+3336;ID # SQUARE HEKUTAARU
+3337;ID # SQUARE PESO
+3338;ID # SQUARE PENIHI
+3339;ID # SQUARE HERUTU
+333A;ID # SQUARE PENSU
+333B;ID # SQUARE PEEZI
+333C;ID # SQUARE BEETA
+333D;ID # SQUARE POINTO
+333E;ID # SQUARE BORUTO
+333F;ID # SQUARE HON
+3340;ID # SQUARE PONDO
+3341;ID # SQUARE HOORU
+3342;ID # SQUARE HOON
+3343;ID # SQUARE MAIKURO
+3344;ID # SQUARE MAIRU
+3345;ID # SQUARE MAHHA
+3346;ID # SQUARE MARUKU
+3347;ID # SQUARE MANSYON
+3348;ID # SQUARE MIKURON
+3349;ID # SQUARE MIRI
+334A;ID # SQUARE MIRIBAARU
+334B;ID # SQUARE MEGA
+334C;ID # SQUARE MEGATON
+334D;ID # SQUARE MEETORU
+334E;ID # SQUARE YAADO
+334F;ID # SQUARE YAARU
+3350;ID # SQUARE YUAN
+3351;ID # SQUARE RITTORU
+3352;ID # SQUARE RIRA
+3353;ID # SQUARE RUPII
+3354;ID # SQUARE RUUBURU
+3355;ID # SQUARE REMU
+3356;ID # SQUARE RENTOGEN
+3357;ID # SQUARE WATTO
+3358;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+3359;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+335A;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+335B;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+335C;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+335D;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+335E;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+335F;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+3360;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+3361;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+3362;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+3363;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+3364;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+3365;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+3366;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+3367;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+3368;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+3369;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+336A;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+336B;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+336C;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+336D;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+336E;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+336F;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+3370;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+3371;ID # SQUARE HPA
+3372;ID # SQUARE DA
+3373;ID # SQUARE AU
+3374;ID # SQUARE BAR
+3375;ID # SQUARE OV
+3376;ID # SQUARE PC
+3377;ID # SQUARE DM
+3378;ID # SQUARE DM SQUARED
+3379;ID # SQUARE DM CUBED
+337A;ID # SQUARE IU
+337B;ID # SQUARE ERA NAME HEISEI
+337C;ID # SQUARE ERA NAME SYOUWA
+337D;ID # SQUARE ERA NAME TAISYOU
+337E;ID # SQUARE ERA NAME MEIZI
+337F;ID # SQUARE CORPORATION
+3380;ID # SQUARE PA AMPS
+3381;ID # SQUARE NA
+3382;ID # SQUARE MU A
+3383;ID # SQUARE MA
+3384;ID # SQUARE KA
+3385;ID # SQUARE KB
+3386;ID # SQUARE MB
+3387;ID # SQUARE GB
+3388;ID # SQUARE CAL
+3389;ID # SQUARE KCAL
+338A;ID # SQUARE PF
+338B;ID # SQUARE NF
+338C;ID # SQUARE MU F
+338D;ID # SQUARE MU G
+338E;ID # SQUARE MG
+338F;ID # SQUARE KG
+3390;ID # SQUARE HZ
+3391;ID # SQUARE KHZ
+3392;ID # SQUARE MHZ
+3393;ID # SQUARE GHZ
+3394;ID # SQUARE THZ
+3395;ID # SQUARE MU L
+3396;ID # SQUARE ML
+3397;ID # SQUARE DL
+3398;ID # SQUARE KL
+3399;ID # SQUARE FM
+339A;ID # SQUARE NM
+339B;ID # SQUARE MU M
+339C;ID # SQUARE MM
+339D;ID # SQUARE CM
+339E;ID # SQUARE KM
+339F;ID # SQUARE MM SQUARED
+33A0;ID # SQUARE CM SQUARED
+33A1;ID # SQUARE M SQUARED
+33A2;ID # SQUARE KM SQUARED
+33A3;ID # SQUARE MM CUBED
+33A4;ID # SQUARE CM CUBED
+33A5;ID # SQUARE M CUBED
+33A6;ID # SQUARE KM CUBED
+33A7;ID # SQUARE M OVER S
+33A8;ID # SQUARE M OVER S SQUARED
+33A9;ID # SQUARE PA
+33AA;ID # SQUARE KPA
+33AB;ID # SQUARE MPA
+33AC;ID # SQUARE GPA
+33AD;ID # SQUARE RAD
+33AE;ID # SQUARE RAD OVER S
+33AF;ID # SQUARE RAD OVER S SQUARED
+33B0;ID # SQUARE PS
+33B1;ID # SQUARE NS
+33B2;ID # SQUARE MU S
+33B3;ID # SQUARE MS
+33B4;ID # SQUARE PV
+33B5;ID # SQUARE NV
+33B6;ID # SQUARE MU V
+33B7;ID # SQUARE MV
+33B8;ID # SQUARE KV
+33B9;ID # SQUARE MV MEGA
+33BA;ID # SQUARE PW
+33BB;ID # SQUARE NW
+33BC;ID # SQUARE MU W
+33BD;ID # SQUARE MW
+33BE;ID # SQUARE KW
+33BF;ID # SQUARE MW MEGA
+33C0;ID # SQUARE K OHM
+33C1;ID # SQUARE M OHM
+33C2;ID # SQUARE AM
+33C3;ID # SQUARE BQ
+33C4;ID # SQUARE CC
+33C5;ID # SQUARE CD
+33C6;ID # SQUARE C OVER KG
+33C7;ID # SQUARE CO
+33C8;ID # SQUARE DB
+33C9;ID # SQUARE GY
+33CA;ID # SQUARE HA
+33CB;ID # SQUARE HP
+33CC;ID # SQUARE IN
+33CD;ID # SQUARE KK
+33CE;ID # SQUARE KM CAPITAL
+33CF;ID # SQUARE KT
+33D0;ID # SQUARE LM
+33D1;ID # SQUARE LN
+33D2;ID # SQUARE LOG
+33D3;ID # SQUARE LX
+33D4;ID # SQUARE MB SMALL
+33D5;ID # SQUARE MIL
+33D6;ID # SQUARE MOL
+33D7;ID # SQUARE PH
+33D8;ID # SQUARE PM
+33D9;ID # SQUARE PPM
+33DA;ID # SQUARE PR
+33DB;ID # SQUARE SR
+33DC;ID # SQUARE SV
+33DD;ID # SQUARE WB
+33DE;ID # SQUARE V OVER M
+33DF;ID # SQUARE A OVER M
+33E0;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+33E1;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+33E2;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+33E3;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+33E4;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+33E5;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+33E6;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+33E7;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+33E8;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+33E9;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+33EA;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+33EB;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+33EC;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+33ED;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+33EE;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+33EF;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+33F0;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+33F1;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+33F2;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+33F3;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+33F4;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+33F5;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+33F6;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+33F7;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+33F8;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+33F9;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+33FA;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+33FB;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+33FC;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+33FD;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+33FE;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+33FF;ID # SQUARE GAL
+3400..4DB5;ID # <CJK Ideograph Extension A, First>..<CJK Ideograph Extension A, Last>
+4DC0;AL # HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1;AL # HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2;AL # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3;AL # HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4;AL # HEXAGRAM FOR WAITING
+4DC5;AL # HEXAGRAM FOR CONFLICT
+4DC6;AL # HEXAGRAM FOR THE ARMY
+4DC7;AL # HEXAGRAM FOR HOLDING TOGETHER
+4DC8;AL # HEXAGRAM FOR SMALL TAMING
+4DC9;AL # HEXAGRAM FOR TREADING
+4DCA;AL # HEXAGRAM FOR PEACE
+4DCB;AL # HEXAGRAM FOR STANDSTILL
+4DCC;AL # HEXAGRAM FOR FELLOWSHIP
+4DCD;AL # HEXAGRAM FOR GREAT POSSESSION
+4DCE;AL # HEXAGRAM FOR MODESTY
+4DCF;AL # HEXAGRAM FOR ENTHUSIASM
+4DD0;AL # HEXAGRAM FOR FOLLOWING
+4DD1;AL # HEXAGRAM FOR WORK ON THE DECAYED
+4DD2;AL # HEXAGRAM FOR APPROACH
+4DD3;AL # HEXAGRAM FOR CONTEMPLATION
+4DD4;AL # HEXAGRAM FOR BITING THROUGH
+4DD5;AL # HEXAGRAM FOR GRACE
+4DD6;AL # HEXAGRAM FOR SPLITTING APART
+4DD7;AL # HEXAGRAM FOR RETURN
+4DD8;AL # HEXAGRAM FOR INNOCENCE
+4DD9;AL # HEXAGRAM FOR GREAT TAMING
+4DDA;AL # HEXAGRAM FOR MOUTH CORNERS
+4DDB;AL # HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC;AL # HEXAGRAM FOR THE ABYSMAL WATER
+4DDD;AL # HEXAGRAM FOR THE CLINGING FIRE
+4DDE;AL # HEXAGRAM FOR INFLUENCE
+4DDF;AL # HEXAGRAM FOR DURATION
+4DE0;AL # HEXAGRAM FOR RETREAT
+4DE1;AL # HEXAGRAM FOR GREAT POWER
+4DE2;AL # HEXAGRAM FOR PROGRESS
+4DE3;AL # HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4;AL # HEXAGRAM FOR THE FAMILY
+4DE5;AL # HEXAGRAM FOR OPPOSITION
+4DE6;AL # HEXAGRAM FOR OBSTRUCTION
+4DE7;AL # HEXAGRAM FOR DELIVERANCE
+4DE8;AL # HEXAGRAM FOR DECREASE
+4DE9;AL # HEXAGRAM FOR INCREASE
+4DEA;AL # HEXAGRAM FOR BREAKTHROUGH
+4DEB;AL # HEXAGRAM FOR COMING TO MEET
+4DEC;AL # HEXAGRAM FOR GATHERING TOGETHER
+4DED;AL # HEXAGRAM FOR PUSHING UPWARD
+4DEE;AL # HEXAGRAM FOR OPPRESSION
+4DEF;AL # HEXAGRAM FOR THE WELL
+4DF0;AL # HEXAGRAM FOR REVOLUTION
+4DF1;AL # HEXAGRAM FOR THE CAULDRON
+4DF2;AL # HEXAGRAM FOR THE AROUSING THUNDER
+4DF3;AL # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4;AL # HEXAGRAM FOR DEVELOPMENT
+4DF5;AL # HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6;AL # HEXAGRAM FOR ABUNDANCE
+4DF7;AL # HEXAGRAM FOR THE WANDERER
+4DF8;AL # HEXAGRAM FOR THE GENTLE WIND
+4DF9;AL # HEXAGRAM FOR THE JOYOUS LAKE
+4DFA;AL # HEXAGRAM FOR DISPERSION
+4DFB;AL # HEXAGRAM FOR LIMITATION
+4DFC;AL # HEXAGRAM FOR INNER TRUTH
+4DFD;AL # HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE;AL # HEXAGRAM FOR AFTER COMPLETION
+4DFF;AL # HEXAGRAM FOR BEFORE COMPLETION
+4E00..9FC3;ID # <CJK Ideograph, First>..<CJK Ideograph, Last>
+A000;ID # YI SYLLABLE IT
+A001;ID # YI SYLLABLE IX
+A002;ID # YI SYLLABLE I
+A003;ID # YI SYLLABLE IP
+A004;ID # YI SYLLABLE IET
+A005;ID # YI SYLLABLE IEX
+A006;ID # YI SYLLABLE IE
+A007;ID # YI SYLLABLE IEP
+A008;ID # YI SYLLABLE AT
+A009;ID # YI SYLLABLE AX
+A00A;ID # YI SYLLABLE A
+A00B;ID # YI SYLLABLE AP
+A00C;ID # YI SYLLABLE UOX
+A00D;ID # YI SYLLABLE UO
+A00E;ID # YI SYLLABLE UOP
+A00F;ID # YI SYLLABLE OT
+A010;ID # YI SYLLABLE OX
+A011;ID # YI SYLLABLE O
+A012;ID # YI SYLLABLE OP
+A013;ID # YI SYLLABLE EX
+A014;ID # YI SYLLABLE E
+A015;NS # YI SYLLABLE WU
+A016;ID # YI SYLLABLE BIT
+A017;ID # YI SYLLABLE BIX
+A018;ID # YI SYLLABLE BI
+A019;ID # YI SYLLABLE BIP
+A01A;ID # YI SYLLABLE BIET
+A01B;ID # YI SYLLABLE BIEX
+A01C;ID # YI SYLLABLE BIE
+A01D;ID # YI SYLLABLE BIEP
+A01E;ID # YI SYLLABLE BAT
+A01F;ID # YI SYLLABLE BAX
+A020;ID # YI SYLLABLE BA
+A021;ID # YI SYLLABLE BAP
+A022;ID # YI SYLLABLE BUOX
+A023;ID # YI SYLLABLE BUO
+A024;ID # YI SYLLABLE BUOP
+A025;ID # YI SYLLABLE BOT
+A026;ID # YI SYLLABLE BOX
+A027;ID # YI SYLLABLE BO
+A028;ID # YI SYLLABLE BOP
+A029;ID # YI SYLLABLE BEX
+A02A;ID # YI SYLLABLE BE
+A02B;ID # YI SYLLABLE BEP
+A02C;ID # YI SYLLABLE BUT
+A02D;ID # YI SYLLABLE BUX
+A02E;ID # YI SYLLABLE BU
+A02F;ID # YI SYLLABLE BUP
+A030;ID # YI SYLLABLE BURX
+A031;ID # YI SYLLABLE BUR
+A032;ID # YI SYLLABLE BYT
+A033;ID # YI SYLLABLE BYX
+A034;ID # YI SYLLABLE BY
+A035;ID # YI SYLLABLE BYP
+A036;ID # YI SYLLABLE BYRX
+A037;ID # YI SYLLABLE BYR
+A038;ID # YI SYLLABLE PIT
+A039;ID # YI SYLLABLE PIX
+A03A;ID # YI SYLLABLE PI
+A03B;ID # YI SYLLABLE PIP
+A03C;ID # YI SYLLABLE PIEX
+A03D;ID # YI SYLLABLE PIE
+A03E;ID # YI SYLLABLE PIEP
+A03F;ID # YI SYLLABLE PAT
+A040;ID # YI SYLLABLE PAX
+A041;ID # YI SYLLABLE PA
+A042;ID # YI SYLLABLE PAP
+A043;ID # YI SYLLABLE PUOX
+A044;ID # YI SYLLABLE PUO
+A045;ID # YI SYLLABLE PUOP
+A046;ID # YI SYLLABLE POT
+A047;ID # YI SYLLABLE POX
+A048;ID # YI SYLLABLE PO
+A049;ID # YI SYLLABLE POP
+A04A;ID # YI SYLLABLE PUT
+A04B;ID # YI SYLLABLE PUX
+A04C;ID # YI SYLLABLE PU
+A04D;ID # YI SYLLABLE PUP
+A04E;ID # YI SYLLABLE PURX
+A04F;ID # YI SYLLABLE PUR
+A050;ID # YI SYLLABLE PYT
+A051;ID # YI SYLLABLE PYX
+A052;ID # YI SYLLABLE PY
+A053;ID # YI SYLLABLE PYP
+A054;ID # YI SYLLABLE PYRX
+A055;ID # YI SYLLABLE PYR
+A056;ID # YI SYLLABLE BBIT
+A057;ID # YI SYLLABLE BBIX
+A058;ID # YI SYLLABLE BBI
+A059;ID # YI SYLLABLE BBIP
+A05A;ID # YI SYLLABLE BBIET
+A05B;ID # YI SYLLABLE BBIEX
+A05C;ID # YI SYLLABLE BBIE
+A05D;ID # YI SYLLABLE BBIEP
+A05E;ID # YI SYLLABLE BBAT
+A05F;ID # YI SYLLABLE BBAX
+A060;ID # YI SYLLABLE BBA
+A061;ID # YI SYLLABLE BBAP
+A062;ID # YI SYLLABLE BBUOX
+A063;ID # YI SYLLABLE BBUO
+A064;ID # YI SYLLABLE BBUOP
+A065;ID # YI SYLLABLE BBOT
+A066;ID # YI SYLLABLE BBOX
+A067;ID # YI SYLLABLE BBO
+A068;ID # YI SYLLABLE BBOP
+A069;ID # YI SYLLABLE BBEX
+A06A;ID # YI SYLLABLE BBE
+A06B;ID # YI SYLLABLE BBEP
+A06C;ID # YI SYLLABLE BBUT
+A06D;ID # YI SYLLABLE BBUX
+A06E;ID # YI SYLLABLE BBU
+A06F;ID # YI SYLLABLE BBUP
+A070;ID # YI SYLLABLE BBURX
+A071;ID # YI SYLLABLE BBUR
+A072;ID # YI SYLLABLE BBYT
+A073;ID # YI SYLLABLE BBYX
+A074;ID # YI SYLLABLE BBY
+A075;ID # YI SYLLABLE BBYP
+A076;ID # YI SYLLABLE NBIT
+A077;ID # YI SYLLABLE NBIX
+A078;ID # YI SYLLABLE NBI
+A079;ID # YI SYLLABLE NBIP
+A07A;ID # YI SYLLABLE NBIEX
+A07B;ID # YI SYLLABLE NBIE
+A07C;ID # YI SYLLABLE NBIEP
+A07D;ID # YI SYLLABLE NBAT
+A07E;ID # YI SYLLABLE NBAX
+A07F;ID # YI SYLLABLE NBA
+A080;ID # YI SYLLABLE NBAP
+A081;ID # YI SYLLABLE NBOT
+A082;ID # YI SYLLABLE NBOX
+A083;ID # YI SYLLABLE NBO
+A084;ID # YI SYLLABLE NBOP
+A085;ID # YI SYLLABLE NBUT
+A086;ID # YI SYLLABLE NBUX
+A087;ID # YI SYLLABLE NBU
+A088;ID # YI SYLLABLE NBUP
+A089;ID # YI SYLLABLE NBURX
+A08A;ID # YI SYLLABLE NBUR
+A08B;ID # YI SYLLABLE NBYT
+A08C;ID # YI SYLLABLE NBYX
+A08D;ID # YI SYLLABLE NBY
+A08E;ID # YI SYLLABLE NBYP
+A08F;ID # YI SYLLABLE NBYRX
+A090;ID # YI SYLLABLE NBYR
+A091;ID # YI SYLLABLE HMIT
+A092;ID # YI SYLLABLE HMIX
+A093;ID # YI SYLLABLE HMI
+A094;ID # YI SYLLABLE HMIP
+A095;ID # YI SYLLABLE HMIEX
+A096;ID # YI SYLLABLE HMIE
+A097;ID # YI SYLLABLE HMIEP
+A098;ID # YI SYLLABLE HMAT
+A099;ID # YI SYLLABLE HMAX
+A09A;ID # YI SYLLABLE HMA
+A09B;ID # YI SYLLABLE HMAP
+A09C;ID # YI SYLLABLE HMUOX
+A09D;ID # YI SYLLABLE HMUO
+A09E;ID # YI SYLLABLE HMUOP
+A09F;ID # YI SYLLABLE HMOT
+A0A0;ID # YI SYLLABLE HMOX
+A0A1;ID # YI SYLLABLE HMO
+A0A2;ID # YI SYLLABLE HMOP
+A0A3;ID # YI SYLLABLE HMUT
+A0A4;ID # YI SYLLABLE HMUX
+A0A5;ID # YI SYLLABLE HMU
+A0A6;ID # YI SYLLABLE HMUP
+A0A7;ID # YI SYLLABLE HMURX
+A0A8;ID # YI SYLLABLE HMUR
+A0A9;ID # YI SYLLABLE HMYX
+A0AA;ID # YI SYLLABLE HMY
+A0AB;ID # YI SYLLABLE HMYP
+A0AC;ID # YI SYLLABLE HMYRX
+A0AD;ID # YI SYLLABLE HMYR
+A0AE;ID # YI SYLLABLE MIT
+A0AF;ID # YI SYLLABLE MIX
+A0B0;ID # YI SYLLABLE MI
+A0B1;ID # YI SYLLABLE MIP
+A0B2;ID # YI SYLLABLE MIEX
+A0B3;ID # YI SYLLABLE MIE
+A0B4;ID # YI SYLLABLE MIEP
+A0B5;ID # YI SYLLABLE MAT
+A0B6;ID # YI SYLLABLE MAX
+A0B7;ID # YI SYLLABLE MA
+A0B8;ID # YI SYLLABLE MAP
+A0B9;ID # YI SYLLABLE MUOT
+A0BA;ID # YI SYLLABLE MUOX
+A0BB;ID # YI SYLLABLE MUO
+A0BC;ID # YI SYLLABLE MUOP
+A0BD;ID # YI SYLLABLE MOT
+A0BE;ID # YI SYLLABLE MOX
+A0BF;ID # YI SYLLABLE MO
+A0C0;ID # YI SYLLABLE MOP
+A0C1;ID # YI SYLLABLE MEX
+A0C2;ID # YI SYLLABLE ME
+A0C3;ID # YI SYLLABLE MUT
+A0C4;ID # YI SYLLABLE MUX
+A0C5;ID # YI SYLLABLE MU
+A0C6;ID # YI SYLLABLE MUP
+A0C7;ID # YI SYLLABLE MURX
+A0C8;ID # YI SYLLABLE MUR
+A0C9;ID # YI SYLLABLE MYT
+A0CA;ID # YI SYLLABLE MYX
+A0CB;ID # YI SYLLABLE MY
+A0CC;ID # YI SYLLABLE MYP
+A0CD;ID # YI SYLLABLE FIT
+A0CE;ID # YI SYLLABLE FIX
+A0CF;ID # YI SYLLABLE FI
+A0D0;ID # YI SYLLABLE FIP
+A0D1;ID # YI SYLLABLE FAT
+A0D2;ID # YI SYLLABLE FAX
+A0D3;ID # YI SYLLABLE FA
+A0D4;ID # YI SYLLABLE FAP
+A0D5;ID # YI SYLLABLE FOX
+A0D6;ID # YI SYLLABLE FO
+A0D7;ID # YI SYLLABLE FOP
+A0D8;ID # YI SYLLABLE FUT
+A0D9;ID # YI SYLLABLE FUX
+A0DA;ID # YI SYLLABLE FU
+A0DB;ID # YI SYLLABLE FUP
+A0DC;ID # YI SYLLABLE FURX
+A0DD;ID # YI SYLLABLE FUR
+A0DE;ID # YI SYLLABLE FYT
+A0DF;ID # YI SYLLABLE FYX
+A0E0;ID # YI SYLLABLE FY
+A0E1;ID # YI SYLLABLE FYP
+A0E2;ID # YI SYLLABLE VIT
+A0E3;ID # YI SYLLABLE VIX
+A0E4;ID # YI SYLLABLE VI
+A0E5;ID # YI SYLLABLE VIP
+A0E6;ID # YI SYLLABLE VIET
+A0E7;ID # YI SYLLABLE VIEX
+A0E8;ID # YI SYLLABLE VIE
+A0E9;ID # YI SYLLABLE VIEP
+A0EA;ID # YI SYLLABLE VAT
+A0EB;ID # YI SYLLABLE VAX
+A0EC;ID # YI SYLLABLE VA
+A0ED;ID # YI SYLLABLE VAP
+A0EE;ID # YI SYLLABLE VOT
+A0EF;ID # YI SYLLABLE VOX
+A0F0;ID # YI SYLLABLE VO
+A0F1;ID # YI SYLLABLE VOP
+A0F2;ID # YI SYLLABLE VEX
+A0F3;ID # YI SYLLABLE VEP
+A0F4;ID # YI SYLLABLE VUT
+A0F5;ID # YI SYLLABLE VUX
+A0F6;ID # YI SYLLABLE VU
+A0F7;ID # YI SYLLABLE VUP
+A0F8;ID # YI SYLLABLE VURX
+A0F9;ID # YI SYLLABLE VUR
+A0FA;ID # YI SYLLABLE VYT
+A0FB;ID # YI SYLLABLE VYX
+A0FC;ID # YI SYLLABLE VY
+A0FD;ID # YI SYLLABLE VYP
+A0FE;ID # YI SYLLABLE VYRX
+A0FF;ID # YI SYLLABLE VYR
+A100;ID # YI SYLLABLE DIT
+A101;ID # YI SYLLABLE DIX
+A102;ID # YI SYLLABLE DI
+A103;ID # YI SYLLABLE DIP
+A104;ID # YI SYLLABLE DIEX
+A105;ID # YI SYLLABLE DIE
+A106;ID # YI SYLLABLE DIEP
+A107;ID # YI SYLLABLE DAT
+A108;ID # YI SYLLABLE DAX
+A109;ID # YI SYLLABLE DA
+A10A;ID # YI SYLLABLE DAP
+A10B;ID # YI SYLLABLE DUOX
+A10C;ID # YI SYLLABLE DUO
+A10D;ID # YI SYLLABLE DOT
+A10E;ID # YI SYLLABLE DOX
+A10F;ID # YI SYLLABLE DO
+A110;ID # YI SYLLABLE DOP
+A111;ID # YI SYLLABLE DEX
+A112;ID # YI SYLLABLE DE
+A113;ID # YI SYLLABLE DEP
+A114;ID # YI SYLLABLE DUT
+A115;ID # YI SYLLABLE DUX
+A116;ID # YI SYLLABLE DU
+A117;ID # YI SYLLABLE DUP
+A118;ID # YI SYLLABLE DURX
+A119;ID # YI SYLLABLE DUR
+A11A;ID # YI SYLLABLE TIT
+A11B;ID # YI SYLLABLE TIX
+A11C;ID # YI SYLLABLE TI
+A11D;ID # YI SYLLABLE TIP
+A11E;ID # YI SYLLABLE TIEX
+A11F;ID # YI SYLLABLE TIE
+A120;ID # YI SYLLABLE TIEP
+A121;ID # YI SYLLABLE TAT
+A122;ID # YI SYLLABLE TAX
+A123;ID # YI SYLLABLE TA
+A124;ID # YI SYLLABLE TAP
+A125;ID # YI SYLLABLE TUOT
+A126;ID # YI SYLLABLE TUOX
+A127;ID # YI SYLLABLE TUO
+A128;ID # YI SYLLABLE TUOP
+A129;ID # YI SYLLABLE TOT
+A12A;ID # YI SYLLABLE TOX
+A12B;ID # YI SYLLABLE TO
+A12C;ID # YI SYLLABLE TOP
+A12D;ID # YI SYLLABLE TEX
+A12E;ID # YI SYLLABLE TE
+A12F;ID # YI SYLLABLE TEP
+A130;ID # YI SYLLABLE TUT
+A131;ID # YI SYLLABLE TUX
+A132;ID # YI SYLLABLE TU
+A133;ID # YI SYLLABLE TUP
+A134;ID # YI SYLLABLE TURX
+A135;ID # YI SYLLABLE TUR
+A136;ID # YI SYLLABLE DDIT
+A137;ID # YI SYLLABLE DDIX
+A138;ID # YI SYLLABLE DDI
+A139;ID # YI SYLLABLE DDIP
+A13A;ID # YI SYLLABLE DDIEX
+A13B;ID # YI SYLLABLE DDIE
+A13C;ID # YI SYLLABLE DDIEP
+A13D;ID # YI SYLLABLE DDAT
+A13E;ID # YI SYLLABLE DDAX
+A13F;ID # YI SYLLABLE DDA
+A140;ID # YI SYLLABLE DDAP
+A141;ID # YI SYLLABLE DDUOX
+A142;ID # YI SYLLABLE DDUO
+A143;ID # YI SYLLABLE DDUOP
+A144;ID # YI SYLLABLE DDOT
+A145;ID # YI SYLLABLE DDOX
+A146;ID # YI SYLLABLE DDO
+A147;ID # YI SYLLABLE DDOP
+A148;ID # YI SYLLABLE DDEX
+A149;ID # YI SYLLABLE DDE
+A14A;ID # YI SYLLABLE DDEP
+A14B;ID # YI SYLLABLE DDUT
+A14C;ID # YI SYLLABLE DDUX
+A14D;ID # YI SYLLABLE DDU
+A14E;ID # YI SYLLABLE DDUP
+A14F;ID # YI SYLLABLE DDURX
+A150;ID # YI SYLLABLE DDUR
+A151;ID # YI SYLLABLE NDIT
+A152;ID # YI SYLLABLE NDIX
+A153;ID # YI SYLLABLE NDI
+A154;ID # YI SYLLABLE NDIP
+A155;ID # YI SYLLABLE NDIEX
+A156;ID # YI SYLLABLE NDIE
+A157;ID # YI SYLLABLE NDAT
+A158;ID # YI SYLLABLE NDAX
+A159;ID # YI SYLLABLE NDA
+A15A;ID # YI SYLLABLE NDAP
+A15B;ID # YI SYLLABLE NDOT
+A15C;ID # YI SYLLABLE NDOX
+A15D;ID # YI SYLLABLE NDO
+A15E;ID # YI SYLLABLE NDOP
+A15F;ID # YI SYLLABLE NDEX
+A160;ID # YI SYLLABLE NDE
+A161;ID # YI SYLLABLE NDEP
+A162;ID # YI SYLLABLE NDUT
+A163;ID # YI SYLLABLE NDUX
+A164;ID # YI SYLLABLE NDU
+A165;ID # YI SYLLABLE NDUP
+A166;ID # YI SYLLABLE NDURX
+A167;ID # YI SYLLABLE NDUR
+A168;ID # YI SYLLABLE HNIT
+A169;ID # YI SYLLABLE HNIX
+A16A;ID # YI SYLLABLE HNI
+A16B;ID # YI SYLLABLE HNIP
+A16C;ID # YI SYLLABLE HNIET
+A16D;ID # YI SYLLABLE HNIEX
+A16E;ID # YI SYLLABLE HNIE
+A16F;ID # YI SYLLABLE HNIEP
+A170;ID # YI SYLLABLE HNAT
+A171;ID # YI SYLLABLE HNAX
+A172;ID # YI SYLLABLE HNA
+A173;ID # YI SYLLABLE HNAP
+A174;ID # YI SYLLABLE HNUOX
+A175;ID # YI SYLLABLE HNUO
+A176;ID # YI SYLLABLE HNOT
+A177;ID # YI SYLLABLE HNOX
+A178;ID # YI SYLLABLE HNOP
+A179;ID # YI SYLLABLE HNEX
+A17A;ID # YI SYLLABLE HNE
+A17B;ID # YI SYLLABLE HNEP
+A17C;ID # YI SYLLABLE HNUT
+A17D;ID # YI SYLLABLE NIT
+A17E;ID # YI SYLLABLE NIX
+A17F;ID # YI SYLLABLE NI
+A180;ID # YI SYLLABLE NIP
+A181;ID # YI SYLLABLE NIEX
+A182;ID # YI SYLLABLE NIE
+A183;ID # YI SYLLABLE NIEP
+A184;ID # YI SYLLABLE NAX
+A185;ID # YI SYLLABLE NA
+A186;ID # YI SYLLABLE NAP
+A187;ID # YI SYLLABLE NUOX
+A188;ID # YI SYLLABLE NUO
+A189;ID # YI SYLLABLE NUOP
+A18A;ID # YI SYLLABLE NOT
+A18B;ID # YI SYLLABLE NOX
+A18C;ID # YI SYLLABLE NO
+A18D;ID # YI SYLLABLE NOP
+A18E;ID # YI SYLLABLE NEX
+A18F;ID # YI SYLLABLE NE
+A190;ID # YI SYLLABLE NEP
+A191;ID # YI SYLLABLE NUT
+A192;ID # YI SYLLABLE NUX
+A193;ID # YI SYLLABLE NU
+A194;ID # YI SYLLABLE NUP
+A195;ID # YI SYLLABLE NURX
+A196;ID # YI SYLLABLE NUR
+A197;ID # YI SYLLABLE HLIT
+A198;ID # YI SYLLABLE HLIX
+A199;ID # YI SYLLABLE HLI
+A19A;ID # YI SYLLABLE HLIP
+A19B;ID # YI SYLLABLE HLIEX
+A19C;ID # YI SYLLABLE HLIE
+A19D;ID # YI SYLLABLE HLIEP
+A19E;ID # YI SYLLABLE HLAT
+A19F;ID # YI SYLLABLE HLAX
+A1A0;ID # YI SYLLABLE HLA
+A1A1;ID # YI SYLLABLE HLAP
+A1A2;ID # YI SYLLABLE HLUOX
+A1A3;ID # YI SYLLABLE HLUO
+A1A4;ID # YI SYLLABLE HLUOP
+A1A5;ID # YI SYLLABLE HLOX
+A1A6;ID # YI SYLLABLE HLO
+A1A7;ID # YI SYLLABLE HLOP
+A1A8;ID # YI SYLLABLE HLEX
+A1A9;ID # YI SYLLABLE HLE
+A1AA;ID # YI SYLLABLE HLEP
+A1AB;ID # YI SYLLABLE HLUT
+A1AC;ID # YI SYLLABLE HLUX
+A1AD;ID # YI SYLLABLE HLU
+A1AE;ID # YI SYLLABLE HLUP
+A1AF;ID # YI SYLLABLE HLURX
+A1B0;ID # YI SYLLABLE HLUR
+A1B1;ID # YI SYLLABLE HLYT
+A1B2;ID # YI SYLLABLE HLYX
+A1B3;ID # YI SYLLABLE HLY
+A1B4;ID # YI SYLLABLE HLYP
+A1B5;ID # YI SYLLABLE HLYRX
+A1B6;ID # YI SYLLABLE HLYR
+A1B7;ID # YI SYLLABLE LIT
+A1B8;ID # YI SYLLABLE LIX
+A1B9;ID # YI SYLLABLE LI
+A1BA;ID # YI SYLLABLE LIP
+A1BB;ID # YI SYLLABLE LIET
+A1BC;ID # YI SYLLABLE LIEX
+A1BD;ID # YI SYLLABLE LIE
+A1BE;ID # YI SYLLABLE LIEP
+A1BF;ID # YI SYLLABLE LAT
+A1C0;ID # YI SYLLABLE LAX
+A1C1;ID # YI SYLLABLE LA
+A1C2;ID # YI SYLLABLE LAP
+A1C3;ID # YI SYLLABLE LUOT
+A1C4;ID # YI SYLLABLE LUOX
+A1C5;ID # YI SYLLABLE LUO
+A1C6;ID # YI SYLLABLE LUOP
+A1C7;ID # YI SYLLABLE LOT
+A1C8;ID # YI SYLLABLE LOX
+A1C9;ID # YI SYLLABLE LO
+A1CA;ID # YI SYLLABLE LOP
+A1CB;ID # YI SYLLABLE LEX
+A1CC;ID # YI SYLLABLE LE
+A1CD;ID # YI SYLLABLE LEP
+A1CE;ID # YI SYLLABLE LUT
+A1CF;ID # YI SYLLABLE LUX
+A1D0;ID # YI SYLLABLE LU
+A1D1;ID # YI SYLLABLE LUP
+A1D2;ID # YI SYLLABLE LURX
+A1D3;ID # YI SYLLABLE LUR
+A1D4;ID # YI SYLLABLE LYT
+A1D5;ID # YI SYLLABLE LYX
+A1D6;ID # YI SYLLABLE LY
+A1D7;ID # YI SYLLABLE LYP
+A1D8;ID # YI SYLLABLE LYRX
+A1D9;ID # YI SYLLABLE LYR
+A1DA;ID # YI SYLLABLE GIT
+A1DB;ID # YI SYLLABLE GIX
+A1DC;ID # YI SYLLABLE GI
+A1DD;ID # YI SYLLABLE GIP
+A1DE;ID # YI SYLLABLE GIET
+A1DF;ID # YI SYLLABLE GIEX
+A1E0;ID # YI SYLLABLE GIE
+A1E1;ID # YI SYLLABLE GIEP
+A1E2;ID # YI SYLLABLE GAT
+A1E3;ID # YI SYLLABLE GAX
+A1E4;ID # YI SYLLABLE GA
+A1E5;ID # YI SYLLABLE GAP
+A1E6;ID # YI SYLLABLE GUOT
+A1E7;ID # YI SYLLABLE GUOX
+A1E8;ID # YI SYLLABLE GUO
+A1E9;ID # YI SYLLABLE GUOP
+A1EA;ID # YI SYLLABLE GOT
+A1EB;ID # YI SYLLABLE GOX
+A1EC;ID # YI SYLLABLE GO
+A1ED;ID # YI SYLLABLE GOP
+A1EE;ID # YI SYLLABLE GET
+A1EF;ID # YI SYLLABLE GEX
+A1F0;ID # YI SYLLABLE GE
+A1F1;ID # YI SYLLABLE GEP
+A1F2;ID # YI SYLLABLE GUT
+A1F3;ID # YI SYLLABLE GUX
+A1F4;ID # YI SYLLABLE GU
+A1F5;ID # YI SYLLABLE GUP
+A1F6;ID # YI SYLLABLE GURX
+A1F7;ID # YI SYLLABLE GUR
+A1F8;ID # YI SYLLABLE KIT
+A1F9;ID # YI SYLLABLE KIX
+A1FA;ID # YI SYLLABLE KI
+A1FB;ID # YI SYLLABLE KIP
+A1FC;ID # YI SYLLABLE KIEX
+A1FD;ID # YI SYLLABLE KIE
+A1FE;ID # YI SYLLABLE KIEP
+A1FF;ID # YI SYLLABLE KAT
+A200;ID # YI SYLLABLE KAX
+A201;ID # YI SYLLABLE KA
+A202;ID # YI SYLLABLE KAP
+A203;ID # YI SYLLABLE KUOX
+A204;ID # YI SYLLABLE KUO
+A205;ID # YI SYLLABLE KUOP
+A206;ID # YI SYLLABLE KOT
+A207;ID # YI SYLLABLE KOX
+A208;ID # YI SYLLABLE KO
+A209;ID # YI SYLLABLE KOP
+A20A;ID # YI SYLLABLE KET
+A20B;ID # YI SYLLABLE KEX
+A20C;ID # YI SYLLABLE KE
+A20D;ID # YI SYLLABLE KEP
+A20E;ID # YI SYLLABLE KUT
+A20F;ID # YI SYLLABLE KUX
+A210;ID # YI SYLLABLE KU
+A211;ID # YI SYLLABLE KUP
+A212;ID # YI SYLLABLE KURX
+A213;ID # YI SYLLABLE KUR
+A214;ID # YI SYLLABLE GGIT
+A215;ID # YI SYLLABLE GGIX
+A216;ID # YI SYLLABLE GGI
+A217;ID # YI SYLLABLE GGIEX
+A218;ID # YI SYLLABLE GGIE
+A219;ID # YI SYLLABLE GGIEP
+A21A;ID # YI SYLLABLE GGAT
+A21B;ID # YI SYLLABLE GGAX
+A21C;ID # YI SYLLABLE GGA
+A21D;ID # YI SYLLABLE GGAP
+A21E;ID # YI SYLLABLE GGUOT
+A21F;ID # YI SYLLABLE GGUOX
+A220;ID # YI SYLLABLE GGUO
+A221;ID # YI SYLLABLE GGUOP
+A222;ID # YI SYLLABLE GGOT
+A223;ID # YI SYLLABLE GGOX
+A224;ID # YI SYLLABLE GGO
+A225;ID # YI SYLLABLE GGOP
+A226;ID # YI SYLLABLE GGET
+A227;ID # YI SYLLABLE GGEX
+A228;ID # YI SYLLABLE GGE
+A229;ID # YI SYLLABLE GGEP
+A22A;ID # YI SYLLABLE GGUT
+A22B;ID # YI SYLLABLE GGUX
+A22C;ID # YI SYLLABLE GGU
+A22D;ID # YI SYLLABLE GGUP
+A22E;ID # YI SYLLABLE GGURX
+A22F;ID # YI SYLLABLE GGUR
+A230;ID # YI SYLLABLE MGIEX
+A231;ID # YI SYLLABLE MGIE
+A232;ID # YI SYLLABLE MGAT
+A233;ID # YI SYLLABLE MGAX
+A234;ID # YI SYLLABLE MGA
+A235;ID # YI SYLLABLE MGAP
+A236;ID # YI SYLLABLE MGUOX
+A237;ID # YI SYLLABLE MGUO
+A238;ID # YI SYLLABLE MGUOP
+A239;ID # YI SYLLABLE MGOT
+A23A;ID # YI SYLLABLE MGOX
+A23B;ID # YI SYLLABLE MGO
+A23C;ID # YI SYLLABLE MGOP
+A23D;ID # YI SYLLABLE MGEX
+A23E;ID # YI SYLLABLE MGE
+A23F;ID # YI SYLLABLE MGEP
+A240;ID # YI SYLLABLE MGUT
+A241;ID # YI SYLLABLE MGUX
+A242;ID # YI SYLLABLE MGU
+A243;ID # YI SYLLABLE MGUP
+A244;ID # YI SYLLABLE MGURX
+A245;ID # YI SYLLABLE MGUR
+A246;ID # YI SYLLABLE HXIT
+A247;ID # YI SYLLABLE HXIX
+A248;ID # YI SYLLABLE HXI
+A249;ID # YI SYLLABLE HXIP
+A24A;ID # YI SYLLABLE HXIET
+A24B;ID # YI SYLLABLE HXIEX
+A24C;ID # YI SYLLABLE HXIE
+A24D;ID # YI SYLLABLE HXIEP
+A24E;ID # YI SYLLABLE HXAT
+A24F;ID # YI SYLLABLE HXAX
+A250;ID # YI SYLLABLE HXA
+A251;ID # YI SYLLABLE HXAP
+A252;ID # YI SYLLABLE HXUOT
+A253;ID # YI SYLLABLE HXUOX
+A254;ID # YI SYLLABLE HXUO
+A255;ID # YI SYLLABLE HXUOP
+A256;ID # YI SYLLABLE HXOT
+A257;ID # YI SYLLABLE HXOX
+A258;ID # YI SYLLABLE HXO
+A259;ID # YI SYLLABLE HXOP
+A25A;ID # YI SYLLABLE HXEX
+A25B;ID # YI SYLLABLE HXE
+A25C;ID # YI SYLLABLE HXEP
+A25D;ID # YI SYLLABLE NGIEX
+A25E;ID # YI SYLLABLE NGIE
+A25F;ID # YI SYLLABLE NGIEP
+A260;ID # YI SYLLABLE NGAT
+A261;ID # YI SYLLABLE NGAX
+A262;ID # YI SYLLABLE NGA
+A263;ID # YI SYLLABLE NGAP
+A264;ID # YI SYLLABLE NGUOT
+A265;ID # YI SYLLABLE NGUOX
+A266;ID # YI SYLLABLE NGUO
+A267;ID # YI SYLLABLE NGOT
+A268;ID # YI SYLLABLE NGOX
+A269;ID # YI SYLLABLE NGO
+A26A;ID # YI SYLLABLE NGOP
+A26B;ID # YI SYLLABLE NGEX
+A26C;ID # YI SYLLABLE NGE
+A26D;ID # YI SYLLABLE NGEP
+A26E;ID # YI SYLLABLE HIT
+A26F;ID # YI SYLLABLE HIEX
+A270;ID # YI SYLLABLE HIE
+A271;ID # YI SYLLABLE HAT
+A272;ID # YI SYLLABLE HAX
+A273;ID # YI SYLLABLE HA
+A274;ID # YI SYLLABLE HAP
+A275;ID # YI SYLLABLE HUOT
+A276;ID # YI SYLLABLE HUOX
+A277;ID # YI SYLLABLE HUO
+A278;ID # YI SYLLABLE HUOP
+A279;ID # YI SYLLABLE HOT
+A27A;ID # YI SYLLABLE HOX
+A27B;ID # YI SYLLABLE HO
+A27C;ID # YI SYLLABLE HOP
+A27D;ID # YI SYLLABLE HEX
+A27E;ID # YI SYLLABLE HE
+A27F;ID # YI SYLLABLE HEP
+A280;ID # YI SYLLABLE WAT
+A281;ID # YI SYLLABLE WAX
+A282;ID # YI SYLLABLE WA
+A283;ID # YI SYLLABLE WAP
+A284;ID # YI SYLLABLE WUOX
+A285;ID # YI SYLLABLE WUO
+A286;ID # YI SYLLABLE WUOP
+A287;ID # YI SYLLABLE WOX
+A288;ID # YI SYLLABLE WO
+A289;ID # YI SYLLABLE WOP
+A28A;ID # YI SYLLABLE WEX
+A28B;ID # YI SYLLABLE WE
+A28C;ID # YI SYLLABLE WEP
+A28D;ID # YI SYLLABLE ZIT
+A28E;ID # YI SYLLABLE ZIX
+A28F;ID # YI SYLLABLE ZI
+A290;ID # YI SYLLABLE ZIP
+A291;ID # YI SYLLABLE ZIEX
+A292;ID # YI SYLLABLE ZIE
+A293;ID # YI SYLLABLE ZIEP
+A294;ID # YI SYLLABLE ZAT
+A295;ID # YI SYLLABLE ZAX
+A296;ID # YI SYLLABLE ZA
+A297;ID # YI SYLLABLE ZAP
+A298;ID # YI SYLLABLE ZUOX
+A299;ID # YI SYLLABLE ZUO
+A29A;ID # YI SYLLABLE ZUOP
+A29B;ID # YI SYLLABLE ZOT
+A29C;ID # YI SYLLABLE ZOX
+A29D;ID # YI SYLLABLE ZO
+A29E;ID # YI SYLLABLE ZOP
+A29F;ID # YI SYLLABLE ZEX
+A2A0;ID # YI SYLLABLE ZE
+A2A1;ID # YI SYLLABLE ZEP
+A2A2;ID # YI SYLLABLE ZUT
+A2A3;ID # YI SYLLABLE ZUX
+A2A4;ID # YI SYLLABLE ZU
+A2A5;ID # YI SYLLABLE ZUP
+A2A6;ID # YI SYLLABLE ZURX
+A2A7;ID # YI SYLLABLE ZUR
+A2A8;ID # YI SYLLABLE ZYT
+A2A9;ID # YI SYLLABLE ZYX
+A2AA;ID # YI SYLLABLE ZY
+A2AB;ID # YI SYLLABLE ZYP
+A2AC;ID # YI SYLLABLE ZYRX
+A2AD;ID # YI SYLLABLE ZYR
+A2AE;ID # YI SYLLABLE CIT
+A2AF;ID # YI SYLLABLE CIX
+A2B0;ID # YI SYLLABLE CI
+A2B1;ID # YI SYLLABLE CIP
+A2B2;ID # YI SYLLABLE CIET
+A2B3;ID # YI SYLLABLE CIEX
+A2B4;ID # YI SYLLABLE CIE
+A2B5;ID # YI SYLLABLE CIEP
+A2B6;ID # YI SYLLABLE CAT
+A2B7;ID # YI SYLLABLE CAX
+A2B8;ID # YI SYLLABLE CA
+A2B9;ID # YI SYLLABLE CAP
+A2BA;ID # YI SYLLABLE CUOX
+A2BB;ID # YI SYLLABLE CUO
+A2BC;ID # YI SYLLABLE CUOP
+A2BD;ID # YI SYLLABLE COT
+A2BE;ID # YI SYLLABLE COX
+A2BF;ID # YI SYLLABLE CO
+A2C0;ID # YI SYLLABLE COP
+A2C1;ID # YI SYLLABLE CEX
+A2C2;ID # YI SYLLABLE CE
+A2C3;ID # YI SYLLABLE CEP
+A2C4;ID # YI SYLLABLE CUT
+A2C5;ID # YI SYLLABLE CUX
+A2C6;ID # YI SYLLABLE CU
+A2C7;ID # YI SYLLABLE CUP
+A2C8;ID # YI SYLLABLE CURX
+A2C9;ID # YI SYLLABLE CUR
+A2CA;ID # YI SYLLABLE CYT
+A2CB;ID # YI SYLLABLE CYX
+A2CC;ID # YI SYLLABLE CY
+A2CD;ID # YI SYLLABLE CYP
+A2CE;ID # YI SYLLABLE CYRX
+A2CF;ID # YI SYLLABLE CYR
+A2D0;ID # YI SYLLABLE ZZIT
+A2D1;ID # YI SYLLABLE ZZIX
+A2D2;ID # YI SYLLABLE ZZI
+A2D3;ID # YI SYLLABLE ZZIP
+A2D4;ID # YI SYLLABLE ZZIET
+A2D5;ID # YI SYLLABLE ZZIEX
+A2D6;ID # YI SYLLABLE ZZIE
+A2D7;ID # YI SYLLABLE ZZIEP
+A2D8;ID # YI SYLLABLE ZZAT
+A2D9;ID # YI SYLLABLE ZZAX
+A2DA;ID # YI SYLLABLE ZZA
+A2DB;ID # YI SYLLABLE ZZAP
+A2DC;ID # YI SYLLABLE ZZOX
+A2DD;ID # YI SYLLABLE ZZO
+A2DE;ID # YI SYLLABLE ZZOP
+A2DF;ID # YI SYLLABLE ZZEX
+A2E0;ID # YI SYLLABLE ZZE
+A2E1;ID # YI SYLLABLE ZZEP
+A2E2;ID # YI SYLLABLE ZZUX
+A2E3;ID # YI SYLLABLE ZZU
+A2E4;ID # YI SYLLABLE ZZUP
+A2E5;ID # YI SYLLABLE ZZURX
+A2E6;ID # YI SYLLABLE ZZUR
+A2E7;ID # YI SYLLABLE ZZYT
+A2E8;ID # YI SYLLABLE ZZYX
+A2E9;ID # YI SYLLABLE ZZY
+A2EA;ID # YI SYLLABLE ZZYP
+A2EB;ID # YI SYLLABLE ZZYRX
+A2EC;ID # YI SYLLABLE ZZYR
+A2ED;ID # YI SYLLABLE NZIT
+A2EE;ID # YI SYLLABLE NZIX
+A2EF;ID # YI SYLLABLE NZI
+A2F0;ID # YI SYLLABLE NZIP
+A2F1;ID # YI SYLLABLE NZIEX
+A2F2;ID # YI SYLLABLE NZIE
+A2F3;ID # YI SYLLABLE NZIEP
+A2F4;ID # YI SYLLABLE NZAT
+A2F5;ID # YI SYLLABLE NZAX
+A2F6;ID # YI SYLLABLE NZA
+A2F7;ID # YI SYLLABLE NZAP
+A2F8;ID # YI SYLLABLE NZUOX
+A2F9;ID # YI SYLLABLE NZUO
+A2FA;ID # YI SYLLABLE NZOX
+A2FB;ID # YI SYLLABLE NZOP
+A2FC;ID # YI SYLLABLE NZEX
+A2FD;ID # YI SYLLABLE NZE
+A2FE;ID # YI SYLLABLE NZUX
+A2FF;ID # YI SYLLABLE NZU
+A300;ID # YI SYLLABLE NZUP
+A301;ID # YI SYLLABLE NZURX
+A302;ID # YI SYLLABLE NZUR
+A303;ID # YI SYLLABLE NZYT
+A304;ID # YI SYLLABLE NZYX
+A305;ID # YI SYLLABLE NZY
+A306;ID # YI SYLLABLE NZYP
+A307;ID # YI SYLLABLE NZYRX
+A308;ID # YI SYLLABLE NZYR
+A309;ID # YI SYLLABLE SIT
+A30A;ID # YI SYLLABLE SIX
+A30B;ID # YI SYLLABLE SI
+A30C;ID # YI SYLLABLE SIP
+A30D;ID # YI SYLLABLE SIEX
+A30E;ID # YI SYLLABLE SIE
+A30F;ID # YI SYLLABLE SIEP
+A310;ID # YI SYLLABLE SAT
+A311;ID # YI SYLLABLE SAX
+A312;ID # YI SYLLABLE SA
+A313;ID # YI SYLLABLE SAP
+A314;ID # YI SYLLABLE SUOX
+A315;ID # YI SYLLABLE SUO
+A316;ID # YI SYLLABLE SUOP
+A317;ID # YI SYLLABLE SOT
+A318;ID # YI SYLLABLE SOX
+A319;ID # YI SYLLABLE SO
+A31A;ID # YI SYLLABLE SOP
+A31B;ID # YI SYLLABLE SEX
+A31C;ID # YI SYLLABLE SE
+A31D;ID # YI SYLLABLE SEP
+A31E;ID # YI SYLLABLE SUT
+A31F;ID # YI SYLLABLE SUX
+A320;ID # YI SYLLABLE SU
+A321;ID # YI SYLLABLE SUP
+A322;ID # YI SYLLABLE SURX
+A323;ID # YI SYLLABLE SUR
+A324;ID # YI SYLLABLE SYT
+A325;ID # YI SYLLABLE SYX
+A326;ID # YI SYLLABLE SY
+A327;ID # YI SYLLABLE SYP
+A328;ID # YI SYLLABLE SYRX
+A329;ID # YI SYLLABLE SYR
+A32A;ID # YI SYLLABLE SSIT
+A32B;ID # YI SYLLABLE SSIX
+A32C;ID # YI SYLLABLE SSI
+A32D;ID # YI SYLLABLE SSIP
+A32E;ID # YI SYLLABLE SSIEX
+A32F;ID # YI SYLLABLE SSIE
+A330;ID # YI SYLLABLE SSIEP
+A331;ID # YI SYLLABLE SSAT
+A332;ID # YI SYLLABLE SSAX
+A333;ID # YI SYLLABLE SSA
+A334;ID # YI SYLLABLE SSAP
+A335;ID # YI SYLLABLE SSOT
+A336;ID # YI SYLLABLE SSOX
+A337;ID # YI SYLLABLE SSO
+A338;ID # YI SYLLABLE SSOP
+A339;ID # YI SYLLABLE SSEX
+A33A;ID # YI SYLLABLE SSE
+A33B;ID # YI SYLLABLE SSEP
+A33C;ID # YI SYLLABLE SSUT
+A33D;ID # YI SYLLABLE SSUX
+A33E;ID # YI SYLLABLE SSU
+A33F;ID # YI SYLLABLE SSUP
+A340;ID # YI SYLLABLE SSYT
+A341;ID # YI SYLLABLE SSYX
+A342;ID # YI SYLLABLE SSY
+A343;ID # YI SYLLABLE SSYP
+A344;ID # YI SYLLABLE SSYRX
+A345;ID # YI SYLLABLE SSYR
+A346;ID # YI SYLLABLE ZHAT
+A347;ID # YI SYLLABLE ZHAX
+A348;ID # YI SYLLABLE ZHA
+A349;ID # YI SYLLABLE ZHAP
+A34A;ID # YI SYLLABLE ZHUOX
+A34B;ID # YI SYLLABLE ZHUO
+A34C;ID # YI SYLLABLE ZHUOP
+A34D;ID # YI SYLLABLE ZHOT
+A34E;ID # YI SYLLABLE ZHOX
+A34F;ID # YI SYLLABLE ZHO
+A350;ID # YI SYLLABLE ZHOP
+A351;ID # YI SYLLABLE ZHET
+A352;ID # YI SYLLABLE ZHEX
+A353;ID # YI SYLLABLE ZHE
+A354;ID # YI SYLLABLE ZHEP
+A355;ID # YI SYLLABLE ZHUT
+A356;ID # YI SYLLABLE ZHUX
+A357;ID # YI SYLLABLE ZHU
+A358;ID # YI SYLLABLE ZHUP
+A359;ID # YI SYLLABLE ZHURX
+A35A;ID # YI SYLLABLE ZHUR
+A35B;ID # YI SYLLABLE ZHYT
+A35C;ID # YI SYLLABLE ZHYX
+A35D;ID # YI SYLLABLE ZHY
+A35E;ID # YI SYLLABLE ZHYP
+A35F;ID # YI SYLLABLE ZHYRX
+A360;ID # YI SYLLABLE ZHYR
+A361;ID # YI SYLLABLE CHAT
+A362;ID # YI SYLLABLE CHAX
+A363;ID # YI SYLLABLE CHA
+A364;ID # YI SYLLABLE CHAP
+A365;ID # YI SYLLABLE CHUOT
+A366;ID # YI SYLLABLE CHUOX
+A367;ID # YI SYLLABLE CHUO
+A368;ID # YI SYLLABLE CHUOP
+A369;ID # YI SYLLABLE CHOT
+A36A;ID # YI SYLLABLE CHOX
+A36B;ID # YI SYLLABLE CHO
+A36C;ID # YI SYLLABLE CHOP
+A36D;ID # YI SYLLABLE CHET
+A36E;ID # YI SYLLABLE CHEX
+A36F;ID # YI SYLLABLE CHE
+A370;ID # YI SYLLABLE CHEP
+A371;ID # YI SYLLABLE CHUX
+A372;ID # YI SYLLABLE CHU
+A373;ID # YI SYLLABLE CHUP
+A374;ID # YI SYLLABLE CHURX
+A375;ID # YI SYLLABLE CHUR
+A376;ID # YI SYLLABLE CHYT
+A377;ID # YI SYLLABLE CHYX
+A378;ID # YI SYLLABLE CHY
+A379;ID # YI SYLLABLE CHYP
+A37A;ID # YI SYLLABLE CHYRX
+A37B;ID # YI SYLLABLE CHYR
+A37C;ID # YI SYLLABLE RRAX
+A37D;ID # YI SYLLABLE RRA
+A37E;ID # YI SYLLABLE RRUOX
+A37F;ID # YI SYLLABLE RRUO
+A380;ID # YI SYLLABLE RROT
+A381;ID # YI SYLLABLE RROX
+A382;ID # YI SYLLABLE RRO
+A383;ID # YI SYLLABLE RROP
+A384;ID # YI SYLLABLE RRET
+A385;ID # YI SYLLABLE RREX
+A386;ID # YI SYLLABLE RRE
+A387;ID # YI SYLLABLE RREP
+A388;ID # YI SYLLABLE RRUT
+A389;ID # YI SYLLABLE RRUX
+A38A;ID # YI SYLLABLE RRU
+A38B;ID # YI SYLLABLE RRUP
+A38C;ID # YI SYLLABLE RRURX
+A38D;ID # YI SYLLABLE RRUR
+A38E;ID # YI SYLLABLE RRYT
+A38F;ID # YI SYLLABLE RRYX
+A390;ID # YI SYLLABLE RRY
+A391;ID # YI SYLLABLE RRYP
+A392;ID # YI SYLLABLE RRYRX
+A393;ID # YI SYLLABLE RRYR
+A394;ID # YI SYLLABLE NRAT
+A395;ID # YI SYLLABLE NRAX
+A396;ID # YI SYLLABLE NRA
+A397;ID # YI SYLLABLE NRAP
+A398;ID # YI SYLLABLE NROX
+A399;ID # YI SYLLABLE NRO
+A39A;ID # YI SYLLABLE NROP
+A39B;ID # YI SYLLABLE NRET
+A39C;ID # YI SYLLABLE NREX
+A39D;ID # YI SYLLABLE NRE
+A39E;ID # YI SYLLABLE NREP
+A39F;ID # YI SYLLABLE NRUT
+A3A0;ID # YI SYLLABLE NRUX
+A3A1;ID # YI SYLLABLE NRU
+A3A2;ID # YI SYLLABLE NRUP
+A3A3;ID # YI SYLLABLE NRURX
+A3A4;ID # YI SYLLABLE NRUR
+A3A5;ID # YI SYLLABLE NRYT
+A3A6;ID # YI SYLLABLE NRYX
+A3A7;ID # YI SYLLABLE NRY
+A3A8;ID # YI SYLLABLE NRYP
+A3A9;ID # YI SYLLABLE NRYRX
+A3AA;ID # YI SYLLABLE NRYR
+A3AB;ID # YI SYLLABLE SHAT
+A3AC;ID # YI SYLLABLE SHAX
+A3AD;ID # YI SYLLABLE SHA
+A3AE;ID # YI SYLLABLE SHAP
+A3AF;ID # YI SYLLABLE SHUOX
+A3B0;ID # YI SYLLABLE SHUO
+A3B1;ID # YI SYLLABLE SHUOP
+A3B2;ID # YI SYLLABLE SHOT
+A3B3;ID # YI SYLLABLE SHOX
+A3B4;ID # YI SYLLABLE SHO
+A3B5;ID # YI SYLLABLE SHOP
+A3B6;ID # YI SYLLABLE SHET
+A3B7;ID # YI SYLLABLE SHEX
+A3B8;ID # YI SYLLABLE SHE
+A3B9;ID # YI SYLLABLE SHEP
+A3BA;ID # YI SYLLABLE SHUT
+A3BB;ID # YI SYLLABLE SHUX
+A3BC;ID # YI SYLLABLE SHU
+A3BD;ID # YI SYLLABLE SHUP
+A3BE;ID # YI SYLLABLE SHURX
+A3BF;ID # YI SYLLABLE SHUR
+A3C0;ID # YI SYLLABLE SHYT
+A3C1;ID # YI SYLLABLE SHYX
+A3C2;ID # YI SYLLABLE SHY
+A3C3;ID # YI SYLLABLE SHYP
+A3C4;ID # YI SYLLABLE SHYRX
+A3C5;ID # YI SYLLABLE SHYR
+A3C6;ID # YI SYLLABLE RAT
+A3C7;ID # YI SYLLABLE RAX
+A3C8;ID # YI SYLLABLE RA
+A3C9;ID # YI SYLLABLE RAP
+A3CA;ID # YI SYLLABLE RUOX
+A3CB;ID # YI SYLLABLE RUO
+A3CC;ID # YI SYLLABLE RUOP
+A3CD;ID # YI SYLLABLE ROT
+A3CE;ID # YI SYLLABLE ROX
+A3CF;ID # YI SYLLABLE RO
+A3D0;ID # YI SYLLABLE ROP
+A3D1;ID # YI SYLLABLE REX
+A3D2;ID # YI SYLLABLE RE
+A3D3;ID # YI SYLLABLE REP
+A3D4;ID # YI SYLLABLE RUT
+A3D5;ID # YI SYLLABLE RUX
+A3D6;ID # YI SYLLABLE RU
+A3D7;ID # YI SYLLABLE RUP
+A3D8;ID # YI SYLLABLE RURX
+A3D9;ID # YI SYLLABLE RUR
+A3DA;ID # YI SYLLABLE RYT
+A3DB;ID # YI SYLLABLE RYX
+A3DC;ID # YI SYLLABLE RY
+A3DD;ID # YI SYLLABLE RYP
+A3DE;ID # YI SYLLABLE RYRX
+A3DF;ID # YI SYLLABLE RYR
+A3E0;ID # YI SYLLABLE JIT
+A3E1;ID # YI SYLLABLE JIX
+A3E2;ID # YI SYLLABLE JI
+A3E3;ID # YI SYLLABLE JIP
+A3E4;ID # YI SYLLABLE JIET
+A3E5;ID # YI SYLLABLE JIEX
+A3E6;ID # YI SYLLABLE JIE
+A3E7;ID # YI SYLLABLE JIEP
+A3E8;ID # YI SYLLABLE JUOT
+A3E9;ID # YI SYLLABLE JUOX
+A3EA;ID # YI SYLLABLE JUO
+A3EB;ID # YI SYLLABLE JUOP
+A3EC;ID # YI SYLLABLE JOT
+A3ED;ID # YI SYLLABLE JOX
+A3EE;ID # YI SYLLABLE JO
+A3EF;ID # YI SYLLABLE JOP
+A3F0;ID # YI SYLLABLE JUT
+A3F1;ID # YI SYLLABLE JUX
+A3F2;ID # YI SYLLABLE JU
+A3F3;ID # YI SYLLABLE JUP
+A3F4;ID # YI SYLLABLE JURX
+A3F5;ID # YI SYLLABLE JUR
+A3F6;ID # YI SYLLABLE JYT
+A3F7;ID # YI SYLLABLE JYX
+A3F8;ID # YI SYLLABLE JY
+A3F9;ID # YI SYLLABLE JYP
+A3FA;ID # YI SYLLABLE JYRX
+A3FB;ID # YI SYLLABLE JYR
+A3FC;ID # YI SYLLABLE QIT
+A3FD;ID # YI SYLLABLE QIX
+A3FE;ID # YI SYLLABLE QI
+A3FF;ID # YI SYLLABLE QIP
+A400;ID # YI SYLLABLE QIET
+A401;ID # YI SYLLABLE QIEX
+A402;ID # YI SYLLABLE QIE
+A403;ID # YI SYLLABLE QIEP
+A404;ID # YI SYLLABLE QUOT
+A405;ID # YI SYLLABLE QUOX
+A406;ID # YI SYLLABLE QUO
+A407;ID # YI SYLLABLE QUOP
+A408;ID # YI SYLLABLE QOT
+A409;ID # YI SYLLABLE QOX
+A40A;ID # YI SYLLABLE QO
+A40B;ID # YI SYLLABLE QOP
+A40C;ID # YI SYLLABLE QUT
+A40D;ID # YI SYLLABLE QUX
+A40E;ID # YI SYLLABLE QU
+A40F;ID # YI SYLLABLE QUP
+A410;ID # YI SYLLABLE QURX
+A411;ID # YI SYLLABLE QUR
+A412;ID # YI SYLLABLE QYT
+A413;ID # YI SYLLABLE QYX
+A414;ID # YI SYLLABLE QY
+A415;ID # YI SYLLABLE QYP
+A416;ID # YI SYLLABLE QYRX
+A417;ID # YI SYLLABLE QYR
+A418;ID # YI SYLLABLE JJIT
+A419;ID # YI SYLLABLE JJIX
+A41A;ID # YI SYLLABLE JJI
+A41B;ID # YI SYLLABLE JJIP
+A41C;ID # YI SYLLABLE JJIET
+A41D;ID # YI SYLLABLE JJIEX
+A41E;ID # YI SYLLABLE JJIE
+A41F;ID # YI SYLLABLE JJIEP
+A420;ID # YI SYLLABLE JJUOX
+A421;ID # YI SYLLABLE JJUO
+A422;ID # YI SYLLABLE JJUOP
+A423;ID # YI SYLLABLE JJOT
+A424;ID # YI SYLLABLE JJOX
+A425;ID # YI SYLLABLE JJO
+A426;ID # YI SYLLABLE JJOP
+A427;ID # YI SYLLABLE JJUT
+A428;ID # YI SYLLABLE JJUX
+A429;ID # YI SYLLABLE JJU
+A42A;ID # YI SYLLABLE JJUP
+A42B;ID # YI SYLLABLE JJURX
+A42C;ID # YI SYLLABLE JJUR
+A42D;ID # YI SYLLABLE JJYT
+A42E;ID # YI SYLLABLE JJYX
+A42F;ID # YI SYLLABLE JJY
+A430;ID # YI SYLLABLE JJYP
+A431;ID # YI SYLLABLE NJIT
+A432;ID # YI SYLLABLE NJIX
+A433;ID # YI SYLLABLE NJI
+A434;ID # YI SYLLABLE NJIP
+A435;ID # YI SYLLABLE NJIET
+A436;ID # YI SYLLABLE NJIEX
+A437;ID # YI SYLLABLE NJIE
+A438;ID # YI SYLLABLE NJIEP
+A439;ID # YI SYLLABLE NJUOX
+A43A;ID # YI SYLLABLE NJUO
+A43B;ID # YI SYLLABLE NJOT
+A43C;ID # YI SYLLABLE NJOX
+A43D;ID # YI SYLLABLE NJO
+A43E;ID # YI SYLLABLE NJOP
+A43F;ID # YI SYLLABLE NJUX
+A440;ID # YI SYLLABLE NJU
+A441;ID # YI SYLLABLE NJUP
+A442;ID # YI SYLLABLE NJURX
+A443;ID # YI SYLLABLE NJUR
+A444;ID # YI SYLLABLE NJYT
+A445;ID # YI SYLLABLE NJYX
+A446;ID # YI SYLLABLE NJY
+A447;ID # YI SYLLABLE NJYP
+A448;ID # YI SYLLABLE NJYRX
+A449;ID # YI SYLLABLE NJYR
+A44A;ID # YI SYLLABLE NYIT
+A44B;ID # YI SYLLABLE NYIX
+A44C;ID # YI SYLLABLE NYI
+A44D;ID # YI SYLLABLE NYIP
+A44E;ID # YI SYLLABLE NYIET
+A44F;ID # YI SYLLABLE NYIEX
+A450;ID # YI SYLLABLE NYIE
+A451;ID # YI SYLLABLE NYIEP
+A452;ID # YI SYLLABLE NYUOX
+A453;ID # YI SYLLABLE NYUO
+A454;ID # YI SYLLABLE NYUOP
+A455;ID # YI SYLLABLE NYOT
+A456;ID # YI SYLLABLE NYOX
+A457;ID # YI SYLLABLE NYO
+A458;ID # YI SYLLABLE NYOP
+A459;ID # YI SYLLABLE NYUT
+A45A;ID # YI SYLLABLE NYUX
+A45B;ID # YI SYLLABLE NYU
+A45C;ID # YI SYLLABLE NYUP
+A45D;ID # YI SYLLABLE XIT
+A45E;ID # YI SYLLABLE XIX
+A45F;ID # YI SYLLABLE XI
+A460;ID # YI SYLLABLE XIP
+A461;ID # YI SYLLABLE XIET
+A462;ID # YI SYLLABLE XIEX
+A463;ID # YI SYLLABLE XIE
+A464;ID # YI SYLLABLE XIEP
+A465;ID # YI SYLLABLE XUOX
+A466;ID # YI SYLLABLE XUO
+A467;ID # YI SYLLABLE XOT
+A468;ID # YI SYLLABLE XOX
+A469;ID # YI SYLLABLE XO
+A46A;ID # YI SYLLABLE XOP
+A46B;ID # YI SYLLABLE XYT
+A46C;ID # YI SYLLABLE XYX
+A46D;ID # YI SYLLABLE XY
+A46E;ID # YI SYLLABLE XYP
+A46F;ID # YI SYLLABLE XYRX
+A470;ID # YI SYLLABLE XYR
+A471;ID # YI SYLLABLE YIT
+A472;ID # YI SYLLABLE YIX
+A473;ID # YI SYLLABLE YI
+A474;ID # YI SYLLABLE YIP
+A475;ID # YI SYLLABLE YIET
+A476;ID # YI SYLLABLE YIEX
+A477;ID # YI SYLLABLE YIE
+A478;ID # YI SYLLABLE YIEP
+A479;ID # YI SYLLABLE YUOT
+A47A;ID # YI SYLLABLE YUOX
+A47B;ID # YI SYLLABLE YUO
+A47C;ID # YI SYLLABLE YUOP
+A47D;ID # YI SYLLABLE YOT
+A47E;ID # YI SYLLABLE YOX
+A47F;ID # YI SYLLABLE YO
+A480;ID # YI SYLLABLE YOP
+A481;ID # YI SYLLABLE YUT
+A482;ID # YI SYLLABLE YUX
+A483;ID # YI SYLLABLE YU
+A484;ID # YI SYLLABLE YUP
+A485;ID # YI SYLLABLE YURX
+A486;ID # YI SYLLABLE YUR
+A487;ID # YI SYLLABLE YYT
+A488;ID # YI SYLLABLE YYX
+A489;ID # YI SYLLABLE YY
+A48A;ID # YI SYLLABLE YYP
+A48B;ID # YI SYLLABLE YYRX
+A48C;ID # YI SYLLABLE YYR
+A490;ID # YI RADICAL QOT
+A491;ID # YI RADICAL LI
+A492;ID # YI RADICAL KIT
+A493;ID # YI RADICAL NYIP
+A494;ID # YI RADICAL CYP
+A495;ID # YI RADICAL SSI
+A496;ID # YI RADICAL GGOP
+A497;ID # YI RADICAL GEP
+A498;ID # YI RADICAL MI
+A499;ID # YI RADICAL HXIT
+A49A;ID # YI RADICAL LYR
+A49B;ID # YI RADICAL BBUT
+A49C;ID # YI RADICAL MOP
+A49D;ID # YI RADICAL YO
+A49E;ID # YI RADICAL PUT
+A49F;ID # YI RADICAL HXUO
+A4A0;ID # YI RADICAL TAT
+A4A1;ID # YI RADICAL GA
+A4A2;ID # YI RADICAL ZUP
+A4A3;ID # YI RADICAL CYT
+A4A4;ID # YI RADICAL DDUR
+A4A5;ID # YI RADICAL BUR
+A4A6;ID # YI RADICAL GGUO
+A4A7;ID # YI RADICAL NYOP
+A4A8;ID # YI RADICAL TU
+A4A9;ID # YI RADICAL OP
+A4AA;ID # YI RADICAL JJUT
+A4AB;ID # YI RADICAL ZOT
+A4AC;ID # YI RADICAL PYT
+A4AD;ID # YI RADICAL HMO
+A4AE;ID # YI RADICAL YIT
+A4AF;ID # YI RADICAL VUR
+A4B0;ID # YI RADICAL SHY
+A4B1;ID # YI RADICAL VEP
+A4B2;ID # YI RADICAL ZA
+A4B3;ID # YI RADICAL JO
+A4B4;ID # YI RADICAL NZUP
+A4B5;ID # YI RADICAL JJY
+A4B6;ID # YI RADICAL GOT
+A4B7;ID # YI RADICAL JJIE
+A4B8;ID # YI RADICAL WO
+A4B9;ID # YI RADICAL DU
+A4BA;ID # YI RADICAL SHUR
+A4BB;ID # YI RADICAL LIE
+A4BC;ID # YI RADICAL CY
+A4BD;ID # YI RADICAL CUOP
+A4BE;ID # YI RADICAL CIP
+A4BF;ID # YI RADICAL HXOP
+A4C0;ID # YI RADICAL SHAT
+A4C1;ID # YI RADICAL ZUR
+A4C2;ID # YI RADICAL SHOP
+A4C3;ID # YI RADICAL CHE
+A4C4;ID # YI RADICAL ZZIET
+A4C5;ID # YI RADICAL NBIE
+A4C6;ID # YI RADICAL KE
+A500;AL # VAI SYLLABLE EE
+A501;AL # VAI SYLLABLE EEN
+A502;AL # VAI SYLLABLE HEE
+A503;AL # VAI SYLLABLE WEE
+A504;AL # VAI SYLLABLE WEEN
+A505;AL # VAI SYLLABLE PEE
+A506;AL # VAI SYLLABLE BHEE
+A507;AL # VAI SYLLABLE BEE
+A508;AL # VAI SYLLABLE MBEE
+A509;AL # VAI SYLLABLE KPEE
+A50A;AL # VAI SYLLABLE MGBEE
+A50B;AL # VAI SYLLABLE GBEE
+A50C;AL # VAI SYLLABLE FEE
+A50D;AL # VAI SYLLABLE VEE
+A50E;AL # VAI SYLLABLE TEE
+A50F;AL # VAI SYLLABLE THEE
+A510;AL # VAI SYLLABLE DHEE
+A511;AL # VAI SYLLABLE DHHEE
+A512;AL # VAI SYLLABLE LEE
+A513;AL # VAI SYLLABLE REE
+A514;AL # VAI SYLLABLE DEE
+A515;AL # VAI SYLLABLE NDEE
+A516;AL # VAI SYLLABLE SEE
+A517;AL # VAI SYLLABLE SHEE
+A518;AL # VAI SYLLABLE ZEE
+A519;AL # VAI SYLLABLE ZHEE
+A51A;AL # VAI SYLLABLE CEE
+A51B;AL # VAI SYLLABLE JEE
+A51C;AL # VAI SYLLABLE NJEE
+A51D;AL # VAI SYLLABLE YEE
+A51E;AL # VAI SYLLABLE KEE
+A51F;AL # VAI SYLLABLE NGGEE
+A520;AL # VAI SYLLABLE GEE
+A521;AL # VAI SYLLABLE MEE
+A522;AL # VAI SYLLABLE NEE
+A523;AL # VAI SYLLABLE NYEE
+A524;AL # VAI SYLLABLE I
+A525;AL # VAI SYLLABLE IN
+A526;AL # VAI SYLLABLE HI
+A527;AL # VAI SYLLABLE HIN
+A528;AL # VAI SYLLABLE WI
+A529;AL # VAI SYLLABLE WIN
+A52A;AL # VAI SYLLABLE PI
+A52B;AL # VAI SYLLABLE BHI
+A52C;AL # VAI SYLLABLE BI
+A52D;AL # VAI SYLLABLE MBI
+A52E;AL # VAI SYLLABLE KPI
+A52F;AL # VAI SYLLABLE MGBI
+A530;AL # VAI SYLLABLE GBI
+A531;AL # VAI SYLLABLE FI
+A532;AL # VAI SYLLABLE VI
+A533;AL # VAI SYLLABLE TI
+A534;AL # VAI SYLLABLE THI
+A535;AL # VAI SYLLABLE DHI
+A536;AL # VAI SYLLABLE DHHI
+A537;AL # VAI SYLLABLE LI
+A538;AL # VAI SYLLABLE RI
+A539;AL # VAI SYLLABLE DI
+A53A;AL # VAI SYLLABLE NDI
+A53B;AL # VAI SYLLABLE SI
+A53C;AL # VAI SYLLABLE SHI
+A53D;AL # VAI SYLLABLE ZI
+A53E;AL # VAI SYLLABLE ZHI
+A53F;AL # VAI SYLLABLE CI
+A540;AL # VAI SYLLABLE JI
+A541;AL # VAI SYLLABLE NJI
+A542;AL # VAI SYLLABLE YI
+A543;AL # VAI SYLLABLE KI
+A544;AL # VAI SYLLABLE NGGI
+A545;AL # VAI SYLLABLE GI
+A546;AL # VAI SYLLABLE MI
+A547;AL # VAI SYLLABLE NI
+A548;AL # VAI SYLLABLE NYI
+A549;AL # VAI SYLLABLE A
+A54A;AL # VAI SYLLABLE AN
+A54B;AL # VAI SYLLABLE NGAN
+A54C;AL # VAI SYLLABLE HA
+A54D;AL # VAI SYLLABLE HAN
+A54E;AL # VAI SYLLABLE WA
+A54F;AL # VAI SYLLABLE WAN
+A550;AL # VAI SYLLABLE PA
+A551;AL # VAI SYLLABLE BHA
+A552;AL # VAI SYLLABLE BA
+A553;AL # VAI SYLLABLE MBA
+A554;AL # VAI SYLLABLE KPA
+A555;AL # VAI SYLLABLE KPAN
+A556;AL # VAI SYLLABLE MGBA
+A557;AL # VAI SYLLABLE GBA
+A558;AL # VAI SYLLABLE FA
+A559;AL # VAI SYLLABLE VA
+A55A;AL # VAI SYLLABLE TA
+A55B;AL # VAI SYLLABLE THA
+A55C;AL # VAI SYLLABLE DHA
+A55D;AL # VAI SYLLABLE DHHA
+A55E;AL # VAI SYLLABLE LA
+A55F;AL # VAI SYLLABLE RA
+A560;AL # VAI SYLLABLE DA
+A561;AL # VAI SYLLABLE NDA
+A562;AL # VAI SYLLABLE SA
+A563;AL # VAI SYLLABLE SHA
+A564;AL # VAI SYLLABLE ZA
+A565;AL # VAI SYLLABLE ZHA
+A566;AL # VAI SYLLABLE CA
+A567;AL # VAI SYLLABLE JA
+A568;AL # VAI SYLLABLE NJA
+A569;AL # VAI SYLLABLE YA
+A56A;AL # VAI SYLLABLE KA
+A56B;AL # VAI SYLLABLE KAN
+A56C;AL # VAI SYLLABLE NGGA
+A56D;AL # VAI SYLLABLE GA
+A56E;AL # VAI SYLLABLE MA
+A56F;AL # VAI SYLLABLE NA
+A570;AL # VAI SYLLABLE NYA
+A571;AL # VAI SYLLABLE OO
+A572;AL # VAI SYLLABLE OON
+A573;AL # VAI SYLLABLE HOO
+A574;AL # VAI SYLLABLE WOO
+A575;AL # VAI SYLLABLE WOON
+A576;AL # VAI SYLLABLE POO
+A577;AL # VAI SYLLABLE BHOO
+A578;AL # VAI SYLLABLE BOO
+A579;AL # VAI SYLLABLE MBOO
+A57A;AL # VAI SYLLABLE KPOO
+A57B;AL # VAI SYLLABLE MGBOO
+A57C;AL # VAI SYLLABLE GBOO
+A57D;AL # VAI SYLLABLE FOO
+A57E;AL # VAI SYLLABLE VOO
+A57F;AL # VAI SYLLABLE TOO
+A580;AL # VAI SYLLABLE THOO
+A581;AL # VAI SYLLABLE DHOO
+A582;AL # VAI SYLLABLE DHHOO
+A583;AL # VAI SYLLABLE LOO
+A584;AL # VAI SYLLABLE ROO
+A585;AL # VAI SYLLABLE DOO
+A586;AL # VAI SYLLABLE NDOO
+A587;AL # VAI SYLLABLE SOO
+A588;AL # VAI SYLLABLE SHOO
+A589;AL # VAI SYLLABLE ZOO
+A58A;AL # VAI SYLLABLE ZHOO
+A58B;AL # VAI SYLLABLE COO
+A58C;AL # VAI SYLLABLE JOO
+A58D;AL # VAI SYLLABLE NJOO
+A58E;AL # VAI SYLLABLE YOO
+A58F;AL # VAI SYLLABLE KOO
+A590;AL # VAI SYLLABLE NGGOO
+A591;AL # VAI SYLLABLE GOO
+A592;AL # VAI SYLLABLE MOO
+A593;AL # VAI SYLLABLE NOO
+A594;AL # VAI SYLLABLE NYOO
+A595;AL # VAI SYLLABLE U
+A596;AL # VAI SYLLABLE UN
+A597;AL # VAI SYLLABLE HU
+A598;AL # VAI SYLLABLE HUN
+A599;AL # VAI SYLLABLE WU
+A59A;AL # VAI SYLLABLE WUN
+A59B;AL # VAI SYLLABLE PU
+A59C;AL # VAI SYLLABLE BHU
+A59D;AL # VAI SYLLABLE BU
+A59E;AL # VAI SYLLABLE MBU
+A59F;AL # VAI SYLLABLE KPU
+A5A0;AL # VAI SYLLABLE MGBU
+A5A1;AL # VAI SYLLABLE GBU
+A5A2;AL # VAI SYLLABLE FU
+A5A3;AL # VAI SYLLABLE VU
+A5A4;AL # VAI SYLLABLE TU
+A5A5;AL # VAI SYLLABLE THU
+A5A6;AL # VAI SYLLABLE DHU
+A5A7;AL # VAI SYLLABLE DHHU
+A5A8;AL # VAI SYLLABLE LU
+A5A9;AL # VAI SYLLABLE RU
+A5AA;AL # VAI SYLLABLE DU
+A5AB;AL # VAI SYLLABLE NDU
+A5AC;AL # VAI SYLLABLE SU
+A5AD;AL # VAI SYLLABLE SHU
+A5AE;AL # VAI SYLLABLE ZU
+A5AF;AL # VAI SYLLABLE ZHU
+A5B0;AL # VAI SYLLABLE CU
+A5B1;AL # VAI SYLLABLE JU
+A5B2;AL # VAI SYLLABLE NJU
+A5B3;AL # VAI SYLLABLE YU
+A5B4;AL # VAI SYLLABLE KU
+A5B5;AL # VAI SYLLABLE NGGU
+A5B6;AL # VAI SYLLABLE GU
+A5B7;AL # VAI SYLLABLE MU
+A5B8;AL # VAI SYLLABLE NU
+A5B9;AL # VAI SYLLABLE NYU
+A5BA;AL # VAI SYLLABLE O
+A5BB;AL # VAI SYLLABLE ON
+A5BC;AL # VAI SYLLABLE NGON
+A5BD;AL # VAI SYLLABLE HO
+A5BE;AL # VAI SYLLABLE HON
+A5BF;AL # VAI SYLLABLE WO
+A5C0;AL # VAI SYLLABLE WON
+A5C1;AL # VAI SYLLABLE PO
+A5C2;AL # VAI SYLLABLE BHO
+A5C3;AL # VAI SYLLABLE BO
+A5C4;AL # VAI SYLLABLE MBO
+A5C5;AL # VAI SYLLABLE KPO
+A5C6;AL # VAI SYLLABLE MGBO
+A5C7;AL # VAI SYLLABLE GBO
+A5C8;AL # VAI SYLLABLE GBON
+A5C9;AL # VAI SYLLABLE FO
+A5CA;AL # VAI SYLLABLE VO
+A5CB;AL # VAI SYLLABLE TO
+A5CC;AL # VAI SYLLABLE THO
+A5CD;AL # VAI SYLLABLE DHO
+A5CE;AL # VAI SYLLABLE DHHO
+A5CF;AL # VAI SYLLABLE LO
+A5D0;AL # VAI SYLLABLE RO
+A5D1;AL # VAI SYLLABLE DO
+A5D2;AL # VAI SYLLABLE NDO
+A5D3;AL # VAI SYLLABLE SO
+A5D4;AL # VAI SYLLABLE SHO
+A5D5;AL # VAI SYLLABLE ZO
+A5D6;AL # VAI SYLLABLE ZHO
+A5D7;AL # VAI SYLLABLE CO
+A5D8;AL # VAI SYLLABLE JO
+A5D9;AL # VAI SYLLABLE NJO
+A5DA;AL # VAI SYLLABLE YO
+A5DB;AL # VAI SYLLABLE KO
+A5DC;AL # VAI SYLLABLE NGGO
+A5DD;AL # VAI SYLLABLE GO
+A5DE;AL # VAI SYLLABLE MO
+A5DF;AL # VAI SYLLABLE NO
+A5E0;AL # VAI SYLLABLE NYO
+A5E1;AL # VAI SYLLABLE E
+A5E2;AL # VAI SYLLABLE EN
+A5E3;AL # VAI SYLLABLE NGEN
+A5E4;AL # VAI SYLLABLE HE
+A5E5;AL # VAI SYLLABLE HEN
+A5E6;AL # VAI SYLLABLE WE
+A5E7;AL # VAI SYLLABLE WEN
+A5E8;AL # VAI SYLLABLE PE
+A5E9;AL # VAI SYLLABLE BHE
+A5EA;AL # VAI SYLLABLE BE
+A5EB;AL # VAI SYLLABLE MBE
+A5EC;AL # VAI SYLLABLE KPE
+A5ED;AL # VAI SYLLABLE KPEN
+A5EE;AL # VAI SYLLABLE MGBE
+A5EF;AL # VAI SYLLABLE GBE
+A5F0;AL # VAI SYLLABLE GBEN
+A5F1;AL # VAI SYLLABLE FE
+A5F2;AL # VAI SYLLABLE VE
+A5F3;AL # VAI SYLLABLE TE
+A5F4;AL # VAI SYLLABLE THE
+A5F5;AL # VAI SYLLABLE DHE
+A5F6;AL # VAI SYLLABLE DHHE
+A5F7;AL # VAI SYLLABLE LE
+A5F8;AL # VAI SYLLABLE RE
+A5F9;AL # VAI SYLLABLE DE
+A5FA;AL # VAI SYLLABLE NDE
+A5FB;AL # VAI SYLLABLE SE
+A5FC;AL # VAI SYLLABLE SHE
+A5FD;AL # VAI SYLLABLE ZE
+A5FE;AL # VAI SYLLABLE ZHE
+A5FF;AL # VAI SYLLABLE CE
+A600;AL # VAI SYLLABLE JE
+A601;AL # VAI SYLLABLE NJE
+A602;AL # VAI SYLLABLE YE
+A603;AL # VAI SYLLABLE KE
+A604;AL # VAI SYLLABLE NGGE
+A605;AL # VAI SYLLABLE NGGEN
+A606;AL # VAI SYLLABLE GE
+A607;AL # VAI SYLLABLE GEN
+A608;AL # VAI SYLLABLE ME
+A609;AL # VAI SYLLABLE NE
+A60A;AL # VAI SYLLABLE NYE
+A60B;AL # VAI SYLLABLE NG
+A60C;AL # VAI SYLLABLE LENGTHENER
+A60D;BA # VAI COMMA
+A60E;EX # VAI FULL STOP
+A60F;BA # VAI QUESTION MARK
+A610;AL # VAI SYLLABLE NDOLE FA
+A611;AL # VAI SYLLABLE NDOLE KA
+A612;AL # VAI SYLLABLE NDOLE SOO
+A613;AL # VAI SYMBOL FEENG
+A614;AL # VAI SYMBOL KEENG
+A615;AL # VAI SYMBOL TING
+A616;AL # VAI SYMBOL NII
+A617;AL # VAI SYMBOL BANG
+A618;AL # VAI SYMBOL FAA
+A619;AL # VAI SYMBOL TAA
+A61A;AL # VAI SYMBOL DANG
+A61B;AL # VAI SYMBOL DOONG
+A61C;AL # VAI SYMBOL KUNG
+A61D;AL # VAI SYMBOL TONG
+A61E;AL # VAI SYMBOL DO-O
+A61F;AL # VAI SYMBOL JONG
+A620;NU # VAI DIGIT ZERO
+A621;NU # VAI DIGIT ONE
+A622;NU # VAI DIGIT TWO
+A623;NU # VAI DIGIT THREE
+A624;NU # VAI DIGIT FOUR
+A625;NU # VAI DIGIT FIVE
+A626;NU # VAI DIGIT SIX
+A627;NU # VAI DIGIT SEVEN
+A628;NU # VAI DIGIT EIGHT
+A629;NU # VAI DIGIT NINE
+A62A;AL # VAI SYLLABLE NDOLE MA
+A62B;AL # VAI SYLLABLE NDOLE DO
+A640;AL # CYRILLIC CAPITAL LETTER ZEMLYA
+A641;AL # CYRILLIC SMALL LETTER ZEMLYA
+A642;AL # CYRILLIC CAPITAL LETTER DZELO
+A643;AL # CYRILLIC SMALL LETTER DZELO
+A644;AL # CYRILLIC CAPITAL LETTER REVERSED DZE
+A645;AL # CYRILLIC SMALL LETTER REVERSED DZE
+A646;AL # CYRILLIC CAPITAL LETTER IOTA
+A647;AL # CYRILLIC SMALL LETTER IOTA
+A648;AL # CYRILLIC CAPITAL LETTER DJERV
+A649;AL # CYRILLIC SMALL LETTER DJERV
+A64A;AL # CYRILLIC CAPITAL LETTER MONOGRAPH UK
+A64B;AL # CYRILLIC SMALL LETTER MONOGRAPH UK
+A64C;AL # CYRILLIC CAPITAL LETTER BROAD OMEGA
+A64D;AL # CYRILLIC SMALL LETTER BROAD OMEGA
+A64E;AL # CYRILLIC CAPITAL LETTER NEUTRAL YER
+A64F;AL # CYRILLIC SMALL LETTER NEUTRAL YER
+A650;AL # CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+A651;AL # CYRILLIC SMALL LETTER YERU WITH BACK YER
+A652;AL # CYRILLIC CAPITAL LETTER IOTIFIED YAT
+A653;AL # CYRILLIC SMALL LETTER IOTIFIED YAT
+A654;AL # CYRILLIC CAPITAL LETTER REVERSED YU
+A655;AL # CYRILLIC SMALL LETTER REVERSED YU
+A656;AL # CYRILLIC CAPITAL LETTER IOTIFIED A
+A657;AL # CYRILLIC SMALL LETTER IOTIFIED A
+A658;AL # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+A659;AL # CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+A65A;AL # CYRILLIC CAPITAL LETTER BLENDED YUS
+A65B;AL # CYRILLIC SMALL LETTER BLENDED YUS
+A65C;AL # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+A65D;AL # CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+A65E;AL # CYRILLIC CAPITAL LETTER YN
+A65F;AL # CYRILLIC SMALL LETTER YN
+A662;AL # CYRILLIC CAPITAL LETTER SOFT DE
+A663;AL # CYRILLIC SMALL LETTER SOFT DE
+A664;AL # CYRILLIC CAPITAL LETTER SOFT EL
+A665;AL # CYRILLIC SMALL LETTER SOFT EL
+A666;AL # CYRILLIC CAPITAL LETTER SOFT EM
+A667;AL # CYRILLIC SMALL LETTER SOFT EM
+A668;AL # CYRILLIC CAPITAL LETTER MONOCULAR O
+A669;AL # CYRILLIC SMALL LETTER MONOCULAR O
+A66A;AL # CYRILLIC CAPITAL LETTER BINOCULAR O
+A66B;AL # CYRILLIC SMALL LETTER BINOCULAR O
+A66C;AL # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+A66D;AL # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E;AL # CYRILLIC LETTER MULTIOCULAR O
+A66F;CM # COMBINING CYRILLIC VZMET
+A670;CM # COMBINING CYRILLIC TEN MILLIONS SIGN
+A671;CM # COMBINING CYRILLIC HUNDRED MILLIONS SIGN
+A672;CM # COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A673;AL # SLAVONIC ASTERISK
+A67C;CM # COMBINING CYRILLIC KAVYKA
+A67D;CM # COMBINING CYRILLIC PAYEROK
+A67E;AL # CYRILLIC KAVYKA
+A67F;AL # CYRILLIC PAYEROK
+A680;AL # CYRILLIC CAPITAL LETTER DWE
+A681;AL # CYRILLIC SMALL LETTER DWE
+A682;AL # CYRILLIC CAPITAL LETTER DZWE
+A683;AL # CYRILLIC SMALL LETTER DZWE
+A684;AL # CYRILLIC CAPITAL LETTER ZHWE
+A685;AL # CYRILLIC SMALL LETTER ZHWE
+A686;AL # CYRILLIC CAPITAL LETTER CCHE
+A687;AL # CYRILLIC SMALL LETTER CCHE
+A688;AL # CYRILLIC CAPITAL LETTER DZZE
+A689;AL # CYRILLIC SMALL LETTER DZZE
+A68A;AL # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+A68B;AL # CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+A68C;AL # CYRILLIC CAPITAL LETTER TWE
+A68D;AL # CYRILLIC SMALL LETTER TWE
+A68E;AL # CYRILLIC CAPITAL LETTER TSWE
+A68F;AL # CYRILLIC SMALL LETTER TSWE
+A690;AL # CYRILLIC CAPITAL LETTER TSSE
+A691;AL # CYRILLIC SMALL LETTER TSSE
+A692;AL # CYRILLIC CAPITAL LETTER TCHE
+A693;AL # CYRILLIC SMALL LETTER TCHE
+A694;AL # CYRILLIC CAPITAL LETTER HWE
+A695;AL # CYRILLIC SMALL LETTER HWE
+A696;AL # CYRILLIC CAPITAL LETTER SHWE
+A697;AL # CYRILLIC SMALL LETTER SHWE
+A700;AL # MODIFIER LETTER CHINESE TONE YIN PING
+A701;AL # MODIFIER LETTER CHINESE TONE YANG PING
+A702;AL # MODIFIER LETTER CHINESE TONE YIN SHANG
+A703;AL # MODIFIER LETTER CHINESE TONE YANG SHANG
+A704;AL # MODIFIER LETTER CHINESE TONE YIN QU
+A705;AL # MODIFIER LETTER CHINESE TONE YANG QU
+A706;AL # MODIFIER LETTER CHINESE TONE YIN RU
+A707;AL # MODIFIER LETTER CHINESE TONE YANG RU
+A708;AL # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR
+A709;AL # MODIFIER LETTER HIGH DOTTED TONE BAR
+A70A;AL # MODIFIER LETTER MID DOTTED TONE BAR
+A70B;AL # MODIFIER LETTER LOW DOTTED TONE BAR
+A70C;AL # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR
+A70D;AL # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR
+A70E;AL # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR
+A70F;AL # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR
+A710;AL # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR
+A711;AL # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR
+A712;AL # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR
+A713;AL # MODIFIER LETTER HIGH LEFT-STEM TONE BAR
+A714;AL # MODIFIER LETTER MID LEFT-STEM TONE BAR
+A715;AL # MODIFIER LETTER LOW LEFT-STEM TONE BAR
+A716;AL # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717;AL # MODIFIER LETTER DOT VERTICAL BAR
+A718;AL # MODIFIER LETTER DOT SLASH
+A719;AL # MODIFIER LETTER DOT HORIZONTAL BAR
+A71A;AL # MODIFIER LETTER LOWER RIGHT CORNER ANGLE
+A71B;AL # MODIFIER LETTER RAISED UP ARROW
+A71C;AL # MODIFIER LETTER RAISED DOWN ARROW
+A71D;AL # MODIFIER LETTER RAISED EXCLAMATION MARK
+A71E;AL # MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK
+A71F;AL # MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720;AL # MODIFIER LETTER STRESS AND HIGH TONE
+A721;AL # MODIFIER LETTER STRESS AND LOW TONE
+A722;AL # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+A723;AL # LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+A724;AL # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+A725;AL # LATIN SMALL LETTER EGYPTOLOGICAL AIN
+A726;AL # LATIN CAPITAL LETTER HENG
+A727;AL # LATIN SMALL LETTER HENG
+A728;AL # LATIN CAPITAL LETTER TZ
+A729;AL # LATIN SMALL LETTER TZ
+A72A;AL # LATIN CAPITAL LETTER TRESILLO
+A72B;AL # LATIN SMALL LETTER TRESILLO
+A72C;AL # LATIN CAPITAL LETTER CUATRILLO
+A72D;AL # LATIN SMALL LETTER CUATRILLO
+A72E;AL # LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+A72F;AL # LATIN SMALL LETTER CUATRILLO WITH COMMA
+A730;AL # LATIN LETTER SMALL CAPITAL F
+A731;AL # LATIN LETTER SMALL CAPITAL S
+A732;AL # LATIN CAPITAL LETTER AA
+A733;AL # LATIN SMALL LETTER AA
+A734;AL # LATIN CAPITAL LETTER AO
+A735;AL # LATIN SMALL LETTER AO
+A736;AL # LATIN CAPITAL LETTER AU
+A737;AL # LATIN SMALL LETTER AU
+A738;AL # LATIN CAPITAL LETTER AV
+A739;AL # LATIN SMALL LETTER AV
+A73A;AL # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+A73B;AL # LATIN SMALL LETTER AV WITH HORIZONTAL BAR
+A73C;AL # LATIN CAPITAL LETTER AY
+A73D;AL # LATIN SMALL LETTER AY
+A73E;AL # LATIN CAPITAL LETTER REVERSED C WITH DOT
+A73F;AL # LATIN SMALL LETTER REVERSED C WITH DOT
+A740;AL # LATIN CAPITAL LETTER K WITH STROKE
+A741;AL # LATIN SMALL LETTER K WITH STROKE
+A742;AL # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+A743;AL # LATIN SMALL LETTER K WITH DIAGONAL STROKE
+A744;AL # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+A745;AL # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+A746;AL # LATIN CAPITAL LETTER BROKEN L
+A747;AL # LATIN SMALL LETTER BROKEN L
+A748;AL # LATIN CAPITAL LETTER L WITH HIGH STROKE
+A749;AL # LATIN SMALL LETTER L WITH HIGH STROKE
+A74A;AL # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+A74B;AL # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+A74C;AL # LATIN CAPITAL LETTER O WITH LOOP
+A74D;AL # LATIN SMALL LETTER O WITH LOOP
+A74E;AL # LATIN CAPITAL LETTER OO
+A74F;AL # LATIN SMALL LETTER OO
+A750;AL # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+A751;AL # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+A752;AL # LATIN CAPITAL LETTER P WITH FLOURISH
+A753;AL # LATIN SMALL LETTER P WITH FLOURISH
+A754;AL # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+A755;AL # LATIN SMALL LETTER P WITH SQUIRREL TAIL
+A756;AL # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+A757;AL # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+A758;AL # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+A759;AL # LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+A75A;AL # LATIN CAPITAL LETTER R ROTUNDA
+A75B;AL # LATIN SMALL LETTER R ROTUNDA
+A75C;AL # LATIN CAPITAL LETTER RUM ROTUNDA
+A75D;AL # LATIN SMALL LETTER RUM ROTUNDA
+A75E;AL # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+A75F;AL # LATIN SMALL LETTER V WITH DIAGONAL STROKE
+A760;AL # LATIN CAPITAL LETTER VY
+A761;AL # LATIN SMALL LETTER VY
+A762;AL # LATIN CAPITAL LETTER VISIGOTHIC Z
+A763;AL # LATIN SMALL LETTER VISIGOTHIC Z
+A764;AL # LATIN CAPITAL LETTER THORN WITH STROKE
+A765;AL # LATIN SMALL LETTER THORN WITH STROKE
+A766;AL # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+A767;AL # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+A768;AL # LATIN CAPITAL LETTER VEND
+A769;AL # LATIN SMALL LETTER VEND
+A76A;AL # LATIN CAPITAL LETTER ET
+A76B;AL # LATIN SMALL LETTER ET
+A76C;AL # LATIN CAPITAL LETTER IS
+A76D;AL # LATIN SMALL LETTER IS
+A76E;AL # LATIN CAPITAL LETTER CON
+A76F;AL # LATIN SMALL LETTER CON
+A770;AL # MODIFIER LETTER US
+A771;AL # LATIN SMALL LETTER DUM
+A772;AL # LATIN SMALL LETTER LUM
+A773;AL # LATIN SMALL LETTER MUM
+A774;AL # LATIN SMALL LETTER NUM
+A775;AL # LATIN SMALL LETTER RUM
+A776;AL # LATIN LETTER SMALL CAPITAL RUM
+A777;AL # LATIN SMALL LETTER TUM
+A778;AL # LATIN SMALL LETTER UM
+A779;AL # LATIN CAPITAL LETTER INSULAR D
+A77A;AL # LATIN SMALL LETTER INSULAR D
+A77B;AL # LATIN CAPITAL LETTER INSULAR F
+A77C;AL # LATIN SMALL LETTER INSULAR F
+A77D;AL # LATIN CAPITAL LETTER INSULAR G
+A77E;AL # LATIN CAPITAL LETTER TURNED INSULAR G
+A77F;AL # LATIN SMALL LETTER TURNED INSULAR G
+A780;AL # LATIN CAPITAL LETTER TURNED L
+A781;AL # LATIN SMALL LETTER TURNED L
+A782;AL # LATIN CAPITAL LETTER INSULAR R
+A783;AL # LATIN SMALL LETTER INSULAR R
+A784;AL # LATIN CAPITAL LETTER INSULAR S
+A785;AL # LATIN SMALL LETTER INSULAR S
+A786;AL # LATIN CAPITAL LETTER INSULAR T
+A787;AL # LATIN SMALL LETTER INSULAR T
+A788;AL # MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A789;AL # MODIFIER LETTER COLON
+A78A;AL # MODIFIER LETTER SHORT EQUALS SIGN
+A78B;AL # LATIN CAPITAL LETTER SALTILLO
+A78C;AL # LATIN SMALL LETTER SALTILLO
+A7FB;AL # LATIN EPIGRAPHIC LETTER REVERSED F
+A7FC;AL # LATIN EPIGRAPHIC LETTER REVERSED P
+A7FD;AL # LATIN EPIGRAPHIC LETTER INVERTED M
+A7FE;AL # LATIN EPIGRAPHIC LETTER I LONGA
+A7FF;AL # LATIN EPIGRAPHIC LETTER ARCHAIC M
+A800;AL # SYLOTI NAGRI LETTER A
+A801;AL # SYLOTI NAGRI LETTER I
+A802;CM # SYLOTI NAGRI SIGN DVISVARA
+A803;AL # SYLOTI NAGRI LETTER U
+A804;AL # SYLOTI NAGRI LETTER E
+A805;AL # SYLOTI NAGRI LETTER O
+A806;CM # SYLOTI NAGRI SIGN HASANTA
+A807;AL # SYLOTI NAGRI LETTER KO
+A808;AL # SYLOTI NAGRI LETTER KHO
+A809;AL # SYLOTI NAGRI LETTER GO
+A80A;AL # SYLOTI NAGRI LETTER GHO
+A80B;CM # SYLOTI NAGRI SIGN ANUSVARA
+A80C;AL # SYLOTI NAGRI LETTER CO
+A80D;AL # SYLOTI NAGRI LETTER CHO
+A80E;AL # SYLOTI NAGRI LETTER JO
+A80F;AL # SYLOTI NAGRI LETTER JHO
+A810;AL # SYLOTI NAGRI LETTER TTO
+A811;AL # SYLOTI NAGRI LETTER TTHO
+A812;AL # SYLOTI NAGRI LETTER DDO
+A813;AL # SYLOTI NAGRI LETTER DDHO
+A814;AL # SYLOTI NAGRI LETTER TO
+A815;AL # SYLOTI NAGRI LETTER THO
+A816;AL # SYLOTI NAGRI LETTER DO
+A817;AL # SYLOTI NAGRI LETTER DHO
+A818;AL # SYLOTI NAGRI LETTER NO
+A819;AL # SYLOTI NAGRI LETTER PO
+A81A;AL # SYLOTI NAGRI LETTER PHO
+A81B;AL # SYLOTI NAGRI LETTER BO
+A81C;AL # SYLOTI NAGRI LETTER BHO
+A81D;AL # SYLOTI NAGRI LETTER MO
+A81E;AL # SYLOTI NAGRI LETTER RO
+A81F;AL # SYLOTI NAGRI LETTER LO
+A820;AL # SYLOTI NAGRI LETTER RRO
+A821;AL # SYLOTI NAGRI LETTER SO
+A822;AL # SYLOTI NAGRI LETTER HO
+A823;CM # SYLOTI NAGRI VOWEL SIGN A
+A824;CM # SYLOTI NAGRI VOWEL SIGN I
+A825;CM # SYLOTI NAGRI VOWEL SIGN U
+A826;CM # SYLOTI NAGRI VOWEL SIGN E
+A827;CM # SYLOTI NAGRI VOWEL SIGN OO
+A828;AL # SYLOTI NAGRI POETRY MARK-1
+A829;AL # SYLOTI NAGRI POETRY MARK-2
+A82A;AL # SYLOTI NAGRI POETRY MARK-3
+A82B;AL # SYLOTI NAGRI POETRY MARK-4
+A840;AL # PHAGS-PA LETTER KA
+A841;AL # PHAGS-PA LETTER KHA
+A842;AL # PHAGS-PA LETTER GA
+A843;AL # PHAGS-PA LETTER NGA
+A844;AL # PHAGS-PA LETTER CA
+A845;AL # PHAGS-PA LETTER CHA
+A846;AL # PHAGS-PA LETTER JA
+A847;AL # PHAGS-PA LETTER NYA
+A848;AL # PHAGS-PA LETTER TA
+A849;AL # PHAGS-PA LETTER THA
+A84A;AL # PHAGS-PA LETTER DA
+A84B;AL # PHAGS-PA LETTER NA
+A84C;AL # PHAGS-PA LETTER PA
+A84D;AL # PHAGS-PA LETTER PHA
+A84E;AL # PHAGS-PA LETTER BA
+A84F;AL # PHAGS-PA LETTER MA
+A850;AL # PHAGS-PA LETTER TSA
+A851;AL # PHAGS-PA LETTER TSHA
+A852;AL # PHAGS-PA LETTER DZA
+A853;AL # PHAGS-PA LETTER WA
+A854;AL # PHAGS-PA LETTER ZHA
+A855;AL # PHAGS-PA LETTER ZA
+A856;AL # PHAGS-PA LETTER SMALL A
+A857;AL # PHAGS-PA LETTER YA
+A858;AL # PHAGS-PA LETTER RA
+A859;AL # PHAGS-PA LETTER LA
+A85A;AL # PHAGS-PA LETTER SHA
+A85B;AL # PHAGS-PA LETTER SA
+A85C;AL # PHAGS-PA LETTER HA
+A85D;AL # PHAGS-PA LETTER A
+A85E;AL # PHAGS-PA LETTER I
+A85F;AL # PHAGS-PA LETTER U
+A860;AL # PHAGS-PA LETTER E
+A861;AL # PHAGS-PA LETTER O
+A862;AL # PHAGS-PA LETTER QA
+A863;AL # PHAGS-PA LETTER XA
+A864;AL # PHAGS-PA LETTER FA
+A865;AL # PHAGS-PA LETTER GGA
+A866;AL # PHAGS-PA LETTER EE
+A867;AL # PHAGS-PA SUBJOINED LETTER WA
+A868;AL # PHAGS-PA SUBJOINED LETTER YA
+A869;AL # PHAGS-PA LETTER TTA
+A86A;AL # PHAGS-PA LETTER TTHA
+A86B;AL # PHAGS-PA LETTER DDA
+A86C;AL # PHAGS-PA LETTER NNA
+A86D;AL # PHAGS-PA LETTER ALTERNATE YA
+A86E;AL # PHAGS-PA LETTER VOICELESS SHA
+A86F;AL # PHAGS-PA LETTER VOICED HA
+A870;AL # PHAGS-PA LETTER ASPIRATED FA
+A871;AL # PHAGS-PA SUBJOINED LETTER RA
+A872;AL # PHAGS-PA SUPERFIXED LETTER RA
+A873;AL # PHAGS-PA LETTER CANDRABINDU
+A874;BB # PHAGS-PA SINGLE HEAD MARK
+A875;BB # PHAGS-PA DOUBLE HEAD MARK
+A876;EX # PHAGS-PA MARK SHAD
+A877;EX # PHAGS-PA MARK DOUBLE SHAD
+A880;CM # SAURASHTRA SIGN ANUSVARA
+A881;CM # SAURASHTRA SIGN VISARGA
+A882;AL # SAURASHTRA LETTER A
+A883;AL # SAURASHTRA LETTER AA
+A884;AL # SAURASHTRA LETTER I
+A885;AL # SAURASHTRA LETTER II
+A886;AL # SAURASHTRA LETTER U
+A887;AL # SAURASHTRA LETTER UU
+A888;AL # SAURASHTRA LETTER VOCALIC R
+A889;AL # SAURASHTRA LETTER VOCALIC RR
+A88A;AL # SAURASHTRA LETTER VOCALIC L
+A88B;AL # SAURASHTRA LETTER VOCALIC LL
+A88C;AL # SAURASHTRA LETTER E
+A88D;AL # SAURASHTRA LETTER EE
+A88E;AL # SAURASHTRA LETTER AI
+A88F;AL # SAURASHTRA LETTER O
+A890;AL # SAURASHTRA LETTER OO
+A891;AL # SAURASHTRA LETTER AU
+A892;AL # SAURASHTRA LETTER KA
+A893;AL # SAURASHTRA LETTER KHA
+A894;AL # SAURASHTRA LETTER GA
+A895;AL # SAURASHTRA LETTER GHA
+A896;AL # SAURASHTRA LETTER NGA
+A897;AL # SAURASHTRA LETTER CA
+A898;AL # SAURASHTRA LETTER CHA
+A899;AL # SAURASHTRA LETTER JA
+A89A;AL # SAURASHTRA LETTER JHA
+A89B;AL # SAURASHTRA LETTER NYA
+A89C;AL # SAURASHTRA LETTER TTA
+A89D;AL # SAURASHTRA LETTER TTHA
+A89E;AL # SAURASHTRA LETTER DDA
+A89F;AL # SAURASHTRA LETTER DDHA
+A8A0;AL # SAURASHTRA LETTER NNA
+A8A1;AL # SAURASHTRA LETTER TA
+A8A2;AL # SAURASHTRA LETTER THA
+A8A3;AL # SAURASHTRA LETTER DA
+A8A4;AL # SAURASHTRA LETTER DHA
+A8A5;AL # SAURASHTRA LETTER NA
+A8A6;AL # SAURASHTRA LETTER PA
+A8A7;AL # SAURASHTRA LETTER PHA
+A8A8;AL # SAURASHTRA LETTER BA
+A8A9;AL # SAURASHTRA LETTER BHA
+A8AA;AL # SAURASHTRA LETTER MA
+A8AB;AL # SAURASHTRA LETTER YA
+A8AC;AL # SAURASHTRA LETTER RA
+A8AD;AL # SAURASHTRA LETTER LA
+A8AE;AL # SAURASHTRA LETTER VA
+A8AF;AL # SAURASHTRA LETTER SHA
+A8B0;AL # SAURASHTRA LETTER SSA
+A8B1;AL # SAURASHTRA LETTER SA
+A8B2;AL # SAURASHTRA LETTER HA
+A8B3;AL # SAURASHTRA LETTER LLA
+A8B4;CM # SAURASHTRA CONSONANT SIGN HAARU
+A8B5;CM # SAURASHTRA VOWEL SIGN AA
+A8B6;CM # SAURASHTRA VOWEL SIGN I
+A8B7;CM # SAURASHTRA VOWEL SIGN II
+A8B8;CM # SAURASHTRA VOWEL SIGN U
+A8B9;CM # SAURASHTRA VOWEL SIGN UU
+A8BA;CM # SAURASHTRA VOWEL SIGN VOCALIC R
+A8BB;CM # SAURASHTRA VOWEL SIGN VOCALIC RR
+A8BC;CM # SAURASHTRA VOWEL SIGN VOCALIC L
+A8BD;CM # SAURASHTRA VOWEL SIGN VOCALIC LL
+A8BE;CM # SAURASHTRA VOWEL SIGN E
+A8BF;CM # SAURASHTRA VOWEL SIGN EE
+A8C0;CM # SAURASHTRA VOWEL SIGN AI
+A8C1;CM # SAURASHTRA VOWEL SIGN O
+A8C2;CM # SAURASHTRA VOWEL SIGN OO
+A8C3;CM # SAURASHTRA VOWEL SIGN AU
+A8C4;CM # SAURASHTRA SIGN VIRAMA
+A8CE;BA # SAURASHTRA DANDA
+A8CF;BA # SAURASHTRA DOUBLE DANDA
+A8D0;NU # SAURASHTRA DIGIT ZERO
+A8D1;NU # SAURASHTRA DIGIT ONE
+A8D2;NU # SAURASHTRA DIGIT TWO
+A8D3;NU # SAURASHTRA DIGIT THREE
+A8D4;NU # SAURASHTRA DIGIT FOUR
+A8D5;NU # SAURASHTRA DIGIT FIVE
+A8D6;NU # SAURASHTRA DIGIT SIX
+A8D7;NU # SAURASHTRA DIGIT SEVEN
+A8D8;NU # SAURASHTRA DIGIT EIGHT
+A8D9;NU # SAURASHTRA DIGIT NINE
+A900;NU # KAYAH LI DIGIT ZERO
+A901;NU # KAYAH LI DIGIT ONE
+A902;NU # KAYAH LI DIGIT TWO
+A903;NU # KAYAH LI DIGIT THREE
+A904;NU # KAYAH LI DIGIT FOUR
+A905;NU # KAYAH LI DIGIT FIVE
+A906;NU # KAYAH LI DIGIT SIX
+A907;NU # KAYAH LI DIGIT SEVEN
+A908;NU # KAYAH LI DIGIT EIGHT
+A909;NU # KAYAH LI DIGIT NINE
+A90A;AL # KAYAH LI LETTER KA
+A90B;AL # KAYAH LI LETTER KHA
+A90C;AL # KAYAH LI LETTER GA
+A90D;AL # KAYAH LI LETTER NGA
+A90E;AL # KAYAH LI LETTER SA
+A90F;AL # KAYAH LI LETTER SHA
+A910;AL # KAYAH LI LETTER ZA
+A911;AL # KAYAH LI LETTER NYA
+A912;AL # KAYAH LI LETTER TA
+A913;AL # KAYAH LI LETTER HTA
+A914;AL # KAYAH LI LETTER NA
+A915;AL # KAYAH LI LETTER PA
+A916;AL # KAYAH LI LETTER PHA
+A917;AL # KAYAH LI LETTER MA
+A918;AL # KAYAH LI LETTER DA
+A919;AL # KAYAH LI LETTER BA
+A91A;AL # KAYAH LI LETTER RA
+A91B;AL # KAYAH LI LETTER YA
+A91C;AL # KAYAH LI LETTER LA
+A91D;AL # KAYAH LI LETTER WA
+A91E;AL # KAYAH LI LETTER THA
+A91F;AL # KAYAH LI LETTER HA
+A920;AL # KAYAH LI LETTER VA
+A921;AL # KAYAH LI LETTER CA
+A922;AL # KAYAH LI LETTER A
+A923;AL # KAYAH LI LETTER OE
+A924;AL # KAYAH LI LETTER I
+A925;AL # KAYAH LI LETTER OO
+A926;CM # KAYAH LI VOWEL UE
+A927;CM # KAYAH LI VOWEL E
+A928;CM # KAYAH LI VOWEL U
+A929;CM # KAYAH LI VOWEL EE
+A92A;CM # KAYAH LI VOWEL O
+A92B;CM # KAYAH LI TONE PLOPHU
+A92C;CM # KAYAH LI TONE CALYA
+A92D;CM # KAYAH LI TONE CALYA PLOPHU
+A92E;BA # KAYAH LI SIGN CWI
+A92F;BA # KAYAH LI SIGN SHYA
+A930;AL # REJANG LETTER KA
+A931;AL # REJANG LETTER GA
+A932;AL # REJANG LETTER NGA
+A933;AL # REJANG LETTER TA
+A934;AL # REJANG LETTER DA
+A935;AL # REJANG LETTER NA
+A936;AL # REJANG LETTER PA
+A937;AL # REJANG LETTER BA
+A938;AL # REJANG LETTER MA
+A939;AL # REJANG LETTER CA
+A93A;AL # REJANG LETTER JA
+A93B;AL # REJANG LETTER NYA
+A93C;AL # REJANG LETTER SA
+A93D;AL # REJANG LETTER RA
+A93E;AL # REJANG LETTER LA
+A93F;AL # REJANG LETTER YA
+A940;AL # REJANG LETTER WA
+A941;AL # REJANG LETTER HA
+A942;AL # REJANG LETTER MBA
+A943;AL # REJANG LETTER NGGA
+A944;AL # REJANG LETTER NDA
+A945;AL # REJANG LETTER NYJA
+A946;AL # REJANG LETTER A
+A947;CM # REJANG VOWEL SIGN I
+A948;CM # REJANG VOWEL SIGN U
+A949;CM # REJANG VOWEL SIGN E
+A94A;CM # REJANG VOWEL SIGN AI
+A94B;CM # REJANG VOWEL SIGN O
+A94C;CM # REJANG VOWEL SIGN AU
+A94D;CM # REJANG VOWEL SIGN EU
+A94E;CM # REJANG VOWEL SIGN EA
+A94F;CM # REJANG CONSONANT SIGN NG
+A950;CM # REJANG CONSONANT SIGN N
+A951;CM # REJANG CONSONANT SIGN R
+A952;CM # REJANG CONSONANT SIGN H
+A953;CM # REJANG VIRAMA
+A95F;AL # REJANG SECTION MARK
+AA00;AL # CHAM LETTER A
+AA01;AL # CHAM LETTER I
+AA02;AL # CHAM LETTER U
+AA03;AL # CHAM LETTER E
+AA04;AL # CHAM LETTER AI
+AA05;AL # CHAM LETTER O
+AA06;AL # CHAM LETTER KA
+AA07;AL # CHAM LETTER KHA
+AA08;AL # CHAM LETTER GA
+AA09;AL # CHAM LETTER GHA
+AA0A;AL # CHAM LETTER NGUE
+AA0B;AL # CHAM LETTER NGA
+AA0C;AL # CHAM LETTER CHA
+AA0D;AL # CHAM LETTER CHHA
+AA0E;AL # CHAM LETTER JA
+AA0F;AL # CHAM LETTER JHA
+AA10;AL # CHAM LETTER NHUE
+AA11;AL # CHAM LETTER NHA
+AA12;AL # CHAM LETTER NHJA
+AA13;AL # CHAM LETTER TA
+AA14;AL # CHAM LETTER THA
+AA15;AL # CHAM LETTER DA
+AA16;AL # CHAM LETTER DHA
+AA17;AL # CHAM LETTER NUE
+AA18;AL # CHAM LETTER NA
+AA19;AL # CHAM LETTER DDA
+AA1A;AL # CHAM LETTER PA
+AA1B;AL # CHAM LETTER PPA
+AA1C;AL # CHAM LETTER PHA
+AA1D;AL # CHAM LETTER BA
+AA1E;AL # CHAM LETTER BHA
+AA1F;AL # CHAM LETTER MUE
+AA20;AL # CHAM LETTER MA
+AA21;AL # CHAM LETTER BBA
+AA22;AL # CHAM LETTER YA
+AA23;AL # CHAM LETTER RA
+AA24;AL # CHAM LETTER LA
+AA25;AL # CHAM LETTER VA
+AA26;AL # CHAM LETTER SSA
+AA27;AL # CHAM LETTER SA
+AA28;AL # CHAM LETTER HA
+AA29;CM # CHAM VOWEL SIGN AA
+AA2A;CM # CHAM VOWEL SIGN I
+AA2B;CM # CHAM VOWEL SIGN II
+AA2C;CM # CHAM VOWEL SIGN EI
+AA2D;CM # CHAM VOWEL SIGN U
+AA2E;CM # CHAM VOWEL SIGN OE
+AA2F;CM # CHAM VOWEL SIGN O
+AA30;CM # CHAM VOWEL SIGN AI
+AA31;CM # CHAM VOWEL SIGN AU
+AA32;CM # CHAM VOWEL SIGN UE
+AA33;CM # CHAM CONSONANT SIGN YA
+AA34;CM # CHAM CONSONANT SIGN RA
+AA35;CM # CHAM CONSONANT SIGN LA
+AA36;CM # CHAM CONSONANT SIGN WA
+AA40;AL # CHAM LETTER FINAL K
+AA41;AL # CHAM LETTER FINAL G
+AA42;AL # CHAM LETTER FINAL NG
+AA43;CM # CHAM CONSONANT SIGN FINAL NG
+AA44;AL # CHAM LETTER FINAL CH
+AA45;AL # CHAM LETTER FINAL T
+AA46;AL # CHAM LETTER FINAL N
+AA47;AL # CHAM LETTER FINAL P
+AA48;AL # CHAM LETTER FINAL Y
+AA49;AL # CHAM LETTER FINAL R
+AA4A;AL # CHAM LETTER FINAL L
+AA4B;AL # CHAM LETTER FINAL SS
+AA4C;CM # CHAM CONSONANT SIGN FINAL M
+AA4D;CM # CHAM CONSONANT SIGN FINAL H
+AA50;NU # CHAM DIGIT ZERO
+AA51;NU # CHAM DIGIT ONE
+AA52;NU # CHAM DIGIT TWO
+AA53;NU # CHAM DIGIT THREE
+AA54;NU # CHAM DIGIT FOUR
+AA55;NU # CHAM DIGIT FIVE
+AA56;NU # CHAM DIGIT SIX
+AA57;NU # CHAM DIGIT SEVEN
+AA58;NU # CHAM DIGIT EIGHT
+AA59;NU # CHAM DIGIT NINE
+AA5C;AL # CHAM PUNCTUATION SPIRAL
+AA5D;BA # CHAM PUNCTUATION DANDA
+AA5E;BA # CHAM PUNCTUATION DOUBLE DANDA
+AA5F;BA # CHAM PUNCTUATION TRIPLE DANDA
+AC00;H2 # HANGUL SYLLABLE GA
+AC01..AC1B;H3 # HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH
+AC1C;H2 # HANGUL SYLLABLE GAE
+AC1D..AC37;H3 # HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH
+AC38;H2 # HANGUL SYLLABLE GYA
+AC39..AC53;H3 # HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH
+AC54;H2 # HANGUL SYLLABLE GYAE
+AC55..AC6F;H3 # HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH
+AC70;H2 # HANGUL SYLLABLE GEO
+AC71..AC8B;H3 # HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH
+AC8C;H2 # HANGUL SYLLABLE GE
+AC8D..ACA7;H3 # HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH
+ACA8;H2 # HANGUL SYLLABLE GYEO
+ACA9..ACC3;H3 # HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH
+ACC4;H2 # HANGUL SYLLABLE GYE
+ACC5..ACDF;H3 # HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH
+ACE0;H2 # HANGUL SYLLABLE GO
+ACE1..ACFB;H3 # HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH
+ACFC;H2 # HANGUL SYLLABLE GWA
+ACFD..AD17;H3 # HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH
+AD18;H2 # HANGUL SYLLABLE GWAE
+AD19..AD33;H3 # HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH
+AD34;H2 # HANGUL SYLLABLE GOE
+AD35..AD4F;H3 # HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH
+AD50;H2 # HANGUL SYLLABLE GYO
+AD51..AD6B;H3 # HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH
+AD6C;H2 # HANGUL SYLLABLE GU
+AD6D..AD87;H3 # HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH
+AD88;H2 # HANGUL SYLLABLE GWEO
+AD89..ADA3;H3 # HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH
+ADA4;H2 # HANGUL SYLLABLE GWE
+ADA5..ADBF;H3 # HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH
+ADC0;H2 # HANGUL SYLLABLE GWI
+ADC1..ADDB;H3 # HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH
+ADDC;H2 # HANGUL SYLLABLE GYU
+ADDD..ADF7;H3 # HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH
+ADF8;H2 # HANGUL SYLLABLE GEU
+ADF9..AE13;H3 # HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH
+AE14;H2 # HANGUL SYLLABLE GYI
+AE15..AE2F;H3 # HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH
+AE30;H2 # HANGUL SYLLABLE GI
+AE31..AE4B;H3 # HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH
+AE4C;H2 # HANGUL SYLLABLE GGA
+AE4D..AE67;H3 # HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH
+AE68;H2 # HANGUL SYLLABLE GGAE
+AE69..AE83;H3 # HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH
+AE84;H2 # HANGUL SYLLABLE GGYA
+AE85..AE9F;H3 # HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH
+AEA0;H2 # HANGUL SYLLABLE GGYAE
+AEA1..AEBB;H3 # HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH
+AEBC;H2 # HANGUL SYLLABLE GGEO
+AEBD..AED7;H3 # HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH
+AED8;H2 # HANGUL SYLLABLE GGE
+AED9..AEF3;H3 # HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH
+AEF4;H2 # HANGUL SYLLABLE GGYEO
+AEF5..AF0F;H3 # HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH
+AF10;H2 # HANGUL SYLLABLE GGYE
+AF11..AF2B;H3 # HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH
+AF2C;H2 # HANGUL SYLLABLE GGO
+AF2D..AF47;H3 # HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH
+AF48;H2 # HANGUL SYLLABLE GGWA
+AF49..AF63;H3 # HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH
+AF64;H2 # HANGUL SYLLABLE GGWAE
+AF65..AF7F;H3 # HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH
+AF80;H2 # HANGUL SYLLABLE GGOE
+AF81..AF9B;H3 # HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH
+AF9C;H2 # HANGUL SYLLABLE GGYO
+AF9D..AFB7;H3 # HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH
+AFB8;H2 # HANGUL SYLLABLE GGU
+AFB9..AFD3;H3 # HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH
+AFD4;H2 # HANGUL SYLLABLE GGWEO
+AFD5..AFEF;H3 # HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH
+AFF0;H2 # HANGUL SYLLABLE GGWE
+AFF1..B00B;H3 # HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH
+B00C;H2 # HANGUL SYLLABLE GGWI
+B00D..B027;H3 # HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH
+B028;H2 # HANGUL SYLLABLE GGYU
+B029..B043;H3 # HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH
+B044;H2 # HANGUL SYLLABLE GGEU
+B045..B05F;H3 # HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH
+B060;H2 # HANGUL SYLLABLE GGYI
+B061..B07B;H3 # HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH
+B07C;H2 # HANGUL SYLLABLE GGI
+B07D..B097;H3 # HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH
+B098;H2 # HANGUL SYLLABLE NA
+B099..B0B3;H3 # HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH
+B0B4;H2 # HANGUL SYLLABLE NAE
+B0B5..B0CF;H3 # HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH
+B0D0;H2 # HANGUL SYLLABLE NYA
+B0D1..B0EB;H3 # HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH
+B0EC;H2 # HANGUL SYLLABLE NYAE
+B0ED..B107;H3 # HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH
+B108;H2 # HANGUL SYLLABLE NEO
+B109..B123;H3 # HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH
+B124;H2 # HANGUL SYLLABLE NE
+B125..B13F;H3 # HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH
+B140;H2 # HANGUL SYLLABLE NYEO
+B141..B15B;H3 # HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH
+B15C;H2 # HANGUL SYLLABLE NYE
+B15D..B177;H3 # HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH
+B178;H2 # HANGUL SYLLABLE NO
+B179..B193;H3 # HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH
+B194;H2 # HANGUL SYLLABLE NWA
+B195..B1AF;H3 # HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH
+B1B0;H2 # HANGUL SYLLABLE NWAE
+B1B1..B1CB;H3 # HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH
+B1CC;H2 # HANGUL SYLLABLE NOE
+B1CD..B1E7;H3 # HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH
+B1E8;H2 # HANGUL SYLLABLE NYO
+B1E9..B203;H3 # HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH
+B204;H2 # HANGUL SYLLABLE NU
+B205..B21F;H3 # HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH
+B220;H2 # HANGUL SYLLABLE NWEO
+B221..B23B;H3 # HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH
+B23C;H2 # HANGUL SYLLABLE NWE
+B23D..B257;H3 # HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH
+B258;H2 # HANGUL SYLLABLE NWI
+B259..B273;H3 # HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH
+B274;H2 # HANGUL SYLLABLE NYU
+B275..B28F;H3 # HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH
+B290;H2 # HANGUL SYLLABLE NEU
+B291..B2AB;H3 # HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH
+B2AC;H2 # HANGUL SYLLABLE NYI
+B2AD..B2C7;H3 # HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH
+B2C8;H2 # HANGUL SYLLABLE NI
+B2C9..B2E3;H3 # HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH
+B2E4;H2 # HANGUL SYLLABLE DA
+B2E5..B2FF;H3 # HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH
+B300;H2 # HANGUL SYLLABLE DAE
+B301..B31B;H3 # HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH
+B31C;H2 # HANGUL SYLLABLE DYA
+B31D..B337;H3 # HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH
+B338;H2 # HANGUL SYLLABLE DYAE
+B339..B353;H3 # HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH
+B354;H2 # HANGUL SYLLABLE DEO
+B355..B36F;H3 # HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH
+B370;H2 # HANGUL SYLLABLE DE
+B371..B38B;H3 # HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH
+B38C;H2 # HANGUL SYLLABLE DYEO
+B38D..B3A7;H3 # HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH
+B3A8;H2 # HANGUL SYLLABLE DYE
+B3A9..B3C3;H3 # HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH
+B3C4;H2 # HANGUL SYLLABLE DO
+B3C5..B3DF;H3 # HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH
+B3E0;H2 # HANGUL SYLLABLE DWA
+B3E1..B3FB;H3 # HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH
+B3FC;H2 # HANGUL SYLLABLE DWAE
+B3FD..B417;H3 # HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH
+B418;H2 # HANGUL SYLLABLE DOE
+B419..B433;H3 # HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH
+B434;H2 # HANGUL SYLLABLE DYO
+B435..B44F;H3 # HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH
+B450;H2 # HANGUL SYLLABLE DU
+B451..B46B;H3 # HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH
+B46C;H2 # HANGUL SYLLABLE DWEO
+B46D..B487;H3 # HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH
+B488;H2 # HANGUL SYLLABLE DWE
+B489..B4A3;H3 # HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH
+B4A4;H2 # HANGUL SYLLABLE DWI
+B4A5..B4BF;H3 # HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH
+B4C0;H2 # HANGUL SYLLABLE DYU
+B4C1..B4DB;H3 # HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH
+B4DC;H2 # HANGUL SYLLABLE DEU
+B4DD..B4F7;H3 # HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH
+B4F8;H2 # HANGUL SYLLABLE DYI
+B4F9..B513;H3 # HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH
+B514;H2 # HANGUL SYLLABLE DI
+B515..B52F;H3 # HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH
+B530;H2 # HANGUL SYLLABLE DDA
+B531..B54B;H3 # HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH
+B54C;H2 # HANGUL SYLLABLE DDAE
+B54D..B567;H3 # HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH
+B568;H2 # HANGUL SYLLABLE DDYA
+B569..B583;H3 # HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH
+B584;H2 # HANGUL SYLLABLE DDYAE
+B585..B59F;H3 # HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH
+B5A0;H2 # HANGUL SYLLABLE DDEO
+B5A1..B5BB;H3 # HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH
+B5BC;H2 # HANGUL SYLLABLE DDE
+B5BD..B5D7;H3 # HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH
+B5D8;H2 # HANGUL SYLLABLE DDYEO
+B5D9..B5F3;H3 # HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH
+B5F4;H2 # HANGUL SYLLABLE DDYE
+B5F5..B60F;H3 # HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH
+B610;H2 # HANGUL SYLLABLE DDO
+B611..B62B;H3 # HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH
+B62C;H2 # HANGUL SYLLABLE DDWA
+B62D..B647;H3 # HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH
+B648;H2 # HANGUL SYLLABLE DDWAE
+B649..B663;H3 # HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH
+B664;H2 # HANGUL SYLLABLE DDOE
+B665..B67F;H3 # HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH
+B680;H2 # HANGUL SYLLABLE DDYO
+B681..B69B;H3 # HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH
+B69C;H2 # HANGUL SYLLABLE DDU
+B69D..B6B7;H3 # HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH
+B6B8;H2 # HANGUL SYLLABLE DDWEO
+B6B9..B6D3;H3 # HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH
+B6D4;H2 # HANGUL SYLLABLE DDWE
+B6D5..B6EF;H3 # HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH
+B6F0;H2 # HANGUL SYLLABLE DDWI
+B6F1..B70B;H3 # HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH
+B70C;H2 # HANGUL SYLLABLE DDYU
+B70D..B727;H3 # HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH
+B728;H2 # HANGUL SYLLABLE DDEU
+B729..B743;H3 # HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH
+B744;H2 # HANGUL SYLLABLE DDYI
+B745..B75F;H3 # HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH
+B760;H2 # HANGUL SYLLABLE DDI
+B761..B77B;H3 # HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH
+B77C;H2 # HANGUL SYLLABLE RA
+B77D..B797;H3 # HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH
+B798;H2 # HANGUL SYLLABLE RAE
+B799..B7B3;H3 # HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH
+B7B4;H2 # HANGUL SYLLABLE RYA
+B7B5..B7CF;H3 # HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH
+B7D0;H2 # HANGUL SYLLABLE RYAE
+B7D1..B7EB;H3 # HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH
+B7EC;H2 # HANGUL SYLLABLE REO
+B7ED..B807;H3 # HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH
+B808;H2 # HANGUL SYLLABLE RE
+B809..B823;H3 # HANGUL SYLLABLE REG..HANGUL SYLLABLE REH
+B824;H2 # HANGUL SYLLABLE RYEO
+B825..B83F;H3 # HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH
+B840;H2 # HANGUL SYLLABLE RYE
+B841..B85B;H3 # HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH
+B85C;H2 # HANGUL SYLLABLE RO
+B85D..B877;H3 # HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH
+B878;H2 # HANGUL SYLLABLE RWA
+B879..B893;H3 # HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH
+B894;H2 # HANGUL SYLLABLE RWAE
+B895..B8AF;H3 # HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH
+B8B0;H2 # HANGUL SYLLABLE ROE
+B8B1..B8CB;H3 # HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH
+B8CC;H2 # HANGUL SYLLABLE RYO
+B8CD..B8E7;H3 # HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH
+B8E8;H2 # HANGUL SYLLABLE RU
+B8E9..B903;H3 # HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH
+B904;H2 # HANGUL SYLLABLE RWEO
+B905..B91F;H3 # HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH
+B920;H2 # HANGUL SYLLABLE RWE
+B921..B93B;H3 # HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH
+B93C;H2 # HANGUL SYLLABLE RWI
+B93D..B957;H3 # HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH
+B958;H2 # HANGUL SYLLABLE RYU
+B959..B973;H3 # HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH
+B974;H2 # HANGUL SYLLABLE REU
+B975..B98F;H3 # HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH
+B990;H2 # HANGUL SYLLABLE RYI
+B991..B9AB;H3 # HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH
+B9AC;H2 # HANGUL SYLLABLE RI
+B9AD..B9C7;H3 # HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH
+B9C8;H2 # HANGUL SYLLABLE MA
+B9C9..B9E3;H3 # HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH
+B9E4;H2 # HANGUL SYLLABLE MAE
+B9E5..B9FF;H3 # HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH
+BA00;H2 # HANGUL SYLLABLE MYA
+BA01..BA1B;H3 # HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH
+BA1C;H2 # HANGUL SYLLABLE MYAE
+BA1D..BA37;H3 # HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH
+BA38;H2 # HANGUL SYLLABLE MEO
+BA39..BA53;H3 # HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH
+BA54;H2 # HANGUL SYLLABLE ME
+BA55..BA6F;H3 # HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH
+BA70;H2 # HANGUL SYLLABLE MYEO
+BA71..BA8B;H3 # HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH
+BA8C;H2 # HANGUL SYLLABLE MYE
+BA8D..BAA7;H3 # HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH
+BAA8;H2 # HANGUL SYLLABLE MO
+BAA9..BAC3;H3 # HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH
+BAC4;H2 # HANGUL SYLLABLE MWA
+BAC5..BADF;H3 # HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH
+BAE0;H2 # HANGUL SYLLABLE MWAE
+BAE1..BAFB;H3 # HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH
+BAFC;H2 # HANGUL SYLLABLE MOE
+BAFD..BB17;H3 # HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH
+BB18;H2 # HANGUL SYLLABLE MYO
+BB19..BB33;H3 # HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH
+BB34;H2 # HANGUL SYLLABLE MU
+BB35..BB4F;H3 # HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH
+BB50;H2 # HANGUL SYLLABLE MWEO
+BB51..BB6B;H3 # HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH
+BB6C;H2 # HANGUL SYLLABLE MWE
+BB6D..BB87;H3 # HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH
+BB88;H2 # HANGUL SYLLABLE MWI
+BB89..BBA3;H3 # HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH
+BBA4;H2 # HANGUL SYLLABLE MYU
+BBA5..BBBF;H3 # HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH
+BBC0;H2 # HANGUL SYLLABLE MEU
+BBC1..BBDB;H3 # HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH
+BBDC;H2 # HANGUL SYLLABLE MYI
+BBDD..BBF7;H3 # HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH
+BBF8;H2 # HANGUL SYLLABLE MI
+BBF9..BC13;H3 # HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH
+BC14;H2 # HANGUL SYLLABLE BA
+BC15..BC2F;H3 # HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH
+BC30;H2 # HANGUL SYLLABLE BAE
+BC31..BC4B;H3 # HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH
+BC4C;H2 # HANGUL SYLLABLE BYA
+BC4D..BC67;H3 # HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH
+BC68;H2 # HANGUL SYLLABLE BYAE
+BC69..BC83;H3 # HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH
+BC84;H2 # HANGUL SYLLABLE BEO
+BC85..BC9F;H3 # HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH
+BCA0;H2 # HANGUL SYLLABLE BE
+BCA1..BCBB;H3 # HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH
+BCBC;H2 # HANGUL SYLLABLE BYEO
+BCBD..BCD7;H3 # HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH
+BCD8;H2 # HANGUL SYLLABLE BYE
+BCD9..BCF3;H3 # HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH
+BCF4;H2 # HANGUL SYLLABLE BO
+BCF5..BD0F;H3 # HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH
+BD10;H2 # HANGUL SYLLABLE BWA
+BD11..BD2B;H3 # HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH
+BD2C;H2 # HANGUL SYLLABLE BWAE
+BD2D..BD47;H3 # HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH
+BD48;H2 # HANGUL SYLLABLE BOE
+BD49..BD63;H3 # HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH
+BD64;H2 # HANGUL SYLLABLE BYO
+BD65..BD7F;H3 # HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH
+BD80;H2 # HANGUL SYLLABLE BU
+BD81..BD9B;H3 # HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH
+BD9C;H2 # HANGUL SYLLABLE BWEO
+BD9D..BDB7;H3 # HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH
+BDB8;H2 # HANGUL SYLLABLE BWE
+BDB9..BDD3;H3 # HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH
+BDD4;H2 # HANGUL SYLLABLE BWI
+BDD5..BDEF;H3 # HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH
+BDF0;H2 # HANGUL SYLLABLE BYU
+BDF1..BE0B;H3 # HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH
+BE0C;H2 # HANGUL SYLLABLE BEU
+BE0D..BE27;H3 # HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH
+BE28;H2 # HANGUL SYLLABLE BYI
+BE29..BE43;H3 # HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH
+BE44;H2 # HANGUL SYLLABLE BI
+BE45..BE5F;H3 # HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH
+BE60;H2 # HANGUL SYLLABLE BBA
+BE61..BE7B;H3 # HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH
+BE7C;H2 # HANGUL SYLLABLE BBAE
+BE7D..BE97;H3 # HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH
+BE98;H2 # HANGUL SYLLABLE BBYA
+BE99..BEB3;H3 # HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH
+BEB4;H2 # HANGUL SYLLABLE BBYAE
+BEB5..BECF;H3 # HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH
+BED0;H2 # HANGUL SYLLABLE BBEO
+BED1..BEEB;H3 # HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH
+BEEC;H2 # HANGUL SYLLABLE BBE
+BEED..BF07;H3 # HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH
+BF08;H2 # HANGUL SYLLABLE BBYEO
+BF09..BF23;H3 # HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH
+BF24;H2 # HANGUL SYLLABLE BBYE
+BF25..BF3F;H3 # HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH
+BF40;H2 # HANGUL SYLLABLE BBO
+BF41..BF5B;H3 # HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH
+BF5C;H2 # HANGUL SYLLABLE BBWA
+BF5D..BF77;H3 # HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH
+BF78;H2 # HANGUL SYLLABLE BBWAE
+BF79..BF93;H3 # HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH
+BF94;H2 # HANGUL SYLLABLE BBOE
+BF95..BFAF;H3 # HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH
+BFB0;H2 # HANGUL SYLLABLE BBYO
+BFB1..BFCB;H3 # HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH
+BFCC;H2 # HANGUL SYLLABLE BBU
+BFCD..BFE7;H3 # HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH
+BFE8;H2 # HANGUL SYLLABLE BBWEO
+BFE9..C003;H3 # HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH
+C004;H2 # HANGUL SYLLABLE BBWE
+C005..C01F;H3 # HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH
+C020;H2 # HANGUL SYLLABLE BBWI
+C021..C03B;H3 # HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH
+C03C;H2 # HANGUL SYLLABLE BBYU
+C03D..C057;H3 # HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH
+C058;H2 # HANGUL SYLLABLE BBEU
+C059..C073;H3 # HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH
+C074;H2 # HANGUL SYLLABLE BBYI
+C075..C08F;H3 # HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH
+C090;H2 # HANGUL SYLLABLE BBI
+C091..C0AB;H3 # HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH
+C0AC;H2 # HANGUL SYLLABLE SA
+C0AD..C0C7;H3 # HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH
+C0C8;H2 # HANGUL SYLLABLE SAE
+C0C9..C0E3;H3 # HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH
+C0E4;H2 # HANGUL SYLLABLE SYA
+C0E5..C0FF;H3 # HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH
+C100;H2 # HANGUL SYLLABLE SYAE
+C101..C11B;H3 # HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH
+C11C;H2 # HANGUL SYLLABLE SEO
+C11D..C137;H3 # HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH
+C138;H2 # HANGUL SYLLABLE SE
+C139..C153;H3 # HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH
+C154;H2 # HANGUL SYLLABLE SYEO
+C155..C16F;H3 # HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH
+C170;H2 # HANGUL SYLLABLE SYE
+C171..C18B;H3 # HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH
+C18C;H2 # HANGUL SYLLABLE SO
+C18D..C1A7;H3 # HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH
+C1A8;H2 # HANGUL SYLLABLE SWA
+C1A9..C1C3;H3 # HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH
+C1C4;H2 # HANGUL SYLLABLE SWAE
+C1C5..C1DF;H3 # HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH
+C1E0;H2 # HANGUL SYLLABLE SOE
+C1E1..C1FB;H3 # HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH
+C1FC;H2 # HANGUL SYLLABLE SYO
+C1FD..C217;H3 # HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH
+C218;H2 # HANGUL SYLLABLE SU
+C219..C233;H3 # HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH
+C234;H2 # HANGUL SYLLABLE SWEO
+C235..C24F;H3 # HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH
+C250;H2 # HANGUL SYLLABLE SWE
+C251..C26B;H3 # HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH
+C26C;H2 # HANGUL SYLLABLE SWI
+C26D..C287;H3 # HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH
+C288;H2 # HANGUL SYLLABLE SYU
+C289..C2A3;H3 # HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH
+C2A4;H2 # HANGUL SYLLABLE SEU
+C2A5..C2BF;H3 # HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH
+C2C0;H2 # HANGUL SYLLABLE SYI
+C2C1..C2DB;H3 # HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH
+C2DC;H2 # HANGUL SYLLABLE SI
+C2DD..C2F7;H3 # HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH
+C2F8;H2 # HANGUL SYLLABLE SSA
+C2F9..C313;H3 # HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH
+C314;H2 # HANGUL SYLLABLE SSAE
+C315..C32F;H3 # HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH
+C330;H2 # HANGUL SYLLABLE SSYA
+C331..C34B;H3 # HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH
+C34C;H2 # HANGUL SYLLABLE SSYAE
+C34D..C367;H3 # HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH
+C368;H2 # HANGUL SYLLABLE SSEO
+C369..C383;H3 # HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH
+C384;H2 # HANGUL SYLLABLE SSE
+C385..C39F;H3 # HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH
+C3A0;H2 # HANGUL SYLLABLE SSYEO
+C3A1..C3BB;H3 # HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH
+C3BC;H2 # HANGUL SYLLABLE SSYE
+C3BD..C3D7;H3 # HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH
+C3D8;H2 # HANGUL SYLLABLE SSO
+C3D9..C3F3;H3 # HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH
+C3F4;H2 # HANGUL SYLLABLE SSWA
+C3F5..C40F;H3 # HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH
+C410;H2 # HANGUL SYLLABLE SSWAE
+C411..C42B;H3 # HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH
+C42C;H2 # HANGUL SYLLABLE SSOE
+C42D..C447;H3 # HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH
+C448;H2 # HANGUL SYLLABLE SSYO
+C449..C463;H3 # HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH
+C464;H2 # HANGUL SYLLABLE SSU
+C465..C47F;H3 # HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH
+C480;H2 # HANGUL SYLLABLE SSWEO
+C481..C49B;H3 # HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH
+C49C;H2 # HANGUL SYLLABLE SSWE
+C49D..C4B7;H3 # HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH
+C4B8;H2 # HANGUL SYLLABLE SSWI
+C4B9..C4D3;H3 # HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH
+C4D4;H2 # HANGUL SYLLABLE SSYU
+C4D5..C4EF;H3 # HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH
+C4F0;H2 # HANGUL SYLLABLE SSEU
+C4F1..C50B;H3 # HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH
+C50C;H2 # HANGUL SYLLABLE SSYI
+C50D..C527;H3 # HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH
+C528;H2 # HANGUL SYLLABLE SSI
+C529..C543;H3 # HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH
+C544;H2 # HANGUL SYLLABLE A
+C545..C55F;H3 # HANGUL SYLLABLE AG..HANGUL SYLLABLE AH
+C560;H2 # HANGUL SYLLABLE AE
+C561..C57B;H3 # HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH
+C57C;H2 # HANGUL SYLLABLE YA
+C57D..C597;H3 # HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH
+C598;H2 # HANGUL SYLLABLE YAE
+C599..C5B3;H3 # HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH
+C5B4;H2 # HANGUL SYLLABLE EO
+C5B5..C5CF;H3 # HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH
+C5D0;H2 # HANGUL SYLLABLE E
+C5D1..C5EB;H3 # HANGUL SYLLABLE EG..HANGUL SYLLABLE EH
+C5EC;H2 # HANGUL SYLLABLE YEO
+C5ED..C607;H3 # HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH
+C608;H2 # HANGUL SYLLABLE YE
+C609..C623;H3 # HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH
+C624;H2 # HANGUL SYLLABLE O
+C625..C63F;H3 # HANGUL SYLLABLE OG..HANGUL SYLLABLE OH
+C640;H2 # HANGUL SYLLABLE WA
+C641..C65B;H3 # HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH
+C65C;H2 # HANGUL SYLLABLE WAE
+C65D..C677;H3 # HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH
+C678;H2 # HANGUL SYLLABLE OE
+C679..C693;H3 # HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH
+C694;H2 # HANGUL SYLLABLE YO
+C695..C6AF;H3 # HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH
+C6B0;H2 # HANGUL SYLLABLE U
+C6B1..C6CB;H3 # HANGUL SYLLABLE UG..HANGUL SYLLABLE UH
+C6CC;H2 # HANGUL SYLLABLE WEO
+C6CD..C6E7;H3 # HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH
+C6E8;H2 # HANGUL SYLLABLE WE
+C6E9..C703;H3 # HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH
+C704;H2 # HANGUL SYLLABLE WI
+C705..C71F;H3 # HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH
+C720;H2 # HANGUL SYLLABLE YU
+C721..C73B;H3 # HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH
+C73C;H2 # HANGUL SYLLABLE EU
+C73D..C757;H3 # HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH
+C758;H2 # HANGUL SYLLABLE YI
+C759..C773;H3 # HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH
+C774;H2 # HANGUL SYLLABLE I
+C775..C78F;H3 # HANGUL SYLLABLE IG..HANGUL SYLLABLE IH
+C790;H2 # HANGUL SYLLABLE JA
+C791..C7AB;H3 # HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH
+C7AC;H2 # HANGUL SYLLABLE JAE
+C7AD..C7C7;H3 # HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH
+C7C8;H2 # HANGUL SYLLABLE JYA
+C7C9..C7E3;H3 # HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH
+C7E4;H2 # HANGUL SYLLABLE JYAE
+C7E5..C7FF;H3 # HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH
+C800;H2 # HANGUL SYLLABLE JEO
+C801..C81B;H3 # HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH
+C81C;H2 # HANGUL SYLLABLE JE
+C81D..C837;H3 # HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH
+C838;H2 # HANGUL SYLLABLE JYEO
+C839..C853;H3 # HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH
+C854;H2 # HANGUL SYLLABLE JYE
+C855..C86F;H3 # HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH
+C870;H2 # HANGUL SYLLABLE JO
+C871..C88B;H3 # HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH
+C88C;H2 # HANGUL SYLLABLE JWA
+C88D..C8A7;H3 # HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH
+C8A8;H2 # HANGUL SYLLABLE JWAE
+C8A9..C8C3;H3 # HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH
+C8C4;H2 # HANGUL SYLLABLE JOE
+C8C5..C8DF;H3 # HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH
+C8E0;H2 # HANGUL SYLLABLE JYO
+C8E1..C8FB;H3 # HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH
+C8FC;H2 # HANGUL SYLLABLE JU
+C8FD..C917;H3 # HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH
+C918;H2 # HANGUL SYLLABLE JWEO
+C919..C933;H3 # HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH
+C934;H2 # HANGUL SYLLABLE JWE
+C935..C94F;H3 # HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH
+C950;H2 # HANGUL SYLLABLE JWI
+C951..C96B;H3 # HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH
+C96C;H2 # HANGUL SYLLABLE JYU
+C96D..C987;H3 # HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH
+C988;H2 # HANGUL SYLLABLE JEU
+C989..C9A3;H3 # HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH
+C9A4;H2 # HANGUL SYLLABLE JYI
+C9A5..C9BF;H3 # HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH
+C9C0;H2 # HANGUL SYLLABLE JI
+C9C1..C9DB;H3 # HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH
+C9DC;H2 # HANGUL SYLLABLE JJA
+C9DD..C9F7;H3 # HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH
+C9F8;H2 # HANGUL SYLLABLE JJAE
+C9F9..CA13;H3 # HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH
+CA14;H2 # HANGUL SYLLABLE JJYA
+CA15..CA2F;H3 # HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH
+CA30;H2 # HANGUL SYLLABLE JJYAE
+CA31..CA4B;H3 # HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH
+CA4C;H2 # HANGUL SYLLABLE JJEO
+CA4D..CA67;H3 # HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH
+CA68;H2 # HANGUL SYLLABLE JJE
+CA69..CA83;H3 # HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH
+CA84;H2 # HANGUL SYLLABLE JJYEO
+CA85..CA9F;H3 # HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH
+CAA0;H2 # HANGUL SYLLABLE JJYE
+CAA1..CABB;H3 # HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH
+CABC;H2 # HANGUL SYLLABLE JJO
+CABD..CAD7;H3 # HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH
+CAD8;H2 # HANGUL SYLLABLE JJWA
+CAD9..CAF3;H3 # HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH
+CAF4;H2 # HANGUL SYLLABLE JJWAE
+CAF5..CB0F;H3 # HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH
+CB10;H2 # HANGUL SYLLABLE JJOE
+CB11..CB2B;H3 # HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH
+CB2C;H2 # HANGUL SYLLABLE JJYO
+CB2D..CB47;H3 # HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH
+CB48;H2 # HANGUL SYLLABLE JJU
+CB49..CB63;H3 # HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH
+CB64;H2 # HANGUL SYLLABLE JJWEO
+CB65..CB7F;H3 # HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH
+CB80;H2 # HANGUL SYLLABLE JJWE
+CB81..CB9B;H3 # HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH
+CB9C;H2 # HANGUL SYLLABLE JJWI
+CB9D..CBB7;H3 # HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH
+CBB8;H2 # HANGUL SYLLABLE JJYU
+CBB9..CBD3;H3 # HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH
+CBD4;H2 # HANGUL SYLLABLE JJEU
+CBD5..CBEF;H3 # HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH
+CBF0;H2 # HANGUL SYLLABLE JJYI
+CBF1..CC0B;H3 # HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH
+CC0C;H2 # HANGUL SYLLABLE JJI
+CC0D..CC27;H3 # HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH
+CC28;H2 # HANGUL SYLLABLE CA
+CC29..CC43;H3 # HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH
+CC44;H2 # HANGUL SYLLABLE CAE
+CC45..CC5F;H3 # HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH
+CC60;H2 # HANGUL SYLLABLE CYA
+CC61..CC7B;H3 # HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH
+CC7C;H2 # HANGUL SYLLABLE CYAE
+CC7D..CC97;H3 # HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH
+CC98;H2 # HANGUL SYLLABLE CEO
+CC99..CCB3;H3 # HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH
+CCB4;H2 # HANGUL SYLLABLE CE
+CCB5..CCCF;H3 # HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH
+CCD0;H2 # HANGUL SYLLABLE CYEO
+CCD1..CCEB;H3 # HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH
+CCEC;H2 # HANGUL SYLLABLE CYE
+CCED..CD07;H3 # HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH
+CD08;H2 # HANGUL SYLLABLE CO
+CD09..CD23;H3 # HANGUL SYLLABLE COG..HANGUL SYLLABLE COH
+CD24;H2 # HANGUL SYLLABLE CWA
+CD25..CD3F;H3 # HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH
+CD40;H2 # HANGUL SYLLABLE CWAE
+CD41..CD5B;H3 # HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH
+CD5C;H2 # HANGUL SYLLABLE COE
+CD5D..CD77;H3 # HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH
+CD78;H2 # HANGUL SYLLABLE CYO
+CD79..CD93;H3 # HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH
+CD94;H2 # HANGUL SYLLABLE CU
+CD95..CDAF;H3 # HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH
+CDB0;H2 # HANGUL SYLLABLE CWEO
+CDB1..CDCB;H3 # HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH
+CDCC;H2 # HANGUL SYLLABLE CWE
+CDCD..CDE7;H3 # HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH
+CDE8;H2 # HANGUL SYLLABLE CWI
+CDE9..CE03;H3 # HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH
+CE04;H2 # HANGUL SYLLABLE CYU
+CE05..CE1F;H3 # HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH
+CE20;H2 # HANGUL SYLLABLE CEU
+CE21..CE3B;H3 # HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH
+CE3C;H2 # HANGUL SYLLABLE CYI
+CE3D..CE57;H3 # HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH
+CE58;H2 # HANGUL SYLLABLE CI
+CE59..CE73;H3 # HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH
+CE74;H2 # HANGUL SYLLABLE KA
+CE75..CE8F;H3 # HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH
+CE90;H2 # HANGUL SYLLABLE KAE
+CE91..CEAB;H3 # HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH
+CEAC;H2 # HANGUL SYLLABLE KYA
+CEAD..CEC7;H3 # HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH
+CEC8;H2 # HANGUL SYLLABLE KYAE
+CEC9..CEE3;H3 # HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH
+CEE4;H2 # HANGUL SYLLABLE KEO
+CEE5..CEFF;H3 # HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH
+CF00;H2 # HANGUL SYLLABLE KE
+CF01..CF1B;H3 # HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH
+CF1C;H2 # HANGUL SYLLABLE KYEO
+CF1D..CF37;H3 # HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH
+CF38;H2 # HANGUL SYLLABLE KYE
+CF39..CF53;H3 # HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH
+CF54;H2 # HANGUL SYLLABLE KO
+CF55..CF6F;H3 # HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH
+CF70;H2 # HANGUL SYLLABLE KWA
+CF71..CF8B;H3 # HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH
+CF8C;H2 # HANGUL SYLLABLE KWAE
+CF8D..CFA7;H3 # HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH
+CFA8;H2 # HANGUL SYLLABLE KOE
+CFA9..CFC3;H3 # HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH
+CFC4;H2 # HANGUL SYLLABLE KYO
+CFC5..CFDF;H3 # HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH
+CFE0;H2 # HANGUL SYLLABLE KU
+CFE1..CFFB;H3 # HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH
+CFFC;H2 # HANGUL SYLLABLE KWEO
+CFFD..D017;H3 # HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH
+D018;H2 # HANGUL SYLLABLE KWE
+D019..D033;H3 # HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH
+D034;H2 # HANGUL SYLLABLE KWI
+D035..D04F;H3 # HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH
+D050;H2 # HANGUL SYLLABLE KYU
+D051..D06B;H3 # HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH
+D06C;H2 # HANGUL SYLLABLE KEU
+D06D..D087;H3 # HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH
+D088;H2 # HANGUL SYLLABLE KYI
+D089..D0A3;H3 # HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH
+D0A4;H2 # HANGUL SYLLABLE KI
+D0A5..D0BF;H3 # HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH
+D0C0;H2 # HANGUL SYLLABLE TA
+D0C1..D0DB;H3 # HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH
+D0DC;H2 # HANGUL SYLLABLE TAE
+D0DD..D0F7;H3 # HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH
+D0F8;H2 # HANGUL SYLLABLE TYA
+D0F9..D113;H3 # HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH
+D114;H2 # HANGUL SYLLABLE TYAE
+D115..D12F;H3 # HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH
+D130;H2 # HANGUL SYLLABLE TEO
+D131..D14B;H3 # HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH
+D14C;H2 # HANGUL SYLLABLE TE
+D14D..D167;H3 # HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH
+D168;H2 # HANGUL SYLLABLE TYEO
+D169..D183;H3 # HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH
+D184;H2 # HANGUL SYLLABLE TYE
+D185..D19F;H3 # HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH
+D1A0;H2 # HANGUL SYLLABLE TO
+D1A1..D1BB;H3 # HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH
+D1BC;H2 # HANGUL SYLLABLE TWA
+D1BD..D1D7;H3 # HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH
+D1D8;H2 # HANGUL SYLLABLE TWAE
+D1D9..D1F3;H3 # HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH
+D1F4;H2 # HANGUL SYLLABLE TOE
+D1F5..D20F;H3 # HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH
+D210;H2 # HANGUL SYLLABLE TYO
+D211..D22B;H3 # HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH
+D22C;H2 # HANGUL SYLLABLE TU
+D22D..D247;H3 # HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH
+D248;H2 # HANGUL SYLLABLE TWEO
+D249..D263;H3 # HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH
+D264;H2 # HANGUL SYLLABLE TWE
+D265..D27F;H3 # HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH
+D280;H2 # HANGUL SYLLABLE TWI
+D281..D29B;H3 # HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH
+D29C;H2 # HANGUL SYLLABLE TYU
+D29D..D2B7;H3 # HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH
+D2B8;H2 # HANGUL SYLLABLE TEU
+D2B9..D2D3;H3 # HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH
+D2D4;H2 # HANGUL SYLLABLE TYI
+D2D5..D2EF;H3 # HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH
+D2F0;H2 # HANGUL SYLLABLE TI
+D2F1..D30B;H3 # HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH
+D30C;H2 # HANGUL SYLLABLE PA
+D30D..D327;H3 # HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH
+D328;H2 # HANGUL SYLLABLE PAE
+D329..D343;H3 # HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH
+D344;H2 # HANGUL SYLLABLE PYA
+D345..D35F;H3 # HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH
+D360;H2 # HANGUL SYLLABLE PYAE
+D361..D37B;H3 # HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH
+D37C;H2 # HANGUL SYLLABLE PEO
+D37D..D397;H3 # HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH
+D398;H2 # HANGUL SYLLABLE PE
+D399..D3B3;H3 # HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH
+D3B4;H2 # HANGUL SYLLABLE PYEO
+D3B5..D3CF;H3 # HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH
+D3D0;H2 # HANGUL SYLLABLE PYE
+D3D1..D3EB;H3 # HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH
+D3EC;H2 # HANGUL SYLLABLE PO
+D3ED..D407;H3 # HANGUL SYLLABLE POG..HANGUL SYLLABLE POH
+D408;H2 # HANGUL SYLLABLE PWA
+D409..D423;H3 # HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH
+D424;H2 # HANGUL SYLLABLE PWAE
+D425..D43F;H3 # HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH
+D440;H2 # HANGUL SYLLABLE POE
+D441..D45B;H3 # HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH
+D45C;H2 # HANGUL SYLLABLE PYO
+D45D..D477;H3 # HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH
+D478;H2 # HANGUL SYLLABLE PU
+D479..D493;H3 # HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH
+D494;H2 # HANGUL SYLLABLE PWEO
+D495..D4AF;H3 # HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH
+D4B0;H2 # HANGUL SYLLABLE PWE
+D4B1..D4CB;H3 # HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH
+D4CC;H2 # HANGUL SYLLABLE PWI
+D4CD..D4E7;H3 # HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH
+D4E8;H2 # HANGUL SYLLABLE PYU
+D4E9..D503;H3 # HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH
+D504;H2 # HANGUL SYLLABLE PEU
+D505..D51F;H3 # HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH
+D520;H2 # HANGUL SYLLABLE PYI
+D521..D53B;H3 # HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH
+D53C;H2 # HANGUL SYLLABLE PI
+D53D..D557;H3 # HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH
+D558;H2 # HANGUL SYLLABLE HA
+D559..D573;H3 # HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH
+D574;H2 # HANGUL SYLLABLE HAE
+D575..D58F;H3 # HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH
+D590;H2 # HANGUL SYLLABLE HYA
+D591..D5AB;H3 # HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH
+D5AC;H2 # HANGUL SYLLABLE HYAE
+D5AD..D5C7;H3 # HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH
+D5C8;H2 # HANGUL SYLLABLE HEO
+D5C9..D5E3;H3 # HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH
+D5E4;H2 # HANGUL SYLLABLE HE
+D5E5..D5FF;H3 # HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH
+D600;H2 # HANGUL SYLLABLE HYEO
+D601..D61B;H3 # HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH
+D61C;H2 # HANGUL SYLLABLE HYE
+D61D..D637;H3 # HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH
+D638;H2 # HANGUL SYLLABLE HO
+D639..D653;H3 # HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH
+D654;H2 # HANGUL SYLLABLE HWA
+D655..D66F;H3 # HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH
+D670;H2 # HANGUL SYLLABLE HWAE
+D671..D68B;H3 # HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH
+D68C;H2 # HANGUL SYLLABLE HOE
+D68D..D6A7;H3 # HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH
+D6A8;H2 # HANGUL SYLLABLE HYO
+D6A9..D6C3;H3 # HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH
+D6C4;H2 # HANGUL SYLLABLE HU
+D6C5..D6DF;H3 # HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH
+D6E0;H2 # HANGUL SYLLABLE HWEO
+D6E1..D6FB;H3 # HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH
+D6FC;H2 # HANGUL SYLLABLE HWE
+D6FD..D717;H3 # HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH
+D718;H2 # HANGUL SYLLABLE HWI
+D719..D733;H3 # HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH
+D734;H2 # HANGUL SYLLABLE HYU
+D735..D74F;H3 # HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH
+D750;H2 # HANGUL SYLLABLE HEU
+D751..D76B;H3 # HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH
+D76C;H2 # HANGUL SYLLABLE HYI
+D76D..D787;H3 # HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH
+D788;H2 # HANGUL SYLLABLE HI
+D789..D7A3;H3 # HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH
+D800..DB7F;SG # <Non Private Use High Surrogate, First>..<Non Private Use High Surrogate, Last>
+DB80..DBFF;SG # <Private Use High Surrogate, First>..<Private Use High Surrogate, Last>
+DC00..DFFF;SG # <Low Surrogate, First>..<Low Surrogate, Last>
+E000..F8FF;XX # <Private Use, First>..<Private Use, Last>
+F900;ID # CJK COMPATIBILITY IDEOGRAPH-F900
+F901;ID # CJK COMPATIBILITY IDEOGRAPH-F901
+F902;ID # CJK COMPATIBILITY IDEOGRAPH-F902
+F903;ID # CJK COMPATIBILITY IDEOGRAPH-F903
+F904;ID # CJK COMPATIBILITY IDEOGRAPH-F904
+F905;ID # CJK COMPATIBILITY IDEOGRAPH-F905
+F906;ID # CJK COMPATIBILITY IDEOGRAPH-F906
+F907;ID # CJK COMPATIBILITY IDEOGRAPH-F907
+F908;ID # CJK COMPATIBILITY IDEOGRAPH-F908
+F909;ID # CJK COMPATIBILITY IDEOGRAPH-F909
+F90A;ID # CJK COMPATIBILITY IDEOGRAPH-F90A
+F90B;ID # CJK COMPATIBILITY IDEOGRAPH-F90B
+F90C;ID # CJK COMPATIBILITY IDEOGRAPH-F90C
+F90D;ID # CJK COMPATIBILITY IDEOGRAPH-F90D
+F90E;ID # CJK COMPATIBILITY IDEOGRAPH-F90E
+F90F;ID # CJK COMPATIBILITY IDEOGRAPH-F90F
+F910;ID # CJK COMPATIBILITY IDEOGRAPH-F910
+F911;ID # CJK COMPATIBILITY IDEOGRAPH-F911
+F912;ID # CJK COMPATIBILITY IDEOGRAPH-F912
+F913;ID # CJK COMPATIBILITY IDEOGRAPH-F913
+F914;ID # CJK COMPATIBILITY IDEOGRAPH-F914
+F915;ID # CJK COMPATIBILITY IDEOGRAPH-F915
+F916;ID # CJK COMPATIBILITY IDEOGRAPH-F916
+F917;ID # CJK COMPATIBILITY IDEOGRAPH-F917
+F918;ID # CJK COMPATIBILITY IDEOGRAPH-F918
+F919;ID # CJK COMPATIBILITY IDEOGRAPH-F919
+F91A;ID # CJK COMPATIBILITY IDEOGRAPH-F91A
+F91B;ID # CJK COMPATIBILITY IDEOGRAPH-F91B
+F91C;ID # CJK COMPATIBILITY IDEOGRAPH-F91C
+F91D;ID # CJK COMPATIBILITY IDEOGRAPH-F91D
+F91E;ID # CJK COMPATIBILITY IDEOGRAPH-F91E
+F91F;ID # CJK COMPATIBILITY IDEOGRAPH-F91F
+F920;ID # CJK COMPATIBILITY IDEOGRAPH-F920
+F921;ID # CJK COMPATIBILITY IDEOGRAPH-F921
+F922;ID # CJK COMPATIBILITY IDEOGRAPH-F922
+F923;ID # CJK COMPATIBILITY IDEOGRAPH-F923
+F924;ID # CJK COMPATIBILITY IDEOGRAPH-F924
+F925;ID # CJK COMPATIBILITY IDEOGRAPH-F925
+F926;ID # CJK COMPATIBILITY IDEOGRAPH-F926
+F927;ID # CJK COMPATIBILITY IDEOGRAPH-F927
+F928;ID # CJK COMPATIBILITY IDEOGRAPH-F928
+F929;ID # CJK COMPATIBILITY IDEOGRAPH-F929
+F92A;ID # CJK COMPATIBILITY IDEOGRAPH-F92A
+F92B;ID # CJK COMPATIBILITY IDEOGRAPH-F92B
+F92C;ID # CJK COMPATIBILITY IDEOGRAPH-F92C
+F92D;ID # CJK COMPATIBILITY IDEOGRAPH-F92D
+F92E;ID # CJK COMPATIBILITY IDEOGRAPH-F92E
+F92F;ID # CJK COMPATIBILITY IDEOGRAPH-F92F
+F930;ID # CJK COMPATIBILITY IDEOGRAPH-F930
+F931;ID # CJK COMPATIBILITY IDEOGRAPH-F931
+F932;ID # CJK COMPATIBILITY IDEOGRAPH-F932
+F933;ID # CJK COMPATIBILITY IDEOGRAPH-F933
+F934;ID # CJK COMPATIBILITY IDEOGRAPH-F934
+F935;ID # CJK COMPATIBILITY IDEOGRAPH-F935
+F936;ID # CJK COMPATIBILITY IDEOGRAPH-F936
+F937;ID # CJK COMPATIBILITY IDEOGRAPH-F937
+F938;ID # CJK COMPATIBILITY IDEOGRAPH-F938
+F939;ID # CJK COMPATIBILITY IDEOGRAPH-F939
+F93A;ID # CJK COMPATIBILITY IDEOGRAPH-F93A
+F93B;ID # CJK COMPATIBILITY IDEOGRAPH-F93B
+F93C;ID # CJK COMPATIBILITY IDEOGRAPH-F93C
+F93D;ID # CJK COMPATIBILITY IDEOGRAPH-F93D
+F93E;ID # CJK COMPATIBILITY IDEOGRAPH-F93E
+F93F;ID # CJK COMPATIBILITY IDEOGRAPH-F93F
+F940;ID # CJK COMPATIBILITY IDEOGRAPH-F940
+F941;ID # CJK COMPATIBILITY IDEOGRAPH-F941
+F942;ID # CJK COMPATIBILITY IDEOGRAPH-F942
+F943;ID # CJK COMPATIBILITY IDEOGRAPH-F943
+F944;ID # CJK COMPATIBILITY IDEOGRAPH-F944
+F945;ID # CJK COMPATIBILITY IDEOGRAPH-F945
+F946;ID # CJK COMPATIBILITY IDEOGRAPH-F946
+F947;ID # CJK COMPATIBILITY IDEOGRAPH-F947
+F948;ID # CJK COMPATIBILITY IDEOGRAPH-F948
+F949;ID # CJK COMPATIBILITY IDEOGRAPH-F949
+F94A;ID # CJK COMPATIBILITY IDEOGRAPH-F94A
+F94B;ID # CJK COMPATIBILITY IDEOGRAPH-F94B
+F94C;ID # CJK COMPATIBILITY IDEOGRAPH-F94C
+F94D;ID # CJK COMPATIBILITY IDEOGRAPH-F94D
+F94E;ID # CJK COMPATIBILITY IDEOGRAPH-F94E
+F94F;ID # CJK COMPATIBILITY IDEOGRAPH-F94F
+F950;ID # CJK COMPATIBILITY IDEOGRAPH-F950
+F951;ID # CJK COMPATIBILITY IDEOGRAPH-F951
+F952;ID # CJK COMPATIBILITY IDEOGRAPH-F952
+F953;ID # CJK COMPATIBILITY IDEOGRAPH-F953
+F954;ID # CJK COMPATIBILITY IDEOGRAPH-F954
+F955;ID # CJK COMPATIBILITY IDEOGRAPH-F955
+F956;ID # CJK COMPATIBILITY IDEOGRAPH-F956
+F957;ID # CJK COMPATIBILITY IDEOGRAPH-F957
+F958;ID # CJK COMPATIBILITY IDEOGRAPH-F958
+F959;ID # CJK COMPATIBILITY IDEOGRAPH-F959
+F95A;ID # CJK COMPATIBILITY IDEOGRAPH-F95A
+F95B;ID # CJK COMPATIBILITY IDEOGRAPH-F95B
+F95C;ID # CJK COMPATIBILITY IDEOGRAPH-F95C
+F95D;ID # CJK COMPATIBILITY IDEOGRAPH-F95D
+F95E;ID # CJK COMPATIBILITY IDEOGRAPH-F95E
+F95F;ID # CJK COMPATIBILITY IDEOGRAPH-F95F
+F960;ID # CJK COMPATIBILITY IDEOGRAPH-F960
+F961;ID # CJK COMPATIBILITY IDEOGRAPH-F961
+F962;ID # CJK COMPATIBILITY IDEOGRAPH-F962
+F963;ID # CJK COMPATIBILITY IDEOGRAPH-F963
+F964;ID # CJK COMPATIBILITY IDEOGRAPH-F964
+F965;ID # CJK COMPATIBILITY IDEOGRAPH-F965
+F966;ID # CJK COMPATIBILITY IDEOGRAPH-F966
+F967;ID # CJK COMPATIBILITY IDEOGRAPH-F967
+F968;ID # CJK COMPATIBILITY IDEOGRAPH-F968
+F969;ID # CJK COMPATIBILITY IDEOGRAPH-F969
+F96A;ID # CJK COMPATIBILITY IDEOGRAPH-F96A
+F96B;ID # CJK COMPATIBILITY IDEOGRAPH-F96B
+F96C;ID # CJK COMPATIBILITY IDEOGRAPH-F96C
+F96D;ID # CJK COMPATIBILITY IDEOGRAPH-F96D
+F96E;ID # CJK COMPATIBILITY IDEOGRAPH-F96E
+F96F;ID # CJK COMPATIBILITY IDEOGRAPH-F96F
+F970;ID # CJK COMPATIBILITY IDEOGRAPH-F970
+F971;ID # CJK COMPATIBILITY IDEOGRAPH-F971
+F972;ID # CJK COMPATIBILITY IDEOGRAPH-F972
+F973;ID # CJK COMPATIBILITY IDEOGRAPH-F973
+F974;ID # CJK COMPATIBILITY IDEOGRAPH-F974
+F975;ID # CJK COMPATIBILITY IDEOGRAPH-F975
+F976;ID # CJK COMPATIBILITY IDEOGRAPH-F976
+F977;ID # CJK COMPATIBILITY IDEOGRAPH-F977
+F978;ID # CJK COMPATIBILITY IDEOGRAPH-F978
+F979;ID # CJK COMPATIBILITY IDEOGRAPH-F979
+F97A;ID # CJK COMPATIBILITY IDEOGRAPH-F97A
+F97B;ID # CJK COMPATIBILITY IDEOGRAPH-F97B
+F97C;ID # CJK COMPATIBILITY IDEOGRAPH-F97C
+F97D;ID # CJK COMPATIBILITY IDEOGRAPH-F97D
+F97E;ID # CJK COMPATIBILITY IDEOGRAPH-F97E
+F97F;ID # CJK COMPATIBILITY IDEOGRAPH-F97F
+F980;ID # CJK COMPATIBILITY IDEOGRAPH-F980
+F981;ID # CJK COMPATIBILITY IDEOGRAPH-F981
+F982;ID # CJK COMPATIBILITY IDEOGRAPH-F982
+F983;ID # CJK COMPATIBILITY IDEOGRAPH-F983
+F984;ID # CJK COMPATIBILITY IDEOGRAPH-F984
+F985;ID # CJK COMPATIBILITY IDEOGRAPH-F985
+F986;ID # CJK COMPATIBILITY IDEOGRAPH-F986
+F987;ID # CJK COMPATIBILITY IDEOGRAPH-F987
+F988;ID # CJK COMPATIBILITY IDEOGRAPH-F988
+F989;ID # CJK COMPATIBILITY IDEOGRAPH-F989
+F98A;ID # CJK COMPATIBILITY IDEOGRAPH-F98A
+F98B;ID # CJK COMPATIBILITY IDEOGRAPH-F98B
+F98C;ID # CJK COMPATIBILITY IDEOGRAPH-F98C
+F98D;ID # CJK COMPATIBILITY IDEOGRAPH-F98D
+F98E;ID # CJK COMPATIBILITY IDEOGRAPH-F98E
+F98F;ID # CJK COMPATIBILITY IDEOGRAPH-F98F
+F990;ID # CJK COMPATIBILITY IDEOGRAPH-F990
+F991;ID # CJK COMPATIBILITY IDEOGRAPH-F991
+F992;ID # CJK COMPATIBILITY IDEOGRAPH-F992
+F993;ID # CJK COMPATIBILITY IDEOGRAPH-F993
+F994;ID # CJK COMPATIBILITY IDEOGRAPH-F994
+F995;ID # CJK COMPATIBILITY IDEOGRAPH-F995
+F996;ID # CJK COMPATIBILITY IDEOGRAPH-F996
+F997;ID # CJK COMPATIBILITY IDEOGRAPH-F997
+F998;ID # CJK COMPATIBILITY IDEOGRAPH-F998
+F999;ID # CJK COMPATIBILITY IDEOGRAPH-F999
+F99A;ID # CJK COMPATIBILITY IDEOGRAPH-F99A
+F99B;ID # CJK COMPATIBILITY IDEOGRAPH-F99B
+F99C;ID # CJK COMPATIBILITY IDEOGRAPH-F99C
+F99D;ID # CJK COMPATIBILITY IDEOGRAPH-F99D
+F99E;ID # CJK COMPATIBILITY IDEOGRAPH-F99E
+F99F;ID # CJK COMPATIBILITY IDEOGRAPH-F99F
+F9A0;ID # CJK COMPATIBILITY IDEOGRAPH-F9A0
+F9A1;ID # CJK COMPATIBILITY IDEOGRAPH-F9A1
+F9A2;ID # CJK COMPATIBILITY IDEOGRAPH-F9A2
+F9A3;ID # CJK COMPATIBILITY IDEOGRAPH-F9A3
+F9A4;ID # CJK COMPATIBILITY IDEOGRAPH-F9A4
+F9A5;ID # CJK COMPATIBILITY IDEOGRAPH-F9A5
+F9A6;ID # CJK COMPATIBILITY IDEOGRAPH-F9A6
+F9A7;ID # CJK COMPATIBILITY IDEOGRAPH-F9A7
+F9A8;ID # CJK COMPATIBILITY IDEOGRAPH-F9A8
+F9A9;ID # CJK COMPATIBILITY IDEOGRAPH-F9A9
+F9AA;ID # CJK COMPATIBILITY IDEOGRAPH-F9AA
+F9AB;ID # CJK COMPATIBILITY IDEOGRAPH-F9AB
+F9AC;ID # CJK COMPATIBILITY IDEOGRAPH-F9AC
+F9AD;ID # CJK COMPATIBILITY IDEOGRAPH-F9AD
+F9AE;ID # CJK COMPATIBILITY IDEOGRAPH-F9AE
+F9AF;ID # CJK COMPATIBILITY IDEOGRAPH-F9AF
+F9B0;ID # CJK COMPATIBILITY IDEOGRAPH-F9B0
+F9B1;ID # CJK COMPATIBILITY IDEOGRAPH-F9B1
+F9B2;ID # CJK COMPATIBILITY IDEOGRAPH-F9B2
+F9B3;ID # CJK COMPATIBILITY IDEOGRAPH-F9B3
+F9B4;ID # CJK COMPATIBILITY IDEOGRAPH-F9B4
+F9B5;ID # CJK COMPATIBILITY IDEOGRAPH-F9B5
+F9B6;ID # CJK COMPATIBILITY IDEOGRAPH-F9B6
+F9B7;ID # CJK COMPATIBILITY IDEOGRAPH-F9B7
+F9B8;ID # CJK COMPATIBILITY IDEOGRAPH-F9B8
+F9B9;ID # CJK COMPATIBILITY IDEOGRAPH-F9B9
+F9BA;ID # CJK COMPATIBILITY IDEOGRAPH-F9BA
+F9BB;ID # CJK COMPATIBILITY IDEOGRAPH-F9BB
+F9BC;ID # CJK COMPATIBILITY IDEOGRAPH-F9BC
+F9BD;ID # CJK COMPATIBILITY IDEOGRAPH-F9BD
+F9BE;ID # CJK COMPATIBILITY IDEOGRAPH-F9BE
+F9BF;ID # CJK COMPATIBILITY IDEOGRAPH-F9BF
+F9C0;ID # CJK COMPATIBILITY IDEOGRAPH-F9C0
+F9C1;ID # CJK COMPATIBILITY IDEOGRAPH-F9C1
+F9C2;ID # CJK COMPATIBILITY IDEOGRAPH-F9C2
+F9C3;ID # CJK COMPATIBILITY IDEOGRAPH-F9C3
+F9C4;ID # CJK COMPATIBILITY IDEOGRAPH-F9C4
+F9C5;ID # CJK COMPATIBILITY IDEOGRAPH-F9C5
+F9C6;ID # CJK COMPATIBILITY IDEOGRAPH-F9C6
+F9C7;ID # CJK COMPATIBILITY IDEOGRAPH-F9C7
+F9C8;ID # CJK COMPATIBILITY IDEOGRAPH-F9C8
+F9C9;ID # CJK COMPATIBILITY IDEOGRAPH-F9C9
+F9CA;ID # CJK COMPATIBILITY IDEOGRAPH-F9CA
+F9CB;ID # CJK COMPATIBILITY IDEOGRAPH-F9CB
+F9CC;ID # CJK COMPATIBILITY IDEOGRAPH-F9CC
+F9CD;ID # CJK COMPATIBILITY IDEOGRAPH-F9CD
+F9CE;ID # CJK COMPATIBILITY IDEOGRAPH-F9CE
+F9CF;ID # CJK COMPATIBILITY IDEOGRAPH-F9CF
+F9D0;ID # CJK COMPATIBILITY IDEOGRAPH-F9D0
+F9D1;ID # CJK COMPATIBILITY IDEOGRAPH-F9D1
+F9D2;ID # CJK COMPATIBILITY IDEOGRAPH-F9D2
+F9D3;ID # CJK COMPATIBILITY IDEOGRAPH-F9D3
+F9D4;ID # CJK COMPATIBILITY IDEOGRAPH-F9D4
+F9D5;ID # CJK COMPATIBILITY IDEOGRAPH-F9D5
+F9D6;ID # CJK COMPATIBILITY IDEOGRAPH-F9D6
+F9D7;ID # CJK COMPATIBILITY IDEOGRAPH-F9D7
+F9D8;ID # CJK COMPATIBILITY IDEOGRAPH-F9D8
+F9D9;ID # CJK COMPATIBILITY IDEOGRAPH-F9D9
+F9DA;ID # CJK COMPATIBILITY IDEOGRAPH-F9DA
+F9DB;ID # CJK COMPATIBILITY IDEOGRAPH-F9DB
+F9DC;ID # CJK COMPATIBILITY IDEOGRAPH-F9DC
+F9DD;ID # CJK COMPATIBILITY IDEOGRAPH-F9DD
+F9DE;ID # CJK COMPATIBILITY IDEOGRAPH-F9DE
+F9DF;ID # CJK COMPATIBILITY IDEOGRAPH-F9DF
+F9E0;ID # CJK COMPATIBILITY IDEOGRAPH-F9E0
+F9E1;ID # CJK COMPATIBILITY IDEOGRAPH-F9E1
+F9E2;ID # CJK COMPATIBILITY IDEOGRAPH-F9E2
+F9E3;ID # CJK COMPATIBILITY IDEOGRAPH-F9E3
+F9E4;ID # CJK COMPATIBILITY IDEOGRAPH-F9E4
+F9E5;ID # CJK COMPATIBILITY IDEOGRAPH-F9E5
+F9E6;ID # CJK COMPATIBILITY IDEOGRAPH-F9E6
+F9E7;ID # CJK COMPATIBILITY IDEOGRAPH-F9E7
+F9E8;ID # CJK COMPATIBILITY IDEOGRAPH-F9E8
+F9E9;ID # CJK COMPATIBILITY IDEOGRAPH-F9E9
+F9EA;ID # CJK COMPATIBILITY IDEOGRAPH-F9EA
+F9EB;ID # CJK COMPATIBILITY IDEOGRAPH-F9EB
+F9EC;ID # CJK COMPATIBILITY IDEOGRAPH-F9EC
+F9ED;ID # CJK COMPATIBILITY IDEOGRAPH-F9ED
+F9EE;ID # CJK COMPATIBILITY IDEOGRAPH-F9EE
+F9EF;ID # CJK COMPATIBILITY IDEOGRAPH-F9EF
+F9F0;ID # CJK COMPATIBILITY IDEOGRAPH-F9F0
+F9F1;ID # CJK COMPATIBILITY IDEOGRAPH-F9F1
+F9F2;ID # CJK COMPATIBILITY IDEOGRAPH-F9F2
+F9F3;ID # CJK COMPATIBILITY IDEOGRAPH-F9F3
+F9F4;ID # CJK COMPATIBILITY IDEOGRAPH-F9F4
+F9F5;ID # CJK COMPATIBILITY IDEOGRAPH-F9F5
+F9F6;ID # CJK COMPATIBILITY IDEOGRAPH-F9F6
+F9F7;ID # CJK COMPATIBILITY IDEOGRAPH-F9F7
+F9F8;ID # CJK COMPATIBILITY IDEOGRAPH-F9F8
+F9F9;ID # CJK COMPATIBILITY IDEOGRAPH-F9F9
+F9FA;ID # CJK COMPATIBILITY IDEOGRAPH-F9FA
+F9FB;ID # CJK COMPATIBILITY IDEOGRAPH-F9FB
+F9FC;ID # CJK COMPATIBILITY IDEOGRAPH-F9FC
+F9FD;ID # CJK COMPATIBILITY IDEOGRAPH-F9FD
+F9FE;ID # CJK COMPATIBILITY IDEOGRAPH-F9FE
+F9FF;ID # CJK COMPATIBILITY IDEOGRAPH-F9FF
+FA00;ID # CJK COMPATIBILITY IDEOGRAPH-FA00
+FA01;ID # CJK COMPATIBILITY IDEOGRAPH-FA01
+FA02;ID # CJK COMPATIBILITY IDEOGRAPH-FA02
+FA03;ID # CJK COMPATIBILITY IDEOGRAPH-FA03
+FA04;ID # CJK COMPATIBILITY IDEOGRAPH-FA04
+FA05;ID # CJK COMPATIBILITY IDEOGRAPH-FA05
+FA06;ID # CJK COMPATIBILITY IDEOGRAPH-FA06
+FA07;ID # CJK COMPATIBILITY IDEOGRAPH-FA07
+FA08;ID # CJK COMPATIBILITY IDEOGRAPH-FA08
+FA09;ID # CJK COMPATIBILITY IDEOGRAPH-FA09
+FA0A;ID # CJK COMPATIBILITY IDEOGRAPH-FA0A
+FA0B;ID # CJK COMPATIBILITY IDEOGRAPH-FA0B
+FA0C;ID # CJK COMPATIBILITY IDEOGRAPH-FA0C
+FA0D;ID # CJK COMPATIBILITY IDEOGRAPH-FA0D
+FA0E;ID # CJK COMPATIBILITY IDEOGRAPH-FA0E
+FA0F;ID # CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA10;ID # CJK COMPATIBILITY IDEOGRAPH-FA10
+FA11;ID # CJK COMPATIBILITY IDEOGRAPH-FA11
+FA12;ID # CJK COMPATIBILITY IDEOGRAPH-FA12
+FA13;ID # CJK COMPATIBILITY IDEOGRAPH-FA13
+FA14;ID # CJK COMPATIBILITY IDEOGRAPH-FA14
+FA15;ID # CJK COMPATIBILITY IDEOGRAPH-FA15
+FA16;ID # CJK COMPATIBILITY IDEOGRAPH-FA16
+FA17;ID # CJK COMPATIBILITY IDEOGRAPH-FA17
+FA18;ID # CJK COMPATIBILITY IDEOGRAPH-FA18
+FA19;ID # CJK COMPATIBILITY IDEOGRAPH-FA19
+FA1A;ID # CJK COMPATIBILITY IDEOGRAPH-FA1A
+FA1B;ID # CJK COMPATIBILITY IDEOGRAPH-FA1B
+FA1C;ID # CJK COMPATIBILITY IDEOGRAPH-FA1C
+FA1D;ID # CJK COMPATIBILITY IDEOGRAPH-FA1D
+FA1E;ID # CJK COMPATIBILITY IDEOGRAPH-FA1E
+FA1F;ID # CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA20;ID # CJK COMPATIBILITY IDEOGRAPH-FA20
+FA21;ID # CJK COMPATIBILITY IDEOGRAPH-FA21
+FA22;ID # CJK COMPATIBILITY IDEOGRAPH-FA22
+FA23;ID # CJK COMPATIBILITY IDEOGRAPH-FA23
+FA24;ID # CJK COMPATIBILITY IDEOGRAPH-FA24
+FA25;ID # CJK COMPATIBILITY IDEOGRAPH-FA25
+FA26;ID # CJK COMPATIBILITY IDEOGRAPH-FA26
+FA27;ID # CJK COMPATIBILITY IDEOGRAPH-FA27
+FA28;ID # CJK COMPATIBILITY IDEOGRAPH-FA28
+FA29;ID # CJK COMPATIBILITY IDEOGRAPH-FA29
+FA2A;ID # CJK COMPATIBILITY IDEOGRAPH-FA2A
+FA2B;ID # CJK COMPATIBILITY IDEOGRAPH-FA2B
+FA2C;ID # CJK COMPATIBILITY IDEOGRAPH-FA2C
+FA2D;ID # CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30;ID # CJK COMPATIBILITY IDEOGRAPH-FA30
+FA31;ID # CJK COMPATIBILITY IDEOGRAPH-FA31
+FA32;ID # CJK COMPATIBILITY IDEOGRAPH-FA32
+FA33;ID # CJK COMPATIBILITY IDEOGRAPH-FA33
+FA34;ID # CJK COMPATIBILITY IDEOGRAPH-FA34
+FA35;ID # CJK COMPATIBILITY IDEOGRAPH-FA35
+FA36;ID # CJK COMPATIBILITY IDEOGRAPH-FA36
+FA37;ID # CJK COMPATIBILITY IDEOGRAPH-FA37
+FA38;ID # CJK COMPATIBILITY IDEOGRAPH-FA38
+FA39;ID # CJK COMPATIBILITY IDEOGRAPH-FA39
+FA3A;ID # CJK COMPATIBILITY IDEOGRAPH-FA3A
+FA3B;ID # CJK COMPATIBILITY IDEOGRAPH-FA3B
+FA3C;ID # CJK COMPATIBILITY IDEOGRAPH-FA3C
+FA3D;ID # CJK COMPATIBILITY IDEOGRAPH-FA3D
+FA3E;ID # CJK COMPATIBILITY IDEOGRAPH-FA3E
+FA3F;ID # CJK COMPATIBILITY IDEOGRAPH-FA3F
+FA40;ID # CJK COMPATIBILITY IDEOGRAPH-FA40
+FA41;ID # CJK COMPATIBILITY IDEOGRAPH-FA41
+FA42;ID # CJK COMPATIBILITY IDEOGRAPH-FA42
+FA43;ID # CJK COMPATIBILITY IDEOGRAPH-FA43
+FA44;ID # CJK COMPATIBILITY IDEOGRAPH-FA44
+FA45;ID # CJK COMPATIBILITY IDEOGRAPH-FA45
+FA46;ID # CJK COMPATIBILITY IDEOGRAPH-FA46
+FA47;ID # CJK COMPATIBILITY IDEOGRAPH-FA47
+FA48;ID # CJK COMPATIBILITY IDEOGRAPH-FA48
+FA49;ID # CJK COMPATIBILITY IDEOGRAPH-FA49
+FA4A;ID # CJK COMPATIBILITY IDEOGRAPH-FA4A
+FA4B;ID # CJK COMPATIBILITY IDEOGRAPH-FA4B
+FA4C;ID # CJK COMPATIBILITY IDEOGRAPH-FA4C
+FA4D;ID # CJK COMPATIBILITY IDEOGRAPH-FA4D
+FA4E;ID # CJK COMPATIBILITY IDEOGRAPH-FA4E
+FA4F;ID # CJK COMPATIBILITY IDEOGRAPH-FA4F
+FA50;ID # CJK COMPATIBILITY IDEOGRAPH-FA50
+FA51;ID # CJK COMPATIBILITY IDEOGRAPH-FA51
+FA52;ID # CJK COMPATIBILITY IDEOGRAPH-FA52
+FA53;ID # CJK COMPATIBILITY IDEOGRAPH-FA53
+FA54;ID # CJK COMPATIBILITY IDEOGRAPH-FA54
+FA55;ID # CJK COMPATIBILITY IDEOGRAPH-FA55
+FA56;ID # CJK COMPATIBILITY IDEOGRAPH-FA56
+FA57;ID # CJK COMPATIBILITY IDEOGRAPH-FA57
+FA58;ID # CJK COMPATIBILITY IDEOGRAPH-FA58
+FA59;ID # CJK COMPATIBILITY IDEOGRAPH-FA59
+FA5A;ID # CJK COMPATIBILITY IDEOGRAPH-FA5A
+FA5B;ID # CJK COMPATIBILITY IDEOGRAPH-FA5B
+FA5C;ID # CJK COMPATIBILITY IDEOGRAPH-FA5C
+FA5D;ID # CJK COMPATIBILITY IDEOGRAPH-FA5D
+FA5E;ID # CJK COMPATIBILITY IDEOGRAPH-FA5E
+FA5F;ID # CJK COMPATIBILITY IDEOGRAPH-FA5F
+FA60;ID # CJK COMPATIBILITY IDEOGRAPH-FA60
+FA61;ID # CJK COMPATIBILITY IDEOGRAPH-FA61
+FA62;ID # CJK COMPATIBILITY IDEOGRAPH-FA62
+FA63;ID # CJK COMPATIBILITY IDEOGRAPH-FA63
+FA64;ID # CJK COMPATIBILITY IDEOGRAPH-FA64
+FA65;ID # CJK COMPATIBILITY IDEOGRAPH-FA65
+FA66;ID # CJK COMPATIBILITY IDEOGRAPH-FA66
+FA67;ID # CJK COMPATIBILITY IDEOGRAPH-FA67
+FA68;ID # CJK COMPATIBILITY IDEOGRAPH-FA68
+FA69;ID # CJK COMPATIBILITY IDEOGRAPH-FA69
+FA6A;ID # CJK COMPATIBILITY IDEOGRAPH-FA6A
+FA70;ID # CJK COMPATIBILITY IDEOGRAPH-FA70
+FA71;ID # CJK COMPATIBILITY IDEOGRAPH-FA71
+FA72;ID # CJK COMPATIBILITY IDEOGRAPH-FA72
+FA73;ID # CJK COMPATIBILITY IDEOGRAPH-FA73
+FA74;ID # CJK COMPATIBILITY IDEOGRAPH-FA74
+FA75;ID # CJK COMPATIBILITY IDEOGRAPH-FA75
+FA76;ID # CJK COMPATIBILITY IDEOGRAPH-FA76
+FA77;ID # CJK COMPATIBILITY IDEOGRAPH-FA77
+FA78;ID # CJK COMPATIBILITY IDEOGRAPH-FA78
+FA79;ID # CJK COMPATIBILITY IDEOGRAPH-FA79
+FA7A;ID # CJK COMPATIBILITY IDEOGRAPH-FA7A
+FA7B;ID # CJK COMPATIBILITY IDEOGRAPH-FA7B
+FA7C;ID # CJK COMPATIBILITY IDEOGRAPH-FA7C
+FA7D;ID # CJK COMPATIBILITY IDEOGRAPH-FA7D
+FA7E;ID # CJK COMPATIBILITY IDEOGRAPH-FA7E
+FA7F;ID # CJK COMPATIBILITY IDEOGRAPH-FA7F
+FA80;ID # CJK COMPATIBILITY IDEOGRAPH-FA80
+FA81;ID # CJK COMPATIBILITY IDEOGRAPH-FA81
+FA82;ID # CJK COMPATIBILITY IDEOGRAPH-FA82
+FA83;ID # CJK COMPATIBILITY IDEOGRAPH-FA83
+FA84;ID # CJK COMPATIBILITY IDEOGRAPH-FA84
+FA85;ID # CJK COMPATIBILITY IDEOGRAPH-FA85
+FA86;ID # CJK COMPATIBILITY IDEOGRAPH-FA86
+FA87;ID # CJK COMPATIBILITY IDEOGRAPH-FA87
+FA88;ID # CJK COMPATIBILITY IDEOGRAPH-FA88
+FA89;ID # CJK COMPATIBILITY IDEOGRAPH-FA89
+FA8A;ID # CJK COMPATIBILITY IDEOGRAPH-FA8A
+FA8B;ID # CJK COMPATIBILITY IDEOGRAPH-FA8B
+FA8C;ID # CJK COMPATIBILITY IDEOGRAPH-FA8C
+FA8D;ID # CJK COMPATIBILITY IDEOGRAPH-FA8D
+FA8E;ID # CJK COMPATIBILITY IDEOGRAPH-FA8E
+FA8F;ID # CJK COMPATIBILITY IDEOGRAPH-FA8F
+FA90;ID # CJK COMPATIBILITY IDEOGRAPH-FA90
+FA91;ID # CJK COMPATIBILITY IDEOGRAPH-FA91
+FA92;ID # CJK COMPATIBILITY IDEOGRAPH-FA92
+FA93;ID # CJK COMPATIBILITY IDEOGRAPH-FA93
+FA94;ID # CJK COMPATIBILITY IDEOGRAPH-FA94
+FA95;ID # CJK COMPATIBILITY IDEOGRAPH-FA95
+FA96;ID # CJK COMPATIBILITY IDEOGRAPH-FA96
+FA97;ID # CJK COMPATIBILITY IDEOGRAPH-FA97
+FA98;ID # CJK COMPATIBILITY IDEOGRAPH-FA98
+FA99;ID # CJK COMPATIBILITY IDEOGRAPH-FA99
+FA9A;ID # CJK COMPATIBILITY IDEOGRAPH-FA9A
+FA9B;ID # CJK COMPATIBILITY IDEOGRAPH-FA9B
+FA9C;ID # CJK COMPATIBILITY IDEOGRAPH-FA9C
+FA9D;ID # CJK COMPATIBILITY IDEOGRAPH-FA9D
+FA9E;ID # CJK COMPATIBILITY IDEOGRAPH-FA9E
+FA9F;ID # CJK COMPATIBILITY IDEOGRAPH-FA9F
+FAA0;ID # CJK COMPATIBILITY IDEOGRAPH-FAA0
+FAA1;ID # CJK COMPATIBILITY IDEOGRAPH-FAA1
+FAA2;ID # CJK COMPATIBILITY IDEOGRAPH-FAA2
+FAA3;ID # CJK COMPATIBILITY IDEOGRAPH-FAA3
+FAA4;ID # CJK COMPATIBILITY IDEOGRAPH-FAA4
+FAA5;ID # CJK COMPATIBILITY IDEOGRAPH-FAA5
+FAA6;ID # CJK COMPATIBILITY IDEOGRAPH-FAA6
+FAA7;ID # CJK COMPATIBILITY IDEOGRAPH-FAA7
+FAA8;ID # CJK COMPATIBILITY IDEOGRAPH-FAA8
+FAA9;ID # CJK COMPATIBILITY IDEOGRAPH-FAA9
+FAAA;ID # CJK COMPATIBILITY IDEOGRAPH-FAAA
+FAAB;ID # CJK COMPATIBILITY IDEOGRAPH-FAAB
+FAAC;ID # CJK COMPATIBILITY IDEOGRAPH-FAAC
+FAAD;ID # CJK COMPATIBILITY IDEOGRAPH-FAAD
+FAAE;ID # CJK COMPATIBILITY IDEOGRAPH-FAAE
+FAAF;ID # CJK COMPATIBILITY IDEOGRAPH-FAAF
+FAB0;ID # CJK COMPATIBILITY IDEOGRAPH-FAB0
+FAB1;ID # CJK COMPATIBILITY IDEOGRAPH-FAB1
+FAB2;ID # CJK COMPATIBILITY IDEOGRAPH-FAB2
+FAB3;ID # CJK COMPATIBILITY IDEOGRAPH-FAB3
+FAB4;ID # CJK COMPATIBILITY IDEOGRAPH-FAB4
+FAB5;ID # CJK COMPATIBILITY IDEOGRAPH-FAB5
+FAB6;ID # CJK COMPATIBILITY IDEOGRAPH-FAB6
+FAB7;ID # CJK COMPATIBILITY IDEOGRAPH-FAB7
+FAB8;ID # CJK COMPATIBILITY IDEOGRAPH-FAB8
+FAB9;ID # CJK COMPATIBILITY IDEOGRAPH-FAB9
+FABA;ID # CJK COMPATIBILITY IDEOGRAPH-FABA
+FABB;ID # CJK COMPATIBILITY IDEOGRAPH-FABB
+FABC;ID # CJK COMPATIBILITY IDEOGRAPH-FABC
+FABD;ID # CJK COMPATIBILITY IDEOGRAPH-FABD
+FABE;ID # CJK COMPATIBILITY IDEOGRAPH-FABE
+FABF;ID # CJK COMPATIBILITY IDEOGRAPH-FABF
+FAC0;ID # CJK COMPATIBILITY IDEOGRAPH-FAC0
+FAC1;ID # CJK COMPATIBILITY IDEOGRAPH-FAC1
+FAC2;ID # CJK COMPATIBILITY IDEOGRAPH-FAC2
+FAC3;ID # CJK COMPATIBILITY IDEOGRAPH-FAC3
+FAC4;ID # CJK COMPATIBILITY IDEOGRAPH-FAC4
+FAC5;ID # CJK COMPATIBILITY IDEOGRAPH-FAC5
+FAC6;ID # CJK COMPATIBILITY IDEOGRAPH-FAC6
+FAC7;ID # CJK COMPATIBILITY IDEOGRAPH-FAC7
+FAC8;ID # CJK COMPATIBILITY IDEOGRAPH-FAC8
+FAC9;ID # CJK COMPATIBILITY IDEOGRAPH-FAC9
+FACA;ID # CJK COMPATIBILITY IDEOGRAPH-FACA
+FACB;ID # CJK COMPATIBILITY IDEOGRAPH-FACB
+FACC;ID # CJK COMPATIBILITY IDEOGRAPH-FACC
+FACD;ID # CJK COMPATIBILITY IDEOGRAPH-FACD
+FACE;ID # CJK COMPATIBILITY IDEOGRAPH-FACE
+FACF;ID # CJK COMPATIBILITY IDEOGRAPH-FACF
+FAD0;ID # CJK COMPATIBILITY IDEOGRAPH-FAD0
+FAD1;ID # CJK COMPATIBILITY IDEOGRAPH-FAD1
+FAD2;ID # CJK COMPATIBILITY IDEOGRAPH-FAD2
+FAD3;ID # CJK COMPATIBILITY IDEOGRAPH-FAD3
+FAD4;ID # CJK COMPATIBILITY IDEOGRAPH-FAD4
+FAD5;ID # CJK COMPATIBILITY IDEOGRAPH-FAD5
+FAD6;ID # CJK COMPATIBILITY IDEOGRAPH-FAD6
+FAD7;ID # CJK COMPATIBILITY IDEOGRAPH-FAD7
+FAD8;ID # CJK COMPATIBILITY IDEOGRAPH-FAD8
+FAD9;ID # CJK COMPATIBILITY IDEOGRAPH-FAD9
+FB00;AL # LATIN SMALL LIGATURE FF
+FB01;AL # LATIN SMALL LIGATURE FI
+FB02;AL # LATIN SMALL LIGATURE FL
+FB03;AL # LATIN SMALL LIGATURE FFI
+FB04;AL # LATIN SMALL LIGATURE FFL
+FB05;AL # LATIN SMALL LIGATURE LONG S T
+FB06;AL # LATIN SMALL LIGATURE ST
+FB13;AL # ARMENIAN SMALL LIGATURE MEN NOW
+FB14;AL # ARMENIAN SMALL LIGATURE MEN ECH
+FB15;AL # ARMENIAN SMALL LIGATURE MEN INI
+FB16;AL # ARMENIAN SMALL LIGATURE VEW NOW
+FB17;AL # ARMENIAN SMALL LIGATURE MEN XEH
+FB1D;AL # HEBREW LETTER YOD WITH HIRIQ
+FB1E;CM # HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F;AL # HEBREW LIGATURE YIDDISH YOD YOD PATAH
+FB20;AL # HEBREW LETTER ALTERNATIVE AYIN
+FB21;AL # HEBREW LETTER WIDE ALEF
+FB22;AL # HEBREW LETTER WIDE DALET
+FB23;AL # HEBREW LETTER WIDE HE
+FB24;AL # HEBREW LETTER WIDE KAF
+FB25;AL # HEBREW LETTER WIDE LAMED
+FB26;AL # HEBREW LETTER WIDE FINAL MEM
+FB27;AL # HEBREW LETTER WIDE RESH
+FB28;AL # HEBREW LETTER WIDE TAV
+FB29;AL # HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A;AL # HEBREW LETTER SHIN WITH SHIN DOT
+FB2B;AL # HEBREW LETTER SHIN WITH SIN DOT
+FB2C;AL # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+FB2D;AL # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+FB2E;AL # HEBREW LETTER ALEF WITH PATAH
+FB2F;AL # HEBREW LETTER ALEF WITH QAMATS
+FB30;AL # HEBREW LETTER ALEF WITH MAPIQ
+FB31;AL # HEBREW LETTER BET WITH DAGESH
+FB32;AL # HEBREW LETTER GIMEL WITH DAGESH
+FB33;AL # HEBREW LETTER DALET WITH DAGESH
+FB34;AL # HEBREW LETTER HE WITH MAPIQ
+FB35;AL # HEBREW LETTER VAV WITH DAGESH
+FB36;AL # HEBREW LETTER ZAYIN WITH DAGESH
+FB38;AL # HEBREW LETTER TET WITH DAGESH
+FB39;AL # HEBREW LETTER YOD WITH DAGESH
+FB3A;AL # HEBREW LETTER FINAL KAF WITH DAGESH
+FB3B;AL # HEBREW LETTER KAF WITH DAGESH
+FB3C;AL # HEBREW LETTER LAMED WITH DAGESH
+FB3E;AL # HEBREW LETTER MEM WITH DAGESH
+FB40;AL # HEBREW LETTER NUN WITH DAGESH
+FB41;AL # HEBREW LETTER SAMEKH WITH DAGESH
+FB43;AL # HEBREW LETTER FINAL PE WITH DAGESH
+FB44;AL # HEBREW LETTER PE WITH DAGESH
+FB46;AL # HEBREW LETTER TSADI WITH DAGESH
+FB47;AL # HEBREW LETTER QOF WITH DAGESH
+FB48;AL # HEBREW LETTER RESH WITH DAGESH
+FB49;AL # HEBREW LETTER SHIN WITH DAGESH
+FB4A;AL # HEBREW LETTER TAV WITH DAGESH
+FB4B;AL # HEBREW LETTER VAV WITH HOLAM
+FB4C;AL # HEBREW LETTER BET WITH RAFE
+FB4D;AL # HEBREW LETTER KAF WITH RAFE
+FB4E;AL # HEBREW LETTER PE WITH RAFE
+FB4F;AL # HEBREW LIGATURE ALEF LAMED
+FB50;AL # ARABIC LETTER ALEF WASLA ISOLATED FORM
+FB51;AL # ARABIC LETTER ALEF WASLA FINAL FORM
+FB52;AL # ARABIC LETTER BEEH ISOLATED FORM
+FB53;AL # ARABIC LETTER BEEH FINAL FORM
+FB54;AL # ARABIC LETTER BEEH INITIAL FORM
+FB55;AL # ARABIC LETTER BEEH MEDIAL FORM
+FB56;AL # ARABIC LETTER PEH ISOLATED FORM
+FB57;AL # ARABIC LETTER PEH FINAL FORM
+FB58;AL # ARABIC LETTER PEH INITIAL FORM
+FB59;AL # ARABIC LETTER PEH MEDIAL FORM
+FB5A;AL # ARABIC LETTER BEHEH ISOLATED FORM
+FB5B;AL # ARABIC LETTER BEHEH FINAL FORM
+FB5C;AL # ARABIC LETTER BEHEH INITIAL FORM
+FB5D;AL # ARABIC LETTER BEHEH MEDIAL FORM
+FB5E;AL # ARABIC LETTER TTEHEH ISOLATED FORM
+FB5F;AL # ARABIC LETTER TTEHEH FINAL FORM
+FB60;AL # ARABIC LETTER TTEHEH INITIAL FORM
+FB61;AL # ARABIC LETTER TTEHEH MEDIAL FORM
+FB62;AL # ARABIC LETTER TEHEH ISOLATED FORM
+FB63;AL # ARABIC LETTER TEHEH FINAL FORM
+FB64;AL # ARABIC LETTER TEHEH INITIAL FORM
+FB65;AL # ARABIC LETTER TEHEH MEDIAL FORM
+FB66;AL # ARABIC LETTER TTEH ISOLATED FORM
+FB67;AL # ARABIC LETTER TTEH FINAL FORM
+FB68;AL # ARABIC LETTER TTEH INITIAL FORM
+FB69;AL # ARABIC LETTER TTEH MEDIAL FORM
+FB6A;AL # ARABIC LETTER VEH ISOLATED FORM
+FB6B;AL # ARABIC LETTER VEH FINAL FORM
+FB6C;AL # ARABIC LETTER VEH INITIAL FORM
+FB6D;AL # ARABIC LETTER VEH MEDIAL FORM
+FB6E;AL # ARABIC LETTER PEHEH ISOLATED FORM
+FB6F;AL # ARABIC LETTER PEHEH FINAL FORM
+FB70;AL # ARABIC LETTER PEHEH INITIAL FORM
+FB71;AL # ARABIC LETTER PEHEH MEDIAL FORM
+FB72;AL # ARABIC LETTER DYEH ISOLATED FORM
+FB73;AL # ARABIC LETTER DYEH FINAL FORM
+FB74;AL # ARABIC LETTER DYEH INITIAL FORM
+FB75;AL # ARABIC LETTER DYEH MEDIAL FORM
+FB76;AL # ARABIC LETTER NYEH ISOLATED FORM
+FB77;AL # ARABIC LETTER NYEH FINAL FORM
+FB78;AL # ARABIC LETTER NYEH INITIAL FORM
+FB79;AL # ARABIC LETTER NYEH MEDIAL FORM
+FB7A;AL # ARABIC LETTER TCHEH ISOLATED FORM
+FB7B;AL # ARABIC LETTER TCHEH FINAL FORM
+FB7C;AL # ARABIC LETTER TCHEH INITIAL FORM
+FB7D;AL # ARABIC LETTER TCHEH MEDIAL FORM
+FB7E;AL # ARABIC LETTER TCHEHEH ISOLATED FORM
+FB7F;AL # ARABIC LETTER TCHEHEH FINAL FORM
+FB80;AL # ARABIC LETTER TCHEHEH INITIAL FORM
+FB81;AL # ARABIC LETTER TCHEHEH MEDIAL FORM
+FB82;AL # ARABIC LETTER DDAHAL ISOLATED FORM
+FB83;AL # ARABIC LETTER DDAHAL FINAL FORM
+FB84;AL # ARABIC LETTER DAHAL ISOLATED FORM
+FB85;AL # ARABIC LETTER DAHAL FINAL FORM
+FB86;AL # ARABIC LETTER DUL ISOLATED FORM
+FB87;AL # ARABIC LETTER DUL FINAL FORM
+FB88;AL # ARABIC LETTER DDAL ISOLATED FORM
+FB89;AL # ARABIC LETTER DDAL FINAL FORM
+FB8A;AL # ARABIC LETTER JEH ISOLATED FORM
+FB8B;AL # ARABIC LETTER JEH FINAL FORM
+FB8C;AL # ARABIC LETTER RREH ISOLATED FORM
+FB8D;AL # ARABIC LETTER RREH FINAL FORM
+FB8E;AL # ARABIC LETTER KEHEH ISOLATED FORM
+FB8F;AL # ARABIC LETTER KEHEH FINAL FORM
+FB90;AL # ARABIC LETTER KEHEH INITIAL FORM
+FB91;AL # ARABIC LETTER KEHEH MEDIAL FORM
+FB92;AL # ARABIC LETTER GAF ISOLATED FORM
+FB93;AL # ARABIC LETTER GAF FINAL FORM
+FB94;AL # ARABIC LETTER GAF INITIAL FORM
+FB95;AL # ARABIC LETTER GAF MEDIAL FORM
+FB96;AL # ARABIC LETTER GUEH ISOLATED FORM
+FB97;AL # ARABIC LETTER GUEH FINAL FORM
+FB98;AL # ARABIC LETTER GUEH INITIAL FORM
+FB99;AL # ARABIC LETTER GUEH MEDIAL FORM
+FB9A;AL # ARABIC LETTER NGOEH ISOLATED FORM
+FB9B;AL # ARABIC LETTER NGOEH FINAL FORM
+FB9C;AL # ARABIC LETTER NGOEH INITIAL FORM
+FB9D;AL # ARABIC LETTER NGOEH MEDIAL FORM
+FB9E;AL # ARABIC LETTER NOON GHUNNA ISOLATED FORM
+FB9F;AL # ARABIC LETTER NOON GHUNNA FINAL FORM
+FBA0;AL # ARABIC LETTER RNOON ISOLATED FORM
+FBA1;AL # ARABIC LETTER RNOON FINAL FORM
+FBA2;AL # ARABIC LETTER RNOON INITIAL FORM
+FBA3;AL # ARABIC LETTER RNOON MEDIAL FORM
+FBA4;AL # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+FBA5;AL # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+FBA6;AL # ARABIC LETTER HEH GOAL ISOLATED FORM
+FBA7;AL # ARABIC LETTER HEH GOAL FINAL FORM
+FBA8;AL # ARABIC LETTER HEH GOAL INITIAL FORM
+FBA9;AL # ARABIC LETTER HEH GOAL MEDIAL FORM
+FBAA;AL # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+FBAB;AL # ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+FBAC;AL # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+FBAD;AL # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+FBAE;AL # ARABIC LETTER YEH BARREE ISOLATED FORM
+FBAF;AL # ARABIC LETTER YEH BARREE FINAL FORM
+FBB0;AL # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+FBB1;AL # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3;AL # ARABIC LETTER NG ISOLATED FORM
+FBD4;AL # ARABIC LETTER NG FINAL FORM
+FBD5;AL # ARABIC LETTER NG INITIAL FORM
+FBD6;AL # ARABIC LETTER NG MEDIAL FORM
+FBD7;AL # ARABIC LETTER U ISOLATED FORM
+FBD8;AL # ARABIC LETTER U FINAL FORM
+FBD9;AL # ARABIC LETTER OE ISOLATED FORM
+FBDA;AL # ARABIC LETTER OE FINAL FORM
+FBDB;AL # ARABIC LETTER YU ISOLATED FORM
+FBDC;AL # ARABIC LETTER YU FINAL FORM
+FBDD;AL # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+FBDE;AL # ARABIC LETTER VE ISOLATED FORM
+FBDF;AL # ARABIC LETTER VE FINAL FORM
+FBE0;AL # ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+FBE1;AL # ARABIC LETTER KIRGHIZ OE FINAL FORM
+FBE2;AL # ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+FBE3;AL # ARABIC LETTER KIRGHIZ YU FINAL FORM
+FBE4;AL # ARABIC LETTER E ISOLATED FORM
+FBE5;AL # ARABIC LETTER E FINAL FORM
+FBE6;AL # ARABIC LETTER E INITIAL FORM
+FBE7;AL # ARABIC LETTER E MEDIAL FORM
+FBE8;AL # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+FBE9;AL # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+FBEA;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+FBEB;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+FBEC;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+FBED;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+FBEE;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+FBEF;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+FBF0;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+FBF1;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+FBF2;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+FBF3;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+FBF4;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+FBF5;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+FBF6;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+FBF7;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+FBF8;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+FBF9;AL # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FBFA;AL # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FBFB;AL # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+FBFC;AL # ARABIC LETTER FARSI YEH ISOLATED FORM
+FBFD;AL # ARABIC LETTER FARSI YEH FINAL FORM
+FBFE;AL # ARABIC LETTER FARSI YEH INITIAL FORM
+FBFF;AL # ARABIC LETTER FARSI YEH MEDIAL FORM
+FC00;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+FC01;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+FC02;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+FC03;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FC04;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+FC05;AL # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+FC06;AL # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+FC07;AL # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+FC08;AL # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+FC09;AL # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+FC0A;AL # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+FC0B;AL # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+FC0C;AL # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+FC0D;AL # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+FC0E;AL # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+FC0F;AL # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+FC10;AL # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+FC11;AL # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+FC12;AL # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+FC13;AL # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+FC14;AL # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+FC15;AL # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+FC16;AL # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+FC17;AL # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+FC18;AL # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+FC19;AL # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+FC1A;AL # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+FC1B;AL # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+FC1C;AL # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+FC1D;AL # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+FC1E;AL # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+FC1F;AL # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+FC20;AL # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+FC21;AL # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+FC22;AL # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+FC23;AL # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+FC24;AL # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+FC25;AL # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+FC26;AL # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+FC27;AL # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+FC28;AL # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+FC29;AL # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+FC2A;AL # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+FC2B;AL # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+FC2C;AL # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+FC2D;AL # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+FC2E;AL # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+FC2F;AL # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+FC30;AL # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+FC31;AL # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+FC32;AL # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+FC33;AL # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+FC34;AL # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+FC35;AL # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+FC36;AL # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+FC37;AL # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+FC38;AL # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+FC39;AL # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+FC3A;AL # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+FC3B;AL # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+FC3C;AL # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+FC3D;AL # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+FC3E;AL # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+FC3F;AL # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+FC40;AL # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+FC41;AL # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+FC42;AL # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+FC43;AL # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+FC44;AL # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+FC45;AL # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+FC46;AL # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+FC47;AL # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+FC48;AL # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+FC49;AL # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+FC4A;AL # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+FC4B;AL # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+FC4C;AL # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+FC4D;AL # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+FC4E;AL # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+FC4F;AL # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+FC50;AL # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+FC51;AL # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+FC52;AL # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+FC53;AL # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+FC54;AL # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+FC55;AL # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+FC56;AL # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+FC57;AL # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+FC58;AL # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+FC59;AL # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+FC5A;AL # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+FC5B;AL # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5C;AL # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5D;AL # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5E;AL # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+FC5F;AL # ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+FC60;AL # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+FC61;AL # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+FC62;AL # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+FC63;AL # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC64;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+FC65;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+FC66;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+FC67;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+FC68;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FC69;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+FC6A;AL # ARABIC LIGATURE BEH WITH REH FINAL FORM
+FC6B;AL # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+FC6C;AL # ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+FC6D;AL # ARABIC LIGATURE BEH WITH NOON FINAL FORM
+FC6E;AL # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+FC6F;AL # ARABIC LIGATURE BEH WITH YEH FINAL FORM
+FC70;AL # ARABIC LIGATURE TEH WITH REH FINAL FORM
+FC71;AL # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+FC72;AL # ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+FC73;AL # ARABIC LIGATURE TEH WITH NOON FINAL FORM
+FC74;AL # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+FC75;AL # ARABIC LIGATURE TEH WITH YEH FINAL FORM
+FC76;AL # ARABIC LIGATURE THEH WITH REH FINAL FORM
+FC77;AL # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+FC78;AL # ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+FC79;AL # ARABIC LIGATURE THEH WITH NOON FINAL FORM
+FC7A;AL # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+FC7B;AL # ARABIC LIGATURE THEH WITH YEH FINAL FORM
+FC7C;AL # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+FC7D;AL # ARABIC LIGATURE FEH WITH YEH FINAL FORM
+FC7E;AL # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+FC7F;AL # ARABIC LIGATURE QAF WITH YEH FINAL FORM
+FC80;AL # ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+FC81;AL # ARABIC LIGATURE KAF WITH LAM FINAL FORM
+FC82;AL # ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+FC83;AL # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+FC84;AL # ARABIC LIGATURE KAF WITH YEH FINAL FORM
+FC85;AL # ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+FC86;AL # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+FC87;AL # ARABIC LIGATURE LAM WITH YEH FINAL FORM
+FC88;AL # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+FC89;AL # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+FC8A;AL # ARABIC LIGATURE NOON WITH REH FINAL FORM
+FC8B;AL # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+FC8C;AL # ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+FC8D;AL # ARABIC LIGATURE NOON WITH NOON FINAL FORM
+FC8E;AL # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+FC8F;AL # ARABIC LIGATURE NOON WITH YEH FINAL FORM
+FC90;AL # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+FC91;AL # ARABIC LIGATURE YEH WITH REH FINAL FORM
+FC92;AL # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+FC93;AL # ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+FC94;AL # ARABIC LIGATURE YEH WITH NOON FINAL FORM
+FC95;AL # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+FC96;AL # ARABIC LIGATURE YEH WITH YEH FINAL FORM
+FC97;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+FC98;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+FC99;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+FC9A;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+FC9B;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+FC9C;AL # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+FC9D;AL # ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+FC9E;AL # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+FC9F;AL # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+FCA0;AL # ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+FCA1;AL # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+FCA2;AL # ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+FCA3;AL # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+FCA4;AL # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+FCA5;AL # ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+FCA6;AL # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+FCA7;AL # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+FCA8;AL # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+FCA9;AL # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+FCAA;AL # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+FCAB;AL # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+FCAC;AL # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+FCAD;AL # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+FCAE;AL # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+FCAF;AL # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+FCB0;AL # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+FCB1;AL # ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+FCB2;AL # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+FCB3;AL # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+FCB4;AL # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+FCB5;AL # ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+FCB6;AL # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+FCB7;AL # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+FCB8;AL # ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+FCB9;AL # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+FCBA;AL # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+FCBB;AL # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+FCBC;AL # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+FCBD;AL # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+FCBE;AL # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+FCBF;AL # ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+FCC0;AL # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+FCC1;AL # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+FCC2;AL # ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+FCC3;AL # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+FCC4;AL # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+FCC5;AL # ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+FCC6;AL # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+FCC7;AL # ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+FCC8;AL # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+FCC9;AL # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+FCCA;AL # ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+FCCB;AL # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+FCCC;AL # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+FCCD;AL # ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+FCCE;AL # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+FCCF;AL # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+FCD0;AL # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+FCD1;AL # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+FCD2;AL # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+FCD3;AL # ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+FCD4;AL # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+FCD5;AL # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+FCD6;AL # ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+FCD7;AL # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+FCD8;AL # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+FCD9;AL # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+FCDA;AL # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+FCDB;AL # ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+FCDC;AL # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+FCDD;AL # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+FCDE;AL # ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+FCDF;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+FCE0;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+FCE1;AL # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+FCE2;AL # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+FCE3;AL # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+FCE4;AL # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+FCE5;AL # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+FCE6;AL # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+FCE7;AL # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+FCE8;AL # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+FCE9;AL # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+FCEA;AL # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+FCEB;AL # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+FCEC;AL # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+FCED;AL # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+FCEE;AL # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+FCEF;AL # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+FCF0;AL # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+FCF1;AL # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+FCF2;AL # ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+FCF3;AL # ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+FCF4;AL # ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+FCF5;AL # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+FCF6;AL # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+FCF7;AL # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+FCF8;AL # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+FCF9;AL # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+FCFA;AL # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+FCFB;AL # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFC;AL # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+FCFD;AL # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFE;AL # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+FCFF;AL # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+FD00;AL # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+FD01;AL # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+FD02;AL # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+FD03;AL # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+FD04;AL # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+FD05;AL # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+FD06;AL # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+FD07;AL # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+FD08;AL # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+FD09;AL # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+FD0A;AL # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+FD0B;AL # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+FD0C;AL # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+FD0D;AL # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+FD0E;AL # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+FD0F;AL # ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+FD10;AL # ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+FD11;AL # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+FD12;AL # ARABIC LIGATURE TAH WITH YEH FINAL FORM
+FD13;AL # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+FD14;AL # ARABIC LIGATURE AIN WITH YEH FINAL FORM
+FD15;AL # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+FD16;AL # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+FD17;AL # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+FD18;AL # ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+FD19;AL # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+FD1A;AL # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+FD1B;AL # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+FD1C;AL # ARABIC LIGATURE HAH WITH YEH FINAL FORM
+FD1D;AL # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+FD1E;AL # ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+FD1F;AL # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+FD20;AL # ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+FD21;AL # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+FD22;AL # ARABIC LIGATURE SAD WITH YEH FINAL FORM
+FD23;AL # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+FD24;AL # ARABIC LIGATURE DAD WITH YEH FINAL FORM
+FD25;AL # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+FD26;AL # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+FD27;AL # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+FD28;AL # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+FD29;AL # ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+FD2A;AL # ARABIC LIGATURE SEEN WITH REH FINAL FORM
+FD2B;AL # ARABIC LIGATURE SAD WITH REH FINAL FORM
+FD2C;AL # ARABIC LIGATURE DAD WITH REH FINAL FORM
+FD2D;AL # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+FD2E;AL # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+FD2F;AL # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+FD30;AL # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+FD31;AL # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+FD32;AL # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+FD33;AL # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+FD34;AL # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+FD35;AL # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+FD36;AL # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+FD37;AL # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+FD38;AL # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+FD39;AL # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+FD3A;AL # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+FD3B;AL # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+FD3C;AL # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+FD3D;AL # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD3E;OP # ORNATE LEFT PARENTHESIS
+FD3F;CL # ORNATE RIGHT PARENTHESIS
+FD50;AL # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+FD51;AL # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+FD52;AL # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+FD53;AL # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+FD54;AL # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+FD55;AL # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+FD56;AL # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+FD57;AL # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+FD58;AL # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+FD59;AL # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+FD5A;AL # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+FD5B;AL # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD5C;AL # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+FD5D;AL # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+FD5E;AL # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD5F;AL # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+FD60;AL # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+FD61;AL # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+FD62;AL # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+FD63;AL # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+FD64;AL # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+FD65;AL # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+FD66;AL # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+FD67;AL # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+FD68;AL # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+FD69;AL # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+FD6A;AL # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+FD6B;AL # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+FD6C;AL # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+FD6D;AL # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+FD6E;AL # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD6F;AL # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+FD70;AL # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+FD71;AL # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+FD72;AL # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+FD73;AL # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+FD74;AL # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+FD75;AL # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+FD76;AL # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+FD77;AL # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+FD78;AL # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD79;AL # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+FD7A;AL # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+FD7B;AL # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD7C;AL # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+FD7D;AL # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+FD7E;AL # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+FD7F;AL # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+FD80;AL # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+FD81;AL # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+FD82;AL # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD83;AL # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+FD84;AL # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+FD85;AL # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+FD86;AL # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+FD87;AL # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+FD88;AL # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+FD89;AL # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+FD8A;AL # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+FD8B;AL # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+FD8C;AL # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+FD8D;AL # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+FD8E;AL # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+FD8F;AL # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92;AL # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+FD93;AL # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+FD94;AL # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+FD95;AL # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+FD96;AL # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD97;AL # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+FD98;AL # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+FD99;AL # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD9A;AL # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+FD9B;AL # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD9C;AL # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+FD9D;AL # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+FD9E;AL # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+FD9F;AL # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+FDA0;AL # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FDA1;AL # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+FDA2;AL # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA3;AL # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+FDA4;AL # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA5;AL # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+FDA6;AL # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FDA7;AL # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA8;AL # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA9;AL # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+FDAA;AL # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+FDAB;AL # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+FDAC;AL # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+FDAD;AL # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+FDAE;AL # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+FDAF;AL # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+FDB0;AL # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+FDB1;AL # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+FDB2;AL # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+FDB3;AL # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+FDB4;AL # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+FDB5;AL # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+FDB6;AL # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+FDB7;AL # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+FDB8;AL # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+FDB9;AL # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+FDBA;AL # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+FDBB;AL # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+FDBC;AL # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+FDBD;AL # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+FDBE;AL # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+FDBF;AL # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+FDC0;AL # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+FDC1;AL # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+FDC2;AL # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+FDC3;AL # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+FDC4;AL # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+FDC5;AL # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+FDC6;AL # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+FDC7;AL # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0;AL # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF1;AL # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF2;AL # ARABIC LIGATURE ALLAH ISOLATED FORM
+FDF3;AL # ARABIC LIGATURE AKBAR ISOLATED FORM
+FDF4;AL # ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+FDF5;AL # ARABIC LIGATURE SALAM ISOLATED FORM
+FDF6;AL # ARABIC LIGATURE RASOUL ISOLATED FORM
+FDF7;AL # ARABIC LIGATURE ALAYHE ISOLATED FORM
+FDF8;AL # ARABIC LIGATURE WASALLAM ISOLATED FORM
+FDF9;AL # ARABIC LIGATURE SALLA ISOLATED FORM
+FDFA;AL # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+FDFB;AL # ARABIC LIGATURE JALLAJALALOUHOU
+FDFC;PO # RIAL SIGN
+FDFD;AL # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE00;CM # VARIATION SELECTOR-1
+FE01;CM # VARIATION SELECTOR-2
+FE02;CM # VARIATION SELECTOR-3
+FE03;CM # VARIATION SELECTOR-4
+FE04;CM # VARIATION SELECTOR-5
+FE05;CM # VARIATION SELECTOR-6
+FE06;CM # VARIATION SELECTOR-7
+FE07;CM # VARIATION SELECTOR-8
+FE08;CM # VARIATION SELECTOR-9
+FE09;CM # VARIATION SELECTOR-10
+FE0A;CM # VARIATION SELECTOR-11
+FE0B;CM # VARIATION SELECTOR-12
+FE0C;CM # VARIATION SELECTOR-13
+FE0D;CM # VARIATION SELECTOR-14
+FE0E;CM # VARIATION SELECTOR-15
+FE0F;CM # VARIATION SELECTOR-16
+FE10;IS # PRESENTATION FORM FOR VERTICAL COMMA
+FE11;CL # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
+FE12;CL # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP
+FE13;IS # PRESENTATION FORM FOR VERTICAL COLON
+FE14;IS # PRESENTATION FORM FOR VERTICAL SEMICOLON
+FE15;EX # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
+FE16;EX # PRESENTATION FORM FOR VERTICAL QUESTION MARK
+FE17;OP # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+FE18;CL # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+FE19;IN # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE20;CM # COMBINING LIGATURE LEFT HALF
+FE21;CM # COMBINING LIGATURE RIGHT HALF
+FE22;CM # COMBINING DOUBLE TILDE LEFT HALF
+FE23;CM # COMBINING DOUBLE TILDE RIGHT HALF
+FE24;CM # COMBINING MACRON LEFT HALF
+FE25;CM # COMBINING MACRON RIGHT HALF
+FE26;CM # COMBINING CONJOINING MACRON
+FE30;ID # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31;ID # PRESENTATION FORM FOR VERTICAL EM DASH
+FE32;ID # PRESENTATION FORM FOR VERTICAL EN DASH
+FE33;ID # PRESENTATION FORM FOR VERTICAL LOW LINE
+FE34;ID # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35;OP # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36;CL # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37;OP # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38;CL # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39;OP # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A;CL # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B;OP # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C;CL # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D;OP # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E;CL # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F;OP # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40;CL # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41;OP # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42;CL # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43;OP # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44;CL # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45;ID # SESAME DOT
+FE46;ID # WHITE SESAME DOT
+FE47;OP # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48;CL # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49;ID # DASHED OVERLINE
+FE4A;ID # CENTRELINE OVERLINE
+FE4B;ID # WAVY OVERLINE
+FE4C;ID # DOUBLE WAVY OVERLINE
+FE4D;ID # DASHED LOW LINE
+FE4E;ID # CENTRELINE LOW LINE
+FE4F;ID # WAVY LOW LINE
+FE50;CL # SMALL COMMA
+FE51;ID # SMALL IDEOGRAPHIC COMMA
+FE52;CL # SMALL FULL STOP
+FE54;NS # SMALL SEMICOLON
+FE55;NS # SMALL COLON
+FE56;EX # SMALL QUESTION MARK
+FE57;EX # SMALL EXCLAMATION MARK
+FE58;ID # SMALL EM DASH
+FE59;OP # SMALL LEFT PARENTHESIS
+FE5A;CL # SMALL RIGHT PARENTHESIS
+FE5B;OP # SMALL LEFT CURLY BRACKET
+FE5C;CL # SMALL RIGHT CURLY BRACKET
+FE5D;OP # SMALL LEFT TORTOISE SHELL BRACKET
+FE5E;CL # SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F;ID # SMALL NUMBER SIGN
+FE60;ID # SMALL AMPERSAND
+FE61;ID # SMALL ASTERISK
+FE62;ID # SMALL PLUS SIGN
+FE63;ID # SMALL HYPHEN-MINUS
+FE64;ID # SMALL LESS-THAN SIGN
+FE65;ID # SMALL GREATER-THAN SIGN
+FE66;ID # SMALL EQUALS SIGN
+FE68;ID # SMALL REVERSE SOLIDUS
+FE69;PR # SMALL DOLLAR SIGN
+FE6A;PO # SMALL PERCENT SIGN
+FE6B;ID # SMALL COMMERCIAL AT
+FE70;AL # ARABIC FATHATAN ISOLATED FORM
+FE71;AL # ARABIC TATWEEL WITH FATHATAN ABOVE
+FE72;AL # ARABIC DAMMATAN ISOLATED FORM
+FE73;AL # ARABIC TAIL FRAGMENT
+FE74;AL # ARABIC KASRATAN ISOLATED FORM
+FE76;AL # ARABIC FATHA ISOLATED FORM
+FE77;AL # ARABIC FATHA MEDIAL FORM
+FE78;AL # ARABIC DAMMA ISOLATED FORM
+FE79;AL # ARABIC DAMMA MEDIAL FORM
+FE7A;AL # ARABIC KASRA ISOLATED FORM
+FE7B;AL # ARABIC KASRA MEDIAL FORM
+FE7C;AL # ARABIC SHADDA ISOLATED FORM
+FE7D;AL # ARABIC SHADDA MEDIAL FORM
+FE7E;AL # ARABIC SUKUN ISOLATED FORM
+FE7F;AL # ARABIC SUKUN MEDIAL FORM
+FE80;AL # ARABIC LETTER HAMZA ISOLATED FORM
+FE81;AL # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+FE82;AL # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+FE83;AL # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+FE84;AL # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+FE85;AL # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+FE86;AL # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+FE87;AL # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+FE88;AL # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+FE89;AL # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+FE8A;AL # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+FE8B;AL # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+FE8C;AL # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+FE8D;AL # ARABIC LETTER ALEF ISOLATED FORM
+FE8E;AL # ARABIC LETTER ALEF FINAL FORM
+FE8F;AL # ARABIC LETTER BEH ISOLATED FORM
+FE90;AL # ARABIC LETTER BEH FINAL FORM
+FE91;AL # ARABIC LETTER BEH INITIAL FORM
+FE92;AL # ARABIC LETTER BEH MEDIAL FORM
+FE93;AL # ARABIC LETTER TEH MARBUTA ISOLATED FORM
+FE94;AL # ARABIC LETTER TEH MARBUTA FINAL FORM
+FE95;AL # ARABIC LETTER TEH ISOLATED FORM
+FE96;AL # ARABIC LETTER TEH FINAL FORM
+FE97;AL # ARABIC LETTER TEH INITIAL FORM
+FE98;AL # ARABIC LETTER TEH MEDIAL FORM
+FE99;AL # ARABIC LETTER THEH ISOLATED FORM
+FE9A;AL # ARABIC LETTER THEH FINAL FORM
+FE9B;AL # ARABIC LETTER THEH INITIAL FORM
+FE9C;AL # ARABIC LETTER THEH MEDIAL FORM
+FE9D;AL # ARABIC LETTER JEEM ISOLATED FORM
+FE9E;AL # ARABIC LETTER JEEM FINAL FORM
+FE9F;AL # ARABIC LETTER JEEM INITIAL FORM
+FEA0;AL # ARABIC LETTER JEEM MEDIAL FORM
+FEA1;AL # ARABIC LETTER HAH ISOLATED FORM
+FEA2;AL # ARABIC LETTER HAH FINAL FORM
+FEA3;AL # ARABIC LETTER HAH INITIAL FORM
+FEA4;AL # ARABIC LETTER HAH MEDIAL FORM
+FEA5;AL # ARABIC LETTER KHAH ISOLATED FORM
+FEA6;AL # ARABIC LETTER KHAH FINAL FORM
+FEA7;AL # ARABIC LETTER KHAH INITIAL FORM
+FEA8;AL # ARABIC LETTER KHAH MEDIAL FORM
+FEA9;AL # ARABIC LETTER DAL ISOLATED FORM
+FEAA;AL # ARABIC LETTER DAL FINAL FORM
+FEAB;AL # ARABIC LETTER THAL ISOLATED FORM
+FEAC;AL # ARABIC LETTER THAL FINAL FORM
+FEAD;AL # ARABIC LETTER REH ISOLATED FORM
+FEAE;AL # ARABIC LETTER REH FINAL FORM
+FEAF;AL # ARABIC LETTER ZAIN ISOLATED FORM
+FEB0;AL # ARABIC LETTER ZAIN FINAL FORM
+FEB1;AL # ARABIC LETTER SEEN ISOLATED FORM
+FEB2;AL # ARABIC LETTER SEEN FINAL FORM
+FEB3;AL # ARABIC LETTER SEEN INITIAL FORM
+FEB4;AL # ARABIC LETTER SEEN MEDIAL FORM
+FEB5;AL # ARABIC LETTER SHEEN ISOLATED FORM
+FEB6;AL # ARABIC LETTER SHEEN FINAL FORM
+FEB7;AL # ARABIC LETTER SHEEN INITIAL FORM
+FEB8;AL # ARABIC LETTER SHEEN MEDIAL FORM
+FEB9;AL # ARABIC LETTER SAD ISOLATED FORM
+FEBA;AL # ARABIC LETTER SAD FINAL FORM
+FEBB;AL # ARABIC LETTER SAD INITIAL FORM
+FEBC;AL # ARABIC LETTER SAD MEDIAL FORM
+FEBD;AL # ARABIC LETTER DAD ISOLATED FORM
+FEBE;AL # ARABIC LETTER DAD FINAL FORM
+FEBF;AL # ARABIC LETTER DAD INITIAL FORM
+FEC0;AL # ARABIC LETTER DAD MEDIAL FORM
+FEC1;AL # ARABIC LETTER TAH ISOLATED FORM
+FEC2;AL # ARABIC LETTER TAH FINAL FORM
+FEC3;AL # ARABIC LETTER TAH INITIAL FORM
+FEC4;AL # ARABIC LETTER TAH MEDIAL FORM
+FEC5;AL # ARABIC LETTER ZAH ISOLATED FORM
+FEC6;AL # ARABIC LETTER ZAH FINAL FORM
+FEC7;AL # ARABIC LETTER ZAH INITIAL FORM
+FEC8;AL # ARABIC LETTER ZAH MEDIAL FORM
+FEC9;AL # ARABIC LETTER AIN ISOLATED FORM
+FECA;AL # ARABIC LETTER AIN FINAL FORM
+FECB;AL # ARABIC LETTER AIN INITIAL FORM
+FECC;AL # ARABIC LETTER AIN MEDIAL FORM
+FECD;AL # ARABIC LETTER GHAIN ISOLATED FORM
+FECE;AL # ARABIC LETTER GHAIN FINAL FORM
+FECF;AL # ARABIC LETTER GHAIN INITIAL FORM
+FED0;AL # ARABIC LETTER GHAIN MEDIAL FORM
+FED1;AL # ARABIC LETTER FEH ISOLATED FORM
+FED2;AL # ARABIC LETTER FEH FINAL FORM
+FED3;AL # ARABIC LETTER FEH INITIAL FORM
+FED4;AL # ARABIC LETTER FEH MEDIAL FORM
+FED5;AL # ARABIC LETTER QAF ISOLATED FORM
+FED6;AL # ARABIC LETTER QAF FINAL FORM
+FED7;AL # ARABIC LETTER QAF INITIAL FORM
+FED8;AL # ARABIC LETTER QAF MEDIAL FORM
+FED9;AL # ARABIC LETTER KAF ISOLATED FORM
+FEDA;AL # ARABIC LETTER KAF FINAL FORM
+FEDB;AL # ARABIC LETTER KAF INITIAL FORM
+FEDC;AL # ARABIC LETTER KAF MEDIAL FORM
+FEDD;AL # ARABIC LETTER LAM ISOLATED FORM
+FEDE;AL # ARABIC LETTER LAM FINAL FORM
+FEDF;AL # ARABIC LETTER LAM INITIAL FORM
+FEE0;AL # ARABIC LETTER LAM MEDIAL FORM
+FEE1;AL # ARABIC LETTER MEEM ISOLATED FORM
+FEE2;AL # ARABIC LETTER MEEM FINAL FORM
+FEE3;AL # ARABIC LETTER MEEM INITIAL FORM
+FEE4;AL # ARABIC LETTER MEEM MEDIAL FORM
+FEE5;AL # ARABIC LETTER NOON ISOLATED FORM
+FEE6;AL # ARABIC LETTER NOON FINAL FORM
+FEE7;AL # ARABIC LETTER NOON INITIAL FORM
+FEE8;AL # ARABIC LETTER NOON MEDIAL FORM
+FEE9;AL # ARABIC LETTER HEH ISOLATED FORM
+FEEA;AL # ARABIC LETTER HEH FINAL FORM
+FEEB;AL # ARABIC LETTER HEH INITIAL FORM
+FEEC;AL # ARABIC LETTER HEH MEDIAL FORM
+FEED;AL # ARABIC LETTER WAW ISOLATED FORM
+FEEE;AL # ARABIC LETTER WAW FINAL FORM
+FEEF;AL # ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+FEF0;AL # ARABIC LETTER ALEF MAKSURA FINAL FORM
+FEF1;AL # ARABIC LETTER YEH ISOLATED FORM
+FEF2;AL # ARABIC LETTER YEH FINAL FORM
+FEF3;AL # ARABIC LETTER YEH INITIAL FORM
+FEF4;AL # ARABIC LETTER YEH MEDIAL FORM
+FEF5;AL # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+FEF6;AL # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+FEF7;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+FEF8;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+FEF9;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+FEFA;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+FEFB;AL # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+FEFC;AL # ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FEFF;WJ # ZERO WIDTH NO-BREAK SPACE
+FF01;EX # FULLWIDTH EXCLAMATION MARK
+FF02;ID # FULLWIDTH QUOTATION MARK
+FF03;ID # FULLWIDTH NUMBER SIGN
+FF04;PR # FULLWIDTH DOLLAR SIGN
+FF05;PO # FULLWIDTH PERCENT SIGN
+FF06;ID # FULLWIDTH AMPERSAND
+FF07;ID # FULLWIDTH APOSTROPHE
+FF08;OP # FULLWIDTH LEFT PARENTHESIS
+FF09;CL # FULLWIDTH RIGHT PARENTHESIS
+FF0A;ID # FULLWIDTH ASTERISK
+FF0B;ID # FULLWIDTH PLUS SIGN
+FF0C;CL # FULLWIDTH COMMA
+FF0D;ID # FULLWIDTH HYPHEN-MINUS
+FF0E;CL # FULLWIDTH FULL STOP
+FF0F;ID # FULLWIDTH SOLIDUS
+FF10;ID # FULLWIDTH DIGIT ZERO
+FF11;ID # FULLWIDTH DIGIT ONE
+FF12;ID # FULLWIDTH DIGIT TWO
+FF13;ID # FULLWIDTH DIGIT THREE
+FF14;ID # FULLWIDTH DIGIT FOUR
+FF15;ID # FULLWIDTH DIGIT FIVE
+FF16;ID # FULLWIDTH DIGIT SIX
+FF17;ID # FULLWIDTH DIGIT SEVEN
+FF18;ID # FULLWIDTH DIGIT EIGHT
+FF19;ID # FULLWIDTH DIGIT NINE
+FF1A;NS # FULLWIDTH COLON
+FF1B;NS # FULLWIDTH SEMICOLON
+FF1C;ID # FULLWIDTH LESS-THAN SIGN
+FF1D;ID # FULLWIDTH EQUALS SIGN
+FF1E;ID # FULLWIDTH GREATER-THAN SIGN
+FF1F;EX # FULLWIDTH QUESTION MARK
+FF20;ID # FULLWIDTH COMMERCIAL AT
+FF21;ID # FULLWIDTH LATIN CAPITAL LETTER A
+FF22;ID # FULLWIDTH LATIN CAPITAL LETTER B
+FF23;ID # FULLWIDTH LATIN CAPITAL LETTER C
+FF24;ID # FULLWIDTH LATIN CAPITAL LETTER D
+FF25;ID # FULLWIDTH LATIN CAPITAL LETTER E
+FF26;ID # FULLWIDTH LATIN CAPITAL LETTER F
+FF27;ID # FULLWIDTH LATIN CAPITAL LETTER G
+FF28;ID # FULLWIDTH LATIN CAPITAL LETTER H
+FF29;ID # FULLWIDTH LATIN CAPITAL LETTER I
+FF2A;ID # FULLWIDTH LATIN CAPITAL LETTER J
+FF2B;ID # FULLWIDTH LATIN CAPITAL LETTER K
+FF2C;ID # FULLWIDTH LATIN CAPITAL LETTER L
+FF2D;ID # FULLWIDTH LATIN CAPITAL LETTER M
+FF2E;ID # FULLWIDTH LATIN CAPITAL LETTER N
+FF2F;ID # FULLWIDTH LATIN CAPITAL LETTER O
+FF30;ID # FULLWIDTH LATIN CAPITAL LETTER P
+FF31;ID # FULLWIDTH LATIN CAPITAL LETTER Q
+FF32;ID # FULLWIDTH LATIN CAPITAL LETTER R
+FF33;ID # FULLWIDTH LATIN CAPITAL LETTER S
+FF34;ID # FULLWIDTH LATIN CAPITAL LETTER T
+FF35;ID # FULLWIDTH LATIN CAPITAL LETTER U
+FF36;ID # FULLWIDTH LATIN CAPITAL LETTER V
+FF37;ID # FULLWIDTH LATIN CAPITAL LETTER W
+FF38;ID # FULLWIDTH LATIN CAPITAL LETTER X
+FF39;ID # FULLWIDTH LATIN CAPITAL LETTER Y
+FF3A;ID # FULLWIDTH LATIN CAPITAL LETTER Z
+FF3B;OP # FULLWIDTH LEFT SQUARE BRACKET
+FF3C;ID # FULLWIDTH REVERSE SOLIDUS
+FF3D;CL # FULLWIDTH RIGHT SQUARE BRACKET
+FF3E;ID # FULLWIDTH CIRCUMFLEX ACCENT
+FF3F;ID # FULLWIDTH LOW LINE
+FF40;ID # FULLWIDTH GRAVE ACCENT
+FF41;ID # FULLWIDTH LATIN SMALL LETTER A
+FF42;ID # FULLWIDTH LATIN SMALL LETTER B
+FF43;ID # FULLWIDTH LATIN SMALL LETTER C
+FF44;ID # FULLWIDTH LATIN SMALL LETTER D
+FF45;ID # FULLWIDTH LATIN SMALL LETTER E
+FF46;ID # FULLWIDTH LATIN SMALL LETTER F
+FF47;ID # FULLWIDTH LATIN SMALL LETTER G
+FF48;ID # FULLWIDTH LATIN SMALL LETTER H
+FF49;ID # FULLWIDTH LATIN SMALL LETTER I
+FF4A;ID # FULLWIDTH LATIN SMALL LETTER J
+FF4B;ID # FULLWIDTH LATIN SMALL LETTER K
+FF4C;ID # FULLWIDTH LATIN SMALL LETTER L
+FF4D;ID # FULLWIDTH LATIN SMALL LETTER M
+FF4E;ID # FULLWIDTH LATIN SMALL LETTER N
+FF4F;ID # FULLWIDTH LATIN SMALL LETTER O
+FF50;ID # FULLWIDTH LATIN SMALL LETTER P
+FF51;ID # FULLWIDTH LATIN SMALL LETTER Q
+FF52;ID # FULLWIDTH LATIN SMALL LETTER R
+FF53;ID # FULLWIDTH LATIN SMALL LETTER S
+FF54;ID # FULLWIDTH LATIN SMALL LETTER T
+FF55;ID # FULLWIDTH LATIN SMALL LETTER U
+FF56;ID # FULLWIDTH LATIN SMALL LETTER V
+FF57;ID # FULLWIDTH LATIN SMALL LETTER W
+FF58;ID # FULLWIDTH LATIN SMALL LETTER X
+FF59;ID # FULLWIDTH LATIN SMALL LETTER Y
+FF5A;ID # FULLWIDTH LATIN SMALL LETTER Z
+FF5B;OP # FULLWIDTH LEFT CURLY BRACKET
+FF5C;ID # FULLWIDTH VERTICAL LINE
+FF5D;CL # FULLWIDTH RIGHT CURLY BRACKET
+FF5E;ID # FULLWIDTH TILDE
+FF5F;OP # FULLWIDTH LEFT WHITE PARENTHESIS
+FF60;CL # FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61;CL # HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62;OP # HALFWIDTH LEFT CORNER BRACKET
+FF63;CL # HALFWIDTH RIGHT CORNER BRACKET
+FF64;CL # HALFWIDTH IDEOGRAPHIC COMMA
+FF65;NS # HALFWIDTH KATAKANA MIDDLE DOT
+FF66;AL # HALFWIDTH KATAKANA LETTER WO
+FF67;NS # HALFWIDTH KATAKANA LETTER SMALL A
+FF68;NS # HALFWIDTH KATAKANA LETTER SMALL I
+FF69;NS # HALFWIDTH KATAKANA LETTER SMALL U
+FF6A;NS # HALFWIDTH KATAKANA LETTER SMALL E
+FF6B;NS # HALFWIDTH KATAKANA LETTER SMALL O
+FF6C;NS # HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D;NS # HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E;NS # HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F;NS # HALFWIDTH KATAKANA LETTER SMALL TU
+FF70;NS # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71;AL # HALFWIDTH KATAKANA LETTER A
+FF72;AL # HALFWIDTH KATAKANA LETTER I
+FF73;AL # HALFWIDTH KATAKANA LETTER U
+FF74;AL # HALFWIDTH KATAKANA LETTER E
+FF75;AL # HALFWIDTH KATAKANA LETTER O
+FF76;AL # HALFWIDTH KATAKANA LETTER KA
+FF77;AL # HALFWIDTH KATAKANA LETTER KI
+FF78;AL # HALFWIDTH KATAKANA LETTER KU
+FF79;AL # HALFWIDTH KATAKANA LETTER KE
+FF7A;AL # HALFWIDTH KATAKANA LETTER KO
+FF7B;AL # HALFWIDTH KATAKANA LETTER SA
+FF7C;AL # HALFWIDTH KATAKANA LETTER SI
+FF7D;AL # HALFWIDTH KATAKANA LETTER SU
+FF7E;AL # HALFWIDTH KATAKANA LETTER SE
+FF7F;AL # HALFWIDTH KATAKANA LETTER SO
+FF80;AL # HALFWIDTH KATAKANA LETTER TA
+FF81;AL # HALFWIDTH KATAKANA LETTER TI
+FF82;AL # HALFWIDTH KATAKANA LETTER TU
+FF83;AL # HALFWIDTH KATAKANA LETTER TE
+FF84;AL # HALFWIDTH KATAKANA LETTER TO
+FF85;AL # HALFWIDTH KATAKANA LETTER NA
+FF86;AL # HALFWIDTH KATAKANA LETTER NI
+FF87;AL # HALFWIDTH KATAKANA LETTER NU
+FF88;AL # HALFWIDTH KATAKANA LETTER NE
+FF89;AL # HALFWIDTH KATAKANA LETTER NO
+FF8A;AL # HALFWIDTH KATAKANA LETTER HA
+FF8B;AL # HALFWIDTH KATAKANA LETTER HI
+FF8C;AL # HALFWIDTH KATAKANA LETTER HU
+FF8D;AL # HALFWIDTH KATAKANA LETTER HE
+FF8E;AL # HALFWIDTH KATAKANA LETTER HO
+FF8F;AL # HALFWIDTH KATAKANA LETTER MA
+FF90;AL # HALFWIDTH KATAKANA LETTER MI
+FF91;AL # HALFWIDTH KATAKANA LETTER MU
+FF92;AL # HALFWIDTH KATAKANA LETTER ME
+FF93;AL # HALFWIDTH KATAKANA LETTER MO
+FF94;AL # HALFWIDTH KATAKANA LETTER YA
+FF95;AL # HALFWIDTH KATAKANA LETTER YU
+FF96;AL # HALFWIDTH KATAKANA LETTER YO
+FF97;AL # HALFWIDTH KATAKANA LETTER RA
+FF98;AL # HALFWIDTH KATAKANA LETTER RI
+FF99;AL # HALFWIDTH KATAKANA LETTER RU
+FF9A;AL # HALFWIDTH KATAKANA LETTER RE
+FF9B;AL # HALFWIDTH KATAKANA LETTER RO
+FF9C;AL # HALFWIDTH KATAKANA LETTER WA
+FF9D;AL # HALFWIDTH KATAKANA LETTER N
+FF9E;NS # HALFWIDTH KATAKANA VOICED SOUND MARK
+FF9F;NS # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0;AL # HALFWIDTH HANGUL FILLER
+FFA1;AL # HALFWIDTH HANGUL LETTER KIYEOK
+FFA2;AL # HALFWIDTH HANGUL LETTER SSANGKIYEOK
+FFA3;AL # HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+FFA4;AL # HALFWIDTH HANGUL LETTER NIEUN
+FFA5;AL # HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+FFA6;AL # HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+FFA7;AL # HALFWIDTH HANGUL LETTER TIKEUT
+FFA8;AL # HALFWIDTH HANGUL LETTER SSANGTIKEUT
+FFA9;AL # HALFWIDTH HANGUL LETTER RIEUL
+FFAA;AL # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+FFAB;AL # HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+FFAC;AL # HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+FFAD;AL # HALFWIDTH HANGUL LETTER RIEUL-SIOS
+FFAE;AL # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+FFAF;AL # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+FFB0;AL # HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+FFB1;AL # HALFWIDTH HANGUL LETTER MIEUM
+FFB2;AL # HALFWIDTH HANGUL LETTER PIEUP
+FFB3;AL # HALFWIDTH HANGUL LETTER SSANGPIEUP
+FFB4;AL # HALFWIDTH HANGUL LETTER PIEUP-SIOS
+FFB5;AL # HALFWIDTH HANGUL LETTER SIOS
+FFB6;AL # HALFWIDTH HANGUL LETTER SSANGSIOS
+FFB7;AL # HALFWIDTH HANGUL LETTER IEUNG
+FFB8;AL # HALFWIDTH HANGUL LETTER CIEUC
+FFB9;AL # HALFWIDTH HANGUL LETTER SSANGCIEUC
+FFBA;AL # HALFWIDTH HANGUL LETTER CHIEUCH
+FFBB;AL # HALFWIDTH HANGUL LETTER KHIEUKH
+FFBC;AL # HALFWIDTH HANGUL LETTER THIEUTH
+FFBD;AL # HALFWIDTH HANGUL LETTER PHIEUPH
+FFBE;AL # HALFWIDTH HANGUL LETTER HIEUH
+FFC2;AL # HALFWIDTH HANGUL LETTER A
+FFC3;AL # HALFWIDTH HANGUL LETTER AE
+FFC4;AL # HALFWIDTH HANGUL LETTER YA
+FFC5;AL # HALFWIDTH HANGUL LETTER YAE
+FFC6;AL # HALFWIDTH HANGUL LETTER EO
+FFC7;AL # HALFWIDTH HANGUL LETTER E
+FFCA;AL # HALFWIDTH HANGUL LETTER YEO
+FFCB;AL # HALFWIDTH HANGUL LETTER YE
+FFCC;AL # HALFWIDTH HANGUL LETTER O
+FFCD;AL # HALFWIDTH HANGUL LETTER WA
+FFCE;AL # HALFWIDTH HANGUL LETTER WAE
+FFCF;AL # HALFWIDTH HANGUL LETTER OE
+FFD2;AL # HALFWIDTH HANGUL LETTER YO
+FFD3;AL # HALFWIDTH HANGUL LETTER U
+FFD4;AL # HALFWIDTH HANGUL LETTER WEO
+FFD5;AL # HALFWIDTH HANGUL LETTER WE
+FFD6;AL # HALFWIDTH HANGUL LETTER WI
+FFD7;AL # HALFWIDTH HANGUL LETTER YU
+FFDA;AL # HALFWIDTH HANGUL LETTER EU
+FFDB;AL # HALFWIDTH HANGUL LETTER YI
+FFDC;AL # HALFWIDTH HANGUL LETTER I
+FFE0;PO # FULLWIDTH CENT SIGN
+FFE1;PR # FULLWIDTH POUND SIGN
+FFE2;ID # FULLWIDTH NOT SIGN
+FFE3;ID # FULLWIDTH MACRON
+FFE4;ID # FULLWIDTH BROKEN BAR
+FFE5;PR # FULLWIDTH YEN SIGN
+FFE6;PR # FULLWIDTH WON SIGN
+FFE8;AL # HALFWIDTH FORMS LIGHT VERTICAL
+FFE9;AL # HALFWIDTH LEFTWARDS ARROW
+FFEA;AL # HALFWIDTH UPWARDS ARROW
+FFEB;AL # HALFWIDTH RIGHTWARDS ARROW
+FFEC;AL # HALFWIDTH DOWNWARDS ARROW
+FFED;AL # HALFWIDTH BLACK SQUARE
+FFEE;AL # HALFWIDTH WHITE CIRCLE
+FFF9;CM # INTERLINEAR ANNOTATION ANCHOR
+FFFA;CM # INTERLINEAR ANNOTATION SEPARATOR
+FFFB;CM # INTERLINEAR ANNOTATION TERMINATOR
+FFFC;CB # OBJECT REPLACEMENT CHARACTER
+FFFD;AI # REPLACEMENT CHARACTER
+10000;AL # LINEAR B SYLLABLE B008 A
+10001;AL # LINEAR B SYLLABLE B038 E
+10002;AL # LINEAR B SYLLABLE B028 I
+10003;AL # LINEAR B SYLLABLE B061 O
+10004;AL # LINEAR B SYLLABLE B010 U
+10005;AL # LINEAR B SYLLABLE B001 DA
+10006;AL # LINEAR B SYLLABLE B045 DE
+10007;AL # LINEAR B SYLLABLE B007 DI
+10008;AL # LINEAR B SYLLABLE B014 DO
+10009;AL # LINEAR B SYLLABLE B051 DU
+1000A;AL # LINEAR B SYLLABLE B057 JA
+1000B;AL # LINEAR B SYLLABLE B046 JE
+1000D;AL # LINEAR B SYLLABLE B036 JO
+1000E;AL # LINEAR B SYLLABLE B065 JU
+1000F;AL # LINEAR B SYLLABLE B077 KA
+10010;AL # LINEAR B SYLLABLE B044 KE
+10011;AL # LINEAR B SYLLABLE B067 KI
+10012;AL # LINEAR B SYLLABLE B070 KO
+10013;AL # LINEAR B SYLLABLE B081 KU
+10014;AL # LINEAR B SYLLABLE B080 MA
+10015;AL # LINEAR B SYLLABLE B013 ME
+10016;AL # LINEAR B SYLLABLE B073 MI
+10017;AL # LINEAR B SYLLABLE B015 MO
+10018;AL # LINEAR B SYLLABLE B023 MU
+10019;AL # LINEAR B SYLLABLE B006 NA
+1001A;AL # LINEAR B SYLLABLE B024 NE
+1001B;AL # LINEAR B SYLLABLE B030 NI
+1001C;AL # LINEAR B SYLLABLE B052 NO
+1001D;AL # LINEAR B SYLLABLE B055 NU
+1001E;AL # LINEAR B SYLLABLE B003 PA
+1001F;AL # LINEAR B SYLLABLE B072 PE
+10020;AL # LINEAR B SYLLABLE B039 PI
+10021;AL # LINEAR B SYLLABLE B011 PO
+10022;AL # LINEAR B SYLLABLE B050 PU
+10023;AL # LINEAR B SYLLABLE B016 QA
+10024;AL # LINEAR B SYLLABLE B078 QE
+10025;AL # LINEAR B SYLLABLE B021 QI
+10026;AL # LINEAR B SYLLABLE B032 QO
+10028;AL # LINEAR B SYLLABLE B060 RA
+10029;AL # LINEAR B SYLLABLE B027 RE
+1002A;AL # LINEAR B SYLLABLE B053 RI
+1002B;AL # LINEAR B SYLLABLE B002 RO
+1002C;AL # LINEAR B SYLLABLE B026 RU
+1002D;AL # LINEAR B SYLLABLE B031 SA
+1002E;AL # LINEAR B SYLLABLE B009 SE
+1002F;AL # LINEAR B SYLLABLE B041 SI
+10030;AL # LINEAR B SYLLABLE B012 SO
+10031;AL # LINEAR B SYLLABLE B058 SU
+10032;AL # LINEAR B SYLLABLE B059 TA
+10033;AL # LINEAR B SYLLABLE B004 TE
+10034;AL # LINEAR B SYLLABLE B037 TI
+10035;AL # LINEAR B SYLLABLE B005 TO
+10036;AL # LINEAR B SYLLABLE B069 TU
+10037;AL # LINEAR B SYLLABLE B054 WA
+10038;AL # LINEAR B SYLLABLE B075 WE
+10039;AL # LINEAR B SYLLABLE B040 WI
+1003A;AL # LINEAR B SYLLABLE B042 WO
+1003C;AL # LINEAR B SYLLABLE B017 ZA
+1003D;AL # LINEAR B SYLLABLE B074 ZE
+1003F;AL # LINEAR B SYLLABLE B020 ZO
+10040;AL # LINEAR B SYLLABLE B025 A2
+10041;AL # LINEAR B SYLLABLE B043 A3
+10042;AL # LINEAR B SYLLABLE B085 AU
+10043;AL # LINEAR B SYLLABLE B071 DWE
+10044;AL # LINEAR B SYLLABLE B090 DWO
+10045;AL # LINEAR B SYLLABLE B048 NWA
+10046;AL # LINEAR B SYLLABLE B029 PU2
+10047;AL # LINEAR B SYLLABLE B062 PTE
+10048;AL # LINEAR B SYLLABLE B076 RA2
+10049;AL # LINEAR B SYLLABLE B033 RA3
+1004A;AL # LINEAR B SYLLABLE B068 RO2
+1004B;AL # LINEAR B SYLLABLE B066 TA2
+1004C;AL # LINEAR B SYLLABLE B087 TWE
+1004D;AL # LINEAR B SYLLABLE B091 TWO
+10050;AL # LINEAR B SYMBOL B018
+10051;AL # LINEAR B SYMBOL B019
+10052;AL # LINEAR B SYMBOL B022
+10053;AL # LINEAR B SYMBOL B034
+10054;AL # LINEAR B SYMBOL B047
+10055;AL # LINEAR B SYMBOL B049
+10056;AL # LINEAR B SYMBOL B056
+10057;AL # LINEAR B SYMBOL B063
+10058;AL # LINEAR B SYMBOL B064
+10059;AL # LINEAR B SYMBOL B079
+1005A;AL # LINEAR B SYMBOL B082
+1005B;AL # LINEAR B SYMBOL B083
+1005C;AL # LINEAR B SYMBOL B086
+1005D;AL # LINEAR B SYMBOL B089
+10080;AL # LINEAR B IDEOGRAM B100 MAN
+10081;AL # LINEAR B IDEOGRAM B102 WOMAN
+10082;AL # LINEAR B IDEOGRAM B104 DEER
+10083;AL # LINEAR B IDEOGRAM B105 EQUID
+10084;AL # LINEAR B IDEOGRAM B105F MARE
+10085;AL # LINEAR B IDEOGRAM B105M STALLION
+10086;AL # LINEAR B IDEOGRAM B106F EWE
+10087;AL # LINEAR B IDEOGRAM B106M RAM
+10088;AL # LINEAR B IDEOGRAM B107F SHE-GOAT
+10089;AL # LINEAR B IDEOGRAM B107M HE-GOAT
+1008A;AL # LINEAR B IDEOGRAM B108F SOW
+1008B;AL # LINEAR B IDEOGRAM B108M BOAR
+1008C;AL # LINEAR B IDEOGRAM B109F COW
+1008D;AL # LINEAR B IDEOGRAM B109M BULL
+1008E;AL # LINEAR B IDEOGRAM B120 WHEAT
+1008F;AL # LINEAR B IDEOGRAM B121 BARLEY
+10090;AL # LINEAR B IDEOGRAM B122 OLIVE
+10091;AL # LINEAR B IDEOGRAM B123 SPICE
+10092;AL # LINEAR B IDEOGRAM B125 CYPERUS
+10093;AL # LINEAR B MONOGRAM B127 KAPO
+10094;AL # LINEAR B MONOGRAM B128 KANAKO
+10095;AL # LINEAR B IDEOGRAM B130 OIL
+10096;AL # LINEAR B IDEOGRAM B131 WINE
+10097;AL # LINEAR B IDEOGRAM B132
+10098;AL # LINEAR B MONOGRAM B133 AREPA
+10099;AL # LINEAR B MONOGRAM B135 MERI
+1009A;AL # LINEAR B IDEOGRAM B140 BRONZE
+1009B;AL # LINEAR B IDEOGRAM B141 GOLD
+1009C;AL # LINEAR B IDEOGRAM B142
+1009D;AL # LINEAR B IDEOGRAM B145 WOOL
+1009E;AL # LINEAR B IDEOGRAM B146
+1009F;AL # LINEAR B IDEOGRAM B150
+100A0;AL # LINEAR B IDEOGRAM B151 HORN
+100A1;AL # LINEAR B IDEOGRAM B152
+100A2;AL # LINEAR B IDEOGRAM B153
+100A3;AL # LINEAR B IDEOGRAM B154
+100A4;AL # LINEAR B MONOGRAM B156 TURO2
+100A5;AL # LINEAR B IDEOGRAM B157
+100A6;AL # LINEAR B IDEOGRAM B158
+100A7;AL # LINEAR B IDEOGRAM B159 CLOTH
+100A8;AL # LINEAR B IDEOGRAM B160
+100A9;AL # LINEAR B IDEOGRAM B161
+100AA;AL # LINEAR B IDEOGRAM B162 GARMENT
+100AB;AL # LINEAR B IDEOGRAM B163 ARMOUR
+100AC;AL # LINEAR B IDEOGRAM B164
+100AD;AL # LINEAR B IDEOGRAM B165
+100AE;AL # LINEAR B IDEOGRAM B166
+100AF;AL # LINEAR B IDEOGRAM B167
+100B0;AL # LINEAR B IDEOGRAM B168
+100B1;AL # LINEAR B IDEOGRAM B169
+100B2;AL # LINEAR B IDEOGRAM B170
+100B3;AL # LINEAR B IDEOGRAM B171
+100B4;AL # LINEAR B IDEOGRAM B172
+100B5;AL # LINEAR B IDEOGRAM B173 MONTH
+100B6;AL # LINEAR B IDEOGRAM B174
+100B7;AL # LINEAR B IDEOGRAM B176 TREE
+100B8;AL # LINEAR B IDEOGRAM B177
+100B9;AL # LINEAR B IDEOGRAM B178
+100BA;AL # LINEAR B IDEOGRAM B179
+100BB;AL # LINEAR B IDEOGRAM B180
+100BC;AL # LINEAR B IDEOGRAM B181
+100BD;AL # LINEAR B IDEOGRAM B182
+100BE;AL # LINEAR B IDEOGRAM B183
+100BF;AL # LINEAR B IDEOGRAM B184
+100C0;AL # LINEAR B IDEOGRAM B185
+100C1;AL # LINEAR B IDEOGRAM B189
+100C2;AL # LINEAR B IDEOGRAM B190
+100C3;AL # LINEAR B IDEOGRAM B191 HELMET
+100C4;AL # LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5;AL # LINEAR B IDEOGRAM B225 BATHTUB
+100C6;AL # LINEAR B IDEOGRAM B230 SPEAR
+100C7;AL # LINEAR B IDEOGRAM B231 ARROW
+100C8;AL # LINEAR B IDEOGRAM B232
+100C9;AL # LINEAR B IDEOGRAM B233 SWORD
+100CA;AL # LINEAR B IDEOGRAM B234
+100CB;AL # LINEAR B IDEOGRAM B236
+100CC;AL # LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD;AL # LINEAR B IDEOGRAM B241 CHARIOT
+100CE;AL # LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF;AL # LINEAR B IDEOGRAM B243 WHEEL
+100D0;AL # LINEAR B IDEOGRAM B245
+100D1;AL # LINEAR B IDEOGRAM B246
+100D2;AL # LINEAR B MONOGRAM B247 DIPTE
+100D3;AL # LINEAR B IDEOGRAM B248
+100D4;AL # LINEAR B IDEOGRAM B249
+100D5;AL # LINEAR B IDEOGRAM B251
+100D6;AL # LINEAR B IDEOGRAM B252
+100D7;AL # LINEAR B IDEOGRAM B253
+100D8;AL # LINEAR B IDEOGRAM B254 DART
+100D9;AL # LINEAR B IDEOGRAM B255
+100DA;AL # LINEAR B IDEOGRAM B256
+100DB;AL # LINEAR B IDEOGRAM B257
+100DC;AL # LINEAR B IDEOGRAM B258
+100DD;AL # LINEAR B IDEOGRAM B259
+100DE;AL # LINEAR B IDEOGRAM VESSEL B155
+100DF;AL # LINEAR B IDEOGRAM VESSEL B200
+100E0;AL # LINEAR B IDEOGRAM VESSEL B201
+100E1;AL # LINEAR B IDEOGRAM VESSEL B202
+100E2;AL # LINEAR B IDEOGRAM VESSEL B203
+100E3;AL # LINEAR B IDEOGRAM VESSEL B204
+100E4;AL # LINEAR B IDEOGRAM VESSEL B205
+100E5;AL # LINEAR B IDEOGRAM VESSEL B206
+100E6;AL # LINEAR B IDEOGRAM VESSEL B207
+100E7;AL # LINEAR B IDEOGRAM VESSEL B208
+100E8;AL # LINEAR B IDEOGRAM VESSEL B209
+100E9;AL # LINEAR B IDEOGRAM VESSEL B210
+100EA;AL # LINEAR B IDEOGRAM VESSEL B211
+100EB;AL # LINEAR B IDEOGRAM VESSEL B212
+100EC;AL # LINEAR B IDEOGRAM VESSEL B213
+100ED;AL # LINEAR B IDEOGRAM VESSEL B214
+100EE;AL # LINEAR B IDEOGRAM VESSEL B215
+100EF;AL # LINEAR B IDEOGRAM VESSEL B216
+100F0;AL # LINEAR B IDEOGRAM VESSEL B217
+100F1;AL # LINEAR B IDEOGRAM VESSEL B218
+100F2;AL # LINEAR B IDEOGRAM VESSEL B219
+100F3;AL # LINEAR B IDEOGRAM VESSEL B221
+100F4;AL # LINEAR B IDEOGRAM VESSEL B222
+100F5;AL # LINEAR B IDEOGRAM VESSEL B226
+100F6;AL # LINEAR B IDEOGRAM VESSEL B227
+100F7;AL # LINEAR B IDEOGRAM VESSEL B228
+100F8;AL # LINEAR B IDEOGRAM VESSEL B229
+100F9;AL # LINEAR B IDEOGRAM VESSEL B250
+100FA;AL # LINEAR B IDEOGRAM VESSEL B305
+10100;BA # AEGEAN WORD SEPARATOR LINE
+10101;BA # AEGEAN WORD SEPARATOR DOT
+10102;BA # AEGEAN CHECK MARK
+10107;AL # AEGEAN NUMBER ONE
+10108;AL # AEGEAN NUMBER TWO
+10109;AL # AEGEAN NUMBER THREE
+1010A;AL # AEGEAN NUMBER FOUR
+1010B;AL # AEGEAN NUMBER FIVE
+1010C;AL # AEGEAN NUMBER SIX
+1010D;AL # AEGEAN NUMBER SEVEN
+1010E;AL # AEGEAN NUMBER EIGHT
+1010F;AL # AEGEAN NUMBER NINE
+10110;AL # AEGEAN NUMBER TEN
+10111;AL # AEGEAN NUMBER TWENTY
+10112;AL # AEGEAN NUMBER THIRTY
+10113;AL # AEGEAN NUMBER FORTY
+10114;AL # AEGEAN NUMBER FIFTY
+10115;AL # AEGEAN NUMBER SIXTY
+10116;AL # AEGEAN NUMBER SEVENTY
+10117;AL # AEGEAN NUMBER EIGHTY
+10118;AL # AEGEAN NUMBER NINETY
+10119;AL # AEGEAN NUMBER ONE HUNDRED
+1011A;AL # AEGEAN NUMBER TWO HUNDRED
+1011B;AL # AEGEAN NUMBER THREE HUNDRED
+1011C;AL # AEGEAN NUMBER FOUR HUNDRED
+1011D;AL # AEGEAN NUMBER FIVE HUNDRED
+1011E;AL # AEGEAN NUMBER SIX HUNDRED
+1011F;AL # AEGEAN NUMBER SEVEN HUNDRED
+10120;AL # AEGEAN NUMBER EIGHT HUNDRED
+10121;AL # AEGEAN NUMBER NINE HUNDRED
+10122;AL # AEGEAN NUMBER ONE THOUSAND
+10123;AL # AEGEAN NUMBER TWO THOUSAND
+10124;AL # AEGEAN NUMBER THREE THOUSAND
+10125;AL # AEGEAN NUMBER FOUR THOUSAND
+10126;AL # AEGEAN NUMBER FIVE THOUSAND
+10127;AL # AEGEAN NUMBER SIX THOUSAND
+10128;AL # AEGEAN NUMBER SEVEN THOUSAND
+10129;AL # AEGEAN NUMBER EIGHT THOUSAND
+1012A;AL # AEGEAN NUMBER NINE THOUSAND
+1012B;AL # AEGEAN NUMBER TEN THOUSAND
+1012C;AL # AEGEAN NUMBER TWENTY THOUSAND
+1012D;AL # AEGEAN NUMBER THIRTY THOUSAND
+1012E;AL # AEGEAN NUMBER FORTY THOUSAND
+1012F;AL # AEGEAN NUMBER FIFTY THOUSAND
+10130;AL # AEGEAN NUMBER SIXTY THOUSAND
+10131;AL # AEGEAN NUMBER SEVENTY THOUSAND
+10132;AL # AEGEAN NUMBER EIGHTY THOUSAND
+10133;AL # AEGEAN NUMBER NINETY THOUSAND
+10137;AL # AEGEAN WEIGHT BASE UNIT
+10138;AL # AEGEAN WEIGHT FIRST SUBUNIT
+10139;AL # AEGEAN WEIGHT SECOND SUBUNIT
+1013A;AL # AEGEAN WEIGHT THIRD SUBUNIT
+1013B;AL # AEGEAN WEIGHT FOURTH SUBUNIT
+1013C;AL # AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D;AL # AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E;AL # AEGEAN MEASURE SECOND SUBUNIT
+1013F;AL # AEGEAN MEASURE THIRD SUBUNIT
+10140;AL # GREEK ACROPHONIC ATTIC ONE QUARTER
+10141;AL # GREEK ACROPHONIC ATTIC ONE HALF
+10142;AL # GREEK ACROPHONIC ATTIC ONE DRACHMA
+10143;AL # GREEK ACROPHONIC ATTIC FIVE
+10144;AL # GREEK ACROPHONIC ATTIC FIFTY
+10145;AL # GREEK ACROPHONIC ATTIC FIVE HUNDRED
+10146;AL # GREEK ACROPHONIC ATTIC FIVE THOUSAND
+10147;AL # GREEK ACROPHONIC ATTIC FIFTY THOUSAND
+10148;AL # GREEK ACROPHONIC ATTIC FIVE TALENTS
+10149;AL # GREEK ACROPHONIC ATTIC TEN TALENTS
+1014A;AL # GREEK ACROPHONIC ATTIC FIFTY TALENTS
+1014B;AL # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS
+1014C;AL # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS
+1014D;AL # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS
+1014E;AL # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS
+1014F;AL # GREEK ACROPHONIC ATTIC FIVE STATERS
+10150;AL # GREEK ACROPHONIC ATTIC TEN STATERS
+10151;AL # GREEK ACROPHONIC ATTIC FIFTY STATERS
+10152;AL # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS
+10153;AL # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS
+10154;AL # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS
+10155;AL # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS
+10156;AL # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS
+10157;AL # GREEK ACROPHONIC ATTIC TEN MNAS
+10158;AL # GREEK ACROPHONIC HERAEUM ONE PLETHRON
+10159;AL # GREEK ACROPHONIC THESPIAN ONE
+1015A;AL # GREEK ACROPHONIC HERMIONIAN ONE
+1015B;AL # GREEK ACROPHONIC EPIDAUREAN TWO
+1015C;AL # GREEK ACROPHONIC THESPIAN TWO
+1015D;AL # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS
+1015E;AL # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS
+1015F;AL # GREEK ACROPHONIC TROEZENIAN FIVE
+10160;AL # GREEK ACROPHONIC TROEZENIAN TEN
+10161;AL # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM
+10162;AL # GREEK ACROPHONIC HERMIONIAN TEN
+10163;AL # GREEK ACROPHONIC MESSENIAN TEN
+10164;AL # GREEK ACROPHONIC THESPIAN TEN
+10165;AL # GREEK ACROPHONIC THESPIAN THIRTY
+10166;AL # GREEK ACROPHONIC TROEZENIAN FIFTY
+10167;AL # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
+10168;AL # GREEK ACROPHONIC HERMIONIAN FIFTY
+10169;AL # GREEK ACROPHONIC THESPIAN FIFTY
+1016A;AL # GREEK ACROPHONIC THESPIAN ONE HUNDRED
+1016B;AL # GREEK ACROPHONIC THESPIAN THREE HUNDRED
+1016C;AL # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED
+1016D;AL # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED
+1016E;AL # GREEK ACROPHONIC THESPIAN FIVE HUNDRED
+1016F;AL # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED
+10170;AL # GREEK ACROPHONIC NAXIAN FIVE HUNDRED
+10171;AL # GREEK ACROPHONIC THESPIAN ONE THOUSAND
+10172;AL # GREEK ACROPHONIC THESPIAN FIVE THOUSAND
+10173;AL # GREEK ACROPHONIC DELPHIC FIVE MNAS
+10174;AL # GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175;AL # GREEK ONE HALF SIGN
+10176;AL # GREEK ONE HALF SIGN ALTERNATE FORM
+10177;AL # GREEK TWO THIRDS SIGN
+10178;AL # GREEK THREE QUARTERS SIGN
+10179;AL # GREEK YEAR SIGN
+1017A;AL # GREEK TALENT SIGN
+1017B;AL # GREEK DRACHMA SIGN
+1017C;AL # GREEK OBOL SIGN
+1017D;AL # GREEK TWO OBOLS SIGN
+1017E;AL # GREEK THREE OBOLS SIGN
+1017F;AL # GREEK FOUR OBOLS SIGN
+10180;AL # GREEK FIVE OBOLS SIGN
+10181;AL # GREEK METRETES SIGN
+10182;AL # GREEK KYATHOS BASE SIGN
+10183;AL # GREEK LITRA SIGN
+10184;AL # GREEK OUNKIA SIGN
+10185;AL # GREEK XESTES SIGN
+10186;AL # GREEK ARTABE SIGN
+10187;AL # GREEK AROURA SIGN
+10188;AL # GREEK GRAMMA SIGN
+10189;AL # GREEK TRYBLION BASE SIGN
+1018A;AL # GREEK ZERO SIGN
+10190;AL # ROMAN SEXTANS SIGN
+10191;AL # ROMAN UNCIA SIGN
+10192;AL # ROMAN SEMUNCIA SIGN
+10193;AL # ROMAN SEXTULA SIGN
+10194;AL # ROMAN DIMIDIA SEXTULA SIGN
+10195;AL # ROMAN SILIQUA SIGN
+10196;AL # ROMAN DENARIUS SIGN
+10197;AL # ROMAN QUINARIUS SIGN
+10198;AL # ROMAN SESTERTIUS SIGN
+10199;AL # ROMAN DUPONDIUS SIGN
+1019A;AL # ROMAN AS SIGN
+1019B;AL # ROMAN CENTURIAL SIGN
+101D0;AL # PHAISTOS DISC SIGN PEDESTRIAN
+101D1;AL # PHAISTOS DISC SIGN PLUMED HEAD
+101D2;AL # PHAISTOS DISC SIGN TATTOOED HEAD
+101D3;AL # PHAISTOS DISC SIGN CAPTIVE
+101D4;AL # PHAISTOS DISC SIGN CHILD
+101D5;AL # PHAISTOS DISC SIGN WOMAN
+101D6;AL # PHAISTOS DISC SIGN HELMET
+101D7;AL # PHAISTOS DISC SIGN GAUNTLET
+101D8;AL # PHAISTOS DISC SIGN TIARA
+101D9;AL # PHAISTOS DISC SIGN ARROW
+101DA;AL # PHAISTOS DISC SIGN BOW
+101DB;AL # PHAISTOS DISC SIGN SHIELD
+101DC;AL # PHAISTOS DISC SIGN CLUB
+101DD;AL # PHAISTOS DISC SIGN MANACLES
+101DE;AL # PHAISTOS DISC SIGN MATTOCK
+101DF;AL # PHAISTOS DISC SIGN SAW
+101E0;AL # PHAISTOS DISC SIGN LID
+101E1;AL # PHAISTOS DISC SIGN BOOMERANG
+101E2;AL # PHAISTOS DISC SIGN CARPENTRY PLANE
+101E3;AL # PHAISTOS DISC SIGN DOLIUM
+101E4;AL # PHAISTOS DISC SIGN COMB
+101E5;AL # PHAISTOS DISC SIGN SLING
+101E6;AL # PHAISTOS DISC SIGN COLUMN
+101E7;AL # PHAISTOS DISC SIGN BEEHIVE
+101E8;AL # PHAISTOS DISC SIGN SHIP
+101E9;AL # PHAISTOS DISC SIGN HORN
+101EA;AL # PHAISTOS DISC SIGN HIDE
+101EB;AL # PHAISTOS DISC SIGN BULLS LEG
+101EC;AL # PHAISTOS DISC SIGN CAT
+101ED;AL # PHAISTOS DISC SIGN RAM
+101EE;AL # PHAISTOS DISC SIGN EAGLE
+101EF;AL # PHAISTOS DISC SIGN DOVE
+101F0;AL # PHAISTOS DISC SIGN TUNNY
+101F1;AL # PHAISTOS DISC SIGN BEE
+101F2;AL # PHAISTOS DISC SIGN PLANE TREE
+101F3;AL # PHAISTOS DISC SIGN VINE
+101F4;AL # PHAISTOS DISC SIGN PAPYRUS
+101F5;AL # PHAISTOS DISC SIGN ROSETTE
+101F6;AL # PHAISTOS DISC SIGN LILY
+101F7;AL # PHAISTOS DISC SIGN OX BACK
+101F8;AL # PHAISTOS DISC SIGN FLUTE
+101F9;AL # PHAISTOS DISC SIGN GRATER
+101FA;AL # PHAISTOS DISC SIGN STRAINER
+101FB;AL # PHAISTOS DISC SIGN SMALL AXE
+101FC;AL # PHAISTOS DISC SIGN WAVY BAND
+101FD;CM # PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+10280;AL # LYCIAN LETTER A
+10281;AL # LYCIAN LETTER E
+10282;AL # LYCIAN LETTER B
+10283;AL # LYCIAN LETTER BH
+10284;AL # LYCIAN LETTER G
+10285;AL # LYCIAN LETTER D
+10286;AL # LYCIAN LETTER I
+10287;AL # LYCIAN LETTER W
+10288;AL # LYCIAN LETTER Z
+10289;AL # LYCIAN LETTER TH
+1028A;AL # LYCIAN LETTER J
+1028B;AL # LYCIAN LETTER K
+1028C;AL # LYCIAN LETTER Q
+1028D;AL # LYCIAN LETTER L
+1028E;AL # LYCIAN LETTER M
+1028F;AL # LYCIAN LETTER N
+10290;AL # LYCIAN LETTER MM
+10291;AL # LYCIAN LETTER NN
+10292;AL # LYCIAN LETTER U
+10293;AL # LYCIAN LETTER P
+10294;AL # LYCIAN LETTER KK
+10295;AL # LYCIAN LETTER R
+10296;AL # LYCIAN LETTER S
+10297;AL # LYCIAN LETTER T
+10298;AL # LYCIAN LETTER TT
+10299;AL # LYCIAN LETTER AN
+1029A;AL # LYCIAN LETTER EN
+1029B;AL # LYCIAN LETTER H
+1029C;AL # LYCIAN LETTER X
+102A0;AL # CARIAN LETTER A
+102A1;AL # CARIAN LETTER P2
+102A2;AL # CARIAN LETTER D
+102A3;AL # CARIAN LETTER L
+102A4;AL # CARIAN LETTER UUU
+102A5;AL # CARIAN LETTER R
+102A6;AL # CARIAN LETTER LD
+102A7;AL # CARIAN LETTER A2
+102A8;AL # CARIAN LETTER Q
+102A9;AL # CARIAN LETTER B
+102AA;AL # CARIAN LETTER M
+102AB;AL # CARIAN LETTER O
+102AC;AL # CARIAN LETTER D2
+102AD;AL # CARIAN LETTER T
+102AE;AL # CARIAN LETTER SH
+102AF;AL # CARIAN LETTER SH2
+102B0;AL # CARIAN LETTER S
+102B1;AL # CARIAN LETTER C-18
+102B2;AL # CARIAN LETTER U
+102B3;AL # CARIAN LETTER NN
+102B4;AL # CARIAN LETTER X
+102B5;AL # CARIAN LETTER N
+102B6;AL # CARIAN LETTER TT2
+102B7;AL # CARIAN LETTER P
+102B8;AL # CARIAN LETTER SS
+102B9;AL # CARIAN LETTER I
+102BA;AL # CARIAN LETTER E
+102BB;AL # CARIAN LETTER UUUU
+102BC;AL # CARIAN LETTER K
+102BD;AL # CARIAN LETTER K2
+102BE;AL # CARIAN LETTER ND
+102BF;AL # CARIAN LETTER UU
+102C0;AL # CARIAN LETTER G
+102C1;AL # CARIAN LETTER G2
+102C2;AL # CARIAN LETTER ST
+102C3;AL # CARIAN LETTER ST2
+102C4;AL # CARIAN LETTER NG
+102C5;AL # CARIAN LETTER II
+102C6;AL # CARIAN LETTER C-39
+102C7;AL # CARIAN LETTER TT
+102C8;AL # CARIAN LETTER UUU2
+102C9;AL # CARIAN LETTER RR
+102CA;AL # CARIAN LETTER MB
+102CB;AL # CARIAN LETTER MB2
+102CC;AL # CARIAN LETTER MB3
+102CD;AL # CARIAN LETTER MB4
+102CE;AL # CARIAN LETTER LD2
+102CF;AL # CARIAN LETTER E2
+102D0;AL # CARIAN LETTER UUU3
+10300;AL # OLD ITALIC LETTER A
+10301;AL # OLD ITALIC LETTER BE
+10302;AL # OLD ITALIC LETTER KE
+10303;AL # OLD ITALIC LETTER DE
+10304;AL # OLD ITALIC LETTER E
+10305;AL # OLD ITALIC LETTER VE
+10306;AL # OLD ITALIC LETTER ZE
+10307;AL # OLD ITALIC LETTER HE
+10308;AL # OLD ITALIC LETTER THE
+10309;AL # OLD ITALIC LETTER I
+1030A;AL # OLD ITALIC LETTER KA
+1030B;AL # OLD ITALIC LETTER EL
+1030C;AL # OLD ITALIC LETTER EM
+1030D;AL # OLD ITALIC LETTER EN
+1030E;AL # OLD ITALIC LETTER ESH
+1030F;AL # OLD ITALIC LETTER O
+10310;AL # OLD ITALIC LETTER PE
+10311;AL # OLD ITALIC LETTER SHE
+10312;AL # OLD ITALIC LETTER KU
+10313;AL # OLD ITALIC LETTER ER
+10314;AL # OLD ITALIC LETTER ES
+10315;AL # OLD ITALIC LETTER TE
+10316;AL # OLD ITALIC LETTER U
+10317;AL # OLD ITALIC LETTER EKS
+10318;AL # OLD ITALIC LETTER PHE
+10319;AL # OLD ITALIC LETTER KHE
+1031A;AL # OLD ITALIC LETTER EF
+1031B;AL # OLD ITALIC LETTER ERS
+1031C;AL # OLD ITALIC LETTER CHE
+1031D;AL # OLD ITALIC LETTER II
+1031E;AL # OLD ITALIC LETTER UU
+10320;AL # OLD ITALIC NUMERAL ONE
+10321;AL # OLD ITALIC NUMERAL FIVE
+10322;AL # OLD ITALIC NUMERAL TEN
+10323;AL # OLD ITALIC NUMERAL FIFTY
+10330;AL # GOTHIC LETTER AHSA
+10331;AL # GOTHIC LETTER BAIRKAN
+10332;AL # GOTHIC LETTER GIBA
+10333;AL # GOTHIC LETTER DAGS
+10334;AL # GOTHIC LETTER AIHVUS
+10335;AL # GOTHIC LETTER QAIRTHRA
+10336;AL # GOTHIC LETTER IUJA
+10337;AL # GOTHIC LETTER HAGL
+10338;AL # GOTHIC LETTER THIUTH
+10339;AL # GOTHIC LETTER EIS
+1033A;AL # GOTHIC LETTER KUSMA
+1033B;AL # GOTHIC LETTER LAGUS
+1033C;AL # GOTHIC LETTER MANNA
+1033D;AL # GOTHIC LETTER NAUTHS
+1033E;AL # GOTHIC LETTER JER
+1033F;AL # GOTHIC LETTER URUS
+10340;AL # GOTHIC LETTER PAIRTHRA
+10341;AL # GOTHIC LETTER NINETY
+10342;AL # GOTHIC LETTER RAIDA
+10343;AL # GOTHIC LETTER SAUIL
+10344;AL # GOTHIC LETTER TEIWS
+10345;AL # GOTHIC LETTER WINJA
+10346;AL # GOTHIC LETTER FAIHU
+10347;AL # GOTHIC LETTER IGGWS
+10348;AL # GOTHIC LETTER HWAIR
+10349;AL # GOTHIC LETTER OTHAL
+1034A;AL # GOTHIC LETTER NINE HUNDRED
+10380;AL # UGARITIC LETTER ALPA
+10381;AL # UGARITIC LETTER BETA
+10382;AL # UGARITIC LETTER GAMLA
+10383;AL # UGARITIC LETTER KHA
+10384;AL # UGARITIC LETTER DELTA
+10385;AL # UGARITIC LETTER HO
+10386;AL # UGARITIC LETTER WO
+10387;AL # UGARITIC LETTER ZETA
+10388;AL # UGARITIC LETTER HOTA
+10389;AL # UGARITIC LETTER TET
+1038A;AL # UGARITIC LETTER YOD
+1038B;AL # UGARITIC LETTER KAF
+1038C;AL # UGARITIC LETTER SHIN
+1038D;AL # UGARITIC LETTER LAMDA
+1038E;AL # UGARITIC LETTER MEM
+1038F;AL # UGARITIC LETTER DHAL
+10390;AL # UGARITIC LETTER NUN
+10391;AL # UGARITIC LETTER ZU
+10392;AL # UGARITIC LETTER SAMKA
+10393;AL # UGARITIC LETTER AIN
+10394;AL # UGARITIC LETTER PU
+10395;AL # UGARITIC LETTER SADE
+10396;AL # UGARITIC LETTER QOPA
+10397;AL # UGARITIC LETTER RASHA
+10398;AL # UGARITIC LETTER THANNA
+10399;AL # UGARITIC LETTER GHAIN
+1039A;AL # UGARITIC LETTER TO
+1039B;AL # UGARITIC LETTER I
+1039C;AL # UGARITIC LETTER U
+1039D;AL # UGARITIC LETTER SSU
+1039F;BA # UGARITIC WORD DIVIDER
+103A0;AL # OLD PERSIAN SIGN A
+103A1;AL # OLD PERSIAN SIGN I
+103A2;AL # OLD PERSIAN SIGN U
+103A3;AL # OLD PERSIAN SIGN KA
+103A4;AL # OLD PERSIAN SIGN KU
+103A5;AL # OLD PERSIAN SIGN GA
+103A6;AL # OLD PERSIAN SIGN GU
+103A7;AL # OLD PERSIAN SIGN XA
+103A8;AL # OLD PERSIAN SIGN CA
+103A9;AL # OLD PERSIAN SIGN JA
+103AA;AL # OLD PERSIAN SIGN JI
+103AB;AL # OLD PERSIAN SIGN TA
+103AC;AL # OLD PERSIAN SIGN TU
+103AD;AL # OLD PERSIAN SIGN DA
+103AE;AL # OLD PERSIAN SIGN DI
+103AF;AL # OLD PERSIAN SIGN DU
+103B0;AL # OLD PERSIAN SIGN THA
+103B1;AL # OLD PERSIAN SIGN PA
+103B2;AL # OLD PERSIAN SIGN BA
+103B3;AL # OLD PERSIAN SIGN FA
+103B4;AL # OLD PERSIAN SIGN NA
+103B5;AL # OLD PERSIAN SIGN NU
+103B6;AL # OLD PERSIAN SIGN MA
+103B7;AL # OLD PERSIAN SIGN MI
+103B8;AL # OLD PERSIAN SIGN MU
+103B9;AL # OLD PERSIAN SIGN YA
+103BA;AL # OLD PERSIAN SIGN VA
+103BB;AL # OLD PERSIAN SIGN VI
+103BC;AL # OLD PERSIAN SIGN RA
+103BD;AL # OLD PERSIAN SIGN RU
+103BE;AL # OLD PERSIAN SIGN LA
+103BF;AL # OLD PERSIAN SIGN SA
+103C0;AL # OLD PERSIAN SIGN ZA
+103C1;AL # OLD PERSIAN SIGN SHA
+103C2;AL # OLD PERSIAN SIGN SSA
+103C3;AL # OLD PERSIAN SIGN HA
+103C8;AL # OLD PERSIAN SIGN AURAMAZDAA
+103C9;AL # OLD PERSIAN SIGN AURAMAZDAA-2
+103CA;AL # OLD PERSIAN SIGN AURAMAZDAAHA
+103CB;AL # OLD PERSIAN SIGN XSHAAYATHIYA
+103CC;AL # OLD PERSIAN SIGN DAHYAAUSH
+103CD;AL # OLD PERSIAN SIGN DAHYAAUSH-2
+103CE;AL # OLD PERSIAN SIGN BAGA
+103CF;AL # OLD PERSIAN SIGN BUUMISH
+103D0;BA # OLD PERSIAN WORD DIVIDER
+103D1;AL # OLD PERSIAN NUMBER ONE
+103D2;AL # OLD PERSIAN NUMBER TWO
+103D3;AL # OLD PERSIAN NUMBER TEN
+103D4;AL # OLD PERSIAN NUMBER TWENTY
+103D5;AL # OLD PERSIAN NUMBER HUNDRED
+10400;AL # DESERET CAPITAL LETTER LONG I
+10401;AL # DESERET CAPITAL LETTER LONG E
+10402;AL # DESERET CAPITAL LETTER LONG A
+10403;AL # DESERET CAPITAL LETTER LONG AH
+10404;AL # DESERET CAPITAL LETTER LONG O
+10405;AL # DESERET CAPITAL LETTER LONG OO
+10406;AL # DESERET CAPITAL LETTER SHORT I
+10407;AL # DESERET CAPITAL LETTER SHORT E
+10408;AL # DESERET CAPITAL LETTER SHORT A
+10409;AL # DESERET CAPITAL LETTER SHORT AH
+1040A;AL # DESERET CAPITAL LETTER SHORT O
+1040B;AL # DESERET CAPITAL LETTER SHORT OO
+1040C;AL # DESERET CAPITAL LETTER AY
+1040D;AL # DESERET CAPITAL LETTER OW
+1040E;AL # DESERET CAPITAL LETTER WU
+1040F;AL # DESERET CAPITAL LETTER YEE
+10410;AL # DESERET CAPITAL LETTER H
+10411;AL # DESERET CAPITAL LETTER PEE
+10412;AL # DESERET CAPITAL LETTER BEE
+10413;AL # DESERET CAPITAL LETTER TEE
+10414;AL # DESERET CAPITAL LETTER DEE
+10415;AL # DESERET CAPITAL LETTER CHEE
+10416;AL # DESERET CAPITAL LETTER JEE
+10417;AL # DESERET CAPITAL LETTER KAY
+10418;AL # DESERET CAPITAL LETTER GAY
+10419;AL # DESERET CAPITAL LETTER EF
+1041A;AL # DESERET CAPITAL LETTER VEE
+1041B;AL # DESERET CAPITAL LETTER ETH
+1041C;AL # DESERET CAPITAL LETTER THEE
+1041D;AL # DESERET CAPITAL LETTER ES
+1041E;AL # DESERET CAPITAL LETTER ZEE
+1041F;AL # DESERET CAPITAL LETTER ESH
+10420;AL # DESERET CAPITAL LETTER ZHEE
+10421;AL # DESERET CAPITAL LETTER ER
+10422;AL # DESERET CAPITAL LETTER EL
+10423;AL # DESERET CAPITAL LETTER EM
+10424;AL # DESERET CAPITAL LETTER EN
+10425;AL # DESERET CAPITAL LETTER ENG
+10426;AL # DESERET CAPITAL LETTER OI
+10427;AL # DESERET CAPITAL LETTER EW
+10428;AL # DESERET SMALL LETTER LONG I
+10429;AL # DESERET SMALL LETTER LONG E
+1042A;AL # DESERET SMALL LETTER LONG A
+1042B;AL # DESERET SMALL LETTER LONG AH
+1042C;AL # DESERET SMALL LETTER LONG O
+1042D;AL # DESERET SMALL LETTER LONG OO
+1042E;AL # DESERET SMALL LETTER SHORT I
+1042F;AL # DESERET SMALL LETTER SHORT E
+10430;AL # DESERET SMALL LETTER SHORT A
+10431;AL # DESERET SMALL LETTER SHORT AH
+10432;AL # DESERET SMALL LETTER SHORT O
+10433;AL # DESERET SMALL LETTER SHORT OO
+10434;AL # DESERET SMALL LETTER AY
+10435;AL # DESERET SMALL LETTER OW
+10436;AL # DESERET SMALL LETTER WU
+10437;AL # DESERET SMALL LETTER YEE
+10438;AL # DESERET SMALL LETTER H
+10439;AL # DESERET SMALL LETTER PEE
+1043A;AL # DESERET SMALL LETTER BEE
+1043B;AL # DESERET SMALL LETTER TEE
+1043C;AL # DESERET SMALL LETTER DEE
+1043D;AL # DESERET SMALL LETTER CHEE
+1043E;AL # DESERET SMALL LETTER JEE
+1043F;AL # DESERET SMALL LETTER KAY
+10440;AL # DESERET SMALL LETTER GAY
+10441;AL # DESERET SMALL LETTER EF
+10442;AL # DESERET SMALL LETTER VEE
+10443;AL # DESERET SMALL LETTER ETH
+10444;AL # DESERET SMALL LETTER THEE
+10445;AL # DESERET SMALL LETTER ES
+10446;AL # DESERET SMALL LETTER ZEE
+10447;AL # DESERET SMALL LETTER ESH
+10448;AL # DESERET SMALL LETTER ZHEE
+10449;AL # DESERET SMALL LETTER ER
+1044A;AL # DESERET SMALL LETTER EL
+1044B;AL # DESERET SMALL LETTER EM
+1044C;AL # DESERET SMALL LETTER EN
+1044D;AL # DESERET SMALL LETTER ENG
+1044E;AL # DESERET SMALL LETTER OI
+1044F;AL # DESERET SMALL LETTER EW
+10450;AL # SHAVIAN LETTER PEEP
+10451;AL # SHAVIAN LETTER TOT
+10452;AL # SHAVIAN LETTER KICK
+10453;AL # SHAVIAN LETTER FEE
+10454;AL # SHAVIAN LETTER THIGH
+10455;AL # SHAVIAN LETTER SO
+10456;AL # SHAVIAN LETTER SURE
+10457;AL # SHAVIAN LETTER CHURCH
+10458;AL # SHAVIAN LETTER YEA
+10459;AL # SHAVIAN LETTER HUNG
+1045A;AL # SHAVIAN LETTER BIB
+1045B;AL # SHAVIAN LETTER DEAD
+1045C;AL # SHAVIAN LETTER GAG
+1045D;AL # SHAVIAN LETTER VOW
+1045E;AL # SHAVIAN LETTER THEY
+1045F;AL # SHAVIAN LETTER ZOO
+10460;AL # SHAVIAN LETTER MEASURE
+10461;AL # SHAVIAN LETTER JUDGE
+10462;AL # SHAVIAN LETTER WOE
+10463;AL # SHAVIAN LETTER HA-HA
+10464;AL # SHAVIAN LETTER LOLL
+10465;AL # SHAVIAN LETTER MIME
+10466;AL # SHAVIAN LETTER IF
+10467;AL # SHAVIAN LETTER EGG
+10468;AL # SHAVIAN LETTER ASH
+10469;AL # SHAVIAN LETTER ADO
+1046A;AL # SHAVIAN LETTER ON
+1046B;AL # SHAVIAN LETTER WOOL
+1046C;AL # SHAVIAN LETTER OUT
+1046D;AL # SHAVIAN LETTER AH
+1046E;AL # SHAVIAN LETTER ROAR
+1046F;AL # SHAVIAN LETTER NUN
+10470;AL # SHAVIAN LETTER EAT
+10471;AL # SHAVIAN LETTER AGE
+10472;AL # SHAVIAN LETTER ICE
+10473;AL # SHAVIAN LETTER UP
+10474;AL # SHAVIAN LETTER OAK
+10475;AL # SHAVIAN LETTER OOZE
+10476;AL # SHAVIAN LETTER OIL
+10477;AL # SHAVIAN LETTER AWE
+10478;AL # SHAVIAN LETTER ARE
+10479;AL # SHAVIAN LETTER OR
+1047A;AL # SHAVIAN LETTER AIR
+1047B;AL # SHAVIAN LETTER ERR
+1047C;AL # SHAVIAN LETTER ARRAY
+1047D;AL # SHAVIAN LETTER EAR
+1047E;AL # SHAVIAN LETTER IAN
+1047F;AL # SHAVIAN LETTER YEW
+10480;AL # OSMANYA LETTER ALEF
+10481;AL # OSMANYA LETTER BA
+10482;AL # OSMANYA LETTER TA
+10483;AL # OSMANYA LETTER JA
+10484;AL # OSMANYA LETTER XA
+10485;AL # OSMANYA LETTER KHA
+10486;AL # OSMANYA LETTER DEEL
+10487;AL # OSMANYA LETTER RA
+10488;AL # OSMANYA LETTER SA
+10489;AL # OSMANYA LETTER SHIIN
+1048A;AL # OSMANYA LETTER DHA
+1048B;AL # OSMANYA LETTER CAYN
+1048C;AL # OSMANYA LETTER GA
+1048D;AL # OSMANYA LETTER FA
+1048E;AL # OSMANYA LETTER QAAF
+1048F;AL # OSMANYA LETTER KAAF
+10490;AL # OSMANYA LETTER LAAN
+10491;AL # OSMANYA LETTER MIIN
+10492;AL # OSMANYA LETTER NUUN
+10493;AL # OSMANYA LETTER WAW
+10494;AL # OSMANYA LETTER HA
+10495;AL # OSMANYA LETTER YA
+10496;AL # OSMANYA LETTER A
+10497;AL # OSMANYA LETTER E
+10498;AL # OSMANYA LETTER I
+10499;AL # OSMANYA LETTER O
+1049A;AL # OSMANYA LETTER U
+1049B;AL # OSMANYA LETTER AA
+1049C;AL # OSMANYA LETTER EE
+1049D;AL # OSMANYA LETTER OO
+104A0;NU # OSMANYA DIGIT ZERO
+104A1;NU # OSMANYA DIGIT ONE
+104A2;NU # OSMANYA DIGIT TWO
+104A3;NU # OSMANYA DIGIT THREE
+104A4;NU # OSMANYA DIGIT FOUR
+104A5;NU # OSMANYA DIGIT FIVE
+104A6;NU # OSMANYA DIGIT SIX
+104A7;NU # OSMANYA DIGIT SEVEN
+104A8;NU # OSMANYA DIGIT EIGHT
+104A9;NU # OSMANYA DIGIT NINE
+10800;AL # CYPRIOT SYLLABLE A
+10801;AL # CYPRIOT SYLLABLE E
+10802;AL # CYPRIOT SYLLABLE I
+10803;AL # CYPRIOT SYLLABLE O
+10804;AL # CYPRIOT SYLLABLE U
+10805;AL # CYPRIOT SYLLABLE JA
+10808;AL # CYPRIOT SYLLABLE JO
+1080A;AL # CYPRIOT SYLLABLE KA
+1080B;AL # CYPRIOT SYLLABLE KE
+1080C;AL # CYPRIOT SYLLABLE KI
+1080D;AL # CYPRIOT SYLLABLE KO
+1080E;AL # CYPRIOT SYLLABLE KU
+1080F;AL # CYPRIOT SYLLABLE LA
+10810;AL # CYPRIOT SYLLABLE LE
+10811;AL # CYPRIOT SYLLABLE LI
+10812;AL # CYPRIOT SYLLABLE LO
+10813;AL # CYPRIOT SYLLABLE LU
+10814;AL # CYPRIOT SYLLABLE MA
+10815;AL # CYPRIOT SYLLABLE ME
+10816;AL # CYPRIOT SYLLABLE MI
+10817;AL # CYPRIOT SYLLABLE MO
+10818;AL # CYPRIOT SYLLABLE MU
+10819;AL # CYPRIOT SYLLABLE NA
+1081A;AL # CYPRIOT SYLLABLE NE
+1081B;AL # CYPRIOT SYLLABLE NI
+1081C;AL # CYPRIOT SYLLABLE NO
+1081D;AL # CYPRIOT SYLLABLE NU
+1081E;AL # CYPRIOT SYLLABLE PA
+1081F;AL # CYPRIOT SYLLABLE PE
+10820;AL # CYPRIOT SYLLABLE PI
+10821;AL # CYPRIOT SYLLABLE PO
+10822;AL # CYPRIOT SYLLABLE PU
+10823;AL # CYPRIOT SYLLABLE RA
+10824;AL # CYPRIOT SYLLABLE RE
+10825;AL # CYPRIOT SYLLABLE RI
+10826;AL # CYPRIOT SYLLABLE RO
+10827;AL # CYPRIOT SYLLABLE RU
+10828;AL # CYPRIOT SYLLABLE SA
+10829;AL # CYPRIOT SYLLABLE SE
+1082A;AL # CYPRIOT SYLLABLE SI
+1082B;AL # CYPRIOT SYLLABLE SO
+1082C;AL # CYPRIOT SYLLABLE SU
+1082D;AL # CYPRIOT SYLLABLE TA
+1082E;AL # CYPRIOT SYLLABLE TE
+1082F;AL # CYPRIOT SYLLABLE TI
+10830;AL # CYPRIOT SYLLABLE TO
+10831;AL # CYPRIOT SYLLABLE TU
+10832;AL # CYPRIOT SYLLABLE WA
+10833;AL # CYPRIOT SYLLABLE WE
+10834;AL # CYPRIOT SYLLABLE WI
+10835;AL # CYPRIOT SYLLABLE WO
+10837;AL # CYPRIOT SYLLABLE XA
+10838;AL # CYPRIOT SYLLABLE XE
+1083C;AL # CYPRIOT SYLLABLE ZA
+1083F;AL # CYPRIOT SYLLABLE ZO
+10900;AL # PHOENICIAN LETTER ALF
+10901;AL # PHOENICIAN LETTER BET
+10902;AL # PHOENICIAN LETTER GAML
+10903;AL # PHOENICIAN LETTER DELT
+10904;AL # PHOENICIAN LETTER HE
+10905;AL # PHOENICIAN LETTER WAU
+10906;AL # PHOENICIAN LETTER ZAI
+10907;AL # PHOENICIAN LETTER HET
+10908;AL # PHOENICIAN LETTER TET
+10909;AL # PHOENICIAN LETTER YOD
+1090A;AL # PHOENICIAN LETTER KAF
+1090B;AL # PHOENICIAN LETTER LAMD
+1090C;AL # PHOENICIAN LETTER MEM
+1090D;AL # PHOENICIAN LETTER NUN
+1090E;AL # PHOENICIAN LETTER SEMK
+1090F;AL # PHOENICIAN LETTER AIN
+10910;AL # PHOENICIAN LETTER PE
+10911;AL # PHOENICIAN LETTER SADE
+10912;AL # PHOENICIAN LETTER QOF
+10913;AL # PHOENICIAN LETTER ROSH
+10914;AL # PHOENICIAN LETTER SHIN
+10915;AL # PHOENICIAN LETTER TAU
+10916;AL # PHOENICIAN NUMBER ONE
+10917;AL # PHOENICIAN NUMBER TEN
+10918;AL # PHOENICIAN NUMBER TWENTY
+10919;AL # PHOENICIAN NUMBER ONE HUNDRED
+1091F;BA # PHOENICIAN WORD SEPARATOR
+10920;AL # LYDIAN LETTER A
+10921;AL # LYDIAN LETTER B
+10922;AL # LYDIAN LETTER G
+10923;AL # LYDIAN LETTER D
+10924;AL # LYDIAN LETTER E
+10925;AL # LYDIAN LETTER V
+10926;AL # LYDIAN LETTER I
+10927;AL # LYDIAN LETTER Y
+10928;AL # LYDIAN LETTER K
+10929;AL # LYDIAN LETTER L
+1092A;AL # LYDIAN LETTER M
+1092B;AL # LYDIAN LETTER N
+1092C;AL # LYDIAN LETTER O
+1092D;AL # LYDIAN LETTER R
+1092E;AL # LYDIAN LETTER SS
+1092F;AL # LYDIAN LETTER T
+10930;AL # LYDIAN LETTER U
+10931;AL # LYDIAN LETTER F
+10932;AL # LYDIAN LETTER Q
+10933;AL # LYDIAN LETTER S
+10934;AL # LYDIAN LETTER TT
+10935;AL # LYDIAN LETTER AN
+10936;AL # LYDIAN LETTER EN
+10937;AL # LYDIAN LETTER LY
+10938;AL # LYDIAN LETTER NN
+10939;AL # LYDIAN LETTER C
+1093F;AL # LYDIAN TRIANGULAR MARK
+10A00;AL # KHAROSHTHI LETTER A
+10A01;CM # KHAROSHTHI VOWEL SIGN I
+10A02;CM # KHAROSHTHI VOWEL SIGN U
+10A03;CM # KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05;CM # KHAROSHTHI VOWEL SIGN E
+10A06;CM # KHAROSHTHI VOWEL SIGN O
+10A0C;CM # KHAROSHTHI VOWEL LENGTH MARK
+10A0D;CM # KHAROSHTHI SIGN DOUBLE RING BELOW
+10A0E;CM # KHAROSHTHI SIGN ANUSVARA
+10A0F;CM # KHAROSHTHI SIGN VISARGA
+10A10;AL # KHAROSHTHI LETTER KA
+10A11;AL # KHAROSHTHI LETTER KHA
+10A12;AL # KHAROSHTHI LETTER GA
+10A13;AL # KHAROSHTHI LETTER GHA
+10A15;AL # KHAROSHTHI LETTER CA
+10A16;AL # KHAROSHTHI LETTER CHA
+10A17;AL # KHAROSHTHI LETTER JA
+10A19;AL # KHAROSHTHI LETTER NYA
+10A1A;AL # KHAROSHTHI LETTER TTA
+10A1B;AL # KHAROSHTHI LETTER TTHA
+10A1C;AL # KHAROSHTHI LETTER DDA
+10A1D;AL # KHAROSHTHI LETTER DDHA
+10A1E;AL # KHAROSHTHI LETTER NNA
+10A1F;AL # KHAROSHTHI LETTER TA
+10A20;AL # KHAROSHTHI LETTER THA
+10A21;AL # KHAROSHTHI LETTER DA
+10A22;AL # KHAROSHTHI LETTER DHA
+10A23;AL # KHAROSHTHI LETTER NA
+10A24;AL # KHAROSHTHI LETTER PA
+10A25;AL # KHAROSHTHI LETTER PHA
+10A26;AL # KHAROSHTHI LETTER BA
+10A27;AL # KHAROSHTHI LETTER BHA
+10A28;AL # KHAROSHTHI LETTER MA
+10A29;AL # KHAROSHTHI LETTER YA
+10A2A;AL # KHAROSHTHI LETTER RA
+10A2B;AL # KHAROSHTHI LETTER LA
+10A2C;AL # KHAROSHTHI LETTER VA
+10A2D;AL # KHAROSHTHI LETTER SHA
+10A2E;AL # KHAROSHTHI LETTER SSA
+10A2F;AL # KHAROSHTHI LETTER SA
+10A30;AL # KHAROSHTHI LETTER ZA
+10A31;AL # KHAROSHTHI LETTER HA
+10A32;AL # KHAROSHTHI LETTER KKA
+10A33;AL # KHAROSHTHI LETTER TTTHA
+10A38;CM # KHAROSHTHI SIGN BAR ABOVE
+10A39;CM # KHAROSHTHI SIGN CAUDA
+10A3A;CM # KHAROSHTHI SIGN DOT BELOW
+10A3F;CM # KHAROSHTHI VIRAMA
+10A40;AL # KHAROSHTHI DIGIT ONE
+10A41;AL # KHAROSHTHI DIGIT TWO
+10A42;AL # KHAROSHTHI DIGIT THREE
+10A43;AL # KHAROSHTHI DIGIT FOUR
+10A44;AL # KHAROSHTHI NUMBER TEN
+10A45;AL # KHAROSHTHI NUMBER TWENTY
+10A46;AL # KHAROSHTHI NUMBER ONE HUNDRED
+10A47;AL # KHAROSHTHI NUMBER ONE THOUSAND
+10A50;BA # KHAROSHTHI PUNCTUATION DOT
+10A51;BA # KHAROSHTHI PUNCTUATION SMALL CIRCLE
+10A52;BA # KHAROSHTHI PUNCTUATION CIRCLE
+10A53;BA # KHAROSHTHI PUNCTUATION CRESCENT BAR
+10A54;BA # KHAROSHTHI PUNCTUATION MANGALAM
+10A55;BA # KHAROSHTHI PUNCTUATION LOTUS
+10A56;BA # KHAROSHTHI PUNCTUATION DANDA
+10A57;BA # KHAROSHTHI PUNCTUATION DOUBLE DANDA
+10A58;AL # KHAROSHTHI PUNCTUATION LINES
+12000;AL # CUNEIFORM SIGN A
+12001;AL # CUNEIFORM SIGN A TIMES A
+12002;AL # CUNEIFORM SIGN A TIMES BAD
+12003;AL # CUNEIFORM SIGN A TIMES GAN2 TENU
+12004;AL # CUNEIFORM SIGN A TIMES HA
+12005;AL # CUNEIFORM SIGN A TIMES IGI
+12006;AL # CUNEIFORM SIGN A TIMES LAGAR GUNU
+12007;AL # CUNEIFORM SIGN A TIMES MUSH
+12008;AL # CUNEIFORM SIGN A TIMES SAG
+12009;AL # CUNEIFORM SIGN A2
+1200A;AL # CUNEIFORM SIGN AB
+1200B;AL # CUNEIFORM SIGN AB TIMES ASH2
+1200C;AL # CUNEIFORM SIGN AB TIMES DUN3 GUNU
+1200D;AL # CUNEIFORM SIGN AB TIMES GAL
+1200E;AL # CUNEIFORM SIGN AB TIMES GAN2 TENU
+1200F;AL # CUNEIFORM SIGN AB TIMES HA
+12010;AL # CUNEIFORM SIGN AB TIMES IGI GUNU
+12011;AL # CUNEIFORM SIGN AB TIMES IMIN
+12012;AL # CUNEIFORM SIGN AB TIMES LAGAB
+12013;AL # CUNEIFORM SIGN AB TIMES SHESH
+12014;AL # CUNEIFORM SIGN AB TIMES U PLUS U PLUS U
+12015;AL # CUNEIFORM SIGN AB GUNU
+12016;AL # CUNEIFORM SIGN AB2
+12017;AL # CUNEIFORM SIGN AB2 TIMES BALAG
+12018;AL # CUNEIFORM SIGN AB2 TIMES GAN2 TENU
+12019;AL # CUNEIFORM SIGN AB2 TIMES ME PLUS EN
+1201A;AL # CUNEIFORM SIGN AB2 TIMES SHA3
+1201B;AL # CUNEIFORM SIGN AB2 TIMES TAK4
+1201C;AL # CUNEIFORM SIGN AD
+1201D;AL # CUNEIFORM SIGN AK
+1201E;AL # CUNEIFORM SIGN AK TIMES ERIN2
+1201F;AL # CUNEIFORM SIGN AK TIMES SHITA PLUS GISH
+12020;AL # CUNEIFORM SIGN AL
+12021;AL # CUNEIFORM SIGN AL TIMES AL
+12022;AL # CUNEIFORM SIGN AL TIMES DIM2
+12023;AL # CUNEIFORM SIGN AL TIMES GISH
+12024;AL # CUNEIFORM SIGN AL TIMES HA
+12025;AL # CUNEIFORM SIGN AL TIMES KAD3
+12026;AL # CUNEIFORM SIGN AL TIMES KI
+12027;AL # CUNEIFORM SIGN AL TIMES SHE
+12028;AL # CUNEIFORM SIGN AL TIMES USH
+12029;AL # CUNEIFORM SIGN ALAN
+1202A;AL # CUNEIFORM SIGN ALEPH
+1202B;AL # CUNEIFORM SIGN AMAR
+1202C;AL # CUNEIFORM SIGN AMAR TIMES SHE
+1202D;AL # CUNEIFORM SIGN AN
+1202E;AL # CUNEIFORM SIGN AN OVER AN
+1202F;AL # CUNEIFORM SIGN AN THREE TIMES
+12030;AL # CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA
+12031;AL # CUNEIFORM SIGN AN PLUS NAGA SQUARED
+12032;AL # CUNEIFORM SIGN ANSHE
+12033;AL # CUNEIFORM SIGN APIN
+12034;AL # CUNEIFORM SIGN ARAD
+12035;AL # CUNEIFORM SIGN ARAD TIMES KUR
+12036;AL # CUNEIFORM SIGN ARKAB
+12037;AL # CUNEIFORM SIGN ASAL2
+12038;AL # CUNEIFORM SIGN ASH
+12039;AL # CUNEIFORM SIGN ASH ZIDA TENU
+1203A;AL # CUNEIFORM SIGN ASH KABA TENU
+1203B;AL # CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP
+1203C;AL # CUNEIFORM SIGN ASH OVER ASH OVER ASH
+1203D;AL # CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH
+1203E;AL # CUNEIFORM SIGN ASH2
+1203F;AL # CUNEIFORM SIGN ASHGAB
+12040;AL # CUNEIFORM SIGN BA
+12041;AL # CUNEIFORM SIGN BAD
+12042;AL # CUNEIFORM SIGN BAG3
+12043;AL # CUNEIFORM SIGN BAHAR2
+12044;AL # CUNEIFORM SIGN BAL
+12045;AL # CUNEIFORM SIGN BAL OVER BAL
+12046;AL # CUNEIFORM SIGN BALAG
+12047;AL # CUNEIFORM SIGN BAR
+12048;AL # CUNEIFORM SIGN BARA2
+12049;AL # CUNEIFORM SIGN BI
+1204A;AL # CUNEIFORM SIGN BI TIMES A
+1204B;AL # CUNEIFORM SIGN BI TIMES GAR
+1204C;AL # CUNEIFORM SIGN BI TIMES IGI GUNU
+1204D;AL # CUNEIFORM SIGN BU
+1204E;AL # CUNEIFORM SIGN BU OVER BU AB
+1204F;AL # CUNEIFORM SIGN BU OVER BU UN
+12050;AL # CUNEIFORM SIGN BU CROSSING BU
+12051;AL # CUNEIFORM SIGN BULUG
+12052;AL # CUNEIFORM SIGN BULUG OVER BULUG
+12053;AL # CUNEIFORM SIGN BUR
+12054;AL # CUNEIFORM SIGN BUR2
+12055;AL # CUNEIFORM SIGN DA
+12056;AL # CUNEIFORM SIGN DAG
+12057;AL # CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH
+12058;AL # CUNEIFORM SIGN DAG KISIM5 TIMES AMAR
+12059;AL # CUNEIFORM SIGN DAG KISIM5 TIMES BALAG
+1205A;AL # CUNEIFORM SIGN DAG KISIM5 TIMES BI
+1205B;AL # CUNEIFORM SIGN DAG KISIM5 TIMES GA
+1205C;AL # CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH
+1205D;AL # CUNEIFORM SIGN DAG KISIM5 TIMES GI
+1205E;AL # CUNEIFORM SIGN DAG KISIM5 TIMES GIR2
+1205F;AL # CUNEIFORM SIGN DAG KISIM5 TIMES GUD
+12060;AL # CUNEIFORM SIGN DAG KISIM5 TIMES HA
+12061;AL # CUNEIFORM SIGN DAG KISIM5 TIMES IR
+12062;AL # CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU
+12063;AL # CUNEIFORM SIGN DAG KISIM5 TIMES KAK
+12064;AL # CUNEIFORM SIGN DAG KISIM5 TIMES LA
+12065;AL # CUNEIFORM SIGN DAG KISIM5 TIMES LU
+12066;AL # CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2
+12067;AL # CUNEIFORM SIGN DAG KISIM5 TIMES LUM
+12068;AL # CUNEIFORM SIGN DAG KISIM5 TIMES NE
+12069;AL # CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP
+1206A;AL # CUNEIFORM SIGN DAG KISIM5 TIMES SI
+1206B;AL # CUNEIFORM SIGN DAG KISIM5 TIMES TAK4
+1206C;AL # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2
+1206D;AL # CUNEIFORM SIGN DAG KISIM5 TIMES USH
+1206E;AL # CUNEIFORM SIGN DAM
+1206F;AL # CUNEIFORM SIGN DAR
+12070;AL # CUNEIFORM SIGN DARA3
+12071;AL # CUNEIFORM SIGN DARA4
+12072;AL # CUNEIFORM SIGN DI
+12073;AL # CUNEIFORM SIGN DIB
+12074;AL # CUNEIFORM SIGN DIM
+12075;AL # CUNEIFORM SIGN DIM TIMES SHE
+12076;AL # CUNEIFORM SIGN DIM2
+12077;AL # CUNEIFORM SIGN DIN
+12078;AL # CUNEIFORM SIGN DIN KASKAL U GUNU DISH
+12079;AL # CUNEIFORM SIGN DISH
+1207A;AL # CUNEIFORM SIGN DU
+1207B;AL # CUNEIFORM SIGN DU OVER DU
+1207C;AL # CUNEIFORM SIGN DU GUNU
+1207D;AL # CUNEIFORM SIGN DU SHESHIG
+1207E;AL # CUNEIFORM SIGN DUB
+1207F;AL # CUNEIFORM SIGN DUB TIMES ESH2
+12080;AL # CUNEIFORM SIGN DUB2
+12081;AL # CUNEIFORM SIGN DUG
+12082;AL # CUNEIFORM SIGN DUGUD
+12083;AL # CUNEIFORM SIGN DUH
+12084;AL # CUNEIFORM SIGN DUN
+12085;AL # CUNEIFORM SIGN DUN3
+12086;AL # CUNEIFORM SIGN DUN3 GUNU
+12087;AL # CUNEIFORM SIGN DUN3 GUNU GUNU
+12088;AL # CUNEIFORM SIGN DUN4
+12089;AL # CUNEIFORM SIGN DUR2
+1208A;AL # CUNEIFORM SIGN E
+1208B;AL # CUNEIFORM SIGN E TIMES PAP
+1208C;AL # CUNEIFORM SIGN E OVER E NUN OVER NUN
+1208D;AL # CUNEIFORM SIGN E2
+1208E;AL # CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA
+1208F;AL # CUNEIFORM SIGN E2 TIMES GAR
+12090;AL # CUNEIFORM SIGN E2 TIMES MI
+12091;AL # CUNEIFORM SIGN E2 TIMES SAL
+12092;AL # CUNEIFORM SIGN E2 TIMES SHE
+12093;AL # CUNEIFORM SIGN E2 TIMES U
+12094;AL # CUNEIFORM SIGN EDIN
+12095;AL # CUNEIFORM SIGN EGIR
+12096;AL # CUNEIFORM SIGN EL
+12097;AL # CUNEIFORM SIGN EN
+12098;AL # CUNEIFORM SIGN EN TIMES GAN2
+12099;AL # CUNEIFORM SIGN EN TIMES GAN2 TENU
+1209A;AL # CUNEIFORM SIGN EN TIMES ME
+1209B;AL # CUNEIFORM SIGN EN CROSSING EN
+1209C;AL # CUNEIFORM SIGN EN OPPOSING EN
+1209D;AL # CUNEIFORM SIGN EN SQUARED
+1209E;AL # CUNEIFORM SIGN EREN
+1209F;AL # CUNEIFORM SIGN ERIN2
+120A0;AL # CUNEIFORM SIGN ESH2
+120A1;AL # CUNEIFORM SIGN EZEN
+120A2;AL # CUNEIFORM SIGN EZEN TIMES A
+120A3;AL # CUNEIFORM SIGN EZEN TIMES A PLUS LAL
+120A4;AL # CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL
+120A5;AL # CUNEIFORM SIGN EZEN TIMES AN
+120A6;AL # CUNEIFORM SIGN EZEN TIMES BAD
+120A7;AL # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU
+120A8;AL # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU
+120A9;AL # CUNEIFORM SIGN EZEN TIMES HA
+120AA;AL # CUNEIFORM SIGN EZEN TIMES HA GUNU
+120AB;AL # CUNEIFORM SIGN EZEN TIMES IGI GUNU
+120AC;AL # CUNEIFORM SIGN EZEN TIMES KASKAL
+120AD;AL # CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED
+120AE;AL # CUNEIFORM SIGN EZEN TIMES KU3
+120AF;AL # CUNEIFORM SIGN EZEN TIMES LA
+120B0;AL # CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL
+120B1;AL # CUNEIFORM SIGN EZEN TIMES LI
+120B2;AL # CUNEIFORM SIGN EZEN TIMES LU
+120B3;AL # CUNEIFORM SIGN EZEN TIMES U2
+120B4;AL # CUNEIFORM SIGN EZEN TIMES UD
+120B5;AL # CUNEIFORM SIGN GA
+120B6;AL # CUNEIFORM SIGN GA GUNU
+120B7;AL # CUNEIFORM SIGN GA2
+120B8;AL # CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA
+120B9;AL # CUNEIFORM SIGN GA2 TIMES A PLUS HA
+120BA;AL # CUNEIFORM SIGN GA2 TIMES A PLUS IGI
+120BB;AL # CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB
+120BC;AL # CUNEIFORM SIGN GA2 TIMES AN
+120BD;AL # CUNEIFORM SIGN GA2 TIMES ASH
+120BE;AL # CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL
+120BF;AL # CUNEIFORM SIGN GA2 TIMES BAD
+120C0;AL # CUNEIFORM SIGN GA2 TIMES BAR PLUS RA
+120C1;AL # CUNEIFORM SIGN GA2 TIMES BUR
+120C2;AL # CUNEIFORM SIGN GA2 TIMES BUR PLUS RA
+120C3;AL # CUNEIFORM SIGN GA2 TIMES DA
+120C4;AL # CUNEIFORM SIGN GA2 TIMES DI
+120C5;AL # CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE
+120C6;AL # CUNEIFORM SIGN GA2 TIMES DUB
+120C7;AL # CUNEIFORM SIGN GA2 TIMES EL
+120C8;AL # CUNEIFORM SIGN GA2 TIMES EL PLUS LA
+120C9;AL # CUNEIFORM SIGN GA2 TIMES EN
+120CA;AL # CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU
+120CB;AL # CUNEIFORM SIGN GA2 TIMES GAN2 TENU
+120CC;AL # CUNEIFORM SIGN GA2 TIMES GAR
+120CD;AL # CUNEIFORM SIGN GA2 TIMES GI
+120CE;AL # CUNEIFORM SIGN GA2 TIMES GI4
+120CF;AL # CUNEIFORM SIGN GA2 TIMES GI4 PLUS A
+120D0;AL # CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU
+120D1;AL # CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2
+120D2;AL # CUNEIFORM SIGN GA2 TIMES HAL
+120D3;AL # CUNEIFORM SIGN GA2 TIMES HAL PLUS LA
+120D4;AL # CUNEIFORM SIGN GA2 TIMES HI PLUS LI
+120D5;AL # CUNEIFORM SIGN GA2 TIMES HUB2
+120D6;AL # CUNEIFORM SIGN GA2 TIMES IGI GUNU
+120D7;AL # CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH
+120D8;AL # CUNEIFORM SIGN GA2 TIMES KAK
+120D9;AL # CUNEIFORM SIGN GA2 TIMES KASKAL
+120DA;AL # CUNEIFORM SIGN GA2 TIMES KID
+120DB;AL # CUNEIFORM SIGN GA2 TIMES KID PLUS LAL
+120DC;AL # CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN
+120DD;AL # CUNEIFORM SIGN GA2 TIMES LA
+120DE;AL # CUNEIFORM SIGN GA2 TIMES ME PLUS EN
+120DF;AL # CUNEIFORM SIGN GA2 TIMES MI
+120E0;AL # CUNEIFORM SIGN GA2 TIMES NUN
+120E1;AL # CUNEIFORM SIGN GA2 TIMES NUN OVER NUN
+120E2;AL # CUNEIFORM SIGN GA2 TIMES PA
+120E3;AL # CUNEIFORM SIGN GA2 TIMES SAL
+120E4;AL # CUNEIFORM SIGN GA2 TIMES SAR
+120E5;AL # CUNEIFORM SIGN GA2 TIMES SHE
+120E6;AL # CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR
+120E7;AL # CUNEIFORM SIGN GA2 TIMES SHID
+120E8;AL # CUNEIFORM SIGN GA2 TIMES SUM
+120E9;AL # CUNEIFORM SIGN GA2 TIMES TAK4
+120EA;AL # CUNEIFORM SIGN GA2 TIMES U
+120EB;AL # CUNEIFORM SIGN GA2 TIMES UD
+120EC;AL # CUNEIFORM SIGN GA2 TIMES UD PLUS DU
+120ED;AL # CUNEIFORM SIGN GA2 OVER GA2
+120EE;AL # CUNEIFORM SIGN GABA
+120EF;AL # CUNEIFORM SIGN GABA CROSSING GABA
+120F0;AL # CUNEIFORM SIGN GAD
+120F1;AL # CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR
+120F2;AL # CUNEIFORM SIGN GAL
+120F3;AL # CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR
+120F4;AL # CUNEIFORM SIGN GALAM
+120F5;AL # CUNEIFORM SIGN GAM
+120F6;AL # CUNEIFORM SIGN GAN
+120F7;AL # CUNEIFORM SIGN GAN2
+120F8;AL # CUNEIFORM SIGN GAN2 TENU
+120F9;AL # CUNEIFORM SIGN GAN2 OVER GAN2
+120FA;AL # CUNEIFORM SIGN GAN2 CROSSING GAN2
+120FB;AL # CUNEIFORM SIGN GAR
+120FC;AL # CUNEIFORM SIGN GAR3
+120FD;AL # CUNEIFORM SIGN GASHAN
+120FE;AL # CUNEIFORM SIGN GESHTIN
+120FF;AL # CUNEIFORM SIGN GESHTIN TIMES KUR
+12100;AL # CUNEIFORM SIGN GI
+12101;AL # CUNEIFORM SIGN GI TIMES E
+12102;AL # CUNEIFORM SIGN GI TIMES U
+12103;AL # CUNEIFORM SIGN GI CROSSING GI
+12104;AL # CUNEIFORM SIGN GI4
+12105;AL # CUNEIFORM SIGN GI4 OVER GI4
+12106;AL # CUNEIFORM SIGN GI4 CROSSING GI4
+12107;AL # CUNEIFORM SIGN GIDIM
+12108;AL # CUNEIFORM SIGN GIR2
+12109;AL # CUNEIFORM SIGN GIR2 GUNU
+1210A;AL # CUNEIFORM SIGN GIR3
+1210B;AL # CUNEIFORM SIGN GIR3 TIMES A PLUS IGI
+1210C;AL # CUNEIFORM SIGN GIR3 TIMES GAN2 TENU
+1210D;AL # CUNEIFORM SIGN GIR3 TIMES IGI
+1210E;AL # CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI
+1210F;AL # CUNEIFORM SIGN GIR3 TIMES PA
+12110;AL # CUNEIFORM SIGN GISAL
+12111;AL # CUNEIFORM SIGN GISH
+12112;AL # CUNEIFORM SIGN GISH CROSSING GISH
+12113;AL # CUNEIFORM SIGN GISH TIMES BAD
+12114;AL # CUNEIFORM SIGN GISH TIMES TAK4
+12115;AL # CUNEIFORM SIGN GISH TENU
+12116;AL # CUNEIFORM SIGN GU
+12117;AL # CUNEIFORM SIGN GU CROSSING GU
+12118;AL # CUNEIFORM SIGN GU2
+12119;AL # CUNEIFORM SIGN GU2 TIMES KAK
+1211A;AL # CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU
+1211B;AL # CUNEIFORM SIGN GU2 TIMES NUN
+1211C;AL # CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2
+1211D;AL # CUNEIFORM SIGN GU2 GUNU
+1211E;AL # CUNEIFORM SIGN GUD
+1211F;AL # CUNEIFORM SIGN GUD TIMES A PLUS KUR
+12120;AL # CUNEIFORM SIGN GUD TIMES KUR
+12121;AL # CUNEIFORM SIGN GUD OVER GUD LUGAL
+12122;AL # CUNEIFORM SIGN GUL
+12123;AL # CUNEIFORM SIGN GUM
+12124;AL # CUNEIFORM SIGN GUM TIMES SHE
+12125;AL # CUNEIFORM SIGN GUR
+12126;AL # CUNEIFORM SIGN GUR7
+12127;AL # CUNEIFORM SIGN GURUN
+12128;AL # CUNEIFORM SIGN GURUSH
+12129;AL # CUNEIFORM SIGN HA
+1212A;AL # CUNEIFORM SIGN HA TENU
+1212B;AL # CUNEIFORM SIGN HA GUNU
+1212C;AL # CUNEIFORM SIGN HAL
+1212D;AL # CUNEIFORM SIGN HI
+1212E;AL # CUNEIFORM SIGN HI TIMES ASH
+1212F;AL # CUNEIFORM SIGN HI TIMES ASH2
+12130;AL # CUNEIFORM SIGN HI TIMES BAD
+12131;AL # CUNEIFORM SIGN HI TIMES DISH
+12132;AL # CUNEIFORM SIGN HI TIMES GAD
+12133;AL # CUNEIFORM SIGN HI TIMES KIN
+12134;AL # CUNEIFORM SIGN HI TIMES NUN
+12135;AL # CUNEIFORM SIGN HI TIMES SHE
+12136;AL # CUNEIFORM SIGN HI TIMES U
+12137;AL # CUNEIFORM SIGN HU
+12138;AL # CUNEIFORM SIGN HUB2
+12139;AL # CUNEIFORM SIGN HUB2 TIMES AN
+1213A;AL # CUNEIFORM SIGN HUB2 TIMES HAL
+1213B;AL # CUNEIFORM SIGN HUB2 TIMES KASKAL
+1213C;AL # CUNEIFORM SIGN HUB2 TIMES LISH
+1213D;AL # CUNEIFORM SIGN HUB2 TIMES UD
+1213E;AL # CUNEIFORM SIGN HUL2
+1213F;AL # CUNEIFORM SIGN I
+12140;AL # CUNEIFORM SIGN I A
+12141;AL # CUNEIFORM SIGN IB
+12142;AL # CUNEIFORM SIGN IDIM
+12143;AL # CUNEIFORM SIGN IDIM OVER IDIM BUR
+12144;AL # CUNEIFORM SIGN IDIM OVER IDIM SQUARED
+12145;AL # CUNEIFORM SIGN IG
+12146;AL # CUNEIFORM SIGN IGI
+12147;AL # CUNEIFORM SIGN IGI DIB
+12148;AL # CUNEIFORM SIGN IGI RI
+12149;AL # CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD
+1214A;AL # CUNEIFORM SIGN IGI GUNU
+1214B;AL # CUNEIFORM SIGN IL
+1214C;AL # CUNEIFORM SIGN IL TIMES GAN2 TENU
+1214D;AL # CUNEIFORM SIGN IL2
+1214E;AL # CUNEIFORM SIGN IM
+1214F;AL # CUNEIFORM SIGN IM TIMES TAK4
+12150;AL # CUNEIFORM SIGN IM CROSSING IM
+12151;AL # CUNEIFORM SIGN IM OPPOSING IM
+12152;AL # CUNEIFORM SIGN IM SQUARED
+12153;AL # CUNEIFORM SIGN IMIN
+12154;AL # CUNEIFORM SIGN IN
+12155;AL # CUNEIFORM SIGN IR
+12156;AL # CUNEIFORM SIGN ISH
+12157;AL # CUNEIFORM SIGN KA
+12158;AL # CUNEIFORM SIGN KA TIMES A
+12159;AL # CUNEIFORM SIGN KA TIMES AD
+1215A;AL # CUNEIFORM SIGN KA TIMES AD PLUS KU3
+1215B;AL # CUNEIFORM SIGN KA TIMES ASH2
+1215C;AL # CUNEIFORM SIGN KA TIMES BAD
+1215D;AL # CUNEIFORM SIGN KA TIMES BALAG
+1215E;AL # CUNEIFORM SIGN KA TIMES BAR
+1215F;AL # CUNEIFORM SIGN KA TIMES BI
+12160;AL # CUNEIFORM SIGN KA TIMES ERIN2
+12161;AL # CUNEIFORM SIGN KA TIMES ESH2
+12162;AL # CUNEIFORM SIGN KA TIMES GA
+12163;AL # CUNEIFORM SIGN KA TIMES GAL
+12164;AL # CUNEIFORM SIGN KA TIMES GAN2 TENU
+12165;AL # CUNEIFORM SIGN KA TIMES GAR
+12166;AL # CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A
+12167;AL # CUNEIFORM SIGN KA TIMES GI
+12168;AL # CUNEIFORM SIGN KA TIMES GIR2
+12169;AL # CUNEIFORM SIGN KA TIMES GISH PLUS SAR
+1216A;AL # CUNEIFORM SIGN KA TIMES GISH CROSSING GISH
+1216B;AL # CUNEIFORM SIGN KA TIMES GU
+1216C;AL # CUNEIFORM SIGN KA TIMES GUR7
+1216D;AL # CUNEIFORM SIGN KA TIMES IGI
+1216E;AL # CUNEIFORM SIGN KA TIMES IM
+1216F;AL # CUNEIFORM SIGN KA TIMES KAK
+12170;AL # CUNEIFORM SIGN KA TIMES KI
+12171;AL # CUNEIFORM SIGN KA TIMES KID
+12172;AL # CUNEIFORM SIGN KA TIMES LI
+12173;AL # CUNEIFORM SIGN KA TIMES LU
+12174;AL # CUNEIFORM SIGN KA TIMES ME
+12175;AL # CUNEIFORM SIGN KA TIMES ME PLUS DU
+12176;AL # CUNEIFORM SIGN KA TIMES ME PLUS GI
+12177;AL # CUNEIFORM SIGN KA TIMES ME PLUS TE
+12178;AL # CUNEIFORM SIGN KA TIMES MI
+12179;AL # CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ
+1217A;AL # CUNEIFORM SIGN KA TIMES NE
+1217B;AL # CUNEIFORM SIGN KA TIMES NUN
+1217C;AL # CUNEIFORM SIGN KA TIMES PI
+1217D;AL # CUNEIFORM SIGN KA TIMES RU
+1217E;AL # CUNEIFORM SIGN KA TIMES SA
+1217F;AL # CUNEIFORM SIGN KA TIMES SAR
+12180;AL # CUNEIFORM SIGN KA TIMES SHA
+12181;AL # CUNEIFORM SIGN KA TIMES SHE
+12182;AL # CUNEIFORM SIGN KA TIMES SHID
+12183;AL # CUNEIFORM SIGN KA TIMES SHU
+12184;AL # CUNEIFORM SIGN KA TIMES SIG
+12185;AL # CUNEIFORM SIGN KA TIMES SUHUR
+12186;AL # CUNEIFORM SIGN KA TIMES TAR
+12187;AL # CUNEIFORM SIGN KA TIMES U
+12188;AL # CUNEIFORM SIGN KA TIMES U2
+12189;AL # CUNEIFORM SIGN KA TIMES UD
+1218A;AL # CUNEIFORM SIGN KA TIMES UMUM TIMES PA
+1218B;AL # CUNEIFORM SIGN KA TIMES USH
+1218C;AL # CUNEIFORM SIGN KA TIMES ZI
+1218D;AL # CUNEIFORM SIGN KA2
+1218E;AL # CUNEIFORM SIGN KA2 CROSSING KA2
+1218F;AL # CUNEIFORM SIGN KAB
+12190;AL # CUNEIFORM SIGN KAD2
+12191;AL # CUNEIFORM SIGN KAD3
+12192;AL # CUNEIFORM SIGN KAD4
+12193;AL # CUNEIFORM SIGN KAD5
+12194;AL # CUNEIFORM SIGN KAD5 OVER KAD5
+12195;AL # CUNEIFORM SIGN KAK
+12196;AL # CUNEIFORM SIGN KAK TIMES IGI GUNU
+12197;AL # CUNEIFORM SIGN KAL
+12198;AL # CUNEIFORM SIGN KAL TIMES BAD
+12199;AL # CUNEIFORM SIGN KAL CROSSING KAL
+1219A;AL # CUNEIFORM SIGN KAM2
+1219B;AL # CUNEIFORM SIGN KAM4
+1219C;AL # CUNEIFORM SIGN KASKAL
+1219D;AL # CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219E;AL # CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219F;AL # CUNEIFORM SIGN KESH2
+121A0;AL # CUNEIFORM SIGN KI
+121A1;AL # CUNEIFORM SIGN KI TIMES BAD
+121A2;AL # CUNEIFORM SIGN KI TIMES U
+121A3;AL # CUNEIFORM SIGN KI TIMES UD
+121A4;AL # CUNEIFORM SIGN KID
+121A5;AL # CUNEIFORM SIGN KIN
+121A6;AL # CUNEIFORM SIGN KISAL
+121A7;AL # CUNEIFORM SIGN KISH
+121A8;AL # CUNEIFORM SIGN KISIM5
+121A9;AL # CUNEIFORM SIGN KISIM5 OVER KISIM5
+121AA;AL # CUNEIFORM SIGN KU
+121AB;AL # CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2
+121AC;AL # CUNEIFORM SIGN KU3
+121AD;AL # CUNEIFORM SIGN KU4
+121AE;AL # CUNEIFORM SIGN KU4 VARIANT FORM
+121AF;AL # CUNEIFORM SIGN KU7
+121B0;AL # CUNEIFORM SIGN KUL
+121B1;AL # CUNEIFORM SIGN KUL GUNU
+121B2;AL # CUNEIFORM SIGN KUN
+121B3;AL # CUNEIFORM SIGN KUR
+121B4;AL # CUNEIFORM SIGN KUR OPPOSING KUR
+121B5;AL # CUNEIFORM SIGN KUSHU2
+121B6;AL # CUNEIFORM SIGN KWU318
+121B7;AL # CUNEIFORM SIGN LA
+121B8;AL # CUNEIFORM SIGN LAGAB
+121B9;AL # CUNEIFORM SIGN LAGAB TIMES A
+121BA;AL # CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA
+121BB;AL # CUNEIFORM SIGN LAGAB TIMES A PLUS GAR
+121BC;AL # CUNEIFORM SIGN LAGAB TIMES A PLUS LAL
+121BD;AL # CUNEIFORM SIGN LAGAB TIMES AL
+121BE;AL # CUNEIFORM SIGN LAGAB TIMES AN
+121BF;AL # CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU
+121C0;AL # CUNEIFORM SIGN LAGAB TIMES BAD
+121C1;AL # CUNEIFORM SIGN LAGAB TIMES BI
+121C2;AL # CUNEIFORM SIGN LAGAB TIMES DAR
+121C3;AL # CUNEIFORM SIGN LAGAB TIMES EN
+121C4;AL # CUNEIFORM SIGN LAGAB TIMES GA
+121C5;AL # CUNEIFORM SIGN LAGAB TIMES GAR
+121C6;AL # CUNEIFORM SIGN LAGAB TIMES GUD
+121C7;AL # CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD
+121C8;AL # CUNEIFORM SIGN LAGAB TIMES HA
+121C9;AL # CUNEIFORM SIGN LAGAB TIMES HAL
+121CA;AL # CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN
+121CB;AL # CUNEIFORM SIGN LAGAB TIMES IGI GUNU
+121CC;AL # CUNEIFORM SIGN LAGAB TIMES IM
+121CD;AL # CUNEIFORM SIGN LAGAB TIMES IM PLUS HA
+121CE;AL # CUNEIFORM SIGN LAGAB TIMES IM PLUS LU
+121CF;AL # CUNEIFORM SIGN LAGAB TIMES KI
+121D0;AL # CUNEIFORM SIGN LAGAB TIMES KIN
+121D1;AL # CUNEIFORM SIGN LAGAB TIMES KU3
+121D2;AL # CUNEIFORM SIGN LAGAB TIMES KUL
+121D3;AL # CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A
+121D4;AL # CUNEIFORM SIGN LAGAB TIMES LAGAB
+121D5;AL # CUNEIFORM SIGN LAGAB TIMES LISH
+121D6;AL # CUNEIFORM SIGN LAGAB TIMES LU
+121D7;AL # CUNEIFORM SIGN LAGAB TIMES LUL
+121D8;AL # CUNEIFORM SIGN LAGAB TIMES ME
+121D9;AL # CUNEIFORM SIGN LAGAB TIMES ME PLUS EN
+121DA;AL # CUNEIFORM SIGN LAGAB TIMES MUSH
+121DB;AL # CUNEIFORM SIGN LAGAB TIMES NE
+121DC;AL # CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM
+121DD;AL # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2
+121DE;AL # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU
+121DF;AL # CUNEIFORM SIGN LAGAB TIMES SHU2
+121E0;AL # CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2
+121E1;AL # CUNEIFORM SIGN LAGAB TIMES SUM
+121E2;AL # CUNEIFORM SIGN LAGAB TIMES TAG
+121E3;AL # CUNEIFORM SIGN LAGAB TIMES TAK4
+121E4;AL # CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA
+121E5;AL # CUNEIFORM SIGN LAGAB TIMES U
+121E6;AL # CUNEIFORM SIGN LAGAB TIMES U PLUS A
+121E7;AL # CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U
+121E8;AL # CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH
+121E9;AL # CUNEIFORM SIGN LAGAB TIMES UD
+121EA;AL # CUNEIFORM SIGN LAGAB TIMES USH
+121EB;AL # CUNEIFORM SIGN LAGAB SQUARED
+121EC;AL # CUNEIFORM SIGN LAGAR
+121ED;AL # CUNEIFORM SIGN LAGAR TIMES SHE
+121EE;AL # CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM
+121EF;AL # CUNEIFORM SIGN LAGAR GUNU
+121F0;AL # CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE
+121F1;AL # CUNEIFORM SIGN LAHSHU
+121F2;AL # CUNEIFORM SIGN LAL
+121F3;AL # CUNEIFORM SIGN LAL TIMES LAL
+121F4;AL # CUNEIFORM SIGN LAM
+121F5;AL # CUNEIFORM SIGN LAM TIMES KUR
+121F6;AL # CUNEIFORM SIGN LAM TIMES KUR PLUS RU
+121F7;AL # CUNEIFORM SIGN LI
+121F8;AL # CUNEIFORM SIGN LIL
+121F9;AL # CUNEIFORM SIGN LIMMU2
+121FA;AL # CUNEIFORM SIGN LISH
+121FB;AL # CUNEIFORM SIGN LU
+121FC;AL # CUNEIFORM SIGN LU TIMES BAD
+121FD;AL # CUNEIFORM SIGN LU2
+121FE;AL # CUNEIFORM SIGN LU2 TIMES AL
+121FF;AL # CUNEIFORM SIGN LU2 TIMES BAD
+12200;AL # CUNEIFORM SIGN LU2 TIMES ESH2
+12201;AL # CUNEIFORM SIGN LU2 TIMES ESH2 TENU
+12202;AL # CUNEIFORM SIGN LU2 TIMES GAN2 TENU
+12203;AL # CUNEIFORM SIGN LU2 TIMES HI TIMES BAD
+12204;AL # CUNEIFORM SIGN LU2 TIMES IM
+12205;AL # CUNEIFORM SIGN LU2 TIMES KAD2
+12206;AL # CUNEIFORM SIGN LU2 TIMES KAD3
+12207;AL # CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH
+12208;AL # CUNEIFORM SIGN LU2 TIMES KI
+12209;AL # CUNEIFORM SIGN LU2 TIMES LA PLUS ASH
+1220A;AL # CUNEIFORM SIGN LU2 TIMES LAGAB
+1220B;AL # CUNEIFORM SIGN LU2 TIMES ME PLUS EN
+1220C;AL # CUNEIFORM SIGN LU2 TIMES NE
+1220D;AL # CUNEIFORM SIGN LU2 TIMES NU
+1220E;AL # CUNEIFORM SIGN LU2 TIMES SI PLUS ASH
+1220F;AL # CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU
+12210;AL # CUNEIFORM SIGN LU2 TIMES TUG2
+12211;AL # CUNEIFORM SIGN LU2 TENU
+12212;AL # CUNEIFORM SIGN LU2 CROSSING LU2
+12213;AL # CUNEIFORM SIGN LU2 OPPOSING LU2
+12214;AL # CUNEIFORM SIGN LU2 SQUARED
+12215;AL # CUNEIFORM SIGN LU2 SHESHIG
+12216;AL # CUNEIFORM SIGN LU3
+12217;AL # CUNEIFORM SIGN LUGAL
+12218;AL # CUNEIFORM SIGN LUGAL OVER LUGAL
+12219;AL # CUNEIFORM SIGN LUGAL OPPOSING LUGAL
+1221A;AL # CUNEIFORM SIGN LUGAL SHESHIG
+1221B;AL # CUNEIFORM SIGN LUH
+1221C;AL # CUNEIFORM SIGN LUL
+1221D;AL # CUNEIFORM SIGN LUM
+1221E;AL # CUNEIFORM SIGN LUM OVER LUM
+1221F;AL # CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR
+12220;AL # CUNEIFORM SIGN MA
+12221;AL # CUNEIFORM SIGN MA TIMES TAK4
+12222;AL # CUNEIFORM SIGN MA GUNU
+12223;AL # CUNEIFORM SIGN MA2
+12224;AL # CUNEIFORM SIGN MAH
+12225;AL # CUNEIFORM SIGN MAR
+12226;AL # CUNEIFORM SIGN MASH
+12227;AL # CUNEIFORM SIGN MASH2
+12228;AL # CUNEIFORM SIGN ME
+12229;AL # CUNEIFORM SIGN MES
+1222A;AL # CUNEIFORM SIGN MI
+1222B;AL # CUNEIFORM SIGN MIN
+1222C;AL # CUNEIFORM SIGN MU
+1222D;AL # CUNEIFORM SIGN MU OVER MU
+1222E;AL # CUNEIFORM SIGN MUG
+1222F;AL # CUNEIFORM SIGN MUG GUNU
+12230;AL # CUNEIFORM SIGN MUNSUB
+12231;AL # CUNEIFORM SIGN MURGU2
+12232;AL # CUNEIFORM SIGN MUSH
+12233;AL # CUNEIFORM SIGN MUSH TIMES A
+12234;AL # CUNEIFORM SIGN MUSH TIMES KUR
+12235;AL # CUNEIFORM SIGN MUSH TIMES ZA
+12236;AL # CUNEIFORM SIGN MUSH OVER MUSH
+12237;AL # CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA
+12238;AL # CUNEIFORM SIGN MUSH CROSSING MUSH
+12239;AL # CUNEIFORM SIGN MUSH3
+1223A;AL # CUNEIFORM SIGN MUSH3 TIMES A
+1223B;AL # CUNEIFORM SIGN MUSH3 TIMES A PLUS DI
+1223C;AL # CUNEIFORM SIGN MUSH3 TIMES DI
+1223D;AL # CUNEIFORM SIGN MUSH3 GUNU
+1223E;AL # CUNEIFORM SIGN NA
+1223F;AL # CUNEIFORM SIGN NA2
+12240;AL # CUNEIFORM SIGN NAGA
+12241;AL # CUNEIFORM SIGN NAGA INVERTED
+12242;AL # CUNEIFORM SIGN NAGA TIMES SHU TENU
+12243;AL # CUNEIFORM SIGN NAGA OPPOSING NAGA
+12244;AL # CUNEIFORM SIGN NAGAR
+12245;AL # CUNEIFORM SIGN NAM NUTILLU
+12246;AL # CUNEIFORM SIGN NAM
+12247;AL # CUNEIFORM SIGN NAM2
+12248;AL # CUNEIFORM SIGN NE
+12249;AL # CUNEIFORM SIGN NE TIMES A
+1224A;AL # CUNEIFORM SIGN NE TIMES UD
+1224B;AL # CUNEIFORM SIGN NE SHESHIG
+1224C;AL # CUNEIFORM SIGN NI
+1224D;AL # CUNEIFORM SIGN NI TIMES E
+1224E;AL # CUNEIFORM SIGN NI2
+1224F;AL # CUNEIFORM SIGN NIM
+12250;AL # CUNEIFORM SIGN NIM TIMES GAN2 TENU
+12251;AL # CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU
+12252;AL # CUNEIFORM SIGN NINDA2
+12253;AL # CUNEIFORM SIGN NINDA2 TIMES AN
+12254;AL # CUNEIFORM SIGN NINDA2 TIMES ASH
+12255;AL # CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH
+12256;AL # CUNEIFORM SIGN NINDA2 TIMES GUD
+12257;AL # CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU
+12258;AL # CUNEIFORM SIGN NINDA2 TIMES NE
+12259;AL # CUNEIFORM SIGN NINDA2 TIMES NUN
+1225A;AL # CUNEIFORM SIGN NINDA2 TIMES SHE
+1225B;AL # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN
+1225C;AL # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH
+1225D;AL # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH
+1225E;AL # CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH
+1225F;AL # CUNEIFORM SIGN NINDA2 TIMES USH
+12260;AL # CUNEIFORM SIGN NISAG
+12261;AL # CUNEIFORM SIGN NU
+12262;AL # CUNEIFORM SIGN NU11
+12263;AL # CUNEIFORM SIGN NUN
+12264;AL # CUNEIFORM SIGN NUN LAGAR TIMES GAR
+12265;AL # CUNEIFORM SIGN NUN LAGAR TIMES MASH
+12266;AL # CUNEIFORM SIGN NUN LAGAR TIMES SAL
+12267;AL # CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL
+12268;AL # CUNEIFORM SIGN NUN LAGAR TIMES USH
+12269;AL # CUNEIFORM SIGN NUN TENU
+1226A;AL # CUNEIFORM SIGN NUN OVER NUN
+1226B;AL # CUNEIFORM SIGN NUN CROSSING NUN
+1226C;AL # CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR
+1226D;AL # CUNEIFORM SIGN NUNUZ
+1226E;AL # CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB
+1226F;AL # CUNEIFORM SIGN NUNUZ AB2 TIMES BI
+12270;AL # CUNEIFORM SIGN NUNUZ AB2 TIMES DUG
+12271;AL # CUNEIFORM SIGN NUNUZ AB2 TIMES GUD
+12272;AL # CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU
+12273;AL # CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3
+12274;AL # CUNEIFORM SIGN NUNUZ AB2 TIMES LA
+12275;AL # CUNEIFORM SIGN NUNUZ AB2 TIMES NE
+12276;AL # CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3
+12277;AL # CUNEIFORM SIGN NUNUZ AB2 TIMES U2
+12278;AL # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI
+12279;AL # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U
+1227A;AL # CUNEIFORM SIGN PA
+1227B;AL # CUNEIFORM SIGN PAD
+1227C;AL # CUNEIFORM SIGN PAN
+1227D;AL # CUNEIFORM SIGN PAP
+1227E;AL # CUNEIFORM SIGN PESH2
+1227F;AL # CUNEIFORM SIGN PI
+12280;AL # CUNEIFORM SIGN PI TIMES A
+12281;AL # CUNEIFORM SIGN PI TIMES AB
+12282;AL # CUNEIFORM SIGN PI TIMES BI
+12283;AL # CUNEIFORM SIGN PI TIMES BU
+12284;AL # CUNEIFORM SIGN PI TIMES E
+12285;AL # CUNEIFORM SIGN PI TIMES I
+12286;AL # CUNEIFORM SIGN PI TIMES IB
+12287;AL # CUNEIFORM SIGN PI TIMES U
+12288;AL # CUNEIFORM SIGN PI TIMES U2
+12289;AL # CUNEIFORM SIGN PI CROSSING PI
+1228A;AL # CUNEIFORM SIGN PIRIG
+1228B;AL # CUNEIFORM SIGN PIRIG TIMES KAL
+1228C;AL # CUNEIFORM SIGN PIRIG TIMES UD
+1228D;AL # CUNEIFORM SIGN PIRIG TIMES ZA
+1228E;AL # CUNEIFORM SIGN PIRIG OPPOSING PIRIG
+1228F;AL # CUNEIFORM SIGN RA
+12290;AL # CUNEIFORM SIGN RAB
+12291;AL # CUNEIFORM SIGN RI
+12292;AL # CUNEIFORM SIGN RU
+12293;AL # CUNEIFORM SIGN SA
+12294;AL # CUNEIFORM SIGN SAG NUTILLU
+12295;AL # CUNEIFORM SIGN SAG
+12296;AL # CUNEIFORM SIGN SAG TIMES A
+12297;AL # CUNEIFORM SIGN SAG TIMES DU
+12298;AL # CUNEIFORM SIGN SAG TIMES DUB
+12299;AL # CUNEIFORM SIGN SAG TIMES HA
+1229A;AL # CUNEIFORM SIGN SAG TIMES KAK
+1229B;AL # CUNEIFORM SIGN SAG TIMES KUR
+1229C;AL # CUNEIFORM SIGN SAG TIMES LUM
+1229D;AL # CUNEIFORM SIGN SAG TIMES MI
+1229E;AL # CUNEIFORM SIGN SAG TIMES NUN
+1229F;AL # CUNEIFORM SIGN SAG TIMES SAL
+122A0;AL # CUNEIFORM SIGN SAG TIMES SHID
+122A1;AL # CUNEIFORM SIGN SAG TIMES TAB
+122A2;AL # CUNEIFORM SIGN SAG TIMES U2
+122A3;AL # CUNEIFORM SIGN SAG TIMES UB
+122A4;AL # CUNEIFORM SIGN SAG TIMES UM
+122A5;AL # CUNEIFORM SIGN SAG TIMES UR
+122A6;AL # CUNEIFORM SIGN SAG TIMES USH
+122A7;AL # CUNEIFORM SIGN SAG OVER SAG
+122A8;AL # CUNEIFORM SIGN SAG GUNU
+122A9;AL # CUNEIFORM SIGN SAL
+122AA;AL # CUNEIFORM SIGN SAL LAGAB TIMES ASH2
+122AB;AL # CUNEIFORM SIGN SANGA2
+122AC;AL # CUNEIFORM SIGN SAR
+122AD;AL # CUNEIFORM SIGN SHA
+122AE;AL # CUNEIFORM SIGN SHA3
+122AF;AL # CUNEIFORM SIGN SHA3 TIMES A
+122B0;AL # CUNEIFORM SIGN SHA3 TIMES BAD
+122B1;AL # CUNEIFORM SIGN SHA3 TIMES GISH
+122B2;AL # CUNEIFORM SIGN SHA3 TIMES NE
+122B3;AL # CUNEIFORM SIGN SHA3 TIMES SHU2
+122B4;AL # CUNEIFORM SIGN SHA3 TIMES TUR
+122B5;AL # CUNEIFORM SIGN SHA3 TIMES U
+122B6;AL # CUNEIFORM SIGN SHA3 TIMES U PLUS A
+122B7;AL # CUNEIFORM SIGN SHA6
+122B8;AL # CUNEIFORM SIGN SHAB6
+122B9;AL # CUNEIFORM SIGN SHAR2
+122BA;AL # CUNEIFORM SIGN SHE
+122BB;AL # CUNEIFORM SIGN SHE HU
+122BC;AL # CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR
+122BD;AL # CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR
+122BE;AL # CUNEIFORM SIGN SHEG9
+122BF;AL # CUNEIFORM SIGN SHEN
+122C0;AL # CUNEIFORM SIGN SHESH
+122C1;AL # CUNEIFORM SIGN SHESH2
+122C2;AL # CUNEIFORM SIGN SHESHLAM
+122C3;AL # CUNEIFORM SIGN SHID
+122C4;AL # CUNEIFORM SIGN SHID TIMES A
+122C5;AL # CUNEIFORM SIGN SHID TIMES IM
+122C6;AL # CUNEIFORM SIGN SHIM
+122C7;AL # CUNEIFORM SIGN SHIM TIMES A
+122C8;AL # CUNEIFORM SIGN SHIM TIMES BAL
+122C9;AL # CUNEIFORM SIGN SHIM TIMES BULUG
+122CA;AL # CUNEIFORM SIGN SHIM TIMES DIN
+122CB;AL # CUNEIFORM SIGN SHIM TIMES GAR
+122CC;AL # CUNEIFORM SIGN SHIM TIMES IGI
+122CD;AL # CUNEIFORM SIGN SHIM TIMES IGI GUNU
+122CE;AL # CUNEIFORM SIGN SHIM TIMES KUSHU2
+122CF;AL # CUNEIFORM SIGN SHIM TIMES LUL
+122D0;AL # CUNEIFORM SIGN SHIM TIMES MUG
+122D1;AL # CUNEIFORM SIGN SHIM TIMES SAL
+122D2;AL # CUNEIFORM SIGN SHINIG
+122D3;AL # CUNEIFORM SIGN SHIR
+122D4;AL # CUNEIFORM SIGN SHIR TENU
+122D5;AL # CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR
+122D6;AL # CUNEIFORM SIGN SHITA
+122D7;AL # CUNEIFORM SIGN SHU
+122D8;AL # CUNEIFORM SIGN SHU OVER INVERTED SHU
+122D9;AL # CUNEIFORM SIGN SHU2
+122DA;AL # CUNEIFORM SIGN SHUBUR
+122DB;AL # CUNEIFORM SIGN SI
+122DC;AL # CUNEIFORM SIGN SI GUNU
+122DD;AL # CUNEIFORM SIGN SIG
+122DE;AL # CUNEIFORM SIGN SIG4
+122DF;AL # CUNEIFORM SIGN SIG4 OVER SIG4 SHU2
+122E0;AL # CUNEIFORM SIGN SIK2
+122E1;AL # CUNEIFORM SIGN SILA3
+122E2;AL # CUNEIFORM SIGN SU
+122E3;AL # CUNEIFORM SIGN SU OVER SU
+122E4;AL # CUNEIFORM SIGN SUD
+122E5;AL # CUNEIFORM SIGN SUD2
+122E6;AL # CUNEIFORM SIGN SUHUR
+122E7;AL # CUNEIFORM SIGN SUM
+122E8;AL # CUNEIFORM SIGN SUMASH
+122E9;AL # CUNEIFORM SIGN SUR
+122EA;AL # CUNEIFORM SIGN SUR9
+122EB;AL # CUNEIFORM SIGN TA
+122EC;AL # CUNEIFORM SIGN TA ASTERISK
+122ED;AL # CUNEIFORM SIGN TA TIMES HI
+122EE;AL # CUNEIFORM SIGN TA TIMES MI
+122EF;AL # CUNEIFORM SIGN TA GUNU
+122F0;AL # CUNEIFORM SIGN TAB
+122F1;AL # CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH
+122F2;AL # CUNEIFORM SIGN TAB SQUARED
+122F3;AL # CUNEIFORM SIGN TAG
+122F4;AL # CUNEIFORM SIGN TAG TIMES BI
+122F5;AL # CUNEIFORM SIGN TAG TIMES GUD
+122F6;AL # CUNEIFORM SIGN TAG TIMES SHE
+122F7;AL # CUNEIFORM SIGN TAG TIMES SHU
+122F8;AL # CUNEIFORM SIGN TAG TIMES TUG2
+122F9;AL # CUNEIFORM SIGN TAG TIMES UD
+122FA;AL # CUNEIFORM SIGN TAK4
+122FB;AL # CUNEIFORM SIGN TAR
+122FC;AL # CUNEIFORM SIGN TE
+122FD;AL # CUNEIFORM SIGN TE GUNU
+122FE;AL # CUNEIFORM SIGN TI
+122FF;AL # CUNEIFORM SIGN TI TENU
+12300;AL # CUNEIFORM SIGN TIL
+12301;AL # CUNEIFORM SIGN TIR
+12302;AL # CUNEIFORM SIGN TIR TIMES TAK4
+12303;AL # CUNEIFORM SIGN TIR OVER TIR
+12304;AL # CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR
+12305;AL # CUNEIFORM SIGN TU
+12306;AL # CUNEIFORM SIGN TUG2
+12307;AL # CUNEIFORM SIGN TUK
+12308;AL # CUNEIFORM SIGN TUM
+12309;AL # CUNEIFORM SIGN TUR
+1230A;AL # CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA
+1230B;AL # CUNEIFORM SIGN U
+1230C;AL # CUNEIFORM SIGN U GUD
+1230D;AL # CUNEIFORM SIGN U U U
+1230E;AL # CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR
+1230F;AL # CUNEIFORM SIGN U OVER U SUR OVER SUR
+12310;AL # CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED
+12311;AL # CUNEIFORM SIGN U2
+12312;AL # CUNEIFORM SIGN UB
+12313;AL # CUNEIFORM SIGN UD
+12314;AL # CUNEIFORM SIGN UD KUSHU2
+12315;AL # CUNEIFORM SIGN UD TIMES BAD
+12316;AL # CUNEIFORM SIGN UD TIMES MI
+12317;AL # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U
+12318;AL # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU
+12319;AL # CUNEIFORM SIGN UD GUNU
+1231A;AL # CUNEIFORM SIGN UD SHESHIG
+1231B;AL # CUNEIFORM SIGN UD SHESHIG TIMES BAD
+1231C;AL # CUNEIFORM SIGN UDUG
+1231D;AL # CUNEIFORM SIGN UM
+1231E;AL # CUNEIFORM SIGN UM TIMES LAGAB
+1231F;AL # CUNEIFORM SIGN UM TIMES ME PLUS DA
+12320;AL # CUNEIFORM SIGN UM TIMES SHA3
+12321;AL # CUNEIFORM SIGN UM TIMES U
+12322;AL # CUNEIFORM SIGN UMBIN
+12323;AL # CUNEIFORM SIGN UMUM
+12324;AL # CUNEIFORM SIGN UMUM TIMES KASKAL
+12325;AL # CUNEIFORM SIGN UMUM TIMES PA
+12326;AL # CUNEIFORM SIGN UN
+12327;AL # CUNEIFORM SIGN UN GUNU
+12328;AL # CUNEIFORM SIGN UR
+12329;AL # CUNEIFORM SIGN UR CROSSING UR
+1232A;AL # CUNEIFORM SIGN UR SHESHIG
+1232B;AL # CUNEIFORM SIGN UR2
+1232C;AL # CUNEIFORM SIGN UR2 TIMES A PLUS HA
+1232D;AL # CUNEIFORM SIGN UR2 TIMES A PLUS NA
+1232E;AL # CUNEIFORM SIGN UR2 TIMES AL
+1232F;AL # CUNEIFORM SIGN UR2 TIMES HA
+12330;AL # CUNEIFORM SIGN UR2 TIMES NUN
+12331;AL # CUNEIFORM SIGN UR2 TIMES U2
+12332;AL # CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH
+12333;AL # CUNEIFORM SIGN UR2 TIMES U2 PLUS BI
+12334;AL # CUNEIFORM SIGN UR4
+12335;AL # CUNEIFORM SIGN URI
+12336;AL # CUNEIFORM SIGN URI3
+12337;AL # CUNEIFORM SIGN URU
+12338;AL # CUNEIFORM SIGN URU TIMES A
+12339;AL # CUNEIFORM SIGN URU TIMES ASHGAB
+1233A;AL # CUNEIFORM SIGN URU TIMES BAR
+1233B;AL # CUNEIFORM SIGN URU TIMES DUN
+1233C;AL # CUNEIFORM SIGN URU TIMES GA
+1233D;AL # CUNEIFORM SIGN URU TIMES GAL
+1233E;AL # CUNEIFORM SIGN URU TIMES GAN2 TENU
+1233F;AL # CUNEIFORM SIGN URU TIMES GAR
+12340;AL # CUNEIFORM SIGN URU TIMES GU
+12341;AL # CUNEIFORM SIGN URU TIMES HA
+12342;AL # CUNEIFORM SIGN URU TIMES IGI
+12343;AL # CUNEIFORM SIGN URU TIMES IM
+12344;AL # CUNEIFORM SIGN URU TIMES ISH
+12345;AL # CUNEIFORM SIGN URU TIMES KI
+12346;AL # CUNEIFORM SIGN URU TIMES LUM
+12347;AL # CUNEIFORM SIGN URU TIMES MIN
+12348;AL # CUNEIFORM SIGN URU TIMES PA
+12349;AL # CUNEIFORM SIGN URU TIMES SHE
+1234A;AL # CUNEIFORM SIGN URU TIMES SIG4
+1234B;AL # CUNEIFORM SIGN URU TIMES TU
+1234C;AL # CUNEIFORM SIGN URU TIMES U PLUS GUD
+1234D;AL # CUNEIFORM SIGN URU TIMES UD
+1234E;AL # CUNEIFORM SIGN URU TIMES URUDA
+1234F;AL # CUNEIFORM SIGN URUDA
+12350;AL # CUNEIFORM SIGN URUDA TIMES U
+12351;AL # CUNEIFORM SIGN USH
+12352;AL # CUNEIFORM SIGN USH TIMES A
+12353;AL # CUNEIFORM SIGN USH TIMES KU
+12354;AL # CUNEIFORM SIGN USH TIMES KUR
+12355;AL # CUNEIFORM SIGN USH TIMES TAK4
+12356;AL # CUNEIFORM SIGN USHX
+12357;AL # CUNEIFORM SIGN USH2
+12358;AL # CUNEIFORM SIGN USHUMX
+12359;AL # CUNEIFORM SIGN UTUKI
+1235A;AL # CUNEIFORM SIGN UZ3
+1235B;AL # CUNEIFORM SIGN UZ3 TIMES KASKAL
+1235C;AL # CUNEIFORM SIGN UZU
+1235D;AL # CUNEIFORM SIGN ZA
+1235E;AL # CUNEIFORM SIGN ZA TENU
+1235F;AL # CUNEIFORM SIGN ZA SQUARED TIMES KUR
+12360;AL # CUNEIFORM SIGN ZAG
+12361;AL # CUNEIFORM SIGN ZAMX
+12362;AL # CUNEIFORM SIGN ZE2
+12363;AL # CUNEIFORM SIGN ZI
+12364;AL # CUNEIFORM SIGN ZI OVER ZI
+12365;AL # CUNEIFORM SIGN ZI3
+12366;AL # CUNEIFORM SIGN ZIB
+12367;AL # CUNEIFORM SIGN ZIB KABA TENU
+12368;AL # CUNEIFORM SIGN ZIG
+12369;AL # CUNEIFORM SIGN ZIZ2
+1236A;AL # CUNEIFORM SIGN ZU
+1236B;AL # CUNEIFORM SIGN ZU5
+1236C;AL # CUNEIFORM SIGN ZU5 TIMES A
+1236D;AL # CUNEIFORM SIGN ZUBUR
+1236E;AL # CUNEIFORM SIGN ZUM
+12400;AL # CUNEIFORM NUMERIC SIGN TWO ASH
+12401;AL # CUNEIFORM NUMERIC SIGN THREE ASH
+12402;AL # CUNEIFORM NUMERIC SIGN FOUR ASH
+12403;AL # CUNEIFORM NUMERIC SIGN FIVE ASH
+12404;AL # CUNEIFORM NUMERIC SIGN SIX ASH
+12405;AL # CUNEIFORM NUMERIC SIGN SEVEN ASH
+12406;AL # CUNEIFORM NUMERIC SIGN EIGHT ASH
+12407;AL # CUNEIFORM NUMERIC SIGN NINE ASH
+12408;AL # CUNEIFORM NUMERIC SIGN THREE DISH
+12409;AL # CUNEIFORM NUMERIC SIGN FOUR DISH
+1240A;AL # CUNEIFORM NUMERIC SIGN FIVE DISH
+1240B;AL # CUNEIFORM NUMERIC SIGN SIX DISH
+1240C;AL # CUNEIFORM NUMERIC SIGN SEVEN DISH
+1240D;AL # CUNEIFORM NUMERIC SIGN EIGHT DISH
+1240E;AL # CUNEIFORM NUMERIC SIGN NINE DISH
+1240F;AL # CUNEIFORM NUMERIC SIGN FOUR U
+12410;AL # CUNEIFORM NUMERIC SIGN FIVE U
+12411;AL # CUNEIFORM NUMERIC SIGN SIX U
+12412;AL # CUNEIFORM NUMERIC SIGN SEVEN U
+12413;AL # CUNEIFORM NUMERIC SIGN EIGHT U
+12414;AL # CUNEIFORM NUMERIC SIGN NINE U
+12415;AL # CUNEIFORM NUMERIC SIGN ONE GESH2
+12416;AL # CUNEIFORM NUMERIC SIGN TWO GESH2
+12417;AL # CUNEIFORM NUMERIC SIGN THREE GESH2
+12418;AL # CUNEIFORM NUMERIC SIGN FOUR GESH2
+12419;AL # CUNEIFORM NUMERIC SIGN FIVE GESH2
+1241A;AL # CUNEIFORM NUMERIC SIGN SIX GESH2
+1241B;AL # CUNEIFORM NUMERIC SIGN SEVEN GESH2
+1241C;AL # CUNEIFORM NUMERIC SIGN EIGHT GESH2
+1241D;AL # CUNEIFORM NUMERIC SIGN NINE GESH2
+1241E;AL # CUNEIFORM NUMERIC SIGN ONE GESHU
+1241F;AL # CUNEIFORM NUMERIC SIGN TWO GESHU
+12420;AL # CUNEIFORM NUMERIC SIGN THREE GESHU
+12421;AL # CUNEIFORM NUMERIC SIGN FOUR GESHU
+12422;AL # CUNEIFORM NUMERIC SIGN FIVE GESHU
+12423;AL # CUNEIFORM NUMERIC SIGN TWO SHAR2
+12424;AL # CUNEIFORM NUMERIC SIGN THREE SHAR2
+12425;AL # CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM
+12426;AL # CUNEIFORM NUMERIC SIGN FOUR SHAR2
+12427;AL # CUNEIFORM NUMERIC SIGN FIVE SHAR2
+12428;AL # CUNEIFORM NUMERIC SIGN SIX SHAR2
+12429;AL # CUNEIFORM NUMERIC SIGN SEVEN SHAR2
+1242A;AL # CUNEIFORM NUMERIC SIGN EIGHT SHAR2
+1242B;AL # CUNEIFORM NUMERIC SIGN NINE SHAR2
+1242C;AL # CUNEIFORM NUMERIC SIGN ONE SHARU
+1242D;AL # CUNEIFORM NUMERIC SIGN TWO SHARU
+1242E;AL # CUNEIFORM NUMERIC SIGN THREE SHARU
+1242F;AL # CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM
+12430;AL # CUNEIFORM NUMERIC SIGN FOUR SHARU
+12431;AL # CUNEIFORM NUMERIC SIGN FIVE SHARU
+12432;AL # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH
+12433;AL # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN
+12434;AL # CUNEIFORM NUMERIC SIGN ONE BURU
+12435;AL # CUNEIFORM NUMERIC SIGN TWO BURU
+12436;AL # CUNEIFORM NUMERIC SIGN THREE BURU
+12437;AL # CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM
+12438;AL # CUNEIFORM NUMERIC SIGN FOUR BURU
+12439;AL # CUNEIFORM NUMERIC SIGN FIVE BURU
+1243A;AL # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16
+1243B;AL # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21
+1243C;AL # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU
+1243D;AL # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4
+1243E;AL # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A
+1243F;AL # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B
+12440;AL # CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9
+12441;AL # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3
+12442;AL # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A
+12443;AL # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B
+12444;AL # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU
+12445;AL # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3
+12446;AL # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU
+12447;AL # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3
+12448;AL # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4
+12449;AL # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A
+1244A;AL # CUNEIFORM NUMERIC SIGN TWO ASH TENU
+1244B;AL # CUNEIFORM NUMERIC SIGN THREE ASH TENU
+1244C;AL # CUNEIFORM NUMERIC SIGN FOUR ASH TENU
+1244D;AL # CUNEIFORM NUMERIC SIGN FIVE ASH TENU
+1244E;AL # CUNEIFORM NUMERIC SIGN SIX ASH TENU
+1244F;AL # CUNEIFORM NUMERIC SIGN ONE BAN2
+12450;AL # CUNEIFORM NUMERIC SIGN TWO BAN2
+12451;AL # CUNEIFORM NUMERIC SIGN THREE BAN2
+12452;AL # CUNEIFORM NUMERIC SIGN FOUR BAN2
+12453;AL # CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM
+12454;AL # CUNEIFORM NUMERIC SIGN FIVE BAN2
+12455;AL # CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM
+12456;AL # CUNEIFORM NUMERIC SIGN NIGIDAMIN
+12457;AL # CUNEIFORM NUMERIC SIGN NIGIDAESH
+12458;AL # CUNEIFORM NUMERIC SIGN ONE ESHE3
+12459;AL # CUNEIFORM NUMERIC SIGN TWO ESHE3
+1245A;AL # CUNEIFORM NUMERIC SIGN ONE THIRD DISH
+1245B;AL # CUNEIFORM NUMERIC SIGN TWO THIRDS DISH
+1245C;AL # CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH
+1245D;AL # CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A
+1245E;AL # CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A
+1245F;AL # CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH
+12460;AL # CUNEIFORM NUMERIC SIGN ONE QUARTER ASH
+12461;AL # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH
+12462;AL # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+12470;BA # CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER
+12471;BA # CUNEIFORM PUNCTUATION SIGN VERTICAL COLON
+12472;BA # CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON
+12473;BA # CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+1D000;AL # BYZANTINE MUSICAL SYMBOL PSILI
+1D001;AL # BYZANTINE MUSICAL SYMBOL DASEIA
+1D002;AL # BYZANTINE MUSICAL SYMBOL PERISPOMENI
+1D003;AL # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON
+1D004;AL # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI
+1D005;AL # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON
+1D006;AL # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI
+1D007;AL # BYZANTINE MUSICAL SYMBOL KATHISTI
+1D008;AL # BYZANTINE MUSICAL SYMBOL SYRMATIKI
+1D009;AL # BYZANTINE MUSICAL SYMBOL PARAKLITIKI
+1D00A;AL # BYZANTINE MUSICAL SYMBOL YPOKRISIS
+1D00B;AL # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI
+1D00C;AL # BYZANTINE MUSICAL SYMBOL KREMASTI
+1D00D;AL # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON
+1D00E;AL # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON
+1D00F;AL # BYZANTINE MUSICAL SYMBOL TELEIA
+1D010;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA
+1D011;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOS
+1D012;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI
+1D013;AL # BYZANTINE MUSICAL SYMBOL SYNEVMA
+1D014;AL # BYZANTINE MUSICAL SYMBOL THITA
+1D015;AL # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION
+1D016;AL # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION
+1D017;AL # BYZANTINE MUSICAL SYMBOL PSILON
+1D018;AL # BYZANTINE MUSICAL SYMBOL CHAMILON
+1D019;AL # BYZANTINE MUSICAL SYMBOL VATHY
+1D01A;AL # BYZANTINE MUSICAL SYMBOL ISON ARCHAION
+1D01B;AL # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION
+1D01C;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION
+1D01D;AL # BYZANTINE MUSICAL SYMBOL SAXIMATA
+1D01E;AL # BYZANTINE MUSICAL SYMBOL PARICHON
+1D01F;AL # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA
+1D020;AL # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION
+1D021;AL # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION
+1D022;AL # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION
+1D023;AL # BYZANTINE MUSICAL SYMBOL APOTHEMA
+1D024;AL # BYZANTINE MUSICAL SYMBOL KLASMA
+1D025;AL # BYZANTINE MUSICAL SYMBOL REVMA
+1D026;AL # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION
+1D027;AL # BYZANTINE MUSICAL SYMBOL TINAGMA
+1D028;AL # BYZANTINE MUSICAL SYMBOL ANATRICHISMA
+1D029;AL # BYZANTINE MUSICAL SYMBOL SEISMA
+1D02A;AL # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION
+1D02B;AL # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU
+1D02C;AL # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION
+1D02D;AL # BYZANTINE MUSICAL SYMBOL THEMA
+1D02E;AL # BYZANTINE MUSICAL SYMBOL LEMOI
+1D02F;AL # BYZANTINE MUSICAL SYMBOL DYO
+1D030;AL # BYZANTINE MUSICAL SYMBOL TRIA
+1D031;AL # BYZANTINE MUSICAL SYMBOL TESSERA
+1D032;AL # BYZANTINE MUSICAL SYMBOL KRATIMATA
+1D033;AL # BYZANTINE MUSICAL SYMBOL APESO EXO NEO
+1D034;AL # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION
+1D035;AL # BYZANTINE MUSICAL SYMBOL IMIFTHORA
+1D036;AL # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION
+1D037;AL # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON
+1D038;AL # BYZANTINE MUSICAL SYMBOL PELASTON
+1D039;AL # BYZANTINE MUSICAL SYMBOL PSIFISTON
+1D03A;AL # BYZANTINE MUSICAL SYMBOL KONTEVMA
+1D03B;AL # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION
+1D03C;AL # BYZANTINE MUSICAL SYMBOL RAPISMA
+1D03D;AL # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION
+1D03E;AL # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION
+1D03F;AL # BYZANTINE MUSICAL SYMBOL ICHADIN
+1D040;AL # BYZANTINE MUSICAL SYMBOL NANA
+1D041;AL # BYZANTINE MUSICAL SYMBOL PETASMA
+1D042;AL # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO
+1D043;AL # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO
+1D044;AL # BYZANTINE MUSICAL SYMBOL STRAGGISMATA
+1D045;AL # BYZANTINE MUSICAL SYMBOL GRONTHISMATA
+1D046;AL # BYZANTINE MUSICAL SYMBOL ISON NEO
+1D047;AL # BYZANTINE MUSICAL SYMBOL OLIGON NEO
+1D048;AL # BYZANTINE MUSICAL SYMBOL OXEIA NEO
+1D049;AL # BYZANTINE MUSICAL SYMBOL PETASTI
+1D04A;AL # BYZANTINE MUSICAL SYMBOL KOUFISMA
+1D04B;AL # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA
+1D04C;AL # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA
+1D04D;AL # BYZANTINE MUSICAL SYMBOL PELASTON NEO
+1D04E;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO
+1D04F;AL # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO
+1D050;AL # BYZANTINE MUSICAL SYMBOL YPSILI
+1D051;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO
+1D052;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO
+1D053;AL # BYZANTINE MUSICAL SYMBOL YPORROI
+1D054;AL # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON
+1D055;AL # BYZANTINE MUSICAL SYMBOL ELAFRON
+1D056;AL # BYZANTINE MUSICAL SYMBOL CHAMILI
+1D057;AL # BYZANTINE MUSICAL SYMBOL MIKRON ISON
+1D058;AL # BYZANTINE MUSICAL SYMBOL VAREIA NEO
+1D059;AL # BYZANTINE MUSICAL SYMBOL PIASMA NEO
+1D05A;AL # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO
+1D05B;AL # BYZANTINE MUSICAL SYMBOL OMALON
+1D05C;AL # BYZANTINE MUSICAL SYMBOL ANTIKENOMA
+1D05D;AL # BYZANTINE MUSICAL SYMBOL LYGISMA
+1D05E;AL # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO
+1D05F;AL # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO
+1D060;AL # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA
+1D061;AL # BYZANTINE MUSICAL SYMBOL KYLISMA
+1D062;AL # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA
+1D063;AL # BYZANTINE MUSICAL SYMBOL TROMIKON NEO
+1D064;AL # BYZANTINE MUSICAL SYMBOL EKSTREPTON
+1D065;AL # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO
+1D066;AL # BYZANTINE MUSICAL SYMBOL SYRMA
+1D067;AL # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO
+1D068;AL # BYZANTINE MUSICAL SYMBOL EPEGERMA
+1D069;AL # BYZANTINE MUSICAL SYMBOL SEISMA NEO
+1D06A;AL # BYZANTINE MUSICAL SYMBOL XIRON KLASMA
+1D06B;AL # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON
+1D06C;AL # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA
+1D06D;AL # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA
+1D06E;AL # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA
+1D06F;AL # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA
+1D070;AL # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA
+1D071;AL # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA
+1D072;AL # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON
+1D073;AL # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON
+1D074;AL # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON
+1D075;AL # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO
+1D076;AL # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO
+1D077;AL # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO
+1D078;AL # BYZANTINE MUSICAL SYMBOL THEMA APLOUN
+1D079;AL # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES
+1D07A;AL # BYZANTINE MUSICAL SYMBOL KATAVASMA
+1D07B;AL # BYZANTINE MUSICAL SYMBOL ENDOFONON
+1D07C;AL # BYZANTINE MUSICAL SYMBOL YFEN KATO
+1D07D;AL # BYZANTINE MUSICAL SYMBOL YFEN ANO
+1D07E;AL # BYZANTINE MUSICAL SYMBOL STAVROS
+1D07F;AL # BYZANTINE MUSICAL SYMBOL KLASMA ANO
+1D080;AL # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION
+1D081;AL # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION
+1D082;AL # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO
+1D083;AL # BYZANTINE MUSICAL SYMBOL KRATIMA NEO
+1D084;AL # BYZANTINE MUSICAL SYMBOL APODERMA NEO
+1D085;AL # BYZANTINE MUSICAL SYMBOL APLI
+1D086;AL # BYZANTINE MUSICAL SYMBOL DIPLI
+1D087;AL # BYZANTINE MUSICAL SYMBOL TRIPLI
+1D088;AL # BYZANTINE MUSICAL SYMBOL TETRAPLI
+1D089;AL # BYZANTINE MUSICAL SYMBOL KORONIS
+1D08A;AL # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU
+1D08B;AL # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON
+1D08C;AL # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON
+1D08D;AL # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON
+1D08E;AL # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU
+1D08F;AL # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO
+1D090;AL # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA
+1D091;AL # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA
+1D092;AL # BYZANTINE MUSICAL SYMBOL DIGORGON
+1D093;AL # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO
+1D094;AL # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO
+1D095;AL # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA
+1D096;AL # BYZANTINE MUSICAL SYMBOL TRIGORGON
+1D097;AL # BYZANTINE MUSICAL SYMBOL ARGON
+1D098;AL # BYZANTINE MUSICAL SYMBOL IMIDIARGON
+1D099;AL # BYZANTINE MUSICAL SYMBOL DIARGON
+1D09A;AL # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI
+1D09B;AL # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI
+1D09C;AL # BYZANTINE MUSICAL SYMBOL AGOGI ARGI
+1D09D;AL # BYZANTINE MUSICAL SYMBOL AGOGI METRIA
+1D09E;AL # BYZANTINE MUSICAL SYMBOL AGOGI MESI
+1D09F;AL # BYZANTINE MUSICAL SYMBOL AGOGI GORGI
+1D0A0;AL # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI
+1D0A1;AL # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI
+1D0A2;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS
+1D0A3;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS
+1D0A4;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS
+1D0A5;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS
+1D0A6;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS
+1D0A7;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS
+1D0A8;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS
+1D0A9;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS
+1D0AB;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS
+1D0AC;AL # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS
+1D0AD;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS
+1D0AE;AL # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS
+1D0AF;AL # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS
+1D0B0;AL # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS
+1D0B1;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS
+1D0B2;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS
+1D0B3;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4;AL # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN
+1D0B5;AL # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN
+1D0B6;AL # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU
+1D0B7;AL # BYZANTINE MUSICAL SYMBOL IMIFONON
+1D0B8;AL # BYZANTINE MUSICAL SYMBOL IMIFTHORON
+1D0B9;AL # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU
+1D0BA;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA
+1D0BB;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA
+1D0BC;AL # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS
+1D0BD;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI
+1D0BE;AL # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI
+1D0BF;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE
+1D0C0;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO
+1D0C1;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO
+1D0C2;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO
+1D0C3;AL # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
+1D0C4;AL # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
+1D0C5;AL # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+1D0C6;AL # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
+1D0C7;AL # BYZANTINE MUSICAL SYMBOL FTHORA NENANO
+1D0C8;AL # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
+1D0C9;AL # BYZANTINE MUSICAL SYMBOL CHROA KLITON
+1D0CA;AL # BYZANTINE MUSICAL SYMBOL CHROA SPATHI
+1D0CB;AL # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION
+1D0CC;AL # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA
+1D0CD;AL # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION
+1D0CE;AL # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION
+1D0CF;AL # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION
+1D0D0;AL # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA
+1D0D1;AL # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2;AL # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA
+1D0D3;AL # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4;AL # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA
+1D0D5;AL # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6;AL # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA
+1D0D7;AL # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8;AL # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS
+1D0D9;AL # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS
+1D0DA;AL # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI
+1D0DB;AL # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI
+1D0DC;AL # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI
+1D0DD;AL # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS
+1D0DE;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS
+1D0DF;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU
+1D0E0;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU
+1D0E1;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU
+1D0E2;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS
+1D0E3;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU
+1D0E4;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU
+1D0E5;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU
+1D0E6;AL # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG
+1D0E7;AL # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU
+1D0E8;AL # BYZANTINE MUSICAL SYMBOL STIGMA
+1D0E9;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO PA
+1D0EA;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU
+1D0EB;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO GA
+1D0EC;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO DI
+1D0ED;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO KE
+1D0EE;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO
+1D0EF;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO NI
+1D0F0;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO
+1D0F1;AL # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO
+1D0F2;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO
+1D0F3;AL # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO
+1D0F4;AL # BYZANTINE MUSICAL SYMBOL KLASMA KATO
+1D0F5;AL # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100;AL # MUSICAL SYMBOL SINGLE BARLINE
+1D101;AL # MUSICAL SYMBOL DOUBLE BARLINE
+1D102;AL # MUSICAL SYMBOL FINAL BARLINE
+1D103;AL # MUSICAL SYMBOL REVERSE FINAL BARLINE
+1D104;AL # MUSICAL SYMBOL DASHED BARLINE
+1D105;AL # MUSICAL SYMBOL SHORT BARLINE
+1D106;AL # MUSICAL SYMBOL LEFT REPEAT SIGN
+1D107;AL # MUSICAL SYMBOL RIGHT REPEAT SIGN
+1D108;AL # MUSICAL SYMBOL REPEAT DOTS
+1D109;AL # MUSICAL SYMBOL DAL SEGNO
+1D10A;AL # MUSICAL SYMBOL DA CAPO
+1D10B;AL # MUSICAL SYMBOL SEGNO
+1D10C;AL # MUSICAL SYMBOL CODA
+1D10D;AL # MUSICAL SYMBOL REPEATED FIGURE-1
+1D10E;AL # MUSICAL SYMBOL REPEATED FIGURE-2
+1D10F;AL # MUSICAL SYMBOL REPEATED FIGURE-3
+1D110;AL # MUSICAL SYMBOL FERMATA
+1D111;AL # MUSICAL SYMBOL FERMATA BELOW
+1D112;AL # MUSICAL SYMBOL BREATH MARK
+1D113;AL # MUSICAL SYMBOL CAESURA
+1D114;AL # MUSICAL SYMBOL BRACE
+1D115;AL # MUSICAL SYMBOL BRACKET
+1D116;AL # MUSICAL SYMBOL ONE-LINE STAFF
+1D117;AL # MUSICAL SYMBOL TWO-LINE STAFF
+1D118;AL # MUSICAL SYMBOL THREE-LINE STAFF
+1D119;AL # MUSICAL SYMBOL FOUR-LINE STAFF
+1D11A;AL # MUSICAL SYMBOL FIVE-LINE STAFF
+1D11B;AL # MUSICAL SYMBOL SIX-LINE STAFF
+1D11C;AL # MUSICAL SYMBOL SIX-STRING FRETBOARD
+1D11D;AL # MUSICAL SYMBOL FOUR-STRING FRETBOARD
+1D11E;AL # MUSICAL SYMBOL G CLEF
+1D11F;AL # MUSICAL SYMBOL G CLEF OTTAVA ALTA
+1D120;AL # MUSICAL SYMBOL G CLEF OTTAVA BASSA
+1D121;AL # MUSICAL SYMBOL C CLEF
+1D122;AL # MUSICAL SYMBOL F CLEF
+1D123;AL # MUSICAL SYMBOL F CLEF OTTAVA ALTA
+1D124;AL # MUSICAL SYMBOL F CLEF OTTAVA BASSA
+1D125;AL # MUSICAL SYMBOL DRUM CLEF-1
+1D126;AL # MUSICAL SYMBOL DRUM CLEF-2
+1D129;AL # MUSICAL SYMBOL MULTIPLE MEASURE REST
+1D12A;AL # MUSICAL SYMBOL DOUBLE SHARP
+1D12B;AL # MUSICAL SYMBOL DOUBLE FLAT
+1D12C;AL # MUSICAL SYMBOL FLAT UP
+1D12D;AL # MUSICAL SYMBOL FLAT DOWN
+1D12E;AL # MUSICAL SYMBOL NATURAL UP
+1D12F;AL # MUSICAL SYMBOL NATURAL DOWN
+1D130;AL # MUSICAL SYMBOL SHARP UP
+1D131;AL # MUSICAL SYMBOL SHARP DOWN
+1D132;AL # MUSICAL SYMBOL QUARTER TONE SHARP
+1D133;AL # MUSICAL SYMBOL QUARTER TONE FLAT
+1D134;AL # MUSICAL SYMBOL COMMON TIME
+1D135;AL # MUSICAL SYMBOL CUT TIME
+1D136;AL # MUSICAL SYMBOL OTTAVA ALTA
+1D137;AL # MUSICAL SYMBOL OTTAVA BASSA
+1D138;AL # MUSICAL SYMBOL QUINDICESIMA ALTA
+1D139;AL # MUSICAL SYMBOL QUINDICESIMA BASSA
+1D13A;AL # MUSICAL SYMBOL MULTI REST
+1D13B;AL # MUSICAL SYMBOL WHOLE REST
+1D13C;AL # MUSICAL SYMBOL HALF REST
+1D13D;AL # MUSICAL SYMBOL QUARTER REST
+1D13E;AL # MUSICAL SYMBOL EIGHTH REST
+1D13F;AL # MUSICAL SYMBOL SIXTEENTH REST
+1D140;AL # MUSICAL SYMBOL THIRTY-SECOND REST
+1D141;AL # MUSICAL SYMBOL SIXTY-FOURTH REST
+1D142;AL # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST
+1D143;AL # MUSICAL SYMBOL X NOTEHEAD
+1D144;AL # MUSICAL SYMBOL PLUS NOTEHEAD
+1D145;AL # MUSICAL SYMBOL CIRCLE X NOTEHEAD
+1D146;AL # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE
+1D147;AL # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK
+1D148;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE
+1D149;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK
+1D14A;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE
+1D14B;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK
+1D14C;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE
+1D14D;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK
+1D14E;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE
+1D14F;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK
+1D150;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE
+1D151;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK
+1D152;AL # MUSICAL SYMBOL MOON NOTEHEAD WHITE
+1D153;AL # MUSICAL SYMBOL MOON NOTEHEAD BLACK
+1D154;AL # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE
+1D155;AL # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK
+1D156;AL # MUSICAL SYMBOL PARENTHESIS NOTEHEAD
+1D157;AL # MUSICAL SYMBOL VOID NOTEHEAD
+1D158;AL # MUSICAL SYMBOL NOTEHEAD BLACK
+1D159;AL # MUSICAL SYMBOL NULL NOTEHEAD
+1D15A;AL # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE
+1D15B;AL # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK
+1D15C;AL # MUSICAL SYMBOL BREVE
+1D15D;AL # MUSICAL SYMBOL WHOLE NOTE
+1D15E;AL # MUSICAL SYMBOL HALF NOTE
+1D15F;AL # MUSICAL SYMBOL QUARTER NOTE
+1D160;AL # MUSICAL SYMBOL EIGHTH NOTE
+1D161;AL # MUSICAL SYMBOL SIXTEENTH NOTE
+1D162;AL # MUSICAL SYMBOL THIRTY-SECOND NOTE
+1D163;AL # MUSICAL SYMBOL SIXTY-FOURTH NOTE
+1D164;AL # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D165;CM # MUSICAL SYMBOL COMBINING STEM
+1D166;CM # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167;CM # MUSICAL SYMBOL COMBINING TREMOLO-1
+1D168;CM # MUSICAL SYMBOL COMBINING TREMOLO-2
+1D169;CM # MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A;AL # MUSICAL SYMBOL FINGERED TREMOLO-1
+1D16B;AL # MUSICAL SYMBOL FINGERED TREMOLO-2
+1D16C;AL # MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D;CM # MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+1D16E;CM # MUSICAL SYMBOL COMBINING FLAG-1
+1D16F;CM # MUSICAL SYMBOL COMBINING FLAG-2
+1D170;CM # MUSICAL SYMBOL COMBINING FLAG-3
+1D171;CM # MUSICAL SYMBOL COMBINING FLAG-4
+1D172;CM # MUSICAL SYMBOL COMBINING FLAG-5
+1D173;CM # MUSICAL SYMBOL BEGIN BEAM
+1D174;CM # MUSICAL SYMBOL END BEAM
+1D175;CM # MUSICAL SYMBOL BEGIN TIE
+1D176;CM # MUSICAL SYMBOL END TIE
+1D177;CM # MUSICAL SYMBOL BEGIN SLUR
+1D178;CM # MUSICAL SYMBOL END SLUR
+1D179;CM # MUSICAL SYMBOL BEGIN PHRASE
+1D17A;CM # MUSICAL SYMBOL END PHRASE
+1D17B;CM # MUSICAL SYMBOL COMBINING ACCENT
+1D17C;CM # MUSICAL SYMBOL COMBINING STACCATO
+1D17D;CM # MUSICAL SYMBOL COMBINING TENUTO
+1D17E;CM # MUSICAL SYMBOL COMBINING STACCATISSIMO
+1D17F;CM # MUSICAL SYMBOL COMBINING MARCATO
+1D180;CM # MUSICAL SYMBOL COMBINING MARCATO-STACCATO
+1D181;CM # MUSICAL SYMBOL COMBINING ACCENT-STACCATO
+1D182;CM # MUSICAL SYMBOL COMBINING LOURE
+1D183;AL # MUSICAL SYMBOL ARPEGGIATO UP
+1D184;AL # MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185;CM # MUSICAL SYMBOL COMBINING DOIT
+1D186;CM # MUSICAL SYMBOL COMBINING RIP
+1D187;CM # MUSICAL SYMBOL COMBINING FLIP
+1D188;CM # MUSICAL SYMBOL COMBINING SMEAR
+1D189;CM # MUSICAL SYMBOL COMBINING BEND
+1D18A;CM # MUSICAL SYMBOL COMBINING DOUBLE TONGUE
+1D18B;CM # MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C;AL # MUSICAL SYMBOL RINFORZANDO
+1D18D;AL # MUSICAL SYMBOL SUBITO
+1D18E;AL # MUSICAL SYMBOL Z
+1D18F;AL # MUSICAL SYMBOL PIANO
+1D190;AL # MUSICAL SYMBOL MEZZO
+1D191;AL # MUSICAL SYMBOL FORTE
+1D192;AL # MUSICAL SYMBOL CRESCENDO
+1D193;AL # MUSICAL SYMBOL DECRESCENDO
+1D194;AL # MUSICAL SYMBOL GRACE NOTE SLASH
+1D195;AL # MUSICAL SYMBOL GRACE NOTE NO SLASH
+1D196;AL # MUSICAL SYMBOL TR
+1D197;AL # MUSICAL SYMBOL TURN
+1D198;AL # MUSICAL SYMBOL INVERTED TURN
+1D199;AL # MUSICAL SYMBOL TURN SLASH
+1D19A;AL # MUSICAL SYMBOL TURN UP
+1D19B;AL # MUSICAL SYMBOL ORNAMENT STROKE-1
+1D19C;AL # MUSICAL SYMBOL ORNAMENT STROKE-2
+1D19D;AL # MUSICAL SYMBOL ORNAMENT STROKE-3
+1D19E;AL # MUSICAL SYMBOL ORNAMENT STROKE-4
+1D19F;AL # MUSICAL SYMBOL ORNAMENT STROKE-5
+1D1A0;AL # MUSICAL SYMBOL ORNAMENT STROKE-6
+1D1A1;AL # MUSICAL SYMBOL ORNAMENT STROKE-7
+1D1A2;AL # MUSICAL SYMBOL ORNAMENT STROKE-8
+1D1A3;AL # MUSICAL SYMBOL ORNAMENT STROKE-9
+1D1A4;AL # MUSICAL SYMBOL ORNAMENT STROKE-10
+1D1A5;AL # MUSICAL SYMBOL ORNAMENT STROKE-11
+1D1A6;AL # MUSICAL SYMBOL HAUPTSTIMME
+1D1A7;AL # MUSICAL SYMBOL NEBENSTIMME
+1D1A8;AL # MUSICAL SYMBOL END OF STIMME
+1D1A9;AL # MUSICAL SYMBOL DEGREE SLASH
+1D1AA;CM # MUSICAL SYMBOL COMBINING DOWN BOW
+1D1AB;CM # MUSICAL SYMBOL COMBINING UP BOW
+1D1AC;CM # MUSICAL SYMBOL COMBINING HARMONIC
+1D1AD;CM # MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D1AE;AL # MUSICAL SYMBOL PEDAL MARK
+1D1AF;AL # MUSICAL SYMBOL PEDAL UP MARK
+1D1B0;AL # MUSICAL SYMBOL HALF PEDAL MARK
+1D1B1;AL # MUSICAL SYMBOL GLISSANDO UP
+1D1B2;AL # MUSICAL SYMBOL GLISSANDO DOWN
+1D1B3;AL # MUSICAL SYMBOL WITH FINGERNAILS
+1D1B4;AL # MUSICAL SYMBOL DAMP
+1D1B5;AL # MUSICAL SYMBOL DAMP ALL
+1D1B6;AL # MUSICAL SYMBOL MAXIMA
+1D1B7;AL # MUSICAL SYMBOL LONGA
+1D1B8;AL # MUSICAL SYMBOL BREVIS
+1D1B9;AL # MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA;AL # MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB;AL # MUSICAL SYMBOL MINIMA
+1D1BC;AL # MUSICAL SYMBOL MINIMA BLACK
+1D1BD;AL # MUSICAL SYMBOL SEMIMINIMA WHITE
+1D1BE;AL # MUSICAL SYMBOL SEMIMINIMA BLACK
+1D1BF;AL # MUSICAL SYMBOL FUSA WHITE
+1D1C0;AL # MUSICAL SYMBOL FUSA BLACK
+1D1C1;AL # MUSICAL SYMBOL LONGA PERFECTA REST
+1D1C2;AL # MUSICAL SYMBOL LONGA IMPERFECTA REST
+1D1C3;AL # MUSICAL SYMBOL BREVIS REST
+1D1C4;AL # MUSICAL SYMBOL SEMIBREVIS REST
+1D1C5;AL # MUSICAL SYMBOL MINIMA REST
+1D1C6;AL # MUSICAL SYMBOL SEMIMINIMA REST
+1D1C7;AL # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA
+1D1C8;AL # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA
+1D1C9;AL # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1
+1D1CA;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA
+1D1CB;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA
+1D1CC;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1
+1D1CD;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2
+1D1CE;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3
+1D1CF;AL # MUSICAL SYMBOL CROIX
+1D1D0;AL # MUSICAL SYMBOL GREGORIAN C CLEF
+1D1D1;AL # MUSICAL SYMBOL GREGORIAN F CLEF
+1D1D2;AL # MUSICAL SYMBOL SQUARE B
+1D1D3;AL # MUSICAL SYMBOL VIRGA
+1D1D4;AL # MUSICAL SYMBOL PODATUS
+1D1D5;AL # MUSICAL SYMBOL CLIVIS
+1D1D6;AL # MUSICAL SYMBOL SCANDICUS
+1D1D7;AL # MUSICAL SYMBOL CLIMACUS
+1D1D8;AL # MUSICAL SYMBOL TORCULUS
+1D1D9;AL # MUSICAL SYMBOL PORRECTUS
+1D1DA;AL # MUSICAL SYMBOL PORRECTUS FLEXUS
+1D1DB;AL # MUSICAL SYMBOL SCANDICUS FLEXUS
+1D1DC;AL # MUSICAL SYMBOL TORCULUS RESUPINUS
+1D1DD;AL # MUSICAL SYMBOL PES SUBPUNCTIS
+1D200;AL # GREEK VOCAL NOTATION SYMBOL-1
+1D201;AL # GREEK VOCAL NOTATION SYMBOL-2
+1D202;AL # GREEK VOCAL NOTATION SYMBOL-3
+1D203;AL # GREEK VOCAL NOTATION SYMBOL-4
+1D204;AL # GREEK VOCAL NOTATION SYMBOL-5
+1D205;AL # GREEK VOCAL NOTATION SYMBOL-6
+1D206;AL # GREEK VOCAL NOTATION SYMBOL-7
+1D207;AL # GREEK VOCAL NOTATION SYMBOL-8
+1D208;AL # GREEK VOCAL NOTATION SYMBOL-9
+1D209;AL # GREEK VOCAL NOTATION SYMBOL-10
+1D20A;AL # GREEK VOCAL NOTATION SYMBOL-11
+1D20B;AL # GREEK VOCAL NOTATION SYMBOL-12
+1D20C;AL # GREEK VOCAL NOTATION SYMBOL-13
+1D20D;AL # GREEK VOCAL NOTATION SYMBOL-14
+1D20E;AL # GREEK VOCAL NOTATION SYMBOL-15
+1D20F;AL # GREEK VOCAL NOTATION SYMBOL-16
+1D210;AL # GREEK VOCAL NOTATION SYMBOL-17
+1D211;AL # GREEK VOCAL NOTATION SYMBOL-18
+1D212;AL # GREEK VOCAL NOTATION SYMBOL-19
+1D213;AL # GREEK VOCAL NOTATION SYMBOL-20
+1D214;AL # GREEK VOCAL NOTATION SYMBOL-21
+1D215;AL # GREEK VOCAL NOTATION SYMBOL-22
+1D216;AL # GREEK VOCAL NOTATION SYMBOL-23
+1D217;AL # GREEK VOCAL NOTATION SYMBOL-24
+1D218;AL # GREEK VOCAL NOTATION SYMBOL-50
+1D219;AL # GREEK VOCAL NOTATION SYMBOL-51
+1D21A;AL # GREEK VOCAL NOTATION SYMBOL-52
+1D21B;AL # GREEK VOCAL NOTATION SYMBOL-53
+1D21C;AL # GREEK VOCAL NOTATION SYMBOL-54
+1D21D;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-1
+1D21E;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-2
+1D21F;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-4
+1D220;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-5
+1D221;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-7
+1D222;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-8
+1D223;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-11
+1D224;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-12
+1D225;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-13
+1D226;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-14
+1D227;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-17
+1D228;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-18
+1D229;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-19
+1D22A;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-23
+1D22B;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-24
+1D22C;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-25
+1D22D;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-26
+1D22E;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-27
+1D22F;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-29
+1D230;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-30
+1D231;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-32
+1D232;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-36
+1D233;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-37
+1D234;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-38
+1D235;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-39
+1D236;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-40
+1D237;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-42
+1D238;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-43
+1D239;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-45
+1D23A;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-47
+1D23B;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-48
+1D23C;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-49
+1D23D;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-50
+1D23E;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-51
+1D23F;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-52
+1D240;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-53
+1D241;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242;CM # COMBINING GREEK MUSICAL TRISEME
+1D243;CM # COMBINING GREEK MUSICAL TETRASEME
+1D244;CM # COMBINING GREEK MUSICAL PENTASEME
+1D245;AL # GREEK MUSICAL LEIMMA
+1D300;AL # MONOGRAM FOR EARTH
+1D301;AL # DIGRAM FOR HEAVENLY EARTH
+1D302;AL # DIGRAM FOR HUMAN EARTH
+1D303;AL # DIGRAM FOR EARTHLY HEAVEN
+1D304;AL # DIGRAM FOR EARTHLY HUMAN
+1D305;AL # DIGRAM FOR EARTH
+1D306;AL # TETRAGRAM FOR CENTRE
+1D307;AL # TETRAGRAM FOR FULL CIRCLE
+1D308;AL # TETRAGRAM FOR MIRED
+1D309;AL # TETRAGRAM FOR BARRIER
+1D30A;AL # TETRAGRAM FOR KEEPING SMALL
+1D30B;AL # TETRAGRAM FOR CONTRARIETY
+1D30C;AL # TETRAGRAM FOR ASCENT
+1D30D;AL # TETRAGRAM FOR OPPOSITION
+1D30E;AL # TETRAGRAM FOR BRANCHING OUT
+1D30F;AL # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310;AL # TETRAGRAM FOR DIVERGENCE
+1D311;AL # TETRAGRAM FOR YOUTHFULNESS
+1D312;AL # TETRAGRAM FOR INCREASE
+1D313;AL # TETRAGRAM FOR PENETRATION
+1D314;AL # TETRAGRAM FOR REACH
+1D315;AL # TETRAGRAM FOR CONTACT
+1D316;AL # TETRAGRAM FOR HOLDING BACK
+1D317;AL # TETRAGRAM FOR WAITING
+1D318;AL # TETRAGRAM FOR FOLLOWING
+1D319;AL # TETRAGRAM FOR ADVANCE
+1D31A;AL # TETRAGRAM FOR RELEASE
+1D31B;AL # TETRAGRAM FOR RESISTANCE
+1D31C;AL # TETRAGRAM FOR EASE
+1D31D;AL # TETRAGRAM FOR JOY
+1D31E;AL # TETRAGRAM FOR CONTENTION
+1D31F;AL # TETRAGRAM FOR ENDEAVOUR
+1D320;AL # TETRAGRAM FOR DUTIES
+1D321;AL # TETRAGRAM FOR CHANGE
+1D322;AL # TETRAGRAM FOR DECISIVENESS
+1D323;AL # TETRAGRAM FOR BOLD RESOLUTION
+1D324;AL # TETRAGRAM FOR PACKING
+1D325;AL # TETRAGRAM FOR LEGION
+1D326;AL # TETRAGRAM FOR CLOSENESS
+1D327;AL # TETRAGRAM FOR KINSHIP
+1D328;AL # TETRAGRAM FOR GATHERING
+1D329;AL # TETRAGRAM FOR STRENGTH
+1D32A;AL # TETRAGRAM FOR PURITY
+1D32B;AL # TETRAGRAM FOR FULLNESS
+1D32C;AL # TETRAGRAM FOR RESIDENCE
+1D32D;AL # TETRAGRAM FOR LAW OR MODEL
+1D32E;AL # TETRAGRAM FOR RESPONSE
+1D32F;AL # TETRAGRAM FOR GOING TO MEET
+1D330;AL # TETRAGRAM FOR ENCOUNTERS
+1D331;AL # TETRAGRAM FOR STOVE
+1D332;AL # TETRAGRAM FOR GREATNESS
+1D333;AL # TETRAGRAM FOR ENLARGEMENT
+1D334;AL # TETRAGRAM FOR PATTERN
+1D335;AL # TETRAGRAM FOR RITUAL
+1D336;AL # TETRAGRAM FOR FLIGHT
+1D337;AL # TETRAGRAM FOR VASTNESS OR WASTING
+1D338;AL # TETRAGRAM FOR CONSTANCY
+1D339;AL # TETRAGRAM FOR MEASURE
+1D33A;AL # TETRAGRAM FOR ETERNITY
+1D33B;AL # TETRAGRAM FOR UNITY
+1D33C;AL # TETRAGRAM FOR DIMINISHMENT
+1D33D;AL # TETRAGRAM FOR CLOSED MOUTH
+1D33E;AL # TETRAGRAM FOR GUARDEDNESS
+1D33F;AL # TETRAGRAM FOR GATHERING IN
+1D340;AL # TETRAGRAM FOR MASSING
+1D341;AL # TETRAGRAM FOR ACCUMULATION
+1D342;AL # TETRAGRAM FOR EMBELLISHMENT
+1D343;AL # TETRAGRAM FOR DOUBT
+1D344;AL # TETRAGRAM FOR WATCH
+1D345;AL # TETRAGRAM FOR SINKING
+1D346;AL # TETRAGRAM FOR INNER
+1D347;AL # TETRAGRAM FOR DEPARTURE
+1D348;AL # TETRAGRAM FOR DARKENING
+1D349;AL # TETRAGRAM FOR DIMMING
+1D34A;AL # TETRAGRAM FOR EXHAUSTION
+1D34B;AL # TETRAGRAM FOR SEVERANCE
+1D34C;AL # TETRAGRAM FOR STOPPAGE
+1D34D;AL # TETRAGRAM FOR HARDNESS
+1D34E;AL # TETRAGRAM FOR COMPLETION
+1D34F;AL # TETRAGRAM FOR CLOSURE
+1D350;AL # TETRAGRAM FOR FAILURE
+1D351;AL # TETRAGRAM FOR AGGRAVATION
+1D352;AL # TETRAGRAM FOR COMPLIANCE
+1D353;AL # TETRAGRAM FOR ON THE VERGE
+1D354;AL # TETRAGRAM FOR DIFFICULTIES
+1D355;AL # TETRAGRAM FOR LABOURING
+1D356;AL # TETRAGRAM FOR FOSTERING
+1D360;AL # COUNTING ROD UNIT DIGIT ONE
+1D361;AL # COUNTING ROD UNIT DIGIT TWO
+1D362;AL # COUNTING ROD UNIT DIGIT THREE
+1D363;AL # COUNTING ROD UNIT DIGIT FOUR
+1D364;AL # COUNTING ROD UNIT DIGIT FIVE
+1D365;AL # COUNTING ROD UNIT DIGIT SIX
+1D366;AL # COUNTING ROD UNIT DIGIT SEVEN
+1D367;AL # COUNTING ROD UNIT DIGIT EIGHT
+1D368;AL # COUNTING ROD UNIT DIGIT NINE
+1D369;AL # COUNTING ROD TENS DIGIT ONE
+1D36A;AL # COUNTING ROD TENS DIGIT TWO
+1D36B;AL # COUNTING ROD TENS DIGIT THREE
+1D36C;AL # COUNTING ROD TENS DIGIT FOUR
+1D36D;AL # COUNTING ROD TENS DIGIT FIVE
+1D36E;AL # COUNTING ROD TENS DIGIT SIX
+1D36F;AL # COUNTING ROD TENS DIGIT SEVEN
+1D370;AL # COUNTING ROD TENS DIGIT EIGHT
+1D371;AL # COUNTING ROD TENS DIGIT NINE
+1D400;AL # MATHEMATICAL BOLD CAPITAL A
+1D401;AL # MATHEMATICAL BOLD CAPITAL B
+1D402;AL # MATHEMATICAL BOLD CAPITAL C
+1D403;AL # MATHEMATICAL BOLD CAPITAL D
+1D404;AL # MATHEMATICAL BOLD CAPITAL E
+1D405;AL # MATHEMATICAL BOLD CAPITAL F
+1D406;AL # MATHEMATICAL BOLD CAPITAL G
+1D407;AL # MATHEMATICAL BOLD CAPITAL H
+1D408;AL # MATHEMATICAL BOLD CAPITAL I
+1D409;AL # MATHEMATICAL BOLD CAPITAL J
+1D40A;AL # MATHEMATICAL BOLD CAPITAL K
+1D40B;AL # MATHEMATICAL BOLD CAPITAL L
+1D40C;AL # MATHEMATICAL BOLD CAPITAL M
+1D40D;AL # MATHEMATICAL BOLD CAPITAL N
+1D40E;AL # MATHEMATICAL BOLD CAPITAL O
+1D40F;AL # MATHEMATICAL BOLD CAPITAL P
+1D410;AL # MATHEMATICAL BOLD CAPITAL Q
+1D411;AL # MATHEMATICAL BOLD CAPITAL R
+1D412;AL # MATHEMATICAL BOLD CAPITAL S
+1D413;AL # MATHEMATICAL BOLD CAPITAL T
+1D414;AL # MATHEMATICAL BOLD CAPITAL U
+1D415;AL # MATHEMATICAL BOLD CAPITAL V
+1D416;AL # MATHEMATICAL BOLD CAPITAL W
+1D417;AL # MATHEMATICAL BOLD CAPITAL X
+1D418;AL # MATHEMATICAL BOLD CAPITAL Y
+1D419;AL # MATHEMATICAL BOLD CAPITAL Z
+1D41A;AL # MATHEMATICAL BOLD SMALL A
+1D41B;AL # MATHEMATICAL BOLD SMALL B
+1D41C;AL # MATHEMATICAL BOLD SMALL C
+1D41D;AL # MATHEMATICAL BOLD SMALL D
+1D41E;AL # MATHEMATICAL BOLD SMALL E
+1D41F;AL # MATHEMATICAL BOLD SMALL F
+1D420;AL # MATHEMATICAL BOLD SMALL G
+1D421;AL # MATHEMATICAL BOLD SMALL H
+1D422;AL # MATHEMATICAL BOLD SMALL I
+1D423;AL # MATHEMATICAL BOLD SMALL J
+1D424;AL # MATHEMATICAL BOLD SMALL K
+1D425;AL # MATHEMATICAL BOLD SMALL L
+1D426;AL # MATHEMATICAL BOLD SMALL M
+1D427;AL # MATHEMATICAL BOLD SMALL N
+1D428;AL # MATHEMATICAL BOLD SMALL O
+1D429;AL # MATHEMATICAL BOLD SMALL P
+1D42A;AL # MATHEMATICAL BOLD SMALL Q
+1D42B;AL # MATHEMATICAL BOLD SMALL R
+1D42C;AL # MATHEMATICAL BOLD SMALL S
+1D42D;AL # MATHEMATICAL BOLD SMALL T
+1D42E;AL # MATHEMATICAL BOLD SMALL U
+1D42F;AL # MATHEMATICAL BOLD SMALL V
+1D430;AL # MATHEMATICAL BOLD SMALL W
+1D431;AL # MATHEMATICAL BOLD SMALL X
+1D432;AL # MATHEMATICAL BOLD SMALL Y
+1D433;AL # MATHEMATICAL BOLD SMALL Z
+1D434;AL # MATHEMATICAL ITALIC CAPITAL A
+1D435;AL # MATHEMATICAL ITALIC CAPITAL B
+1D436;AL # MATHEMATICAL ITALIC CAPITAL C
+1D437;AL # MATHEMATICAL ITALIC CAPITAL D
+1D438;AL # MATHEMATICAL ITALIC CAPITAL E
+1D439;AL # MATHEMATICAL ITALIC CAPITAL F
+1D43A;AL # MATHEMATICAL ITALIC CAPITAL G
+1D43B;AL # MATHEMATICAL ITALIC CAPITAL H
+1D43C;AL # MATHEMATICAL ITALIC CAPITAL I
+1D43D;AL # MATHEMATICAL ITALIC CAPITAL J
+1D43E;AL # MATHEMATICAL ITALIC CAPITAL K
+1D43F;AL # MATHEMATICAL ITALIC CAPITAL L
+1D440;AL # MATHEMATICAL ITALIC CAPITAL M
+1D441;AL # MATHEMATICAL ITALIC CAPITAL N
+1D442;AL # MATHEMATICAL ITALIC CAPITAL O
+1D443;AL # MATHEMATICAL ITALIC CAPITAL P
+1D444;AL # MATHEMATICAL ITALIC CAPITAL Q
+1D445;AL # MATHEMATICAL ITALIC CAPITAL R
+1D446;AL # MATHEMATICAL ITALIC CAPITAL S
+1D447;AL # MATHEMATICAL ITALIC CAPITAL T
+1D448;AL # MATHEMATICAL ITALIC CAPITAL U
+1D449;AL # MATHEMATICAL ITALIC CAPITAL V
+1D44A;AL # MATHEMATICAL ITALIC CAPITAL W
+1D44B;AL # MATHEMATICAL ITALIC CAPITAL X
+1D44C;AL # MATHEMATICAL ITALIC CAPITAL Y
+1D44D;AL # MATHEMATICAL ITALIC CAPITAL Z
+1D44E;AL # MATHEMATICAL ITALIC SMALL A
+1D44F;AL # MATHEMATICAL ITALIC SMALL B
+1D450;AL # MATHEMATICAL ITALIC SMALL C
+1D451;AL # MATHEMATICAL ITALIC SMALL D
+1D452;AL # MATHEMATICAL ITALIC SMALL E
+1D453;AL # MATHEMATICAL ITALIC SMALL F
+1D454;AL # MATHEMATICAL ITALIC SMALL G
+1D456;AL # MATHEMATICAL ITALIC SMALL I
+1D457;AL # MATHEMATICAL ITALIC SMALL J
+1D458;AL # MATHEMATICAL ITALIC SMALL K
+1D459;AL # MATHEMATICAL ITALIC SMALL L
+1D45A;AL # MATHEMATICAL ITALIC SMALL M
+1D45B;AL # MATHEMATICAL ITALIC SMALL N
+1D45C;AL # MATHEMATICAL ITALIC SMALL O
+1D45D;AL # MATHEMATICAL ITALIC SMALL P
+1D45E;AL # MATHEMATICAL ITALIC SMALL Q
+1D45F;AL # MATHEMATICAL ITALIC SMALL R
+1D460;AL # MATHEMATICAL ITALIC SMALL S
+1D461;AL # MATHEMATICAL ITALIC SMALL T
+1D462;AL # MATHEMATICAL ITALIC SMALL U
+1D463;AL # MATHEMATICAL ITALIC SMALL V
+1D464;AL # MATHEMATICAL ITALIC SMALL W
+1D465;AL # MATHEMATICAL ITALIC SMALL X
+1D466;AL # MATHEMATICAL ITALIC SMALL Y
+1D467;AL # MATHEMATICAL ITALIC SMALL Z
+1D468;AL # MATHEMATICAL BOLD ITALIC CAPITAL A
+1D469;AL # MATHEMATICAL BOLD ITALIC CAPITAL B
+1D46A;AL # MATHEMATICAL BOLD ITALIC CAPITAL C
+1D46B;AL # MATHEMATICAL BOLD ITALIC CAPITAL D
+1D46C;AL # MATHEMATICAL BOLD ITALIC CAPITAL E
+1D46D;AL # MATHEMATICAL BOLD ITALIC CAPITAL F
+1D46E;AL # MATHEMATICAL BOLD ITALIC CAPITAL G
+1D46F;AL # MATHEMATICAL BOLD ITALIC CAPITAL H
+1D470;AL # MATHEMATICAL BOLD ITALIC CAPITAL I
+1D471;AL # MATHEMATICAL BOLD ITALIC CAPITAL J
+1D472;AL # MATHEMATICAL BOLD ITALIC CAPITAL K
+1D473;AL # MATHEMATICAL BOLD ITALIC CAPITAL L
+1D474;AL # MATHEMATICAL BOLD ITALIC CAPITAL M
+1D475;AL # MATHEMATICAL BOLD ITALIC CAPITAL N
+1D476;AL # MATHEMATICAL BOLD ITALIC CAPITAL O
+1D477;AL # MATHEMATICAL BOLD ITALIC CAPITAL P
+1D478;AL # MATHEMATICAL BOLD ITALIC CAPITAL Q
+1D479;AL # MATHEMATICAL BOLD ITALIC CAPITAL R
+1D47A;AL # MATHEMATICAL BOLD ITALIC CAPITAL S
+1D47B;AL # MATHEMATICAL BOLD ITALIC CAPITAL T
+1D47C;AL # MATHEMATICAL BOLD ITALIC CAPITAL U
+1D47D;AL # MATHEMATICAL BOLD ITALIC CAPITAL V
+1D47E;AL # MATHEMATICAL BOLD ITALIC CAPITAL W
+1D47F;AL # MATHEMATICAL BOLD ITALIC CAPITAL X
+1D480;AL # MATHEMATICAL BOLD ITALIC CAPITAL Y
+1D481;AL # MATHEMATICAL BOLD ITALIC CAPITAL Z
+1D482;AL # MATHEMATICAL BOLD ITALIC SMALL A
+1D483;AL # MATHEMATICAL BOLD ITALIC SMALL B
+1D484;AL # MATHEMATICAL BOLD ITALIC SMALL C
+1D485;AL # MATHEMATICAL BOLD ITALIC SMALL D
+1D486;AL # MATHEMATICAL BOLD ITALIC SMALL E
+1D487;AL # MATHEMATICAL BOLD ITALIC SMALL F
+1D488;AL # MATHEMATICAL BOLD ITALIC SMALL G
+1D489;AL # MATHEMATICAL BOLD ITALIC SMALL H
+1D48A;AL # MATHEMATICAL BOLD ITALIC SMALL I
+1D48B;AL # MATHEMATICAL BOLD ITALIC SMALL J
+1D48C;AL # MATHEMATICAL BOLD ITALIC SMALL K
+1D48D;AL # MATHEMATICAL BOLD ITALIC SMALL L
+1D48E;AL # MATHEMATICAL BOLD ITALIC SMALL M
+1D48F;AL # MATHEMATICAL BOLD ITALIC SMALL N
+1D490;AL # MATHEMATICAL BOLD ITALIC SMALL O
+1D491;AL # MATHEMATICAL BOLD ITALIC SMALL P
+1D492;AL # MATHEMATICAL BOLD ITALIC SMALL Q
+1D493;AL # MATHEMATICAL BOLD ITALIC SMALL R
+1D494;AL # MATHEMATICAL BOLD ITALIC SMALL S
+1D495;AL # MATHEMATICAL BOLD ITALIC SMALL T
+1D496;AL # MATHEMATICAL BOLD ITALIC SMALL U
+1D497;AL # MATHEMATICAL BOLD ITALIC SMALL V
+1D498;AL # MATHEMATICAL BOLD ITALIC SMALL W
+1D499;AL # MATHEMATICAL BOLD ITALIC SMALL X
+1D49A;AL # MATHEMATICAL BOLD ITALIC SMALL Y
+1D49B;AL # MATHEMATICAL BOLD ITALIC SMALL Z
+1D49C;AL # MATHEMATICAL SCRIPT CAPITAL A
+1D49E;AL # MATHEMATICAL SCRIPT CAPITAL C
+1D49F;AL # MATHEMATICAL SCRIPT CAPITAL D
+1D4A2;AL # MATHEMATICAL SCRIPT CAPITAL G
+1D4A5;AL # MATHEMATICAL SCRIPT CAPITAL J
+1D4A6;AL # MATHEMATICAL SCRIPT CAPITAL K
+1D4A9;AL # MATHEMATICAL SCRIPT CAPITAL N
+1D4AA;AL # MATHEMATICAL SCRIPT CAPITAL O
+1D4AB;AL # MATHEMATICAL SCRIPT CAPITAL P
+1D4AC;AL # MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE;AL # MATHEMATICAL SCRIPT CAPITAL S
+1D4AF;AL # MATHEMATICAL SCRIPT CAPITAL T
+1D4B0;AL # MATHEMATICAL SCRIPT CAPITAL U
+1D4B1;AL # MATHEMATICAL SCRIPT CAPITAL V
+1D4B2;AL # MATHEMATICAL SCRIPT CAPITAL W
+1D4B3;AL # MATHEMATICAL SCRIPT CAPITAL X
+1D4B4;AL # MATHEMATICAL SCRIPT CAPITAL Y
+1D4B5;AL # MATHEMATICAL SCRIPT CAPITAL Z
+1D4B6;AL # MATHEMATICAL SCRIPT SMALL A
+1D4B7;AL # MATHEMATICAL SCRIPT SMALL B
+1D4B8;AL # MATHEMATICAL SCRIPT SMALL C
+1D4B9;AL # MATHEMATICAL SCRIPT SMALL D
+1D4BB;AL # MATHEMATICAL SCRIPT SMALL F
+1D4BD;AL # MATHEMATICAL SCRIPT SMALL H
+1D4BE;AL # MATHEMATICAL SCRIPT SMALL I
+1D4BF;AL # MATHEMATICAL SCRIPT SMALL J
+1D4C0;AL # MATHEMATICAL SCRIPT SMALL K
+1D4C1;AL # MATHEMATICAL SCRIPT SMALL L
+1D4C2;AL # MATHEMATICAL SCRIPT SMALL M
+1D4C3;AL # MATHEMATICAL SCRIPT SMALL N
+1D4C5;AL # MATHEMATICAL SCRIPT SMALL P
+1D4C6;AL # MATHEMATICAL SCRIPT SMALL Q
+1D4C7;AL # MATHEMATICAL SCRIPT SMALL R
+1D4C8;AL # MATHEMATICAL SCRIPT SMALL S
+1D4C9;AL # MATHEMATICAL SCRIPT SMALL T
+1D4CA;AL # MATHEMATICAL SCRIPT SMALL U
+1D4CB;AL # MATHEMATICAL SCRIPT SMALL V
+1D4CC;AL # MATHEMATICAL SCRIPT SMALL W
+1D4CD;AL # MATHEMATICAL SCRIPT SMALL X
+1D4CE;AL # MATHEMATICAL SCRIPT SMALL Y
+1D4CF;AL # MATHEMATICAL SCRIPT SMALL Z
+1D4D0;AL # MATHEMATICAL BOLD SCRIPT CAPITAL A
+1D4D1;AL # MATHEMATICAL BOLD SCRIPT CAPITAL B
+1D4D2;AL # MATHEMATICAL BOLD SCRIPT CAPITAL C
+1D4D3;AL # MATHEMATICAL BOLD SCRIPT CAPITAL D
+1D4D4;AL # MATHEMATICAL BOLD SCRIPT CAPITAL E
+1D4D5;AL # MATHEMATICAL BOLD SCRIPT CAPITAL F
+1D4D6;AL # MATHEMATICAL BOLD SCRIPT CAPITAL G
+1D4D7;AL # MATHEMATICAL BOLD SCRIPT CAPITAL H
+1D4D8;AL # MATHEMATICAL BOLD SCRIPT CAPITAL I
+1D4D9;AL # MATHEMATICAL BOLD SCRIPT CAPITAL J
+1D4DA;AL # MATHEMATICAL BOLD SCRIPT CAPITAL K
+1D4DB;AL # MATHEMATICAL BOLD SCRIPT CAPITAL L
+1D4DC;AL # MATHEMATICAL BOLD SCRIPT CAPITAL M
+1D4DD;AL # MATHEMATICAL BOLD SCRIPT CAPITAL N
+1D4DE;AL # MATHEMATICAL BOLD SCRIPT CAPITAL O
+1D4DF;AL # MATHEMATICAL BOLD SCRIPT CAPITAL P
+1D4E0;AL # MATHEMATICAL BOLD SCRIPT CAPITAL Q
+1D4E1;AL # MATHEMATICAL BOLD SCRIPT CAPITAL R
+1D4E2;AL # MATHEMATICAL BOLD SCRIPT CAPITAL S
+1D4E3;AL # MATHEMATICAL BOLD SCRIPT CAPITAL T
+1D4E4;AL # MATHEMATICAL BOLD SCRIPT CAPITAL U
+1D4E5;AL # MATHEMATICAL BOLD SCRIPT CAPITAL V
+1D4E6;AL # MATHEMATICAL BOLD SCRIPT CAPITAL W
+1D4E7;AL # MATHEMATICAL BOLD SCRIPT CAPITAL X
+1D4E8;AL # MATHEMATICAL BOLD SCRIPT CAPITAL Y
+1D4E9;AL # MATHEMATICAL BOLD SCRIPT CAPITAL Z
+1D4EA;AL # MATHEMATICAL BOLD SCRIPT SMALL A
+1D4EB;AL # MATHEMATICAL BOLD SCRIPT SMALL B
+1D4EC;AL # MATHEMATICAL BOLD SCRIPT SMALL C
+1D4ED;AL # MATHEMATICAL BOLD SCRIPT SMALL D
+1D4EE;AL # MATHEMATICAL BOLD SCRIPT SMALL E
+1D4EF;AL # MATHEMATICAL BOLD SCRIPT SMALL F
+1D4F0;AL # MATHEMATICAL BOLD SCRIPT SMALL G
+1D4F1;AL # MATHEMATICAL BOLD SCRIPT SMALL H
+1D4F2;AL # MATHEMATICAL BOLD SCRIPT SMALL I
+1D4F3;AL # MATHEMATICAL BOLD SCRIPT SMALL J
+1D4F4;AL # MATHEMATICAL BOLD SCRIPT SMALL K
+1D4F5;AL # MATHEMATICAL BOLD SCRIPT SMALL L
+1D4F6;AL # MATHEMATICAL BOLD SCRIPT SMALL M
+1D4F7;AL # MATHEMATICAL BOLD SCRIPT SMALL N
+1D4F8;AL # MATHEMATICAL BOLD SCRIPT SMALL O
+1D4F9;AL # MATHEMATICAL BOLD SCRIPT SMALL P
+1D4FA;AL # MATHEMATICAL BOLD SCRIPT SMALL Q
+1D4FB;AL # MATHEMATICAL BOLD SCRIPT SMALL R
+1D4FC;AL # MATHEMATICAL BOLD SCRIPT SMALL S
+1D4FD;AL # MATHEMATICAL BOLD SCRIPT SMALL T
+1D4FE;AL # MATHEMATICAL BOLD SCRIPT SMALL U
+1D4FF;AL # MATHEMATICAL BOLD SCRIPT SMALL V
+1D500;AL # MATHEMATICAL BOLD SCRIPT SMALL W
+1D501;AL # MATHEMATICAL BOLD SCRIPT SMALL X
+1D502;AL # MATHEMATICAL BOLD SCRIPT SMALL Y
+1D503;AL # MATHEMATICAL BOLD SCRIPT SMALL Z
+1D504;AL # MATHEMATICAL FRAKTUR CAPITAL A
+1D505;AL # MATHEMATICAL FRAKTUR CAPITAL B
+1D507;AL # MATHEMATICAL FRAKTUR CAPITAL D
+1D508;AL # MATHEMATICAL FRAKTUR CAPITAL E
+1D509;AL # MATHEMATICAL FRAKTUR CAPITAL F
+1D50A;AL # MATHEMATICAL FRAKTUR CAPITAL G
+1D50D;AL # MATHEMATICAL FRAKTUR CAPITAL J
+1D50E;AL # MATHEMATICAL FRAKTUR CAPITAL K
+1D50F;AL # MATHEMATICAL FRAKTUR CAPITAL L
+1D510;AL # MATHEMATICAL FRAKTUR CAPITAL M
+1D511;AL # MATHEMATICAL FRAKTUR CAPITAL N
+1D512;AL # MATHEMATICAL FRAKTUR CAPITAL O
+1D513;AL # MATHEMATICAL FRAKTUR CAPITAL P
+1D514;AL # MATHEMATICAL FRAKTUR CAPITAL Q
+1D516;AL # MATHEMATICAL FRAKTUR CAPITAL S
+1D517;AL # MATHEMATICAL FRAKTUR CAPITAL T
+1D518;AL # MATHEMATICAL FRAKTUR CAPITAL U
+1D519;AL # MATHEMATICAL FRAKTUR CAPITAL V
+1D51A;AL # MATHEMATICAL FRAKTUR CAPITAL W
+1D51B;AL # MATHEMATICAL FRAKTUR CAPITAL X
+1D51C;AL # MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E;AL # MATHEMATICAL FRAKTUR SMALL A
+1D51F;AL # MATHEMATICAL FRAKTUR SMALL B
+1D520;AL # MATHEMATICAL FRAKTUR SMALL C
+1D521;AL # MATHEMATICAL FRAKTUR SMALL D
+1D522;AL # MATHEMATICAL FRAKTUR SMALL E
+1D523;AL # MATHEMATICAL FRAKTUR SMALL F
+1D524;AL # MATHEMATICAL FRAKTUR SMALL G
+1D525;AL # MATHEMATICAL FRAKTUR SMALL H
+1D526;AL # MATHEMATICAL FRAKTUR SMALL I
+1D527;AL # MATHEMATICAL FRAKTUR SMALL J
+1D528;AL # MATHEMATICAL FRAKTUR SMALL K
+1D529;AL # MATHEMATICAL FRAKTUR SMALL L
+1D52A;AL # MATHEMATICAL FRAKTUR SMALL M
+1D52B;AL # MATHEMATICAL FRAKTUR SMALL N
+1D52C;AL # MATHEMATICAL FRAKTUR SMALL O
+1D52D;AL # MATHEMATICAL FRAKTUR SMALL P
+1D52E;AL # MATHEMATICAL FRAKTUR SMALL Q
+1D52F;AL # MATHEMATICAL FRAKTUR SMALL R
+1D530;AL # MATHEMATICAL FRAKTUR SMALL S
+1D531;AL # MATHEMATICAL FRAKTUR SMALL T
+1D532;AL # MATHEMATICAL FRAKTUR SMALL U
+1D533;AL # MATHEMATICAL FRAKTUR SMALL V
+1D534;AL # MATHEMATICAL FRAKTUR SMALL W
+1D535;AL # MATHEMATICAL FRAKTUR SMALL X
+1D536;AL # MATHEMATICAL FRAKTUR SMALL Y
+1D537;AL # MATHEMATICAL FRAKTUR SMALL Z
+1D538;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+1D539;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+1D53C;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+1D53D;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+1D53E;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+1D541;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+1D542;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+1D543;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+1D544;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+1D54B;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+1D54C;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+1D54D;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+1D54E;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+1D54F;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+1D550;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552;AL # MATHEMATICAL DOUBLE-STRUCK SMALL A
+1D553;AL # MATHEMATICAL DOUBLE-STRUCK SMALL B
+1D554;AL # MATHEMATICAL DOUBLE-STRUCK SMALL C
+1D555;AL # MATHEMATICAL DOUBLE-STRUCK SMALL D
+1D556;AL # MATHEMATICAL DOUBLE-STRUCK SMALL E
+1D557;AL # MATHEMATICAL DOUBLE-STRUCK SMALL F
+1D558;AL # MATHEMATICAL DOUBLE-STRUCK SMALL G
+1D559;AL # MATHEMATICAL DOUBLE-STRUCK SMALL H
+1D55A;AL # MATHEMATICAL DOUBLE-STRUCK SMALL I
+1D55B;AL # MATHEMATICAL DOUBLE-STRUCK SMALL J
+1D55C;AL # MATHEMATICAL DOUBLE-STRUCK SMALL K
+1D55D;AL # MATHEMATICAL DOUBLE-STRUCK SMALL L
+1D55E;AL # MATHEMATICAL DOUBLE-STRUCK SMALL M
+1D55F;AL # MATHEMATICAL DOUBLE-STRUCK SMALL N
+1D560;AL # MATHEMATICAL DOUBLE-STRUCK SMALL O
+1D561;AL # MATHEMATICAL DOUBLE-STRUCK SMALL P
+1D562;AL # MATHEMATICAL DOUBLE-STRUCK SMALL Q
+1D563;AL # MATHEMATICAL DOUBLE-STRUCK SMALL R
+1D564;AL # MATHEMATICAL DOUBLE-STRUCK SMALL S
+1D565;AL # MATHEMATICAL DOUBLE-STRUCK SMALL T
+1D566;AL # MATHEMATICAL DOUBLE-STRUCK SMALL U
+1D567;AL # MATHEMATICAL DOUBLE-STRUCK SMALL V
+1D568;AL # MATHEMATICAL DOUBLE-STRUCK SMALL W
+1D569;AL # MATHEMATICAL DOUBLE-STRUCK SMALL X
+1D56A;AL # MATHEMATICAL DOUBLE-STRUCK SMALL Y
+1D56B;AL # MATHEMATICAL DOUBLE-STRUCK SMALL Z
+1D56C;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL A
+1D56D;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL B
+1D56E;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL C
+1D56F;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL D
+1D570;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL E
+1D571;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL F
+1D572;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL G
+1D573;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL H
+1D574;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL I
+1D575;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL J
+1D576;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL K
+1D577;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL L
+1D578;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL M
+1D579;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL N
+1D57A;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL O
+1D57B;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL P
+1D57C;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL Q
+1D57D;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL R
+1D57E;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL S
+1D57F;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL T
+1D580;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL U
+1D581;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL V
+1D582;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL W
+1D583;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL X
+1D584;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL Y
+1D585;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL Z
+1D586;AL # MATHEMATICAL BOLD FRAKTUR SMALL A
+1D587;AL # MATHEMATICAL BOLD FRAKTUR SMALL B
+1D588;AL # MATHEMATICAL BOLD FRAKTUR SMALL C
+1D589;AL # MATHEMATICAL BOLD FRAKTUR SMALL D
+1D58A;AL # MATHEMATICAL BOLD FRAKTUR SMALL E
+1D58B;AL # MATHEMATICAL BOLD FRAKTUR SMALL F
+1D58C;AL # MATHEMATICAL BOLD FRAKTUR SMALL G
+1D58D;AL # MATHEMATICAL BOLD FRAKTUR SMALL H
+1D58E;AL # MATHEMATICAL BOLD FRAKTUR SMALL I
+1D58F;AL # MATHEMATICAL BOLD FRAKTUR SMALL J
+1D590;AL # MATHEMATICAL BOLD FRAKTUR SMALL K
+1D591;AL # MATHEMATICAL BOLD FRAKTUR SMALL L
+1D592;AL # MATHEMATICAL BOLD FRAKTUR SMALL M
+1D593;AL # MATHEMATICAL BOLD FRAKTUR SMALL N
+1D594;AL # MATHEMATICAL BOLD FRAKTUR SMALL O
+1D595;AL # MATHEMATICAL BOLD FRAKTUR SMALL P
+1D596;AL # MATHEMATICAL BOLD FRAKTUR SMALL Q
+1D597;AL # MATHEMATICAL BOLD FRAKTUR SMALL R
+1D598;AL # MATHEMATICAL BOLD FRAKTUR SMALL S
+1D599;AL # MATHEMATICAL BOLD FRAKTUR SMALL T
+1D59A;AL # MATHEMATICAL BOLD FRAKTUR SMALL U
+1D59B;AL # MATHEMATICAL BOLD FRAKTUR SMALL V
+1D59C;AL # MATHEMATICAL BOLD FRAKTUR SMALL W
+1D59D;AL # MATHEMATICAL BOLD FRAKTUR SMALL X
+1D59E;AL # MATHEMATICAL BOLD FRAKTUR SMALL Y
+1D59F;AL # MATHEMATICAL BOLD FRAKTUR SMALL Z
+1D5A0;AL # MATHEMATICAL SANS-SERIF CAPITAL A
+1D5A1;AL # MATHEMATICAL SANS-SERIF CAPITAL B
+1D5A2;AL # MATHEMATICAL SANS-SERIF CAPITAL C
+1D5A3;AL # MATHEMATICAL SANS-SERIF CAPITAL D
+1D5A4;AL # MATHEMATICAL SANS-SERIF CAPITAL E
+1D5A5;AL # MATHEMATICAL SANS-SERIF CAPITAL F
+1D5A6;AL # MATHEMATICAL SANS-SERIF CAPITAL G
+1D5A7;AL # MATHEMATICAL SANS-SERIF CAPITAL H
+1D5A8;AL # MATHEMATICAL SANS-SERIF CAPITAL I
+1D5A9;AL # MATHEMATICAL SANS-SERIF CAPITAL J
+1D5AA;AL # MATHEMATICAL SANS-SERIF CAPITAL K
+1D5AB;AL # MATHEMATICAL SANS-SERIF CAPITAL L
+1D5AC;AL # MATHEMATICAL SANS-SERIF CAPITAL M
+1D5AD;AL # MATHEMATICAL SANS-SERIF CAPITAL N
+1D5AE;AL # MATHEMATICAL SANS-SERIF CAPITAL O
+1D5AF;AL # MATHEMATICAL SANS-SERIF CAPITAL P
+1D5B0;AL # MATHEMATICAL SANS-SERIF CAPITAL Q
+1D5B1;AL # MATHEMATICAL SANS-SERIF CAPITAL R
+1D5B2;AL # MATHEMATICAL SANS-SERIF CAPITAL S
+1D5B3;AL # MATHEMATICAL SANS-SERIF CAPITAL T
+1D5B4;AL # MATHEMATICAL SANS-SERIF CAPITAL U
+1D5B5;AL # MATHEMATICAL SANS-SERIF CAPITAL V
+1D5B6;AL # MATHEMATICAL SANS-SERIF CAPITAL W
+1D5B7;AL # MATHEMATICAL SANS-SERIF CAPITAL X
+1D5B8;AL # MATHEMATICAL SANS-SERIF CAPITAL Y
+1D5B9;AL # MATHEMATICAL SANS-SERIF CAPITAL Z
+1D5BA;AL # MATHEMATICAL SANS-SERIF SMALL A
+1D5BB;AL # MATHEMATICAL SANS-SERIF SMALL B
+1D5BC;AL # MATHEMATICAL SANS-SERIF SMALL C
+1D5BD;AL # MATHEMATICAL SANS-SERIF SMALL D
+1D5BE;AL # MATHEMATICAL SANS-SERIF SMALL E
+1D5BF;AL # MATHEMATICAL SANS-SERIF SMALL F
+1D5C0;AL # MATHEMATICAL SANS-SERIF SMALL G
+1D5C1;AL # MATHEMATICAL SANS-SERIF SMALL H
+1D5C2;AL # MATHEMATICAL SANS-SERIF SMALL I
+1D5C3;AL # MATHEMATICAL SANS-SERIF SMALL J
+1D5C4;AL # MATHEMATICAL SANS-SERIF SMALL K
+1D5C5;AL # MATHEMATICAL SANS-SERIF SMALL L
+1D5C6;AL # MATHEMATICAL SANS-SERIF SMALL M
+1D5C7;AL # MATHEMATICAL SANS-SERIF SMALL N
+1D5C8;AL # MATHEMATICAL SANS-SERIF SMALL O
+1D5C9;AL # MATHEMATICAL SANS-SERIF SMALL P
+1D5CA;AL # MATHEMATICAL SANS-SERIF SMALL Q
+1D5CB;AL # MATHEMATICAL SANS-SERIF SMALL R
+1D5CC;AL # MATHEMATICAL SANS-SERIF SMALL S
+1D5CD;AL # MATHEMATICAL SANS-SERIF SMALL T
+1D5CE;AL # MATHEMATICAL SANS-SERIF SMALL U
+1D5CF;AL # MATHEMATICAL SANS-SERIF SMALL V
+1D5D0;AL # MATHEMATICAL SANS-SERIF SMALL W
+1D5D1;AL # MATHEMATICAL SANS-SERIF SMALL X
+1D5D2;AL # MATHEMATICAL SANS-SERIF SMALL Y
+1D5D3;AL # MATHEMATICAL SANS-SERIF SMALL Z
+1D5D4;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL A
+1D5D5;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL B
+1D5D6;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL C
+1D5D7;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL D
+1D5D8;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL E
+1D5D9;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL F
+1D5DA;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL G
+1D5DB;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL H
+1D5DC;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL I
+1D5DD;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL J
+1D5DE;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL K
+1D5DF;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL L
+1D5E0;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL M
+1D5E1;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL N
+1D5E2;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL O
+1D5E3;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL P
+1D5E4;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q
+1D5E5;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL R
+1D5E6;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL S
+1D5E7;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL T
+1D5E8;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL U
+1D5E9;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL V
+1D5EA;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL W
+1D5EB;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL X
+1D5EC;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y
+1D5ED;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z
+1D5EE;AL # MATHEMATICAL SANS-SERIF BOLD SMALL A
+1D5EF;AL # MATHEMATICAL SANS-SERIF BOLD SMALL B
+1D5F0;AL # MATHEMATICAL SANS-SERIF BOLD SMALL C
+1D5F1;AL # MATHEMATICAL SANS-SERIF BOLD SMALL D
+1D5F2;AL # MATHEMATICAL SANS-SERIF BOLD SMALL E
+1D5F3;AL # MATHEMATICAL SANS-SERIF BOLD SMALL F
+1D5F4;AL # MATHEMATICAL SANS-SERIF BOLD SMALL G
+1D5F5;AL # MATHEMATICAL SANS-SERIF BOLD SMALL H
+1D5F6;AL # MATHEMATICAL SANS-SERIF BOLD SMALL I
+1D5F7;AL # MATHEMATICAL SANS-SERIF BOLD SMALL J
+1D5F8;AL # MATHEMATICAL SANS-SERIF BOLD SMALL K
+1D5F9;AL # MATHEMATICAL SANS-SERIF BOLD SMALL L
+1D5FA;AL # MATHEMATICAL SANS-SERIF BOLD SMALL M
+1D5FB;AL # MATHEMATICAL SANS-SERIF BOLD SMALL N
+1D5FC;AL # MATHEMATICAL SANS-SERIF BOLD SMALL O
+1D5FD;AL # MATHEMATICAL SANS-SERIF BOLD SMALL P
+1D5FE;AL # MATHEMATICAL SANS-SERIF BOLD SMALL Q
+1D5FF;AL # MATHEMATICAL SANS-SERIF BOLD SMALL R
+1D600;AL # MATHEMATICAL SANS-SERIF BOLD SMALL S
+1D601;AL # MATHEMATICAL SANS-SERIF BOLD SMALL T
+1D602;AL # MATHEMATICAL SANS-SERIF BOLD SMALL U
+1D603;AL # MATHEMATICAL SANS-SERIF BOLD SMALL V
+1D604;AL # MATHEMATICAL SANS-SERIF BOLD SMALL W
+1D605;AL # MATHEMATICAL SANS-SERIF BOLD SMALL X
+1D606;AL # MATHEMATICAL SANS-SERIF BOLD SMALL Y
+1D607;AL # MATHEMATICAL SANS-SERIF BOLD SMALL Z
+1D608;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A
+1D609;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B
+1D60A;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C
+1D60B;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D
+1D60C;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E
+1D60D;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F
+1D60E;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G
+1D60F;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H
+1D610;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I
+1D611;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J
+1D612;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K
+1D613;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L
+1D614;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M
+1D615;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N
+1D616;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O
+1D617;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P
+1D618;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q
+1D619;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R
+1D61A;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S
+1D61B;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T
+1D61C;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U
+1D61D;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V
+1D61E;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W
+1D61F;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X
+1D620;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y
+1D621;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z
+1D622;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL A
+1D623;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL B
+1D624;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL C
+1D625;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL D
+1D626;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL E
+1D627;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL F
+1D628;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL G
+1D629;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL H
+1D62A;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL I
+1D62B;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL J
+1D62C;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL K
+1D62D;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL L
+1D62E;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL M
+1D62F;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL N
+1D630;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL O
+1D631;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL P
+1D632;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL Q
+1D633;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL R
+1D634;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL S
+1D635;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL T
+1D636;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL U
+1D637;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL V
+1D638;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL W
+1D639;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL X
+1D63A;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL Y
+1D63B;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL Z
+1D63C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A
+1D63D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B
+1D63E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C
+1D63F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D
+1D640;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E
+1D641;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F
+1D642;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G
+1D643;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H
+1D644;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I
+1D645;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J
+1D646;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K
+1D647;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L
+1D648;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M
+1D649;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N
+1D64A;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O
+1D64B;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P
+1D64C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q
+1D64D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R
+1D64E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S
+1D64F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T
+1D650;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U
+1D651;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V
+1D652;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W
+1D653;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X
+1D654;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y
+1D655;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z
+1D656;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A
+1D657;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B
+1D658;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C
+1D659;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D
+1D65A;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E
+1D65B;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F
+1D65C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G
+1D65D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H
+1D65E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I
+1D65F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+1D660;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K
+1D661;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L
+1D662;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M
+1D663;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N
+1D664;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O
+1D665;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P
+1D666;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q
+1D667;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R
+1D668;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S
+1D669;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T
+1D66A;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U
+1D66B;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V
+1D66C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W
+1D66D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X
+1D66E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y
+1D66F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z
+1D670;AL # MATHEMATICAL MONOSPACE CAPITAL A
+1D671;AL # MATHEMATICAL MONOSPACE CAPITAL B
+1D672;AL # MATHEMATICAL MONOSPACE CAPITAL C
+1D673;AL # MATHEMATICAL MONOSPACE CAPITAL D
+1D674;AL # MATHEMATICAL MONOSPACE CAPITAL E
+1D675;AL # MATHEMATICAL MONOSPACE CAPITAL F
+1D676;AL # MATHEMATICAL MONOSPACE CAPITAL G
+1D677;AL # MATHEMATICAL MONOSPACE CAPITAL H
+1D678;AL # MATHEMATICAL MONOSPACE CAPITAL I
+1D679;AL # MATHEMATICAL MONOSPACE CAPITAL J
+1D67A;AL # MATHEMATICAL MONOSPACE CAPITAL K
+1D67B;AL # MATHEMATICAL MONOSPACE CAPITAL L
+1D67C;AL # MATHEMATICAL MONOSPACE CAPITAL M
+1D67D;AL # MATHEMATICAL MONOSPACE CAPITAL N
+1D67E;AL # MATHEMATICAL MONOSPACE CAPITAL O
+1D67F;AL # MATHEMATICAL MONOSPACE CAPITAL P
+1D680;AL # MATHEMATICAL MONOSPACE CAPITAL Q
+1D681;AL # MATHEMATICAL MONOSPACE CAPITAL R
+1D682;AL # MATHEMATICAL MONOSPACE CAPITAL S
+1D683;AL # MATHEMATICAL MONOSPACE CAPITAL T
+1D684;AL # MATHEMATICAL MONOSPACE CAPITAL U
+1D685;AL # MATHEMATICAL MONOSPACE CAPITAL V
+1D686;AL # MATHEMATICAL MONOSPACE CAPITAL W
+1D687;AL # MATHEMATICAL MONOSPACE CAPITAL X
+1D688;AL # MATHEMATICAL MONOSPACE CAPITAL Y
+1D689;AL # MATHEMATICAL MONOSPACE CAPITAL Z
+1D68A;AL # MATHEMATICAL MONOSPACE SMALL A
+1D68B;AL # MATHEMATICAL MONOSPACE SMALL B
+1D68C;AL # MATHEMATICAL MONOSPACE SMALL C
+1D68D;AL # MATHEMATICAL MONOSPACE SMALL D
+1D68E;AL # MATHEMATICAL MONOSPACE SMALL E
+1D68F;AL # MATHEMATICAL MONOSPACE SMALL F
+1D690;AL # MATHEMATICAL MONOSPACE SMALL G
+1D691;AL # MATHEMATICAL MONOSPACE SMALL H
+1D692;AL # MATHEMATICAL MONOSPACE SMALL I
+1D693;AL # MATHEMATICAL MONOSPACE SMALL J
+1D694;AL # MATHEMATICAL MONOSPACE SMALL K
+1D695;AL # MATHEMATICAL MONOSPACE SMALL L
+1D696;AL # MATHEMATICAL MONOSPACE SMALL M
+1D697;AL # MATHEMATICAL MONOSPACE SMALL N
+1D698;AL # MATHEMATICAL MONOSPACE SMALL O
+1D699;AL # MATHEMATICAL MONOSPACE SMALL P
+1D69A;AL # MATHEMATICAL MONOSPACE SMALL Q
+1D69B;AL # MATHEMATICAL MONOSPACE SMALL R
+1D69C;AL # MATHEMATICAL MONOSPACE SMALL S
+1D69D;AL # MATHEMATICAL MONOSPACE SMALL T
+1D69E;AL # MATHEMATICAL MONOSPACE SMALL U
+1D69F;AL # MATHEMATICAL MONOSPACE SMALL V
+1D6A0;AL # MATHEMATICAL MONOSPACE SMALL W
+1D6A1;AL # MATHEMATICAL MONOSPACE SMALL X
+1D6A2;AL # MATHEMATICAL MONOSPACE SMALL Y
+1D6A3;AL # MATHEMATICAL MONOSPACE SMALL Z
+1D6A4;AL # MATHEMATICAL ITALIC SMALL DOTLESS I
+1D6A5;AL # MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8;AL # MATHEMATICAL BOLD CAPITAL ALPHA
+1D6A9;AL # MATHEMATICAL BOLD CAPITAL BETA
+1D6AA;AL # MATHEMATICAL BOLD CAPITAL GAMMA
+1D6AB;AL # MATHEMATICAL BOLD CAPITAL DELTA
+1D6AC;AL # MATHEMATICAL BOLD CAPITAL EPSILON
+1D6AD;AL # MATHEMATICAL BOLD CAPITAL ZETA
+1D6AE;AL # MATHEMATICAL BOLD CAPITAL ETA
+1D6AF;AL # MATHEMATICAL BOLD CAPITAL THETA
+1D6B0;AL # MATHEMATICAL BOLD CAPITAL IOTA
+1D6B1;AL # MATHEMATICAL BOLD CAPITAL KAPPA
+1D6B2;AL # MATHEMATICAL BOLD CAPITAL LAMDA
+1D6B3;AL # MATHEMATICAL BOLD CAPITAL MU
+1D6B4;AL # MATHEMATICAL BOLD CAPITAL NU
+1D6B5;AL # MATHEMATICAL BOLD CAPITAL XI
+1D6B6;AL # MATHEMATICAL BOLD CAPITAL OMICRON
+1D6B7;AL # MATHEMATICAL BOLD CAPITAL PI
+1D6B8;AL # MATHEMATICAL BOLD CAPITAL RHO
+1D6B9;AL # MATHEMATICAL BOLD CAPITAL THETA SYMBOL
+1D6BA;AL # MATHEMATICAL BOLD CAPITAL SIGMA
+1D6BB;AL # MATHEMATICAL BOLD CAPITAL TAU
+1D6BC;AL # MATHEMATICAL BOLD CAPITAL UPSILON
+1D6BD;AL # MATHEMATICAL BOLD CAPITAL PHI
+1D6BE;AL # MATHEMATICAL BOLD CAPITAL CHI
+1D6BF;AL # MATHEMATICAL BOLD CAPITAL PSI
+1D6C0;AL # MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1;AL # MATHEMATICAL BOLD NABLA
+1D6C2;AL # MATHEMATICAL BOLD SMALL ALPHA
+1D6C3;AL # MATHEMATICAL BOLD SMALL BETA
+1D6C4;AL # MATHEMATICAL BOLD SMALL GAMMA
+1D6C5;AL # MATHEMATICAL BOLD SMALL DELTA
+1D6C6;AL # MATHEMATICAL BOLD SMALL EPSILON
+1D6C7;AL # MATHEMATICAL BOLD SMALL ZETA
+1D6C8;AL # MATHEMATICAL BOLD SMALL ETA
+1D6C9;AL # MATHEMATICAL BOLD SMALL THETA
+1D6CA;AL # MATHEMATICAL BOLD SMALL IOTA
+1D6CB;AL # MATHEMATICAL BOLD SMALL KAPPA
+1D6CC;AL # MATHEMATICAL BOLD SMALL LAMDA
+1D6CD;AL # MATHEMATICAL BOLD SMALL MU
+1D6CE;AL # MATHEMATICAL BOLD SMALL NU
+1D6CF;AL # MATHEMATICAL BOLD SMALL XI
+1D6D0;AL # MATHEMATICAL BOLD SMALL OMICRON
+1D6D1;AL # MATHEMATICAL BOLD SMALL PI
+1D6D2;AL # MATHEMATICAL BOLD SMALL RHO
+1D6D3;AL # MATHEMATICAL BOLD SMALL FINAL SIGMA
+1D6D4;AL # MATHEMATICAL BOLD SMALL SIGMA
+1D6D5;AL # MATHEMATICAL BOLD SMALL TAU
+1D6D6;AL # MATHEMATICAL BOLD SMALL UPSILON
+1D6D7;AL # MATHEMATICAL BOLD SMALL PHI
+1D6D8;AL # MATHEMATICAL BOLD SMALL CHI
+1D6D9;AL # MATHEMATICAL BOLD SMALL PSI
+1D6DA;AL # MATHEMATICAL BOLD SMALL OMEGA
+1D6DB;AL # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC;AL # MATHEMATICAL BOLD EPSILON SYMBOL
+1D6DD;AL # MATHEMATICAL BOLD THETA SYMBOL
+1D6DE;AL # MATHEMATICAL BOLD KAPPA SYMBOL
+1D6DF;AL # MATHEMATICAL BOLD PHI SYMBOL
+1D6E0;AL # MATHEMATICAL BOLD RHO SYMBOL
+1D6E1;AL # MATHEMATICAL BOLD PI SYMBOL
+1D6E2;AL # MATHEMATICAL ITALIC CAPITAL ALPHA
+1D6E3;AL # MATHEMATICAL ITALIC CAPITAL BETA
+1D6E4;AL # MATHEMATICAL ITALIC CAPITAL GAMMA
+1D6E5;AL # MATHEMATICAL ITALIC CAPITAL DELTA
+1D6E6;AL # MATHEMATICAL ITALIC CAPITAL EPSILON
+1D6E7;AL # MATHEMATICAL ITALIC CAPITAL ZETA
+1D6E8;AL # MATHEMATICAL ITALIC CAPITAL ETA
+1D6E9;AL # MATHEMATICAL ITALIC CAPITAL THETA
+1D6EA;AL # MATHEMATICAL ITALIC CAPITAL IOTA
+1D6EB;AL # MATHEMATICAL ITALIC CAPITAL KAPPA
+1D6EC;AL # MATHEMATICAL ITALIC CAPITAL LAMDA
+1D6ED;AL # MATHEMATICAL ITALIC CAPITAL MU
+1D6EE;AL # MATHEMATICAL ITALIC CAPITAL NU
+1D6EF;AL # MATHEMATICAL ITALIC CAPITAL XI
+1D6F0;AL # MATHEMATICAL ITALIC CAPITAL OMICRON
+1D6F1;AL # MATHEMATICAL ITALIC CAPITAL PI
+1D6F2;AL # MATHEMATICAL ITALIC CAPITAL RHO
+1D6F3;AL # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL
+1D6F4;AL # MATHEMATICAL ITALIC CAPITAL SIGMA
+1D6F5;AL # MATHEMATICAL ITALIC CAPITAL TAU
+1D6F6;AL # MATHEMATICAL ITALIC CAPITAL UPSILON
+1D6F7;AL # MATHEMATICAL ITALIC CAPITAL PHI
+1D6F8;AL # MATHEMATICAL ITALIC CAPITAL CHI
+1D6F9;AL # MATHEMATICAL ITALIC CAPITAL PSI
+1D6FA;AL # MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB;AL # MATHEMATICAL ITALIC NABLA
+1D6FC;AL # MATHEMATICAL ITALIC SMALL ALPHA
+1D6FD;AL # MATHEMATICAL ITALIC SMALL BETA
+1D6FE;AL # MATHEMATICAL ITALIC SMALL GAMMA
+1D6FF;AL # MATHEMATICAL ITALIC SMALL DELTA
+1D700;AL # MATHEMATICAL ITALIC SMALL EPSILON
+1D701;AL # MATHEMATICAL ITALIC SMALL ZETA
+1D702;AL # MATHEMATICAL ITALIC SMALL ETA
+1D703;AL # MATHEMATICAL ITALIC SMALL THETA
+1D704;AL # MATHEMATICAL ITALIC SMALL IOTA
+1D705;AL # MATHEMATICAL ITALIC SMALL KAPPA
+1D706;AL # MATHEMATICAL ITALIC SMALL LAMDA
+1D707;AL # MATHEMATICAL ITALIC SMALL MU
+1D708;AL # MATHEMATICAL ITALIC SMALL NU
+1D709;AL # MATHEMATICAL ITALIC SMALL XI
+1D70A;AL # MATHEMATICAL ITALIC SMALL OMICRON
+1D70B;AL # MATHEMATICAL ITALIC SMALL PI
+1D70C;AL # MATHEMATICAL ITALIC SMALL RHO
+1D70D;AL # MATHEMATICAL ITALIC SMALL FINAL SIGMA
+1D70E;AL # MATHEMATICAL ITALIC SMALL SIGMA
+1D70F;AL # MATHEMATICAL ITALIC SMALL TAU
+1D710;AL # MATHEMATICAL ITALIC SMALL UPSILON
+1D711;AL # MATHEMATICAL ITALIC SMALL PHI
+1D712;AL # MATHEMATICAL ITALIC SMALL CHI
+1D713;AL # MATHEMATICAL ITALIC SMALL PSI
+1D714;AL # MATHEMATICAL ITALIC SMALL OMEGA
+1D715;AL # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716;AL # MATHEMATICAL ITALIC EPSILON SYMBOL
+1D717;AL # MATHEMATICAL ITALIC THETA SYMBOL
+1D718;AL # MATHEMATICAL ITALIC KAPPA SYMBOL
+1D719;AL # MATHEMATICAL ITALIC PHI SYMBOL
+1D71A;AL # MATHEMATICAL ITALIC RHO SYMBOL
+1D71B;AL # MATHEMATICAL ITALIC PI SYMBOL
+1D71C;AL # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA
+1D71D;AL # MATHEMATICAL BOLD ITALIC CAPITAL BETA
+1D71E;AL # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA
+1D71F;AL # MATHEMATICAL BOLD ITALIC CAPITAL DELTA
+1D720;AL # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON
+1D721;AL # MATHEMATICAL BOLD ITALIC CAPITAL ZETA
+1D722;AL # MATHEMATICAL BOLD ITALIC CAPITAL ETA
+1D723;AL # MATHEMATICAL BOLD ITALIC CAPITAL THETA
+1D724;AL # MATHEMATICAL BOLD ITALIC CAPITAL IOTA
+1D725;AL # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA
+1D726;AL # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA
+1D727;AL # MATHEMATICAL BOLD ITALIC CAPITAL MU
+1D728;AL # MATHEMATICAL BOLD ITALIC CAPITAL NU
+1D729;AL # MATHEMATICAL BOLD ITALIC CAPITAL XI
+1D72A;AL # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON
+1D72B;AL # MATHEMATICAL BOLD ITALIC CAPITAL PI
+1D72C;AL # MATHEMATICAL BOLD ITALIC CAPITAL RHO
+1D72D;AL # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL
+1D72E;AL # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA
+1D72F;AL # MATHEMATICAL BOLD ITALIC CAPITAL TAU
+1D730;AL # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON
+1D731;AL # MATHEMATICAL BOLD ITALIC CAPITAL PHI
+1D732;AL # MATHEMATICAL BOLD ITALIC CAPITAL CHI
+1D733;AL # MATHEMATICAL BOLD ITALIC CAPITAL PSI
+1D734;AL # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735;AL # MATHEMATICAL BOLD ITALIC NABLA
+1D736;AL # MATHEMATICAL BOLD ITALIC SMALL ALPHA
+1D737;AL # MATHEMATICAL BOLD ITALIC SMALL BETA
+1D738;AL # MATHEMATICAL BOLD ITALIC SMALL GAMMA
+1D739;AL # MATHEMATICAL BOLD ITALIC SMALL DELTA
+1D73A;AL # MATHEMATICAL BOLD ITALIC SMALL EPSILON
+1D73B;AL # MATHEMATICAL BOLD ITALIC SMALL ZETA
+1D73C;AL # MATHEMATICAL BOLD ITALIC SMALL ETA
+1D73D;AL # MATHEMATICAL BOLD ITALIC SMALL THETA
+1D73E;AL # MATHEMATICAL BOLD ITALIC SMALL IOTA
+1D73F;AL # MATHEMATICAL BOLD ITALIC SMALL KAPPA
+1D740;AL # MATHEMATICAL BOLD ITALIC SMALL LAMDA
+1D741;AL # MATHEMATICAL BOLD ITALIC SMALL MU
+1D742;AL # MATHEMATICAL BOLD ITALIC SMALL NU
+1D743;AL # MATHEMATICAL BOLD ITALIC SMALL XI
+1D744;AL # MATHEMATICAL BOLD ITALIC SMALL OMICRON
+1D745;AL # MATHEMATICAL BOLD ITALIC SMALL PI
+1D746;AL # MATHEMATICAL BOLD ITALIC SMALL RHO
+1D747;AL # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA
+1D748;AL # MATHEMATICAL BOLD ITALIC SMALL SIGMA
+1D749;AL # MATHEMATICAL BOLD ITALIC SMALL TAU
+1D74A;AL # MATHEMATICAL BOLD ITALIC SMALL UPSILON
+1D74B;AL # MATHEMATICAL BOLD ITALIC SMALL PHI
+1D74C;AL # MATHEMATICAL BOLD ITALIC SMALL CHI
+1D74D;AL # MATHEMATICAL BOLD ITALIC SMALL PSI
+1D74E;AL # MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F;AL # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750;AL # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL
+1D751;AL # MATHEMATICAL BOLD ITALIC THETA SYMBOL
+1D752;AL # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL
+1D753;AL # MATHEMATICAL BOLD ITALIC PHI SYMBOL
+1D754;AL # MATHEMATICAL BOLD ITALIC RHO SYMBOL
+1D755;AL # MATHEMATICAL BOLD ITALIC PI SYMBOL
+1D756;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA
+1D757;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA
+1D758;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA
+1D759;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA
+1D75A;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON
+1D75B;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA
+1D75C;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA
+1D75D;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA
+1D75E;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA
+1D75F;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA
+1D760;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA
+1D761;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU
+1D762;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU
+1D763;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI
+1D764;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON
+1D765;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI
+1D766;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO
+1D767;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL
+1D768;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA
+1D769;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU
+1D76A;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON
+1D76B;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI
+1D76C;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI
+1D76D;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI
+1D76E;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F;AL # MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770;AL # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA
+1D771;AL # MATHEMATICAL SANS-SERIF BOLD SMALL BETA
+1D772;AL # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA
+1D773;AL # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA
+1D774;AL # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON
+1D775;AL # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA
+1D776;AL # MATHEMATICAL SANS-SERIF BOLD SMALL ETA
+1D777;AL # MATHEMATICAL SANS-SERIF BOLD SMALL THETA
+1D778;AL # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA
+1D779;AL # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA
+1D77A;AL # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA
+1D77B;AL # MATHEMATICAL SANS-SERIF BOLD SMALL MU
+1D77C;AL # MATHEMATICAL SANS-SERIF BOLD SMALL NU
+1D77D;AL # MATHEMATICAL SANS-SERIF BOLD SMALL XI
+1D77E;AL # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON
+1D77F;AL # MATHEMATICAL SANS-SERIF BOLD SMALL PI
+1D780;AL # MATHEMATICAL SANS-SERIF BOLD SMALL RHO
+1D781;AL # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA
+1D782;AL # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA
+1D783;AL # MATHEMATICAL SANS-SERIF BOLD SMALL TAU
+1D784;AL # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON
+1D785;AL # MATHEMATICAL SANS-SERIF BOLD SMALL PHI
+1D786;AL # MATHEMATICAL SANS-SERIF BOLD SMALL CHI
+1D787;AL # MATHEMATICAL SANS-SERIF BOLD SMALL PSI
+1D788;AL # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789;AL # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A;AL # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL
+1D78B;AL # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL
+1D78C;AL # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL
+1D78D;AL # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL
+1D78E;AL # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL
+1D78F;AL # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL
+1D790;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA
+1D791;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA
+1D792;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA
+1D793;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA
+1D794;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON
+1D795;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA
+1D796;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA
+1D797;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA
+1D798;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA
+1D799;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA
+1D79A;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA
+1D79B;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU
+1D79C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU
+1D79D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI
+1D79E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON
+1D79F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI
+1D7A0;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO
+1D7A1;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL
+1D7A2;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA
+1D7A3;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU
+1D7A4;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON
+1D7A5;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI
+1D7A6;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI
+1D7A7;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI
+1D7A8;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA
+1D7AB;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA
+1D7AC;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA
+1D7AD;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA
+1D7AE;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON
+1D7AF;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA
+1D7B0;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA
+1D7B1;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA
+1D7B2;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA
+1D7B3;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA
+1D7B4;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA
+1D7B5;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU
+1D7B6;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU
+1D7B7;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI
+1D7B8;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON
+1D7B9;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI
+1D7BA;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO
+1D7BB;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA
+1D7BC;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA
+1D7BD;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU
+1D7BE;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON
+1D7BF;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI
+1D7C0;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI
+1D7C1;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI
+1D7C2;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL
+1D7C5;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL
+1D7C6;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL
+1D7C7;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL
+1D7C8;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL
+1D7C9;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+1D7CA;AL # MATHEMATICAL BOLD CAPITAL DIGAMMA
+1D7CB;AL # MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE;NU # MATHEMATICAL BOLD DIGIT ZERO
+1D7CF;NU # MATHEMATICAL BOLD DIGIT ONE
+1D7D0;NU # MATHEMATICAL BOLD DIGIT TWO
+1D7D1;NU # MATHEMATICAL BOLD DIGIT THREE
+1D7D2;NU # MATHEMATICAL BOLD DIGIT FOUR
+1D7D3;NU # MATHEMATICAL BOLD DIGIT FIVE
+1D7D4;NU # MATHEMATICAL BOLD DIGIT SIX
+1D7D5;NU # MATHEMATICAL BOLD DIGIT SEVEN
+1D7D6;NU # MATHEMATICAL BOLD DIGIT EIGHT
+1D7D7;NU # MATHEMATICAL BOLD DIGIT NINE
+1D7D8;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO
+1D7D9;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
+1D7DA;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO
+1D7DB;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE
+1D7DC;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR
+1D7DD;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE
+1D7DE;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX
+1D7DF;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN
+1D7E0;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT
+1D7E1;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE
+1D7E2;NU # MATHEMATICAL SANS-SERIF DIGIT ZERO
+1D7E3;NU # MATHEMATICAL SANS-SERIF DIGIT ONE
+1D7E4;NU # MATHEMATICAL SANS-SERIF DIGIT TWO
+1D7E5;NU # MATHEMATICAL SANS-SERIF DIGIT THREE
+1D7E6;NU # MATHEMATICAL SANS-SERIF DIGIT FOUR
+1D7E7;NU # MATHEMATICAL SANS-SERIF DIGIT FIVE
+1D7E8;NU # MATHEMATICAL SANS-SERIF DIGIT SIX
+1D7E9;NU # MATHEMATICAL SANS-SERIF DIGIT SEVEN
+1D7EA;NU # MATHEMATICAL SANS-SERIF DIGIT EIGHT
+1D7EB;NU # MATHEMATICAL SANS-SERIF DIGIT NINE
+1D7EC;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO
+1D7ED;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE
+1D7EE;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO
+1D7EF;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE
+1D7F0;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR
+1D7F1;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE
+1D7F2;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX
+1D7F3;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN
+1D7F4;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT
+1D7F5;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE
+1D7F6;NU # MATHEMATICAL MONOSPACE DIGIT ZERO
+1D7F7;NU # MATHEMATICAL MONOSPACE DIGIT ONE
+1D7F8;NU # MATHEMATICAL MONOSPACE DIGIT TWO
+1D7F9;NU # MATHEMATICAL MONOSPACE DIGIT THREE
+1D7FA;NU # MATHEMATICAL MONOSPACE DIGIT FOUR
+1D7FB;NU # MATHEMATICAL MONOSPACE DIGIT FIVE
+1D7FC;NU # MATHEMATICAL MONOSPACE DIGIT SIX
+1D7FD;NU # MATHEMATICAL MONOSPACE DIGIT SEVEN
+1D7FE;NU # MATHEMATICAL MONOSPACE DIGIT EIGHT
+1D7FF;NU # MATHEMATICAL MONOSPACE DIGIT NINE
+1F000;AL # MAHJONG TILE EAST WIND
+1F001;AL # MAHJONG TILE SOUTH WIND
+1F002;AL # MAHJONG TILE WEST WIND
+1F003;AL # MAHJONG TILE NORTH WIND
+1F004;AL # MAHJONG TILE RED DRAGON
+1F005;AL # MAHJONG TILE GREEN DRAGON
+1F006;AL # MAHJONG TILE WHITE DRAGON
+1F007;AL # MAHJONG TILE ONE OF CHARACTERS
+1F008;AL # MAHJONG TILE TWO OF CHARACTERS
+1F009;AL # MAHJONG TILE THREE OF CHARACTERS
+1F00A;AL # MAHJONG TILE FOUR OF CHARACTERS
+1F00B;AL # MAHJONG TILE FIVE OF CHARACTERS
+1F00C;AL # MAHJONG TILE SIX OF CHARACTERS
+1F00D;AL # MAHJONG TILE SEVEN OF CHARACTERS
+1F00E;AL # MAHJONG TILE EIGHT OF CHARACTERS
+1F00F;AL # MAHJONG TILE NINE OF CHARACTERS
+1F010;AL # MAHJONG TILE ONE OF BAMBOOS
+1F011;AL # MAHJONG TILE TWO OF BAMBOOS
+1F012;AL # MAHJONG TILE THREE OF BAMBOOS
+1F013;AL # MAHJONG TILE FOUR OF BAMBOOS
+1F014;AL # MAHJONG TILE FIVE OF BAMBOOS
+1F015;AL # MAHJONG TILE SIX OF BAMBOOS
+1F016;AL # MAHJONG TILE SEVEN OF BAMBOOS
+1F017;AL # MAHJONG TILE EIGHT OF BAMBOOS
+1F018;AL # MAHJONG TILE NINE OF BAMBOOS
+1F019;AL # MAHJONG TILE ONE OF CIRCLES
+1F01A;AL # MAHJONG TILE TWO OF CIRCLES
+1F01B;AL # MAHJONG TILE THREE OF CIRCLES
+1F01C;AL # MAHJONG TILE FOUR OF CIRCLES
+1F01D;AL # MAHJONG TILE FIVE OF CIRCLES
+1F01E;AL # MAHJONG TILE SIX OF CIRCLES
+1F01F;AL # MAHJONG TILE SEVEN OF CIRCLES
+1F020;AL # MAHJONG TILE EIGHT OF CIRCLES
+1F021;AL # MAHJONG TILE NINE OF CIRCLES
+1F022;AL # MAHJONG TILE PLUM
+1F023;AL # MAHJONG TILE ORCHID
+1F024;AL # MAHJONG TILE BAMBOO
+1F025;AL # MAHJONG TILE CHRYSANTHEMUM
+1F026;AL # MAHJONG TILE SPRING
+1F027;AL # MAHJONG TILE SUMMER
+1F028;AL # MAHJONG TILE AUTUMN
+1F029;AL # MAHJONG TILE WINTER
+1F02A;AL # MAHJONG TILE JOKER
+1F02B;AL # MAHJONG TILE BACK
+1F030;AL # DOMINO TILE HORIZONTAL BACK
+1F031;AL # DOMINO TILE HORIZONTAL-00-00
+1F032;AL # DOMINO TILE HORIZONTAL-00-01
+1F033;AL # DOMINO TILE HORIZONTAL-00-02
+1F034;AL # DOMINO TILE HORIZONTAL-00-03
+1F035;AL # DOMINO TILE HORIZONTAL-00-04
+1F036;AL # DOMINO TILE HORIZONTAL-00-05
+1F037;AL # DOMINO TILE HORIZONTAL-00-06
+1F038;AL # DOMINO TILE HORIZONTAL-01-00
+1F039;AL # DOMINO TILE HORIZONTAL-01-01
+1F03A;AL # DOMINO TILE HORIZONTAL-01-02
+1F03B;AL # DOMINO TILE HORIZONTAL-01-03
+1F03C;AL # DOMINO TILE HORIZONTAL-01-04
+1F03D;AL # DOMINO TILE HORIZONTAL-01-05
+1F03E;AL # DOMINO TILE HORIZONTAL-01-06
+1F03F;AL # DOMINO TILE HORIZONTAL-02-00
+1F040;AL # DOMINO TILE HORIZONTAL-02-01
+1F041;AL # DOMINO TILE HORIZONTAL-02-02
+1F042;AL # DOMINO TILE HORIZONTAL-02-03
+1F043;AL # DOMINO TILE HORIZONTAL-02-04
+1F044;AL # DOMINO TILE HORIZONTAL-02-05
+1F045;AL # DOMINO TILE HORIZONTAL-02-06
+1F046;AL # DOMINO TILE HORIZONTAL-03-00
+1F047;AL # DOMINO TILE HORIZONTAL-03-01
+1F048;AL # DOMINO TILE HORIZONTAL-03-02
+1F049;AL # DOMINO TILE HORIZONTAL-03-03
+1F04A;AL # DOMINO TILE HORIZONTAL-03-04
+1F04B;AL # DOMINO TILE HORIZONTAL-03-05
+1F04C;AL # DOMINO TILE HORIZONTAL-03-06
+1F04D;AL # DOMINO TILE HORIZONTAL-04-00
+1F04E;AL # DOMINO TILE HORIZONTAL-04-01
+1F04F;AL # DOMINO TILE HORIZONTAL-04-02
+1F050;AL # DOMINO TILE HORIZONTAL-04-03
+1F051;AL # DOMINO TILE HORIZONTAL-04-04
+1F052;AL # DOMINO TILE HORIZONTAL-04-05
+1F053;AL # DOMINO TILE HORIZONTAL-04-06
+1F054;AL # DOMINO TILE HORIZONTAL-05-00
+1F055;AL # DOMINO TILE HORIZONTAL-05-01
+1F056;AL # DOMINO TILE HORIZONTAL-05-02
+1F057;AL # DOMINO TILE HORIZONTAL-05-03
+1F058;AL # DOMINO TILE HORIZONTAL-05-04
+1F059;AL # DOMINO TILE HORIZONTAL-05-05
+1F05A;AL # DOMINO TILE HORIZONTAL-05-06
+1F05B;AL # DOMINO TILE HORIZONTAL-06-00
+1F05C;AL # DOMINO TILE HORIZONTAL-06-01
+1F05D;AL # DOMINO TILE HORIZONTAL-06-02
+1F05E;AL # DOMINO TILE HORIZONTAL-06-03
+1F05F;AL # DOMINO TILE HORIZONTAL-06-04
+1F060;AL # DOMINO TILE HORIZONTAL-06-05
+1F061;AL # DOMINO TILE HORIZONTAL-06-06
+1F062;AL # DOMINO TILE VERTICAL BACK
+1F063;AL # DOMINO TILE VERTICAL-00-00
+1F064;AL # DOMINO TILE VERTICAL-00-01
+1F065;AL # DOMINO TILE VERTICAL-00-02
+1F066;AL # DOMINO TILE VERTICAL-00-03
+1F067;AL # DOMINO TILE VERTICAL-00-04
+1F068;AL # DOMINO TILE VERTICAL-00-05
+1F069;AL # DOMINO TILE VERTICAL-00-06
+1F06A;AL # DOMINO TILE VERTICAL-01-00
+1F06B;AL # DOMINO TILE VERTICAL-01-01
+1F06C;AL # DOMINO TILE VERTICAL-01-02
+1F06D;AL # DOMINO TILE VERTICAL-01-03
+1F06E;AL # DOMINO TILE VERTICAL-01-04
+1F06F;AL # DOMINO TILE VERTICAL-01-05
+1F070;AL # DOMINO TILE VERTICAL-01-06
+1F071;AL # DOMINO TILE VERTICAL-02-00
+1F072;AL # DOMINO TILE VERTICAL-02-01
+1F073;AL # DOMINO TILE VERTICAL-02-02
+1F074;AL # DOMINO TILE VERTICAL-02-03
+1F075;AL # DOMINO TILE VERTICAL-02-04
+1F076;AL # DOMINO TILE VERTICAL-02-05
+1F077;AL # DOMINO TILE VERTICAL-02-06
+1F078;AL # DOMINO TILE VERTICAL-03-00
+1F079;AL # DOMINO TILE VERTICAL-03-01
+1F07A;AL # DOMINO TILE VERTICAL-03-02
+1F07B;AL # DOMINO TILE VERTICAL-03-03
+1F07C;AL # DOMINO TILE VERTICAL-03-04
+1F07D;AL # DOMINO TILE VERTICAL-03-05
+1F07E;AL # DOMINO TILE VERTICAL-03-06
+1F07F;AL # DOMINO TILE VERTICAL-04-00
+1F080;AL # DOMINO TILE VERTICAL-04-01
+1F081;AL # DOMINO TILE VERTICAL-04-02
+1F082;AL # DOMINO TILE VERTICAL-04-03
+1F083;AL # DOMINO TILE VERTICAL-04-04
+1F084;AL # DOMINO TILE VERTICAL-04-05
+1F085;AL # DOMINO TILE VERTICAL-04-06
+1F086;AL # DOMINO TILE VERTICAL-05-00
+1F087;AL # DOMINO TILE VERTICAL-05-01
+1F088;AL # DOMINO TILE VERTICAL-05-02
+1F089;AL # DOMINO TILE VERTICAL-05-03
+1F08A;AL # DOMINO TILE VERTICAL-05-04
+1F08B;AL # DOMINO TILE VERTICAL-05-05
+1F08C;AL # DOMINO TILE VERTICAL-05-06
+1F08D;AL # DOMINO TILE VERTICAL-06-00
+1F08E;AL # DOMINO TILE VERTICAL-06-01
+1F08F;AL # DOMINO TILE VERTICAL-06-02
+1F090;AL # DOMINO TILE VERTICAL-06-03
+1F091;AL # DOMINO TILE VERTICAL-06-04
+1F092;AL # DOMINO TILE VERTICAL-06-05
+1F093;AL # DOMINO TILE VERTICAL-06-06
+20000..2A6D6;ID # <CJK Ideograph Extension B, First>..<CJK Ideograph Extension B, Last>
+2F800;ID # CJK COMPATIBILITY IDEOGRAPH-2F800
+2F801;ID # CJK COMPATIBILITY IDEOGRAPH-2F801
+2F802;ID # CJK COMPATIBILITY IDEOGRAPH-2F802
+2F803;ID # CJK COMPATIBILITY IDEOGRAPH-2F803
+2F804;ID # CJK COMPATIBILITY IDEOGRAPH-2F804
+2F805;ID # CJK COMPATIBILITY IDEOGRAPH-2F805
+2F806;ID # CJK COMPATIBILITY IDEOGRAPH-2F806
+2F807;ID # CJK COMPATIBILITY IDEOGRAPH-2F807
+2F808;ID # CJK COMPATIBILITY IDEOGRAPH-2F808
+2F809;ID # CJK COMPATIBILITY IDEOGRAPH-2F809
+2F80A;ID # CJK COMPATIBILITY IDEOGRAPH-2F80A
+2F80B;ID # CJK COMPATIBILITY IDEOGRAPH-2F80B
+2F80C;ID # CJK COMPATIBILITY IDEOGRAPH-2F80C
+2F80D;ID # CJK COMPATIBILITY IDEOGRAPH-2F80D
+2F80E;ID # CJK COMPATIBILITY IDEOGRAPH-2F80E
+2F80F;ID # CJK COMPATIBILITY IDEOGRAPH-2F80F
+2F810;ID # CJK COMPATIBILITY IDEOGRAPH-2F810
+2F811;ID # CJK COMPATIBILITY IDEOGRAPH-2F811
+2F812;ID # CJK COMPATIBILITY IDEOGRAPH-2F812
+2F813;ID # CJK COMPATIBILITY IDEOGRAPH-2F813
+2F814;ID # CJK COMPATIBILITY IDEOGRAPH-2F814
+2F815;ID # CJK COMPATIBILITY IDEOGRAPH-2F815
+2F816;ID # CJK COMPATIBILITY IDEOGRAPH-2F816
+2F817;ID # CJK COMPATIBILITY IDEOGRAPH-2F817
+2F818;ID # CJK COMPATIBILITY IDEOGRAPH-2F818
+2F819;ID # CJK COMPATIBILITY IDEOGRAPH-2F819
+2F81A;ID # CJK COMPATIBILITY IDEOGRAPH-2F81A
+2F81B;ID # CJK COMPATIBILITY IDEOGRAPH-2F81B
+2F81C;ID # CJK COMPATIBILITY IDEOGRAPH-2F81C
+2F81D;ID # CJK COMPATIBILITY IDEOGRAPH-2F81D
+2F81E;ID # CJK COMPATIBILITY IDEOGRAPH-2F81E
+2F81F;ID # CJK COMPATIBILITY IDEOGRAPH-2F81F
+2F820;ID # CJK COMPATIBILITY IDEOGRAPH-2F820
+2F821;ID # CJK COMPATIBILITY IDEOGRAPH-2F821
+2F822;ID # CJK COMPATIBILITY IDEOGRAPH-2F822
+2F823;ID # CJK COMPATIBILITY IDEOGRAPH-2F823
+2F824;ID # CJK COMPATIBILITY IDEOGRAPH-2F824
+2F825;ID # CJK COMPATIBILITY IDEOGRAPH-2F825
+2F826;ID # CJK COMPATIBILITY IDEOGRAPH-2F826
+2F827;ID # CJK COMPATIBILITY IDEOGRAPH-2F827
+2F828;ID # CJK COMPATIBILITY IDEOGRAPH-2F828
+2F829;ID # CJK COMPATIBILITY IDEOGRAPH-2F829
+2F82A;ID # CJK COMPATIBILITY IDEOGRAPH-2F82A
+2F82B;ID # CJK COMPATIBILITY IDEOGRAPH-2F82B
+2F82C;ID # CJK COMPATIBILITY IDEOGRAPH-2F82C
+2F82D;ID # CJK COMPATIBILITY IDEOGRAPH-2F82D
+2F82E;ID # CJK COMPATIBILITY IDEOGRAPH-2F82E
+2F82F;ID # CJK COMPATIBILITY IDEOGRAPH-2F82F
+2F830;ID # CJK COMPATIBILITY IDEOGRAPH-2F830
+2F831;ID # CJK COMPATIBILITY IDEOGRAPH-2F831
+2F832;ID # CJK COMPATIBILITY IDEOGRAPH-2F832
+2F833;ID # CJK COMPATIBILITY IDEOGRAPH-2F833
+2F834;ID # CJK COMPATIBILITY IDEOGRAPH-2F834
+2F835;ID # CJK COMPATIBILITY IDEOGRAPH-2F835
+2F836;ID # CJK COMPATIBILITY IDEOGRAPH-2F836
+2F837;ID # CJK COMPATIBILITY IDEOGRAPH-2F837
+2F838;ID # CJK COMPATIBILITY IDEOGRAPH-2F838
+2F839;ID # CJK COMPATIBILITY IDEOGRAPH-2F839
+2F83A;ID # CJK COMPATIBILITY IDEOGRAPH-2F83A
+2F83B;ID # CJK COMPATIBILITY IDEOGRAPH-2F83B
+2F83C;ID # CJK COMPATIBILITY IDEOGRAPH-2F83C
+2F83D;ID # CJK COMPATIBILITY IDEOGRAPH-2F83D
+2F83E;ID # CJK COMPATIBILITY IDEOGRAPH-2F83E
+2F83F;ID # CJK COMPATIBILITY IDEOGRAPH-2F83F
+2F840;ID # CJK COMPATIBILITY IDEOGRAPH-2F840
+2F841;ID # CJK COMPATIBILITY IDEOGRAPH-2F841
+2F842;ID # CJK COMPATIBILITY IDEOGRAPH-2F842
+2F843;ID # CJK COMPATIBILITY IDEOGRAPH-2F843
+2F844;ID # CJK COMPATIBILITY IDEOGRAPH-2F844
+2F845;ID # CJK COMPATIBILITY IDEOGRAPH-2F845
+2F846;ID # CJK COMPATIBILITY IDEOGRAPH-2F846
+2F847;ID # CJK COMPATIBILITY IDEOGRAPH-2F847
+2F848;ID # CJK COMPATIBILITY IDEOGRAPH-2F848
+2F849;ID # CJK COMPATIBILITY IDEOGRAPH-2F849
+2F84A;ID # CJK COMPATIBILITY IDEOGRAPH-2F84A
+2F84B;ID # CJK COMPATIBILITY IDEOGRAPH-2F84B
+2F84C;ID # CJK COMPATIBILITY IDEOGRAPH-2F84C
+2F84D;ID # CJK COMPATIBILITY IDEOGRAPH-2F84D
+2F84E;ID # CJK COMPATIBILITY IDEOGRAPH-2F84E
+2F84F;ID # CJK COMPATIBILITY IDEOGRAPH-2F84F
+2F850;ID # CJK COMPATIBILITY IDEOGRAPH-2F850
+2F851;ID # CJK COMPATIBILITY IDEOGRAPH-2F851
+2F852;ID # CJK COMPATIBILITY IDEOGRAPH-2F852
+2F853;ID # CJK COMPATIBILITY IDEOGRAPH-2F853
+2F854;ID # CJK COMPATIBILITY IDEOGRAPH-2F854
+2F855;ID # CJK COMPATIBILITY IDEOGRAPH-2F855
+2F856;ID # CJK COMPATIBILITY IDEOGRAPH-2F856
+2F857;ID # CJK COMPATIBILITY IDEOGRAPH-2F857
+2F858;ID # CJK COMPATIBILITY IDEOGRAPH-2F858
+2F859;ID # CJK COMPATIBILITY IDEOGRAPH-2F859
+2F85A;ID # CJK COMPATIBILITY IDEOGRAPH-2F85A
+2F85B;ID # CJK COMPATIBILITY IDEOGRAPH-2F85B
+2F85C;ID # CJK COMPATIBILITY IDEOGRAPH-2F85C
+2F85D;ID # CJK COMPATIBILITY IDEOGRAPH-2F85D
+2F85E;ID # CJK COMPATIBILITY IDEOGRAPH-2F85E
+2F85F;ID # CJK COMPATIBILITY IDEOGRAPH-2F85F
+2F860;ID # CJK COMPATIBILITY IDEOGRAPH-2F860
+2F861;ID # CJK COMPATIBILITY IDEOGRAPH-2F861
+2F862;ID # CJK COMPATIBILITY IDEOGRAPH-2F862
+2F863;ID # CJK COMPATIBILITY IDEOGRAPH-2F863
+2F864;ID # CJK COMPATIBILITY IDEOGRAPH-2F864
+2F865;ID # CJK COMPATIBILITY IDEOGRAPH-2F865
+2F866;ID # CJK COMPATIBILITY IDEOGRAPH-2F866
+2F867;ID # CJK COMPATIBILITY IDEOGRAPH-2F867
+2F868;ID # CJK COMPATIBILITY IDEOGRAPH-2F868
+2F869;ID # CJK COMPATIBILITY IDEOGRAPH-2F869
+2F86A;ID # CJK COMPATIBILITY IDEOGRAPH-2F86A
+2F86B;ID # CJK COMPATIBILITY IDEOGRAPH-2F86B
+2F86C;ID # CJK COMPATIBILITY IDEOGRAPH-2F86C
+2F86D;ID # CJK COMPATIBILITY IDEOGRAPH-2F86D
+2F86E;ID # CJK COMPATIBILITY IDEOGRAPH-2F86E
+2F86F;ID # CJK COMPATIBILITY IDEOGRAPH-2F86F
+2F870;ID # CJK COMPATIBILITY IDEOGRAPH-2F870
+2F871;ID # CJK COMPATIBILITY IDEOGRAPH-2F871
+2F872;ID # CJK COMPATIBILITY IDEOGRAPH-2F872
+2F873;ID # CJK COMPATIBILITY IDEOGRAPH-2F873
+2F874;ID # CJK COMPATIBILITY IDEOGRAPH-2F874
+2F875;ID # CJK COMPATIBILITY IDEOGRAPH-2F875
+2F876;ID # CJK COMPATIBILITY IDEOGRAPH-2F876
+2F877;ID # CJK COMPATIBILITY IDEOGRAPH-2F877
+2F878;ID # CJK COMPATIBILITY IDEOGRAPH-2F878
+2F879;ID # CJK COMPATIBILITY IDEOGRAPH-2F879
+2F87A;ID # CJK COMPATIBILITY IDEOGRAPH-2F87A
+2F87B;ID # CJK COMPATIBILITY IDEOGRAPH-2F87B
+2F87C;ID # CJK COMPATIBILITY IDEOGRAPH-2F87C
+2F87D;ID # CJK COMPATIBILITY IDEOGRAPH-2F87D
+2F87E;ID # CJK COMPATIBILITY IDEOGRAPH-2F87E
+2F87F;ID # CJK COMPATIBILITY IDEOGRAPH-2F87F
+2F880;ID # CJK COMPATIBILITY IDEOGRAPH-2F880
+2F881;ID # CJK COMPATIBILITY IDEOGRAPH-2F881
+2F882;ID # CJK COMPATIBILITY IDEOGRAPH-2F882
+2F883;ID # CJK COMPATIBILITY IDEOGRAPH-2F883
+2F884;ID # CJK COMPATIBILITY IDEOGRAPH-2F884
+2F885;ID # CJK COMPATIBILITY IDEOGRAPH-2F885
+2F886;ID # CJK COMPATIBILITY IDEOGRAPH-2F886
+2F887;ID # CJK COMPATIBILITY IDEOGRAPH-2F887
+2F888;ID # CJK COMPATIBILITY IDEOGRAPH-2F888
+2F889;ID # CJK COMPATIBILITY IDEOGRAPH-2F889
+2F88A;ID # CJK COMPATIBILITY IDEOGRAPH-2F88A
+2F88B;ID # CJK COMPATIBILITY IDEOGRAPH-2F88B
+2F88C;ID # CJK COMPATIBILITY IDEOGRAPH-2F88C
+2F88D;ID # CJK COMPATIBILITY IDEOGRAPH-2F88D
+2F88E;ID # CJK COMPATIBILITY IDEOGRAPH-2F88E
+2F88F;ID # CJK COMPATIBILITY IDEOGRAPH-2F88F
+2F890;ID # CJK COMPATIBILITY IDEOGRAPH-2F890
+2F891;ID # CJK COMPATIBILITY IDEOGRAPH-2F891
+2F892;ID # CJK COMPATIBILITY IDEOGRAPH-2F892
+2F893;ID # CJK COMPATIBILITY IDEOGRAPH-2F893
+2F894;ID # CJK COMPATIBILITY IDEOGRAPH-2F894
+2F895;ID # CJK COMPATIBILITY IDEOGRAPH-2F895
+2F896;ID # CJK COMPATIBILITY IDEOGRAPH-2F896
+2F897;ID # CJK COMPATIBILITY IDEOGRAPH-2F897
+2F898;ID # CJK COMPATIBILITY IDEOGRAPH-2F898
+2F899;ID # CJK COMPATIBILITY IDEOGRAPH-2F899
+2F89A;ID # CJK COMPATIBILITY IDEOGRAPH-2F89A
+2F89B;ID # CJK COMPATIBILITY IDEOGRAPH-2F89B
+2F89C;ID # CJK COMPATIBILITY IDEOGRAPH-2F89C
+2F89D;ID # CJK COMPATIBILITY IDEOGRAPH-2F89D
+2F89E;ID # CJK COMPATIBILITY IDEOGRAPH-2F89E
+2F89F;ID # CJK COMPATIBILITY IDEOGRAPH-2F89F
+2F8A0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A0
+2F8A1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A1
+2F8A2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A2
+2F8A3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A3
+2F8A4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A4
+2F8A5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A5
+2F8A6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A6
+2F8A7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A7
+2F8A8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A8
+2F8A9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A9
+2F8AA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AA
+2F8AB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AB
+2F8AC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AC
+2F8AD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AD
+2F8AE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AE
+2F8AF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AF
+2F8B0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B0
+2F8B1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B1
+2F8B2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B2
+2F8B3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B3
+2F8B4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B4
+2F8B5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B5
+2F8B6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B6
+2F8B7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B7
+2F8B8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B8
+2F8B9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B9
+2F8BA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BA
+2F8BB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BB
+2F8BC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BC
+2F8BD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BD
+2F8BE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BE
+2F8BF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BF
+2F8C0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C0
+2F8C1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C1
+2F8C2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C2
+2F8C3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C3
+2F8C4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C4
+2F8C5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C5
+2F8C6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C6
+2F8C7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C7
+2F8C8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C8
+2F8C9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C9
+2F8CA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CA
+2F8CB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CB
+2F8CC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CC
+2F8CD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CD
+2F8CE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CE
+2F8CF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CF
+2F8D0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D0
+2F8D1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D1
+2F8D2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D2
+2F8D3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D3
+2F8D4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D4
+2F8D5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D5
+2F8D6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D6
+2F8D7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D7
+2F8D8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D8
+2F8D9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D9
+2F8DA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DA
+2F8DB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DB
+2F8DC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DC
+2F8DD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DD
+2F8DE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DE
+2F8DF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DF
+2F8E0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E0
+2F8E1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E1
+2F8E2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E2
+2F8E3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E3
+2F8E4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E4
+2F8E5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E5
+2F8E6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E6
+2F8E7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E7
+2F8E8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E8
+2F8E9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E9
+2F8EA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EA
+2F8EB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EB
+2F8EC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EC
+2F8ED;ID # CJK COMPATIBILITY IDEOGRAPH-2F8ED
+2F8EE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EE
+2F8EF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EF
+2F8F0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F0
+2F8F1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F1
+2F8F2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F2
+2F8F3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F3
+2F8F4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F4
+2F8F5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F5
+2F8F6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F6
+2F8F7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F7
+2F8F8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F8
+2F8F9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F9
+2F8FA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FA
+2F8FB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FB
+2F8FC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FC
+2F8FD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FD
+2F8FE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FE
+2F8FF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FF
+2F900;ID # CJK COMPATIBILITY IDEOGRAPH-2F900
+2F901;ID # CJK COMPATIBILITY IDEOGRAPH-2F901
+2F902;ID # CJK COMPATIBILITY IDEOGRAPH-2F902
+2F903;ID # CJK COMPATIBILITY IDEOGRAPH-2F903
+2F904;ID # CJK COMPATIBILITY IDEOGRAPH-2F904
+2F905;ID # CJK COMPATIBILITY IDEOGRAPH-2F905
+2F906;ID # CJK COMPATIBILITY IDEOGRAPH-2F906
+2F907;ID # CJK COMPATIBILITY IDEOGRAPH-2F907
+2F908;ID # CJK COMPATIBILITY IDEOGRAPH-2F908
+2F909;ID # CJK COMPATIBILITY IDEOGRAPH-2F909
+2F90A;ID # CJK COMPATIBILITY IDEOGRAPH-2F90A
+2F90B;ID # CJK COMPATIBILITY IDEOGRAPH-2F90B
+2F90C;ID # CJK COMPATIBILITY IDEOGRAPH-2F90C
+2F90D;ID # CJK COMPATIBILITY IDEOGRAPH-2F90D
+2F90E;ID # CJK COMPATIBILITY IDEOGRAPH-2F90E
+2F90F;ID # CJK COMPATIBILITY IDEOGRAPH-2F90F
+2F910;ID # CJK COMPATIBILITY IDEOGRAPH-2F910
+2F911;ID # CJK COMPATIBILITY IDEOGRAPH-2F911
+2F912;ID # CJK COMPATIBILITY IDEOGRAPH-2F912
+2F913;ID # CJK COMPATIBILITY IDEOGRAPH-2F913
+2F914;ID # CJK COMPATIBILITY IDEOGRAPH-2F914
+2F915;ID # CJK COMPATIBILITY IDEOGRAPH-2F915
+2F916;ID # CJK COMPATIBILITY IDEOGRAPH-2F916
+2F917;ID # CJK COMPATIBILITY IDEOGRAPH-2F917
+2F918;ID # CJK COMPATIBILITY IDEOGRAPH-2F918
+2F919;ID # CJK COMPATIBILITY IDEOGRAPH-2F919
+2F91A;ID # CJK COMPATIBILITY IDEOGRAPH-2F91A
+2F91B;ID # CJK COMPATIBILITY IDEOGRAPH-2F91B
+2F91C;ID # CJK COMPATIBILITY IDEOGRAPH-2F91C
+2F91D;ID # CJK COMPATIBILITY IDEOGRAPH-2F91D
+2F91E;ID # CJK COMPATIBILITY IDEOGRAPH-2F91E
+2F91F;ID # CJK COMPATIBILITY IDEOGRAPH-2F91F
+2F920;ID # CJK COMPATIBILITY IDEOGRAPH-2F920
+2F921;ID # CJK COMPATIBILITY IDEOGRAPH-2F921
+2F922;ID # CJK COMPATIBILITY IDEOGRAPH-2F922
+2F923;ID # CJK COMPATIBILITY IDEOGRAPH-2F923
+2F924;ID # CJK COMPATIBILITY IDEOGRAPH-2F924
+2F925;ID # CJK COMPATIBILITY IDEOGRAPH-2F925
+2F926;ID # CJK COMPATIBILITY IDEOGRAPH-2F926
+2F927;ID # CJK COMPATIBILITY IDEOGRAPH-2F927
+2F928;ID # CJK COMPATIBILITY IDEOGRAPH-2F928
+2F929;ID # CJK COMPATIBILITY IDEOGRAPH-2F929
+2F92A;ID # CJK COMPATIBILITY IDEOGRAPH-2F92A
+2F92B;ID # CJK COMPATIBILITY IDEOGRAPH-2F92B
+2F92C;ID # CJK COMPATIBILITY IDEOGRAPH-2F92C
+2F92D;ID # CJK COMPATIBILITY IDEOGRAPH-2F92D
+2F92E;ID # CJK COMPATIBILITY IDEOGRAPH-2F92E
+2F92F;ID # CJK COMPATIBILITY IDEOGRAPH-2F92F
+2F930;ID # CJK COMPATIBILITY IDEOGRAPH-2F930
+2F931;ID # CJK COMPATIBILITY IDEOGRAPH-2F931
+2F932;ID # CJK COMPATIBILITY IDEOGRAPH-2F932
+2F933;ID # CJK COMPATIBILITY IDEOGRAPH-2F933
+2F934;ID # CJK COMPATIBILITY IDEOGRAPH-2F934
+2F935;ID # CJK COMPATIBILITY IDEOGRAPH-2F935
+2F936;ID # CJK COMPATIBILITY IDEOGRAPH-2F936
+2F937;ID # CJK COMPATIBILITY IDEOGRAPH-2F937
+2F938;ID # CJK COMPATIBILITY IDEOGRAPH-2F938
+2F939;ID # CJK COMPATIBILITY IDEOGRAPH-2F939
+2F93A;ID # CJK COMPATIBILITY IDEOGRAPH-2F93A
+2F93B;ID # CJK COMPATIBILITY IDEOGRAPH-2F93B
+2F93C;ID # CJK COMPATIBILITY IDEOGRAPH-2F93C
+2F93D;ID # CJK COMPATIBILITY IDEOGRAPH-2F93D
+2F93E;ID # CJK COMPATIBILITY IDEOGRAPH-2F93E
+2F93F;ID # CJK COMPATIBILITY IDEOGRAPH-2F93F
+2F940;ID # CJK COMPATIBILITY IDEOGRAPH-2F940
+2F941;ID # CJK COMPATIBILITY IDEOGRAPH-2F941
+2F942;ID # CJK COMPATIBILITY IDEOGRAPH-2F942
+2F943;ID # CJK COMPATIBILITY IDEOGRAPH-2F943
+2F944;ID # CJK COMPATIBILITY IDEOGRAPH-2F944
+2F945;ID # CJK COMPATIBILITY IDEOGRAPH-2F945
+2F946;ID # CJK COMPATIBILITY IDEOGRAPH-2F946
+2F947;ID # CJK COMPATIBILITY IDEOGRAPH-2F947
+2F948;ID # CJK COMPATIBILITY IDEOGRAPH-2F948
+2F949;ID # CJK COMPATIBILITY IDEOGRAPH-2F949
+2F94A;ID # CJK COMPATIBILITY IDEOGRAPH-2F94A
+2F94B;ID # CJK COMPATIBILITY IDEOGRAPH-2F94B
+2F94C;ID # CJK COMPATIBILITY IDEOGRAPH-2F94C
+2F94D;ID # CJK COMPATIBILITY IDEOGRAPH-2F94D
+2F94E;ID # CJK COMPATIBILITY IDEOGRAPH-2F94E
+2F94F;ID # CJK COMPATIBILITY IDEOGRAPH-2F94F
+2F950;ID # CJK COMPATIBILITY IDEOGRAPH-2F950
+2F951;ID # CJK COMPATIBILITY IDEOGRAPH-2F951
+2F952;ID # CJK COMPATIBILITY IDEOGRAPH-2F952
+2F953;ID # CJK COMPATIBILITY IDEOGRAPH-2F953
+2F954;ID # CJK COMPATIBILITY IDEOGRAPH-2F954
+2F955;ID # CJK COMPATIBILITY IDEOGRAPH-2F955
+2F956;ID # CJK COMPATIBILITY IDEOGRAPH-2F956
+2F957;ID # CJK COMPATIBILITY IDEOGRAPH-2F957
+2F958;ID # CJK COMPATIBILITY IDEOGRAPH-2F958
+2F959;ID # CJK COMPATIBILITY IDEOGRAPH-2F959
+2F95A;ID # CJK COMPATIBILITY IDEOGRAPH-2F95A
+2F95B;ID # CJK COMPATIBILITY IDEOGRAPH-2F95B
+2F95C;ID # CJK COMPATIBILITY IDEOGRAPH-2F95C
+2F95D;ID # CJK COMPATIBILITY IDEOGRAPH-2F95D
+2F95E;ID # CJK COMPATIBILITY IDEOGRAPH-2F95E
+2F95F;ID # CJK COMPATIBILITY IDEOGRAPH-2F95F
+2F960;ID # CJK COMPATIBILITY IDEOGRAPH-2F960
+2F961;ID # CJK COMPATIBILITY IDEOGRAPH-2F961
+2F962;ID # CJK COMPATIBILITY IDEOGRAPH-2F962
+2F963;ID # CJK COMPATIBILITY IDEOGRAPH-2F963
+2F964;ID # CJK COMPATIBILITY IDEOGRAPH-2F964
+2F965;ID # CJK COMPATIBILITY IDEOGRAPH-2F965
+2F966;ID # CJK COMPATIBILITY IDEOGRAPH-2F966
+2F967;ID # CJK COMPATIBILITY IDEOGRAPH-2F967
+2F968;ID # CJK COMPATIBILITY IDEOGRAPH-2F968
+2F969;ID # CJK COMPATIBILITY IDEOGRAPH-2F969
+2F96A;ID # CJK COMPATIBILITY IDEOGRAPH-2F96A
+2F96B;ID # CJK COMPATIBILITY IDEOGRAPH-2F96B
+2F96C;ID # CJK COMPATIBILITY IDEOGRAPH-2F96C
+2F96D;ID # CJK COMPATIBILITY IDEOGRAPH-2F96D
+2F96E;ID # CJK COMPATIBILITY IDEOGRAPH-2F96E
+2F96F;ID # CJK COMPATIBILITY IDEOGRAPH-2F96F
+2F970;ID # CJK COMPATIBILITY IDEOGRAPH-2F970
+2F971;ID # CJK COMPATIBILITY IDEOGRAPH-2F971
+2F972;ID # CJK COMPATIBILITY IDEOGRAPH-2F972
+2F973;ID # CJK COMPATIBILITY IDEOGRAPH-2F973
+2F974;ID # CJK COMPATIBILITY IDEOGRAPH-2F974
+2F975;ID # CJK COMPATIBILITY IDEOGRAPH-2F975
+2F976;ID # CJK COMPATIBILITY IDEOGRAPH-2F976
+2F977;ID # CJK COMPATIBILITY IDEOGRAPH-2F977
+2F978;ID # CJK COMPATIBILITY IDEOGRAPH-2F978
+2F979;ID # CJK COMPATIBILITY IDEOGRAPH-2F979
+2F97A;ID # CJK COMPATIBILITY IDEOGRAPH-2F97A
+2F97B;ID # CJK COMPATIBILITY IDEOGRAPH-2F97B
+2F97C;ID # CJK COMPATIBILITY IDEOGRAPH-2F97C
+2F97D;ID # CJK COMPATIBILITY IDEOGRAPH-2F97D
+2F97E;ID # CJK COMPATIBILITY IDEOGRAPH-2F97E
+2F97F;ID # CJK COMPATIBILITY IDEOGRAPH-2F97F
+2F980;ID # CJK COMPATIBILITY IDEOGRAPH-2F980
+2F981;ID # CJK COMPATIBILITY IDEOGRAPH-2F981
+2F982;ID # CJK COMPATIBILITY IDEOGRAPH-2F982
+2F983;ID # CJK COMPATIBILITY IDEOGRAPH-2F983
+2F984;ID # CJK COMPATIBILITY IDEOGRAPH-2F984
+2F985;ID # CJK COMPATIBILITY IDEOGRAPH-2F985
+2F986;ID # CJK COMPATIBILITY IDEOGRAPH-2F986
+2F987;ID # CJK COMPATIBILITY IDEOGRAPH-2F987
+2F988;ID # CJK COMPATIBILITY IDEOGRAPH-2F988
+2F989;ID # CJK COMPATIBILITY IDEOGRAPH-2F989
+2F98A;ID # CJK COMPATIBILITY IDEOGRAPH-2F98A
+2F98B;ID # CJK COMPATIBILITY IDEOGRAPH-2F98B
+2F98C;ID # CJK COMPATIBILITY IDEOGRAPH-2F98C
+2F98D;ID # CJK COMPATIBILITY IDEOGRAPH-2F98D
+2F98E;ID # CJK COMPATIBILITY IDEOGRAPH-2F98E
+2F98F;ID # CJK COMPATIBILITY IDEOGRAPH-2F98F
+2F990;ID # CJK COMPATIBILITY IDEOGRAPH-2F990
+2F991;ID # CJK COMPATIBILITY IDEOGRAPH-2F991
+2F992;ID # CJK COMPATIBILITY IDEOGRAPH-2F992
+2F993;ID # CJK COMPATIBILITY IDEOGRAPH-2F993
+2F994;ID # CJK COMPATIBILITY IDEOGRAPH-2F994
+2F995;ID # CJK COMPATIBILITY IDEOGRAPH-2F995
+2F996;ID # CJK COMPATIBILITY IDEOGRAPH-2F996
+2F997;ID # CJK COMPATIBILITY IDEOGRAPH-2F997
+2F998;ID # CJK COMPATIBILITY IDEOGRAPH-2F998
+2F999;ID # CJK COMPATIBILITY IDEOGRAPH-2F999
+2F99A;ID # CJK COMPATIBILITY IDEOGRAPH-2F99A
+2F99B;ID # CJK COMPATIBILITY IDEOGRAPH-2F99B
+2F99C;ID # CJK COMPATIBILITY IDEOGRAPH-2F99C
+2F99D;ID # CJK COMPATIBILITY IDEOGRAPH-2F99D
+2F99E;ID # CJK COMPATIBILITY IDEOGRAPH-2F99E
+2F99F;ID # CJK COMPATIBILITY IDEOGRAPH-2F99F
+2F9A0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A0
+2F9A1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A1
+2F9A2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A2
+2F9A3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A3
+2F9A4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A4
+2F9A5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A5
+2F9A6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A6
+2F9A7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A7
+2F9A8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A8
+2F9A9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A9
+2F9AA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AA
+2F9AB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AB
+2F9AC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AC
+2F9AD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AD
+2F9AE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AE
+2F9AF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AF
+2F9B0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B0
+2F9B1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B1
+2F9B2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B2
+2F9B3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B3
+2F9B4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B4
+2F9B5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B5
+2F9B6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B6
+2F9B7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B7
+2F9B8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B8
+2F9B9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B9
+2F9BA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BA
+2F9BB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BB
+2F9BC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BC
+2F9BD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BD
+2F9BE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BE
+2F9BF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BF
+2F9C0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C0
+2F9C1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C1
+2F9C2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C2
+2F9C3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C3
+2F9C4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C4
+2F9C5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C5
+2F9C6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C6
+2F9C7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C7
+2F9C8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C8
+2F9C9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C9
+2F9CA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CA
+2F9CB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CB
+2F9CC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CC
+2F9CD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CD
+2F9CE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CE
+2F9CF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CF
+2F9D0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D0
+2F9D1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D1
+2F9D2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D2
+2F9D3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D3
+2F9D4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D4
+2F9D5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D5
+2F9D6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D6
+2F9D7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D7
+2F9D8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D8
+2F9D9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D9
+2F9DA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DA
+2F9DB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DB
+2F9DC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DC
+2F9DD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DD
+2F9DE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DE
+2F9DF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DF
+2F9E0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E0
+2F9E1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E1
+2F9E2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E2
+2F9E3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E3
+2F9E4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E4
+2F9E5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E5
+2F9E6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E6
+2F9E7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E7
+2F9E8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E8
+2F9E9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E9
+2F9EA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EA
+2F9EB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EB
+2F9EC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EC
+2F9ED;ID # CJK COMPATIBILITY IDEOGRAPH-2F9ED
+2F9EE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EE
+2F9EF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EF
+2F9F0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F0
+2F9F1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F1
+2F9F2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F2
+2F9F3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F3
+2F9F4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F4
+2F9F5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F5
+2F9F6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F6
+2F9F7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F7
+2F9F8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F8
+2F9F9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F9
+2F9FA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FA
+2F9FB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FB
+2F9FC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FC
+2F9FD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FD
+2F9FE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FE
+2F9FF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FF
+2FA00;ID # CJK COMPATIBILITY IDEOGRAPH-2FA00
+2FA01;ID # CJK COMPATIBILITY IDEOGRAPH-2FA01
+2FA02;ID # CJK COMPATIBILITY IDEOGRAPH-2FA02
+2FA03;ID # CJK COMPATIBILITY IDEOGRAPH-2FA03
+2FA04;ID # CJK COMPATIBILITY IDEOGRAPH-2FA04
+2FA05;ID # CJK COMPATIBILITY IDEOGRAPH-2FA05
+2FA06;ID # CJK COMPATIBILITY IDEOGRAPH-2FA06
+2FA07;ID # CJK COMPATIBILITY IDEOGRAPH-2FA07
+2FA08;ID # CJK COMPATIBILITY IDEOGRAPH-2FA08
+2FA09;ID # CJK COMPATIBILITY IDEOGRAPH-2FA09
+2FA0A;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0A
+2FA0B;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0B
+2FA0C;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0C
+2FA0D;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0D
+2FA0E;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0E
+2FA0F;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0F
+2FA10;ID # CJK COMPATIBILITY IDEOGRAPH-2FA10
+2FA11;ID # CJK COMPATIBILITY IDEOGRAPH-2FA11
+2FA12;ID # CJK COMPATIBILITY IDEOGRAPH-2FA12
+2FA13;ID # CJK COMPATIBILITY IDEOGRAPH-2FA13
+2FA14;ID # CJK COMPATIBILITY IDEOGRAPH-2FA14
+2FA15;ID # CJK COMPATIBILITY IDEOGRAPH-2FA15
+2FA16;ID # CJK COMPATIBILITY IDEOGRAPH-2FA16
+2FA17;ID # CJK COMPATIBILITY IDEOGRAPH-2FA17
+2FA18;ID # CJK COMPATIBILITY IDEOGRAPH-2FA18
+2FA19;ID # CJK COMPATIBILITY IDEOGRAPH-2FA19
+2FA1A;ID # CJK COMPATIBILITY IDEOGRAPH-2FA1A
+2FA1B;ID # CJK COMPATIBILITY IDEOGRAPH-2FA1B
+2FA1C;ID # CJK COMPATIBILITY IDEOGRAPH-2FA1C
+2FA1D;ID # CJK COMPATIBILITY IDEOGRAPH-2FA1D
+E0001;CM # LANGUAGE TAG
+E0020;CM # TAG SPACE
+E0021;CM # TAG EXCLAMATION MARK
+E0022;CM # TAG QUOTATION MARK
+E0023;CM # TAG NUMBER SIGN
+E0024;CM # TAG DOLLAR SIGN
+E0025;CM # TAG PERCENT SIGN
+E0026;CM # TAG AMPERSAND
+E0027;CM # TAG APOSTROPHE
+E0028;CM # TAG LEFT PARENTHESIS
+E0029;CM # TAG RIGHT PARENTHESIS
+E002A;CM # TAG ASTERISK
+E002B;CM # TAG PLUS SIGN
+E002C;CM # TAG COMMA
+E002D;CM # TAG HYPHEN-MINUS
+E002E;CM # TAG FULL STOP
+E002F;CM # TAG SOLIDUS
+E0030;CM # TAG DIGIT ZERO
+E0031;CM # TAG DIGIT ONE
+E0032;CM # TAG DIGIT TWO
+E0033;CM # TAG DIGIT THREE
+E0034;CM # TAG DIGIT FOUR
+E0035;CM # TAG DIGIT FIVE
+E0036;CM # TAG DIGIT SIX
+E0037;CM # TAG DIGIT SEVEN
+E0038;CM # TAG DIGIT EIGHT
+E0039;CM # TAG DIGIT NINE
+E003A;CM # TAG COLON
+E003B;CM # TAG SEMICOLON
+E003C;CM # TAG LESS-THAN SIGN
+E003D;CM # TAG EQUALS SIGN
+E003E;CM # TAG GREATER-THAN SIGN
+E003F;CM # TAG QUESTION MARK
+E0040;CM # TAG COMMERCIAL AT
+E0041;CM # TAG LATIN CAPITAL LETTER A
+E0042;CM # TAG LATIN CAPITAL LETTER B
+E0043;CM # TAG LATIN CAPITAL LETTER C
+E0044;CM # TAG LATIN CAPITAL LETTER D
+E0045;CM # TAG LATIN CAPITAL LETTER E
+E0046;CM # TAG LATIN CAPITAL LETTER F
+E0047;CM # TAG LATIN CAPITAL LETTER G
+E0048;CM # TAG LATIN CAPITAL LETTER H
+E0049;CM # TAG LATIN CAPITAL LETTER I
+E004A;CM # TAG LATIN CAPITAL LETTER J
+E004B;CM # TAG LATIN CAPITAL LETTER K
+E004C;CM # TAG LATIN CAPITAL LETTER L
+E004D;CM # TAG LATIN CAPITAL LETTER M
+E004E;CM # TAG LATIN CAPITAL LETTER N
+E004F;CM # TAG LATIN CAPITAL LETTER O
+E0050;CM # TAG LATIN CAPITAL LETTER P
+E0051;CM # TAG LATIN CAPITAL LETTER Q
+E0052;CM # TAG LATIN CAPITAL LETTER R
+E0053;CM # TAG LATIN CAPITAL LETTER S
+E0054;CM # TAG LATIN CAPITAL LETTER T
+E0055;CM # TAG LATIN CAPITAL LETTER U
+E0056;CM # TAG LATIN CAPITAL LETTER V
+E0057;CM # TAG LATIN CAPITAL LETTER W
+E0058;CM # TAG LATIN CAPITAL LETTER X
+E0059;CM # TAG LATIN CAPITAL LETTER Y
+E005A;CM # TAG LATIN CAPITAL LETTER Z
+E005B;CM # TAG LEFT SQUARE BRACKET
+E005C;CM # TAG REVERSE SOLIDUS
+E005D;CM # TAG RIGHT SQUARE BRACKET
+E005E;CM # TAG CIRCUMFLEX ACCENT
+E005F;CM # TAG LOW LINE
+E0060;CM # TAG GRAVE ACCENT
+E0061;CM # TAG LATIN SMALL LETTER A
+E0062;CM # TAG LATIN SMALL LETTER B
+E0063;CM # TAG LATIN SMALL LETTER C
+E0064;CM # TAG LATIN SMALL LETTER D
+E0065;CM # TAG LATIN SMALL LETTER E
+E0066;CM # TAG LATIN SMALL LETTER F
+E0067;CM # TAG LATIN SMALL LETTER G
+E0068;CM # TAG LATIN SMALL LETTER H
+E0069;CM # TAG LATIN SMALL LETTER I
+E006A;CM # TAG LATIN SMALL LETTER J
+E006B;CM # TAG LATIN SMALL LETTER K
+E006C;CM # TAG LATIN SMALL LETTER L
+E006D;CM # TAG LATIN SMALL LETTER M
+E006E;CM # TAG LATIN SMALL LETTER N
+E006F;CM # TAG LATIN SMALL LETTER O
+E0070;CM # TAG LATIN SMALL LETTER P
+E0071;CM # TAG LATIN SMALL LETTER Q
+E0072;CM # TAG LATIN SMALL LETTER R
+E0073;CM # TAG LATIN SMALL LETTER S
+E0074;CM # TAG LATIN SMALL LETTER T
+E0075;CM # TAG LATIN SMALL LETTER U
+E0076;CM # TAG LATIN SMALL LETTER V
+E0077;CM # TAG LATIN SMALL LETTER W
+E0078;CM # TAG LATIN SMALL LETTER X
+E0079;CM # TAG LATIN SMALL LETTER Y
+E007A;CM # TAG LATIN SMALL LETTER Z
+E007B;CM # TAG LEFT CURLY BRACKET
+E007C;CM # TAG VERTICAL LINE
+E007D;CM # TAG RIGHT CURLY BRACKET
+E007E;CM # TAG TILDE
+E007F;CM # CANCEL TAG
+E0100;CM # VARIATION SELECTOR-17
+E0101;CM # VARIATION SELECTOR-18
+E0102;CM # VARIATION SELECTOR-19
+E0103;CM # VARIATION SELECTOR-20
+E0104;CM # VARIATION SELECTOR-21
+E0105;CM # VARIATION SELECTOR-22
+E0106;CM # VARIATION SELECTOR-23
+E0107;CM # VARIATION SELECTOR-24
+E0108;CM # VARIATION SELECTOR-25
+E0109;CM # VARIATION SELECTOR-26
+E010A;CM # VARIATION SELECTOR-27
+E010B;CM # VARIATION SELECTOR-28
+E010C;CM # VARIATION SELECTOR-29
+E010D;CM # VARIATION SELECTOR-30
+E010E;CM # VARIATION SELECTOR-31
+E010F;CM # VARIATION SELECTOR-32
+E0110;CM # VARIATION SELECTOR-33
+E0111;CM # VARIATION SELECTOR-34
+E0112;CM # VARIATION SELECTOR-35
+E0113;CM # VARIATION SELECTOR-36
+E0114;CM # VARIATION SELECTOR-37
+E0115;CM # VARIATION SELECTOR-38
+E0116;CM # VARIATION SELECTOR-39
+E0117;CM # VARIATION SELECTOR-40
+E0118;CM # VARIATION SELECTOR-41
+E0119;CM # VARIATION SELECTOR-42
+E011A;CM # VARIATION SELECTOR-43
+E011B;CM # VARIATION SELECTOR-44
+E011C;CM # VARIATION SELECTOR-45
+E011D;CM # VARIATION SELECTOR-46
+E011E;CM # VARIATION SELECTOR-47
+E011F;CM # VARIATION SELECTOR-48
+E0120;CM # VARIATION SELECTOR-49
+E0121;CM # VARIATION SELECTOR-50
+E0122;CM # VARIATION SELECTOR-51
+E0123;CM # VARIATION SELECTOR-52
+E0124;CM # VARIATION SELECTOR-53
+E0125;CM # VARIATION SELECTOR-54
+E0126;CM # VARIATION SELECTOR-55
+E0127;CM # VARIATION SELECTOR-56
+E0128;CM # VARIATION SELECTOR-57
+E0129;CM # VARIATION SELECTOR-58
+E012A;CM # VARIATION SELECTOR-59
+E012B;CM # VARIATION SELECTOR-60
+E012C;CM # VARIATION SELECTOR-61
+E012D;CM # VARIATION SELECTOR-62
+E012E;CM # VARIATION SELECTOR-63
+E012F;CM # VARIATION SELECTOR-64
+E0130;CM # VARIATION SELECTOR-65
+E0131;CM # VARIATION SELECTOR-66
+E0132;CM # VARIATION SELECTOR-67
+E0133;CM # VARIATION SELECTOR-68
+E0134;CM # VARIATION SELECTOR-69
+E0135;CM # VARIATION SELECTOR-70
+E0136;CM # VARIATION SELECTOR-71
+E0137;CM # VARIATION SELECTOR-72
+E0138;CM # VARIATION SELECTOR-73
+E0139;CM # VARIATION SELECTOR-74
+E013A;CM # VARIATION SELECTOR-75
+E013B;CM # VARIATION SELECTOR-76
+E013C;CM # VARIATION SELECTOR-77
+E013D;CM # VARIATION SELECTOR-78
+E013E;CM # VARIATION SELECTOR-79
+E013F;CM # VARIATION SELECTOR-80
+E0140;CM # VARIATION SELECTOR-81
+E0141;CM # VARIATION SELECTOR-82
+E0142;CM # VARIATION SELECTOR-83
+E0143;CM # VARIATION SELECTOR-84
+E0144;CM # VARIATION SELECTOR-85
+E0145;CM # VARIATION SELECTOR-86
+E0146;CM # VARIATION SELECTOR-87
+E0147;CM # VARIATION SELECTOR-88
+E0148;CM # VARIATION SELECTOR-89
+E0149;CM # VARIATION SELECTOR-90
+E014A;CM # VARIATION SELECTOR-91
+E014B;CM # VARIATION SELECTOR-92
+E014C;CM # VARIATION SELECTOR-93
+E014D;CM # VARIATION SELECTOR-94
+E014E;CM # VARIATION SELECTOR-95
+E014F;CM # VARIATION SELECTOR-96
+E0150;CM # VARIATION SELECTOR-97
+E0151;CM # VARIATION SELECTOR-98
+E0152;CM # VARIATION SELECTOR-99
+E0153;CM # VARIATION SELECTOR-100
+E0154;CM # VARIATION SELECTOR-101
+E0155;CM # VARIATION SELECTOR-102
+E0156;CM # VARIATION SELECTOR-103
+E0157;CM # VARIATION SELECTOR-104
+E0158;CM # VARIATION SELECTOR-105
+E0159;CM # VARIATION SELECTOR-106
+E015A;CM # VARIATION SELECTOR-107
+E015B;CM # VARIATION SELECTOR-108
+E015C;CM # VARIATION SELECTOR-109
+E015D;CM # VARIATION SELECTOR-110
+E015E;CM # VARIATION SELECTOR-111
+E015F;CM # VARIATION SELECTOR-112
+E0160;CM # VARIATION SELECTOR-113
+E0161;CM # VARIATION SELECTOR-114
+E0162;CM # VARIATION SELECTOR-115
+E0163;CM # VARIATION SELECTOR-116
+E0164;CM # VARIATION SELECTOR-117
+E0165;CM # VARIATION SELECTOR-118
+E0166;CM # VARIATION SELECTOR-119
+E0167;CM # VARIATION SELECTOR-120
+E0168;CM # VARIATION SELECTOR-121
+E0169;CM # VARIATION SELECTOR-122
+E016A;CM # VARIATION SELECTOR-123
+E016B;CM # VARIATION SELECTOR-124
+E016C;CM # VARIATION SELECTOR-125
+E016D;CM # VARIATION SELECTOR-126
+E016E;CM # VARIATION SELECTOR-127
+E016F;CM # VARIATION SELECTOR-128
+E0170;CM # VARIATION SELECTOR-129
+E0171;CM # VARIATION SELECTOR-130
+E0172;CM # VARIATION SELECTOR-131
+E0173;CM # VARIATION SELECTOR-132
+E0174;CM # VARIATION SELECTOR-133
+E0175;CM # VARIATION SELECTOR-134
+E0176;CM # VARIATION SELECTOR-135
+E0177;CM # VARIATION SELECTOR-136
+E0178;CM # VARIATION SELECTOR-137
+E0179;CM # VARIATION SELECTOR-138
+E017A;CM # VARIATION SELECTOR-139
+E017B;CM # VARIATION SELECTOR-140
+E017C;CM # VARIATION SELECTOR-141
+E017D;CM # VARIATION SELECTOR-142
+E017E;CM # VARIATION SELECTOR-143
+E017F;CM # VARIATION SELECTOR-144
+E0180;CM # VARIATION SELECTOR-145
+E0181;CM # VARIATION SELECTOR-146
+E0182;CM # VARIATION SELECTOR-147
+E0183;CM # VARIATION SELECTOR-148
+E0184;CM # VARIATION SELECTOR-149
+E0185;CM # VARIATION SELECTOR-150
+E0186;CM # VARIATION SELECTOR-151
+E0187;CM # VARIATION SELECTOR-152
+E0188;CM # VARIATION SELECTOR-153
+E0189;CM # VARIATION SELECTOR-154
+E018A;CM # VARIATION SELECTOR-155
+E018B;CM # VARIATION SELECTOR-156
+E018C;CM # VARIATION SELECTOR-157
+E018D;CM # VARIATION SELECTOR-158
+E018E;CM # VARIATION SELECTOR-159
+E018F;CM # VARIATION SELECTOR-160
+E0190;CM # VARIATION SELECTOR-161
+E0191;CM # VARIATION SELECTOR-162
+E0192;CM # VARIATION SELECTOR-163
+E0193;CM # VARIATION SELECTOR-164
+E0194;CM # VARIATION SELECTOR-165
+E0195;CM # VARIATION SELECTOR-166
+E0196;CM # VARIATION SELECTOR-167
+E0197;CM # VARIATION SELECTOR-168
+E0198;CM # VARIATION SELECTOR-169
+E0199;CM # VARIATION SELECTOR-170
+E019A;CM # VARIATION SELECTOR-171
+E019B;CM # VARIATION SELECTOR-172
+E019C;CM # VARIATION SELECTOR-173
+E019D;CM # VARIATION SELECTOR-174
+E019E;CM # VARIATION SELECTOR-175
+E019F;CM # VARIATION SELECTOR-176
+E01A0;CM # VARIATION SELECTOR-177
+E01A1;CM # VARIATION SELECTOR-178
+E01A2;CM # VARIATION SELECTOR-179
+E01A3;CM # VARIATION SELECTOR-180
+E01A4;CM # VARIATION SELECTOR-181
+E01A5;CM # VARIATION SELECTOR-182
+E01A6;CM # VARIATION SELECTOR-183
+E01A7;CM # VARIATION SELECTOR-184
+E01A8;CM # VARIATION SELECTOR-185
+E01A9;CM # VARIATION SELECTOR-186
+E01AA;CM # VARIATION SELECTOR-187
+E01AB;CM # VARIATION SELECTOR-188
+E01AC;CM # VARIATION SELECTOR-189
+E01AD;CM # VARIATION SELECTOR-190
+E01AE;CM # VARIATION SELECTOR-191
+E01AF;CM # VARIATION SELECTOR-192
+E01B0;CM # VARIATION SELECTOR-193
+E01B1;CM # VARIATION SELECTOR-194
+E01B2;CM # VARIATION SELECTOR-195
+E01B3;CM # VARIATION SELECTOR-196
+E01B4;CM # VARIATION SELECTOR-197
+E01B5;CM # VARIATION SELECTOR-198
+E01B6;CM # VARIATION SELECTOR-199
+E01B7;CM # VARIATION SELECTOR-200
+E01B8;CM # VARIATION SELECTOR-201
+E01B9;CM # VARIATION SELECTOR-202
+E01BA;CM # VARIATION SELECTOR-203
+E01BB;CM # VARIATION SELECTOR-204
+E01BC;CM # VARIATION SELECTOR-205
+E01BD;CM # VARIATION SELECTOR-206
+E01BE;CM # VARIATION SELECTOR-207
+E01BF;CM # VARIATION SELECTOR-208
+E01C0;CM # VARIATION SELECTOR-209
+E01C1;CM # VARIATION SELECTOR-210
+E01C2;CM # VARIATION SELECTOR-211
+E01C3;CM # VARIATION SELECTOR-212
+E01C4;CM # VARIATION SELECTOR-213
+E01C5;CM # VARIATION SELECTOR-214
+E01C6;CM # VARIATION SELECTOR-215
+E01C7;CM # VARIATION SELECTOR-216
+E01C8;CM # VARIATION SELECTOR-217
+E01C9;CM # VARIATION SELECTOR-218
+E01CA;CM # VARIATION SELECTOR-219
+E01CB;CM # VARIATION SELECTOR-220
+E01CC;CM # VARIATION SELECTOR-221
+E01CD;CM # VARIATION SELECTOR-222
+E01CE;CM # VARIATION SELECTOR-223
+E01CF;CM # VARIATION SELECTOR-224
+E01D0;CM # VARIATION SELECTOR-225
+E01D1;CM # VARIATION SELECTOR-226
+E01D2;CM # VARIATION SELECTOR-227
+E01D3;CM # VARIATION SELECTOR-228
+E01D4;CM # VARIATION SELECTOR-229
+E01D5;CM # VARIATION SELECTOR-230
+E01D6;CM # VARIATION SELECTOR-231
+E01D7;CM # VARIATION SELECTOR-232
+E01D8;CM # VARIATION SELECTOR-233
+E01D9;CM # VARIATION SELECTOR-234
+E01DA;CM # VARIATION SELECTOR-235
+E01DB;CM # VARIATION SELECTOR-236
+E01DC;CM # VARIATION SELECTOR-237
+E01DD;CM # VARIATION SELECTOR-238
+E01DE;CM # VARIATION SELECTOR-239
+E01DF;CM # VARIATION SELECTOR-240
+E01E0;CM # VARIATION SELECTOR-241
+E01E1;CM # VARIATION SELECTOR-242
+E01E2;CM # VARIATION SELECTOR-243
+E01E3;CM # VARIATION SELECTOR-244
+E01E4;CM # VARIATION SELECTOR-245
+E01E5;CM # VARIATION SELECTOR-246
+E01E6;CM # VARIATION SELECTOR-247
+E01E7;CM # VARIATION SELECTOR-248
+E01E8;CM # VARIATION SELECTOR-249
+E01E9;CM # VARIATION SELECTOR-250
+E01EA;CM # VARIATION SELECTOR-251
+E01EB;CM # VARIATION SELECTOR-252
+E01EC;CM # VARIATION SELECTOR-253
+E01ED;CM # VARIATION SELECTOR-254
+E01EE;CM # VARIATION SELECTOR-255
+E01EF;CM # VARIATION SELECTOR-256
+F0000..FFFFD;XX # <Plane 15 Private Use, First>..<Plane 15 Private Use, Last>
+100000..10FFFD;XX # <Plane 16 Private Use, First>..<Plane 16 Private Use, Last>
+
+# EOF
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/Name.pl b/Master/tlpkg/tlperl.straw/lib/unicore/Name.pl
new file mode 100755
index 00000000000..ad5afffe068
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/Name.pl
@@ -0,0 +1,19342 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+return <<'END';
+0000 NULL
+0001 START OF HEADING
+0002 START OF TEXT
+0003 END OF TEXT
+0004 END OF TRANSMISSION
+0005 ENQUIRY
+0006 ACKNOWLEDGE
+0007 BELL
+0008 BACKSPACE
+0009 CHARACTER TABULATION
+000A LINE FEED (LF)
+000B LINE TABULATION
+000C FORM FEED (FF)
+000D CARRIAGE RETURN (CR)
+000E SHIFT OUT
+000F SHIFT IN
+0010 DATA LINK ESCAPE
+0011 DEVICE CONTROL ONE
+0012 DEVICE CONTROL TWO
+0013 DEVICE CONTROL THREE
+0014 DEVICE CONTROL FOUR
+0015 NEGATIVE ACKNOWLEDGE
+0016 SYNCHRONOUS IDLE
+0017 END OF TRANSMISSION BLOCK
+0018 CANCEL
+0019 END OF MEDIUM
+001A SUBSTITUTE
+001B ESCAPE
+001C INFORMATION SEPARATOR FOUR
+001D INFORMATION SEPARATOR THREE
+001E INFORMATION SEPARATOR TWO
+001F INFORMATION SEPARATOR ONE
+0020 SPACE
+0021 EXCLAMATION MARK
+0022 QUOTATION MARK
+0023 NUMBER SIGN
+0024 DOLLAR SIGN
+0025 PERCENT SIGN
+0026 AMPERSAND
+0027 APOSTROPHE
+0028 LEFT PARENTHESIS
+0029 RIGHT PARENTHESIS
+002A ASTERISK
+002B PLUS SIGN
+002C COMMA
+002D HYPHEN-MINUS
+002E FULL STOP
+002F SOLIDUS
+0030 DIGIT ZERO
+0031 DIGIT ONE
+0032 DIGIT TWO
+0033 DIGIT THREE
+0034 DIGIT FOUR
+0035 DIGIT FIVE
+0036 DIGIT SIX
+0037 DIGIT SEVEN
+0038 DIGIT EIGHT
+0039 DIGIT NINE
+003A COLON
+003B SEMICOLON
+003C LESS-THAN SIGN
+003D EQUALS SIGN
+003E GREATER-THAN SIGN
+003F QUESTION MARK
+0040 COMMERCIAL AT
+0041 LATIN CAPITAL LETTER A
+0042 LATIN CAPITAL LETTER B
+0043 LATIN CAPITAL LETTER C
+0044 LATIN CAPITAL LETTER D
+0045 LATIN CAPITAL LETTER E
+0046 LATIN CAPITAL LETTER F
+0047 LATIN CAPITAL LETTER G
+0048 LATIN CAPITAL LETTER H
+0049 LATIN CAPITAL LETTER I
+004A LATIN CAPITAL LETTER J
+004B LATIN CAPITAL LETTER K
+004C LATIN CAPITAL LETTER L
+004D LATIN CAPITAL LETTER M
+004E LATIN CAPITAL LETTER N
+004F LATIN CAPITAL LETTER O
+0050 LATIN CAPITAL LETTER P
+0051 LATIN CAPITAL LETTER Q
+0052 LATIN CAPITAL LETTER R
+0053 LATIN CAPITAL LETTER S
+0054 LATIN CAPITAL LETTER T
+0055 LATIN CAPITAL LETTER U
+0056 LATIN CAPITAL LETTER V
+0057 LATIN CAPITAL LETTER W
+0058 LATIN CAPITAL LETTER X
+0059 LATIN CAPITAL LETTER Y
+005A LATIN CAPITAL LETTER Z
+005B LEFT SQUARE BRACKET
+005C REVERSE SOLIDUS
+005D RIGHT SQUARE BRACKET
+005E CIRCUMFLEX ACCENT
+005F LOW LINE
+0060 GRAVE ACCENT
+0061 LATIN SMALL LETTER A
+0062 LATIN SMALL LETTER B
+0063 LATIN SMALL LETTER C
+0064 LATIN SMALL LETTER D
+0065 LATIN SMALL LETTER E
+0066 LATIN SMALL LETTER F
+0067 LATIN SMALL LETTER G
+0068 LATIN SMALL LETTER H
+0069 LATIN SMALL LETTER I
+006A LATIN SMALL LETTER J
+006B LATIN SMALL LETTER K
+006C LATIN SMALL LETTER L
+006D LATIN SMALL LETTER M
+006E LATIN SMALL LETTER N
+006F LATIN SMALL LETTER O
+0070 LATIN SMALL LETTER P
+0071 LATIN SMALL LETTER Q
+0072 LATIN SMALL LETTER R
+0073 LATIN SMALL LETTER S
+0074 LATIN SMALL LETTER T
+0075 LATIN SMALL LETTER U
+0076 LATIN SMALL LETTER V
+0077 LATIN SMALL LETTER W
+0078 LATIN SMALL LETTER X
+0079 LATIN SMALL LETTER Y
+007A LATIN SMALL LETTER Z
+007B LEFT CURLY BRACKET
+007C VERTICAL LINE
+007D RIGHT CURLY BRACKET
+007E TILDE
+007F DELETE
+0080 0081 <control>
+0082 BREAK PERMITTED HERE
+0083 NO BREAK HERE
+0084 <control>
+0085 NEXT LINE (NEL)
+0086 START OF SELECTED AREA
+0087 END OF SELECTED AREA
+0088 CHARACTER TABULATION SET
+0089 CHARACTER TABULATION WITH JUSTIFICATION
+008A LINE TABULATION SET
+008B PARTIAL LINE FORWARD
+008C PARTIAL LINE BACKWARD
+008D REVERSE LINE FEED
+008E SINGLE SHIFT TWO
+008F SINGLE SHIFT THREE
+0090 DEVICE CONTROL STRING
+0091 PRIVATE USE ONE
+0092 PRIVATE USE TWO
+0093 SET TRANSMIT STATE
+0094 CANCEL CHARACTER
+0095 MESSAGE WAITING
+0096 START OF GUARDED AREA
+0097 END OF GUARDED AREA
+0098 START OF STRING
+0099 <control>
+009A SINGLE CHARACTER INTRODUCER
+009B CONTROL SEQUENCE INTRODUCER
+009C STRING TERMINATOR
+009D OPERATING SYSTEM COMMAND
+009E PRIVACY MESSAGE
+009F APPLICATION PROGRAM COMMAND
+00A0 NO-BREAK SPACE
+00A1 INVERTED EXCLAMATION MARK
+00A2 CENT SIGN
+00A3 POUND SIGN
+00A4 CURRENCY SIGN
+00A5 YEN SIGN
+00A6 BROKEN BAR
+00A7 SECTION SIGN
+00A8 DIAERESIS
+00A9 COPYRIGHT SIGN
+00AA FEMININE ORDINAL INDICATOR
+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC NOT SIGN
+00AD SOFT HYPHEN
+00AE REGISTERED SIGN
+00AF MACRON
+00B0 DEGREE SIGN
+00B1 PLUS-MINUS SIGN
+00B2 SUPERSCRIPT TWO
+00B3 SUPERSCRIPT THREE
+00B4 ACUTE ACCENT
+00B5 MICRO SIGN
+00B6 PILCROW SIGN
+00B7 MIDDLE DOT
+00B8 CEDILLA
+00B9 SUPERSCRIPT ONE
+00BA MASCULINE ORDINAL INDICATOR
+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC VULGAR FRACTION ONE QUARTER
+00BD VULGAR FRACTION ONE HALF
+00BE VULGAR FRACTION THREE QUARTERS
+00BF INVERTED QUESTION MARK
+00C0 LATIN CAPITAL LETTER A WITH GRAVE
+00C1 LATIN CAPITAL LETTER A WITH ACUTE
+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00C3 LATIN CAPITAL LETTER A WITH TILDE
+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+00C6 LATIN CAPITAL LETTER AE
+00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+00C8 LATIN CAPITAL LETTER E WITH GRAVE
+00C9 LATIN CAPITAL LETTER E WITH ACUTE
+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+00CC LATIN CAPITAL LETTER I WITH GRAVE
+00CD LATIN CAPITAL LETTER I WITH ACUTE
+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+00D0 LATIN CAPITAL LETTER ETH
+00D1 LATIN CAPITAL LETTER N WITH TILDE
+00D2 LATIN CAPITAL LETTER O WITH GRAVE
+00D3 LATIN CAPITAL LETTER O WITH ACUTE
+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00D5 LATIN CAPITAL LETTER O WITH TILDE
+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+00D7 MULTIPLICATION SIGN
+00D8 LATIN CAPITAL LETTER O WITH STROKE
+00D9 LATIN CAPITAL LETTER U WITH GRAVE
+00DA LATIN CAPITAL LETTER U WITH ACUTE
+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+00DD LATIN CAPITAL LETTER Y WITH ACUTE
+00DE LATIN CAPITAL LETTER THORN
+00DF LATIN SMALL LETTER SHARP S
+00E0 LATIN SMALL LETTER A WITH GRAVE
+00E1 LATIN SMALL LETTER A WITH ACUTE
+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+00E3 LATIN SMALL LETTER A WITH TILDE
+00E4 LATIN SMALL LETTER A WITH DIAERESIS
+00E5 LATIN SMALL LETTER A WITH RING ABOVE
+00E6 LATIN SMALL LETTER AE
+00E7 LATIN SMALL LETTER C WITH CEDILLA
+00E8 LATIN SMALL LETTER E WITH GRAVE
+00E9 LATIN SMALL LETTER E WITH ACUTE
+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+00EB LATIN SMALL LETTER E WITH DIAERESIS
+00EC LATIN SMALL LETTER I WITH GRAVE
+00ED LATIN SMALL LETTER I WITH ACUTE
+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+00EF LATIN SMALL LETTER I WITH DIAERESIS
+00F0 LATIN SMALL LETTER ETH
+00F1 LATIN SMALL LETTER N WITH TILDE
+00F2 LATIN SMALL LETTER O WITH GRAVE
+00F3 LATIN SMALL LETTER O WITH ACUTE
+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+00F5 LATIN SMALL LETTER O WITH TILDE
+00F6 LATIN SMALL LETTER O WITH DIAERESIS
+00F7 DIVISION SIGN
+00F8 LATIN SMALL LETTER O WITH STROKE
+00F9 LATIN SMALL LETTER U WITH GRAVE
+00FA LATIN SMALL LETTER U WITH ACUTE
+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+00FC LATIN SMALL LETTER U WITH DIAERESIS
+00FD LATIN SMALL LETTER Y WITH ACUTE
+00FE LATIN SMALL LETTER THORN
+00FF LATIN SMALL LETTER Y WITH DIAERESIS
+0100 LATIN CAPITAL LETTER A WITH MACRON
+0101 LATIN SMALL LETTER A WITH MACRON
+0102 LATIN CAPITAL LETTER A WITH BREVE
+0103 LATIN SMALL LETTER A WITH BREVE
+0104 LATIN CAPITAL LETTER A WITH OGONEK
+0105 LATIN SMALL LETTER A WITH OGONEK
+0106 LATIN CAPITAL LETTER C WITH ACUTE
+0107 LATIN SMALL LETTER C WITH ACUTE
+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX
+010A LATIN CAPITAL LETTER C WITH DOT ABOVE
+010B LATIN SMALL LETTER C WITH DOT ABOVE
+010C LATIN CAPITAL LETTER C WITH CARON
+010D LATIN SMALL LETTER C WITH CARON
+010E LATIN CAPITAL LETTER D WITH CARON
+010F LATIN SMALL LETTER D WITH CARON
+0110 LATIN CAPITAL LETTER D WITH STROKE
+0111 LATIN SMALL LETTER D WITH STROKE
+0112 LATIN CAPITAL LETTER E WITH MACRON
+0113 LATIN SMALL LETTER E WITH MACRON
+0114 LATIN CAPITAL LETTER E WITH BREVE
+0115 LATIN SMALL LETTER E WITH BREVE
+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE
+0117 LATIN SMALL LETTER E WITH DOT ABOVE
+0118 LATIN CAPITAL LETTER E WITH OGONEK
+0119 LATIN SMALL LETTER E WITH OGONEK
+011A LATIN CAPITAL LETTER E WITH CARON
+011B LATIN SMALL LETTER E WITH CARON
+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011D LATIN SMALL LETTER G WITH CIRCUMFLEX
+011E LATIN CAPITAL LETTER G WITH BREVE
+011F LATIN SMALL LETTER G WITH BREVE
+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE
+0121 LATIN SMALL LETTER G WITH DOT ABOVE
+0122 LATIN CAPITAL LETTER G WITH CEDILLA
+0123 LATIN SMALL LETTER G WITH CEDILLA
+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX
+0126 LATIN CAPITAL LETTER H WITH STROKE
+0127 LATIN SMALL LETTER H WITH STROKE
+0128 LATIN CAPITAL LETTER I WITH TILDE
+0129 LATIN SMALL LETTER I WITH TILDE
+012A LATIN CAPITAL LETTER I WITH MACRON
+012B LATIN SMALL LETTER I WITH MACRON
+012C LATIN CAPITAL LETTER I WITH BREVE
+012D LATIN SMALL LETTER I WITH BREVE
+012E LATIN CAPITAL LETTER I WITH OGONEK
+012F LATIN SMALL LETTER I WITH OGONEK
+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
+0131 LATIN SMALL LETTER DOTLESS I
+0132 LATIN CAPITAL LIGATURE IJ
+0133 LATIN SMALL LIGATURE IJ
+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX
+0136 LATIN CAPITAL LETTER K WITH CEDILLA
+0137 LATIN SMALL LETTER K WITH CEDILLA
+0138 LATIN SMALL LETTER KRA
+0139 LATIN CAPITAL LETTER L WITH ACUTE
+013A LATIN SMALL LETTER L WITH ACUTE
+013B LATIN CAPITAL LETTER L WITH CEDILLA
+013C LATIN SMALL LETTER L WITH CEDILLA
+013D LATIN CAPITAL LETTER L WITH CARON
+013E LATIN SMALL LETTER L WITH CARON
+013F LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0140 LATIN SMALL LETTER L WITH MIDDLE DOT
+0141 LATIN CAPITAL LETTER L WITH STROKE
+0142 LATIN SMALL LETTER L WITH STROKE
+0143 LATIN CAPITAL LETTER N WITH ACUTE
+0144 LATIN SMALL LETTER N WITH ACUTE
+0145 LATIN CAPITAL LETTER N WITH CEDILLA
+0146 LATIN SMALL LETTER N WITH CEDILLA
+0147 LATIN CAPITAL LETTER N WITH CARON
+0148 LATIN SMALL LETTER N WITH CARON
+0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014A LATIN CAPITAL LETTER ENG
+014B LATIN SMALL LETTER ENG
+014C LATIN CAPITAL LETTER O WITH MACRON
+014D LATIN SMALL LETTER O WITH MACRON
+014E LATIN CAPITAL LETTER O WITH BREVE
+014F LATIN SMALL LETTER O WITH BREVE
+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0152 LATIN CAPITAL LIGATURE OE
+0153 LATIN SMALL LIGATURE OE
+0154 LATIN CAPITAL LETTER R WITH ACUTE
+0155 LATIN SMALL LETTER R WITH ACUTE
+0156 LATIN CAPITAL LETTER R WITH CEDILLA
+0157 LATIN SMALL LETTER R WITH CEDILLA
+0158 LATIN CAPITAL LETTER R WITH CARON
+0159 LATIN SMALL LETTER R WITH CARON
+015A LATIN CAPITAL LETTER S WITH ACUTE
+015B LATIN SMALL LETTER S WITH ACUTE
+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015D LATIN SMALL LETTER S WITH CIRCUMFLEX
+015E LATIN CAPITAL LETTER S WITH CEDILLA
+015F LATIN SMALL LETTER S WITH CEDILLA
+0160 LATIN CAPITAL LETTER S WITH CARON
+0161 LATIN SMALL LETTER S WITH CARON
+0162 LATIN CAPITAL LETTER T WITH CEDILLA
+0163 LATIN SMALL LETTER T WITH CEDILLA
+0164 LATIN CAPITAL LETTER T WITH CARON
+0165 LATIN SMALL LETTER T WITH CARON
+0166 LATIN CAPITAL LETTER T WITH STROKE
+0167 LATIN SMALL LETTER T WITH STROKE
+0168 LATIN CAPITAL LETTER U WITH TILDE
+0169 LATIN SMALL LETTER U WITH TILDE
+016A LATIN CAPITAL LETTER U WITH MACRON
+016B LATIN SMALL LETTER U WITH MACRON
+016C LATIN CAPITAL LETTER U WITH BREVE
+016D LATIN SMALL LETTER U WITH BREVE
+016E LATIN CAPITAL LETTER U WITH RING ABOVE
+016F LATIN SMALL LETTER U WITH RING ABOVE
+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0172 LATIN CAPITAL LETTER U WITH OGONEK
+0173 LATIN SMALL LETTER U WITH OGONEK
+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX
+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179 LATIN CAPITAL LETTER Z WITH ACUTE
+017A LATIN SMALL LETTER Z WITH ACUTE
+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017C LATIN SMALL LETTER Z WITH DOT ABOVE
+017D LATIN CAPITAL LETTER Z WITH CARON
+017E LATIN SMALL LETTER Z WITH CARON
+017F LATIN SMALL LETTER LONG S
+0180 LATIN SMALL LETTER B WITH STROKE
+0181 LATIN CAPITAL LETTER B WITH HOOK
+0182 LATIN CAPITAL LETTER B WITH TOPBAR
+0183 LATIN SMALL LETTER B WITH TOPBAR
+0184 LATIN CAPITAL LETTER TONE SIX
+0185 LATIN SMALL LETTER TONE SIX
+0186 LATIN CAPITAL LETTER OPEN O
+0187 LATIN CAPITAL LETTER C WITH HOOK
+0188 LATIN SMALL LETTER C WITH HOOK
+0189 LATIN CAPITAL LETTER AFRICAN D
+018A LATIN CAPITAL LETTER D WITH HOOK
+018B LATIN CAPITAL LETTER D WITH TOPBAR
+018C LATIN SMALL LETTER D WITH TOPBAR
+018D LATIN SMALL LETTER TURNED DELTA
+018E LATIN CAPITAL LETTER REVERSED E
+018F LATIN CAPITAL LETTER SCHWA
+0190 LATIN CAPITAL LETTER OPEN E
+0191 LATIN CAPITAL LETTER F WITH HOOK
+0192 LATIN SMALL LETTER F WITH HOOK
+0193 LATIN CAPITAL LETTER G WITH HOOK
+0194 LATIN CAPITAL LETTER GAMMA
+0195 LATIN SMALL LETTER HV
+0196 LATIN CAPITAL LETTER IOTA
+0197 LATIN CAPITAL LETTER I WITH STROKE
+0198 LATIN CAPITAL LETTER K WITH HOOK
+0199 LATIN SMALL LETTER K WITH HOOK
+019A LATIN SMALL LETTER L WITH BAR
+019B LATIN SMALL LETTER LAMBDA WITH STROKE
+019C LATIN CAPITAL LETTER TURNED M
+019D LATIN CAPITAL LETTER N WITH LEFT HOOK
+019E LATIN SMALL LETTER N WITH LONG RIGHT LEG
+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01A0 LATIN CAPITAL LETTER O WITH HORN
+01A1 LATIN SMALL LETTER O WITH HORN
+01A2 LATIN CAPITAL LETTER OI
+01A3 LATIN SMALL LETTER OI
+01A4 LATIN CAPITAL LETTER P WITH HOOK
+01A5 LATIN SMALL LETTER P WITH HOOK
+01A6 LATIN LETTER YR
+01A7 LATIN CAPITAL LETTER TONE TWO
+01A8 LATIN SMALL LETTER TONE TWO
+01A9 LATIN CAPITAL LETTER ESH
+01AA LATIN LETTER REVERSED ESH LOOP
+01AB LATIN SMALL LETTER T WITH PALATAL HOOK
+01AC LATIN CAPITAL LETTER T WITH HOOK
+01AD LATIN SMALL LETTER T WITH HOOK
+01AE LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01AF LATIN CAPITAL LETTER U WITH HORN
+01B0 LATIN SMALL LETTER U WITH HORN
+01B1 LATIN CAPITAL LETTER UPSILON
+01B2 LATIN CAPITAL LETTER V WITH HOOK
+01B3 LATIN CAPITAL LETTER Y WITH HOOK
+01B4 LATIN SMALL LETTER Y WITH HOOK
+01B5 LATIN CAPITAL LETTER Z WITH STROKE
+01B6 LATIN SMALL LETTER Z WITH STROKE
+01B7 LATIN CAPITAL LETTER EZH
+01B8 LATIN CAPITAL LETTER EZH REVERSED
+01B9 LATIN SMALL LETTER EZH REVERSED
+01BA LATIN SMALL LETTER EZH WITH TAIL
+01BB LATIN LETTER TWO WITH STROKE
+01BC LATIN CAPITAL LETTER TONE FIVE
+01BD LATIN SMALL LETTER TONE FIVE
+01BE LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+01BF LATIN LETTER WYNN
+01C0 LATIN LETTER DENTAL CLICK
+01C1 LATIN LETTER LATERAL CLICK
+01C2 LATIN LETTER ALVEOLAR CLICK
+01C3 LATIN LETTER RETROFLEX CLICK
+01C4 LATIN CAPITAL LETTER DZ WITH CARON
+01C5 LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C6 LATIN SMALL LETTER DZ WITH CARON
+01C7 LATIN CAPITAL LETTER LJ
+01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01C9 LATIN SMALL LETTER LJ
+01CA LATIN CAPITAL LETTER NJ
+01CB LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CC LATIN SMALL LETTER NJ
+01CD LATIN CAPITAL LETTER A WITH CARON
+01CE LATIN SMALL LETTER A WITH CARON
+01CF LATIN CAPITAL LETTER I WITH CARON
+01D0 LATIN SMALL LETTER I WITH CARON
+01D1 LATIN CAPITAL LETTER O WITH CARON
+01D2 LATIN SMALL LETTER O WITH CARON
+01D3 LATIN CAPITAL LETTER U WITH CARON
+01D4 LATIN SMALL LETTER U WITH CARON
+01D5 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D6 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D7 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D8 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01D9 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DA LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01DB LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DC LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+01DD LATIN SMALL LETTER TURNED E
+01DE LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01DF LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01E0 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01E2 LATIN CAPITAL LETTER AE WITH MACRON
+01E3 LATIN SMALL LETTER AE WITH MACRON
+01E4 LATIN CAPITAL LETTER G WITH STROKE
+01E5 LATIN SMALL LETTER G WITH STROKE
+01E6 LATIN CAPITAL LETTER G WITH CARON
+01E7 LATIN SMALL LETTER G WITH CARON
+01E8 LATIN CAPITAL LETTER K WITH CARON
+01E9 LATIN SMALL LETTER K WITH CARON
+01EA LATIN CAPITAL LETTER O WITH OGONEK
+01EB LATIN SMALL LETTER O WITH OGONEK
+01EC LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01ED LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01EE LATIN CAPITAL LETTER EZH WITH CARON
+01EF LATIN SMALL LETTER EZH WITH CARON
+01F0 LATIN SMALL LETTER J WITH CARON
+01F1 LATIN CAPITAL LETTER DZ
+01F2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F3 LATIN SMALL LETTER DZ
+01F4 LATIN CAPITAL LETTER G WITH ACUTE
+01F5 LATIN SMALL LETTER G WITH ACUTE
+01F6 LATIN CAPITAL LETTER HWAIR
+01F7 LATIN CAPITAL LETTER WYNN
+01F8 LATIN CAPITAL LETTER N WITH GRAVE
+01F9 LATIN SMALL LETTER N WITH GRAVE
+01FA LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FB LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01FC LATIN CAPITAL LETTER AE WITH ACUTE
+01FD LATIN SMALL LETTER AE WITH ACUTE
+01FE LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+01FF LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0200 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0201 LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0202 LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0203 LATIN SMALL LETTER A WITH INVERTED BREVE
+0204 LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0205 LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0206 LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0207 LATIN SMALL LETTER E WITH INVERTED BREVE
+0208 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+0209 LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020A LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020B LATIN SMALL LETTER I WITH INVERTED BREVE
+020C LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020D LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020E LATIN CAPITAL LETTER O WITH INVERTED BREVE
+020F LATIN SMALL LETTER O WITH INVERTED BREVE
+0210 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0211 LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0212 LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0213 LATIN SMALL LETTER R WITH INVERTED BREVE
+0214 LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0215 LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0216 LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0217 LATIN SMALL LETTER U WITH INVERTED BREVE
+0218 LATIN CAPITAL LETTER S WITH COMMA BELOW
+0219 LATIN SMALL LETTER S WITH COMMA BELOW
+021A LATIN CAPITAL LETTER T WITH COMMA BELOW
+021B LATIN SMALL LETTER T WITH COMMA BELOW
+021C LATIN CAPITAL LETTER YOGH
+021D LATIN SMALL LETTER YOGH
+021E LATIN CAPITAL LETTER H WITH CARON
+021F LATIN SMALL LETTER H WITH CARON
+0220 LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0221 LATIN SMALL LETTER D WITH CURL
+0222 LATIN CAPITAL LETTER OU
+0223 LATIN SMALL LETTER OU
+0224 LATIN CAPITAL LETTER Z WITH HOOK
+0225 LATIN SMALL LETTER Z WITH HOOK
+0226 LATIN CAPITAL LETTER A WITH DOT ABOVE
+0227 LATIN SMALL LETTER A WITH DOT ABOVE
+0228 LATIN CAPITAL LETTER E WITH CEDILLA
+0229 LATIN SMALL LETTER E WITH CEDILLA
+022A LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022B LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022C LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022D LATIN SMALL LETTER O WITH TILDE AND MACRON
+022E LATIN CAPITAL LETTER O WITH DOT ABOVE
+022F LATIN SMALL LETTER O WITH DOT ABOVE
+0230 LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0231 LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0232 LATIN CAPITAL LETTER Y WITH MACRON
+0233 LATIN SMALL LETTER Y WITH MACRON
+0234 LATIN SMALL LETTER L WITH CURL
+0235 LATIN SMALL LETTER N WITH CURL
+0236 LATIN SMALL LETTER T WITH CURL
+0237 LATIN SMALL LETTER DOTLESS J
+0238 LATIN SMALL LETTER DB DIGRAPH
+0239 LATIN SMALL LETTER QP DIGRAPH
+023A LATIN CAPITAL LETTER A WITH STROKE
+023B LATIN CAPITAL LETTER C WITH STROKE
+023C LATIN SMALL LETTER C WITH STROKE
+023D LATIN CAPITAL LETTER L WITH BAR
+023E LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+023F LATIN SMALL LETTER S WITH SWASH TAIL
+0240 LATIN SMALL LETTER Z WITH SWASH TAIL
+0241 LATIN CAPITAL LETTER GLOTTAL STOP
+0242 LATIN SMALL LETTER GLOTTAL STOP
+0243 LATIN CAPITAL LETTER B WITH STROKE
+0244 LATIN CAPITAL LETTER U BAR
+0245 LATIN CAPITAL LETTER TURNED V
+0246 LATIN CAPITAL LETTER E WITH STROKE
+0247 LATIN SMALL LETTER E WITH STROKE
+0248 LATIN CAPITAL LETTER J WITH STROKE
+0249 LATIN SMALL LETTER J WITH STROKE
+024A LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+024B LATIN SMALL LETTER Q WITH HOOK TAIL
+024C LATIN CAPITAL LETTER R WITH STROKE
+024D LATIN SMALL LETTER R WITH STROKE
+024E LATIN CAPITAL LETTER Y WITH STROKE
+024F LATIN SMALL LETTER Y WITH STROKE
+0250 LATIN SMALL LETTER TURNED A
+0251 LATIN SMALL LETTER ALPHA
+0252 LATIN SMALL LETTER TURNED ALPHA
+0253 LATIN SMALL LETTER B WITH HOOK
+0254 LATIN SMALL LETTER OPEN O
+0255 LATIN SMALL LETTER C WITH CURL
+0256 LATIN SMALL LETTER D WITH TAIL
+0257 LATIN SMALL LETTER D WITH HOOK
+0258 LATIN SMALL LETTER REVERSED E
+0259 LATIN SMALL LETTER SCHWA
+025A LATIN SMALL LETTER SCHWA WITH HOOK
+025B LATIN SMALL LETTER OPEN E
+025C LATIN SMALL LETTER REVERSED OPEN E
+025D LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025E LATIN SMALL LETTER CLOSED REVERSED OPEN E
+025F LATIN SMALL LETTER DOTLESS J WITH STROKE
+0260 LATIN SMALL LETTER G WITH HOOK
+0261 LATIN SMALL LETTER SCRIPT G
+0262 LATIN LETTER SMALL CAPITAL G
+0263 LATIN SMALL LETTER GAMMA
+0264 LATIN SMALL LETTER RAMS HORN
+0265 LATIN SMALL LETTER TURNED H
+0266 LATIN SMALL LETTER H WITH HOOK
+0267 LATIN SMALL LETTER HENG WITH HOOK
+0268 LATIN SMALL LETTER I WITH STROKE
+0269 LATIN SMALL LETTER IOTA
+026A LATIN LETTER SMALL CAPITAL I
+026B LATIN SMALL LETTER L WITH MIDDLE TILDE
+026C LATIN SMALL LETTER L WITH BELT
+026D LATIN SMALL LETTER L WITH RETROFLEX HOOK
+026E LATIN SMALL LETTER LEZH
+026F LATIN SMALL LETTER TURNED M
+0270 LATIN SMALL LETTER TURNED M WITH LONG LEG
+0271 LATIN SMALL LETTER M WITH HOOK
+0272 LATIN SMALL LETTER N WITH LEFT HOOK
+0273 LATIN SMALL LETTER N WITH RETROFLEX HOOK
+0274 LATIN LETTER SMALL CAPITAL N
+0275 LATIN SMALL LETTER BARRED O
+0276 LATIN LETTER SMALL CAPITAL OE
+0277 LATIN SMALL LETTER CLOSED OMEGA
+0278 LATIN SMALL LETTER PHI
+0279 LATIN SMALL LETTER TURNED R
+027A LATIN SMALL LETTER TURNED R WITH LONG LEG
+027B LATIN SMALL LETTER TURNED R WITH HOOK
+027C LATIN SMALL LETTER R WITH LONG LEG
+027D LATIN SMALL LETTER R WITH TAIL
+027E LATIN SMALL LETTER R WITH FISHHOOK
+027F LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0280 LATIN LETTER SMALL CAPITAL R
+0281 LATIN LETTER SMALL CAPITAL INVERTED R
+0282 LATIN SMALL LETTER S WITH HOOK
+0283 LATIN SMALL LETTER ESH
+0284 LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+0285 LATIN SMALL LETTER SQUAT REVERSED ESH
+0286 LATIN SMALL LETTER ESH WITH CURL
+0287 LATIN SMALL LETTER TURNED T
+0288 LATIN SMALL LETTER T WITH RETROFLEX HOOK
+0289 LATIN SMALL LETTER U BAR
+028A LATIN SMALL LETTER UPSILON
+028B LATIN SMALL LETTER V WITH HOOK
+028C LATIN SMALL LETTER TURNED V
+028D LATIN SMALL LETTER TURNED W
+028E LATIN SMALL LETTER TURNED Y
+028F LATIN LETTER SMALL CAPITAL Y
+0290 LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+0291 LATIN SMALL LETTER Z WITH CURL
+0292 LATIN SMALL LETTER EZH
+0293 LATIN SMALL LETTER EZH WITH CURL
+0294 LATIN LETTER GLOTTAL STOP
+0295 LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+0296 LATIN LETTER INVERTED GLOTTAL STOP
+0297 LATIN LETTER STRETCHED C
+0298 LATIN LETTER BILABIAL CLICK
+0299 LATIN LETTER SMALL CAPITAL B
+029A LATIN SMALL LETTER CLOSED OPEN E
+029B LATIN LETTER SMALL CAPITAL G WITH HOOK
+029C LATIN LETTER SMALL CAPITAL H
+029D LATIN SMALL LETTER J WITH CROSSED-TAIL
+029E LATIN SMALL LETTER TURNED K
+029F LATIN LETTER SMALL CAPITAL L
+02A0 LATIN SMALL LETTER Q WITH HOOK
+02A1 LATIN LETTER GLOTTAL STOP WITH STROKE
+02A2 LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+02A3 LATIN SMALL LETTER DZ DIGRAPH
+02A4 LATIN SMALL LETTER DEZH DIGRAPH
+02A5 LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+02A6 LATIN SMALL LETTER TS DIGRAPH
+02A7 LATIN SMALL LETTER TESH DIGRAPH
+02A8 LATIN SMALL LETTER TC DIGRAPH WITH CURL
+02A9 LATIN SMALL LETTER FENG DIGRAPH
+02AA LATIN SMALL LETTER LS DIGRAPH
+02AB LATIN SMALL LETTER LZ DIGRAPH
+02AC LATIN LETTER BILABIAL PERCUSSIVE
+02AD LATIN LETTER BIDENTAL PERCUSSIVE
+02AE LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0 MODIFIER LETTER SMALL H
+02B1 MODIFIER LETTER SMALL H WITH HOOK
+02B2 MODIFIER LETTER SMALL J
+02B3 MODIFIER LETTER SMALL R
+02B4 MODIFIER LETTER SMALL TURNED R
+02B5 MODIFIER LETTER SMALL TURNED R WITH HOOK
+02B6 MODIFIER LETTER SMALL CAPITAL INVERTED R
+02B7 MODIFIER LETTER SMALL W
+02B8 MODIFIER LETTER SMALL Y
+02B9 MODIFIER LETTER PRIME
+02BA MODIFIER LETTER DOUBLE PRIME
+02BB MODIFIER LETTER TURNED COMMA
+02BC MODIFIER LETTER APOSTROPHE
+02BD MODIFIER LETTER REVERSED COMMA
+02BE MODIFIER LETTER RIGHT HALF RING
+02BF MODIFIER LETTER LEFT HALF RING
+02C0 MODIFIER LETTER GLOTTAL STOP
+02C1 MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2 MODIFIER LETTER LEFT ARROWHEAD
+02C3 MODIFIER LETTER RIGHT ARROWHEAD
+02C4 MODIFIER LETTER UP ARROWHEAD
+02C5 MODIFIER LETTER DOWN ARROWHEAD
+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
+02C7 CARON
+02C8 MODIFIER LETTER VERTICAL LINE
+02C9 MODIFIER LETTER MACRON
+02CA MODIFIER LETTER ACUTE ACCENT
+02CB MODIFIER LETTER GRAVE ACCENT
+02CC MODIFIER LETTER LOW VERTICAL LINE
+02CD MODIFIER LETTER LOW MACRON
+02CE MODIFIER LETTER LOW GRAVE ACCENT
+02CF MODIFIER LETTER LOW ACUTE ACCENT
+02D0 MODIFIER LETTER TRIANGULAR COLON
+02D1 MODIFIER LETTER HALF TRIANGULAR COLON
+02D2 MODIFIER LETTER CENTRED RIGHT HALF RING
+02D3 MODIFIER LETTER CENTRED LEFT HALF RING
+02D4 MODIFIER LETTER UP TACK
+02D5 MODIFIER LETTER DOWN TACK
+02D6 MODIFIER LETTER PLUS SIGN
+02D7 MODIFIER LETTER MINUS SIGN
+02D8 BREVE
+02D9 DOT ABOVE
+02DA RING ABOVE
+02DB OGONEK
+02DC SMALL TILDE
+02DD DOUBLE ACUTE ACCENT
+02DE MODIFIER LETTER RHOTIC HOOK
+02DF MODIFIER LETTER CROSS ACCENT
+02E0 MODIFIER LETTER SMALL GAMMA
+02E1 MODIFIER LETTER SMALL L
+02E2 MODIFIER LETTER SMALL S
+02E3 MODIFIER LETTER SMALL X
+02E4 MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5 MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6 MODIFIER LETTER HIGH TONE BAR
+02E7 MODIFIER LETTER MID TONE BAR
+02E8 MODIFIER LETTER LOW TONE BAR
+02E9 MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC MODIFIER LETTER VOICING
+02ED MODIFIER LETTER UNASPIRATED
+02EE MODIFIER LETTER DOUBLE APOSTROPHE
+02EF MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0 MODIFIER LETTER LOW UP ARROWHEAD
+02F1 MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2 MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3 MODIFIER LETTER LOW RING
+02F4 MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5 MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6 MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7 MODIFIER LETTER LOW TILDE
+02F8 MODIFIER LETTER RAISED COLON
+02F9 MODIFIER LETTER BEGIN HIGH TONE
+02FA MODIFIER LETTER END HIGH TONE
+02FB MODIFIER LETTER BEGIN LOW TONE
+02FC MODIFIER LETTER END LOW TONE
+02FD MODIFIER LETTER SHELF
+02FE MODIFIER LETTER OPEN SHELF
+02FF MODIFIER LETTER LOW LEFT ARROW
+0300 COMBINING GRAVE ACCENT
+0301 COMBINING ACUTE ACCENT
+0302 COMBINING CIRCUMFLEX ACCENT
+0303 COMBINING TILDE
+0304 COMBINING MACRON
+0305 COMBINING OVERLINE
+0306 COMBINING BREVE
+0307 COMBINING DOT ABOVE
+0308 COMBINING DIAERESIS
+0309 COMBINING HOOK ABOVE
+030A COMBINING RING ABOVE
+030B COMBINING DOUBLE ACUTE ACCENT
+030C COMBINING CARON
+030D COMBINING VERTICAL LINE ABOVE
+030E COMBINING DOUBLE VERTICAL LINE ABOVE
+030F COMBINING DOUBLE GRAVE ACCENT
+0310 COMBINING CANDRABINDU
+0311 COMBINING INVERTED BREVE
+0312 COMBINING TURNED COMMA ABOVE
+0313 COMBINING COMMA ABOVE
+0314 COMBINING REVERSED COMMA ABOVE
+0315 COMBINING COMMA ABOVE RIGHT
+0316 COMBINING GRAVE ACCENT BELOW
+0317 COMBINING ACUTE ACCENT BELOW
+0318 COMBINING LEFT TACK BELOW
+0319 COMBINING RIGHT TACK BELOW
+031A COMBINING LEFT ANGLE ABOVE
+031B COMBINING HORN
+031C COMBINING LEFT HALF RING BELOW
+031D COMBINING UP TACK BELOW
+031E COMBINING DOWN TACK BELOW
+031F COMBINING PLUS SIGN BELOW
+0320 COMBINING MINUS SIGN BELOW
+0321 COMBINING PALATALIZED HOOK BELOW
+0322 COMBINING RETROFLEX HOOK BELOW
+0323 COMBINING DOT BELOW
+0324 COMBINING DIAERESIS BELOW
+0325 COMBINING RING BELOW
+0326 COMBINING COMMA BELOW
+0327 COMBINING CEDILLA
+0328 COMBINING OGONEK
+0329 COMBINING VERTICAL LINE BELOW
+032A COMBINING BRIDGE BELOW
+032B COMBINING INVERTED DOUBLE ARCH BELOW
+032C COMBINING CARON BELOW
+032D COMBINING CIRCUMFLEX ACCENT BELOW
+032E COMBINING BREVE BELOW
+032F COMBINING INVERTED BREVE BELOW
+0330 COMBINING TILDE BELOW
+0331 COMBINING MACRON BELOW
+0332 COMBINING LOW LINE
+0333 COMBINING DOUBLE LOW LINE
+0334 COMBINING TILDE OVERLAY
+0335 COMBINING SHORT STROKE OVERLAY
+0336 COMBINING LONG STROKE OVERLAY
+0337 COMBINING SHORT SOLIDUS OVERLAY
+0338 COMBINING LONG SOLIDUS OVERLAY
+0339 COMBINING RIGHT HALF RING BELOW
+033A COMBINING INVERTED BRIDGE BELOW
+033B COMBINING SQUARE BELOW
+033C COMBINING SEAGULL BELOW
+033D COMBINING X ABOVE
+033E COMBINING VERTICAL TILDE
+033F COMBINING DOUBLE OVERLINE
+0340 COMBINING GRAVE TONE MARK
+0341 COMBINING ACUTE TONE MARK
+0342 COMBINING GREEK PERISPOMENI
+0343 COMBINING GREEK KORONIS
+0344 COMBINING GREEK DIALYTIKA TONOS
+0345 COMBINING GREEK YPOGEGRAMMENI
+0346 COMBINING BRIDGE ABOVE
+0347 COMBINING EQUALS SIGN BELOW
+0348 COMBINING DOUBLE VERTICAL LINE BELOW
+0349 COMBINING LEFT ANGLE BELOW
+034A COMBINING NOT TILDE ABOVE
+034B COMBINING HOMOTHETIC ABOVE
+034C COMBINING ALMOST EQUAL TO ABOVE
+034D COMBINING LEFT RIGHT ARROW BELOW
+034E COMBINING UPWARDS ARROW BELOW
+034F COMBINING GRAPHEME JOINER
+0350 COMBINING RIGHT ARROWHEAD ABOVE
+0351 COMBINING LEFT HALF RING ABOVE
+0352 COMBINING FERMATA
+0353 COMBINING X BELOW
+0354 COMBINING LEFT ARROWHEAD BELOW
+0355 COMBINING RIGHT ARROWHEAD BELOW
+0356 COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357 COMBINING RIGHT HALF RING ABOVE
+0358 COMBINING DOT ABOVE RIGHT
+0359 COMBINING ASTERISK BELOW
+035A COMBINING DOUBLE RING BELOW
+035B COMBINING ZIGZAG ABOVE
+035C COMBINING DOUBLE BREVE BELOW
+035D COMBINING DOUBLE BREVE
+035E COMBINING DOUBLE MACRON
+035F COMBINING DOUBLE MACRON BELOW
+0360 COMBINING DOUBLE TILDE
+0361 COMBINING DOUBLE INVERTED BREVE
+0362 COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0363 COMBINING LATIN SMALL LETTER A
+0364 COMBINING LATIN SMALL LETTER E
+0365 COMBINING LATIN SMALL LETTER I
+0366 COMBINING LATIN SMALL LETTER O
+0367 COMBINING LATIN SMALL LETTER U
+0368 COMBINING LATIN SMALL LETTER C
+0369 COMBINING LATIN SMALL LETTER D
+036A COMBINING LATIN SMALL LETTER H
+036B COMBINING LATIN SMALL LETTER M
+036C COMBINING LATIN SMALL LETTER R
+036D COMBINING LATIN SMALL LETTER T
+036E COMBINING LATIN SMALL LETTER V
+036F COMBINING LATIN SMALL LETTER X
+0370 GREEK CAPITAL LETTER HETA
+0371 GREEK SMALL LETTER HETA
+0372 GREEK CAPITAL LETTER ARCHAIC SAMPI
+0373 GREEK SMALL LETTER ARCHAIC SAMPI
+0374 GREEK NUMERAL SIGN
+0375 GREEK LOWER NUMERAL SIGN
+0376 GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+0377 GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A GREEK YPOGEGRAMMENI
+037B GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
+037C GREEK SMALL DOTTED LUNATE SIGMA SYMBOL
+037D GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+037E GREEK QUESTION MARK
+0384 GREEK TONOS
+0385 GREEK DIALYTIKA TONOS
+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387 GREEK ANO TELEIA
+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389 GREEK CAPITAL LETTER ETA WITH TONOS
+038A GREEK CAPITAL LETTER IOTA WITH TONOS
+038C GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E GREEK CAPITAL LETTER UPSILON WITH TONOS
+038F GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391 GREEK CAPITAL LETTER ALPHA
+0392 GREEK CAPITAL LETTER BETA
+0393 GREEK CAPITAL LETTER GAMMA
+0394 GREEK CAPITAL LETTER DELTA
+0395 GREEK CAPITAL LETTER EPSILON
+0396 GREEK CAPITAL LETTER ZETA
+0397 GREEK CAPITAL LETTER ETA
+0398 GREEK CAPITAL LETTER THETA
+0399 GREEK CAPITAL LETTER IOTA
+039A GREEK CAPITAL LETTER KAPPA
+039B GREEK CAPITAL LETTER LAMDA
+039C GREEK CAPITAL LETTER MU
+039D GREEK CAPITAL LETTER NU
+039E GREEK CAPITAL LETTER XI
+039F GREEK CAPITAL LETTER OMICRON
+03A0 GREEK CAPITAL LETTER PI
+03A1 GREEK CAPITAL LETTER RHO
+03A3 GREEK CAPITAL LETTER SIGMA
+03A4 GREEK CAPITAL LETTER TAU
+03A5 GREEK CAPITAL LETTER UPSILON
+03A6 GREEK CAPITAL LETTER PHI
+03A7 GREEK CAPITAL LETTER CHI
+03A8 GREEK CAPITAL LETTER PSI
+03A9 GREEK CAPITAL LETTER OMEGA
+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03AC GREEK SMALL LETTER ALPHA WITH TONOS
+03AD GREEK SMALL LETTER EPSILON WITH TONOS
+03AE GREEK SMALL LETTER ETA WITH TONOS
+03AF GREEK SMALL LETTER IOTA WITH TONOS
+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03B1 GREEK SMALL LETTER ALPHA
+03B2 GREEK SMALL LETTER BETA
+03B3 GREEK SMALL LETTER GAMMA
+03B4 GREEK SMALL LETTER DELTA
+03B5 GREEK SMALL LETTER EPSILON
+03B6 GREEK SMALL LETTER ZETA
+03B7 GREEK SMALL LETTER ETA
+03B8 GREEK SMALL LETTER THETA
+03B9 GREEK SMALL LETTER IOTA
+03BA GREEK SMALL LETTER KAPPA
+03BB GREEK SMALL LETTER LAMDA
+03BC GREEK SMALL LETTER MU
+03BD GREEK SMALL LETTER NU
+03BE GREEK SMALL LETTER XI
+03BF GREEK SMALL LETTER OMICRON
+03C0 GREEK SMALL LETTER PI
+03C1 GREEK SMALL LETTER RHO
+03C2 GREEK SMALL LETTER FINAL SIGMA
+03C3 GREEK SMALL LETTER SIGMA
+03C4 GREEK SMALL LETTER TAU
+03C5 GREEK SMALL LETTER UPSILON
+03C6 GREEK SMALL LETTER PHI
+03C7 GREEK SMALL LETTER CHI
+03C8 GREEK SMALL LETTER PSI
+03C9 GREEK SMALL LETTER OMEGA
+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA
+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+03CC GREEK SMALL LETTER OMICRON WITH TONOS
+03CD GREEK SMALL LETTER UPSILON WITH TONOS
+03CE GREEK SMALL LETTER OMEGA WITH TONOS
+03CF GREEK CAPITAL KAI SYMBOL
+03D0 GREEK BETA SYMBOL
+03D1 GREEK THETA SYMBOL
+03D2 GREEK UPSILON WITH HOOK SYMBOL
+03D3 GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+03D4 GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+03D5 GREEK PHI SYMBOL
+03D6 GREEK PI SYMBOL
+03D7 GREEK KAI SYMBOL
+03D8 GREEK LETTER ARCHAIC KOPPA
+03D9 GREEK SMALL LETTER ARCHAIC KOPPA
+03DA GREEK LETTER STIGMA
+03DB GREEK SMALL LETTER STIGMA
+03DC GREEK LETTER DIGAMMA
+03DD GREEK SMALL LETTER DIGAMMA
+03DE GREEK LETTER KOPPA
+03DF GREEK SMALL LETTER KOPPA
+03E0 GREEK LETTER SAMPI
+03E1 GREEK SMALL LETTER SAMPI
+03E2 COPTIC CAPITAL LETTER SHEI
+03E3 COPTIC SMALL LETTER SHEI
+03E4 COPTIC CAPITAL LETTER FEI
+03E5 COPTIC SMALL LETTER FEI
+03E6 COPTIC CAPITAL LETTER KHEI
+03E7 COPTIC SMALL LETTER KHEI
+03E8 COPTIC CAPITAL LETTER HORI
+03E9 COPTIC SMALL LETTER HORI
+03EA COPTIC CAPITAL LETTER GANGIA
+03EB COPTIC SMALL LETTER GANGIA
+03EC COPTIC CAPITAL LETTER SHIMA
+03ED COPTIC SMALL LETTER SHIMA
+03EE COPTIC CAPITAL LETTER DEI
+03EF COPTIC SMALL LETTER DEI
+03F0 GREEK KAPPA SYMBOL
+03F1 GREEK RHO SYMBOL
+03F2 GREEK LUNATE SIGMA SYMBOL
+03F3 GREEK LETTER YOT
+03F4 GREEK CAPITAL THETA SYMBOL
+03F5 GREEK LUNATE EPSILON SYMBOL
+03F6 GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7 GREEK CAPITAL LETTER SHO
+03F8 GREEK SMALL LETTER SHO
+03F9 GREEK CAPITAL LUNATE SIGMA SYMBOL
+03FA GREEK CAPITAL LETTER SAN
+03FB GREEK SMALL LETTER SAN
+03FC GREEK RHO WITH STROKE SYMBOL
+03FD GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+03FE GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+03FF GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0400 CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401 CYRILLIC CAPITAL LETTER IO
+0402 CYRILLIC CAPITAL LETTER DJE
+0403 CYRILLIC CAPITAL LETTER GJE
+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405 CYRILLIC CAPITAL LETTER DZE
+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407 CYRILLIC CAPITAL LETTER YI
+0408 CYRILLIC CAPITAL LETTER JE
+0409 CYRILLIC CAPITAL LETTER LJE
+040A CYRILLIC CAPITAL LETTER NJE
+040B CYRILLIC CAPITAL LETTER TSHE
+040C CYRILLIC CAPITAL LETTER KJE
+040D CYRILLIC CAPITAL LETTER I WITH GRAVE
+040E CYRILLIC CAPITAL LETTER SHORT U
+040F CYRILLIC CAPITAL LETTER DZHE
+0410 CYRILLIC CAPITAL LETTER A
+0411 CYRILLIC CAPITAL LETTER BE
+0412 CYRILLIC CAPITAL LETTER VE
+0413 CYRILLIC CAPITAL LETTER GHE
+0414 CYRILLIC CAPITAL LETTER DE
+0415 CYRILLIC CAPITAL LETTER IE
+0416 CYRILLIC CAPITAL LETTER ZHE
+0417 CYRILLIC CAPITAL LETTER ZE
+0418 CYRILLIC CAPITAL LETTER I
+0419 CYRILLIC CAPITAL LETTER SHORT I
+041A CYRILLIC CAPITAL LETTER KA
+041B CYRILLIC CAPITAL LETTER EL
+041C CYRILLIC CAPITAL LETTER EM
+041D CYRILLIC CAPITAL LETTER EN
+041E CYRILLIC CAPITAL LETTER O
+041F CYRILLIC CAPITAL LETTER PE
+0420 CYRILLIC CAPITAL LETTER ER
+0421 CYRILLIC CAPITAL LETTER ES
+0422 CYRILLIC CAPITAL LETTER TE
+0423 CYRILLIC CAPITAL LETTER U
+0424 CYRILLIC CAPITAL LETTER EF
+0425 CYRILLIC CAPITAL LETTER HA
+0426 CYRILLIC CAPITAL LETTER TSE
+0427 CYRILLIC CAPITAL LETTER CHE
+0428 CYRILLIC CAPITAL LETTER SHA
+0429 CYRILLIC CAPITAL LETTER SHCHA
+042A CYRILLIC CAPITAL LETTER HARD SIGN
+042B CYRILLIC CAPITAL LETTER YERU
+042C CYRILLIC CAPITAL LETTER SOFT SIGN
+042D CYRILLIC CAPITAL LETTER E
+042E CYRILLIC CAPITAL LETTER YU
+042F CYRILLIC CAPITAL LETTER YA
+0430 CYRILLIC SMALL LETTER A
+0431 CYRILLIC SMALL LETTER BE
+0432 CYRILLIC SMALL LETTER VE
+0433 CYRILLIC SMALL LETTER GHE
+0434 CYRILLIC SMALL LETTER DE
+0435 CYRILLIC SMALL LETTER IE
+0436 CYRILLIC SMALL LETTER ZHE
+0437 CYRILLIC SMALL LETTER ZE
+0438 CYRILLIC SMALL LETTER I
+0439 CYRILLIC SMALL LETTER SHORT I
+043A CYRILLIC SMALL LETTER KA
+043B CYRILLIC SMALL LETTER EL
+043C CYRILLIC SMALL LETTER EM
+043D CYRILLIC SMALL LETTER EN
+043E CYRILLIC SMALL LETTER O
+043F CYRILLIC SMALL LETTER PE
+0440 CYRILLIC SMALL LETTER ER
+0441 CYRILLIC SMALL LETTER ES
+0442 CYRILLIC SMALL LETTER TE
+0443 CYRILLIC SMALL LETTER U
+0444 CYRILLIC SMALL LETTER EF
+0445 CYRILLIC SMALL LETTER HA
+0446 CYRILLIC SMALL LETTER TSE
+0447 CYRILLIC SMALL LETTER CHE
+0448 CYRILLIC SMALL LETTER SHA
+0449 CYRILLIC SMALL LETTER SHCHA
+044A CYRILLIC SMALL LETTER HARD SIGN
+044B CYRILLIC SMALL LETTER YERU
+044C CYRILLIC SMALL LETTER SOFT SIGN
+044D CYRILLIC SMALL LETTER E
+044E CYRILLIC SMALL LETTER YU
+044F CYRILLIC SMALL LETTER YA
+0450 CYRILLIC SMALL LETTER IE WITH GRAVE
+0451 CYRILLIC SMALL LETTER IO
+0452 CYRILLIC SMALL LETTER DJE
+0453 CYRILLIC SMALL LETTER GJE
+0454 CYRILLIC SMALL LETTER UKRAINIAN IE
+0455 CYRILLIC SMALL LETTER DZE
+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0457 CYRILLIC SMALL LETTER YI
+0458 CYRILLIC SMALL LETTER JE
+0459 CYRILLIC SMALL LETTER LJE
+045A CYRILLIC SMALL LETTER NJE
+045B CYRILLIC SMALL LETTER TSHE
+045C CYRILLIC SMALL LETTER KJE
+045D CYRILLIC SMALL LETTER I WITH GRAVE
+045E CYRILLIC SMALL LETTER SHORT U
+045F CYRILLIC SMALL LETTER DZHE
+0460 CYRILLIC CAPITAL LETTER OMEGA
+0461 CYRILLIC SMALL LETTER OMEGA
+0462 CYRILLIC CAPITAL LETTER YAT
+0463 CYRILLIC SMALL LETTER YAT
+0464 CYRILLIC CAPITAL LETTER IOTIFIED E
+0465 CYRILLIC SMALL LETTER IOTIFIED E
+0466 CYRILLIC CAPITAL LETTER LITTLE YUS
+0467 CYRILLIC SMALL LETTER LITTLE YUS
+0468 CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469 CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046A CYRILLIC CAPITAL LETTER BIG YUS
+046B CYRILLIC SMALL LETTER BIG YUS
+046C CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046D CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046E CYRILLIC CAPITAL LETTER KSI
+046F CYRILLIC SMALL LETTER KSI
+0470 CYRILLIC CAPITAL LETTER PSI
+0471 CYRILLIC SMALL LETTER PSI
+0472 CYRILLIC CAPITAL LETTER FITA
+0473 CYRILLIC SMALL LETTER FITA
+0474 CYRILLIC CAPITAL LETTER IZHITSA
+0475 CYRILLIC SMALL LETTER IZHITSA
+0476 CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0477 CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478 CYRILLIC CAPITAL LETTER UK
+0479 CYRILLIC SMALL LETTER UK
+047A CYRILLIC CAPITAL LETTER ROUND OMEGA
+047B CYRILLIC SMALL LETTER ROUND OMEGA
+047C CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047D CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047E CYRILLIC CAPITAL LETTER OT
+047F CYRILLIC SMALL LETTER OT
+0480 CYRILLIC CAPITAL LETTER KOPPA
+0481 CYRILLIC SMALL LETTER KOPPA
+0482 CYRILLIC THOUSANDS SIGN
+0483 COMBINING CYRILLIC TITLO
+0484 COMBINING CYRILLIC PALATALIZATION
+0485 COMBINING CYRILLIC DASIA PNEUMATA
+0486 COMBINING CYRILLIC PSILI PNEUMATA
+0487 COMBINING CYRILLIC POKRYTIE
+0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489 COMBINING CYRILLIC MILLIONS SIGN
+048A CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048B CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048C CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048D CYRILLIC SMALL LETTER SEMISOFT SIGN
+048E CYRILLIC CAPITAL LETTER ER WITH TICK
+048F CYRILLIC SMALL LETTER ER WITH TICK
+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN
+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493 CYRILLIC SMALL LETTER GHE WITH STROKE
+0494 CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495 CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0498 CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499 CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049B CYRILLIC SMALL LETTER KA WITH DESCENDER
+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049E CYRILLIC CAPITAL LETTER KA WITH STROKE
+049F CYRILLIC SMALL LETTER KA WITH STROKE
+04A0 CYRILLIC CAPITAL LETTER BASHKIR KA
+04A1 CYRILLIC SMALL LETTER BASHKIR KA
+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A4 CYRILLIC CAPITAL LIGATURE EN GHE
+04A5 CYRILLIC SMALL LIGATURE EN GHE
+04A6 CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A7 CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A8 CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04A9 CYRILLIC SMALL LETTER ABKHASIAN HA
+04AA CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AB CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AC CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AD CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AE CYRILLIC CAPITAL LETTER STRAIGHT U
+04AF CYRILLIC SMALL LETTER STRAIGHT U
+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B4 CYRILLIC CAPITAL LIGATURE TE TSE
+04B5 CYRILLIC SMALL LIGATURE TE TSE
+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04BA CYRILLIC CAPITAL LETTER SHHA
+04BB CYRILLIC SMALL LETTER SHHA
+04BC CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BD CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BE CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04BF CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0 CYRILLIC LETTER PALOCHKA
+04C1 CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C2 CYRILLIC SMALL LETTER ZHE WITH BREVE
+04C3 CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C4 CYRILLIC SMALL LETTER KA WITH HOOK
+04C5 CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C6 CYRILLIC SMALL LETTER EL WITH TAIL
+04C7 CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C8 CYRILLIC SMALL LETTER EN WITH HOOK
+04C9 CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CA CYRILLIC SMALL LETTER EN WITH TAIL
+04CB CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CC CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CD CYRILLIC CAPITAL LETTER EM WITH TAIL
+04CE CYRILLIC SMALL LETTER EM WITH TAIL
+04CF CYRILLIC SMALL LETTER PALOCHKA
+04D0 CYRILLIC CAPITAL LETTER A WITH BREVE
+04D1 CYRILLIC SMALL LETTER A WITH BREVE
+04D2 CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D3 CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D4 CYRILLIC CAPITAL LIGATURE A IE
+04D5 CYRILLIC SMALL LIGATURE A IE
+04D6 CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D7 CYRILLIC SMALL LETTER IE WITH BREVE
+04D8 CYRILLIC CAPITAL LETTER SCHWA
+04D9 CYRILLIC SMALL LETTER SCHWA
+04DA CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DB CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DC CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DD CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DE CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04DF CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E0 CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E1 CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON
+04E3 CYRILLIC SMALL LETTER I WITH MACRON
+04E4 CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E5 CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E6 CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E7 CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E8 CYRILLIC CAPITAL LETTER BARRED O
+04E9 CYRILLIC SMALL LETTER BARRED O
+04EA CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EB CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EC CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04ED CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EE CYRILLIC CAPITAL LETTER U WITH MACRON
+04EF CYRILLIC SMALL LETTER U WITH MACRON
+04F0 CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F1 CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F2 CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F3 CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F4 CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F5 CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F6 CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F7 CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F8 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04F9 CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+04FA CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+04FB CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+04FC CYRILLIC CAPITAL LETTER HA WITH HOOK
+04FD CYRILLIC SMALL LETTER HA WITH HOOK
+04FE CYRILLIC CAPITAL LETTER HA WITH STROKE
+04FF CYRILLIC SMALL LETTER HA WITH STROKE
+0500 CYRILLIC CAPITAL LETTER KOMI DE
+0501 CYRILLIC SMALL LETTER KOMI DE
+0502 CYRILLIC CAPITAL LETTER KOMI DJE
+0503 CYRILLIC SMALL LETTER KOMI DJE
+0504 CYRILLIC CAPITAL LETTER KOMI ZJE
+0505 CYRILLIC SMALL LETTER KOMI ZJE
+0506 CYRILLIC CAPITAL LETTER KOMI DZJE
+0507 CYRILLIC SMALL LETTER KOMI DZJE
+0508 CYRILLIC CAPITAL LETTER KOMI LJE
+0509 CYRILLIC SMALL LETTER KOMI LJE
+050A CYRILLIC CAPITAL LETTER KOMI NJE
+050B CYRILLIC SMALL LETTER KOMI NJE
+050C CYRILLIC CAPITAL LETTER KOMI SJE
+050D CYRILLIC SMALL LETTER KOMI SJE
+050E CYRILLIC CAPITAL LETTER KOMI TJE
+050F CYRILLIC SMALL LETTER KOMI TJE
+0510 CYRILLIC CAPITAL LETTER REVERSED ZE
+0511 CYRILLIC SMALL LETTER REVERSED ZE
+0512 CYRILLIC CAPITAL LETTER EL WITH HOOK
+0513 CYRILLIC SMALL LETTER EL WITH HOOK
+0514 CYRILLIC CAPITAL LETTER LHA
+0515 CYRILLIC SMALL LETTER LHA
+0516 CYRILLIC CAPITAL LETTER RHA
+0517 CYRILLIC SMALL LETTER RHA
+0518 CYRILLIC CAPITAL LETTER YAE
+0519 CYRILLIC SMALL LETTER YAE
+051A CYRILLIC CAPITAL LETTER QA
+051B CYRILLIC SMALL LETTER QA
+051C CYRILLIC CAPITAL LETTER WE
+051D CYRILLIC SMALL LETTER WE
+051E CYRILLIC CAPITAL LETTER ALEUT KA
+051F CYRILLIC SMALL LETTER ALEUT KA
+0520 CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+0521 CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+0522 CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+0523 CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+0531 ARMENIAN CAPITAL LETTER AYB
+0532 ARMENIAN CAPITAL LETTER BEN
+0533 ARMENIAN CAPITAL LETTER GIM
+0534 ARMENIAN CAPITAL LETTER DA
+0535 ARMENIAN CAPITAL LETTER ECH
+0536 ARMENIAN CAPITAL LETTER ZA
+0537 ARMENIAN CAPITAL LETTER EH
+0538 ARMENIAN CAPITAL LETTER ET
+0539 ARMENIAN CAPITAL LETTER TO
+053A ARMENIAN CAPITAL LETTER ZHE
+053B ARMENIAN CAPITAL LETTER INI
+053C ARMENIAN CAPITAL LETTER LIWN
+053D ARMENIAN CAPITAL LETTER XEH
+053E ARMENIAN CAPITAL LETTER CA
+053F ARMENIAN CAPITAL LETTER KEN
+0540 ARMENIAN CAPITAL LETTER HO
+0541 ARMENIAN CAPITAL LETTER JA
+0542 ARMENIAN CAPITAL LETTER GHAD
+0543 ARMENIAN CAPITAL LETTER CHEH
+0544 ARMENIAN CAPITAL LETTER MEN
+0545 ARMENIAN CAPITAL LETTER YI
+0546 ARMENIAN CAPITAL LETTER NOW
+0547 ARMENIAN CAPITAL LETTER SHA
+0548 ARMENIAN CAPITAL LETTER VO
+0549 ARMENIAN CAPITAL LETTER CHA
+054A ARMENIAN CAPITAL LETTER PEH
+054B ARMENIAN CAPITAL LETTER JHEH
+054C ARMENIAN CAPITAL LETTER RA
+054D ARMENIAN CAPITAL LETTER SEH
+054E ARMENIAN CAPITAL LETTER VEW
+054F ARMENIAN CAPITAL LETTER TIWN
+0550 ARMENIAN CAPITAL LETTER REH
+0551 ARMENIAN CAPITAL LETTER CO
+0552 ARMENIAN CAPITAL LETTER YIWN
+0553 ARMENIAN CAPITAL LETTER PIWR
+0554 ARMENIAN CAPITAL LETTER KEH
+0555 ARMENIAN CAPITAL LETTER OH
+0556 ARMENIAN CAPITAL LETTER FEH
+0559 ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A ARMENIAN APOSTROPHE
+055B ARMENIAN EMPHASIS MARK
+055C ARMENIAN EXCLAMATION MARK
+055D ARMENIAN COMMA
+055E ARMENIAN QUESTION MARK
+055F ARMENIAN ABBREVIATION MARK
+0561 ARMENIAN SMALL LETTER AYB
+0562 ARMENIAN SMALL LETTER BEN
+0563 ARMENIAN SMALL LETTER GIM
+0564 ARMENIAN SMALL LETTER DA
+0565 ARMENIAN SMALL LETTER ECH
+0566 ARMENIAN SMALL LETTER ZA
+0567 ARMENIAN SMALL LETTER EH
+0568 ARMENIAN SMALL LETTER ET
+0569 ARMENIAN SMALL LETTER TO
+056A ARMENIAN SMALL LETTER ZHE
+056B ARMENIAN SMALL LETTER INI
+056C ARMENIAN SMALL LETTER LIWN
+056D ARMENIAN SMALL LETTER XEH
+056E ARMENIAN SMALL LETTER CA
+056F ARMENIAN SMALL LETTER KEN
+0570 ARMENIAN SMALL LETTER HO
+0571 ARMENIAN SMALL LETTER JA
+0572 ARMENIAN SMALL LETTER GHAD
+0573 ARMENIAN SMALL LETTER CHEH
+0574 ARMENIAN SMALL LETTER MEN
+0575 ARMENIAN SMALL LETTER YI
+0576 ARMENIAN SMALL LETTER NOW
+0577 ARMENIAN SMALL LETTER SHA
+0578 ARMENIAN SMALL LETTER VO
+0579 ARMENIAN SMALL LETTER CHA
+057A ARMENIAN SMALL LETTER PEH
+057B ARMENIAN SMALL LETTER JHEH
+057C ARMENIAN SMALL LETTER RA
+057D ARMENIAN SMALL LETTER SEH
+057E ARMENIAN SMALL LETTER VEW
+057F ARMENIAN SMALL LETTER TIWN
+0580 ARMENIAN SMALL LETTER REH
+0581 ARMENIAN SMALL LETTER CO
+0582 ARMENIAN SMALL LETTER YIWN
+0583 ARMENIAN SMALL LETTER PIWR
+0584 ARMENIAN SMALL LETTER KEH
+0585 ARMENIAN SMALL LETTER OH
+0586 ARMENIAN SMALL LETTER FEH
+0587 ARMENIAN SMALL LIGATURE ECH YIWN
+0589 ARMENIAN FULL STOP
+058A ARMENIAN HYPHEN
+0591 HEBREW ACCENT ETNAHTA
+0592 HEBREW ACCENT SEGOL
+0593 HEBREW ACCENT SHALSHELET
+0594 HEBREW ACCENT ZAQEF QATAN
+0595 HEBREW ACCENT ZAQEF GADOL
+0596 HEBREW ACCENT TIPEHA
+0597 HEBREW ACCENT REVIA
+0598 HEBREW ACCENT ZARQA
+0599 HEBREW ACCENT PASHTA
+059A HEBREW ACCENT YETIV
+059B HEBREW ACCENT TEVIR
+059C HEBREW ACCENT GERESH
+059D HEBREW ACCENT GERESH MUQDAM
+059E HEBREW ACCENT GERSHAYIM
+059F HEBREW ACCENT QARNEY PARA
+05A0 HEBREW ACCENT TELISHA GEDOLA
+05A1 HEBREW ACCENT PAZER
+05A2 HEBREW ACCENT ATNAH HAFUKH
+05A3 HEBREW ACCENT MUNAH
+05A4 HEBREW ACCENT MAHAPAKH
+05A5 HEBREW ACCENT MERKHA
+05A6 HEBREW ACCENT MERKHA KEFULA
+05A7 HEBREW ACCENT DARGA
+05A8 HEBREW ACCENT QADMA
+05A9 HEBREW ACCENT TELISHA QETANA
+05AA HEBREW ACCENT YERAH BEN YOMO
+05AB HEBREW ACCENT OLE
+05AC HEBREW ACCENT ILUY
+05AD HEBREW ACCENT DEHI
+05AE HEBREW ACCENT ZINOR
+05AF HEBREW MARK MASORA CIRCLE
+05B0 HEBREW POINT SHEVA
+05B1 HEBREW POINT HATAF SEGOL
+05B2 HEBREW POINT HATAF PATAH
+05B3 HEBREW POINT HATAF QAMATS
+05B4 HEBREW POINT HIRIQ
+05B5 HEBREW POINT TSERE
+05B6 HEBREW POINT SEGOL
+05B7 HEBREW POINT PATAH
+05B8 HEBREW POINT QAMATS
+05B9 HEBREW POINT HOLAM
+05BA HEBREW POINT HOLAM HASER FOR VAV
+05BB HEBREW POINT QUBUTS
+05BC HEBREW POINT DAGESH OR MAPIQ
+05BD HEBREW POINT METEG
+05BE HEBREW PUNCTUATION MAQAF
+05BF HEBREW POINT RAFE
+05C0 HEBREW PUNCTUATION PASEQ
+05C1 HEBREW POINT SHIN DOT
+05C2 HEBREW POINT SIN DOT
+05C3 HEBREW PUNCTUATION SOF PASUQ
+05C4 HEBREW MARK UPPER DOT
+05C5 HEBREW MARK LOWER DOT
+05C6 HEBREW PUNCTUATION NUN HAFUKHA
+05C7 HEBREW POINT QAMATS QATAN
+05D0 HEBREW LETTER ALEF
+05D1 HEBREW LETTER BET
+05D2 HEBREW LETTER GIMEL
+05D3 HEBREW LETTER DALET
+05D4 HEBREW LETTER HE
+05D5 HEBREW LETTER VAV
+05D6 HEBREW LETTER ZAYIN
+05D7 HEBREW LETTER HET
+05D8 HEBREW LETTER TET
+05D9 HEBREW LETTER YOD
+05DA HEBREW LETTER FINAL KAF
+05DB HEBREW LETTER KAF
+05DC HEBREW LETTER LAMED
+05DD HEBREW LETTER FINAL MEM
+05DE HEBREW LETTER MEM
+05DF HEBREW LETTER FINAL NUN
+05E0 HEBREW LETTER NUN
+05E1 HEBREW LETTER SAMEKH
+05E2 HEBREW LETTER AYIN
+05E3 HEBREW LETTER FINAL PE
+05E4 HEBREW LETTER PE
+05E5 HEBREW LETTER FINAL TSADI
+05E6 HEBREW LETTER TSADI
+05E7 HEBREW LETTER QOF
+05E8 HEBREW LETTER RESH
+05E9 HEBREW LETTER SHIN
+05EA HEBREW LETTER TAV
+05F0 HEBREW LIGATURE YIDDISH DOUBLE VAV
+05F1 HEBREW LIGATURE YIDDISH VAV YOD
+05F2 HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3 HEBREW PUNCTUATION GERESH
+05F4 HEBREW PUNCTUATION GERSHAYIM
+0600 ARABIC NUMBER SIGN
+0601 ARABIC SIGN SANAH
+0602 ARABIC FOOTNOTE MARKER
+0603 ARABIC SIGN SAFHA
+0606 ARABIC-INDIC CUBE ROOT
+0607 ARABIC-INDIC FOURTH ROOT
+0608 ARABIC RAY
+0609 ARABIC-INDIC PER MILLE SIGN
+060A ARABIC-INDIC PER TEN THOUSAND SIGN
+060B AFGHANI SIGN
+060C ARABIC COMMA
+060D ARABIC DATE SEPARATOR
+060E ARABIC POETIC VERSE SIGN
+060F ARABIC SIGN MISRA
+0610 ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611 ARABIC SIGN ALAYHE ASSALLAM
+0612 ARABIC SIGN RAHMATULLAH ALAYHE
+0613 ARABIC SIGN RADI ALLAHOU ANHU
+0614 ARABIC SIGN TAKHALLUS
+0615 ARABIC SMALL HIGH TAH
+0616 ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH
+0617 ARABIC SMALL HIGH ZAIN
+0618 ARABIC SMALL FATHA
+0619 ARABIC SMALL DAMMA
+061A ARABIC SMALL KASRA
+061B ARABIC SEMICOLON
+061E ARABIC TRIPLE DOT PUNCTUATION MARK
+061F ARABIC QUESTION MARK
+0621 ARABIC LETTER HAMZA
+0622 ARABIC LETTER ALEF WITH MADDA ABOVE
+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE
+0624 ARABIC LETTER WAW WITH HAMZA ABOVE
+0625 ARABIC LETTER ALEF WITH HAMZA BELOW
+0626 ARABIC LETTER YEH WITH HAMZA ABOVE
+0627 ARABIC LETTER ALEF
+0628 ARABIC LETTER BEH
+0629 ARABIC LETTER TEH MARBUTA
+062A ARABIC LETTER TEH
+062B ARABIC LETTER THEH
+062C ARABIC LETTER JEEM
+062D ARABIC LETTER HAH
+062E ARABIC LETTER KHAH
+062F ARABIC LETTER DAL
+0630 ARABIC LETTER THAL
+0631 ARABIC LETTER REH
+0632 ARABIC LETTER ZAIN
+0633 ARABIC LETTER SEEN
+0634 ARABIC LETTER SHEEN
+0635 ARABIC LETTER SAD
+0636 ARABIC LETTER DAD
+0637 ARABIC LETTER TAH
+0638 ARABIC LETTER ZAH
+0639 ARABIC LETTER AIN
+063A ARABIC LETTER GHAIN
+063B ARABIC LETTER KEHEH WITH TWO DOTS ABOVE
+063C ARABIC LETTER KEHEH WITH THREE DOTS BELOW
+063D ARABIC LETTER FARSI YEH WITH INVERTED V
+063E ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE
+063F ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0640 ARABIC TATWEEL
+0641 ARABIC LETTER FEH
+0642 ARABIC LETTER QAF
+0643 ARABIC LETTER KAF
+0644 ARABIC LETTER LAM
+0645 ARABIC LETTER MEEM
+0646 ARABIC LETTER NOON
+0647 ARABIC LETTER HEH
+0648 ARABIC LETTER WAW
+0649 ARABIC LETTER ALEF MAKSURA
+064A ARABIC LETTER YEH
+064B ARABIC FATHATAN
+064C ARABIC DAMMATAN
+064D ARABIC KASRATAN
+064E ARABIC FATHA
+064F ARABIC DAMMA
+0650 ARABIC KASRA
+0651 ARABIC SHADDA
+0652 ARABIC SUKUN
+0653 ARABIC MADDAH ABOVE
+0654 ARABIC HAMZA ABOVE
+0655 ARABIC HAMZA BELOW
+0656 ARABIC SUBSCRIPT ALEF
+0657 ARABIC INVERTED DAMMA
+0658 ARABIC MARK NOON GHUNNA
+0659 ARABIC ZWARAKAY
+065A ARABIC VOWEL SIGN SMALL V ABOVE
+065B ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
+065C ARABIC VOWEL SIGN DOT BELOW
+065D ARABIC REVERSED DAMMA
+065E ARABIC FATHA WITH TWO DOTS
+0660 ARABIC-INDIC DIGIT ZERO
+0661 ARABIC-INDIC DIGIT ONE
+0662 ARABIC-INDIC DIGIT TWO
+0663 ARABIC-INDIC DIGIT THREE
+0664 ARABIC-INDIC DIGIT FOUR
+0665 ARABIC-INDIC DIGIT FIVE
+0666 ARABIC-INDIC DIGIT SIX
+0667 ARABIC-INDIC DIGIT SEVEN
+0668 ARABIC-INDIC DIGIT EIGHT
+0669 ARABIC-INDIC DIGIT NINE
+066A ARABIC PERCENT SIGN
+066B ARABIC DECIMAL SEPARATOR
+066C ARABIC THOUSANDS SEPARATOR
+066D ARABIC FIVE POINTED STAR
+066E ARABIC LETTER DOTLESS BEH
+066F ARABIC LETTER DOTLESS QAF
+0670 ARABIC LETTER SUPERSCRIPT ALEF
+0671 ARABIC LETTER ALEF WASLA
+0672 ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0673 ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0674 ARABIC LETTER HIGH HAMZA
+0675 ARABIC LETTER HIGH HAMZA ALEF
+0676 ARABIC LETTER HIGH HAMZA WAW
+0677 ARABIC LETTER U WITH HAMZA ABOVE
+0678 ARABIC LETTER HIGH HAMZA YEH
+0679 ARABIC LETTER TTEH
+067A ARABIC LETTER TTEHEH
+067B ARABIC LETTER BEEH
+067C ARABIC LETTER TEH WITH RING
+067D ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067E ARABIC LETTER PEH
+067F ARABIC LETTER TEHEH
+0680 ARABIC LETTER BEHEH
+0681 ARABIC LETTER HAH WITH HAMZA ABOVE
+0682 ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0683 ARABIC LETTER NYEH
+0684 ARABIC LETTER DYEH
+0685 ARABIC LETTER HAH WITH THREE DOTS ABOVE
+0686 ARABIC LETTER TCHEH
+0687 ARABIC LETTER TCHEHEH
+0688 ARABIC LETTER DDAL
+0689 ARABIC LETTER DAL WITH RING
+068A ARABIC LETTER DAL WITH DOT BELOW
+068B ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068C ARABIC LETTER DAHAL
+068D ARABIC LETTER DDAHAL
+068E ARABIC LETTER DUL
+068F ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690 ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+0691 ARABIC LETTER RREH
+0692 ARABIC LETTER REH WITH SMALL V
+0693 ARABIC LETTER REH WITH RING
+0694 ARABIC LETTER REH WITH DOT BELOW
+0695 ARABIC LETTER REH WITH SMALL V BELOW
+0696 ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697 ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698 ARABIC LETTER JEH
+0699 ARABIC LETTER REH WITH FOUR DOTS ABOVE
+069A ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069B ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+069D ARABIC LETTER SAD WITH TWO DOTS BELOW
+069E ARABIC LETTER SAD WITH THREE DOTS ABOVE
+069F ARABIC LETTER TAH WITH THREE DOTS ABOVE
+06A0 ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06A1 ARABIC LETTER DOTLESS FEH
+06A2 ARABIC LETTER FEH WITH DOT MOVED BELOW
+06A3 ARABIC LETTER FEH WITH DOT BELOW
+06A4 ARABIC LETTER VEH
+06A5 ARABIC LETTER FEH WITH THREE DOTS BELOW
+06A6 ARABIC LETTER PEHEH
+06A7 ARABIC LETTER QAF WITH DOT ABOVE
+06A8 ARABIC LETTER QAF WITH THREE DOTS ABOVE
+06A9 ARABIC LETTER KEHEH
+06AA ARABIC LETTER SWASH KAF
+06AB ARABIC LETTER KAF WITH RING
+06AC ARABIC LETTER KAF WITH DOT ABOVE
+06AD ARABIC LETTER NG
+06AE ARABIC LETTER KAF WITH THREE DOTS BELOW
+06AF ARABIC LETTER GAF
+06B0 ARABIC LETTER GAF WITH RING
+06B1 ARABIC LETTER NGOEH
+06B2 ARABIC LETTER GAF WITH TWO DOTS BELOW
+06B3 ARABIC LETTER GUEH
+06B4 ARABIC LETTER GAF WITH THREE DOTS ABOVE
+06B5 ARABIC LETTER LAM WITH SMALL V
+06B6 ARABIC LETTER LAM WITH DOT ABOVE
+06B7 ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06B8 ARABIC LETTER LAM WITH THREE DOTS BELOW
+06B9 ARABIC LETTER NOON WITH DOT BELOW
+06BA ARABIC LETTER NOON GHUNNA
+06BB ARABIC LETTER RNOON
+06BC ARABIC LETTER NOON WITH RING
+06BD ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06BE ARABIC LETTER HEH DOACHASHMEE
+06BF ARABIC LETTER TCHEH WITH DOT ABOVE
+06C0 ARABIC LETTER HEH WITH YEH ABOVE
+06C1 ARABIC LETTER HEH GOAL
+06C2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+06C3 ARABIC LETTER TEH MARBUTA GOAL
+06C4 ARABIC LETTER WAW WITH RING
+06C5 ARABIC LETTER KIRGHIZ OE
+06C6 ARABIC LETTER OE
+06C7 ARABIC LETTER U
+06C8 ARABIC LETTER YU
+06C9 ARABIC LETTER KIRGHIZ YU
+06CA ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06CB ARABIC LETTER VE
+06CC ARABIC LETTER FARSI YEH
+06CD ARABIC LETTER YEH WITH TAIL
+06CE ARABIC LETTER YEH WITH SMALL V
+06CF ARABIC LETTER WAW WITH DOT ABOVE
+06D0 ARABIC LETTER E
+06D1 ARABIC LETTER YEH WITH THREE DOTS BELOW
+06D2 ARABIC LETTER YEH BARREE
+06D3 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4 ARABIC FULL STOP
+06D5 ARABIC LETTER AE
+06D6 ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7 ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8 ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9 ARABIC SMALL HIGH LAM ALEF
+06DA ARABIC SMALL HIGH JEEM
+06DB ARABIC SMALL HIGH THREE DOTS
+06DC ARABIC SMALL HIGH SEEN
+06DD ARABIC END OF AYAH
+06DE ARABIC START OF RUB EL HIZB
+06DF ARABIC SMALL HIGH ROUNDED ZERO
+06E0 ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1 ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2 ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3 ARABIC SMALL LOW SEEN
+06E4 ARABIC SMALL HIGH MADDA
+06E5 ARABIC SMALL WAW
+06E6 ARABIC SMALL YEH
+06E7 ARABIC SMALL HIGH YEH
+06E8 ARABIC SMALL HIGH NOON
+06E9 ARABIC PLACE OF SAJDAH
+06EA ARABIC EMPTY CENTRE LOW STOP
+06EB ARABIC EMPTY CENTRE HIGH STOP
+06EC ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED ARABIC SMALL LOW MEEM
+06EE ARABIC LETTER DAL WITH INVERTED V
+06EF ARABIC LETTER REH WITH INVERTED V
+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO
+06F1 EXTENDED ARABIC-INDIC DIGIT ONE
+06F2 EXTENDED ARABIC-INDIC DIGIT TWO
+06F3 EXTENDED ARABIC-INDIC DIGIT THREE
+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR
+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE
+06F6 EXTENDED ARABIC-INDIC DIGIT SIX
+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN
+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT
+06F9 EXTENDED ARABIC-INDIC DIGIT NINE
+06FA ARABIC LETTER SHEEN WITH DOT BELOW
+06FB ARABIC LETTER DAD WITH DOT BELOW
+06FC ARABIC LETTER GHAIN WITH DOT BELOW
+06FD ARABIC SIGN SINDHI AMPERSAND
+06FE ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF ARABIC LETTER HEH WITH INVERTED V
+0700 SYRIAC END OF PARAGRAPH
+0701 SYRIAC SUPRALINEAR FULL STOP
+0702 SYRIAC SUBLINEAR FULL STOP
+0703 SYRIAC SUPRALINEAR COLON
+0704 SYRIAC SUBLINEAR COLON
+0705 SYRIAC HORIZONTAL COLON
+0706 SYRIAC COLON SKEWED LEFT
+0707 SYRIAC COLON SKEWED RIGHT
+0708 SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709 SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070A SYRIAC CONTRACTION
+070B SYRIAC HARKLEAN OBELUS
+070C SYRIAC HARKLEAN METOBELUS
+070D SYRIAC HARKLEAN ASTERISCUS
+070F SYRIAC ABBREVIATION MARK
+0710 SYRIAC LETTER ALAPH
+0711 SYRIAC LETTER SUPERSCRIPT ALAPH
+0712 SYRIAC LETTER BETH
+0713 SYRIAC LETTER GAMAL
+0714 SYRIAC LETTER GAMAL GARSHUNI
+0715 SYRIAC LETTER DALATH
+0716 SYRIAC LETTER DOTLESS DALATH RISH
+0717 SYRIAC LETTER HE
+0718 SYRIAC LETTER WAW
+0719 SYRIAC LETTER ZAIN
+071A SYRIAC LETTER HETH
+071B SYRIAC LETTER TETH
+071C SYRIAC LETTER TETH GARSHUNI
+071D SYRIAC LETTER YUDH
+071E SYRIAC LETTER YUDH HE
+071F SYRIAC LETTER KAPH
+0720 SYRIAC LETTER LAMADH
+0721 SYRIAC LETTER MIM
+0722 SYRIAC LETTER NUN
+0723 SYRIAC LETTER SEMKATH
+0724 SYRIAC LETTER FINAL SEMKATH
+0725 SYRIAC LETTER E
+0726 SYRIAC LETTER PE
+0727 SYRIAC LETTER REVERSED PE
+0728 SYRIAC LETTER SADHE
+0729 SYRIAC LETTER QAPH
+072A SYRIAC LETTER RISH
+072B SYRIAC LETTER SHIN
+072C SYRIAC LETTER TAW
+072D SYRIAC LETTER PERSIAN BHETH
+072E SYRIAC LETTER PERSIAN GHAMAL
+072F SYRIAC LETTER PERSIAN DHALATH
+0730 SYRIAC PTHAHA ABOVE
+0731 SYRIAC PTHAHA BELOW
+0732 SYRIAC PTHAHA DOTTED
+0733 SYRIAC ZQAPHA ABOVE
+0734 SYRIAC ZQAPHA BELOW
+0735 SYRIAC ZQAPHA DOTTED
+0736 SYRIAC RBASA ABOVE
+0737 SYRIAC RBASA BELOW
+0738 SYRIAC DOTTED ZLAMA HORIZONTAL
+0739 SYRIAC DOTTED ZLAMA ANGULAR
+073A SYRIAC HBASA ABOVE
+073B SYRIAC HBASA BELOW
+073C SYRIAC HBASA-ESASA DOTTED
+073D SYRIAC ESASA ABOVE
+073E SYRIAC ESASA BELOW
+073F SYRIAC RWAHA
+0740 SYRIAC FEMININE DOT
+0741 SYRIAC QUSHSHAYA
+0742 SYRIAC RUKKAKHA
+0743 SYRIAC TWO VERTICAL DOTS ABOVE
+0744 SYRIAC TWO VERTICAL DOTS BELOW
+0745 SYRIAC THREE DOTS ABOVE
+0746 SYRIAC THREE DOTS BELOW
+0747 SYRIAC OBLIQUE LINE ABOVE
+0748 SYRIAC OBLIQUE LINE BELOW
+0749 SYRIAC MUSIC
+074A SYRIAC BARREKH
+074D SYRIAC LETTER SOGDIAN ZHAIN
+074E SYRIAC LETTER SOGDIAN KHAPH
+074F SYRIAC LETTER SOGDIAN FE
+0750 ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW
+0751 ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE
+0752 ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW
+0753 ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE
+0754 ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE
+0755 ARABIC LETTER BEH WITH INVERTED SMALL V BELOW
+0756 ARABIC LETTER BEH WITH SMALL V
+0757 ARABIC LETTER HAH WITH TWO DOTS ABOVE
+0758 ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW
+0759 ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH
+075A ARABIC LETTER DAL WITH INVERTED SMALL V BELOW
+075B ARABIC LETTER REH WITH STROKE
+075C ARABIC LETTER SEEN WITH FOUR DOTS ABOVE
+075D ARABIC LETTER AIN WITH TWO DOTS ABOVE
+075E ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE
+075F ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE
+0760 ARABIC LETTER FEH WITH TWO DOTS BELOW
+0761 ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW
+0762 ARABIC LETTER KEHEH WITH DOT ABOVE
+0763 ARABIC LETTER KEHEH WITH THREE DOTS ABOVE
+0764 ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW
+0765 ARABIC LETTER MEEM WITH DOT ABOVE
+0766 ARABIC LETTER MEEM WITH DOT BELOW
+0767 ARABIC LETTER NOON WITH TWO DOTS BELOW
+0768 ARABIC LETTER NOON WITH SMALL TAH
+0769 ARABIC LETTER NOON WITH SMALL V
+076A ARABIC LETTER LAM WITH BAR
+076B ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE
+076C ARABIC LETTER REH WITH HAMZA ABOVE
+076D ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+076E ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW
+076F ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0770 ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0771 ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0772 ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE
+0773 ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0774 ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0775 ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0776 ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0777 ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+0778 ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0779 ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+077A ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+077B ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+077C ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+077D ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE
+077E ARABIC LETTER SEEN WITH INVERTED V
+077F ARABIC LETTER KAF WITH TWO DOTS ABOVE
+0780 THAANA LETTER HAA
+0781 THAANA LETTER SHAVIYANI
+0782 THAANA LETTER NOONU
+0783 THAANA LETTER RAA
+0784 THAANA LETTER BAA
+0785 THAANA LETTER LHAVIYANI
+0786 THAANA LETTER KAAFU
+0787 THAANA LETTER ALIFU
+0788 THAANA LETTER VAAVU
+0789 THAANA LETTER MEEMU
+078A THAANA LETTER FAAFU
+078B THAANA LETTER DHAALU
+078C THAANA LETTER THAA
+078D THAANA LETTER LAAMU
+078E THAANA LETTER GAAFU
+078F THAANA LETTER GNAVIYANI
+0790 THAANA LETTER SEENU
+0791 THAANA LETTER DAVIYANI
+0792 THAANA LETTER ZAVIYANI
+0793 THAANA LETTER TAVIYANI
+0794 THAANA LETTER YAA
+0795 THAANA LETTER PAVIYANI
+0796 THAANA LETTER JAVIYANI
+0797 THAANA LETTER CHAVIYANI
+0798 THAANA LETTER TTAA
+0799 THAANA LETTER HHAA
+079A THAANA LETTER KHAA
+079B THAANA LETTER THAALU
+079C THAANA LETTER ZAA
+079D THAANA LETTER SHEENU
+079E THAANA LETTER SAADHU
+079F THAANA LETTER DAADHU
+07A0 THAANA LETTER TO
+07A1 THAANA LETTER ZO
+07A2 THAANA LETTER AINU
+07A3 THAANA LETTER GHAINU
+07A4 THAANA LETTER QAAFU
+07A5 THAANA LETTER WAAVU
+07A6 THAANA ABAFILI
+07A7 THAANA AABAAFILI
+07A8 THAANA IBIFILI
+07A9 THAANA EEBEEFILI
+07AA THAANA UBUFILI
+07AB THAANA OOBOOFILI
+07AC THAANA EBEFILI
+07AD THAANA EYBEYFILI
+07AE THAANA OBOFILI
+07AF THAANA OABOAFILI
+07B0 THAANA SUKUN
+07B1 THAANA LETTER NAA
+07C0 NKO DIGIT ZERO
+07C1 NKO DIGIT ONE
+07C2 NKO DIGIT TWO
+07C3 NKO DIGIT THREE
+07C4 NKO DIGIT FOUR
+07C5 NKO DIGIT FIVE
+07C6 NKO DIGIT SIX
+07C7 NKO DIGIT SEVEN
+07C8 NKO DIGIT EIGHT
+07C9 NKO DIGIT NINE
+07CA NKO LETTER A
+07CB NKO LETTER EE
+07CC NKO LETTER I
+07CD NKO LETTER E
+07CE NKO LETTER U
+07CF NKO LETTER OO
+07D0 NKO LETTER O
+07D1 NKO LETTER DAGBASINNA
+07D2 NKO LETTER N
+07D3 NKO LETTER BA
+07D4 NKO LETTER PA
+07D5 NKO LETTER TA
+07D6 NKO LETTER JA
+07D7 NKO LETTER CHA
+07D8 NKO LETTER DA
+07D9 NKO LETTER RA
+07DA NKO LETTER RRA
+07DB NKO LETTER SA
+07DC NKO LETTER GBA
+07DD NKO LETTER FA
+07DE NKO LETTER KA
+07DF NKO LETTER LA
+07E0 NKO LETTER NA WOLOSO
+07E1 NKO LETTER MA
+07E2 NKO LETTER NYA
+07E3 NKO LETTER NA
+07E4 NKO LETTER HA
+07E5 NKO LETTER WA
+07E6 NKO LETTER YA
+07E7 NKO LETTER NYA WOLOSO
+07E8 NKO LETTER JONA JA
+07E9 NKO LETTER JONA CHA
+07EA NKO LETTER JONA RA
+07EB NKO COMBINING SHORT HIGH TONE
+07EC NKO COMBINING SHORT LOW TONE
+07ED NKO COMBINING SHORT RISING TONE
+07EE NKO COMBINING LONG DESCENDING TONE
+07EF NKO COMBINING LONG HIGH TONE
+07F0 NKO COMBINING LONG LOW TONE
+07F1 NKO COMBINING LONG RISING TONE
+07F2 NKO COMBINING NASALIZATION MARK
+07F3 NKO COMBINING DOUBLE DOT ABOVE
+07F4 NKO HIGH TONE APOSTROPHE
+07F5 NKO LOW TONE APOSTROPHE
+07F6 NKO SYMBOL OO DENNEN
+07F7 NKO SYMBOL GBAKURUNEN
+07F8 NKO COMMA
+07F9 NKO EXCLAMATION MARK
+07FA NKO LAJANYALAN
+0901 DEVANAGARI SIGN CANDRABINDU
+0902 DEVANAGARI SIGN ANUSVARA
+0903 DEVANAGARI SIGN VISARGA
+0904 DEVANAGARI LETTER SHORT A
+0905 DEVANAGARI LETTER A
+0906 DEVANAGARI LETTER AA
+0907 DEVANAGARI LETTER I
+0908 DEVANAGARI LETTER II
+0909 DEVANAGARI LETTER U
+090A DEVANAGARI LETTER UU
+090B DEVANAGARI LETTER VOCALIC R
+090C DEVANAGARI LETTER VOCALIC L
+090D DEVANAGARI LETTER CANDRA E
+090E DEVANAGARI LETTER SHORT E
+090F DEVANAGARI LETTER E
+0910 DEVANAGARI LETTER AI
+0911 DEVANAGARI LETTER CANDRA O
+0912 DEVANAGARI LETTER SHORT O
+0913 DEVANAGARI LETTER O
+0914 DEVANAGARI LETTER AU
+0915 DEVANAGARI LETTER KA
+0916 DEVANAGARI LETTER KHA
+0917 DEVANAGARI LETTER GA
+0918 DEVANAGARI LETTER GHA
+0919 DEVANAGARI LETTER NGA
+091A DEVANAGARI LETTER CA
+091B DEVANAGARI LETTER CHA
+091C DEVANAGARI LETTER JA
+091D DEVANAGARI LETTER JHA
+091E DEVANAGARI LETTER NYA
+091F DEVANAGARI LETTER TTA
+0920 DEVANAGARI LETTER TTHA
+0921 DEVANAGARI LETTER DDA
+0922 DEVANAGARI LETTER DDHA
+0923 DEVANAGARI LETTER NNA
+0924 DEVANAGARI LETTER TA
+0925 DEVANAGARI LETTER THA
+0926 DEVANAGARI LETTER DA
+0927 DEVANAGARI LETTER DHA
+0928 DEVANAGARI LETTER NA
+0929 DEVANAGARI LETTER NNNA
+092A DEVANAGARI LETTER PA
+092B DEVANAGARI LETTER PHA
+092C DEVANAGARI LETTER BA
+092D DEVANAGARI LETTER BHA
+092E DEVANAGARI LETTER MA
+092F DEVANAGARI LETTER YA
+0930 DEVANAGARI LETTER RA
+0931 DEVANAGARI LETTER RRA
+0932 DEVANAGARI LETTER LA
+0933 DEVANAGARI LETTER LLA
+0934 DEVANAGARI LETTER LLLA
+0935 DEVANAGARI LETTER VA
+0936 DEVANAGARI LETTER SHA
+0937 DEVANAGARI LETTER SSA
+0938 DEVANAGARI LETTER SA
+0939 DEVANAGARI LETTER HA
+093C DEVANAGARI SIGN NUKTA
+093D DEVANAGARI SIGN AVAGRAHA
+093E DEVANAGARI VOWEL SIGN AA
+093F DEVANAGARI VOWEL SIGN I
+0940 DEVANAGARI VOWEL SIGN II
+0941 DEVANAGARI VOWEL SIGN U
+0942 DEVANAGARI VOWEL SIGN UU
+0943 DEVANAGARI VOWEL SIGN VOCALIC R
+0944 DEVANAGARI VOWEL SIGN VOCALIC RR
+0945 DEVANAGARI VOWEL SIGN CANDRA E
+0946 DEVANAGARI VOWEL SIGN SHORT E
+0947 DEVANAGARI VOWEL SIGN E
+0948 DEVANAGARI VOWEL SIGN AI
+0949 DEVANAGARI VOWEL SIGN CANDRA O
+094A DEVANAGARI VOWEL SIGN SHORT O
+094B DEVANAGARI VOWEL SIGN O
+094C DEVANAGARI VOWEL SIGN AU
+094D DEVANAGARI SIGN VIRAMA
+0950 DEVANAGARI OM
+0951 DEVANAGARI STRESS SIGN UDATTA
+0952 DEVANAGARI STRESS SIGN ANUDATTA
+0953 DEVANAGARI GRAVE ACCENT
+0954 DEVANAGARI ACUTE ACCENT
+0958 DEVANAGARI LETTER QA
+0959 DEVANAGARI LETTER KHHA
+095A DEVANAGARI LETTER GHHA
+095B DEVANAGARI LETTER ZA
+095C DEVANAGARI LETTER DDDHA
+095D DEVANAGARI LETTER RHA
+095E DEVANAGARI LETTER FA
+095F DEVANAGARI LETTER YYA
+0960 DEVANAGARI LETTER VOCALIC RR
+0961 DEVANAGARI LETTER VOCALIC LL
+0962 DEVANAGARI VOWEL SIGN VOCALIC L
+0963 DEVANAGARI VOWEL SIGN VOCALIC LL
+0964 DEVANAGARI DANDA
+0965 DEVANAGARI DOUBLE DANDA
+0966 DEVANAGARI DIGIT ZERO
+0967 DEVANAGARI DIGIT ONE
+0968 DEVANAGARI DIGIT TWO
+0969 DEVANAGARI DIGIT THREE
+096A DEVANAGARI DIGIT FOUR
+096B DEVANAGARI DIGIT FIVE
+096C DEVANAGARI DIGIT SIX
+096D DEVANAGARI DIGIT SEVEN
+096E DEVANAGARI DIGIT EIGHT
+096F DEVANAGARI DIGIT NINE
+0970 DEVANAGARI ABBREVIATION SIGN
+0971 DEVANAGARI SIGN HIGH SPACING DOT
+0972 DEVANAGARI LETTER CANDRA A
+097B DEVANAGARI LETTER GGA
+097C DEVANAGARI LETTER JJA
+097D DEVANAGARI LETTER GLOTTAL STOP
+097E DEVANAGARI LETTER DDDA
+097F DEVANAGARI LETTER BBA
+0981 BENGALI SIGN CANDRABINDU
+0982 BENGALI SIGN ANUSVARA
+0983 BENGALI SIGN VISARGA
+0985 BENGALI LETTER A
+0986 BENGALI LETTER AA
+0987 BENGALI LETTER I
+0988 BENGALI LETTER II
+0989 BENGALI LETTER U
+098A BENGALI LETTER UU
+098B BENGALI LETTER VOCALIC R
+098C BENGALI LETTER VOCALIC L
+098F BENGALI LETTER E
+0990 BENGALI LETTER AI
+0993 BENGALI LETTER O
+0994 BENGALI LETTER AU
+0995 BENGALI LETTER KA
+0996 BENGALI LETTER KHA
+0997 BENGALI LETTER GA
+0998 BENGALI LETTER GHA
+0999 BENGALI LETTER NGA
+099A BENGALI LETTER CA
+099B BENGALI LETTER CHA
+099C BENGALI LETTER JA
+099D BENGALI LETTER JHA
+099E BENGALI LETTER NYA
+099F BENGALI LETTER TTA
+09A0 BENGALI LETTER TTHA
+09A1 BENGALI LETTER DDA
+09A2 BENGALI LETTER DDHA
+09A3 BENGALI LETTER NNA
+09A4 BENGALI LETTER TA
+09A5 BENGALI LETTER THA
+09A6 BENGALI LETTER DA
+09A7 BENGALI LETTER DHA
+09A8 BENGALI LETTER NA
+09AA BENGALI LETTER PA
+09AB BENGALI LETTER PHA
+09AC BENGALI LETTER BA
+09AD BENGALI LETTER BHA
+09AE BENGALI LETTER MA
+09AF BENGALI LETTER YA
+09B0 BENGALI LETTER RA
+09B2 BENGALI LETTER LA
+09B6 BENGALI LETTER SHA
+09B7 BENGALI LETTER SSA
+09B8 BENGALI LETTER SA
+09B9 BENGALI LETTER HA
+09BC BENGALI SIGN NUKTA
+09BD BENGALI SIGN AVAGRAHA
+09BE BENGALI VOWEL SIGN AA
+09BF BENGALI VOWEL SIGN I
+09C0 BENGALI VOWEL SIGN II
+09C1 BENGALI VOWEL SIGN U
+09C2 BENGALI VOWEL SIGN UU
+09C3 BENGALI VOWEL SIGN VOCALIC R
+09C4 BENGALI VOWEL SIGN VOCALIC RR
+09C7 BENGALI VOWEL SIGN E
+09C8 BENGALI VOWEL SIGN AI
+09CB BENGALI VOWEL SIGN O
+09CC BENGALI VOWEL SIGN AU
+09CD BENGALI SIGN VIRAMA
+09CE BENGALI LETTER KHANDA TA
+09D7 BENGALI AU LENGTH MARK
+09DC BENGALI LETTER RRA
+09DD BENGALI LETTER RHA
+09DF BENGALI LETTER YYA
+09E0 BENGALI LETTER VOCALIC RR
+09E1 BENGALI LETTER VOCALIC LL
+09E2 BENGALI VOWEL SIGN VOCALIC L
+09E3 BENGALI VOWEL SIGN VOCALIC LL
+09E6 BENGALI DIGIT ZERO
+09E7 BENGALI DIGIT ONE
+09E8 BENGALI DIGIT TWO
+09E9 BENGALI DIGIT THREE
+09EA BENGALI DIGIT FOUR
+09EB BENGALI DIGIT FIVE
+09EC BENGALI DIGIT SIX
+09ED BENGALI DIGIT SEVEN
+09EE BENGALI DIGIT EIGHT
+09EF BENGALI DIGIT NINE
+09F0 BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09F1 BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2 BENGALI RUPEE MARK
+09F3 BENGALI RUPEE SIGN
+09F4 BENGALI CURRENCY NUMERATOR ONE
+09F5 BENGALI CURRENCY NUMERATOR TWO
+09F6 BENGALI CURRENCY NUMERATOR THREE
+09F7 BENGALI CURRENCY NUMERATOR FOUR
+09F8 BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9 BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA BENGALI ISSHAR
+0A01 GURMUKHI SIGN ADAK BINDI
+0A02 GURMUKHI SIGN BINDI
+0A03 GURMUKHI SIGN VISARGA
+0A05 GURMUKHI LETTER A
+0A06 GURMUKHI LETTER AA
+0A07 GURMUKHI LETTER I
+0A08 GURMUKHI LETTER II
+0A09 GURMUKHI LETTER U
+0A0A GURMUKHI LETTER UU
+0A0F GURMUKHI LETTER EE
+0A10 GURMUKHI LETTER AI
+0A13 GURMUKHI LETTER OO
+0A14 GURMUKHI LETTER AU
+0A15 GURMUKHI LETTER KA
+0A16 GURMUKHI LETTER KHA
+0A17 GURMUKHI LETTER GA
+0A18 GURMUKHI LETTER GHA
+0A19 GURMUKHI LETTER NGA
+0A1A GURMUKHI LETTER CA
+0A1B GURMUKHI LETTER CHA
+0A1C GURMUKHI LETTER JA
+0A1D GURMUKHI LETTER JHA
+0A1E GURMUKHI LETTER NYA
+0A1F GURMUKHI LETTER TTA
+0A20 GURMUKHI LETTER TTHA
+0A21 GURMUKHI LETTER DDA
+0A22 GURMUKHI LETTER DDHA
+0A23 GURMUKHI LETTER NNA
+0A24 GURMUKHI LETTER TA
+0A25 GURMUKHI LETTER THA
+0A26 GURMUKHI LETTER DA
+0A27 GURMUKHI LETTER DHA
+0A28 GURMUKHI LETTER NA
+0A2A GURMUKHI LETTER PA
+0A2B GURMUKHI LETTER PHA
+0A2C GURMUKHI LETTER BA
+0A2D GURMUKHI LETTER BHA
+0A2E GURMUKHI LETTER MA
+0A2F GURMUKHI LETTER YA
+0A30 GURMUKHI LETTER RA
+0A32 GURMUKHI LETTER LA
+0A33 GURMUKHI LETTER LLA
+0A35 GURMUKHI LETTER VA
+0A36 GURMUKHI LETTER SHA
+0A38 GURMUKHI LETTER SA
+0A39 GURMUKHI LETTER HA
+0A3C GURMUKHI SIGN NUKTA
+0A3E GURMUKHI VOWEL SIGN AA
+0A3F GURMUKHI VOWEL SIGN I
+0A40 GURMUKHI VOWEL SIGN II
+0A41 GURMUKHI VOWEL SIGN U
+0A42 GURMUKHI VOWEL SIGN UU
+0A47 GURMUKHI VOWEL SIGN EE
+0A48 GURMUKHI VOWEL SIGN AI
+0A4B GURMUKHI VOWEL SIGN OO
+0A4C GURMUKHI VOWEL SIGN AU
+0A4D GURMUKHI SIGN VIRAMA
+0A51 GURMUKHI SIGN UDAAT
+0A59 GURMUKHI LETTER KHHA
+0A5A GURMUKHI LETTER GHHA
+0A5B GURMUKHI LETTER ZA
+0A5C GURMUKHI LETTER RRA
+0A5E GURMUKHI LETTER FA
+0A66 GURMUKHI DIGIT ZERO
+0A67 GURMUKHI DIGIT ONE
+0A68 GURMUKHI DIGIT TWO
+0A69 GURMUKHI DIGIT THREE
+0A6A GURMUKHI DIGIT FOUR
+0A6B GURMUKHI DIGIT FIVE
+0A6C GURMUKHI DIGIT SIX
+0A6D GURMUKHI DIGIT SEVEN
+0A6E GURMUKHI DIGIT EIGHT
+0A6F GURMUKHI DIGIT NINE
+0A70 GURMUKHI TIPPI
+0A71 GURMUKHI ADDAK
+0A72 GURMUKHI IRI
+0A73 GURMUKHI URA
+0A74 GURMUKHI EK ONKAR
+0A75 GURMUKHI SIGN YAKASH
+0A81 GUJARATI SIGN CANDRABINDU
+0A82 GUJARATI SIGN ANUSVARA
+0A83 GUJARATI SIGN VISARGA
+0A85 GUJARATI LETTER A
+0A86 GUJARATI LETTER AA
+0A87 GUJARATI LETTER I
+0A88 GUJARATI LETTER II
+0A89 GUJARATI LETTER U
+0A8A GUJARATI LETTER UU
+0A8B GUJARATI LETTER VOCALIC R
+0A8C GUJARATI LETTER VOCALIC L
+0A8D GUJARATI VOWEL CANDRA E
+0A8F GUJARATI LETTER E
+0A90 GUJARATI LETTER AI
+0A91 GUJARATI VOWEL CANDRA O
+0A93 GUJARATI LETTER O
+0A94 GUJARATI LETTER AU
+0A95 GUJARATI LETTER KA
+0A96 GUJARATI LETTER KHA
+0A97 GUJARATI LETTER GA
+0A98 GUJARATI LETTER GHA
+0A99 GUJARATI LETTER NGA
+0A9A GUJARATI LETTER CA
+0A9B GUJARATI LETTER CHA
+0A9C GUJARATI LETTER JA
+0A9D GUJARATI LETTER JHA
+0A9E GUJARATI LETTER NYA
+0A9F GUJARATI LETTER TTA
+0AA0 GUJARATI LETTER TTHA
+0AA1 GUJARATI LETTER DDA
+0AA2 GUJARATI LETTER DDHA
+0AA3 GUJARATI LETTER NNA
+0AA4 GUJARATI LETTER TA
+0AA5 GUJARATI LETTER THA
+0AA6 GUJARATI LETTER DA
+0AA7 GUJARATI LETTER DHA
+0AA8 GUJARATI LETTER NA
+0AAA GUJARATI LETTER PA
+0AAB GUJARATI LETTER PHA
+0AAC GUJARATI LETTER BA
+0AAD GUJARATI LETTER BHA
+0AAE GUJARATI LETTER MA
+0AAF GUJARATI LETTER YA
+0AB0 GUJARATI LETTER RA
+0AB2 GUJARATI LETTER LA
+0AB3 GUJARATI LETTER LLA
+0AB5 GUJARATI LETTER VA
+0AB6 GUJARATI LETTER SHA
+0AB7 GUJARATI LETTER SSA
+0AB8 GUJARATI LETTER SA
+0AB9 GUJARATI LETTER HA
+0ABC GUJARATI SIGN NUKTA
+0ABD GUJARATI SIGN AVAGRAHA
+0ABE GUJARATI VOWEL SIGN AA
+0ABF GUJARATI VOWEL SIGN I
+0AC0 GUJARATI VOWEL SIGN II
+0AC1 GUJARATI VOWEL SIGN U
+0AC2 GUJARATI VOWEL SIGN UU
+0AC3 GUJARATI VOWEL SIGN VOCALIC R
+0AC4 GUJARATI VOWEL SIGN VOCALIC RR
+0AC5 GUJARATI VOWEL SIGN CANDRA E
+0AC7 GUJARATI VOWEL SIGN E
+0AC8 GUJARATI VOWEL SIGN AI
+0AC9 GUJARATI VOWEL SIGN CANDRA O
+0ACB GUJARATI VOWEL SIGN O
+0ACC GUJARATI VOWEL SIGN AU
+0ACD GUJARATI SIGN VIRAMA
+0AD0 GUJARATI OM
+0AE0 GUJARATI LETTER VOCALIC RR
+0AE1 GUJARATI LETTER VOCALIC LL
+0AE2 GUJARATI VOWEL SIGN VOCALIC L
+0AE3 GUJARATI VOWEL SIGN VOCALIC LL
+0AE6 GUJARATI DIGIT ZERO
+0AE7 GUJARATI DIGIT ONE
+0AE8 GUJARATI DIGIT TWO
+0AE9 GUJARATI DIGIT THREE
+0AEA GUJARATI DIGIT FOUR
+0AEB GUJARATI DIGIT FIVE
+0AEC GUJARATI DIGIT SIX
+0AED GUJARATI DIGIT SEVEN
+0AEE GUJARATI DIGIT EIGHT
+0AEF GUJARATI DIGIT NINE
+0AF1 GUJARATI RUPEE SIGN
+0B01 ORIYA SIGN CANDRABINDU
+0B02 ORIYA SIGN ANUSVARA
+0B03 ORIYA SIGN VISARGA
+0B05 ORIYA LETTER A
+0B06 ORIYA LETTER AA
+0B07 ORIYA LETTER I
+0B08 ORIYA LETTER II
+0B09 ORIYA LETTER U
+0B0A ORIYA LETTER UU
+0B0B ORIYA LETTER VOCALIC R
+0B0C ORIYA LETTER VOCALIC L
+0B0F ORIYA LETTER E
+0B10 ORIYA LETTER AI
+0B13 ORIYA LETTER O
+0B14 ORIYA LETTER AU
+0B15 ORIYA LETTER KA
+0B16 ORIYA LETTER KHA
+0B17 ORIYA LETTER GA
+0B18 ORIYA LETTER GHA
+0B19 ORIYA LETTER NGA
+0B1A ORIYA LETTER CA
+0B1B ORIYA LETTER CHA
+0B1C ORIYA LETTER JA
+0B1D ORIYA LETTER JHA
+0B1E ORIYA LETTER NYA
+0B1F ORIYA LETTER TTA
+0B20 ORIYA LETTER TTHA
+0B21 ORIYA LETTER DDA
+0B22 ORIYA LETTER DDHA
+0B23 ORIYA LETTER NNA
+0B24 ORIYA LETTER TA
+0B25 ORIYA LETTER THA
+0B26 ORIYA LETTER DA
+0B27 ORIYA LETTER DHA
+0B28 ORIYA LETTER NA
+0B2A ORIYA LETTER PA
+0B2B ORIYA LETTER PHA
+0B2C ORIYA LETTER BA
+0B2D ORIYA LETTER BHA
+0B2E ORIYA LETTER MA
+0B2F ORIYA LETTER YA
+0B30 ORIYA LETTER RA
+0B32 ORIYA LETTER LA
+0B33 ORIYA LETTER LLA
+0B35 ORIYA LETTER VA
+0B36 ORIYA LETTER SHA
+0B37 ORIYA LETTER SSA
+0B38 ORIYA LETTER SA
+0B39 ORIYA LETTER HA
+0B3C ORIYA SIGN NUKTA
+0B3D ORIYA SIGN AVAGRAHA
+0B3E ORIYA VOWEL SIGN AA
+0B3F ORIYA VOWEL SIGN I
+0B40 ORIYA VOWEL SIGN II
+0B41 ORIYA VOWEL SIGN U
+0B42 ORIYA VOWEL SIGN UU
+0B43 ORIYA VOWEL SIGN VOCALIC R
+0B44 ORIYA VOWEL SIGN VOCALIC RR
+0B47 ORIYA VOWEL SIGN E
+0B48 ORIYA VOWEL SIGN AI
+0B4B ORIYA VOWEL SIGN O
+0B4C ORIYA VOWEL SIGN AU
+0B4D ORIYA SIGN VIRAMA
+0B56 ORIYA AI LENGTH MARK
+0B57 ORIYA AU LENGTH MARK
+0B5C ORIYA LETTER RRA
+0B5D ORIYA LETTER RHA
+0B5F ORIYA LETTER YYA
+0B60 ORIYA LETTER VOCALIC RR
+0B61 ORIYA LETTER VOCALIC LL
+0B62 ORIYA VOWEL SIGN VOCALIC L
+0B63 ORIYA VOWEL SIGN VOCALIC LL
+0B66 ORIYA DIGIT ZERO
+0B67 ORIYA DIGIT ONE
+0B68 ORIYA DIGIT TWO
+0B69 ORIYA DIGIT THREE
+0B6A ORIYA DIGIT FOUR
+0B6B ORIYA DIGIT FIVE
+0B6C ORIYA DIGIT SIX
+0B6D ORIYA DIGIT SEVEN
+0B6E ORIYA DIGIT EIGHT
+0B6F ORIYA DIGIT NINE
+0B70 ORIYA ISSHAR
+0B71 ORIYA LETTER WA
+0B82 TAMIL SIGN ANUSVARA
+0B83 TAMIL SIGN VISARGA
+0B85 TAMIL LETTER A
+0B86 TAMIL LETTER AA
+0B87 TAMIL LETTER I
+0B88 TAMIL LETTER II
+0B89 TAMIL LETTER U
+0B8A TAMIL LETTER UU
+0B8E TAMIL LETTER E
+0B8F TAMIL LETTER EE
+0B90 TAMIL LETTER AI
+0B92 TAMIL LETTER O
+0B93 TAMIL LETTER OO
+0B94 TAMIL LETTER AU
+0B95 TAMIL LETTER KA
+0B99 TAMIL LETTER NGA
+0B9A TAMIL LETTER CA
+0B9C TAMIL LETTER JA
+0B9E TAMIL LETTER NYA
+0B9F TAMIL LETTER TTA
+0BA3 TAMIL LETTER NNA
+0BA4 TAMIL LETTER TA
+0BA8 TAMIL LETTER NA
+0BA9 TAMIL LETTER NNNA
+0BAA TAMIL LETTER PA
+0BAE TAMIL LETTER MA
+0BAF TAMIL LETTER YA
+0BB0 TAMIL LETTER RA
+0BB1 TAMIL LETTER RRA
+0BB2 TAMIL LETTER LA
+0BB3 TAMIL LETTER LLA
+0BB4 TAMIL LETTER LLLA
+0BB5 TAMIL LETTER VA
+0BB6 TAMIL LETTER SHA
+0BB7 TAMIL LETTER SSA
+0BB8 TAMIL LETTER SA
+0BB9 TAMIL LETTER HA
+0BBE TAMIL VOWEL SIGN AA
+0BBF TAMIL VOWEL SIGN I
+0BC0 TAMIL VOWEL SIGN II
+0BC1 TAMIL VOWEL SIGN U
+0BC2 TAMIL VOWEL SIGN UU
+0BC6 TAMIL VOWEL SIGN E
+0BC7 TAMIL VOWEL SIGN EE
+0BC8 TAMIL VOWEL SIGN AI
+0BCA TAMIL VOWEL SIGN O
+0BCB TAMIL VOWEL SIGN OO
+0BCC TAMIL VOWEL SIGN AU
+0BCD TAMIL SIGN VIRAMA
+0BD0 TAMIL OM
+0BD7 TAMIL AU LENGTH MARK
+0BE6 TAMIL DIGIT ZERO
+0BE7 TAMIL DIGIT ONE
+0BE8 TAMIL DIGIT TWO
+0BE9 TAMIL DIGIT THREE
+0BEA TAMIL DIGIT FOUR
+0BEB TAMIL DIGIT FIVE
+0BEC TAMIL DIGIT SIX
+0BED TAMIL DIGIT SEVEN
+0BEE TAMIL DIGIT EIGHT
+0BEF TAMIL DIGIT NINE
+0BF0 TAMIL NUMBER TEN
+0BF1 TAMIL NUMBER ONE HUNDRED
+0BF2 TAMIL NUMBER ONE THOUSAND
+0BF3 TAMIL DAY SIGN
+0BF4 TAMIL MONTH SIGN
+0BF5 TAMIL YEAR SIGN
+0BF6 TAMIL DEBIT SIGN
+0BF7 TAMIL CREDIT SIGN
+0BF8 TAMIL AS ABOVE SIGN
+0BF9 TAMIL RUPEE SIGN
+0BFA TAMIL NUMBER SIGN
+0C01 TELUGU SIGN CANDRABINDU
+0C02 TELUGU SIGN ANUSVARA
+0C03 TELUGU SIGN VISARGA
+0C05 TELUGU LETTER A
+0C06 TELUGU LETTER AA
+0C07 TELUGU LETTER I
+0C08 TELUGU LETTER II
+0C09 TELUGU LETTER U
+0C0A TELUGU LETTER UU
+0C0B TELUGU LETTER VOCALIC R
+0C0C TELUGU LETTER VOCALIC L
+0C0E TELUGU LETTER E
+0C0F TELUGU LETTER EE
+0C10 TELUGU LETTER AI
+0C12 TELUGU LETTER O
+0C13 TELUGU LETTER OO
+0C14 TELUGU LETTER AU
+0C15 TELUGU LETTER KA
+0C16 TELUGU LETTER KHA
+0C17 TELUGU LETTER GA
+0C18 TELUGU LETTER GHA
+0C19 TELUGU LETTER NGA
+0C1A TELUGU LETTER CA
+0C1B TELUGU LETTER CHA
+0C1C TELUGU LETTER JA
+0C1D TELUGU LETTER JHA
+0C1E TELUGU LETTER NYA
+0C1F TELUGU LETTER TTA
+0C20 TELUGU LETTER TTHA
+0C21 TELUGU LETTER DDA
+0C22 TELUGU LETTER DDHA
+0C23 TELUGU LETTER NNA
+0C24 TELUGU LETTER TA
+0C25 TELUGU LETTER THA
+0C26 TELUGU LETTER DA
+0C27 TELUGU LETTER DHA
+0C28 TELUGU LETTER NA
+0C2A TELUGU LETTER PA
+0C2B TELUGU LETTER PHA
+0C2C TELUGU LETTER BA
+0C2D TELUGU LETTER BHA
+0C2E TELUGU LETTER MA
+0C2F TELUGU LETTER YA
+0C30 TELUGU LETTER RA
+0C31 TELUGU LETTER RRA
+0C32 TELUGU LETTER LA
+0C33 TELUGU LETTER LLA
+0C35 TELUGU LETTER VA
+0C36 TELUGU LETTER SHA
+0C37 TELUGU LETTER SSA
+0C38 TELUGU LETTER SA
+0C39 TELUGU LETTER HA
+0C3D TELUGU SIGN AVAGRAHA
+0C3E TELUGU VOWEL SIGN AA
+0C3F TELUGU VOWEL SIGN I
+0C40 TELUGU VOWEL SIGN II
+0C41 TELUGU VOWEL SIGN U
+0C42 TELUGU VOWEL SIGN UU
+0C43 TELUGU VOWEL SIGN VOCALIC R
+0C44 TELUGU VOWEL SIGN VOCALIC RR
+0C46 TELUGU VOWEL SIGN E
+0C47 TELUGU VOWEL SIGN EE
+0C48 TELUGU VOWEL SIGN AI
+0C4A TELUGU VOWEL SIGN O
+0C4B TELUGU VOWEL SIGN OO
+0C4C TELUGU VOWEL SIGN AU
+0C4D TELUGU SIGN VIRAMA
+0C55 TELUGU LENGTH MARK
+0C56 TELUGU AI LENGTH MARK
+0C58 TELUGU LETTER TSA
+0C59 TELUGU LETTER DZA
+0C60 TELUGU LETTER VOCALIC RR
+0C61 TELUGU LETTER VOCALIC LL
+0C62 TELUGU VOWEL SIGN VOCALIC L
+0C63 TELUGU VOWEL SIGN VOCALIC LL
+0C66 TELUGU DIGIT ZERO
+0C67 TELUGU DIGIT ONE
+0C68 TELUGU DIGIT TWO
+0C69 TELUGU DIGIT THREE
+0C6A TELUGU DIGIT FOUR
+0C6B TELUGU DIGIT FIVE
+0C6C TELUGU DIGIT SIX
+0C6D TELUGU DIGIT SEVEN
+0C6E TELUGU DIGIT EIGHT
+0C6F TELUGU DIGIT NINE
+0C78 TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR
+0C79 TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR
+0C7A TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR
+0C7B TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR
+0C7C TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR
+0C7D TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR
+0C7E TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
+0C7F TELUGU SIGN TUUMU
+0C82 KANNADA SIGN ANUSVARA
+0C83 KANNADA SIGN VISARGA
+0C85 KANNADA LETTER A
+0C86 KANNADA LETTER AA
+0C87 KANNADA LETTER I
+0C88 KANNADA LETTER II
+0C89 KANNADA LETTER U
+0C8A KANNADA LETTER UU
+0C8B KANNADA LETTER VOCALIC R
+0C8C KANNADA LETTER VOCALIC L
+0C8E KANNADA LETTER E
+0C8F KANNADA LETTER EE
+0C90 KANNADA LETTER AI
+0C92 KANNADA LETTER O
+0C93 KANNADA LETTER OO
+0C94 KANNADA LETTER AU
+0C95 KANNADA LETTER KA
+0C96 KANNADA LETTER KHA
+0C97 KANNADA LETTER GA
+0C98 KANNADA LETTER GHA
+0C99 KANNADA LETTER NGA
+0C9A KANNADA LETTER CA
+0C9B KANNADA LETTER CHA
+0C9C KANNADA LETTER JA
+0C9D KANNADA LETTER JHA
+0C9E KANNADA LETTER NYA
+0C9F KANNADA LETTER TTA
+0CA0 KANNADA LETTER TTHA
+0CA1 KANNADA LETTER DDA
+0CA2 KANNADA LETTER DDHA
+0CA3 KANNADA LETTER NNA
+0CA4 KANNADA LETTER TA
+0CA5 KANNADA LETTER THA
+0CA6 KANNADA LETTER DA
+0CA7 KANNADA LETTER DHA
+0CA8 KANNADA LETTER NA
+0CAA KANNADA LETTER PA
+0CAB KANNADA LETTER PHA
+0CAC KANNADA LETTER BA
+0CAD KANNADA LETTER BHA
+0CAE KANNADA LETTER MA
+0CAF KANNADA LETTER YA
+0CB0 KANNADA LETTER RA
+0CB1 KANNADA LETTER RRA
+0CB2 KANNADA LETTER LA
+0CB3 KANNADA LETTER LLA
+0CB5 KANNADA LETTER VA
+0CB6 KANNADA LETTER SHA
+0CB7 KANNADA LETTER SSA
+0CB8 KANNADA LETTER SA
+0CB9 KANNADA LETTER HA
+0CBC KANNADA SIGN NUKTA
+0CBD KANNADA SIGN AVAGRAHA
+0CBE KANNADA VOWEL SIGN AA
+0CBF KANNADA VOWEL SIGN I
+0CC0 KANNADA VOWEL SIGN II
+0CC1 KANNADA VOWEL SIGN U
+0CC2 KANNADA VOWEL SIGN UU
+0CC3 KANNADA VOWEL SIGN VOCALIC R
+0CC4 KANNADA VOWEL SIGN VOCALIC RR
+0CC6 KANNADA VOWEL SIGN E
+0CC7 KANNADA VOWEL SIGN EE
+0CC8 KANNADA VOWEL SIGN AI
+0CCA KANNADA VOWEL SIGN O
+0CCB KANNADA VOWEL SIGN OO
+0CCC KANNADA VOWEL SIGN AU
+0CCD KANNADA SIGN VIRAMA
+0CD5 KANNADA LENGTH MARK
+0CD6 KANNADA AI LENGTH MARK
+0CDE KANNADA LETTER FA
+0CE0 KANNADA LETTER VOCALIC RR
+0CE1 KANNADA LETTER VOCALIC LL
+0CE2 KANNADA VOWEL SIGN VOCALIC L
+0CE3 KANNADA VOWEL SIGN VOCALIC LL
+0CE6 KANNADA DIGIT ZERO
+0CE7 KANNADA DIGIT ONE
+0CE8 KANNADA DIGIT TWO
+0CE9 KANNADA DIGIT THREE
+0CEA KANNADA DIGIT FOUR
+0CEB KANNADA DIGIT FIVE
+0CEC KANNADA DIGIT SIX
+0CED KANNADA DIGIT SEVEN
+0CEE KANNADA DIGIT EIGHT
+0CEF KANNADA DIGIT NINE
+0CF1 KANNADA SIGN JIHVAMULIYA
+0CF2 KANNADA SIGN UPADHMANIYA
+0D02 MALAYALAM SIGN ANUSVARA
+0D03 MALAYALAM SIGN VISARGA
+0D05 MALAYALAM LETTER A
+0D06 MALAYALAM LETTER AA
+0D07 MALAYALAM LETTER I
+0D08 MALAYALAM LETTER II
+0D09 MALAYALAM LETTER U
+0D0A MALAYALAM LETTER UU
+0D0B MALAYALAM LETTER VOCALIC R
+0D0C MALAYALAM LETTER VOCALIC L
+0D0E MALAYALAM LETTER E
+0D0F MALAYALAM LETTER EE
+0D10 MALAYALAM LETTER AI
+0D12 MALAYALAM LETTER O
+0D13 MALAYALAM LETTER OO
+0D14 MALAYALAM LETTER AU
+0D15 MALAYALAM LETTER KA
+0D16 MALAYALAM LETTER KHA
+0D17 MALAYALAM LETTER GA
+0D18 MALAYALAM LETTER GHA
+0D19 MALAYALAM LETTER NGA
+0D1A MALAYALAM LETTER CA
+0D1B MALAYALAM LETTER CHA
+0D1C MALAYALAM LETTER JA
+0D1D MALAYALAM LETTER JHA
+0D1E MALAYALAM LETTER NYA
+0D1F MALAYALAM LETTER TTA
+0D20 MALAYALAM LETTER TTHA
+0D21 MALAYALAM LETTER DDA
+0D22 MALAYALAM LETTER DDHA
+0D23 MALAYALAM LETTER NNA
+0D24 MALAYALAM LETTER TA
+0D25 MALAYALAM LETTER THA
+0D26 MALAYALAM LETTER DA
+0D27 MALAYALAM LETTER DHA
+0D28 MALAYALAM LETTER NA
+0D2A MALAYALAM LETTER PA
+0D2B MALAYALAM LETTER PHA
+0D2C MALAYALAM LETTER BA
+0D2D MALAYALAM LETTER BHA
+0D2E MALAYALAM LETTER MA
+0D2F MALAYALAM LETTER YA
+0D30 MALAYALAM LETTER RA
+0D31 MALAYALAM LETTER RRA
+0D32 MALAYALAM LETTER LA
+0D33 MALAYALAM LETTER LLA
+0D34 MALAYALAM LETTER LLLA
+0D35 MALAYALAM LETTER VA
+0D36 MALAYALAM LETTER SHA
+0D37 MALAYALAM LETTER SSA
+0D38 MALAYALAM LETTER SA
+0D39 MALAYALAM LETTER HA
+0D3D MALAYALAM SIGN AVAGRAHA
+0D3E MALAYALAM VOWEL SIGN AA
+0D3F MALAYALAM VOWEL SIGN I
+0D40 MALAYALAM VOWEL SIGN II
+0D41 MALAYALAM VOWEL SIGN U
+0D42 MALAYALAM VOWEL SIGN UU
+0D43 MALAYALAM VOWEL SIGN VOCALIC R
+0D44 MALAYALAM VOWEL SIGN VOCALIC RR
+0D46 MALAYALAM VOWEL SIGN E
+0D47 MALAYALAM VOWEL SIGN EE
+0D48 MALAYALAM VOWEL SIGN AI
+0D4A MALAYALAM VOWEL SIGN O
+0D4B MALAYALAM VOWEL SIGN OO
+0D4C MALAYALAM VOWEL SIGN AU
+0D4D MALAYALAM SIGN VIRAMA
+0D57 MALAYALAM AU LENGTH MARK
+0D60 MALAYALAM LETTER VOCALIC RR
+0D61 MALAYALAM LETTER VOCALIC LL
+0D62 MALAYALAM VOWEL SIGN VOCALIC L
+0D63 MALAYALAM VOWEL SIGN VOCALIC LL
+0D66 MALAYALAM DIGIT ZERO
+0D67 MALAYALAM DIGIT ONE
+0D68 MALAYALAM DIGIT TWO
+0D69 MALAYALAM DIGIT THREE
+0D6A MALAYALAM DIGIT FOUR
+0D6B MALAYALAM DIGIT FIVE
+0D6C MALAYALAM DIGIT SIX
+0D6D MALAYALAM DIGIT SEVEN
+0D6E MALAYALAM DIGIT EIGHT
+0D6F MALAYALAM DIGIT NINE
+0D70 MALAYALAM NUMBER TEN
+0D71 MALAYALAM NUMBER ONE HUNDRED
+0D72 MALAYALAM NUMBER ONE THOUSAND
+0D73 MALAYALAM FRACTION ONE QUARTER
+0D74 MALAYALAM FRACTION ONE HALF
+0D75 MALAYALAM FRACTION THREE QUARTERS
+0D79 MALAYALAM DATE MARK
+0D7A MALAYALAM LETTER CHILLU NN
+0D7B MALAYALAM LETTER CHILLU N
+0D7C MALAYALAM LETTER CHILLU RR
+0D7D MALAYALAM LETTER CHILLU L
+0D7E MALAYALAM LETTER CHILLU LL
+0D7F MALAYALAM LETTER CHILLU K
+0D82 SINHALA SIGN ANUSVARAYA
+0D83 SINHALA SIGN VISARGAYA
+0D85 SINHALA LETTER AYANNA
+0D86 SINHALA LETTER AAYANNA
+0D87 SINHALA LETTER AEYANNA
+0D88 SINHALA LETTER AEEYANNA
+0D89 SINHALA LETTER IYANNA
+0D8A SINHALA LETTER IIYANNA
+0D8B SINHALA LETTER UYANNA
+0D8C SINHALA LETTER UUYANNA
+0D8D SINHALA LETTER IRUYANNA
+0D8E SINHALA LETTER IRUUYANNA
+0D8F SINHALA LETTER ILUYANNA
+0D90 SINHALA LETTER ILUUYANNA
+0D91 SINHALA LETTER EYANNA
+0D92 SINHALA LETTER EEYANNA
+0D93 SINHALA LETTER AIYANNA
+0D94 SINHALA LETTER OYANNA
+0D95 SINHALA LETTER OOYANNA
+0D96 SINHALA LETTER AUYANNA
+0D9A SINHALA LETTER ALPAPRAANA KAYANNA
+0D9B SINHALA LETTER MAHAAPRAANA KAYANNA
+0D9C SINHALA LETTER ALPAPRAANA GAYANNA
+0D9D SINHALA LETTER MAHAAPRAANA GAYANNA
+0D9E SINHALA LETTER KANTAJA NAASIKYAYA
+0D9F SINHALA LETTER SANYAKA GAYANNA
+0DA0 SINHALA LETTER ALPAPRAANA CAYANNA
+0DA1 SINHALA LETTER MAHAAPRAANA CAYANNA
+0DA2 SINHALA LETTER ALPAPRAANA JAYANNA
+0DA3 SINHALA LETTER MAHAAPRAANA JAYANNA
+0DA4 SINHALA LETTER TAALUJA NAASIKYAYA
+0DA5 SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6 SINHALA LETTER SANYAKA JAYANNA
+0DA7 SINHALA LETTER ALPAPRAANA TTAYANNA
+0DA8 SINHALA LETTER MAHAAPRAANA TTAYANNA
+0DA9 SINHALA LETTER ALPAPRAANA DDAYANNA
+0DAA SINHALA LETTER MAHAAPRAANA DDAYANNA
+0DAB SINHALA LETTER MUURDHAJA NAYANNA
+0DAC SINHALA LETTER SANYAKA DDAYANNA
+0DAD SINHALA LETTER ALPAPRAANA TAYANNA
+0DAE SINHALA LETTER MAHAAPRAANA TAYANNA
+0DAF SINHALA LETTER ALPAPRAANA DAYANNA
+0DB0 SINHALA LETTER MAHAAPRAANA DAYANNA
+0DB1 SINHALA LETTER DANTAJA NAYANNA
+0DB3 SINHALA LETTER SANYAKA DAYANNA
+0DB4 SINHALA LETTER ALPAPRAANA PAYANNA
+0DB5 SINHALA LETTER MAHAAPRAANA PAYANNA
+0DB6 SINHALA LETTER ALPAPRAANA BAYANNA
+0DB7 SINHALA LETTER MAHAAPRAANA BAYANNA
+0DB8 SINHALA LETTER MAYANNA
+0DB9 SINHALA LETTER AMBA BAYANNA
+0DBA SINHALA LETTER YAYANNA
+0DBB SINHALA LETTER RAYANNA
+0DBD SINHALA LETTER DANTAJA LAYANNA
+0DC0 SINHALA LETTER VAYANNA
+0DC1 SINHALA LETTER TAALUJA SAYANNA
+0DC2 SINHALA LETTER MUURDHAJA SAYANNA
+0DC3 SINHALA LETTER DANTAJA SAYANNA
+0DC4 SINHALA LETTER HAYANNA
+0DC5 SINHALA LETTER MUURDHAJA LAYANNA
+0DC6 SINHALA LETTER FAYANNA
+0DCA SINHALA SIGN AL-LAKUNA
+0DCF SINHALA VOWEL SIGN AELA-PILLA
+0DD0 SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0DD1 SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2 SINHALA VOWEL SIGN KETTI IS-PILLA
+0DD3 SINHALA VOWEL SIGN DIGA IS-PILLA
+0DD4 SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8 SINHALA VOWEL SIGN GAETTA-PILLA
+0DD9 SINHALA VOWEL SIGN KOMBUVA
+0DDA SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDB SINHALA VOWEL SIGN KOMBU DEKA
+0DDC SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DDD SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDE SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DDF SINHALA VOWEL SIGN GAYANUKITTA
+0DF2 SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0DF3 SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4 SINHALA PUNCTUATION KUNDDALIYA
+0E01 THAI CHARACTER KO KAI
+0E02 THAI CHARACTER KHO KHAI
+0E03 THAI CHARACTER KHO KHUAT
+0E04 THAI CHARACTER KHO KHWAI
+0E05 THAI CHARACTER KHO KHON
+0E06 THAI CHARACTER KHO RAKHANG
+0E07 THAI CHARACTER NGO NGU
+0E08 THAI CHARACTER CHO CHAN
+0E09 THAI CHARACTER CHO CHING
+0E0A THAI CHARACTER CHO CHANG
+0E0B THAI CHARACTER SO SO
+0E0C THAI CHARACTER CHO CHOE
+0E0D THAI CHARACTER YO YING
+0E0E THAI CHARACTER DO CHADA
+0E0F THAI CHARACTER TO PATAK
+0E10 THAI CHARACTER THO THAN
+0E11 THAI CHARACTER THO NANGMONTHO
+0E12 THAI CHARACTER THO PHUTHAO
+0E13 THAI CHARACTER NO NEN
+0E14 THAI CHARACTER DO DEK
+0E15 THAI CHARACTER TO TAO
+0E16 THAI CHARACTER THO THUNG
+0E17 THAI CHARACTER THO THAHAN
+0E18 THAI CHARACTER THO THONG
+0E19 THAI CHARACTER NO NU
+0E1A THAI CHARACTER BO BAIMAI
+0E1B THAI CHARACTER PO PLA
+0E1C THAI CHARACTER PHO PHUNG
+0E1D THAI CHARACTER FO FA
+0E1E THAI CHARACTER PHO PHAN
+0E1F THAI CHARACTER FO FAN
+0E20 THAI CHARACTER PHO SAMPHAO
+0E21 THAI CHARACTER MO MA
+0E22 THAI CHARACTER YO YAK
+0E23 THAI CHARACTER RO RUA
+0E24 THAI CHARACTER RU
+0E25 THAI CHARACTER LO LING
+0E26 THAI CHARACTER LU
+0E27 THAI CHARACTER WO WAEN
+0E28 THAI CHARACTER SO SALA
+0E29 THAI CHARACTER SO RUSI
+0E2A THAI CHARACTER SO SUA
+0E2B THAI CHARACTER HO HIP
+0E2C THAI CHARACTER LO CHULA
+0E2D THAI CHARACTER O ANG
+0E2E THAI CHARACTER HO NOKHUK
+0E2F THAI CHARACTER PAIYANNOI
+0E30 THAI CHARACTER SARA A
+0E31 THAI CHARACTER MAI HAN-AKAT
+0E32 THAI CHARACTER SARA AA
+0E33 THAI CHARACTER SARA AM
+0E34 THAI CHARACTER SARA I
+0E35 THAI CHARACTER SARA II
+0E36 THAI CHARACTER SARA UE
+0E37 THAI CHARACTER SARA UEE
+0E38 THAI CHARACTER SARA U
+0E39 THAI CHARACTER SARA UU
+0E3A THAI CHARACTER PHINTHU
+0E3F THAI CURRENCY SYMBOL BAHT
+0E40 THAI CHARACTER SARA E
+0E41 THAI CHARACTER SARA AE
+0E42 THAI CHARACTER SARA O
+0E43 THAI CHARACTER SARA AI MAIMUAN
+0E44 THAI CHARACTER SARA AI MAIMALAI
+0E45 THAI CHARACTER LAKKHANGYAO
+0E46 THAI CHARACTER MAIYAMOK
+0E47 THAI CHARACTER MAITAIKHU
+0E48 THAI CHARACTER MAI EK
+0E49 THAI CHARACTER MAI THO
+0E4A THAI CHARACTER MAI TRI
+0E4B THAI CHARACTER MAI CHATTAWA
+0E4C THAI CHARACTER THANTHAKHAT
+0E4D THAI CHARACTER NIKHAHIT
+0E4E THAI CHARACTER YAMAKKAN
+0E4F THAI CHARACTER FONGMAN
+0E50 THAI DIGIT ZERO
+0E51 THAI DIGIT ONE
+0E52 THAI DIGIT TWO
+0E53 THAI DIGIT THREE
+0E54 THAI DIGIT FOUR
+0E55 THAI DIGIT FIVE
+0E56 THAI DIGIT SIX
+0E57 THAI DIGIT SEVEN
+0E58 THAI DIGIT EIGHT
+0E59 THAI DIGIT NINE
+0E5A THAI CHARACTER ANGKHANKHU
+0E5B THAI CHARACTER KHOMUT
+0E81 LAO LETTER KO
+0E82 LAO LETTER KHO SUNG
+0E84 LAO LETTER KHO TAM
+0E87 LAO LETTER NGO
+0E88 LAO LETTER CO
+0E8A LAO LETTER SO TAM
+0E8D LAO LETTER NYO
+0E94 LAO LETTER DO
+0E95 LAO LETTER TO
+0E96 LAO LETTER THO SUNG
+0E97 LAO LETTER THO TAM
+0E99 LAO LETTER NO
+0E9A LAO LETTER BO
+0E9B LAO LETTER PO
+0E9C LAO LETTER PHO SUNG
+0E9D LAO LETTER FO TAM
+0E9E LAO LETTER PHO TAM
+0E9F LAO LETTER FO SUNG
+0EA1 LAO LETTER MO
+0EA2 LAO LETTER YO
+0EA3 LAO LETTER LO LING
+0EA5 LAO LETTER LO LOOT
+0EA7 LAO LETTER WO
+0EAA LAO LETTER SO SUNG
+0EAB LAO LETTER HO SUNG
+0EAD LAO LETTER O
+0EAE LAO LETTER HO TAM
+0EAF LAO ELLIPSIS
+0EB0 LAO VOWEL SIGN A
+0EB1 LAO VOWEL SIGN MAI KAN
+0EB2 LAO VOWEL SIGN AA
+0EB3 LAO VOWEL SIGN AM
+0EB4 LAO VOWEL SIGN I
+0EB5 LAO VOWEL SIGN II
+0EB6 LAO VOWEL SIGN Y
+0EB7 LAO VOWEL SIGN YY
+0EB8 LAO VOWEL SIGN U
+0EB9 LAO VOWEL SIGN UU
+0EBB LAO VOWEL SIGN MAI KON
+0EBC LAO SEMIVOWEL SIGN LO
+0EBD LAO SEMIVOWEL SIGN NYO
+0EC0 LAO VOWEL SIGN E
+0EC1 LAO VOWEL SIGN EI
+0EC2 LAO VOWEL SIGN O
+0EC3 LAO VOWEL SIGN AY
+0EC4 LAO VOWEL SIGN AI
+0EC6 LAO KO LA
+0EC8 LAO TONE MAI EK
+0EC9 LAO TONE MAI THO
+0ECA LAO TONE MAI TI
+0ECB LAO TONE MAI CATAWA
+0ECC LAO CANCELLATION MARK
+0ECD LAO NIGGAHITA
+0ED0 LAO DIGIT ZERO
+0ED1 LAO DIGIT ONE
+0ED2 LAO DIGIT TWO
+0ED3 LAO DIGIT THREE
+0ED4 LAO DIGIT FOUR
+0ED5 LAO DIGIT FIVE
+0ED6 LAO DIGIT SIX
+0ED7 LAO DIGIT SEVEN
+0ED8 LAO DIGIT EIGHT
+0ED9 LAO DIGIT NINE
+0EDC LAO HO NO
+0EDD LAO HO MO
+0F00 TIBETAN SYLLABLE OM
+0F01 TIBETAN MARK GTER YIG MGO TRUNCATED A
+0F02 TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0F03 TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04 TIBETAN MARK INITIAL YIG MGO MDUN MA
+0F05 TIBETAN MARK CLOSING YIG MGO SGAB MA
+0F06 TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0F07 TIBETAN MARK YIG MGO TSHEG SHAD MA
+0F08 TIBETAN MARK SBRUL SHAD
+0F09 TIBETAN MARK BSKUR YIG MGO
+0F0A TIBETAN MARK BKA- SHOG YIG MGO
+0F0B TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C TIBETAN MARK DELIMITER TSHEG BSTAR
+0F0D TIBETAN MARK SHAD
+0F0E TIBETAN MARK NYIS SHAD
+0F0F TIBETAN MARK TSHEG SHAD
+0F10 TIBETAN MARK NYIS TSHEG SHAD
+0F11 TIBETAN MARK RIN CHEN SPUNGS SHAD
+0F12 TIBETAN MARK RGYA GRAM SHAD
+0F13 TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14 TIBETAN MARK GTER TSHEG
+0F15 TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0F16 TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0F17 TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18 TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0F19 TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A TIBETAN SIGN RDEL DKAR GCIG
+0F1B TIBETAN SIGN RDEL DKAR GNYIS
+0F1C TIBETAN SIGN RDEL DKAR GSUM
+0F1D TIBETAN SIGN RDEL NAG GCIG
+0F1E TIBETAN SIGN RDEL NAG GNYIS
+0F1F TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20 TIBETAN DIGIT ZERO
+0F21 TIBETAN DIGIT ONE
+0F22 TIBETAN DIGIT TWO
+0F23 TIBETAN DIGIT THREE
+0F24 TIBETAN DIGIT FOUR
+0F25 TIBETAN DIGIT FIVE
+0F26 TIBETAN DIGIT SIX
+0F27 TIBETAN DIGIT SEVEN
+0F28 TIBETAN DIGIT EIGHT
+0F29 TIBETAN DIGIT NINE
+0F2A TIBETAN DIGIT HALF ONE
+0F2B TIBETAN DIGIT HALF TWO
+0F2C TIBETAN DIGIT HALF THREE
+0F2D TIBETAN DIGIT HALF FOUR
+0F2E TIBETAN DIGIT HALF FIVE
+0F2F TIBETAN DIGIT HALF SIX
+0F30 TIBETAN DIGIT HALF SEVEN
+0F31 TIBETAN DIGIT HALF EIGHT
+0F32 TIBETAN DIGIT HALF NINE
+0F33 TIBETAN DIGIT HALF ZERO
+0F34 TIBETAN MARK BSDUS RTAGS
+0F35 TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36 TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37 TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38 TIBETAN MARK CHE MGO
+0F39 TIBETAN MARK TSA -PHRU
+0F3A TIBETAN MARK GUG RTAGS GYON
+0F3B TIBETAN MARK GUG RTAGS GYAS
+0F3C TIBETAN MARK ANG KHANG GYON
+0F3D TIBETAN MARK ANG KHANG GYAS
+0F3E TIBETAN SIGN YAR TSHES
+0F3F TIBETAN SIGN MAR TSHES
+0F40 TIBETAN LETTER KA
+0F41 TIBETAN LETTER KHA
+0F42 TIBETAN LETTER GA
+0F43 TIBETAN LETTER GHA
+0F44 TIBETAN LETTER NGA
+0F45 TIBETAN LETTER CA
+0F46 TIBETAN LETTER CHA
+0F47 TIBETAN LETTER JA
+0F49 TIBETAN LETTER NYA
+0F4A TIBETAN LETTER TTA
+0F4B TIBETAN LETTER TTHA
+0F4C TIBETAN LETTER DDA
+0F4D TIBETAN LETTER DDHA
+0F4E TIBETAN LETTER NNA
+0F4F TIBETAN LETTER TA
+0F50 TIBETAN LETTER THA
+0F51 TIBETAN LETTER DA
+0F52 TIBETAN LETTER DHA
+0F53 TIBETAN LETTER NA
+0F54 TIBETAN LETTER PA
+0F55 TIBETAN LETTER PHA
+0F56 TIBETAN LETTER BA
+0F57 TIBETAN LETTER BHA
+0F58 TIBETAN LETTER MA
+0F59 TIBETAN LETTER TSA
+0F5A TIBETAN LETTER TSHA
+0F5B TIBETAN LETTER DZA
+0F5C TIBETAN LETTER DZHA
+0F5D TIBETAN LETTER WA
+0F5E TIBETAN LETTER ZHA
+0F5F TIBETAN LETTER ZA
+0F60 TIBETAN LETTER -A
+0F61 TIBETAN LETTER YA
+0F62 TIBETAN LETTER RA
+0F63 TIBETAN LETTER LA
+0F64 TIBETAN LETTER SHA
+0F65 TIBETAN LETTER SSA
+0F66 TIBETAN LETTER SA
+0F67 TIBETAN LETTER HA
+0F68 TIBETAN LETTER A
+0F69 TIBETAN LETTER KSSA
+0F6A TIBETAN LETTER FIXED-FORM RA
+0F6B TIBETAN LETTER KKA
+0F6C TIBETAN LETTER RRA
+0F71 TIBETAN VOWEL SIGN AA
+0F72 TIBETAN VOWEL SIGN I
+0F73 TIBETAN VOWEL SIGN II
+0F74 TIBETAN VOWEL SIGN U
+0F75 TIBETAN VOWEL SIGN UU
+0F76 TIBETAN VOWEL SIGN VOCALIC R
+0F77 TIBETAN VOWEL SIGN VOCALIC RR
+0F78 TIBETAN VOWEL SIGN VOCALIC L
+0F79 TIBETAN VOWEL SIGN VOCALIC LL
+0F7A TIBETAN VOWEL SIGN E
+0F7B TIBETAN VOWEL SIGN EE
+0F7C TIBETAN VOWEL SIGN O
+0F7D TIBETAN VOWEL SIGN OO
+0F7E TIBETAN SIGN RJES SU NGA RO
+0F7F TIBETAN SIGN RNAM BCAD
+0F80 TIBETAN VOWEL SIGN REVERSED I
+0F81 TIBETAN VOWEL SIGN REVERSED II
+0F82 TIBETAN SIGN NYI ZLA NAA DA
+0F83 TIBETAN SIGN SNA LDAN
+0F84 TIBETAN MARK HALANTA
+0F85 TIBETAN MARK PALUTA
+0F86 TIBETAN SIGN LCI RTAGS
+0F87 TIBETAN SIGN YANG RTAGS
+0F88 TIBETAN SIGN LCE TSA CAN
+0F89 TIBETAN SIGN MCHU CAN
+0F8A TIBETAN SIGN GRU CAN RGYINGS
+0F8B TIBETAN SIGN GRU MED RGYINGS
+0F90 TIBETAN SUBJOINED LETTER KA
+0F91 TIBETAN SUBJOINED LETTER KHA
+0F92 TIBETAN SUBJOINED LETTER GA
+0F93 TIBETAN SUBJOINED LETTER GHA
+0F94 TIBETAN SUBJOINED LETTER NGA
+0F95 TIBETAN SUBJOINED LETTER CA
+0F96 TIBETAN SUBJOINED LETTER CHA
+0F97 TIBETAN SUBJOINED LETTER JA
+0F99 TIBETAN SUBJOINED LETTER NYA
+0F9A TIBETAN SUBJOINED LETTER TTA
+0F9B TIBETAN SUBJOINED LETTER TTHA
+0F9C TIBETAN SUBJOINED LETTER DDA
+0F9D TIBETAN SUBJOINED LETTER DDHA
+0F9E TIBETAN SUBJOINED LETTER NNA
+0F9F TIBETAN SUBJOINED LETTER TA
+0FA0 TIBETAN SUBJOINED LETTER THA
+0FA1 TIBETAN SUBJOINED LETTER DA
+0FA2 TIBETAN SUBJOINED LETTER DHA
+0FA3 TIBETAN SUBJOINED LETTER NA
+0FA4 TIBETAN SUBJOINED LETTER PA
+0FA5 TIBETAN SUBJOINED LETTER PHA
+0FA6 TIBETAN SUBJOINED LETTER BA
+0FA7 TIBETAN SUBJOINED LETTER BHA
+0FA8 TIBETAN SUBJOINED LETTER MA
+0FA9 TIBETAN SUBJOINED LETTER TSA
+0FAA TIBETAN SUBJOINED LETTER TSHA
+0FAB TIBETAN SUBJOINED LETTER DZA
+0FAC TIBETAN SUBJOINED LETTER DZHA
+0FAD TIBETAN SUBJOINED LETTER WA
+0FAE TIBETAN SUBJOINED LETTER ZHA
+0FAF TIBETAN SUBJOINED LETTER ZA
+0FB0 TIBETAN SUBJOINED LETTER -A
+0FB1 TIBETAN SUBJOINED LETTER YA
+0FB2 TIBETAN SUBJOINED LETTER RA
+0FB3 TIBETAN SUBJOINED LETTER LA
+0FB4 TIBETAN SUBJOINED LETTER SHA
+0FB5 TIBETAN SUBJOINED LETTER SSA
+0FB6 TIBETAN SUBJOINED LETTER SA
+0FB7 TIBETAN SUBJOINED LETTER HA
+0FB8 TIBETAN SUBJOINED LETTER A
+0FB9 TIBETAN SUBJOINED LETTER KSSA
+0FBA TIBETAN SUBJOINED LETTER FIXED-FORM WA
+0FBB TIBETAN SUBJOINED LETTER FIXED-FORM YA
+0FBC TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE TIBETAN KU RU KHA
+0FBF TIBETAN KU RU KHA BZHI MIG CAN
+0FC0 TIBETAN CANTILLATION SIGN HEAVY BEAT
+0FC1 TIBETAN CANTILLATION SIGN LIGHT BEAT
+0FC2 TIBETAN CANTILLATION SIGN CANG TE-U
+0FC3 TIBETAN CANTILLATION SIGN SBUB -CHAL
+0FC4 TIBETAN SYMBOL DRIL BU
+0FC5 TIBETAN SYMBOL RDO RJE
+0FC6 TIBETAN SYMBOL PADMA GDAN
+0FC7 TIBETAN SYMBOL RDO RJE RGYA GRAM
+0FC8 TIBETAN SYMBOL PHUR PA
+0FC9 TIBETAN SYMBOL NOR BU
+0FCA TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0FCB TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0FCC TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCE TIBETAN SIGN RDEL NAG RDEL DKAR
+0FCF TIBETAN SIGN RDEL NAG GSUM
+0FD0 TIBETAN MARK BSKA- SHOG GI MGO RGYAN
+0FD1 TIBETAN MARK MNYAM YIG GI MGO RGYAN
+0FD2 TIBETAN MARK NYIS TSHEG
+0FD3 TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA
+0FD4 TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA
+1000 MYANMAR LETTER KA
+1001 MYANMAR LETTER KHA
+1002 MYANMAR LETTER GA
+1003 MYANMAR LETTER GHA
+1004 MYANMAR LETTER NGA
+1005 MYANMAR LETTER CA
+1006 MYANMAR LETTER CHA
+1007 MYANMAR LETTER JA
+1008 MYANMAR LETTER JHA
+1009 MYANMAR LETTER NYA
+100A MYANMAR LETTER NNYA
+100B MYANMAR LETTER TTA
+100C MYANMAR LETTER TTHA
+100D MYANMAR LETTER DDA
+100E MYANMAR LETTER DDHA
+100F MYANMAR LETTER NNA
+1010 MYANMAR LETTER TA
+1011 MYANMAR LETTER THA
+1012 MYANMAR LETTER DA
+1013 MYANMAR LETTER DHA
+1014 MYANMAR LETTER NA
+1015 MYANMAR LETTER PA
+1016 MYANMAR LETTER PHA
+1017 MYANMAR LETTER BA
+1018 MYANMAR LETTER BHA
+1019 MYANMAR LETTER MA
+101A MYANMAR LETTER YA
+101B MYANMAR LETTER RA
+101C MYANMAR LETTER LA
+101D MYANMAR LETTER WA
+101E MYANMAR LETTER SA
+101F MYANMAR LETTER HA
+1020 MYANMAR LETTER LLA
+1021 MYANMAR LETTER A
+1022 MYANMAR LETTER SHAN A
+1023 MYANMAR LETTER I
+1024 MYANMAR LETTER II
+1025 MYANMAR LETTER U
+1026 MYANMAR LETTER UU
+1027 MYANMAR LETTER E
+1028 MYANMAR LETTER MON E
+1029 MYANMAR LETTER O
+102A MYANMAR LETTER AU
+102B MYANMAR VOWEL SIGN TALL AA
+102C MYANMAR VOWEL SIGN AA
+102D MYANMAR VOWEL SIGN I
+102E MYANMAR VOWEL SIGN II
+102F MYANMAR VOWEL SIGN U
+1030 MYANMAR VOWEL SIGN UU
+1031 MYANMAR VOWEL SIGN E
+1032 MYANMAR VOWEL SIGN AI
+1033 MYANMAR VOWEL SIGN MON II
+1034 MYANMAR VOWEL SIGN MON O
+1035 MYANMAR VOWEL SIGN E ABOVE
+1036 MYANMAR SIGN ANUSVARA
+1037 MYANMAR SIGN DOT BELOW
+1038 MYANMAR SIGN VISARGA
+1039 MYANMAR SIGN VIRAMA
+103A MYANMAR SIGN ASAT
+103B MYANMAR CONSONANT SIGN MEDIAL YA
+103C MYANMAR CONSONANT SIGN MEDIAL RA
+103D MYANMAR CONSONANT SIGN MEDIAL WA
+103E MYANMAR CONSONANT SIGN MEDIAL HA
+103F MYANMAR LETTER GREAT SA
+1040 MYANMAR DIGIT ZERO
+1041 MYANMAR DIGIT ONE
+1042 MYANMAR DIGIT TWO
+1043 MYANMAR DIGIT THREE
+1044 MYANMAR DIGIT FOUR
+1045 MYANMAR DIGIT FIVE
+1046 MYANMAR DIGIT SIX
+1047 MYANMAR DIGIT SEVEN
+1048 MYANMAR DIGIT EIGHT
+1049 MYANMAR DIGIT NINE
+104A MYANMAR SIGN LITTLE SECTION
+104B MYANMAR SIGN SECTION
+104C MYANMAR SYMBOL LOCATIVE
+104D MYANMAR SYMBOL COMPLETED
+104E MYANMAR SYMBOL AFOREMENTIONED
+104F MYANMAR SYMBOL GENITIVE
+1050 MYANMAR LETTER SHA
+1051 MYANMAR LETTER SSA
+1052 MYANMAR LETTER VOCALIC R
+1053 MYANMAR LETTER VOCALIC RR
+1054 MYANMAR LETTER VOCALIC L
+1055 MYANMAR LETTER VOCALIC LL
+1056 MYANMAR VOWEL SIGN VOCALIC R
+1057 MYANMAR VOWEL SIGN VOCALIC RR
+1058 MYANMAR VOWEL SIGN VOCALIC L
+1059 MYANMAR VOWEL SIGN VOCALIC LL
+105A MYANMAR LETTER MON NGA
+105B MYANMAR LETTER MON JHA
+105C MYANMAR LETTER MON BBA
+105D MYANMAR LETTER MON BBE
+105E MYANMAR CONSONANT SIGN MON MEDIAL NA
+105F MYANMAR CONSONANT SIGN MON MEDIAL MA
+1060 MYANMAR CONSONANT SIGN MON MEDIAL LA
+1061 MYANMAR LETTER SGAW KAREN SHA
+1062 MYANMAR VOWEL SIGN SGAW KAREN EU
+1063 MYANMAR TONE MARK SGAW KAREN HATHI
+1064 MYANMAR TONE MARK SGAW KAREN KE PHO
+1065 MYANMAR LETTER WESTERN PWO KAREN THA
+1066 MYANMAR LETTER WESTERN PWO KAREN PWA
+1067 MYANMAR VOWEL SIGN WESTERN PWO KAREN EU
+1068 MYANMAR VOWEL SIGN WESTERN PWO KAREN UE
+1069 MYANMAR SIGN WESTERN PWO KAREN TONE-1
+106A MYANMAR SIGN WESTERN PWO KAREN TONE-2
+106B MYANMAR SIGN WESTERN PWO KAREN TONE-3
+106C MYANMAR SIGN WESTERN PWO KAREN TONE-4
+106D MYANMAR SIGN WESTERN PWO KAREN TONE-5
+106E MYANMAR LETTER EASTERN PWO KAREN NNA
+106F MYANMAR LETTER EASTERN PWO KAREN YWA
+1070 MYANMAR LETTER EASTERN PWO KAREN GHWA
+1071 MYANMAR VOWEL SIGN GEBA KAREN I
+1072 MYANMAR VOWEL SIGN KAYAH OE
+1073 MYANMAR VOWEL SIGN KAYAH U
+1074 MYANMAR VOWEL SIGN KAYAH EE
+1075 MYANMAR LETTER SHAN KA
+1076 MYANMAR LETTER SHAN KHA
+1077 MYANMAR LETTER SHAN GA
+1078 MYANMAR LETTER SHAN CA
+1079 MYANMAR LETTER SHAN ZA
+107A MYANMAR LETTER SHAN NYA
+107B MYANMAR LETTER SHAN DA
+107C MYANMAR LETTER SHAN NA
+107D MYANMAR LETTER SHAN PHA
+107E MYANMAR LETTER SHAN FA
+107F MYANMAR LETTER SHAN BA
+1080 MYANMAR LETTER SHAN THA
+1081 MYANMAR LETTER SHAN HA
+1082 MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083 MYANMAR VOWEL SIGN SHAN AA
+1084 MYANMAR VOWEL SIGN SHAN E
+1085 MYANMAR VOWEL SIGN SHAN E ABOVE
+1086 MYANMAR VOWEL SIGN SHAN FINAL Y
+1087 MYANMAR SIGN SHAN TONE-2
+1088 MYANMAR SIGN SHAN TONE-3
+1089 MYANMAR SIGN SHAN TONE-5
+108A MYANMAR SIGN SHAN TONE-6
+108B MYANMAR SIGN SHAN COUNCIL TONE-2
+108C MYANMAR SIGN SHAN COUNCIL TONE-3
+108D MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+108E MYANMAR LETTER RUMAI PALAUNG FA
+108F MYANMAR SIGN RUMAI PALAUNG TONE-5
+1090 MYANMAR SHAN DIGIT ZERO
+1091 MYANMAR SHAN DIGIT ONE
+1092 MYANMAR SHAN DIGIT TWO
+1093 MYANMAR SHAN DIGIT THREE
+1094 MYANMAR SHAN DIGIT FOUR
+1095 MYANMAR SHAN DIGIT FIVE
+1096 MYANMAR SHAN DIGIT SIX
+1097 MYANMAR SHAN DIGIT SEVEN
+1098 MYANMAR SHAN DIGIT EIGHT
+1099 MYANMAR SHAN DIGIT NINE
+109E MYANMAR SYMBOL SHAN ONE
+109F MYANMAR SYMBOL SHAN EXCLAMATION
+10A0 GEORGIAN CAPITAL LETTER AN
+10A1 GEORGIAN CAPITAL LETTER BAN
+10A2 GEORGIAN CAPITAL LETTER GAN
+10A3 GEORGIAN CAPITAL LETTER DON
+10A4 GEORGIAN CAPITAL LETTER EN
+10A5 GEORGIAN CAPITAL LETTER VIN
+10A6 GEORGIAN CAPITAL LETTER ZEN
+10A7 GEORGIAN CAPITAL LETTER TAN
+10A8 GEORGIAN CAPITAL LETTER IN
+10A9 GEORGIAN CAPITAL LETTER KAN
+10AA GEORGIAN CAPITAL LETTER LAS
+10AB GEORGIAN CAPITAL LETTER MAN
+10AC GEORGIAN CAPITAL LETTER NAR
+10AD GEORGIAN CAPITAL LETTER ON
+10AE GEORGIAN CAPITAL LETTER PAR
+10AF GEORGIAN CAPITAL LETTER ZHAR
+10B0 GEORGIAN CAPITAL LETTER RAE
+10B1 GEORGIAN CAPITAL LETTER SAN
+10B2 GEORGIAN CAPITAL LETTER TAR
+10B3 GEORGIAN CAPITAL LETTER UN
+10B4 GEORGIAN CAPITAL LETTER PHAR
+10B5 GEORGIAN CAPITAL LETTER KHAR
+10B6 GEORGIAN CAPITAL LETTER GHAN
+10B7 GEORGIAN CAPITAL LETTER QAR
+10B8 GEORGIAN CAPITAL LETTER SHIN
+10B9 GEORGIAN CAPITAL LETTER CHIN
+10BA GEORGIAN CAPITAL LETTER CAN
+10BB GEORGIAN CAPITAL LETTER JIL
+10BC GEORGIAN CAPITAL LETTER CIL
+10BD GEORGIAN CAPITAL LETTER CHAR
+10BE GEORGIAN CAPITAL LETTER XAN
+10BF GEORGIAN CAPITAL LETTER JHAN
+10C0 GEORGIAN CAPITAL LETTER HAE
+10C1 GEORGIAN CAPITAL LETTER HE
+10C2 GEORGIAN CAPITAL LETTER HIE
+10C3 GEORGIAN CAPITAL LETTER WE
+10C4 GEORGIAN CAPITAL LETTER HAR
+10C5 GEORGIAN CAPITAL LETTER HOE
+10D0 GEORGIAN LETTER AN
+10D1 GEORGIAN LETTER BAN
+10D2 GEORGIAN LETTER GAN
+10D3 GEORGIAN LETTER DON
+10D4 GEORGIAN LETTER EN
+10D5 GEORGIAN LETTER VIN
+10D6 GEORGIAN LETTER ZEN
+10D7 GEORGIAN LETTER TAN
+10D8 GEORGIAN LETTER IN
+10D9 GEORGIAN LETTER KAN
+10DA GEORGIAN LETTER LAS
+10DB GEORGIAN LETTER MAN
+10DC GEORGIAN LETTER NAR
+10DD GEORGIAN LETTER ON
+10DE GEORGIAN LETTER PAR
+10DF GEORGIAN LETTER ZHAR
+10E0 GEORGIAN LETTER RAE
+10E1 GEORGIAN LETTER SAN
+10E2 GEORGIAN LETTER TAR
+10E3 GEORGIAN LETTER UN
+10E4 GEORGIAN LETTER PHAR
+10E5 GEORGIAN LETTER KHAR
+10E6 GEORGIAN LETTER GHAN
+10E7 GEORGIAN LETTER QAR
+10E8 GEORGIAN LETTER SHIN
+10E9 GEORGIAN LETTER CHIN
+10EA GEORGIAN LETTER CAN
+10EB GEORGIAN LETTER JIL
+10EC GEORGIAN LETTER CIL
+10ED GEORGIAN LETTER CHAR
+10EE GEORGIAN LETTER XAN
+10EF GEORGIAN LETTER JHAN
+10F0 GEORGIAN LETTER HAE
+10F1 GEORGIAN LETTER HE
+10F2 GEORGIAN LETTER HIE
+10F3 GEORGIAN LETTER WE
+10F4 GEORGIAN LETTER HAR
+10F5 GEORGIAN LETTER HOE
+10F6 GEORGIAN LETTER FI
+10F7 GEORGIAN LETTER YN
+10F8 GEORGIAN LETTER ELIFI
+10F9 GEORGIAN LETTER TURNED GAN
+10FA GEORGIAN LETTER AIN
+10FB GEORGIAN PARAGRAPH SEPARATOR
+10FC MODIFIER LETTER GEORGIAN NAR
+1100 HANGUL CHOSEONG KIYEOK
+1101 HANGUL CHOSEONG SSANGKIYEOK
+1102 HANGUL CHOSEONG NIEUN
+1103 HANGUL CHOSEONG TIKEUT
+1104 HANGUL CHOSEONG SSANGTIKEUT
+1105 HANGUL CHOSEONG RIEUL
+1106 HANGUL CHOSEONG MIEUM
+1107 HANGUL CHOSEONG PIEUP
+1108 HANGUL CHOSEONG SSANGPIEUP
+1109 HANGUL CHOSEONG SIOS
+110A HANGUL CHOSEONG SSANGSIOS
+110B HANGUL CHOSEONG IEUNG
+110C HANGUL CHOSEONG CIEUC
+110D HANGUL CHOSEONG SSANGCIEUC
+110E HANGUL CHOSEONG CHIEUCH
+110F HANGUL CHOSEONG KHIEUKH
+1110 HANGUL CHOSEONG THIEUTH
+1111 HANGUL CHOSEONG PHIEUPH
+1112 HANGUL CHOSEONG HIEUH
+1113 HANGUL CHOSEONG NIEUN-KIYEOK
+1114 HANGUL CHOSEONG SSANGNIEUN
+1115 HANGUL CHOSEONG NIEUN-TIKEUT
+1116 HANGUL CHOSEONG NIEUN-PIEUP
+1117 HANGUL CHOSEONG TIKEUT-KIYEOK
+1118 HANGUL CHOSEONG RIEUL-NIEUN
+1119 HANGUL CHOSEONG SSANGRIEUL
+111A HANGUL CHOSEONG RIEUL-HIEUH
+111B HANGUL CHOSEONG KAPYEOUNRIEUL
+111C HANGUL CHOSEONG MIEUM-PIEUP
+111D HANGUL CHOSEONG KAPYEOUNMIEUM
+111E HANGUL CHOSEONG PIEUP-KIYEOK
+111F HANGUL CHOSEONG PIEUP-NIEUN
+1120 HANGUL CHOSEONG PIEUP-TIKEUT
+1121 HANGUL CHOSEONG PIEUP-SIOS
+1122 HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123 HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124 HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125 HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126 HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127 HANGUL CHOSEONG PIEUP-CIEUC
+1128 HANGUL CHOSEONG PIEUP-CHIEUCH
+1129 HANGUL CHOSEONG PIEUP-THIEUTH
+112A HANGUL CHOSEONG PIEUP-PHIEUPH
+112B HANGUL CHOSEONG KAPYEOUNPIEUP
+112C HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D HANGUL CHOSEONG SIOS-KIYEOK
+112E HANGUL CHOSEONG SIOS-NIEUN
+112F HANGUL CHOSEONG SIOS-TIKEUT
+1130 HANGUL CHOSEONG SIOS-RIEUL
+1131 HANGUL CHOSEONG SIOS-MIEUM
+1132 HANGUL CHOSEONG SIOS-PIEUP
+1133 HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134 HANGUL CHOSEONG SIOS-SSANGSIOS
+1135 HANGUL CHOSEONG SIOS-IEUNG
+1136 HANGUL CHOSEONG SIOS-CIEUC
+1137 HANGUL CHOSEONG SIOS-CHIEUCH
+1138 HANGUL CHOSEONG SIOS-KHIEUKH
+1139 HANGUL CHOSEONG SIOS-THIEUTH
+113A HANGUL CHOSEONG SIOS-PHIEUPH
+113B HANGUL CHOSEONG SIOS-HIEUH
+113C HANGUL CHOSEONG CHITUEUMSIOS
+113D HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140 HANGUL CHOSEONG PANSIOS
+1141 HANGUL CHOSEONG IEUNG-KIYEOK
+1142 HANGUL CHOSEONG IEUNG-TIKEUT
+1143 HANGUL CHOSEONG IEUNG-MIEUM
+1144 HANGUL CHOSEONG IEUNG-PIEUP
+1145 HANGUL CHOSEONG IEUNG-SIOS
+1146 HANGUL CHOSEONG IEUNG-PANSIOS
+1147 HANGUL CHOSEONG SSANGIEUNG
+1148 HANGUL CHOSEONG IEUNG-CIEUC
+1149 HANGUL CHOSEONG IEUNG-CHIEUCH
+114A HANGUL CHOSEONG IEUNG-THIEUTH
+114B HANGUL CHOSEONG IEUNG-PHIEUPH
+114C HANGUL CHOSEONG YESIEUNG
+114D HANGUL CHOSEONG CIEUC-IEUNG
+114E HANGUL CHOSEONG CHITUEUMCIEUC
+114F HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150 HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151 HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152 HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153 HANGUL CHOSEONG CHIEUCH-HIEUH
+1154 HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155 HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156 HANGUL CHOSEONG PHIEUPH-PIEUP
+1157 HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158 HANGUL CHOSEONG SSANGHIEUH
+1159 HANGUL CHOSEONG YEORINHIEUH
+115F HANGUL CHOSEONG FILLER
+1160 HANGUL JUNGSEONG FILLER
+1161 HANGUL JUNGSEONG A
+1162 HANGUL JUNGSEONG AE
+1163 HANGUL JUNGSEONG YA
+1164 HANGUL JUNGSEONG YAE
+1165 HANGUL JUNGSEONG EO
+1166 HANGUL JUNGSEONG E
+1167 HANGUL JUNGSEONG YEO
+1168 HANGUL JUNGSEONG YE
+1169 HANGUL JUNGSEONG O
+116A HANGUL JUNGSEONG WA
+116B HANGUL JUNGSEONG WAE
+116C HANGUL JUNGSEONG OE
+116D HANGUL JUNGSEONG YO
+116E HANGUL JUNGSEONG U
+116F HANGUL JUNGSEONG WEO
+1170 HANGUL JUNGSEONG WE
+1171 HANGUL JUNGSEONG WI
+1172 HANGUL JUNGSEONG YU
+1173 HANGUL JUNGSEONG EU
+1174 HANGUL JUNGSEONG YI
+1175 HANGUL JUNGSEONG I
+1176 HANGUL JUNGSEONG A-O
+1177 HANGUL JUNGSEONG A-U
+1178 HANGUL JUNGSEONG YA-O
+1179 HANGUL JUNGSEONG YA-YO
+117A HANGUL JUNGSEONG EO-O
+117B HANGUL JUNGSEONG EO-U
+117C HANGUL JUNGSEONG EO-EU
+117D HANGUL JUNGSEONG YEO-O
+117E HANGUL JUNGSEONG YEO-U
+117F HANGUL JUNGSEONG O-EO
+1180 HANGUL JUNGSEONG O-E
+1181 HANGUL JUNGSEONG O-YE
+1182 HANGUL JUNGSEONG O-O
+1183 HANGUL JUNGSEONG O-U
+1184 HANGUL JUNGSEONG YO-YA
+1185 HANGUL JUNGSEONG YO-YAE
+1186 HANGUL JUNGSEONG YO-YEO
+1187 HANGUL JUNGSEONG YO-O
+1188 HANGUL JUNGSEONG YO-I
+1189 HANGUL JUNGSEONG U-A
+118A HANGUL JUNGSEONG U-AE
+118B HANGUL JUNGSEONG U-EO-EU
+118C HANGUL JUNGSEONG U-YE
+118D HANGUL JUNGSEONG U-U
+118E HANGUL JUNGSEONG YU-A
+118F HANGUL JUNGSEONG YU-EO
+1190 HANGUL JUNGSEONG YU-E
+1191 HANGUL JUNGSEONG YU-YEO
+1192 HANGUL JUNGSEONG YU-YE
+1193 HANGUL JUNGSEONG YU-U
+1194 HANGUL JUNGSEONG YU-I
+1195 HANGUL JUNGSEONG EU-U
+1196 HANGUL JUNGSEONG EU-EU
+1197 HANGUL JUNGSEONG YI-U
+1198 HANGUL JUNGSEONG I-A
+1199 HANGUL JUNGSEONG I-YA
+119A HANGUL JUNGSEONG I-O
+119B HANGUL JUNGSEONG I-U
+119C HANGUL JUNGSEONG I-EU
+119D HANGUL JUNGSEONG I-ARAEA
+119E HANGUL JUNGSEONG ARAEA
+119F HANGUL JUNGSEONG ARAEA-EO
+11A0 HANGUL JUNGSEONG ARAEA-U
+11A1 HANGUL JUNGSEONG ARAEA-I
+11A2 HANGUL JUNGSEONG SSANGARAEA
+11A8 HANGUL JONGSEONG KIYEOK
+11A9 HANGUL JONGSEONG SSANGKIYEOK
+11AA HANGUL JONGSEONG KIYEOK-SIOS
+11AB HANGUL JONGSEONG NIEUN
+11AC HANGUL JONGSEONG NIEUN-CIEUC
+11AD HANGUL JONGSEONG NIEUN-HIEUH
+11AE HANGUL JONGSEONG TIKEUT
+11AF HANGUL JONGSEONG RIEUL
+11B0 HANGUL JONGSEONG RIEUL-KIYEOK
+11B1 HANGUL JONGSEONG RIEUL-MIEUM
+11B2 HANGUL JONGSEONG RIEUL-PIEUP
+11B3 HANGUL JONGSEONG RIEUL-SIOS
+11B4 HANGUL JONGSEONG RIEUL-THIEUTH
+11B5 HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6 HANGUL JONGSEONG RIEUL-HIEUH
+11B7 HANGUL JONGSEONG MIEUM
+11B8 HANGUL JONGSEONG PIEUP
+11B9 HANGUL JONGSEONG PIEUP-SIOS
+11BA HANGUL JONGSEONG SIOS
+11BB HANGUL JONGSEONG SSANGSIOS
+11BC HANGUL JONGSEONG IEUNG
+11BD HANGUL JONGSEONG CIEUC
+11BE HANGUL JONGSEONG CHIEUCH
+11BF HANGUL JONGSEONG KHIEUKH
+11C0 HANGUL JONGSEONG THIEUTH
+11C1 HANGUL JONGSEONG PHIEUPH
+11C2 HANGUL JONGSEONG HIEUH
+11C3 HANGUL JONGSEONG KIYEOK-RIEUL
+11C4 HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5 HANGUL JONGSEONG NIEUN-KIYEOK
+11C6 HANGUL JONGSEONG NIEUN-TIKEUT
+11C7 HANGUL JONGSEONG NIEUN-SIOS
+11C8 HANGUL JONGSEONG NIEUN-PANSIOS
+11C9 HANGUL JONGSEONG NIEUN-THIEUTH
+11CA HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB HANGUL JONGSEONG TIKEUT-RIEUL
+11CC HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD HANGUL JONGSEONG RIEUL-NIEUN
+11CE HANGUL JONGSEONG RIEUL-TIKEUT
+11CF HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0 HANGUL JONGSEONG SSANGRIEUL
+11D1 HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2 HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3 HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4 HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5 HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6 HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7 HANGUL JONGSEONG RIEUL-PANSIOS
+11D8 HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9 HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA HANGUL JONGSEONG MIEUM-KIYEOK
+11DB HANGUL JONGSEONG MIEUM-RIEUL
+11DC HANGUL JONGSEONG MIEUM-PIEUP
+11DD HANGUL JONGSEONG MIEUM-SIOS
+11DE HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF HANGUL JONGSEONG MIEUM-PANSIOS
+11E0 HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1 HANGUL JONGSEONG MIEUM-HIEUH
+11E2 HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3 HANGUL JONGSEONG PIEUP-RIEUL
+11E4 HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5 HANGUL JONGSEONG PIEUP-HIEUH
+11E6 HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7 HANGUL JONGSEONG SIOS-KIYEOK
+11E8 HANGUL JONGSEONG SIOS-TIKEUT
+11E9 HANGUL JONGSEONG SIOS-RIEUL
+11EA HANGUL JONGSEONG SIOS-PIEUP
+11EB HANGUL JONGSEONG PANSIOS
+11EC HANGUL JONGSEONG IEUNG-KIYEOK
+11ED HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE HANGUL JONGSEONG SSANGIEUNG
+11EF HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0 HANGUL JONGSEONG YESIEUNG
+11F1 HANGUL JONGSEONG YESIEUNG-SIOS
+11F2 HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3 HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4 HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5 HANGUL JONGSEONG HIEUH-NIEUN
+11F6 HANGUL JONGSEONG HIEUH-RIEUL
+11F7 HANGUL JONGSEONG HIEUH-MIEUM
+11F8 HANGUL JONGSEONG HIEUH-PIEUP
+11F9 HANGUL JONGSEONG YEORINHIEUH
+1200 ETHIOPIC SYLLABLE HA
+1201 ETHIOPIC SYLLABLE HU
+1202 ETHIOPIC SYLLABLE HI
+1203 ETHIOPIC SYLLABLE HAA
+1204 ETHIOPIC SYLLABLE HEE
+1205 ETHIOPIC SYLLABLE HE
+1206 ETHIOPIC SYLLABLE HO
+1207 ETHIOPIC SYLLABLE HOA
+1208 ETHIOPIC SYLLABLE LA
+1209 ETHIOPIC SYLLABLE LU
+120A ETHIOPIC SYLLABLE LI
+120B ETHIOPIC SYLLABLE LAA
+120C ETHIOPIC SYLLABLE LEE
+120D ETHIOPIC SYLLABLE LE
+120E ETHIOPIC SYLLABLE LO
+120F ETHIOPIC SYLLABLE LWA
+1210 ETHIOPIC SYLLABLE HHA
+1211 ETHIOPIC SYLLABLE HHU
+1212 ETHIOPIC SYLLABLE HHI
+1213 ETHIOPIC SYLLABLE HHAA
+1214 ETHIOPIC SYLLABLE HHEE
+1215 ETHIOPIC SYLLABLE HHE
+1216 ETHIOPIC SYLLABLE HHO
+1217 ETHIOPIC SYLLABLE HHWA
+1218 ETHIOPIC SYLLABLE MA
+1219 ETHIOPIC SYLLABLE MU
+121A ETHIOPIC SYLLABLE MI
+121B ETHIOPIC SYLLABLE MAA
+121C ETHIOPIC SYLLABLE MEE
+121D ETHIOPIC SYLLABLE ME
+121E ETHIOPIC SYLLABLE MO
+121F ETHIOPIC SYLLABLE MWA
+1220 ETHIOPIC SYLLABLE SZA
+1221 ETHIOPIC SYLLABLE SZU
+1222 ETHIOPIC SYLLABLE SZI
+1223 ETHIOPIC SYLLABLE SZAA
+1224 ETHIOPIC SYLLABLE SZEE
+1225 ETHIOPIC SYLLABLE SZE
+1226 ETHIOPIC SYLLABLE SZO
+1227 ETHIOPIC SYLLABLE SZWA
+1228 ETHIOPIC SYLLABLE RA
+1229 ETHIOPIC SYLLABLE RU
+122A ETHIOPIC SYLLABLE RI
+122B ETHIOPIC SYLLABLE RAA
+122C ETHIOPIC SYLLABLE REE
+122D ETHIOPIC SYLLABLE RE
+122E ETHIOPIC SYLLABLE RO
+122F ETHIOPIC SYLLABLE RWA
+1230 ETHIOPIC SYLLABLE SA
+1231 ETHIOPIC SYLLABLE SU
+1232 ETHIOPIC SYLLABLE SI
+1233 ETHIOPIC SYLLABLE SAA
+1234 ETHIOPIC SYLLABLE SEE
+1235 ETHIOPIC SYLLABLE SE
+1236 ETHIOPIC SYLLABLE SO
+1237 ETHIOPIC SYLLABLE SWA
+1238 ETHIOPIC SYLLABLE SHA
+1239 ETHIOPIC SYLLABLE SHU
+123A ETHIOPIC SYLLABLE SHI
+123B ETHIOPIC SYLLABLE SHAA
+123C ETHIOPIC SYLLABLE SHEE
+123D ETHIOPIC SYLLABLE SHE
+123E ETHIOPIC SYLLABLE SHO
+123F ETHIOPIC SYLLABLE SHWA
+1240 ETHIOPIC SYLLABLE QA
+1241 ETHIOPIC SYLLABLE QU
+1242 ETHIOPIC SYLLABLE QI
+1243 ETHIOPIC SYLLABLE QAA
+1244 ETHIOPIC SYLLABLE QEE
+1245 ETHIOPIC SYLLABLE QE
+1246 ETHIOPIC SYLLABLE QO
+1247 ETHIOPIC SYLLABLE QOA
+1248 ETHIOPIC SYLLABLE QWA
+124A ETHIOPIC SYLLABLE QWI
+124B ETHIOPIC SYLLABLE QWAA
+124C ETHIOPIC SYLLABLE QWEE
+124D ETHIOPIC SYLLABLE QWE
+1250 ETHIOPIC SYLLABLE QHA
+1251 ETHIOPIC SYLLABLE QHU
+1252 ETHIOPIC SYLLABLE QHI
+1253 ETHIOPIC SYLLABLE QHAA
+1254 ETHIOPIC SYLLABLE QHEE
+1255 ETHIOPIC SYLLABLE QHE
+1256 ETHIOPIC SYLLABLE QHO
+1258 ETHIOPIC SYLLABLE QHWA
+125A ETHIOPIC SYLLABLE QHWI
+125B ETHIOPIC SYLLABLE QHWAA
+125C ETHIOPIC SYLLABLE QHWEE
+125D ETHIOPIC SYLLABLE QHWE
+1260 ETHIOPIC SYLLABLE BA
+1261 ETHIOPIC SYLLABLE BU
+1262 ETHIOPIC SYLLABLE BI
+1263 ETHIOPIC SYLLABLE BAA
+1264 ETHIOPIC SYLLABLE BEE
+1265 ETHIOPIC SYLLABLE BE
+1266 ETHIOPIC SYLLABLE BO
+1267 ETHIOPIC SYLLABLE BWA
+1268 ETHIOPIC SYLLABLE VA
+1269 ETHIOPIC SYLLABLE VU
+126A ETHIOPIC SYLLABLE VI
+126B ETHIOPIC SYLLABLE VAA
+126C ETHIOPIC SYLLABLE VEE
+126D ETHIOPIC SYLLABLE VE
+126E ETHIOPIC SYLLABLE VO
+126F ETHIOPIC SYLLABLE VWA
+1270 ETHIOPIC SYLLABLE TA
+1271 ETHIOPIC SYLLABLE TU
+1272 ETHIOPIC SYLLABLE TI
+1273 ETHIOPIC SYLLABLE TAA
+1274 ETHIOPIC SYLLABLE TEE
+1275 ETHIOPIC SYLLABLE TE
+1276 ETHIOPIC SYLLABLE TO
+1277 ETHIOPIC SYLLABLE TWA
+1278 ETHIOPIC SYLLABLE CA
+1279 ETHIOPIC SYLLABLE CU
+127A ETHIOPIC SYLLABLE CI
+127B ETHIOPIC SYLLABLE CAA
+127C ETHIOPIC SYLLABLE CEE
+127D ETHIOPIC SYLLABLE CE
+127E ETHIOPIC SYLLABLE CO
+127F ETHIOPIC SYLLABLE CWA
+1280 ETHIOPIC SYLLABLE XA
+1281 ETHIOPIC SYLLABLE XU
+1282 ETHIOPIC SYLLABLE XI
+1283 ETHIOPIC SYLLABLE XAA
+1284 ETHIOPIC SYLLABLE XEE
+1285 ETHIOPIC SYLLABLE XE
+1286 ETHIOPIC SYLLABLE XO
+1287 ETHIOPIC SYLLABLE XOA
+1288 ETHIOPIC SYLLABLE XWA
+128A ETHIOPIC SYLLABLE XWI
+128B ETHIOPIC SYLLABLE XWAA
+128C ETHIOPIC SYLLABLE XWEE
+128D ETHIOPIC SYLLABLE XWE
+1290 ETHIOPIC SYLLABLE NA
+1291 ETHIOPIC SYLLABLE NU
+1292 ETHIOPIC SYLLABLE NI
+1293 ETHIOPIC SYLLABLE NAA
+1294 ETHIOPIC SYLLABLE NEE
+1295 ETHIOPIC SYLLABLE NE
+1296 ETHIOPIC SYLLABLE NO
+1297 ETHIOPIC SYLLABLE NWA
+1298 ETHIOPIC SYLLABLE NYA
+1299 ETHIOPIC SYLLABLE NYU
+129A ETHIOPIC SYLLABLE NYI
+129B ETHIOPIC SYLLABLE NYAA
+129C ETHIOPIC SYLLABLE NYEE
+129D ETHIOPIC SYLLABLE NYE
+129E ETHIOPIC SYLLABLE NYO
+129F ETHIOPIC SYLLABLE NYWA
+12A0 ETHIOPIC SYLLABLE GLOTTAL A
+12A1 ETHIOPIC SYLLABLE GLOTTAL U
+12A2 ETHIOPIC SYLLABLE GLOTTAL I
+12A3 ETHIOPIC SYLLABLE GLOTTAL AA
+12A4 ETHIOPIC SYLLABLE GLOTTAL EE
+12A5 ETHIOPIC SYLLABLE GLOTTAL E
+12A6 ETHIOPIC SYLLABLE GLOTTAL O
+12A7 ETHIOPIC SYLLABLE GLOTTAL WA
+12A8 ETHIOPIC SYLLABLE KA
+12A9 ETHIOPIC SYLLABLE KU
+12AA ETHIOPIC SYLLABLE KI
+12AB ETHIOPIC SYLLABLE KAA
+12AC ETHIOPIC SYLLABLE KEE
+12AD ETHIOPIC SYLLABLE KE
+12AE ETHIOPIC SYLLABLE KO
+12AF ETHIOPIC SYLLABLE KOA
+12B0 ETHIOPIC SYLLABLE KWA
+12B2 ETHIOPIC SYLLABLE KWI
+12B3 ETHIOPIC SYLLABLE KWAA
+12B4 ETHIOPIC SYLLABLE KWEE
+12B5 ETHIOPIC SYLLABLE KWE
+12B8 ETHIOPIC SYLLABLE KXA
+12B9 ETHIOPIC SYLLABLE KXU
+12BA ETHIOPIC SYLLABLE KXI
+12BB ETHIOPIC SYLLABLE KXAA
+12BC ETHIOPIC SYLLABLE KXEE
+12BD ETHIOPIC SYLLABLE KXE
+12BE ETHIOPIC SYLLABLE KXO
+12C0 ETHIOPIC SYLLABLE KXWA
+12C2 ETHIOPIC SYLLABLE KXWI
+12C3 ETHIOPIC SYLLABLE KXWAA
+12C4 ETHIOPIC SYLLABLE KXWEE
+12C5 ETHIOPIC SYLLABLE KXWE
+12C8 ETHIOPIC SYLLABLE WA
+12C9 ETHIOPIC SYLLABLE WU
+12CA ETHIOPIC SYLLABLE WI
+12CB ETHIOPIC SYLLABLE WAA
+12CC ETHIOPIC SYLLABLE WEE
+12CD ETHIOPIC SYLLABLE WE
+12CE ETHIOPIC SYLLABLE WO
+12CF ETHIOPIC SYLLABLE WOA
+12D0 ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1 ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2 ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3 ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4 ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5 ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6 ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8 ETHIOPIC SYLLABLE ZA
+12D9 ETHIOPIC SYLLABLE ZU
+12DA ETHIOPIC SYLLABLE ZI
+12DB ETHIOPIC SYLLABLE ZAA
+12DC ETHIOPIC SYLLABLE ZEE
+12DD ETHIOPIC SYLLABLE ZE
+12DE ETHIOPIC SYLLABLE ZO
+12DF ETHIOPIC SYLLABLE ZWA
+12E0 ETHIOPIC SYLLABLE ZHA
+12E1 ETHIOPIC SYLLABLE ZHU
+12E2 ETHIOPIC SYLLABLE ZHI
+12E3 ETHIOPIC SYLLABLE ZHAA
+12E4 ETHIOPIC SYLLABLE ZHEE
+12E5 ETHIOPIC SYLLABLE ZHE
+12E6 ETHIOPIC SYLLABLE ZHO
+12E7 ETHIOPIC SYLLABLE ZHWA
+12E8 ETHIOPIC SYLLABLE YA
+12E9 ETHIOPIC SYLLABLE YU
+12EA ETHIOPIC SYLLABLE YI
+12EB ETHIOPIC SYLLABLE YAA
+12EC ETHIOPIC SYLLABLE YEE
+12ED ETHIOPIC SYLLABLE YE
+12EE ETHIOPIC SYLLABLE YO
+12EF ETHIOPIC SYLLABLE YOA
+12F0 ETHIOPIC SYLLABLE DA
+12F1 ETHIOPIC SYLLABLE DU
+12F2 ETHIOPIC SYLLABLE DI
+12F3 ETHIOPIC SYLLABLE DAA
+12F4 ETHIOPIC SYLLABLE DEE
+12F5 ETHIOPIC SYLLABLE DE
+12F6 ETHIOPIC SYLLABLE DO
+12F7 ETHIOPIC SYLLABLE DWA
+12F8 ETHIOPIC SYLLABLE DDA
+12F9 ETHIOPIC SYLLABLE DDU
+12FA ETHIOPIC SYLLABLE DDI
+12FB ETHIOPIC SYLLABLE DDAA
+12FC ETHIOPIC SYLLABLE DDEE
+12FD ETHIOPIC SYLLABLE DDE
+12FE ETHIOPIC SYLLABLE DDO
+12FF ETHIOPIC SYLLABLE DDWA
+1300 ETHIOPIC SYLLABLE JA
+1301 ETHIOPIC SYLLABLE JU
+1302 ETHIOPIC SYLLABLE JI
+1303 ETHIOPIC SYLLABLE JAA
+1304 ETHIOPIC SYLLABLE JEE
+1305 ETHIOPIC SYLLABLE JE
+1306 ETHIOPIC SYLLABLE JO
+1307 ETHIOPIC SYLLABLE JWA
+1308 ETHIOPIC SYLLABLE GA
+1309 ETHIOPIC SYLLABLE GU
+130A ETHIOPIC SYLLABLE GI
+130B ETHIOPIC SYLLABLE GAA
+130C ETHIOPIC SYLLABLE GEE
+130D ETHIOPIC SYLLABLE GE
+130E ETHIOPIC SYLLABLE GO
+130F ETHIOPIC SYLLABLE GOA
+1310 ETHIOPIC SYLLABLE GWA
+1312 ETHIOPIC SYLLABLE GWI
+1313 ETHIOPIC SYLLABLE GWAA
+1314 ETHIOPIC SYLLABLE GWEE
+1315 ETHIOPIC SYLLABLE GWE
+1318 ETHIOPIC SYLLABLE GGA
+1319 ETHIOPIC SYLLABLE GGU
+131A ETHIOPIC SYLLABLE GGI
+131B ETHIOPIC SYLLABLE GGAA
+131C ETHIOPIC SYLLABLE GGEE
+131D ETHIOPIC SYLLABLE GGE
+131E ETHIOPIC SYLLABLE GGO
+131F ETHIOPIC SYLLABLE GGWAA
+1320 ETHIOPIC SYLLABLE THA
+1321 ETHIOPIC SYLLABLE THU
+1322 ETHIOPIC SYLLABLE THI
+1323 ETHIOPIC SYLLABLE THAA
+1324 ETHIOPIC SYLLABLE THEE
+1325 ETHIOPIC SYLLABLE THE
+1326 ETHIOPIC SYLLABLE THO
+1327 ETHIOPIC SYLLABLE THWA
+1328 ETHIOPIC SYLLABLE CHA
+1329 ETHIOPIC SYLLABLE CHU
+132A ETHIOPIC SYLLABLE CHI
+132B ETHIOPIC SYLLABLE CHAA
+132C ETHIOPIC SYLLABLE CHEE
+132D ETHIOPIC SYLLABLE CHE
+132E ETHIOPIC SYLLABLE CHO
+132F ETHIOPIC SYLLABLE CHWA
+1330 ETHIOPIC SYLLABLE PHA
+1331 ETHIOPIC SYLLABLE PHU
+1332 ETHIOPIC SYLLABLE PHI
+1333 ETHIOPIC SYLLABLE PHAA
+1334 ETHIOPIC SYLLABLE PHEE
+1335 ETHIOPIC SYLLABLE PHE
+1336 ETHIOPIC SYLLABLE PHO
+1337 ETHIOPIC SYLLABLE PHWA
+1338 ETHIOPIC SYLLABLE TSA
+1339 ETHIOPIC SYLLABLE TSU
+133A ETHIOPIC SYLLABLE TSI
+133B ETHIOPIC SYLLABLE TSAA
+133C ETHIOPIC SYLLABLE TSEE
+133D ETHIOPIC SYLLABLE TSE
+133E ETHIOPIC SYLLABLE TSO
+133F ETHIOPIC SYLLABLE TSWA
+1340 ETHIOPIC SYLLABLE TZA
+1341 ETHIOPIC SYLLABLE TZU
+1342 ETHIOPIC SYLLABLE TZI
+1343 ETHIOPIC SYLLABLE TZAA
+1344 ETHIOPIC SYLLABLE TZEE
+1345 ETHIOPIC SYLLABLE TZE
+1346 ETHIOPIC SYLLABLE TZO
+1347 ETHIOPIC SYLLABLE TZOA
+1348 ETHIOPIC SYLLABLE FA
+1349 ETHIOPIC SYLLABLE FU
+134A ETHIOPIC SYLLABLE FI
+134B ETHIOPIC SYLLABLE FAA
+134C ETHIOPIC SYLLABLE FEE
+134D ETHIOPIC SYLLABLE FE
+134E ETHIOPIC SYLLABLE FO
+134F ETHIOPIC SYLLABLE FWA
+1350 ETHIOPIC SYLLABLE PA
+1351 ETHIOPIC SYLLABLE PU
+1352 ETHIOPIC SYLLABLE PI
+1353 ETHIOPIC SYLLABLE PAA
+1354 ETHIOPIC SYLLABLE PEE
+1355 ETHIOPIC SYLLABLE PE
+1356 ETHIOPIC SYLLABLE PO
+1357 ETHIOPIC SYLLABLE PWA
+1358 ETHIOPIC SYLLABLE RYA
+1359 ETHIOPIC SYLLABLE MYA
+135A ETHIOPIC SYLLABLE FYA
+135F ETHIOPIC COMBINING GEMINATION MARK
+1360 ETHIOPIC SECTION MARK
+1361 ETHIOPIC WORDSPACE
+1362 ETHIOPIC FULL STOP
+1363 ETHIOPIC COMMA
+1364 ETHIOPIC SEMICOLON
+1365 ETHIOPIC COLON
+1366 ETHIOPIC PREFACE COLON
+1367 ETHIOPIC QUESTION MARK
+1368 ETHIOPIC PARAGRAPH SEPARATOR
+1369 ETHIOPIC DIGIT ONE
+136A ETHIOPIC DIGIT TWO
+136B ETHIOPIC DIGIT THREE
+136C ETHIOPIC DIGIT FOUR
+136D ETHIOPIC DIGIT FIVE
+136E ETHIOPIC DIGIT SIX
+136F ETHIOPIC DIGIT SEVEN
+1370 ETHIOPIC DIGIT EIGHT
+1371 ETHIOPIC DIGIT NINE
+1372 ETHIOPIC NUMBER TEN
+1373 ETHIOPIC NUMBER TWENTY
+1374 ETHIOPIC NUMBER THIRTY
+1375 ETHIOPIC NUMBER FORTY
+1376 ETHIOPIC NUMBER FIFTY
+1377 ETHIOPIC NUMBER SIXTY
+1378 ETHIOPIC NUMBER SEVENTY
+1379 ETHIOPIC NUMBER EIGHTY
+137A ETHIOPIC NUMBER NINETY
+137B ETHIOPIC NUMBER HUNDRED
+137C ETHIOPIC NUMBER TEN THOUSAND
+1380 ETHIOPIC SYLLABLE SEBATBEIT MWA
+1381 ETHIOPIC SYLLABLE MWI
+1382 ETHIOPIC SYLLABLE MWEE
+1383 ETHIOPIC SYLLABLE MWE
+1384 ETHIOPIC SYLLABLE SEBATBEIT BWA
+1385 ETHIOPIC SYLLABLE BWI
+1386 ETHIOPIC SYLLABLE BWEE
+1387 ETHIOPIC SYLLABLE BWE
+1388 ETHIOPIC SYLLABLE SEBATBEIT FWA
+1389 ETHIOPIC SYLLABLE FWI
+138A ETHIOPIC SYLLABLE FWEE
+138B ETHIOPIC SYLLABLE FWE
+138C ETHIOPIC SYLLABLE SEBATBEIT PWA
+138D ETHIOPIC SYLLABLE PWI
+138E ETHIOPIC SYLLABLE PWEE
+138F ETHIOPIC SYLLABLE PWE
+1390 ETHIOPIC TONAL MARK YIZET
+1391 ETHIOPIC TONAL MARK DERET
+1392 ETHIOPIC TONAL MARK RIKRIK
+1393 ETHIOPIC TONAL MARK SHORT RIKRIK
+1394 ETHIOPIC TONAL MARK DIFAT
+1395 ETHIOPIC TONAL MARK KENAT
+1396 ETHIOPIC TONAL MARK CHIRET
+1397 ETHIOPIC TONAL MARK HIDET
+1398 ETHIOPIC TONAL MARK DERET-HIDET
+1399 ETHIOPIC TONAL MARK KURT
+13A0 CHEROKEE LETTER A
+13A1 CHEROKEE LETTER E
+13A2 CHEROKEE LETTER I
+13A3 CHEROKEE LETTER O
+13A4 CHEROKEE LETTER U
+13A5 CHEROKEE LETTER V
+13A6 CHEROKEE LETTER GA
+13A7 CHEROKEE LETTER KA
+13A8 CHEROKEE LETTER GE
+13A9 CHEROKEE LETTER GI
+13AA CHEROKEE LETTER GO
+13AB CHEROKEE LETTER GU
+13AC CHEROKEE LETTER GV
+13AD CHEROKEE LETTER HA
+13AE CHEROKEE LETTER HE
+13AF CHEROKEE LETTER HI
+13B0 CHEROKEE LETTER HO
+13B1 CHEROKEE LETTER HU
+13B2 CHEROKEE LETTER HV
+13B3 CHEROKEE LETTER LA
+13B4 CHEROKEE LETTER LE
+13B5 CHEROKEE LETTER LI
+13B6 CHEROKEE LETTER LO
+13B7 CHEROKEE LETTER LU
+13B8 CHEROKEE LETTER LV
+13B9 CHEROKEE LETTER MA
+13BA CHEROKEE LETTER ME
+13BB CHEROKEE LETTER MI
+13BC CHEROKEE LETTER MO
+13BD CHEROKEE LETTER MU
+13BE CHEROKEE LETTER NA
+13BF CHEROKEE LETTER HNA
+13C0 CHEROKEE LETTER NAH
+13C1 CHEROKEE LETTER NE
+13C2 CHEROKEE LETTER NI
+13C3 CHEROKEE LETTER NO
+13C4 CHEROKEE LETTER NU
+13C5 CHEROKEE LETTER NV
+13C6 CHEROKEE LETTER QUA
+13C7 CHEROKEE LETTER QUE
+13C8 CHEROKEE LETTER QUI
+13C9 CHEROKEE LETTER QUO
+13CA CHEROKEE LETTER QUU
+13CB CHEROKEE LETTER QUV
+13CC CHEROKEE LETTER SA
+13CD CHEROKEE LETTER S
+13CE CHEROKEE LETTER SE
+13CF CHEROKEE LETTER SI
+13D0 CHEROKEE LETTER SO
+13D1 CHEROKEE LETTER SU
+13D2 CHEROKEE LETTER SV
+13D3 CHEROKEE LETTER DA
+13D4 CHEROKEE LETTER TA
+13D5 CHEROKEE LETTER DE
+13D6 CHEROKEE LETTER TE
+13D7 CHEROKEE LETTER DI
+13D8 CHEROKEE LETTER TI
+13D9 CHEROKEE LETTER DO
+13DA CHEROKEE LETTER DU
+13DB CHEROKEE LETTER DV
+13DC CHEROKEE LETTER DLA
+13DD CHEROKEE LETTER TLA
+13DE CHEROKEE LETTER TLE
+13DF CHEROKEE LETTER TLI
+13E0 CHEROKEE LETTER TLO
+13E1 CHEROKEE LETTER TLU
+13E2 CHEROKEE LETTER TLV
+13E3 CHEROKEE LETTER TSA
+13E4 CHEROKEE LETTER TSE
+13E5 CHEROKEE LETTER TSI
+13E6 CHEROKEE LETTER TSO
+13E7 CHEROKEE LETTER TSU
+13E8 CHEROKEE LETTER TSV
+13E9 CHEROKEE LETTER WA
+13EA CHEROKEE LETTER WE
+13EB CHEROKEE LETTER WI
+13EC CHEROKEE LETTER WO
+13ED CHEROKEE LETTER WU
+13EE CHEROKEE LETTER WV
+13EF CHEROKEE LETTER YA
+13F0 CHEROKEE LETTER YE
+13F1 CHEROKEE LETTER YI
+13F2 CHEROKEE LETTER YO
+13F3 CHEROKEE LETTER YU
+13F4 CHEROKEE LETTER YV
+1401 CANADIAN SYLLABICS E
+1402 CANADIAN SYLLABICS AAI
+1403 CANADIAN SYLLABICS I
+1404 CANADIAN SYLLABICS II
+1405 CANADIAN SYLLABICS O
+1406 CANADIAN SYLLABICS OO
+1407 CANADIAN SYLLABICS Y-CREE OO
+1408 CANADIAN SYLLABICS CARRIER EE
+1409 CANADIAN SYLLABICS CARRIER I
+140A CANADIAN SYLLABICS A
+140B CANADIAN SYLLABICS AA
+140C CANADIAN SYLLABICS WE
+140D CANADIAN SYLLABICS WEST-CREE WE
+140E CANADIAN SYLLABICS WI
+140F CANADIAN SYLLABICS WEST-CREE WI
+1410 CANADIAN SYLLABICS WII
+1411 CANADIAN SYLLABICS WEST-CREE WII
+1412 CANADIAN SYLLABICS WO
+1413 CANADIAN SYLLABICS WEST-CREE WO
+1414 CANADIAN SYLLABICS WOO
+1415 CANADIAN SYLLABICS WEST-CREE WOO
+1416 CANADIAN SYLLABICS NASKAPI WOO
+1417 CANADIAN SYLLABICS WA
+1418 CANADIAN SYLLABICS WEST-CREE WA
+1419 CANADIAN SYLLABICS WAA
+141A CANADIAN SYLLABICS WEST-CREE WAA
+141B CANADIAN SYLLABICS NASKAPI WAA
+141C CANADIAN SYLLABICS AI
+141D CANADIAN SYLLABICS Y-CREE W
+141E CANADIAN SYLLABICS GLOTTAL STOP
+141F CANADIAN SYLLABICS FINAL ACUTE
+1420 CANADIAN SYLLABICS FINAL GRAVE
+1421 CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422 CANADIAN SYLLABICS FINAL TOP HALF RING
+1423 CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424 CANADIAN SYLLABICS FINAL RING
+1425 CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426 CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427 CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428 CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429 CANADIAN SYLLABICS FINAL PLUS
+142A CANADIAN SYLLABICS FINAL DOWN TACK
+142B CANADIAN SYLLABICS EN
+142C CANADIAN SYLLABICS IN
+142D CANADIAN SYLLABICS ON
+142E CANADIAN SYLLABICS AN
+142F CANADIAN SYLLABICS PE
+1430 CANADIAN SYLLABICS PAAI
+1431 CANADIAN SYLLABICS PI
+1432 CANADIAN SYLLABICS PII
+1433 CANADIAN SYLLABICS PO
+1434 CANADIAN SYLLABICS POO
+1435 CANADIAN SYLLABICS Y-CREE POO
+1436 CANADIAN SYLLABICS CARRIER HEE
+1437 CANADIAN SYLLABICS CARRIER HI
+1438 CANADIAN SYLLABICS PA
+1439 CANADIAN SYLLABICS PAA
+143A CANADIAN SYLLABICS PWE
+143B CANADIAN SYLLABICS WEST-CREE PWE
+143C CANADIAN SYLLABICS PWI
+143D CANADIAN SYLLABICS WEST-CREE PWI
+143E CANADIAN SYLLABICS PWII
+143F CANADIAN SYLLABICS WEST-CREE PWII
+1440 CANADIAN SYLLABICS PWO
+1441 CANADIAN SYLLABICS WEST-CREE PWO
+1442 CANADIAN SYLLABICS PWOO
+1443 CANADIAN SYLLABICS WEST-CREE PWOO
+1444 CANADIAN SYLLABICS PWA
+1445 CANADIAN SYLLABICS WEST-CREE PWA
+1446 CANADIAN SYLLABICS PWAA
+1447 CANADIAN SYLLABICS WEST-CREE PWAA
+1448 CANADIAN SYLLABICS Y-CREE PWAA
+1449 CANADIAN SYLLABICS P
+144A CANADIAN SYLLABICS WEST-CREE P
+144B CANADIAN SYLLABICS CARRIER H
+144C CANADIAN SYLLABICS TE
+144D CANADIAN SYLLABICS TAAI
+144E CANADIAN SYLLABICS TI
+144F CANADIAN SYLLABICS TII
+1450 CANADIAN SYLLABICS TO
+1451 CANADIAN SYLLABICS TOO
+1452 CANADIAN SYLLABICS Y-CREE TOO
+1453 CANADIAN SYLLABICS CARRIER DEE
+1454 CANADIAN SYLLABICS CARRIER DI
+1455 CANADIAN SYLLABICS TA
+1456 CANADIAN SYLLABICS TAA
+1457 CANADIAN SYLLABICS TWE
+1458 CANADIAN SYLLABICS WEST-CREE TWE
+1459 CANADIAN SYLLABICS TWI
+145A CANADIAN SYLLABICS WEST-CREE TWI
+145B CANADIAN SYLLABICS TWII
+145C CANADIAN SYLLABICS WEST-CREE TWII
+145D CANADIAN SYLLABICS TWO
+145E CANADIAN SYLLABICS WEST-CREE TWO
+145F CANADIAN SYLLABICS TWOO
+1460 CANADIAN SYLLABICS WEST-CREE TWOO
+1461 CANADIAN SYLLABICS TWA
+1462 CANADIAN SYLLABICS WEST-CREE TWA
+1463 CANADIAN SYLLABICS TWAA
+1464 CANADIAN SYLLABICS WEST-CREE TWAA
+1465 CANADIAN SYLLABICS NASKAPI TWAA
+1466 CANADIAN SYLLABICS T
+1467 CANADIAN SYLLABICS TTE
+1468 CANADIAN SYLLABICS TTI
+1469 CANADIAN SYLLABICS TTO
+146A CANADIAN SYLLABICS TTA
+146B CANADIAN SYLLABICS KE
+146C CANADIAN SYLLABICS KAAI
+146D CANADIAN SYLLABICS KI
+146E CANADIAN SYLLABICS KII
+146F CANADIAN SYLLABICS KO
+1470 CANADIAN SYLLABICS KOO
+1471 CANADIAN SYLLABICS Y-CREE KOO
+1472 CANADIAN SYLLABICS KA
+1473 CANADIAN SYLLABICS KAA
+1474 CANADIAN SYLLABICS KWE
+1475 CANADIAN SYLLABICS WEST-CREE KWE
+1476 CANADIAN SYLLABICS KWI
+1477 CANADIAN SYLLABICS WEST-CREE KWI
+1478 CANADIAN SYLLABICS KWII
+1479 CANADIAN SYLLABICS WEST-CREE KWII
+147A CANADIAN SYLLABICS KWO
+147B CANADIAN SYLLABICS WEST-CREE KWO
+147C CANADIAN SYLLABICS KWOO
+147D CANADIAN SYLLABICS WEST-CREE KWOO
+147E CANADIAN SYLLABICS KWA
+147F CANADIAN SYLLABICS WEST-CREE KWA
+1480 CANADIAN SYLLABICS KWAA
+1481 CANADIAN SYLLABICS WEST-CREE KWAA
+1482 CANADIAN SYLLABICS NASKAPI KWAA
+1483 CANADIAN SYLLABICS K
+1484 CANADIAN SYLLABICS KW
+1485 CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486 CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487 CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488 CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489 CANADIAN SYLLABICS CE
+148A CANADIAN SYLLABICS CAAI
+148B CANADIAN SYLLABICS CI
+148C CANADIAN SYLLABICS CII
+148D CANADIAN SYLLABICS CO
+148E CANADIAN SYLLABICS COO
+148F CANADIAN SYLLABICS Y-CREE COO
+1490 CANADIAN SYLLABICS CA
+1491 CANADIAN SYLLABICS CAA
+1492 CANADIAN SYLLABICS CWE
+1493 CANADIAN SYLLABICS WEST-CREE CWE
+1494 CANADIAN SYLLABICS CWI
+1495 CANADIAN SYLLABICS WEST-CREE CWI
+1496 CANADIAN SYLLABICS CWII
+1497 CANADIAN SYLLABICS WEST-CREE CWII
+1498 CANADIAN SYLLABICS CWO
+1499 CANADIAN SYLLABICS WEST-CREE CWO
+149A CANADIAN SYLLABICS CWOO
+149B CANADIAN SYLLABICS WEST-CREE CWOO
+149C CANADIAN SYLLABICS CWA
+149D CANADIAN SYLLABICS WEST-CREE CWA
+149E CANADIAN SYLLABICS CWAA
+149F CANADIAN SYLLABICS WEST-CREE CWAA
+14A0 CANADIAN SYLLABICS NASKAPI CWAA
+14A1 CANADIAN SYLLABICS C
+14A2 CANADIAN SYLLABICS SAYISI TH
+14A3 CANADIAN SYLLABICS ME
+14A4 CANADIAN SYLLABICS MAAI
+14A5 CANADIAN SYLLABICS MI
+14A6 CANADIAN SYLLABICS MII
+14A7 CANADIAN SYLLABICS MO
+14A8 CANADIAN SYLLABICS MOO
+14A9 CANADIAN SYLLABICS Y-CREE MOO
+14AA CANADIAN SYLLABICS MA
+14AB CANADIAN SYLLABICS MAA
+14AC CANADIAN SYLLABICS MWE
+14AD CANADIAN SYLLABICS WEST-CREE MWE
+14AE CANADIAN SYLLABICS MWI
+14AF CANADIAN SYLLABICS WEST-CREE MWI
+14B0 CANADIAN SYLLABICS MWII
+14B1 CANADIAN SYLLABICS WEST-CREE MWII
+14B2 CANADIAN SYLLABICS MWO
+14B3 CANADIAN SYLLABICS WEST-CREE MWO
+14B4 CANADIAN SYLLABICS MWOO
+14B5 CANADIAN SYLLABICS WEST-CREE MWOO
+14B6 CANADIAN SYLLABICS MWA
+14B7 CANADIAN SYLLABICS WEST-CREE MWA
+14B8 CANADIAN SYLLABICS MWAA
+14B9 CANADIAN SYLLABICS WEST-CREE MWAA
+14BA CANADIAN SYLLABICS NASKAPI MWAA
+14BB CANADIAN SYLLABICS M
+14BC CANADIAN SYLLABICS WEST-CREE M
+14BD CANADIAN SYLLABICS MH
+14BE CANADIAN SYLLABICS ATHAPASCAN M
+14BF CANADIAN SYLLABICS SAYISI M
+14C0 CANADIAN SYLLABICS NE
+14C1 CANADIAN SYLLABICS NAAI
+14C2 CANADIAN SYLLABICS NI
+14C3 CANADIAN SYLLABICS NII
+14C4 CANADIAN SYLLABICS NO
+14C5 CANADIAN SYLLABICS NOO
+14C6 CANADIAN SYLLABICS Y-CREE NOO
+14C7 CANADIAN SYLLABICS NA
+14C8 CANADIAN SYLLABICS NAA
+14C9 CANADIAN SYLLABICS NWE
+14CA CANADIAN SYLLABICS WEST-CREE NWE
+14CB CANADIAN SYLLABICS NWA
+14CC CANADIAN SYLLABICS WEST-CREE NWA
+14CD CANADIAN SYLLABICS NWAA
+14CE CANADIAN SYLLABICS WEST-CREE NWAA
+14CF CANADIAN SYLLABICS NASKAPI NWAA
+14D0 CANADIAN SYLLABICS N
+14D1 CANADIAN SYLLABICS CARRIER NG
+14D2 CANADIAN SYLLABICS NH
+14D3 CANADIAN SYLLABICS LE
+14D4 CANADIAN SYLLABICS LAAI
+14D5 CANADIAN SYLLABICS LI
+14D6 CANADIAN SYLLABICS LII
+14D7 CANADIAN SYLLABICS LO
+14D8 CANADIAN SYLLABICS LOO
+14D9 CANADIAN SYLLABICS Y-CREE LOO
+14DA CANADIAN SYLLABICS LA
+14DB CANADIAN SYLLABICS LAA
+14DC CANADIAN SYLLABICS LWE
+14DD CANADIAN SYLLABICS WEST-CREE LWE
+14DE CANADIAN SYLLABICS LWI
+14DF CANADIAN SYLLABICS WEST-CREE LWI
+14E0 CANADIAN SYLLABICS LWII
+14E1 CANADIAN SYLLABICS WEST-CREE LWII
+14E2 CANADIAN SYLLABICS LWO
+14E3 CANADIAN SYLLABICS WEST-CREE LWO
+14E4 CANADIAN SYLLABICS LWOO
+14E5 CANADIAN SYLLABICS WEST-CREE LWOO
+14E6 CANADIAN SYLLABICS LWA
+14E7 CANADIAN SYLLABICS WEST-CREE LWA
+14E8 CANADIAN SYLLABICS LWAA
+14E9 CANADIAN SYLLABICS WEST-CREE LWAA
+14EA CANADIAN SYLLABICS L
+14EB CANADIAN SYLLABICS WEST-CREE L
+14EC CANADIAN SYLLABICS MEDIAL L
+14ED CANADIAN SYLLABICS SE
+14EE CANADIAN SYLLABICS SAAI
+14EF CANADIAN SYLLABICS SI
+14F0 CANADIAN SYLLABICS SII
+14F1 CANADIAN SYLLABICS SO
+14F2 CANADIAN SYLLABICS SOO
+14F3 CANADIAN SYLLABICS Y-CREE SOO
+14F4 CANADIAN SYLLABICS SA
+14F5 CANADIAN SYLLABICS SAA
+14F6 CANADIAN SYLLABICS SWE
+14F7 CANADIAN SYLLABICS WEST-CREE SWE
+14F8 CANADIAN SYLLABICS SWI
+14F9 CANADIAN SYLLABICS WEST-CREE SWI
+14FA CANADIAN SYLLABICS SWII
+14FB CANADIAN SYLLABICS WEST-CREE SWII
+14FC CANADIAN SYLLABICS SWO
+14FD CANADIAN SYLLABICS WEST-CREE SWO
+14FE CANADIAN SYLLABICS SWOO
+14FF CANADIAN SYLLABICS WEST-CREE SWOO
+1500 CANADIAN SYLLABICS SWA
+1501 CANADIAN SYLLABICS WEST-CREE SWA
+1502 CANADIAN SYLLABICS SWAA
+1503 CANADIAN SYLLABICS WEST-CREE SWAA
+1504 CANADIAN SYLLABICS NASKAPI SWAA
+1505 CANADIAN SYLLABICS S
+1506 CANADIAN SYLLABICS ATHAPASCAN S
+1507 CANADIAN SYLLABICS SW
+1508 CANADIAN SYLLABICS BLACKFOOT S
+1509 CANADIAN SYLLABICS MOOSE-CREE SK
+150A CANADIAN SYLLABICS NASKAPI SKW
+150B CANADIAN SYLLABICS NASKAPI S-W
+150C CANADIAN SYLLABICS NASKAPI SPWA
+150D CANADIAN SYLLABICS NASKAPI STWA
+150E CANADIAN SYLLABICS NASKAPI SKWA
+150F CANADIAN SYLLABICS NASKAPI SCWA
+1510 CANADIAN SYLLABICS SHE
+1511 CANADIAN SYLLABICS SHI
+1512 CANADIAN SYLLABICS SHII
+1513 CANADIAN SYLLABICS SHO
+1514 CANADIAN SYLLABICS SHOO
+1515 CANADIAN SYLLABICS SHA
+1516 CANADIAN SYLLABICS SHAA
+1517 CANADIAN SYLLABICS SHWE
+1518 CANADIAN SYLLABICS WEST-CREE SHWE
+1519 CANADIAN SYLLABICS SHWI
+151A CANADIAN SYLLABICS WEST-CREE SHWI
+151B CANADIAN SYLLABICS SHWII
+151C CANADIAN SYLLABICS WEST-CREE SHWII
+151D CANADIAN SYLLABICS SHWO
+151E CANADIAN SYLLABICS WEST-CREE SHWO
+151F CANADIAN SYLLABICS SHWOO
+1520 CANADIAN SYLLABICS WEST-CREE SHWOO
+1521 CANADIAN SYLLABICS SHWA
+1522 CANADIAN SYLLABICS WEST-CREE SHWA
+1523 CANADIAN SYLLABICS SHWAA
+1524 CANADIAN SYLLABICS WEST-CREE SHWAA
+1525 CANADIAN SYLLABICS SH
+1526 CANADIAN SYLLABICS YE
+1527 CANADIAN SYLLABICS YAAI
+1528 CANADIAN SYLLABICS YI
+1529 CANADIAN SYLLABICS YII
+152A CANADIAN SYLLABICS YO
+152B CANADIAN SYLLABICS YOO
+152C CANADIAN SYLLABICS Y-CREE YOO
+152D CANADIAN SYLLABICS YA
+152E CANADIAN SYLLABICS YAA
+152F CANADIAN SYLLABICS YWE
+1530 CANADIAN SYLLABICS WEST-CREE YWE
+1531 CANADIAN SYLLABICS YWI
+1532 CANADIAN SYLLABICS WEST-CREE YWI
+1533 CANADIAN SYLLABICS YWII
+1534 CANADIAN SYLLABICS WEST-CREE YWII
+1535 CANADIAN SYLLABICS YWO
+1536 CANADIAN SYLLABICS WEST-CREE YWO
+1537 CANADIAN SYLLABICS YWOO
+1538 CANADIAN SYLLABICS WEST-CREE YWOO
+1539 CANADIAN SYLLABICS YWA
+153A CANADIAN SYLLABICS WEST-CREE YWA
+153B CANADIAN SYLLABICS YWAA
+153C CANADIAN SYLLABICS WEST-CREE YWAA
+153D CANADIAN SYLLABICS NASKAPI YWAA
+153E CANADIAN SYLLABICS Y
+153F CANADIAN SYLLABICS BIBLE-CREE Y
+1540 CANADIAN SYLLABICS WEST-CREE Y
+1541 CANADIAN SYLLABICS SAYISI YI
+1542 CANADIAN SYLLABICS RE
+1543 CANADIAN SYLLABICS R-CREE RE
+1544 CANADIAN SYLLABICS WEST-CREE LE
+1545 CANADIAN SYLLABICS RAAI
+1546 CANADIAN SYLLABICS RI
+1547 CANADIAN SYLLABICS RII
+1548 CANADIAN SYLLABICS RO
+1549 CANADIAN SYLLABICS ROO
+154A CANADIAN SYLLABICS WEST-CREE LO
+154B CANADIAN SYLLABICS RA
+154C CANADIAN SYLLABICS RAA
+154D CANADIAN SYLLABICS WEST-CREE LA
+154E CANADIAN SYLLABICS RWAA
+154F CANADIAN SYLLABICS WEST-CREE RWAA
+1550 CANADIAN SYLLABICS R
+1551 CANADIAN SYLLABICS WEST-CREE R
+1552 CANADIAN SYLLABICS MEDIAL R
+1553 CANADIAN SYLLABICS FE
+1554 CANADIAN SYLLABICS FAAI
+1555 CANADIAN SYLLABICS FI
+1556 CANADIAN SYLLABICS FII
+1557 CANADIAN SYLLABICS FO
+1558 CANADIAN SYLLABICS FOO
+1559 CANADIAN SYLLABICS FA
+155A CANADIAN SYLLABICS FAA
+155B CANADIAN SYLLABICS FWAA
+155C CANADIAN SYLLABICS WEST-CREE FWAA
+155D CANADIAN SYLLABICS F
+155E CANADIAN SYLLABICS THE
+155F CANADIAN SYLLABICS N-CREE THE
+1560 CANADIAN SYLLABICS THI
+1561 CANADIAN SYLLABICS N-CREE THI
+1562 CANADIAN SYLLABICS THII
+1563 CANADIAN SYLLABICS N-CREE THII
+1564 CANADIAN SYLLABICS THO
+1565 CANADIAN SYLLABICS THOO
+1566 CANADIAN SYLLABICS THA
+1567 CANADIAN SYLLABICS THAA
+1568 CANADIAN SYLLABICS THWAA
+1569 CANADIAN SYLLABICS WEST-CREE THWAA
+156A CANADIAN SYLLABICS TH
+156B CANADIAN SYLLABICS TTHE
+156C CANADIAN SYLLABICS TTHI
+156D CANADIAN SYLLABICS TTHO
+156E CANADIAN SYLLABICS TTHA
+156F CANADIAN SYLLABICS TTH
+1570 CANADIAN SYLLABICS TYE
+1571 CANADIAN SYLLABICS TYI
+1572 CANADIAN SYLLABICS TYO
+1573 CANADIAN SYLLABICS TYA
+1574 CANADIAN SYLLABICS NUNAVIK HE
+1575 CANADIAN SYLLABICS NUNAVIK HI
+1576 CANADIAN SYLLABICS NUNAVIK HII
+1577 CANADIAN SYLLABICS NUNAVIK HO
+1578 CANADIAN SYLLABICS NUNAVIK HOO
+1579 CANADIAN SYLLABICS NUNAVIK HA
+157A CANADIAN SYLLABICS NUNAVIK HAA
+157B CANADIAN SYLLABICS NUNAVIK H
+157C CANADIAN SYLLABICS NUNAVUT H
+157D CANADIAN SYLLABICS HK
+157E CANADIAN SYLLABICS QAAI
+157F CANADIAN SYLLABICS QI
+1580 CANADIAN SYLLABICS QII
+1581 CANADIAN SYLLABICS QO
+1582 CANADIAN SYLLABICS QOO
+1583 CANADIAN SYLLABICS QA
+1584 CANADIAN SYLLABICS QAA
+1585 CANADIAN SYLLABICS Q
+1586 CANADIAN SYLLABICS TLHE
+1587 CANADIAN SYLLABICS TLHI
+1588 CANADIAN SYLLABICS TLHO
+1589 CANADIAN SYLLABICS TLHA
+158A CANADIAN SYLLABICS WEST-CREE RE
+158B CANADIAN SYLLABICS WEST-CREE RI
+158C CANADIAN SYLLABICS WEST-CREE RO
+158D CANADIAN SYLLABICS WEST-CREE RA
+158E CANADIAN SYLLABICS NGAAI
+158F CANADIAN SYLLABICS NGI
+1590 CANADIAN SYLLABICS NGII
+1591 CANADIAN SYLLABICS NGO
+1592 CANADIAN SYLLABICS NGOO
+1593 CANADIAN SYLLABICS NGA
+1594 CANADIAN SYLLABICS NGAA
+1595 CANADIAN SYLLABICS NG
+1596 CANADIAN SYLLABICS NNG
+1597 CANADIAN SYLLABICS SAYISI SHE
+1598 CANADIAN SYLLABICS SAYISI SHI
+1599 CANADIAN SYLLABICS SAYISI SHO
+159A CANADIAN SYLLABICS SAYISI SHA
+159B CANADIAN SYLLABICS WOODS-CREE THE
+159C CANADIAN SYLLABICS WOODS-CREE THI
+159D CANADIAN SYLLABICS WOODS-CREE THO
+159E CANADIAN SYLLABICS WOODS-CREE THA
+159F CANADIAN SYLLABICS WOODS-CREE TH
+15A0 CANADIAN SYLLABICS LHI
+15A1 CANADIAN SYLLABICS LHII
+15A2 CANADIAN SYLLABICS LHO
+15A3 CANADIAN SYLLABICS LHOO
+15A4 CANADIAN SYLLABICS LHA
+15A5 CANADIAN SYLLABICS LHAA
+15A6 CANADIAN SYLLABICS LH
+15A7 CANADIAN SYLLABICS TH-CREE THE
+15A8 CANADIAN SYLLABICS TH-CREE THI
+15A9 CANADIAN SYLLABICS TH-CREE THII
+15AA CANADIAN SYLLABICS TH-CREE THO
+15AB CANADIAN SYLLABICS TH-CREE THOO
+15AC CANADIAN SYLLABICS TH-CREE THA
+15AD CANADIAN SYLLABICS TH-CREE THAA
+15AE CANADIAN SYLLABICS TH-CREE TH
+15AF CANADIAN SYLLABICS AIVILIK B
+15B0 CANADIAN SYLLABICS BLACKFOOT E
+15B1 CANADIAN SYLLABICS BLACKFOOT I
+15B2 CANADIAN SYLLABICS BLACKFOOT O
+15B3 CANADIAN SYLLABICS BLACKFOOT A
+15B4 CANADIAN SYLLABICS BLACKFOOT WE
+15B5 CANADIAN SYLLABICS BLACKFOOT WI
+15B6 CANADIAN SYLLABICS BLACKFOOT WO
+15B7 CANADIAN SYLLABICS BLACKFOOT WA
+15B8 CANADIAN SYLLABICS BLACKFOOT NE
+15B9 CANADIAN SYLLABICS BLACKFOOT NI
+15BA CANADIAN SYLLABICS BLACKFOOT NO
+15BB CANADIAN SYLLABICS BLACKFOOT NA
+15BC CANADIAN SYLLABICS BLACKFOOT KE
+15BD CANADIAN SYLLABICS BLACKFOOT KI
+15BE CANADIAN SYLLABICS BLACKFOOT KO
+15BF CANADIAN SYLLABICS BLACKFOOT KA
+15C0 CANADIAN SYLLABICS SAYISI HE
+15C1 CANADIAN SYLLABICS SAYISI HI
+15C2 CANADIAN SYLLABICS SAYISI HO
+15C3 CANADIAN SYLLABICS SAYISI HA
+15C4 CANADIAN SYLLABICS CARRIER GHU
+15C5 CANADIAN SYLLABICS CARRIER GHO
+15C6 CANADIAN SYLLABICS CARRIER GHE
+15C7 CANADIAN SYLLABICS CARRIER GHEE
+15C8 CANADIAN SYLLABICS CARRIER GHI
+15C9 CANADIAN SYLLABICS CARRIER GHA
+15CA CANADIAN SYLLABICS CARRIER RU
+15CB CANADIAN SYLLABICS CARRIER RO
+15CC CANADIAN SYLLABICS CARRIER RE
+15CD CANADIAN SYLLABICS CARRIER REE
+15CE CANADIAN SYLLABICS CARRIER RI
+15CF CANADIAN SYLLABICS CARRIER RA
+15D0 CANADIAN SYLLABICS CARRIER WU
+15D1 CANADIAN SYLLABICS CARRIER WO
+15D2 CANADIAN SYLLABICS CARRIER WE
+15D3 CANADIAN SYLLABICS CARRIER WEE
+15D4 CANADIAN SYLLABICS CARRIER WI
+15D5 CANADIAN SYLLABICS CARRIER WA
+15D6 CANADIAN SYLLABICS CARRIER HWU
+15D7 CANADIAN SYLLABICS CARRIER HWO
+15D8 CANADIAN SYLLABICS CARRIER HWE
+15D9 CANADIAN SYLLABICS CARRIER HWEE
+15DA CANADIAN SYLLABICS CARRIER HWI
+15DB CANADIAN SYLLABICS CARRIER HWA
+15DC CANADIAN SYLLABICS CARRIER THU
+15DD CANADIAN SYLLABICS CARRIER THO
+15DE CANADIAN SYLLABICS CARRIER THE
+15DF CANADIAN SYLLABICS CARRIER THEE
+15E0 CANADIAN SYLLABICS CARRIER THI
+15E1 CANADIAN SYLLABICS CARRIER THA
+15E2 CANADIAN SYLLABICS CARRIER TTU
+15E3 CANADIAN SYLLABICS CARRIER TTO
+15E4 CANADIAN SYLLABICS CARRIER TTE
+15E5 CANADIAN SYLLABICS CARRIER TTEE
+15E6 CANADIAN SYLLABICS CARRIER TTI
+15E7 CANADIAN SYLLABICS CARRIER TTA
+15E8 CANADIAN SYLLABICS CARRIER PU
+15E9 CANADIAN SYLLABICS CARRIER PO
+15EA CANADIAN SYLLABICS CARRIER PE
+15EB CANADIAN SYLLABICS CARRIER PEE
+15EC CANADIAN SYLLABICS CARRIER PI
+15ED CANADIAN SYLLABICS CARRIER PA
+15EE CANADIAN SYLLABICS CARRIER P
+15EF CANADIAN SYLLABICS CARRIER GU
+15F0 CANADIAN SYLLABICS CARRIER GO
+15F1 CANADIAN SYLLABICS CARRIER GE
+15F2 CANADIAN SYLLABICS CARRIER GEE
+15F3 CANADIAN SYLLABICS CARRIER GI
+15F4 CANADIAN SYLLABICS CARRIER GA
+15F5 CANADIAN SYLLABICS CARRIER KHU
+15F6 CANADIAN SYLLABICS CARRIER KHO
+15F7 CANADIAN SYLLABICS CARRIER KHE
+15F8 CANADIAN SYLLABICS CARRIER KHEE
+15F9 CANADIAN SYLLABICS CARRIER KHI
+15FA CANADIAN SYLLABICS CARRIER KHA
+15FB CANADIAN SYLLABICS CARRIER KKU
+15FC CANADIAN SYLLABICS CARRIER KKO
+15FD CANADIAN SYLLABICS CARRIER KKE
+15FE CANADIAN SYLLABICS CARRIER KKEE
+15FF CANADIAN SYLLABICS CARRIER KKI
+1600 CANADIAN SYLLABICS CARRIER KKA
+1601 CANADIAN SYLLABICS CARRIER KK
+1602 CANADIAN SYLLABICS CARRIER NU
+1603 CANADIAN SYLLABICS CARRIER NO
+1604 CANADIAN SYLLABICS CARRIER NE
+1605 CANADIAN SYLLABICS CARRIER NEE
+1606 CANADIAN SYLLABICS CARRIER NI
+1607 CANADIAN SYLLABICS CARRIER NA
+1608 CANADIAN SYLLABICS CARRIER MU
+1609 CANADIAN SYLLABICS CARRIER MO
+160A CANADIAN SYLLABICS CARRIER ME
+160B CANADIAN SYLLABICS CARRIER MEE
+160C CANADIAN SYLLABICS CARRIER MI
+160D CANADIAN SYLLABICS CARRIER MA
+160E CANADIAN SYLLABICS CARRIER YU
+160F CANADIAN SYLLABICS CARRIER YO
+1610 CANADIAN SYLLABICS CARRIER YE
+1611 CANADIAN SYLLABICS CARRIER YEE
+1612 CANADIAN SYLLABICS CARRIER YI
+1613 CANADIAN SYLLABICS CARRIER YA
+1614 CANADIAN SYLLABICS CARRIER JU
+1615 CANADIAN SYLLABICS SAYISI JU
+1616 CANADIAN SYLLABICS CARRIER JO
+1617 CANADIAN SYLLABICS CARRIER JE
+1618 CANADIAN SYLLABICS CARRIER JEE
+1619 CANADIAN SYLLABICS CARRIER JI
+161A CANADIAN SYLLABICS SAYISI JI
+161B CANADIAN SYLLABICS CARRIER JA
+161C CANADIAN SYLLABICS CARRIER JJU
+161D CANADIAN SYLLABICS CARRIER JJO
+161E CANADIAN SYLLABICS CARRIER JJE
+161F CANADIAN SYLLABICS CARRIER JJEE
+1620 CANADIAN SYLLABICS CARRIER JJI
+1621 CANADIAN SYLLABICS CARRIER JJA
+1622 CANADIAN SYLLABICS CARRIER LU
+1623 CANADIAN SYLLABICS CARRIER LO
+1624 CANADIAN SYLLABICS CARRIER LE
+1625 CANADIAN SYLLABICS CARRIER LEE
+1626 CANADIAN SYLLABICS CARRIER LI
+1627 CANADIAN SYLLABICS CARRIER LA
+1628 CANADIAN SYLLABICS CARRIER DLU
+1629 CANADIAN SYLLABICS CARRIER DLO
+162A CANADIAN SYLLABICS CARRIER DLE
+162B CANADIAN SYLLABICS CARRIER DLEE
+162C CANADIAN SYLLABICS CARRIER DLI
+162D CANADIAN SYLLABICS CARRIER DLA
+162E CANADIAN SYLLABICS CARRIER LHU
+162F CANADIAN SYLLABICS CARRIER LHO
+1630 CANADIAN SYLLABICS CARRIER LHE
+1631 CANADIAN SYLLABICS CARRIER LHEE
+1632 CANADIAN SYLLABICS CARRIER LHI
+1633 CANADIAN SYLLABICS CARRIER LHA
+1634 CANADIAN SYLLABICS CARRIER TLHU
+1635 CANADIAN SYLLABICS CARRIER TLHO
+1636 CANADIAN SYLLABICS CARRIER TLHE
+1637 CANADIAN SYLLABICS CARRIER TLHEE
+1638 CANADIAN SYLLABICS CARRIER TLHI
+1639 CANADIAN SYLLABICS CARRIER TLHA
+163A CANADIAN SYLLABICS CARRIER TLU
+163B CANADIAN SYLLABICS CARRIER TLO
+163C CANADIAN SYLLABICS CARRIER TLE
+163D CANADIAN SYLLABICS CARRIER TLEE
+163E CANADIAN SYLLABICS CARRIER TLI
+163F CANADIAN SYLLABICS CARRIER TLA
+1640 CANADIAN SYLLABICS CARRIER ZU
+1641 CANADIAN SYLLABICS CARRIER ZO
+1642 CANADIAN SYLLABICS CARRIER ZE
+1643 CANADIAN SYLLABICS CARRIER ZEE
+1644 CANADIAN SYLLABICS CARRIER ZI
+1645 CANADIAN SYLLABICS CARRIER ZA
+1646 CANADIAN SYLLABICS CARRIER Z
+1647 CANADIAN SYLLABICS CARRIER INITIAL Z
+1648 CANADIAN SYLLABICS CARRIER DZU
+1649 CANADIAN SYLLABICS CARRIER DZO
+164A CANADIAN SYLLABICS CARRIER DZE
+164B CANADIAN SYLLABICS CARRIER DZEE
+164C CANADIAN SYLLABICS CARRIER DZI
+164D CANADIAN SYLLABICS CARRIER DZA
+164E CANADIAN SYLLABICS CARRIER SU
+164F CANADIAN SYLLABICS CARRIER SO
+1650 CANADIAN SYLLABICS CARRIER SE
+1651 CANADIAN SYLLABICS CARRIER SEE
+1652 CANADIAN SYLLABICS CARRIER SI
+1653 CANADIAN SYLLABICS CARRIER SA
+1654 CANADIAN SYLLABICS CARRIER SHU
+1655 CANADIAN SYLLABICS CARRIER SHO
+1656 CANADIAN SYLLABICS CARRIER SHE
+1657 CANADIAN SYLLABICS CARRIER SHEE
+1658 CANADIAN SYLLABICS CARRIER SHI
+1659 CANADIAN SYLLABICS CARRIER SHA
+165A CANADIAN SYLLABICS CARRIER SH
+165B CANADIAN SYLLABICS CARRIER TSU
+165C CANADIAN SYLLABICS CARRIER TSO
+165D CANADIAN SYLLABICS CARRIER TSE
+165E CANADIAN SYLLABICS CARRIER TSEE
+165F CANADIAN SYLLABICS CARRIER TSI
+1660 CANADIAN SYLLABICS CARRIER TSA
+1661 CANADIAN SYLLABICS CARRIER CHU
+1662 CANADIAN SYLLABICS CARRIER CHO
+1663 CANADIAN SYLLABICS CARRIER CHE
+1664 CANADIAN SYLLABICS CARRIER CHEE
+1665 CANADIAN SYLLABICS CARRIER CHI
+1666 CANADIAN SYLLABICS CARRIER CHA
+1667 CANADIAN SYLLABICS CARRIER TTSU
+1668 CANADIAN SYLLABICS CARRIER TTSO
+1669 CANADIAN SYLLABICS CARRIER TTSE
+166A CANADIAN SYLLABICS CARRIER TTSEE
+166B CANADIAN SYLLABICS CARRIER TTSI
+166C CANADIAN SYLLABICS CARRIER TTSA
+166D CANADIAN SYLLABICS CHI SIGN
+166E CANADIAN SYLLABICS FULL STOP
+166F CANADIAN SYLLABICS QAI
+1670 CANADIAN SYLLABICS NGAI
+1671 CANADIAN SYLLABICS NNGI
+1672 CANADIAN SYLLABICS NNGII
+1673 CANADIAN SYLLABICS NNGO
+1674 CANADIAN SYLLABICS NNGOO
+1675 CANADIAN SYLLABICS NNGA
+1676 CANADIAN SYLLABICS NNGAA
+1680 OGHAM SPACE MARK
+1681 OGHAM LETTER BEITH
+1682 OGHAM LETTER LUIS
+1683 OGHAM LETTER FEARN
+1684 OGHAM LETTER SAIL
+1685 OGHAM LETTER NION
+1686 OGHAM LETTER UATH
+1687 OGHAM LETTER DAIR
+1688 OGHAM LETTER TINNE
+1689 OGHAM LETTER COLL
+168A OGHAM LETTER CEIRT
+168B OGHAM LETTER MUIN
+168C OGHAM LETTER GORT
+168D OGHAM LETTER NGEADAL
+168E OGHAM LETTER STRAIF
+168F OGHAM LETTER RUIS
+1690 OGHAM LETTER AILM
+1691 OGHAM LETTER ONN
+1692 OGHAM LETTER UR
+1693 OGHAM LETTER EADHADH
+1694 OGHAM LETTER IODHADH
+1695 OGHAM LETTER EABHADH
+1696 OGHAM LETTER OR
+1697 OGHAM LETTER UILLEANN
+1698 OGHAM LETTER IFIN
+1699 OGHAM LETTER EAMHANCHOLL
+169A OGHAM LETTER PEITH
+169B OGHAM FEATHER MARK
+169C OGHAM REVERSED FEATHER MARK
+16A0 RUNIC LETTER FEHU FEOH FE F
+16A1 RUNIC LETTER V
+16A2 RUNIC LETTER URUZ UR U
+16A3 RUNIC LETTER YR
+16A4 RUNIC LETTER Y
+16A5 RUNIC LETTER W
+16A6 RUNIC LETTER THURISAZ THURS THORN
+16A7 RUNIC LETTER ETH
+16A8 RUNIC LETTER ANSUZ A
+16A9 RUNIC LETTER OS O
+16AA RUNIC LETTER AC A
+16AB RUNIC LETTER AESC
+16AC RUNIC LETTER LONG-BRANCH-OSS O
+16AD RUNIC LETTER SHORT-TWIG-OSS O
+16AE RUNIC LETTER O
+16AF RUNIC LETTER OE
+16B0 RUNIC LETTER ON
+16B1 RUNIC LETTER RAIDO RAD REID R
+16B2 RUNIC LETTER KAUNA
+16B3 RUNIC LETTER CEN
+16B4 RUNIC LETTER KAUN K
+16B5 RUNIC LETTER G
+16B6 RUNIC LETTER ENG
+16B7 RUNIC LETTER GEBO GYFU G
+16B8 RUNIC LETTER GAR
+16B9 RUNIC LETTER WUNJO WYNN W
+16BA RUNIC LETTER HAGLAZ H
+16BB RUNIC LETTER HAEGL H
+16BC RUNIC LETTER LONG-BRANCH-HAGALL H
+16BD RUNIC LETTER SHORT-TWIG-HAGALL H
+16BE RUNIC LETTER NAUDIZ NYD NAUD N
+16BF RUNIC LETTER SHORT-TWIG-NAUD N
+16C0 RUNIC LETTER DOTTED-N
+16C1 RUNIC LETTER ISAZ IS ISS I
+16C2 RUNIC LETTER E
+16C3 RUNIC LETTER JERAN J
+16C4 RUNIC LETTER GER
+16C5 RUNIC LETTER LONG-BRANCH-AR AE
+16C6 RUNIC LETTER SHORT-TWIG-AR A
+16C7 RUNIC LETTER IWAZ EOH
+16C8 RUNIC LETTER PERTHO PEORTH P
+16C9 RUNIC LETTER ALGIZ EOLHX
+16CA RUNIC LETTER SOWILO S
+16CB RUNIC LETTER SIGEL LONG-BRANCH-SOL S
+16CC RUNIC LETTER SHORT-TWIG-SOL S
+16CD RUNIC LETTER C
+16CE RUNIC LETTER Z
+16CF RUNIC LETTER TIWAZ TIR TYR T
+16D0 RUNIC LETTER SHORT-TWIG-TYR T
+16D1 RUNIC LETTER D
+16D2 RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3 RUNIC LETTER SHORT-TWIG-BJARKAN B
+16D4 RUNIC LETTER DOTTED-P
+16D5 RUNIC LETTER OPEN-P
+16D6 RUNIC LETTER EHWAZ EH E
+16D7 RUNIC LETTER MANNAZ MAN M
+16D8 RUNIC LETTER LONG-BRANCH-MADR M
+16D9 RUNIC LETTER SHORT-TWIG-MADR M
+16DA RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB RUNIC LETTER DOTTED-L
+16DC RUNIC LETTER INGWAZ
+16DD RUNIC LETTER ING
+16DE RUNIC LETTER DAGAZ DAEG D
+16DF RUNIC LETTER OTHALAN ETHEL O
+16E0 RUNIC LETTER EAR
+16E1 RUNIC LETTER IOR
+16E2 RUNIC LETTER CWEORTH
+16E3 RUNIC LETTER CALC
+16E4 RUNIC LETTER CEALC
+16E5 RUNIC LETTER STAN
+16E6 RUNIC LETTER LONG-BRANCH-YR
+16E7 RUNIC LETTER SHORT-TWIG-YR
+16E8 RUNIC LETTER ICELANDIC-YR
+16E9 RUNIC LETTER Q
+16EA RUNIC LETTER X
+16EB RUNIC SINGLE PUNCTUATION
+16EC RUNIC MULTIPLE PUNCTUATION
+16ED RUNIC CROSS PUNCTUATION
+16EE RUNIC ARLAUG SYMBOL
+16EF RUNIC TVIMADUR SYMBOL
+16F0 RUNIC BELGTHOR SYMBOL
+1700 TAGALOG LETTER A
+1701 TAGALOG LETTER I
+1702 TAGALOG LETTER U
+1703 TAGALOG LETTER KA
+1704 TAGALOG LETTER GA
+1705 TAGALOG LETTER NGA
+1706 TAGALOG LETTER TA
+1707 TAGALOG LETTER DA
+1708 TAGALOG LETTER NA
+1709 TAGALOG LETTER PA
+170A TAGALOG LETTER BA
+170B TAGALOG LETTER MA
+170C TAGALOG LETTER YA
+170E TAGALOG LETTER LA
+170F TAGALOG LETTER WA
+1710 TAGALOG LETTER SA
+1711 TAGALOG LETTER HA
+1712 TAGALOG VOWEL SIGN I
+1713 TAGALOG VOWEL SIGN U
+1714 TAGALOG SIGN VIRAMA
+1720 HANUNOO LETTER A
+1721 HANUNOO LETTER I
+1722 HANUNOO LETTER U
+1723 HANUNOO LETTER KA
+1724 HANUNOO LETTER GA
+1725 HANUNOO LETTER NGA
+1726 HANUNOO LETTER TA
+1727 HANUNOO LETTER DA
+1728 HANUNOO LETTER NA
+1729 HANUNOO LETTER PA
+172A HANUNOO LETTER BA
+172B HANUNOO LETTER MA
+172C HANUNOO LETTER YA
+172D HANUNOO LETTER RA
+172E HANUNOO LETTER LA
+172F HANUNOO LETTER WA
+1730 HANUNOO LETTER SA
+1731 HANUNOO LETTER HA
+1732 HANUNOO VOWEL SIGN I
+1733 HANUNOO VOWEL SIGN U
+1734 HANUNOO SIGN PAMUDPOD
+1735 PHILIPPINE SINGLE PUNCTUATION
+1736 PHILIPPINE DOUBLE PUNCTUATION
+1740 BUHID LETTER A
+1741 BUHID LETTER I
+1742 BUHID LETTER U
+1743 BUHID LETTER KA
+1744 BUHID LETTER GA
+1745 BUHID LETTER NGA
+1746 BUHID LETTER TA
+1747 BUHID LETTER DA
+1748 BUHID LETTER NA
+1749 BUHID LETTER PA
+174A BUHID LETTER BA
+174B BUHID LETTER MA
+174C BUHID LETTER YA
+174D BUHID LETTER RA
+174E BUHID LETTER LA
+174F BUHID LETTER WA
+1750 BUHID LETTER SA
+1751 BUHID LETTER HA
+1752 BUHID VOWEL SIGN I
+1753 BUHID VOWEL SIGN U
+1760 TAGBANWA LETTER A
+1761 TAGBANWA LETTER I
+1762 TAGBANWA LETTER U
+1763 TAGBANWA LETTER KA
+1764 TAGBANWA LETTER GA
+1765 TAGBANWA LETTER NGA
+1766 TAGBANWA LETTER TA
+1767 TAGBANWA LETTER DA
+1768 TAGBANWA LETTER NA
+1769 TAGBANWA LETTER PA
+176A TAGBANWA LETTER BA
+176B TAGBANWA LETTER MA
+176C TAGBANWA LETTER YA
+176E TAGBANWA LETTER LA
+176F TAGBANWA LETTER WA
+1770 TAGBANWA LETTER SA
+1772 TAGBANWA VOWEL SIGN I
+1773 TAGBANWA VOWEL SIGN U
+1780 KHMER LETTER KA
+1781 KHMER LETTER KHA
+1782 KHMER LETTER KO
+1783 KHMER LETTER KHO
+1784 KHMER LETTER NGO
+1785 KHMER LETTER CA
+1786 KHMER LETTER CHA
+1787 KHMER LETTER CO
+1788 KHMER LETTER CHO
+1789 KHMER LETTER NYO
+178A KHMER LETTER DA
+178B KHMER LETTER TTHA
+178C KHMER LETTER DO
+178D KHMER LETTER TTHO
+178E KHMER LETTER NNO
+178F KHMER LETTER TA
+1790 KHMER LETTER THA
+1791 KHMER LETTER TO
+1792 KHMER LETTER THO
+1793 KHMER LETTER NO
+1794 KHMER LETTER BA
+1795 KHMER LETTER PHA
+1796 KHMER LETTER PO
+1797 KHMER LETTER PHO
+1798 KHMER LETTER MO
+1799 KHMER LETTER YO
+179A KHMER LETTER RO
+179B KHMER LETTER LO
+179C KHMER LETTER VO
+179D KHMER LETTER SHA
+179E KHMER LETTER SSO
+179F KHMER LETTER SA
+17A0 KHMER LETTER HA
+17A1 KHMER LETTER LA
+17A2 KHMER LETTER QA
+17A3 KHMER INDEPENDENT VOWEL QAQ
+17A4 KHMER INDEPENDENT VOWEL QAA
+17A5 KHMER INDEPENDENT VOWEL QI
+17A6 KHMER INDEPENDENT VOWEL QII
+17A7 KHMER INDEPENDENT VOWEL QU
+17A8 KHMER INDEPENDENT VOWEL QUK
+17A9 KHMER INDEPENDENT VOWEL QUU
+17AA KHMER INDEPENDENT VOWEL QUUV
+17AB KHMER INDEPENDENT VOWEL RY
+17AC KHMER INDEPENDENT VOWEL RYY
+17AD KHMER INDEPENDENT VOWEL LY
+17AE KHMER INDEPENDENT VOWEL LYY
+17AF KHMER INDEPENDENT VOWEL QE
+17B0 KHMER INDEPENDENT VOWEL QAI
+17B1 KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2 KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3 KHMER INDEPENDENT VOWEL QAU
+17B4 KHMER VOWEL INHERENT AQ
+17B5 KHMER VOWEL INHERENT AA
+17B6 KHMER VOWEL SIGN AA
+17B7 KHMER VOWEL SIGN I
+17B8 KHMER VOWEL SIGN II
+17B9 KHMER VOWEL SIGN Y
+17BA KHMER VOWEL SIGN YY
+17BB KHMER VOWEL SIGN U
+17BC KHMER VOWEL SIGN UU
+17BD KHMER VOWEL SIGN UA
+17BE KHMER VOWEL SIGN OE
+17BF KHMER VOWEL SIGN YA
+17C0 KHMER VOWEL SIGN IE
+17C1 KHMER VOWEL SIGN E
+17C2 KHMER VOWEL SIGN AE
+17C3 KHMER VOWEL SIGN AI
+17C4 KHMER VOWEL SIGN OO
+17C5 KHMER VOWEL SIGN AU
+17C6 KHMER SIGN NIKAHIT
+17C7 KHMER SIGN REAHMUK
+17C8 KHMER SIGN YUUKALEAPINTU
+17C9 KHMER SIGN MUUSIKATOAN
+17CA KHMER SIGN TRIISAP
+17CB KHMER SIGN BANTOC
+17CC KHMER SIGN ROBAT
+17CD KHMER SIGN TOANDAKHIAT
+17CE KHMER SIGN KAKABAT
+17CF KHMER SIGN AHSDA
+17D0 KHMER SIGN SAMYOK SANNYA
+17D1 KHMER SIGN VIRIAM
+17D2 KHMER SIGN COENG
+17D3 KHMER SIGN BATHAMASAT
+17D4 KHMER SIGN KHAN
+17D5 KHMER SIGN BARIYOOSAN
+17D6 KHMER SIGN CAMNUC PII KUUH
+17D7 KHMER SIGN LEK TOO
+17D8 KHMER SIGN BEYYAL
+17D9 KHMER SIGN PHNAEK MUAN
+17DA KHMER SIGN KOOMUUT
+17DB KHMER CURRENCY SYMBOL RIEL
+17DC KHMER SIGN AVAKRAHASANYA
+17DD KHMER SIGN ATTHACAN
+17E0 KHMER DIGIT ZERO
+17E1 KHMER DIGIT ONE
+17E2 KHMER DIGIT TWO
+17E3 KHMER DIGIT THREE
+17E4 KHMER DIGIT FOUR
+17E5 KHMER DIGIT FIVE
+17E6 KHMER DIGIT SIX
+17E7 KHMER DIGIT SEVEN
+17E8 KHMER DIGIT EIGHT
+17E9 KHMER DIGIT NINE
+17F0 KHMER SYMBOL LEK ATTAK SON
+17F1 KHMER SYMBOL LEK ATTAK MUOY
+17F2 KHMER SYMBOL LEK ATTAK PII
+17F3 KHMER SYMBOL LEK ATTAK BEI
+17F4 KHMER SYMBOL LEK ATTAK BUON
+17F5 KHMER SYMBOL LEK ATTAK PRAM
+17F6 KHMER SYMBOL LEK ATTAK PRAM-MUOY
+17F7 KHMER SYMBOL LEK ATTAK PRAM-PII
+17F8 KHMER SYMBOL LEK ATTAK PRAM-BEI
+17F9 KHMER SYMBOL LEK ATTAK PRAM-BUON
+1800 MONGOLIAN BIRGA
+1801 MONGOLIAN ELLIPSIS
+1802 MONGOLIAN COMMA
+1803 MONGOLIAN FULL STOP
+1804 MONGOLIAN COLON
+1805 MONGOLIAN FOUR DOTS
+1806 MONGOLIAN TODO SOFT HYPHEN
+1807 MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808 MONGOLIAN MANCHU COMMA
+1809 MONGOLIAN MANCHU FULL STOP
+180A MONGOLIAN NIRUGU
+180B MONGOLIAN FREE VARIATION SELECTOR ONE
+180C MONGOLIAN FREE VARIATION SELECTOR TWO
+180D MONGOLIAN FREE VARIATION SELECTOR THREE
+180E MONGOLIAN VOWEL SEPARATOR
+1810 MONGOLIAN DIGIT ZERO
+1811 MONGOLIAN DIGIT ONE
+1812 MONGOLIAN DIGIT TWO
+1813 MONGOLIAN DIGIT THREE
+1814 MONGOLIAN DIGIT FOUR
+1815 MONGOLIAN DIGIT FIVE
+1816 MONGOLIAN DIGIT SIX
+1817 MONGOLIAN DIGIT SEVEN
+1818 MONGOLIAN DIGIT EIGHT
+1819 MONGOLIAN DIGIT NINE
+1820 MONGOLIAN LETTER A
+1821 MONGOLIAN LETTER E
+1822 MONGOLIAN LETTER I
+1823 MONGOLIAN LETTER O
+1824 MONGOLIAN LETTER U
+1825 MONGOLIAN LETTER OE
+1826 MONGOLIAN LETTER UE
+1827 MONGOLIAN LETTER EE
+1828 MONGOLIAN LETTER NA
+1829 MONGOLIAN LETTER ANG
+182A MONGOLIAN LETTER BA
+182B MONGOLIAN LETTER PA
+182C MONGOLIAN LETTER QA
+182D MONGOLIAN LETTER GA
+182E MONGOLIAN LETTER MA
+182F MONGOLIAN LETTER LA
+1830 MONGOLIAN LETTER SA
+1831 MONGOLIAN LETTER SHA
+1832 MONGOLIAN LETTER TA
+1833 MONGOLIAN LETTER DA
+1834 MONGOLIAN LETTER CHA
+1835 MONGOLIAN LETTER JA
+1836 MONGOLIAN LETTER YA
+1837 MONGOLIAN LETTER RA
+1838 MONGOLIAN LETTER WA
+1839 MONGOLIAN LETTER FA
+183A MONGOLIAN LETTER KA
+183B MONGOLIAN LETTER KHA
+183C MONGOLIAN LETTER TSA
+183D MONGOLIAN LETTER ZA
+183E MONGOLIAN LETTER HAA
+183F MONGOLIAN LETTER ZRA
+1840 MONGOLIAN LETTER LHA
+1841 MONGOLIAN LETTER ZHI
+1842 MONGOLIAN LETTER CHI
+1843 MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844 MONGOLIAN LETTER TODO E
+1845 MONGOLIAN LETTER TODO I
+1846 MONGOLIAN LETTER TODO O
+1847 MONGOLIAN LETTER TODO U
+1848 MONGOLIAN LETTER TODO OE
+1849 MONGOLIAN LETTER TODO UE
+184A MONGOLIAN LETTER TODO ANG
+184B MONGOLIAN LETTER TODO BA
+184C MONGOLIAN LETTER TODO PA
+184D MONGOLIAN LETTER TODO QA
+184E MONGOLIAN LETTER TODO GA
+184F MONGOLIAN LETTER TODO MA
+1850 MONGOLIAN LETTER TODO TA
+1851 MONGOLIAN LETTER TODO DA
+1852 MONGOLIAN LETTER TODO CHA
+1853 MONGOLIAN LETTER TODO JA
+1854 MONGOLIAN LETTER TODO TSA
+1855 MONGOLIAN LETTER TODO YA
+1856 MONGOLIAN LETTER TODO WA
+1857 MONGOLIAN LETTER TODO KA
+1858 MONGOLIAN LETTER TODO GAA
+1859 MONGOLIAN LETTER TODO HAA
+185A MONGOLIAN LETTER TODO JIA
+185B MONGOLIAN LETTER TODO NIA
+185C MONGOLIAN LETTER TODO DZA
+185D MONGOLIAN LETTER SIBE E
+185E MONGOLIAN LETTER SIBE I
+185F MONGOLIAN LETTER SIBE IY
+1860 MONGOLIAN LETTER SIBE UE
+1861 MONGOLIAN LETTER SIBE U
+1862 MONGOLIAN LETTER SIBE ANG
+1863 MONGOLIAN LETTER SIBE KA
+1864 MONGOLIAN LETTER SIBE GA
+1865 MONGOLIAN LETTER SIBE HA
+1866 MONGOLIAN LETTER SIBE PA
+1867 MONGOLIAN LETTER SIBE SHA
+1868 MONGOLIAN LETTER SIBE TA
+1869 MONGOLIAN LETTER SIBE DA
+186A MONGOLIAN LETTER SIBE JA
+186B MONGOLIAN LETTER SIBE FA
+186C MONGOLIAN LETTER SIBE GAA
+186D MONGOLIAN LETTER SIBE HAA
+186E MONGOLIAN LETTER SIBE TSA
+186F MONGOLIAN LETTER SIBE ZA
+1870 MONGOLIAN LETTER SIBE RAA
+1871 MONGOLIAN LETTER SIBE CHA
+1872 MONGOLIAN LETTER SIBE ZHA
+1873 MONGOLIAN LETTER MANCHU I
+1874 MONGOLIAN LETTER MANCHU KA
+1875 MONGOLIAN LETTER MANCHU RA
+1876 MONGOLIAN LETTER MANCHU FA
+1877 MONGOLIAN LETTER MANCHU ZHA
+1880 MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881 MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882 MONGOLIAN LETTER ALI GALI DAMARU
+1883 MONGOLIAN LETTER ALI GALI UBADAMA
+1884 MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885 MONGOLIAN LETTER ALI GALI BALUDA
+1886 MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887 MONGOLIAN LETTER ALI GALI A
+1888 MONGOLIAN LETTER ALI GALI I
+1889 MONGOLIAN LETTER ALI GALI KA
+188A MONGOLIAN LETTER ALI GALI NGA
+188B MONGOLIAN LETTER ALI GALI CA
+188C MONGOLIAN LETTER ALI GALI TTA
+188D MONGOLIAN LETTER ALI GALI TTHA
+188E MONGOLIAN LETTER ALI GALI DDA
+188F MONGOLIAN LETTER ALI GALI NNA
+1890 MONGOLIAN LETTER ALI GALI TA
+1891 MONGOLIAN LETTER ALI GALI DA
+1892 MONGOLIAN LETTER ALI GALI PA
+1893 MONGOLIAN LETTER ALI GALI PHA
+1894 MONGOLIAN LETTER ALI GALI SSA
+1895 MONGOLIAN LETTER ALI GALI ZHA
+1896 MONGOLIAN LETTER ALI GALI ZA
+1897 MONGOLIAN LETTER ALI GALI AH
+1898 MONGOLIAN LETTER TODO ALI GALI TA
+1899 MONGOLIAN LETTER TODO ALI GALI ZHA
+189A MONGOLIAN LETTER MANCHU ALI GALI GHA
+189B MONGOLIAN LETTER MANCHU ALI GALI NGA
+189C MONGOLIAN LETTER MANCHU ALI GALI CA
+189D MONGOLIAN LETTER MANCHU ALI GALI JHA
+189E MONGOLIAN LETTER MANCHU ALI GALI TTA
+189F MONGOLIAN LETTER MANCHU ALI GALI DDHA
+18A0 MONGOLIAN LETTER MANCHU ALI GALI TA
+18A1 MONGOLIAN LETTER MANCHU ALI GALI DHA
+18A2 MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A3 MONGOLIAN LETTER MANCHU ALI GALI CYA
+18A4 MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5 MONGOLIAN LETTER MANCHU ALI GALI ZA
+18A6 MONGOLIAN LETTER ALI GALI HALF U
+18A7 MONGOLIAN LETTER ALI GALI HALF YA
+18A8 MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9 MONGOLIAN LETTER ALI GALI DAGALGA
+18AA MONGOLIAN LETTER MANCHU ALI GALI LHA
+1900 LIMBU VOWEL-CARRIER LETTER
+1901 LIMBU LETTER KA
+1902 LIMBU LETTER KHA
+1903 LIMBU LETTER GA
+1904 LIMBU LETTER GHA
+1905 LIMBU LETTER NGA
+1906 LIMBU LETTER CA
+1907 LIMBU LETTER CHA
+1908 LIMBU LETTER JA
+1909 LIMBU LETTER JHA
+190A LIMBU LETTER YAN
+190B LIMBU LETTER TA
+190C LIMBU LETTER THA
+190D LIMBU LETTER DA
+190E LIMBU LETTER DHA
+190F LIMBU LETTER NA
+1910 LIMBU LETTER PA
+1911 LIMBU LETTER PHA
+1912 LIMBU LETTER BA
+1913 LIMBU LETTER BHA
+1914 LIMBU LETTER MA
+1915 LIMBU LETTER YA
+1916 LIMBU LETTER RA
+1917 LIMBU LETTER LA
+1918 LIMBU LETTER WA
+1919 LIMBU LETTER SHA
+191A LIMBU LETTER SSA
+191B LIMBU LETTER SA
+191C LIMBU LETTER HA
+1920 LIMBU VOWEL SIGN A
+1921 LIMBU VOWEL SIGN I
+1922 LIMBU VOWEL SIGN U
+1923 LIMBU VOWEL SIGN EE
+1924 LIMBU VOWEL SIGN AI
+1925 LIMBU VOWEL SIGN OO
+1926 LIMBU VOWEL SIGN AU
+1927 LIMBU VOWEL SIGN E
+1928 LIMBU VOWEL SIGN O
+1929 LIMBU SUBJOINED LETTER YA
+192A LIMBU SUBJOINED LETTER RA
+192B LIMBU SUBJOINED LETTER WA
+1930 LIMBU SMALL LETTER KA
+1931 LIMBU SMALL LETTER NGA
+1932 LIMBU SMALL LETTER ANUSVARA
+1933 LIMBU SMALL LETTER TA
+1934 LIMBU SMALL LETTER NA
+1935 LIMBU SMALL LETTER PA
+1936 LIMBU SMALL LETTER MA
+1937 LIMBU SMALL LETTER RA
+1938 LIMBU SMALL LETTER LA
+1939 LIMBU SIGN MUKPHRENG
+193A LIMBU SIGN KEMPHRENG
+193B LIMBU SIGN SA-I
+1940 LIMBU SIGN LOO
+1944 LIMBU EXCLAMATION MARK
+1945 LIMBU QUESTION MARK
+1946 LIMBU DIGIT ZERO
+1947 LIMBU DIGIT ONE
+1948 LIMBU DIGIT TWO
+1949 LIMBU DIGIT THREE
+194A LIMBU DIGIT FOUR
+194B LIMBU DIGIT FIVE
+194C LIMBU DIGIT SIX
+194D LIMBU DIGIT SEVEN
+194E LIMBU DIGIT EIGHT
+194F LIMBU DIGIT NINE
+1950 TAI LE LETTER KA
+1951 TAI LE LETTER XA
+1952 TAI LE LETTER NGA
+1953 TAI LE LETTER TSA
+1954 TAI LE LETTER SA
+1955 TAI LE LETTER YA
+1956 TAI LE LETTER TA
+1957 TAI LE LETTER THA
+1958 TAI LE LETTER LA
+1959 TAI LE LETTER PA
+195A TAI LE LETTER PHA
+195B TAI LE LETTER MA
+195C TAI LE LETTER FA
+195D TAI LE LETTER VA
+195E TAI LE LETTER HA
+195F TAI LE LETTER QA
+1960 TAI LE LETTER KHA
+1961 TAI LE LETTER TSHA
+1962 TAI LE LETTER NA
+1963 TAI LE LETTER A
+1964 TAI LE LETTER I
+1965 TAI LE LETTER EE
+1966 TAI LE LETTER EH
+1967 TAI LE LETTER U
+1968 TAI LE LETTER OO
+1969 TAI LE LETTER O
+196A TAI LE LETTER UE
+196B TAI LE LETTER E
+196C TAI LE LETTER AUE
+196D TAI LE LETTER AI
+1970 TAI LE LETTER TONE-2
+1971 TAI LE LETTER TONE-3
+1972 TAI LE LETTER TONE-4
+1973 TAI LE LETTER TONE-5
+1974 TAI LE LETTER TONE-6
+1980 NEW TAI LUE LETTER HIGH QA
+1981 NEW TAI LUE LETTER LOW QA
+1982 NEW TAI LUE LETTER HIGH KA
+1983 NEW TAI LUE LETTER HIGH XA
+1984 NEW TAI LUE LETTER HIGH NGA
+1985 NEW TAI LUE LETTER LOW KA
+1986 NEW TAI LUE LETTER LOW XA
+1987 NEW TAI LUE LETTER LOW NGA
+1988 NEW TAI LUE LETTER HIGH TSA
+1989 NEW TAI LUE LETTER HIGH SA
+198A NEW TAI LUE LETTER HIGH YA
+198B NEW TAI LUE LETTER LOW TSA
+198C NEW TAI LUE LETTER LOW SA
+198D NEW TAI LUE LETTER LOW YA
+198E NEW TAI LUE LETTER HIGH TA
+198F NEW TAI LUE LETTER HIGH THA
+1990 NEW TAI LUE LETTER HIGH NA
+1991 NEW TAI LUE LETTER LOW TA
+1992 NEW TAI LUE LETTER LOW THA
+1993 NEW TAI LUE LETTER LOW NA
+1994 NEW TAI LUE LETTER HIGH PA
+1995 NEW TAI LUE LETTER HIGH PHA
+1996 NEW TAI LUE LETTER HIGH MA
+1997 NEW TAI LUE LETTER LOW PA
+1998 NEW TAI LUE LETTER LOW PHA
+1999 NEW TAI LUE LETTER LOW MA
+199A NEW TAI LUE LETTER HIGH FA
+199B NEW TAI LUE LETTER HIGH VA
+199C NEW TAI LUE LETTER HIGH LA
+199D NEW TAI LUE LETTER LOW FA
+199E NEW TAI LUE LETTER LOW VA
+199F NEW TAI LUE LETTER LOW LA
+19A0 NEW TAI LUE LETTER HIGH HA
+19A1 NEW TAI LUE LETTER HIGH DA
+19A2 NEW TAI LUE LETTER HIGH BA
+19A3 NEW TAI LUE LETTER LOW HA
+19A4 NEW TAI LUE LETTER LOW DA
+19A5 NEW TAI LUE LETTER LOW BA
+19A6 NEW TAI LUE LETTER HIGH KVA
+19A7 NEW TAI LUE LETTER HIGH XVA
+19A8 NEW TAI LUE LETTER LOW KVA
+19A9 NEW TAI LUE LETTER LOW XVA
+19B0 NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
+19B1 NEW TAI LUE VOWEL SIGN AA
+19B2 NEW TAI LUE VOWEL SIGN II
+19B3 NEW TAI LUE VOWEL SIGN U
+19B4 NEW TAI LUE VOWEL SIGN UU
+19B5 NEW TAI LUE VOWEL SIGN E
+19B6 NEW TAI LUE VOWEL SIGN AE
+19B7 NEW TAI LUE VOWEL SIGN O
+19B8 NEW TAI LUE VOWEL SIGN OA
+19B9 NEW TAI LUE VOWEL SIGN UE
+19BA NEW TAI LUE VOWEL SIGN AY
+19BB NEW TAI LUE VOWEL SIGN AAY
+19BC NEW TAI LUE VOWEL SIGN UY
+19BD NEW TAI LUE VOWEL SIGN OY
+19BE NEW TAI LUE VOWEL SIGN OAY
+19BF NEW TAI LUE VOWEL SIGN UEY
+19C0 NEW TAI LUE VOWEL SIGN IY
+19C1 NEW TAI LUE LETTER FINAL V
+19C2 NEW TAI LUE LETTER FINAL NG
+19C3 NEW TAI LUE LETTER FINAL N
+19C4 NEW TAI LUE LETTER FINAL M
+19C5 NEW TAI LUE LETTER FINAL K
+19C6 NEW TAI LUE LETTER FINAL D
+19C7 NEW TAI LUE LETTER FINAL B
+19C8 NEW TAI LUE TONE MARK-1
+19C9 NEW TAI LUE TONE MARK-2
+19D0 NEW TAI LUE DIGIT ZERO
+19D1 NEW TAI LUE DIGIT ONE
+19D2 NEW TAI LUE DIGIT TWO
+19D3 NEW TAI LUE DIGIT THREE
+19D4 NEW TAI LUE DIGIT FOUR
+19D5 NEW TAI LUE DIGIT FIVE
+19D6 NEW TAI LUE DIGIT SIX
+19D7 NEW TAI LUE DIGIT SEVEN
+19D8 NEW TAI LUE DIGIT EIGHT
+19D9 NEW TAI LUE DIGIT NINE
+19DE NEW TAI LUE SIGN LAE
+19DF NEW TAI LUE SIGN LAEV
+19E0 KHMER SYMBOL PATHAMASAT
+19E1 KHMER SYMBOL MUOY KOET
+19E2 KHMER SYMBOL PII KOET
+19E3 KHMER SYMBOL BEI KOET
+19E4 KHMER SYMBOL BUON KOET
+19E5 KHMER SYMBOL PRAM KOET
+19E6 KHMER SYMBOL PRAM-MUOY KOET
+19E7 KHMER SYMBOL PRAM-PII KOET
+19E8 KHMER SYMBOL PRAM-BEI KOET
+19E9 KHMER SYMBOL PRAM-BUON KOET
+19EA KHMER SYMBOL DAP KOET
+19EB KHMER SYMBOL DAP-MUOY KOET
+19EC KHMER SYMBOL DAP-PII KOET
+19ED KHMER SYMBOL DAP-BEI KOET
+19EE KHMER SYMBOL DAP-BUON KOET
+19EF KHMER SYMBOL DAP-PRAM KOET
+19F0 KHMER SYMBOL TUTEYASAT
+19F1 KHMER SYMBOL MUOY ROC
+19F2 KHMER SYMBOL PII ROC
+19F3 KHMER SYMBOL BEI ROC
+19F4 KHMER SYMBOL BUON ROC
+19F5 KHMER SYMBOL PRAM ROC
+19F6 KHMER SYMBOL PRAM-MUOY ROC
+19F7 KHMER SYMBOL PRAM-PII ROC
+19F8 KHMER SYMBOL PRAM-BEI ROC
+19F9 KHMER SYMBOL PRAM-BUON ROC
+19FA KHMER SYMBOL DAP ROC
+19FB KHMER SYMBOL DAP-MUOY ROC
+19FC KHMER SYMBOL DAP-PII ROC
+19FD KHMER SYMBOL DAP-BEI ROC
+19FE KHMER SYMBOL DAP-BUON ROC
+19FF KHMER SYMBOL DAP-PRAM ROC
+1A00 BUGINESE LETTER KA
+1A01 BUGINESE LETTER GA
+1A02 BUGINESE LETTER NGA
+1A03 BUGINESE LETTER NGKA
+1A04 BUGINESE LETTER PA
+1A05 BUGINESE LETTER BA
+1A06 BUGINESE LETTER MA
+1A07 BUGINESE LETTER MPA
+1A08 BUGINESE LETTER TA
+1A09 BUGINESE LETTER DA
+1A0A BUGINESE LETTER NA
+1A0B BUGINESE LETTER NRA
+1A0C BUGINESE LETTER CA
+1A0D BUGINESE LETTER JA
+1A0E BUGINESE LETTER NYA
+1A0F BUGINESE LETTER NYCA
+1A10 BUGINESE LETTER YA
+1A11 BUGINESE LETTER RA
+1A12 BUGINESE LETTER LA
+1A13 BUGINESE LETTER VA
+1A14 BUGINESE LETTER SA
+1A15 BUGINESE LETTER A
+1A16 BUGINESE LETTER HA
+1A17 BUGINESE VOWEL SIGN I
+1A18 BUGINESE VOWEL SIGN U
+1A19 BUGINESE VOWEL SIGN E
+1A1A BUGINESE VOWEL SIGN O
+1A1B BUGINESE VOWEL SIGN AE
+1A1E BUGINESE PALLAWA
+1A1F BUGINESE END OF SECTION
+1B00 BALINESE SIGN ULU RICEM
+1B01 BALINESE SIGN ULU CANDRA
+1B02 BALINESE SIGN CECEK
+1B03 BALINESE SIGN SURANG
+1B04 BALINESE SIGN BISAH
+1B05 BALINESE LETTER AKARA
+1B06 BALINESE LETTER AKARA TEDUNG
+1B07 BALINESE LETTER IKARA
+1B08 BALINESE LETTER IKARA TEDUNG
+1B09 BALINESE LETTER UKARA
+1B0A BALINESE LETTER UKARA TEDUNG
+1B0B BALINESE LETTER RA REPA
+1B0C BALINESE LETTER RA REPA TEDUNG
+1B0D BALINESE LETTER LA LENGA
+1B0E BALINESE LETTER LA LENGA TEDUNG
+1B0F BALINESE LETTER EKARA
+1B10 BALINESE LETTER AIKARA
+1B11 BALINESE LETTER OKARA
+1B12 BALINESE LETTER OKARA TEDUNG
+1B13 BALINESE LETTER KA
+1B14 BALINESE LETTER KA MAHAPRANA
+1B15 BALINESE LETTER GA
+1B16 BALINESE LETTER GA GORA
+1B17 BALINESE LETTER NGA
+1B18 BALINESE LETTER CA
+1B19 BALINESE LETTER CA LACA
+1B1A BALINESE LETTER JA
+1B1B BALINESE LETTER JA JERA
+1B1C BALINESE LETTER NYA
+1B1D BALINESE LETTER TA LATIK
+1B1E BALINESE LETTER TA MURDA MAHAPRANA
+1B1F BALINESE LETTER DA MURDA ALPAPRANA
+1B20 BALINESE LETTER DA MURDA MAHAPRANA
+1B21 BALINESE LETTER NA RAMBAT
+1B22 BALINESE LETTER TA
+1B23 BALINESE LETTER TA TAWA
+1B24 BALINESE LETTER DA
+1B25 BALINESE LETTER DA MADU
+1B26 BALINESE LETTER NA
+1B27 BALINESE LETTER PA
+1B28 BALINESE LETTER PA KAPAL
+1B29 BALINESE LETTER BA
+1B2A BALINESE LETTER BA KEMBANG
+1B2B BALINESE LETTER MA
+1B2C BALINESE LETTER YA
+1B2D BALINESE LETTER RA
+1B2E BALINESE LETTER LA
+1B2F BALINESE LETTER WA
+1B30 BALINESE LETTER SA SAGA
+1B31 BALINESE LETTER SA SAPA
+1B32 BALINESE LETTER SA
+1B33 BALINESE LETTER HA
+1B34 BALINESE SIGN REREKAN
+1B35 BALINESE VOWEL SIGN TEDUNG
+1B36 BALINESE VOWEL SIGN ULU
+1B37 BALINESE VOWEL SIGN ULU SARI
+1B38 BALINESE VOWEL SIGN SUKU
+1B39 BALINESE VOWEL SIGN SUKU ILUT
+1B3A BALINESE VOWEL SIGN RA REPA
+1B3B BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C BALINESE VOWEL SIGN LA LENGA
+1B3D BALINESE VOWEL SIGN LA LENGA TEDUNG
+1B3E BALINESE VOWEL SIGN TALING
+1B3F BALINESE VOWEL SIGN TALING REPA
+1B40 BALINESE VOWEL SIGN TALING TEDUNG
+1B41 BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42 BALINESE VOWEL SIGN PEPET
+1B43 BALINESE VOWEL SIGN PEPET TEDUNG
+1B44 BALINESE ADEG ADEG
+1B45 BALINESE LETTER KAF SASAK
+1B46 BALINESE LETTER KHOT SASAK
+1B47 BALINESE LETTER TZIR SASAK
+1B48 BALINESE LETTER EF SASAK
+1B49 BALINESE LETTER VE SASAK
+1B4A BALINESE LETTER ZAL SASAK
+1B4B BALINESE LETTER ASYURA SASAK
+1B50 BALINESE DIGIT ZERO
+1B51 BALINESE DIGIT ONE
+1B52 BALINESE DIGIT TWO
+1B53 BALINESE DIGIT THREE
+1B54 BALINESE DIGIT FOUR
+1B55 BALINESE DIGIT FIVE
+1B56 BALINESE DIGIT SIX
+1B57 BALINESE DIGIT SEVEN
+1B58 BALINESE DIGIT EIGHT
+1B59 BALINESE DIGIT NINE
+1B5A BALINESE PANTI
+1B5B BALINESE PAMADA
+1B5C BALINESE WINDU
+1B5D BALINESE CARIK PAMUNGKAH
+1B5E BALINESE CARIK SIKI
+1B5F BALINESE CARIK PAREREN
+1B60 BALINESE PAMENENG
+1B61 BALINESE MUSICAL SYMBOL DONG
+1B62 BALINESE MUSICAL SYMBOL DENG
+1B63 BALINESE MUSICAL SYMBOL DUNG
+1B64 BALINESE MUSICAL SYMBOL DANG
+1B65 BALINESE MUSICAL SYMBOL DANG SURANG
+1B66 BALINESE MUSICAL SYMBOL DING
+1B67 BALINESE MUSICAL SYMBOL DAENG
+1B68 BALINESE MUSICAL SYMBOL DEUNG
+1B69 BALINESE MUSICAL SYMBOL DAING
+1B6A BALINESE MUSICAL SYMBOL DANG GEDE
+1B6B BALINESE MUSICAL SYMBOL COMBINING TEGEH
+1B6C BALINESE MUSICAL SYMBOL COMBINING ENDEP
+1B6D BALINESE MUSICAL SYMBOL COMBINING KEMPUL
+1B6E BALINESE MUSICAL SYMBOL COMBINING KEMPLI
+1B6F BALINESE MUSICAL SYMBOL COMBINING JEGOGAN
+1B70 BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN
+1B71 BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN
+1B72 BALINESE MUSICAL SYMBOL COMBINING BENDE
+1B73 BALINESE MUSICAL SYMBOL COMBINING GONG
+1B74 BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG
+1B75 BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG
+1B76 BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK
+1B77 BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK
+1B78 BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG
+1B79 BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG
+1B7A BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK
+1B7B BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK
+1B7C BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+1B80 SUNDANESE SIGN PANYECEK
+1B81 SUNDANESE SIGN PANGLAYAR
+1B82 SUNDANESE SIGN PANGWISAD
+1B83 SUNDANESE LETTER A
+1B84 SUNDANESE LETTER I
+1B85 SUNDANESE LETTER U
+1B86 SUNDANESE LETTER AE
+1B87 SUNDANESE LETTER O
+1B88 SUNDANESE LETTER E
+1B89 SUNDANESE LETTER EU
+1B8A SUNDANESE LETTER KA
+1B8B SUNDANESE LETTER QA
+1B8C SUNDANESE LETTER GA
+1B8D SUNDANESE LETTER NGA
+1B8E SUNDANESE LETTER CA
+1B8F SUNDANESE LETTER JA
+1B90 SUNDANESE LETTER ZA
+1B91 SUNDANESE LETTER NYA
+1B92 SUNDANESE LETTER TA
+1B93 SUNDANESE LETTER DA
+1B94 SUNDANESE LETTER NA
+1B95 SUNDANESE LETTER PA
+1B96 SUNDANESE LETTER FA
+1B97 SUNDANESE LETTER VA
+1B98 SUNDANESE LETTER BA
+1B99 SUNDANESE LETTER MA
+1B9A SUNDANESE LETTER YA
+1B9B SUNDANESE LETTER RA
+1B9C SUNDANESE LETTER LA
+1B9D SUNDANESE LETTER WA
+1B9E SUNDANESE LETTER SA
+1B9F SUNDANESE LETTER XA
+1BA0 SUNDANESE LETTER HA
+1BA1 SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA2 SUNDANESE CONSONANT SIGN PANYAKRA
+1BA3 SUNDANESE CONSONANT SIGN PANYIKU
+1BA4 SUNDANESE VOWEL SIGN PANGHULU
+1BA5 SUNDANESE VOWEL SIGN PANYUKU
+1BA6 SUNDANESE VOWEL SIGN PANAELAENG
+1BA7 SUNDANESE VOWEL SIGN PANOLONG
+1BA8 SUNDANESE VOWEL SIGN PAMEPET
+1BA9 SUNDANESE VOWEL SIGN PANEULEUNG
+1BAA SUNDANESE SIGN PAMAAEH
+1BAE SUNDANESE LETTER KHA
+1BAF SUNDANESE LETTER SYA
+1BB0 SUNDANESE DIGIT ZERO
+1BB1 SUNDANESE DIGIT ONE
+1BB2 SUNDANESE DIGIT TWO
+1BB3 SUNDANESE DIGIT THREE
+1BB4 SUNDANESE DIGIT FOUR
+1BB5 SUNDANESE DIGIT FIVE
+1BB6 SUNDANESE DIGIT SIX
+1BB7 SUNDANESE DIGIT SEVEN
+1BB8 SUNDANESE DIGIT EIGHT
+1BB9 SUNDANESE DIGIT NINE
+1C00 LEPCHA LETTER KA
+1C01 LEPCHA LETTER KLA
+1C02 LEPCHA LETTER KHA
+1C03 LEPCHA LETTER GA
+1C04 LEPCHA LETTER GLA
+1C05 LEPCHA LETTER NGA
+1C06 LEPCHA LETTER CA
+1C07 LEPCHA LETTER CHA
+1C08 LEPCHA LETTER JA
+1C09 LEPCHA LETTER NYA
+1C0A LEPCHA LETTER TA
+1C0B LEPCHA LETTER THA
+1C0C LEPCHA LETTER DA
+1C0D LEPCHA LETTER NA
+1C0E LEPCHA LETTER PA
+1C0F LEPCHA LETTER PLA
+1C10 LEPCHA LETTER PHA
+1C11 LEPCHA LETTER FA
+1C12 LEPCHA LETTER FLA
+1C13 LEPCHA LETTER BA
+1C14 LEPCHA LETTER BLA
+1C15 LEPCHA LETTER MA
+1C16 LEPCHA LETTER MLA
+1C17 LEPCHA LETTER TSA
+1C18 LEPCHA LETTER TSHA
+1C19 LEPCHA LETTER DZA
+1C1A LEPCHA LETTER YA
+1C1B LEPCHA LETTER RA
+1C1C LEPCHA LETTER LA
+1C1D LEPCHA LETTER HA
+1C1E LEPCHA LETTER HLA
+1C1F LEPCHA LETTER VA
+1C20 LEPCHA LETTER SA
+1C21 LEPCHA LETTER SHA
+1C22 LEPCHA LETTER WA
+1C23 LEPCHA LETTER A
+1C24 LEPCHA SUBJOINED LETTER YA
+1C25 LEPCHA SUBJOINED LETTER RA
+1C26 LEPCHA VOWEL SIGN AA
+1C27 LEPCHA VOWEL SIGN I
+1C28 LEPCHA VOWEL SIGN O
+1C29 LEPCHA VOWEL SIGN OO
+1C2A LEPCHA VOWEL SIGN U
+1C2B LEPCHA VOWEL SIGN UU
+1C2C LEPCHA VOWEL SIGN E
+1C2D LEPCHA CONSONANT SIGN K
+1C2E LEPCHA CONSONANT SIGN M
+1C2F LEPCHA CONSONANT SIGN L
+1C30 LEPCHA CONSONANT SIGN N
+1C31 LEPCHA CONSONANT SIGN P
+1C32 LEPCHA CONSONANT SIGN R
+1C33 LEPCHA CONSONANT SIGN T
+1C34 LEPCHA CONSONANT SIGN NYIN-DO
+1C35 LEPCHA CONSONANT SIGN KANG
+1C36 LEPCHA SIGN RAN
+1C37 LEPCHA SIGN NUKTA
+1C3B LEPCHA PUNCTUATION TA-ROL
+1C3C LEPCHA PUNCTUATION NYET THYOOM TA-ROL
+1C3D LEPCHA PUNCTUATION CER-WA
+1C3E LEPCHA PUNCTUATION TSHOOK CER-WA
+1C3F LEPCHA PUNCTUATION TSHOOK
+1C40 LEPCHA DIGIT ZERO
+1C41 LEPCHA DIGIT ONE
+1C42 LEPCHA DIGIT TWO
+1C43 LEPCHA DIGIT THREE
+1C44 LEPCHA DIGIT FOUR
+1C45 LEPCHA DIGIT FIVE
+1C46 LEPCHA DIGIT SIX
+1C47 LEPCHA DIGIT SEVEN
+1C48 LEPCHA DIGIT EIGHT
+1C49 LEPCHA DIGIT NINE
+1C4D LEPCHA LETTER TTA
+1C4E LEPCHA LETTER TTHA
+1C4F LEPCHA LETTER DDA
+1C50 OL CHIKI DIGIT ZERO
+1C51 OL CHIKI DIGIT ONE
+1C52 OL CHIKI DIGIT TWO
+1C53 OL CHIKI DIGIT THREE
+1C54 OL CHIKI DIGIT FOUR
+1C55 OL CHIKI DIGIT FIVE
+1C56 OL CHIKI DIGIT SIX
+1C57 OL CHIKI DIGIT SEVEN
+1C58 OL CHIKI DIGIT EIGHT
+1C59 OL CHIKI DIGIT NINE
+1C5A OL CHIKI LETTER LA
+1C5B OL CHIKI LETTER AT
+1C5C OL CHIKI LETTER AG
+1C5D OL CHIKI LETTER ANG
+1C5E OL CHIKI LETTER AL
+1C5F OL CHIKI LETTER LAA
+1C60 OL CHIKI LETTER AAK
+1C61 OL CHIKI LETTER AAJ
+1C62 OL CHIKI LETTER AAM
+1C63 OL CHIKI LETTER AAW
+1C64 OL CHIKI LETTER LI
+1C65 OL CHIKI LETTER IS
+1C66 OL CHIKI LETTER IH
+1C67 OL CHIKI LETTER INY
+1C68 OL CHIKI LETTER IR
+1C69 OL CHIKI LETTER LU
+1C6A OL CHIKI LETTER UC
+1C6B OL CHIKI LETTER UD
+1C6C OL CHIKI LETTER UNN
+1C6D OL CHIKI LETTER UY
+1C6E OL CHIKI LETTER LE
+1C6F OL CHIKI LETTER EP
+1C70 OL CHIKI LETTER EDD
+1C71 OL CHIKI LETTER EN
+1C72 OL CHIKI LETTER ERR
+1C73 OL CHIKI LETTER LO
+1C74 OL CHIKI LETTER OTT
+1C75 OL CHIKI LETTER OB
+1C76 OL CHIKI LETTER OV
+1C77 OL CHIKI LETTER OH
+1C78 OL CHIKI MU TTUDDAG
+1C79 OL CHIKI GAAHLAA TTUDDAAG
+1C7A OL CHIKI MU-GAAHLAA TTUDDAAG
+1C7B OL CHIKI RELAA
+1C7C OL CHIKI PHAARKAA
+1C7D OL CHIKI AHAD
+1C7E OL CHIKI PUNCTUATION MUCAAD
+1C7F OL CHIKI PUNCTUATION DOUBLE MUCAAD
+1D00 LATIN LETTER SMALL CAPITAL A
+1D01 LATIN LETTER SMALL CAPITAL AE
+1D02 LATIN SMALL LETTER TURNED AE
+1D03 LATIN LETTER SMALL CAPITAL BARRED B
+1D04 LATIN LETTER SMALL CAPITAL C
+1D05 LATIN LETTER SMALL CAPITAL D
+1D06 LATIN LETTER SMALL CAPITAL ETH
+1D07 LATIN LETTER SMALL CAPITAL E
+1D08 LATIN SMALL LETTER TURNED OPEN E
+1D09 LATIN SMALL LETTER TURNED I
+1D0A LATIN LETTER SMALL CAPITAL J
+1D0B LATIN LETTER SMALL CAPITAL K
+1D0C LATIN LETTER SMALL CAPITAL L WITH STROKE
+1D0D LATIN LETTER SMALL CAPITAL M
+1D0E LATIN LETTER SMALL CAPITAL REVERSED N
+1D0F LATIN LETTER SMALL CAPITAL O
+1D10 LATIN LETTER SMALL CAPITAL OPEN O
+1D11 LATIN SMALL LETTER SIDEWAYS O
+1D12 LATIN SMALL LETTER SIDEWAYS OPEN O
+1D13 LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+1D14 LATIN SMALL LETTER TURNED OE
+1D15 LATIN LETTER SMALL CAPITAL OU
+1D16 LATIN SMALL LETTER TOP HALF O
+1D17 LATIN SMALL LETTER BOTTOM HALF O
+1D18 LATIN LETTER SMALL CAPITAL P
+1D19 LATIN LETTER SMALL CAPITAL REVERSED R
+1D1A LATIN LETTER SMALL CAPITAL TURNED R
+1D1B LATIN LETTER SMALL CAPITAL T
+1D1C LATIN LETTER SMALL CAPITAL U
+1D1D LATIN SMALL LETTER SIDEWAYS U
+1D1E LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D1F LATIN SMALL LETTER SIDEWAYS TURNED M
+1D20 LATIN LETTER SMALL CAPITAL V
+1D21 LATIN LETTER SMALL CAPITAL W
+1D22 LATIN LETTER SMALL CAPITAL Z
+1D23 LATIN LETTER SMALL CAPITAL EZH
+1D24 LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25 LATIN LETTER AIN
+1D26 GREEK LETTER SMALL CAPITAL GAMMA
+1D27 GREEK LETTER SMALL CAPITAL LAMDA
+1D28 GREEK LETTER SMALL CAPITAL PI
+1D29 GREEK LETTER SMALL CAPITAL RHO
+1D2A GREEK LETTER SMALL CAPITAL PSI
+1D2B CYRILLIC LETTER SMALL CAPITAL EL
+1D2C MODIFIER LETTER CAPITAL A
+1D2D MODIFIER LETTER CAPITAL AE
+1D2E MODIFIER LETTER CAPITAL B
+1D2F MODIFIER LETTER CAPITAL BARRED B
+1D30 MODIFIER LETTER CAPITAL D
+1D31 MODIFIER LETTER CAPITAL E
+1D32 MODIFIER LETTER CAPITAL REVERSED E
+1D33 MODIFIER LETTER CAPITAL G
+1D34 MODIFIER LETTER CAPITAL H
+1D35 MODIFIER LETTER CAPITAL I
+1D36 MODIFIER LETTER CAPITAL J
+1D37 MODIFIER LETTER CAPITAL K
+1D38 MODIFIER LETTER CAPITAL L
+1D39 MODIFIER LETTER CAPITAL M
+1D3A MODIFIER LETTER CAPITAL N
+1D3B MODIFIER LETTER CAPITAL REVERSED N
+1D3C MODIFIER LETTER CAPITAL O
+1D3D MODIFIER LETTER CAPITAL OU
+1D3E MODIFIER LETTER CAPITAL P
+1D3F MODIFIER LETTER CAPITAL R
+1D40 MODIFIER LETTER CAPITAL T
+1D41 MODIFIER LETTER CAPITAL U
+1D42 MODIFIER LETTER CAPITAL W
+1D43 MODIFIER LETTER SMALL A
+1D44 MODIFIER LETTER SMALL TURNED A
+1D45 MODIFIER LETTER SMALL ALPHA
+1D46 MODIFIER LETTER SMALL TURNED AE
+1D47 MODIFIER LETTER SMALL B
+1D48 MODIFIER LETTER SMALL D
+1D49 MODIFIER LETTER SMALL E
+1D4A MODIFIER LETTER SMALL SCHWA
+1D4B MODIFIER LETTER SMALL OPEN E
+1D4C MODIFIER LETTER SMALL TURNED OPEN E
+1D4D MODIFIER LETTER SMALL G
+1D4E MODIFIER LETTER SMALL TURNED I
+1D4F MODIFIER LETTER SMALL K
+1D50 MODIFIER LETTER SMALL M
+1D51 MODIFIER LETTER SMALL ENG
+1D52 MODIFIER LETTER SMALL O
+1D53 MODIFIER LETTER SMALL OPEN O
+1D54 MODIFIER LETTER SMALL TOP HALF O
+1D55 MODIFIER LETTER SMALL BOTTOM HALF O
+1D56 MODIFIER LETTER SMALL P
+1D57 MODIFIER LETTER SMALL T
+1D58 MODIFIER LETTER SMALL U
+1D59 MODIFIER LETTER SMALL SIDEWAYS U
+1D5A MODIFIER LETTER SMALL TURNED M
+1D5B MODIFIER LETTER SMALL V
+1D5C MODIFIER LETTER SMALL AIN
+1D5D MODIFIER LETTER SMALL BETA
+1D5E MODIFIER LETTER SMALL GREEK GAMMA
+1D5F MODIFIER LETTER SMALL DELTA
+1D60 MODIFIER LETTER SMALL GREEK PHI
+1D61 MODIFIER LETTER SMALL CHI
+1D62 LATIN SUBSCRIPT SMALL LETTER I
+1D63 LATIN SUBSCRIPT SMALL LETTER R
+1D64 LATIN SUBSCRIPT SMALL LETTER U
+1D65 LATIN SUBSCRIPT SMALL LETTER V
+1D66 GREEK SUBSCRIPT SMALL LETTER BETA
+1D67 GREEK SUBSCRIPT SMALL LETTER GAMMA
+1D68 GREEK SUBSCRIPT SMALL LETTER RHO
+1D69 GREEK SUBSCRIPT SMALL LETTER PHI
+1D6A GREEK SUBSCRIPT SMALL LETTER CHI
+1D6B LATIN SMALL LETTER UE
+1D6C LATIN SMALL LETTER B WITH MIDDLE TILDE
+1D6D LATIN SMALL LETTER D WITH MIDDLE TILDE
+1D6E LATIN SMALL LETTER F WITH MIDDLE TILDE
+1D6F LATIN SMALL LETTER M WITH MIDDLE TILDE
+1D70 LATIN SMALL LETTER N WITH MIDDLE TILDE
+1D71 LATIN SMALL LETTER P WITH MIDDLE TILDE
+1D72 LATIN SMALL LETTER R WITH MIDDLE TILDE
+1D73 LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
+1D74 LATIN SMALL LETTER S WITH MIDDLE TILDE
+1D75 LATIN SMALL LETTER T WITH MIDDLE TILDE
+1D76 LATIN SMALL LETTER Z WITH MIDDLE TILDE
+1D77 LATIN SMALL LETTER TURNED G
+1D78 MODIFIER LETTER CYRILLIC EN
+1D79 LATIN SMALL LETTER INSULAR G
+1D7A LATIN SMALL LETTER TH WITH STRIKETHROUGH
+1D7B LATIN SMALL CAPITAL LETTER I WITH STROKE
+1D7C LATIN SMALL LETTER IOTA WITH STROKE
+1D7D LATIN SMALL LETTER P WITH STROKE
+1D7E LATIN SMALL CAPITAL LETTER U WITH STROKE
+1D7F LATIN SMALL LETTER UPSILON WITH STROKE
+1D80 LATIN SMALL LETTER B WITH PALATAL HOOK
+1D81 LATIN SMALL LETTER D WITH PALATAL HOOK
+1D82 LATIN SMALL LETTER F WITH PALATAL HOOK
+1D83 LATIN SMALL LETTER G WITH PALATAL HOOK
+1D84 LATIN SMALL LETTER K WITH PALATAL HOOK
+1D85 LATIN SMALL LETTER L WITH PALATAL HOOK
+1D86 LATIN SMALL LETTER M WITH PALATAL HOOK
+1D87 LATIN SMALL LETTER N WITH PALATAL HOOK
+1D88 LATIN SMALL LETTER P WITH PALATAL HOOK
+1D89 LATIN SMALL LETTER R WITH PALATAL HOOK
+1D8A LATIN SMALL LETTER S WITH PALATAL HOOK
+1D8B LATIN SMALL LETTER ESH WITH PALATAL HOOK
+1D8C LATIN SMALL LETTER V WITH PALATAL HOOK
+1D8D LATIN SMALL LETTER X WITH PALATAL HOOK
+1D8E LATIN SMALL LETTER Z WITH PALATAL HOOK
+1D8F LATIN SMALL LETTER A WITH RETROFLEX HOOK
+1D90 LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK
+1D91 LATIN SMALL LETTER D WITH HOOK AND TAIL
+1D92 LATIN SMALL LETTER E WITH RETROFLEX HOOK
+1D93 LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
+1D94 LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK
+1D95 LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK
+1D96 LATIN SMALL LETTER I WITH RETROFLEX HOOK
+1D97 LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
+1D98 LATIN SMALL LETTER ESH WITH RETROFLEX HOOK
+1D99 LATIN SMALL LETTER U WITH RETROFLEX HOOK
+1D9A LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B MODIFIER LETTER SMALL TURNED ALPHA
+1D9C MODIFIER LETTER SMALL C
+1D9D MODIFIER LETTER SMALL C WITH CURL
+1D9E MODIFIER LETTER SMALL ETH
+1D9F MODIFIER LETTER SMALL REVERSED OPEN E
+1DA0 MODIFIER LETTER SMALL F
+1DA1 MODIFIER LETTER SMALL DOTLESS J WITH STROKE
+1DA2 MODIFIER LETTER SMALL SCRIPT G
+1DA3 MODIFIER LETTER SMALL TURNED H
+1DA4 MODIFIER LETTER SMALL I WITH STROKE
+1DA5 MODIFIER LETTER SMALL IOTA
+1DA6 MODIFIER LETTER SMALL CAPITAL I
+1DA7 MODIFIER LETTER SMALL CAPITAL I WITH STROKE
+1DA8 MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+1DA9 MODIFIER LETTER SMALL L WITH RETROFLEX HOOK
+1DAA MODIFIER LETTER SMALL L WITH PALATAL HOOK
+1DAB MODIFIER LETTER SMALL CAPITAL L
+1DAC MODIFIER LETTER SMALL M WITH HOOK
+1DAD MODIFIER LETTER SMALL TURNED M WITH LONG LEG
+1DAE MODIFIER LETTER SMALL N WITH LEFT HOOK
+1DAF MODIFIER LETTER SMALL N WITH RETROFLEX HOOK
+1DB0 MODIFIER LETTER SMALL CAPITAL N
+1DB1 MODIFIER LETTER SMALL BARRED O
+1DB2 MODIFIER LETTER SMALL PHI
+1DB3 MODIFIER LETTER SMALL S WITH HOOK
+1DB4 MODIFIER LETTER SMALL ESH
+1DB5 MODIFIER LETTER SMALL T WITH PALATAL HOOK
+1DB6 MODIFIER LETTER SMALL U BAR
+1DB7 MODIFIER LETTER SMALL UPSILON
+1DB8 MODIFIER LETTER SMALL CAPITAL U
+1DB9 MODIFIER LETTER SMALL V WITH HOOK
+1DBA MODIFIER LETTER SMALL TURNED V
+1DBB MODIFIER LETTER SMALL Z
+1DBC MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK
+1DBD MODIFIER LETTER SMALL Z WITH CURL
+1DBE MODIFIER LETTER SMALL EZH
+1DBF MODIFIER LETTER SMALL THETA
+1DC0 COMBINING DOTTED GRAVE ACCENT
+1DC1 COMBINING DOTTED ACUTE ACCENT
+1DC2 COMBINING SNAKE BELOW
+1DC3 COMBINING SUSPENSION MARK
+1DC4 COMBINING MACRON-ACUTE
+1DC5 COMBINING GRAVE-MACRON
+1DC6 COMBINING MACRON-GRAVE
+1DC7 COMBINING ACUTE-MACRON
+1DC8 COMBINING GRAVE-ACUTE-GRAVE
+1DC9 COMBINING ACUTE-GRAVE-ACUTE
+1DCA COMBINING LATIN SMALL LETTER R BELOW
+1DCB COMBINING BREVE-MACRON
+1DCC COMBINING MACRON-BREVE
+1DCD COMBINING DOUBLE CIRCUMFLEX ABOVE
+1DCE COMBINING OGONEK ABOVE
+1DCF COMBINING ZIGZAG BELOW
+1DD0 COMBINING IS BELOW
+1DD1 COMBINING UR ABOVE
+1DD2 COMBINING US ABOVE
+1DD3 COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE
+1DD4 COMBINING LATIN SMALL LETTER AE
+1DD5 COMBINING LATIN SMALL LETTER AO
+1DD6 COMBINING LATIN SMALL LETTER AV
+1DD7 COMBINING LATIN SMALL LETTER C CEDILLA
+1DD8 COMBINING LATIN SMALL LETTER INSULAR D
+1DD9 COMBINING LATIN SMALL LETTER ETH
+1DDA COMBINING LATIN SMALL LETTER G
+1DDB COMBINING LATIN LETTER SMALL CAPITAL G
+1DDC COMBINING LATIN SMALL LETTER K
+1DDD COMBINING LATIN SMALL LETTER L
+1DDE COMBINING LATIN LETTER SMALL CAPITAL L
+1DDF COMBINING LATIN LETTER SMALL CAPITAL M
+1DE0 COMBINING LATIN SMALL LETTER N
+1DE1 COMBINING LATIN LETTER SMALL CAPITAL N
+1DE2 COMBINING LATIN LETTER SMALL CAPITAL R
+1DE3 COMBINING LATIN SMALL LETTER R ROTUNDA
+1DE4 COMBINING LATIN SMALL LETTER S
+1DE5 COMBINING LATIN SMALL LETTER LONG S
+1DE6 COMBINING LATIN SMALL LETTER Z
+1DFE COMBINING LEFT ARROWHEAD ABOVE
+1DFF COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1E00 LATIN CAPITAL LETTER A WITH RING BELOW
+1E01 LATIN SMALL LETTER A WITH RING BELOW
+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E03 LATIN SMALL LETTER B WITH DOT ABOVE
+1E04 LATIN CAPITAL LETTER B WITH DOT BELOW
+1E05 LATIN SMALL LETTER B WITH DOT BELOW
+1E06 LATIN CAPITAL LETTER B WITH LINE BELOW
+1E07 LATIN SMALL LETTER B WITH LINE BELOW
+1E08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E09 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0B LATIN SMALL LETTER D WITH DOT ABOVE
+1E0C LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0D LATIN SMALL LETTER D WITH DOT BELOW
+1E0E LATIN CAPITAL LETTER D WITH LINE BELOW
+1E0F LATIN SMALL LETTER D WITH LINE BELOW
+1E10 LATIN CAPITAL LETTER D WITH CEDILLA
+1E11 LATIN SMALL LETTER D WITH CEDILLA
+1E12 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E13 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1E14 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E15 LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1E16 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E17 LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1E18 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E19 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1E1A LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1B LATIN SMALL LETTER E WITH TILDE BELOW
+1E1C LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1D LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E1F LATIN SMALL LETTER F WITH DOT ABOVE
+1E20 LATIN CAPITAL LETTER G WITH MACRON
+1E21 LATIN SMALL LETTER G WITH MACRON
+1E22 LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E23 LATIN SMALL LETTER H WITH DOT ABOVE
+1E24 LATIN CAPITAL LETTER H WITH DOT BELOW
+1E25 LATIN SMALL LETTER H WITH DOT BELOW
+1E26 LATIN CAPITAL LETTER H WITH DIAERESIS
+1E27 LATIN SMALL LETTER H WITH DIAERESIS
+1E28 LATIN CAPITAL LETTER H WITH CEDILLA
+1E29 LATIN SMALL LETTER H WITH CEDILLA
+1E2A LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2B LATIN SMALL LETTER H WITH BREVE BELOW
+1E2C LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2D LATIN SMALL LETTER I WITH TILDE BELOW
+1E2E LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E2F LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1E30 LATIN CAPITAL LETTER K WITH ACUTE
+1E31 LATIN SMALL LETTER K WITH ACUTE
+1E32 LATIN CAPITAL LETTER K WITH DOT BELOW
+1E33 LATIN SMALL LETTER K WITH DOT BELOW
+1E34 LATIN CAPITAL LETTER K WITH LINE BELOW
+1E35 LATIN SMALL LETTER K WITH LINE BELOW
+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW
+1E37 LATIN SMALL LETTER L WITH DOT BELOW
+1E38 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E39 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1E3A LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3B LATIN SMALL LETTER L WITH LINE BELOW
+1E3C LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3D LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1E3E LATIN CAPITAL LETTER M WITH ACUTE
+1E3F LATIN SMALL LETTER M WITH ACUTE
+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E41 LATIN SMALL LETTER M WITH DOT ABOVE
+1E42 LATIN CAPITAL LETTER M WITH DOT BELOW
+1E43 LATIN SMALL LETTER M WITH DOT BELOW
+1E44 LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E45 LATIN SMALL LETTER N WITH DOT ABOVE
+1E46 LATIN CAPITAL LETTER N WITH DOT BELOW
+1E47 LATIN SMALL LETTER N WITH DOT BELOW
+1E48 LATIN CAPITAL LETTER N WITH LINE BELOW
+1E49 LATIN SMALL LETTER N WITH LINE BELOW
+1E4A LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4B LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1E4C LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4D LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1E4E LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E4F LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1E50 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E51 LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1E52 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E53 LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1E54 LATIN CAPITAL LETTER P WITH ACUTE
+1E55 LATIN SMALL LETTER P WITH ACUTE
+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E57 LATIN SMALL LETTER P WITH DOT ABOVE
+1E58 LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E59 LATIN SMALL LETTER R WITH DOT ABOVE
+1E5A LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5B LATIN SMALL LETTER R WITH DOT BELOW
+1E5C LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5D LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1E5E LATIN CAPITAL LETTER R WITH LINE BELOW
+1E5F LATIN SMALL LETTER R WITH LINE BELOW
+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E61 LATIN SMALL LETTER S WITH DOT ABOVE
+1E62 LATIN CAPITAL LETTER S WITH DOT BELOW
+1E63 LATIN SMALL LETTER S WITH DOT BELOW
+1E64 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E65 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1E66 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E67 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1E68 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6B LATIN SMALL LETTER T WITH DOT ABOVE
+1E6C LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6D LATIN SMALL LETTER T WITH DOT BELOW
+1E6E LATIN CAPITAL LETTER T WITH LINE BELOW
+1E6F LATIN SMALL LETTER T WITH LINE BELOW
+1E70 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E71 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1E72 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E73 LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1E74 LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E75 LATIN SMALL LETTER U WITH TILDE BELOW
+1E76 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E77 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1E78 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E79 LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1E7A LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7B LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1E7C LATIN CAPITAL LETTER V WITH TILDE
+1E7D LATIN SMALL LETTER V WITH TILDE
+1E7E LATIN CAPITAL LETTER V WITH DOT BELOW
+1E7F LATIN SMALL LETTER V WITH DOT BELOW
+1E80 LATIN CAPITAL LETTER W WITH GRAVE
+1E81 LATIN SMALL LETTER W WITH GRAVE
+1E82 LATIN CAPITAL LETTER W WITH ACUTE
+1E83 LATIN SMALL LETTER W WITH ACUTE
+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS
+1E85 LATIN SMALL LETTER W WITH DIAERESIS
+1E86 LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E87 LATIN SMALL LETTER W WITH DOT ABOVE
+1E88 LATIN CAPITAL LETTER W WITH DOT BELOW
+1E89 LATIN SMALL LETTER W WITH DOT BELOW
+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8B LATIN SMALL LETTER X WITH DOT ABOVE
+1E8C LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8D LATIN SMALL LETTER X WITH DIAERESIS
+1E8E LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E8F LATIN SMALL LETTER Y WITH DOT ABOVE
+1E90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E91 LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1E92 LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E93 LATIN SMALL LETTER Z WITH DOT BELOW
+1E94 LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E95 LATIN SMALL LETTER Z WITH LINE BELOW
+1E96 LATIN SMALL LETTER H WITH LINE BELOW
+1E97 LATIN SMALL LETTER T WITH DIAERESIS
+1E98 LATIN SMALL LETTER W WITH RING ABOVE
+1E99 LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A LATIN SMALL LETTER A WITH RIGHT HALF RING
+1E9B LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1E9C LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE
+1E9D LATIN SMALL LETTER LONG S WITH HIGH STROKE
+1E9E LATIN CAPITAL LETTER SHARP S
+1E9F LATIN SMALL LETTER DELTA
+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA1 LATIN SMALL LETTER A WITH DOT BELOW
+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE
+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE
+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW
+1EB9 LATIN SMALL LETTER E WITH DOT BELOW
+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE
+1EBC LATIN CAPITAL LETTER E WITH TILDE
+1EBD LATIN SMALL LETTER E WITH TILDE
+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE
+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECB LATIN SMALL LETTER I WITH DOT BELOW
+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECD LATIN SMALL LETTER O WITH DOT BELOW
+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE
+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE
+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE
+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE
+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE5 LATIN SMALL LETTER U WITH DOT BELOW
+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE
+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE
+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE
+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE
+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE
+1EF3 LATIN SMALL LETTER Y WITH GRAVE
+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW
+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE
+1EF8 LATIN CAPITAL LETTER Y WITH TILDE
+1EF9 LATIN SMALL LETTER Y WITH TILDE
+1EFA LATIN CAPITAL LETTER MIDDLE-WELSH LL
+1EFB LATIN SMALL LETTER MIDDLE-WELSH LL
+1EFC LATIN CAPITAL LETTER MIDDLE-WELSH V
+1EFD LATIN SMALL LETTER MIDDLE-WELSH V
+1EFE LATIN CAPITAL LETTER Y WITH LOOP
+1EFF LATIN SMALL LETTER Y WITH LOOP
+1F00 GREEK SMALL LETTER ALPHA WITH PSILI
+1F01 GREEK SMALL LETTER ALPHA WITH DASIA
+1F02 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+1F03 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+1F04 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+1F05 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+1F06 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F07 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F08 GREEK CAPITAL LETTER ALPHA WITH PSILI
+1F09 GREEK CAPITAL LETTER ALPHA WITH DASIA
+1F0A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1F0B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1F0C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1F0D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1F0E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F0F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F10 GREEK SMALL LETTER EPSILON WITH PSILI
+1F11 GREEK SMALL LETTER EPSILON WITH DASIA
+1F12 GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+1F13 GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+1F14 GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+1F15 GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18 GREEK CAPITAL LETTER EPSILON WITH PSILI
+1F19 GREEK CAPITAL LETTER EPSILON WITH DASIA
+1F1A GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1F1B GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1F1C GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1F1D GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20 GREEK SMALL LETTER ETA WITH PSILI
+1F21 GREEK SMALL LETTER ETA WITH DASIA
+1F22 GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+1F23 GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+1F24 GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+1F25 GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+1F26 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+1F27 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1F28 GREEK CAPITAL LETTER ETA WITH PSILI
+1F29 GREEK CAPITAL LETTER ETA WITH DASIA
+1F2A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1F2B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1F2C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1F2D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1F2E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1F2F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F30 GREEK SMALL LETTER IOTA WITH PSILI
+1F31 GREEK SMALL LETTER IOTA WITH DASIA
+1F32 GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+1F33 GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+1F34 GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+1F35 GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+1F36 GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F37 GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F38 GREEK CAPITAL LETTER IOTA WITH PSILI
+1F39 GREEK CAPITAL LETTER IOTA WITH DASIA
+1F3A GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1F3B GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1F3C GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1F3D GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1F3E GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F3F GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F40 GREEK SMALL LETTER OMICRON WITH PSILI
+1F41 GREEK SMALL LETTER OMICRON WITH DASIA
+1F42 GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+1F43 GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+1F44 GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+1F45 GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48 GREEK CAPITAL LETTER OMICRON WITH PSILI
+1F49 GREEK CAPITAL LETTER OMICRON WITH DASIA
+1F4A GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1F4B GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1F4C GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1F4D GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50 GREEK SMALL LETTER UPSILON WITH PSILI
+1F51 GREEK SMALL LETTER UPSILON WITH DASIA
+1F52 GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F53 GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+1F54 GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F55 GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+1F56 GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1F57 GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59 GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F60 GREEK SMALL LETTER OMEGA WITH PSILI
+1F61 GREEK SMALL LETTER OMEGA WITH DASIA
+1F62 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+1F63 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+1F64 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+1F65 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+1F66 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F67 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F68 GREEK CAPITAL LETTER OMEGA WITH PSILI
+1F69 GREEK CAPITAL LETTER OMEGA WITH DASIA
+1F6A GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1F6B GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1F6C GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1F6D GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1F6E GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F6F GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F70 GREEK SMALL LETTER ALPHA WITH VARIA
+1F71 GREEK SMALL LETTER ALPHA WITH OXIA
+1F72 GREEK SMALL LETTER EPSILON WITH VARIA
+1F73 GREEK SMALL LETTER EPSILON WITH OXIA
+1F74 GREEK SMALL LETTER ETA WITH VARIA
+1F75 GREEK SMALL LETTER ETA WITH OXIA
+1F76 GREEK SMALL LETTER IOTA WITH VARIA
+1F77 GREEK SMALL LETTER IOTA WITH OXIA
+1F78 GREEK SMALL LETTER OMICRON WITH VARIA
+1F79 GREEK SMALL LETTER OMICRON WITH OXIA
+1F7A GREEK SMALL LETTER UPSILON WITH VARIA
+1F7B GREEK SMALL LETTER UPSILON WITH OXIA
+1F7C GREEK SMALL LETTER OMEGA WITH VARIA
+1F7D GREEK SMALL LETTER OMEGA WITH OXIA
+1F80 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81 GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90 GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91 GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92 GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93 GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94 GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95 GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98 GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99 GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0 GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1 GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB0 GREEK SMALL LETTER ALPHA WITH VRACHY
+1FB1 GREEK SMALL LETTER ALPHA WITH MACRON
+1FB2 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB3 GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FB4 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6 GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FB8 GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1FB9 GREEK CAPITAL LETTER ALPHA WITH MACRON
+1FBA GREEK CAPITAL LETTER ALPHA WITH VARIA
+1FBB GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FBC GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD GREEK KORONIS
+1FBE GREEK PROSGEGRAMMENI
+1FBF GREEK PSILI
+1FC0 GREEK PERISPOMENI
+1FC1 GREEK DIALYTIKA AND PERISPOMENI
+1FC2 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC3 GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FC4 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6 GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC8 GREEK CAPITAL LETTER EPSILON WITH VARIA
+1FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA
+1FCA GREEK CAPITAL LETTER ETA WITH VARIA
+1FCB GREEK CAPITAL LETTER ETA WITH OXIA
+1FCC GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD GREEK PSILI AND VARIA
+1FCE GREEK PSILI AND OXIA
+1FCF GREEK PSILI AND PERISPOMENI
+1FD0 GREEK SMALL LETTER IOTA WITH VRACHY
+1FD1 GREEK SMALL LETTER IOTA WITH MACRON
+1FD2 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6 GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8 GREEK CAPITAL LETTER IOTA WITH VRACHY
+1FD9 GREEK CAPITAL LETTER IOTA WITH MACRON
+1FDA GREEK CAPITAL LETTER IOTA WITH VARIA
+1FDB GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD GREEK DASIA AND VARIA
+1FDE GREEK DASIA AND OXIA
+1FDF GREEK DASIA AND PERISPOMENI
+1FE0 GREEK SMALL LETTER UPSILON WITH VRACHY
+1FE1 GREEK SMALL LETTER UPSILON WITH MACRON
+1FE2 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4 GREEK SMALL LETTER RHO WITH PSILI
+1FE5 GREEK SMALL LETTER RHO WITH DASIA
+1FE6 GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8 GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1FE9 GREEK CAPITAL LETTER UPSILON WITH MACRON
+1FEA GREEK CAPITAL LETTER UPSILON WITH VARIA
+1FEB GREEK CAPITAL LETTER UPSILON WITH OXIA
+1FEC GREEK CAPITAL LETTER RHO WITH DASIA
+1FED GREEK DIALYTIKA AND VARIA
+1FEE GREEK DIALYTIKA AND OXIA
+1FEF GREEK VARIA
+1FF2 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF3 GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FF4 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6 GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF8 GREEK CAPITAL LETTER OMICRON WITH VARIA
+1FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA
+1FFA GREEK CAPITAL LETTER OMEGA WITH VARIA
+1FFB GREEK CAPITAL LETTER OMEGA WITH OXIA
+1FFC GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD GREEK OXIA
+1FFE GREEK DASIA
+2000 EN QUAD
+2001 EM QUAD
+2002 EN SPACE
+2003 EM SPACE
+2004 THREE-PER-EM SPACE
+2005 FOUR-PER-EM SPACE
+2006 SIX-PER-EM SPACE
+2007 FIGURE SPACE
+2008 PUNCTUATION SPACE
+2009 THIN SPACE
+200A HAIR SPACE
+200B ZERO WIDTH SPACE
+200C ZERO WIDTH NON-JOINER
+200D ZERO WIDTH JOINER
+200E LEFT-TO-RIGHT MARK
+200F RIGHT-TO-LEFT MARK
+2010 HYPHEN
+2011 NON-BREAKING HYPHEN
+2012 FIGURE DASH
+2013 EN DASH
+2014 EM DASH
+2015 HORIZONTAL BAR
+2016 DOUBLE VERTICAL LINE
+2017 DOUBLE LOW LINE
+2018 LEFT SINGLE QUOTATION MARK
+2019 RIGHT SINGLE QUOTATION MARK
+201A SINGLE LOW-9 QUOTATION MARK
+201B SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C LEFT DOUBLE QUOTATION MARK
+201D RIGHT DOUBLE QUOTATION MARK
+201E DOUBLE LOW-9 QUOTATION MARK
+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020 DAGGER
+2021 DOUBLE DAGGER
+2022 BULLET
+2023 TRIANGULAR BULLET
+2024 ONE DOT LEADER
+2025 TWO DOT LEADER
+2026 HORIZONTAL ELLIPSIS
+2027 HYPHENATION POINT
+2028 LINE SEPARATOR
+2029 PARAGRAPH SEPARATOR
+202A LEFT-TO-RIGHT EMBEDDING
+202B RIGHT-TO-LEFT EMBEDDING
+202C POP DIRECTIONAL FORMATTING
+202D LEFT-TO-RIGHT OVERRIDE
+202E RIGHT-TO-LEFT OVERRIDE
+202F NARROW NO-BREAK SPACE
+2030 PER MILLE SIGN
+2031 PER TEN THOUSAND SIGN
+2032 PRIME
+2033 DOUBLE PRIME
+2034 TRIPLE PRIME
+2035 REVERSED PRIME
+2036 REVERSED DOUBLE PRIME
+2037 REVERSED TRIPLE PRIME
+2038 CARET
+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B REFERENCE MARK
+203C DOUBLE EXCLAMATION MARK
+203D INTERROBANG
+203E OVERLINE
+203F UNDERTIE
+2040 CHARACTER TIE
+2041 CARET INSERTION POINT
+2042 ASTERISM
+2043 HYPHEN BULLET
+2044 FRACTION SLASH
+2045 LEFT SQUARE BRACKET WITH QUILL
+2046 RIGHT SQUARE BRACKET WITH QUILL
+2047 DOUBLE QUESTION MARK
+2048 QUESTION EXCLAMATION MARK
+2049 EXCLAMATION QUESTION MARK
+204A TIRONIAN SIGN ET
+204B REVERSED PILCROW SIGN
+204C BLACK LEFTWARDS BULLET
+204D BLACK RIGHTWARDS BULLET
+204E LOW ASTERISK
+204F REVERSED SEMICOLON
+2050 CLOSE UP
+2051 TWO ASTERISKS ALIGNED VERTICALLY
+2052 COMMERCIAL MINUS SIGN
+2053 SWUNG DASH
+2054 INVERTED UNDERTIE
+2055 FLOWER PUNCTUATION MARK
+2056 THREE DOT PUNCTUATION
+2057 QUADRUPLE PRIME
+2058 FOUR DOT PUNCTUATION
+2059 FIVE DOT PUNCTUATION
+205A TWO DOT PUNCTUATION
+205B FOUR DOT MARK
+205C DOTTED CROSS
+205D TRICOLON
+205E VERTICAL FOUR DOTS
+205F MEDIUM MATHEMATICAL SPACE
+2060 WORD JOINER
+2061 FUNCTION APPLICATION
+2062 INVISIBLE TIMES
+2063 INVISIBLE SEPARATOR
+2064 INVISIBLE PLUS
+206A INHIBIT SYMMETRIC SWAPPING
+206B ACTIVATE SYMMETRIC SWAPPING
+206C INHIBIT ARABIC FORM SHAPING
+206D ACTIVATE ARABIC FORM SHAPING
+206E NATIONAL DIGIT SHAPES
+206F NOMINAL DIGIT SHAPES
+2070 SUPERSCRIPT ZERO
+2071 SUPERSCRIPT LATIN SMALL LETTER I
+2074 SUPERSCRIPT FOUR
+2075 SUPERSCRIPT FIVE
+2076 SUPERSCRIPT SIX
+2077 SUPERSCRIPT SEVEN
+2078 SUPERSCRIPT EIGHT
+2079 SUPERSCRIPT NINE
+207A SUPERSCRIPT PLUS SIGN
+207B SUPERSCRIPT MINUS
+207C SUPERSCRIPT EQUALS SIGN
+207D SUPERSCRIPT LEFT PARENTHESIS
+207E SUPERSCRIPT RIGHT PARENTHESIS
+207F SUPERSCRIPT LATIN SMALL LETTER N
+2080 SUBSCRIPT ZERO
+2081 SUBSCRIPT ONE
+2082 SUBSCRIPT TWO
+2083 SUBSCRIPT THREE
+2084 SUBSCRIPT FOUR
+2085 SUBSCRIPT FIVE
+2086 SUBSCRIPT SIX
+2087 SUBSCRIPT SEVEN
+2088 SUBSCRIPT EIGHT
+2089 SUBSCRIPT NINE
+208A SUBSCRIPT PLUS SIGN
+208B SUBSCRIPT MINUS
+208C SUBSCRIPT EQUALS SIGN
+208D SUBSCRIPT LEFT PARENTHESIS
+208E SUBSCRIPT RIGHT PARENTHESIS
+2090 LATIN SUBSCRIPT SMALL LETTER A
+2091 LATIN SUBSCRIPT SMALL LETTER E
+2092 LATIN SUBSCRIPT SMALL LETTER O
+2093 LATIN SUBSCRIPT SMALL LETTER X
+2094 LATIN SUBSCRIPT SMALL LETTER SCHWA
+20A0 EURO-CURRENCY SIGN
+20A1 COLON SIGN
+20A2 CRUZEIRO SIGN
+20A3 FRENCH FRANC SIGN
+20A4 LIRA SIGN
+20A5 MILL SIGN
+20A6 NAIRA SIGN
+20A7 PESETA SIGN
+20A8 RUPEE SIGN
+20A9 WON SIGN
+20AA NEW SHEQEL SIGN
+20AB DONG SIGN
+20AC EURO SIGN
+20AD KIP SIGN
+20AE TUGRIK SIGN
+20AF DRACHMA SIGN
+20B0 GERMAN PENNY SIGN
+20B1 PESO SIGN
+20B2 GUARANI SIGN
+20B3 AUSTRAL SIGN
+20B4 HRYVNIA SIGN
+20B5 CEDI SIGN
+20D0 COMBINING LEFT HARPOON ABOVE
+20D1 COMBINING RIGHT HARPOON ABOVE
+20D2 COMBINING LONG VERTICAL LINE OVERLAY
+20D3 COMBINING SHORT VERTICAL LINE OVERLAY
+20D4 COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5 COMBINING CLOCKWISE ARROW ABOVE
+20D6 COMBINING LEFT ARROW ABOVE
+20D7 COMBINING RIGHT ARROW ABOVE
+20D8 COMBINING RING OVERLAY
+20D9 COMBINING CLOCKWISE RING OVERLAY
+20DA COMBINING ANTICLOCKWISE RING OVERLAY
+20DB COMBINING THREE DOTS ABOVE
+20DC COMBINING FOUR DOTS ABOVE
+20DD COMBINING ENCLOSING CIRCLE
+20DE COMBINING ENCLOSING SQUARE
+20DF COMBINING ENCLOSING DIAMOND
+20E0 COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1 COMBINING LEFT RIGHT ARROW ABOVE
+20E2 COMBINING ENCLOSING SCREEN
+20E3 COMBINING ENCLOSING KEYCAP
+20E4 COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5 COMBINING REVERSE SOLIDUS OVERLAY
+20E6 COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20E7 COMBINING ANNUITY SYMBOL
+20E8 COMBINING TRIPLE UNDERDOT
+20E9 COMBINING WIDE BRIDGE ABOVE
+20EA COMBINING LEFTWARDS ARROW OVERLAY
+20EB COMBINING LONG DOUBLE SOLIDUS OVERLAY
+20EC COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+20ED COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS
+20EE COMBINING LEFT ARROW BELOW
+20EF COMBINING RIGHT ARROW BELOW
+20F0 COMBINING ASTERISK ABOVE
+2100 ACCOUNT OF
+2101 ADDRESSED TO THE SUBJECT
+2102 DOUBLE-STRUCK CAPITAL C
+2103 DEGREE CELSIUS
+2104 CENTRE LINE SYMBOL
+2105 CARE OF
+2106 CADA UNA
+2107 EULER CONSTANT
+2108 SCRUPLE
+2109 DEGREE FAHRENHEIT
+210A SCRIPT SMALL G
+210B SCRIPT CAPITAL H
+210C BLACK-LETTER CAPITAL H
+210D DOUBLE-STRUCK CAPITAL H
+210E PLANCK CONSTANT
+210F PLANCK CONSTANT OVER TWO PI
+2110 SCRIPT CAPITAL I
+2111 BLACK-LETTER CAPITAL I
+2112 SCRIPT CAPITAL L
+2113 SCRIPT SMALL L
+2114 L B BAR SYMBOL
+2115 DOUBLE-STRUCK CAPITAL N
+2116 NUMERO SIGN
+2117 SOUND RECORDING COPYRIGHT
+2118 SCRIPT CAPITAL P
+2119 DOUBLE-STRUCK CAPITAL P
+211A DOUBLE-STRUCK CAPITAL Q
+211B SCRIPT CAPITAL R
+211C BLACK-LETTER CAPITAL R
+211D DOUBLE-STRUCK CAPITAL R
+211E PRESCRIPTION TAKE
+211F RESPONSE
+2120 SERVICE MARK
+2121 TELEPHONE SIGN
+2122 TRADE MARK SIGN
+2123 VERSICLE
+2124 DOUBLE-STRUCK CAPITAL Z
+2125 OUNCE SIGN
+2126 OHM SIGN
+2127 INVERTED OHM SIGN
+2128 BLACK-LETTER CAPITAL Z
+2129 TURNED GREEK SMALL LETTER IOTA
+212A KELVIN SIGN
+212B ANGSTROM SIGN
+212C SCRIPT CAPITAL B
+212D BLACK-LETTER CAPITAL C
+212E ESTIMATED SYMBOL
+212F SCRIPT SMALL E
+2130 SCRIPT CAPITAL E
+2131 SCRIPT CAPITAL F
+2132 TURNED CAPITAL F
+2133 SCRIPT CAPITAL M
+2134 SCRIPT SMALL O
+2135 ALEF SYMBOL
+2136 BET SYMBOL
+2137 GIMEL SYMBOL
+2138 DALET SYMBOL
+2139 INFORMATION SOURCE
+213A ROTATED CAPITAL Q
+213B FACSIMILE SIGN
+213C DOUBLE-STRUCK SMALL PI
+213D DOUBLE-STRUCK SMALL GAMMA
+213E DOUBLE-STRUCK CAPITAL GAMMA
+213F DOUBLE-STRUCK CAPITAL PI
+2140 DOUBLE-STRUCK N-ARY SUMMATION
+2141 TURNED SANS-SERIF CAPITAL G
+2142 TURNED SANS-SERIF CAPITAL L
+2143 REVERSED SANS-SERIF CAPITAL L
+2144 TURNED SANS-SERIF CAPITAL Y
+2145 DOUBLE-STRUCK ITALIC CAPITAL D
+2146 DOUBLE-STRUCK ITALIC SMALL D
+2147 DOUBLE-STRUCK ITALIC SMALL E
+2148 DOUBLE-STRUCK ITALIC SMALL I
+2149 DOUBLE-STRUCK ITALIC SMALL J
+214A PROPERTY LINE
+214B TURNED AMPERSAND
+214C PER SIGN
+214D AKTIESELSKAB
+214E TURNED SMALL F
+214F SYMBOL FOR SAMARITAN SOURCE
+2153 VULGAR FRACTION ONE THIRD
+2154 VULGAR FRACTION TWO THIRDS
+2155 VULGAR FRACTION ONE FIFTH
+2156 VULGAR FRACTION TWO FIFTHS
+2157 VULGAR FRACTION THREE FIFTHS
+2158 VULGAR FRACTION FOUR FIFTHS
+2159 VULGAR FRACTION ONE SIXTH
+215A VULGAR FRACTION FIVE SIXTHS
+215B VULGAR FRACTION ONE EIGHTH
+215C VULGAR FRACTION THREE EIGHTHS
+215D VULGAR FRACTION FIVE EIGHTHS
+215E VULGAR FRACTION SEVEN EIGHTHS
+215F FRACTION NUMERATOR ONE
+2160 ROMAN NUMERAL ONE
+2161 ROMAN NUMERAL TWO
+2162 ROMAN NUMERAL THREE
+2163 ROMAN NUMERAL FOUR
+2164 ROMAN NUMERAL FIVE
+2165 ROMAN NUMERAL SIX
+2166 ROMAN NUMERAL SEVEN
+2167 ROMAN NUMERAL EIGHT
+2168 ROMAN NUMERAL NINE
+2169 ROMAN NUMERAL TEN
+216A ROMAN NUMERAL ELEVEN
+216B ROMAN NUMERAL TWELVE
+216C ROMAN NUMERAL FIFTY
+216D ROMAN NUMERAL ONE HUNDRED
+216E ROMAN NUMERAL FIVE HUNDRED
+216F ROMAN NUMERAL ONE THOUSAND
+2170 SMALL ROMAN NUMERAL ONE
+2171 SMALL ROMAN NUMERAL TWO
+2172 SMALL ROMAN NUMERAL THREE
+2173 SMALL ROMAN NUMERAL FOUR
+2174 SMALL ROMAN NUMERAL FIVE
+2175 SMALL ROMAN NUMERAL SIX
+2176 SMALL ROMAN NUMERAL SEVEN
+2177 SMALL ROMAN NUMERAL EIGHT
+2178 SMALL ROMAN NUMERAL NINE
+2179 SMALL ROMAN NUMERAL TEN
+217A SMALL ROMAN NUMERAL ELEVEN
+217B SMALL ROMAN NUMERAL TWELVE
+217C SMALL ROMAN NUMERAL FIFTY
+217D SMALL ROMAN NUMERAL ONE HUNDRED
+217E SMALL ROMAN NUMERAL FIVE HUNDRED
+217F SMALL ROMAN NUMERAL ONE THOUSAND
+2180 ROMAN NUMERAL ONE THOUSAND C D
+2181 ROMAN NUMERAL FIVE THOUSAND
+2182 ROMAN NUMERAL TEN THOUSAND
+2183 ROMAN NUMERAL REVERSED ONE HUNDRED
+2184 LATIN SMALL LETTER REVERSED C
+2185 ROMAN NUMERAL SIX LATE FORM
+2186 ROMAN NUMERAL FIFTY EARLY FORM
+2187 ROMAN NUMERAL FIFTY THOUSAND
+2188 ROMAN NUMERAL ONE HUNDRED THOUSAND
+2190 LEFTWARDS ARROW
+2191 UPWARDS ARROW
+2192 RIGHTWARDS ARROW
+2193 DOWNWARDS ARROW
+2194 LEFT RIGHT ARROW
+2195 UP DOWN ARROW
+2196 NORTH WEST ARROW
+2197 NORTH EAST ARROW
+2198 SOUTH EAST ARROW
+2199 SOUTH WEST ARROW
+219A LEFTWARDS ARROW WITH STROKE
+219B RIGHTWARDS ARROW WITH STROKE
+219C LEFTWARDS WAVE ARROW
+219D RIGHTWARDS WAVE ARROW
+219E LEFTWARDS TWO HEADED ARROW
+219F UPWARDS TWO HEADED ARROW
+21A0 RIGHTWARDS TWO HEADED ARROW
+21A1 DOWNWARDS TWO HEADED ARROW
+21A2 LEFTWARDS ARROW WITH TAIL
+21A3 RIGHTWARDS ARROW WITH TAIL
+21A4 LEFTWARDS ARROW FROM BAR
+21A5 UPWARDS ARROW FROM BAR
+21A6 RIGHTWARDS ARROW FROM BAR
+21A7 DOWNWARDS ARROW FROM BAR
+21A8 UP DOWN ARROW WITH BASE
+21A9 LEFTWARDS ARROW WITH HOOK
+21AA RIGHTWARDS ARROW WITH HOOK
+21AB LEFTWARDS ARROW WITH LOOP
+21AC RIGHTWARDS ARROW WITH LOOP
+21AD LEFT RIGHT WAVE ARROW
+21AE LEFT RIGHT ARROW WITH STROKE
+21AF DOWNWARDS ZIGZAG ARROW
+21B0 UPWARDS ARROW WITH TIP LEFTWARDS
+21B1 UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2 DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3 DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4 RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21B5 DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21B6 ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7 CLOCKWISE TOP SEMICIRCLE ARROW
+21B8 NORTH WEST ARROW TO LONG BAR
+21B9 LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21BA ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB CLOCKWISE OPEN CIRCLE ARROW
+21BC LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0 RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1 RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2 DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3 DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4 RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5 UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6 LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7 LEFTWARDS PAIRED ARROWS
+21C8 UPWARDS PAIRED ARROWS
+21C9 RIGHTWARDS PAIRED ARROWS
+21CA DOWNWARDS PAIRED ARROWS
+21CB LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE LEFT RIGHT DOUBLE ARROW WITH STROKE
+21CF RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0 LEFTWARDS DOUBLE ARROW
+21D1 UPWARDS DOUBLE ARROW
+21D2 RIGHTWARDS DOUBLE ARROW
+21D3 DOWNWARDS DOUBLE ARROW
+21D4 LEFT RIGHT DOUBLE ARROW
+21D5 UP DOWN DOUBLE ARROW
+21D6 NORTH WEST DOUBLE ARROW
+21D7 NORTH EAST DOUBLE ARROW
+21D8 SOUTH EAST DOUBLE ARROW
+21D9 SOUTH WEST DOUBLE ARROW
+21DA LEFTWARDS TRIPLE ARROW
+21DB RIGHTWARDS TRIPLE ARROW
+21DC LEFTWARDS SQUIGGLE ARROW
+21DD RIGHTWARDS SQUIGGLE ARROW
+21DE UPWARDS ARROW WITH DOUBLE STROKE
+21DF DOWNWARDS ARROW WITH DOUBLE STROKE
+21E0 LEFTWARDS DASHED ARROW
+21E1 UPWARDS DASHED ARROW
+21E2 RIGHTWARDS DASHED ARROW
+21E3 DOWNWARDS DASHED ARROW
+21E4 LEFTWARDS ARROW TO BAR
+21E5 RIGHTWARDS ARROW TO BAR
+21E6 LEFTWARDS WHITE ARROW
+21E7 UPWARDS WHITE ARROW
+21E8 RIGHTWARDS WHITE ARROW
+21E9 DOWNWARDS WHITE ARROW
+21EA UPWARDS WHITE ARROW FROM BAR
+21EB UPWARDS WHITE ARROW ON PEDESTAL
+21EC UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ED UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21EE UPWARDS WHITE DOUBLE ARROW
+21EF UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21F0 RIGHTWARDS WHITE ARROW FROM WALL
+21F1 NORTH WEST ARROW TO CORNER
+21F2 SOUTH EAST ARROW TO CORNER
+21F3 UP DOWN WHITE ARROW
+21F4 RIGHT ARROW WITH SMALL CIRCLE
+21F5 DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+21F6 THREE RIGHTWARDS ARROWS
+21F7 LEFTWARDS ARROW WITH VERTICAL STROKE
+21F8 RIGHTWARDS ARROW WITH VERTICAL STROKE
+21F9 LEFT RIGHT ARROW WITH VERTICAL STROKE
+21FA LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FB RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FC LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+21FD LEFTWARDS OPEN-HEADED ARROW
+21FE RIGHTWARDS OPEN-HEADED ARROW
+21FF LEFT RIGHT OPEN-HEADED ARROW
+2200 FOR ALL
+2201 COMPLEMENT
+2202 PARTIAL DIFFERENTIAL
+2203 THERE EXISTS
+2204 THERE DOES NOT EXIST
+2205 EMPTY SET
+2206 INCREMENT
+2207 NABLA
+2208 ELEMENT OF
+2209 NOT AN ELEMENT OF
+220A SMALL ELEMENT OF
+220B CONTAINS AS MEMBER
+220C DOES NOT CONTAIN AS MEMBER
+220D SMALL CONTAINS AS MEMBER
+220E END OF PROOF
+220F N-ARY PRODUCT
+2210 N-ARY COPRODUCT
+2211 N-ARY SUMMATION
+2212 MINUS SIGN
+2213 MINUS-OR-PLUS SIGN
+2214 DOT PLUS
+2215 DIVISION SLASH
+2216 SET MINUS
+2217 ASTERISK OPERATOR
+2218 RING OPERATOR
+2219 BULLET OPERATOR
+221A SQUARE ROOT
+221B CUBE ROOT
+221C FOURTH ROOT
+221D PROPORTIONAL TO
+221E INFINITY
+221F RIGHT ANGLE
+2220 ANGLE
+2221 MEASURED ANGLE
+2222 SPHERICAL ANGLE
+2223 DIVIDES
+2224 DOES NOT DIVIDE
+2225 PARALLEL TO
+2226 NOT PARALLEL TO
+2227 LOGICAL AND
+2228 LOGICAL OR
+2229 INTERSECTION
+222A UNION
+222B INTEGRAL
+222C DOUBLE INTEGRAL
+222D TRIPLE INTEGRAL
+222E CONTOUR INTEGRAL
+222F SURFACE INTEGRAL
+2230 VOLUME INTEGRAL
+2231 CLOCKWISE INTEGRAL
+2232 CLOCKWISE CONTOUR INTEGRAL
+2233 ANTICLOCKWISE CONTOUR INTEGRAL
+2234 THEREFORE
+2235 BECAUSE
+2236 RATIO
+2237 PROPORTION
+2238 DOT MINUS
+2239 EXCESS
+223A GEOMETRIC PROPORTION
+223B HOMOTHETIC
+223C TILDE OPERATOR
+223D REVERSED TILDE
+223E INVERTED LAZY S
+223F SINE WAVE
+2240 WREATH PRODUCT
+2241 NOT TILDE
+2242 MINUS TILDE
+2243 ASYMPTOTICALLY EQUAL TO
+2244 NOT ASYMPTOTICALLY EQUAL TO
+2245 APPROXIMATELY EQUAL TO
+2246 APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247 NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+2248 ALMOST EQUAL TO
+2249 NOT ALMOST EQUAL TO
+224A ALMOST EQUAL OR EQUAL TO
+224B TRIPLE TILDE
+224C ALL EQUAL TO
+224D EQUIVALENT TO
+224E GEOMETRICALLY EQUIVALENT TO
+224F DIFFERENCE BETWEEN
+2250 APPROACHES THE LIMIT
+2251 GEOMETRICALLY EQUAL TO
+2252 APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253 IMAGE OF OR APPROXIMATELY EQUAL TO
+2254 COLON EQUALS
+2255 EQUALS COLON
+2256 RING IN EQUAL TO
+2257 RING EQUAL TO
+2258 CORRESPONDS TO
+2259 ESTIMATES
+225A EQUIANGULAR TO
+225B STAR EQUALS
+225C DELTA EQUAL TO
+225D EQUAL TO BY DEFINITION
+225E MEASURED BY
+225F QUESTIONED EQUAL TO
+2260 NOT EQUAL TO
+2261 IDENTICAL TO
+2262 NOT IDENTICAL TO
+2263 STRICTLY EQUIVALENT TO
+2264 LESS-THAN OR EQUAL TO
+2265 GREATER-THAN OR EQUAL TO
+2266 LESS-THAN OVER EQUAL TO
+2267 GREATER-THAN OVER EQUAL TO
+2268 LESS-THAN BUT NOT EQUAL TO
+2269 GREATER-THAN BUT NOT EQUAL TO
+226A MUCH LESS-THAN
+226B MUCH GREATER-THAN
+226C BETWEEN
+226D NOT EQUIVALENT TO
+226E NOT LESS-THAN
+226F NOT GREATER-THAN
+2270 NEITHER LESS-THAN NOR EQUAL TO
+2271 NEITHER GREATER-THAN NOR EQUAL TO
+2272 LESS-THAN OR EQUIVALENT TO
+2273 GREATER-THAN OR EQUIVALENT TO
+2274 NEITHER LESS-THAN NOR EQUIVALENT TO
+2275 NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276 LESS-THAN OR GREATER-THAN
+2277 GREATER-THAN OR LESS-THAN
+2278 NEITHER LESS-THAN NOR GREATER-THAN
+2279 NEITHER GREATER-THAN NOR LESS-THAN
+227A PRECEDES
+227B SUCCEEDS
+227C PRECEDES OR EQUAL TO
+227D SUCCEEDS OR EQUAL TO
+227E PRECEDES OR EQUIVALENT TO
+227F SUCCEEDS OR EQUIVALENT TO
+2280 DOES NOT PRECEDE
+2281 DOES NOT SUCCEED
+2282 SUBSET OF
+2283 SUPERSET OF
+2284 NOT A SUBSET OF
+2285 NOT A SUPERSET OF
+2286 SUBSET OF OR EQUAL TO
+2287 SUPERSET OF OR EQUAL TO
+2288 NEITHER A SUBSET OF NOR EQUAL TO
+2289 NEITHER A SUPERSET OF NOR EQUAL TO
+228A SUBSET OF WITH NOT EQUAL TO
+228B SUPERSET OF WITH NOT EQUAL TO
+228C MULTISET
+228D MULTISET MULTIPLICATION
+228E MULTISET UNION
+228F SQUARE IMAGE OF
+2290 SQUARE ORIGINAL OF
+2291 SQUARE IMAGE OF OR EQUAL TO
+2292 SQUARE ORIGINAL OF OR EQUAL TO
+2293 SQUARE CAP
+2294 SQUARE CUP
+2295 CIRCLED PLUS
+2296 CIRCLED MINUS
+2297 CIRCLED TIMES
+2298 CIRCLED DIVISION SLASH
+2299 CIRCLED DOT OPERATOR
+229A CIRCLED RING OPERATOR
+229B CIRCLED ASTERISK OPERATOR
+229C CIRCLED EQUALS
+229D CIRCLED DASH
+229E SQUARED PLUS
+229F SQUARED MINUS
+22A0 SQUARED TIMES
+22A1 SQUARED DOT OPERATOR
+22A2 RIGHT TACK
+22A3 LEFT TACK
+22A4 DOWN TACK
+22A5 UP TACK
+22A6 ASSERTION
+22A7 MODELS
+22A8 TRUE
+22A9 FORCES
+22AA TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC DOES NOT PROVE
+22AD NOT TRUE
+22AE DOES NOT FORCE
+22AF NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22B0 PRECEDES UNDER RELATION
+22B1 SUCCEEDS UNDER RELATION
+22B2 NORMAL SUBGROUP OF
+22B3 CONTAINS AS NORMAL SUBGROUP
+22B4 NORMAL SUBGROUP OF OR EQUAL TO
+22B5 CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6 ORIGINAL OF
+22B7 IMAGE OF
+22B8 MULTIMAP
+22B9 HERMITIAN CONJUGATE MATRIX
+22BA INTERCALATE
+22BB XOR
+22BC NAND
+22BD NOR
+22BE RIGHT ANGLE WITH ARC
+22BF RIGHT TRIANGLE
+22C0 N-ARY LOGICAL AND
+22C1 N-ARY LOGICAL OR
+22C2 N-ARY INTERSECTION
+22C3 N-ARY UNION
+22C4 DIAMOND OPERATOR
+22C5 DOT OPERATOR
+22C6 STAR OPERATOR
+22C7 DIVISION TIMES
+22C8 BOWTIE
+22C9 LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB LEFT SEMIDIRECT PRODUCT
+22CC RIGHT SEMIDIRECT PRODUCT
+22CD REVERSED TILDE EQUALS
+22CE CURLY LOGICAL OR
+22CF CURLY LOGICAL AND
+22D0 DOUBLE SUBSET
+22D1 DOUBLE SUPERSET
+22D2 DOUBLE INTERSECTION
+22D3 DOUBLE UNION
+22D4 PITCHFORK
+22D5 EQUAL AND PARALLEL TO
+22D6 LESS-THAN WITH DOT
+22D7 GREATER-THAN WITH DOT
+22D8 VERY MUCH LESS-THAN
+22D9 VERY MUCH GREATER-THAN
+22DA LESS-THAN EQUAL TO OR GREATER-THAN
+22DB GREATER-THAN EQUAL TO OR LESS-THAN
+22DC EQUAL TO OR LESS-THAN
+22DD EQUAL TO OR GREATER-THAN
+22DE EQUAL TO OR PRECEDES
+22DF EQUAL TO OR SUCCEEDS
+22E0 DOES NOT PRECEDE OR EQUAL
+22E1 DOES NOT SUCCEED OR EQUAL
+22E2 NOT SQUARE IMAGE OF OR EQUAL TO
+22E3 NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4 SQUARE IMAGE OF OR NOT EQUAL TO
+22E5 SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6 LESS-THAN BUT NOT EQUIVALENT TO
+22E7 GREATER-THAN BUT NOT EQUIVALENT TO
+22E8 PRECEDES BUT NOT EQUIVALENT TO
+22E9 SUCCEEDS BUT NOT EQUIVALENT TO
+22EA NOT NORMAL SUBGROUP OF
+22EB DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22EE VERTICAL ELLIPSIS
+22EF MIDLINE HORIZONTAL ELLIPSIS
+22F0 UP RIGHT DIAGONAL ELLIPSIS
+22F1 DOWN RIGHT DIAGONAL ELLIPSIS
+22F2 ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3 ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4 SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F5 ELEMENT OF WITH DOT ABOVE
+22F6 ELEMENT OF WITH OVERBAR
+22F7 SMALL ELEMENT OF WITH OVERBAR
+22F8 ELEMENT OF WITH UNDERBAR
+22F9 ELEMENT OF WITH TWO HORIZONTAL STROKES
+22FA CONTAINS WITH LONG HORIZONTAL STROKE
+22FB CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD CONTAINS WITH OVERBAR
+22FE SMALL CONTAINS WITH OVERBAR
+22FF Z NOTATION BAG MEMBERSHIP
+2300 DIAMETER SIGN
+2301 ELECTRIC ARROW
+2302 HOUSE
+2303 UP ARROWHEAD
+2304 DOWN ARROWHEAD
+2305 PROJECTIVE
+2306 PERSPECTIVE
+2307 WAVY LINE
+2308 LEFT CEILING
+2309 RIGHT CEILING
+230A LEFT FLOOR
+230B RIGHT FLOOR
+230C BOTTOM RIGHT CROP
+230D BOTTOM LEFT CROP
+230E TOP RIGHT CROP
+230F TOP LEFT CROP
+2310 REVERSED NOT SIGN
+2311 SQUARE LOZENGE
+2312 ARC
+2313 SEGMENT
+2314 SECTOR
+2315 TELEPHONE RECORDER
+2316 POSITION INDICATOR
+2317 VIEWDATA SQUARE
+2318 PLACE OF INTEREST SIGN
+2319 TURNED NOT SIGN
+231A WATCH
+231B HOURGLASS
+231C TOP LEFT CORNER
+231D TOP RIGHT CORNER
+231E BOTTOM LEFT CORNER
+231F BOTTOM RIGHT CORNER
+2320 TOP HALF INTEGRAL
+2321 BOTTOM HALF INTEGRAL
+2322 FROWN
+2323 SMILE
+2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325 OPTION KEY
+2326 ERASE TO THE RIGHT
+2327 X IN A RECTANGLE BOX
+2328 KEYBOARD
+2329 LEFT-POINTING ANGLE BRACKET
+232A RIGHT-POINTING ANGLE BRACKET
+232B ERASE TO THE LEFT
+232C BENZENE RING
+232D CYLINDRICITY
+232E ALL AROUND-PROFILE
+232F SYMMETRY
+2330 TOTAL RUNOUT
+2331 DIMENSION ORIGIN
+2332 CONICAL TAPER
+2333 SLOPE
+2334 COUNTERBORE
+2335 COUNTERSINK
+2336 APL FUNCTIONAL SYMBOL I-BEAM
+2337 APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338 APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339 APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B APL FUNCTIONAL SYMBOL QUAD JOT
+233C APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E APL FUNCTIONAL SYMBOL CIRCLE JOT
+233F APL FUNCTIONAL SYMBOL SLASH BAR
+2340 APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341 APL FUNCTIONAL SYMBOL QUAD SLASH
+2342 APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343 APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344 APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345 APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346 APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347 APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348 APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349 APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234B APL FUNCTIONAL SYMBOL DELTA STILE
+234C APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D APL FUNCTIONAL SYMBOL QUAD DELTA
+234E APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234F APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350 APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351 APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352 APL FUNCTIONAL SYMBOL DEL STILE
+2353 APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354 APL FUNCTIONAL SYMBOL QUAD DEL
+2355 APL FUNCTIONAL SYMBOL UP TACK JOT
+2356 APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357 APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358 APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359 APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360 APL FUNCTIONAL SYMBOL QUAD COLON
+2361 APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362 APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363 APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364 APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365 APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366 APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367 APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368 APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369 APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A APL FUNCTIONAL SYMBOL COMMA BAR
+236B APL FUNCTIONAL SYMBOL DEL TILDE
+236C APL FUNCTIONAL SYMBOL ZILDE
+236D APL FUNCTIONAL SYMBOL STILE TILDE
+236E APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370 APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371 APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372 APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373 APL FUNCTIONAL SYMBOL IOTA
+2374 APL FUNCTIONAL SYMBOL RHO
+2375 APL FUNCTIONAL SYMBOL OMEGA
+2376 APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377 APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378 APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379 APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A APL FUNCTIONAL SYMBOL ALPHA
+237B NOT CHECK MARK
+237C RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D SHOULDERED OPEN BOX
+237E BELL SYMBOL
+237F VERTICAL LINE WITH MIDDLE DOT
+2380 INSERTION SYMBOL
+2381 CONTINUOUS UNDERLINE SYMBOL
+2382 DISCONTINUOUS UNDERLINE SYMBOL
+2383 EMPHASIS SYMBOL
+2384 COMPOSITION SYMBOL
+2385 WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386 ENTER SYMBOL
+2387 ALTERNATIVE KEY SYMBOL
+2388 HELM SYMBOL
+2389 CIRCLED HORIZONTAL BAR WITH NOTCH
+238A CIRCLED TRIANGLE DOWN
+238B BROKEN CIRCLE WITH NORTHWEST ARROW
+238C UNDO SYMBOL
+238D MONOSTABLE SYMBOL
+238E HYSTERESIS SYMBOL
+238F OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390 OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391 PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392 PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393 DIRECT CURRENT SYMBOL FORM TWO
+2394 SOFTWARE-FUNCTION SYMBOL
+2395 APL FUNCTIONAL SYMBOL QUAD
+2396 DECIMAL SEPARATOR KEY SYMBOL
+2397 PREVIOUS PAGE
+2398 NEXT PAGE
+2399 PRINT SCREEN SYMBOL
+239A CLEAR SCREEN SYMBOL
+239B LEFT PARENTHESIS UPPER HOOK
+239C LEFT PARENTHESIS EXTENSION
+239D LEFT PARENTHESIS LOWER HOOK
+239E RIGHT PARENTHESIS UPPER HOOK
+239F RIGHT PARENTHESIS EXTENSION
+23A0 RIGHT PARENTHESIS LOWER HOOK
+23A1 LEFT SQUARE BRACKET UPPER CORNER
+23A2 LEFT SQUARE BRACKET EXTENSION
+23A3 LEFT SQUARE BRACKET LOWER CORNER
+23A4 RIGHT SQUARE BRACKET UPPER CORNER
+23A5 RIGHT SQUARE BRACKET EXTENSION
+23A6 RIGHT SQUARE BRACKET LOWER CORNER
+23A7 LEFT CURLY BRACKET UPPER HOOK
+23A8 LEFT CURLY BRACKET MIDDLE PIECE
+23A9 LEFT CURLY BRACKET LOWER HOOK
+23AA CURLY BRACKET EXTENSION
+23AB RIGHT CURLY BRACKET UPPER HOOK
+23AC RIGHT CURLY BRACKET MIDDLE PIECE
+23AD RIGHT CURLY BRACKET LOWER HOOK
+23AE INTEGRAL EXTENSION
+23AF HORIZONTAL LINE EXTENSION
+23B0 UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+23B1 UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+23B2 SUMMATION TOP
+23B3 SUMMATION BOTTOM
+23B4 TOP SQUARE BRACKET
+23B5 BOTTOM SQUARE BRACKET
+23B6 BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7 RADICAL SYMBOL BOTTOM
+23B8 LEFT VERTICAL BOX LINE
+23B9 RIGHT VERTICAL BOX LINE
+23BA HORIZONTAL SCAN LINE-1
+23BB HORIZONTAL SCAN LINE-3
+23BC HORIZONTAL SCAN LINE-7
+23BD HORIZONTAL SCAN LINE-9
+23BE DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+23BF DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+23C0 DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
+23C1 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
+23C2 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
+23C3 DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE
+23C4 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE
+23C5 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE
+23C6 DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE
+23C7 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
+23C8 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
+23C9 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+23CA DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+23CB DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+23CC DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+23CD SQUARE FOOT
+23CE RETURN SYMBOL
+23CF EJECT SYMBOL
+23D0 VERTICAL LINE EXTENSION
+23D1 METRICAL BREVE
+23D2 METRICAL LONG OVER SHORT
+23D3 METRICAL SHORT OVER LONG
+23D4 METRICAL LONG OVER TWO SHORTS
+23D5 METRICAL TWO SHORTS OVER LONG
+23D6 METRICAL TWO SHORTS JOINED
+23D7 METRICAL TRISEME
+23D8 METRICAL TETRASEME
+23D9 METRICAL PENTASEME
+23DA EARTH GROUND
+23DB FUSE
+23DC TOP PARENTHESIS
+23DD BOTTOM PARENTHESIS
+23DE TOP CURLY BRACKET
+23DF BOTTOM CURLY BRACKET
+23E0 TOP TORTOISE SHELL BRACKET
+23E1 BOTTOM TORTOISE SHELL BRACKET
+23E2 WHITE TRAPEZIUM
+23E3 BENZENE RING WITH CIRCLE
+23E4 STRAIGHTNESS
+23E5 FLATNESS
+23E6 AC CURRENT
+23E7 ELECTRICAL INTERSECTION
+2400 SYMBOL FOR NULL
+2401 SYMBOL FOR START OF HEADING
+2402 SYMBOL FOR START OF TEXT
+2403 SYMBOL FOR END OF TEXT
+2404 SYMBOL FOR END OF TRANSMISSION
+2405 SYMBOL FOR ENQUIRY
+2406 SYMBOL FOR ACKNOWLEDGE
+2407 SYMBOL FOR BELL
+2408 SYMBOL FOR BACKSPACE
+2409 SYMBOL FOR HORIZONTAL TABULATION
+240A SYMBOL FOR LINE FEED
+240B SYMBOL FOR VERTICAL TABULATION
+240C SYMBOL FOR FORM FEED
+240D SYMBOL FOR CARRIAGE RETURN
+240E SYMBOL FOR SHIFT OUT
+240F SYMBOL FOR SHIFT IN
+2410 SYMBOL FOR DATA LINK ESCAPE
+2411 SYMBOL FOR DEVICE CONTROL ONE
+2412 SYMBOL FOR DEVICE CONTROL TWO
+2413 SYMBOL FOR DEVICE CONTROL THREE
+2414 SYMBOL FOR DEVICE CONTROL FOUR
+2415 SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416 SYMBOL FOR SYNCHRONOUS IDLE
+2417 SYMBOL FOR END OF TRANSMISSION BLOCK
+2418 SYMBOL FOR CANCEL
+2419 SYMBOL FOR END OF MEDIUM
+241A SYMBOL FOR SUBSTITUTE
+241B SYMBOL FOR ESCAPE
+241C SYMBOL FOR FILE SEPARATOR
+241D SYMBOL FOR GROUP SEPARATOR
+241E SYMBOL FOR RECORD SEPARATOR
+241F SYMBOL FOR UNIT SEPARATOR
+2420 SYMBOL FOR SPACE
+2421 SYMBOL FOR DELETE
+2422 BLANK SYMBOL
+2423 OPEN BOX
+2424 SYMBOL FOR NEWLINE
+2425 SYMBOL FOR DELETE FORM TWO
+2426 SYMBOL FOR SUBSTITUTE FORM TWO
+2440 OCR HOOK
+2441 OCR CHAIR
+2442 OCR FORK
+2443 OCR INVERTED FORK
+2444 OCR BELT BUCKLE
+2445 OCR BOW TIE
+2446 OCR BRANCH BANK IDENTIFICATION
+2447 OCR AMOUNT OF CHECK
+2448 OCR DASH
+2449 OCR CUSTOMER ACCOUNT NUMBER
+244A OCR DOUBLE BACKSLASH
+2460 CIRCLED DIGIT ONE
+2461 CIRCLED DIGIT TWO
+2462 CIRCLED DIGIT THREE
+2463 CIRCLED DIGIT FOUR
+2464 CIRCLED DIGIT FIVE
+2465 CIRCLED DIGIT SIX
+2466 CIRCLED DIGIT SEVEN
+2467 CIRCLED DIGIT EIGHT
+2468 CIRCLED DIGIT NINE
+2469 CIRCLED NUMBER TEN
+246A CIRCLED NUMBER ELEVEN
+246B CIRCLED NUMBER TWELVE
+246C CIRCLED NUMBER THIRTEEN
+246D CIRCLED NUMBER FOURTEEN
+246E CIRCLED NUMBER FIFTEEN
+246F CIRCLED NUMBER SIXTEEN
+2470 CIRCLED NUMBER SEVENTEEN
+2471 CIRCLED NUMBER EIGHTEEN
+2472 CIRCLED NUMBER NINETEEN
+2473 CIRCLED NUMBER TWENTY
+2474 PARENTHESIZED DIGIT ONE
+2475 PARENTHESIZED DIGIT TWO
+2476 PARENTHESIZED DIGIT THREE
+2477 PARENTHESIZED DIGIT FOUR
+2478 PARENTHESIZED DIGIT FIVE
+2479 PARENTHESIZED DIGIT SIX
+247A PARENTHESIZED DIGIT SEVEN
+247B PARENTHESIZED DIGIT EIGHT
+247C PARENTHESIZED DIGIT NINE
+247D PARENTHESIZED NUMBER TEN
+247E PARENTHESIZED NUMBER ELEVEN
+247F PARENTHESIZED NUMBER TWELVE
+2480 PARENTHESIZED NUMBER THIRTEEN
+2481 PARENTHESIZED NUMBER FOURTEEN
+2482 PARENTHESIZED NUMBER FIFTEEN
+2483 PARENTHESIZED NUMBER SIXTEEN
+2484 PARENTHESIZED NUMBER SEVENTEEN
+2485 PARENTHESIZED NUMBER EIGHTEEN
+2486 PARENTHESIZED NUMBER NINETEEN
+2487 PARENTHESIZED NUMBER TWENTY
+2488 DIGIT ONE FULL STOP
+2489 DIGIT TWO FULL STOP
+248A DIGIT THREE FULL STOP
+248B DIGIT FOUR FULL STOP
+248C DIGIT FIVE FULL STOP
+248D DIGIT SIX FULL STOP
+248E DIGIT SEVEN FULL STOP
+248F DIGIT EIGHT FULL STOP
+2490 DIGIT NINE FULL STOP
+2491 NUMBER TEN FULL STOP
+2492 NUMBER ELEVEN FULL STOP
+2493 NUMBER TWELVE FULL STOP
+2494 NUMBER THIRTEEN FULL STOP
+2495 NUMBER FOURTEEN FULL STOP
+2496 NUMBER FIFTEEN FULL STOP
+2497 NUMBER SIXTEEN FULL STOP
+2498 NUMBER SEVENTEEN FULL STOP
+2499 NUMBER EIGHTEEN FULL STOP
+249A NUMBER NINETEEN FULL STOP
+249B NUMBER TWENTY FULL STOP
+249C PARENTHESIZED LATIN SMALL LETTER A
+249D PARENTHESIZED LATIN SMALL LETTER B
+249E PARENTHESIZED LATIN SMALL LETTER C
+249F PARENTHESIZED LATIN SMALL LETTER D
+24A0 PARENTHESIZED LATIN SMALL LETTER E
+24A1 PARENTHESIZED LATIN SMALL LETTER F
+24A2 PARENTHESIZED LATIN SMALL LETTER G
+24A3 PARENTHESIZED LATIN SMALL LETTER H
+24A4 PARENTHESIZED LATIN SMALL LETTER I
+24A5 PARENTHESIZED LATIN SMALL LETTER J
+24A6 PARENTHESIZED LATIN SMALL LETTER K
+24A7 PARENTHESIZED LATIN SMALL LETTER L
+24A8 PARENTHESIZED LATIN SMALL LETTER M
+24A9 PARENTHESIZED LATIN SMALL LETTER N
+24AA PARENTHESIZED LATIN SMALL LETTER O
+24AB PARENTHESIZED LATIN SMALL LETTER P
+24AC PARENTHESIZED LATIN SMALL LETTER Q
+24AD PARENTHESIZED LATIN SMALL LETTER R
+24AE PARENTHESIZED LATIN SMALL LETTER S
+24AF PARENTHESIZED LATIN SMALL LETTER T
+24B0 PARENTHESIZED LATIN SMALL LETTER U
+24B1 PARENTHESIZED LATIN SMALL LETTER V
+24B2 PARENTHESIZED LATIN SMALL LETTER W
+24B3 PARENTHESIZED LATIN SMALL LETTER X
+24B4 PARENTHESIZED LATIN SMALL LETTER Y
+24B5 PARENTHESIZED LATIN SMALL LETTER Z
+24B6 CIRCLED LATIN CAPITAL LETTER A
+24B7 CIRCLED LATIN CAPITAL LETTER B
+24B8 CIRCLED LATIN CAPITAL LETTER C
+24B9 CIRCLED LATIN CAPITAL LETTER D
+24BA CIRCLED LATIN CAPITAL LETTER E
+24BB CIRCLED LATIN CAPITAL LETTER F
+24BC CIRCLED LATIN CAPITAL LETTER G
+24BD CIRCLED LATIN CAPITAL LETTER H
+24BE CIRCLED LATIN CAPITAL LETTER I
+24BF CIRCLED LATIN CAPITAL LETTER J
+24C0 CIRCLED LATIN CAPITAL LETTER K
+24C1 CIRCLED LATIN CAPITAL LETTER L
+24C2 CIRCLED LATIN CAPITAL LETTER M
+24C3 CIRCLED LATIN CAPITAL LETTER N
+24C4 CIRCLED LATIN CAPITAL LETTER O
+24C5 CIRCLED LATIN CAPITAL LETTER P
+24C6 CIRCLED LATIN CAPITAL LETTER Q
+24C7 CIRCLED LATIN CAPITAL LETTER R
+24C8 CIRCLED LATIN CAPITAL LETTER S
+24C9 CIRCLED LATIN CAPITAL LETTER T
+24CA CIRCLED LATIN CAPITAL LETTER U
+24CB CIRCLED LATIN CAPITAL LETTER V
+24CC CIRCLED LATIN CAPITAL LETTER W
+24CD CIRCLED LATIN CAPITAL LETTER X
+24CE CIRCLED LATIN CAPITAL LETTER Y
+24CF CIRCLED LATIN CAPITAL LETTER Z
+24D0 CIRCLED LATIN SMALL LETTER A
+24D1 CIRCLED LATIN SMALL LETTER B
+24D2 CIRCLED LATIN SMALL LETTER C
+24D3 CIRCLED LATIN SMALL LETTER D
+24D4 CIRCLED LATIN SMALL LETTER E
+24D5 CIRCLED LATIN SMALL LETTER F
+24D6 CIRCLED LATIN SMALL LETTER G
+24D7 CIRCLED LATIN SMALL LETTER H
+24D8 CIRCLED LATIN SMALL LETTER I
+24D9 CIRCLED LATIN SMALL LETTER J
+24DA CIRCLED LATIN SMALL LETTER K
+24DB CIRCLED LATIN SMALL LETTER L
+24DC CIRCLED LATIN SMALL LETTER M
+24DD CIRCLED LATIN SMALL LETTER N
+24DE CIRCLED LATIN SMALL LETTER O
+24DF CIRCLED LATIN SMALL LETTER P
+24E0 CIRCLED LATIN SMALL LETTER Q
+24E1 CIRCLED LATIN SMALL LETTER R
+24E2 CIRCLED LATIN SMALL LETTER S
+24E3 CIRCLED LATIN SMALL LETTER T
+24E4 CIRCLED LATIN SMALL LETTER U
+24E5 CIRCLED LATIN SMALL LETTER V
+24E6 CIRCLED LATIN SMALL LETTER W
+24E7 CIRCLED LATIN SMALL LETTER X
+24E8 CIRCLED LATIN SMALL LETTER Y
+24E9 CIRCLED LATIN SMALL LETTER Z
+24EA CIRCLED DIGIT ZERO
+24EB NEGATIVE CIRCLED NUMBER ELEVEN
+24EC NEGATIVE CIRCLED NUMBER TWELVE
+24ED NEGATIVE CIRCLED NUMBER THIRTEEN
+24EE NEGATIVE CIRCLED NUMBER FOURTEEN
+24EF NEGATIVE CIRCLED NUMBER FIFTEEN
+24F0 NEGATIVE CIRCLED NUMBER SIXTEEN
+24F1 NEGATIVE CIRCLED NUMBER SEVENTEEN
+24F2 NEGATIVE CIRCLED NUMBER EIGHTEEN
+24F3 NEGATIVE CIRCLED NUMBER NINETEEN
+24F4 NEGATIVE CIRCLED NUMBER TWENTY
+24F5 DOUBLE CIRCLED DIGIT ONE
+24F6 DOUBLE CIRCLED DIGIT TWO
+24F7 DOUBLE CIRCLED DIGIT THREE
+24F8 DOUBLE CIRCLED DIGIT FOUR
+24F9 DOUBLE CIRCLED DIGIT FIVE
+24FA DOUBLE CIRCLED DIGIT SIX
+24FB DOUBLE CIRCLED DIGIT SEVEN
+24FC DOUBLE CIRCLED DIGIT EIGHT
+24FD DOUBLE CIRCLED DIGIT NINE
+24FE DOUBLE CIRCLED NUMBER TEN
+24FF NEGATIVE CIRCLED DIGIT ZERO
+2500 BOX DRAWINGS LIGHT HORIZONTAL
+2501 BOX DRAWINGS HEAVY HORIZONTAL
+2502 BOX DRAWINGS LIGHT VERTICAL
+2503 BOX DRAWINGS HEAVY VERTICAL
+2504 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C BOX DRAWINGS LIGHT DOWN AND RIGHT
+250D BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510 BOX DRAWINGS LIGHT DOWN AND LEFT
+2511 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513 BOX DRAWINGS HEAVY DOWN AND LEFT
+2514 BOX DRAWINGS LIGHT UP AND RIGHT
+2515 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517 BOX DRAWINGS HEAVY UP AND RIGHT
+2518 BOX DRAWINGS LIGHT UP AND LEFT
+2519 BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B BOX DRAWINGS HEAVY UP AND LEFT
+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251D BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251E BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521 BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522 BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523 BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526 BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527 BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529 BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252D BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531 BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532 BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535 BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536 BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539 BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253D BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540 BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541 BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543 BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544 BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545 BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546 BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547 BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548 BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549 BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550 BOX DRAWINGS DOUBLE HORIZONTAL
+2551 BOX DRAWINGS DOUBLE VERTICAL
+2552 BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553 BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554 BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555 BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556 BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557 BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558 BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559 BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A BOX DRAWINGS DOUBLE UP AND RIGHT
+255B BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D BOX DRAWINGS DOUBLE UP AND LEFT
+255E BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560 BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561 BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562 BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563 BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564 BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565 BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566 BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567 BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568 BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569 BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570 BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573 BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574 BOX DRAWINGS LIGHT LEFT
+2575 BOX DRAWINGS LIGHT UP
+2576 BOX DRAWINGS LIGHT RIGHT
+2577 BOX DRAWINGS LIGHT DOWN
+2578 BOX DRAWINGS HEAVY LEFT
+2579 BOX DRAWINGS HEAVY UP
+257A BOX DRAWINGS HEAVY RIGHT
+257B BOX DRAWINGS HEAVY DOWN
+257C BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580 UPPER HALF BLOCK
+2581 LOWER ONE EIGHTH BLOCK
+2582 LOWER ONE QUARTER BLOCK
+2583 LOWER THREE EIGHTHS BLOCK
+2584 LOWER HALF BLOCK
+2585 LOWER FIVE EIGHTHS BLOCK
+2586 LOWER THREE QUARTERS BLOCK
+2587 LOWER SEVEN EIGHTHS BLOCK
+2588 FULL BLOCK
+2589 LEFT SEVEN EIGHTHS BLOCK
+258A LEFT THREE QUARTERS BLOCK
+258B LEFT FIVE EIGHTHS BLOCK
+258C LEFT HALF BLOCK
+258D LEFT THREE EIGHTHS BLOCK
+258E LEFT ONE QUARTER BLOCK
+258F LEFT ONE EIGHTH BLOCK
+2590 RIGHT HALF BLOCK
+2591 LIGHT SHADE
+2592 MEDIUM SHADE
+2593 DARK SHADE
+2594 UPPER ONE EIGHTH BLOCK
+2595 RIGHT ONE EIGHTH BLOCK
+2596 QUADRANT LOWER LEFT
+2597 QUADRANT LOWER RIGHT
+2598 QUADRANT UPPER LEFT
+2599 QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+259A QUADRANT UPPER LEFT AND LOWER RIGHT
+259B QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+259C QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+259D QUADRANT UPPER RIGHT
+259E QUADRANT UPPER RIGHT AND LOWER LEFT
+259F QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+25A0 BLACK SQUARE
+25A1 WHITE SQUARE
+25A2 WHITE SQUARE WITH ROUNDED CORNERS
+25A3 WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4 SQUARE WITH HORIZONTAL FILL
+25A5 SQUARE WITH VERTICAL FILL
+25A6 SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9 SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA BLACK SMALL SQUARE
+25AB WHITE SMALL SQUARE
+25AC BLACK RECTANGLE
+25AD WHITE RECTANGLE
+25AE BLACK VERTICAL RECTANGLE
+25AF WHITE VERTICAL RECTANGLE
+25B0 BLACK PARALLELOGRAM
+25B1 WHITE PARALLELOGRAM
+25B2 BLACK UP-POINTING TRIANGLE
+25B3 WHITE UP-POINTING TRIANGLE
+25B4 BLACK UP-POINTING SMALL TRIANGLE
+25B5 WHITE UP-POINTING SMALL TRIANGLE
+25B6 BLACK RIGHT-POINTING TRIANGLE
+25B7 WHITE RIGHT-POINTING TRIANGLE
+25B8 BLACK RIGHT-POINTING SMALL TRIANGLE
+25B9 WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA BLACK RIGHT-POINTING POINTER
+25BB WHITE RIGHT-POINTING POINTER
+25BC BLACK DOWN-POINTING TRIANGLE
+25BD WHITE DOWN-POINTING TRIANGLE
+25BE BLACK DOWN-POINTING SMALL TRIANGLE
+25BF WHITE DOWN-POINTING SMALL TRIANGLE
+25C0 BLACK LEFT-POINTING TRIANGLE
+25C1 WHITE LEFT-POINTING TRIANGLE
+25C2 BLACK LEFT-POINTING SMALL TRIANGLE
+25C3 WHITE LEFT-POINTING SMALL TRIANGLE
+25C4 BLACK LEFT-POINTING POINTER
+25C5 WHITE LEFT-POINTING POINTER
+25C6 BLACK DIAMOND
+25C7 WHITE DIAMOND
+25C8 WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9 FISHEYE
+25CA LOZENGE
+25CB WHITE CIRCLE
+25CC DOTTED CIRCLE
+25CD CIRCLE WITH VERTICAL FILL
+25CE BULLSEYE
+25CF BLACK CIRCLE
+25D0 CIRCLE WITH LEFT HALF BLACK
+25D1 CIRCLE WITH RIGHT HALF BLACK
+25D2 CIRCLE WITH LOWER HALF BLACK
+25D3 CIRCLE WITH UPPER HALF BLACK
+25D4 CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5 CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6 LEFT HALF BLACK CIRCLE
+25D7 RIGHT HALF BLACK CIRCLE
+25D8 INVERSE BULLET
+25D9 INVERSE WHITE CIRCLE
+25DA UPPER HALF INVERSE WHITE CIRCLE
+25DB LOWER HALF INVERSE WHITE CIRCLE
+25DC UPPER LEFT QUADRANT CIRCULAR ARC
+25DD UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF LOWER LEFT QUADRANT CIRCULAR ARC
+25E0 UPPER HALF CIRCLE
+25E1 LOWER HALF CIRCLE
+25E2 BLACK LOWER RIGHT TRIANGLE
+25E3 BLACK LOWER LEFT TRIANGLE
+25E4 BLACK UPPER LEFT TRIANGLE
+25E5 BLACK UPPER RIGHT TRIANGLE
+25E6 WHITE BULLET
+25E7 SQUARE WITH LEFT HALF BLACK
+25E8 SQUARE WITH RIGHT HALF BLACK
+25E9 SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC WHITE UP-POINTING TRIANGLE WITH DOT
+25ED UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF LARGE CIRCLE
+25F0 WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1 WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2 WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3 WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4 WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5 WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6 WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7 WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8 UPPER LEFT TRIANGLE
+25F9 UPPER RIGHT TRIANGLE
+25FA LOWER LEFT TRIANGLE
+25FB WHITE MEDIUM SQUARE
+25FC BLACK MEDIUM SQUARE
+25FD WHITE MEDIUM SMALL SQUARE
+25FE BLACK MEDIUM SMALL SQUARE
+25FF LOWER RIGHT TRIANGLE
+2600 BLACK SUN WITH RAYS
+2601 CLOUD
+2602 UMBRELLA
+2603 SNOWMAN
+2604 COMET
+2605 BLACK STAR
+2606 WHITE STAR
+2607 LIGHTNING
+2608 THUNDERSTORM
+2609 SUN
+260A ASCENDING NODE
+260B DESCENDING NODE
+260C CONJUNCTION
+260D OPPOSITION
+260E BLACK TELEPHONE
+260F WHITE TELEPHONE
+2610 BALLOT BOX
+2611 BALLOT BOX WITH CHECK
+2612 BALLOT BOX WITH X
+2613 SALTIRE
+2614 UMBRELLA WITH RAIN DROPS
+2615 HOT BEVERAGE
+2616 WHITE SHOGI PIECE
+2617 BLACK SHOGI PIECE
+2618 SHAMROCK
+2619 REVERSED ROTATED FLORAL HEART BULLET
+261A BLACK LEFT POINTING INDEX
+261B BLACK RIGHT POINTING INDEX
+261C WHITE LEFT POINTING INDEX
+261D WHITE UP POINTING INDEX
+261E WHITE RIGHT POINTING INDEX
+261F WHITE DOWN POINTING INDEX
+2620 SKULL AND CROSSBONES
+2621 CAUTION SIGN
+2622 RADIOACTIVE SIGN
+2623 BIOHAZARD SIGN
+2624 CADUCEUS
+2625 ANKH
+2626 ORTHODOX CROSS
+2627 CHI RHO
+2628 CROSS OF LORRAINE
+2629 CROSS OF JERUSALEM
+262A STAR AND CRESCENT
+262B FARSI SYMBOL
+262C ADI SHAKTI
+262D HAMMER AND SICKLE
+262E PEACE SYMBOL
+262F YIN YANG
+2630 TRIGRAM FOR HEAVEN
+2631 TRIGRAM FOR LAKE
+2632 TRIGRAM FOR FIRE
+2633 TRIGRAM FOR THUNDER
+2634 TRIGRAM FOR WIND
+2635 TRIGRAM FOR WATER
+2636 TRIGRAM FOR MOUNTAIN
+2637 TRIGRAM FOR EARTH
+2638 WHEEL OF DHARMA
+2639 WHITE FROWNING FACE
+263A WHITE SMILING FACE
+263B BLACK SMILING FACE
+263C WHITE SUN WITH RAYS
+263D FIRST QUARTER MOON
+263E LAST QUARTER MOON
+263F MERCURY
+2640 FEMALE SIGN
+2641 EARTH
+2642 MALE SIGN
+2643 JUPITER
+2644 SATURN
+2645 URANUS
+2646 NEPTUNE
+2647 PLUTO
+2648 ARIES
+2649 TAURUS
+264A GEMINI
+264B CANCER
+264C LEO
+264D VIRGO
+264E LIBRA
+264F SCORPIUS
+2650 SAGITTARIUS
+2651 CAPRICORN
+2652 AQUARIUS
+2653 PISCES
+2654 WHITE CHESS KING
+2655 WHITE CHESS QUEEN
+2656 WHITE CHESS ROOK
+2657 WHITE CHESS BISHOP
+2658 WHITE CHESS KNIGHT
+2659 WHITE CHESS PAWN
+265A BLACK CHESS KING
+265B BLACK CHESS QUEEN
+265C BLACK CHESS ROOK
+265D BLACK CHESS BISHOP
+265E BLACK CHESS KNIGHT
+265F BLACK CHESS PAWN
+2660 BLACK SPADE SUIT
+2661 WHITE HEART SUIT
+2662 WHITE DIAMOND SUIT
+2663 BLACK CLUB SUIT
+2664 WHITE SPADE SUIT
+2665 BLACK HEART SUIT
+2666 BLACK DIAMOND SUIT
+2667 WHITE CLUB SUIT
+2668 HOT SPRINGS
+2669 QUARTER NOTE
+266A EIGHTH NOTE
+266B BEAMED EIGHTH NOTES
+266C BEAMED SIXTEENTH NOTES
+266D MUSIC FLAT SIGN
+266E MUSIC NATURAL SIGN
+266F MUSIC SHARP SIGN
+2670 WEST SYRIAC CROSS
+2671 EAST SYRIAC CROSS
+2672 UNIVERSAL RECYCLING SYMBOL
+2673 RECYCLING SYMBOL FOR TYPE-1 PLASTICS
+2674 RECYCLING SYMBOL FOR TYPE-2 PLASTICS
+2675 RECYCLING SYMBOL FOR TYPE-3 PLASTICS
+2676 RECYCLING SYMBOL FOR TYPE-4 PLASTICS
+2677 RECYCLING SYMBOL FOR TYPE-5 PLASTICS
+2678 RECYCLING SYMBOL FOR TYPE-6 PLASTICS
+2679 RECYCLING SYMBOL FOR TYPE-7 PLASTICS
+267A RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B BLACK UNIVERSAL RECYCLING SYMBOL
+267C RECYCLED PAPER SYMBOL
+267D PARTIALLY-RECYCLED PAPER SYMBOL
+267E PERMANENT PAPER SIGN
+267F WHEELCHAIR SYMBOL
+2680 DIE FACE-1
+2681 DIE FACE-2
+2682 DIE FACE-3
+2683 DIE FACE-4
+2684 DIE FACE-5
+2685 DIE FACE-6
+2686 WHITE CIRCLE WITH DOT RIGHT
+2687 WHITE CIRCLE WITH TWO DOTS
+2688 BLACK CIRCLE WITH WHITE DOT RIGHT
+2689 BLACK CIRCLE WITH TWO WHITE DOTS
+268A MONOGRAM FOR YANG
+268B MONOGRAM FOR YIN
+268C DIGRAM FOR GREATER YANG
+268D DIGRAM FOR LESSER YIN
+268E DIGRAM FOR LESSER YANG
+268F DIGRAM FOR GREATER YIN
+2690 WHITE FLAG
+2691 BLACK FLAG
+2692 HAMMER AND PICK
+2693 ANCHOR
+2694 CROSSED SWORDS
+2695 STAFF OF AESCULAPIUS
+2696 SCALES
+2697 ALEMBIC
+2698 FLOWER
+2699 GEAR
+269A STAFF OF HERMES
+269B ATOM SYMBOL
+269C FLEUR-DE-LIS
+269D OUTLINED WHITE STAR
+26A0 WARNING SIGN
+26A1 HIGH VOLTAGE SIGN
+26A2 DOUBLED FEMALE SIGN
+26A3 DOUBLED MALE SIGN
+26A4 INTERLOCKED FEMALE AND MALE SIGN
+26A5 MALE AND FEMALE SIGN
+26A6 MALE WITH STROKE SIGN
+26A7 MALE WITH STROKE AND MALE AND FEMALE SIGN
+26A8 VERTICAL MALE WITH STROKE SIGN
+26A9 HORIZONTAL MALE WITH STROKE SIGN
+26AA MEDIUM WHITE CIRCLE
+26AB MEDIUM BLACK CIRCLE
+26AC MEDIUM SMALL WHITE CIRCLE
+26AD MARRIAGE SYMBOL
+26AE DIVORCE SYMBOL
+26AF UNMARRIED PARTNERSHIP SYMBOL
+26B0 COFFIN
+26B1 FUNERAL URN
+26B2 NEUTER
+26B3 CERES
+26B4 PALLAS
+26B5 JUNO
+26B6 VESTA
+26B7 CHIRON
+26B8 BLACK MOON LILITH
+26B9 SEXTILE
+26BA SEMISEXTILE
+26BB QUINCUNX
+26BC SESQUIQUADRATE
+26C0 WHITE DRAUGHTS MAN
+26C1 WHITE DRAUGHTS KING
+26C2 BLACK DRAUGHTS MAN
+26C3 BLACK DRAUGHTS KING
+2701 UPPER BLADE SCISSORS
+2702 BLACK SCISSORS
+2703 LOWER BLADE SCISSORS
+2704 WHITE SCISSORS
+2706 TELEPHONE LOCATION SIGN
+2707 TAPE DRIVE
+2708 AIRPLANE
+2709 ENVELOPE
+270C VICTORY HAND
+270D WRITING HAND
+270E LOWER RIGHT PENCIL
+270F PENCIL
+2710 UPPER RIGHT PENCIL
+2711 WHITE NIB
+2712 BLACK NIB
+2713 CHECK MARK
+2714 HEAVY CHECK MARK
+2715 MULTIPLICATION X
+2716 HEAVY MULTIPLICATION X
+2717 BALLOT X
+2718 HEAVY BALLOT X
+2719 OUTLINED GREEK CROSS
+271A HEAVY GREEK CROSS
+271B OPEN CENTRE CROSS
+271C HEAVY OPEN CENTRE CROSS
+271D LATIN CROSS
+271E SHADOWED WHITE LATIN CROSS
+271F OUTLINED LATIN CROSS
+2720 MALTESE CROSS
+2721 STAR OF DAVID
+2722 FOUR TEARDROP-SPOKED ASTERISK
+2723 FOUR BALLOON-SPOKED ASTERISK
+2724 HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725 FOUR CLUB-SPOKED ASTERISK
+2726 BLACK FOUR POINTED STAR
+2727 WHITE FOUR POINTED STAR
+2729 STRESS OUTLINED WHITE STAR
+272A CIRCLED WHITE STAR
+272B OPEN CENTRE BLACK STAR
+272C BLACK CENTRE WHITE STAR
+272D OUTLINED BLACK STAR
+272E HEAVY OUTLINED BLACK STAR
+272F PINWHEEL STAR
+2730 SHADOWED WHITE STAR
+2731 HEAVY ASTERISK
+2732 OPEN CENTRE ASTERISK
+2733 EIGHT SPOKED ASTERISK
+2734 EIGHT POINTED BLACK STAR
+2735 EIGHT POINTED PINWHEEL STAR
+2736 SIX POINTED BLACK STAR
+2737 EIGHT POINTED RECTILINEAR BLACK STAR
+2738 HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739 TWELVE POINTED BLACK STAR
+273A SIXTEEN POINTED ASTERISK
+273B TEARDROP-SPOKED ASTERISK
+273C OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D HEAVY TEARDROP-SPOKED ASTERISK
+273E SIX PETALLED BLACK AND WHITE FLORETTE
+273F BLACK FLORETTE
+2740 WHITE FLORETTE
+2741 EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742 CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743 HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744 SNOWFLAKE
+2745 TIGHT TRIFOLIATE SNOWFLAKE
+2746 HEAVY CHEVRON SNOWFLAKE
+2747 SPARKLE
+2748 HEAVY SPARKLE
+2749 BALLOON-SPOKED ASTERISK
+274A EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D SHADOWED WHITE CIRCLE
+274F LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750 UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751 LOWER RIGHT SHADOWED WHITE SQUARE
+2752 UPPER RIGHT SHADOWED WHITE SQUARE
+2756 BLACK DIAMOND MINUS WHITE X
+2758 LIGHT VERTICAL BAR
+2759 MEDIUM VERTICAL BAR
+275A HEAVY VERTICAL BAR
+275B HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761 CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762 HEAVY EXCLAMATION MARK ORNAMENT
+2763 HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764 HEAVY BLACK HEART
+2765 ROTATED HEAVY BLACK HEART BULLET
+2766 FLORAL HEART
+2767 ROTATED FLORAL HEART BULLET
+2768 MEDIUM LEFT PARENTHESIS ORNAMENT
+2769 MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770 HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771 HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772 LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773 LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774 MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775 MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776 DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777 DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778 DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779 DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277A DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277B DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277C DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277D DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277E DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277F DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780 DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781 DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782 DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783 DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784 DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785 DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786 DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787 DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788 DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789 DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278A DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278B DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278C DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278D DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278E DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278F DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794 HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798 HEAVY SOUTH EAST ARROW
+2799 HEAVY RIGHTWARDS ARROW
+279A HEAVY NORTH EAST ARROW
+279B DRAFTING POINT RIGHTWARDS ARROW
+279C HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D TRIANGLE-HEADED RIGHTWARDS ARROW
+279E HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0 HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1 BLACK RIGHTWARDS ARROW
+27A2 THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3 THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4 BLACK RIGHTWARDS ARROWHEAD
+27A5 HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6 HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7 SQUAT BLACK RIGHTWARDS ARROW
+27A8 HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9 RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3 WHITE-FEATHERED RIGHTWARDS ARROW
+27B4 BLACK-FEATHERED SOUTH EAST ARROW
+27B5 BLACK-FEATHERED RIGHTWARDS ARROW
+27B6 BLACK-FEATHERED NORTH EAST ARROW
+27B7 HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8 HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9 HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA TEARDROP-BARBED RIGHTWARDS ARROW
+27BB HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC WEDGE-TAILED RIGHTWARDS ARROW
+27BD HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE OPEN-OUTLINED RIGHTWARDS ARROW
+27C0 THREE DIMENSIONAL ANGLE
+27C1 WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE
+27C2 PERPENDICULAR
+27C3 OPEN SUBSET
+27C4 OPEN SUPERSET
+27C5 LEFT S-SHAPED BAG DELIMITER
+27C6 RIGHT S-SHAPED BAG DELIMITER
+27C7 OR WITH DOT INSIDE
+27C8 REVERSE SOLIDUS PRECEDING SUBSET
+27C9 SUPERSET PRECEDING SOLIDUS
+27CA VERTICAL BAR WITH HORIZONTAL STROKE
+27CC LONG DIVISION
+27D0 WHITE DIAMOND WITH CENTRED DOT
+27D1 AND WITH DOT
+27D2 ELEMENT OF OPENING UPWARDS
+27D3 LOWER RIGHT CORNER WITH DOT
+27D4 UPPER LEFT CORNER WITH DOT
+27D5 LEFT OUTER JOIN
+27D6 RIGHT OUTER JOIN
+27D7 FULL OUTER JOIN
+27D8 LARGE UP TACK
+27D9 LARGE DOWN TACK
+27DA LEFT AND RIGHT DOUBLE TURNSTILE
+27DB LEFT AND RIGHT TACK
+27DC LEFT MULTIMAP
+27DD LONG RIGHT TACK
+27DE LONG LEFT TACK
+27DF UP TACK WITH CIRCLE ABOVE
+27E0 LOZENGE DIVIDED BY HORIZONTAL RULE
+27E1 WHITE CONCAVE-SIDED DIAMOND
+27E2 WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3 WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4 WHITE SQUARE WITH LEFTWARDS TICK
+27E5 WHITE SQUARE WITH RIGHTWARDS TICK
+27E6 MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 MATHEMATICAL LEFT ANGLE BRACKET
+27E9 MATHEMATICAL RIGHT ANGLE BRACKET
+27EA MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0 UPWARDS QUADRUPLE ARROW
+27F1 DOWNWARDS QUADRUPLE ARROW
+27F2 ANTICLOCKWISE GAPPED CIRCLE ARROW
+27F3 CLOCKWISE GAPPED CIRCLE ARROW
+27F4 RIGHT ARROW WITH CIRCLED PLUS
+27F5 LONG LEFTWARDS ARROW
+27F6 LONG RIGHTWARDS ARROW
+27F7 LONG LEFT RIGHT ARROW
+27F8 LONG LEFTWARDS DOUBLE ARROW
+27F9 LONG RIGHTWARDS DOUBLE ARROW
+27FA LONG LEFT RIGHT DOUBLE ARROW
+27FB LONG LEFTWARDS ARROW FROM BAR
+27FC LONG RIGHTWARDS ARROW FROM BAR
+27FD LONG LEFTWARDS DOUBLE ARROW FROM BAR
+27FE LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+27FF LONG RIGHTWARDS SQUIGGLE ARROW
+2800 BRAILLE PATTERN BLANK
+2801 BRAILLE PATTERN DOTS-1
+2802 BRAILLE PATTERN DOTS-2
+2803 BRAILLE PATTERN DOTS-12
+2804 BRAILLE PATTERN DOTS-3
+2805 BRAILLE PATTERN DOTS-13
+2806 BRAILLE PATTERN DOTS-23
+2807 BRAILLE PATTERN DOTS-123
+2808 BRAILLE PATTERN DOTS-4
+2809 BRAILLE PATTERN DOTS-14
+280A BRAILLE PATTERN DOTS-24
+280B BRAILLE PATTERN DOTS-124
+280C BRAILLE PATTERN DOTS-34
+280D BRAILLE PATTERN DOTS-134
+280E BRAILLE PATTERN DOTS-234
+280F BRAILLE PATTERN DOTS-1234
+2810 BRAILLE PATTERN DOTS-5
+2811 BRAILLE PATTERN DOTS-15
+2812 BRAILLE PATTERN DOTS-25
+2813 BRAILLE PATTERN DOTS-125
+2814 BRAILLE PATTERN DOTS-35
+2815 BRAILLE PATTERN DOTS-135
+2816 BRAILLE PATTERN DOTS-235
+2817 BRAILLE PATTERN DOTS-1235
+2818 BRAILLE PATTERN DOTS-45
+2819 BRAILLE PATTERN DOTS-145
+281A BRAILLE PATTERN DOTS-245
+281B BRAILLE PATTERN DOTS-1245
+281C BRAILLE PATTERN DOTS-345
+281D BRAILLE PATTERN DOTS-1345
+281E BRAILLE PATTERN DOTS-2345
+281F BRAILLE PATTERN DOTS-12345
+2820 BRAILLE PATTERN DOTS-6
+2821 BRAILLE PATTERN DOTS-16
+2822 BRAILLE PATTERN DOTS-26
+2823 BRAILLE PATTERN DOTS-126
+2824 BRAILLE PATTERN DOTS-36
+2825 BRAILLE PATTERN DOTS-136
+2826 BRAILLE PATTERN DOTS-236
+2827 BRAILLE PATTERN DOTS-1236
+2828 BRAILLE PATTERN DOTS-46
+2829 BRAILLE PATTERN DOTS-146
+282A BRAILLE PATTERN DOTS-246
+282B BRAILLE PATTERN DOTS-1246
+282C BRAILLE PATTERN DOTS-346
+282D BRAILLE PATTERN DOTS-1346
+282E BRAILLE PATTERN DOTS-2346
+282F BRAILLE PATTERN DOTS-12346
+2830 BRAILLE PATTERN DOTS-56
+2831 BRAILLE PATTERN DOTS-156
+2832 BRAILLE PATTERN DOTS-256
+2833 BRAILLE PATTERN DOTS-1256
+2834 BRAILLE PATTERN DOTS-356
+2835 BRAILLE PATTERN DOTS-1356
+2836 BRAILLE PATTERN DOTS-2356
+2837 BRAILLE PATTERN DOTS-12356
+2838 BRAILLE PATTERN DOTS-456
+2839 BRAILLE PATTERN DOTS-1456
+283A BRAILLE PATTERN DOTS-2456
+283B BRAILLE PATTERN DOTS-12456
+283C BRAILLE PATTERN DOTS-3456
+283D BRAILLE PATTERN DOTS-13456
+283E BRAILLE PATTERN DOTS-23456
+283F BRAILLE PATTERN DOTS-123456
+2840 BRAILLE PATTERN DOTS-7
+2841 BRAILLE PATTERN DOTS-17
+2842 BRAILLE PATTERN DOTS-27
+2843 BRAILLE PATTERN DOTS-127
+2844 BRAILLE PATTERN DOTS-37
+2845 BRAILLE PATTERN DOTS-137
+2846 BRAILLE PATTERN DOTS-237
+2847 BRAILLE PATTERN DOTS-1237
+2848 BRAILLE PATTERN DOTS-47
+2849 BRAILLE PATTERN DOTS-147
+284A BRAILLE PATTERN DOTS-247
+284B BRAILLE PATTERN DOTS-1247
+284C BRAILLE PATTERN DOTS-347
+284D BRAILLE PATTERN DOTS-1347
+284E BRAILLE PATTERN DOTS-2347
+284F BRAILLE PATTERN DOTS-12347
+2850 BRAILLE PATTERN DOTS-57
+2851 BRAILLE PATTERN DOTS-157
+2852 BRAILLE PATTERN DOTS-257
+2853 BRAILLE PATTERN DOTS-1257
+2854 BRAILLE PATTERN DOTS-357
+2855 BRAILLE PATTERN DOTS-1357
+2856 BRAILLE PATTERN DOTS-2357
+2857 BRAILLE PATTERN DOTS-12357
+2858 BRAILLE PATTERN DOTS-457
+2859 BRAILLE PATTERN DOTS-1457
+285A BRAILLE PATTERN DOTS-2457
+285B BRAILLE PATTERN DOTS-12457
+285C BRAILLE PATTERN DOTS-3457
+285D BRAILLE PATTERN DOTS-13457
+285E BRAILLE PATTERN DOTS-23457
+285F BRAILLE PATTERN DOTS-123457
+2860 BRAILLE PATTERN DOTS-67
+2861 BRAILLE PATTERN DOTS-167
+2862 BRAILLE PATTERN DOTS-267
+2863 BRAILLE PATTERN DOTS-1267
+2864 BRAILLE PATTERN DOTS-367
+2865 BRAILLE PATTERN DOTS-1367
+2866 BRAILLE PATTERN DOTS-2367
+2867 BRAILLE PATTERN DOTS-12367
+2868 BRAILLE PATTERN DOTS-467
+2869 BRAILLE PATTERN DOTS-1467
+286A BRAILLE PATTERN DOTS-2467
+286B BRAILLE PATTERN DOTS-12467
+286C BRAILLE PATTERN DOTS-3467
+286D BRAILLE PATTERN DOTS-13467
+286E BRAILLE PATTERN DOTS-23467
+286F BRAILLE PATTERN DOTS-123467
+2870 BRAILLE PATTERN DOTS-567
+2871 BRAILLE PATTERN DOTS-1567
+2872 BRAILLE PATTERN DOTS-2567
+2873 BRAILLE PATTERN DOTS-12567
+2874 BRAILLE PATTERN DOTS-3567
+2875 BRAILLE PATTERN DOTS-13567
+2876 BRAILLE PATTERN DOTS-23567
+2877 BRAILLE PATTERN DOTS-123567
+2878 BRAILLE PATTERN DOTS-4567
+2879 BRAILLE PATTERN DOTS-14567
+287A BRAILLE PATTERN DOTS-24567
+287B BRAILLE PATTERN DOTS-124567
+287C BRAILLE PATTERN DOTS-34567
+287D BRAILLE PATTERN DOTS-134567
+287E BRAILLE PATTERN DOTS-234567
+287F BRAILLE PATTERN DOTS-1234567
+2880 BRAILLE PATTERN DOTS-8
+2881 BRAILLE PATTERN DOTS-18
+2882 BRAILLE PATTERN DOTS-28
+2883 BRAILLE PATTERN DOTS-128
+2884 BRAILLE PATTERN DOTS-38
+2885 BRAILLE PATTERN DOTS-138
+2886 BRAILLE PATTERN DOTS-238
+2887 BRAILLE PATTERN DOTS-1238
+2888 BRAILLE PATTERN DOTS-48
+2889 BRAILLE PATTERN DOTS-148
+288A BRAILLE PATTERN DOTS-248
+288B BRAILLE PATTERN DOTS-1248
+288C BRAILLE PATTERN DOTS-348
+288D BRAILLE PATTERN DOTS-1348
+288E BRAILLE PATTERN DOTS-2348
+288F BRAILLE PATTERN DOTS-12348
+2890 BRAILLE PATTERN DOTS-58
+2891 BRAILLE PATTERN DOTS-158
+2892 BRAILLE PATTERN DOTS-258
+2893 BRAILLE PATTERN DOTS-1258
+2894 BRAILLE PATTERN DOTS-358
+2895 BRAILLE PATTERN DOTS-1358
+2896 BRAILLE PATTERN DOTS-2358
+2897 BRAILLE PATTERN DOTS-12358
+2898 BRAILLE PATTERN DOTS-458
+2899 BRAILLE PATTERN DOTS-1458
+289A BRAILLE PATTERN DOTS-2458
+289B BRAILLE PATTERN DOTS-12458
+289C BRAILLE PATTERN DOTS-3458
+289D BRAILLE PATTERN DOTS-13458
+289E BRAILLE PATTERN DOTS-23458
+289F BRAILLE PATTERN DOTS-123458
+28A0 BRAILLE PATTERN DOTS-68
+28A1 BRAILLE PATTERN DOTS-168
+28A2 BRAILLE PATTERN DOTS-268
+28A3 BRAILLE PATTERN DOTS-1268
+28A4 BRAILLE PATTERN DOTS-368
+28A5 BRAILLE PATTERN DOTS-1368
+28A6 BRAILLE PATTERN DOTS-2368
+28A7 BRAILLE PATTERN DOTS-12368
+28A8 BRAILLE PATTERN DOTS-468
+28A9 BRAILLE PATTERN DOTS-1468
+28AA BRAILLE PATTERN DOTS-2468
+28AB BRAILLE PATTERN DOTS-12468
+28AC BRAILLE PATTERN DOTS-3468
+28AD BRAILLE PATTERN DOTS-13468
+28AE BRAILLE PATTERN DOTS-23468
+28AF BRAILLE PATTERN DOTS-123468
+28B0 BRAILLE PATTERN DOTS-568
+28B1 BRAILLE PATTERN DOTS-1568
+28B2 BRAILLE PATTERN DOTS-2568
+28B3 BRAILLE PATTERN DOTS-12568
+28B4 BRAILLE PATTERN DOTS-3568
+28B5 BRAILLE PATTERN DOTS-13568
+28B6 BRAILLE PATTERN DOTS-23568
+28B7 BRAILLE PATTERN DOTS-123568
+28B8 BRAILLE PATTERN DOTS-4568
+28B9 BRAILLE PATTERN DOTS-14568
+28BA BRAILLE PATTERN DOTS-24568
+28BB BRAILLE PATTERN DOTS-124568
+28BC BRAILLE PATTERN DOTS-34568
+28BD BRAILLE PATTERN DOTS-134568
+28BE BRAILLE PATTERN DOTS-234568
+28BF BRAILLE PATTERN DOTS-1234568
+28C0 BRAILLE PATTERN DOTS-78
+28C1 BRAILLE PATTERN DOTS-178
+28C2 BRAILLE PATTERN DOTS-278
+28C3 BRAILLE PATTERN DOTS-1278
+28C4 BRAILLE PATTERN DOTS-378
+28C5 BRAILLE PATTERN DOTS-1378
+28C6 BRAILLE PATTERN DOTS-2378
+28C7 BRAILLE PATTERN DOTS-12378
+28C8 BRAILLE PATTERN DOTS-478
+28C9 BRAILLE PATTERN DOTS-1478
+28CA BRAILLE PATTERN DOTS-2478
+28CB BRAILLE PATTERN DOTS-12478
+28CC BRAILLE PATTERN DOTS-3478
+28CD BRAILLE PATTERN DOTS-13478
+28CE BRAILLE PATTERN DOTS-23478
+28CF BRAILLE PATTERN DOTS-123478
+28D0 BRAILLE PATTERN DOTS-578
+28D1 BRAILLE PATTERN DOTS-1578
+28D2 BRAILLE PATTERN DOTS-2578
+28D3 BRAILLE PATTERN DOTS-12578
+28D4 BRAILLE PATTERN DOTS-3578
+28D5 BRAILLE PATTERN DOTS-13578
+28D6 BRAILLE PATTERN DOTS-23578
+28D7 BRAILLE PATTERN DOTS-123578
+28D8 BRAILLE PATTERN DOTS-4578
+28D9 BRAILLE PATTERN DOTS-14578
+28DA BRAILLE PATTERN DOTS-24578
+28DB BRAILLE PATTERN DOTS-124578
+28DC BRAILLE PATTERN DOTS-34578
+28DD BRAILLE PATTERN DOTS-134578
+28DE BRAILLE PATTERN DOTS-234578
+28DF BRAILLE PATTERN DOTS-1234578
+28E0 BRAILLE PATTERN DOTS-678
+28E1 BRAILLE PATTERN DOTS-1678
+28E2 BRAILLE PATTERN DOTS-2678
+28E3 BRAILLE PATTERN DOTS-12678
+28E4 BRAILLE PATTERN DOTS-3678
+28E5 BRAILLE PATTERN DOTS-13678
+28E6 BRAILLE PATTERN DOTS-23678
+28E7 BRAILLE PATTERN DOTS-123678
+28E8 BRAILLE PATTERN DOTS-4678
+28E9 BRAILLE PATTERN DOTS-14678
+28EA BRAILLE PATTERN DOTS-24678
+28EB BRAILLE PATTERN DOTS-124678
+28EC BRAILLE PATTERN DOTS-34678
+28ED BRAILLE PATTERN DOTS-134678
+28EE BRAILLE PATTERN DOTS-234678
+28EF BRAILLE PATTERN DOTS-1234678
+28F0 BRAILLE PATTERN DOTS-5678
+28F1 BRAILLE PATTERN DOTS-15678
+28F2 BRAILLE PATTERN DOTS-25678
+28F3 BRAILLE PATTERN DOTS-125678
+28F4 BRAILLE PATTERN DOTS-35678
+28F5 BRAILLE PATTERN DOTS-135678
+28F6 BRAILLE PATTERN DOTS-235678
+28F7 BRAILLE PATTERN DOTS-1235678
+28F8 BRAILLE PATTERN DOTS-45678
+28F9 BRAILLE PATTERN DOTS-145678
+28FA BRAILLE PATTERN DOTS-245678
+28FB BRAILLE PATTERN DOTS-1245678
+28FC BRAILLE PATTERN DOTS-345678
+28FD BRAILLE PATTERN DOTS-1345678
+28FE BRAILLE PATTERN DOTS-2345678
+28FF BRAILLE PATTERN DOTS-12345678
+2900 RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2901 RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2902 LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2903 RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2904 LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+2905 RIGHTWARDS TWO-HEADED ARROW FROM BAR
+2906 LEFTWARDS DOUBLE ARROW FROM BAR
+2907 RIGHTWARDS DOUBLE ARROW FROM BAR
+2908 DOWNWARDS ARROW WITH HORIZONTAL STROKE
+2909 UPWARDS ARROW WITH HORIZONTAL STROKE
+290A UPWARDS TRIPLE ARROW
+290B DOWNWARDS TRIPLE ARROW
+290C LEFTWARDS DOUBLE DASH ARROW
+290D RIGHTWARDS DOUBLE DASH ARROW
+290E LEFTWARDS TRIPLE DASH ARROW
+290F RIGHTWARDS TRIPLE DASH ARROW
+2910 RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+2911 RIGHTWARDS ARROW WITH DOTTED STEM
+2912 UPWARDS ARROW TO BAR
+2913 DOWNWARDS ARROW TO BAR
+2914 RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2915 RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2916 RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+2917 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2918 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2919 LEFTWARDS ARROW-TAIL
+291A RIGHTWARDS ARROW-TAIL
+291B LEFTWARDS DOUBLE ARROW-TAIL
+291C RIGHTWARDS DOUBLE ARROW-TAIL
+291D LEFTWARDS ARROW TO BLACK DIAMOND
+291E RIGHTWARDS ARROW TO BLACK DIAMOND
+291F LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2920 RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2921 NORTH WEST AND SOUTH EAST ARROW
+2922 NORTH EAST AND SOUTH WEST ARROW
+2923 NORTH WEST ARROW WITH HOOK
+2924 NORTH EAST ARROW WITH HOOK
+2925 SOUTH EAST ARROW WITH HOOK
+2926 SOUTH WEST ARROW WITH HOOK
+2927 NORTH WEST ARROW AND NORTH EAST ARROW
+2928 NORTH EAST ARROW AND SOUTH EAST ARROW
+2929 SOUTH EAST ARROW AND SOUTH WEST ARROW
+292A SOUTH WEST ARROW AND NORTH WEST ARROW
+292B RISING DIAGONAL CROSSING FALLING DIAGONAL
+292C FALLING DIAGONAL CROSSING RISING DIAGONAL
+292D SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+292E NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+292F FALLING DIAGONAL CROSSING NORTH EAST ARROW
+2930 RISING DIAGONAL CROSSING SOUTH EAST ARROW
+2931 NORTH EAST ARROW CROSSING NORTH WEST ARROW
+2932 NORTH WEST ARROW CROSSING NORTH EAST ARROW
+2933 WAVE ARROW POINTING DIRECTLY RIGHT
+2934 ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+2935 ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+2936 ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+2937 ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+2938 RIGHT-SIDE ARC CLOCKWISE ARROW
+2939 LEFT-SIDE ARC ANTICLOCKWISE ARROW
+293A TOP ARC ANTICLOCKWISE ARROW
+293B BOTTOM ARC ANTICLOCKWISE ARROW
+293C TOP ARC CLOCKWISE ARROW WITH MINUS
+293D TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+293E LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
+293F LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
+2940 ANTICLOCKWISE CLOSED CIRCLE ARROW
+2941 CLOCKWISE CLOSED CIRCLE ARROW
+2942 RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+2943 LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+2944 SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+2945 RIGHTWARDS ARROW WITH PLUS BELOW
+2946 LEFTWARDS ARROW WITH PLUS BELOW
+2947 RIGHTWARDS ARROW THROUGH X
+2948 LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+2949 UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+294A LEFT BARB UP RIGHT BARB DOWN HARPOON
+294B LEFT BARB DOWN RIGHT BARB UP HARPOON
+294C UP BARB RIGHT DOWN BARB LEFT HARPOON
+294D UP BARB LEFT DOWN BARB RIGHT HARPOON
+294E LEFT BARB UP RIGHT BARB UP HARPOON
+294F UP BARB RIGHT DOWN BARB RIGHT HARPOON
+2950 LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+2951 UP BARB LEFT DOWN BARB LEFT HARPOON
+2952 LEFTWARDS HARPOON WITH BARB UP TO BAR
+2953 RIGHTWARDS HARPOON WITH BARB UP TO BAR
+2954 UPWARDS HARPOON WITH BARB RIGHT TO BAR
+2955 DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+2956 LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+2957 RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+2958 UPWARDS HARPOON WITH BARB LEFT TO BAR
+2959 DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+295A LEFTWARDS HARPOON WITH BARB UP FROM BAR
+295B RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+295C UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+295D DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+295E LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+295F RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+2960 UPWARDS HARPOON WITH BARB LEFT FROM BAR
+2961 DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+2962 LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+2963 UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2964 RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2965 DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+2966 LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+2967 LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2968 RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+2969 RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+296A LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296B LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296C RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296D RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296E UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+296F DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2970 RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+2971 EQUALS SIGN ABOVE RIGHTWARDS ARROW
+2972 TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2973 LEFTWARDS ARROW ABOVE TILDE OPERATOR
+2974 RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+2975 RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+2976 LESS-THAN ABOVE LEFTWARDS ARROW
+2977 LEFTWARDS ARROW THROUGH LESS-THAN
+2978 GREATER-THAN ABOVE RIGHTWARDS ARROW
+2979 SUBSET ABOVE RIGHTWARDS ARROW
+297A LEFTWARDS ARROW THROUGH SUBSET
+297B SUPERSET ABOVE LEFTWARDS ARROW
+297C LEFT FISH TAIL
+297D RIGHT FISH TAIL
+297E UP FISH TAIL
+297F DOWN FISH TAIL
+2980 TRIPLE VERTICAL BAR DELIMITER
+2981 Z NOTATION SPOT
+2982 Z NOTATION TYPE COLON
+2983 LEFT WHITE CURLY BRACKET
+2984 RIGHT WHITE CURLY BRACKET
+2985 LEFT WHITE PARENTHESIS
+2986 RIGHT WHITE PARENTHESIS
+2987 Z NOTATION LEFT IMAGE BRACKET
+2988 Z NOTATION RIGHT IMAGE BRACKET
+2989 Z NOTATION LEFT BINDING BRACKET
+298A Z NOTATION RIGHT BINDING BRACKET
+298B LEFT SQUARE BRACKET WITH UNDERBAR
+298C RIGHT SQUARE BRACKET WITH UNDERBAR
+298D LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 LEFT ANGLE BRACKET WITH DOT
+2992 RIGHT ANGLE BRACKET WITH DOT
+2993 LEFT ARC LESS-THAN BRACKET
+2994 RIGHT ARC GREATER-THAN BRACKET
+2995 DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 LEFT BLACK TORTOISE SHELL BRACKET
+2998 RIGHT BLACK TORTOISE SHELL BRACKET
+2999 DOTTED FENCE
+299A VERTICAL ZIGZAG LINE
+299B MEASURED ANGLE OPENING LEFT
+299C RIGHT ANGLE VARIANT WITH SQUARE
+299D MEASURED RIGHT ANGLE WITH DOT
+299E ANGLE WITH S INSIDE
+299F ACUTE ANGLE
+29A0 SPHERICAL ANGLE OPENING LEFT
+29A1 SPHERICAL ANGLE OPENING UP
+29A2 TURNED ANGLE
+29A3 REVERSED ANGLE
+29A4 ANGLE WITH UNDERBAR
+29A5 REVERSED ANGLE WITH UNDERBAR
+29A6 OBLIQUE ANGLE OPENING UP
+29A7 OBLIQUE ANGLE OPENING DOWN
+29A8 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+29A9 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+29AA MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+29AB MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+29AC MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+29AD MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+29AE MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+29AF MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+29B0 REVERSED EMPTY SET
+29B1 EMPTY SET WITH OVERBAR
+29B2 EMPTY SET WITH SMALL CIRCLE ABOVE
+29B3 EMPTY SET WITH RIGHT ARROW ABOVE
+29B4 EMPTY SET WITH LEFT ARROW ABOVE
+29B5 CIRCLE WITH HORIZONTAL BAR
+29B6 CIRCLED VERTICAL BAR
+29B7 CIRCLED PARALLEL
+29B8 CIRCLED REVERSE SOLIDUS
+29B9 CIRCLED PERPENDICULAR
+29BA CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
+29BB CIRCLE WITH SUPERIMPOSED X
+29BC CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+29BD UP ARROW THROUGH CIRCLE
+29BE CIRCLED WHITE BULLET
+29BF CIRCLED BULLET
+29C0 CIRCLED LESS-THAN
+29C1 CIRCLED GREATER-THAN
+29C2 CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+29C3 CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+29C4 SQUARED RISING DIAGONAL SLASH
+29C5 SQUARED FALLING DIAGONAL SLASH
+29C6 SQUARED ASTERISK
+29C7 SQUARED SMALL CIRCLE
+29C8 SQUARED SQUARE
+29C9 TWO JOINED SQUARES
+29CA TRIANGLE WITH DOT ABOVE
+29CB TRIANGLE WITH UNDERBAR
+29CC S IN TRIANGLE
+29CD TRIANGLE WITH SERIFS AT BOTTOM
+29CE RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+29CF LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0 VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1 BOWTIE WITH LEFT HALF BLACK
+29D2 BOWTIE WITH RIGHT HALF BLACK
+29D3 BLACK BOWTIE
+29D4 TIMES WITH LEFT HALF BLACK
+29D5 TIMES WITH RIGHT HALF BLACK
+29D6 WHITE HOURGLASS
+29D7 BLACK HOURGLASS
+29D8 LEFT WIGGLY FENCE
+29D9 RIGHT WIGGLY FENCE
+29DA LEFT DOUBLE WIGGLY FENCE
+29DB RIGHT DOUBLE WIGGLY FENCE
+29DC INCOMPLETE INFINITY
+29DD TIE OVER INFINITY
+29DE INFINITY NEGATED WITH VERTICAL BAR
+29DF DOUBLE-ENDED MULTIMAP
+29E0 SQUARE WITH CONTOURED OUTLINE
+29E1 INCREASES AS
+29E2 SHUFFLE PRODUCT
+29E3 EQUALS SIGN AND SLANTED PARALLEL
+29E4 EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+29E5 IDENTICAL TO AND SLANTED PARALLEL
+29E6 GLEICH STARK
+29E7 THERMODYNAMIC
+29E8 DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+29E9 DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+29EA BLACK DIAMOND WITH DOWN ARROW
+29EB BLACK LOZENGE
+29EC WHITE CIRCLE WITH DOWN ARROW
+29ED BLACK CIRCLE WITH DOWN ARROW
+29EE ERROR-BARRED WHITE SQUARE
+29EF ERROR-BARRED BLACK SQUARE
+29F0 ERROR-BARRED WHITE DIAMOND
+29F1 ERROR-BARRED BLACK DIAMOND
+29F2 ERROR-BARRED WHITE CIRCLE
+29F3 ERROR-BARRED BLACK CIRCLE
+29F4 RULE-DELAYED
+29F5 REVERSE SOLIDUS OPERATOR
+29F6 SOLIDUS WITH OVERBAR
+29F7 REVERSE SOLIDUS WITH HORIZONTAL STROKE
+29F8 BIG SOLIDUS
+29F9 BIG REVERSE SOLIDUS
+29FA DOUBLE PLUS
+29FB TRIPLE PLUS
+29FC LEFT-POINTING CURVED ANGLE BRACKET
+29FD RIGHT-POINTING CURVED ANGLE BRACKET
+29FE TINY
+29FF MINY
+2A00 N-ARY CIRCLED DOT OPERATOR
+2A01 N-ARY CIRCLED PLUS OPERATOR
+2A02 N-ARY CIRCLED TIMES OPERATOR
+2A03 N-ARY UNION OPERATOR WITH DOT
+2A04 N-ARY UNION OPERATOR WITH PLUS
+2A05 N-ARY SQUARE INTERSECTION OPERATOR
+2A06 N-ARY SQUARE UNION OPERATOR
+2A07 TWO LOGICAL AND OPERATOR
+2A08 TWO LOGICAL OR OPERATOR
+2A09 N-ARY TIMES OPERATOR
+2A0A MODULO TWO SUM
+2A0B SUMMATION WITH INTEGRAL
+2A0C QUADRUPLE INTEGRAL OPERATOR
+2A0D FINITE PART INTEGRAL
+2A0E INTEGRAL WITH DOUBLE STROKE
+2A0F INTEGRAL AVERAGE WITH SLASH
+2A10 CIRCULATION FUNCTION
+2A11 ANTICLOCKWISE INTEGRATION
+2A12 LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+2A13 LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+2A14 LINE INTEGRATION NOT INCLUDING THE POLE
+2A15 INTEGRAL AROUND A POINT OPERATOR
+2A16 QUATERNION INTEGRAL OPERATOR
+2A17 INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+2A18 INTEGRAL WITH TIMES SIGN
+2A19 INTEGRAL WITH INTERSECTION
+2A1A INTEGRAL WITH UNION
+2A1B INTEGRAL WITH OVERBAR
+2A1C INTEGRAL WITH UNDERBAR
+2A1D JOIN
+2A1E LARGE LEFT TRIANGLE OPERATOR
+2A1F Z NOTATION SCHEMA COMPOSITION
+2A20 Z NOTATION SCHEMA PIPING
+2A21 Z NOTATION SCHEMA PROJECTION
+2A22 PLUS SIGN WITH SMALL CIRCLE ABOVE
+2A23 PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+2A24 PLUS SIGN WITH TILDE ABOVE
+2A25 PLUS SIGN WITH DOT BELOW
+2A26 PLUS SIGN WITH TILDE BELOW
+2A27 PLUS SIGN WITH SUBSCRIPT TWO
+2A28 PLUS SIGN WITH BLACK TRIANGLE
+2A29 MINUS SIGN WITH COMMA ABOVE
+2A2A MINUS SIGN WITH DOT BELOW
+2A2B MINUS SIGN WITH FALLING DOTS
+2A2C MINUS SIGN WITH RISING DOTS
+2A2D PLUS SIGN IN LEFT HALF CIRCLE
+2A2E PLUS SIGN IN RIGHT HALF CIRCLE
+2A2F VECTOR OR CROSS PRODUCT
+2A30 MULTIPLICATION SIGN WITH DOT ABOVE
+2A31 MULTIPLICATION SIGN WITH UNDERBAR
+2A32 SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+2A33 SMASH PRODUCT
+2A34 MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35 MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A36 CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+2A37 MULTIPLICATION SIGN IN DOUBLE CIRCLE
+2A38 CIRCLED DIVISION SIGN
+2A39 PLUS SIGN IN TRIANGLE
+2A3A MINUS SIGN IN TRIANGLE
+2A3B MULTIPLICATION SIGN IN TRIANGLE
+2A3C INTERIOR PRODUCT
+2A3D RIGHTHAND INTERIOR PRODUCT
+2A3E Z NOTATION RELATIONAL COMPOSITION
+2A3F AMALGAMATION OR COPRODUCT
+2A40 INTERSECTION WITH DOT
+2A41 UNION WITH MINUS SIGN
+2A42 UNION WITH OVERBAR
+2A43 INTERSECTION WITH OVERBAR
+2A44 INTERSECTION WITH LOGICAL AND
+2A45 UNION WITH LOGICAL OR
+2A46 UNION ABOVE INTERSECTION
+2A47 INTERSECTION ABOVE UNION
+2A48 UNION ABOVE BAR ABOVE INTERSECTION
+2A49 INTERSECTION ABOVE BAR ABOVE UNION
+2A4A UNION BESIDE AND JOINED WITH UNION
+2A4B INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+2A4C CLOSED UNION WITH SERIFS
+2A4D CLOSED INTERSECTION WITH SERIFS
+2A4E DOUBLE SQUARE INTERSECTION
+2A4F DOUBLE SQUARE UNION
+2A50 CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+2A51 LOGICAL AND WITH DOT ABOVE
+2A52 LOGICAL OR WITH DOT ABOVE
+2A53 DOUBLE LOGICAL AND
+2A54 DOUBLE LOGICAL OR
+2A55 TWO INTERSECTING LOGICAL AND
+2A56 TWO INTERSECTING LOGICAL OR
+2A57 SLOPING LARGE OR
+2A58 SLOPING LARGE AND
+2A59 LOGICAL OR OVERLAPPING LOGICAL AND
+2A5A LOGICAL AND WITH MIDDLE STEM
+2A5B LOGICAL OR WITH MIDDLE STEM
+2A5C LOGICAL AND WITH HORIZONTAL DASH
+2A5D LOGICAL OR WITH HORIZONTAL DASH
+2A5E LOGICAL AND WITH DOUBLE OVERBAR
+2A5F LOGICAL AND WITH UNDERBAR
+2A60 LOGICAL AND WITH DOUBLE UNDERBAR
+2A61 SMALL VEE WITH UNDERBAR
+2A62 LOGICAL OR WITH DOUBLE OVERBAR
+2A63 LOGICAL OR WITH DOUBLE UNDERBAR
+2A64 Z NOTATION DOMAIN ANTIRESTRICTION
+2A65 Z NOTATION RANGE ANTIRESTRICTION
+2A66 EQUALS SIGN WITH DOT BELOW
+2A67 IDENTICAL WITH DOT ABOVE
+2A68 TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
+2A69 TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
+2A6A TILDE OPERATOR WITH DOT ABOVE
+2A6B TILDE OPERATOR WITH RISING DOTS
+2A6C SIMILAR MINUS SIMILAR
+2A6D CONGRUENT WITH DOT ABOVE
+2A6E EQUALS WITH ASTERISK
+2A6F ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+2A70 APPROXIMATELY EQUAL OR EQUAL TO
+2A71 EQUALS SIGN ABOVE PLUS SIGN
+2A72 PLUS SIGN ABOVE EQUALS SIGN
+2A73 EQUALS SIGN ABOVE TILDE OPERATOR
+2A74 DOUBLE COLON EQUAL
+2A75 TWO CONSECUTIVE EQUALS SIGNS
+2A76 THREE CONSECUTIVE EQUALS SIGNS
+2A77 EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+2A78 EQUIVALENT WITH FOUR DOTS ABOVE
+2A79 LESS-THAN WITH CIRCLE INSIDE
+2A7A GREATER-THAN WITH CIRCLE INSIDE
+2A7B LESS-THAN WITH QUESTION MARK ABOVE
+2A7C GREATER-THAN WITH QUESTION MARK ABOVE
+2A7D LESS-THAN OR SLANTED EQUAL TO
+2A7E GREATER-THAN OR SLANTED EQUAL TO
+2A7F LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80 GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81 LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82 GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83 LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84 GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A85 LESS-THAN OR APPROXIMATE
+2A86 GREATER-THAN OR APPROXIMATE
+2A87 LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+2A88 GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+2A89 LESS-THAN AND NOT APPROXIMATE
+2A8A GREATER-THAN AND NOT APPROXIMATE
+2A8B LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A8D LESS-THAN ABOVE SIMILAR OR EQUAL
+2A8E GREATER-THAN ABOVE SIMILAR OR EQUAL
+2A8F LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+2A90 GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+2A91 LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92 GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93 LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94 GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95 SLANTED EQUAL TO OR LESS-THAN
+2A96 SLANTED EQUAL TO OR GREATER-THAN
+2A97 SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98 SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99 DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2A9D SIMILAR OR LESS-THAN
+2A9E SIMILAR OR GREATER-THAN
+2A9F SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+2AA0 SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+2AA1 DOUBLE NESTED LESS-THAN
+2AA2 DOUBLE NESTED GREATER-THAN
+2AA3 DOUBLE NESTED LESS-THAN WITH UNDERBAR
+2AA4 GREATER-THAN OVERLAPPING LESS-THAN
+2AA5 GREATER-THAN BESIDE LESS-THAN
+2AA6 LESS-THAN CLOSED BY CURVE
+2AA7 GREATER-THAN CLOSED BY CURVE
+2AA8 LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9 GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA SMALLER THAN
+2AAB LARGER THAN
+2AAC SMALLER THAN OR EQUAL TO
+2AAD LARGER THAN OR EQUAL TO
+2AAE EQUALS SIGN WITH BUMPY ABOVE
+2AAF PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0 SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB1 PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+2AB2 SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+2AB3 PRECEDES ABOVE EQUALS SIGN
+2AB4 SUCCEEDS ABOVE EQUALS SIGN
+2AB5 PRECEDES ABOVE NOT EQUAL TO
+2AB6 SUCCEEDS ABOVE NOT EQUAL TO
+2AB7 PRECEDES ABOVE ALMOST EQUAL TO
+2AB8 SUCCEEDS ABOVE ALMOST EQUAL TO
+2AB9 PRECEDES ABOVE NOT ALMOST EQUAL TO
+2ABA SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+2ABB DOUBLE PRECEDES
+2ABC DOUBLE SUCCEEDS
+2ABD SUBSET WITH DOT
+2ABE SUPERSET WITH DOT
+2ABF SUBSET WITH PLUS SIGN BELOW
+2AC0 SUPERSET WITH PLUS SIGN BELOW
+2AC1 SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2 SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3 SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4 SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5 SUBSET OF ABOVE EQUALS SIGN
+2AC6 SUPERSET OF ABOVE EQUALS SIGN
+2AC7 SUBSET OF ABOVE TILDE OPERATOR
+2AC8 SUPERSET OF ABOVE TILDE OPERATOR
+2AC9 SUBSET OF ABOVE ALMOST EQUAL TO
+2ACA SUPERSET OF ABOVE ALMOST EQUAL TO
+2ACB SUBSET OF ABOVE NOT EQUAL TO
+2ACC SUPERSET OF ABOVE NOT EQUAL TO
+2ACD SQUARE LEFT OPEN BOX OPERATOR
+2ACE SQUARE RIGHT OPEN BOX OPERATOR
+2ACF CLOSED SUBSET
+2AD0 CLOSED SUPERSET
+2AD1 CLOSED SUBSET OR EQUAL TO
+2AD2 CLOSED SUPERSET OR EQUAL TO
+2AD3 SUBSET ABOVE SUPERSET
+2AD4 SUPERSET ABOVE SUBSET
+2AD5 SUBSET ABOVE SUBSET
+2AD6 SUPERSET ABOVE SUPERSET
+2AD7 SUPERSET BESIDE SUBSET
+2AD8 SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+2AD9 ELEMENT OF OPENING DOWNWARDS
+2ADA PITCHFORK WITH TEE TOP
+2ADB TRANSVERSAL INTERSECTION
+2ADC FORKING
+2ADD NONFORKING
+2ADE SHORT LEFT TACK
+2ADF SHORT DOWN TACK
+2AE0 SHORT UP TACK
+2AE1 PERPENDICULAR WITH S
+2AE2 VERTICAL BAR TRIPLE RIGHT TURNSTILE
+2AE3 DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4 VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5 DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE6 LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+2AE7 SHORT DOWN TACK WITH OVERBAR
+2AE8 SHORT UP TACK WITH UNDERBAR
+2AE9 SHORT UP TACK ABOVE SHORT DOWN TACK
+2AEA DOUBLE DOWN TACK
+2AEB DOUBLE UP TACK
+2AEC DOUBLE STROKE NOT SIGN
+2AED REVERSED DOUBLE STROKE NOT SIGN
+2AEE DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+2AEF VERTICAL LINE WITH CIRCLE ABOVE
+2AF0 VERTICAL LINE WITH CIRCLE BELOW
+2AF1 DOWN TACK WITH CIRCLE BELOW
+2AF2 PARALLEL WITH HORIZONTAL STROKE
+2AF3 PARALLEL WITH TILDE OPERATOR
+2AF4 TRIPLE VERTICAL BAR BINARY RELATION
+2AF5 TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
+2AF6 TRIPLE COLON OPERATOR
+2AF7 TRIPLE NESTED LESS-THAN
+2AF8 TRIPLE NESTED GREATER-THAN
+2AF9 DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+2AFB TRIPLE SOLIDUS BINARY RELATION
+2AFC LARGE TRIPLE VERTICAL BAR OPERATOR
+2AFD DOUBLE SOLIDUS OPERATOR
+2AFE WHITE VERTICAL BAR
+2AFF N-ARY WHITE VERTICAL BAR
+2B00 NORTH EAST WHITE ARROW
+2B01 NORTH WEST WHITE ARROW
+2B02 SOUTH EAST WHITE ARROW
+2B03 SOUTH WEST WHITE ARROW
+2B04 LEFT RIGHT WHITE ARROW
+2B05 LEFTWARDS BLACK ARROW
+2B06 UPWARDS BLACK ARROW
+2B07 DOWNWARDS BLACK ARROW
+2B08 NORTH EAST BLACK ARROW
+2B09 NORTH WEST BLACK ARROW
+2B0A SOUTH EAST BLACK ARROW
+2B0B SOUTH WEST BLACK ARROW
+2B0C LEFT RIGHT BLACK ARROW
+2B0D UP DOWN BLACK ARROW
+2B0E RIGHTWARDS ARROW WITH TIP DOWNWARDS
+2B0F RIGHTWARDS ARROW WITH TIP UPWARDS
+2B10 LEFTWARDS ARROW WITH TIP DOWNWARDS
+2B11 LEFTWARDS ARROW WITH TIP UPWARDS
+2B12 SQUARE WITH TOP HALF BLACK
+2B13 SQUARE WITH BOTTOM HALF BLACK
+2B14 SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK
+2B15 SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK
+2B16 DIAMOND WITH LEFT HALF BLACK
+2B17 DIAMOND WITH RIGHT HALF BLACK
+2B18 DIAMOND WITH TOP HALF BLACK
+2B19 DIAMOND WITH BOTTOM HALF BLACK
+2B1A DOTTED SQUARE
+2B1B BLACK LARGE SQUARE
+2B1C WHITE LARGE SQUARE
+2B1D BLACK VERY SMALL SQUARE
+2B1E WHITE VERY SMALL SQUARE
+2B1F BLACK PENTAGON
+2B20 WHITE PENTAGON
+2B21 WHITE HEXAGON
+2B22 BLACK HEXAGON
+2B23 HORIZONTAL BLACK HEXAGON
+2B24 BLACK LARGE CIRCLE
+2B25 BLACK MEDIUM DIAMOND
+2B26 WHITE MEDIUM DIAMOND
+2B27 BLACK MEDIUM LOZENGE
+2B28 WHITE MEDIUM LOZENGE
+2B29 BLACK SMALL DIAMOND
+2B2A BLACK SMALL LOZENGE
+2B2B WHITE SMALL LOZENGE
+2B2C BLACK HORIZONTAL ELLIPSE
+2B2D WHITE HORIZONTAL ELLIPSE
+2B2E BLACK VERTICAL ELLIPSE
+2B2F WHITE VERTICAL ELLIPSE
+2B30 LEFT ARROW WITH SMALL CIRCLE
+2B31 THREE LEFTWARDS ARROWS
+2B32 LEFT ARROW WITH CIRCLED PLUS
+2B33 LONG LEFTWARDS SQUIGGLE ARROW
+2B34 LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2B35 LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2B36 LEFTWARDS TWO-HEADED ARROW FROM BAR
+2B37 LEFTWARDS TWO-HEADED TRIPLE DASH ARROW
+2B38 LEFTWARDS ARROW WITH DOTTED STEM
+2B39 LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2B3A LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2B3B LEFTWARDS TWO-HEADED ARROW WITH TAIL
+2B3C LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2B3D LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2B3E LEFTWARDS ARROW THROUGH X
+2B3F WAVE ARROW POINTING DIRECTLY LEFT
+2B40 EQUALS SIGN ABOVE LEFTWARDS ARROW
+2B41 REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW
+2B42 LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
+2B43 RIGHTWARDS ARROW THROUGH GREATER-THAN
+2B44 RIGHTWARDS ARROW THROUGH SUPERSET
+2B45 LEFTWARDS QUADRUPLE ARROW
+2B46 RIGHTWARDS QUADRUPLE ARROW
+2B47 REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2B48 RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
+2B49 TILDE OPERATOR ABOVE LEFTWARDS ARROW
+2B4A LEFTWARDS ARROW ABOVE ALMOST EQUAL TO
+2B4B LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B4C RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B50 WHITE MEDIUM STAR
+2B51 BLACK SMALL STAR
+2B52 WHITE SMALL STAR
+2B53 BLACK RIGHT-POINTING PENTAGON
+2B54 WHITE RIGHT-POINTING PENTAGON
+2C00 GLAGOLITIC CAPITAL LETTER AZU
+2C01 GLAGOLITIC CAPITAL LETTER BUKY
+2C02 GLAGOLITIC CAPITAL LETTER VEDE
+2C03 GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C04 GLAGOLITIC CAPITAL LETTER DOBRO
+2C05 GLAGOLITIC CAPITAL LETTER YESTU
+2C06 GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C07 GLAGOLITIC CAPITAL LETTER DZELO
+2C08 GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C09 GLAGOLITIC CAPITAL LETTER IZHE
+2C0A GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C0B GLAGOLITIC CAPITAL LETTER I
+2C0C GLAGOLITIC CAPITAL LETTER DJERVI
+2C0D GLAGOLITIC CAPITAL LETTER KAKO
+2C0E GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C0F GLAGOLITIC CAPITAL LETTER MYSLITE
+2C10 GLAGOLITIC CAPITAL LETTER NASHI
+2C11 GLAGOLITIC CAPITAL LETTER ONU
+2C12 GLAGOLITIC CAPITAL LETTER POKOJI
+2C13 GLAGOLITIC CAPITAL LETTER RITSI
+2C14 GLAGOLITIC CAPITAL LETTER SLOVO
+2C15 GLAGOLITIC CAPITAL LETTER TVRIDO
+2C16 GLAGOLITIC CAPITAL LETTER UKU
+2C17 GLAGOLITIC CAPITAL LETTER FRITU
+2C18 GLAGOLITIC CAPITAL LETTER HERU
+2C19 GLAGOLITIC CAPITAL LETTER OTU
+2C1A GLAGOLITIC CAPITAL LETTER PE
+2C1B GLAGOLITIC CAPITAL LETTER SHTA
+2C1C GLAGOLITIC CAPITAL LETTER TSI
+2C1D GLAGOLITIC CAPITAL LETTER CHRIVI
+2C1E GLAGOLITIC CAPITAL LETTER SHA
+2C1F GLAGOLITIC CAPITAL LETTER YERU
+2C20 GLAGOLITIC CAPITAL LETTER YERI
+2C21 GLAGOLITIC CAPITAL LETTER YATI
+2C22 GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C23 GLAGOLITIC CAPITAL LETTER YU
+2C24 GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C25 GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C26 GLAGOLITIC CAPITAL LETTER YO
+2C27 GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C28 GLAGOLITIC CAPITAL LETTER BIG YUS
+2C29 GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C2A GLAGOLITIC CAPITAL LETTER FITA
+2C2B GLAGOLITIC CAPITAL LETTER IZHITSA
+2C2C GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C2D GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C2E GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30 GLAGOLITIC SMALL LETTER AZU
+2C31 GLAGOLITIC SMALL LETTER BUKY
+2C32 GLAGOLITIC SMALL LETTER VEDE
+2C33 GLAGOLITIC SMALL LETTER GLAGOLI
+2C34 GLAGOLITIC SMALL LETTER DOBRO
+2C35 GLAGOLITIC SMALL LETTER YESTU
+2C36 GLAGOLITIC SMALL LETTER ZHIVETE
+2C37 GLAGOLITIC SMALL LETTER DZELO
+2C38 GLAGOLITIC SMALL LETTER ZEMLJA
+2C39 GLAGOLITIC SMALL LETTER IZHE
+2C3A GLAGOLITIC SMALL LETTER INITIAL IZHE
+2C3B GLAGOLITIC SMALL LETTER I
+2C3C GLAGOLITIC SMALL LETTER DJERVI
+2C3D GLAGOLITIC SMALL LETTER KAKO
+2C3E GLAGOLITIC SMALL LETTER LJUDIJE
+2C3F GLAGOLITIC SMALL LETTER MYSLITE
+2C40 GLAGOLITIC SMALL LETTER NASHI
+2C41 GLAGOLITIC SMALL LETTER ONU
+2C42 GLAGOLITIC SMALL LETTER POKOJI
+2C43 GLAGOLITIC SMALL LETTER RITSI
+2C44 GLAGOLITIC SMALL LETTER SLOVO
+2C45 GLAGOLITIC SMALL LETTER TVRIDO
+2C46 GLAGOLITIC SMALL LETTER UKU
+2C47 GLAGOLITIC SMALL LETTER FRITU
+2C48 GLAGOLITIC SMALL LETTER HERU
+2C49 GLAGOLITIC SMALL LETTER OTU
+2C4A GLAGOLITIC SMALL LETTER PE
+2C4B GLAGOLITIC SMALL LETTER SHTA
+2C4C GLAGOLITIC SMALL LETTER TSI
+2C4D GLAGOLITIC SMALL LETTER CHRIVI
+2C4E GLAGOLITIC SMALL LETTER SHA
+2C4F GLAGOLITIC SMALL LETTER YERU
+2C50 GLAGOLITIC SMALL LETTER YERI
+2C51 GLAGOLITIC SMALL LETTER YATI
+2C52 GLAGOLITIC SMALL LETTER SPIDERY HA
+2C53 GLAGOLITIC SMALL LETTER YU
+2C54 GLAGOLITIC SMALL LETTER SMALL YUS
+2C55 GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+2C56 GLAGOLITIC SMALL LETTER YO
+2C57 GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+2C58 GLAGOLITIC SMALL LETTER BIG YUS
+2C59 GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+2C5A GLAGOLITIC SMALL LETTER FITA
+2C5B GLAGOLITIC SMALL LETTER IZHITSA
+2C5C GLAGOLITIC SMALL LETTER SHTAPIC
+2C5D GLAGOLITIC SMALL LETTER TROKUTASTI A
+2C5E GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C60 LATIN CAPITAL LETTER L WITH DOUBLE BAR
+2C61 LATIN SMALL LETTER L WITH DOUBLE BAR
+2C62 LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+2C63 LATIN CAPITAL LETTER P WITH STROKE
+2C64 LATIN CAPITAL LETTER R WITH TAIL
+2C65 LATIN SMALL LETTER A WITH STROKE
+2C66 LATIN SMALL LETTER T WITH DIAGONAL STROKE
+2C67 LATIN CAPITAL LETTER H WITH DESCENDER
+2C68 LATIN SMALL LETTER H WITH DESCENDER
+2C69 LATIN CAPITAL LETTER K WITH DESCENDER
+2C6A LATIN SMALL LETTER K WITH DESCENDER
+2C6B LATIN CAPITAL LETTER Z WITH DESCENDER
+2C6C LATIN SMALL LETTER Z WITH DESCENDER
+2C6D LATIN CAPITAL LETTER ALPHA
+2C6E LATIN CAPITAL LETTER M WITH HOOK
+2C6F LATIN CAPITAL LETTER TURNED A
+2C71 LATIN SMALL LETTER V WITH RIGHT HOOK
+2C72 LATIN CAPITAL LETTER W WITH HOOK
+2C73 LATIN SMALL LETTER W WITH HOOK
+2C74 LATIN SMALL LETTER V WITH CURL
+2C75 LATIN CAPITAL LETTER HALF H
+2C76 LATIN SMALL LETTER HALF H
+2C77 LATIN SMALL LETTER TAILLESS PHI
+2C78 LATIN SMALL LETTER E WITH NOTCH
+2C79 LATIN SMALL LETTER TURNED R WITH TAIL
+2C7A LATIN SMALL LETTER O WITH LOW RING INSIDE
+2C7B LATIN LETTER SMALL CAPITAL TURNED E
+2C7C LATIN SUBSCRIPT SMALL LETTER J
+2C7D MODIFIER LETTER CAPITAL V
+2C80 COPTIC CAPITAL LETTER ALFA
+2C81 COPTIC SMALL LETTER ALFA
+2C82 COPTIC CAPITAL LETTER VIDA
+2C83 COPTIC SMALL LETTER VIDA
+2C84 COPTIC CAPITAL LETTER GAMMA
+2C85 COPTIC SMALL LETTER GAMMA
+2C86 COPTIC CAPITAL LETTER DALDA
+2C87 COPTIC SMALL LETTER DALDA
+2C88 COPTIC CAPITAL LETTER EIE
+2C89 COPTIC SMALL LETTER EIE
+2C8A COPTIC CAPITAL LETTER SOU
+2C8B COPTIC SMALL LETTER SOU
+2C8C COPTIC CAPITAL LETTER ZATA
+2C8D COPTIC SMALL LETTER ZATA
+2C8E COPTIC CAPITAL LETTER HATE
+2C8F COPTIC SMALL LETTER HATE
+2C90 COPTIC CAPITAL LETTER THETHE
+2C91 COPTIC SMALL LETTER THETHE
+2C92 COPTIC CAPITAL LETTER IAUDA
+2C93 COPTIC SMALL LETTER IAUDA
+2C94 COPTIC CAPITAL LETTER KAPA
+2C95 COPTIC SMALL LETTER KAPA
+2C96 COPTIC CAPITAL LETTER LAULA
+2C97 COPTIC SMALL LETTER LAULA
+2C98 COPTIC CAPITAL LETTER MI
+2C99 COPTIC SMALL LETTER MI
+2C9A COPTIC CAPITAL LETTER NI
+2C9B COPTIC SMALL LETTER NI
+2C9C COPTIC CAPITAL LETTER KSI
+2C9D COPTIC SMALL LETTER KSI
+2C9E COPTIC CAPITAL LETTER O
+2C9F COPTIC SMALL LETTER O
+2CA0 COPTIC CAPITAL LETTER PI
+2CA1 COPTIC SMALL LETTER PI
+2CA2 COPTIC CAPITAL LETTER RO
+2CA3 COPTIC SMALL LETTER RO
+2CA4 COPTIC CAPITAL LETTER SIMA
+2CA5 COPTIC SMALL LETTER SIMA
+2CA6 COPTIC CAPITAL LETTER TAU
+2CA7 COPTIC SMALL LETTER TAU
+2CA8 COPTIC CAPITAL LETTER UA
+2CA9 COPTIC SMALL LETTER UA
+2CAA COPTIC CAPITAL LETTER FI
+2CAB COPTIC SMALL LETTER FI
+2CAC COPTIC CAPITAL LETTER KHI
+2CAD COPTIC SMALL LETTER KHI
+2CAE COPTIC CAPITAL LETTER PSI
+2CAF COPTIC SMALL LETTER PSI
+2CB0 COPTIC CAPITAL LETTER OOU
+2CB1 COPTIC SMALL LETTER OOU
+2CB2 COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB3 COPTIC SMALL LETTER DIALECT-P ALEF
+2CB4 COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB5 COPTIC SMALL LETTER OLD COPTIC AIN
+2CB6 COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB7 COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB8 COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CB9 COPTIC SMALL LETTER DIALECT-P KAPA
+2CBA COPTIC CAPITAL LETTER DIALECT-P NI
+2CBB COPTIC SMALL LETTER DIALECT-P NI
+2CBC COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBD COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBE COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CBF COPTIC SMALL LETTER OLD COPTIC OOU
+2CC0 COPTIC CAPITAL LETTER SAMPI
+2CC1 COPTIC SMALL LETTER SAMPI
+2CC2 COPTIC CAPITAL LETTER CROSSED SHEI
+2CC3 COPTIC SMALL LETTER CROSSED SHEI
+2CC4 COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC5 COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC6 COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC7 COPTIC SMALL LETTER OLD COPTIC ESH
+2CC8 COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CC9 COPTIC SMALL LETTER AKHMIMIC KHEI
+2CCA COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCB COPTIC SMALL LETTER DIALECT-P HORI
+2CCC COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCD COPTIC SMALL LETTER OLD COPTIC HORI
+2CCE COPTIC CAPITAL LETTER OLD COPTIC HA
+2CCF COPTIC SMALL LETTER OLD COPTIC HA
+2CD0 COPTIC CAPITAL LETTER L-SHAPED HA
+2CD1 COPTIC SMALL LETTER L-SHAPED HA
+2CD2 COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD3 COPTIC SMALL LETTER OLD COPTIC HEI
+2CD4 COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD5 COPTIC SMALL LETTER OLD COPTIC HAT
+2CD6 COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD7 COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD8 COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CD9 COPTIC SMALL LETTER OLD COPTIC DJA
+2CDA COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDB COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDC COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDD COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDE COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CDF COPTIC SMALL LETTER OLD NUBIAN NGI
+2CE0 COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE1 COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE2 COPTIC CAPITAL LETTER OLD NUBIAN WAU
+2CE3 COPTIC SMALL LETTER OLD NUBIAN WAU
+2CE4 COPTIC SYMBOL KAI
+2CE5 COPTIC SYMBOL MI RO
+2CE6 COPTIC SYMBOL PI RO
+2CE7 COPTIC SYMBOL STAUROS
+2CE8 COPTIC SYMBOL TAU RO
+2CE9 COPTIC SYMBOL KHI RO
+2CEA COPTIC SYMBOL SHIMA SIMA
+2CF9 COPTIC OLD NUBIAN FULL STOP
+2CFA COPTIC OLD NUBIAN DIRECT QUESTION MARK
+2CFB COPTIC OLD NUBIAN INDIRECT QUESTION MARK
+2CFC COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD COPTIC FRACTION ONE HALF
+2CFE COPTIC FULL STOP
+2CFF COPTIC MORPHOLOGICAL DIVIDER
+2D00 GEORGIAN SMALL LETTER AN
+2D01 GEORGIAN SMALL LETTER BAN
+2D02 GEORGIAN SMALL LETTER GAN
+2D03 GEORGIAN SMALL LETTER DON
+2D04 GEORGIAN SMALL LETTER EN
+2D05 GEORGIAN SMALL LETTER VIN
+2D06 GEORGIAN SMALL LETTER ZEN
+2D07 GEORGIAN SMALL LETTER TAN
+2D08 GEORGIAN SMALL LETTER IN
+2D09 GEORGIAN SMALL LETTER KAN
+2D0A GEORGIAN SMALL LETTER LAS
+2D0B GEORGIAN SMALL LETTER MAN
+2D0C GEORGIAN SMALL LETTER NAR
+2D0D GEORGIAN SMALL LETTER ON
+2D0E GEORGIAN SMALL LETTER PAR
+2D0F GEORGIAN SMALL LETTER ZHAR
+2D10 GEORGIAN SMALL LETTER RAE
+2D11 GEORGIAN SMALL LETTER SAN
+2D12 GEORGIAN SMALL LETTER TAR
+2D13 GEORGIAN SMALL LETTER UN
+2D14 GEORGIAN SMALL LETTER PHAR
+2D15 GEORGIAN SMALL LETTER KHAR
+2D16 GEORGIAN SMALL LETTER GHAN
+2D17 GEORGIAN SMALL LETTER QAR
+2D18 GEORGIAN SMALL LETTER SHIN
+2D19 GEORGIAN SMALL LETTER CHIN
+2D1A GEORGIAN SMALL LETTER CAN
+2D1B GEORGIAN SMALL LETTER JIL
+2D1C GEORGIAN SMALL LETTER CIL
+2D1D GEORGIAN SMALL LETTER CHAR
+2D1E GEORGIAN SMALL LETTER XAN
+2D1F GEORGIAN SMALL LETTER JHAN
+2D20 GEORGIAN SMALL LETTER HAE
+2D21 GEORGIAN SMALL LETTER HE
+2D22 GEORGIAN SMALL LETTER HIE
+2D23 GEORGIAN SMALL LETTER WE
+2D24 GEORGIAN SMALL LETTER HAR
+2D25 GEORGIAN SMALL LETTER HOE
+2D30 TIFINAGH LETTER YA
+2D31 TIFINAGH LETTER YAB
+2D32 TIFINAGH LETTER YABH
+2D33 TIFINAGH LETTER YAG
+2D34 TIFINAGH LETTER YAGHH
+2D35 TIFINAGH LETTER BERBER ACADEMY YAJ
+2D36 TIFINAGH LETTER YAJ
+2D37 TIFINAGH LETTER YAD
+2D38 TIFINAGH LETTER YADH
+2D39 TIFINAGH LETTER YADD
+2D3A TIFINAGH LETTER YADDH
+2D3B TIFINAGH LETTER YEY
+2D3C TIFINAGH LETTER YAF
+2D3D TIFINAGH LETTER YAK
+2D3E TIFINAGH LETTER TUAREG YAK
+2D3F TIFINAGH LETTER YAKHH
+2D40 TIFINAGH LETTER YAH
+2D41 TIFINAGH LETTER BERBER ACADEMY YAH
+2D42 TIFINAGH LETTER TUAREG YAH
+2D43 TIFINAGH LETTER YAHH
+2D44 TIFINAGH LETTER YAA
+2D45 TIFINAGH LETTER YAKH
+2D46 TIFINAGH LETTER TUAREG YAKH
+2D47 TIFINAGH LETTER YAQ
+2D48 TIFINAGH LETTER TUAREG YAQ
+2D49 TIFINAGH LETTER YI
+2D4A TIFINAGH LETTER YAZH
+2D4B TIFINAGH LETTER AHAGGAR YAZH
+2D4C TIFINAGH LETTER TUAREG YAZH
+2D4D TIFINAGH LETTER YAL
+2D4E TIFINAGH LETTER YAM
+2D4F TIFINAGH LETTER YAN
+2D50 TIFINAGH LETTER TUAREG YAGN
+2D51 TIFINAGH LETTER TUAREG YANG
+2D52 TIFINAGH LETTER YAP
+2D53 TIFINAGH LETTER YU
+2D54 TIFINAGH LETTER YAR
+2D55 TIFINAGH LETTER YARR
+2D56 TIFINAGH LETTER YAGH
+2D57 TIFINAGH LETTER TUAREG YAGH
+2D58 TIFINAGH LETTER AYER YAGH
+2D59 TIFINAGH LETTER YAS
+2D5A TIFINAGH LETTER YASS
+2D5B TIFINAGH LETTER YASH
+2D5C TIFINAGH LETTER YAT
+2D5D TIFINAGH LETTER YATH
+2D5E TIFINAGH LETTER YACH
+2D5F TIFINAGH LETTER YATT
+2D60 TIFINAGH LETTER YAV
+2D61 TIFINAGH LETTER YAW
+2D62 TIFINAGH LETTER YAY
+2D63 TIFINAGH LETTER YAZ
+2D64 TIFINAGH LETTER TAWELLEMET YAZ
+2D65 TIFINAGH LETTER YAZZ
+2D6F TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D80 ETHIOPIC SYLLABLE LOA
+2D81 ETHIOPIC SYLLABLE MOA
+2D82 ETHIOPIC SYLLABLE ROA
+2D83 ETHIOPIC SYLLABLE SOA
+2D84 ETHIOPIC SYLLABLE SHOA
+2D85 ETHIOPIC SYLLABLE BOA
+2D86 ETHIOPIC SYLLABLE TOA
+2D87 ETHIOPIC SYLLABLE COA
+2D88 ETHIOPIC SYLLABLE NOA
+2D89 ETHIOPIC SYLLABLE NYOA
+2D8A ETHIOPIC SYLLABLE GLOTTAL OA
+2D8B ETHIOPIC SYLLABLE ZOA
+2D8C ETHIOPIC SYLLABLE DOA
+2D8D ETHIOPIC SYLLABLE DDOA
+2D8E ETHIOPIC SYLLABLE JOA
+2D8F ETHIOPIC SYLLABLE THOA
+2D90 ETHIOPIC SYLLABLE CHOA
+2D91 ETHIOPIC SYLLABLE PHOA
+2D92 ETHIOPIC SYLLABLE POA
+2D93 ETHIOPIC SYLLABLE GGWA
+2D94 ETHIOPIC SYLLABLE GGWI
+2D95 ETHIOPIC SYLLABLE GGWEE
+2D96 ETHIOPIC SYLLABLE GGWE
+2DA0 ETHIOPIC SYLLABLE SSA
+2DA1 ETHIOPIC SYLLABLE SSU
+2DA2 ETHIOPIC SYLLABLE SSI
+2DA3 ETHIOPIC SYLLABLE SSAA
+2DA4 ETHIOPIC SYLLABLE SSEE
+2DA5 ETHIOPIC SYLLABLE SSE
+2DA6 ETHIOPIC SYLLABLE SSO
+2DA8 ETHIOPIC SYLLABLE CCA
+2DA9 ETHIOPIC SYLLABLE CCU
+2DAA ETHIOPIC SYLLABLE CCI
+2DAB ETHIOPIC SYLLABLE CCAA
+2DAC ETHIOPIC SYLLABLE CCEE
+2DAD ETHIOPIC SYLLABLE CCE
+2DAE ETHIOPIC SYLLABLE CCO
+2DB0 ETHIOPIC SYLLABLE ZZA
+2DB1 ETHIOPIC SYLLABLE ZZU
+2DB2 ETHIOPIC SYLLABLE ZZI
+2DB3 ETHIOPIC SYLLABLE ZZAA
+2DB4 ETHIOPIC SYLLABLE ZZEE
+2DB5 ETHIOPIC SYLLABLE ZZE
+2DB6 ETHIOPIC SYLLABLE ZZO
+2DB8 ETHIOPIC SYLLABLE CCHA
+2DB9 ETHIOPIC SYLLABLE CCHU
+2DBA ETHIOPIC SYLLABLE CCHI
+2DBB ETHIOPIC SYLLABLE CCHAA
+2DBC ETHIOPIC SYLLABLE CCHEE
+2DBD ETHIOPIC SYLLABLE CCHE
+2DBE ETHIOPIC SYLLABLE CCHO
+2DC0 ETHIOPIC SYLLABLE QYA
+2DC1 ETHIOPIC SYLLABLE QYU
+2DC2 ETHIOPIC SYLLABLE QYI
+2DC3 ETHIOPIC SYLLABLE QYAA
+2DC4 ETHIOPIC SYLLABLE QYEE
+2DC5 ETHIOPIC SYLLABLE QYE
+2DC6 ETHIOPIC SYLLABLE QYO
+2DC8 ETHIOPIC SYLLABLE KYA
+2DC9 ETHIOPIC SYLLABLE KYU
+2DCA ETHIOPIC SYLLABLE KYI
+2DCB ETHIOPIC SYLLABLE KYAA
+2DCC ETHIOPIC SYLLABLE KYEE
+2DCD ETHIOPIC SYLLABLE KYE
+2DCE ETHIOPIC SYLLABLE KYO
+2DD0 ETHIOPIC SYLLABLE XYA
+2DD1 ETHIOPIC SYLLABLE XYU
+2DD2 ETHIOPIC SYLLABLE XYI
+2DD3 ETHIOPIC SYLLABLE XYAA
+2DD4 ETHIOPIC SYLLABLE XYEE
+2DD5 ETHIOPIC SYLLABLE XYE
+2DD6 ETHIOPIC SYLLABLE XYO
+2DD8 ETHIOPIC SYLLABLE GYA
+2DD9 ETHIOPIC SYLLABLE GYU
+2DDA ETHIOPIC SYLLABLE GYI
+2DDB ETHIOPIC SYLLABLE GYAA
+2DDC ETHIOPIC SYLLABLE GYEE
+2DDD ETHIOPIC SYLLABLE GYE
+2DDE ETHIOPIC SYLLABLE GYO
+2DE0 COMBINING CYRILLIC LETTER BE
+2DE1 COMBINING CYRILLIC LETTER VE
+2DE2 COMBINING CYRILLIC LETTER GHE
+2DE3 COMBINING CYRILLIC LETTER DE
+2DE4 COMBINING CYRILLIC LETTER ZHE
+2DE5 COMBINING CYRILLIC LETTER ZE
+2DE6 COMBINING CYRILLIC LETTER KA
+2DE7 COMBINING CYRILLIC LETTER EL
+2DE8 COMBINING CYRILLIC LETTER EM
+2DE9 COMBINING CYRILLIC LETTER EN
+2DEA COMBINING CYRILLIC LETTER O
+2DEB COMBINING CYRILLIC LETTER PE
+2DEC COMBINING CYRILLIC LETTER ER
+2DED COMBINING CYRILLIC LETTER ES
+2DEE COMBINING CYRILLIC LETTER TE
+2DEF COMBINING CYRILLIC LETTER HA
+2DF0 COMBINING CYRILLIC LETTER TSE
+2DF1 COMBINING CYRILLIC LETTER CHE
+2DF2 COMBINING CYRILLIC LETTER SHA
+2DF3 COMBINING CYRILLIC LETTER SHCHA
+2DF4 COMBINING CYRILLIC LETTER FITA
+2DF5 COMBINING CYRILLIC LETTER ES-TE
+2DF6 COMBINING CYRILLIC LETTER A
+2DF7 COMBINING CYRILLIC LETTER IE
+2DF8 COMBINING CYRILLIC LETTER DJERV
+2DF9 COMBINING CYRILLIC LETTER MONOGRAPH UK
+2DFA COMBINING CYRILLIC LETTER YAT
+2DFB COMBINING CYRILLIC LETTER YU
+2DFC COMBINING CYRILLIC LETTER IOTIFIED A
+2DFD COMBINING CYRILLIC LETTER LITTLE YUS
+2DFE COMBINING CYRILLIC LETTER BIG YUS
+2DFF COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+2E00 RIGHT ANGLE SUBSTITUTION MARKER
+2E01 RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02 LEFT SUBSTITUTION BRACKET
+2E03 RIGHT SUBSTITUTION BRACKET
+2E04 LEFT DOTTED SUBSTITUTION BRACKET
+2E05 RIGHT DOTTED SUBSTITUTION BRACKET
+2E06 RAISED INTERPOLATION MARKER
+2E07 RAISED DOTTED INTERPOLATION MARKER
+2E08 DOTTED TRANSPOSITION MARKER
+2E09 LEFT TRANSPOSITION BRACKET
+2E0A RIGHT TRANSPOSITION BRACKET
+2E0B RAISED SQUARE
+2E0C LEFT RAISED OMISSION BRACKET
+2E0D RIGHT RAISED OMISSION BRACKET
+2E0E EDITORIAL CORONIS
+2E0F PARAGRAPHOS
+2E10 FORKED PARAGRAPHOS
+2E11 REVERSED FORKED PARAGRAPHOS
+2E12 HYPODIASTOLE
+2E13 DOTTED OBELOS
+2E14 DOWNWARDS ANCORA
+2E15 UPWARDS ANCORA
+2E16 DOTTED RIGHT-POINTING ANGLE
+2E17 DOUBLE OBLIQUE HYPHEN
+2E18 INVERTED INTERROBANG
+2E19 PALM BRANCH
+2E1A HYPHEN WITH DIAERESIS
+2E1B TILDE WITH RING ABOVE
+2E1C LEFT LOW PARAPHRASE BRACKET
+2E1D RIGHT LOW PARAPHRASE BRACKET
+2E1E TILDE WITH DOT ABOVE
+2E1F TILDE WITH DOT BELOW
+2E20 LEFT VERTICAL BAR WITH QUILL
+2E21 RIGHT VERTICAL BAR WITH QUILL
+2E22 TOP LEFT HALF BRACKET
+2E23 TOP RIGHT HALF BRACKET
+2E24 BOTTOM LEFT HALF BRACKET
+2E25 BOTTOM RIGHT HALF BRACKET
+2E26 LEFT SIDEWAYS U BRACKET
+2E27 RIGHT SIDEWAYS U BRACKET
+2E28 LEFT DOUBLE PARENTHESIS
+2E29 RIGHT DOUBLE PARENTHESIS
+2E2A TWO DOTS OVER ONE DOT PUNCTUATION
+2E2B ONE DOT OVER TWO DOTS PUNCTUATION
+2E2C SQUARED FOUR DOT PUNCTUATION
+2E2D FIVE DOT MARK
+2E2E REVERSED QUESTION MARK
+2E2F VERTICAL TILDE
+2E30 RING POINT
+2E80 CJK RADICAL REPEAT
+2E81 CJK RADICAL CLIFF
+2E82 CJK RADICAL SECOND ONE
+2E83 CJK RADICAL SECOND TWO
+2E84 CJK RADICAL SECOND THREE
+2E85 CJK RADICAL PERSON
+2E86 CJK RADICAL BOX
+2E87 CJK RADICAL TABLE
+2E88 CJK RADICAL KNIFE ONE
+2E89 CJK RADICAL KNIFE TWO
+2E8A CJK RADICAL DIVINATION
+2E8B CJK RADICAL SEAL
+2E8C CJK RADICAL SMALL ONE
+2E8D CJK RADICAL SMALL TWO
+2E8E CJK RADICAL LAME ONE
+2E8F CJK RADICAL LAME TWO
+2E90 CJK RADICAL LAME THREE
+2E91 CJK RADICAL LAME FOUR
+2E92 CJK RADICAL SNAKE
+2E93 CJK RADICAL THREAD
+2E94 CJK RADICAL SNOUT ONE
+2E95 CJK RADICAL SNOUT TWO
+2E96 CJK RADICAL HEART ONE
+2E97 CJK RADICAL HEART TWO
+2E98 CJK RADICAL HAND
+2E99 CJK RADICAL RAP
+2E9B CJK RADICAL CHOKE
+2E9C CJK RADICAL SUN
+2E9D CJK RADICAL MOON
+2E9E CJK RADICAL DEATH
+2E9F CJK RADICAL MOTHER
+2EA0 CJK RADICAL CIVILIAN
+2EA1 CJK RADICAL WATER ONE
+2EA2 CJK RADICAL WATER TWO
+2EA3 CJK RADICAL FIRE
+2EA4 CJK RADICAL PAW ONE
+2EA5 CJK RADICAL PAW TWO
+2EA6 CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+2EA7 CJK RADICAL COW
+2EA8 CJK RADICAL DOG
+2EA9 CJK RADICAL JADE
+2EAA CJK RADICAL BOLT OF CLOTH
+2EAB CJK RADICAL EYE
+2EAC CJK RADICAL SPIRIT ONE
+2EAD CJK RADICAL SPIRIT TWO
+2EAE CJK RADICAL BAMBOO
+2EAF CJK RADICAL SILK
+2EB0 CJK RADICAL C-SIMPLIFIED SILK
+2EB1 CJK RADICAL NET ONE
+2EB2 CJK RADICAL NET TWO
+2EB3 CJK RADICAL NET THREE
+2EB4 CJK RADICAL NET FOUR
+2EB5 CJK RADICAL MESH
+2EB6 CJK RADICAL SHEEP
+2EB7 CJK RADICAL RAM
+2EB8 CJK RADICAL EWE
+2EB9 CJK RADICAL OLD
+2EBA CJK RADICAL BRUSH ONE
+2EBB CJK RADICAL BRUSH TWO
+2EBC CJK RADICAL MEAT
+2EBD CJK RADICAL MORTAR
+2EBE CJK RADICAL GRASS ONE
+2EBF CJK RADICAL GRASS TWO
+2EC0 CJK RADICAL GRASS THREE
+2EC1 CJK RADICAL TIGER
+2EC2 CJK RADICAL CLOTHES
+2EC3 CJK RADICAL WEST ONE
+2EC4 CJK RADICAL WEST TWO
+2EC5 CJK RADICAL C-SIMPLIFIED SEE
+2EC6 CJK RADICAL SIMPLIFIED HORN
+2EC7 CJK RADICAL HORN
+2EC8 CJK RADICAL C-SIMPLIFIED SPEECH
+2EC9 CJK RADICAL C-SIMPLIFIED SHELL
+2ECA CJK RADICAL FOOT
+2ECB CJK RADICAL C-SIMPLIFIED CART
+2ECC CJK RADICAL SIMPLIFIED WALK
+2ECD CJK RADICAL WALK ONE
+2ECE CJK RADICAL WALK TWO
+2ECF CJK RADICAL CITY
+2ED0 CJK RADICAL C-SIMPLIFIED GOLD
+2ED1 CJK RADICAL LONG ONE
+2ED2 CJK RADICAL LONG TWO
+2ED3 CJK RADICAL C-SIMPLIFIED LONG
+2ED4 CJK RADICAL C-SIMPLIFIED GATE
+2ED5 CJK RADICAL MOUND ONE
+2ED6 CJK RADICAL MOUND TWO
+2ED7 CJK RADICAL RAIN
+2ED8 CJK RADICAL BLUE
+2ED9 CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+2EDA CJK RADICAL C-SIMPLIFIED LEAF
+2EDB CJK RADICAL C-SIMPLIFIED WIND
+2EDC CJK RADICAL C-SIMPLIFIED FLY
+2EDD CJK RADICAL EAT ONE
+2EDE CJK RADICAL EAT TWO
+2EDF CJK RADICAL EAT THREE
+2EE0 CJK RADICAL C-SIMPLIFIED EAT
+2EE1 CJK RADICAL HEAD
+2EE2 CJK RADICAL C-SIMPLIFIED HORSE
+2EE3 CJK RADICAL BONE
+2EE4 CJK RADICAL GHOST
+2EE5 CJK RADICAL C-SIMPLIFIED FISH
+2EE6 CJK RADICAL C-SIMPLIFIED BIRD
+2EE7 CJK RADICAL C-SIMPLIFIED SALT
+2EE8 CJK RADICAL SIMPLIFIED WHEAT
+2EE9 CJK RADICAL SIMPLIFIED YELLOW
+2EEA CJK RADICAL C-SIMPLIFIED FROG
+2EEB CJK RADICAL J-SIMPLIFIED EVEN
+2EEC CJK RADICAL C-SIMPLIFIED EVEN
+2EED CJK RADICAL J-SIMPLIFIED TOOTH
+2EEE CJK RADICAL C-SIMPLIFIED TOOTH
+2EEF CJK RADICAL J-SIMPLIFIED DRAGON
+2EF0 CJK RADICAL C-SIMPLIFIED DRAGON
+2EF1 CJK RADICAL TURTLE
+2EF2 CJK RADICAL J-SIMPLIFIED TURTLE
+2EF3 CJK RADICAL C-SIMPLIFIED TURTLE
+2F00 KANGXI RADICAL ONE
+2F01 KANGXI RADICAL LINE
+2F02 KANGXI RADICAL DOT
+2F03 KANGXI RADICAL SLASH
+2F04 KANGXI RADICAL SECOND
+2F05 KANGXI RADICAL HOOK
+2F06 KANGXI RADICAL TWO
+2F07 KANGXI RADICAL LID
+2F08 KANGXI RADICAL MAN
+2F09 KANGXI RADICAL LEGS
+2F0A KANGXI RADICAL ENTER
+2F0B KANGXI RADICAL EIGHT
+2F0C KANGXI RADICAL DOWN BOX
+2F0D KANGXI RADICAL COVER
+2F0E KANGXI RADICAL ICE
+2F0F KANGXI RADICAL TABLE
+2F10 KANGXI RADICAL OPEN BOX
+2F11 KANGXI RADICAL KNIFE
+2F12 KANGXI RADICAL POWER
+2F13 KANGXI RADICAL WRAP
+2F14 KANGXI RADICAL SPOON
+2F15 KANGXI RADICAL RIGHT OPEN BOX
+2F16 KANGXI RADICAL HIDING ENCLOSURE
+2F17 KANGXI RADICAL TEN
+2F18 KANGXI RADICAL DIVINATION
+2F19 KANGXI RADICAL SEAL
+2F1A KANGXI RADICAL CLIFF
+2F1B KANGXI RADICAL PRIVATE
+2F1C KANGXI RADICAL AGAIN
+2F1D KANGXI RADICAL MOUTH
+2F1E KANGXI RADICAL ENCLOSURE
+2F1F KANGXI RADICAL EARTH
+2F20 KANGXI RADICAL SCHOLAR
+2F21 KANGXI RADICAL GO
+2F22 KANGXI RADICAL GO SLOWLY
+2F23 KANGXI RADICAL EVENING
+2F24 KANGXI RADICAL BIG
+2F25 KANGXI RADICAL WOMAN
+2F26 KANGXI RADICAL CHILD
+2F27 KANGXI RADICAL ROOF
+2F28 KANGXI RADICAL INCH
+2F29 KANGXI RADICAL SMALL
+2F2A KANGXI RADICAL LAME
+2F2B KANGXI RADICAL CORPSE
+2F2C KANGXI RADICAL SPROUT
+2F2D KANGXI RADICAL MOUNTAIN
+2F2E KANGXI RADICAL RIVER
+2F2F KANGXI RADICAL WORK
+2F30 KANGXI RADICAL ONESELF
+2F31 KANGXI RADICAL TURBAN
+2F32 KANGXI RADICAL DRY
+2F33 KANGXI RADICAL SHORT THREAD
+2F34 KANGXI RADICAL DOTTED CLIFF
+2F35 KANGXI RADICAL LONG STRIDE
+2F36 KANGXI RADICAL TWO HANDS
+2F37 KANGXI RADICAL SHOOT
+2F38 KANGXI RADICAL BOW
+2F39 KANGXI RADICAL SNOUT
+2F3A KANGXI RADICAL BRISTLE
+2F3B KANGXI RADICAL STEP
+2F3C KANGXI RADICAL HEART
+2F3D KANGXI RADICAL HALBERD
+2F3E KANGXI RADICAL DOOR
+2F3F KANGXI RADICAL HAND
+2F40 KANGXI RADICAL BRANCH
+2F41 KANGXI RADICAL RAP
+2F42 KANGXI RADICAL SCRIPT
+2F43 KANGXI RADICAL DIPPER
+2F44 KANGXI RADICAL AXE
+2F45 KANGXI RADICAL SQUARE
+2F46 KANGXI RADICAL NOT
+2F47 KANGXI RADICAL SUN
+2F48 KANGXI RADICAL SAY
+2F49 KANGXI RADICAL MOON
+2F4A KANGXI RADICAL TREE
+2F4B KANGXI RADICAL LACK
+2F4C KANGXI RADICAL STOP
+2F4D KANGXI RADICAL DEATH
+2F4E KANGXI RADICAL WEAPON
+2F4F KANGXI RADICAL DO NOT
+2F50 KANGXI RADICAL COMPARE
+2F51 KANGXI RADICAL FUR
+2F52 KANGXI RADICAL CLAN
+2F53 KANGXI RADICAL STEAM
+2F54 KANGXI RADICAL WATER
+2F55 KANGXI RADICAL FIRE
+2F56 KANGXI RADICAL CLAW
+2F57 KANGXI RADICAL FATHER
+2F58 KANGXI RADICAL DOUBLE X
+2F59 KANGXI RADICAL HALF TREE TRUNK
+2F5A KANGXI RADICAL SLICE
+2F5B KANGXI RADICAL FANG
+2F5C KANGXI RADICAL COW
+2F5D KANGXI RADICAL DOG
+2F5E KANGXI RADICAL PROFOUND
+2F5F KANGXI RADICAL JADE
+2F60 KANGXI RADICAL MELON
+2F61 KANGXI RADICAL TILE
+2F62 KANGXI RADICAL SWEET
+2F63 KANGXI RADICAL LIFE
+2F64 KANGXI RADICAL USE
+2F65 KANGXI RADICAL FIELD
+2F66 KANGXI RADICAL BOLT OF CLOTH
+2F67 KANGXI RADICAL SICKNESS
+2F68 KANGXI RADICAL DOTTED TENT
+2F69 KANGXI RADICAL WHITE
+2F6A KANGXI RADICAL SKIN
+2F6B KANGXI RADICAL DISH
+2F6C KANGXI RADICAL EYE
+2F6D KANGXI RADICAL SPEAR
+2F6E KANGXI RADICAL ARROW
+2F6F KANGXI RADICAL STONE
+2F70 KANGXI RADICAL SPIRIT
+2F71 KANGXI RADICAL TRACK
+2F72 KANGXI RADICAL GRAIN
+2F73 KANGXI RADICAL CAVE
+2F74 KANGXI RADICAL STAND
+2F75 KANGXI RADICAL BAMBOO
+2F76 KANGXI RADICAL RICE
+2F77 KANGXI RADICAL SILK
+2F78 KANGXI RADICAL JAR
+2F79 KANGXI RADICAL NET
+2F7A KANGXI RADICAL SHEEP
+2F7B KANGXI RADICAL FEATHER
+2F7C KANGXI RADICAL OLD
+2F7D KANGXI RADICAL AND
+2F7E KANGXI RADICAL PLOW
+2F7F KANGXI RADICAL EAR
+2F80 KANGXI RADICAL BRUSH
+2F81 KANGXI RADICAL MEAT
+2F82 KANGXI RADICAL MINISTER
+2F83 KANGXI RADICAL SELF
+2F84 KANGXI RADICAL ARRIVE
+2F85 KANGXI RADICAL MORTAR
+2F86 KANGXI RADICAL TONGUE
+2F87 KANGXI RADICAL OPPOSE
+2F88 KANGXI RADICAL BOAT
+2F89 KANGXI RADICAL STOPPING
+2F8A KANGXI RADICAL COLOR
+2F8B KANGXI RADICAL GRASS
+2F8C KANGXI RADICAL TIGER
+2F8D KANGXI RADICAL INSECT
+2F8E KANGXI RADICAL BLOOD
+2F8F KANGXI RADICAL WALK ENCLOSURE
+2F90 KANGXI RADICAL CLOTHES
+2F91 KANGXI RADICAL WEST
+2F92 KANGXI RADICAL SEE
+2F93 KANGXI RADICAL HORN
+2F94 KANGXI RADICAL SPEECH
+2F95 KANGXI RADICAL VALLEY
+2F96 KANGXI RADICAL BEAN
+2F97 KANGXI RADICAL PIG
+2F98 KANGXI RADICAL BADGER
+2F99 KANGXI RADICAL SHELL
+2F9A KANGXI RADICAL RED
+2F9B KANGXI RADICAL RUN
+2F9C KANGXI RADICAL FOOT
+2F9D KANGXI RADICAL BODY
+2F9E KANGXI RADICAL CART
+2F9F KANGXI RADICAL BITTER
+2FA0 KANGXI RADICAL MORNING
+2FA1 KANGXI RADICAL WALK
+2FA2 KANGXI RADICAL CITY
+2FA3 KANGXI RADICAL WINE
+2FA4 KANGXI RADICAL DISTINGUISH
+2FA5 KANGXI RADICAL VILLAGE
+2FA6 KANGXI RADICAL GOLD
+2FA7 KANGXI RADICAL LONG
+2FA8 KANGXI RADICAL GATE
+2FA9 KANGXI RADICAL MOUND
+2FAA KANGXI RADICAL SLAVE
+2FAB KANGXI RADICAL SHORT TAILED BIRD
+2FAC KANGXI RADICAL RAIN
+2FAD KANGXI RADICAL BLUE
+2FAE KANGXI RADICAL WRONG
+2FAF KANGXI RADICAL FACE
+2FB0 KANGXI RADICAL LEATHER
+2FB1 KANGXI RADICAL TANNED LEATHER
+2FB2 KANGXI RADICAL LEEK
+2FB3 KANGXI RADICAL SOUND
+2FB4 KANGXI RADICAL LEAF
+2FB5 KANGXI RADICAL WIND
+2FB6 KANGXI RADICAL FLY
+2FB7 KANGXI RADICAL EAT
+2FB8 KANGXI RADICAL HEAD
+2FB9 KANGXI RADICAL FRAGRANT
+2FBA KANGXI RADICAL HORSE
+2FBB KANGXI RADICAL BONE
+2FBC KANGXI RADICAL TALL
+2FBD KANGXI RADICAL HAIR
+2FBE KANGXI RADICAL FIGHT
+2FBF KANGXI RADICAL SACRIFICIAL WINE
+2FC0 KANGXI RADICAL CAULDRON
+2FC1 KANGXI RADICAL GHOST
+2FC2 KANGXI RADICAL FISH
+2FC3 KANGXI RADICAL BIRD
+2FC4 KANGXI RADICAL SALT
+2FC5 KANGXI RADICAL DEER
+2FC6 KANGXI RADICAL WHEAT
+2FC7 KANGXI RADICAL HEMP
+2FC8 KANGXI RADICAL YELLOW
+2FC9 KANGXI RADICAL MILLET
+2FCA KANGXI RADICAL BLACK
+2FCB KANGXI RADICAL EMBROIDERY
+2FCC KANGXI RADICAL FROG
+2FCD KANGXI RADICAL TRIPOD
+2FCE KANGXI RADICAL DRUM
+2FCF KANGXI RADICAL RAT
+2FD0 KANGXI RADICAL NOSE
+2FD1 KANGXI RADICAL EVEN
+2FD2 KANGXI RADICAL TOOTH
+2FD3 KANGXI RADICAL DRAGON
+2FD4 KANGXI RADICAL TURTLE
+2FD5 KANGXI RADICAL FLUTE
+2FF0 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4 IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000 IDEOGRAPHIC SPACE
+3001 IDEOGRAPHIC COMMA
+3002 IDEOGRAPHIC FULL STOP
+3003 DITTO MARK
+3004 JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005 IDEOGRAPHIC ITERATION MARK
+3006 IDEOGRAPHIC CLOSING MARK
+3007 IDEOGRAPHIC NUMBER ZERO
+3008 LEFT ANGLE BRACKET
+3009 RIGHT ANGLE BRACKET
+300A LEFT DOUBLE ANGLE BRACKET
+300B RIGHT DOUBLE ANGLE BRACKET
+300C LEFT CORNER BRACKET
+300D RIGHT CORNER BRACKET
+300E LEFT WHITE CORNER BRACKET
+300F RIGHT WHITE CORNER BRACKET
+3010 LEFT BLACK LENTICULAR BRACKET
+3011 RIGHT BLACK LENTICULAR BRACKET
+3012 POSTAL MARK
+3013 GETA MARK
+3014 LEFT TORTOISE SHELL BRACKET
+3015 RIGHT TORTOISE SHELL BRACKET
+3016 LEFT WHITE LENTICULAR BRACKET
+3017 RIGHT WHITE LENTICULAR BRACKET
+3018 LEFT WHITE TORTOISE SHELL BRACKET
+3019 RIGHT WHITE TORTOISE SHELL BRACKET
+301A LEFT WHITE SQUARE BRACKET
+301B RIGHT WHITE SQUARE BRACKET
+301C WAVE DASH
+301D REVERSED DOUBLE PRIME QUOTATION MARK
+301E DOUBLE PRIME QUOTATION MARK
+301F LOW DOUBLE PRIME QUOTATION MARK
+3020 POSTAL MARK FACE
+3021 HANGZHOU NUMERAL ONE
+3022 HANGZHOU NUMERAL TWO
+3023 HANGZHOU NUMERAL THREE
+3024 HANGZHOU NUMERAL FOUR
+3025 HANGZHOU NUMERAL FIVE
+3026 HANGZHOU NUMERAL SIX
+3027 HANGZHOU NUMERAL SEVEN
+3028 HANGZHOU NUMERAL EIGHT
+3029 HANGZHOU NUMERAL NINE
+302A IDEOGRAPHIC LEVEL TONE MARK
+302B IDEOGRAPHIC RISING TONE MARK
+302C IDEOGRAPHIC DEPARTING TONE MARK
+302D IDEOGRAPHIC ENTERING TONE MARK
+302E HANGUL SINGLE DOT TONE MARK
+302F HANGUL DOUBLE DOT TONE MARK
+3030 WAVY DASH
+3031 VERTICAL KANA REPEAT MARK
+3032 VERTICAL KANA REPEAT WITH VOICED SOUND MARK
+3033 VERTICAL KANA REPEAT MARK UPPER HALF
+3034 VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF
+3035 VERTICAL KANA REPEAT MARK LOWER HALF
+3036 CIRCLED POSTAL MARK
+3037 IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+3038 HANGZHOU NUMERAL TEN
+3039 HANGZHOU NUMERAL TWENTY
+303A HANGZHOU NUMERAL THIRTY
+303B VERTICAL IDEOGRAPHIC ITERATION MARK
+303C MASU MARK
+303D PART ALTERNATION MARK
+303E IDEOGRAPHIC VARIATION INDICATOR
+303F IDEOGRAPHIC HALF FILL SPACE
+3041 HIRAGANA LETTER SMALL A
+3042 HIRAGANA LETTER A
+3043 HIRAGANA LETTER SMALL I
+3044 HIRAGANA LETTER I
+3045 HIRAGANA LETTER SMALL U
+3046 HIRAGANA LETTER U
+3047 HIRAGANA LETTER SMALL E
+3048 HIRAGANA LETTER E
+3049 HIRAGANA LETTER SMALL O
+304A HIRAGANA LETTER O
+304B HIRAGANA LETTER KA
+304C HIRAGANA LETTER GA
+304D HIRAGANA LETTER KI
+304E HIRAGANA LETTER GI
+304F HIRAGANA LETTER KU
+3050 HIRAGANA LETTER GU
+3051 HIRAGANA LETTER KE
+3052 HIRAGANA LETTER GE
+3053 HIRAGANA LETTER KO
+3054 HIRAGANA LETTER GO
+3055 HIRAGANA LETTER SA
+3056 HIRAGANA LETTER ZA
+3057 HIRAGANA LETTER SI
+3058 HIRAGANA LETTER ZI
+3059 HIRAGANA LETTER SU
+305A HIRAGANA LETTER ZU
+305B HIRAGANA LETTER SE
+305C HIRAGANA LETTER ZE
+305D HIRAGANA LETTER SO
+305E HIRAGANA LETTER ZO
+305F HIRAGANA LETTER TA
+3060 HIRAGANA LETTER DA
+3061 HIRAGANA LETTER TI
+3062 HIRAGANA LETTER DI
+3063 HIRAGANA LETTER SMALL TU
+3064 HIRAGANA LETTER TU
+3065 HIRAGANA LETTER DU
+3066 HIRAGANA LETTER TE
+3067 HIRAGANA LETTER DE
+3068 HIRAGANA LETTER TO
+3069 HIRAGANA LETTER DO
+306A HIRAGANA LETTER NA
+306B HIRAGANA LETTER NI
+306C HIRAGANA LETTER NU
+306D HIRAGANA LETTER NE
+306E HIRAGANA LETTER NO
+306F HIRAGANA LETTER HA
+3070 HIRAGANA LETTER BA
+3071 HIRAGANA LETTER PA
+3072 HIRAGANA LETTER HI
+3073 HIRAGANA LETTER BI
+3074 HIRAGANA LETTER PI
+3075 HIRAGANA LETTER HU
+3076 HIRAGANA LETTER BU
+3077 HIRAGANA LETTER PU
+3078 HIRAGANA LETTER HE
+3079 HIRAGANA LETTER BE
+307A HIRAGANA LETTER PE
+307B HIRAGANA LETTER HO
+307C HIRAGANA LETTER BO
+307D HIRAGANA LETTER PO
+307E HIRAGANA LETTER MA
+307F HIRAGANA LETTER MI
+3080 HIRAGANA LETTER MU
+3081 HIRAGANA LETTER ME
+3082 HIRAGANA LETTER MO
+3083 HIRAGANA LETTER SMALL YA
+3084 HIRAGANA LETTER YA
+3085 HIRAGANA LETTER SMALL YU
+3086 HIRAGANA LETTER YU
+3087 HIRAGANA LETTER SMALL YO
+3088 HIRAGANA LETTER YO
+3089 HIRAGANA LETTER RA
+308A HIRAGANA LETTER RI
+308B HIRAGANA LETTER RU
+308C HIRAGANA LETTER RE
+308D HIRAGANA LETTER RO
+308E HIRAGANA LETTER SMALL WA
+308F HIRAGANA LETTER WA
+3090 HIRAGANA LETTER WI
+3091 HIRAGANA LETTER WE
+3092 HIRAGANA LETTER WO
+3093 HIRAGANA LETTER N
+3094 HIRAGANA LETTER VU
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B KATAKANA-HIRAGANA VOICED SOUND MARK
+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D HIRAGANA ITERATION MARK
+309E HIRAGANA VOICED ITERATION MARK
+309F HIRAGANA DIGRAPH YORI
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN
+30A1 KATAKANA LETTER SMALL A
+30A2 KATAKANA LETTER A
+30A3 KATAKANA LETTER SMALL I
+30A4 KATAKANA LETTER I
+30A5 KATAKANA LETTER SMALL U
+30A6 KATAKANA LETTER U
+30A7 KATAKANA LETTER SMALL E
+30A8 KATAKANA LETTER E
+30A9 KATAKANA LETTER SMALL O
+30AA KATAKANA LETTER O
+30AB KATAKANA LETTER KA
+30AC KATAKANA LETTER GA
+30AD KATAKANA LETTER KI
+30AE KATAKANA LETTER GI
+30AF KATAKANA LETTER KU
+30B0 KATAKANA LETTER GU
+30B1 KATAKANA LETTER KE
+30B2 KATAKANA LETTER GE
+30B3 KATAKANA LETTER KO
+30B4 KATAKANA LETTER GO
+30B5 KATAKANA LETTER SA
+30B6 KATAKANA LETTER ZA
+30B7 KATAKANA LETTER SI
+30B8 KATAKANA LETTER ZI
+30B9 KATAKANA LETTER SU
+30BA KATAKANA LETTER ZU
+30BB KATAKANA LETTER SE
+30BC KATAKANA LETTER ZE
+30BD KATAKANA LETTER SO
+30BE KATAKANA LETTER ZO
+30BF KATAKANA LETTER TA
+30C0 KATAKANA LETTER DA
+30C1 KATAKANA LETTER TI
+30C2 KATAKANA LETTER DI
+30C3 KATAKANA LETTER SMALL TU
+30C4 KATAKANA LETTER TU
+30C5 KATAKANA LETTER DU
+30C6 KATAKANA LETTER TE
+30C7 KATAKANA LETTER DE
+30C8 KATAKANA LETTER TO
+30C9 KATAKANA LETTER DO
+30CA KATAKANA LETTER NA
+30CB KATAKANA LETTER NI
+30CC KATAKANA LETTER NU
+30CD KATAKANA LETTER NE
+30CE KATAKANA LETTER NO
+30CF KATAKANA LETTER HA
+30D0 KATAKANA LETTER BA
+30D1 KATAKANA LETTER PA
+30D2 KATAKANA LETTER HI
+30D3 KATAKANA LETTER BI
+30D4 KATAKANA LETTER PI
+30D5 KATAKANA LETTER HU
+30D6 KATAKANA LETTER BU
+30D7 KATAKANA LETTER PU
+30D8 KATAKANA LETTER HE
+30D9 KATAKANA LETTER BE
+30DA KATAKANA LETTER PE
+30DB KATAKANA LETTER HO
+30DC KATAKANA LETTER BO
+30DD KATAKANA LETTER PO
+30DE KATAKANA LETTER MA
+30DF KATAKANA LETTER MI
+30E0 KATAKANA LETTER MU
+30E1 KATAKANA LETTER ME
+30E2 KATAKANA LETTER MO
+30E3 KATAKANA LETTER SMALL YA
+30E4 KATAKANA LETTER YA
+30E5 KATAKANA LETTER SMALL YU
+30E6 KATAKANA LETTER YU
+30E7 KATAKANA LETTER SMALL YO
+30E8 KATAKANA LETTER YO
+30E9 KATAKANA LETTER RA
+30EA KATAKANA LETTER RI
+30EB KATAKANA LETTER RU
+30EC KATAKANA LETTER RE
+30ED KATAKANA LETTER RO
+30EE KATAKANA LETTER SMALL WA
+30EF KATAKANA LETTER WA
+30F0 KATAKANA LETTER WI
+30F1 KATAKANA LETTER WE
+30F2 KATAKANA LETTER WO
+30F3 KATAKANA LETTER N
+30F4 KATAKANA LETTER VU
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30F7 KATAKANA LETTER VA
+30F8 KATAKANA LETTER VI
+30F9 KATAKANA LETTER VE
+30FA KATAKANA LETTER VO
+30FB KATAKANA MIDDLE DOT
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FD KATAKANA ITERATION MARK
+30FE KATAKANA VOICED ITERATION MARK
+30FF KATAKANA DIGRAPH KOTO
+3105 BOPOMOFO LETTER B
+3106 BOPOMOFO LETTER P
+3107 BOPOMOFO LETTER M
+3108 BOPOMOFO LETTER F
+3109 BOPOMOFO LETTER D
+310A BOPOMOFO LETTER T
+310B BOPOMOFO LETTER N
+310C BOPOMOFO LETTER L
+310D BOPOMOFO LETTER G
+310E BOPOMOFO LETTER K
+310F BOPOMOFO LETTER H
+3110 BOPOMOFO LETTER J
+3111 BOPOMOFO LETTER Q
+3112 BOPOMOFO LETTER X
+3113 BOPOMOFO LETTER ZH
+3114 BOPOMOFO LETTER CH
+3115 BOPOMOFO LETTER SH
+3116 BOPOMOFO LETTER R
+3117 BOPOMOFO LETTER Z
+3118 BOPOMOFO LETTER C
+3119 BOPOMOFO LETTER S
+311A BOPOMOFO LETTER A
+311B BOPOMOFO LETTER O
+311C BOPOMOFO LETTER E
+311D BOPOMOFO LETTER EH
+311E BOPOMOFO LETTER AI
+311F BOPOMOFO LETTER EI
+3120 BOPOMOFO LETTER AU
+3121 BOPOMOFO LETTER OU
+3122 BOPOMOFO LETTER AN
+3123 BOPOMOFO LETTER EN
+3124 BOPOMOFO LETTER ANG
+3125 BOPOMOFO LETTER ENG
+3126 BOPOMOFO LETTER ER
+3127 BOPOMOFO LETTER I
+3128 BOPOMOFO LETTER U
+3129 BOPOMOFO LETTER IU
+312A BOPOMOFO LETTER V
+312B BOPOMOFO LETTER NG
+312C BOPOMOFO LETTER GN
+312D BOPOMOFO LETTER IH
+3131 HANGUL LETTER KIYEOK
+3132 HANGUL LETTER SSANGKIYEOK
+3133 HANGUL LETTER KIYEOK-SIOS
+3134 HANGUL LETTER NIEUN
+3135 HANGUL LETTER NIEUN-CIEUC
+3136 HANGUL LETTER NIEUN-HIEUH
+3137 HANGUL LETTER TIKEUT
+3138 HANGUL LETTER SSANGTIKEUT
+3139 HANGUL LETTER RIEUL
+313A HANGUL LETTER RIEUL-KIYEOK
+313B HANGUL LETTER RIEUL-MIEUM
+313C HANGUL LETTER RIEUL-PIEUP
+313D HANGUL LETTER RIEUL-SIOS
+313E HANGUL LETTER RIEUL-THIEUTH
+313F HANGUL LETTER RIEUL-PHIEUPH
+3140 HANGUL LETTER RIEUL-HIEUH
+3141 HANGUL LETTER MIEUM
+3142 HANGUL LETTER PIEUP
+3143 HANGUL LETTER SSANGPIEUP
+3144 HANGUL LETTER PIEUP-SIOS
+3145 HANGUL LETTER SIOS
+3146 HANGUL LETTER SSANGSIOS
+3147 HANGUL LETTER IEUNG
+3148 HANGUL LETTER CIEUC
+3149 HANGUL LETTER SSANGCIEUC
+314A HANGUL LETTER CHIEUCH
+314B HANGUL LETTER KHIEUKH
+314C HANGUL LETTER THIEUTH
+314D HANGUL LETTER PHIEUPH
+314E HANGUL LETTER HIEUH
+314F HANGUL LETTER A
+3150 HANGUL LETTER AE
+3151 HANGUL LETTER YA
+3152 HANGUL LETTER YAE
+3153 HANGUL LETTER EO
+3154 HANGUL LETTER E
+3155 HANGUL LETTER YEO
+3156 HANGUL LETTER YE
+3157 HANGUL LETTER O
+3158 HANGUL LETTER WA
+3159 HANGUL LETTER WAE
+315A HANGUL LETTER OE
+315B HANGUL LETTER YO
+315C HANGUL LETTER U
+315D HANGUL LETTER WEO
+315E HANGUL LETTER WE
+315F HANGUL LETTER WI
+3160 HANGUL LETTER YU
+3161 HANGUL LETTER EU
+3162 HANGUL LETTER YI
+3163 HANGUL LETTER I
+3164 HANGUL FILLER
+3165 HANGUL LETTER SSANGNIEUN
+3166 HANGUL LETTER NIEUN-TIKEUT
+3167 HANGUL LETTER NIEUN-SIOS
+3168 HANGUL LETTER NIEUN-PANSIOS
+3169 HANGUL LETTER RIEUL-KIYEOK-SIOS
+316A HANGUL LETTER RIEUL-TIKEUT
+316B HANGUL LETTER RIEUL-PIEUP-SIOS
+316C HANGUL LETTER RIEUL-PANSIOS
+316D HANGUL LETTER RIEUL-YEORINHIEUH
+316E HANGUL LETTER MIEUM-PIEUP
+316F HANGUL LETTER MIEUM-SIOS
+3170 HANGUL LETTER MIEUM-PANSIOS
+3171 HANGUL LETTER KAPYEOUNMIEUM
+3172 HANGUL LETTER PIEUP-KIYEOK
+3173 HANGUL LETTER PIEUP-TIKEUT
+3174 HANGUL LETTER PIEUP-SIOS-KIYEOK
+3175 HANGUL LETTER PIEUP-SIOS-TIKEUT
+3176 HANGUL LETTER PIEUP-CIEUC
+3177 HANGUL LETTER PIEUP-THIEUTH
+3178 HANGUL LETTER KAPYEOUNPIEUP
+3179 HANGUL LETTER KAPYEOUNSSANGPIEUP
+317A HANGUL LETTER SIOS-KIYEOK
+317B HANGUL LETTER SIOS-NIEUN
+317C HANGUL LETTER SIOS-TIKEUT
+317D HANGUL LETTER SIOS-PIEUP
+317E HANGUL LETTER SIOS-CIEUC
+317F HANGUL LETTER PANSIOS
+3180 HANGUL LETTER SSANGIEUNG
+3181 HANGUL LETTER YESIEUNG
+3182 HANGUL LETTER YESIEUNG-SIOS
+3183 HANGUL LETTER YESIEUNG-PANSIOS
+3184 HANGUL LETTER KAPYEOUNPHIEUPH
+3185 HANGUL LETTER SSANGHIEUH
+3186 HANGUL LETTER YEORINHIEUH
+3187 HANGUL LETTER YO-YA
+3188 HANGUL LETTER YO-YAE
+3189 HANGUL LETTER YO-I
+318A HANGUL LETTER YU-YEO
+318B HANGUL LETTER YU-YE
+318C HANGUL LETTER YU-I
+318D HANGUL LETTER ARAEA
+318E HANGUL LETTER ARAEAE
+3190 IDEOGRAPHIC ANNOTATION LINKING MARK
+3191 IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192 IDEOGRAPHIC ANNOTATION ONE MARK
+3193 IDEOGRAPHIC ANNOTATION TWO MARK
+3194 IDEOGRAPHIC ANNOTATION THREE MARK
+3195 IDEOGRAPHIC ANNOTATION FOUR MARK
+3196 IDEOGRAPHIC ANNOTATION TOP MARK
+3197 IDEOGRAPHIC ANNOTATION MIDDLE MARK
+3198 IDEOGRAPHIC ANNOTATION BOTTOM MARK
+3199 IDEOGRAPHIC ANNOTATION FIRST MARK
+319A IDEOGRAPHIC ANNOTATION SECOND MARK
+319B IDEOGRAPHIC ANNOTATION THIRD MARK
+319C IDEOGRAPHIC ANNOTATION FOURTH MARK
+319D IDEOGRAPHIC ANNOTATION HEAVEN MARK
+319E IDEOGRAPHIC ANNOTATION EARTH MARK
+319F IDEOGRAPHIC ANNOTATION MAN MARK
+31A0 BOPOMOFO LETTER BU
+31A1 BOPOMOFO LETTER ZI
+31A2 BOPOMOFO LETTER JI
+31A3 BOPOMOFO LETTER GU
+31A4 BOPOMOFO LETTER EE
+31A5 BOPOMOFO LETTER ENN
+31A6 BOPOMOFO LETTER OO
+31A7 BOPOMOFO LETTER ONN
+31A8 BOPOMOFO LETTER IR
+31A9 BOPOMOFO LETTER ANN
+31AA BOPOMOFO LETTER INN
+31AB BOPOMOFO LETTER UNN
+31AC BOPOMOFO LETTER IM
+31AD BOPOMOFO LETTER NGG
+31AE BOPOMOFO LETTER AINN
+31AF BOPOMOFO LETTER AUNN
+31B0 BOPOMOFO LETTER AM
+31B1 BOPOMOFO LETTER OM
+31B2 BOPOMOFO LETTER ONG
+31B3 BOPOMOFO LETTER INNN
+31B4 BOPOMOFO FINAL LETTER P
+31B5 BOPOMOFO FINAL LETTER T
+31B6 BOPOMOFO FINAL LETTER K
+31B7 BOPOMOFO FINAL LETTER H
+31C0 CJK STROKE T
+31C1 CJK STROKE WG
+31C2 CJK STROKE XG
+31C3 CJK STROKE BXG
+31C4 CJK STROKE SW
+31C5 CJK STROKE HZZ
+31C6 CJK STROKE HZG
+31C7 CJK STROKE HP
+31C8 CJK STROKE HZWG
+31C9 CJK STROKE SZWG
+31CA CJK STROKE HZT
+31CB CJK STROKE HZZP
+31CC CJK STROKE HPWG
+31CD CJK STROKE HZW
+31CE CJK STROKE HZZZ
+31CF CJK STROKE N
+31D0 CJK STROKE H
+31D1 CJK STROKE S
+31D2 CJK STROKE P
+31D3 CJK STROKE SP
+31D4 CJK STROKE D
+31D5 CJK STROKE HZ
+31D6 CJK STROKE HG
+31D7 CJK STROKE SZ
+31D8 CJK STROKE SWZ
+31D9 CJK STROKE ST
+31DA CJK STROKE SG
+31DB CJK STROKE PD
+31DC CJK STROKE PZ
+31DD CJK STROKE TN
+31DE CJK STROKE SZZ
+31DF CJK STROKE SWG
+31E0 CJK STROKE HXWG
+31E1 CJK STROKE HZZZG
+31E2 CJK STROKE PG
+31E3 CJK STROKE Q
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+3200 PARENTHESIZED HANGUL KIYEOK
+3201 PARENTHESIZED HANGUL NIEUN
+3202 PARENTHESIZED HANGUL TIKEUT
+3203 PARENTHESIZED HANGUL RIEUL
+3204 PARENTHESIZED HANGUL MIEUM
+3205 PARENTHESIZED HANGUL PIEUP
+3206 PARENTHESIZED HANGUL SIOS
+3207 PARENTHESIZED HANGUL IEUNG
+3208 PARENTHESIZED HANGUL CIEUC
+3209 PARENTHESIZED HANGUL CHIEUCH
+320A PARENTHESIZED HANGUL KHIEUKH
+320B PARENTHESIZED HANGUL THIEUTH
+320C PARENTHESIZED HANGUL PHIEUPH
+320D PARENTHESIZED HANGUL HIEUH
+320E PARENTHESIZED HANGUL KIYEOK A
+320F PARENTHESIZED HANGUL NIEUN A
+3210 PARENTHESIZED HANGUL TIKEUT A
+3211 PARENTHESIZED HANGUL RIEUL A
+3212 PARENTHESIZED HANGUL MIEUM A
+3213 PARENTHESIZED HANGUL PIEUP A
+3214 PARENTHESIZED HANGUL SIOS A
+3215 PARENTHESIZED HANGUL IEUNG A
+3216 PARENTHESIZED HANGUL CIEUC A
+3217 PARENTHESIZED HANGUL CHIEUCH A
+3218 PARENTHESIZED HANGUL KHIEUKH A
+3219 PARENTHESIZED HANGUL THIEUTH A
+321A PARENTHESIZED HANGUL PHIEUPH A
+321B PARENTHESIZED HANGUL HIEUH A
+321C PARENTHESIZED HANGUL CIEUC U
+321D PARENTHESIZED KOREAN CHARACTER OJEON
+321E PARENTHESIZED KOREAN CHARACTER O HU
+3220 PARENTHESIZED IDEOGRAPH ONE
+3221 PARENTHESIZED IDEOGRAPH TWO
+3222 PARENTHESIZED IDEOGRAPH THREE
+3223 PARENTHESIZED IDEOGRAPH FOUR
+3224 PARENTHESIZED IDEOGRAPH FIVE
+3225 PARENTHESIZED IDEOGRAPH SIX
+3226 PARENTHESIZED IDEOGRAPH SEVEN
+3227 PARENTHESIZED IDEOGRAPH EIGHT
+3228 PARENTHESIZED IDEOGRAPH NINE
+3229 PARENTHESIZED IDEOGRAPH TEN
+322A PARENTHESIZED IDEOGRAPH MOON
+322B PARENTHESIZED IDEOGRAPH FIRE
+322C PARENTHESIZED IDEOGRAPH WATER
+322D PARENTHESIZED IDEOGRAPH WOOD
+322E PARENTHESIZED IDEOGRAPH METAL
+322F PARENTHESIZED IDEOGRAPH EARTH
+3230 PARENTHESIZED IDEOGRAPH SUN
+3231 PARENTHESIZED IDEOGRAPH STOCK
+3232 PARENTHESIZED IDEOGRAPH HAVE
+3233 PARENTHESIZED IDEOGRAPH SOCIETY
+3234 PARENTHESIZED IDEOGRAPH NAME
+3235 PARENTHESIZED IDEOGRAPH SPECIAL
+3236 PARENTHESIZED IDEOGRAPH FINANCIAL
+3237 PARENTHESIZED IDEOGRAPH CONGRATULATION
+3238 PARENTHESIZED IDEOGRAPH LABOR
+3239 PARENTHESIZED IDEOGRAPH REPRESENT
+323A PARENTHESIZED IDEOGRAPH CALL
+323B PARENTHESIZED IDEOGRAPH STUDY
+323C PARENTHESIZED IDEOGRAPH SUPERVISE
+323D PARENTHESIZED IDEOGRAPH ENTERPRISE
+323E PARENTHESIZED IDEOGRAPH RESOURCE
+323F PARENTHESIZED IDEOGRAPH ALLIANCE
+3240 PARENTHESIZED IDEOGRAPH FESTIVAL
+3241 PARENTHESIZED IDEOGRAPH REST
+3242 PARENTHESIZED IDEOGRAPH SELF
+3243 PARENTHESIZED IDEOGRAPH REACH
+3250 PARTNERSHIP SIGN
+3251 CIRCLED NUMBER TWENTY ONE
+3252 CIRCLED NUMBER TWENTY TWO
+3253 CIRCLED NUMBER TWENTY THREE
+3254 CIRCLED NUMBER TWENTY FOUR
+3255 CIRCLED NUMBER TWENTY FIVE
+3256 CIRCLED NUMBER TWENTY SIX
+3257 CIRCLED NUMBER TWENTY SEVEN
+3258 CIRCLED NUMBER TWENTY EIGHT
+3259 CIRCLED NUMBER TWENTY NINE
+325A CIRCLED NUMBER THIRTY
+325B CIRCLED NUMBER THIRTY ONE
+325C CIRCLED NUMBER THIRTY TWO
+325D CIRCLED NUMBER THIRTY THREE
+325E CIRCLED NUMBER THIRTY FOUR
+325F CIRCLED NUMBER THIRTY FIVE
+3260 CIRCLED HANGUL KIYEOK
+3261 CIRCLED HANGUL NIEUN
+3262 CIRCLED HANGUL TIKEUT
+3263 CIRCLED HANGUL RIEUL
+3264 CIRCLED HANGUL MIEUM
+3265 CIRCLED HANGUL PIEUP
+3266 CIRCLED HANGUL SIOS
+3267 CIRCLED HANGUL IEUNG
+3268 CIRCLED HANGUL CIEUC
+3269 CIRCLED HANGUL CHIEUCH
+326A CIRCLED HANGUL KHIEUKH
+326B CIRCLED HANGUL THIEUTH
+326C CIRCLED HANGUL PHIEUPH
+326D CIRCLED HANGUL HIEUH
+326E CIRCLED HANGUL KIYEOK A
+326F CIRCLED HANGUL NIEUN A
+3270 CIRCLED HANGUL TIKEUT A
+3271 CIRCLED HANGUL RIEUL A
+3272 CIRCLED HANGUL MIEUM A
+3273 CIRCLED HANGUL PIEUP A
+3274 CIRCLED HANGUL SIOS A
+3275 CIRCLED HANGUL IEUNG A
+3276 CIRCLED HANGUL CIEUC A
+3277 CIRCLED HANGUL CHIEUCH A
+3278 CIRCLED HANGUL KHIEUKH A
+3279 CIRCLED HANGUL THIEUTH A
+327A CIRCLED HANGUL PHIEUPH A
+327B CIRCLED HANGUL HIEUH A
+327C CIRCLED KOREAN CHARACTER CHAMKO
+327D CIRCLED KOREAN CHARACTER JUEUI
+327E CIRCLED HANGUL IEUNG U
+327F KOREAN STANDARD SYMBOL
+3280 CIRCLED IDEOGRAPH ONE
+3281 CIRCLED IDEOGRAPH TWO
+3282 CIRCLED IDEOGRAPH THREE
+3283 CIRCLED IDEOGRAPH FOUR
+3284 CIRCLED IDEOGRAPH FIVE
+3285 CIRCLED IDEOGRAPH SIX
+3286 CIRCLED IDEOGRAPH SEVEN
+3287 CIRCLED IDEOGRAPH EIGHT
+3288 CIRCLED IDEOGRAPH NINE
+3289 CIRCLED IDEOGRAPH TEN
+328A CIRCLED IDEOGRAPH MOON
+328B CIRCLED IDEOGRAPH FIRE
+328C CIRCLED IDEOGRAPH WATER
+328D CIRCLED IDEOGRAPH WOOD
+328E CIRCLED IDEOGRAPH METAL
+328F CIRCLED IDEOGRAPH EARTH
+3290 CIRCLED IDEOGRAPH SUN
+3291 CIRCLED IDEOGRAPH STOCK
+3292 CIRCLED IDEOGRAPH HAVE
+3293 CIRCLED IDEOGRAPH SOCIETY
+3294 CIRCLED IDEOGRAPH NAME
+3295 CIRCLED IDEOGRAPH SPECIAL
+3296 CIRCLED IDEOGRAPH FINANCIAL
+3297 CIRCLED IDEOGRAPH CONGRATULATION
+3298 CIRCLED IDEOGRAPH LABOR
+3299 CIRCLED IDEOGRAPH SECRET
+329A CIRCLED IDEOGRAPH MALE
+329B CIRCLED IDEOGRAPH FEMALE
+329C CIRCLED IDEOGRAPH SUITABLE
+329D CIRCLED IDEOGRAPH EXCELLENT
+329E CIRCLED IDEOGRAPH PRINT
+329F CIRCLED IDEOGRAPH ATTENTION
+32A0 CIRCLED IDEOGRAPH ITEM
+32A1 CIRCLED IDEOGRAPH REST
+32A2 CIRCLED IDEOGRAPH COPY
+32A3 CIRCLED IDEOGRAPH CORRECT
+32A4 CIRCLED IDEOGRAPH HIGH
+32A5 CIRCLED IDEOGRAPH CENTRE
+32A6 CIRCLED IDEOGRAPH LOW
+32A7 CIRCLED IDEOGRAPH LEFT
+32A8 CIRCLED IDEOGRAPH RIGHT
+32A9 CIRCLED IDEOGRAPH MEDICINE
+32AA CIRCLED IDEOGRAPH RELIGION
+32AB CIRCLED IDEOGRAPH STUDY
+32AC CIRCLED IDEOGRAPH SUPERVISE
+32AD CIRCLED IDEOGRAPH ENTERPRISE
+32AE CIRCLED IDEOGRAPH RESOURCE
+32AF CIRCLED IDEOGRAPH ALLIANCE
+32B0 CIRCLED IDEOGRAPH NIGHT
+32B1 CIRCLED NUMBER THIRTY SIX
+32B2 CIRCLED NUMBER THIRTY SEVEN
+32B3 CIRCLED NUMBER THIRTY EIGHT
+32B4 CIRCLED NUMBER THIRTY NINE
+32B5 CIRCLED NUMBER FORTY
+32B6 CIRCLED NUMBER FORTY ONE
+32B7 CIRCLED NUMBER FORTY TWO
+32B8 CIRCLED NUMBER FORTY THREE
+32B9 CIRCLED NUMBER FORTY FOUR
+32BA CIRCLED NUMBER FORTY FIVE
+32BB CIRCLED NUMBER FORTY SIX
+32BC CIRCLED NUMBER FORTY SEVEN
+32BD CIRCLED NUMBER FORTY EIGHT
+32BE CIRCLED NUMBER FORTY NINE
+32BF CIRCLED NUMBER FIFTY
+32C0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+32C1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+32C2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+32C3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+32C4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+32C5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+32C6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+32C7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+32C8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+32C9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+32CA IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+32CB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32CC SQUARE HG
+32CD SQUARE ERG
+32CE SQUARE EV
+32CF LIMITED LIABILITY SIGN
+32D0 CIRCLED KATAKANA A
+32D1 CIRCLED KATAKANA I
+32D2 CIRCLED KATAKANA U
+32D3 CIRCLED KATAKANA E
+32D4 CIRCLED KATAKANA O
+32D5 CIRCLED KATAKANA KA
+32D6 CIRCLED KATAKANA KI
+32D7 CIRCLED KATAKANA KU
+32D8 CIRCLED KATAKANA KE
+32D9 CIRCLED KATAKANA KO
+32DA CIRCLED KATAKANA SA
+32DB CIRCLED KATAKANA SI
+32DC CIRCLED KATAKANA SU
+32DD CIRCLED KATAKANA SE
+32DE CIRCLED KATAKANA SO
+32DF CIRCLED KATAKANA TA
+32E0 CIRCLED KATAKANA TI
+32E1 CIRCLED KATAKANA TU
+32E2 CIRCLED KATAKANA TE
+32E3 CIRCLED KATAKANA TO
+32E4 CIRCLED KATAKANA NA
+32E5 CIRCLED KATAKANA NI
+32E6 CIRCLED KATAKANA NU
+32E7 CIRCLED KATAKANA NE
+32E8 CIRCLED KATAKANA NO
+32E9 CIRCLED KATAKANA HA
+32EA CIRCLED KATAKANA HI
+32EB CIRCLED KATAKANA HU
+32EC CIRCLED KATAKANA HE
+32ED CIRCLED KATAKANA HO
+32EE CIRCLED KATAKANA MA
+32EF CIRCLED KATAKANA MI
+32F0 CIRCLED KATAKANA MU
+32F1 CIRCLED KATAKANA ME
+32F2 CIRCLED KATAKANA MO
+32F3 CIRCLED KATAKANA YA
+32F4 CIRCLED KATAKANA YU
+32F5 CIRCLED KATAKANA YO
+32F6 CIRCLED KATAKANA RA
+32F7 CIRCLED KATAKANA RI
+32F8 CIRCLED KATAKANA RU
+32F9 CIRCLED KATAKANA RE
+32FA CIRCLED KATAKANA RO
+32FB CIRCLED KATAKANA WA
+32FC CIRCLED KATAKANA WI
+32FD CIRCLED KATAKANA WE
+32FE CIRCLED KATAKANA WO
+3300 SQUARE APAATO
+3301 SQUARE ARUHUA
+3302 SQUARE ANPEA
+3303 SQUARE AARU
+3304 SQUARE ININGU
+3305 SQUARE INTI
+3306 SQUARE UON
+3307 SQUARE ESUKUUDO
+3308 SQUARE EEKAA
+3309 SQUARE ONSU
+330A SQUARE OOMU
+330B SQUARE KAIRI
+330C SQUARE KARATTO
+330D SQUARE KARORII
+330E SQUARE GARON
+330F SQUARE GANMA
+3310 SQUARE GIGA
+3311 SQUARE GINII
+3312 SQUARE KYURII
+3313 SQUARE GIRUDAA
+3314 SQUARE KIRO
+3315 SQUARE KIROGURAMU
+3316 SQUARE KIROMEETORU
+3317 SQUARE KIROWATTO
+3318 SQUARE GURAMU
+3319 SQUARE GURAMUTON
+331A SQUARE KURUZEIRO
+331B SQUARE KUROONE
+331C SQUARE KEESU
+331D SQUARE KORUNA
+331E SQUARE KOOPO
+331F SQUARE SAIKURU
+3320 SQUARE SANTIIMU
+3321 SQUARE SIRINGU
+3322 SQUARE SENTI
+3323 SQUARE SENTO
+3324 SQUARE DAASU
+3325 SQUARE DESI
+3326 SQUARE DORU
+3327 SQUARE TON
+3328 SQUARE NANO
+3329 SQUARE NOTTO
+332A SQUARE HAITU
+332B SQUARE PAASENTO
+332C SQUARE PAATU
+332D SQUARE BAARERU
+332E SQUARE PIASUTORU
+332F SQUARE PIKURU
+3330 SQUARE PIKO
+3331 SQUARE BIRU
+3332 SQUARE HUARADDO
+3333 SQUARE HUIITO
+3334 SQUARE BUSSYERU
+3335 SQUARE HURAN
+3336 SQUARE HEKUTAARU
+3337 SQUARE PESO
+3338 SQUARE PENIHI
+3339 SQUARE HERUTU
+333A SQUARE PENSU
+333B SQUARE PEEZI
+333C SQUARE BEETA
+333D SQUARE POINTO
+333E SQUARE BORUTO
+333F SQUARE HON
+3340 SQUARE PONDO
+3341 SQUARE HOORU
+3342 SQUARE HOON
+3343 SQUARE MAIKURO
+3344 SQUARE MAIRU
+3345 SQUARE MAHHA
+3346 SQUARE MARUKU
+3347 SQUARE MANSYON
+3348 SQUARE MIKURON
+3349 SQUARE MIRI
+334A SQUARE MIRIBAARU
+334B SQUARE MEGA
+334C SQUARE MEGATON
+334D SQUARE MEETORU
+334E SQUARE YAADO
+334F SQUARE YAARU
+3350 SQUARE YUAN
+3351 SQUARE RITTORU
+3352 SQUARE RIRA
+3353 SQUARE RUPII
+3354 SQUARE RUUBURU
+3355 SQUARE REMU
+3356 SQUARE RENTOGEN
+3357 SQUARE WATTO
+3358 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+3359 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+335A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+335B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+335C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+335D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+335E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+335F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+3360 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+3361 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+3362 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+3363 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+3364 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+3365 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+3366 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+3367 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+3368 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+3369 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+336A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+336B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+336C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+336D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+336E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+336F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+3370 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+3371 SQUARE HPA
+3372 SQUARE DA
+3373 SQUARE AU
+3374 SQUARE BAR
+3375 SQUARE OV
+3376 SQUARE PC
+3377 SQUARE DM
+3378 SQUARE DM SQUARED
+3379 SQUARE DM CUBED
+337A SQUARE IU
+337B SQUARE ERA NAME HEISEI
+337C SQUARE ERA NAME SYOUWA
+337D SQUARE ERA NAME TAISYOU
+337E SQUARE ERA NAME MEIZI
+337F SQUARE CORPORATION
+3380 SQUARE PA AMPS
+3381 SQUARE NA
+3382 SQUARE MU A
+3383 SQUARE MA
+3384 SQUARE KA
+3385 SQUARE KB
+3386 SQUARE MB
+3387 SQUARE GB
+3388 SQUARE CAL
+3389 SQUARE KCAL
+338A SQUARE PF
+338B SQUARE NF
+338C SQUARE MU F
+338D SQUARE MU G
+338E SQUARE MG
+338F SQUARE KG
+3390 SQUARE HZ
+3391 SQUARE KHZ
+3392 SQUARE MHZ
+3393 SQUARE GHZ
+3394 SQUARE THZ
+3395 SQUARE MU L
+3396 SQUARE ML
+3397 SQUARE DL
+3398 SQUARE KL
+3399 SQUARE FM
+339A SQUARE NM
+339B SQUARE MU M
+339C SQUARE MM
+339D SQUARE CM
+339E SQUARE KM
+339F SQUARE MM SQUARED
+33A0 SQUARE CM SQUARED
+33A1 SQUARE M SQUARED
+33A2 SQUARE KM SQUARED
+33A3 SQUARE MM CUBED
+33A4 SQUARE CM CUBED
+33A5 SQUARE M CUBED
+33A6 SQUARE KM CUBED
+33A7 SQUARE M OVER S
+33A8 SQUARE M OVER S SQUARED
+33A9 SQUARE PA
+33AA SQUARE KPA
+33AB SQUARE MPA
+33AC SQUARE GPA
+33AD SQUARE RAD
+33AE SQUARE RAD OVER S
+33AF SQUARE RAD OVER S SQUARED
+33B0 SQUARE PS
+33B1 SQUARE NS
+33B2 SQUARE MU S
+33B3 SQUARE MS
+33B4 SQUARE PV
+33B5 SQUARE NV
+33B6 SQUARE MU V
+33B7 SQUARE MV
+33B8 SQUARE KV
+33B9 SQUARE MV MEGA
+33BA SQUARE PW
+33BB SQUARE NW
+33BC SQUARE MU W
+33BD SQUARE MW
+33BE SQUARE KW
+33BF SQUARE MW MEGA
+33C0 SQUARE K OHM
+33C1 SQUARE M OHM
+33C2 SQUARE AM
+33C3 SQUARE BQ
+33C4 SQUARE CC
+33C5 SQUARE CD
+33C6 SQUARE C OVER KG
+33C7 SQUARE CO
+33C8 SQUARE DB
+33C9 SQUARE GY
+33CA SQUARE HA
+33CB SQUARE HP
+33CC SQUARE IN
+33CD SQUARE KK
+33CE SQUARE KM CAPITAL
+33CF SQUARE KT
+33D0 SQUARE LM
+33D1 SQUARE LN
+33D2 SQUARE LOG
+33D3 SQUARE LX
+33D4 SQUARE MB SMALL
+33D5 SQUARE MIL
+33D6 SQUARE MOL
+33D7 SQUARE PH
+33D8 SQUARE PM
+33D9 SQUARE PPM
+33DA SQUARE PR
+33DB SQUARE SR
+33DC SQUARE SV
+33DD SQUARE WB
+33DE SQUARE V OVER M
+33DF SQUARE A OVER M
+33E0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+33E1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+33E2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+33E3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+33E4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+33E5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+33E6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+33E7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+33E8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+33E9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+33EA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+33EB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+33EC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+33ED IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+33EE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+33EF IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+33F0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+33F1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+33F2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+33F3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+33F4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+33F5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+33F6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+33F7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+33F8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+33F9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+33FA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+33FB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+33FC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+33FD IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+33FE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+33FF SQUARE GAL
+3400 4DB5 CJK Ideograph Extension A
+4DC0 HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1 HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2 HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3 HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4 HEXAGRAM FOR WAITING
+4DC5 HEXAGRAM FOR CONFLICT
+4DC6 HEXAGRAM FOR THE ARMY
+4DC7 HEXAGRAM FOR HOLDING TOGETHER
+4DC8 HEXAGRAM FOR SMALL TAMING
+4DC9 HEXAGRAM FOR TREADING
+4DCA HEXAGRAM FOR PEACE
+4DCB HEXAGRAM FOR STANDSTILL
+4DCC HEXAGRAM FOR FELLOWSHIP
+4DCD HEXAGRAM FOR GREAT POSSESSION
+4DCE HEXAGRAM FOR MODESTY
+4DCF HEXAGRAM FOR ENTHUSIASM
+4DD0 HEXAGRAM FOR FOLLOWING
+4DD1 HEXAGRAM FOR WORK ON THE DECAYED
+4DD2 HEXAGRAM FOR APPROACH
+4DD3 HEXAGRAM FOR CONTEMPLATION
+4DD4 HEXAGRAM FOR BITING THROUGH
+4DD5 HEXAGRAM FOR GRACE
+4DD6 HEXAGRAM FOR SPLITTING APART
+4DD7 HEXAGRAM FOR RETURN
+4DD8 HEXAGRAM FOR INNOCENCE
+4DD9 HEXAGRAM FOR GREAT TAMING
+4DDA HEXAGRAM FOR MOUTH CORNERS
+4DDB HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC HEXAGRAM FOR THE ABYSMAL WATER
+4DDD HEXAGRAM FOR THE CLINGING FIRE
+4DDE HEXAGRAM FOR INFLUENCE
+4DDF HEXAGRAM FOR DURATION
+4DE0 HEXAGRAM FOR RETREAT
+4DE1 HEXAGRAM FOR GREAT POWER
+4DE2 HEXAGRAM FOR PROGRESS
+4DE3 HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4 HEXAGRAM FOR THE FAMILY
+4DE5 HEXAGRAM FOR OPPOSITION
+4DE6 HEXAGRAM FOR OBSTRUCTION
+4DE7 HEXAGRAM FOR DELIVERANCE
+4DE8 HEXAGRAM FOR DECREASE
+4DE9 HEXAGRAM FOR INCREASE
+4DEA HEXAGRAM FOR BREAKTHROUGH
+4DEB HEXAGRAM FOR COMING TO MEET
+4DEC HEXAGRAM FOR GATHERING TOGETHER
+4DED HEXAGRAM FOR PUSHING UPWARD
+4DEE HEXAGRAM FOR OPPRESSION
+4DEF HEXAGRAM FOR THE WELL
+4DF0 HEXAGRAM FOR REVOLUTION
+4DF1 HEXAGRAM FOR THE CAULDRON
+4DF2 HEXAGRAM FOR THE AROUSING THUNDER
+4DF3 HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4 HEXAGRAM FOR DEVELOPMENT
+4DF5 HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6 HEXAGRAM FOR ABUNDANCE
+4DF7 HEXAGRAM FOR THE WANDERER
+4DF8 HEXAGRAM FOR THE GENTLE WIND
+4DF9 HEXAGRAM FOR THE JOYOUS LAKE
+4DFA HEXAGRAM FOR DISPERSION
+4DFB HEXAGRAM FOR LIMITATION
+4DFC HEXAGRAM FOR INNER TRUTH
+4DFD HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE HEXAGRAM FOR AFTER COMPLETION
+4DFF HEXAGRAM FOR BEFORE COMPLETION
+4E00 9FC3 CJK Ideograph
+A000 YI SYLLABLE IT
+A001 YI SYLLABLE IX
+A002 YI SYLLABLE I
+A003 YI SYLLABLE IP
+A004 YI SYLLABLE IET
+A005 YI SYLLABLE IEX
+A006 YI SYLLABLE IE
+A007 YI SYLLABLE IEP
+A008 YI SYLLABLE AT
+A009 YI SYLLABLE AX
+A00A YI SYLLABLE A
+A00B YI SYLLABLE AP
+A00C YI SYLLABLE UOX
+A00D YI SYLLABLE UO
+A00E YI SYLLABLE UOP
+A00F YI SYLLABLE OT
+A010 YI SYLLABLE OX
+A011 YI SYLLABLE O
+A012 YI SYLLABLE OP
+A013 YI SYLLABLE EX
+A014 YI SYLLABLE E
+A015 YI SYLLABLE WU
+A016 YI SYLLABLE BIT
+A017 YI SYLLABLE BIX
+A018 YI SYLLABLE BI
+A019 YI SYLLABLE BIP
+A01A YI SYLLABLE BIET
+A01B YI SYLLABLE BIEX
+A01C YI SYLLABLE BIE
+A01D YI SYLLABLE BIEP
+A01E YI SYLLABLE BAT
+A01F YI SYLLABLE BAX
+A020 YI SYLLABLE BA
+A021 YI SYLLABLE BAP
+A022 YI SYLLABLE BUOX
+A023 YI SYLLABLE BUO
+A024 YI SYLLABLE BUOP
+A025 YI SYLLABLE BOT
+A026 YI SYLLABLE BOX
+A027 YI SYLLABLE BO
+A028 YI SYLLABLE BOP
+A029 YI SYLLABLE BEX
+A02A YI SYLLABLE BE
+A02B YI SYLLABLE BEP
+A02C YI SYLLABLE BUT
+A02D YI SYLLABLE BUX
+A02E YI SYLLABLE BU
+A02F YI SYLLABLE BUP
+A030 YI SYLLABLE BURX
+A031 YI SYLLABLE BUR
+A032 YI SYLLABLE BYT
+A033 YI SYLLABLE BYX
+A034 YI SYLLABLE BY
+A035 YI SYLLABLE BYP
+A036 YI SYLLABLE BYRX
+A037 YI SYLLABLE BYR
+A038 YI SYLLABLE PIT
+A039 YI SYLLABLE PIX
+A03A YI SYLLABLE PI
+A03B YI SYLLABLE PIP
+A03C YI SYLLABLE PIEX
+A03D YI SYLLABLE PIE
+A03E YI SYLLABLE PIEP
+A03F YI SYLLABLE PAT
+A040 YI SYLLABLE PAX
+A041 YI SYLLABLE PA
+A042 YI SYLLABLE PAP
+A043 YI SYLLABLE PUOX
+A044 YI SYLLABLE PUO
+A045 YI SYLLABLE PUOP
+A046 YI SYLLABLE POT
+A047 YI SYLLABLE POX
+A048 YI SYLLABLE PO
+A049 YI SYLLABLE POP
+A04A YI SYLLABLE PUT
+A04B YI SYLLABLE PUX
+A04C YI SYLLABLE PU
+A04D YI SYLLABLE PUP
+A04E YI SYLLABLE PURX
+A04F YI SYLLABLE PUR
+A050 YI SYLLABLE PYT
+A051 YI SYLLABLE PYX
+A052 YI SYLLABLE PY
+A053 YI SYLLABLE PYP
+A054 YI SYLLABLE PYRX
+A055 YI SYLLABLE PYR
+A056 YI SYLLABLE BBIT
+A057 YI SYLLABLE BBIX
+A058 YI SYLLABLE BBI
+A059 YI SYLLABLE BBIP
+A05A YI SYLLABLE BBIET
+A05B YI SYLLABLE BBIEX
+A05C YI SYLLABLE BBIE
+A05D YI SYLLABLE BBIEP
+A05E YI SYLLABLE BBAT
+A05F YI SYLLABLE BBAX
+A060 YI SYLLABLE BBA
+A061 YI SYLLABLE BBAP
+A062 YI SYLLABLE BBUOX
+A063 YI SYLLABLE BBUO
+A064 YI SYLLABLE BBUOP
+A065 YI SYLLABLE BBOT
+A066 YI SYLLABLE BBOX
+A067 YI SYLLABLE BBO
+A068 YI SYLLABLE BBOP
+A069 YI SYLLABLE BBEX
+A06A YI SYLLABLE BBE
+A06B YI SYLLABLE BBEP
+A06C YI SYLLABLE BBUT
+A06D YI SYLLABLE BBUX
+A06E YI SYLLABLE BBU
+A06F YI SYLLABLE BBUP
+A070 YI SYLLABLE BBURX
+A071 YI SYLLABLE BBUR
+A072 YI SYLLABLE BBYT
+A073 YI SYLLABLE BBYX
+A074 YI SYLLABLE BBY
+A075 YI SYLLABLE BBYP
+A076 YI SYLLABLE NBIT
+A077 YI SYLLABLE NBIX
+A078 YI SYLLABLE NBI
+A079 YI SYLLABLE NBIP
+A07A YI SYLLABLE NBIEX
+A07B YI SYLLABLE NBIE
+A07C YI SYLLABLE NBIEP
+A07D YI SYLLABLE NBAT
+A07E YI SYLLABLE NBAX
+A07F YI SYLLABLE NBA
+A080 YI SYLLABLE NBAP
+A081 YI SYLLABLE NBOT
+A082 YI SYLLABLE NBOX
+A083 YI SYLLABLE NBO
+A084 YI SYLLABLE NBOP
+A085 YI SYLLABLE NBUT
+A086 YI SYLLABLE NBUX
+A087 YI SYLLABLE NBU
+A088 YI SYLLABLE NBUP
+A089 YI SYLLABLE NBURX
+A08A YI SYLLABLE NBUR
+A08B YI SYLLABLE NBYT
+A08C YI SYLLABLE NBYX
+A08D YI SYLLABLE NBY
+A08E YI SYLLABLE NBYP
+A08F YI SYLLABLE NBYRX
+A090 YI SYLLABLE NBYR
+A091 YI SYLLABLE HMIT
+A092 YI SYLLABLE HMIX
+A093 YI SYLLABLE HMI
+A094 YI SYLLABLE HMIP
+A095 YI SYLLABLE HMIEX
+A096 YI SYLLABLE HMIE
+A097 YI SYLLABLE HMIEP
+A098 YI SYLLABLE HMAT
+A099 YI SYLLABLE HMAX
+A09A YI SYLLABLE HMA
+A09B YI SYLLABLE HMAP
+A09C YI SYLLABLE HMUOX
+A09D YI SYLLABLE HMUO
+A09E YI SYLLABLE HMUOP
+A09F YI SYLLABLE HMOT
+A0A0 YI SYLLABLE HMOX
+A0A1 YI SYLLABLE HMO
+A0A2 YI SYLLABLE HMOP
+A0A3 YI SYLLABLE HMUT
+A0A4 YI SYLLABLE HMUX
+A0A5 YI SYLLABLE HMU
+A0A6 YI SYLLABLE HMUP
+A0A7 YI SYLLABLE HMURX
+A0A8 YI SYLLABLE HMUR
+A0A9 YI SYLLABLE HMYX
+A0AA YI SYLLABLE HMY
+A0AB YI SYLLABLE HMYP
+A0AC YI SYLLABLE HMYRX
+A0AD YI SYLLABLE HMYR
+A0AE YI SYLLABLE MIT
+A0AF YI SYLLABLE MIX
+A0B0 YI SYLLABLE MI
+A0B1 YI SYLLABLE MIP
+A0B2 YI SYLLABLE MIEX
+A0B3 YI SYLLABLE MIE
+A0B4 YI SYLLABLE MIEP
+A0B5 YI SYLLABLE MAT
+A0B6 YI SYLLABLE MAX
+A0B7 YI SYLLABLE MA
+A0B8 YI SYLLABLE MAP
+A0B9 YI SYLLABLE MUOT
+A0BA YI SYLLABLE MUOX
+A0BB YI SYLLABLE MUO
+A0BC YI SYLLABLE MUOP
+A0BD YI SYLLABLE MOT
+A0BE YI SYLLABLE MOX
+A0BF YI SYLLABLE MO
+A0C0 YI SYLLABLE MOP
+A0C1 YI SYLLABLE MEX
+A0C2 YI SYLLABLE ME
+A0C3 YI SYLLABLE MUT
+A0C4 YI SYLLABLE MUX
+A0C5 YI SYLLABLE MU
+A0C6 YI SYLLABLE MUP
+A0C7 YI SYLLABLE MURX
+A0C8 YI SYLLABLE MUR
+A0C9 YI SYLLABLE MYT
+A0CA YI SYLLABLE MYX
+A0CB YI SYLLABLE MY
+A0CC YI SYLLABLE MYP
+A0CD YI SYLLABLE FIT
+A0CE YI SYLLABLE FIX
+A0CF YI SYLLABLE FI
+A0D0 YI SYLLABLE FIP
+A0D1 YI SYLLABLE FAT
+A0D2 YI SYLLABLE FAX
+A0D3 YI SYLLABLE FA
+A0D4 YI SYLLABLE FAP
+A0D5 YI SYLLABLE FOX
+A0D6 YI SYLLABLE FO
+A0D7 YI SYLLABLE FOP
+A0D8 YI SYLLABLE FUT
+A0D9 YI SYLLABLE FUX
+A0DA YI SYLLABLE FU
+A0DB YI SYLLABLE FUP
+A0DC YI SYLLABLE FURX
+A0DD YI SYLLABLE FUR
+A0DE YI SYLLABLE FYT
+A0DF YI SYLLABLE FYX
+A0E0 YI SYLLABLE FY
+A0E1 YI SYLLABLE FYP
+A0E2 YI SYLLABLE VIT
+A0E3 YI SYLLABLE VIX
+A0E4 YI SYLLABLE VI
+A0E5 YI SYLLABLE VIP
+A0E6 YI SYLLABLE VIET
+A0E7 YI SYLLABLE VIEX
+A0E8 YI SYLLABLE VIE
+A0E9 YI SYLLABLE VIEP
+A0EA YI SYLLABLE VAT
+A0EB YI SYLLABLE VAX
+A0EC YI SYLLABLE VA
+A0ED YI SYLLABLE VAP
+A0EE YI SYLLABLE VOT
+A0EF YI SYLLABLE VOX
+A0F0 YI SYLLABLE VO
+A0F1 YI SYLLABLE VOP
+A0F2 YI SYLLABLE VEX
+A0F3 YI SYLLABLE VEP
+A0F4 YI SYLLABLE VUT
+A0F5 YI SYLLABLE VUX
+A0F6 YI SYLLABLE VU
+A0F7 YI SYLLABLE VUP
+A0F8 YI SYLLABLE VURX
+A0F9 YI SYLLABLE VUR
+A0FA YI SYLLABLE VYT
+A0FB YI SYLLABLE VYX
+A0FC YI SYLLABLE VY
+A0FD YI SYLLABLE VYP
+A0FE YI SYLLABLE VYRX
+A0FF YI SYLLABLE VYR
+A100 YI SYLLABLE DIT
+A101 YI SYLLABLE DIX
+A102 YI SYLLABLE DI
+A103 YI SYLLABLE DIP
+A104 YI SYLLABLE DIEX
+A105 YI SYLLABLE DIE
+A106 YI SYLLABLE DIEP
+A107 YI SYLLABLE DAT
+A108 YI SYLLABLE DAX
+A109 YI SYLLABLE DA
+A10A YI SYLLABLE DAP
+A10B YI SYLLABLE DUOX
+A10C YI SYLLABLE DUO
+A10D YI SYLLABLE DOT
+A10E YI SYLLABLE DOX
+A10F YI SYLLABLE DO
+A110 YI SYLLABLE DOP
+A111 YI SYLLABLE DEX
+A112 YI SYLLABLE DE
+A113 YI SYLLABLE DEP
+A114 YI SYLLABLE DUT
+A115 YI SYLLABLE DUX
+A116 YI SYLLABLE DU
+A117 YI SYLLABLE DUP
+A118 YI SYLLABLE DURX
+A119 YI SYLLABLE DUR
+A11A YI SYLLABLE TIT
+A11B YI SYLLABLE TIX
+A11C YI SYLLABLE TI
+A11D YI SYLLABLE TIP
+A11E YI SYLLABLE TIEX
+A11F YI SYLLABLE TIE
+A120 YI SYLLABLE TIEP
+A121 YI SYLLABLE TAT
+A122 YI SYLLABLE TAX
+A123 YI SYLLABLE TA
+A124 YI SYLLABLE TAP
+A125 YI SYLLABLE TUOT
+A126 YI SYLLABLE TUOX
+A127 YI SYLLABLE TUO
+A128 YI SYLLABLE TUOP
+A129 YI SYLLABLE TOT
+A12A YI SYLLABLE TOX
+A12B YI SYLLABLE TO
+A12C YI SYLLABLE TOP
+A12D YI SYLLABLE TEX
+A12E YI SYLLABLE TE
+A12F YI SYLLABLE TEP
+A130 YI SYLLABLE TUT
+A131 YI SYLLABLE TUX
+A132 YI SYLLABLE TU
+A133 YI SYLLABLE TUP
+A134 YI SYLLABLE TURX
+A135 YI SYLLABLE TUR
+A136 YI SYLLABLE DDIT
+A137 YI SYLLABLE DDIX
+A138 YI SYLLABLE DDI
+A139 YI SYLLABLE DDIP
+A13A YI SYLLABLE DDIEX
+A13B YI SYLLABLE DDIE
+A13C YI SYLLABLE DDIEP
+A13D YI SYLLABLE DDAT
+A13E YI SYLLABLE DDAX
+A13F YI SYLLABLE DDA
+A140 YI SYLLABLE DDAP
+A141 YI SYLLABLE DDUOX
+A142 YI SYLLABLE DDUO
+A143 YI SYLLABLE DDUOP
+A144 YI SYLLABLE DDOT
+A145 YI SYLLABLE DDOX
+A146 YI SYLLABLE DDO
+A147 YI SYLLABLE DDOP
+A148 YI SYLLABLE DDEX
+A149 YI SYLLABLE DDE
+A14A YI SYLLABLE DDEP
+A14B YI SYLLABLE DDUT
+A14C YI SYLLABLE DDUX
+A14D YI SYLLABLE DDU
+A14E YI SYLLABLE DDUP
+A14F YI SYLLABLE DDURX
+A150 YI SYLLABLE DDUR
+A151 YI SYLLABLE NDIT
+A152 YI SYLLABLE NDIX
+A153 YI SYLLABLE NDI
+A154 YI SYLLABLE NDIP
+A155 YI SYLLABLE NDIEX
+A156 YI SYLLABLE NDIE
+A157 YI SYLLABLE NDAT
+A158 YI SYLLABLE NDAX
+A159 YI SYLLABLE NDA
+A15A YI SYLLABLE NDAP
+A15B YI SYLLABLE NDOT
+A15C YI SYLLABLE NDOX
+A15D YI SYLLABLE NDO
+A15E YI SYLLABLE NDOP
+A15F YI SYLLABLE NDEX
+A160 YI SYLLABLE NDE
+A161 YI SYLLABLE NDEP
+A162 YI SYLLABLE NDUT
+A163 YI SYLLABLE NDUX
+A164 YI SYLLABLE NDU
+A165 YI SYLLABLE NDUP
+A166 YI SYLLABLE NDURX
+A167 YI SYLLABLE NDUR
+A168 YI SYLLABLE HNIT
+A169 YI SYLLABLE HNIX
+A16A YI SYLLABLE HNI
+A16B YI SYLLABLE HNIP
+A16C YI SYLLABLE HNIET
+A16D YI SYLLABLE HNIEX
+A16E YI SYLLABLE HNIE
+A16F YI SYLLABLE HNIEP
+A170 YI SYLLABLE HNAT
+A171 YI SYLLABLE HNAX
+A172 YI SYLLABLE HNA
+A173 YI SYLLABLE HNAP
+A174 YI SYLLABLE HNUOX
+A175 YI SYLLABLE HNUO
+A176 YI SYLLABLE HNOT
+A177 YI SYLLABLE HNOX
+A178 YI SYLLABLE HNOP
+A179 YI SYLLABLE HNEX
+A17A YI SYLLABLE HNE
+A17B YI SYLLABLE HNEP
+A17C YI SYLLABLE HNUT
+A17D YI SYLLABLE NIT
+A17E YI SYLLABLE NIX
+A17F YI SYLLABLE NI
+A180 YI SYLLABLE NIP
+A181 YI SYLLABLE NIEX
+A182 YI SYLLABLE NIE
+A183 YI SYLLABLE NIEP
+A184 YI SYLLABLE NAX
+A185 YI SYLLABLE NA
+A186 YI SYLLABLE NAP
+A187 YI SYLLABLE NUOX
+A188 YI SYLLABLE NUO
+A189 YI SYLLABLE NUOP
+A18A YI SYLLABLE NOT
+A18B YI SYLLABLE NOX
+A18C YI SYLLABLE NO
+A18D YI SYLLABLE NOP
+A18E YI SYLLABLE NEX
+A18F YI SYLLABLE NE
+A190 YI SYLLABLE NEP
+A191 YI SYLLABLE NUT
+A192 YI SYLLABLE NUX
+A193 YI SYLLABLE NU
+A194 YI SYLLABLE NUP
+A195 YI SYLLABLE NURX
+A196 YI SYLLABLE NUR
+A197 YI SYLLABLE HLIT
+A198 YI SYLLABLE HLIX
+A199 YI SYLLABLE HLI
+A19A YI SYLLABLE HLIP
+A19B YI SYLLABLE HLIEX
+A19C YI SYLLABLE HLIE
+A19D YI SYLLABLE HLIEP
+A19E YI SYLLABLE HLAT
+A19F YI SYLLABLE HLAX
+A1A0 YI SYLLABLE HLA
+A1A1 YI SYLLABLE HLAP
+A1A2 YI SYLLABLE HLUOX
+A1A3 YI SYLLABLE HLUO
+A1A4 YI SYLLABLE HLUOP
+A1A5 YI SYLLABLE HLOX
+A1A6 YI SYLLABLE HLO
+A1A7 YI SYLLABLE HLOP
+A1A8 YI SYLLABLE HLEX
+A1A9 YI SYLLABLE HLE
+A1AA YI SYLLABLE HLEP
+A1AB YI SYLLABLE HLUT
+A1AC YI SYLLABLE HLUX
+A1AD YI SYLLABLE HLU
+A1AE YI SYLLABLE HLUP
+A1AF YI SYLLABLE HLURX
+A1B0 YI SYLLABLE HLUR
+A1B1 YI SYLLABLE HLYT
+A1B2 YI SYLLABLE HLYX
+A1B3 YI SYLLABLE HLY
+A1B4 YI SYLLABLE HLYP
+A1B5 YI SYLLABLE HLYRX
+A1B6 YI SYLLABLE HLYR
+A1B7 YI SYLLABLE LIT
+A1B8 YI SYLLABLE LIX
+A1B9 YI SYLLABLE LI
+A1BA YI SYLLABLE LIP
+A1BB YI SYLLABLE LIET
+A1BC YI SYLLABLE LIEX
+A1BD YI SYLLABLE LIE
+A1BE YI SYLLABLE LIEP
+A1BF YI SYLLABLE LAT
+A1C0 YI SYLLABLE LAX
+A1C1 YI SYLLABLE LA
+A1C2 YI SYLLABLE LAP
+A1C3 YI SYLLABLE LUOT
+A1C4 YI SYLLABLE LUOX
+A1C5 YI SYLLABLE LUO
+A1C6 YI SYLLABLE LUOP
+A1C7 YI SYLLABLE LOT
+A1C8 YI SYLLABLE LOX
+A1C9 YI SYLLABLE LO
+A1CA YI SYLLABLE LOP
+A1CB YI SYLLABLE LEX
+A1CC YI SYLLABLE LE
+A1CD YI SYLLABLE LEP
+A1CE YI SYLLABLE LUT
+A1CF YI SYLLABLE LUX
+A1D0 YI SYLLABLE LU
+A1D1 YI SYLLABLE LUP
+A1D2 YI SYLLABLE LURX
+A1D3 YI SYLLABLE LUR
+A1D4 YI SYLLABLE LYT
+A1D5 YI SYLLABLE LYX
+A1D6 YI SYLLABLE LY
+A1D7 YI SYLLABLE LYP
+A1D8 YI SYLLABLE LYRX
+A1D9 YI SYLLABLE LYR
+A1DA YI SYLLABLE GIT
+A1DB YI SYLLABLE GIX
+A1DC YI SYLLABLE GI
+A1DD YI SYLLABLE GIP
+A1DE YI SYLLABLE GIET
+A1DF YI SYLLABLE GIEX
+A1E0 YI SYLLABLE GIE
+A1E1 YI SYLLABLE GIEP
+A1E2 YI SYLLABLE GAT
+A1E3 YI SYLLABLE GAX
+A1E4 YI SYLLABLE GA
+A1E5 YI SYLLABLE GAP
+A1E6 YI SYLLABLE GUOT
+A1E7 YI SYLLABLE GUOX
+A1E8 YI SYLLABLE GUO
+A1E9 YI SYLLABLE GUOP
+A1EA YI SYLLABLE GOT
+A1EB YI SYLLABLE GOX
+A1EC YI SYLLABLE GO
+A1ED YI SYLLABLE GOP
+A1EE YI SYLLABLE GET
+A1EF YI SYLLABLE GEX
+A1F0 YI SYLLABLE GE
+A1F1 YI SYLLABLE GEP
+A1F2 YI SYLLABLE GUT
+A1F3 YI SYLLABLE GUX
+A1F4 YI SYLLABLE GU
+A1F5 YI SYLLABLE GUP
+A1F6 YI SYLLABLE GURX
+A1F7 YI SYLLABLE GUR
+A1F8 YI SYLLABLE KIT
+A1F9 YI SYLLABLE KIX
+A1FA YI SYLLABLE KI
+A1FB YI SYLLABLE KIP
+A1FC YI SYLLABLE KIEX
+A1FD YI SYLLABLE KIE
+A1FE YI SYLLABLE KIEP
+A1FF YI SYLLABLE KAT
+A200 YI SYLLABLE KAX
+A201 YI SYLLABLE KA
+A202 YI SYLLABLE KAP
+A203 YI SYLLABLE KUOX
+A204 YI SYLLABLE KUO
+A205 YI SYLLABLE KUOP
+A206 YI SYLLABLE KOT
+A207 YI SYLLABLE KOX
+A208 YI SYLLABLE KO
+A209 YI SYLLABLE KOP
+A20A YI SYLLABLE KET
+A20B YI SYLLABLE KEX
+A20C YI SYLLABLE KE
+A20D YI SYLLABLE KEP
+A20E YI SYLLABLE KUT
+A20F YI SYLLABLE KUX
+A210 YI SYLLABLE KU
+A211 YI SYLLABLE KUP
+A212 YI SYLLABLE KURX
+A213 YI SYLLABLE KUR
+A214 YI SYLLABLE GGIT
+A215 YI SYLLABLE GGIX
+A216 YI SYLLABLE GGI
+A217 YI SYLLABLE GGIEX
+A218 YI SYLLABLE GGIE
+A219 YI SYLLABLE GGIEP
+A21A YI SYLLABLE GGAT
+A21B YI SYLLABLE GGAX
+A21C YI SYLLABLE GGA
+A21D YI SYLLABLE GGAP
+A21E YI SYLLABLE GGUOT
+A21F YI SYLLABLE GGUOX
+A220 YI SYLLABLE GGUO
+A221 YI SYLLABLE GGUOP
+A222 YI SYLLABLE GGOT
+A223 YI SYLLABLE GGOX
+A224 YI SYLLABLE GGO
+A225 YI SYLLABLE GGOP
+A226 YI SYLLABLE GGET
+A227 YI SYLLABLE GGEX
+A228 YI SYLLABLE GGE
+A229 YI SYLLABLE GGEP
+A22A YI SYLLABLE GGUT
+A22B YI SYLLABLE GGUX
+A22C YI SYLLABLE GGU
+A22D YI SYLLABLE GGUP
+A22E YI SYLLABLE GGURX
+A22F YI SYLLABLE GGUR
+A230 YI SYLLABLE MGIEX
+A231 YI SYLLABLE MGIE
+A232 YI SYLLABLE MGAT
+A233 YI SYLLABLE MGAX
+A234 YI SYLLABLE MGA
+A235 YI SYLLABLE MGAP
+A236 YI SYLLABLE MGUOX
+A237 YI SYLLABLE MGUO
+A238 YI SYLLABLE MGUOP
+A239 YI SYLLABLE MGOT
+A23A YI SYLLABLE MGOX
+A23B YI SYLLABLE MGO
+A23C YI SYLLABLE MGOP
+A23D YI SYLLABLE MGEX
+A23E YI SYLLABLE MGE
+A23F YI SYLLABLE MGEP
+A240 YI SYLLABLE MGUT
+A241 YI SYLLABLE MGUX
+A242 YI SYLLABLE MGU
+A243 YI SYLLABLE MGUP
+A244 YI SYLLABLE MGURX
+A245 YI SYLLABLE MGUR
+A246 YI SYLLABLE HXIT
+A247 YI SYLLABLE HXIX
+A248 YI SYLLABLE HXI
+A249 YI SYLLABLE HXIP
+A24A YI SYLLABLE HXIET
+A24B YI SYLLABLE HXIEX
+A24C YI SYLLABLE HXIE
+A24D YI SYLLABLE HXIEP
+A24E YI SYLLABLE HXAT
+A24F YI SYLLABLE HXAX
+A250 YI SYLLABLE HXA
+A251 YI SYLLABLE HXAP
+A252 YI SYLLABLE HXUOT
+A253 YI SYLLABLE HXUOX
+A254 YI SYLLABLE HXUO
+A255 YI SYLLABLE HXUOP
+A256 YI SYLLABLE HXOT
+A257 YI SYLLABLE HXOX
+A258 YI SYLLABLE HXO
+A259 YI SYLLABLE HXOP
+A25A YI SYLLABLE HXEX
+A25B YI SYLLABLE HXE
+A25C YI SYLLABLE HXEP
+A25D YI SYLLABLE NGIEX
+A25E YI SYLLABLE NGIE
+A25F YI SYLLABLE NGIEP
+A260 YI SYLLABLE NGAT
+A261 YI SYLLABLE NGAX
+A262 YI SYLLABLE NGA
+A263 YI SYLLABLE NGAP
+A264 YI SYLLABLE NGUOT
+A265 YI SYLLABLE NGUOX
+A266 YI SYLLABLE NGUO
+A267 YI SYLLABLE NGOT
+A268 YI SYLLABLE NGOX
+A269 YI SYLLABLE NGO
+A26A YI SYLLABLE NGOP
+A26B YI SYLLABLE NGEX
+A26C YI SYLLABLE NGE
+A26D YI SYLLABLE NGEP
+A26E YI SYLLABLE HIT
+A26F YI SYLLABLE HIEX
+A270 YI SYLLABLE HIE
+A271 YI SYLLABLE HAT
+A272 YI SYLLABLE HAX
+A273 YI SYLLABLE HA
+A274 YI SYLLABLE HAP
+A275 YI SYLLABLE HUOT
+A276 YI SYLLABLE HUOX
+A277 YI SYLLABLE HUO
+A278 YI SYLLABLE HUOP
+A279 YI SYLLABLE HOT
+A27A YI SYLLABLE HOX
+A27B YI SYLLABLE HO
+A27C YI SYLLABLE HOP
+A27D YI SYLLABLE HEX
+A27E YI SYLLABLE HE
+A27F YI SYLLABLE HEP
+A280 YI SYLLABLE WAT
+A281 YI SYLLABLE WAX
+A282 YI SYLLABLE WA
+A283 YI SYLLABLE WAP
+A284 YI SYLLABLE WUOX
+A285 YI SYLLABLE WUO
+A286 YI SYLLABLE WUOP
+A287 YI SYLLABLE WOX
+A288 YI SYLLABLE WO
+A289 YI SYLLABLE WOP
+A28A YI SYLLABLE WEX
+A28B YI SYLLABLE WE
+A28C YI SYLLABLE WEP
+A28D YI SYLLABLE ZIT
+A28E YI SYLLABLE ZIX
+A28F YI SYLLABLE ZI
+A290 YI SYLLABLE ZIP
+A291 YI SYLLABLE ZIEX
+A292 YI SYLLABLE ZIE
+A293 YI SYLLABLE ZIEP
+A294 YI SYLLABLE ZAT
+A295 YI SYLLABLE ZAX
+A296 YI SYLLABLE ZA
+A297 YI SYLLABLE ZAP
+A298 YI SYLLABLE ZUOX
+A299 YI SYLLABLE ZUO
+A29A YI SYLLABLE ZUOP
+A29B YI SYLLABLE ZOT
+A29C YI SYLLABLE ZOX
+A29D YI SYLLABLE ZO
+A29E YI SYLLABLE ZOP
+A29F YI SYLLABLE ZEX
+A2A0 YI SYLLABLE ZE
+A2A1 YI SYLLABLE ZEP
+A2A2 YI SYLLABLE ZUT
+A2A3 YI SYLLABLE ZUX
+A2A4 YI SYLLABLE ZU
+A2A5 YI SYLLABLE ZUP
+A2A6 YI SYLLABLE ZURX
+A2A7 YI SYLLABLE ZUR
+A2A8 YI SYLLABLE ZYT
+A2A9 YI SYLLABLE ZYX
+A2AA YI SYLLABLE ZY
+A2AB YI SYLLABLE ZYP
+A2AC YI SYLLABLE ZYRX
+A2AD YI SYLLABLE ZYR
+A2AE YI SYLLABLE CIT
+A2AF YI SYLLABLE CIX
+A2B0 YI SYLLABLE CI
+A2B1 YI SYLLABLE CIP
+A2B2 YI SYLLABLE CIET
+A2B3 YI SYLLABLE CIEX
+A2B4 YI SYLLABLE CIE
+A2B5 YI SYLLABLE CIEP
+A2B6 YI SYLLABLE CAT
+A2B7 YI SYLLABLE CAX
+A2B8 YI SYLLABLE CA
+A2B9 YI SYLLABLE CAP
+A2BA YI SYLLABLE CUOX
+A2BB YI SYLLABLE CUO
+A2BC YI SYLLABLE CUOP
+A2BD YI SYLLABLE COT
+A2BE YI SYLLABLE COX
+A2BF YI SYLLABLE CO
+A2C0 YI SYLLABLE COP
+A2C1 YI SYLLABLE CEX
+A2C2 YI SYLLABLE CE
+A2C3 YI SYLLABLE CEP
+A2C4 YI SYLLABLE CUT
+A2C5 YI SYLLABLE CUX
+A2C6 YI SYLLABLE CU
+A2C7 YI SYLLABLE CUP
+A2C8 YI SYLLABLE CURX
+A2C9 YI SYLLABLE CUR
+A2CA YI SYLLABLE CYT
+A2CB YI SYLLABLE CYX
+A2CC YI SYLLABLE CY
+A2CD YI SYLLABLE CYP
+A2CE YI SYLLABLE CYRX
+A2CF YI SYLLABLE CYR
+A2D0 YI SYLLABLE ZZIT
+A2D1 YI SYLLABLE ZZIX
+A2D2 YI SYLLABLE ZZI
+A2D3 YI SYLLABLE ZZIP
+A2D4 YI SYLLABLE ZZIET
+A2D5 YI SYLLABLE ZZIEX
+A2D6 YI SYLLABLE ZZIE
+A2D7 YI SYLLABLE ZZIEP
+A2D8 YI SYLLABLE ZZAT
+A2D9 YI SYLLABLE ZZAX
+A2DA YI SYLLABLE ZZA
+A2DB YI SYLLABLE ZZAP
+A2DC YI SYLLABLE ZZOX
+A2DD YI SYLLABLE ZZO
+A2DE YI SYLLABLE ZZOP
+A2DF YI SYLLABLE ZZEX
+A2E0 YI SYLLABLE ZZE
+A2E1 YI SYLLABLE ZZEP
+A2E2 YI SYLLABLE ZZUX
+A2E3 YI SYLLABLE ZZU
+A2E4 YI SYLLABLE ZZUP
+A2E5 YI SYLLABLE ZZURX
+A2E6 YI SYLLABLE ZZUR
+A2E7 YI SYLLABLE ZZYT
+A2E8 YI SYLLABLE ZZYX
+A2E9 YI SYLLABLE ZZY
+A2EA YI SYLLABLE ZZYP
+A2EB YI SYLLABLE ZZYRX
+A2EC YI SYLLABLE ZZYR
+A2ED YI SYLLABLE NZIT
+A2EE YI SYLLABLE NZIX
+A2EF YI SYLLABLE NZI
+A2F0 YI SYLLABLE NZIP
+A2F1 YI SYLLABLE NZIEX
+A2F2 YI SYLLABLE NZIE
+A2F3 YI SYLLABLE NZIEP
+A2F4 YI SYLLABLE NZAT
+A2F5 YI SYLLABLE NZAX
+A2F6 YI SYLLABLE NZA
+A2F7 YI SYLLABLE NZAP
+A2F8 YI SYLLABLE NZUOX
+A2F9 YI SYLLABLE NZUO
+A2FA YI SYLLABLE NZOX
+A2FB YI SYLLABLE NZOP
+A2FC YI SYLLABLE NZEX
+A2FD YI SYLLABLE NZE
+A2FE YI SYLLABLE NZUX
+A2FF YI SYLLABLE NZU
+A300 YI SYLLABLE NZUP
+A301 YI SYLLABLE NZURX
+A302 YI SYLLABLE NZUR
+A303 YI SYLLABLE NZYT
+A304 YI SYLLABLE NZYX
+A305 YI SYLLABLE NZY
+A306 YI SYLLABLE NZYP
+A307 YI SYLLABLE NZYRX
+A308 YI SYLLABLE NZYR
+A309 YI SYLLABLE SIT
+A30A YI SYLLABLE SIX
+A30B YI SYLLABLE SI
+A30C YI SYLLABLE SIP
+A30D YI SYLLABLE SIEX
+A30E YI SYLLABLE SIE
+A30F YI SYLLABLE SIEP
+A310 YI SYLLABLE SAT
+A311 YI SYLLABLE SAX
+A312 YI SYLLABLE SA
+A313 YI SYLLABLE SAP
+A314 YI SYLLABLE SUOX
+A315 YI SYLLABLE SUO
+A316 YI SYLLABLE SUOP
+A317 YI SYLLABLE SOT
+A318 YI SYLLABLE SOX
+A319 YI SYLLABLE SO
+A31A YI SYLLABLE SOP
+A31B YI SYLLABLE SEX
+A31C YI SYLLABLE SE
+A31D YI SYLLABLE SEP
+A31E YI SYLLABLE SUT
+A31F YI SYLLABLE SUX
+A320 YI SYLLABLE SU
+A321 YI SYLLABLE SUP
+A322 YI SYLLABLE SURX
+A323 YI SYLLABLE SUR
+A324 YI SYLLABLE SYT
+A325 YI SYLLABLE SYX
+A326 YI SYLLABLE SY
+A327 YI SYLLABLE SYP
+A328 YI SYLLABLE SYRX
+A329 YI SYLLABLE SYR
+A32A YI SYLLABLE SSIT
+A32B YI SYLLABLE SSIX
+A32C YI SYLLABLE SSI
+A32D YI SYLLABLE SSIP
+A32E YI SYLLABLE SSIEX
+A32F YI SYLLABLE SSIE
+A330 YI SYLLABLE SSIEP
+A331 YI SYLLABLE SSAT
+A332 YI SYLLABLE SSAX
+A333 YI SYLLABLE SSA
+A334 YI SYLLABLE SSAP
+A335 YI SYLLABLE SSOT
+A336 YI SYLLABLE SSOX
+A337 YI SYLLABLE SSO
+A338 YI SYLLABLE SSOP
+A339 YI SYLLABLE SSEX
+A33A YI SYLLABLE SSE
+A33B YI SYLLABLE SSEP
+A33C YI SYLLABLE SSUT
+A33D YI SYLLABLE SSUX
+A33E YI SYLLABLE SSU
+A33F YI SYLLABLE SSUP
+A340 YI SYLLABLE SSYT
+A341 YI SYLLABLE SSYX
+A342 YI SYLLABLE SSY
+A343 YI SYLLABLE SSYP
+A344 YI SYLLABLE SSYRX
+A345 YI SYLLABLE SSYR
+A346 YI SYLLABLE ZHAT
+A347 YI SYLLABLE ZHAX
+A348 YI SYLLABLE ZHA
+A349 YI SYLLABLE ZHAP
+A34A YI SYLLABLE ZHUOX
+A34B YI SYLLABLE ZHUO
+A34C YI SYLLABLE ZHUOP
+A34D YI SYLLABLE ZHOT
+A34E YI SYLLABLE ZHOX
+A34F YI SYLLABLE ZHO
+A350 YI SYLLABLE ZHOP
+A351 YI SYLLABLE ZHET
+A352 YI SYLLABLE ZHEX
+A353 YI SYLLABLE ZHE
+A354 YI SYLLABLE ZHEP
+A355 YI SYLLABLE ZHUT
+A356 YI SYLLABLE ZHUX
+A357 YI SYLLABLE ZHU
+A358 YI SYLLABLE ZHUP
+A359 YI SYLLABLE ZHURX
+A35A YI SYLLABLE ZHUR
+A35B YI SYLLABLE ZHYT
+A35C YI SYLLABLE ZHYX
+A35D YI SYLLABLE ZHY
+A35E YI SYLLABLE ZHYP
+A35F YI SYLLABLE ZHYRX
+A360 YI SYLLABLE ZHYR
+A361 YI SYLLABLE CHAT
+A362 YI SYLLABLE CHAX
+A363 YI SYLLABLE CHA
+A364 YI SYLLABLE CHAP
+A365 YI SYLLABLE CHUOT
+A366 YI SYLLABLE CHUOX
+A367 YI SYLLABLE CHUO
+A368 YI SYLLABLE CHUOP
+A369 YI SYLLABLE CHOT
+A36A YI SYLLABLE CHOX
+A36B YI SYLLABLE CHO
+A36C YI SYLLABLE CHOP
+A36D YI SYLLABLE CHET
+A36E YI SYLLABLE CHEX
+A36F YI SYLLABLE CHE
+A370 YI SYLLABLE CHEP
+A371 YI SYLLABLE CHUX
+A372 YI SYLLABLE CHU
+A373 YI SYLLABLE CHUP
+A374 YI SYLLABLE CHURX
+A375 YI SYLLABLE CHUR
+A376 YI SYLLABLE CHYT
+A377 YI SYLLABLE CHYX
+A378 YI SYLLABLE CHY
+A379 YI SYLLABLE CHYP
+A37A YI SYLLABLE CHYRX
+A37B YI SYLLABLE CHYR
+A37C YI SYLLABLE RRAX
+A37D YI SYLLABLE RRA
+A37E YI SYLLABLE RRUOX
+A37F YI SYLLABLE RRUO
+A380 YI SYLLABLE RROT
+A381 YI SYLLABLE RROX
+A382 YI SYLLABLE RRO
+A383 YI SYLLABLE RROP
+A384 YI SYLLABLE RRET
+A385 YI SYLLABLE RREX
+A386 YI SYLLABLE RRE
+A387 YI SYLLABLE RREP
+A388 YI SYLLABLE RRUT
+A389 YI SYLLABLE RRUX
+A38A YI SYLLABLE RRU
+A38B YI SYLLABLE RRUP
+A38C YI SYLLABLE RRURX
+A38D YI SYLLABLE RRUR
+A38E YI SYLLABLE RRYT
+A38F YI SYLLABLE RRYX
+A390 YI SYLLABLE RRY
+A391 YI SYLLABLE RRYP
+A392 YI SYLLABLE RRYRX
+A393 YI SYLLABLE RRYR
+A394 YI SYLLABLE NRAT
+A395 YI SYLLABLE NRAX
+A396 YI SYLLABLE NRA
+A397 YI SYLLABLE NRAP
+A398 YI SYLLABLE NROX
+A399 YI SYLLABLE NRO
+A39A YI SYLLABLE NROP
+A39B YI SYLLABLE NRET
+A39C YI SYLLABLE NREX
+A39D YI SYLLABLE NRE
+A39E YI SYLLABLE NREP
+A39F YI SYLLABLE NRUT
+A3A0 YI SYLLABLE NRUX
+A3A1 YI SYLLABLE NRU
+A3A2 YI SYLLABLE NRUP
+A3A3 YI SYLLABLE NRURX
+A3A4 YI SYLLABLE NRUR
+A3A5 YI SYLLABLE NRYT
+A3A6 YI SYLLABLE NRYX
+A3A7 YI SYLLABLE NRY
+A3A8 YI SYLLABLE NRYP
+A3A9 YI SYLLABLE NRYRX
+A3AA YI SYLLABLE NRYR
+A3AB YI SYLLABLE SHAT
+A3AC YI SYLLABLE SHAX
+A3AD YI SYLLABLE SHA
+A3AE YI SYLLABLE SHAP
+A3AF YI SYLLABLE SHUOX
+A3B0 YI SYLLABLE SHUO
+A3B1 YI SYLLABLE SHUOP
+A3B2 YI SYLLABLE SHOT
+A3B3 YI SYLLABLE SHOX
+A3B4 YI SYLLABLE SHO
+A3B5 YI SYLLABLE SHOP
+A3B6 YI SYLLABLE SHET
+A3B7 YI SYLLABLE SHEX
+A3B8 YI SYLLABLE SHE
+A3B9 YI SYLLABLE SHEP
+A3BA YI SYLLABLE SHUT
+A3BB YI SYLLABLE SHUX
+A3BC YI SYLLABLE SHU
+A3BD YI SYLLABLE SHUP
+A3BE YI SYLLABLE SHURX
+A3BF YI SYLLABLE SHUR
+A3C0 YI SYLLABLE SHYT
+A3C1 YI SYLLABLE SHYX
+A3C2 YI SYLLABLE SHY
+A3C3 YI SYLLABLE SHYP
+A3C4 YI SYLLABLE SHYRX
+A3C5 YI SYLLABLE SHYR
+A3C6 YI SYLLABLE RAT
+A3C7 YI SYLLABLE RAX
+A3C8 YI SYLLABLE RA
+A3C9 YI SYLLABLE RAP
+A3CA YI SYLLABLE RUOX
+A3CB YI SYLLABLE RUO
+A3CC YI SYLLABLE RUOP
+A3CD YI SYLLABLE ROT
+A3CE YI SYLLABLE ROX
+A3CF YI SYLLABLE RO
+A3D0 YI SYLLABLE ROP
+A3D1 YI SYLLABLE REX
+A3D2 YI SYLLABLE RE
+A3D3 YI SYLLABLE REP
+A3D4 YI SYLLABLE RUT
+A3D5 YI SYLLABLE RUX
+A3D6 YI SYLLABLE RU
+A3D7 YI SYLLABLE RUP
+A3D8 YI SYLLABLE RURX
+A3D9 YI SYLLABLE RUR
+A3DA YI SYLLABLE RYT
+A3DB YI SYLLABLE RYX
+A3DC YI SYLLABLE RY
+A3DD YI SYLLABLE RYP
+A3DE YI SYLLABLE RYRX
+A3DF YI SYLLABLE RYR
+A3E0 YI SYLLABLE JIT
+A3E1 YI SYLLABLE JIX
+A3E2 YI SYLLABLE JI
+A3E3 YI SYLLABLE JIP
+A3E4 YI SYLLABLE JIET
+A3E5 YI SYLLABLE JIEX
+A3E6 YI SYLLABLE JIE
+A3E7 YI SYLLABLE JIEP
+A3E8 YI SYLLABLE JUOT
+A3E9 YI SYLLABLE JUOX
+A3EA YI SYLLABLE JUO
+A3EB YI SYLLABLE JUOP
+A3EC YI SYLLABLE JOT
+A3ED YI SYLLABLE JOX
+A3EE YI SYLLABLE JO
+A3EF YI SYLLABLE JOP
+A3F0 YI SYLLABLE JUT
+A3F1 YI SYLLABLE JUX
+A3F2 YI SYLLABLE JU
+A3F3 YI SYLLABLE JUP
+A3F4 YI SYLLABLE JURX
+A3F5 YI SYLLABLE JUR
+A3F6 YI SYLLABLE JYT
+A3F7 YI SYLLABLE JYX
+A3F8 YI SYLLABLE JY
+A3F9 YI SYLLABLE JYP
+A3FA YI SYLLABLE JYRX
+A3FB YI SYLLABLE JYR
+A3FC YI SYLLABLE QIT
+A3FD YI SYLLABLE QIX
+A3FE YI SYLLABLE QI
+A3FF YI SYLLABLE QIP
+A400 YI SYLLABLE QIET
+A401 YI SYLLABLE QIEX
+A402 YI SYLLABLE QIE
+A403 YI SYLLABLE QIEP
+A404 YI SYLLABLE QUOT
+A405 YI SYLLABLE QUOX
+A406 YI SYLLABLE QUO
+A407 YI SYLLABLE QUOP
+A408 YI SYLLABLE QOT
+A409 YI SYLLABLE QOX
+A40A YI SYLLABLE QO
+A40B YI SYLLABLE QOP
+A40C YI SYLLABLE QUT
+A40D YI SYLLABLE QUX
+A40E YI SYLLABLE QU
+A40F YI SYLLABLE QUP
+A410 YI SYLLABLE QURX
+A411 YI SYLLABLE QUR
+A412 YI SYLLABLE QYT
+A413 YI SYLLABLE QYX
+A414 YI SYLLABLE QY
+A415 YI SYLLABLE QYP
+A416 YI SYLLABLE QYRX
+A417 YI SYLLABLE QYR
+A418 YI SYLLABLE JJIT
+A419 YI SYLLABLE JJIX
+A41A YI SYLLABLE JJI
+A41B YI SYLLABLE JJIP
+A41C YI SYLLABLE JJIET
+A41D YI SYLLABLE JJIEX
+A41E YI SYLLABLE JJIE
+A41F YI SYLLABLE JJIEP
+A420 YI SYLLABLE JJUOX
+A421 YI SYLLABLE JJUO
+A422 YI SYLLABLE JJUOP
+A423 YI SYLLABLE JJOT
+A424 YI SYLLABLE JJOX
+A425 YI SYLLABLE JJO
+A426 YI SYLLABLE JJOP
+A427 YI SYLLABLE JJUT
+A428 YI SYLLABLE JJUX
+A429 YI SYLLABLE JJU
+A42A YI SYLLABLE JJUP
+A42B YI SYLLABLE JJURX
+A42C YI SYLLABLE JJUR
+A42D YI SYLLABLE JJYT
+A42E YI SYLLABLE JJYX
+A42F YI SYLLABLE JJY
+A430 YI SYLLABLE JJYP
+A431 YI SYLLABLE NJIT
+A432 YI SYLLABLE NJIX
+A433 YI SYLLABLE NJI
+A434 YI SYLLABLE NJIP
+A435 YI SYLLABLE NJIET
+A436 YI SYLLABLE NJIEX
+A437 YI SYLLABLE NJIE
+A438 YI SYLLABLE NJIEP
+A439 YI SYLLABLE NJUOX
+A43A YI SYLLABLE NJUO
+A43B YI SYLLABLE NJOT
+A43C YI SYLLABLE NJOX
+A43D YI SYLLABLE NJO
+A43E YI SYLLABLE NJOP
+A43F YI SYLLABLE NJUX
+A440 YI SYLLABLE NJU
+A441 YI SYLLABLE NJUP
+A442 YI SYLLABLE NJURX
+A443 YI SYLLABLE NJUR
+A444 YI SYLLABLE NJYT
+A445 YI SYLLABLE NJYX
+A446 YI SYLLABLE NJY
+A447 YI SYLLABLE NJYP
+A448 YI SYLLABLE NJYRX
+A449 YI SYLLABLE NJYR
+A44A YI SYLLABLE NYIT
+A44B YI SYLLABLE NYIX
+A44C YI SYLLABLE NYI
+A44D YI SYLLABLE NYIP
+A44E YI SYLLABLE NYIET
+A44F YI SYLLABLE NYIEX
+A450 YI SYLLABLE NYIE
+A451 YI SYLLABLE NYIEP
+A452 YI SYLLABLE NYUOX
+A453 YI SYLLABLE NYUO
+A454 YI SYLLABLE NYUOP
+A455 YI SYLLABLE NYOT
+A456 YI SYLLABLE NYOX
+A457 YI SYLLABLE NYO
+A458 YI SYLLABLE NYOP
+A459 YI SYLLABLE NYUT
+A45A YI SYLLABLE NYUX
+A45B YI SYLLABLE NYU
+A45C YI SYLLABLE NYUP
+A45D YI SYLLABLE XIT
+A45E YI SYLLABLE XIX
+A45F YI SYLLABLE XI
+A460 YI SYLLABLE XIP
+A461 YI SYLLABLE XIET
+A462 YI SYLLABLE XIEX
+A463 YI SYLLABLE XIE
+A464 YI SYLLABLE XIEP
+A465 YI SYLLABLE XUOX
+A466 YI SYLLABLE XUO
+A467 YI SYLLABLE XOT
+A468 YI SYLLABLE XOX
+A469 YI SYLLABLE XO
+A46A YI SYLLABLE XOP
+A46B YI SYLLABLE XYT
+A46C YI SYLLABLE XYX
+A46D YI SYLLABLE XY
+A46E YI SYLLABLE XYP
+A46F YI SYLLABLE XYRX
+A470 YI SYLLABLE XYR
+A471 YI SYLLABLE YIT
+A472 YI SYLLABLE YIX
+A473 YI SYLLABLE YI
+A474 YI SYLLABLE YIP
+A475 YI SYLLABLE YIET
+A476 YI SYLLABLE YIEX
+A477 YI SYLLABLE YIE
+A478 YI SYLLABLE YIEP
+A479 YI SYLLABLE YUOT
+A47A YI SYLLABLE YUOX
+A47B YI SYLLABLE YUO
+A47C YI SYLLABLE YUOP
+A47D YI SYLLABLE YOT
+A47E YI SYLLABLE YOX
+A47F YI SYLLABLE YO
+A480 YI SYLLABLE YOP
+A481 YI SYLLABLE YUT
+A482 YI SYLLABLE YUX
+A483 YI SYLLABLE YU
+A484 YI SYLLABLE YUP
+A485 YI SYLLABLE YURX
+A486 YI SYLLABLE YUR
+A487 YI SYLLABLE YYT
+A488 YI SYLLABLE YYX
+A489 YI SYLLABLE YY
+A48A YI SYLLABLE YYP
+A48B YI SYLLABLE YYRX
+A48C YI SYLLABLE YYR
+A490 YI RADICAL QOT
+A491 YI RADICAL LI
+A492 YI RADICAL KIT
+A493 YI RADICAL NYIP
+A494 YI RADICAL CYP
+A495 YI RADICAL SSI
+A496 YI RADICAL GGOP
+A497 YI RADICAL GEP
+A498 YI RADICAL MI
+A499 YI RADICAL HXIT
+A49A YI RADICAL LYR
+A49B YI RADICAL BBUT
+A49C YI RADICAL MOP
+A49D YI RADICAL YO
+A49E YI RADICAL PUT
+A49F YI RADICAL HXUO
+A4A0 YI RADICAL TAT
+A4A1 YI RADICAL GA
+A4A2 YI RADICAL ZUP
+A4A3 YI RADICAL CYT
+A4A4 YI RADICAL DDUR
+A4A5 YI RADICAL BUR
+A4A6 YI RADICAL GGUO
+A4A7 YI RADICAL NYOP
+A4A8 YI RADICAL TU
+A4A9 YI RADICAL OP
+A4AA YI RADICAL JJUT
+A4AB YI RADICAL ZOT
+A4AC YI RADICAL PYT
+A4AD YI RADICAL HMO
+A4AE YI RADICAL YIT
+A4AF YI RADICAL VUR
+A4B0 YI RADICAL SHY
+A4B1 YI RADICAL VEP
+A4B2 YI RADICAL ZA
+A4B3 YI RADICAL JO
+A4B4 YI RADICAL NZUP
+A4B5 YI RADICAL JJY
+A4B6 YI RADICAL GOT
+A4B7 YI RADICAL JJIE
+A4B8 YI RADICAL WO
+A4B9 YI RADICAL DU
+A4BA YI RADICAL SHUR
+A4BB YI RADICAL LIE
+A4BC YI RADICAL CY
+A4BD YI RADICAL CUOP
+A4BE YI RADICAL CIP
+A4BF YI RADICAL HXOP
+A4C0 YI RADICAL SHAT
+A4C1 YI RADICAL ZUR
+A4C2 YI RADICAL SHOP
+A4C3 YI RADICAL CHE
+A4C4 YI RADICAL ZZIET
+A4C5 YI RADICAL NBIE
+A4C6 YI RADICAL KE
+A500 VAI SYLLABLE EE
+A501 VAI SYLLABLE EEN
+A502 VAI SYLLABLE HEE
+A503 VAI SYLLABLE WEE
+A504 VAI SYLLABLE WEEN
+A505 VAI SYLLABLE PEE
+A506 VAI SYLLABLE BHEE
+A507 VAI SYLLABLE BEE
+A508 VAI SYLLABLE MBEE
+A509 VAI SYLLABLE KPEE
+A50A VAI SYLLABLE MGBEE
+A50B VAI SYLLABLE GBEE
+A50C VAI SYLLABLE FEE
+A50D VAI SYLLABLE VEE
+A50E VAI SYLLABLE TEE
+A50F VAI SYLLABLE THEE
+A510 VAI SYLLABLE DHEE
+A511 VAI SYLLABLE DHHEE
+A512 VAI SYLLABLE LEE
+A513 VAI SYLLABLE REE
+A514 VAI SYLLABLE DEE
+A515 VAI SYLLABLE NDEE
+A516 VAI SYLLABLE SEE
+A517 VAI SYLLABLE SHEE
+A518 VAI SYLLABLE ZEE
+A519 VAI SYLLABLE ZHEE
+A51A VAI SYLLABLE CEE
+A51B VAI SYLLABLE JEE
+A51C VAI SYLLABLE NJEE
+A51D VAI SYLLABLE YEE
+A51E VAI SYLLABLE KEE
+A51F VAI SYLLABLE NGGEE
+A520 VAI SYLLABLE GEE
+A521 VAI SYLLABLE MEE
+A522 VAI SYLLABLE NEE
+A523 VAI SYLLABLE NYEE
+A524 VAI SYLLABLE I
+A525 VAI SYLLABLE IN
+A526 VAI SYLLABLE HI
+A527 VAI SYLLABLE HIN
+A528 VAI SYLLABLE WI
+A529 VAI SYLLABLE WIN
+A52A VAI SYLLABLE PI
+A52B VAI SYLLABLE BHI
+A52C VAI SYLLABLE BI
+A52D VAI SYLLABLE MBI
+A52E VAI SYLLABLE KPI
+A52F VAI SYLLABLE MGBI
+A530 VAI SYLLABLE GBI
+A531 VAI SYLLABLE FI
+A532 VAI SYLLABLE VI
+A533 VAI SYLLABLE TI
+A534 VAI SYLLABLE THI
+A535 VAI SYLLABLE DHI
+A536 VAI SYLLABLE DHHI
+A537 VAI SYLLABLE LI
+A538 VAI SYLLABLE RI
+A539 VAI SYLLABLE DI
+A53A VAI SYLLABLE NDI
+A53B VAI SYLLABLE SI
+A53C VAI SYLLABLE SHI
+A53D VAI SYLLABLE ZI
+A53E VAI SYLLABLE ZHI
+A53F VAI SYLLABLE CI
+A540 VAI SYLLABLE JI
+A541 VAI SYLLABLE NJI
+A542 VAI SYLLABLE YI
+A543 VAI SYLLABLE KI
+A544 VAI SYLLABLE NGGI
+A545 VAI SYLLABLE GI
+A546 VAI SYLLABLE MI
+A547 VAI SYLLABLE NI
+A548 VAI SYLLABLE NYI
+A549 VAI SYLLABLE A
+A54A VAI SYLLABLE AN
+A54B VAI SYLLABLE NGAN
+A54C VAI SYLLABLE HA
+A54D VAI SYLLABLE HAN
+A54E VAI SYLLABLE WA
+A54F VAI SYLLABLE WAN
+A550 VAI SYLLABLE PA
+A551 VAI SYLLABLE BHA
+A552 VAI SYLLABLE BA
+A553 VAI SYLLABLE MBA
+A554 VAI SYLLABLE KPA
+A555 VAI SYLLABLE KPAN
+A556 VAI SYLLABLE MGBA
+A557 VAI SYLLABLE GBA
+A558 VAI SYLLABLE FA
+A559 VAI SYLLABLE VA
+A55A VAI SYLLABLE TA
+A55B VAI SYLLABLE THA
+A55C VAI SYLLABLE DHA
+A55D VAI SYLLABLE DHHA
+A55E VAI SYLLABLE LA
+A55F VAI SYLLABLE RA
+A560 VAI SYLLABLE DA
+A561 VAI SYLLABLE NDA
+A562 VAI SYLLABLE SA
+A563 VAI SYLLABLE SHA
+A564 VAI SYLLABLE ZA
+A565 VAI SYLLABLE ZHA
+A566 VAI SYLLABLE CA
+A567 VAI SYLLABLE JA
+A568 VAI SYLLABLE NJA
+A569 VAI SYLLABLE YA
+A56A VAI SYLLABLE KA
+A56B VAI SYLLABLE KAN
+A56C VAI SYLLABLE NGGA
+A56D VAI SYLLABLE GA
+A56E VAI SYLLABLE MA
+A56F VAI SYLLABLE NA
+A570 VAI SYLLABLE NYA
+A571 VAI SYLLABLE OO
+A572 VAI SYLLABLE OON
+A573 VAI SYLLABLE HOO
+A574 VAI SYLLABLE WOO
+A575 VAI SYLLABLE WOON
+A576 VAI SYLLABLE POO
+A577 VAI SYLLABLE BHOO
+A578 VAI SYLLABLE BOO
+A579 VAI SYLLABLE MBOO
+A57A VAI SYLLABLE KPOO
+A57B VAI SYLLABLE MGBOO
+A57C VAI SYLLABLE GBOO
+A57D VAI SYLLABLE FOO
+A57E VAI SYLLABLE VOO
+A57F VAI SYLLABLE TOO
+A580 VAI SYLLABLE THOO
+A581 VAI SYLLABLE DHOO
+A582 VAI SYLLABLE DHHOO
+A583 VAI SYLLABLE LOO
+A584 VAI SYLLABLE ROO
+A585 VAI SYLLABLE DOO
+A586 VAI SYLLABLE NDOO
+A587 VAI SYLLABLE SOO
+A588 VAI SYLLABLE SHOO
+A589 VAI SYLLABLE ZOO
+A58A VAI SYLLABLE ZHOO
+A58B VAI SYLLABLE COO
+A58C VAI SYLLABLE JOO
+A58D VAI SYLLABLE NJOO
+A58E VAI SYLLABLE YOO
+A58F VAI SYLLABLE KOO
+A590 VAI SYLLABLE NGGOO
+A591 VAI SYLLABLE GOO
+A592 VAI SYLLABLE MOO
+A593 VAI SYLLABLE NOO
+A594 VAI SYLLABLE NYOO
+A595 VAI SYLLABLE U
+A596 VAI SYLLABLE UN
+A597 VAI SYLLABLE HU
+A598 VAI SYLLABLE HUN
+A599 VAI SYLLABLE WU
+A59A VAI SYLLABLE WUN
+A59B VAI SYLLABLE PU
+A59C VAI SYLLABLE BHU
+A59D VAI SYLLABLE BU
+A59E VAI SYLLABLE MBU
+A59F VAI SYLLABLE KPU
+A5A0 VAI SYLLABLE MGBU
+A5A1 VAI SYLLABLE GBU
+A5A2 VAI SYLLABLE FU
+A5A3 VAI SYLLABLE VU
+A5A4 VAI SYLLABLE TU
+A5A5 VAI SYLLABLE THU
+A5A6 VAI SYLLABLE DHU
+A5A7 VAI SYLLABLE DHHU
+A5A8 VAI SYLLABLE LU
+A5A9 VAI SYLLABLE RU
+A5AA VAI SYLLABLE DU
+A5AB VAI SYLLABLE NDU
+A5AC VAI SYLLABLE SU
+A5AD VAI SYLLABLE SHU
+A5AE VAI SYLLABLE ZU
+A5AF VAI SYLLABLE ZHU
+A5B0 VAI SYLLABLE CU
+A5B1 VAI SYLLABLE JU
+A5B2 VAI SYLLABLE NJU
+A5B3 VAI SYLLABLE YU
+A5B4 VAI SYLLABLE KU
+A5B5 VAI SYLLABLE NGGU
+A5B6 VAI SYLLABLE GU
+A5B7 VAI SYLLABLE MU
+A5B8 VAI SYLLABLE NU
+A5B9 VAI SYLLABLE NYU
+A5BA VAI SYLLABLE O
+A5BB VAI SYLLABLE ON
+A5BC VAI SYLLABLE NGON
+A5BD VAI SYLLABLE HO
+A5BE VAI SYLLABLE HON
+A5BF VAI SYLLABLE WO
+A5C0 VAI SYLLABLE WON
+A5C1 VAI SYLLABLE PO
+A5C2 VAI SYLLABLE BHO
+A5C3 VAI SYLLABLE BO
+A5C4 VAI SYLLABLE MBO
+A5C5 VAI SYLLABLE KPO
+A5C6 VAI SYLLABLE MGBO
+A5C7 VAI SYLLABLE GBO
+A5C8 VAI SYLLABLE GBON
+A5C9 VAI SYLLABLE FO
+A5CA VAI SYLLABLE VO
+A5CB VAI SYLLABLE TO
+A5CC VAI SYLLABLE THO
+A5CD VAI SYLLABLE DHO
+A5CE VAI SYLLABLE DHHO
+A5CF VAI SYLLABLE LO
+A5D0 VAI SYLLABLE RO
+A5D1 VAI SYLLABLE DO
+A5D2 VAI SYLLABLE NDO
+A5D3 VAI SYLLABLE SO
+A5D4 VAI SYLLABLE SHO
+A5D5 VAI SYLLABLE ZO
+A5D6 VAI SYLLABLE ZHO
+A5D7 VAI SYLLABLE CO
+A5D8 VAI SYLLABLE JO
+A5D9 VAI SYLLABLE NJO
+A5DA VAI SYLLABLE YO
+A5DB VAI SYLLABLE KO
+A5DC VAI SYLLABLE NGGO
+A5DD VAI SYLLABLE GO
+A5DE VAI SYLLABLE MO
+A5DF VAI SYLLABLE NO
+A5E0 VAI SYLLABLE NYO
+A5E1 VAI SYLLABLE E
+A5E2 VAI SYLLABLE EN
+A5E3 VAI SYLLABLE NGEN
+A5E4 VAI SYLLABLE HE
+A5E5 VAI SYLLABLE HEN
+A5E6 VAI SYLLABLE WE
+A5E7 VAI SYLLABLE WEN
+A5E8 VAI SYLLABLE PE
+A5E9 VAI SYLLABLE BHE
+A5EA VAI SYLLABLE BE
+A5EB VAI SYLLABLE MBE
+A5EC VAI SYLLABLE KPE
+A5ED VAI SYLLABLE KPEN
+A5EE VAI SYLLABLE MGBE
+A5EF VAI SYLLABLE GBE
+A5F0 VAI SYLLABLE GBEN
+A5F1 VAI SYLLABLE FE
+A5F2 VAI SYLLABLE VE
+A5F3 VAI SYLLABLE TE
+A5F4 VAI SYLLABLE THE
+A5F5 VAI SYLLABLE DHE
+A5F6 VAI SYLLABLE DHHE
+A5F7 VAI SYLLABLE LE
+A5F8 VAI SYLLABLE RE
+A5F9 VAI SYLLABLE DE
+A5FA VAI SYLLABLE NDE
+A5FB VAI SYLLABLE SE
+A5FC VAI SYLLABLE SHE
+A5FD VAI SYLLABLE ZE
+A5FE VAI SYLLABLE ZHE
+A5FF VAI SYLLABLE CE
+A600 VAI SYLLABLE JE
+A601 VAI SYLLABLE NJE
+A602 VAI SYLLABLE YE
+A603 VAI SYLLABLE KE
+A604 VAI SYLLABLE NGGE
+A605 VAI SYLLABLE NGGEN
+A606 VAI SYLLABLE GE
+A607 VAI SYLLABLE GEN
+A608 VAI SYLLABLE ME
+A609 VAI SYLLABLE NE
+A60A VAI SYLLABLE NYE
+A60B VAI SYLLABLE NG
+A60C VAI SYLLABLE LENGTHENER
+A60D VAI COMMA
+A60E VAI FULL STOP
+A60F VAI QUESTION MARK
+A610 VAI SYLLABLE NDOLE FA
+A611 VAI SYLLABLE NDOLE KA
+A612 VAI SYLLABLE NDOLE SOO
+A613 VAI SYMBOL FEENG
+A614 VAI SYMBOL KEENG
+A615 VAI SYMBOL TING
+A616 VAI SYMBOL NII
+A617 VAI SYMBOL BANG
+A618 VAI SYMBOL FAA
+A619 VAI SYMBOL TAA
+A61A VAI SYMBOL DANG
+A61B VAI SYMBOL DOONG
+A61C VAI SYMBOL KUNG
+A61D VAI SYMBOL TONG
+A61E VAI SYMBOL DO-O
+A61F VAI SYMBOL JONG
+A620 VAI DIGIT ZERO
+A621 VAI DIGIT ONE
+A622 VAI DIGIT TWO
+A623 VAI DIGIT THREE
+A624 VAI DIGIT FOUR
+A625 VAI DIGIT FIVE
+A626 VAI DIGIT SIX
+A627 VAI DIGIT SEVEN
+A628 VAI DIGIT EIGHT
+A629 VAI DIGIT NINE
+A62A VAI SYLLABLE NDOLE MA
+A62B VAI SYLLABLE NDOLE DO
+A640 CYRILLIC CAPITAL LETTER ZEMLYA
+A641 CYRILLIC SMALL LETTER ZEMLYA
+A642 CYRILLIC CAPITAL LETTER DZELO
+A643 CYRILLIC SMALL LETTER DZELO
+A644 CYRILLIC CAPITAL LETTER REVERSED DZE
+A645 CYRILLIC SMALL LETTER REVERSED DZE
+A646 CYRILLIC CAPITAL LETTER IOTA
+A647 CYRILLIC SMALL LETTER IOTA
+A648 CYRILLIC CAPITAL LETTER DJERV
+A649 CYRILLIC SMALL LETTER DJERV
+A64A CYRILLIC CAPITAL LETTER MONOGRAPH UK
+A64B CYRILLIC SMALL LETTER MONOGRAPH UK
+A64C CYRILLIC CAPITAL LETTER BROAD OMEGA
+A64D CYRILLIC SMALL LETTER BROAD OMEGA
+A64E CYRILLIC CAPITAL LETTER NEUTRAL YER
+A64F CYRILLIC SMALL LETTER NEUTRAL YER
+A650 CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+A651 CYRILLIC SMALL LETTER YERU WITH BACK YER
+A652 CYRILLIC CAPITAL LETTER IOTIFIED YAT
+A653 CYRILLIC SMALL LETTER IOTIFIED YAT
+A654 CYRILLIC CAPITAL LETTER REVERSED YU
+A655 CYRILLIC SMALL LETTER REVERSED YU
+A656 CYRILLIC CAPITAL LETTER IOTIFIED A
+A657 CYRILLIC SMALL LETTER IOTIFIED A
+A658 CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+A659 CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+A65A CYRILLIC CAPITAL LETTER BLENDED YUS
+A65B CYRILLIC SMALL LETTER BLENDED YUS
+A65C CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+A65D CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+A65E CYRILLIC CAPITAL LETTER YN
+A65F CYRILLIC SMALL LETTER YN
+A662 CYRILLIC CAPITAL LETTER SOFT DE
+A663 CYRILLIC SMALL LETTER SOFT DE
+A664 CYRILLIC CAPITAL LETTER SOFT EL
+A665 CYRILLIC SMALL LETTER SOFT EL
+A666 CYRILLIC CAPITAL LETTER SOFT EM
+A667 CYRILLIC SMALL LETTER SOFT EM
+A668 CYRILLIC CAPITAL LETTER MONOCULAR O
+A669 CYRILLIC SMALL LETTER MONOCULAR O
+A66A CYRILLIC CAPITAL LETTER BINOCULAR O
+A66B CYRILLIC SMALL LETTER BINOCULAR O
+A66C CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+A66D CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E CYRILLIC LETTER MULTIOCULAR O
+A66F COMBINING CYRILLIC VZMET
+A670 COMBINING CYRILLIC TEN MILLIONS SIGN
+A671 COMBINING CYRILLIC HUNDRED MILLIONS SIGN
+A672 COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A673 SLAVONIC ASTERISK
+A67C COMBINING CYRILLIC KAVYKA
+A67D COMBINING CYRILLIC PAYEROK
+A67E CYRILLIC KAVYKA
+A67F CYRILLIC PAYEROK
+A680 CYRILLIC CAPITAL LETTER DWE
+A681 CYRILLIC SMALL LETTER DWE
+A682 CYRILLIC CAPITAL LETTER DZWE
+A683 CYRILLIC SMALL LETTER DZWE
+A684 CYRILLIC CAPITAL LETTER ZHWE
+A685 CYRILLIC SMALL LETTER ZHWE
+A686 CYRILLIC CAPITAL LETTER CCHE
+A687 CYRILLIC SMALL LETTER CCHE
+A688 CYRILLIC CAPITAL LETTER DZZE
+A689 CYRILLIC SMALL LETTER DZZE
+A68A CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+A68B CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+A68C CYRILLIC CAPITAL LETTER TWE
+A68D CYRILLIC SMALL LETTER TWE
+A68E CYRILLIC CAPITAL LETTER TSWE
+A68F CYRILLIC SMALL LETTER TSWE
+A690 CYRILLIC CAPITAL LETTER TSSE
+A691 CYRILLIC SMALL LETTER TSSE
+A692 CYRILLIC CAPITAL LETTER TCHE
+A693 CYRILLIC SMALL LETTER TCHE
+A694 CYRILLIC CAPITAL LETTER HWE
+A695 CYRILLIC SMALL LETTER HWE
+A696 CYRILLIC CAPITAL LETTER SHWE
+A697 CYRILLIC SMALL LETTER SHWE
+A700 MODIFIER LETTER CHINESE TONE YIN PING
+A701 MODIFIER LETTER CHINESE TONE YANG PING
+A702 MODIFIER LETTER CHINESE TONE YIN SHANG
+A703 MODIFIER LETTER CHINESE TONE YANG SHANG
+A704 MODIFIER LETTER CHINESE TONE YIN QU
+A705 MODIFIER LETTER CHINESE TONE YANG QU
+A706 MODIFIER LETTER CHINESE TONE YIN RU
+A707 MODIFIER LETTER CHINESE TONE YANG RU
+A708 MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR
+A709 MODIFIER LETTER HIGH DOTTED TONE BAR
+A70A MODIFIER LETTER MID DOTTED TONE BAR
+A70B MODIFIER LETTER LOW DOTTED TONE BAR
+A70C MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR
+A70D MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR
+A70E MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR
+A70F MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR
+A710 MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR
+A711 MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR
+A712 MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR
+A713 MODIFIER LETTER HIGH LEFT-STEM TONE BAR
+A714 MODIFIER LETTER MID LEFT-STEM TONE BAR
+A715 MODIFIER LETTER LOW LEFT-STEM TONE BAR
+A716 MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717 MODIFIER LETTER DOT VERTICAL BAR
+A718 MODIFIER LETTER DOT SLASH
+A719 MODIFIER LETTER DOT HORIZONTAL BAR
+A71A MODIFIER LETTER LOWER RIGHT CORNER ANGLE
+A71B MODIFIER LETTER RAISED UP ARROW
+A71C MODIFIER LETTER RAISED DOWN ARROW
+A71D MODIFIER LETTER RAISED EXCLAMATION MARK
+A71E MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK
+A71F MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720 MODIFIER LETTER STRESS AND HIGH TONE
+A721 MODIFIER LETTER STRESS AND LOW TONE
+A722 LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+A723 LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+A724 LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+A725 LATIN SMALL LETTER EGYPTOLOGICAL AIN
+A726 LATIN CAPITAL LETTER HENG
+A727 LATIN SMALL LETTER HENG
+A728 LATIN CAPITAL LETTER TZ
+A729 LATIN SMALL LETTER TZ
+A72A LATIN CAPITAL LETTER TRESILLO
+A72B LATIN SMALL LETTER TRESILLO
+A72C LATIN CAPITAL LETTER CUATRILLO
+A72D LATIN SMALL LETTER CUATRILLO
+A72E LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+A72F LATIN SMALL LETTER CUATRILLO WITH COMMA
+A730 LATIN LETTER SMALL CAPITAL F
+A731 LATIN LETTER SMALL CAPITAL S
+A732 LATIN CAPITAL LETTER AA
+A733 LATIN SMALL LETTER AA
+A734 LATIN CAPITAL LETTER AO
+A735 LATIN SMALL LETTER AO
+A736 LATIN CAPITAL LETTER AU
+A737 LATIN SMALL LETTER AU
+A738 LATIN CAPITAL LETTER AV
+A739 LATIN SMALL LETTER AV
+A73A LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+A73B LATIN SMALL LETTER AV WITH HORIZONTAL BAR
+A73C LATIN CAPITAL LETTER AY
+A73D LATIN SMALL LETTER AY
+A73E LATIN CAPITAL LETTER REVERSED C WITH DOT
+A73F LATIN SMALL LETTER REVERSED C WITH DOT
+A740 LATIN CAPITAL LETTER K WITH STROKE
+A741 LATIN SMALL LETTER K WITH STROKE
+A742 LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+A743 LATIN SMALL LETTER K WITH DIAGONAL STROKE
+A744 LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+A745 LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+A746 LATIN CAPITAL LETTER BROKEN L
+A747 LATIN SMALL LETTER BROKEN L
+A748 LATIN CAPITAL LETTER L WITH HIGH STROKE
+A749 LATIN SMALL LETTER L WITH HIGH STROKE
+A74A LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+A74B LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+A74C LATIN CAPITAL LETTER O WITH LOOP
+A74D LATIN SMALL LETTER O WITH LOOP
+A74E LATIN CAPITAL LETTER OO
+A74F LATIN SMALL LETTER OO
+A750 LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+A751 LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+A752 LATIN CAPITAL LETTER P WITH FLOURISH
+A753 LATIN SMALL LETTER P WITH FLOURISH
+A754 LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+A755 LATIN SMALL LETTER P WITH SQUIRREL TAIL
+A756 LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+A757 LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+A758 LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+A759 LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+A75A LATIN CAPITAL LETTER R ROTUNDA
+A75B LATIN SMALL LETTER R ROTUNDA
+A75C LATIN CAPITAL LETTER RUM ROTUNDA
+A75D LATIN SMALL LETTER RUM ROTUNDA
+A75E LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+A75F LATIN SMALL LETTER V WITH DIAGONAL STROKE
+A760 LATIN CAPITAL LETTER VY
+A761 LATIN SMALL LETTER VY
+A762 LATIN CAPITAL LETTER VISIGOTHIC Z
+A763 LATIN SMALL LETTER VISIGOTHIC Z
+A764 LATIN CAPITAL LETTER THORN WITH STROKE
+A765 LATIN SMALL LETTER THORN WITH STROKE
+A766 LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+A767 LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+A768 LATIN CAPITAL LETTER VEND
+A769 LATIN SMALL LETTER VEND
+A76A LATIN CAPITAL LETTER ET
+A76B LATIN SMALL LETTER ET
+A76C LATIN CAPITAL LETTER IS
+A76D LATIN SMALL LETTER IS
+A76E LATIN CAPITAL LETTER CON
+A76F LATIN SMALL LETTER CON
+A770 MODIFIER LETTER US
+A771 LATIN SMALL LETTER DUM
+A772 LATIN SMALL LETTER LUM
+A773 LATIN SMALL LETTER MUM
+A774 LATIN SMALL LETTER NUM
+A775 LATIN SMALL LETTER RUM
+A776 LATIN LETTER SMALL CAPITAL RUM
+A777 LATIN SMALL LETTER TUM
+A778 LATIN SMALL LETTER UM
+A779 LATIN CAPITAL LETTER INSULAR D
+A77A LATIN SMALL LETTER INSULAR D
+A77B LATIN CAPITAL LETTER INSULAR F
+A77C LATIN SMALL LETTER INSULAR F
+A77D LATIN CAPITAL LETTER INSULAR G
+A77E LATIN CAPITAL LETTER TURNED INSULAR G
+A77F LATIN SMALL LETTER TURNED INSULAR G
+A780 LATIN CAPITAL LETTER TURNED L
+A781 LATIN SMALL LETTER TURNED L
+A782 LATIN CAPITAL LETTER INSULAR R
+A783 LATIN SMALL LETTER INSULAR R
+A784 LATIN CAPITAL LETTER INSULAR S
+A785 LATIN SMALL LETTER INSULAR S
+A786 LATIN CAPITAL LETTER INSULAR T
+A787 LATIN SMALL LETTER INSULAR T
+A788 MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A789 MODIFIER LETTER COLON
+A78A MODIFIER LETTER SHORT EQUALS SIGN
+A78B LATIN CAPITAL LETTER SALTILLO
+A78C LATIN SMALL LETTER SALTILLO
+A7FB LATIN EPIGRAPHIC LETTER REVERSED F
+A7FC LATIN EPIGRAPHIC LETTER REVERSED P
+A7FD LATIN EPIGRAPHIC LETTER INVERTED M
+A7FE LATIN EPIGRAPHIC LETTER I LONGA
+A7FF LATIN EPIGRAPHIC LETTER ARCHAIC M
+A800 SYLOTI NAGRI LETTER A
+A801 SYLOTI NAGRI LETTER I
+A802 SYLOTI NAGRI SIGN DVISVARA
+A803 SYLOTI NAGRI LETTER U
+A804 SYLOTI NAGRI LETTER E
+A805 SYLOTI NAGRI LETTER O
+A806 SYLOTI NAGRI SIGN HASANTA
+A807 SYLOTI NAGRI LETTER KO
+A808 SYLOTI NAGRI LETTER KHO
+A809 SYLOTI NAGRI LETTER GO
+A80A SYLOTI NAGRI LETTER GHO
+A80B SYLOTI NAGRI SIGN ANUSVARA
+A80C SYLOTI NAGRI LETTER CO
+A80D SYLOTI NAGRI LETTER CHO
+A80E SYLOTI NAGRI LETTER JO
+A80F SYLOTI NAGRI LETTER JHO
+A810 SYLOTI NAGRI LETTER TTO
+A811 SYLOTI NAGRI LETTER TTHO
+A812 SYLOTI NAGRI LETTER DDO
+A813 SYLOTI NAGRI LETTER DDHO
+A814 SYLOTI NAGRI LETTER TO
+A815 SYLOTI NAGRI LETTER THO
+A816 SYLOTI NAGRI LETTER DO
+A817 SYLOTI NAGRI LETTER DHO
+A818 SYLOTI NAGRI LETTER NO
+A819 SYLOTI NAGRI LETTER PO
+A81A SYLOTI NAGRI LETTER PHO
+A81B SYLOTI NAGRI LETTER BO
+A81C SYLOTI NAGRI LETTER BHO
+A81D SYLOTI NAGRI LETTER MO
+A81E SYLOTI NAGRI LETTER RO
+A81F SYLOTI NAGRI LETTER LO
+A820 SYLOTI NAGRI LETTER RRO
+A821 SYLOTI NAGRI LETTER SO
+A822 SYLOTI NAGRI LETTER HO
+A823 SYLOTI NAGRI VOWEL SIGN A
+A824 SYLOTI NAGRI VOWEL SIGN I
+A825 SYLOTI NAGRI VOWEL SIGN U
+A826 SYLOTI NAGRI VOWEL SIGN E
+A827 SYLOTI NAGRI VOWEL SIGN OO
+A828 SYLOTI NAGRI POETRY MARK-1
+A829 SYLOTI NAGRI POETRY MARK-2
+A82A SYLOTI NAGRI POETRY MARK-3
+A82B SYLOTI NAGRI POETRY MARK-4
+A840 PHAGS-PA LETTER KA
+A841 PHAGS-PA LETTER KHA
+A842 PHAGS-PA LETTER GA
+A843 PHAGS-PA LETTER NGA
+A844 PHAGS-PA LETTER CA
+A845 PHAGS-PA LETTER CHA
+A846 PHAGS-PA LETTER JA
+A847 PHAGS-PA LETTER NYA
+A848 PHAGS-PA LETTER TA
+A849 PHAGS-PA LETTER THA
+A84A PHAGS-PA LETTER DA
+A84B PHAGS-PA LETTER NA
+A84C PHAGS-PA LETTER PA
+A84D PHAGS-PA LETTER PHA
+A84E PHAGS-PA LETTER BA
+A84F PHAGS-PA LETTER MA
+A850 PHAGS-PA LETTER TSA
+A851 PHAGS-PA LETTER TSHA
+A852 PHAGS-PA LETTER DZA
+A853 PHAGS-PA LETTER WA
+A854 PHAGS-PA LETTER ZHA
+A855 PHAGS-PA LETTER ZA
+A856 PHAGS-PA LETTER SMALL A
+A857 PHAGS-PA LETTER YA
+A858 PHAGS-PA LETTER RA
+A859 PHAGS-PA LETTER LA
+A85A PHAGS-PA LETTER SHA
+A85B PHAGS-PA LETTER SA
+A85C PHAGS-PA LETTER HA
+A85D PHAGS-PA LETTER A
+A85E PHAGS-PA LETTER I
+A85F PHAGS-PA LETTER U
+A860 PHAGS-PA LETTER E
+A861 PHAGS-PA LETTER O
+A862 PHAGS-PA LETTER QA
+A863 PHAGS-PA LETTER XA
+A864 PHAGS-PA LETTER FA
+A865 PHAGS-PA LETTER GGA
+A866 PHAGS-PA LETTER EE
+A867 PHAGS-PA SUBJOINED LETTER WA
+A868 PHAGS-PA SUBJOINED LETTER YA
+A869 PHAGS-PA LETTER TTA
+A86A PHAGS-PA LETTER TTHA
+A86B PHAGS-PA LETTER DDA
+A86C PHAGS-PA LETTER NNA
+A86D PHAGS-PA LETTER ALTERNATE YA
+A86E PHAGS-PA LETTER VOICELESS SHA
+A86F PHAGS-PA LETTER VOICED HA
+A870 PHAGS-PA LETTER ASPIRATED FA
+A871 PHAGS-PA SUBJOINED LETTER RA
+A872 PHAGS-PA SUPERFIXED LETTER RA
+A873 PHAGS-PA LETTER CANDRABINDU
+A874 PHAGS-PA SINGLE HEAD MARK
+A875 PHAGS-PA DOUBLE HEAD MARK
+A876 PHAGS-PA MARK SHAD
+A877 PHAGS-PA MARK DOUBLE SHAD
+A880 SAURASHTRA SIGN ANUSVARA
+A881 SAURASHTRA SIGN VISARGA
+A882 SAURASHTRA LETTER A
+A883 SAURASHTRA LETTER AA
+A884 SAURASHTRA LETTER I
+A885 SAURASHTRA LETTER II
+A886 SAURASHTRA LETTER U
+A887 SAURASHTRA LETTER UU
+A888 SAURASHTRA LETTER VOCALIC R
+A889 SAURASHTRA LETTER VOCALIC RR
+A88A SAURASHTRA LETTER VOCALIC L
+A88B SAURASHTRA LETTER VOCALIC LL
+A88C SAURASHTRA LETTER E
+A88D SAURASHTRA LETTER EE
+A88E SAURASHTRA LETTER AI
+A88F SAURASHTRA LETTER O
+A890 SAURASHTRA LETTER OO
+A891 SAURASHTRA LETTER AU
+A892 SAURASHTRA LETTER KA
+A893 SAURASHTRA LETTER KHA
+A894 SAURASHTRA LETTER GA
+A895 SAURASHTRA LETTER GHA
+A896 SAURASHTRA LETTER NGA
+A897 SAURASHTRA LETTER CA
+A898 SAURASHTRA LETTER CHA
+A899 SAURASHTRA LETTER JA
+A89A SAURASHTRA LETTER JHA
+A89B SAURASHTRA LETTER NYA
+A89C SAURASHTRA LETTER TTA
+A89D SAURASHTRA LETTER TTHA
+A89E SAURASHTRA LETTER DDA
+A89F SAURASHTRA LETTER DDHA
+A8A0 SAURASHTRA LETTER NNA
+A8A1 SAURASHTRA LETTER TA
+A8A2 SAURASHTRA LETTER THA
+A8A3 SAURASHTRA LETTER DA
+A8A4 SAURASHTRA LETTER DHA
+A8A5 SAURASHTRA LETTER NA
+A8A6 SAURASHTRA LETTER PA
+A8A7 SAURASHTRA LETTER PHA
+A8A8 SAURASHTRA LETTER BA
+A8A9 SAURASHTRA LETTER BHA
+A8AA SAURASHTRA LETTER MA
+A8AB SAURASHTRA LETTER YA
+A8AC SAURASHTRA LETTER RA
+A8AD SAURASHTRA LETTER LA
+A8AE SAURASHTRA LETTER VA
+A8AF SAURASHTRA LETTER SHA
+A8B0 SAURASHTRA LETTER SSA
+A8B1 SAURASHTRA LETTER SA
+A8B2 SAURASHTRA LETTER HA
+A8B3 SAURASHTRA LETTER LLA
+A8B4 SAURASHTRA CONSONANT SIGN HAARU
+A8B5 SAURASHTRA VOWEL SIGN AA
+A8B6 SAURASHTRA VOWEL SIGN I
+A8B7 SAURASHTRA VOWEL SIGN II
+A8B8 SAURASHTRA VOWEL SIGN U
+A8B9 SAURASHTRA VOWEL SIGN UU
+A8BA SAURASHTRA VOWEL SIGN VOCALIC R
+A8BB SAURASHTRA VOWEL SIGN VOCALIC RR
+A8BC SAURASHTRA VOWEL SIGN VOCALIC L
+A8BD SAURASHTRA VOWEL SIGN VOCALIC LL
+A8BE SAURASHTRA VOWEL SIGN E
+A8BF SAURASHTRA VOWEL SIGN EE
+A8C0 SAURASHTRA VOWEL SIGN AI
+A8C1 SAURASHTRA VOWEL SIGN O
+A8C2 SAURASHTRA VOWEL SIGN OO
+A8C3 SAURASHTRA VOWEL SIGN AU
+A8C4 SAURASHTRA SIGN VIRAMA
+A8CE SAURASHTRA DANDA
+A8CF SAURASHTRA DOUBLE DANDA
+A8D0 SAURASHTRA DIGIT ZERO
+A8D1 SAURASHTRA DIGIT ONE
+A8D2 SAURASHTRA DIGIT TWO
+A8D3 SAURASHTRA DIGIT THREE
+A8D4 SAURASHTRA DIGIT FOUR
+A8D5 SAURASHTRA DIGIT FIVE
+A8D6 SAURASHTRA DIGIT SIX
+A8D7 SAURASHTRA DIGIT SEVEN
+A8D8 SAURASHTRA DIGIT EIGHT
+A8D9 SAURASHTRA DIGIT NINE
+A900 KAYAH LI DIGIT ZERO
+A901 KAYAH LI DIGIT ONE
+A902 KAYAH LI DIGIT TWO
+A903 KAYAH LI DIGIT THREE
+A904 KAYAH LI DIGIT FOUR
+A905 KAYAH LI DIGIT FIVE
+A906 KAYAH LI DIGIT SIX
+A907 KAYAH LI DIGIT SEVEN
+A908 KAYAH LI DIGIT EIGHT
+A909 KAYAH LI DIGIT NINE
+A90A KAYAH LI LETTER KA
+A90B KAYAH LI LETTER KHA
+A90C KAYAH LI LETTER GA
+A90D KAYAH LI LETTER NGA
+A90E KAYAH LI LETTER SA
+A90F KAYAH LI LETTER SHA
+A910 KAYAH LI LETTER ZA
+A911 KAYAH LI LETTER NYA
+A912 KAYAH LI LETTER TA
+A913 KAYAH LI LETTER HTA
+A914 KAYAH LI LETTER NA
+A915 KAYAH LI LETTER PA
+A916 KAYAH LI LETTER PHA
+A917 KAYAH LI LETTER MA
+A918 KAYAH LI LETTER DA
+A919 KAYAH LI LETTER BA
+A91A KAYAH LI LETTER RA
+A91B KAYAH LI LETTER YA
+A91C KAYAH LI LETTER LA
+A91D KAYAH LI LETTER WA
+A91E KAYAH LI LETTER THA
+A91F KAYAH LI LETTER HA
+A920 KAYAH LI LETTER VA
+A921 KAYAH LI LETTER CA
+A922 KAYAH LI LETTER A
+A923 KAYAH LI LETTER OE
+A924 KAYAH LI LETTER I
+A925 KAYAH LI LETTER OO
+A926 KAYAH LI VOWEL UE
+A927 KAYAH LI VOWEL E
+A928 KAYAH LI VOWEL U
+A929 KAYAH LI VOWEL EE
+A92A KAYAH LI VOWEL O
+A92B KAYAH LI TONE PLOPHU
+A92C KAYAH LI TONE CALYA
+A92D KAYAH LI TONE CALYA PLOPHU
+A92E KAYAH LI SIGN CWI
+A92F KAYAH LI SIGN SHYA
+A930 REJANG LETTER KA
+A931 REJANG LETTER GA
+A932 REJANG LETTER NGA
+A933 REJANG LETTER TA
+A934 REJANG LETTER DA
+A935 REJANG LETTER NA
+A936 REJANG LETTER PA
+A937 REJANG LETTER BA
+A938 REJANG LETTER MA
+A939 REJANG LETTER CA
+A93A REJANG LETTER JA
+A93B REJANG LETTER NYA
+A93C REJANG LETTER SA
+A93D REJANG LETTER RA
+A93E REJANG LETTER LA
+A93F REJANG LETTER YA
+A940 REJANG LETTER WA
+A941 REJANG LETTER HA
+A942 REJANG LETTER MBA
+A943 REJANG LETTER NGGA
+A944 REJANG LETTER NDA
+A945 REJANG LETTER NYJA
+A946 REJANG LETTER A
+A947 REJANG VOWEL SIGN I
+A948 REJANG VOWEL SIGN U
+A949 REJANG VOWEL SIGN E
+A94A REJANG VOWEL SIGN AI
+A94B REJANG VOWEL SIGN O
+A94C REJANG VOWEL SIGN AU
+A94D REJANG VOWEL SIGN EU
+A94E REJANG VOWEL SIGN EA
+A94F REJANG CONSONANT SIGN NG
+A950 REJANG CONSONANT SIGN N
+A951 REJANG CONSONANT SIGN R
+A952 REJANG CONSONANT SIGN H
+A953 REJANG VIRAMA
+A95F REJANG SECTION MARK
+AA00 CHAM LETTER A
+AA01 CHAM LETTER I
+AA02 CHAM LETTER U
+AA03 CHAM LETTER E
+AA04 CHAM LETTER AI
+AA05 CHAM LETTER O
+AA06 CHAM LETTER KA
+AA07 CHAM LETTER KHA
+AA08 CHAM LETTER GA
+AA09 CHAM LETTER GHA
+AA0A CHAM LETTER NGUE
+AA0B CHAM LETTER NGA
+AA0C CHAM LETTER CHA
+AA0D CHAM LETTER CHHA
+AA0E CHAM LETTER JA
+AA0F CHAM LETTER JHA
+AA10 CHAM LETTER NHUE
+AA11 CHAM LETTER NHA
+AA12 CHAM LETTER NHJA
+AA13 CHAM LETTER TA
+AA14 CHAM LETTER THA
+AA15 CHAM LETTER DA
+AA16 CHAM LETTER DHA
+AA17 CHAM LETTER NUE
+AA18 CHAM LETTER NA
+AA19 CHAM LETTER DDA
+AA1A CHAM LETTER PA
+AA1B CHAM LETTER PPA
+AA1C CHAM LETTER PHA
+AA1D CHAM LETTER BA
+AA1E CHAM LETTER BHA
+AA1F CHAM LETTER MUE
+AA20 CHAM LETTER MA
+AA21 CHAM LETTER BBA
+AA22 CHAM LETTER YA
+AA23 CHAM LETTER RA
+AA24 CHAM LETTER LA
+AA25 CHAM LETTER VA
+AA26 CHAM LETTER SSA
+AA27 CHAM LETTER SA
+AA28 CHAM LETTER HA
+AA29 CHAM VOWEL SIGN AA
+AA2A CHAM VOWEL SIGN I
+AA2B CHAM VOWEL SIGN II
+AA2C CHAM VOWEL SIGN EI
+AA2D CHAM VOWEL SIGN U
+AA2E CHAM VOWEL SIGN OE
+AA2F CHAM VOWEL SIGN O
+AA30 CHAM VOWEL SIGN AI
+AA31 CHAM VOWEL SIGN AU
+AA32 CHAM VOWEL SIGN UE
+AA33 CHAM CONSONANT SIGN YA
+AA34 CHAM CONSONANT SIGN RA
+AA35 CHAM CONSONANT SIGN LA
+AA36 CHAM CONSONANT SIGN WA
+AA40 CHAM LETTER FINAL K
+AA41 CHAM LETTER FINAL G
+AA42 CHAM LETTER FINAL NG
+AA43 CHAM CONSONANT SIGN FINAL NG
+AA44 CHAM LETTER FINAL CH
+AA45 CHAM LETTER FINAL T
+AA46 CHAM LETTER FINAL N
+AA47 CHAM LETTER FINAL P
+AA48 CHAM LETTER FINAL Y
+AA49 CHAM LETTER FINAL R
+AA4A CHAM LETTER FINAL L
+AA4B CHAM LETTER FINAL SS
+AA4C CHAM CONSONANT SIGN FINAL M
+AA4D CHAM CONSONANT SIGN FINAL H
+AA50 CHAM DIGIT ZERO
+AA51 CHAM DIGIT ONE
+AA52 CHAM DIGIT TWO
+AA53 CHAM DIGIT THREE
+AA54 CHAM DIGIT FOUR
+AA55 CHAM DIGIT FIVE
+AA56 CHAM DIGIT SIX
+AA57 CHAM DIGIT SEVEN
+AA58 CHAM DIGIT EIGHT
+AA59 CHAM DIGIT NINE
+AA5C CHAM PUNCTUATION SPIRAL
+AA5D CHAM PUNCTUATION DANDA
+AA5E CHAM PUNCTUATION DOUBLE DANDA
+AA5F CHAM PUNCTUATION TRIPLE DANDA
+AC00 D7A3 Hangul Syllable
+D800 DB7F Non Private Use High Surrogate
+DB80 DBFF Private Use High Surrogate
+DC00 DFFF Low Surrogate
+E000 F8FF Private Use
+F900 CJK COMPATIBILITY IDEOGRAPH-F900
+F901 CJK COMPATIBILITY IDEOGRAPH-F901
+F902 CJK COMPATIBILITY IDEOGRAPH-F902
+F903 CJK COMPATIBILITY IDEOGRAPH-F903
+F904 CJK COMPATIBILITY IDEOGRAPH-F904
+F905 CJK COMPATIBILITY IDEOGRAPH-F905
+F906 CJK COMPATIBILITY IDEOGRAPH-F906
+F907 CJK COMPATIBILITY IDEOGRAPH-F907
+F908 CJK COMPATIBILITY IDEOGRAPH-F908
+F909 CJK COMPATIBILITY IDEOGRAPH-F909
+F90A CJK COMPATIBILITY IDEOGRAPH-F90A
+F90B CJK COMPATIBILITY IDEOGRAPH-F90B
+F90C CJK COMPATIBILITY IDEOGRAPH-F90C
+F90D CJK COMPATIBILITY IDEOGRAPH-F90D
+F90E CJK COMPATIBILITY IDEOGRAPH-F90E
+F90F CJK COMPATIBILITY IDEOGRAPH-F90F
+F910 CJK COMPATIBILITY IDEOGRAPH-F910
+F911 CJK COMPATIBILITY IDEOGRAPH-F911
+F912 CJK COMPATIBILITY IDEOGRAPH-F912
+F913 CJK COMPATIBILITY IDEOGRAPH-F913
+F914 CJK COMPATIBILITY IDEOGRAPH-F914
+F915 CJK COMPATIBILITY IDEOGRAPH-F915
+F916 CJK COMPATIBILITY IDEOGRAPH-F916
+F917 CJK COMPATIBILITY IDEOGRAPH-F917
+F918 CJK COMPATIBILITY IDEOGRAPH-F918
+F919 CJK COMPATIBILITY IDEOGRAPH-F919
+F91A CJK COMPATIBILITY IDEOGRAPH-F91A
+F91B CJK COMPATIBILITY IDEOGRAPH-F91B
+F91C CJK COMPATIBILITY IDEOGRAPH-F91C
+F91D CJK COMPATIBILITY IDEOGRAPH-F91D
+F91E CJK COMPATIBILITY IDEOGRAPH-F91E
+F91F CJK COMPATIBILITY IDEOGRAPH-F91F
+F920 CJK COMPATIBILITY IDEOGRAPH-F920
+F921 CJK COMPATIBILITY IDEOGRAPH-F921
+F922 CJK COMPATIBILITY IDEOGRAPH-F922
+F923 CJK COMPATIBILITY IDEOGRAPH-F923
+F924 CJK COMPATIBILITY IDEOGRAPH-F924
+F925 CJK COMPATIBILITY IDEOGRAPH-F925
+F926 CJK COMPATIBILITY IDEOGRAPH-F926
+F927 CJK COMPATIBILITY IDEOGRAPH-F927
+F928 CJK COMPATIBILITY IDEOGRAPH-F928
+F929 CJK COMPATIBILITY IDEOGRAPH-F929
+F92A CJK COMPATIBILITY IDEOGRAPH-F92A
+F92B CJK COMPATIBILITY IDEOGRAPH-F92B
+F92C CJK COMPATIBILITY IDEOGRAPH-F92C
+F92D CJK COMPATIBILITY IDEOGRAPH-F92D
+F92E CJK COMPATIBILITY IDEOGRAPH-F92E
+F92F CJK COMPATIBILITY IDEOGRAPH-F92F
+F930 CJK COMPATIBILITY IDEOGRAPH-F930
+F931 CJK COMPATIBILITY IDEOGRAPH-F931
+F932 CJK COMPATIBILITY IDEOGRAPH-F932
+F933 CJK COMPATIBILITY IDEOGRAPH-F933
+F934 CJK COMPATIBILITY IDEOGRAPH-F934
+F935 CJK COMPATIBILITY IDEOGRAPH-F935
+F936 CJK COMPATIBILITY IDEOGRAPH-F936
+F937 CJK COMPATIBILITY IDEOGRAPH-F937
+F938 CJK COMPATIBILITY IDEOGRAPH-F938
+F939 CJK COMPATIBILITY IDEOGRAPH-F939
+F93A CJK COMPATIBILITY IDEOGRAPH-F93A
+F93B CJK COMPATIBILITY IDEOGRAPH-F93B
+F93C CJK COMPATIBILITY IDEOGRAPH-F93C
+F93D CJK COMPATIBILITY IDEOGRAPH-F93D
+F93E CJK COMPATIBILITY IDEOGRAPH-F93E
+F93F CJK COMPATIBILITY IDEOGRAPH-F93F
+F940 CJK COMPATIBILITY IDEOGRAPH-F940
+F941 CJK COMPATIBILITY IDEOGRAPH-F941
+F942 CJK COMPATIBILITY IDEOGRAPH-F942
+F943 CJK COMPATIBILITY IDEOGRAPH-F943
+F944 CJK COMPATIBILITY IDEOGRAPH-F944
+F945 CJK COMPATIBILITY IDEOGRAPH-F945
+F946 CJK COMPATIBILITY IDEOGRAPH-F946
+F947 CJK COMPATIBILITY IDEOGRAPH-F947
+F948 CJK COMPATIBILITY IDEOGRAPH-F948
+F949 CJK COMPATIBILITY IDEOGRAPH-F949
+F94A CJK COMPATIBILITY IDEOGRAPH-F94A
+F94B CJK COMPATIBILITY IDEOGRAPH-F94B
+F94C CJK COMPATIBILITY IDEOGRAPH-F94C
+F94D CJK COMPATIBILITY IDEOGRAPH-F94D
+F94E CJK COMPATIBILITY IDEOGRAPH-F94E
+F94F CJK COMPATIBILITY IDEOGRAPH-F94F
+F950 CJK COMPATIBILITY IDEOGRAPH-F950
+F951 CJK COMPATIBILITY IDEOGRAPH-F951
+F952 CJK COMPATIBILITY IDEOGRAPH-F952
+F953 CJK COMPATIBILITY IDEOGRAPH-F953
+F954 CJK COMPATIBILITY IDEOGRAPH-F954
+F955 CJK COMPATIBILITY IDEOGRAPH-F955
+F956 CJK COMPATIBILITY IDEOGRAPH-F956
+F957 CJK COMPATIBILITY IDEOGRAPH-F957
+F958 CJK COMPATIBILITY IDEOGRAPH-F958
+F959 CJK COMPATIBILITY IDEOGRAPH-F959
+F95A CJK COMPATIBILITY IDEOGRAPH-F95A
+F95B CJK COMPATIBILITY IDEOGRAPH-F95B
+F95C CJK COMPATIBILITY IDEOGRAPH-F95C
+F95D CJK COMPATIBILITY IDEOGRAPH-F95D
+F95E CJK COMPATIBILITY IDEOGRAPH-F95E
+F95F CJK COMPATIBILITY IDEOGRAPH-F95F
+F960 CJK COMPATIBILITY IDEOGRAPH-F960
+F961 CJK COMPATIBILITY IDEOGRAPH-F961
+F962 CJK COMPATIBILITY IDEOGRAPH-F962
+F963 CJK COMPATIBILITY IDEOGRAPH-F963
+F964 CJK COMPATIBILITY IDEOGRAPH-F964
+F965 CJK COMPATIBILITY IDEOGRAPH-F965
+F966 CJK COMPATIBILITY IDEOGRAPH-F966
+F967 CJK COMPATIBILITY IDEOGRAPH-F967
+F968 CJK COMPATIBILITY IDEOGRAPH-F968
+F969 CJK COMPATIBILITY IDEOGRAPH-F969
+F96A CJK COMPATIBILITY IDEOGRAPH-F96A
+F96B CJK COMPATIBILITY IDEOGRAPH-F96B
+F96C CJK COMPATIBILITY IDEOGRAPH-F96C
+F96D CJK COMPATIBILITY IDEOGRAPH-F96D
+F96E CJK COMPATIBILITY IDEOGRAPH-F96E
+F96F CJK COMPATIBILITY IDEOGRAPH-F96F
+F970 CJK COMPATIBILITY IDEOGRAPH-F970
+F971 CJK COMPATIBILITY IDEOGRAPH-F971
+F972 CJK COMPATIBILITY IDEOGRAPH-F972
+F973 CJK COMPATIBILITY IDEOGRAPH-F973
+F974 CJK COMPATIBILITY IDEOGRAPH-F974
+F975 CJK COMPATIBILITY IDEOGRAPH-F975
+F976 CJK COMPATIBILITY IDEOGRAPH-F976
+F977 CJK COMPATIBILITY IDEOGRAPH-F977
+F978 CJK COMPATIBILITY IDEOGRAPH-F978
+F979 CJK COMPATIBILITY IDEOGRAPH-F979
+F97A CJK COMPATIBILITY IDEOGRAPH-F97A
+F97B CJK COMPATIBILITY IDEOGRAPH-F97B
+F97C CJK COMPATIBILITY IDEOGRAPH-F97C
+F97D CJK COMPATIBILITY IDEOGRAPH-F97D
+F97E CJK COMPATIBILITY IDEOGRAPH-F97E
+F97F CJK COMPATIBILITY IDEOGRAPH-F97F
+F980 CJK COMPATIBILITY IDEOGRAPH-F980
+F981 CJK COMPATIBILITY IDEOGRAPH-F981
+F982 CJK COMPATIBILITY IDEOGRAPH-F982
+F983 CJK COMPATIBILITY IDEOGRAPH-F983
+F984 CJK COMPATIBILITY IDEOGRAPH-F984
+F985 CJK COMPATIBILITY IDEOGRAPH-F985
+F986 CJK COMPATIBILITY IDEOGRAPH-F986
+F987 CJK COMPATIBILITY IDEOGRAPH-F987
+F988 CJK COMPATIBILITY IDEOGRAPH-F988
+F989 CJK COMPATIBILITY IDEOGRAPH-F989
+F98A CJK COMPATIBILITY IDEOGRAPH-F98A
+F98B CJK COMPATIBILITY IDEOGRAPH-F98B
+F98C CJK COMPATIBILITY IDEOGRAPH-F98C
+F98D CJK COMPATIBILITY IDEOGRAPH-F98D
+F98E CJK COMPATIBILITY IDEOGRAPH-F98E
+F98F CJK COMPATIBILITY IDEOGRAPH-F98F
+F990 CJK COMPATIBILITY IDEOGRAPH-F990
+F991 CJK COMPATIBILITY IDEOGRAPH-F991
+F992 CJK COMPATIBILITY IDEOGRAPH-F992
+F993 CJK COMPATIBILITY IDEOGRAPH-F993
+F994 CJK COMPATIBILITY IDEOGRAPH-F994
+F995 CJK COMPATIBILITY IDEOGRAPH-F995
+F996 CJK COMPATIBILITY IDEOGRAPH-F996
+F997 CJK COMPATIBILITY IDEOGRAPH-F997
+F998 CJK COMPATIBILITY IDEOGRAPH-F998
+F999 CJK COMPATIBILITY IDEOGRAPH-F999
+F99A CJK COMPATIBILITY IDEOGRAPH-F99A
+F99B CJK COMPATIBILITY IDEOGRAPH-F99B
+F99C CJK COMPATIBILITY IDEOGRAPH-F99C
+F99D CJK COMPATIBILITY IDEOGRAPH-F99D
+F99E CJK COMPATIBILITY IDEOGRAPH-F99E
+F99F CJK COMPATIBILITY IDEOGRAPH-F99F
+F9A0 CJK COMPATIBILITY IDEOGRAPH-F9A0
+F9A1 CJK COMPATIBILITY IDEOGRAPH-F9A1
+F9A2 CJK COMPATIBILITY IDEOGRAPH-F9A2
+F9A3 CJK COMPATIBILITY IDEOGRAPH-F9A3
+F9A4 CJK COMPATIBILITY IDEOGRAPH-F9A4
+F9A5 CJK COMPATIBILITY IDEOGRAPH-F9A5
+F9A6 CJK COMPATIBILITY IDEOGRAPH-F9A6
+F9A7 CJK COMPATIBILITY IDEOGRAPH-F9A7
+F9A8 CJK COMPATIBILITY IDEOGRAPH-F9A8
+F9A9 CJK COMPATIBILITY IDEOGRAPH-F9A9
+F9AA CJK COMPATIBILITY IDEOGRAPH-F9AA
+F9AB CJK COMPATIBILITY IDEOGRAPH-F9AB
+F9AC CJK COMPATIBILITY IDEOGRAPH-F9AC
+F9AD CJK COMPATIBILITY IDEOGRAPH-F9AD
+F9AE CJK COMPATIBILITY IDEOGRAPH-F9AE
+F9AF CJK COMPATIBILITY IDEOGRAPH-F9AF
+F9B0 CJK COMPATIBILITY IDEOGRAPH-F9B0
+F9B1 CJK COMPATIBILITY IDEOGRAPH-F9B1
+F9B2 CJK COMPATIBILITY IDEOGRAPH-F9B2
+F9B3 CJK COMPATIBILITY IDEOGRAPH-F9B3
+F9B4 CJK COMPATIBILITY IDEOGRAPH-F9B4
+F9B5 CJK COMPATIBILITY IDEOGRAPH-F9B5
+F9B6 CJK COMPATIBILITY IDEOGRAPH-F9B6
+F9B7 CJK COMPATIBILITY IDEOGRAPH-F9B7
+F9B8 CJK COMPATIBILITY IDEOGRAPH-F9B8
+F9B9 CJK COMPATIBILITY IDEOGRAPH-F9B9
+F9BA CJK COMPATIBILITY IDEOGRAPH-F9BA
+F9BB CJK COMPATIBILITY IDEOGRAPH-F9BB
+F9BC CJK COMPATIBILITY IDEOGRAPH-F9BC
+F9BD CJK COMPATIBILITY IDEOGRAPH-F9BD
+F9BE CJK COMPATIBILITY IDEOGRAPH-F9BE
+F9BF CJK COMPATIBILITY IDEOGRAPH-F9BF
+F9C0 CJK COMPATIBILITY IDEOGRAPH-F9C0
+F9C1 CJK COMPATIBILITY IDEOGRAPH-F9C1
+F9C2 CJK COMPATIBILITY IDEOGRAPH-F9C2
+F9C3 CJK COMPATIBILITY IDEOGRAPH-F9C3
+F9C4 CJK COMPATIBILITY IDEOGRAPH-F9C4
+F9C5 CJK COMPATIBILITY IDEOGRAPH-F9C5
+F9C6 CJK COMPATIBILITY IDEOGRAPH-F9C6
+F9C7 CJK COMPATIBILITY IDEOGRAPH-F9C7
+F9C8 CJK COMPATIBILITY IDEOGRAPH-F9C8
+F9C9 CJK COMPATIBILITY IDEOGRAPH-F9C9
+F9CA CJK COMPATIBILITY IDEOGRAPH-F9CA
+F9CB CJK COMPATIBILITY IDEOGRAPH-F9CB
+F9CC CJK COMPATIBILITY IDEOGRAPH-F9CC
+F9CD CJK COMPATIBILITY IDEOGRAPH-F9CD
+F9CE CJK COMPATIBILITY IDEOGRAPH-F9CE
+F9CF CJK COMPATIBILITY IDEOGRAPH-F9CF
+F9D0 CJK COMPATIBILITY IDEOGRAPH-F9D0
+F9D1 CJK COMPATIBILITY IDEOGRAPH-F9D1
+F9D2 CJK COMPATIBILITY IDEOGRAPH-F9D2
+F9D3 CJK COMPATIBILITY IDEOGRAPH-F9D3
+F9D4 CJK COMPATIBILITY IDEOGRAPH-F9D4
+F9D5 CJK COMPATIBILITY IDEOGRAPH-F9D5
+F9D6 CJK COMPATIBILITY IDEOGRAPH-F9D6
+F9D7 CJK COMPATIBILITY IDEOGRAPH-F9D7
+F9D8 CJK COMPATIBILITY IDEOGRAPH-F9D8
+F9D9 CJK COMPATIBILITY IDEOGRAPH-F9D9
+F9DA CJK COMPATIBILITY IDEOGRAPH-F9DA
+F9DB CJK COMPATIBILITY IDEOGRAPH-F9DB
+F9DC CJK COMPATIBILITY IDEOGRAPH-F9DC
+F9DD CJK COMPATIBILITY IDEOGRAPH-F9DD
+F9DE CJK COMPATIBILITY IDEOGRAPH-F9DE
+F9DF CJK COMPATIBILITY IDEOGRAPH-F9DF
+F9E0 CJK COMPATIBILITY IDEOGRAPH-F9E0
+F9E1 CJK COMPATIBILITY IDEOGRAPH-F9E1
+F9E2 CJK COMPATIBILITY IDEOGRAPH-F9E2
+F9E3 CJK COMPATIBILITY IDEOGRAPH-F9E3
+F9E4 CJK COMPATIBILITY IDEOGRAPH-F9E4
+F9E5 CJK COMPATIBILITY IDEOGRAPH-F9E5
+F9E6 CJK COMPATIBILITY IDEOGRAPH-F9E6
+F9E7 CJK COMPATIBILITY IDEOGRAPH-F9E7
+F9E8 CJK COMPATIBILITY IDEOGRAPH-F9E8
+F9E9 CJK COMPATIBILITY IDEOGRAPH-F9E9
+F9EA CJK COMPATIBILITY IDEOGRAPH-F9EA
+F9EB CJK COMPATIBILITY IDEOGRAPH-F9EB
+F9EC CJK COMPATIBILITY IDEOGRAPH-F9EC
+F9ED CJK COMPATIBILITY IDEOGRAPH-F9ED
+F9EE CJK COMPATIBILITY IDEOGRAPH-F9EE
+F9EF CJK COMPATIBILITY IDEOGRAPH-F9EF
+F9F0 CJK COMPATIBILITY IDEOGRAPH-F9F0
+F9F1 CJK COMPATIBILITY IDEOGRAPH-F9F1
+F9F2 CJK COMPATIBILITY IDEOGRAPH-F9F2
+F9F3 CJK COMPATIBILITY IDEOGRAPH-F9F3
+F9F4 CJK COMPATIBILITY IDEOGRAPH-F9F4
+F9F5 CJK COMPATIBILITY IDEOGRAPH-F9F5
+F9F6 CJK COMPATIBILITY IDEOGRAPH-F9F6
+F9F7 CJK COMPATIBILITY IDEOGRAPH-F9F7
+F9F8 CJK COMPATIBILITY IDEOGRAPH-F9F8
+F9F9 CJK COMPATIBILITY IDEOGRAPH-F9F9
+F9FA CJK COMPATIBILITY IDEOGRAPH-F9FA
+F9FB CJK COMPATIBILITY IDEOGRAPH-F9FB
+F9FC CJK COMPATIBILITY IDEOGRAPH-F9FC
+F9FD CJK COMPATIBILITY IDEOGRAPH-F9FD
+F9FE CJK COMPATIBILITY IDEOGRAPH-F9FE
+F9FF CJK COMPATIBILITY IDEOGRAPH-F9FF
+FA00 CJK COMPATIBILITY IDEOGRAPH-FA00
+FA01 CJK COMPATIBILITY IDEOGRAPH-FA01
+FA02 CJK COMPATIBILITY IDEOGRAPH-FA02
+FA03 CJK COMPATIBILITY IDEOGRAPH-FA03
+FA04 CJK COMPATIBILITY IDEOGRAPH-FA04
+FA05 CJK COMPATIBILITY IDEOGRAPH-FA05
+FA06 CJK COMPATIBILITY IDEOGRAPH-FA06
+FA07 CJK COMPATIBILITY IDEOGRAPH-FA07
+FA08 CJK COMPATIBILITY IDEOGRAPH-FA08
+FA09 CJK COMPATIBILITY IDEOGRAPH-FA09
+FA0A CJK COMPATIBILITY IDEOGRAPH-FA0A
+FA0B CJK COMPATIBILITY IDEOGRAPH-FA0B
+FA0C CJK COMPATIBILITY IDEOGRAPH-FA0C
+FA0D CJK COMPATIBILITY IDEOGRAPH-FA0D
+FA0E CJK COMPATIBILITY IDEOGRAPH-FA0E
+FA0F CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA10 CJK COMPATIBILITY IDEOGRAPH-FA10
+FA11 CJK COMPATIBILITY IDEOGRAPH-FA11
+FA12 CJK COMPATIBILITY IDEOGRAPH-FA12
+FA13 CJK COMPATIBILITY IDEOGRAPH-FA13
+FA14 CJK COMPATIBILITY IDEOGRAPH-FA14
+FA15 CJK COMPATIBILITY IDEOGRAPH-FA15
+FA16 CJK COMPATIBILITY IDEOGRAPH-FA16
+FA17 CJK COMPATIBILITY IDEOGRAPH-FA17
+FA18 CJK COMPATIBILITY IDEOGRAPH-FA18
+FA19 CJK COMPATIBILITY IDEOGRAPH-FA19
+FA1A CJK COMPATIBILITY IDEOGRAPH-FA1A
+FA1B CJK COMPATIBILITY IDEOGRAPH-FA1B
+FA1C CJK COMPATIBILITY IDEOGRAPH-FA1C
+FA1D CJK COMPATIBILITY IDEOGRAPH-FA1D
+FA1E CJK COMPATIBILITY IDEOGRAPH-FA1E
+FA1F CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA20 CJK COMPATIBILITY IDEOGRAPH-FA20
+FA21 CJK COMPATIBILITY IDEOGRAPH-FA21
+FA22 CJK COMPATIBILITY IDEOGRAPH-FA22
+FA23 CJK COMPATIBILITY IDEOGRAPH-FA23
+FA24 CJK COMPATIBILITY IDEOGRAPH-FA24
+FA25 CJK COMPATIBILITY IDEOGRAPH-FA25
+FA26 CJK COMPATIBILITY IDEOGRAPH-FA26
+FA27 CJK COMPATIBILITY IDEOGRAPH-FA27
+FA28 CJK COMPATIBILITY IDEOGRAPH-FA28
+FA29 CJK COMPATIBILITY IDEOGRAPH-FA29
+FA2A CJK COMPATIBILITY IDEOGRAPH-FA2A
+FA2B CJK COMPATIBILITY IDEOGRAPH-FA2B
+FA2C CJK COMPATIBILITY IDEOGRAPH-FA2C
+FA2D CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30 CJK COMPATIBILITY IDEOGRAPH-FA30
+FA31 CJK COMPATIBILITY IDEOGRAPH-FA31
+FA32 CJK COMPATIBILITY IDEOGRAPH-FA32
+FA33 CJK COMPATIBILITY IDEOGRAPH-FA33
+FA34 CJK COMPATIBILITY IDEOGRAPH-FA34
+FA35 CJK COMPATIBILITY IDEOGRAPH-FA35
+FA36 CJK COMPATIBILITY IDEOGRAPH-FA36
+FA37 CJK COMPATIBILITY IDEOGRAPH-FA37
+FA38 CJK COMPATIBILITY IDEOGRAPH-FA38
+FA39 CJK COMPATIBILITY IDEOGRAPH-FA39
+FA3A CJK COMPATIBILITY IDEOGRAPH-FA3A
+FA3B CJK COMPATIBILITY IDEOGRAPH-FA3B
+FA3C CJK COMPATIBILITY IDEOGRAPH-FA3C
+FA3D CJK COMPATIBILITY IDEOGRAPH-FA3D
+FA3E CJK COMPATIBILITY IDEOGRAPH-FA3E
+FA3F CJK COMPATIBILITY IDEOGRAPH-FA3F
+FA40 CJK COMPATIBILITY IDEOGRAPH-FA40
+FA41 CJK COMPATIBILITY IDEOGRAPH-FA41
+FA42 CJK COMPATIBILITY IDEOGRAPH-FA42
+FA43 CJK COMPATIBILITY IDEOGRAPH-FA43
+FA44 CJK COMPATIBILITY IDEOGRAPH-FA44
+FA45 CJK COMPATIBILITY IDEOGRAPH-FA45
+FA46 CJK COMPATIBILITY IDEOGRAPH-FA46
+FA47 CJK COMPATIBILITY IDEOGRAPH-FA47
+FA48 CJK COMPATIBILITY IDEOGRAPH-FA48
+FA49 CJK COMPATIBILITY IDEOGRAPH-FA49
+FA4A CJK COMPATIBILITY IDEOGRAPH-FA4A
+FA4B CJK COMPATIBILITY IDEOGRAPH-FA4B
+FA4C CJK COMPATIBILITY IDEOGRAPH-FA4C
+FA4D CJK COMPATIBILITY IDEOGRAPH-FA4D
+FA4E CJK COMPATIBILITY IDEOGRAPH-FA4E
+FA4F CJK COMPATIBILITY IDEOGRAPH-FA4F
+FA50 CJK COMPATIBILITY IDEOGRAPH-FA50
+FA51 CJK COMPATIBILITY IDEOGRAPH-FA51
+FA52 CJK COMPATIBILITY IDEOGRAPH-FA52
+FA53 CJK COMPATIBILITY IDEOGRAPH-FA53
+FA54 CJK COMPATIBILITY IDEOGRAPH-FA54
+FA55 CJK COMPATIBILITY IDEOGRAPH-FA55
+FA56 CJK COMPATIBILITY IDEOGRAPH-FA56
+FA57 CJK COMPATIBILITY IDEOGRAPH-FA57
+FA58 CJK COMPATIBILITY IDEOGRAPH-FA58
+FA59 CJK COMPATIBILITY IDEOGRAPH-FA59
+FA5A CJK COMPATIBILITY IDEOGRAPH-FA5A
+FA5B CJK COMPATIBILITY IDEOGRAPH-FA5B
+FA5C CJK COMPATIBILITY IDEOGRAPH-FA5C
+FA5D CJK COMPATIBILITY IDEOGRAPH-FA5D
+FA5E CJK COMPATIBILITY IDEOGRAPH-FA5E
+FA5F CJK COMPATIBILITY IDEOGRAPH-FA5F
+FA60 CJK COMPATIBILITY IDEOGRAPH-FA60
+FA61 CJK COMPATIBILITY IDEOGRAPH-FA61
+FA62 CJK COMPATIBILITY IDEOGRAPH-FA62
+FA63 CJK COMPATIBILITY IDEOGRAPH-FA63
+FA64 CJK COMPATIBILITY IDEOGRAPH-FA64
+FA65 CJK COMPATIBILITY IDEOGRAPH-FA65
+FA66 CJK COMPATIBILITY IDEOGRAPH-FA66
+FA67 CJK COMPATIBILITY IDEOGRAPH-FA67
+FA68 CJK COMPATIBILITY IDEOGRAPH-FA68
+FA69 CJK COMPATIBILITY IDEOGRAPH-FA69
+FA6A CJK COMPATIBILITY IDEOGRAPH-FA6A
+FA70 CJK COMPATIBILITY IDEOGRAPH-FA70
+FA71 CJK COMPATIBILITY IDEOGRAPH-FA71
+FA72 CJK COMPATIBILITY IDEOGRAPH-FA72
+FA73 CJK COMPATIBILITY IDEOGRAPH-FA73
+FA74 CJK COMPATIBILITY IDEOGRAPH-FA74
+FA75 CJK COMPATIBILITY IDEOGRAPH-FA75
+FA76 CJK COMPATIBILITY IDEOGRAPH-FA76
+FA77 CJK COMPATIBILITY IDEOGRAPH-FA77
+FA78 CJK COMPATIBILITY IDEOGRAPH-FA78
+FA79 CJK COMPATIBILITY IDEOGRAPH-FA79
+FA7A CJK COMPATIBILITY IDEOGRAPH-FA7A
+FA7B CJK COMPATIBILITY IDEOGRAPH-FA7B
+FA7C CJK COMPATIBILITY IDEOGRAPH-FA7C
+FA7D CJK COMPATIBILITY IDEOGRAPH-FA7D
+FA7E CJK COMPATIBILITY IDEOGRAPH-FA7E
+FA7F CJK COMPATIBILITY IDEOGRAPH-FA7F
+FA80 CJK COMPATIBILITY IDEOGRAPH-FA80
+FA81 CJK COMPATIBILITY IDEOGRAPH-FA81
+FA82 CJK COMPATIBILITY IDEOGRAPH-FA82
+FA83 CJK COMPATIBILITY IDEOGRAPH-FA83
+FA84 CJK COMPATIBILITY IDEOGRAPH-FA84
+FA85 CJK COMPATIBILITY IDEOGRAPH-FA85
+FA86 CJK COMPATIBILITY IDEOGRAPH-FA86
+FA87 CJK COMPATIBILITY IDEOGRAPH-FA87
+FA88 CJK COMPATIBILITY IDEOGRAPH-FA88
+FA89 CJK COMPATIBILITY IDEOGRAPH-FA89
+FA8A CJK COMPATIBILITY IDEOGRAPH-FA8A
+FA8B CJK COMPATIBILITY IDEOGRAPH-FA8B
+FA8C CJK COMPATIBILITY IDEOGRAPH-FA8C
+FA8D CJK COMPATIBILITY IDEOGRAPH-FA8D
+FA8E CJK COMPATIBILITY IDEOGRAPH-FA8E
+FA8F CJK COMPATIBILITY IDEOGRAPH-FA8F
+FA90 CJK COMPATIBILITY IDEOGRAPH-FA90
+FA91 CJK COMPATIBILITY IDEOGRAPH-FA91
+FA92 CJK COMPATIBILITY IDEOGRAPH-FA92
+FA93 CJK COMPATIBILITY IDEOGRAPH-FA93
+FA94 CJK COMPATIBILITY IDEOGRAPH-FA94
+FA95 CJK COMPATIBILITY IDEOGRAPH-FA95
+FA96 CJK COMPATIBILITY IDEOGRAPH-FA96
+FA97 CJK COMPATIBILITY IDEOGRAPH-FA97
+FA98 CJK COMPATIBILITY IDEOGRAPH-FA98
+FA99 CJK COMPATIBILITY IDEOGRAPH-FA99
+FA9A CJK COMPATIBILITY IDEOGRAPH-FA9A
+FA9B CJK COMPATIBILITY IDEOGRAPH-FA9B
+FA9C CJK COMPATIBILITY IDEOGRAPH-FA9C
+FA9D CJK COMPATIBILITY IDEOGRAPH-FA9D
+FA9E CJK COMPATIBILITY IDEOGRAPH-FA9E
+FA9F CJK COMPATIBILITY IDEOGRAPH-FA9F
+FAA0 CJK COMPATIBILITY IDEOGRAPH-FAA0
+FAA1 CJK COMPATIBILITY IDEOGRAPH-FAA1
+FAA2 CJK COMPATIBILITY IDEOGRAPH-FAA2
+FAA3 CJK COMPATIBILITY IDEOGRAPH-FAA3
+FAA4 CJK COMPATIBILITY IDEOGRAPH-FAA4
+FAA5 CJK COMPATIBILITY IDEOGRAPH-FAA5
+FAA6 CJK COMPATIBILITY IDEOGRAPH-FAA6
+FAA7 CJK COMPATIBILITY IDEOGRAPH-FAA7
+FAA8 CJK COMPATIBILITY IDEOGRAPH-FAA8
+FAA9 CJK COMPATIBILITY IDEOGRAPH-FAA9
+FAAA CJK COMPATIBILITY IDEOGRAPH-FAAA
+FAAB CJK COMPATIBILITY IDEOGRAPH-FAAB
+FAAC CJK COMPATIBILITY IDEOGRAPH-FAAC
+FAAD CJK COMPATIBILITY IDEOGRAPH-FAAD
+FAAE CJK COMPATIBILITY IDEOGRAPH-FAAE
+FAAF CJK COMPATIBILITY IDEOGRAPH-FAAF
+FAB0 CJK COMPATIBILITY IDEOGRAPH-FAB0
+FAB1 CJK COMPATIBILITY IDEOGRAPH-FAB1
+FAB2 CJK COMPATIBILITY IDEOGRAPH-FAB2
+FAB3 CJK COMPATIBILITY IDEOGRAPH-FAB3
+FAB4 CJK COMPATIBILITY IDEOGRAPH-FAB4
+FAB5 CJK COMPATIBILITY IDEOGRAPH-FAB5
+FAB6 CJK COMPATIBILITY IDEOGRAPH-FAB6
+FAB7 CJK COMPATIBILITY IDEOGRAPH-FAB7
+FAB8 CJK COMPATIBILITY IDEOGRAPH-FAB8
+FAB9 CJK COMPATIBILITY IDEOGRAPH-FAB9
+FABA CJK COMPATIBILITY IDEOGRAPH-FABA
+FABB CJK COMPATIBILITY IDEOGRAPH-FABB
+FABC CJK COMPATIBILITY IDEOGRAPH-FABC
+FABD CJK COMPATIBILITY IDEOGRAPH-FABD
+FABE CJK COMPATIBILITY IDEOGRAPH-FABE
+FABF CJK COMPATIBILITY IDEOGRAPH-FABF
+FAC0 CJK COMPATIBILITY IDEOGRAPH-FAC0
+FAC1 CJK COMPATIBILITY IDEOGRAPH-FAC1
+FAC2 CJK COMPATIBILITY IDEOGRAPH-FAC2
+FAC3 CJK COMPATIBILITY IDEOGRAPH-FAC3
+FAC4 CJK COMPATIBILITY IDEOGRAPH-FAC4
+FAC5 CJK COMPATIBILITY IDEOGRAPH-FAC5
+FAC6 CJK COMPATIBILITY IDEOGRAPH-FAC6
+FAC7 CJK COMPATIBILITY IDEOGRAPH-FAC7
+FAC8 CJK COMPATIBILITY IDEOGRAPH-FAC8
+FAC9 CJK COMPATIBILITY IDEOGRAPH-FAC9
+FACA CJK COMPATIBILITY IDEOGRAPH-FACA
+FACB CJK COMPATIBILITY IDEOGRAPH-FACB
+FACC CJK COMPATIBILITY IDEOGRAPH-FACC
+FACD CJK COMPATIBILITY IDEOGRAPH-FACD
+FACE CJK COMPATIBILITY IDEOGRAPH-FACE
+FACF CJK COMPATIBILITY IDEOGRAPH-FACF
+FAD0 CJK COMPATIBILITY IDEOGRAPH-FAD0
+FAD1 CJK COMPATIBILITY IDEOGRAPH-FAD1
+FAD2 CJK COMPATIBILITY IDEOGRAPH-FAD2
+FAD3 CJK COMPATIBILITY IDEOGRAPH-FAD3
+FAD4 CJK COMPATIBILITY IDEOGRAPH-FAD4
+FAD5 CJK COMPATIBILITY IDEOGRAPH-FAD5
+FAD6 CJK COMPATIBILITY IDEOGRAPH-FAD6
+FAD7 CJK COMPATIBILITY IDEOGRAPH-FAD7
+FAD8 CJK COMPATIBILITY IDEOGRAPH-FAD8
+FAD9 CJK COMPATIBILITY IDEOGRAPH-FAD9
+FB00 LATIN SMALL LIGATURE FF
+FB01 LATIN SMALL LIGATURE FI
+FB02 LATIN SMALL LIGATURE FL
+FB03 LATIN SMALL LIGATURE FFI
+FB04 LATIN SMALL LIGATURE FFL
+FB05 LATIN SMALL LIGATURE LONG S T
+FB06 LATIN SMALL LIGATURE ST
+FB13 ARMENIAN SMALL LIGATURE MEN NOW
+FB14 ARMENIAN SMALL LIGATURE MEN ECH
+FB15 ARMENIAN SMALL LIGATURE MEN INI
+FB16 ARMENIAN SMALL LIGATURE VEW NOW
+FB17 ARMENIAN SMALL LIGATURE MEN XEH
+FB1D HEBREW LETTER YOD WITH HIRIQ
+FB1E HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F HEBREW LIGATURE YIDDISH YOD YOD PATAH
+FB20 HEBREW LETTER ALTERNATIVE AYIN
+FB21 HEBREW LETTER WIDE ALEF
+FB22 HEBREW LETTER WIDE DALET
+FB23 HEBREW LETTER WIDE HE
+FB24 HEBREW LETTER WIDE KAF
+FB25 HEBREW LETTER WIDE LAMED
+FB26 HEBREW LETTER WIDE FINAL MEM
+FB27 HEBREW LETTER WIDE RESH
+FB28 HEBREW LETTER WIDE TAV
+FB29 HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A HEBREW LETTER SHIN WITH SHIN DOT
+FB2B HEBREW LETTER SHIN WITH SIN DOT
+FB2C HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+FB2D HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+FB2E HEBREW LETTER ALEF WITH PATAH
+FB2F HEBREW LETTER ALEF WITH QAMATS
+FB30 HEBREW LETTER ALEF WITH MAPIQ
+FB31 HEBREW LETTER BET WITH DAGESH
+FB32 HEBREW LETTER GIMEL WITH DAGESH
+FB33 HEBREW LETTER DALET WITH DAGESH
+FB34 HEBREW LETTER HE WITH MAPIQ
+FB35 HEBREW LETTER VAV WITH DAGESH
+FB36 HEBREW LETTER ZAYIN WITH DAGESH
+FB38 HEBREW LETTER TET WITH DAGESH
+FB39 HEBREW LETTER YOD WITH DAGESH
+FB3A HEBREW LETTER FINAL KAF WITH DAGESH
+FB3B HEBREW LETTER KAF WITH DAGESH
+FB3C HEBREW LETTER LAMED WITH DAGESH
+FB3E HEBREW LETTER MEM WITH DAGESH
+FB40 HEBREW LETTER NUN WITH DAGESH
+FB41 HEBREW LETTER SAMEKH WITH DAGESH
+FB43 HEBREW LETTER FINAL PE WITH DAGESH
+FB44 HEBREW LETTER PE WITH DAGESH
+FB46 HEBREW LETTER TSADI WITH DAGESH
+FB47 HEBREW LETTER QOF WITH DAGESH
+FB48 HEBREW LETTER RESH WITH DAGESH
+FB49 HEBREW LETTER SHIN WITH DAGESH
+FB4A HEBREW LETTER TAV WITH DAGESH
+FB4B HEBREW LETTER VAV WITH HOLAM
+FB4C HEBREW LETTER BET WITH RAFE
+FB4D HEBREW LETTER KAF WITH RAFE
+FB4E HEBREW LETTER PE WITH RAFE
+FB4F HEBREW LIGATURE ALEF LAMED
+FB50 ARABIC LETTER ALEF WASLA ISOLATED FORM
+FB51 ARABIC LETTER ALEF WASLA FINAL FORM
+FB52 ARABIC LETTER BEEH ISOLATED FORM
+FB53 ARABIC LETTER BEEH FINAL FORM
+FB54 ARABIC LETTER BEEH INITIAL FORM
+FB55 ARABIC LETTER BEEH MEDIAL FORM
+FB56 ARABIC LETTER PEH ISOLATED FORM
+FB57 ARABIC LETTER PEH FINAL FORM
+FB58 ARABIC LETTER PEH INITIAL FORM
+FB59 ARABIC LETTER PEH MEDIAL FORM
+FB5A ARABIC LETTER BEHEH ISOLATED FORM
+FB5B ARABIC LETTER BEHEH FINAL FORM
+FB5C ARABIC LETTER BEHEH INITIAL FORM
+FB5D ARABIC LETTER BEHEH MEDIAL FORM
+FB5E ARABIC LETTER TTEHEH ISOLATED FORM
+FB5F ARABIC LETTER TTEHEH FINAL FORM
+FB60 ARABIC LETTER TTEHEH INITIAL FORM
+FB61 ARABIC LETTER TTEHEH MEDIAL FORM
+FB62 ARABIC LETTER TEHEH ISOLATED FORM
+FB63 ARABIC LETTER TEHEH FINAL FORM
+FB64 ARABIC LETTER TEHEH INITIAL FORM
+FB65 ARABIC LETTER TEHEH MEDIAL FORM
+FB66 ARABIC LETTER TTEH ISOLATED FORM
+FB67 ARABIC LETTER TTEH FINAL FORM
+FB68 ARABIC LETTER TTEH INITIAL FORM
+FB69 ARABIC LETTER TTEH MEDIAL FORM
+FB6A ARABIC LETTER VEH ISOLATED FORM
+FB6B ARABIC LETTER VEH FINAL FORM
+FB6C ARABIC LETTER VEH INITIAL FORM
+FB6D ARABIC LETTER VEH MEDIAL FORM
+FB6E ARABIC LETTER PEHEH ISOLATED FORM
+FB6F ARABIC LETTER PEHEH FINAL FORM
+FB70 ARABIC LETTER PEHEH INITIAL FORM
+FB71 ARABIC LETTER PEHEH MEDIAL FORM
+FB72 ARABIC LETTER DYEH ISOLATED FORM
+FB73 ARABIC LETTER DYEH FINAL FORM
+FB74 ARABIC LETTER DYEH INITIAL FORM
+FB75 ARABIC LETTER DYEH MEDIAL FORM
+FB76 ARABIC LETTER NYEH ISOLATED FORM
+FB77 ARABIC LETTER NYEH FINAL FORM
+FB78 ARABIC LETTER NYEH INITIAL FORM
+FB79 ARABIC LETTER NYEH MEDIAL FORM
+FB7A ARABIC LETTER TCHEH ISOLATED FORM
+FB7B ARABIC LETTER TCHEH FINAL FORM
+FB7C ARABIC LETTER TCHEH INITIAL FORM
+FB7D ARABIC LETTER TCHEH MEDIAL FORM
+FB7E ARABIC LETTER TCHEHEH ISOLATED FORM
+FB7F ARABIC LETTER TCHEHEH FINAL FORM
+FB80 ARABIC LETTER TCHEHEH INITIAL FORM
+FB81 ARABIC LETTER TCHEHEH MEDIAL FORM
+FB82 ARABIC LETTER DDAHAL ISOLATED FORM
+FB83 ARABIC LETTER DDAHAL FINAL FORM
+FB84 ARABIC LETTER DAHAL ISOLATED FORM
+FB85 ARABIC LETTER DAHAL FINAL FORM
+FB86 ARABIC LETTER DUL ISOLATED FORM
+FB87 ARABIC LETTER DUL FINAL FORM
+FB88 ARABIC LETTER DDAL ISOLATED FORM
+FB89 ARABIC LETTER DDAL FINAL FORM
+FB8A ARABIC LETTER JEH ISOLATED FORM
+FB8B ARABIC LETTER JEH FINAL FORM
+FB8C ARABIC LETTER RREH ISOLATED FORM
+FB8D ARABIC LETTER RREH FINAL FORM
+FB8E ARABIC LETTER KEHEH ISOLATED FORM
+FB8F ARABIC LETTER KEHEH FINAL FORM
+FB90 ARABIC LETTER KEHEH INITIAL FORM
+FB91 ARABIC LETTER KEHEH MEDIAL FORM
+FB92 ARABIC LETTER GAF ISOLATED FORM
+FB93 ARABIC LETTER GAF FINAL FORM
+FB94 ARABIC LETTER GAF INITIAL FORM
+FB95 ARABIC LETTER GAF MEDIAL FORM
+FB96 ARABIC LETTER GUEH ISOLATED FORM
+FB97 ARABIC LETTER GUEH FINAL FORM
+FB98 ARABIC LETTER GUEH INITIAL FORM
+FB99 ARABIC LETTER GUEH MEDIAL FORM
+FB9A ARABIC LETTER NGOEH ISOLATED FORM
+FB9B ARABIC LETTER NGOEH FINAL FORM
+FB9C ARABIC LETTER NGOEH INITIAL FORM
+FB9D ARABIC LETTER NGOEH MEDIAL FORM
+FB9E ARABIC LETTER NOON GHUNNA ISOLATED FORM
+FB9F ARABIC LETTER NOON GHUNNA FINAL FORM
+FBA0 ARABIC LETTER RNOON ISOLATED FORM
+FBA1 ARABIC LETTER RNOON FINAL FORM
+FBA2 ARABIC LETTER RNOON INITIAL FORM
+FBA3 ARABIC LETTER RNOON MEDIAL FORM
+FBA4 ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+FBA5 ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+FBA6 ARABIC LETTER HEH GOAL ISOLATED FORM
+FBA7 ARABIC LETTER HEH GOAL FINAL FORM
+FBA8 ARABIC LETTER HEH GOAL INITIAL FORM
+FBA9 ARABIC LETTER HEH GOAL MEDIAL FORM
+FBAA ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+FBAB ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+FBAC ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+FBAD ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+FBAE ARABIC LETTER YEH BARREE ISOLATED FORM
+FBAF ARABIC LETTER YEH BARREE FINAL FORM
+FBB0 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+FBB1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3 ARABIC LETTER NG ISOLATED FORM
+FBD4 ARABIC LETTER NG FINAL FORM
+FBD5 ARABIC LETTER NG INITIAL FORM
+FBD6 ARABIC LETTER NG MEDIAL FORM
+FBD7 ARABIC LETTER U ISOLATED FORM
+FBD8 ARABIC LETTER U FINAL FORM
+FBD9 ARABIC LETTER OE ISOLATED FORM
+FBDA ARABIC LETTER OE FINAL FORM
+FBDB ARABIC LETTER YU ISOLATED FORM
+FBDC ARABIC LETTER YU FINAL FORM
+FBDD ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+FBDE ARABIC LETTER VE ISOLATED FORM
+FBDF ARABIC LETTER VE FINAL FORM
+FBE0 ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+FBE1 ARABIC LETTER KIRGHIZ OE FINAL FORM
+FBE2 ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+FBE3 ARABIC LETTER KIRGHIZ YU FINAL FORM
+FBE4 ARABIC LETTER E ISOLATED FORM
+FBE5 ARABIC LETTER E FINAL FORM
+FBE6 ARABIC LETTER E INITIAL FORM
+FBE7 ARABIC LETTER E MEDIAL FORM
+FBE8 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+FBE9 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+FBEA ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+FBEB ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+FBEC ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+FBED ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+FBEE ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+FBEF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+FBF0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+FBF1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+FBF2 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+FBF3 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+FBF4 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+FBF5 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+FBF6 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+FBF7 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+FBF8 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+FBF9 ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FBFA ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FBFB ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+FBFC ARABIC LETTER FARSI YEH ISOLATED FORM
+FBFD ARABIC LETTER FARSI YEH FINAL FORM
+FBFE ARABIC LETTER FARSI YEH INITIAL FORM
+FBFF ARABIC LETTER FARSI YEH MEDIAL FORM
+FC00 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+FC01 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+FC02 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+FC03 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FC04 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+FC05 ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+FC06 ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+FC07 ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+FC08 ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+FC09 ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+FC0A ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+FC0B ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+FC0C ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+FC0D ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+FC0E ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+FC0F ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+FC10 ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+FC11 ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+FC12 ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+FC13 ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+FC14 ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+FC15 ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+FC16 ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+FC17 ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+FC18 ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+FC19 ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+FC1A ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+FC1B ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+FC1C ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+FC1D ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+FC1E ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+FC1F ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+FC20 ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+FC21 ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+FC22 ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+FC23 ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+FC24 ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+FC25 ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+FC26 ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+FC27 ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+FC28 ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+FC29 ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+FC2A ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+FC2B ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+FC2C ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+FC2D ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+FC2E ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+FC2F ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+FC30 ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+FC31 ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+FC32 ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+FC33 ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+FC34 ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+FC35 ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+FC36 ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+FC37 ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+FC38 ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+FC39 ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+FC3A ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+FC3B ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+FC3C ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+FC3D ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+FC3E ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+FC3F ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+FC40 ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+FC41 ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+FC42 ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+FC43 ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+FC44 ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+FC45 ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+FC46 ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+FC47 ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+FC48 ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+FC49 ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+FC4A ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+FC4B ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+FC4C ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+FC4D ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+FC4E ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+FC4F ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+FC50 ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+FC51 ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+FC52 ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+FC53 ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+FC54 ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+FC55 ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+FC56 ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+FC57 ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+FC58 ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+FC59 ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+FC5A ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+FC5B ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5C ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5D ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5E ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+FC5F ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+FC60 ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+FC61 ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+FC62 ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+FC63 ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC64 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+FC65 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+FC66 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+FC67 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+FC68 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FC69 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+FC6A ARABIC LIGATURE BEH WITH REH FINAL FORM
+FC6B ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+FC6C ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+FC6D ARABIC LIGATURE BEH WITH NOON FINAL FORM
+FC6E ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+FC6F ARABIC LIGATURE BEH WITH YEH FINAL FORM
+FC70 ARABIC LIGATURE TEH WITH REH FINAL FORM
+FC71 ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+FC72 ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+FC73 ARABIC LIGATURE TEH WITH NOON FINAL FORM
+FC74 ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+FC75 ARABIC LIGATURE TEH WITH YEH FINAL FORM
+FC76 ARABIC LIGATURE THEH WITH REH FINAL FORM
+FC77 ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+FC78 ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+FC79 ARABIC LIGATURE THEH WITH NOON FINAL FORM
+FC7A ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+FC7B ARABIC LIGATURE THEH WITH YEH FINAL FORM
+FC7C ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+FC7D ARABIC LIGATURE FEH WITH YEH FINAL FORM
+FC7E ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+FC7F ARABIC LIGATURE QAF WITH YEH FINAL FORM
+FC80 ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+FC81 ARABIC LIGATURE KAF WITH LAM FINAL FORM
+FC82 ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+FC83 ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+FC84 ARABIC LIGATURE KAF WITH YEH FINAL FORM
+FC85 ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+FC86 ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+FC87 ARABIC LIGATURE LAM WITH YEH FINAL FORM
+FC88 ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+FC89 ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+FC8A ARABIC LIGATURE NOON WITH REH FINAL FORM
+FC8B ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+FC8C ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+FC8D ARABIC LIGATURE NOON WITH NOON FINAL FORM
+FC8E ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+FC8F ARABIC LIGATURE NOON WITH YEH FINAL FORM
+FC90 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+FC91 ARABIC LIGATURE YEH WITH REH FINAL FORM
+FC92 ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+FC93 ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+FC94 ARABIC LIGATURE YEH WITH NOON FINAL FORM
+FC95 ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+FC96 ARABIC LIGATURE YEH WITH YEH FINAL FORM
+FC97 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+FC98 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+FC99 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+FC9A ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+FC9B ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+FC9C ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+FC9D ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+FC9E ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+FC9F ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+FCA0 ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+FCA1 ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+FCA2 ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+FCA3 ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+FCA4 ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+FCA5 ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+FCA6 ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+FCA7 ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+FCA8 ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+FCA9 ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+FCAA ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+FCAB ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+FCAC ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+FCAD ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+FCAE ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+FCAF ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+FCB0 ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+FCB1 ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+FCB2 ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+FCB3 ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+FCB4 ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+FCB5 ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+FCB6 ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+FCB7 ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+FCB8 ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+FCB9 ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+FCBA ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+FCBB ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+FCBC ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+FCBD ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+FCBE ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+FCBF ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+FCC0 ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+FCC1 ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+FCC2 ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+FCC3 ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+FCC4 ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+FCC5 ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+FCC6 ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+FCC7 ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+FCC8 ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+FCC9 ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+FCCA ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+FCCB ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+FCCC ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+FCCD ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+FCCE ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+FCCF ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+FCD0 ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+FCD1 ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+FCD2 ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+FCD3 ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+FCD4 ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+FCD5 ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+FCD6 ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+FCD7 ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+FCD8 ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+FCD9 ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+FCDA ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+FCDB ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+FCDC ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+FCDD ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+FCDE ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+FCDF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+FCE0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+FCE1 ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+FCE2 ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+FCE3 ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+FCE4 ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+FCE5 ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+FCE6 ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+FCE7 ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+FCE8 ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+FCE9 ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+FCEA ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+FCEB ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+FCEC ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+FCED ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+FCEE ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+FCEF ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+FCF0 ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+FCF1 ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+FCF2 ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+FCF3 ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+FCF4 ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+FCF5 ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+FCF6 ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+FCF7 ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+FCF8 ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+FCF9 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+FCFA ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+FCFB ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFC ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+FCFD ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFE ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+FCFF ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+FD00 ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+FD01 ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+FD02 ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+FD03 ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+FD04 ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+FD05 ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+FD06 ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+FD07 ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+FD08 ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+FD09 ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+FD0A ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+FD0B ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+FD0C ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+FD0D ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+FD0E ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+FD0F ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+FD10 ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+FD11 ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+FD12 ARABIC LIGATURE TAH WITH YEH FINAL FORM
+FD13 ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+FD14 ARABIC LIGATURE AIN WITH YEH FINAL FORM
+FD15 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+FD16 ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+FD17 ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+FD18 ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+FD19 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+FD1A ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+FD1B ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+FD1C ARABIC LIGATURE HAH WITH YEH FINAL FORM
+FD1D ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+FD1E ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+FD1F ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+FD20 ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+FD21 ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+FD22 ARABIC LIGATURE SAD WITH YEH FINAL FORM
+FD23 ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+FD24 ARABIC LIGATURE DAD WITH YEH FINAL FORM
+FD25 ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+FD26 ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+FD27 ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+FD28 ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+FD29 ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+FD2A ARABIC LIGATURE SEEN WITH REH FINAL FORM
+FD2B ARABIC LIGATURE SAD WITH REH FINAL FORM
+FD2C ARABIC LIGATURE DAD WITH REH FINAL FORM
+FD2D ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+FD2E ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+FD2F ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+FD30 ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+FD31 ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+FD32 ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+FD33 ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+FD34 ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+FD35 ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+FD36 ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+FD37 ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+FD38 ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+FD39 ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+FD3A ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+FD3B ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+FD3C ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+FD3D ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD3E ORNATE LEFT PARENTHESIS
+FD3F ORNATE RIGHT PARENTHESIS
+FD50 ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+FD51 ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+FD52 ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+FD53 ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+FD54 ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+FD55 ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+FD56 ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+FD57 ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+FD58 ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+FD59 ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+FD5A ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+FD5B ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD5C ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+FD5D ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+FD5E ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD5F ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+FD60 ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+FD61 ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+FD62 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+FD63 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+FD64 ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+FD65 ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+FD66 ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+FD67 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+FD68 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+FD69 ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+FD6A ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+FD6B ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+FD6C ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+FD6D ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+FD6E ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD6F ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+FD70 ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+FD71 ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+FD72 ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+FD73 ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+FD74 ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+FD75 ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+FD76 ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+FD77 ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+FD78 ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD79 ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+FD7A ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+FD7B ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD7C ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+FD7D ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+FD7E ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+FD7F ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+FD80 ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+FD81 ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+FD82 ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD83 ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+FD84 ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+FD85 ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+FD86 ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+FD87 ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+FD88 ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+FD89 ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+FD8A ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+FD8B ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+FD8C ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+FD8D ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+FD8E ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+FD8F ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92 ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+FD93 ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+FD94 ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+FD95 ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+FD96 ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD97 ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+FD98 ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+FD99 ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD9A ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+FD9B ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD9C ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+FD9D ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+FD9E ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+FD9F ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+FDA0 ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FDA1 ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+FDA2 ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA3 ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+FDA4 ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA5 ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+FDA6 ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FDA7 ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA8 ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA9 ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+FDAA ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+FDAB ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+FDAC ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+FDAD ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+FDAE ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+FDAF ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+FDB0 ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+FDB1 ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+FDB2 ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+FDB3 ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+FDB4 ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+FDB5 ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+FDB6 ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+FDB7 ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+FDB8 ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+FDB9 ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+FDBA ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+FDBB ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+FDBC ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+FDBD ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+FDBE ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+FDBF ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+FDC0 ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+FDC1 ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+FDC2 ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+FDC3 ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+FDC4 ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+FDC5 ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+FDC6 ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+FDC7 ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0 ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF1 ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM
+FDF3 ARABIC LIGATURE AKBAR ISOLATED FORM
+FDF4 ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+FDF5 ARABIC LIGATURE SALAM ISOLATED FORM
+FDF6 ARABIC LIGATURE RASOUL ISOLATED FORM
+FDF7 ARABIC LIGATURE ALAYHE ISOLATED FORM
+FDF8 ARABIC LIGATURE WASALLAM ISOLATED FORM
+FDF9 ARABIC LIGATURE SALLA ISOLATED FORM
+FDFA ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+FDFB ARABIC LIGATURE JALLAJALALOUHOU
+FDFC RIAL SIGN
+FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE00 VARIATION SELECTOR-1
+FE01 VARIATION SELECTOR-2
+FE02 VARIATION SELECTOR-3
+FE03 VARIATION SELECTOR-4
+FE04 VARIATION SELECTOR-5
+FE05 VARIATION SELECTOR-6
+FE06 VARIATION SELECTOR-7
+FE07 VARIATION SELECTOR-8
+FE08 VARIATION SELECTOR-9
+FE09 VARIATION SELECTOR-10
+FE0A VARIATION SELECTOR-11
+FE0B VARIATION SELECTOR-12
+FE0C VARIATION SELECTOR-13
+FE0D VARIATION SELECTOR-14
+FE0E VARIATION SELECTOR-15
+FE0F VARIATION SELECTOR-16
+FE10 PRESENTATION FORM FOR VERTICAL COMMA
+FE11 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
+FE12 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP
+FE13 PRESENTATION FORM FOR VERTICAL COLON
+FE14 PRESENTATION FORM FOR VERTICAL SEMICOLON
+FE15 PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
+FE16 PRESENTATION FORM FOR VERTICAL QUESTION MARK
+FE17 PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+FE18 PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE20 COMBINING LIGATURE LEFT HALF
+FE21 COMBINING LIGATURE RIGHT HALF
+FE22 COMBINING DOUBLE TILDE LEFT HALF
+FE23 COMBINING DOUBLE TILDE RIGHT HALF
+FE24 COMBINING MACRON LEFT HALF
+FE25 COMBINING MACRON RIGHT HALF
+FE26 COMBINING CONJOINING MACRON
+FE30 PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31 PRESENTATION FORM FOR VERTICAL EM DASH
+FE32 PRESENTATION FORM FOR VERTICAL EN DASH
+FE33 PRESENTATION FORM FOR VERTICAL LOW LINE
+FE34 PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35 PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36 PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37 PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38 PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39 PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40 PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41 PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42 PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43 PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45 SESAME DOT
+FE46 WHITE SESAME DOT
+FE47 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49 DASHED OVERLINE
+FE4A CENTRELINE OVERLINE
+FE4B WAVY OVERLINE
+FE4C DOUBLE WAVY OVERLINE
+FE4D DASHED LOW LINE
+FE4E CENTRELINE LOW LINE
+FE4F WAVY LOW LINE
+FE50 SMALL COMMA
+FE51 SMALL IDEOGRAPHIC COMMA
+FE52 SMALL FULL STOP
+FE54 SMALL SEMICOLON
+FE55 SMALL COLON
+FE56 SMALL QUESTION MARK
+FE57 SMALL EXCLAMATION MARK
+FE58 SMALL EM DASH
+FE59 SMALL LEFT PARENTHESIS
+FE5A SMALL RIGHT PARENTHESIS
+FE5B SMALL LEFT CURLY BRACKET
+FE5C SMALL RIGHT CURLY BRACKET
+FE5D SMALL LEFT TORTOISE SHELL BRACKET
+FE5E SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F SMALL NUMBER SIGN
+FE60 SMALL AMPERSAND
+FE61 SMALL ASTERISK
+FE62 SMALL PLUS SIGN
+FE63 SMALL HYPHEN-MINUS
+FE64 SMALL LESS-THAN SIGN
+FE65 SMALL GREATER-THAN SIGN
+FE66 SMALL EQUALS SIGN
+FE68 SMALL REVERSE SOLIDUS
+FE69 SMALL DOLLAR SIGN
+FE6A SMALL PERCENT SIGN
+FE6B SMALL COMMERCIAL AT
+FE70 ARABIC FATHATAN ISOLATED FORM
+FE71 ARABIC TATWEEL WITH FATHATAN ABOVE
+FE72 ARABIC DAMMATAN ISOLATED FORM
+FE73 ARABIC TAIL FRAGMENT
+FE74 ARABIC KASRATAN ISOLATED FORM
+FE76 ARABIC FATHA ISOLATED FORM
+FE77 ARABIC FATHA MEDIAL FORM
+FE78 ARABIC DAMMA ISOLATED FORM
+FE79 ARABIC DAMMA MEDIAL FORM
+FE7A ARABIC KASRA ISOLATED FORM
+FE7B ARABIC KASRA MEDIAL FORM
+FE7C ARABIC SHADDA ISOLATED FORM
+FE7D ARABIC SHADDA MEDIAL FORM
+FE7E ARABIC SUKUN ISOLATED FORM
+FE7F ARABIC SUKUN MEDIAL FORM
+FE80 ARABIC LETTER HAMZA ISOLATED FORM
+FE81 ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+FE82 ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+FE83 ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+FE84 ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+FE85 ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+FE86 ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+FE87 ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+FE88 ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+FE89 ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+FE8A ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+FE8B ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+FE8C ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+FE8D ARABIC LETTER ALEF ISOLATED FORM
+FE8E ARABIC LETTER ALEF FINAL FORM
+FE8F ARABIC LETTER BEH ISOLATED FORM
+FE90 ARABIC LETTER BEH FINAL FORM
+FE91 ARABIC LETTER BEH INITIAL FORM
+FE92 ARABIC LETTER BEH MEDIAL FORM
+FE93 ARABIC LETTER TEH MARBUTA ISOLATED FORM
+FE94 ARABIC LETTER TEH MARBUTA FINAL FORM
+FE95 ARABIC LETTER TEH ISOLATED FORM
+FE96 ARABIC LETTER TEH FINAL FORM
+FE97 ARABIC LETTER TEH INITIAL FORM
+FE98 ARABIC LETTER TEH MEDIAL FORM
+FE99 ARABIC LETTER THEH ISOLATED FORM
+FE9A ARABIC LETTER THEH FINAL FORM
+FE9B ARABIC LETTER THEH INITIAL FORM
+FE9C ARABIC LETTER THEH MEDIAL FORM
+FE9D ARABIC LETTER JEEM ISOLATED FORM
+FE9E ARABIC LETTER JEEM FINAL FORM
+FE9F ARABIC LETTER JEEM INITIAL FORM
+FEA0 ARABIC LETTER JEEM MEDIAL FORM
+FEA1 ARABIC LETTER HAH ISOLATED FORM
+FEA2 ARABIC LETTER HAH FINAL FORM
+FEA3 ARABIC LETTER HAH INITIAL FORM
+FEA4 ARABIC LETTER HAH MEDIAL FORM
+FEA5 ARABIC LETTER KHAH ISOLATED FORM
+FEA6 ARABIC LETTER KHAH FINAL FORM
+FEA7 ARABIC LETTER KHAH INITIAL FORM
+FEA8 ARABIC LETTER KHAH MEDIAL FORM
+FEA9 ARABIC LETTER DAL ISOLATED FORM
+FEAA ARABIC LETTER DAL FINAL FORM
+FEAB ARABIC LETTER THAL ISOLATED FORM
+FEAC ARABIC LETTER THAL FINAL FORM
+FEAD ARABIC LETTER REH ISOLATED FORM
+FEAE ARABIC LETTER REH FINAL FORM
+FEAF ARABIC LETTER ZAIN ISOLATED FORM
+FEB0 ARABIC LETTER ZAIN FINAL FORM
+FEB1 ARABIC LETTER SEEN ISOLATED FORM
+FEB2 ARABIC LETTER SEEN FINAL FORM
+FEB3 ARABIC LETTER SEEN INITIAL FORM
+FEB4 ARABIC LETTER SEEN MEDIAL FORM
+FEB5 ARABIC LETTER SHEEN ISOLATED FORM
+FEB6 ARABIC LETTER SHEEN FINAL FORM
+FEB7 ARABIC LETTER SHEEN INITIAL FORM
+FEB8 ARABIC LETTER SHEEN MEDIAL FORM
+FEB9 ARABIC LETTER SAD ISOLATED FORM
+FEBA ARABIC LETTER SAD FINAL FORM
+FEBB ARABIC LETTER SAD INITIAL FORM
+FEBC ARABIC LETTER SAD MEDIAL FORM
+FEBD ARABIC LETTER DAD ISOLATED FORM
+FEBE ARABIC LETTER DAD FINAL FORM
+FEBF ARABIC LETTER DAD INITIAL FORM
+FEC0 ARABIC LETTER DAD MEDIAL FORM
+FEC1 ARABIC LETTER TAH ISOLATED FORM
+FEC2 ARABIC LETTER TAH FINAL FORM
+FEC3 ARABIC LETTER TAH INITIAL FORM
+FEC4 ARABIC LETTER TAH MEDIAL FORM
+FEC5 ARABIC LETTER ZAH ISOLATED FORM
+FEC6 ARABIC LETTER ZAH FINAL FORM
+FEC7 ARABIC LETTER ZAH INITIAL FORM
+FEC8 ARABIC LETTER ZAH MEDIAL FORM
+FEC9 ARABIC LETTER AIN ISOLATED FORM
+FECA ARABIC LETTER AIN FINAL FORM
+FECB ARABIC LETTER AIN INITIAL FORM
+FECC ARABIC LETTER AIN MEDIAL FORM
+FECD ARABIC LETTER GHAIN ISOLATED FORM
+FECE ARABIC LETTER GHAIN FINAL FORM
+FECF ARABIC LETTER GHAIN INITIAL FORM
+FED0 ARABIC LETTER GHAIN MEDIAL FORM
+FED1 ARABIC LETTER FEH ISOLATED FORM
+FED2 ARABIC LETTER FEH FINAL FORM
+FED3 ARABIC LETTER FEH INITIAL FORM
+FED4 ARABIC LETTER FEH MEDIAL FORM
+FED5 ARABIC LETTER QAF ISOLATED FORM
+FED6 ARABIC LETTER QAF FINAL FORM
+FED7 ARABIC LETTER QAF INITIAL FORM
+FED8 ARABIC LETTER QAF MEDIAL FORM
+FED9 ARABIC LETTER KAF ISOLATED FORM
+FEDA ARABIC LETTER KAF FINAL FORM
+FEDB ARABIC LETTER KAF INITIAL FORM
+FEDC ARABIC LETTER KAF MEDIAL FORM
+FEDD ARABIC LETTER LAM ISOLATED FORM
+FEDE ARABIC LETTER LAM FINAL FORM
+FEDF ARABIC LETTER LAM INITIAL FORM
+FEE0 ARABIC LETTER LAM MEDIAL FORM
+FEE1 ARABIC LETTER MEEM ISOLATED FORM
+FEE2 ARABIC LETTER MEEM FINAL FORM
+FEE3 ARABIC LETTER MEEM INITIAL FORM
+FEE4 ARABIC LETTER MEEM MEDIAL FORM
+FEE5 ARABIC LETTER NOON ISOLATED FORM
+FEE6 ARABIC LETTER NOON FINAL FORM
+FEE7 ARABIC LETTER NOON INITIAL FORM
+FEE8 ARABIC LETTER NOON MEDIAL FORM
+FEE9 ARABIC LETTER HEH ISOLATED FORM
+FEEA ARABIC LETTER HEH FINAL FORM
+FEEB ARABIC LETTER HEH INITIAL FORM
+FEEC ARABIC LETTER HEH MEDIAL FORM
+FEED ARABIC LETTER WAW ISOLATED FORM
+FEEE ARABIC LETTER WAW FINAL FORM
+FEEF ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+FEF0 ARABIC LETTER ALEF MAKSURA FINAL FORM
+FEF1 ARABIC LETTER YEH ISOLATED FORM
+FEF2 ARABIC LETTER YEH FINAL FORM
+FEF3 ARABIC LETTER YEH INITIAL FORM
+FEF4 ARABIC LETTER YEH MEDIAL FORM
+FEF5 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+FEF6 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+FEF7 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+FEF8 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+FEF9 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+FEFA ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+FEFB ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+FEFC ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FEFF ZERO WIDTH NO-BREAK SPACE
+FF01 FULLWIDTH EXCLAMATION MARK
+FF02 FULLWIDTH QUOTATION MARK
+FF03 FULLWIDTH NUMBER SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FF05 FULLWIDTH PERCENT SIGN
+FF06 FULLWIDTH AMPERSAND
+FF07 FULLWIDTH APOSTROPHE
+FF08 FULLWIDTH LEFT PARENTHESIS
+FF09 FULLWIDTH RIGHT PARENTHESIS
+FF0A FULLWIDTH ASTERISK
+FF0B FULLWIDTH PLUS SIGN
+FF0C FULLWIDTH COMMA
+FF0D FULLWIDTH HYPHEN-MINUS
+FF0E FULLWIDTH FULL STOP
+FF0F FULLWIDTH SOLIDUS
+FF10 FULLWIDTH DIGIT ZERO
+FF11 FULLWIDTH DIGIT ONE
+FF12 FULLWIDTH DIGIT TWO
+FF13 FULLWIDTH DIGIT THREE
+FF14 FULLWIDTH DIGIT FOUR
+FF15 FULLWIDTH DIGIT FIVE
+FF16 FULLWIDTH DIGIT SIX
+FF17 FULLWIDTH DIGIT SEVEN
+FF18 FULLWIDTH DIGIT EIGHT
+FF19 FULLWIDTH DIGIT NINE
+FF1A FULLWIDTH COLON
+FF1B FULLWIDTH SEMICOLON
+FF1C FULLWIDTH LESS-THAN SIGN
+FF1D FULLWIDTH EQUALS SIGN
+FF1E FULLWIDTH GREATER-THAN SIGN
+FF1F FULLWIDTH QUESTION MARK
+FF20 FULLWIDTH COMMERCIAL AT
+FF21 FULLWIDTH LATIN CAPITAL LETTER A
+FF22 FULLWIDTH LATIN CAPITAL LETTER B
+FF23 FULLWIDTH LATIN CAPITAL LETTER C
+FF24 FULLWIDTH LATIN CAPITAL LETTER D
+FF25 FULLWIDTH LATIN CAPITAL LETTER E
+FF26 FULLWIDTH LATIN CAPITAL LETTER F
+FF27 FULLWIDTH LATIN CAPITAL LETTER G
+FF28 FULLWIDTH LATIN CAPITAL LETTER H
+FF29 FULLWIDTH LATIN CAPITAL LETTER I
+FF2A FULLWIDTH LATIN CAPITAL LETTER J
+FF2B FULLWIDTH LATIN CAPITAL LETTER K
+FF2C FULLWIDTH LATIN CAPITAL LETTER L
+FF2D FULLWIDTH LATIN CAPITAL LETTER M
+FF2E FULLWIDTH LATIN CAPITAL LETTER N
+FF2F FULLWIDTH LATIN CAPITAL LETTER O
+FF30 FULLWIDTH LATIN CAPITAL LETTER P
+FF31 FULLWIDTH LATIN CAPITAL LETTER Q
+FF32 FULLWIDTH LATIN CAPITAL LETTER R
+FF33 FULLWIDTH LATIN CAPITAL LETTER S
+FF34 FULLWIDTH LATIN CAPITAL LETTER T
+FF35 FULLWIDTH LATIN CAPITAL LETTER U
+FF36 FULLWIDTH LATIN CAPITAL LETTER V
+FF37 FULLWIDTH LATIN CAPITAL LETTER W
+FF38 FULLWIDTH LATIN CAPITAL LETTER X
+FF39 FULLWIDTH LATIN CAPITAL LETTER Y
+FF3A FULLWIDTH LATIN CAPITAL LETTER Z
+FF3B FULLWIDTH LEFT SQUARE BRACKET
+FF3C FULLWIDTH REVERSE SOLIDUS
+FF3D FULLWIDTH RIGHT SQUARE BRACKET
+FF3E FULLWIDTH CIRCUMFLEX ACCENT
+FF3F FULLWIDTH LOW LINE
+FF40 FULLWIDTH GRAVE ACCENT
+FF41 FULLWIDTH LATIN SMALL LETTER A
+FF42 FULLWIDTH LATIN SMALL LETTER B
+FF43 FULLWIDTH LATIN SMALL LETTER C
+FF44 FULLWIDTH LATIN SMALL LETTER D
+FF45 FULLWIDTH LATIN SMALL LETTER E
+FF46 FULLWIDTH LATIN SMALL LETTER F
+FF47 FULLWIDTH LATIN SMALL LETTER G
+FF48 FULLWIDTH LATIN SMALL LETTER H
+FF49 FULLWIDTH LATIN SMALL LETTER I
+FF4A FULLWIDTH LATIN SMALL LETTER J
+FF4B FULLWIDTH LATIN SMALL LETTER K
+FF4C FULLWIDTH LATIN SMALL LETTER L
+FF4D FULLWIDTH LATIN SMALL LETTER M
+FF4E FULLWIDTH LATIN SMALL LETTER N
+FF4F FULLWIDTH LATIN SMALL LETTER O
+FF50 FULLWIDTH LATIN SMALL LETTER P
+FF51 FULLWIDTH LATIN SMALL LETTER Q
+FF52 FULLWIDTH LATIN SMALL LETTER R
+FF53 FULLWIDTH LATIN SMALL LETTER S
+FF54 FULLWIDTH LATIN SMALL LETTER T
+FF55 FULLWIDTH LATIN SMALL LETTER U
+FF56 FULLWIDTH LATIN SMALL LETTER V
+FF57 FULLWIDTH LATIN SMALL LETTER W
+FF58 FULLWIDTH LATIN SMALL LETTER X
+FF59 FULLWIDTH LATIN SMALL LETTER Y
+FF5A FULLWIDTH LATIN SMALL LETTER Z
+FF5B FULLWIDTH LEFT CURLY BRACKET
+FF5C FULLWIDTH VERTICAL LINE
+FF5D FULLWIDTH RIGHT CURLY BRACKET
+FF5E FULLWIDTH TILDE
+FF5F FULLWIDTH LEFT WHITE PARENTHESIS
+FF60 FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61 HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62 HALFWIDTH LEFT CORNER BRACKET
+FF63 HALFWIDTH RIGHT CORNER BRACKET
+FF64 HALFWIDTH IDEOGRAPHIC COMMA
+FF65 HALFWIDTH KATAKANA MIDDLE DOT
+FF66 HALFWIDTH KATAKANA LETTER WO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71 HALFWIDTH KATAKANA LETTER A
+FF72 HALFWIDTH KATAKANA LETTER I
+FF73 HALFWIDTH KATAKANA LETTER U
+FF74 HALFWIDTH KATAKANA LETTER E
+FF75 HALFWIDTH KATAKANA LETTER O
+FF76 HALFWIDTH KATAKANA LETTER KA
+FF77 HALFWIDTH KATAKANA LETTER KI
+FF78 HALFWIDTH KATAKANA LETTER KU
+FF79 HALFWIDTH KATAKANA LETTER KE
+FF7A HALFWIDTH KATAKANA LETTER KO
+FF7B HALFWIDTH KATAKANA LETTER SA
+FF7C HALFWIDTH KATAKANA LETTER SI
+FF7D HALFWIDTH KATAKANA LETTER SU
+FF7E HALFWIDTH KATAKANA LETTER SE
+FF7F HALFWIDTH KATAKANA LETTER SO
+FF80 HALFWIDTH KATAKANA LETTER TA
+FF81 HALFWIDTH KATAKANA LETTER TI
+FF82 HALFWIDTH KATAKANA LETTER TU
+FF83 HALFWIDTH KATAKANA LETTER TE
+FF84 HALFWIDTH KATAKANA LETTER TO
+FF85 HALFWIDTH KATAKANA LETTER NA
+FF86 HALFWIDTH KATAKANA LETTER NI
+FF87 HALFWIDTH KATAKANA LETTER NU
+FF88 HALFWIDTH KATAKANA LETTER NE
+FF89 HALFWIDTH KATAKANA LETTER NO
+FF8A HALFWIDTH KATAKANA LETTER HA
+FF8B HALFWIDTH KATAKANA LETTER HI
+FF8C HALFWIDTH KATAKANA LETTER HU
+FF8D HALFWIDTH KATAKANA LETTER HE
+FF8E HALFWIDTH KATAKANA LETTER HO
+FF8F HALFWIDTH KATAKANA LETTER MA
+FF90 HALFWIDTH KATAKANA LETTER MI
+FF91 HALFWIDTH KATAKANA LETTER MU
+FF92 HALFWIDTH KATAKANA LETTER ME
+FF93 HALFWIDTH KATAKANA LETTER MO
+FF94 HALFWIDTH KATAKANA LETTER YA
+FF95 HALFWIDTH KATAKANA LETTER YU
+FF96 HALFWIDTH KATAKANA LETTER YO
+FF97 HALFWIDTH KATAKANA LETTER RA
+FF98 HALFWIDTH KATAKANA LETTER RI
+FF99 HALFWIDTH KATAKANA LETTER RU
+FF9A HALFWIDTH KATAKANA LETTER RE
+FF9B HALFWIDTH KATAKANA LETTER RO
+FF9C HALFWIDTH KATAKANA LETTER WA
+FF9D HALFWIDTH KATAKANA LETTER N
+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK
+FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0 HALFWIDTH HANGUL FILLER
+FFA1 HALFWIDTH HANGUL LETTER KIYEOK
+FFA2 HALFWIDTH HANGUL LETTER SSANGKIYEOK
+FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+FFA4 HALFWIDTH HANGUL LETTER NIEUN
+FFA5 HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+FFA6 HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+FFA7 HALFWIDTH HANGUL LETTER TIKEUT
+FFA8 HALFWIDTH HANGUL LETTER SSANGTIKEUT
+FFA9 HALFWIDTH HANGUL LETTER RIEUL
+FFAA HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+FFAB HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+FFAC HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+FFAD HALFWIDTH HANGUL LETTER RIEUL-SIOS
+FFAE HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+FFAF HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+FFB0 HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+FFB1 HALFWIDTH HANGUL LETTER MIEUM
+FFB2 HALFWIDTH HANGUL LETTER PIEUP
+FFB3 HALFWIDTH HANGUL LETTER SSANGPIEUP
+FFB4 HALFWIDTH HANGUL LETTER PIEUP-SIOS
+FFB5 HALFWIDTH HANGUL LETTER SIOS
+FFB6 HALFWIDTH HANGUL LETTER SSANGSIOS
+FFB7 HALFWIDTH HANGUL LETTER IEUNG
+FFB8 HALFWIDTH HANGUL LETTER CIEUC
+FFB9 HALFWIDTH HANGUL LETTER SSANGCIEUC
+FFBA HALFWIDTH HANGUL LETTER CHIEUCH
+FFBB HALFWIDTH HANGUL LETTER KHIEUKH
+FFBC HALFWIDTH HANGUL LETTER THIEUTH
+FFBD HALFWIDTH HANGUL LETTER PHIEUPH
+FFBE HALFWIDTH HANGUL LETTER HIEUH
+FFC2 HALFWIDTH HANGUL LETTER A
+FFC3 HALFWIDTH HANGUL LETTER AE
+FFC4 HALFWIDTH HANGUL LETTER YA
+FFC5 HALFWIDTH HANGUL LETTER YAE
+FFC6 HALFWIDTH HANGUL LETTER EO
+FFC7 HALFWIDTH HANGUL LETTER E
+FFCA HALFWIDTH HANGUL LETTER YEO
+FFCB HALFWIDTH HANGUL LETTER YE
+FFCC HALFWIDTH HANGUL LETTER O
+FFCD HALFWIDTH HANGUL LETTER WA
+FFCE HALFWIDTH HANGUL LETTER WAE
+FFCF HALFWIDTH HANGUL LETTER OE
+FFD2 HALFWIDTH HANGUL LETTER YO
+FFD3 HALFWIDTH HANGUL LETTER U
+FFD4 HALFWIDTH HANGUL LETTER WEO
+FFD5 HALFWIDTH HANGUL LETTER WE
+FFD6 HALFWIDTH HANGUL LETTER WI
+FFD7 HALFWIDTH HANGUL LETTER YU
+FFDA HALFWIDTH HANGUL LETTER EU
+FFDB HALFWIDTH HANGUL LETTER YI
+FFDC HALFWIDTH HANGUL LETTER I
+FFE0 FULLWIDTH CENT SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE2 FULLWIDTH NOT SIGN
+FFE3 FULLWIDTH MACRON
+FFE4 FULLWIDTH BROKEN BAR
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN
+FFE8 HALFWIDTH FORMS LIGHT VERTICAL
+FFE9 HALFWIDTH LEFTWARDS ARROW
+FFEA HALFWIDTH UPWARDS ARROW
+FFEB HALFWIDTH RIGHTWARDS ARROW
+FFEC HALFWIDTH DOWNWARDS ARROW
+FFED HALFWIDTH BLACK SQUARE
+FFEE HALFWIDTH WHITE CIRCLE
+FFF9 INTERLINEAR ANNOTATION ANCHOR
+FFFA INTERLINEAR ANNOTATION SEPARATOR
+FFFB INTERLINEAR ANNOTATION TERMINATOR
+FFFC OBJECT REPLACEMENT CHARACTER
+FFFD REPLACEMENT CHARACTER
+10000 LINEAR B SYLLABLE B008 A
+10001 LINEAR B SYLLABLE B038 E
+10002 LINEAR B SYLLABLE B028 I
+10003 LINEAR B SYLLABLE B061 O
+10004 LINEAR B SYLLABLE B010 U
+10005 LINEAR B SYLLABLE B001 DA
+10006 LINEAR B SYLLABLE B045 DE
+10007 LINEAR B SYLLABLE B007 DI
+10008 LINEAR B SYLLABLE B014 DO
+10009 LINEAR B SYLLABLE B051 DU
+1000A LINEAR B SYLLABLE B057 JA
+1000B LINEAR B SYLLABLE B046 JE
+1000D LINEAR B SYLLABLE B036 JO
+1000E LINEAR B SYLLABLE B065 JU
+1000F LINEAR B SYLLABLE B077 KA
+10010 LINEAR B SYLLABLE B044 KE
+10011 LINEAR B SYLLABLE B067 KI
+10012 LINEAR B SYLLABLE B070 KO
+10013 LINEAR B SYLLABLE B081 KU
+10014 LINEAR B SYLLABLE B080 MA
+10015 LINEAR B SYLLABLE B013 ME
+10016 LINEAR B SYLLABLE B073 MI
+10017 LINEAR B SYLLABLE B015 MO
+10018 LINEAR B SYLLABLE B023 MU
+10019 LINEAR B SYLLABLE B006 NA
+1001A LINEAR B SYLLABLE B024 NE
+1001B LINEAR B SYLLABLE B030 NI
+1001C LINEAR B SYLLABLE B052 NO
+1001D LINEAR B SYLLABLE B055 NU
+1001E LINEAR B SYLLABLE B003 PA
+1001F LINEAR B SYLLABLE B072 PE
+10020 LINEAR B SYLLABLE B039 PI
+10021 LINEAR B SYLLABLE B011 PO
+10022 LINEAR B SYLLABLE B050 PU
+10023 LINEAR B SYLLABLE B016 QA
+10024 LINEAR B SYLLABLE B078 QE
+10025 LINEAR B SYLLABLE B021 QI
+10026 LINEAR B SYLLABLE B032 QO
+10028 LINEAR B SYLLABLE B060 RA
+10029 LINEAR B SYLLABLE B027 RE
+1002A LINEAR B SYLLABLE B053 RI
+1002B LINEAR B SYLLABLE B002 RO
+1002C LINEAR B SYLLABLE B026 RU
+1002D LINEAR B SYLLABLE B031 SA
+1002E LINEAR B SYLLABLE B009 SE
+1002F LINEAR B SYLLABLE B041 SI
+10030 LINEAR B SYLLABLE B012 SO
+10031 LINEAR B SYLLABLE B058 SU
+10032 LINEAR B SYLLABLE B059 TA
+10033 LINEAR B SYLLABLE B004 TE
+10034 LINEAR B SYLLABLE B037 TI
+10035 LINEAR B SYLLABLE B005 TO
+10036 LINEAR B SYLLABLE B069 TU
+10037 LINEAR B SYLLABLE B054 WA
+10038 LINEAR B SYLLABLE B075 WE
+10039 LINEAR B SYLLABLE B040 WI
+1003A LINEAR B SYLLABLE B042 WO
+1003C LINEAR B SYLLABLE B017 ZA
+1003D LINEAR B SYLLABLE B074 ZE
+1003F LINEAR B SYLLABLE B020 ZO
+10040 LINEAR B SYLLABLE B025 A2
+10041 LINEAR B SYLLABLE B043 A3
+10042 LINEAR B SYLLABLE B085 AU
+10043 LINEAR B SYLLABLE B071 DWE
+10044 LINEAR B SYLLABLE B090 DWO
+10045 LINEAR B SYLLABLE B048 NWA
+10046 LINEAR B SYLLABLE B029 PU2
+10047 LINEAR B SYLLABLE B062 PTE
+10048 LINEAR B SYLLABLE B076 RA2
+10049 LINEAR B SYLLABLE B033 RA3
+1004A LINEAR B SYLLABLE B068 RO2
+1004B LINEAR B SYLLABLE B066 TA2
+1004C LINEAR B SYLLABLE B087 TWE
+1004D LINEAR B SYLLABLE B091 TWO
+10050 LINEAR B SYMBOL B018
+10051 LINEAR B SYMBOL B019
+10052 LINEAR B SYMBOL B022
+10053 LINEAR B SYMBOL B034
+10054 LINEAR B SYMBOL B047
+10055 LINEAR B SYMBOL B049
+10056 LINEAR B SYMBOL B056
+10057 LINEAR B SYMBOL B063
+10058 LINEAR B SYMBOL B064
+10059 LINEAR B SYMBOL B079
+1005A LINEAR B SYMBOL B082
+1005B LINEAR B SYMBOL B083
+1005C LINEAR B SYMBOL B086
+1005D LINEAR B SYMBOL B089
+10080 LINEAR B IDEOGRAM B100 MAN
+10081 LINEAR B IDEOGRAM B102 WOMAN
+10082 LINEAR B IDEOGRAM B104 DEER
+10083 LINEAR B IDEOGRAM B105 EQUID
+10084 LINEAR B IDEOGRAM B105F MARE
+10085 LINEAR B IDEOGRAM B105M STALLION
+10086 LINEAR B IDEOGRAM B106F EWE
+10087 LINEAR B IDEOGRAM B106M RAM
+10088 LINEAR B IDEOGRAM B107F SHE-GOAT
+10089 LINEAR B IDEOGRAM B107M HE-GOAT
+1008A LINEAR B IDEOGRAM B108F SOW
+1008B LINEAR B IDEOGRAM B108M BOAR
+1008C LINEAR B IDEOGRAM B109F COW
+1008D LINEAR B IDEOGRAM B109M BULL
+1008E LINEAR B IDEOGRAM B120 WHEAT
+1008F LINEAR B IDEOGRAM B121 BARLEY
+10090 LINEAR B IDEOGRAM B122 OLIVE
+10091 LINEAR B IDEOGRAM B123 SPICE
+10092 LINEAR B IDEOGRAM B125 CYPERUS
+10093 LINEAR B MONOGRAM B127 KAPO
+10094 LINEAR B MONOGRAM B128 KANAKO
+10095 LINEAR B IDEOGRAM B130 OIL
+10096 LINEAR B IDEOGRAM B131 WINE
+10097 LINEAR B IDEOGRAM B132
+10098 LINEAR B MONOGRAM B133 AREPA
+10099 LINEAR B MONOGRAM B135 MERI
+1009A LINEAR B IDEOGRAM B140 BRONZE
+1009B LINEAR B IDEOGRAM B141 GOLD
+1009C LINEAR B IDEOGRAM B142
+1009D LINEAR B IDEOGRAM B145 WOOL
+1009E LINEAR B IDEOGRAM B146
+1009F LINEAR B IDEOGRAM B150
+100A0 LINEAR B IDEOGRAM B151 HORN
+100A1 LINEAR B IDEOGRAM B152
+100A2 LINEAR B IDEOGRAM B153
+100A3 LINEAR B IDEOGRAM B154
+100A4 LINEAR B MONOGRAM B156 TURO2
+100A5 LINEAR B IDEOGRAM B157
+100A6 LINEAR B IDEOGRAM B158
+100A7 LINEAR B IDEOGRAM B159 CLOTH
+100A8 LINEAR B IDEOGRAM B160
+100A9 LINEAR B IDEOGRAM B161
+100AA LINEAR B IDEOGRAM B162 GARMENT
+100AB LINEAR B IDEOGRAM B163 ARMOUR
+100AC LINEAR B IDEOGRAM B164
+100AD LINEAR B IDEOGRAM B165
+100AE LINEAR B IDEOGRAM B166
+100AF LINEAR B IDEOGRAM B167
+100B0 LINEAR B IDEOGRAM B168
+100B1 LINEAR B IDEOGRAM B169
+100B2 LINEAR B IDEOGRAM B170
+100B3 LINEAR B IDEOGRAM B171
+100B4 LINEAR B IDEOGRAM B172
+100B5 LINEAR B IDEOGRAM B173 MONTH
+100B6 LINEAR B IDEOGRAM B174
+100B7 LINEAR B IDEOGRAM B176 TREE
+100B8 LINEAR B IDEOGRAM B177
+100B9 LINEAR B IDEOGRAM B178
+100BA LINEAR B IDEOGRAM B179
+100BB LINEAR B IDEOGRAM B180
+100BC LINEAR B IDEOGRAM B181
+100BD LINEAR B IDEOGRAM B182
+100BE LINEAR B IDEOGRAM B183
+100BF LINEAR B IDEOGRAM B184
+100C0 LINEAR B IDEOGRAM B185
+100C1 LINEAR B IDEOGRAM B189
+100C2 LINEAR B IDEOGRAM B190
+100C3 LINEAR B IDEOGRAM B191 HELMET
+100C4 LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5 LINEAR B IDEOGRAM B225 BATHTUB
+100C6 LINEAR B IDEOGRAM B230 SPEAR
+100C7 LINEAR B IDEOGRAM B231 ARROW
+100C8 LINEAR B IDEOGRAM B232
+100C9 LINEAR B IDEOGRAM B233 SWORD
+100CA LINEAR B IDEOGRAM B234
+100CB LINEAR B IDEOGRAM B236
+100CC LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD LINEAR B IDEOGRAM B241 CHARIOT
+100CE LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF LINEAR B IDEOGRAM B243 WHEEL
+100D0 LINEAR B IDEOGRAM B245
+100D1 LINEAR B IDEOGRAM B246
+100D2 LINEAR B MONOGRAM B247 DIPTE
+100D3 LINEAR B IDEOGRAM B248
+100D4 LINEAR B IDEOGRAM B249
+100D5 LINEAR B IDEOGRAM B251
+100D6 LINEAR B IDEOGRAM B252
+100D7 LINEAR B IDEOGRAM B253
+100D8 LINEAR B IDEOGRAM B254 DART
+100D9 LINEAR B IDEOGRAM B255
+100DA LINEAR B IDEOGRAM B256
+100DB LINEAR B IDEOGRAM B257
+100DC LINEAR B IDEOGRAM B258
+100DD LINEAR B IDEOGRAM B259
+100DE LINEAR B IDEOGRAM VESSEL B155
+100DF LINEAR B IDEOGRAM VESSEL B200
+100E0 LINEAR B IDEOGRAM VESSEL B201
+100E1 LINEAR B IDEOGRAM VESSEL B202
+100E2 LINEAR B IDEOGRAM VESSEL B203
+100E3 LINEAR B IDEOGRAM VESSEL B204
+100E4 LINEAR B IDEOGRAM VESSEL B205
+100E5 LINEAR B IDEOGRAM VESSEL B206
+100E6 LINEAR B IDEOGRAM VESSEL B207
+100E7 LINEAR B IDEOGRAM VESSEL B208
+100E8 LINEAR B IDEOGRAM VESSEL B209
+100E9 LINEAR B IDEOGRAM VESSEL B210
+100EA LINEAR B IDEOGRAM VESSEL B211
+100EB LINEAR B IDEOGRAM VESSEL B212
+100EC LINEAR B IDEOGRAM VESSEL B213
+100ED LINEAR B IDEOGRAM VESSEL B214
+100EE LINEAR B IDEOGRAM VESSEL B215
+100EF LINEAR B IDEOGRAM VESSEL B216
+100F0 LINEAR B IDEOGRAM VESSEL B217
+100F1 LINEAR B IDEOGRAM VESSEL B218
+100F2 LINEAR B IDEOGRAM VESSEL B219
+100F3 LINEAR B IDEOGRAM VESSEL B221
+100F4 LINEAR B IDEOGRAM VESSEL B222
+100F5 LINEAR B IDEOGRAM VESSEL B226
+100F6 LINEAR B IDEOGRAM VESSEL B227
+100F7 LINEAR B IDEOGRAM VESSEL B228
+100F8 LINEAR B IDEOGRAM VESSEL B229
+100F9 LINEAR B IDEOGRAM VESSEL B250
+100FA LINEAR B IDEOGRAM VESSEL B305
+10100 AEGEAN WORD SEPARATOR LINE
+10101 AEGEAN WORD SEPARATOR DOT
+10102 AEGEAN CHECK MARK
+10107 AEGEAN NUMBER ONE
+10108 AEGEAN NUMBER TWO
+10109 AEGEAN NUMBER THREE
+1010A AEGEAN NUMBER FOUR
+1010B AEGEAN NUMBER FIVE
+1010C AEGEAN NUMBER SIX
+1010D AEGEAN NUMBER SEVEN
+1010E AEGEAN NUMBER EIGHT
+1010F AEGEAN NUMBER NINE
+10110 AEGEAN NUMBER TEN
+10111 AEGEAN NUMBER TWENTY
+10112 AEGEAN NUMBER THIRTY
+10113 AEGEAN NUMBER FORTY
+10114 AEGEAN NUMBER FIFTY
+10115 AEGEAN NUMBER SIXTY
+10116 AEGEAN NUMBER SEVENTY
+10117 AEGEAN NUMBER EIGHTY
+10118 AEGEAN NUMBER NINETY
+10119 AEGEAN NUMBER ONE HUNDRED
+1011A AEGEAN NUMBER TWO HUNDRED
+1011B AEGEAN NUMBER THREE HUNDRED
+1011C AEGEAN NUMBER FOUR HUNDRED
+1011D AEGEAN NUMBER FIVE HUNDRED
+1011E AEGEAN NUMBER SIX HUNDRED
+1011F AEGEAN NUMBER SEVEN HUNDRED
+10120 AEGEAN NUMBER EIGHT HUNDRED
+10121 AEGEAN NUMBER NINE HUNDRED
+10122 AEGEAN NUMBER ONE THOUSAND
+10123 AEGEAN NUMBER TWO THOUSAND
+10124 AEGEAN NUMBER THREE THOUSAND
+10125 AEGEAN NUMBER FOUR THOUSAND
+10126 AEGEAN NUMBER FIVE THOUSAND
+10127 AEGEAN NUMBER SIX THOUSAND
+10128 AEGEAN NUMBER SEVEN THOUSAND
+10129 AEGEAN NUMBER EIGHT THOUSAND
+1012A AEGEAN NUMBER NINE THOUSAND
+1012B AEGEAN NUMBER TEN THOUSAND
+1012C AEGEAN NUMBER TWENTY THOUSAND
+1012D AEGEAN NUMBER THIRTY THOUSAND
+1012E AEGEAN NUMBER FORTY THOUSAND
+1012F AEGEAN NUMBER FIFTY THOUSAND
+10130 AEGEAN NUMBER SIXTY THOUSAND
+10131 AEGEAN NUMBER SEVENTY THOUSAND
+10132 AEGEAN NUMBER EIGHTY THOUSAND
+10133 AEGEAN NUMBER NINETY THOUSAND
+10137 AEGEAN WEIGHT BASE UNIT
+10138 AEGEAN WEIGHT FIRST SUBUNIT
+10139 AEGEAN WEIGHT SECOND SUBUNIT
+1013A AEGEAN WEIGHT THIRD SUBUNIT
+1013B AEGEAN WEIGHT FOURTH SUBUNIT
+1013C AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E AEGEAN MEASURE SECOND SUBUNIT
+1013F AEGEAN MEASURE THIRD SUBUNIT
+10140 GREEK ACROPHONIC ATTIC ONE QUARTER
+10141 GREEK ACROPHONIC ATTIC ONE HALF
+10142 GREEK ACROPHONIC ATTIC ONE DRACHMA
+10143 GREEK ACROPHONIC ATTIC FIVE
+10144 GREEK ACROPHONIC ATTIC FIFTY
+10145 GREEK ACROPHONIC ATTIC FIVE HUNDRED
+10146 GREEK ACROPHONIC ATTIC FIVE THOUSAND
+10147 GREEK ACROPHONIC ATTIC FIFTY THOUSAND
+10148 GREEK ACROPHONIC ATTIC FIVE TALENTS
+10149 GREEK ACROPHONIC ATTIC TEN TALENTS
+1014A GREEK ACROPHONIC ATTIC FIFTY TALENTS
+1014B GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS
+1014C GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS
+1014D GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS
+1014E GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS
+1014F GREEK ACROPHONIC ATTIC FIVE STATERS
+10150 GREEK ACROPHONIC ATTIC TEN STATERS
+10151 GREEK ACROPHONIC ATTIC FIFTY STATERS
+10152 GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS
+10153 GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS
+10154 GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS
+10155 GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS
+10156 GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS
+10157 GREEK ACROPHONIC ATTIC TEN MNAS
+10158 GREEK ACROPHONIC HERAEUM ONE PLETHRON
+10159 GREEK ACROPHONIC THESPIAN ONE
+1015A GREEK ACROPHONIC HERMIONIAN ONE
+1015B GREEK ACROPHONIC EPIDAUREAN TWO
+1015C GREEK ACROPHONIC THESPIAN TWO
+1015D GREEK ACROPHONIC CYRENAIC TWO DRACHMAS
+1015E GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS
+1015F GREEK ACROPHONIC TROEZENIAN FIVE
+10160 GREEK ACROPHONIC TROEZENIAN TEN
+10161 GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM
+10162 GREEK ACROPHONIC HERMIONIAN TEN
+10163 GREEK ACROPHONIC MESSENIAN TEN
+10164 GREEK ACROPHONIC THESPIAN TEN
+10165 GREEK ACROPHONIC THESPIAN THIRTY
+10166 GREEK ACROPHONIC TROEZENIAN FIFTY
+10167 GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
+10168 GREEK ACROPHONIC HERMIONIAN FIFTY
+10169 GREEK ACROPHONIC THESPIAN FIFTY
+1016A GREEK ACROPHONIC THESPIAN ONE HUNDRED
+1016B GREEK ACROPHONIC THESPIAN THREE HUNDRED
+1016C GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED
+1016D GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED
+1016E GREEK ACROPHONIC THESPIAN FIVE HUNDRED
+1016F GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED
+10170 GREEK ACROPHONIC NAXIAN FIVE HUNDRED
+10171 GREEK ACROPHONIC THESPIAN ONE THOUSAND
+10172 GREEK ACROPHONIC THESPIAN FIVE THOUSAND
+10173 GREEK ACROPHONIC DELPHIC FIVE MNAS
+10174 GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175 GREEK ONE HALF SIGN
+10176 GREEK ONE HALF SIGN ALTERNATE FORM
+10177 GREEK TWO THIRDS SIGN
+10178 GREEK THREE QUARTERS SIGN
+10179 GREEK YEAR SIGN
+1017A GREEK TALENT SIGN
+1017B GREEK DRACHMA SIGN
+1017C GREEK OBOL SIGN
+1017D GREEK TWO OBOLS SIGN
+1017E GREEK THREE OBOLS SIGN
+1017F GREEK FOUR OBOLS SIGN
+10180 GREEK FIVE OBOLS SIGN
+10181 GREEK METRETES SIGN
+10182 GREEK KYATHOS BASE SIGN
+10183 GREEK LITRA SIGN
+10184 GREEK OUNKIA SIGN
+10185 GREEK XESTES SIGN
+10186 GREEK ARTABE SIGN
+10187 GREEK AROURA SIGN
+10188 GREEK GRAMMA SIGN
+10189 GREEK TRYBLION BASE SIGN
+1018A GREEK ZERO SIGN
+10190 ROMAN SEXTANS SIGN
+10191 ROMAN UNCIA SIGN
+10192 ROMAN SEMUNCIA SIGN
+10193 ROMAN SEXTULA SIGN
+10194 ROMAN DIMIDIA SEXTULA SIGN
+10195 ROMAN SILIQUA SIGN
+10196 ROMAN DENARIUS SIGN
+10197 ROMAN QUINARIUS SIGN
+10198 ROMAN SESTERTIUS SIGN
+10199 ROMAN DUPONDIUS SIGN
+1019A ROMAN AS SIGN
+1019B ROMAN CENTURIAL SIGN
+101D0 PHAISTOS DISC SIGN PEDESTRIAN
+101D1 PHAISTOS DISC SIGN PLUMED HEAD
+101D2 PHAISTOS DISC SIGN TATTOOED HEAD
+101D3 PHAISTOS DISC SIGN CAPTIVE
+101D4 PHAISTOS DISC SIGN CHILD
+101D5 PHAISTOS DISC SIGN WOMAN
+101D6 PHAISTOS DISC SIGN HELMET
+101D7 PHAISTOS DISC SIGN GAUNTLET
+101D8 PHAISTOS DISC SIGN TIARA
+101D9 PHAISTOS DISC SIGN ARROW
+101DA PHAISTOS DISC SIGN BOW
+101DB PHAISTOS DISC SIGN SHIELD
+101DC PHAISTOS DISC SIGN CLUB
+101DD PHAISTOS DISC SIGN MANACLES
+101DE PHAISTOS DISC SIGN MATTOCK
+101DF PHAISTOS DISC SIGN SAW
+101E0 PHAISTOS DISC SIGN LID
+101E1 PHAISTOS DISC SIGN BOOMERANG
+101E2 PHAISTOS DISC SIGN CARPENTRY PLANE
+101E3 PHAISTOS DISC SIGN DOLIUM
+101E4 PHAISTOS DISC SIGN COMB
+101E5 PHAISTOS DISC SIGN SLING
+101E6 PHAISTOS DISC SIGN COLUMN
+101E7 PHAISTOS DISC SIGN BEEHIVE
+101E8 PHAISTOS DISC SIGN SHIP
+101E9 PHAISTOS DISC SIGN HORN
+101EA PHAISTOS DISC SIGN HIDE
+101EB PHAISTOS DISC SIGN BULLS LEG
+101EC PHAISTOS DISC SIGN CAT
+101ED PHAISTOS DISC SIGN RAM
+101EE PHAISTOS DISC SIGN EAGLE
+101EF PHAISTOS DISC SIGN DOVE
+101F0 PHAISTOS DISC SIGN TUNNY
+101F1 PHAISTOS DISC SIGN BEE
+101F2 PHAISTOS DISC SIGN PLANE TREE
+101F3 PHAISTOS DISC SIGN VINE
+101F4 PHAISTOS DISC SIGN PAPYRUS
+101F5 PHAISTOS DISC SIGN ROSETTE
+101F6 PHAISTOS DISC SIGN LILY
+101F7 PHAISTOS DISC SIGN OX BACK
+101F8 PHAISTOS DISC SIGN FLUTE
+101F9 PHAISTOS DISC SIGN GRATER
+101FA PHAISTOS DISC SIGN STRAINER
+101FB PHAISTOS DISC SIGN SMALL AXE
+101FC PHAISTOS DISC SIGN WAVY BAND
+101FD PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+10280 LYCIAN LETTER A
+10281 LYCIAN LETTER E
+10282 LYCIAN LETTER B
+10283 LYCIAN LETTER BH
+10284 LYCIAN LETTER G
+10285 LYCIAN LETTER D
+10286 LYCIAN LETTER I
+10287 LYCIAN LETTER W
+10288 LYCIAN LETTER Z
+10289 LYCIAN LETTER TH
+1028A LYCIAN LETTER J
+1028B LYCIAN LETTER K
+1028C LYCIAN LETTER Q
+1028D LYCIAN LETTER L
+1028E LYCIAN LETTER M
+1028F LYCIAN LETTER N
+10290 LYCIAN LETTER MM
+10291 LYCIAN LETTER NN
+10292 LYCIAN LETTER U
+10293 LYCIAN LETTER P
+10294 LYCIAN LETTER KK
+10295 LYCIAN LETTER R
+10296 LYCIAN LETTER S
+10297 LYCIAN LETTER T
+10298 LYCIAN LETTER TT
+10299 LYCIAN LETTER AN
+1029A LYCIAN LETTER EN
+1029B LYCIAN LETTER H
+1029C LYCIAN LETTER X
+102A0 CARIAN LETTER A
+102A1 CARIAN LETTER P2
+102A2 CARIAN LETTER D
+102A3 CARIAN LETTER L
+102A4 CARIAN LETTER UUU
+102A5 CARIAN LETTER R
+102A6 CARIAN LETTER LD
+102A7 CARIAN LETTER A2
+102A8 CARIAN LETTER Q
+102A9 CARIAN LETTER B
+102AA CARIAN LETTER M
+102AB CARIAN LETTER O
+102AC CARIAN LETTER D2
+102AD CARIAN LETTER T
+102AE CARIAN LETTER SH
+102AF CARIAN LETTER SH2
+102B0 CARIAN LETTER S
+102B1 CARIAN LETTER C-18
+102B2 CARIAN LETTER U
+102B3 CARIAN LETTER NN
+102B4 CARIAN LETTER X
+102B5 CARIAN LETTER N
+102B6 CARIAN LETTER TT2
+102B7 CARIAN LETTER P
+102B8 CARIAN LETTER SS
+102B9 CARIAN LETTER I
+102BA CARIAN LETTER E
+102BB CARIAN LETTER UUUU
+102BC CARIAN LETTER K
+102BD CARIAN LETTER K2
+102BE CARIAN LETTER ND
+102BF CARIAN LETTER UU
+102C0 CARIAN LETTER G
+102C1 CARIAN LETTER G2
+102C2 CARIAN LETTER ST
+102C3 CARIAN LETTER ST2
+102C4 CARIAN LETTER NG
+102C5 CARIAN LETTER II
+102C6 CARIAN LETTER C-39
+102C7 CARIAN LETTER TT
+102C8 CARIAN LETTER UUU2
+102C9 CARIAN LETTER RR
+102CA CARIAN LETTER MB
+102CB CARIAN LETTER MB2
+102CC CARIAN LETTER MB3
+102CD CARIAN LETTER MB4
+102CE CARIAN LETTER LD2
+102CF CARIAN LETTER E2
+102D0 CARIAN LETTER UUU3
+10300 OLD ITALIC LETTER A
+10301 OLD ITALIC LETTER BE
+10302 OLD ITALIC LETTER KE
+10303 OLD ITALIC LETTER DE
+10304 OLD ITALIC LETTER E
+10305 OLD ITALIC LETTER VE
+10306 OLD ITALIC LETTER ZE
+10307 OLD ITALIC LETTER HE
+10308 OLD ITALIC LETTER THE
+10309 OLD ITALIC LETTER I
+1030A OLD ITALIC LETTER KA
+1030B OLD ITALIC LETTER EL
+1030C OLD ITALIC LETTER EM
+1030D OLD ITALIC LETTER EN
+1030E OLD ITALIC LETTER ESH
+1030F OLD ITALIC LETTER O
+10310 OLD ITALIC LETTER PE
+10311 OLD ITALIC LETTER SHE
+10312 OLD ITALIC LETTER KU
+10313 OLD ITALIC LETTER ER
+10314 OLD ITALIC LETTER ES
+10315 OLD ITALIC LETTER TE
+10316 OLD ITALIC LETTER U
+10317 OLD ITALIC LETTER EKS
+10318 OLD ITALIC LETTER PHE
+10319 OLD ITALIC LETTER KHE
+1031A OLD ITALIC LETTER EF
+1031B OLD ITALIC LETTER ERS
+1031C OLD ITALIC LETTER CHE
+1031D OLD ITALIC LETTER II
+1031E OLD ITALIC LETTER UU
+10320 OLD ITALIC NUMERAL ONE
+10321 OLD ITALIC NUMERAL FIVE
+10322 OLD ITALIC NUMERAL TEN
+10323 OLD ITALIC NUMERAL FIFTY
+10330 GOTHIC LETTER AHSA
+10331 GOTHIC LETTER BAIRKAN
+10332 GOTHIC LETTER GIBA
+10333 GOTHIC LETTER DAGS
+10334 GOTHIC LETTER AIHVUS
+10335 GOTHIC LETTER QAIRTHRA
+10336 GOTHIC LETTER IUJA
+10337 GOTHIC LETTER HAGL
+10338 GOTHIC LETTER THIUTH
+10339 GOTHIC LETTER EIS
+1033A GOTHIC LETTER KUSMA
+1033B GOTHIC LETTER LAGUS
+1033C GOTHIC LETTER MANNA
+1033D GOTHIC LETTER NAUTHS
+1033E GOTHIC LETTER JER
+1033F GOTHIC LETTER URUS
+10340 GOTHIC LETTER PAIRTHRA
+10341 GOTHIC LETTER NINETY
+10342 GOTHIC LETTER RAIDA
+10343 GOTHIC LETTER SAUIL
+10344 GOTHIC LETTER TEIWS
+10345 GOTHIC LETTER WINJA
+10346 GOTHIC LETTER FAIHU
+10347 GOTHIC LETTER IGGWS
+10348 GOTHIC LETTER HWAIR
+10349 GOTHIC LETTER OTHAL
+1034A GOTHIC LETTER NINE HUNDRED
+10380 UGARITIC LETTER ALPA
+10381 UGARITIC LETTER BETA
+10382 UGARITIC LETTER GAMLA
+10383 UGARITIC LETTER KHA
+10384 UGARITIC LETTER DELTA
+10385 UGARITIC LETTER HO
+10386 UGARITIC LETTER WO
+10387 UGARITIC LETTER ZETA
+10388 UGARITIC LETTER HOTA
+10389 UGARITIC LETTER TET
+1038A UGARITIC LETTER YOD
+1038B UGARITIC LETTER KAF
+1038C UGARITIC LETTER SHIN
+1038D UGARITIC LETTER LAMDA
+1038E UGARITIC LETTER MEM
+1038F UGARITIC LETTER DHAL
+10390 UGARITIC LETTER NUN
+10391 UGARITIC LETTER ZU
+10392 UGARITIC LETTER SAMKA
+10393 UGARITIC LETTER AIN
+10394 UGARITIC LETTER PU
+10395 UGARITIC LETTER SADE
+10396 UGARITIC LETTER QOPA
+10397 UGARITIC LETTER RASHA
+10398 UGARITIC LETTER THANNA
+10399 UGARITIC LETTER GHAIN
+1039A UGARITIC LETTER TO
+1039B UGARITIC LETTER I
+1039C UGARITIC LETTER U
+1039D UGARITIC LETTER SSU
+1039F UGARITIC WORD DIVIDER
+103A0 OLD PERSIAN SIGN A
+103A1 OLD PERSIAN SIGN I
+103A2 OLD PERSIAN SIGN U
+103A3 OLD PERSIAN SIGN KA
+103A4 OLD PERSIAN SIGN KU
+103A5 OLD PERSIAN SIGN GA
+103A6 OLD PERSIAN SIGN GU
+103A7 OLD PERSIAN SIGN XA
+103A8 OLD PERSIAN SIGN CA
+103A9 OLD PERSIAN SIGN JA
+103AA OLD PERSIAN SIGN JI
+103AB OLD PERSIAN SIGN TA
+103AC OLD PERSIAN SIGN TU
+103AD OLD PERSIAN SIGN DA
+103AE OLD PERSIAN SIGN DI
+103AF OLD PERSIAN SIGN DU
+103B0 OLD PERSIAN SIGN THA
+103B1 OLD PERSIAN SIGN PA
+103B2 OLD PERSIAN SIGN BA
+103B3 OLD PERSIAN SIGN FA
+103B4 OLD PERSIAN SIGN NA
+103B5 OLD PERSIAN SIGN NU
+103B6 OLD PERSIAN SIGN MA
+103B7 OLD PERSIAN SIGN MI
+103B8 OLD PERSIAN SIGN MU
+103B9 OLD PERSIAN SIGN YA
+103BA OLD PERSIAN SIGN VA
+103BB OLD PERSIAN SIGN VI
+103BC OLD PERSIAN SIGN RA
+103BD OLD PERSIAN SIGN RU
+103BE OLD PERSIAN SIGN LA
+103BF OLD PERSIAN SIGN SA
+103C0 OLD PERSIAN SIGN ZA
+103C1 OLD PERSIAN SIGN SHA
+103C2 OLD PERSIAN SIGN SSA
+103C3 OLD PERSIAN SIGN HA
+103C8 OLD PERSIAN SIGN AURAMAZDAA
+103C9 OLD PERSIAN SIGN AURAMAZDAA-2
+103CA OLD PERSIAN SIGN AURAMAZDAAHA
+103CB OLD PERSIAN SIGN XSHAAYATHIYA
+103CC OLD PERSIAN SIGN DAHYAAUSH
+103CD OLD PERSIAN SIGN DAHYAAUSH-2
+103CE OLD PERSIAN SIGN BAGA
+103CF OLD PERSIAN SIGN BUUMISH
+103D0 OLD PERSIAN WORD DIVIDER
+103D1 OLD PERSIAN NUMBER ONE
+103D2 OLD PERSIAN NUMBER TWO
+103D3 OLD PERSIAN NUMBER TEN
+103D4 OLD PERSIAN NUMBER TWENTY
+103D5 OLD PERSIAN NUMBER HUNDRED
+10400 DESERET CAPITAL LETTER LONG I
+10401 DESERET CAPITAL LETTER LONG E
+10402 DESERET CAPITAL LETTER LONG A
+10403 DESERET CAPITAL LETTER LONG AH
+10404 DESERET CAPITAL LETTER LONG O
+10405 DESERET CAPITAL LETTER LONG OO
+10406 DESERET CAPITAL LETTER SHORT I
+10407 DESERET CAPITAL LETTER SHORT E
+10408 DESERET CAPITAL LETTER SHORT A
+10409 DESERET CAPITAL LETTER SHORT AH
+1040A DESERET CAPITAL LETTER SHORT O
+1040B DESERET CAPITAL LETTER SHORT OO
+1040C DESERET CAPITAL LETTER AY
+1040D DESERET CAPITAL LETTER OW
+1040E DESERET CAPITAL LETTER WU
+1040F DESERET CAPITAL LETTER YEE
+10410 DESERET CAPITAL LETTER H
+10411 DESERET CAPITAL LETTER PEE
+10412 DESERET CAPITAL LETTER BEE
+10413 DESERET CAPITAL LETTER TEE
+10414 DESERET CAPITAL LETTER DEE
+10415 DESERET CAPITAL LETTER CHEE
+10416 DESERET CAPITAL LETTER JEE
+10417 DESERET CAPITAL LETTER KAY
+10418 DESERET CAPITAL LETTER GAY
+10419 DESERET CAPITAL LETTER EF
+1041A DESERET CAPITAL LETTER VEE
+1041B DESERET CAPITAL LETTER ETH
+1041C DESERET CAPITAL LETTER THEE
+1041D DESERET CAPITAL LETTER ES
+1041E DESERET CAPITAL LETTER ZEE
+1041F DESERET CAPITAL LETTER ESH
+10420 DESERET CAPITAL LETTER ZHEE
+10421 DESERET CAPITAL LETTER ER
+10422 DESERET CAPITAL LETTER EL
+10423 DESERET CAPITAL LETTER EM
+10424 DESERET CAPITAL LETTER EN
+10425 DESERET CAPITAL LETTER ENG
+10426 DESERET CAPITAL LETTER OI
+10427 DESERET CAPITAL LETTER EW
+10428 DESERET SMALL LETTER LONG I
+10429 DESERET SMALL LETTER LONG E
+1042A DESERET SMALL LETTER LONG A
+1042B DESERET SMALL LETTER LONG AH
+1042C DESERET SMALL LETTER LONG O
+1042D DESERET SMALL LETTER LONG OO
+1042E DESERET SMALL LETTER SHORT I
+1042F DESERET SMALL LETTER SHORT E
+10430 DESERET SMALL LETTER SHORT A
+10431 DESERET SMALL LETTER SHORT AH
+10432 DESERET SMALL LETTER SHORT O
+10433 DESERET SMALL LETTER SHORT OO
+10434 DESERET SMALL LETTER AY
+10435 DESERET SMALL LETTER OW
+10436 DESERET SMALL LETTER WU
+10437 DESERET SMALL LETTER YEE
+10438 DESERET SMALL LETTER H
+10439 DESERET SMALL LETTER PEE
+1043A DESERET SMALL LETTER BEE
+1043B DESERET SMALL LETTER TEE
+1043C DESERET SMALL LETTER DEE
+1043D DESERET SMALL LETTER CHEE
+1043E DESERET SMALL LETTER JEE
+1043F DESERET SMALL LETTER KAY
+10440 DESERET SMALL LETTER GAY
+10441 DESERET SMALL LETTER EF
+10442 DESERET SMALL LETTER VEE
+10443 DESERET SMALL LETTER ETH
+10444 DESERET SMALL LETTER THEE
+10445 DESERET SMALL LETTER ES
+10446 DESERET SMALL LETTER ZEE
+10447 DESERET SMALL LETTER ESH
+10448 DESERET SMALL LETTER ZHEE
+10449 DESERET SMALL LETTER ER
+1044A DESERET SMALL LETTER EL
+1044B DESERET SMALL LETTER EM
+1044C DESERET SMALL LETTER EN
+1044D DESERET SMALL LETTER ENG
+1044E DESERET SMALL LETTER OI
+1044F DESERET SMALL LETTER EW
+10450 SHAVIAN LETTER PEEP
+10451 SHAVIAN LETTER TOT
+10452 SHAVIAN LETTER KICK
+10453 SHAVIAN LETTER FEE
+10454 SHAVIAN LETTER THIGH
+10455 SHAVIAN LETTER SO
+10456 SHAVIAN LETTER SURE
+10457 SHAVIAN LETTER CHURCH
+10458 SHAVIAN LETTER YEA
+10459 SHAVIAN LETTER HUNG
+1045A SHAVIAN LETTER BIB
+1045B SHAVIAN LETTER DEAD
+1045C SHAVIAN LETTER GAG
+1045D SHAVIAN LETTER VOW
+1045E SHAVIAN LETTER THEY
+1045F SHAVIAN LETTER ZOO
+10460 SHAVIAN LETTER MEASURE
+10461 SHAVIAN LETTER JUDGE
+10462 SHAVIAN LETTER WOE
+10463 SHAVIAN LETTER HA-HA
+10464 SHAVIAN LETTER LOLL
+10465 SHAVIAN LETTER MIME
+10466 SHAVIAN LETTER IF
+10467 SHAVIAN LETTER EGG
+10468 SHAVIAN LETTER ASH
+10469 SHAVIAN LETTER ADO
+1046A SHAVIAN LETTER ON
+1046B SHAVIAN LETTER WOOL
+1046C SHAVIAN LETTER OUT
+1046D SHAVIAN LETTER AH
+1046E SHAVIAN LETTER ROAR
+1046F SHAVIAN LETTER NUN
+10470 SHAVIAN LETTER EAT
+10471 SHAVIAN LETTER AGE
+10472 SHAVIAN LETTER ICE
+10473 SHAVIAN LETTER UP
+10474 SHAVIAN LETTER OAK
+10475 SHAVIAN LETTER OOZE
+10476 SHAVIAN LETTER OIL
+10477 SHAVIAN LETTER AWE
+10478 SHAVIAN LETTER ARE
+10479 SHAVIAN LETTER OR
+1047A SHAVIAN LETTER AIR
+1047B SHAVIAN LETTER ERR
+1047C SHAVIAN LETTER ARRAY
+1047D SHAVIAN LETTER EAR
+1047E SHAVIAN LETTER IAN
+1047F SHAVIAN LETTER YEW
+10480 OSMANYA LETTER ALEF
+10481 OSMANYA LETTER BA
+10482 OSMANYA LETTER TA
+10483 OSMANYA LETTER JA
+10484 OSMANYA LETTER XA
+10485 OSMANYA LETTER KHA
+10486 OSMANYA LETTER DEEL
+10487 OSMANYA LETTER RA
+10488 OSMANYA LETTER SA
+10489 OSMANYA LETTER SHIIN
+1048A OSMANYA LETTER DHA
+1048B OSMANYA LETTER CAYN
+1048C OSMANYA LETTER GA
+1048D OSMANYA LETTER FA
+1048E OSMANYA LETTER QAAF
+1048F OSMANYA LETTER KAAF
+10490 OSMANYA LETTER LAAN
+10491 OSMANYA LETTER MIIN
+10492 OSMANYA LETTER NUUN
+10493 OSMANYA LETTER WAW
+10494 OSMANYA LETTER HA
+10495 OSMANYA LETTER YA
+10496 OSMANYA LETTER A
+10497 OSMANYA LETTER E
+10498 OSMANYA LETTER I
+10499 OSMANYA LETTER O
+1049A OSMANYA LETTER U
+1049B OSMANYA LETTER AA
+1049C OSMANYA LETTER EE
+1049D OSMANYA LETTER OO
+104A0 OSMANYA DIGIT ZERO
+104A1 OSMANYA DIGIT ONE
+104A2 OSMANYA DIGIT TWO
+104A3 OSMANYA DIGIT THREE
+104A4 OSMANYA DIGIT FOUR
+104A5 OSMANYA DIGIT FIVE
+104A6 OSMANYA DIGIT SIX
+104A7 OSMANYA DIGIT SEVEN
+104A8 OSMANYA DIGIT EIGHT
+104A9 OSMANYA DIGIT NINE
+10800 CYPRIOT SYLLABLE A
+10801 CYPRIOT SYLLABLE E
+10802 CYPRIOT SYLLABLE I
+10803 CYPRIOT SYLLABLE O
+10804 CYPRIOT SYLLABLE U
+10805 CYPRIOT SYLLABLE JA
+10808 CYPRIOT SYLLABLE JO
+1080A CYPRIOT SYLLABLE KA
+1080B CYPRIOT SYLLABLE KE
+1080C CYPRIOT SYLLABLE KI
+1080D CYPRIOT SYLLABLE KO
+1080E CYPRIOT SYLLABLE KU
+1080F CYPRIOT SYLLABLE LA
+10810 CYPRIOT SYLLABLE LE
+10811 CYPRIOT SYLLABLE LI
+10812 CYPRIOT SYLLABLE LO
+10813 CYPRIOT SYLLABLE LU
+10814 CYPRIOT SYLLABLE MA
+10815 CYPRIOT SYLLABLE ME
+10816 CYPRIOT SYLLABLE MI
+10817 CYPRIOT SYLLABLE MO
+10818 CYPRIOT SYLLABLE MU
+10819 CYPRIOT SYLLABLE NA
+1081A CYPRIOT SYLLABLE NE
+1081B CYPRIOT SYLLABLE NI
+1081C CYPRIOT SYLLABLE NO
+1081D CYPRIOT SYLLABLE NU
+1081E CYPRIOT SYLLABLE PA
+1081F CYPRIOT SYLLABLE PE
+10820 CYPRIOT SYLLABLE PI
+10821 CYPRIOT SYLLABLE PO
+10822 CYPRIOT SYLLABLE PU
+10823 CYPRIOT SYLLABLE RA
+10824 CYPRIOT SYLLABLE RE
+10825 CYPRIOT SYLLABLE RI
+10826 CYPRIOT SYLLABLE RO
+10827 CYPRIOT SYLLABLE RU
+10828 CYPRIOT SYLLABLE SA
+10829 CYPRIOT SYLLABLE SE
+1082A CYPRIOT SYLLABLE SI
+1082B CYPRIOT SYLLABLE SO
+1082C CYPRIOT SYLLABLE SU
+1082D CYPRIOT SYLLABLE TA
+1082E CYPRIOT SYLLABLE TE
+1082F CYPRIOT SYLLABLE TI
+10830 CYPRIOT SYLLABLE TO
+10831 CYPRIOT SYLLABLE TU
+10832 CYPRIOT SYLLABLE WA
+10833 CYPRIOT SYLLABLE WE
+10834 CYPRIOT SYLLABLE WI
+10835 CYPRIOT SYLLABLE WO
+10837 CYPRIOT SYLLABLE XA
+10838 CYPRIOT SYLLABLE XE
+1083C CYPRIOT SYLLABLE ZA
+1083F CYPRIOT SYLLABLE ZO
+10900 PHOENICIAN LETTER ALF
+10901 PHOENICIAN LETTER BET
+10902 PHOENICIAN LETTER GAML
+10903 PHOENICIAN LETTER DELT
+10904 PHOENICIAN LETTER HE
+10905 PHOENICIAN LETTER WAU
+10906 PHOENICIAN LETTER ZAI
+10907 PHOENICIAN LETTER HET
+10908 PHOENICIAN LETTER TET
+10909 PHOENICIAN LETTER YOD
+1090A PHOENICIAN LETTER KAF
+1090B PHOENICIAN LETTER LAMD
+1090C PHOENICIAN LETTER MEM
+1090D PHOENICIAN LETTER NUN
+1090E PHOENICIAN LETTER SEMK
+1090F PHOENICIAN LETTER AIN
+10910 PHOENICIAN LETTER PE
+10911 PHOENICIAN LETTER SADE
+10912 PHOENICIAN LETTER QOF
+10913 PHOENICIAN LETTER ROSH
+10914 PHOENICIAN LETTER SHIN
+10915 PHOENICIAN LETTER TAU
+10916 PHOENICIAN NUMBER ONE
+10917 PHOENICIAN NUMBER TEN
+10918 PHOENICIAN NUMBER TWENTY
+10919 PHOENICIAN NUMBER ONE HUNDRED
+1091F PHOENICIAN WORD SEPARATOR
+10920 LYDIAN LETTER A
+10921 LYDIAN LETTER B
+10922 LYDIAN LETTER G
+10923 LYDIAN LETTER D
+10924 LYDIAN LETTER E
+10925 LYDIAN LETTER V
+10926 LYDIAN LETTER I
+10927 LYDIAN LETTER Y
+10928 LYDIAN LETTER K
+10929 LYDIAN LETTER L
+1092A LYDIAN LETTER M
+1092B LYDIAN LETTER N
+1092C LYDIAN LETTER O
+1092D LYDIAN LETTER R
+1092E LYDIAN LETTER SS
+1092F LYDIAN LETTER T
+10930 LYDIAN LETTER U
+10931 LYDIAN LETTER F
+10932 LYDIAN LETTER Q
+10933 LYDIAN LETTER S
+10934 LYDIAN LETTER TT
+10935 LYDIAN LETTER AN
+10936 LYDIAN LETTER EN
+10937 LYDIAN LETTER LY
+10938 LYDIAN LETTER NN
+10939 LYDIAN LETTER C
+1093F LYDIAN TRIANGULAR MARK
+10A00 KHAROSHTHI LETTER A
+10A01 KHAROSHTHI VOWEL SIGN I
+10A02 KHAROSHTHI VOWEL SIGN U
+10A03 KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05 KHAROSHTHI VOWEL SIGN E
+10A06 KHAROSHTHI VOWEL SIGN O
+10A0C KHAROSHTHI VOWEL LENGTH MARK
+10A0D KHAROSHTHI SIGN DOUBLE RING BELOW
+10A0E KHAROSHTHI SIGN ANUSVARA
+10A0F KHAROSHTHI SIGN VISARGA
+10A10 KHAROSHTHI LETTER KA
+10A11 KHAROSHTHI LETTER KHA
+10A12 KHAROSHTHI LETTER GA
+10A13 KHAROSHTHI LETTER GHA
+10A15 KHAROSHTHI LETTER CA
+10A16 KHAROSHTHI LETTER CHA
+10A17 KHAROSHTHI LETTER JA
+10A19 KHAROSHTHI LETTER NYA
+10A1A KHAROSHTHI LETTER TTA
+10A1B KHAROSHTHI LETTER TTHA
+10A1C KHAROSHTHI LETTER DDA
+10A1D KHAROSHTHI LETTER DDHA
+10A1E KHAROSHTHI LETTER NNA
+10A1F KHAROSHTHI LETTER TA
+10A20 KHAROSHTHI LETTER THA
+10A21 KHAROSHTHI LETTER DA
+10A22 KHAROSHTHI LETTER DHA
+10A23 KHAROSHTHI LETTER NA
+10A24 KHAROSHTHI LETTER PA
+10A25 KHAROSHTHI LETTER PHA
+10A26 KHAROSHTHI LETTER BA
+10A27 KHAROSHTHI LETTER BHA
+10A28 KHAROSHTHI LETTER MA
+10A29 KHAROSHTHI LETTER YA
+10A2A KHAROSHTHI LETTER RA
+10A2B KHAROSHTHI LETTER LA
+10A2C KHAROSHTHI LETTER VA
+10A2D KHAROSHTHI LETTER SHA
+10A2E KHAROSHTHI LETTER SSA
+10A2F KHAROSHTHI LETTER SA
+10A30 KHAROSHTHI LETTER ZA
+10A31 KHAROSHTHI LETTER HA
+10A32 KHAROSHTHI LETTER KKA
+10A33 KHAROSHTHI LETTER TTTHA
+10A38 KHAROSHTHI SIGN BAR ABOVE
+10A39 KHAROSHTHI SIGN CAUDA
+10A3A KHAROSHTHI SIGN DOT BELOW
+10A3F KHAROSHTHI VIRAMA
+10A40 KHAROSHTHI DIGIT ONE
+10A41 KHAROSHTHI DIGIT TWO
+10A42 KHAROSHTHI DIGIT THREE
+10A43 KHAROSHTHI DIGIT FOUR
+10A44 KHAROSHTHI NUMBER TEN
+10A45 KHAROSHTHI NUMBER TWENTY
+10A46 KHAROSHTHI NUMBER ONE HUNDRED
+10A47 KHAROSHTHI NUMBER ONE THOUSAND
+10A50 KHAROSHTHI PUNCTUATION DOT
+10A51 KHAROSHTHI PUNCTUATION SMALL CIRCLE
+10A52 KHAROSHTHI PUNCTUATION CIRCLE
+10A53 KHAROSHTHI PUNCTUATION CRESCENT BAR
+10A54 KHAROSHTHI PUNCTUATION MANGALAM
+10A55 KHAROSHTHI PUNCTUATION LOTUS
+10A56 KHAROSHTHI PUNCTUATION DANDA
+10A57 KHAROSHTHI PUNCTUATION DOUBLE DANDA
+10A58 KHAROSHTHI PUNCTUATION LINES
+12000 CUNEIFORM SIGN A
+12001 CUNEIFORM SIGN A TIMES A
+12002 CUNEIFORM SIGN A TIMES BAD
+12003 CUNEIFORM SIGN A TIMES GAN2 TENU
+12004 CUNEIFORM SIGN A TIMES HA
+12005 CUNEIFORM SIGN A TIMES IGI
+12006 CUNEIFORM SIGN A TIMES LAGAR GUNU
+12007 CUNEIFORM SIGN A TIMES MUSH
+12008 CUNEIFORM SIGN A TIMES SAG
+12009 CUNEIFORM SIGN A2
+1200A CUNEIFORM SIGN AB
+1200B CUNEIFORM SIGN AB TIMES ASH2
+1200C CUNEIFORM SIGN AB TIMES DUN3 GUNU
+1200D CUNEIFORM SIGN AB TIMES GAL
+1200E CUNEIFORM SIGN AB TIMES GAN2 TENU
+1200F CUNEIFORM SIGN AB TIMES HA
+12010 CUNEIFORM SIGN AB TIMES IGI GUNU
+12011 CUNEIFORM SIGN AB TIMES IMIN
+12012 CUNEIFORM SIGN AB TIMES LAGAB
+12013 CUNEIFORM SIGN AB TIMES SHESH
+12014 CUNEIFORM SIGN AB TIMES U PLUS U PLUS U
+12015 CUNEIFORM SIGN AB GUNU
+12016 CUNEIFORM SIGN AB2
+12017 CUNEIFORM SIGN AB2 TIMES BALAG
+12018 CUNEIFORM SIGN AB2 TIMES GAN2 TENU
+12019 CUNEIFORM SIGN AB2 TIMES ME PLUS EN
+1201A CUNEIFORM SIGN AB2 TIMES SHA3
+1201B CUNEIFORM SIGN AB2 TIMES TAK4
+1201C CUNEIFORM SIGN AD
+1201D CUNEIFORM SIGN AK
+1201E CUNEIFORM SIGN AK TIMES ERIN2
+1201F CUNEIFORM SIGN AK TIMES SHITA PLUS GISH
+12020 CUNEIFORM SIGN AL
+12021 CUNEIFORM SIGN AL TIMES AL
+12022 CUNEIFORM SIGN AL TIMES DIM2
+12023 CUNEIFORM SIGN AL TIMES GISH
+12024 CUNEIFORM SIGN AL TIMES HA
+12025 CUNEIFORM SIGN AL TIMES KAD3
+12026 CUNEIFORM SIGN AL TIMES KI
+12027 CUNEIFORM SIGN AL TIMES SHE
+12028 CUNEIFORM SIGN AL TIMES USH
+12029 CUNEIFORM SIGN ALAN
+1202A CUNEIFORM SIGN ALEPH
+1202B CUNEIFORM SIGN AMAR
+1202C CUNEIFORM SIGN AMAR TIMES SHE
+1202D CUNEIFORM SIGN AN
+1202E CUNEIFORM SIGN AN OVER AN
+1202F CUNEIFORM SIGN AN THREE TIMES
+12030 CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA
+12031 CUNEIFORM SIGN AN PLUS NAGA SQUARED
+12032 CUNEIFORM SIGN ANSHE
+12033 CUNEIFORM SIGN APIN
+12034 CUNEIFORM SIGN ARAD
+12035 CUNEIFORM SIGN ARAD TIMES KUR
+12036 CUNEIFORM SIGN ARKAB
+12037 CUNEIFORM SIGN ASAL2
+12038 CUNEIFORM SIGN ASH
+12039 CUNEIFORM SIGN ASH ZIDA TENU
+1203A CUNEIFORM SIGN ASH KABA TENU
+1203B CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP
+1203C CUNEIFORM SIGN ASH OVER ASH OVER ASH
+1203D CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH
+1203E CUNEIFORM SIGN ASH2
+1203F CUNEIFORM SIGN ASHGAB
+12040 CUNEIFORM SIGN BA
+12041 CUNEIFORM SIGN BAD
+12042 CUNEIFORM SIGN BAG3
+12043 CUNEIFORM SIGN BAHAR2
+12044 CUNEIFORM SIGN BAL
+12045 CUNEIFORM SIGN BAL OVER BAL
+12046 CUNEIFORM SIGN BALAG
+12047 CUNEIFORM SIGN BAR
+12048 CUNEIFORM SIGN BARA2
+12049 CUNEIFORM SIGN BI
+1204A CUNEIFORM SIGN BI TIMES A
+1204B CUNEIFORM SIGN BI TIMES GAR
+1204C CUNEIFORM SIGN BI TIMES IGI GUNU
+1204D CUNEIFORM SIGN BU
+1204E CUNEIFORM SIGN BU OVER BU AB
+1204F CUNEIFORM SIGN BU OVER BU UN
+12050 CUNEIFORM SIGN BU CROSSING BU
+12051 CUNEIFORM SIGN BULUG
+12052 CUNEIFORM SIGN BULUG OVER BULUG
+12053 CUNEIFORM SIGN BUR
+12054 CUNEIFORM SIGN BUR2
+12055 CUNEIFORM SIGN DA
+12056 CUNEIFORM SIGN DAG
+12057 CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH
+12058 CUNEIFORM SIGN DAG KISIM5 TIMES AMAR
+12059 CUNEIFORM SIGN DAG KISIM5 TIMES BALAG
+1205A CUNEIFORM SIGN DAG KISIM5 TIMES BI
+1205B CUNEIFORM SIGN DAG KISIM5 TIMES GA
+1205C CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH
+1205D CUNEIFORM SIGN DAG KISIM5 TIMES GI
+1205E CUNEIFORM SIGN DAG KISIM5 TIMES GIR2
+1205F CUNEIFORM SIGN DAG KISIM5 TIMES GUD
+12060 CUNEIFORM SIGN DAG KISIM5 TIMES HA
+12061 CUNEIFORM SIGN DAG KISIM5 TIMES IR
+12062 CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU
+12063 CUNEIFORM SIGN DAG KISIM5 TIMES KAK
+12064 CUNEIFORM SIGN DAG KISIM5 TIMES LA
+12065 CUNEIFORM SIGN DAG KISIM5 TIMES LU
+12066 CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2
+12067 CUNEIFORM SIGN DAG KISIM5 TIMES LUM
+12068 CUNEIFORM SIGN DAG KISIM5 TIMES NE
+12069 CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP
+1206A CUNEIFORM SIGN DAG KISIM5 TIMES SI
+1206B CUNEIFORM SIGN DAG KISIM5 TIMES TAK4
+1206C CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2
+1206D CUNEIFORM SIGN DAG KISIM5 TIMES USH
+1206E CUNEIFORM SIGN DAM
+1206F CUNEIFORM SIGN DAR
+12070 CUNEIFORM SIGN DARA3
+12071 CUNEIFORM SIGN DARA4
+12072 CUNEIFORM SIGN DI
+12073 CUNEIFORM SIGN DIB
+12074 CUNEIFORM SIGN DIM
+12075 CUNEIFORM SIGN DIM TIMES SHE
+12076 CUNEIFORM SIGN DIM2
+12077 CUNEIFORM SIGN DIN
+12078 CUNEIFORM SIGN DIN KASKAL U GUNU DISH
+12079 CUNEIFORM SIGN DISH
+1207A CUNEIFORM SIGN DU
+1207B CUNEIFORM SIGN DU OVER DU
+1207C CUNEIFORM SIGN DU GUNU
+1207D CUNEIFORM SIGN DU SHESHIG
+1207E CUNEIFORM SIGN DUB
+1207F CUNEIFORM SIGN DUB TIMES ESH2
+12080 CUNEIFORM SIGN DUB2
+12081 CUNEIFORM SIGN DUG
+12082 CUNEIFORM SIGN DUGUD
+12083 CUNEIFORM SIGN DUH
+12084 CUNEIFORM SIGN DUN
+12085 CUNEIFORM SIGN DUN3
+12086 CUNEIFORM SIGN DUN3 GUNU
+12087 CUNEIFORM SIGN DUN3 GUNU GUNU
+12088 CUNEIFORM SIGN DUN4
+12089 CUNEIFORM SIGN DUR2
+1208A CUNEIFORM SIGN E
+1208B CUNEIFORM SIGN E TIMES PAP
+1208C CUNEIFORM SIGN E OVER E NUN OVER NUN
+1208D CUNEIFORM SIGN E2
+1208E CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA
+1208F CUNEIFORM SIGN E2 TIMES GAR
+12090 CUNEIFORM SIGN E2 TIMES MI
+12091 CUNEIFORM SIGN E2 TIMES SAL
+12092 CUNEIFORM SIGN E2 TIMES SHE
+12093 CUNEIFORM SIGN E2 TIMES U
+12094 CUNEIFORM SIGN EDIN
+12095 CUNEIFORM SIGN EGIR
+12096 CUNEIFORM SIGN EL
+12097 CUNEIFORM SIGN EN
+12098 CUNEIFORM SIGN EN TIMES GAN2
+12099 CUNEIFORM SIGN EN TIMES GAN2 TENU
+1209A CUNEIFORM SIGN EN TIMES ME
+1209B CUNEIFORM SIGN EN CROSSING EN
+1209C CUNEIFORM SIGN EN OPPOSING EN
+1209D CUNEIFORM SIGN EN SQUARED
+1209E CUNEIFORM SIGN EREN
+1209F CUNEIFORM SIGN ERIN2
+120A0 CUNEIFORM SIGN ESH2
+120A1 CUNEIFORM SIGN EZEN
+120A2 CUNEIFORM SIGN EZEN TIMES A
+120A3 CUNEIFORM SIGN EZEN TIMES A PLUS LAL
+120A4 CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL
+120A5 CUNEIFORM SIGN EZEN TIMES AN
+120A6 CUNEIFORM SIGN EZEN TIMES BAD
+120A7 CUNEIFORM SIGN EZEN TIMES DUN3 GUNU
+120A8 CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU
+120A9 CUNEIFORM SIGN EZEN TIMES HA
+120AA CUNEIFORM SIGN EZEN TIMES HA GUNU
+120AB CUNEIFORM SIGN EZEN TIMES IGI GUNU
+120AC CUNEIFORM SIGN EZEN TIMES KASKAL
+120AD CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED
+120AE CUNEIFORM SIGN EZEN TIMES KU3
+120AF CUNEIFORM SIGN EZEN TIMES LA
+120B0 CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL
+120B1 CUNEIFORM SIGN EZEN TIMES LI
+120B2 CUNEIFORM SIGN EZEN TIMES LU
+120B3 CUNEIFORM SIGN EZEN TIMES U2
+120B4 CUNEIFORM SIGN EZEN TIMES UD
+120B5 CUNEIFORM SIGN GA
+120B6 CUNEIFORM SIGN GA GUNU
+120B7 CUNEIFORM SIGN GA2
+120B8 CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA
+120B9 CUNEIFORM SIGN GA2 TIMES A PLUS HA
+120BA CUNEIFORM SIGN GA2 TIMES A PLUS IGI
+120BB CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB
+120BC CUNEIFORM SIGN GA2 TIMES AN
+120BD CUNEIFORM SIGN GA2 TIMES ASH
+120BE CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL
+120BF CUNEIFORM SIGN GA2 TIMES BAD
+120C0 CUNEIFORM SIGN GA2 TIMES BAR PLUS RA
+120C1 CUNEIFORM SIGN GA2 TIMES BUR
+120C2 CUNEIFORM SIGN GA2 TIMES BUR PLUS RA
+120C3 CUNEIFORM SIGN GA2 TIMES DA
+120C4 CUNEIFORM SIGN GA2 TIMES DI
+120C5 CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE
+120C6 CUNEIFORM SIGN GA2 TIMES DUB
+120C7 CUNEIFORM SIGN GA2 TIMES EL
+120C8 CUNEIFORM SIGN GA2 TIMES EL PLUS LA
+120C9 CUNEIFORM SIGN GA2 TIMES EN
+120CA CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU
+120CB CUNEIFORM SIGN GA2 TIMES GAN2 TENU
+120CC CUNEIFORM SIGN GA2 TIMES GAR
+120CD CUNEIFORM SIGN GA2 TIMES GI
+120CE CUNEIFORM SIGN GA2 TIMES GI4
+120CF CUNEIFORM SIGN GA2 TIMES GI4 PLUS A
+120D0 CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU
+120D1 CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2
+120D2 CUNEIFORM SIGN GA2 TIMES HAL
+120D3 CUNEIFORM SIGN GA2 TIMES HAL PLUS LA
+120D4 CUNEIFORM SIGN GA2 TIMES HI PLUS LI
+120D5 CUNEIFORM SIGN GA2 TIMES HUB2
+120D6 CUNEIFORM SIGN GA2 TIMES IGI GUNU
+120D7 CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH
+120D8 CUNEIFORM SIGN GA2 TIMES KAK
+120D9 CUNEIFORM SIGN GA2 TIMES KASKAL
+120DA CUNEIFORM SIGN GA2 TIMES KID
+120DB CUNEIFORM SIGN GA2 TIMES KID PLUS LAL
+120DC CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN
+120DD CUNEIFORM SIGN GA2 TIMES LA
+120DE CUNEIFORM SIGN GA2 TIMES ME PLUS EN
+120DF CUNEIFORM SIGN GA2 TIMES MI
+120E0 CUNEIFORM SIGN GA2 TIMES NUN
+120E1 CUNEIFORM SIGN GA2 TIMES NUN OVER NUN
+120E2 CUNEIFORM SIGN GA2 TIMES PA
+120E3 CUNEIFORM SIGN GA2 TIMES SAL
+120E4 CUNEIFORM SIGN GA2 TIMES SAR
+120E5 CUNEIFORM SIGN GA2 TIMES SHE
+120E6 CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR
+120E7 CUNEIFORM SIGN GA2 TIMES SHID
+120E8 CUNEIFORM SIGN GA2 TIMES SUM
+120E9 CUNEIFORM SIGN GA2 TIMES TAK4
+120EA CUNEIFORM SIGN GA2 TIMES U
+120EB CUNEIFORM SIGN GA2 TIMES UD
+120EC CUNEIFORM SIGN GA2 TIMES UD PLUS DU
+120ED CUNEIFORM SIGN GA2 OVER GA2
+120EE CUNEIFORM SIGN GABA
+120EF CUNEIFORM SIGN GABA CROSSING GABA
+120F0 CUNEIFORM SIGN GAD
+120F1 CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR
+120F2 CUNEIFORM SIGN GAL
+120F3 CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR
+120F4 CUNEIFORM SIGN GALAM
+120F5 CUNEIFORM SIGN GAM
+120F6 CUNEIFORM SIGN GAN
+120F7 CUNEIFORM SIGN GAN2
+120F8 CUNEIFORM SIGN GAN2 TENU
+120F9 CUNEIFORM SIGN GAN2 OVER GAN2
+120FA CUNEIFORM SIGN GAN2 CROSSING GAN2
+120FB CUNEIFORM SIGN GAR
+120FC CUNEIFORM SIGN GAR3
+120FD CUNEIFORM SIGN GASHAN
+120FE CUNEIFORM SIGN GESHTIN
+120FF CUNEIFORM SIGN GESHTIN TIMES KUR
+12100 CUNEIFORM SIGN GI
+12101 CUNEIFORM SIGN GI TIMES E
+12102 CUNEIFORM SIGN GI TIMES U
+12103 CUNEIFORM SIGN GI CROSSING GI
+12104 CUNEIFORM SIGN GI4
+12105 CUNEIFORM SIGN GI4 OVER GI4
+12106 CUNEIFORM SIGN GI4 CROSSING GI4
+12107 CUNEIFORM SIGN GIDIM
+12108 CUNEIFORM SIGN GIR2
+12109 CUNEIFORM SIGN GIR2 GUNU
+1210A CUNEIFORM SIGN GIR3
+1210B CUNEIFORM SIGN GIR3 TIMES A PLUS IGI
+1210C CUNEIFORM SIGN GIR3 TIMES GAN2 TENU
+1210D CUNEIFORM SIGN GIR3 TIMES IGI
+1210E CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI
+1210F CUNEIFORM SIGN GIR3 TIMES PA
+12110 CUNEIFORM SIGN GISAL
+12111 CUNEIFORM SIGN GISH
+12112 CUNEIFORM SIGN GISH CROSSING GISH
+12113 CUNEIFORM SIGN GISH TIMES BAD
+12114 CUNEIFORM SIGN GISH TIMES TAK4
+12115 CUNEIFORM SIGN GISH TENU
+12116 CUNEIFORM SIGN GU
+12117 CUNEIFORM SIGN GU CROSSING GU
+12118 CUNEIFORM SIGN GU2
+12119 CUNEIFORM SIGN GU2 TIMES KAK
+1211A CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU
+1211B CUNEIFORM SIGN GU2 TIMES NUN
+1211C CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2
+1211D CUNEIFORM SIGN GU2 GUNU
+1211E CUNEIFORM SIGN GUD
+1211F CUNEIFORM SIGN GUD TIMES A PLUS KUR
+12120 CUNEIFORM SIGN GUD TIMES KUR
+12121 CUNEIFORM SIGN GUD OVER GUD LUGAL
+12122 CUNEIFORM SIGN GUL
+12123 CUNEIFORM SIGN GUM
+12124 CUNEIFORM SIGN GUM TIMES SHE
+12125 CUNEIFORM SIGN GUR
+12126 CUNEIFORM SIGN GUR7
+12127 CUNEIFORM SIGN GURUN
+12128 CUNEIFORM SIGN GURUSH
+12129 CUNEIFORM SIGN HA
+1212A CUNEIFORM SIGN HA TENU
+1212B CUNEIFORM SIGN HA GUNU
+1212C CUNEIFORM SIGN HAL
+1212D CUNEIFORM SIGN HI
+1212E CUNEIFORM SIGN HI TIMES ASH
+1212F CUNEIFORM SIGN HI TIMES ASH2
+12130 CUNEIFORM SIGN HI TIMES BAD
+12131 CUNEIFORM SIGN HI TIMES DISH
+12132 CUNEIFORM SIGN HI TIMES GAD
+12133 CUNEIFORM SIGN HI TIMES KIN
+12134 CUNEIFORM SIGN HI TIMES NUN
+12135 CUNEIFORM SIGN HI TIMES SHE
+12136 CUNEIFORM SIGN HI TIMES U
+12137 CUNEIFORM SIGN HU
+12138 CUNEIFORM SIGN HUB2
+12139 CUNEIFORM SIGN HUB2 TIMES AN
+1213A CUNEIFORM SIGN HUB2 TIMES HAL
+1213B CUNEIFORM SIGN HUB2 TIMES KASKAL
+1213C CUNEIFORM SIGN HUB2 TIMES LISH
+1213D CUNEIFORM SIGN HUB2 TIMES UD
+1213E CUNEIFORM SIGN HUL2
+1213F CUNEIFORM SIGN I
+12140 CUNEIFORM SIGN I A
+12141 CUNEIFORM SIGN IB
+12142 CUNEIFORM SIGN IDIM
+12143 CUNEIFORM SIGN IDIM OVER IDIM BUR
+12144 CUNEIFORM SIGN IDIM OVER IDIM SQUARED
+12145 CUNEIFORM SIGN IG
+12146 CUNEIFORM SIGN IGI
+12147 CUNEIFORM SIGN IGI DIB
+12148 CUNEIFORM SIGN IGI RI
+12149 CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD
+1214A CUNEIFORM SIGN IGI GUNU
+1214B CUNEIFORM SIGN IL
+1214C CUNEIFORM SIGN IL TIMES GAN2 TENU
+1214D CUNEIFORM SIGN IL2
+1214E CUNEIFORM SIGN IM
+1214F CUNEIFORM SIGN IM TIMES TAK4
+12150 CUNEIFORM SIGN IM CROSSING IM
+12151 CUNEIFORM SIGN IM OPPOSING IM
+12152 CUNEIFORM SIGN IM SQUARED
+12153 CUNEIFORM SIGN IMIN
+12154 CUNEIFORM SIGN IN
+12155 CUNEIFORM SIGN IR
+12156 CUNEIFORM SIGN ISH
+12157 CUNEIFORM SIGN KA
+12158 CUNEIFORM SIGN KA TIMES A
+12159 CUNEIFORM SIGN KA TIMES AD
+1215A CUNEIFORM SIGN KA TIMES AD PLUS KU3
+1215B CUNEIFORM SIGN KA TIMES ASH2
+1215C CUNEIFORM SIGN KA TIMES BAD
+1215D CUNEIFORM SIGN KA TIMES BALAG
+1215E CUNEIFORM SIGN KA TIMES BAR
+1215F CUNEIFORM SIGN KA TIMES BI
+12160 CUNEIFORM SIGN KA TIMES ERIN2
+12161 CUNEIFORM SIGN KA TIMES ESH2
+12162 CUNEIFORM SIGN KA TIMES GA
+12163 CUNEIFORM SIGN KA TIMES GAL
+12164 CUNEIFORM SIGN KA TIMES GAN2 TENU
+12165 CUNEIFORM SIGN KA TIMES GAR
+12166 CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A
+12167 CUNEIFORM SIGN KA TIMES GI
+12168 CUNEIFORM SIGN KA TIMES GIR2
+12169 CUNEIFORM SIGN KA TIMES GISH PLUS SAR
+1216A CUNEIFORM SIGN KA TIMES GISH CROSSING GISH
+1216B CUNEIFORM SIGN KA TIMES GU
+1216C CUNEIFORM SIGN KA TIMES GUR7
+1216D CUNEIFORM SIGN KA TIMES IGI
+1216E CUNEIFORM SIGN KA TIMES IM
+1216F CUNEIFORM SIGN KA TIMES KAK
+12170 CUNEIFORM SIGN KA TIMES KI
+12171 CUNEIFORM SIGN KA TIMES KID
+12172 CUNEIFORM SIGN KA TIMES LI
+12173 CUNEIFORM SIGN KA TIMES LU
+12174 CUNEIFORM SIGN KA TIMES ME
+12175 CUNEIFORM SIGN KA TIMES ME PLUS DU
+12176 CUNEIFORM SIGN KA TIMES ME PLUS GI
+12177 CUNEIFORM SIGN KA TIMES ME PLUS TE
+12178 CUNEIFORM SIGN KA TIMES MI
+12179 CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ
+1217A CUNEIFORM SIGN KA TIMES NE
+1217B CUNEIFORM SIGN KA TIMES NUN
+1217C CUNEIFORM SIGN KA TIMES PI
+1217D CUNEIFORM SIGN KA TIMES RU
+1217E CUNEIFORM SIGN KA TIMES SA
+1217F CUNEIFORM SIGN KA TIMES SAR
+12180 CUNEIFORM SIGN KA TIMES SHA
+12181 CUNEIFORM SIGN KA TIMES SHE
+12182 CUNEIFORM SIGN KA TIMES SHID
+12183 CUNEIFORM SIGN KA TIMES SHU
+12184 CUNEIFORM SIGN KA TIMES SIG
+12185 CUNEIFORM SIGN KA TIMES SUHUR
+12186 CUNEIFORM SIGN KA TIMES TAR
+12187 CUNEIFORM SIGN KA TIMES U
+12188 CUNEIFORM SIGN KA TIMES U2
+12189 CUNEIFORM SIGN KA TIMES UD
+1218A CUNEIFORM SIGN KA TIMES UMUM TIMES PA
+1218B CUNEIFORM SIGN KA TIMES USH
+1218C CUNEIFORM SIGN KA TIMES ZI
+1218D CUNEIFORM SIGN KA2
+1218E CUNEIFORM SIGN KA2 CROSSING KA2
+1218F CUNEIFORM SIGN KAB
+12190 CUNEIFORM SIGN KAD2
+12191 CUNEIFORM SIGN KAD3
+12192 CUNEIFORM SIGN KAD4
+12193 CUNEIFORM SIGN KAD5
+12194 CUNEIFORM SIGN KAD5 OVER KAD5
+12195 CUNEIFORM SIGN KAK
+12196 CUNEIFORM SIGN KAK TIMES IGI GUNU
+12197 CUNEIFORM SIGN KAL
+12198 CUNEIFORM SIGN KAL TIMES BAD
+12199 CUNEIFORM SIGN KAL CROSSING KAL
+1219A CUNEIFORM SIGN KAM2
+1219B CUNEIFORM SIGN KAM4
+1219C CUNEIFORM SIGN KASKAL
+1219D CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219E CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219F CUNEIFORM SIGN KESH2
+121A0 CUNEIFORM SIGN KI
+121A1 CUNEIFORM SIGN KI TIMES BAD
+121A2 CUNEIFORM SIGN KI TIMES U
+121A3 CUNEIFORM SIGN KI TIMES UD
+121A4 CUNEIFORM SIGN KID
+121A5 CUNEIFORM SIGN KIN
+121A6 CUNEIFORM SIGN KISAL
+121A7 CUNEIFORM SIGN KISH
+121A8 CUNEIFORM SIGN KISIM5
+121A9 CUNEIFORM SIGN KISIM5 OVER KISIM5
+121AA CUNEIFORM SIGN KU
+121AB CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2
+121AC CUNEIFORM SIGN KU3
+121AD CUNEIFORM SIGN KU4
+121AE CUNEIFORM SIGN KU4 VARIANT FORM
+121AF CUNEIFORM SIGN KU7
+121B0 CUNEIFORM SIGN KUL
+121B1 CUNEIFORM SIGN KUL GUNU
+121B2 CUNEIFORM SIGN KUN
+121B3 CUNEIFORM SIGN KUR
+121B4 CUNEIFORM SIGN KUR OPPOSING KUR
+121B5 CUNEIFORM SIGN KUSHU2
+121B6 CUNEIFORM SIGN KWU318
+121B7 CUNEIFORM SIGN LA
+121B8 CUNEIFORM SIGN LAGAB
+121B9 CUNEIFORM SIGN LAGAB TIMES A
+121BA CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA
+121BB CUNEIFORM SIGN LAGAB TIMES A PLUS GAR
+121BC CUNEIFORM SIGN LAGAB TIMES A PLUS LAL
+121BD CUNEIFORM SIGN LAGAB TIMES AL
+121BE CUNEIFORM SIGN LAGAB TIMES AN
+121BF CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU
+121C0 CUNEIFORM SIGN LAGAB TIMES BAD
+121C1 CUNEIFORM SIGN LAGAB TIMES BI
+121C2 CUNEIFORM SIGN LAGAB TIMES DAR
+121C3 CUNEIFORM SIGN LAGAB TIMES EN
+121C4 CUNEIFORM SIGN LAGAB TIMES GA
+121C5 CUNEIFORM SIGN LAGAB TIMES GAR
+121C6 CUNEIFORM SIGN LAGAB TIMES GUD
+121C7 CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD
+121C8 CUNEIFORM SIGN LAGAB TIMES HA
+121C9 CUNEIFORM SIGN LAGAB TIMES HAL
+121CA CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN
+121CB CUNEIFORM SIGN LAGAB TIMES IGI GUNU
+121CC CUNEIFORM SIGN LAGAB TIMES IM
+121CD CUNEIFORM SIGN LAGAB TIMES IM PLUS HA
+121CE CUNEIFORM SIGN LAGAB TIMES IM PLUS LU
+121CF CUNEIFORM SIGN LAGAB TIMES KI
+121D0 CUNEIFORM SIGN LAGAB TIMES KIN
+121D1 CUNEIFORM SIGN LAGAB TIMES KU3
+121D2 CUNEIFORM SIGN LAGAB TIMES KUL
+121D3 CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A
+121D4 CUNEIFORM SIGN LAGAB TIMES LAGAB
+121D5 CUNEIFORM SIGN LAGAB TIMES LISH
+121D6 CUNEIFORM SIGN LAGAB TIMES LU
+121D7 CUNEIFORM SIGN LAGAB TIMES LUL
+121D8 CUNEIFORM SIGN LAGAB TIMES ME
+121D9 CUNEIFORM SIGN LAGAB TIMES ME PLUS EN
+121DA CUNEIFORM SIGN LAGAB TIMES MUSH
+121DB CUNEIFORM SIGN LAGAB TIMES NE
+121DC CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM
+121DD CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2
+121DE CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU
+121DF CUNEIFORM SIGN LAGAB TIMES SHU2
+121E0 CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2
+121E1 CUNEIFORM SIGN LAGAB TIMES SUM
+121E2 CUNEIFORM SIGN LAGAB TIMES TAG
+121E3 CUNEIFORM SIGN LAGAB TIMES TAK4
+121E4 CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA
+121E5 CUNEIFORM SIGN LAGAB TIMES U
+121E6 CUNEIFORM SIGN LAGAB TIMES U PLUS A
+121E7 CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U
+121E8 CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH
+121E9 CUNEIFORM SIGN LAGAB TIMES UD
+121EA CUNEIFORM SIGN LAGAB TIMES USH
+121EB CUNEIFORM SIGN LAGAB SQUARED
+121EC CUNEIFORM SIGN LAGAR
+121ED CUNEIFORM SIGN LAGAR TIMES SHE
+121EE CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM
+121EF CUNEIFORM SIGN LAGAR GUNU
+121F0 CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE
+121F1 CUNEIFORM SIGN LAHSHU
+121F2 CUNEIFORM SIGN LAL
+121F3 CUNEIFORM SIGN LAL TIMES LAL
+121F4 CUNEIFORM SIGN LAM
+121F5 CUNEIFORM SIGN LAM TIMES KUR
+121F6 CUNEIFORM SIGN LAM TIMES KUR PLUS RU
+121F7 CUNEIFORM SIGN LI
+121F8 CUNEIFORM SIGN LIL
+121F9 CUNEIFORM SIGN LIMMU2
+121FA CUNEIFORM SIGN LISH
+121FB CUNEIFORM SIGN LU
+121FC CUNEIFORM SIGN LU TIMES BAD
+121FD CUNEIFORM SIGN LU2
+121FE CUNEIFORM SIGN LU2 TIMES AL
+121FF CUNEIFORM SIGN LU2 TIMES BAD
+12200 CUNEIFORM SIGN LU2 TIMES ESH2
+12201 CUNEIFORM SIGN LU2 TIMES ESH2 TENU
+12202 CUNEIFORM SIGN LU2 TIMES GAN2 TENU
+12203 CUNEIFORM SIGN LU2 TIMES HI TIMES BAD
+12204 CUNEIFORM SIGN LU2 TIMES IM
+12205 CUNEIFORM SIGN LU2 TIMES KAD2
+12206 CUNEIFORM SIGN LU2 TIMES KAD3
+12207 CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH
+12208 CUNEIFORM SIGN LU2 TIMES KI
+12209 CUNEIFORM SIGN LU2 TIMES LA PLUS ASH
+1220A CUNEIFORM SIGN LU2 TIMES LAGAB
+1220B CUNEIFORM SIGN LU2 TIMES ME PLUS EN
+1220C CUNEIFORM SIGN LU2 TIMES NE
+1220D CUNEIFORM SIGN LU2 TIMES NU
+1220E CUNEIFORM SIGN LU2 TIMES SI PLUS ASH
+1220F CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU
+12210 CUNEIFORM SIGN LU2 TIMES TUG2
+12211 CUNEIFORM SIGN LU2 TENU
+12212 CUNEIFORM SIGN LU2 CROSSING LU2
+12213 CUNEIFORM SIGN LU2 OPPOSING LU2
+12214 CUNEIFORM SIGN LU2 SQUARED
+12215 CUNEIFORM SIGN LU2 SHESHIG
+12216 CUNEIFORM SIGN LU3
+12217 CUNEIFORM SIGN LUGAL
+12218 CUNEIFORM SIGN LUGAL OVER LUGAL
+12219 CUNEIFORM SIGN LUGAL OPPOSING LUGAL
+1221A CUNEIFORM SIGN LUGAL SHESHIG
+1221B CUNEIFORM SIGN LUH
+1221C CUNEIFORM SIGN LUL
+1221D CUNEIFORM SIGN LUM
+1221E CUNEIFORM SIGN LUM OVER LUM
+1221F CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR
+12220 CUNEIFORM SIGN MA
+12221 CUNEIFORM SIGN MA TIMES TAK4
+12222 CUNEIFORM SIGN MA GUNU
+12223 CUNEIFORM SIGN MA2
+12224 CUNEIFORM SIGN MAH
+12225 CUNEIFORM SIGN MAR
+12226 CUNEIFORM SIGN MASH
+12227 CUNEIFORM SIGN MASH2
+12228 CUNEIFORM SIGN ME
+12229 CUNEIFORM SIGN MES
+1222A CUNEIFORM SIGN MI
+1222B CUNEIFORM SIGN MIN
+1222C CUNEIFORM SIGN MU
+1222D CUNEIFORM SIGN MU OVER MU
+1222E CUNEIFORM SIGN MUG
+1222F CUNEIFORM SIGN MUG GUNU
+12230 CUNEIFORM SIGN MUNSUB
+12231 CUNEIFORM SIGN MURGU2
+12232 CUNEIFORM SIGN MUSH
+12233 CUNEIFORM SIGN MUSH TIMES A
+12234 CUNEIFORM SIGN MUSH TIMES KUR
+12235 CUNEIFORM SIGN MUSH TIMES ZA
+12236 CUNEIFORM SIGN MUSH OVER MUSH
+12237 CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA
+12238 CUNEIFORM SIGN MUSH CROSSING MUSH
+12239 CUNEIFORM SIGN MUSH3
+1223A CUNEIFORM SIGN MUSH3 TIMES A
+1223B CUNEIFORM SIGN MUSH3 TIMES A PLUS DI
+1223C CUNEIFORM SIGN MUSH3 TIMES DI
+1223D CUNEIFORM SIGN MUSH3 GUNU
+1223E CUNEIFORM SIGN NA
+1223F CUNEIFORM SIGN NA2
+12240 CUNEIFORM SIGN NAGA
+12241 CUNEIFORM SIGN NAGA INVERTED
+12242 CUNEIFORM SIGN NAGA TIMES SHU TENU
+12243 CUNEIFORM SIGN NAGA OPPOSING NAGA
+12244 CUNEIFORM SIGN NAGAR
+12245 CUNEIFORM SIGN NAM NUTILLU
+12246 CUNEIFORM SIGN NAM
+12247 CUNEIFORM SIGN NAM2
+12248 CUNEIFORM SIGN NE
+12249 CUNEIFORM SIGN NE TIMES A
+1224A CUNEIFORM SIGN NE TIMES UD
+1224B CUNEIFORM SIGN NE SHESHIG
+1224C CUNEIFORM SIGN NI
+1224D CUNEIFORM SIGN NI TIMES E
+1224E CUNEIFORM SIGN NI2
+1224F CUNEIFORM SIGN NIM
+12250 CUNEIFORM SIGN NIM TIMES GAN2 TENU
+12251 CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU
+12252 CUNEIFORM SIGN NINDA2
+12253 CUNEIFORM SIGN NINDA2 TIMES AN
+12254 CUNEIFORM SIGN NINDA2 TIMES ASH
+12255 CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH
+12256 CUNEIFORM SIGN NINDA2 TIMES GUD
+12257 CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU
+12258 CUNEIFORM SIGN NINDA2 TIMES NE
+12259 CUNEIFORM SIGN NINDA2 TIMES NUN
+1225A CUNEIFORM SIGN NINDA2 TIMES SHE
+1225B CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN
+1225C CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH
+1225D CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH
+1225E CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH
+1225F CUNEIFORM SIGN NINDA2 TIMES USH
+12260 CUNEIFORM SIGN NISAG
+12261 CUNEIFORM SIGN NU
+12262 CUNEIFORM SIGN NU11
+12263 CUNEIFORM SIGN NUN
+12264 CUNEIFORM SIGN NUN LAGAR TIMES GAR
+12265 CUNEIFORM SIGN NUN LAGAR TIMES MASH
+12266 CUNEIFORM SIGN NUN LAGAR TIMES SAL
+12267 CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL
+12268 CUNEIFORM SIGN NUN LAGAR TIMES USH
+12269 CUNEIFORM SIGN NUN TENU
+1226A CUNEIFORM SIGN NUN OVER NUN
+1226B CUNEIFORM SIGN NUN CROSSING NUN
+1226C CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR
+1226D CUNEIFORM SIGN NUNUZ
+1226E CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB
+1226F CUNEIFORM SIGN NUNUZ AB2 TIMES BI
+12270 CUNEIFORM SIGN NUNUZ AB2 TIMES DUG
+12271 CUNEIFORM SIGN NUNUZ AB2 TIMES GUD
+12272 CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU
+12273 CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3
+12274 CUNEIFORM SIGN NUNUZ AB2 TIMES LA
+12275 CUNEIFORM SIGN NUNUZ AB2 TIMES NE
+12276 CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3
+12277 CUNEIFORM SIGN NUNUZ AB2 TIMES U2
+12278 CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI
+12279 CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U
+1227A CUNEIFORM SIGN PA
+1227B CUNEIFORM SIGN PAD
+1227C CUNEIFORM SIGN PAN
+1227D CUNEIFORM SIGN PAP
+1227E CUNEIFORM SIGN PESH2
+1227F CUNEIFORM SIGN PI
+12280 CUNEIFORM SIGN PI TIMES A
+12281 CUNEIFORM SIGN PI TIMES AB
+12282 CUNEIFORM SIGN PI TIMES BI
+12283 CUNEIFORM SIGN PI TIMES BU
+12284 CUNEIFORM SIGN PI TIMES E
+12285 CUNEIFORM SIGN PI TIMES I
+12286 CUNEIFORM SIGN PI TIMES IB
+12287 CUNEIFORM SIGN PI TIMES U
+12288 CUNEIFORM SIGN PI TIMES U2
+12289 CUNEIFORM SIGN PI CROSSING PI
+1228A CUNEIFORM SIGN PIRIG
+1228B CUNEIFORM SIGN PIRIG TIMES KAL
+1228C CUNEIFORM SIGN PIRIG TIMES UD
+1228D CUNEIFORM SIGN PIRIG TIMES ZA
+1228E CUNEIFORM SIGN PIRIG OPPOSING PIRIG
+1228F CUNEIFORM SIGN RA
+12290 CUNEIFORM SIGN RAB
+12291 CUNEIFORM SIGN RI
+12292 CUNEIFORM SIGN RU
+12293 CUNEIFORM SIGN SA
+12294 CUNEIFORM SIGN SAG NUTILLU
+12295 CUNEIFORM SIGN SAG
+12296 CUNEIFORM SIGN SAG TIMES A
+12297 CUNEIFORM SIGN SAG TIMES DU
+12298 CUNEIFORM SIGN SAG TIMES DUB
+12299 CUNEIFORM SIGN SAG TIMES HA
+1229A CUNEIFORM SIGN SAG TIMES KAK
+1229B CUNEIFORM SIGN SAG TIMES KUR
+1229C CUNEIFORM SIGN SAG TIMES LUM
+1229D CUNEIFORM SIGN SAG TIMES MI
+1229E CUNEIFORM SIGN SAG TIMES NUN
+1229F CUNEIFORM SIGN SAG TIMES SAL
+122A0 CUNEIFORM SIGN SAG TIMES SHID
+122A1 CUNEIFORM SIGN SAG TIMES TAB
+122A2 CUNEIFORM SIGN SAG TIMES U2
+122A3 CUNEIFORM SIGN SAG TIMES UB
+122A4 CUNEIFORM SIGN SAG TIMES UM
+122A5 CUNEIFORM SIGN SAG TIMES UR
+122A6 CUNEIFORM SIGN SAG TIMES USH
+122A7 CUNEIFORM SIGN SAG OVER SAG
+122A8 CUNEIFORM SIGN SAG GUNU
+122A9 CUNEIFORM SIGN SAL
+122AA CUNEIFORM SIGN SAL LAGAB TIMES ASH2
+122AB CUNEIFORM SIGN SANGA2
+122AC CUNEIFORM SIGN SAR
+122AD CUNEIFORM SIGN SHA
+122AE CUNEIFORM SIGN SHA3
+122AF CUNEIFORM SIGN SHA3 TIMES A
+122B0 CUNEIFORM SIGN SHA3 TIMES BAD
+122B1 CUNEIFORM SIGN SHA3 TIMES GISH
+122B2 CUNEIFORM SIGN SHA3 TIMES NE
+122B3 CUNEIFORM SIGN SHA3 TIMES SHU2
+122B4 CUNEIFORM SIGN SHA3 TIMES TUR
+122B5 CUNEIFORM SIGN SHA3 TIMES U
+122B6 CUNEIFORM SIGN SHA3 TIMES U PLUS A
+122B7 CUNEIFORM SIGN SHA6
+122B8 CUNEIFORM SIGN SHAB6
+122B9 CUNEIFORM SIGN SHAR2
+122BA CUNEIFORM SIGN SHE
+122BB CUNEIFORM SIGN SHE HU
+122BC CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR
+122BD CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR
+122BE CUNEIFORM SIGN SHEG9
+122BF CUNEIFORM SIGN SHEN
+122C0 CUNEIFORM SIGN SHESH
+122C1 CUNEIFORM SIGN SHESH2
+122C2 CUNEIFORM SIGN SHESHLAM
+122C3 CUNEIFORM SIGN SHID
+122C4 CUNEIFORM SIGN SHID TIMES A
+122C5 CUNEIFORM SIGN SHID TIMES IM
+122C6 CUNEIFORM SIGN SHIM
+122C7 CUNEIFORM SIGN SHIM TIMES A
+122C8 CUNEIFORM SIGN SHIM TIMES BAL
+122C9 CUNEIFORM SIGN SHIM TIMES BULUG
+122CA CUNEIFORM SIGN SHIM TIMES DIN
+122CB CUNEIFORM SIGN SHIM TIMES GAR
+122CC CUNEIFORM SIGN SHIM TIMES IGI
+122CD CUNEIFORM SIGN SHIM TIMES IGI GUNU
+122CE CUNEIFORM SIGN SHIM TIMES KUSHU2
+122CF CUNEIFORM SIGN SHIM TIMES LUL
+122D0 CUNEIFORM SIGN SHIM TIMES MUG
+122D1 CUNEIFORM SIGN SHIM TIMES SAL
+122D2 CUNEIFORM SIGN SHINIG
+122D3 CUNEIFORM SIGN SHIR
+122D4 CUNEIFORM SIGN SHIR TENU
+122D5 CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR
+122D6 CUNEIFORM SIGN SHITA
+122D7 CUNEIFORM SIGN SHU
+122D8 CUNEIFORM SIGN SHU OVER INVERTED SHU
+122D9 CUNEIFORM SIGN SHU2
+122DA CUNEIFORM SIGN SHUBUR
+122DB CUNEIFORM SIGN SI
+122DC CUNEIFORM SIGN SI GUNU
+122DD CUNEIFORM SIGN SIG
+122DE CUNEIFORM SIGN SIG4
+122DF CUNEIFORM SIGN SIG4 OVER SIG4 SHU2
+122E0 CUNEIFORM SIGN SIK2
+122E1 CUNEIFORM SIGN SILA3
+122E2 CUNEIFORM SIGN SU
+122E3 CUNEIFORM SIGN SU OVER SU
+122E4 CUNEIFORM SIGN SUD
+122E5 CUNEIFORM SIGN SUD2
+122E6 CUNEIFORM SIGN SUHUR
+122E7 CUNEIFORM SIGN SUM
+122E8 CUNEIFORM SIGN SUMASH
+122E9 CUNEIFORM SIGN SUR
+122EA CUNEIFORM SIGN SUR9
+122EB CUNEIFORM SIGN TA
+122EC CUNEIFORM SIGN TA ASTERISK
+122ED CUNEIFORM SIGN TA TIMES HI
+122EE CUNEIFORM SIGN TA TIMES MI
+122EF CUNEIFORM SIGN TA GUNU
+122F0 CUNEIFORM SIGN TAB
+122F1 CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH
+122F2 CUNEIFORM SIGN TAB SQUARED
+122F3 CUNEIFORM SIGN TAG
+122F4 CUNEIFORM SIGN TAG TIMES BI
+122F5 CUNEIFORM SIGN TAG TIMES GUD
+122F6 CUNEIFORM SIGN TAG TIMES SHE
+122F7 CUNEIFORM SIGN TAG TIMES SHU
+122F8 CUNEIFORM SIGN TAG TIMES TUG2
+122F9 CUNEIFORM SIGN TAG TIMES UD
+122FA CUNEIFORM SIGN TAK4
+122FB CUNEIFORM SIGN TAR
+122FC CUNEIFORM SIGN TE
+122FD CUNEIFORM SIGN TE GUNU
+122FE CUNEIFORM SIGN TI
+122FF CUNEIFORM SIGN TI TENU
+12300 CUNEIFORM SIGN TIL
+12301 CUNEIFORM SIGN TIR
+12302 CUNEIFORM SIGN TIR TIMES TAK4
+12303 CUNEIFORM SIGN TIR OVER TIR
+12304 CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR
+12305 CUNEIFORM SIGN TU
+12306 CUNEIFORM SIGN TUG2
+12307 CUNEIFORM SIGN TUK
+12308 CUNEIFORM SIGN TUM
+12309 CUNEIFORM SIGN TUR
+1230A CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA
+1230B CUNEIFORM SIGN U
+1230C CUNEIFORM SIGN U GUD
+1230D CUNEIFORM SIGN U U U
+1230E CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR
+1230F CUNEIFORM SIGN U OVER U SUR OVER SUR
+12310 CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED
+12311 CUNEIFORM SIGN U2
+12312 CUNEIFORM SIGN UB
+12313 CUNEIFORM SIGN UD
+12314 CUNEIFORM SIGN UD KUSHU2
+12315 CUNEIFORM SIGN UD TIMES BAD
+12316 CUNEIFORM SIGN UD TIMES MI
+12317 CUNEIFORM SIGN UD TIMES U PLUS U PLUS U
+12318 CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU
+12319 CUNEIFORM SIGN UD GUNU
+1231A CUNEIFORM SIGN UD SHESHIG
+1231B CUNEIFORM SIGN UD SHESHIG TIMES BAD
+1231C CUNEIFORM SIGN UDUG
+1231D CUNEIFORM SIGN UM
+1231E CUNEIFORM SIGN UM TIMES LAGAB
+1231F CUNEIFORM SIGN UM TIMES ME PLUS DA
+12320 CUNEIFORM SIGN UM TIMES SHA3
+12321 CUNEIFORM SIGN UM TIMES U
+12322 CUNEIFORM SIGN UMBIN
+12323 CUNEIFORM SIGN UMUM
+12324 CUNEIFORM SIGN UMUM TIMES KASKAL
+12325 CUNEIFORM SIGN UMUM TIMES PA
+12326 CUNEIFORM SIGN UN
+12327 CUNEIFORM SIGN UN GUNU
+12328 CUNEIFORM SIGN UR
+12329 CUNEIFORM SIGN UR CROSSING UR
+1232A CUNEIFORM SIGN UR SHESHIG
+1232B CUNEIFORM SIGN UR2
+1232C CUNEIFORM SIGN UR2 TIMES A PLUS HA
+1232D CUNEIFORM SIGN UR2 TIMES A PLUS NA
+1232E CUNEIFORM SIGN UR2 TIMES AL
+1232F CUNEIFORM SIGN UR2 TIMES HA
+12330 CUNEIFORM SIGN UR2 TIMES NUN
+12331 CUNEIFORM SIGN UR2 TIMES U2
+12332 CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH
+12333 CUNEIFORM SIGN UR2 TIMES U2 PLUS BI
+12334 CUNEIFORM SIGN UR4
+12335 CUNEIFORM SIGN URI
+12336 CUNEIFORM SIGN URI3
+12337 CUNEIFORM SIGN URU
+12338 CUNEIFORM SIGN URU TIMES A
+12339 CUNEIFORM SIGN URU TIMES ASHGAB
+1233A CUNEIFORM SIGN URU TIMES BAR
+1233B CUNEIFORM SIGN URU TIMES DUN
+1233C CUNEIFORM SIGN URU TIMES GA
+1233D CUNEIFORM SIGN URU TIMES GAL
+1233E CUNEIFORM SIGN URU TIMES GAN2 TENU
+1233F CUNEIFORM SIGN URU TIMES GAR
+12340 CUNEIFORM SIGN URU TIMES GU
+12341 CUNEIFORM SIGN URU TIMES HA
+12342 CUNEIFORM SIGN URU TIMES IGI
+12343 CUNEIFORM SIGN URU TIMES IM
+12344 CUNEIFORM SIGN URU TIMES ISH
+12345 CUNEIFORM SIGN URU TIMES KI
+12346 CUNEIFORM SIGN URU TIMES LUM
+12347 CUNEIFORM SIGN URU TIMES MIN
+12348 CUNEIFORM SIGN URU TIMES PA
+12349 CUNEIFORM SIGN URU TIMES SHE
+1234A CUNEIFORM SIGN URU TIMES SIG4
+1234B CUNEIFORM SIGN URU TIMES TU
+1234C CUNEIFORM SIGN URU TIMES U PLUS GUD
+1234D CUNEIFORM SIGN URU TIMES UD
+1234E CUNEIFORM SIGN URU TIMES URUDA
+1234F CUNEIFORM SIGN URUDA
+12350 CUNEIFORM SIGN URUDA TIMES U
+12351 CUNEIFORM SIGN USH
+12352 CUNEIFORM SIGN USH TIMES A
+12353 CUNEIFORM SIGN USH TIMES KU
+12354 CUNEIFORM SIGN USH TIMES KUR
+12355 CUNEIFORM SIGN USH TIMES TAK4
+12356 CUNEIFORM SIGN USHX
+12357 CUNEIFORM SIGN USH2
+12358 CUNEIFORM SIGN USHUMX
+12359 CUNEIFORM SIGN UTUKI
+1235A CUNEIFORM SIGN UZ3
+1235B CUNEIFORM SIGN UZ3 TIMES KASKAL
+1235C CUNEIFORM SIGN UZU
+1235D CUNEIFORM SIGN ZA
+1235E CUNEIFORM SIGN ZA TENU
+1235F CUNEIFORM SIGN ZA SQUARED TIMES KUR
+12360 CUNEIFORM SIGN ZAG
+12361 CUNEIFORM SIGN ZAMX
+12362 CUNEIFORM SIGN ZE2
+12363 CUNEIFORM SIGN ZI
+12364 CUNEIFORM SIGN ZI OVER ZI
+12365 CUNEIFORM SIGN ZI3
+12366 CUNEIFORM SIGN ZIB
+12367 CUNEIFORM SIGN ZIB KABA TENU
+12368 CUNEIFORM SIGN ZIG
+12369 CUNEIFORM SIGN ZIZ2
+1236A CUNEIFORM SIGN ZU
+1236B CUNEIFORM SIGN ZU5
+1236C CUNEIFORM SIGN ZU5 TIMES A
+1236D CUNEIFORM SIGN ZUBUR
+1236E CUNEIFORM SIGN ZUM
+12400 CUNEIFORM NUMERIC SIGN TWO ASH
+12401 CUNEIFORM NUMERIC SIGN THREE ASH
+12402 CUNEIFORM NUMERIC SIGN FOUR ASH
+12403 CUNEIFORM NUMERIC SIGN FIVE ASH
+12404 CUNEIFORM NUMERIC SIGN SIX ASH
+12405 CUNEIFORM NUMERIC SIGN SEVEN ASH
+12406 CUNEIFORM NUMERIC SIGN EIGHT ASH
+12407 CUNEIFORM NUMERIC SIGN NINE ASH
+12408 CUNEIFORM NUMERIC SIGN THREE DISH
+12409 CUNEIFORM NUMERIC SIGN FOUR DISH
+1240A CUNEIFORM NUMERIC SIGN FIVE DISH
+1240B CUNEIFORM NUMERIC SIGN SIX DISH
+1240C CUNEIFORM NUMERIC SIGN SEVEN DISH
+1240D CUNEIFORM NUMERIC SIGN EIGHT DISH
+1240E CUNEIFORM NUMERIC SIGN NINE DISH
+1240F CUNEIFORM NUMERIC SIGN FOUR U
+12410 CUNEIFORM NUMERIC SIGN FIVE U
+12411 CUNEIFORM NUMERIC SIGN SIX U
+12412 CUNEIFORM NUMERIC SIGN SEVEN U
+12413 CUNEIFORM NUMERIC SIGN EIGHT U
+12414 CUNEIFORM NUMERIC SIGN NINE U
+12415 CUNEIFORM NUMERIC SIGN ONE GESH2
+12416 CUNEIFORM NUMERIC SIGN TWO GESH2
+12417 CUNEIFORM NUMERIC SIGN THREE GESH2
+12418 CUNEIFORM NUMERIC SIGN FOUR GESH2
+12419 CUNEIFORM NUMERIC SIGN FIVE GESH2
+1241A CUNEIFORM NUMERIC SIGN SIX GESH2
+1241B CUNEIFORM NUMERIC SIGN SEVEN GESH2
+1241C CUNEIFORM NUMERIC SIGN EIGHT GESH2
+1241D CUNEIFORM NUMERIC SIGN NINE GESH2
+1241E CUNEIFORM NUMERIC SIGN ONE GESHU
+1241F CUNEIFORM NUMERIC SIGN TWO GESHU
+12420 CUNEIFORM NUMERIC SIGN THREE GESHU
+12421 CUNEIFORM NUMERIC SIGN FOUR GESHU
+12422 CUNEIFORM NUMERIC SIGN FIVE GESHU
+12423 CUNEIFORM NUMERIC SIGN TWO SHAR2
+12424 CUNEIFORM NUMERIC SIGN THREE SHAR2
+12425 CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM
+12426 CUNEIFORM NUMERIC SIGN FOUR SHAR2
+12427 CUNEIFORM NUMERIC SIGN FIVE SHAR2
+12428 CUNEIFORM NUMERIC SIGN SIX SHAR2
+12429 CUNEIFORM NUMERIC SIGN SEVEN SHAR2
+1242A CUNEIFORM NUMERIC SIGN EIGHT SHAR2
+1242B CUNEIFORM NUMERIC SIGN NINE SHAR2
+1242C CUNEIFORM NUMERIC SIGN ONE SHARU
+1242D CUNEIFORM NUMERIC SIGN TWO SHARU
+1242E CUNEIFORM NUMERIC SIGN THREE SHARU
+1242F CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM
+12430 CUNEIFORM NUMERIC SIGN FOUR SHARU
+12431 CUNEIFORM NUMERIC SIGN FIVE SHARU
+12432 CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH
+12433 CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN
+12434 CUNEIFORM NUMERIC SIGN ONE BURU
+12435 CUNEIFORM NUMERIC SIGN TWO BURU
+12436 CUNEIFORM NUMERIC SIGN THREE BURU
+12437 CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM
+12438 CUNEIFORM NUMERIC SIGN FOUR BURU
+12439 CUNEIFORM NUMERIC SIGN FIVE BURU
+1243A CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16
+1243B CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21
+1243C CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU
+1243D CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4
+1243E CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A
+1243F CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B
+12440 CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9
+12441 CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3
+12442 CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A
+12443 CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B
+12444 CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU
+12445 CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3
+12446 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU
+12447 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3
+12448 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4
+12449 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A
+1244A CUNEIFORM NUMERIC SIGN TWO ASH TENU
+1244B CUNEIFORM NUMERIC SIGN THREE ASH TENU
+1244C CUNEIFORM NUMERIC SIGN FOUR ASH TENU
+1244D CUNEIFORM NUMERIC SIGN FIVE ASH TENU
+1244E CUNEIFORM NUMERIC SIGN SIX ASH TENU
+1244F CUNEIFORM NUMERIC SIGN ONE BAN2
+12450 CUNEIFORM NUMERIC SIGN TWO BAN2
+12451 CUNEIFORM NUMERIC SIGN THREE BAN2
+12452 CUNEIFORM NUMERIC SIGN FOUR BAN2
+12453 CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM
+12454 CUNEIFORM NUMERIC SIGN FIVE BAN2
+12455 CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM
+12456 CUNEIFORM NUMERIC SIGN NIGIDAMIN
+12457 CUNEIFORM NUMERIC SIGN NIGIDAESH
+12458 CUNEIFORM NUMERIC SIGN ONE ESHE3
+12459 CUNEIFORM NUMERIC SIGN TWO ESHE3
+1245A CUNEIFORM NUMERIC SIGN ONE THIRD DISH
+1245B CUNEIFORM NUMERIC SIGN TWO THIRDS DISH
+1245C CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH
+1245D CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A
+1245E CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A
+1245F CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH
+12460 CUNEIFORM NUMERIC SIGN ONE QUARTER ASH
+12461 CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH
+12462 CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+12470 CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER
+12471 CUNEIFORM PUNCTUATION SIGN VERTICAL COLON
+12472 CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON
+12473 CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+1D000 BYZANTINE MUSICAL SYMBOL PSILI
+1D001 BYZANTINE MUSICAL SYMBOL DASEIA
+1D002 BYZANTINE MUSICAL SYMBOL PERISPOMENI
+1D003 BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON
+1D004 BYZANTINE MUSICAL SYMBOL OXEIA DIPLI
+1D005 BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON
+1D006 BYZANTINE MUSICAL SYMBOL VAREIA DIPLI
+1D007 BYZANTINE MUSICAL SYMBOL KATHISTI
+1D008 BYZANTINE MUSICAL SYMBOL SYRMATIKI
+1D009 BYZANTINE MUSICAL SYMBOL PARAKLITIKI
+1D00A BYZANTINE MUSICAL SYMBOL YPOKRISIS
+1D00B BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI
+1D00C BYZANTINE MUSICAL SYMBOL KREMASTI
+1D00D BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON
+1D00E BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON
+1D00F BYZANTINE MUSICAL SYMBOL TELEIA
+1D010 BYZANTINE MUSICAL SYMBOL KENTIMATA
+1D011 BYZANTINE MUSICAL SYMBOL APOSTROFOS
+1D012 BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI
+1D013 BYZANTINE MUSICAL SYMBOL SYNEVMA
+1D014 BYZANTINE MUSICAL SYMBOL THITA
+1D015 BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION
+1D016 BYZANTINE MUSICAL SYMBOL GORGON ARCHAION
+1D017 BYZANTINE MUSICAL SYMBOL PSILON
+1D018 BYZANTINE MUSICAL SYMBOL CHAMILON
+1D019 BYZANTINE MUSICAL SYMBOL VATHY
+1D01A BYZANTINE MUSICAL SYMBOL ISON ARCHAION
+1D01B BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION
+1D01C BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION
+1D01D BYZANTINE MUSICAL SYMBOL SAXIMATA
+1D01E BYZANTINE MUSICAL SYMBOL PARICHON
+1D01F BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA
+1D020 BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION
+1D021 BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION
+1D022 BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION
+1D023 BYZANTINE MUSICAL SYMBOL APOTHEMA
+1D024 BYZANTINE MUSICAL SYMBOL KLASMA
+1D025 BYZANTINE MUSICAL SYMBOL REVMA
+1D026 BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION
+1D027 BYZANTINE MUSICAL SYMBOL TINAGMA
+1D028 BYZANTINE MUSICAL SYMBOL ANATRICHISMA
+1D029 BYZANTINE MUSICAL SYMBOL SEISMA
+1D02A BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION
+1D02B BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU
+1D02C BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION
+1D02D BYZANTINE MUSICAL SYMBOL THEMA
+1D02E BYZANTINE MUSICAL SYMBOL LEMOI
+1D02F BYZANTINE MUSICAL SYMBOL DYO
+1D030 BYZANTINE MUSICAL SYMBOL TRIA
+1D031 BYZANTINE MUSICAL SYMBOL TESSERA
+1D032 BYZANTINE MUSICAL SYMBOL KRATIMATA
+1D033 BYZANTINE MUSICAL SYMBOL APESO EXO NEO
+1D034 BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION
+1D035 BYZANTINE MUSICAL SYMBOL IMIFTHORA
+1D036 BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION
+1D037 BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON
+1D038 BYZANTINE MUSICAL SYMBOL PELASTON
+1D039 BYZANTINE MUSICAL SYMBOL PSIFISTON
+1D03A BYZANTINE MUSICAL SYMBOL KONTEVMA
+1D03B BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION
+1D03C BYZANTINE MUSICAL SYMBOL RAPISMA
+1D03D BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION
+1D03E BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION
+1D03F BYZANTINE MUSICAL SYMBOL ICHADIN
+1D040 BYZANTINE MUSICAL SYMBOL NANA
+1D041 BYZANTINE MUSICAL SYMBOL PETASMA
+1D042 BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO
+1D043 BYZANTINE MUSICAL SYMBOL TROMIKON ALLO
+1D044 BYZANTINE MUSICAL SYMBOL STRAGGISMATA
+1D045 BYZANTINE MUSICAL SYMBOL GRONTHISMATA
+1D046 BYZANTINE MUSICAL SYMBOL ISON NEO
+1D047 BYZANTINE MUSICAL SYMBOL OLIGON NEO
+1D048 BYZANTINE MUSICAL SYMBOL OXEIA NEO
+1D049 BYZANTINE MUSICAL SYMBOL PETASTI
+1D04A BYZANTINE MUSICAL SYMBOL KOUFISMA
+1D04B BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA
+1D04C BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA
+1D04D BYZANTINE MUSICAL SYMBOL PELASTON NEO
+1D04E BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO
+1D04F BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO
+1D050 BYZANTINE MUSICAL SYMBOL YPSILI
+1D051 BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO
+1D052 BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO
+1D053 BYZANTINE MUSICAL SYMBOL YPORROI
+1D054 BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON
+1D055 BYZANTINE MUSICAL SYMBOL ELAFRON
+1D056 BYZANTINE MUSICAL SYMBOL CHAMILI
+1D057 BYZANTINE MUSICAL SYMBOL MIKRON ISON
+1D058 BYZANTINE MUSICAL SYMBOL VAREIA NEO
+1D059 BYZANTINE MUSICAL SYMBOL PIASMA NEO
+1D05A BYZANTINE MUSICAL SYMBOL PSIFISTON NEO
+1D05B BYZANTINE MUSICAL SYMBOL OMALON
+1D05C BYZANTINE MUSICAL SYMBOL ANTIKENOMA
+1D05D BYZANTINE MUSICAL SYMBOL LYGISMA
+1D05E BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO
+1D05F BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO
+1D060 BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA
+1D061 BYZANTINE MUSICAL SYMBOL KYLISMA
+1D062 BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA
+1D063 BYZANTINE MUSICAL SYMBOL TROMIKON NEO
+1D064 BYZANTINE MUSICAL SYMBOL EKSTREPTON
+1D065 BYZANTINE MUSICAL SYMBOL SYNAGMA NEO
+1D066 BYZANTINE MUSICAL SYMBOL SYRMA
+1D067 BYZANTINE MUSICAL SYMBOL CHOREVMA NEO
+1D068 BYZANTINE MUSICAL SYMBOL EPEGERMA
+1D069 BYZANTINE MUSICAL SYMBOL SEISMA NEO
+1D06A BYZANTINE MUSICAL SYMBOL XIRON KLASMA
+1D06B BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON
+1D06C BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA
+1D06D BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA
+1D06E BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA
+1D06F BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA
+1D070 BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA
+1D071 BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA
+1D072 BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON
+1D073 BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON
+1D074 BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON
+1D075 BYZANTINE MUSICAL SYMBOL OYRANISMA NEO
+1D076 BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO
+1D077 BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO
+1D078 BYZANTINE MUSICAL SYMBOL THEMA APLOUN
+1D079 BYZANTINE MUSICAL SYMBOL THES KAI APOTHES
+1D07A BYZANTINE MUSICAL SYMBOL KATAVASMA
+1D07B BYZANTINE MUSICAL SYMBOL ENDOFONON
+1D07C BYZANTINE MUSICAL SYMBOL YFEN KATO
+1D07D BYZANTINE MUSICAL SYMBOL YFEN ANO
+1D07E BYZANTINE MUSICAL SYMBOL STAVROS
+1D07F BYZANTINE MUSICAL SYMBOL KLASMA ANO
+1D080 BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION
+1D081 BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION
+1D082 BYZANTINE MUSICAL SYMBOL KRATIMA ALLO
+1D083 BYZANTINE MUSICAL SYMBOL KRATIMA NEO
+1D084 BYZANTINE MUSICAL SYMBOL APODERMA NEO
+1D085 BYZANTINE MUSICAL SYMBOL APLI
+1D086 BYZANTINE MUSICAL SYMBOL DIPLI
+1D087 BYZANTINE MUSICAL SYMBOL TRIPLI
+1D088 BYZANTINE MUSICAL SYMBOL TETRAPLI
+1D089 BYZANTINE MUSICAL SYMBOL KORONIS
+1D08A BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU
+1D08B BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON
+1D08C BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON
+1D08D BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON
+1D08E BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU
+1D08F BYZANTINE MUSICAL SYMBOL GORGON NEO ANO
+1D090 BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA
+1D091 BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA
+1D092 BYZANTINE MUSICAL SYMBOL DIGORGON
+1D093 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO
+1D094 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO
+1D095 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA
+1D096 BYZANTINE MUSICAL SYMBOL TRIGORGON
+1D097 BYZANTINE MUSICAL SYMBOL ARGON
+1D098 BYZANTINE MUSICAL SYMBOL IMIDIARGON
+1D099 BYZANTINE MUSICAL SYMBOL DIARGON
+1D09A BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI
+1D09B BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI
+1D09C BYZANTINE MUSICAL SYMBOL AGOGI ARGI
+1D09D BYZANTINE MUSICAL SYMBOL AGOGI METRIA
+1D09E BYZANTINE MUSICAL SYMBOL AGOGI MESI
+1D09F BYZANTINE MUSICAL SYMBOL AGOGI GORGI
+1D0A0 BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI
+1D0A1 BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI
+1D0A2 BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS
+1D0A3 BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS
+1D0A4 BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS
+1D0A5 BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS
+1D0A6 BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS
+1D0A7 BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS
+1D0A8 BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS
+1D0A9 BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS
+1D0AB BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS
+1D0AC BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS
+1D0AD BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS
+1D0AE BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS
+1D0AF BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS
+1D0B0 BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS
+1D0B1 BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS
+1D0B2 BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS
+1D0B3 BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4 BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN
+1D0B5 BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN
+1D0B6 BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU
+1D0B7 BYZANTINE MUSICAL SYMBOL IMIFONON
+1D0B8 BYZANTINE MUSICAL SYMBOL IMIFTHORON
+1D0B9 BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU
+1D0BA BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA
+1D0BB BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA
+1D0BC BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS
+1D0BD BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI
+1D0BE BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI
+1D0BF BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE
+1D0C0 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO
+1D0C1 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO
+1D0C2 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO
+1D0C3 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
+1D0C4 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
+1D0C5 BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+1D0C6 BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
+1D0C7 BYZANTINE MUSICAL SYMBOL FTHORA NENANO
+1D0C8 BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
+1D0C9 BYZANTINE MUSICAL SYMBOL CHROA KLITON
+1D0CA BYZANTINE MUSICAL SYMBOL CHROA SPATHI
+1D0CB BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION
+1D0CC BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA
+1D0CD BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION
+1D0CE BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION
+1D0CF BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION
+1D0D0 BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA
+1D0D1 BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2 BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA
+1D0D3 BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4 BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA
+1D0D5 BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6 BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA
+1D0D7 BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8 BYZANTINE MUSICAL SYMBOL GENIKI DIESIS
+1D0D9 BYZANTINE MUSICAL SYMBOL GENIKI YFESIS
+1D0DA BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI
+1D0DB BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI
+1D0DC BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI
+1D0DD BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS
+1D0DE BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS
+1D0DF BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU
+1D0E0 BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU
+1D0E1 BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU
+1D0E2 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS
+1D0E3 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU
+1D0E4 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU
+1D0E5 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU
+1D0E6 BYZANTINE MUSICAL SYMBOL DIGRAMMA GG
+1D0E7 BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU
+1D0E8 BYZANTINE MUSICAL SYMBOL STIGMA
+1D0E9 BYZANTINE MUSICAL SYMBOL ARKTIKO PA
+1D0EA BYZANTINE MUSICAL SYMBOL ARKTIKO VOU
+1D0EB BYZANTINE MUSICAL SYMBOL ARKTIKO GA
+1D0EC BYZANTINE MUSICAL SYMBOL ARKTIKO DI
+1D0ED BYZANTINE MUSICAL SYMBOL ARKTIKO KE
+1D0EE BYZANTINE MUSICAL SYMBOL ARKTIKO ZO
+1D0EF BYZANTINE MUSICAL SYMBOL ARKTIKO NI
+1D0F0 BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO
+1D0F1 BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO
+1D0F2 BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO
+1D0F3 BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO
+1D0F4 BYZANTINE MUSICAL SYMBOL KLASMA KATO
+1D0F5 BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100 MUSICAL SYMBOL SINGLE BARLINE
+1D101 MUSICAL SYMBOL DOUBLE BARLINE
+1D102 MUSICAL SYMBOL FINAL BARLINE
+1D103 MUSICAL SYMBOL REVERSE FINAL BARLINE
+1D104 MUSICAL SYMBOL DASHED BARLINE
+1D105 MUSICAL SYMBOL SHORT BARLINE
+1D106 MUSICAL SYMBOL LEFT REPEAT SIGN
+1D107 MUSICAL SYMBOL RIGHT REPEAT SIGN
+1D108 MUSICAL SYMBOL REPEAT DOTS
+1D109 MUSICAL SYMBOL DAL SEGNO
+1D10A MUSICAL SYMBOL DA CAPO
+1D10B MUSICAL SYMBOL SEGNO
+1D10C MUSICAL SYMBOL CODA
+1D10D MUSICAL SYMBOL REPEATED FIGURE-1
+1D10E MUSICAL SYMBOL REPEATED FIGURE-2
+1D10F MUSICAL SYMBOL REPEATED FIGURE-3
+1D110 MUSICAL SYMBOL FERMATA
+1D111 MUSICAL SYMBOL FERMATA BELOW
+1D112 MUSICAL SYMBOL BREATH MARK
+1D113 MUSICAL SYMBOL CAESURA
+1D114 MUSICAL SYMBOL BRACE
+1D115 MUSICAL SYMBOL BRACKET
+1D116 MUSICAL SYMBOL ONE-LINE STAFF
+1D117 MUSICAL SYMBOL TWO-LINE STAFF
+1D118 MUSICAL SYMBOL THREE-LINE STAFF
+1D119 MUSICAL SYMBOL FOUR-LINE STAFF
+1D11A MUSICAL SYMBOL FIVE-LINE STAFF
+1D11B MUSICAL SYMBOL SIX-LINE STAFF
+1D11C MUSICAL SYMBOL SIX-STRING FRETBOARD
+1D11D MUSICAL SYMBOL FOUR-STRING FRETBOARD
+1D11E MUSICAL SYMBOL G CLEF
+1D11F MUSICAL SYMBOL G CLEF OTTAVA ALTA
+1D120 MUSICAL SYMBOL G CLEF OTTAVA BASSA
+1D121 MUSICAL SYMBOL C CLEF
+1D122 MUSICAL SYMBOL F CLEF
+1D123 MUSICAL SYMBOL F CLEF OTTAVA ALTA
+1D124 MUSICAL SYMBOL F CLEF OTTAVA BASSA
+1D125 MUSICAL SYMBOL DRUM CLEF-1
+1D126 MUSICAL SYMBOL DRUM CLEF-2
+1D129 MUSICAL SYMBOL MULTIPLE MEASURE REST
+1D12A MUSICAL SYMBOL DOUBLE SHARP
+1D12B MUSICAL SYMBOL DOUBLE FLAT
+1D12C MUSICAL SYMBOL FLAT UP
+1D12D MUSICAL SYMBOL FLAT DOWN
+1D12E MUSICAL SYMBOL NATURAL UP
+1D12F MUSICAL SYMBOL NATURAL DOWN
+1D130 MUSICAL SYMBOL SHARP UP
+1D131 MUSICAL SYMBOL SHARP DOWN
+1D132 MUSICAL SYMBOL QUARTER TONE SHARP
+1D133 MUSICAL SYMBOL QUARTER TONE FLAT
+1D134 MUSICAL SYMBOL COMMON TIME
+1D135 MUSICAL SYMBOL CUT TIME
+1D136 MUSICAL SYMBOL OTTAVA ALTA
+1D137 MUSICAL SYMBOL OTTAVA BASSA
+1D138 MUSICAL SYMBOL QUINDICESIMA ALTA
+1D139 MUSICAL SYMBOL QUINDICESIMA BASSA
+1D13A MUSICAL SYMBOL MULTI REST
+1D13B MUSICAL SYMBOL WHOLE REST
+1D13C MUSICAL SYMBOL HALF REST
+1D13D MUSICAL SYMBOL QUARTER REST
+1D13E MUSICAL SYMBOL EIGHTH REST
+1D13F MUSICAL SYMBOL SIXTEENTH REST
+1D140 MUSICAL SYMBOL THIRTY-SECOND REST
+1D141 MUSICAL SYMBOL SIXTY-FOURTH REST
+1D142 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST
+1D143 MUSICAL SYMBOL X NOTEHEAD
+1D144 MUSICAL SYMBOL PLUS NOTEHEAD
+1D145 MUSICAL SYMBOL CIRCLE X NOTEHEAD
+1D146 MUSICAL SYMBOL SQUARE NOTEHEAD WHITE
+1D147 MUSICAL SYMBOL SQUARE NOTEHEAD BLACK
+1D148 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE
+1D149 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK
+1D14A MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE
+1D14B MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK
+1D14C MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE
+1D14D MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK
+1D14E MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE
+1D14F MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK
+1D150 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE
+1D151 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK
+1D152 MUSICAL SYMBOL MOON NOTEHEAD WHITE
+1D153 MUSICAL SYMBOL MOON NOTEHEAD BLACK
+1D154 MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE
+1D155 MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK
+1D156 MUSICAL SYMBOL PARENTHESIS NOTEHEAD
+1D157 MUSICAL SYMBOL VOID NOTEHEAD
+1D158 MUSICAL SYMBOL NOTEHEAD BLACK
+1D159 MUSICAL SYMBOL NULL NOTEHEAD
+1D15A MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE
+1D15B MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK
+1D15C MUSICAL SYMBOL BREVE
+1D15D MUSICAL SYMBOL WHOLE NOTE
+1D15E MUSICAL SYMBOL HALF NOTE
+1D15F MUSICAL SYMBOL QUARTER NOTE
+1D160 MUSICAL SYMBOL EIGHTH NOTE
+1D161 MUSICAL SYMBOL SIXTEENTH NOTE
+1D162 MUSICAL SYMBOL THIRTY-SECOND NOTE
+1D163 MUSICAL SYMBOL SIXTY-FOURTH NOTE
+1D164 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D165 MUSICAL SYMBOL COMBINING STEM
+1D166 MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167 MUSICAL SYMBOL COMBINING TREMOLO-1
+1D168 MUSICAL SYMBOL COMBINING TREMOLO-2
+1D169 MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A MUSICAL SYMBOL FINGERED TREMOLO-1
+1D16B MUSICAL SYMBOL FINGERED TREMOLO-2
+1D16C MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+1D16E MUSICAL SYMBOL COMBINING FLAG-1
+1D16F MUSICAL SYMBOL COMBINING FLAG-2
+1D170 MUSICAL SYMBOL COMBINING FLAG-3
+1D171 MUSICAL SYMBOL COMBINING FLAG-4
+1D172 MUSICAL SYMBOL COMBINING FLAG-5
+1D173 MUSICAL SYMBOL BEGIN BEAM
+1D174 MUSICAL SYMBOL END BEAM
+1D175 MUSICAL SYMBOL BEGIN TIE
+1D176 MUSICAL SYMBOL END TIE
+1D177 MUSICAL SYMBOL BEGIN SLUR
+1D178 MUSICAL SYMBOL END SLUR
+1D179 MUSICAL SYMBOL BEGIN PHRASE
+1D17A MUSICAL SYMBOL END PHRASE
+1D17B MUSICAL SYMBOL COMBINING ACCENT
+1D17C MUSICAL SYMBOL COMBINING STACCATO
+1D17D MUSICAL SYMBOL COMBINING TENUTO
+1D17E MUSICAL SYMBOL COMBINING STACCATISSIMO
+1D17F MUSICAL SYMBOL COMBINING MARCATO
+1D180 MUSICAL SYMBOL COMBINING MARCATO-STACCATO
+1D181 MUSICAL SYMBOL COMBINING ACCENT-STACCATO
+1D182 MUSICAL SYMBOL COMBINING LOURE
+1D183 MUSICAL SYMBOL ARPEGGIATO UP
+1D184 MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185 MUSICAL SYMBOL COMBINING DOIT
+1D186 MUSICAL SYMBOL COMBINING RIP
+1D187 MUSICAL SYMBOL COMBINING FLIP
+1D188 MUSICAL SYMBOL COMBINING SMEAR
+1D189 MUSICAL SYMBOL COMBINING BEND
+1D18A MUSICAL SYMBOL COMBINING DOUBLE TONGUE
+1D18B MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C MUSICAL SYMBOL RINFORZANDO
+1D18D MUSICAL SYMBOL SUBITO
+1D18E MUSICAL SYMBOL Z
+1D18F MUSICAL SYMBOL PIANO
+1D190 MUSICAL SYMBOL MEZZO
+1D191 MUSICAL SYMBOL FORTE
+1D192 MUSICAL SYMBOL CRESCENDO
+1D193 MUSICAL SYMBOL DECRESCENDO
+1D194 MUSICAL SYMBOL GRACE NOTE SLASH
+1D195 MUSICAL SYMBOL GRACE NOTE NO SLASH
+1D196 MUSICAL SYMBOL TR
+1D197 MUSICAL SYMBOL TURN
+1D198 MUSICAL SYMBOL INVERTED TURN
+1D199 MUSICAL SYMBOL TURN SLASH
+1D19A MUSICAL SYMBOL TURN UP
+1D19B MUSICAL SYMBOL ORNAMENT STROKE-1
+1D19C MUSICAL SYMBOL ORNAMENT STROKE-2
+1D19D MUSICAL SYMBOL ORNAMENT STROKE-3
+1D19E MUSICAL SYMBOL ORNAMENT STROKE-4
+1D19F MUSICAL SYMBOL ORNAMENT STROKE-5
+1D1A0 MUSICAL SYMBOL ORNAMENT STROKE-6
+1D1A1 MUSICAL SYMBOL ORNAMENT STROKE-7
+1D1A2 MUSICAL SYMBOL ORNAMENT STROKE-8
+1D1A3 MUSICAL SYMBOL ORNAMENT STROKE-9
+1D1A4 MUSICAL SYMBOL ORNAMENT STROKE-10
+1D1A5 MUSICAL SYMBOL ORNAMENT STROKE-11
+1D1A6 MUSICAL SYMBOL HAUPTSTIMME
+1D1A7 MUSICAL SYMBOL NEBENSTIMME
+1D1A8 MUSICAL SYMBOL END OF STIMME
+1D1A9 MUSICAL SYMBOL DEGREE SLASH
+1D1AA MUSICAL SYMBOL COMBINING DOWN BOW
+1D1AB MUSICAL SYMBOL COMBINING UP BOW
+1D1AC MUSICAL SYMBOL COMBINING HARMONIC
+1D1AD MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D1AE MUSICAL SYMBOL PEDAL MARK
+1D1AF MUSICAL SYMBOL PEDAL UP MARK
+1D1B0 MUSICAL SYMBOL HALF PEDAL MARK
+1D1B1 MUSICAL SYMBOL GLISSANDO UP
+1D1B2 MUSICAL SYMBOL GLISSANDO DOWN
+1D1B3 MUSICAL SYMBOL WITH FINGERNAILS
+1D1B4 MUSICAL SYMBOL DAMP
+1D1B5 MUSICAL SYMBOL DAMP ALL
+1D1B6 MUSICAL SYMBOL MAXIMA
+1D1B7 MUSICAL SYMBOL LONGA
+1D1B8 MUSICAL SYMBOL BREVIS
+1D1B9 MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB MUSICAL SYMBOL MINIMA
+1D1BC MUSICAL SYMBOL MINIMA BLACK
+1D1BD MUSICAL SYMBOL SEMIMINIMA WHITE
+1D1BE MUSICAL SYMBOL SEMIMINIMA BLACK
+1D1BF MUSICAL SYMBOL FUSA WHITE
+1D1C0 MUSICAL SYMBOL FUSA BLACK
+1D1C1 MUSICAL SYMBOL LONGA PERFECTA REST
+1D1C2 MUSICAL SYMBOL LONGA IMPERFECTA REST
+1D1C3 MUSICAL SYMBOL BREVIS REST
+1D1C4 MUSICAL SYMBOL SEMIBREVIS REST
+1D1C5 MUSICAL SYMBOL MINIMA REST
+1D1C6 MUSICAL SYMBOL SEMIMINIMA REST
+1D1C7 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA
+1D1C8 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA
+1D1C9 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1
+1D1CA MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA
+1D1CB MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA
+1D1CC MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1
+1D1CD MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2
+1D1CE MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3
+1D1CF MUSICAL SYMBOL CROIX
+1D1D0 MUSICAL SYMBOL GREGORIAN C CLEF
+1D1D1 MUSICAL SYMBOL GREGORIAN F CLEF
+1D1D2 MUSICAL SYMBOL SQUARE B
+1D1D3 MUSICAL SYMBOL VIRGA
+1D1D4 MUSICAL SYMBOL PODATUS
+1D1D5 MUSICAL SYMBOL CLIVIS
+1D1D6 MUSICAL SYMBOL SCANDICUS
+1D1D7 MUSICAL SYMBOL CLIMACUS
+1D1D8 MUSICAL SYMBOL TORCULUS
+1D1D9 MUSICAL SYMBOL PORRECTUS
+1D1DA MUSICAL SYMBOL PORRECTUS FLEXUS
+1D1DB MUSICAL SYMBOL SCANDICUS FLEXUS
+1D1DC MUSICAL SYMBOL TORCULUS RESUPINUS
+1D1DD MUSICAL SYMBOL PES SUBPUNCTIS
+1D200 GREEK VOCAL NOTATION SYMBOL-1
+1D201 GREEK VOCAL NOTATION SYMBOL-2
+1D202 GREEK VOCAL NOTATION SYMBOL-3
+1D203 GREEK VOCAL NOTATION SYMBOL-4
+1D204 GREEK VOCAL NOTATION SYMBOL-5
+1D205 GREEK VOCAL NOTATION SYMBOL-6
+1D206 GREEK VOCAL NOTATION SYMBOL-7
+1D207 GREEK VOCAL NOTATION SYMBOL-8
+1D208 GREEK VOCAL NOTATION SYMBOL-9
+1D209 GREEK VOCAL NOTATION SYMBOL-10
+1D20A GREEK VOCAL NOTATION SYMBOL-11
+1D20B GREEK VOCAL NOTATION SYMBOL-12
+1D20C GREEK VOCAL NOTATION SYMBOL-13
+1D20D GREEK VOCAL NOTATION SYMBOL-14
+1D20E GREEK VOCAL NOTATION SYMBOL-15
+1D20F GREEK VOCAL NOTATION SYMBOL-16
+1D210 GREEK VOCAL NOTATION SYMBOL-17
+1D211 GREEK VOCAL NOTATION SYMBOL-18
+1D212 GREEK VOCAL NOTATION SYMBOL-19
+1D213 GREEK VOCAL NOTATION SYMBOL-20
+1D214 GREEK VOCAL NOTATION SYMBOL-21
+1D215 GREEK VOCAL NOTATION SYMBOL-22
+1D216 GREEK VOCAL NOTATION SYMBOL-23
+1D217 GREEK VOCAL NOTATION SYMBOL-24
+1D218 GREEK VOCAL NOTATION SYMBOL-50
+1D219 GREEK VOCAL NOTATION SYMBOL-51
+1D21A GREEK VOCAL NOTATION SYMBOL-52
+1D21B GREEK VOCAL NOTATION SYMBOL-53
+1D21C GREEK VOCAL NOTATION SYMBOL-54
+1D21D GREEK INSTRUMENTAL NOTATION SYMBOL-1
+1D21E GREEK INSTRUMENTAL NOTATION SYMBOL-2
+1D21F GREEK INSTRUMENTAL NOTATION SYMBOL-4
+1D220 GREEK INSTRUMENTAL NOTATION SYMBOL-5
+1D221 GREEK INSTRUMENTAL NOTATION SYMBOL-7
+1D222 GREEK INSTRUMENTAL NOTATION SYMBOL-8
+1D223 GREEK INSTRUMENTAL NOTATION SYMBOL-11
+1D224 GREEK INSTRUMENTAL NOTATION SYMBOL-12
+1D225 GREEK INSTRUMENTAL NOTATION SYMBOL-13
+1D226 GREEK INSTRUMENTAL NOTATION SYMBOL-14
+1D227 GREEK INSTRUMENTAL NOTATION SYMBOL-17
+1D228 GREEK INSTRUMENTAL NOTATION SYMBOL-18
+1D229 GREEK INSTRUMENTAL NOTATION SYMBOL-19
+1D22A GREEK INSTRUMENTAL NOTATION SYMBOL-23
+1D22B GREEK INSTRUMENTAL NOTATION SYMBOL-24
+1D22C GREEK INSTRUMENTAL NOTATION SYMBOL-25
+1D22D GREEK INSTRUMENTAL NOTATION SYMBOL-26
+1D22E GREEK INSTRUMENTAL NOTATION SYMBOL-27
+1D22F GREEK INSTRUMENTAL NOTATION SYMBOL-29
+1D230 GREEK INSTRUMENTAL NOTATION SYMBOL-30
+1D231 GREEK INSTRUMENTAL NOTATION SYMBOL-32
+1D232 GREEK INSTRUMENTAL NOTATION SYMBOL-36
+1D233 GREEK INSTRUMENTAL NOTATION SYMBOL-37
+1D234 GREEK INSTRUMENTAL NOTATION SYMBOL-38
+1D235 GREEK INSTRUMENTAL NOTATION SYMBOL-39
+1D236 GREEK INSTRUMENTAL NOTATION SYMBOL-40
+1D237 GREEK INSTRUMENTAL NOTATION SYMBOL-42
+1D238 GREEK INSTRUMENTAL NOTATION SYMBOL-43
+1D239 GREEK INSTRUMENTAL NOTATION SYMBOL-45
+1D23A GREEK INSTRUMENTAL NOTATION SYMBOL-47
+1D23B GREEK INSTRUMENTAL NOTATION SYMBOL-48
+1D23C GREEK INSTRUMENTAL NOTATION SYMBOL-49
+1D23D GREEK INSTRUMENTAL NOTATION SYMBOL-50
+1D23E GREEK INSTRUMENTAL NOTATION SYMBOL-51
+1D23F GREEK INSTRUMENTAL NOTATION SYMBOL-52
+1D240 GREEK INSTRUMENTAL NOTATION SYMBOL-53
+1D241 GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242 COMBINING GREEK MUSICAL TRISEME
+1D243 COMBINING GREEK MUSICAL TETRASEME
+1D244 COMBINING GREEK MUSICAL PENTASEME
+1D245 GREEK MUSICAL LEIMMA
+1D300 MONOGRAM FOR EARTH
+1D301 DIGRAM FOR HEAVENLY EARTH
+1D302 DIGRAM FOR HUMAN EARTH
+1D303 DIGRAM FOR EARTHLY HEAVEN
+1D304 DIGRAM FOR EARTHLY HUMAN
+1D305 DIGRAM FOR EARTH
+1D306 TETRAGRAM FOR CENTRE
+1D307 TETRAGRAM FOR FULL CIRCLE
+1D308 TETRAGRAM FOR MIRED
+1D309 TETRAGRAM FOR BARRIER
+1D30A TETRAGRAM FOR KEEPING SMALL
+1D30B TETRAGRAM FOR CONTRARIETY
+1D30C TETRAGRAM FOR ASCENT
+1D30D TETRAGRAM FOR OPPOSITION
+1D30E TETRAGRAM FOR BRANCHING OUT
+1D30F TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310 TETRAGRAM FOR DIVERGENCE
+1D311 TETRAGRAM FOR YOUTHFULNESS
+1D312 TETRAGRAM FOR INCREASE
+1D313 TETRAGRAM FOR PENETRATION
+1D314 TETRAGRAM FOR REACH
+1D315 TETRAGRAM FOR CONTACT
+1D316 TETRAGRAM FOR HOLDING BACK
+1D317 TETRAGRAM FOR WAITING
+1D318 TETRAGRAM FOR FOLLOWING
+1D319 TETRAGRAM FOR ADVANCE
+1D31A TETRAGRAM FOR RELEASE
+1D31B TETRAGRAM FOR RESISTANCE
+1D31C TETRAGRAM FOR EASE
+1D31D TETRAGRAM FOR JOY
+1D31E TETRAGRAM FOR CONTENTION
+1D31F TETRAGRAM FOR ENDEAVOUR
+1D320 TETRAGRAM FOR DUTIES
+1D321 TETRAGRAM FOR CHANGE
+1D322 TETRAGRAM FOR DECISIVENESS
+1D323 TETRAGRAM FOR BOLD RESOLUTION
+1D324 TETRAGRAM FOR PACKING
+1D325 TETRAGRAM FOR LEGION
+1D326 TETRAGRAM FOR CLOSENESS
+1D327 TETRAGRAM FOR KINSHIP
+1D328 TETRAGRAM FOR GATHERING
+1D329 TETRAGRAM FOR STRENGTH
+1D32A TETRAGRAM FOR PURITY
+1D32B TETRAGRAM FOR FULLNESS
+1D32C TETRAGRAM FOR RESIDENCE
+1D32D TETRAGRAM FOR LAW OR MODEL
+1D32E TETRAGRAM FOR RESPONSE
+1D32F TETRAGRAM FOR GOING TO MEET
+1D330 TETRAGRAM FOR ENCOUNTERS
+1D331 TETRAGRAM FOR STOVE
+1D332 TETRAGRAM FOR GREATNESS
+1D333 TETRAGRAM FOR ENLARGEMENT
+1D334 TETRAGRAM FOR PATTERN
+1D335 TETRAGRAM FOR RITUAL
+1D336 TETRAGRAM FOR FLIGHT
+1D337 TETRAGRAM FOR VASTNESS OR WASTING
+1D338 TETRAGRAM FOR CONSTANCY
+1D339 TETRAGRAM FOR MEASURE
+1D33A TETRAGRAM FOR ETERNITY
+1D33B TETRAGRAM FOR UNITY
+1D33C TETRAGRAM FOR DIMINISHMENT
+1D33D TETRAGRAM FOR CLOSED MOUTH
+1D33E TETRAGRAM FOR GUARDEDNESS
+1D33F TETRAGRAM FOR GATHERING IN
+1D340 TETRAGRAM FOR MASSING
+1D341 TETRAGRAM FOR ACCUMULATION
+1D342 TETRAGRAM FOR EMBELLISHMENT
+1D343 TETRAGRAM FOR DOUBT
+1D344 TETRAGRAM FOR WATCH
+1D345 TETRAGRAM FOR SINKING
+1D346 TETRAGRAM FOR INNER
+1D347 TETRAGRAM FOR DEPARTURE
+1D348 TETRAGRAM FOR DARKENING
+1D349 TETRAGRAM FOR DIMMING
+1D34A TETRAGRAM FOR EXHAUSTION
+1D34B TETRAGRAM FOR SEVERANCE
+1D34C TETRAGRAM FOR STOPPAGE
+1D34D TETRAGRAM FOR HARDNESS
+1D34E TETRAGRAM FOR COMPLETION
+1D34F TETRAGRAM FOR CLOSURE
+1D350 TETRAGRAM FOR FAILURE
+1D351 TETRAGRAM FOR AGGRAVATION
+1D352 TETRAGRAM FOR COMPLIANCE
+1D353 TETRAGRAM FOR ON THE VERGE
+1D354 TETRAGRAM FOR DIFFICULTIES
+1D355 TETRAGRAM FOR LABOURING
+1D356 TETRAGRAM FOR FOSTERING
+1D360 COUNTING ROD UNIT DIGIT ONE
+1D361 COUNTING ROD UNIT DIGIT TWO
+1D362 COUNTING ROD UNIT DIGIT THREE
+1D363 COUNTING ROD UNIT DIGIT FOUR
+1D364 COUNTING ROD UNIT DIGIT FIVE
+1D365 COUNTING ROD UNIT DIGIT SIX
+1D366 COUNTING ROD UNIT DIGIT SEVEN
+1D367 COUNTING ROD UNIT DIGIT EIGHT
+1D368 COUNTING ROD UNIT DIGIT NINE
+1D369 COUNTING ROD TENS DIGIT ONE
+1D36A COUNTING ROD TENS DIGIT TWO
+1D36B COUNTING ROD TENS DIGIT THREE
+1D36C COUNTING ROD TENS DIGIT FOUR
+1D36D COUNTING ROD TENS DIGIT FIVE
+1D36E COUNTING ROD TENS DIGIT SIX
+1D36F COUNTING ROD TENS DIGIT SEVEN
+1D370 COUNTING ROD TENS DIGIT EIGHT
+1D371 COUNTING ROD TENS DIGIT NINE
+1D400 MATHEMATICAL BOLD CAPITAL A
+1D401 MATHEMATICAL BOLD CAPITAL B
+1D402 MATHEMATICAL BOLD CAPITAL C
+1D403 MATHEMATICAL BOLD CAPITAL D
+1D404 MATHEMATICAL BOLD CAPITAL E
+1D405 MATHEMATICAL BOLD CAPITAL F
+1D406 MATHEMATICAL BOLD CAPITAL G
+1D407 MATHEMATICAL BOLD CAPITAL H
+1D408 MATHEMATICAL BOLD CAPITAL I
+1D409 MATHEMATICAL BOLD CAPITAL J
+1D40A MATHEMATICAL BOLD CAPITAL K
+1D40B MATHEMATICAL BOLD CAPITAL L
+1D40C MATHEMATICAL BOLD CAPITAL M
+1D40D MATHEMATICAL BOLD CAPITAL N
+1D40E MATHEMATICAL BOLD CAPITAL O
+1D40F MATHEMATICAL BOLD CAPITAL P
+1D410 MATHEMATICAL BOLD CAPITAL Q
+1D411 MATHEMATICAL BOLD CAPITAL R
+1D412 MATHEMATICAL BOLD CAPITAL S
+1D413 MATHEMATICAL BOLD CAPITAL T
+1D414 MATHEMATICAL BOLD CAPITAL U
+1D415 MATHEMATICAL BOLD CAPITAL V
+1D416 MATHEMATICAL BOLD CAPITAL W
+1D417 MATHEMATICAL BOLD CAPITAL X
+1D418 MATHEMATICAL BOLD CAPITAL Y
+1D419 MATHEMATICAL BOLD CAPITAL Z
+1D41A MATHEMATICAL BOLD SMALL A
+1D41B MATHEMATICAL BOLD SMALL B
+1D41C MATHEMATICAL BOLD SMALL C
+1D41D MATHEMATICAL BOLD SMALL D
+1D41E MATHEMATICAL BOLD SMALL E
+1D41F MATHEMATICAL BOLD SMALL F
+1D420 MATHEMATICAL BOLD SMALL G
+1D421 MATHEMATICAL BOLD SMALL H
+1D422 MATHEMATICAL BOLD SMALL I
+1D423 MATHEMATICAL BOLD SMALL J
+1D424 MATHEMATICAL BOLD SMALL K
+1D425 MATHEMATICAL BOLD SMALL L
+1D426 MATHEMATICAL BOLD SMALL M
+1D427 MATHEMATICAL BOLD SMALL N
+1D428 MATHEMATICAL BOLD SMALL O
+1D429 MATHEMATICAL BOLD SMALL P
+1D42A MATHEMATICAL BOLD SMALL Q
+1D42B MATHEMATICAL BOLD SMALL R
+1D42C MATHEMATICAL BOLD SMALL S
+1D42D MATHEMATICAL BOLD SMALL T
+1D42E MATHEMATICAL BOLD SMALL U
+1D42F MATHEMATICAL BOLD SMALL V
+1D430 MATHEMATICAL BOLD SMALL W
+1D431 MATHEMATICAL BOLD SMALL X
+1D432 MATHEMATICAL BOLD SMALL Y
+1D433 MATHEMATICAL BOLD SMALL Z
+1D434 MATHEMATICAL ITALIC CAPITAL A
+1D435 MATHEMATICAL ITALIC CAPITAL B
+1D436 MATHEMATICAL ITALIC CAPITAL C
+1D437 MATHEMATICAL ITALIC CAPITAL D
+1D438 MATHEMATICAL ITALIC CAPITAL E
+1D439 MATHEMATICAL ITALIC CAPITAL F
+1D43A MATHEMATICAL ITALIC CAPITAL G
+1D43B MATHEMATICAL ITALIC CAPITAL H
+1D43C MATHEMATICAL ITALIC CAPITAL I
+1D43D MATHEMATICAL ITALIC CAPITAL J
+1D43E MATHEMATICAL ITALIC CAPITAL K
+1D43F MATHEMATICAL ITALIC CAPITAL L
+1D440 MATHEMATICAL ITALIC CAPITAL M
+1D441 MATHEMATICAL ITALIC CAPITAL N
+1D442 MATHEMATICAL ITALIC CAPITAL O
+1D443 MATHEMATICAL ITALIC CAPITAL P
+1D444 MATHEMATICAL ITALIC CAPITAL Q
+1D445 MATHEMATICAL ITALIC CAPITAL R
+1D446 MATHEMATICAL ITALIC CAPITAL S
+1D447 MATHEMATICAL ITALIC CAPITAL T
+1D448 MATHEMATICAL ITALIC CAPITAL U
+1D449 MATHEMATICAL ITALIC CAPITAL V
+1D44A MATHEMATICAL ITALIC CAPITAL W
+1D44B MATHEMATICAL ITALIC CAPITAL X
+1D44C MATHEMATICAL ITALIC CAPITAL Y
+1D44D MATHEMATICAL ITALIC CAPITAL Z
+1D44E MATHEMATICAL ITALIC SMALL A
+1D44F MATHEMATICAL ITALIC SMALL B
+1D450 MATHEMATICAL ITALIC SMALL C
+1D451 MATHEMATICAL ITALIC SMALL D
+1D452 MATHEMATICAL ITALIC SMALL E
+1D453 MATHEMATICAL ITALIC SMALL F
+1D454 MATHEMATICAL ITALIC SMALL G
+1D456 MATHEMATICAL ITALIC SMALL I
+1D457 MATHEMATICAL ITALIC SMALL J
+1D458 MATHEMATICAL ITALIC SMALL K
+1D459 MATHEMATICAL ITALIC SMALL L
+1D45A MATHEMATICAL ITALIC SMALL M
+1D45B MATHEMATICAL ITALIC SMALL N
+1D45C MATHEMATICAL ITALIC SMALL O
+1D45D MATHEMATICAL ITALIC SMALL P
+1D45E MATHEMATICAL ITALIC SMALL Q
+1D45F MATHEMATICAL ITALIC SMALL R
+1D460 MATHEMATICAL ITALIC SMALL S
+1D461 MATHEMATICAL ITALIC SMALL T
+1D462 MATHEMATICAL ITALIC SMALL U
+1D463 MATHEMATICAL ITALIC SMALL V
+1D464 MATHEMATICAL ITALIC SMALL W
+1D465 MATHEMATICAL ITALIC SMALL X
+1D466 MATHEMATICAL ITALIC SMALL Y
+1D467 MATHEMATICAL ITALIC SMALL Z
+1D468 MATHEMATICAL BOLD ITALIC CAPITAL A
+1D469 MATHEMATICAL BOLD ITALIC CAPITAL B
+1D46A MATHEMATICAL BOLD ITALIC CAPITAL C
+1D46B MATHEMATICAL BOLD ITALIC CAPITAL D
+1D46C MATHEMATICAL BOLD ITALIC CAPITAL E
+1D46D MATHEMATICAL BOLD ITALIC CAPITAL F
+1D46E MATHEMATICAL BOLD ITALIC CAPITAL G
+1D46F MATHEMATICAL BOLD ITALIC CAPITAL H
+1D470 MATHEMATICAL BOLD ITALIC CAPITAL I
+1D471 MATHEMATICAL BOLD ITALIC CAPITAL J
+1D472 MATHEMATICAL BOLD ITALIC CAPITAL K
+1D473 MATHEMATICAL BOLD ITALIC CAPITAL L
+1D474 MATHEMATICAL BOLD ITALIC CAPITAL M
+1D475 MATHEMATICAL BOLD ITALIC CAPITAL N
+1D476 MATHEMATICAL BOLD ITALIC CAPITAL O
+1D477 MATHEMATICAL BOLD ITALIC CAPITAL P
+1D478 MATHEMATICAL BOLD ITALIC CAPITAL Q
+1D479 MATHEMATICAL BOLD ITALIC CAPITAL R
+1D47A MATHEMATICAL BOLD ITALIC CAPITAL S
+1D47B MATHEMATICAL BOLD ITALIC CAPITAL T
+1D47C MATHEMATICAL BOLD ITALIC CAPITAL U
+1D47D MATHEMATICAL BOLD ITALIC CAPITAL V
+1D47E MATHEMATICAL BOLD ITALIC CAPITAL W
+1D47F MATHEMATICAL BOLD ITALIC CAPITAL X
+1D480 MATHEMATICAL BOLD ITALIC CAPITAL Y
+1D481 MATHEMATICAL BOLD ITALIC CAPITAL Z
+1D482 MATHEMATICAL BOLD ITALIC SMALL A
+1D483 MATHEMATICAL BOLD ITALIC SMALL B
+1D484 MATHEMATICAL BOLD ITALIC SMALL C
+1D485 MATHEMATICAL BOLD ITALIC SMALL D
+1D486 MATHEMATICAL BOLD ITALIC SMALL E
+1D487 MATHEMATICAL BOLD ITALIC SMALL F
+1D488 MATHEMATICAL BOLD ITALIC SMALL G
+1D489 MATHEMATICAL BOLD ITALIC SMALL H
+1D48A MATHEMATICAL BOLD ITALIC SMALL I
+1D48B MATHEMATICAL BOLD ITALIC SMALL J
+1D48C MATHEMATICAL BOLD ITALIC SMALL K
+1D48D MATHEMATICAL BOLD ITALIC SMALL L
+1D48E MATHEMATICAL BOLD ITALIC SMALL M
+1D48F MATHEMATICAL BOLD ITALIC SMALL N
+1D490 MATHEMATICAL BOLD ITALIC SMALL O
+1D491 MATHEMATICAL BOLD ITALIC SMALL P
+1D492 MATHEMATICAL BOLD ITALIC SMALL Q
+1D493 MATHEMATICAL BOLD ITALIC SMALL R
+1D494 MATHEMATICAL BOLD ITALIC SMALL S
+1D495 MATHEMATICAL BOLD ITALIC SMALL T
+1D496 MATHEMATICAL BOLD ITALIC SMALL U
+1D497 MATHEMATICAL BOLD ITALIC SMALL V
+1D498 MATHEMATICAL BOLD ITALIC SMALL W
+1D499 MATHEMATICAL BOLD ITALIC SMALL X
+1D49A MATHEMATICAL BOLD ITALIC SMALL Y
+1D49B MATHEMATICAL BOLD ITALIC SMALL Z
+1D49C MATHEMATICAL SCRIPT CAPITAL A
+1D49E MATHEMATICAL SCRIPT CAPITAL C
+1D49F MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 MATHEMATICAL SCRIPT CAPITAL G
+1D4A5 MATHEMATICAL SCRIPT CAPITAL J
+1D4A6 MATHEMATICAL SCRIPT CAPITAL K
+1D4A9 MATHEMATICAL SCRIPT CAPITAL N
+1D4AA MATHEMATICAL SCRIPT CAPITAL O
+1D4AB MATHEMATICAL SCRIPT CAPITAL P
+1D4AC MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE MATHEMATICAL SCRIPT CAPITAL S
+1D4AF MATHEMATICAL SCRIPT CAPITAL T
+1D4B0 MATHEMATICAL SCRIPT CAPITAL U
+1D4B1 MATHEMATICAL SCRIPT CAPITAL V
+1D4B2 MATHEMATICAL SCRIPT CAPITAL W
+1D4B3 MATHEMATICAL SCRIPT CAPITAL X
+1D4B4 MATHEMATICAL SCRIPT CAPITAL Y
+1D4B5 MATHEMATICAL SCRIPT CAPITAL Z
+1D4B6 MATHEMATICAL SCRIPT SMALL A
+1D4B7 MATHEMATICAL SCRIPT SMALL B
+1D4B8 MATHEMATICAL SCRIPT SMALL C
+1D4B9 MATHEMATICAL SCRIPT SMALL D
+1D4BB MATHEMATICAL SCRIPT SMALL F
+1D4BD MATHEMATICAL SCRIPT SMALL H
+1D4BE MATHEMATICAL SCRIPT SMALL I
+1D4BF MATHEMATICAL SCRIPT SMALL J
+1D4C0 MATHEMATICAL SCRIPT SMALL K
+1D4C1 MATHEMATICAL SCRIPT SMALL L
+1D4C2 MATHEMATICAL SCRIPT SMALL M
+1D4C3 MATHEMATICAL SCRIPT SMALL N
+1D4C5 MATHEMATICAL SCRIPT SMALL P
+1D4C6 MATHEMATICAL SCRIPT SMALL Q
+1D4C7 MATHEMATICAL SCRIPT SMALL R
+1D4C8 MATHEMATICAL SCRIPT SMALL S
+1D4C9 MATHEMATICAL SCRIPT SMALL T
+1D4CA MATHEMATICAL SCRIPT SMALL U
+1D4CB MATHEMATICAL SCRIPT SMALL V
+1D4CC MATHEMATICAL SCRIPT SMALL W
+1D4CD MATHEMATICAL SCRIPT SMALL X
+1D4CE MATHEMATICAL SCRIPT SMALL Y
+1D4CF MATHEMATICAL SCRIPT SMALL Z
+1D4D0 MATHEMATICAL BOLD SCRIPT CAPITAL A
+1D4D1 MATHEMATICAL BOLD SCRIPT CAPITAL B
+1D4D2 MATHEMATICAL BOLD SCRIPT CAPITAL C
+1D4D3 MATHEMATICAL BOLD SCRIPT CAPITAL D
+1D4D4 MATHEMATICAL BOLD SCRIPT CAPITAL E
+1D4D5 MATHEMATICAL BOLD SCRIPT CAPITAL F
+1D4D6 MATHEMATICAL BOLD SCRIPT CAPITAL G
+1D4D7 MATHEMATICAL BOLD SCRIPT CAPITAL H
+1D4D8 MATHEMATICAL BOLD SCRIPT CAPITAL I
+1D4D9 MATHEMATICAL BOLD SCRIPT CAPITAL J
+1D4DA MATHEMATICAL BOLD SCRIPT CAPITAL K
+1D4DB MATHEMATICAL BOLD SCRIPT CAPITAL L
+1D4DC MATHEMATICAL BOLD SCRIPT CAPITAL M
+1D4DD MATHEMATICAL BOLD SCRIPT CAPITAL N
+1D4DE MATHEMATICAL BOLD SCRIPT CAPITAL O
+1D4DF MATHEMATICAL BOLD SCRIPT CAPITAL P
+1D4E0 MATHEMATICAL BOLD SCRIPT CAPITAL Q
+1D4E1 MATHEMATICAL BOLD SCRIPT CAPITAL R
+1D4E2 MATHEMATICAL BOLD SCRIPT CAPITAL S
+1D4E3 MATHEMATICAL BOLD SCRIPT CAPITAL T
+1D4E4 MATHEMATICAL BOLD SCRIPT CAPITAL U
+1D4E5 MATHEMATICAL BOLD SCRIPT CAPITAL V
+1D4E6 MATHEMATICAL BOLD SCRIPT CAPITAL W
+1D4E7 MATHEMATICAL BOLD SCRIPT CAPITAL X
+1D4E8 MATHEMATICAL BOLD SCRIPT CAPITAL Y
+1D4E9 MATHEMATICAL BOLD SCRIPT CAPITAL Z
+1D4EA MATHEMATICAL BOLD SCRIPT SMALL A
+1D4EB MATHEMATICAL BOLD SCRIPT SMALL B
+1D4EC MATHEMATICAL BOLD SCRIPT SMALL C
+1D4ED MATHEMATICAL BOLD SCRIPT SMALL D
+1D4EE MATHEMATICAL BOLD SCRIPT SMALL E
+1D4EF MATHEMATICAL BOLD SCRIPT SMALL F
+1D4F0 MATHEMATICAL BOLD SCRIPT SMALL G
+1D4F1 MATHEMATICAL BOLD SCRIPT SMALL H
+1D4F2 MATHEMATICAL BOLD SCRIPT SMALL I
+1D4F3 MATHEMATICAL BOLD SCRIPT SMALL J
+1D4F4 MATHEMATICAL BOLD SCRIPT SMALL K
+1D4F5 MATHEMATICAL BOLD SCRIPT SMALL L
+1D4F6 MATHEMATICAL BOLD SCRIPT SMALL M
+1D4F7 MATHEMATICAL BOLD SCRIPT SMALL N
+1D4F8 MATHEMATICAL BOLD SCRIPT SMALL O
+1D4F9 MATHEMATICAL BOLD SCRIPT SMALL P
+1D4FA MATHEMATICAL BOLD SCRIPT SMALL Q
+1D4FB MATHEMATICAL BOLD SCRIPT SMALL R
+1D4FC MATHEMATICAL BOLD SCRIPT SMALL S
+1D4FD MATHEMATICAL BOLD SCRIPT SMALL T
+1D4FE MATHEMATICAL BOLD SCRIPT SMALL U
+1D4FF MATHEMATICAL BOLD SCRIPT SMALL V
+1D500 MATHEMATICAL BOLD SCRIPT SMALL W
+1D501 MATHEMATICAL BOLD SCRIPT SMALL X
+1D502 MATHEMATICAL BOLD SCRIPT SMALL Y
+1D503 MATHEMATICAL BOLD SCRIPT SMALL Z
+1D504 MATHEMATICAL FRAKTUR CAPITAL A
+1D505 MATHEMATICAL FRAKTUR CAPITAL B
+1D507 MATHEMATICAL FRAKTUR CAPITAL D
+1D508 MATHEMATICAL FRAKTUR CAPITAL E
+1D509 MATHEMATICAL FRAKTUR CAPITAL F
+1D50A MATHEMATICAL FRAKTUR CAPITAL G
+1D50D MATHEMATICAL FRAKTUR CAPITAL J
+1D50E MATHEMATICAL FRAKTUR CAPITAL K
+1D50F MATHEMATICAL FRAKTUR CAPITAL L
+1D510 MATHEMATICAL FRAKTUR CAPITAL M
+1D511 MATHEMATICAL FRAKTUR CAPITAL N
+1D512 MATHEMATICAL FRAKTUR CAPITAL O
+1D513 MATHEMATICAL FRAKTUR CAPITAL P
+1D514 MATHEMATICAL FRAKTUR CAPITAL Q
+1D516 MATHEMATICAL FRAKTUR CAPITAL S
+1D517 MATHEMATICAL FRAKTUR CAPITAL T
+1D518 MATHEMATICAL FRAKTUR CAPITAL U
+1D519 MATHEMATICAL FRAKTUR CAPITAL V
+1D51A MATHEMATICAL FRAKTUR CAPITAL W
+1D51B MATHEMATICAL FRAKTUR CAPITAL X
+1D51C MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E MATHEMATICAL FRAKTUR SMALL A
+1D51F MATHEMATICAL FRAKTUR SMALL B
+1D520 MATHEMATICAL FRAKTUR SMALL C
+1D521 MATHEMATICAL FRAKTUR SMALL D
+1D522 MATHEMATICAL FRAKTUR SMALL E
+1D523 MATHEMATICAL FRAKTUR SMALL F
+1D524 MATHEMATICAL FRAKTUR SMALL G
+1D525 MATHEMATICAL FRAKTUR SMALL H
+1D526 MATHEMATICAL FRAKTUR SMALL I
+1D527 MATHEMATICAL FRAKTUR SMALL J
+1D528 MATHEMATICAL FRAKTUR SMALL K
+1D529 MATHEMATICAL FRAKTUR SMALL L
+1D52A MATHEMATICAL FRAKTUR SMALL M
+1D52B MATHEMATICAL FRAKTUR SMALL N
+1D52C MATHEMATICAL FRAKTUR SMALL O
+1D52D MATHEMATICAL FRAKTUR SMALL P
+1D52E MATHEMATICAL FRAKTUR SMALL Q
+1D52F MATHEMATICAL FRAKTUR SMALL R
+1D530 MATHEMATICAL FRAKTUR SMALL S
+1D531 MATHEMATICAL FRAKTUR SMALL T
+1D532 MATHEMATICAL FRAKTUR SMALL U
+1D533 MATHEMATICAL FRAKTUR SMALL V
+1D534 MATHEMATICAL FRAKTUR SMALL W
+1D535 MATHEMATICAL FRAKTUR SMALL X
+1D536 MATHEMATICAL FRAKTUR SMALL Y
+1D537 MATHEMATICAL FRAKTUR SMALL Z
+1D538 MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+1D539 MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+1D53C MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+1D53D MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+1D53E MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540 MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+1D541 MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+1D542 MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+1D543 MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+1D544 MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+1D54B MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+1D54C MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+1D54D MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+1D54E MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+1D54F MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+1D550 MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552 MATHEMATICAL DOUBLE-STRUCK SMALL A
+1D553 MATHEMATICAL DOUBLE-STRUCK SMALL B
+1D554 MATHEMATICAL DOUBLE-STRUCK SMALL C
+1D555 MATHEMATICAL DOUBLE-STRUCK SMALL D
+1D556 MATHEMATICAL DOUBLE-STRUCK SMALL E
+1D557 MATHEMATICAL DOUBLE-STRUCK SMALL F
+1D558 MATHEMATICAL DOUBLE-STRUCK SMALL G
+1D559 MATHEMATICAL DOUBLE-STRUCK SMALL H
+1D55A MATHEMATICAL DOUBLE-STRUCK SMALL I
+1D55B MATHEMATICAL DOUBLE-STRUCK SMALL J
+1D55C MATHEMATICAL DOUBLE-STRUCK SMALL K
+1D55D MATHEMATICAL DOUBLE-STRUCK SMALL L
+1D55E MATHEMATICAL DOUBLE-STRUCK SMALL M
+1D55F MATHEMATICAL DOUBLE-STRUCK SMALL N
+1D560 MATHEMATICAL DOUBLE-STRUCK SMALL O
+1D561 MATHEMATICAL DOUBLE-STRUCK SMALL P
+1D562 MATHEMATICAL DOUBLE-STRUCK SMALL Q
+1D563 MATHEMATICAL DOUBLE-STRUCK SMALL R
+1D564 MATHEMATICAL DOUBLE-STRUCK SMALL S
+1D565 MATHEMATICAL DOUBLE-STRUCK SMALL T
+1D566 MATHEMATICAL DOUBLE-STRUCK SMALL U
+1D567 MATHEMATICAL DOUBLE-STRUCK SMALL V
+1D568 MATHEMATICAL DOUBLE-STRUCK SMALL W
+1D569 MATHEMATICAL DOUBLE-STRUCK SMALL X
+1D56A MATHEMATICAL DOUBLE-STRUCK SMALL Y
+1D56B MATHEMATICAL DOUBLE-STRUCK SMALL Z
+1D56C MATHEMATICAL BOLD FRAKTUR CAPITAL A
+1D56D MATHEMATICAL BOLD FRAKTUR CAPITAL B
+1D56E MATHEMATICAL BOLD FRAKTUR CAPITAL C
+1D56F MATHEMATICAL BOLD FRAKTUR CAPITAL D
+1D570 MATHEMATICAL BOLD FRAKTUR CAPITAL E
+1D571 MATHEMATICAL BOLD FRAKTUR CAPITAL F
+1D572 MATHEMATICAL BOLD FRAKTUR CAPITAL G
+1D573 MATHEMATICAL BOLD FRAKTUR CAPITAL H
+1D574 MATHEMATICAL BOLD FRAKTUR CAPITAL I
+1D575 MATHEMATICAL BOLD FRAKTUR CAPITAL J
+1D576 MATHEMATICAL BOLD FRAKTUR CAPITAL K
+1D577 MATHEMATICAL BOLD FRAKTUR CAPITAL L
+1D578 MATHEMATICAL BOLD FRAKTUR CAPITAL M
+1D579 MATHEMATICAL BOLD FRAKTUR CAPITAL N
+1D57A MATHEMATICAL BOLD FRAKTUR CAPITAL O
+1D57B MATHEMATICAL BOLD FRAKTUR CAPITAL P
+1D57C MATHEMATICAL BOLD FRAKTUR CAPITAL Q
+1D57D MATHEMATICAL BOLD FRAKTUR CAPITAL R
+1D57E MATHEMATICAL BOLD FRAKTUR CAPITAL S
+1D57F MATHEMATICAL BOLD FRAKTUR CAPITAL T
+1D580 MATHEMATICAL BOLD FRAKTUR CAPITAL U
+1D581 MATHEMATICAL BOLD FRAKTUR CAPITAL V
+1D582 MATHEMATICAL BOLD FRAKTUR CAPITAL W
+1D583 MATHEMATICAL BOLD FRAKTUR CAPITAL X
+1D584 MATHEMATICAL BOLD FRAKTUR CAPITAL Y
+1D585 MATHEMATICAL BOLD FRAKTUR CAPITAL Z
+1D586 MATHEMATICAL BOLD FRAKTUR SMALL A
+1D587 MATHEMATICAL BOLD FRAKTUR SMALL B
+1D588 MATHEMATICAL BOLD FRAKTUR SMALL C
+1D589 MATHEMATICAL BOLD FRAKTUR SMALL D
+1D58A MATHEMATICAL BOLD FRAKTUR SMALL E
+1D58B MATHEMATICAL BOLD FRAKTUR SMALL F
+1D58C MATHEMATICAL BOLD FRAKTUR SMALL G
+1D58D MATHEMATICAL BOLD FRAKTUR SMALL H
+1D58E MATHEMATICAL BOLD FRAKTUR SMALL I
+1D58F MATHEMATICAL BOLD FRAKTUR SMALL J
+1D590 MATHEMATICAL BOLD FRAKTUR SMALL K
+1D591 MATHEMATICAL BOLD FRAKTUR SMALL L
+1D592 MATHEMATICAL BOLD FRAKTUR SMALL M
+1D593 MATHEMATICAL BOLD FRAKTUR SMALL N
+1D594 MATHEMATICAL BOLD FRAKTUR SMALL O
+1D595 MATHEMATICAL BOLD FRAKTUR SMALL P
+1D596 MATHEMATICAL BOLD FRAKTUR SMALL Q
+1D597 MATHEMATICAL BOLD FRAKTUR SMALL R
+1D598 MATHEMATICAL BOLD FRAKTUR SMALL S
+1D599 MATHEMATICAL BOLD FRAKTUR SMALL T
+1D59A MATHEMATICAL BOLD FRAKTUR SMALL U
+1D59B MATHEMATICAL BOLD FRAKTUR SMALL V
+1D59C MATHEMATICAL BOLD FRAKTUR SMALL W
+1D59D MATHEMATICAL BOLD FRAKTUR SMALL X
+1D59E MATHEMATICAL BOLD FRAKTUR SMALL Y
+1D59F MATHEMATICAL BOLD FRAKTUR SMALL Z
+1D5A0 MATHEMATICAL SANS-SERIF CAPITAL A
+1D5A1 MATHEMATICAL SANS-SERIF CAPITAL B
+1D5A2 MATHEMATICAL SANS-SERIF CAPITAL C
+1D5A3 MATHEMATICAL SANS-SERIF CAPITAL D
+1D5A4 MATHEMATICAL SANS-SERIF CAPITAL E
+1D5A5 MATHEMATICAL SANS-SERIF CAPITAL F
+1D5A6 MATHEMATICAL SANS-SERIF CAPITAL G
+1D5A7 MATHEMATICAL SANS-SERIF CAPITAL H
+1D5A8 MATHEMATICAL SANS-SERIF CAPITAL I
+1D5A9 MATHEMATICAL SANS-SERIF CAPITAL J
+1D5AA MATHEMATICAL SANS-SERIF CAPITAL K
+1D5AB MATHEMATICAL SANS-SERIF CAPITAL L
+1D5AC MATHEMATICAL SANS-SERIF CAPITAL M
+1D5AD MATHEMATICAL SANS-SERIF CAPITAL N
+1D5AE MATHEMATICAL SANS-SERIF CAPITAL O
+1D5AF MATHEMATICAL SANS-SERIF CAPITAL P
+1D5B0 MATHEMATICAL SANS-SERIF CAPITAL Q
+1D5B1 MATHEMATICAL SANS-SERIF CAPITAL R
+1D5B2 MATHEMATICAL SANS-SERIF CAPITAL S
+1D5B3 MATHEMATICAL SANS-SERIF CAPITAL T
+1D5B4 MATHEMATICAL SANS-SERIF CAPITAL U
+1D5B5 MATHEMATICAL SANS-SERIF CAPITAL V
+1D5B6 MATHEMATICAL SANS-SERIF CAPITAL W
+1D5B7 MATHEMATICAL SANS-SERIF CAPITAL X
+1D5B8 MATHEMATICAL SANS-SERIF CAPITAL Y
+1D5B9 MATHEMATICAL SANS-SERIF CAPITAL Z
+1D5BA MATHEMATICAL SANS-SERIF SMALL A
+1D5BB MATHEMATICAL SANS-SERIF SMALL B
+1D5BC MATHEMATICAL SANS-SERIF SMALL C
+1D5BD MATHEMATICAL SANS-SERIF SMALL D
+1D5BE MATHEMATICAL SANS-SERIF SMALL E
+1D5BF MATHEMATICAL SANS-SERIF SMALL F
+1D5C0 MATHEMATICAL SANS-SERIF SMALL G
+1D5C1 MATHEMATICAL SANS-SERIF SMALL H
+1D5C2 MATHEMATICAL SANS-SERIF SMALL I
+1D5C3 MATHEMATICAL SANS-SERIF SMALL J
+1D5C4 MATHEMATICAL SANS-SERIF SMALL K
+1D5C5 MATHEMATICAL SANS-SERIF SMALL L
+1D5C6 MATHEMATICAL SANS-SERIF SMALL M
+1D5C7 MATHEMATICAL SANS-SERIF SMALL N
+1D5C8 MATHEMATICAL SANS-SERIF SMALL O
+1D5C9 MATHEMATICAL SANS-SERIF SMALL P
+1D5CA MATHEMATICAL SANS-SERIF SMALL Q
+1D5CB MATHEMATICAL SANS-SERIF SMALL R
+1D5CC MATHEMATICAL SANS-SERIF SMALL S
+1D5CD MATHEMATICAL SANS-SERIF SMALL T
+1D5CE MATHEMATICAL SANS-SERIF SMALL U
+1D5CF MATHEMATICAL SANS-SERIF SMALL V
+1D5D0 MATHEMATICAL SANS-SERIF SMALL W
+1D5D1 MATHEMATICAL SANS-SERIF SMALL X
+1D5D2 MATHEMATICAL SANS-SERIF SMALL Y
+1D5D3 MATHEMATICAL SANS-SERIF SMALL Z
+1D5D4 MATHEMATICAL SANS-SERIF BOLD CAPITAL A
+1D5D5 MATHEMATICAL SANS-SERIF BOLD CAPITAL B
+1D5D6 MATHEMATICAL SANS-SERIF BOLD CAPITAL C
+1D5D7 MATHEMATICAL SANS-SERIF BOLD CAPITAL D
+1D5D8 MATHEMATICAL SANS-SERIF BOLD CAPITAL E
+1D5D9 MATHEMATICAL SANS-SERIF BOLD CAPITAL F
+1D5DA MATHEMATICAL SANS-SERIF BOLD CAPITAL G
+1D5DB MATHEMATICAL SANS-SERIF BOLD CAPITAL H
+1D5DC MATHEMATICAL SANS-SERIF BOLD CAPITAL I
+1D5DD MATHEMATICAL SANS-SERIF BOLD CAPITAL J
+1D5DE MATHEMATICAL SANS-SERIF BOLD CAPITAL K
+1D5DF MATHEMATICAL SANS-SERIF BOLD CAPITAL L
+1D5E0 MATHEMATICAL SANS-SERIF BOLD CAPITAL M
+1D5E1 MATHEMATICAL SANS-SERIF BOLD CAPITAL N
+1D5E2 MATHEMATICAL SANS-SERIF BOLD CAPITAL O
+1D5E3 MATHEMATICAL SANS-SERIF BOLD CAPITAL P
+1D5E4 MATHEMATICAL SANS-SERIF BOLD CAPITAL Q
+1D5E5 MATHEMATICAL SANS-SERIF BOLD CAPITAL R
+1D5E6 MATHEMATICAL SANS-SERIF BOLD CAPITAL S
+1D5E7 MATHEMATICAL SANS-SERIF BOLD CAPITAL T
+1D5E8 MATHEMATICAL SANS-SERIF BOLD CAPITAL U
+1D5E9 MATHEMATICAL SANS-SERIF BOLD CAPITAL V
+1D5EA MATHEMATICAL SANS-SERIF BOLD CAPITAL W
+1D5EB MATHEMATICAL SANS-SERIF BOLD CAPITAL X
+1D5EC MATHEMATICAL SANS-SERIF BOLD CAPITAL Y
+1D5ED MATHEMATICAL SANS-SERIF BOLD CAPITAL Z
+1D5EE MATHEMATICAL SANS-SERIF BOLD SMALL A
+1D5EF MATHEMATICAL SANS-SERIF BOLD SMALL B
+1D5F0 MATHEMATICAL SANS-SERIF BOLD SMALL C
+1D5F1 MATHEMATICAL SANS-SERIF BOLD SMALL D
+1D5F2 MATHEMATICAL SANS-SERIF BOLD SMALL E
+1D5F3 MATHEMATICAL SANS-SERIF BOLD SMALL F
+1D5F4 MATHEMATICAL SANS-SERIF BOLD SMALL G
+1D5F5 MATHEMATICAL SANS-SERIF BOLD SMALL H
+1D5F6 MATHEMATICAL SANS-SERIF BOLD SMALL I
+1D5F7 MATHEMATICAL SANS-SERIF BOLD SMALL J
+1D5F8 MATHEMATICAL SANS-SERIF BOLD SMALL K
+1D5F9 MATHEMATICAL SANS-SERIF BOLD SMALL L
+1D5FA MATHEMATICAL SANS-SERIF BOLD SMALL M
+1D5FB MATHEMATICAL SANS-SERIF BOLD SMALL N
+1D5FC MATHEMATICAL SANS-SERIF BOLD SMALL O
+1D5FD MATHEMATICAL SANS-SERIF BOLD SMALL P
+1D5FE MATHEMATICAL SANS-SERIF BOLD SMALL Q
+1D5FF MATHEMATICAL SANS-SERIF BOLD SMALL R
+1D600 MATHEMATICAL SANS-SERIF BOLD SMALL S
+1D601 MATHEMATICAL SANS-SERIF BOLD SMALL T
+1D602 MATHEMATICAL SANS-SERIF BOLD SMALL U
+1D603 MATHEMATICAL SANS-SERIF BOLD SMALL V
+1D604 MATHEMATICAL SANS-SERIF BOLD SMALL W
+1D605 MATHEMATICAL SANS-SERIF BOLD SMALL X
+1D606 MATHEMATICAL SANS-SERIF BOLD SMALL Y
+1D607 MATHEMATICAL SANS-SERIF BOLD SMALL Z
+1D608 MATHEMATICAL SANS-SERIF ITALIC CAPITAL A
+1D609 MATHEMATICAL SANS-SERIF ITALIC CAPITAL B
+1D60A MATHEMATICAL SANS-SERIF ITALIC CAPITAL C
+1D60B MATHEMATICAL SANS-SERIF ITALIC CAPITAL D
+1D60C MATHEMATICAL SANS-SERIF ITALIC CAPITAL E
+1D60D MATHEMATICAL SANS-SERIF ITALIC CAPITAL F
+1D60E MATHEMATICAL SANS-SERIF ITALIC CAPITAL G
+1D60F MATHEMATICAL SANS-SERIF ITALIC CAPITAL H
+1D610 MATHEMATICAL SANS-SERIF ITALIC CAPITAL I
+1D611 MATHEMATICAL SANS-SERIF ITALIC CAPITAL J
+1D612 MATHEMATICAL SANS-SERIF ITALIC CAPITAL K
+1D613 MATHEMATICAL SANS-SERIF ITALIC CAPITAL L
+1D614 MATHEMATICAL SANS-SERIF ITALIC CAPITAL M
+1D615 MATHEMATICAL SANS-SERIF ITALIC CAPITAL N
+1D616 MATHEMATICAL SANS-SERIF ITALIC CAPITAL O
+1D617 MATHEMATICAL SANS-SERIF ITALIC CAPITAL P
+1D618 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q
+1D619 MATHEMATICAL SANS-SERIF ITALIC CAPITAL R
+1D61A MATHEMATICAL SANS-SERIF ITALIC CAPITAL S
+1D61B MATHEMATICAL SANS-SERIF ITALIC CAPITAL T
+1D61C MATHEMATICAL SANS-SERIF ITALIC CAPITAL U
+1D61D MATHEMATICAL SANS-SERIF ITALIC CAPITAL V
+1D61E MATHEMATICAL SANS-SERIF ITALIC CAPITAL W
+1D61F MATHEMATICAL SANS-SERIF ITALIC CAPITAL X
+1D620 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y
+1D621 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z
+1D622 MATHEMATICAL SANS-SERIF ITALIC SMALL A
+1D623 MATHEMATICAL SANS-SERIF ITALIC SMALL B
+1D624 MATHEMATICAL SANS-SERIF ITALIC SMALL C
+1D625 MATHEMATICAL SANS-SERIF ITALIC SMALL D
+1D626 MATHEMATICAL SANS-SERIF ITALIC SMALL E
+1D627 MATHEMATICAL SANS-SERIF ITALIC SMALL F
+1D628 MATHEMATICAL SANS-SERIF ITALIC SMALL G
+1D629 MATHEMATICAL SANS-SERIF ITALIC SMALL H
+1D62A MATHEMATICAL SANS-SERIF ITALIC SMALL I
+1D62B MATHEMATICAL SANS-SERIF ITALIC SMALL J
+1D62C MATHEMATICAL SANS-SERIF ITALIC SMALL K
+1D62D MATHEMATICAL SANS-SERIF ITALIC SMALL L
+1D62E MATHEMATICAL SANS-SERIF ITALIC SMALL M
+1D62F MATHEMATICAL SANS-SERIF ITALIC SMALL N
+1D630 MATHEMATICAL SANS-SERIF ITALIC SMALL O
+1D631 MATHEMATICAL SANS-SERIF ITALIC SMALL P
+1D632 MATHEMATICAL SANS-SERIF ITALIC SMALL Q
+1D633 MATHEMATICAL SANS-SERIF ITALIC SMALL R
+1D634 MATHEMATICAL SANS-SERIF ITALIC SMALL S
+1D635 MATHEMATICAL SANS-SERIF ITALIC SMALL T
+1D636 MATHEMATICAL SANS-SERIF ITALIC SMALL U
+1D637 MATHEMATICAL SANS-SERIF ITALIC SMALL V
+1D638 MATHEMATICAL SANS-SERIF ITALIC SMALL W
+1D639 MATHEMATICAL SANS-SERIF ITALIC SMALL X
+1D63A MATHEMATICAL SANS-SERIF ITALIC SMALL Y
+1D63B MATHEMATICAL SANS-SERIF ITALIC SMALL Z
+1D63C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A
+1D63D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B
+1D63E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C
+1D63F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D
+1D640 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E
+1D641 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F
+1D642 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G
+1D643 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H
+1D644 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I
+1D645 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J
+1D646 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K
+1D647 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L
+1D648 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M
+1D649 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N
+1D64A MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O
+1D64B MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P
+1D64C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q
+1D64D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R
+1D64E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S
+1D64F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T
+1D650 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U
+1D651 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V
+1D652 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W
+1D653 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X
+1D654 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y
+1D655 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z
+1D656 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A
+1D657 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B
+1D658 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C
+1D659 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D
+1D65A MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E
+1D65B MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F
+1D65C MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G
+1D65D MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H
+1D65E MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I
+1D65F MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+1D660 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K
+1D661 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L
+1D662 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M
+1D663 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N
+1D664 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O
+1D665 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P
+1D666 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q
+1D667 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R
+1D668 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S
+1D669 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T
+1D66A MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U
+1D66B MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V
+1D66C MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W
+1D66D MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X
+1D66E MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y
+1D66F MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z
+1D670 MATHEMATICAL MONOSPACE CAPITAL A
+1D671 MATHEMATICAL MONOSPACE CAPITAL B
+1D672 MATHEMATICAL MONOSPACE CAPITAL C
+1D673 MATHEMATICAL MONOSPACE CAPITAL D
+1D674 MATHEMATICAL MONOSPACE CAPITAL E
+1D675 MATHEMATICAL MONOSPACE CAPITAL F
+1D676 MATHEMATICAL MONOSPACE CAPITAL G
+1D677 MATHEMATICAL MONOSPACE CAPITAL H
+1D678 MATHEMATICAL MONOSPACE CAPITAL I
+1D679 MATHEMATICAL MONOSPACE CAPITAL J
+1D67A MATHEMATICAL MONOSPACE CAPITAL K
+1D67B MATHEMATICAL MONOSPACE CAPITAL L
+1D67C MATHEMATICAL MONOSPACE CAPITAL M
+1D67D MATHEMATICAL MONOSPACE CAPITAL N
+1D67E MATHEMATICAL MONOSPACE CAPITAL O
+1D67F MATHEMATICAL MONOSPACE CAPITAL P
+1D680 MATHEMATICAL MONOSPACE CAPITAL Q
+1D681 MATHEMATICAL MONOSPACE CAPITAL R
+1D682 MATHEMATICAL MONOSPACE CAPITAL S
+1D683 MATHEMATICAL MONOSPACE CAPITAL T
+1D684 MATHEMATICAL MONOSPACE CAPITAL U
+1D685 MATHEMATICAL MONOSPACE CAPITAL V
+1D686 MATHEMATICAL MONOSPACE CAPITAL W
+1D687 MATHEMATICAL MONOSPACE CAPITAL X
+1D688 MATHEMATICAL MONOSPACE CAPITAL Y
+1D689 MATHEMATICAL MONOSPACE CAPITAL Z
+1D68A MATHEMATICAL MONOSPACE SMALL A
+1D68B MATHEMATICAL MONOSPACE SMALL B
+1D68C MATHEMATICAL MONOSPACE SMALL C
+1D68D MATHEMATICAL MONOSPACE SMALL D
+1D68E MATHEMATICAL MONOSPACE SMALL E
+1D68F MATHEMATICAL MONOSPACE SMALL F
+1D690 MATHEMATICAL MONOSPACE SMALL G
+1D691 MATHEMATICAL MONOSPACE SMALL H
+1D692 MATHEMATICAL MONOSPACE SMALL I
+1D693 MATHEMATICAL MONOSPACE SMALL J
+1D694 MATHEMATICAL MONOSPACE SMALL K
+1D695 MATHEMATICAL MONOSPACE SMALL L
+1D696 MATHEMATICAL MONOSPACE SMALL M
+1D697 MATHEMATICAL MONOSPACE SMALL N
+1D698 MATHEMATICAL MONOSPACE SMALL O
+1D699 MATHEMATICAL MONOSPACE SMALL P
+1D69A MATHEMATICAL MONOSPACE SMALL Q
+1D69B MATHEMATICAL MONOSPACE SMALL R
+1D69C MATHEMATICAL MONOSPACE SMALL S
+1D69D MATHEMATICAL MONOSPACE SMALL T
+1D69E MATHEMATICAL MONOSPACE SMALL U
+1D69F MATHEMATICAL MONOSPACE SMALL V
+1D6A0 MATHEMATICAL MONOSPACE SMALL W
+1D6A1 MATHEMATICAL MONOSPACE SMALL X
+1D6A2 MATHEMATICAL MONOSPACE SMALL Y
+1D6A3 MATHEMATICAL MONOSPACE SMALL Z
+1D6A4 MATHEMATICAL ITALIC SMALL DOTLESS I
+1D6A5 MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8 MATHEMATICAL BOLD CAPITAL ALPHA
+1D6A9 MATHEMATICAL BOLD CAPITAL BETA
+1D6AA MATHEMATICAL BOLD CAPITAL GAMMA
+1D6AB MATHEMATICAL BOLD CAPITAL DELTA
+1D6AC MATHEMATICAL BOLD CAPITAL EPSILON
+1D6AD MATHEMATICAL BOLD CAPITAL ZETA
+1D6AE MATHEMATICAL BOLD CAPITAL ETA
+1D6AF MATHEMATICAL BOLD CAPITAL THETA
+1D6B0 MATHEMATICAL BOLD CAPITAL IOTA
+1D6B1 MATHEMATICAL BOLD CAPITAL KAPPA
+1D6B2 MATHEMATICAL BOLD CAPITAL LAMDA
+1D6B3 MATHEMATICAL BOLD CAPITAL MU
+1D6B4 MATHEMATICAL BOLD CAPITAL NU
+1D6B5 MATHEMATICAL BOLD CAPITAL XI
+1D6B6 MATHEMATICAL BOLD CAPITAL OMICRON
+1D6B7 MATHEMATICAL BOLD CAPITAL PI
+1D6B8 MATHEMATICAL BOLD CAPITAL RHO
+1D6B9 MATHEMATICAL BOLD CAPITAL THETA SYMBOL
+1D6BA MATHEMATICAL BOLD CAPITAL SIGMA
+1D6BB MATHEMATICAL BOLD CAPITAL TAU
+1D6BC MATHEMATICAL BOLD CAPITAL UPSILON
+1D6BD MATHEMATICAL BOLD CAPITAL PHI
+1D6BE MATHEMATICAL BOLD CAPITAL CHI
+1D6BF MATHEMATICAL BOLD CAPITAL PSI
+1D6C0 MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1 MATHEMATICAL BOLD NABLA
+1D6C2 MATHEMATICAL BOLD SMALL ALPHA
+1D6C3 MATHEMATICAL BOLD SMALL BETA
+1D6C4 MATHEMATICAL BOLD SMALL GAMMA
+1D6C5 MATHEMATICAL BOLD SMALL DELTA
+1D6C6 MATHEMATICAL BOLD SMALL EPSILON
+1D6C7 MATHEMATICAL BOLD SMALL ZETA
+1D6C8 MATHEMATICAL BOLD SMALL ETA
+1D6C9 MATHEMATICAL BOLD SMALL THETA
+1D6CA MATHEMATICAL BOLD SMALL IOTA
+1D6CB MATHEMATICAL BOLD SMALL KAPPA
+1D6CC MATHEMATICAL BOLD SMALL LAMDA
+1D6CD MATHEMATICAL BOLD SMALL MU
+1D6CE MATHEMATICAL BOLD SMALL NU
+1D6CF MATHEMATICAL BOLD SMALL XI
+1D6D0 MATHEMATICAL BOLD SMALL OMICRON
+1D6D1 MATHEMATICAL BOLD SMALL PI
+1D6D2 MATHEMATICAL BOLD SMALL RHO
+1D6D3 MATHEMATICAL BOLD SMALL FINAL SIGMA
+1D6D4 MATHEMATICAL BOLD SMALL SIGMA
+1D6D5 MATHEMATICAL BOLD SMALL TAU
+1D6D6 MATHEMATICAL BOLD SMALL UPSILON
+1D6D7 MATHEMATICAL BOLD SMALL PHI
+1D6D8 MATHEMATICAL BOLD SMALL CHI
+1D6D9 MATHEMATICAL BOLD SMALL PSI
+1D6DA MATHEMATICAL BOLD SMALL OMEGA
+1D6DB MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC MATHEMATICAL BOLD EPSILON SYMBOL
+1D6DD MATHEMATICAL BOLD THETA SYMBOL
+1D6DE MATHEMATICAL BOLD KAPPA SYMBOL
+1D6DF MATHEMATICAL BOLD PHI SYMBOL
+1D6E0 MATHEMATICAL BOLD RHO SYMBOL
+1D6E1 MATHEMATICAL BOLD PI SYMBOL
+1D6E2 MATHEMATICAL ITALIC CAPITAL ALPHA
+1D6E3 MATHEMATICAL ITALIC CAPITAL BETA
+1D6E4 MATHEMATICAL ITALIC CAPITAL GAMMA
+1D6E5 MATHEMATICAL ITALIC CAPITAL DELTA
+1D6E6 MATHEMATICAL ITALIC CAPITAL EPSILON
+1D6E7 MATHEMATICAL ITALIC CAPITAL ZETA
+1D6E8 MATHEMATICAL ITALIC CAPITAL ETA
+1D6E9 MATHEMATICAL ITALIC CAPITAL THETA
+1D6EA MATHEMATICAL ITALIC CAPITAL IOTA
+1D6EB MATHEMATICAL ITALIC CAPITAL KAPPA
+1D6EC MATHEMATICAL ITALIC CAPITAL LAMDA
+1D6ED MATHEMATICAL ITALIC CAPITAL MU
+1D6EE MATHEMATICAL ITALIC CAPITAL NU
+1D6EF MATHEMATICAL ITALIC CAPITAL XI
+1D6F0 MATHEMATICAL ITALIC CAPITAL OMICRON
+1D6F1 MATHEMATICAL ITALIC CAPITAL PI
+1D6F2 MATHEMATICAL ITALIC CAPITAL RHO
+1D6F3 MATHEMATICAL ITALIC CAPITAL THETA SYMBOL
+1D6F4 MATHEMATICAL ITALIC CAPITAL SIGMA
+1D6F5 MATHEMATICAL ITALIC CAPITAL TAU
+1D6F6 MATHEMATICAL ITALIC CAPITAL UPSILON
+1D6F7 MATHEMATICAL ITALIC CAPITAL PHI
+1D6F8 MATHEMATICAL ITALIC CAPITAL CHI
+1D6F9 MATHEMATICAL ITALIC CAPITAL PSI
+1D6FA MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB MATHEMATICAL ITALIC NABLA
+1D6FC MATHEMATICAL ITALIC SMALL ALPHA
+1D6FD MATHEMATICAL ITALIC SMALL BETA
+1D6FE MATHEMATICAL ITALIC SMALL GAMMA
+1D6FF MATHEMATICAL ITALIC SMALL DELTA
+1D700 MATHEMATICAL ITALIC SMALL EPSILON
+1D701 MATHEMATICAL ITALIC SMALL ZETA
+1D702 MATHEMATICAL ITALIC SMALL ETA
+1D703 MATHEMATICAL ITALIC SMALL THETA
+1D704 MATHEMATICAL ITALIC SMALL IOTA
+1D705 MATHEMATICAL ITALIC SMALL KAPPA
+1D706 MATHEMATICAL ITALIC SMALL LAMDA
+1D707 MATHEMATICAL ITALIC SMALL MU
+1D708 MATHEMATICAL ITALIC SMALL NU
+1D709 MATHEMATICAL ITALIC SMALL XI
+1D70A MATHEMATICAL ITALIC SMALL OMICRON
+1D70B MATHEMATICAL ITALIC SMALL PI
+1D70C MATHEMATICAL ITALIC SMALL RHO
+1D70D MATHEMATICAL ITALIC SMALL FINAL SIGMA
+1D70E MATHEMATICAL ITALIC SMALL SIGMA
+1D70F MATHEMATICAL ITALIC SMALL TAU
+1D710 MATHEMATICAL ITALIC SMALL UPSILON
+1D711 MATHEMATICAL ITALIC SMALL PHI
+1D712 MATHEMATICAL ITALIC SMALL CHI
+1D713 MATHEMATICAL ITALIC SMALL PSI
+1D714 MATHEMATICAL ITALIC SMALL OMEGA
+1D715 MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716 MATHEMATICAL ITALIC EPSILON SYMBOL
+1D717 MATHEMATICAL ITALIC THETA SYMBOL
+1D718 MATHEMATICAL ITALIC KAPPA SYMBOL
+1D719 MATHEMATICAL ITALIC PHI SYMBOL
+1D71A MATHEMATICAL ITALIC RHO SYMBOL
+1D71B MATHEMATICAL ITALIC PI SYMBOL
+1D71C MATHEMATICAL BOLD ITALIC CAPITAL ALPHA
+1D71D MATHEMATICAL BOLD ITALIC CAPITAL BETA
+1D71E MATHEMATICAL BOLD ITALIC CAPITAL GAMMA
+1D71F MATHEMATICAL BOLD ITALIC CAPITAL DELTA
+1D720 MATHEMATICAL BOLD ITALIC CAPITAL EPSILON
+1D721 MATHEMATICAL BOLD ITALIC CAPITAL ZETA
+1D722 MATHEMATICAL BOLD ITALIC CAPITAL ETA
+1D723 MATHEMATICAL BOLD ITALIC CAPITAL THETA
+1D724 MATHEMATICAL BOLD ITALIC CAPITAL IOTA
+1D725 MATHEMATICAL BOLD ITALIC CAPITAL KAPPA
+1D726 MATHEMATICAL BOLD ITALIC CAPITAL LAMDA
+1D727 MATHEMATICAL BOLD ITALIC CAPITAL MU
+1D728 MATHEMATICAL BOLD ITALIC CAPITAL NU
+1D729 MATHEMATICAL BOLD ITALIC CAPITAL XI
+1D72A MATHEMATICAL BOLD ITALIC CAPITAL OMICRON
+1D72B MATHEMATICAL BOLD ITALIC CAPITAL PI
+1D72C MATHEMATICAL BOLD ITALIC CAPITAL RHO
+1D72D MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL
+1D72E MATHEMATICAL BOLD ITALIC CAPITAL SIGMA
+1D72F MATHEMATICAL BOLD ITALIC CAPITAL TAU
+1D730 MATHEMATICAL BOLD ITALIC CAPITAL UPSILON
+1D731 MATHEMATICAL BOLD ITALIC CAPITAL PHI
+1D732 MATHEMATICAL BOLD ITALIC CAPITAL CHI
+1D733 MATHEMATICAL BOLD ITALIC CAPITAL PSI
+1D734 MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735 MATHEMATICAL BOLD ITALIC NABLA
+1D736 MATHEMATICAL BOLD ITALIC SMALL ALPHA
+1D737 MATHEMATICAL BOLD ITALIC SMALL BETA
+1D738 MATHEMATICAL BOLD ITALIC SMALL GAMMA
+1D739 MATHEMATICAL BOLD ITALIC SMALL DELTA
+1D73A MATHEMATICAL BOLD ITALIC SMALL EPSILON
+1D73B MATHEMATICAL BOLD ITALIC SMALL ZETA
+1D73C MATHEMATICAL BOLD ITALIC SMALL ETA
+1D73D MATHEMATICAL BOLD ITALIC SMALL THETA
+1D73E MATHEMATICAL BOLD ITALIC SMALL IOTA
+1D73F MATHEMATICAL BOLD ITALIC SMALL KAPPA
+1D740 MATHEMATICAL BOLD ITALIC SMALL LAMDA
+1D741 MATHEMATICAL BOLD ITALIC SMALL MU
+1D742 MATHEMATICAL BOLD ITALIC SMALL NU
+1D743 MATHEMATICAL BOLD ITALIC SMALL XI
+1D744 MATHEMATICAL BOLD ITALIC SMALL OMICRON
+1D745 MATHEMATICAL BOLD ITALIC SMALL PI
+1D746 MATHEMATICAL BOLD ITALIC SMALL RHO
+1D747 MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA
+1D748 MATHEMATICAL BOLD ITALIC SMALL SIGMA
+1D749 MATHEMATICAL BOLD ITALIC SMALL TAU
+1D74A MATHEMATICAL BOLD ITALIC SMALL UPSILON
+1D74B MATHEMATICAL BOLD ITALIC SMALL PHI
+1D74C MATHEMATICAL BOLD ITALIC SMALL CHI
+1D74D MATHEMATICAL BOLD ITALIC SMALL PSI
+1D74E MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750 MATHEMATICAL BOLD ITALIC EPSILON SYMBOL
+1D751 MATHEMATICAL BOLD ITALIC THETA SYMBOL
+1D752 MATHEMATICAL BOLD ITALIC KAPPA SYMBOL
+1D753 MATHEMATICAL BOLD ITALIC PHI SYMBOL
+1D754 MATHEMATICAL BOLD ITALIC RHO SYMBOL
+1D755 MATHEMATICAL BOLD ITALIC PI SYMBOL
+1D756 MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA
+1D757 MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA
+1D758 MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA
+1D759 MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA
+1D75A MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON
+1D75B MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA
+1D75C MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA
+1D75D MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA
+1D75E MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA
+1D75F MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA
+1D760 MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA
+1D761 MATHEMATICAL SANS-SERIF BOLD CAPITAL MU
+1D762 MATHEMATICAL SANS-SERIF BOLD CAPITAL NU
+1D763 MATHEMATICAL SANS-SERIF BOLD CAPITAL XI
+1D764 MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON
+1D765 MATHEMATICAL SANS-SERIF BOLD CAPITAL PI
+1D766 MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO
+1D767 MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL
+1D768 MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA
+1D769 MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU
+1D76A MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON
+1D76B MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI
+1D76C MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI
+1D76D MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI
+1D76E MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770 MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA
+1D771 MATHEMATICAL SANS-SERIF BOLD SMALL BETA
+1D772 MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA
+1D773 MATHEMATICAL SANS-SERIF BOLD SMALL DELTA
+1D774 MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON
+1D775 MATHEMATICAL SANS-SERIF BOLD SMALL ZETA
+1D776 MATHEMATICAL SANS-SERIF BOLD SMALL ETA
+1D777 MATHEMATICAL SANS-SERIF BOLD SMALL THETA
+1D778 MATHEMATICAL SANS-SERIF BOLD SMALL IOTA
+1D779 MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA
+1D77A MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA
+1D77B MATHEMATICAL SANS-SERIF BOLD SMALL MU
+1D77C MATHEMATICAL SANS-SERIF BOLD SMALL NU
+1D77D MATHEMATICAL SANS-SERIF BOLD SMALL XI
+1D77E MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON
+1D77F MATHEMATICAL SANS-SERIF BOLD SMALL PI
+1D780 MATHEMATICAL SANS-SERIF BOLD SMALL RHO
+1D781 MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA
+1D782 MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA
+1D783 MATHEMATICAL SANS-SERIF BOLD SMALL TAU
+1D784 MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON
+1D785 MATHEMATICAL SANS-SERIF BOLD SMALL PHI
+1D786 MATHEMATICAL SANS-SERIF BOLD SMALL CHI
+1D787 MATHEMATICAL SANS-SERIF BOLD SMALL PSI
+1D788 MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789 MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL
+1D78B MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL
+1D78C MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL
+1D78D MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL
+1D78E MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL
+1D78F MATHEMATICAL SANS-SERIF BOLD PI SYMBOL
+1D790 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA
+1D791 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA
+1D792 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA
+1D793 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA
+1D794 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON
+1D795 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA
+1D796 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA
+1D797 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA
+1D798 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA
+1D799 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA
+1D79A MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA
+1D79B MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU
+1D79C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU
+1D79D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI
+1D79E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON
+1D79F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI
+1D7A0 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO
+1D7A1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL
+1D7A2 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA
+1D7A3 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU
+1D7A4 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON
+1D7A5 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI
+1D7A6 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI
+1D7A7 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI
+1D7A8 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9 MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA
+1D7AB MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA
+1D7AC MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA
+1D7AD MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA
+1D7AE MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON
+1D7AF MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA
+1D7B0 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA
+1D7B1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA
+1D7B2 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA
+1D7B3 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA
+1D7B4 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA
+1D7B5 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU
+1D7B6 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU
+1D7B7 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI
+1D7B8 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON
+1D7B9 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI
+1D7BA MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO
+1D7BB MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA
+1D7BC MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA
+1D7BD MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU
+1D7BE MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON
+1D7BF MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI
+1D7C0 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI
+1D7C1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI
+1D7C2 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3 MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4 MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL
+1D7C5 MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL
+1D7C6 MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL
+1D7C7 MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL
+1D7C8 MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL
+1D7C9 MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+1D7CA MATHEMATICAL BOLD CAPITAL DIGAMMA
+1D7CB MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE MATHEMATICAL BOLD DIGIT ZERO
+1D7CF MATHEMATICAL BOLD DIGIT ONE
+1D7D0 MATHEMATICAL BOLD DIGIT TWO
+1D7D1 MATHEMATICAL BOLD DIGIT THREE
+1D7D2 MATHEMATICAL BOLD DIGIT FOUR
+1D7D3 MATHEMATICAL BOLD DIGIT FIVE
+1D7D4 MATHEMATICAL BOLD DIGIT SIX
+1D7D5 MATHEMATICAL BOLD DIGIT SEVEN
+1D7D6 MATHEMATICAL BOLD DIGIT EIGHT
+1D7D7 MATHEMATICAL BOLD DIGIT NINE
+1D7D8 MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO
+1D7D9 MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
+1D7DA MATHEMATICAL DOUBLE-STRUCK DIGIT TWO
+1D7DB MATHEMATICAL DOUBLE-STRUCK DIGIT THREE
+1D7DC MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR
+1D7DD MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE
+1D7DE MATHEMATICAL DOUBLE-STRUCK DIGIT SIX
+1D7DF MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN
+1D7E0 MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT
+1D7E1 MATHEMATICAL DOUBLE-STRUCK DIGIT NINE
+1D7E2 MATHEMATICAL SANS-SERIF DIGIT ZERO
+1D7E3 MATHEMATICAL SANS-SERIF DIGIT ONE
+1D7E4 MATHEMATICAL SANS-SERIF DIGIT TWO
+1D7E5 MATHEMATICAL SANS-SERIF DIGIT THREE
+1D7E6 MATHEMATICAL SANS-SERIF DIGIT FOUR
+1D7E7 MATHEMATICAL SANS-SERIF DIGIT FIVE
+1D7E8 MATHEMATICAL SANS-SERIF DIGIT SIX
+1D7E9 MATHEMATICAL SANS-SERIF DIGIT SEVEN
+1D7EA MATHEMATICAL SANS-SERIF DIGIT EIGHT
+1D7EB MATHEMATICAL SANS-SERIF DIGIT NINE
+1D7EC MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO
+1D7ED MATHEMATICAL SANS-SERIF BOLD DIGIT ONE
+1D7EE MATHEMATICAL SANS-SERIF BOLD DIGIT TWO
+1D7EF MATHEMATICAL SANS-SERIF BOLD DIGIT THREE
+1D7F0 MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR
+1D7F1 MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE
+1D7F2 MATHEMATICAL SANS-SERIF BOLD DIGIT SIX
+1D7F3 MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN
+1D7F4 MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT
+1D7F5 MATHEMATICAL SANS-SERIF BOLD DIGIT NINE
+1D7F6 MATHEMATICAL MONOSPACE DIGIT ZERO
+1D7F7 MATHEMATICAL MONOSPACE DIGIT ONE
+1D7F8 MATHEMATICAL MONOSPACE DIGIT TWO
+1D7F9 MATHEMATICAL MONOSPACE DIGIT THREE
+1D7FA MATHEMATICAL MONOSPACE DIGIT FOUR
+1D7FB MATHEMATICAL MONOSPACE DIGIT FIVE
+1D7FC MATHEMATICAL MONOSPACE DIGIT SIX
+1D7FD MATHEMATICAL MONOSPACE DIGIT SEVEN
+1D7FE MATHEMATICAL MONOSPACE DIGIT EIGHT
+1D7FF MATHEMATICAL MONOSPACE DIGIT NINE
+1F000 MAHJONG TILE EAST WIND
+1F001 MAHJONG TILE SOUTH WIND
+1F002 MAHJONG TILE WEST WIND
+1F003 MAHJONG TILE NORTH WIND
+1F004 MAHJONG TILE RED DRAGON
+1F005 MAHJONG TILE GREEN DRAGON
+1F006 MAHJONG TILE WHITE DRAGON
+1F007 MAHJONG TILE ONE OF CHARACTERS
+1F008 MAHJONG TILE TWO OF CHARACTERS
+1F009 MAHJONG TILE THREE OF CHARACTERS
+1F00A MAHJONG TILE FOUR OF CHARACTERS
+1F00B MAHJONG TILE FIVE OF CHARACTERS
+1F00C MAHJONG TILE SIX OF CHARACTERS
+1F00D MAHJONG TILE SEVEN OF CHARACTERS
+1F00E MAHJONG TILE EIGHT OF CHARACTERS
+1F00F MAHJONG TILE NINE OF CHARACTERS
+1F010 MAHJONG TILE ONE OF BAMBOOS
+1F011 MAHJONG TILE TWO OF BAMBOOS
+1F012 MAHJONG TILE THREE OF BAMBOOS
+1F013 MAHJONG TILE FOUR OF BAMBOOS
+1F014 MAHJONG TILE FIVE OF BAMBOOS
+1F015 MAHJONG TILE SIX OF BAMBOOS
+1F016 MAHJONG TILE SEVEN OF BAMBOOS
+1F017 MAHJONG TILE EIGHT OF BAMBOOS
+1F018 MAHJONG TILE NINE OF BAMBOOS
+1F019 MAHJONG TILE ONE OF CIRCLES
+1F01A MAHJONG TILE TWO OF CIRCLES
+1F01B MAHJONG TILE THREE OF CIRCLES
+1F01C MAHJONG TILE FOUR OF CIRCLES
+1F01D MAHJONG TILE FIVE OF CIRCLES
+1F01E MAHJONG TILE SIX OF CIRCLES
+1F01F MAHJONG TILE SEVEN OF CIRCLES
+1F020 MAHJONG TILE EIGHT OF CIRCLES
+1F021 MAHJONG TILE NINE OF CIRCLES
+1F022 MAHJONG TILE PLUM
+1F023 MAHJONG TILE ORCHID
+1F024 MAHJONG TILE BAMBOO
+1F025 MAHJONG TILE CHRYSANTHEMUM
+1F026 MAHJONG TILE SPRING
+1F027 MAHJONG TILE SUMMER
+1F028 MAHJONG TILE AUTUMN
+1F029 MAHJONG TILE WINTER
+1F02A MAHJONG TILE JOKER
+1F02B MAHJONG TILE BACK
+1F030 DOMINO TILE HORIZONTAL BACK
+1F031 DOMINO TILE HORIZONTAL-00-00
+1F032 DOMINO TILE HORIZONTAL-00-01
+1F033 DOMINO TILE HORIZONTAL-00-02
+1F034 DOMINO TILE HORIZONTAL-00-03
+1F035 DOMINO TILE HORIZONTAL-00-04
+1F036 DOMINO TILE HORIZONTAL-00-05
+1F037 DOMINO TILE HORIZONTAL-00-06
+1F038 DOMINO TILE HORIZONTAL-01-00
+1F039 DOMINO TILE HORIZONTAL-01-01
+1F03A DOMINO TILE HORIZONTAL-01-02
+1F03B DOMINO TILE HORIZONTAL-01-03
+1F03C DOMINO TILE HORIZONTAL-01-04
+1F03D DOMINO TILE HORIZONTAL-01-05
+1F03E DOMINO TILE HORIZONTAL-01-06
+1F03F DOMINO TILE HORIZONTAL-02-00
+1F040 DOMINO TILE HORIZONTAL-02-01
+1F041 DOMINO TILE HORIZONTAL-02-02
+1F042 DOMINO TILE HORIZONTAL-02-03
+1F043 DOMINO TILE HORIZONTAL-02-04
+1F044 DOMINO TILE HORIZONTAL-02-05
+1F045 DOMINO TILE HORIZONTAL-02-06
+1F046 DOMINO TILE HORIZONTAL-03-00
+1F047 DOMINO TILE HORIZONTAL-03-01
+1F048 DOMINO TILE HORIZONTAL-03-02
+1F049 DOMINO TILE HORIZONTAL-03-03
+1F04A DOMINO TILE HORIZONTAL-03-04
+1F04B DOMINO TILE HORIZONTAL-03-05
+1F04C DOMINO TILE HORIZONTAL-03-06
+1F04D DOMINO TILE HORIZONTAL-04-00
+1F04E DOMINO TILE HORIZONTAL-04-01
+1F04F DOMINO TILE HORIZONTAL-04-02
+1F050 DOMINO TILE HORIZONTAL-04-03
+1F051 DOMINO TILE HORIZONTAL-04-04
+1F052 DOMINO TILE HORIZONTAL-04-05
+1F053 DOMINO TILE HORIZONTAL-04-06
+1F054 DOMINO TILE HORIZONTAL-05-00
+1F055 DOMINO TILE HORIZONTAL-05-01
+1F056 DOMINO TILE HORIZONTAL-05-02
+1F057 DOMINO TILE HORIZONTAL-05-03
+1F058 DOMINO TILE HORIZONTAL-05-04
+1F059 DOMINO TILE HORIZONTAL-05-05
+1F05A DOMINO TILE HORIZONTAL-05-06
+1F05B DOMINO TILE HORIZONTAL-06-00
+1F05C DOMINO TILE HORIZONTAL-06-01
+1F05D DOMINO TILE HORIZONTAL-06-02
+1F05E DOMINO TILE HORIZONTAL-06-03
+1F05F DOMINO TILE HORIZONTAL-06-04
+1F060 DOMINO TILE HORIZONTAL-06-05
+1F061 DOMINO TILE HORIZONTAL-06-06
+1F062 DOMINO TILE VERTICAL BACK
+1F063 DOMINO TILE VERTICAL-00-00
+1F064 DOMINO TILE VERTICAL-00-01
+1F065 DOMINO TILE VERTICAL-00-02
+1F066 DOMINO TILE VERTICAL-00-03
+1F067 DOMINO TILE VERTICAL-00-04
+1F068 DOMINO TILE VERTICAL-00-05
+1F069 DOMINO TILE VERTICAL-00-06
+1F06A DOMINO TILE VERTICAL-01-00
+1F06B DOMINO TILE VERTICAL-01-01
+1F06C DOMINO TILE VERTICAL-01-02
+1F06D DOMINO TILE VERTICAL-01-03
+1F06E DOMINO TILE VERTICAL-01-04
+1F06F DOMINO TILE VERTICAL-01-05
+1F070 DOMINO TILE VERTICAL-01-06
+1F071 DOMINO TILE VERTICAL-02-00
+1F072 DOMINO TILE VERTICAL-02-01
+1F073 DOMINO TILE VERTICAL-02-02
+1F074 DOMINO TILE VERTICAL-02-03
+1F075 DOMINO TILE VERTICAL-02-04
+1F076 DOMINO TILE VERTICAL-02-05
+1F077 DOMINO TILE VERTICAL-02-06
+1F078 DOMINO TILE VERTICAL-03-00
+1F079 DOMINO TILE VERTICAL-03-01
+1F07A DOMINO TILE VERTICAL-03-02
+1F07B DOMINO TILE VERTICAL-03-03
+1F07C DOMINO TILE VERTICAL-03-04
+1F07D DOMINO TILE VERTICAL-03-05
+1F07E DOMINO TILE VERTICAL-03-06
+1F07F DOMINO TILE VERTICAL-04-00
+1F080 DOMINO TILE VERTICAL-04-01
+1F081 DOMINO TILE VERTICAL-04-02
+1F082 DOMINO TILE VERTICAL-04-03
+1F083 DOMINO TILE VERTICAL-04-04
+1F084 DOMINO TILE VERTICAL-04-05
+1F085 DOMINO TILE VERTICAL-04-06
+1F086 DOMINO TILE VERTICAL-05-00
+1F087 DOMINO TILE VERTICAL-05-01
+1F088 DOMINO TILE VERTICAL-05-02
+1F089 DOMINO TILE VERTICAL-05-03
+1F08A DOMINO TILE VERTICAL-05-04
+1F08B DOMINO TILE VERTICAL-05-05
+1F08C DOMINO TILE VERTICAL-05-06
+1F08D DOMINO TILE VERTICAL-06-00
+1F08E DOMINO TILE VERTICAL-06-01
+1F08F DOMINO TILE VERTICAL-06-02
+1F090 DOMINO TILE VERTICAL-06-03
+1F091 DOMINO TILE VERTICAL-06-04
+1F092 DOMINO TILE VERTICAL-06-05
+1F093 DOMINO TILE VERTICAL-06-06
+20000 2A6D6 CJK Ideograph Extension B
+2F800 CJK COMPATIBILITY IDEOGRAPH-2F800
+2F801 CJK COMPATIBILITY IDEOGRAPH-2F801
+2F802 CJK COMPATIBILITY IDEOGRAPH-2F802
+2F803 CJK COMPATIBILITY IDEOGRAPH-2F803
+2F804 CJK COMPATIBILITY IDEOGRAPH-2F804
+2F805 CJK COMPATIBILITY IDEOGRAPH-2F805
+2F806 CJK COMPATIBILITY IDEOGRAPH-2F806
+2F807 CJK COMPATIBILITY IDEOGRAPH-2F807
+2F808 CJK COMPATIBILITY IDEOGRAPH-2F808
+2F809 CJK COMPATIBILITY IDEOGRAPH-2F809
+2F80A CJK COMPATIBILITY IDEOGRAPH-2F80A
+2F80B CJK COMPATIBILITY IDEOGRAPH-2F80B
+2F80C CJK COMPATIBILITY IDEOGRAPH-2F80C
+2F80D CJK COMPATIBILITY IDEOGRAPH-2F80D
+2F80E CJK COMPATIBILITY IDEOGRAPH-2F80E
+2F80F CJK COMPATIBILITY IDEOGRAPH-2F80F
+2F810 CJK COMPATIBILITY IDEOGRAPH-2F810
+2F811 CJK COMPATIBILITY IDEOGRAPH-2F811
+2F812 CJK COMPATIBILITY IDEOGRAPH-2F812
+2F813 CJK COMPATIBILITY IDEOGRAPH-2F813
+2F814 CJK COMPATIBILITY IDEOGRAPH-2F814
+2F815 CJK COMPATIBILITY IDEOGRAPH-2F815
+2F816 CJK COMPATIBILITY IDEOGRAPH-2F816
+2F817 CJK COMPATIBILITY IDEOGRAPH-2F817
+2F818 CJK COMPATIBILITY IDEOGRAPH-2F818
+2F819 CJK COMPATIBILITY IDEOGRAPH-2F819
+2F81A CJK COMPATIBILITY IDEOGRAPH-2F81A
+2F81B CJK COMPATIBILITY IDEOGRAPH-2F81B
+2F81C CJK COMPATIBILITY IDEOGRAPH-2F81C
+2F81D CJK COMPATIBILITY IDEOGRAPH-2F81D
+2F81E CJK COMPATIBILITY IDEOGRAPH-2F81E
+2F81F CJK COMPATIBILITY IDEOGRAPH-2F81F
+2F820 CJK COMPATIBILITY IDEOGRAPH-2F820
+2F821 CJK COMPATIBILITY IDEOGRAPH-2F821
+2F822 CJK COMPATIBILITY IDEOGRAPH-2F822
+2F823 CJK COMPATIBILITY IDEOGRAPH-2F823
+2F824 CJK COMPATIBILITY IDEOGRAPH-2F824
+2F825 CJK COMPATIBILITY IDEOGRAPH-2F825
+2F826 CJK COMPATIBILITY IDEOGRAPH-2F826
+2F827 CJK COMPATIBILITY IDEOGRAPH-2F827
+2F828 CJK COMPATIBILITY IDEOGRAPH-2F828
+2F829 CJK COMPATIBILITY IDEOGRAPH-2F829
+2F82A CJK COMPATIBILITY IDEOGRAPH-2F82A
+2F82B CJK COMPATIBILITY IDEOGRAPH-2F82B
+2F82C CJK COMPATIBILITY IDEOGRAPH-2F82C
+2F82D CJK COMPATIBILITY IDEOGRAPH-2F82D
+2F82E CJK COMPATIBILITY IDEOGRAPH-2F82E
+2F82F CJK COMPATIBILITY IDEOGRAPH-2F82F
+2F830 CJK COMPATIBILITY IDEOGRAPH-2F830
+2F831 CJK COMPATIBILITY IDEOGRAPH-2F831
+2F832 CJK COMPATIBILITY IDEOGRAPH-2F832
+2F833 CJK COMPATIBILITY IDEOGRAPH-2F833
+2F834 CJK COMPATIBILITY IDEOGRAPH-2F834
+2F835 CJK COMPATIBILITY IDEOGRAPH-2F835
+2F836 CJK COMPATIBILITY IDEOGRAPH-2F836
+2F837 CJK COMPATIBILITY IDEOGRAPH-2F837
+2F838 CJK COMPATIBILITY IDEOGRAPH-2F838
+2F839 CJK COMPATIBILITY IDEOGRAPH-2F839
+2F83A CJK COMPATIBILITY IDEOGRAPH-2F83A
+2F83B CJK COMPATIBILITY IDEOGRAPH-2F83B
+2F83C CJK COMPATIBILITY IDEOGRAPH-2F83C
+2F83D CJK COMPATIBILITY IDEOGRAPH-2F83D
+2F83E CJK COMPATIBILITY IDEOGRAPH-2F83E
+2F83F CJK COMPATIBILITY IDEOGRAPH-2F83F
+2F840 CJK COMPATIBILITY IDEOGRAPH-2F840
+2F841 CJK COMPATIBILITY IDEOGRAPH-2F841
+2F842 CJK COMPATIBILITY IDEOGRAPH-2F842
+2F843 CJK COMPATIBILITY IDEOGRAPH-2F843
+2F844 CJK COMPATIBILITY IDEOGRAPH-2F844
+2F845 CJK COMPATIBILITY IDEOGRAPH-2F845
+2F846 CJK COMPATIBILITY IDEOGRAPH-2F846
+2F847 CJK COMPATIBILITY IDEOGRAPH-2F847
+2F848 CJK COMPATIBILITY IDEOGRAPH-2F848
+2F849 CJK COMPATIBILITY IDEOGRAPH-2F849
+2F84A CJK COMPATIBILITY IDEOGRAPH-2F84A
+2F84B CJK COMPATIBILITY IDEOGRAPH-2F84B
+2F84C CJK COMPATIBILITY IDEOGRAPH-2F84C
+2F84D CJK COMPATIBILITY IDEOGRAPH-2F84D
+2F84E CJK COMPATIBILITY IDEOGRAPH-2F84E
+2F84F CJK COMPATIBILITY IDEOGRAPH-2F84F
+2F850 CJK COMPATIBILITY IDEOGRAPH-2F850
+2F851 CJK COMPATIBILITY IDEOGRAPH-2F851
+2F852 CJK COMPATIBILITY IDEOGRAPH-2F852
+2F853 CJK COMPATIBILITY IDEOGRAPH-2F853
+2F854 CJK COMPATIBILITY IDEOGRAPH-2F854
+2F855 CJK COMPATIBILITY IDEOGRAPH-2F855
+2F856 CJK COMPATIBILITY IDEOGRAPH-2F856
+2F857 CJK COMPATIBILITY IDEOGRAPH-2F857
+2F858 CJK COMPATIBILITY IDEOGRAPH-2F858
+2F859 CJK COMPATIBILITY IDEOGRAPH-2F859
+2F85A CJK COMPATIBILITY IDEOGRAPH-2F85A
+2F85B CJK COMPATIBILITY IDEOGRAPH-2F85B
+2F85C CJK COMPATIBILITY IDEOGRAPH-2F85C
+2F85D CJK COMPATIBILITY IDEOGRAPH-2F85D
+2F85E CJK COMPATIBILITY IDEOGRAPH-2F85E
+2F85F CJK COMPATIBILITY IDEOGRAPH-2F85F
+2F860 CJK COMPATIBILITY IDEOGRAPH-2F860
+2F861 CJK COMPATIBILITY IDEOGRAPH-2F861
+2F862 CJK COMPATIBILITY IDEOGRAPH-2F862
+2F863 CJK COMPATIBILITY IDEOGRAPH-2F863
+2F864 CJK COMPATIBILITY IDEOGRAPH-2F864
+2F865 CJK COMPATIBILITY IDEOGRAPH-2F865
+2F866 CJK COMPATIBILITY IDEOGRAPH-2F866
+2F867 CJK COMPATIBILITY IDEOGRAPH-2F867
+2F868 CJK COMPATIBILITY IDEOGRAPH-2F868
+2F869 CJK COMPATIBILITY IDEOGRAPH-2F869
+2F86A CJK COMPATIBILITY IDEOGRAPH-2F86A
+2F86B CJK COMPATIBILITY IDEOGRAPH-2F86B
+2F86C CJK COMPATIBILITY IDEOGRAPH-2F86C
+2F86D CJK COMPATIBILITY IDEOGRAPH-2F86D
+2F86E CJK COMPATIBILITY IDEOGRAPH-2F86E
+2F86F CJK COMPATIBILITY IDEOGRAPH-2F86F
+2F870 CJK COMPATIBILITY IDEOGRAPH-2F870
+2F871 CJK COMPATIBILITY IDEOGRAPH-2F871
+2F872 CJK COMPATIBILITY IDEOGRAPH-2F872
+2F873 CJK COMPATIBILITY IDEOGRAPH-2F873
+2F874 CJK COMPATIBILITY IDEOGRAPH-2F874
+2F875 CJK COMPATIBILITY IDEOGRAPH-2F875
+2F876 CJK COMPATIBILITY IDEOGRAPH-2F876
+2F877 CJK COMPATIBILITY IDEOGRAPH-2F877
+2F878 CJK COMPATIBILITY IDEOGRAPH-2F878
+2F879 CJK COMPATIBILITY IDEOGRAPH-2F879
+2F87A CJK COMPATIBILITY IDEOGRAPH-2F87A
+2F87B CJK COMPATIBILITY IDEOGRAPH-2F87B
+2F87C CJK COMPATIBILITY IDEOGRAPH-2F87C
+2F87D CJK COMPATIBILITY IDEOGRAPH-2F87D
+2F87E CJK COMPATIBILITY IDEOGRAPH-2F87E
+2F87F CJK COMPATIBILITY IDEOGRAPH-2F87F
+2F880 CJK COMPATIBILITY IDEOGRAPH-2F880
+2F881 CJK COMPATIBILITY IDEOGRAPH-2F881
+2F882 CJK COMPATIBILITY IDEOGRAPH-2F882
+2F883 CJK COMPATIBILITY IDEOGRAPH-2F883
+2F884 CJK COMPATIBILITY IDEOGRAPH-2F884
+2F885 CJK COMPATIBILITY IDEOGRAPH-2F885
+2F886 CJK COMPATIBILITY IDEOGRAPH-2F886
+2F887 CJK COMPATIBILITY IDEOGRAPH-2F887
+2F888 CJK COMPATIBILITY IDEOGRAPH-2F888
+2F889 CJK COMPATIBILITY IDEOGRAPH-2F889
+2F88A CJK COMPATIBILITY IDEOGRAPH-2F88A
+2F88B CJK COMPATIBILITY IDEOGRAPH-2F88B
+2F88C CJK COMPATIBILITY IDEOGRAPH-2F88C
+2F88D CJK COMPATIBILITY IDEOGRAPH-2F88D
+2F88E CJK COMPATIBILITY IDEOGRAPH-2F88E
+2F88F CJK COMPATIBILITY IDEOGRAPH-2F88F
+2F890 CJK COMPATIBILITY IDEOGRAPH-2F890
+2F891 CJK COMPATIBILITY IDEOGRAPH-2F891
+2F892 CJK COMPATIBILITY IDEOGRAPH-2F892
+2F893 CJK COMPATIBILITY IDEOGRAPH-2F893
+2F894 CJK COMPATIBILITY IDEOGRAPH-2F894
+2F895 CJK COMPATIBILITY IDEOGRAPH-2F895
+2F896 CJK COMPATIBILITY IDEOGRAPH-2F896
+2F897 CJK COMPATIBILITY IDEOGRAPH-2F897
+2F898 CJK COMPATIBILITY IDEOGRAPH-2F898
+2F899 CJK COMPATIBILITY IDEOGRAPH-2F899
+2F89A CJK COMPATIBILITY IDEOGRAPH-2F89A
+2F89B CJK COMPATIBILITY IDEOGRAPH-2F89B
+2F89C CJK COMPATIBILITY IDEOGRAPH-2F89C
+2F89D CJK COMPATIBILITY IDEOGRAPH-2F89D
+2F89E CJK COMPATIBILITY IDEOGRAPH-2F89E
+2F89F CJK COMPATIBILITY IDEOGRAPH-2F89F
+2F8A0 CJK COMPATIBILITY IDEOGRAPH-2F8A0
+2F8A1 CJK COMPATIBILITY IDEOGRAPH-2F8A1
+2F8A2 CJK COMPATIBILITY IDEOGRAPH-2F8A2
+2F8A3 CJK COMPATIBILITY IDEOGRAPH-2F8A3
+2F8A4 CJK COMPATIBILITY IDEOGRAPH-2F8A4
+2F8A5 CJK COMPATIBILITY IDEOGRAPH-2F8A5
+2F8A6 CJK COMPATIBILITY IDEOGRAPH-2F8A6
+2F8A7 CJK COMPATIBILITY IDEOGRAPH-2F8A7
+2F8A8 CJK COMPATIBILITY IDEOGRAPH-2F8A8
+2F8A9 CJK COMPATIBILITY IDEOGRAPH-2F8A9
+2F8AA CJK COMPATIBILITY IDEOGRAPH-2F8AA
+2F8AB CJK COMPATIBILITY IDEOGRAPH-2F8AB
+2F8AC CJK COMPATIBILITY IDEOGRAPH-2F8AC
+2F8AD CJK COMPATIBILITY IDEOGRAPH-2F8AD
+2F8AE CJK COMPATIBILITY IDEOGRAPH-2F8AE
+2F8AF CJK COMPATIBILITY IDEOGRAPH-2F8AF
+2F8B0 CJK COMPATIBILITY IDEOGRAPH-2F8B0
+2F8B1 CJK COMPATIBILITY IDEOGRAPH-2F8B1
+2F8B2 CJK COMPATIBILITY IDEOGRAPH-2F8B2
+2F8B3 CJK COMPATIBILITY IDEOGRAPH-2F8B3
+2F8B4 CJK COMPATIBILITY IDEOGRAPH-2F8B4
+2F8B5 CJK COMPATIBILITY IDEOGRAPH-2F8B5
+2F8B6 CJK COMPATIBILITY IDEOGRAPH-2F8B6
+2F8B7 CJK COMPATIBILITY IDEOGRAPH-2F8B7
+2F8B8 CJK COMPATIBILITY IDEOGRAPH-2F8B8
+2F8B9 CJK COMPATIBILITY IDEOGRAPH-2F8B9
+2F8BA CJK COMPATIBILITY IDEOGRAPH-2F8BA
+2F8BB CJK COMPATIBILITY IDEOGRAPH-2F8BB
+2F8BC CJK COMPATIBILITY IDEOGRAPH-2F8BC
+2F8BD CJK COMPATIBILITY IDEOGRAPH-2F8BD
+2F8BE CJK COMPATIBILITY IDEOGRAPH-2F8BE
+2F8BF CJK COMPATIBILITY IDEOGRAPH-2F8BF
+2F8C0 CJK COMPATIBILITY IDEOGRAPH-2F8C0
+2F8C1 CJK COMPATIBILITY IDEOGRAPH-2F8C1
+2F8C2 CJK COMPATIBILITY IDEOGRAPH-2F8C2
+2F8C3 CJK COMPATIBILITY IDEOGRAPH-2F8C3
+2F8C4 CJK COMPATIBILITY IDEOGRAPH-2F8C4
+2F8C5 CJK COMPATIBILITY IDEOGRAPH-2F8C5
+2F8C6 CJK COMPATIBILITY IDEOGRAPH-2F8C6
+2F8C7 CJK COMPATIBILITY IDEOGRAPH-2F8C7
+2F8C8 CJK COMPATIBILITY IDEOGRAPH-2F8C8
+2F8C9 CJK COMPATIBILITY IDEOGRAPH-2F8C9
+2F8CA CJK COMPATIBILITY IDEOGRAPH-2F8CA
+2F8CB CJK COMPATIBILITY IDEOGRAPH-2F8CB
+2F8CC CJK COMPATIBILITY IDEOGRAPH-2F8CC
+2F8CD CJK COMPATIBILITY IDEOGRAPH-2F8CD
+2F8CE CJK COMPATIBILITY IDEOGRAPH-2F8CE
+2F8CF CJK COMPATIBILITY IDEOGRAPH-2F8CF
+2F8D0 CJK COMPATIBILITY IDEOGRAPH-2F8D0
+2F8D1 CJK COMPATIBILITY IDEOGRAPH-2F8D1
+2F8D2 CJK COMPATIBILITY IDEOGRAPH-2F8D2
+2F8D3 CJK COMPATIBILITY IDEOGRAPH-2F8D3
+2F8D4 CJK COMPATIBILITY IDEOGRAPH-2F8D4
+2F8D5 CJK COMPATIBILITY IDEOGRAPH-2F8D5
+2F8D6 CJK COMPATIBILITY IDEOGRAPH-2F8D6
+2F8D7 CJK COMPATIBILITY IDEOGRAPH-2F8D7
+2F8D8 CJK COMPATIBILITY IDEOGRAPH-2F8D8
+2F8D9 CJK COMPATIBILITY IDEOGRAPH-2F8D9
+2F8DA CJK COMPATIBILITY IDEOGRAPH-2F8DA
+2F8DB CJK COMPATIBILITY IDEOGRAPH-2F8DB
+2F8DC CJK COMPATIBILITY IDEOGRAPH-2F8DC
+2F8DD CJK COMPATIBILITY IDEOGRAPH-2F8DD
+2F8DE CJK COMPATIBILITY IDEOGRAPH-2F8DE
+2F8DF CJK COMPATIBILITY IDEOGRAPH-2F8DF
+2F8E0 CJK COMPATIBILITY IDEOGRAPH-2F8E0
+2F8E1 CJK COMPATIBILITY IDEOGRAPH-2F8E1
+2F8E2 CJK COMPATIBILITY IDEOGRAPH-2F8E2
+2F8E3 CJK COMPATIBILITY IDEOGRAPH-2F8E3
+2F8E4 CJK COMPATIBILITY IDEOGRAPH-2F8E4
+2F8E5 CJK COMPATIBILITY IDEOGRAPH-2F8E5
+2F8E6 CJK COMPATIBILITY IDEOGRAPH-2F8E6
+2F8E7 CJK COMPATIBILITY IDEOGRAPH-2F8E7
+2F8E8 CJK COMPATIBILITY IDEOGRAPH-2F8E8
+2F8E9 CJK COMPATIBILITY IDEOGRAPH-2F8E9
+2F8EA CJK COMPATIBILITY IDEOGRAPH-2F8EA
+2F8EB CJK COMPATIBILITY IDEOGRAPH-2F8EB
+2F8EC CJK COMPATIBILITY IDEOGRAPH-2F8EC
+2F8ED CJK COMPATIBILITY IDEOGRAPH-2F8ED
+2F8EE CJK COMPATIBILITY IDEOGRAPH-2F8EE
+2F8EF CJK COMPATIBILITY IDEOGRAPH-2F8EF
+2F8F0 CJK COMPATIBILITY IDEOGRAPH-2F8F0
+2F8F1 CJK COMPATIBILITY IDEOGRAPH-2F8F1
+2F8F2 CJK COMPATIBILITY IDEOGRAPH-2F8F2
+2F8F3 CJK COMPATIBILITY IDEOGRAPH-2F8F3
+2F8F4 CJK COMPATIBILITY IDEOGRAPH-2F8F4
+2F8F5 CJK COMPATIBILITY IDEOGRAPH-2F8F5
+2F8F6 CJK COMPATIBILITY IDEOGRAPH-2F8F6
+2F8F7 CJK COMPATIBILITY IDEOGRAPH-2F8F7
+2F8F8 CJK COMPATIBILITY IDEOGRAPH-2F8F8
+2F8F9 CJK COMPATIBILITY IDEOGRAPH-2F8F9
+2F8FA CJK COMPATIBILITY IDEOGRAPH-2F8FA
+2F8FB CJK COMPATIBILITY IDEOGRAPH-2F8FB
+2F8FC CJK COMPATIBILITY IDEOGRAPH-2F8FC
+2F8FD CJK COMPATIBILITY IDEOGRAPH-2F8FD
+2F8FE CJK COMPATIBILITY IDEOGRAPH-2F8FE
+2F8FF CJK COMPATIBILITY IDEOGRAPH-2F8FF
+2F900 CJK COMPATIBILITY IDEOGRAPH-2F900
+2F901 CJK COMPATIBILITY IDEOGRAPH-2F901
+2F902 CJK COMPATIBILITY IDEOGRAPH-2F902
+2F903 CJK COMPATIBILITY IDEOGRAPH-2F903
+2F904 CJK COMPATIBILITY IDEOGRAPH-2F904
+2F905 CJK COMPATIBILITY IDEOGRAPH-2F905
+2F906 CJK COMPATIBILITY IDEOGRAPH-2F906
+2F907 CJK COMPATIBILITY IDEOGRAPH-2F907
+2F908 CJK COMPATIBILITY IDEOGRAPH-2F908
+2F909 CJK COMPATIBILITY IDEOGRAPH-2F909
+2F90A CJK COMPATIBILITY IDEOGRAPH-2F90A
+2F90B CJK COMPATIBILITY IDEOGRAPH-2F90B
+2F90C CJK COMPATIBILITY IDEOGRAPH-2F90C
+2F90D CJK COMPATIBILITY IDEOGRAPH-2F90D
+2F90E CJK COMPATIBILITY IDEOGRAPH-2F90E
+2F90F CJK COMPATIBILITY IDEOGRAPH-2F90F
+2F910 CJK COMPATIBILITY IDEOGRAPH-2F910
+2F911 CJK COMPATIBILITY IDEOGRAPH-2F911
+2F912 CJK COMPATIBILITY IDEOGRAPH-2F912
+2F913 CJK COMPATIBILITY IDEOGRAPH-2F913
+2F914 CJK COMPATIBILITY IDEOGRAPH-2F914
+2F915 CJK COMPATIBILITY IDEOGRAPH-2F915
+2F916 CJK COMPATIBILITY IDEOGRAPH-2F916
+2F917 CJK COMPATIBILITY IDEOGRAPH-2F917
+2F918 CJK COMPATIBILITY IDEOGRAPH-2F918
+2F919 CJK COMPATIBILITY IDEOGRAPH-2F919
+2F91A CJK COMPATIBILITY IDEOGRAPH-2F91A
+2F91B CJK COMPATIBILITY IDEOGRAPH-2F91B
+2F91C CJK COMPATIBILITY IDEOGRAPH-2F91C
+2F91D CJK COMPATIBILITY IDEOGRAPH-2F91D
+2F91E CJK COMPATIBILITY IDEOGRAPH-2F91E
+2F91F CJK COMPATIBILITY IDEOGRAPH-2F91F
+2F920 CJK COMPATIBILITY IDEOGRAPH-2F920
+2F921 CJK COMPATIBILITY IDEOGRAPH-2F921
+2F922 CJK COMPATIBILITY IDEOGRAPH-2F922
+2F923 CJK COMPATIBILITY IDEOGRAPH-2F923
+2F924 CJK COMPATIBILITY IDEOGRAPH-2F924
+2F925 CJK COMPATIBILITY IDEOGRAPH-2F925
+2F926 CJK COMPATIBILITY IDEOGRAPH-2F926
+2F927 CJK COMPATIBILITY IDEOGRAPH-2F927
+2F928 CJK COMPATIBILITY IDEOGRAPH-2F928
+2F929 CJK COMPATIBILITY IDEOGRAPH-2F929
+2F92A CJK COMPATIBILITY IDEOGRAPH-2F92A
+2F92B CJK COMPATIBILITY IDEOGRAPH-2F92B
+2F92C CJK COMPATIBILITY IDEOGRAPH-2F92C
+2F92D CJK COMPATIBILITY IDEOGRAPH-2F92D
+2F92E CJK COMPATIBILITY IDEOGRAPH-2F92E
+2F92F CJK COMPATIBILITY IDEOGRAPH-2F92F
+2F930 CJK COMPATIBILITY IDEOGRAPH-2F930
+2F931 CJK COMPATIBILITY IDEOGRAPH-2F931
+2F932 CJK COMPATIBILITY IDEOGRAPH-2F932
+2F933 CJK COMPATIBILITY IDEOGRAPH-2F933
+2F934 CJK COMPATIBILITY IDEOGRAPH-2F934
+2F935 CJK COMPATIBILITY IDEOGRAPH-2F935
+2F936 CJK COMPATIBILITY IDEOGRAPH-2F936
+2F937 CJK COMPATIBILITY IDEOGRAPH-2F937
+2F938 CJK COMPATIBILITY IDEOGRAPH-2F938
+2F939 CJK COMPATIBILITY IDEOGRAPH-2F939
+2F93A CJK COMPATIBILITY IDEOGRAPH-2F93A
+2F93B CJK COMPATIBILITY IDEOGRAPH-2F93B
+2F93C CJK COMPATIBILITY IDEOGRAPH-2F93C
+2F93D CJK COMPATIBILITY IDEOGRAPH-2F93D
+2F93E CJK COMPATIBILITY IDEOGRAPH-2F93E
+2F93F CJK COMPATIBILITY IDEOGRAPH-2F93F
+2F940 CJK COMPATIBILITY IDEOGRAPH-2F940
+2F941 CJK COMPATIBILITY IDEOGRAPH-2F941
+2F942 CJK COMPATIBILITY IDEOGRAPH-2F942
+2F943 CJK COMPATIBILITY IDEOGRAPH-2F943
+2F944 CJK COMPATIBILITY IDEOGRAPH-2F944
+2F945 CJK COMPATIBILITY IDEOGRAPH-2F945
+2F946 CJK COMPATIBILITY IDEOGRAPH-2F946
+2F947 CJK COMPATIBILITY IDEOGRAPH-2F947
+2F948 CJK COMPATIBILITY IDEOGRAPH-2F948
+2F949 CJK COMPATIBILITY IDEOGRAPH-2F949
+2F94A CJK COMPATIBILITY IDEOGRAPH-2F94A
+2F94B CJK COMPATIBILITY IDEOGRAPH-2F94B
+2F94C CJK COMPATIBILITY IDEOGRAPH-2F94C
+2F94D CJK COMPATIBILITY IDEOGRAPH-2F94D
+2F94E CJK COMPATIBILITY IDEOGRAPH-2F94E
+2F94F CJK COMPATIBILITY IDEOGRAPH-2F94F
+2F950 CJK COMPATIBILITY IDEOGRAPH-2F950
+2F951 CJK COMPATIBILITY IDEOGRAPH-2F951
+2F952 CJK COMPATIBILITY IDEOGRAPH-2F952
+2F953 CJK COMPATIBILITY IDEOGRAPH-2F953
+2F954 CJK COMPATIBILITY IDEOGRAPH-2F954
+2F955 CJK COMPATIBILITY IDEOGRAPH-2F955
+2F956 CJK COMPATIBILITY IDEOGRAPH-2F956
+2F957 CJK COMPATIBILITY IDEOGRAPH-2F957
+2F958 CJK COMPATIBILITY IDEOGRAPH-2F958
+2F959 CJK COMPATIBILITY IDEOGRAPH-2F959
+2F95A CJK COMPATIBILITY IDEOGRAPH-2F95A
+2F95B CJK COMPATIBILITY IDEOGRAPH-2F95B
+2F95C CJK COMPATIBILITY IDEOGRAPH-2F95C
+2F95D CJK COMPATIBILITY IDEOGRAPH-2F95D
+2F95E CJK COMPATIBILITY IDEOGRAPH-2F95E
+2F95F CJK COMPATIBILITY IDEOGRAPH-2F95F
+2F960 CJK COMPATIBILITY IDEOGRAPH-2F960
+2F961 CJK COMPATIBILITY IDEOGRAPH-2F961
+2F962 CJK COMPATIBILITY IDEOGRAPH-2F962
+2F963 CJK COMPATIBILITY IDEOGRAPH-2F963
+2F964 CJK COMPATIBILITY IDEOGRAPH-2F964
+2F965 CJK COMPATIBILITY IDEOGRAPH-2F965
+2F966 CJK COMPATIBILITY IDEOGRAPH-2F966
+2F967 CJK COMPATIBILITY IDEOGRAPH-2F967
+2F968 CJK COMPATIBILITY IDEOGRAPH-2F968
+2F969 CJK COMPATIBILITY IDEOGRAPH-2F969
+2F96A CJK COMPATIBILITY IDEOGRAPH-2F96A
+2F96B CJK COMPATIBILITY IDEOGRAPH-2F96B
+2F96C CJK COMPATIBILITY IDEOGRAPH-2F96C
+2F96D CJK COMPATIBILITY IDEOGRAPH-2F96D
+2F96E CJK COMPATIBILITY IDEOGRAPH-2F96E
+2F96F CJK COMPATIBILITY IDEOGRAPH-2F96F
+2F970 CJK COMPATIBILITY IDEOGRAPH-2F970
+2F971 CJK COMPATIBILITY IDEOGRAPH-2F971
+2F972 CJK COMPATIBILITY IDEOGRAPH-2F972
+2F973 CJK COMPATIBILITY IDEOGRAPH-2F973
+2F974 CJK COMPATIBILITY IDEOGRAPH-2F974
+2F975 CJK COMPATIBILITY IDEOGRAPH-2F975
+2F976 CJK COMPATIBILITY IDEOGRAPH-2F976
+2F977 CJK COMPATIBILITY IDEOGRAPH-2F977
+2F978 CJK COMPATIBILITY IDEOGRAPH-2F978
+2F979 CJK COMPATIBILITY IDEOGRAPH-2F979
+2F97A CJK COMPATIBILITY IDEOGRAPH-2F97A
+2F97B CJK COMPATIBILITY IDEOGRAPH-2F97B
+2F97C CJK COMPATIBILITY IDEOGRAPH-2F97C
+2F97D CJK COMPATIBILITY IDEOGRAPH-2F97D
+2F97E CJK COMPATIBILITY IDEOGRAPH-2F97E
+2F97F CJK COMPATIBILITY IDEOGRAPH-2F97F
+2F980 CJK COMPATIBILITY IDEOGRAPH-2F980
+2F981 CJK COMPATIBILITY IDEOGRAPH-2F981
+2F982 CJK COMPATIBILITY IDEOGRAPH-2F982
+2F983 CJK COMPATIBILITY IDEOGRAPH-2F983
+2F984 CJK COMPATIBILITY IDEOGRAPH-2F984
+2F985 CJK COMPATIBILITY IDEOGRAPH-2F985
+2F986 CJK COMPATIBILITY IDEOGRAPH-2F986
+2F987 CJK COMPATIBILITY IDEOGRAPH-2F987
+2F988 CJK COMPATIBILITY IDEOGRAPH-2F988
+2F989 CJK COMPATIBILITY IDEOGRAPH-2F989
+2F98A CJK COMPATIBILITY IDEOGRAPH-2F98A
+2F98B CJK COMPATIBILITY IDEOGRAPH-2F98B
+2F98C CJK COMPATIBILITY IDEOGRAPH-2F98C
+2F98D CJK COMPATIBILITY IDEOGRAPH-2F98D
+2F98E CJK COMPATIBILITY IDEOGRAPH-2F98E
+2F98F CJK COMPATIBILITY IDEOGRAPH-2F98F
+2F990 CJK COMPATIBILITY IDEOGRAPH-2F990
+2F991 CJK COMPATIBILITY IDEOGRAPH-2F991
+2F992 CJK COMPATIBILITY IDEOGRAPH-2F992
+2F993 CJK COMPATIBILITY IDEOGRAPH-2F993
+2F994 CJK COMPATIBILITY IDEOGRAPH-2F994
+2F995 CJK COMPATIBILITY IDEOGRAPH-2F995
+2F996 CJK COMPATIBILITY IDEOGRAPH-2F996
+2F997 CJK COMPATIBILITY IDEOGRAPH-2F997
+2F998 CJK COMPATIBILITY IDEOGRAPH-2F998
+2F999 CJK COMPATIBILITY IDEOGRAPH-2F999
+2F99A CJK COMPATIBILITY IDEOGRAPH-2F99A
+2F99B CJK COMPATIBILITY IDEOGRAPH-2F99B
+2F99C CJK COMPATIBILITY IDEOGRAPH-2F99C
+2F99D CJK COMPATIBILITY IDEOGRAPH-2F99D
+2F99E CJK COMPATIBILITY IDEOGRAPH-2F99E
+2F99F CJK COMPATIBILITY IDEOGRAPH-2F99F
+2F9A0 CJK COMPATIBILITY IDEOGRAPH-2F9A0
+2F9A1 CJK COMPATIBILITY IDEOGRAPH-2F9A1
+2F9A2 CJK COMPATIBILITY IDEOGRAPH-2F9A2
+2F9A3 CJK COMPATIBILITY IDEOGRAPH-2F9A3
+2F9A4 CJK COMPATIBILITY IDEOGRAPH-2F9A4
+2F9A5 CJK COMPATIBILITY IDEOGRAPH-2F9A5
+2F9A6 CJK COMPATIBILITY IDEOGRAPH-2F9A6
+2F9A7 CJK COMPATIBILITY IDEOGRAPH-2F9A7
+2F9A8 CJK COMPATIBILITY IDEOGRAPH-2F9A8
+2F9A9 CJK COMPATIBILITY IDEOGRAPH-2F9A9
+2F9AA CJK COMPATIBILITY IDEOGRAPH-2F9AA
+2F9AB CJK COMPATIBILITY IDEOGRAPH-2F9AB
+2F9AC CJK COMPATIBILITY IDEOGRAPH-2F9AC
+2F9AD CJK COMPATIBILITY IDEOGRAPH-2F9AD
+2F9AE CJK COMPATIBILITY IDEOGRAPH-2F9AE
+2F9AF CJK COMPATIBILITY IDEOGRAPH-2F9AF
+2F9B0 CJK COMPATIBILITY IDEOGRAPH-2F9B0
+2F9B1 CJK COMPATIBILITY IDEOGRAPH-2F9B1
+2F9B2 CJK COMPATIBILITY IDEOGRAPH-2F9B2
+2F9B3 CJK COMPATIBILITY IDEOGRAPH-2F9B3
+2F9B4 CJK COMPATIBILITY IDEOGRAPH-2F9B4
+2F9B5 CJK COMPATIBILITY IDEOGRAPH-2F9B5
+2F9B6 CJK COMPATIBILITY IDEOGRAPH-2F9B6
+2F9B7 CJK COMPATIBILITY IDEOGRAPH-2F9B7
+2F9B8 CJK COMPATIBILITY IDEOGRAPH-2F9B8
+2F9B9 CJK COMPATIBILITY IDEOGRAPH-2F9B9
+2F9BA CJK COMPATIBILITY IDEOGRAPH-2F9BA
+2F9BB CJK COMPATIBILITY IDEOGRAPH-2F9BB
+2F9BC CJK COMPATIBILITY IDEOGRAPH-2F9BC
+2F9BD CJK COMPATIBILITY IDEOGRAPH-2F9BD
+2F9BE CJK COMPATIBILITY IDEOGRAPH-2F9BE
+2F9BF CJK COMPATIBILITY IDEOGRAPH-2F9BF
+2F9C0 CJK COMPATIBILITY IDEOGRAPH-2F9C0
+2F9C1 CJK COMPATIBILITY IDEOGRAPH-2F9C1
+2F9C2 CJK COMPATIBILITY IDEOGRAPH-2F9C2
+2F9C3 CJK COMPATIBILITY IDEOGRAPH-2F9C3
+2F9C4 CJK COMPATIBILITY IDEOGRAPH-2F9C4
+2F9C5 CJK COMPATIBILITY IDEOGRAPH-2F9C5
+2F9C6 CJK COMPATIBILITY IDEOGRAPH-2F9C6
+2F9C7 CJK COMPATIBILITY IDEOGRAPH-2F9C7
+2F9C8 CJK COMPATIBILITY IDEOGRAPH-2F9C8
+2F9C9 CJK COMPATIBILITY IDEOGRAPH-2F9C9
+2F9CA CJK COMPATIBILITY IDEOGRAPH-2F9CA
+2F9CB CJK COMPATIBILITY IDEOGRAPH-2F9CB
+2F9CC CJK COMPATIBILITY IDEOGRAPH-2F9CC
+2F9CD CJK COMPATIBILITY IDEOGRAPH-2F9CD
+2F9CE CJK COMPATIBILITY IDEOGRAPH-2F9CE
+2F9CF CJK COMPATIBILITY IDEOGRAPH-2F9CF
+2F9D0 CJK COMPATIBILITY IDEOGRAPH-2F9D0
+2F9D1 CJK COMPATIBILITY IDEOGRAPH-2F9D1
+2F9D2 CJK COMPATIBILITY IDEOGRAPH-2F9D2
+2F9D3 CJK COMPATIBILITY IDEOGRAPH-2F9D3
+2F9D4 CJK COMPATIBILITY IDEOGRAPH-2F9D4
+2F9D5 CJK COMPATIBILITY IDEOGRAPH-2F9D5
+2F9D6 CJK COMPATIBILITY IDEOGRAPH-2F9D6
+2F9D7 CJK COMPATIBILITY IDEOGRAPH-2F9D7
+2F9D8 CJK COMPATIBILITY IDEOGRAPH-2F9D8
+2F9D9 CJK COMPATIBILITY IDEOGRAPH-2F9D9
+2F9DA CJK COMPATIBILITY IDEOGRAPH-2F9DA
+2F9DB CJK COMPATIBILITY IDEOGRAPH-2F9DB
+2F9DC CJK COMPATIBILITY IDEOGRAPH-2F9DC
+2F9DD CJK COMPATIBILITY IDEOGRAPH-2F9DD
+2F9DE CJK COMPATIBILITY IDEOGRAPH-2F9DE
+2F9DF CJK COMPATIBILITY IDEOGRAPH-2F9DF
+2F9E0 CJK COMPATIBILITY IDEOGRAPH-2F9E0
+2F9E1 CJK COMPATIBILITY IDEOGRAPH-2F9E1
+2F9E2 CJK COMPATIBILITY IDEOGRAPH-2F9E2
+2F9E3 CJK COMPATIBILITY IDEOGRAPH-2F9E3
+2F9E4 CJK COMPATIBILITY IDEOGRAPH-2F9E4
+2F9E5 CJK COMPATIBILITY IDEOGRAPH-2F9E5
+2F9E6 CJK COMPATIBILITY IDEOGRAPH-2F9E6
+2F9E7 CJK COMPATIBILITY IDEOGRAPH-2F9E7
+2F9E8 CJK COMPATIBILITY IDEOGRAPH-2F9E8
+2F9E9 CJK COMPATIBILITY IDEOGRAPH-2F9E9
+2F9EA CJK COMPATIBILITY IDEOGRAPH-2F9EA
+2F9EB CJK COMPATIBILITY IDEOGRAPH-2F9EB
+2F9EC CJK COMPATIBILITY IDEOGRAPH-2F9EC
+2F9ED CJK COMPATIBILITY IDEOGRAPH-2F9ED
+2F9EE CJK COMPATIBILITY IDEOGRAPH-2F9EE
+2F9EF CJK COMPATIBILITY IDEOGRAPH-2F9EF
+2F9F0 CJK COMPATIBILITY IDEOGRAPH-2F9F0
+2F9F1 CJK COMPATIBILITY IDEOGRAPH-2F9F1
+2F9F2 CJK COMPATIBILITY IDEOGRAPH-2F9F2
+2F9F3 CJK COMPATIBILITY IDEOGRAPH-2F9F3
+2F9F4 CJK COMPATIBILITY IDEOGRAPH-2F9F4
+2F9F5 CJK COMPATIBILITY IDEOGRAPH-2F9F5
+2F9F6 CJK COMPATIBILITY IDEOGRAPH-2F9F6
+2F9F7 CJK COMPATIBILITY IDEOGRAPH-2F9F7
+2F9F8 CJK COMPATIBILITY IDEOGRAPH-2F9F8
+2F9F9 CJK COMPATIBILITY IDEOGRAPH-2F9F9
+2F9FA CJK COMPATIBILITY IDEOGRAPH-2F9FA
+2F9FB CJK COMPATIBILITY IDEOGRAPH-2F9FB
+2F9FC CJK COMPATIBILITY IDEOGRAPH-2F9FC
+2F9FD CJK COMPATIBILITY IDEOGRAPH-2F9FD
+2F9FE CJK COMPATIBILITY IDEOGRAPH-2F9FE
+2F9FF CJK COMPATIBILITY IDEOGRAPH-2F9FF
+2FA00 CJK COMPATIBILITY IDEOGRAPH-2FA00
+2FA01 CJK COMPATIBILITY IDEOGRAPH-2FA01
+2FA02 CJK COMPATIBILITY IDEOGRAPH-2FA02
+2FA03 CJK COMPATIBILITY IDEOGRAPH-2FA03
+2FA04 CJK COMPATIBILITY IDEOGRAPH-2FA04
+2FA05 CJK COMPATIBILITY IDEOGRAPH-2FA05
+2FA06 CJK COMPATIBILITY IDEOGRAPH-2FA06
+2FA07 CJK COMPATIBILITY IDEOGRAPH-2FA07
+2FA08 CJK COMPATIBILITY IDEOGRAPH-2FA08
+2FA09 CJK COMPATIBILITY IDEOGRAPH-2FA09
+2FA0A CJK COMPATIBILITY IDEOGRAPH-2FA0A
+2FA0B CJK COMPATIBILITY IDEOGRAPH-2FA0B
+2FA0C CJK COMPATIBILITY IDEOGRAPH-2FA0C
+2FA0D CJK COMPATIBILITY IDEOGRAPH-2FA0D
+2FA0E CJK COMPATIBILITY IDEOGRAPH-2FA0E
+2FA0F CJK COMPATIBILITY IDEOGRAPH-2FA0F
+2FA10 CJK COMPATIBILITY IDEOGRAPH-2FA10
+2FA11 CJK COMPATIBILITY IDEOGRAPH-2FA11
+2FA12 CJK COMPATIBILITY IDEOGRAPH-2FA12
+2FA13 CJK COMPATIBILITY IDEOGRAPH-2FA13
+2FA14 CJK COMPATIBILITY IDEOGRAPH-2FA14
+2FA15 CJK COMPATIBILITY IDEOGRAPH-2FA15
+2FA16 CJK COMPATIBILITY IDEOGRAPH-2FA16
+2FA17 CJK COMPATIBILITY IDEOGRAPH-2FA17
+2FA18 CJK COMPATIBILITY IDEOGRAPH-2FA18
+2FA19 CJK COMPATIBILITY IDEOGRAPH-2FA19
+2FA1A CJK COMPATIBILITY IDEOGRAPH-2FA1A
+2FA1B CJK COMPATIBILITY IDEOGRAPH-2FA1B
+2FA1C CJK COMPATIBILITY IDEOGRAPH-2FA1C
+2FA1D CJK COMPATIBILITY IDEOGRAPH-2FA1D
+E0001 LANGUAGE TAG
+E0020 TAG SPACE
+E0021 TAG EXCLAMATION MARK
+E0022 TAG QUOTATION MARK
+E0023 TAG NUMBER SIGN
+E0024 TAG DOLLAR SIGN
+E0025 TAG PERCENT SIGN
+E0026 TAG AMPERSAND
+E0027 TAG APOSTROPHE
+E0028 TAG LEFT PARENTHESIS
+E0029 TAG RIGHT PARENTHESIS
+E002A TAG ASTERISK
+E002B TAG PLUS SIGN
+E002C TAG COMMA
+E002D TAG HYPHEN-MINUS
+E002E TAG FULL STOP
+E002F TAG SOLIDUS
+E0030 TAG DIGIT ZERO
+E0031 TAG DIGIT ONE
+E0032 TAG DIGIT TWO
+E0033 TAG DIGIT THREE
+E0034 TAG DIGIT FOUR
+E0035 TAG DIGIT FIVE
+E0036 TAG DIGIT SIX
+E0037 TAG DIGIT SEVEN
+E0038 TAG DIGIT EIGHT
+E0039 TAG DIGIT NINE
+E003A TAG COLON
+E003B TAG SEMICOLON
+E003C TAG LESS-THAN SIGN
+E003D TAG EQUALS SIGN
+E003E TAG GREATER-THAN SIGN
+E003F TAG QUESTION MARK
+E0040 TAG COMMERCIAL AT
+E0041 TAG LATIN CAPITAL LETTER A
+E0042 TAG LATIN CAPITAL LETTER B
+E0043 TAG LATIN CAPITAL LETTER C
+E0044 TAG LATIN CAPITAL LETTER D
+E0045 TAG LATIN CAPITAL LETTER E
+E0046 TAG LATIN CAPITAL LETTER F
+E0047 TAG LATIN CAPITAL LETTER G
+E0048 TAG LATIN CAPITAL LETTER H
+E0049 TAG LATIN CAPITAL LETTER I
+E004A TAG LATIN CAPITAL LETTER J
+E004B TAG LATIN CAPITAL LETTER K
+E004C TAG LATIN CAPITAL LETTER L
+E004D TAG LATIN CAPITAL LETTER M
+E004E TAG LATIN CAPITAL LETTER N
+E004F TAG LATIN CAPITAL LETTER O
+E0050 TAG LATIN CAPITAL LETTER P
+E0051 TAG LATIN CAPITAL LETTER Q
+E0052 TAG LATIN CAPITAL LETTER R
+E0053 TAG LATIN CAPITAL LETTER S
+E0054 TAG LATIN CAPITAL LETTER T
+E0055 TAG LATIN CAPITAL LETTER U
+E0056 TAG LATIN CAPITAL LETTER V
+E0057 TAG LATIN CAPITAL LETTER W
+E0058 TAG LATIN CAPITAL LETTER X
+E0059 TAG LATIN CAPITAL LETTER Y
+E005A TAG LATIN CAPITAL LETTER Z
+E005B TAG LEFT SQUARE BRACKET
+E005C TAG REVERSE SOLIDUS
+E005D TAG RIGHT SQUARE BRACKET
+E005E TAG CIRCUMFLEX ACCENT
+E005F TAG LOW LINE
+E0060 TAG GRAVE ACCENT
+E0061 TAG LATIN SMALL LETTER A
+E0062 TAG LATIN SMALL LETTER B
+E0063 TAG LATIN SMALL LETTER C
+E0064 TAG LATIN SMALL LETTER D
+E0065 TAG LATIN SMALL LETTER E
+E0066 TAG LATIN SMALL LETTER F
+E0067 TAG LATIN SMALL LETTER G
+E0068 TAG LATIN SMALL LETTER H
+E0069 TAG LATIN SMALL LETTER I
+E006A TAG LATIN SMALL LETTER J
+E006B TAG LATIN SMALL LETTER K
+E006C TAG LATIN SMALL LETTER L
+E006D TAG LATIN SMALL LETTER M
+E006E TAG LATIN SMALL LETTER N
+E006F TAG LATIN SMALL LETTER O
+E0070 TAG LATIN SMALL LETTER P
+E0071 TAG LATIN SMALL LETTER Q
+E0072 TAG LATIN SMALL LETTER R
+E0073 TAG LATIN SMALL LETTER S
+E0074 TAG LATIN SMALL LETTER T
+E0075 TAG LATIN SMALL LETTER U
+E0076 TAG LATIN SMALL LETTER V
+E0077 TAG LATIN SMALL LETTER W
+E0078 TAG LATIN SMALL LETTER X
+E0079 TAG LATIN SMALL LETTER Y
+E007A TAG LATIN SMALL LETTER Z
+E007B TAG LEFT CURLY BRACKET
+E007C TAG VERTICAL LINE
+E007D TAG RIGHT CURLY BRACKET
+E007E TAG TILDE
+E007F CANCEL TAG
+E0100 VARIATION SELECTOR-17
+E0101 VARIATION SELECTOR-18
+E0102 VARIATION SELECTOR-19
+E0103 VARIATION SELECTOR-20
+E0104 VARIATION SELECTOR-21
+E0105 VARIATION SELECTOR-22
+E0106 VARIATION SELECTOR-23
+E0107 VARIATION SELECTOR-24
+E0108 VARIATION SELECTOR-25
+E0109 VARIATION SELECTOR-26
+E010A VARIATION SELECTOR-27
+E010B VARIATION SELECTOR-28
+E010C VARIATION SELECTOR-29
+E010D VARIATION SELECTOR-30
+E010E VARIATION SELECTOR-31
+E010F VARIATION SELECTOR-32
+E0110 VARIATION SELECTOR-33
+E0111 VARIATION SELECTOR-34
+E0112 VARIATION SELECTOR-35
+E0113 VARIATION SELECTOR-36
+E0114 VARIATION SELECTOR-37
+E0115 VARIATION SELECTOR-38
+E0116 VARIATION SELECTOR-39
+E0117 VARIATION SELECTOR-40
+E0118 VARIATION SELECTOR-41
+E0119 VARIATION SELECTOR-42
+E011A VARIATION SELECTOR-43
+E011B VARIATION SELECTOR-44
+E011C VARIATION SELECTOR-45
+E011D VARIATION SELECTOR-46
+E011E VARIATION SELECTOR-47
+E011F VARIATION SELECTOR-48
+E0120 VARIATION SELECTOR-49
+E0121 VARIATION SELECTOR-50
+E0122 VARIATION SELECTOR-51
+E0123 VARIATION SELECTOR-52
+E0124 VARIATION SELECTOR-53
+E0125 VARIATION SELECTOR-54
+E0126 VARIATION SELECTOR-55
+E0127 VARIATION SELECTOR-56
+E0128 VARIATION SELECTOR-57
+E0129 VARIATION SELECTOR-58
+E012A VARIATION SELECTOR-59
+E012B VARIATION SELECTOR-60
+E012C VARIATION SELECTOR-61
+E012D VARIATION SELECTOR-62
+E012E VARIATION SELECTOR-63
+E012F VARIATION SELECTOR-64
+E0130 VARIATION SELECTOR-65
+E0131 VARIATION SELECTOR-66
+E0132 VARIATION SELECTOR-67
+E0133 VARIATION SELECTOR-68
+E0134 VARIATION SELECTOR-69
+E0135 VARIATION SELECTOR-70
+E0136 VARIATION SELECTOR-71
+E0137 VARIATION SELECTOR-72
+E0138 VARIATION SELECTOR-73
+E0139 VARIATION SELECTOR-74
+E013A VARIATION SELECTOR-75
+E013B VARIATION SELECTOR-76
+E013C VARIATION SELECTOR-77
+E013D VARIATION SELECTOR-78
+E013E VARIATION SELECTOR-79
+E013F VARIATION SELECTOR-80
+E0140 VARIATION SELECTOR-81
+E0141 VARIATION SELECTOR-82
+E0142 VARIATION SELECTOR-83
+E0143 VARIATION SELECTOR-84
+E0144 VARIATION SELECTOR-85
+E0145 VARIATION SELECTOR-86
+E0146 VARIATION SELECTOR-87
+E0147 VARIATION SELECTOR-88
+E0148 VARIATION SELECTOR-89
+E0149 VARIATION SELECTOR-90
+E014A VARIATION SELECTOR-91
+E014B VARIATION SELECTOR-92
+E014C VARIATION SELECTOR-93
+E014D VARIATION SELECTOR-94
+E014E VARIATION SELECTOR-95
+E014F VARIATION SELECTOR-96
+E0150 VARIATION SELECTOR-97
+E0151 VARIATION SELECTOR-98
+E0152 VARIATION SELECTOR-99
+E0153 VARIATION SELECTOR-100
+E0154 VARIATION SELECTOR-101
+E0155 VARIATION SELECTOR-102
+E0156 VARIATION SELECTOR-103
+E0157 VARIATION SELECTOR-104
+E0158 VARIATION SELECTOR-105
+E0159 VARIATION SELECTOR-106
+E015A VARIATION SELECTOR-107
+E015B VARIATION SELECTOR-108
+E015C VARIATION SELECTOR-109
+E015D VARIATION SELECTOR-110
+E015E VARIATION SELECTOR-111
+E015F VARIATION SELECTOR-112
+E0160 VARIATION SELECTOR-113
+E0161 VARIATION SELECTOR-114
+E0162 VARIATION SELECTOR-115
+E0163 VARIATION SELECTOR-116
+E0164 VARIATION SELECTOR-117
+E0165 VARIATION SELECTOR-118
+E0166 VARIATION SELECTOR-119
+E0167 VARIATION SELECTOR-120
+E0168 VARIATION SELECTOR-121
+E0169 VARIATION SELECTOR-122
+E016A VARIATION SELECTOR-123
+E016B VARIATION SELECTOR-124
+E016C VARIATION SELECTOR-125
+E016D VARIATION SELECTOR-126
+E016E VARIATION SELECTOR-127
+E016F VARIATION SELECTOR-128
+E0170 VARIATION SELECTOR-129
+E0171 VARIATION SELECTOR-130
+E0172 VARIATION SELECTOR-131
+E0173 VARIATION SELECTOR-132
+E0174 VARIATION SELECTOR-133
+E0175 VARIATION SELECTOR-134
+E0176 VARIATION SELECTOR-135
+E0177 VARIATION SELECTOR-136
+E0178 VARIATION SELECTOR-137
+E0179 VARIATION SELECTOR-138
+E017A VARIATION SELECTOR-139
+E017B VARIATION SELECTOR-140
+E017C VARIATION SELECTOR-141
+E017D VARIATION SELECTOR-142
+E017E VARIATION SELECTOR-143
+E017F VARIATION SELECTOR-144
+E0180 VARIATION SELECTOR-145
+E0181 VARIATION SELECTOR-146
+E0182 VARIATION SELECTOR-147
+E0183 VARIATION SELECTOR-148
+E0184 VARIATION SELECTOR-149
+E0185 VARIATION SELECTOR-150
+E0186 VARIATION SELECTOR-151
+E0187 VARIATION SELECTOR-152
+E0188 VARIATION SELECTOR-153
+E0189 VARIATION SELECTOR-154
+E018A VARIATION SELECTOR-155
+E018B VARIATION SELECTOR-156
+E018C VARIATION SELECTOR-157
+E018D VARIATION SELECTOR-158
+E018E VARIATION SELECTOR-159
+E018F VARIATION SELECTOR-160
+E0190 VARIATION SELECTOR-161
+E0191 VARIATION SELECTOR-162
+E0192 VARIATION SELECTOR-163
+E0193 VARIATION SELECTOR-164
+E0194 VARIATION SELECTOR-165
+E0195 VARIATION SELECTOR-166
+E0196 VARIATION SELECTOR-167
+E0197 VARIATION SELECTOR-168
+E0198 VARIATION SELECTOR-169
+E0199 VARIATION SELECTOR-170
+E019A VARIATION SELECTOR-171
+E019B VARIATION SELECTOR-172
+E019C VARIATION SELECTOR-173
+E019D VARIATION SELECTOR-174
+E019E VARIATION SELECTOR-175
+E019F VARIATION SELECTOR-176
+E01A0 VARIATION SELECTOR-177
+E01A1 VARIATION SELECTOR-178
+E01A2 VARIATION SELECTOR-179
+E01A3 VARIATION SELECTOR-180
+E01A4 VARIATION SELECTOR-181
+E01A5 VARIATION SELECTOR-182
+E01A6 VARIATION SELECTOR-183
+E01A7 VARIATION SELECTOR-184
+E01A8 VARIATION SELECTOR-185
+E01A9 VARIATION SELECTOR-186
+E01AA VARIATION SELECTOR-187
+E01AB VARIATION SELECTOR-188
+E01AC VARIATION SELECTOR-189
+E01AD VARIATION SELECTOR-190
+E01AE VARIATION SELECTOR-191
+E01AF VARIATION SELECTOR-192
+E01B0 VARIATION SELECTOR-193
+E01B1 VARIATION SELECTOR-194
+E01B2 VARIATION SELECTOR-195
+E01B3 VARIATION SELECTOR-196
+E01B4 VARIATION SELECTOR-197
+E01B5 VARIATION SELECTOR-198
+E01B6 VARIATION SELECTOR-199
+E01B7 VARIATION SELECTOR-200
+E01B8 VARIATION SELECTOR-201
+E01B9 VARIATION SELECTOR-202
+E01BA VARIATION SELECTOR-203
+E01BB VARIATION SELECTOR-204
+E01BC VARIATION SELECTOR-205
+E01BD VARIATION SELECTOR-206
+E01BE VARIATION SELECTOR-207
+E01BF VARIATION SELECTOR-208
+E01C0 VARIATION SELECTOR-209
+E01C1 VARIATION SELECTOR-210
+E01C2 VARIATION SELECTOR-211
+E01C3 VARIATION SELECTOR-212
+E01C4 VARIATION SELECTOR-213
+E01C5 VARIATION SELECTOR-214
+E01C6 VARIATION SELECTOR-215
+E01C7 VARIATION SELECTOR-216
+E01C8 VARIATION SELECTOR-217
+E01C9 VARIATION SELECTOR-218
+E01CA VARIATION SELECTOR-219
+E01CB VARIATION SELECTOR-220
+E01CC VARIATION SELECTOR-221
+E01CD VARIATION SELECTOR-222
+E01CE VARIATION SELECTOR-223
+E01CF VARIATION SELECTOR-224
+E01D0 VARIATION SELECTOR-225
+E01D1 VARIATION SELECTOR-226
+E01D2 VARIATION SELECTOR-227
+E01D3 VARIATION SELECTOR-228
+E01D4 VARIATION SELECTOR-229
+E01D5 VARIATION SELECTOR-230
+E01D6 VARIATION SELECTOR-231
+E01D7 VARIATION SELECTOR-232
+E01D8 VARIATION SELECTOR-233
+E01D9 VARIATION SELECTOR-234
+E01DA VARIATION SELECTOR-235
+E01DB VARIATION SELECTOR-236
+E01DC VARIATION SELECTOR-237
+E01DD VARIATION SELECTOR-238
+E01DE VARIATION SELECTOR-239
+E01DF VARIATION SELECTOR-240
+E01E0 VARIATION SELECTOR-241
+E01E1 VARIATION SELECTOR-242
+E01E2 VARIATION SELECTOR-243
+E01E3 VARIATION SELECTOR-244
+E01E4 VARIATION SELECTOR-245
+E01E5 VARIATION SELECTOR-246
+E01E6 VARIATION SELECTOR-247
+E01E7 VARIATION SELECTOR-248
+E01E8 VARIATION SELECTOR-249
+E01E9 VARIATION SELECTOR-250
+E01EA VARIATION SELECTOR-251
+E01EB VARIATION SELECTOR-252
+E01EC VARIATION SELECTOR-253
+E01ED VARIATION SELECTOR-254
+E01EE VARIATION SELECTOR-255
+E01EF VARIATION SELECTOR-256
+F0000 FFFFD Plane 15 Private Use
+100000 10FFFD Plane 16 Private Use
+01A2 LATIN CAPITAL LETTER GHA
+01A3 LATIN SMALL LETTER GHA
+0CDE KANNADA LETTER LLLA
+0E9D LAO LETTER FO FON
+0E9F LAO LETTER FO FAY
+0EA3 LAO LETTER RO
+0EA5 LAO LETTER LO
+0FD0 TIBETAN MARK BKA- SHOG GI MGO RGYAN
+A015 YI SYLLABLE ITERATION MARK
+FE18 PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET
+1D0C5 BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/NameAliases.txt b/Master/tlpkg/tlperl.straw/lib/unicore/NameAliases.txt
new file mode 100755
index 00000000000..2588b795cd3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/NameAliases.txt
@@ -0,0 +1,40 @@
+# NameAliases-5.1.0.txt
+# Date: 2008-02-11, 11:36:00 PST [KW]
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 2005-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# This file defines the formal name aliases for Unicode characters.
+#
+# For informative aliases see NamesList.txt
+#
+# For documentation, see UCD.html and NamesList.html
+#
+# FORMAT
+#
+# Each line has two fields
+# First field: Code point
+# Second field: Alias
+#
+# In case multiple aliases are assigned, additional aliases
+# would be provided on separate lines
+#
+#-----------------------------------------------------------------
+01A2;LATIN CAPITAL LETTER GHA
+01A3;LATIN SMALL LETTER GHA
+0CDE;KANNADA LETTER LLLA
+0E9D;LAO LETTER FO FON
+0E9F;LAO LETTER FO FAY
+0EA3;LAO LETTER RO
+0EA5;LAO LETTER LO
+0FD0;TIBETAN MARK BKA- SHOG GI MGO RGYAN
+A015;YI SYLLABLE ITERATION MARK
+FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET
+1D0C5;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS
+
+# Total code points: 11
+
+# EOF
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/NamedSequences.txt b/Master/tlpkg/tlperl.straw/lib/unicore/NamedSequences.txt
new file mode 100755
index 00000000000..4401f2ebd4c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/NamedSequences.txt
@@ -0,0 +1,126 @@
+# NamedSequences-5.1.0.txt
+# Date: 2008-03-20, 17:43:00 PDT [KW]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# Format:
+# Name of Sequence; Code Point Sequence for USI
+#
+# Note: The order of entries in this file is not significant.
+# However, entries are generally in script order corresponding
+# to block order in the Unicode Standard, to make it easier
+# to find entries in the list.
+
+# ================================================
+
+LATIN CAPITAL LETTER A WITH MACRON AND GRAVE;0100 0300
+LATIN SMALL LETTER A WITH MACRON AND GRAVE;0101 0300
+LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW;0045 0329
+LATIN SMALL LETTER E WITH VERTICAL LINE BELOW;0065 0329
+LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND GRAVE;00C8 0329
+LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND GRAVE;00E8 0329
+LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND ACUTE;00C9 0329
+LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND ACUTE;00E9 0329
+LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON;00CA 0304
+LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON;00EA 0304
+LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON;00CA 030C
+LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON;00EA 030C
+LATIN CAPITAL LETTER I WITH MACRON AND GRAVE;012A 0300
+LATIN SMALL LETTER I WITH MACRON AND GRAVE;012B 0300
+LATIN SMALL LETTER I WITH DOT ABOVE AND ACUTE;0069 0307 0301
+LATIN SMALL LETTER NG WITH TILDE ABOVE;006E 0360 0067
+LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW;004F 0329
+LATIN SMALL LETTER O WITH VERTICAL LINE BELOW;006F 0329
+LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND GRAVE;00D2 0329
+LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND GRAVE;00F2 0329
+LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND ACUTE;00D3 0329
+LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND ACUTE;00F3 0329
+LATIN CAPITAL LETTER S WITH VERTICAL LINE BELOW;0053 0329
+LATIN SMALL LETTER S WITH VERTICAL LINE BELOW;0073 0329
+LATIN CAPITAL LETTER U WITH MACRON AND GRAVE;016A 0300
+LATIN SMALL LETTER U WITH MACRON AND GRAVE;016B 0300
+
+# Additions for Lithuanian. Provisional 2006-05-18, Approved 2007-10-19
+
+LATIN CAPITAL LETTER A WITH OGONEK AND ACUTE;0104 0301
+LATIN SMALL LETTER A WITH OGONEK AND ACUTE;0105 0301
+LATIN CAPITAL LETTER A WITH OGONEK AND TILDE;0104 0303
+LATIN SMALL LETTER A WITH OGONEK AND TILDE;0105 0303
+LATIN CAPITAL LETTER E WITH OGONEK AND ACUTE;0118 0301
+LATIN SMALL LETTER E WITH OGONEK AND ACUTE;0119 0301
+LATIN CAPITAL LETTER E WITH OGONEK AND TILDE;0118 0303
+LATIN SMALL LETTER E WITH OGONEK AND TILDE;0119 0303
+LATIN CAPITAL LETTER E WITH DOT ABOVE AND ACUTE;0116 0301
+LATIN SMALL LETTER E WITH DOT ABOVE AND ACUTE;0117 0301
+LATIN CAPITAL LETTER E WITH DOT ABOVE AND TILDE;0116 0303
+LATIN SMALL LETTER E WITH DOT ABOVE AND TILDE;0117 0303
+LATIN SMALL LETTER I WITH DOT ABOVE AND GRAVE;0069 0307 0300
+LATIN SMALL LETTER I WITH DOT ABOVE AND TILDE;0069 0307 0303
+LATIN CAPITAL LETTER I WITH OGONEK AND ACUTE;012E 0301
+LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND ACUTE;012F 0307 0301
+LATIN CAPITAL LETTER I WITH OGONEK AND TILDE;012E 0303
+LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND TILDE;012F 0307 0303
+LATIN CAPITAL LETTER J WITH TILDE;004A 0303
+LATIN SMALL LETTER J WITH DOT ABOVE AND TILDE;006A 0307 0303
+LATIN CAPITAL LETTER L WITH TILDE;004C 0303
+LATIN SMALL LETTER L WITH TILDE;006C 0303
+LATIN CAPITAL LETTER M WITH TILDE;004D 0303
+LATIN SMALL LETTER M WITH TILDE;006D 0303
+LATIN CAPITAL LETTER R WITH TILDE;0052 0303
+LATIN SMALL LETTER R WITH TILDE;0072 0303
+LATIN CAPITAL LETTER U WITH OGONEK AND ACUTE;0172 0301
+LATIN SMALL LETTER U WITH OGONEK AND ACUTE;0173 0301
+LATIN CAPITAL LETTER U WITH OGONEK AND TILDE;0172 0303
+LATIN SMALL LETTER U WITH OGONEK AND TILDE;0173 0303
+LATIN CAPITAL LETTER U WITH MACRON AND ACUTE;016A 0301
+LATIN SMALL LETTER U WITH MACRON AND ACUTE;016B 0301
+LATIN CAPITAL LETTER U WITH MACRON AND TILDE;016A 0303
+LATIN SMALL LETTER U WITH MACRON AND TILDE;016B 0303
+
+GEORGIAN LETTER U-BRJGU;10E3 0302
+KHMER CONSONANT SIGN COENG KA;17D2 1780
+KHMER CONSONANT SIGN COENG KHA;17D2 1781
+KHMER CONSONANT SIGN COENG KO;17D2 1782
+KHMER CONSONANT SIGN COENG KHO;17D2 1783
+KHMER CONSONANT SIGN COENG NGO;17D2 1784
+KHMER CONSONANT SIGN COENG CA;17D2 1785
+KHMER CONSONANT SIGN COENG CHA;17D2 1786
+KHMER CONSONANT SIGN COENG CO;17D2 1787
+KHMER CONSONANT SIGN COENG CHO;17D2 1788
+KHMER CONSONANT SIGN COENG NYO;17D2 1789
+KHMER CONSONANT SIGN COENG DA;17D2 178A
+KHMER CONSONANT SIGN COENG TTHA;17D2 178B
+KHMER CONSONANT SIGN COENG DO;17D2 178C
+KHMER CONSONANT SIGN COENG TTHO;17D2 178D
+KHMER CONSONANT SIGN COENG NA;17D2 178E
+KHMER CONSONANT SIGN COENG TA;17D2 178F
+KHMER CONSONANT SIGN COENG THA;17D2 1790
+KHMER CONSONANT SIGN COENG TO;17D2 1791
+KHMER CONSONANT SIGN COENG THO;17D2 1792
+KHMER CONSONANT SIGN COENG NO;17D2 1793
+KHMER CONSONANT SIGN COENG BA;17D2 1794
+KHMER CONSONANT SIGN COENG PHA;17D2 1795
+KHMER CONSONANT SIGN COENG PO;17D2 1796
+KHMER CONSONANT SIGN COENG PHO;17D2 1797
+KHMER CONSONANT SIGN COENG MO;17D2 1798
+KHMER CONSONANT SIGN COENG YO;17D2 1799
+KHMER CONSONANT SIGN COENG RO;17D2 179A
+KHMER CONSONANT SIGN COENG LO;17D2 179B
+KHMER CONSONANT SIGN COENG VO;17D2 179C
+KHMER CONSONANT SIGN COENG SHA;17D2 179D
+KHMER CONSONANT SIGN COENG SSA;17D2 179E
+KHMER CONSONANT SIGN COENG SA;17D2 179F
+KHMER CONSONANT SIGN COENG HA;17D2 17A0
+KHMER CONSONANT SIGN COENG LA;17D2 17A1
+KHMER VOWEL SIGN COENG QA;17D2 17A2
+KHMER INDEPENDENT VOWEL SIGN COENG QU;17D2 17A7
+KHMER INDEPENDENT VOWEL SIGN COENG RY;17D2 17AB
+KHMER INDEPENDENT VOWEL SIGN COENG RYY;17D2 17AC
+KHMER INDEPENDENT VOWEL SIGN COENG QE;17D2 17AF
+KHMER VOWEL SIGN OM;17BB 17C6
+KHMER VOWEL SIGN AAM;17B6 17C6
+KATAKANA LETTER AINU P;31F7 309A
+MODIFIER LETTER EXTRA-HIGH EXTRA-LOW CONTOUR TONE BAR;02E5 02E9
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/NamedSqProv.txt b/Master/tlpkg/tlperl.straw/lib/unicore/NamedSqProv.txt
new file mode 100755
index 00000000000..726806e54bc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/NamedSqProv.txt
@@ -0,0 +1,373 @@
+# NamedSequencesProv-5.1.0.txt
+# Date: 2008-02-14, 12:17 PST [KW]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# Provisional Named Sequences
+# Note: This data file contains those named
+# sequences which have been designated to be provisional,
+# rather than fully approved.
+#
+# Format:
+# Name of Sequence; Code Point Sequence for USI
+#
+# Note: The order of entries in this file is not significant.
+# However, entries are generally in script order corresponding
+# to block order in the Unicode Standard, to make it easier
+# to find entries currently in the list.
+
+# ================================================
+
+# Provisional entries for NamedSequences.txt.
+
+# Proposed additions for Tamil. 2007-10-19
+#
+# These Tamil named sequences have been accepted for a future
+# version of the Unicode Standard. 2008-02-08
+#
+# All of the Tamil named sequences will be moved to
+# the approved NamedSequences.txt, once the required
+# synchronization with the normative clause of ISO/IEC 10646
+# has been completed, through the ISO ballotting process.
+#
+# A visual display of the Tamil named sequences is available
+# in the documentation for Unicode 5.1. See:
+# http://www.unicode.org/versions/Unicode5.1.0/
+
+TAMIL CONSONANT K; 0B95 0BCD
+TAMIL CONSONANT NG; 0B99 0BCD
+TAMIL CONSONANT C; 0B9A 0BCD
+TAMIL CONSONANT NY; 0B9E 0BCD
+TAMIL CONSONANT TT; 0B9F 0BCD
+TAMIL CONSONANT NN; 0BA3 0BCD
+TAMIL CONSONANT T; 0BA4 0BCD
+TAMIL CONSONANT N; 0BA8 0BCD
+TAMIL CONSONANT P; 0BAA 0BCD
+TAMIL CONSONANT M; 0BAE 0BCD
+TAMIL CONSONANT Y; 0BAF 0BCD
+TAMIL CONSONANT R; 0BB0 0BCD
+TAMIL CONSONANT L; 0BB2 0BCD
+TAMIL CONSONANT V; 0BB5 0BCD
+TAMIL CONSONANT LLL;0BB4 0BCD
+TAMIL CONSONANT LL; 0BB3 0BCD
+TAMIL CONSONANT RR; 0BB1 0BCD
+TAMIL CONSONANT NNN;0BA9 0BCD
+TAMIL CONSONANT J; 0B9C 0BCD
+TAMIL CONSONANT SH; 0BB6 0BCD
+TAMIL CONSONANT SS; 0BB7 0BCD
+TAMIL CONSONANT S; 0BB8 0BCD
+TAMIL CONSONANT H; 0BB9 0BCD
+TAMIL CONSONANT KSS;0B95 0BCD 0BB7 0BCD
+
+TAMIL SYLLABLE KAA; 0B95 0BBE
+TAMIL SYLLABLE KI; 0B95 0BBF
+TAMIL SYLLABLE KII; 0B95 0BC0
+TAMIL SYLLABLE KU; 0B95 0BC1
+TAMIL SYLLABLE KUU; 0B95 0BC2
+TAMIL SYLLABLE KE; 0B95 0BC6
+TAMIL SYLLABLE KEE; 0B95 0BC7
+TAMIL SYLLABLE KAI; 0B95 0BC8
+TAMIL SYLLABLE KO; 0B95 0BCA
+TAMIL SYLLABLE KOO; 0B95 0BCB
+TAMIL SYLLABLE KAU; 0B95 0BCC
+
+TAMIL SYLLABLE NGAA; 0B99 0BBE
+TAMIL SYLLABLE NGI; 0B99 0BBF
+TAMIL SYLLABLE NGII; 0B99 0BC0
+TAMIL SYLLABLE NGU; 0B99 0BC1
+TAMIL SYLLABLE NGUU; 0B99 0BC2
+TAMIL SYLLABLE NGE; 0B99 0BC6
+TAMIL SYLLABLE NGEE; 0B99 0BC7
+TAMIL SYLLABLE NGAI; 0B99 0BC8
+TAMIL SYLLABLE NGO; 0B99 0BCA
+TAMIL SYLLABLE NGOO; 0B99 0BCB
+TAMIL SYLLABLE NGAU; 0B99 0BCC
+
+TAMIL SYLLABLE CAA; 0B9A 0BBE
+TAMIL SYLLABLE CI; 0B9A 0BBF
+TAMIL SYLLABLE CII; 0B9A 0BC0
+TAMIL SYLLABLE CU; 0B9A 0BC1
+TAMIL SYLLABLE CUU; 0B9A 0BC2
+TAMIL SYLLABLE CE; 0B9A 0BC6
+TAMIL SYLLABLE CEE; 0B9A 0BC7
+TAMIL SYLLABLE CAI; 0B9A 0BC8
+TAMIL SYLLABLE CO; 0B9A 0BCA
+TAMIL SYLLABLE COO; 0B9A 0BCB
+TAMIL SYLLABLE CAU; 0B9A 0BCC
+
+TAMIL SYLLABLE NYAA; 0B9E 0BBE
+TAMIL SYLLABLE NYI; 0B9E 0BBF
+TAMIL SYLLABLE NYII; 0B9E 0BC0
+TAMIL SYLLABLE NYU; 0B9E 0BC1
+TAMIL SYLLABLE NYUU; 0B9E 0BC2
+TAMIL SYLLABLE NYE; 0B9E 0BC6
+TAMIL SYLLABLE NYEE; 0B9E 0BC7
+TAMIL SYLLABLE NYAI; 0B9E 0BC8
+TAMIL SYLLABLE NYO; 0B9E 0BCA
+TAMIL SYLLABLE NYOO; 0B9E 0BCB
+TAMIL SYLLABLE NYAU; 0B9E 0BCC
+
+TAMIL SYLLABLE TTAA; 0B9F 0BBE
+TAMIL SYLLABLE TTI; 0B9F 0BBF
+TAMIL SYLLABLE TTII; 0B9F 0BC0
+TAMIL SYLLABLE TTU; 0B9F 0BC1
+TAMIL SYLLABLE TTUU; 0B9F 0BC2
+TAMIL SYLLABLE TTE; 0B9F 0BC6
+TAMIL SYLLABLE TTEE; 0B9F 0BC7
+TAMIL SYLLABLE TTAI; 0B9F 0BC8
+TAMIL SYLLABLE TTO; 0B9F 0BCA
+TAMIL SYLLABLE TTOO; 0B9F 0BCB
+TAMIL SYLLABLE TTAU; 0B9F 0BCC
+
+TAMIL SYLLABLE NNAA; 0BA3 0BBE
+TAMIL SYLLABLE NNI; 0BA3 0BBF
+TAMIL SYLLABLE NNII; 0BA3 0BC0
+TAMIL SYLLABLE NNU; 0BA3 0BC1
+TAMIL SYLLABLE NNUU; 0BA3 0BC2
+TAMIL SYLLABLE NNE; 0BA3 0BC6
+TAMIL SYLLABLE NNEE; 0BA3 0BC7
+TAMIL SYLLABLE NNAI; 0BA3 0BC8
+TAMIL SYLLABLE NNO; 0BA3 0BCA
+TAMIL SYLLABLE NNOO; 0BA3 0BCB
+TAMIL SYLLABLE NNAU; 0BA3 0BCC
+
+TAMIL SYLLABLE TAA; 0BA4 0BBE
+TAMIL SYLLABLE TI; 0BA4 0BBF
+TAMIL SYLLABLE TII; 0BA4 0BC0
+TAMIL SYLLABLE TU; 0BA4 0BC1
+TAMIL SYLLABLE TUU; 0BA4 0BC2
+TAMIL SYLLABLE TE; 0BA4 0BC6
+TAMIL SYLLABLE TEE; 0BA4 0BC7
+TAMIL SYLLABLE TAI; 0BA4 0BC8
+TAMIL SYLLABLE TO; 0BA4 0BCA
+TAMIL SYLLABLE TOO; 0BA4 0BCB
+TAMIL SYLLABLE TAU; 0BA4 0BCC
+
+TAMIL SYLLABLE NAA; 0BA8 0BBE
+TAMIL SYLLABLE NI; 0BA8 0BBF
+TAMIL SYLLABLE NII; 0BA8 0BC0
+TAMIL SYLLABLE NU; 0BA8 0BC1
+TAMIL SYLLABLE NUU; 0BA8 0BC2
+TAMIL SYLLABLE NE; 0BA8 0BC6
+TAMIL SYLLABLE NEE; 0BA8 0BC7
+TAMIL SYLLABLE NAI; 0BA8 0BC8
+TAMIL SYLLABLE NO; 0BA8 0BCA
+TAMIL SYLLABLE NOO; 0BA8 0BCB
+TAMIL SYLLABLE NAU; 0BA8 0BCC
+
+TAMIL SYLLABLE PAA; 0BAA 0BBE
+TAMIL SYLLABLE PI; 0BAA 0BBF
+TAMIL SYLLABLE PII; 0BAA 0BC0
+TAMIL SYLLABLE PU; 0BAA 0BC1
+TAMIL SYLLABLE PUU; 0BAA 0BC2
+TAMIL SYLLABLE PE; 0BAA 0BC6
+TAMIL SYLLABLE PEE; 0BAA 0BC7
+TAMIL SYLLABLE PAI; 0BAA 0BC8
+TAMIL SYLLABLE PO; 0BAA 0BCA
+TAMIL SYLLABLE POO; 0BAA 0BCB
+TAMIL SYLLABLE PAU; 0BAA 0BCC
+
+TAMIL SYLLABLE MAA; 0BAE 0BBE
+TAMIL SYLLABLE MI; 0BAE 0BBF
+TAMIL SYLLABLE MII; 0BAE 0BC0
+TAMIL SYLLABLE MU; 0BAE 0BC1
+TAMIL SYLLABLE MUU; 0BAE 0BC2
+TAMIL SYLLABLE ME; 0BAE 0BC6
+TAMIL SYLLABLE MEE; 0BAE 0BC7
+TAMIL SYLLABLE MAI; 0BAE 0BC8
+TAMIL SYLLABLE MO; 0BAE 0BCA
+TAMIL SYLLABLE MOO; 0BAE 0BCB
+TAMIL SYLLABLE MAU; 0BAE 0BCC
+
+TAMIL SYLLABLE YAA; 0BAF 0BBE
+TAMIL SYLLABLE YI; 0BAF 0BBF
+TAMIL SYLLABLE YII; 0BAF 0BC0
+TAMIL SYLLABLE YU; 0BAF 0BC1
+TAMIL SYLLABLE YUU; 0BAF 0BC2
+TAMIL SYLLABLE YE; 0BAF 0BC6
+TAMIL SYLLABLE YEE; 0BAF 0BC7
+TAMIL SYLLABLE YAI; 0BAF 0BC8
+TAMIL SYLLABLE YO; 0BAF 0BCA
+TAMIL SYLLABLE YOO; 0BAF 0BCB
+TAMIL SYLLABLE YAU; 0BAF 0BCC
+
+TAMIL SYLLABLE RAA; 0BB0 0BBE
+TAMIL SYLLABLE RI; 0BB0 0BBF
+TAMIL SYLLABLE RII; 0BB0 0BC0
+TAMIL SYLLABLE RU; 0BB0 0BC1
+TAMIL SYLLABLE RUU; 0BB0 0BC2
+TAMIL SYLLABLE RE; 0BB0 0BC6
+TAMIL SYLLABLE REE; 0BB0 0BC7
+TAMIL SYLLABLE RAI; 0BB0 0BC8
+TAMIL SYLLABLE RO; 0BB0 0BCA
+TAMIL SYLLABLE ROO; 0BB0 0BCB
+TAMIL SYLLABLE RAU; 0BB0 0BCC
+
+TAMIL SYLLABLE LAA; 0BB2 0BBE
+TAMIL SYLLABLE LI; 0BB2 0BBF
+TAMIL SYLLABLE LII; 0BB2 0BC0
+TAMIL SYLLABLE LU; 0BB2 0BC1
+TAMIL SYLLABLE LUU; 0BB2 0BC2
+TAMIL SYLLABLE LE; 0BB2 0BC6
+TAMIL SYLLABLE LEE; 0BB2 0BC7
+TAMIL SYLLABLE LAI; 0BB2 0BC8
+TAMIL SYLLABLE LO; 0BB2 0BCA
+TAMIL SYLLABLE LOO; 0BB2 0BCB
+TAMIL SYLLABLE LAU; 0BB2 0BCC
+
+TAMIL SYLLABLE VAA; 0BB5 0BBE
+TAMIL SYLLABLE VI; 0BB5 0BBF
+TAMIL SYLLABLE VII; 0BB5 0BC0
+TAMIL SYLLABLE VU; 0BB5 0BC1
+TAMIL SYLLABLE VUU; 0BB5 0BC2
+TAMIL SYLLABLE VE; 0BB5 0BC6
+TAMIL SYLLABLE VEE; 0BB5 0BC7
+TAMIL SYLLABLE VAI; 0BB5 0BC8
+TAMIL SYLLABLE VO; 0BB5 0BCA
+TAMIL SYLLABLE VOO; 0BB5 0BCB
+TAMIL SYLLABLE VAU; 0BB5 0BCC
+
+TAMIL SYLLABLE LLLAA; 0BB4 0BBE
+TAMIL SYLLABLE LLLI; 0BB4 0BBF
+TAMIL SYLLABLE LLLII; 0BB4 0BC0
+TAMIL SYLLABLE LLLU; 0BB4 0BC1
+TAMIL SYLLABLE LLLUU; 0BB4 0BC2
+TAMIL SYLLABLE LLLE; 0BB4 0BC6
+TAMIL SYLLABLE LLLEE; 0BB4 0BC7
+TAMIL SYLLABLE LLLAI; 0BB4 0BC8
+TAMIL SYLLABLE LLLO; 0BB4 0BCA
+TAMIL SYLLABLE LLLOO; 0BB4 0BCB
+TAMIL SYLLABLE LLLAU; 0BB4 0BCC
+
+TAMIL SYLLABLE LLAA; 0BB3 0BBE
+TAMIL SYLLABLE LLI; 0BB3 0BBF
+TAMIL SYLLABLE LLII; 0BB3 0BC0
+TAMIL SYLLABLE LLU; 0BB3 0BC1
+TAMIL SYLLABLE LLUU; 0BB3 0BC2
+TAMIL SYLLABLE LLE; 0BB3 0BC6
+TAMIL SYLLABLE LLEE; 0BB3 0BC7
+TAMIL SYLLABLE LLAI; 0BB3 0BC8
+TAMIL SYLLABLE LLO; 0BB3 0BCA
+TAMIL SYLLABLE LLOO; 0BB3 0BCB
+TAMIL SYLLABLE LLAU; 0BB3 0BCC
+
+TAMIL SYLLABLE RRAA; 0BB1 0BBE
+TAMIL SYLLABLE RRI; 0BB1 0BBF
+TAMIL SYLLABLE RRII; 0BB1 0BC0
+TAMIL SYLLABLE RRU; 0BB1 0BC1
+TAMIL SYLLABLE RRUU; 0BB1 0BC2
+TAMIL SYLLABLE RRE; 0BB1 0BC6
+TAMIL SYLLABLE RREE; 0BB1 0BC7
+TAMIL SYLLABLE RRAI; 0BB1 0BC8
+TAMIL SYLLABLE RRO; 0BB1 0BCA
+TAMIL SYLLABLE RROO; 0BB1 0BCB
+TAMIL SYLLABLE RRAU; 0BB1 0BCC
+
+TAMIL SYLLABLE NNNAA; 0BA9 0BBE
+TAMIL SYLLABLE NNNI; 0BA9 0BBF
+TAMIL SYLLABLE NNNII; 0BA9 0BC0
+TAMIL SYLLABLE NNNU; 0BA9 0BC1
+TAMIL SYLLABLE NNNUU; 0BA9 0BC2
+TAMIL SYLLABLE NNNE; 0BA9 0BC6
+TAMIL SYLLABLE NNNEE; 0BA9 0BC7
+TAMIL SYLLABLE NNNAI; 0BA9 0BC8
+TAMIL SYLLABLE NNNO; 0BA9 0BCA
+TAMIL SYLLABLE NNNOO; 0BA9 0BCB
+TAMIL SYLLABLE NNNAU; 0BA9 0BCC
+
+TAMIL SYLLABLE JAA; 0B9C 0BBE
+TAMIL SYLLABLE JI; 0B9C 0BBF
+TAMIL SYLLABLE JII; 0B9C 0BC0
+TAMIL SYLLABLE JU; 0B9C 0BC1
+TAMIL SYLLABLE JUU; 0B9C 0BC2
+TAMIL SYLLABLE JE; 0B9C 0BC6
+TAMIL SYLLABLE JEE; 0B9C 0BC7
+TAMIL SYLLABLE JAI; 0B9C 0BC8
+TAMIL SYLLABLE JO; 0B9C 0BCA
+TAMIL SYLLABLE JOO; 0B9C 0BCB
+TAMIL SYLLABLE JAU; 0B9C 0BCC
+
+TAMIL SYLLABLE SHAA; 0BB6 0BBE
+TAMIL SYLLABLE SHI; 0BB6 0BBF
+TAMIL SYLLABLE SHII; 0BB6 0BC0
+TAMIL SYLLABLE SHU; 0BB6 0BC1
+TAMIL SYLLABLE SHUU; 0BB6 0BC2
+TAMIL SYLLABLE SHE; 0BB6 0BC6
+TAMIL SYLLABLE SHEE; 0BB6 0BC7
+TAMIL SYLLABLE SHAI; 0BB6 0BC8
+TAMIL SYLLABLE SHO; 0BB6 0BCA
+TAMIL SYLLABLE SHOO; 0BB6 0BCB
+TAMIL SYLLABLE SHAU; 0BB6 0BCC
+
+TAMIL SYLLABLE SSAA; 0BB7 0BBE
+TAMIL SYLLABLE SSI; 0BB7 0BBF
+TAMIL SYLLABLE SSII; 0BB7 0BC0
+TAMIL SYLLABLE SSU; 0BB7 0BC1
+TAMIL SYLLABLE SSUU; 0BB7 0BC2
+TAMIL SYLLABLE SSE; 0BB7 0BC6
+TAMIL SYLLABLE SSEE; 0BB7 0BC7
+TAMIL SYLLABLE SSAI; 0BB7 0BC8
+TAMIL SYLLABLE SSO; 0BB7 0BCA
+TAMIL SYLLABLE SSOO; 0BB7 0BCB
+TAMIL SYLLABLE SSAU; 0BB7 0BCC
+
+TAMIL SYLLABLE SAA; 0BB8 0BBE
+TAMIL SYLLABLE SI; 0BB8 0BBF
+TAMIL SYLLABLE SII; 0BB8 0BC0
+TAMIL SYLLABLE SU; 0BB8 0BC1
+TAMIL SYLLABLE SUU; 0BB8 0BC2
+TAMIL SYLLABLE SE; 0BB8 0BC6
+TAMIL SYLLABLE SEE; 0BB8 0BC7
+TAMIL SYLLABLE SAI; 0BB8 0BC8
+TAMIL SYLLABLE SO; 0BB8 0BCA
+TAMIL SYLLABLE SOO; 0BB8 0BCB
+TAMIL SYLLABLE SAU; 0BB8 0BCC
+
+TAMIL SYLLABLE HAA; 0BB9 0BBE
+TAMIL SYLLABLE HI; 0BB9 0BBF
+TAMIL SYLLABLE HII; 0BB9 0BC0
+TAMIL SYLLABLE HU; 0BB9 0BC1
+TAMIL SYLLABLE HUU; 0BB9 0BC2
+TAMIL SYLLABLE HE; 0BB9 0BC6
+TAMIL SYLLABLE HEE; 0BB9 0BC7
+TAMIL SYLLABLE HAI; 0BB9 0BC8
+TAMIL SYLLABLE HO; 0BB9 0BCA
+TAMIL SYLLABLE HOO; 0BB9 0BCB
+TAMIL SYLLABLE HAU; 0BB9 0BCC
+
+TAMIL SYLLABLE KSSA; 0B95 0BCD 0BB7
+TAMIL SYLLABLE KSSAA; 0B95 0BCD 0BB7 0BBE
+TAMIL SYLLABLE KSSI; 0B95 0BCD 0BB7 0BBF
+TAMIL SYLLABLE KSSII; 0B95 0BCD 0BB7 0BC0
+TAMIL SYLLABLE KSSU; 0B95 0BCD 0BB7 0BC1
+TAMIL SYLLABLE KSSUU; 0B95 0BCD 0BB7 0BC2
+TAMIL SYLLABLE KSSE; 0B95 0BCD 0BB7 0BC6
+TAMIL SYLLABLE KSSEE; 0B95 0BCD 0BB7 0BC7
+TAMIL SYLLABLE KSSAI; 0B95 0BCD 0BB7 0BC8
+TAMIL SYLLABLE KSSO; 0B95 0BCD 0BB7 0BCA
+TAMIL SYLLABLE KSSOO; 0B95 0BCD 0BB7 0BCB
+TAMIL SYLLABLE KSSAU; 0B95 0BCD 0BB7 0BCC
+
+TAMIL SYLLABLE SHRII; 0BB6 0BCD 0BB0 0BC0
+
+# ================================================
+
+# Entries from Unicode 4.1.0 version of NamedSequences.txt,
+# subsequently disapproved because of potential errors in
+# representation.
+
+# GURMUKHI HALF YA;0A2F 0A4D
+# GURMUKHI PARI YA;0A4D 0A2F
+
+# Entry removed 2006-05-18:
+#
+# LATIN SMALL LETTER A WITH ACUTE AND OGONEK;00E1 0328
+#
+# This entry was removed because the sequence was not in NFC,
+# as required. It was replaced with the NFC version of
+# the sequence, based on the Lithuanian additions accepted
+# for Unicode 5.0.
+
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/NamesList.txt b/Master/tlpkg/tlperl.straw/lib/unicore/NamesList.txt
new file mode 100755
index 00000000000..5f6704615ba
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/NamesList.txt
@@ -0,0 +1,31236 @@
+@@@ The Unicode Standard 5.1
+@@@+ U51M080326.lst
+ Final Unicode 5.1 names list.
+ This file is semi-automatically derived from UnicodeData.txt and
+ a set of manually created annotations using a script to select
+ or suppress information from the data file. The rules used
+ for this process are aimed at readability for the human reader,
+ at the expense of some details; therefore, this file should not
+ be parsed for machine-readable information.
+@+ Copyright (c) 1991-2008 Unicode, Inc.
+ For terms of use, see http://www.unicode.org/terms_of_use.html
+@@ 0000 C0 Controls and Basic Latin (Basic Latin) 007F
+@@+
+@ C0 controls
+@+ Alias names are those for ISO/IEC 6429:1992. Commonly used alternative aliases are also shown.
+0000 <control>
+ = NULL
+0001 <control>
+ = START OF HEADING
+0002 <control>
+ = START OF TEXT
+0003 <control>
+ = END OF TEXT
+0004 <control>
+ = END OF TRANSMISSION
+0005 <control>
+ = ENQUIRY
+0006 <control>
+ = ACKNOWLEDGE
+0007 <control>
+ = BELL
+0008 <control>
+ = BACKSPACE
+0009 <control>
+ = CHARACTER TABULATION
+ = horizontal tabulation (HT), tab
+000A <control>
+ = LINE FEED (LF)
+ = new line (NL), end of line (EOL)
+000B <control>
+ = LINE TABULATION
+ = vertical tabulation (VT)
+000C <control>
+ = FORM FEED (FF)
+000D <control>
+ = CARRIAGE RETURN (CR)
+000E <control>
+ = SHIFT OUT
+ * known as LOCKING-SHIFT ONE in 8-bit environments
+000F <control>
+ = SHIFT IN
+ * known as LOCKING-SHIFT ZERO in 8-bit environments
+0010 <control>
+ = DATA LINK ESCAPE
+0011 <control>
+ = DEVICE CONTROL ONE
+0012 <control>
+ = DEVICE CONTROL TWO
+0013 <control>
+ = DEVICE CONTROL THREE
+0014 <control>
+ = DEVICE CONTROL FOUR
+0015 <control>
+ = NEGATIVE ACKNOWLEDGE
+0016 <control>
+ = SYNCHRONOUS IDLE
+0017 <control>
+ = END OF TRANSMISSION BLOCK
+0018 <control>
+ = CANCEL
+0019 <control>
+ = END OF MEDIUM
+001A <control>
+ = SUBSTITUTE
+ x (replacement character - FFFD)
+001B <control>
+ = ESCAPE
+001C <control>
+ = INFORMATION SEPARATOR FOUR
+ = file separator (FS)
+001D <control>
+ = INFORMATION SEPARATOR THREE
+ = group separator (GS)
+001E <control>
+ = INFORMATION SEPARATOR TWO
+ = record separator (RS)
+001F <control>
+ = INFORMATION SEPARATOR ONE
+ = unit separator (US)
+@ ASCII punctuation and symbols
+@+ Based on ISO/IEC 646.
+0020 SPACE
+ * sometimes considered a control code
+ * other space characters: 2000-200A
+ x (no-break space - 00A0)
+ x (zero width space - 200B)
+ x (word joiner - 2060)
+ x (ideographic space - 3000)
+ x (zero width no-break space - FEFF)
+0021 EXCLAMATION MARK
+ = factorial
+ = bang
+ x (inverted exclamation mark - 00A1)
+ x (latin letter retroflex click - 01C3)
+ x (double exclamation mark - 203C)
+ x (interrobang - 203D)
+ x (heavy exclamation mark ornament - 2762)
+0022 QUOTATION MARK
+ * neutral (vertical), used as opening or closing quotation mark
+ * preferred characters in English for paired quotation marks are 201C & 201D
+ x (modifier letter double prime - 02BA)
+ x (combining double acute accent - 030B)
+ x (combining double vertical line above - 030E)
+ x (double prime - 2033)
+ x (ditto mark - 3003)
+0023 NUMBER SIGN
+ = pound sign, hash, crosshatch, octothorpe
+ x (l b bar symbol - 2114)
+ x (music sharp sign - 266F)
+0024 DOLLAR SIGN
+ = milreis, escudo
+ * glyph may have one or two vertical bars
+ * other currency symbol characters: 20A0-20B5
+ x (currency sign - 00A4)
+0025 PERCENT SIGN
+ x (arabic percent sign - 066A)
+ x (per mille sign - 2030)
+ x (per ten thousand sign - 2031)
+ x (commercial minus sign - 2052)
+0026 AMPERSAND
+ x (tironian sign et - 204A)
+ x (turned ampersand - 214B)
+0027 APOSTROPHE
+ = apostrophe-quote (1.0)
+ = APL quote
+ * neutral (vertical) glyph with mixed usage
+ * 2019 is preferred for apostrophe
+ * preferred characters in English for paired quotation marks are 2018 & 2019
+ x (modifier letter prime - 02B9)
+ x (modifier letter apostrophe - 02BC)
+ x (modifier letter vertical line - 02C8)
+ x (combining acute accent - 0301)
+ x (prime - 2032)
+ x (latin small letter saltillo - A78C)
+0028 LEFT PARENTHESIS
+ = opening parenthesis (1.0)
+0029 RIGHT PARENTHESIS
+ = closing parenthesis (1.0)
+ * see discussion on semantics of paired bracketing characters
+002A ASTERISK
+ = star (on phone keypads)
+ x (arabic five pointed star - 066D)
+ x (low asterisk - 204E)
+ x (asterisk operator - 2217)
+ x (sextile - 26B9)
+ x (heavy asterisk - 2731)
+002B PLUS SIGN
+002C COMMA
+ = decimal separator
+ x (arabic comma - 060C)
+ x (single low-9 quotation mark - 201A)
+ x (ideographic comma - 3001)
+002D HYPHEN-MINUS
+ = hyphen or minus sign
+ * used for either hyphen or minus sign
+ x (hyphen - 2010)
+ x (non-breaking hyphen - 2011)
+ x (figure dash - 2012)
+ x (en dash - 2013)
+ x (minus sign - 2212)
+ x (roman uncia sign - 10191)
+002E FULL STOP
+ = period, dot, decimal point
+ * may be rendered as a raised decimal point in old style numbers
+ x (arabic full stop - 06D4)
+ x (ideographic full stop - 3002)
+002F SOLIDUS
+ = slash, virgule
+ x (latin letter dental click - 01C0)
+ x (combining long solidus overlay - 0338)
+ x (fraction slash - 2044)
+ x (division slash - 2215)
+@ ASCII digits
+0030 DIGIT ZERO
+0031 DIGIT ONE
+0032 DIGIT TWO
+0033 DIGIT THREE
+0034 DIGIT FOUR
+0035 DIGIT FIVE
+0036 DIGIT SIX
+0037 DIGIT SEVEN
+0038 DIGIT EIGHT
+0039 DIGIT NINE
+@ ASCII punctuation and symbols
+003A COLON
+ x (armenian full stop - 0589)
+ x (hebrew punctuation sof pasuq - 05C3)
+ x (ratio - 2236)
+ x (modifier letter colon - A789)
+003B SEMICOLON
+ * this, and not 037E, is the preferred character for 'Greek question mark'
+ x (greek question mark - 037E)
+ x (arabic semicolon - 061B)
+ x (reversed semicolon - 204F)
+003C LESS-THAN SIGN
+ x (single left-pointing angle quotation mark - 2039)
+ x (left-pointing angle bracket - 2329)
+ x (mathematical left angle bracket - 27E8)
+ x (left angle bracket - 3008)
+003D EQUALS SIGN
+ * other related characters: 2241-2263
+ x (not equal to - 2260)
+ x (identical to - 2261)
+ x (modifier letter short equals sign - A78A)
+ x (roman sextans sign - 10190)
+003E GREATER-THAN SIGN
+ x (single right-pointing angle quotation mark - 203A)
+ x (right-pointing angle bracket - 232A)
+ x (mathematical right angle bracket - 27E9)
+ x (right angle bracket - 3009)
+003F QUESTION MARK
+ x (inverted question mark - 00BF)
+ x (greek question mark - 037E)
+ x (arabic question mark - 061F)
+ x (interrobang - 203D)
+ x (question exclamation mark - 2048)
+ x (exclamation question mark - 2049)
+0040 COMMERCIAL AT
+ = at sign
+@ Uppercase Latin alphabet
+0041 LATIN CAPITAL LETTER A
+0042 LATIN CAPITAL LETTER B
+ x (script capital b - 212C)
+0043 LATIN CAPITAL LETTER C
+ x (double-struck capital c - 2102)
+ x (black-letter capital c - 212D)
+0044 LATIN CAPITAL LETTER D
+0045 LATIN CAPITAL LETTER E
+ x (euler constant - 2107)
+ x (script capital e - 2130)
+0046 LATIN CAPITAL LETTER F
+ x (script capital f - 2131)
+ x (turned capital f - 2132)
+0047 LATIN CAPITAL LETTER G
+0048 LATIN CAPITAL LETTER H
+ x (script capital h - 210B)
+ x (black-letter capital h - 210C)
+ x (double-struck capital h - 210D)
+0049 LATIN CAPITAL LETTER I
+ * Turkish and Azerbaijani use 0131 for lowercase
+ x (latin capital letter i with dot above - 0130)
+ x (cyrillic capital letter byelorussian-ukrainian i - 0406)
+ x (cyrillic letter palochka - 04C0)
+ x (script capital i - 2110)
+ x (black-letter capital i - 2111)
+ x (roman numeral one - 2160)
+004A LATIN CAPITAL LETTER J
+004B LATIN CAPITAL LETTER K
+ x (kelvin sign - 212A)
+004C LATIN CAPITAL LETTER L
+ x (script capital l - 2112)
+004D LATIN CAPITAL LETTER M
+ x (script capital m - 2133)
+004E LATIN CAPITAL LETTER N
+ x (double-struck capital n - 2115)
+004F LATIN CAPITAL LETTER O
+0050 LATIN CAPITAL LETTER P
+ x (double-struck capital p - 2119)
+0051 LATIN CAPITAL LETTER Q
+ x (double-struck capital q - 211A)
+0052 LATIN CAPITAL LETTER R
+ x (script capital r - 211B)
+ x (black-letter capital r - 211C)
+ x (double-struck capital r - 211D)
+0053 LATIN CAPITAL LETTER S
+0054 LATIN CAPITAL LETTER T
+0055 LATIN CAPITAL LETTER U
+0056 LATIN CAPITAL LETTER V
+0057 LATIN CAPITAL LETTER W
+0058 LATIN CAPITAL LETTER X
+0059 LATIN CAPITAL LETTER Y
+005A LATIN CAPITAL LETTER Z
+ x (double-struck capital z - 2124)
+ x (black-letter capital z - 2128)
+@ ASCII punctuation and symbols
+005B LEFT SQUARE BRACKET
+ = opening square bracket (1.0)
+ * other bracket characters: 27E6-27EB, 2983-2998, 3008-301B
+005C REVERSE SOLIDUS
+ = backslash
+ x (combining reverse solidus overlay - 20E5)
+ x (set minus - 2216)
+005D RIGHT SQUARE BRACKET
+ = closing square bracket (1.0)
+005E CIRCUMFLEX ACCENT
+ * this is a spacing character
+ x (modifier letter up arrowhead - 02C4)
+ x (modifier letter circumflex accent - 02C6)
+ x (combining circumflex accent - 0302)
+ x (caret - 2038)
+ x (up arrowhead - 2303)
+005F LOW LINE
+ = spacing underscore (1.0)
+ * this is a spacing character
+ x (modifier letter low macron - 02CD)
+ x (combining macron below - 0331)
+ x (combining low line - 0332)
+ x (double low line - 2017)
+0060 GRAVE ACCENT
+ * this is a spacing character
+ x (modifier letter grave accent - 02CB)
+ x (combining grave accent - 0300)
+ x (reversed prime - 2035)
+@ Lowercase Latin alphabet
+0061 LATIN SMALL LETTER A
+0062 LATIN SMALL LETTER B
+0063 LATIN SMALL LETTER C
+0064 LATIN SMALL LETTER D
+0065 LATIN SMALL LETTER E
+ x (estimated symbol - 212E)
+ x (script small e - 212F)
+0066 LATIN SMALL LETTER F
+0067 LATIN SMALL LETTER G
+ x (latin small letter script g - 0261)
+ x (script small g - 210A)
+0068 LATIN SMALL LETTER H
+ x (cyrillic small letter shha - 04BB)
+ x (planck constant - 210E)
+0069 LATIN SMALL LETTER I
+ * Turkish and Azerbaijani use 0130 for uppercase
+ x (latin small letter dotless i - 0131)
+ x (mathematical italic small dotless i - 1D6A4)
+006A LATIN SMALL LETTER J
+ x (latin small letter dotless j - 0237)
+ x (mathematical italic small dotless j - 1D6A5)
+006B LATIN SMALL LETTER K
+006C LATIN SMALL LETTER L
+ x (script small l - 2113)
+ x (mathematical script small l - 1D4C1)
+006D LATIN SMALL LETTER M
+006E LATIN SMALL LETTER N
+ x (superscript latin small letter n - 207F)
+006F LATIN SMALL LETTER O
+ x (script small o - 2134)
+0070 LATIN SMALL LETTER P
+0071 LATIN SMALL LETTER Q
+0072 LATIN SMALL LETTER R
+0073 LATIN SMALL LETTER S
+0074 LATIN SMALL LETTER T
+0075 LATIN SMALL LETTER U
+0076 LATIN SMALL LETTER V
+0077 LATIN SMALL LETTER W
+0078 LATIN SMALL LETTER X
+0079 LATIN SMALL LETTER Y
+007A LATIN SMALL LETTER Z
+ x (latin small letter z with stroke - 01B6)
+@ ASCII punctuation and symbols
+007B LEFT CURLY BRACKET
+ = opening curly bracket (1.0)
+ = left brace
+007C VERTICAL LINE
+ = vertical bar
+ * used in pairs to indicate absolute value
+ x (latin letter dental click - 01C0)
+ x (hebrew punctuation paseq - 05C0)
+ x (divides - 2223)
+ x (light vertical bar - 2758)
+007D RIGHT CURLY BRACKET
+ = closing curly bracket (1.0)
+ = right brace
+007E TILDE
+ * this is a spacing character
+ x (small tilde - 02DC)
+ x (combining tilde - 0303)
+ x (swung dash - 2053)
+ x (tilde operator - 223C)
+ x (fullwidth tilde - FF5E)
+@ Control character
+007F <control>
+ = DELETE
+@@ 0080 C1 Controls and Latin-1 Supplement (Latin-1 Supplement) 00FF
+@ C1 controls
+@+ Alias names are those for ISO/IEC 6429:1992.
+0080 <control>
+0081 <control>
+0082 <control>
+ = BREAK PERMITTED HERE
+ x (zero width space - 200B)
+0083 <control>
+ = NO BREAK HERE
+ x (word joiner - 2060)
+0084 <control>
+ * formerly known as INDEX
+0085 <control>
+ = NEXT LINE (NEL)
+0086 <control>
+ = START OF SELECTED AREA
+0087 <control>
+ = END OF SELECTED AREA
+0088 <control>
+ = CHARACTER TABULATION SET
+0089 <control>
+ = CHARACTER TABULATION WITH JUSTIFICATION
+008A <control>
+ = LINE TABULATION SET
+008B <control>
+ = PARTIAL LINE FORWARD
+008C <control>
+ = PARTIAL LINE BACKWARD
+008D <control>
+ = REVERSE LINE FEED
+008E <control>
+ = SINGLE SHIFT TWO
+008F <control>
+ = SINGLE SHIFT THREE
+0090 <control>
+ = DEVICE CONTROL STRING
+0091 <control>
+ = PRIVATE USE ONE
+0092 <control>
+ = PRIVATE USE TWO
+0093 <control>
+ = SET TRANSMIT STATE
+0094 <control>
+ = CANCEL CHARACTER
+0095 <control>
+ = MESSAGE WAITING
+0096 <control>
+ = START OF GUARDED AREA
+0097 <control>
+ = END OF GUARDED AREA
+0098 <control>
+ = START OF STRING
+0099 <control>
+009A <control>
+ = SINGLE CHARACTER INTRODUCER
+009B <control>
+ = CONTROL SEQUENCE INTRODUCER
+009C <control>
+ = STRING TERMINATOR
+009D <control>
+ = OPERATING SYSTEM COMMAND
+009E <control>
+ = PRIVACY MESSAGE
+009F <control>
+ = APPLICATION PROGRAM COMMAND
+@ Latin-1 punctuation and symbols
+@+ Based on ISO/IEC 8859-1 (aka Latin-1) from here.
+00A0 NO-BREAK SPACE
+ * commonly abbreviated as NBSP
+ x (space - 0020)
+ x (figure space - 2007)
+ x (narrow no-break space - 202F)
+ x (word joiner - 2060)
+ x (zero width no-break space - FEFF)
+ # <noBreak> 0020
+00A1 INVERTED EXCLAMATION MARK
+ * Spanish, Asturian, Galician
+ x (exclamation mark - 0021)
+00A2 CENT SIGN
+00A3 POUND SIGN
+ = pound sterling, Irish punt, Italian lira, Turkish lira, etc.
+ x (lira sign - 20A4)
+ x (roman semuncia sign - 10192)
+00A4 CURRENCY SIGN
+ * other currency symbol characters: 20A0-20B5
+ x (dollar sign - 0024)
+00A5 YEN SIGN
+ = yuan sign
+ * glyph may have one or two crossbars
+00A6 BROKEN BAR
+ = broken vertical bar (1.0)
+ = parted rule (in typography)
+00A7 SECTION SIGN
+ * paragraph sign in some European usage
+00A8 DIAERESIS
+ * this is a spacing character
+ x (combining diaeresis - 0308)
+ # 0020 0308
+00A9 COPYRIGHT SIGN
+ x (sound recording copyright - 2117)
+ x (circled latin capital letter c - 24B8)
+00AA FEMININE ORDINAL INDICATOR
+ * Spanish
+ # <super> 0061
+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK *
+ = left guillemet
+ = chevrons (in typography)
+ * usually opening, sometimes closing
+ x (much less-than - 226A)
+ x (left double angle bracket - 300A)
+00AC NOT SIGN
+ = angled dash (in typography)
+ x (reversed not sign - 2310)
+00AD SOFT HYPHEN
+ = discretionary hyphen
+ * commonly abbreviated as SHY
+00AE REGISTERED SIGN
+ = registered trade mark sign (1.0)
+ x (circled latin capital letter r - 24C7)
+00AF MACRON
+ = overline, APL overbar
+ * this is a spacing character
+ x (modifier letter macron - 02C9)
+ x (combining macron - 0304)
+ x (combining overline - 0305)
+ # 0020 0304
+00B0 DEGREE SIGN
+ * this is a spacing character
+ x (ring above - 02DA)
+ x (combining ring above - 030A)
+ x (superscript zero - 2070)
+ x (ring operator - 2218)
+00B1 PLUS-MINUS SIGN
+ x (minus-or-plus sign - 2213)
+00B2 SUPERSCRIPT TWO
+ = squared
+ * other superscript digit characters: 2070-2079
+ x (superscript one - 00B9)
+ # <super> 0032
+00B3 SUPERSCRIPT THREE
+ = cubed
+ x (superscript one - 00B9)
+ # <super> 0033
+00B4 ACUTE ACCENT
+ * this is a spacing character
+ x (modifier letter prime - 02B9)
+ x (modifier letter acute accent - 02CA)
+ x (combining acute accent - 0301)
+ x (prime - 2032)
+ # 0020 0301
+00B5 MICRO SIGN
+ # 03BC greek small letter mu
+00B6 PILCROW SIGN
+ = paragraph sign
+ * section sign in some European usage
+ x (reversed pilcrow sign - 204B)
+ x (curved stem paragraph sign ornament - 2761)
+00B7 MIDDLE DOT
+ = midpoint (in typography)
+ = Georgian comma
+ = Greek middle dot (ano teleia)
+ x (greek ano teleia - 0387)
+ x (bullet - 2022)
+ x (one dot leader - 2024)
+ x (hyphenation point - 2027)
+ x (bullet operator - 2219)
+ x (dot operator - 22C5)
+ x (katakana middle dot - 30FB)
+00B8 CEDILLA
+ * this is a spacing character
+ * other spacing accent characters: 02D8-02DB
+ x (combining cedilla - 0327)
+ # 0020 0327
+00B9 SUPERSCRIPT ONE
+ x (superscript two - 00B2)
+ x (superscript three - 00B3)
+ # <super> 0031
+00BA MASCULINE ORDINAL INDICATOR
+ * Spanish
+ # <super> 006F
+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK *
+ = right guillemet
+ * usually closing, sometimes opening
+ x (much greater-than - 226B)
+ x (right double angle bracket - 300B)
+00BC VULGAR FRACTION ONE QUARTER
+ * bar may be horizontal or slanted
+ * other fraction characters: 2153-215E
+ # <fraction> 0031 2044 0034
+00BD VULGAR FRACTION ONE HALF
+ * bar may be horizontal or slanted
+ # <fraction> 0031 2044 0032
+00BE VULGAR FRACTION THREE QUARTERS
+ * bar may be horizontal or slanted
+ # <fraction> 0033 2044 0034
+00BF INVERTED QUESTION MARK
+ = turned question mark
+ * Spanish
+ x (question mark - 003F)
+ x (reversed question mark - 2E2E)
+@ Letters
+00C0 LATIN CAPITAL LETTER A WITH GRAVE
+ : 0041 0300
+00C1 LATIN CAPITAL LETTER A WITH ACUTE
+ : 0041 0301
+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ : 0041 0302
+00C3 LATIN CAPITAL LETTER A WITH TILDE
+ : 0041 0303
+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+ : 0041 0308
+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+ x (angstrom sign - 212B)
+ : 0041 030A
+00C6 LATIN CAPITAL LETTER AE (ash) *
+ = latin capital ligature ae (1.0)
+00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+ : 0043 0327
+00C8 LATIN CAPITAL LETTER E WITH GRAVE
+ : 0045 0300
+00C9 LATIN CAPITAL LETTER E WITH ACUTE
+ : 0045 0301
+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ : 0045 0302
+00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+ : 0045 0308
+00CC LATIN CAPITAL LETTER I WITH GRAVE
+ : 0049 0300
+00CD LATIN CAPITAL LETTER I WITH ACUTE
+ : 0049 0301
+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ : 0049 0302
+00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+ : 0049 0308
+00D0 LATIN CAPITAL LETTER ETH (Icelandic)
+ x (latin small letter eth - 00F0)
+ x (latin capital letter d with stroke - 0110)
+ x (latin capital letter african d - 0189)
+00D1 LATIN CAPITAL LETTER N WITH TILDE
+ : 004E 0303
+00D2 LATIN CAPITAL LETTER O WITH GRAVE
+ : 004F 0300
+00D3 LATIN CAPITAL LETTER O WITH ACUTE
+ : 004F 0301
+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ : 004F 0302
+00D5 LATIN CAPITAL LETTER O WITH TILDE
+ : 004F 0303
+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+ : 004F 0308
+@ Mathematical operator
+00D7 MULTIPLICATION SIGN
+ = z notation Cartesian product
+@ Letters
+00D8 LATIN CAPITAL LETTER O WITH STROKE
+ = o slash
+ x (empty set - 2205)
+00D9 LATIN CAPITAL LETTER U WITH GRAVE
+ : 0055 0300
+00DA LATIN CAPITAL LETTER U WITH ACUTE
+ : 0055 0301
+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ : 0055 0302
+00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+ : 0055 0308
+00DD LATIN CAPITAL LETTER Y WITH ACUTE
+ : 0059 0301
+00DE LATIN CAPITAL LETTER THORN (Icelandic)
+00DF LATIN SMALL LETTER SHARP S (German)
+ = Eszett
+ * German
+ * uppercase is "SS"
+ * in origin a ligature of 017F and 0073
+ x (greek small letter beta - 03B2)
+ x (latin capital letter sharp s - 1E9E)
+00E0 LATIN SMALL LETTER A WITH GRAVE
+ : 0061 0300
+00E1 LATIN SMALL LETTER A WITH ACUTE
+ : 0061 0301
+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+ : 0061 0302
+00E3 LATIN SMALL LETTER A WITH TILDE
+ * Portuguese
+ : 0061 0303
+00E4 LATIN SMALL LETTER A WITH DIAERESIS
+ : 0061 0308
+00E5 LATIN SMALL LETTER A WITH RING ABOVE
+ * Danish, Norwegian, Swedish, Walloon
+ : 0061 030A
+00E6 LATIN SMALL LETTER AE (ash) *
+ = latin small ligature ae (1.0)
+ = ash (from Old English æsc)
+ * Danish, Norwegian, Icelandic, Faroese, Old English, French, IPA
+ x (latin small ligature oe - 0153)
+ x (cyrillic small ligature a ie - 04D5)
+00E7 LATIN SMALL LETTER C WITH CEDILLA
+ : 0063 0327
+00E8 LATIN SMALL LETTER E WITH GRAVE
+ : 0065 0300
+00E9 LATIN SMALL LETTER E WITH ACUTE
+ : 0065 0301
+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+ : 0065 0302
+00EB LATIN SMALL LETTER E WITH DIAERESIS
+ : 0065 0308
+00EC LATIN SMALL LETTER I WITH GRAVE
+ * Italian, Malagasy
+ : 0069 0300
+00ED LATIN SMALL LETTER I WITH ACUTE
+ : 0069 0301
+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+ : 0069 0302
+00EF LATIN SMALL LETTER I WITH DIAERESIS
+ : 0069 0308
+00F0 LATIN SMALL LETTER ETH (Icelandic)
+ * Icelandic, Faroese, Old English, IPA
+ x (latin capital letter eth - 00D0)
+ x (greek small letter delta - 03B4)
+ x (partial differential - 2202)
+00F1 LATIN SMALL LETTER N WITH TILDE
+ : 006E 0303
+00F2 LATIN SMALL LETTER O WITH GRAVE
+ : 006F 0300
+00F3 LATIN SMALL LETTER O WITH ACUTE
+ : 006F 0301
+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+ : 006F 0302
+00F5 LATIN SMALL LETTER O WITH TILDE
+ * Portuguese, Estonian
+ : 006F 0303
+00F6 LATIN SMALL LETTER O WITH DIAERESIS
+ : 006F 0308
+@ Mathematical operator
+00F7 DIVISION SIGN
+ x (division slash - 2215)
+ x (divides - 2223)
+@ Letters
+00F8 LATIN SMALL LETTER O WITH STROKE
+ = o slash
+ * Danish, Norwegian, Faroese, IPA
+00F9 LATIN SMALL LETTER U WITH GRAVE
+ * French, Italian
+ : 0075 0300
+00FA LATIN SMALL LETTER U WITH ACUTE
+ : 0075 0301
+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+ : 0075 0302
+00FC LATIN SMALL LETTER U WITH DIAERESIS
+ : 0075 0308
+00FD LATIN SMALL LETTER Y WITH ACUTE
+ * Czech, Slovak, Icelandic, Faroese, Welsh, Malagasy
+ : 0079 0301
+00FE LATIN SMALL LETTER THORN (Icelandic)
+ * Icelandic, Old English, phonetics
+ * Runic letter borrowed into Latin script
+ x (runic letter thurisaz thurs thorn - 16A6)
+00FF LATIN SMALL LETTER Y WITH DIAERESIS
+ * French
+ x (latin capital letter y with diaeresis - 0178)
+ : 0079 0308
+@@ 0100 Latin Extended-A 017F
+@ European Latin
+0100 LATIN CAPITAL LETTER A WITH MACRON
+ : 0041 0304
+0101 LATIN SMALL LETTER A WITH MACRON
+ * Latvian, Latin, ...
+ : 0061 0304
+0102 LATIN CAPITAL LETTER A WITH BREVE
+ : 0041 0306
+0103 LATIN SMALL LETTER A WITH BREVE
+ * Romanian, Vietnamese, Latin, ...
+ : 0061 0306
+0104 LATIN CAPITAL LETTER A WITH OGONEK
+ : 0041 0328
+0105 LATIN SMALL LETTER A WITH OGONEK
+ * Polish, Lithuanian, ...
+ : 0061 0328
+0106 LATIN CAPITAL LETTER C WITH ACUTE
+ : 0043 0301
+0107 LATIN SMALL LETTER C WITH ACUTE
+ * Polish, Croatian, ...
+ x (cyrillic small letter tshe - 045B)
+ : 0063 0301
+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+ : 0043 0302
+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX
+ * Esperanto
+ : 0063 0302
+010A LATIN CAPITAL LETTER C WITH DOT ABOVE
+ : 0043 0307
+010B LATIN SMALL LETTER C WITH DOT ABOVE
+ * Maltese, Irish Gaelic (old orthography)
+ : 0063 0307
+010C LATIN CAPITAL LETTER C WITH CARON
+ : 0043 030C
+010D LATIN SMALL LETTER C WITH CARON
+ * Czech, Slovak, Slovenian, and many other languages
+ : 0063 030C
+010E LATIN CAPITAL LETTER D WITH CARON
+ * the form using caron/hacek is preferred in all contexts
+ : 0044 030C
+010F LATIN SMALL LETTER D WITH CARON
+ * Czech, Slovak
+ * the form using apostrophe is preferred in typesetting
+ : 0064 030C
+0110 LATIN CAPITAL LETTER D WITH STROKE
+ x (latin capital letter eth - 00D0)
+ x (latin small letter d with stroke - 0111)
+ x (latin capital letter african d - 0189)
+0111 LATIN SMALL LETTER D WITH STROKE
+ * Croatian, Vietnamese, Sami
+ * an alternate glyph with the stroke through the bowl is used in Americanist orthographies
+ x (latin capital letter d with stroke - 0110)
+ x (cyrillic small letter dje - 0452)
+0112 LATIN CAPITAL LETTER E WITH MACRON
+ : 0045 0304
+0113 LATIN SMALL LETTER E WITH MACRON
+ * Latvian, Latin, ...
+ : 0065 0304
+0114 LATIN CAPITAL LETTER E WITH BREVE
+ : 0045 0306
+0115 LATIN SMALL LETTER E WITH BREVE
+ * Malay, Latin, ...
+ : 0065 0306
+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE
+ : 0045 0307
+0117 LATIN SMALL LETTER E WITH DOT ABOVE
+ * Lithuanian
+ : 0065 0307
+0118 LATIN CAPITAL LETTER E WITH OGONEK
+ : 0045 0328
+0119 LATIN SMALL LETTER E WITH OGONEK
+ * Polish, Lithuanian, ...
+ : 0065 0328
+011A LATIN CAPITAL LETTER E WITH CARON
+ : 0045 030C
+011B LATIN SMALL LETTER E WITH CARON
+ * Czech, ...
+ : 0065 030C
+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+ : 0047 0302
+011D LATIN SMALL LETTER G WITH CIRCUMFLEX
+ * Esperanto
+ : 0067 0302
+011E LATIN CAPITAL LETTER G WITH BREVE
+ : 0047 0306
+011F LATIN SMALL LETTER G WITH BREVE
+ * Turkish, Azerbaijani
+ x (latin small letter g with caron - 01E7)
+ : 0067 0306
+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE
+ : 0047 0307
+0121 LATIN SMALL LETTER G WITH DOT ABOVE
+ * Maltese, Irish Gaelic (old orthography)
+ : 0067 0307
+0122 LATIN CAPITAL LETTER G WITH CEDILLA
+ : 0047 0327
+0123 LATIN SMALL LETTER G WITH CEDILLA
+ * Latvian
+ * there are three major glyph variants
+ : 0067 0327
+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+ : 0048 0302
+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX
+ * Esperanto
+ : 0068 0302
+0126 LATIN CAPITAL LETTER H WITH STROKE
+0127 LATIN SMALL LETTER H WITH STROKE
+ * Maltese, IPA, ...
+ x (cyrillic small letter tshe - 045B)
+ x (planck constant over two pi - 210F)
+0128 LATIN CAPITAL LETTER I WITH TILDE
+ : 0049 0303
+0129 LATIN SMALL LETTER I WITH TILDE
+ * Greenlandic (old orthography)
+ : 0069 0303
+012A LATIN CAPITAL LETTER I WITH MACRON
+ : 0049 0304
+012B LATIN SMALL LETTER I WITH MACRON
+ * Latvian, Latin, ...
+ : 0069 0304
+012C LATIN CAPITAL LETTER I WITH BREVE
+ : 0049 0306
+012D LATIN SMALL LETTER I WITH BREVE
+ * Latin, ...
+ : 0069 0306
+012E LATIN CAPITAL LETTER I WITH OGONEK
+ : 0049 0328
+012F LATIN SMALL LETTER I WITH OGONEK
+ * Lithuanian, ...
+ : 0069 0328
+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
+ = i dot
+ * Turkish, Azerbaijani
+ * lowercase is 0069
+ x (latin capital letter i - 0049)
+ : 0049 0307
+0131 LATIN SMALL LETTER DOTLESS I
+ * Turkish, Azerbaijani
+ * uppercase is 0049
+ x (latin small letter i - 0069)
+0132 LATIN CAPITAL LIGATURE IJ
+ # 0049 004A
+0133 LATIN SMALL LIGATURE IJ
+ * Dutch
+ # 0069 006A
+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+ : 004A 0302
+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX
+ * Esperanto
+ : 006A 0302
+0136 LATIN CAPITAL LETTER K WITH CEDILLA
+ : 004B 0327
+0137 LATIN SMALL LETTER K WITH CEDILLA
+ * Latvian
+ : 006B 0327
+0138 LATIN SMALL LETTER KRA (Greenlandic)
+ * Greenlandic (old orthography)
+0139 LATIN CAPITAL LETTER L WITH ACUTE
+ : 004C 0301
+013A LATIN SMALL LETTER L WITH ACUTE
+ * Slovak
+ : 006C 0301
+013B LATIN CAPITAL LETTER L WITH CEDILLA
+ : 004C 0327
+013C LATIN SMALL LETTER L WITH CEDILLA
+ * Latvian
+ : 006C 0327
+013D LATIN CAPITAL LETTER L WITH CARON
+ * the form using apostrophe is preferred in typesetting
+ : 004C 030C
+013E LATIN SMALL LETTER L WITH CARON
+ * Slovak
+ * the form using apostrophe is preferred in typesetting
+ : 006C 030C
+013F LATIN CAPITAL LETTER L WITH MIDDLE DOT
+ * some fonts show the middle dot inside the L, but the preferred form has the dot following the L
+ # 004C 00B7
+0140 LATIN SMALL LETTER L WITH MIDDLE DOT
+ * Catalan legacy compatibility character for ISO 6937
+ * preferred representation for Catalan: 006C 00B7
+ # 006C 00B7
+0141 LATIN CAPITAL LETTER L WITH STROKE
+ x (latin capital letter l with bar - 023D)
+0142 LATIN SMALL LETTER L WITH STROKE
+ * Polish, ...
+ x (latin small letter l with bar - 019A)
+0143 LATIN CAPITAL LETTER N WITH ACUTE
+ : 004E 0301
+0144 LATIN SMALL LETTER N WITH ACUTE
+ * Polish, ...
+ : 006E 0301
+0145 LATIN CAPITAL LETTER N WITH CEDILLA
+ : 004E 0327
+0146 LATIN SMALL LETTER N WITH CEDILLA
+ * Latvian
+ : 006E 0327
+0147 LATIN CAPITAL LETTER N WITH CARON
+ : 004E 030C
+0148 LATIN SMALL LETTER N WITH CARON
+ * Czech, Slovak
+ : 006E 030C
+0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+ = latin small letter apostrophe n (1.0)
+ * Afrikaans
+ * legacy compatibility character for ISO/IEC 6937
+ * uppercase is 02BC 004E
+ # 02BC 006E
+014A LATIN CAPITAL LETTER ENG (Sami)
+ * glyph may also have appearance of large form of the small letter
+014B LATIN SMALL LETTER ENG (Sami)
+ = engma, angma
+ * Sami, Mende, IPA, ...
+014C LATIN CAPITAL LETTER O WITH MACRON
+ : 004F 0304
+014D LATIN SMALL LETTER O WITH MACRON
+ * Latvian, Latin, ...
+ : 006F 0304
+014E LATIN CAPITAL LETTER O WITH BREVE
+ : 004F 0306
+014F LATIN SMALL LETTER O WITH BREVE
+ * Latin
+ : 006F 0306
+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+ : 004F 030B
+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE
+ * Hungarian
+ : 006F 030B
+0152 LATIN CAPITAL LIGATURE OE
+0153 LATIN SMALL LIGATURE OE
+ = ethel (from Old English eðel)
+ * French, IPA, Old Icelandic, Old English, ...
+ x (latin small letter ae - 00E6)
+ x (latin letter small capital oe - 0276)
+0154 LATIN CAPITAL LETTER R WITH ACUTE
+ : 0052 0301
+0155 LATIN SMALL LETTER R WITH ACUTE
+ * Slovak, ...
+ : 0072 0301
+0156 LATIN CAPITAL LETTER R WITH CEDILLA
+ : 0052 0327
+0157 LATIN SMALL LETTER R WITH CEDILLA
+ * Livonian
+ : 0072 0327
+0158 LATIN CAPITAL LETTER R WITH CARON
+ : 0052 030C
+0159 LATIN SMALL LETTER R WITH CARON
+ * Czech, ...
+ : 0072 030C
+015A LATIN CAPITAL LETTER S WITH ACUTE
+ : 0053 0301
+015B LATIN SMALL LETTER S WITH ACUTE
+ * Polish, Indic transliteration, ...
+ : 0073 0301
+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+ : 0053 0302
+015D LATIN SMALL LETTER S WITH CIRCUMFLEX
+ * Esperanto
+ : 0073 0302
+015E LATIN CAPITAL LETTER S WITH CEDILLA *
+ : 0053 0327
+015F LATIN SMALL LETTER S WITH CEDILLA *
+ * Turkish, Azerbaijani, Romanian, ...
+ * this character is used in both Turkish and Romanian data
+ * a glyph variant with comma below is preferred for Romanian
+ x (latin small letter s with comma below - 0219)
+ : 0073 0327
+0160 LATIN CAPITAL LETTER S WITH CARON
+ : 0053 030C
+0161 LATIN SMALL LETTER S WITH CARON
+ * Czech, Estonian, Finnish, Slovak, and many other languages
+ : 0073 030C
+0162 LATIN CAPITAL LETTER T WITH CEDILLA *
+ : 0054 0327
+0163 LATIN SMALL LETTER T WITH CEDILLA *
+ * Romanian, Semitic transliteration, ...
+ * this character is used in Romanian data
+ * a glyph variant with comma below is preferred for Romanian
+ x (latin small letter t with comma below - 021B)
+ : 0074 0327
+0164 LATIN CAPITAL LETTER T WITH CARON
+ * the form using caron/hacek is preferred in all contexts
+ : 0054 030C
+0165 LATIN SMALL LETTER T WITH CARON
+ * Czech, Slovak
+ * the form using apostrophe is preferred in typesetting
+ : 0074 030C
+0166 LATIN CAPITAL LETTER T WITH STROKE
+0167 LATIN SMALL LETTER T WITH STROKE
+ * Sami
+0168 LATIN CAPITAL LETTER U WITH TILDE
+ : 0055 0303
+0169 LATIN SMALL LETTER U WITH TILDE
+ * Greenlandic (old orthography)
+ : 0075 0303
+016A LATIN CAPITAL LETTER U WITH MACRON
+ : 0055 0304
+016B LATIN SMALL LETTER U WITH MACRON
+ * Latvian, Lithuanian, Latin, ...
+ : 0075 0304
+016C LATIN CAPITAL LETTER U WITH BREVE
+ : 0055 0306
+016D LATIN SMALL LETTER U WITH BREVE
+ * Latin, Esperanto, ...
+ : 0075 0306
+016E LATIN CAPITAL LETTER U WITH RING ABOVE
+ : 0055 030A
+016F LATIN SMALL LETTER U WITH RING ABOVE
+ * Czech, ...
+ : 0075 030A
+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+ : 0055 030B
+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE
+ * Hungarian
+ : 0075 030B
+0172 LATIN CAPITAL LETTER U WITH OGONEK
+ : 0055 0328
+0173 LATIN SMALL LETTER U WITH OGONEK
+ * Lithuanian
+ : 0075 0328
+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+ : 0057 0302
+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX
+ * Welsh
+ : 0077 0302
+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+ : 0059 0302
+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX
+ * Welsh
+ : 0079 0302
+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
+ * French, Igbo
+ x (latin small letter y with diaeresis - 00FF)
+ : 0059 0308
+0179 LATIN CAPITAL LETTER Z WITH ACUTE
+ : 005A 0301
+017A LATIN SMALL LETTER Z WITH ACUTE
+ * Polish, ...
+ : 007A 0301
+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ : 005A 0307
+017C LATIN SMALL LETTER Z WITH DOT ABOVE
+ * Polish, ...
+ : 007A 0307
+017D LATIN CAPITAL LETTER Z WITH CARON
+ : 005A 030C
+017E LATIN SMALL LETTER Z WITH CARON
+ * Czech, Estonian, Finnish, Slovak, Slovenian, and many other languages
+ : 007A 030C
+017F LATIN SMALL LETTER LONG S
+ * in common use in Roman types until the 18th century
+ * in current use in Fraktur and Gaelic types
+ # 0073 latin small letter s
+@@ 0180 Latin Extended-B 024F
+@ Non-European and historic Latin
+0180 LATIN SMALL LETTER B WITH STROKE
+ * Americanist and Indo-Europeanist usage for phonetic beta
+ * Americanist orthographies use an alternate glyph with the stroke through the bowl
+ * Old Saxon
+ * uppercase is 0243
+ x (greek small letter beta - 03B2)
+ x (blank symbol - 2422)
+0181 LATIN CAPITAL LETTER B WITH HOOK
+ * Zulu, Pan-Nigerian alphabet
+ x (latin small letter b with hook - 0253)
+0182 LATIN CAPITAL LETTER B WITH TOPBAR
+0183 LATIN SMALL LETTER B WITH TOPBAR
+ * Zhuang (old orthography)
+ * former Soviet minority language scripts
+ x (cyrillic capital letter be - 0411)
+0184 LATIN CAPITAL LETTER TONE SIX
+0185 LATIN SMALL LETTER TONE SIX
+ * Zhuang (old orthography)
+ * Zhuang tone three is Cyrillic ze
+ * Zhuang tone four is Cyrillic che
+ x (latin small letter tone two - 01A8)
+ x (latin small letter tone five - 01BD)
+ x (cyrillic small letter ze - 0437)
+ x (cyrillic small letter che - 0447)
+ x (cyrillic small letter soft sign - 044C)
+0186 LATIN CAPITAL LETTER OPEN O
+ * typographically a turned C
+ * African
+ x (latin small letter open o - 0254)
+0187 LATIN CAPITAL LETTER C WITH HOOK
+0188 LATIN SMALL LETTER C WITH HOOK
+ * African
+0189 LATIN CAPITAL LETTER AFRICAN D *
+ * Ewe
+ * lowercase is 0256
+ x (latin capital letter eth - 00D0)
+ x (latin capital letter d with stroke - 0110)
+018A LATIN CAPITAL LETTER D WITH HOOK
+ * Pan-Nigerian alphabet
+ x (latin small letter d with hook - 0257)
+018B LATIN CAPITAL LETTER D WITH TOPBAR
+018C LATIN SMALL LETTER D WITH TOPBAR
+ * former-Soviet minority language scripts
+ * Zhuang (old orthography)
+018D LATIN SMALL LETTER TURNED DELTA
+ = reversed Polish-hook o
+ * archaic phonetic for labialized alveolar fricative
+ * recommended spellings 007A 02B7 or 007A 032B
+018E LATIN CAPITAL LETTER REVERSED E
+ = turned e
+ * Pan-Nigerian alphabet
+ * lowercase is 01DD
+018F LATIN CAPITAL LETTER SCHWA
+ * Azerbaijani, ...
+ x (latin small letter schwa - 0259)
+ x (cyrillic capital letter schwa - 04D8)
+0190 LATIN CAPITAL LETTER OPEN E
+ = epsilon
+ * African
+ x (latin small letter open e - 025B)
+ x (euler constant - 2107)
+0191 LATIN CAPITAL LETTER F WITH HOOK
+ * African
+0192 LATIN SMALL LETTER F WITH HOOK
+ = script f
+ = Florin currency symbol (Netherlands)
+ = function symbol
+ * used as abbreviation convention for folder
+0193 LATIN CAPITAL LETTER G WITH HOOK
+ * African
+ x (latin small letter g with hook - 0260)
+0194 LATIN CAPITAL LETTER GAMMA
+ * African
+ x (latin small letter gamma - 0263)
+0195 LATIN SMALL LETTER HV (hwair)
+ * Gothic transliteration
+ * uppercase is 01F6
+0196 LATIN CAPITAL LETTER IOTA
+ * African
+ x (latin small letter iota - 0269)
+0197 LATIN CAPITAL LETTER I WITH STROKE
+ = barred i, i bar
+ * African
+ * ISO 6438 gives lowercase as 026A, not 0268
+ x (latin letter small capital i - 026A)
+0198 LATIN CAPITAL LETTER K WITH HOOK
+0199 LATIN SMALL LETTER K WITH HOOK
+ * Hausa, Pan-Nigerian alphabet
+019A LATIN SMALL LETTER L WITH BAR
+ = barred l
+ * Americanist phonetic usage for 026C
+ x (latin small letter l with stroke - 0142)
+ x (latin capital letter l with bar - 023D)
+019B LATIN SMALL LETTER LAMBDA WITH STROKE
+ = barred lambda, lambda bar
+ * Americanist phonetic usage
+019C LATIN CAPITAL LETTER TURNED M
+ * Zhuang (old orthography)
+ x (latin small letter turned m - 026F)
+019D LATIN CAPITAL LETTER N WITH LEFT HOOK
+ * African
+ x (latin small letter n with left hook - 0272)
+019E LATIN SMALL LETTER N WITH LONG RIGHT LEG
+ * archaic phonetic for Japanese 3093
+ * recommended spelling for syllabic n is 006E 0329
+ * Lakota (indicates nasalization of vowel)
+ x (latin capital letter n with long right leg - 0220)
+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE *
+ = barred o, o bar
+ * lowercase is 0275
+ * African
+ x (cyrillic capital letter barred o - 04E8)
+01A0 LATIN CAPITAL LETTER O WITH HORN
+ : 004F 031B
+01A1 LATIN SMALL LETTER O WITH HORN
+ * Vietnamese
+ : 006F 031B
+01A2 LATIN CAPITAL LETTER OI (gha)
+ % LATIN CAPITAL LETTER GHA
+01A3 LATIN SMALL LETTER OI (gha)
+ % LATIN SMALL LETTER GHA
+ * Pan-Turkic Latin alphabets
+01A4 LATIN CAPITAL LETTER P WITH HOOK
+01A5 LATIN SMALL LETTER P WITH HOOK
+ * African
+01A6 LATIN LETTER YR *
+ * Old Norse
+ * from German Standard DIN 31624 and ISO 5246-2
+ * lowercase is 0280
+01A7 LATIN CAPITAL LETTER TONE TWO
+01A8 LATIN SMALL LETTER TONE TWO
+ * Zhuang (old orthography)
+ * typographically a reversed S
+ x (latin small letter tone six - 0185)
+01A9 LATIN CAPITAL LETTER ESH
+ * African
+ x (latin small letter esh - 0283)
+ x (greek capital letter sigma - 03A3)
+01AA LATIN LETTER REVERSED ESH LOOP
+ * archaic phonetic for labialized palatoalveolar or palatal fricative
+ * Twi
+ * recommended spellings 0283 02B7, 00E7 02B7, 0068 0265, etc.
+01AB LATIN SMALL LETTER T WITH PALATAL HOOK
+ * archaic phonetic for palatalized alveolar or dental stop
+ * recommended spelling 0074 02B2
+01AC LATIN CAPITAL LETTER T WITH HOOK
+ * a glyph variant with hook at the right also occurs
+01AD LATIN SMALL LETTER T WITH HOOK
+ * African
+01AE LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+ * African
+ x (latin small letter t with retroflex hook - 0288)
+01AF LATIN CAPITAL LETTER U WITH HORN
+ : 0055 031B
+01B0 LATIN SMALL LETTER U WITH HORN
+ * Vietnamese
+ : 0075 031B
+01B1 LATIN CAPITAL LETTER UPSILON
+ * African
+ * typographically based on turned capital Greek omega
+ x (latin small letter upsilon - 028A)
+ x (inverted ohm sign - 2127)
+01B2 LATIN CAPITAL LETTER V WITH HOOK
+ = script v
+ * African
+ x (latin small letter v with hook - 028B)
+01B3 LATIN CAPITAL LETTER Y WITH HOOK
+ * a glyph variant with hook at the left also occurs
+01B4 LATIN SMALL LETTER Y WITH HOOK
+ * Bini, Esoko, and other Edo languages in West Africa
+01B5 LATIN CAPITAL LETTER Z WITH STROKE
+01B6 LATIN SMALL LETTER Z WITH STROKE
+ = barred z, z bar
+ * Pan-Turkic Latin orthography
+ * handwritten variant of Latin "z"
+ x (latin small letter z - 007A)
+01B7 LATIN CAPITAL LETTER EZH
+ * African, Skolt Sami
+ * lowercase is 0292
+ x (latin capital letter yogh - 021C)
+ x (cyrillic capital letter abkhasian dze - 04E0)
+01B8 LATIN CAPITAL LETTER EZH REVERSED
+01B9 LATIN SMALL LETTER EZH REVERSED
+ * archaic phonetic for voiced pharyngeal fricative
+ * sometimes typographically rendered with a turned digit 3
+ * recommended spelling 0295
+ x (latin letter pharyngeal voiced fricative - 0295)
+ x (arabic letter ain - 0639)
+01BA LATIN SMALL LETTER EZH WITH TAIL
+ * archaic phonetic for labialized voiced palatoalveolar or palatal fricative
+ * Twi
+ * recommended spellings 0292 02B7 or 006A 02B7
+01BB LATIN LETTER TWO WITH STROKE
+ * archaic phonetic for [dz] affricate
+ * recommended spellings 0292 or 0064 007A
+01BC LATIN CAPITAL LETTER TONE FIVE
+01BD LATIN SMALL LETTER TONE FIVE
+ * Zhuang (old orthography)
+ x (latin small letter tone six - 0185)
+01BE LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+ * archaic phonetic for [ts] affricate
+ * recommended spelling 0074 0073
+ * letter form is actually derived from ligation of ts, rather than inverted glottal stop
+01BF LATIN LETTER WYNN
+ = wen
+ * Runic letter borrowed into Latin script
+ * replaced by "w" in modern transcriptions of Old English
+ * uppercase is 01F7
+ x (runic letter wunjo wynn w - 16B9)
+@ African letters for clicks
+01C0 LATIN LETTER DENTAL CLICK
+ = pipe
+ * Khoisan tradition
+ * "c" in Zulu orthography
+ x (solidus - 002F)
+ x (vertical line - 007C)
+ x (latin small letter turned t - 0287)
+ x (divides - 2223)
+01C1 LATIN LETTER LATERAL CLICK
+ = double pipe
+ * Khoisan tradition
+ * "x" in Zulu orthography
+ x (latin letter inverted glottal stop - 0296)
+ x (parallel to - 2225)
+01C2 LATIN LETTER ALVEOLAR CLICK
+ = double-barred pipe
+ = palatoalveolar click (IPA)
+ * Khoisan tradition
+ x (not equal to - 2260)
+01C3 LATIN LETTER RETROFLEX CLICK
+ = latin letter exclamation mark (1.0)
+ = (post)alveolar click (IPA)
+ * Khoisan tradition
+ * "q" in Zulu orthography
+ x (exclamation mark - 0021)
+ x (latin letter stretched c - 0297)
+@ Croatian digraphs matching Serbian Cyrillic letters
+01C4 LATIN CAPITAL LETTER DZ WITH CARON
+ # 0044 017D
+01C5 LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+ # 0044 017E
+01C6 LATIN SMALL LETTER DZ WITH CARON
+ x (cyrillic small letter dzhe - 045F)
+ # 0064 017E
+01C7 LATIN CAPITAL LETTER LJ
+ # 004C 004A
+01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J
+ # 004C 006A
+01C9 LATIN SMALL LETTER LJ
+ x (cyrillic small letter lje - 0459)
+ # 006C 006A
+01CA LATIN CAPITAL LETTER NJ
+ # 004E 004A
+01CB LATIN CAPITAL LETTER N WITH SMALL LETTER J
+ # 004E 006A
+01CC LATIN SMALL LETTER NJ
+ x (cyrillic small letter nje - 045A)
+ # 006E 006A
+@ Pinyin diacritic-vowel combinations
+01CD LATIN CAPITAL LETTER A WITH CARON
+ : 0041 030C
+01CE LATIN SMALL LETTER A WITH CARON
+ * Pinyin third tone
+ : 0061 030C
+01CF LATIN CAPITAL LETTER I WITH CARON
+ : 0049 030C
+01D0 LATIN SMALL LETTER I WITH CARON
+ * Pinyin third tone
+ : 0069 030C
+01D1 LATIN CAPITAL LETTER O WITH CARON
+ : 004F 030C
+01D2 LATIN SMALL LETTER O WITH CARON
+ * Pinyin third tone
+ : 006F 030C
+01D3 LATIN CAPITAL LETTER U WITH CARON
+ : 0055 030C
+01D4 LATIN SMALL LETTER U WITH CARON
+ * Pinyin third tone
+ : 0075 030C
+01D5 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+ : 00DC 0304
+01D6 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+ * Pinyin first tone
+ : 00FC 0304
+01D7 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+ : 00DC 0301
+01D8 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+ * Pinyin second tone
+ : 00FC 0301
+01D9 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+ : 00DC 030C
+01DA LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+ * Pinyin third tone
+ : 00FC 030C
+01DB LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+ : 00DC 0300
+01DC LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+ * Pinyin fourth tone
+ : 00FC 0300
+@ Phonetic and historic letters
+01DD LATIN SMALL LETTER TURNED E
+ * Pan-Nigerian alphabet
+ * all other usages of schwa are 0259
+ * uppercase is 018E
+ x (latin small letter schwa - 0259)
+01DE LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+ : 00C4 0304
+01DF LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+ * Livonian, Uralicist usage
+ : 00E4 0304
+01E0 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+ : 0226 0304
+01E1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+ * Uralicist usage
+ : 0227 0304
+01E2 LATIN CAPITAL LETTER AE WITH MACRON (ash) *
+ : 00C6 0304
+01E3 LATIN SMALL LETTER AE WITH MACRON (ash) *
+ * Old Norse, Old English
+ : 00E6 0304
+01E4 LATIN CAPITAL LETTER G WITH STROKE
+01E5 LATIN SMALL LETTER G WITH STROKE
+ * Skolt Sami
+01E6 LATIN CAPITAL LETTER G WITH CARON
+ : 0047 030C
+01E7 LATIN SMALL LETTER G WITH CARON
+ * Skolt Sami
+ x (latin small letter g with breve - 011F)
+ : 0067 030C
+01E8 LATIN CAPITAL LETTER K WITH CARON
+ : 004B 030C
+01E9 LATIN SMALL LETTER K WITH CARON
+ * Skolt Sami
+ : 006B 030C
+01EA LATIN CAPITAL LETTER O WITH OGONEK
+ : 004F 0328
+01EB LATIN SMALL LETTER O WITH OGONEK
+ * Sami, Iroquoian, Old Icelandic
+ : 006F 0328
+01EC LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+ : 01EA 0304
+01ED LATIN SMALL LETTER O WITH OGONEK AND MACRON
+ * Old Icelandic
+ : 01EB 0304
+01EE LATIN CAPITAL LETTER EZH WITH CARON
+ : 01B7 030C
+01EF LATIN SMALL LETTER EZH WITH CARON
+ * Skolt Sami
+ : 0292 030C
+01F0 LATIN SMALL LETTER J WITH CARON
+ * IPA and many languages
+ : 006A 030C
+01F1 LATIN CAPITAL LETTER DZ
+ # 0044 005A
+01F2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+ # 0044 007A
+01F3 LATIN SMALL LETTER DZ
+ # 0064 007A
+01F4 LATIN CAPITAL LETTER G WITH ACUTE
+ : 0047 0301
+01F5 LATIN SMALL LETTER G WITH ACUTE
+ * Macedonian and Serbian transliteration
+ : 0067 0301
+01F6 LATIN CAPITAL LETTER HWAIR
+ * lowercase is 0195
+01F7 LATIN CAPITAL LETTER WYNN
+ = wen
+ * lowercase is 01BF
+01F8 LATIN CAPITAL LETTER N WITH GRAVE
+ : 004E 0300
+01F9 LATIN SMALL LETTER N WITH GRAVE
+ * Pinyin
+ : 006E 0300
+01FA LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+ : 00C5 0301
+01FB LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+ : 00E5 0301
+01FC LATIN CAPITAL LETTER AE WITH ACUTE (ash) *
+ : 00C6 0301
+01FD LATIN SMALL LETTER AE WITH ACUTE (ash) *
+ : 00E6 0301
+01FE LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+ : 00D8 0301
+01FF LATIN SMALL LETTER O WITH STROKE AND ACUTE
+ : 00F8 0301
+@ Additions for Slovenian and Croatian
+0200 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+ : 0041 030F
+0201 LATIN SMALL LETTER A WITH DOUBLE GRAVE
+ : 0061 030F
+0202 LATIN CAPITAL LETTER A WITH INVERTED BREVE
+ : 0041 0311
+0203 LATIN SMALL LETTER A WITH INVERTED BREVE
+ : 0061 0311
+0204 LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+ : 0045 030F
+0205 LATIN SMALL LETTER E WITH DOUBLE GRAVE
+ : 0065 030F
+0206 LATIN CAPITAL LETTER E WITH INVERTED BREVE
+ : 0045 0311
+0207 LATIN SMALL LETTER E WITH INVERTED BREVE
+ : 0065 0311
+0208 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+ : 0049 030F
+0209 LATIN SMALL LETTER I WITH DOUBLE GRAVE
+ : 0069 030F
+020A LATIN CAPITAL LETTER I WITH INVERTED BREVE
+ : 0049 0311
+020B LATIN SMALL LETTER I WITH INVERTED BREVE
+ : 0069 0311
+020C LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+ : 004F 030F
+020D LATIN SMALL LETTER O WITH DOUBLE GRAVE
+ : 006F 030F
+020E LATIN CAPITAL LETTER O WITH INVERTED BREVE
+ : 004F 0311
+020F LATIN SMALL LETTER O WITH INVERTED BREVE
+ : 006F 0311
+0210 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+ : 0052 030F
+0211 LATIN SMALL LETTER R WITH DOUBLE GRAVE
+ : 0072 030F
+0212 LATIN CAPITAL LETTER R WITH INVERTED BREVE
+ : 0052 0311
+0213 LATIN SMALL LETTER R WITH INVERTED BREVE
+ : 0072 0311
+0214 LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+ : 0055 030F
+0215 LATIN SMALL LETTER U WITH DOUBLE GRAVE
+ : 0075 030F
+0216 LATIN CAPITAL LETTER U WITH INVERTED BREVE
+ : 0055 0311
+0217 LATIN SMALL LETTER U WITH INVERTED BREVE
+ : 0075 0311
+@ Additions for Romanian
+0218 LATIN CAPITAL LETTER S WITH COMMA BELOW *
+ : 0053 0326
+0219 LATIN SMALL LETTER S WITH COMMA BELOW *
+ * Romanian, when distinct comma below form is required
+ x (latin small letter s with cedilla - 015F)
+ : 0073 0326
+021A LATIN CAPITAL LETTER T WITH COMMA BELOW *
+ : 0054 0326
+021B LATIN SMALL LETTER T WITH COMMA BELOW *
+ * Romanian, when distinct comma below form is required
+ x (latin small letter t with cedilla - 0163)
+ : 0074 0326
+@ Miscellaneous additions
+021C LATIN CAPITAL LETTER YOGH
+ x (latin capital letter ezh - 01B7)
+021D LATIN SMALL LETTER YOGH
+ * Middle English, Scots
+ x (latin small letter ezh - 0292)
+ x (latin small letter insular g - 1D79)
+ x (ounce sign - 2125)
+021E LATIN CAPITAL LETTER H WITH CARON
+ : 0048 030C
+021F LATIN SMALL LETTER H WITH CARON
+ * Finnish Romany
+ : 0068 030C
+0220 LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+ * Lakota
+ x (latin small letter n with long right leg - 019E)
+0221 LATIN SMALL LETTER D WITH CURL
+ * phonetic use in Sinology
+0222 LATIN CAPITAL LETTER OU
+0223 LATIN SMALL LETTER OU
+ * Algonquin, Huron
+ x (digit eight - 0038)
+0224 LATIN CAPITAL LETTER Z WITH HOOK
+0225 LATIN SMALL LETTER Z WITH HOOK
+ * Middle High German
+0226 LATIN CAPITAL LETTER A WITH DOT ABOVE
+ : 0041 0307
+0227 LATIN SMALL LETTER A WITH DOT ABOVE
+ * Uralicist usage
+ : 0061 0307
+0228 LATIN CAPITAL LETTER E WITH CEDILLA
+ : 0045 0327
+0229 LATIN SMALL LETTER E WITH CEDILLA
+ : 0065 0327
+@ Additions for Livonian
+022A LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+ : 00D6 0304
+022B LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+ : 00F6 0304
+022C LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+ : 00D5 0304
+022D LATIN SMALL LETTER O WITH TILDE AND MACRON
+ : 00F5 0304
+022E LATIN CAPITAL LETTER O WITH DOT ABOVE
+ : 004F 0307
+022F LATIN SMALL LETTER O WITH DOT ABOVE
+ : 006F 0307
+0230 LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+ : 022E 0304
+0231 LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+ : 022F 0304
+0232 LATIN CAPITAL LETTER Y WITH MACRON
+ : 0059 0304
+0233 LATIN SMALL LETTER Y WITH MACRON
+ * also Cornish
+ : 0079 0304
+@ Additions for Sinology
+0234 LATIN SMALL LETTER L WITH CURL
+0235 LATIN SMALL LETTER N WITH CURL
+0236 LATIN SMALL LETTER T WITH CURL
+@ Miscellaneous additions
+0237 LATIN SMALL LETTER DOTLESS J
+ x (mathematical italic small dotless j - 1D6A5)
+0238 LATIN SMALL LETTER DB DIGRAPH
+ * used in Africanist linguistics
+0239 LATIN SMALL LETTER QP DIGRAPH
+ * used in Africanist linguistics
+023A LATIN CAPITAL LETTER A WITH STROKE
+ * Sencoten
+ * lowercase is 2C65
+023B LATIN CAPITAL LETTER C WITH STROKE
+ * Sencoten
+023C LATIN SMALL LETTER C WITH STROKE
+ * used in Americanist linguistics
+023D LATIN CAPITAL LETTER L WITH BAR
+ * Sencoten
+ * lowercase is 019A
+023E LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+ * Sencoten
+ * lowercase is 2C66
+023F LATIN SMALL LETTER S WITH SWASH TAIL
+0240 LATIN SMALL LETTER Z WITH SWASH TAIL
+0241 LATIN CAPITAL LETTER GLOTTAL STOP
+0242 LATIN SMALL LETTER GLOTTAL STOP
+ * casing use in Chipewyan, Dogrib, Slavey (Canadian aboriginal orthographies)
+ x (latin letter glottal stop - 0294)
+ x (modifier letter glottal stop - 02C0)
+0243 LATIN CAPITAL LETTER B WITH STROKE
+ * lowercase is 0180
+0244 LATIN CAPITAL LETTER U BAR
+ * lowercase is 0289
+0245 LATIN CAPITAL LETTER TURNED V
+ * lowercase is 028C
+0246 LATIN CAPITAL LETTER E WITH STROKE
+0247 LATIN SMALL LETTER E WITH STROKE
+0248 LATIN CAPITAL LETTER J WITH STROKE
+0249 LATIN SMALL LETTER J WITH STROKE
+024A LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+024B LATIN SMALL LETTER Q WITH HOOK TAIL
+024C LATIN CAPITAL LETTER R WITH STROKE
+024D LATIN SMALL LETTER R WITH STROKE
+024E LATIN CAPITAL LETTER Y WITH STROKE
+024F LATIN SMALL LETTER Y WITH STROKE
+@@ 0250 IPA Extensions 02AF
+@ IPA extensions
+@+ IPA includes basic Latin letters and a number of Latin or Greek letters from other blocks.
+ x (latin small letter ae - 00E6)
+ x (latin small letter c with cedilla - 00E7)
+ x (latin small letter eth - 00F0)
+ x (latin small letter o with stroke - 00F8)
+ x (latin small letter h with stroke - 0127)
+ x (latin small letter eng - 014B)
+ x (latin small ligature oe - 0153)
+ x (greek small letter beta - 03B2)
+ x (greek small letter theta - 03B8)
+ x (greek small letter lamda - 03BB)
+ x (greek small letter chi - 03C7)
+0250 LATIN SMALL LETTER TURNED A
+ * low central unrounded vowel
+ * uppercase is 2C6F
+0251 LATIN SMALL LETTER ALPHA
+ = latin small letter script a (1.0)
+ * low back unrounded vowel
+ * uppercase is 2C6D
+ x (greek small letter alpha - 03B1)
+0252 LATIN SMALL LETTER TURNED ALPHA
+ * low back rounded vowel
+0253 LATIN SMALL LETTER B WITH HOOK
+ * implosive bilabial stop
+ * Pan-Nigerian alphabet
+ x (latin capital letter b with hook - 0181)
+0254 LATIN SMALL LETTER OPEN O
+ * typographically a turned c
+ * lower-mid back rounded vowel
+ x (latin capital letter open o - 0186)
+0255 LATIN SMALL LETTER C WITH CURL
+ * voiceless alveolo-palatal laminal fricative
+ * used in transcription of Mandarin Chinese
+ * sound spelled with 015B in Polish
+0256 LATIN SMALL LETTER D WITH TAIL
+ = d retroflex hook
+ * voiced retroflex stop
+ x (latin capital letter african d - 0189)
+0257 LATIN SMALL LETTER D WITH HOOK
+ * implosive dental or alveolar stop
+ * Ewe, Pan-Nigerian alphabet
+ x (latin capital letter d with hook - 018A)
+0258 LATIN SMALL LETTER REVERSED E
+ * upper-mid central unrounded vowel
+0259 LATIN SMALL LETTER SCHWA
+ * mid-central unrounded vowel
+ * variant uppercase form 018E is associated with 01DD
+ x (latin capital letter schwa - 018F)
+ x (latin small letter turned e - 01DD)
+ x (cyrillic small letter schwa - 04D9)
+025A LATIN SMALL LETTER SCHWA WITH HOOK
+ * rhotacized schwa
+025B LATIN SMALL LETTER OPEN E
+ = epsilon
+ * lower-mid front unrounded vowel
+ x (latin capital letter open e - 0190)
+ x (greek small letter epsilon - 03B5)
+025C LATIN SMALL LETTER REVERSED OPEN E
+ * lower-mid central unrounded vowel
+025D LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+ * rhotacized lower-mid central vowel
+025E LATIN SMALL LETTER CLOSED REVERSED OPEN E
+ = closed reversed epsilon
+ * lower-mid central rounded vowel
+025F LATIN SMALL LETTER DOTLESS J WITH STROKE
+ * voiced palatal stop
+ * typographically a turned f, but better thought of as a form of j
+ * "gy" in Hungarian orthography
+ * also archaic phonetic for palatoalveolar affricate 02A4
+0260 LATIN SMALL LETTER G WITH HOOK
+ * implosive velar stop
+ x (latin capital letter g with hook - 0193)
+0261 LATIN SMALL LETTER SCRIPT G
+ * voiced velar stop
+ x (latin small letter g - 0067)
+0262 LATIN LETTER SMALL CAPITAL G
+ * voiced uvular stop
+0263 LATIN SMALL LETTER GAMMA
+ * voiced velar fricative
+ x (latin capital letter gamma - 0194)
+ x (greek small letter gamma - 03B3)
+0264 LATIN SMALL LETTER RAMS HORN
+ = latin small letter baby gamma (1.0)
+ * upper-mid back unrounded vowel
+0265 LATIN SMALL LETTER TURNED H
+ * voiced rounded palatal approximant
+0266 LATIN SMALL LETTER H WITH HOOK
+ * breathy-voiced glottal fricative
+ x (modifier letter small h with hook - 02B1)
+0267 LATIN SMALL LETTER HENG WITH HOOK
+ * voiceless coarticulated velar and palatoalveolar fricative
+ * "tj" or "kj" or "sj" in some Swedish dialects
+0268 LATIN SMALL LETTER I WITH STROKE
+ = barred i, i bar
+ * high central unrounded vowel
+ * ISO 6438 gives lowercase of 0197 as 026A, not 0268
+0269 LATIN SMALL LETTER IOTA
+ * semi-high front unrounded vowel
+@+ * obsoleted by IPA in 1989
+ * preferred use is 026A latin letter small capital i
+ x (latin capital letter iota - 0196)
+ x (greek small letter iota - 03B9)
+026A LATIN LETTER SMALL CAPITAL I
+ * semi-high front unrounded vowel
+ * preferred IPA alternate for 0269
+ x (latin capital letter i with stroke - 0197)
+026B LATIN SMALL LETTER L WITH MIDDLE TILDE
+ * velarized voiced alveolar lateral approximant
+ * uppercase is 2C62
+026C LATIN SMALL LETTER L WITH BELT
+ * voiceless alveolar lateral fricative
+026D LATIN SMALL LETTER L WITH RETROFLEX HOOK
+ * voiced retroflex lateral
+026E LATIN SMALL LETTER LEZH
+ * voiced lateral fricative
+ * "dhl" in Zulu orthography
+026F LATIN SMALL LETTER TURNED M
+ * high back unrounded vowel
+ x (latin capital letter turned m - 019C)
+0270 LATIN SMALL LETTER TURNED M WITH LONG LEG
+ * voiced velar approximant
+0271 LATIN SMALL LETTER M WITH HOOK
+ * voiced labiodental nasal
+ * uppercase is 2C6E
+0272 LATIN SMALL LETTER N WITH LEFT HOOK
+ * voiced palatal nasal
+ x (latin capital letter n with left hook - 019D)
+0273 LATIN SMALL LETTER N WITH RETROFLEX HOOK
+ * voiced retroflex nasal
+0274 LATIN LETTER SMALL CAPITAL N
+ * voiced uvular nasal
+0275 LATIN SMALL LETTER BARRED O
+ = o bar
+ * rounded mid-central vowel, i.e. rounded schwa
+ * uppercase is 019F
+ x (greek small letter theta - 03B8)
+ x (cyrillic small letter fita - 0473)
+ x (cyrillic small letter barred o - 04E9)
+0276 LATIN LETTER SMALL CAPITAL OE
+ * low front rounded vowel
+ x (latin small ligature oe - 0153)
+0277 LATIN SMALL LETTER CLOSED OMEGA
+ * semi-high back rounded vowel
+@+ * obsoleted by IPA in 1989
+ * preferred use is 028A latin small letter upsilon
+0278 LATIN SMALL LETTER PHI
+ * voiceless bilabial fricative
+ x (greek small letter phi - 03C6)
+0279 LATIN SMALL LETTER TURNED R
+ * voiced alveolar approximant
+ x (modifier letter small turned r - 02B4)
+027A LATIN SMALL LETTER TURNED R WITH LONG LEG
+ * voiced lateral flap
+027B LATIN SMALL LETTER TURNED R WITH HOOK
+ * voiced retroflex approximant
+ x (modifier letter small turned r with hook - 02B5)
+027C LATIN SMALL LETTER R WITH LONG LEG
+ * voiced strident apico-alveolar trill
+@+ * obsoleted by IPA in 1989
+ * sound spelled with 0159 in Czech
+ * preferred phonetic representation for Czech is 0072 031D
+ * in current use in Gaelic types (as glyph variant of 0072)
+027D LATIN SMALL LETTER R WITH TAIL
+ * voiced retroflex flap
+ * uppercase is 2C64
+027E LATIN SMALL LETTER R WITH FISHHOOK
+ * voiced alveolar flap or tap
+027F LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+ = long leg turned iota (a misnomer)
+ * apical dental vowel
+ * used by linguists working on Chinese and other Sino-Tibetan languages
+ * IPA spelling - 007A 0329
+ * preferred presentation is with a descender
+0280 LATIN LETTER SMALL CAPITAL R *
+ * voiced uvular trill
+ * Germanic, Old Norse
+ * uppercase is 01A6
+0281 LATIN LETTER SMALL CAPITAL INVERTED R
+ * voiced uvular fricative or approximant
+ x (modifier letter small capital inverted r - 02B6)
+0282 LATIN SMALL LETTER S WITH HOOK
+ * voiceless retroflex fricative
+0283 LATIN SMALL LETTER ESH
+ * voiceless postalveolar fricative
+ x (latin capital letter esh - 01A9)
+ x (integral - 222B)
+0284 LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+ * implosive palatal stop
+ * typographically based on 025F, not on 0283
+0285 LATIN SMALL LETTER SQUAT REVERSED ESH
+ * apical retroflex vowel
+ * used by linguists working on Chinese and other Sino-Tibetan languages
+ * IPA spelling - 0290 0329
+ * in origin 027F plus the retroflex hook 0322, despite its name
+ * preferred presentation is with a descender
+0286 LATIN SMALL LETTER ESH WITH CURL
+ * palatalized voiceless postalveolar fricative
+ * suggested spelling - 0283 02B2
+0287 LATIN SMALL LETTER TURNED T
+ * dental click (sound of "tsk tsk")
+ x (latin letter dental click - 01C0)
+0288 LATIN SMALL LETTER T WITH RETROFLEX HOOK
+ * voiceless retroflex stop
+ x (latin capital letter t with retroflex hook - 01AE)
+0289 LATIN SMALL LETTER U BAR
+ * high central rounded vowel
+ * uppercase is 0244
+028A LATIN SMALL LETTER UPSILON
+ * semi-high back rounded vowel
+ * preferred IPA alternate to 0277
+ x (latin capital letter upsilon - 01B1)
+ x (greek small letter upsilon - 03C5)
+028B LATIN SMALL LETTER V WITH HOOK
+ = latin small letter script v (1.0)
+ * voiced labiodental approximant
+ x (latin capital letter v with hook - 01B2)
+ x (greek small letter upsilon - 03C5)
+028C LATIN SMALL LETTER TURNED V
+ = caret, wedge
+ * lower-mid back unrounded vowel
+ * uppercase is 0245
+ x (greek capital letter lamda - 039B)
+ x (caret - 2038)
+ x (logical and - 2227)
+028D LATIN SMALL LETTER TURNED W
+ * voiceless rounded labiovelar approximant
+028E LATIN SMALL LETTER TURNED Y
+ * voiced lateral approximant
+028F LATIN LETTER SMALL CAPITAL Y
+ * semi-high front rounded vowel
+0290 LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+ * voiced retroflex fricative
+0291 LATIN SMALL LETTER Z WITH CURL
+ * voiced alveolo-palatal laminal fricative
+ * sound spelled with 017A in Polish
+0292 LATIN SMALL LETTER EZH
+ = dram
+ * voiced postalveolar fricative
+ * mistakenly named yogh in Unicode 1.0
+ * uppercase is 01B7
+ * Skolt Sami
+ x (latin small letter yogh - 021D)
+ x (cyrillic small letter abkhasian dze - 04E1)
+ x (ounce sign - 2125)
+0293 LATIN SMALL LETTER EZH WITH CURL
+ * palatalized voiced postalveolar fricative
+0294 LATIN LETTER GLOTTAL STOP
+ * this is a caseless letter
+ * used in IPA, other phonetic notations, and those orthographies which use a caseless glottal stop
+ x (latin capital letter glottal stop - 0241)
+ x (modifier letter glottal stop - 02C0)
+0295 LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+ = reversed glottal stop
+ * voiced pharyngeal fricative
+ * ain
+ x (latin small letter ezh reversed - 01B9)
+ x (modifier letter reversed glottal stop - 02C1)
+0296 LATIN LETTER INVERTED GLOTTAL STOP
+ * lateral click
+ x (latin letter lateral click - 01C1)
+0297 LATIN LETTER STRETCHED C
+ * palatal (or alveolar) click
+ x (latin letter retroflex click - 01C3)
+ x (complement - 2201)
+0298 LATIN LETTER BILABIAL CLICK
+ = bullseye
+ x (circled dot operator - 2299)
+0299 LATIN LETTER SMALL CAPITAL B
+ * bilabial trill
+029A LATIN SMALL LETTER CLOSED OPEN E
+ = closed epsilon
+ * lower-mid front rounded vowel
+ * non-IPA alternate for the preferred 0153
+029B LATIN LETTER SMALL CAPITAL G WITH HOOK
+ * voiced uvular implosive
+029C LATIN LETTER SMALL CAPITAL H
+ * voiceless epiglottal fricative
+029D LATIN SMALL LETTER J WITH CROSSED-TAIL
+ * voiced palatal fricative
+029E LATIN SMALL LETTER TURNED K
+ * proposed for velar click
+@+ * withdrawn by IPA in 1970
+029F LATIN LETTER SMALL CAPITAL L
+ * velar lateral approximant
+02A0 LATIN SMALL LETTER Q WITH HOOK
+ * voiceless uvular implosive
+02A1 LATIN LETTER GLOTTAL STOP WITH STROKE
+ * voiced epiglottal stop
+02A2 LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+ * voiced epiglottal fricative
+02A3 LATIN SMALL LETTER DZ DIGRAPH
+ * voiced dental affricate
+02A4 LATIN SMALL LETTER DEZH DIGRAPH
+ * voiced postalveolar affricate
+02A5 LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+ * voiced alveolo-palatal affricate
+02A6 LATIN SMALL LETTER TS DIGRAPH
+ * voiceless dental affricate
+02A7 LATIN SMALL LETTER TESH DIGRAPH
+ * voiceless postalveolar affricate
+02A8 LATIN SMALL LETTER TC DIGRAPH WITH CURL
+ * voiceless alveolo-palatal affricate
+@ IPA characters for disordered speech
+02A9 LATIN SMALL LETTER FENG DIGRAPH
+ * velopharyngeal fricative
+02AA LATIN SMALL LETTER LS DIGRAPH
+ * lateral alveolar fricative (lisp)
+02AB LATIN SMALL LETTER LZ DIGRAPH
+ * voiced lateral alveolar fricative
+02AC LATIN LETTER BILABIAL PERCUSSIVE
+ * audible lip smack
+02AD LATIN LETTER BIDENTAL PERCUSSIVE
+ * audible teeth gnashing
+@ Additions for Sinology
+02AE LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+@@ 02B0 Spacing Modifier Letters 02FF
+@ Latin superscript modifier letters
+02B0 MODIFIER LETTER SMALL H
+ * aspiration
+ # <super> 0068
+02B1 MODIFIER LETTER SMALL H WITH HOOK
+ * breathy voiced, murmured
+ x (latin small letter h with hook - 0266)
+ x (combining diaeresis below - 0324)
+ # <super> 0266
+02B2 MODIFIER LETTER SMALL J
+ * palatalization
+ x (combining palatalized hook below - 0321)
+ # <super> 006A
+02B3 MODIFIER LETTER SMALL R
+ # <super> 0072
+02B4 MODIFIER LETTER SMALL TURNED R
+ x (latin small letter turned r - 0279)
+ # <super> 0279
+02B5 MODIFIER LETTER SMALL TURNED R WITH HOOK
+ x (latin small letter turned r with hook - 027B)
+ # <super> 027B
+02B6 MODIFIER LETTER SMALL CAPITAL INVERTED R
+ * preceding four used for r-coloring or r-offglides
+ x (latin letter small capital inverted r - 0281)
+ # <super> 0281
+02B7 MODIFIER LETTER SMALL W
+ * labialization
+ x (combining inverted double arch below - 032B)
+ # <super> 0077
+02B8 MODIFIER LETTER SMALL Y
+ * palatalization
+ * common Americanist usage for 02B2
+ # <super> 0079
+@ Miscellaneous phonetic modifiers
+02B9 MODIFIER LETTER PRIME
+ * primary stress, emphasis
+ * transliteration of mjagkij znak (Cyrillic soft sign: palatalization)
+ x (apostrophe - 0027)
+ x (acute accent - 00B4)
+ x (modifier letter acute accent - 02CA)
+ x (combining acute accent - 0301)
+ x (greek numeral sign - 0374)
+ x (prime - 2032)
+02BA MODIFIER LETTER DOUBLE PRIME
+ * exaggerated stress, contrastive stress
+ * transliteration of tverdyj znak (Cyrillic hard sign: no palatalization)
+ x (quotation mark - 0022)
+ x (combining double acute accent - 030B)
+ x (double prime - 2033)
+02BB MODIFIER LETTER TURNED COMMA
+ * typographical alternate for 02BD or 02BF
+ * used in Hawai`ian orthography as `okina (glottal stop)
+ x (combining turned comma above - 0312)
+ x (nko low tone apostrophe - 07F5)
+ x (left single quotation mark - 2018)
+02BC MODIFIER LETTER APOSTROPHE
+ = apostrophe
+ * glottal stop, glottalization, ejective
+ * many languages use this as a letter of their alphabets
+ * used as a tone marker in Dogri (swarbal chinha)
+ * used as a tone marker in Bodo (gojocoma)
+ * used as a length marker in Maithili (pralamban chinh)
+ * 2019 is the preferred character for a punctuation apostrophe
+ x (apostrophe - 0027)
+ x (combining comma above - 0313)
+ x (combining comma above right - 0315)
+ x (armenian apostrophe - 055A)
+ x (nko high tone apostrophe - 07F4)
+ x (greek psili - 1FBF)
+ x (right single quotation mark - 2019)
+02BD MODIFIER LETTER REVERSED COMMA
+ * weak aspiration
+ x (combining reversed comma above - 0314)
+ x (armenian modifier letter left half ring - 0559)
+ x (greek dasia - 1FFE)
+ x (single high-reversed-9 quotation mark - 201B)
+02BE MODIFIER LETTER RIGHT HALF RING
+ * transliteration of Arabic hamza (glottal stop)
+ x (armenian apostrophe - 055A)
+ x (arabic letter hamza - 0621)
+02BF MODIFIER LETTER LEFT HALF RING
+ * transliteration of Arabic ain (voiced pharyngeal fricative)
+ x (armenian modifier letter left half ring - 0559)
+ x (arabic letter ain - 0639)
+02C0 MODIFIER LETTER GLOTTAL STOP
+ * ejective or glottalized
+ * typographical alternate for 02BC or 02BE
+ x (latin letter glottal stop - 0294)
+ x (combining hook above - 0309)
+02C1 MODIFIER LETTER REVERSED GLOTTAL STOP
+ * typographical alternate for 02BF
+ x (latin letter pharyngeal voiced fricative - 0295)
+02C2 MODIFIER LETTER LEFT ARROWHEAD
+ * fronted articulation
+02C3 MODIFIER LETTER RIGHT ARROWHEAD
+ * backed articulation
+02C4 MODIFIER LETTER UP ARROWHEAD
+ * raised articulation
+ x (circumflex accent - 005E)
+ x (up arrowhead - 2303)
+02C5 MODIFIER LETTER DOWN ARROWHEAD
+ * lowered articulation
+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
+ * rising-falling tone, falling tone, secondary stress, etc.
+ x (circumflex accent - 005E)
+ x (combining circumflex accent - 0302)
+ x (modifier letter low circumflex accent - A788)
+02C7 CARON (Mandarin Chinese third tone)
+ = hacek
+ * falling-rising tone
+ * Mandarin Chinese third tone
+ x (combining caron - 030C)
+02C8 MODIFIER LETTER VERTICAL LINE
+ * primary stress, downstep
+ * precedes letter or syllable modified
+ x (apostrophe - 0027)
+ x (combining vertical line above - 030D)
+02C9 MODIFIER LETTER MACRON (Mandarin Chinese first tone)
+ * high level tone
+ * precedes or follows letter or syllable modified
+ * Mandarin Chinese first tone
+ x (macron - 00AF)
+ x (combining macron - 0304)
+02CA MODIFIER LETTER ACUTE ACCENT (Mandarin Chinese second tone)
+ * high-rising tone (IPA), high tone, primary stress
+ * Mandarin Chinese second tone
+ x (acute accent - 00B4)
+ x (modifier letter prime - 02B9)
+ x (combining acute accent - 0301)
+ x (greek numeral sign - 0374)
+ x (armenian emphasis mark - 055B)
+02CB MODIFIER LETTER GRAVE ACCENT (Mandarin Chinese fourth tone)
+ * high-falling tone (IPA), low tone, secondary or tertiary stress
+ * Mandarin Chinese fourth tone
+ x (grave accent - 0060)
+ x (combining grave accent - 0300)
+ x (armenian comma - 055D)
+02CC MODIFIER LETTER LOW VERTICAL LINE
+ * secondary stress
+ * precedes letter or syllable modified
+ x (combining vertical line below - 0329)
+02CD MODIFIER LETTER LOW MACRON
+ * low level tone
+ x (low line - 005F)
+ x (combining macron below - 0331)
+02CE MODIFIER LETTER LOW GRAVE ACCENT
+ * low-falling tone
+02CF MODIFIER LETTER LOW ACUTE ACCENT
+ * low-rising tone
+ x (greek lower numeral sign - 0375)
+02D0 MODIFIER LETTER TRIANGULAR COLON
+ * length mark
+ x (colon - 003A)
+02D1 MODIFIER LETTER HALF TRIANGULAR COLON
+ * half-length mark
+ x (middle dot - 00B7)
+02D2 MODIFIER LETTER CENTRED RIGHT HALF RING
+ * more rounded articulation
+02D3 MODIFIER LETTER CENTRED LEFT HALF RING
+ * less rounded articulation
+02D4 MODIFIER LETTER UP TACK
+ * vowel raising or closing
+ x (combining up tack below - 031D)
+ x (combining dot below - 0323)
+02D5 MODIFIER LETTER DOWN TACK
+ * vowel lowering or opening
+ x (combining left half ring below - 031C)
+ x (combining down tack below - 031E)
+02D6 MODIFIER LETTER PLUS SIGN
+ * advanced or fronted articulation
+ x (combining plus sign below - 031F)
+02D7 MODIFIER LETTER MINUS SIGN
+ * retracted or backed articulation
+ * glyph may have small end-serifs
+ x (combining minus sign below - 0320)
+ x (minus sign - 2212)
+@ Spacing clones of diacritics
+02D8 BREVE
+ x (combining breve - 0306)
+ # 0020 0306
+02D9 DOT ABOVE (Mandarin Chinese light tone)
+ * Mandarin Chinese fifth tone (light or neutral)
+ x (combining dot above - 0307)
+ # 0020 0307
+02DA RING ABOVE
+ x (degree sign - 00B0)
+ x (combining ring above - 030A)
+ # 0020 030A
+02DB OGONEK
+ x (combining ogonek - 0328)
+ # 0020 0328
+02DC SMALL TILDE
+ x (tilde - 007E)
+ x (combining tilde - 0303)
+ x (tilde operator - 223C)
+ # 0020 0303
+02DD DOUBLE ACUTE ACCENT
+ x (combining double acute accent - 030B)
+ # 0020 030B
+@ Additions based on 1989 IPA
+02DE MODIFIER LETTER RHOTIC HOOK
+ * rhotacization in vowel
+ * often ligated: 025A = 0259 + 02DE; 025D = 025C + 02DE
+02DF MODIFIER LETTER CROSS ACCENT
+ * Swedish grave accent
+02E0 MODIFIER LETTER SMALL GAMMA
+ * these modifier letters are occasionally used in transcription of affricates
+ # <super> 0263
+02E1 MODIFIER LETTER SMALL L
+ # <super> 006C
+02E2 MODIFIER LETTER SMALL S
+ # <super> 0073
+02E3 MODIFIER LETTER SMALL X
+ # <super> 0078
+02E4 MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+ # <super> 0295
+@ Tone letters
+02E5 MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6 MODIFIER LETTER HIGH TONE BAR
+02E7 MODIFIER LETTER MID TONE BAR
+02E8 MODIFIER LETTER LOW TONE BAR
+02E9 MODIFIER LETTER EXTRA-LOW TONE BAR
+@ Extended Bopomofo tone marks
+02EA MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB MODIFIER LETTER YANG DEPARTING TONE MARK
+@ IPA modifiers
+02EC MODIFIER LETTER VOICING
+02ED MODIFIER LETTER UNASPIRATED
+@ Other modifier letter
+02EE MODIFIER LETTER DOUBLE APOSTROPHE
+ * Nenets
+@ UPA modifiers
+02EF MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0 MODIFIER LETTER LOW UP ARROWHEAD
+02F1 MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2 MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3 MODIFIER LETTER LOW RING
+02F4 MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5 MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6 MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7 MODIFIER LETTER LOW TILDE
+02F8 MODIFIER LETTER RAISED COLON
+02F9 MODIFIER LETTER BEGIN HIGH TONE
+02FA MODIFIER LETTER END HIGH TONE
+02FB MODIFIER LETTER BEGIN LOW TONE
+02FC MODIFIER LETTER END LOW TONE
+02FD MODIFIER LETTER SHELF
+02FE MODIFIER LETTER OPEN SHELF
+02FF MODIFIER LETTER LOW LEFT ARROW
+@@ 0300 Combining Diacritical Marks 036F
+@@+
+@ Ordinary diacritics
+0300 COMBINING GRAVE ACCENT (Varia)
+ = Greek varia
+ x (grave accent - 0060)
+ x (modifier letter grave accent - 02CB)
+0301 COMBINING ACUTE ACCENT (Oxia, Tonos)
+ = stress mark
+ = Greek oxia, tonos
+ x (apostrophe - 0027)
+ x (acute accent - 00B4)
+ x (modifier letter prime - 02B9)
+ x (modifier letter acute accent - 02CA)
+ x (greek tonos - 0384)
+0302 COMBINING CIRCUMFLEX ACCENT
+ = hat
+ x (circumflex accent - 005E)
+ x (modifier letter circumflex accent - 02C6)
+0303 COMBINING TILDE
+ * IPA: nasalization
+ * Vietnamese tone mark
+ x (tilde - 007E)
+ x (small tilde - 02DC)
+0304 COMBINING MACRON
+ = long
+ * distinguish from the following
+ x (macron - 00AF)
+ x (modifier letter macron - 02C9)
+0305 COMBINING OVERLINE
+ = overscore, vinculum
+ * connects on left and right
+ x (macron - 00AF)
+0306 COMBINING BREVE (Vrachy)
+ = short
+ = Greek vrachy
+ x (breve - 02D8)
+ x (combining cyrillic kavyka - A67C)
+0307 COMBINING DOT ABOVE
+ = derivative (Newtonian notation)
+@+ * IPA (withdrawn in 1976): palatalization
+ x (dot above - 02D9)
+0308 COMBINING DIAERESIS (Dialytika)
+ = double dot above, umlaut
+ = Greek dialytika
+ = double derivative
+ x (diaeresis - 00A8)
+0309 COMBINING HOOK ABOVE
+ = hoi
+ * kerns left or right of circumflex over vowels
+ * Vietnamese tone mark
+ x (modifier letter glottal stop - 02C0)
+030A COMBINING RING ABOVE
+ x (degree sign - 00B0)
+ x (ring above - 02DA)
+030B COMBINING DOUBLE ACUTE ACCENT
+ * Hungarian, Chuvash
+ x (quotation mark - 0022)
+ x (modifier letter double prime - 02BA)
+ x (double acute accent - 02DD)
+030C COMBINING CARON
+ = hacek, V above
+ x (caron - 02C7)
+030D COMBINING VERTICAL LINE ABOVE
+ * this is not the Greek tonos
+ * Marshallese
+ x (modifier letter vertical line - 02C8)
+030E COMBINING DOUBLE VERTICAL LINE ABOVE
+ * Marshallese
+ x (quotation mark - 0022)
+030F COMBINING DOUBLE GRAVE ACCENT
+ * Serbian and Croatian poetics
+0310 COMBINING CANDRABINDU
+ x (devanagari sign candrabindu - 0901)
+0311 COMBINING INVERTED BREVE
+ x (combining cyrillic pokrytie - 0487)
+0312 COMBINING TURNED COMMA ABOVE
+ = cedilla above
+ * Latvian (but not used in decomposition)
+ x (modifier letter turned comma - 02BB)
+0313 COMBINING COMMA ABOVE (Psili)
+ = Greek psili, smooth breathing mark
+ * Americanist: ejective or glottalization
+ x (modifier letter apostrophe - 02BC)
+ x (combining cyrillic psili pneumata - 0486)
+ x (armenian apostrophe - 055A)
+0314 COMBINING REVERSED COMMA ABOVE (Dasia)
+ = Greek dasia, rough breathing mark
+ x (modifier letter reversed comma - 02BD)
+ x (combining cyrillic dasia pneumata - 0485)
+ x (armenian modifier letter left half ring - 0559)
+0315 COMBINING COMMA ABOVE RIGHT
+ x (modifier letter apostrophe - 02BC)
+0316 COMBINING GRAVE ACCENT BELOW
+0317 COMBINING ACUTE ACCENT BELOW
+0318 COMBINING LEFT TACK BELOW
+0319 COMBINING RIGHT TACK BELOW
+031A COMBINING LEFT ANGLE ABOVE
+ * IPA: unreleased stop
+031B COMBINING HORN
+ * Vietnamese
+031C COMBINING LEFT HALF RING BELOW
+ * IPA: open variety of vowel
+ x (modifier letter down tack - 02D5)
+031D COMBINING UP TACK BELOW
+ * IPA: vowel raising or closing
+ x (modifier letter up tack - 02D4)
+031E COMBINING DOWN TACK BELOW
+ * IPA: vowel lowering or opening
+ x (modifier letter down tack - 02D5)
+031F COMBINING PLUS SIGN BELOW
+ * IPA: advanced or fronted articulation
+ x (modifier letter plus sign - 02D6)
+0320 COMBINING MINUS SIGN BELOW
+ * IPA: retracted or backed articulation
+ * glyph may have small end-serifs
+ x (modifier letter minus sign - 02D7)
+0321 COMBINING PALATALIZED HOOK BELOW
+ * IPA: palatalization
+ x (modifier letter small j - 02B2)
+0322 COMBINING RETROFLEX HOOK BELOW
+ * IPA: retroflexion
+0323 COMBINING DOT BELOW
+ = nang
+ * IPA: closer variety of vowel
+ * Americanist and Indo-Europeanist: retraction or retroflexion
+ * Semiticist: velarization or pharyngealization
+ * Vietnamese tone mark
+ x (modifier letter up tack - 02D4)
+0324 COMBINING DIAERESIS BELOW
+ * IPA: breathy-voice or murmur
+ x (modifier letter small h with hook - 02B1)
+0325 COMBINING RING BELOW
+ * IPA: voiceless
+ * vocalic (in Latin transliteration of Indic sonorants)
+ * Madurese
+0326 COMBINING COMMA BELOW
+ * Romanian, Latvian, Livonian
+0327 COMBINING CEDILLA
+ * French, Turkish, Azerbaijani
+ x (cedilla - 00B8)
+0328 COMBINING OGONEK
+ = nasal hook
+ * Americanist: nasalization
+ * Polish, Lithuanian
+ x (ogonek - 02DB)
+0329 COMBINING VERTICAL LINE BELOW
+ * IPA: syllabic
+ * Yoruba
+ * German dialectology
+ * may attach or not; shape may vary by local preferences
+ x (modifier letter low vertical line - 02CC)
+032A COMBINING BRIDGE BELOW
+ * IPA: dental
+032B COMBINING INVERTED DOUBLE ARCH BELOW
+ * IPA: labialization
+ x (modifier letter small w - 02B7)
+032C COMBINING CARON BELOW
+ * IPA: voiced
+032D COMBINING CIRCUMFLEX ACCENT BELOW
+ * Americanist: fronted articulation
+032E COMBINING BREVE BELOW
+ * Hittite transcription
+032F COMBINING INVERTED BREVE BELOW
+ * Americanist: fronted articulation (variant of 032D)
+ * Indo-Europeanist: semivowel
+0330 COMBINING TILDE BELOW
+ * IPA: creaky voice
+0331 COMBINING MACRON BELOW
+ x (low line - 005F)
+ x (modifier letter low macron - 02CD)
+0332 COMBINING LOW LINE
+ = underline, underscore
+ * connects on left and right
+ x (low line - 005F)
+0333 COMBINING DOUBLE LOW LINE
+ = double underline, double underscore
+ * connects on left and right
+ x (combining equals sign below - 0347)
+ x (double low line - 2017)
+@ Overstruck diacritics
+0334 COMBINING TILDE OVERLAY
+ * IPA: velarization or pharyngealization
+0335 COMBINING SHORT STROKE OVERLAY
+0336 COMBINING LONG STROKE OVERLAY
+0337 COMBINING SHORT SOLIDUS OVERLAY
+ = short slash overlay
+0338 COMBINING LONG SOLIDUS OVERLAY
+ = long slash overlay
+@ Additions
+0339 COMBINING RIGHT HALF RING BELOW
+033A COMBINING INVERTED BRIDGE BELOW
+033B COMBINING SQUARE BELOW
+033C COMBINING SEAGULL BELOW
+033D COMBINING X ABOVE
+033E COMBINING VERTICAL TILDE
+ = yerik
+ * used for Cyrillic yerik, indicates an omitted jer
+ * this is not a palatalization mark
+ x (combining cyrillic palatalization - 0484)
+ x (vertical tilde - 2E2F)
+ x (combining cyrillic payerok - A67D)
+033F COMBINING DOUBLE OVERLINE
+@ Vietnamese tone marks (deprecated)
+@+ Vietnamese-specific accent placement should be handled by specialized rendering of 0300 and 0301.
+0340 COMBINING GRAVE TONE MARK (Vietnamese)
+ : 0300 combining grave accent
+0341 COMBINING ACUTE TONE MARK (Vietnamese)
+ : 0301 combining acute accent
+@ Additions for Greek
+0342 COMBINING GREEK PERISPOMENI
+0343 COMBINING GREEK KORONIS
+ : 0313 combining comma above
+0344 COMBINING GREEK DIALYTIKA TONOS
+ * use of this character is discouraged
+ : 0308 0301
+0345 COMBINING GREEK YPOGEGRAMMENI
+ = greek non-spacing iota below (1.0)
+ = iota subscript
+ * note special casing issues
+ x (greek ypogegrammeni - 037A)
+ x (greek capital letter iota - 0399)
+@ Additions for IPA
+0346 COMBINING BRIDGE ABOVE
+ * IPA: dentolabial
+ x (combining wide bridge above - 20E9)
+0347 COMBINING EQUALS SIGN BELOW
+ * IPA: alveolar
+0348 COMBINING DOUBLE VERTICAL LINE BELOW
+ * IPA: strong articulation
+0349 COMBINING LEFT ANGLE BELOW
+ * IPA: weak articulation
+034A COMBINING NOT TILDE ABOVE
+ * IPA: denasal
+@ IPA diacritics for disordered speech
+034B COMBINING HOMOTHETIC ABOVE
+ * IPA: nasal escape
+034C COMBINING ALMOST EQUAL TO ABOVE
+ * IPA: velopharyngeal friction
+034D COMBINING LEFT RIGHT ARROW BELOW
+ * IPA: labial spreading
+034E COMBINING UPWARDS ARROW BELOW
+ * IPA: whistled articulation
+@ Grapheme joiner
+034F COMBINING GRAPHEME JOINER
+ * commonly abbreviated as CGJ
+ * has no visible glyph
+ * the name of this character is misleading; it does not actually join graphemes
+@ Additions for the Uralic Phonetic Alphabet
+0350 COMBINING RIGHT ARROWHEAD ABOVE
+0351 COMBINING LEFT HALF RING ABOVE
+0352 COMBINING FERMATA
+0353 COMBINING X BELOW
+0354 COMBINING LEFT ARROWHEAD BELOW
+0355 COMBINING RIGHT ARROWHEAD BELOW
+0356 COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357 COMBINING RIGHT HALF RING ABOVE
+@ Miscellaneous additions
+0358 COMBINING DOT ABOVE RIGHT
+ * Latin transliterations of the Southern Min dialects of Chinese
+0359 COMBINING ASTERISK BELOW
+ x (low asterisk - 204E)
+035A COMBINING DOUBLE RING BELOW
+ * Kharoshthi transliteration
+035B COMBINING ZIGZAG ABOVE
+ * Latin abbreviation, Lithuanian phonetics and mediaevalist transcriptions
+@ Double diacritics
+035C COMBINING DOUBLE BREVE BELOW
+ = ligature tie below, papyrological hyphen
+ * a common glyph alternate connects the horizontal midpoints of the characters
+ x (combining double breve - 035D)
+ x (combining double inverted breve - 0361)
+035D COMBINING DOUBLE BREVE
+035E COMBINING DOUBLE MACRON
+035F COMBINING DOUBLE MACRON BELOW
+0360 COMBINING DOUBLE TILDE
+0361 COMBINING DOUBLE INVERTED BREVE
+ = ligature tie
+0362 COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+ * IPA: sliding articulation
+@ Medieval superscript letter diacritics
+@+ These are letter diacritics written directly above other letters. They appear primarily in medieval Germanic manuscripts, but saw some usage as late as the 19th century in some languages.
+0363 COMBINING LATIN SMALL LETTER A
+0364 COMBINING LATIN SMALL LETTER E
+0365 COMBINING LATIN SMALL LETTER I
+0366 COMBINING LATIN SMALL LETTER O
+0367 COMBINING LATIN SMALL LETTER U
+0368 COMBINING LATIN SMALL LETTER C
+0369 COMBINING LATIN SMALL LETTER D
+036A COMBINING LATIN SMALL LETTER H
+036B COMBINING LATIN SMALL LETTER M
+036C COMBINING LATIN SMALL LETTER R
+036D COMBINING LATIN SMALL LETTER T
+036E COMBINING LATIN SMALL LETTER V
+036F COMBINING LATIN SMALL LETTER X
+@@ 0370 Greek and Coptic 03FF
+@ Archaic letters
+0370 GREEK CAPITAL LETTER HETA
+ x (latin capital letter half h - 2C75)
+0371 GREEK SMALL LETTER HETA
+ x (latin small letter half h - 2C76)
+0372 GREEK CAPITAL LETTER ARCHAIC SAMPI
+0373 GREEK SMALL LETTER ARCHAIC SAMPI
+@ Numeral signs
+0374 GREEK NUMERAL SIGN (Dexia keraia)
+ = dexia keraia
+ * indicates numeric use of letters
+ x (modifier letter acute accent - 02CA)
+ : 02B9 modifier letter prime
+0375 GREEK LOWER NUMERAL SIGN (Aristeri keraia)
+ = aristeri keraia
+ * indicates numeric use of letters
+ x (modifier letter low acute accent - 02CF)
+@ Archaic letters
+0376 GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+0377 GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+@ Iota subscript
+037A GREEK YPOGEGRAMMENI
+ = iota subscript
+ x (combining greek ypogegrammeni - 0345)
+ # 0020 0345
+@ Lowercase of editorial symbols
+037B GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
+037C GREEK SMALL DOTTED LUNATE SIGMA SYMBOL
+037D GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+@ Punctuation
+037E GREEK QUESTION MARK (Erotimatiko)
+ = erotimatiko
+ * sentence-final punctuation
+ * 003B is the preferred character
+ x (question mark - 003F)
+ : 003B semicolon
+@ Spacing accent marks
+0384 GREEK TONOS
+ x (acute accent - 00B4)
+ x (combining vertical line above - 030D)
+ # 0020 0301
+0385 GREEK DIALYTIKA TONOS
+ : 00A8 0301
+@ Letter
+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS
+ : 0391 0301
+@ Punctuation
+0387 GREEK ANO TELEIA
+ * functions in Greek like a semicolon
+ * 00B7 is the preferred character
+ : 00B7 middle dot
+@ Letters
+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS
+ : 0395 0301
+0389 GREEK CAPITAL LETTER ETA WITH TONOS
+ : 0397 0301
+038A GREEK CAPITAL LETTER IOTA WITH TONOS
+ : 0399 0301
+038C GREEK CAPITAL LETTER OMICRON WITH TONOS
+ : 039F 0301
+038E GREEK CAPITAL LETTER UPSILON WITH TONOS
+ : 03A5 0301
+038F GREEK CAPITAL LETTER OMEGA WITH TONOS
+ : 03A9 0301
+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+ : 03CA 0301
+0391 GREEK CAPITAL LETTER ALPHA
+0392 GREEK CAPITAL LETTER BETA
+0393 GREEK CAPITAL LETTER GAMMA
+ = gamma function
+ x (double-struck capital gamma - 213E)
+0394 GREEK CAPITAL LETTER DELTA
+ x (increment - 2206)
+0395 GREEK CAPITAL LETTER EPSILON
+0396 GREEK CAPITAL LETTER ZETA
+0397 GREEK CAPITAL LETTER ETA
+0398 GREEK CAPITAL LETTER THETA
+0399 GREEK CAPITAL LETTER IOTA
+ = iota adscript
+039A GREEK CAPITAL LETTER KAPPA
+039B GREEK CAPITAL LETTER LAMDA
+039C GREEK CAPITAL LETTER MU
+039D GREEK CAPITAL LETTER NU
+039E GREEK CAPITAL LETTER XI
+039F GREEK CAPITAL LETTER OMICRON
+03A0 GREEK CAPITAL LETTER PI
+ x (double-struck capital pi - 213F)
+ x (n-ary product - 220F)
+03A1 GREEK CAPITAL LETTER RHO
+03A3 GREEK CAPITAL LETTER SIGMA
+ x (latin capital letter esh - 01A9)
+ x (n-ary summation - 2211)
+03A4 GREEK CAPITAL LETTER TAU
+03A5 GREEK CAPITAL LETTER UPSILON
+03A6 GREEK CAPITAL LETTER PHI
+03A7 GREEK CAPITAL LETTER CHI
+03A8 GREEK CAPITAL LETTER PSI
+03A9 GREEK CAPITAL LETTER OMEGA
+ x (ohm sign - 2126)
+ x (inverted ohm sign - 2127)
+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+ : 0399 0308
+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+ : 03A5 0308
+03AC GREEK SMALL LETTER ALPHA WITH TONOS
+ : 03B1 0301
+03AD GREEK SMALL LETTER EPSILON WITH TONOS
+ : 03B5 0301
+03AE GREEK SMALL LETTER ETA WITH TONOS
+ : 03B7 0301
+03AF GREEK SMALL LETTER IOTA WITH TONOS
+ : 03B9 0301
+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+ : 03CB 0301
+03B1 GREEK SMALL LETTER ALPHA
+ x (latin small letter alpha - 0251)
+ x (proportional to - 221D)
+03B2 GREEK SMALL LETTER BETA
+ x (latin small letter sharp s - 00DF)
+ x (latin small letter b with stroke - 0180)
+03B3 GREEK SMALL LETTER GAMMA
+ x (latin small letter gamma - 0263)
+ x (double-struck small gamma - 213D)
+03B4 GREEK SMALL LETTER DELTA
+03B5 GREEK SMALL LETTER EPSILON
+ x (latin small letter open e - 025B)
+03B6 GREEK SMALL LETTER ZETA
+03B7 GREEK SMALL LETTER ETA
+03B8 GREEK SMALL LETTER THETA
+ x (latin small letter barred o - 0275)
+ x (cyrillic small letter fita - 0473)
+03B9 GREEK SMALL LETTER IOTA
+ x (latin small letter iota - 0269)
+ x (turned greek small letter iota - 2129)
+03BA GREEK SMALL LETTER KAPPA
+03BB GREEK SMALL LETTER LAMDA
+ = lambda
+03BC GREEK SMALL LETTER MU
+ x (micro sign - 00B5)
+03BD GREEK SMALL LETTER NU
+03BE GREEK SMALL LETTER XI
+03BF GREEK SMALL LETTER OMICRON
+03C0 GREEK SMALL LETTER PI
+ * math constant 3.141592...
+03C1 GREEK SMALL LETTER RHO
+03C2 GREEK SMALL LETTER FINAL SIGMA
+ = stigma (the Modern Greek name for this letterform)
+ * not to be confused with the actual stigma letter
+ x (greek small letter stigma - 03DB)
+03C3 GREEK SMALL LETTER SIGMA
+ * used symbolically with a numeric value 200
+03C4 GREEK SMALL LETTER TAU
+03C5 GREEK SMALL LETTER UPSILON
+ x (latin small letter upsilon - 028A)
+ x (latin small letter v with hook - 028B)
+03C6 GREEK SMALL LETTER PHI
+ x (latin small letter phi - 0278)
+ x (greek phi symbol - 03D5)
+ * the ordinary Greek letter, showing considerable glyph variation
+ * in mathematical contexts, the loopy glyph is preferred, to contrast with 03D5
+03C7 GREEK SMALL LETTER CHI
+03C8 GREEK SMALL LETTER PSI
+03C9 GREEK SMALL LETTER OMEGA
+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA
+ : 03B9 0308
+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+ : 03C5 0308
+03CC GREEK SMALL LETTER OMICRON WITH TONOS
+ : 03BF 0301
+03CD GREEK SMALL LETTER UPSILON WITH TONOS
+ : 03C5 0301
+03CE GREEK SMALL LETTER OMEGA WITH TONOS
+ : 03C9 0301
+@ Variant letterforms
+03CF GREEK CAPITAL KAI SYMBOL
+ x (greek kai symbol - 03D7)
+03D0 GREEK BETA SYMBOL
+ = curled beta
+ # 03B2 greek small letter beta
+03D1 GREEK THETA SYMBOL
+ = script theta
+ * used as a technical symbol
+ # 03B8 greek small letter theta
+03D2 GREEK UPSILON WITH HOOK SYMBOL
+ # 03A5 greek capital letter upsilon
+03D3 GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+ : 03D2 0301
+03D4 GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+ : 03D2 0308
+03D5 GREEK PHI SYMBOL
+ * used as a technical symbol, with a stroked glyph
+ * maps to "phi1" symbol entities
+ # 03C6 greek small letter phi
+03D6 GREEK PI SYMBOL
+ = omega pi
+ * used as a technical symbol
+ * a variant of pi, looking like omega
+ # 03C0 greek small letter pi
+03D7 GREEK KAI SYMBOL
+ * used as an ampersand
+ x (coptic symbol kai - 2CE4)
+@ Archaic letters
+03D8 GREEK LETTER ARCHAIC KOPPA *
+03D9 GREEK SMALL LETTER ARCHAIC KOPPA *
+ * the Q-shaped archaic koppas are the ordinary alphabetic letters and can also be used as symbols with a numeric value of 90 in classical and pre-classical texts
+03DA GREEK LETTER STIGMA
+ * apparently in origin a cursive form of digamma
+ * the name "stigma" originally applied to a medieval sigma-tau ligature, whose shape was confusably similar to the cursive digamma
+ * used as a symbol with a numeric value of 6
+ x (roman numeral six late form - 2185)
+03DB GREEK SMALL LETTER STIGMA
+ x (greek small letter final sigma - 03C2)
+03DC GREEK LETTER DIGAMMA
+03DD GREEK SMALL LETTER DIGAMMA
+ * used as a symbol with a numeric value of 6
+03DE GREEK LETTER KOPPA
+03DF GREEK SMALL LETTER KOPPA
+ * used in modern Greek as a symbol with a numeric value of 90, as in the dating of legal documentation
+03E0 GREEK LETTER SAMPI
+03E1 GREEK SMALL LETTER SAMPI
+ * used as a symbol with a numeric value of 900
+@ Coptic letters derived from Demotic
+@+ For other Coptic letters see the Coptic Block.
+03E2 COPTIC CAPITAL LETTER SHEI
+03E3 COPTIC SMALL LETTER SHEI
+03E4 COPTIC CAPITAL LETTER FEI
+03E5 COPTIC SMALL LETTER FEI
+03E6 COPTIC CAPITAL LETTER KHEI
+03E7 COPTIC SMALL LETTER KHEI
+03E8 COPTIC CAPITAL LETTER HORI
+03E9 COPTIC SMALL LETTER HORI
+03EA COPTIC CAPITAL LETTER GANGIA
+03EB COPTIC SMALL LETTER GANGIA
+03EC COPTIC CAPITAL LETTER SHIMA
+03ED COPTIC SMALL LETTER SHIMA
+03EE COPTIC CAPITAL LETTER DEI
+03EF COPTIC SMALL LETTER DEI
+@ Variant letterforms
+03F0 GREEK KAPPA SYMBOL
+ = script kappa
+ * used as technical symbol
+ # 03BA greek small letter kappa
+03F1 GREEK RHO SYMBOL
+ = tailed rho
+ * used as technical symbol
+ # 03C1 greek small letter rho
+03F2 GREEK LUNATE SIGMA SYMBOL
+ = greek small letter lunate sigma (1.0)
+ # 03C2 greek small letter final sigma
+@ Additional letter
+03F3 GREEK LETTER YOT
+@ Variant letterforms and symbols
+03F4 GREEK CAPITAL THETA SYMBOL
+ x (cyrillic capital letter fita - 0472)
+ # 0398 greek capital letter theta
+03F5 GREEK LUNATE EPSILON SYMBOL
+ = straight epsilon
+ x (small element of - 220A)
+ # 03B5 greek small letter epsilon
+03F6 GREEK REVERSED LUNATE EPSILON SYMBOL
+ = reversed straight epsilon
+ x (small contains as member - 220D)
+@ Additional archaic letters for Bactrian
+03F7 GREEK CAPITAL LETTER SHO
+03F8 GREEK SMALL LETTER SHO
+@ Variant letterform
+03F9 GREEK CAPITAL LUNATE SIGMA SYMBOL
+ # 03A3 greek capital letter sigma
+@ Archaic letters
+03FA GREEK CAPITAL LETTER SAN
+03FB GREEK SMALL LETTER SAN
+@ Symbol
+03FC GREEK RHO WITH STROKE SYMBOL
+ * used with abbreviations containing 03C1
+@ Editorial symbols
+03FD GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+ = antisigma
+03FE GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+ = sigma periestigmenon
+03FF GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+ = antisigma periestigmenon
+@@ 0400 Cyrillic 04FF
+@ Cyrillic extensions
+0400 CYRILLIC CAPITAL LETTER IE WITH GRAVE
+ : 0415 0300
+0401 CYRILLIC CAPITAL LETTER IO
+ : 0415 0308
+0402 CYRILLIC CAPITAL LETTER DJE (Serbocroatian)
+0403 CYRILLIC CAPITAL LETTER GJE
+ : 0413 0301
+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405 CYRILLIC CAPITAL LETTER DZE
+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+ x (latin capital letter i - 0049)
+ x (cyrillic small letter byelorussian-ukrainian i - 0456)
+ x (cyrillic letter palochka - 04C0)
+0407 CYRILLIC CAPITAL LETTER YI (Ukrainian)
+ : 0406 0308
+0408 CYRILLIC CAPITAL LETTER JE
+0409 CYRILLIC CAPITAL LETTER LJE
+040A CYRILLIC CAPITAL LETTER NJE
+040B CYRILLIC CAPITAL LETTER TSHE (Serbocroatian)
+040C CYRILLIC CAPITAL LETTER KJE
+ : 041A 0301
+040D CYRILLIC CAPITAL LETTER I WITH GRAVE
+ : 0418 0300
+040E CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
+ : 0423 0306
+040F CYRILLIC CAPITAL LETTER DZHE
+@ Basic Russian alphabet
+0410 CYRILLIC CAPITAL LETTER A
+0411 CYRILLIC CAPITAL LETTER BE
+ x (latin small letter b with topbar - 0183)
+0412 CYRILLIC CAPITAL LETTER VE
+0413 CYRILLIC CAPITAL LETTER GHE
+0414 CYRILLIC CAPITAL LETTER DE
+0415 CYRILLIC CAPITAL LETTER IE
+0416 CYRILLIC CAPITAL LETTER ZHE
+0417 CYRILLIC CAPITAL LETTER ZE
+0418 CYRILLIC CAPITAL LETTER I
+0419 CYRILLIC CAPITAL LETTER SHORT I
+ : 0418 0306
+041A CYRILLIC CAPITAL LETTER KA
+041B CYRILLIC CAPITAL LETTER EL
+041C CYRILLIC CAPITAL LETTER EM
+041D CYRILLIC CAPITAL LETTER EN
+041E CYRILLIC CAPITAL LETTER O
+041F CYRILLIC CAPITAL LETTER PE
+0420 CYRILLIC CAPITAL LETTER ER
+0421 CYRILLIC CAPITAL LETTER ES
+0422 CYRILLIC CAPITAL LETTER TE
+0423 CYRILLIC CAPITAL LETTER U
+ x (cyrillic capital letter uk - 0478)
+ x (cyrillic small letter straight u - 04AF)
+ x (cyrillic capital letter monograph uk - A64A)
+0424 CYRILLIC CAPITAL LETTER EF
+0425 CYRILLIC CAPITAL LETTER HA
+0426 CYRILLIC CAPITAL LETTER TSE
+0427 CYRILLIC CAPITAL LETTER CHE
+0428 CYRILLIC CAPITAL LETTER SHA
+0429 CYRILLIC CAPITAL LETTER SHCHA
+042A CYRILLIC CAPITAL LETTER HARD SIGN
+042B CYRILLIC CAPITAL LETTER YERU
+042C CYRILLIC CAPITAL LETTER SOFT SIGN
+042D CYRILLIC CAPITAL LETTER E
+042E CYRILLIC CAPITAL LETTER YU
+042F CYRILLIC CAPITAL LETTER YA
+0430 CYRILLIC SMALL LETTER A
+0431 CYRILLIC SMALL LETTER BE
+0432 CYRILLIC SMALL LETTER VE
+0433 CYRILLIC SMALL LETTER GHE
+0434 CYRILLIC SMALL LETTER DE
+0435 CYRILLIC SMALL LETTER IE
+0436 CYRILLIC SMALL LETTER ZHE
+0437 CYRILLIC SMALL LETTER ZE
+0438 CYRILLIC SMALL LETTER I
+0439 CYRILLIC SMALL LETTER SHORT I
+ : 0438 0306
+043A CYRILLIC SMALL LETTER KA
+043B CYRILLIC SMALL LETTER EL
+043C CYRILLIC SMALL LETTER EM
+043D CYRILLIC SMALL LETTER EN
+043E CYRILLIC SMALL LETTER O
+043F CYRILLIC SMALL LETTER PE
+0440 CYRILLIC SMALL LETTER ER
+0441 CYRILLIC SMALL LETTER ES
+0442 CYRILLIC SMALL LETTER TE
+0443 CYRILLIC SMALL LETTER U
+0444 CYRILLIC SMALL LETTER EF
+0445 CYRILLIC SMALL LETTER HA
+0446 CYRILLIC SMALL LETTER TSE
+0447 CYRILLIC SMALL LETTER CHE
+0448 CYRILLIC SMALL LETTER SHA
+0449 CYRILLIC SMALL LETTER SHCHA
+044A CYRILLIC SMALL LETTER HARD SIGN
+044B CYRILLIC SMALL LETTER YERU
+ x (cyrillic small letter yeru with back yer - A651)
+044C CYRILLIC SMALL LETTER SOFT SIGN
+ x (latin small letter tone six - 0185)
+ x (cyrillic small letter neutral yer - A64F)
+044D CYRILLIC SMALL LETTER E
+044E CYRILLIC SMALL LETTER YU
+ x (cyrillic small letter reversed yu - A655)
+044F CYRILLIC SMALL LETTER YA
+@ Cyrillic extensions
+0450 CYRILLIC SMALL LETTER IE WITH GRAVE
+ * Macedonian
+ : 0435 0300
+0451 CYRILLIC SMALL LETTER IO
+ * Russian, ...
+ : 0435 0308
+0452 CYRILLIC SMALL LETTER DJE (Serbocroatian)
+ * Serbian
+ x (latin small letter d with stroke - 0111)
+0453 CYRILLIC SMALL LETTER GJE
+ * Macedonian
+ : 0433 0301
+0454 CYRILLIC SMALL LETTER UKRAINIAN IE
+ = Old Cyrillic yest
+0455 CYRILLIC SMALL LETTER DZE
+ * Macedonian
+ x (cyrillic small letter dzelo - A643)
+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+ = Old Cyrillic i
+0457 CYRILLIC SMALL LETTER YI (Ukrainian)
+ * Ukrainian
+ : 0456 0308
+0458 CYRILLIC SMALL LETTER JE
+ * Serbian, Azerbaijani, Altay
+0459 CYRILLIC SMALL LETTER LJE
+ * Serbian, Macedonian
+ x (latin small letter lj - 01C9)
+045A CYRILLIC SMALL LETTER NJE
+ * Serbian, Macedonian
+ x (latin small letter nj - 01CC)
+045B CYRILLIC SMALL LETTER TSHE (Serbocroatian)
+ * Serbian
+ x (latin small letter c with acute - 0107)
+ x (latin small letter h with stroke - 0127)
+ x (cyrillic capital letter tshe - 040B)
+ x (planck constant over two pi - 210F)
+ x (cyrillic small letter djerv - A649)
+045C CYRILLIC SMALL LETTER KJE
+ * Macedonian
+ : 043A 0301
+045D CYRILLIC SMALL LETTER I WITH GRAVE
+ * Macedonian, Bulgarian
+ : 0438 0300
+045E CYRILLIC SMALL LETTER SHORT U (Byelorussian)
+ * Byelorussian, Uzbek
+ : 0443 0306
+045F CYRILLIC SMALL LETTER DZHE
+ * Serbian, Macedonian, Abkhasian
+ x (latin small letter dz with caron - 01C6)
+@ Historic letters
+0460 CYRILLIC CAPITAL LETTER OMEGA
+0461 CYRILLIC SMALL LETTER OMEGA
+ x (cyrillic small letter broad omega - A64D)
+0462 CYRILLIC CAPITAL LETTER YAT
+0463 CYRILLIC SMALL LETTER YAT
+ x (cyrillic small letter iotified yat - A653)
+0464 CYRILLIC CAPITAL LETTER IOTIFIED E
+0465 CYRILLIC SMALL LETTER IOTIFIED E
+0466 CYRILLIC CAPITAL LETTER LITTLE YUS
+0467 CYRILLIC SMALL LETTER LITTLE YUS
+ x (cyrillic small letter closed little yus - A659)
+ x (cyrillic small letter blended yus - A65B)
+0468 CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469 CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+ x (cyrillic small letter ya - 044F)
+ x (cyrillic small letter iotified a - A657)
+ x (cyrillic small letter iotified closed little yus - A65D)
+046A CYRILLIC CAPITAL LETTER BIG YUS
+046B CYRILLIC SMALL LETTER BIG YUS
+ x (cyrillic small letter blended yus - A65B)
+046C CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046D CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046E CYRILLIC CAPITAL LETTER KSI
+046F CYRILLIC SMALL LETTER KSI
+0470 CYRILLIC CAPITAL LETTER PSI
+0471 CYRILLIC SMALL LETTER PSI
+0472 CYRILLIC CAPITAL LETTER FITA
+0473 CYRILLIC SMALL LETTER FITA
+ x (latin small letter barred o - 0275)
+ x (greek small letter theta - 03B8)
+0474 CYRILLIC CAPITAL LETTER IZHITSA
+0475 CYRILLIC SMALL LETTER IZHITSA
+0476 CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+ : 0474 030F
+0477 CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+ : 0475 030F
+0478 CYRILLIC CAPITAL LETTER UK
+ * may be rendered as either monograph or digraph form
+ * for "digraph uk" the preferred spelling is 041E 0443
+ x (cyrillic capital letter u - 0423)
+ * (cyrillic capital letter monograph uk - A64A)
+0479 CYRILLIC SMALL LETTER UK
+ * for "digraph uk" the preferred spelling is 043E 0443
+ * (cyrillic small letter monograph uk - A64B)
+047A CYRILLIC CAPITAL LETTER ROUND OMEGA
+047B CYRILLIC SMALL LETTER ROUND OMEGA
+047C CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+ = Cyrillic "beautiful omega"
+ * despite its name, this character does not have a titlo, nor is it composed of an omega plus a diacritic
+ * (cyrillic capital letter broad omega - A64C)
+047D CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047E CYRILLIC CAPITAL LETTER OT
+047F CYRILLIC SMALL LETTER OT
+0480 CYRILLIC CAPITAL LETTER KOPPA
+0481 CYRILLIC SMALL LETTER KOPPA
+@ Historic miscellaneous
+0482 CYRILLIC THOUSANDS SIGN
+0483 COMBINING CYRILLIC TITLO
+ * not used with letter titlos
+ x (combining cyrillic vzmet - A66F)
+0484 COMBINING CYRILLIC PALATALIZATION
+ x (combining vertical tilde - 033E)
+0485 COMBINING CYRILLIC DASIA PNEUMATA
+ x (combining reversed comma above - 0314)
+0486 COMBINING CYRILLIC PSILI PNEUMATA
+ x (combining comma above - 0313)
+0487 COMBINING CYRILLIC POKRYTIE
+ * used only with letter titlos
+ x (combining inverted breve - 0311)
+ x (combining cyrillic vzmet - A66F)
+0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+ * use 20DD for ten thousands sign
+0489 COMBINING CYRILLIC MILLIONS SIGN
+ x (combining cyrillic ten millions sign - A670)
+@ Extended Cyrillic
+048A CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048B CYRILLIC SMALL LETTER SHORT I WITH TAIL
+ * Kildin Sami
+048C CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048D CYRILLIC SMALL LETTER SEMISOFT SIGN
+ * Kildin Sami
+048E CYRILLIC CAPITAL LETTER ER WITH TICK
+048F CYRILLIC SMALL LETTER ER WITH TICK
+ * Kildin Sami
+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN
+ * Ukrainian
+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493 CYRILLIC SMALL LETTER GHE WITH STROKE
+ * Azerbaijani, Bashkir, ...
+ * full bar form preferred over half-barred "F"-type
+0494 CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495 CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+ * Abkhasian, Yakut
+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+ * Tatar, ...
+0498 CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499 CYRILLIC SMALL LETTER ZE WITH DESCENDER
+ * Bashkir
+ * letterforms with right hooks are preferred, although occasional variants with left hooks occur
+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049B CYRILLIC SMALL LETTER KA WITH DESCENDER
+ * Abkhasian, Tajik, ...
+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+ * Azerbaijani
+049E CYRILLIC CAPITAL LETTER KA WITH STROKE
+049F CYRILLIC SMALL LETTER KA WITH STROKE
+ * Abkhasian
+04A0 CYRILLIC CAPITAL LETTER BASHKIR KA
+04A1 CYRILLIC SMALL LETTER BASHKIR KA
+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER
+ * Bashkir, ...
+04A4 CYRILLIC CAPITAL LIGATURE EN GHE
+04A5 CYRILLIC SMALL LIGATURE EN GHE
+ * Altay, Mari, Yakut
+ * this is not a decomposable ligature
+04A6 CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (Abkhasian)
+04A7 CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (Abkhasian)
+ * Abkhasian
+04A8 CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04A9 CYRILLIC SMALL LETTER ABKHASIAN HA
+04AA CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AB CYRILLIC SMALL LETTER ES WITH DESCENDER
+ * Bashkir, Chuvash
+ * letterforms with right hooks are preferred, although occasional variants with left hooks occur
+ * in Chuvashia, letterforms identical to or similar in form to 00E7 regularly occur
+04AC CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AD CYRILLIC SMALL LETTER TE WITH DESCENDER
+ * Abkhasian
+04AE CYRILLIC CAPITAL LETTER STRAIGHT U
+04AF CYRILLIC SMALL LETTER STRAIGHT U
+ * stem is straight, unlike LETTER U
+ * Azerbaijani, Bashkir, ...
+ x (cyrillic capital letter u - 0423)
+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+ * Kazakh
+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER
+ * Abkhasian, Tajik, Uzbek
+04B4 CYRILLIC CAPITAL LIGATURE TE TSE (Abkhasian)
+04B5 CYRILLIC SMALL LIGATURE TE TSE (Abkhasian)
+ * Abkhasian
+ * this is not a decomposable ligature
+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER
+ * Abkhasian, Tajik
+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+ * Azerbaijani
+04BA CYRILLIC CAPITAL LETTER SHHA
+04BB CYRILLIC SMALL LETTER SHHA
+ * originally derived from Latin "h", but uppercase form 04BA is closer to an inverted che (0427)
+ * Azerbaijani, Bashkir, ...
+ x (latin small letter h - 0068)
+04BC CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BD CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BE CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04BF CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+ * some Abkhaz fonts show a descender shaped as for 045F
+ * other Abkhaz fonts show a right hook (ogonek or reversed comma shape)
+04C0 CYRILLIC LETTER PALOCHKA
+ * aspiration sign in many Caucasian languages
+ * is usually not cased, but the formal lowercase is 04CF
+ x (latin capital letter i - 0049)
+ x (cyrillic capital letter byelorussian-ukrainian i - 0406)
+04C1 CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+ : 0416 0306
+04C2 CYRILLIC SMALL LETTER ZHE WITH BREVE
+ * Moldavian
+ : 0436 0306
+04C3 CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C4 CYRILLIC SMALL LETTER KA WITH HOOK
+ * Khanty, Chukchi
+04C5 CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C6 CYRILLIC SMALL LETTER EL WITH TAIL
+ * Kildin Sami
+04C7 CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C8 CYRILLIC SMALL LETTER EN WITH HOOK
+ * Khanty, Chukchi, Nenets
+04C9 CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CA CYRILLIC SMALL LETTER EN WITH TAIL
+ * Kildin Sami
+04CB CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CC CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CD CYRILLIC CAPITAL LETTER EM WITH TAIL
+04CE CYRILLIC SMALL LETTER EM WITH TAIL
+ * Kildin Sami
+04CF CYRILLIC SMALL LETTER PALOCHKA
+04D0 CYRILLIC CAPITAL LETTER A WITH BREVE
+ : 0410 0306
+04D1 CYRILLIC SMALL LETTER A WITH BREVE
+ : 0430 0306
+04D2 CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+ : 0410 0308
+04D3 CYRILLIC SMALL LETTER A WITH DIAERESIS
+ : 0430 0308
+04D4 CYRILLIC CAPITAL LIGATURE A IE
+04D5 CYRILLIC SMALL LIGATURE A IE
+ * this is not a decomposable ligature
+ x (latin small letter ae - 00E6)
+04D6 CYRILLIC CAPITAL LETTER IE WITH BREVE
+ : 0415 0306
+04D7 CYRILLIC SMALL LETTER IE WITH BREVE
+ : 0435 0306
+04D8 CYRILLIC CAPITAL LETTER SCHWA
+04D9 CYRILLIC SMALL LETTER SCHWA
+ x (latin small letter schwa - 0259)
+04DA CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+ : 04D8 0308
+04DB CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+ : 04D9 0308
+04DC CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+ : 0416 0308
+04DD CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+ : 0436 0308
+04DE CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+ : 0417 0308
+04DF CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+ : 0437 0308
+04E0 CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E1 CYRILLIC SMALL LETTER ABKHASIAN DZE
+ x (latin small letter ezh - 0292)
+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON
+ : 0418 0304
+04E3 CYRILLIC SMALL LETTER I WITH MACRON
+ : 0438 0304
+04E4 CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+ : 0418 0308
+04E5 CYRILLIC SMALL LETTER I WITH DIAERESIS
+ : 0438 0308
+04E6 CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+ : 041E 0308
+04E7 CYRILLIC SMALL LETTER O WITH DIAERESIS
+ : 043E 0308
+04E8 CYRILLIC CAPITAL LETTER BARRED O
+04E9 CYRILLIC SMALL LETTER BARRED O
+ x (latin small letter barred o - 0275)
+04EA CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+ : 04E8 0308
+04EB CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+ : 04E9 0308
+04EC CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+ : 042D 0308
+04ED CYRILLIC SMALL LETTER E WITH DIAERESIS
+ * Kildin Sami
+ : 044D 0308
+04EE CYRILLIC CAPITAL LETTER U WITH MACRON
+ : 0423 0304
+04EF CYRILLIC SMALL LETTER U WITH MACRON
+ : 0443 0304
+04F0 CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+ : 0423 0308
+04F1 CYRILLIC SMALL LETTER U WITH DIAERESIS
+ : 0443 0308
+04F2 CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+ : 0423 030B
+04F3 CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+ : 0443 030B
+04F4 CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+ : 0427 0308
+04F5 CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+ : 0447 0308
+04F6 CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F7 CYRILLIC SMALL LETTER GHE WITH DESCENDER
+ * Yupik
+04F8 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+ : 042B 0308
+04F9 CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+ : 044B 0308
+@ Additions for Nivkh
+04FA CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+04FB CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+04FC CYRILLIC CAPITAL LETTER HA WITH HOOK
+04FD CYRILLIC SMALL LETTER HA WITH HOOK
+04FE CYRILLIC CAPITAL LETTER HA WITH STROKE
+04FF CYRILLIC SMALL LETTER HA WITH STROKE
+@@ 0500 Cyrillic Supplement 052F
+@ Komi letters
+0500 CYRILLIC CAPITAL LETTER KOMI DE
+0501 CYRILLIC SMALL LETTER KOMI DE
+0502 CYRILLIC CAPITAL LETTER KOMI DJE
+0503 CYRILLIC SMALL LETTER KOMI DJE
+0504 CYRILLIC CAPITAL LETTER KOMI ZJE
+0505 CYRILLIC SMALL LETTER KOMI ZJE
+0506 CYRILLIC CAPITAL LETTER KOMI DZJE
+0507 CYRILLIC SMALL LETTER KOMI DZJE
+0508 CYRILLIC CAPITAL LETTER KOMI LJE
+0509 CYRILLIC SMALL LETTER KOMI LJE
+050A CYRILLIC CAPITAL LETTER KOMI NJE
+050B CYRILLIC SMALL LETTER KOMI NJE
+050C CYRILLIC CAPITAL LETTER KOMI SJE
+050D CYRILLIC SMALL LETTER KOMI SJE
+050E CYRILLIC CAPITAL LETTER KOMI TJE
+050F CYRILLIC SMALL LETTER KOMI TJE
+@ Cyrillic extensions
+0510 CYRILLIC CAPITAL LETTER REVERSED ZE
+0511 CYRILLIC SMALL LETTER REVERSED ZE
+ * Enets, Khanty
+0512 CYRILLIC CAPITAL LETTER EL WITH HOOK
+0513 CYRILLIC SMALL LETTER EL WITH HOOK
+ * Chukchi, Itelmen, Khanty
+@ Mordvin letters
+0514 CYRILLIC CAPITAL LETTER LHA
+0515 CYRILLIC SMALL LETTER LHA
+ = voiceless l
+0516 CYRILLIC CAPITAL LETTER RHA
+0517 CYRILLIC SMALL LETTER RHA
+ = voiceless r
+0518 CYRILLIC CAPITAL LETTER YAE
+0519 CYRILLIC SMALL LETTER YAE
+@ Kurdish letters
+051A CYRILLIC CAPITAL LETTER QA
+051B CYRILLIC SMALL LETTER QA
+051C CYRILLIC CAPITAL LETTER WE
+051D CYRILLIC SMALL LETTER WE
+@ Aleut letter
+051E CYRILLIC CAPITAL LETTER ALEUT KA
+051F CYRILLIC SMALL LETTER ALEUT KA
+ * used for [q] in Aleut
+@ Chuvash letters
+@+ These are obsolete letters formerly used in Jakovlev's Chuvash orthography.
+0520 CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+0521 CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+ = palatalized l
+0522 CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+0523 CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+ = palatalized n
+@@ 0530 Armenian 058F
+@ Uppercase letters
+0531 ARMENIAN CAPITAL LETTER AYB
+0532 ARMENIAN CAPITAL LETTER BEN
+0533 ARMENIAN CAPITAL LETTER GIM
+0534 ARMENIAN CAPITAL LETTER DA
+0535 ARMENIAN CAPITAL LETTER ECH
+0536 ARMENIAN CAPITAL LETTER ZA
+0537 ARMENIAN CAPITAL LETTER EH
+0538 ARMENIAN CAPITAL LETTER ET
+0539 ARMENIAN CAPITAL LETTER TO
+053A ARMENIAN CAPITAL LETTER ZHE
+053B ARMENIAN CAPITAL LETTER INI
+053C ARMENIAN CAPITAL LETTER LIWN
+053D ARMENIAN CAPITAL LETTER XEH
+053E ARMENIAN CAPITAL LETTER CA
+053F ARMENIAN CAPITAL LETTER KEN
+0540 ARMENIAN CAPITAL LETTER HO
+0541 ARMENIAN CAPITAL LETTER JA
+0542 ARMENIAN CAPITAL LETTER GHAD
+0543 ARMENIAN CAPITAL LETTER CHEH
+0544 ARMENIAN CAPITAL LETTER MEN
+0545 ARMENIAN CAPITAL LETTER YI
+0546 ARMENIAN CAPITAL LETTER NOW
+0547 ARMENIAN CAPITAL LETTER SHA
+0548 ARMENIAN CAPITAL LETTER VO
+0549 ARMENIAN CAPITAL LETTER CHA
+054A ARMENIAN CAPITAL LETTER PEH
+054B ARMENIAN CAPITAL LETTER JHEH
+054C ARMENIAN CAPITAL LETTER RA
+054D ARMENIAN CAPITAL LETTER SEH
+054E ARMENIAN CAPITAL LETTER VEW
+054F ARMENIAN CAPITAL LETTER TIWN
+0550 ARMENIAN CAPITAL LETTER REH
+0551 ARMENIAN CAPITAL LETTER CO
+0552 ARMENIAN CAPITAL LETTER YIWN
+0553 ARMENIAN CAPITAL LETTER PIWR
+0554 ARMENIAN CAPITAL LETTER KEH
+0555 ARMENIAN CAPITAL LETTER OH
+0556 ARMENIAN CAPITAL LETTER FEH
+@ Modifier letters
+0559 ARMENIAN MODIFIER LETTER LEFT HALF RING
+ x (modifier letter reversed comma - 02BD)
+ x (modifier letter left half ring - 02BF)
+ x (combining reversed comma above - 0314)
+055A ARMENIAN APOSTROPHE
+ = armenian modifier letter right half ring (1.0)
+ x (modifier letter apostrophe - 02BC)
+ x (modifier letter right half ring - 02BE)
+ x (combining comma above - 0313)
+055B ARMENIAN EMPHASIS MARK
+ = shesht
+ x (modifier letter acute accent - 02CA)
+055C ARMENIAN EXCLAMATION MARK
+ = batsaganchakan nshan
+055D ARMENIAN COMMA
+ = bowt
+ x (modifier letter grave accent - 02CB)
+055E ARMENIAN QUESTION MARK
+ = hartsakan nshan
+055F ARMENIAN ABBREVIATION MARK
+ = patiw
+@ Lowercase letters
+0561 ARMENIAN SMALL LETTER AYB
+0562 ARMENIAN SMALL LETTER BEN
+0563 ARMENIAN SMALL LETTER GIM
+0564 ARMENIAN SMALL LETTER DA
+0565 ARMENIAN SMALL LETTER ECH
+0566 ARMENIAN SMALL LETTER ZA
+0567 ARMENIAN SMALL LETTER EH
+0568 ARMENIAN SMALL LETTER ET
+0569 ARMENIAN SMALL LETTER TO
+056A ARMENIAN SMALL LETTER ZHE
+056B ARMENIAN SMALL LETTER INI
+056C ARMENIAN SMALL LETTER LIWN
+056D ARMENIAN SMALL LETTER XEH
+056E ARMENIAN SMALL LETTER CA
+056F ARMENIAN SMALL LETTER KEN
+0570 ARMENIAN SMALL LETTER HO
+0571 ARMENIAN SMALL LETTER JA
+0572 ARMENIAN SMALL LETTER GHAD
+0573 ARMENIAN SMALL LETTER CHEH
+0574 ARMENIAN SMALL LETTER MEN
+0575 ARMENIAN SMALL LETTER YI
+0576 ARMENIAN SMALL LETTER NOW
+0577 ARMENIAN SMALL LETTER SHA
+0578 ARMENIAN SMALL LETTER VO
+0579 ARMENIAN SMALL LETTER CHA
+057A ARMENIAN SMALL LETTER PEH
+057B ARMENIAN SMALL LETTER JHEH
+057C ARMENIAN SMALL LETTER RA
+057D ARMENIAN SMALL LETTER SEH
+057E ARMENIAN SMALL LETTER VEW
+057F ARMENIAN SMALL LETTER TIWN
+0580 ARMENIAN SMALL LETTER REH
+0581 ARMENIAN SMALL LETTER CO
+0582 ARMENIAN SMALL LETTER YIWN
+0583 ARMENIAN SMALL LETTER PIWR
+0584 ARMENIAN SMALL LETTER KEH
+0585 ARMENIAN SMALL LETTER OH
+0586 ARMENIAN SMALL LETTER FEH
+0587 ARMENIAN SMALL LIGATURE ECH YIWN
+ # 0565 0582
+@ Punctuation
+0589 ARMENIAN FULL STOP
+ = vertsaket
+ * may also be used for Georgian
+ x (colon - 003A)
+058A ARMENIAN HYPHEN
+ = yentamna
+@@ 0590 Hebrew 05FF
+@ Cantillation marks
+0591 HEBREW ACCENT ETNAHTA
+ = atnah
+0592 HEBREW ACCENT SEGOL
+ = segolta
+0593 HEBREW ACCENT SHALSHELET
+0594 HEBREW ACCENT ZAQEF QATAN
+0595 HEBREW ACCENT ZAQEF GADOL
+0596 HEBREW ACCENT TIPEHA *
+ = tarha, me'ayla ~ mayla
+0597 HEBREW ACCENT REVIA
+0598 HEBREW ACCENT ZARQA *
+ = tsinorit, zinorit; tsinor, zinor
+ * This character is to be used when Zarqa or Tsinor are placed above, and also for Tsinorit.
+ x (hebrew accent zinor - 05AE)
+0599 HEBREW ACCENT PASHTA
+059A HEBREW ACCENT YETIV
+059B HEBREW ACCENT TEVIR
+059C HEBREW ACCENT GERESH
+ = teres
+059D HEBREW ACCENT GERESH MUQDAM
+059E HEBREW ACCENT GERSHAYIM
+059F HEBREW ACCENT QARNEY PARA
+ = pazer gadol
+05A0 HEBREW ACCENT TELISHA GEDOLA
+05A1 HEBREW ACCENT PAZER
+ = pazer qatan
+05A2 HEBREW ACCENT ATNAH HAFUKH
+ x (hebrew accent yerah ben yomo - 05AA)
+05A3 HEBREW ACCENT MUNAH
+05A4 HEBREW ACCENT MAHAPAKH
+05A5 HEBREW ACCENT MERKHA *
+ = yored
+05A6 HEBREW ACCENT MERKHA KEFULA
+05A7 HEBREW ACCENT DARGA
+05A8 HEBREW ACCENT QADMA *
+ = azla
+05A9 HEBREW ACCENT TELISHA QETANA
+05AA HEBREW ACCENT YERAH BEN YOMO *
+ = galgal
+ x (hebrew accent atnah hafukh - 05A2)
+05AB HEBREW ACCENT OLE
+05AC HEBREW ACCENT ILUY
+05AD HEBREW ACCENT DEHI
+05AE HEBREW ACCENT ZINOR
+ = tsinor; zarqa
+ * This character is to be used when Zarqa or Tsinor are placed above left.
+ x (hebrew accent zarqa - 0598)
+05AF HEBREW MARK MASORA CIRCLE
+@ Points and punctuation
+05B0 HEBREW POINT SHEVA
+05B1 HEBREW POINT HATAF SEGOL
+05B2 HEBREW POINT HATAF PATAH
+05B3 HEBREW POINT HATAF QAMATS
+05B4 HEBREW POINT HIRIQ
+05B5 HEBREW POINT TSERE
+05B6 HEBREW POINT SEGOL
+05B7 HEBREW POINT PATAH
+ * furtive patah is not a distinct character
+05B8 HEBREW POINT QAMATS
+ * used generically or as qamats gadol in orthography which distinguishes that from qamats qatan
+ x (hebrew point qamats qatan - 05C7)
+05B9 HEBREW POINT HOLAM
+05BA HEBREW POINT HOLAM HASER FOR VAV
+05BB HEBREW POINT QUBUTS
+05BC HEBREW POINT DAGESH OR MAPIQ (or shuruq)
+ = shuruq
+ * falls within the base letter
+05BD HEBREW POINT METEG *
+ = siluq
+ * may be used as a Hebrew accent sof pasuq
+05BE HEBREW PUNCTUATION MAQAF
+05BF HEBREW POINT RAFE
+ x (hebrew point judeo-spanish varika - FB1E)
+05C0 HEBREW PUNCTUATION PASEQ *
+ = legarmeh
+ * may be treated as spacing punctuation, not as a point
+ x (vertical line - 007C)
+05C1 HEBREW POINT SHIN DOT
+05C2 HEBREW POINT SIN DOT
+05C3 HEBREW PUNCTUATION SOF PASUQ *
+ * may be used as a Hebrew punctuation colon
+ x (colon - 003A)
+@ Puncta extraordinaria
+05C4 HEBREW MARK UPPER DOT
+05C5 HEBREW MARK LOWER DOT
+ * punctum extraordinarium (Psalms 27:13)
+ x (hebrew point hiriq - 05B4)
+@ Points and punctuation
+05C6 HEBREW PUNCTUATION NUN HAFUKHA
+ * does not historically derive from the letter nun
+ x (hebrew letter nun - 05E0)
+05C7 HEBREW POINT QAMATS QATAN
+ x (hebrew point qamats - 05B8)
+@ Based on ISO 8859-8
+05D0 HEBREW LETTER ALEF
+ = aleph
+ x (alef symbol - 2135)
+05D1 HEBREW LETTER BET
+ x (bet symbol - 2136)
+05D2 HEBREW LETTER GIMEL
+ x (gimel symbol - 2137)
+05D3 HEBREW LETTER DALET
+ x (dalet symbol - 2138)
+05D4 HEBREW LETTER HE
+05D5 HEBREW LETTER VAV
+05D6 HEBREW LETTER ZAYIN
+05D7 HEBREW LETTER HET
+05D8 HEBREW LETTER TET
+05D9 HEBREW LETTER YOD
+05DA HEBREW LETTER FINAL KAF
+05DB HEBREW LETTER KAF
+05DC HEBREW LETTER LAMED
+05DD HEBREW LETTER FINAL MEM
+05DE HEBREW LETTER MEM
+05DF HEBREW LETTER FINAL NUN
+05E0 HEBREW LETTER NUN
+05E1 HEBREW LETTER SAMEKH
+05E2 HEBREW LETTER AYIN
+05E3 HEBREW LETTER FINAL PE
+05E4 HEBREW LETTER PE
+05E5 HEBREW LETTER FINAL TSADI
+05E6 HEBREW LETTER TSADI
+ = zade
+05E7 HEBREW LETTER QOF
+05E8 HEBREW LETTER RESH
+05E9 HEBREW LETTER SHIN
+05EA HEBREW LETTER TAV
+@ Yiddish digraphs
+05F0 HEBREW LIGATURE YIDDISH DOUBLE VAV
+ = tsvey vovn
+05F1 HEBREW LIGATURE YIDDISH VAV YOD
+05F2 HEBREW LIGATURE YIDDISH DOUBLE YOD
+ = tsvey yudn
+@ Additional punctuation
+05F3 HEBREW PUNCTUATION GERESH
+05F4 HEBREW PUNCTUATION GERSHAYIM
+@@ 0600 Arabic 06FF
+@@+
+@ Subtending marks
+0600 ARABIC NUMBER SIGN
+0601 ARABIC SIGN SANAH
+0602 ARABIC FOOTNOTE MARKER
+0603 ARABIC SIGN SAFHA
+@ Radix symbols
+0606 ARABIC-INDIC CUBE ROOT
+ x (cube root - 221B)
+0607 ARABIC-INDIC FOURTH ROOT
+ x (fourth root - 221C)
+@ Letterlike symbol
+0608 ARABIC RAY
+@ Punctuation
+0609 ARABIC-INDIC PER MILLE SIGN
+ x (per mille sign - 2030)
+060A ARABIC-INDIC PER TEN THOUSAND SIGN
+ x (per ten thousand sign - 2031)
+@ Currency sign
+060B AFGHANI SIGN
+@ Punctuation
+060C ARABIC COMMA
+ * also used with Thaana and Syriac in modern text
+ x (comma - 002C)
+060D ARABIC DATE SEPARATOR
+@ Poetic marks
+060E ARABIC POETIC VERSE SIGN
+060F ARABIC SIGN MISRA
+@ Honorifics
+0610 ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+ * represents sallallahu alayhe wasallam "may God's peace and blessings be upon him"
+0611 ARABIC SIGN ALAYHE ASSALLAM
+ * represents alayhe assalam "upon him be peace"
+0612 ARABIC SIGN RAHMATULLAH ALAYHE
+ * represents rahmatullah alayhe "may God have mercy upon him"
+0613 ARABIC SIGN RADI ALLAHOU ANHU
+ * represents radi allahu 'anhu "may God be pleased with him"
+0614 ARABIC SIGN TAKHALLUS
+ * sign placed over the name or nom-de-plume of a poet, or in some writings used to mark all proper names
+@ Koranic annotation signs
+0615 ARABIC SMALL HIGH TAH
+ * marks a recommended pause position in some Korans published in Iran and Pakistan
+ * should not be confused with the small TAH sign used as a diacritic for some letters such as 0679
+0616 ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH
+0617 ARABIC SMALL HIGH ZAIN
+0618 ARABIC SMALL FATHA
+ * should not be confused with 064E FATHA
+0619 ARABIC SMALL DAMMA
+ * should not be confused with 064F DAMMA
+061A ARABIC SMALL KASRA
+ * should not be confused with 0650 KASRA
+@ Punctuation
+061B ARABIC SEMICOLON
+ * also used with Thaana and Syriac in modern text
+ x (semicolon - 003B)
+061E ARABIC TRIPLE DOT PUNCTUATION MARK
+061F ARABIC QUESTION MARK
+ * also used with Thaana and Syriac in modern text
+ x (question mark - 003F)
+ x (reversed question mark - 2E2E)
+@ Based on ISO 8859-6
+0621 ARABIC LETTER HAMZA
+ x (modifier letter right half ring - 02BE)
+0622 ARABIC LETTER ALEF WITH MADDA ABOVE
+ : 0627 0653
+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE
+ : 0627 0654
+0624 ARABIC LETTER WAW WITH HAMZA ABOVE
+ : 0648 0654
+0625 ARABIC LETTER ALEF WITH HAMZA BELOW
+ : 0627 0655
+0626 ARABIC LETTER YEH WITH HAMZA ABOVE
+ : 064A 0654
+0627 ARABIC LETTER ALEF
+0628 ARABIC LETTER BEH
+0629 ARABIC LETTER TEH MARBUTA
+062A ARABIC LETTER TEH
+062B ARABIC LETTER THEH
+062C ARABIC LETTER JEEM
+062D ARABIC LETTER HAH
+062E ARABIC LETTER KHAH
+062F ARABIC LETTER DAL
+0630 ARABIC LETTER THAL
+0631 ARABIC LETTER REH
+0632 ARABIC LETTER ZAIN
+0633 ARABIC LETTER SEEN
+0634 ARABIC LETTER SHEEN
+0635 ARABIC LETTER SAD
+0636 ARABIC LETTER DAD
+0637 ARABIC LETTER TAH
+0638 ARABIC LETTER ZAH
+0639 ARABIC LETTER AIN
+ x (latin small letter ezh reversed - 01B9)
+ x (modifier letter left half ring - 02BF)
+063A ARABIC LETTER GHAIN
+@ Additions for early Persian and Azerbaijani
+063B ARABIC LETTER KEHEH WITH TWO DOTS ABOVE
+063C ARABIC LETTER KEHEH WITH THREE DOTS BELOW
+063D ARABIC LETTER FARSI YEH WITH INVERTED V
+ * Azerbaijani
+063E ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE
+063F ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+@ Based on ISO 8859-6
+0640 ARABIC TATWEEL
+ = kashida
+ * inserted to stretch characters
+ * also used with Syriac
+0641 ARABIC LETTER FEH
+0642 ARABIC LETTER QAF
+0643 ARABIC LETTER KAF
+0644 ARABIC LETTER LAM
+0645 ARABIC LETTER MEEM
+0646 ARABIC LETTER NOON
+0647 ARABIC LETTER HEH
+0648 ARABIC LETTER WAW
+0649 ARABIC LETTER ALEF MAKSURA
+ * represents YEH-shaped letter with no dots in any positional form
+064A ARABIC LETTER YEH
+@ Points from ISO 8859-6
+064B ARABIC FATHATAN
+064C ARABIC DAMMATAN
+064D ARABIC KASRATAN
+064E ARABIC FATHA
+064F ARABIC DAMMA
+0650 ARABIC KASRA
+0651 ARABIC SHADDA
+0652 ARABIC SUKUN
+ * marks absence of a vowel after the base consonant
+ * used in some Korans to mark a long vowel as ignored
+ * can have a variety of shapes, including a circular one and a shape that looks like '06E1'
+ x (arabic small high dotless head of khah - 06E1)
+@ Combining maddah and hamza
+0653 ARABIC MADDAH ABOVE
+0654 ARABIC HAMZA ABOVE
+0655 ARABIC HAMZA BELOW
+@ Other combining marks
+0656 ARABIC SUBSCRIPT ALEF
+0657 ARABIC INVERTED DAMMA
+ = ulta pesh
+ * Kashmiri, Urdu
+0658 ARABIC MARK NOON GHUNNA
+ * Kashmiri and Baluchi
+ * indicates nasalization in Urdu
+0659 ARABIC ZWARAKAY
+ * Pashto
+065A ARABIC VOWEL SIGN SMALL V ABOVE
+ * African languages
+065B ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
+ * African languages
+065C ARABIC VOWEL SIGN DOT BELOW
+ * African languages
+065D ARABIC REVERSED DAMMA
+ * Ormuri, African languages
+065E ARABIC FATHA WITH TWO DOTS
+ * Kalami
+@ Arabic-Indic digits
+@+ These digits are used with Arabic proper; for languages of Iran, Pakistan, and India, see the Eastern Arabic-Indic digits at 06F0..06F9.
+0660 ARABIC-INDIC DIGIT ZERO
+0661 ARABIC-INDIC DIGIT ONE
+0662 ARABIC-INDIC DIGIT TWO
+0663 ARABIC-INDIC DIGIT THREE
+0664 ARABIC-INDIC DIGIT FOUR
+0665 ARABIC-INDIC DIGIT FIVE
+0666 ARABIC-INDIC DIGIT SIX
+0667 ARABIC-INDIC DIGIT SEVEN
+0668 ARABIC-INDIC DIGIT EIGHT
+0669 ARABIC-INDIC DIGIT NINE
+@ Punctuation
+066A ARABIC PERCENT SIGN
+ x (percent sign - 0025)
+066B ARABIC DECIMAL SEPARATOR
+066C ARABIC THOUSANDS SEPARATOR
+ x (apostrophe - 0027)
+ x (right single quotation mark - 2019)
+066D ARABIC FIVE POINTED STAR
+ * appearance rather variable
+ x (asterisk - 002A)
+@ Archaic letters
+066E ARABIC LETTER DOTLESS BEH
+066F ARABIC LETTER DOTLESS QAF
+@ Point
+0670 ARABIC LETTER SUPERSCRIPT ALEF
+ * actually a vowel sign, despite the name
+@ Extended Arabic letters
+0671 ARABIC LETTER ALEF WASLA
+ * Koranic Arabic
+0672 ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+ * Baluchi, Kashmiri
+0673 ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+ * Baluchi, Kashmiri
+0674 ARABIC LETTER HIGH HAMZA
+ * Kazakh
+ * forms digraphs
+0675 ARABIC LETTER HIGH HAMZA ALEF
+ * Kazakh
+ # 0627 0674
+0676 ARABIC LETTER HIGH HAMZA WAW
+ * Kazakh
+ # 0648 0674
+0677 ARABIC LETTER U WITH HAMZA ABOVE
+ * Kazakh
+ # 06C7 0674
+0678 ARABIC LETTER HIGH HAMZA YEH
+ * Kazakh
+ # 064A 0674
+0679 ARABIC LETTER TTEH
+ * Urdu
+067A ARABIC LETTER TTEHEH
+ * Sindhi
+067B ARABIC LETTER BEEH
+ * Sindhi
+067C ARABIC LETTER TEH WITH RING
+ * Pashto
+067D ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+ * Sindhi
+067E ARABIC LETTER PEH
+ * Persian, Urdu, ...
+067F ARABIC LETTER TEHEH
+ * Sindhi
+0680 ARABIC LETTER BEHEH
+ * Sindhi
+0681 ARABIC LETTER HAH WITH HAMZA ABOVE
+ * Pashto letter "dze"
+0682 ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+ * not used in modern Pashto
+0683 ARABIC LETTER NYEH
+ * Sindhi
+0684 ARABIC LETTER DYEH
+ * Sindhi
+0685 ARABIC LETTER HAH WITH THREE DOTS ABOVE
+ * Pashto, Khwarazmian
+0686 ARABIC LETTER TCHEH
+ * Persian, Urdu, ...
+0687 ARABIC LETTER TCHEHEH
+ * Sindhi
+0688 ARABIC LETTER DDAL
+ * Urdu
+0689 ARABIC LETTER DAL WITH RING
+ * Pashto
+068A ARABIC LETTER DAL WITH DOT BELOW
+ * Sindhi, early Persian
+068B ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+ * Lahnda
+068C ARABIC LETTER DAHAL
+ * Sindhi
+068D ARABIC LETTER DDAHAL
+ * Sindhi
+068E ARABIC LETTER DUL
+ * older shape for DUL, now obsolete in Sindhi
+ * Burushaski
+068F ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+ * Sindhi
+ * current shape used for DUL
+0690 ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+ * old Urdu, not in current use
+0691 ARABIC LETTER RREH
+ * Urdu
+0692 ARABIC LETTER REH WITH SMALL V
+ * Kurdish
+0693 ARABIC LETTER REH WITH RING
+ * Pashto
+0694 ARABIC LETTER REH WITH DOT BELOW
+ * Kurdish, early Persian
+0695 ARABIC LETTER REH WITH SMALL V BELOW
+ * Kurdish
+0696 ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+ * Pashto
+0697 ARABIC LETTER REH WITH TWO DOTS ABOVE
+ * Dargwa
+0698 ARABIC LETTER JEH
+ * Persian, Urdu, ...
+0699 ARABIC LETTER REH WITH FOUR DOTS ABOVE
+ * Sindhi
+069A ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+ * Pashto
+069B ARABIC LETTER SEEN WITH THREE DOTS BELOW
+ * early Persian
+069C ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+ * Moroccan Arabic
+069D ARABIC LETTER SAD WITH TWO DOTS BELOW
+ * Turkic
+069E ARABIC LETTER SAD WITH THREE DOTS ABOVE
+ * Berber, Burushaski
+069F ARABIC LETTER TAH WITH THREE DOTS ABOVE
+ * old Hausa
+06A0 ARABIC LETTER AIN WITH THREE DOTS ABOVE
+ * old Malay
+06A1 ARABIC LETTER DOTLESS FEH
+ * Adighe
+06A2 ARABIC LETTER FEH WITH DOT MOVED BELOW
+ * Maghrib Arabic
+06A3 ARABIC LETTER FEH WITH DOT BELOW
+ * Ingush
+06A4 ARABIC LETTER VEH
+ * Middle Eastern Arabic for foreign words
+ * Kurdish, Khwarazmian, early Persian
+06A5 ARABIC LETTER FEH WITH THREE DOTS BELOW
+ * North African Arabic for foreign words
+06A6 ARABIC LETTER PEHEH
+ * Sindhi
+06A7 ARABIC LETTER QAF WITH DOT ABOVE
+ * Maghrib Arabic
+06A8 ARABIC LETTER QAF WITH THREE DOTS ABOVE
+ * Tunisian Arabic
+06A9 ARABIC LETTER KEHEH
+ * Persian, Urdu, ...
+06AA ARABIC LETTER SWASH KAF
+06AB ARABIC LETTER KAF WITH RING
+ * Pashto
+ * may appear like an Arabic KAF (0643) with a ring below the base
+06AC ARABIC LETTER KAF WITH DOT ABOVE
+ * old Malay
+06AD ARABIC LETTER NG
+ * Uighur, Kazakh, old Malay, early Persian, ...
+06AE ARABIC LETTER KAF WITH THREE DOTS BELOW
+ * Berber, early Persian
+06AF ARABIC LETTER GAF *
+ * Persian, Urdu, ...
+06B0 ARABIC LETTER GAF WITH RING
+ * Lahnda
+06B1 ARABIC LETTER NGOEH
+ * Sindhi
+06B2 ARABIC LETTER GAF WITH TWO DOTS BELOW
+ * not used in Sindhi
+06B3 ARABIC LETTER GUEH
+ * Sindhi
+06B4 ARABIC LETTER GAF WITH THREE DOTS ABOVE
+ * not used in Sindhi
+06B5 ARABIC LETTER LAM WITH SMALL V
+ * Kurdish
+06B6 ARABIC LETTER LAM WITH DOT ABOVE
+ * Kurdish
+06B7 ARABIC LETTER LAM WITH THREE DOTS ABOVE
+ * Kurdish
+06B8 ARABIC LETTER LAM WITH THREE DOTS BELOW
+06B9 ARABIC LETTER NOON WITH DOT BELOW
+06BA ARABIC LETTER NOON GHUNNA
+ * Urdu
+06BB ARABIC LETTER RNOON
+ * Sindhi
+06BC ARABIC LETTER NOON WITH RING
+ * Pashto
+06BD ARABIC LETTER NOON WITH THREE DOTS ABOVE
+ * old Malay
+06BE ARABIC LETTER HEH DOACHASHMEE
+ * Urdu
+ * forms aspirate digraphs
+06BF ARABIC LETTER TCHEH WITH DOT ABOVE
+06C0 ARABIC LETTER HEH WITH YEH ABOVE
+ = arabic letter hamzah on ha (1.0)
+ = izafet
+ * Urdu
+ * actually a ligature, not an independent letter
+ : 06D5 0654
+06C1 ARABIC LETTER HEH GOAL
+ * Urdu
+06C2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+ * Urdu
+ * actually a ligature, not an independent letter
+ : 06C1 0654
+06C3 ARABIC LETTER TEH MARBUTA GOAL
+ * Urdu
+06C4 ARABIC LETTER WAW WITH RING
+ * Kashmiri
+06C5 ARABIC LETTER KIRGHIZ OE
+ * Kirghiz
+06C6 ARABIC LETTER OE
+ * Uighur, Kurdish, Kazakh. Azerbaijani
+06C7 ARABIC LETTER U
+ * Kirghiz, Azerbaijani
+06C8 ARABIC LETTER YU
+ * Uighur
+06C9 ARABIC LETTER KIRGHIZ YU
+ * Kazakh, Kirghiz
+06CA ARABIC LETTER WAW WITH TWO DOTS ABOVE
+ * Kurdish
+06CB ARABIC LETTER VE
+ * Uighur, Kazakh
+06CC ARABIC LETTER FARSI YEH
+ * Arabic, Persian, Urdu, ...
+ * initial and medial forms of this letter have dots
+ x (arabic letter alef maksura - 0649)
+ x (arabic letter yeh - 064A)
+06CD ARABIC LETTER YEH WITH TAIL
+ * Pashto, Sindhi
+06CE ARABIC LETTER YEH WITH SMALL V
+ * Kurdish
+06CF ARABIC LETTER WAW WITH DOT ABOVE
+06D0 ARABIC LETTER E *
+ * Pashto, Uighur
+ * used as the letter bbeh in Sindhi
+06D1 ARABIC LETTER YEH WITH THREE DOTS BELOW
+ * old Malay
+06D2 ARABIC LETTER YEH BARREE
+ * Urdu
+06D3 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+ * Urdu
+ * actually a ligature, not an independent letter
+ : 06D2 0654
+@ Punctuation
+06D4 ARABIC FULL STOP
+ * Urdu
+@ Extended Arabic letter
+06D5 ARABIC LETTER AE
+ * Uighur, Kazakh, Kirghiz
+@ Koranic annotation signs
+06D6 ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7 ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8 ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9 ARABIC SMALL HIGH LAM ALEF
+06DA ARABIC SMALL HIGH JEEM
+06DB ARABIC SMALL HIGH THREE DOTS
+06DC ARABIC SMALL HIGH SEEN
+06DD ARABIC END OF AYAH
+06DE ARABIC START OF RUB EL HIZB
+06DF ARABIC SMALL HIGH ROUNDED ZERO
+ * smaller than the typical circular shape used for 0652
+06E0 ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1 ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+ = Arabic jazm
+ * presentation form of 0652, using font technology to select the variant is preferred
+ * used in some Korans to mark absence of a vowel
+ x (arabic sukun - 0652)
+06E2 ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3 ARABIC SMALL LOW SEEN
+06E4 ARABIC SMALL HIGH MADDA
+06E5 ARABIC SMALL WAW
+06E6 ARABIC SMALL YEH
+06E7 ARABIC SMALL HIGH YEH
+06E8 ARABIC SMALL HIGH NOON
+06E9 ARABIC PLACE OF SAJDAH
+ * there is a range of acceptable glyphs for this character
+06EA ARABIC EMPTY CENTRE LOW STOP
+06EB ARABIC EMPTY CENTRE HIGH STOP
+06EC ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED ARABIC SMALL LOW MEEM
+@ Extended Arabic letters for Parkari
+06EE ARABIC LETTER DAL WITH INVERTED V
+06EF ARABIC LETTER REH WITH INVERTED V
+ * also used in early Persian
+@ Eastern Arabic-Indic digits
+@+ These digits are used with Arabic-script languages of Iran, Pakistan, and India (Persian, Sindhi, Urdu, etc.). For details of variations in preferred glyphs, see the block description for the Arabic script.
+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO
+06F1 EXTENDED ARABIC-INDIC DIGIT ONE
+06F2 EXTENDED ARABIC-INDIC DIGIT TWO
+06F3 EXTENDED ARABIC-INDIC DIGIT THREE
+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR
+ * Persian has a different glyph than Sindhi and Urdu
+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE
+ * Persian, Sindhi, and Urdu share glyph different from Arabic
+06F6 EXTENDED ARABIC-INDIC DIGIT SIX
+ * Persian, Sindhi, and Urdu have glyphs different from Arabic
+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN
+ * Urdu and Sindhi have glyphs different from Arabic
+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT
+06F9 EXTENDED ARABIC-INDIC DIGIT NINE
+@ Extended Arabic letters
+06FA ARABIC LETTER SHEEN WITH DOT BELOW
+06FB ARABIC LETTER DAD WITH DOT BELOW
+06FC ARABIC LETTER GHAIN WITH DOT BELOW
+@ Signs for Sindhi
+06FD ARABIC SIGN SINDHI AMPERSAND
+06FE ARABIC SIGN SINDHI POSTPOSITION MEN
+@ Extended Arabic letter for Parkari
+06FF ARABIC LETTER HEH WITH INVERTED V
+@@ 0700 Syriac 074F
+@ Syriac punctuation and signs
+0700 SYRIAC END OF PARAGRAPH
+ * marks the end of a paragraph
+0701 SYRIAC SUPRALINEAR FULL STOP
+ * marks interrogations, imperatives, and pauses, especially in Biblical texts
+0702 SYRIAC SUBLINEAR FULL STOP
+ * marks subordinate clauses and minor pauses, especially in Biblical texts
+0703 SYRIAC SUPRALINEAR COLON
+ * marks expressions of wonder and has a distinct pausal value in Biblical texts
+0704 SYRIAC SUBLINEAR COLON
+ * used at the end of verses of supplications
+0705 SYRIAC HORIZONTAL COLON
+ * joins two words closely together in a context to which a rising tone is suitable
+0706 SYRIAC COLON SKEWED LEFT
+ * marks a dependent clause
+0707 SYRIAC COLON SKEWED RIGHT
+ * marks the end of a subdivision of the apodosis, or latter part of a Biblical verse
+0708 SYRIAC SUPRALINEAR COLON SKEWED LEFT
+ * marks a minor phrase division
+0709 SYRIAC SUBLINEAR COLON SKEWED RIGHT
+ * marks the end of a real or rhetorical question
+070A SYRIAC CONTRACTION
+ * a contraction mark, mostly used in East Syriac
+ * placed at the end of an incomplete word
+070B SYRIAC HARKLEAN OBELUS
+ * marks the beginning of a phrase, word, or morpheme that has a marginal note
+070C SYRIAC HARKLEAN METOBELUS
+ * marks the end of a section with a marginal note
+070D SYRIAC HARKLEAN ASTERISCUS
+ * marks the beginning of a phrase, word, or morpheme that has a marginal note
+@ Syriac format control character
+070F SYRIAC ABBREVIATION MARK
+ = SAM
+ * marks the beginning of a Syriac abbreviation
+@ Syriac letters
+0710 SYRIAC LETTER ALAPH
+0711 SYRIAC LETTER SUPERSCRIPT ALAPH
+ * used in East Syriac texts to indicate an etymological Alaph
+0712 SYRIAC LETTER BETH
+0713 SYRIAC LETTER GAMAL
+0714 SYRIAC LETTER GAMAL GARSHUNI
+ * used in Garshuni documents
+0715 SYRIAC LETTER DALATH
+0716 SYRIAC LETTER DOTLESS DALATH RISH
+ * ambiguous form for undifferentiated early dalath/rish
+0717 SYRIAC LETTER HE
+0718 SYRIAC LETTER WAW
+0719 SYRIAC LETTER ZAIN
+071A SYRIAC LETTER HETH
+071B SYRIAC LETTER TETH
+071C SYRIAC LETTER TETH GARSHUNI
+ * used in Garshuni documents
+071D SYRIAC LETTER YUDH
+071E SYRIAC LETTER YUDH HE
+ * mostly used in East Syriac texts
+071F SYRIAC LETTER KAPH
+0720 SYRIAC LETTER LAMADH
+0721 SYRIAC LETTER MIM
+0722 SYRIAC LETTER NUN
+0723 SYRIAC LETTER SEMKATH
+0724 SYRIAC LETTER FINAL SEMKATH
+0725 SYRIAC LETTER E
+0726 SYRIAC LETTER PE
+0727 SYRIAC LETTER REVERSED PE
+ * used in Christian Palestinian Aramaic
+0728 SYRIAC LETTER SADHE
+0729 SYRIAC LETTER QAPH
+072A SYRIAC LETTER RISH
+072B SYRIAC LETTER SHIN
+072C SYRIAC LETTER TAW
+@ Persian letters
+072D SYRIAC LETTER PERSIAN BHETH
+072E SYRIAC LETTER PERSIAN GHAMAL
+072F SYRIAC LETTER PERSIAN DHALATH
+@ Syriac points (vowels)
+0730 SYRIAC PTHAHA ABOVE
+0731 SYRIAC PTHAHA BELOW
+0732 SYRIAC PTHAHA DOTTED
+0733 SYRIAC ZQAPHA ABOVE
+0734 SYRIAC ZQAPHA BELOW
+0735 SYRIAC ZQAPHA DOTTED
+0736 SYRIAC RBASA ABOVE
+0737 SYRIAC RBASA BELOW
+0738 SYRIAC DOTTED ZLAMA HORIZONTAL
+0739 SYRIAC DOTTED ZLAMA ANGULAR
+073A SYRIAC HBASA ABOVE
+073B SYRIAC HBASA BELOW
+073C SYRIAC HBASA-ESASA DOTTED
+073D SYRIAC ESASA ABOVE
+073E SYRIAC ESASA BELOW
+073F SYRIAC RWAHA
+@ Syriac marks
+0740 SYRIAC FEMININE DOT
+ * feminine marker used with the Taw feminine suffix
+0741 SYRIAC QUSHSHAYA
+ * indicates a plosive pronunciation
+0742 SYRIAC RUKKAKHA
+ * indicates an aspirated (spirantized) pronunciation
+0743 SYRIAC TWO VERTICAL DOTS ABOVE
+ * accent mark used in ancient manuscripts
+0744 SYRIAC TWO VERTICAL DOTS BELOW
+ * accent mark used in ancient manuscripts
+0745 SYRIAC THREE DOTS ABOVE
+ * diacritic used in Turoyo for letters not found in Syriac
+0746 SYRIAC THREE DOTS BELOW
+ * diacritic used in Turoyo for letters not found in Syriac
+0747 SYRIAC OBLIQUE LINE ABOVE
+ * indication of a silent letter
+0748 SYRIAC OBLIQUE LINE BELOW
+ * indication of a silent letter
+ * also used to indicate numbers multiplied by a certain constant
+0749 SYRIAC MUSIC
+ * a music mark
+ * also used in the Syrian Orthodox Anaphora book to mark the breaking of the Eucharist bread
+074A SYRIAC BARREKH
+ * a diacritic cross used in liturgical texts
+@ Sogdian letters
+074D SYRIAC LETTER SOGDIAN ZHAIN
+074E SYRIAC LETTER SOGDIAN KHAPH
+074F SYRIAC LETTER SOGDIAN FE
+@@ 0750 Arabic Supplement 077F
+@ Extended Arabic letters
+@+ These are primarily used in Arabic-script orthographies of African languages.
+0750 ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW
+0751 ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE
+0752 ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW
+0753 ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE
+0754 ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE
+0755 ARABIC LETTER BEH WITH INVERTED SMALL V BELOW
+0756 ARABIC LETTER BEH WITH SMALL V
+0757 ARABIC LETTER HAH WITH TWO DOTS ABOVE
+0758 ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW
+0759 ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH
+ * Saraiki
+075A ARABIC LETTER DAL WITH INVERTED SMALL V BELOW
+075B ARABIC LETTER REH WITH STROKE
+075C ARABIC LETTER SEEN WITH FOUR DOTS ABOVE
+ * Shina
+075D ARABIC LETTER AIN WITH TWO DOTS ABOVE
+075E ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE
+075F ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE
+0760 ARABIC LETTER FEH WITH TWO DOTS BELOW
+0761 ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW
+0762 ARABIC LETTER KEHEH WITH DOT ABOVE
+ * old Malay, preferred to 06AC
+ x (arabic letter kaf with dot above - 06AC)
+0763 ARABIC LETTER KEHEH WITH THREE DOTS ABOVE
+ * Moroccan Arabic, Amazigh, Burushaski
+ x (arabic letter ng - 06AD)
+0764 ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW
+0765 ARABIC LETTER MEEM WITH DOT ABOVE
+0766 ARABIC LETTER MEEM WITH DOT BELOW
+ * Maba
+0767 ARABIC LETTER NOON WITH TWO DOTS BELOW
+0768 ARABIC LETTER NOON WITH SMALL TAH
+ * Saraiki, Pathwari
+0769 ARABIC LETTER NOON WITH SMALL V
+ * Gojri
+076A ARABIC LETTER LAM WITH BAR
+076B ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE
+ * Torwali, Ormuri
+076C ARABIC LETTER REH WITH HAMZA ABOVE
+ * Ormuri
+076D ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+ * Kalami, Ormuri
+@ Additions for Khowar
+076E ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW
+076F ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0770 ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0771 ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+@ Addition for Torwali
+0772 ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE
+@ Additions for Burushaski
+0773 ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0774 ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0775 ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0776 ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0777 ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+0778 ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0779 ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+077A ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+077B ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+077C ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+077D ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE
+@ Additions for early Persian
+077E ARABIC LETTER SEEN WITH INVERTED V
+077F ARABIC LETTER KAF WITH TWO DOTS ABOVE
+@@ 0780 Thaana 07BF
+@ Basic consonants
+0780 THAANA LETTER HAA
+0781 THAANA LETTER SHAVIYANI
+0782 THAANA LETTER NOONU
+0783 THAANA LETTER RAA
+0784 THAANA LETTER BAA
+0785 THAANA LETTER LHAVIYANI
+0786 THAANA LETTER KAAFU
+0787 THAANA LETTER ALIFU
+0788 THAANA LETTER VAAVU
+0789 THAANA LETTER MEEMU
+078A THAANA LETTER FAAFU
+078B THAANA LETTER DHAALU
+078C THAANA LETTER THAA
+078D THAANA LETTER LAAMU
+078E THAANA LETTER GAAFU
+078F THAANA LETTER GNAVIYANI
+0790 THAANA LETTER SEENU
+0791 THAANA LETTER DAVIYANI
+0792 THAANA LETTER ZAVIYANI
+0793 THAANA LETTER TAVIYANI
+0794 THAANA LETTER YAA
+0795 THAANA LETTER PAVIYANI
+0796 THAANA LETTER JAVIYANI
+0797 THAANA LETTER CHAVIYANI
+@ Extensions for Arabic
+0798 THAANA LETTER TTAA
+0799 THAANA LETTER HHAA
+079A THAANA LETTER KHAA
+079B THAANA LETTER THAALU
+079C THAANA LETTER ZAA
+079D THAANA LETTER SHEENU
+079E THAANA LETTER SAADHU
+079F THAANA LETTER DAADHU
+07A0 THAANA LETTER TO
+07A1 THAANA LETTER ZO
+07A2 THAANA LETTER AINU
+07A3 THAANA LETTER GHAINU
+07A4 THAANA LETTER QAAFU
+07A5 THAANA LETTER WAAVU
+@ Vowels
+07A6 THAANA ABAFILI
+07A7 THAANA AABAAFILI
+07A8 THAANA IBIFILI
+07A9 THAANA EEBEEFILI
+07AA THAANA UBUFILI
+07AB THAANA OOBOOFILI
+07AC THAANA EBEFILI
+07AD THAANA EYBEYFILI
+07AE THAANA OBOFILI
+07AF THAANA OABOAFILI
+07B0 THAANA SUKUN
+@ Consonant for Addu dialect
+07B1 THAANA LETTER NAA
+@@ 07C0 NKo 07FF
+@ Digits
+07C0 NKO DIGIT ZERO
+07C1 NKO DIGIT ONE
+07C2 NKO DIGIT TWO
+07C3 NKO DIGIT THREE
+07C4 NKO DIGIT FOUR
+07C5 NKO DIGIT FIVE
+07C6 NKO DIGIT SIX
+07C7 NKO DIGIT SEVEN
+07C8 NKO DIGIT EIGHT
+07C9 NKO DIGIT NINE
+@ Letters
+07CA NKO LETTER A
+07CB NKO LETTER EE
+07CC NKO LETTER I
+07CD NKO LETTER E
+07CE NKO LETTER U
+07CF NKO LETTER OO
+07D0 NKO LETTER O
+07D1 NKO LETTER DAGBASINNA
+07D2 NKO LETTER N
+07D3 NKO LETTER BA
+07D4 NKO LETTER PA
+07D5 NKO LETTER TA
+07D6 NKO LETTER JA
+07D7 NKO LETTER CHA
+07D8 NKO LETTER DA
+07D9 NKO LETTER RA
+07DA NKO LETTER RRA
+07DB NKO LETTER SA
+07DC NKO LETTER GBA
+07DD NKO LETTER FA
+07DE NKO LETTER KA
+07DF NKO LETTER LA
+07E0 NKO LETTER NA WOLOSO
+07E1 NKO LETTER MA
+07E2 NKO LETTER NYA
+07E3 NKO LETTER NA
+07E4 NKO LETTER HA
+07E5 NKO LETTER WA
+07E6 NKO LETTER YA
+07E7 NKO LETTER NYA WOLOSO
+@ Archaic letters
+07E8 NKO LETTER JONA JA
+07E9 NKO LETTER JONA CHA
+07EA NKO LETTER JONA RA
+ x (nko letter ra - 07D9)
+@ Tone marks
+07EB NKO COMBINING SHORT HIGH TONE
+ x (combining macron - 0304)
+07EC NKO COMBINING SHORT LOW TONE
+ x (combining tilde - 0303)
+07ED NKO COMBINING SHORT RISING TONE
+ x (combining dot above - 0307)
+07EE NKO COMBINING LONG DESCENDING TONE
+ x (combining circumflex accent - 0302)
+07EF NKO COMBINING LONG HIGH TONE
+07F0 NKO COMBINING LONG LOW TONE
+07F1 NKO COMBINING LONG RISING TONE
+07F2 NKO COMBINING NASALIZATION MARK
+ x (combining dot below - 0323)
+07F3 NKO COMBINING DOUBLE DOT ABOVE
+ x (combining diaeresis - 0308)
+07F4 NKO HIGH TONE APOSTROPHE
+ x (modifier letter apostrophe - 02BC)
+07F5 NKO LOW TONE APOSTROPHE
+ x (modifier letter turned comma - 02BB)
+@ Symbol
+07F6 NKO SYMBOL OO DENNEN
+@ Punctuation
+07F7 NKO SYMBOL GBAKURUNEN
+07F8 NKO COMMA
+07F9 NKO EXCLAMATION MARK
+@ Letter extender
+07FA NKO LAJANYALAN
+ x (low line - 005F)
+ x (arabic tatweel - 0640)
+@@ 0900 Devanagari 097F
+@@+
+@ Based on ISCII 1988
+@ Various signs
+0901 DEVANAGARI SIGN CANDRABINDU
+ = anunasika
+ x (combining candrabindu - 0310)
+0902 DEVANAGARI SIGN ANUSVARA
+ = bindu
+0903 DEVANAGARI SIGN VISARGA
+@ Independent vowels
+0904 DEVANAGARI LETTER SHORT A
+0905 DEVANAGARI LETTER A
+0906 DEVANAGARI LETTER AA
+0907 DEVANAGARI LETTER I
+0908 DEVANAGARI LETTER II
+0909 DEVANAGARI LETTER U
+090A DEVANAGARI LETTER UU
+090B DEVANAGARI LETTER VOCALIC R
+090C DEVANAGARI LETTER VOCALIC L
+090D DEVANAGARI LETTER CANDRA E
+090E DEVANAGARI LETTER SHORT E
+ * for transcribing Dravidian short e
+090F DEVANAGARI LETTER E
+0910 DEVANAGARI LETTER AI
+0911 DEVANAGARI LETTER CANDRA O
+0912 DEVANAGARI LETTER SHORT O
+ * for transcribing Dravidian short o
+0913 DEVANAGARI LETTER O
+0914 DEVANAGARI LETTER AU
+@ Consonants
+0915 DEVANAGARI LETTER KA
+0916 DEVANAGARI LETTER KHA
+0917 DEVANAGARI LETTER GA
+0918 DEVANAGARI LETTER GHA
+0919 DEVANAGARI LETTER NGA
+091A DEVANAGARI LETTER CA
+091B DEVANAGARI LETTER CHA
+091C DEVANAGARI LETTER JA
+091D DEVANAGARI LETTER JHA
+091E DEVANAGARI LETTER NYA
+091F DEVANAGARI LETTER TTA
+0920 DEVANAGARI LETTER TTHA
+0921 DEVANAGARI LETTER DDA
+0922 DEVANAGARI LETTER DDHA
+0923 DEVANAGARI LETTER NNA
+0924 DEVANAGARI LETTER TA
+0925 DEVANAGARI LETTER THA
+0926 DEVANAGARI LETTER DA
+0927 DEVANAGARI LETTER DHA
+0928 DEVANAGARI LETTER NA
+0929 DEVANAGARI LETTER NNNA
+ * for transcribing Dravidian alveolar n
+ : 0928 093C
+092A DEVANAGARI LETTER PA
+092B DEVANAGARI LETTER PHA
+092C DEVANAGARI LETTER BA
+092D DEVANAGARI LETTER BHA
+092E DEVANAGARI LETTER MA
+092F DEVANAGARI LETTER YA
+0930 DEVANAGARI LETTER RA
+0931 DEVANAGARI LETTER RRA
+ * for transcribing Dravidian alveolar r
+ * half form is represented as "Eyelash RA"
+ : 0930 093C
+0932 DEVANAGARI LETTER LA
+0933 DEVANAGARI LETTER LLA
+0934 DEVANAGARI LETTER LLLA
+ * for transcribing Dravidian l
+ : 0933 093C
+0935 DEVANAGARI LETTER VA
+0936 DEVANAGARI LETTER SHA
+0937 DEVANAGARI LETTER SSA
+0938 DEVANAGARI LETTER SA
+0939 DEVANAGARI LETTER HA
+@ Various signs
+093C DEVANAGARI SIGN NUKTA
+ * for extending the alphabet to new letters
+093D DEVANAGARI SIGN AVAGRAHA
+@ Dependent vowel signs
+093E DEVANAGARI VOWEL SIGN AA
+093F DEVANAGARI VOWEL SIGN I
+ * stands to the left of the consonant
+0940 DEVANAGARI VOWEL SIGN II
+0941 DEVANAGARI VOWEL SIGN U
+0942 DEVANAGARI VOWEL SIGN UU
+0943 DEVANAGARI VOWEL SIGN VOCALIC R
+0944 DEVANAGARI VOWEL SIGN VOCALIC RR
+0945 DEVANAGARI VOWEL SIGN CANDRA E
+ = candra
+0946 DEVANAGARI VOWEL SIGN SHORT E
+ * for transcribing Dravidian vowels
+0947 DEVANAGARI VOWEL SIGN E
+0948 DEVANAGARI VOWEL SIGN AI
+0949 DEVANAGARI VOWEL SIGN CANDRA O
+094A DEVANAGARI VOWEL SIGN SHORT O
+ * for transcribing Dravidian vowels
+094B DEVANAGARI VOWEL SIGN O
+094C DEVANAGARI VOWEL SIGN AU
+@ Various signs
+094D DEVANAGARI SIGN VIRAMA
+ = halant (the preferred Hindi name)
+ * suppresses inherent vowel
+0950 DEVANAGARI OM
+0951 DEVANAGARI STRESS SIGN UDATTA
+ = Vedic tone svarita
+ * mostly used for Rigvedic svarita, with rare use for Yajurvedic udatta
+ * used also in Vedic texts written in other scripts
+0952 DEVANAGARI STRESS SIGN ANUDATTA
+ = Vedic tone anudatta
+ * used also in Vedic texts written in other scripts
+0953 DEVANAGARI GRAVE ACCENT
+0954 DEVANAGARI ACUTE ACCENT
+@ Additional consonants
+0958 DEVANAGARI LETTER QA
+ : 0915 093C
+0959 DEVANAGARI LETTER KHHA
+ : 0916 093C
+095A DEVANAGARI LETTER GHHA
+ : 0917 093C
+095B DEVANAGARI LETTER ZA
+ : 091C 093C
+095C DEVANAGARI LETTER DDDHA
+ : 0921 093C
+095D DEVANAGARI LETTER RHA
+ : 0922 093C
+095E DEVANAGARI LETTER FA
+ : 092B 093C
+095F DEVANAGARI LETTER YYA
+ : 092F 093C
+@ Additional vowels for Sanskrit
+0960 DEVANAGARI LETTER VOCALIC RR
+0961 DEVANAGARI LETTER VOCALIC LL
+0962 DEVANAGARI VOWEL SIGN VOCALIC L
+0963 DEVANAGARI VOWEL SIGN VOCALIC LL
+@ Generic punctuation for scripts of India
+@+ These punctuation marks are for common use for the scripts of India despite being named "DEVANAGARI".
+0964 DEVANAGARI DANDA
+ = purna viram
+ * phrase separator
+0965 DEVANAGARI DOUBLE DANDA
+ = deergh viram
+@ Digits
+0966 DEVANAGARI DIGIT ZERO
+0967 DEVANAGARI DIGIT ONE
+0968 DEVANAGARI DIGIT TWO
+0969 DEVANAGARI DIGIT THREE
+096A DEVANAGARI DIGIT FOUR
+096B DEVANAGARI DIGIT FIVE
+096C DEVANAGARI DIGIT SIX
+096D DEVANAGARI DIGIT SEVEN
+096E DEVANAGARI DIGIT EIGHT
+096F DEVANAGARI DIGIT NINE
+@ Devanagari-specific additions
+0970 DEVANAGARI ABBREVIATION SIGN
+0971 DEVANAGARI SIGN HIGH SPACING DOT
+@ Additional vowel for Marathi
+0972 DEVANAGARI LETTER CANDRA A
+ * Marathi
+@ Sindhi implosives
+097B DEVANAGARI LETTER GGA
+097C DEVANAGARI LETTER JJA
+@ Glottal stop
+097D DEVANAGARI LETTER GLOTTAL STOP
+ * used for writing Limbu in Devanagari
+ * a glyph variant has the connecting top bar
+@ Sindhi implosives
+097E DEVANAGARI LETTER DDDA
+097F DEVANAGARI LETTER BBA
+@@ 0980 Bengali 09FF
+@ Based on ISCII 1988
+@ Various signs
+0981 BENGALI SIGN CANDRABINDU
+0982 BENGALI SIGN ANUSVARA
+0983 BENGALI SIGN VISARGA
+@ Independent vowels
+0985 BENGALI LETTER A
+0986 BENGALI LETTER AA
+0987 BENGALI LETTER I
+0988 BENGALI LETTER II
+0989 BENGALI LETTER U
+098A BENGALI LETTER UU
+098B BENGALI LETTER VOCALIC R
+098C BENGALI LETTER VOCALIC L
+098F BENGALI LETTER E
+0990 BENGALI LETTER AI
+0993 BENGALI LETTER O
+0994 BENGALI LETTER AU
+@ Consonants
+0995 BENGALI LETTER KA
+0996 BENGALI LETTER KHA
+0997 BENGALI LETTER GA
+0998 BENGALI LETTER GHA
+0999 BENGALI LETTER NGA
+099A BENGALI LETTER CA
+099B BENGALI LETTER CHA
+099C BENGALI LETTER JA
+099D BENGALI LETTER JHA
+099E BENGALI LETTER NYA
+099F BENGALI LETTER TTA
+09A0 BENGALI LETTER TTHA
+09A1 BENGALI LETTER DDA
+09A2 BENGALI LETTER DDHA
+09A3 BENGALI LETTER NNA
+09A4 BENGALI LETTER TA
+09A5 BENGALI LETTER THA
+09A6 BENGALI LETTER DA
+09A7 BENGALI LETTER DHA
+09A8 BENGALI LETTER NA
+09AA BENGALI LETTER PA
+09AB BENGALI LETTER PHA
+09AC BENGALI LETTER BA
+ = Bengali va, wa
+09AD BENGALI LETTER BHA
+09AE BENGALI LETTER MA
+09AF BENGALI LETTER YA
+09B0 BENGALI LETTER RA
+09B2 BENGALI LETTER LA
+09B6 BENGALI LETTER SHA
+09B7 BENGALI LETTER SSA
+09B8 BENGALI LETTER SA
+09B9 BENGALI LETTER HA
+@ Various signs
+09BC BENGALI SIGN NUKTA
+ * for extending the alphabet to new letters
+09BD BENGALI SIGN AVAGRAHA
+@ Dependent vowel signs
+09BE BENGALI VOWEL SIGN AA
+09BF BENGALI VOWEL SIGN I
+ * stands to the left of the consonant
+09C0 BENGALI VOWEL SIGN II
+09C1 BENGALI VOWEL SIGN U
+09C2 BENGALI VOWEL SIGN UU
+09C3 BENGALI VOWEL SIGN VOCALIC R
+09C4 BENGALI VOWEL SIGN VOCALIC RR
+09C7 BENGALI VOWEL SIGN E
+ * stands to the left of the consonant
+09C8 BENGALI VOWEL SIGN AI
+ * stands to the left of the consonant
+@ Two-part dependent vowel signs
+@+ These vowel signs have glyph pieces which stand on both sides of the consonant; they follow the consonant in logical order, and should be handled as a unit for most processing.
+09CB BENGALI VOWEL SIGN O
+ : 09C7 09BE
+09CC BENGALI VOWEL SIGN AU
+ : 09C7 09D7
+@ Sign
+09CD BENGALI SIGN VIRAMA
+ = hasant (Bengali term for halant)
+@ Additional consonant
+09CE BENGALI LETTER KHANDA TA
+ * a dead consonant form of ta, without implicit vowel, used in some sequences
+@ Sign
+09D7 BENGALI AU LENGTH MARK
+@ Additional consonants
+09DC BENGALI LETTER RRA
+ : 09A1 09BC
+09DD BENGALI LETTER RHA
+ : 09A2 09BC
+09DF BENGALI LETTER YYA
+ : 09AF 09BC
+@ Additional vowels for Sanskrit
+09E0 BENGALI LETTER VOCALIC RR
+09E1 BENGALI LETTER VOCALIC LL
+09E2 BENGALI VOWEL SIGN VOCALIC L
+09E3 BENGALI VOWEL SIGN VOCALIC LL
+@ Reserved
+@+ For viram punctuation, use the generic Indic 0964 and 0965.
+09E4 <reserved>
+ x (devanagari danda - 0964)
+09E5 <reserved>
+ x (devanagari double danda - 0965)
+@ Digits
+09E6 BENGALI DIGIT ZERO
+09E7 BENGALI DIGIT ONE
+09E8 BENGALI DIGIT TWO
+09E9 BENGALI DIGIT THREE
+09EA BENGALI DIGIT FOUR
+09EB BENGALI DIGIT FIVE
+09EC BENGALI DIGIT SIX
+09ED BENGALI DIGIT SEVEN
+09EE BENGALI DIGIT EIGHT
+09EF BENGALI DIGIT NINE
+@ Bengali-specific additions
+09F0 BENGALI LETTER RA WITH MIDDLE DIAGONAL (Assamese)
+ * Assamese
+09F1 BENGALI LETTER RA WITH LOWER DIAGONAL (Assamese)
+ = bengali letter va with lower diagonal (1.0)
+ * Assamese
+09F2 BENGALI RUPEE MARK
+09F3 BENGALI RUPEE SIGN
+09F4 BENGALI CURRENCY NUMERATOR ONE
+ * not in current usage
+09F5 BENGALI CURRENCY NUMERATOR TWO
+ * not in current usage
+09F6 BENGALI CURRENCY NUMERATOR THREE
+ * not in current usage
+09F7 BENGALI CURRENCY NUMERATOR FOUR
+09F8 BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9 BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA BENGALI ISSHAR
+@@ 0A00 Gurmukhi 0A7F
+@ Based on ISCII 1988
+@ Various signs
+0A01 GURMUKHI SIGN ADAK BINDI
+0A02 GURMUKHI SIGN BINDI
+0A03 GURMUKHI SIGN VISARGA
+@ Independent vowels
+0A05 GURMUKHI LETTER A
+ = aira
+0A06 GURMUKHI LETTER AA
+0A07 GURMUKHI LETTER I
+0A08 GURMUKHI LETTER II
+0A09 GURMUKHI LETTER U
+0A0A GURMUKHI LETTER UU
+0A0F GURMUKHI LETTER EE
+0A10 GURMUKHI LETTER AI
+0A13 GURMUKHI LETTER OO
+0A14 GURMUKHI LETTER AU
+@ Consonants
+0A15 GURMUKHI LETTER KA
+0A16 GURMUKHI LETTER KHA
+0A17 GURMUKHI LETTER GA
+0A18 GURMUKHI LETTER GHA
+0A19 GURMUKHI LETTER NGA
+0A1A GURMUKHI LETTER CA
+0A1B GURMUKHI LETTER CHA
+0A1C GURMUKHI LETTER JA
+0A1D GURMUKHI LETTER JHA
+0A1E GURMUKHI LETTER NYA
+0A1F GURMUKHI LETTER TTA
+0A20 GURMUKHI LETTER TTHA
+0A21 GURMUKHI LETTER DDA
+0A22 GURMUKHI LETTER DDHA
+0A23 GURMUKHI LETTER NNA
+0A24 GURMUKHI LETTER TA
+0A25 GURMUKHI LETTER THA
+0A26 GURMUKHI LETTER DA
+0A27 GURMUKHI LETTER DHA
+0A28 GURMUKHI LETTER NA
+0A2A GURMUKHI LETTER PA
+0A2B GURMUKHI LETTER PHA
+0A2C GURMUKHI LETTER BA
+0A2D GURMUKHI LETTER BHA
+0A2E GURMUKHI LETTER MA
+0A2F GURMUKHI LETTER YA
+0A30 GURMUKHI LETTER RA
+0A32 GURMUKHI LETTER LA
+0A33 GURMUKHI LETTER LLA
+ : 0A32 0A3C
+0A35 GURMUKHI LETTER VA
+0A36 GURMUKHI LETTER SHA
+ : 0A38 0A3C
+0A38 GURMUKHI LETTER SA
+0A39 GURMUKHI LETTER HA
+@ Various signs
+0A3C GURMUKHI SIGN NUKTA
+ = pairin bindi
+ * for extending the alphabet to new letters
+@ Dependent vowel signs
+0A3E GURMUKHI VOWEL SIGN AA
+ = kanna
+0A3F GURMUKHI VOWEL SIGN I
+ = sihari
+ * stands to the left of the consonant
+0A40 GURMUKHI VOWEL SIGN II
+ = bihari
+0A41 GURMUKHI VOWEL SIGN U
+ = aunkar
+0A42 GURMUKHI VOWEL SIGN UU
+ = dulainkar
+0A47 GURMUKHI VOWEL SIGN EE
+ = lanvan
+0A48 GURMUKHI VOWEL SIGN AI
+ = dulanvan
+0A4B GURMUKHI VOWEL SIGN OO
+ = hora
+0A4C GURMUKHI VOWEL SIGN AU
+ = kanaura
+@ Various signs
+0A4D GURMUKHI SIGN VIRAMA
+0A51 GURMUKHI SIGN UDAAT
+@ Additional consonants
+0A59 GURMUKHI LETTER KHHA
+ : 0A16 0A3C
+0A5A GURMUKHI LETTER GHHA
+ : 0A17 0A3C
+0A5B GURMUKHI LETTER ZA
+ : 0A1C 0A3C
+0A5C GURMUKHI LETTER RRA
+0A5E GURMUKHI LETTER FA
+ : 0A2B 0A3C
+@ Reserved
+@+ For viram punctuation, use the generic Indic 0964 and 0965.
+0A64 <reserved>
+ x (devanagari danda - 0964)
+0A65 <reserved>
+ x (devanagari double danda - 0965)
+@ Digits
+0A66 GURMUKHI DIGIT ZERO
+0A67 GURMUKHI DIGIT ONE
+0A68 GURMUKHI DIGIT TWO
+0A69 GURMUKHI DIGIT THREE
+0A6A GURMUKHI DIGIT FOUR
+0A6B GURMUKHI DIGIT FIVE
+0A6C GURMUKHI DIGIT SIX
+0A6D GURMUKHI DIGIT SEVEN
+0A6E GURMUKHI DIGIT EIGHT
+0A6F GURMUKHI DIGIT NINE
+@ Gurmukhi-specific additions
+0A70 GURMUKHI TIPPI
+ * nasalization
+0A71 GURMUKHI ADDAK
+ * doubles following consonant
+0A72 GURMUKHI IRI
+ * base for vowels
+0A73 GURMUKHI URA
+ * base for vowels
+0A74 GURMUKHI EK ONKAR
+ * God is One
+0A75 GURMUKHI SIGN YAKASH
+@@ 0A80 Gujarati 0AFF
+@ Based on ISCII 1988
+@ Various signs
+0A81 GUJARATI SIGN CANDRABINDU
+0A82 GUJARATI SIGN ANUSVARA
+0A83 GUJARATI SIGN VISARGA
+@ Independent vowels
+0A85 GUJARATI LETTER A
+0A86 GUJARATI LETTER AA
+0A87 GUJARATI LETTER I
+0A88 GUJARATI LETTER II
+0A89 GUJARATI LETTER U
+0A8A GUJARATI LETTER UU
+0A8B GUJARATI LETTER VOCALIC R
+0A8C GUJARATI LETTER VOCALIC L
+ * used with Sanskrit text
+0A8D GUJARATI VOWEL CANDRA E
+0A8F GUJARATI LETTER E
+0A90 GUJARATI LETTER AI
+0A91 GUJARATI VOWEL CANDRA O
+0A93 GUJARATI LETTER O
+0A94 GUJARATI LETTER AU
+@ Consonants
+0A95 GUJARATI LETTER KA
+0A96 GUJARATI LETTER KHA
+0A97 GUJARATI LETTER GA
+0A98 GUJARATI LETTER GHA
+0A99 GUJARATI LETTER NGA
+0A9A GUJARATI LETTER CA
+0A9B GUJARATI LETTER CHA
+0A9C GUJARATI LETTER JA
+0A9D GUJARATI LETTER JHA
+0A9E GUJARATI LETTER NYA
+0A9F GUJARATI LETTER TTA
+0AA0 GUJARATI LETTER TTHA
+0AA1 GUJARATI LETTER DDA
+0AA2 GUJARATI LETTER DDHA
+0AA3 GUJARATI LETTER NNA
+0AA4 GUJARATI LETTER TA
+0AA5 GUJARATI LETTER THA
+0AA6 GUJARATI LETTER DA
+0AA7 GUJARATI LETTER DHA
+0AA8 GUJARATI LETTER NA
+0AAA GUJARATI LETTER PA
+0AAB GUJARATI LETTER PHA
+0AAC GUJARATI LETTER BA
+0AAD GUJARATI LETTER BHA
+0AAE GUJARATI LETTER MA
+0AAF GUJARATI LETTER YA
+0AB0 GUJARATI LETTER RA
+0AB2 GUJARATI LETTER LA
+0AB3 GUJARATI LETTER LLA
+0AB5 GUJARATI LETTER VA
+0AB6 GUJARATI LETTER SHA
+0AB7 GUJARATI LETTER SSA
+0AB8 GUJARATI LETTER SA
+0AB9 GUJARATI LETTER HA
+@ Various signs
+0ABC GUJARATI SIGN NUKTA
+ * for extending the alphabet to new letters
+0ABD GUJARATI SIGN AVAGRAHA
+@ Dependent vowel signs
+0ABE GUJARATI VOWEL SIGN AA
+0ABF GUJARATI VOWEL SIGN I
+ * stands to the left of the consonant
+0AC0 GUJARATI VOWEL SIGN II
+0AC1 GUJARATI VOWEL SIGN U
+0AC2 GUJARATI VOWEL SIGN UU
+0AC3 GUJARATI VOWEL SIGN VOCALIC R
+0AC4 GUJARATI VOWEL SIGN VOCALIC RR
+0AC5 GUJARATI VOWEL SIGN CANDRA E
+0AC7 GUJARATI VOWEL SIGN E
+0AC8 GUJARATI VOWEL SIGN AI
+0AC9 GUJARATI VOWEL SIGN CANDRA O
+0ACB GUJARATI VOWEL SIGN O
+0ACC GUJARATI VOWEL SIGN AU
+@ Various signs
+0ACD GUJARATI SIGN VIRAMA
+0AD0 GUJARATI OM
+@ Additional vowels for Sanskrit
+0AE0 GUJARATI LETTER VOCALIC RR
+0AE1 GUJARATI LETTER VOCALIC LL
+0AE2 GUJARATI VOWEL SIGN VOCALIC L
+0AE3 GUJARATI VOWEL SIGN VOCALIC LL
+@ Reserved
+@+ For viram punctuation, use the generic Indic 0964 and 0965.
+0AE4 <reserved>
+ x (devanagari danda - 0964)
+0AE5 <reserved>
+ x (devanagari double danda - 0965)
+@ Digits
+0AE6 GUJARATI DIGIT ZERO
+0AE7 GUJARATI DIGIT ONE
+0AE8 GUJARATI DIGIT TWO
+0AE9 GUJARATI DIGIT THREE
+0AEA GUJARATI DIGIT FOUR
+0AEB GUJARATI DIGIT FIVE
+0AEC GUJARATI DIGIT SIX
+0AED GUJARATI DIGIT SEVEN
+0AEE GUJARATI DIGIT EIGHT
+0AEF GUJARATI DIGIT NINE
+@ Currency sign
+0AF1 GUJARATI RUPEE SIGN
+@@ 0B00 Oriya 0B7F
+@ Based on ISCII 1988
+@ Various signs
+0B01 ORIYA SIGN CANDRABINDU
+0B02 ORIYA SIGN ANUSVARA
+0B03 ORIYA SIGN VISARGA
+@ Independent vowels
+0B05 ORIYA LETTER A
+0B06 ORIYA LETTER AA
+0B07 ORIYA LETTER I
+0B08 ORIYA LETTER II
+0B09 ORIYA LETTER U
+0B0A ORIYA LETTER UU
+0B0B ORIYA LETTER VOCALIC R
+0B0C ORIYA LETTER VOCALIC L
+0B0F ORIYA LETTER E
+0B10 ORIYA LETTER AI
+0B13 ORIYA LETTER O
+0B14 ORIYA LETTER AU
+@ Consonants
+0B15 ORIYA LETTER KA
+0B16 ORIYA LETTER KHA
+0B17 ORIYA LETTER GA
+0B18 ORIYA LETTER GHA
+0B19 ORIYA LETTER NGA
+0B1A ORIYA LETTER CA
+0B1B ORIYA LETTER CHA
+0B1C ORIYA LETTER JA
+0B1D ORIYA LETTER JHA
+0B1E ORIYA LETTER NYA
+0B1F ORIYA LETTER TTA
+0B20 ORIYA LETTER TTHA
+0B21 ORIYA LETTER DDA
+0B22 ORIYA LETTER DDHA
+0B23 ORIYA LETTER NNA
+0B24 ORIYA LETTER TA
+0B25 ORIYA LETTER THA
+0B26 ORIYA LETTER DA
+0B27 ORIYA LETTER DHA
+0B28 ORIYA LETTER NA
+0B2A ORIYA LETTER PA
+0B2B ORIYA LETTER PHA
+0B2C ORIYA LETTER BA
+ x (oriya letter va - 0B35)
+0B2D ORIYA LETTER BHA
+0B2E ORIYA LETTER MA
+0B2F ORIYA LETTER YA
+ = ja
+0B30 ORIYA LETTER RA
+0B32 ORIYA LETTER LA
+0B33 ORIYA LETTER LLA
+0B35 ORIYA LETTER VA
+ x (oriya letter ba - 0B2C)
+0B36 ORIYA LETTER SHA
+0B37 ORIYA LETTER SSA
+0B38 ORIYA LETTER SA
+0B39 ORIYA LETTER HA
+@ Various signs
+0B3C ORIYA SIGN NUKTA
+ * for extending the alphabet to new letters
+0B3D ORIYA SIGN AVAGRAHA
+@ Dependent vowel signs
+0B3E ORIYA VOWEL SIGN AA
+0B3F ORIYA VOWEL SIGN I
+0B40 ORIYA VOWEL SIGN II
+0B41 ORIYA VOWEL SIGN U
+0B42 ORIYA VOWEL SIGN UU
+0B43 ORIYA VOWEL SIGN VOCALIC R
+0B44 ORIYA VOWEL SIGN VOCALIC RR
+0B47 ORIYA VOWEL SIGN E
+ * stands to the left of the consonant
+0B48 ORIYA VOWEL SIGN AI
+ * pieces left of and above the consonant
+ : 0B47 0B56
+@ Two-part dependent vowel signs
+@+ These vowel signs have glyph pieces which stand on both sides of the consonant; they follow the consonant in logical order, and should be handled as a unit for most processing.
+0B4B ORIYA VOWEL SIGN O
+ : 0B47 0B3E
+0B4C ORIYA VOWEL SIGN AU
+ : 0B47 0B57
+@ Various signs
+0B4D ORIYA SIGN VIRAMA
+0B56 ORIYA AI LENGTH MARK
+0B57 ORIYA AU LENGTH MARK
+@ Additional consonants
+0B5C ORIYA LETTER RRA
+ = dda
+ : 0B21 0B3C
+0B5D ORIYA LETTER RHA
+ = ddha
+ : 0B22 0B3C
+0B5F ORIYA LETTER YYA
+ = ya
+@ Additional vowels for Sanskrit
+0B60 ORIYA LETTER VOCALIC RR
+0B61 ORIYA LETTER VOCALIC LL
+@ Dependent vowels
+0B62 ORIYA VOWEL SIGN VOCALIC L
+0B63 ORIYA VOWEL SIGN VOCALIC LL
+@ Reserved
+@+ For viram punctuation, use the generic Indic 0964 and 0965.
+0B64 <reserved>
+ x (devanagari danda - 0964)
+0B65 <reserved>
+ x (devanagari double danda - 0965)
+@ Digits
+0B66 ORIYA DIGIT ZERO
+0B67 ORIYA DIGIT ONE
+0B68 ORIYA DIGIT TWO
+0B69 ORIYA DIGIT THREE
+0B6A ORIYA DIGIT FOUR
+0B6B ORIYA DIGIT FIVE
+0B6C ORIYA DIGIT SIX
+0B6D ORIYA DIGIT SEVEN
+0B6E ORIYA DIGIT EIGHT
+0B6F ORIYA DIGIT NINE
+@ Oriya-specific additions
+0B70 ORIYA ISSHAR
+0B71 ORIYA LETTER WA
+ x (oriya letter o - 0B13)
+ x (oriya letter va - 0B35)
+@@ 0B80 Tamil 0BFF
+@ Based on ISCII 1988
+@ Various signs
+0B82 TAMIL SIGN ANUSVARA
+ * not used in Tamil
+0B83 TAMIL SIGN VISARGA
+ = aytham
+@ Independent vowels
+0B85 TAMIL LETTER A
+0B86 TAMIL LETTER AA
+0B87 TAMIL LETTER I
+0B88 TAMIL LETTER II
+0B89 TAMIL LETTER U
+0B8A TAMIL LETTER UU
+0B8E TAMIL LETTER E
+0B8F TAMIL LETTER EE
+0B90 TAMIL LETTER AI
+0B92 TAMIL LETTER O
+0B93 TAMIL LETTER OO
+0B94 TAMIL LETTER AU
+ : 0B92 0BD7
+@ Consonants
+0B95 TAMIL LETTER KA
+0B99 TAMIL LETTER NGA
+0B9A TAMIL LETTER CA
+0B9C TAMIL LETTER JA
+0B9E TAMIL LETTER NYA
+0B9F TAMIL LETTER TTA
+0BA3 TAMIL LETTER NNA
+0BA4 TAMIL LETTER TA
+0BA8 TAMIL LETTER NA
+0BA9 TAMIL LETTER NNNA
+0BAA TAMIL LETTER PA
+0BAE TAMIL LETTER MA
+0BAF TAMIL LETTER YA
+0BB0 TAMIL LETTER RA
+0BB1 TAMIL LETTER RRA
+0BB2 TAMIL LETTER LA
+0BB3 TAMIL LETTER LLA
+0BB4 TAMIL LETTER LLLA
+0BB5 TAMIL LETTER VA
+0BB6 TAMIL LETTER SHA
+0BB7 TAMIL LETTER SSA
+0BB8 TAMIL LETTER SA
+0BB9 TAMIL LETTER HA
+@ Dependent vowel signs
+0BBE TAMIL VOWEL SIGN AA
+0BBF TAMIL VOWEL SIGN I
+0BC0 TAMIL VOWEL SIGN II
+0BC1 TAMIL VOWEL SIGN U
+0BC2 TAMIL VOWEL SIGN UU
+0BC6 TAMIL VOWEL SIGN E
+ * stands to the left of the consonant
+0BC7 TAMIL VOWEL SIGN EE
+ * stands to the left of the consonant
+0BC8 TAMIL VOWEL SIGN AI
+ * stands to the left of the consonant
+@ Two-part dependent vowel signs
+@+ These vowel signs have glyph pieces which stand on both sides of the consonant; they follow the consonant in logical order, and should be handled as a unit for most processing.
+0BCA TAMIL VOWEL SIGN O
+ : 0BC6 0BBE
+0BCB TAMIL VOWEL SIGN OO
+ : 0BC7 0BBE
+0BCC TAMIL VOWEL SIGN AU
+ : 0BC6 0BD7
+@ Various signs
+0BCD TAMIL SIGN VIRAMA
+0BD0 TAMIL OM
+0BD7 TAMIL AU LENGTH MARK
+@ Reserved
+@+ For viram punctuation, use the generic Indic 0964 and 0965.
+0BE4 <reserved>
+ x (devanagari danda - 0964)
+0BE5 <reserved>
+ x (devanagari double danda - 0965)
+@ Digits
+0BE6 TAMIL DIGIT ZERO
+0BE7 TAMIL DIGIT ONE
+0BE8 TAMIL DIGIT TWO
+0BE9 TAMIL DIGIT THREE
+0BEA TAMIL DIGIT FOUR
+0BEB TAMIL DIGIT FIVE
+0BEC TAMIL DIGIT SIX
+0BED TAMIL DIGIT SEVEN
+0BEE TAMIL DIGIT EIGHT
+0BEF TAMIL DIGIT NINE
+@ Tamil numerics
+0BF0 TAMIL NUMBER TEN
+0BF1 TAMIL NUMBER ONE HUNDRED
+0BF2 TAMIL NUMBER ONE THOUSAND
+@ Tamil symbols
+0BF3 TAMIL DAY SIGN (Naal)
+0BF4 TAMIL MONTH SIGN (Maatham)
+0BF5 TAMIL YEAR SIGN (Varudam)
+0BF6 TAMIL DEBIT SIGN (Patru)
+0BF7 TAMIL CREDIT SIGN (Varavu)
+0BF8 TAMIL AS ABOVE SIGN (Merpadi)
+@ Currency symbol
+0BF9 TAMIL RUPEE SIGN (Rupai)
+@ Tamil symbol
+0BFA TAMIL NUMBER SIGN (Enn)
+@@ 0C00 Telugu 0C7F
+@ Based on ISCII 1988
+@ Various signs
+0C01 TELUGU SIGN CANDRABINDU
+ = arasunna
+0C02 TELUGU SIGN ANUSVARA
+ = sunna
+0C03 TELUGU SIGN VISARGA
+@ Independent vowels
+0C05 TELUGU LETTER A
+0C06 TELUGU LETTER AA
+0C07 TELUGU LETTER I
+0C08 TELUGU LETTER II
+0C09 TELUGU LETTER U
+0C0A TELUGU LETTER UU
+0C0B TELUGU LETTER VOCALIC R
+0C0C TELUGU LETTER VOCALIC L
+0C0E TELUGU LETTER E
+0C0F TELUGU LETTER EE
+0C10 TELUGU LETTER AI
+0C12 TELUGU LETTER O
+0C13 TELUGU LETTER OO
+0C14 TELUGU LETTER AU
+@ Consonants
+0C15 TELUGU LETTER KA
+0C16 TELUGU LETTER KHA
+0C17 TELUGU LETTER GA
+0C18 TELUGU LETTER GHA
+0C19 TELUGU LETTER NGA
+0C1A TELUGU LETTER CA
+0C1B TELUGU LETTER CHA
+0C1C TELUGU LETTER JA
+0C1D TELUGU LETTER JHA
+0C1E TELUGU LETTER NYA
+0C1F TELUGU LETTER TTA
+0C20 TELUGU LETTER TTHA
+0C21 TELUGU LETTER DDA
+0C22 TELUGU LETTER DDHA
+0C23 TELUGU LETTER NNA
+0C24 TELUGU LETTER TA
+0C25 TELUGU LETTER THA
+0C26 TELUGU LETTER DA
+0C27 TELUGU LETTER DHA
+0C28 TELUGU LETTER NA
+0C2A TELUGU LETTER PA
+0C2B TELUGU LETTER PHA
+0C2C TELUGU LETTER BA
+0C2D TELUGU LETTER BHA
+0C2E TELUGU LETTER MA
+0C2F TELUGU LETTER YA
+0C30 TELUGU LETTER RA
+0C31 TELUGU LETTER RRA
+0C32 TELUGU LETTER LA
+0C33 TELUGU LETTER LLA
+0C35 TELUGU LETTER VA
+0C36 TELUGU LETTER SHA
+0C37 TELUGU LETTER SSA
+0C38 TELUGU LETTER SA
+0C39 TELUGU LETTER HA
+@ Addition for Sanskrit
+0C3D TELUGU SIGN AVAGRAHA
+@ Dependent vowel signs
+0C3E TELUGU VOWEL SIGN AA
+0C3F TELUGU VOWEL SIGN I
+0C40 TELUGU VOWEL SIGN II
+0C41 TELUGU VOWEL SIGN U
+0C42 TELUGU VOWEL SIGN UU
+0C43 TELUGU VOWEL SIGN VOCALIC R
+0C44 TELUGU VOWEL SIGN VOCALIC RR
+0C46 TELUGU VOWEL SIGN E
+0C47 TELUGU VOWEL SIGN EE
+0C48 TELUGU VOWEL SIGN AI
+ : 0C46 0C56
+0C4A TELUGU VOWEL SIGN O
+0C4B TELUGU VOWEL SIGN OO
+0C4C TELUGU VOWEL SIGN AU
+@ Various signs
+0C4D TELUGU SIGN VIRAMA
+ = halant (the preferred name)
+0C55 TELUGU LENGTH MARK
+0C56 TELUGU AI LENGTH MARK
+@ Historic phonetic variants
+0C58 TELUGU LETTER TSA
+0C59 TELUGU LETTER DZA
+@ Additional vowels for Sanskrit
+0C60 TELUGU LETTER VOCALIC RR
+0C61 TELUGU LETTER VOCALIC LL
+@ Dependent vowels
+0C62 TELUGU VOWEL SIGN VOCALIC L
+0C63 TELUGU VOWEL SIGN VOCALIC LL
+@ Reserved
+@+ For viram punctuation, use the generic Indic 0964 and 0965.
+0C64 <reserved>
+ x (devanagari danda - 0964)
+0C65 <reserved>
+ x (devanagari double danda - 0965)
+@ Digits
+0C66 TELUGU DIGIT ZERO
+0C67 TELUGU DIGIT ONE
+0C68 TELUGU DIGIT TWO
+0C69 TELUGU DIGIT THREE
+0C6A TELUGU DIGIT FOUR
+0C6B TELUGU DIGIT FIVE
+0C6C TELUGU DIGIT SIX
+0C6D TELUGU DIGIT SEVEN
+0C6E TELUGU DIGIT EIGHT
+0C6F TELUGU DIGIT NINE
+@ Telugu fractions and weights
+0C78 TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR
+0C79 TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR
+0C7A TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR
+0C7B TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR
+0C7C TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR
+0C7D TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR
+0C7E TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
+0C7F TELUGU SIGN TUUMU
+@@ 0C80 Kannada 0CFF
+@ Based on ISCII 1988
+@ Various signs
+0C82 KANNADA SIGN ANUSVARA
+0C83 KANNADA SIGN VISARGA
+@ Independent vowels
+0C85 KANNADA LETTER A
+0C86 KANNADA LETTER AA
+0C87 KANNADA LETTER I
+0C88 KANNADA LETTER II
+0C89 KANNADA LETTER U
+0C8A KANNADA LETTER UU
+0C8B KANNADA LETTER VOCALIC R
+0C8C KANNADA LETTER VOCALIC L
+0C8E KANNADA LETTER E
+0C8F KANNADA LETTER EE
+0C90 KANNADA LETTER AI
+0C92 KANNADA LETTER O
+0C93 KANNADA LETTER OO
+0C94 KANNADA LETTER AU
+@ Consonants
+0C95 KANNADA LETTER KA
+0C96 KANNADA LETTER KHA
+0C97 KANNADA LETTER GA
+0C98 KANNADA LETTER GHA
+0C99 KANNADA LETTER NGA
+0C9A KANNADA LETTER CA
+0C9B KANNADA LETTER CHA
+0C9C KANNADA LETTER JA
+0C9D KANNADA LETTER JHA
+0C9E KANNADA LETTER NYA
+0C9F KANNADA LETTER TTA
+0CA0 KANNADA LETTER TTHA
+0CA1 KANNADA LETTER DDA
+0CA2 KANNADA LETTER DDHA
+0CA3 KANNADA LETTER NNA
+0CA4 KANNADA LETTER TA
+0CA5 KANNADA LETTER THA
+0CA6 KANNADA LETTER DA
+0CA7 KANNADA LETTER DHA
+0CA8 KANNADA LETTER NA
+0CAA KANNADA LETTER PA
+0CAB KANNADA LETTER PHA
+0CAC KANNADA LETTER BA
+0CAD KANNADA LETTER BHA
+0CAE KANNADA LETTER MA
+0CAF KANNADA LETTER YA
+0CB0 KANNADA LETTER RA
+0CB1 KANNADA LETTER RRA
+0CB2 KANNADA LETTER LA
+0CB3 KANNADA LETTER LLA
+0CB5 KANNADA LETTER VA
+0CB6 KANNADA LETTER SHA
+0CB7 KANNADA LETTER SSA
+0CB8 KANNADA LETTER SA
+0CB9 KANNADA LETTER HA
+@ Various signs
+0CBC KANNADA SIGN NUKTA
+0CBD KANNADA SIGN AVAGRAHA
+@ Dependent vowel signs
+0CBE KANNADA VOWEL SIGN AA
+0CBF KANNADA VOWEL SIGN I
+0CC0 KANNADA VOWEL SIGN II
+ : 0CBF 0CD5
+0CC1 KANNADA VOWEL SIGN U
+0CC2 KANNADA VOWEL SIGN UU
+0CC3 KANNADA VOWEL SIGN VOCALIC R
+0CC4 KANNADA VOWEL SIGN VOCALIC RR
+0CC6 KANNADA VOWEL SIGN E
+0CC7 KANNADA VOWEL SIGN EE
+ : 0CC6 0CD5
+0CC8 KANNADA VOWEL SIGN AI
+ : 0CC6 0CD6
+0CCA KANNADA VOWEL SIGN O
+ : 0CC6 0CC2
+0CCB KANNADA VOWEL SIGN OO
+ : 0CCA 0CD5
+0CCC KANNADA VOWEL SIGN AU
+@ Sign
+0CCD KANNADA SIGN VIRAMA
+ * preferred name is halant
+@ Various signs
+0CD5 KANNADA LENGTH MARK
+0CD6 KANNADA AI LENGTH MARK
+@ Additional consonants
+0CDE KANNADA LETTER FA
+ % KANNADA LETTER LLLA
+ * obsolete historic letter
+ * name is a mistake for LLLA
+@ Additional vowels for Sanskrit
+0CE0 KANNADA LETTER VOCALIC RR
+0CE1 KANNADA LETTER VOCALIC LL
+@ Dependent vowels
+0CE2 KANNADA VOWEL SIGN VOCALIC L
+0CE3 KANNADA VOWEL SIGN VOCALIC LL
+@ Reserved
+@+ For viram punctuation, use the generic Indic 0964 and 0965.
+0CE4 <reserved>
+ x (devanagari danda - 0964)
+0CE5 <reserved>
+ x (devanagari double danda - 0965)
+@ Digits
+0CE6 KANNADA DIGIT ZERO
+0CE7 KANNADA DIGIT ONE
+0CE8 KANNADA DIGIT TWO
+0CE9 KANNADA DIGIT THREE
+0CEA KANNADA DIGIT FOUR
+0CEB KANNADA DIGIT FIVE
+0CEC KANNADA DIGIT SIX
+0CED KANNADA DIGIT SEVEN
+0CEE KANNADA DIGIT EIGHT
+0CEF KANNADA DIGIT NINE
+@ Vedic signs
+@+ The Vedic signs for jihvamuliya and upadhmaniya were encoded in the Kannada block, but are intended for general Vedic use with all scripts.
+0CF1 KANNADA SIGN JIHVAMULIYA
+ * marks a velar fricative occurring only before unvoiced velar stops
+0CF2 KANNADA SIGN UPADHMANIYA
+ * marks a bilabial fricative occurring only before unvoiced labial stops
+@@ 0D00 Malayalam 0D7F
+@ Based on ISCII 1988
+@ Various signs
+0D02 MALAYALAM SIGN ANUSVARA
+0D03 MALAYALAM SIGN VISARGA
+@ Independent vowels
+0D05 MALAYALAM LETTER A
+0D06 MALAYALAM LETTER AA
+0D07 MALAYALAM LETTER I
+0D08 MALAYALAM LETTER II
+0D09 MALAYALAM LETTER U
+0D0A MALAYALAM LETTER UU
+0D0B MALAYALAM LETTER VOCALIC R
+0D0C MALAYALAM LETTER VOCALIC L
+0D0E MALAYALAM LETTER E
+0D0F MALAYALAM LETTER EE
+0D10 MALAYALAM LETTER AI
+0D12 MALAYALAM LETTER O
+0D13 MALAYALAM LETTER OO
+0D14 MALAYALAM LETTER AU
+@ Consonants
+@+ Alternate romanizations are shown as aliases for some letters to clarify their identity.
+0D15 MALAYALAM LETTER KA
+0D16 MALAYALAM LETTER KHA
+0D17 MALAYALAM LETTER GA
+0D18 MALAYALAM LETTER GHA
+0D19 MALAYALAM LETTER NGA
+0D1A MALAYALAM LETTER CA
+ = cha
+0D1B MALAYALAM LETTER CHA
+ = chha
+0D1C MALAYALAM LETTER JA
+0D1D MALAYALAM LETTER JHA
+0D1E MALAYALAM LETTER NYA
+ = nha
+0D1F MALAYALAM LETTER TTA
+ = ta
+0D20 MALAYALAM LETTER TTHA
+ = tta
+0D21 MALAYALAM LETTER DDA
+ = hard da
+0D22 MALAYALAM LETTER DDHA
+ = hard dda
+0D23 MALAYALAM LETTER NNA
+ = hard na
+0D24 MALAYALAM LETTER TA
+ = tha
+0D25 MALAYALAM LETTER THA
+ = ttha
+0D26 MALAYALAM LETTER DA
+ = soft da
+0D27 MALAYALAM LETTER DHA
+ = soft dda
+0D28 MALAYALAM LETTER NA
+0D2A MALAYALAM LETTER PA
+0D2B MALAYALAM LETTER PHA
+0D2C MALAYALAM LETTER BA
+0D2D MALAYALAM LETTER BHA
+0D2E MALAYALAM LETTER MA
+0D2F MALAYALAM LETTER YA
+0D30 MALAYALAM LETTER RA
+0D31 MALAYALAM LETTER RRA
+0D32 MALAYALAM LETTER LA
+0D33 MALAYALAM LETTER LLA
+0D34 MALAYALAM LETTER LLLA
+ = zha
+0D35 MALAYALAM LETTER VA
+0D36 MALAYALAM LETTER SHA
+ = soft sha
+0D37 MALAYALAM LETTER SSA
+ = sha
+0D38 MALAYALAM LETTER SA
+0D39 MALAYALAM LETTER HA
+@ Addition for Sanskrit
+0D3D MALAYALAM SIGN AVAGRAHA
+ = praslesham
+@ Dependent vowel signs
+0D3E MALAYALAM VOWEL SIGN AA
+0D3F MALAYALAM VOWEL SIGN I
+0D40 MALAYALAM VOWEL SIGN II
+0D41 MALAYALAM VOWEL SIGN U
+0D42 MALAYALAM VOWEL SIGN UU
+0D43 MALAYALAM VOWEL SIGN VOCALIC R
+0D44 MALAYALAM VOWEL SIGN VOCALIC RR
+0D46 MALAYALAM VOWEL SIGN E
+ * stands to the left of the consonant
+0D47 MALAYALAM VOWEL SIGN EE
+ * stands to the left of the consonant
+0D48 MALAYALAM VOWEL SIGN AI
+ * stands to the left of the consonant
+@ Two-part dependent vowel signs
+@+ These vowel signs have glyph pieces which stand on both sides of the consonant; they follow the consonant in logical order, and should be handled as a unit for most processing.
+0D4A MALAYALAM VOWEL SIGN O
+ : 0D46 0D3E
+0D4B MALAYALAM VOWEL SIGN OO
+ : 0D47 0D3E
+0D4C MALAYALAM VOWEL SIGN AU
+ * archaic form of the /au/ dependent vowel
+ x (malayalam au length mark - 0D57)
+ : 0D46 0D57
+@ Various signs
+0D4D MALAYALAM SIGN VIRAMA
+ = chandrakkala (the preferred name)
+ = vowel half-u
+0D57 MALAYALAM AU LENGTH MARK
+ * used alone to write the /au/ dependent vowel in modern texts
+ x (malayalam vowel sign au - 0D4C)
+@ Additional vowels for Sanskrit
+0D60 MALAYALAM LETTER VOCALIC RR
+0D61 MALAYALAM LETTER VOCALIC LL
+@ Dependent vowels
+0D62 MALAYALAM VOWEL SIGN VOCALIC L
+0D63 MALAYALAM VOWEL SIGN VOCALIC LL
+@ Reserved
+@+ For viram punctuation, use the generic Indic 0964 and 0965.
+0D64 <reserved>
+ x (devanagari danda - 0964)
+0D65 <reserved>
+ x (devanagari double danda - 0965)
+@ Digits
+0D66 MALAYALAM DIGIT ZERO
+0D67 MALAYALAM DIGIT ONE
+0D68 MALAYALAM DIGIT TWO
+0D69 MALAYALAM DIGIT THREE
+0D6A MALAYALAM DIGIT FOUR
+0D6B MALAYALAM DIGIT FIVE
+0D6C MALAYALAM DIGIT SIX
+0D6D MALAYALAM DIGIT SEVEN
+0D6E MALAYALAM DIGIT EIGHT
+0D6F MALAYALAM DIGIT NINE
+@ Malayalam numerics
+0D70 MALAYALAM NUMBER TEN
+0D71 MALAYALAM NUMBER ONE HUNDRED
+0D72 MALAYALAM NUMBER ONE THOUSAND
+@ Fractions
+0D73 MALAYALAM FRACTION ONE QUARTER
+0D74 MALAYALAM FRACTION ONE HALF
+0D75 MALAYALAM FRACTION THREE QUARTERS
+@ Date mark
+0D79 MALAYALAM DATE MARK
+@ Chillu letters
+0D7A MALAYALAM LETTER CHILLU NN
+0D7B MALAYALAM LETTER CHILLU N
+0D7C MALAYALAM LETTER CHILLU RR
+ * historically derived from the full letter ra
+ * also used for chillu r
+0D7D MALAYALAM LETTER CHILLU L
+ * historically derived from the full letter ta
+ * used for chillu t and chillu d
+0D7E MALAYALAM LETTER CHILLU LL
+0D7F MALAYALAM LETTER CHILLU K
+@@ 0D80 Sinhala 0DFF
+@ Various signs
+0D82 SINHALA SIGN ANUSVARAYA
+ = anusvara
+0D83 SINHALA SIGN VISARGAYA
+ = visarga
+@ Independent vowels
+0D85 SINHALA LETTER AYANNA
+ = sinhala letter a
+0D86 SINHALA LETTER AAYANNA
+ = sinhala letter aa
+0D87 SINHALA LETTER AEYANNA
+ = sinhala letter ae
+0D88 SINHALA LETTER AEEYANNA
+ = sinhala letter aae
+0D89 SINHALA LETTER IYANNA
+ = sinhala letter i
+0D8A SINHALA LETTER IIYANNA
+ = sinhala letter ii
+0D8B SINHALA LETTER UYANNA
+ = sinhala letter u
+0D8C SINHALA LETTER UUYANNA
+ = sinhala letter uu
+0D8D SINHALA LETTER IRUYANNA
+ = sinhala letter vocalic r
+0D8E SINHALA LETTER IRUUYANNA
+ = sinhala letter vocalic rr
+0D8F SINHALA LETTER ILUYANNA
+ = sinhala letter vocalic l
+0D90 SINHALA LETTER ILUUYANNA
+ = sinhala letter vocalic ll
+0D91 SINHALA LETTER EYANNA
+ = sinhala letter e
+0D92 SINHALA LETTER EEYANNA
+ = sinhala letter ee
+0D93 SINHALA LETTER AIYANNA
+ = sinhala letter ai
+0D94 SINHALA LETTER OYANNA
+ = sinhala letter o
+0D95 SINHALA LETTER OOYANNA
+ = sinhala letter oo
+0D96 SINHALA LETTER AUYANNA
+ = sinhala letter au
+@ Consonants
+0D9A SINHALA LETTER ALPAPRAANA KAYANNA
+ = sinhala letter ka
+0D9B SINHALA LETTER MAHAAPRAANA KAYANNA
+ = sinhala letter kha
+0D9C SINHALA LETTER ALPAPRAANA GAYANNA
+ = sinhala letter ga
+0D9D SINHALA LETTER MAHAAPRAANA GAYANNA
+ = sinhala letter gha
+0D9E SINHALA LETTER KANTAJA NAASIKYAYA
+ = sinhala letter nga
+0D9F SINHALA LETTER SANYAKA GAYANNA
+ = sinhala letter nnga
+0DA0 SINHALA LETTER ALPAPRAANA CAYANNA
+ = sinhala letter ca
+0DA1 SINHALA LETTER MAHAAPRAANA CAYANNA
+ = sinhala letter cha
+0DA2 SINHALA LETTER ALPAPRAANA JAYANNA
+ = sinhala letter ja
+0DA3 SINHALA LETTER MAHAAPRAANA JAYANNA
+ = sinhala letter jha
+0DA4 SINHALA LETTER TAALUJA NAASIKYAYA
+ = sinhala letter nya
+0DA5 SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+ = sinhala letter jnya
+0DA6 SINHALA LETTER SANYAKA JAYANNA
+ = sinhala letter nyja
+0DA7 SINHALA LETTER ALPAPRAANA TTAYANNA
+ = sinhala letter tta
+0DA8 SINHALA LETTER MAHAAPRAANA TTAYANNA
+ = sinhala letter ttha
+0DA9 SINHALA LETTER ALPAPRAANA DDAYANNA
+ = sinhala letter dda
+0DAA SINHALA LETTER MAHAAPRAANA DDAYANNA
+ = sinhala letter ddha
+0DAB SINHALA LETTER MUURDHAJA NAYANNA
+ = sinhala letter nna
+0DAC SINHALA LETTER SANYAKA DDAYANNA
+ = sinhala letter nndda
+0DAD SINHALA LETTER ALPAPRAANA TAYANNA
+ = sinhala letter ta
+0DAE SINHALA LETTER MAHAAPRAANA TAYANNA
+ = sinhala letter tha
+0DAF SINHALA LETTER ALPAPRAANA DAYANNA
+ = sinhala letter da
+0DB0 SINHALA LETTER MAHAAPRAANA DAYANNA
+ = sinhala letter dha
+0DB1 SINHALA LETTER DANTAJA NAYANNA
+ = sinhala letter na
+0DB3 SINHALA LETTER SANYAKA DAYANNA
+ = sinhala letter nda
+0DB4 SINHALA LETTER ALPAPRAANA PAYANNA
+ = sinhala letter pa
+0DB5 SINHALA LETTER MAHAAPRAANA PAYANNA
+ = sinhala letter pha
+0DB6 SINHALA LETTER ALPAPRAANA BAYANNA
+ = sinhala letter ba
+0DB7 SINHALA LETTER MAHAAPRAANA BAYANNA
+ = sinhala letter bha
+0DB8 SINHALA LETTER MAYANNA
+ = sinhala letter ma
+0DB9 SINHALA LETTER AMBA BAYANNA
+ = sinhala letter mba
+0DBA SINHALA LETTER YAYANNA
+ = sinhala letter ya
+0DBB SINHALA LETTER RAYANNA
+ = sinhala letter ra
+0DBD SINHALA LETTER DANTAJA LAYANNA
+ = sinhala letter la
+ * dental
+0DC0 SINHALA LETTER VAYANNA
+ = sinhala letter va
+0DC1 SINHALA LETTER TAALUJA SAYANNA
+ = sinhala letter sha
+0DC2 SINHALA LETTER MUURDHAJA SAYANNA
+ = sinhala letter ssa
+ * retroflex
+0DC3 SINHALA LETTER DANTAJA SAYANNA
+ = sinhala letter sa
+ * dental
+0DC4 SINHALA LETTER HAYANNA
+ = sinhala letter ha
+0DC5 SINHALA LETTER MUURDHAJA LAYANNA
+ = sinhala letter lla
+ * retroflex
+0DC6 SINHALA LETTER FAYANNA
+ = sinhala letter fa
+@ Sign
+0DCA SINHALA SIGN AL-LAKUNA
+ = virama
+@ Dependent vowel signs
+0DCF SINHALA VOWEL SIGN AELA-PILLA
+ = sinhala vowel sign aa
+0DD0 SINHALA VOWEL SIGN KETTI AEDA-PILLA
+ = sinhala vowel sign ae
+0DD1 SINHALA VOWEL SIGN DIGA AEDA-PILLA
+ = sinhala vowel sign aae
+0DD2 SINHALA VOWEL SIGN KETTI IS-PILLA
+ = sinhala vowel sign i
+0DD3 SINHALA VOWEL SIGN DIGA IS-PILLA
+ = sinhala vowel sign ii
+0DD4 SINHALA VOWEL SIGN KETTI PAA-PILLA
+ = sinhala vowel sign u
+0DD6 SINHALA VOWEL SIGN DIGA PAA-PILLA
+ = sinhala vowel sign uu
+0DD8 SINHALA VOWEL SIGN GAETTA-PILLA
+ = sinhala vowel sign vocalic r
+0DD9 SINHALA VOWEL SIGN KOMBUVA
+ = sinhala vowel sign e
+0DDA SINHALA VOWEL SIGN DIGA KOMBUVA
+ = sinhala vowel sign ee
+ : 0DD9 0DCA
+0DDB SINHALA VOWEL SIGN KOMBU DEKA
+ = sinhala vowel sign ai
+@ Two-part dependent vowel signs
+@+ These vowel signs have glyph pieces which stand on both sides of the consonant; they follow the consonant in logical order, and should be handled as a unit for most processing.
+0DDC SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+ = sinhala vowel sign o
+ : 0DD9 0DCF
+0DDD SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+ = sinhala vowel sign oo
+ : 0DDC 0DCA
+0DDE SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+ = sinhala vowel sign au
+ : 0DD9 0DDF
+@ Dependent vowel sign
+0DDF SINHALA VOWEL SIGN GAYANUKITTA
+ = sinhala vowel sign vocalic l
+@ Additional dependent vowel signs
+0DF2 SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+ = sinhala vowel sign vocalic rr
+0DF3 SINHALA VOWEL SIGN DIGA GAYANUKITTA
+ = sinhala vowel sign vocalic ll
+@ Punctuation
+0DF4 SINHALA PUNCTUATION KUNDDALIYA
+@@ 0E00 Thai 0E7F
+@@+
+@ Based on TIS 620-2533
+@ Consonants
+0E01 THAI CHARACTER KO KAI
+0E02 THAI CHARACTER KHO KHAI
+0E03 THAI CHARACTER KHO KHUAT
+0E04 THAI CHARACTER KHO KHWAI
+0E05 THAI CHARACTER KHO KHON
+0E06 THAI CHARACTER KHO RAKHANG
+0E07 THAI CHARACTER NGO NGU
+0E08 THAI CHARACTER CHO CHAN
+0E09 THAI CHARACTER CHO CHING
+0E0A THAI CHARACTER CHO CHANG
+0E0B THAI CHARACTER SO SO
+0E0C THAI CHARACTER CHO CHOE
+0E0D THAI CHARACTER YO YING
+0E0E THAI CHARACTER DO CHADA
+0E0F THAI CHARACTER TO PATAK
+0E10 THAI CHARACTER THO THAN
+0E11 THAI CHARACTER THO NANGMONTHO
+0E12 THAI CHARACTER THO PHUTHAO
+0E13 THAI CHARACTER NO NEN
+0E14 THAI CHARACTER DO DEK
+0E15 THAI CHARACTER TO TAO
+0E16 THAI CHARACTER THO THUNG
+0E17 THAI CHARACTER THO THAHAN
+0E18 THAI CHARACTER THO THONG
+0E19 THAI CHARACTER NO NU
+0E1A THAI CHARACTER BO BAIMAI
+0E1B THAI CHARACTER PO PLA
+0E1C THAI CHARACTER PHO PHUNG
+0E1D THAI CHARACTER FO FA
+0E1E THAI CHARACTER PHO PHAN
+0E1F THAI CHARACTER FO FAN
+0E20 THAI CHARACTER PHO SAMPHAO
+0E21 THAI CHARACTER MO MA
+0E22 THAI CHARACTER YO YAK
+0E23 THAI CHARACTER RO RUA
+0E24 THAI CHARACTER RU
+ * independent vowel letter used to write Sanskrit
+0E25 THAI CHARACTER LO LING
+0E26 THAI CHARACTER LU
+ * independent vowel letter used to write Sanskrit
+0E27 THAI CHARACTER WO WAEN
+0E28 THAI CHARACTER SO SALA
+0E29 THAI CHARACTER SO RUSI
+0E2A THAI CHARACTER SO SUA
+0E2B THAI CHARACTER HO HIP
+0E2C THAI CHARACTER LO CHULA
+0E2D THAI CHARACTER O ANG
+0E2E THAI CHARACTER HO NOKHUK
+ = ho nok huk
+@ Sign
+0E2F THAI CHARACTER PAIYANNOI (paiyan noi)
+ = paiyan noi
+ * ellipsis, abbreviation
+@ Vowels
+0E30 THAI CHARACTER SARA A
+0E31 THAI CHARACTER MAI HAN-AKAT
+0E32 THAI CHARACTER SARA AA
+ x (thai character lakkhangyao - 0E45)
+0E33 THAI CHARACTER SARA AM
+ # 0E4D 0E32
+0E34 THAI CHARACTER SARA I
+0E35 THAI CHARACTER SARA II
+0E36 THAI CHARACTER SARA UE
+0E37 THAI CHARACTER SARA UEE (sara uue)
+ = sara uue
+0E38 THAI CHARACTER SARA U
+0E39 THAI CHARACTER SARA UU
+0E3A THAI CHARACTER PHINTHU
+ * Pali virama
+@ Currency symbol
+0E3F THAI CURRENCY SYMBOL BAHT
+@ Vowels
+0E40 THAI CHARACTER SARA E
+0E41 THAI CHARACTER SARA AE
+0E42 THAI CHARACTER SARA O
+0E43 THAI CHARACTER SARA AI MAIMUAN (sara ai mai muan)
+ = sara ai mai muan
+0E44 THAI CHARACTER SARA AI MAIMALAI (sara ai mai malai)
+ = sara ai mai malai
+0E45 THAI CHARACTER LAKKHANGYAO (lakkhang yao)
+ = lakkhang yao
+ * special vowel length indication used with 0E24 or 0E26
+ x (thai character sara aa - 0E32)
+@ Sign
+0E46 THAI CHARACTER MAIYAMOK (mai yamok)
+ = mai yamok
+ * repetition
+@ Vowel
+0E47 THAI CHARACTER MAITAIKHU (mai taikhu)
+ = mai taikhu
+@ Tone marks
+0E48 THAI CHARACTER MAI EK
+0E49 THAI CHARACTER MAI THO
+0E4A THAI CHARACTER MAI TRI
+0E4B THAI CHARACTER MAI CHATTAWA
+@ Signs
+0E4C THAI CHARACTER THANTHAKHAT
+ * cancellation mark
+0E4D THAI CHARACTER NIKHAHIT (nikkhahit)
+ = nikkhahit
+ * final nasal
+0E4E THAI CHARACTER YAMAKKAN
+0E4F THAI CHARACTER FONGMAN
+ * used as a bullet
+ x (khmer sign phnaek muan - 17D9)
+@ Digits
+0E50 THAI DIGIT ZERO
+0E51 THAI DIGIT ONE
+0E52 THAI DIGIT TWO
+0E53 THAI DIGIT THREE
+0E54 THAI DIGIT FOUR
+0E55 THAI DIGIT FIVE
+0E56 THAI DIGIT SIX
+0E57 THAI DIGIT SEVEN
+0E58 THAI DIGIT EIGHT
+0E59 THAI DIGIT NINE
+@ Signs
+0E5A THAI CHARACTER ANGKHANKHU
+ * used to mark end of long sections
+ * used in combination with 0E30 to mark end of a verse
+0E5B THAI CHARACTER KHOMUT
+ * used to mark end of chapter or document
+ x (khmer sign koomuut - 17DA)
+@@ 0E80 Lao 0EFF
+@ Consonants
+0E81 LAO LETTER KO
+ = ko kay
+0E82 LAO LETTER KHO SUNG
+ = kho khay
+0E84 LAO LETTER KHO TAM
+ = kho khuay
+0E87 LAO LETTER NGO
+ = ngo ngu, ngo ngua
+0E88 LAO LETTER CO
+ = co cok, co cua
+0E8A LAO LETTER SO TAM
+ = so sang
+0E8D LAO LETTER NYO
+ = nyo nyung
+0E94 LAO LETTER DO
+ = do dek
+0E95 LAO LETTER TO
+ = to ta
+0E96 LAO LETTER THO SUNG
+ = tho thong
+0E97 LAO LETTER THO TAM
+ = tho thung
+0E99 LAO LETTER NO
+ = no nok
+0E9A LAO LETTER BO
+ = bo be, bo bet
+0E9B LAO LETTER PO
+ = po pa
+0E9C LAO LETTER PHO SUNG
+ = pho pheng
+0E9D LAO LETTER FO TAM
+ % LAO LETTER FO FON
+ = fo fa
+ * name is a mistake for fo sung
+0E9E LAO LETTER PHO TAM
+ = pho phu
+0E9F LAO LETTER FO SUNG
+ % LAO LETTER FO FAY
+ * name is a mistake for fo tam
+0EA1 LAO LETTER MO
+ = mo mew, mo ma
+0EA2 LAO LETTER YO
+ = yo ya
+0EA3 LAO LETTER LO LING
+ % LAO LETTER RO
+ = ro rot
+ * name is a mistake, lo ling is the mnemonic for 0EA5
+0EA5 LAO LETTER LO LOOT
+ % LAO LETTER LO
+ = lo ling
+ * name is a mistake, lo loot is the mnemonic for 0EA3
+0EA7 LAO LETTER WO
+ = wo wi
+0EAA LAO LETTER SO SUNG
+ = so sya
+0EAB LAO LETTER HO SUNG
+ = ho hay, ho han
+0EAD LAO LETTER O
+ = o o
+0EAE LAO LETTER HO TAM
+ = ho hya, ho hyan
+@ Sign
+0EAF LAO ELLIPSIS
+@ Vowels
+0EB0 LAO VOWEL SIGN A
+0EB1 LAO VOWEL SIGN MAI KAN
+ * vowel shortener
+0EB2 LAO VOWEL SIGN AA
+0EB3 LAO VOWEL SIGN AM
+ # 0ECD 0EB2
+0EB4 LAO VOWEL SIGN I
+0EB5 LAO VOWEL SIGN II
+0EB6 LAO VOWEL SIGN Y
+0EB7 LAO VOWEL SIGN YY
+0EB8 LAO VOWEL SIGN U
+0EB9 LAO VOWEL SIGN UU
+0EBB LAO VOWEL SIGN MAI KON
+ = mai kong
+@ Signs
+0EBC LAO SEMIVOWEL SIGN LO
+0EBD LAO SEMIVOWEL SIGN NYO
+ = nyo fyang
+@ Vowels
+0EC0 LAO VOWEL SIGN E
+0EC1 LAO VOWEL SIGN EI
+0EC2 LAO VOWEL SIGN O
+0EC3 LAO VOWEL SIGN AY
+ = mai muan
+0EC4 LAO VOWEL SIGN AI
+ = mai may
+@ Sign
+0EC6 LAO KO LA
+ * repetition
+@ Tone marks
+0EC8 LAO TONE MAI EK
+0EC9 LAO TONE MAI THO
+0ECA LAO TONE MAI TI
+0ECB LAO TONE MAI CATAWA
+@ Signs
+0ECC LAO CANCELLATION MARK
+0ECD LAO NIGGAHITA
+ * final nasal or long o vowel
+@ Digits
+0ED0 LAO DIGIT ZERO
+0ED1 LAO DIGIT ONE
+0ED2 LAO DIGIT TWO
+0ED3 LAO DIGIT THREE
+0ED4 LAO DIGIT FOUR
+0ED5 LAO DIGIT FIVE
+0ED6 LAO DIGIT SIX
+0ED7 LAO DIGIT SEVEN
+0ED8 LAO DIGIT EIGHT
+0ED9 LAO DIGIT NINE
+@ Digraphs
+0EDC LAO HO NO
+ # 0EAB 0E99
+0EDD LAO HO MO
+ # 0EAB 0EA1
+@@ 0F00 Tibetan 0FFF
+@ Syllable
+0F00 TIBETAN SYLLABLE OM
+@ Head marks
+0F01 TIBETAN MARK GTER YIG MGO TRUNCATED A (ter yik go a thung)
+0F02 TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA (ter yik go wum nam chey ma)
+0F03 TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA (ter yik go wum ter tsek ma)
+0F04 TIBETAN MARK INITIAL YIG MGO MDUN MA (yik go dun ma)
+ * honorific; marks beginning of text or start of new folio
+ x (mongolian birga - 1800)
+0F05 TIBETAN MARK CLOSING YIG MGO SGAB MA (yik go kab ma)
+ * follows and ligates with initial yig-mgo
+0F06 TIBETAN MARK CARET YIG MGO PHUR SHAD MA (yik go pur shey ma)
+0F07 TIBETAN MARK YIG MGO TSHEG SHAD MA (yik go tsek shey ma)
+@ Marks and signs
+0F08 TIBETAN MARK SBRUL SHAD (drul shey)
+ * separates sections of meaning equivalent to topics and sub-topics
+0F09 TIBETAN MARK BSKUR YIG MGO (kur yik go)
+ * list enumerator, used in Bhutan
+0F0A TIBETAN MARK BKA- SHOG YIG MGO (ka sho yik go)
+ * petition honorific, used in Bhutan
+0F0B TIBETAN MARK INTERSYLLABIC TSHEG (tsek)
+ * morpheme delimiter (approximate meaning)
+ * the normal tsheg; provides a break opportunity
+ * character name is a misnomer
+0F0C TIBETAN MARK DELIMITER TSHEG BSTAR (tsek tar)
+ * a non-breaking tsheg; inhibits line breaking
+ * character name is a misnomer
+ # <noBreak> 0F0B
+0F0D TIBETAN MARK SHAD (shey)
+ * marks end of a section of text (tshig-grub)
+ x (devanagari danda - 0964)
+0F0E TIBETAN MARK NYIS SHAD (nyi shey)
+ * marks end of a whole topic (don-tshan)
+ x (devanagari double danda - 0965)
+0F0F TIBETAN MARK TSHEG SHAD (tsek shey)
+0F10 TIBETAN MARK NYIS TSHEG SHAD (nyi tsek shey)
+0F11 TIBETAN MARK RIN CHEN SPUNGS SHAD (rinchen pung shey)
+ * shad which follows a tsheg-bar that starts a new line
+0F12 TIBETAN MARK RGYA GRAM SHAD (gya tram shey)
+0F13 TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN (dzu ta me long chen)
+0F14 TIBETAN MARK GTER TSHEG (ter tsek)
+ * used as a comma-like text delimiter
+ x (khmer sign camnuc pii kuuh - 17D6)
+@ Astrological signs
+0F15 TIBETAN LOGOTYPE SIGN CHAD RTAGS (che ta)
+0F16 TIBETAN LOGOTYPE SIGN LHAG RTAGS (hlak ta)
+0F17 TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS (trachen char ta)
+0F18 TIBETAN ASTROLOGICAL SIGN -KHYUD PA (kyu pa)
+ * combines with digits
+0F19 TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS (dong tsu)
+ * combines with digits
+0F1A TIBETAN SIGN RDEL DKAR GCIG (deka chig)
+0F1B TIBETAN SIGN RDEL DKAR GNYIS (deka nyi)
+0F1C TIBETAN SIGN RDEL DKAR GSUM (deka sum)
+0F1D TIBETAN SIGN RDEL NAG GCIG (dena chig)
+0F1E TIBETAN SIGN RDEL NAG GNYIS (dena nyi)
+0F1F TIBETAN SIGN RDEL DKAR RDEL NAG (deka dena)
+@ Digits
+0F20 TIBETAN DIGIT ZERO
+0F21 TIBETAN DIGIT ONE
+0F22 TIBETAN DIGIT TWO
+0F23 TIBETAN DIGIT THREE
+0F24 TIBETAN DIGIT FOUR
+0F25 TIBETAN DIGIT FIVE
+0F26 TIBETAN DIGIT SIX
+0F27 TIBETAN DIGIT SEVEN
+0F28 TIBETAN DIGIT EIGHT
+0F29 TIBETAN DIGIT NINE
+@ Digits minus half
+0F2A TIBETAN DIGIT HALF ONE
+0F2B TIBETAN DIGIT HALF TWO
+0F2C TIBETAN DIGIT HALF THREE
+0F2D TIBETAN DIGIT HALF FOUR
+0F2E TIBETAN DIGIT HALF FIVE
+0F2F TIBETAN DIGIT HALF SIX
+0F30 TIBETAN DIGIT HALF SEVEN
+0F31 TIBETAN DIGIT HALF EIGHT
+0F32 TIBETAN DIGIT HALF NINE
+0F33 TIBETAN DIGIT HALF ZERO
+@ Marks and signs
+0F34 TIBETAN MARK BSDUS RTAGS (du ta)
+ * repetition
+0F35 TIBETAN MARK NGAS BZUNG NYI ZLA (nge zung nyi da)
+ * honorific, emphasis; used like underlining
+0F36 TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN (dzu ta shi mig chen)
+ * marks point of text insertion or annotation
+0F37 TIBETAN MARK NGAS BZUNG SGOR RTAGS (nge zung gor ta)
+ * emphasis; used like underlining
+0F38 TIBETAN MARK CHE MGO (che go)
+0F39 TIBETAN MARK TSA -PHRU (tsa tru)
+ * a lenition mark
+@ Paired punctuation
+0F3A TIBETAN MARK GUG RTAGS GYON (gug ta yun)
+0F3B TIBETAN MARK GUG RTAGS GYAS (gug ta ye)
+ * brackets
+0F3C TIBETAN MARK ANG KHANG GYON (ang kang yun)
+0F3D TIBETAN MARK ANG KHANG GYAS (ang kang ye)
+ * used for bracketing with a roof over
+@ Astrological signs
+0F3E TIBETAN SIGN YAR TSHES (yar tse)
+0F3F TIBETAN SIGN MAR TSHES (mar tse)
+ * marks which combine with digits
+@ Consonants
+0F40 TIBETAN LETTER KA
+0F41 TIBETAN LETTER KHA
+0F42 TIBETAN LETTER GA
+0F43 TIBETAN LETTER GHA
+ : 0F42 0FB7
+0F44 TIBETAN LETTER NGA
+0F45 TIBETAN LETTER CA
+0F46 TIBETAN LETTER CHA
+0F47 TIBETAN LETTER JA
+0F49 TIBETAN LETTER NYA
+0F4A TIBETAN LETTER TTA
+0F4B TIBETAN LETTER TTHA
+0F4C TIBETAN LETTER DDA
+0F4D TIBETAN LETTER DDHA
+ : 0F4C 0FB7
+0F4E TIBETAN LETTER NNA
+0F4F TIBETAN LETTER TA
+0F50 TIBETAN LETTER THA
+0F51 TIBETAN LETTER DA
+0F52 TIBETAN LETTER DHA
+ : 0F51 0FB7
+0F53 TIBETAN LETTER NA
+0F54 TIBETAN LETTER PA
+0F55 TIBETAN LETTER PHA
+0F56 TIBETAN LETTER BA
+0F57 TIBETAN LETTER BHA
+ : 0F56 0FB7
+0F58 TIBETAN LETTER MA
+0F59 TIBETAN LETTER TSA
+0F5A TIBETAN LETTER TSHA
+0F5B TIBETAN LETTER DZA
+0F5C TIBETAN LETTER DZHA
+ : 0F5B 0FB7
+0F5D TIBETAN LETTER WA
+0F5E TIBETAN LETTER ZHA
+0F5F TIBETAN LETTER ZA
+0F60 TIBETAN LETTER -A
+0F61 TIBETAN LETTER YA
+0F62 TIBETAN LETTER RA *
+ * when followed by a subjoined letter = ra mgo
+0F63 TIBETAN LETTER LA
+0F64 TIBETAN LETTER SHA
+0F65 TIBETAN LETTER SSA
+ = reversed sha
+0F66 TIBETAN LETTER SA
+0F67 TIBETAN LETTER HA
+0F68 TIBETAN LETTER A
+ * base for dependent vowels
+0F69 TIBETAN LETTER KSSA
+ : 0F40 0FB5
+0F6A TIBETAN LETTER FIXED-FORM RA *
+ * fixed-form letter not showing the shape variation of the ordinary ra
+ * used only in transliteration and transcription
+ x (tibetan letter ra - 0F62)
+@ Extensions for Balti
+0F6B TIBETAN LETTER KKA
+0F6C TIBETAN LETTER RRA
+@ Dependent vowel signs
+0F71 TIBETAN VOWEL SIGN AA
+ = a-chung
+ * common, vowel-lengthening mark
+0F72 TIBETAN VOWEL SIGN I
+0F73 TIBETAN VOWEL SIGN II
+ * use of this character is discouraged
+ : 0F71 0F72
+0F74 TIBETAN VOWEL SIGN U
+0F75 TIBETAN VOWEL SIGN UU
+ * use of this character is discouraged
+ : 0F71 0F74
+0F76 TIBETAN VOWEL SIGN VOCALIC R
+ : 0FB2 0F80
+0F77 TIBETAN VOWEL SIGN VOCALIC RR
+ * use of this character is strongly discouraged
+ # 0FB2 0F81
+0F78 TIBETAN VOWEL SIGN VOCALIC L
+ : 0FB3 0F80
+0F79 TIBETAN VOWEL SIGN VOCALIC LL
+ * use of this character is strongly discouraged
+ # 0FB3 0F81
+0F7A TIBETAN VOWEL SIGN E
+0F7B TIBETAN VOWEL SIGN EE
+0F7C TIBETAN VOWEL SIGN O
+0F7D TIBETAN VOWEL SIGN OO
+@ Vocalic modification
+0F7E TIBETAN SIGN RJES SU NGA RO (je su nga ro)
+ = anusvara
+0F7F TIBETAN SIGN RNAM BCAD (nam chey)
+ = visarga
+@ Dependent vowel signs
+0F80 TIBETAN VOWEL SIGN REVERSED I
+0F81 TIBETAN VOWEL SIGN REVERSED II
+ * use of this character is discouraged
+ : 0F71 0F80
+@ Marks and signs
+0F82 TIBETAN SIGN NYI ZLA NAA DA (nyi da na da)
+0F83 TIBETAN SIGN SNA LDAN (nan de)
+ x (devanagari sign candrabindu - 0901)
+0F84 TIBETAN MARK HALANTA
+ = srog med
+ x (devanagari sign virama - 094D)
+0F85 TIBETAN MARK PALUTA
+ * transliteration of Sanskrit avagraha
+ x (devanagari sign avagraha - 093D)
+0F86 TIBETAN SIGN LCI RTAGS (ji ta)
+0F87 TIBETAN SIGN YANG RTAGS (yang ta)
+@ Transliteration head letters
+0F88 TIBETAN SIGN LCE TSA CAN (che tsa chen)
+0F89 TIBETAN SIGN MCHU CAN (chu chen)
+0F8A TIBETAN SIGN GRU CAN RGYINGS (tru chen ging)
+ * always followed by 0F82
+0F8B TIBETAN SIGN GRU MED RGYINGS (tru me ging)
+@ Subjoined consonants
+@+ The subjoined letters for WA, YA, and RA appear in both full and short forms. The short forms, wa.zur, ya-btags, and ra-btags, respectively, are most common and are the forms shown in the charts.
+0F90 TIBETAN SUBJOINED LETTER KA
+0F91 TIBETAN SUBJOINED LETTER KHA
+0F92 TIBETAN SUBJOINED LETTER GA
+0F93 TIBETAN SUBJOINED LETTER GHA
+ : 0F92 0FB7
+0F94 TIBETAN SUBJOINED LETTER NGA
+0F95 TIBETAN SUBJOINED LETTER CA
+0F96 TIBETAN SUBJOINED LETTER CHA
+0F97 TIBETAN SUBJOINED LETTER JA
+0F99 TIBETAN SUBJOINED LETTER NYA
+0F9A TIBETAN SUBJOINED LETTER TTA
+0F9B TIBETAN SUBJOINED LETTER TTHA
+0F9C TIBETAN SUBJOINED LETTER DDA
+0F9D TIBETAN SUBJOINED LETTER DDHA
+ : 0F9C 0FB7
+0F9E TIBETAN SUBJOINED LETTER NNA
+0F9F TIBETAN SUBJOINED LETTER TA
+0FA0 TIBETAN SUBJOINED LETTER THA
+0FA1 TIBETAN SUBJOINED LETTER DA
+0FA2 TIBETAN SUBJOINED LETTER DHA
+ : 0FA1 0FB7
+0FA3 TIBETAN SUBJOINED LETTER NA
+0FA4 TIBETAN SUBJOINED LETTER PA
+0FA5 TIBETAN SUBJOINED LETTER PHA
+0FA6 TIBETAN SUBJOINED LETTER BA
+0FA7 TIBETAN SUBJOINED LETTER BHA
+ : 0FA6 0FB7
+0FA8 TIBETAN SUBJOINED LETTER MA
+0FA9 TIBETAN SUBJOINED LETTER TSA
+0FAA TIBETAN SUBJOINED LETTER TSHA
+0FAB TIBETAN SUBJOINED LETTER DZA
+0FAC TIBETAN SUBJOINED LETTER DZHA
+ : 0FAB 0FB7
+0FAD TIBETAN SUBJOINED LETTER WA *
+ = wa-zur, wa-btags (wa ta)
+0FAE TIBETAN SUBJOINED LETTER ZHA
+0FAF TIBETAN SUBJOINED LETTER ZA
+0FB0 TIBETAN SUBJOINED LETTER -A
+ = a-chung
+ * rare, only used for full-sized subjoined letter
+ x (tibetan vowel sign aa - 0F71)
+0FB1 TIBETAN SUBJOINED LETTER YA *
+ = ya-btags (ya ta)
+0FB2 TIBETAN SUBJOINED LETTER RA *
+ = ra-btags (ra ta)
+0FB3 TIBETAN SUBJOINED LETTER LA
+0FB4 TIBETAN SUBJOINED LETTER SHA
+0FB5 TIBETAN SUBJOINED LETTER SSA
+ = reversed subjoined sha
+0FB6 TIBETAN SUBJOINED LETTER SA
+0FB7 TIBETAN SUBJOINED LETTER HA
+0FB8 TIBETAN SUBJOINED LETTER A
+0FB9 TIBETAN SUBJOINED LETTER KSSA
+ : 0F90 0FB5
+@ Fixed-form subjoined consonants
+@+ These characters are used only for transliteration and transcription.
+0FBA TIBETAN SUBJOINED LETTER FIXED-FORM WA *
+0FBB TIBETAN SUBJOINED LETTER FIXED-FORM YA *
+0FBC TIBETAN SUBJOINED LETTER FIXED-FORM RA *
+@ Signs
+0FBE TIBETAN KU RU KHA (kuruka)
+ * often repeated three times; indicates a refrain
+0FBF TIBETAN KU RU KHA BZHI MIG CAN (kuruka shi mik chen)
+ * marks point of text insertion or annotation
+ x (reference mark - 203B)
+@ Cantillation signs
+0FC0 TIBETAN CANTILLATION SIGN HEAVY BEAT
+ * marks a heavy drum beat
+0FC1 TIBETAN CANTILLATION SIGN LIGHT BEAT
+ * marks a light drum beat
+0FC2 TIBETAN CANTILLATION SIGN CANG TE-U (chang tyu)
+ * symbol of a small Tibetan hand drum
+0FC3 TIBETAN CANTILLATION SIGN SBUB -CHAL (bub chey)
+ * symbol of a Tibetan cymbal
+@ Symbols
+0FC4 TIBETAN SYMBOL DRIL BU (drilbu)
+ * symbol of a Tibetan hand bell
+0FC5 TIBETAN SYMBOL RDO RJE (dorje)
+0FC6 TIBETAN SYMBOL PADMA GDAN (pema den)
+0FC7 TIBETAN SYMBOL RDO RJE RGYA GRAM (dorje gya dram)
+0FC8 TIBETAN SYMBOL PHUR PA (phurba)
+0FC9 TIBETAN SYMBOL NOR BU (norbu)
+0FCA TIBETAN SYMBOL NOR BU NYIS -KHYIL (norbu nyi khyi)
+ * the double body symbol
+ x (yin yang - 262F)
+0FCB TIBETAN SYMBOL NOR BU GSUM -KHYIL (norbu sum khyi)
+ * the tri-kaya or triple body symbol
+0FCC TIBETAN SYMBOL NOR BU BZHI -KHYIL (norbu shi khyi)
+ * the quadruple body symbol, a form of the swastika
+ x (cjk unified ideograph-534D - 534D)
+@ Astrological signs
+0FCE TIBETAN SIGN RDEL NAG RDEL DKAR (dena deka)
+ = dena deka
+ * signifies good luck earlier, bad luck later
+0FCF TIBETAN SIGN RDEL NAG GSUM (dena sum)
+@ Marks
+0FD0 TIBETAN MARK BSKA- SHOG GI MGO RGYAN (ka shog gi go gyen)
+ % TIBETAN MARK BKA- SHOG GI MGO RGYAN
+ * used in Bhutan
+0FD1 TIBETAN MARK MNYAM YIG GI MGO RGYAN (nyam yig gi go gyen)
+ * used in Bhutan
+0FD2 TIBETAN MARK NYIS TSHEG (nyi tsek)
+ = nyi tsek
+@ Head marks
+0FD3 TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA (da nying yik go dun ma)
+ = da nying yik go dun ma
+0FD4 TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA (da nying yik go kab ma)
+ = da nying yik go kab ma
+@@ 1000 Myanmar 109F
+@ Consonants
+1000 MYANMAR LETTER KA
+1001 MYANMAR LETTER KHA
+1002 MYANMAR LETTER GA
+1003 MYANMAR LETTER GHA
+1004 MYANMAR LETTER NGA
+1005 MYANMAR LETTER CA
+1006 MYANMAR LETTER CHA
+1007 MYANMAR LETTER JA
+1008 MYANMAR LETTER JHA
+1009 MYANMAR LETTER NYA
+100A MYANMAR LETTER NNYA
+100B MYANMAR LETTER TTA
+100C MYANMAR LETTER TTHA
+100D MYANMAR LETTER DDA
+100E MYANMAR LETTER DDHA
+100F MYANMAR LETTER NNA
+1010 MYANMAR LETTER TA
+1011 MYANMAR LETTER THA
+1012 MYANMAR LETTER DA
+1013 MYANMAR LETTER DHA
+1014 MYANMAR LETTER NA
+1015 MYANMAR LETTER PA
+1016 MYANMAR LETTER PHA
+1017 MYANMAR LETTER BA
+1018 MYANMAR LETTER BHA
+1019 MYANMAR LETTER MA
+101A MYANMAR LETTER YA
+101B MYANMAR LETTER RA
+101C MYANMAR LETTER LA
+101D MYANMAR LETTER WA
+101E MYANMAR LETTER SA
+101F MYANMAR LETTER HA
+1020 MYANMAR LETTER LLA
+@ Independent vowels
+1021 MYANMAR LETTER A
+ * also represents the glottal stop as a consonant
+1022 MYANMAR LETTER SHAN A
+1023 MYANMAR LETTER I
+1024 MYANMAR LETTER II
+1025 MYANMAR LETTER U
+1026 MYANMAR LETTER UU
+ : 1025 102E
+1027 MYANMAR LETTER E
+1028 MYANMAR LETTER MON E
+1029 MYANMAR LETTER O
+102A MYANMAR LETTER AU
+@ Dependent vowel signs
+102B MYANMAR VOWEL SIGN TALL AA
+102C MYANMAR VOWEL SIGN AA
+102D MYANMAR VOWEL SIGN I
+102E MYANMAR VOWEL SIGN II
+102F MYANMAR VOWEL SIGN U
+1030 MYANMAR VOWEL SIGN UU
+1031 MYANMAR VOWEL SIGN E
+ * stands to the left of the consonant
+1032 MYANMAR VOWEL SIGN AI
+1033 MYANMAR VOWEL SIGN MON II
+1034 MYANMAR VOWEL SIGN MON O
+1035 MYANMAR VOWEL SIGN E ABOVE
+@ Various signs
+1036 MYANMAR SIGN ANUSVARA
+1037 MYANMAR SIGN DOT BELOW
+ = aukmyit
+ * a tone mark
+1038 MYANMAR SIGN VISARGA
+1039 MYANMAR SIGN VIRAMA
+ = killer (when rendered visibly)
+103A MYANMAR SIGN ASAT
+ = killer (always rendered visibly)
+@ Dependent consonant signs
+103B MYANMAR CONSONANT SIGN MEDIAL YA
+103C MYANMAR CONSONANT SIGN MEDIAL RA
+103D MYANMAR CONSONANT SIGN MEDIAL WA
+103E MYANMAR CONSONANT SIGN MEDIAL HA
+@ Consonant
+103F MYANMAR LETTER GREAT SA
+@ Digits
+1040 MYANMAR DIGIT ZERO
+1041 MYANMAR DIGIT ONE
+1042 MYANMAR DIGIT TWO
+1043 MYANMAR DIGIT THREE
+1044 MYANMAR DIGIT FOUR
+1045 MYANMAR DIGIT FIVE
+1046 MYANMAR DIGIT SIX
+1047 MYANMAR DIGIT SEVEN
+1048 MYANMAR DIGIT EIGHT
+1049 MYANMAR DIGIT NINE
+@ Punctuation
+104A MYANMAR SIGN LITTLE SECTION
+ x (devanagari danda - 0964)
+104B MYANMAR SIGN SECTION
+ x (devanagari double danda - 0965)
+@ Various signs
+104C MYANMAR SYMBOL LOCATIVE
+104D MYANMAR SYMBOL COMPLETED
+104E MYANMAR SYMBOL AFOREMENTIONED
+104F MYANMAR SYMBOL GENITIVE
+@ Pali and Sanskrit extensions
+1050 MYANMAR LETTER SHA
+1051 MYANMAR LETTER SSA
+1052 MYANMAR LETTER VOCALIC R
+1053 MYANMAR LETTER VOCALIC RR
+1054 MYANMAR LETTER VOCALIC L
+1055 MYANMAR LETTER VOCALIC LL
+1056 MYANMAR VOWEL SIGN VOCALIC R
+1057 MYANMAR VOWEL SIGN VOCALIC RR
+1058 MYANMAR VOWEL SIGN VOCALIC L
+1059 MYANMAR VOWEL SIGN VOCALIC LL
+@ Extensions for Mon
+105A MYANMAR LETTER MON NGA
+105B MYANMAR LETTER MON JHA
+105C MYANMAR LETTER MON BBA
+105D MYANMAR LETTER MON BBE
+105E MYANMAR CONSONANT SIGN MON MEDIAL NA
+105F MYANMAR CONSONANT SIGN MON MEDIAL MA
+1060 MYANMAR CONSONANT SIGN MON MEDIAL LA
+@ Extensions for S'gaw Karen
+1061 MYANMAR LETTER SGAW KAREN SHA
+1062 MYANMAR VOWEL SIGN SGAW KAREN EU
+1063 MYANMAR TONE MARK SGAW KAREN HATHI
+1064 MYANMAR TONE MARK SGAW KAREN KE PHO
+@ Extensions for Western Pwo Karen
+1065 MYANMAR LETTER WESTERN PWO KAREN THA
+1066 MYANMAR LETTER WESTERN PWO KAREN PWA
+1067 MYANMAR VOWEL SIGN WESTERN PWO KAREN EU
+1068 MYANMAR VOWEL SIGN WESTERN PWO KAREN UE
+1069 MYANMAR SIGN WESTERN PWO KAREN TONE-1
+106A MYANMAR SIGN WESTERN PWO KAREN TONE-2
+106B MYANMAR SIGN WESTERN PWO KAREN TONE-3
+106C MYANMAR SIGN WESTERN PWO KAREN TONE-4
+106D MYANMAR SIGN WESTERN PWO KAREN TONE-5
+@ Extensions for Eastern Pwo Karen
+106E MYANMAR LETTER EASTERN PWO KAREN NNA
+106F MYANMAR LETTER EASTERN PWO KAREN YWA
+1070 MYANMAR LETTER EASTERN PWO KAREN GHWA
+@ Extension for Geba Karen
+1071 MYANMAR VOWEL SIGN GEBA KAREN I
+@ Extensions for Kayah
+1072 MYANMAR VOWEL SIGN KAYAH OE
+1073 MYANMAR VOWEL SIGN KAYAH U
+1074 MYANMAR VOWEL SIGN KAYAH EE
+@ Extensions for Shan
+1075 MYANMAR LETTER SHAN KA
+1076 MYANMAR LETTER SHAN KHA
+1077 MYANMAR LETTER SHAN GA
+1078 MYANMAR LETTER SHAN CA
+1079 MYANMAR LETTER SHAN ZA
+107A MYANMAR LETTER SHAN NYA
+107B MYANMAR LETTER SHAN DA
+107C MYANMAR LETTER SHAN NA
+107D MYANMAR LETTER SHAN PHA
+107E MYANMAR LETTER SHAN FA
+107F MYANMAR LETTER SHAN BA
+1080 MYANMAR LETTER SHAN THA
+1081 MYANMAR LETTER SHAN HA
+1082 MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083 MYANMAR VOWEL SIGN SHAN AA
+1084 MYANMAR VOWEL SIGN SHAN E
+1085 MYANMAR VOWEL SIGN SHAN E ABOVE
+1086 MYANMAR VOWEL SIGN SHAN FINAL Y
+1087 MYANMAR SIGN SHAN TONE-2
+1088 MYANMAR SIGN SHAN TONE-3
+1089 MYANMAR SIGN SHAN TONE-5
+108A MYANMAR SIGN SHAN TONE-6
+108B MYANMAR SIGN SHAN COUNCIL TONE-2
+108C MYANMAR SIGN SHAN COUNCIL TONE-3
+108D MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+@ Extensions for Rumai Palaung
+108E MYANMAR LETTER RUMAI PALAUNG FA
+108F MYANMAR SIGN RUMAI PALAUNG TONE-5
+@ Shan digits
+1090 MYANMAR SHAN DIGIT ZERO
+1091 MYANMAR SHAN DIGIT ONE
+1092 MYANMAR SHAN DIGIT TWO
+1093 MYANMAR SHAN DIGIT THREE
+1094 MYANMAR SHAN DIGIT FOUR
+1095 MYANMAR SHAN DIGIT FIVE
+1096 MYANMAR SHAN DIGIT SIX
+1097 MYANMAR SHAN DIGIT SEVEN
+1098 MYANMAR SHAN DIGIT EIGHT
+1099 MYANMAR SHAN DIGIT NINE
+@ Shan symbols
+109E MYANMAR SYMBOL SHAN ONE
+109F MYANMAR SYMBOL SHAN EXCLAMATION
+@@ 10A0 Georgian 10FF
+@ Capital letters (Khutsuri)
+@+ This is the uppercase of the old ecclesiastical alphabet. The style shown in the code charts is known as Asomtavruli. See the Georgian Supplement block for lowercase Nuskhuri.
+10A0 GEORGIAN CAPITAL LETTER AN (Khutsuri)
+10A1 GEORGIAN CAPITAL LETTER BAN (Khutsuri)
+10A2 GEORGIAN CAPITAL LETTER GAN (Khutsuri)
+10A3 GEORGIAN CAPITAL LETTER DON (Khutsuri)
+10A4 GEORGIAN CAPITAL LETTER EN (Khutsuri)
+10A5 GEORGIAN CAPITAL LETTER VIN (Khutsuri)
+10A6 GEORGIAN CAPITAL LETTER ZEN (Khutsuri)
+10A7 GEORGIAN CAPITAL LETTER TAN (Khutsuri)
+10A8 GEORGIAN CAPITAL LETTER IN (Khutsuri)
+10A9 GEORGIAN CAPITAL LETTER KAN (Khutsuri)
+10AA GEORGIAN CAPITAL LETTER LAS (Khutsuri)
+10AB GEORGIAN CAPITAL LETTER MAN (Khutsuri)
+10AC GEORGIAN CAPITAL LETTER NAR (Khutsuri)
+10AD GEORGIAN CAPITAL LETTER ON (Khutsuri)
+10AE GEORGIAN CAPITAL LETTER PAR (Khutsuri)
+10AF GEORGIAN CAPITAL LETTER ZHAR (Khutsuri)
+10B0 GEORGIAN CAPITAL LETTER RAE (Khutsuri)
+10B1 GEORGIAN CAPITAL LETTER SAN (Khutsuri)
+10B2 GEORGIAN CAPITAL LETTER TAR (Khutsuri)
+10B3 GEORGIAN CAPITAL LETTER UN (Khutsuri)
+10B4 GEORGIAN CAPITAL LETTER PHAR (Khutsuri)
+10B5 GEORGIAN CAPITAL LETTER KHAR (Khutsuri)
+10B6 GEORGIAN CAPITAL LETTER GHAN (Khutsuri)
+10B7 GEORGIAN CAPITAL LETTER QAR (Khutsuri)
+10B8 GEORGIAN CAPITAL LETTER SHIN (Khutsuri)
+10B9 GEORGIAN CAPITAL LETTER CHIN (Khutsuri)
+10BA GEORGIAN CAPITAL LETTER CAN (Khutsuri)
+10BB GEORGIAN CAPITAL LETTER JIL (Khutsuri)
+10BC GEORGIAN CAPITAL LETTER CIL (Khutsuri)
+10BD GEORGIAN CAPITAL LETTER CHAR (Khutsuri)
+10BE GEORGIAN CAPITAL LETTER XAN (Khutsuri)
+10BF GEORGIAN CAPITAL LETTER JHAN (Khutsuri)
+10C0 GEORGIAN CAPITAL LETTER HAE (Khutsuri)
+10C1 GEORGIAN CAPITAL LETTER HE (Khutsuri)
+10C2 GEORGIAN CAPITAL LETTER HIE (Khutsuri)
+10C3 GEORGIAN CAPITAL LETTER WE (Khutsuri)
+10C4 GEORGIAN CAPITAL LETTER HAR (Khutsuri)
+10C5 GEORGIAN CAPITAL LETTER HOE (Khutsuri)
+@ Mkhedruli
+@+ This is the modern secular alphabet, which is caseless.
+10D0 GEORGIAN LETTER AN
+10D1 GEORGIAN LETTER BAN
+10D2 GEORGIAN LETTER GAN
+10D3 GEORGIAN LETTER DON
+10D4 GEORGIAN LETTER EN
+10D5 GEORGIAN LETTER VIN
+10D6 GEORGIAN LETTER ZEN
+10D7 GEORGIAN LETTER TAN
+10D8 GEORGIAN LETTER IN
+10D9 GEORGIAN LETTER KAN
+10DA GEORGIAN LETTER LAS
+10DB GEORGIAN LETTER MAN
+10DC GEORGIAN LETTER NAR
+10DD GEORGIAN LETTER ON
+10DE GEORGIAN LETTER PAR
+10DF GEORGIAN LETTER ZHAR
+10E0 GEORGIAN LETTER RAE
+10E1 GEORGIAN LETTER SAN
+10E2 GEORGIAN LETTER TAR
+10E3 GEORGIAN LETTER UN
+10E4 GEORGIAN LETTER PHAR
+10E5 GEORGIAN LETTER KHAR
+10E6 GEORGIAN LETTER GHAN
+10E7 GEORGIAN LETTER QAR
+10E8 GEORGIAN LETTER SHIN
+10E9 GEORGIAN LETTER CHIN
+10EA GEORGIAN LETTER CAN
+10EB GEORGIAN LETTER JIL
+10EC GEORGIAN LETTER CIL
+10ED GEORGIAN LETTER CHAR
+10EE GEORGIAN LETTER XAN
+10EF GEORGIAN LETTER JHAN
+10F0 GEORGIAN LETTER HAE
+@ Archaic letters
+10F1 GEORGIAN LETTER HE
+10F2 GEORGIAN LETTER HIE
+10F3 GEORGIAN LETTER WE
+10F4 GEORGIAN LETTER HAR
+10F5 GEORGIAN LETTER HOE
+10F6 GEORGIAN LETTER FI
+@ Additional letters for Mingrelian and Svan
+10F7 GEORGIAN LETTER YN
+10F8 GEORGIAN LETTER ELIFI
+@ Additional letters
+10F9 GEORGIAN LETTER TURNED GAN
+10FA GEORGIAN LETTER AIN
+@ Punctuation
+10FB GEORGIAN PARAGRAPH SEPARATOR
+@ Modifier letter
+10FC MODIFIER LETTER GEORGIAN NAR
+ # <super> 10DC
+@@ 1100 Hangul Jamo 11FF
+@+ The aliases in this block represent the Jamo short names.
+@ Initial consonants
+1100 HANGUL CHOSEONG KIYEOK (g) *
+ = G
+1101 HANGUL CHOSEONG SSANGKIYEOK (gg) *
+ = GG
+1102 HANGUL CHOSEONG NIEUN (n) *
+ = N
+1103 HANGUL CHOSEONG TIKEUT (d) *
+ = D
+1104 HANGUL CHOSEONG SSANGTIKEUT (dd) *
+ = DD
+1105 HANGUL CHOSEONG RIEUL (r) *
+ = R
+1106 HANGUL CHOSEONG MIEUM (m) *
+ = M
+1107 HANGUL CHOSEONG PIEUP (b) *
+ = B
+1108 HANGUL CHOSEONG SSANGPIEUP (bb) *
+ = BB
+1109 HANGUL CHOSEONG SIOS (s) *
+ = S
+110A HANGUL CHOSEONG SSANGSIOS (ss) *
+ = SS
+110B HANGUL CHOSEONG IEUNG
+110C HANGUL CHOSEONG CIEUC (j) *
+ = J
+110D HANGUL CHOSEONG SSANGCIEUC (jj) *
+ = JJ
+110E HANGUL CHOSEONG CHIEUCH (c) *
+ = C
+110F HANGUL CHOSEONG KHIEUKH (k) *
+ = K
+1110 HANGUL CHOSEONG THIEUTH (t) *
+ = T
+1111 HANGUL CHOSEONG PHIEUPH (p) *
+ = P
+1112 HANGUL CHOSEONG HIEUH (h) *
+ = H
+1113 HANGUL CHOSEONG NIEUN-KIYEOK
+1114 HANGUL CHOSEONG SSANGNIEUN
+1115 HANGUL CHOSEONG NIEUN-TIKEUT
+1116 HANGUL CHOSEONG NIEUN-PIEUP
+1117 HANGUL CHOSEONG TIKEUT-KIYEOK
+1118 HANGUL CHOSEONG RIEUL-NIEUN
+1119 HANGUL CHOSEONG SSANGRIEUL
+111A HANGUL CHOSEONG RIEUL-HIEUH
+111B HANGUL CHOSEONG KAPYEOUNRIEUL
+111C HANGUL CHOSEONG MIEUM-PIEUP
+111D HANGUL CHOSEONG KAPYEOUNMIEUM
+111E HANGUL CHOSEONG PIEUP-KIYEOK
+111F HANGUL CHOSEONG PIEUP-NIEUN
+1120 HANGUL CHOSEONG PIEUP-TIKEUT
+1121 HANGUL CHOSEONG PIEUP-SIOS
+1122 HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123 HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124 HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125 HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126 HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127 HANGUL CHOSEONG PIEUP-CIEUC
+1128 HANGUL CHOSEONG PIEUP-CHIEUCH
+1129 HANGUL CHOSEONG PIEUP-THIEUTH
+112A HANGUL CHOSEONG PIEUP-PHIEUPH
+112B HANGUL CHOSEONG KAPYEOUNPIEUP
+112C HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D HANGUL CHOSEONG SIOS-KIYEOK
+112E HANGUL CHOSEONG SIOS-NIEUN
+112F HANGUL CHOSEONG SIOS-TIKEUT
+1130 HANGUL CHOSEONG SIOS-RIEUL
+1131 HANGUL CHOSEONG SIOS-MIEUM
+1132 HANGUL CHOSEONG SIOS-PIEUP
+1133 HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134 HANGUL CHOSEONG SIOS-SSANGSIOS
+1135 HANGUL CHOSEONG SIOS-IEUNG
+1136 HANGUL CHOSEONG SIOS-CIEUC
+1137 HANGUL CHOSEONG SIOS-CHIEUCH
+1138 HANGUL CHOSEONG SIOS-KHIEUKH
+1139 HANGUL CHOSEONG SIOS-THIEUTH
+113A HANGUL CHOSEONG SIOS-PHIEUPH
+113B HANGUL CHOSEONG SIOS-HIEUH
+113C HANGUL CHOSEONG CHITUEUMSIOS
+113D HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140 HANGUL CHOSEONG PANSIOS
+1141 HANGUL CHOSEONG IEUNG-KIYEOK
+1142 HANGUL CHOSEONG IEUNG-TIKEUT
+1143 HANGUL CHOSEONG IEUNG-MIEUM
+1144 HANGUL CHOSEONG IEUNG-PIEUP
+1145 HANGUL CHOSEONG IEUNG-SIOS
+1146 HANGUL CHOSEONG IEUNG-PANSIOS
+1147 HANGUL CHOSEONG SSANGIEUNG
+1148 HANGUL CHOSEONG IEUNG-CIEUC
+1149 HANGUL CHOSEONG IEUNG-CHIEUCH
+114A HANGUL CHOSEONG IEUNG-THIEUTH
+114B HANGUL CHOSEONG IEUNG-PHIEUPH
+114C HANGUL CHOSEONG YESIEUNG
+114D HANGUL CHOSEONG CIEUC-IEUNG
+114E HANGUL CHOSEONG CHITUEUMCIEUC
+114F HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150 HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151 HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152 HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153 HANGUL CHOSEONG CHIEUCH-HIEUH
+1154 HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155 HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156 HANGUL CHOSEONG PHIEUPH-PIEUP
+1157 HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158 HANGUL CHOSEONG SSANGHIEUH
+1159 HANGUL CHOSEONG YEORINHIEUH
+115F HANGUL CHOSEONG FILLER
+@ Medial vowels
+1160 HANGUL JUNGSEONG FILLER
+1161 HANGUL JUNGSEONG A
+ = A
+1162 HANGUL JUNGSEONG AE
+ = AE
+1163 HANGUL JUNGSEONG YA
+ = YA
+1164 HANGUL JUNGSEONG YAE
+ = YAE
+1165 HANGUL JUNGSEONG EO
+ = EO
+1166 HANGUL JUNGSEONG E
+ = E
+1167 HANGUL JUNGSEONG YEO
+ = YEO
+1168 HANGUL JUNGSEONG YE
+ = YE
+1169 HANGUL JUNGSEONG O
+ = O
+116A HANGUL JUNGSEONG WA
+ = WA
+116B HANGUL JUNGSEONG WAE
+ = WAE
+116C HANGUL JUNGSEONG OE
+ = OE
+116D HANGUL JUNGSEONG YO
+ = YO
+116E HANGUL JUNGSEONG U
+ = U
+116F HANGUL JUNGSEONG WEO
+ = WEO
+1170 HANGUL JUNGSEONG WE
+ = WE
+1171 HANGUL JUNGSEONG WI
+ = WI
+1172 HANGUL JUNGSEONG YU
+ = YU
+1173 HANGUL JUNGSEONG EU
+ = EU
+1174 HANGUL JUNGSEONG YI
+ = YI
+1175 HANGUL JUNGSEONG I
+ = I
+1176 HANGUL JUNGSEONG A-O
+1177 HANGUL JUNGSEONG A-U
+1178 HANGUL JUNGSEONG YA-O
+1179 HANGUL JUNGSEONG YA-YO
+117A HANGUL JUNGSEONG EO-O
+117B HANGUL JUNGSEONG EO-U
+117C HANGUL JUNGSEONG EO-EU
+117D HANGUL JUNGSEONG YEO-O
+117E HANGUL JUNGSEONG YEO-U
+117F HANGUL JUNGSEONG O-EO
+1180 HANGUL JUNGSEONG O-E
+1181 HANGUL JUNGSEONG O-YE
+1182 HANGUL JUNGSEONG O-O
+1183 HANGUL JUNGSEONG O-U
+1184 HANGUL JUNGSEONG YO-YA
+1185 HANGUL JUNGSEONG YO-YAE
+1186 HANGUL JUNGSEONG YO-YEO
+1187 HANGUL JUNGSEONG YO-O
+1188 HANGUL JUNGSEONG YO-I
+1189 HANGUL JUNGSEONG U-A
+118A HANGUL JUNGSEONG U-AE
+118B HANGUL JUNGSEONG U-EO-EU
+118C HANGUL JUNGSEONG U-YE
+118D HANGUL JUNGSEONG U-U
+118E HANGUL JUNGSEONG YU-A
+118F HANGUL JUNGSEONG YU-EO
+1190 HANGUL JUNGSEONG YU-E
+1191 HANGUL JUNGSEONG YU-YEO
+1192 HANGUL JUNGSEONG YU-YE
+1193 HANGUL JUNGSEONG YU-U
+1194 HANGUL JUNGSEONG YU-I
+1195 HANGUL JUNGSEONG EU-U
+1196 HANGUL JUNGSEONG EU-EU
+1197 HANGUL JUNGSEONG YI-U
+1198 HANGUL JUNGSEONG I-A
+1199 HANGUL JUNGSEONG I-YA
+119A HANGUL JUNGSEONG I-O
+119B HANGUL JUNGSEONG I-U
+119C HANGUL JUNGSEONG I-EU
+119D HANGUL JUNGSEONG I-ARAEA
+119E HANGUL JUNGSEONG ARAEA
+119F HANGUL JUNGSEONG ARAEA-EO
+11A0 HANGUL JUNGSEONG ARAEA-U
+11A1 HANGUL JUNGSEONG ARAEA-I
+11A2 HANGUL JUNGSEONG SSANGARAEA
+@ Final consonants
+11A8 HANGUL JONGSEONG KIYEOK (g) *
+ = G
+11A9 HANGUL JONGSEONG SSANGKIYEOK (gg) *
+ = GG
+11AA HANGUL JONGSEONG KIYEOK-SIOS (gs) *
+ = GS
+11AB HANGUL JONGSEONG NIEUN (n) *
+ = N
+11AC HANGUL JONGSEONG NIEUN-CIEUC (nj) *
+ = NJ
+11AD HANGUL JONGSEONG NIEUN-HIEUH (nh) *
+ = NH
+11AE HANGUL JONGSEONG TIKEUT (d) *
+ = D
+11AF HANGUL JONGSEONG RIEUL (l) *
+ = L
+11B0 HANGUL JONGSEONG RIEUL-KIYEOK (lg) *
+ = LG
+11B1 HANGUL JONGSEONG RIEUL-MIEUM (lm) *
+ = LM
+11B2 HANGUL JONGSEONG RIEUL-PIEUP (lb) *
+ = LB
+11B3 HANGUL JONGSEONG RIEUL-SIOS (ls) *
+ = LS
+11B4 HANGUL JONGSEONG RIEUL-THIEUTH (lt) *
+ = LT
+11B5 HANGUL JONGSEONG RIEUL-PHIEUPH (lp) *
+ = LP
+11B6 HANGUL JONGSEONG RIEUL-HIEUH (lh) *
+ = LH
+11B7 HANGUL JONGSEONG MIEUM (m) *
+ = M
+11B8 HANGUL JONGSEONG PIEUP (b) *
+ = B
+11B9 HANGUL JONGSEONG PIEUP-SIOS (bs) *
+ = BS
+11BA HANGUL JONGSEONG SIOS (s) *
+ = S
+11BB HANGUL JONGSEONG SSANGSIOS (ss) *
+ = SS
+11BC HANGUL JONGSEONG IEUNG (ng) *
+ = NG
+11BD HANGUL JONGSEONG CIEUC (j) *
+ = J
+11BE HANGUL JONGSEONG CHIEUCH (c) *
+ = C
+11BF HANGUL JONGSEONG KHIEUKH (k) *
+ = K
+11C0 HANGUL JONGSEONG THIEUTH (t) *
+ = T
+11C1 HANGUL JONGSEONG PHIEUPH (p) *
+ = P
+11C2 HANGUL JONGSEONG HIEUH (h) *
+ = H
+11C3 HANGUL JONGSEONG KIYEOK-RIEUL
+11C4 HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5 HANGUL JONGSEONG NIEUN-KIYEOK
+11C6 HANGUL JONGSEONG NIEUN-TIKEUT
+11C7 HANGUL JONGSEONG NIEUN-SIOS
+11C8 HANGUL JONGSEONG NIEUN-PANSIOS
+11C9 HANGUL JONGSEONG NIEUN-THIEUTH
+11CA HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB HANGUL JONGSEONG TIKEUT-RIEUL
+11CC HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD HANGUL JONGSEONG RIEUL-NIEUN
+11CE HANGUL JONGSEONG RIEUL-TIKEUT
+11CF HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0 HANGUL JONGSEONG SSANGRIEUL
+11D1 HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2 HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3 HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4 HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5 HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6 HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7 HANGUL JONGSEONG RIEUL-PANSIOS
+11D8 HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9 HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA HANGUL JONGSEONG MIEUM-KIYEOK
+11DB HANGUL JONGSEONG MIEUM-RIEUL
+11DC HANGUL JONGSEONG MIEUM-PIEUP
+11DD HANGUL JONGSEONG MIEUM-SIOS
+11DE HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF HANGUL JONGSEONG MIEUM-PANSIOS
+11E0 HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1 HANGUL JONGSEONG MIEUM-HIEUH
+11E2 HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3 HANGUL JONGSEONG PIEUP-RIEUL
+11E4 HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5 HANGUL JONGSEONG PIEUP-HIEUH
+11E6 HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7 HANGUL JONGSEONG SIOS-KIYEOK
+11E8 HANGUL JONGSEONG SIOS-TIKEUT
+11E9 HANGUL JONGSEONG SIOS-RIEUL
+11EA HANGUL JONGSEONG SIOS-PIEUP
+11EB HANGUL JONGSEONG PANSIOS
+11EC HANGUL JONGSEONG IEUNG-KIYEOK
+ = yesieung-kiyeok
+11ED HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+ = yesieung-ssangkiyeok
+11EE HANGUL JONGSEONG SSANGIEUNG
+ = ssangyesieung
+11EF HANGUL JONGSEONG IEUNG-KHIEUKH
+ = yesieung-khieukh
+11F0 HANGUL JONGSEONG YESIEUNG
+11F1 HANGUL JONGSEONG YESIEUNG-SIOS
+11F2 HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3 HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4 HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5 HANGUL JONGSEONG HIEUH-NIEUN
+11F6 HANGUL JONGSEONG HIEUH-RIEUL
+11F7 HANGUL JONGSEONG HIEUH-MIEUM
+11F8 HANGUL JONGSEONG HIEUH-PIEUP
+11F9 HANGUL JONGSEONG YEORINHIEUH
+@@ 1200 Ethiopic 137F
+@@+
+@ Syllables
+1200 ETHIOPIC SYLLABLE HA
+1201 ETHIOPIC SYLLABLE HU
+1202 ETHIOPIC SYLLABLE HI
+1203 ETHIOPIC SYLLABLE HAA
+1204 ETHIOPIC SYLLABLE HEE
+1205 ETHIOPIC SYLLABLE HE
+1206 ETHIOPIC SYLLABLE HO
+1207 ETHIOPIC SYLLABLE HOA
+1208 ETHIOPIC SYLLABLE LA
+1209 ETHIOPIC SYLLABLE LU
+120A ETHIOPIC SYLLABLE LI
+120B ETHIOPIC SYLLABLE LAA
+120C ETHIOPIC SYLLABLE LEE
+120D ETHIOPIC SYLLABLE LE
+120E ETHIOPIC SYLLABLE LO
+120F ETHIOPIC SYLLABLE LWA
+1210 ETHIOPIC SYLLABLE HHA
+1211 ETHIOPIC SYLLABLE HHU
+1212 ETHIOPIC SYLLABLE HHI
+1213 ETHIOPIC SYLLABLE HHAA
+1214 ETHIOPIC SYLLABLE HHEE
+1215 ETHIOPIC SYLLABLE HHE
+1216 ETHIOPIC SYLLABLE HHO
+1217 ETHIOPIC SYLLABLE HHWA
+1218 ETHIOPIC SYLLABLE MA
+1219 ETHIOPIC SYLLABLE MU
+121A ETHIOPIC SYLLABLE MI
+121B ETHIOPIC SYLLABLE MAA
+121C ETHIOPIC SYLLABLE MEE
+121D ETHIOPIC SYLLABLE ME
+121E ETHIOPIC SYLLABLE MO
+121F ETHIOPIC SYLLABLE MWA
+1220 ETHIOPIC SYLLABLE SZA
+1221 ETHIOPIC SYLLABLE SZU
+1222 ETHIOPIC SYLLABLE SZI
+1223 ETHIOPIC SYLLABLE SZAA
+1224 ETHIOPIC SYLLABLE SZEE
+1225 ETHIOPIC SYLLABLE SZE
+1226 ETHIOPIC SYLLABLE SZO
+1227 ETHIOPIC SYLLABLE SZWA
+1228 ETHIOPIC SYLLABLE RA
+1229 ETHIOPIC SYLLABLE RU
+122A ETHIOPIC SYLLABLE RI
+122B ETHIOPIC SYLLABLE RAA
+122C ETHIOPIC SYLLABLE REE
+122D ETHIOPIC SYLLABLE RE
+122E ETHIOPIC SYLLABLE RO
+122F ETHIOPIC SYLLABLE RWA
+1230 ETHIOPIC SYLLABLE SA
+1231 ETHIOPIC SYLLABLE SU
+1232 ETHIOPIC SYLLABLE SI
+1233 ETHIOPIC SYLLABLE SAA
+1234 ETHIOPIC SYLLABLE SEE
+1235 ETHIOPIC SYLLABLE SE
+1236 ETHIOPIC SYLLABLE SO
+1237 ETHIOPIC SYLLABLE SWA
+1238 ETHIOPIC SYLLABLE SHA
+1239 ETHIOPIC SYLLABLE SHU
+123A ETHIOPIC SYLLABLE SHI
+123B ETHIOPIC SYLLABLE SHAA
+123C ETHIOPIC SYLLABLE SHEE
+123D ETHIOPIC SYLLABLE SHE
+123E ETHIOPIC SYLLABLE SHO
+123F ETHIOPIC SYLLABLE SHWA
+1240 ETHIOPIC SYLLABLE QA
+1241 ETHIOPIC SYLLABLE QU
+1242 ETHIOPIC SYLLABLE QI
+1243 ETHIOPIC SYLLABLE QAA
+1244 ETHIOPIC SYLLABLE QEE
+1245 ETHIOPIC SYLLABLE QE
+1246 ETHIOPIC SYLLABLE QO
+1247 ETHIOPIC SYLLABLE QOA
+1248 ETHIOPIC SYLLABLE QWA
+124A ETHIOPIC SYLLABLE QWI
+124B ETHIOPIC SYLLABLE QWAA
+124C ETHIOPIC SYLLABLE QWEE
+124D ETHIOPIC SYLLABLE QWE
+1250 ETHIOPIC SYLLABLE QHA
+1251 ETHIOPIC SYLLABLE QHU
+1252 ETHIOPIC SYLLABLE QHI
+1253 ETHIOPIC SYLLABLE QHAA
+1254 ETHIOPIC SYLLABLE QHEE
+1255 ETHIOPIC SYLLABLE QHE
+1256 ETHIOPIC SYLLABLE QHO
+1258 ETHIOPIC SYLLABLE QHWA
+125A ETHIOPIC SYLLABLE QHWI
+125B ETHIOPIC SYLLABLE QHWAA
+125C ETHIOPIC SYLLABLE QHWEE
+125D ETHIOPIC SYLLABLE QHWE
+1260 ETHIOPIC SYLLABLE BA
+1261 ETHIOPIC SYLLABLE BU
+1262 ETHIOPIC SYLLABLE BI
+1263 ETHIOPIC SYLLABLE BAA
+1264 ETHIOPIC SYLLABLE BEE
+1265 ETHIOPIC SYLLABLE BE
+1266 ETHIOPIC SYLLABLE BO
+1267 ETHIOPIC SYLLABLE BWA
+1268 ETHIOPIC SYLLABLE VA
+1269 ETHIOPIC SYLLABLE VU
+126A ETHIOPIC SYLLABLE VI
+126B ETHIOPIC SYLLABLE VAA
+126C ETHIOPIC SYLLABLE VEE
+126D ETHIOPIC SYLLABLE VE
+126E ETHIOPIC SYLLABLE VO
+126F ETHIOPIC SYLLABLE VWA
+1270 ETHIOPIC SYLLABLE TA
+1271 ETHIOPIC SYLLABLE TU
+1272 ETHIOPIC SYLLABLE TI
+1273 ETHIOPIC SYLLABLE TAA
+1274 ETHIOPIC SYLLABLE TEE
+1275 ETHIOPIC SYLLABLE TE
+1276 ETHIOPIC SYLLABLE TO
+1277 ETHIOPIC SYLLABLE TWA
+1278 ETHIOPIC SYLLABLE CA
+1279 ETHIOPIC SYLLABLE CU
+127A ETHIOPIC SYLLABLE CI
+127B ETHIOPIC SYLLABLE CAA
+127C ETHIOPIC SYLLABLE CEE
+127D ETHIOPIC SYLLABLE CE
+127E ETHIOPIC SYLLABLE CO
+127F ETHIOPIC SYLLABLE CWA
+1280 ETHIOPIC SYLLABLE XA
+1281 ETHIOPIC SYLLABLE XU
+1282 ETHIOPIC SYLLABLE XI
+1283 ETHIOPIC SYLLABLE XAA
+1284 ETHIOPIC SYLLABLE XEE
+1285 ETHIOPIC SYLLABLE XE
+1286 ETHIOPIC SYLLABLE XO
+1287 ETHIOPIC SYLLABLE XOA
+1288 ETHIOPIC SYLLABLE XWA
+128A ETHIOPIC SYLLABLE XWI
+128B ETHIOPIC SYLLABLE XWAA
+128C ETHIOPIC SYLLABLE XWEE
+128D ETHIOPIC SYLLABLE XWE
+1290 ETHIOPIC SYLLABLE NA
+1291 ETHIOPIC SYLLABLE NU
+1292 ETHIOPIC SYLLABLE NI
+1293 ETHIOPIC SYLLABLE NAA
+1294 ETHIOPIC SYLLABLE NEE
+1295 ETHIOPIC SYLLABLE NE
+1296 ETHIOPIC SYLLABLE NO
+1297 ETHIOPIC SYLLABLE NWA
+1298 ETHIOPIC SYLLABLE NYA
+1299 ETHIOPIC SYLLABLE NYU
+129A ETHIOPIC SYLLABLE NYI
+129B ETHIOPIC SYLLABLE NYAA
+129C ETHIOPIC SYLLABLE NYEE
+129D ETHIOPIC SYLLABLE NYE
+129E ETHIOPIC SYLLABLE NYO
+129F ETHIOPIC SYLLABLE NYWA
+12A0 ETHIOPIC SYLLABLE GLOTTAL A
+12A1 ETHIOPIC SYLLABLE GLOTTAL U
+12A2 ETHIOPIC SYLLABLE GLOTTAL I
+12A3 ETHIOPIC SYLLABLE GLOTTAL AA
+12A4 ETHIOPIC SYLLABLE GLOTTAL EE
+12A5 ETHIOPIC SYLLABLE GLOTTAL E
+12A6 ETHIOPIC SYLLABLE GLOTTAL O
+12A7 ETHIOPIC SYLLABLE GLOTTAL WA
+12A8 ETHIOPIC SYLLABLE KA
+12A9 ETHIOPIC SYLLABLE KU
+12AA ETHIOPIC SYLLABLE KI
+12AB ETHIOPIC SYLLABLE KAA
+12AC ETHIOPIC SYLLABLE KEE
+12AD ETHIOPIC SYLLABLE KE
+12AE ETHIOPIC SYLLABLE KO
+12AF ETHIOPIC SYLLABLE KOA
+12B0 ETHIOPIC SYLLABLE KWA
+12B2 ETHIOPIC SYLLABLE KWI
+12B3 ETHIOPIC SYLLABLE KWAA
+12B4 ETHIOPIC SYLLABLE KWEE
+12B5 ETHIOPIC SYLLABLE KWE
+12B8 ETHIOPIC SYLLABLE KXA
+12B9 ETHIOPIC SYLLABLE KXU
+12BA ETHIOPIC SYLLABLE KXI
+12BB ETHIOPIC SYLLABLE KXAA
+12BC ETHIOPIC SYLLABLE KXEE
+12BD ETHIOPIC SYLLABLE KXE
+12BE ETHIOPIC SYLLABLE KXO
+12C0 ETHIOPIC SYLLABLE KXWA
+12C2 ETHIOPIC SYLLABLE KXWI
+12C3 ETHIOPIC SYLLABLE KXWAA
+12C4 ETHIOPIC SYLLABLE KXWEE
+12C5 ETHIOPIC SYLLABLE KXWE
+12C8 ETHIOPIC SYLLABLE WA
+12C9 ETHIOPIC SYLLABLE WU
+12CA ETHIOPIC SYLLABLE WI
+12CB ETHIOPIC SYLLABLE WAA
+12CC ETHIOPIC SYLLABLE WEE
+12CD ETHIOPIC SYLLABLE WE
+12CE ETHIOPIC SYLLABLE WO
+12CF ETHIOPIC SYLLABLE WOA
+12D0 ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1 ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2 ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3 ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4 ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5 ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6 ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8 ETHIOPIC SYLLABLE ZA
+12D9 ETHIOPIC SYLLABLE ZU
+12DA ETHIOPIC SYLLABLE ZI
+12DB ETHIOPIC SYLLABLE ZAA
+12DC ETHIOPIC SYLLABLE ZEE
+12DD ETHIOPIC SYLLABLE ZE
+12DE ETHIOPIC SYLLABLE ZO
+12DF ETHIOPIC SYLLABLE ZWA
+12E0 ETHIOPIC SYLLABLE ZHA
+12E1 ETHIOPIC SYLLABLE ZHU
+12E2 ETHIOPIC SYLLABLE ZHI
+12E3 ETHIOPIC SYLLABLE ZHAA
+12E4 ETHIOPIC SYLLABLE ZHEE
+12E5 ETHIOPIC SYLLABLE ZHE
+12E6 ETHIOPIC SYLLABLE ZHO
+12E7 ETHIOPIC SYLLABLE ZHWA
+12E8 ETHIOPIC SYLLABLE YA
+12E9 ETHIOPIC SYLLABLE YU
+12EA ETHIOPIC SYLLABLE YI
+12EB ETHIOPIC SYLLABLE YAA
+12EC ETHIOPIC SYLLABLE YEE
+12ED ETHIOPIC SYLLABLE YE
+12EE ETHIOPIC SYLLABLE YO
+12EF ETHIOPIC SYLLABLE YOA
+12F0 ETHIOPIC SYLLABLE DA
+12F1 ETHIOPIC SYLLABLE DU
+12F2 ETHIOPIC SYLLABLE DI
+12F3 ETHIOPIC SYLLABLE DAA
+12F4 ETHIOPIC SYLLABLE DEE
+12F5 ETHIOPIC SYLLABLE DE
+12F6 ETHIOPIC SYLLABLE DO
+12F7 ETHIOPIC SYLLABLE DWA
+12F8 ETHIOPIC SYLLABLE DDA
+12F9 ETHIOPIC SYLLABLE DDU
+12FA ETHIOPIC SYLLABLE DDI
+12FB ETHIOPIC SYLLABLE DDAA
+12FC ETHIOPIC SYLLABLE DDEE
+12FD ETHIOPIC SYLLABLE DDE
+12FE ETHIOPIC SYLLABLE DDO
+12FF ETHIOPIC SYLLABLE DDWA
+1300 ETHIOPIC SYLLABLE JA
+1301 ETHIOPIC SYLLABLE JU
+1302 ETHIOPIC SYLLABLE JI
+1303 ETHIOPIC SYLLABLE JAA
+1304 ETHIOPIC SYLLABLE JEE
+1305 ETHIOPIC SYLLABLE JE
+1306 ETHIOPIC SYLLABLE JO
+1307 ETHIOPIC SYLLABLE JWA
+1308 ETHIOPIC SYLLABLE GA
+1309 ETHIOPIC SYLLABLE GU
+130A ETHIOPIC SYLLABLE GI
+130B ETHIOPIC SYLLABLE GAA
+130C ETHIOPIC SYLLABLE GEE
+130D ETHIOPIC SYLLABLE GE
+130E ETHIOPIC SYLLABLE GO
+130F ETHIOPIC SYLLABLE GOA
+1310 ETHIOPIC SYLLABLE GWA
+1312 ETHIOPIC SYLLABLE GWI
+1313 ETHIOPIC SYLLABLE GWAA
+1314 ETHIOPIC SYLLABLE GWEE
+1315 ETHIOPIC SYLLABLE GWE
+1318 ETHIOPIC SYLLABLE GGA
+1319 ETHIOPIC SYLLABLE GGU
+131A ETHIOPIC SYLLABLE GGI
+131B ETHIOPIC SYLLABLE GGAA
+131C ETHIOPIC SYLLABLE GGEE
+131D ETHIOPIC SYLLABLE GGE
+131E ETHIOPIC SYLLABLE GGO
+131F ETHIOPIC SYLLABLE GGWAA
+1320 ETHIOPIC SYLLABLE THA
+1321 ETHIOPIC SYLLABLE THU
+1322 ETHIOPIC SYLLABLE THI
+1323 ETHIOPIC SYLLABLE THAA
+1324 ETHIOPIC SYLLABLE THEE
+1325 ETHIOPIC SYLLABLE THE
+1326 ETHIOPIC SYLLABLE THO
+1327 ETHIOPIC SYLLABLE THWA
+1328 ETHIOPIC SYLLABLE CHA
+1329 ETHIOPIC SYLLABLE CHU
+132A ETHIOPIC SYLLABLE CHI
+132B ETHIOPIC SYLLABLE CHAA
+132C ETHIOPIC SYLLABLE CHEE
+132D ETHIOPIC SYLLABLE CHE
+132E ETHIOPIC SYLLABLE CHO
+132F ETHIOPIC SYLLABLE CHWA
+1330 ETHIOPIC SYLLABLE PHA
+1331 ETHIOPIC SYLLABLE PHU
+1332 ETHIOPIC SYLLABLE PHI
+1333 ETHIOPIC SYLLABLE PHAA
+1334 ETHIOPIC SYLLABLE PHEE
+1335 ETHIOPIC SYLLABLE PHE
+1336 ETHIOPIC SYLLABLE PHO
+1337 ETHIOPIC SYLLABLE PHWA
+1338 ETHIOPIC SYLLABLE TSA
+1339 ETHIOPIC SYLLABLE TSU
+133A ETHIOPIC SYLLABLE TSI
+133B ETHIOPIC SYLLABLE TSAA
+133C ETHIOPIC SYLLABLE TSEE
+133D ETHIOPIC SYLLABLE TSE
+133E ETHIOPIC SYLLABLE TSO
+133F ETHIOPIC SYLLABLE TSWA
+1340 ETHIOPIC SYLLABLE TZA
+1341 ETHIOPIC SYLLABLE TZU
+1342 ETHIOPIC SYLLABLE TZI
+1343 ETHIOPIC SYLLABLE TZAA
+1344 ETHIOPIC SYLLABLE TZEE
+1345 ETHIOPIC SYLLABLE TZE
+1346 ETHIOPIC SYLLABLE TZO
+1347 ETHIOPIC SYLLABLE TZOA
+1348 ETHIOPIC SYLLABLE FA
+1349 ETHIOPIC SYLLABLE FU
+134A ETHIOPIC SYLLABLE FI
+134B ETHIOPIC SYLLABLE FAA
+134C ETHIOPIC SYLLABLE FEE
+134D ETHIOPIC SYLLABLE FE
+134E ETHIOPIC SYLLABLE FO
+134F ETHIOPIC SYLLABLE FWA
+1350 ETHIOPIC SYLLABLE PA
+1351 ETHIOPIC SYLLABLE PU
+1352 ETHIOPIC SYLLABLE PI
+1353 ETHIOPIC SYLLABLE PAA
+1354 ETHIOPIC SYLLABLE PEE
+1355 ETHIOPIC SYLLABLE PE
+1356 ETHIOPIC SYLLABLE PO
+1357 ETHIOPIC SYLLABLE PWA
+1358 ETHIOPIC SYLLABLE RYA
+1359 ETHIOPIC SYLLABLE MYA
+135A ETHIOPIC SYLLABLE FYA
+@ Combining mark
+135F ETHIOPIC COMBINING GEMINATION MARK
+@ Punctuation
+1360 ETHIOPIC SECTION MARK
+1361 ETHIOPIC WORDSPACE
+1362 ETHIOPIC FULL STOP
+1363 ETHIOPIC COMMA
+1364 ETHIOPIC SEMICOLON
+1365 ETHIOPIC COLON
+1366 ETHIOPIC PREFACE COLON
+1367 ETHIOPIC QUESTION MARK
+1368 ETHIOPIC PARAGRAPH SEPARATOR
+@ Digits
+1369 ETHIOPIC DIGIT ONE
+136A ETHIOPIC DIGIT TWO
+136B ETHIOPIC DIGIT THREE
+136C ETHIOPIC DIGIT FOUR
+136D ETHIOPIC DIGIT FIVE
+136E ETHIOPIC DIGIT SIX
+136F ETHIOPIC DIGIT SEVEN
+1370 ETHIOPIC DIGIT EIGHT
+1371 ETHIOPIC DIGIT NINE
+@ Numbers
+1372 ETHIOPIC NUMBER TEN
+1373 ETHIOPIC NUMBER TWENTY
+1374 ETHIOPIC NUMBER THIRTY
+1375 ETHIOPIC NUMBER FORTY
+1376 ETHIOPIC NUMBER FIFTY
+1377 ETHIOPIC NUMBER SIXTY
+1378 ETHIOPIC NUMBER SEVENTY
+1379 ETHIOPIC NUMBER EIGHTY
+137A ETHIOPIC NUMBER NINETY
+137B ETHIOPIC NUMBER HUNDRED
+137C ETHIOPIC NUMBER TEN THOUSAND
+@@ 1380 Ethiopic Supplement 139F
+@ Syllables for Sebatbeit
+1380 ETHIOPIC SYLLABLE SEBATBEIT MWA
+1381 ETHIOPIC SYLLABLE MWI
+1382 ETHIOPIC SYLLABLE MWEE
+1383 ETHIOPIC SYLLABLE MWE
+1384 ETHIOPIC SYLLABLE SEBATBEIT BWA
+1385 ETHIOPIC SYLLABLE BWI
+1386 ETHIOPIC SYLLABLE BWEE
+1387 ETHIOPIC SYLLABLE BWE
+1388 ETHIOPIC SYLLABLE SEBATBEIT FWA
+1389 ETHIOPIC SYLLABLE FWI
+138A ETHIOPIC SYLLABLE FWEE
+138B ETHIOPIC SYLLABLE FWE
+138C ETHIOPIC SYLLABLE SEBATBEIT PWA
+138D ETHIOPIC SYLLABLE PWI
+138E ETHIOPIC SYLLABLE PWEE
+138F ETHIOPIC SYLLABLE PWE
+@ Tonal marks
+@+ Intended for use with a multiline scored layout
+1390 ETHIOPIC TONAL MARK YIZET
+1391 ETHIOPIC TONAL MARK DERET
+1392 ETHIOPIC TONAL MARK RIKRIK
+1393 ETHIOPIC TONAL MARK SHORT RIKRIK
+1394 ETHIOPIC TONAL MARK DIFAT
+1395 ETHIOPIC TONAL MARK KENAT
+1396 ETHIOPIC TONAL MARK CHIRET
+1397 ETHIOPIC TONAL MARK HIDET
+1398 ETHIOPIC TONAL MARK DERET-HIDET
+1399 ETHIOPIC TONAL MARK KURT
+@@ 13A0 Cherokee 13FF
+@ Syllables
+13A0 CHEROKEE LETTER A
+13A1 CHEROKEE LETTER E
+13A2 CHEROKEE LETTER I
+13A3 CHEROKEE LETTER O
+13A4 CHEROKEE LETTER U
+13A5 CHEROKEE LETTER V
+13A6 CHEROKEE LETTER GA
+13A7 CHEROKEE LETTER KA
+13A8 CHEROKEE LETTER GE
+13A9 CHEROKEE LETTER GI
+13AA CHEROKEE LETTER GO
+13AB CHEROKEE LETTER GU
+13AC CHEROKEE LETTER GV
+13AD CHEROKEE LETTER HA
+13AE CHEROKEE LETTER HE
+13AF CHEROKEE LETTER HI
+13B0 CHEROKEE LETTER HO
+13B1 CHEROKEE LETTER HU
+13B2 CHEROKEE LETTER HV
+13B3 CHEROKEE LETTER LA
+13B4 CHEROKEE LETTER LE
+13B5 CHEROKEE LETTER LI
+13B6 CHEROKEE LETTER LO
+13B7 CHEROKEE LETTER LU
+13B8 CHEROKEE LETTER LV
+13B9 CHEROKEE LETTER MA
+13BA CHEROKEE LETTER ME
+13BB CHEROKEE LETTER MI
+13BC CHEROKEE LETTER MO
+13BD CHEROKEE LETTER MU
+13BE CHEROKEE LETTER NA
+13BF CHEROKEE LETTER HNA
+13C0 CHEROKEE LETTER NAH
+13C1 CHEROKEE LETTER NE
+13C2 CHEROKEE LETTER NI
+13C3 CHEROKEE LETTER NO
+13C4 CHEROKEE LETTER NU
+13C5 CHEROKEE LETTER NV
+13C6 CHEROKEE LETTER QUA
+13C7 CHEROKEE LETTER QUE
+13C8 CHEROKEE LETTER QUI
+13C9 CHEROKEE LETTER QUO
+13CA CHEROKEE LETTER QUU
+13CB CHEROKEE LETTER QUV
+13CC CHEROKEE LETTER SA
+13CD CHEROKEE LETTER S
+13CE CHEROKEE LETTER SE
+13CF CHEROKEE LETTER SI
+13D0 CHEROKEE LETTER SO
+13D1 CHEROKEE LETTER SU
+13D2 CHEROKEE LETTER SV
+13D3 CHEROKEE LETTER DA
+13D4 CHEROKEE LETTER TA
+13D5 CHEROKEE LETTER DE
+13D6 CHEROKEE LETTER TE
+13D7 CHEROKEE LETTER DI
+13D8 CHEROKEE LETTER TI
+13D9 CHEROKEE LETTER DO
+13DA CHEROKEE LETTER DU
+13DB CHEROKEE LETTER DV
+13DC CHEROKEE LETTER DLA
+13DD CHEROKEE LETTER TLA
+13DE CHEROKEE LETTER TLE
+13DF CHEROKEE LETTER TLI
+13E0 CHEROKEE LETTER TLO
+13E1 CHEROKEE LETTER TLU
+13E2 CHEROKEE LETTER TLV
+13E3 CHEROKEE LETTER TSA
+13E4 CHEROKEE LETTER TSE
+13E5 CHEROKEE LETTER TSI
+13E6 CHEROKEE LETTER TSO
+13E7 CHEROKEE LETTER TSU
+13E8 CHEROKEE LETTER TSV
+13E9 CHEROKEE LETTER WA
+13EA CHEROKEE LETTER WE
+13EB CHEROKEE LETTER WI
+13EC CHEROKEE LETTER WO
+13ED CHEROKEE LETTER WU
+13EE CHEROKEE LETTER WV
+13EF CHEROKEE LETTER YA
+13F0 CHEROKEE LETTER YE
+13F1 CHEROKEE LETTER YI
+13F2 CHEROKEE LETTER YO
+13F3 CHEROKEE LETTER YU
+13F4 CHEROKEE LETTER YV
+@@ 1400 Unified Canadian Aboriginal Syllabics 167F
+@ Syllables
+1401 CANADIAN SYLLABICS E
+ * Inuktitut (AI), Carrier (U)
+1402 CANADIAN SYLLABICS AAI
+ * Inuktitut
+1403 CANADIAN SYLLABICS I
+ * Carrier (O)
+1404 CANADIAN SYLLABICS II
+1405 CANADIAN SYLLABICS O
+ * Inuktitut (U), Carrier (E)
+1406 CANADIAN SYLLABICS OO
+ * Inuktitut (UU)
+1407 CANADIAN SYLLABICS Y-CREE OO
+1408 CANADIAN SYLLABICS CARRIER EE
+1409 CANADIAN SYLLABICS CARRIER I
+140A CANADIAN SYLLABICS A
+140B CANADIAN SYLLABICS AA
+140C CANADIAN SYLLABICS WE
+140D CANADIAN SYLLABICS WEST-CREE WE
+140E CANADIAN SYLLABICS WI
+140F CANADIAN SYLLABICS WEST-CREE WI
+1410 CANADIAN SYLLABICS WII
+1411 CANADIAN SYLLABICS WEST-CREE WII
+1412 CANADIAN SYLLABICS WO
+1413 CANADIAN SYLLABICS WEST-CREE WO
+1414 CANADIAN SYLLABICS WOO
+1415 CANADIAN SYLLABICS WEST-CREE WOO
+1416 CANADIAN SYLLABICS NASKAPI WOO
+1417 CANADIAN SYLLABICS WA
+1418 CANADIAN SYLLABICS WEST-CREE WA
+1419 CANADIAN SYLLABICS WAA
+141A CANADIAN SYLLABICS WEST-CREE WAA
+141B CANADIAN SYLLABICS NASKAPI WAA
+141C CANADIAN SYLLABICS AI
+ * East Cree
+141D CANADIAN SYLLABICS Y-CREE W
+141E CANADIAN SYLLABICS GLOTTAL STOP
+ * Moose Cree (Y), Algonquian (GLOTTAL STOP)
+141F CANADIAN SYLLABICS FINAL ACUTE
+ * West Cree (T), East Cree (Y), Inuktitut (GLOTTAL STOP)
+ * Athapascan (B/P), Sayisi (I), Carrier (G)
+1420 CANADIAN SYLLABICS FINAL GRAVE
+ * West Cree (K), Athapascan (K), Carrier (KH)
+1421 CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+ * N Cree (SH), Sayisi (R), Carrier (NG)
+1422 CANADIAN SYLLABICS FINAL TOP HALF RING
+ * Algonquian (S), Chipewyan (R), Sayisi (S)
+1423 CANADIAN SYLLABICS FINAL RIGHT HALF RING
+ * West Cree (N), Athapascan (D/T), Sayisi (N), Carrier (N)
+1424 CANADIAN SYLLABICS FINAL RING
+ * West Cree (W), Sayisi (O)
+1425 CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+ * Chipewyan (TT), South Slavey (GH)
+1426 CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+ * Algonquian (H), Carrier (R)
+1427 CANADIAN SYLLABICS FINAL MIDDLE DOT
+ * Moose Cree (W), Athapascan (Y), Sayisi (YU)
+1428 CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+ * West Cree (C), Sayisi (D)
+1429 CANADIAN SYLLABICS FINAL PLUS
+ * Athapascan (N), Sayisi (AI)
+142A CANADIAN SYLLABICS FINAL DOWN TACK
+ * N Cree (L), Carrier (D)
+ x (down tack - 22A4)
+142B CANADIAN SYLLABICS EN
+142C CANADIAN SYLLABICS IN
+142D CANADIAN SYLLABICS ON
+142E CANADIAN SYLLABICS AN
+142F CANADIAN SYLLABICS PE
+ * Inuktitut (PAI), Athapascan (BE), Carrier (HU)
+1430 CANADIAN SYLLABICS PAAI
+ * Inuktitut
+1431 CANADIAN SYLLABICS PI
+1432 CANADIAN SYLLABICS PII
+1433 CANADIAN SYLLABICS PO
+ * Inuktitut (PU), Athapascan (BO), Carrier (HE)
+1434 CANADIAN SYLLABICS POO
+ * Inuktitut (PUU)
+1435 CANADIAN SYLLABICS Y-CREE POO
+1436 CANADIAN SYLLABICS CARRIER HEE
+1437 CANADIAN SYLLABICS CARRIER HI
+1438 CANADIAN SYLLABICS PA
+ * Athapascan (BA), Carrier (HA)
+1439 CANADIAN SYLLABICS PAA
+143A CANADIAN SYLLABICS PWE
+143B CANADIAN SYLLABICS WEST-CREE PWE
+143C CANADIAN SYLLABICS PWI
+143D CANADIAN SYLLABICS WEST-CREE PWI
+143E CANADIAN SYLLABICS PWII
+143F CANADIAN SYLLABICS WEST-CREE PWII
+1440 CANADIAN SYLLABICS PWO
+1441 CANADIAN SYLLABICS WEST-CREE PWO
+1442 CANADIAN SYLLABICS PWOO
+1443 CANADIAN SYLLABICS WEST-CREE PWOO
+1444 CANADIAN SYLLABICS PWA
+1445 CANADIAN SYLLABICS WEST-CREE PWA
+1446 CANADIAN SYLLABICS PWAA
+1447 CANADIAN SYLLABICS WEST-CREE PWAA
+1448 CANADIAN SYLLABICS Y-CREE PWAA
+1449 CANADIAN SYLLABICS P
+144A CANADIAN SYLLABICS WEST-CREE P
+ * Sayisi (G)
+144B CANADIAN SYLLABICS CARRIER H
+144C CANADIAN SYLLABICS TE
+ * Inuktitut (TAI), Athapascan (DI), Carrier (DU)
+144D CANADIAN SYLLABICS TAAI
+ * Inuktitut
+144E CANADIAN SYLLABICS TI
+ * Athapascan (DE), Carrier (DO)
+144F CANADIAN SYLLABICS TII
+1450 CANADIAN SYLLABICS TO
+ * Inuktitut (TU), Athapascan (DO), Carrier (DE), Sayisi (DU)
+1451 CANADIAN SYLLABICS TOO
+ * Inuktitut (TUU)
+1452 CANADIAN SYLLABICS Y-CREE TOO
+1453 CANADIAN SYLLABICS CARRIER DEE
+1454 CANADIAN SYLLABICS CARRIER DI
+1455 CANADIAN SYLLABICS TA
+ * Athapascan (DA)
+1456 CANADIAN SYLLABICS TAA
+1457 CANADIAN SYLLABICS TWE
+1458 CANADIAN SYLLABICS WEST-CREE TWE
+1459 CANADIAN SYLLABICS TWI
+145A CANADIAN SYLLABICS WEST-CREE TWI
+145B CANADIAN SYLLABICS TWII
+145C CANADIAN SYLLABICS WEST-CREE TWII
+145D CANADIAN SYLLABICS TWO
+145E CANADIAN SYLLABICS WEST-CREE TWO
+145F CANADIAN SYLLABICS TWOO
+1460 CANADIAN SYLLABICS WEST-CREE TWOO
+1461 CANADIAN SYLLABICS TWA
+1462 CANADIAN SYLLABICS WEST-CREE TWA
+1463 CANADIAN SYLLABICS TWAA
+1464 CANADIAN SYLLABICS WEST-CREE TWAA
+1465 CANADIAN SYLLABICS NASKAPI TWAA
+1466 CANADIAN SYLLABICS T
+1467 CANADIAN SYLLABICS TTE
+ * South Slavey (DEH)
+1468 CANADIAN SYLLABICS TTI
+ * South Slavey (DIH)
+1469 CANADIAN SYLLABICS TTO
+ * South Slavey (DOH)
+146A CANADIAN SYLLABICS TTA
+ * South Slavey (DAH)
+146B CANADIAN SYLLABICS KE
+ * Inuktitut (KAI)
+146C CANADIAN SYLLABICS KAAI
+ * Inuktitut
+146D CANADIAN SYLLABICS KI
+146E CANADIAN SYLLABICS KII
+146F CANADIAN SYLLABICS KO
+ * Inuktitut (KU), Sayisi (KU)
+1470 CANADIAN SYLLABICS KOO
+ * Inuktitut (KUU)
+1471 CANADIAN SYLLABICS Y-CREE KOO
+1472 CANADIAN SYLLABICS KA
+1473 CANADIAN SYLLABICS KAA
+1474 CANADIAN SYLLABICS KWE
+1475 CANADIAN SYLLABICS WEST-CREE KWE
+1476 CANADIAN SYLLABICS KWI
+1477 CANADIAN SYLLABICS WEST-CREE KWI
+1478 CANADIAN SYLLABICS KWII
+1479 CANADIAN SYLLABICS WEST-CREE KWII
+147A CANADIAN SYLLABICS KWO
+147B CANADIAN SYLLABICS WEST-CREE KWO
+147C CANADIAN SYLLABICS KWOO
+147D CANADIAN SYLLABICS WEST-CREE KWOO
+147E CANADIAN SYLLABICS KWA
+147F CANADIAN SYLLABICS WEST-CREE KWA
+1480 CANADIAN SYLLABICS KWAA
+1481 CANADIAN SYLLABICS WEST-CREE KWAA
+1482 CANADIAN SYLLABICS NASKAPI KWAA
+1483 CANADIAN SYLLABICS K
+1484 CANADIAN SYLLABICS KW
+ * East Cree
+1485 CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486 CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487 CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488 CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489 CANADIAN SYLLABICS CE
+ * Inuktitut (GAI), Athapascan (DHE), Sayisi (THE)
+148A CANADIAN SYLLABICS CAAI
+ * Inuktitut (GAAI)
+148B CANADIAN SYLLABICS CI
+ * Inuktitut (GI), Athapascan (DHI), Sayisi (THI)
+148C CANADIAN SYLLABICS CII
+ * Inuktitut (GII)
+148D CANADIAN SYLLABICS CO
+ * Inuktitut (GU), Athapascan (DHO), Sayisi (THO)
+148E CANADIAN SYLLABICS COO
+ * Inuktitut (GUU)
+148F CANADIAN SYLLABICS Y-CREE COO
+1490 CANADIAN SYLLABICS CA
+ * Inuktitut (GA), Athapascan (DHA), Sayisi (THA)
+1491 CANADIAN SYLLABICS CAA
+ * Inuktitut (GAA)
+1492 CANADIAN SYLLABICS CWE
+1493 CANADIAN SYLLABICS WEST-CREE CWE
+1494 CANADIAN SYLLABICS CWI
+1495 CANADIAN SYLLABICS WEST-CREE CWI
+1496 CANADIAN SYLLABICS CWII
+1497 CANADIAN SYLLABICS WEST-CREE CWII
+1498 CANADIAN SYLLABICS CWO
+1499 CANADIAN SYLLABICS WEST-CREE CWO
+149A CANADIAN SYLLABICS CWOO
+149B CANADIAN SYLLABICS WEST-CREE CWOO
+149C CANADIAN SYLLABICS CWA
+149D CANADIAN SYLLABICS WEST-CREE CWA
+149E CANADIAN SYLLABICS CWAA
+149F CANADIAN SYLLABICS WEST-CREE CWAA
+14A0 CANADIAN SYLLABICS NASKAPI CWAA
+14A1 CANADIAN SYLLABICS C
+ * Inuktitut (G), Sayisi (T)
+14A2 CANADIAN SYLLABICS SAYISI TH
+ * Athapascan (DH)
+14A3 CANADIAN SYLLABICS ME
+ * Inuktitut (MAI)
+14A4 CANADIAN SYLLABICS MAAI
+ * Inuktitut
+14A5 CANADIAN SYLLABICS MI
+14A6 CANADIAN SYLLABICS MII
+14A7 CANADIAN SYLLABICS MO
+ * Inuktitut (MU), Sayisi (MU)
+14A8 CANADIAN SYLLABICS MOO
+ * Inuktitut (MUU)
+14A9 CANADIAN SYLLABICS Y-CREE MOO
+14AA CANADIAN SYLLABICS MA
+14AB CANADIAN SYLLABICS MAA
+14AC CANADIAN SYLLABICS MWE
+14AD CANADIAN SYLLABICS WEST-CREE MWE
+14AE CANADIAN SYLLABICS MWI
+14AF CANADIAN SYLLABICS WEST-CREE MWI
+14B0 CANADIAN SYLLABICS MWII
+14B1 CANADIAN SYLLABICS WEST-CREE MWII
+14B2 CANADIAN SYLLABICS MWO
+14B3 CANADIAN SYLLABICS WEST-CREE MWO
+14B4 CANADIAN SYLLABICS MWOO
+14B5 CANADIAN SYLLABICS WEST-CREE MWOO
+14B6 CANADIAN SYLLABICS MWA
+14B7 CANADIAN SYLLABICS WEST-CREE MWA
+14B8 CANADIAN SYLLABICS MWAA
+14B9 CANADIAN SYLLABICS WEST-CREE MWAA
+14BA CANADIAN SYLLABICS NASKAPI MWAA
+14BB CANADIAN SYLLABICS M
+14BC CANADIAN SYLLABICS WEST-CREE M
+ * Carrier (M)
+14BD CANADIAN SYLLABICS MH
+14BE CANADIAN SYLLABICS ATHAPASCAN M
+14BF CANADIAN SYLLABICS SAYISI M
+14C0 CANADIAN SYLLABICS NE
+ * Inuktitut (NAI)
+14C1 CANADIAN SYLLABICS NAAI
+ * Inuktitut
+14C2 CANADIAN SYLLABICS NI
+14C3 CANADIAN SYLLABICS NII
+14C4 CANADIAN SYLLABICS NO
+ * Inuktitut (NU), Sayisi (NU)
+14C5 CANADIAN SYLLABICS NOO
+ * Inuktitut (NUU)
+14C6 CANADIAN SYLLABICS Y-CREE NOO
+14C7 CANADIAN SYLLABICS NA
+14C8 CANADIAN SYLLABICS NAA
+14C9 CANADIAN SYLLABICS NWE
+14CA CANADIAN SYLLABICS WEST-CREE NWE
+14CB CANADIAN SYLLABICS NWA
+14CC CANADIAN SYLLABICS WEST-CREE NWA
+14CD CANADIAN SYLLABICS NWAA
+14CE CANADIAN SYLLABICS WEST-CREE NWAA
+14CF CANADIAN SYLLABICS NASKAPI NWAA
+14D0 CANADIAN SYLLABICS N
+14D1 CANADIAN SYLLABICS CARRIER NG
+14D2 CANADIAN SYLLABICS NH
+14D3 CANADIAN SYLLABICS LE
+ * Inuktitut (LAI)
+14D4 CANADIAN SYLLABICS LAAI
+ * Inuktitut
+14D5 CANADIAN SYLLABICS LI
+14D6 CANADIAN SYLLABICS LII
+14D7 CANADIAN SYLLABICS LO
+ * Inuktitut (LU)
+14D8 CANADIAN SYLLABICS LOO
+ * Inuktitut (LUU)
+14D9 CANADIAN SYLLABICS Y-CREE LOO
+14DA CANADIAN SYLLABICS LA
+14DB CANADIAN SYLLABICS LAA
+14DC CANADIAN SYLLABICS LWE
+14DD CANADIAN SYLLABICS WEST-CREE LWE
+14DE CANADIAN SYLLABICS LWI
+14DF CANADIAN SYLLABICS WEST-CREE LWI
+14E0 CANADIAN SYLLABICS LWII
+14E1 CANADIAN SYLLABICS WEST-CREE LWII
+14E2 CANADIAN SYLLABICS LWO
+14E3 CANADIAN SYLLABICS WEST-CREE LWO
+14E4 CANADIAN SYLLABICS LWOO
+14E5 CANADIAN SYLLABICS WEST-CREE LWOO
+14E6 CANADIAN SYLLABICS LWA
+14E7 CANADIAN SYLLABICS WEST-CREE LWA
+14E8 CANADIAN SYLLABICS LWAA
+14E9 CANADIAN SYLLABICS WEST-CREE LWAA
+14EA CANADIAN SYLLABICS L
+14EB CANADIAN SYLLABICS WEST-CREE L
+14EC CANADIAN SYLLABICS MEDIAL L
+14ED CANADIAN SYLLABICS SE
+ * Inuktitut (SAI)
+14EE CANADIAN SYLLABICS SAAI
+ * Inuktitut
+14EF CANADIAN SYLLABICS SI
+14F0 CANADIAN SYLLABICS SII
+14F1 CANADIAN SYLLABICS SO
+ * Inuktitut (SU), Sayisi (SU)
+14F2 CANADIAN SYLLABICS SOO
+ * Inuktitut (SUU)
+14F3 CANADIAN SYLLABICS Y-CREE SOO
+14F4 CANADIAN SYLLABICS SA
+14F5 CANADIAN SYLLABICS SAA
+14F6 CANADIAN SYLLABICS SWE
+14F7 CANADIAN SYLLABICS WEST-CREE SWE
+14F8 CANADIAN SYLLABICS SWI
+14F9 CANADIAN SYLLABICS WEST-CREE SWI
+14FA CANADIAN SYLLABICS SWII
+14FB CANADIAN SYLLABICS WEST-CREE SWII
+14FC CANADIAN SYLLABICS SWO
+14FD CANADIAN SYLLABICS WEST-CREE SWO
+14FE CANADIAN SYLLABICS SWOO
+14FF CANADIAN SYLLABICS WEST-CREE SWOO
+1500 CANADIAN SYLLABICS SWA
+1501 CANADIAN SYLLABICS WEST-CREE SWA
+1502 CANADIAN SYLLABICS SWAA
+1503 CANADIAN SYLLABICS WEST-CREE SWAA
+1504 CANADIAN SYLLABICS NASKAPI SWAA
+1505 CANADIAN SYLLABICS S
+1506 CANADIAN SYLLABICS ATHAPASCAN S
+1507 CANADIAN SYLLABICS SW
+1508 CANADIAN SYLLABICS BLACKFOOT S
+1509 CANADIAN SYLLABICS MOOSE-CREE SK
+150A CANADIAN SYLLABICS NASKAPI SKW
+150B CANADIAN SYLLABICS NASKAPI S-W
+150C CANADIAN SYLLABICS NASKAPI SPWA
+150D CANADIAN SYLLABICS NASKAPI STWA
+150E CANADIAN SYLLABICS NASKAPI SKWA
+150F CANADIAN SYLLABICS NASKAPI SCWA
+1510 CANADIAN SYLLABICS SHE
+1511 CANADIAN SYLLABICS SHI
+1512 CANADIAN SYLLABICS SHII
+1513 CANADIAN SYLLABICS SHO
+1514 CANADIAN SYLLABICS SHOO
+1515 CANADIAN SYLLABICS SHA
+1516 CANADIAN SYLLABICS SHAA
+1517 CANADIAN SYLLABICS SHWE
+1518 CANADIAN SYLLABICS WEST-CREE SHWE
+1519 CANADIAN SYLLABICS SHWI
+151A CANADIAN SYLLABICS WEST-CREE SHWI
+151B CANADIAN SYLLABICS SHWII
+151C CANADIAN SYLLABICS WEST-CREE SHWII
+151D CANADIAN SYLLABICS SHWO
+151E CANADIAN SYLLABICS WEST-CREE SHWO
+151F CANADIAN SYLLABICS SHWOO
+1520 CANADIAN SYLLABICS WEST-CREE SHWOO
+1521 CANADIAN SYLLABICS SHWA
+1522 CANADIAN SYLLABICS WEST-CREE SHWA
+1523 CANADIAN SYLLABICS SHWAA
+1524 CANADIAN SYLLABICS WEST-CREE SHWAA
+1525 CANADIAN SYLLABICS SH
+1526 CANADIAN SYLLABICS YE
+ * Inuktitut (YAI)
+1527 CANADIAN SYLLABICS YAAI
+ * Inuktitut
+1528 CANADIAN SYLLABICS YI
+1529 CANADIAN SYLLABICS YII
+152A CANADIAN SYLLABICS YO
+ * Inuktitut (YU)
+152B CANADIAN SYLLABICS YOO
+ * Inuktitut (YUU)
+152C CANADIAN SYLLABICS Y-CREE YOO
+152D CANADIAN SYLLABICS YA
+152E CANADIAN SYLLABICS YAA
+152F CANADIAN SYLLABICS YWE
+1530 CANADIAN SYLLABICS WEST-CREE YWE
+1531 CANADIAN SYLLABICS YWI
+1532 CANADIAN SYLLABICS WEST-CREE YWI
+1533 CANADIAN SYLLABICS YWII
+1534 CANADIAN SYLLABICS WEST-CREE YWII
+1535 CANADIAN SYLLABICS YWO
+1536 CANADIAN SYLLABICS WEST-CREE YWO
+1537 CANADIAN SYLLABICS YWOO
+1538 CANADIAN SYLLABICS WEST-CREE YWOO
+1539 CANADIAN SYLLABICS YWA
+153A CANADIAN SYLLABICS WEST-CREE YWA
+153B CANADIAN SYLLABICS YWAA
+153C CANADIAN SYLLABICS WEST-CREE YWAA
+153D CANADIAN SYLLABICS NASKAPI YWAA
+153E CANADIAN SYLLABICS Y
+153F CANADIAN SYLLABICS BIBLE-CREE Y
+1540 CANADIAN SYLLABICS WEST-CREE Y
+1541 CANADIAN SYLLABICS SAYISI YI
+1542 CANADIAN SYLLABICS RE
+ * Inuktitut (RAI)
+1543 CANADIAN SYLLABICS R-CREE RE
+ * Athapascan (LE)
+1544 CANADIAN SYLLABICS WEST-CREE LE
+ * Athapascan (LI)
+1545 CANADIAN SYLLABICS RAAI
+ * Inuktitut
+1546 CANADIAN SYLLABICS RI
+1547 CANADIAN SYLLABICS RII
+1548 CANADIAN SYLLABICS RO
+ * Inuktitut (RU)
+1549 CANADIAN SYLLABICS ROO
+ * Inuktitut (RUU)
+154A CANADIAN SYLLABICS WEST-CREE LO
+ * Sayisi (LU)
+154B CANADIAN SYLLABICS RA
+154C CANADIAN SYLLABICS RAA
+154D CANADIAN SYLLABICS WEST-CREE LA
+154E CANADIAN SYLLABICS RWAA
+154F CANADIAN SYLLABICS WEST-CREE RWAA
+1550 CANADIAN SYLLABICS R
+1551 CANADIAN SYLLABICS WEST-CREE R
+1552 CANADIAN SYLLABICS MEDIAL R
+1553 CANADIAN SYLLABICS FE
+ * Inuktitut (FAI)
+1554 CANADIAN SYLLABICS FAAI
+ * Inuktitut
+1555 CANADIAN SYLLABICS FI
+1556 CANADIAN SYLLABICS FII
+1557 CANADIAN SYLLABICS FO
+1558 CANADIAN SYLLABICS FOO
+1559 CANADIAN SYLLABICS FA
+155A CANADIAN SYLLABICS FAA
+155B CANADIAN SYLLABICS FWAA
+155C CANADIAN SYLLABICS WEST-CREE FWAA
+155D CANADIAN SYLLABICS F
+155E CANADIAN SYLLABICS THE
+ * Sayisi (TE)
+155F CANADIAN SYLLABICS N-CREE THE
+1560 CANADIAN SYLLABICS THI
+ * Sayisi (TI)
+1561 CANADIAN SYLLABICS N-CREE THI
+1562 CANADIAN SYLLABICS THII
+1563 CANADIAN SYLLABICS N-CREE THII
+1564 CANADIAN SYLLABICS THO
+ * Sayisi (TU)
+1565 CANADIAN SYLLABICS THOO
+1566 CANADIAN SYLLABICS THA
+ * Sayisi (TA)
+1567 CANADIAN SYLLABICS THAA
+1568 CANADIAN SYLLABICS THWAA
+1569 CANADIAN SYLLABICS WEST-CREE THWAA
+156A CANADIAN SYLLABICS TH
+156B CANADIAN SYLLABICS TTHE
+156C CANADIAN SYLLABICS TTHI
+156D CANADIAN SYLLABICS TTHO
+ * Sayisi (TTHU)
+156E CANADIAN SYLLABICS TTHA
+156F CANADIAN SYLLABICS TTH
+ * probably a mistaken interpretation of an asterisk used to mark a proper noun
+ x (asterisk - 002A)
+1570 CANADIAN SYLLABICS TYE
+1571 CANADIAN SYLLABICS TYI
+1572 CANADIAN SYLLABICS TYO
+1573 CANADIAN SYLLABICS TYA
+1574 CANADIAN SYLLABICS NUNAVIK HE
+1575 CANADIAN SYLLABICS NUNAVIK HI
+1576 CANADIAN SYLLABICS NUNAVIK HII
+1577 CANADIAN SYLLABICS NUNAVIK HO
+1578 CANADIAN SYLLABICS NUNAVIK HOO
+1579 CANADIAN SYLLABICS NUNAVIK HA
+157A CANADIAN SYLLABICS NUNAVIK HAA
+157B CANADIAN SYLLABICS NUNAVIK H
+157C CANADIAN SYLLABICS NUNAVUT H
+157D CANADIAN SYLLABICS HK
+ * Algonquian
+157E CANADIAN SYLLABICS QAAI
+ * Inuktitut
+157F CANADIAN SYLLABICS QI
+1580 CANADIAN SYLLABICS QII
+1581 CANADIAN SYLLABICS QO
+ * Inuktitut (QU)
+1582 CANADIAN SYLLABICS QOO
+ * Inuktitut (QUU)
+1583 CANADIAN SYLLABICS QA
+1584 CANADIAN SYLLABICS QAA
+1585 CANADIAN SYLLABICS Q
+1586 CANADIAN SYLLABICS TLHE
+ * Sayisi (KLE)
+1587 CANADIAN SYLLABICS TLHI
+ * Sayisi (KLI)
+1588 CANADIAN SYLLABICS TLHO
+ * Sayisi (KLU)
+1589 CANADIAN SYLLABICS TLHA
+ * Sayisi (KLA)
+158A CANADIAN SYLLABICS WEST-CREE RE
+158B CANADIAN SYLLABICS WEST-CREE RI
+158C CANADIAN SYLLABICS WEST-CREE RO
+158D CANADIAN SYLLABICS WEST-CREE RA
+158E CANADIAN SYLLABICS NGAAI
+ * Inuktitut
+158F CANADIAN SYLLABICS NGI
+1590 CANADIAN SYLLABICS NGII
+1591 CANADIAN SYLLABICS NGO
+ * Inuktitut (NGU)
+1592 CANADIAN SYLLABICS NGOO
+ * Inuktitut (NGUU)
+1593 CANADIAN SYLLABICS NGA
+1594 CANADIAN SYLLABICS NGAA
+1595 CANADIAN SYLLABICS NG
+1596 CANADIAN SYLLABICS NNG
+1597 CANADIAN SYLLABICS SAYISI SHE
+1598 CANADIAN SYLLABICS SAYISI SHI
+1599 CANADIAN SYLLABICS SAYISI SHO
+ * Sayisi (SHU)
+159A CANADIAN SYLLABICS SAYISI SHA
+159B CANADIAN SYLLABICS WOODS-CREE THE
+159C CANADIAN SYLLABICS WOODS-CREE THI
+159D CANADIAN SYLLABICS WOODS-CREE THO
+159E CANADIAN SYLLABICS WOODS-CREE THA
+159F CANADIAN SYLLABICS WOODS-CREE TH
+15A0 CANADIAN SYLLABICS LHI
+15A1 CANADIAN SYLLABICS LHII
+15A2 CANADIAN SYLLABICS LHO
+ * Inuktitut (LHU)
+15A3 CANADIAN SYLLABICS LHOO
+ * Inuktitut (LHUU)
+15A4 CANADIAN SYLLABICS LHA
+15A5 CANADIAN SYLLABICS LHAA
+15A6 CANADIAN SYLLABICS LH
+15A7 CANADIAN SYLLABICS TH-CREE THE
+15A8 CANADIAN SYLLABICS TH-CREE THI
+15A9 CANADIAN SYLLABICS TH-CREE THII
+15AA CANADIAN SYLLABICS TH-CREE THO
+15AB CANADIAN SYLLABICS TH-CREE THOO
+15AC CANADIAN SYLLABICS TH-CREE THA
+15AD CANADIAN SYLLABICS TH-CREE THAA
+15AE CANADIAN SYLLABICS TH-CREE TH
+15AF CANADIAN SYLLABICS AIVILIK B
+15B0 CANADIAN SYLLABICS BLACKFOOT E
+15B1 CANADIAN SYLLABICS BLACKFOOT I
+15B2 CANADIAN SYLLABICS BLACKFOOT O
+15B3 CANADIAN SYLLABICS BLACKFOOT A
+15B4 CANADIAN SYLLABICS BLACKFOOT WE
+15B5 CANADIAN SYLLABICS BLACKFOOT WI
+15B6 CANADIAN SYLLABICS BLACKFOOT WO
+15B7 CANADIAN SYLLABICS BLACKFOOT WA
+15B8 CANADIAN SYLLABICS BLACKFOOT NE
+15B9 CANADIAN SYLLABICS BLACKFOOT NI
+15BA CANADIAN SYLLABICS BLACKFOOT NO
+15BB CANADIAN SYLLABICS BLACKFOOT NA
+15BC CANADIAN SYLLABICS BLACKFOOT KE
+15BD CANADIAN SYLLABICS BLACKFOOT KI
+15BE CANADIAN SYLLABICS BLACKFOOT KO
+15BF CANADIAN SYLLABICS BLACKFOOT KA
+15C0 CANADIAN SYLLABICS SAYISI HE
+15C1 CANADIAN SYLLABICS SAYISI HI
+15C2 CANADIAN SYLLABICS SAYISI HO
+ * Sayisi (HU)
+15C3 CANADIAN SYLLABICS SAYISI HA
+15C4 CANADIAN SYLLABICS CARRIER GHU
+15C5 CANADIAN SYLLABICS CARRIER GHO
+15C6 CANADIAN SYLLABICS CARRIER GHE
+15C7 CANADIAN SYLLABICS CARRIER GHEE
+15C8 CANADIAN SYLLABICS CARRIER GHI
+15C9 CANADIAN SYLLABICS CARRIER GHA
+15CA CANADIAN SYLLABICS CARRIER RU
+15CB CANADIAN SYLLABICS CARRIER RO
+15CC CANADIAN SYLLABICS CARRIER RE
+15CD CANADIAN SYLLABICS CARRIER REE
+15CE CANADIAN SYLLABICS CARRIER RI
+15CF CANADIAN SYLLABICS CARRIER RA
+15D0 CANADIAN SYLLABICS CARRIER WU
+15D1 CANADIAN SYLLABICS CARRIER WO
+15D2 CANADIAN SYLLABICS CARRIER WE
+15D3 CANADIAN SYLLABICS CARRIER WEE
+15D4 CANADIAN SYLLABICS CARRIER WI
+15D5 CANADIAN SYLLABICS CARRIER WA
+15D6 CANADIAN SYLLABICS CARRIER HWU
+15D7 CANADIAN SYLLABICS CARRIER HWO
+15D8 CANADIAN SYLLABICS CARRIER HWE
+15D9 CANADIAN SYLLABICS CARRIER HWEE
+15DA CANADIAN SYLLABICS CARRIER HWI
+15DB CANADIAN SYLLABICS CARRIER HWA
+15DC CANADIAN SYLLABICS CARRIER THU
+15DD CANADIAN SYLLABICS CARRIER THO
+15DE CANADIAN SYLLABICS CARRIER THE
+15DF CANADIAN SYLLABICS CARRIER THEE
+15E0 CANADIAN SYLLABICS CARRIER THI
+15E1 CANADIAN SYLLABICS CARRIER THA
+15E2 CANADIAN SYLLABICS CARRIER TTU
+15E3 CANADIAN SYLLABICS CARRIER TTO
+15E4 CANADIAN SYLLABICS CARRIER TTE
+15E5 CANADIAN SYLLABICS CARRIER TTEE
+15E6 CANADIAN SYLLABICS CARRIER TTI
+15E7 CANADIAN SYLLABICS CARRIER TTA
+15E8 CANADIAN SYLLABICS CARRIER PU
+15E9 CANADIAN SYLLABICS CARRIER PO
+15EA CANADIAN SYLLABICS CARRIER PE
+15EB CANADIAN SYLLABICS CARRIER PEE
+15EC CANADIAN SYLLABICS CARRIER PI
+15ED CANADIAN SYLLABICS CARRIER PA
+15EE CANADIAN SYLLABICS CARRIER P
+15EF CANADIAN SYLLABICS CARRIER GU
+15F0 CANADIAN SYLLABICS CARRIER GO
+15F1 CANADIAN SYLLABICS CARRIER GE
+15F2 CANADIAN SYLLABICS CARRIER GEE
+15F3 CANADIAN SYLLABICS CARRIER GI
+15F4 CANADIAN SYLLABICS CARRIER GA
+15F5 CANADIAN SYLLABICS CARRIER KHU
+15F6 CANADIAN SYLLABICS CARRIER KHO
+15F7 CANADIAN SYLLABICS CARRIER KHE
+15F8 CANADIAN SYLLABICS CARRIER KHEE
+15F9 CANADIAN SYLLABICS CARRIER KHI
+15FA CANADIAN SYLLABICS CARRIER KHA
+15FB CANADIAN SYLLABICS CARRIER KKU
+15FC CANADIAN SYLLABICS CARRIER KKO
+15FD CANADIAN SYLLABICS CARRIER KKE
+15FE CANADIAN SYLLABICS CARRIER KKEE
+15FF CANADIAN SYLLABICS CARRIER KKI
+1600 CANADIAN SYLLABICS CARRIER KKA
+1601 CANADIAN SYLLABICS CARRIER KK
+1602 CANADIAN SYLLABICS CARRIER NU
+1603 CANADIAN SYLLABICS CARRIER NO
+1604 CANADIAN SYLLABICS CARRIER NE
+1605 CANADIAN SYLLABICS CARRIER NEE
+1606 CANADIAN SYLLABICS CARRIER NI
+1607 CANADIAN SYLLABICS CARRIER NA
+1608 CANADIAN SYLLABICS CARRIER MU
+1609 CANADIAN SYLLABICS CARRIER MO
+160A CANADIAN SYLLABICS CARRIER ME
+160B CANADIAN SYLLABICS CARRIER MEE
+160C CANADIAN SYLLABICS CARRIER MI
+160D CANADIAN SYLLABICS CARRIER MA
+160E CANADIAN SYLLABICS CARRIER YU
+160F CANADIAN SYLLABICS CARRIER YO
+1610 CANADIAN SYLLABICS CARRIER YE
+1611 CANADIAN SYLLABICS CARRIER YEE
+1612 CANADIAN SYLLABICS CARRIER YI
+1613 CANADIAN SYLLABICS CARRIER YA
+1614 CANADIAN SYLLABICS CARRIER JU
+ * Athapascan (ZA), Sayisi (TZO), South Slavey (DHA)
+1615 CANADIAN SYLLABICS SAYISI JU
+ * Athapascan (ZO), Sayisi (TZU), South Slavey (DHO)
+1616 CANADIAN SYLLABICS CARRIER JO
+1617 CANADIAN SYLLABICS CARRIER JE
+1618 CANADIAN SYLLABICS CARRIER JEE
+1619 CANADIAN SYLLABICS CARRIER JI
+161A CANADIAN SYLLABICS SAYISI JI
+ * Athapascan (ZE), Sayisi (TZE), South Slavey (DHE)
+161B CANADIAN SYLLABICS CARRIER JA
+ * Athapascan (ZI), Sayisi (TZI), South Slavey (DHI)
+161C CANADIAN SYLLABICS CARRIER JJU
+161D CANADIAN SYLLABICS CARRIER JJO
+161E CANADIAN SYLLABICS CARRIER JJE
+161F CANADIAN SYLLABICS CARRIER JJEE
+1620 CANADIAN SYLLABICS CARRIER JJI
+1621 CANADIAN SYLLABICS CARRIER JJA
+1622 CANADIAN SYLLABICS CARRIER LU
+1623 CANADIAN SYLLABICS CARRIER LO
+1624 CANADIAN SYLLABICS CARRIER LE
+1625 CANADIAN SYLLABICS CARRIER LEE
+1626 CANADIAN SYLLABICS CARRIER LI
+1627 CANADIAN SYLLABICS CARRIER LA
+1628 CANADIAN SYLLABICS CARRIER DLU
+1629 CANADIAN SYLLABICS CARRIER DLO
+162A CANADIAN SYLLABICS CARRIER DLE
+162B CANADIAN SYLLABICS CARRIER DLEE
+162C CANADIAN SYLLABICS CARRIER DLI
+162D CANADIAN SYLLABICS CARRIER DLA
+162E CANADIAN SYLLABICS CARRIER LHU
+162F CANADIAN SYLLABICS CARRIER LHO
+1630 CANADIAN SYLLABICS CARRIER LHE
+1631 CANADIAN SYLLABICS CARRIER LHEE
+1632 CANADIAN SYLLABICS CARRIER LHI
+1633 CANADIAN SYLLABICS CARRIER LHA
+1634 CANADIAN SYLLABICS CARRIER TLHU
+1635 CANADIAN SYLLABICS CARRIER TLHO
+1636 CANADIAN SYLLABICS CARRIER TLHE
+1637 CANADIAN SYLLABICS CARRIER TLHEE
+1638 CANADIAN SYLLABICS CARRIER TLHI
+1639 CANADIAN SYLLABICS CARRIER TLHA
+163A CANADIAN SYLLABICS CARRIER TLU
+163B CANADIAN SYLLABICS CARRIER TLO
+163C CANADIAN SYLLABICS CARRIER TLE
+163D CANADIAN SYLLABICS CARRIER TLEE
+163E CANADIAN SYLLABICS CARRIER TLI
+163F CANADIAN SYLLABICS CARRIER TLA
+1640 CANADIAN SYLLABICS CARRIER ZU
+1641 CANADIAN SYLLABICS CARRIER ZO
+1642 CANADIAN SYLLABICS CARRIER ZE
+1643 CANADIAN SYLLABICS CARRIER ZEE
+1644 CANADIAN SYLLABICS CARRIER ZI
+1645 CANADIAN SYLLABICS CARRIER ZA
+1646 CANADIAN SYLLABICS CARRIER Z
+1647 CANADIAN SYLLABICS CARRIER INITIAL Z
+1648 CANADIAN SYLLABICS CARRIER DZU
+1649 CANADIAN SYLLABICS CARRIER DZO
+164A CANADIAN SYLLABICS CARRIER DZE
+164B CANADIAN SYLLABICS CARRIER DZEE
+164C CANADIAN SYLLABICS CARRIER DZI
+164D CANADIAN SYLLABICS CARRIER DZA
+164E CANADIAN SYLLABICS CARRIER SU
+164F CANADIAN SYLLABICS CARRIER SO
+1650 CANADIAN SYLLABICS CARRIER SE
+1651 CANADIAN SYLLABICS CARRIER SEE
+1652 CANADIAN SYLLABICS CARRIER SI
+1653 CANADIAN SYLLABICS CARRIER SA
+1654 CANADIAN SYLLABICS CARRIER SHU
+1655 CANADIAN SYLLABICS CARRIER SHO
+1656 CANADIAN SYLLABICS CARRIER SHE
+1657 CANADIAN SYLLABICS CARRIER SHEE
+1658 CANADIAN SYLLABICS CARRIER SHI
+1659 CANADIAN SYLLABICS CARRIER SHA
+165A CANADIAN SYLLABICS CARRIER SH
+165B CANADIAN SYLLABICS CARRIER TSU
+165C CANADIAN SYLLABICS CARRIER TSO
+165D CANADIAN SYLLABICS CARRIER TSE
+165E CANADIAN SYLLABICS CARRIER TSEE
+165F CANADIAN SYLLABICS CARRIER TSI
+1660 CANADIAN SYLLABICS CARRIER TSA
+1661 CANADIAN SYLLABICS CARRIER CHU
+1662 CANADIAN SYLLABICS CARRIER CHO
+1663 CANADIAN SYLLABICS CARRIER CHE
+1664 CANADIAN SYLLABICS CARRIER CHEE
+1665 CANADIAN SYLLABICS CARRIER CHI
+1666 CANADIAN SYLLABICS CARRIER CHA
+1667 CANADIAN SYLLABICS CARRIER TTSU
+1668 CANADIAN SYLLABICS CARRIER TTSO
+1669 CANADIAN SYLLABICS CARRIER TTSE
+166A CANADIAN SYLLABICS CARRIER TTSEE
+166B CANADIAN SYLLABICS CARRIER TTSI
+166C CANADIAN SYLLABICS CARRIER TTSA
+@ Symbol
+166D CANADIAN SYLLABICS CHI SIGN
+ * Algonquian
+ * used as a symbol to denote Christ
+ x (chi rho - 2627)
+@ Punctuation
+166E CANADIAN SYLLABICS FULL STOP
+@ Syllables
+166F CANADIAN SYLLABICS QAI
+1670 CANADIAN SYLLABICS NGAI
+1671 CANADIAN SYLLABICS NNGI
+1672 CANADIAN SYLLABICS NNGII
+1673 CANADIAN SYLLABICS NNGO
+ * Inuktitut (NNGU)
+1674 CANADIAN SYLLABICS NNGOO
+ * Inuktitut (NNGUU)
+1675 CANADIAN SYLLABICS NNGA
+1676 CANADIAN SYLLABICS NNGAA
+@@ 1680 Ogham 169F
+@+ An Ogham font typically displays all Ogham characters with a visible stemline, representing the edge of monumental Ogham inscriptions.
+@ Punctuation
+1680 OGHAM SPACE MARK
+ * the glyph shows only the stemline in a "stemmed" style font and is blank in a "stemless" style font
+ x (space - 0020)
+@ Traditional letters
+1681 OGHAM LETTER BEITH
+1682 OGHAM LETTER LUIS
+1683 OGHAM LETTER FEARN
+1684 OGHAM LETTER SAIL
+1685 OGHAM LETTER NION
+1686 OGHAM LETTER UATH
+1687 OGHAM LETTER DAIR
+1688 OGHAM LETTER TINNE
+1689 OGHAM LETTER COLL
+168A OGHAM LETTER CEIRT
+168B OGHAM LETTER MUIN
+168C OGHAM LETTER GORT
+168D OGHAM LETTER NGEADAL
+168E OGHAM LETTER STRAIF
+168F OGHAM LETTER RUIS
+1690 OGHAM LETTER AILM
+1691 OGHAM LETTER ONN
+1692 OGHAM LETTER UR
+1693 OGHAM LETTER EADHADH
+1694 OGHAM LETTER IODHADH
+@ Forfeda (supplementary letters)
+1695 OGHAM LETTER EABHADH
+1696 OGHAM LETTER OR
+1697 OGHAM LETTER UILLEANN
+1698 OGHAM LETTER IFIN
+1699 OGHAM LETTER EAMHANCHOLL
+169A OGHAM LETTER PEITH
+@ Punctuation
+169B OGHAM FEATHER MARK
+ * marks beginning of Ogham text
+169C OGHAM REVERSED FEATHER MARK
+ * marks end of Ogham text
+@@ 16A0 Runic 16FF
+@ Letters
+16A0 RUNIC LETTER FEHU FEOH FE F
+16A1 RUNIC LETTER V
+16A2 RUNIC LETTER URUZ UR U
+16A3 RUNIC LETTER YR
+16A4 RUNIC LETTER Y
+16A5 RUNIC LETTER W
+16A6 RUNIC LETTER THURISAZ THURS THORN
+ x (latin small letter thorn - 00FE)
+16A7 RUNIC LETTER ETH
+16A8 RUNIC LETTER ANSUZ A
+16A9 RUNIC LETTER OS O
+16AA RUNIC LETTER AC A
+16AB RUNIC LETTER AESC
+16AC RUNIC LETTER LONG-BRANCH-OSS O
+16AD RUNIC LETTER SHORT-TWIG-OSS O
+16AE RUNIC LETTER O
+16AF RUNIC LETTER OE
+16B0 RUNIC LETTER ON
+16B1 RUNIC LETTER RAIDO RAD REID R
+16B2 RUNIC LETTER KAUNA
+16B3 RUNIC LETTER CEN
+16B4 RUNIC LETTER KAUN K
+16B5 RUNIC LETTER G
+16B6 RUNIC LETTER ENG
+16B7 RUNIC LETTER GEBO GYFU G
+16B8 RUNIC LETTER GAR
+16B9 RUNIC LETTER WUNJO WYNN W
+ x (latin letter wynn - 01BF)
+16BA RUNIC LETTER HAGLAZ H
+16BB RUNIC LETTER HAEGL H
+16BC RUNIC LETTER LONG-BRANCH-HAGALL H
+16BD RUNIC LETTER SHORT-TWIG-HAGALL H
+16BE RUNIC LETTER NAUDIZ NYD NAUD N
+16BF RUNIC LETTER SHORT-TWIG-NAUD N
+16C0 RUNIC LETTER DOTTED-N
+16C1 RUNIC LETTER ISAZ IS ISS I
+16C2 RUNIC LETTER E
+16C3 RUNIC LETTER JERAN J
+16C4 RUNIC LETTER GER
+16C5 RUNIC LETTER LONG-BRANCH-AR AE
+16C6 RUNIC LETTER SHORT-TWIG-AR A
+16C7 RUNIC LETTER IWAZ EOH
+16C8 RUNIC LETTER PERTHO PEORTH P
+16C9 RUNIC LETTER ALGIZ EOLHX
+16CA RUNIC LETTER SOWILO S
+16CB RUNIC LETTER SIGEL LONG-BRANCH-SOL S
+16CC RUNIC LETTER SHORT-TWIG-SOL S
+16CD RUNIC LETTER C
+16CE RUNIC LETTER Z
+16CF RUNIC LETTER TIWAZ TIR TYR T
+16D0 RUNIC LETTER SHORT-TWIG-TYR T
+16D1 RUNIC LETTER D
+16D2 RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3 RUNIC LETTER SHORT-TWIG-BJARKAN B
+16D4 RUNIC LETTER DOTTED-P
+16D5 RUNIC LETTER OPEN-P
+16D6 RUNIC LETTER EHWAZ EH E
+16D7 RUNIC LETTER MANNAZ MAN M
+16D8 RUNIC LETTER LONG-BRANCH-MADR M
+16D9 RUNIC LETTER SHORT-TWIG-MADR M
+16DA RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB RUNIC LETTER DOTTED-L
+16DC RUNIC LETTER INGWAZ
+16DD RUNIC LETTER ING
+16DE RUNIC LETTER DAGAZ DAEG D
+16DF RUNIC LETTER OTHALAN ETHEL O
+16E0 RUNIC LETTER EAR
+16E1 RUNIC LETTER IOR
+16E2 RUNIC LETTER CWEORTH
+16E3 RUNIC LETTER CALC
+16E4 RUNIC LETTER CEALC
+16E5 RUNIC LETTER STAN
+16E6 RUNIC LETTER LONG-BRANCH-YR
+16E7 RUNIC LETTER SHORT-TWIG-YR
+16E8 RUNIC LETTER ICELANDIC-YR
+16E9 RUNIC LETTER Q
+16EA RUNIC LETTER X
+@ Punctuation
+16EB RUNIC SINGLE PUNCTUATION
+16EC RUNIC MULTIPLE PUNCTUATION
+16ED RUNIC CROSS PUNCTUATION
+@ Golden number runes
+16EE RUNIC ARLAUG SYMBOL (golden number 17)
+ * golden number 17
+16EF RUNIC TVIMADUR SYMBOL (golden number 18)
+ * golden number 18
+16F0 RUNIC BELGTHOR SYMBOL (golden number 19)
+ * golden number 19
+@@ 1700 Tagalog 171F
+@ Independent vowels
+1700 TAGALOG LETTER A
+1701 TAGALOG LETTER I
+1702 TAGALOG LETTER U
+@ Consonants
+1703 TAGALOG LETTER KA
+1704 TAGALOG LETTER GA
+1705 TAGALOG LETTER NGA
+1706 TAGALOG LETTER TA
+1707 TAGALOG LETTER DA
+1708 TAGALOG LETTER NA
+1709 TAGALOG LETTER PA
+170A TAGALOG LETTER BA
+170B TAGALOG LETTER MA
+170C TAGALOG LETTER YA
+170E TAGALOG LETTER LA
+170F TAGALOG LETTER WA
+1710 TAGALOG LETTER SA
+1711 TAGALOG LETTER HA
+@ Dependent vowel signs
+1712 TAGALOG VOWEL SIGN I
+1713 TAGALOG VOWEL SIGN U
+@ Virama
+1714 TAGALOG SIGN VIRAMA
+@@ 1720 Hanunoo 173F
+@ Independent vowels
+1720 HANUNOO LETTER A
+1721 HANUNOO LETTER I
+1722 HANUNOO LETTER U
+@ Consonants
+1723 HANUNOO LETTER KA
+1724 HANUNOO LETTER GA
+1725 HANUNOO LETTER NGA
+1726 HANUNOO LETTER TA
+1727 HANUNOO LETTER DA
+1728 HANUNOO LETTER NA
+1729 HANUNOO LETTER PA
+172A HANUNOO LETTER BA
+172B HANUNOO LETTER MA
+172C HANUNOO LETTER YA
+172D HANUNOO LETTER RA
+172E HANUNOO LETTER LA
+172F HANUNOO LETTER WA
+1730 HANUNOO LETTER SA
+1731 HANUNOO LETTER HA
+@ Dependent vowel signs
+1732 HANUNOO VOWEL SIGN I
+1733 HANUNOO VOWEL SIGN U
+@ Virama
+1734 HANUNOO SIGN PAMUDPOD
+@ Generic punctuation for Philippine scripts
+1735 PHILIPPINE SINGLE PUNCTUATION
+ x (devanagari danda - 0964)
+1736 PHILIPPINE DOUBLE PUNCTUATION
+ x (devanagari double danda - 0965)
+@@ 1740 Buhid 175F
+@ Independent vowels
+1740 BUHID LETTER A
+1741 BUHID LETTER I
+1742 BUHID LETTER U
+@ Consonants
+1743 BUHID LETTER KA
+1744 BUHID LETTER GA
+1745 BUHID LETTER NGA
+1746 BUHID LETTER TA
+1747 BUHID LETTER DA
+1748 BUHID LETTER NA
+1749 BUHID LETTER PA
+174A BUHID LETTER BA
+174B BUHID LETTER MA
+174C BUHID LETTER YA
+174D BUHID LETTER RA
+174E BUHID LETTER LA
+174F BUHID LETTER WA
+1750 BUHID LETTER SA
+1751 BUHID LETTER HA
+@ Dependent vowel signs
+1752 BUHID VOWEL SIGN I
+1753 BUHID VOWEL SIGN U
+@@ 1760 Tagbanwa 177F
+@ Independent vowels
+1760 TAGBANWA LETTER A
+1761 TAGBANWA LETTER I
+1762 TAGBANWA LETTER U
+@ Consonants
+1763 TAGBANWA LETTER KA
+1764 TAGBANWA LETTER GA
+1765 TAGBANWA LETTER NGA
+1766 TAGBANWA LETTER TA
+1767 TAGBANWA LETTER DA
+1768 TAGBANWA LETTER NA
+1769 TAGBANWA LETTER PA
+176A TAGBANWA LETTER BA
+176B TAGBANWA LETTER MA
+176C TAGBANWA LETTER YA
+176E TAGBANWA LETTER LA
+176F TAGBANWA LETTER WA
+1770 TAGBANWA LETTER SA
+@ Dependent vowel signs
+1772 TAGBANWA VOWEL SIGN I
+1773 TAGBANWA VOWEL SIGN U
+@@ 1780 Khmer 17FF
+@ Consonants
+1780 KHMER LETTER KA
+1781 KHMER LETTER KHA
+1782 KHMER LETTER KO
+1783 KHMER LETTER KHO
+1784 KHMER LETTER NGO
+1785 KHMER LETTER CA
+1786 KHMER LETTER CHA
+1787 KHMER LETTER CO
+1788 KHMER LETTER CHO
+1789 KHMER LETTER NYO
+178A KHMER LETTER DA
+178B KHMER LETTER TTHA
+178C KHMER LETTER DO
+178D KHMER LETTER TTHO
+178E KHMER LETTER NNO
+ * as this character belongs to the first register, its correct transliteration is nna, not nno
+178F KHMER LETTER TA
+1790 KHMER LETTER THA
+1791 KHMER LETTER TO
+1792 KHMER LETTER THO
+1793 KHMER LETTER NO
+1794 KHMER LETTER BA
+1795 KHMER LETTER PHA
+1796 KHMER LETTER PO
+1797 KHMER LETTER PHO
+1798 KHMER LETTER MO
+1799 KHMER LETTER YO
+179A KHMER LETTER RO
+179B KHMER LETTER LO
+179C KHMER LETTER VO
+179D KHMER LETTER SHA
+ * used only for Pali/Sanskrit transliteration
+179E KHMER LETTER SSO
+ * used only for Pali/Sanskrit transliteration
+ * as this character belongs to the first register, its correct transliteration is ssa, not sso
+179F KHMER LETTER SA
+17A0 KHMER LETTER HA
+17A1 KHMER LETTER LA
+17A2 KHMER LETTER QA
+ * glottal stop
+@ Independent vowel (deprecated)
+17A3 KHMER INDEPENDENT VOWEL QAQ *
+ * originally intended only for Pali/Sanskrit transliteration
+ * use of this character is strongly discouraged; 17A2 should be used instead
+@ Independent vowels
+17A4 KHMER INDEPENDENT VOWEL QAA *
+ * used only for Pali/Sanskrit transliteration
+ * use of this character is discouraged; the sequence 17A2 17B6 should be used instead
+17A5 KHMER INDEPENDENT VOWEL QI
+17A6 KHMER INDEPENDENT VOWEL QII
+17A7 KHMER INDEPENDENT VOWEL QU
+17A8 KHMER INDEPENDENT VOWEL QUK
+ * obsolete ligature for the sequence 17A7 1780
+ * use of the sequence is now preferred
+17A9 KHMER INDEPENDENT VOWEL QUU
+17AA KHMER INDEPENDENT VOWEL QUUV
+17AB KHMER INDEPENDENT VOWEL RY
+17AC KHMER INDEPENDENT VOWEL RYY
+17AD KHMER INDEPENDENT VOWEL LY
+17AE KHMER INDEPENDENT VOWEL LYY
+17AF KHMER INDEPENDENT VOWEL QE
+17B0 KHMER INDEPENDENT VOWEL QAI
+17B1 KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2 KHMER INDEPENDENT VOWEL QOO TYPE TWO
+ * this is a variant for 17B1, used in only two words
+ * 17B1 is the normal variant of this vowel
+17B3 KHMER INDEPENDENT VOWEL QAU
+@ Inherent vowels
+@+ These are for phonetic transcription to distinguish Indic language inherent vowels from Khmer inherent vowels. These characters are included solely for compatibility with particular applications; their use in other contexts is discouraged.
+17B4 KHMER VOWEL INHERENT AQ *
+17B5 KHMER VOWEL INHERENT AA *
+@ Dependent vowel signs
+17B6 KHMER VOWEL SIGN AA
+17B7 KHMER VOWEL SIGN I
+17B8 KHMER VOWEL SIGN II
+17B9 KHMER VOWEL SIGN Y
+17BA KHMER VOWEL SIGN YY
+17BB KHMER VOWEL SIGN U
+17BC KHMER VOWEL SIGN UU
+17BD KHMER VOWEL SIGN UA
+@ Two-part dependent vowel signs
+@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for processing.
+17BE KHMER VOWEL SIGN OE
+17BF KHMER VOWEL SIGN YA
+17C0 KHMER VOWEL SIGN IE
+@ Dependent vowel signs
+17C1 KHMER VOWEL SIGN E
+17C2 KHMER VOWEL SIGN AE
+17C3 KHMER VOWEL SIGN AI
+@ Two-part dependent vowel signs
+@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for processing.
+17C4 KHMER VOWEL SIGN OO
+17C5 KHMER VOWEL SIGN AU
+@ Various signs
+17C6 KHMER SIGN NIKAHIT
+ = srak am
+ = anusvara
+ * final nasalization
+ * this character is usually regarded as a vowel sign am, along with om and aam
+ x (thai character nikhahit - 0E4D)
+ x (myanmar sign anusvara - 1036)
+17C7 KHMER SIGN REAHMUK
+ = srak ah
+ = visarga
+ x (myanmar sign visarga - 1038)
+17C8 KHMER SIGN YUUKALEAPINTU
+ * inserts a short inherent vowel with abrupt glottal stop
+ * the preferred transliteration is yukaleakpintu
+@ Consonant shifters
+@+ These signs shift the base consonant between registers.
+17C9 KHMER SIGN MUUSIKATOAN
+ * changes the second register to the first
+ * the preferred transliteration is muusekatoan
+17CA KHMER SIGN TRIISAP
+ * changes the first register to the second
+ * the preferred transliteration is treisap
+@ Various signs
+17CB KHMER SIGN BANTOC
+ * shortens the vowel sound in the previous orthographic syllable
+ * the preferred transliteration is bantak
+17CC KHMER SIGN ROBAT
+ * a diacritic historically corresponding to the repha form of ra in Devanagari
+17CD KHMER SIGN TOANDAKHIAT
+ * indicates that the base character is not pronounced
+17CE KHMER SIGN KAKABAT
+ * sign used with some exclamations
+17CF KHMER SIGN AHSDA
+ * denotes stressed intonation in some single-consonant words
+17D0 KHMER SIGN SAMYOK SANNYA
+ * denotes deviation from the general rules of pronunciation, mostly used in loan words from Pali/Sanskrit, French, and so on
+17D1 KHMER SIGN VIRIAM
+ * mostly obsolete, a "killer"
+ * indicates that the base character is the final consonant of a word without its inherent vowel sound
+17D2 KHMER SIGN COENG
+ * functions to indicate that the following Khmer letter is to be rendered subscripted
+ * shape shown is arbitrary and is not visibly rendered
+@ Lunar date sign (deprecated)
+17D3 KHMER SIGN BATHAMASAT *
+ * originally intended as part of lunar date symbols
+ * use of this character is strongly discouraged in favor of the complete set of lunar date symbols
+ x (khmer symbol pathamasat - 19E0)
+@ Various signs
+17D4 KHMER SIGN KHAN
+ * functions as a full stop, period
+ x (thai character paiyannoi - 0E2F)
+ x (myanmar sign little section - 104A)
+17D5 KHMER SIGN BARIYOOSAN
+ * indicates the end of a section or a text
+ x (thai character angkhankhu - 0E5A)
+ x (myanmar sign section - 104B)
+17D6 KHMER SIGN CAMNUC PII KUUH
+ * functions as colon
+ * the preferred transliteration is camnoc pii kuuh
+ x (division sign - 00F7)
+ x (tibetan mark gter tsheg - 0F14)
+17D7 KHMER SIGN LEK TOO
+ * repetition sign
+ x (thai character maiyamok - 0E46)
+17D8 KHMER SIGN BEYYAL *
+ * et cetera
+ * use of this character is discouraged; other abbreviations for et cetera also exist
+ * preferred spelling: 17D4 179B 17D4
+17D9 KHMER SIGN PHNAEK MUAN
+ * indicates the beginning of a book or a treatise
+ * the preferred transliteration is phnek moan
+ x (thai character fongman - 0E4F)
+17DA KHMER SIGN KOOMUUT
+ * indicates the end of a book or treatise
+ * this forms a pair with 17D9
+ * the preferred transliteration is koomoot
+ x (thai character khomut - 0E5B)
+@ Currency symbol
+17DB KHMER CURRENCY SYMBOL RIEL
+@ Various signs
+17DC KHMER SIGN AVAKRAHASANYA
+ * rare, shows an omitted Sanskrit vowel, like an apostrophe
+ * the preferred transliteration is avakraha sannya
+ x (devanagari sign avagraha - 093D)
+17DD KHMER SIGN ATTHACAN
+ * mostly obsolete
+ * indicates that the base character is the final consonant of a word with its inherent vowel sound
+ x (khmer sign viriam - 17D1)
+@ Digits
+17E0 KHMER DIGIT ZERO
+17E1 KHMER DIGIT ONE
+17E2 KHMER DIGIT TWO
+17E3 KHMER DIGIT THREE
+17E4 KHMER DIGIT FOUR
+17E5 KHMER DIGIT FIVE
+17E6 KHMER DIGIT SIX
+17E7 KHMER DIGIT SEVEN
+17E8 KHMER DIGIT EIGHT
+17E9 KHMER DIGIT NINE
+@ Numeric symbols for divination lore
+@+ These characters have numeric values 0-9, respectively, but are not used for calculation.
+17F0 KHMER SYMBOL LEK ATTAK SON
+17F1 KHMER SYMBOL LEK ATTAK MUOY
+17F2 KHMER SYMBOL LEK ATTAK PII
+17F3 KHMER SYMBOL LEK ATTAK BEI
+17F4 KHMER SYMBOL LEK ATTAK BUON
+17F5 KHMER SYMBOL LEK ATTAK PRAM
+17F6 KHMER SYMBOL LEK ATTAK PRAM-MUOY
+17F7 KHMER SYMBOL LEK ATTAK PRAM-PII
+17F8 KHMER SYMBOL LEK ATTAK PRAM-BEI
+17F9 KHMER SYMBOL LEK ATTAK PRAM-BUON
+@@ 1800 Mongolian 18AF
+@@+
+@ Punctuation
+1800 MONGOLIAN BIRGA
+ x (tibetan mark initial yig mgo mdun ma - 0F04)
+1801 MONGOLIAN ELLIPSIS
+1802 MONGOLIAN COMMA
+1803 MONGOLIAN FULL STOP
+1804 MONGOLIAN COLON
+1805 MONGOLIAN FOUR DOTS
+ * marks the end of a chapter
+1806 MONGOLIAN TODO SOFT HYPHEN
+ * not a format control character, but simply a hyphen for Todo
+ x (soft hyphen - 00AD)
+1807 MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808 MONGOLIAN MANCHU COMMA
+1809 MONGOLIAN MANCHU FULL STOP
+180A MONGOLIAN NIRUGU
+@ Format controls
+180B MONGOLIAN FREE VARIATION SELECTOR ONE
+ * abbreviated FVS1
+180C MONGOLIAN FREE VARIATION SELECTOR TWO
+ * abbreviated FVS2
+180D MONGOLIAN FREE VARIATION SELECTOR THREE
+ * abbreviated FVS3
+180E MONGOLIAN VOWEL SEPARATOR
+ * abbreviated MVS
+@ Digits
+1810 MONGOLIAN DIGIT ZERO
+1811 MONGOLIAN DIGIT ONE
+1812 MONGOLIAN DIGIT TWO
+1813 MONGOLIAN DIGIT THREE
+1814 MONGOLIAN DIGIT FOUR
+1815 MONGOLIAN DIGIT FIVE
+1816 MONGOLIAN DIGIT SIX
+1817 MONGOLIAN DIGIT SEVEN
+1818 MONGOLIAN DIGIT EIGHT
+1819 MONGOLIAN DIGIT NINE
+@ Basic letters
+1820 MONGOLIAN LETTER A
+ x (cyrillic small letter a - 0430)
+1821 MONGOLIAN LETTER E
+ x (cyrillic small letter e - 044D)
+1822 MONGOLIAN LETTER I
+ x (cyrillic small letter i - 0438)
+1823 MONGOLIAN LETTER O
+ x (cyrillic small letter o - 043E)
+1824 MONGOLIAN LETTER U
+ x (cyrillic small letter u - 0443)
+1825 MONGOLIAN LETTER OE
+ x (cyrillic small letter barred o - 04E9)
+1826 MONGOLIAN LETTER UE
+ x (cyrillic small letter straight u - 04AF)
+1827 MONGOLIAN LETTER EE
+1828 MONGOLIAN LETTER NA
+ x (cyrillic small letter en - 043D)
+1829 MONGOLIAN LETTER ANG
+182A MONGOLIAN LETTER BA
+ x (cyrillic small letter be - 0431)
+182B MONGOLIAN LETTER PA
+ x (cyrillic small letter pe - 043F)
+182C MONGOLIAN LETTER QA
+ x (cyrillic small letter ha - 0445)
+182D MONGOLIAN LETTER GA
+ x (cyrillic small letter ghe - 0433)
+182E MONGOLIAN LETTER MA
+ x (cyrillic small letter em - 043C)
+182F MONGOLIAN LETTER LA
+ x (cyrillic small letter el - 043B)
+1830 MONGOLIAN LETTER SA
+ x (cyrillic small letter es - 0441)
+1831 MONGOLIAN LETTER SHA
+ x (cyrillic small letter sha - 0448)
+1832 MONGOLIAN LETTER TA
+ x (cyrillic small letter te - 0442)
+1833 MONGOLIAN LETTER DA
+ x (cyrillic small letter de - 0434)
+1834 MONGOLIAN LETTER CHA
+ x (cyrillic small letter che - 0447)
+1835 MONGOLIAN LETTER JA
+ x (cyrillic small letter zhe - 0436)
+1836 MONGOLIAN LETTER YA
+ x (cyrillic small letter short i - 0439)
+1837 MONGOLIAN LETTER RA
+ x (cyrillic small letter er - 0440)
+1838 MONGOLIAN LETTER WA
+ x (cyrillic small letter ve - 0432)
+1839 MONGOLIAN LETTER FA
+ x (cyrillic small letter ef - 0444)
+183A MONGOLIAN LETTER KA
+ x (cyrillic small letter ha - 0445)
+183B MONGOLIAN LETTER KHA
+ x (cyrillic small letter ka - 043A)
+183C MONGOLIAN LETTER TSA
+ x (cyrillic small letter tse - 0446)
+183D MONGOLIAN LETTER ZA
+ x (cyrillic small letter ze - 0437)
+183E MONGOLIAN LETTER HAA
+ x (cyrillic small letter ha - 0445)
+183F MONGOLIAN LETTER ZRA
+ x (cyrillic small letter zhe - 0436)
+1840 MONGOLIAN LETTER LHA
+1841 MONGOLIAN LETTER ZHI
+1842 MONGOLIAN LETTER CHI
+@ Todo letters
+1843 MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844 MONGOLIAN LETTER TODO E
+1845 MONGOLIAN LETTER TODO I
+1846 MONGOLIAN LETTER TODO O
+1847 MONGOLIAN LETTER TODO U
+1848 MONGOLIAN LETTER TODO OE
+1849 MONGOLIAN LETTER TODO UE
+184A MONGOLIAN LETTER TODO ANG
+184B MONGOLIAN LETTER TODO BA
+184C MONGOLIAN LETTER TODO PA
+184D MONGOLIAN LETTER TODO QA
+184E MONGOLIAN LETTER TODO GA
+184F MONGOLIAN LETTER TODO MA
+1850 MONGOLIAN LETTER TODO TA
+1851 MONGOLIAN LETTER TODO DA
+1852 MONGOLIAN LETTER TODO CHA
+1853 MONGOLIAN LETTER TODO JA
+1854 MONGOLIAN LETTER TODO TSA
+1855 MONGOLIAN LETTER TODO YA
+1856 MONGOLIAN LETTER TODO WA
+1857 MONGOLIAN LETTER TODO KA
+1858 MONGOLIAN LETTER TODO GAA
+1859 MONGOLIAN LETTER TODO HAA
+185A MONGOLIAN LETTER TODO JIA
+185B MONGOLIAN LETTER TODO NIA
+185C MONGOLIAN LETTER TODO DZA
+@ Sibe letters
+185D MONGOLIAN LETTER SIBE E
+185E MONGOLIAN LETTER SIBE I
+185F MONGOLIAN LETTER SIBE IY
+1860 MONGOLIAN LETTER SIBE UE
+1861 MONGOLIAN LETTER SIBE U
+1862 MONGOLIAN LETTER SIBE ANG
+1863 MONGOLIAN LETTER SIBE KA
+1864 MONGOLIAN LETTER SIBE GA
+1865 MONGOLIAN LETTER SIBE HA
+1866 MONGOLIAN LETTER SIBE PA
+1867 MONGOLIAN LETTER SIBE SHA
+1868 MONGOLIAN LETTER SIBE TA
+1869 MONGOLIAN LETTER SIBE DA
+186A MONGOLIAN LETTER SIBE JA
+186B MONGOLIAN LETTER SIBE FA
+186C MONGOLIAN LETTER SIBE GAA
+186D MONGOLIAN LETTER SIBE HAA
+186E MONGOLIAN LETTER SIBE TSA
+186F MONGOLIAN LETTER SIBE ZA
+1870 MONGOLIAN LETTER SIBE RAA
+1871 MONGOLIAN LETTER SIBE CHA
+1872 MONGOLIAN LETTER SIBE ZHA
+@ Manchu letters
+1873 MONGOLIAN LETTER MANCHU I
+1874 MONGOLIAN LETTER MANCHU KA
+1875 MONGOLIAN LETTER MANCHU RA
+1876 MONGOLIAN LETTER MANCHU FA
+1877 MONGOLIAN LETTER MANCHU ZHA
+@ Extensions for Sanskrit and Tibetan
+1880 MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+ x (tibetan sign sna ldan - 0F83)
+1881 MONGOLIAN LETTER ALI GALI VISARGA ONE
+ x (tibetan sign rnam bcad - 0F7F)
+1882 MONGOLIAN LETTER ALI GALI DAMARU
+ x (tibetan sign lce tsa can - 0F88)
+1883 MONGOLIAN LETTER ALI GALI UBADAMA
+1884 MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885 MONGOLIAN LETTER ALI GALI BALUDA
+ x (tibetan mark paluta - 0F85)
+1886 MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887 MONGOLIAN LETTER ALI GALI A
+1888 MONGOLIAN LETTER ALI GALI I
+1889 MONGOLIAN LETTER ALI GALI KA
+188A MONGOLIAN LETTER ALI GALI NGA
+188B MONGOLIAN LETTER ALI GALI CA
+188C MONGOLIAN LETTER ALI GALI TTA
+188D MONGOLIAN LETTER ALI GALI TTHA
+188E MONGOLIAN LETTER ALI GALI DDA
+188F MONGOLIAN LETTER ALI GALI NNA
+1890 MONGOLIAN LETTER ALI GALI TA
+1891 MONGOLIAN LETTER ALI GALI DA
+1892 MONGOLIAN LETTER ALI GALI PA
+1893 MONGOLIAN LETTER ALI GALI PHA
+1894 MONGOLIAN LETTER ALI GALI SSA
+1895 MONGOLIAN LETTER ALI GALI ZHA
+1896 MONGOLIAN LETTER ALI GALI ZA
+1897 MONGOLIAN LETTER ALI GALI AH
+1898 MONGOLIAN LETTER TODO ALI GALI TA
+1899 MONGOLIAN LETTER TODO ALI GALI ZHA
+189A MONGOLIAN LETTER MANCHU ALI GALI GHA
+189B MONGOLIAN LETTER MANCHU ALI GALI NGA
+189C MONGOLIAN LETTER MANCHU ALI GALI CA
+189D MONGOLIAN LETTER MANCHU ALI GALI JHA
+189E MONGOLIAN LETTER MANCHU ALI GALI TTA
+189F MONGOLIAN LETTER MANCHU ALI GALI DDHA
+18A0 MONGOLIAN LETTER MANCHU ALI GALI TA
+18A1 MONGOLIAN LETTER MANCHU ALI GALI DHA
+18A2 MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A3 MONGOLIAN LETTER MANCHU ALI GALI CYA
+18A4 MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5 MONGOLIAN LETTER MANCHU ALI GALI ZA
+18A6 MONGOLIAN LETTER ALI GALI HALF U
+18A7 MONGOLIAN LETTER ALI GALI HALF YA
+18A8 MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9 MONGOLIAN LETTER ALI GALI DAGALGA
+18AA MONGOLIAN LETTER MANCHU ALI GALI LHA
+@@ 1900 Limbu 194F
+@ Consonants
+1900 LIMBU VOWEL-CARRIER LETTER
+1901 LIMBU LETTER KA
+1902 LIMBU LETTER KHA
+1903 LIMBU LETTER GA
+1904 LIMBU LETTER GHA
+1905 LIMBU LETTER NGA
+1906 LIMBU LETTER CA
+1907 LIMBU LETTER CHA
+1908 LIMBU LETTER JA
+1909 LIMBU LETTER JHA
+190A LIMBU LETTER YAN
+190B LIMBU LETTER TA
+190C LIMBU LETTER THA
+190D LIMBU LETTER DA
+190E LIMBU LETTER DHA
+190F LIMBU LETTER NA
+1910 LIMBU LETTER PA
+1911 LIMBU LETTER PHA
+1912 LIMBU LETTER BA
+1913 LIMBU LETTER BHA
+1914 LIMBU LETTER MA
+1915 LIMBU LETTER YA
+1916 LIMBU LETTER RA
+1917 LIMBU LETTER LA
+1918 LIMBU LETTER WA
+1919 LIMBU LETTER SHA
+191A LIMBU LETTER SSA
+191B LIMBU LETTER SA
+191C LIMBU LETTER HA
+@ Dependent vowel signs
+1920 LIMBU VOWEL SIGN A
+1921 LIMBU VOWEL SIGN I
+1922 LIMBU VOWEL SIGN U
+1923 LIMBU VOWEL SIGN EE
+1924 LIMBU VOWEL SIGN AI
+1925 LIMBU VOWEL SIGN OO
+1926 LIMBU VOWEL SIGN AU
+1927 LIMBU VOWEL SIGN E
+1928 LIMBU VOWEL SIGN O
+@ Subjoined consonants
+1929 LIMBU SUBJOINED LETTER YA
+192A LIMBU SUBJOINED LETTER RA
+192B LIMBU SUBJOINED LETTER WA
+@ Final consonants
+1930 LIMBU SMALL LETTER KA
+1931 LIMBU SMALL LETTER NGA
+1932 LIMBU SMALL LETTER ANUSVARA
+1933 LIMBU SMALL LETTER TA
+1934 LIMBU SMALL LETTER NA
+1935 LIMBU SMALL LETTER PA
+1936 LIMBU SMALL LETTER MA
+1937 LIMBU SMALL LETTER RA
+1938 LIMBU SMALL LETTER LA
+@ Various signs
+1939 LIMBU SIGN MUKPHRENG
+193A LIMBU SIGN KEMPHRENG
+193B LIMBU SIGN SA-I
+1940 LIMBU SIGN LOO
+1944 LIMBU EXCLAMATION MARK
+1945 LIMBU QUESTION MARK
+@ Digits
+1946 LIMBU DIGIT ZERO
+1947 LIMBU DIGIT ONE
+1948 LIMBU DIGIT TWO
+1949 LIMBU DIGIT THREE
+194A LIMBU DIGIT FOUR
+194B LIMBU DIGIT FIVE
+194C LIMBU DIGIT SIX
+194D LIMBU DIGIT SEVEN
+194E LIMBU DIGIT EIGHT
+194F LIMBU DIGIT NINE
+@@ 1950 Tai Le 197F
+@+ Note the similarly named but distinct New Tai Lue script encoded at U+1980..U+19DF.
+@ Consonants
+1950 TAI LE LETTER KA
+1951 TAI LE LETTER XA
+1952 TAI LE LETTER NGA
+1953 TAI LE LETTER TSA
+1954 TAI LE LETTER SA
+1955 TAI LE LETTER YA
+1956 TAI LE LETTER TA
+1957 TAI LE LETTER THA
+1958 TAI LE LETTER LA
+1959 TAI LE LETTER PA
+195A TAI LE LETTER PHA
+195B TAI LE LETTER MA
+195C TAI LE LETTER FA
+195D TAI LE LETTER VA
+195E TAI LE LETTER HA
+195F TAI LE LETTER QA
+1960 TAI LE LETTER KHA
+1961 TAI LE LETTER TSHA
+1962 TAI LE LETTER NA
+@ Vowels
+1963 TAI LE LETTER A
+1964 TAI LE LETTER I
+1965 TAI LE LETTER EE
+1966 TAI LE LETTER EH
+1967 TAI LE LETTER U
+1968 TAI LE LETTER OO
+1969 TAI LE LETTER O
+196A TAI LE LETTER UE
+196B TAI LE LETTER E
+196C TAI LE LETTER AUE
+196D TAI LE LETTER AI
+@ Tone letters
+1970 TAI LE LETTER TONE-2
+1971 TAI LE LETTER TONE-3
+1972 TAI LE LETTER TONE-4
+1973 TAI LE LETTER TONE-5
+1974 TAI LE LETTER TONE-6
+@@ 1980 New Tai Lue 19DF
+@+ Note the similarly named but distinct Tai Le script encoded at U+1950..U+197F. The New Tai Lue script is also known as Xishuang Banna Dai.
+@ Consonants
+1980 NEW TAI LUE LETTER HIGH QA
+1981 NEW TAI LUE LETTER LOW QA
+1982 NEW TAI LUE LETTER HIGH KA
+1983 NEW TAI LUE LETTER HIGH XA
+1984 NEW TAI LUE LETTER HIGH NGA
+1985 NEW TAI LUE LETTER LOW KA
+1986 NEW TAI LUE LETTER LOW XA
+1987 NEW TAI LUE LETTER LOW NGA
+1988 NEW TAI LUE LETTER HIGH TSA
+1989 NEW TAI LUE LETTER HIGH SA
+198A NEW TAI LUE LETTER HIGH YA
+198B NEW TAI LUE LETTER LOW TSA
+198C NEW TAI LUE LETTER LOW SA
+198D NEW TAI LUE LETTER LOW YA
+198E NEW TAI LUE LETTER HIGH TA
+198F NEW TAI LUE LETTER HIGH THA
+1990 NEW TAI LUE LETTER HIGH NA
+1991 NEW TAI LUE LETTER LOW TA
+1992 NEW TAI LUE LETTER LOW THA
+1993 NEW TAI LUE LETTER LOW NA
+1994 NEW TAI LUE LETTER HIGH PA
+1995 NEW TAI LUE LETTER HIGH PHA
+1996 NEW TAI LUE LETTER HIGH MA
+1997 NEW TAI LUE LETTER LOW PA
+1998 NEW TAI LUE LETTER LOW PHA
+1999 NEW TAI LUE LETTER LOW MA
+199A NEW TAI LUE LETTER HIGH FA
+199B NEW TAI LUE LETTER HIGH VA
+199C NEW TAI LUE LETTER HIGH LA
+199D NEW TAI LUE LETTER LOW FA
+199E NEW TAI LUE LETTER LOW VA
+199F NEW TAI LUE LETTER LOW LA
+19A0 NEW TAI LUE LETTER HIGH HA
+19A1 NEW TAI LUE LETTER HIGH DA
+19A2 NEW TAI LUE LETTER HIGH BA
+19A3 NEW TAI LUE LETTER LOW HA
+19A4 NEW TAI LUE LETTER LOW DA
+19A5 NEW TAI LUE LETTER LOW BA
+19A6 NEW TAI LUE LETTER HIGH KVA
+19A7 NEW TAI LUE LETTER HIGH XVA
+19A8 NEW TAI LUE LETTER LOW KVA
+19A9 NEW TAI LUE LETTER LOW XVA
+@ Vowel signs
+19B0 NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
+19B1 NEW TAI LUE VOWEL SIGN AA
+19B2 NEW TAI LUE VOWEL SIGN II
+19B3 NEW TAI LUE VOWEL SIGN U
+19B4 NEW TAI LUE VOWEL SIGN UU
+19B5 NEW TAI LUE VOWEL SIGN E
+19B6 NEW TAI LUE VOWEL SIGN AE
+19B7 NEW TAI LUE VOWEL SIGN O
+19B8 NEW TAI LUE VOWEL SIGN OA
+19B9 NEW TAI LUE VOWEL SIGN UE
+19BA NEW TAI LUE VOWEL SIGN AY
+19BB NEW TAI LUE VOWEL SIGN AAY
+19BC NEW TAI LUE VOWEL SIGN UY
+19BD NEW TAI LUE VOWEL SIGN OY
+19BE NEW TAI LUE VOWEL SIGN OAY
+19BF NEW TAI LUE VOWEL SIGN UEY
+19C0 NEW TAI LUE VOWEL SIGN IY
+@ Final consonants
+19C1 NEW TAI LUE LETTER FINAL V
+19C2 NEW TAI LUE LETTER FINAL NG
+19C3 NEW TAI LUE LETTER FINAL N
+19C4 NEW TAI LUE LETTER FINAL M
+19C5 NEW TAI LUE LETTER FINAL K
+19C6 NEW TAI LUE LETTER FINAL D
+19C7 NEW TAI LUE LETTER FINAL B
+@ Tone marks
+19C8 NEW TAI LUE TONE MARK-1
+19C9 NEW TAI LUE TONE MARK-2
+@ Digits
+19D0 NEW TAI LUE DIGIT ZERO
+19D1 NEW TAI LUE DIGIT ONE
+19D2 NEW TAI LUE DIGIT TWO
+19D3 NEW TAI LUE DIGIT THREE
+19D4 NEW TAI LUE DIGIT FOUR
+19D5 NEW TAI LUE DIGIT FIVE
+19D6 NEW TAI LUE DIGIT SIX
+19D7 NEW TAI LUE DIGIT SEVEN
+19D8 NEW TAI LUE DIGIT EIGHT
+19D9 NEW TAI LUE DIGIT NINE
+@ Various signs
+19DE NEW TAI LUE SIGN LAE
+ * conjunction: and
+19DF NEW TAI LUE SIGN LAEV
+ * perfective
+@@ 19E0 Khmer Symbols 19FF
+@ Lunar date symbols
+19E0 KHMER SYMBOL PATHAMASAT
+ * represents the first August in a leap year
+@+ The following fifteen characters represent the first through the fifteenth waxing days, respectively.
+19E1 KHMER SYMBOL MUOY KOET
+19E2 KHMER SYMBOL PII KOET
+19E3 KHMER SYMBOL BEI KOET
+19E4 KHMER SYMBOL BUON KOET
+19E5 KHMER SYMBOL PRAM KOET
+19E6 KHMER SYMBOL PRAM-MUOY KOET
+19E7 KHMER SYMBOL PRAM-PII KOET
+19E8 KHMER SYMBOL PRAM-BEI KOET
+19E9 KHMER SYMBOL PRAM-BUON KOET
+19EA KHMER SYMBOL DAP KOET
+19EB KHMER SYMBOL DAP-MUOY KOET
+19EC KHMER SYMBOL DAP-PII KOET
+19ED KHMER SYMBOL DAP-BEI KOET
+19EE KHMER SYMBOL DAP-BUON KOET
+19EF KHMER SYMBOL DAP-PRAM KOET
+19F0 KHMER SYMBOL TUTEYASAT
+ * represents the second August in a leap year
+@+ The following fifteen characters represent the first through the fifteenth waning days, respectively.
+19F1 KHMER SYMBOL MUOY ROC
+19F2 KHMER SYMBOL PII ROC
+19F3 KHMER SYMBOL BEI ROC
+19F4 KHMER SYMBOL BUON ROC
+19F5 KHMER SYMBOL PRAM ROC
+19F6 KHMER SYMBOL PRAM-MUOY ROC
+19F7 KHMER SYMBOL PRAM-PII ROC
+19F8 KHMER SYMBOL PRAM-BEI ROC
+19F9 KHMER SYMBOL PRAM-BUON ROC
+19FA KHMER SYMBOL DAP ROC
+19FB KHMER SYMBOL DAP-MUOY ROC
+19FC KHMER SYMBOL DAP-PII ROC
+19FD KHMER SYMBOL DAP-BEI ROC
+19FE KHMER SYMBOL DAP-BUON ROC
+19FF KHMER SYMBOL DAP-PRAM ROC
+@@ 1A00 Buginese 1A1F
+@+ This script is also known as Lontara.
+@ Consonants
+1A00 BUGINESE LETTER KA
+1A01 BUGINESE LETTER GA
+1A02 BUGINESE LETTER NGA
+1A03 BUGINESE LETTER NGKA
+1A04 BUGINESE LETTER PA
+1A05 BUGINESE LETTER BA
+1A06 BUGINESE LETTER MA
+1A07 BUGINESE LETTER MPA
+1A08 BUGINESE LETTER TA
+1A09 BUGINESE LETTER DA
+1A0A BUGINESE LETTER NA
+1A0B BUGINESE LETTER NRA
+1A0C BUGINESE LETTER CA
+1A0D BUGINESE LETTER JA
+1A0E BUGINESE LETTER NYA
+1A0F BUGINESE LETTER NYCA
+1A10 BUGINESE LETTER YA
+1A11 BUGINESE LETTER RA
+1A12 BUGINESE LETTER LA
+1A13 BUGINESE LETTER VA
+1A14 BUGINESE LETTER SA
+1A15 BUGINESE LETTER A
+1A16 BUGINESE LETTER HA
+@ Vowels
+1A17 BUGINESE VOWEL SIGN I
+1A18 BUGINESE VOWEL SIGN U
+1A19 BUGINESE VOWEL SIGN E
+1A1A BUGINESE VOWEL SIGN O
+1A1B BUGINESE VOWEL SIGN AE
+@ Various signs
+1A1E BUGINESE PALLAWA
+1A1F BUGINESE END OF SECTION
+@@ 1B00 Balinese 1B7F
+@ Various signs
+1B00 BALINESE SIGN ULU RICEM (ardhacandra)
+ = ardhacandra
+1B01 BALINESE SIGN ULU CANDRA (candrabindu)
+ = candrabindu
+1B02 BALINESE SIGN CECEK (anusvara)
+ = anusvara
+1B03 BALINESE SIGN SURANG (repha)
+ = repha
+1B04 BALINESE SIGN BISAH (visarga)
+ = visarga
+@ Independent vowels
+1B05 BALINESE LETTER AKARA (a)
+ = a
+1B06 BALINESE LETTER AKARA TEDUNG (aa)
+ = aa
+ : 1B05 1B35
+1B07 BALINESE LETTER IKARA (i)
+ = i
+1B08 BALINESE LETTER IKARA TEDUNG (ii)
+ = ii
+ : 1B07 1B35
+1B09 BALINESE LETTER UKARA (u)
+ = u
+1B0A BALINESE LETTER UKARA TEDUNG (uu)
+ = uu
+ : 1B09 1B35
+1B0B BALINESE LETTER RA REPA (vocalic r)
+ = vocalic r
+1B0C BALINESE LETTER RA REPA TEDUNG (vocalic rr)
+ = vocalic rr
+ : 1B0B 1B35
+1B0D BALINESE LETTER LA LENGA (vocalic l)
+ = vocalic l
+1B0E BALINESE LETTER LA LENGA TEDUNG (vocalic ll)
+ = vocalic ll
+ : 1B0D 1B35
+1B0F BALINESE LETTER EKARA (e)
+ = e
+1B10 BALINESE LETTER AIKARA (ai)
+ = ai
+1B11 BALINESE LETTER OKARA (o)
+ = o
+1B12 BALINESE LETTER OKARA TEDUNG (au)
+ = au
+ : 1B11 1B35
+@ Consonants
+1B13 BALINESE LETTER KA
+1B14 BALINESE LETTER KA MAHAPRANA (kha)
+ = kha
+1B15 BALINESE LETTER GA
+1B16 BALINESE LETTER GA GORA (gha)
+ = gha
+1B17 BALINESE LETTER NGA
+1B18 BALINESE LETTER CA
+1B19 BALINESE LETTER CA LACA (cha)
+ = cha
+1B1A BALINESE LETTER JA
+1B1B BALINESE LETTER JA JERA (jha)
+ = jha
+1B1C BALINESE LETTER NYA
+1B1D BALINESE LETTER TA LATIK (tta)
+ = tta
+1B1E BALINESE LETTER TA MURDA MAHAPRANA (ttha)
+ = ttha
+1B1F BALINESE LETTER DA MURDA ALPAPRANA (dda)
+ = dda
+1B20 BALINESE LETTER DA MURDA MAHAPRANA (ddha)
+ = ddha
+1B21 BALINESE LETTER NA RAMBAT (nna)
+ = nna
+1B22 BALINESE LETTER TA
+1B23 BALINESE LETTER TA TAWA (tha)
+ = tha
+1B24 BALINESE LETTER DA
+1B25 BALINESE LETTER DA MADU (dha)
+ = dha
+1B26 BALINESE LETTER NA
+1B27 BALINESE LETTER PA
+1B28 BALINESE LETTER PA KAPAL (pha)
+ = pha
+1B29 BALINESE LETTER BA
+1B2A BALINESE LETTER BA KEMBANG (bha)
+ = bha
+1B2B BALINESE LETTER MA
+1B2C BALINESE LETTER YA
+1B2D BALINESE LETTER RA
+1B2E BALINESE LETTER LA
+1B2F BALINESE LETTER WA
+1B30 BALINESE LETTER SA SAGA (sha)
+ = sha
+1B31 BALINESE LETTER SA SAPA (ssa)
+ = ssa
+1B32 BALINESE LETTER SA
+1B33 BALINESE LETTER HA
+@ Sign
+1B34 BALINESE SIGN REREKAN (nukta)
+ = nukta
+@ Dependent vowel signs
+1B35 BALINESE VOWEL SIGN TEDUNG (aa)
+ = aa
+1B36 BALINESE VOWEL SIGN ULU (i)
+ = i
+1B37 BALINESE VOWEL SIGN ULU SARI (ii)
+ = ii
+1B38 BALINESE VOWEL SIGN SUKU (u)
+ = u
+1B39 BALINESE VOWEL SIGN SUKU ILUT (uu)
+ = uu
+1B3A BALINESE VOWEL SIGN RA REPA (vocalic r)
+ = vocalic r
+1B3B BALINESE VOWEL SIGN RA REPA TEDUNG (vocalic rr)
+ = vocalic rr
+ : 1B3A 1B35
+1B3C BALINESE VOWEL SIGN LA LENGA (vocalic l)
+ = vocalic l
+1B3D BALINESE VOWEL SIGN LA LENGA TEDUNG (vocalic ll)
+ = vocalic ll
+ : 1B3C 1B35
+1B3E BALINESE VOWEL SIGN TALING (e)
+ = e
+1B3F BALINESE VOWEL SIGN TALING REPA (ai)
+ = ai
+1B40 BALINESE VOWEL SIGN TALING TEDUNG (o)
+ = o
+ : 1B3E 1B35
+1B41 BALINESE VOWEL SIGN TALING REPA TEDUNG (au)
+ = au
+ : 1B3F 1B35
+1B42 BALINESE VOWEL SIGN PEPET (ae)
+ = ae
+1B43 BALINESE VOWEL SIGN PEPET TEDUNG (oe)
+ = oe
+ : 1B42 1B35
+@ Sign
+1B44 BALINESE ADEG ADEG (virama)
+ = virama
+@ Additional consonants
+1B45 BALINESE LETTER KAF SASAK
+1B46 BALINESE LETTER KHOT SASAK
+1B47 BALINESE LETTER TZIR SASAK
+1B48 BALINESE LETTER EF SASAK
+1B49 BALINESE LETTER VE SASAK
+1B4A BALINESE LETTER ZAL SASAK
+1B4B BALINESE LETTER ASYURA SASAK
+@ Digits
+1B50 BALINESE DIGIT ZERO
+1B51 BALINESE DIGIT ONE
+1B52 BALINESE DIGIT TWO
+1B53 BALINESE DIGIT THREE
+1B54 BALINESE DIGIT FOUR
+1B55 BALINESE DIGIT FIVE
+1B56 BALINESE DIGIT SIX
+1B57 BALINESE DIGIT SEVEN
+1B58 BALINESE DIGIT EIGHT
+1B59 BALINESE DIGIT NINE
+@ Punctuation
+1B5A BALINESE PANTI (section)
+ = section
+1B5B BALINESE PAMADA (honorific section)
+ = honorific section
+1B5C BALINESE WINDU (punctuation ring)
+ = punctuation ring
+1B5D BALINESE CARIK PAMUNGKAH (colon)
+ = colon
+1B5E BALINESE CARIK SIKI (danda)
+ = danda
+ x (devanagari danda - 0964)
+1B5F BALINESE CARIK PAREREN (double danda)
+ = double danda
+ x (devanagari double danda - 0965)
+1B60 BALINESE PAMENENG (line-breaking hyphen)
+ = line-breaking hyphen
+@ Musical symbols for notes
+1B61 BALINESE MUSICAL SYMBOL DONG
+1B62 BALINESE MUSICAL SYMBOL DENG
+1B63 BALINESE MUSICAL SYMBOL DUNG
+1B64 BALINESE MUSICAL SYMBOL DANG
+1B65 BALINESE MUSICAL SYMBOL DANG SURANG
+1B66 BALINESE MUSICAL SYMBOL DING
+1B67 BALINESE MUSICAL SYMBOL DAENG
+1B68 BALINESE MUSICAL SYMBOL DEUNG
+1B69 BALINESE MUSICAL SYMBOL DAING
+1B6A BALINESE MUSICAL SYMBOL DANG GEDE
+@ Diacritical marks for musical symbols
+1B6B BALINESE MUSICAL SYMBOL COMBINING TEGEH
+1B6C BALINESE MUSICAL SYMBOL COMBINING ENDEP
+1B6D BALINESE MUSICAL SYMBOL COMBINING KEMPUL
+1B6E BALINESE MUSICAL SYMBOL COMBINING KEMPLI
+1B6F BALINESE MUSICAL SYMBOL COMBINING JEGOGAN
+1B70 BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN
+1B71 BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN
+1B72 BALINESE MUSICAL SYMBOL COMBINING BENDE
+1B73 BALINESE MUSICAL SYMBOL COMBINING GONG
+@ Musical symbols
+1B74 BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG
+1B75 BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG
+1B76 BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK
+1B77 BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK
+1B78 BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG
+1B79 BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG
+1B7A BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK
+1B7B BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK
+1B7C BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+@@ 1B80 Sundanese 1BBF
+@ Various signs
+1B80 SUNDANESE SIGN PANYECEK
+ = anusvara
+1B81 SUNDANESE SIGN PANGLAYAR
+ = repha
+1B82 SUNDANESE SIGN PANGWISAD
+ = visarga
+@ Vowels
+1B83 SUNDANESE LETTER A
+1B84 SUNDANESE LETTER I
+1B85 SUNDANESE LETTER U
+1B86 SUNDANESE LETTER AE
+1B87 SUNDANESE LETTER O
+1B88 SUNDANESE LETTER E
+1B89 SUNDANESE LETTER EU
+@ Consonants
+1B8A SUNDANESE LETTER KA
+1B8B SUNDANESE LETTER QA
+1B8C SUNDANESE LETTER GA
+1B8D SUNDANESE LETTER NGA
+1B8E SUNDANESE LETTER CA
+1B8F SUNDANESE LETTER JA
+1B90 SUNDANESE LETTER ZA
+1B91 SUNDANESE LETTER NYA
+1B92 SUNDANESE LETTER TA
+1B93 SUNDANESE LETTER DA
+1B94 SUNDANESE LETTER NA
+1B95 SUNDANESE LETTER PA
+1B96 SUNDANESE LETTER FA
+1B97 SUNDANESE LETTER VA
+1B98 SUNDANESE LETTER BA
+1B99 SUNDANESE LETTER MA
+1B9A SUNDANESE LETTER YA
+1B9B SUNDANESE LETTER RA
+1B9C SUNDANESE LETTER LA
+1B9D SUNDANESE LETTER WA
+1B9E SUNDANESE LETTER SA
+1B9F SUNDANESE LETTER XA
+1BA0 SUNDANESE LETTER HA
+@ Consonants signs
+1BA1 SUNDANESE CONSONANT SIGN PAMINGKAL
+ = subjoined ya
+1BA2 SUNDANESE CONSONANT SIGN PANYAKRA
+ = subjoined ra
+1BA3 SUNDANESE CONSONANT SIGN PANYIKU
+ = subjoined la
+@ Vowel signs
+1BA4 SUNDANESE VOWEL SIGN PANGHULU
+ = i
+1BA5 SUNDANESE VOWEL SIGN PANYUKU
+ = u
+1BA6 SUNDANESE VOWEL SIGN PANAELAENG
+ = ae
+1BA7 SUNDANESE VOWEL SIGN PANOLONG
+ = o
+1BA8 SUNDANESE VOWEL SIGN PAMEPET
+ = e
+1BA9 SUNDANESE VOWEL SIGN PANEULEUNG
+ = eu
+@ Virama
+1BAA SUNDANESE SIGN PAMAAEH
+ = virama
+ * does not form conjuncts
+@ Additional consonants
+1BAE SUNDANESE LETTER KHA
+1BAF SUNDANESE LETTER SYA
+@ Digits
+1BB0 SUNDANESE DIGIT ZERO
+1BB1 SUNDANESE DIGIT ONE
+1BB2 SUNDANESE DIGIT TWO
+1BB3 SUNDANESE DIGIT THREE
+1BB4 SUNDANESE DIGIT FOUR
+1BB5 SUNDANESE DIGIT FIVE
+1BB6 SUNDANESE DIGIT SIX
+1BB7 SUNDANESE DIGIT SEVEN
+1BB8 SUNDANESE DIGIT EIGHT
+1BB9 SUNDANESE DIGIT NINE
+@@ 1C00 Lepcha 1C4F
+@ Consonants
+1C00 LEPCHA LETTER KA
+1C01 LEPCHA LETTER KLA
+1C02 LEPCHA LETTER KHA
+1C03 LEPCHA LETTER GA
+1C04 LEPCHA LETTER GLA
+1C05 LEPCHA LETTER NGA
+1C06 LEPCHA LETTER CA
+1C07 LEPCHA LETTER CHA
+1C08 LEPCHA LETTER JA
+1C09 LEPCHA LETTER NYA
+1C0A LEPCHA LETTER TA
+1C0B LEPCHA LETTER THA
+1C0C LEPCHA LETTER DA
+1C0D LEPCHA LETTER NA
+1C0E LEPCHA LETTER PA
+1C0F LEPCHA LETTER PLA
+1C10 LEPCHA LETTER PHA
+1C11 LEPCHA LETTER FA
+1C12 LEPCHA LETTER FLA
+1C13 LEPCHA LETTER BA
+1C14 LEPCHA LETTER BLA
+1C15 LEPCHA LETTER MA
+1C16 LEPCHA LETTER MLA
+1C17 LEPCHA LETTER TSA
+1C18 LEPCHA LETTER TSHA
+1C19 LEPCHA LETTER DZA
+1C1A LEPCHA LETTER YA
+1C1B LEPCHA LETTER RA
+1C1C LEPCHA LETTER LA
+1C1D LEPCHA LETTER HA
+1C1E LEPCHA LETTER HLA
+1C1F LEPCHA LETTER VA
+1C20 LEPCHA LETTER SA
+1C21 LEPCHA LETTER SHA
+1C22 LEPCHA LETTER WA
+1C23 LEPCHA LETTER A
+@ Subjoined consonants
+1C24 LEPCHA SUBJOINED LETTER YA
+1C25 LEPCHA SUBJOINED LETTER RA
+@ Dependent vowels
+1C26 LEPCHA VOWEL SIGN AA
+1C27 LEPCHA VOWEL SIGN I
+1C28 LEPCHA VOWEL SIGN O
+1C29 LEPCHA VOWEL SIGN OO
+1C2A LEPCHA VOWEL SIGN U
+1C2B LEPCHA VOWEL SIGN UU
+1C2C LEPCHA VOWEL SIGN E
+@ Consonant signs
+1C2D LEPCHA CONSONANT SIGN K
+1C2E LEPCHA CONSONANT SIGN M
+1C2F LEPCHA CONSONANT SIGN L
+1C30 LEPCHA CONSONANT SIGN N
+1C31 LEPCHA CONSONANT SIGN P
+1C32 LEPCHA CONSONANT SIGN R
+1C33 LEPCHA CONSONANT SIGN T
+1C34 LEPCHA CONSONANT SIGN NYIN-DO
+1C35 LEPCHA CONSONANT SIGN KANG
+@ Various signs
+1C36 LEPCHA SIGN RAN
+1C37 LEPCHA SIGN NUKTA
+@ Punctuation
+1C3B LEPCHA PUNCTUATION TA-ROL
+1C3C LEPCHA PUNCTUATION NYET THYOOM TA-ROL
+1C3D LEPCHA PUNCTUATION CER-WA
+1C3E LEPCHA PUNCTUATION TSHOOK CER-WA
+1C3F LEPCHA PUNCTUATION TSHOOK
+@ Digits
+1C40 LEPCHA DIGIT ZERO
+1C41 LEPCHA DIGIT ONE
+1C42 LEPCHA DIGIT TWO
+1C43 LEPCHA DIGIT THREE
+1C44 LEPCHA DIGIT FOUR
+1C45 LEPCHA DIGIT FIVE
+1C46 LEPCHA DIGIT SIX
+1C47 LEPCHA DIGIT SEVEN
+1C48 LEPCHA DIGIT EIGHT
+1C49 LEPCHA DIGIT NINE
+@ Additional letters
+1C4D LEPCHA LETTER TTA
+1C4E LEPCHA LETTER TTHA
+1C4F LEPCHA LETTER DDA
+@@ 1C50 Ol Chiki 1C7F
+@ Digits
+1C50 OL CHIKI DIGIT ZERO
+1C51 OL CHIKI DIGIT ONE
+1C52 OL CHIKI DIGIT TWO
+1C53 OL CHIKI DIGIT THREE
+1C54 OL CHIKI DIGIT FOUR
+1C55 OL CHIKI DIGIT FIVE
+1C56 OL CHIKI DIGIT SIX
+1C57 OL CHIKI DIGIT SEVEN
+1C58 OL CHIKI DIGIT EIGHT
+1C59 OL CHIKI DIGIT NINE
+@ Letters
+1C5A OL CHIKI LETTER LA
+1C5B OL CHIKI LETTER AT
+1C5C OL CHIKI LETTER AG
+1C5D OL CHIKI LETTER ANG
+1C5E OL CHIKI LETTER AL
+1C5F OL CHIKI LETTER LAA
+1C60 OL CHIKI LETTER AAK
+1C61 OL CHIKI LETTER AAJ
+1C62 OL CHIKI LETTER AAM
+1C63 OL CHIKI LETTER AAW
+1C64 OL CHIKI LETTER LI
+1C65 OL CHIKI LETTER IS
+1C66 OL CHIKI LETTER IH
+1C67 OL CHIKI LETTER INY
+1C68 OL CHIKI LETTER IR
+1C69 OL CHIKI LETTER LU
+1C6A OL CHIKI LETTER UC
+1C6B OL CHIKI LETTER UD
+1C6C OL CHIKI LETTER UNN
+1C6D OL CHIKI LETTER UY
+1C6E OL CHIKI LETTER LE
+1C6F OL CHIKI LETTER EP
+1C70 OL CHIKI LETTER EDD
+1C71 OL CHIKI LETTER EN
+1C72 OL CHIKI LETTER ERR
+1C73 OL CHIKI LETTER LO
+1C74 OL CHIKI LETTER OTT
+1C75 OL CHIKI LETTER OB
+1C76 OL CHIKI LETTER OV
+1C77 OL CHIKI LETTER OH
+@ Modifier letters
+1C78 OL CHIKI MU TTUDDAG
+ * nasalization mark
+1C79 OL CHIKI GAAHLAA TTUDDAAG
+ * vowel modifier
+1C7A OL CHIKI MU-GAAHLAA TTUDDAAG
+1C7B OL CHIKI RELAA
+ * length mark
+1C7C OL CHIKI PHAARKAA
+ * glottal protector
+1C7D OL CHIKI AHAD
+ * deglottalizes consonants
+@ Punctuation
+1C7E OL CHIKI PUNCTUATION MUCAAD
+1C7F OL CHIKI PUNCTUATION DOUBLE MUCAAD
+@@ 1D00 Phonetic Extensions 1D7F
+@+ These are non-IPA phonetic extensions, mostly for the Uralic Phonetic Alphabet (UPA).
+@+ The small capitals, superscript, and subscript forms are for phonetic representations where style variations are semantically important.
+@+ For general text, use regular Latin, Greek or Cyrillic letters with markup instead.
+@ Latin letters
+1D00 LATIN LETTER SMALL CAPITAL A
+1D01 LATIN LETTER SMALL CAPITAL AE
+1D02 LATIN SMALL LETTER TURNED AE
+ * glyph can also have sideways orientation
+1D03 LATIN LETTER SMALL CAPITAL BARRED B
+1D04 LATIN LETTER SMALL CAPITAL C
+1D05 LATIN LETTER SMALL CAPITAL D
+1D06 LATIN LETTER SMALL CAPITAL ETH
+1D07 LATIN LETTER SMALL CAPITAL E
+1D08 LATIN SMALL LETTER TURNED OPEN E
+1D09 LATIN SMALL LETTER TURNED I
+1D0A LATIN LETTER SMALL CAPITAL J
+1D0B LATIN LETTER SMALL CAPITAL K
+1D0C LATIN LETTER SMALL CAPITAL L WITH STROKE
+1D0D LATIN LETTER SMALL CAPITAL M
+1D0E LATIN LETTER SMALL CAPITAL REVERSED N
+1D0F LATIN LETTER SMALL CAPITAL O
+1D10 LATIN LETTER SMALL CAPITAL OPEN O
+1D11 LATIN SMALL LETTER SIDEWAYS O
+1D12 LATIN SMALL LETTER SIDEWAYS OPEN O
+1D13 LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+1D14 LATIN SMALL LETTER TURNED OE
+ * glyph can also have sideways orientation
+1D15 LATIN LETTER SMALL CAPITAL OU
+1D16 LATIN SMALL LETTER TOP HALF O
+1D17 LATIN SMALL LETTER BOTTOM HALF O
+1D18 LATIN LETTER SMALL CAPITAL P
+ * represents a semi-voiced [p]
+1D19 LATIN LETTER SMALL CAPITAL REVERSED R
+1D1A LATIN LETTER SMALL CAPITAL TURNED R
+1D1B LATIN LETTER SMALL CAPITAL T
+1D1C LATIN LETTER SMALL CAPITAL U
+1D1D LATIN SMALL LETTER SIDEWAYS U
+1D1E LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+ * glyph can also have turned orientation
+1D1F LATIN SMALL LETTER SIDEWAYS TURNED M
+1D20 LATIN LETTER SMALL CAPITAL V
+1D21 LATIN LETTER SMALL CAPITAL W
+1D22 LATIN LETTER SMALL CAPITAL Z
+1D23 LATIN LETTER SMALL CAPITAL EZH
+1D24 LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25 LATIN LETTER AIN
+@ Greek letters
+1D26 GREEK LETTER SMALL CAPITAL GAMMA
+1D27 GREEK LETTER SMALL CAPITAL LAMDA
+1D28 GREEK LETTER SMALL CAPITAL PI
+1D29 GREEK LETTER SMALL CAPITAL RHO
+ * represents a voiceless uvular trill
+1D2A GREEK LETTER SMALL CAPITAL PSI
+@ Cyrillic letter
+1D2B CYRILLIC LETTER SMALL CAPITAL EL
+ * in italic style, the glyph is obliqued, not italicized
+ x (cyrillic small letter el - 043B)
+@ Latin superscript modifier letters
+1D2C MODIFIER LETTER CAPITAL A
+ # <super> 0041
+1D2D MODIFIER LETTER CAPITAL AE
+ # <super> 00C6
+1D2E MODIFIER LETTER CAPITAL B
+ # <super> 0042
+1D2F MODIFIER LETTER CAPITAL BARRED B
+1D30 MODIFIER LETTER CAPITAL D
+ # <super> 0044
+1D31 MODIFIER LETTER CAPITAL E
+ # <super> 0045
+1D32 MODIFIER LETTER CAPITAL REVERSED E
+ # <super> 018E
+1D33 MODIFIER LETTER CAPITAL G
+ # <super> 0047
+1D34 MODIFIER LETTER CAPITAL H
+ # <super> 0048
+1D35 MODIFIER LETTER CAPITAL I
+ # <super> 0049
+1D36 MODIFIER LETTER CAPITAL J
+ # <super> 004A
+1D37 MODIFIER LETTER CAPITAL K
+ # <super> 004B
+1D38 MODIFIER LETTER CAPITAL L
+ # <super> 004C
+1D39 MODIFIER LETTER CAPITAL M
+ # <super> 004D
+1D3A MODIFIER LETTER CAPITAL N
+ # <super> 004E
+1D3B MODIFIER LETTER CAPITAL REVERSED N
+1D3C MODIFIER LETTER CAPITAL O
+ # <super> 004F
+1D3D MODIFIER LETTER CAPITAL OU
+ # <super> 0222
+1D3E MODIFIER LETTER CAPITAL P
+ # <super> 0050
+1D3F MODIFIER LETTER CAPITAL R
+ # <super> 0052
+1D40 MODIFIER LETTER CAPITAL T
+ # <super> 0054
+1D41 MODIFIER LETTER CAPITAL U
+ # <super> 0055
+1D42 MODIFIER LETTER CAPITAL W
+ # <super> 0057
+1D43 MODIFIER LETTER SMALL A
+ # <super> 0061
+1D44 MODIFIER LETTER SMALL TURNED A
+ # <super> 0250
+1D45 MODIFIER LETTER SMALL ALPHA
+ # <super> 0251
+1D46 MODIFIER LETTER SMALL TURNED AE
+ # <super> 1D02
+1D47 MODIFIER LETTER SMALL B
+ # <super> 0062
+1D48 MODIFIER LETTER SMALL D
+ # <super> 0064
+1D49 MODIFIER LETTER SMALL E
+ # <super> 0065
+1D4A MODIFIER LETTER SMALL SCHWA
+ # <super> 0259
+1D4B MODIFIER LETTER SMALL OPEN E
+ # <super> 025B
+1D4C MODIFIER LETTER SMALL TURNED OPEN E
+ * more appropriate equivalence would be to 1D08
+ # <super> 025C
+1D4D MODIFIER LETTER SMALL G
+ # <super> 0067
+1D4E MODIFIER LETTER SMALL TURNED I
+1D4F MODIFIER LETTER SMALL K
+ # <super> 006B
+1D50 MODIFIER LETTER SMALL M
+ # <super> 006D
+1D51 MODIFIER LETTER SMALL ENG
+ # <super> 014B
+1D52 MODIFIER LETTER SMALL O
+ # <super> 006F
+1D53 MODIFIER LETTER SMALL OPEN O
+ # <super> 0254
+1D54 MODIFIER LETTER SMALL TOP HALF O
+ # <super> 1D16
+1D55 MODIFIER LETTER SMALL BOTTOM HALF O
+ # <super> 1D17
+1D56 MODIFIER LETTER SMALL P
+ # <super> 0070
+1D57 MODIFIER LETTER SMALL T
+ # <super> 0074
+1D58 MODIFIER LETTER SMALL U
+ # <super> 0075
+1D59 MODIFIER LETTER SMALL SIDEWAYS U
+ # <super> 1D1D
+1D5A MODIFIER LETTER SMALL TURNED M
+ # <super> 026F
+1D5B MODIFIER LETTER SMALL V
+ # <super> 0076
+1D5C MODIFIER LETTER SMALL AIN
+ # <super> 1D25
+@ Greek superscript modifier letters
+1D5D MODIFIER LETTER SMALL BETA
+ # <super> 03B2
+1D5E MODIFIER LETTER SMALL GREEK GAMMA
+ # <super> 03B3
+1D5F MODIFIER LETTER SMALL DELTA
+ # <super> 03B4
+1D60 MODIFIER LETTER SMALL GREEK PHI
+ # <super> 03C6
+1D61 MODIFIER LETTER SMALL CHI
+ # <super> 03C7
+@ Latin subscript modifier letters
+1D62 LATIN SUBSCRIPT SMALL LETTER I
+ # <sub> 0069
+1D63 LATIN SUBSCRIPT SMALL LETTER R
+ # <sub> 0072
+1D64 LATIN SUBSCRIPT SMALL LETTER U
+ # <sub> 0075
+1D65 LATIN SUBSCRIPT SMALL LETTER V
+ # <sub> 0076
+@ Greek subscript modifier letters
+1D66 GREEK SUBSCRIPT SMALL LETTER BETA
+ # <sub> 03B2
+1D67 GREEK SUBSCRIPT SMALL LETTER GAMMA
+ # <sub> 03B3
+1D68 GREEK SUBSCRIPT SMALL LETTER RHO
+ # <sub> 03C1
+1D69 GREEK SUBSCRIPT SMALL LETTER PHI
+ # <sub> 03C6
+1D6A GREEK SUBSCRIPT SMALL LETTER CHI
+ # <sub> 03C7
+@ Latin letter
+1D6B LATIN SMALL LETTER UE
+@ Latin letters with middle tilde
+@+ An additional letter with middle tilde is found in another block.
+ x (latin small letter l with middle tilde - 026B)
+1D6C LATIN SMALL LETTER B WITH MIDDLE TILDE
+1D6D LATIN SMALL LETTER D WITH MIDDLE TILDE
+1D6E LATIN SMALL LETTER F WITH MIDDLE TILDE
+1D6F LATIN SMALL LETTER M WITH MIDDLE TILDE
+1D70 LATIN SMALL LETTER N WITH MIDDLE TILDE
+1D71 LATIN SMALL LETTER P WITH MIDDLE TILDE
+1D72 LATIN SMALL LETTER R WITH MIDDLE TILDE
+1D73 LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
+1D74 LATIN SMALL LETTER S WITH MIDDLE TILDE
+1D75 LATIN SMALL LETTER T WITH MIDDLE TILDE
+1D76 LATIN SMALL LETTER Z WITH MIDDLE TILDE
+@ Caucasian linguistics
+1D77 LATIN SMALL LETTER TURNED G
+ * Georgian transcription
+ x (georgian letter turned gan - 10F9)
+1D78 MODIFIER LETTER CYRILLIC EN
+ # <super> 043D
+@ Other phonetic symbols
+1D79 LATIN SMALL LETTER INSULAR G
+ * older Irish phonetic notation
+ * uppercase is A77D
+ x (latin small letter g - 0067)
+ x (latin small letter yogh - 021D)
+ x (latin small letter script g - 0261)
+ x (latin small letter gamma - 0263)
+1D7A LATIN SMALL LETTER TH WITH STRIKETHROUGH
+ * American dictionary usage
+ x (greek small letter theta - 03B8)
+1D7B LATIN SMALL CAPITAL LETTER I WITH STROKE
+ * used with different meanings by Americanists and Oxford dictionaries
+1D7C LATIN SMALL LETTER IOTA WITH STROKE
+ * used by Russianists
+1D7D LATIN SMALL LETTER P WITH STROKE
+ * used by Americanists
+ * uppercase is 2C63
+1D7E LATIN SMALL CAPITAL LETTER U WITH STROKE
+ * used by Americanists
+1D7F LATIN SMALL LETTER UPSILON WITH STROKE
+ * used by Americanists and Oxford dictionaries
+@@ 1D80 Phonetic Extensions Supplement 1DBF
+@ Latin letters with palatal hook
+@+ An additional letter with palatal hook is found in another block.
+ x (latin small letter t with palatal hook - 01AB)
+1D80 LATIN SMALL LETTER B WITH PALATAL HOOK
+1D81 LATIN SMALL LETTER D WITH PALATAL HOOK
+1D82 LATIN SMALL LETTER F WITH PALATAL HOOK
+1D83 LATIN SMALL LETTER G WITH PALATAL HOOK
+1D84 LATIN SMALL LETTER K WITH PALATAL HOOK
+1D85 LATIN SMALL LETTER L WITH PALATAL HOOK
+1D86 LATIN SMALL LETTER M WITH PALATAL HOOK
+1D87 LATIN SMALL LETTER N WITH PALATAL HOOK
+1D88 LATIN SMALL LETTER P WITH PALATAL HOOK
+1D89 LATIN SMALL LETTER R WITH PALATAL HOOK
+1D8A LATIN SMALL LETTER S WITH PALATAL HOOK
+1D8B LATIN SMALL LETTER ESH WITH PALATAL HOOK
+1D8C LATIN SMALL LETTER V WITH PALATAL HOOK
+1D8D LATIN SMALL LETTER X WITH PALATAL HOOK
+1D8E LATIN SMALL LETTER Z WITH PALATAL HOOK
+@ Latin letters with retroflex hook
+@+ IPA recommends transcribing vowels with r-coloring (rhoticity) with the rhotic hook instead.
+ x (modifier letter rhotic hook - 02DE)
+@+ Additional letters with retroflex hook are found in other blocks.
+ x (latin capital letter t with retroflex hook - 01AE)
+ x (latin small letter d with tail - 0256)
+ x (latin small letter l with retroflex hook - 026D)
+ x (latin small letter n with retroflex hook - 0273)
+ x (latin small letter turned r with hook - 027B)
+ x (latin small letter r with tail - 027D)
+ x (latin small letter s with hook - 0282)
+ x (latin small letter squat reversed esh - 0285)
+ x (latin small letter t with retroflex hook - 0288)
+ x (latin small letter z with retroflex hook - 0290)
+ x (latin small letter turned h with fishhook and tail - 02AF)
+1D8F LATIN SMALL LETTER A WITH RETROFLEX HOOK
+1D90 LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK
+1D91 LATIN SMALL LETTER D WITH HOOK AND TAIL
+1D92 LATIN SMALL LETTER E WITH RETROFLEX HOOK
+1D93 LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
+1D94 LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK
+ x (latin small letter reversed open e with hook - 025D)
+1D95 LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK
+ x (latin small letter schwa with hook - 025A)
+1D96 LATIN SMALL LETTER I WITH RETROFLEX HOOK
+1D97 LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
+1D98 LATIN SMALL LETTER ESH WITH RETROFLEX HOOK
+1D99 LATIN SMALL LETTER U WITH RETROFLEX HOOK
+1D9A LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+@ Modifier letters
+@+ Other modifier letters can be found in the Spacing Modifier Letters, Phonetic Extensions, as well as Superscripts and Subscripts blocks.
+1D9B MODIFIER LETTER SMALL TURNED ALPHA
+ # <super> 0252
+1D9C MODIFIER LETTER SMALL C
+ # <super> 0063
+1D9D MODIFIER LETTER SMALL C WITH CURL
+ # <super> 0255
+1D9E MODIFIER LETTER SMALL ETH
+ # <super> 00F0
+1D9F MODIFIER LETTER SMALL REVERSED OPEN E
+ # <super> 025C
+1DA0 MODIFIER LETTER SMALL F
+ # <super> 0066
+1DA1 MODIFIER LETTER SMALL DOTLESS J WITH STROKE
+ # <super> 025F
+1DA2 MODIFIER LETTER SMALL SCRIPT G
+ # <super> 0261
+1DA3 MODIFIER LETTER SMALL TURNED H
+ # <super> 0265
+1DA4 MODIFIER LETTER SMALL I WITH STROKE
+ # <super> 0268
+1DA5 MODIFIER LETTER SMALL IOTA
+ # <super> 0269
+1DA6 MODIFIER LETTER SMALL CAPITAL I
+ * not for use in UPA
+ x (modifier letter capital i - 1D35)
+ # <super> 026A
+1DA7 MODIFIER LETTER SMALL CAPITAL I WITH STROKE
+ # <super> 1D7B
+1DA8 MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+ # <super> 029D
+1DA9 MODIFIER LETTER SMALL L WITH RETROFLEX HOOK
+ # <super> 026D
+1DAA MODIFIER LETTER SMALL L WITH PALATAL HOOK
+ # <super> 1D85
+1DAB MODIFIER LETTER SMALL CAPITAL L
+ * not for use in UPA
+ x (modifier letter capital l - 1D38)
+ # <super> 029F
+1DAC MODIFIER LETTER SMALL M WITH HOOK
+ # <super> 0271
+1DAD MODIFIER LETTER SMALL TURNED M WITH LONG LEG
+ # <super> 0270
+1DAE MODIFIER LETTER SMALL N WITH LEFT HOOK
+ # <super> 0272
+1DAF MODIFIER LETTER SMALL N WITH RETROFLEX HOOK
+ # <super> 0273
+1DB0 MODIFIER LETTER SMALL CAPITAL N
+ * not for use in UPA
+ x (modifier letter capital n - 1D3A)
+ # <super> 0274
+1DB1 MODIFIER LETTER SMALL BARRED O
+ # <super> 0275
+1DB2 MODIFIER LETTER SMALL PHI
+ # <super> 0278
+1DB3 MODIFIER LETTER SMALL S WITH HOOK
+ # <super> 0282
+1DB4 MODIFIER LETTER SMALL ESH
+ # <super> 0283
+1DB5 MODIFIER LETTER SMALL T WITH PALATAL HOOK
+ # <super> 01AB
+1DB6 MODIFIER LETTER SMALL U BAR
+ # <super> 0289
+1DB7 MODIFIER LETTER SMALL UPSILON
+ # <super> 028A
+1DB8 MODIFIER LETTER SMALL CAPITAL U
+ * not for use in UPA
+ x (modifier letter capital u - 1D41)
+ # <super> 1D1C
+1DB9 MODIFIER LETTER SMALL V WITH HOOK
+ # <super> 028B
+1DBA MODIFIER LETTER SMALL TURNED V
+ # <super> 028C
+1DBB MODIFIER LETTER SMALL Z
+ # <super> 007A
+1DBC MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK
+ # <super> 0290
+1DBD MODIFIER LETTER SMALL Z WITH CURL
+ # <super> 0291
+1DBE MODIFIER LETTER SMALL EZH
+ # <super> 0292
+1DBF MODIFIER LETTER SMALL THETA
+ # <super> 03B8
+@@ 1DC0 Combining Diacritical Marks Supplement 1DFF
+@ Used for Ancient Greek
+@+ These are used as editorial signs for Ancient Greek to indicate scribal deletion of erroneous accent marks.
+1DC0 COMBINING DOTTED GRAVE ACCENT
+ x (greek dialytika and varia - 1FED)
+1DC1 COMBINING DOTTED ACUTE ACCENT
+ x (combining greek dialytika tonos - 0344)
+ x (greek dialytika and oxia - 1FEE)
+@ Miscellaneous marks
+1DC2 COMBINING SNAKE BELOW
+1DC3 COMBINING SUSPENSION MARK
+ * Glagolitic
+ x (combining breve - 0306)
+@ Contour tone marks
+1DC4 COMBINING MACRON-ACUTE
+1DC5 COMBINING GRAVE-MACRON
+1DC6 COMBINING MACRON-GRAVE
+1DC7 COMBINING ACUTE-MACRON
+1DC8 COMBINING GRAVE-ACUTE-GRAVE
+1DC9 COMBINING ACUTE-GRAVE-ACUTE
+@ Miscellaneous mark
+1DCA COMBINING LATIN SMALL LETTER R BELOW
+@ Contour tone marks
+1DCB COMBINING BREVE-MACRON
+ * Lithuanian dialectology
+1DCC COMBINING MACRON-BREVE
+ * Lithuanian dialectology
+@ Double diacritic
+1DCD COMBINING DOUBLE CIRCUMFLEX ABOVE
+@ Medievalist additions
+1DCE COMBINING OGONEK ABOVE
+1DCF COMBINING ZIGZAG BELOW
+1DD0 COMBINING IS BELOW
+1DD1 COMBINING UR ABOVE
+1DD2 COMBINING US ABOVE
+@ Medieval superscript letter diacritics
+1DD3 COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE
+1DD4 COMBINING LATIN SMALL LETTER AE
+1DD5 COMBINING LATIN SMALL LETTER AO
+1DD6 COMBINING LATIN SMALL LETTER AV
+1DD7 COMBINING LATIN SMALL LETTER C CEDILLA
+1DD8 COMBINING LATIN SMALL LETTER INSULAR D
+1DD9 COMBINING LATIN SMALL LETTER ETH
+1DDA COMBINING LATIN SMALL LETTER G
+1DDB COMBINING LATIN LETTER SMALL CAPITAL G
+1DDC COMBINING LATIN SMALL LETTER K
+1DDD COMBINING LATIN SMALL LETTER L
+1DDE COMBINING LATIN LETTER SMALL CAPITAL L
+1DDF COMBINING LATIN LETTER SMALL CAPITAL M
+1DE0 COMBINING LATIN SMALL LETTER N
+1DE1 COMBINING LATIN LETTER SMALL CAPITAL N
+1DE2 COMBINING LATIN LETTER SMALL CAPITAL R
+1DE3 COMBINING LATIN SMALL LETTER R ROTUNDA
+1DE4 COMBINING LATIN SMALL LETTER S
+1DE5 COMBINING LATIN SMALL LETTER LONG S
+1DE6 COMBINING LATIN SMALL LETTER Z
+@ Additional marks for UPA
+1DFE COMBINING LEFT ARROWHEAD ABOVE
+1DFF COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+@@ 1E00 Latin Extended Additional 1EFF
+@+ In this block the names "WITH LINE BELOW" refer to a macron below the letter.
+@ Latin general use extensions
+1E00 LATIN CAPITAL LETTER A WITH RING BELOW
+ : 0041 0325
+1E01 LATIN SMALL LETTER A WITH RING BELOW
+ : 0061 0325
+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE
+ : 0042 0307
+1E03 LATIN SMALL LETTER B WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 0062 0307
+1E04 LATIN CAPITAL LETTER B WITH DOT BELOW
+ : 0042 0323
+1E05 LATIN SMALL LETTER B WITH DOT BELOW
+ : 0062 0323
+1E06 LATIN CAPITAL LETTER B WITH LINE BELOW
+ : 0042 0331
+1E07 LATIN SMALL LETTER B WITH LINE BELOW
+ : 0062 0331
+1E08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+ : 00C7 0301
+1E09 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+ : 00E7 0301
+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE
+ : 0044 0307
+1E0B LATIN SMALL LETTER D WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 0064 0307
+1E0C LATIN CAPITAL LETTER D WITH DOT BELOW
+ : 0044 0323
+1E0D LATIN SMALL LETTER D WITH DOT BELOW
+ * Indic transliteration
+ : 0064 0323
+1E0E LATIN CAPITAL LETTER D WITH LINE BELOW
+ : 0044 0331
+1E0F LATIN SMALL LETTER D WITH LINE BELOW
+ : 0064 0331
+1E10 LATIN CAPITAL LETTER D WITH CEDILLA
+ : 0044 0327
+1E11 LATIN SMALL LETTER D WITH CEDILLA
+ * Livonian
+ : 0064 0327
+1E12 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+ : 0044 032D
+1E13 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+ : 0064 032D
+1E14 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+ : 0112 0300
+1E15 LATIN SMALL LETTER E WITH MACRON AND GRAVE
+ : 0113 0300
+1E16 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+ : 0112 0301
+1E17 LATIN SMALL LETTER E WITH MACRON AND ACUTE
+ : 0113 0301
+1E18 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+ : 0045 032D
+1E19 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+ : 0065 032D
+1E1A LATIN CAPITAL LETTER E WITH TILDE BELOW
+ : 0045 0330
+1E1B LATIN SMALL LETTER E WITH TILDE BELOW
+ : 0065 0330
+1E1C LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+ : 0228 0306
+1E1D LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+ : 0229 0306
+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE
+ : 0046 0307
+1E1F LATIN SMALL LETTER F WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 0066 0307
+1E20 LATIN CAPITAL LETTER G WITH MACRON
+ : 0047 0304
+1E21 LATIN SMALL LETTER G WITH MACRON
+ : 0067 0304
+1E22 LATIN CAPITAL LETTER H WITH DOT ABOVE
+ : 0048 0307
+1E23 LATIN SMALL LETTER H WITH DOT ABOVE
+ : 0068 0307
+1E24 LATIN CAPITAL LETTER H WITH DOT BELOW
+ : 0048 0323
+1E25 LATIN SMALL LETTER H WITH DOT BELOW
+ * Indic transliteration
+ : 0068 0323
+1E26 LATIN CAPITAL LETTER H WITH DIAERESIS
+ : 0048 0308
+1E27 LATIN SMALL LETTER H WITH DIAERESIS
+ : 0068 0308
+1E28 LATIN CAPITAL LETTER H WITH CEDILLA
+ : 0048 0327
+1E29 LATIN SMALL LETTER H WITH CEDILLA
+ : 0068 0327
+1E2A LATIN CAPITAL LETTER H WITH BREVE BELOW
+ : 0048 032E
+1E2B LATIN SMALL LETTER H WITH BREVE BELOW
+ * Semitic transliteration
+ : 0068 032E
+1E2C LATIN CAPITAL LETTER I WITH TILDE BELOW
+ : 0049 0330
+1E2D LATIN SMALL LETTER I WITH TILDE BELOW
+ : 0069 0330
+1E2E LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+ : 00CF 0301
+1E2F LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+ : 00EF 0301
+1E30 LATIN CAPITAL LETTER K WITH ACUTE
+ : 004B 0301
+1E31 LATIN SMALL LETTER K WITH ACUTE
+ * Macedonian transliteration
+ : 006B 0301
+1E32 LATIN CAPITAL LETTER K WITH DOT BELOW
+ : 004B 0323
+1E33 LATIN SMALL LETTER K WITH DOT BELOW
+ : 006B 0323
+1E34 LATIN CAPITAL LETTER K WITH LINE BELOW
+ : 004B 0331
+1E35 LATIN SMALL LETTER K WITH LINE BELOW
+ : 006B 0331
+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW
+ : 004C 0323
+1E37 LATIN SMALL LETTER L WITH DOT BELOW
+ * Indic transliteration
+ * see ISO 15919 on the use of dot below versus ring below in Indic transliteration
+ x (combining ring below - 0325)
+ : 006C 0323
+1E38 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+ : 1E36 0304
+1E39 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+ * Indic transliteration
+ : 1E37 0304
+1E3A LATIN CAPITAL LETTER L WITH LINE BELOW
+ : 004C 0331
+1E3B LATIN SMALL LETTER L WITH LINE BELOW
+ * Indic transliteration
+ : 006C 0331
+1E3C LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+ : 004C 032D
+1E3D LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+ : 006C 032D
+1E3E LATIN CAPITAL LETTER M WITH ACUTE
+ : 004D 0301
+1E3F LATIN SMALL LETTER M WITH ACUTE
+ : 006D 0301
+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE
+ : 004D 0307
+1E41 LATIN SMALL LETTER M WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 006D 0307
+1E42 LATIN CAPITAL LETTER M WITH DOT BELOW
+ : 004D 0323
+1E43 LATIN SMALL LETTER M WITH DOT BELOW
+ * Indic transliteration
+ : 006D 0323
+1E44 LATIN CAPITAL LETTER N WITH DOT ABOVE
+ : 004E 0307
+1E45 LATIN SMALL LETTER N WITH DOT ABOVE
+ * Indic transliteration
+ : 006E 0307
+1E46 LATIN CAPITAL LETTER N WITH DOT BELOW
+ : 004E 0323
+1E47 LATIN SMALL LETTER N WITH DOT BELOW
+ * Indic transliteration
+ : 006E 0323
+1E48 LATIN CAPITAL LETTER N WITH LINE BELOW
+ : 004E 0331
+1E49 LATIN SMALL LETTER N WITH LINE BELOW
+ * Indic transliteration
+ : 006E 0331
+1E4A LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+ : 004E 032D
+1E4B LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+ : 006E 032D
+1E4C LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+ : 00D5 0301
+1E4D LATIN SMALL LETTER O WITH TILDE AND ACUTE
+ : 00F5 0301
+1E4E LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+ : 00D5 0308
+1E4F LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+ : 00F5 0308
+1E50 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+ : 014C 0300
+1E51 LATIN SMALL LETTER O WITH MACRON AND GRAVE
+ : 014D 0300
+1E52 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+ : 014C 0301
+1E53 LATIN SMALL LETTER O WITH MACRON AND ACUTE
+ : 014D 0301
+1E54 LATIN CAPITAL LETTER P WITH ACUTE
+ : 0050 0301
+1E55 LATIN SMALL LETTER P WITH ACUTE
+ : 0070 0301
+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE
+ : 0050 0307
+1E57 LATIN SMALL LETTER P WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 0070 0307
+1E58 LATIN CAPITAL LETTER R WITH DOT ABOVE
+ : 0052 0307
+1E59 LATIN SMALL LETTER R WITH DOT ABOVE
+ : 0072 0307
+1E5A LATIN CAPITAL LETTER R WITH DOT BELOW
+ : 0052 0323
+1E5B LATIN SMALL LETTER R WITH DOT BELOW
+ * Indic transliteration
+ * see ISO 15919 on the use of dot below versus ring below in Indic transliteration
+ x (combining ring below - 0325)
+ : 0072 0323
+1E5C LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+ : 1E5A 0304
+1E5D LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+ * Indic transliteration
+ : 1E5B 0304
+1E5E LATIN CAPITAL LETTER R WITH LINE BELOW
+ : 0052 0331
+1E5F LATIN SMALL LETTER R WITH LINE BELOW
+ * Indic transliteration
+ : 0072 0331
+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE
+ : 0053 0307
+1E61 LATIN SMALL LETTER S WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 0073 0307
+1E62 LATIN CAPITAL LETTER S WITH DOT BELOW
+ : 0053 0323
+1E63 LATIN SMALL LETTER S WITH DOT BELOW
+ * Indic transliteration
+ : 0073 0323
+1E64 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+ : 015A 0307
+1E65 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+ : 015B 0307
+1E66 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+ : 0160 0307
+1E67 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+ : 0161 0307
+1E68 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+ : 1E62 0307
+1E69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+ : 1E63 0307
+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE
+ : 0054 0307
+1E6B LATIN SMALL LETTER T WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 0074 0307
+1E6C LATIN CAPITAL LETTER T WITH DOT BELOW
+ : 0054 0323
+1E6D LATIN SMALL LETTER T WITH DOT BELOW
+ * Indic transliteration
+ : 0074 0323
+1E6E LATIN CAPITAL LETTER T WITH LINE BELOW
+ : 0054 0331
+1E6F LATIN SMALL LETTER T WITH LINE BELOW
+ * Semitic transliteration
+ : 0074 0331
+1E70 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+ : 0054 032D
+1E71 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+ : 0074 032D
+1E72 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+ : 0055 0324
+1E73 LATIN SMALL LETTER U WITH DIAERESIS BELOW
+ : 0075 0324
+1E74 LATIN CAPITAL LETTER U WITH TILDE BELOW
+ : 0055 0330
+1E75 LATIN SMALL LETTER U WITH TILDE BELOW
+ : 0075 0330
+1E76 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+ : 0055 032D
+1E77 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+ : 0075 032D
+1E78 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+ : 0168 0301
+1E79 LATIN SMALL LETTER U WITH TILDE AND ACUTE
+ : 0169 0301
+1E7A LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+ : 016A 0308
+1E7B LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+ : 016B 0308
+1E7C LATIN CAPITAL LETTER V WITH TILDE
+ : 0056 0303
+1E7D LATIN SMALL LETTER V WITH TILDE
+ : 0076 0303
+1E7E LATIN CAPITAL LETTER V WITH DOT BELOW
+ : 0056 0323
+1E7F LATIN SMALL LETTER V WITH DOT BELOW
+ : 0076 0323
+1E80 LATIN CAPITAL LETTER W WITH GRAVE
+ : 0057 0300
+1E81 LATIN SMALL LETTER W WITH GRAVE
+ * Welsh
+ : 0077 0300
+1E82 LATIN CAPITAL LETTER W WITH ACUTE
+ : 0057 0301
+1E83 LATIN SMALL LETTER W WITH ACUTE
+ * Welsh
+ : 0077 0301
+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS
+ : 0057 0308
+1E85 LATIN SMALL LETTER W WITH DIAERESIS
+ * Welsh
+ : 0077 0308
+1E86 LATIN CAPITAL LETTER W WITH DOT ABOVE
+ : 0057 0307
+1E87 LATIN SMALL LETTER W WITH DOT ABOVE
+ : 0077 0307
+1E88 LATIN CAPITAL LETTER W WITH DOT BELOW
+ : 0057 0323
+1E89 LATIN SMALL LETTER W WITH DOT BELOW
+ : 0077 0323
+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE
+ : 0058 0307
+1E8B LATIN SMALL LETTER X WITH DOT ABOVE
+ : 0078 0307
+1E8C LATIN CAPITAL LETTER X WITH DIAERESIS
+ : 0058 0308
+1E8D LATIN SMALL LETTER X WITH DIAERESIS
+ : 0078 0308
+1E8E LATIN CAPITAL LETTER Y WITH DOT ABOVE
+ : 0059 0307
+1E8F LATIN SMALL LETTER Y WITH DOT ABOVE
+ : 0079 0307
+1E90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+ : 005A 0302
+1E91 LATIN SMALL LETTER Z WITH CIRCUMFLEX
+ : 007A 0302
+1E92 LATIN CAPITAL LETTER Z WITH DOT BELOW
+ : 005A 0323
+1E93 LATIN SMALL LETTER Z WITH DOT BELOW
+ * Indic transliteration
+ : 007A 0323
+1E94 LATIN CAPITAL LETTER Z WITH LINE BELOW
+ : 005A 0331
+1E95 LATIN SMALL LETTER Z WITH LINE BELOW
+ * Semitic transliteration
+ : 007A 0331
+1E96 LATIN SMALL LETTER H WITH LINE BELOW
+ * Semitic transliteration
+ : 0068 0331
+1E97 LATIN SMALL LETTER T WITH DIAERESIS
+ : 0074 0308
+1E98 LATIN SMALL LETTER W WITH RING ABOVE
+ : 0077 030A
+1E99 LATIN SMALL LETTER Y WITH RING ABOVE
+ : 0079 030A
+1E9A LATIN SMALL LETTER A WITH RIGHT HALF RING
+ # 0061 02BE
+1E9B LATIN SMALL LETTER LONG S WITH DOT ABOVE
+ * in current use in Gaelic types (as glyph variant of 1E61)
+ : 017F 0307
+@ Medievalist additions
+1E9C LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE
+ * Sorbian
+1E9D LATIN SMALL LETTER LONG S WITH HIGH STROKE
+@ Addition for German typography
+1E9E LATIN CAPITAL LETTER SHARP S
+ * lowercase is 00DF
+ x (latin small letter sharp s - 00DF)
+@ Medievalist addition
+1E9F LATIN SMALL LETTER DELTA
+@ Latin extensions for Vietnamese
+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW
+ : 0041 0323
+1EA1 LATIN SMALL LETTER A WITH DOT BELOW
+ : 0061 0323
+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE
+ : 0041 0309
+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE
+ : 0061 0309
+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+ : 00C2 0301
+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+ : 00E2 0301
+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+ : 00C2 0300
+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+ : 00E2 0300
+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+ : 00C2 0309
+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+ : 00E2 0309
+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+ : 00C2 0303
+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+ : 00E2 0303
+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+ : 1EA0 0302
+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+ : 1EA1 0302
+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+ : 0102 0301
+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE
+ : 0103 0301
+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+ : 0102 0300
+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE
+ : 0103 0300
+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+ : 0102 0309
+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+ : 0103 0309
+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+ : 0102 0303
+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE
+ : 0103 0303
+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+ : 1EA0 0306
+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+ : 1EA1 0306
+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW
+ : 0045 0323
+1EB9 LATIN SMALL LETTER E WITH DOT BELOW
+ : 0065 0323
+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE
+ : 0045 0309
+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE
+ : 0065 0309
+1EBC LATIN CAPITAL LETTER E WITH TILDE
+ : 0045 0303
+1EBD LATIN SMALL LETTER E WITH TILDE
+ : 0065 0303
+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+ : 00CA 0301
+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+ : 00EA 0301
+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+ : 00CA 0300
+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+ : 00EA 0300
+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+ : 00CA 0309
+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+ : 00EA 0309
+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+ : 00CA 0303
+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+ : 00EA 0303
+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+ : 1EB8 0302
+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+ : 1EB9 0302
+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE
+ : 0049 0309
+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE
+ : 0069 0309
+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW
+ : 0049 0323
+1ECB LATIN SMALL LETTER I WITH DOT BELOW
+ : 0069 0323
+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW
+ : 004F 0323
+1ECD LATIN SMALL LETTER O WITH DOT BELOW
+ : 006F 0323
+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE
+ : 004F 0309
+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE
+ : 006F 0309
+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+ : 00D4 0301
+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+ : 00F4 0301
+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+ : 00D4 0300
+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+ : 00F4 0300
+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+ : 00D4 0309
+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+ : 00F4 0309
+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+ : 00D4 0303
+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+ : 00F4 0303
+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+ : 1ECC 0302
+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+ : 1ECD 0302
+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+ : 01A0 0301
+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE
+ : 01A1 0301
+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+ : 01A0 0300
+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE
+ : 01A1 0300
+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+ : 01A0 0309
+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+ : 01A1 0309
+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE
+ : 01A0 0303
+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE
+ : 01A1 0303
+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+ : 01A0 0323
+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+ : 01A1 0323
+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW
+ : 0055 0323
+1EE5 LATIN SMALL LETTER U WITH DOT BELOW
+ : 0075 0323
+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE
+ : 0055 0309
+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE
+ : 0075 0309
+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+ : 01AF 0301
+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE
+ : 01B0 0301
+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+ : 01AF 0300
+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE
+ : 01B0 0300
+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+ : 01AF 0309
+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+ : 01B0 0309
+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE
+ : 01AF 0303
+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE
+ : 01B0 0303
+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+ : 01AF 0323
+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+ : 01B0 0323
+@ Latin general extensions
+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE
+ : 0059 0300
+1EF3 LATIN SMALL LETTER Y WITH GRAVE
+ * Welsh
+ : 0079 0300
+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW
+ : 0059 0323
+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW
+ : 0079 0323
+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+ : 0059 0309
+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE
+ : 0079 0309
+1EF8 LATIN CAPITAL LETTER Y WITH TILDE
+ : 0059 0303
+1EF9 LATIN SMALL LETTER Y WITH TILDE
+ : 0079 0303
+@ Medievalist additions
+1EFA LATIN CAPITAL LETTER MIDDLE-WELSH LL
+1EFB LATIN SMALL LETTER MIDDLE-WELSH LL
+1EFC LATIN CAPITAL LETTER MIDDLE-WELSH V
+1EFD LATIN SMALL LETTER MIDDLE-WELSH V
+1EFE LATIN CAPITAL LETTER Y WITH LOOP
+1EFF LATIN SMALL LETTER Y WITH LOOP
+@@ 1F00 Greek Extended 1FFF
+@ Precomposed polytonic Greek
+1F00 GREEK SMALL LETTER ALPHA WITH PSILI
+ : 03B1 0313
+1F01 GREEK SMALL LETTER ALPHA WITH DASIA
+ : 03B1 0314
+1F02 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+ : 1F00 0300
+1F03 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+ : 1F01 0300
+1F04 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+ : 1F00 0301
+1F05 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+ : 1F01 0301
+1F06 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+ : 1F00 0342
+1F07 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+ : 1F01 0342
+1F08 GREEK CAPITAL LETTER ALPHA WITH PSILI
+ : 0391 0313
+1F09 GREEK CAPITAL LETTER ALPHA WITH DASIA
+ : 0391 0314
+1F0A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+ : 1F08 0300
+1F0B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+ : 1F09 0300
+1F0C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+ : 1F08 0301
+1F0D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+ : 1F09 0301
+1F0E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+ : 1F08 0342
+1F0F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+ : 1F09 0342
+1F10 GREEK SMALL LETTER EPSILON WITH PSILI
+ : 03B5 0313
+1F11 GREEK SMALL LETTER EPSILON WITH DASIA
+ : 03B5 0314
+1F12 GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+ : 1F10 0300
+1F13 GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+ : 1F11 0300
+1F14 GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+ : 1F10 0301
+1F15 GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+ : 1F11 0301
+1F18 GREEK CAPITAL LETTER EPSILON WITH PSILI
+ : 0395 0313
+1F19 GREEK CAPITAL LETTER EPSILON WITH DASIA
+ : 0395 0314
+1F1A GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+ : 1F18 0300
+1F1B GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+ : 1F19 0300
+1F1C GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+ : 1F18 0301
+1F1D GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+ : 1F19 0301
+1F20 GREEK SMALL LETTER ETA WITH PSILI
+ : 03B7 0313
+1F21 GREEK SMALL LETTER ETA WITH DASIA
+ : 03B7 0314
+1F22 GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+ : 1F20 0300
+1F23 GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+ : 1F21 0300
+1F24 GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+ : 1F20 0301
+1F25 GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+ : 1F21 0301
+1F26 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+ : 1F20 0342
+1F27 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+ : 1F21 0342
+1F28 GREEK CAPITAL LETTER ETA WITH PSILI
+ : 0397 0313
+1F29 GREEK CAPITAL LETTER ETA WITH DASIA
+ : 0397 0314
+1F2A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+ : 1F28 0300
+1F2B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+ : 1F29 0300
+1F2C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+ : 1F28 0301
+1F2D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+ : 1F29 0301
+1F2E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+ : 1F28 0342
+1F2F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+ : 1F29 0342
+1F30 GREEK SMALL LETTER IOTA WITH PSILI
+ : 03B9 0313
+1F31 GREEK SMALL LETTER IOTA WITH DASIA
+ : 03B9 0314
+1F32 GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+ : 1F30 0300
+1F33 GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+ : 1F31 0300
+1F34 GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+ : 1F30 0301
+1F35 GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+ : 1F31 0301
+1F36 GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+ : 1F30 0342
+1F37 GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+ : 1F31 0342
+1F38 GREEK CAPITAL LETTER IOTA WITH PSILI
+ : 0399 0313
+1F39 GREEK CAPITAL LETTER IOTA WITH DASIA
+ : 0399 0314
+1F3A GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+ : 1F38 0300
+1F3B GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+ : 1F39 0300
+1F3C GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+ : 1F38 0301
+1F3D GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+ : 1F39 0301
+1F3E GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+ : 1F38 0342
+1F3F GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+ : 1F39 0342
+1F40 GREEK SMALL LETTER OMICRON WITH PSILI
+ : 03BF 0313
+1F41 GREEK SMALL LETTER OMICRON WITH DASIA
+ : 03BF 0314
+1F42 GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+ : 1F40 0300
+1F43 GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+ : 1F41 0300
+1F44 GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+ : 1F40 0301
+1F45 GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+ : 1F41 0301
+1F48 GREEK CAPITAL LETTER OMICRON WITH PSILI
+ : 039F 0313
+1F49 GREEK CAPITAL LETTER OMICRON WITH DASIA
+ : 039F 0314
+1F4A GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+ : 1F48 0300
+1F4B GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+ : 1F49 0300
+1F4C GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+ : 1F48 0301
+1F4D GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+ : 1F49 0301
+1F50 GREEK SMALL LETTER UPSILON WITH PSILI
+ : 03C5 0313
+1F51 GREEK SMALL LETTER UPSILON WITH DASIA
+ : 03C5 0314
+1F52 GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+ : 1F50 0300
+1F53 GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+ : 1F51 0300
+1F54 GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+ : 1F50 0301
+1F55 GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+ : 1F51 0301
+1F56 GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+ : 1F50 0342
+1F57 GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+ : 1F51 0342
+1F59 GREEK CAPITAL LETTER UPSILON WITH DASIA
+ : 03A5 0314
+1F5B GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+ : 1F59 0300
+1F5D GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+ : 1F59 0301
+1F5F GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+ : 1F59 0342
+1F60 GREEK SMALL LETTER OMEGA WITH PSILI
+ : 03C9 0313
+1F61 GREEK SMALL LETTER OMEGA WITH DASIA
+ : 03C9 0314
+1F62 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+ : 1F60 0300
+1F63 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+ : 1F61 0300
+1F64 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+ : 1F60 0301
+1F65 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+ : 1F61 0301
+1F66 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+ : 1F60 0342
+1F67 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+ : 1F61 0342
+1F68 GREEK CAPITAL LETTER OMEGA WITH PSILI
+ : 03A9 0313
+1F69 GREEK CAPITAL LETTER OMEGA WITH DASIA
+ : 03A9 0314
+1F6A GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+ : 1F68 0300
+1F6B GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+ : 1F69 0300
+1F6C GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+ : 1F68 0301
+1F6D GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+ : 1F69 0301
+1F6E GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+ : 1F68 0342
+1F6F GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+ : 1F69 0342
+1F70 GREEK SMALL LETTER ALPHA WITH VARIA
+ : 03B1 0300
+1F71 GREEK SMALL LETTER ALPHA WITH OXIA
+ : 03AC greek small letter alpha with tonos
+1F72 GREEK SMALL LETTER EPSILON WITH VARIA
+ : 03B5 0300
+1F73 GREEK SMALL LETTER EPSILON WITH OXIA
+ : 03AD greek small letter epsilon with tonos
+1F74 GREEK SMALL LETTER ETA WITH VARIA
+ : 03B7 0300
+1F75 GREEK SMALL LETTER ETA WITH OXIA
+ : 03AE greek small letter eta with tonos
+1F76 GREEK SMALL LETTER IOTA WITH VARIA
+ : 03B9 0300
+1F77 GREEK SMALL LETTER IOTA WITH OXIA
+ : 03AF greek small letter iota with tonos
+1F78 GREEK SMALL LETTER OMICRON WITH VARIA
+ : 03BF 0300
+1F79 GREEK SMALL LETTER OMICRON WITH OXIA
+ : 03CC greek small letter omicron with tonos
+1F7A GREEK SMALL LETTER UPSILON WITH VARIA
+ : 03C5 0300
+1F7B GREEK SMALL LETTER UPSILON WITH OXIA
+ : 03CD greek small letter upsilon with tonos
+1F7C GREEK SMALL LETTER OMEGA WITH VARIA
+ : 03C9 0300
+1F7D GREEK SMALL LETTER OMEGA WITH OXIA
+ : 03CE greek small letter omega with tonos
+1F80 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+ : 1F00 0345
+1F81 GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+ : 1F01 0345
+1F82 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ : 1F02 0345
+1F83 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ : 1F03 0345
+1F84 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ : 1F04 0345
+1F85 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ : 1F05 0345
+1F86 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ : 1F06 0345
+1F87 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ : 1F07 0345
+1F88 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+ : 1F08 0345
+1F89 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+ : 1F09 0345
+1F8A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ : 1F0A 0345
+1F8B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ : 1F0B 0345
+1F8C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ : 1F0C 0345
+1F8D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ : 1F0D 0345
+1F8E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ : 1F0E 0345
+1F8F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ : 1F0F 0345
+1F90 GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+ : 1F20 0345
+1F91 GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+ : 1F21 0345
+1F92 GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ : 1F22 0345
+1F93 GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ : 1F23 0345
+1F94 GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ : 1F24 0345
+1F95 GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ : 1F25 0345
+1F96 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ : 1F26 0345
+1F97 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ : 1F27 0345
+1F98 GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+ : 1F28 0345
+1F99 GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+ : 1F29 0345
+1F9A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ : 1F2A 0345
+1F9B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ : 1F2B 0345
+1F9C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ : 1F2C 0345
+1F9D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ : 1F2D 0345
+1F9E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ : 1F2E 0345
+1F9F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ : 1F2F 0345
+1FA0 GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+ : 1F60 0345
+1FA1 GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+ : 1F61 0345
+1FA2 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ : 1F62 0345
+1FA3 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ : 1F63 0345
+1FA4 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ : 1F64 0345
+1FA5 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ : 1F65 0345
+1FA6 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ : 1F66 0345
+1FA7 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ : 1F67 0345
+1FA8 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+ : 1F68 0345
+1FA9 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+ : 1F69 0345
+1FAA GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ : 1F6A 0345
+1FAB GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ : 1F6B 0345
+1FAC GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ : 1F6C 0345
+1FAD GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ : 1F6D 0345
+1FAE GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ : 1F6E 0345
+1FAF GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ : 1F6F 0345
+1FB0 GREEK SMALL LETTER ALPHA WITH VRACHY
+ : 03B1 0306
+1FB1 GREEK SMALL LETTER ALPHA WITH MACRON
+ : 03B1 0304
+1FB2 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+ : 1F70 0345
+1FB3 GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+ : 03B1 0345
+1FB4 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+ : 03AC 0345
+1FB6 GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+ : 03B1 0342
+1FB7 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+ : 1FB6 0345
+1FB8 GREEK CAPITAL LETTER ALPHA WITH VRACHY
+ : 0391 0306
+1FB9 GREEK CAPITAL LETTER ALPHA WITH MACRON
+ : 0391 0304
+1FBA GREEK CAPITAL LETTER ALPHA WITH VARIA
+ : 0391 0300
+1FBB GREEK CAPITAL LETTER ALPHA WITH OXIA
+ : 0386 greek capital letter alpha with tonos
+1FBC GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+ : 0391 0345
+1FBD GREEK KORONIS
+ # 0020 0313
+1FBE GREEK PROSGEGRAMMENI
+ : 03B9 greek small letter iota
+1FBF GREEK PSILI
+ x (modifier letter apostrophe - 02BC)
+ # 0020 0313
+1FC0 GREEK PERISPOMENI
+ # 0020 0342
+1FC1 GREEK DIALYTIKA AND PERISPOMENI
+ : 00A8 0342
+1FC2 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+ : 1F74 0345
+1FC3 GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+ : 03B7 0345
+1FC4 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+ : 03AE 0345
+1FC6 GREEK SMALL LETTER ETA WITH PERISPOMENI
+ : 03B7 0342
+1FC7 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+ : 1FC6 0345
+1FC8 GREEK CAPITAL LETTER EPSILON WITH VARIA
+ : 0395 0300
+1FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA
+ : 0388 greek capital letter epsilon with tonos
+1FCA GREEK CAPITAL LETTER ETA WITH VARIA
+ : 0397 0300
+1FCB GREEK CAPITAL LETTER ETA WITH OXIA
+ : 0389 greek capital letter eta with tonos
+1FCC GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+ : 0397 0345
+1FCD GREEK PSILI AND VARIA
+ : 1FBF 0300
+1FCE GREEK PSILI AND OXIA
+ : 1FBF 0301
+1FCF GREEK PSILI AND PERISPOMENI
+ : 1FBF 0342
+1FD0 GREEK SMALL LETTER IOTA WITH VRACHY
+ : 03B9 0306
+1FD1 GREEK SMALL LETTER IOTA WITH MACRON
+ : 03B9 0304
+1FD2 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+ : 03CA 0300
+1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+ : 0390 greek small letter iota with dialytika and tonos
+1FD6 GREEK SMALL LETTER IOTA WITH PERISPOMENI
+ : 03B9 0342
+1FD7 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+ : 03CA 0342
+1FD8 GREEK CAPITAL LETTER IOTA WITH VRACHY
+ : 0399 0306
+1FD9 GREEK CAPITAL LETTER IOTA WITH MACRON
+ : 0399 0304
+1FDA GREEK CAPITAL LETTER IOTA WITH VARIA
+ : 0399 0300
+1FDB GREEK CAPITAL LETTER IOTA WITH OXIA
+ : 038A greek capital letter iota with tonos
+1FDD GREEK DASIA AND VARIA
+ : 1FFE 0300
+1FDE GREEK DASIA AND OXIA
+ : 1FFE 0301
+1FDF GREEK DASIA AND PERISPOMENI
+ : 1FFE 0342
+1FE0 GREEK SMALL LETTER UPSILON WITH VRACHY
+ : 03C5 0306
+1FE1 GREEK SMALL LETTER UPSILON WITH MACRON
+ : 03C5 0304
+1FE2 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+ : 03CB 0300
+1FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+ : 03B0 greek small letter upsilon with dialytika and tonos
+1FE4 GREEK SMALL LETTER RHO WITH PSILI
+ : 03C1 0313
+1FE5 GREEK SMALL LETTER RHO WITH DASIA
+ : 03C1 0314
+1FE6 GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+ : 03C5 0342
+1FE7 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+ : 03CB 0342
+1FE8 GREEK CAPITAL LETTER UPSILON WITH VRACHY
+ : 03A5 0306
+1FE9 GREEK CAPITAL LETTER UPSILON WITH MACRON
+ : 03A5 0304
+1FEA GREEK CAPITAL LETTER UPSILON WITH VARIA
+ : 03A5 0300
+1FEB GREEK CAPITAL LETTER UPSILON WITH OXIA
+ : 038E greek capital letter upsilon with tonos
+1FEC GREEK CAPITAL LETTER RHO WITH DASIA
+ : 03A1 0314
+1FED GREEK DIALYTIKA AND VARIA
+ : 00A8 0300
+1FEE GREEK DIALYTIKA AND OXIA
+ : 0385 greek dialytika tonos
+1FEF GREEK VARIA
+ : 0060 grave accent
+1FF2 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+ : 1F7C 0345
+1FF3 GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+ : 03C9 0345
+1FF4 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+ : 03CE 0345
+1FF6 GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+ : 03C9 0342
+1FF7 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+ : 1FF6 0345
+1FF8 GREEK CAPITAL LETTER OMICRON WITH VARIA
+ : 039F 0300
+1FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA
+ : 038C greek capital letter omicron with tonos
+1FFA GREEK CAPITAL LETTER OMEGA WITH VARIA
+ : 03A9 0300
+1FFB GREEK CAPITAL LETTER OMEGA WITH OXIA
+ : 038F greek capital letter omega with tonos
+1FFC GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+ : 03A9 0345
+1FFD GREEK OXIA
+ : 00B4 acute accent
+1FFE GREEK DASIA
+ x (modifier letter reversed comma - 02BD)
+ # 0020 0314
+@@ 2000 General Punctuation 206F
+@@+
+@+ For additional general punctuation characters see also Basic Latin, Latin-1, Supplemental Punctuation and CJK Symbols and Punctuation.
+@ Spaces
+2000 EN QUAD
+ : 2002 en space
+2001 EM QUAD
+ = mutton quad
+ : 2003 em space
+2002 EN SPACE
+ = nut
+ * half an em
+ # 0020 space
+2003 EM SPACE
+ = mutton
+ * nominally, a space equal to the type size in points
+ * may scale by the condensation factor of a font
+ # 0020 space
+2004 THREE-PER-EM SPACE
+ = thick space
+ # 0020 space
+2005 FOUR-PER-EM SPACE
+ = mid space
+ # 0020 space
+2006 SIX-PER-EM SPACE
+ * in computer typography sometimes equated to thin space
+ # 0020 space
+2007 FIGURE SPACE
+ * space equal to tabular width of a font
+ * this is equivalent to the digit width of fonts with fixed-width digits
+ # <noBreak> 0020
+2008 PUNCTUATION SPACE
+ * space equal to narrow punctuation of a font
+ # 0020 space
+2009 THIN SPACE
+ * a fifth of an em (or sometimes a sixth)
+ x (narrow no-break space - 202F)
+ # 0020 space
+200A HAIR SPACE
+ * thinner than a thin space
+ * in traditional typography, the thinnest space available
+ # 0020 space
+200B ZERO WIDTH SPACE
+ * commonly abbreviated ZWSP
+ * this character is intended for line break control; it has no width, but its presence between two characters does not prevent increased letter spacing in justification
+@ Format characters
+200C ZERO WIDTH NON-JOINER
+ * commonly abbreviated ZWNJ
+200D ZERO WIDTH JOINER
+ * commonly abbreviated ZWJ
+200E LEFT-TO-RIGHT MARK
+ * commonly abbreviated LRM
+200F RIGHT-TO-LEFT MARK
+ * commonly abbreviated RLM
+@ Dashes
+2010 HYPHEN
+ x (hyphen-minus - 002D)
+ x (soft hyphen - 00AD)
+2011 NON-BREAKING HYPHEN
+ x (hyphen-minus - 002D)
+ x (soft hyphen - 00AD)
+ # <noBreak> 2010
+2012 FIGURE DASH
+2013 EN DASH
+2014 EM DASH
+ * may be used in pairs to offset parenthetical text
+ x (katakana-hiragana prolonged sound mark - 30FC)
+2015 HORIZONTAL BAR
+ = quotation dash
+ * long dash introducing quoted text
+@ General punctuation
+2016 DOUBLE VERTICAL LINE
+ * used in pairs to indicate norm of a matrix
+ x (combining double vertical stroke overlay - 20E6)
+ x (parallel to - 2225)
+2017 DOUBLE LOW LINE
+ * this is a spacing character
+ x (low line - 005F)
+ x (combining double low line - 0333)
+ # 0020 0333
+2018 LEFT SINGLE QUOTATION MARK
+ = single turned comma quotation mark
+ * this is the preferred character (as opposed to 201B)
+ x (apostrophe - 0027)
+ x (modifier letter turned comma - 02BB)
+ x (heavy single turned comma quotation mark ornament - 275B)
+2019 RIGHT SINGLE QUOTATION MARK
+ = single comma quotation mark
+ * this is the preferred character to use for apostrophe
+ x (apostrophe - 0027)
+ x (modifier letter apostrophe - 02BC)
+ x (heavy single comma quotation mark ornament - 275C)
+201A SINGLE LOW-9 QUOTATION MARK
+ = low single comma quotation mark
+ * used as opening single quotation mark in some languages
+201B SINGLE HIGH-REVERSED-9 QUOTATION MARK
+ = single reversed comma quotation mark
+ * has same semantic as 2018, but differs in appearance
+ x (modifier letter reversed comma - 02BD)
+201C LEFT DOUBLE QUOTATION MARK
+ = double turned comma quotation mark
+ * this is the preferred character (as opposed to 201F)
+ x (quotation mark - 0022)
+ x (heavy double turned comma quotation mark ornament - 275D)
+ x (reversed double prime quotation mark - 301D)
+201D RIGHT DOUBLE QUOTATION MARK
+ = double comma quotation mark
+ x (quotation mark - 0022)
+ x (double prime - 2033)
+ x (heavy double comma quotation mark ornament - 275E)
+ x (double prime quotation mark - 301E)
+201E DOUBLE LOW-9 QUOTATION MARK
+ = low double comma quotation mark
+ * used as opening double quotation mark in some languages
+ x (low double prime quotation mark - 301F)
+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+ = double reversed comma quotation mark
+ * has same semantic as 201C, but differs in appearance
+2020 DAGGER
+ = obelisk, obelus, long cross
+2021 DOUBLE DAGGER
+ = diesis, double obelisk
+2022 BULLET
+ = black small circle
+ x (middle dot - 00B7)
+ x (one dot leader - 2024)
+ x (bullet operator - 2219)
+ x (inverse bullet - 25D8)
+ x (white bullet - 25E6)
+2023 TRIANGULAR BULLET
+ x (end of proof - 220E)
+ x (black right-pointing small triangle - 25B8)
+2024 ONE DOT LEADER
+ * also used as an Armenian semicolon (mijaket)
+ x (middle dot - 00B7)
+ x (bullet - 2022)
+ x (bullet operator - 2219)
+ # 002E full stop
+2025 TWO DOT LEADER
+ # 002E 002E
+2026 HORIZONTAL ELLIPSIS
+ = three dot leader
+ x (vertical ellipsis - 22EE)
+ x (presentation form for vertical horizontal ellipsis - FE19)
+ # 002E 002E 002E
+2027 HYPHENATION POINT
+@ Format characters
+2028 LINE SEPARATOR
+ * may be used to represent this semantic unambiguously
+2029 PARAGRAPH SEPARATOR
+ * may be used to represent this semantic unambiguously
+202A LEFT-TO-RIGHT EMBEDDING
+ * commonly abbreviated LRE
+202B RIGHT-TO-LEFT EMBEDDING
+ * commonly abbreviated RLE
+202C POP DIRECTIONAL FORMATTING
+ * commonly abbreviated PDF
+202D LEFT-TO-RIGHT OVERRIDE
+ * commonly abbreviated LRO
+202E RIGHT-TO-LEFT OVERRIDE
+ * commonly abbreviated RLO
+202F NARROW NO-BREAK SPACE
+ * commonly abbreviated NNBSP
+ * a narrow form of a no-break space, typically the width of a thin space or a mid space
+ x (no-break space - 00A0)
+ x (four-per-em space - 2005)
+ x (thin space - 2009)
+ # <noBreak> 0020
+@ General punctuation
+2030 PER MILLE SIGN
+ = permille, per thousand
+ * used, for example, in measures of blood alcohol content, salinity, etc.
+ x (percent sign - 0025)
+ x (arabic-indic per mille sign - 0609)
+2031 PER TEN THOUSAND SIGN
+ = permyriad
+ * percent of a percent, rarely used
+ x (percent sign - 0025)
+ x (arabic-indic per ten thousand sign - 060A)
+2032 PRIME
+ = minutes, feet
+ x (apostrophe - 0027)
+ x (acute accent - 00B4)
+ x (modifier letter prime - 02B9)
+2033 DOUBLE PRIME
+ = seconds, inches
+ x (quotation mark - 0022)
+ x (modifier letter double prime - 02BA)
+ x (right double quotation mark - 201D)
+ x (ditto mark - 3003)
+ x (double prime quotation mark - 301E)
+ # 2032 2032
+2034 TRIPLE PRIME
+ = lines (old measure, 1/12 of an inch)
+ # 2032 2032 2032
+2035 REVERSED PRIME
+ x (grave accent - 0060)
+2036 REVERSED DOUBLE PRIME
+ x (reversed double prime quotation mark - 301D)
+ # 2035 2035
+2037 REVERSED TRIPLE PRIME
+ # 2035 2035 2035
+2038 CARET
+ x (up arrowhead - 2303)
+ x (modifier letter low circumflex accent - A788)
+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ = left pointing single guillemet
+ * usually opening, sometimes closing
+ x (less-than sign - 003C)
+ x (left-pointing angle bracket - 2329)
+ x (left angle bracket - 3008)
+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ = right pointing single guillemet
+ * usually closing, sometimes opening
+ x (greater-than sign - 003E)
+ x (right-pointing angle bracket - 232A)
+ x (right angle bracket - 3009)
+203B REFERENCE MARK
+ = Japanese kome
+ = Urdu paragraph separator
+ x (tibetan ku ru kha bzhi mig can - 0FBF)
+ x (cjk unified ideograph-200AD - 200AD)
+@ Double punctuation for vertical text
+203C DOUBLE EXCLAMATION MARK
+ x (exclamation mark - 0021)
+ # 0021 0021
+@ General punctuation
+203D INTERROBANG
+ x (exclamation mark - 0021)
+ x (question mark - 003F)
+ x (inverted interrobang - 2E18)
+203E OVERLINE
+ = spacing overscore
+ # 0020 0305
+203F UNDERTIE (Enotikon)
+ = Greek enotikon
+ x (smile - 2323)
+2040 CHARACTER TIE
+ = z notation sequence concatenation
+ x (frown - 2322)
+2041 CARET INSERTION POINT
+ * proofreader's mark: insert here
+ x (right semidirect product - 22CC)
+2042 ASTERISM
+2043 HYPHEN BULLET
+2044 FRACTION SLASH
+ = solidus (in typography)
+ * for composing arbitrary fractions
+ x (solidus - 002F)
+ x (division slash - 2215)
+2045 LEFT SQUARE BRACKET WITH QUILL
+2046 RIGHT SQUARE BRACKET WITH QUILL
+@ Double punctuation for vertical text
+2047 DOUBLE QUESTION MARK
+ # 003F 003F
+2048 QUESTION EXCLAMATION MARK
+ # 003F 0021
+2049 EXCLAMATION QUESTION MARK
+ # 0021 003F
+@ General punctuation
+204A TIRONIAN SIGN ET
+ * Irish Gaelic, Old English, ...
+ x (ampersand - 0026)
+204B REVERSED PILCROW SIGN
+ x (pilcrow sign - 00B6)
+204C BLACK LEFTWARDS BULLET
+204D BLACK RIGHTWARDS BULLET
+204E LOW ASTERISK
+ x (asterisk - 002A)
+ x (combining asterisk below - 0359)
+204F REVERSED SEMICOLON
+ x (semicolon - 003B)
+2050 CLOSE UP
+ * editing mark
+2051 TWO ASTERISKS ALIGNED VERTICALLY
+2052 COMMERCIAL MINUS SIGN
+ = abzüglich (German), med avdrag av (Swedish), piska (Swedish, "whip")
+ * a common glyph variant and fallback representation looks like ./.
+ * may also be used as a dingbat to indicate correctness
+ * used in Finno-Ugric Phonetic Alphabet to indicate a related borrowed form with different sound
+ x (percent sign - 0025)
+ x (arabic percent sign - 066A)
+2053 SWUNG DASH
+ x (tilde - 007E)
+2054 INVERTED UNDERTIE
+2055 FLOWER PUNCTUATION MARK
+ = phul, puspika
+ * used as a punctuation mark with Syloti Nagri, Bengali and other Indic scripts
+ x (heavy eight teardrop-spoked propeller asterisk - 274B)
+@ Archaic punctuation
+2056 THREE DOT PUNCTUATION
+@ General punctuation
+2057 QUADRUPLE PRIME
+ # 2032 2032 2032 2032
+@ Archaic punctuation
+2058 FOUR DOT PUNCTUATION
+2059 FIVE DOT PUNCTUATION
+ = Greek pentonkion
+ = quincunx
+ x (die face-5 - 2684)
+205A TWO DOT PUNCTUATION
+ * historically used to indicate the end of a sentence or change of speaker
+ * extends from baseline to cap height
+ x (presentation form for vertical two dot leader - FE30)
+ x (greek acrophonic epidaurean two - 1015B)
+205B FOUR DOT MARK
+ * used by scribes in the margin as highlighter mark
+ * this is centered on the line, but extends beyond top and bottom of the line
+205C DOTTED CROSS
+ * used by scribes in the margin as highlighter mark
+205D TRICOLON
+ = Epidaurean acrophonic symbol three
+ x (vertical ellipsis - 22EE)
+ x (triple colon operator - 2AF6)
+ x (presentation form for vertical horizontal ellipsis - FE19)
+205E VERTICAL FOUR DOTS
+ * used in dictionaries to indicate legal but undesirable word break
+ * glyph extends the whole height of the line
+@ Space
+205F MEDIUM MATHEMATICAL SPACE
+ * abbreviated MMSP
+ * four-eighteenths of an em
+ # 0020 space
+@ Format character
+2060 WORD JOINER
+ * commonly abbreviated WJ
+ * a zero width non-breaking space (only)
+ * intended for disambiguation of functions for byte order mark
+ x (zero width no-break space - FEFF)
+@ Invisible operators
+2061 FUNCTION APPLICATION
+ * contiguity operator indicating application of a function
+2062 INVISIBLE TIMES
+ * contiguity operator indicating multiplication
+2063 INVISIBLE SEPARATOR
+ = invisible comma
+ * contiguity operator indicating that adjacent mathematical symbols form a list, e.g. when no visible comma is used between multiple indices
+2064 INVISIBLE PLUS
+ * contiguity operator indicating addition
+@ Deprecated
+206A INHIBIT SYMMETRIC SWAPPING
+206B ACTIVATE SYMMETRIC SWAPPING
+206C INHIBIT ARABIC FORM SHAPING
+206D ACTIVATE ARABIC FORM SHAPING
+206E NATIONAL DIGIT SHAPES
+206F NOMINAL DIGIT SHAPES
+@@ 2070 Superscripts and Subscripts 209F
+@ Superscripts
+2070 SUPERSCRIPT ZERO
+ # <super> 0030
+2071 SUPERSCRIPT LATIN SMALL LETTER I
+ # <super> 0069
+2072 <reserved>
+ x (superscript two - 00B2)
+2073 <reserved>
+ x (superscript three - 00B3)
+2074 SUPERSCRIPT FOUR
+ # <super> 0034
+2075 SUPERSCRIPT FIVE
+ # <super> 0035
+2076 SUPERSCRIPT SIX
+ # <super> 0036
+2077 SUPERSCRIPT SEVEN
+ # <super> 0037
+2078 SUPERSCRIPT EIGHT
+ # <super> 0038
+2079 SUPERSCRIPT NINE
+ # <super> 0039
+207A SUPERSCRIPT PLUS SIGN
+ # <super> 002B
+207B SUPERSCRIPT MINUS
+ # <super> 2212
+207C SUPERSCRIPT EQUALS SIGN
+ # <super> 003D
+207D SUPERSCRIPT LEFT PARENTHESIS
+ # <super> 0028
+207E SUPERSCRIPT RIGHT PARENTHESIS
+ # <super> 0029
+207F SUPERSCRIPT LATIN SMALL LETTER N
+ # <super> 006E
+@ Subscripts
+2080 SUBSCRIPT ZERO
+ # <sub> 0030
+2081 SUBSCRIPT ONE
+ # <sub> 0031
+2082 SUBSCRIPT TWO
+ # <sub> 0032
+2083 SUBSCRIPT THREE
+ # <sub> 0033
+2084 SUBSCRIPT FOUR
+ # <sub> 0034
+2085 SUBSCRIPT FIVE
+ # <sub> 0035
+2086 SUBSCRIPT SIX
+ # <sub> 0036
+2087 SUBSCRIPT SEVEN
+ # <sub> 0037
+2088 SUBSCRIPT EIGHT
+ # <sub> 0038
+2089 SUBSCRIPT NINE
+ # <sub> 0039
+208A SUBSCRIPT PLUS SIGN
+ # <sub> 002B
+208B SUBSCRIPT MINUS
+ # <sub> 2212
+208C SUBSCRIPT EQUALS SIGN
+ # <sub> 003D
+208D SUBSCRIPT LEFT PARENTHESIS
+ # <sub> 0028
+208E SUBSCRIPT RIGHT PARENTHESIS
+ # <sub> 0029
+2090 LATIN SUBSCRIPT SMALL LETTER A
+ # <sub> 0061
+2091 LATIN SUBSCRIPT SMALL LETTER E
+ # <sub> 0065
+2092 LATIN SUBSCRIPT SMALL LETTER O
+ # <sub> 006F
+2093 LATIN SUBSCRIPT SMALL LETTER X
+ # <sub> 0078
+2094 LATIN SUBSCRIPT SMALL LETTER SCHWA
+ # <sub> 0259
+@@ 20A0 Currency Symbols 20CF
+@ Currency symbols
+@+ A number of currency symbols are found in other blocks. Fullwidth versions of some currency symbols are found in the Halfwidth and Fullwidth Forms block.
+ x (dollar sign - 0024)
+ x (cent sign - 00A2)
+ x (pound sign - 00A3)
+ x (currency sign - 00A4)
+ x (yen sign - 00A5)
+ x (latin small letter f with hook - 0192)
+ x (afghani sign - 060B)
+ x (bengali rupee mark - 09F2)
+ x (bengali rupee sign - 09F3)
+ x (gujarati rupee sign - 0AF1)
+ x (tamil rupee sign - 0BF9)
+ x (thai currency symbol baht - 0E3F)
+ x (khmer currency symbol riel - 17DB)
+ x (script capital m - 2133)
+ x (cjk unified ideograph-5143 - 5143)
+ x (cjk unified ideograph-5186 - 5186)
+ x (cjk unified ideograph-5706 - 5706)
+ x (cjk unified ideograph-5713 - 5713)
+ x (rial sign - FDFC)
+20A0 EURO-CURRENCY SIGN
+ * intended for ECU, but not widely used
+ * historical character; this is NOT the euro!
+ x (euro sign - 20AC)
+20A1 COLON SIGN
+ * Costa Rica, El Salvador
+20A2 CRUZEIRO SIGN
+ * Brazil
+20A3 FRENCH FRANC SIGN
+ * France
+20A4 LIRA SIGN
+ * intended for lira, but not widely used
+ * preferred character for lira is 00A3
+ x (pound sign - 00A3)
+20A5 MILL SIGN
+ * USA (1/10 cent)
+20A6 NAIRA SIGN
+ * Nigeria
+20A7 PESETA SIGN
+ * Spain
+ x (peso sign - 20B1)
+20A8 RUPEE SIGN
+ * India
+ # 0052 0073
+20A9 WON SIGN
+ * Korea
+20AA NEW SHEQEL SIGN
+ * Israel
+20AB DONG SIGN
+ * Vietnam
+20AC EURO SIGN
+ * currency sign for the European Monetary Union
+ * euro, not ecu
+ x (euro-currency sign - 20A0)
+20AD KIP SIGN
+ * Laos
+20AE TUGRIK SIGN
+ * Mongolia
+ * also transliterated as tugrug, tugric, tugrog, togrog, tögrög
+20AF DRACHMA SIGN
+ * Greece
+20B0 GERMAN PENNY SIGN
+20B1 PESO SIGN
+ * Philippines
+ * the Mexican peso is indicated with the dollar sign
+ x (peseta sign - 20A7)
+20B2 GUARANI SIGN
+ * Paraguay
+ * Often represented by G. or Gs.
+20B3 AUSTRAL SIGN
+ * former Argentinian currency
+20B4 HRYVNIA SIGN
+ * Ukraine
+20B5 CEDI SIGN
+ * Ghana
+ * glyph may look like '023B' or like C with a short vertical stroke through the upper arm
+ x (cent sign - 00A2)
+ x (latin capital letter c with stroke - 023B)
+@@ 20D0 Combining Diacritical Marks for Symbols 20FF
+@ Combining diacritical marks for symbols
+20D0 COMBINING LEFT HARPOON ABOVE
+20D1 COMBINING RIGHT HARPOON ABOVE
+ * vector
+20D2 COMBINING LONG VERTICAL LINE OVERLAY
+ * negation
+20D3 COMBINING SHORT VERTICAL LINE OVERLAY
+ * occasional variant for negation
+20D4 COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5 COMBINING CLOCKWISE ARROW ABOVE
+ * rotation
+20D6 COMBINING LEFT ARROW ABOVE
+20D7 COMBINING RIGHT ARROW ABOVE
+ * vector
+20D8 COMBINING RING OVERLAY
+20D9 COMBINING CLOCKWISE RING OVERLAY
+20DA COMBINING ANTICLOCKWISE RING OVERLAY
+20DB COMBINING THREE DOTS ABOVE
+ = third derivative
+20DC COMBINING FOUR DOTS ABOVE
+ = fourth derivative
+@ Enclosing diacritics
+20DD COMBINING ENCLOSING CIRCLE
+ = JIS composition circle
+ = Cyrillic combining ten thousands sign
+ x (white circle - 25CB)
+ x (large circle - 25EF)
+ x (ideographic number zero - 3007)
+20DE COMBINING ENCLOSING SQUARE
+ x (white square - 25A1)
+20DF COMBINING ENCLOSING DIAMOND
+ x (white diamond - 25C7)
+20E0 COMBINING ENCLOSING CIRCLE BACKSLASH
+ * prohibition
+@ Additional diacritical mark for symbols
+20E1 COMBINING LEFT RIGHT ARROW ABOVE
+ * tensor
+@ Additional enclosing diacritics
+20E2 COMBINING ENCLOSING SCREEN
+ x (clear screen symbol - 239A)
+20E3 COMBINING ENCLOSING KEYCAP
+20E4 COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+ x (white up-pointing triangle - 25B3)
+@ Additional diacritical marks for symbols
+20E5 COMBINING REVERSE SOLIDUS OVERLAY
+ x (reverse solidus - 005C)
+20E6 COMBINING DOUBLE VERTICAL STROKE OVERLAY
+ = z notation finite function diacritic
+ x (double vertical line - 2016)
+20E7 COMBINING ANNUITY SYMBOL
+ = actuarial bend
+ x (right ceiling - 2309)
+20E8 COMBINING TRIPLE UNDERDOT
+20E9 COMBINING WIDE BRIDGE ABOVE
+ = contraction operator
+ * extends the full width of the base character
+ x (combining bridge above - 0346)
+20EA COMBINING LEFTWARDS ARROW OVERLAY
+ x (leftwards arrow - 2190)
+20EB COMBINING LONG DOUBLE SOLIDUS OVERLAY
+ = long double slash overlay
+20EC COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+20ED COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS
+20EE COMBINING LEFT ARROW BELOW
+20EF COMBINING RIGHT ARROW BELOW
+20F0 COMBINING ASTERISK ABOVE
+@@ 2100 Letterlike Symbols 214F
+@ Letterlike symbols
+@+ Some of the letterlike symbols are intended to complete the set of mathematical alphanumeric symbols starting at U+1D400.
+2100 ACCOUNT OF
+ # 0061 002F 0063
+2101 ADDRESSED TO THE SUBJECT
+ x (aktieselskab - 214D)
+ # 0061 002F 0073
+2102 DOUBLE-STRUCK CAPITAL C
+ = the set of complex numbers
+ # <font> 0043 latin capital letter c
+2103 DEGREE CELSIUS
+ = degrees Centigrade
+ # 00B0 0043
+2104 CENTRE LINE SYMBOL
+ = clone
+2105 CARE OF
+ # 0063 002F 006F
+2106 CADA UNA
+ # 0063 002F 0075
+2107 EULER CONSTANT
+ x (latin capital letter e - 0045)
+ # 0190 latin capital letter open e
+2108 SCRUPLE
+2109 DEGREE FAHRENHEIT
+ # 00B0 0046
+210A SCRIPT SMALL G
+ = real number symbol
+ # <font> 0067 latin small letter g
+210B SCRIPT CAPITAL H
+ = Hamiltonian operator
+ # <font> 0048 latin capital letter h
+210C BLACK-LETTER CAPITAL H
+ = Hilbert space
+ # <font> 0048 latin capital letter h
+210D DOUBLE-STRUCK CAPITAL H
+ # <font> 0048 latin capital letter h
+210E PLANCK CONSTANT
+ = height, specific enthalpy, ...
+ * simply a mathematical italic h; this character's name results from legacy usage
+ # <font> 0068 latin small letter h
+210F PLANCK CONSTANT OVER TWO PI
+ x (cyrillic small letter tshe - 045B)
+ # <font> 0127 latin small letter h with stroke
+2110 SCRIPT CAPITAL I
+ # <font> 0049 latin capital letter i
+2111 BLACK-LETTER CAPITAL I
+ = imaginary part
+ # <font> 0049 latin capital letter i
+2112 SCRIPT CAPITAL L
+ = Laplace transform
+ # <font> 004C latin capital letter l
+2113 SCRIPT SMALL L
+ = mathematical symbol 'ell'
+ = liter (traditional symbol)
+ * despite its character name, this symbol is derived from a special italicized version of the small letter l
+ * the SI recommended symbol for liter is 006C
+ x (mathematical script small l - 1D4C1)
+ # <font> 006C latin small letter l
+2114 L B BAR SYMBOL
+ = pounds
+ x (number sign - 0023)
+2115 DOUBLE-STRUCK CAPITAL N
+ = natural number
+ * a glyph variant with doubled vertical strokes exists
+ # <font> 004E latin capital letter n
+2116 NUMERO SIGN
+ # 004E 006F
+2117 SOUND RECORDING COPYRIGHT
+ = published
+ = phonorecord sign
+ x (copyright sign - 00A9)
+ x (circled latin capital letter p - 24C5)
+2118 SCRIPT CAPITAL P
+ = Weierstrass elliptic function
+ * actually this has the form of a lowercase calligraphic p, despite its name
+2119 DOUBLE-STRUCK CAPITAL P
+ # <font> 0050 latin capital letter p
+211A DOUBLE-STRUCK CAPITAL Q
+ = the set of rational numbers
+ # <font> 0051 latin capital letter q
+211B SCRIPT CAPITAL R
+ = Riemann Integral
+ # <font> 0052 latin capital letter r
+211C BLACK-LETTER CAPITAL R
+ = real part
+ # <font> 0052 latin capital letter r
+211D DOUBLE-STRUCK CAPITAL R
+ = the set of real numbers
+ # <font> 0052 latin capital letter r
+211E PRESCRIPTION TAKE
+ = recipe
+ = cross ratio
+211F RESPONSE
+2120 SERVICE MARK
+ # <super> 0053 004D
+2121 TELEPHONE SIGN
+ * typical forms for this symbol may use lower case, small caps or superscripted letter shapes
+ x (black telephone - 260E)
+ x (telephone location sign - 2706)
+ # 0054 0045 004C
+2122 TRADE MARK SIGN
+ # <super> 0054 004D
+2123 VERSICLE
+2124 DOUBLE-STRUCK CAPITAL Z
+ = the set of integers
+ # <font> 005A latin capital letter z
+2125 OUNCE SIGN
+ x (latin small letter yogh - 021D)
+2126 OHM SIGN
+ * SI unit of resistance, named after G. S. Ohm, German physicist
+ * preferred representation is 03A9
+ x (ascending node - 260A)
+ : 03A9 greek capital letter omega
+2127 INVERTED OHM SIGN
+ = mho
+ * archaic unit of conductance (= the SI unit siemens)
+ * typographically a turned greek capital letter omega
+ x (latin capital letter upsilon - 01B1)
+ x (greek capital letter omega - 03A9)
+ x (descending node - 260B)
+2128 BLACK-LETTER CAPITAL Z
+ # <font> 005A latin capital letter z
+2129 TURNED GREEK SMALL LETTER IOTA
+ * unique element fulfilling a description (logic)
+ x (greek small letter iota - 03B9)
+212A KELVIN SIGN
+ : 004B latin capital letter k
+212B ANGSTROM SIGN
+ * non SI length unit (=0.1 nm) named after A. J. Ångström, Swedish physicist
+ * preferred representation is 00C5
+ : 00C5 latin capital letter a with ring above
+212C SCRIPT CAPITAL B
+ = Bernoulli function
+ # <font> 0042 latin capital letter b
+212D BLACK-LETTER CAPITAL C
+ # <font> 0043 latin capital letter c
+212E ESTIMATED SYMBOL
+ * used in European packaging
+ x (latin small letter e - 0065)
+212F SCRIPT SMALL E
+ = error
+ = natural exponent
+ # <font> 0065 latin small letter e
+2130 SCRIPT CAPITAL E
+ = emf (electromotive force)
+ # <font> 0045 latin capital letter e
+2131 SCRIPT CAPITAL F
+ = Fourier transform
+ # <font> 0046 latin capital letter f
+2132 TURNED CAPITAL F
+ = Claudian digamma inversum
+ * lowercase is 214E
+ x (latin capital letter f - 0046)
+ x (greek letter digamma - 03DC)
+2133 SCRIPT CAPITAL M
+ = M-matrix (physics)
+ = German Mark currency symbol, before WWII
+ * when used for the Mark symbol, the range of glyph variation is restricted
+ # <font> 004D latin capital letter m
+2134 SCRIPT SMALL O
+ = order, of inferior order to
+ # <font> 006F latin small letter o
+@ Hebrew letterlike math symbols
+@+ These are left-to-right characters.
+2135 ALEF SYMBOL
+ = first transfinite cardinal (countable)
+ # 05D0 hebrew letter alef
+2136 BET SYMBOL
+ = second transfinite cardinal (the continuum)
+ # 05D1 hebrew letter bet
+2137 GIMEL SYMBOL
+ = third transfinite cardinal (functions of a real variable)
+ # 05D2 hebrew letter gimel
+2138 DALET SYMBOL
+ = fourth transfinite cardinal
+ # 05D3 hebrew letter dalet
+@ Additional letterlike symbols
+2139 INFORMATION SOURCE
+ * intended for use with 20DD
+ # <font> 0069 latin small letter i
+213A ROTATED CAPITAL Q
+ * a binding signature mark
+213B FACSIMILE SIGN
+ * typical forms for this symbol may use lower case, small caps or superscripted letter shapes
+ x (telephone sign - 2121)
+ # 0046 0041 0058
+213C DOUBLE-STRUCK SMALL PI
+ # <font> 03C0 greek small letter pi
+213D DOUBLE-STRUCK SMALL GAMMA
+ # <font> 03B3 greek small letter gamma
+213E DOUBLE-STRUCK CAPITAL GAMMA
+ # <font> 0393 greek capital letter gamma
+213F DOUBLE-STRUCK CAPITAL PI
+ # <font> 03A0 greek capital letter pi
+@ Double-struck large operator
+2140 DOUBLE-STRUCK N-ARY SUMMATION
+ # <font> 2211 n-ary summation
+@ Additional letterlike symbols
+2141 TURNED SANS-SERIF CAPITAL G
+ = game
+2142 TURNED SANS-SERIF CAPITAL L
+2143 REVERSED SANS-SERIF CAPITAL L
+2144 TURNED SANS-SERIF CAPITAL Y
+@ Double-struck italic math symbols
+@+ These stylized mathematical symbols are used in some documents to distinguish special mathematical usages from ordinary variables.
+2145 DOUBLE-STRUCK ITALIC CAPITAL D
+ * sometimes used for the differential
+ # <font> 0044 latin capital letter d
+2146 DOUBLE-STRUCK ITALIC SMALL D
+ * sometimes used for the differential
+ # <font> 0064 latin small letter d
+2147 DOUBLE-STRUCK ITALIC SMALL E
+ * sometimes used for the natural exponent
+ # <font> 0065 latin small letter e
+2148 DOUBLE-STRUCK ITALIC SMALL I
+ * sometimes used for the imaginary unit
+ # <font> 0069 latin small letter i
+2149 DOUBLE-STRUCK ITALIC SMALL J
+ * sometimes used for the imaginary unit
+ # <font> 006A latin small letter j
+@ Additional letterlike symbols
+214A PROPERTY LINE
+214B TURNED AMPERSAND
+ * used in linear logic
+ x (ampersand - 0026)
+214C PER SIGN
+ * abbreviates the word 'per'
+214D AKTIESELSKAB
+ x (addressed to the subject - 2101)
+@ Lowercase Claudian letter
+@+ Claudian letters in inscriptions are uppercase, but may be transcribed by scholars in lowercase.
+214E TURNED SMALL F
+ * uppercase is 2132
+ x (greek small letter digamma - 03DD)
+@ Biblical editorial symbol
+214F SYMBOL FOR SAMARITAN SOURCE
+@@ 2150 Number Forms 218F
+@ Fractions
+@+ Other fraction number forms are found in the Latin-1 Supplement block.
+ x (vulgar fraction one quarter - 00BC)
+ x (vulgar fraction one half - 00BD)
+ x (vulgar fraction three quarters - 00BE)
+2153 VULGAR FRACTION ONE THIRD
+ # <fraction> 0031 2044 0033
+2154 VULGAR FRACTION TWO THIRDS
+ # <fraction> 0032 2044 0033
+2155 VULGAR FRACTION ONE FIFTH
+ # <fraction> 0031 2044 0035
+2156 VULGAR FRACTION TWO FIFTHS
+ # <fraction> 0032 2044 0035
+2157 VULGAR FRACTION THREE FIFTHS
+ # <fraction> 0033 2044 0035
+2158 VULGAR FRACTION FOUR FIFTHS
+ # <fraction> 0034 2044 0035
+2159 VULGAR FRACTION ONE SIXTH
+ # <fraction> 0031 2044 0036
+215A VULGAR FRACTION FIVE SIXTHS
+ # <fraction> 0035 2044 0036
+215B VULGAR FRACTION ONE EIGHTH
+ # <fraction> 0031 2044 0038
+215C VULGAR FRACTION THREE EIGHTHS
+ # <fraction> 0033 2044 0038
+215D VULGAR FRACTION FIVE EIGHTHS
+ # <fraction> 0035 2044 0038
+215E VULGAR FRACTION SEVEN EIGHTHS
+ # <fraction> 0037 2044 0038
+215F FRACTION NUMERATOR ONE
+ # <fraction> 0031 2044
+@ Roman numerals
+2160 ROMAN NUMERAL ONE
+ # 0049 latin capital letter i
+2161 ROMAN NUMERAL TWO
+ # 0049 0049
+2162 ROMAN NUMERAL THREE
+ # 0049 0049 0049
+2163 ROMAN NUMERAL FOUR
+ # 0049 0056
+2164 ROMAN NUMERAL FIVE
+ # 0056 latin capital letter v
+2165 ROMAN NUMERAL SIX
+ # 0056 0049
+2166 ROMAN NUMERAL SEVEN
+ # 0056 0049 0049
+2167 ROMAN NUMERAL EIGHT
+ # 0056 0049 0049 0049
+2168 ROMAN NUMERAL NINE
+ # 0049 0058
+2169 ROMAN NUMERAL TEN
+ # 0058 latin capital letter x
+216A ROMAN NUMERAL ELEVEN
+ # 0058 0049
+216B ROMAN NUMERAL TWELVE
+ # 0058 0049 0049
+216C ROMAN NUMERAL FIFTY
+ # 004C latin capital letter l
+216D ROMAN NUMERAL ONE HUNDRED
+ # 0043 latin capital letter c
+216E ROMAN NUMERAL FIVE HUNDRED
+ # 0044 latin capital letter d
+216F ROMAN NUMERAL ONE THOUSAND
+ # 004D latin capital letter m
+2170 SMALL ROMAN NUMERAL ONE
+ # 0069 latin small letter i
+2171 SMALL ROMAN NUMERAL TWO
+ # 0069 0069
+2172 SMALL ROMAN NUMERAL THREE
+ # 0069 0069 0069
+2173 SMALL ROMAN NUMERAL FOUR
+ # 0069 0076
+2174 SMALL ROMAN NUMERAL FIVE
+ # 0076 latin small letter v
+2175 SMALL ROMAN NUMERAL SIX
+ # 0076 0069
+2176 SMALL ROMAN NUMERAL SEVEN
+ # 0076 0069 0069
+2177 SMALL ROMAN NUMERAL EIGHT
+ # 0076 0069 0069 0069
+2178 SMALL ROMAN NUMERAL NINE
+ # 0069 0078
+2179 SMALL ROMAN NUMERAL TEN
+ # 0078 latin small letter x
+217A SMALL ROMAN NUMERAL ELEVEN
+ # 0078 0069
+217B SMALL ROMAN NUMERAL TWELVE
+ # 0078 0069 0069
+217C SMALL ROMAN NUMERAL FIFTY
+ # 006C latin small letter l
+217D SMALL ROMAN NUMERAL ONE HUNDRED
+ # 0063 latin small letter c
+217E SMALL ROMAN NUMERAL FIVE HUNDRED
+ # 0064 latin small letter d
+217F SMALL ROMAN NUMERAL ONE THOUSAND
+ # 006D latin small letter m
+@ Archaic Roman numerals
+2180 ROMAN NUMERAL ONE THOUSAND C D
+2181 ROMAN NUMERAL FIVE THOUSAND
+2182 ROMAN NUMERAL TEN THOUSAND
+2183 ROMAN NUMERAL REVERSED ONE HUNDRED
+ = apostrophic C
+ = Claudian antisigma
+ * used in combination with C and I to form large numbers
+ * lowercase is 2184
+ x (greek capital reversed lunate sigma symbol - 03FD)
+@ Lowercase Claudian letter
+@+ Claudian letters in inscriptions are uppercase, but may be transcribed by scholars in lowercase.
+2184 LATIN SMALL LETTER REVERSED C
+ x (greek small reversed lunate sigma symbol - 037B)
+@ Archaic Roman numerals
+2185 ROMAN NUMERAL SIX LATE FORM
+ x (greek letter stigma - 03DA)
+2186 ROMAN NUMERAL FIFTY EARLY FORM
+ x (runic letter z - 16CE)
+ x (downwards arrow - 2193)
+2187 ROMAN NUMERAL FIFTY THOUSAND
+2188 ROMAN NUMERAL ONE HUNDRED THOUSAND
+@@ 2190 Arrows 21FF
+@ Simple arrows
+2190 LEFTWARDS ARROW
+ x (combining leftwards arrow overlay - 20EA)
+2191 UPWARDS ARROW
+ * IPA: egressive airflow
+2192 RIGHTWARDS ARROW
+ = z notation total function
+2193 DOWNWARDS ARROW
+ * IPA: ingressive airflow
+2194 LEFT RIGHT ARROW
+ = z notation relation
+2195 UP DOWN ARROW
+2196 NORTH WEST ARROW
+2197 NORTH EAST ARROW
+2198 SOUTH EAST ARROW
+2199 SOUTH WEST ARROW
+@ Arrows with modifications
+219A LEFTWARDS ARROW WITH STROKE
+ * negation of 2190
+ : 2190 0338
+219B RIGHTWARDS ARROW WITH STROKE
+ * negation of 2192
+ : 2192 0338
+219C LEFTWARDS WAVE ARROW
+ x (wave arrow pointing directly left - 2B3F)
+219D RIGHTWARDS WAVE ARROW
+219E LEFTWARDS TWO HEADED ARROW
+ = fast cursor left
+219F UPWARDS TWO HEADED ARROW
+ = fast cursor up
+21A0 RIGHTWARDS TWO HEADED ARROW
+ = z notation total surjection
+ = fast cursor right
+21A1 DOWNWARDS TWO HEADED ARROW
+ = form feed
+ = fast cursor down
+21A2 LEFTWARDS ARROW WITH TAIL
+21A3 RIGHTWARDS ARROW WITH TAIL
+ = z notation total injection
+21A4 LEFTWARDS ARROW FROM BAR
+21A5 UPWARDS ARROW FROM BAR
+21A6 RIGHTWARDS ARROW FROM BAR
+ = z notation maplet
+21A7 DOWNWARDS ARROW FROM BAR
+ = depth symbol
+21A8 UP DOWN ARROW WITH BASE
+21A9 LEFTWARDS ARROW WITH HOOK
+21AA RIGHTWARDS ARROW WITH HOOK
+21AB LEFTWARDS ARROW WITH LOOP
+21AC RIGHTWARDS ARROW WITH LOOP
+21AD LEFT RIGHT WAVE ARROW
+21AE LEFT RIGHT ARROW WITH STROKE
+ * negation of 2194
+ : 2194 0338
+21AF DOWNWARDS ZIGZAG ARROW
+ = electrolysis
+@ Arrows with bent tips
+@+ Other arrows with bent tips to complete this set can be found in the Miscellaneous Symbols and Arrows block.
+21B0 UPWARDS ARROW WITH TIP LEFTWARDS
+21B1 UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2 DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3 DOWNWARDS ARROW WITH TIP RIGHTWARDS
+@ Keyboard symbols and circle arrows
+21B4 RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+ = line feed
+21B5 DOWNWARDS ARROW WITH CORNER LEFTWARDS
+ * may indicate a carriage return or new line
+ x (return symbol - 23CE)
+21B6 ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7 CLOCKWISE TOP SEMICIRCLE ARROW
+21B8 NORTH WEST ARROW TO LONG BAR
+ = home
+21B9 LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+ = tab with shift tab
+21BA ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB CLOCKWISE OPEN CIRCLE ARROW
+@ Harpoons
+21BC LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0 RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1 RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2 DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3 DOWNWARDS HARPOON WITH BARB LEFTWARDS
+@ Paired arrows and harpoons
+21C4 RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5 UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6 LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7 LEFTWARDS PAIRED ARROWS
+21C8 UPWARDS PAIRED ARROWS
+21C9 RIGHTWARDS PAIRED ARROWS
+21CA DOWNWARDS PAIRED ARROWS
+21CB LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+@ Double arrows
+21CD LEFTWARDS DOUBLE ARROW WITH STROKE
+ * negation of 21D0
+ : 21D0 0338
+21CE LEFT RIGHT DOUBLE ARROW WITH STROKE
+ * negation of 21D4
+ : 21D4 0338
+21CF RIGHTWARDS DOUBLE ARROW WITH STROKE
+ * negation of 21D2
+ : 21D2 0338
+21D0 LEFTWARDS DOUBLE ARROW
+21D1 UPWARDS DOUBLE ARROW
+21D2 RIGHTWARDS DOUBLE ARROW
+21D3 DOWNWARDS DOUBLE ARROW
+21D4 LEFT RIGHT DOUBLE ARROW
+21D5 UP DOWN DOUBLE ARROW
+21D6 NORTH WEST DOUBLE ARROW
+21D7 NORTH EAST DOUBLE ARROW
+21D8 SOUTH EAST DOUBLE ARROW
+21D9 SOUTH WEST DOUBLE ARROW
+@ Miscellaneous arrows and keyboard symbols
+21DA LEFTWARDS TRIPLE ARROW
+21DB RIGHTWARDS TRIPLE ARROW
+21DC LEFTWARDS SQUIGGLE ARROW
+ x (long leftwards squiggle arrow - 2B33)
+21DD RIGHTWARDS SQUIGGLE ARROW
+21DE UPWARDS ARROW WITH DOUBLE STROKE
+ = page up
+21DF DOWNWARDS ARROW WITH DOUBLE STROKE
+ = page down
+21E0 LEFTWARDS DASHED ARROW
+21E1 UPWARDS DASHED ARROW
+21E2 RIGHTWARDS DASHED ARROW
+21E3 DOWNWARDS DASHED ARROW
+21E4 LEFTWARDS ARROW TO BAR
+ = leftward tab
+21E5 RIGHTWARDS ARROW TO BAR
+ = rightward tab
+@ White arrows and keyboard symbols
+21E6 LEFTWARDS WHITE ARROW
+ x (north east white arrow - 2B00)
+21E7 UPWARDS WHITE ARROW
+ = shift
+21E8 RIGHTWARDS WHITE ARROW
+21E9 DOWNWARDS WHITE ARROW
+21EA UPWARDS WHITE ARROW FROM BAR
+ = caps lock
+21EB UPWARDS WHITE ARROW ON PEDESTAL
+ = level 2 lock
+21EC UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+ = caps lock
+21ED UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+ = numerics lock
+21EE UPWARDS WHITE DOUBLE ARROW
+ = level 3 select
+21EF UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+ = level 3 lock
+21F0 RIGHTWARDS WHITE ARROW FROM WALL
+ = group lock
+21F1 NORTH WEST ARROW TO CORNER
+ = home
+21F2 SOUTH EAST ARROW TO CORNER
+ = end
+21F3 UP DOWN WHITE ARROW
+ = scrolling
+ x (left right white arrow - 2B04)
+@ Miscellaneous arrows
+21F4 RIGHT ARROW WITH SMALL CIRCLE
+ x (left arrow with small circle - 2B30)
+21F5 DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+21F6 THREE RIGHTWARDS ARROWS
+ x (three leftwards arrows - 2B31)
+21F7 LEFTWARDS ARROW WITH VERTICAL STROKE
+21F8 RIGHTWARDS ARROW WITH VERTICAL STROKE
+ = z notation partial function
+21F9 LEFT RIGHT ARROW WITH VERTICAL STROKE
+ = z notation partial relation
+21FA LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FB RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+ = z notation finite function
+21FC LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+ = z notation finite relation
+21FD LEFTWARDS OPEN-HEADED ARROW
+21FE RIGHTWARDS OPEN-HEADED ARROW
+21FF LEFT RIGHT OPEN-HEADED ARROW
+@@ 2200 Mathematical Operators 22FF
+@@+
+@ Miscellaneous mathematical symbols
+2200 FOR ALL
+ = universal quantifier
+2201 COMPLEMENT
+ x (latin letter stretched c - 0297)
+2202 PARTIAL DIFFERENTIAL
+2203 THERE EXISTS
+ = existential quantifier
+2204 THERE DOES NOT EXIST
+ : 2203 0338
+2205 EMPTY SET
+ = null set
+ * used in linguistics to indicate a null morpheme or phonological "zero"
+ x (latin capital letter o with stroke - 00D8)
+ x (diameter sign - 2300)
+2206 INCREMENT
+ = Laplace operator
+ = forward difference
+ = symmetric difference (in set theory)
+ * other symbols may also be used for symmetric difference
+ x (greek capital letter delta - 0394)
+ x (white up-pointing triangle - 25B3)
+2207 NABLA
+ = backward difference
+ = gradient, del
+ * used for Laplacian operator (written with superscript 2)
+ x (white down-pointing triangle - 25BD)
+@ Set membership
+2208 ELEMENT OF
+2209 NOT AN ELEMENT OF
+ : 2208 0338
+220A SMALL ELEMENT OF
+ * originates in math pi fonts; not the straight epsilon
+ x (greek lunate epsilon symbol - 03F5)
+220B CONTAINS AS MEMBER
+ = such that
+220C DOES NOT CONTAIN AS MEMBER
+ : 220B 0338
+220D SMALL CONTAINS AS MEMBER
+ x (greek reversed lunate epsilon symbol - 03F6)
+@ Miscellaneous mathematical symbol
+220E END OF PROOF
+ = q.e.d.
+ x (triangular bullet - 2023)
+ x (black vertical rectangle - 25AE)
+@ N-ary operators
+220F N-ARY PRODUCT
+ = product sign
+ x (greek capital letter pi - 03A0)
+2210 N-ARY COPRODUCT
+ = coproduct sign
+2211 N-ARY SUMMATION
+ = summation sign
+ x (greek capital letter sigma - 03A3)
+ x (double-struck n-ary summation - 2140)
+@ Operators
+2212 MINUS SIGN
+ x (hyphen-minus - 002D)
+2213 MINUS-OR-PLUS SIGN
+ x (plus-minus sign - 00B1)
+2214 DOT PLUS
+2215 DIVISION SLASH
+ * generic division operator
+ x (solidus - 002F)
+ x (fraction slash - 2044)
+2216 SET MINUS
+ x (reverse solidus - 005C)
+2217 ASTERISK OPERATOR
+ x (asterisk - 002A)
+2218 RING OPERATOR
+ = composite function
+ = APL jot
+ x (degree sign - 00B0)
+ x (white bullet - 25E6)
+2219 BULLET OPERATOR
+ x (middle dot - 00B7)
+ x (bullet - 2022)
+ x (one dot leader - 2024)
+221A SQUARE ROOT
+ = radical sign
+ x (check mark - 2713)
+221B CUBE ROOT
+ x (arabic-indic cube root - 0606)
+221C FOURTH ROOT
+ x (arabic-indic fourth root - 0607)
+221D PROPORTIONAL TO
+ x (greek small letter alpha - 03B1)
+@ Miscellaneous mathematical symbols
+221E INFINITY
+221F RIGHT ANGLE
+2220 ANGLE
+2221 MEASURED ANGLE
+2222 SPHERICAL ANGLE
+ = angle arc
+@ Operators
+2223 DIVIDES
+ = such that
+ = APL stile
+ x (vertical line - 007C)
+ x (latin letter dental click - 01C0)
+2224 DOES NOT DIVIDE
+ : 2223 0338
+2225 PARALLEL TO
+ x (latin letter lateral click - 01C1)
+ x (double vertical line - 2016)
+2226 NOT PARALLEL TO
+ : 2225 0338
+@ Logical and set operators
+2227 LOGICAL AND
+ = wedge, conjunction
+ x (n-ary logical and - 22C0)
+ x (up arrowhead - 2303)
+2228 LOGICAL OR
+ = vee, disjunction
+ x (n-ary logical or - 22C1)
+ x (down arrowhead - 2304)
+2229 INTERSECTION
+ = cap, hat
+ x (n-ary intersection - 22C2)
+222A UNION
+ = cup
+ x (n-ary union - 22C3)
+@ Integrals
+222B INTEGRAL
+ x (latin small letter esh - 0283)
+222C DOUBLE INTEGRAL
+ # 222B 222B
+222D TRIPLE INTEGRAL
+ x (quadruple integral operator - 2A0C)
+ # 222B 222B 222B
+222E CONTOUR INTEGRAL
+ x (integral around a point operator - 2A15)
+222F SURFACE INTEGRAL
+ # 222E 222E
+2230 VOLUME INTEGRAL
+ # 222E 222E 222E
+2231 CLOCKWISE INTEGRAL
+2232 CLOCKWISE CONTOUR INTEGRAL
+2233 ANTICLOCKWISE CONTOUR INTEGRAL
+ * clockwise or anticlockwise arrows do not reverse during layout mirroring
+@ Miscellaneous mathematical symbols
+2234 THEREFORE
+2235 BECAUSE
+@ Relations
+2236 RATIO
+ x (colon - 003A)
+2237 PROPORTION
+@ Operator
+2238 DOT MINUS
+ = saturating subtraction
+ * sometimes claimed as notation for symmetric set difference, but 2206 is preferred
+@ Relation
+2239 EXCESS
+@ Operator
+223A GEOMETRIC PROPORTION
+@ Relations
+223B HOMOTHETIC
+ x (tilde operator with rising dots - 2A6B)
+223C TILDE OPERATOR
+ = varies with (proportional to)
+ = difference between
+ = similar to
+ = not
+ = cycle
+ = APL tilde
+ x (tilde - 007E)
+ x (not sign - 00AC)
+ x (small tilde - 02DC)
+223D REVERSED TILDE (lazy S)
+ = lazy S
+ * reversed tilde and lazy S are glyph variants
+223E INVERTED LAZY S
+ = most positive
+@ Miscellaneous mathematical symbol
+223F SINE WAVE
+ = alternating current
+@ Operator
+2240 WREATH PRODUCT
+@ Relations
+2241 NOT TILDE
+ : 223C 0338
+2242 MINUS TILDE
+2243 ASYMPTOTICALLY EQUAL TO
+2244 NOT ASYMPTOTICALLY EQUAL TO
+ : 2243 0338
+2245 APPROXIMATELY EQUAL TO
+2246 APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247 NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+ : 2245 0338
+2248 ALMOST EQUAL TO
+ = asymptotic to
+2249 NOT ALMOST EQUAL TO
+ : 2248 0338
+224A ALMOST EQUAL OR EQUAL TO
+224B TRIPLE TILDE
+224C ALL EQUAL TO
+ * reversed tilde and lazy S are glyph variants
+224D EQUIVALENT TO
+224E GEOMETRICALLY EQUIVALENT TO
+224F DIFFERENCE BETWEEN
+2250 APPROACHES THE LIMIT
+2251 GEOMETRICALLY EQUAL TO
+2252 APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ = nearly equals
+2253 IMAGE OF OR APPROXIMATELY EQUAL TO
+2254 COLON EQUALS
+2255 EQUALS COLON
+2256 RING IN EQUAL TO
+2257 RING EQUAL TO
+ = approximately equal to
+2258 CORRESPONDS TO
+2259 ESTIMATES
+ = corresponds to
+225A EQUIANGULAR TO
+225B STAR EQUALS
+225C DELTA EQUAL TO
+ = equiangular
+ = equal to by definition
+225D EQUAL TO BY DEFINITION
+225E MEASURED BY
+225F QUESTIONED EQUAL TO
+2260 NOT EQUAL TO
+ x (equals sign - 003D)
+ x (latin letter alveolar click - 01C2)
+ : 003D 0338
+2261 IDENTICAL TO
+2262 NOT IDENTICAL TO
+ : 2261 0338
+2263 STRICTLY EQUIVALENT TO
+2264 LESS-THAN OR EQUAL TO
+2265 GREATER-THAN OR EQUAL TO
+2266 LESS-THAN OVER EQUAL TO
+2267 GREATER-THAN OVER EQUAL TO
+2268 LESS-THAN BUT NOT EQUAL TO
+2269 GREATER-THAN BUT NOT EQUAL TO
+226A MUCH LESS-THAN
+ x (left-pointing double angle quotation mark - 00AB)
+226B MUCH GREATER-THAN
+ x (right-pointing double angle quotation mark - 00BB)
+226C BETWEEN
+ = plaintiff, quantic
+226D NOT EQUIVALENT TO
+ : 224D 0338
+226E NOT LESS-THAN
+ : 003C 0338
+226F NOT GREATER-THAN
+ : 003E 0338
+2270 NEITHER LESS-THAN NOR EQUAL TO
+ : 2264 0338
+2271 NEITHER GREATER-THAN NOR EQUAL TO
+ : 2265 0338
+2272 LESS-THAN OR EQUIVALENT TO
+2273 GREATER-THAN OR EQUIVALENT TO
+2274 NEITHER LESS-THAN NOR EQUIVALENT TO
+ : 2272 0338
+2275 NEITHER GREATER-THAN NOR EQUIVALENT TO
+ : 2273 0338
+2276 LESS-THAN OR GREATER-THAN
+2277 GREATER-THAN OR LESS-THAN
+2278 NEITHER LESS-THAN NOR GREATER-THAN
+ : 2276 0338
+2279 NEITHER GREATER-THAN NOR LESS-THAN
+ : 2277 0338
+227A PRECEDES
+ = lower rank than
+ x (precedes under relation - 22B0)
+227B SUCCEEDS
+ = higher rank than
+ x (succeeds under relation - 22B1)
+227C PRECEDES OR EQUAL TO
+227D SUCCEEDS OR EQUAL TO
+227E PRECEDES OR EQUIVALENT TO
+227F SUCCEEDS OR EQUIVALENT TO
+2280 DOES NOT PRECEDE
+ : 227A 0338
+2281 DOES NOT SUCCEED
+ : 227B 0338
+2282 SUBSET OF
+ = included in set
+ x (left sideways u bracket - 2E26)
+2283 SUPERSET OF
+ = includes in set
+ x (right sideways u bracket - 2E27)
+2284 NOT A SUBSET OF
+ : 2282 0338
+2285 NOT A SUPERSET OF
+ : 2283 0338
+2286 SUBSET OF OR EQUAL TO
+2287 SUPERSET OF OR EQUAL TO
+2288 NEITHER A SUBSET OF NOR EQUAL TO
+ : 2286 0338
+2289 NEITHER A SUPERSET OF NOR EQUAL TO
+ : 2287 0338
+228A SUBSET OF WITH NOT EQUAL TO
+228B SUPERSET OF WITH NOT EQUAL TO
+@ Operators
+228C MULTISET
+228D MULTISET MULTIPLICATION
+ x (n-ary union operator with dot - 2A03)
+ x (intersection with dot - 2A40)
+228E MULTISET UNION
+ = z notation bag addition
+ x (n-ary union operator with plus - 2A04)
+@ Relations
+228F SQUARE IMAGE OF
+2290 SQUARE ORIGINAL OF
+2291 SQUARE IMAGE OF OR EQUAL TO
+2292 SQUARE ORIGINAL OF OR EQUAL TO
+@ Operators
+2293 SQUARE CAP
+ x (n-ary square intersection operator - 2A05)
+2294 SQUARE CUP
+2295 CIRCLED PLUS
+ = direct sum
+ = vector pointing into page
+ x (earth - 2641)
+ x (n-ary circled plus operator - 2A01)
+2296 CIRCLED MINUS
+ = symmetric difference
+ x (circle with horizontal bar - 29B5)
+2297 CIRCLED TIMES
+ = tensor product
+ = vector pointing into page
+ x (n-ary circled times operator - 2A02)
+2298 CIRCLED DIVISION SLASH
+2299 CIRCLED DOT OPERATOR
+ = direct product
+ = vector pointing out of page
+ x (latin letter bilabial click - 0298)
+ x (sun - 2609)
+ x (n-ary circled dot operator - 2A00)
+229A CIRCLED RING OPERATOR
+ x (apl functional symbol circle jot - 233E)
+ x (bullseye - 25CE)
+229B CIRCLED ASTERISK OPERATOR
+ x (apl functional symbol circle star - 235F)
+229C CIRCLED EQUALS
+229D CIRCLED DASH
+229E SQUARED PLUS
+229F SQUARED MINUS
+22A0 SQUARED TIMES
+ x (ballot box with x - 2612)
+22A1 SQUARED DOT OPERATOR
+22A2 RIGHT TACK
+ = turnstile
+ = proves, implies, yields
+ = reducible
+22A3 LEFT TACK
+ = reverse turnstile
+ = non-theorem, does not yield
+@ Miscellaneous mathematical symbols
+22A4 DOWN TACK
+ = top
+ x (raised interpolation marker - 2E06)
+22A5 UP TACK
+ = base, bottom
+ x (perpendicular - 27C2)
+@ Relations
+22A6 ASSERTION
+ = reduces to
+22A7 MODELS
+22A8 TRUE
+ = statement is true, valid
+ = is a tautology
+ = satisfies
+ = results in
+22A9 FORCES
+22AA TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC DOES NOT PROVE
+ : 22A2 0338
+22AD NOT TRUE
+ : 22A8 0338
+22AE DOES NOT FORCE
+ : 22A9 0338
+22AF NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+ : 22AB 0338
+22B0 PRECEDES UNDER RELATION
+ x (precedes - 227A)
+22B1 SUCCEEDS UNDER RELATION
+ x (succeeds - 227B)
+22B2 NORMAL SUBGROUP OF
+ x (white left-pointing pointer - 25C5)
+22B3 CONTAINS AS NORMAL SUBGROUP
+ x (white right-pointing pointer - 25BB)
+22B4 NORMAL SUBGROUP OF OR EQUAL TO
+22B5 CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6 ORIGINAL OF
+22B7 IMAGE OF
+22B8 MULTIMAP
+22B9 HERMITIAN CONJUGATE MATRIX
+@ Operators
+22BA INTERCALATE
+22BB XOR
+ x (semisextile - 26BA)
+22BC NAND
+ x (projective - 2305)
+ x (quincunx - 26BB)
+22BD NOR
+@ Miscellaneous mathematical symbols
+22BE RIGHT ANGLE WITH ARC
+22BF RIGHT TRIANGLE
+@ N-ary operators
+22C0 N-ARY LOGICAL AND
+ * also used to denote the universal quantifier
+ x (logical and - 2227)
+22C1 N-ARY LOGICAL OR
+ * also used to denote the existential quantifier
+ x (logical or - 2228)
+22C2 N-ARY INTERSECTION
+ = z notation generalised intersection
+ x (intersection - 2229)
+22C3 N-ARY UNION
+ = z notation generalised union
+ x (union - 222A)
+@ Operators
+22C4 DIAMOND OPERATOR
+ x (white diamond - 25C7)
+ x (black small diamond - 2B29)
+22C5 DOT OPERATOR
+ x (middle dot - 00B7)
+22C6 STAR OPERATOR
+ * APL
+ x (arabic five pointed star - 066D)
+ x (black star - 2605)
+ x (white medium star - 2B50)
+22C7 DIVISION TIMES
+@ Relation
+22C8 BOWTIE
+ x (ocr bow tie - 2445)
+@ Operators
+22C9 LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB LEFT SEMIDIRECT PRODUCT
+22CC RIGHT SEMIDIRECT PRODUCT
+ x (caret insertion point - 2041)
+@ Relation
+22CD REVERSED TILDE EQUALS
+@ Logical operators
+22CE CURLY LOGICAL OR
+22CF CURLY LOGICAL AND
+@ Relations
+22D0 DOUBLE SUBSET
+22D1 DOUBLE SUPERSET
+@ Operators
+22D2 DOUBLE INTERSECTION
+22D3 DOUBLE UNION
+@ Relations
+22D4 PITCHFORK
+ = proper intersection
+22D5 EQUAL AND PARALLEL TO
+ x (viewdata square - 2317)
+22D6 LESS-THAN WITH DOT
+22D7 GREATER-THAN WITH DOT
+22D8 VERY MUCH LESS-THAN
+22D9 VERY MUCH GREATER-THAN
+22DA LESS-THAN EQUAL TO OR GREATER-THAN
+22DB GREATER-THAN EQUAL TO OR LESS-THAN
+22DC EQUAL TO OR LESS-THAN
+22DD EQUAL TO OR GREATER-THAN
+22DE EQUAL TO OR PRECEDES
+22DF EQUAL TO OR SUCCEEDS
+22E0 DOES NOT PRECEDE OR EQUAL
+ : 227C 0338
+22E1 DOES NOT SUCCEED OR EQUAL
+ : 227D 0338
+22E2 NOT SQUARE IMAGE OF OR EQUAL TO
+ : 2291 0338
+22E3 NOT SQUARE ORIGINAL OF OR EQUAL TO
+ : 2292 0338
+22E4 SQUARE IMAGE OF OR NOT EQUAL TO
+22E5 SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6 LESS-THAN BUT NOT EQUIVALENT TO
+22E7 GREATER-THAN BUT NOT EQUIVALENT TO
+22E8 PRECEDES BUT NOT EQUIVALENT TO
+22E9 SUCCEEDS BUT NOT EQUIVALENT TO
+22EA NOT NORMAL SUBGROUP OF
+ : 22B2 0338
+22EB DOES NOT CONTAIN AS NORMAL SUBGROUP
+ : 22B3 0338
+22EC NOT NORMAL SUBGROUP OF OR EQUAL TO
+ : 22B4 0338
+22ED DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+ : 22B5 0338
+22EE VERTICAL ELLIPSIS
+ * these four ellipses are used for matrix row/column elision
+ x (tricolon - 205D)
+ x (horizontal ellipsis - 2026)
+ x (presentation form for vertical horizontal ellipsis - FE19)
+22EF MIDLINE HORIZONTAL ELLIPSIS
+22F0 UP RIGHT DIAGONAL ELLIPSIS
+22F1 DOWN RIGHT DIAGONAL ELLIPSIS
+22F2 ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3 ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4 SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F5 ELEMENT OF WITH DOT ABOVE
+22F6 ELEMENT OF WITH OVERBAR
+22F7 SMALL ELEMENT OF WITH OVERBAR
+22F8 ELEMENT OF WITH UNDERBAR
+22F9 ELEMENT OF WITH TWO HORIZONTAL STROKES
+22FA CONTAINS WITH LONG HORIZONTAL STROKE
+22FB CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD CONTAINS WITH OVERBAR
+22FE SMALL CONTAINS WITH OVERBAR
+22FF Z NOTATION BAG MEMBERSHIP
+@@ 2300 Miscellaneous Technical 23FF
+@ Miscellaneous technical
+2300 DIAMETER SIGN
+ x (empty set - 2205)
+2301 ELECTRIC ARROW
+ * from ISO 2047
+ * symbol for End of Transmission
+2302 HOUSE
+2303 UP ARROWHEAD
+ x (circumflex accent - 005E)
+ x (modifier letter up arrowhead - 02C4)
+ x (caret - 2038)
+ x (logical and - 2227)
+2304 DOWN ARROWHEAD
+ x (modifier letter down arrowhead - 02C5)
+ x (logical or - 2228)
+ x (countersink - 2335)
+2305 PROJECTIVE
+ x (nand - 22BC)
+2306 PERSPECTIVE
+2307 WAVY LINE
+ x (wavy dash - 3030)
+@ Ceilings and floors
+@+ These characters are tall and narrow mathematical delimiters, in contrast to the quine corners or half brackets. They are also distinct from CJK corner brackets, which are wide quotation marks.
+2308 LEFT CEILING
+ = APL upstile
+ x (top left half bracket - 2E22)
+ x (left corner bracket - 300C)
+2309 RIGHT CEILING
+ x (combining annuity symbol - 20E7)
+ x (top right half bracket - 2E23)
+230A LEFT FLOOR
+ = APL downstile
+ x (bottom left half bracket - 2E24)
+230B RIGHT FLOOR
+ x (right corner bracket - 300D)
+ x (bottom right half bracket - 2E25)
+@ Crops
+230C BOTTOM RIGHT CROP
+ * set of four "crop" corners, arranged facing outward
+230D BOTTOM LEFT CROP
+230E TOP RIGHT CROP
+230F TOP LEFT CROP
+@ Miscellaneous technical
+2310 REVERSED NOT SIGN
+ = beginning of line
+ x (not sign - 00AC)
+2311 SQUARE LOZENGE
+ = Kissen (pillow)
+ * used as a command delimiter in some very old computers
+2312 ARC
+ x (upper half circle - 25E0)
+2313 SEGMENT
+2314 SECTOR
+2315 TELEPHONE RECORDER
+2316 POSITION INDICATOR
+2317 VIEWDATA SQUARE
+ x (equal and parallel to - 22D5)
+2318 PLACE OF INTEREST SIGN
+ = command key (1.0)
+2319 TURNED NOT SIGN
+ = line marker
+@ GUI icons
+231A WATCH
+231B HOURGLASS
+@ Quine corners
+@+ These form a set of four quine corners, for quincuncial arrangement. They are also used in upper and lower pairs in mathematic, or more rarely in editorial usage as alternatives to half brackets.
+231C TOP LEFT CORNER
+ x (right angle substitution marker - 2E00)
+ x (top left half bracket - 2E22)
+231D TOP RIGHT CORNER
+231E BOTTOM LEFT CORNER
+231F BOTTOM RIGHT CORNER
+@ Integral pieces
+2320 TOP HALF INTEGRAL
+ x (integral extension - 23AE)
+2321 BOTTOM HALF INTEGRAL
+@ Frown and smile
+2322 FROWN
+ x (character tie - 2040)
+2323 SMILE
+ x (undertie - 203F)
+@ Keyboard symbols
+2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+ = enter key
+2325 OPTION KEY
+2326 ERASE TO THE RIGHT
+ = delete to the right key
+2327 X IN A RECTANGLE BOX
+ = clear key
+2328 KEYBOARD
+@ Angle brackets
+@+ These are discouraged for mathematical use because of their canonical equivalence to CJK punctuation.
+2329 LEFT-POINTING ANGLE BRACKET
+ x (less-than sign - 003C)
+ x (single left-pointing angle quotation mark - 2039)
+ x (mathematical left angle bracket - 27E8)
+ : 3008 left angle bracket
+232A RIGHT-POINTING ANGLE BRACKET
+ x (greater-than sign - 003E)
+ x (single right-pointing angle quotation mark - 203A)
+ x (mathematical right angle bracket - 27E9)
+ : 3009 right angle bracket
+@ Keyboard symbol
+232B ERASE TO THE LEFT
+ = delete to the left key
+@ Chemistry symbol
+232C BENZENE RING
+@ Drafting symbols
+232D CYLINDRICITY
+232E ALL AROUND-PROFILE
+232F SYMMETRY
+2330 TOTAL RUNOUT
+2331 DIMENSION ORIGIN
+2332 CONICAL TAPER
+2333 SLOPE
+ x (lower left triangle - 25FA)
+2334 COUNTERBORE
+ x (open box - 2423)
+2335 COUNTERSINK
+ x (down arrowhead - 2304)
+@ APL
+2336 APL FUNCTIONAL SYMBOL I-BEAM
+2337 APL FUNCTIONAL SYMBOL SQUISH QUAD
+ x (apl functional symbol quad - 2395)
+ x (white vertical rectangle - 25AF)
+ x (n-ary white vertical bar - 2AFF)
+2338 APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339 APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B APL FUNCTIONAL SYMBOL QUAD JOT
+ x (squared small circle - 29C7)
+233C APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E APL FUNCTIONAL SYMBOL CIRCLE JOT
+ x (circled ring operator - 229A)
+ x (circled white bullet - 29BE)
+233F APL FUNCTIONAL SYMBOL SLASH BAR
+ x (roman as sign - 1019A)
+2340 APL FUNCTIONAL SYMBOL BACKSLASH BAR
+ x (reverse solidus with horizontal stroke - 29F7)
+2341 APL FUNCTIONAL SYMBOL QUAD SLASH
+ x (squared rising diagonal slash - 29C4)
+2342 APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+ x (squared falling diagonal slash - 29C5)
+2343 APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344 APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345 APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346 APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347 APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348 APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349 APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+ x (reversed empty set - 29B0)
+234A APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR *
+ = up tack underbar
+ * preferred naming for APL tack symbols now follows the London Convention in ISO/IEC 13751:2000 (APL Extended)
+ x (up tack - 22A5)
+234B APL FUNCTIONAL SYMBOL DELTA STILE
+234C APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D APL FUNCTIONAL SYMBOL QUAD DELTA
+234E APL FUNCTIONAL SYMBOL DOWN TACK JOT *
+ = up tack jot
+ x (up tack - 22A5)
+234F APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350 APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351 APL FUNCTIONAL SYMBOL UP TACK OVERBAR *
+ = down tack overbar
+ x (down tack - 22A4)
+ x (postal mark - 3012)
+2352 APL FUNCTIONAL SYMBOL DEL STILE
+2353 APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354 APL FUNCTIONAL SYMBOL QUAD DEL
+2355 APL FUNCTIONAL SYMBOL UP TACK JOT *
+ = down tack jot
+ x (down tack - 22A4)
+2356 APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357 APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358 APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359 APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D APL FUNCTIONAL SYMBOL UP SHOE JOT
+ x (intersection with dot - 2A40)
+235E APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F APL FUNCTIONAL SYMBOL CIRCLE STAR
+ x (circled asterisk operator - 229B)
+2360 APL FUNCTIONAL SYMBOL QUAD COLON
+2361 APL FUNCTIONAL SYMBOL UP TACK DIAERESIS *
+ = down tack diaeresis
+ x (down tack - 22A4)
+2362 APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363 APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364 APL FUNCTIONAL SYMBOL JOT DIAERESIS
+ = hoot
+2365 APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+ = holler
+2366 APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367 APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368 APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+ = smirk
+2369 APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A APL FUNCTIONAL SYMBOL COMMA BAR
+236B APL FUNCTIONAL SYMBOL DEL TILDE
+236C APL FUNCTIONAL SYMBOL ZILDE
+236D APL FUNCTIONAL SYMBOL STILE TILDE
+236E APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370 APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371 APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372 APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373 APL FUNCTIONAL SYMBOL IOTA
+2374 APL FUNCTIONAL SYMBOL RHO
+2375 APL FUNCTIONAL SYMBOL OMEGA
+2376 APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377 APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378 APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379 APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A APL FUNCTIONAL SYMBOL ALPHA
+@ Graphics for control codes
+237B NOT CHECK MARK
+ * from ISO 2047
+ * symbol for Negative Acknowledge
+@ Miscellaneous technical
+237C RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+@ Graphics for control codes
+237D SHOULDERED OPEN BOX
+ * from ISO 9995-7
+ * keyboard symbol for No Break Space
+ x (open box - 2423)
+237E BELL SYMBOL
+ * from ISO 2047
+237F VERTICAL LINE WITH MIDDLE DOT
+ * from ISO 2047
+ * symbol for End of Medium
+@ Keyboard symbols from ISO 9995-7
+2380 INSERTION SYMBOL
+2381 CONTINUOUS UNDERLINE SYMBOL
+2382 DISCONTINUOUS UNDERLINE SYMBOL
+2383 EMPHASIS SYMBOL
+2384 COMPOSITION SYMBOL
+2385 WHITE SQUARE WITH CENTRE VERTICAL LINE
+ = center
+2386 ENTER SYMBOL
+2387 ALTERNATIVE KEY SYMBOL
+2388 HELM SYMBOL
+ = control
+ x (wheel of dharma - 2638)
+2389 CIRCLED HORIZONTAL BAR WITH NOTCH (pause)
+ = pause
+238A CIRCLED TRIANGLE DOWN (break)
+ = interrupt
+238B BROKEN CIRCLE WITH NORTHWEST ARROW (escape)
+ = escape
+238C UNDO SYMBOL
+@ Electrotechnical symbols from IR 181
+238D MONOSTABLE SYMBOL
+238E HYSTERESIS SYMBOL
+238F OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390 OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391 PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392 PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393 DIRECT CURRENT SYMBOL FORM TWO
+2394 SOFTWARE-FUNCTION SYMBOL
+@ APL
+2395 APL FUNCTIONAL SYMBOL QUAD
+ x (apl functional symbol squish quad - 2337)
+ x (white vertical rectangle - 25AF)
+@ Keyboard symbols from ISO 9995-7
+2396 DECIMAL SEPARATOR KEY SYMBOL
+2397 PREVIOUS PAGE
+2398 NEXT PAGE
+2399 PRINT SCREEN SYMBOL
+239A CLEAR SCREEN SYMBOL
+ x (combining enclosing screen - 20E2)
+@ Bracket pieces
+239B LEFT PARENTHESIS UPPER HOOK
+239C LEFT PARENTHESIS EXTENSION
+239D LEFT PARENTHESIS LOWER HOOK
+239E RIGHT PARENTHESIS UPPER HOOK
+239F RIGHT PARENTHESIS EXTENSION
+23A0 RIGHT PARENTHESIS LOWER HOOK
+23A1 LEFT SQUARE BRACKET UPPER CORNER
+23A2 LEFT SQUARE BRACKET EXTENSION
+23A3 LEFT SQUARE BRACKET LOWER CORNER
+23A4 RIGHT SQUARE BRACKET UPPER CORNER
+23A5 RIGHT SQUARE BRACKET EXTENSION
+23A6 RIGHT SQUARE BRACKET LOWER CORNER
+23A7 LEFT CURLY BRACKET UPPER HOOK
+23A8 LEFT CURLY BRACKET MIDDLE PIECE
+23A9 LEFT CURLY BRACKET LOWER HOOK
+23AA CURLY BRACKET EXTENSION
+23AB RIGHT CURLY BRACKET UPPER HOOK
+23AC RIGHT CURLY BRACKET MIDDLE PIECE
+23AD RIGHT CURLY BRACKET LOWER HOOK
+@ Special character extensions
+23AE INTEGRAL EXTENSION
+ x (top half integral - 2320)
+ x (bottom half integral - 2321)
+23AF HORIZONTAL LINE EXTENSION
+ * used for extension of arrows
+ x (vertical line extension - 23D0)
+@ Bracket pieces
+23B0 UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+ = left moustache
+23B1 UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+ = right moustache
+@ Summation sign parts
+23B2 SUMMATION TOP
+23B3 SUMMATION BOTTOM
+ x (n-ary summation - 2211)
+@ Horizontal brackets
+@+ These characters are also used as delimiters of vertical text in non-CJK terminal emulation.
+23B4 TOP SQUARE BRACKET
+ x (presentation form for vertical left square bracket - FE47)
+23B5 BOTTOM SQUARE BRACKET
+ x (presentation form for vertical right square bracket - FE48)
+23B6 BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+ * only used for terminal emulation
+@ Terminal graphic characters
+23B7 RADICAL SYMBOL BOTTOM
+23B8 LEFT VERTICAL BOX LINE
+23B9 RIGHT VERTICAL BOX LINE
+@ Scan lines for terminal graphics
+@+ The scan line numbers here refer to old, low-resolution technology for terminals, with only 9 scan lines per fixed-size character glyph. Even-numbered scan lines are unified with box-drawing graphics.
+23BA HORIZONTAL SCAN LINE-1
+23BB HORIZONTAL SCAN LINE-3
+23BC HORIZONTAL SCAN LINE-7
+23BD HORIZONTAL SCAN LINE-9
+@ Dentistry notation symbols
+23BE DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+ x (left ceiling - 2308)
+23BF DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+ x (left floor - 230A)
+23C0 DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
+23C1 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
+23C2 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
+23C3 DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE
+23C4 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE
+23C5 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE
+23C6 DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE
+23C7 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
+23C8 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
+23C9 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+ x (down tack - 22A4)
+ x (box drawings light down and horizontal - 252C)
+23CA DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+ x (up tack - 22A5)
+ x (box drawings light up and horizontal - 2534)
+23CB DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+ x (right ceiling - 2309)
+23CC DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+ x (right floor - 230B)
+@ Miscellaneous technical
+23CD SQUARE FOOT
+@ Keyboard and UI symbols
+23CE RETURN SYMBOL
+ * may be shown with either hollow or filled glyph
+ x (downwards arrow with corner leftwards - 21B5)
+23CF EJECT SYMBOL
+ * UI symbol to eject media
+@ Special character extension
+23D0 VERTICAL LINE EXTENSION
+ * used for extension of arrows
+ x (horizontal line extension - 23AF)
+@ Metrical symbols
+23D1 METRICAL BREVE
+23D2 METRICAL LONG OVER SHORT
+23D3 METRICAL SHORT OVER LONG
+23D4 METRICAL LONG OVER TWO SHORTS
+23D5 METRICAL TWO SHORTS OVER LONG
+23D6 METRICAL TWO SHORTS JOINED
+23D7 METRICAL TRISEME
+ x (combining greek musical triseme - 1D242)
+23D8 METRICAL TETRASEME
+ x (combining greek musical tetraseme - 1D243)
+23D9 METRICAL PENTASEME
+ x (combining greek musical pentaseme - 1D244)
+@ Electrotechnical symbols
+23DA EARTH GROUND
+23DB FUSE
+@ Horizontal brackets
+@+ These are intended for bracketing terms of mathematical expressions where their glyph extends to accommodate the width of the bracketed expression
+23DC TOP PARENTHESIS (mathematical use)
+ x (presentation form for vertical left parenthesis - FE35)
+23DD BOTTOM PARENTHESIS (mathematical use)
+ x (presentation form for vertical right parenthesis - FE36)
+23DE TOP CURLY BRACKET (mathematical use)
+ x (presentation form for vertical left curly bracket - FE37)
+23DF BOTTOM CURLY BRACKET (mathematical use)
+ x (presentation form for vertical right curly bracket - FE38)
+23E0 TOP TORTOISE SHELL BRACKET (mathematical use)
+ x (presentation form for vertical left tortoise shell bracket - FE39)
+23E1 BOTTOM TORTOISE SHELL BRACKET (mathematical use)
+ x (presentation form for vertical right tortoise shell bracket - FE3A)
+@ Miscellaneous technical
+23E2 WHITE TRAPEZIUM
+@ Chemistry symbol
+23E3 BENZENE RING WITH CIRCLE
+@ Miscellaneous technical
+23E4 STRAIGHTNESS
+23E5 FLATNESS
+23E6 AC CURRENT
+23E7 ELECTRICAL INTERSECTION
+@@ 2400 Control Pictures 243F
+@+ The diagonal lettering glyphs are only exemplary; alternate representations may be, and often are used in the visible display of control codes.
+@ Graphic pictures for control codes
+2400 SYMBOL FOR NULL
+2401 SYMBOL FOR START OF HEADING
+2402 SYMBOL FOR START OF TEXT
+2403 SYMBOL FOR END OF TEXT
+2404 SYMBOL FOR END OF TRANSMISSION
+2405 SYMBOL FOR ENQUIRY
+2406 SYMBOL FOR ACKNOWLEDGE
+2407 SYMBOL FOR BELL
+2408 SYMBOL FOR BACKSPACE
+2409 SYMBOL FOR HORIZONTAL TABULATION
+240A SYMBOL FOR LINE FEED
+240B SYMBOL FOR VERTICAL TABULATION
+240C SYMBOL FOR FORM FEED
+240D SYMBOL FOR CARRIAGE RETURN
+240E SYMBOL FOR SHIFT OUT
+240F SYMBOL FOR SHIFT IN
+2410 SYMBOL FOR DATA LINK ESCAPE
+2411 SYMBOL FOR DEVICE CONTROL ONE
+2412 SYMBOL FOR DEVICE CONTROL TWO
+2413 SYMBOL FOR DEVICE CONTROL THREE
+2414 SYMBOL FOR DEVICE CONTROL FOUR
+2415 SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416 SYMBOL FOR SYNCHRONOUS IDLE
+2417 SYMBOL FOR END OF TRANSMISSION BLOCK
+2418 SYMBOL FOR CANCEL
+2419 SYMBOL FOR END OF MEDIUM
+241A SYMBOL FOR SUBSTITUTE
+241B SYMBOL FOR ESCAPE
+241C SYMBOL FOR FILE SEPARATOR
+241D SYMBOL FOR GROUP SEPARATOR
+241E SYMBOL FOR RECORD SEPARATOR
+241F SYMBOL FOR UNIT SEPARATOR
+2420 SYMBOL FOR SPACE
+2421 SYMBOL FOR DELETE
+@ Specific symbols for space
+2422 BLANK SYMBOL
+ * graphic for space
+ x (latin small letter b with stroke - 0180)
+2423 OPEN BOX
+ * graphic for space
+ x (counterbore - 2334)
+@ Graphic picture for control code
+2424 SYMBOL FOR NEWLINE
+@ Keyboard symbol
+2425 SYMBOL FOR DELETE FORM TWO
+ * from ISO 9995-7
+ * keyboard symbol for undoable delete
+@ Specific symbol for control code
+2426 SYMBOL FOR SUBSTITUTE FORM TWO
+ * from ISO 2047
+ x (arabic question mark - 061F)
+@@ 2440 Optical Character Recognition 245F
+@ OCR
+2440 OCR HOOK
+2441 OCR CHAIR
+2442 OCR FORK
+2443 OCR INVERTED FORK
+2444 OCR BELT BUCKLE
+2445 OCR BOW TIE
+ x (bowtie - 22C8)
+2446 OCR BRANCH BANK IDENTIFICATION
+ = transit
+2447 OCR AMOUNT OF CHECK
+2448 OCR DASH
+ = on us
+2449 OCR CUSTOMER ACCOUNT NUMBER
+ = dash
+244A OCR DOUBLE BACKSLASH
+@@ 2460 Enclosed Alphanumerics 24FF
+@ Circled numbers
+2460 CIRCLED DIGIT ONE
+ # <circle> 0031
+2461 CIRCLED DIGIT TWO
+ # <circle> 0032
+2462 CIRCLED DIGIT THREE
+ # <circle> 0033
+2463 CIRCLED DIGIT FOUR
+ # <circle> 0034
+2464 CIRCLED DIGIT FIVE
+ # <circle> 0035
+2465 CIRCLED DIGIT SIX
+ # <circle> 0036
+2466 CIRCLED DIGIT SEVEN
+ # <circle> 0037
+2467 CIRCLED DIGIT EIGHT
+ # <circle> 0038
+2468 CIRCLED DIGIT NINE
+ # <circle> 0039
+2469 CIRCLED NUMBER TEN
+ # <circle> 0031 0030
+246A CIRCLED NUMBER ELEVEN
+ # <circle> 0031 0031
+246B CIRCLED NUMBER TWELVE
+ # <circle> 0031 0032
+246C CIRCLED NUMBER THIRTEEN
+ # <circle> 0031 0033
+246D CIRCLED NUMBER FOURTEEN
+ # <circle> 0031 0034
+246E CIRCLED NUMBER FIFTEEN
+ # <circle> 0031 0035
+246F CIRCLED NUMBER SIXTEEN
+ # <circle> 0031 0036
+2470 CIRCLED NUMBER SEVENTEEN
+ # <circle> 0031 0037
+2471 CIRCLED NUMBER EIGHTEEN
+ # <circle> 0031 0038
+2472 CIRCLED NUMBER NINETEEN
+ # <circle> 0031 0039
+2473 CIRCLED NUMBER TWENTY
+ # <circle> 0032 0030
+@ Parenthesized numbers
+2474 PARENTHESIZED DIGIT ONE
+ # 0028 0031 0029
+2475 PARENTHESIZED DIGIT TWO
+ # 0028 0032 0029
+2476 PARENTHESIZED DIGIT THREE
+ # 0028 0033 0029
+2477 PARENTHESIZED DIGIT FOUR
+ # 0028 0034 0029
+2478 PARENTHESIZED DIGIT FIVE
+ # 0028 0035 0029
+2479 PARENTHESIZED DIGIT SIX
+ # 0028 0036 0029
+247A PARENTHESIZED DIGIT SEVEN
+ # 0028 0037 0029
+247B PARENTHESIZED DIGIT EIGHT
+ # 0028 0038 0029
+247C PARENTHESIZED DIGIT NINE
+ # 0028 0039 0029
+247D PARENTHESIZED NUMBER TEN
+ # 0028 0031 0030 0029
+247E PARENTHESIZED NUMBER ELEVEN
+ # 0028 0031 0031 0029
+247F PARENTHESIZED NUMBER TWELVE
+ # 0028 0031 0032 0029
+2480 PARENTHESIZED NUMBER THIRTEEN
+ # 0028 0031 0033 0029
+2481 PARENTHESIZED NUMBER FOURTEEN
+ # 0028 0031 0034 0029
+2482 PARENTHESIZED NUMBER FIFTEEN
+ # 0028 0031 0035 0029
+2483 PARENTHESIZED NUMBER SIXTEEN
+ # 0028 0031 0036 0029
+2484 PARENTHESIZED NUMBER SEVENTEEN
+ # 0028 0031 0037 0029
+2485 PARENTHESIZED NUMBER EIGHTEEN
+ # 0028 0031 0038 0029
+2486 PARENTHESIZED NUMBER NINETEEN
+ # 0028 0031 0039 0029
+2487 PARENTHESIZED NUMBER TWENTY
+ # 0028 0032 0030 0029
+@ Numbers period
+2488 DIGIT ONE FULL STOP
+ # 0031 002E
+2489 DIGIT TWO FULL STOP
+ # 0032 002E
+248A DIGIT THREE FULL STOP
+ # 0033 002E
+248B DIGIT FOUR FULL STOP
+ # 0034 002E
+248C DIGIT FIVE FULL STOP
+ # 0035 002E
+248D DIGIT SIX FULL STOP
+ # 0036 002E
+248E DIGIT SEVEN FULL STOP
+ # 0037 002E
+248F DIGIT EIGHT FULL STOP
+ # 0038 002E
+2490 DIGIT NINE FULL STOP
+ # 0039 002E
+2491 NUMBER TEN FULL STOP
+ # 0031 0030 002E
+2492 NUMBER ELEVEN FULL STOP
+ # 0031 0031 002E
+2493 NUMBER TWELVE FULL STOP
+ # 0031 0032 002E
+2494 NUMBER THIRTEEN FULL STOP
+ # 0031 0033 002E
+2495 NUMBER FOURTEEN FULL STOP
+ # 0031 0034 002E
+2496 NUMBER FIFTEEN FULL STOP
+ # 0031 0035 002E
+2497 NUMBER SIXTEEN FULL STOP
+ # 0031 0036 002E
+2498 NUMBER SEVENTEEN FULL STOP
+ # 0031 0037 002E
+2499 NUMBER EIGHTEEN FULL STOP
+ # 0031 0038 002E
+249A NUMBER NINETEEN FULL STOP
+ # 0031 0039 002E
+249B NUMBER TWENTY FULL STOP
+ # 0032 0030 002E
+@ Parenthesized Latin letters
+249C PARENTHESIZED LATIN SMALL LETTER A
+ # 0028 0061 0029
+249D PARENTHESIZED LATIN SMALL LETTER B
+ # 0028 0062 0029
+249E PARENTHESIZED LATIN SMALL LETTER C
+ # 0028 0063 0029
+249F PARENTHESIZED LATIN SMALL LETTER D
+ # 0028 0064 0029
+24A0 PARENTHESIZED LATIN SMALL LETTER E
+ # 0028 0065 0029
+24A1 PARENTHESIZED LATIN SMALL LETTER F
+ # 0028 0066 0029
+24A2 PARENTHESIZED LATIN SMALL LETTER G
+ # 0028 0067 0029
+24A3 PARENTHESIZED LATIN SMALL LETTER H
+ # 0028 0068 0029
+24A4 PARENTHESIZED LATIN SMALL LETTER I
+ # 0028 0069 0029
+24A5 PARENTHESIZED LATIN SMALL LETTER J
+ # 0028 006A 0029
+24A6 PARENTHESIZED LATIN SMALL LETTER K
+ # 0028 006B 0029
+24A7 PARENTHESIZED LATIN SMALL LETTER L
+ # 0028 006C 0029
+24A8 PARENTHESIZED LATIN SMALL LETTER M
+ # 0028 006D 0029
+24A9 PARENTHESIZED LATIN SMALL LETTER N
+ # 0028 006E 0029
+24AA PARENTHESIZED LATIN SMALL LETTER O
+ # 0028 006F 0029
+24AB PARENTHESIZED LATIN SMALL LETTER P
+ # 0028 0070 0029
+24AC PARENTHESIZED LATIN SMALL LETTER Q
+ # 0028 0071 0029
+24AD PARENTHESIZED LATIN SMALL LETTER R
+ # 0028 0072 0029
+24AE PARENTHESIZED LATIN SMALL LETTER S
+ # 0028 0073 0029
+24AF PARENTHESIZED LATIN SMALL LETTER T
+ # 0028 0074 0029
+24B0 PARENTHESIZED LATIN SMALL LETTER U
+ # 0028 0075 0029
+24B1 PARENTHESIZED LATIN SMALL LETTER V
+ # 0028 0076 0029
+24B2 PARENTHESIZED LATIN SMALL LETTER W
+ # 0028 0077 0029
+24B3 PARENTHESIZED LATIN SMALL LETTER X
+ # 0028 0078 0029
+24B4 PARENTHESIZED LATIN SMALL LETTER Y
+ # 0028 0079 0029
+24B5 PARENTHESIZED LATIN SMALL LETTER Z
+ # 0028 007A 0029
+@ Circled Latin letters
+24B6 CIRCLED LATIN CAPITAL LETTER A
+ # <circle> 0041
+24B7 CIRCLED LATIN CAPITAL LETTER B
+ # <circle> 0042
+24B8 CIRCLED LATIN CAPITAL LETTER C
+ x (copyright sign - 00A9)
+ # <circle> 0043
+24B9 CIRCLED LATIN CAPITAL LETTER D
+ # <circle> 0044
+24BA CIRCLED LATIN CAPITAL LETTER E
+ # <circle> 0045
+24BB CIRCLED LATIN CAPITAL LETTER F
+ # <circle> 0046
+24BC CIRCLED LATIN CAPITAL LETTER G
+ # <circle> 0047
+24BD CIRCLED LATIN CAPITAL LETTER H
+ # <circle> 0048
+24BE CIRCLED LATIN CAPITAL LETTER I
+ # <circle> 0049
+24BF CIRCLED LATIN CAPITAL LETTER J
+ # <circle> 004A
+24C0 CIRCLED LATIN CAPITAL LETTER K
+ # <circle> 004B
+24C1 CIRCLED LATIN CAPITAL LETTER L
+ # <circle> 004C
+24C2 CIRCLED LATIN CAPITAL LETTER M
+ # <circle> 004D
+24C3 CIRCLED LATIN CAPITAL LETTER N
+ # <circle> 004E
+24C4 CIRCLED LATIN CAPITAL LETTER O
+ # <circle> 004F
+24C5 CIRCLED LATIN CAPITAL LETTER P
+ x (sound recording copyright - 2117)
+ # <circle> 0050
+24C6 CIRCLED LATIN CAPITAL LETTER Q
+ # <circle> 0051
+24C7 CIRCLED LATIN CAPITAL LETTER R
+ x (registered sign - 00AE)
+ # <circle> 0052
+24C8 CIRCLED LATIN CAPITAL LETTER S
+ # <circle> 0053
+24C9 CIRCLED LATIN CAPITAL LETTER T
+ # <circle> 0054
+24CA CIRCLED LATIN CAPITAL LETTER U
+ # <circle> 0055
+24CB CIRCLED LATIN CAPITAL LETTER V
+ # <circle> 0056
+24CC CIRCLED LATIN CAPITAL LETTER W
+ # <circle> 0057
+24CD CIRCLED LATIN CAPITAL LETTER X
+ # <circle> 0058
+24CE CIRCLED LATIN CAPITAL LETTER Y
+ # <circle> 0059
+24CF CIRCLED LATIN CAPITAL LETTER Z
+ # <circle> 005A
+24D0 CIRCLED LATIN SMALL LETTER A
+ # <circle> 0061
+24D1 CIRCLED LATIN SMALL LETTER B
+ # <circle> 0062
+24D2 CIRCLED LATIN SMALL LETTER C
+ # <circle> 0063
+24D3 CIRCLED LATIN SMALL LETTER D
+ # <circle> 0064
+24D4 CIRCLED LATIN SMALL LETTER E
+ # <circle> 0065
+24D5 CIRCLED LATIN SMALL LETTER F
+ # <circle> 0066
+24D6 CIRCLED LATIN SMALL LETTER G
+ # <circle> 0067
+24D7 CIRCLED LATIN SMALL LETTER H
+ # <circle> 0068
+24D8 CIRCLED LATIN SMALL LETTER I
+ # <circle> 0069
+24D9 CIRCLED LATIN SMALL LETTER J
+ # <circle> 006A
+24DA CIRCLED LATIN SMALL LETTER K
+ # <circle> 006B
+24DB CIRCLED LATIN SMALL LETTER L
+ # <circle> 006C
+24DC CIRCLED LATIN SMALL LETTER M
+ # <circle> 006D
+24DD CIRCLED LATIN SMALL LETTER N
+ # <circle> 006E
+24DE CIRCLED LATIN SMALL LETTER O
+ # <circle> 006F
+24DF CIRCLED LATIN SMALL LETTER P
+ # <circle> 0070
+24E0 CIRCLED LATIN SMALL LETTER Q
+ # <circle> 0071
+24E1 CIRCLED LATIN SMALL LETTER R
+ # <circle> 0072
+24E2 CIRCLED LATIN SMALL LETTER S
+ # <circle> 0073
+24E3 CIRCLED LATIN SMALL LETTER T
+ # <circle> 0074
+24E4 CIRCLED LATIN SMALL LETTER U
+ # <circle> 0075
+24E5 CIRCLED LATIN SMALL LETTER V
+ # <circle> 0076
+24E6 CIRCLED LATIN SMALL LETTER W
+ # <circle> 0077
+24E7 CIRCLED LATIN SMALL LETTER X
+ # <circle> 0078
+24E8 CIRCLED LATIN SMALL LETTER Y
+ # <circle> 0079
+24E9 CIRCLED LATIN SMALL LETTER Z
+ # <circle> 007A
+@ Additional circled number
+24EA CIRCLED DIGIT ZERO
+ # <circle> 0030
+@ White on black circled numbers
+24EB NEGATIVE CIRCLED NUMBER ELEVEN
+24EC NEGATIVE CIRCLED NUMBER TWELVE
+24ED NEGATIVE CIRCLED NUMBER THIRTEEN
+24EE NEGATIVE CIRCLED NUMBER FOURTEEN
+24EF NEGATIVE CIRCLED NUMBER FIFTEEN
+24F0 NEGATIVE CIRCLED NUMBER SIXTEEN
+24F1 NEGATIVE CIRCLED NUMBER SEVENTEEN
+24F2 NEGATIVE CIRCLED NUMBER EIGHTEEN
+24F3 NEGATIVE CIRCLED NUMBER NINETEEN
+24F4 NEGATIVE CIRCLED NUMBER TWENTY
+@ Double circled numbers
+24F5 DOUBLE CIRCLED DIGIT ONE
+24F6 DOUBLE CIRCLED DIGIT TWO
+24F7 DOUBLE CIRCLED DIGIT THREE
+24F8 DOUBLE CIRCLED DIGIT FOUR
+24F9 DOUBLE CIRCLED DIGIT FIVE
+24FA DOUBLE CIRCLED DIGIT SIX
+24FB DOUBLE CIRCLED DIGIT SEVEN
+24FC DOUBLE CIRCLED DIGIT EIGHT
+24FD DOUBLE CIRCLED DIGIT NINE
+24FE DOUBLE CIRCLED NUMBER TEN
+@ Additional white on black circled number
+24FF NEGATIVE CIRCLED DIGIT ZERO
+ x (dingbat negative circled digit one - 2776)
+@@ 2500 Box Drawing 257F
+@ Form and chart components
+2500 BOX DRAWINGS LIGHT HORIZONTAL
+ = Videotex Mosaic DG 15
+2501 BOX DRAWINGS HEAVY HORIZONTAL
+2502 BOX DRAWINGS LIGHT VERTICAL
+ = Videotex Mosaic DG 14
+2503 BOX DRAWINGS HEAVY VERTICAL
+2504 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C BOX DRAWINGS LIGHT DOWN AND RIGHT
+ = Videotex Mosaic DG 16
+250D BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510 BOX DRAWINGS LIGHT DOWN AND LEFT
+ = Videotex Mosaic DG 17
+2511 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513 BOX DRAWINGS HEAVY DOWN AND LEFT
+2514 BOX DRAWINGS LIGHT UP AND RIGHT
+ = Videotex Mosaic DG 18
+2515 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517 BOX DRAWINGS HEAVY UP AND RIGHT
+2518 BOX DRAWINGS LIGHT UP AND LEFT
+ = Videotex Mosaic DG 19
+2519 BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B BOX DRAWINGS HEAVY UP AND LEFT
+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ = Videotex Mosaic DG 20
+251D BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+ = Videotex Mosaic DG 03
+251E BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521 BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522 BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523 BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ = Videotex Mosaic DG 21
+2525 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+ = Videotex Mosaic DG 04
+2526 BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527 BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529 BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ = Videotex Mosaic DG 22
+252D BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+ = Videotex Mosaic DG 02
+2530 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531 BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532 BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ = Videotex Mosaic DG 23
+2535 BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536 BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+ = Videotex Mosaic DG 01
+2538 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539 BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ = Videotex Mosaic DG 24
+253D BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+ = Videotex Mosaic DG 13
+2540 BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541 BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543 BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544 BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545 BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546 BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547 BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548 BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549 BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550 BOX DRAWINGS DOUBLE HORIZONTAL
+2551 BOX DRAWINGS DOUBLE VERTICAL
+2552 BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553 BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554 BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555 BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556 BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557 BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558 BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559 BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A BOX DRAWINGS DOUBLE UP AND RIGHT
+255B BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D BOX DRAWINGS DOUBLE UP AND LEFT
+255E BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560 BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561 BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562 BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563 BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564 BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565 BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566 BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567 BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568 BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569 BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570 BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573 BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574 BOX DRAWINGS LIGHT LEFT
+2575 BOX DRAWINGS LIGHT UP
+2576 BOX DRAWINGS LIGHT RIGHT
+2577 BOX DRAWINGS LIGHT DOWN
+2578 BOX DRAWINGS HEAVY LEFT
+2579 BOX DRAWINGS HEAVY UP
+257A BOX DRAWINGS HEAVY RIGHT
+257B BOX DRAWINGS HEAVY DOWN
+257C BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+@@ 2580 Block Elements 259F
+@ Block elements
+2580 UPPER HALF BLOCK
+2581 LOWER ONE EIGHTH BLOCK
+2582 LOWER ONE QUARTER BLOCK
+2583 LOWER THREE EIGHTHS BLOCK
+2584 LOWER HALF BLOCK
+2585 LOWER FIVE EIGHTHS BLOCK
+2586 LOWER THREE QUARTERS BLOCK
+2587 LOWER SEVEN EIGHTHS BLOCK
+2588 FULL BLOCK
+ = solid
+ x (black square - 25A0)
+2589 LEFT SEVEN EIGHTHS BLOCK
+258A LEFT THREE QUARTERS BLOCK
+258B LEFT FIVE EIGHTHS BLOCK
+258C LEFT HALF BLOCK
+258D LEFT THREE EIGHTHS BLOCK
+258E LEFT ONE QUARTER BLOCK
+258F LEFT ONE EIGHTH BLOCK
+2590 RIGHT HALF BLOCK
+@ Shade characters
+2591 LIGHT SHADE
+ * 25%
+2592 MEDIUM SHADE
+ * 50%
+2593 DARK SHADE
+ * 75%
+@ Block elements
+2594 UPPER ONE EIGHTH BLOCK
+2595 RIGHT ONE EIGHTH BLOCK
+@ Terminal graphic characters
+2596 QUADRANT LOWER LEFT
+2597 QUADRANT LOWER RIGHT
+2598 QUADRANT UPPER LEFT
+2599 QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+259A QUADRANT UPPER LEFT AND LOWER RIGHT
+259B QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+259C QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+259D QUADRANT UPPER RIGHT
+259E QUADRANT UPPER RIGHT AND LOWER LEFT
+259F QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+@@ 25A0 Geometric Shapes 25FF
+@ Geometric shapes
+@+ Other geometric shapes complementing this set are found in the Miscellaneous Symbols and Arrows block.
+25A0 BLACK SQUARE
+ = moding mark (in ideographic text)
+ x (full block - 2588)
+ x (black large square - 2B1B)
+25A1 WHITE SQUARE
+ = quadrature
+ * may be used to represent a missing ideograph
+ x (combining enclosing square - 20DE)
+ x (ballot box - 2610)
+ x (white large square - 2B1C)
+ x (geta mark - 3013)
+25A2 WHITE SQUARE WITH ROUNDED CORNERS
+25A3 WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4 SQUARE WITH HORIZONTAL FILL
+25A5 SQUARE WITH VERTICAL FILL
+25A6 SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9 SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA BLACK SMALL SQUARE
+ x (black very small square - 2B1D)
+25AB WHITE SMALL SQUARE
+ x (white very small square - 2B1E)
+25AC BLACK RECTANGLE
+25AD WHITE RECTANGLE
+25AE BLACK VERTICAL RECTANGLE
+ = histogram marker
+ x (end of proof - 220E)
+25AF WHITE VERTICAL RECTANGLE
+ x (apl functional symbol squish quad - 2337)
+ x (apl functional symbol quad - 2395)
+25B0 BLACK PARALLELOGRAM
+25B1 WHITE PARALLELOGRAM
+25B2 BLACK UP-POINTING TRIANGLE
+25B3 WHITE UP-POINTING TRIANGLE
+ = trine
+ x (combining enclosing upward pointing triangle - 20E4)
+ x (increment - 2206)
+25B4 BLACK UP-POINTING SMALL TRIANGLE
+25B5 WHITE UP-POINTING SMALL TRIANGLE
+25B6 BLACK RIGHT-POINTING TRIANGLE
+25B7 WHITE RIGHT-POINTING TRIANGLE
+ = z notation range restriction
+25B8 BLACK RIGHT-POINTING SMALL TRIANGLE
+ x (triangular bullet - 2023)
+25B9 WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA BLACK RIGHT-POINTING POINTER
+25BB WHITE RIGHT-POINTING POINTER
+ = forward arrow indicator
+ x (contains as normal subgroup - 22B3)
+25BC BLACK DOWN-POINTING TRIANGLE
+25BD WHITE DOWN-POINTING TRIANGLE
+ = Hamilton operator
+ x (nabla - 2207)
+25BE BLACK DOWN-POINTING SMALL TRIANGLE
+25BF WHITE DOWN-POINTING SMALL TRIANGLE
+25C0 BLACK LEFT-POINTING TRIANGLE
+25C1 WHITE LEFT-POINTING TRIANGLE
+ = z notation domain restriction
+25C2 BLACK LEFT-POINTING SMALL TRIANGLE
+25C3 WHITE LEFT-POINTING SMALL TRIANGLE
+25C4 BLACK LEFT-POINTING POINTER
+25C5 WHITE LEFT-POINTING POINTER
+ = backward arrow indicator
+ x (normal subgroup of - 22B2)
+25C6 BLACK DIAMOND
+ x (black diamond suit - 2666)
+25C7 WHITE DIAMOND
+ x (combining enclosing diamond - 20DF)
+ x (diamond operator - 22C4)
+ x (white diamond suit - 2662)
+25C8 WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9 FISHEYE
+ = tainome (Japanese, a kind of bullet)
+25CA LOZENGE
+ x (white diamond suit - 2662)
+25CB WHITE CIRCLE
+ x (combining enclosing circle - 20DD)
+ x (large circle - 25EF)
+ x (ideographic number zero - 3007)
+25CC DOTTED CIRCLE
+ * note that the reference glyph for this character is intentionally larger than the dotted circle glyph used to indicate combining characters in this standard; see, for example, 0300
+25CD CIRCLE WITH VERTICAL FILL
+25CE BULLSEYE
+ x (circled ring operator - 229A)
+25CF BLACK CIRCLE
+25D0 CIRCLE WITH LEFT HALF BLACK
+25D1 CIRCLE WITH RIGHT HALF BLACK
+25D2 CIRCLE WITH LOWER HALF BLACK
+25D3 CIRCLE WITH UPPER HALF BLACK
+25D4 CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5 CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6 LEFT HALF BLACK CIRCLE
+25D7 RIGHT HALF BLACK CIRCLE
+25D8 INVERSE BULLET
+ x (bullet - 2022)
+ x (white bullet - 25E6)
+25D9 INVERSE WHITE CIRCLE
+25DA UPPER HALF INVERSE WHITE CIRCLE
+25DB LOWER HALF INVERSE WHITE CIRCLE
+25DC UPPER LEFT QUADRANT CIRCULAR ARC
+25DD UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF LOWER LEFT QUADRANT CIRCULAR ARC
+25E0 UPPER HALF CIRCLE
+ x (arc - 2312)
+25E1 LOWER HALF CIRCLE
+25E2 BLACK LOWER RIGHT TRIANGLE
+25E3 BLACK LOWER LEFT TRIANGLE
+25E4 BLACK UPPER LEFT TRIANGLE
+25E5 BLACK UPPER RIGHT TRIANGLE
+25E6 WHITE BULLET
+ x (bullet - 2022)
+ x (ring operator - 2218)
+ x (inverse bullet - 25D8)
+25E7 SQUARE WITH LEFT HALF BLACK
+ x (square with top half black - 2B12)
+25E8 SQUARE WITH RIGHT HALF BLACK
+25E9 SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC WHITE UP-POINTING TRIANGLE WITH DOT
+25ED UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF LARGE CIRCLE
+ x (combining enclosing circle - 20DD)
+ x (white circle - 25CB)
+ x (black large circle - 2B24)
+ x (ideographic number zero - 3007)
+@ Control code graphics
+25F0 WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1 WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2 WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3 WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4 WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5 WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6 WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7 WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+@ Geometric shapes
+25F8 UPPER LEFT TRIANGLE
+25F9 UPPER RIGHT TRIANGLE
+25FA LOWER LEFT TRIANGLE
+ x (right triangle - 22BF)
+25FB WHITE MEDIUM SQUARE
+ = always (modal operator)
+ x (white square - 25A1)
+25FC BLACK MEDIUM SQUARE
+ x (black square - 25A0)
+25FD WHITE MEDIUM SMALL SQUARE
+ x (white small square - 25AB)
+25FE BLACK MEDIUM SMALL SQUARE
+ x (black small square - 25AA)
+25FF LOWER RIGHT TRIANGLE
+ x (right triangle - 22BF)
+@@ 2600 Miscellaneous Symbols 26FF
+@@+
+@ Weather and astrological symbols
+2600 BLACK SUN WITH RAYS
+ = clear weather
+ x (sun - 2609)
+2601 CLOUD
+ = cloudy weather
+2602 UMBRELLA
+ = rainy weather
+2603 SNOWMAN
+ = snowy weather
+2604 COMET
+2605 BLACK STAR
+ x (star operator - 22C6)
+2606 WHITE STAR
+ x (stress outlined white star - 2729)
+2607 LIGHTNING
+2608 THUNDERSTORM
+2609 SUN
+ x (circled dot operator - 2299)
+ x (black sun with rays - 2600)
+ x (white sun with rays - 263C)
+260A ASCENDING NODE
+260B DESCENDING NODE
+260C CONJUNCTION
+260D OPPOSITION
+@ Miscellaneous symbols
+260E BLACK TELEPHONE
+ x (telephone sign - 2121)
+ x (telephone location sign - 2706)
+260F WHITE TELEPHONE
+2610 BALLOT BOX
+ x (white square - 25A1)
+2611 BALLOT BOX WITH CHECK
+2612 BALLOT BOX WITH X
+ x (squared times - 22A0)
+2613 SALTIRE
+ = St. Andrew's Cross
+ x (ballot x - 2717)
+@ Weather symbol
+2614 UMBRELLA WITH RAIN DROPS
+ = showery weather
+@ Miscellaneous symbol
+2615 HOT BEVERAGE
+ = tea or coffee, depending on locale
+ * can be used to indicate a wait
+ x (watch - 231A)
+ x (hourglass - 231B)
+@ Japanese chess symbols
+2616 WHITE SHOGI PIECE
+2617 BLACK SHOGI PIECE
+@ Miscellaneous symbols
+2618 SHAMROCK
+2619 REVERSED ROTATED FLORAL HEART BULLET
+ * a binding signature mark
+ x (rotated floral heart bullet - 2767)
+@ Pointing hand symbols
+261A BLACK LEFT POINTING INDEX
+261B BLACK RIGHT POINTING INDEX
+261C WHITE LEFT POINTING INDEX
+261D WHITE UP POINTING INDEX
+261E WHITE RIGHT POINTING INDEX
+ = fist (typographic term)
+261F WHITE DOWN POINTING INDEX
+@ Warning signs
+2620 SKULL AND CROSSBONES
+ = poison
+2621 CAUTION SIGN
+2622 RADIOACTIVE SIGN
+2623 BIOHAZARD SIGN
+@ Medical and healing symbols
+2624 CADUCEUS
+ x (staff of aesculapius - 2695)
+2625 ANKH
+@ Religious and political symbols
+2626 ORTHODOX CROSS
+2627 CHI RHO
+ = Constantine's cross, Christogram
+ x (coptic symbol khi ro - 2CE9)
+2628 CROSS OF LORRAINE
+2629 CROSS OF JERUSALEM
+262A STAR AND CRESCENT
+262B FARSI SYMBOL
+ = symbol of iran (1.0)
+262C ADI SHAKTI
+ = Gurmukhi khanda
+262D HAMMER AND SICKLE
+262E PEACE SYMBOL
+262F YIN YANG
+ x (tibetan symbol nor bu nyis -khyil - 0FCA)
+@ Yijing trigram symbols
+2630 TRIGRAM FOR HEAVEN
+ = qian2
+2631 TRIGRAM FOR LAKE
+ = dui4
+2632 TRIGRAM FOR FIRE
+ = li2
+2633 TRIGRAM FOR THUNDER
+ = zhen4
+2634 TRIGRAM FOR WIND
+ = xun4
+2635 TRIGRAM FOR WATER
+ = kan3
+2636 TRIGRAM FOR MOUNTAIN
+ = gen4
+2637 TRIGRAM FOR EARTH
+ = kun1
+@ Miscellaneous symbols
+2638 WHEEL OF DHARMA
+ x (helm symbol - 2388)
+2639 WHITE FROWNING FACE
+263A WHITE SMILING FACE
+ = have a nice day!
+263B BLACK SMILING FACE
+263C WHITE SUN WITH RAYS
+ = compass
+ x (sun - 2609)
+@ Astrological symbols
+263D FIRST QUARTER MOON
+263E LAST QUARTER MOON
+263F MERCURY
+2640 FEMALE SIGN
+ = Venus
+2641 EARTH
+ x (circled plus - 2295)
+2642 MALE SIGN
+ = Mars
+2643 JUPITER
+2644 SATURN
+2645 URANUS
+2646 NEPTUNE
+2647 PLUTO
+@ Zodiacal symbols
+2648 ARIES
+2649 TAURUS
+264A GEMINI
+264B CANCER
+264C LEO
+264D VIRGO
+ = minim (alternate glyph)
+264E LIBRA
+264F SCORPIUS
+ = scorpio
+ = minim, drop
+2650 SAGITTARIUS
+2651 CAPRICORN
+2652 AQUARIUS
+2653 PISCES
+@ Chess symbols
+2654 WHITE CHESS KING
+2655 WHITE CHESS QUEEN
+2656 WHITE CHESS ROOK
+2657 WHITE CHESS BISHOP
+2658 WHITE CHESS KNIGHT
+2659 WHITE CHESS PAWN
+265A BLACK CHESS KING
+265B BLACK CHESS QUEEN
+265C BLACK CHESS ROOK
+265D BLACK CHESS BISHOP
+265E BLACK CHESS KNIGHT
+265F BLACK CHESS PAWN
+@ Playing card symbols
+2660 BLACK SPADE SUIT
+2661 WHITE HEART SUIT
+2662 WHITE DIAMOND SUIT
+ x (white diamond - 25C7)
+ x (lozenge - 25CA)
+2663 BLACK CLUB SUIT
+ x (shamrock - 2618)
+2664 WHITE SPADE SUIT
+2665 BLACK HEART SUIT
+ = valentine
+ x (heavy black heart - 2764)
+2666 BLACK DIAMOND SUIT
+ x (black diamond - 25C6)
+2667 WHITE CLUB SUIT
+@ Miscellaneous symbol
+2668 HOT SPRINGS
+@ Musical symbols
+2669 QUARTER NOTE
+266A EIGHTH NOTE
+266B BEAMED EIGHTH NOTES
+266C BEAMED SIXTEENTH NOTES
+266D MUSIC FLAT SIGN
+266E MUSIC NATURAL SIGN
+266F MUSIC SHARP SIGN
+ = z notation infix bag count
+ x (number sign - 0023)
+@ Syriac cross symbols
+@+ These symbols are used in liturgical texts of Syriac-speaking churches.
+2670 WEST SYRIAC CROSS
+2671 EAST SYRIAC CROSS
+@ Recycling symbols
+2672 UNIVERSAL RECYCLING SYMBOL
+ * used as generic symbol for recycling or to indicate that material is recyclable
+2673 RECYCLING SYMBOL FOR TYPE-1 PLASTICS (pete)
+ * polyethylene terephthalate
+2674 RECYCLING SYMBOL FOR TYPE-2 PLASTICS (hdpe)
+ * high density polyethylene
+2675 RECYCLING SYMBOL FOR TYPE-3 PLASTICS (pvc)
+ * vinyl, polyvinyl chloride
+2676 RECYCLING SYMBOL FOR TYPE-4 PLASTICS (ldpe)
+ * low density polyethylene
+2677 RECYCLING SYMBOL FOR TYPE-5 PLASTICS (pp)
+ * polypropylene
+2678 RECYCLING SYMBOL FOR TYPE-6 PLASTICS (ps)
+ * polystyrene
+2679 RECYCLING SYMBOL FOR TYPE-7 PLASTICS (other)
+ * other plastics
+267A RECYCLING SYMBOL FOR GENERIC MATERIALS
+ * used together with other text and labels to indicate the type of material to be recycled
+267B BLACK UNIVERSAL RECYCLING SYMBOL
+267C RECYCLED PAPER SYMBOL
+ * used to indicate 100% recycled paper content
+267D PARTIALLY-RECYCLED PAPER SYMBOL
+ * percentage of recycled paper content indicated in overlay or next to this symbol
+@ Miscellaneous symbols
+267E PERMANENT PAPER SIGN
+267F WHEELCHAIR SYMBOL
+@ Dice
+2680 DIE FACE-1
+2681 DIE FACE-2
+2682 DIE FACE-3
+2683 DIE FACE-4
+2684 DIE FACE-5
+2685 DIE FACE-6
+@ Go markers
+2686 WHITE CIRCLE WITH DOT RIGHT
+2687 WHITE CIRCLE WITH TWO DOTS
+2688 BLACK CIRCLE WITH WHITE DOT RIGHT
+2689 BLACK CIRCLE WITH TWO WHITE DOTS
+@ Yijing monogram and digram symbols
+@+ These form a subset of the larger collection found in the Tai Xuan Jing Symbols block.
+268A MONOGRAM FOR YANG
+268B MONOGRAM FOR YIN
+268C DIGRAM FOR GREATER YANG
+268D DIGRAM FOR LESSER YIN
+268E DIGRAM FOR LESSER YANG
+268F DIGRAM FOR GREATER YIN
+@ Dictionary and map symbols
+2690 WHITE FLAG
+2691 BLACK FLAG
+2692 HAMMER AND PICK
+ = mining, working day (in timetables)
+2693 ANCHOR
+ = nautical term, harbor (on maps)
+2694 CROSSED SWORDS
+ = military term, battleground (on maps), killed in action
+2695 STAFF OF AESCULAPIUS
+ = medical term
+ * both inclined or upright renderings of this symbol are common
+ x (caduceus - 2624)
+2696 SCALES
+ = legal term, jurisprudence
+2697 ALEMBIC
+ = chemical term, chemistry
+2698 FLOWER
+ = botanical term
+ x (flower punctuation mark - 2055)
+ x (shamrock - 2618)
+ x (white florette - 2740)
+2699 GEAR
+ = technology, tools
+269A STAFF OF HERMES
+ * signifies a commercial term or commerce
+ * glyph shows a heraldic staff with a winged wheel
+269B ATOM SYMBOL
+ = nuclear installation (on maps)
+@ Miscellaneous symbols
+269C FLEUR-DE-LIS
+269D OUTLINED WHITE STAR
+ * symbol of Morocco
+26A0 WARNING SIGN
+26A1 HIGH VOLTAGE SIGN
+@ Gender symbols
+26A2 DOUBLED FEMALE SIGN
+ = lesbianism
+26A3 DOUBLED MALE SIGN
+ * a glyph variant has the two circles on the same line
+ = male homosexuality
+26A4 INTERLOCKED FEMALE AND MALE SIGN
+ * a glyph variant has the two circles on the same line
+ = bisexuality
+26A5 MALE AND FEMALE SIGN
+ = transgendered sexuality
+ = hermaphrodite (in entomology)
+26A6 MALE WITH STROKE SIGN
+ = transgendered sexuality
+26A7 MALE WITH STROKE AND MALE AND FEMALE SIGN
+ = transgendered sexuality
+26A8 VERTICAL MALE WITH STROKE SIGN
+ = ferrous iron sulphate (alchemy and older chemistry)
+26A9 HORIZONTAL MALE WITH STROKE SIGN
+ = magnesium (alchemy and older chemistry)
+@ Circles
+26AA MEDIUM WHITE CIRCLE
+ = asexuality, sexless, genderless
+ = engaged, betrothed
+ * base for male or female sign
+26AB MEDIUM BLACK CIRCLE
+ * UI symbol for record function
+26AC MEDIUM SMALL WHITE CIRCLE
+ = engaged, betrothed (genealogy)
+ * can represent wedding ring
+@ Genealogical symbols
+26AD MARRIAGE SYMBOL
+ x (infinity - 221E)
+26AE DIVORCE SYMBOL
+ x (infinity negated with vertical bar - 29DE)
+26AF UNMARRIED PARTNERSHIP SYMBOL
+ x (double-ended multimap - 29DF)
+26B0 COFFIN
+ = buried (genealogy)
+ x (white rectangle - 25AD)
+26B1 FUNERAL URN
+ = cremated (genealogy)
+@ Gender symbol
+26B2 NEUTER
+@ Astrological signs
+26B3 CERES
+26B4 PALLAS
+26B5 JUNO
+26B6 VESTA
+26B7 CHIRON
+26B8 BLACK MOON LILITH
+26B9 SEXTILE
+ x (asterisk - 002A)
+26BA SEMISEXTILE
+ x (xor - 22BB)
+26BB QUINCUNX
+ x (nand - 22BC)
+26BC SESQUIQUADRATE
+@ Symbols for draughts and checkers
+26C0 WHITE DRAUGHTS MAN
+26C1 WHITE DRAUGHTS KING
+26C2 BLACK DRAUGHTS MAN
+26C3 BLACK DRAUGHTS KING
+@@ 2700 Dingbats 27BF
+@+ ITC Zapf dingbats series 100
+@ Miscellaneous
+2701 UPPER BLADE SCISSORS
+2702 BLACK SCISSORS
+2703 LOWER BLADE SCISSORS
+2704 WHITE SCISSORS
+2705 <reserved>
+ x (black telephone - 260E)
+2706 TELEPHONE LOCATION SIGN
+ x (telephone sign - 2121)
+2707 TAPE DRIVE
+2708 AIRPLANE
+2709 ENVELOPE
+270A <reserved>
+ x (black right pointing index - 261B)
+270B <reserved>
+ x (white right pointing index - 261E)
+270C VICTORY HAND
+270D WRITING HAND
+270E LOWER RIGHT PENCIL
+270F PENCIL
+2710 UPPER RIGHT PENCIL
+2711 WHITE NIB
+2712 BLACK NIB
+2713 CHECK MARK
+ x (square root - 221A)
+2714 HEAVY CHECK MARK
+2715 MULTIPLICATION X
+ x (multiplication sign - 00D7)
+ x (box drawings light diagonal cross - 2573)
+2716 HEAVY MULTIPLICATION X
+2717 BALLOT X
+ x (saltire - 2613)
+2718 HEAVY BALLOT X
+@ Crosses
+2719 OUTLINED GREEK CROSS
+271A HEAVY GREEK CROSS
+271B OPEN CENTRE CROSS
+271C HEAVY OPEN CENTRE CROSS
+271D LATIN CROSS
+271E SHADOWED WHITE LATIN CROSS
+271F OUTLINED LATIN CROSS
+2720 MALTESE CROSS
+ * Historically, the Maltese cross took many forms; the shape shown in the Zapf Dingbats is similar to one known as the Cross Formée.
+@ Stars, asterisks and snowflakes
+2721 STAR OF DAVID
+2722 FOUR TEARDROP-SPOKED ASTERISK
+2723 FOUR BALLOON-SPOKED ASTERISK
+2724 HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725 FOUR CLUB-SPOKED ASTERISK
+2726 BLACK FOUR POINTED STAR
+2727 WHITE FOUR POINTED STAR
+2728 <reserved>
+ x (black star - 2605)
+2729 STRESS OUTLINED WHITE STAR
+ x (white star - 2606)
+272A CIRCLED WHITE STAR
+272B OPEN CENTRE BLACK STAR
+272C BLACK CENTRE WHITE STAR
+272D OUTLINED BLACK STAR
+272E HEAVY OUTLINED BLACK STAR
+272F PINWHEEL STAR
+2730 SHADOWED WHITE STAR
+2731 HEAVY ASTERISK
+ x (asterisk - 002A)
+2732 OPEN CENTRE ASTERISK
+2733 EIGHT SPOKED ASTERISK
+2734 EIGHT POINTED BLACK STAR
+2735 EIGHT POINTED PINWHEEL STAR
+2736 SIX POINTED BLACK STAR
+ = sextile
+2737 EIGHT POINTED RECTILINEAR BLACK STAR
+2738 HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739 TWELVE POINTED BLACK STAR
+273A SIXTEEN POINTED ASTERISK
+ = starburst
+273B TEARDROP-SPOKED ASTERISK
+273C OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D HEAVY TEARDROP-SPOKED ASTERISK
+273E SIX PETALLED BLACK AND WHITE FLORETTE
+273F BLACK FLORETTE
+2740 WHITE FLORETTE
+2741 EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742 CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743 HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744 SNOWFLAKE
+2745 TIGHT TRIFOLIATE SNOWFLAKE
+2746 HEAVY CHEVRON SNOWFLAKE
+2747 SPARKLE
+2748 HEAVY SPARKLE
+2749 BALLOON-SPOKED ASTERISK
+ = jack
+274A EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+ = turbofan
+@ Miscellaneous
+274C <reserved>
+ x (black circle - 25CF)
+274D SHADOWED WHITE CIRCLE
+274E <reserved>
+ x (black square - 25A0)
+274F LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750 UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751 LOWER RIGHT SHADOWED WHITE SQUARE
+2752 UPPER RIGHT SHADOWED WHITE SQUARE
+2753 <reserved>
+ x (black up-pointing triangle - 25B2)
+2754 <reserved>
+ x (black down-pointing triangle - 25BC)
+2755 <reserved>
+ x (black diamond - 25C6)
+2756 BLACK DIAMOND MINUS WHITE X
+2757 <reserved>
+ x (right half black circle - 25D7)
+2758 LIGHT VERTICAL BAR
+ x (vertical line - 007C)
+2759 MEDIUM VERTICAL BAR
+275A HEAVY VERTICAL BAR
+@ Punctuation ornaments
+275B HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+ x (left single quotation mark - 2018)
+275C HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+ x (right single quotation mark - 2019)
+275D HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+ x (left double quotation mark - 201C)
+275E HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+ x (right double quotation mark - 201D)
+2761 CURVED STEM PARAGRAPH SIGN ORNAMENT
+ x (pilcrow sign - 00B6)
+2762 HEAVY EXCLAMATION MARK ORNAMENT
+ x (exclamation mark - 0021)
+2763 HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764 HEAVY BLACK HEART
+ x (black heart suit - 2665)
+2765 ROTATED HEAVY BLACK HEART BULLET
+2766 FLORAL HEART
+ = Aldus leaf
+2767 ROTATED FLORAL HEART BULLET
+ = hedera, ivy leaf
+ x (reversed rotated floral heart bullet - 2619)
+@ Ornamental brackets
+2768 MEDIUM LEFT PARENTHESIS ORNAMENT
+ x (left parenthesis - 0028)
+2769 MEDIUM RIGHT PARENTHESIS ORNAMENT
+ x (right parenthesis - 0029)
+276A MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+ x (left-pointing angle bracket - 2329)
+276D MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+ x (right-pointing angle bracket - 232A)
+276E HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+ x (single left-pointing angle quotation mark - 2039)
+276F HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+ x (single right-pointing angle quotation mark - 203A)
+2770 HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771 HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772 LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+ x (left tortoise shell bracket - 3014)
+2773 LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+ x (right tortoise shell bracket - 3015)
+2774 MEDIUM LEFT CURLY BRACKET ORNAMENT
+ x (left curly bracket - 007B)
+2775 MEDIUM RIGHT CURLY BRACKET ORNAMENT
+ x (right curly bracket - 007D)
+@ Dingbat circled digits
+2776 DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777 DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778 DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779 DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277A DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277B DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277C DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277D DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277E DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277F DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780 DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781 DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782 DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783 DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784 DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785 DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786 DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787 DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788 DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789 DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278A DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278B DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278C DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278D DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278E DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278F DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+@ Dingbat arrows
+2794 HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2795 <reserved>
+ x (rightwards arrow - 2192)
+2796 <reserved>
+ x (left right arrow - 2194)
+2797 <reserved>
+ x (up down arrow - 2195)
+2798 HEAVY SOUTH EAST ARROW
+2799 HEAVY RIGHTWARDS ARROW
+279A HEAVY NORTH EAST ARROW
+279B DRAFTING POINT RIGHTWARDS ARROW
+279C HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D TRIANGLE-HEADED RIGHTWARDS ARROW
+279E HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0 HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1 BLACK RIGHTWARDS ARROW
+ * fonts may harmonize this glyph with the style for other black arrows
+ x (leftwards black arrow - 2B05)
+27A2 THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3 THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4 BLACK RIGHTWARDS ARROWHEAD
+27A5 HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6 HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7 SQUAT BLACK RIGHTWARDS ARROW
+27A8 HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9 RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3 WHITE-FEATHERED RIGHTWARDS ARROW
+27B4 BLACK-FEATHERED SOUTH EAST ARROW
+27B5 BLACK-FEATHERED RIGHTWARDS ARROW
+27B6 BLACK-FEATHERED NORTH EAST ARROW
+27B7 HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8 HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9 HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA TEARDROP-BARBED RIGHTWARDS ARROW
+27BB HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC WEDGE-TAILED RIGHTWARDS ARROW
+27BD HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE OPEN-OUTLINED RIGHTWARDS ARROW
+@@ 27C0 Miscellaneous Mathematical Symbols-A 27EF
+@ Miscellaneous symbols
+27C0 THREE DIMENSIONAL ANGLE
+ * used by Euclid
+27C1 WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE
+ * used by Euclid
+27C2 PERPENDICULAR
+ = orthogonal to
+ * relation, typeset with additional spacing
+ x (up tack - 22A5)
+27C3 OPEN SUBSET
+27C4 OPEN SUPERSET
+27C5 LEFT S-SHAPED BAG DELIMITER
+27C6 RIGHT S-SHAPED BAG DELIMITER
+27C7 OR WITH DOT INSIDE
+27C8 REVERSE SOLIDUS PRECEDING SUBSET
+27C9 SUPERSET PRECEDING SOLIDUS
+@ Vertical line operator
+27CA VERTICAL BAR WITH HORIZONTAL STROKE
+ x (parallel with horizontal stroke - 2AF2)
+ x (triple vertical bar with horizontal stroke - 2AF5)
+@ Division operator
+27CC LONG DIVISION
+ * graphically extends over the dividend
+ x (division sign - 00F7)
+ x (division slash - 2215)
+ x (square root - 221A)
+@ Miscellaneous symbol
+27D0 WHITE DIAMOND WITH CENTRED DOT
+@ Operators
+27D1 AND WITH DOT
+ x (logical and - 2227)
+ x (intersection with dot - 2A40)
+27D2 ELEMENT OF OPENING UPWARDS
+ x (element of opening downwards - 2AD9)
+27D3 LOWER RIGHT CORNER WITH DOT
+ = pullback
+ x (right floor - 230B)
+27D4 UPPER LEFT CORNER WITH DOT
+ = pushout
+ x (left ceiling - 2308)
+@ Database theory operators
+27D5 LEFT OUTER JOIN
+27D6 RIGHT OUTER JOIN
+27D7 FULL OUTER JOIN
+ x (join - 2A1D)
+@ Tacks and turnstiles
+27D8 LARGE UP TACK
+ x (up tack - 22A5)
+27D9 LARGE DOWN TACK
+ x (down tack - 22A4)
+27DA LEFT AND RIGHT DOUBLE TURNSTILE
+ x (true - 22A8)
+ x (vertical bar double left turnstile - 2AE4)
+27DB LEFT AND RIGHT TACK
+ x (right tack - 22A2)
+27DC LEFT MULTIMAP
+ x (multimap - 22B8)
+27DD LONG RIGHT TACK
+ x (right tack - 22A2)
+27DE LONG LEFT TACK
+ x (left tack - 22A3)
+27DF UP TACK WITH CIRCLE ABOVE
+ = radial component
+ x (down tack with circle below - 2AF1)
+@ Modal logic operators
+27E0 LOZENGE DIVIDED BY HORIZONTAL RULE
+ * used as form of possibility in modal logic
+ x (lozenge - 25CA)
+27E1 WHITE CONCAVE-SIDED DIAMOND
+ = never (modal operator)
+27E2 WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+ = was never (modal operator)
+27E3 WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+ = will never be (modal operator)
+27E4 WHITE SQUARE WITH LEFTWARDS TICK
+ = was always (modal operator)
+ x (white square - 25A1)
+27E5 WHITE SQUARE WITH RIGHTWARDS TICK
+ = will always be (modal operator)
+@ Mathematical brackets
+27E6 MATHEMATICAL LEFT WHITE SQUARE BRACKET
+ = z notation left bag bracket
+ x (left white square bracket - 301A)
+27E7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+ = z notation right bag bracket
+ x (right white square bracket - 301B)
+27E8 MATHEMATICAL LEFT ANGLE BRACKET
+ = bra
+ = z notation left sequence bracket
+ x (left-pointing angle bracket - 2329)
+ x (left angle bracket - 3008)
+27E9 MATHEMATICAL RIGHT ANGLE BRACKET
+ = ket
+ = z notation right sequence bracket
+ x (right-pointing angle bracket - 232A)
+ x (right angle bracket - 3009)
+27EA MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+ = z notation left chevron bracket
+ x (left double angle bracket - 300A)
+27EB MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+ = z notation right chevron bracket
+ x (right double angle bracket - 300B)
+27EC MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+ x (left black tortoise shell bracket - 2997)
+ x (left white tortoise shell bracket - 3018)
+27ED MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+ x (right black tortoise shell bracket - 2998)
+ x (right white tortoise shell bracket - 3019)
+27EE MATHEMATICAL LEFT FLATTENED PARENTHESIS
+ = lgroup
+27EF MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+ = rgroup
+@@ 27F0 Supplemental Arrows-A 27FF
+@ Arrows
+27F0 UPWARDS QUADRUPLE ARROW
+ x (upwards triple arrow - 290A)
+ x (leftwards quadruple arrow - 2B45)
+27F1 DOWNWARDS QUADRUPLE ARROW
+ x (downwards triple arrow - 290B)
+27F2 ANTICLOCKWISE GAPPED CIRCLE ARROW
+ x (anticlockwise open circle arrow - 21BA)
+ x (anticlockwise closed circle arrow - 2940)
+27F3 CLOCKWISE GAPPED CIRCLE ARROW
+ x (clockwise open circle arrow - 21BB)
+ x (clockwise closed circle arrow - 2941)
+27F4 RIGHT ARROW WITH CIRCLED PLUS
+ x (left arrow with circled plus - 2B32)
+@ Long arrows
+@+ The long arrows are used for mapping whereas the short forms would be used in limits. They are also needed for MathML to complete mapping to the AMSA sets.
+27F5 LONG LEFTWARDS ARROW
+ x (leftwards arrow - 2190)
+27F6 LONG RIGHTWARDS ARROW
+ x (rightwards arrow - 2192)
+27F7 LONG LEFT RIGHT ARROW
+ x (left right arrow - 2194)
+27F8 LONG LEFTWARDS DOUBLE ARROW
+ x (leftwards double arrow - 21D0)
+27F9 LONG RIGHTWARDS DOUBLE ARROW
+ x (rightwards double arrow - 21D2)
+27FA LONG LEFT RIGHT DOUBLE ARROW
+ x (left right double arrow - 21D4)
+27FB LONG LEFTWARDS ARROW FROM BAR
+ = maps from
+ x (leftwards arrow from bar - 21A4)
+27FC LONG RIGHTWARDS ARROW FROM BAR
+ = maps to
+ x (rightwards arrow from bar - 21A6)
+27FD LONG LEFTWARDS DOUBLE ARROW FROM BAR
+ x (leftwards double arrow from bar - 2906)
+27FE LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+ x (rightwards double arrow from bar - 2907)
+27FF LONG RIGHTWARDS SQUIGGLE ARROW
+ x (rightwards squiggle arrow - 21DD)
+ x (long leftwards squiggle arrow - 2B33)
+@@ 2800 Braille Patterns 28FF
+@+ When braille patterns are punched, the filled circles shown here correspond to punch impression.
+@ Braille patterns
+2800 BRAILLE PATTERN BLANK
+ * while this character is imaged as a fixed-width blank in many fonts, it does not act as a space
+2801 BRAILLE PATTERN DOTS-1
+2802 BRAILLE PATTERN DOTS-2
+2803 BRAILLE PATTERN DOTS-12
+2804 BRAILLE PATTERN DOTS-3
+2805 BRAILLE PATTERN DOTS-13
+2806 BRAILLE PATTERN DOTS-23
+2807 BRAILLE PATTERN DOTS-123
+2808 BRAILLE PATTERN DOTS-4
+2809 BRAILLE PATTERN DOTS-14
+280A BRAILLE PATTERN DOTS-24
+280B BRAILLE PATTERN DOTS-124
+280C BRAILLE PATTERN DOTS-34
+280D BRAILLE PATTERN DOTS-134
+280E BRAILLE PATTERN DOTS-234
+280F BRAILLE PATTERN DOTS-1234
+2810 BRAILLE PATTERN DOTS-5
+2811 BRAILLE PATTERN DOTS-15
+2812 BRAILLE PATTERN DOTS-25
+2813 BRAILLE PATTERN DOTS-125
+2814 BRAILLE PATTERN DOTS-35
+2815 BRAILLE PATTERN DOTS-135
+2816 BRAILLE PATTERN DOTS-235
+2817 BRAILLE PATTERN DOTS-1235
+2818 BRAILLE PATTERN DOTS-45
+2819 BRAILLE PATTERN DOTS-145
+281A BRAILLE PATTERN DOTS-245
+281B BRAILLE PATTERN DOTS-1245
+281C BRAILLE PATTERN DOTS-345
+281D BRAILLE PATTERN DOTS-1345
+281E BRAILLE PATTERN DOTS-2345
+281F BRAILLE PATTERN DOTS-12345
+2820 BRAILLE PATTERN DOTS-6
+2821 BRAILLE PATTERN DOTS-16
+2822 BRAILLE PATTERN DOTS-26
+2823 BRAILLE PATTERN DOTS-126
+2824 BRAILLE PATTERN DOTS-36
+2825 BRAILLE PATTERN DOTS-136
+2826 BRAILLE PATTERN DOTS-236
+2827 BRAILLE PATTERN DOTS-1236
+2828 BRAILLE PATTERN DOTS-46
+2829 BRAILLE PATTERN DOTS-146
+282A BRAILLE PATTERN DOTS-246
+282B BRAILLE PATTERN DOTS-1246
+282C BRAILLE PATTERN DOTS-346
+282D BRAILLE PATTERN DOTS-1346
+282E BRAILLE PATTERN DOTS-2346
+282F BRAILLE PATTERN DOTS-12346
+2830 BRAILLE PATTERN DOTS-56
+2831 BRAILLE PATTERN DOTS-156
+2832 BRAILLE PATTERN DOTS-256
+2833 BRAILLE PATTERN DOTS-1256
+2834 BRAILLE PATTERN DOTS-356
+2835 BRAILLE PATTERN DOTS-1356
+2836 BRAILLE PATTERN DOTS-2356
+2837 BRAILLE PATTERN DOTS-12356
+2838 BRAILLE PATTERN DOTS-456
+2839 BRAILLE PATTERN DOTS-1456
+283A BRAILLE PATTERN DOTS-2456
+283B BRAILLE PATTERN DOTS-12456
+283C BRAILLE PATTERN DOTS-3456
+283D BRAILLE PATTERN DOTS-13456
+283E BRAILLE PATTERN DOTS-23456
+283F BRAILLE PATTERN DOTS-123456
+2840 BRAILLE PATTERN DOTS-7
+2841 BRAILLE PATTERN DOTS-17
+2842 BRAILLE PATTERN DOTS-27
+2843 BRAILLE PATTERN DOTS-127
+2844 BRAILLE PATTERN DOTS-37
+2845 BRAILLE PATTERN DOTS-137
+2846 BRAILLE PATTERN DOTS-237
+2847 BRAILLE PATTERN DOTS-1237
+2848 BRAILLE PATTERN DOTS-47
+2849 BRAILLE PATTERN DOTS-147
+284A BRAILLE PATTERN DOTS-247
+284B BRAILLE PATTERN DOTS-1247
+284C BRAILLE PATTERN DOTS-347
+284D BRAILLE PATTERN DOTS-1347
+284E BRAILLE PATTERN DOTS-2347
+284F BRAILLE PATTERN DOTS-12347
+2850 BRAILLE PATTERN DOTS-57
+2851 BRAILLE PATTERN DOTS-157
+2852 BRAILLE PATTERN DOTS-257
+2853 BRAILLE PATTERN DOTS-1257
+2854 BRAILLE PATTERN DOTS-357
+2855 BRAILLE PATTERN DOTS-1357
+2856 BRAILLE PATTERN DOTS-2357
+2857 BRAILLE PATTERN DOTS-12357
+2858 BRAILLE PATTERN DOTS-457
+2859 BRAILLE PATTERN DOTS-1457
+285A BRAILLE PATTERN DOTS-2457
+285B BRAILLE PATTERN DOTS-12457
+285C BRAILLE PATTERN DOTS-3457
+285D BRAILLE PATTERN DOTS-13457
+285E BRAILLE PATTERN DOTS-23457
+285F BRAILLE PATTERN DOTS-123457
+2860 BRAILLE PATTERN DOTS-67
+2861 BRAILLE PATTERN DOTS-167
+2862 BRAILLE PATTERN DOTS-267
+2863 BRAILLE PATTERN DOTS-1267
+2864 BRAILLE PATTERN DOTS-367
+2865 BRAILLE PATTERN DOTS-1367
+2866 BRAILLE PATTERN DOTS-2367
+2867 BRAILLE PATTERN DOTS-12367
+2868 BRAILLE PATTERN DOTS-467
+2869 BRAILLE PATTERN DOTS-1467
+286A BRAILLE PATTERN DOTS-2467
+286B BRAILLE PATTERN DOTS-12467
+286C BRAILLE PATTERN DOTS-3467
+286D BRAILLE PATTERN DOTS-13467
+286E BRAILLE PATTERN DOTS-23467
+286F BRAILLE PATTERN DOTS-123467
+2870 BRAILLE PATTERN DOTS-567
+2871 BRAILLE PATTERN DOTS-1567
+2872 BRAILLE PATTERN DOTS-2567
+2873 BRAILLE PATTERN DOTS-12567
+2874 BRAILLE PATTERN DOTS-3567
+2875 BRAILLE PATTERN DOTS-13567
+2876 BRAILLE PATTERN DOTS-23567
+2877 BRAILLE PATTERN DOTS-123567
+2878 BRAILLE PATTERN DOTS-4567
+2879 BRAILLE PATTERN DOTS-14567
+287A BRAILLE PATTERN DOTS-24567
+287B BRAILLE PATTERN DOTS-124567
+287C BRAILLE PATTERN DOTS-34567
+287D BRAILLE PATTERN DOTS-134567
+287E BRAILLE PATTERN DOTS-234567
+287F BRAILLE PATTERN DOTS-1234567
+2880 BRAILLE PATTERN DOTS-8
+2881 BRAILLE PATTERN DOTS-18
+2882 BRAILLE PATTERN DOTS-28
+2883 BRAILLE PATTERN DOTS-128
+2884 BRAILLE PATTERN DOTS-38
+2885 BRAILLE PATTERN DOTS-138
+2886 BRAILLE PATTERN DOTS-238
+2887 BRAILLE PATTERN DOTS-1238
+2888 BRAILLE PATTERN DOTS-48
+2889 BRAILLE PATTERN DOTS-148
+288A BRAILLE PATTERN DOTS-248
+288B BRAILLE PATTERN DOTS-1248
+288C BRAILLE PATTERN DOTS-348
+288D BRAILLE PATTERN DOTS-1348
+288E BRAILLE PATTERN DOTS-2348
+288F BRAILLE PATTERN DOTS-12348
+2890 BRAILLE PATTERN DOTS-58
+2891 BRAILLE PATTERN DOTS-158
+2892 BRAILLE PATTERN DOTS-258
+2893 BRAILLE PATTERN DOTS-1258
+2894 BRAILLE PATTERN DOTS-358
+2895 BRAILLE PATTERN DOTS-1358
+2896 BRAILLE PATTERN DOTS-2358
+2897 BRAILLE PATTERN DOTS-12358
+2898 BRAILLE PATTERN DOTS-458
+2899 BRAILLE PATTERN DOTS-1458
+289A BRAILLE PATTERN DOTS-2458
+289B BRAILLE PATTERN DOTS-12458
+289C BRAILLE PATTERN DOTS-3458
+289D BRAILLE PATTERN DOTS-13458
+289E BRAILLE PATTERN DOTS-23458
+289F BRAILLE PATTERN DOTS-123458
+28A0 BRAILLE PATTERN DOTS-68
+28A1 BRAILLE PATTERN DOTS-168
+28A2 BRAILLE PATTERN DOTS-268
+28A3 BRAILLE PATTERN DOTS-1268
+28A4 BRAILLE PATTERN DOTS-368
+28A5 BRAILLE PATTERN DOTS-1368
+28A6 BRAILLE PATTERN DOTS-2368
+28A7 BRAILLE PATTERN DOTS-12368
+28A8 BRAILLE PATTERN DOTS-468
+28A9 BRAILLE PATTERN DOTS-1468
+28AA BRAILLE PATTERN DOTS-2468
+28AB BRAILLE PATTERN DOTS-12468
+28AC BRAILLE PATTERN DOTS-3468
+28AD BRAILLE PATTERN DOTS-13468
+28AE BRAILLE PATTERN DOTS-23468
+28AF BRAILLE PATTERN DOTS-123468
+28B0 BRAILLE PATTERN DOTS-568
+28B1 BRAILLE PATTERN DOTS-1568
+28B2 BRAILLE PATTERN DOTS-2568
+28B3 BRAILLE PATTERN DOTS-12568
+28B4 BRAILLE PATTERN DOTS-3568
+28B5 BRAILLE PATTERN DOTS-13568
+28B6 BRAILLE PATTERN DOTS-23568
+28B7 BRAILLE PATTERN DOTS-123568
+28B8 BRAILLE PATTERN DOTS-4568
+28B9 BRAILLE PATTERN DOTS-14568
+28BA BRAILLE PATTERN DOTS-24568
+28BB BRAILLE PATTERN DOTS-124568
+28BC BRAILLE PATTERN DOTS-34568
+28BD BRAILLE PATTERN DOTS-134568
+28BE BRAILLE PATTERN DOTS-234568
+28BF BRAILLE PATTERN DOTS-1234568
+28C0 BRAILLE PATTERN DOTS-78
+28C1 BRAILLE PATTERN DOTS-178
+28C2 BRAILLE PATTERN DOTS-278
+28C3 BRAILLE PATTERN DOTS-1278
+28C4 BRAILLE PATTERN DOTS-378
+28C5 BRAILLE PATTERN DOTS-1378
+28C6 BRAILLE PATTERN DOTS-2378
+28C7 BRAILLE PATTERN DOTS-12378
+28C8 BRAILLE PATTERN DOTS-478
+28C9 BRAILLE PATTERN DOTS-1478
+28CA BRAILLE PATTERN DOTS-2478
+28CB BRAILLE PATTERN DOTS-12478
+28CC BRAILLE PATTERN DOTS-3478
+28CD BRAILLE PATTERN DOTS-13478
+28CE BRAILLE PATTERN DOTS-23478
+28CF BRAILLE PATTERN DOTS-123478
+28D0 BRAILLE PATTERN DOTS-578
+28D1 BRAILLE PATTERN DOTS-1578
+28D2 BRAILLE PATTERN DOTS-2578
+28D3 BRAILLE PATTERN DOTS-12578
+28D4 BRAILLE PATTERN DOTS-3578
+28D5 BRAILLE PATTERN DOTS-13578
+28D6 BRAILLE PATTERN DOTS-23578
+28D7 BRAILLE PATTERN DOTS-123578
+28D8 BRAILLE PATTERN DOTS-4578
+28D9 BRAILLE PATTERN DOTS-14578
+28DA BRAILLE PATTERN DOTS-24578
+28DB BRAILLE PATTERN DOTS-124578
+28DC BRAILLE PATTERN DOTS-34578
+28DD BRAILLE PATTERN DOTS-134578
+28DE BRAILLE PATTERN DOTS-234578
+28DF BRAILLE PATTERN DOTS-1234578
+28E0 BRAILLE PATTERN DOTS-678
+28E1 BRAILLE PATTERN DOTS-1678
+28E2 BRAILLE PATTERN DOTS-2678
+28E3 BRAILLE PATTERN DOTS-12678
+28E4 BRAILLE PATTERN DOTS-3678
+28E5 BRAILLE PATTERN DOTS-13678
+28E6 BRAILLE PATTERN DOTS-23678
+28E7 BRAILLE PATTERN DOTS-123678
+28E8 BRAILLE PATTERN DOTS-4678
+28E9 BRAILLE PATTERN DOTS-14678
+28EA BRAILLE PATTERN DOTS-24678
+28EB BRAILLE PATTERN DOTS-124678
+28EC BRAILLE PATTERN DOTS-34678
+28ED BRAILLE PATTERN DOTS-134678
+28EE BRAILLE PATTERN DOTS-234678
+28EF BRAILLE PATTERN DOTS-1234678
+28F0 BRAILLE PATTERN DOTS-5678
+28F1 BRAILLE PATTERN DOTS-15678
+28F2 BRAILLE PATTERN DOTS-25678
+28F3 BRAILLE PATTERN DOTS-125678
+28F4 BRAILLE PATTERN DOTS-35678
+28F5 BRAILLE PATTERN DOTS-135678
+28F6 BRAILLE PATTERN DOTS-235678
+28F7 BRAILLE PATTERN DOTS-1235678
+28F8 BRAILLE PATTERN DOTS-45678
+28F9 BRAILLE PATTERN DOTS-145678
+28FA BRAILLE PATTERN DOTS-245678
+28FB BRAILLE PATTERN DOTS-1245678
+28FC BRAILLE PATTERN DOTS-345678
+28FD BRAILLE PATTERN DOTS-1345678
+28FE BRAILLE PATTERN DOTS-2345678
+28FF BRAILLE PATTERN DOTS-12345678
+@@ 2900 Supplemental Arrows-B 297F
+@ Miscellaneous arrows
+2900 RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+ = z notation partial surjection
+ x (leftwards two-headed arrow with vertical stroke - 2B34)
+2901 RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+ = z notation finite surjection
+ x (leftwards two-headed arrow with double vertical stroke - 2B35)
+2902 LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2903 RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2904 LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+2905 RIGHTWARDS TWO-HEADED ARROW FROM BAR
+ = maps to
+ x (leftwards two-headed arrow from bar - 2B36)
+2906 LEFTWARDS DOUBLE ARROW FROM BAR
+ = maps from
+ x (long leftwards arrow from bar - 27FB)
+2907 RIGHTWARDS DOUBLE ARROW FROM BAR
+ = maps to
+ x (long rightwards arrow from bar - 27FC)
+2908 DOWNWARDS ARROW WITH HORIZONTAL STROKE
+2909 UPWARDS ARROW WITH HORIZONTAL STROKE
+290A UPWARDS TRIPLE ARROW
+ x (upwards double arrow - 21D1)
+ x (upwards quadruple arrow - 27F0)
+290B DOWNWARDS TRIPLE ARROW
+ x (downwards double arrow - 21D3)
+ x (downwards quadruple arrow - 27F1)
+290C LEFTWARDS DOUBLE DASH ARROW
+290D RIGHTWARDS DOUBLE DASH ARROW
+290E LEFTWARDS TRIPLE DASH ARROW
+290F RIGHTWARDS TRIPLE DASH ARROW
+2910 RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+ x (leftwards two-headed triple dash arrow - 2B37)
+2911 RIGHTWARDS ARROW WITH DOTTED STEM
+ x (leftwards arrow with dotted stem - 2B38)
+2912 UPWARDS ARROW TO BAR
+2913 DOWNWARDS ARROW TO BAR
+2914 RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+ = z notation partial injection
+ x (leftwards arrow with tail with vertical stroke - 2B39)
+2915 RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+ = z notation finite injection
+ x (leftwards arrow with tail with double vertical stroke - 2B3A)
+2916 RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+ = bijective mapping
+ = z notation bijection
+ x (leftwards two-headed arrow with tail - 2B3B)
+2917 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+ = z notation surjective injection
+ x (leftwards two-headed arrow with tail with vertical stroke - 2B3C)
+2918 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+ = z notation finite surjective injection
+ x (leftwards two-headed arrow with tail with double vertical stroke - 2B3D)
+@ Arrow tails
+2919 LEFTWARDS ARROW-TAIL
+291A RIGHTWARDS ARROW-TAIL
+291B LEFTWARDS DOUBLE ARROW-TAIL
+291C RIGHTWARDS DOUBLE ARROW-TAIL
+@ Miscellaneous arrows
+291D LEFTWARDS ARROW TO BLACK DIAMOND
+291E RIGHTWARDS ARROW TO BLACK DIAMOND
+291F LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2920 RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2921 NORTH WEST AND SOUTH EAST ARROW
+2922 NORTH EAST AND SOUTH WEST ARROW
+2923 NORTH WEST ARROW WITH HOOK
+2924 NORTH EAST ARROW WITH HOOK
+2925 SOUTH EAST ARROW WITH HOOK
+2926 SOUTH WEST ARROW WITH HOOK
+@ Crossing arrows for knot theory
+2927 NORTH WEST ARROW AND NORTH EAST ARROW
+2928 NORTH EAST ARROW AND SOUTH EAST ARROW
+2929 SOUTH EAST ARROW AND SOUTH WEST ARROW
+292A SOUTH WEST ARROW AND NORTH WEST ARROW
+292B RISING DIAGONAL CROSSING FALLING DIAGONAL
+292C FALLING DIAGONAL CROSSING RISING DIAGONAL
+292D SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+292E NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+292F FALLING DIAGONAL CROSSING NORTH EAST ARROW
+2930 RISING DIAGONAL CROSSING SOUTH EAST ARROW
+2931 NORTH EAST ARROW CROSSING NORTH WEST ARROW
+2932 NORTH WEST ARROW CROSSING NORTH EAST ARROW
+@ Miscellaneous curved arrows
+2933 WAVE ARROW POINTING DIRECTLY RIGHT
+ x (rightwards wave arrow - 219D)
+ x (wave arrow pointing directly left - 2B3F)
+2934 ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+2935 ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+2936 ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+2937 ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+2938 RIGHT-SIDE ARC CLOCKWISE ARROW
+2939 LEFT-SIDE ARC ANTICLOCKWISE ARROW
+293A TOP ARC ANTICLOCKWISE ARROW
+293B BOTTOM ARC ANTICLOCKWISE ARROW
+293C TOP ARC CLOCKWISE ARROW WITH MINUS
+293D TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+293E LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
+293F LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
+2940 ANTICLOCKWISE CLOSED CIRCLE ARROW
+ x (combining anticlockwise ring overlay - 20DA)
+2941 CLOCKWISE CLOSED CIRCLE ARROW
+ x (combining clockwise ring overlay - 20D9)
+@ Arrows combined with operators
+2942 RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+2943 LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+2944 SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+2945 RIGHTWARDS ARROW WITH PLUS BELOW
+2946 LEFTWARDS ARROW WITH PLUS BELOW
+2947 RIGHTWARDS ARROW THROUGH X
+ x (leftwards arrow through x - 2B3E)
+2948 LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+2949 UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+@ Double-barbed harpoons
+294A LEFT BARB UP RIGHT BARB DOWN HARPOON
+294B LEFT BARB DOWN RIGHT BARB UP HARPOON
+294C UP BARB RIGHT DOWN BARB LEFT HARPOON
+294D UP BARB LEFT DOWN BARB RIGHT HARPOON
+294E LEFT BARB UP RIGHT BARB UP HARPOON
+294F UP BARB RIGHT DOWN BARB RIGHT HARPOON
+2950 LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+2951 UP BARB LEFT DOWN BARB LEFT HARPOON
+@ Modified harpoons
+2952 LEFTWARDS HARPOON WITH BARB UP TO BAR
+2953 RIGHTWARDS HARPOON WITH BARB UP TO BAR
+2954 UPWARDS HARPOON WITH BARB RIGHT TO BAR
+2955 DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+2956 LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+2957 RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+2958 UPWARDS HARPOON WITH BARB LEFT TO BAR
+2959 DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+295A LEFTWARDS HARPOON WITH BARB UP FROM BAR
+295B RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+295C UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+295D DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+295E LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+295F RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+2960 UPWARDS HARPOON WITH BARB LEFT FROM BAR
+2961 DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+@ Paired harpoons
+2962 LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+2963 UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2964 RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2965 DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+2966 LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+2967 LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2968 RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+2969 RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+296A LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296B LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296C RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296D RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296E UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+296F DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+@ Miscellaneous arrow
+2970 RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+ x (superset of - 2283)
+@ Arrows combined with relations
+2971 EQUALS SIGN ABOVE RIGHTWARDS ARROW
+ x (equals sign above leftwards arrow - 2B40)
+2972 TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+ x (reverse tilde operator above leftwards arrow - 2B41)
+2973 LEFTWARDS ARROW ABOVE TILDE OPERATOR
+ x (rightwards arrow above reverse tilde operator - 2B4C)
+2974 RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+ x (leftwards arrow above reverse tilde operator - 2B4B)
+2975 RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+ x (leftwards arrow above reverse almost equal to - 2B42)
+2976 LESS-THAN ABOVE LEFTWARDS ARROW
+2977 LEFTWARDS ARROW THROUGH LESS-THAN
+ x (rightwards arrow through greater-than - 2B43)
+2978 GREATER-THAN ABOVE RIGHTWARDS ARROW
+2979 SUBSET ABOVE RIGHTWARDS ARROW
+297A LEFTWARDS ARROW THROUGH SUBSET
+ x (rightwards arrow through superset - 2B44)
+297B SUPERSET ABOVE LEFTWARDS ARROW
+@ Fish tails
+297C LEFT FISH TAIL
+297D RIGHT FISH TAIL
+297E UP FISH TAIL
+297F DOWN FISH TAIL
+@@ 2980 Miscellaneous Mathematical Symbols-B 29FF
+@ Miscellaneous mathematical symbols
+2980 TRIPLE VERTICAL BAR DELIMITER
+ x (triple vertical bar binary relation - 2AF4)
+ x (large triple vertical bar operator - 2AFC)
+2981 Z NOTATION SPOT
+ * medium-small-sized black circle
+ x (bullet operator - 2219)
+ x (black circle - 25CF)
+2982 Z NOTATION TYPE COLON
+ x (tibetan sign rnam bcad - 0F7F)
+@ Brackets
+2983 LEFT WHITE CURLY BRACKET
+2984 RIGHT WHITE CURLY BRACKET
+2985 LEFT WHITE PARENTHESIS
+ x (left double parenthesis - 2E28)
+ x (fullwidth left white parenthesis - FF5F)
+2986 RIGHT WHITE PARENTHESIS
+ * used for Bourbakist intervals
+ x (right double parenthesis - 2E29)
+ x (fullwidth right white parenthesis - FF60)
+2987 Z NOTATION LEFT IMAGE BRACKET
+2988 Z NOTATION RIGHT IMAGE BRACKET
+2989 Z NOTATION LEFT BINDING BRACKET
+298A Z NOTATION RIGHT BINDING BRACKET
+298B LEFT SQUARE BRACKET WITH UNDERBAR
+298C RIGHT SQUARE BRACKET WITH UNDERBAR
+298D LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 LEFT ANGLE BRACKET WITH DOT
+2992 RIGHT ANGLE BRACKET WITH DOT
+2993 LEFT ARC LESS-THAN BRACKET
+2994 RIGHT ARC GREATER-THAN BRACKET
+2995 DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 LEFT BLACK TORTOISE SHELL BRACKET
+ x (mathematical left white tortoise shell bracket - 27EC)
+ x (left tortoise shell bracket - 3014)
+ x (left white tortoise shell bracket - 3018)
+2998 RIGHT BLACK TORTOISE SHELL BRACKET
+@ Fences
+2999 DOTTED FENCE
+ * four close dots vertical
+299A VERTICAL ZIGZAG LINE
+ x (wavy line - 2307)
+@ Angles
+299B MEASURED ANGLE OPENING LEFT
+ x (measured angle - 2221)
+299C RIGHT ANGLE VARIANT WITH SQUARE
+ x (right angle - 221F)
+299D MEASURED RIGHT ANGLE WITH DOT
+299E ANGLE WITH S INSIDE
+299F ACUTE ANGLE
+29A0 SPHERICAL ANGLE OPENING LEFT
+ x (spherical angle - 2222)
+29A1 SPHERICAL ANGLE OPENING UP
+29A2 TURNED ANGLE
+ x (angle - 2220)
+29A3 REVERSED ANGLE
+29A4 ANGLE WITH UNDERBAR
+29A5 REVERSED ANGLE WITH UNDERBAR
+29A6 OBLIQUE ANGLE OPENING UP
+29A7 OBLIQUE ANGLE OPENING DOWN
+29A8 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+29A9 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+29AA MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+29AB MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+29AC MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+29AD MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+29AE MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+29AF MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+@ Empty sets
+29B0 REVERSED EMPTY SET
+ x (empty set - 2205)
+ x (apl functional symbol circle backslash - 2349)
+29B1 EMPTY SET WITH OVERBAR
+29B2 EMPTY SET WITH SMALL CIRCLE ABOVE
+29B3 EMPTY SET WITH RIGHT ARROW ABOVE
+29B4 EMPTY SET WITH LEFT ARROW ABOVE
+@ Circle symbols
+29B5 CIRCLE WITH HORIZONTAL BAR
+ x (circled minus - 2296)
+29B6 CIRCLED VERTICAL BAR
+29B7 CIRCLED PARALLEL
+29B8 CIRCLED REVERSE SOLIDUS
+29B9 CIRCLED PERPENDICULAR
+29BA CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
+29BB CIRCLE WITH SUPERIMPOSED X
+ x (circled times - 2297)
+29BC CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+29BD UP ARROW THROUGH CIRCLE
+29BE CIRCLED WHITE BULLET
+ x (circled ring operator - 229A)
+ x (apl functional symbol circle jot - 233E)
+ x (bullseye - 25CE)
+29BF CIRCLED BULLET
+ * forms part of a graduated set of circles with enclosed black circle of different sizes
+ x (circled dot operator - 2299)
+ x (fisheye - 25C9)
+ x (n-ary circled dot operator - 2A00)
+29C0 CIRCLED LESS-THAN
+29C1 CIRCLED GREATER-THAN
+29C2 CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+29C3 CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+@ Square symbols
+29C4 SQUARED RISING DIAGONAL SLASH
+ x (apl functional symbol quad slash - 2341)
+ x (masu mark - 303C)
+29C5 SQUARED FALLING DIAGONAL SLASH
+ x (apl functional symbol quad backslash - 2342)
+29C6 SQUARED ASTERISK
+29C7 SQUARED SMALL CIRCLE
+ x (apl functional symbol quad jot - 233B)
+29C8 SQUARED SQUARE
+29C9 TWO JOINED SQUARES
+@ Triangle symbols
+29CA TRIANGLE WITH DOT ABOVE
+29CB TRIANGLE WITH UNDERBAR
+29CC S IN TRIANGLE
+29CD TRIANGLE WITH SERIFS AT BOTTOM
+ x (white up-pointing triangle - 25B3)
+29CE RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+29CF LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0 VERTICAL BAR BESIDE RIGHT TRIANGLE
+@ Bowtie symbols
+29D1 BOWTIE WITH LEFT HALF BLACK
+ x (bowtie - 22C8)
+29D2 BOWTIE WITH RIGHT HALF BLACK
+29D3 BLACK BOWTIE
+29D4 TIMES WITH LEFT HALF BLACK
+ x (left normal factor semidirect product - 22C9)
+29D5 TIMES WITH RIGHT HALF BLACK
+ x (right normal factor semidirect product - 22CA)
+29D6 WHITE HOURGLASS
+ = vertical bowtie
+ = white framus
+ x (hourglass - 231B)
+29D7 BLACK HOURGLASS
+@ Fences
+29D8 LEFT WIGGLY FENCE
+ x (presentation form for vertical wavy low line - FE34)
+29D9 RIGHT WIGGLY FENCE
+29DA LEFT DOUBLE WIGGLY FENCE
+29DB RIGHT DOUBLE WIGGLY FENCE
+@ Miscellaneous mathematical symbols
+29DC INCOMPLETE INFINITY
+ = ISOtech entity &iinfin;
+ x (infinity - 221E)
+29DD TIE OVER INFINITY
+29DE INFINITY NEGATED WITH VERTICAL BAR
+29DF DOUBLE-ENDED MULTIMAP
+ x (multimap - 22B8)
+29E0 SQUARE WITH CONTOURED OUTLINE
+ = D'Alembertian
+ x (lower right drop-shadowed white square - 274F)
+29E1 INCREASES AS
+ x (normal subgroup of or equal to - 22B4)
+29E2 SHUFFLE PRODUCT
+ x (z notation bag membership - 22FF)
+@ Relations
+29E3 EQUALS SIGN AND SLANTED PARALLEL
+ x (number sign - 0023)
+ x (equal and parallel to - 22D5)
+29E4 EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+29E5 IDENTICAL TO AND SLANTED PARALLEL
+ x (triple horizontal bar with double vertical stroke - 2A68)
+29E6 GLEICH STARK
+ = tautological equivalent
+@ Miscellaneous mathematical symbols
+29E7 THERMODYNAMIC
+ * vertical bar crossed by two horizontals
+ x (not equal to - 2260)
+29E8 DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+ x (up-pointing triangle with left half black - 25ED)
+29E9 DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+ x (up-pointing triangle with right half black - 25EE)
+29EA BLACK DIAMOND WITH DOWN ARROW
+29EB BLACK LOZENGE
+ x (lozenge - 25CA)
+29EC WHITE CIRCLE WITH DOWN ARROW
+29ED BLACK CIRCLE WITH DOWN ARROW
+@ Error bar symbols
+29EE ERROR-BARRED WHITE SQUARE
+29EF ERROR-BARRED BLACK SQUARE
+29F0 ERROR-BARRED WHITE DIAMOND
+29F1 ERROR-BARRED BLACK DIAMOND
+29F2 ERROR-BARRED WHITE CIRCLE
+29F3 ERROR-BARRED BLACK CIRCLE
+@ Miscellaneous mathematical symbols
+29F4 RULE-DELAYED
+ = colon right arrow
+29F5 REVERSE SOLIDUS OPERATOR
+ x (reverse solidus - 005C)
+ x (set minus - 2216)
+29F6 SOLIDUS WITH OVERBAR
+29F7 REVERSE SOLIDUS WITH HORIZONTAL STROKE
+ x (apl functional symbol backslash bar - 2340)
+@ Large operators
+29F8 BIG SOLIDUS
+ x (division slash - 2215)
+29F9 BIG REVERSE SOLIDUS
+ = z notation schema hiding
+ x (set minus - 2216)
+@ Specialized plus sign operators
+29FA DOUBLE PLUS
+29FB TRIPLE PLUS
+@ Brackets
+29FC LEFT-POINTING CURVED ANGLE BRACKET
+ x (precedes - 227A)
+ x (left-pointing angle bracket - 2329)
+29FD RIGHT-POINTING CURVED ANGLE BRACKET
+ x (succeeds - 227B)
+ x (right-pointing angle bracket - 232A)
+@ Miscellaneous mathematical symbols
+29FE TINY
+ x (plus sign - 002B)
+29FF MINY
+ x (minus sign - 2212)
+@@ 2A00 Supplemental Mathematical Operators 2AFF
+@ N-ary operators
+2A00 N-ARY CIRCLED DOT OPERATOR
+ x (circled dot operator - 2299)
+ x (fisheye - 25C9)
+2A01 N-ARY CIRCLED PLUS OPERATOR
+ x (circled plus - 2295)
+2A02 N-ARY CIRCLED TIMES OPERATOR
+ x (circled times - 2297)
+2A03 N-ARY UNION OPERATOR WITH DOT
+2A04 N-ARY UNION OPERATOR WITH PLUS
+ x (multiset union - 228E)
+2A05 N-ARY SQUARE INTERSECTION OPERATOR
+ x (square cap - 2293)
+2A06 N-ARY SQUARE UNION OPERATOR
+ x (square cup - 2294)
+2A07 TWO LOGICAL AND OPERATOR
+ = merge
+ x (two intersecting logical and - 2A55)
+2A08 TWO LOGICAL OR OPERATOR
+ x (two intersecting logical or - 2A56)
+2A09 N-ARY TIMES OPERATOR
+ x (multiplication sign - 00D7)
+@ Summations and integrals
+2A0A MODULO TWO SUM
+ x (n-ary summation - 2211)
+2A0B SUMMATION WITH INTEGRAL
+2A0C QUADRUPLE INTEGRAL OPERATOR
+ x (triple integral - 222D)
+ # 222B 222B 222B 222B
+2A0D FINITE PART INTEGRAL
+2A0E INTEGRAL WITH DOUBLE STROKE
+2A0F INTEGRAL AVERAGE WITH SLASH
+2A10 CIRCULATION FUNCTION
+2A11 ANTICLOCKWISE INTEGRATION
+2A12 LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+2A13 LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+2A14 LINE INTEGRATION NOT INCLUDING THE POLE
+2A15 INTEGRAL AROUND A POINT OPERATOR
+ x (contour integral - 222E)
+2A16 QUATERNION INTEGRAL OPERATOR
+2A17 INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+2A18 INTEGRAL WITH TIMES SIGN
+2A19 INTEGRAL WITH INTERSECTION
+2A1A INTEGRAL WITH UNION
+2A1B INTEGRAL WITH OVERBAR
+ = upper integral
+2A1C INTEGRAL WITH UNDERBAR
+ = lower integral
+@ Miscellaneous large operators
+2A1D JOIN
+ = large bowtie
+ * relational database theory
+ x (bowtie - 22C8)
+ x (full outer join - 27D7)
+2A1E LARGE LEFT TRIANGLE OPERATOR
+ * relational database theory
+ x (white left-pointing triangle - 25C1)
+2A1F Z NOTATION SCHEMA COMPOSITION
+ x (z notation relational composition - 2A3E)
+2A20 Z NOTATION SCHEMA PIPING
+ x (much greater-than - 226B)
+2A21 Z NOTATION SCHEMA PROJECTION
+ x (upwards harpoon with barb rightwards - 21BE)
+@ Plus and minus sign operators
+2A22 PLUS SIGN WITH SMALL CIRCLE ABOVE
+2A23 PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+2A24 PLUS SIGN WITH TILDE ABOVE
+ = positive difference or sum
+2A25 PLUS SIGN WITH DOT BELOW
+ x (dot plus - 2214)
+2A26 PLUS SIGN WITH TILDE BELOW
+ = sum or positive difference
+2A27 PLUS SIGN WITH SUBSCRIPT TWO
+ = nim-addition
+2A28 PLUS SIGN WITH BLACK TRIANGLE
+2A29 MINUS SIGN WITH COMMA ABOVE
+2A2A MINUS SIGN WITH DOT BELOW
+ x (dot minus - 2238)
+2A2B MINUS SIGN WITH FALLING DOTS
+2A2C MINUS SIGN WITH RISING DOTS
+2A2D PLUS SIGN IN LEFT HALF CIRCLE
+2A2E PLUS SIGN IN RIGHT HALF CIRCLE
+@ Multiplication and division sign operators
+2A2F VECTOR OR CROSS PRODUCT
+ x (multiplication sign - 00D7)
+2A30 MULTIPLICATION SIGN WITH DOT ABOVE
+2A31 MULTIPLICATION SIGN WITH UNDERBAR
+2A32 SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+2A33 SMASH PRODUCT
+2A34 MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35 MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A36 CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+2A37 MULTIPLICATION SIGN IN DOUBLE CIRCLE
+2A38 CIRCLED DIVISION SIGN
+@ Miscellaneous mathematical operators
+2A39 PLUS SIGN IN TRIANGLE
+2A3A MINUS SIGN IN TRIANGLE
+2A3B MULTIPLICATION SIGN IN TRIANGLE
+2A3C INTERIOR PRODUCT
+ x (right floor - 230B)
+2A3D RIGHTHAND INTERIOR PRODUCT
+ x (left floor - 230A)
+ x (turned not sign - 2319)
+2A3E Z NOTATION RELATIONAL COMPOSITION
+ x (z notation schema composition - 2A1F)
+2A3F AMALGAMATION OR COPRODUCT
+ x (n-ary coproduct - 2210)
+@ Intersections and unions
+2A40 INTERSECTION WITH DOT
+ x (logical and - 2227)
+ x (and with dot - 27D1)
+2A41 UNION WITH MINUS SIGN
+ = z notation bag subtraction
+ x (multiset union - 228E)
+2A42 UNION WITH OVERBAR
+2A43 INTERSECTION WITH OVERBAR
+2A44 INTERSECTION WITH LOGICAL AND
+2A45 UNION WITH LOGICAL OR
+2A46 UNION ABOVE INTERSECTION
+2A47 INTERSECTION ABOVE UNION
+2A48 UNION ABOVE BAR ABOVE INTERSECTION
+2A49 INTERSECTION ABOVE BAR ABOVE UNION
+2A4A UNION BESIDE AND JOINED WITH UNION
+2A4B INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+2A4C CLOSED UNION WITH SERIFS
+ x (union - 222A)
+2A4D CLOSED INTERSECTION WITH SERIFS
+ x (intersection - 2229)
+2A4E DOUBLE SQUARE INTERSECTION
+2A4F DOUBLE SQUARE UNION
+2A50 CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+@ Logical ands and ors
+2A51 LOGICAL AND WITH DOT ABOVE
+2A52 LOGICAL OR WITH DOT ABOVE
+2A53 DOUBLE LOGICAL AND
+2A54 DOUBLE LOGICAL OR
+2A55 TWO INTERSECTING LOGICAL AND
+ x (two logical and operator - 2A07)
+2A56 TWO INTERSECTING LOGICAL OR
+ x (two logical or operator - 2A08)
+2A57 SLOPING LARGE OR
+2A58 SLOPING LARGE AND
+2A59 LOGICAL OR OVERLAPPING LOGICAL AND
+2A5A LOGICAL AND WITH MIDDLE STEM
+2A5B LOGICAL OR WITH MIDDLE STEM
+2A5C LOGICAL AND WITH HORIZONTAL DASH
+2A5D LOGICAL OR WITH HORIZONTAL DASH
+2A5E LOGICAL AND WITH DOUBLE OVERBAR
+ x (perspective - 2306)
+2A5F LOGICAL AND WITH UNDERBAR
+2A60 LOGICAL AND WITH DOUBLE UNDERBAR
+ x (estimates - 2259)
+2A61 SMALL VEE WITH UNDERBAR
+ x (equiangular to - 225A)
+2A62 LOGICAL OR WITH DOUBLE OVERBAR
+2A63 LOGICAL OR WITH DOUBLE UNDERBAR
+ x (equiangular to - 225A)
+@ Miscellaneous mathematical operators
+2A64 Z NOTATION DOMAIN ANTIRESTRICTION
+2A65 Z NOTATION RANGE ANTIRESTRICTION
+ x (conical taper - 2332)
+@ Relational operators
+2A66 EQUALS SIGN WITH DOT BELOW
+ x (approaches the limit - 2250)
+2A67 IDENTICAL WITH DOT ABOVE
+2A68 TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
+ = identical and parallel to
+ x (equal and parallel to - 22D5)
+ x (identical to and slanted parallel - 29E5)
+2A69 TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
+2A6A TILDE OPERATOR WITH DOT ABOVE
+2A6B TILDE OPERATOR WITH RISING DOTS
+ x (homothetic - 223B)
+2A6C SIMILAR MINUS SIMILAR
+2A6D CONGRUENT WITH DOT ABOVE
+ x (approximately equal to - 2245)
+2A6E EQUALS WITH ASTERISK
+ x (star equals - 225B)
+2A6F ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+2A70 APPROXIMATELY EQUAL OR EQUAL TO
+2A71 EQUALS SIGN ABOVE PLUS SIGN
+ * black stands slightly better (chess notation)
+2A72 PLUS SIGN ABOVE EQUALS SIGN
+ * white stands slightly better (chess notation)
+2A73 EQUALS SIGN ABOVE TILDE OPERATOR
+2A74 DOUBLE COLON EQUAL
+ # 003A 003A 003D
+2A75 TWO CONSECUTIVE EQUALS SIGNS
+ # 003D 003D
+2A76 THREE CONSECUTIVE EQUALS SIGNS
+ # 003D 003D 003D
+2A77 EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+2A78 EQUIVALENT WITH FOUR DOTS ABOVE
+2A79 LESS-THAN WITH CIRCLE INSIDE
+2A7A GREATER-THAN WITH CIRCLE INSIDE
+2A7B LESS-THAN WITH QUESTION MARK ABOVE
+2A7C GREATER-THAN WITH QUESTION MARK ABOVE
+2A7D LESS-THAN OR SLANTED EQUAL TO
+ x (less-than or equal to - 2264)
+2A7E GREATER-THAN OR SLANTED EQUAL TO
+ x (greater-than or equal to - 2265)
+2A7F LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80 GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81 LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82 GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83 LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84 GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A85 LESS-THAN OR APPROXIMATE
+2A86 GREATER-THAN OR APPROXIMATE
+2A87 LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+ x (less-than but not equal to - 2268)
+2A88 GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+ x (greater-than but not equal to - 2269)
+2A89 LESS-THAN AND NOT APPROXIMATE
+2A8A GREATER-THAN AND NOT APPROXIMATE
+2A8B LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+ x (less-than equal to or greater-than - 22DA)
+2A8C GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+ x (greater-than equal to or less-than - 22DB)
+2A8D LESS-THAN ABOVE SIMILAR OR EQUAL
+2A8E GREATER-THAN ABOVE SIMILAR OR EQUAL
+2A8F LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+2A90 GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+2A91 LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92 GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93 LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94 GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95 SLANTED EQUAL TO OR LESS-THAN
+ x (equal to or less-than - 22DC)
+2A96 SLANTED EQUAL TO OR GREATER-THAN
+ x (equal to or greater-than - 22DD)
+2A97 SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98 SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99 DOUBLE-LINE EQUAL TO OR LESS-THAN
+ x (equal to or less-than - 22DC)
+2A9A DOUBLE-LINE EQUAL TO OR GREATER-THAN
+ x (equal to or greater-than - 22DD)
+2A9B DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2A9D SIMILAR OR LESS-THAN
+2A9E SIMILAR OR GREATER-THAN
+2A9F SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+2AA0 SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+2AA1 DOUBLE NESTED LESS-THAN
+ = absolute continuity
+ x (much less-than - 226A)
+2AA2 DOUBLE NESTED GREATER-THAN
+ x (much greater-than - 226B)
+2AA3 DOUBLE NESTED LESS-THAN WITH UNDERBAR
+2AA4 GREATER-THAN OVERLAPPING LESS-THAN
+2AA5 GREATER-THAN BESIDE LESS-THAN
+2AA6 LESS-THAN CLOSED BY CURVE
+2AA7 GREATER-THAN CLOSED BY CURVE
+2AA8 LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9 GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA SMALLER THAN
+2AAB LARGER THAN
+2AAC SMALLER THAN OR EQUAL TO
+2AAD LARGER THAN OR EQUAL TO
+2AAE EQUALS SIGN WITH BUMPY ABOVE
+ x (difference between - 224F)
+2AAF PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+ x (precedes or equal to - 227C)
+2AB0 SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+ x (succeeds or equal to - 227D)
+2AB1 PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+2AB2 SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+2AB3 PRECEDES ABOVE EQUALS SIGN
+2AB4 SUCCEEDS ABOVE EQUALS SIGN
+2AB5 PRECEDES ABOVE NOT EQUAL TO
+2AB6 SUCCEEDS ABOVE NOT EQUAL TO
+2AB7 PRECEDES ABOVE ALMOST EQUAL TO
+2AB8 SUCCEEDS ABOVE ALMOST EQUAL TO
+2AB9 PRECEDES ABOVE NOT ALMOST EQUAL TO
+2ABA SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+2ABB DOUBLE PRECEDES
+2ABC DOUBLE SUCCEEDS
+@ Subset and superset relations
+2ABD SUBSET WITH DOT
+2ABE SUPERSET WITH DOT
+2ABF SUBSET WITH PLUS SIGN BELOW
+2AC0 SUPERSET WITH PLUS SIGN BELOW
+2AC1 SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2 SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3 SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4 SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5 SUBSET OF ABOVE EQUALS SIGN
+2AC6 SUPERSET OF ABOVE EQUALS SIGN
+2AC7 SUBSET OF ABOVE TILDE OPERATOR
+2AC8 SUPERSET OF ABOVE TILDE OPERATOR
+2AC9 SUBSET OF ABOVE ALMOST EQUAL TO
+2ACA SUPERSET OF ABOVE ALMOST EQUAL TO
+2ACB SUBSET OF ABOVE NOT EQUAL TO
+2ACC SUPERSET OF ABOVE NOT EQUAL TO
+2ACD SQUARE LEFT OPEN BOX OPERATOR
+2ACE SQUARE RIGHT OPEN BOX OPERATOR
+2ACF CLOSED SUBSET
+ x (subset of - 2282)
+2AD0 CLOSED SUPERSET
+ x (superset of - 2283)
+2AD1 CLOSED SUBSET OR EQUAL TO
+2AD2 CLOSED SUPERSET OR EQUAL TO
+2AD3 SUBSET ABOVE SUPERSET
+2AD4 SUPERSET ABOVE SUBSET
+2AD5 SUBSET ABOVE SUBSET
+2AD6 SUPERSET ABOVE SUPERSET
+2AD7 SUPERSET BESIDE SUBSET
+2AD8 SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+@ Forks
+2AD9 ELEMENT OF OPENING DOWNWARDS
+ x (element of - 2208)
+ x (element of opening upwards - 27D2)
+2ADA PITCHFORK WITH TEE TOP
+ x (pitchfork - 22D4)
+2ADB TRANSVERSAL INTERSECTION
+ x (pitchfork - 22D4)
+2ADC FORKING (not independent)
+ = not independent
+ * an equational logic symbol, not a computing science symbol
+ * non-independence (original concept) is related to forking
+ : 2ADD 0338
+2ADD NONFORKING (independent)
+ = independent
+ * an equational logic symbol, not a computing science symbol
+ * independence (original concept) is related to non-forking
+@ Tacks and turnstiles
+2ADE SHORT LEFT TACK
+ x (left tack - 22A3)
+2ADF SHORT DOWN TACK
+ x (down tack - 22A4)
+2AE0 SHORT UP TACK
+ x (up tack - 22A5)
+2AE1 PERPENDICULAR WITH S
+2AE2 VERTICAL BAR TRIPLE RIGHT TURNSTILE
+ = ordinarily satisfies
+2AE3 DOUBLE VERTICAL BAR LEFT TURNSTILE
+ x (forces - 22A9)
+2AE4 VERTICAL BAR DOUBLE LEFT TURNSTILE
+ x (true - 22A8)
+2AE5 DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE6 LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+ x (forces - 22A9)
+2AE7 SHORT DOWN TACK WITH OVERBAR
+ x (down tack - 22A4)
+ x (apl functional symbol up tack overbar - 2351)
+2AE8 SHORT UP TACK WITH UNDERBAR
+ x (up tack - 22A5)
+ x (apl functional symbol down tack underbar - 234A)
+2AE9 SHORT UP TACK ABOVE SHORT DOWN TACK
+2AEA DOUBLE DOWN TACK
+2AEB DOUBLE UP TACK
+ = independence
+ * probability theory
+2AEC DOUBLE STROKE NOT SIGN
+ x (not sign - 00AC)
+2AED REVERSED DOUBLE STROKE NOT SIGN
+ x (reversed not sign - 2310)
+@ Vertical line operators
+2AEE DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+ x (does not divide - 2224)
+2AEF VERTICAL LINE WITH CIRCLE ABOVE
+2AF0 VERTICAL LINE WITH CIRCLE BELOW
+2AF1 DOWN TACK WITH CIRCLE BELOW
+ = necessarily satisfies
+ x (up tack with circle above - 27DF)
+2AF2 PARALLEL WITH HORIZONTAL STROKE
+ x (not parallel to - 2226)
+ x (vertical bar with horizontal stroke - 27CA)
+2AF3 PARALLEL WITH TILDE OPERATOR
+2AF4 TRIPLE VERTICAL BAR BINARY RELATION
+ = interleave
+ x (triple vertical bar delimiter - 2980)
+2AF5 TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
+ x (vertical bar with horizontal stroke - 27CA)
+@ Miscellaneous mathematical operator
+2AF6 TRIPLE COLON OPERATOR
+ * logic
+ x (tricolon - 205D)
+ x (vertical ellipsis - 22EE)
+@ Relations
+2AF7 TRIPLE NESTED LESS-THAN
+ x (very much less-than - 22D8)
+2AF8 TRIPLE NESTED GREATER-THAN
+ x (very much greater-than - 22D9)
+2AF9 DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+ x (less-than over equal to - 2266)
+2AFA DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+ x (greater-than over equal to - 2267)
+2AFB TRIPLE SOLIDUS BINARY RELATION
+ x (triple vertical bar binary relation - 2AF4)
+@ Operators
+2AFC LARGE TRIPLE VERTICAL BAR OPERATOR
+ * often n-ary
+ x (triple vertical bar binary relation - 2AF4)
+ x (triple vertical bar delimiter - 2980)
+2AFD DOUBLE SOLIDUS OPERATOR
+ x (parallel to - 2225)
+2AFE WHITE VERTICAL BAR
+ = Dijkstra choice
+2AFF N-ARY WHITE VERTICAL BAR
+ = n-ary Dijkstra choice
+@@ 2B00 Miscellaneous Symbols and Arrows 2BFF
+@ White and black arrows
+@+ Other white and black arrows to complete this set can be found in the Arrows and Dingbats blocks.
+2B00 NORTH EAST WHITE ARROW
+2B01 NORTH WEST WHITE ARROW
+2B02 SOUTH EAST WHITE ARROW
+2B03 SOUTH WEST WHITE ARROW
+2B04 LEFT RIGHT WHITE ARROW
+ x (leftwards white arrow - 21E6)
+ x (up down white arrow - 21F3)
+2B05 LEFTWARDS BLACK ARROW
+ x (black rightwards arrow - 27A1)
+2B06 UPWARDS BLACK ARROW
+2B07 DOWNWARDS BLACK ARROW
+2B08 NORTH EAST BLACK ARROW
+2B09 NORTH WEST BLACK ARROW
+2B0A SOUTH EAST BLACK ARROW
+2B0B SOUTH WEST BLACK ARROW
+2B0C LEFT RIGHT BLACK ARROW
+2B0D UP DOWN BLACK ARROW
+@ Arrows with bent tips
+@+ Other arrows with bent tips to complete this set can be found in the Arrows block.
+2B0E RIGHTWARDS ARROW WITH TIP DOWNWARDS
+2B0F RIGHTWARDS ARROW WITH TIP UPWARDS
+2B10 LEFTWARDS ARROW WITH TIP DOWNWARDS
+2B11 LEFTWARDS ARROW WITH TIP UPWARDS
+@ Squares
+2B12 SQUARE WITH TOP HALF BLACK
+ x (square with left half black - 25E7)
+2B13 SQUARE WITH BOTTOM HALF BLACK
+2B14 SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK
+2B15 SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK
+@ Diamonds
+2B16 DIAMOND WITH LEFT HALF BLACK
+2B17 DIAMOND WITH RIGHT HALF BLACK
+2B18 DIAMOND WITH TOP HALF BLACK
+2B19 DIAMOND WITH BOTTOM HALF BLACK
+@ Squares
+2B1A DOTTED SQUARE
+2B1B BLACK LARGE SQUARE
+ x (black square - 25A0)
+2B1C WHITE LARGE SQUARE
+ x (white square - 25A1)
+2B1D BLACK VERY SMALL SQUARE
+ x (black small square - 25AA)
+2B1E WHITE VERY SMALL SQUARE
+ x (white small square - 25AB)
+@ Pentagons
+2B1F BLACK PENTAGON
+2B20 WHITE PENTAGON
+@ Hexagons
+2B21 WHITE HEXAGON
+2B22 BLACK HEXAGON
+2B23 HORIZONTAL BLACK HEXAGON
+@ Circle
+2B24 BLACK LARGE CIRCLE
+ x (black circle - 25CF)
+ x (large circle - 25EF)
+@ Diamonds and lozenges
+2B25 BLACK MEDIUM DIAMOND
+ x (black diamond - 25C6)
+2B26 WHITE MEDIUM DIAMOND
+2B27 BLACK MEDIUM LOZENGE
+2B28 WHITE MEDIUM LOZENGE
+ x (lozenge - 25CA)
+2B29 BLACK SMALL DIAMOND
+ x (diamond operator - 22C4)
+2B2A BLACK SMALL LOZENGE
+2B2B WHITE SMALL LOZENGE
+@ Ellipses
+2B2C BLACK HORIZONTAL ELLIPSE
+2B2D WHITE HORIZONTAL ELLIPSE
+2B2E BLACK VERTICAL ELLIPSE
+2B2F WHITE VERTICAL ELLIPSE
+@ Mathematical arrows
+@+ These provide the opposite direction complement for arrows for mathermatical use not originally encoded in both a leftwards and rightwards direction.
+2B30 LEFT ARROW WITH SMALL CIRCLE
+ x (right arrow with small circle - 21F4)
+2B31 THREE LEFTWARDS ARROWS
+ x (three rightwards arrows - 21F6)
+2B32 LEFT ARROW WITH CIRCLED PLUS
+ x (right arrow with circled plus - 27F4)
+2B33 LONG LEFTWARDS SQUIGGLE ARROW
+ x (long rightwards squiggle arrow - 27FF)
+ x (leftwards squiggle arrow - 21DC)
+2B34 LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+ x (rightwards two-headed arrow with vertical stroke - 2900)
+2B35 LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+ x (rightwards two-headed arrow with double vertical stroke - 2901)
+2B36 LEFTWARDS TWO-HEADED ARROW FROM BAR
+ x (rightwards two-headed arrow from bar - 2905)
+2B37 LEFTWARDS TWO-HEADED TRIPLE DASH ARROW
+ x (rightwards two-headed triple dash arrow - 2910)
+2B38 LEFTWARDS ARROW WITH DOTTED STEM
+ x (rightwards arrow with dotted stem - 2911)
+2B39 LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+ x (rightwards arrow with tail with vertical stroke - 2914)
+2B3A LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+ x (rightwards arrow with tail with double vertical stroke - 2915)
+2B3B LEFTWARDS TWO-HEADED ARROW WITH TAIL
+ x (rightwards two-headed arrow with tail - 2916)
+2B3C LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+ x (rightwards two-headed arrow with tail with vertical stroke - 2917)
+2B3D LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+ x (rightwards two-headed arrow with tail with double vertical stroke - 2918)
+2B3E LEFTWARDS ARROW THROUGH X
+ x (rightwards arrow through x - 2947)
+2B3F WAVE ARROW POINTING DIRECTLY LEFT
+ x (wave arrow pointing directly right - 2933)
+ x (leftwards wave arrow - 219C)
+2B40 EQUALS SIGN ABOVE LEFTWARDS ARROW
+ x (equals sign above rightwards arrow - 2971)
+2B41 REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW
+ * mirror image of "2972"
+ x (tilde operator above rightwards arrow - 2972)
+2B42 LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
+ * mirror image of "2975"
+ x (rightwards arrow above almost equal to - 2975)
+2B43 RIGHTWARDS ARROW THROUGH GREATER-THAN
+ * mirror image of "2977"
+ x (leftwards arrow through less-than - 2977)
+2B44 RIGHTWARDS ARROW THROUGH SUPERSET
+ * mirror image of "297A"
+ x (leftwards arrow through subset - 297A)
+2B45 LEFTWARDS QUADRUPLE ARROW
+ x (upwards quadruple arrow - 27F0)
+2B46 RIGHTWARDS QUADRUPLE ARROW
+2B47 REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2B48 RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
+2B49 TILDE OPERATOR ABOVE LEFTWARDS ARROW
+2B4A LEFTWARDS ARROW ABOVE ALMOST EQUAL TO
+2B4B LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+ * mirror image of "2974"
+ x (rightwards arrow above tilde operator - 2974)
+2B4C RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+ * mirror image of "2973"
+ x (leftwards arrow above tilde operator - 2973)
+@ Stars
+2B50 WHITE MEDIUM STAR
+ x (star operator - 22C6)
+2B51 BLACK SMALL STAR
+ x (arabic five pointed star - 066D)
+2B52 WHITE SMALL STAR
+@ Pentagons
+2B53 BLACK RIGHT-POINTING PENTAGON
+2B54 WHITE RIGHT-POINTING PENTAGON
+@@ 2C00 Glagolitic 2C5F
+@ Capital letters
+2C00 GLAGOLITIC CAPITAL LETTER AZU
+2C01 GLAGOLITIC CAPITAL LETTER BUKY
+2C02 GLAGOLITIC CAPITAL LETTER VEDE
+2C03 GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C04 GLAGOLITIC CAPITAL LETTER DOBRO
+2C05 GLAGOLITIC CAPITAL LETTER YESTU
+2C06 GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C07 GLAGOLITIC CAPITAL LETTER DZELO
+2C08 GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C09 GLAGOLITIC CAPITAL LETTER IZHE
+2C0A GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C0B GLAGOLITIC CAPITAL LETTER I
+2C0C GLAGOLITIC CAPITAL LETTER DJERVI
+2C0D GLAGOLITIC CAPITAL LETTER KAKO
+2C0E GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C0F GLAGOLITIC CAPITAL LETTER MYSLITE
+2C10 GLAGOLITIC CAPITAL LETTER NASHI
+2C11 GLAGOLITIC CAPITAL LETTER ONU
+2C12 GLAGOLITIC CAPITAL LETTER POKOJI
+2C13 GLAGOLITIC CAPITAL LETTER RITSI
+2C14 GLAGOLITIC CAPITAL LETTER SLOVO
+2C15 GLAGOLITIC CAPITAL LETTER TVRIDO
+2C16 GLAGOLITIC CAPITAL LETTER UKU
+2C17 GLAGOLITIC CAPITAL LETTER FRITU
+2C18 GLAGOLITIC CAPITAL LETTER HERU
+2C19 GLAGOLITIC CAPITAL LETTER OTU
+2C1A GLAGOLITIC CAPITAL LETTER PE
+2C1B GLAGOLITIC CAPITAL LETTER SHTA
+2C1C GLAGOLITIC CAPITAL LETTER TSI
+2C1D GLAGOLITIC CAPITAL LETTER CHRIVI
+2C1E GLAGOLITIC CAPITAL LETTER SHA
+2C1F GLAGOLITIC CAPITAL LETTER YERU
+2C20 GLAGOLITIC CAPITAL LETTER YERI
+2C21 GLAGOLITIC CAPITAL LETTER YATI
+2C22 GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C23 GLAGOLITIC CAPITAL LETTER YU
+2C24 GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C25 GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C26 GLAGOLITIC CAPITAL LETTER YO
+2C27 GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C28 GLAGOLITIC CAPITAL LETTER BIG YUS
+2C29 GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C2A GLAGOLITIC CAPITAL LETTER FITA
+2C2B GLAGOLITIC CAPITAL LETTER IZHITSA
+2C2C GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C2D GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C2E GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+@ Small letters
+2C30 GLAGOLITIC SMALL LETTER AZU
+2C31 GLAGOLITIC SMALL LETTER BUKY
+2C32 GLAGOLITIC SMALL LETTER VEDE
+2C33 GLAGOLITIC SMALL LETTER GLAGOLI
+2C34 GLAGOLITIC SMALL LETTER DOBRO
+2C35 GLAGOLITIC SMALL LETTER YESTU
+2C36 GLAGOLITIC SMALL LETTER ZHIVETE
+2C37 GLAGOLITIC SMALL LETTER DZELO
+2C38 GLAGOLITIC SMALL LETTER ZEMLJA
+2C39 GLAGOLITIC SMALL LETTER IZHE
+2C3A GLAGOLITIC SMALL LETTER INITIAL IZHE
+ x (cyrillic small letter iota - A647)
+2C3B GLAGOLITIC SMALL LETTER I
+2C3C GLAGOLITIC SMALL LETTER DJERVI
+2C3D GLAGOLITIC SMALL LETTER KAKO
+2C3E GLAGOLITIC SMALL LETTER LJUDIJE
+2C3F GLAGOLITIC SMALL LETTER MYSLITE
+2C40 GLAGOLITIC SMALL LETTER NASHI
+2C41 GLAGOLITIC SMALL LETTER ONU
+2C42 GLAGOLITIC SMALL LETTER POKOJI
+2C43 GLAGOLITIC SMALL LETTER RITSI
+2C44 GLAGOLITIC SMALL LETTER SLOVO
+2C45 GLAGOLITIC SMALL LETTER TVRIDO
+2C46 GLAGOLITIC SMALL LETTER UKU
+2C47 GLAGOLITIC SMALL LETTER FRITU
+2C48 GLAGOLITIC SMALL LETTER HERU
+2C49 GLAGOLITIC SMALL LETTER OTU
+2C4A GLAGOLITIC SMALL LETTER PE
+2C4B GLAGOLITIC SMALL LETTER SHTA
+2C4C GLAGOLITIC SMALL LETTER TSI
+2C4D GLAGOLITIC SMALL LETTER CHRIVI
+2C4E GLAGOLITIC SMALL LETTER SHA
+2C4F GLAGOLITIC SMALL LETTER YERU
+2C50 GLAGOLITIC SMALL LETTER YERI
+2C51 GLAGOLITIC SMALL LETTER YATI
+2C52 GLAGOLITIC SMALL LETTER SPIDERY HA
+2C53 GLAGOLITIC SMALL LETTER YU
+2C54 GLAGOLITIC SMALL LETTER SMALL YUS
+2C55 GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+2C56 GLAGOLITIC SMALL LETTER YO
+2C57 GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+2C58 GLAGOLITIC SMALL LETTER BIG YUS
+2C59 GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+2C5A GLAGOLITIC SMALL LETTER FITA
+2C5B GLAGOLITIC SMALL LETTER IZHITSA
+2C5C GLAGOLITIC SMALL LETTER SHTAPIC
+2C5D GLAGOLITIC SMALL LETTER TROKUTASTI A
+2C5E GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+@@ 2C60 Latin Extended-C 2C7F
+@ Orthographic Latin additions
+2C60 LATIN CAPITAL LETTER L WITH DOUBLE BAR
+2C61 LATIN SMALL LETTER L WITH DOUBLE BAR
+2C62 LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+ * lowercase is 026B
+2C63 LATIN CAPITAL LETTER P WITH STROKE
+ * lowercase is 1D7D
+2C64 LATIN CAPITAL LETTER R WITH TAIL
+ * lowercase is 027D
+2C65 LATIN SMALL LETTER A WITH STROKE
+ * uppercase is 023A
+2C66 LATIN SMALL LETTER T WITH DIAGONAL STROKE
+ * uppercase is 023E
+@ Additions for Uighur
+2C67 LATIN CAPITAL LETTER H WITH DESCENDER
+2C68 LATIN SMALL LETTER H WITH DESCENDER
+2C69 LATIN CAPITAL LETTER K WITH DESCENDER
+2C6A LATIN SMALL LETTER K WITH DESCENDER
+2C6B LATIN CAPITAL LETTER Z WITH DESCENDER
+2C6C LATIN SMALL LETTER Z WITH DESCENDER
+@ Miscellaneous additions
+2C6D LATIN CAPITAL LETTER ALPHA
+ * lowercase is 0251
+2C6E LATIN CAPITAL LETTER M WITH HOOK
+ * lowercase is 0271
+2C6F LATIN CAPITAL LETTER TURNED A
+ * lowercase is 0250
+2C71 LATIN SMALL LETTER V WITH RIGHT HOOK
+2C72 LATIN CAPITAL LETTER W WITH HOOK
+2C73 LATIN SMALL LETTER W WITH HOOK
+2C74 LATIN SMALL LETTER V WITH CURL
+@ Claudian letters
+@+ Claudian letters in inscriptions are uppercase, but may be transcribed by scholars in lowercase.
+2C75 LATIN CAPITAL LETTER HALF H
+ x (greek capital letter heta - 0370)
+ x (turned capital f - 2132)
+ x (roman numeral reversed one hundred - 2183)
+2C76 LATIN SMALL LETTER HALF H
+ x (greek small letter heta - 0371)
+@ Additions for UPA
+2C77 LATIN SMALL LETTER TAILLESS PHI
+ * medium rounded o
+2C78 LATIN SMALL LETTER E WITH NOTCH
+2C79 LATIN SMALL LETTER TURNED R WITH TAIL
+2C7A LATIN SMALL LETTER O WITH LOW RING INSIDE
+2C7B LATIN LETTER SMALL CAPITAL TURNED E
+2C7C LATIN SUBSCRIPT SMALL LETTER J
+ # <sub> 006A
+2C7D MODIFIER LETTER CAPITAL V
+ # <super> 0056
+@@ 2C80 Coptic 2CFF
+@+ Other Coptic letters derived from Demotic are encoded in the Greek and Coptic block.
+@ Bohairic Coptic letters
+2C80 COPTIC CAPITAL LETTER ALFA
+2C81 COPTIC SMALL LETTER ALFA
+2C82 COPTIC CAPITAL LETTER VIDA
+2C83 COPTIC SMALL LETTER VIDA
+2C84 COPTIC CAPITAL LETTER GAMMA
+2C85 COPTIC SMALL LETTER GAMMA
+2C86 COPTIC CAPITAL LETTER DALDA
+2C87 COPTIC SMALL LETTER DALDA
+2C88 COPTIC CAPITAL LETTER EIE
+2C89 COPTIC SMALL LETTER EIE
+2C8A COPTIC CAPITAL LETTER SOU
+2C8B COPTIC SMALL LETTER SOU
+2C8C COPTIC CAPITAL LETTER ZATA
+2C8D COPTIC SMALL LETTER ZATA
+2C8E COPTIC CAPITAL LETTER HATE
+2C8F COPTIC SMALL LETTER HATE
+2C90 COPTIC CAPITAL LETTER THETHE
+2C91 COPTIC SMALL LETTER THETHE
+2C92 COPTIC CAPITAL LETTER IAUDA
+2C93 COPTIC SMALL LETTER IAUDA
+2C94 COPTIC CAPITAL LETTER KAPA
+2C95 COPTIC SMALL LETTER KAPA
+2C96 COPTIC CAPITAL LETTER LAULA
+2C97 COPTIC SMALL LETTER LAULA
+2C98 COPTIC CAPITAL LETTER MI
+2C99 COPTIC SMALL LETTER MI
+2C9A COPTIC CAPITAL LETTER NI
+2C9B COPTIC SMALL LETTER NI
+2C9C COPTIC CAPITAL LETTER KSI
+2C9D COPTIC SMALL LETTER KSI
+2C9E COPTIC CAPITAL LETTER O
+2C9F COPTIC SMALL LETTER O
+2CA0 COPTIC CAPITAL LETTER PI
+2CA1 COPTIC SMALL LETTER PI
+2CA2 COPTIC CAPITAL LETTER RO
+2CA3 COPTIC SMALL LETTER RO
+2CA4 COPTIC CAPITAL LETTER SIMA
+2CA5 COPTIC SMALL LETTER SIMA
+2CA6 COPTIC CAPITAL LETTER TAU
+2CA7 COPTIC SMALL LETTER TAU
+2CA8 COPTIC CAPITAL LETTER UA
+2CA9 COPTIC SMALL LETTER UA
+2CAA COPTIC CAPITAL LETTER FI
+2CAB COPTIC SMALL LETTER FI
+2CAC COPTIC CAPITAL LETTER KHI
+2CAD COPTIC SMALL LETTER KHI
+2CAE COPTIC CAPITAL LETTER PSI
+2CAF COPTIC SMALL LETTER PSI
+2CB0 COPTIC CAPITAL LETTER OOU
+2CB1 COPTIC SMALL LETTER OOU
+@ Old Coptic and dialect letters
+2CB2 COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB3 COPTIC SMALL LETTER DIALECT-P ALEF
+2CB4 COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB5 COPTIC SMALL LETTER OLD COPTIC AIN
+2CB6 COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB7 COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB8 COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CB9 COPTIC SMALL LETTER DIALECT-P KAPA
+2CBA COPTIC CAPITAL LETTER DIALECT-P NI
+2CBB COPTIC SMALL LETTER DIALECT-P NI
+2CBC COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBD COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBE COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CBF COPTIC SMALL LETTER OLD COPTIC OOU
+2CC0 COPTIC CAPITAL LETTER SAMPI
+2CC1 COPTIC SMALL LETTER SAMPI
+2CC2 COPTIC CAPITAL LETTER CROSSED SHEI
+2CC3 COPTIC SMALL LETTER CROSSED SHEI
+2CC4 COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC5 COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC6 COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC7 COPTIC SMALL LETTER OLD COPTIC ESH
+2CC8 COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CC9 COPTIC SMALL LETTER AKHMIMIC KHEI
+2CCA COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCB COPTIC SMALL LETTER DIALECT-P HORI
+2CCC COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCD COPTIC SMALL LETTER OLD COPTIC HORI
+2CCE COPTIC CAPITAL LETTER OLD COPTIC HA
+2CCF COPTIC SMALL LETTER OLD COPTIC HA
+2CD0 COPTIC CAPITAL LETTER L-SHAPED HA
+2CD1 COPTIC SMALL LETTER L-SHAPED HA
+2CD2 COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD3 COPTIC SMALL LETTER OLD COPTIC HEI
+2CD4 COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD5 COPTIC SMALL LETTER OLD COPTIC HAT
+2CD6 COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD7 COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD8 COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CD9 COPTIC SMALL LETTER OLD COPTIC DJA
+2CDA COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDB COPTIC SMALL LETTER OLD COPTIC SHIMA
+@ Old Nubian letters
+2CDC COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDD COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDE COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CDF COPTIC SMALL LETTER OLD NUBIAN NGI
+2CE0 COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE1 COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE2 COPTIC CAPITAL LETTER OLD NUBIAN WAU
+2CE3 COPTIC SMALL LETTER OLD NUBIAN WAU
+@ Symbols
+2CE4 COPTIC SYMBOL KAI
+ x (greek kai symbol - 03D7)
+2CE5 COPTIC SYMBOL MI RO
+2CE6 COPTIC SYMBOL PI RO
+2CE7 COPTIC SYMBOL STAUROS
+2CE8 COPTIC SYMBOL TAU RO
+2CE9 COPTIC SYMBOL KHI RO
+ x (chi rho - 2627)
+2CEA COPTIC SYMBOL SHIMA SIMA
+@ Old Nubian punctuation
+2CF9 COPTIC OLD NUBIAN FULL STOP
+2CFA COPTIC OLD NUBIAN DIRECT QUESTION MARK
+2CFB COPTIC OLD NUBIAN INDIRECT QUESTION MARK
+2CFC COPTIC OLD NUBIAN VERSE DIVIDER
+@ Numeric character
+2CFD COPTIC FRACTION ONE HALF
+@ Punctuation
+2CFE COPTIC FULL STOP
+2CFF COPTIC MORPHOLOGICAL DIVIDER
+@@ 2D00 Georgian Supplement 2D2F
+@ Small letters (Khutsuri)
+@+ This is the lowercase of the old ecclesiastical alphabet. See the Georgian block for uppercase Asomtavruli.
+2D00 GEORGIAN SMALL LETTER AN (Khutsuri)
+2D01 GEORGIAN SMALL LETTER BAN (Khutsuri)
+2D02 GEORGIAN SMALL LETTER GAN (Khutsuri)
+2D03 GEORGIAN SMALL LETTER DON (Khutsuri)
+2D04 GEORGIAN SMALL LETTER EN (Khutsuri)
+2D05 GEORGIAN SMALL LETTER VIN (Khutsuri)
+2D06 GEORGIAN SMALL LETTER ZEN (Khutsuri)
+2D07 GEORGIAN SMALL LETTER TAN (Khutsuri)
+2D08 GEORGIAN SMALL LETTER IN (Khutsuri)
+2D09 GEORGIAN SMALL LETTER KAN (Khutsuri)
+2D0A GEORGIAN SMALL LETTER LAS (Khutsuri)
+2D0B GEORGIAN SMALL LETTER MAN (Khutsuri)
+2D0C GEORGIAN SMALL LETTER NAR (Khutsuri)
+2D0D GEORGIAN SMALL LETTER ON (Khutsuri)
+2D0E GEORGIAN SMALL LETTER PAR (Khutsuri)
+2D0F GEORGIAN SMALL LETTER ZHAR (Khutsuri)
+2D10 GEORGIAN SMALL LETTER RAE (Khutsuri)
+2D11 GEORGIAN SMALL LETTER SAN (Khutsuri)
+2D12 GEORGIAN SMALL LETTER TAR (Khutsuri)
+2D13 GEORGIAN SMALL LETTER UN (Khutsuri)
+2D14 GEORGIAN SMALL LETTER PHAR (Khutsuri)
+2D15 GEORGIAN SMALL LETTER KHAR (Khutsuri)
+2D16 GEORGIAN SMALL LETTER GHAN (Khutsuri)
+2D17 GEORGIAN SMALL LETTER QAR (Khutsuri)
+2D18 GEORGIAN SMALL LETTER SHIN (Khutsuri)
+2D19 GEORGIAN SMALL LETTER CHIN (Khutsuri)
+2D1A GEORGIAN SMALL LETTER CAN (Khutsuri)
+2D1B GEORGIAN SMALL LETTER JIL (Khutsuri)
+2D1C GEORGIAN SMALL LETTER CIL (Khutsuri)
+2D1D GEORGIAN SMALL LETTER CHAR (Khutsuri)
+2D1E GEORGIAN SMALL LETTER XAN (Khutsuri)
+2D1F GEORGIAN SMALL LETTER JHAN (Khutsuri)
+2D20 GEORGIAN SMALL LETTER HAE (Khutsuri)
+2D21 GEORGIAN SMALL LETTER HE (Khutsuri)
+2D22 GEORGIAN SMALL LETTER HIE (Khutsuri)
+2D23 GEORGIAN SMALL LETTER WE (Khutsuri)
+2D24 GEORGIAN SMALL LETTER HAR (Khutsuri)
+2D25 GEORGIAN SMALL LETTER HOE (Khutsuri)
+@@ 2D30 Tifinagh 2D7F
+@ Letters
+2D30 TIFINAGH LETTER YA
+2D31 TIFINAGH LETTER YAB
+2D32 TIFINAGH LETTER YABH
+2D33 TIFINAGH LETTER YAG
+2D34 TIFINAGH LETTER YAGHH
+2D35 TIFINAGH LETTER BERBER ACADEMY YAJ
+2D36 TIFINAGH LETTER YAJ
+2D37 TIFINAGH LETTER YAD
+2D38 TIFINAGH LETTER YADH
+2D39 TIFINAGH LETTER YADD
+2D3A TIFINAGH LETTER YADDH
+2D3B TIFINAGH LETTER YEY
+2D3C TIFINAGH LETTER YAF
+2D3D TIFINAGH LETTER YAK
+2D3E TIFINAGH LETTER TUAREG YAK
+2D3F TIFINAGH LETTER YAKHH
+2D40 TIFINAGH LETTER YAH (Tuareg yab)
+ = Tuareg yab
+2D41 TIFINAGH LETTER BERBER ACADEMY YAH
+2D42 TIFINAGH LETTER TUAREG YAH
+2D43 TIFINAGH LETTER YAHH
+2D44 TIFINAGH LETTER YAA
+2D45 TIFINAGH LETTER YAKH
+2D46 TIFINAGH LETTER TUAREG YAKH
+2D47 TIFINAGH LETTER YAQ
+2D48 TIFINAGH LETTER TUAREG YAQ
+2D49 TIFINAGH LETTER YI
+2D4A TIFINAGH LETTER YAZH
+2D4B TIFINAGH LETTER AHAGGAR YAZH
+2D4C TIFINAGH LETTER TUAREG YAZH
+2D4D TIFINAGH LETTER YAL
+2D4E TIFINAGH LETTER YAM
+2D4F TIFINAGH LETTER YAN
+2D50 TIFINAGH LETTER TUAREG YAGN
+2D51 TIFINAGH LETTER TUAREG YANG
+2D52 TIFINAGH LETTER YAP
+2D53 TIFINAGH LETTER YU (Tuareg yaw)
+ = Tuareg yaw
+2D54 TIFINAGH LETTER YAR
+2D55 TIFINAGH LETTER YARR
+2D56 TIFINAGH LETTER YAGH
+2D57 TIFINAGH LETTER TUAREG YAGH
+2D58 TIFINAGH LETTER AYER YAGH (Adrar yaj)
+ = Adrar yaj
+2D59 TIFINAGH LETTER YAS
+2D5A TIFINAGH LETTER YASS
+2D5B TIFINAGH LETTER YASH
+2D5C TIFINAGH LETTER YAT
+2D5D TIFINAGH LETTER YATH
+2D5E TIFINAGH LETTER YACH
+2D5F TIFINAGH LETTER YATT
+2D60 TIFINAGH LETTER YAV
+2D61 TIFINAGH LETTER YAW
+2D62 TIFINAGH LETTER YAY
+2D63 TIFINAGH LETTER YAZ
+2D64 TIFINAGH LETTER TAWELLEMET YAZ (harpoon yaz)
+ = harpoon yaz
+2D65 TIFINAGH LETTER YAZZ
+@ Modifier letter
+2D6F TIFINAGH MODIFIER LETTER LABIALIZATION MARK (tamatart)
+ = tamatart
+ # <super> 2D61
+@@ 2D80 Ethiopic Extended 2DDF
+@ Syllables for Me'en
+2D80 ETHIOPIC SYLLABLE LOA
+2D81 ETHIOPIC SYLLABLE MOA
+2D82 ETHIOPIC SYLLABLE ROA
+2D83 ETHIOPIC SYLLABLE SOA
+2D84 ETHIOPIC SYLLABLE SHOA
+2D85 ETHIOPIC SYLLABLE BOA
+2D86 ETHIOPIC SYLLABLE TOA
+2D87 ETHIOPIC SYLLABLE COA
+2D88 ETHIOPIC SYLLABLE NOA
+2D89 ETHIOPIC SYLLABLE NYOA
+2D8A ETHIOPIC SYLLABLE GLOTTAL OA
+2D8B ETHIOPIC SYLLABLE ZOA
+2D8C ETHIOPIC SYLLABLE DOA
+2D8D ETHIOPIC SYLLABLE DDOA
+2D8E ETHIOPIC SYLLABLE JOA
+2D8F ETHIOPIC SYLLABLE THOA
+2D90 ETHIOPIC SYLLABLE CHOA
+2D91 ETHIOPIC SYLLABLE PHOA
+2D92 ETHIOPIC SYLLABLE POA
+@ Syllables for Blin
+2D93 ETHIOPIC SYLLABLE GGWA
+2D94 ETHIOPIC SYLLABLE GGWI
+2D95 ETHIOPIC SYLLABLE GGWEE
+2D96 ETHIOPIC SYLLABLE GGWE
+@ Syllables for Sebatbeit
+2DA0 ETHIOPIC SYLLABLE SSA
+2DA1 ETHIOPIC SYLLABLE SSU
+2DA2 ETHIOPIC SYLLABLE SSI
+2DA3 ETHIOPIC SYLLABLE SSAA
+2DA4 ETHIOPIC SYLLABLE SSEE
+2DA5 ETHIOPIC SYLLABLE SSE
+2DA6 ETHIOPIC SYLLABLE SSO
+2DA8 ETHIOPIC SYLLABLE CCA
+2DA9 ETHIOPIC SYLLABLE CCU
+2DAA ETHIOPIC SYLLABLE CCI
+2DAB ETHIOPIC SYLLABLE CCAA
+2DAC ETHIOPIC SYLLABLE CCEE
+2DAD ETHIOPIC SYLLABLE CCE
+2DAE ETHIOPIC SYLLABLE CCO
+2DB0 ETHIOPIC SYLLABLE ZZA
+2DB1 ETHIOPIC SYLLABLE ZZU
+2DB2 ETHIOPIC SYLLABLE ZZI
+2DB3 ETHIOPIC SYLLABLE ZZAA
+2DB4 ETHIOPIC SYLLABLE ZZEE
+2DB5 ETHIOPIC SYLLABLE ZZE
+2DB6 ETHIOPIC SYLLABLE ZZO
+2DB8 ETHIOPIC SYLLABLE CCHA
+2DB9 ETHIOPIC SYLLABLE CCHU
+2DBA ETHIOPIC SYLLABLE CCHI
+2DBB ETHIOPIC SYLLABLE CCHAA
+2DBC ETHIOPIC SYLLABLE CCHEE
+2DBD ETHIOPIC SYLLABLE CCHE
+2DBE ETHIOPIC SYLLABLE CCHO
+2DC0 ETHIOPIC SYLLABLE QYA
+2DC1 ETHIOPIC SYLLABLE QYU
+2DC2 ETHIOPIC SYLLABLE QYI
+2DC3 ETHIOPIC SYLLABLE QYAA
+2DC4 ETHIOPIC SYLLABLE QYEE
+2DC5 ETHIOPIC SYLLABLE QYE
+2DC6 ETHIOPIC SYLLABLE QYO
+2DC8 ETHIOPIC SYLLABLE KYA
+2DC9 ETHIOPIC SYLLABLE KYU
+2DCA ETHIOPIC SYLLABLE KYI
+2DCB ETHIOPIC SYLLABLE KYAA
+2DCC ETHIOPIC SYLLABLE KYEE
+2DCD ETHIOPIC SYLLABLE KYE
+2DCE ETHIOPIC SYLLABLE KYO
+2DD0 ETHIOPIC SYLLABLE XYA
+2DD1 ETHIOPIC SYLLABLE XYU
+2DD2 ETHIOPIC SYLLABLE XYI
+2DD3 ETHIOPIC SYLLABLE XYAA
+2DD4 ETHIOPIC SYLLABLE XYEE
+2DD5 ETHIOPIC SYLLABLE XYE
+2DD6 ETHIOPIC SYLLABLE XYO
+2DD8 ETHIOPIC SYLLABLE GYA
+2DD9 ETHIOPIC SYLLABLE GYU
+2DDA ETHIOPIC SYLLABLE GYI
+2DDB ETHIOPIC SYLLABLE GYAA
+2DDC ETHIOPIC SYLLABLE GYEE
+2DDD ETHIOPIC SYLLABLE GYE
+2DDE ETHIOPIC SYLLABLE GYO
+@@ 2DE0 Cyrillic Extended-A 2DFF
+@ Old Church Slavonic combining letters
+2DE0 COMBINING CYRILLIC LETTER BE
+2DE1 COMBINING CYRILLIC LETTER VE
+2DE2 COMBINING CYRILLIC LETTER GHE
+2DE3 COMBINING CYRILLIC LETTER DE
+2DE4 COMBINING CYRILLIC LETTER ZHE
+2DE5 COMBINING CYRILLIC LETTER ZE
+2DE6 COMBINING CYRILLIC LETTER KA
+2DE7 COMBINING CYRILLIC LETTER EL
+2DE8 COMBINING CYRILLIC LETTER EM
+ x (combining latin letter small capital m - 1DDF)
+2DE9 COMBINING CYRILLIC LETTER EN
+2DEA COMBINING CYRILLIC LETTER O
+ x (combining latin small letter o - 0366)
+2DEB COMBINING CYRILLIC LETTER PE
+2DEC COMBINING CYRILLIC LETTER ER
+2DED COMBINING CYRILLIC LETTER ES
+ x (combining latin small letter c - 0368)
+2DEE COMBINING CYRILLIC LETTER TE
+2DEF COMBINING CYRILLIC LETTER HA
+ x (combining latin small letter x - 036F)
+2DF0 COMBINING CYRILLIC LETTER TSE
+2DF1 COMBINING CYRILLIC LETTER CHE
+2DF2 COMBINING CYRILLIC LETTER SHA
+2DF3 COMBINING CYRILLIC LETTER SHCHA
+2DF4 COMBINING CYRILLIC LETTER FITA
+2DF5 COMBINING CYRILLIC LETTER ES-TE
+2DF6 COMBINING CYRILLIC LETTER A
+ x (combining latin small letter a - 0363)
+2DF7 COMBINING CYRILLIC LETTER IE
+ x (combining latin small letter e - 0364)
+2DF8 COMBINING CYRILLIC LETTER DJERV
+2DF9 COMBINING CYRILLIC LETTER MONOGRAPH UK
+2DFA COMBINING CYRILLIC LETTER YAT
+2DFB COMBINING CYRILLIC LETTER YU
+2DFC COMBINING CYRILLIC LETTER IOTIFIED A
+2DFD COMBINING CYRILLIC LETTER LITTLE YUS
+2DFE COMBINING CYRILLIC LETTER BIG YUS
+2DFF COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+@@ 2E00 Supplemental Punctuation 2E7F
+@ New Testament editorial symbols
+2E00 RIGHT ANGLE SUBSTITUTION MARKER
+ x (top left corner - 231C)
+2E01 RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02 LEFT SUBSTITUTION BRACKET
+2E03 RIGHT SUBSTITUTION BRACKET
+2E04 LEFT DOTTED SUBSTITUTION BRACKET
+2E05 RIGHT DOTTED SUBSTITUTION BRACKET
+2E06 RAISED INTERPOLATION MARKER
+ x (down tack - 22A4)
+2E07 RAISED DOTTED INTERPOLATION MARKER
+2E08 DOTTED TRANSPOSITION MARKER
+2E09 LEFT TRANSPOSITION BRACKET
+2E0A RIGHT TRANSPOSITION BRACKET
+2E0B RAISED SQUARE
+ * used as an opening raised omission bracket
+2E0C LEFT RAISED OMISSION BRACKET
+ * used as an opening or closing raised omission bracket
+2E0D RIGHT RAISED OMISSION BRACKET
+ * used as a closing or opening raised omission bracket
+@ Ancient Greek textual symbols
+2E0E EDITORIAL CORONIS
+ x (greek koronis - 1FBD)
+2E0F PARAGRAPHOS
+2E10 FORKED PARAGRAPHOS
+2E11 REVERSED FORKED PARAGRAPHOS
+2E12 HYPODIASTOLE
+2E13 DOTTED OBELOS
+ * glyph variants may look like '00F7' or '2238'
+ x (commercial minus sign - 2052)
+2E14 DOWNWARDS ANCORA
+ * contrary to its formal name this symbol points upwards
+2E15 UPWARDS ANCORA
+ * contrary to its formal name this symbol points downwards
+2E16 DOTTED RIGHT-POINTING ANGLE
+ = diple periestigmene
+@ Ancient Near-Eastern linguistic symbol
+2E17 DOUBLE OBLIQUE HYPHEN
+ * used in ancient Near-Eastern linguistics
+ * hyphen in Fraktur text uses 002D or 2010, but with a '2E17' glyph in Fraktur fonts
+ x (hyphen-minus - 002D)
+ x (equals sign - 003D)
+ x (hyphen - 2010)
+@ General punctuation
+2E18 INVERTED INTERROBANG
+ = gnaborretni
+ x (interrobang - 203D)
+2E19 PALM BRANCH
+ * used as a separator
+@ Dictionary punctuation
+@+ These punctuation marks are used mostly in German dictionaries, to indicate umlaut or case changes with abbreviated stems.
+2E1A HYPHEN WITH DIAERESIS
+ * indicates umlaut of the stem vowel of a plural form
+2E1B TILDE WITH RING ABOVE
+ * indicates change in case for derived form
+@ Brackets
+2E1C LEFT LOW PARAPHRASE BRACKET
+2E1D RIGHT LOW PARAPHRASE BRACKET
+ * used in N'Ko
+@ Dictionary punctuation
+2E1E TILDE WITH DOT ABOVE
+ * indicates derived form changes to uppercase
+2E1F TILDE WITH DOT BELOW
+ * indicates derived form changes to lowercase
+@ Brackets
+2E20 LEFT VERTICAL BAR WITH QUILL
+2E21 RIGHT VERTICAL BAR WITH QUILL
+@ Half brackets
+@+ These form a set of four corner brackets and are used editorially. They are distinguished from mathematical floor and ceiling characters. Occasionally quine corners are substituted for half brackets.
+2E22 TOP LEFT HALF BRACKET
+ x (left ceiling - 2308)
+ x (top left corner - 231C)
+ x (left corner bracket - 300C)
+2E23 TOP RIGHT HALF BRACKET
+2E24 BOTTOM LEFT HALF BRACKET
+2E25 BOTTOM RIGHT HALF BRACKET
+@ Brackets
+2E26 LEFT SIDEWAYS U BRACKET
+ x (subset of - 2282)
+2E27 RIGHT SIDEWAYS U BRACKET
+ x (superset of - 2283)
+2E28 LEFT DOUBLE PARENTHESIS
+ x (left white parenthesis - 2985)
+ x (fullwidth left white parenthesis - FF5F)
+2E29 RIGHT DOUBLE PARENTHESIS
+@ Medievalist punctuation
+2E2A TWO DOTS OVER ONE DOT PUNCTUATION
+2E2B ONE DOT OVER TWO DOTS PUNCTUATION
+2E2C SQUARED FOUR DOT PUNCTUATION
+2E2D FIVE DOT MARK
+2E2E REVERSED QUESTION MARK
+ = punctus percontativus
+ x (question mark - 003F)
+ x (inverted question mark - 00BF)
+ x (arabic question mark - 061F)
+2E2F VERTICAL TILDE
+ * used for Cyrillic yerik
+ x (combining vertical tilde - 033E)
+ x (cyrillic payerok - A67F)
+2E30 RING POINT
+ * used in Avestan
+ x (ring operator - 2218)
+ x (white bullet - 25E6)
+@@ 2E80 CJK Radicals Supplement 2EFF
+@ CJK radicals supplement
+2E80 CJK RADICAL REPEAT
+2E81 CJK RADICAL CLIFF
+ x 5382
+2E82 CJK RADICAL SECOND ONE
+ x 4E5B
+2E83 CJK RADICAL SECOND TWO
+ x 4E5A
+2E84 CJK RADICAL SECOND THREE
+ x 4E59
+2E85 CJK RADICAL PERSON
+ * form used on left side
+ x 4EBB
+2E86 CJK RADICAL BOX
+ x 5182
+2E87 CJK RADICAL TABLE
+ x 51E0
+2E88 CJK RADICAL KNIFE ONE
+ * form used at top
+ x 5200
+2E89 CJK RADICAL KNIFE TWO
+ * form used on right side
+ x 5202
+2E8A CJK RADICAL DIVINATION
+ * form used at top
+ x 535C
+2E8B CJK RADICAL SEAL
+ * form used at bottom
+ x 353E
+2E8C CJK RADICAL SMALL ONE
+ * form used at top
+ x 5C0F
+2E8D CJK RADICAL SMALL TWO
+ * form used at top
+ x 5C0F
+2E8E CJK RADICAL LAME ONE
+ x 5C22
+2E8F CJK RADICAL LAME TWO
+ x 5C23
+2E90 CJK RADICAL LAME THREE
+ x 5C22
+2E91 CJK RADICAL LAME FOUR
+ x 5C23
+2E92 CJK RADICAL SNAKE
+ x 5DF3
+2E93 CJK RADICAL THREAD
+ x 5E7A
+2E94 CJK RADICAL SNOUT ONE
+ x 5F51
+2E95 CJK RADICAL SNOUT TWO
+ x 5F50
+2E96 CJK RADICAL HEART ONE
+ * form used on left side
+ x 5FC4
+2E97 CJK RADICAL HEART TWO
+ * form used at bottom
+ x 5FC3
+2E98 CJK RADICAL HAND
+ * form used on left side
+ x 624C
+2E99 CJK RADICAL RAP
+ * form used on right side
+ x 6535
+2E9B CJK RADICAL CHOKE
+ x 65E1
+2E9C CJK RADICAL SUN
+ x 65E5
+2E9D CJK RADICAL MOON
+ x 6708
+2E9E CJK RADICAL DEATH
+ x 6B7A
+2E9F CJK RADICAL MOTHER
+ # 6BCD
+2EA0 CJK RADICAL CIVILIAN
+ x 6C11
+2EA1 CJK RADICAL WATER ONE
+ * form used on left side
+ x 6C35
+2EA2 CJK RADICAL WATER TWO
+ * form used (rarely) at bottom
+ x 6C3A
+2EA3 CJK RADICAL FIRE
+ * form used at bottom
+ x 706C
+2EA4 CJK RADICAL PAW ONE
+ * form used at top
+ x 722B
+2EA5 CJK RADICAL PAW TWO
+ * form used at top
+ x 722B
+2EA6 CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+ x 4E2C
+2EA7 CJK RADICAL COW
+ x 725B
+2EA8 CJK RADICAL DOG
+ * form used on left side
+ x 72AD
+2EA9 CJK RADICAL JADE
+ * form used on left side
+ x 738B
+2EAA CJK RADICAL BOLT OF CLOTH
+ * form used on left side
+ x 758B
+2EAB CJK RADICAL EYE
+ * form used at top
+ x (cjk radical net two - 2EB2)
+ x 76EE
+2EAC CJK RADICAL SPIRIT ONE
+ x 793A
+2EAD CJK RADICAL SPIRIT TWO
+ x 793B
+2EAE CJK RADICAL BAMBOO
+ x 7AF9
+2EAF CJK RADICAL SILK
+ * form used on left side
+ x 7CF9
+2EB0 CJK RADICAL C-SIMPLIFIED SILK
+ * form used on left side
+ x 7E9F
+2EB1 CJK RADICAL NET ONE
+ x 7F53
+2EB2 CJK RADICAL NET TWO
+ x (cjk radical eye - 2EAB)
+ x 7F52
+2EB3 CJK RADICAL NET THREE
+ x 7F51
+2EB4 CJK RADICAL NET FOUR
+ x 7F51
+2EB5 CJK RADICAL MESH
+ x 2626B
+2EB6 CJK RADICAL SHEEP
+ * form used on left side
+ x 7F8A
+2EB7 CJK RADICAL RAM
+ * form used at top
+ x 7F8A
+2EB8 CJK RADICAL EWE
+ x 7F8B
+2EB9 CJK RADICAL OLD
+ x 8002
+2EBA CJK RADICAL BRUSH ONE
+ x 8080
+2EBB CJK RADICAL BRUSH TWO
+ x 807F
+2EBC CJK RADICAL MEAT
+ x 8089
+2EBD CJK RADICAL MORTAR
+ x 81FC
+2EBE CJK RADICAL GRASS ONE
+ x 8279
+2EBF CJK RADICAL GRASS TWO
+ x 8279
+2EC0 CJK RADICAL GRASS THREE
+ x 8279
+2EC1 CJK RADICAL TIGER
+ x 864E
+2EC2 CJK RADICAL CLOTHES
+ * form used on left side
+ x 8864
+2EC3 CJK RADICAL WEST ONE
+ * form used at top
+ x 8980
+2EC4 CJK RADICAL WEST TWO
+ * form used on left side
+ x 897F
+2EC5 CJK RADICAL C-SIMPLIFIED SEE
+ x 89C1
+2EC6 CJK RADICAL SIMPLIFIED HORN
+ x 89D2
+2EC7 CJK RADICAL HORN
+ x 278B2
+2EC8 CJK RADICAL C-SIMPLIFIED SPEECH
+ x 8BA0
+2EC9 CJK RADICAL C-SIMPLIFIED SHELL
+ x 8D1D
+2ECA CJK RADICAL FOOT
+ * form used on left side
+ x 8DB3
+2ECB CJK RADICAL C-SIMPLIFIED CART
+ x 8F66
+2ECC CJK RADICAL SIMPLIFIED WALK
+ x 8FB6
+2ECD CJK RADICAL WALK ONE
+ x 8FB6
+2ECE CJK RADICAL WALK TWO
+ x 8FB6
+2ECF CJK RADICAL CITY
+ * form used on right side
+ x 9091
+2ED0 CJK RADICAL C-SIMPLIFIED GOLD
+ x 9485
+2ED1 CJK RADICAL LONG ONE
+ x 9577
+2ED2 CJK RADICAL LONG TWO
+ * form used on left side
+ x 9578
+2ED3 CJK RADICAL C-SIMPLIFIED LONG
+ x 957F
+2ED4 CJK RADICAL C-SIMPLIFIED GATE
+ x 95E8
+2ED5 CJK RADICAL MOUND ONE
+ x 961C
+ x 28E0F
+2ED6 CJK RADICAL MOUND TWO
+ * form used on left side
+ x 961D
+2ED7 CJK RADICAL RAIN
+ x 96E8
+2ED8 CJK RADICAL BLUE
+ x 9752
+2ED9 CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+ x 97E6
+2EDA CJK RADICAL C-SIMPLIFIED LEAF
+ x 9875
+2EDB CJK RADICAL C-SIMPLIFIED WIND
+ x 98CE
+2EDC CJK RADICAL C-SIMPLIFIED FLY
+ x 98DE
+2EDD CJK RADICAL EAT ONE
+ * form used at bottom
+ x 98DF
+2EDE CJK RADICAL EAT TWO
+ * form used on left side
+ x 2967F
+2EDF CJK RADICAL EAT THREE
+ * form used on left side
+ x 98E0
+2EE0 CJK RADICAL C-SIMPLIFIED EAT
+ * form used on left side
+ x 9963
+2EE1 CJK RADICAL HEAD
+ x 29810
+2EE2 CJK RADICAL C-SIMPLIFIED HORSE
+ x 9A6C
+2EE3 CJK RADICAL BONE
+ x 9AA8
+2EE4 CJK RADICAL GHOST
+ x 9B3C
+2EE5 CJK RADICAL C-SIMPLIFIED FISH
+ x 9C7C
+2EE6 CJK RADICAL C-SIMPLIFIED BIRD
+ x 9E1F
+2EE7 CJK RADICAL C-SIMPLIFIED SALT
+ x 9E75
+2EE8 CJK RADICAL SIMPLIFIED WHEAT
+ x 9EA6
+2EE9 CJK RADICAL SIMPLIFIED YELLOW
+ x 9EC4
+2EEA CJK RADICAL C-SIMPLIFIED FROG
+ x 9EFE
+2EEB CJK RADICAL J-SIMPLIFIED EVEN
+ x 6589
+2EEC CJK RADICAL C-SIMPLIFIED EVEN
+ x 9F50
+2EED CJK RADICAL J-SIMPLIFIED TOOTH
+ x 6B6F
+2EEE CJK RADICAL C-SIMPLIFIED TOOTH
+ x 9F7F
+2EEF CJK RADICAL J-SIMPLIFIED DRAGON
+ x 9F8D
+2EF0 CJK RADICAL C-SIMPLIFIED DRAGON
+ x 9F99
+2EF1 CJK RADICAL TURTLE
+ x 9F9C
+2EF2 CJK RADICAL J-SIMPLIFIED TURTLE
+ x 4E80
+2EF3 CJK RADICAL C-SIMPLIFIED TURTLE
+ # 9F9F
+@@ 2F00 Kangxi Radicals 2FDF
+@ Kangxi radicals
+2F00 KANGXI RADICAL ONE
+ # 4E00
+2F01 KANGXI RADICAL LINE
+ # 4E28
+2F02 KANGXI RADICAL DOT
+ # 4E36
+2F03 KANGXI RADICAL SLASH
+ # 4E3F
+2F04 KANGXI RADICAL SECOND
+ # 4E59
+2F05 KANGXI RADICAL HOOK
+ # 4E85
+2F06 KANGXI RADICAL TWO
+ # 4E8C
+2F07 KANGXI RADICAL LID
+ # 4EA0
+2F08 KANGXI RADICAL MAN
+ # 4EBA
+2F09 KANGXI RADICAL LEGS
+ # 513F
+2F0A KANGXI RADICAL ENTER
+ # 5165
+2F0B KANGXI RADICAL EIGHT
+ # 516B
+2F0C KANGXI RADICAL DOWN BOX
+ # 5182
+2F0D KANGXI RADICAL COVER
+ # 5196
+2F0E KANGXI RADICAL ICE
+ # 51AB
+2F0F KANGXI RADICAL TABLE
+ # 51E0
+2F10 KANGXI RADICAL OPEN BOX
+ # 51F5
+2F11 KANGXI RADICAL KNIFE
+ # 5200
+2F12 KANGXI RADICAL POWER
+ # 529B
+2F13 KANGXI RADICAL WRAP
+ # 52F9
+2F14 KANGXI RADICAL SPOON
+ # 5315
+2F15 KANGXI RADICAL RIGHT OPEN BOX
+ # 531A
+2F16 KANGXI RADICAL HIDING ENCLOSURE
+ # 5338
+2F17 KANGXI RADICAL TEN
+ # 5341
+2F18 KANGXI RADICAL DIVINATION
+ # 535C
+2F19 KANGXI RADICAL SEAL
+ # 5369
+2F1A KANGXI RADICAL CLIFF
+ # 5382
+2F1B KANGXI RADICAL PRIVATE
+ # 53B6
+2F1C KANGXI RADICAL AGAIN
+ # 53C8
+2F1D KANGXI RADICAL MOUTH
+ # 53E3
+2F1E KANGXI RADICAL ENCLOSURE
+ # 56D7
+2F1F KANGXI RADICAL EARTH
+ # 571F
+2F20 KANGXI RADICAL SCHOLAR
+ # 58EB
+2F21 KANGXI RADICAL GO
+ # 5902
+2F22 KANGXI RADICAL GO SLOWLY
+ # 590A
+2F23 KANGXI RADICAL EVENING
+ # 5915
+2F24 KANGXI RADICAL BIG
+ # 5927
+2F25 KANGXI RADICAL WOMAN
+ # 5973
+2F26 KANGXI RADICAL CHILD
+ # 5B50
+2F27 KANGXI RADICAL ROOF
+ # 5B80
+2F28 KANGXI RADICAL INCH
+ # 5BF8
+2F29 KANGXI RADICAL SMALL
+ # 5C0F
+2F2A KANGXI RADICAL LAME
+ # 5C22
+2F2B KANGXI RADICAL CORPSE
+ # 5C38
+2F2C KANGXI RADICAL SPROUT
+ # 5C6E
+2F2D KANGXI RADICAL MOUNTAIN
+ # 5C71
+2F2E KANGXI RADICAL RIVER
+ # 5DDB
+2F2F KANGXI RADICAL WORK
+ # 5DE5
+2F30 KANGXI RADICAL ONESELF
+ # 5DF1
+2F31 KANGXI RADICAL TURBAN
+ # 5DFE
+2F32 KANGXI RADICAL DRY
+ # 5E72
+2F33 KANGXI RADICAL SHORT THREAD
+ # 5E7A
+2F34 KANGXI RADICAL DOTTED CLIFF
+ # 5E7F
+2F35 KANGXI RADICAL LONG STRIDE
+ # 5EF4
+2F36 KANGXI RADICAL TWO HANDS
+ # 5EFE
+2F37 KANGXI RADICAL SHOOT
+ # 5F0B
+2F38 KANGXI RADICAL BOW
+ # 5F13
+2F39 KANGXI RADICAL SNOUT
+ # 5F50
+2F3A KANGXI RADICAL BRISTLE
+ # 5F61
+2F3B KANGXI RADICAL STEP
+ # 5F73
+2F3C KANGXI RADICAL HEART
+ # 5FC3
+2F3D KANGXI RADICAL HALBERD
+ # 6208
+2F3E KANGXI RADICAL DOOR
+ # 6236
+2F3F KANGXI RADICAL HAND
+ # 624B
+2F40 KANGXI RADICAL BRANCH
+ # 652F
+2F41 KANGXI RADICAL RAP
+ # 6534
+2F42 KANGXI RADICAL SCRIPT
+ # 6587
+2F43 KANGXI RADICAL DIPPER
+ # 6597
+2F44 KANGXI RADICAL AXE
+ # 65A4
+2F45 KANGXI RADICAL SQUARE
+ # 65B9
+2F46 KANGXI RADICAL NOT
+ # 65E0
+2F47 KANGXI RADICAL SUN
+ # 65E5
+2F48 KANGXI RADICAL SAY
+ # 66F0
+2F49 KANGXI RADICAL MOON
+ # 6708
+2F4A KANGXI RADICAL TREE
+ # 6728
+2F4B KANGXI RADICAL LACK
+ # 6B20
+2F4C KANGXI RADICAL STOP
+ # 6B62
+2F4D KANGXI RADICAL DEATH
+ # 6B79
+2F4E KANGXI RADICAL WEAPON
+ # 6BB3
+2F4F KANGXI RADICAL DO NOT
+ # 6BCB
+2F50 KANGXI RADICAL COMPARE
+ # 6BD4
+2F51 KANGXI RADICAL FUR
+ # 6BDB
+2F52 KANGXI RADICAL CLAN
+ # 6C0F
+2F53 KANGXI RADICAL STEAM
+ # 6C14
+2F54 KANGXI RADICAL WATER
+ # 6C34
+2F55 KANGXI RADICAL FIRE
+ # 706B
+2F56 KANGXI RADICAL CLAW
+ # 722A
+2F57 KANGXI RADICAL FATHER
+ # 7236
+2F58 KANGXI RADICAL DOUBLE X
+ # 723B
+2F59 KANGXI RADICAL HALF TREE TRUNK
+ # 723F
+2F5A KANGXI RADICAL SLICE
+ # 7247
+2F5B KANGXI RADICAL FANG
+ # 7259
+2F5C KANGXI RADICAL COW
+ # 725B
+2F5D KANGXI RADICAL DOG
+ # 72AC
+2F5E KANGXI RADICAL PROFOUND
+ # 7384
+2F5F KANGXI RADICAL JADE
+ # 7389
+2F60 KANGXI RADICAL MELON
+ # 74DC
+2F61 KANGXI RADICAL TILE
+ # 74E6
+2F62 KANGXI RADICAL SWEET
+ # 7518
+2F63 KANGXI RADICAL LIFE
+ # 751F
+2F64 KANGXI RADICAL USE
+ # 7528
+2F65 KANGXI RADICAL FIELD
+ # 7530
+2F66 KANGXI RADICAL BOLT OF CLOTH
+ # 758B
+2F67 KANGXI RADICAL SICKNESS
+ # 7592
+2F68 KANGXI RADICAL DOTTED TENT
+ # 7676
+2F69 KANGXI RADICAL WHITE
+ # 767D
+2F6A KANGXI RADICAL SKIN
+ # 76AE
+2F6B KANGXI RADICAL DISH
+ # 76BF
+2F6C KANGXI RADICAL EYE
+ # 76EE
+2F6D KANGXI RADICAL SPEAR
+ # 77DB
+2F6E KANGXI RADICAL ARROW
+ # 77E2
+2F6F KANGXI RADICAL STONE
+ # 77F3
+2F70 KANGXI RADICAL SPIRIT
+ # 793A
+2F71 KANGXI RADICAL TRACK
+ # 79B8
+2F72 KANGXI RADICAL GRAIN
+ # 79BE
+2F73 KANGXI RADICAL CAVE
+ # 7A74
+2F74 KANGXI RADICAL STAND
+ # 7ACB
+2F75 KANGXI RADICAL BAMBOO
+ # 7AF9
+2F76 KANGXI RADICAL RICE
+ # 7C73
+2F77 KANGXI RADICAL SILK
+ # 7CF8
+2F78 KANGXI RADICAL JAR
+ # 7F36
+2F79 KANGXI RADICAL NET
+ # 7F51
+2F7A KANGXI RADICAL SHEEP
+ # 7F8A
+2F7B KANGXI RADICAL FEATHER
+ # 7FBD
+2F7C KANGXI RADICAL OLD
+ # 8001
+2F7D KANGXI RADICAL AND
+ # 800C
+2F7E KANGXI RADICAL PLOW
+ # 8012
+2F7F KANGXI RADICAL EAR
+ # 8033
+2F80 KANGXI RADICAL BRUSH
+ # 807F
+2F81 KANGXI RADICAL MEAT
+ # 8089
+2F82 KANGXI RADICAL MINISTER
+ # 81E3
+2F83 KANGXI RADICAL SELF
+ # 81EA
+2F84 KANGXI RADICAL ARRIVE
+ # 81F3
+2F85 KANGXI RADICAL MORTAR
+ # 81FC
+2F86 KANGXI RADICAL TONGUE
+ # 820C
+2F87 KANGXI RADICAL OPPOSE
+ # 821B
+2F88 KANGXI RADICAL BOAT
+ # 821F
+2F89 KANGXI RADICAL STOPPING
+ # 826E
+2F8A KANGXI RADICAL COLOR
+ # 8272
+2F8B KANGXI RADICAL GRASS
+ # 8278
+2F8C KANGXI RADICAL TIGER
+ # 864D
+2F8D KANGXI RADICAL INSECT
+ # 866B
+2F8E KANGXI RADICAL BLOOD
+ # 8840
+2F8F KANGXI RADICAL WALK ENCLOSURE
+ # 884C
+2F90 KANGXI RADICAL CLOTHES
+ # 8863
+2F91 KANGXI RADICAL WEST
+ # 897E
+2F92 KANGXI RADICAL SEE
+ # 898B
+2F93 KANGXI RADICAL HORN
+ # 89D2
+2F94 KANGXI RADICAL SPEECH
+ # 8A00
+2F95 KANGXI RADICAL VALLEY
+ # 8C37
+2F96 KANGXI RADICAL BEAN
+ # 8C46
+2F97 KANGXI RADICAL PIG
+ # 8C55
+2F98 KANGXI RADICAL BADGER
+ # 8C78
+2F99 KANGXI RADICAL SHELL
+ # 8C9D
+2F9A KANGXI RADICAL RED
+ # 8D64
+2F9B KANGXI RADICAL RUN
+ # 8D70
+2F9C KANGXI RADICAL FOOT
+ # 8DB3
+2F9D KANGXI RADICAL BODY
+ # 8EAB
+2F9E KANGXI RADICAL CART
+ # 8ECA
+2F9F KANGXI RADICAL BITTER
+ # 8F9B
+2FA0 KANGXI RADICAL MORNING
+ # 8FB0
+2FA1 KANGXI RADICAL WALK
+ # 8FB5
+2FA2 KANGXI RADICAL CITY
+ # 9091
+2FA3 KANGXI RADICAL WINE
+ # 9149
+2FA4 KANGXI RADICAL DISTINGUISH
+ # 91C6
+2FA5 KANGXI RADICAL VILLAGE
+ # 91CC
+2FA6 KANGXI RADICAL GOLD
+ # 91D1
+2FA7 KANGXI RADICAL LONG
+ # 9577
+2FA8 KANGXI RADICAL GATE
+ # 9580
+2FA9 KANGXI RADICAL MOUND
+ # 961C
+2FAA KANGXI RADICAL SLAVE
+ # 96B6
+2FAB KANGXI RADICAL SHORT TAILED BIRD
+ # 96B9
+2FAC KANGXI RADICAL RAIN
+ # 96E8
+2FAD KANGXI RADICAL BLUE
+ # 9751
+2FAE KANGXI RADICAL WRONG
+ # 975E
+2FAF KANGXI RADICAL FACE
+ # 9762
+2FB0 KANGXI RADICAL LEATHER
+ # 9769
+2FB1 KANGXI RADICAL TANNED LEATHER
+ # 97CB
+2FB2 KANGXI RADICAL LEEK
+ # 97ED
+2FB3 KANGXI RADICAL SOUND
+ # 97F3
+2FB4 KANGXI RADICAL LEAF
+ # 9801
+2FB5 KANGXI RADICAL WIND
+ # 98A8
+2FB6 KANGXI RADICAL FLY
+ # 98DB
+2FB7 KANGXI RADICAL EAT
+ # 98DF
+2FB8 KANGXI RADICAL HEAD
+ # 9996
+2FB9 KANGXI RADICAL FRAGRANT
+ # 9999
+2FBA KANGXI RADICAL HORSE
+ # 99AC
+2FBB KANGXI RADICAL BONE
+ # 9AA8
+2FBC KANGXI RADICAL TALL
+ # 9AD8
+2FBD KANGXI RADICAL HAIR
+ # 9ADF
+2FBE KANGXI RADICAL FIGHT
+ # 9B25
+2FBF KANGXI RADICAL SACRIFICIAL WINE
+ # 9B2F
+2FC0 KANGXI RADICAL CAULDRON
+ # 9B32
+2FC1 KANGXI RADICAL GHOST
+ # 9B3C
+2FC2 KANGXI RADICAL FISH
+ # 9B5A
+2FC3 KANGXI RADICAL BIRD
+ # 9CE5
+2FC4 KANGXI RADICAL SALT
+ # 9E75
+2FC5 KANGXI RADICAL DEER
+ # 9E7F
+2FC6 KANGXI RADICAL WHEAT
+ # 9EA5
+2FC7 KANGXI RADICAL HEMP
+ # 9EBB
+2FC8 KANGXI RADICAL YELLOW
+ # 9EC3
+2FC9 KANGXI RADICAL MILLET
+ # 9ECD
+2FCA KANGXI RADICAL BLACK
+ # 9ED1
+2FCB KANGXI RADICAL EMBROIDERY
+ # 9EF9
+2FCC KANGXI RADICAL FROG
+ # 9EFD
+2FCD KANGXI RADICAL TRIPOD
+ # 9F0E
+2FCE KANGXI RADICAL DRUM
+ # 9F13
+2FCF KANGXI RADICAL RAT
+ # 9F20
+2FD0 KANGXI RADICAL NOSE
+ # 9F3B
+2FD1 KANGXI RADICAL EVEN
+ # 9F4A
+2FD2 KANGXI RADICAL TOOTH
+ # 9F52
+2FD3 KANGXI RADICAL DRAGON
+ # 9F8D
+2FD4 KANGXI RADICAL TURTLE
+ # 9F9C
+2FD5 KANGXI RADICAL FLUTE
+ # 9FA0
+@@ 2FF0 Ideographic Description Characters 2FFF
+@ Ideographic description characters
+@+ These are visibly displayed graphic characters, not invisible composition controls.
+2FF0 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4 IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+@@ 3000 CJK Symbols and Punctuation 303F
+@@+
+@ CJK symbols and punctuation
+3000 IDEOGRAPHIC SPACE
+ x (space - 0020)
+ # <wide> 0020
+3001 IDEOGRAPHIC COMMA
+ x (comma - 002C)
+3002 IDEOGRAPHIC FULL STOP
+ x (full stop - 002E)
+3003 DITTO MARK
+ x (double prime - 2033)
+3004 JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005 IDEOGRAPHIC ITERATION MARK
+3006 IDEOGRAPHIC CLOSING MARK
+3007 IDEOGRAPHIC NUMBER ZERO
+ x (combining enclosing circle - 20DD)
+ x (white circle - 25CB)
+ x (large circle - 25EF)
+@ CJK angle brackets
+3008 LEFT ANGLE BRACKET
+ x (less-than sign - 003C)
+ x (single left-pointing angle quotation mark - 2039)
+ x (left-pointing angle bracket - 2329)
+ x (mathematical left angle bracket - 27E8)
+3009 RIGHT ANGLE BRACKET
+ x (greater-than sign - 003E)
+ x (single right-pointing angle quotation mark - 203A)
+ x (right-pointing angle bracket - 232A)
+ x (mathematical right angle bracket - 27E9)
+300A LEFT DOUBLE ANGLE BRACKET
+ x (left-pointing double angle quotation mark - 00AB)
+ x (mathematical left double angle bracket - 27EA)
+300B RIGHT DOUBLE ANGLE BRACKET
+ x (right-pointing double angle quotation mark - 00BB)
+ x (mathematical right double angle bracket - 27EB)
+@ CJK corner brackets
+@+ The CJK corner brackets, which function as quotation marks, are not recommended for general-purpose corner brackets. See the ceiling and floor characters, instead.
+300C LEFT CORNER BRACKET
+ x (left ceiling - 2308)
+300D RIGHT CORNER BRACKET
+ * used as quotation marks
+ x (right floor - 230B)
+300E LEFT WHITE CORNER BRACKET
+300F RIGHT WHITE CORNER BRACKET
+ * used as quotation marks
+@ CJK brackets
+3010 LEFT BLACK LENTICULAR BRACKET
+3011 RIGHT BLACK LENTICULAR BRACKET
+@ CJK symbols
+3012 POSTAL MARK
+3013 GETA MARK
+ * substitute for ideograph not in font
+ * editorial convention to represent ideographic lacuna
+ x (white square - 25A1)
+@ CJK brackets
+3014 LEFT TORTOISE SHELL BRACKET
+3015 RIGHT TORTOISE SHELL BRACKET
+3016 LEFT WHITE LENTICULAR BRACKET
+3017 RIGHT WHITE LENTICULAR BRACKET
+3018 LEFT WHITE TORTOISE SHELL BRACKET
+ x (mathematical left white tortoise shell bracket - 27EC)
+3019 RIGHT WHITE TORTOISE SHELL BRACKET
+ x (mathematical right white tortoise shell bracket - 27ED)
+301A LEFT WHITE SQUARE BRACKET
+ = left abstract syntax bracket
+ x (mathematical left white square bracket - 27E6)
+301B RIGHT WHITE SQUARE BRACKET
+ = right abstract syntax bracket
+ x (mathematical right white square bracket - 27E7)
+@ CJK symbols and punctuation
+301C WAVE DASH
+@+ * This character was encoded to match JIS C 6226-1978 1-33 "wave dash". The JIS standards and some industry practice disagree in mapping.
+ x (wavy dash - 3030)
+ x (fullwidth tilde - FF5E)
+301D REVERSED DOUBLE PRIME QUOTATION MARK
+ * sometimes depicted as double prime quotation mark
+ x (left double quotation mark - 201C)
+ x (reversed double prime - 2036)
+301E DOUBLE PRIME QUOTATION MARK
+ * this is a mistaken analogue to 201D; 301F is preferred
+ x (right double quotation mark - 201D)
+ x (double prime - 2033)
+301F LOW DOUBLE PRIME QUOTATION MARK
+ * may be depicted as low inverse double prime quotation mark
+3020 POSTAL MARK FACE
+@ Suzhou numerals
+@+ The Suzhou numerals (Chinese su1zhou1ma3zi) are special numeric forms used by traders to display the prices of goods. The use of "HANGZHOU" in the names is a misnomer.
+3021 HANGZHOU NUMERAL ONE
+3022 HANGZHOU NUMERAL TWO
+3023 HANGZHOU NUMERAL THREE
+3024 HANGZHOU NUMERAL FOUR
+3025 HANGZHOU NUMERAL FIVE
+3026 HANGZHOU NUMERAL SIX
+3027 HANGZHOU NUMERAL SEVEN
+3028 HANGZHOU NUMERAL EIGHT
+3029 HANGZHOU NUMERAL NINE
+@ Diacritics
+302A IDEOGRAPHIC LEVEL TONE MARK
+302B IDEOGRAPHIC RISING TONE MARK
+302C IDEOGRAPHIC DEPARTING TONE MARK
+302D IDEOGRAPHIC ENTERING TONE MARK
+302E HANGUL SINGLE DOT TONE MARK
+ = single dot Bangjeom
+302F HANGUL DOUBLE DOT TONE MARK
+ = double dot Bangjeom
+@ Other CJK symbols
+3030 WAVY DASH
+ x (wavy line - 2307)
+ x (wave dash - 301C)
+3031 VERTICAL KANA REPEAT MARK
+3032 VERTICAL KANA REPEAT WITH VOICED SOUND MARK
+ * the preceding two semantic characters are preferred to the following three glyphic forms
+3033 VERTICAL KANA REPEAT MARK UPPER HALF
+3034 VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF
+ * the preceding two are glyphs used in conjunction with the following glyph
+3035 VERTICAL KANA REPEAT MARK LOWER HALF
+3036 CIRCLED POSTAL MARK
+ # 3012 postal mark
+3037 IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+@ Additional Suzhou numerals
+3038 HANGZHOU NUMERAL TEN
+ # 5341
+3039 HANGZHOU NUMERAL TWENTY
+ # 5344
+303A HANGZHOU NUMERAL THIRTY
+ # 5345
+@ Other CJK punctuation
+303B VERTICAL IDEOGRAPHIC ITERATION MARK
+303C MASU MARK
+ * informal abbreviation for Japanese -masu ending
+ x (squared rising diagonal slash - 29C4)
+303D PART ALTERNATION MARK
+ * marks the start of a song part in Japanese
+@ Special CJK indicators
+@+ These are visibly displayed graphic characters, not invisible format control characters.
+303E IDEOGRAPHIC VARIATION INDICATOR
+ * visual indicator that the following ideograph is to be taken as a variant of the intended character
+303F IDEOGRAPHIC HALF FILL SPACE
+ * visual indicator of a screen space for half of an ideograph
+@@ 3040 Hiragana 309F
+@ Based on JIS X 0208
+3041 HIRAGANA LETTER SMALL A
+3042 HIRAGANA LETTER A
+3043 HIRAGANA LETTER SMALL I
+3044 HIRAGANA LETTER I
+3045 HIRAGANA LETTER SMALL U
+3046 HIRAGANA LETTER U
+3047 HIRAGANA LETTER SMALL E
+3048 HIRAGANA LETTER E
+3049 HIRAGANA LETTER SMALL O
+304A HIRAGANA LETTER O
+304B HIRAGANA LETTER KA
+304C HIRAGANA LETTER GA
+ : 304B 3099
+304D HIRAGANA LETTER KI
+304E HIRAGANA LETTER GI
+ : 304D 3099
+304F HIRAGANA LETTER KU
+3050 HIRAGANA LETTER GU
+ : 304F 3099
+3051 HIRAGANA LETTER KE
+3052 HIRAGANA LETTER GE
+ : 3051 3099
+3053 HIRAGANA LETTER KO
+3054 HIRAGANA LETTER GO
+ : 3053 3099
+3055 HIRAGANA LETTER SA
+3056 HIRAGANA LETTER ZA
+ : 3055 3099
+3057 HIRAGANA LETTER SI
+ = SHI
+3058 HIRAGANA LETTER ZI
+ = JI (not unique)
+ : 3057 3099
+3059 HIRAGANA LETTER SU
+305A HIRAGANA LETTER ZU
+ : 3059 3099
+305B HIRAGANA LETTER SE
+305C HIRAGANA LETTER ZE
+ : 305B 3099
+305D HIRAGANA LETTER SO
+305E HIRAGANA LETTER ZO
+ : 305D 3099
+305F HIRAGANA LETTER TA
+3060 HIRAGANA LETTER DA
+ : 305F 3099
+3061 HIRAGANA LETTER TI
+ = CHI
+3062 HIRAGANA LETTER DI
+ = JI (not unique)
+ : 3061 3099
+3063 HIRAGANA LETTER SMALL TU
+ = SMALL TSU
+3064 HIRAGANA LETTER TU
+ = TSU
+3065 HIRAGANA LETTER DU
+ = ZU (not unique)
+ : 3064 3099
+3066 HIRAGANA LETTER TE
+3067 HIRAGANA LETTER DE
+ : 3066 3099
+3068 HIRAGANA LETTER TO
+3069 HIRAGANA LETTER DO
+ : 3068 3099
+306A HIRAGANA LETTER NA
+306B HIRAGANA LETTER NI
+306C HIRAGANA LETTER NU
+306D HIRAGANA LETTER NE
+306E HIRAGANA LETTER NO
+306F HIRAGANA LETTER HA
+3070 HIRAGANA LETTER BA
+ : 306F 3099
+3071 HIRAGANA LETTER PA
+ : 306F 309A
+3072 HIRAGANA LETTER HI
+3073 HIRAGANA LETTER BI
+ : 3072 3099
+3074 HIRAGANA LETTER PI
+ : 3072 309A
+3075 HIRAGANA LETTER HU
+ = FU
+3076 HIRAGANA LETTER BU
+ : 3075 3099
+3077 HIRAGANA LETTER PU
+ : 3075 309A
+3078 HIRAGANA LETTER HE
+3079 HIRAGANA LETTER BE
+ : 3078 3099
+307A HIRAGANA LETTER PE
+ : 3078 309A
+307B HIRAGANA LETTER HO
+307C HIRAGANA LETTER BO
+ : 307B 3099
+307D HIRAGANA LETTER PO
+ : 307B 309A
+307E HIRAGANA LETTER MA
+307F HIRAGANA LETTER MI
+3080 HIRAGANA LETTER MU
+3081 HIRAGANA LETTER ME
+3082 HIRAGANA LETTER MO
+3083 HIRAGANA LETTER SMALL YA
+3084 HIRAGANA LETTER YA
+3085 HIRAGANA LETTER SMALL YU
+3086 HIRAGANA LETTER YU
+3087 HIRAGANA LETTER SMALL YO
+3088 HIRAGANA LETTER YO
+3089 HIRAGANA LETTER RA
+308A HIRAGANA LETTER RI
+308B HIRAGANA LETTER RU
+308C HIRAGANA LETTER RE
+308D HIRAGANA LETTER RO
+308E HIRAGANA LETTER SMALL WA
+308F HIRAGANA LETTER WA
+3090 HIRAGANA LETTER WI
+3091 HIRAGANA LETTER WE
+3092 HIRAGANA LETTER WO
+3093 HIRAGANA LETTER N
+3094 HIRAGANA LETTER VU
+ : 3046 3099
+@ Small letters
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+@ Voicing marks
+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B KATAKANA-HIRAGANA VOICED SOUND MARK
+ # 0020 3099
+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ # 0020 309A
+@ Iteration marks
+309D HIRAGANA ITERATION MARK
+309E HIRAGANA VOICED ITERATION MARK
+ : 309D 3099
+@ Vertical form digraph
+309F HIRAGANA DIGRAPH YORI
+ # <vertical> 3088 308A
+@@ 30A0 Katakana 30FF
+@ Katakana punctuation
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN
+ x (equals sign - 003D)
+@ Based on JIS X 0208
+30A1 KATAKANA LETTER SMALL A
+30A2 KATAKANA LETTER A
+30A3 KATAKANA LETTER SMALL I
+30A4 KATAKANA LETTER I
+30A5 KATAKANA LETTER SMALL U
+30A6 KATAKANA LETTER U
+30A7 KATAKANA LETTER SMALL E
+30A8 KATAKANA LETTER E
+30A9 KATAKANA LETTER SMALL O
+30AA KATAKANA LETTER O
+30AB KATAKANA LETTER KA
+30AC KATAKANA LETTER GA
+ : 30AB 3099
+30AD KATAKANA LETTER KI
+30AE KATAKANA LETTER GI
+ : 30AD 3099
+30AF KATAKANA LETTER KU
+30B0 KATAKANA LETTER GU
+ : 30AF 3099
+30B1 KATAKANA LETTER KE
+30B2 KATAKANA LETTER GE
+ : 30B1 3099
+30B3 KATAKANA LETTER KO
+30B4 KATAKANA LETTER GO
+ : 30B3 3099
+30B5 KATAKANA LETTER SA
+30B6 KATAKANA LETTER ZA
+ : 30B5 3099
+30B7 KATAKANA LETTER SI
+ = SHI
+30B8 KATAKANA LETTER ZI
+ = JI (not unique)
+ : 30B7 3099
+30B9 KATAKANA LETTER SU
+30BA KATAKANA LETTER ZU
+ : 30B9 3099
+30BB KATAKANA LETTER SE
+30BC KATAKANA LETTER ZE
+ : 30BB 3099
+30BD KATAKANA LETTER SO
+30BE KATAKANA LETTER ZO
+ : 30BD 3099
+30BF KATAKANA LETTER TA
+30C0 KATAKANA LETTER DA
+ : 30BF 3099
+30C1 KATAKANA LETTER TI
+ = CHI
+30C2 KATAKANA LETTER DI
+ = JI (not unique)
+ : 30C1 3099
+30C3 KATAKANA LETTER SMALL TU
+ = SMALL TSU
+30C4 KATAKANA LETTER TU
+ = TSU
+30C5 KATAKANA LETTER DU
+ = ZU (not unique)
+ : 30C4 3099
+30C6 KATAKANA LETTER TE
+30C7 KATAKANA LETTER DE
+ : 30C6 3099
+30C8 KATAKANA LETTER TO
+30C9 KATAKANA LETTER DO
+ : 30C8 3099
+30CA KATAKANA LETTER NA
+30CB KATAKANA LETTER NI
+30CC KATAKANA LETTER NU
+30CD KATAKANA LETTER NE
+30CE KATAKANA LETTER NO
+30CF KATAKANA LETTER HA
+30D0 KATAKANA LETTER BA
+ : 30CF 3099
+30D1 KATAKANA LETTER PA
+ : 30CF 309A
+30D2 KATAKANA LETTER HI
+30D3 KATAKANA LETTER BI
+ : 30D2 3099
+30D4 KATAKANA LETTER PI
+ : 30D2 309A
+30D5 KATAKANA LETTER HU
+ = FU
+30D6 KATAKANA LETTER BU
+ : 30D5 3099
+30D7 KATAKANA LETTER PU
+ : 30D5 309A
+30D8 KATAKANA LETTER HE
+30D9 KATAKANA LETTER BE
+ : 30D8 3099
+30DA KATAKANA LETTER PE
+ : 30D8 309A
+30DB KATAKANA LETTER HO
+30DC KATAKANA LETTER BO
+ : 30DB 3099
+30DD KATAKANA LETTER PO
+ : 30DB 309A
+30DE KATAKANA LETTER MA
+30DF KATAKANA LETTER MI
+30E0 KATAKANA LETTER MU
+30E1 KATAKANA LETTER ME
+30E2 KATAKANA LETTER MO
+30E3 KATAKANA LETTER SMALL YA
+30E4 KATAKANA LETTER YA
+30E5 KATAKANA LETTER SMALL YU
+30E6 KATAKANA LETTER YU
+30E7 KATAKANA LETTER SMALL YO
+30E8 KATAKANA LETTER YO
+30E9 KATAKANA LETTER RA
+30EA KATAKANA LETTER RI
+30EB KATAKANA LETTER RU
+30EC KATAKANA LETTER RE
+30ED KATAKANA LETTER RO
+30EE KATAKANA LETTER SMALL WA
+30EF KATAKANA LETTER WA
+30F0 KATAKANA LETTER WI
+30F1 KATAKANA LETTER WE
+30F2 KATAKANA LETTER WO
+30F3 KATAKANA LETTER N
+30F4 KATAKANA LETTER VU
+ : 30A6 3099
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30F7 KATAKANA LETTER VA
+ : 30EF 3099
+30F8 KATAKANA LETTER VI
+ : 30F0 3099
+30F9 KATAKANA LETTER VE
+ : 30F1 3099
+30FA KATAKANA LETTER VO
+ : 30F2 3099
+@ Conjunction and length marks
+30FB KATAKANA MIDDLE DOT
+ x (middle dot - 00B7)
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ x (em dash - 2014)
+@ Iteration marks
+30FD KATAKANA ITERATION MARK
+30FE KATAKANA VOICED ITERATION MARK
+ : 30FD 3099
+@ Vertical form digraph
+30FF KATAKANA DIGRAPH KOTO
+ # <vertical> 30B3 30C8
+@@ 3100 Bopomofo 312F
+@+ See also the Bopomofo Extended block
+@ Based on GB 2312
+3105 BOPOMOFO LETTER B
+3106 BOPOMOFO LETTER P
+3107 BOPOMOFO LETTER M
+3108 BOPOMOFO LETTER F
+3109 BOPOMOFO LETTER D
+310A BOPOMOFO LETTER T
+310B BOPOMOFO LETTER N
+310C BOPOMOFO LETTER L
+310D BOPOMOFO LETTER G
+310E BOPOMOFO LETTER K
+310F BOPOMOFO LETTER H
+3110 BOPOMOFO LETTER J
+3111 BOPOMOFO LETTER Q
+3112 BOPOMOFO LETTER X
+3113 BOPOMOFO LETTER ZH
+3114 BOPOMOFO LETTER CH
+3115 BOPOMOFO LETTER SH
+3116 BOPOMOFO LETTER R
+3117 BOPOMOFO LETTER Z
+3118 BOPOMOFO LETTER C
+3119 BOPOMOFO LETTER S
+311A BOPOMOFO LETTER A
+311B BOPOMOFO LETTER O
+311C BOPOMOFO LETTER E
+311D BOPOMOFO LETTER EH
+311E BOPOMOFO LETTER AI
+311F BOPOMOFO LETTER EI
+3120 BOPOMOFO LETTER AU
+3121 BOPOMOFO LETTER OU
+3122 BOPOMOFO LETTER AN
+3123 BOPOMOFO LETTER EN
+3124 BOPOMOFO LETTER ANG
+3125 BOPOMOFO LETTER ENG
+3126 BOPOMOFO LETTER ER
+3127 BOPOMOFO LETTER I
+ * the horizontal stroke form is considered a rendering variant
+3128 BOPOMOFO LETTER U
+3129 BOPOMOFO LETTER IU
+@ Dialect (non-Mandarin) letters
+312A BOPOMOFO LETTER V
+312B BOPOMOFO LETTER NG
+312C BOPOMOFO LETTER GN
+@ Miscellaneous addition
+312D BOPOMOFO LETTER IH
+ * for analytic representation of apical vowel
+@@ 3130 Hangul Compatibility Jamo 318F
+@ Modern letters
+3131 HANGUL LETTER KIYEOK
+ # 1100 hangul choseong kiyeok
+3132 HANGUL LETTER SSANGKIYEOK
+ # 1101 hangul choseong ssangkiyeok
+3133 HANGUL LETTER KIYEOK-SIOS
+ # 11AA hangul jongseong kiyeok-sios
+3134 HANGUL LETTER NIEUN
+ # 1102 hangul choseong nieun
+3135 HANGUL LETTER NIEUN-CIEUC
+ # 11AC hangul jongseong nieun-cieuc
+3136 HANGUL LETTER NIEUN-HIEUH
+ # 11AD hangul jongseong nieun-hieuh
+3137 HANGUL LETTER TIKEUT
+ # 1103 hangul choseong tikeut
+3138 HANGUL LETTER SSANGTIKEUT
+ # 1104 hangul choseong ssangtikeut
+3139 HANGUL LETTER RIEUL
+ # 1105 hangul choseong rieul
+313A HANGUL LETTER RIEUL-KIYEOK
+ # 11B0 hangul jongseong rieul-kiyeok
+313B HANGUL LETTER RIEUL-MIEUM
+ # 11B1 hangul jongseong rieul-mieum
+313C HANGUL LETTER RIEUL-PIEUP
+ # 11B2 hangul jongseong rieul-pieup
+313D HANGUL LETTER RIEUL-SIOS
+ # 11B3 hangul jongseong rieul-sios
+313E HANGUL LETTER RIEUL-THIEUTH
+ # 11B4 hangul jongseong rieul-thieuth
+313F HANGUL LETTER RIEUL-PHIEUPH
+ # 11B5 hangul jongseong rieul-phieuph
+3140 HANGUL LETTER RIEUL-HIEUH
+ # 111A hangul choseong rieul-hieuh
+3141 HANGUL LETTER MIEUM
+ # 1106 hangul choseong mieum
+3142 HANGUL LETTER PIEUP
+ # 1107 hangul choseong pieup
+3143 HANGUL LETTER SSANGPIEUP
+ # 1108 hangul choseong ssangpieup
+3144 HANGUL LETTER PIEUP-SIOS
+ # 1121 hangul choseong pieup-sios
+3145 HANGUL LETTER SIOS
+ # 1109 hangul choseong sios
+3146 HANGUL LETTER SSANGSIOS
+ # 110A hangul choseong ssangsios
+3147 HANGUL LETTER IEUNG
+ # 110B hangul choseong ieung
+3148 HANGUL LETTER CIEUC
+ # 110C hangul choseong cieuc
+3149 HANGUL LETTER SSANGCIEUC
+ # 110D hangul choseong ssangcieuc
+314A HANGUL LETTER CHIEUCH
+ # 110E hangul choseong chieuch
+314B HANGUL LETTER KHIEUKH
+ # 110F hangul choseong khieukh
+314C HANGUL LETTER THIEUTH
+ # 1110 hangul choseong thieuth
+314D HANGUL LETTER PHIEUPH
+ # 1111 hangul choseong phieuph
+314E HANGUL LETTER HIEUH
+ # 1112 hangul choseong hieuh
+314F HANGUL LETTER A
+ # 1161 hangul jungseong a
+3150 HANGUL LETTER AE
+ # 1162 hangul jungseong ae
+3151 HANGUL LETTER YA
+ # 1163 hangul jungseong ya
+3152 HANGUL LETTER YAE
+ # 1164 hangul jungseong yae
+3153 HANGUL LETTER EO
+ # 1165 hangul jungseong eo
+3154 HANGUL LETTER E
+ # 1166 hangul jungseong e
+3155 HANGUL LETTER YEO
+ # 1167 hangul jungseong yeo
+3156 HANGUL LETTER YE
+ # 1168 hangul jungseong ye
+3157 HANGUL LETTER O
+ # 1169 hangul jungseong o
+3158 HANGUL LETTER WA
+ # 116A hangul jungseong wa
+3159 HANGUL LETTER WAE
+ # 116B hangul jungseong wae
+315A HANGUL LETTER OE
+ # 116C hangul jungseong oe
+315B HANGUL LETTER YO
+ # 116D hangul jungseong yo
+315C HANGUL LETTER U
+ # 116E hangul jungseong u
+315D HANGUL LETTER WEO
+ # 116F hangul jungseong weo
+315E HANGUL LETTER WE
+ # 1170 hangul jungseong we
+315F HANGUL LETTER WI
+ # 1171 hangul jungseong wi
+3160 HANGUL LETTER YU
+ # 1172 hangul jungseong yu
+3161 HANGUL LETTER EU
+ # 1173 hangul jungseong eu
+3162 HANGUL LETTER YI
+ # 1174 hangul jungseong yi
+3163 HANGUL LETTER I
+ # 1175 hangul jungseong i
+@ Special character
+3164 HANGUL FILLER
+ = cae om
+ # 1160 hangul jungseong filler
+@ Archaic letters
+3165 HANGUL LETTER SSANGNIEUN
+ # 1114 hangul choseong ssangnieun
+3166 HANGUL LETTER NIEUN-TIKEUT
+ # 1115 hangul choseong nieun-tikeut
+3167 HANGUL LETTER NIEUN-SIOS
+ # 11C7 hangul jongseong nieun-sios
+3168 HANGUL LETTER NIEUN-PANSIOS
+ # 11C8 hangul jongseong nieun-pansios
+3169 HANGUL LETTER RIEUL-KIYEOK-SIOS
+ # 11CC hangul jongseong rieul-kiyeok-sios
+316A HANGUL LETTER RIEUL-TIKEUT
+ # 11CE hangul jongseong rieul-tikeut
+316B HANGUL LETTER RIEUL-PIEUP-SIOS
+ # 11D3 hangul jongseong rieul-pieup-sios
+316C HANGUL LETTER RIEUL-PANSIOS
+ # 11D7 hangul jongseong rieul-pansios
+316D HANGUL LETTER RIEUL-YEORINHIEUH
+ # 11D9 hangul jongseong rieul-yeorinhieuh
+316E HANGUL LETTER MIEUM-PIEUP
+ # 111C hangul choseong mieum-pieup
+316F HANGUL LETTER MIEUM-SIOS
+ # 11DD hangul jongseong mieum-sios
+3170 HANGUL LETTER MIEUM-PANSIOS
+ # 11DF hangul jongseong mieum-pansios
+3171 HANGUL LETTER KAPYEOUNMIEUM
+ # 111D hangul choseong kapyeounmieum
+3172 HANGUL LETTER PIEUP-KIYEOK
+ # 111E hangul choseong pieup-kiyeok
+3173 HANGUL LETTER PIEUP-TIKEUT
+ # 1120 hangul choseong pieup-tikeut
+3174 HANGUL LETTER PIEUP-SIOS-KIYEOK
+ # 1122 hangul choseong pieup-sios-kiyeok
+3175 HANGUL LETTER PIEUP-SIOS-TIKEUT
+ # 1123 hangul choseong pieup-sios-tikeut
+3176 HANGUL LETTER PIEUP-CIEUC
+ # 1127 hangul choseong pieup-cieuc
+3177 HANGUL LETTER PIEUP-THIEUTH
+ # 1129 hangul choseong pieup-thieuth
+3178 HANGUL LETTER KAPYEOUNPIEUP
+ # 112B hangul choseong kapyeounpieup
+3179 HANGUL LETTER KAPYEOUNSSANGPIEUP
+ # 112C hangul choseong kapyeounssangpieup
+317A HANGUL LETTER SIOS-KIYEOK
+ # 112D hangul choseong sios-kiyeok
+317B HANGUL LETTER SIOS-NIEUN
+ # 112E hangul choseong sios-nieun
+317C HANGUL LETTER SIOS-TIKEUT
+ # 112F hangul choseong sios-tikeut
+317D HANGUL LETTER SIOS-PIEUP
+ # 1132 hangul choseong sios-pieup
+317E HANGUL LETTER SIOS-CIEUC
+ # 1136 hangul choseong sios-cieuc
+317F HANGUL LETTER PANSIOS
+ # 1140 hangul choseong pansios
+3180 HANGUL LETTER SSANGIEUNG
+ = ssangyesieung
+ # 1147 hangul choseong ssangieung
+3181 HANGUL LETTER YESIEUNG
+ * archaic velar nasal
+ # 114C hangul choseong yesieung
+3182 HANGUL LETTER YESIEUNG-SIOS
+ # 11F1 hangul jongseong yesieung-sios
+3183 HANGUL LETTER YESIEUNG-PANSIOS
+ # 11F2 hangul jongseong yesieung-pansios
+3184 HANGUL LETTER KAPYEOUNPHIEUPH
+ # 1157 hangul choseong kapyeounphieuph
+3185 HANGUL LETTER SSANGHIEUH
+ # 1158 hangul choseong ssanghieuh
+3186 HANGUL LETTER YEORINHIEUH
+ * archaic glottal stop
+ # 1159 hangul choseong yeorinhieuh
+3187 HANGUL LETTER YO-YA
+ # 1184 hangul jungseong yo-ya
+3188 HANGUL LETTER YO-YAE
+ # 1185 hangul jungseong yo-yae
+3189 HANGUL LETTER YO-I
+ # 1188 hangul jungseong yo-i
+318A HANGUL LETTER YU-YEO
+ # 1191 hangul jungseong yu-yeo
+318B HANGUL LETTER YU-YE
+ # 1192 hangul jungseong yu-ye
+318C HANGUL LETTER YU-I
+ # 1194 hangul jungseong yu-i
+318D HANGUL LETTER ARAEA
+ # 119E hangul jungseong araea
+318E HANGUL LETTER ARAEAE
+ # 11A1 hangul jungseong araea-i
+@@ 3190 Kanbun 319F
+@ Kanbun
+3190 IDEOGRAPHIC ANNOTATION LINKING MARK (Kanbun Tateten)
+ = tateten
+3191 IDEOGRAPHIC ANNOTATION REVERSE MARK (Kaeriten)
+ = kaeriten re
+3192 IDEOGRAPHIC ANNOTATION ONE MARK (Kaeriten)
+ # <super> 4E00
+3193 IDEOGRAPHIC ANNOTATION TWO MARK (Kaeriten)
+ # <super> 4E8C
+3194 IDEOGRAPHIC ANNOTATION THREE MARK (Kaeriten)
+ # <super> 4E09
+3195 IDEOGRAPHIC ANNOTATION FOUR MARK (Kaeriten)
+ # <super> 56DB
+3196 IDEOGRAPHIC ANNOTATION TOP MARK (Kaeriten)
+ # <super> 4E0A
+3197 IDEOGRAPHIC ANNOTATION MIDDLE MARK (Kaeriten)
+ # <super> 4E2D
+3198 IDEOGRAPHIC ANNOTATION BOTTOM MARK (Kaeriten)
+ # <super> 4E0B
+3199 IDEOGRAPHIC ANNOTATION FIRST MARK (Kaeriten)
+ # <super> 7532
+319A IDEOGRAPHIC ANNOTATION SECOND MARK (Kaeriten)
+ # <super> 4E59
+319B IDEOGRAPHIC ANNOTATION THIRD MARK (Kaeriten)
+ # <super> 4E19
+319C IDEOGRAPHIC ANNOTATION FOURTH MARK (Kaeriten)
+ # <super> 4E01
+319D IDEOGRAPHIC ANNOTATION HEAVEN MARK (Kaeriten)
+ # <super> 5929
+319E IDEOGRAPHIC ANNOTATION EARTH MARK (Kaeriten)
+ # <super> 5730
+319F IDEOGRAPHIC ANNOTATION MAN MARK (Kaeriten)
+ # <super> 4EBA
+@@ 31A0 Bopomofo Extended 31BF
+@+ See also the Bopomofo block
+@ Extended Bopomofo for Minnan and Hakka
+31A0 BOPOMOFO LETTER BU
+31A1 BOPOMOFO LETTER ZI
+31A2 BOPOMOFO LETTER JI
+31A3 BOPOMOFO LETTER GU
+31A4 BOPOMOFO LETTER EE
+31A5 BOPOMOFO LETTER ENN
+31A6 BOPOMOFO LETTER OO
+31A7 BOPOMOFO LETTER ONN
+31A8 BOPOMOFO LETTER IR
+31A9 BOPOMOFO LETTER ANN
+31AA BOPOMOFO LETTER INN
+31AB BOPOMOFO LETTER UNN
+31AC BOPOMOFO LETTER IM
+31AD BOPOMOFO LETTER NGG
+31AE BOPOMOFO LETTER AINN
+31AF BOPOMOFO LETTER AUNN
+31B0 BOPOMOFO LETTER AM
+31B1 BOPOMOFO LETTER OM
+31B2 BOPOMOFO LETTER ONG
+31B3 BOPOMOFO LETTER INNN
+31B4 BOPOMOFO FINAL LETTER P
+31B5 BOPOMOFO FINAL LETTER T
+31B6 BOPOMOFO FINAL LETTER K
+31B7 BOPOMOFO FINAL LETTER H
+@@ 31C0 CJK Strokes 31EF
+@ CJK strokes
+31C0 CJK STROKE T
+31C1 CJK STROKE WG
+31C2 CJK STROKE XG
+31C3 CJK STROKE BXG
+31C4 CJK STROKE SW
+31C5 CJK STROKE HZZ
+31C6 CJK STROKE HZG
+31C7 CJK STROKE HP
+31C8 CJK STROKE HZWG
+31C9 CJK STROKE SZWG
+31CA CJK STROKE HZT
+31CB CJK STROKE HZZP
+31CC CJK STROKE HPWG
+31CD CJK STROKE HZW
+31CE CJK STROKE HZZZ
+31CF CJK STROKE N
+31D0 CJK STROKE H
+31D1 CJK STROKE S
+31D2 CJK STROKE P
+31D3 CJK STROKE SP
+31D4 CJK STROKE D
+31D5 CJK STROKE HZ
+31D6 CJK STROKE HG
+31D7 CJK STROKE SZ
+31D8 CJK STROKE SWZ
+31D9 CJK STROKE ST
+31DA CJK STROKE SG
+31DB CJK STROKE PD
+31DC CJK STROKE PZ
+31DD CJK STROKE TN
+31DE CJK STROKE SZZ
+31DF CJK STROKE SWG
+31E0 CJK STROKE HXWG
+31E1 CJK STROKE HZZZG
+31E2 CJK STROKE PG
+31E3 CJK STROKE Q
+@@ 31F0 Katakana Phonetic Extensions 31FF
+@ Phonetic extensions for Ainu
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+@@ 3200 Enclosed CJK Letters and Months 32FF
+@ Parenthesized Hangul elements
+3200 PARENTHESIZED HANGUL KIYEOK
+ # 0028 1100 0029
+3201 PARENTHESIZED HANGUL NIEUN
+ # 0028 1102 0029
+3202 PARENTHESIZED HANGUL TIKEUT
+ # 0028 1103 0029
+3203 PARENTHESIZED HANGUL RIEUL
+ # 0028 1105 0029
+3204 PARENTHESIZED HANGUL MIEUM
+ # 0028 1106 0029
+3205 PARENTHESIZED HANGUL PIEUP
+ # 0028 1107 0029
+3206 PARENTHESIZED HANGUL SIOS
+ # 0028 1109 0029
+3207 PARENTHESIZED HANGUL IEUNG
+ # 0028 110B 0029
+3208 PARENTHESIZED HANGUL CIEUC
+ # 0028 110C 0029
+3209 PARENTHESIZED HANGUL CHIEUCH
+ # 0028 110E 0029
+320A PARENTHESIZED HANGUL KHIEUKH
+ # 0028 110F 0029
+320B PARENTHESIZED HANGUL THIEUTH
+ # 0028 1110 0029
+320C PARENTHESIZED HANGUL PHIEUPH
+ # 0028 1111 0029
+320D PARENTHESIZED HANGUL HIEUH
+ # 0028 1112 0029
+@ Parenthesized Hangul syllables
+320E PARENTHESIZED HANGUL KIYEOK A
+ # 0028 1100 1161 0029
+320F PARENTHESIZED HANGUL NIEUN A
+ # 0028 1102 1161 0029
+3210 PARENTHESIZED HANGUL TIKEUT A
+ # 0028 1103 1161 0029
+3211 PARENTHESIZED HANGUL RIEUL A
+ # 0028 1105 1161 0029
+3212 PARENTHESIZED HANGUL MIEUM A
+ # 0028 1106 1161 0029
+3213 PARENTHESIZED HANGUL PIEUP A
+ # 0028 1107 1161 0029
+3214 PARENTHESIZED HANGUL SIOS A
+ # 0028 1109 1161 0029
+3215 PARENTHESIZED HANGUL IEUNG A
+ # 0028 110B 1161 0029
+3216 PARENTHESIZED HANGUL CIEUC A
+ # 0028 110C 1161 0029
+3217 PARENTHESIZED HANGUL CHIEUCH A
+ # 0028 110E 1161 0029
+3218 PARENTHESIZED HANGUL KHIEUKH A
+ # 0028 110F 1161 0029
+3219 PARENTHESIZED HANGUL THIEUTH A
+ # 0028 1110 1161 0029
+321A PARENTHESIZED HANGUL PHIEUPH A
+ # 0028 1111 1161 0029
+321B PARENTHESIZED HANGUL HIEUH A
+ # 0028 1112 1161 0029
+321C PARENTHESIZED HANGUL CIEUC U
+ # 0028 110C 116E 0029
+@ Parenthesized Korean words
+321D PARENTHESIZED KOREAN CHARACTER OJEON
+ # 0028 110B 1169 110C 1165 11AB 0029
+321E PARENTHESIZED KOREAN CHARACTER O HU
+ # 0028 110B 1169 1112 116E 0029
+@ Parenthesized ideographs
+3220 PARENTHESIZED IDEOGRAPH ONE
+ # 0028 4E00 0029
+3221 PARENTHESIZED IDEOGRAPH TWO
+ # 0028 4E8C 0029
+3222 PARENTHESIZED IDEOGRAPH THREE
+ # 0028 4E09 0029
+3223 PARENTHESIZED IDEOGRAPH FOUR
+ # 0028 56DB 0029
+3224 PARENTHESIZED IDEOGRAPH FIVE
+ # 0028 4E94 0029
+3225 PARENTHESIZED IDEOGRAPH SIX
+ # 0028 516D 0029
+3226 PARENTHESIZED IDEOGRAPH SEVEN
+ # 0028 4E03 0029
+3227 PARENTHESIZED IDEOGRAPH EIGHT
+ # 0028 516B 0029
+3228 PARENTHESIZED IDEOGRAPH NINE
+ # 0028 4E5D 0029
+3229 PARENTHESIZED IDEOGRAPH TEN
+ # 0028 5341 0029
+322A PARENTHESIZED IDEOGRAPH MOON
+ * Monday
+ # 0028 6708 0029
+322B PARENTHESIZED IDEOGRAPH FIRE
+ * Tuesday
+ # 0028 706B 0029
+322C PARENTHESIZED IDEOGRAPH WATER
+ * Wednesday
+ # 0028 6C34 0029
+322D PARENTHESIZED IDEOGRAPH WOOD
+ * Thursday
+ # 0028 6728 0029
+322E PARENTHESIZED IDEOGRAPH METAL
+ * Friday
+ # 0028 91D1 0029
+322F PARENTHESIZED IDEOGRAPH EARTH
+ * Saturday
+ # 0028 571F 0029
+3230 PARENTHESIZED IDEOGRAPH SUN
+ * Sunday
+ # 0028 65E5 0029
+3231 PARENTHESIZED IDEOGRAPH STOCK
+ * incorporated
+ # 0028 682A 0029
+3232 PARENTHESIZED IDEOGRAPH HAVE
+ * limited
+ # 0028 6709 0029
+3233 PARENTHESIZED IDEOGRAPH SOCIETY
+ * company
+ # 0028 793E 0029
+3234 PARENTHESIZED IDEOGRAPH NAME
+ # 0028 540D 0029
+3235 PARENTHESIZED IDEOGRAPH SPECIAL
+ # 0028 7279 0029
+3236 PARENTHESIZED IDEOGRAPH FINANCIAL
+ # 0028 8CA1 0029
+3237 PARENTHESIZED IDEOGRAPH CONGRATULATION
+ # 0028 795D 0029
+3238 PARENTHESIZED IDEOGRAPH LABOR
+ # 0028 52B4 0029
+3239 PARENTHESIZED IDEOGRAPH REPRESENT
+ # 0028 4EE3 0029
+323A PARENTHESIZED IDEOGRAPH CALL
+ # 0028 547C 0029
+323B PARENTHESIZED IDEOGRAPH STUDY
+ # 0028 5B66 0029
+323C PARENTHESIZED IDEOGRAPH SUPERVISE
+ # 0028 76E3 0029
+323D PARENTHESIZED IDEOGRAPH ENTERPRISE
+ # 0028 4F01 0029
+323E PARENTHESIZED IDEOGRAPH RESOURCE
+ # 0028 8CC7 0029
+323F PARENTHESIZED IDEOGRAPH ALLIANCE
+ # 0028 5354 0029
+3240 PARENTHESIZED IDEOGRAPH FESTIVAL
+ # 0028 796D 0029
+3241 PARENTHESIZED IDEOGRAPH REST
+ # 0028 4F11 0029
+3242 PARENTHESIZED IDEOGRAPH SELF
+ * from
+ # 0028 81EA 0029
+3243 PARENTHESIZED IDEOGRAPH REACH
+ * to
+ # 0028 81F3 0029
+@ Squared Latin abbreviation
+3250 PARTNERSHIP SIGN
+ # <square> 0050 0054 0045
+@ Circled numbers
+3251 CIRCLED NUMBER TWENTY ONE
+ # <circle> 0032 0031
+3252 CIRCLED NUMBER TWENTY TWO
+ # <circle> 0032 0032
+3253 CIRCLED NUMBER TWENTY THREE
+ # <circle> 0032 0033
+3254 CIRCLED NUMBER TWENTY FOUR
+ # <circle> 0032 0034
+3255 CIRCLED NUMBER TWENTY FIVE
+ # <circle> 0032 0035
+3256 CIRCLED NUMBER TWENTY SIX
+ # <circle> 0032 0036
+3257 CIRCLED NUMBER TWENTY SEVEN
+ # <circle> 0032 0037
+3258 CIRCLED NUMBER TWENTY EIGHT
+ # <circle> 0032 0038
+3259 CIRCLED NUMBER TWENTY NINE
+ # <circle> 0032 0039
+325A CIRCLED NUMBER THIRTY
+ # <circle> 0033 0030
+325B CIRCLED NUMBER THIRTY ONE
+ # <circle> 0033 0031
+325C CIRCLED NUMBER THIRTY TWO
+ # <circle> 0033 0032
+325D CIRCLED NUMBER THIRTY THREE
+ # <circle> 0033 0033
+325E CIRCLED NUMBER THIRTY FOUR
+ # <circle> 0033 0034
+325F CIRCLED NUMBER THIRTY FIVE
+ # <circle> 0033 0035
+@ Circled Hangul elements
+3260 CIRCLED HANGUL KIYEOK
+ # <circle> 1100
+3261 CIRCLED HANGUL NIEUN
+ # <circle> 1102
+3262 CIRCLED HANGUL TIKEUT
+ # <circle> 1103
+3263 CIRCLED HANGUL RIEUL
+ # <circle> 1105
+3264 CIRCLED HANGUL MIEUM
+ # <circle> 1106
+3265 CIRCLED HANGUL PIEUP
+ # <circle> 1107
+3266 CIRCLED HANGUL SIOS
+ # <circle> 1109
+3267 CIRCLED HANGUL IEUNG
+ # <circle> 110B
+3268 CIRCLED HANGUL CIEUC
+ # <circle> 110C
+3269 CIRCLED HANGUL CHIEUCH
+ # <circle> 110E
+326A CIRCLED HANGUL KHIEUKH
+ # <circle> 110F
+326B CIRCLED HANGUL THIEUTH
+ # <circle> 1110
+326C CIRCLED HANGUL PHIEUPH
+ # <circle> 1111
+326D CIRCLED HANGUL HIEUH
+ # <circle> 1112
+@ Circled Hangul syllables
+326E CIRCLED HANGUL KIYEOK A
+ # <circle> 1100 1161
+326F CIRCLED HANGUL NIEUN A
+ # <circle> 1102 1161
+3270 CIRCLED HANGUL TIKEUT A
+ # <circle> 1103 1161
+3271 CIRCLED HANGUL RIEUL A
+ # <circle> 1105 1161
+3272 CIRCLED HANGUL MIEUM A
+ # <circle> 1106 1161
+3273 CIRCLED HANGUL PIEUP A
+ # <circle> 1107 1161
+3274 CIRCLED HANGUL SIOS A
+ # <circle> 1109 1161
+3275 CIRCLED HANGUL IEUNG A
+ # <circle> 110B 1161
+3276 CIRCLED HANGUL CIEUC A
+ # <circle> 110C 1161
+3277 CIRCLED HANGUL CHIEUCH A
+ # <circle> 110E 1161
+3278 CIRCLED HANGUL KHIEUKH A
+ # <circle> 110F 1161
+3279 CIRCLED HANGUL THIEUTH A
+ # <circle> 1110 1161
+327A CIRCLED HANGUL PHIEUPH A
+ # <circle> 1111 1161
+327B CIRCLED HANGUL HIEUH A
+ # <circle> 1112 1161
+@ Circled Korean words
+327C CIRCLED KOREAN CHARACTER CHAMKO
+ # <circle> 110E 1161 11B7 1100 1169
+327D CIRCLED KOREAN CHARACTER JUEUI
+ # <circle> 110C 116E 110B 1174
+@ Circled Hangul syllable
+327E CIRCLED HANGUL IEUNG U
+ * postal code mark
+ # <circle> 110B 116E
+@ Symbol
+327F KOREAN STANDARD SYMBOL
+@ Circled ideographs
+3280 CIRCLED IDEOGRAPH ONE
+ = maru-iti, symbol of unification
+ # <circle> 4E00
+3281 CIRCLED IDEOGRAPH TWO
+ # <circle> 4E8C
+3282 CIRCLED IDEOGRAPH THREE
+ # <circle> 4E09
+3283 CIRCLED IDEOGRAPH FOUR
+ # <circle> 56DB
+3284 CIRCLED IDEOGRAPH FIVE
+ # <circle> 4E94
+3285 CIRCLED IDEOGRAPH SIX
+ # <circle> 516D
+3286 CIRCLED IDEOGRAPH SEVEN
+ # <circle> 4E03
+3287 CIRCLED IDEOGRAPH EIGHT
+ # <circle> 516B
+3288 CIRCLED IDEOGRAPH NINE
+ # <circle> 4E5D
+3289 CIRCLED IDEOGRAPH TEN
+ # <circle> 5341
+328A CIRCLED IDEOGRAPH MOON
+ * Monday
+ # <circle> 6708
+328B CIRCLED IDEOGRAPH FIRE
+ * Tuesday
+ # <circle> 706B
+328C CIRCLED IDEOGRAPH WATER
+ * Wednesday
+ # <circle> 6C34
+328D CIRCLED IDEOGRAPH WOOD
+ * Thursday
+ # <circle> 6728
+328E CIRCLED IDEOGRAPH METAL
+ * Friday
+ # <circle> 91D1
+328F CIRCLED IDEOGRAPH EARTH
+ * Saturday
+ # <circle> 571F
+3290 CIRCLED IDEOGRAPH SUN
+ * Sunday
+ # <circle> 65E5
+3291 CIRCLED IDEOGRAPH STOCK
+ * incorporated
+ # <circle> 682A
+3292 CIRCLED IDEOGRAPH HAVE
+ * limited
+ # <circle> 6709
+3293 CIRCLED IDEOGRAPH SOCIETY
+ * company
+ # <circle> 793E
+3294 CIRCLED IDEOGRAPH NAME
+ # <circle> 540D
+3295 CIRCLED IDEOGRAPH SPECIAL
+ # <circle> 7279
+3296 CIRCLED IDEOGRAPH FINANCIAL
+ # <circle> 8CA1
+3297 CIRCLED IDEOGRAPH CONGRATULATION
+ # <circle> 795D
+3298 CIRCLED IDEOGRAPH LABOR
+ # <circle> 52B4
+3299 CIRCLED IDEOGRAPH SECRET
+ # <circle> 79D8
+329A CIRCLED IDEOGRAPH MALE
+ # <circle> 7537
+329B CIRCLED IDEOGRAPH FEMALE
+ # <circle> 5973
+329C CIRCLED IDEOGRAPH SUITABLE
+ # <circle> 9069
+329D CIRCLED IDEOGRAPH EXCELLENT
+ # <circle> 512A
+329E CIRCLED IDEOGRAPH PRINT
+ * name seal
+ # <circle> 5370
+329F CIRCLED IDEOGRAPH ATTENTION
+ # <circle> 6CE8
+32A0 CIRCLED IDEOGRAPH ITEM
+ # <circle> 9805
+32A1 CIRCLED IDEOGRAPH REST
+ * holiday
+ # <circle> 4F11
+32A2 CIRCLED IDEOGRAPH COPY
+ # <circle> 5199
+32A3 CIRCLED IDEOGRAPH CORRECT
+ # <circle> 6B63
+32A4 CIRCLED IDEOGRAPH HIGH
+ # <circle> 4E0A
+32A5 CIRCLED IDEOGRAPH CENTRE
+ # <circle> 4E2D
+32A6 CIRCLED IDEOGRAPH LOW
+ # <circle> 4E0B
+32A7 CIRCLED IDEOGRAPH LEFT
+ # <circle> 5DE6
+32A8 CIRCLED IDEOGRAPH RIGHT
+ # <circle> 53F3
+32A9 CIRCLED IDEOGRAPH MEDICINE
+ # <circle> 533B
+32AA CIRCLED IDEOGRAPH RELIGION
+ # <circle> 5B97
+32AB CIRCLED IDEOGRAPH STUDY
+ # <circle> 5B66
+32AC CIRCLED IDEOGRAPH SUPERVISE
+ # <circle> 76E3
+32AD CIRCLED IDEOGRAPH ENTERPRISE
+ # <circle> 4F01
+32AE CIRCLED IDEOGRAPH RESOURCE
+ # <circle> 8CC7
+32AF CIRCLED IDEOGRAPH ALLIANCE
+ # <circle> 5354
+32B0 CIRCLED IDEOGRAPH NIGHT
+ # <circle> 591C
+@ Circled numbers
+32B1 CIRCLED NUMBER THIRTY SIX
+ # <circle> 0033 0036
+32B2 CIRCLED NUMBER THIRTY SEVEN
+ # <circle> 0033 0037
+32B3 CIRCLED NUMBER THIRTY EIGHT
+ # <circle> 0033 0038
+32B4 CIRCLED NUMBER THIRTY NINE
+ # <circle> 0033 0039
+32B5 CIRCLED NUMBER FORTY
+ # <circle> 0034 0030
+32B6 CIRCLED NUMBER FORTY ONE
+ # <circle> 0034 0031
+32B7 CIRCLED NUMBER FORTY TWO
+ # <circle> 0034 0032
+32B8 CIRCLED NUMBER FORTY THREE
+ # <circle> 0034 0033
+32B9 CIRCLED NUMBER FORTY FOUR
+ # <circle> 0034 0034
+32BA CIRCLED NUMBER FORTY FIVE
+ # <circle> 0034 0035
+32BB CIRCLED NUMBER FORTY SIX
+ # <circle> 0034 0036
+32BC CIRCLED NUMBER FORTY SEVEN
+ # <circle> 0034 0037
+32BD CIRCLED NUMBER FORTY EIGHT
+ # <circle> 0034 0038
+32BE CIRCLED NUMBER FORTY NINE
+ # <circle> 0034 0039
+32BF CIRCLED NUMBER FIFTY
+ # <circle> 0035 0030
+@ Telegraph symbols for months
+32C0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+ # 0031 6708
+32C1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+ # 0032 6708
+32C2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+ # 0033 6708
+32C3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+ # 0034 6708
+32C4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+ # 0035 6708
+32C5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+ # 0036 6708
+32C6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+ # 0037 6708
+32C7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+ # 0038 6708
+32C8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+ # 0039 6708
+32C9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+ # 0031 0030 6708
+32CA IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+ # 0031 0031 6708
+32CB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+ # 0031 0032 6708
+@ Squared Latin abbreviations
+32CC SQUARE HG
+ # <square> 0048 0067
+32CD SQUARE ERG
+ # <square> 0065 0072 0067
+32CE SQUARE EV
+ # <square> 0065 0056
+32CF LIMITED LIABILITY SIGN
+ # <square> 004C 0054 0044
+@ Circled Katakana
+32D0 CIRCLED KATAKANA A
+ # <circle> 30A2
+32D1 CIRCLED KATAKANA I
+ # <circle> 30A4
+32D2 CIRCLED KATAKANA U
+ # <circle> 30A6
+32D3 CIRCLED KATAKANA E
+ # <circle> 30A8
+32D4 CIRCLED KATAKANA O
+ # <circle> 30AA
+32D5 CIRCLED KATAKANA KA
+ # <circle> 30AB
+32D6 CIRCLED KATAKANA KI
+ # <circle> 30AD
+32D7 CIRCLED KATAKANA KU
+ # <circle> 30AF
+32D8 CIRCLED KATAKANA KE
+ # <circle> 30B1
+32D9 CIRCLED KATAKANA KO
+ # <circle> 30B3
+32DA CIRCLED KATAKANA SA
+ # <circle> 30B5
+32DB CIRCLED KATAKANA SI
+ # <circle> 30B7
+32DC CIRCLED KATAKANA SU
+ # <circle> 30B9
+32DD CIRCLED KATAKANA SE
+ # <circle> 30BB
+32DE CIRCLED KATAKANA SO
+ # <circle> 30BD
+32DF CIRCLED KATAKANA TA
+ # <circle> 30BF
+32E0 CIRCLED KATAKANA TI
+ # <circle> 30C1
+32E1 CIRCLED KATAKANA TU
+ # <circle> 30C4
+32E2 CIRCLED KATAKANA TE
+ # <circle> 30C6
+32E3 CIRCLED KATAKANA TO
+ # <circle> 30C8
+32E4 CIRCLED KATAKANA NA
+ # <circle> 30CA
+32E5 CIRCLED KATAKANA NI
+ # <circle> 30CB
+32E6 CIRCLED KATAKANA NU
+ # <circle> 30CC
+32E7 CIRCLED KATAKANA NE
+ # <circle> 30CD
+32E8 CIRCLED KATAKANA NO
+ # <circle> 30CE
+32E9 CIRCLED KATAKANA HA
+ # <circle> 30CF
+32EA CIRCLED KATAKANA HI
+ # <circle> 30D2
+32EB CIRCLED KATAKANA HU
+ # <circle> 30D5
+32EC CIRCLED KATAKANA HE
+ # <circle> 30D8
+32ED CIRCLED KATAKANA HO
+ # <circle> 30DB
+32EE CIRCLED KATAKANA MA
+ # <circle> 30DE
+32EF CIRCLED KATAKANA MI
+ # <circle> 30DF
+32F0 CIRCLED KATAKANA MU
+ # <circle> 30E0
+32F1 CIRCLED KATAKANA ME
+ # <circle> 30E1
+32F2 CIRCLED KATAKANA MO
+ # <circle> 30E2
+32F3 CIRCLED KATAKANA YA
+ # <circle> 30E4
+32F4 CIRCLED KATAKANA YU
+ # <circle> 30E6
+32F5 CIRCLED KATAKANA YO
+ # <circle> 30E8
+32F6 CIRCLED KATAKANA RA
+ # <circle> 30E9
+32F7 CIRCLED KATAKANA RI
+ # <circle> 30EA
+32F8 CIRCLED KATAKANA RU
+ # <circle> 30EB
+32F9 CIRCLED KATAKANA RE
+ # <circle> 30EC
+32FA CIRCLED KATAKANA RO
+ # <circle> 30ED
+32FB CIRCLED KATAKANA WA
+ # <circle> 30EF
+32FC CIRCLED KATAKANA WI
+ # <circle> 30F0
+32FD CIRCLED KATAKANA WE
+ # <circle> 30F1
+32FE CIRCLED KATAKANA WO
+ # <circle> 30F2
+@@ 3300 CJK Compatibility 33FF
+@ Squared Katakana words
+3300 SQUARE APAATO
+ * apartment
+ # <square> 30A2 30D1 30FC 30C8
+3301 SQUARE ARUHUA
+ * alpha
+ # <square> 30A2 30EB 30D5 30A1
+3302 SQUARE ANPEA
+ * ampere
+ # <square> 30A2 30F3 30DA 30A2
+3303 SQUARE AARU
+ * are (unit of area)
+ # <square> 30A2 30FC 30EB
+3304 SQUARE ININGU
+ * inning
+ # <square> 30A4 30CB 30F3 30B0
+3305 SQUARE INTI
+ * inch
+ # <square> 30A4 30F3 30C1
+3306 SQUARE UON
+ * won (Korean currency)
+ # <square> 30A6 30A9 30F3
+3307 SQUARE ESUKUUDO
+ * escudo (Portuguese currency)
+ # <square> 30A8 30B9 30AF 30FC 30C9
+3308 SQUARE EEKAA
+ * acre
+ # <square> 30A8 30FC 30AB 30FC
+3309 SQUARE ONSU
+ * ounce
+ # <square> 30AA 30F3 30B9
+330A SQUARE OOMU
+ * ohm
+ # <square> 30AA 30FC 30E0
+330B SQUARE KAIRI
+ * kai-ri: nautical mile
+ # <square> 30AB 30A4 30EA
+330C SQUARE KARATTO
+ * carat
+ # <square> 30AB 30E9 30C3 30C8
+330D SQUARE KARORII
+ * calorie
+ # <square> 30AB 30ED 30EA 30FC
+330E SQUARE GARON
+ * gallon
+ # <square> 30AC 30ED 30F3
+330F SQUARE GANMA
+ * gamma
+ # <square> 30AC 30F3 30DE
+3310 SQUARE GIGA
+ * giga-
+ # <square> 30AE 30AC
+3311 SQUARE GINII
+ * guinea
+ # <square> 30AE 30CB 30FC
+3312 SQUARE KYURII
+ * curie
+ # <square> 30AD 30E5 30EA 30FC
+3313 SQUARE GIRUDAA
+ * guilder
+ # <square> 30AE 30EB 30C0 30FC
+3314 SQUARE KIRO
+ * kilo-
+ # <square> 30AD 30ED
+3315 SQUARE KIROGURAMU
+ * kilogram
+ # <square> 30AD 30ED 30B0 30E9 30E0
+3316 SQUARE KIROMEETORU
+ * kilometer
+ # <square> 30AD 30ED 30E1 30FC 30C8 30EB
+3317 SQUARE KIROWATTO
+ * kilowatt
+ # <square> 30AD 30ED 30EF 30C3 30C8
+3318 SQUARE GURAMU
+ * gram
+ # <square> 30B0 30E9 30E0
+3319 SQUARE GURAMUTON
+ * gram ton
+ # <square> 30B0 30E9 30E0 30C8 30F3
+331A SQUARE KURUZEIRO
+ * cruzeiro (Brazilian currency)
+ # <square> 30AF 30EB 30BC 30A4 30ED
+331B SQUARE KUROONE
+ * krone
+ # <square> 30AF 30ED 30FC 30CD
+331C SQUARE KEESU
+ * case
+ # <square> 30B1 30FC 30B9
+331D SQUARE KORUNA
+ * koruna (Czech currency)
+ # <square> 30B3 30EB 30CA
+331E SQUARE KOOPO
+ * co-op
+ # <square> 30B3 30FC 30DD
+331F SQUARE SAIKURU
+ * cycle
+ # <square> 30B5 30A4 30AF 30EB
+3320 SQUARE SANTIIMU
+ * centime
+ # <square> 30B5 30F3 30C1 30FC 30E0
+3321 SQUARE SIRINGU
+ * shilling
+ # <square> 30B7 30EA 30F3 30B0
+3322 SQUARE SENTI
+ * centi-
+ # <square> 30BB 30F3 30C1
+3323 SQUARE SENTO
+ * cent
+ # <square> 30BB 30F3 30C8
+3324 SQUARE DAASU
+ * dozen
+ # <square> 30C0 30FC 30B9
+3325 SQUARE DESI
+ * deci-
+ # <square> 30C7 30B7
+3326 SQUARE DORU
+ * dollar
+ # <square> 30C9 30EB
+3327 SQUARE TON
+ * ton
+ # <square> 30C8 30F3
+3328 SQUARE NANO
+ * nano-
+ # <square> 30CA 30CE
+3329 SQUARE NOTTO
+ * knot, nautical mile
+ # <square> 30CE 30C3 30C8
+332A SQUARE HAITU
+ * heights
+ # <square> 30CF 30A4 30C4
+332B SQUARE PAASENTO
+ * percent
+ # <square> 30D1 30FC 30BB 30F3 30C8
+332C SQUARE PAATU
+ * parts
+ # <square> 30D1 30FC 30C4
+332D SQUARE BAARERU
+ * barrel
+ # <square> 30D0 30FC 30EC 30EB
+332E SQUARE PIASUTORU
+ * piaster
+ # <square> 30D4 30A2 30B9 30C8 30EB
+332F SQUARE PIKURU
+ * picul (unit of weight)
+ # <square> 30D4 30AF 30EB
+3330 SQUARE PIKO
+ * pico-
+ # <square> 30D4 30B3
+3331 SQUARE BIRU
+ * building
+ # <square> 30D3 30EB
+3332 SQUARE HUARADDO
+ * farad
+ # <square> 30D5 30A1 30E9 30C3 30C9
+3333 SQUARE HUIITO
+ * feet
+ # <square> 30D5 30A3 30FC 30C8
+3334 SQUARE BUSSYERU
+ * bushel
+ # <square> 30D6 30C3 30B7 30A7 30EB
+3335 SQUARE HURAN
+ * franc
+ # <square> 30D5 30E9 30F3
+3336 SQUARE HEKUTAARU
+ * hectare
+ # <square> 30D8 30AF 30BF 30FC 30EB
+3337 SQUARE PESO
+ * peso
+ # <square> 30DA 30BD
+3338 SQUARE PENIHI
+ * pfennig
+ # <square> 30DA 30CB 30D2
+3339 SQUARE HERUTU
+ * hertz
+ # <square> 30D8 30EB 30C4
+333A SQUARE PENSU
+ * pence
+ # <square> 30DA 30F3 30B9
+333B SQUARE PEEZI
+ * page
+ # <square> 30DA 30FC 30B8
+333C SQUARE BEETA
+ * beta
+ # <square> 30D9 30FC 30BF
+333D SQUARE POINTO
+ * point
+ # <square> 30DD 30A4 30F3 30C8
+333E SQUARE BORUTO
+ * volt, bolt
+ # <square> 30DC 30EB 30C8
+333F SQUARE HON
+ * hon: volume
+ # <square> 30DB 30F3
+3340 SQUARE PONDO
+ * pound
+ # <square> 30DD 30F3 30C9
+3341 SQUARE HOORU
+ * hall
+ # <square> 30DB 30FC 30EB
+3342 SQUARE HOON
+ * horn
+ # <square> 30DB 30FC 30F3
+3343 SQUARE MAIKURO
+ * micro-
+ # <square> 30DE 30A4 30AF 30ED
+3344 SQUARE MAIRU
+ * mile
+ # <square> 30DE 30A4 30EB
+3345 SQUARE MAHHA
+ * mach
+ # <square> 30DE 30C3 30CF
+3346 SQUARE MARUKU
+ * mark
+ # <square> 30DE 30EB 30AF
+3347 SQUARE MANSYON
+ * mansion (i.e. better quality apartment)
+ # <square> 30DE 30F3 30B7 30E7 30F3
+3348 SQUARE MIKURON
+ * micron
+ # <square> 30DF 30AF 30ED 30F3
+3349 SQUARE MIRI
+ * milli-
+ # <square> 30DF 30EA
+334A SQUARE MIRIBAARU
+ * millibar
+ # <square> 30DF 30EA 30D0 30FC 30EB
+334B SQUARE MEGA
+ * mega-
+ # <square> 30E1 30AC
+334C SQUARE MEGATON
+ * megaton
+ # <square> 30E1 30AC 30C8 30F3
+334D SQUARE MEETORU
+ * meter
+ # <square> 30E1 30FC 30C8 30EB
+334E SQUARE YAADO
+ * yard
+ # <square> 30E4 30FC 30C9
+334F SQUARE YAARU
+ * yard
+ # <square> 30E4 30FC 30EB
+3350 SQUARE YUAN
+ * yuan (Chinese currency)
+ # <square> 30E6 30A2 30F3
+3351 SQUARE RITTORU
+ * liter
+ # <square> 30EA 30C3 30C8 30EB
+3352 SQUARE RIRA
+ * lira
+ # <square> 30EA 30E9
+3353 SQUARE RUPII
+ * rupee
+ # <square> 30EB 30D4 30FC
+3354 SQUARE RUUBURU
+ * ruble
+ # <square> 30EB 30FC 30D6 30EB
+3355 SQUARE REMU
+ * rem (unit of radiation)
+ # <square> 30EC 30E0
+3356 SQUARE RENTOGEN
+ * roentgen
+ # <square> 30EC 30F3 30C8 30B2 30F3
+3357 SQUARE WATTO
+ * watt
+ # <square> 30EF 30C3 30C8
+@ Telegraph symbols for hours
+3358 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+ # 0030 70B9
+3359 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+ # 0031 70B9
+335A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+ # 0032 70B9
+335B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+ # 0033 70B9
+335C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+ # 0034 70B9
+335D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+ # 0035 70B9
+335E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+ # 0036 70B9
+335F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+ # 0037 70B9
+3360 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+ # 0038 70B9
+3361 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+ # 0039 70B9
+3362 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+ # 0031 0030 70B9
+3363 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+ # 0031 0031 70B9
+3364 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+ # 0031 0032 70B9
+3365 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+ # 0031 0033 70B9
+3366 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+ # 0031 0034 70B9
+3367 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+ # 0031 0035 70B9
+3368 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+ # 0031 0036 70B9
+3369 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+ # 0031 0037 70B9
+336A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+ # 0031 0038 70B9
+336B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+ # 0031 0039 70B9
+336C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+ # 0032 0030 70B9
+336D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+ # 0032 0031 70B9
+336E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+ # 0032 0032 70B9
+336F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+ # 0032 0033 70B9
+3370 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+ # 0032 0034 70B9
+@ Squared Latin abbreviations
+3371 SQUARE HPA
+ # <square> 0068 0050 0061
+3372 SQUARE DA
+ # <square> 0064 0061
+3373 SQUARE AU
+ # <square> 0041 0055
+3374 SQUARE BAR
+ # <square> 0062 0061 0072
+3375 SQUARE OV
+ # <square> 006F 0056
+3376 SQUARE PC
+ # <square> 0070 0063
+3377 SQUARE DM
+ # <square> 0064 006D
+3378 SQUARE DM SQUARED
+ # <square> 0064 006D 00B2
+3379 SQUARE DM CUBED
+ # <square> 0064 006D 00B3
+337A SQUARE IU
+ # <square> 0049 0055
+@ Japanese era names
+337B SQUARE ERA NAME HEISEI
+ # <square> 5E73 6210
+337C SQUARE ERA NAME SYOUWA
+ # <square> 662D 548C
+337D SQUARE ERA NAME TAISYOU
+ # <square> 5927 6B63
+337E SQUARE ERA NAME MEIZI
+ # <square> 660E 6CBB
+@ Japanese corporation
+337F SQUARE CORPORATION
+ = kabusiki-gaisya
+ * incorporated
+ # <square> 682A 5F0F 4F1A 793E
+@ Squared Latin abbreviations
+3380 SQUARE PA AMPS
+ # <square> 0070 0041
+3381 SQUARE NA
+ # <square> 006E 0041
+3382 SQUARE MU A
+ # <square> 03BC 0041
+3383 SQUARE MA
+ # <square> 006D 0041
+3384 SQUARE KA
+ # <square> 006B 0041
+3385 SQUARE KB
+ # <square> 004B 0042
+3386 SQUARE MB
+ # <square> 004D 0042
+3387 SQUARE GB
+ # <square> 0047 0042
+3388 SQUARE CAL
+ # <square> 0063 0061 006C
+3389 SQUARE KCAL
+ # <square> 006B 0063 0061 006C
+338A SQUARE PF
+ # <square> 0070 0046
+338B SQUARE NF
+ # <square> 006E 0046
+338C SQUARE MU F
+ # <square> 03BC 0046
+338D SQUARE MU G
+ # <square> 03BC 0067
+338E SQUARE MG
+ # <square> 006D 0067
+338F SQUARE KG
+ # <square> 006B 0067
+3390 SQUARE HZ
+ # <square> 0048 007A
+3391 SQUARE KHZ
+ # <square> 006B 0048 007A
+3392 SQUARE MHZ
+ # <square> 004D 0048 007A
+3393 SQUARE GHZ
+ # <square> 0047 0048 007A
+3394 SQUARE THZ
+ # <square> 0054 0048 007A
+3395 SQUARE MU L
+ # <square> 03BC 2113
+3396 SQUARE ML
+ # <square> 006D 2113
+3397 SQUARE DL
+ # <square> 0064 2113
+3398 SQUARE KL
+ # <square> 006B 2113
+3399 SQUARE FM
+ # <square> 0066 006D
+339A SQUARE NM
+ # <square> 006E 006D
+339B SQUARE MU M
+ # <square> 03BC 006D
+339C SQUARE MM
+ # <square> 006D 006D
+339D SQUARE CM
+ # <square> 0063 006D
+339E SQUARE KM
+ # <square> 006B 006D
+339F SQUARE MM SQUARED
+ # <square> 006D 006D 00B2
+33A0 SQUARE CM SQUARED
+ # <square> 0063 006D 00B2
+33A1 SQUARE M SQUARED
+ # <square> 006D 00B2
+33A2 SQUARE KM SQUARED
+ # <square> 006B 006D 00B2
+33A3 SQUARE MM CUBED
+ # <square> 006D 006D 00B3
+33A4 SQUARE CM CUBED
+ # <square> 0063 006D 00B3
+33A5 SQUARE M CUBED
+ # <square> 006D 00B3
+33A6 SQUARE KM CUBED
+ # <square> 006B 006D 00B3
+33A7 SQUARE M OVER S
+ # <square> 006D 2215 0073
+33A8 SQUARE M OVER S SQUARED
+ # <square> 006D 2215 0073 00B2
+33A9 SQUARE PA
+ # <square> 0050 0061
+33AA SQUARE KPA
+ # <square> 006B 0050 0061
+33AB SQUARE MPA
+ # <square> 004D 0050 0061
+33AC SQUARE GPA
+ # <square> 0047 0050 0061
+33AD SQUARE RAD
+ # <square> 0072 0061 0064
+33AE SQUARE RAD OVER S
+ # <square> 0072 0061 0064 2215 0073
+33AF SQUARE RAD OVER S SQUARED
+ # <square> 0072 0061 0064 2215 0073 00B2
+33B0 SQUARE PS
+ # <square> 0070 0073
+33B1 SQUARE NS
+ # <square> 006E 0073
+33B2 SQUARE MU S
+ # <square> 03BC 0073
+33B3 SQUARE MS
+ # <square> 006D 0073
+33B4 SQUARE PV
+ # <square> 0070 0056
+33B5 SQUARE NV
+ # <square> 006E 0056
+33B6 SQUARE MU V
+ # <square> 03BC 0056
+33B7 SQUARE MV
+ # <square> 006D 0056
+33B8 SQUARE KV
+ # <square> 006B 0056
+33B9 SQUARE MV MEGA
+ # <square> 004D 0056
+33BA SQUARE PW
+ # <square> 0070 0057
+33BB SQUARE NW
+ # <square> 006E 0057
+33BC SQUARE MU W
+ # <square> 03BC 0057
+33BD SQUARE MW
+ # <square> 006D 0057
+33BE SQUARE KW
+ # <square> 006B 0057
+33BF SQUARE MW MEGA
+ # <square> 004D 0057
+33C0 SQUARE K OHM
+ # <square> 006B 03A9
+33C1 SQUARE M OHM
+ # <square> 004D 03A9
+33C2 SQUARE AM
+ # <square> 0061 002E 006D 002E
+33C3 SQUARE BQ
+ # <square> 0042 0071
+33C4 SQUARE CC
+ # <square> 0063 0063
+33C5 SQUARE CD
+ # <square> 0063 0064
+33C6 SQUARE C OVER KG
+ # <square> 0043 2215 006B 0067
+33C7 SQUARE CO
+ # <square> 0043 006F 002E
+33C8 SQUARE DB
+ # <square> 0064 0042
+33C9 SQUARE GY
+ # <square> 0047 0079
+33CA SQUARE HA
+ # <square> 0068 0061
+33CB SQUARE HP
+ # <square> 0048 0050
+33CC SQUARE IN
+ # <square> 0069 006E
+33CD SQUARE KK
+ # <square> 004B 004B
+33CE SQUARE KM CAPITAL
+ # <square> 004B 004D
+33CF SQUARE KT
+ # <square> 006B 0074
+33D0 SQUARE LM
+ # <square> 006C 006D
+33D1 SQUARE LN
+ # <square> 006C 006E
+33D2 SQUARE LOG
+ # <square> 006C 006F 0067
+33D3 SQUARE LX
+ # <square> 006C 0078
+33D4 SQUARE MB SMALL
+ # <square> 006D 0062
+33D5 SQUARE MIL
+ # <square> 006D 0069 006C
+33D6 SQUARE MOL
+ # <square> 006D 006F 006C
+33D7 SQUARE PH
+ # <square> 0050 0048
+33D8 SQUARE PM
+ # <square> 0070 002E 006D 002E
+33D9 SQUARE PPM
+ # <square> 0050 0050 004D
+33DA SQUARE PR
+ # <square> 0050 0052
+33DB SQUARE SR
+ # <square> 0073 0072
+33DC SQUARE SV
+ # <square> 0053 0076
+33DD SQUARE WB
+ # <square> 0057 0062
+33DE SQUARE V OVER M
+ # <square> 0056 2215 006D
+33DF SQUARE A OVER M
+ # <square> 0041 2215 006D
+@ Telegraph symbols for days
+33E0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+ # 0031 65E5
+33E1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+ # 0032 65E5
+33E2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+ # 0033 65E5
+33E3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+ # 0034 65E5
+33E4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+ # 0035 65E5
+33E5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+ # 0036 65E5
+33E6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+ # 0037 65E5
+33E7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+ # 0038 65E5
+33E8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+ # 0039 65E5
+33E9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+ # 0031 0030 65E5
+33EA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+ # 0031 0031 65E5
+33EB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+ # 0031 0032 65E5
+33EC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+ # 0031 0033 65E5
+33ED IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+ # 0031 0034 65E5
+33EE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+ # 0031 0035 65E5
+33EF IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+ # 0031 0036 65E5
+33F0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+ # 0031 0037 65E5
+33F1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+ # 0031 0038 65E5
+33F2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+ # 0031 0039 65E5
+33F3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+ # 0032 0030 65E5
+33F4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+ # 0032 0031 65E5
+33F5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+ # 0032 0032 65E5
+33F6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+ # 0032 0033 65E5
+33F7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+ # 0032 0034 65E5
+33F8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+ # 0032 0035 65E5
+33F9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+ # 0032 0036 65E5
+33FA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+ # 0032 0037 65E5
+33FB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+ # 0032 0038 65E5
+33FC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+ # 0032 0039 65E5
+33FD IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+ # 0033 0030 65E5
+33FE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+ # 0033 0031 65E5
+@ Squared Latin abbreviation
+33FF SQUARE GAL
+ # <square> 0067 0061 006C
+@@ 3400 CJK Unified Ideographs Extension A 4DB5
+@@ 4DC0 Yijing Hexagram Symbols 4DFF
+@ Yijing hexagram symbols
+4DC0 HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1 HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2 HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3 HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4 HEXAGRAM FOR WAITING
+4DC5 HEXAGRAM FOR CONFLICT
+4DC6 HEXAGRAM FOR THE ARMY
+4DC7 HEXAGRAM FOR HOLDING TOGETHER
+4DC8 HEXAGRAM FOR SMALL TAMING
+4DC9 HEXAGRAM FOR TREADING
+4DCA HEXAGRAM FOR PEACE
+4DCB HEXAGRAM FOR STANDSTILL
+4DCC HEXAGRAM FOR FELLOWSHIP
+4DCD HEXAGRAM FOR GREAT POSSESSION
+4DCE HEXAGRAM FOR MODESTY
+4DCF HEXAGRAM FOR ENTHUSIASM
+4DD0 HEXAGRAM FOR FOLLOWING
+4DD1 HEXAGRAM FOR WORK ON THE DECAYED
+4DD2 HEXAGRAM FOR APPROACH
+4DD3 HEXAGRAM FOR CONTEMPLATION
+4DD4 HEXAGRAM FOR BITING THROUGH
+4DD5 HEXAGRAM FOR GRACE
+4DD6 HEXAGRAM FOR SPLITTING APART
+4DD7 HEXAGRAM FOR RETURN
+4DD8 HEXAGRAM FOR INNOCENCE
+4DD9 HEXAGRAM FOR GREAT TAMING
+4DDA HEXAGRAM FOR MOUTH CORNERS
+4DDB HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC HEXAGRAM FOR THE ABYSMAL WATER
+4DDD HEXAGRAM FOR THE CLINGING FIRE
+4DDE HEXAGRAM FOR INFLUENCE
+4DDF HEXAGRAM FOR DURATION
+4DE0 HEXAGRAM FOR RETREAT
+4DE1 HEXAGRAM FOR GREAT POWER
+4DE2 HEXAGRAM FOR PROGRESS
+4DE3 HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4 HEXAGRAM FOR THE FAMILY
+4DE5 HEXAGRAM FOR OPPOSITION
+4DE6 HEXAGRAM FOR OBSTRUCTION
+4DE7 HEXAGRAM FOR DELIVERANCE
+4DE8 HEXAGRAM FOR DECREASE
+4DE9 HEXAGRAM FOR INCREASE
+4DEA HEXAGRAM FOR BREAKTHROUGH
+4DEB HEXAGRAM FOR COMING TO MEET
+4DEC HEXAGRAM FOR GATHERING TOGETHER
+4DED HEXAGRAM FOR PUSHING UPWARD
+4DEE HEXAGRAM FOR OPPRESSION
+4DEF HEXAGRAM FOR THE WELL
+4DF0 HEXAGRAM FOR REVOLUTION
+4DF1 HEXAGRAM FOR THE CAULDRON
+4DF2 HEXAGRAM FOR THE AROUSING THUNDER
+4DF3 HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4 HEXAGRAM FOR DEVELOPMENT
+4DF5 HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6 HEXAGRAM FOR ABUNDANCE
+4DF7 HEXAGRAM FOR THE WANDERER
+4DF8 HEXAGRAM FOR THE GENTLE WIND
+4DF9 HEXAGRAM FOR THE JOYOUS LAKE
+4DFA HEXAGRAM FOR DISPERSION
+4DFB HEXAGRAM FOR LIMITATION
+4DFC HEXAGRAM FOR INNER TRUTH
+4DFD HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE HEXAGRAM FOR AFTER COMPLETION
+4DFF HEXAGRAM FOR BEFORE COMPLETION
+@@ 4E00 CJK Unified Ideographs 9FC3
+@@ A000 Yi Syllables A48F
+@@+
+@ Syllables
+A000 YI SYLLABLE IT
+A001 YI SYLLABLE IX
+A002 YI SYLLABLE I
+A003 YI SYLLABLE IP
+A004 YI SYLLABLE IET
+A005 YI SYLLABLE IEX
+A006 YI SYLLABLE IE
+A007 YI SYLLABLE IEP
+A008 YI SYLLABLE AT
+A009 YI SYLLABLE AX
+A00A YI SYLLABLE A
+A00B YI SYLLABLE AP
+A00C YI SYLLABLE UOX
+A00D YI SYLLABLE UO
+A00E YI SYLLABLE UOP
+A00F YI SYLLABLE OT
+A010 YI SYLLABLE OX
+A011 YI SYLLABLE O
+A012 YI SYLLABLE OP
+A013 YI SYLLABLE EX
+A014 YI SYLLABLE E
+@ Syllable iteration mark
+A015 YI SYLLABLE WU
+ % YI SYLLABLE ITERATION MARK
+ * name is a misnomer
+@ Syllables
+A016 YI SYLLABLE BIT
+A017 YI SYLLABLE BIX
+A018 YI SYLLABLE BI
+A019 YI SYLLABLE BIP
+A01A YI SYLLABLE BIET
+A01B YI SYLLABLE BIEX
+A01C YI SYLLABLE BIE
+A01D YI SYLLABLE BIEP
+A01E YI SYLLABLE BAT
+A01F YI SYLLABLE BAX
+A020 YI SYLLABLE BA
+A021 YI SYLLABLE BAP
+A022 YI SYLLABLE BUOX
+A023 YI SYLLABLE BUO
+A024 YI SYLLABLE BUOP
+A025 YI SYLLABLE BOT
+A026 YI SYLLABLE BOX
+A027 YI SYLLABLE BO
+A028 YI SYLLABLE BOP
+A029 YI SYLLABLE BEX
+A02A YI SYLLABLE BE
+A02B YI SYLLABLE BEP
+A02C YI SYLLABLE BUT
+A02D YI SYLLABLE BUX
+A02E YI SYLLABLE BU
+A02F YI SYLLABLE BUP
+A030 YI SYLLABLE BURX
+A031 YI SYLLABLE BUR
+A032 YI SYLLABLE BYT
+A033 YI SYLLABLE BYX
+A034 YI SYLLABLE BY
+A035 YI SYLLABLE BYP
+A036 YI SYLLABLE BYRX
+A037 YI SYLLABLE BYR
+A038 YI SYLLABLE PIT
+A039 YI SYLLABLE PIX
+A03A YI SYLLABLE PI
+A03B YI SYLLABLE PIP
+A03C YI SYLLABLE PIEX
+A03D YI SYLLABLE PIE
+A03E YI SYLLABLE PIEP
+A03F YI SYLLABLE PAT
+A040 YI SYLLABLE PAX
+A041 YI SYLLABLE PA
+A042 YI SYLLABLE PAP
+A043 YI SYLLABLE PUOX
+A044 YI SYLLABLE PUO
+A045 YI SYLLABLE PUOP
+A046 YI SYLLABLE POT
+A047 YI SYLLABLE POX
+A048 YI SYLLABLE PO
+A049 YI SYLLABLE POP
+A04A YI SYLLABLE PUT
+A04B YI SYLLABLE PUX
+A04C YI SYLLABLE PU
+A04D YI SYLLABLE PUP
+A04E YI SYLLABLE PURX
+A04F YI SYLLABLE PUR
+A050 YI SYLLABLE PYT
+A051 YI SYLLABLE PYX
+A052 YI SYLLABLE PY
+A053 YI SYLLABLE PYP
+A054 YI SYLLABLE PYRX
+A055 YI SYLLABLE PYR
+A056 YI SYLLABLE BBIT
+A057 YI SYLLABLE BBIX
+A058 YI SYLLABLE BBI
+A059 YI SYLLABLE BBIP
+A05A YI SYLLABLE BBIET
+A05B YI SYLLABLE BBIEX
+A05C YI SYLLABLE BBIE
+A05D YI SYLLABLE BBIEP
+A05E YI SYLLABLE BBAT
+A05F YI SYLLABLE BBAX
+A060 YI SYLLABLE BBA
+A061 YI SYLLABLE BBAP
+A062 YI SYLLABLE BBUOX
+A063 YI SYLLABLE BBUO
+A064 YI SYLLABLE BBUOP
+A065 YI SYLLABLE BBOT
+A066 YI SYLLABLE BBOX
+A067 YI SYLLABLE BBO
+A068 YI SYLLABLE BBOP
+A069 YI SYLLABLE BBEX
+A06A YI SYLLABLE BBE
+A06B YI SYLLABLE BBEP
+A06C YI SYLLABLE BBUT
+A06D YI SYLLABLE BBUX
+A06E YI SYLLABLE BBU
+A06F YI SYLLABLE BBUP
+A070 YI SYLLABLE BBURX
+A071 YI SYLLABLE BBUR
+A072 YI SYLLABLE BBYT
+A073 YI SYLLABLE BBYX
+A074 YI SYLLABLE BBY
+A075 YI SYLLABLE BBYP
+A076 YI SYLLABLE NBIT
+A077 YI SYLLABLE NBIX
+A078 YI SYLLABLE NBI
+A079 YI SYLLABLE NBIP
+A07A YI SYLLABLE NBIEX
+A07B YI SYLLABLE NBIE
+A07C YI SYLLABLE NBIEP
+A07D YI SYLLABLE NBAT
+A07E YI SYLLABLE NBAX
+A07F YI SYLLABLE NBA
+A080 YI SYLLABLE NBAP
+A081 YI SYLLABLE NBOT
+A082 YI SYLLABLE NBOX
+A083 YI SYLLABLE NBO
+A084 YI SYLLABLE NBOP
+A085 YI SYLLABLE NBUT
+A086 YI SYLLABLE NBUX
+A087 YI SYLLABLE NBU
+A088 YI SYLLABLE NBUP
+A089 YI SYLLABLE NBURX
+A08A YI SYLLABLE NBUR
+A08B YI SYLLABLE NBYT
+A08C YI SYLLABLE NBYX
+A08D YI SYLLABLE NBY
+A08E YI SYLLABLE NBYP
+A08F YI SYLLABLE NBYRX
+A090 YI SYLLABLE NBYR
+A091 YI SYLLABLE HMIT
+A092 YI SYLLABLE HMIX
+A093 YI SYLLABLE HMI
+A094 YI SYLLABLE HMIP
+A095 YI SYLLABLE HMIEX
+A096 YI SYLLABLE HMIE
+A097 YI SYLLABLE HMIEP
+A098 YI SYLLABLE HMAT
+A099 YI SYLLABLE HMAX
+A09A YI SYLLABLE HMA
+A09B YI SYLLABLE HMAP
+A09C YI SYLLABLE HMUOX
+A09D YI SYLLABLE HMUO
+A09E YI SYLLABLE HMUOP
+A09F YI SYLLABLE HMOT
+A0A0 YI SYLLABLE HMOX
+A0A1 YI SYLLABLE HMO
+A0A2 YI SYLLABLE HMOP
+A0A3 YI SYLLABLE HMUT
+A0A4 YI SYLLABLE HMUX
+A0A5 YI SYLLABLE HMU
+A0A6 YI SYLLABLE HMUP
+A0A7 YI SYLLABLE HMURX
+A0A8 YI SYLLABLE HMUR
+A0A9 YI SYLLABLE HMYX
+A0AA YI SYLLABLE HMY
+A0AB YI SYLLABLE HMYP
+A0AC YI SYLLABLE HMYRX
+A0AD YI SYLLABLE HMYR
+A0AE YI SYLLABLE MIT
+A0AF YI SYLLABLE MIX
+A0B0 YI SYLLABLE MI
+A0B1 YI SYLLABLE MIP
+A0B2 YI SYLLABLE MIEX
+A0B3 YI SYLLABLE MIE
+A0B4 YI SYLLABLE MIEP
+A0B5 YI SYLLABLE MAT
+A0B6 YI SYLLABLE MAX
+A0B7 YI SYLLABLE MA
+A0B8 YI SYLLABLE MAP
+A0B9 YI SYLLABLE MUOT
+A0BA YI SYLLABLE MUOX
+A0BB YI SYLLABLE MUO
+A0BC YI SYLLABLE MUOP
+A0BD YI SYLLABLE MOT
+A0BE YI SYLLABLE MOX
+A0BF YI SYLLABLE MO
+A0C0 YI SYLLABLE MOP
+A0C1 YI SYLLABLE MEX
+A0C2 YI SYLLABLE ME
+A0C3 YI SYLLABLE MUT
+A0C4 YI SYLLABLE MUX
+A0C5 YI SYLLABLE MU
+A0C6 YI SYLLABLE MUP
+A0C7 YI SYLLABLE MURX
+A0C8 YI SYLLABLE MUR
+A0C9 YI SYLLABLE MYT
+A0CA YI SYLLABLE MYX
+A0CB YI SYLLABLE MY
+A0CC YI SYLLABLE MYP
+A0CD YI SYLLABLE FIT
+A0CE YI SYLLABLE FIX
+A0CF YI SYLLABLE FI
+A0D0 YI SYLLABLE FIP
+A0D1 YI SYLLABLE FAT
+A0D2 YI SYLLABLE FAX
+A0D3 YI SYLLABLE FA
+A0D4 YI SYLLABLE FAP
+A0D5 YI SYLLABLE FOX
+A0D6 YI SYLLABLE FO
+A0D7 YI SYLLABLE FOP
+A0D8 YI SYLLABLE FUT
+A0D9 YI SYLLABLE FUX
+A0DA YI SYLLABLE FU
+A0DB YI SYLLABLE FUP
+A0DC YI SYLLABLE FURX
+A0DD YI SYLLABLE FUR
+A0DE YI SYLLABLE FYT
+A0DF YI SYLLABLE FYX
+A0E0 YI SYLLABLE FY
+A0E1 YI SYLLABLE FYP
+A0E2 YI SYLLABLE VIT
+A0E3 YI SYLLABLE VIX
+A0E4 YI SYLLABLE VI
+A0E5 YI SYLLABLE VIP
+A0E6 YI SYLLABLE VIET
+A0E7 YI SYLLABLE VIEX
+A0E8 YI SYLLABLE VIE
+A0E9 YI SYLLABLE VIEP
+A0EA YI SYLLABLE VAT
+A0EB YI SYLLABLE VAX
+A0EC YI SYLLABLE VA
+A0ED YI SYLLABLE VAP
+A0EE YI SYLLABLE VOT
+A0EF YI SYLLABLE VOX
+A0F0 YI SYLLABLE VO
+A0F1 YI SYLLABLE VOP
+A0F2 YI SYLLABLE VEX
+A0F3 YI SYLLABLE VEP
+A0F4 YI SYLLABLE VUT
+A0F5 YI SYLLABLE VUX
+A0F6 YI SYLLABLE VU
+A0F7 YI SYLLABLE VUP
+A0F8 YI SYLLABLE VURX
+A0F9 YI SYLLABLE VUR
+A0FA YI SYLLABLE VYT
+A0FB YI SYLLABLE VYX
+A0FC YI SYLLABLE VY
+A0FD YI SYLLABLE VYP
+A0FE YI SYLLABLE VYRX
+A0FF YI SYLLABLE VYR
+A100 YI SYLLABLE DIT
+A101 YI SYLLABLE DIX
+A102 YI SYLLABLE DI
+A103 YI SYLLABLE DIP
+A104 YI SYLLABLE DIEX
+A105 YI SYLLABLE DIE
+A106 YI SYLLABLE DIEP
+A107 YI SYLLABLE DAT
+A108 YI SYLLABLE DAX
+A109 YI SYLLABLE DA
+A10A YI SYLLABLE DAP
+A10B YI SYLLABLE DUOX
+A10C YI SYLLABLE DUO
+A10D YI SYLLABLE DOT
+A10E YI SYLLABLE DOX
+A10F YI SYLLABLE DO
+A110 YI SYLLABLE DOP
+A111 YI SYLLABLE DEX
+A112 YI SYLLABLE DE
+A113 YI SYLLABLE DEP
+A114 YI SYLLABLE DUT
+A115 YI SYLLABLE DUX
+A116 YI SYLLABLE DU
+A117 YI SYLLABLE DUP
+A118 YI SYLLABLE DURX
+A119 YI SYLLABLE DUR
+A11A YI SYLLABLE TIT
+A11B YI SYLLABLE TIX
+A11C YI SYLLABLE TI
+A11D YI SYLLABLE TIP
+A11E YI SYLLABLE TIEX
+A11F YI SYLLABLE TIE
+A120 YI SYLLABLE TIEP
+A121 YI SYLLABLE TAT
+A122 YI SYLLABLE TAX
+A123 YI SYLLABLE TA
+A124 YI SYLLABLE TAP
+A125 YI SYLLABLE TUOT
+A126 YI SYLLABLE TUOX
+A127 YI SYLLABLE TUO
+A128 YI SYLLABLE TUOP
+A129 YI SYLLABLE TOT
+A12A YI SYLLABLE TOX
+A12B YI SYLLABLE TO
+A12C YI SYLLABLE TOP
+A12D YI SYLLABLE TEX
+A12E YI SYLLABLE TE
+A12F YI SYLLABLE TEP
+A130 YI SYLLABLE TUT
+A131 YI SYLLABLE TUX
+A132 YI SYLLABLE TU
+A133 YI SYLLABLE TUP
+A134 YI SYLLABLE TURX
+A135 YI SYLLABLE TUR
+A136 YI SYLLABLE DDIT
+A137 YI SYLLABLE DDIX
+A138 YI SYLLABLE DDI
+A139 YI SYLLABLE DDIP
+A13A YI SYLLABLE DDIEX
+A13B YI SYLLABLE DDIE
+A13C YI SYLLABLE DDIEP
+A13D YI SYLLABLE DDAT
+A13E YI SYLLABLE DDAX
+A13F YI SYLLABLE DDA
+A140 YI SYLLABLE DDAP
+A141 YI SYLLABLE DDUOX
+A142 YI SYLLABLE DDUO
+A143 YI SYLLABLE DDUOP
+A144 YI SYLLABLE DDOT
+A145 YI SYLLABLE DDOX
+A146 YI SYLLABLE DDO
+A147 YI SYLLABLE DDOP
+A148 YI SYLLABLE DDEX
+A149 YI SYLLABLE DDE
+A14A YI SYLLABLE DDEP
+A14B YI SYLLABLE DDUT
+A14C YI SYLLABLE DDUX
+A14D YI SYLLABLE DDU
+A14E YI SYLLABLE DDUP
+A14F YI SYLLABLE DDURX
+A150 YI SYLLABLE DDUR
+A151 YI SYLLABLE NDIT
+A152 YI SYLLABLE NDIX
+A153 YI SYLLABLE NDI
+A154 YI SYLLABLE NDIP
+A155 YI SYLLABLE NDIEX
+A156 YI SYLLABLE NDIE
+A157 YI SYLLABLE NDAT
+A158 YI SYLLABLE NDAX
+A159 YI SYLLABLE NDA
+A15A YI SYLLABLE NDAP
+A15B YI SYLLABLE NDOT
+A15C YI SYLLABLE NDOX
+A15D YI SYLLABLE NDO
+A15E YI SYLLABLE NDOP
+A15F YI SYLLABLE NDEX
+A160 YI SYLLABLE NDE
+A161 YI SYLLABLE NDEP
+A162 YI SYLLABLE NDUT
+A163 YI SYLLABLE NDUX
+A164 YI SYLLABLE NDU
+A165 YI SYLLABLE NDUP
+A166 YI SYLLABLE NDURX
+A167 YI SYLLABLE NDUR
+A168 YI SYLLABLE HNIT
+A169 YI SYLLABLE HNIX
+A16A YI SYLLABLE HNI
+A16B YI SYLLABLE HNIP
+A16C YI SYLLABLE HNIET
+A16D YI SYLLABLE HNIEX
+A16E YI SYLLABLE HNIE
+A16F YI SYLLABLE HNIEP
+A170 YI SYLLABLE HNAT
+A171 YI SYLLABLE HNAX
+A172 YI SYLLABLE HNA
+A173 YI SYLLABLE HNAP
+A174 YI SYLLABLE HNUOX
+A175 YI SYLLABLE HNUO
+A176 YI SYLLABLE HNOT
+A177 YI SYLLABLE HNOX
+A178 YI SYLLABLE HNOP
+A179 YI SYLLABLE HNEX
+A17A YI SYLLABLE HNE
+A17B YI SYLLABLE HNEP
+A17C YI SYLLABLE HNUT
+A17D YI SYLLABLE NIT
+A17E YI SYLLABLE NIX
+A17F YI SYLLABLE NI
+A180 YI SYLLABLE NIP
+A181 YI SYLLABLE NIEX
+A182 YI SYLLABLE NIE
+A183 YI SYLLABLE NIEP
+A184 YI SYLLABLE NAX
+A185 YI SYLLABLE NA
+A186 YI SYLLABLE NAP
+A187 YI SYLLABLE NUOX
+A188 YI SYLLABLE NUO
+A189 YI SYLLABLE NUOP
+A18A YI SYLLABLE NOT
+A18B YI SYLLABLE NOX
+A18C YI SYLLABLE NO
+A18D YI SYLLABLE NOP
+A18E YI SYLLABLE NEX
+A18F YI SYLLABLE NE
+A190 YI SYLLABLE NEP
+A191 YI SYLLABLE NUT
+A192 YI SYLLABLE NUX
+A193 YI SYLLABLE NU
+A194 YI SYLLABLE NUP
+A195 YI SYLLABLE NURX
+A196 YI SYLLABLE NUR
+A197 YI SYLLABLE HLIT
+A198 YI SYLLABLE HLIX
+A199 YI SYLLABLE HLI
+A19A YI SYLLABLE HLIP
+A19B YI SYLLABLE HLIEX
+A19C YI SYLLABLE HLIE
+A19D YI SYLLABLE HLIEP
+A19E YI SYLLABLE HLAT
+A19F YI SYLLABLE HLAX
+A1A0 YI SYLLABLE HLA
+A1A1 YI SYLLABLE HLAP
+A1A2 YI SYLLABLE HLUOX
+A1A3 YI SYLLABLE HLUO
+A1A4 YI SYLLABLE HLUOP
+A1A5 YI SYLLABLE HLOX
+A1A6 YI SYLLABLE HLO
+A1A7 YI SYLLABLE HLOP
+A1A8 YI SYLLABLE HLEX
+A1A9 YI SYLLABLE HLE
+A1AA YI SYLLABLE HLEP
+A1AB YI SYLLABLE HLUT
+A1AC YI SYLLABLE HLUX
+A1AD YI SYLLABLE HLU
+A1AE YI SYLLABLE HLUP
+A1AF YI SYLLABLE HLURX
+A1B0 YI SYLLABLE HLUR
+A1B1 YI SYLLABLE HLYT
+A1B2 YI SYLLABLE HLYX
+A1B3 YI SYLLABLE HLY
+A1B4 YI SYLLABLE HLYP
+A1B5 YI SYLLABLE HLYRX
+A1B6 YI SYLLABLE HLYR
+A1B7 YI SYLLABLE LIT
+A1B8 YI SYLLABLE LIX
+A1B9 YI SYLLABLE LI
+A1BA YI SYLLABLE LIP
+A1BB YI SYLLABLE LIET
+A1BC YI SYLLABLE LIEX
+A1BD YI SYLLABLE LIE
+A1BE YI SYLLABLE LIEP
+A1BF YI SYLLABLE LAT
+A1C0 YI SYLLABLE LAX
+A1C1 YI SYLLABLE LA
+A1C2 YI SYLLABLE LAP
+A1C3 YI SYLLABLE LUOT
+A1C4 YI SYLLABLE LUOX
+A1C5 YI SYLLABLE LUO
+A1C6 YI SYLLABLE LUOP
+A1C7 YI SYLLABLE LOT
+A1C8 YI SYLLABLE LOX
+A1C9 YI SYLLABLE LO
+A1CA YI SYLLABLE LOP
+A1CB YI SYLLABLE LEX
+A1CC YI SYLLABLE LE
+A1CD YI SYLLABLE LEP
+A1CE YI SYLLABLE LUT
+A1CF YI SYLLABLE LUX
+A1D0 YI SYLLABLE LU
+A1D1 YI SYLLABLE LUP
+A1D2 YI SYLLABLE LURX
+A1D3 YI SYLLABLE LUR
+A1D4 YI SYLLABLE LYT
+A1D5 YI SYLLABLE LYX
+A1D6 YI SYLLABLE LY
+A1D7 YI SYLLABLE LYP
+A1D8 YI SYLLABLE LYRX
+A1D9 YI SYLLABLE LYR
+A1DA YI SYLLABLE GIT
+A1DB YI SYLLABLE GIX
+A1DC YI SYLLABLE GI
+A1DD YI SYLLABLE GIP
+A1DE YI SYLLABLE GIET
+A1DF YI SYLLABLE GIEX
+A1E0 YI SYLLABLE GIE
+A1E1 YI SYLLABLE GIEP
+A1E2 YI SYLLABLE GAT
+A1E3 YI SYLLABLE GAX
+A1E4 YI SYLLABLE GA
+A1E5 YI SYLLABLE GAP
+A1E6 YI SYLLABLE GUOT
+A1E7 YI SYLLABLE GUOX
+A1E8 YI SYLLABLE GUO
+A1E9 YI SYLLABLE GUOP
+A1EA YI SYLLABLE GOT
+A1EB YI SYLLABLE GOX
+A1EC YI SYLLABLE GO
+A1ED YI SYLLABLE GOP
+A1EE YI SYLLABLE GET
+A1EF YI SYLLABLE GEX
+A1F0 YI SYLLABLE GE
+A1F1 YI SYLLABLE GEP
+A1F2 YI SYLLABLE GUT
+A1F3 YI SYLLABLE GUX
+A1F4 YI SYLLABLE GU
+A1F5 YI SYLLABLE GUP
+A1F6 YI SYLLABLE GURX
+A1F7 YI SYLLABLE GUR
+A1F8 YI SYLLABLE KIT
+A1F9 YI SYLLABLE KIX
+A1FA YI SYLLABLE KI
+A1FB YI SYLLABLE KIP
+A1FC YI SYLLABLE KIEX
+A1FD YI SYLLABLE KIE
+A1FE YI SYLLABLE KIEP
+A1FF YI SYLLABLE KAT
+A200 YI SYLLABLE KAX
+A201 YI SYLLABLE KA
+A202 YI SYLLABLE KAP
+A203 YI SYLLABLE KUOX
+A204 YI SYLLABLE KUO
+A205 YI SYLLABLE KUOP
+A206 YI SYLLABLE KOT
+A207 YI SYLLABLE KOX
+A208 YI SYLLABLE KO
+A209 YI SYLLABLE KOP
+A20A YI SYLLABLE KET
+A20B YI SYLLABLE KEX
+A20C YI SYLLABLE KE
+A20D YI SYLLABLE KEP
+A20E YI SYLLABLE KUT
+A20F YI SYLLABLE KUX
+A210 YI SYLLABLE KU
+A211 YI SYLLABLE KUP
+A212 YI SYLLABLE KURX
+A213 YI SYLLABLE KUR
+A214 YI SYLLABLE GGIT
+A215 YI SYLLABLE GGIX
+A216 YI SYLLABLE GGI
+A217 YI SYLLABLE GGIEX
+A218 YI SYLLABLE GGIE
+A219 YI SYLLABLE GGIEP
+A21A YI SYLLABLE GGAT
+A21B YI SYLLABLE GGAX
+A21C YI SYLLABLE GGA
+A21D YI SYLLABLE GGAP
+A21E YI SYLLABLE GGUOT
+A21F YI SYLLABLE GGUOX
+A220 YI SYLLABLE GGUO
+A221 YI SYLLABLE GGUOP
+A222 YI SYLLABLE GGOT
+A223 YI SYLLABLE GGOX
+A224 YI SYLLABLE GGO
+A225 YI SYLLABLE GGOP
+A226 YI SYLLABLE GGET
+A227 YI SYLLABLE GGEX
+A228 YI SYLLABLE GGE
+A229 YI SYLLABLE GGEP
+A22A YI SYLLABLE GGUT
+A22B YI SYLLABLE GGUX
+A22C YI SYLLABLE GGU
+A22D YI SYLLABLE GGUP
+A22E YI SYLLABLE GGURX
+A22F YI SYLLABLE GGUR
+A230 YI SYLLABLE MGIEX
+A231 YI SYLLABLE MGIE
+A232 YI SYLLABLE MGAT
+A233 YI SYLLABLE MGAX
+A234 YI SYLLABLE MGA
+A235 YI SYLLABLE MGAP
+A236 YI SYLLABLE MGUOX
+A237 YI SYLLABLE MGUO
+A238 YI SYLLABLE MGUOP
+A239 YI SYLLABLE MGOT
+A23A YI SYLLABLE MGOX
+A23B YI SYLLABLE MGO
+A23C YI SYLLABLE MGOP
+A23D YI SYLLABLE MGEX
+A23E YI SYLLABLE MGE
+A23F YI SYLLABLE MGEP
+A240 YI SYLLABLE MGUT
+A241 YI SYLLABLE MGUX
+A242 YI SYLLABLE MGU
+A243 YI SYLLABLE MGUP
+A244 YI SYLLABLE MGURX
+A245 YI SYLLABLE MGUR
+A246 YI SYLLABLE HXIT
+A247 YI SYLLABLE HXIX
+A248 YI SYLLABLE HXI
+A249 YI SYLLABLE HXIP
+A24A YI SYLLABLE HXIET
+A24B YI SYLLABLE HXIEX
+A24C YI SYLLABLE HXIE
+A24D YI SYLLABLE HXIEP
+A24E YI SYLLABLE HXAT
+A24F YI SYLLABLE HXAX
+A250 YI SYLLABLE HXA
+A251 YI SYLLABLE HXAP
+A252 YI SYLLABLE HXUOT
+A253 YI SYLLABLE HXUOX
+A254 YI SYLLABLE HXUO
+A255 YI SYLLABLE HXUOP
+A256 YI SYLLABLE HXOT
+A257 YI SYLLABLE HXOX
+A258 YI SYLLABLE HXO
+A259 YI SYLLABLE HXOP
+A25A YI SYLLABLE HXEX
+A25B YI SYLLABLE HXE
+A25C YI SYLLABLE HXEP
+A25D YI SYLLABLE NGIEX
+A25E YI SYLLABLE NGIE
+A25F YI SYLLABLE NGIEP
+A260 YI SYLLABLE NGAT
+A261 YI SYLLABLE NGAX
+A262 YI SYLLABLE NGA
+A263 YI SYLLABLE NGAP
+A264 YI SYLLABLE NGUOT
+A265 YI SYLLABLE NGUOX
+A266 YI SYLLABLE NGUO
+A267 YI SYLLABLE NGOT
+A268 YI SYLLABLE NGOX
+A269 YI SYLLABLE NGO
+A26A YI SYLLABLE NGOP
+A26B YI SYLLABLE NGEX
+A26C YI SYLLABLE NGE
+A26D YI SYLLABLE NGEP
+A26E YI SYLLABLE HIT
+A26F YI SYLLABLE HIEX
+A270 YI SYLLABLE HIE
+A271 YI SYLLABLE HAT
+A272 YI SYLLABLE HAX
+A273 YI SYLLABLE HA
+A274 YI SYLLABLE HAP
+A275 YI SYLLABLE HUOT
+A276 YI SYLLABLE HUOX
+A277 YI SYLLABLE HUO
+A278 YI SYLLABLE HUOP
+A279 YI SYLLABLE HOT
+A27A YI SYLLABLE HOX
+A27B YI SYLLABLE HO
+A27C YI SYLLABLE HOP
+A27D YI SYLLABLE HEX
+A27E YI SYLLABLE HE
+A27F YI SYLLABLE HEP
+A280 YI SYLLABLE WAT
+A281 YI SYLLABLE WAX
+A282 YI SYLLABLE WA
+A283 YI SYLLABLE WAP
+A284 YI SYLLABLE WUOX
+A285 YI SYLLABLE WUO
+A286 YI SYLLABLE WUOP
+A287 YI SYLLABLE WOX
+A288 YI SYLLABLE WO
+A289 YI SYLLABLE WOP
+A28A YI SYLLABLE WEX
+A28B YI SYLLABLE WE
+A28C YI SYLLABLE WEP
+A28D YI SYLLABLE ZIT
+A28E YI SYLLABLE ZIX
+A28F YI SYLLABLE ZI
+A290 YI SYLLABLE ZIP
+A291 YI SYLLABLE ZIEX
+A292 YI SYLLABLE ZIE
+A293 YI SYLLABLE ZIEP
+A294 YI SYLLABLE ZAT
+A295 YI SYLLABLE ZAX
+A296 YI SYLLABLE ZA
+A297 YI SYLLABLE ZAP
+A298 YI SYLLABLE ZUOX
+A299 YI SYLLABLE ZUO
+A29A YI SYLLABLE ZUOP
+A29B YI SYLLABLE ZOT
+A29C YI SYLLABLE ZOX
+A29D YI SYLLABLE ZO
+A29E YI SYLLABLE ZOP
+A29F YI SYLLABLE ZEX
+A2A0 YI SYLLABLE ZE
+A2A1 YI SYLLABLE ZEP
+A2A2 YI SYLLABLE ZUT
+A2A3 YI SYLLABLE ZUX
+A2A4 YI SYLLABLE ZU
+A2A5 YI SYLLABLE ZUP
+A2A6 YI SYLLABLE ZURX
+A2A7 YI SYLLABLE ZUR
+A2A8 YI SYLLABLE ZYT
+A2A9 YI SYLLABLE ZYX
+A2AA YI SYLLABLE ZY
+A2AB YI SYLLABLE ZYP
+A2AC YI SYLLABLE ZYRX
+A2AD YI SYLLABLE ZYR
+A2AE YI SYLLABLE CIT
+A2AF YI SYLLABLE CIX
+A2B0 YI SYLLABLE CI
+A2B1 YI SYLLABLE CIP
+A2B2 YI SYLLABLE CIET
+A2B3 YI SYLLABLE CIEX
+A2B4 YI SYLLABLE CIE
+A2B5 YI SYLLABLE CIEP
+A2B6 YI SYLLABLE CAT
+A2B7 YI SYLLABLE CAX
+A2B8 YI SYLLABLE CA
+A2B9 YI SYLLABLE CAP
+A2BA YI SYLLABLE CUOX
+A2BB YI SYLLABLE CUO
+A2BC YI SYLLABLE CUOP
+A2BD YI SYLLABLE COT
+A2BE YI SYLLABLE COX
+A2BF YI SYLLABLE CO
+A2C0 YI SYLLABLE COP
+A2C1 YI SYLLABLE CEX
+A2C2 YI SYLLABLE CE
+A2C3 YI SYLLABLE CEP
+A2C4 YI SYLLABLE CUT
+A2C5 YI SYLLABLE CUX
+A2C6 YI SYLLABLE CU
+A2C7 YI SYLLABLE CUP
+A2C8 YI SYLLABLE CURX
+A2C9 YI SYLLABLE CUR
+A2CA YI SYLLABLE CYT
+A2CB YI SYLLABLE CYX
+A2CC YI SYLLABLE CY
+A2CD YI SYLLABLE CYP
+A2CE YI SYLLABLE CYRX
+A2CF YI SYLLABLE CYR
+A2D0 YI SYLLABLE ZZIT
+A2D1 YI SYLLABLE ZZIX
+A2D2 YI SYLLABLE ZZI
+A2D3 YI SYLLABLE ZZIP
+A2D4 YI SYLLABLE ZZIET
+A2D5 YI SYLLABLE ZZIEX
+A2D6 YI SYLLABLE ZZIE
+A2D7 YI SYLLABLE ZZIEP
+A2D8 YI SYLLABLE ZZAT
+A2D9 YI SYLLABLE ZZAX
+A2DA YI SYLLABLE ZZA
+A2DB YI SYLLABLE ZZAP
+A2DC YI SYLLABLE ZZOX
+A2DD YI SYLLABLE ZZO
+A2DE YI SYLLABLE ZZOP
+A2DF YI SYLLABLE ZZEX
+A2E0 YI SYLLABLE ZZE
+A2E1 YI SYLLABLE ZZEP
+A2E2 YI SYLLABLE ZZUX
+A2E3 YI SYLLABLE ZZU
+A2E4 YI SYLLABLE ZZUP
+A2E5 YI SYLLABLE ZZURX
+A2E6 YI SYLLABLE ZZUR
+A2E7 YI SYLLABLE ZZYT
+A2E8 YI SYLLABLE ZZYX
+A2E9 YI SYLLABLE ZZY
+A2EA YI SYLLABLE ZZYP
+A2EB YI SYLLABLE ZZYRX
+A2EC YI SYLLABLE ZZYR
+A2ED YI SYLLABLE NZIT
+A2EE YI SYLLABLE NZIX
+A2EF YI SYLLABLE NZI
+A2F0 YI SYLLABLE NZIP
+A2F1 YI SYLLABLE NZIEX
+A2F2 YI SYLLABLE NZIE
+A2F3 YI SYLLABLE NZIEP
+A2F4 YI SYLLABLE NZAT
+A2F5 YI SYLLABLE NZAX
+A2F6 YI SYLLABLE NZA
+A2F7 YI SYLLABLE NZAP
+A2F8 YI SYLLABLE NZUOX
+A2F9 YI SYLLABLE NZUO
+A2FA YI SYLLABLE NZOX
+A2FB YI SYLLABLE NZOP
+A2FC YI SYLLABLE NZEX
+A2FD YI SYLLABLE NZE
+A2FE YI SYLLABLE NZUX
+A2FF YI SYLLABLE NZU
+A300 YI SYLLABLE NZUP
+A301 YI SYLLABLE NZURX
+A302 YI SYLLABLE NZUR
+A303 YI SYLLABLE NZYT
+A304 YI SYLLABLE NZYX
+A305 YI SYLLABLE NZY
+A306 YI SYLLABLE NZYP
+A307 YI SYLLABLE NZYRX
+A308 YI SYLLABLE NZYR
+A309 YI SYLLABLE SIT
+A30A YI SYLLABLE SIX
+A30B YI SYLLABLE SI
+A30C YI SYLLABLE SIP
+A30D YI SYLLABLE SIEX
+A30E YI SYLLABLE SIE
+A30F YI SYLLABLE SIEP
+A310 YI SYLLABLE SAT
+A311 YI SYLLABLE SAX
+A312 YI SYLLABLE SA
+A313 YI SYLLABLE SAP
+A314 YI SYLLABLE SUOX
+A315 YI SYLLABLE SUO
+A316 YI SYLLABLE SUOP
+A317 YI SYLLABLE SOT
+A318 YI SYLLABLE SOX
+A319 YI SYLLABLE SO
+A31A YI SYLLABLE SOP
+A31B YI SYLLABLE SEX
+A31C YI SYLLABLE SE
+A31D YI SYLLABLE SEP
+A31E YI SYLLABLE SUT
+A31F YI SYLLABLE SUX
+A320 YI SYLLABLE SU
+A321 YI SYLLABLE SUP
+A322 YI SYLLABLE SURX
+A323 YI SYLLABLE SUR
+A324 YI SYLLABLE SYT
+A325 YI SYLLABLE SYX
+A326 YI SYLLABLE SY
+A327 YI SYLLABLE SYP
+A328 YI SYLLABLE SYRX
+A329 YI SYLLABLE SYR
+A32A YI SYLLABLE SSIT
+A32B YI SYLLABLE SSIX
+A32C YI SYLLABLE SSI
+A32D YI SYLLABLE SSIP
+A32E YI SYLLABLE SSIEX
+A32F YI SYLLABLE SSIE
+A330 YI SYLLABLE SSIEP
+A331 YI SYLLABLE SSAT
+A332 YI SYLLABLE SSAX
+A333 YI SYLLABLE SSA
+A334 YI SYLLABLE SSAP
+A335 YI SYLLABLE SSOT
+A336 YI SYLLABLE SSOX
+A337 YI SYLLABLE SSO
+A338 YI SYLLABLE SSOP
+A339 YI SYLLABLE SSEX
+A33A YI SYLLABLE SSE
+A33B YI SYLLABLE SSEP
+A33C YI SYLLABLE SSUT
+A33D YI SYLLABLE SSUX
+A33E YI SYLLABLE SSU
+A33F YI SYLLABLE SSUP
+A340 YI SYLLABLE SSYT
+A341 YI SYLLABLE SSYX
+A342 YI SYLLABLE SSY
+A343 YI SYLLABLE SSYP
+A344 YI SYLLABLE SSYRX
+A345 YI SYLLABLE SSYR
+A346 YI SYLLABLE ZHAT
+A347 YI SYLLABLE ZHAX
+A348 YI SYLLABLE ZHA
+A349 YI SYLLABLE ZHAP
+A34A YI SYLLABLE ZHUOX
+A34B YI SYLLABLE ZHUO
+A34C YI SYLLABLE ZHUOP
+A34D YI SYLLABLE ZHOT
+A34E YI SYLLABLE ZHOX
+A34F YI SYLLABLE ZHO
+A350 YI SYLLABLE ZHOP
+A351 YI SYLLABLE ZHET
+A352 YI SYLLABLE ZHEX
+A353 YI SYLLABLE ZHE
+A354 YI SYLLABLE ZHEP
+A355 YI SYLLABLE ZHUT
+A356 YI SYLLABLE ZHUX
+A357 YI SYLLABLE ZHU
+A358 YI SYLLABLE ZHUP
+A359 YI SYLLABLE ZHURX
+A35A YI SYLLABLE ZHUR
+A35B YI SYLLABLE ZHYT
+A35C YI SYLLABLE ZHYX
+A35D YI SYLLABLE ZHY
+A35E YI SYLLABLE ZHYP
+A35F YI SYLLABLE ZHYRX
+A360 YI SYLLABLE ZHYR
+A361 YI SYLLABLE CHAT
+A362 YI SYLLABLE CHAX
+A363 YI SYLLABLE CHA
+A364 YI SYLLABLE CHAP
+A365 YI SYLLABLE CHUOT
+A366 YI SYLLABLE CHUOX
+A367 YI SYLLABLE CHUO
+A368 YI SYLLABLE CHUOP
+A369 YI SYLLABLE CHOT
+A36A YI SYLLABLE CHOX
+A36B YI SYLLABLE CHO
+A36C YI SYLLABLE CHOP
+A36D YI SYLLABLE CHET
+A36E YI SYLLABLE CHEX
+A36F YI SYLLABLE CHE
+A370 YI SYLLABLE CHEP
+A371 YI SYLLABLE CHUX
+A372 YI SYLLABLE CHU
+A373 YI SYLLABLE CHUP
+A374 YI SYLLABLE CHURX
+A375 YI SYLLABLE CHUR
+A376 YI SYLLABLE CHYT
+A377 YI SYLLABLE CHYX
+A378 YI SYLLABLE CHY
+A379 YI SYLLABLE CHYP
+A37A YI SYLLABLE CHYRX
+A37B YI SYLLABLE CHYR
+A37C YI SYLLABLE RRAX
+A37D YI SYLLABLE RRA
+A37E YI SYLLABLE RRUOX
+A37F YI SYLLABLE RRUO
+A380 YI SYLLABLE RROT
+A381 YI SYLLABLE RROX
+A382 YI SYLLABLE RRO
+A383 YI SYLLABLE RROP
+A384 YI SYLLABLE RRET
+A385 YI SYLLABLE RREX
+A386 YI SYLLABLE RRE
+A387 YI SYLLABLE RREP
+A388 YI SYLLABLE RRUT
+A389 YI SYLLABLE RRUX
+A38A YI SYLLABLE RRU
+A38B YI SYLLABLE RRUP
+A38C YI SYLLABLE RRURX
+A38D YI SYLLABLE RRUR
+A38E YI SYLLABLE RRYT
+A38F YI SYLLABLE RRYX
+A390 YI SYLLABLE RRY
+A391 YI SYLLABLE RRYP
+A392 YI SYLLABLE RRYRX
+A393 YI SYLLABLE RRYR
+A394 YI SYLLABLE NRAT
+A395 YI SYLLABLE NRAX
+A396 YI SYLLABLE NRA
+A397 YI SYLLABLE NRAP
+A398 YI SYLLABLE NROX
+A399 YI SYLLABLE NRO
+A39A YI SYLLABLE NROP
+A39B YI SYLLABLE NRET
+A39C YI SYLLABLE NREX
+A39D YI SYLLABLE NRE
+A39E YI SYLLABLE NREP
+A39F YI SYLLABLE NRUT
+A3A0 YI SYLLABLE NRUX
+A3A1 YI SYLLABLE NRU
+A3A2 YI SYLLABLE NRUP
+A3A3 YI SYLLABLE NRURX
+A3A4 YI SYLLABLE NRUR
+A3A5 YI SYLLABLE NRYT
+A3A6 YI SYLLABLE NRYX
+A3A7 YI SYLLABLE NRY
+A3A8 YI SYLLABLE NRYP
+A3A9 YI SYLLABLE NRYRX
+A3AA YI SYLLABLE NRYR
+A3AB YI SYLLABLE SHAT
+A3AC YI SYLLABLE SHAX
+A3AD YI SYLLABLE SHA
+A3AE YI SYLLABLE SHAP
+A3AF YI SYLLABLE SHUOX
+A3B0 YI SYLLABLE SHUO
+A3B1 YI SYLLABLE SHUOP
+A3B2 YI SYLLABLE SHOT
+A3B3 YI SYLLABLE SHOX
+A3B4 YI SYLLABLE SHO
+A3B5 YI SYLLABLE SHOP
+A3B6 YI SYLLABLE SHET
+A3B7 YI SYLLABLE SHEX
+A3B8 YI SYLLABLE SHE
+A3B9 YI SYLLABLE SHEP
+A3BA YI SYLLABLE SHUT
+A3BB YI SYLLABLE SHUX
+A3BC YI SYLLABLE SHU
+A3BD YI SYLLABLE SHUP
+A3BE YI SYLLABLE SHURX
+A3BF YI SYLLABLE SHUR
+A3C0 YI SYLLABLE SHYT
+A3C1 YI SYLLABLE SHYX
+A3C2 YI SYLLABLE SHY
+A3C3 YI SYLLABLE SHYP
+A3C4 YI SYLLABLE SHYRX
+A3C5 YI SYLLABLE SHYR
+A3C6 YI SYLLABLE RAT
+A3C7 YI SYLLABLE RAX
+A3C8 YI SYLLABLE RA
+A3C9 YI SYLLABLE RAP
+A3CA YI SYLLABLE RUOX
+A3CB YI SYLLABLE RUO
+A3CC YI SYLLABLE RUOP
+A3CD YI SYLLABLE ROT
+A3CE YI SYLLABLE ROX
+A3CF YI SYLLABLE RO
+A3D0 YI SYLLABLE ROP
+A3D1 YI SYLLABLE REX
+A3D2 YI SYLLABLE RE
+A3D3 YI SYLLABLE REP
+A3D4 YI SYLLABLE RUT
+A3D5 YI SYLLABLE RUX
+A3D6 YI SYLLABLE RU
+A3D7 YI SYLLABLE RUP
+A3D8 YI SYLLABLE RURX
+A3D9 YI SYLLABLE RUR
+A3DA YI SYLLABLE RYT
+A3DB YI SYLLABLE RYX
+A3DC YI SYLLABLE RY
+A3DD YI SYLLABLE RYP
+A3DE YI SYLLABLE RYRX
+A3DF YI SYLLABLE RYR
+A3E0 YI SYLLABLE JIT
+A3E1 YI SYLLABLE JIX
+A3E2 YI SYLLABLE JI
+A3E3 YI SYLLABLE JIP
+A3E4 YI SYLLABLE JIET
+A3E5 YI SYLLABLE JIEX
+A3E6 YI SYLLABLE JIE
+A3E7 YI SYLLABLE JIEP
+A3E8 YI SYLLABLE JUOT
+A3E9 YI SYLLABLE JUOX
+A3EA YI SYLLABLE JUO
+A3EB YI SYLLABLE JUOP
+A3EC YI SYLLABLE JOT
+A3ED YI SYLLABLE JOX
+A3EE YI SYLLABLE JO
+A3EF YI SYLLABLE JOP
+A3F0 YI SYLLABLE JUT
+A3F1 YI SYLLABLE JUX
+A3F2 YI SYLLABLE JU
+A3F3 YI SYLLABLE JUP
+A3F4 YI SYLLABLE JURX
+A3F5 YI SYLLABLE JUR
+A3F6 YI SYLLABLE JYT
+A3F7 YI SYLLABLE JYX
+A3F8 YI SYLLABLE JY
+A3F9 YI SYLLABLE JYP
+A3FA YI SYLLABLE JYRX
+A3FB YI SYLLABLE JYR
+A3FC YI SYLLABLE QIT
+A3FD YI SYLLABLE QIX
+A3FE YI SYLLABLE QI
+A3FF YI SYLLABLE QIP
+A400 YI SYLLABLE QIET
+A401 YI SYLLABLE QIEX
+A402 YI SYLLABLE QIE
+A403 YI SYLLABLE QIEP
+A404 YI SYLLABLE QUOT
+A405 YI SYLLABLE QUOX
+A406 YI SYLLABLE QUO
+A407 YI SYLLABLE QUOP
+A408 YI SYLLABLE QOT
+A409 YI SYLLABLE QOX
+A40A YI SYLLABLE QO
+A40B YI SYLLABLE QOP
+A40C YI SYLLABLE QUT
+A40D YI SYLLABLE QUX
+A40E YI SYLLABLE QU
+A40F YI SYLLABLE QUP
+A410 YI SYLLABLE QURX
+A411 YI SYLLABLE QUR
+A412 YI SYLLABLE QYT
+A413 YI SYLLABLE QYX
+A414 YI SYLLABLE QY
+A415 YI SYLLABLE QYP
+A416 YI SYLLABLE QYRX
+A417 YI SYLLABLE QYR
+A418 YI SYLLABLE JJIT
+A419 YI SYLLABLE JJIX
+A41A YI SYLLABLE JJI
+A41B YI SYLLABLE JJIP
+A41C YI SYLLABLE JJIET
+A41D YI SYLLABLE JJIEX
+A41E YI SYLLABLE JJIE
+A41F YI SYLLABLE JJIEP
+A420 YI SYLLABLE JJUOX
+A421 YI SYLLABLE JJUO
+A422 YI SYLLABLE JJUOP
+A423 YI SYLLABLE JJOT
+A424 YI SYLLABLE JJOX
+A425 YI SYLLABLE JJO
+A426 YI SYLLABLE JJOP
+A427 YI SYLLABLE JJUT
+A428 YI SYLLABLE JJUX
+A429 YI SYLLABLE JJU
+A42A YI SYLLABLE JJUP
+A42B YI SYLLABLE JJURX
+A42C YI SYLLABLE JJUR
+A42D YI SYLLABLE JJYT
+A42E YI SYLLABLE JJYX
+A42F YI SYLLABLE JJY
+A430 YI SYLLABLE JJYP
+A431 YI SYLLABLE NJIT
+A432 YI SYLLABLE NJIX
+A433 YI SYLLABLE NJI
+A434 YI SYLLABLE NJIP
+A435 YI SYLLABLE NJIET
+A436 YI SYLLABLE NJIEX
+A437 YI SYLLABLE NJIE
+A438 YI SYLLABLE NJIEP
+A439 YI SYLLABLE NJUOX
+A43A YI SYLLABLE NJUO
+A43B YI SYLLABLE NJOT
+A43C YI SYLLABLE NJOX
+A43D YI SYLLABLE NJO
+A43E YI SYLLABLE NJOP
+A43F YI SYLLABLE NJUX
+A440 YI SYLLABLE NJU
+A441 YI SYLLABLE NJUP
+A442 YI SYLLABLE NJURX
+A443 YI SYLLABLE NJUR
+A444 YI SYLLABLE NJYT
+A445 YI SYLLABLE NJYX
+A446 YI SYLLABLE NJY
+A447 YI SYLLABLE NJYP
+A448 YI SYLLABLE NJYRX
+A449 YI SYLLABLE NJYR
+A44A YI SYLLABLE NYIT
+A44B YI SYLLABLE NYIX
+A44C YI SYLLABLE NYI
+A44D YI SYLLABLE NYIP
+A44E YI SYLLABLE NYIET
+A44F YI SYLLABLE NYIEX
+A450 YI SYLLABLE NYIE
+A451 YI SYLLABLE NYIEP
+A452 YI SYLLABLE NYUOX
+A453 YI SYLLABLE NYUO
+A454 YI SYLLABLE NYUOP
+A455 YI SYLLABLE NYOT
+A456 YI SYLLABLE NYOX
+A457 YI SYLLABLE NYO
+A458 YI SYLLABLE NYOP
+A459 YI SYLLABLE NYUT
+A45A YI SYLLABLE NYUX
+A45B YI SYLLABLE NYU
+A45C YI SYLLABLE NYUP
+A45D YI SYLLABLE XIT
+A45E YI SYLLABLE XIX
+A45F YI SYLLABLE XI
+A460 YI SYLLABLE XIP
+A461 YI SYLLABLE XIET
+A462 YI SYLLABLE XIEX
+A463 YI SYLLABLE XIE
+A464 YI SYLLABLE XIEP
+A465 YI SYLLABLE XUOX
+A466 YI SYLLABLE XUO
+A467 YI SYLLABLE XOT
+A468 YI SYLLABLE XOX
+A469 YI SYLLABLE XO
+A46A YI SYLLABLE XOP
+A46B YI SYLLABLE XYT
+A46C YI SYLLABLE XYX
+A46D YI SYLLABLE XY
+A46E YI SYLLABLE XYP
+A46F YI SYLLABLE XYRX
+A470 YI SYLLABLE XYR
+A471 YI SYLLABLE YIT
+A472 YI SYLLABLE YIX
+A473 YI SYLLABLE YI
+A474 YI SYLLABLE YIP
+A475 YI SYLLABLE YIET
+A476 YI SYLLABLE YIEX
+A477 YI SYLLABLE YIE
+A478 YI SYLLABLE YIEP
+A479 YI SYLLABLE YUOT
+A47A YI SYLLABLE YUOX
+A47B YI SYLLABLE YUO
+A47C YI SYLLABLE YUOP
+A47D YI SYLLABLE YOT
+A47E YI SYLLABLE YOX
+A47F YI SYLLABLE YO
+A480 YI SYLLABLE YOP
+A481 YI SYLLABLE YUT
+A482 YI SYLLABLE YUX
+A483 YI SYLLABLE YU
+A484 YI SYLLABLE YUP
+A485 YI SYLLABLE YURX
+A486 YI SYLLABLE YUR
+A487 YI SYLLABLE YYT
+A488 YI SYLLABLE YYX
+A489 YI SYLLABLE YY
+A48A YI SYLLABLE YYP
+A48B YI SYLLABLE YYRX
+A48C YI SYLLABLE YYR
+@@ A490 Yi Radicals A4CF
+@ Yi radicals
+@+ Yi radicals are named based on the Yi syllable their shape is abstracted from. This is illustrated with crossreferences for the first two radicals.
+A490 YI RADICAL QOT
+ x (yi syllable qot - A408)
+A491 YI RADICAL LI
+ x (yi syllable li - A1B9)
+A492 YI RADICAL KIT
+A493 YI RADICAL NYIP
+A494 YI RADICAL CYP
+A495 YI RADICAL SSI
+A496 YI RADICAL GGOP
+A497 YI RADICAL GEP
+A498 YI RADICAL MI
+A499 YI RADICAL HXIT
+A49A YI RADICAL LYR
+A49B YI RADICAL BBUT
+A49C YI RADICAL MOP
+A49D YI RADICAL YO
+A49E YI RADICAL PUT
+A49F YI RADICAL HXUO
+A4A0 YI RADICAL TAT
+A4A1 YI RADICAL GA
+A4A2 YI RADICAL ZUP
+A4A3 YI RADICAL CYT
+A4A4 YI RADICAL DDUR
+A4A5 YI RADICAL BUR
+A4A6 YI RADICAL GGUO
+A4A7 YI RADICAL NYOP
+A4A8 YI RADICAL TU
+A4A9 YI RADICAL OP
+A4AA YI RADICAL JJUT
+A4AB YI RADICAL ZOT
+A4AC YI RADICAL PYT
+A4AD YI RADICAL HMO
+A4AE YI RADICAL YIT
+A4AF YI RADICAL VUR
+A4B0 YI RADICAL SHY
+A4B1 YI RADICAL VEP
+A4B2 YI RADICAL ZA
+A4B3 YI RADICAL JO
+A4B4 YI RADICAL NZUP
+A4B5 YI RADICAL JJY
+A4B6 YI RADICAL GOT
+A4B7 YI RADICAL JJIE
+A4B8 YI RADICAL WO
+A4B9 YI RADICAL DU
+A4BA YI RADICAL SHUR
+A4BB YI RADICAL LIE
+A4BC YI RADICAL CY
+A4BD YI RADICAL CUOP
+A4BE YI RADICAL CIP
+A4BF YI RADICAL HXOP
+A4C0 YI RADICAL SHAT
+A4C1 YI RADICAL ZUR
+A4C2 YI RADICAL SHOP
+A4C3 YI RADICAL CHE
+A4C4 YI RADICAL ZZIET
+A4C5 YI RADICAL NBIE
+A4C6 YI RADICAL KE
+@@ A500 Vai A63F
+@ Syllables in -ee
+A500 VAI SYLLABLE EE
+A501 VAI SYLLABLE EEN
+A502 VAI SYLLABLE HEE
+A503 VAI SYLLABLE WEE
+A504 VAI SYLLABLE WEEN
+A505 VAI SYLLABLE PEE
+A506 VAI SYLLABLE BHEE
+A507 VAI SYLLABLE BEE
+A508 VAI SYLLABLE MBEE
+A509 VAI SYLLABLE KPEE
+A50A VAI SYLLABLE MGBEE
+A50B VAI SYLLABLE GBEE
+A50C VAI SYLLABLE FEE
+A50D VAI SYLLABLE VEE
+A50E VAI SYLLABLE TEE
+A50F VAI SYLLABLE THEE
+A510 VAI SYLLABLE DHEE
+A511 VAI SYLLABLE DHHEE
+A512 VAI SYLLABLE LEE
+A513 VAI SYLLABLE REE
+A514 VAI SYLLABLE DEE
+ * read as logogram deeng "child, small" in the Book of Ndole
+@ Syllables in -i
+A515 VAI SYLLABLE NDEE
+A516 VAI SYLLABLE SEE
+A517 VAI SYLLABLE SHEE
+A518 VAI SYLLABLE ZEE
+A519 VAI SYLLABLE ZHEE
+A51A VAI SYLLABLE CEE
+A51B VAI SYLLABLE JEE
+A51C VAI SYLLABLE NJEE
+A51D VAI SYLLABLE YEE
+A51E VAI SYLLABLE KEE
+A51F VAI SYLLABLE NGGEE
+A520 VAI SYLLABLE GEE
+A521 VAI SYLLABLE MEE
+A522 VAI SYLLABLE NEE
+A523 VAI SYLLABLE NYEE
+A524 VAI SYLLABLE I
+A525 VAI SYLLABLE IN
+A526 VAI SYLLABLE HI
+A527 VAI SYLLABLE HIN
+A528 VAI SYLLABLE WI
+A529 VAI SYLLABLE WIN
+A52A VAI SYLLABLE PI
+A52B VAI SYLLABLE BHI
+A52C VAI SYLLABLE BI
+A52D VAI SYLLABLE MBI
+A52E VAI SYLLABLE KPI
+A52F VAI SYLLABLE MGBI
+A530 VAI SYLLABLE GBI
+A531 VAI SYLLABLE FI
+A532 VAI SYLLABLE VI
+A533 VAI SYLLABLE TI
+A534 VAI SYLLABLE THI
+A535 VAI SYLLABLE DHI
+A536 VAI SYLLABLE DHHI
+A537 VAI SYLLABLE LI
+A538 VAI SYLLABLE RI
+A539 VAI SYLLABLE DI
+A53A VAI SYLLABLE NDI
+A53B VAI SYLLABLE SI
+A53C VAI SYLLABLE SHI
+A53D VAI SYLLABLE ZI
+A53E VAI SYLLABLE ZHI
+A53F VAI SYLLABLE CI
+A540 VAI SYLLABLE JI
+A541 VAI SYLLABLE NJI
+A542 VAI SYLLABLE YI
+A543 VAI SYLLABLE KI
+A544 VAI SYLLABLE NGGI
+A545 VAI SYLLABLE GI
+A546 VAI SYLLABLE MI
+A547 VAI SYLLABLE NI
+A548 VAI SYLLABLE NYI
+@ Syllables in -a
+A549 VAI SYLLABLE A
+A54A VAI SYLLABLE AN
+A54B VAI SYLLABLE NGAN
+A54C VAI SYLLABLE HA
+A54D VAI SYLLABLE HAN
+A54E VAI SYLLABLE WA
+A54F VAI SYLLABLE WAN
+A550 VAI SYLLABLE PA
+A551 VAI SYLLABLE BHA
+A552 VAI SYLLABLE BA
+A553 VAI SYLLABLE MBA
+A554 VAI SYLLABLE KPA
+A555 VAI SYLLABLE KPAN
+A556 VAI SYLLABLE MGBA
+A557 VAI SYLLABLE GBA
+A558 VAI SYLLABLE FA
+ x (vai syllable ndole fa - A610)
+A559 VAI SYLLABLE VA
+A55A VAI SYLLABLE TA
+A55B VAI SYLLABLE THA
+A55C VAI SYLLABLE DHA
+A55D VAI SYLLABLE DHHA
+A55E VAI SYLLABLE LA
+A55F VAI SYLLABLE RA
+A560 VAI SYLLABLE DA
+A561 VAI SYLLABLE NDA
+A562 VAI SYLLABLE SA
+A563 VAI SYLLABLE SHA
+A564 VAI SYLLABLE ZA
+A565 VAI SYLLABLE ZHA
+A566 VAI SYLLABLE CA
+A567 VAI SYLLABLE JA
+A568 VAI SYLLABLE NJA
+A569 VAI SYLLABLE YA
+A56A VAI SYLLABLE KA
+ * read as logogram kai "man" in the Book of Ndole
+ x (vai syllable ndole ka - A611)
+A56B VAI SYLLABLE KAN
+A56C VAI SYLLABLE NGGA
+A56D VAI SYLLABLE GA
+A56E VAI SYLLABLE MA
+ x (vai syllable ndole ma - A62A)
+A56F VAI SYLLABLE NA
+A570 VAI SYLLABLE NYA
+@ Syllables in -oo
+A571 VAI SYLLABLE OO
+A572 VAI SYLLABLE OON
+A573 VAI SYLLABLE HOO
+A574 VAI SYLLABLE WOO
+A575 VAI SYLLABLE WOON
+A576 VAI SYLLABLE POO
+A577 VAI SYLLABLE BHOO
+A578 VAI SYLLABLE BOO
+A579 VAI SYLLABLE MBOO
+A57A VAI SYLLABLE KPOO
+A57B VAI SYLLABLE MGBOO
+A57C VAI SYLLABLE GBOO
+A57D VAI SYLLABLE FOO
+A57E VAI SYLLABLE VOO
+A57F VAI SYLLABLE TOO
+A580 VAI SYLLABLE THOO
+A581 VAI SYLLABLE DHOO
+A582 VAI SYLLABLE DHHOO
+A583 VAI SYLLABLE LOO
+A584 VAI SYLLABLE ROO
+A585 VAI SYLLABLE DOO
+A586 VAI SYLLABLE NDOO
+A587 VAI SYLLABLE SOO
+ x (vai syllable ndole soo - A612)
+A588 VAI SYLLABLE SHOO
+A589 VAI SYLLABLE ZOO
+A58A VAI SYLLABLE ZHOO
+A58B VAI SYLLABLE COO
+A58C VAI SYLLABLE JOO
+A58D VAI SYLLABLE NJOO
+A58E VAI SYLLABLE YOO
+A58F VAI SYLLABLE KOO
+A590 VAI SYLLABLE NGGOO
+A591 VAI SYLLABLE GOO
+A592 VAI SYLLABLE MOO
+A593 VAI SYLLABLE NOO
+A594 VAI SYLLABLE NYOO
+@ Syllables in -u
+A595 VAI SYLLABLE U
+A596 VAI SYLLABLE UN
+A597 VAI SYLLABLE HU
+A598 VAI SYLLABLE HUN
+A599 VAI SYLLABLE WU
+A59A VAI SYLLABLE WUN
+A59B VAI SYLLABLE PU
+A59C VAI SYLLABLE BHU
+A59D VAI SYLLABLE BU
+A59E VAI SYLLABLE MBU
+A59F VAI SYLLABLE KPU
+A5A0 VAI SYLLABLE MGBU
+A5A1 VAI SYLLABLE GBU
+A5A2 VAI SYLLABLE FU
+A5A3 VAI SYLLABLE VU
+A5A4 VAI SYLLABLE TU
+A5A5 VAI SYLLABLE THU
+A5A6 VAI SYLLABLE DHU
+A5A7 VAI SYLLABLE DHHU
+A5A8 VAI SYLLABLE LU
+A5A9 VAI SYLLABLE RU
+A5AA VAI SYLLABLE DU
+A5AB VAI SYLLABLE NDU
+A5AC VAI SYLLABLE SU
+A5AD VAI SYLLABLE SHU
+A5AE VAI SYLLABLE ZU
+A5AF VAI SYLLABLE ZHU
+A5B0 VAI SYLLABLE CU
+A5B1 VAI SYLLABLE JU
+A5B2 VAI SYLLABLE NJU
+A5B3 VAI SYLLABLE YU
+A5B4 VAI SYLLABLE KU
+A5B5 VAI SYLLABLE NGGU
+A5B6 VAI SYLLABLE GU
+A5B7 VAI SYLLABLE MU
+A5B8 VAI SYLLABLE NU
+A5B9 VAI SYLLABLE NYU
+@ Syllables in -o
+A5BA VAI SYLLABLE O
+A5BB VAI SYLLABLE ON
+A5BC VAI SYLLABLE NGON
+A5BD VAI SYLLABLE HO
+A5BE VAI SYLLABLE HON
+A5BF VAI SYLLABLE WO
+A5C0 VAI SYLLABLE WON
+A5C1 VAI SYLLABLE PO
+A5C2 VAI SYLLABLE BHO
+A5C3 VAI SYLLABLE BO
+A5C4 VAI SYLLABLE MBO
+A5C5 VAI SYLLABLE KPO
+A5C6 VAI SYLLABLE MGBO
+A5C7 VAI SYLLABLE GBO
+A5C8 VAI SYLLABLE GBON
+A5C9 VAI SYLLABLE FO
+A5CA VAI SYLLABLE VO
+A5CB VAI SYLLABLE TO
+A5CC VAI SYLLABLE THO
+A5CD VAI SYLLABLE DHO
+A5CE VAI SYLLABLE DHHO
+A5CF VAI SYLLABLE LO
+A5D0 VAI SYLLABLE RO
+A5D1 VAI SYLLABLE DO
+ * read as logogram lo "in" in the Book of Ndole
+ x (vai syllable ndole do - A62B)
+A5D2 VAI SYLLABLE NDO
+A5D3 VAI SYLLABLE SO
+A5D4 VAI SYLLABLE SHO
+A5D5 VAI SYLLABLE ZO
+A5D6 VAI SYLLABLE ZHO
+A5D7 VAI SYLLABLE CO
+A5D8 VAI SYLLABLE JO
+A5D9 VAI SYLLABLE NJO
+A5DA VAI SYLLABLE YO
+A5DB VAI SYLLABLE KO
+A5DC VAI SYLLABLE NGGO
+A5DD VAI SYLLABLE GO
+A5DE VAI SYLLABLE MO
+A5DF VAI SYLLABLE NO
+A5E0 VAI SYLLABLE NYO
+@ Syllables in -e
+A5E1 VAI SYLLABLE E
+A5E2 VAI SYLLABLE EN
+A5E3 VAI SYLLABLE NGEN
+A5E4 VAI SYLLABLE HE
+A5E5 VAI SYLLABLE HEN
+A5E6 VAI SYLLABLE WE
+A5E7 VAI SYLLABLE WEN
+A5E8 VAI SYLLABLE PE
+A5E9 VAI SYLLABLE BHE
+A5EA VAI SYLLABLE BE
+A5EB VAI SYLLABLE MBE
+A5EC VAI SYLLABLE KPE
+A5ED VAI SYLLABLE KPEN
+A5EE VAI SYLLABLE MGBE
+A5EF VAI SYLLABLE GBE
+A5F0 VAI SYLLABLE GBEN
+A5F1 VAI SYLLABLE FE
+A5F2 VAI SYLLABLE VE
+A5F3 VAI SYLLABLE TE
+A5F4 VAI SYLLABLE THE
+A5F5 VAI SYLLABLE DHE
+A5F6 VAI SYLLABLE DHHE
+A5F7 VAI SYLLABLE LE
+A5F8 VAI SYLLABLE RE
+A5F9 VAI SYLLABLE DE
+A5FA VAI SYLLABLE NDE
+A5FB VAI SYLLABLE SE
+A5FC VAI SYLLABLE SHE
+A5FD VAI SYLLABLE ZE
+A5FE VAI SYLLABLE ZHE
+A5FF VAI SYLLABLE CE
+A600 VAI SYLLABLE JE
+A601 VAI SYLLABLE NJE
+A602 VAI SYLLABLE YE
+A603 VAI SYLLABLE KE
+A604 VAI SYLLABLE NGGE
+A605 VAI SYLLABLE NGGEN
+A606 VAI SYLLABLE GE
+A607 VAI SYLLABLE GEN
+A608 VAI SYLLABLE ME
+A609 VAI SYLLABLE NE
+A60A VAI SYLLABLE NYE
+@ Syllable finals
+A60B VAI SYLLABLE NG
+A60C VAI SYLLABLE LENGTHENER
+@ Punctuation
+A60D VAI COMMA
+A60E VAI FULL STOP
+A60F VAI QUESTION MARK
+@ Historic syllables
+A610 VAI SYLLABLE NDOLE FA
+ x (vai syllable fa - A558)
+A611 VAI SYLLABLE NDOLE KA
+ x (vai syllable ka - A56A)
+A612 VAI SYLLABLE NDOLE SOO
+ x (vai syllable soo - A587)
+@ Logograms
+A613 VAI SYMBOL FEENG
+ * logogram for "thing"
+A614 VAI SYMBOL KEENG
+ * logogram for "foot"
+A615 VAI SYMBOL TING
+ * logogram for "island"
+A616 VAI SYMBOL NII
+ * logogram for "cow"
+ * also logogram for kpe kowu "case of gin"
+A617 VAI SYMBOL BANG
+ * logogram for "finished"
+A618 VAI SYMBOL FAA
+ * logogram for "die, kill"
+A619 VAI SYMBOL TAA
+ * logogram for "go, carry, journey"
+A61A VAI SYMBOL DANG
+ * logogram for "hear, understand"
+A61B VAI SYMBOL DOONG
+ * logogram for "enter"
+A61C VAI SYMBOL KUNG
+ * logogram for "head, be able"
+A61D VAI SYMBOL TONG
+ * logogram for "be named"
+A61E VAI SYMBOL DO-O
+ * logogram for "be small"
+A61F VAI SYMBOL JONG
+ * logogram for "slave"
+@ Digits
+@+ These are not in modern use.
+A620 VAI DIGIT ZERO
+A621 VAI DIGIT ONE
+A622 VAI DIGIT TWO
+A623 VAI DIGIT THREE
+A624 VAI DIGIT FOUR
+A625 VAI DIGIT FIVE
+A626 VAI DIGIT SIX
+A627 VAI DIGIT SEVEN
+A628 VAI DIGIT EIGHT
+A629 VAI DIGIT NINE
+@ Historic syllables
+A62A VAI SYLLABLE NDOLE MA
+ x (vai syllable ma - A56E)
+A62B VAI SYLLABLE NDOLE DO
+ x (vai syllable do - A5D1)
+@@ A640 Cyrillic Extended-B A69F
+@ Letters for Old Cyrillic
+A640 CYRILLIC CAPITAL LETTER ZEMLYA
+A641 CYRILLIC SMALL LETTER ZEMLYA
+ x (cyrillic small letter ze - 0437)
+A642 CYRILLIC CAPITAL LETTER DZELO
+A643 CYRILLIC SMALL LETTER DZELO
+ x (cyrillic small letter dze - 0455)
+A644 CYRILLIC CAPITAL LETTER REVERSED DZE
+ x (roman sextula sign - 10193)
+A645 CYRILLIC SMALL LETTER REVERSED DZE
+A646 CYRILLIC CAPITAL LETTER IOTA
+A647 CYRILLIC SMALL LETTER IOTA
+ x (glagolitic small letter initial izhe - 2C3A)
+A648 CYRILLIC CAPITAL LETTER DJERV
+A649 CYRILLIC SMALL LETTER DJERV
+ x (cyrillic small letter dje - 0452)
+ x (cyrillic small letter tshe - 045B)
+A64A CYRILLIC CAPITAL LETTER MONOGRAPH UK
+A64B CYRILLIC SMALL LETTER MONOGRAPH UK
+ x (cyrillic small letter u - 0443)
+A64C CYRILLIC CAPITAL LETTER BROAD OMEGA
+A64D CYRILLIC SMALL LETTER BROAD OMEGA
+ x (cyrillic small letter omega - 0461)
+A64E CYRILLIC CAPITAL LETTER NEUTRAL YER
+A64F CYRILLIC SMALL LETTER NEUTRAL YER
+ x (cyrillic small letter hard sign - 044A)
+ x (cyrillic small letter soft sign - 044C)
+A650 CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+A651 CYRILLIC SMALL LETTER YERU WITH BACK YER
+ x (cyrillic small letter yeru - 044B)
+A652 CYRILLIC CAPITAL LETTER IOTIFIED YAT
+A653 CYRILLIC SMALL LETTER IOTIFIED YAT
+ x (cyrillic small letter yat - 0463)
+A654 CYRILLIC CAPITAL LETTER REVERSED YU
+A655 CYRILLIC SMALL LETTER REVERSED YU
+ x (cyrillic small letter yu - 044E)
+A656 CYRILLIC CAPITAL LETTER IOTIFIED A
+A657 CYRILLIC SMALL LETTER IOTIFIED A
+ x (cyrillic small letter iotified little yus - 0469)
+A658 CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+A659 CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+ x (cyrillic small letter little yus - 0467)
+A65A CYRILLIC CAPITAL LETTER BLENDED YUS
+A65B CYRILLIC SMALL LETTER BLENDED YUS
+ x (cyrillic small letter little yus - 0467)
+ x (cyrillic small letter big yus - 046B)
+A65C CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+A65D CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+ x (cyrillic small letter iotified little yus - 0469)
+A65E CYRILLIC CAPITAL LETTER YN
+A65F CYRILLIC SMALL LETTER YN
+ * Romanian Cyrillic
+A662 CYRILLIC CAPITAL LETTER SOFT DE
+A663 CYRILLIC SMALL LETTER SOFT DE
+A664 CYRILLIC CAPITAL LETTER SOFT EL
+A665 CYRILLIC SMALL LETTER SOFT EL
+A666 CYRILLIC CAPITAL LETTER SOFT EM
+A667 CYRILLIC SMALL LETTER SOFT EM
+A668 CYRILLIC CAPITAL LETTER MONOCULAR O
+A669 CYRILLIC SMALL LETTER MONOCULAR O
+ * used in words based on the root for 'eye'
+A66A CYRILLIC CAPITAL LETTER BINOCULAR O
+A66B CYRILLIC SMALL LETTER BINOCULAR O
+ * used in the dual of words based on the root for 'eye'
+A66C CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+A66D CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+ * used in the dual of words based on the root for 'eye'
+A66E CYRILLIC LETTER MULTIOCULAR O
+ * used in the epithet 'many-eyed'
+@ Abbreviation mark
+A66F COMBINING CYRILLIC VZMET
+ * used with Cyrillic letters and letter titlos to indicate abbreviation
+ x (combining cyrillic titlo - 0483)
+ x (combining cyrillic pokrytie - 0487)
+@ Combining numeric signs
+A670 COMBINING CYRILLIC TEN MILLIONS SIGN
+ x (combining cyrillic millions sign - 0489)
+A671 COMBINING CYRILLIC HUNDRED MILLIONS SIGN
+A672 COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+@ Punctuation mark
+A673 SLAVONIC ASTERISK
+@ Combining marks for Old Cyrillic
+A67C COMBINING CYRILLIC KAVYKA
+ * indicates an alternative reading to part of a word
+ x (combining breve - 0306)
+A67D COMBINING CYRILLIC PAYEROK
+ * indicates an omitted yer
+ x (combining vertical tilde - 033E)
+@ Punctuation mark
+A67E CYRILLIC KAVYKA
+ * used to mark off word that has alternative reading
+@ Modifier letter
+A67F CYRILLIC PAYEROK
+ * indicates an omitted yer
+ x (vertical tilde - 2E2F)
+@ Letters for Old Abkhasian orthography
+A680 CYRILLIC CAPITAL LETTER DWE
+A681 CYRILLIC SMALL LETTER DWE
+A682 CYRILLIC CAPITAL LETTER DZWE
+A683 CYRILLIC SMALL LETTER DZWE
+A684 CYRILLIC CAPITAL LETTER ZHWE
+A685 CYRILLIC SMALL LETTER ZHWE
+A686 CYRILLIC CAPITAL LETTER CCHE
+A687 CYRILLIC SMALL LETTER CCHE
+A688 CYRILLIC CAPITAL LETTER DZZE
+A689 CYRILLIC SMALL LETTER DZZE
+A68A CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+A68B CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+A68C CYRILLIC CAPITAL LETTER TWE
+A68D CYRILLIC SMALL LETTER TWE
+A68E CYRILLIC CAPITAL LETTER TSWE
+A68F CYRILLIC SMALL LETTER TSWE
+A690 CYRILLIC CAPITAL LETTER TSSE
+A691 CYRILLIC SMALL LETTER TSSE
+A692 CYRILLIC CAPITAL LETTER TCHE
+A693 CYRILLIC SMALL LETTER TCHE
+A694 CYRILLIC CAPITAL LETTER HWE
+A695 CYRILLIC SMALL LETTER HWE
+A696 CYRILLIC CAPITAL LETTER SHWE
+A697 CYRILLIC SMALL LETTER SHWE
+@@ A700 Modifier Tone Letters A71F
+@ Corner tone marks for Chinese
+A700 MODIFIER LETTER CHINESE TONE YIN PING
+A701 MODIFIER LETTER CHINESE TONE YANG PING
+A702 MODIFIER LETTER CHINESE TONE YIN SHANG
+A703 MODIFIER LETTER CHINESE TONE YANG SHANG
+A704 MODIFIER LETTER CHINESE TONE YIN QU
+A705 MODIFIER LETTER CHINESE TONE YANG QU
+A706 MODIFIER LETTER CHINESE TONE YIN RU
+A707 MODIFIER LETTER CHINESE TONE YANG RU
+@ Dotted tone letters
+A708 MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR
+A709 MODIFIER LETTER HIGH DOTTED TONE BAR
+A70A MODIFIER LETTER MID DOTTED TONE BAR
+A70B MODIFIER LETTER LOW DOTTED TONE BAR
+A70C MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR
+A70D MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR
+A70E MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR
+A70F MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR
+A710 MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR
+A711 MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR
+@ Left-stem tone letters
+A712 MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR
+A713 MODIFIER LETTER HIGH LEFT-STEM TONE BAR
+A714 MODIFIER LETTER MID LEFT-STEM TONE BAR
+A715 MODIFIER LETTER LOW LEFT-STEM TONE BAR
+A716 MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+@ Chinantec tone marks
+A717 MODIFIER LETTER DOT VERTICAL BAR
+A718 MODIFIER LETTER DOT SLASH
+A719 MODIFIER LETTER DOT HORIZONTAL BAR
+A71A MODIFIER LETTER LOWER RIGHT CORNER ANGLE
+@ Africanist tone letters
+A71B MODIFIER LETTER RAISED UP ARROW
+A71C MODIFIER LETTER RAISED DOWN ARROW
+A71D MODIFIER LETTER RAISED EXCLAMATION MARK
+A71E MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK
+A71F MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+@@ A720 Latin Extended-D A7FF
+@ Additions for UPA
+A720 MODIFIER LETTER STRESS AND HIGH TONE
+A721 MODIFIER LETTER STRESS AND LOW TONE
+@ Egyptological additions
+A722 LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+A723 LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+A724 LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+A725 LATIN SMALL LETTER EGYPTOLOGICAL AIN
+ * this is a case pair
+ x (latin letter ain - 1D25)
+ x (modifier letter small ain - 1D5C)
+@ Mayanist additions
+A726 LATIN CAPITAL LETTER HENG
+A727 LATIN SMALL LETTER HENG
+A728 LATIN CAPITAL LETTER TZ
+A729 LATIN SMALL LETTER TZ
+A72A LATIN CAPITAL LETTER TRESILLO
+A72B LATIN SMALL LETTER TRESILLO
+A72C LATIN CAPITAL LETTER CUATRILLO
+A72D LATIN SMALL LETTER CUATRILLO
+A72E LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+A72F LATIN SMALL LETTER CUATRILLO WITH COMMA
+@ Medievalist additions
+A730 LATIN LETTER SMALL CAPITAL F
+A731 LATIN LETTER SMALL CAPITAL S
+A732 LATIN CAPITAL LETTER AA
+A733 LATIN SMALL LETTER AA
+A734 LATIN CAPITAL LETTER AO
+A735 LATIN SMALL LETTER AO
+A736 LATIN CAPITAL LETTER AU
+A737 LATIN SMALL LETTER AU
+A738 LATIN CAPITAL LETTER AV
+A739 LATIN SMALL LETTER AV
+A73A LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+A73B LATIN SMALL LETTER AV WITH HORIZONTAL BAR
+A73C LATIN CAPITAL LETTER AY
+A73D LATIN SMALL LETTER AY
+A73E LATIN CAPITAL LETTER REVERSED C WITH DOT
+A73F LATIN SMALL LETTER REVERSED C WITH DOT
+A740 LATIN CAPITAL LETTER K WITH STROKE
+A741 LATIN SMALL LETTER K WITH STROKE
+A742 LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+A743 LATIN SMALL LETTER K WITH DIAGONAL STROKE
+A744 LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+A745 LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+A746 LATIN CAPITAL LETTER BROKEN L
+A747 LATIN SMALL LETTER BROKEN L
+A748 LATIN CAPITAL LETTER L WITH HIGH STROKE
+A749 LATIN SMALL LETTER L WITH HIGH STROKE
+A74A LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+A74B LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+A74C LATIN CAPITAL LETTER O WITH LOOP
+A74D LATIN SMALL LETTER O WITH LOOP
+A74E LATIN CAPITAL LETTER OO
+A74F LATIN SMALL LETTER OO
+A750 LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+A751 LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+A752 LATIN CAPITAL LETTER P WITH FLOURISH
+A753 LATIN SMALL LETTER P WITH FLOURISH
+A754 LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+A755 LATIN SMALL LETTER P WITH SQUIRREL TAIL
+A756 LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+A757 LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+A758 LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+A759 LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+A75A LATIN CAPITAL LETTER R ROTUNDA
+A75B LATIN SMALL LETTER R ROTUNDA
+A75C LATIN CAPITAL LETTER RUM ROTUNDA
+A75D LATIN SMALL LETTER RUM ROTUNDA
+A75E LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+A75F LATIN SMALL LETTER V WITH DIAGONAL STROKE
+A760 LATIN CAPITAL LETTER VY
+A761 LATIN SMALL LETTER VY
+A762 LATIN CAPITAL LETTER VISIGOTHIC Z
+A763 LATIN SMALL LETTER VISIGOTHIC Z
+A764 LATIN CAPITAL LETTER THORN WITH STROKE
+A765 LATIN SMALL LETTER THORN WITH STROKE
+A766 LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+A767 LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+A768 LATIN CAPITAL LETTER VEND
+A769 LATIN SMALL LETTER VEND
+A76A LATIN CAPITAL LETTER ET
+A76B LATIN SMALL LETTER ET
+A76C LATIN CAPITAL LETTER IS
+A76D LATIN SMALL LETTER IS
+A76E LATIN CAPITAL LETTER CON
+A76F LATIN SMALL LETTER CON
+A770 MODIFIER LETTER US
+ # <super> A76F
+A771 LATIN SMALL LETTER DUM
+A772 LATIN SMALL LETTER LUM
+A773 LATIN SMALL LETTER MUM
+A774 LATIN SMALL LETTER NUM
+A775 LATIN SMALL LETTER RUM
+A776 LATIN LETTER SMALL CAPITAL RUM
+A777 LATIN SMALL LETTER TUM
+A778 LATIN SMALL LETTER UM
+@ Insular and Celticist letters
+A779 LATIN CAPITAL LETTER INSULAR D
+A77A LATIN SMALL LETTER INSULAR D
+A77B LATIN CAPITAL LETTER INSULAR F
+A77C LATIN SMALL LETTER INSULAR F
+A77D LATIN CAPITAL LETTER INSULAR G
+ * lowercase is 1D79
+A77E LATIN CAPITAL LETTER TURNED INSULAR G
+A77F LATIN SMALL LETTER TURNED INSULAR G
+A780 LATIN CAPITAL LETTER TURNED L
+A781 LATIN SMALL LETTER TURNED L
+A782 LATIN CAPITAL LETTER INSULAR R
+A783 LATIN SMALL LETTER INSULAR R
+A784 LATIN CAPITAL LETTER INSULAR S
+A785 LATIN SMALL LETTER INSULAR S
+A786 LATIN CAPITAL LETTER INSULAR T
+A787 LATIN SMALL LETTER INSULAR T
+@ Modifier letters
+A788 MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+ x (modifier letter circumflex accent - 02C6)
+ x (caret - 2038)
+A789 MODIFIER LETTER COLON
+ * used as a tone letter in some orthographies
+ * Budu (Congo), Sabaot (Kenya), and several Papua New Guinea languages
+ x (colon - 003A)
+A78A MODIFIER LETTER SHORT EQUALS SIGN
+ * used as a tone letter in some orthographies
+ * Budu (Congo)
+ x (equals sign - 003D)
+@ Orthographic letters for glottals
+A78B LATIN CAPITAL LETTER SALTILLO
+A78C LATIN SMALL LETTER SALTILLO
+ * saltillos are used as a casing pair for glottal stop in some orthographies
+ * Huasteco and other languages of Mexico, Izere (Nigeria)
+ x (apostrophe - 0027)
+ x (latin small letter glottal stop - 0242)
+ x (latin letter glottal stop - 0294)
+ x (modifier letter apostrophe - 02BC)
+ x (modifier letter glottal stop - 02C0)
+@ Ancient Roman epigraphic letters
+A7FB LATIN EPIGRAPHIC LETTER REVERSED F
+A7FC LATIN EPIGRAPHIC LETTER REVERSED P
+A7FD LATIN EPIGRAPHIC LETTER INVERTED M
+A7FE LATIN EPIGRAPHIC LETTER I LONGA
+A7FF LATIN EPIGRAPHIC LETTER ARCHAIC M
+@@ A800 Syloti Nagri A82F
+@ Independent vowels and dvisvara
+A800 SYLOTI NAGRI LETTER A
+A801 SYLOTI NAGRI LETTER I
+A802 SYLOTI NAGRI SIGN DVISVARA
+A803 SYLOTI NAGRI LETTER U
+A804 SYLOTI NAGRI LETTER E
+A805 SYLOTI NAGRI LETTER O
+@ Sign
+A806 SYLOTI NAGRI SIGN HASANTA
+ = halant, virama
+@ Consonants and consonant signs
+A807 SYLOTI NAGRI LETTER KO
+A808 SYLOTI NAGRI LETTER KHO
+A809 SYLOTI NAGRI LETTER GO
+A80A SYLOTI NAGRI LETTER GHO
+A80B SYLOTI NAGRI SIGN ANUSVARA
+A80C SYLOTI NAGRI LETTER CO
+A80D SYLOTI NAGRI LETTER CHO
+A80E SYLOTI NAGRI LETTER JO
+A80F SYLOTI NAGRI LETTER JHO
+A810 SYLOTI NAGRI LETTER TTO
+A811 SYLOTI NAGRI LETTER TTHO
+A812 SYLOTI NAGRI LETTER DDO
+A813 SYLOTI NAGRI LETTER DDHO
+A814 SYLOTI NAGRI LETTER TO
+A815 SYLOTI NAGRI LETTER THO
+A816 SYLOTI NAGRI LETTER DO
+A817 SYLOTI NAGRI LETTER DHO
+A818 SYLOTI NAGRI LETTER NO
+A819 SYLOTI NAGRI LETTER PO
+A81A SYLOTI NAGRI LETTER PHO
+A81B SYLOTI NAGRI LETTER BO
+A81C SYLOTI NAGRI LETTER BHO
+A81D SYLOTI NAGRI LETTER MO
+A81E SYLOTI NAGRI LETTER RO
+A81F SYLOTI NAGRI LETTER LO
+A820 SYLOTI NAGRI LETTER RRO
+A821 SYLOTI NAGRI LETTER SO
+A822 SYLOTI NAGRI LETTER HO
+@ Dependent vowel signs
+A823 SYLOTI NAGRI VOWEL SIGN A
+A824 SYLOTI NAGRI VOWEL SIGN I
+A825 SYLOTI NAGRI VOWEL SIGN U
+A826 SYLOTI NAGRI VOWEL SIGN E
+A827 SYLOTI NAGRI VOWEL SIGN OO
+@ Poetry marks
+A828 SYLOTI NAGRI POETRY MARK-1
+A829 SYLOTI NAGRI POETRY MARK-2
+A82A SYLOTI NAGRI POETRY MARK-3
+A82B SYLOTI NAGRI POETRY MARK-4
+@@ A840 Phags-pa A87F
+@+ Phags-pa letters are used for Mongolian, Chinese, Uighur, Tibetan, and Sanskrit unless annotated with a more restricted list of languages.
+@ Consonants
+A840 PHAGS-PA LETTER KA
+ * Mongolian, Chinese, Tibetan, Sanskrit
+ x (tibetan letter ka - 0F40)
+A841 PHAGS-PA LETTER KHA
+ x (tibetan letter kha - 0F41)
+A842 PHAGS-PA LETTER GA
+ x (tibetan letter ga - 0F42)
+A843 PHAGS-PA LETTER NGA
+ * Mongolian, Chinese, Tibetan, Sanskrit
+ x (tibetan letter nga - 0F44)
+A844 PHAGS-PA LETTER CA
+ * Chinese, Tibetan
+ x (tibetan letter ca - 0F45)
+A845 PHAGS-PA LETTER CHA
+ * Mongolian, Chinese, Uighur, Tibetan
+ x (tibetan letter cha - 0F46)
+A846 PHAGS-PA LETTER JA
+ * Mongolian, Chinese, Uighur, Tibetan
+ x (tibetan letter ja - 0F47)
+A847 PHAGS-PA LETTER NYA
+ * Chinese, Tibetan, Sanskrit
+ x (tibetan letter nya - 0F49)
+A848 PHAGS-PA LETTER TA
+ * Mongolian, Chinese, Tibetan, Sanskrit
+ x (tibetan letter ta - 0F4F)
+A849 PHAGS-PA LETTER THA
+ x (tibetan letter tha - 0F50)
+A84A PHAGS-PA LETTER DA
+ x (tibetan letter da - 0F51)
+A84B PHAGS-PA LETTER NA
+ x (tibetan letter na - 0F53)
+A84C PHAGS-PA LETTER PA
+ * Mongolian, Chinese, Tibetan, Sanskrit
+ x (tibetan letter pa - 0F54)
+A84D PHAGS-PA LETTER PHA
+ * Chinese, Tibetan, Sanskrit
+ x (tibetan letter pha - 0F55)
+A84E PHAGS-PA LETTER BA
+ x (tibetan letter ba - 0F56)
+A84F PHAGS-PA LETTER MA
+ x (tibetan letter ma - 0F58)
+A850 PHAGS-PA LETTER TSA
+ * Chinese, Tibetan, Sanskrit
+ x (tibetan letter tsa - 0F59)
+A851 PHAGS-PA LETTER TSHA
+ * Mongolian, Chinese, Tibetan, Sanskrit
+ x (tibetan letter tsha - 0F5A)
+A852 PHAGS-PA LETTER DZA
+ * Chinese, Tibetan, Sanskrit
+ x (tibetan letter dza - 0F5B)
+A853 PHAGS-PA LETTER WA
+ x (tibetan letter wa - 0F5D)
+A854 PHAGS-PA LETTER ZHA
+ * Chinese, Tibetan
+ x (tibetan letter zha - 0F5E)
+A855 PHAGS-PA LETTER ZA
+ * Mongolian, Chinese, Tibetan
+ x (tibetan letter za - 0F5F)
+A856 PHAGS-PA LETTER SMALL A
+ x (tibetan letter -a - 0F60)
+A857 PHAGS-PA LETTER YA
+ x (tibetan letter ya - 0F61)
+A858 PHAGS-PA LETTER RA
+ * Mongolian, Uighur, Tibetan, Sanskrit
+ x (tibetan letter ra - 0F62)
+A859 PHAGS-PA LETTER LA
+ x (tibetan letter la - 0F63)
+A85A PHAGS-PA LETTER SHA
+ x (tibetan letter sha - 0F64)
+A85B PHAGS-PA LETTER SA
+ x (tibetan letter sa - 0F66)
+A85C PHAGS-PA LETTER HA
+ x (tibetan letter ha - 0F67)
+@ Letter A
+A85D PHAGS-PA LETTER A
+ x (tibetan letter a - 0F68)
+@ Vowels
+A85E PHAGS-PA LETTER I
+ x (tibetan vowel sign i - 0F72)
+A85F PHAGS-PA LETTER U
+ x (tibetan vowel sign u - 0F74)
+A860 PHAGS-PA LETTER E
+ x (tibetan vowel sign e - 0F7A)
+A861 PHAGS-PA LETTER O
+ x (tibetan vowel sign o - 0F7C)
+@ Consonants
+A862 PHAGS-PA LETTER QA
+ * Mongolian, Uighur
+A863 PHAGS-PA LETTER XA
+ * Mongolian, Chinese
+A864 PHAGS-PA LETTER FA
+ * Chinese, Uighur
+ x (phags-pa letter ha - A85C)
+A865 PHAGS-PA LETTER GGA
+ * language usage unknown
+ * created by reversal of A862
+@ Vowel
+A866 PHAGS-PA LETTER EE
+ * Mongolian, Chinese, Uighur
+@ Subjoined Consonants
+A867 PHAGS-PA SUBJOINED LETTER WA
+ * Chinese, Tibetan, Sanskrit
+ x (tibetan subjoined letter wa - 0FAD)
+A868 PHAGS-PA SUBJOINED LETTER YA
+ * Chinese, Tibetan, Sanskrit
+ x (tibetan subjoined letter ya - 0FB1)
+@ Consonant additions for Sanskrit
+A869 PHAGS-PA LETTER TTA
+ * Sanskrit
+ x (tibetan letter tta - 0F4A)
+A86A PHAGS-PA LETTER TTHA
+ * Sanskrit
+ x (tibetan letter ttha - 0F4B)
+A86B PHAGS-PA LETTER DDA
+ * Sanskrit
+ x (tibetan letter dda - 0F4C)
+A86C PHAGS-PA LETTER NNA
+ * Sanskrit
+ x (tibetan letter nna - 0F4E)
+@ Alternate consonant forms for Chinese
+A86D PHAGS-PA LETTER ALTERNATE YA
+ * Chinese
+ x (phags-pa letter ya - A857)
+A86E PHAGS-PA LETTER VOICELESS SHA
+ * Chinese
+ x (phags-pa letter sha - A85A)
+A86F PHAGS-PA LETTER VOICED HA
+ * Chinese
+ x (phags-pa letter ha - A85C)
+A870 PHAGS-PA LETTER ASPIRATED FA
+ * Chinese
+ x (phags-pa letter fa - A864)
+@ Subjoined consonant
+A871 PHAGS-PA SUBJOINED LETTER RA
+ * Tibetan, Sanskrit
+ x (tibetan subjoined letter ra - 0FB2)
+@ Consonant addition for Tibetan
+A872 PHAGS-PA SUPERFIXED LETTER RA
+ * Tibetan
+ x (tibetan letter ra - 0F62)
+@ Candrabindu
+A873 PHAGS-PA LETTER CANDRABINDU
+ * Sanskrit
+ x (tibetan sign sna ldan - 0F83)
+ x (tibetan sign rjes su nga ro - 0F7E)
+ x (mongolian letter ali gali anusvara one - 1880)
+@ Head marks for Tibetan
+A874 PHAGS-PA SINGLE HEAD MARK
+ * Tibetan
+ * marks beginning of text
+ x (tibetan mark initial yig mgo mdun ma - 0F04)
+ x (mongolian birga - 1800)
+A875 PHAGS-PA DOUBLE HEAD MARK
+ * Tibetan
+ * marks beginning of text
+@ Punctuation for Tibetan
+A876 PHAGS-PA MARK SHAD
+ * Tibetan
+ x (tibetan mark shad - 0F0D)
+A877 PHAGS-PA MARK DOUBLE SHAD
+ * Tibetan
+ x (tibetan mark nyis shad - 0F0E)
+@@ A880 Saurashtra A8DF
+@ Various signs
+A880 SAURASHTRA SIGN ANUSVARA
+A881 SAURASHTRA SIGN VISARGA
+@ Independent vowels
+A882 SAURASHTRA LETTER A
+A883 SAURASHTRA LETTER AA
+A884 SAURASHTRA LETTER I
+A885 SAURASHTRA LETTER II
+A886 SAURASHTRA LETTER U
+A887 SAURASHTRA LETTER UU
+A888 SAURASHTRA LETTER VOCALIC R
+A889 SAURASHTRA LETTER VOCALIC RR
+A88A SAURASHTRA LETTER VOCALIC L
+A88B SAURASHTRA LETTER VOCALIC LL
+A88C SAURASHTRA LETTER E
+A88D SAURASHTRA LETTER EE
+A88E SAURASHTRA LETTER AI
+A88F SAURASHTRA LETTER O
+A890 SAURASHTRA LETTER OO
+A891 SAURASHTRA LETTER AU
+@ Consonants
+A892 SAURASHTRA LETTER KA
+A893 SAURASHTRA LETTER KHA
+A894 SAURASHTRA LETTER GA
+A895 SAURASHTRA LETTER GHA
+A896 SAURASHTRA LETTER NGA
+A897 SAURASHTRA LETTER CA
+A898 SAURASHTRA LETTER CHA
+A899 SAURASHTRA LETTER JA
+A89A SAURASHTRA LETTER JHA
+A89B SAURASHTRA LETTER NYA
+A89C SAURASHTRA LETTER TTA
+A89D SAURASHTRA LETTER TTHA
+A89E SAURASHTRA LETTER DDA
+A89F SAURASHTRA LETTER DDHA
+A8A0 SAURASHTRA LETTER NNA
+A8A1 SAURASHTRA LETTER TA
+A8A2 SAURASHTRA LETTER THA
+A8A3 SAURASHTRA LETTER DA
+A8A4 SAURASHTRA LETTER DHA
+A8A5 SAURASHTRA LETTER NA
+A8A6 SAURASHTRA LETTER PA
+A8A7 SAURASHTRA LETTER PHA
+A8A8 SAURASHTRA LETTER BA
+A8A9 SAURASHTRA LETTER BHA
+A8AA SAURASHTRA LETTER MA
+A8AB SAURASHTRA LETTER YA
+A8AC SAURASHTRA LETTER RA
+A8AD SAURASHTRA LETTER LA
+A8AE SAURASHTRA LETTER VA
+A8AF SAURASHTRA LETTER SHA
+A8B0 SAURASHTRA LETTER SSA
+A8B1 SAURASHTRA LETTER SA
+A8B2 SAURASHTRA LETTER HA
+A8B3 SAURASHTRA LETTER LLA
+A8B4 SAURASHTRA CONSONANT SIGN HAARU
+@ Dependent vowel signs
+A8B5 SAURASHTRA VOWEL SIGN AA
+A8B6 SAURASHTRA VOWEL SIGN I
+A8B7 SAURASHTRA VOWEL SIGN II
+A8B8 SAURASHTRA VOWEL SIGN U
+A8B9 SAURASHTRA VOWEL SIGN UU
+A8BA SAURASHTRA VOWEL SIGN VOCALIC R
+A8BB SAURASHTRA VOWEL SIGN VOCALIC RR
+A8BC SAURASHTRA VOWEL SIGN VOCALIC L
+A8BD SAURASHTRA VOWEL SIGN VOCALIC LL
+A8BE SAURASHTRA VOWEL SIGN E
+A8BF SAURASHTRA VOWEL SIGN EE
+A8C0 SAURASHTRA VOWEL SIGN AI
+A8C1 SAURASHTRA VOWEL SIGN O
+A8C2 SAURASHTRA VOWEL SIGN OO
+A8C3 SAURASHTRA VOWEL SIGN AU
+@ Virama
+A8C4 SAURASHTRA SIGN VIRAMA
+@ Punctuation
+A8CE SAURASHTRA DANDA
+A8CF SAURASHTRA DOUBLE DANDA
+@ Digits
+A8D0 SAURASHTRA DIGIT ZERO
+A8D1 SAURASHTRA DIGIT ONE
+A8D2 SAURASHTRA DIGIT TWO
+A8D3 SAURASHTRA DIGIT THREE
+A8D4 SAURASHTRA DIGIT FOUR
+A8D5 SAURASHTRA DIGIT FIVE
+A8D6 SAURASHTRA DIGIT SIX
+A8D7 SAURASHTRA DIGIT SEVEN
+A8D8 SAURASHTRA DIGIT EIGHT
+A8D9 SAURASHTRA DIGIT NINE
+@@ A900 Kayah Li A92F
+@ Digits
+A900 KAYAH LI DIGIT ZERO
+A901 KAYAH LI DIGIT ONE
+A902 KAYAH LI DIGIT TWO
+A903 KAYAH LI DIGIT THREE
+A904 KAYAH LI DIGIT FOUR
+A905 KAYAH LI DIGIT FIVE
+A906 KAYAH LI DIGIT SIX
+A907 KAYAH LI DIGIT SEVEN
+A908 KAYAH LI DIGIT EIGHT
+A909 KAYAH LI DIGIT NINE
+@ Consonants
+A90A KAYAH LI LETTER KA
+A90B KAYAH LI LETTER KHA
+A90C KAYAH LI LETTER GA
+A90D KAYAH LI LETTER NGA
+A90E KAYAH LI LETTER SA
+A90F KAYAH LI LETTER SHA
+A910 KAYAH LI LETTER ZA
+A911 KAYAH LI LETTER NYA
+A912 KAYAH LI LETTER TA
+A913 KAYAH LI LETTER HTA
+A914 KAYAH LI LETTER NA
+A915 KAYAH LI LETTER PA
+A916 KAYAH LI LETTER PHA
+A917 KAYAH LI LETTER MA
+A918 KAYAH LI LETTER DA
+A919 KAYAH LI LETTER BA
+A91A KAYAH LI LETTER RA
+A91B KAYAH LI LETTER YA
+A91C KAYAH LI LETTER LA
+A91D KAYAH LI LETTER WA
+A91E KAYAH LI LETTER THA
+A91F KAYAH LI LETTER HA
+A920 KAYAH LI LETTER VA
+A921 KAYAH LI LETTER CA
+A922 KAYAH LI LETTER A
+A923 KAYAH LI LETTER OE
+A924 KAYAH LI LETTER I
+A925 KAYAH LI LETTER OO
+@ Vowels
+A926 KAYAH LI VOWEL UE
+A927 KAYAH LI VOWEL E
+A928 KAYAH LI VOWEL U
+A929 KAYAH LI VOWEL EE
+A92A KAYAH LI VOWEL O
+@ Tone marks
+A92B KAYAH LI TONE PLOPHU
+A92C KAYAH LI TONE CALYA
+A92D KAYAH LI TONE CALYA PLOPHU
+@ Punctuation
+A92E KAYAH LI SIGN CWI
+A92F KAYAH LI SIGN SHYA
+@@ A930 Rejang A95F
+@ Consonants
+A930 REJANG LETTER KA
+A931 REJANG LETTER GA
+A932 REJANG LETTER NGA
+A933 REJANG LETTER TA
+A934 REJANG LETTER DA
+A935 REJANG LETTER NA
+A936 REJANG LETTER PA
+A937 REJANG LETTER BA
+A938 REJANG LETTER MA
+A939 REJANG LETTER CA
+A93A REJANG LETTER JA
+A93B REJANG LETTER NYA
+A93C REJANG LETTER SA
+A93D REJANG LETTER RA
+A93E REJANG LETTER LA
+A93F REJANG LETTER YA
+A940 REJANG LETTER WA
+A941 REJANG LETTER HA
+A942 REJANG LETTER MBA
+A943 REJANG LETTER NGGA
+A944 REJANG LETTER NDA
+A945 REJANG LETTER NYJA
+A946 REJANG LETTER A
+@ Vowel signs
+@+ Shown here is the nominal position of the vowel signs relative to the dotted circle before taking account of the oblique nature of the script.
+A947 REJANG VOWEL SIGN I
+ = kaluan
+A948 REJANG VOWEL SIGN U
+ = kamitan
+A949 REJANG VOWEL SIGN E
+ = kamica
+A94A REJANG VOWEL SIGN AI
+ = katiling
+A94B REJANG VOWEL SIGN O
+A94C REJANG VOWEL SIGN AU
+ = katulung
+A94D REJANG VOWEL SIGN EU
+A94E REJANG VOWEL SIGN EA
+ = kajina
+@ Consonant signs
+@+ Shown here is the nominal position of the consonant signs relative to the dotted circle before taking account of the oblique nature of the script.
+A94F REJANG CONSONANT SIGN NG
+ = katulang
+A950 REJANG CONSONANT SIGN N
+ = duo deatas
+A951 REJANG CONSONANT SIGN R
+ = kajunjung
+A952 REJANG CONSONANT SIGN H
+@ Virama
+A953 REJANG VIRAMA
+ * does not form conjuncts
+@ Punctuation
+A95F REJANG SECTION MARK
+@@ AA00 Cham AA5F
+@ Independent vowels
+AA00 CHAM LETTER A
+AA01 CHAM LETTER I
+AA02 CHAM LETTER U
+AA03 CHAM LETTER E
+AA04 CHAM LETTER AI
+AA05 CHAM LETTER O
+@ Consonants
+AA06 CHAM LETTER KA
+AA07 CHAM LETTER KHA
+AA08 CHAM LETTER GA
+AA09 CHAM LETTER GHA
+AA0A CHAM LETTER NGUE
+AA0B CHAM LETTER NGA
+AA0C CHAM LETTER CHA
+AA0D CHAM LETTER CHHA
+AA0E CHAM LETTER JA
+AA0F CHAM LETTER JHA
+AA10 CHAM LETTER NHUE
+AA11 CHAM LETTER NHA
+AA12 CHAM LETTER NHJA
+AA13 CHAM LETTER TA
+AA14 CHAM LETTER THA
+AA15 CHAM LETTER DA
+AA16 CHAM LETTER DHA
+AA17 CHAM LETTER NUE
+AA18 CHAM LETTER NA
+AA19 CHAM LETTER DDA
+AA1A CHAM LETTER PA
+AA1B CHAM LETTER PPA
+AA1C CHAM LETTER PHA
+AA1D CHAM LETTER BA
+AA1E CHAM LETTER BHA
+AA1F CHAM LETTER MUE
+AA20 CHAM LETTER MA
+AA21 CHAM LETTER BBA
+AA22 CHAM LETTER YA
+AA23 CHAM LETTER RA
+AA24 CHAM LETTER LA
+AA25 CHAM LETTER VA
+AA26 CHAM LETTER SSA
+AA27 CHAM LETTER SA
+AA28 CHAM LETTER HA
+@ Dependent vowel signs
+AA29 CHAM VOWEL SIGN AA
+AA2A CHAM VOWEL SIGN I
+AA2B CHAM VOWEL SIGN II
+AA2C CHAM VOWEL SIGN EI
+AA2D CHAM VOWEL SIGN U
+AA2E CHAM VOWEL SIGN OE
+AA2F CHAM VOWEL SIGN O
+AA30 CHAM VOWEL SIGN AI
+AA31 CHAM VOWEL SIGN AU
+AA32 CHAM VOWEL SIGN UE
+@ Consonant signs
+AA33 CHAM CONSONANT SIGN YA
+AA34 CHAM CONSONANT SIGN RA
+AA35 CHAM CONSONANT SIGN LA
+AA36 CHAM CONSONANT SIGN WA
+@ Final letters
+AA40 CHAM LETTER FINAL K
+AA41 CHAM LETTER FINAL G
+AA42 CHAM LETTER FINAL NG
+AA43 CHAM CONSONANT SIGN FINAL NG
+AA44 CHAM LETTER FINAL CH
+AA45 CHAM LETTER FINAL T
+AA46 CHAM LETTER FINAL N
+AA47 CHAM LETTER FINAL P
+AA48 CHAM LETTER FINAL Y
+AA49 CHAM LETTER FINAL R
+AA4A CHAM LETTER FINAL L
+AA4B CHAM LETTER FINAL SS
+AA4C CHAM CONSONANT SIGN FINAL M
+AA4D CHAM CONSONANT SIGN FINAL H
+@ Digits
+AA50 CHAM DIGIT ZERO
+AA51 CHAM DIGIT ONE
+AA52 CHAM DIGIT TWO
+AA53 CHAM DIGIT THREE
+AA54 CHAM DIGIT FOUR
+AA55 CHAM DIGIT FIVE
+AA56 CHAM DIGIT SIX
+AA57 CHAM DIGIT SEVEN
+AA58 CHAM DIGIT EIGHT
+AA59 CHAM DIGIT NINE
+@ Punctuation
+AA5C CHAM PUNCTUATION SPIRAL
+AA5D CHAM PUNCTUATION DANDA
+AA5E CHAM PUNCTUATION DOUBLE DANDA
+AA5F CHAM PUNCTUATION TRIPLE DANDA
+@@ AC00 Hangul Syllables D7A3
+@@ D800 High Surrogates DB7F
+@@ DB80 High Private Use Surrogates DBFF
+@@ DC00 Low Surrogates DFFF
+@@ E000 Private Use Area F8FF
+@@ F900 CJK Compatibility Ideographs FAFF
+@@+
+@ Pronunciation variants from KS X 1001:1998
+F900 CJK COMPATIBILITY IDEOGRAPH-F900
+ : 8C48
+F901 CJK COMPATIBILITY IDEOGRAPH-F901
+ : 66F4
+F902 CJK COMPATIBILITY IDEOGRAPH-F902
+ : 8ECA
+F903 CJK COMPATIBILITY IDEOGRAPH-F903
+ : 8CC8
+F904 CJK COMPATIBILITY IDEOGRAPH-F904
+ : 6ED1
+F905 CJK COMPATIBILITY IDEOGRAPH-F905
+ : 4E32
+F906 CJK COMPATIBILITY IDEOGRAPH-F906
+ : 53E5
+F907 CJK COMPATIBILITY IDEOGRAPH-F907
+ : 9F9C
+F908 CJK COMPATIBILITY IDEOGRAPH-F908
+ : 9F9C
+F909 CJK COMPATIBILITY IDEOGRAPH-F909
+ : 5951
+F90A CJK COMPATIBILITY IDEOGRAPH-F90A
+ : 91D1
+F90B CJK COMPATIBILITY IDEOGRAPH-F90B
+ : 5587
+F90C CJK COMPATIBILITY IDEOGRAPH-F90C
+ : 5948
+F90D CJK COMPATIBILITY IDEOGRAPH-F90D
+ : 61F6
+F90E CJK COMPATIBILITY IDEOGRAPH-F90E
+ : 7669
+F90F CJK COMPATIBILITY IDEOGRAPH-F90F
+ : 7F85
+F910 CJK COMPATIBILITY IDEOGRAPH-F910
+ : 863F
+F911 CJK COMPATIBILITY IDEOGRAPH-F911
+ : 87BA
+F912 CJK COMPATIBILITY IDEOGRAPH-F912
+ : 88F8
+F913 CJK COMPATIBILITY IDEOGRAPH-F913
+ : 908F
+F914 CJK COMPATIBILITY IDEOGRAPH-F914
+ : 6A02
+F915 CJK COMPATIBILITY IDEOGRAPH-F915
+ : 6D1B
+F916 CJK COMPATIBILITY IDEOGRAPH-F916
+ : 70D9
+F917 CJK COMPATIBILITY IDEOGRAPH-F917
+ : 73DE
+F918 CJK COMPATIBILITY IDEOGRAPH-F918
+ : 843D
+F919 CJK COMPATIBILITY IDEOGRAPH-F919
+ : 916A
+F91A CJK COMPATIBILITY IDEOGRAPH-F91A
+ : 99F1
+F91B CJK COMPATIBILITY IDEOGRAPH-F91B
+ : 4E82
+F91C CJK COMPATIBILITY IDEOGRAPH-F91C
+ : 5375
+F91D CJK COMPATIBILITY IDEOGRAPH-F91D
+ : 6B04
+F91E CJK COMPATIBILITY IDEOGRAPH-F91E
+ : 721B
+F91F CJK COMPATIBILITY IDEOGRAPH-F91F
+ : 862D
+F920 CJK COMPATIBILITY IDEOGRAPH-F920
+ : 9E1E
+F921 CJK COMPATIBILITY IDEOGRAPH-F921
+ : 5D50
+F922 CJK COMPATIBILITY IDEOGRAPH-F922
+ : 6FEB
+F923 CJK COMPATIBILITY IDEOGRAPH-F923
+ : 85CD
+F924 CJK COMPATIBILITY IDEOGRAPH-F924
+ : 8964
+F925 CJK COMPATIBILITY IDEOGRAPH-F925
+ : 62C9
+F926 CJK COMPATIBILITY IDEOGRAPH-F926
+ : 81D8
+F927 CJK COMPATIBILITY IDEOGRAPH-F927
+ : 881F
+F928 CJK COMPATIBILITY IDEOGRAPH-F928
+ : 5ECA
+F929 CJK COMPATIBILITY IDEOGRAPH-F929
+ : 6717
+F92A CJK COMPATIBILITY IDEOGRAPH-F92A
+ : 6D6A
+F92B CJK COMPATIBILITY IDEOGRAPH-F92B
+ : 72FC
+F92C CJK COMPATIBILITY IDEOGRAPH-F92C
+ : 90CE
+F92D CJK COMPATIBILITY IDEOGRAPH-F92D
+ : 4F86
+F92E CJK COMPATIBILITY IDEOGRAPH-F92E
+ : 51B7
+F92F CJK COMPATIBILITY IDEOGRAPH-F92F
+ : 52DE
+F930 CJK COMPATIBILITY IDEOGRAPH-F930
+ : 64C4
+F931 CJK COMPATIBILITY IDEOGRAPH-F931
+ : 6AD3
+F932 CJK COMPATIBILITY IDEOGRAPH-F932
+ : 7210
+F933 CJK COMPATIBILITY IDEOGRAPH-F933
+ : 76E7
+F934 CJK COMPATIBILITY IDEOGRAPH-F934
+ : 8001
+F935 CJK COMPATIBILITY IDEOGRAPH-F935
+ : 8606
+F936 CJK COMPATIBILITY IDEOGRAPH-F936
+ : 865C
+F937 CJK COMPATIBILITY IDEOGRAPH-F937
+ : 8DEF
+F938 CJK COMPATIBILITY IDEOGRAPH-F938
+ : 9732
+F939 CJK COMPATIBILITY IDEOGRAPH-F939
+ : 9B6F
+F93A CJK COMPATIBILITY IDEOGRAPH-F93A
+ : 9DFA
+F93B CJK COMPATIBILITY IDEOGRAPH-F93B
+ : 788C
+F93C CJK COMPATIBILITY IDEOGRAPH-F93C
+ : 797F
+F93D CJK COMPATIBILITY IDEOGRAPH-F93D
+ : 7DA0
+F93E CJK COMPATIBILITY IDEOGRAPH-F93E
+ : 83C9
+F93F CJK COMPATIBILITY IDEOGRAPH-F93F
+ : 9304
+F940 CJK COMPATIBILITY IDEOGRAPH-F940
+ : 9E7F
+F941 CJK COMPATIBILITY IDEOGRAPH-F941
+ : 8AD6
+F942 CJK COMPATIBILITY IDEOGRAPH-F942
+ : 58DF
+F943 CJK COMPATIBILITY IDEOGRAPH-F943
+ : 5F04
+F944 CJK COMPATIBILITY IDEOGRAPH-F944
+ : 7C60
+F945 CJK COMPATIBILITY IDEOGRAPH-F945
+ : 807E
+F946 CJK COMPATIBILITY IDEOGRAPH-F946
+ : 7262
+F947 CJK COMPATIBILITY IDEOGRAPH-F947
+ : 78CA
+F948 CJK COMPATIBILITY IDEOGRAPH-F948
+ : 8CC2
+F949 CJK COMPATIBILITY IDEOGRAPH-F949
+ : 96F7
+F94A CJK COMPATIBILITY IDEOGRAPH-F94A
+ : 58D8
+F94B CJK COMPATIBILITY IDEOGRAPH-F94B
+ : 5C62
+F94C CJK COMPATIBILITY IDEOGRAPH-F94C
+ : 6A13
+F94D CJK COMPATIBILITY IDEOGRAPH-F94D
+ : 6DDA
+F94E CJK COMPATIBILITY IDEOGRAPH-F94E
+ : 6F0F
+F94F CJK COMPATIBILITY IDEOGRAPH-F94F
+ : 7D2F
+F950 CJK COMPATIBILITY IDEOGRAPH-F950
+ : 7E37
+F951 CJK COMPATIBILITY IDEOGRAPH-F951
+ : 964B
+F952 CJK COMPATIBILITY IDEOGRAPH-F952
+ : 52D2
+F953 CJK COMPATIBILITY IDEOGRAPH-F953
+ : 808B
+F954 CJK COMPATIBILITY IDEOGRAPH-F954
+ : 51DC
+F955 CJK COMPATIBILITY IDEOGRAPH-F955
+ : 51CC
+F956 CJK COMPATIBILITY IDEOGRAPH-F956
+ : 7A1C
+F957 CJK COMPATIBILITY IDEOGRAPH-F957
+ : 7DBE
+F958 CJK COMPATIBILITY IDEOGRAPH-F958
+ : 83F1
+F959 CJK COMPATIBILITY IDEOGRAPH-F959
+ : 9675
+F95A CJK COMPATIBILITY IDEOGRAPH-F95A
+ : 8B80
+F95B CJK COMPATIBILITY IDEOGRAPH-F95B
+ : 62CF
+F95C CJK COMPATIBILITY IDEOGRAPH-F95C
+ : 6A02
+F95D CJK COMPATIBILITY IDEOGRAPH-F95D
+ : 8AFE
+F95E CJK COMPATIBILITY IDEOGRAPH-F95E
+ : 4E39
+F95F CJK COMPATIBILITY IDEOGRAPH-F95F
+ : 5BE7
+F960 CJK COMPATIBILITY IDEOGRAPH-F960
+ : 6012
+F961 CJK COMPATIBILITY IDEOGRAPH-F961
+ : 7387
+F962 CJK COMPATIBILITY IDEOGRAPH-F962
+ : 7570
+F963 CJK COMPATIBILITY IDEOGRAPH-F963
+ : 5317
+F964 CJK COMPATIBILITY IDEOGRAPH-F964
+ : 78FB
+F965 CJK COMPATIBILITY IDEOGRAPH-F965
+ : 4FBF
+F966 CJK COMPATIBILITY IDEOGRAPH-F966
+ : 5FA9
+F967 CJK COMPATIBILITY IDEOGRAPH-F967
+ : 4E0D
+F968 CJK COMPATIBILITY IDEOGRAPH-F968
+ : 6CCC
+F969 CJK COMPATIBILITY IDEOGRAPH-F969
+ : 6578
+F96A CJK COMPATIBILITY IDEOGRAPH-F96A
+ : 7D22
+F96B CJK COMPATIBILITY IDEOGRAPH-F96B
+ : 53C3
+F96C CJK COMPATIBILITY IDEOGRAPH-F96C
+ : 585E
+F96D CJK COMPATIBILITY IDEOGRAPH-F96D
+ : 7701
+F96E CJK COMPATIBILITY IDEOGRAPH-F96E
+ : 8449
+F96F CJK COMPATIBILITY IDEOGRAPH-F96F
+ : 8AAA
+F970 CJK COMPATIBILITY IDEOGRAPH-F970
+ : 6BBA
+F971 CJK COMPATIBILITY IDEOGRAPH-F971
+ : 8FB0
+F972 CJK COMPATIBILITY IDEOGRAPH-F972
+ : 6C88
+F973 CJK COMPATIBILITY IDEOGRAPH-F973
+ : 62FE
+F974 CJK COMPATIBILITY IDEOGRAPH-F974
+ : 82E5
+F975 CJK COMPATIBILITY IDEOGRAPH-F975
+ : 63A0
+F976 CJK COMPATIBILITY IDEOGRAPH-F976
+ : 7565
+F977 CJK COMPATIBILITY IDEOGRAPH-F977
+ : 4EAE
+F978 CJK COMPATIBILITY IDEOGRAPH-F978
+ : 5169
+F979 CJK COMPATIBILITY IDEOGRAPH-F979
+ : 51C9
+F97A CJK COMPATIBILITY IDEOGRAPH-F97A
+ : 6881
+F97B CJK COMPATIBILITY IDEOGRAPH-F97B
+ : 7CE7
+F97C CJK COMPATIBILITY IDEOGRAPH-F97C
+ : 826F
+F97D CJK COMPATIBILITY IDEOGRAPH-F97D
+ : 8AD2
+F97E CJK COMPATIBILITY IDEOGRAPH-F97E
+ : 91CF
+F97F CJK COMPATIBILITY IDEOGRAPH-F97F
+ : 52F5
+F980 CJK COMPATIBILITY IDEOGRAPH-F980
+ : 5442
+F981 CJK COMPATIBILITY IDEOGRAPH-F981
+ : 5973
+F982 CJK COMPATIBILITY IDEOGRAPH-F982
+ : 5EEC
+F983 CJK COMPATIBILITY IDEOGRAPH-F983
+ : 65C5
+F984 CJK COMPATIBILITY IDEOGRAPH-F984
+ : 6FFE
+F985 CJK COMPATIBILITY IDEOGRAPH-F985
+ : 792A
+F986 CJK COMPATIBILITY IDEOGRAPH-F986
+ : 95AD
+F987 CJK COMPATIBILITY IDEOGRAPH-F987
+ : 9A6A
+F988 CJK COMPATIBILITY IDEOGRAPH-F988
+ : 9E97
+F989 CJK COMPATIBILITY IDEOGRAPH-F989
+ : 9ECE
+F98A CJK COMPATIBILITY IDEOGRAPH-F98A
+ : 529B
+F98B CJK COMPATIBILITY IDEOGRAPH-F98B
+ : 66C6
+F98C CJK COMPATIBILITY IDEOGRAPH-F98C
+ : 6B77
+F98D CJK COMPATIBILITY IDEOGRAPH-F98D
+ : 8F62
+F98E CJK COMPATIBILITY IDEOGRAPH-F98E
+ : 5E74
+F98F CJK COMPATIBILITY IDEOGRAPH-F98F
+ : 6190
+F990 CJK COMPATIBILITY IDEOGRAPH-F990
+ : 6200
+F991 CJK COMPATIBILITY IDEOGRAPH-F991
+ : 649A
+F992 CJK COMPATIBILITY IDEOGRAPH-F992
+ : 6F23
+F993 CJK COMPATIBILITY IDEOGRAPH-F993
+ : 7149
+F994 CJK COMPATIBILITY IDEOGRAPH-F994
+ : 7489
+F995 CJK COMPATIBILITY IDEOGRAPH-F995
+ : 79CA
+F996 CJK COMPATIBILITY IDEOGRAPH-F996
+ : 7DF4
+F997 CJK COMPATIBILITY IDEOGRAPH-F997
+ : 806F
+F998 CJK COMPATIBILITY IDEOGRAPH-F998
+ : 8F26
+F999 CJK COMPATIBILITY IDEOGRAPH-F999
+ : 84EE
+F99A CJK COMPATIBILITY IDEOGRAPH-F99A
+ : 9023
+F99B CJK COMPATIBILITY IDEOGRAPH-F99B
+ : 934A
+F99C CJK COMPATIBILITY IDEOGRAPH-F99C
+ : 5217
+F99D CJK COMPATIBILITY IDEOGRAPH-F99D
+ : 52A3
+F99E CJK COMPATIBILITY IDEOGRAPH-F99E
+ : 54BD
+F99F CJK COMPATIBILITY IDEOGRAPH-F99F
+ : 70C8
+F9A0 CJK COMPATIBILITY IDEOGRAPH-F9A0
+ : 88C2
+F9A1 CJK COMPATIBILITY IDEOGRAPH-F9A1
+ : 8AAA
+F9A2 CJK COMPATIBILITY IDEOGRAPH-F9A2
+ : 5EC9
+F9A3 CJK COMPATIBILITY IDEOGRAPH-F9A3
+ : 5FF5
+F9A4 CJK COMPATIBILITY IDEOGRAPH-F9A4
+ : 637B
+F9A5 CJK COMPATIBILITY IDEOGRAPH-F9A5
+ : 6BAE
+F9A6 CJK COMPATIBILITY IDEOGRAPH-F9A6
+ : 7C3E
+F9A7 CJK COMPATIBILITY IDEOGRAPH-F9A7
+ : 7375
+F9A8 CJK COMPATIBILITY IDEOGRAPH-F9A8
+ : 4EE4
+F9A9 CJK COMPATIBILITY IDEOGRAPH-F9A9
+ : 56F9
+F9AA CJK COMPATIBILITY IDEOGRAPH-F9AA
+ : 5BE7
+F9AB CJK COMPATIBILITY IDEOGRAPH-F9AB
+ : 5DBA
+F9AC CJK COMPATIBILITY IDEOGRAPH-F9AC
+ : 601C
+F9AD CJK COMPATIBILITY IDEOGRAPH-F9AD
+ : 73B2
+F9AE CJK COMPATIBILITY IDEOGRAPH-F9AE
+ : 7469
+F9AF CJK COMPATIBILITY IDEOGRAPH-F9AF
+ : 7F9A
+F9B0 CJK COMPATIBILITY IDEOGRAPH-F9B0
+ : 8046
+F9B1 CJK COMPATIBILITY IDEOGRAPH-F9B1
+ : 9234
+F9B2 CJK COMPATIBILITY IDEOGRAPH-F9B2
+ : 96F6
+F9B3 CJK COMPATIBILITY IDEOGRAPH-F9B3
+ : 9748
+F9B4 CJK COMPATIBILITY IDEOGRAPH-F9B4
+ : 9818
+F9B5 CJK COMPATIBILITY IDEOGRAPH-F9B5
+ : 4F8B
+F9B6 CJK COMPATIBILITY IDEOGRAPH-F9B6
+ : 79AE
+F9B7 CJK COMPATIBILITY IDEOGRAPH-F9B7
+ : 91B4
+F9B8 CJK COMPATIBILITY IDEOGRAPH-F9B8
+ x (cjk unified ideograph-96B7 - 96B7)
+ : 96B8
+F9B9 CJK COMPATIBILITY IDEOGRAPH-F9B9
+ : 60E1
+F9BA CJK COMPATIBILITY IDEOGRAPH-F9BA
+ : 4E86
+F9BB CJK COMPATIBILITY IDEOGRAPH-F9BB
+ : 50DA
+F9BC CJK COMPATIBILITY IDEOGRAPH-F9BC
+ : 5BEE
+F9BD CJK COMPATIBILITY IDEOGRAPH-F9BD
+ : 5C3F
+F9BE CJK COMPATIBILITY IDEOGRAPH-F9BE
+ : 6599
+F9BF CJK COMPATIBILITY IDEOGRAPH-F9BF
+ : 6A02
+F9C0 CJK COMPATIBILITY IDEOGRAPH-F9C0
+ : 71CE
+F9C1 CJK COMPATIBILITY IDEOGRAPH-F9C1
+ : 7642
+F9C2 CJK COMPATIBILITY IDEOGRAPH-F9C2
+ : 84FC
+F9C3 CJK COMPATIBILITY IDEOGRAPH-F9C3
+ : 907C
+F9C4 CJK COMPATIBILITY IDEOGRAPH-F9C4
+ : 9F8D
+F9C5 CJK COMPATIBILITY IDEOGRAPH-F9C5
+ : 6688
+F9C6 CJK COMPATIBILITY IDEOGRAPH-F9C6
+ : 962E
+F9C7 CJK COMPATIBILITY IDEOGRAPH-F9C7
+ : 5289
+F9C8 CJK COMPATIBILITY IDEOGRAPH-F9C8
+ : 677B
+F9C9 CJK COMPATIBILITY IDEOGRAPH-F9C9
+ : 67F3
+F9CA CJK COMPATIBILITY IDEOGRAPH-F9CA
+ : 6D41
+F9CB CJK COMPATIBILITY IDEOGRAPH-F9CB
+ : 6E9C
+F9CC CJK COMPATIBILITY IDEOGRAPH-F9CC
+ : 7409
+F9CD CJK COMPATIBILITY IDEOGRAPH-F9CD
+ : 7559
+F9CE CJK COMPATIBILITY IDEOGRAPH-F9CE
+ : 786B
+F9CF CJK COMPATIBILITY IDEOGRAPH-F9CF
+ : 7D10
+F9D0 CJK COMPATIBILITY IDEOGRAPH-F9D0
+ : 985E
+F9D1 CJK COMPATIBILITY IDEOGRAPH-F9D1
+ : 516D
+F9D2 CJK COMPATIBILITY IDEOGRAPH-F9D2
+ : 622E
+F9D3 CJK COMPATIBILITY IDEOGRAPH-F9D3
+ : 9678
+F9D4 CJK COMPATIBILITY IDEOGRAPH-F9D4
+ : 502B
+F9D5 CJK COMPATIBILITY IDEOGRAPH-F9D5
+ : 5D19
+F9D6 CJK COMPATIBILITY IDEOGRAPH-F9D6
+ : 6DEA
+F9D7 CJK COMPATIBILITY IDEOGRAPH-F9D7
+ : 8F2A
+F9D8 CJK COMPATIBILITY IDEOGRAPH-F9D8
+ : 5F8B
+F9D9 CJK COMPATIBILITY IDEOGRAPH-F9D9
+ : 6144
+F9DA CJK COMPATIBILITY IDEOGRAPH-F9DA
+ : 6817
+F9DB CJK COMPATIBILITY IDEOGRAPH-F9DB
+ : 7387
+F9DC CJK COMPATIBILITY IDEOGRAPH-F9DC
+ : 9686
+F9DD CJK COMPATIBILITY IDEOGRAPH-F9DD
+ : 5229
+F9DE CJK COMPATIBILITY IDEOGRAPH-F9DE
+ : 540F
+F9DF CJK COMPATIBILITY IDEOGRAPH-F9DF
+ : 5C65
+F9E0 CJK COMPATIBILITY IDEOGRAPH-F9E0
+ : 6613
+F9E1 CJK COMPATIBILITY IDEOGRAPH-F9E1
+ : 674E
+F9E2 CJK COMPATIBILITY IDEOGRAPH-F9E2
+ : 68A8
+F9E3 CJK COMPATIBILITY IDEOGRAPH-F9E3
+ : 6CE5
+F9E4 CJK COMPATIBILITY IDEOGRAPH-F9E4
+ : 7406
+F9E5 CJK COMPATIBILITY IDEOGRAPH-F9E5
+ : 75E2
+F9E6 CJK COMPATIBILITY IDEOGRAPH-F9E6
+ : 7F79
+F9E7 CJK COMPATIBILITY IDEOGRAPH-F9E7
+ : 88CF
+F9E8 CJK COMPATIBILITY IDEOGRAPH-F9E8
+ : 88E1
+F9E9 CJK COMPATIBILITY IDEOGRAPH-F9E9
+ : 91CC
+F9EA CJK COMPATIBILITY IDEOGRAPH-F9EA
+ : 96E2
+F9EB CJK COMPATIBILITY IDEOGRAPH-F9EB
+ : 533F
+F9EC CJK COMPATIBILITY IDEOGRAPH-F9EC
+ : 6EBA
+F9ED CJK COMPATIBILITY IDEOGRAPH-F9ED
+ : 541D
+F9EE CJK COMPATIBILITY IDEOGRAPH-F9EE
+ : 71D0
+F9EF CJK COMPATIBILITY IDEOGRAPH-F9EF
+ : 7498
+F9F0 CJK COMPATIBILITY IDEOGRAPH-F9F0
+ : 85FA
+F9F1 CJK COMPATIBILITY IDEOGRAPH-F9F1
+ : 96A3
+F9F2 CJK COMPATIBILITY IDEOGRAPH-F9F2
+ : 9C57
+F9F3 CJK COMPATIBILITY IDEOGRAPH-F9F3
+ : 9E9F
+F9F4 CJK COMPATIBILITY IDEOGRAPH-F9F4
+ : 6797
+F9F5 CJK COMPATIBILITY IDEOGRAPH-F9F5
+ : 6DCB
+F9F6 CJK COMPATIBILITY IDEOGRAPH-F9F6
+ : 81E8
+F9F7 CJK COMPATIBILITY IDEOGRAPH-F9F7
+ : 7ACB
+F9F8 CJK COMPATIBILITY IDEOGRAPH-F9F8
+ : 7B20
+F9F9 CJK COMPATIBILITY IDEOGRAPH-F9F9
+ : 7C92
+F9FA CJK COMPATIBILITY IDEOGRAPH-F9FA
+ : 72C0
+F9FB CJK COMPATIBILITY IDEOGRAPH-F9FB
+ : 7099
+F9FC CJK COMPATIBILITY IDEOGRAPH-F9FC
+ : 8B58
+F9FD CJK COMPATIBILITY IDEOGRAPH-F9FD
+ : 4EC0
+F9FE CJK COMPATIBILITY IDEOGRAPH-F9FE
+ : 8336
+F9FF CJK COMPATIBILITY IDEOGRAPH-F9FF
+ : 523A
+FA00 CJK COMPATIBILITY IDEOGRAPH-FA00
+ : 5207
+FA01 CJK COMPATIBILITY IDEOGRAPH-FA01
+ : 5EA6
+FA02 CJK COMPATIBILITY IDEOGRAPH-FA02
+ : 62D3
+FA03 CJK COMPATIBILITY IDEOGRAPH-FA03
+ : 7CD6
+FA04 CJK COMPATIBILITY IDEOGRAPH-FA04
+ : 5B85
+FA05 CJK COMPATIBILITY IDEOGRAPH-FA05
+ : 6D1E
+FA06 CJK COMPATIBILITY IDEOGRAPH-FA06
+ : 66B4
+FA07 CJK COMPATIBILITY IDEOGRAPH-FA07
+ : 8F3B
+FA08 CJK COMPATIBILITY IDEOGRAPH-FA08
+ : 884C
+FA09 CJK COMPATIBILITY IDEOGRAPH-FA09
+ : 964D
+FA0A CJK COMPATIBILITY IDEOGRAPH-FA0A
+ : 898B
+FA0B CJK COMPATIBILITY IDEOGRAPH-FA0B
+ : 5ED3
+@ Duplicate characters from Big 5
+FA0C CJK COMPATIBILITY IDEOGRAPH-FA0C
+ : 5140
+FA0D CJK COMPATIBILITY IDEOGRAPH-FA0D
+ : 55C0
+@ The IBM 32 compatibility ideographs
+FA0E CJK COMPATIBILITY IDEOGRAPH-FA0E
+ * a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA0F CJK COMPATIBILITY IDEOGRAPH-FA0F
+ * a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA10 CJK COMPATIBILITY IDEOGRAPH-FA10
+ : 585A
+FA11 CJK COMPATIBILITY IDEOGRAPH-FA11
+ * a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA12 CJK COMPATIBILITY IDEOGRAPH-FA12
+ : 6674
+FA13 CJK COMPATIBILITY IDEOGRAPH-FA13
+ * a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA14 CJK COMPATIBILITY IDEOGRAPH-FA14
+ * a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA15 CJK COMPATIBILITY IDEOGRAPH-FA15
+ : 51DE
+FA16 CJK COMPATIBILITY IDEOGRAPH-FA16
+ : 732A
+FA17 CJK COMPATIBILITY IDEOGRAPH-FA17
+ : 76CA
+FA18 CJK COMPATIBILITY IDEOGRAPH-FA18
+ : 793C
+FA19 CJK COMPATIBILITY IDEOGRAPH-FA19
+ : 795E
+FA1A CJK COMPATIBILITY IDEOGRAPH-FA1A
+ : 7965
+FA1B CJK COMPATIBILITY IDEOGRAPH-FA1B
+ : 798F
+FA1C CJK COMPATIBILITY IDEOGRAPH-FA1C
+ : 9756
+FA1D CJK COMPATIBILITY IDEOGRAPH-FA1D
+ : 7CBE
+FA1E CJK COMPATIBILITY IDEOGRAPH-FA1E
+ : 7FBD
+FA1F CJK COMPATIBILITY IDEOGRAPH-FA1F *
+ * a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA20 CJK COMPATIBILITY IDEOGRAPH-FA20
+ : 8612
+FA21 CJK COMPATIBILITY IDEOGRAPH-FA21
+ * a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA22 CJK COMPATIBILITY IDEOGRAPH-FA22
+ : 8AF8
+FA23 CJK COMPATIBILITY IDEOGRAPH-FA23 *
+ * a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA24 CJK COMPATIBILITY IDEOGRAPH-FA24
+ * a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA25 CJK COMPATIBILITY IDEOGRAPH-FA25
+ : 9038
+FA26 CJK COMPATIBILITY IDEOGRAPH-FA26
+ : 90FD
+FA27 CJK COMPATIBILITY IDEOGRAPH-FA27
+ * a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA28 CJK COMPATIBILITY IDEOGRAPH-FA28
+ * a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA29 CJK COMPATIBILITY IDEOGRAPH-FA29
+ * a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA2A CJK COMPATIBILITY IDEOGRAPH-FA2A
+ : 98EF
+FA2B CJK COMPATIBILITY IDEOGRAPH-FA2B
+ : 98FC
+FA2C CJK COMPATIBILITY IDEOGRAPH-FA2C
+ : 9928
+FA2D CJK COMPATIBILITY IDEOGRAPH-FA2D
+ : 9DB4
+@ JIS X 0213 compatibility ideographs
+FA30 CJK COMPATIBILITY IDEOGRAPH-FA30
+ : 4FAE
+FA31 CJK COMPATIBILITY IDEOGRAPH-FA31
+ : 50E7
+FA32 CJK COMPATIBILITY IDEOGRAPH-FA32
+ : 514D
+FA33 CJK COMPATIBILITY IDEOGRAPH-FA33
+ : 52C9
+FA34 CJK COMPATIBILITY IDEOGRAPH-FA34
+ : 52E4
+FA35 CJK COMPATIBILITY IDEOGRAPH-FA35
+ : 5351
+FA36 CJK COMPATIBILITY IDEOGRAPH-FA36
+ : 559D
+FA37 CJK COMPATIBILITY IDEOGRAPH-FA37
+ : 5606
+FA38 CJK COMPATIBILITY IDEOGRAPH-FA38
+ : 5668
+FA39 CJK COMPATIBILITY IDEOGRAPH-FA39
+ : 5840
+FA3A CJK COMPATIBILITY IDEOGRAPH-FA3A
+ : 58A8
+FA3B CJK COMPATIBILITY IDEOGRAPH-FA3B
+ : 5C64
+FA3C CJK COMPATIBILITY IDEOGRAPH-FA3C
+ : 5C6E
+FA3D CJK COMPATIBILITY IDEOGRAPH-FA3D
+ : 6094
+FA3E CJK COMPATIBILITY IDEOGRAPH-FA3E
+ : 6168
+FA3F CJK COMPATIBILITY IDEOGRAPH-FA3F
+ : 618E
+FA40 CJK COMPATIBILITY IDEOGRAPH-FA40
+ : 61F2
+FA41 CJK COMPATIBILITY IDEOGRAPH-FA41
+ : 654F
+FA42 CJK COMPATIBILITY IDEOGRAPH-FA42
+ : 65E2
+FA43 CJK COMPATIBILITY IDEOGRAPH-FA43
+ : 6691
+FA44 CJK COMPATIBILITY IDEOGRAPH-FA44
+ : 6885
+FA45 CJK COMPATIBILITY IDEOGRAPH-FA45
+ : 6D77
+FA46 CJK COMPATIBILITY IDEOGRAPH-FA46
+ : 6E1A
+FA47 CJK COMPATIBILITY IDEOGRAPH-FA47
+ : 6F22
+FA48 CJK COMPATIBILITY IDEOGRAPH-FA48
+ : 716E
+FA49 CJK COMPATIBILITY IDEOGRAPH-FA49
+ : 722B
+FA4A CJK COMPATIBILITY IDEOGRAPH-FA4A
+ : 7422
+FA4B CJK COMPATIBILITY IDEOGRAPH-FA4B
+ : 7891
+FA4C CJK COMPATIBILITY IDEOGRAPH-FA4C
+ : 793E
+FA4D CJK COMPATIBILITY IDEOGRAPH-FA4D
+ : 7949
+FA4E CJK COMPATIBILITY IDEOGRAPH-FA4E
+ : 7948
+FA4F CJK COMPATIBILITY IDEOGRAPH-FA4F
+ : 7950
+FA50 CJK COMPATIBILITY IDEOGRAPH-FA50
+ : 7956
+FA51 CJK COMPATIBILITY IDEOGRAPH-FA51
+ : 795D
+FA52 CJK COMPATIBILITY IDEOGRAPH-FA52
+ : 798D
+FA53 CJK COMPATIBILITY IDEOGRAPH-FA53
+ : 798E
+FA54 CJK COMPATIBILITY IDEOGRAPH-FA54
+ : 7A40
+FA55 CJK COMPATIBILITY IDEOGRAPH-FA55
+ : 7A81
+FA56 CJK COMPATIBILITY IDEOGRAPH-FA56
+ : 7BC0
+FA57 CJK COMPATIBILITY IDEOGRAPH-FA57
+ : 7DF4
+FA58 CJK COMPATIBILITY IDEOGRAPH-FA58
+ : 7E09
+FA59 CJK COMPATIBILITY IDEOGRAPH-FA59
+ : 7E41
+FA5A CJK COMPATIBILITY IDEOGRAPH-FA5A
+ : 7F72
+FA5B CJK COMPATIBILITY IDEOGRAPH-FA5B
+ : 8005
+FA5C CJK COMPATIBILITY IDEOGRAPH-FA5C
+ : 81ED
+FA5D CJK COMPATIBILITY IDEOGRAPH-FA5D
+ : 8279
+FA5E CJK COMPATIBILITY IDEOGRAPH-FA5E
+ : 8279
+FA5F CJK COMPATIBILITY IDEOGRAPH-FA5F
+ : 8457
+FA60 CJK COMPATIBILITY IDEOGRAPH-FA60
+ : 8910
+FA61 CJK COMPATIBILITY IDEOGRAPH-FA61
+ : 8996
+FA62 CJK COMPATIBILITY IDEOGRAPH-FA62
+ : 8B01
+FA63 CJK COMPATIBILITY IDEOGRAPH-FA63
+ : 8B39
+FA64 CJK COMPATIBILITY IDEOGRAPH-FA64
+ : 8CD3
+FA65 CJK COMPATIBILITY IDEOGRAPH-FA65
+ : 8D08
+FA66 CJK COMPATIBILITY IDEOGRAPH-FA66
+ : 8FB6
+FA67 CJK COMPATIBILITY IDEOGRAPH-FA67
+ : 9038
+FA68 CJK COMPATIBILITY IDEOGRAPH-FA68
+ : 96E3
+FA69 CJK COMPATIBILITY IDEOGRAPH-FA69
+ : 97FF
+FA6A CJK COMPATIBILITY IDEOGRAPH-FA6A
+ : 983B
+@ DPRK compatibility ideographs
+FA70 CJK COMPATIBILITY IDEOGRAPH-FA70
+ : 4E26
+FA71 CJK COMPATIBILITY IDEOGRAPH-FA71
+ : 51B5
+FA72 CJK COMPATIBILITY IDEOGRAPH-FA72
+ : 5168
+FA73 CJK COMPATIBILITY IDEOGRAPH-FA73
+ : 4F80
+FA74 CJK COMPATIBILITY IDEOGRAPH-FA74
+ : 5145
+FA75 CJK COMPATIBILITY IDEOGRAPH-FA75
+ : 5180
+FA76 CJK COMPATIBILITY IDEOGRAPH-FA76
+ : 52C7
+FA77 CJK COMPATIBILITY IDEOGRAPH-FA77
+ : 52FA
+FA78 CJK COMPATIBILITY IDEOGRAPH-FA78
+ : 559D
+FA79 CJK COMPATIBILITY IDEOGRAPH-FA79
+ : 5555
+FA7A CJK COMPATIBILITY IDEOGRAPH-FA7A
+ : 5599
+FA7B CJK COMPATIBILITY IDEOGRAPH-FA7B
+ : 55E2
+FA7C CJK COMPATIBILITY IDEOGRAPH-FA7C
+ : 585A
+FA7D CJK COMPATIBILITY IDEOGRAPH-FA7D
+ : 58B3
+FA7E CJK COMPATIBILITY IDEOGRAPH-FA7E
+ : 5944
+FA7F CJK COMPATIBILITY IDEOGRAPH-FA7F
+ : 5954
+FA80 CJK COMPATIBILITY IDEOGRAPH-FA80
+ : 5A62
+FA81 CJK COMPATIBILITY IDEOGRAPH-FA81
+ : 5B28
+FA82 CJK COMPATIBILITY IDEOGRAPH-FA82
+ : 5ED2
+FA83 CJK COMPATIBILITY IDEOGRAPH-FA83
+ : 5ED9
+FA84 CJK COMPATIBILITY IDEOGRAPH-FA84
+ : 5F69
+FA85 CJK COMPATIBILITY IDEOGRAPH-FA85
+ : 5FAD
+FA86 CJK COMPATIBILITY IDEOGRAPH-FA86
+ : 60D8
+FA87 CJK COMPATIBILITY IDEOGRAPH-FA87
+ : 614E
+FA88 CJK COMPATIBILITY IDEOGRAPH-FA88
+ : 6108
+FA89 CJK COMPATIBILITY IDEOGRAPH-FA89
+ : 618E
+FA8A CJK COMPATIBILITY IDEOGRAPH-FA8A
+ : 6160
+FA8B CJK COMPATIBILITY IDEOGRAPH-FA8B
+ : 61F2
+FA8C CJK COMPATIBILITY IDEOGRAPH-FA8C
+ : 6234
+FA8D CJK COMPATIBILITY IDEOGRAPH-FA8D
+ : 63C4
+FA8E CJK COMPATIBILITY IDEOGRAPH-FA8E
+ : 641C
+FA8F CJK COMPATIBILITY IDEOGRAPH-FA8F
+ : 6452
+FA90 CJK COMPATIBILITY IDEOGRAPH-FA90
+ : 6556
+FA91 CJK COMPATIBILITY IDEOGRAPH-FA91
+ : 6674
+FA92 CJK COMPATIBILITY IDEOGRAPH-FA92
+ : 6717
+FA93 CJK COMPATIBILITY IDEOGRAPH-FA93
+ : 671B
+FA94 CJK COMPATIBILITY IDEOGRAPH-FA94
+ : 6756
+FA95 CJK COMPATIBILITY IDEOGRAPH-FA95
+ : 6B79
+FA96 CJK COMPATIBILITY IDEOGRAPH-FA96
+ : 6BBA
+FA97 CJK COMPATIBILITY IDEOGRAPH-FA97
+ : 6D41
+FA98 CJK COMPATIBILITY IDEOGRAPH-FA98
+ : 6EDB
+FA99 CJK COMPATIBILITY IDEOGRAPH-FA99
+ : 6ECB
+FA9A CJK COMPATIBILITY IDEOGRAPH-FA9A
+ : 6F22
+FA9B CJK COMPATIBILITY IDEOGRAPH-FA9B
+ : 701E
+FA9C CJK COMPATIBILITY IDEOGRAPH-FA9C
+ : 716E
+FA9D CJK COMPATIBILITY IDEOGRAPH-FA9D
+ : 77A7
+FA9E CJK COMPATIBILITY IDEOGRAPH-FA9E
+ : 7235
+FA9F CJK COMPATIBILITY IDEOGRAPH-FA9F
+ : 72AF
+FAA0 CJK COMPATIBILITY IDEOGRAPH-FAA0
+ : 732A
+FAA1 CJK COMPATIBILITY IDEOGRAPH-FAA1
+ : 7471
+FAA2 CJK COMPATIBILITY IDEOGRAPH-FAA2
+ : 7506
+FAA3 CJK COMPATIBILITY IDEOGRAPH-FAA3
+ : 753B
+FAA4 CJK COMPATIBILITY IDEOGRAPH-FAA4
+ : 761D
+FAA5 CJK COMPATIBILITY IDEOGRAPH-FAA5
+ : 761F
+FAA6 CJK COMPATIBILITY IDEOGRAPH-FAA6
+ : 76CA
+FAA7 CJK COMPATIBILITY IDEOGRAPH-FAA7
+ : 76DB
+FAA8 CJK COMPATIBILITY IDEOGRAPH-FAA8
+ : 76F4
+FAA9 CJK COMPATIBILITY IDEOGRAPH-FAA9
+ : 774A
+FAAA CJK COMPATIBILITY IDEOGRAPH-FAAA
+ : 7740
+FAAB CJK COMPATIBILITY IDEOGRAPH-FAAB
+ : 78CC
+FAAC CJK COMPATIBILITY IDEOGRAPH-FAAC
+ : 7AB1
+FAAD CJK COMPATIBILITY IDEOGRAPH-FAAD
+ : 7BC0
+FAAE CJK COMPATIBILITY IDEOGRAPH-FAAE
+ : 7C7B
+FAAF CJK COMPATIBILITY IDEOGRAPH-FAAF
+ : 7D5B
+FAB0 CJK COMPATIBILITY IDEOGRAPH-FAB0
+ : 7DF4
+FAB1 CJK COMPATIBILITY IDEOGRAPH-FAB1
+ : 7F3E
+FAB2 CJK COMPATIBILITY IDEOGRAPH-FAB2
+ : 8005
+FAB3 CJK COMPATIBILITY IDEOGRAPH-FAB3
+ : 8352
+FAB4 CJK COMPATIBILITY IDEOGRAPH-FAB4
+ : 83EF
+FAB5 CJK COMPATIBILITY IDEOGRAPH-FAB5
+ : 8779
+FAB6 CJK COMPATIBILITY IDEOGRAPH-FAB6
+ : 8941
+FAB7 CJK COMPATIBILITY IDEOGRAPH-FAB7
+ : 8986
+FAB8 CJK COMPATIBILITY IDEOGRAPH-FAB8
+ : 8996
+FAB9 CJK COMPATIBILITY IDEOGRAPH-FAB9
+ : 8ABF
+FABA CJK COMPATIBILITY IDEOGRAPH-FABA
+ : 8AF8
+FABB CJK COMPATIBILITY IDEOGRAPH-FABB
+ : 8ACB
+FABC CJK COMPATIBILITY IDEOGRAPH-FABC
+ : 8B01
+FABD CJK COMPATIBILITY IDEOGRAPH-FABD
+ : 8AFE
+FABE CJK COMPATIBILITY IDEOGRAPH-FABE
+ : 8AED
+FABF CJK COMPATIBILITY IDEOGRAPH-FABF
+ : 8B39
+FAC0 CJK COMPATIBILITY IDEOGRAPH-FAC0
+ : 8B8A
+FAC1 CJK COMPATIBILITY IDEOGRAPH-FAC1
+ : 8D08
+FAC2 CJK COMPATIBILITY IDEOGRAPH-FAC2
+ : 8F38
+FAC3 CJK COMPATIBILITY IDEOGRAPH-FAC3
+ : 9072
+FAC4 CJK COMPATIBILITY IDEOGRAPH-FAC4
+ : 9199
+FAC5 CJK COMPATIBILITY IDEOGRAPH-FAC5
+ : 9276
+FAC6 CJK COMPATIBILITY IDEOGRAPH-FAC6
+ : 967C
+FAC7 CJK COMPATIBILITY IDEOGRAPH-FAC7
+ : 96E3
+FAC8 CJK COMPATIBILITY IDEOGRAPH-FAC8
+ : 9756
+FAC9 CJK COMPATIBILITY IDEOGRAPH-FAC9
+ : 97DB
+FACA CJK COMPATIBILITY IDEOGRAPH-FACA
+ : 97FF
+FACB CJK COMPATIBILITY IDEOGRAPH-FACB
+ : 980B
+FACC CJK COMPATIBILITY IDEOGRAPH-FACC
+ : 983B
+FACD CJK COMPATIBILITY IDEOGRAPH-FACD
+ : 9B12
+FACE CJK COMPATIBILITY IDEOGRAPH-FACE
+ : 9F9C
+FACF CJK COMPATIBILITY IDEOGRAPH-FACF
+ : 2284A
+FAD0 CJK COMPATIBILITY IDEOGRAPH-FAD0
+ : 22844
+FAD1 CJK COMPATIBILITY IDEOGRAPH-FAD1
+ : 233D5
+FAD2 CJK COMPATIBILITY IDEOGRAPH-FAD2
+ : 3B9D
+FAD3 CJK COMPATIBILITY IDEOGRAPH-FAD3
+ : 4018
+FAD4 CJK COMPATIBILITY IDEOGRAPH-FAD4
+ : 4039
+FAD5 CJK COMPATIBILITY IDEOGRAPH-FAD5
+ : 25249
+FAD6 CJK COMPATIBILITY IDEOGRAPH-FAD6
+ : 25CD0
+FAD7 CJK COMPATIBILITY IDEOGRAPH-FAD7
+ : 27ED3
+FAD8 CJK COMPATIBILITY IDEOGRAPH-FAD8
+ : 9F43
+FAD9 CJK COMPATIBILITY IDEOGRAPH-FAD9
+ : 9F8E
+@@ FB00 Alphabetic Presentation Forms FB4F
+@ Latin ligatures
+@+ See the Basic Latin block starting at 0020
+FB00 LATIN SMALL LIGATURE FF
+ # 0066 0066
+FB01 LATIN SMALL LIGATURE FI
+ # 0066 0069
+FB02 LATIN SMALL LIGATURE FL
+ # 0066 006C
+FB03 LATIN SMALL LIGATURE FFI
+ # 0066 0066 0069
+FB04 LATIN SMALL LIGATURE FFL
+ # 0066 0066 006C
+FB05 LATIN SMALL LIGATURE LONG S T
+ # 017F 0074
+FB06 LATIN SMALL LIGATURE ST
+ # 0073 0074
+@ Armenian ligatures
+@+ See the Armenian block starting at 0530
+FB13 ARMENIAN SMALL LIGATURE MEN NOW
+ # 0574 0576
+FB14 ARMENIAN SMALL LIGATURE MEN ECH
+ # 0574 0565
+FB15 ARMENIAN SMALL LIGATURE MEN INI
+ # 0574 056B
+FB16 ARMENIAN SMALL LIGATURE VEW NOW
+ # 057E 0576
+FB17 ARMENIAN SMALL LIGATURE MEN XEH
+ # 0574 056D
+@ Hebrew presentation forms
+@+ See the Hebrew block starting at 0590
+FB1D HEBREW LETTER YOD WITH HIRIQ
+ : 05D9 05B4
+FB1E HEBREW POINT JUDEO-SPANISH VARIKA
+ * a glyph variant of 05BF
+FB1F HEBREW LIGATURE YIDDISH YOD YOD PATAH
+ : 05F2 05B7
+FB20 HEBREW LETTER ALTERNATIVE AYIN
+ * this form of AYIN has no descender, for use with marks placed below the letter
+ # <font> 05E2 hebrew letter ayin
+FB21 HEBREW LETTER WIDE ALEF
+ # <font> 05D0 hebrew letter alef
+FB22 HEBREW LETTER WIDE DALET
+ # <font> 05D3 hebrew letter dalet
+FB23 HEBREW LETTER WIDE HE
+ # <font> 05D4 hebrew letter he
+FB24 HEBREW LETTER WIDE KAF
+ # <font> 05DB hebrew letter kaf
+FB25 HEBREW LETTER WIDE LAMED
+ # <font> 05DC hebrew letter lamed
+FB26 HEBREW LETTER WIDE FINAL MEM
+ # <font> 05DD hebrew letter final mem
+FB27 HEBREW LETTER WIDE RESH
+ # <font> 05E8 hebrew letter resh
+FB28 HEBREW LETTER WIDE TAV
+ # <font> 05EA hebrew letter tav
+FB29 HEBREW LETTER ALTERNATIVE PLUS SIGN
+ # <font> 002B plus sign
+FB2A HEBREW LETTER SHIN WITH SHIN DOT
+ : 05E9 05C1
+FB2B HEBREW LETTER SHIN WITH SIN DOT
+ : 05E9 05C2
+FB2C HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+ : FB49 05C1
+FB2D HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+ : FB49 05C2
+FB2E HEBREW LETTER ALEF WITH PATAH
+ : 05D0 05B7
+FB2F HEBREW LETTER ALEF WITH QAMATS
+ : 05D0 05B8
+FB30 HEBREW LETTER ALEF WITH MAPIQ
+ : 05D0 05BC
+FB31 HEBREW LETTER BET WITH DAGESH
+ : 05D1 05BC
+FB32 HEBREW LETTER GIMEL WITH DAGESH
+ : 05D2 05BC
+FB33 HEBREW LETTER DALET WITH DAGESH
+ : 05D3 05BC
+FB34 HEBREW LETTER HE WITH MAPIQ
+ : 05D4 05BC
+FB35 HEBREW LETTER VAV WITH DAGESH
+ : 05D5 05BC
+FB36 HEBREW LETTER ZAYIN WITH DAGESH
+ : 05D6 05BC
+FB38 HEBREW LETTER TET WITH DAGESH
+ : 05D8 05BC
+FB39 HEBREW LETTER YOD WITH DAGESH
+ : 05D9 05BC
+FB3A HEBREW LETTER FINAL KAF WITH DAGESH
+ : 05DA 05BC
+FB3B HEBREW LETTER KAF WITH DAGESH
+ : 05DB 05BC
+FB3C HEBREW LETTER LAMED WITH DAGESH
+ : 05DC 05BC
+FB3E HEBREW LETTER MEM WITH DAGESH
+ : 05DE 05BC
+FB40 HEBREW LETTER NUN WITH DAGESH
+ : 05E0 05BC
+FB41 HEBREW LETTER SAMEKH WITH DAGESH
+ : 05E1 05BC
+FB43 HEBREW LETTER FINAL PE WITH DAGESH
+ : 05E3 05BC
+FB44 HEBREW LETTER PE WITH DAGESH
+ : 05E4 05BC
+FB46 HEBREW LETTER TSADI WITH DAGESH
+ : 05E6 05BC
+FB47 HEBREW LETTER QOF WITH DAGESH
+ : 05E7 05BC
+FB48 HEBREW LETTER RESH WITH DAGESH
+ : 05E8 05BC
+FB49 HEBREW LETTER SHIN WITH DAGESH
+ : 05E9 05BC
+FB4A HEBREW LETTER TAV WITH DAGESH
+ : 05EA 05BC
+FB4B HEBREW LETTER VAV WITH HOLAM
+ : 05D5 05B9
+FB4C HEBREW LETTER BET WITH RAFE
+ : 05D1 05BF
+FB4D HEBREW LETTER KAF WITH RAFE
+ : 05DB 05BF
+FB4E HEBREW LETTER PE WITH RAFE
+ : 05E4 05BF
+FB4F HEBREW LIGATURE ALEF LAMED
+ # 05D0 05DC
+@@ FB50 Arabic Presentation Forms-A FDFF
+@+ Preferred characters are found in the Arabic block 0600 - 06FF. This block also contains 32 noncharacters in the range FDD0 - FDDF.
+@ Glyphs for contextual forms of letters for Persian, Urdu, Sindhi, etc.
+FB50 ARABIC LETTER ALEF WASLA ISOLATED FORM
+ # <isolated> 0671
+FB51 ARABIC LETTER ALEF WASLA FINAL FORM
+ # <final> 0671
+FB52 ARABIC LETTER BEEH ISOLATED FORM
+ # <isolated> 067B
+FB53 ARABIC LETTER BEEH FINAL FORM
+ # <final> 067B
+FB54 ARABIC LETTER BEEH INITIAL FORM
+ # <initial> 067B
+FB55 ARABIC LETTER BEEH MEDIAL FORM
+ # <medial> 067B
+FB56 ARABIC LETTER PEH ISOLATED FORM
+ # <isolated> 067E
+FB57 ARABIC LETTER PEH FINAL FORM
+ # <final> 067E
+FB58 ARABIC LETTER PEH INITIAL FORM
+ # <initial> 067E
+FB59 ARABIC LETTER PEH MEDIAL FORM
+ # <medial> 067E
+FB5A ARABIC LETTER BEHEH ISOLATED FORM
+ # <isolated> 0680
+FB5B ARABIC LETTER BEHEH FINAL FORM
+ # <final> 0680
+FB5C ARABIC LETTER BEHEH INITIAL FORM
+ # <initial> 0680
+FB5D ARABIC LETTER BEHEH MEDIAL FORM
+ # <medial> 0680
+FB5E ARABIC LETTER TTEHEH ISOLATED FORM
+ # <isolated> 067A
+FB5F ARABIC LETTER TTEHEH FINAL FORM
+ # <final> 067A
+FB60 ARABIC LETTER TTEHEH INITIAL FORM
+ # <initial> 067A
+FB61 ARABIC LETTER TTEHEH MEDIAL FORM
+ # <medial> 067A
+FB62 ARABIC LETTER TEHEH ISOLATED FORM
+ # <isolated> 067F
+FB63 ARABIC LETTER TEHEH FINAL FORM
+ # <final> 067F
+FB64 ARABIC LETTER TEHEH INITIAL FORM
+ # <initial> 067F
+FB65 ARABIC LETTER TEHEH MEDIAL FORM
+ # <medial> 067F
+FB66 ARABIC LETTER TTEH ISOLATED FORM
+ # <isolated> 0679
+FB67 ARABIC LETTER TTEH FINAL FORM
+ # <final> 0679
+FB68 ARABIC LETTER TTEH INITIAL FORM
+ # <initial> 0679
+FB69 ARABIC LETTER TTEH MEDIAL FORM
+ # <medial> 0679
+FB6A ARABIC LETTER VEH ISOLATED FORM
+ # <isolated> 06A4
+FB6B ARABIC LETTER VEH FINAL FORM
+ # <final> 06A4
+FB6C ARABIC LETTER VEH INITIAL FORM
+ # <initial> 06A4
+FB6D ARABIC LETTER VEH MEDIAL FORM
+ # <medial> 06A4
+FB6E ARABIC LETTER PEHEH ISOLATED FORM
+ # <isolated> 06A6
+FB6F ARABIC LETTER PEHEH FINAL FORM
+ # <final> 06A6
+FB70 ARABIC LETTER PEHEH INITIAL FORM
+ # <initial> 06A6
+FB71 ARABIC LETTER PEHEH MEDIAL FORM
+ # <medial> 06A6
+FB72 ARABIC LETTER DYEH ISOLATED FORM
+ # <isolated> 0684
+FB73 ARABIC LETTER DYEH FINAL FORM
+ # <final> 0684
+FB74 ARABIC LETTER DYEH INITIAL FORM
+ # <initial> 0684
+FB75 ARABIC LETTER DYEH MEDIAL FORM
+ # <medial> 0684
+FB76 ARABIC LETTER NYEH ISOLATED FORM
+ # <isolated> 0683
+FB77 ARABIC LETTER NYEH FINAL FORM
+ # <final> 0683
+FB78 ARABIC LETTER NYEH INITIAL FORM
+ # <initial> 0683
+FB79 ARABIC LETTER NYEH MEDIAL FORM
+ # <medial> 0683
+FB7A ARABIC LETTER TCHEH ISOLATED FORM
+ # <isolated> 0686
+FB7B ARABIC LETTER TCHEH FINAL FORM
+ # <final> 0686
+FB7C ARABIC LETTER TCHEH INITIAL FORM
+ # <initial> 0686
+FB7D ARABIC LETTER TCHEH MEDIAL FORM
+ # <medial> 0686
+FB7E ARABIC LETTER TCHEHEH ISOLATED FORM
+ # <isolated> 0687
+FB7F ARABIC LETTER TCHEHEH FINAL FORM
+ # <final> 0687
+FB80 ARABIC LETTER TCHEHEH INITIAL FORM
+ # <initial> 0687
+FB81 ARABIC LETTER TCHEHEH MEDIAL FORM
+ # <medial> 0687
+FB82 ARABIC LETTER DDAHAL ISOLATED FORM
+ # <isolated> 068D
+FB83 ARABIC LETTER DDAHAL FINAL FORM
+ # <final> 068D
+FB84 ARABIC LETTER DAHAL ISOLATED FORM
+ # <isolated> 068C
+FB85 ARABIC LETTER DAHAL FINAL FORM
+ # <final> 068C
+FB86 ARABIC LETTER DUL ISOLATED FORM
+ # <isolated> 068E
+FB87 ARABIC LETTER DUL FINAL FORM
+ # <final> 068E
+FB88 ARABIC LETTER DDAL ISOLATED FORM
+ # <isolated> 0688
+FB89 ARABIC LETTER DDAL FINAL FORM
+ # <final> 0688
+FB8A ARABIC LETTER JEH ISOLATED FORM
+ # <isolated> 0698
+FB8B ARABIC LETTER JEH FINAL FORM
+ # <final> 0698
+FB8C ARABIC LETTER RREH ISOLATED FORM
+ # <isolated> 0691
+FB8D ARABIC LETTER RREH FINAL FORM
+ # <final> 0691
+FB8E ARABIC LETTER KEHEH ISOLATED FORM
+ # <isolated> 06A9
+FB8F ARABIC LETTER KEHEH FINAL FORM
+ # <final> 06A9
+FB90 ARABIC LETTER KEHEH INITIAL FORM
+ # <initial> 06A9
+FB91 ARABIC LETTER KEHEH MEDIAL FORM
+ # <medial> 06A9
+FB92 ARABIC LETTER GAF ISOLATED FORM
+ # <isolated> 06AF
+FB93 ARABIC LETTER GAF FINAL FORM
+ # <final> 06AF
+FB94 ARABIC LETTER GAF INITIAL FORM
+ # <initial> 06AF
+FB95 ARABIC LETTER GAF MEDIAL FORM
+ # <medial> 06AF
+FB96 ARABIC LETTER GUEH ISOLATED FORM
+ # <isolated> 06B3
+FB97 ARABIC LETTER GUEH FINAL FORM
+ # <final> 06B3
+FB98 ARABIC LETTER GUEH INITIAL FORM
+ # <initial> 06B3
+FB99 ARABIC LETTER GUEH MEDIAL FORM
+ # <medial> 06B3
+FB9A ARABIC LETTER NGOEH ISOLATED FORM
+ # <isolated> 06B1
+FB9B ARABIC LETTER NGOEH FINAL FORM
+ # <final> 06B1
+FB9C ARABIC LETTER NGOEH INITIAL FORM
+ # <initial> 06B1
+FB9D ARABIC LETTER NGOEH MEDIAL FORM
+ # <medial> 06B1
+FB9E ARABIC LETTER NOON GHUNNA ISOLATED FORM
+ # <isolated> 06BA
+FB9F ARABIC LETTER NOON GHUNNA FINAL FORM
+ # <final> 06BA
+FBA0 ARABIC LETTER RNOON ISOLATED FORM
+ # <isolated> 06BB
+FBA1 ARABIC LETTER RNOON FINAL FORM
+ # <final> 06BB
+FBA2 ARABIC LETTER RNOON INITIAL FORM
+ # <initial> 06BB
+FBA3 ARABIC LETTER RNOON MEDIAL FORM
+ # <medial> 06BB
+FBA4 ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+ # <isolated> 06C0
+FBA5 ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+ # <final> 06C0
+FBA6 ARABIC LETTER HEH GOAL ISOLATED FORM
+ # <isolated> 06C1
+FBA7 ARABIC LETTER HEH GOAL FINAL FORM
+ # <final> 06C1
+FBA8 ARABIC LETTER HEH GOAL INITIAL FORM
+ # <initial> 06C1
+FBA9 ARABIC LETTER HEH GOAL MEDIAL FORM
+ # <medial> 06C1
+FBAA ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+ # <isolated> 06BE
+FBAB ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+ # <final> 06BE
+FBAC ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+ # <initial> 06BE
+FBAD ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+ # <medial> 06BE
+FBAE ARABIC LETTER YEH BARREE ISOLATED FORM
+ # <isolated> 06D2
+FBAF ARABIC LETTER YEH BARREE FINAL FORM
+ # <final> 06D2
+FBB0 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+ # <isolated> 06D3
+FBB1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+ # <final> 06D3
+@ Glyphs for contextual forms of letters for Central Asian languages
+FBD3 ARABIC LETTER NG ISOLATED FORM
+ # <isolated> 06AD
+FBD4 ARABIC LETTER NG FINAL FORM
+ # <final> 06AD
+FBD5 ARABIC LETTER NG INITIAL FORM
+ # <initial> 06AD
+FBD6 ARABIC LETTER NG MEDIAL FORM
+ # <medial> 06AD
+FBD7 ARABIC LETTER U ISOLATED FORM
+ # <isolated> 06C7
+FBD8 ARABIC LETTER U FINAL FORM
+ # <final> 06C7
+FBD9 ARABIC LETTER OE ISOLATED FORM
+ # <isolated> 06C6
+FBDA ARABIC LETTER OE FINAL FORM
+ # <final> 06C6
+FBDB ARABIC LETTER YU ISOLATED FORM
+ # <isolated> 06C8
+FBDC ARABIC LETTER YU FINAL FORM
+ # <final> 06C8
+FBDD ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+ # <isolated> 0677
+FBDE ARABIC LETTER VE ISOLATED FORM
+ # <isolated> 06CB
+FBDF ARABIC LETTER VE FINAL FORM
+ # <final> 06CB
+FBE0 ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+ # <isolated> 06C5
+FBE1 ARABIC LETTER KIRGHIZ OE FINAL FORM
+ # <final> 06C5
+FBE2 ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+ # <isolated> 06C9
+FBE3 ARABIC LETTER KIRGHIZ YU FINAL FORM
+ # <final> 06C9
+FBE4 ARABIC LETTER E ISOLATED FORM
+ # <isolated> 06D0
+FBE5 ARABIC LETTER E FINAL FORM
+ # <final> 06D0
+FBE6 ARABIC LETTER E INITIAL FORM
+ # <initial> 06D0
+FBE7 ARABIC LETTER E MEDIAL FORM
+ # <medial> 06D0
+FBE8 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+ # <initial> 0649
+FBE9 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+ # <medial> 0649
+@ Ligatures (two elements)
+FBEA ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+ # <isolated> 0626 0627
+FBEB ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+ # <final> 0626 0627
+FBEC ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+ # <isolated> 0626 06D5
+FBED ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+ # <final> 0626 06D5
+FBEE ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+ # <isolated> 0626 0648
+FBEF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+ # <final> 0626 0648
+FBF0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+ # <isolated> 0626 06C7
+FBF1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+ # <final> 0626 06C7
+FBF2 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+ # <isolated> 0626 06C6
+FBF3 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+ # <final> 0626 06C6
+FBF4 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+ # <isolated> 0626 06C8
+FBF5 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+ # <final> 0626 06C8
+FBF6 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+ # <isolated> 0626 06D0
+FBF7 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+ # <final> 0626 06D0
+FBF8 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+ # <initial> 0626 06D0
+FBF9 ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0626 0649
+FBFA ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+ # <final> 0626 0649
+FBFB ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+ # <initial> 0626 0649
+FBFC ARABIC LETTER FARSI YEH ISOLATED FORM
+ # <isolated> 06CC
+FBFD ARABIC LETTER FARSI YEH FINAL FORM
+ # <final> 06CC
+FBFE ARABIC LETTER FARSI YEH INITIAL FORM
+ # <initial> 06CC
+FBFF ARABIC LETTER FARSI YEH MEDIAL FORM
+ # <medial> 06CC
+FC00 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+ # <isolated> 0626 062C
+FC01 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+ # <isolated> 0626 062D
+FC02 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+ # <isolated> 0626 0645
+FC03 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0626 0649
+FC04 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+ # <isolated> 0626 064A
+FC05 ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+ # <isolated> 0628 062C
+FC06 ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+ # <isolated> 0628 062D
+FC07 ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+ # <isolated> 0628 062E
+FC08 ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+ # <isolated> 0628 0645
+FC09 ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0628 0649
+FC0A ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+ # <isolated> 0628 064A
+FC0B ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+ # <isolated> 062A 062C
+FC0C ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+ # <isolated> 062A 062D
+FC0D ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+ # <isolated> 062A 062E
+FC0E ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+ # <isolated> 062A 0645
+FC0F ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 062A 0649
+FC10 ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+ # <isolated> 062A 064A
+FC11 ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+ # <isolated> 062B 062C
+FC12 ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+ # <isolated> 062B 0645
+FC13 ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 062B 0649
+FC14 ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+ # <isolated> 062B 064A
+FC15 ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+ # <isolated> 062C 062D
+FC16 ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+ # <isolated> 062C 0645
+FC17 ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+ # <isolated> 062D 062C
+FC18 ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+ # <isolated> 062D 0645
+FC19 ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+ # <isolated> 062E 062C
+FC1A ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+ # <isolated> 062E 062D
+FC1B ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+ # <isolated> 062E 0645
+FC1C ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+ # <isolated> 0633 062C
+FC1D ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+ # <isolated> 0633 062D
+FC1E ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+ # <isolated> 0633 062E
+FC1F ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+ # <isolated> 0633 0645
+FC20 ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+ # <isolated> 0635 062D
+FC21 ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+ # <isolated> 0635 0645
+FC22 ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+ # <isolated> 0636 062C
+FC23 ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+ # <isolated> 0636 062D
+FC24 ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+ # <isolated> 0636 062E
+FC25 ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+ # <isolated> 0636 0645
+FC26 ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+ # <isolated> 0637 062D
+FC27 ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+ # <isolated> 0637 0645
+FC28 ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+ # <isolated> 0638 0645
+FC29 ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+ # <isolated> 0639 062C
+FC2A ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+ # <isolated> 0639 0645
+FC2B ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+ # <isolated> 063A 062C
+FC2C ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+ # <isolated> 063A 0645
+FC2D ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+ # <isolated> 0641 062C
+FC2E ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+ # <isolated> 0641 062D
+FC2F ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+ # <isolated> 0641 062E
+FC30 ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+ # <isolated> 0641 0645
+FC31 ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0641 0649
+FC32 ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+ # <isolated> 0641 064A
+FC33 ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+ # <isolated> 0642 062D
+FC34 ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+ # <isolated> 0642 0645
+FC35 ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0642 0649
+FC36 ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+ # <isolated> 0642 064A
+FC37 ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+ # <isolated> 0643 0627
+FC38 ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+ # <isolated> 0643 062C
+FC39 ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+ # <isolated> 0643 062D
+FC3A ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+ # <isolated> 0643 062E
+FC3B ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+ # <isolated> 0643 0644
+FC3C ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+ # <isolated> 0643 0645
+FC3D ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0643 0649
+FC3E ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+ # <isolated> 0643 064A
+FC3F ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+ # <isolated> 0644 062C
+FC40 ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+ # <isolated> 0644 062D
+FC41 ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+ # <isolated> 0644 062E
+FC42 ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+ # <isolated> 0644 0645
+FC43 ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0644 0649
+FC44 ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+ # <isolated> 0644 064A
+FC45 ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+ # <isolated> 0645 062C
+FC46 ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+ # <isolated> 0645 062D
+FC47 ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+ # <isolated> 0645 062E
+FC48 ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+ # <isolated> 0645 0645
+FC49 ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0645 0649
+FC4A ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+ # <isolated> 0645 064A
+FC4B ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+ # <isolated> 0646 062C
+FC4C ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+ # <isolated> 0646 062D
+FC4D ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+ # <isolated> 0646 062E
+FC4E ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+ # <isolated> 0646 0645
+FC4F ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0646 0649
+FC50 ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+ # <isolated> 0646 064A
+FC51 ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+ # <isolated> 0647 062C
+FC52 ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+ # <isolated> 0647 0645
+FC53 ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0647 0649
+FC54 ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+ # <isolated> 0647 064A
+FC55 ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+ # <isolated> 064A 062C
+FC56 ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+ # <isolated> 064A 062D
+FC57 ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+ # <isolated> 064A 062E
+FC58 ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+ # <isolated> 064A 0645
+FC59 ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 064A 0649
+FC5A ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+ # <isolated> 064A 064A
+FC5B ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+ # <isolated> 0630 0670
+FC5C ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+ # <isolated> 0631 0670
+FC5D ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+ # <isolated> 0649 0670
+FC5E ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+ # <isolated> 0020 064C 0651
+FC5F ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+ # <isolated> 0020 064D 0651
+FC60 ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+ # <isolated> 0020 064E 0651
+FC61 ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+ # <isolated> 0020 064F 0651
+FC62 ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+ # <isolated> 0020 0650 0651
+FC63 ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+ # <isolated> 0020 0651 0670
+FC64 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+ # <final> 0626 0631
+FC65 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+ # <final> 0626 0632
+FC66 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+ # <final> 0626 0645
+FC67 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+ # <final> 0626 0646
+FC68 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+ # <final> 0626 0649
+FC69 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+ # <final> 0626 064A
+FC6A ARABIC LIGATURE BEH WITH REH FINAL FORM
+ # <final> 0628 0631
+FC6B ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+ # <final> 0628 0632
+FC6C ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+ # <final> 0628 0645
+FC6D ARABIC LIGATURE BEH WITH NOON FINAL FORM
+ # <final> 0628 0646
+FC6E ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0628 0649
+FC6F ARABIC LIGATURE BEH WITH YEH FINAL FORM
+ # <final> 0628 064A
+FC70 ARABIC LIGATURE TEH WITH REH FINAL FORM
+ # <final> 062A 0631
+FC71 ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+ # <final> 062A 0632
+FC72 ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+ # <final> 062A 0645
+FC73 ARABIC LIGATURE TEH WITH NOON FINAL FORM
+ # <final> 062A 0646
+FC74 ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+ # <final> 062A 0649
+FC75 ARABIC LIGATURE TEH WITH YEH FINAL FORM
+ # <final> 062A 064A
+FC76 ARABIC LIGATURE THEH WITH REH FINAL FORM
+ # <final> 062B 0631
+FC77 ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+ # <final> 062B 0632
+FC78 ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+ # <final> 062B 0645
+FC79 ARABIC LIGATURE THEH WITH NOON FINAL FORM
+ # <final> 062B 0646
+FC7A ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+ # <final> 062B 0649
+FC7B ARABIC LIGATURE THEH WITH YEH FINAL FORM
+ # <final> 062B 064A
+FC7C ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0641 0649
+FC7D ARABIC LIGATURE FEH WITH YEH FINAL FORM
+ # <final> 0641 064A
+FC7E ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+ # <final> 0642 0649
+FC7F ARABIC LIGATURE QAF WITH YEH FINAL FORM
+ # <final> 0642 064A
+FC80 ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+ # <final> 0643 0627
+FC81 ARABIC LIGATURE KAF WITH LAM FINAL FORM
+ # <final> 0643 0644
+FC82 ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+ # <final> 0643 0645
+FC83 ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+ # <final> 0643 0649
+FC84 ARABIC LIGATURE KAF WITH YEH FINAL FORM
+ # <final> 0643 064A
+FC85 ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+ # <final> 0644 0645
+FC86 ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+ # <final> 0644 0649
+FC87 ARABIC LIGATURE LAM WITH YEH FINAL FORM
+ # <final> 0644 064A
+FC88 ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+ # <final> 0645 0627
+FC89 ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+ # <final> 0645 0645
+FC8A ARABIC LIGATURE NOON WITH REH FINAL FORM
+ # <final> 0646 0631
+FC8B ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+ # <final> 0646 0632
+FC8C ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+ # <final> 0646 0645
+FC8D ARABIC LIGATURE NOON WITH NOON FINAL FORM
+ # <final> 0646 0646
+FC8E ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+ # <final> 0646 0649
+FC8F ARABIC LIGATURE NOON WITH YEH FINAL FORM
+ # <final> 0646 064A
+FC90 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+ # <final> 0649 0670
+FC91 ARABIC LIGATURE YEH WITH REH FINAL FORM
+ # <final> 064A 0631
+FC92 ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+ # <final> 064A 0632
+FC93 ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+ # <final> 064A 0645
+FC94 ARABIC LIGATURE YEH WITH NOON FINAL FORM
+ # <final> 064A 0646
+FC95 ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+ # <final> 064A 0649
+FC96 ARABIC LIGATURE YEH WITH YEH FINAL FORM
+ # <final> 064A 064A
+FC97 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+ # <initial> 0626 062C
+FC98 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+ # <initial> 0626 062D
+FC99 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+ # <initial> 0626 062E
+FC9A ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+ # <initial> 0626 0645
+FC9B ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+ # <initial> 0626 0647
+FC9C ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+ # <initial> 0628 062C
+FC9D ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+ # <initial> 0628 062D
+FC9E ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+ # <initial> 0628 062E
+FC9F ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+ # <initial> 0628 0645
+FCA0 ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+ # <initial> 0628 0647
+FCA1 ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+ # <initial> 062A 062C
+FCA2 ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+ # <initial> 062A 062D
+FCA3 ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+ # <initial> 062A 062E
+FCA4 ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+ # <initial> 062A 0645
+FCA5 ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+ # <initial> 062A 0647
+FCA6 ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+ # <initial> 062B 0645
+FCA7 ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+ # <initial> 062C 062D
+FCA8 ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+ # <initial> 062C 0645
+FCA9 ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+ # <initial> 062D 062C
+FCAA ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+ # <initial> 062D 0645
+FCAB ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+ # <initial> 062E 062C
+FCAC ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+ # <initial> 062E 0645
+FCAD ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+ # <initial> 0633 062C
+FCAE ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+ # <initial> 0633 062D
+FCAF ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+ # <initial> 0633 062E
+FCB0 ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+ # <initial> 0633 0645
+FCB1 ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+ # <initial> 0635 062D
+FCB2 ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+ # <initial> 0635 062E
+FCB3 ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+ # <initial> 0635 0645
+FCB4 ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+ # <initial> 0636 062C
+FCB5 ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+ # <initial> 0636 062D
+FCB6 ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+ # <initial> 0636 062E
+FCB7 ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+ # <initial> 0636 0645
+FCB8 ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+ # <initial> 0637 062D
+FCB9 ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+ # <initial> 0638 0645
+FCBA ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+ # <initial> 0639 062C
+FCBB ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+ # <initial> 0639 0645
+FCBC ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+ # <initial> 063A 062C
+FCBD ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+ # <initial> 063A 0645
+FCBE ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+ # <initial> 0641 062C
+FCBF ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+ # <initial> 0641 062D
+FCC0 ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+ # <initial> 0641 062E
+FCC1 ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+ # <initial> 0641 0645
+FCC2 ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+ # <initial> 0642 062D
+FCC3 ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+ # <initial> 0642 0645
+FCC4 ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+ # <initial> 0643 062C
+FCC5 ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+ # <initial> 0643 062D
+FCC6 ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+ # <initial> 0643 062E
+FCC7 ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+ # <initial> 0643 0644
+FCC8 ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+ # <initial> 0643 0645
+FCC9 ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+ # <initial> 0644 062C
+FCCA ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+ # <initial> 0644 062D
+FCCB ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+ # <initial> 0644 062E
+FCCC ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+ # <initial> 0644 0645
+FCCD ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+ # <initial> 0644 0647
+FCCE ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+ # <initial> 0645 062C
+FCCF ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+ # <initial> 0645 062D
+FCD0 ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+ # <initial> 0645 062E
+FCD1 ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+ # <initial> 0645 0645
+FCD2 ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+ # <initial> 0646 062C
+FCD3 ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+ # <initial> 0646 062D
+FCD4 ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+ # <initial> 0646 062E
+FCD5 ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+ # <initial> 0646 0645
+FCD6 ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+ # <initial> 0646 0647
+FCD7 ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+ # <initial> 0647 062C
+FCD8 ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+ # <initial> 0647 0645
+FCD9 ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+ # <initial> 0647 0670
+FCDA ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+ # <initial> 064A 062C
+FCDB ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+ # <initial> 064A 062D
+FCDC ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+ # <initial> 064A 062E
+FCDD ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+ # <initial> 064A 0645
+FCDE ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+ # <initial> 064A 0647
+FCDF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+ # <medial> 0626 0645
+FCE0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+ # <medial> 0626 0647
+FCE1 ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+ # <medial> 0628 0645
+FCE2 ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+ # <medial> 0628 0647
+FCE3 ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+ # <medial> 062A 0645
+FCE4 ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+ # <medial> 062A 0647
+FCE5 ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+ # <medial> 062B 0645
+FCE6 ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+ # <medial> 062B 0647
+FCE7 ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+ # <medial> 0633 0645
+FCE8 ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+ # <medial> 0633 0647
+FCE9 ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+ # <medial> 0634 0645
+FCEA ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+ # <medial> 0634 0647
+FCEB ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+ # <medial> 0643 0644
+FCEC ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+ # <medial> 0643 0645
+FCED ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+ # <medial> 0644 0645
+FCEE ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+ # <medial> 0646 0645
+FCEF ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+ # <medial> 0646 0647
+FCF0 ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+ # <medial> 064A 0645
+FCF1 ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+ # <medial> 064A 0647
+FCF2 ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+ # <medial> 0640 064E 0651
+FCF3 ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+ # <medial> 0640 064F 0651
+FCF4 ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+ # <medial> 0640 0650 0651
+FCF5 ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0637 0649
+FCF6 ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+ # <isolated> 0637 064A
+FCF7 ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0639 0649
+FCF8 ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+ # <isolated> 0639 064A
+FCF9 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 063A 0649
+FCFA ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+ # <isolated> 063A 064A
+FCFB ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0633 0649
+FCFC ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+ # <isolated> 0633 064A
+FCFD ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0634 0649
+FCFE ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+ # <isolated> 0634 064A
+FCFF ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 062D 0649
+FD00 ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+ # <isolated> 062D 064A
+FD01 ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 062C 0649
+FD02 ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+ # <isolated> 062C 064A
+FD03 ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 062E 0649
+FD04 ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+ # <isolated> 062E 064A
+FD05 ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0635 0649
+FD06 ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+ # <isolated> 0635 064A
+FD07 ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0636 0649
+FD08 ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+ # <isolated> 0636 064A
+FD09 ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+ # <isolated> 0634 062C
+FD0A ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+ # <isolated> 0634 062D
+FD0B ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+ # <isolated> 0634 062E
+FD0C ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+ # <isolated> 0634 0645
+FD0D ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+ # <isolated> 0634 0631
+FD0E ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+ # <isolated> 0633 0631
+FD0F ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+ # <isolated> 0635 0631
+FD10 ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+ # <isolated> 0636 0631
+FD11 ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0637 0649
+FD12 ARABIC LIGATURE TAH WITH YEH FINAL FORM
+ # <final> 0637 064A
+FD13 ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+ # <final> 0639 0649
+FD14 ARABIC LIGATURE AIN WITH YEH FINAL FORM
+ # <final> 0639 064A
+FD15 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+ # <final> 063A 0649
+FD16 ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+ # <final> 063A 064A
+FD17 ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+ # <final> 0633 0649
+FD18 ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+ # <final> 0633 064A
+FD19 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+ # <final> 0634 0649
+FD1A ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+ # <final> 0634 064A
+FD1B ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 062D 0649
+FD1C ARABIC LIGATURE HAH WITH YEH FINAL FORM
+ # <final> 062D 064A
+FD1D ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 062C 0649
+FD1E ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+ # <final> 062C 064A
+FD1F ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 062E 0649
+FD20 ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+ # <final> 062E 064A
+FD21 ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+ # <final> 0635 0649
+FD22 ARABIC LIGATURE SAD WITH YEH FINAL FORM
+ # <final> 0635 064A
+FD23 ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+ # <final> 0636 0649
+FD24 ARABIC LIGATURE DAD WITH YEH FINAL FORM
+ # <final> 0636 064A
+FD25 ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+ # <final> 0634 062C
+FD26 ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+ # <final> 0634 062D
+FD27 ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+ # <final> 0634 062E
+FD28 ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+ # <final> 0634 0645
+FD29 ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+ # <final> 0634 0631
+FD2A ARABIC LIGATURE SEEN WITH REH FINAL FORM
+ # <final> 0633 0631
+FD2B ARABIC LIGATURE SAD WITH REH FINAL FORM
+ # <final> 0635 0631
+FD2C ARABIC LIGATURE DAD WITH REH FINAL FORM
+ # <final> 0636 0631
+FD2D ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+ # <initial> 0634 062C
+FD2E ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+ # <initial> 0634 062D
+FD2F ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+ # <initial> 0634 062E
+FD30 ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+ # <initial> 0634 0645
+FD31 ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+ # <initial> 0633 0647
+FD32 ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+ # <initial> 0634 0647
+FD33 ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+ # <initial> 0637 0645
+FD34 ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+ # <medial> 0633 062C
+FD35 ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+ # <medial> 0633 062D
+FD36 ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+ # <medial> 0633 062E
+FD37 ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+ # <medial> 0634 062C
+FD38 ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+ # <medial> 0634 062D
+FD39 ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+ # <medial> 0634 062E
+FD3A ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+ # <medial> 0637 0645
+FD3B ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+ # <medial> 0638 0645
+FD3C ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+ # <final> 0627 064B
+FD3D ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+ # <isolated> 0627 064B
+@ Punctuation
+FD3E ORNATE LEFT PARENTHESIS
+FD3F ORNATE RIGHT PARENTHESIS
+@ Ligatures (three elements)
+FD50 ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+ # <initial> 062A 062C 0645
+FD51 ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+ # <final> 062A 062D 062C
+FD52 ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+ # <initial> 062A 062D 062C
+FD53 ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+ # <initial> 062A 062D 0645
+FD54 ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+ # <initial> 062A 062E 0645
+FD55 ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+ # <initial> 062A 0645 062C
+FD56 ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+ # <initial> 062A 0645 062D
+FD57 ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+ # <initial> 062A 0645 062E
+FD58 ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+ # <final> 062C 0645 062D
+FD59 ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+ # <initial> 062C 0645 062D
+FD5A ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+ # <final> 062D 0645 064A
+FD5B ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 062D 0645 0649
+FD5C ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+ # <initial> 0633 062D 062C
+FD5D ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+ # <initial> 0633 062C 062D
+FD5E ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 0633 062C 0649
+FD5F ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+ # <final> 0633 0645 062D
+FD60 ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+ # <initial> 0633 0645 062D
+FD61 ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+ # <initial> 0633 0645 062C
+FD62 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+ # <final> 0633 0645 0645
+FD63 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0633 0645 0645
+FD64 ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+ # <final> 0635 062D 062D
+FD65 ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+ # <initial> 0635 062D 062D
+FD66 ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+ # <final> 0635 0645 0645
+FD67 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+ # <final> 0634 062D 0645
+FD68 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+ # <initial> 0634 062D 0645
+FD69 ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+ # <final> 0634 062C 064A
+FD6A ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+ # <final> 0634 0645 062E
+FD6B ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+ # <initial> 0634 0645 062E
+FD6C ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+ # <final> 0634 0645 0645
+FD6D ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0634 0645 0645
+FD6E ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0636 062D 0649
+FD6F ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+ # <final> 0636 062E 0645
+FD70 ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+ # <initial> 0636 062E 0645
+FD71 ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+ # <final> 0637 0645 062D
+FD72 ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+ # <initial> 0637 0645 062D
+FD73 ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0637 0645 0645
+FD74 ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+ # <final> 0637 0645 064A
+FD75 ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+ # <final> 0639 062C 0645
+FD76 ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+ # <final> 0639 0645 0645
+FD77 ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0639 0645 0645
+FD78 ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 0639 0645 0649
+FD79 ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+ # <final> 063A 0645 0645
+FD7A ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+ # <final> 063A 0645 064A
+FD7B ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 063A 0645 0649
+FD7C ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+ # <final> 0641 062E 0645
+FD7D ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+ # <initial> 0641 062E 0645
+FD7E ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+ # <final> 0642 0645 062D
+FD7F ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+ # <final> 0642 0645 0645
+FD80 ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+ # <final> 0644 062D 0645
+FD81 ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+ # <final> 0644 062D 064A
+FD82 ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0644 062D 0649
+FD83 ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+ # <initial> 0644 062C 062C
+FD84 ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+ # <final> 0644 062C 062C
+FD85 ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+ # <final> 0644 062E 0645
+FD86 ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+ # <initial> 0644 062E 0645
+FD87 ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+ # <final> 0644 0645 062D
+FD88 ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+ # <initial> 0644 0645 062D
+FD89 ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+ # <initial> 0645 062D 062C
+FD8A ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+ # <initial> 0645 062D 0645
+FD8B ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+ # <final> 0645 062D 064A
+FD8C ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+ # <initial> 0645 062C 062D
+FD8D ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+ # <initial> 0645 062C 0645
+FD8E ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+ # <initial> 0645 062E 062C
+FD8F ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+ # <initial> 0645 062E 0645
+FD92 ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+ # <initial> 0645 062C 062E
+FD93 ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+ # <initial> 0647 0645 062C
+FD94 ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0647 0645 0645
+FD95 ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+ # <initial> 0646 062D 0645
+FD96 ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0646 062D 0649
+FD97 ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+ # <final> 0646 062C 0645
+FD98 ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+ # <initial> 0646 062C 0645
+FD99 ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 0646 062C 0649
+FD9A ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+ # <final> 0646 0645 064A
+FD9B ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 0646 0645 0649
+FD9C ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+ # <final> 064A 0645 0645
+FD9D ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 064A 0645 0645
+FD9E ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+ # <final> 0628 062E 064A
+FD9F ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+ # <final> 062A 062C 064A
+FDA0 ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 062A 062C 0649
+FDA1 ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+ # <final> 062A 062E 064A
+FDA2 ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 062A 062E 0649
+FDA3 ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+ # <final> 062A 0645 064A
+FDA4 ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 062A 0645 0649
+FDA5 ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+ # <final> 062C 0645 064A
+FDA6 ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 062C 062D 0649
+FDA7 ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 062C 0645 0649
+FDA8 ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0633 062E 0649
+FDA9 ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+ # <final> 0635 062D 064A
+FDAA ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+ # <final> 0634 062D 064A
+FDAB ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+ # <final> 0636 062D 064A
+FDAC ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+ # <final> 0644 062C 064A
+FDAD ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+ # <final> 0644 0645 064A
+FDAE ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+ # <final> 064A 062D 064A
+FDAF ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+ # <final> 064A 062C 064A
+FDB0 ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+ # <final> 064A 0645 064A
+FDB1 ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+ # <final> 0645 0645 064A
+FDB2 ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+ # <final> 0642 0645 064A
+FDB3 ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+ # <final> 0646 062D 064A
+FDB4 ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+ # <initial> 0642 0645 062D
+FDB5 ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+ # <initial> 0644 062D 0645
+FDB6 ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+ # <final> 0639 0645 064A
+FDB7 ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+ # <final> 0643 0645 064A
+FDB8 ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+ # <initial> 0646 062C 062D
+FDB9 ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+ # <final> 0645 062E 064A
+FDBA ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+ # <initial> 0644 062C 0645
+FDBB ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+ # <final> 0643 0645 0645
+FDBC ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+ # <final> 0644 062C 0645
+FDBD ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+ # <final> 0646 062C 062D
+FDBE ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+ # <final> 062C 062D 064A
+FDBF ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+ # <final> 062D 062C 064A
+FDC0 ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+ # <final> 0645 062C 064A
+FDC1 ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+ # <final> 0641 0645 064A
+FDC2 ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+ # <final> 0628 062D 064A
+FDC3 ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0643 0645 0645
+FDC4 ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+ # <initial> 0639 062C 0645
+FDC5 ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0635 0645 0645
+FDC6 ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+ # <final> 0633 062E 064A
+FDC7 ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+ # <final> 0646 062C 064A
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+FDD0 <not a character>
+FDD1 <not a character>
+FDD2 <not a character>
+FDD3 <not a character>
+FDD4 <not a character>
+FDD5 <not a character>
+FDD6 <not a character>
+FDD7 <not a character>
+FDD8 <not a character>
+FDD9 <not a character>
+FDDA <not a character>
+FDDB <not a character>
+FDDC <not a character>
+FDDD <not a character>
+FDDE <not a character>
+FDDF <not a character>
+FDE0 <not a character>
+FDE1 <not a character>
+FDE2 <not a character>
+FDE3 <not a character>
+FDE4 <not a character>
+FDE5 <not a character>
+FDE6 <not a character>
+FDE7 <not a character>
+FDE8 <not a character>
+FDE9 <not a character>
+FDEA <not a character>
+FDEB <not a character>
+FDEC <not a character>
+FDED <not a character>
+FDEE <not a character>
+FDEF <not a character>
+@ Word ligatures
+FDF0 ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+ # <isolated> 0635 0644 06D2
+FDF1 ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+ # <isolated> 0642 0644 06D2
+FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM
+ # <isolated> 0627 0644 0644 0647
+FDF3 ARABIC LIGATURE AKBAR ISOLATED FORM
+ # <isolated> 0627 0643 0628 0631
+FDF4 ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+ # <isolated> 0645 062D 0645 062F
+FDF5 ARABIC LIGATURE SALAM ISOLATED FORM
+ # <isolated> 0635 0644 0639 0645
+FDF6 ARABIC LIGATURE RASOUL ISOLATED FORM
+ # <isolated> 0631 0633 0648 0644
+FDF7 ARABIC LIGATURE ALAYHE ISOLATED FORM
+ # <isolated> 0639 0644 064A 0647
+FDF8 ARABIC LIGATURE WASALLAM ISOLATED FORM
+ # <isolated> 0648 0633 0644 0645
+FDF9 ARABIC LIGATURE SALLA ISOLATED FORM
+ # <isolated> 0635 0644 0649
+FDFA ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+ # <isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645
+FDFB ARABIC LIGATURE JALLAJALALOUHOU
+ # <isolated> 062C 0644 0020 062C 0644 0627 0644 0647
+@ Currency sign
+FDFC RIAL SIGN
+ # <isolated> 0631 06CC 0627 0644
+@ Symbol
+FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+@@ FE00 Variation Selectors FE0F
+@ Variation selectors
+@+ Combining characters; in conjunction with the preceding character these indicate a predetermined choice of variant glyph
+FE00 VARIATION SELECTOR-1
+ * these are abbreviated VS1, and so on
+FE01 VARIATION SELECTOR-2
+FE02 VARIATION SELECTOR-3
+FE03 VARIATION SELECTOR-4
+FE04 VARIATION SELECTOR-5
+FE05 VARIATION SELECTOR-6
+FE06 VARIATION SELECTOR-7
+FE07 VARIATION SELECTOR-8
+FE08 VARIATION SELECTOR-9
+FE09 VARIATION SELECTOR-10
+FE0A VARIATION SELECTOR-11
+FE0B VARIATION SELECTOR-12
+FE0C VARIATION SELECTOR-13
+FE0D VARIATION SELECTOR-14
+FE0E VARIATION SELECTOR-15
+FE0F VARIATION SELECTOR-16
+@@ FE10 Vertical forms FE1F
+@+ These characters are compatibility characters needed to map to GB 18030.
+@ Glyphs for vertical variants
+FE10 PRESENTATION FORM FOR VERTICAL COMMA
+ x (small comma - FE50)
+ # <vertical> 002C
+FE11 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
+ x (sesame dot - FE45)
+ x (small ideographic comma - FE51)
+ # <vertical> 3001
+FE12 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP
+ # <vertical> 3002
+FE13 PRESENTATION FORM FOR VERTICAL COLON
+ x (small colon - FE55)
+ # <vertical> 003A
+FE14 PRESENTATION FORM FOR VERTICAL SEMICOLON
+ x (small semicolon - FE54)
+ # <vertical> 003B
+FE15 PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
+ x (small exclamation mark - FE57)
+ # <vertical> 0021
+FE16 PRESENTATION FORM FOR VERTICAL QUESTION MARK
+ x (small question mark - FE56)
+ # <vertical> 003F
+FE17 PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+ # <vertical> 3016
+FE18 PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+ % PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET
+ * misspelling of "BRACKET" in character name is a known defect
+ # <vertical> 3017
+FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+ x (vertical ellipsis - 22EE)
+ # <vertical> 2026
+@@ FE20 Combining Half Marks FE2F
+@ Combining half marks
+FE20 COMBINING LIGATURE LEFT HALF
+FE21 COMBINING LIGATURE RIGHT HALF
+ x (combining double inverted breve - 0361)
+FE22 COMBINING DOUBLE TILDE LEFT HALF
+FE23 COMBINING DOUBLE TILDE RIGHT HALF
+ x (combining double tilde - 0360)
+@ Continuous macrons for Coptic
+@+ These are used in combinations to represent continuous macrons over a sequence of Coptic letters.
+FE24 COMBINING MACRON LEFT HALF
+FE25 COMBINING MACRON RIGHT HALF
+FE26 COMBINING CONJOINING MACRON
+ x (combining macron - 0304)
+ x (combining double macron - 035E)
+@@ FE30 CJK Compatibility Forms FE4F
+@ Glyphs for vertical variants
+FE30 PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+ # <vertical> 2025
+FE31 PRESENTATION FORM FOR VERTICAL EM DASH
+ # <vertical> 2014
+FE32 PRESENTATION FORM FOR VERTICAL EN DASH
+ # <vertical> 2013
+FE33 PRESENTATION FORM FOR VERTICAL LOW LINE
+ # <vertical> 005F
+FE34 PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+ # <vertical> 005F
+FE35 PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+ x (top parenthesis - 23DC)
+ # <vertical> 0028
+FE36 PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+ x (bottom parenthesis - 23DD)
+ # <vertical> 0029
+FE37 PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+ x (top curly bracket - 23DE)
+ # <vertical> 007B
+FE38 PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+ x (bottom curly bracket - 23DF)
+ # <vertical> 007D
+FE39 PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+ x (top tortoise shell bracket - 23E0)
+ # <vertical> 3014
+FE3A PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+ x (bottom tortoise shell bracket - 23E1)
+ # <vertical> 3015
+FE3B PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+ # <vertical> 3010
+FE3C PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+ # <vertical> 3011
+FE3D PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+ # <vertical> 300A
+FE3E PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+ # <vertical> 300B
+FE3F PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+ # <vertical> 3008
+FE40 PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+ # <vertical> 3009
+FE41 PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+ # <vertical> 300C
+FE42 PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+ # <vertical> 300D
+FE43 PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+ # <vertical> 300E
+FE44 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+ # <vertical> 300F
+@ Sidelining emphasis marks
+FE45 SESAME DOT
+ x (small ideographic comma - FE51)
+FE46 WHITE SESAME DOT
+ * sesame dots are used beside vertical text for emphasis
+@ Glyphs for vertical variants
+FE47 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+ x (top square bracket - 23B4)
+ # <vertical> 005B
+FE48 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+ x (bottom square bracket - 23B5)
+ # <vertical> 005D
+@ Overscores and underscores
+FE49 DASHED OVERLINE
+ # 203E overline
+FE4A CENTRELINE OVERLINE
+ # 203E overline
+FE4B WAVY OVERLINE
+ # 203E overline
+FE4C DOUBLE WAVY OVERLINE
+ # 203E overline
+FE4D DASHED LOW LINE
+ # 005F low line
+FE4E CENTRELINE LOW LINE
+ # 005F low line
+FE4F WAVY LOW LINE
+ # 005F low line
+@@ FE50 Small Form Variants FE6F
+@+ Compatibility variants for CNS 11643.
+@ Small form variants
+FE50 SMALL COMMA
+ x (presentation form for vertical comma - FE10)
+ # <small> 002C
+FE51 SMALL IDEOGRAPHIC COMMA
+ x (presentation form for vertical ideographic comma - FE11)
+ x (sesame dot - FE45)
+ # <small> 3001
+FE52 SMALL FULL STOP
+ # <small> 002E
+FE54 SMALL SEMICOLON
+ x (presentation form for vertical semicolon - FE14)
+ # <small> 003B
+FE55 SMALL COLON
+ x (presentation form for vertical colon - FE13)
+ # <small> 003A
+FE56 SMALL QUESTION MARK
+ # <small> 003F
+FE57 SMALL EXCLAMATION MARK
+ # <small> 0021
+FE58 SMALL EM DASH
+ # <small> 2014
+FE59 SMALL LEFT PARENTHESIS
+ # <small> 0028
+FE5A SMALL RIGHT PARENTHESIS
+ # <small> 0029
+FE5B SMALL LEFT CURLY BRACKET
+ # <small> 007B
+FE5C SMALL RIGHT CURLY BRACKET
+ # <small> 007D
+FE5D SMALL LEFT TORTOISE SHELL BRACKET
+ # <small> 3014
+FE5E SMALL RIGHT TORTOISE SHELL BRACKET
+ # <small> 3015
+FE5F SMALL NUMBER SIGN
+ # <small> 0023
+FE60 SMALL AMPERSAND
+ # <small> 0026
+FE61 SMALL ASTERISK
+ # <small> 002A
+FE62 SMALL PLUS SIGN
+ # <small> 002B
+FE63 SMALL HYPHEN-MINUS
+ # <small> 002D
+FE64 SMALL LESS-THAN SIGN
+ # <small> 003C
+FE65 SMALL GREATER-THAN SIGN
+ # <small> 003E
+FE66 SMALL EQUALS SIGN
+ # <small> 003D
+FE68 SMALL REVERSE SOLIDUS
+ # <small> 005C
+FE69 SMALL DOLLAR SIGN
+ # <small> 0024
+FE6A SMALL PERCENT SIGN
+ # <small> 0025
+FE6B SMALL COMMERCIAL AT
+ # <small> 0040
+@@ FE70 Arabic Presentation Forms-B FEFF
+@+ Preferred characters are found in the Arabic block 0600 - 06FF. Some of these characters are used for Arabic mathematics where contextual shape variations are important semantically.
+@ Glyphs for spacing forms of Arabic points
+FE70 ARABIC FATHATAN ISOLATED FORM
+ # <isolated> 0020 064B
+FE71 ARABIC TATWEEL WITH FATHATAN ABOVE
+ # <medial> 0640 064B
+FE72 ARABIC DAMMATAN ISOLATED FORM
+ # <isolated> 0020 064C
+@ Glyph part
+FE73 ARABIC TAIL FRAGMENT
+ * for compatibility with certain legacy character sets
+@ Glyphs for spacing forms of Arabic points
+FE74 ARABIC KASRATAN ISOLATED FORM
+ # <isolated> 0020 064D
+FE76 ARABIC FATHA ISOLATED FORM
+ # <isolated> 0020 064E
+FE77 ARABIC FATHA MEDIAL FORM
+ # <medial> 0640 064E
+FE78 ARABIC DAMMA ISOLATED FORM
+ # <isolated> 0020 064F
+FE79 ARABIC DAMMA MEDIAL FORM
+ # <medial> 0640 064F
+FE7A ARABIC KASRA ISOLATED FORM
+ # <isolated> 0020 0650
+FE7B ARABIC KASRA MEDIAL FORM
+ # <medial> 0640 0650
+FE7C ARABIC SHADDA ISOLATED FORM
+ # <isolated> 0020 0651
+FE7D ARABIC SHADDA MEDIAL FORM
+ # <medial> 0640 0651
+FE7E ARABIC SUKUN ISOLATED FORM
+ # <isolated> 0020 0652
+FE7F ARABIC SUKUN MEDIAL FORM
+ # <medial> 0640 0652
+@ Basic glyphs for Arabic language contextual forms
+FE80 ARABIC LETTER HAMZA ISOLATED FORM
+ # <isolated> 0621
+FE81 ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+ # <isolated> 0622
+FE82 ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+ # <final> 0622
+FE83 ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+ # <isolated> 0623
+FE84 ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+ # <final> 0623
+FE85 ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+ # <isolated> 0624
+FE86 ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+ # <final> 0624
+FE87 ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+ # <isolated> 0625
+FE88 ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+ # <final> 0625
+FE89 ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+ # <isolated> 0626
+FE8A ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+ # <final> 0626
+FE8B ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+ # <initial> 0626
+FE8C ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+ # <medial> 0626
+FE8D ARABIC LETTER ALEF ISOLATED FORM
+ # <isolated> 0627
+FE8E ARABIC LETTER ALEF FINAL FORM
+ # <final> 0627
+FE8F ARABIC LETTER BEH ISOLATED FORM
+ # <isolated> 0628
+FE90 ARABIC LETTER BEH FINAL FORM
+ # <final> 0628
+FE91 ARABIC LETTER BEH INITIAL FORM
+ # <initial> 0628
+FE92 ARABIC LETTER BEH MEDIAL FORM
+ # <medial> 0628
+FE93 ARABIC LETTER TEH MARBUTA ISOLATED FORM
+ # <isolated> 0629
+FE94 ARABIC LETTER TEH MARBUTA FINAL FORM
+ # <final> 0629
+FE95 ARABIC LETTER TEH ISOLATED FORM
+ # <isolated> 062A
+FE96 ARABIC LETTER TEH FINAL FORM
+ # <final> 062A
+FE97 ARABIC LETTER TEH INITIAL FORM
+ # <initial> 062A
+FE98 ARABIC LETTER TEH MEDIAL FORM
+ # <medial> 062A
+FE99 ARABIC LETTER THEH ISOLATED FORM
+ # <isolated> 062B
+FE9A ARABIC LETTER THEH FINAL FORM
+ # <final> 062B
+FE9B ARABIC LETTER THEH INITIAL FORM
+ # <initial> 062B
+FE9C ARABIC LETTER THEH MEDIAL FORM
+ # <medial> 062B
+FE9D ARABIC LETTER JEEM ISOLATED FORM
+ # <isolated> 062C
+FE9E ARABIC LETTER JEEM FINAL FORM
+ # <final> 062C
+FE9F ARABIC LETTER JEEM INITIAL FORM
+ # <initial> 062C
+FEA0 ARABIC LETTER JEEM MEDIAL FORM
+ # <medial> 062C
+FEA1 ARABIC LETTER HAH ISOLATED FORM
+ # <isolated> 062D
+FEA2 ARABIC LETTER HAH FINAL FORM
+ # <final> 062D
+FEA3 ARABIC LETTER HAH INITIAL FORM
+ # <initial> 062D
+FEA4 ARABIC LETTER HAH MEDIAL FORM
+ # <medial> 062D
+FEA5 ARABIC LETTER KHAH ISOLATED FORM
+ # <isolated> 062E
+FEA6 ARABIC LETTER KHAH FINAL FORM
+ # <final> 062E
+FEA7 ARABIC LETTER KHAH INITIAL FORM
+ # <initial> 062E
+FEA8 ARABIC LETTER KHAH MEDIAL FORM
+ # <medial> 062E
+FEA9 ARABIC LETTER DAL ISOLATED FORM
+ # <isolated> 062F
+FEAA ARABIC LETTER DAL FINAL FORM
+ # <final> 062F
+FEAB ARABIC LETTER THAL ISOLATED FORM
+ # <isolated> 0630
+FEAC ARABIC LETTER THAL FINAL FORM
+ # <final> 0630
+FEAD ARABIC LETTER REH ISOLATED FORM
+ # <isolated> 0631
+FEAE ARABIC LETTER REH FINAL FORM
+ # <final> 0631
+FEAF ARABIC LETTER ZAIN ISOLATED FORM
+ # <isolated> 0632
+FEB0 ARABIC LETTER ZAIN FINAL FORM
+ # <final> 0632
+FEB1 ARABIC LETTER SEEN ISOLATED FORM
+ # <isolated> 0633
+FEB2 ARABIC LETTER SEEN FINAL FORM
+ # <final> 0633
+FEB3 ARABIC LETTER SEEN INITIAL FORM
+ # <initial> 0633
+FEB4 ARABIC LETTER SEEN MEDIAL FORM
+ # <medial> 0633
+FEB5 ARABIC LETTER SHEEN ISOLATED FORM
+ # <isolated> 0634
+FEB6 ARABIC LETTER SHEEN FINAL FORM
+ # <final> 0634
+FEB7 ARABIC LETTER SHEEN INITIAL FORM
+ # <initial> 0634
+FEB8 ARABIC LETTER SHEEN MEDIAL FORM
+ # <medial> 0634
+FEB9 ARABIC LETTER SAD ISOLATED FORM
+ # <isolated> 0635
+FEBA ARABIC LETTER SAD FINAL FORM
+ # <final> 0635
+FEBB ARABIC LETTER SAD INITIAL FORM
+ # <initial> 0635
+FEBC ARABIC LETTER SAD MEDIAL FORM
+ # <medial> 0635
+FEBD ARABIC LETTER DAD ISOLATED FORM
+ # <isolated> 0636
+FEBE ARABIC LETTER DAD FINAL FORM
+ # <final> 0636
+FEBF ARABIC LETTER DAD INITIAL FORM
+ # <initial> 0636
+FEC0 ARABIC LETTER DAD MEDIAL FORM
+ # <medial> 0636
+FEC1 ARABIC LETTER TAH ISOLATED FORM
+ # <isolated> 0637
+FEC2 ARABIC LETTER TAH FINAL FORM
+ # <final> 0637
+FEC3 ARABIC LETTER TAH INITIAL FORM
+ # <initial> 0637
+FEC4 ARABIC LETTER TAH MEDIAL FORM
+ # <medial> 0637
+FEC5 ARABIC LETTER ZAH ISOLATED FORM
+ # <isolated> 0638
+FEC6 ARABIC LETTER ZAH FINAL FORM
+ # <final> 0638
+FEC7 ARABIC LETTER ZAH INITIAL FORM
+ # <initial> 0638
+FEC8 ARABIC LETTER ZAH MEDIAL FORM
+ # <medial> 0638
+FEC9 ARABIC LETTER AIN ISOLATED FORM
+ # <isolated> 0639
+FECA ARABIC LETTER AIN FINAL FORM
+ # <final> 0639
+FECB ARABIC LETTER AIN INITIAL FORM
+ # <initial> 0639
+FECC ARABIC LETTER AIN MEDIAL FORM
+ # <medial> 0639
+FECD ARABIC LETTER GHAIN ISOLATED FORM
+ # <isolated> 063A
+FECE ARABIC LETTER GHAIN FINAL FORM
+ # <final> 063A
+FECF ARABIC LETTER GHAIN INITIAL FORM
+ # <initial> 063A
+FED0 ARABIC LETTER GHAIN MEDIAL FORM
+ # <medial> 063A
+FED1 ARABIC LETTER FEH ISOLATED FORM
+ # <isolated> 0641
+FED2 ARABIC LETTER FEH FINAL FORM
+ # <final> 0641
+FED3 ARABIC LETTER FEH INITIAL FORM
+ # <initial> 0641
+FED4 ARABIC LETTER FEH MEDIAL FORM
+ # <medial> 0641
+FED5 ARABIC LETTER QAF ISOLATED FORM
+ # <isolated> 0642
+FED6 ARABIC LETTER QAF FINAL FORM
+ # <final> 0642
+FED7 ARABIC LETTER QAF INITIAL FORM
+ # <initial> 0642
+FED8 ARABIC LETTER QAF MEDIAL FORM
+ # <medial> 0642
+FED9 ARABIC LETTER KAF ISOLATED FORM
+ # <isolated> 0643
+FEDA ARABIC LETTER KAF FINAL FORM
+ # <final> 0643
+FEDB ARABIC LETTER KAF INITIAL FORM
+ # <initial> 0643
+FEDC ARABIC LETTER KAF MEDIAL FORM
+ # <medial> 0643
+FEDD ARABIC LETTER LAM ISOLATED FORM
+ # <isolated> 0644
+FEDE ARABIC LETTER LAM FINAL FORM
+ # <final> 0644
+FEDF ARABIC LETTER LAM INITIAL FORM
+ # <initial> 0644
+FEE0 ARABIC LETTER LAM MEDIAL FORM
+ # <medial> 0644
+FEE1 ARABIC LETTER MEEM ISOLATED FORM
+ # <isolated> 0645
+FEE2 ARABIC LETTER MEEM FINAL FORM
+ # <final> 0645
+FEE3 ARABIC LETTER MEEM INITIAL FORM
+ # <initial> 0645
+FEE4 ARABIC LETTER MEEM MEDIAL FORM
+ # <medial> 0645
+FEE5 ARABIC LETTER NOON ISOLATED FORM
+ # <isolated> 0646
+FEE6 ARABIC LETTER NOON FINAL FORM
+ # <final> 0646
+FEE7 ARABIC LETTER NOON INITIAL FORM
+ # <initial> 0646
+FEE8 ARABIC LETTER NOON MEDIAL FORM
+ # <medial> 0646
+FEE9 ARABIC LETTER HEH ISOLATED FORM
+ # <isolated> 0647
+FEEA ARABIC LETTER HEH FINAL FORM
+ # <final> 0647
+FEEB ARABIC LETTER HEH INITIAL FORM
+ # <initial> 0647
+FEEC ARABIC LETTER HEH MEDIAL FORM
+ # <medial> 0647
+FEED ARABIC LETTER WAW ISOLATED FORM
+ # <isolated> 0648
+FEEE ARABIC LETTER WAW FINAL FORM
+ # <final> 0648
+FEEF ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0649
+FEF0 ARABIC LETTER ALEF MAKSURA FINAL FORM
+ # <final> 0649
+FEF1 ARABIC LETTER YEH ISOLATED FORM
+ # <isolated> 064A
+FEF2 ARABIC LETTER YEH FINAL FORM
+ # <final> 064A
+FEF3 ARABIC LETTER YEH INITIAL FORM
+ # <initial> 064A
+FEF4 ARABIC LETTER YEH MEDIAL FORM
+ # <medial> 064A
+FEF5 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+ # <isolated> 0644 0622
+FEF6 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+ # <final> 0644 0622
+FEF7 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+ # <isolated> 0644 0623
+FEF8 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+ # <final> 0644 0623
+FEF9 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+ # <isolated> 0644 0625
+FEFA ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+ # <final> 0644 0625
+FEFB ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+ # <isolated> 0644 0627
+FEFC ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+ # <final> 0644 0627
+@ Special
+FEFF ZERO WIDTH NO-BREAK SPACE
+ = BYTE ORDER MARK (BOM), ZWNBSP
+ * may be used to detect byte order by contrast with the noncharacter code point FFFE
+ * use as an indication of non-breaking is deprecated; see 2060 instead
+ x (zero width space - 200B)
+ x (word joiner - 2060)
+ x (<not a character> - FFFE)
+@@ FF00 Halfwidth and Fullwidth Forms FFEF
+@ Fullwidth ASCII variants
+@+ See ASCII 0020 - 007E
+FF01 FULLWIDTH EXCLAMATION MARK
+ # <wide> 0021
+FF02 FULLWIDTH QUOTATION MARK
+ # <wide> 0022
+FF03 FULLWIDTH NUMBER SIGN
+ # <wide> 0023
+FF04 FULLWIDTH DOLLAR SIGN
+ # <wide> 0024
+FF05 FULLWIDTH PERCENT SIGN
+ # <wide> 0025
+FF06 FULLWIDTH AMPERSAND
+ # <wide> 0026
+FF07 FULLWIDTH APOSTROPHE
+ # <wide> 0027
+FF08 FULLWIDTH LEFT PARENTHESIS
+ # <wide> 0028
+FF09 FULLWIDTH RIGHT PARENTHESIS
+ # <wide> 0029
+FF0A FULLWIDTH ASTERISK
+ # <wide> 002A
+FF0B FULLWIDTH PLUS SIGN
+ # <wide> 002B
+FF0C FULLWIDTH COMMA
+ # <wide> 002C
+FF0D FULLWIDTH HYPHEN-MINUS
+ # <wide> 002D
+FF0E FULLWIDTH FULL STOP
+ # <wide> 002E
+FF0F FULLWIDTH SOLIDUS
+ # <wide> 002F
+FF10 FULLWIDTH DIGIT ZERO
+ # <wide> 0030
+FF11 FULLWIDTH DIGIT ONE
+ # <wide> 0031
+FF12 FULLWIDTH DIGIT TWO
+ # <wide> 0032
+FF13 FULLWIDTH DIGIT THREE
+ # <wide> 0033
+FF14 FULLWIDTH DIGIT FOUR
+ # <wide> 0034
+FF15 FULLWIDTH DIGIT FIVE
+ # <wide> 0035
+FF16 FULLWIDTH DIGIT SIX
+ # <wide> 0036
+FF17 FULLWIDTH DIGIT SEVEN
+ # <wide> 0037
+FF18 FULLWIDTH DIGIT EIGHT
+ # <wide> 0038
+FF19 FULLWIDTH DIGIT NINE
+ # <wide> 0039
+FF1A FULLWIDTH COLON
+ # <wide> 003A
+FF1B FULLWIDTH SEMICOLON
+ # <wide> 003B
+FF1C FULLWIDTH LESS-THAN SIGN
+ # <wide> 003C
+FF1D FULLWIDTH EQUALS SIGN
+ # <wide> 003D
+FF1E FULLWIDTH GREATER-THAN SIGN
+ # <wide> 003E
+FF1F FULLWIDTH QUESTION MARK
+ # <wide> 003F
+FF20 FULLWIDTH COMMERCIAL AT
+ # <wide> 0040
+FF21 FULLWIDTH LATIN CAPITAL LETTER A
+ # <wide> 0041
+FF22 FULLWIDTH LATIN CAPITAL LETTER B
+ # <wide> 0042
+FF23 FULLWIDTH LATIN CAPITAL LETTER C
+ # <wide> 0043
+FF24 FULLWIDTH LATIN CAPITAL LETTER D
+ # <wide> 0044
+FF25 FULLWIDTH LATIN CAPITAL LETTER E
+ # <wide> 0045
+FF26 FULLWIDTH LATIN CAPITAL LETTER F
+ # <wide> 0046
+FF27 FULLWIDTH LATIN CAPITAL LETTER G
+ # <wide> 0047
+FF28 FULLWIDTH LATIN CAPITAL LETTER H
+ # <wide> 0048
+FF29 FULLWIDTH LATIN CAPITAL LETTER I
+ # <wide> 0049
+FF2A FULLWIDTH LATIN CAPITAL LETTER J
+ # <wide> 004A
+FF2B FULLWIDTH LATIN CAPITAL LETTER K
+ # <wide> 004B
+FF2C FULLWIDTH LATIN CAPITAL LETTER L
+ # <wide> 004C
+FF2D FULLWIDTH LATIN CAPITAL LETTER M
+ # <wide> 004D
+FF2E FULLWIDTH LATIN CAPITAL LETTER N
+ # <wide> 004E
+FF2F FULLWIDTH LATIN CAPITAL LETTER O
+ # <wide> 004F
+FF30 FULLWIDTH LATIN CAPITAL LETTER P
+ # <wide> 0050
+FF31 FULLWIDTH LATIN CAPITAL LETTER Q
+ # <wide> 0051
+FF32 FULLWIDTH LATIN CAPITAL LETTER R
+ # <wide> 0052
+FF33 FULLWIDTH LATIN CAPITAL LETTER S
+ # <wide> 0053
+FF34 FULLWIDTH LATIN CAPITAL LETTER T
+ # <wide> 0054
+FF35 FULLWIDTH LATIN CAPITAL LETTER U
+ # <wide> 0055
+FF36 FULLWIDTH LATIN CAPITAL LETTER V
+ # <wide> 0056
+FF37 FULLWIDTH LATIN CAPITAL LETTER W
+ # <wide> 0057
+FF38 FULLWIDTH LATIN CAPITAL LETTER X
+ # <wide> 0058
+FF39 FULLWIDTH LATIN CAPITAL LETTER Y
+ # <wide> 0059
+FF3A FULLWIDTH LATIN CAPITAL LETTER Z
+ # <wide> 005A
+FF3B FULLWIDTH LEFT SQUARE BRACKET
+ # <wide> 005B
+FF3C FULLWIDTH REVERSE SOLIDUS
+ # <wide> 005C
+FF3D FULLWIDTH RIGHT SQUARE BRACKET
+ # <wide> 005D
+FF3E FULLWIDTH CIRCUMFLEX ACCENT
+ # <wide> 005E
+FF3F FULLWIDTH LOW LINE
+ # <wide> 005F
+FF40 FULLWIDTH GRAVE ACCENT
+ # <wide> 0060
+FF41 FULLWIDTH LATIN SMALL LETTER A
+ # <wide> 0061
+FF42 FULLWIDTH LATIN SMALL LETTER B
+ # <wide> 0062
+FF43 FULLWIDTH LATIN SMALL LETTER C
+ # <wide> 0063
+FF44 FULLWIDTH LATIN SMALL LETTER D
+ # <wide> 0064
+FF45 FULLWIDTH LATIN SMALL LETTER E
+ # <wide> 0065
+FF46 FULLWIDTH LATIN SMALL LETTER F
+ # <wide> 0066
+FF47 FULLWIDTH LATIN SMALL LETTER G
+ # <wide> 0067
+FF48 FULLWIDTH LATIN SMALL LETTER H
+ # <wide> 0068
+FF49 FULLWIDTH LATIN SMALL LETTER I
+ # <wide> 0069
+FF4A FULLWIDTH LATIN SMALL LETTER J
+ # <wide> 006A
+FF4B FULLWIDTH LATIN SMALL LETTER K
+ # <wide> 006B
+FF4C FULLWIDTH LATIN SMALL LETTER L
+ # <wide> 006C
+FF4D FULLWIDTH LATIN SMALL LETTER M
+ # <wide> 006D
+FF4E FULLWIDTH LATIN SMALL LETTER N
+ # <wide> 006E
+FF4F FULLWIDTH LATIN SMALL LETTER O
+ # <wide> 006F
+FF50 FULLWIDTH LATIN SMALL LETTER P
+ # <wide> 0070
+FF51 FULLWIDTH LATIN SMALL LETTER Q
+ # <wide> 0071
+FF52 FULLWIDTH LATIN SMALL LETTER R
+ # <wide> 0072
+FF53 FULLWIDTH LATIN SMALL LETTER S
+ # <wide> 0073
+FF54 FULLWIDTH LATIN SMALL LETTER T
+ # <wide> 0074
+FF55 FULLWIDTH LATIN SMALL LETTER U
+ # <wide> 0075
+FF56 FULLWIDTH LATIN SMALL LETTER V
+ # <wide> 0076
+FF57 FULLWIDTH LATIN SMALL LETTER W
+ # <wide> 0077
+FF58 FULLWIDTH LATIN SMALL LETTER X
+ # <wide> 0078
+FF59 FULLWIDTH LATIN SMALL LETTER Y
+ # <wide> 0079
+FF5A FULLWIDTH LATIN SMALL LETTER Z
+ # <wide> 007A
+FF5B FULLWIDTH LEFT CURLY BRACKET
+ # <wide> 007B
+FF5C FULLWIDTH VERTICAL LINE
+ # <wide> 007C
+FF5D FULLWIDTH RIGHT CURLY BRACKET
+ # <wide> 007D
+FF5E FULLWIDTH TILDE
+ # <wide> 007E
+@ Fullwidth brackets
+FF5F FULLWIDTH LEFT WHITE PARENTHESIS *
+ * the most commonly occurring glyph variant looks like doubled parentheses
+ x (left double parenthesis - 2E28)
+ # <wide> 2985
+FF60 FULLWIDTH RIGHT WHITE PARENTHESIS *
+ # <wide> 2986
+@ Halfwidth CJK punctuation
+@+ See CJK punctuation 3000 - 303F
+FF61 HALFWIDTH IDEOGRAPHIC FULL STOP
+ # <narrow> 3002
+FF62 HALFWIDTH LEFT CORNER BRACKET
+ # <narrow> 300C
+FF63 HALFWIDTH RIGHT CORNER BRACKET
+ # <narrow> 300D
+FF64 HALFWIDTH IDEOGRAPHIC COMMA
+ # <narrow> 3001
+@ Halfwidth Katakana variants
+@+ See Katakana 30A0 - 30FF
+FF65 HALFWIDTH KATAKANA MIDDLE DOT
+ # <narrow> 30FB
+FF66 HALFWIDTH KATAKANA LETTER WO
+ # <narrow> 30F2
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+ # <narrow> 30A1
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+ # <narrow> 30A3
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+ # <narrow> 30A5
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+ # <narrow> 30A7
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+ # <narrow> 30A9
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+ # <narrow> 30E3
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+ # <narrow> 30E5
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+ # <narrow> 30E7
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+ # <narrow> 30C3
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ # <narrow> 30FC
+FF71 HALFWIDTH KATAKANA LETTER A
+ # <narrow> 30A2
+FF72 HALFWIDTH KATAKANA LETTER I
+ # <narrow> 30A4
+FF73 HALFWIDTH KATAKANA LETTER U
+ # <narrow> 30A6
+FF74 HALFWIDTH KATAKANA LETTER E
+ # <narrow> 30A8
+FF75 HALFWIDTH KATAKANA LETTER O
+ # <narrow> 30AA
+FF76 HALFWIDTH KATAKANA LETTER KA
+ # <narrow> 30AB
+FF77 HALFWIDTH KATAKANA LETTER KI
+ # <narrow> 30AD
+FF78 HALFWIDTH KATAKANA LETTER KU
+ # <narrow> 30AF
+FF79 HALFWIDTH KATAKANA LETTER KE
+ # <narrow> 30B1
+FF7A HALFWIDTH KATAKANA LETTER KO
+ # <narrow> 30B3
+FF7B HALFWIDTH KATAKANA LETTER SA
+ # <narrow> 30B5
+FF7C HALFWIDTH KATAKANA LETTER SI
+ # <narrow> 30B7
+FF7D HALFWIDTH KATAKANA LETTER SU
+ # <narrow> 30B9
+FF7E HALFWIDTH KATAKANA LETTER SE
+ # <narrow> 30BB
+FF7F HALFWIDTH KATAKANA LETTER SO
+ # <narrow> 30BD
+FF80 HALFWIDTH KATAKANA LETTER TA
+ # <narrow> 30BF
+FF81 HALFWIDTH KATAKANA LETTER TI
+ # <narrow> 30C1
+FF82 HALFWIDTH KATAKANA LETTER TU
+ # <narrow> 30C4
+FF83 HALFWIDTH KATAKANA LETTER TE
+ # <narrow> 30C6
+FF84 HALFWIDTH KATAKANA LETTER TO
+ # <narrow> 30C8
+FF85 HALFWIDTH KATAKANA LETTER NA
+ # <narrow> 30CA
+FF86 HALFWIDTH KATAKANA LETTER NI
+ # <narrow> 30CB
+FF87 HALFWIDTH KATAKANA LETTER NU
+ # <narrow> 30CC
+FF88 HALFWIDTH KATAKANA LETTER NE
+ # <narrow> 30CD
+FF89 HALFWIDTH KATAKANA LETTER NO
+ # <narrow> 30CE
+FF8A HALFWIDTH KATAKANA LETTER HA
+ # <narrow> 30CF
+FF8B HALFWIDTH KATAKANA LETTER HI
+ # <narrow> 30D2
+FF8C HALFWIDTH KATAKANA LETTER HU
+ # <narrow> 30D5
+FF8D HALFWIDTH KATAKANA LETTER HE
+ # <narrow> 30D8
+FF8E HALFWIDTH KATAKANA LETTER HO
+ # <narrow> 30DB
+FF8F HALFWIDTH KATAKANA LETTER MA
+ # <narrow> 30DE
+FF90 HALFWIDTH KATAKANA LETTER MI
+ # <narrow> 30DF
+FF91 HALFWIDTH KATAKANA LETTER MU
+ # <narrow> 30E0
+FF92 HALFWIDTH KATAKANA LETTER ME
+ # <narrow> 30E1
+FF93 HALFWIDTH KATAKANA LETTER MO
+ # <narrow> 30E2
+FF94 HALFWIDTH KATAKANA LETTER YA
+ # <narrow> 30E4
+FF95 HALFWIDTH KATAKANA LETTER YU
+ # <narrow> 30E6
+FF96 HALFWIDTH KATAKANA LETTER YO
+ # <narrow> 30E8
+FF97 HALFWIDTH KATAKANA LETTER RA
+ # <narrow> 30E9
+FF98 HALFWIDTH KATAKANA LETTER RI
+ # <narrow> 30EA
+FF99 HALFWIDTH KATAKANA LETTER RU
+ # <narrow> 30EB
+FF9A HALFWIDTH KATAKANA LETTER RE
+ # <narrow> 30EC
+FF9B HALFWIDTH KATAKANA LETTER RO
+ # <narrow> 30ED
+FF9C HALFWIDTH KATAKANA LETTER WA
+ # <narrow> 30EF
+FF9D HALFWIDTH KATAKANA LETTER N
+ # <narrow> 30F3
+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK (halfwidth katakana-hiragana voiced sound mark)
+ # <narrow> 3099
+FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK (halfwidth katakana-hiragana semi-voiced sound mark)
+ # <narrow> 309A
+@ Halfwidth Hangul variants
+@+ See Hangul Compatibility Jamo 3130 - 318F
+FFA0 HALFWIDTH HANGUL FILLER
+ # <narrow> 3164
+FFA1 HALFWIDTH HANGUL LETTER KIYEOK
+ # <narrow> 3131
+FFA2 HALFWIDTH HANGUL LETTER SSANGKIYEOK
+ # <narrow> 3132
+FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+ # <narrow> 3133
+FFA4 HALFWIDTH HANGUL LETTER NIEUN
+ # <narrow> 3134
+FFA5 HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+ # <narrow> 3135
+FFA6 HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+ # <narrow> 3136
+FFA7 HALFWIDTH HANGUL LETTER TIKEUT
+ # <narrow> 3137
+FFA8 HALFWIDTH HANGUL LETTER SSANGTIKEUT
+ # <narrow> 3138
+FFA9 HALFWIDTH HANGUL LETTER RIEUL
+ # <narrow> 3139
+FFAA HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+ # <narrow> 313A
+FFAB HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+ # <narrow> 313B
+FFAC HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+ # <narrow> 313C
+FFAD HALFWIDTH HANGUL LETTER RIEUL-SIOS
+ # <narrow> 313D
+FFAE HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+ # <narrow> 313E
+FFAF HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+ # <narrow> 313F
+FFB0 HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+ # <narrow> 3140
+FFB1 HALFWIDTH HANGUL LETTER MIEUM
+ # <narrow> 3141
+FFB2 HALFWIDTH HANGUL LETTER PIEUP
+ # <narrow> 3142
+FFB3 HALFWIDTH HANGUL LETTER SSANGPIEUP
+ # <narrow> 3143
+FFB4 HALFWIDTH HANGUL LETTER PIEUP-SIOS
+ # <narrow> 3144
+FFB5 HALFWIDTH HANGUL LETTER SIOS
+ # <narrow> 3145
+FFB6 HALFWIDTH HANGUL LETTER SSANGSIOS
+ # <narrow> 3146
+FFB7 HALFWIDTH HANGUL LETTER IEUNG
+ # <narrow> 3147
+FFB8 HALFWIDTH HANGUL LETTER CIEUC
+ # <narrow> 3148
+FFB9 HALFWIDTH HANGUL LETTER SSANGCIEUC
+ # <narrow> 3149
+FFBA HALFWIDTH HANGUL LETTER CHIEUCH
+ # <narrow> 314A
+FFBB HALFWIDTH HANGUL LETTER KHIEUKH
+ # <narrow> 314B
+FFBC HALFWIDTH HANGUL LETTER THIEUTH
+ # <narrow> 314C
+FFBD HALFWIDTH HANGUL LETTER PHIEUPH
+ # <narrow> 314D
+FFBE HALFWIDTH HANGUL LETTER HIEUH
+ # <narrow> 314E
+FFC2 HALFWIDTH HANGUL LETTER A
+ # <narrow> 314F
+FFC3 HALFWIDTH HANGUL LETTER AE
+ # <narrow> 3150
+FFC4 HALFWIDTH HANGUL LETTER YA
+ # <narrow> 3151
+FFC5 HALFWIDTH HANGUL LETTER YAE
+ # <narrow> 3152
+FFC6 HALFWIDTH HANGUL LETTER EO
+ # <narrow> 3153
+FFC7 HALFWIDTH HANGUL LETTER E
+ # <narrow> 3154
+FFCA HALFWIDTH HANGUL LETTER YEO
+ # <narrow> 3155
+FFCB HALFWIDTH HANGUL LETTER YE
+ # <narrow> 3156
+FFCC HALFWIDTH HANGUL LETTER O
+ # <narrow> 3157
+FFCD HALFWIDTH HANGUL LETTER WA
+ # <narrow> 3158
+FFCE HALFWIDTH HANGUL LETTER WAE
+ # <narrow> 3159
+FFCF HALFWIDTH HANGUL LETTER OE
+ # <narrow> 315A
+FFD2 HALFWIDTH HANGUL LETTER YO
+ # <narrow> 315B
+FFD3 HALFWIDTH HANGUL LETTER U
+ # <narrow> 315C
+FFD4 HALFWIDTH HANGUL LETTER WEO
+ # <narrow> 315D
+FFD5 HALFWIDTH HANGUL LETTER WE
+ # <narrow> 315E
+FFD6 HALFWIDTH HANGUL LETTER WI
+ # <narrow> 315F
+FFD7 HALFWIDTH HANGUL LETTER YU
+ # <narrow> 3160
+FFDA HALFWIDTH HANGUL LETTER EU
+ # <narrow> 3161
+FFDB HALFWIDTH HANGUL LETTER YI
+ # <narrow> 3162
+FFDC HALFWIDTH HANGUL LETTER I
+ # <narrow> 3163
+@ Fullwidth symbol variants
+@+ See Latin-1 00A0 - 00FF
+FFE0 FULLWIDTH CENT SIGN
+ # <wide> 00A2
+FFE1 FULLWIDTH POUND SIGN
+ # <wide> 00A3
+FFE2 FULLWIDTH NOT SIGN
+ # <wide> 00AC
+FFE3 FULLWIDTH MACRON *
+ * sometimes treated as fullwidth overline
+ x (overline - 203E)
+ # <wide> 00AF
+FFE4 FULLWIDTH BROKEN BAR
+ # <wide> 00A6
+FFE5 FULLWIDTH YEN SIGN
+ # <wide> 00A5
+FFE6 FULLWIDTH WON SIGN
+ # <wide> 20A9
+@ Halfwidth symbol variants
+FFE8 HALFWIDTH FORMS LIGHT VERTICAL
+ # <narrow> 2502
+FFE9 HALFWIDTH LEFTWARDS ARROW
+ # <narrow> 2190
+FFEA HALFWIDTH UPWARDS ARROW
+ # <narrow> 2191
+FFEB HALFWIDTH RIGHTWARDS ARROW
+ # <narrow> 2192
+FFEC HALFWIDTH DOWNWARDS ARROW
+ # <narrow> 2193
+FFED HALFWIDTH BLACK SQUARE
+ # <narrow> 25A0
+FFEE HALFWIDTH WHITE CIRCLE
+ # <narrow> 25CB
+@@ FFF0 Specials FFFF
+@ Interlinear annotation
+@+ Used internally for Japanese Ruby (furigana), etc.
+FFF9 INTERLINEAR ANNOTATION ANCHOR
+ * marks start of annotated text
+FFFA INTERLINEAR ANNOTATION SEPARATOR
+ * marks start of annotating character(s)
+FFFB INTERLINEAR ANNOTATION TERMINATOR
+ * marks end of annotation block
+@ Replacement characters
+FFFC OBJECT REPLACEMENT CHARACTER
+ * used as placeholder in text for an otherwise unspecified object
+FFFD REPLACEMENT CHARACTER
+ * used to replace an incoming character whose value is unknown or unrepresentable in Unicode
+ * compare the use of 001A as a control character to indicate the substitute function
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+FFFE <not a character>
+ * the value FFFE is guaranteed not to be a Unicode character at all
+ * may be used to detect byte order by contrast with FEFF which is a character
+ x (zero width no-break space - FEFF)
+FFFF <not a character>
+ * the value FFFF is guaranteed not to be a Unicode character at all
+@@ 10000 Linear B Syllabary 1007F
+@@+
+@ Basic syllables
+10000 LINEAR B SYLLABLE B008 A
+10001 LINEAR B SYLLABLE B038 E
+10002 LINEAR B SYLLABLE B028 I
+10003 LINEAR B SYLLABLE B061 O
+10004 LINEAR B SYLLABLE B010 U
+10005 LINEAR B SYLLABLE B001 DA
+10006 LINEAR B SYLLABLE B045 DE
+10007 LINEAR B SYLLABLE B007 DI
+10008 LINEAR B SYLLABLE B014 DO
+10009 LINEAR B SYLLABLE B051 DU
+1000A LINEAR B SYLLABLE B057 JA
+1000B LINEAR B SYLLABLE B046 JE
+1000D LINEAR B SYLLABLE B036 JO
+1000E LINEAR B SYLLABLE B065 JU
+ = ideogram B129 flour
+1000F LINEAR B SYLLABLE B077 KA
+10010 LINEAR B SYLLABLE B044 KE
+10011 LINEAR B SYLLABLE B067 KI
+10012 LINEAR B SYLLABLE B070 KO
+10013 LINEAR B SYLLABLE B081 KU
+10014 LINEAR B SYLLABLE B080 MA
+10015 LINEAR B SYLLABLE B013 ME
+10016 LINEAR B SYLLABLE B073 MI
+10017 LINEAR B SYLLABLE B015 MO
+10018 LINEAR B SYLLABLE B023 MU
+ = ideogram B109 ox
+10019 LINEAR B SYLLABLE B006 NA
+1001A LINEAR B SYLLABLE B024 NE
+1001B LINEAR B SYLLABLE B030 NI
+ = ideogram B030 figs
+1001C LINEAR B SYLLABLE B052 NO
+1001D LINEAR B SYLLABLE B055 NU
+1001E LINEAR B SYLLABLE B003 PA
+1001F LINEAR B SYLLABLE B072 PE
+10020 LINEAR B SYLLABLE B039 PI
+10021 LINEAR B SYLLABLE B011 PO
+10022 LINEAR B SYLLABLE B050 PU
+10023 LINEAR B SYLLABLE B016 QA
+10024 LINEAR B SYLLABLE B078 QE
+10025 LINEAR B SYLLABLE B021 QI
+ = ideogram B106 sheep
+10026 LINEAR B SYLLABLE B032 QO
+10028 LINEAR B SYLLABLE B060 RA
+10029 LINEAR B SYLLABLE B027 RE
+1002A LINEAR B SYLLABLE B053 RI
+1002B LINEAR B SYLLABLE B002 RO
+1002C LINEAR B SYLLABLE B026 RU
+1002D LINEAR B SYLLABLE B031 SA
+ = ideogram B031 flax
+1002E LINEAR B SYLLABLE B009 SE
+1002F LINEAR B SYLLABLE B041 SI
+10030 LINEAR B SYLLABLE B012 SO
+10031 LINEAR B SYLLABLE B058 SU
+10032 LINEAR B SYLLABLE B059 TA
+10033 LINEAR B SYLLABLE B004 TE
+10034 LINEAR B SYLLABLE B037 TI
+10035 LINEAR B SYLLABLE B005 TO
+10036 LINEAR B SYLLABLE B069 TU
+10037 LINEAR B SYLLABLE B054 WA
+10038 LINEAR B SYLLABLE B075 WE
+10039 LINEAR B SYLLABLE B040 WI
+1003A LINEAR B SYLLABLE B042 WO
+1003C LINEAR B SYLLABLE B017 ZA
+1003D LINEAR B SYLLABLE B074 ZE
+1003F LINEAR B SYLLABLE B020 ZO
+@ Supplementary signs
+10040 LINEAR B SYLLABLE B025 A2
+10041 LINEAR B SYLLABLE B043 A3
+10042 LINEAR B SYLLABLE B085 AU
+ = ideogram B108 pig
+10043 LINEAR B SYLLABLE B071 DWE
+10044 LINEAR B SYLLABLE B090 DWO
+10045 LINEAR B SYLLABLE B048 NWA
+10046 LINEAR B SYLLABLE B029 PU2
+10047 LINEAR B SYLLABLE B062 PTE
+10048 LINEAR B SYLLABLE B076 RA2
+10049 LINEAR B SYLLABLE B033 RA3
+ = ideogram B144 saffron
+1004A LINEAR B SYLLABLE B068 RO2
+1004B LINEAR B SYLLABLE B066 TA2
+1004C LINEAR B SYLLABLE B087 TWE
+1004D LINEAR B SYLLABLE B091 TWO
+@ Symbols
+10050 LINEAR B SYMBOL B018
+10051 LINEAR B SYMBOL B019
+10052 LINEAR B SYMBOL B022
+ = ideogram B107 goat
+10053 LINEAR B SYMBOL B034
+10054 LINEAR B SYMBOL B047
+10055 LINEAR B SYMBOL B049
+10056 LINEAR B SYMBOL B056
+10057 LINEAR B SYMBOL B063
+10058 LINEAR B SYMBOL B064
+10059 LINEAR B SYMBOL B079
+1005A LINEAR B SYMBOL B082
+1005B LINEAR B SYMBOL B083
+1005C LINEAR B SYMBOL B086
+1005D LINEAR B SYMBOL B089
+@@ 10080 Linear B Ideograms 100FF
+@+ Some Linear B syllables are also used as Linear B ideograms.
+ x (linear b syllable b021 qi - 10025)
+ x (linear b symbol b022 - 10052)
+ x (linear b syllable b023 mu - 10018)
+ x (linear b syllable b030 ni - 1001B)
+ x (linear b syllable b031 sa - 1002D)
+ x (linear b syllable b033 ra3 - 10049)
+ x (linear b syllable b065 ju - 1000E)
+ x (linear b syllable b085 au - 10042)
+@ People and animals
+10080 LINEAR B IDEOGRAM B100 MAN
+10081 LINEAR B IDEOGRAM B102 WOMAN
+10082 LINEAR B IDEOGRAM B104 DEER
+10083 LINEAR B IDEOGRAM B105 EQUID
+10084 LINEAR B IDEOGRAM B105F MARE
+10085 LINEAR B IDEOGRAM B105M STALLION
+10086 LINEAR B IDEOGRAM B106F EWE
+10087 LINEAR B IDEOGRAM B106M RAM
+10088 LINEAR B IDEOGRAM B107F SHE-GOAT
+10089 LINEAR B IDEOGRAM B107M HE-GOAT
+1008A LINEAR B IDEOGRAM B108F SOW
+1008B LINEAR B IDEOGRAM B108M BOAR
+1008C LINEAR B IDEOGRAM B109F COW
+1008D LINEAR B IDEOGRAM B109M BULL
+@ Cereals and plants
+1008E LINEAR B IDEOGRAM B120 WHEAT
+1008F LINEAR B IDEOGRAM B121 BARLEY
+10090 LINEAR B IDEOGRAM B122 OLIVE
+10091 LINEAR B IDEOGRAM B123 SPICE
+10092 LINEAR B IDEOGRAM B125 CYPERUS
+10093 LINEAR B MONOGRAM B127 KAPO
+ = fruit
+10094 LINEAR B MONOGRAM B128 KANAKO
+ = saffron
+@ Extracts
+10095 LINEAR B IDEOGRAM B130 OIL
+10096 LINEAR B IDEOGRAM B131 WINE
+10097 LINEAR B IDEOGRAM B132
+10098 LINEAR B MONOGRAM B133 AREPA
+ = ointment
+10099 LINEAR B MONOGRAM B135 MERI
+ = honey
+@ Metals
+1009A LINEAR B IDEOGRAM B140 BRONZE
+1009B LINEAR B IDEOGRAM B141 GOLD
+1009C LINEAR B IDEOGRAM B142
+@ Other materials
+1009D LINEAR B IDEOGRAM B145 WOOL
+1009E LINEAR B IDEOGRAM B146
+1009F LINEAR B IDEOGRAM B150
+100A0 LINEAR B IDEOGRAM B151 HORN
+100A1 LINEAR B IDEOGRAM B152
+100A2 LINEAR B IDEOGRAM B153
+100A3 LINEAR B IDEOGRAM B154
+100A4 LINEAR B MONOGRAM B156 TURO2
+ = cheese
+100A5 LINEAR B IDEOGRAM B157
+100A6 LINEAR B IDEOGRAM B158
+100A7 LINEAR B IDEOGRAM B159 CLOTH
+100A8 LINEAR B IDEOGRAM B160
+100A9 LINEAR B IDEOGRAM B161
+100AA LINEAR B IDEOGRAM B162 GARMENT
+100AB LINEAR B IDEOGRAM B163 ARMOUR
+100AC LINEAR B IDEOGRAM B164
+100AD LINEAR B IDEOGRAM B165
+100AE LINEAR B IDEOGRAM B166
+100AF LINEAR B IDEOGRAM B167
+100B0 LINEAR B IDEOGRAM B168
+100B1 LINEAR B IDEOGRAM B169
+100B2 LINEAR B IDEOGRAM B170
+100B3 LINEAR B IDEOGRAM B171
+100B4 LINEAR B IDEOGRAM B172
+100B5 LINEAR B IDEOGRAM B173 MONTH
+100B6 LINEAR B IDEOGRAM B174
+100B7 LINEAR B IDEOGRAM B176 TREE
+100B8 LINEAR B IDEOGRAM B177
+100B9 LINEAR B IDEOGRAM B178
+100BA LINEAR B IDEOGRAM B179
+100BB LINEAR B IDEOGRAM B180
+100BC LINEAR B IDEOGRAM B181
+100BD LINEAR B IDEOGRAM B182
+100BE LINEAR B IDEOGRAM B183
+100BF LINEAR B IDEOGRAM B184
+ * the shape of this ideogram is only partially known
+100C0 LINEAR B IDEOGRAM B185
+100C1 LINEAR B IDEOGRAM B189
+100C2 LINEAR B IDEOGRAM B190
+100C3 LINEAR B IDEOGRAM B191 HELMET
+100C4 LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5 LINEAR B IDEOGRAM B225 BATHTUB
+100C6 LINEAR B IDEOGRAM B230 SPEAR
+100C7 LINEAR B IDEOGRAM B231 ARROW
+100C8 LINEAR B IDEOGRAM B232
+100C9 LINEAR B IDEOGRAM B233 SWORD (pug)
+ = pugio
+100CA LINEAR B IDEOGRAM B234
+100CB LINEAR B IDEOGRAM B236 (gup)
+ = "gupio", inverted sword
+100CC LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD LINEAR B IDEOGRAM B241 CHARIOT
+100CE LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF LINEAR B IDEOGRAM B243 WHEEL
+100D0 LINEAR B IDEOGRAM B245
+100D1 LINEAR B IDEOGRAM B246
+100D2 LINEAR B MONOGRAM B247 DIPTE
+100D3 LINEAR B IDEOGRAM B248
+100D4 LINEAR B IDEOGRAM B249
+100D5 LINEAR B IDEOGRAM B251
+ * the shape of this ideogram is only partially known
+100D6 LINEAR B IDEOGRAM B252
+ * the shape of this ideogram is only partially known
+100D7 LINEAR B IDEOGRAM B253
+100D8 LINEAR B IDEOGRAM B254 DART
+100D9 LINEAR B IDEOGRAM B255
+100DA LINEAR B IDEOGRAM B256
+100DB LINEAR B IDEOGRAM B257
+100DC LINEAR B IDEOGRAM B258
+100DD LINEAR B IDEOGRAM B259
+@ Vessels
+100DE LINEAR B IDEOGRAM VESSEL B155
+100DF LINEAR B IDEOGRAM VESSEL B200
+100E0 LINEAR B IDEOGRAM VESSEL B201
+100E1 LINEAR B IDEOGRAM VESSEL B202
+100E2 LINEAR B IDEOGRAM VESSEL B203
+100E3 LINEAR B IDEOGRAM VESSEL B204
+100E4 LINEAR B IDEOGRAM VESSEL B205
+100E5 LINEAR B IDEOGRAM VESSEL B206
+100E6 LINEAR B IDEOGRAM VESSEL B207
+100E7 LINEAR B IDEOGRAM VESSEL B208
+100E8 LINEAR B IDEOGRAM VESSEL B209
+100E9 LINEAR B IDEOGRAM VESSEL B210
+100EA LINEAR B IDEOGRAM VESSEL B211
+100EB LINEAR B IDEOGRAM VESSEL B212
+100EC LINEAR B IDEOGRAM VESSEL B213
+100ED LINEAR B IDEOGRAM VESSEL B214
+100EE LINEAR B IDEOGRAM VESSEL B215
+100EF LINEAR B IDEOGRAM VESSEL B216
+100F0 LINEAR B IDEOGRAM VESSEL B217
+100F1 LINEAR B IDEOGRAM VESSEL B218
+100F2 LINEAR B IDEOGRAM VESSEL B219
+100F3 LINEAR B IDEOGRAM VESSEL B221
+100F4 LINEAR B IDEOGRAM VESSEL B222
+100F5 LINEAR B IDEOGRAM VESSEL B226
+100F6 LINEAR B IDEOGRAM VESSEL B227
+100F7 LINEAR B IDEOGRAM VESSEL B228
+100F8 LINEAR B IDEOGRAM VESSEL B229
+100F9 LINEAR B IDEOGRAM VESSEL B250
+100FA LINEAR B IDEOGRAM VESSEL B305
+ * the shape of this ideogram is only partially known
+@@ 10100 Aegean Numbers 1013F
+@ Punctuation
+10100 AEGEAN WORD SEPARATOR LINE
+10101 AEGEAN WORD SEPARATOR DOT
+10102 AEGEAN CHECK MARK
+@ Numbers
+10107 AEGEAN NUMBER ONE
+10108 AEGEAN NUMBER TWO
+10109 AEGEAN NUMBER THREE
+1010A AEGEAN NUMBER FOUR
+1010B AEGEAN NUMBER FIVE
+1010C AEGEAN NUMBER SIX
+1010D AEGEAN NUMBER SEVEN
+1010E AEGEAN NUMBER EIGHT
+1010F AEGEAN NUMBER NINE
+10110 AEGEAN NUMBER TEN
+10111 AEGEAN NUMBER TWENTY
+10112 AEGEAN NUMBER THIRTY
+10113 AEGEAN NUMBER FORTY
+10114 AEGEAN NUMBER FIFTY
+10115 AEGEAN NUMBER SIXTY
+10116 AEGEAN NUMBER SEVENTY
+10117 AEGEAN NUMBER EIGHTY
+10118 AEGEAN NUMBER NINETY
+10119 AEGEAN NUMBER ONE HUNDRED
+1011A AEGEAN NUMBER TWO HUNDRED
+1011B AEGEAN NUMBER THREE HUNDRED
+1011C AEGEAN NUMBER FOUR HUNDRED
+1011D AEGEAN NUMBER FIVE HUNDRED
+1011E AEGEAN NUMBER SIX HUNDRED
+1011F AEGEAN NUMBER SEVEN HUNDRED
+10120 AEGEAN NUMBER EIGHT HUNDRED
+10121 AEGEAN NUMBER NINE HUNDRED
+10122 AEGEAN NUMBER ONE THOUSAND
+10123 AEGEAN NUMBER TWO THOUSAND
+10124 AEGEAN NUMBER THREE THOUSAND
+10125 AEGEAN NUMBER FOUR THOUSAND
+10126 AEGEAN NUMBER FIVE THOUSAND
+10127 AEGEAN NUMBER SIX THOUSAND
+10128 AEGEAN NUMBER SEVEN THOUSAND
+10129 AEGEAN NUMBER EIGHT THOUSAND
+1012A AEGEAN NUMBER NINE THOUSAND
+1012B AEGEAN NUMBER TEN THOUSAND
+1012C AEGEAN NUMBER TWENTY THOUSAND
+1012D AEGEAN NUMBER THIRTY THOUSAND
+1012E AEGEAN NUMBER FORTY THOUSAND
+1012F AEGEAN NUMBER FIFTY THOUSAND
+10130 AEGEAN NUMBER SIXTY THOUSAND
+10131 AEGEAN NUMBER SEVENTY THOUSAND
+10132 AEGEAN NUMBER EIGHTY THOUSAND
+10133 AEGEAN NUMBER NINETY THOUSAND
+@ Measures
+10137 AEGEAN WEIGHT BASE UNIT
+10138 AEGEAN WEIGHT FIRST SUBUNIT
+10139 AEGEAN WEIGHT SECOND SUBUNIT
+1013A AEGEAN WEIGHT THIRD SUBUNIT
+1013B AEGEAN WEIGHT FOURTH SUBUNIT
+1013C AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E AEGEAN MEASURE SECOND SUBUNIT
+1013F AEGEAN MEASURE THIRD SUBUNIT
+@@ 10140 Ancient Greek Numbers 1018F
+@ Ancient Greek acrophonic numerals
+@+ These are shown as sans-serif forms because that corresponds more closely to their appearance in ancient texts.
+10140 GREEK ACROPHONIC ATTIC ONE QUARTER
+10141 GREEK ACROPHONIC ATTIC ONE HALF
+10142 GREEK ACROPHONIC ATTIC ONE DRACHMA
+10143 GREEK ACROPHONIC ATTIC FIVE
+10144 GREEK ACROPHONIC ATTIC FIFTY
+10145 GREEK ACROPHONIC ATTIC FIVE HUNDRED
+10146 GREEK ACROPHONIC ATTIC FIVE THOUSAND
+10147 GREEK ACROPHONIC ATTIC FIFTY THOUSAND
+10148 GREEK ACROPHONIC ATTIC FIVE TALENTS
+10149 GREEK ACROPHONIC ATTIC TEN TALENTS
+1014A GREEK ACROPHONIC ATTIC FIFTY TALENTS
+1014B GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS
+1014C GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS
+1014D GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS
+1014E GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS
+1014F GREEK ACROPHONIC ATTIC FIVE STATERS
+10150 GREEK ACROPHONIC ATTIC TEN STATERS
+10151 GREEK ACROPHONIC ATTIC FIFTY STATERS
+10152 GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS
+10153 GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS
+10154 GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS
+10155 GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS
+10156 GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS
+10157 GREEK ACROPHONIC ATTIC TEN MNAS
+10158 GREEK ACROPHONIC HERAEUM ONE PLETHRON
+10159 GREEK ACROPHONIC THESPIAN ONE
+1015A GREEK ACROPHONIC HERMIONIAN ONE
+1015B GREEK ACROPHONIC EPIDAUREAN TWO
+ x (two dot punctuation - 205A)
+1015C GREEK ACROPHONIC THESPIAN TWO
+1015D GREEK ACROPHONIC CYRENAIC TWO DRACHMAS
+1015E GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS
+ * top line is at cap height, unlike 10111
+ x (aegean number twenty - 10111)
+1015F GREEK ACROPHONIC TROEZENIAN FIVE
+10160 GREEK ACROPHONIC TROEZENIAN TEN
+10161 GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM
+10162 GREEK ACROPHONIC HERMIONIAN TEN
+10163 GREEK ACROPHONIC MESSENIAN TEN
+10164 GREEK ACROPHONIC THESPIAN TEN
+10165 GREEK ACROPHONIC THESPIAN THIRTY
+10166 GREEK ACROPHONIC TROEZENIAN FIFTY
+10167 GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
+10168 GREEK ACROPHONIC HERMIONIAN FIFTY
+10169 GREEK ACROPHONIC THESPIAN FIFTY
+1016A GREEK ACROPHONIC THESPIAN ONE HUNDRED
+1016B GREEK ACROPHONIC THESPIAN THREE HUNDRED
+1016C GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED
+1016D GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED
+1016E GREEK ACROPHONIC THESPIAN FIVE HUNDRED
+1016F GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED
+10170 GREEK ACROPHONIC NAXIAN FIVE HUNDRED
+10171 GREEK ACROPHONIC THESPIAN ONE THOUSAND
+10172 GREEK ACROPHONIC THESPIAN FIVE THOUSAND
+10173 GREEK ACROPHONIC DELPHIC FIVE MNAS
+10174 GREEK ACROPHONIC STRATIAN FIFTY MNAS
+@ Ancient Greek papyrological numbers
+10175 GREEK ONE HALF SIGN
+10176 GREEK ONE HALF SIGN ALTERNATE FORM
+10177 GREEK TWO THIRDS SIGN
+10178 GREEK THREE QUARTERS SIGN
+10179 GREEK YEAR SIGN
+1017A GREEK TALENT SIGN
+1017B GREEK DRACHMA SIGN
+1017C GREEK OBOL SIGN
+1017D GREEK TWO OBOLS SIGN
+1017E GREEK THREE OBOLS SIGN
+1017F GREEK FOUR OBOLS SIGN
+10180 GREEK FIVE OBOLS SIGN
+10181 GREEK METRETES SIGN
+10182 GREEK KYATHOS BASE SIGN
+10183 GREEK LITRA SIGN
+10184 GREEK OUNKIA SIGN
+10185 GREEK XESTES SIGN
+10186 GREEK ARTABE SIGN
+10187 GREEK AROURA SIGN
+10188 GREEK GRAMMA SIGN
+10189 GREEK TRYBLION BASE SIGN
+1018A GREEK ZERO SIGN
+@@ 10190 Ancient Symbols 101CF
+@ Roman weights and measures
+10190 ROMAN SEXTANS SIGN
+ x (equals sign - 003D)
+10191 ROMAN UNCIA SIGN
+ x (hyphen-minus - 002D)
+10192 ROMAN SEMUNCIA SIGN
+ x (pound sign - 00A3)
+10193 ROMAN SEXTULA SIGN
+ x (cyrillic capital letter reversed dze - A644)
+10194 ROMAN DIMIDIA SEXTULA SIGN
+10195 ROMAN SILIQUA SIGN
+@ Roman coin symbols
+10196 ROMAN DENARIUS SIGN
+10197 ROMAN QUINARIUS SIGN
+10198 ROMAN SESTERTIUS SIGN
+10199 ROMAN DUPONDIUS SIGN
+1019A ROMAN AS SIGN
+ x (apl functional symbol slash bar - 233F)
+@ Roman military symbol
+1019B ROMAN CENTURIAL SIGN
+@@ 101D0 Phaistos Disc 101FF
+@+ The characters in this block can be used to represent the signs found on the undeciphered Phaistos Disc.
+@ Signs
+101D0 PHAISTOS DISC SIGN PEDESTRIAN
+101D1 PHAISTOS DISC SIGN PLUMED HEAD
+101D2 PHAISTOS DISC SIGN TATTOOED HEAD
+101D3 PHAISTOS DISC SIGN CAPTIVE
+101D4 PHAISTOS DISC SIGN CHILD
+101D5 PHAISTOS DISC SIGN WOMAN
+101D6 PHAISTOS DISC SIGN HELMET
+101D7 PHAISTOS DISC SIGN GAUNTLET
+101D8 PHAISTOS DISC SIGN TIARA
+101D9 PHAISTOS DISC SIGN ARROW
+101DA PHAISTOS DISC SIGN BOW
+101DB PHAISTOS DISC SIGN SHIELD
+101DC PHAISTOS DISC SIGN CLUB
+101DD PHAISTOS DISC SIGN MANACLES
+101DE PHAISTOS DISC SIGN MATTOCK
+101DF PHAISTOS DISC SIGN SAW
+101E0 PHAISTOS DISC SIGN LID
+101E1 PHAISTOS DISC SIGN BOOMERANG
+101E2 PHAISTOS DISC SIGN CARPENTRY PLANE
+101E3 PHAISTOS DISC SIGN DOLIUM
+101E4 PHAISTOS DISC SIGN COMB
+101E5 PHAISTOS DISC SIGN SLING
+101E6 PHAISTOS DISC SIGN COLUMN
+101E7 PHAISTOS DISC SIGN BEEHIVE
+101E8 PHAISTOS DISC SIGN SHIP
+101E9 PHAISTOS DISC SIGN HORN
+101EA PHAISTOS DISC SIGN HIDE
+101EB PHAISTOS DISC SIGN BULLS LEG
+101EC PHAISTOS DISC SIGN CAT
+101ED PHAISTOS DISC SIGN RAM
+101EE PHAISTOS DISC SIGN EAGLE
+101EF PHAISTOS DISC SIGN DOVE
+101F0 PHAISTOS DISC SIGN TUNNY
+101F1 PHAISTOS DISC SIGN BEE
+101F2 PHAISTOS DISC SIGN PLANE TREE
+101F3 PHAISTOS DISC SIGN VINE
+101F4 PHAISTOS DISC SIGN PAPYRUS
+101F5 PHAISTOS DISC SIGN ROSETTE
+101F6 PHAISTOS DISC SIGN LILY
+101F7 PHAISTOS DISC SIGN OX BACK
+101F8 PHAISTOS DISC SIGN FLUTE
+101F9 PHAISTOS DISC SIGN GRATER
+101FA PHAISTOS DISC SIGN STRAINER
+101FB PHAISTOS DISC SIGN SMALL AXE
+101FC PHAISTOS DISC SIGN WAVY BAND
+@ Combining stroke
+101FD PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+@@ 10280 Lycian 1029F
+@ Letters
+10280 LYCIAN LETTER A
+10281 LYCIAN LETTER E
+10282 LYCIAN LETTER B
+10283 LYCIAN LETTER BH
+10284 LYCIAN LETTER G
+10285 LYCIAN LETTER D
+10286 LYCIAN LETTER I
+10287 LYCIAN LETTER W
+10288 LYCIAN LETTER Z
+10289 LYCIAN LETTER TH
+1028A LYCIAN LETTER J
+1028B LYCIAN LETTER K
+1028C LYCIAN LETTER Q
+1028D LYCIAN LETTER L
+1028E LYCIAN LETTER M
+1028F LYCIAN LETTER N
+10290 LYCIAN LETTER MM
+10291 LYCIAN LETTER NN
+10292 LYCIAN LETTER U
+10293 LYCIAN LETTER P
+10294 LYCIAN LETTER KK
+10295 LYCIAN LETTER R
+10296 LYCIAN LETTER S
+10297 LYCIAN LETTER T
+10298 LYCIAN LETTER TT
+10299 LYCIAN LETTER AN
+1029A LYCIAN LETTER EN
+1029B LYCIAN LETTER H
+1029C LYCIAN LETTER X
+@@ 102A0 Carian 102DF
+@ Letters
+102A0 CARIAN LETTER A
+102A1 CARIAN LETTER P2
+102A2 CARIAN LETTER D
+102A3 CARIAN LETTER L
+102A4 CARIAN LETTER UUU
+102A5 CARIAN LETTER R
+102A6 CARIAN LETTER LD
+102A7 CARIAN LETTER A2
+102A8 CARIAN LETTER Q
+102A9 CARIAN LETTER B
+102AA CARIAN LETTER M
+102AB CARIAN LETTER O
+102AC CARIAN LETTER D2
+102AD CARIAN LETTER T
+102AE CARIAN LETTER SH
+102AF CARIAN LETTER SH2
+102B0 CARIAN LETTER S
+102B1 CARIAN LETTER C-18
+102B2 CARIAN LETTER U
+102B3 CARIAN LETTER NN
+102B4 CARIAN LETTER X
+102B5 CARIAN LETTER N
+102B6 CARIAN LETTER TT2
+102B7 CARIAN LETTER P
+102B8 CARIAN LETTER SS
+102B9 CARIAN LETTER I
+102BA CARIAN LETTER E
+102BB CARIAN LETTER UUUU
+102BC CARIAN LETTER K
+102BD CARIAN LETTER K2
+102BE CARIAN LETTER ND
+102BF CARIAN LETTER UU
+102C0 CARIAN LETTER G
+102C1 CARIAN LETTER G2
+102C2 CARIAN LETTER ST
+102C3 CARIAN LETTER ST2
+102C4 CARIAN LETTER NG
+102C5 CARIAN LETTER II
+102C6 CARIAN LETTER C-39
+102C7 CARIAN LETTER TT
+102C8 CARIAN LETTER UUU2
+102C9 CARIAN LETTER RR
+102CA CARIAN LETTER MB
+102CB CARIAN LETTER MB2
+102CC CARIAN LETTER MB3
+102CD CARIAN LETTER MB4
+102CE CARIAN LETTER LD2
+102CF CARIAN LETTER E2
+102D0 CARIAN LETTER UUU3
+@@ 10300 Old Italic 1032F
+@ Letters
+10300 OLD ITALIC LETTER A
+10301 OLD ITALIC LETTER BE
+10302 OLD ITALIC LETTER KE
+10303 OLD ITALIC LETTER DE
+10304 OLD ITALIC LETTER E
+10305 OLD ITALIC LETTER VE
+10306 OLD ITALIC LETTER ZE
+10307 OLD ITALIC LETTER HE
+10308 OLD ITALIC LETTER THE
+10309 OLD ITALIC LETTER I
+1030A OLD ITALIC LETTER KA
+1030B OLD ITALIC LETTER EL
+1030C OLD ITALIC LETTER EM
+1030D OLD ITALIC LETTER EN
+1030E OLD ITALIC LETTER ESH
+1030F OLD ITALIC LETTER O (Faliscan)
+10310 OLD ITALIC LETTER PE
+10311 OLD ITALIC LETTER SHE
+10312 OLD ITALIC LETTER KU
+10313 OLD ITALIC LETTER ER
+10314 OLD ITALIC LETTER ES
+10315 OLD ITALIC LETTER TE
+10316 OLD ITALIC LETTER U
+10317 OLD ITALIC LETTER EKS (Faliscan)
+10318 OLD ITALIC LETTER PHE
+10319 OLD ITALIC LETTER KHE
+1031A OLD ITALIC LETTER EF
+1031B OLD ITALIC LETTER ERS (Umbrian)
+1031C OLD ITALIC LETTER CHE (Umbrian)
+1031D OLD ITALIC LETTER II (Oscan)
+1031E OLD ITALIC LETTER UU (Oscan)
+@ Numerals
+10320 OLD ITALIC NUMERAL ONE
+10321 OLD ITALIC NUMERAL FIVE
+10322 OLD ITALIC NUMERAL TEN
+10323 OLD ITALIC NUMERAL FIFTY
+@@ 10330 Gothic 1034F
+@ Letters
+10330 GOTHIC LETTER AHSA
+10331 GOTHIC LETTER BAIRKAN
+10332 GOTHIC LETTER GIBA
+10333 GOTHIC LETTER DAGS
+10334 GOTHIC LETTER AIHVUS
+10335 GOTHIC LETTER QAIRTHRA
+10336 GOTHIC LETTER IUJA
+10337 GOTHIC LETTER HAGL
+10338 GOTHIC LETTER THIUTH
+10339 GOTHIC LETTER EIS
+1033A GOTHIC LETTER KUSMA
+1033B GOTHIC LETTER LAGUS
+1033C GOTHIC LETTER MANNA
+1033D GOTHIC LETTER NAUTHS
+1033E GOTHIC LETTER JER
+1033F GOTHIC LETTER URUS
+10340 GOTHIC LETTER PAIRTHRA
+10341 GOTHIC LETTER NINETY
+10342 GOTHIC LETTER RAIDA
+10343 GOTHIC LETTER SAUIL
+10344 GOTHIC LETTER TEIWS
+10345 GOTHIC LETTER WINJA
+10346 GOTHIC LETTER FAIHU
+10347 GOTHIC LETTER IGGWS
+10348 GOTHIC LETTER HWAIR
+10349 GOTHIC LETTER OTHAL
+1034A GOTHIC LETTER NINE HUNDRED
+@@ 10380 Ugaritic 1039F
+@ Letters
+10380 UGARITIC LETTER ALPA
+10381 UGARITIC LETTER BETA
+10382 UGARITIC LETTER GAMLA
+10383 UGARITIC LETTER KHA
+10384 UGARITIC LETTER DELTA
+10385 UGARITIC LETTER HO
+10386 UGARITIC LETTER WO
+10387 UGARITIC LETTER ZETA
+10388 UGARITIC LETTER HOTA
+10389 UGARITIC LETTER TET
+1038A UGARITIC LETTER YOD
+1038B UGARITIC LETTER KAF
+1038C UGARITIC LETTER SHIN
+1038D UGARITIC LETTER LAMDA
+1038E UGARITIC LETTER MEM
+1038F UGARITIC LETTER DHAL
+10390 UGARITIC LETTER NUN
+10391 UGARITIC LETTER ZU
+10392 UGARITIC LETTER SAMKA
+10393 UGARITIC LETTER AIN
+10394 UGARITIC LETTER PU
+10395 UGARITIC LETTER SADE
+10396 UGARITIC LETTER QOPA
+10397 UGARITIC LETTER RASHA
+10398 UGARITIC LETTER THANNA
+10399 UGARITIC LETTER GHAIN
+1039A UGARITIC LETTER TO
+1039B UGARITIC LETTER I
+1039C UGARITIC LETTER U
+1039D UGARITIC LETTER SSU
+@ Punctuation
+1039F UGARITIC WORD DIVIDER
+@@ 103A0 Old Persian 103DF
+@ Independent vowels
+103A0 OLD PERSIAN SIGN A
+103A1 OLD PERSIAN SIGN I
+103A2 OLD PERSIAN SIGN U
+@ Consonants
+103A3 OLD PERSIAN SIGN KA
+103A4 OLD PERSIAN SIGN KU
+103A5 OLD PERSIAN SIGN GA
+103A6 OLD PERSIAN SIGN GU
+103A7 OLD PERSIAN SIGN XA
+103A8 OLD PERSIAN SIGN CA
+103A9 OLD PERSIAN SIGN JA
+103AA OLD PERSIAN SIGN JI
+103AB OLD PERSIAN SIGN TA
+103AC OLD PERSIAN SIGN TU
+103AD OLD PERSIAN SIGN DA
+103AE OLD PERSIAN SIGN DI
+103AF OLD PERSIAN SIGN DU
+103B0 OLD PERSIAN SIGN THA
+103B1 OLD PERSIAN SIGN PA
+103B2 OLD PERSIAN SIGN BA
+103B3 OLD PERSIAN SIGN FA
+103B4 OLD PERSIAN SIGN NA
+103B5 OLD PERSIAN SIGN NU
+103B6 OLD PERSIAN SIGN MA
+103B7 OLD PERSIAN SIGN MI
+103B8 OLD PERSIAN SIGN MU
+103B9 OLD PERSIAN SIGN YA
+103BA OLD PERSIAN SIGN VA
+103BB OLD PERSIAN SIGN VI
+103BC OLD PERSIAN SIGN RA
+103BD OLD PERSIAN SIGN RU
+103BE OLD PERSIAN SIGN LA
+103BF OLD PERSIAN SIGN SA
+103C0 OLD PERSIAN SIGN ZA
+103C1 OLD PERSIAN SIGN SHA
+103C2 OLD PERSIAN SIGN SSA
+103C3 OLD PERSIAN SIGN HA
+@ Various signs
+103C8 OLD PERSIAN SIGN AURAMAZDAA
+103C9 OLD PERSIAN SIGN AURAMAZDAA-2
+103CA OLD PERSIAN SIGN AURAMAZDAAHA
+103CB OLD PERSIAN SIGN XSHAAYATHIYA
+103CC OLD PERSIAN SIGN DAHYAAUSH
+103CD OLD PERSIAN SIGN DAHYAAUSH-2
+103CE OLD PERSIAN SIGN BAGA
+103CF OLD PERSIAN SIGN BUUMISH
+@ Punctuation
+103D0 OLD PERSIAN WORD DIVIDER
+@ Numbers
+103D1 OLD PERSIAN NUMBER ONE
+103D2 OLD PERSIAN NUMBER TWO
+103D3 OLD PERSIAN NUMBER TEN
+103D4 OLD PERSIAN NUMBER TWENTY
+103D5 OLD PERSIAN NUMBER HUNDRED
+@@ 10400 Deseret 1044F
+@ Uppercase letters
+10400 DESERET CAPITAL LETTER LONG I
+10401 DESERET CAPITAL LETTER LONG E
+10402 DESERET CAPITAL LETTER LONG A
+10403 DESERET CAPITAL LETTER LONG AH
+10404 DESERET CAPITAL LETTER LONG O
+10405 DESERET CAPITAL LETTER LONG OO
+10406 DESERET CAPITAL LETTER SHORT I
+10407 DESERET CAPITAL LETTER SHORT E
+10408 DESERET CAPITAL LETTER SHORT A
+10409 DESERET CAPITAL LETTER SHORT AH
+1040A DESERET CAPITAL LETTER SHORT O
+1040B DESERET CAPITAL LETTER SHORT OO
+1040C DESERET CAPITAL LETTER AY
+1040D DESERET CAPITAL LETTER OW
+1040E DESERET CAPITAL LETTER WU
+1040F DESERET CAPITAL LETTER YEE
+10410 DESERET CAPITAL LETTER H
+10411 DESERET CAPITAL LETTER PEE
+10412 DESERET CAPITAL LETTER BEE
+10413 DESERET CAPITAL LETTER TEE
+10414 DESERET CAPITAL LETTER DEE
+10415 DESERET CAPITAL LETTER CHEE
+10416 DESERET CAPITAL LETTER JEE
+10417 DESERET CAPITAL LETTER KAY
+10418 DESERET CAPITAL LETTER GAY
+10419 DESERET CAPITAL LETTER EF
+1041A DESERET CAPITAL LETTER VEE
+1041B DESERET CAPITAL LETTER ETH
+1041C DESERET CAPITAL LETTER THEE
+1041D DESERET CAPITAL LETTER ES
+1041E DESERET CAPITAL LETTER ZEE
+1041F DESERET CAPITAL LETTER ESH
+10420 DESERET CAPITAL LETTER ZHEE
+10421 DESERET CAPITAL LETTER ER
+10422 DESERET CAPITAL LETTER EL
+10423 DESERET CAPITAL LETTER EM
+10424 DESERET CAPITAL LETTER EN
+10425 DESERET CAPITAL LETTER ENG
+10426 DESERET CAPITAL LETTER OI
+10427 DESERET CAPITAL LETTER EW
+@ Lowercase letters
+10428 DESERET SMALL LETTER LONG I
+10429 DESERET SMALL LETTER LONG E
+1042A DESERET SMALL LETTER LONG A
+1042B DESERET SMALL LETTER LONG AH
+1042C DESERET SMALL LETTER LONG O
+1042D DESERET SMALL LETTER LONG OO
+1042E DESERET SMALL LETTER SHORT I
+1042F DESERET SMALL LETTER SHORT E
+10430 DESERET SMALL LETTER SHORT A
+10431 DESERET SMALL LETTER SHORT AH
+10432 DESERET SMALL LETTER SHORT O
+10433 DESERET SMALL LETTER SHORT OO
+10434 DESERET SMALL LETTER AY
+10435 DESERET SMALL LETTER OW
+10436 DESERET SMALL LETTER WU
+10437 DESERET SMALL LETTER YEE
+10438 DESERET SMALL LETTER H
+10439 DESERET SMALL LETTER PEE
+1043A DESERET SMALL LETTER BEE
+1043B DESERET SMALL LETTER TEE
+1043C DESERET SMALL LETTER DEE
+1043D DESERET SMALL LETTER CHEE
+1043E DESERET SMALL LETTER JEE
+1043F DESERET SMALL LETTER KAY
+10440 DESERET SMALL LETTER GAY
+10441 DESERET SMALL LETTER EF
+10442 DESERET SMALL LETTER VEE
+10443 DESERET SMALL LETTER ETH
+10444 DESERET SMALL LETTER THEE
+10445 DESERET SMALL LETTER ES
+10446 DESERET SMALL LETTER ZEE
+10447 DESERET SMALL LETTER ESH
+10448 DESERET SMALL LETTER ZHEE
+10449 DESERET SMALL LETTER ER
+1044A DESERET SMALL LETTER EL
+1044B DESERET SMALL LETTER EM
+1044C DESERET SMALL LETTER EN
+1044D DESERET SMALL LETTER ENG
+1044E DESERET SMALL LETTER OI
+1044F DESERET SMALL LETTER EW
+@@ 10450 Shavian 1047F
+@ Consonants
+10450 SHAVIAN LETTER PEEP
+10451 SHAVIAN LETTER TOT
+10452 SHAVIAN LETTER KICK
+10453 SHAVIAN LETTER FEE
+10454 SHAVIAN LETTER THIGH
+10455 SHAVIAN LETTER SO
+10456 SHAVIAN LETTER SURE
+10457 SHAVIAN LETTER CHURCH
+10458 SHAVIAN LETTER YEA
+10459 SHAVIAN LETTER HUNG
+1045A SHAVIAN LETTER BIB
+1045B SHAVIAN LETTER DEAD
+1045C SHAVIAN LETTER GAG
+1045D SHAVIAN LETTER VOW
+1045E SHAVIAN LETTER THEY
+1045F SHAVIAN LETTER ZOO
+10460 SHAVIAN LETTER MEASURE
+10461 SHAVIAN LETTER JUDGE
+10462 SHAVIAN LETTER WOE
+10463 SHAVIAN LETTER HA-HA
+10464 SHAVIAN LETTER LOLL
+10465 SHAVIAN LETTER MIME
+@ Vowels
+10466 SHAVIAN LETTER IF
+10467 SHAVIAN LETTER EGG
+10468 SHAVIAN LETTER ASH
+10469 SHAVIAN LETTER ADO
+1046A SHAVIAN LETTER ON
+1046B SHAVIAN LETTER WOOL
+1046C SHAVIAN LETTER OUT
+1046D SHAVIAN LETTER AH
+1046E SHAVIAN LETTER ROAR
+1046F SHAVIAN LETTER NUN
+10470 SHAVIAN LETTER EAT
+10471 SHAVIAN LETTER AGE
+10472 SHAVIAN LETTER ICE
+10473 SHAVIAN LETTER UP
+10474 SHAVIAN LETTER OAK
+10475 SHAVIAN LETTER OOZE
+10476 SHAVIAN LETTER OIL
+10477 SHAVIAN LETTER AWE
+10478 SHAVIAN LETTER ARE
+10479 SHAVIAN LETTER OR
+1047A SHAVIAN LETTER AIR
+1047B SHAVIAN LETTER ERR
+1047C SHAVIAN LETTER ARRAY
+1047D SHAVIAN LETTER EAR
+1047E SHAVIAN LETTER IAN
+1047F SHAVIAN LETTER YEW
+@@ 10480 Osmanya 104AF
+@ Letters
+10480 OSMANYA LETTER ALEF
+10481 OSMANYA LETTER BA
+10482 OSMANYA LETTER TA
+10483 OSMANYA LETTER JA
+10484 OSMANYA LETTER XA
+10485 OSMANYA LETTER KHA
+10486 OSMANYA LETTER DEEL
+10487 OSMANYA LETTER RA
+10488 OSMANYA LETTER SA
+10489 OSMANYA LETTER SHIIN
+1048A OSMANYA LETTER DHA
+1048B OSMANYA LETTER CAYN
+1048C OSMANYA LETTER GA
+1048D OSMANYA LETTER FA
+1048E OSMANYA LETTER QAAF
+1048F OSMANYA LETTER KAAF
+10490 OSMANYA LETTER LAAN
+10491 OSMANYA LETTER MIIN
+10492 OSMANYA LETTER NUUN
+10493 OSMANYA LETTER WAW
+10494 OSMANYA LETTER HA
+10495 OSMANYA LETTER YA
+10496 OSMANYA LETTER A
+10497 OSMANYA LETTER E
+10498 OSMANYA LETTER I
+10499 OSMANYA LETTER O
+1049A OSMANYA LETTER U
+1049B OSMANYA LETTER AA
+1049C OSMANYA LETTER EE
+1049D OSMANYA LETTER OO
+@ Digits
+104A0 OSMANYA DIGIT ZERO
+104A1 OSMANYA DIGIT ONE
+104A2 OSMANYA DIGIT TWO
+104A3 OSMANYA DIGIT THREE
+104A4 OSMANYA DIGIT FOUR
+104A5 OSMANYA DIGIT FIVE
+104A6 OSMANYA DIGIT SIX
+104A7 OSMANYA DIGIT SEVEN
+104A8 OSMANYA DIGIT EIGHT
+104A9 OSMANYA DIGIT NINE
+@@ 10800 Cypriot Syllabary 1083F
+@ Syllables
+10800 CYPRIOT SYLLABLE A
+10801 CYPRIOT SYLLABLE E
+10802 CYPRIOT SYLLABLE I
+10803 CYPRIOT SYLLABLE O
+10804 CYPRIOT SYLLABLE U
+10805 CYPRIOT SYLLABLE JA
+10808 CYPRIOT SYLLABLE JO
+1080A CYPRIOT SYLLABLE KA
+1080B CYPRIOT SYLLABLE KE
+1080C CYPRIOT SYLLABLE KI
+1080D CYPRIOT SYLLABLE KO
+1080E CYPRIOT SYLLABLE KU
+1080F CYPRIOT SYLLABLE LA
+10810 CYPRIOT SYLLABLE LE
+10811 CYPRIOT SYLLABLE LI
+10812 CYPRIOT SYLLABLE LO
+10813 CYPRIOT SYLLABLE LU
+10814 CYPRIOT SYLLABLE MA
+10815 CYPRIOT SYLLABLE ME
+10816 CYPRIOT SYLLABLE MI
+10817 CYPRIOT SYLLABLE MO
+10818 CYPRIOT SYLLABLE MU
+10819 CYPRIOT SYLLABLE NA
+1081A CYPRIOT SYLLABLE NE
+1081B CYPRIOT SYLLABLE NI
+1081C CYPRIOT SYLLABLE NO
+1081D CYPRIOT SYLLABLE NU
+1081E CYPRIOT SYLLABLE PA
+1081F CYPRIOT SYLLABLE PE
+10820 CYPRIOT SYLLABLE PI
+10821 CYPRIOT SYLLABLE PO
+10822 CYPRIOT SYLLABLE PU
+10823 CYPRIOT SYLLABLE RA
+10824 CYPRIOT SYLLABLE RE
+10825 CYPRIOT SYLLABLE RI
+10826 CYPRIOT SYLLABLE RO
+10827 CYPRIOT SYLLABLE RU
+10828 CYPRIOT SYLLABLE SA
+10829 CYPRIOT SYLLABLE SE
+1082A CYPRIOT SYLLABLE SI
+1082B CYPRIOT SYLLABLE SO
+1082C CYPRIOT SYLLABLE SU
+1082D CYPRIOT SYLLABLE TA
+1082E CYPRIOT SYLLABLE TE
+1082F CYPRIOT SYLLABLE TI
+10830 CYPRIOT SYLLABLE TO
+10831 CYPRIOT SYLLABLE TU
+10832 CYPRIOT SYLLABLE WA
+10833 CYPRIOT SYLLABLE WE
+10834 CYPRIOT SYLLABLE WI
+10835 CYPRIOT SYLLABLE WO
+10837 CYPRIOT SYLLABLE XA
+10838 CYPRIOT SYLLABLE XE
+1083C CYPRIOT SYLLABLE ZA
+1083F CYPRIOT SYLLABLE ZO
+@@ 10900 Phoenician 1091F
+@ Letters
+10900 PHOENICIAN LETTER ALF
+ x (hebrew letter alef - 05D0)
+10901 PHOENICIAN LETTER BET
+ x (hebrew letter bet - 05D1)
+10902 PHOENICIAN LETTER GAML
+ x (hebrew letter gimel - 05D2)
+10903 PHOENICIAN LETTER DELT
+ x (hebrew letter dalet - 05D3)
+10904 PHOENICIAN LETTER HE
+ x (hebrew letter he - 05D4)
+10905 PHOENICIAN LETTER WAU
+ x (hebrew letter vav - 05D5)
+10906 PHOENICIAN LETTER ZAI
+ x (hebrew letter zayin - 05D6)
+10907 PHOENICIAN LETTER HET
+ x (hebrew letter het - 05D7)
+10908 PHOENICIAN LETTER TET
+ x (hebrew letter tet - 05D8)
+10909 PHOENICIAN LETTER YOD
+ x (hebrew letter yod - 05D9)
+1090A PHOENICIAN LETTER KAF
+ x (hebrew letter kaf - 05DB)
+1090B PHOENICIAN LETTER LAMD
+ x (hebrew letter lamed - 05DC)
+1090C PHOENICIAN LETTER MEM
+ x (hebrew letter mem - 05DE)
+1090D PHOENICIAN LETTER NUN
+ x (hebrew letter nun - 05E0)
+1090E PHOENICIAN LETTER SEMK
+ x (hebrew letter samekh - 05E1)
+1090F PHOENICIAN LETTER AIN
+ x (hebrew letter ayin - 05E2)
+10910 PHOENICIAN LETTER PE
+ x (hebrew letter pe - 05E4)
+10911 PHOENICIAN LETTER SADE
+ x (hebrew letter tsadi - 05E6)
+10912 PHOENICIAN LETTER QOF
+ x (hebrew letter qof - 05E7)
+10913 PHOENICIAN LETTER ROSH
+ x (hebrew letter resh - 05E8)
+10914 PHOENICIAN LETTER SHIN
+ x (hebrew letter shin - 05E9)
+10915 PHOENICIAN LETTER TAU
+ x (hebrew letter tav - 05EA)
+@ Numbers
+10916 PHOENICIAN NUMBER ONE
+10917 PHOENICIAN NUMBER TEN
+10918 PHOENICIAN NUMBER TWENTY
+10919 PHOENICIAN NUMBER ONE HUNDRED
+@ Punctuation
+1091F PHOENICIAN WORD SEPARATOR
+ x (middle dot - 00B7)
+@@ 10920 Lydian 1093F
+@ Letters
+10920 LYDIAN LETTER A
+10921 LYDIAN LETTER B
+10922 LYDIAN LETTER G
+10923 LYDIAN LETTER D
+10924 LYDIAN LETTER E
+10925 LYDIAN LETTER V
+10926 LYDIAN LETTER I
+10927 LYDIAN LETTER Y
+10928 LYDIAN LETTER K
+10929 LYDIAN LETTER L
+1092A LYDIAN LETTER M
+1092B LYDIAN LETTER N
+1092C LYDIAN LETTER O
+1092D LYDIAN LETTER R
+1092E LYDIAN LETTER SS
+1092F LYDIAN LETTER T
+10930 LYDIAN LETTER U
+10931 LYDIAN LETTER F
+10932 LYDIAN LETTER Q
+10933 LYDIAN LETTER S
+10934 LYDIAN LETTER TT
+10935 LYDIAN LETTER AN
+10936 LYDIAN LETTER EN
+10937 LYDIAN LETTER LY
+10938 LYDIAN LETTER NN
+10939 LYDIAN LETTER C
+@ Punctuation
+1093F LYDIAN TRIANGULAR MARK
+@@ 10A00 Kharoshthi 10A5F
+@ Vowels
+10A00 KHAROSHTHI LETTER A
+10A01 KHAROSHTHI VOWEL SIGN I
+10A02 KHAROSHTHI VOWEL SIGN U
+10A03 KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05 KHAROSHTHI VOWEL SIGN E
+10A06 KHAROSHTHI VOWEL SIGN O
+@ Length mark
+10A0C KHAROSHTHI VOWEL LENGTH MARK
+@ Various signs
+10A0D KHAROSHTHI SIGN DOUBLE RING BELOW
+10A0E KHAROSHTHI SIGN ANUSVARA
+10A0F KHAROSHTHI SIGN VISARGA
+@ Consonants
+10A10 KHAROSHTHI LETTER KA
+10A11 KHAROSHTHI LETTER KHA
+10A12 KHAROSHTHI LETTER GA
+10A13 KHAROSHTHI LETTER GHA
+10A15 KHAROSHTHI LETTER CA
+10A16 KHAROSHTHI LETTER CHA
+10A17 KHAROSHTHI LETTER JA
+10A19 KHAROSHTHI LETTER NYA
+10A1A KHAROSHTHI LETTER TTA
+10A1B KHAROSHTHI LETTER TTHA
+10A1C KHAROSHTHI LETTER DDA
+10A1D KHAROSHTHI LETTER DDHA
+10A1E KHAROSHTHI LETTER NNA
+10A1F KHAROSHTHI LETTER TA
+10A20 KHAROSHTHI LETTER THA
+10A21 KHAROSHTHI LETTER DA
+10A22 KHAROSHTHI LETTER DHA
+10A23 KHAROSHTHI LETTER NA
+10A24 KHAROSHTHI LETTER PA
+10A25 KHAROSHTHI LETTER PHA
+10A26 KHAROSHTHI LETTER BA
+10A27 KHAROSHTHI LETTER BHA
+10A28 KHAROSHTHI LETTER MA
+10A29 KHAROSHTHI LETTER YA
+10A2A KHAROSHTHI LETTER RA
+10A2B KHAROSHTHI LETTER LA
+10A2C KHAROSHTHI LETTER VA
+10A2D KHAROSHTHI LETTER SHA
+10A2E KHAROSHTHI LETTER SSA
+10A2F KHAROSHTHI LETTER SA
+10A30 KHAROSHTHI LETTER ZA
+10A31 KHAROSHTHI LETTER HA
+10A32 KHAROSHTHI LETTER KKA
+10A33 KHAROSHTHI LETTER TTTHA
+@ Various signs
+10A38 KHAROSHTHI SIGN BAR ABOVE
+10A39 KHAROSHTHI SIGN CAUDA
+10A3A KHAROSHTHI SIGN DOT BELOW
+@ Virama
+10A3F KHAROSHTHI VIRAMA
+ = halant
+ * suppresses inherent vowel
+ * shape shown is arbitrary and is not visibly rendered
+@ Digits
+10A40 KHAROSHTHI DIGIT ONE
+10A41 KHAROSHTHI DIGIT TWO
+10A42 KHAROSHTHI DIGIT THREE
+10A43 KHAROSHTHI DIGIT FOUR
+@ Numbers
+10A44 KHAROSHTHI NUMBER TEN
+10A45 KHAROSHTHI NUMBER TWENTY
+10A46 KHAROSHTHI NUMBER ONE HUNDRED
+10A47 KHAROSHTHI NUMBER ONE THOUSAND
+@ Punctuation
+10A50 KHAROSHTHI PUNCTUATION DOT
+10A51 KHAROSHTHI PUNCTUATION SMALL CIRCLE
+10A52 KHAROSHTHI PUNCTUATION CIRCLE
+10A53 KHAROSHTHI PUNCTUATION CRESCENT BAR
+10A54 KHAROSHTHI PUNCTUATION MANGALAM
+10A55 KHAROSHTHI PUNCTUATION LOTUS
+10A56 KHAROSHTHI PUNCTUATION DANDA
+10A57 KHAROSHTHI PUNCTUATION DOUBLE DANDA
+10A58 KHAROSHTHI PUNCTUATION LINES
+@@ 12000 Cuneiform 123FF
+@ Signs
+12000 CUNEIFORM SIGN A
+12001 CUNEIFORM SIGN A TIMES A
+12002 CUNEIFORM SIGN A TIMES BAD
+12003 CUNEIFORM SIGN A TIMES GAN2 TENU
+12004 CUNEIFORM SIGN A TIMES HA
+12005 CUNEIFORM SIGN A TIMES IGI
+12006 CUNEIFORM SIGN A TIMES LAGAR GUNU
+12007 CUNEIFORM SIGN A TIMES MUSH
+12008 CUNEIFORM SIGN A TIMES SAG
+12009 CUNEIFORM SIGN A2
+1200A CUNEIFORM SIGN AB
+1200B CUNEIFORM SIGN AB TIMES ASH2
+1200C CUNEIFORM SIGN AB TIMES DUN3 GUNU
+1200D CUNEIFORM SIGN AB TIMES GAL
+1200E CUNEIFORM SIGN AB TIMES GAN2 TENU
+1200F CUNEIFORM SIGN AB TIMES HA
+12010 CUNEIFORM SIGN AB TIMES IGI GUNU
+12011 CUNEIFORM SIGN AB TIMES IMIN
+12012 CUNEIFORM SIGN AB TIMES LAGAB
+12013 CUNEIFORM SIGN AB TIMES SHESH
+12014 CUNEIFORM SIGN AB TIMES U PLUS U PLUS U
+12015 CUNEIFORM SIGN AB GUNU
+12016 CUNEIFORM SIGN AB2
+12017 CUNEIFORM SIGN AB2 TIMES BALAG
+12018 CUNEIFORM SIGN AB2 TIMES GAN2 TENU
+12019 CUNEIFORM SIGN AB2 TIMES ME PLUS EN
+1201A CUNEIFORM SIGN AB2 TIMES SHA3
+1201B CUNEIFORM SIGN AB2 TIMES TAK4
+1201C CUNEIFORM SIGN AD
+1201D CUNEIFORM SIGN AK
+1201E CUNEIFORM SIGN AK TIMES ERIN2
+1201F CUNEIFORM SIGN AK TIMES SHITA PLUS GISH
+12020 CUNEIFORM SIGN AL
+12021 CUNEIFORM SIGN AL TIMES AL
+12022 CUNEIFORM SIGN AL TIMES DIM2
+12023 CUNEIFORM SIGN AL TIMES GISH
+12024 CUNEIFORM SIGN AL TIMES HA
+12025 CUNEIFORM SIGN AL TIMES KAD3
+12026 CUNEIFORM SIGN AL TIMES KI
+12027 CUNEIFORM SIGN AL TIMES SHE
+12028 CUNEIFORM SIGN AL TIMES USH
+12029 CUNEIFORM SIGN ALAN
+1202A CUNEIFORM SIGN ALEPH
+1202B CUNEIFORM SIGN AMAR
+1202C CUNEIFORM SIGN AMAR TIMES SHE
+1202D CUNEIFORM SIGN AN
+1202E CUNEIFORM SIGN AN OVER AN
+1202F CUNEIFORM SIGN AN THREE TIMES
+12030 CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA
+12031 CUNEIFORM SIGN AN PLUS NAGA SQUARED
+12032 CUNEIFORM SIGN ANSHE
+12033 CUNEIFORM SIGN APIN
+12034 CUNEIFORM SIGN ARAD
+12035 CUNEIFORM SIGN ARAD TIMES KUR
+12036 CUNEIFORM SIGN ARKAB
+12037 CUNEIFORM SIGN ASAL2
+12038 CUNEIFORM SIGN ASH
+12039 CUNEIFORM SIGN ASH ZIDA TENU
+1203A CUNEIFORM SIGN ASH KABA TENU
+1203B CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP
+1203C CUNEIFORM SIGN ASH OVER ASH OVER ASH
+1203D CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH
+1203E CUNEIFORM SIGN ASH2
+1203F CUNEIFORM SIGN ASHGAB
+12040 CUNEIFORM SIGN BA
+12041 CUNEIFORM SIGN BAD
+12042 CUNEIFORM SIGN BAG3
+12043 CUNEIFORM SIGN BAHAR2
+12044 CUNEIFORM SIGN BAL
+12045 CUNEIFORM SIGN BAL OVER BAL
+12046 CUNEIFORM SIGN BALAG
+12047 CUNEIFORM SIGN BAR
+12048 CUNEIFORM SIGN BARA2
+12049 CUNEIFORM SIGN BI
+1204A CUNEIFORM SIGN BI TIMES A
+1204B CUNEIFORM SIGN BI TIMES GAR
+1204C CUNEIFORM SIGN BI TIMES IGI GUNU
+1204D CUNEIFORM SIGN BU
+1204E CUNEIFORM SIGN BU OVER BU AB
+1204F CUNEIFORM SIGN BU OVER BU UN
+12050 CUNEIFORM SIGN BU CROSSING BU
+12051 CUNEIFORM SIGN BULUG
+12052 CUNEIFORM SIGN BULUG OVER BULUG
+12053 CUNEIFORM SIGN BUR
+12054 CUNEIFORM SIGN BUR2
+12055 CUNEIFORM SIGN DA
+12056 CUNEIFORM SIGN DAG
+12057 CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH
+12058 CUNEIFORM SIGN DAG KISIM5 TIMES AMAR
+12059 CUNEIFORM SIGN DAG KISIM5 TIMES BALAG
+1205A CUNEIFORM SIGN DAG KISIM5 TIMES BI
+1205B CUNEIFORM SIGN DAG KISIM5 TIMES GA
+1205C CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH
+1205D CUNEIFORM SIGN DAG KISIM5 TIMES GI
+1205E CUNEIFORM SIGN DAG KISIM5 TIMES GIR2
+1205F CUNEIFORM SIGN DAG KISIM5 TIMES GUD
+12060 CUNEIFORM SIGN DAG KISIM5 TIMES HA
+12061 CUNEIFORM SIGN DAG KISIM5 TIMES IR
+12062 CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU
+12063 CUNEIFORM SIGN DAG KISIM5 TIMES KAK
+12064 CUNEIFORM SIGN DAG KISIM5 TIMES LA
+12065 CUNEIFORM SIGN DAG KISIM5 TIMES LU
+12066 CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2
+12067 CUNEIFORM SIGN DAG KISIM5 TIMES LUM
+12068 CUNEIFORM SIGN DAG KISIM5 TIMES NE
+12069 CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP
+1206A CUNEIFORM SIGN DAG KISIM5 TIMES SI
+1206B CUNEIFORM SIGN DAG KISIM5 TIMES TAK4
+1206C CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2
+1206D CUNEIFORM SIGN DAG KISIM5 TIMES USH
+1206E CUNEIFORM SIGN DAM
+1206F CUNEIFORM SIGN DAR
+12070 CUNEIFORM SIGN DARA3
+12071 CUNEIFORM SIGN DARA4
+12072 CUNEIFORM SIGN DI
+12073 CUNEIFORM SIGN DIB
+12074 CUNEIFORM SIGN DIM
+12075 CUNEIFORM SIGN DIM TIMES SHE
+12076 CUNEIFORM SIGN DIM2
+12077 CUNEIFORM SIGN DIN
+12078 CUNEIFORM SIGN DIN KASKAL U GUNU DISH
+12079 CUNEIFORM SIGN DISH
+1207A CUNEIFORM SIGN DU
+1207B CUNEIFORM SIGN DU OVER DU
+1207C CUNEIFORM SIGN DU GUNU
+1207D CUNEIFORM SIGN DU SHESHIG
+1207E CUNEIFORM SIGN DUB
+1207F CUNEIFORM SIGN DUB TIMES ESH2
+12080 CUNEIFORM SIGN DUB2
+12081 CUNEIFORM SIGN DUG
+12082 CUNEIFORM SIGN DUGUD
+12083 CUNEIFORM SIGN DUH
+12084 CUNEIFORM SIGN DUN
+12085 CUNEIFORM SIGN DUN3
+12086 CUNEIFORM SIGN DUN3 GUNU
+12087 CUNEIFORM SIGN DUN3 GUNU GUNU
+12088 CUNEIFORM SIGN DUN4
+12089 CUNEIFORM SIGN DUR2
+1208A CUNEIFORM SIGN E
+1208B CUNEIFORM SIGN E TIMES PAP
+1208C CUNEIFORM SIGN E OVER E NUN OVER NUN
+1208D CUNEIFORM SIGN E2
+1208E CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA
+1208F CUNEIFORM SIGN E2 TIMES GAR
+12090 CUNEIFORM SIGN E2 TIMES MI
+12091 CUNEIFORM SIGN E2 TIMES SAL
+12092 CUNEIFORM SIGN E2 TIMES SHE
+12093 CUNEIFORM SIGN E2 TIMES U
+12094 CUNEIFORM SIGN EDIN
+12095 CUNEIFORM SIGN EGIR
+12096 CUNEIFORM SIGN EL
+12097 CUNEIFORM SIGN EN
+12098 CUNEIFORM SIGN EN TIMES GAN2
+12099 CUNEIFORM SIGN EN TIMES GAN2 TENU
+1209A CUNEIFORM SIGN EN TIMES ME
+1209B CUNEIFORM SIGN EN CROSSING EN
+1209C CUNEIFORM SIGN EN OPPOSING EN
+1209D CUNEIFORM SIGN EN SQUARED
+1209E CUNEIFORM SIGN EREN
+1209F CUNEIFORM SIGN ERIN2
+120A0 CUNEIFORM SIGN ESH2
+120A1 CUNEIFORM SIGN EZEN
+120A2 CUNEIFORM SIGN EZEN TIMES A
+120A3 CUNEIFORM SIGN EZEN TIMES A PLUS LAL
+120A4 CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL
+120A5 CUNEIFORM SIGN EZEN TIMES AN
+120A6 CUNEIFORM SIGN EZEN TIMES BAD
+120A7 CUNEIFORM SIGN EZEN TIMES DUN3 GUNU
+120A8 CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU
+120A9 CUNEIFORM SIGN EZEN TIMES HA
+120AA CUNEIFORM SIGN EZEN TIMES HA GUNU
+120AB CUNEIFORM SIGN EZEN TIMES IGI GUNU
+120AC CUNEIFORM SIGN EZEN TIMES KASKAL
+120AD CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED
+120AE CUNEIFORM SIGN EZEN TIMES KU3
+120AF CUNEIFORM SIGN EZEN TIMES LA
+120B0 CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL
+120B1 CUNEIFORM SIGN EZEN TIMES LI
+120B2 CUNEIFORM SIGN EZEN TIMES LU
+120B3 CUNEIFORM SIGN EZEN TIMES U2
+120B4 CUNEIFORM SIGN EZEN TIMES UD
+120B5 CUNEIFORM SIGN GA
+120B6 CUNEIFORM SIGN GA GUNU
+120B7 CUNEIFORM SIGN GA2
+120B8 CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA
+120B9 CUNEIFORM SIGN GA2 TIMES A PLUS HA
+120BA CUNEIFORM SIGN GA2 TIMES A PLUS IGI
+120BB CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB
+120BC CUNEIFORM SIGN GA2 TIMES AN
+120BD CUNEIFORM SIGN GA2 TIMES ASH
+120BE CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL
+120BF CUNEIFORM SIGN GA2 TIMES BAD
+120C0 CUNEIFORM SIGN GA2 TIMES BAR PLUS RA
+120C1 CUNEIFORM SIGN GA2 TIMES BUR
+120C2 CUNEIFORM SIGN GA2 TIMES BUR PLUS RA
+120C3 CUNEIFORM SIGN GA2 TIMES DA
+120C4 CUNEIFORM SIGN GA2 TIMES DI
+120C5 CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE
+120C6 CUNEIFORM SIGN GA2 TIMES DUB
+120C7 CUNEIFORM SIGN GA2 TIMES EL
+120C8 CUNEIFORM SIGN GA2 TIMES EL PLUS LA
+120C9 CUNEIFORM SIGN GA2 TIMES EN
+120CA CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU
+120CB CUNEIFORM SIGN GA2 TIMES GAN2 TENU
+120CC CUNEIFORM SIGN GA2 TIMES GAR
+120CD CUNEIFORM SIGN GA2 TIMES GI
+120CE CUNEIFORM SIGN GA2 TIMES GI4
+120CF CUNEIFORM SIGN GA2 TIMES GI4 PLUS A
+120D0 CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU
+120D1 CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2
+120D2 CUNEIFORM SIGN GA2 TIMES HAL
+120D3 CUNEIFORM SIGN GA2 TIMES HAL PLUS LA
+120D4 CUNEIFORM SIGN GA2 TIMES HI PLUS LI
+120D5 CUNEIFORM SIGN GA2 TIMES HUB2
+120D6 CUNEIFORM SIGN GA2 TIMES IGI GUNU
+120D7 CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH
+120D8 CUNEIFORM SIGN GA2 TIMES KAK
+120D9 CUNEIFORM SIGN GA2 TIMES KASKAL
+120DA CUNEIFORM SIGN GA2 TIMES KID
+120DB CUNEIFORM SIGN GA2 TIMES KID PLUS LAL
+120DC CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN
+120DD CUNEIFORM SIGN GA2 TIMES LA
+120DE CUNEIFORM SIGN GA2 TIMES ME PLUS EN
+120DF CUNEIFORM SIGN GA2 TIMES MI
+120E0 CUNEIFORM SIGN GA2 TIMES NUN
+120E1 CUNEIFORM SIGN GA2 TIMES NUN OVER NUN
+120E2 CUNEIFORM SIGN GA2 TIMES PA
+120E3 CUNEIFORM SIGN GA2 TIMES SAL
+120E4 CUNEIFORM SIGN GA2 TIMES SAR
+120E5 CUNEIFORM SIGN GA2 TIMES SHE
+120E6 CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR
+120E7 CUNEIFORM SIGN GA2 TIMES SHID
+120E8 CUNEIFORM SIGN GA2 TIMES SUM
+120E9 CUNEIFORM SIGN GA2 TIMES TAK4
+120EA CUNEIFORM SIGN GA2 TIMES U
+120EB CUNEIFORM SIGN GA2 TIMES UD
+120EC CUNEIFORM SIGN GA2 TIMES UD PLUS DU
+120ED CUNEIFORM SIGN GA2 OVER GA2
+120EE CUNEIFORM SIGN GABA
+120EF CUNEIFORM SIGN GABA CROSSING GABA
+120F0 CUNEIFORM SIGN GAD
+120F1 CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR
+120F2 CUNEIFORM SIGN GAL
+120F3 CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR
+120F4 CUNEIFORM SIGN GALAM
+120F5 CUNEIFORM SIGN GAM
+120F6 CUNEIFORM SIGN GAN
+120F7 CUNEIFORM SIGN GAN2
+120F8 CUNEIFORM SIGN GAN2 TENU
+120F9 CUNEIFORM SIGN GAN2 OVER GAN2
+120FA CUNEIFORM SIGN GAN2 CROSSING GAN2
+120FB CUNEIFORM SIGN GAR
+120FC CUNEIFORM SIGN GAR3
+120FD CUNEIFORM SIGN GASHAN
+120FE CUNEIFORM SIGN GESHTIN
+120FF CUNEIFORM SIGN GESHTIN TIMES KUR
+12100 CUNEIFORM SIGN GI
+12101 CUNEIFORM SIGN GI TIMES E
+12102 CUNEIFORM SIGN GI TIMES U
+12103 CUNEIFORM SIGN GI CROSSING GI
+12104 CUNEIFORM SIGN GI4
+12105 CUNEIFORM SIGN GI4 OVER GI4
+12106 CUNEIFORM SIGN GI4 CROSSING GI4
+12107 CUNEIFORM SIGN GIDIM
+12108 CUNEIFORM SIGN GIR2
+12109 CUNEIFORM SIGN GIR2 GUNU
+1210A CUNEIFORM SIGN GIR3
+1210B CUNEIFORM SIGN GIR3 TIMES A PLUS IGI
+1210C CUNEIFORM SIGN GIR3 TIMES GAN2 TENU
+1210D CUNEIFORM SIGN GIR3 TIMES IGI
+1210E CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI
+1210F CUNEIFORM SIGN GIR3 TIMES PA
+12110 CUNEIFORM SIGN GISAL
+12111 CUNEIFORM SIGN GISH
+12112 CUNEIFORM SIGN GISH CROSSING GISH
+12113 CUNEIFORM SIGN GISH TIMES BAD
+12114 CUNEIFORM SIGN GISH TIMES TAK4
+12115 CUNEIFORM SIGN GISH TENU
+12116 CUNEIFORM SIGN GU
+12117 CUNEIFORM SIGN GU CROSSING GU
+12118 CUNEIFORM SIGN GU2
+12119 CUNEIFORM SIGN GU2 TIMES KAK
+1211A CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU
+1211B CUNEIFORM SIGN GU2 TIMES NUN
+1211C CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2
+1211D CUNEIFORM SIGN GU2 GUNU
+1211E CUNEIFORM SIGN GUD
+1211F CUNEIFORM SIGN GUD TIMES A PLUS KUR
+12120 CUNEIFORM SIGN GUD TIMES KUR
+12121 CUNEIFORM SIGN GUD OVER GUD LUGAL
+12122 CUNEIFORM SIGN GUL
+12123 CUNEIFORM SIGN GUM
+12124 CUNEIFORM SIGN GUM TIMES SHE
+12125 CUNEIFORM SIGN GUR
+12126 CUNEIFORM SIGN GUR7
+12127 CUNEIFORM SIGN GURUN
+12128 CUNEIFORM SIGN GURUSH
+12129 CUNEIFORM SIGN HA
+1212A CUNEIFORM SIGN HA TENU
+1212B CUNEIFORM SIGN HA GUNU
+1212C CUNEIFORM SIGN HAL
+1212D CUNEIFORM SIGN HI
+1212E CUNEIFORM SIGN HI TIMES ASH
+1212F CUNEIFORM SIGN HI TIMES ASH2
+12130 CUNEIFORM SIGN HI TIMES BAD
+12131 CUNEIFORM SIGN HI TIMES DISH
+12132 CUNEIFORM SIGN HI TIMES GAD
+12133 CUNEIFORM SIGN HI TIMES KIN
+12134 CUNEIFORM SIGN HI TIMES NUN
+12135 CUNEIFORM SIGN HI TIMES SHE
+12136 CUNEIFORM SIGN HI TIMES U
+12137 CUNEIFORM SIGN HU
+12138 CUNEIFORM SIGN HUB2
+12139 CUNEIFORM SIGN HUB2 TIMES AN
+1213A CUNEIFORM SIGN HUB2 TIMES HAL
+1213B CUNEIFORM SIGN HUB2 TIMES KASKAL
+1213C CUNEIFORM SIGN HUB2 TIMES LISH
+1213D CUNEIFORM SIGN HUB2 TIMES UD
+1213E CUNEIFORM SIGN HUL2
+1213F CUNEIFORM SIGN I
+12140 CUNEIFORM SIGN I A
+12141 CUNEIFORM SIGN IB
+12142 CUNEIFORM SIGN IDIM
+12143 CUNEIFORM SIGN IDIM OVER IDIM BUR
+12144 CUNEIFORM SIGN IDIM OVER IDIM SQUARED
+12145 CUNEIFORM SIGN IG
+12146 CUNEIFORM SIGN IGI
+12147 CUNEIFORM SIGN IGI DIB
+12148 CUNEIFORM SIGN IGI RI
+12149 CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD
+1214A CUNEIFORM SIGN IGI GUNU
+1214B CUNEIFORM SIGN IL
+1214C CUNEIFORM SIGN IL TIMES GAN2 TENU
+1214D CUNEIFORM SIGN IL2
+1214E CUNEIFORM SIGN IM
+1214F CUNEIFORM SIGN IM TIMES TAK4
+12150 CUNEIFORM SIGN IM CROSSING IM
+12151 CUNEIFORM SIGN IM OPPOSING IM
+12152 CUNEIFORM SIGN IM SQUARED
+12153 CUNEIFORM SIGN IMIN
+12154 CUNEIFORM SIGN IN
+12155 CUNEIFORM SIGN IR
+12156 CUNEIFORM SIGN ISH
+12157 CUNEIFORM SIGN KA
+12158 CUNEIFORM SIGN KA TIMES A
+12159 CUNEIFORM SIGN KA TIMES AD
+1215A CUNEIFORM SIGN KA TIMES AD PLUS KU3
+1215B CUNEIFORM SIGN KA TIMES ASH2
+1215C CUNEIFORM SIGN KA TIMES BAD
+1215D CUNEIFORM SIGN KA TIMES BALAG
+1215E CUNEIFORM SIGN KA TIMES BAR
+1215F CUNEIFORM SIGN KA TIMES BI
+12160 CUNEIFORM SIGN KA TIMES ERIN2
+12161 CUNEIFORM SIGN KA TIMES ESH2
+12162 CUNEIFORM SIGN KA TIMES GA
+12163 CUNEIFORM SIGN KA TIMES GAL
+12164 CUNEIFORM SIGN KA TIMES GAN2 TENU
+12165 CUNEIFORM SIGN KA TIMES GAR
+12166 CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A
+12167 CUNEIFORM SIGN KA TIMES GI
+12168 CUNEIFORM SIGN KA TIMES GIR2
+12169 CUNEIFORM SIGN KA TIMES GISH PLUS SAR
+1216A CUNEIFORM SIGN KA TIMES GISH CROSSING GISH
+1216B CUNEIFORM SIGN KA TIMES GU
+1216C CUNEIFORM SIGN KA TIMES GUR7
+1216D CUNEIFORM SIGN KA TIMES IGI
+1216E CUNEIFORM SIGN KA TIMES IM
+1216F CUNEIFORM SIGN KA TIMES KAK
+12170 CUNEIFORM SIGN KA TIMES KI
+12171 CUNEIFORM SIGN KA TIMES KID
+12172 CUNEIFORM SIGN KA TIMES LI
+12173 CUNEIFORM SIGN KA TIMES LU
+12174 CUNEIFORM SIGN KA TIMES ME
+12175 CUNEIFORM SIGN KA TIMES ME PLUS DU
+12176 CUNEIFORM SIGN KA TIMES ME PLUS GI
+12177 CUNEIFORM SIGN KA TIMES ME PLUS TE
+12178 CUNEIFORM SIGN KA TIMES MI
+12179 CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ
+1217A CUNEIFORM SIGN KA TIMES NE
+1217B CUNEIFORM SIGN KA TIMES NUN
+1217C CUNEIFORM SIGN KA TIMES PI
+1217D CUNEIFORM SIGN KA TIMES RU
+1217E CUNEIFORM SIGN KA TIMES SA
+1217F CUNEIFORM SIGN KA TIMES SAR
+12180 CUNEIFORM SIGN KA TIMES SHA
+12181 CUNEIFORM SIGN KA TIMES SHE
+12182 CUNEIFORM SIGN KA TIMES SHID
+12183 CUNEIFORM SIGN KA TIMES SHU
+12184 CUNEIFORM SIGN KA TIMES SIG
+12185 CUNEIFORM SIGN KA TIMES SUHUR
+12186 CUNEIFORM SIGN KA TIMES TAR
+12187 CUNEIFORM SIGN KA TIMES U
+12188 CUNEIFORM SIGN KA TIMES U2
+12189 CUNEIFORM SIGN KA TIMES UD
+1218A CUNEIFORM SIGN KA TIMES UMUM TIMES PA
+1218B CUNEIFORM SIGN KA TIMES USH
+1218C CUNEIFORM SIGN KA TIMES ZI
+1218D CUNEIFORM SIGN KA2
+1218E CUNEIFORM SIGN KA2 CROSSING KA2
+1218F CUNEIFORM SIGN KAB
+12190 CUNEIFORM SIGN KAD2
+12191 CUNEIFORM SIGN KAD3
+12192 CUNEIFORM SIGN KAD4
+12193 CUNEIFORM SIGN KAD5
+12194 CUNEIFORM SIGN KAD5 OVER KAD5
+12195 CUNEIFORM SIGN KAK
+12196 CUNEIFORM SIGN KAK TIMES IGI GUNU
+12197 CUNEIFORM SIGN KAL
+12198 CUNEIFORM SIGN KAL TIMES BAD
+12199 CUNEIFORM SIGN KAL CROSSING KAL
+1219A CUNEIFORM SIGN KAM2
+1219B CUNEIFORM SIGN KAM4
+1219C CUNEIFORM SIGN KASKAL
+1219D CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219E CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219F CUNEIFORM SIGN KESH2
+121A0 CUNEIFORM SIGN KI
+121A1 CUNEIFORM SIGN KI TIMES BAD
+121A2 CUNEIFORM SIGN KI TIMES U
+121A3 CUNEIFORM SIGN KI TIMES UD
+121A4 CUNEIFORM SIGN KID
+121A5 CUNEIFORM SIGN KIN
+121A6 CUNEIFORM SIGN KISAL
+121A7 CUNEIFORM SIGN KISH
+121A8 CUNEIFORM SIGN KISIM5
+121A9 CUNEIFORM SIGN KISIM5 OVER KISIM5
+121AA CUNEIFORM SIGN KU
+121AB CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2
+121AC CUNEIFORM SIGN KU3
+121AD CUNEIFORM SIGN KU4
+121AE CUNEIFORM SIGN KU4 VARIANT FORM
+121AF CUNEIFORM SIGN KU7
+121B0 CUNEIFORM SIGN KUL
+121B1 CUNEIFORM SIGN KUL GUNU
+121B2 CUNEIFORM SIGN KUN
+121B3 CUNEIFORM SIGN KUR
+121B4 CUNEIFORM SIGN KUR OPPOSING KUR
+121B5 CUNEIFORM SIGN KUSHU2
+121B6 CUNEIFORM SIGN KWU318
+121B7 CUNEIFORM SIGN LA
+121B8 CUNEIFORM SIGN LAGAB
+121B9 CUNEIFORM SIGN LAGAB TIMES A
+121BA CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA
+121BB CUNEIFORM SIGN LAGAB TIMES A PLUS GAR
+121BC CUNEIFORM SIGN LAGAB TIMES A PLUS LAL
+121BD CUNEIFORM SIGN LAGAB TIMES AL
+121BE CUNEIFORM SIGN LAGAB TIMES AN
+121BF CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU
+121C0 CUNEIFORM SIGN LAGAB TIMES BAD
+121C1 CUNEIFORM SIGN LAGAB TIMES BI
+121C2 CUNEIFORM SIGN LAGAB TIMES DAR
+121C3 CUNEIFORM SIGN LAGAB TIMES EN
+121C4 CUNEIFORM SIGN LAGAB TIMES GA
+121C5 CUNEIFORM SIGN LAGAB TIMES GAR
+121C6 CUNEIFORM SIGN LAGAB TIMES GUD
+121C7 CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD
+121C8 CUNEIFORM SIGN LAGAB TIMES HA
+121C9 CUNEIFORM SIGN LAGAB TIMES HAL
+121CA CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN
+121CB CUNEIFORM SIGN LAGAB TIMES IGI GUNU
+121CC CUNEIFORM SIGN LAGAB TIMES IM
+121CD CUNEIFORM SIGN LAGAB TIMES IM PLUS HA
+121CE CUNEIFORM SIGN LAGAB TIMES IM PLUS LU
+121CF CUNEIFORM SIGN LAGAB TIMES KI
+121D0 CUNEIFORM SIGN LAGAB TIMES KIN
+121D1 CUNEIFORM SIGN LAGAB TIMES KU3
+121D2 CUNEIFORM SIGN LAGAB TIMES KUL
+121D3 CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A
+121D4 CUNEIFORM SIGN LAGAB TIMES LAGAB
+121D5 CUNEIFORM SIGN LAGAB TIMES LISH
+121D6 CUNEIFORM SIGN LAGAB TIMES LU
+121D7 CUNEIFORM SIGN LAGAB TIMES LUL
+121D8 CUNEIFORM SIGN LAGAB TIMES ME
+121D9 CUNEIFORM SIGN LAGAB TIMES ME PLUS EN
+121DA CUNEIFORM SIGN LAGAB TIMES MUSH
+121DB CUNEIFORM SIGN LAGAB TIMES NE
+121DC CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM
+121DD CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2
+121DE CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU
+121DF CUNEIFORM SIGN LAGAB TIMES SHU2
+121E0 CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2
+121E1 CUNEIFORM SIGN LAGAB TIMES SUM
+121E2 CUNEIFORM SIGN LAGAB TIMES TAG
+121E3 CUNEIFORM SIGN LAGAB TIMES TAK4
+121E4 CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA
+121E5 CUNEIFORM SIGN LAGAB TIMES U
+121E6 CUNEIFORM SIGN LAGAB TIMES U PLUS A
+121E7 CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U
+121E8 CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH
+121E9 CUNEIFORM SIGN LAGAB TIMES UD
+121EA CUNEIFORM SIGN LAGAB TIMES USH
+121EB CUNEIFORM SIGN LAGAB SQUARED
+121EC CUNEIFORM SIGN LAGAR
+121ED CUNEIFORM SIGN LAGAR TIMES SHE
+121EE CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM
+121EF CUNEIFORM SIGN LAGAR GUNU
+121F0 CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE
+121F1 CUNEIFORM SIGN LAHSHU
+121F2 CUNEIFORM SIGN LAL
+121F3 CUNEIFORM SIGN LAL TIMES LAL
+121F4 CUNEIFORM SIGN LAM
+121F5 CUNEIFORM SIGN LAM TIMES KUR
+121F6 CUNEIFORM SIGN LAM TIMES KUR PLUS RU
+121F7 CUNEIFORM SIGN LI
+121F8 CUNEIFORM SIGN LIL
+121F9 CUNEIFORM SIGN LIMMU2
+121FA CUNEIFORM SIGN LISH
+121FB CUNEIFORM SIGN LU
+121FC CUNEIFORM SIGN LU TIMES BAD
+121FD CUNEIFORM SIGN LU2
+121FE CUNEIFORM SIGN LU2 TIMES AL
+121FF CUNEIFORM SIGN LU2 TIMES BAD
+12200 CUNEIFORM SIGN LU2 TIMES ESH2
+12201 CUNEIFORM SIGN LU2 TIMES ESH2 TENU
+12202 CUNEIFORM SIGN LU2 TIMES GAN2 TENU
+12203 CUNEIFORM SIGN LU2 TIMES HI TIMES BAD
+12204 CUNEIFORM SIGN LU2 TIMES IM
+12205 CUNEIFORM SIGN LU2 TIMES KAD2
+12206 CUNEIFORM SIGN LU2 TIMES KAD3
+12207 CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH
+12208 CUNEIFORM SIGN LU2 TIMES KI
+12209 CUNEIFORM SIGN LU2 TIMES LA PLUS ASH
+1220A CUNEIFORM SIGN LU2 TIMES LAGAB
+1220B CUNEIFORM SIGN LU2 TIMES ME PLUS EN
+1220C CUNEIFORM SIGN LU2 TIMES NE
+1220D CUNEIFORM SIGN LU2 TIMES NU
+1220E CUNEIFORM SIGN LU2 TIMES SI PLUS ASH
+1220F CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU
+12210 CUNEIFORM SIGN LU2 TIMES TUG2
+12211 CUNEIFORM SIGN LU2 TENU
+12212 CUNEIFORM SIGN LU2 CROSSING LU2
+12213 CUNEIFORM SIGN LU2 OPPOSING LU2
+12214 CUNEIFORM SIGN LU2 SQUARED
+12215 CUNEIFORM SIGN LU2 SHESHIG
+12216 CUNEIFORM SIGN LU3
+12217 CUNEIFORM SIGN LUGAL
+12218 CUNEIFORM SIGN LUGAL OVER LUGAL
+12219 CUNEIFORM SIGN LUGAL OPPOSING LUGAL
+1221A CUNEIFORM SIGN LUGAL SHESHIG
+1221B CUNEIFORM SIGN LUH
+1221C CUNEIFORM SIGN LUL
+1221D CUNEIFORM SIGN LUM
+1221E CUNEIFORM SIGN LUM OVER LUM
+1221F CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR
+12220 CUNEIFORM SIGN MA
+12221 CUNEIFORM SIGN MA TIMES TAK4
+12222 CUNEIFORM SIGN MA GUNU
+12223 CUNEIFORM SIGN MA2
+12224 CUNEIFORM SIGN MAH
+12225 CUNEIFORM SIGN MAR
+12226 CUNEIFORM SIGN MASH
+12227 CUNEIFORM SIGN MASH2
+12228 CUNEIFORM SIGN ME
+12229 CUNEIFORM SIGN MES
+1222A CUNEIFORM SIGN MI
+1222B CUNEIFORM SIGN MIN
+1222C CUNEIFORM SIGN MU
+1222D CUNEIFORM SIGN MU OVER MU
+1222E CUNEIFORM SIGN MUG
+1222F CUNEIFORM SIGN MUG GUNU
+12230 CUNEIFORM SIGN MUNSUB
+12231 CUNEIFORM SIGN MURGU2
+12232 CUNEIFORM SIGN MUSH
+12233 CUNEIFORM SIGN MUSH TIMES A
+12234 CUNEIFORM SIGN MUSH TIMES KUR
+12235 CUNEIFORM SIGN MUSH TIMES ZA
+12236 CUNEIFORM SIGN MUSH OVER MUSH
+12237 CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA
+12238 CUNEIFORM SIGN MUSH CROSSING MUSH
+12239 CUNEIFORM SIGN MUSH3
+1223A CUNEIFORM SIGN MUSH3 TIMES A
+1223B CUNEIFORM SIGN MUSH3 TIMES A PLUS DI
+1223C CUNEIFORM SIGN MUSH3 TIMES DI
+1223D CUNEIFORM SIGN MUSH3 GUNU
+1223E CUNEIFORM SIGN NA
+1223F CUNEIFORM SIGN NA2
+12240 CUNEIFORM SIGN NAGA
+12241 CUNEIFORM SIGN NAGA INVERTED
+12242 CUNEIFORM SIGN NAGA TIMES SHU TENU
+12243 CUNEIFORM SIGN NAGA OPPOSING NAGA
+12244 CUNEIFORM SIGN NAGAR
+12245 CUNEIFORM SIGN NAM NUTILLU
+12246 CUNEIFORM SIGN NAM
+12247 CUNEIFORM SIGN NAM2
+12248 CUNEIFORM SIGN NE
+12249 CUNEIFORM SIGN NE TIMES A
+1224A CUNEIFORM SIGN NE TIMES UD
+1224B CUNEIFORM SIGN NE SHESHIG
+1224C CUNEIFORM SIGN NI
+1224D CUNEIFORM SIGN NI TIMES E
+1224E CUNEIFORM SIGN NI2
+1224F CUNEIFORM SIGN NIM
+12250 CUNEIFORM SIGN NIM TIMES GAN2 TENU
+12251 CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU
+12252 CUNEIFORM SIGN NINDA2
+12253 CUNEIFORM SIGN NINDA2 TIMES AN
+12254 CUNEIFORM SIGN NINDA2 TIMES ASH
+12255 CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH
+12256 CUNEIFORM SIGN NINDA2 TIMES GUD
+12257 CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU
+12258 CUNEIFORM SIGN NINDA2 TIMES NE
+12259 CUNEIFORM SIGN NINDA2 TIMES NUN
+1225A CUNEIFORM SIGN NINDA2 TIMES SHE
+1225B CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN
+1225C CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH
+1225D CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH
+1225E CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH
+1225F CUNEIFORM SIGN NINDA2 TIMES USH
+12260 CUNEIFORM SIGN NISAG
+12261 CUNEIFORM SIGN NU
+12262 CUNEIFORM SIGN NU11
+12263 CUNEIFORM SIGN NUN
+12264 CUNEIFORM SIGN NUN LAGAR TIMES GAR
+12265 CUNEIFORM SIGN NUN LAGAR TIMES MASH
+12266 CUNEIFORM SIGN NUN LAGAR TIMES SAL
+12267 CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL
+12268 CUNEIFORM SIGN NUN LAGAR TIMES USH
+12269 CUNEIFORM SIGN NUN TENU
+1226A CUNEIFORM SIGN NUN OVER NUN
+1226B CUNEIFORM SIGN NUN CROSSING NUN
+1226C CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR
+1226D CUNEIFORM SIGN NUNUZ
+1226E CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB
+1226F CUNEIFORM SIGN NUNUZ AB2 TIMES BI
+12270 CUNEIFORM SIGN NUNUZ AB2 TIMES DUG
+12271 CUNEIFORM SIGN NUNUZ AB2 TIMES GUD
+12272 CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU
+12273 CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3
+12274 CUNEIFORM SIGN NUNUZ AB2 TIMES LA
+12275 CUNEIFORM SIGN NUNUZ AB2 TIMES NE
+12276 CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3
+12277 CUNEIFORM SIGN NUNUZ AB2 TIMES U2
+12278 CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI
+12279 CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U
+1227A CUNEIFORM SIGN PA
+1227B CUNEIFORM SIGN PAD
+1227C CUNEIFORM SIGN PAN
+1227D CUNEIFORM SIGN PAP
+1227E CUNEIFORM SIGN PESH2
+1227F CUNEIFORM SIGN PI
+12280 CUNEIFORM SIGN PI TIMES A
+12281 CUNEIFORM SIGN PI TIMES AB
+12282 CUNEIFORM SIGN PI TIMES BI
+12283 CUNEIFORM SIGN PI TIMES BU
+12284 CUNEIFORM SIGN PI TIMES E
+12285 CUNEIFORM SIGN PI TIMES I
+12286 CUNEIFORM SIGN PI TIMES IB
+12287 CUNEIFORM SIGN PI TIMES U
+12288 CUNEIFORM SIGN PI TIMES U2
+12289 CUNEIFORM SIGN PI CROSSING PI
+1228A CUNEIFORM SIGN PIRIG
+1228B CUNEIFORM SIGN PIRIG TIMES KAL
+1228C CUNEIFORM SIGN PIRIG TIMES UD
+1228D CUNEIFORM SIGN PIRIG TIMES ZA
+1228E CUNEIFORM SIGN PIRIG OPPOSING PIRIG
+1228F CUNEIFORM SIGN RA
+12290 CUNEIFORM SIGN RAB
+12291 CUNEIFORM SIGN RI
+12292 CUNEIFORM SIGN RU
+12293 CUNEIFORM SIGN SA
+12294 CUNEIFORM SIGN SAG NUTILLU
+12295 CUNEIFORM SIGN SAG
+12296 CUNEIFORM SIGN SAG TIMES A
+12297 CUNEIFORM SIGN SAG TIMES DU
+12298 CUNEIFORM SIGN SAG TIMES DUB
+12299 CUNEIFORM SIGN SAG TIMES HA
+1229A CUNEIFORM SIGN SAG TIMES KAK
+1229B CUNEIFORM SIGN SAG TIMES KUR
+1229C CUNEIFORM SIGN SAG TIMES LUM
+1229D CUNEIFORM SIGN SAG TIMES MI
+1229E CUNEIFORM SIGN SAG TIMES NUN
+1229F CUNEIFORM SIGN SAG TIMES SAL
+122A0 CUNEIFORM SIGN SAG TIMES SHID
+122A1 CUNEIFORM SIGN SAG TIMES TAB
+122A2 CUNEIFORM SIGN SAG TIMES U2
+122A3 CUNEIFORM SIGN SAG TIMES UB
+122A4 CUNEIFORM SIGN SAG TIMES UM
+122A5 CUNEIFORM SIGN SAG TIMES UR
+122A6 CUNEIFORM SIGN SAG TIMES USH
+122A7 CUNEIFORM SIGN SAG OVER SAG
+122A8 CUNEIFORM SIGN SAG GUNU
+122A9 CUNEIFORM SIGN SAL
+122AA CUNEIFORM SIGN SAL LAGAB TIMES ASH2
+122AB CUNEIFORM SIGN SANGA2
+122AC CUNEIFORM SIGN SAR
+122AD CUNEIFORM SIGN SHA
+122AE CUNEIFORM SIGN SHA3
+122AF CUNEIFORM SIGN SHA3 TIMES A
+122B0 CUNEIFORM SIGN SHA3 TIMES BAD
+122B1 CUNEIFORM SIGN SHA3 TIMES GISH
+122B2 CUNEIFORM SIGN SHA3 TIMES NE
+122B3 CUNEIFORM SIGN SHA3 TIMES SHU2
+122B4 CUNEIFORM SIGN SHA3 TIMES TUR
+122B5 CUNEIFORM SIGN SHA3 TIMES U
+122B6 CUNEIFORM SIGN SHA3 TIMES U PLUS A
+122B7 CUNEIFORM SIGN SHA6
+122B8 CUNEIFORM SIGN SHAB6
+122B9 CUNEIFORM SIGN SHAR2
+ * formed by making a circular indentation with the end of the stylus
+122BA CUNEIFORM SIGN SHE
+122BB CUNEIFORM SIGN SHE HU
+122BC CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR
+122BD CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR
+122BE CUNEIFORM SIGN SHEG9
+122BF CUNEIFORM SIGN SHEN
+122C0 CUNEIFORM SIGN SHESH
+122C1 CUNEIFORM SIGN SHESH2
+122C2 CUNEIFORM SIGN SHESHLAM
+122C3 CUNEIFORM SIGN SHID
+122C4 CUNEIFORM SIGN SHID TIMES A
+122C5 CUNEIFORM SIGN SHID TIMES IM
+122C6 CUNEIFORM SIGN SHIM
+122C7 CUNEIFORM SIGN SHIM TIMES A
+122C8 CUNEIFORM SIGN SHIM TIMES BAL
+122C9 CUNEIFORM SIGN SHIM TIMES BULUG
+122CA CUNEIFORM SIGN SHIM TIMES DIN
+122CB CUNEIFORM SIGN SHIM TIMES GAR
+122CC CUNEIFORM SIGN SHIM TIMES IGI
+122CD CUNEIFORM SIGN SHIM TIMES IGI GUNU
+122CE CUNEIFORM SIGN SHIM TIMES KUSHU2
+122CF CUNEIFORM SIGN SHIM TIMES LUL
+122D0 CUNEIFORM SIGN SHIM TIMES MUG
+122D1 CUNEIFORM SIGN SHIM TIMES SAL
+122D2 CUNEIFORM SIGN SHINIG
+122D3 CUNEIFORM SIGN SHIR
+122D4 CUNEIFORM SIGN SHIR TENU
+122D5 CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR
+122D6 CUNEIFORM SIGN SHITA
+122D7 CUNEIFORM SIGN SHU
+122D8 CUNEIFORM SIGN SHU OVER INVERTED SHU
+122D9 CUNEIFORM SIGN SHU2
+122DA CUNEIFORM SIGN SHUBUR
+122DB CUNEIFORM SIGN SI
+122DC CUNEIFORM SIGN SI GUNU
+122DD CUNEIFORM SIGN SIG
+122DE CUNEIFORM SIGN SIG4
+122DF CUNEIFORM SIGN SIG4 OVER SIG4 SHU2
+122E0 CUNEIFORM SIGN SIK2
+122E1 CUNEIFORM SIGN SILA3
+122E2 CUNEIFORM SIGN SU
+122E3 CUNEIFORM SIGN SU OVER SU
+122E4 CUNEIFORM SIGN SUD
+122E5 CUNEIFORM SIGN SUD2
+122E6 CUNEIFORM SIGN SUHUR
+122E7 CUNEIFORM SIGN SUM
+122E8 CUNEIFORM SIGN SUMASH
+122E9 CUNEIFORM SIGN SUR
+122EA CUNEIFORM SIGN SUR9
+122EB CUNEIFORM SIGN TA
+122EC CUNEIFORM SIGN TA ASTERISK
+122ED CUNEIFORM SIGN TA TIMES HI
+122EE CUNEIFORM SIGN TA TIMES MI
+122EF CUNEIFORM SIGN TA GUNU
+122F0 CUNEIFORM SIGN TAB
+122F1 CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH
+122F2 CUNEIFORM SIGN TAB SQUARED
+122F3 CUNEIFORM SIGN TAG
+122F4 CUNEIFORM SIGN TAG TIMES BI
+122F5 CUNEIFORM SIGN TAG TIMES GUD
+122F6 CUNEIFORM SIGN TAG TIMES SHE
+122F7 CUNEIFORM SIGN TAG TIMES SHU
+122F8 CUNEIFORM SIGN TAG TIMES TUG2
+122F9 CUNEIFORM SIGN TAG TIMES UD
+122FA CUNEIFORM SIGN TAK4
+122FB CUNEIFORM SIGN TAR
+122FC CUNEIFORM SIGN TE
+122FD CUNEIFORM SIGN TE GUNU
+122FE CUNEIFORM SIGN TI
+122FF CUNEIFORM SIGN TI TENU
+12300 CUNEIFORM SIGN TIL
+12301 CUNEIFORM SIGN TIR
+12302 CUNEIFORM SIGN TIR TIMES TAK4
+12303 CUNEIFORM SIGN TIR OVER TIR
+12304 CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR
+12305 CUNEIFORM SIGN TU
+12306 CUNEIFORM SIGN TUG2
+12307 CUNEIFORM SIGN TUK
+12308 CUNEIFORM SIGN TUM
+12309 CUNEIFORM SIGN TUR
+1230A CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA
+1230B CUNEIFORM SIGN U
+1230C CUNEIFORM SIGN U GUD
+1230D CUNEIFORM SIGN U U U
+1230E CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR
+1230F CUNEIFORM SIGN U OVER U SUR OVER SUR
+12310 CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED
+12311 CUNEIFORM SIGN U2
+12312 CUNEIFORM SIGN UB
+12313 CUNEIFORM SIGN UD
+12314 CUNEIFORM SIGN UD KUSHU2
+12315 CUNEIFORM SIGN UD TIMES BAD
+12316 CUNEIFORM SIGN UD TIMES MI
+12317 CUNEIFORM SIGN UD TIMES U PLUS U PLUS U
+12318 CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU
+12319 CUNEIFORM SIGN UD GUNU
+1231A CUNEIFORM SIGN UD SHESHIG
+1231B CUNEIFORM SIGN UD SHESHIG TIMES BAD
+1231C CUNEIFORM SIGN UDUG
+1231D CUNEIFORM SIGN UM
+1231E CUNEIFORM SIGN UM TIMES LAGAB
+1231F CUNEIFORM SIGN UM TIMES ME PLUS DA
+12320 CUNEIFORM SIGN UM TIMES SHA3
+12321 CUNEIFORM SIGN UM TIMES U
+12322 CUNEIFORM SIGN UMBIN
+12323 CUNEIFORM SIGN UMUM
+12324 CUNEIFORM SIGN UMUM TIMES KASKAL
+12325 CUNEIFORM SIGN UMUM TIMES PA
+12326 CUNEIFORM SIGN UN
+12327 CUNEIFORM SIGN UN GUNU
+12328 CUNEIFORM SIGN UR
+12329 CUNEIFORM SIGN UR CROSSING UR
+1232A CUNEIFORM SIGN UR SHESHIG
+1232B CUNEIFORM SIGN UR2
+1232C CUNEIFORM SIGN UR2 TIMES A PLUS HA
+1232D CUNEIFORM SIGN UR2 TIMES A PLUS NA
+1232E CUNEIFORM SIGN UR2 TIMES AL
+1232F CUNEIFORM SIGN UR2 TIMES HA
+12330 CUNEIFORM SIGN UR2 TIMES NUN
+12331 CUNEIFORM SIGN UR2 TIMES U2
+12332 CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH
+12333 CUNEIFORM SIGN UR2 TIMES U2 PLUS BI
+12334 CUNEIFORM SIGN UR4
+12335 CUNEIFORM SIGN URI
+12336 CUNEIFORM SIGN URI3
+12337 CUNEIFORM SIGN URU
+12338 CUNEIFORM SIGN URU TIMES A
+12339 CUNEIFORM SIGN URU TIMES ASHGAB
+1233A CUNEIFORM SIGN URU TIMES BAR
+1233B CUNEIFORM SIGN URU TIMES DUN
+1233C CUNEIFORM SIGN URU TIMES GA
+1233D CUNEIFORM SIGN URU TIMES GAL
+1233E CUNEIFORM SIGN URU TIMES GAN2 TENU
+1233F CUNEIFORM SIGN URU TIMES GAR
+12340 CUNEIFORM SIGN URU TIMES GU
+12341 CUNEIFORM SIGN URU TIMES HA
+12342 CUNEIFORM SIGN URU TIMES IGI
+12343 CUNEIFORM SIGN URU TIMES IM
+12344 CUNEIFORM SIGN URU TIMES ISH
+12345 CUNEIFORM SIGN URU TIMES KI
+12346 CUNEIFORM SIGN URU TIMES LUM
+12347 CUNEIFORM SIGN URU TIMES MIN
+12348 CUNEIFORM SIGN URU TIMES PA
+12349 CUNEIFORM SIGN URU TIMES SHE
+1234A CUNEIFORM SIGN URU TIMES SIG4
+1234B CUNEIFORM SIGN URU TIMES TU
+1234C CUNEIFORM SIGN URU TIMES U PLUS GUD
+1234D CUNEIFORM SIGN URU TIMES UD
+1234E CUNEIFORM SIGN URU TIMES URUDA
+1234F CUNEIFORM SIGN URUDA
+12350 CUNEIFORM SIGN URUDA TIMES U
+12351 CUNEIFORM SIGN USH
+12352 CUNEIFORM SIGN USH TIMES A
+12353 CUNEIFORM SIGN USH TIMES KU
+12354 CUNEIFORM SIGN USH TIMES KUR
+12355 CUNEIFORM SIGN USH TIMES TAK4
+12356 CUNEIFORM SIGN USHX
+12357 CUNEIFORM SIGN USH2
+12358 CUNEIFORM SIGN USHUMX
+12359 CUNEIFORM SIGN UTUKI
+1235A CUNEIFORM SIGN UZ3
+1235B CUNEIFORM SIGN UZ3 TIMES KASKAL
+1235C CUNEIFORM SIGN UZU
+1235D CUNEIFORM SIGN ZA
+1235E CUNEIFORM SIGN ZA TENU
+1235F CUNEIFORM SIGN ZA SQUARED TIMES KUR
+12360 CUNEIFORM SIGN ZAG
+12361 CUNEIFORM SIGN ZAMX
+12362 CUNEIFORM SIGN ZE2
+12363 CUNEIFORM SIGN ZI
+12364 CUNEIFORM SIGN ZI OVER ZI
+12365 CUNEIFORM SIGN ZI3
+12366 CUNEIFORM SIGN ZIB
+12367 CUNEIFORM SIGN ZIB KABA TENU
+12368 CUNEIFORM SIGN ZIG
+12369 CUNEIFORM SIGN ZIZ2
+1236A CUNEIFORM SIGN ZU
+1236B CUNEIFORM SIGN ZU5
+1236C CUNEIFORM SIGN ZU5 TIMES A
+1236D CUNEIFORM SIGN ZUBUR
+1236E CUNEIFORM SIGN ZUM
+@@ 12400 Cuneiform Numbers and Punctuation 1247F
+@ Numeric signs
+12400 CUNEIFORM NUMERIC SIGN TWO ASH
+12401 CUNEIFORM NUMERIC SIGN THREE ASH
+12402 CUNEIFORM NUMERIC SIGN FOUR ASH
+12403 CUNEIFORM NUMERIC SIGN FIVE ASH
+12404 CUNEIFORM NUMERIC SIGN SIX ASH
+12405 CUNEIFORM NUMERIC SIGN SEVEN ASH
+12406 CUNEIFORM NUMERIC SIGN EIGHT ASH
+12407 CUNEIFORM NUMERIC SIGN NINE ASH
+12408 CUNEIFORM NUMERIC SIGN THREE DISH
+12409 CUNEIFORM NUMERIC SIGN FOUR DISH
+1240A CUNEIFORM NUMERIC SIGN FIVE DISH
+1240B CUNEIFORM NUMERIC SIGN SIX DISH
+1240C CUNEIFORM NUMERIC SIGN SEVEN DISH
+1240D CUNEIFORM NUMERIC SIGN EIGHT DISH
+1240E CUNEIFORM NUMERIC SIGN NINE DISH
+1240F CUNEIFORM NUMERIC SIGN FOUR U
+12410 CUNEIFORM NUMERIC SIGN FIVE U
+12411 CUNEIFORM NUMERIC SIGN SIX U
+12412 CUNEIFORM NUMERIC SIGN SEVEN U
+12413 CUNEIFORM NUMERIC SIGN EIGHT U
+12414 CUNEIFORM NUMERIC SIGN NINE U
+12415 CUNEIFORM NUMERIC SIGN ONE GESH2
+12416 CUNEIFORM NUMERIC SIGN TWO GESH2
+12417 CUNEIFORM NUMERIC SIGN THREE GESH2
+12418 CUNEIFORM NUMERIC SIGN FOUR GESH2
+12419 CUNEIFORM NUMERIC SIGN FIVE GESH2
+1241A CUNEIFORM NUMERIC SIGN SIX GESH2
+1241B CUNEIFORM NUMERIC SIGN SEVEN GESH2
+1241C CUNEIFORM NUMERIC SIGN EIGHT GESH2
+1241D CUNEIFORM NUMERIC SIGN NINE GESH2
+1241E CUNEIFORM NUMERIC SIGN ONE GESHU
+1241F CUNEIFORM NUMERIC SIGN TWO GESHU
+12420 CUNEIFORM NUMERIC SIGN THREE GESHU
+12421 CUNEIFORM NUMERIC SIGN FOUR GESHU
+12422 CUNEIFORM NUMERIC SIGN FIVE GESHU
+12423 CUNEIFORM NUMERIC SIGN TWO SHAR2
+12424 CUNEIFORM NUMERIC SIGN THREE SHAR2
+12425 CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM
+12426 CUNEIFORM NUMERIC SIGN FOUR SHAR2
+12427 CUNEIFORM NUMERIC SIGN FIVE SHAR2
+12428 CUNEIFORM NUMERIC SIGN SIX SHAR2
+12429 CUNEIFORM NUMERIC SIGN SEVEN SHAR2
+1242A CUNEIFORM NUMERIC SIGN EIGHT SHAR2
+1242B CUNEIFORM NUMERIC SIGN NINE SHAR2
+1242C CUNEIFORM NUMERIC SIGN ONE SHARU
+1242D CUNEIFORM NUMERIC SIGN TWO SHARU
+1242E CUNEIFORM NUMERIC SIGN THREE SHARU
+1242F CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM
+12430 CUNEIFORM NUMERIC SIGN FOUR SHARU
+12431 CUNEIFORM NUMERIC SIGN FIVE SHARU
+12432 CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH
+12433 CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN
+12434 CUNEIFORM NUMERIC SIGN ONE BURU
+12435 CUNEIFORM NUMERIC SIGN TWO BURU
+12436 CUNEIFORM NUMERIC SIGN THREE BURU
+12437 CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM
+12438 CUNEIFORM NUMERIC SIGN FOUR BURU
+12439 CUNEIFORM NUMERIC SIGN FIVE BURU
+1243A CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16
+1243B CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21
+1243C CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU
+1243D CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4
+1243E CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A
+1243F CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B
+12440 CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9
+12441 CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3
+12442 CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A
+12443 CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B
+12444 CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU
+12445 CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3
+12446 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU
+12447 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3
+12448 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4
+12449 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A
+1244A CUNEIFORM NUMERIC SIGN TWO ASH TENU
+1244B CUNEIFORM NUMERIC SIGN THREE ASH TENU
+1244C CUNEIFORM NUMERIC SIGN FOUR ASH TENU
+1244D CUNEIFORM NUMERIC SIGN FIVE ASH TENU
+1244E CUNEIFORM NUMERIC SIGN SIX ASH TENU
+1244F CUNEIFORM NUMERIC SIGN ONE BAN2
+12450 CUNEIFORM NUMERIC SIGN TWO BAN2
+12451 CUNEIFORM NUMERIC SIGN THREE BAN2
+12452 CUNEIFORM NUMERIC SIGN FOUR BAN2
+12453 CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM
+12454 CUNEIFORM NUMERIC SIGN FIVE BAN2
+12455 CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM
+12456 CUNEIFORM NUMERIC SIGN NIGIDAMIN
+12457 CUNEIFORM NUMERIC SIGN NIGIDAESH
+12458 CUNEIFORM NUMERIC SIGN ONE ESHE3
+12459 CUNEIFORM NUMERIC SIGN TWO ESHE3
+@ Fractions
+1245A CUNEIFORM NUMERIC SIGN ONE THIRD DISH
+1245B CUNEIFORM NUMERIC SIGN TWO THIRDS DISH
+1245C CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH
+1245D CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A
+1245E CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A
+1245F CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH
+12460 CUNEIFORM NUMERIC SIGN ONE QUARTER ASH
+12461 CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH
+12462 CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+@ Punctuation
+12470 CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER
+ x (ugaritic word divider - 1039F)
+ x (old persian word divider - 103D0)
+12471 CUNEIFORM PUNCTUATION SIGN VERTICAL COLON
+12472 CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON
+12473 CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+@@ 1D000 Byzantine Musical Symbols 1D0FF
+@@+
+@ Prosodies (Prosodics)
+@+ These three characters are not actually attested in musical contexts.
+1D000 BYZANTINE MUSICAL SYMBOL PSILI
+1D001 BYZANTINE MUSICAL SYMBOL DASEIA
+1D002 BYZANTINE MUSICAL SYMBOL PERISPOMENI
+@ Ekfonetika
+1D003 BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON
+1D004 BYZANTINE MUSICAL SYMBOL OXEIA DIPLI
+1D005 BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON
+1D006 BYZANTINE MUSICAL SYMBOL VAREIA DIPLI
+1D007 BYZANTINE MUSICAL SYMBOL KATHISTI
+1D008 BYZANTINE MUSICAL SYMBOL SYRMATIKI
+1D009 BYZANTINE MUSICAL SYMBOL PARAKLITIKI
+1D00A BYZANTINE MUSICAL SYMBOL YPOKRISIS
+1D00B BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI
+1D00C BYZANTINE MUSICAL SYMBOL KREMASTI
+1D00D BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON
+1D00E BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON
+1D00F BYZANTINE MUSICAL SYMBOL TELEIA
+1D010 BYZANTINE MUSICAL SYMBOL KENTIMATA
+1D011 BYZANTINE MUSICAL SYMBOL APOSTROFOS
+1D012 BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI
+1D013 BYZANTINE MUSICAL SYMBOL SYNEVMA
+1D014 BYZANTINE MUSICAL SYMBOL THITA
+@ Melodimata (Melodics)
+1D015 BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION
+1D016 BYZANTINE MUSICAL SYMBOL GORGON ARCHAION
+1D017 BYZANTINE MUSICAL SYMBOL PSILON
+1D018 BYZANTINE MUSICAL SYMBOL CHAMILON
+1D019 BYZANTINE MUSICAL SYMBOL VATHY
+1D01A BYZANTINE MUSICAL SYMBOL ISON ARCHAION
+1D01B BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION
+1D01C BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION
+1D01D BYZANTINE MUSICAL SYMBOL SAXIMATA
+1D01E BYZANTINE MUSICAL SYMBOL PARICHON
+1D01F BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA
+1D020 BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION
+1D021 BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION
+1D022 BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION
+1D023 BYZANTINE MUSICAL SYMBOL APOTHEMA
+1D024 BYZANTINE MUSICAL SYMBOL KLASMA
+1D025 BYZANTINE MUSICAL SYMBOL REVMA
+1D026 BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION
+1D027 BYZANTINE MUSICAL SYMBOL TINAGMA
+1D028 BYZANTINE MUSICAL SYMBOL ANATRICHISMA
+1D029 BYZANTINE MUSICAL SYMBOL SEISMA
+1D02A BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION
+1D02B BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU
+1D02C BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION
+1D02D BYZANTINE MUSICAL SYMBOL THEMA
+1D02E BYZANTINE MUSICAL SYMBOL LEMOI
+1D02F BYZANTINE MUSICAL SYMBOL DYO
+1D030 BYZANTINE MUSICAL SYMBOL TRIA
+1D031 BYZANTINE MUSICAL SYMBOL TESSERA
+1D032 BYZANTINE MUSICAL SYMBOL KRATIMATA
+1D033 BYZANTINE MUSICAL SYMBOL APESO EXO NEO
+1D034 BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION
+1D035 BYZANTINE MUSICAL SYMBOL IMIFTHORA
+1D036 BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION
+1D037 BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON
+1D038 BYZANTINE MUSICAL SYMBOL PELASTON
+1D039 BYZANTINE MUSICAL SYMBOL PSIFISTON
+1D03A BYZANTINE MUSICAL SYMBOL KONTEVMA
+1D03B BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION
+1D03C BYZANTINE MUSICAL SYMBOL RAPISMA
+1D03D BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION
+1D03E BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION
+1D03F BYZANTINE MUSICAL SYMBOL ICHADIN
+1D040 BYZANTINE MUSICAL SYMBOL NANA
+1D041 BYZANTINE MUSICAL SYMBOL PETASMA
+1D042 BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO
+1D043 BYZANTINE MUSICAL SYMBOL TROMIKON ALLO
+1D044 BYZANTINE MUSICAL SYMBOL STRAGGISMATA
+1D045 BYZANTINE MUSICAL SYMBOL GRONTHISMATA
+@ Fonitika (Vocals)
+1D046 BYZANTINE MUSICAL SYMBOL ISON NEO
+1D047 BYZANTINE MUSICAL SYMBOL OLIGON NEO
+1D048 BYZANTINE MUSICAL SYMBOL OXEIA NEO
+1D049 BYZANTINE MUSICAL SYMBOL PETASTI
+1D04A BYZANTINE MUSICAL SYMBOL KOUFISMA
+1D04B BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA
+1D04C BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA
+1D04D BYZANTINE MUSICAL SYMBOL PELASTON NEO
+1D04E BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO
+1D04F BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO
+1D050 BYZANTINE MUSICAL SYMBOL YPSILI
+1D051 BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO
+1D052 BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO
+1D053 BYZANTINE MUSICAL SYMBOL YPORROI
+1D054 BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON
+1D055 BYZANTINE MUSICAL SYMBOL ELAFRON
+1D056 BYZANTINE MUSICAL SYMBOL CHAMILI
+@ Afona or Ypostaseis (Mutes or Hypostases)
+1D057 BYZANTINE MUSICAL SYMBOL MIKRON ISON
+1D058 BYZANTINE MUSICAL SYMBOL VAREIA NEO
+1D059 BYZANTINE MUSICAL SYMBOL PIASMA NEO
+1D05A BYZANTINE MUSICAL SYMBOL PSIFISTON NEO
+1D05B BYZANTINE MUSICAL SYMBOL OMALON
+1D05C BYZANTINE MUSICAL SYMBOL ANTIKENOMA
+1D05D BYZANTINE MUSICAL SYMBOL LYGISMA
+1D05E BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO
+1D05F BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO
+1D060 BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA
+1D061 BYZANTINE MUSICAL SYMBOL KYLISMA
+1D062 BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA
+1D063 BYZANTINE MUSICAL SYMBOL TROMIKON NEO
+1D064 BYZANTINE MUSICAL SYMBOL EKSTREPTON
+1D065 BYZANTINE MUSICAL SYMBOL SYNAGMA NEO
+1D066 BYZANTINE MUSICAL SYMBOL SYRMA
+1D067 BYZANTINE MUSICAL SYMBOL CHOREVMA NEO
+1D068 BYZANTINE MUSICAL SYMBOL EPEGERMA
+1D069 BYZANTINE MUSICAL SYMBOL SEISMA NEO
+1D06A BYZANTINE MUSICAL SYMBOL XIRON KLASMA
+1D06B BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON
+1D06C BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA
+1D06D BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA
+1D06E BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA
+1D06F BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA
+1D070 BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA
+1D071 BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA
+1D072 BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON
+1D073 BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON
+1D074 BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON
+1D075 BYZANTINE MUSICAL SYMBOL OYRANISMA NEO
+1D076 BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO
+1D077 BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO
+1D078 BYZANTINE MUSICAL SYMBOL THEMA APLOUN
+1D079 BYZANTINE MUSICAL SYMBOL THES KAI APOTHES
+1D07A BYZANTINE MUSICAL SYMBOL KATAVASMA
+1D07B BYZANTINE MUSICAL SYMBOL ENDOFONON
+1D07C BYZANTINE MUSICAL SYMBOL YFEN KATO
+1D07D BYZANTINE MUSICAL SYMBOL YFEN ANO
+1D07E BYZANTINE MUSICAL SYMBOL STAVROS
+@ Argies (Retards)
+1D07F BYZANTINE MUSICAL SYMBOL KLASMA ANO
+1D080 BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION
+1D081 BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION
+1D082 BYZANTINE MUSICAL SYMBOL KRATIMA ALLO
+1D083 BYZANTINE MUSICAL SYMBOL KRATIMA NEO
+1D084 BYZANTINE MUSICAL SYMBOL APODERMA NEO
+1D085 BYZANTINE MUSICAL SYMBOL APLI
+1D086 BYZANTINE MUSICAL SYMBOL DIPLI
+1D087 BYZANTINE MUSICAL SYMBOL TRIPLI
+1D088 BYZANTINE MUSICAL SYMBOL TETRAPLI
+1D089 BYZANTINE MUSICAL SYMBOL KORONIS
+@ Leimmata or Siopes (Leimmas or Silencers)
+1D08A BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU
+1D08B BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON
+1D08C BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON
+1D08D BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON
+1D08E BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU
+@ Synagmata or Gorgotites (Synagmas or Quickeners)
+1D08F BYZANTINE MUSICAL SYMBOL GORGON NEO ANO
+1D090 BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA
+1D091 BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA
+1D092 BYZANTINE MUSICAL SYMBOL DIGORGON
+1D093 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO
+1D094 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO
+1D095 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA
+1D096 BYZANTINE MUSICAL SYMBOL TRIGORGON
+1D097 BYZANTINE MUSICAL SYMBOL ARGON
+1D098 BYZANTINE MUSICAL SYMBOL IMIDIARGON
+ * called diargon by some authorities
+1D099 BYZANTINE MUSICAL SYMBOL DIARGON
+ * called triargon by some authorities
+@ Agogika (Conduits)
+@+ Glyphs shown for conduits reflect Greek practice, with chi as the base letter; different national traditions use glyphs with different base letters.
+1D09A BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI
+1D09B BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI
+1D09C BYZANTINE MUSICAL SYMBOL AGOGI ARGI
+1D09D BYZANTINE MUSICAL SYMBOL AGOGI METRIA
+1D09E BYZANTINE MUSICAL SYMBOL AGOGI MESI
+1D09F BYZANTINE MUSICAL SYMBOL AGOGI GORGI
+1D0A0 BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI
+1D0A1 BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI
+@ Ichimata and Martyrika (Ichimas and Evidentials)
+1D0A2 BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS
+1D0A3 BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS
+1D0A4 BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS
+1D0A5 BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS
+1D0A6 BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS
+1D0A7 BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS
+1D0A8 BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS
+1D0A9 BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS
+1D0AB BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS
+1D0AC BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS
+1D0AD BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS
+1D0AE BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS
+1D0AF BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS
+1D0B0 BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS
+1D0B1 BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS
+1D0B2 BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS
+1D0B3 BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4 BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN
+ * used in intonation formulas instead of nu, before phonemes a, i, o, u
+ x (greek small letter nu - 03BD)
+1D0B5 BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN
+ * used in intonation formulas instead of nu, before phoneme e
+ x (greek small letter nu - 03BD)
+@ Fthores (Destroyers)
+1D0B6 BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU
+1D0B7 BYZANTINE MUSICAL SYMBOL IMIFONON
+1D0B8 BYZANTINE MUSICAL SYMBOL IMIFTHORON
+1D0B9 BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU
+1D0BA BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA
+1D0BB BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA
+1D0BC BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS
+1D0BD BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI
+1D0BE BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI
+1D0BF BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE
+1D0C0 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO
+1D0C1 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO
+1D0C2 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO
+1D0C3 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
+1D0C4 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
+1D0C5 BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+ % BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS
+ * misspelling of "FTHORA" in character name is a known defect
+1D0C6 BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
+1D0C7 BYZANTINE MUSICAL SYMBOL FTHORA NENANO
+1D0C8 BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
+1D0C9 BYZANTINE MUSICAL SYMBOL CHROA KLITON
+1D0CA BYZANTINE MUSICAL SYMBOL CHROA SPATHI
+@ Alloioseis (Differentiators)
+1D0CB BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION
+1D0CC BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA
+1D0CD BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION
+1D0CE BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION
+1D0CF BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION
+1D0D0 BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA
+1D0D1 BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2 BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA
+1D0D3 BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4 BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA
+1D0D5 BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6 BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA
+1D0D7 BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8 BYZANTINE MUSICAL SYMBOL GENIKI DIESIS
+1D0D9 BYZANTINE MUSICAL SYMBOL GENIKI YFESIS
+@ Rythmika (Rhythmics)
+1D0DA BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI
+ x (musical symbol short barline - 1D105)
+1D0DB BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI
+ x (musical symbol single barline - 1D100)
+1D0DC BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI
+1D0DD BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS
+1D0DE BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS
+1D0DF BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU
+1D0E0 BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU
+1D0E1 BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU
+1D0E2 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS
+1D0E3 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU
+1D0E4 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU
+1D0E5 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU
+@ Grammata (Letters)
+@+ The first three characters are not actually attested in musical contexts.
+1D0E6 BYZANTINE MUSICAL SYMBOL DIGRAMMA GG
+1D0E7 BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU
+ x (latin small letter ou - 0223)
+1D0E8 BYZANTINE MUSICAL SYMBOL STIGMA
+ x (greek small letter stigma - 03DB)
+1D0E9 BYZANTINE MUSICAL SYMBOL ARKTIKO PA
+1D0EA BYZANTINE MUSICAL SYMBOL ARKTIKO VOU
+1D0EB BYZANTINE MUSICAL SYMBOL ARKTIKO GA
+1D0EC BYZANTINE MUSICAL SYMBOL ARKTIKO DI
+1D0ED BYZANTINE MUSICAL SYMBOL ARKTIKO KE
+1D0EE BYZANTINE MUSICAL SYMBOL ARKTIKO ZO
+1D0EF BYZANTINE MUSICAL SYMBOL ARKTIKO NI
+@ Specials
+1D0F0 BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO
+1D0F1 BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO
+1D0F2 BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO
+1D0F3 BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO
+1D0F4 BYZANTINE MUSICAL SYMBOL KLASMA KATO
+1D0F5 BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+@@ 1D100 Musical Symbols 1D1FF
+@ Bars
+1D100 MUSICAL SYMBOL SINGLE BARLINE
+1D101 MUSICAL SYMBOL DOUBLE BARLINE
+1D102 MUSICAL SYMBOL FINAL BARLINE
+1D103 MUSICAL SYMBOL REVERSE FINAL BARLINE
+1D104 MUSICAL SYMBOL DASHED BARLINE
+1D105 MUSICAL SYMBOL SHORT BARLINE
+@ Codas
+1D106 MUSICAL SYMBOL LEFT REPEAT SIGN
+1D107 MUSICAL SYMBOL RIGHT REPEAT SIGN
+1D108 MUSICAL SYMBOL REPEAT DOTS
+1D109 MUSICAL SYMBOL DAL SEGNO
+1D10A MUSICAL SYMBOL DA CAPO
+1D10B MUSICAL SYMBOL SEGNO
+1D10C MUSICAL SYMBOL CODA
+@ Figure repetitions
+1D10D MUSICAL SYMBOL REPEATED FIGURE-1
+1D10E MUSICAL SYMBOL REPEATED FIGURE-2
+1D10F MUSICAL SYMBOL REPEATED FIGURE-3
+@ Holds and pauses
+1D110 MUSICAL SYMBOL FERMATA
+1D111 MUSICAL SYMBOL FERMATA BELOW
+1D112 MUSICAL SYMBOL BREATH MARK
+1D113 MUSICAL SYMBOL CAESURA
+@ Staff brackets
+1D114 MUSICAL SYMBOL BRACE
+1D115 MUSICAL SYMBOL BRACKET
+@ Staves
+1D116 MUSICAL SYMBOL ONE-LINE STAFF
+1D117 MUSICAL SYMBOL TWO-LINE STAFF
+1D118 MUSICAL SYMBOL THREE-LINE STAFF
+1D119 MUSICAL SYMBOL FOUR-LINE STAFF
+1D11A MUSICAL SYMBOL FIVE-LINE STAFF
+1D11B MUSICAL SYMBOL SIX-LINE STAFF
+@ Tablature
+1D11C MUSICAL SYMBOL SIX-STRING FRETBOARD
+1D11D MUSICAL SYMBOL FOUR-STRING FRETBOARD
+@ Clefs
+1D11E MUSICAL SYMBOL G CLEF
+1D11F MUSICAL SYMBOL G CLEF OTTAVA ALTA
+1D120 MUSICAL SYMBOL G CLEF OTTAVA BASSA
+1D121 MUSICAL SYMBOL C CLEF
+1D122 MUSICAL SYMBOL F CLEF
+1D123 MUSICAL SYMBOL F CLEF OTTAVA ALTA
+1D124 MUSICAL SYMBOL F CLEF OTTAVA BASSA
+1D125 MUSICAL SYMBOL DRUM CLEF-1
+1D126 MUSICAL SYMBOL DRUM CLEF-2
+@ Rest
+1D129 MUSICAL SYMBOL MULTIPLE MEASURE REST
+ * used to represent rests of arbitrary lengths, extending across multiple measures
+ x (musical symbol multi rest - 1D13A)
+@ Accidentals
+@+ The most common accidentals are encoded in the Miscellaneous Symbols block.
+ x (music flat sign - 266D)
+ x (music natural sign - 266E)
+ x (music sharp sign - 266F)
+1D12A MUSICAL SYMBOL DOUBLE SHARP
+1D12B MUSICAL SYMBOL DOUBLE FLAT
+1D12C MUSICAL SYMBOL FLAT UP
+1D12D MUSICAL SYMBOL FLAT DOWN
+1D12E MUSICAL SYMBOL NATURAL UP
+1D12F MUSICAL SYMBOL NATURAL DOWN
+1D130 MUSICAL SYMBOL SHARP UP
+1D131 MUSICAL SYMBOL SHARP DOWN
+1D132 MUSICAL SYMBOL QUARTER TONE SHARP
+1D133 MUSICAL SYMBOL QUARTER TONE FLAT
+@ Time signatures
+1D134 MUSICAL SYMBOL COMMON TIME
+1D135 MUSICAL SYMBOL CUT TIME
+@ Octaves
+1D136 MUSICAL SYMBOL OTTAVA ALTA
+1D137 MUSICAL SYMBOL OTTAVA BASSA
+1D138 MUSICAL SYMBOL QUINDICESIMA ALTA
+1D139 MUSICAL SYMBOL QUINDICESIMA BASSA
+@ Rests
+1D13A MUSICAL SYMBOL MULTI REST
+ = double whole-rest, breve rest
+ x (musical symbol multiple measure rest - 1D129)
+1D13B MUSICAL SYMBOL WHOLE REST
+ = semibreve rest
+1D13C MUSICAL SYMBOL HALF REST
+ = minim rest
+1D13D MUSICAL SYMBOL QUARTER REST
+ = crochet rest
+1D13E MUSICAL SYMBOL EIGHTH REST
+1D13F MUSICAL SYMBOL SIXTEENTH REST
+1D140 MUSICAL SYMBOL THIRTY-SECOND REST
+1D141 MUSICAL SYMBOL SIXTY-FOURTH REST
+1D142 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST
+@ Noteheads
+1D143 MUSICAL SYMBOL X NOTEHEAD
+1D144 MUSICAL SYMBOL PLUS NOTEHEAD
+1D145 MUSICAL SYMBOL CIRCLE X NOTEHEAD
+1D146 MUSICAL SYMBOL SQUARE NOTEHEAD WHITE
+1D147 MUSICAL SYMBOL SQUARE NOTEHEAD BLACK
+1D148 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE
+1D149 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK
+1D14A MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE
+1D14B MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK
+1D14C MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE
+1D14D MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK
+1D14E MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE
+1D14F MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK
+1D150 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE
+1D151 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK
+1D152 MUSICAL SYMBOL MOON NOTEHEAD WHITE
+1D153 MUSICAL SYMBOL MOON NOTEHEAD BLACK
+1D154 MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE
+1D155 MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK
+1D156 MUSICAL SYMBOL PARENTHESIS NOTEHEAD
+1D157 MUSICAL SYMBOL VOID NOTEHEAD
+1D158 MUSICAL SYMBOL NOTEHEAD BLACK
+1D159 MUSICAL SYMBOL NULL NOTEHEAD
+1D15A MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE
+1D15B MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK
+@ Notes
+1D15C MUSICAL SYMBOL BREVE
+1D15D MUSICAL SYMBOL WHOLE NOTE
+1D15E MUSICAL SYMBOL HALF NOTE
+ : 1D157 1D165
+1D15F MUSICAL SYMBOL QUARTER NOTE
+ : 1D158 1D165
+1D160 MUSICAL SYMBOL EIGHTH NOTE
+ : 1D15F 1D16E
+1D161 MUSICAL SYMBOL SIXTEENTH NOTE
+ : 1D15F 1D16F
+1D162 MUSICAL SYMBOL THIRTY-SECOND NOTE
+ : 1D15F 1D170
+1D163 MUSICAL SYMBOL SIXTY-FOURTH NOTE
+ : 1D15F 1D171
+1D164 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+ : 1D15F 1D172
+@ Stems
+1D165 MUSICAL SYMBOL COMBINING STEM
+1D166 MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+@ Tremolos
+1D167 MUSICAL SYMBOL COMBINING TREMOLO-1
+1D168 MUSICAL SYMBOL COMBINING TREMOLO-2
+1D169 MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A MUSICAL SYMBOL FINGERED TREMOLO-1
+1D16B MUSICAL SYMBOL FINGERED TREMOLO-2
+1D16C MUSICAL SYMBOL FINGERED TREMOLO-3
+@ Augmentation dot
+1D16D MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+@ Flags
+1D16E MUSICAL SYMBOL COMBINING FLAG-1
+1D16F MUSICAL SYMBOL COMBINING FLAG-2
+1D170 MUSICAL SYMBOL COMBINING FLAG-3
+1D171 MUSICAL SYMBOL COMBINING FLAG-4
+1D172 MUSICAL SYMBOL COMBINING FLAG-5
+@ Beams and slurs
+1D173 MUSICAL SYMBOL BEGIN BEAM
+1D174 MUSICAL SYMBOL END BEAM
+1D175 MUSICAL SYMBOL BEGIN TIE
+1D176 MUSICAL SYMBOL END TIE
+1D177 MUSICAL SYMBOL BEGIN SLUR
+1D178 MUSICAL SYMBOL END SLUR
+1D179 MUSICAL SYMBOL BEGIN PHRASE
+1D17A MUSICAL SYMBOL END PHRASE
+@ Articulation
+1D17B MUSICAL SYMBOL COMBINING ACCENT
+1D17C MUSICAL SYMBOL COMBINING STACCATO
+1D17D MUSICAL SYMBOL COMBINING TENUTO
+1D17E MUSICAL SYMBOL COMBINING STACCATISSIMO
+1D17F MUSICAL SYMBOL COMBINING MARCATO
+1D180 MUSICAL SYMBOL COMBINING MARCATO-STACCATO
+1D181 MUSICAL SYMBOL COMBINING ACCENT-STACCATO
+1D182 MUSICAL SYMBOL COMBINING LOURE
+1D183 MUSICAL SYMBOL ARPEGGIATO UP
+1D184 MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185 MUSICAL SYMBOL COMBINING DOIT
+1D186 MUSICAL SYMBOL COMBINING RIP
+1D187 MUSICAL SYMBOL COMBINING FLIP
+1D188 MUSICAL SYMBOL COMBINING SMEAR
+1D189 MUSICAL SYMBOL COMBINING BEND
+1D18A MUSICAL SYMBOL COMBINING DOUBLE TONGUE
+1D18B MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C MUSICAL SYMBOL RINFORZANDO
+1D18D MUSICAL SYMBOL SUBITO
+1D18E MUSICAL SYMBOL Z
+@ Dynamics
+1D18F MUSICAL SYMBOL PIANO
+1D190 MUSICAL SYMBOL MEZZO
+1D191 MUSICAL SYMBOL FORTE
+1D192 MUSICAL SYMBOL CRESCENDO
+1D193 MUSICAL SYMBOL DECRESCENDO
+@ Ornaments
+1D194 MUSICAL SYMBOL GRACE NOTE SLASH
+1D195 MUSICAL SYMBOL GRACE NOTE NO SLASH
+1D196 MUSICAL SYMBOL TR
+1D197 MUSICAL SYMBOL TURN
+1D198 MUSICAL SYMBOL INVERTED TURN
+1D199 MUSICAL SYMBOL TURN SLASH
+1D19A MUSICAL SYMBOL TURN UP
+1D19B MUSICAL SYMBOL ORNAMENT STROKE-1
+1D19C MUSICAL SYMBOL ORNAMENT STROKE-2
+1D19D MUSICAL SYMBOL ORNAMENT STROKE-3
+1D19E MUSICAL SYMBOL ORNAMENT STROKE-4
+1D19F MUSICAL SYMBOL ORNAMENT STROKE-5
+1D1A0 MUSICAL SYMBOL ORNAMENT STROKE-6
+1D1A1 MUSICAL SYMBOL ORNAMENT STROKE-7
+1D1A2 MUSICAL SYMBOL ORNAMENT STROKE-8
+1D1A3 MUSICAL SYMBOL ORNAMENT STROKE-9
+1D1A4 MUSICAL SYMBOL ORNAMENT STROKE-10
+1D1A5 MUSICAL SYMBOL ORNAMENT STROKE-11
+@ Analytics
+1D1A6 MUSICAL SYMBOL HAUPTSTIMME
+1D1A7 MUSICAL SYMBOL NEBENSTIMME
+1D1A8 MUSICAL SYMBOL END OF STIMME
+1D1A9 MUSICAL SYMBOL DEGREE SLASH
+@ Instrumentation
+1D1AA MUSICAL SYMBOL COMBINING DOWN BOW
+1D1AB MUSICAL SYMBOL COMBINING UP BOW
+1D1AC MUSICAL SYMBOL COMBINING HARMONIC
+1D1AD MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+@ Pedals
+1D1AE MUSICAL SYMBOL PEDAL MARK
+1D1AF MUSICAL SYMBOL PEDAL UP MARK
+1D1B0 MUSICAL SYMBOL HALF PEDAL MARK
+@ Miscellaneous symbols
+1D1B1 MUSICAL SYMBOL GLISSANDO UP
+1D1B2 MUSICAL SYMBOL GLISSANDO DOWN
+1D1B3 MUSICAL SYMBOL WITH FINGERNAILS
+1D1B4 MUSICAL SYMBOL DAMP
+1D1B5 MUSICAL SYMBOL DAMP ALL
+@ Mensural notation
+1D1B6 MUSICAL SYMBOL MAXIMA
+1D1B7 MUSICAL SYMBOL LONGA
+1D1B8 MUSICAL SYMBOL BREVIS
+1D1B9 MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB MUSICAL SYMBOL MINIMA
+ : 1D1B9 1D165
+1D1BC MUSICAL SYMBOL MINIMA BLACK
+ : 1D1BA 1D165
+1D1BD MUSICAL SYMBOL SEMIMINIMA WHITE
+ : 1D1BB 1D16E
+1D1BE MUSICAL SYMBOL SEMIMINIMA BLACK
+ : 1D1BC 1D16E
+1D1BF MUSICAL SYMBOL FUSA WHITE
+ : 1D1BB 1D16F
+1D1C0 MUSICAL SYMBOL FUSA BLACK
+ : 1D1BC 1D16F
+@ Mensural rests
+1D1C1 MUSICAL SYMBOL LONGA PERFECTA REST
+1D1C2 MUSICAL SYMBOL LONGA IMPERFECTA REST
+1D1C3 MUSICAL SYMBOL BREVIS REST
+1D1C4 MUSICAL SYMBOL SEMIBREVIS REST
+1D1C5 MUSICAL SYMBOL MINIMA REST
+1D1C6 MUSICAL SYMBOL SEMIMINIMA REST
+@ Mensural prolations
+1D1C7 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA
+1D1C8 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA
+1D1C9 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1
+1D1CA MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA
+1D1CB MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA
+1D1CC MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1
+1D1CD MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2
+1D1CE MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3
+@ Miscellaneous symbol
+1D1CF MUSICAL SYMBOL CROIX
+@ Gregorian notation
+1D1D0 MUSICAL SYMBOL GREGORIAN C CLEF
+1D1D1 MUSICAL SYMBOL GREGORIAN F CLEF
+1D1D2 MUSICAL SYMBOL SQUARE B
+1D1D3 MUSICAL SYMBOL VIRGA
+1D1D4 MUSICAL SYMBOL PODATUS
+1D1D5 MUSICAL SYMBOL CLIVIS
+1D1D6 MUSICAL SYMBOL SCANDICUS
+1D1D7 MUSICAL SYMBOL CLIMACUS
+1D1D8 MUSICAL SYMBOL TORCULUS
+1D1D9 MUSICAL SYMBOL PORRECTUS
+1D1DA MUSICAL SYMBOL PORRECTUS FLEXUS
+1D1DB MUSICAL SYMBOL SCANDICUS FLEXUS
+1D1DC MUSICAL SYMBOL TORCULUS RESUPINUS
+1D1DD MUSICAL SYMBOL PES SUBPUNCTIS
+@@ 1D200 Ancient Greek Musical Notation 1D24F
+@ Ancient Greek vocalic notation
+@+ In a few instances vocalic and instrumental symbols have been unified with each other. In other instances they have been unified with regular Greek letters.
+1D200 GREEK VOCAL NOTATION SYMBOL-1
+ * vocal E
+1D201 GREEK VOCAL NOTATION SYMBOL-2
+ * vocal first sharp of E
+1D202 GREEK VOCAL NOTATION SYMBOL-3
+ = Greek instrumental notation symbol-3
+ * vocal or instrumental second sharp of E
+1D203 GREEK VOCAL NOTATION SYMBOL-4
+ * vocal F
+1D204 GREEK VOCAL NOTATION SYMBOL-5
+ * vocal first sharp of F
+1D205 GREEK VOCAL NOTATION SYMBOL-6
+ = Greek instrumental notation symbol-21
+ * vocal second sharp of F
+ * instrumental second sharp of d
+1D206 GREEK VOCAL NOTATION SYMBOL-7
+ = Greek instrumental notation symbol-9
+ * vocal G
+ * instrumental second sharp of G
+1D207 GREEK VOCAL NOTATION SYMBOL-8
+ * vocal first sharp of G
+1D208 GREEK VOCAL NOTATION SYMBOL-9
+ = Greek instrumental notation symbol-44
+ * vocal second sharp of G
+ * instrumental first sharp of e´
+1D209 GREEK VOCAL NOTATION SYMBOL-10
+ * vocal A
+ * this is a modification of 039F and is therefore not the same as 03D8
+1D20A GREEK VOCAL NOTATION SYMBOL-11
+ * vocal first sharp of A
+1D20B GREEK VOCAL NOTATION SYMBOL-12
+ * vocal second sharp of A
+1D20C GREEK VOCAL NOTATION SYMBOL-13
+ * vocal B
+1D20D GREEK VOCAL NOTATION SYMBOL-14
+ = Greek instrumental notation symbol-41
+ * vocal first sharp of B
+ * instrumental first sharp of d´
+ x (latin capital letter v - 0056)
+1D20E GREEK VOCAL NOTATION SYMBOL-15
+ = Greek instrumental notation symbol-35
+ * vocal second sharp of B
+ * instrumental first sharp of b
+1D20F GREEK VOCAL NOTATION SYMBOL-16
+ * vocal c
+ * unlike 1D23B this character has a glyph variant that looks like a horizontal line
+1D210 GREEK VOCAL NOTATION SYMBOL-17
+ * vocal first sharp of c
+1D211 GREEK VOCAL NOTATION SYMBOL-18
+ = Greek instrumental notation symbol-15
+ * vocal second sharp of c
+ * instrumental second sharp of B
+1D212 GREEK VOCAL NOTATION SYMBOL-19
+ * vocal d
+1D213 GREEK VOCAL NOTATION SYMBOL-20
+ = Greek instrumental notation symbol-28
+ * vocal first sharp of d
+ * instrumental g
+ * this is a modification of 0395 and is therefore not the same as 0046
+1D214 GREEK VOCAL NOTATION SYMBOL-21
+ * vocal second sharp of d
+1D215 GREEK VOCAL NOTATION SYMBOL-22
+ * vocal e
+1D216 GREEK VOCAL NOTATION SYMBOL-23
+ * vocal first sharp of e
+ * this is a modification of 0392 and is therefore not the same as 0052
+1D217 GREEK VOCAL NOTATION SYMBOL-24
+ * vocal second sharp of e
+1D218 GREEK VOCAL NOTATION SYMBOL-50
+ * vocal first sharp of g´
+1D219 GREEK VOCAL NOTATION SYMBOL-51
+ * vocal second sharp of g´
+1D21A GREEK VOCAL NOTATION SYMBOL-52
+ * vocal a´
+1D21B GREEK VOCAL NOTATION SYMBOL-53
+ * vocal first sharp of a´
+1D21C GREEK VOCAL NOTATION SYMBOL-54
+ = Greek instrumental notation symbol-20
+ * vocal second sharp of a´
+ * instrumental first sharp of d
+@ Ancient Greek instrumental notation
+1D21D GREEK INSTRUMENTAL NOTATION SYMBOL-1
+ * instrumental E
+1D21E GREEK INSTRUMENTAL NOTATION SYMBOL-2
+ * instrumental first sharp of E
+1D21F GREEK INSTRUMENTAL NOTATION SYMBOL-4
+ * instrumental F
+1D220 GREEK INSTRUMENTAL NOTATION SYMBOL-5
+ * instrumental first sharp of F
+1D221 GREEK INSTRUMENTAL NOTATION SYMBOL-7
+ * instrumental G
+1D222 GREEK INSTRUMENTAL NOTATION SYMBOL-8
+ * instrumental first sharp of G
+1D223 GREEK INSTRUMENTAL NOTATION SYMBOL-11
+ * instrumental first sharp of A
+1D224 GREEK INSTRUMENTAL NOTATION SYMBOL-12
+ * instrumental second sharp of A
+1D225 GREEK INSTRUMENTAL NOTATION SYMBOL-13
+ * instrumental B
+1D226 GREEK INSTRUMENTAL NOTATION SYMBOL-14
+ * instrumental first sharp of B
+1D227 GREEK INSTRUMENTAL NOTATION SYMBOL-17
+ * instrumental first sharp of c
+1D228 GREEK INSTRUMENTAL NOTATION SYMBOL-18
+ * instrumental second sharp of c
+1D229 GREEK INSTRUMENTAL NOTATION SYMBOL-19
+ * instrumental d
+1D22A GREEK INSTRUMENTAL NOTATION SYMBOL-23
+ * instrumental first sharp of e
+1D22B GREEK INSTRUMENTAL NOTATION SYMBOL-24
+ * instrumental second sharp of e
+1D22C GREEK INSTRUMENTAL NOTATION SYMBOL-25
+ * instrumental f
+1D22D GREEK INSTRUMENTAL NOTATION SYMBOL-26
+ * instrumental first sharp of f
+1D22E GREEK INSTRUMENTAL NOTATION SYMBOL-27
+ * instrumental second sharp of f
+1D22F GREEK INSTRUMENTAL NOTATION SYMBOL-29
+ * instrumental first sharp of g
+1D230 GREEK INSTRUMENTAL NOTATION SYMBOL-30
+ * instrumental second sharp of g
+1D231 GREEK INSTRUMENTAL NOTATION SYMBOL-32
+ * instrumental first sharp of a
+1D232 GREEK INSTRUMENTAL NOTATION SYMBOL-36
+ * instrumental second sharp of b
+1D233 GREEK INSTRUMENTAL NOTATION SYMBOL-37
+ * instrumental c´
+1D234 GREEK INSTRUMENTAL NOTATION SYMBOL-38
+ * instrumental first sharp of c´
+1D235 GREEK INSTRUMENTAL NOTATION SYMBOL-39
+ * instrumental second sharp of c´
+1D236 GREEK INSTRUMENTAL NOTATION SYMBOL-40
+ * instrumental d´
+1D237 GREEK INSTRUMENTAL NOTATION SYMBOL-42
+ * instrumental second sharp of d´
+1D238 GREEK INSTRUMENTAL NOTATION SYMBOL-43
+ * instrumental e´
+1D239 GREEK INSTRUMENTAL NOTATION SYMBOL-45
+ * instrumental second sharp of e´
+1D23A GREEK INSTRUMENTAL NOTATION SYMBOL-47
+ * instrumental first sharp of f´
+ * similar but not identical to 002F
+1D23B GREEK INSTRUMENTAL NOTATION SYMBOL-48
+ * instrumental second sharp of f´
+ * similar but not identical to 005C
+1D23C GREEK INSTRUMENTAL NOTATION SYMBOL-49
+ * instrumental g´
+1D23D GREEK INSTRUMENTAL NOTATION SYMBOL-50
+ * instrumental first sharp of g´
+1D23E GREEK INSTRUMENTAL NOTATION SYMBOL-51
+ * instrumental second sharp of g´
+1D23F GREEK INSTRUMENTAL NOTATION SYMBOL-52
+ * instrumental a´
+1D240 GREEK INSTRUMENTAL NOTATION SYMBOL-53
+ * instrumental first sharp of a´
+1D241 GREEK INSTRUMENTAL NOTATION SYMBOL-54
+ * instrumental second sharp of a´
+@ Further Greek musical notation symbols
+1D242 COMBINING GREEK MUSICAL TRISEME
+ x (metrical triseme - 23D7)
+1D243 COMBINING GREEK MUSICAL TETRASEME
+ x (metrical tetraseme - 23D8)
+1D244 COMBINING GREEK MUSICAL PENTASEME
+ x (metrical pentaseme - 23D9)
+1D245 GREEK MUSICAL LEIMMA
+@@ 1D300 Tai Xuan Jing Symbols 1D35F
+@+ These symbols are an extension of the better-known Yijing symbols found in the Miscellaneous Symbols block. The names for the monogram and digram symbols here are not correct translations of the usual Chinese terminology.
+@ Monogram
+1D300 MONOGRAM FOR EARTH (ren) *
+ = ren
+ * usually associated with human (Chinese ren), rather than earth
+ x (monogram for yang - 268A)
+ x (monogram for yin - 268B)
+@ Digrams
+@+ The digrams extend the set of Yijing digrams; note that the Chinese aliases more correctly represent their interpretation.
+1D301 DIGRAM FOR HEAVENLY EARTH (tian ren) *
+ = tian ren
+1D302 DIGRAM FOR HUMAN EARTH (di ren) *
+ = di ren
+1D303 DIGRAM FOR EARTHLY HEAVEN (ren tian) *
+ = ren tian
+1D304 DIGRAM FOR EARTHLY HUMAN (ren di) *
+ = ren di
+1D305 DIGRAM FOR EARTH (ren ren) *
+ = ren ren
+@ Tetragrams
+1D306 TETRAGRAM FOR CENTRE
+1D307 TETRAGRAM FOR FULL CIRCLE
+1D308 TETRAGRAM FOR MIRED
+1D309 TETRAGRAM FOR BARRIER
+1D30A TETRAGRAM FOR KEEPING SMALL
+1D30B TETRAGRAM FOR CONTRARIETY
+1D30C TETRAGRAM FOR ASCENT
+1D30D TETRAGRAM FOR OPPOSITION
+1D30E TETRAGRAM FOR BRANCHING OUT
+1D30F TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310 TETRAGRAM FOR DIVERGENCE
+1D311 TETRAGRAM FOR YOUTHFULNESS
+1D312 TETRAGRAM FOR INCREASE
+1D313 TETRAGRAM FOR PENETRATION
+1D314 TETRAGRAM FOR REACH
+1D315 TETRAGRAM FOR CONTACT
+1D316 TETRAGRAM FOR HOLDING BACK
+1D317 TETRAGRAM FOR WAITING
+1D318 TETRAGRAM FOR FOLLOWING
+1D319 TETRAGRAM FOR ADVANCE
+1D31A TETRAGRAM FOR RELEASE
+1D31B TETRAGRAM FOR RESISTANCE
+1D31C TETRAGRAM FOR EASE
+1D31D TETRAGRAM FOR JOY
+1D31E TETRAGRAM FOR CONTENTION
+1D31F TETRAGRAM FOR ENDEAVOUR
+1D320 TETRAGRAM FOR DUTIES
+1D321 TETRAGRAM FOR CHANGE
+1D322 TETRAGRAM FOR DECISIVENESS
+1D323 TETRAGRAM FOR BOLD RESOLUTION
+1D324 TETRAGRAM FOR PACKING
+1D325 TETRAGRAM FOR LEGION
+1D326 TETRAGRAM FOR CLOSENESS
+1D327 TETRAGRAM FOR KINSHIP
+1D328 TETRAGRAM FOR GATHERING
+1D329 TETRAGRAM FOR STRENGTH
+1D32A TETRAGRAM FOR PURITY
+1D32B TETRAGRAM FOR FULLNESS
+1D32C TETRAGRAM FOR RESIDENCE
+1D32D TETRAGRAM FOR LAW OR MODEL
+1D32E TETRAGRAM FOR RESPONSE
+1D32F TETRAGRAM FOR GOING TO MEET
+1D330 TETRAGRAM FOR ENCOUNTERS
+1D331 TETRAGRAM FOR STOVE
+1D332 TETRAGRAM FOR GREATNESS
+1D333 TETRAGRAM FOR ENLARGEMENT
+1D334 TETRAGRAM FOR PATTERN
+1D335 TETRAGRAM FOR RITUAL
+1D336 TETRAGRAM FOR FLIGHT
+1D337 TETRAGRAM FOR VASTNESS OR WASTING
+1D338 TETRAGRAM FOR CONSTANCY
+1D339 TETRAGRAM FOR MEASURE
+1D33A TETRAGRAM FOR ETERNITY
+1D33B TETRAGRAM FOR UNITY
+1D33C TETRAGRAM FOR DIMINISHMENT
+1D33D TETRAGRAM FOR CLOSED MOUTH
+1D33E TETRAGRAM FOR GUARDEDNESS
+1D33F TETRAGRAM FOR GATHERING IN
+1D340 TETRAGRAM FOR MASSING
+1D341 TETRAGRAM FOR ACCUMULATION
+1D342 TETRAGRAM FOR EMBELLISHMENT
+1D343 TETRAGRAM FOR DOUBT
+1D344 TETRAGRAM FOR WATCH
+1D345 TETRAGRAM FOR SINKING
+1D346 TETRAGRAM FOR INNER
+1D347 TETRAGRAM FOR DEPARTURE
+1D348 TETRAGRAM FOR DARKENING
+1D349 TETRAGRAM FOR DIMMING
+1D34A TETRAGRAM FOR EXHAUSTION
+1D34B TETRAGRAM FOR SEVERANCE
+1D34C TETRAGRAM FOR STOPPAGE
+1D34D TETRAGRAM FOR HARDNESS
+1D34E TETRAGRAM FOR COMPLETION
+1D34F TETRAGRAM FOR CLOSURE
+1D350 TETRAGRAM FOR FAILURE
+1D351 TETRAGRAM FOR AGGRAVATION
+1D352 TETRAGRAM FOR COMPLIANCE
+1D353 TETRAGRAM FOR ON THE VERGE
+1D354 TETRAGRAM FOR DIFFICULTIES
+1D355 TETRAGRAM FOR LABOURING
+1D356 TETRAGRAM FOR FOSTERING
+@@ 1D360 Counting Rod Numerals 1D37F
+@ Counting rod units
+1D360 COUNTING ROD UNIT DIGIT ONE
+1D361 COUNTING ROD UNIT DIGIT TWO
+1D362 COUNTING ROD UNIT DIGIT THREE
+1D363 COUNTING ROD UNIT DIGIT FOUR
+1D364 COUNTING ROD UNIT DIGIT FIVE
+1D365 COUNTING ROD UNIT DIGIT SIX
+1D366 COUNTING ROD UNIT DIGIT SEVEN
+1D367 COUNTING ROD UNIT DIGIT EIGHT
+1D368 COUNTING ROD UNIT DIGIT NINE
+1D369 COUNTING ROD TENS DIGIT ONE
+1D36A COUNTING ROD TENS DIGIT TWO
+1D36B COUNTING ROD TENS DIGIT THREE
+1D36C COUNTING ROD TENS DIGIT FOUR
+1D36D COUNTING ROD TENS DIGIT FIVE
+1D36E COUNTING ROD TENS DIGIT SIX
+1D36F COUNTING ROD TENS DIGIT SEVEN
+1D370 COUNTING ROD TENS DIGIT EIGHT
+1D371 COUNTING ROD TENS DIGIT NINE
+@@ 1D400 Mathematical Alphanumeric Symbols 1D7FF
+@@+
+@+ To be used for mathematical variables where style variations are important semantically. For general text, use standard Latin and Greek letters with markup.
+@ Bold symbols
+1D400 MATHEMATICAL BOLD CAPITAL A
+ # <font> 0041 latin capital letter a
+1D401 MATHEMATICAL BOLD CAPITAL B
+ # <font> 0042 latin capital letter b
+1D402 MATHEMATICAL BOLD CAPITAL C
+ # <font> 0043 latin capital letter c
+1D403 MATHEMATICAL BOLD CAPITAL D
+ # <font> 0044 latin capital letter d
+1D404 MATHEMATICAL BOLD CAPITAL E
+ # <font> 0045 latin capital letter e
+1D405 MATHEMATICAL BOLD CAPITAL F
+ # <font> 0046 latin capital letter f
+1D406 MATHEMATICAL BOLD CAPITAL G
+ # <font> 0047 latin capital letter g
+1D407 MATHEMATICAL BOLD CAPITAL H
+ # <font> 0048 latin capital letter h
+1D408 MATHEMATICAL BOLD CAPITAL I
+ # <font> 0049 latin capital letter i
+1D409 MATHEMATICAL BOLD CAPITAL J
+ # <font> 004A latin capital letter j
+1D40A MATHEMATICAL BOLD CAPITAL K
+ # <font> 004B latin capital letter k
+1D40B MATHEMATICAL BOLD CAPITAL L
+ # <font> 004C latin capital letter l
+1D40C MATHEMATICAL BOLD CAPITAL M
+ # <font> 004D latin capital letter m
+1D40D MATHEMATICAL BOLD CAPITAL N
+ # <font> 004E latin capital letter n
+1D40E MATHEMATICAL BOLD CAPITAL O
+ # <font> 004F latin capital letter o
+1D40F MATHEMATICAL BOLD CAPITAL P
+ # <font> 0050 latin capital letter p
+1D410 MATHEMATICAL BOLD CAPITAL Q
+ # <font> 0051 latin capital letter q
+1D411 MATHEMATICAL BOLD CAPITAL R
+ # <font> 0052 latin capital letter r
+1D412 MATHEMATICAL BOLD CAPITAL S
+ # <font> 0053 latin capital letter s
+1D413 MATHEMATICAL BOLD CAPITAL T
+ # <font> 0054 latin capital letter t
+1D414 MATHEMATICAL BOLD CAPITAL U
+ # <font> 0055 latin capital letter u
+1D415 MATHEMATICAL BOLD CAPITAL V
+ # <font> 0056 latin capital letter v
+1D416 MATHEMATICAL BOLD CAPITAL W
+ # <font> 0057 latin capital letter w
+1D417 MATHEMATICAL BOLD CAPITAL X
+ # <font> 0058 latin capital letter x
+1D418 MATHEMATICAL BOLD CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D419 MATHEMATICAL BOLD CAPITAL Z
+ # <font> 005A latin capital letter z
+1D41A MATHEMATICAL BOLD SMALL A
+ # <font> 0061 latin small letter a
+1D41B MATHEMATICAL BOLD SMALL B
+ # <font> 0062 latin small letter b
+1D41C MATHEMATICAL BOLD SMALL C
+ # <font> 0063 latin small letter c
+1D41D MATHEMATICAL BOLD SMALL D
+ # <font> 0064 latin small letter d
+1D41E MATHEMATICAL BOLD SMALL E
+ # <font> 0065 latin small letter e
+1D41F MATHEMATICAL BOLD SMALL F
+ # <font> 0066 latin small letter f
+1D420 MATHEMATICAL BOLD SMALL G
+ # <font> 0067 latin small letter g
+1D421 MATHEMATICAL BOLD SMALL H
+ # <font> 0068 latin small letter h
+1D422 MATHEMATICAL BOLD SMALL I
+ # <font> 0069 latin small letter i
+1D423 MATHEMATICAL BOLD SMALL J
+ # <font> 006A latin small letter j
+1D424 MATHEMATICAL BOLD SMALL K
+ # <font> 006B latin small letter k
+1D425 MATHEMATICAL BOLD SMALL L
+ # <font> 006C latin small letter l
+1D426 MATHEMATICAL BOLD SMALL M
+ # <font> 006D latin small letter m
+1D427 MATHEMATICAL BOLD SMALL N
+ # <font> 006E latin small letter n
+1D428 MATHEMATICAL BOLD SMALL O
+ # <font> 006F latin small letter o
+1D429 MATHEMATICAL BOLD SMALL P
+ # <font> 0070 latin small letter p
+1D42A MATHEMATICAL BOLD SMALL Q
+ # <font> 0071 latin small letter q
+1D42B MATHEMATICAL BOLD SMALL R
+ # <font> 0072 latin small letter r
+1D42C MATHEMATICAL BOLD SMALL S
+ # <font> 0073 latin small letter s
+1D42D MATHEMATICAL BOLD SMALL T
+ # <font> 0074 latin small letter t
+1D42E MATHEMATICAL BOLD SMALL U
+ # <font> 0075 latin small letter u
+1D42F MATHEMATICAL BOLD SMALL V
+ # <font> 0076 latin small letter v
+1D430 MATHEMATICAL BOLD SMALL W
+ # <font> 0077 latin small letter w
+1D431 MATHEMATICAL BOLD SMALL X
+ # <font> 0078 latin small letter x
+1D432 MATHEMATICAL BOLD SMALL Y
+ # <font> 0079 latin small letter y
+1D433 MATHEMATICAL BOLD SMALL Z
+ # <font> 007A latin small letter z
+@ Italic symbols
+@+ Italic symbols already encoded in the Letterlike Symbols block are omitted here to avoid duplicate encoding.
+1D434 MATHEMATICAL ITALIC CAPITAL A
+ # <font> 0041 latin capital letter a
+1D435 MATHEMATICAL ITALIC CAPITAL B
+ # <font> 0042 latin capital letter b
+1D436 MATHEMATICAL ITALIC CAPITAL C
+ # <font> 0043 latin capital letter c
+1D437 MATHEMATICAL ITALIC CAPITAL D
+ # <font> 0044 latin capital letter d
+1D438 MATHEMATICAL ITALIC CAPITAL E
+ # <font> 0045 latin capital letter e
+1D439 MATHEMATICAL ITALIC CAPITAL F
+ # <font> 0046 latin capital letter f
+1D43A MATHEMATICAL ITALIC CAPITAL G
+ # <font> 0047 latin capital letter g
+1D43B MATHEMATICAL ITALIC CAPITAL H
+ # <font> 0048 latin capital letter h
+1D43C MATHEMATICAL ITALIC CAPITAL I
+ # <font> 0049 latin capital letter i
+1D43D MATHEMATICAL ITALIC CAPITAL J
+ # <font> 004A latin capital letter j
+1D43E MATHEMATICAL ITALIC CAPITAL K
+ # <font> 004B latin capital letter k
+1D43F MATHEMATICAL ITALIC CAPITAL L
+ # <font> 004C latin capital letter l
+1D440 MATHEMATICAL ITALIC CAPITAL M
+ # <font> 004D latin capital letter m
+1D441 MATHEMATICAL ITALIC CAPITAL N
+ # <font> 004E latin capital letter n
+1D442 MATHEMATICAL ITALIC CAPITAL O
+ # <font> 004F latin capital letter o
+1D443 MATHEMATICAL ITALIC CAPITAL P
+ # <font> 0050 latin capital letter p
+1D444 MATHEMATICAL ITALIC CAPITAL Q
+ # <font> 0051 latin capital letter q
+1D445 MATHEMATICAL ITALIC CAPITAL R
+ # <font> 0052 latin capital letter r
+1D446 MATHEMATICAL ITALIC CAPITAL S
+ # <font> 0053 latin capital letter s
+1D447 MATHEMATICAL ITALIC CAPITAL T
+ # <font> 0054 latin capital letter t
+1D448 MATHEMATICAL ITALIC CAPITAL U
+ # <font> 0055 latin capital letter u
+1D449 MATHEMATICAL ITALIC CAPITAL V
+ # <font> 0056 latin capital letter v
+1D44A MATHEMATICAL ITALIC CAPITAL W
+ # <font> 0057 latin capital letter w
+1D44B MATHEMATICAL ITALIC CAPITAL X
+ # <font> 0058 latin capital letter x
+1D44C MATHEMATICAL ITALIC CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D44D MATHEMATICAL ITALIC CAPITAL Z
+ # <font> 005A latin capital letter z
+1D44E MATHEMATICAL ITALIC SMALL A
+ # <font> 0061 latin small letter a
+1D44F MATHEMATICAL ITALIC SMALL B
+ # <font> 0062 latin small letter b
+1D450 MATHEMATICAL ITALIC SMALL C
+ # <font> 0063 latin small letter c
+1D451 MATHEMATICAL ITALIC SMALL D
+ # <font> 0064 latin small letter d
+1D452 MATHEMATICAL ITALIC SMALL E
+ # <font> 0065 latin small letter e
+1D453 MATHEMATICAL ITALIC SMALL F
+ # <font> 0066 latin small letter f
+1D454 MATHEMATICAL ITALIC SMALL G
+ # <font> 0067 latin small letter g
+1D455 <reserved>
+ x (planck constant - 210E)
+1D456 MATHEMATICAL ITALIC SMALL I
+ # <font> 0069 latin small letter i
+1D457 MATHEMATICAL ITALIC SMALL J
+ # <font> 006A latin small letter j
+1D458 MATHEMATICAL ITALIC SMALL K
+ # <font> 006B latin small letter k
+1D459 MATHEMATICAL ITALIC SMALL L
+ # <font> 006C latin small letter l
+1D45A MATHEMATICAL ITALIC SMALL M
+ # <font> 006D latin small letter m
+1D45B MATHEMATICAL ITALIC SMALL N
+ # <font> 006E latin small letter n
+1D45C MATHEMATICAL ITALIC SMALL O
+ # <font> 006F latin small letter o
+1D45D MATHEMATICAL ITALIC SMALL P
+ # <font> 0070 latin small letter p
+1D45E MATHEMATICAL ITALIC SMALL Q
+ # <font> 0071 latin small letter q
+1D45F MATHEMATICAL ITALIC SMALL R
+ # <font> 0072 latin small letter r
+1D460 MATHEMATICAL ITALIC SMALL S
+ # <font> 0073 latin small letter s
+1D461 MATHEMATICAL ITALIC SMALL T
+ # <font> 0074 latin small letter t
+1D462 MATHEMATICAL ITALIC SMALL U
+ # <font> 0075 latin small letter u
+1D463 MATHEMATICAL ITALIC SMALL V
+ # <font> 0076 latin small letter v
+1D464 MATHEMATICAL ITALIC SMALL W
+ # <font> 0077 latin small letter w
+1D465 MATHEMATICAL ITALIC SMALL X
+ # <font> 0078 latin small letter x
+1D466 MATHEMATICAL ITALIC SMALL Y
+ # <font> 0079 latin small letter y
+1D467 MATHEMATICAL ITALIC SMALL Z
+ # <font> 007A latin small letter z
+@ Bold italic symbols
+1D468 MATHEMATICAL BOLD ITALIC CAPITAL A
+ # <font> 0041 latin capital letter a
+1D469 MATHEMATICAL BOLD ITALIC CAPITAL B
+ # <font> 0042 latin capital letter b
+1D46A MATHEMATICAL BOLD ITALIC CAPITAL C
+ # <font> 0043 latin capital letter c
+1D46B MATHEMATICAL BOLD ITALIC CAPITAL D
+ # <font> 0044 latin capital letter d
+1D46C MATHEMATICAL BOLD ITALIC CAPITAL E
+ # <font> 0045 latin capital letter e
+1D46D MATHEMATICAL BOLD ITALIC CAPITAL F
+ # <font> 0046 latin capital letter f
+1D46E MATHEMATICAL BOLD ITALIC CAPITAL G
+ # <font> 0047 latin capital letter g
+1D46F MATHEMATICAL BOLD ITALIC CAPITAL H
+ # <font> 0048 latin capital letter h
+1D470 MATHEMATICAL BOLD ITALIC CAPITAL I
+ # <font> 0049 latin capital letter i
+1D471 MATHEMATICAL BOLD ITALIC CAPITAL J
+ # <font> 004A latin capital letter j
+1D472 MATHEMATICAL BOLD ITALIC CAPITAL K
+ # <font> 004B latin capital letter k
+1D473 MATHEMATICAL BOLD ITALIC CAPITAL L
+ # <font> 004C latin capital letter l
+1D474 MATHEMATICAL BOLD ITALIC CAPITAL M
+ # <font> 004D latin capital letter m
+1D475 MATHEMATICAL BOLD ITALIC CAPITAL N
+ # <font> 004E latin capital letter n
+1D476 MATHEMATICAL BOLD ITALIC CAPITAL O
+ # <font> 004F latin capital letter o
+1D477 MATHEMATICAL BOLD ITALIC CAPITAL P
+ # <font> 0050 latin capital letter p
+1D478 MATHEMATICAL BOLD ITALIC CAPITAL Q
+ # <font> 0051 latin capital letter q
+1D479 MATHEMATICAL BOLD ITALIC CAPITAL R
+ # <font> 0052 latin capital letter r
+1D47A MATHEMATICAL BOLD ITALIC CAPITAL S
+ # <font> 0053 latin capital letter s
+1D47B MATHEMATICAL BOLD ITALIC CAPITAL T
+ # <font> 0054 latin capital letter t
+1D47C MATHEMATICAL BOLD ITALIC CAPITAL U
+ # <font> 0055 latin capital letter u
+1D47D MATHEMATICAL BOLD ITALIC CAPITAL V
+ # <font> 0056 latin capital letter v
+1D47E MATHEMATICAL BOLD ITALIC CAPITAL W
+ # <font> 0057 latin capital letter w
+1D47F MATHEMATICAL BOLD ITALIC CAPITAL X
+ # <font> 0058 latin capital letter x
+1D480 MATHEMATICAL BOLD ITALIC CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D481 MATHEMATICAL BOLD ITALIC CAPITAL Z
+ # <font> 005A latin capital letter z
+1D482 MATHEMATICAL BOLD ITALIC SMALL A
+ # <font> 0061 latin small letter a
+1D483 MATHEMATICAL BOLD ITALIC SMALL B
+ # <font> 0062 latin small letter b
+1D484 MATHEMATICAL BOLD ITALIC SMALL C
+ # <font> 0063 latin small letter c
+1D485 MATHEMATICAL BOLD ITALIC SMALL D
+ # <font> 0064 latin small letter d
+1D486 MATHEMATICAL BOLD ITALIC SMALL E
+ # <font> 0065 latin small letter e
+1D487 MATHEMATICAL BOLD ITALIC SMALL F
+ # <font> 0066 latin small letter f
+1D488 MATHEMATICAL BOLD ITALIC SMALL G
+ # <font> 0067 latin small letter g
+1D489 MATHEMATICAL BOLD ITALIC SMALL H
+ # <font> 0068 latin small letter h
+1D48A MATHEMATICAL BOLD ITALIC SMALL I
+ # <font> 0069 latin small letter i
+1D48B MATHEMATICAL BOLD ITALIC SMALL J
+ # <font> 006A latin small letter j
+1D48C MATHEMATICAL BOLD ITALIC SMALL K
+ # <font> 006B latin small letter k
+1D48D MATHEMATICAL BOLD ITALIC SMALL L
+ # <font> 006C latin small letter l
+1D48E MATHEMATICAL BOLD ITALIC SMALL M
+ # <font> 006D latin small letter m
+1D48F MATHEMATICAL BOLD ITALIC SMALL N
+ # <font> 006E latin small letter n
+1D490 MATHEMATICAL BOLD ITALIC SMALL O
+ # <font> 006F latin small letter o
+1D491 MATHEMATICAL BOLD ITALIC SMALL P
+ # <font> 0070 latin small letter p
+1D492 MATHEMATICAL BOLD ITALIC SMALL Q
+ # <font> 0071 latin small letter q
+1D493 MATHEMATICAL BOLD ITALIC SMALL R
+ # <font> 0072 latin small letter r
+1D494 MATHEMATICAL BOLD ITALIC SMALL S
+ # <font> 0073 latin small letter s
+1D495 MATHEMATICAL BOLD ITALIC SMALL T
+ # <font> 0074 latin small letter t
+1D496 MATHEMATICAL BOLD ITALIC SMALL U
+ # <font> 0075 latin small letter u
+1D497 MATHEMATICAL BOLD ITALIC SMALL V
+ # <font> 0076 latin small letter v
+1D498 MATHEMATICAL BOLD ITALIC SMALL W
+ # <font> 0077 latin small letter w
+1D499 MATHEMATICAL BOLD ITALIC SMALL X
+ # <font> 0078 latin small letter x
+1D49A MATHEMATICAL BOLD ITALIC SMALL Y
+ # <font> 0079 latin small letter y
+1D49B MATHEMATICAL BOLD ITALIC SMALL Z
+ # <font> 007A latin small letter z
+@ Script symbols
+@+ Script symbols already encoded in the Letterlike Symbols block are omitted here to avoid duplicate encoding. Fonts that use a less elaborate style are also acceptable for many uses, as long as they can be distinguished from serifed and italic styles.
+1D49C MATHEMATICAL SCRIPT CAPITAL A
+ # <font> 0041 latin capital letter a
+1D49D <reserved>
+ x (script capital b - 212C)
+1D49E MATHEMATICAL SCRIPT CAPITAL C
+ # <font> 0043 latin capital letter c
+1D49F MATHEMATICAL SCRIPT CAPITAL D
+ # <font> 0044 latin capital letter d
+1D4A0 <reserved>
+ x (script capital e - 2130)
+1D4A1 <reserved>
+ x (script capital f - 2131)
+1D4A2 MATHEMATICAL SCRIPT CAPITAL G
+ # <font> 0047 latin capital letter g
+1D4A3 <reserved>
+ x (script capital h - 210B)
+1D4A4 <reserved>
+ x (script capital i - 2110)
+1D4A5 MATHEMATICAL SCRIPT CAPITAL J
+ # <font> 004A latin capital letter j
+1D4A6 MATHEMATICAL SCRIPT CAPITAL K
+ # <font> 004B latin capital letter k
+1D4A7 <reserved>
+ x (script capital l - 2112)
+1D4A8 <reserved>
+ x (script capital m - 2133)
+1D4A9 MATHEMATICAL SCRIPT CAPITAL N
+ # <font> 004E latin capital letter n
+1D4AA MATHEMATICAL SCRIPT CAPITAL O
+ # <font> 004F latin capital letter o
+1D4AB MATHEMATICAL SCRIPT CAPITAL P
+ = power set
+ # <font> 0050 latin capital letter p
+1D4AC MATHEMATICAL SCRIPT CAPITAL Q
+ # <font> 0051 latin capital letter q
+1D4AD <reserved>
+ x (script capital r - 211B)
+1D4AE MATHEMATICAL SCRIPT CAPITAL S
+ # <font> 0053 latin capital letter s
+1D4AF MATHEMATICAL SCRIPT CAPITAL T
+ # <font> 0054 latin capital letter t
+1D4B0 MATHEMATICAL SCRIPT CAPITAL U
+ # <font> 0055 latin capital letter u
+1D4B1 MATHEMATICAL SCRIPT CAPITAL V
+ # <font> 0056 latin capital letter v
+1D4B2 MATHEMATICAL SCRIPT CAPITAL W
+ # <font> 0057 latin capital letter w
+1D4B3 MATHEMATICAL SCRIPT CAPITAL X
+ # <font> 0058 latin capital letter x
+1D4B4 MATHEMATICAL SCRIPT CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D4B5 MATHEMATICAL SCRIPT CAPITAL Z
+ # <font> 005A latin capital letter z
+1D4B6 MATHEMATICAL SCRIPT SMALL A
+ # <font> 0061 latin small letter a
+1D4B7 MATHEMATICAL SCRIPT SMALL B
+ # <font> 0062 latin small letter b
+1D4B8 MATHEMATICAL SCRIPT SMALL C
+ # <font> 0063 latin small letter c
+1D4B9 MATHEMATICAL SCRIPT SMALL D
+ # <font> 0064 latin small letter d
+1D4BA <reserved>
+ x (script small e - 212F)
+1D4BB MATHEMATICAL SCRIPT SMALL F
+ # <font> 0066 latin small letter f
+1D4BC <reserved>
+ x (script small g - 210A)
+1D4BD MATHEMATICAL SCRIPT SMALL H
+ # <font> 0068 latin small letter h
+1D4BE MATHEMATICAL SCRIPT SMALL I
+ # <font> 0069 latin small letter i
+1D4BF MATHEMATICAL SCRIPT SMALL J
+ # <font> 006A latin small letter j
+1D4C0 MATHEMATICAL SCRIPT SMALL K
+ # <font> 006B latin small letter k
+1D4C1 MATHEMATICAL SCRIPT SMALL L
+ x (script small l - 2113)
+ # <font> 006C latin small letter l
+1D4C2 MATHEMATICAL SCRIPT SMALL M
+ # <font> 006D latin small letter m
+1D4C3 MATHEMATICAL SCRIPT SMALL N
+ # <font> 006E latin small letter n
+1D4C4 <reserved>
+ x (script small o - 2134)
+1D4C5 MATHEMATICAL SCRIPT SMALL P
+ # <font> 0070 latin small letter p
+1D4C6 MATHEMATICAL SCRIPT SMALL Q
+ # <font> 0071 latin small letter q
+1D4C7 MATHEMATICAL SCRIPT SMALL R
+ # <font> 0072 latin small letter r
+1D4C8 MATHEMATICAL SCRIPT SMALL S
+ # <font> 0073 latin small letter s
+1D4C9 MATHEMATICAL SCRIPT SMALL T
+ # <font> 0074 latin small letter t
+1D4CA MATHEMATICAL SCRIPT SMALL U
+ # <font> 0075 latin small letter u
+1D4CB MATHEMATICAL SCRIPT SMALL V
+ # <font> 0076 latin small letter v
+1D4CC MATHEMATICAL SCRIPT SMALL W
+ # <font> 0077 latin small letter w
+1D4CD MATHEMATICAL SCRIPT SMALL X
+ # <font> 0078 latin small letter x
+1D4CE MATHEMATICAL SCRIPT SMALL Y
+ # <font> 0079 latin small letter y
+1D4CF MATHEMATICAL SCRIPT SMALL Z
+ # <font> 007A latin small letter z
+@ Bold script symbols
+1D4D0 MATHEMATICAL BOLD SCRIPT CAPITAL A
+ # <font> 0041 latin capital letter a
+1D4D1 MATHEMATICAL BOLD SCRIPT CAPITAL B
+ # <font> 0042 latin capital letter b
+1D4D2 MATHEMATICAL BOLD SCRIPT CAPITAL C
+ # <font> 0043 latin capital letter c
+1D4D3 MATHEMATICAL BOLD SCRIPT CAPITAL D
+ # <font> 0044 latin capital letter d
+1D4D4 MATHEMATICAL BOLD SCRIPT CAPITAL E
+ # <font> 0045 latin capital letter e
+1D4D5 MATHEMATICAL BOLD SCRIPT CAPITAL F
+ # <font> 0046 latin capital letter f
+1D4D6 MATHEMATICAL BOLD SCRIPT CAPITAL G
+ # <font> 0047 latin capital letter g
+1D4D7 MATHEMATICAL BOLD SCRIPT CAPITAL H
+ # <font> 0048 latin capital letter h
+1D4D8 MATHEMATICAL BOLD SCRIPT CAPITAL I
+ # <font> 0049 latin capital letter i
+1D4D9 MATHEMATICAL BOLD SCRIPT CAPITAL J
+ # <font> 004A latin capital letter j
+1D4DA MATHEMATICAL BOLD SCRIPT CAPITAL K
+ # <font> 004B latin capital letter k
+1D4DB MATHEMATICAL BOLD SCRIPT CAPITAL L
+ # <font> 004C latin capital letter l
+1D4DC MATHEMATICAL BOLD SCRIPT CAPITAL M
+ # <font> 004D latin capital letter m
+1D4DD MATHEMATICAL BOLD SCRIPT CAPITAL N
+ # <font> 004E latin capital letter n
+1D4DE MATHEMATICAL BOLD SCRIPT CAPITAL O
+ # <font> 004F latin capital letter o
+1D4DF MATHEMATICAL BOLD SCRIPT CAPITAL P
+ # <font> 0050 latin capital letter p
+1D4E0 MATHEMATICAL BOLD SCRIPT CAPITAL Q
+ # <font> 0051 latin capital letter q
+1D4E1 MATHEMATICAL BOLD SCRIPT CAPITAL R
+ # <font> 0052 latin capital letter r
+1D4E2 MATHEMATICAL BOLD SCRIPT CAPITAL S
+ # <font> 0053 latin capital letter s
+1D4E3 MATHEMATICAL BOLD SCRIPT CAPITAL T
+ # <font> 0054 latin capital letter t
+1D4E4 MATHEMATICAL BOLD SCRIPT CAPITAL U
+ # <font> 0055 latin capital letter u
+1D4E5 MATHEMATICAL BOLD SCRIPT CAPITAL V
+ # <font> 0056 latin capital letter v
+1D4E6 MATHEMATICAL BOLD SCRIPT CAPITAL W
+ # <font> 0057 latin capital letter w
+1D4E7 MATHEMATICAL BOLD SCRIPT CAPITAL X
+ # <font> 0058 latin capital letter x
+1D4E8 MATHEMATICAL BOLD SCRIPT CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D4E9 MATHEMATICAL BOLD SCRIPT CAPITAL Z
+ # <font> 005A latin capital letter z
+1D4EA MATHEMATICAL BOLD SCRIPT SMALL A
+ # <font> 0061 latin small letter a
+1D4EB MATHEMATICAL BOLD SCRIPT SMALL B
+ # <font> 0062 latin small letter b
+1D4EC MATHEMATICAL BOLD SCRIPT SMALL C
+ # <font> 0063 latin small letter c
+1D4ED MATHEMATICAL BOLD SCRIPT SMALL D
+ # <font> 0064 latin small letter d
+1D4EE MATHEMATICAL BOLD SCRIPT SMALL E
+ # <font> 0065 latin small letter e
+1D4EF MATHEMATICAL BOLD SCRIPT SMALL F
+ # <font> 0066 latin small letter f
+1D4F0 MATHEMATICAL BOLD SCRIPT SMALL G
+ # <font> 0067 latin small letter g
+1D4F1 MATHEMATICAL BOLD SCRIPT SMALL H
+ # <font> 0068 latin small letter h
+1D4F2 MATHEMATICAL BOLD SCRIPT SMALL I
+ # <font> 0069 latin small letter i
+1D4F3 MATHEMATICAL BOLD SCRIPT SMALL J
+ # <font> 006A latin small letter j
+1D4F4 MATHEMATICAL BOLD SCRIPT SMALL K
+ # <font> 006B latin small letter k
+1D4F5 MATHEMATICAL BOLD SCRIPT SMALL L
+ # <font> 006C latin small letter l
+1D4F6 MATHEMATICAL BOLD SCRIPT SMALL M
+ # <font> 006D latin small letter m
+1D4F7 MATHEMATICAL BOLD SCRIPT SMALL N
+ # <font> 006E latin small letter n
+1D4F8 MATHEMATICAL BOLD SCRIPT SMALL O
+ # <font> 006F latin small letter o
+1D4F9 MATHEMATICAL BOLD SCRIPT SMALL P
+ # <font> 0070 latin small letter p
+1D4FA MATHEMATICAL BOLD SCRIPT SMALL Q
+ # <font> 0071 latin small letter q
+1D4FB MATHEMATICAL BOLD SCRIPT SMALL R
+ # <font> 0072 latin small letter r
+1D4FC MATHEMATICAL BOLD SCRIPT SMALL S
+ # <font> 0073 latin small letter s
+1D4FD MATHEMATICAL BOLD SCRIPT SMALL T
+ # <font> 0074 latin small letter t
+1D4FE MATHEMATICAL BOLD SCRIPT SMALL U
+ # <font> 0075 latin small letter u
+1D4FF MATHEMATICAL BOLD SCRIPT SMALL V
+ # <font> 0076 latin small letter v
+1D500 MATHEMATICAL BOLD SCRIPT SMALL W
+ # <font> 0077 latin small letter w
+1D501 MATHEMATICAL BOLD SCRIPT SMALL X
+ # <font> 0078 latin small letter x
+1D502 MATHEMATICAL BOLD SCRIPT SMALL Y
+ # <font> 0079 latin small letter y
+1D503 MATHEMATICAL BOLD SCRIPT SMALL Z
+ # <font> 007A latin small letter z
+@ Fraktur symbols
+@+ This style is sometimes known as black-letter. Black-letter symbols already encoded in the Letterlike Symbols block are omitted here to avoid duplicate encoding.
+1D504 MATHEMATICAL FRAKTUR CAPITAL A
+ # <font> 0041 latin capital letter a
+1D505 MATHEMATICAL FRAKTUR CAPITAL B
+ # <font> 0042 latin capital letter b
+1D506 <reserved>
+ x (black-letter capital c - 212D)
+1D507 MATHEMATICAL FRAKTUR CAPITAL D
+ # <font> 0044 latin capital letter d
+1D508 MATHEMATICAL FRAKTUR CAPITAL E
+ # <font> 0045 latin capital letter e
+1D509 MATHEMATICAL FRAKTUR CAPITAL F
+ # <font> 0046 latin capital letter f
+1D50A MATHEMATICAL FRAKTUR CAPITAL G
+ # <font> 0047 latin capital letter g
+1D50B <reserved>
+ x (black-letter capital h - 210C)
+1D50C <reserved>
+ x (black-letter capital i - 2111)
+1D50D MATHEMATICAL FRAKTUR CAPITAL J
+ # <font> 004A latin capital letter j
+1D50E MATHEMATICAL FRAKTUR CAPITAL K
+ # <font> 004B latin capital letter k
+1D50F MATHEMATICAL FRAKTUR CAPITAL L
+ # <font> 004C latin capital letter l
+1D510 MATHEMATICAL FRAKTUR CAPITAL M
+ = New Testament majority text
+ # <font> 004D latin capital letter m
+1D511 MATHEMATICAL FRAKTUR CAPITAL N
+ # <font> 004E latin capital letter n
+1D512 MATHEMATICAL FRAKTUR CAPITAL O
+ # <font> 004F latin capital letter o
+1D513 MATHEMATICAL FRAKTUR CAPITAL P
+ # <font> 0050 latin capital letter p
+1D514 MATHEMATICAL FRAKTUR CAPITAL Q
+ # <font> 0051 latin capital letter q
+1D515 <reserved>
+ x (black-letter capital r - 211C)
+1D516 MATHEMATICAL FRAKTUR CAPITAL S
+ = Septuagint, Greek Old Testament
+ # <font> 0053 latin capital letter s
+1D517 MATHEMATICAL FRAKTUR CAPITAL T
+ # <font> 0054 latin capital letter t
+1D518 MATHEMATICAL FRAKTUR CAPITAL U
+ # <font> 0055 latin capital letter u
+1D519 MATHEMATICAL FRAKTUR CAPITAL V
+ # <font> 0056 latin capital letter v
+1D51A MATHEMATICAL FRAKTUR CAPITAL W
+ # <font> 0057 latin capital letter w
+1D51B MATHEMATICAL FRAKTUR CAPITAL X
+ # <font> 0058 latin capital letter x
+1D51C MATHEMATICAL FRAKTUR CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D51D <reserved>
+ x (black-letter capital z - 2128)
+1D51E MATHEMATICAL FRAKTUR SMALL A
+ # <font> 0061 latin small letter a
+1D51F MATHEMATICAL FRAKTUR SMALL B
+ # <font> 0062 latin small letter b
+1D520 MATHEMATICAL FRAKTUR SMALL C
+ # <font> 0063 latin small letter c
+1D521 MATHEMATICAL FRAKTUR SMALL D
+ # <font> 0064 latin small letter d
+1D522 MATHEMATICAL FRAKTUR SMALL E
+ # <font> 0065 latin small letter e
+1D523 MATHEMATICAL FRAKTUR SMALL F
+ # <font> 0066 latin small letter f
+1D524 MATHEMATICAL FRAKTUR SMALL G
+ # <font> 0067 latin small letter g
+1D525 MATHEMATICAL FRAKTUR SMALL H
+ # <font> 0068 latin small letter h
+1D526 MATHEMATICAL FRAKTUR SMALL I
+ # <font> 0069 latin small letter i
+1D527 MATHEMATICAL FRAKTUR SMALL J
+ # <font> 006A latin small letter j
+1D528 MATHEMATICAL FRAKTUR SMALL K
+ # <font> 006B latin small letter k
+1D529 MATHEMATICAL FRAKTUR SMALL L
+ # <font> 006C latin small letter l
+1D52A MATHEMATICAL FRAKTUR SMALL M
+ # <font> 006D latin small letter m
+1D52B MATHEMATICAL FRAKTUR SMALL N
+ # <font> 006E latin small letter n
+1D52C MATHEMATICAL FRAKTUR SMALL O
+ # <font> 006F latin small letter o
+1D52D MATHEMATICAL FRAKTUR SMALL P
+ # <font> 0070 latin small letter p
+1D52E MATHEMATICAL FRAKTUR SMALL Q
+ # <font> 0071 latin small letter q
+1D52F MATHEMATICAL FRAKTUR SMALL R
+ # <font> 0072 latin small letter r
+1D530 MATHEMATICAL FRAKTUR SMALL S
+ # <font> 0073 latin small letter s
+1D531 MATHEMATICAL FRAKTUR SMALL T
+ # <font> 0074 latin small letter t
+1D532 MATHEMATICAL FRAKTUR SMALL U
+ # <font> 0075 latin small letter u
+1D533 MATHEMATICAL FRAKTUR SMALL V
+ # <font> 0076 latin small letter v
+1D534 MATHEMATICAL FRAKTUR SMALL W
+ # <font> 0077 latin small letter w
+1D535 MATHEMATICAL FRAKTUR SMALL X
+ # <font> 0078 latin small letter x
+1D536 MATHEMATICAL FRAKTUR SMALL Y
+ # <font> 0079 latin small letter y
+1D537 MATHEMATICAL FRAKTUR SMALL Z
+ # <font> 007A latin small letter z
+@ Double-struck symbols
+@+ This style is sometimes known as open-face or blackboard-bold. Double-struck symbols already encoded in the Letterlike Symbols block and omitted here to avoid duplicate encoding. Considerable variation in font style is acceptable, as long as the glyphs retain the visual element of doubled strokes.
+1D538 MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+ * a glyph variant with doubled stroke on the right exists
+ # <font> 0041 latin capital letter a
+1D539 MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+ # <font> 0042 latin capital letter b
+1D53A <reserved>
+ x (double-struck capital c - 2102)
+1D53B MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+ # <font> 0044 latin capital letter d
+1D53C MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+ # <font> 0045 latin capital letter e
+1D53D MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+ # <font> 0046 latin capital letter f
+1D53E MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+ # <font> 0047 latin capital letter g
+1D53F <reserved>
+ x (double-struck capital h - 210D)
+1D540 MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+ # <font> 0049 latin capital letter i
+1D541 MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+ # <font> 004A latin capital letter j
+1D542 MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+ # <font> 004B latin capital letter k
+1D543 MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+ # <font> 004C latin capital letter l
+1D544 MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+ # <font> 004D latin capital letter m
+1D545 <reserved>
+ x (double-struck capital n - 2115)
+1D546 MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+ # <font> 004F latin capital letter o
+1D547 <reserved>
+ x (double-struck capital p - 2119)
+1D548 <reserved>
+ x (double-struck capital q - 211A)
+1D549 <reserved>
+ x (double-struck capital r - 211D)
+1D54A MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+ # <font> 0053 latin capital letter s
+1D54B MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+ # <font> 0054 latin capital letter t
+1D54C MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+ # <font> 0055 latin capital letter u
+1D54D MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+ # <font> 0056 latin capital letter v
+1D54E MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+ # <font> 0057 latin capital letter w
+1D54F MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+ # <font> 0058 latin capital letter x
+1D550 MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D551 <reserved>
+ x (double-struck capital z - 2124)
+1D552 MATHEMATICAL DOUBLE-STRUCK SMALL A
+ # <font> 0061 latin small letter a
+1D553 MATHEMATICAL DOUBLE-STRUCK SMALL B
+ # <font> 0062 latin small letter b
+1D554 MATHEMATICAL DOUBLE-STRUCK SMALL C
+ # <font> 0063 latin small letter c
+1D555 MATHEMATICAL DOUBLE-STRUCK SMALL D
+ # <font> 0064 latin small letter d
+1D556 MATHEMATICAL DOUBLE-STRUCK SMALL E
+ # <font> 0065 latin small letter e
+1D557 MATHEMATICAL DOUBLE-STRUCK SMALL F
+ # <font> 0066 latin small letter f
+1D558 MATHEMATICAL DOUBLE-STRUCK SMALL G
+ # <font> 0067 latin small letter g
+1D559 MATHEMATICAL DOUBLE-STRUCK SMALL H
+ # <font> 0068 latin small letter h
+1D55A MATHEMATICAL DOUBLE-STRUCK SMALL I
+ # <font> 0069 latin small letter i
+1D55B MATHEMATICAL DOUBLE-STRUCK SMALL J
+ # <font> 006A latin small letter j
+1D55C MATHEMATICAL DOUBLE-STRUCK SMALL K
+ # <font> 006B latin small letter k
+1D55D MATHEMATICAL DOUBLE-STRUCK SMALL L
+ # <font> 006C latin small letter l
+1D55E MATHEMATICAL DOUBLE-STRUCK SMALL M
+ # <font> 006D latin small letter m
+1D55F MATHEMATICAL DOUBLE-STRUCK SMALL N
+ # <font> 006E latin small letter n
+1D560 MATHEMATICAL DOUBLE-STRUCK SMALL O
+ # <font> 006F latin small letter o
+1D561 MATHEMATICAL DOUBLE-STRUCK SMALL P
+ # <font> 0070 latin small letter p
+1D562 MATHEMATICAL DOUBLE-STRUCK SMALL Q
+ # <font> 0071 latin small letter q
+1D563 MATHEMATICAL DOUBLE-STRUCK SMALL R
+ # <font> 0072 latin small letter r
+1D564 MATHEMATICAL DOUBLE-STRUCK SMALL S
+ # <font> 0073 latin small letter s
+1D565 MATHEMATICAL DOUBLE-STRUCK SMALL T
+ # <font> 0074 latin small letter t
+1D566 MATHEMATICAL DOUBLE-STRUCK SMALL U
+ # <font> 0075 latin small letter u
+1D567 MATHEMATICAL DOUBLE-STRUCK SMALL V
+ # <font> 0076 latin small letter v
+1D568 MATHEMATICAL DOUBLE-STRUCK SMALL W
+ # <font> 0077 latin small letter w
+1D569 MATHEMATICAL DOUBLE-STRUCK SMALL X
+ # <font> 0078 latin small letter x
+1D56A MATHEMATICAL DOUBLE-STRUCK SMALL Y
+ # <font> 0079 latin small letter y
+1D56B MATHEMATICAL DOUBLE-STRUCK SMALL Z
+ # <font> 007A latin small letter z
+@ Bold Fraktur symbols
+1D56C MATHEMATICAL BOLD FRAKTUR CAPITAL A
+ # <font> 0041 latin capital letter a
+1D56D MATHEMATICAL BOLD FRAKTUR CAPITAL B
+ # <font> 0042 latin capital letter b
+1D56E MATHEMATICAL BOLD FRAKTUR CAPITAL C
+ # <font> 0043 latin capital letter c
+1D56F MATHEMATICAL BOLD FRAKTUR CAPITAL D
+ # <font> 0044 latin capital letter d
+1D570 MATHEMATICAL BOLD FRAKTUR CAPITAL E
+ # <font> 0045 latin capital letter e
+1D571 MATHEMATICAL BOLD FRAKTUR CAPITAL F
+ # <font> 0046 latin capital letter f
+1D572 MATHEMATICAL BOLD FRAKTUR CAPITAL G
+ # <font> 0047 latin capital letter g
+1D573 MATHEMATICAL BOLD FRAKTUR CAPITAL H
+ # <font> 0048 latin capital letter h
+1D574 MATHEMATICAL BOLD FRAKTUR CAPITAL I
+ # <font> 0049 latin capital letter i
+1D575 MATHEMATICAL BOLD FRAKTUR CAPITAL J
+ # <font> 004A latin capital letter j
+1D576 MATHEMATICAL BOLD FRAKTUR CAPITAL K
+ # <font> 004B latin capital letter k
+1D577 MATHEMATICAL BOLD FRAKTUR CAPITAL L
+ # <font> 004C latin capital letter l
+1D578 MATHEMATICAL BOLD FRAKTUR CAPITAL M
+ # <font> 004D latin capital letter m
+1D579 MATHEMATICAL BOLD FRAKTUR CAPITAL N
+ # <font> 004E latin capital letter n
+1D57A MATHEMATICAL BOLD FRAKTUR CAPITAL O
+ # <font> 004F latin capital letter o
+1D57B MATHEMATICAL BOLD FRAKTUR CAPITAL P
+ # <font> 0050 latin capital letter p
+1D57C MATHEMATICAL BOLD FRAKTUR CAPITAL Q
+ # <font> 0051 latin capital letter q
+1D57D MATHEMATICAL BOLD FRAKTUR CAPITAL R
+ # <font> 0052 latin capital letter r
+1D57E MATHEMATICAL BOLD FRAKTUR CAPITAL S
+ # <font> 0053 latin capital letter s
+1D57F MATHEMATICAL BOLD FRAKTUR CAPITAL T
+ # <font> 0054 latin capital letter t
+1D580 MATHEMATICAL BOLD FRAKTUR CAPITAL U
+ # <font> 0055 latin capital letter u
+1D581 MATHEMATICAL BOLD FRAKTUR CAPITAL V
+ # <font> 0056 latin capital letter v
+1D582 MATHEMATICAL BOLD FRAKTUR CAPITAL W
+ # <font> 0057 latin capital letter w
+1D583 MATHEMATICAL BOLD FRAKTUR CAPITAL X
+ # <font> 0058 latin capital letter x
+1D584 MATHEMATICAL BOLD FRAKTUR CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D585 MATHEMATICAL BOLD FRAKTUR CAPITAL Z
+ # <font> 005A latin capital letter z
+1D586 MATHEMATICAL BOLD FRAKTUR SMALL A
+ # <font> 0061 latin small letter a
+1D587 MATHEMATICAL BOLD FRAKTUR SMALL B
+ # <font> 0062 latin small letter b
+1D588 MATHEMATICAL BOLD FRAKTUR SMALL C
+ # <font> 0063 latin small letter c
+1D589 MATHEMATICAL BOLD FRAKTUR SMALL D
+ # <font> 0064 latin small letter d
+1D58A MATHEMATICAL BOLD FRAKTUR SMALL E
+ # <font> 0065 latin small letter e
+1D58B MATHEMATICAL BOLD FRAKTUR SMALL F
+ # <font> 0066 latin small letter f
+1D58C MATHEMATICAL BOLD FRAKTUR SMALL G
+ # <font> 0067 latin small letter g
+1D58D MATHEMATICAL BOLD FRAKTUR SMALL H
+ # <font> 0068 latin small letter h
+1D58E MATHEMATICAL BOLD FRAKTUR SMALL I
+ # <font> 0069 latin small letter i
+1D58F MATHEMATICAL BOLD FRAKTUR SMALL J
+ # <font> 006A latin small letter j
+1D590 MATHEMATICAL BOLD FRAKTUR SMALL K
+ # <font> 006B latin small letter k
+1D591 MATHEMATICAL BOLD FRAKTUR SMALL L
+ # <font> 006C latin small letter l
+1D592 MATHEMATICAL BOLD FRAKTUR SMALL M
+ # <font> 006D latin small letter m
+1D593 MATHEMATICAL BOLD FRAKTUR SMALL N
+ # <font> 006E latin small letter n
+1D594 MATHEMATICAL BOLD FRAKTUR SMALL O
+ # <font> 006F latin small letter o
+1D595 MATHEMATICAL BOLD FRAKTUR SMALL P
+ # <font> 0070 latin small letter p
+1D596 MATHEMATICAL BOLD FRAKTUR SMALL Q
+ # <font> 0071 latin small letter q
+1D597 MATHEMATICAL BOLD FRAKTUR SMALL R
+ # <font> 0072 latin small letter r
+1D598 MATHEMATICAL BOLD FRAKTUR SMALL S
+ # <font> 0073 latin small letter s
+1D599 MATHEMATICAL BOLD FRAKTUR SMALL T
+ # <font> 0074 latin small letter t
+1D59A MATHEMATICAL BOLD FRAKTUR SMALL U
+ # <font> 0075 latin small letter u
+1D59B MATHEMATICAL BOLD FRAKTUR SMALL V
+ # <font> 0076 latin small letter v
+1D59C MATHEMATICAL BOLD FRAKTUR SMALL W
+ # <font> 0077 latin small letter w
+1D59D MATHEMATICAL BOLD FRAKTUR SMALL X
+ # <font> 0078 latin small letter x
+1D59E MATHEMATICAL BOLD FRAKTUR SMALL Y
+ # <font> 0079 latin small letter y
+1D59F MATHEMATICAL BOLD FRAKTUR SMALL Z
+ # <font> 007A latin small letter z
+@ Sans-serif symbols
+1D5A0 MATHEMATICAL SANS-SERIF CAPITAL A
+ # <font> 0041 latin capital letter a
+1D5A1 MATHEMATICAL SANS-SERIF CAPITAL B
+ # <font> 0042 latin capital letter b
+1D5A2 MATHEMATICAL SANS-SERIF CAPITAL C
+ # <font> 0043 latin capital letter c
+1D5A3 MATHEMATICAL SANS-SERIF CAPITAL D
+ # <font> 0044 latin capital letter d
+1D5A4 MATHEMATICAL SANS-SERIF CAPITAL E
+ # <font> 0045 latin capital letter e
+1D5A5 MATHEMATICAL SANS-SERIF CAPITAL F
+ # <font> 0046 latin capital letter f
+1D5A6 MATHEMATICAL SANS-SERIF CAPITAL G
+ # <font> 0047 latin capital letter g
+1D5A7 MATHEMATICAL SANS-SERIF CAPITAL H
+ # <font> 0048 latin capital letter h
+1D5A8 MATHEMATICAL SANS-SERIF CAPITAL I
+ # <font> 0049 latin capital letter i
+1D5A9 MATHEMATICAL SANS-SERIF CAPITAL J
+ # <font> 004A latin capital letter j
+1D5AA MATHEMATICAL SANS-SERIF CAPITAL K
+ # <font> 004B latin capital letter k
+1D5AB MATHEMATICAL SANS-SERIF CAPITAL L
+ # <font> 004C latin capital letter l
+1D5AC MATHEMATICAL SANS-SERIF CAPITAL M
+ # <font> 004D latin capital letter m
+1D5AD MATHEMATICAL SANS-SERIF CAPITAL N
+ # <font> 004E latin capital letter n
+1D5AE MATHEMATICAL SANS-SERIF CAPITAL O
+ # <font> 004F latin capital letter o
+1D5AF MATHEMATICAL SANS-SERIF CAPITAL P
+ # <font> 0050 latin capital letter p
+1D5B0 MATHEMATICAL SANS-SERIF CAPITAL Q
+ # <font> 0051 latin capital letter q
+1D5B1 MATHEMATICAL SANS-SERIF CAPITAL R
+ # <font> 0052 latin capital letter r
+1D5B2 MATHEMATICAL SANS-SERIF CAPITAL S
+ # <font> 0053 latin capital letter s
+1D5B3 MATHEMATICAL SANS-SERIF CAPITAL T
+ # <font> 0054 latin capital letter t
+1D5B4 MATHEMATICAL SANS-SERIF CAPITAL U
+ # <font> 0055 latin capital letter u
+1D5B5 MATHEMATICAL SANS-SERIF CAPITAL V
+ # <font> 0056 latin capital letter v
+1D5B6 MATHEMATICAL SANS-SERIF CAPITAL W
+ # <font> 0057 latin capital letter w
+1D5B7 MATHEMATICAL SANS-SERIF CAPITAL X
+ # <font> 0058 latin capital letter x
+1D5B8 MATHEMATICAL SANS-SERIF CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D5B9 MATHEMATICAL SANS-SERIF CAPITAL Z
+ # <font> 005A latin capital letter z
+1D5BA MATHEMATICAL SANS-SERIF SMALL A
+ # <font> 0061 latin small letter a
+1D5BB MATHEMATICAL SANS-SERIF SMALL B
+ # <font> 0062 latin small letter b
+1D5BC MATHEMATICAL SANS-SERIF SMALL C
+ # <font> 0063 latin small letter c
+1D5BD MATHEMATICAL SANS-SERIF SMALL D
+ # <font> 0064 latin small letter d
+1D5BE MATHEMATICAL SANS-SERIF SMALL E
+ # <font> 0065 latin small letter e
+1D5BF MATHEMATICAL SANS-SERIF SMALL F
+ # <font> 0066 latin small letter f
+1D5C0 MATHEMATICAL SANS-SERIF SMALL G
+ # <font> 0067 latin small letter g
+1D5C1 MATHEMATICAL SANS-SERIF SMALL H
+ # <font> 0068 latin small letter h
+1D5C2 MATHEMATICAL SANS-SERIF SMALL I
+ # <font> 0069 latin small letter i
+1D5C3 MATHEMATICAL SANS-SERIF SMALL J
+ # <font> 006A latin small letter j
+1D5C4 MATHEMATICAL SANS-SERIF SMALL K
+ # <font> 006B latin small letter k
+1D5C5 MATHEMATICAL SANS-SERIF SMALL L
+ # <font> 006C latin small letter l
+1D5C6 MATHEMATICAL SANS-SERIF SMALL M
+ # <font> 006D latin small letter m
+1D5C7 MATHEMATICAL SANS-SERIF SMALL N
+ # <font> 006E latin small letter n
+1D5C8 MATHEMATICAL SANS-SERIF SMALL O
+ # <font> 006F latin small letter o
+1D5C9 MATHEMATICAL SANS-SERIF SMALL P
+ # <font> 0070 latin small letter p
+1D5CA MATHEMATICAL SANS-SERIF SMALL Q
+ # <font> 0071 latin small letter q
+1D5CB MATHEMATICAL SANS-SERIF SMALL R
+ # <font> 0072 latin small letter r
+1D5CC MATHEMATICAL SANS-SERIF SMALL S
+ # <font> 0073 latin small letter s
+1D5CD MATHEMATICAL SANS-SERIF SMALL T
+ # <font> 0074 latin small letter t
+1D5CE MATHEMATICAL SANS-SERIF SMALL U
+ # <font> 0075 latin small letter u
+1D5CF MATHEMATICAL SANS-SERIF SMALL V
+ # <font> 0076 latin small letter v
+1D5D0 MATHEMATICAL SANS-SERIF SMALL W
+ # <font> 0077 latin small letter w
+1D5D1 MATHEMATICAL SANS-SERIF SMALL X
+ # <font> 0078 latin small letter x
+1D5D2 MATHEMATICAL SANS-SERIF SMALL Y
+ # <font> 0079 latin small letter y
+1D5D3 MATHEMATICAL SANS-SERIF SMALL Z
+ # <font> 007A latin small letter z
+@ Sans-serif bold symbols
+1D5D4 MATHEMATICAL SANS-SERIF BOLD CAPITAL A
+ # <font> 0041 latin capital letter a
+1D5D5 MATHEMATICAL SANS-SERIF BOLD CAPITAL B
+ # <font> 0042 latin capital letter b
+1D5D6 MATHEMATICAL SANS-SERIF BOLD CAPITAL C
+ # <font> 0043 latin capital letter c
+1D5D7 MATHEMATICAL SANS-SERIF BOLD CAPITAL D
+ # <font> 0044 latin capital letter d
+1D5D8 MATHEMATICAL SANS-SERIF BOLD CAPITAL E
+ # <font> 0045 latin capital letter e
+1D5D9 MATHEMATICAL SANS-SERIF BOLD CAPITAL F
+ # <font> 0046 latin capital letter f
+1D5DA MATHEMATICAL SANS-SERIF BOLD CAPITAL G
+ # <font> 0047 latin capital letter g
+1D5DB MATHEMATICAL SANS-SERIF BOLD CAPITAL H
+ # <font> 0048 latin capital letter h
+1D5DC MATHEMATICAL SANS-SERIF BOLD CAPITAL I
+ # <font> 0049 latin capital letter i
+1D5DD MATHEMATICAL SANS-SERIF BOLD CAPITAL J
+ # <font> 004A latin capital letter j
+1D5DE MATHEMATICAL SANS-SERIF BOLD CAPITAL K
+ # <font> 004B latin capital letter k
+1D5DF MATHEMATICAL SANS-SERIF BOLD CAPITAL L
+ # <font> 004C latin capital letter l
+1D5E0 MATHEMATICAL SANS-SERIF BOLD CAPITAL M
+ # <font> 004D latin capital letter m
+1D5E1 MATHEMATICAL SANS-SERIF BOLD CAPITAL N
+ # <font> 004E latin capital letter n
+1D5E2 MATHEMATICAL SANS-SERIF BOLD CAPITAL O
+ # <font> 004F latin capital letter o
+1D5E3 MATHEMATICAL SANS-SERIF BOLD CAPITAL P
+ # <font> 0050 latin capital letter p
+1D5E4 MATHEMATICAL SANS-SERIF BOLD CAPITAL Q
+ # <font> 0051 latin capital letter q
+1D5E5 MATHEMATICAL SANS-SERIF BOLD CAPITAL R
+ # <font> 0052 latin capital letter r
+1D5E6 MATHEMATICAL SANS-SERIF BOLD CAPITAL S
+ # <font> 0053 latin capital letter s
+1D5E7 MATHEMATICAL SANS-SERIF BOLD CAPITAL T
+ # <font> 0054 latin capital letter t
+1D5E8 MATHEMATICAL SANS-SERIF BOLD CAPITAL U
+ # <font> 0055 latin capital letter u
+1D5E9 MATHEMATICAL SANS-SERIF BOLD CAPITAL V
+ # <font> 0056 latin capital letter v
+1D5EA MATHEMATICAL SANS-SERIF BOLD CAPITAL W
+ # <font> 0057 latin capital letter w
+1D5EB MATHEMATICAL SANS-SERIF BOLD CAPITAL X
+ # <font> 0058 latin capital letter x
+1D5EC MATHEMATICAL SANS-SERIF BOLD CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D5ED MATHEMATICAL SANS-SERIF BOLD CAPITAL Z
+ # <font> 005A latin capital letter z
+1D5EE MATHEMATICAL SANS-SERIF BOLD SMALL A
+ # <font> 0061 latin small letter a
+1D5EF MATHEMATICAL SANS-SERIF BOLD SMALL B
+ # <font> 0062 latin small letter b
+1D5F0 MATHEMATICAL SANS-SERIF BOLD SMALL C
+ # <font> 0063 latin small letter c
+1D5F1 MATHEMATICAL SANS-SERIF BOLD SMALL D
+ # <font> 0064 latin small letter d
+1D5F2 MATHEMATICAL SANS-SERIF BOLD SMALL E
+ # <font> 0065 latin small letter e
+1D5F3 MATHEMATICAL SANS-SERIF BOLD SMALL F
+ # <font> 0066 latin small letter f
+1D5F4 MATHEMATICAL SANS-SERIF BOLD SMALL G
+ # <font> 0067 latin small letter g
+1D5F5 MATHEMATICAL SANS-SERIF BOLD SMALL H
+ # <font> 0068 latin small letter h
+1D5F6 MATHEMATICAL SANS-SERIF BOLD SMALL I
+ # <font> 0069 latin small letter i
+1D5F7 MATHEMATICAL SANS-SERIF BOLD SMALL J
+ # <font> 006A latin small letter j
+1D5F8 MATHEMATICAL SANS-SERIF BOLD SMALL K
+ # <font> 006B latin small letter k
+1D5F9 MATHEMATICAL SANS-SERIF BOLD SMALL L
+ # <font> 006C latin small letter l
+1D5FA MATHEMATICAL SANS-SERIF BOLD SMALL M
+ # <font> 006D latin small letter m
+1D5FB MATHEMATICAL SANS-SERIF BOLD SMALL N
+ # <font> 006E latin small letter n
+1D5FC MATHEMATICAL SANS-SERIF BOLD SMALL O
+ # <font> 006F latin small letter o
+1D5FD MATHEMATICAL SANS-SERIF BOLD SMALL P
+ # <font> 0070 latin small letter p
+1D5FE MATHEMATICAL SANS-SERIF BOLD SMALL Q
+ # <font> 0071 latin small letter q
+1D5FF MATHEMATICAL SANS-SERIF BOLD SMALL R
+ # <font> 0072 latin small letter r
+1D600 MATHEMATICAL SANS-SERIF BOLD SMALL S
+ # <font> 0073 latin small letter s
+1D601 MATHEMATICAL SANS-SERIF BOLD SMALL T
+ # <font> 0074 latin small letter t
+1D602 MATHEMATICAL SANS-SERIF BOLD SMALL U
+ # <font> 0075 latin small letter u
+1D603 MATHEMATICAL SANS-SERIF BOLD SMALL V
+ # <font> 0076 latin small letter v
+1D604 MATHEMATICAL SANS-SERIF BOLD SMALL W
+ # <font> 0077 latin small letter w
+1D605 MATHEMATICAL SANS-SERIF BOLD SMALL X
+ # <font> 0078 latin small letter x
+1D606 MATHEMATICAL SANS-SERIF BOLD SMALL Y
+ # <font> 0079 latin small letter y
+1D607 MATHEMATICAL SANS-SERIF BOLD SMALL Z
+ # <font> 007A latin small letter z
+@ Sans-serif italic symbols
+1D608 MATHEMATICAL SANS-SERIF ITALIC CAPITAL A
+ # <font> 0041 latin capital letter a
+1D609 MATHEMATICAL SANS-SERIF ITALIC CAPITAL B
+ # <font> 0042 latin capital letter b
+1D60A MATHEMATICAL SANS-SERIF ITALIC CAPITAL C
+ # <font> 0043 latin capital letter c
+1D60B MATHEMATICAL SANS-SERIF ITALIC CAPITAL D
+ # <font> 0044 latin capital letter d
+1D60C MATHEMATICAL SANS-SERIF ITALIC CAPITAL E
+ # <font> 0045 latin capital letter e
+1D60D MATHEMATICAL SANS-SERIF ITALIC CAPITAL F
+ # <font> 0046 latin capital letter f
+1D60E MATHEMATICAL SANS-SERIF ITALIC CAPITAL G
+ # <font> 0047 latin capital letter g
+1D60F MATHEMATICAL SANS-SERIF ITALIC CAPITAL H
+ # <font> 0048 latin capital letter h
+1D610 MATHEMATICAL SANS-SERIF ITALIC CAPITAL I
+ # <font> 0049 latin capital letter i
+1D611 MATHEMATICAL SANS-SERIF ITALIC CAPITAL J
+ # <font> 004A latin capital letter j
+1D612 MATHEMATICAL SANS-SERIF ITALIC CAPITAL K
+ # <font> 004B latin capital letter k
+1D613 MATHEMATICAL SANS-SERIF ITALIC CAPITAL L
+ # <font> 004C latin capital letter l
+1D614 MATHEMATICAL SANS-SERIF ITALIC CAPITAL M
+ # <font> 004D latin capital letter m
+1D615 MATHEMATICAL SANS-SERIF ITALIC CAPITAL N
+ # <font> 004E latin capital letter n
+1D616 MATHEMATICAL SANS-SERIF ITALIC CAPITAL O
+ # <font> 004F latin capital letter o
+1D617 MATHEMATICAL SANS-SERIF ITALIC CAPITAL P
+ # <font> 0050 latin capital letter p
+1D618 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q
+ # <font> 0051 latin capital letter q
+1D619 MATHEMATICAL SANS-SERIF ITALIC CAPITAL R
+ # <font> 0052 latin capital letter r
+1D61A MATHEMATICAL SANS-SERIF ITALIC CAPITAL S
+ # <font> 0053 latin capital letter s
+1D61B MATHEMATICAL SANS-SERIF ITALIC CAPITAL T
+ # <font> 0054 latin capital letter t
+1D61C MATHEMATICAL SANS-SERIF ITALIC CAPITAL U
+ # <font> 0055 latin capital letter u
+1D61D MATHEMATICAL SANS-SERIF ITALIC CAPITAL V
+ # <font> 0056 latin capital letter v
+1D61E MATHEMATICAL SANS-SERIF ITALIC CAPITAL W
+ # <font> 0057 latin capital letter w
+1D61F MATHEMATICAL SANS-SERIF ITALIC CAPITAL X
+ # <font> 0058 latin capital letter x
+1D620 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D621 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z
+ # <font> 005A latin capital letter z
+1D622 MATHEMATICAL SANS-SERIF ITALIC SMALL A
+ # <font> 0061 latin small letter a
+1D623 MATHEMATICAL SANS-SERIF ITALIC SMALL B
+ # <font> 0062 latin small letter b
+1D624 MATHEMATICAL SANS-SERIF ITALIC SMALL C
+ # <font> 0063 latin small letter c
+1D625 MATHEMATICAL SANS-SERIF ITALIC SMALL D
+ # <font> 0064 latin small letter d
+1D626 MATHEMATICAL SANS-SERIF ITALIC SMALL E
+ # <font> 0065 latin small letter e
+1D627 MATHEMATICAL SANS-SERIF ITALIC SMALL F
+ # <font> 0066 latin small letter f
+1D628 MATHEMATICAL SANS-SERIF ITALIC SMALL G
+ # <font> 0067 latin small letter g
+1D629 MATHEMATICAL SANS-SERIF ITALIC SMALL H
+ # <font> 0068 latin small letter h
+1D62A MATHEMATICAL SANS-SERIF ITALIC SMALL I
+ # <font> 0069 latin small letter i
+1D62B MATHEMATICAL SANS-SERIF ITALIC SMALL J
+ # <font> 006A latin small letter j
+1D62C MATHEMATICAL SANS-SERIF ITALIC SMALL K
+ # <font> 006B latin small letter k
+1D62D MATHEMATICAL SANS-SERIF ITALIC SMALL L
+ # <font> 006C latin small letter l
+1D62E MATHEMATICAL SANS-SERIF ITALIC SMALL M
+ # <font> 006D latin small letter m
+1D62F MATHEMATICAL SANS-SERIF ITALIC SMALL N
+ # <font> 006E latin small letter n
+1D630 MATHEMATICAL SANS-SERIF ITALIC SMALL O
+ # <font> 006F latin small letter o
+1D631 MATHEMATICAL SANS-SERIF ITALIC SMALL P
+ # <font> 0070 latin small letter p
+1D632 MATHEMATICAL SANS-SERIF ITALIC SMALL Q
+ # <font> 0071 latin small letter q
+1D633 MATHEMATICAL SANS-SERIF ITALIC SMALL R
+ # <font> 0072 latin small letter r
+1D634 MATHEMATICAL SANS-SERIF ITALIC SMALL S
+ # <font> 0073 latin small letter s
+1D635 MATHEMATICAL SANS-SERIF ITALIC SMALL T
+ # <font> 0074 latin small letter t
+1D636 MATHEMATICAL SANS-SERIF ITALIC SMALL U
+ # <font> 0075 latin small letter u
+1D637 MATHEMATICAL SANS-SERIF ITALIC SMALL V
+ # <font> 0076 latin small letter v
+1D638 MATHEMATICAL SANS-SERIF ITALIC SMALL W
+ # <font> 0077 latin small letter w
+1D639 MATHEMATICAL SANS-SERIF ITALIC SMALL X
+ # <font> 0078 latin small letter x
+1D63A MATHEMATICAL SANS-SERIF ITALIC SMALL Y
+ # <font> 0079 latin small letter y
+1D63B MATHEMATICAL SANS-SERIF ITALIC SMALL Z
+ # <font> 007A latin small letter z
+@ Sans-serif bold italic symbols
+1D63C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A
+ # <font> 0041 latin capital letter a
+1D63D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B
+ # <font> 0042 latin capital letter b
+1D63E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C
+ # <font> 0043 latin capital letter c
+1D63F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D
+ # <font> 0044 latin capital letter d
+1D640 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E
+ # <font> 0045 latin capital letter e
+1D641 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F
+ # <font> 0046 latin capital letter f
+1D642 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G
+ # <font> 0047 latin capital letter g
+1D643 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H
+ # <font> 0048 latin capital letter h
+1D644 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I
+ # <font> 0049 latin capital letter i
+1D645 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J
+ # <font> 004A latin capital letter j
+1D646 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K
+ # <font> 004B latin capital letter k
+1D647 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L
+ # <font> 004C latin capital letter l
+1D648 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M
+ # <font> 004D latin capital letter m
+1D649 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N
+ # <font> 004E latin capital letter n
+1D64A MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O
+ # <font> 004F latin capital letter o
+1D64B MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P
+ # <font> 0050 latin capital letter p
+1D64C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q
+ # <font> 0051 latin capital letter q
+1D64D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R
+ # <font> 0052 latin capital letter r
+1D64E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S
+ # <font> 0053 latin capital letter s
+1D64F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T
+ # <font> 0054 latin capital letter t
+1D650 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U
+ # <font> 0055 latin capital letter u
+1D651 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V
+ # <font> 0056 latin capital letter v
+1D652 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W
+ # <font> 0057 latin capital letter w
+1D653 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X
+ # <font> 0058 latin capital letter x
+1D654 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D655 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z
+ # <font> 005A latin capital letter z
+1D656 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A
+ # <font> 0061 latin small letter a
+1D657 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B
+ # <font> 0062 latin small letter b
+1D658 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C
+ # <font> 0063 latin small letter c
+1D659 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D
+ # <font> 0064 latin small letter d
+1D65A MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E
+ # <font> 0065 latin small letter e
+1D65B MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F
+ # <font> 0066 latin small letter f
+1D65C MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G
+ # <font> 0067 latin small letter g
+1D65D MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H
+ # <font> 0068 latin small letter h
+1D65E MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I
+ # <font> 0069 latin small letter i
+1D65F MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+ # <font> 006A latin small letter j
+1D660 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K
+ # <font> 006B latin small letter k
+1D661 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L
+ # <font> 006C latin small letter l
+1D662 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M
+ # <font> 006D latin small letter m
+1D663 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N
+ # <font> 006E latin small letter n
+1D664 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O
+ # <font> 006F latin small letter o
+1D665 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P
+ # <font> 0070 latin small letter p
+1D666 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q
+ # <font> 0071 latin small letter q
+1D667 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R
+ # <font> 0072 latin small letter r
+1D668 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S
+ # <font> 0073 latin small letter s
+1D669 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T
+ # <font> 0074 latin small letter t
+1D66A MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U
+ # <font> 0075 latin small letter u
+1D66B MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V
+ # <font> 0076 latin small letter v
+1D66C MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W
+ # <font> 0077 latin small letter w
+1D66D MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X
+ # <font> 0078 latin small letter x
+1D66E MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y
+ # <font> 0079 latin small letter y
+1D66F MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z
+ # <font> 007A latin small letter z
+@ Monospace symbols
+1D670 MATHEMATICAL MONOSPACE CAPITAL A
+ # <font> 0041 latin capital letter a
+1D671 MATHEMATICAL MONOSPACE CAPITAL B
+ # <font> 0042 latin capital letter b
+1D672 MATHEMATICAL MONOSPACE CAPITAL C
+ # <font> 0043 latin capital letter c
+1D673 MATHEMATICAL MONOSPACE CAPITAL D
+ # <font> 0044 latin capital letter d
+1D674 MATHEMATICAL MONOSPACE CAPITAL E
+ # <font> 0045 latin capital letter e
+1D675 MATHEMATICAL MONOSPACE CAPITAL F
+ # <font> 0046 latin capital letter f
+1D676 MATHEMATICAL MONOSPACE CAPITAL G
+ # <font> 0047 latin capital letter g
+1D677 MATHEMATICAL MONOSPACE CAPITAL H
+ # <font> 0048 latin capital letter h
+1D678 MATHEMATICAL MONOSPACE CAPITAL I
+ # <font> 0049 latin capital letter i
+1D679 MATHEMATICAL MONOSPACE CAPITAL J
+ # <font> 004A latin capital letter j
+1D67A MATHEMATICAL MONOSPACE CAPITAL K
+ # <font> 004B latin capital letter k
+1D67B MATHEMATICAL MONOSPACE CAPITAL L
+ # <font> 004C latin capital letter l
+1D67C MATHEMATICAL MONOSPACE CAPITAL M
+ # <font> 004D latin capital letter m
+1D67D MATHEMATICAL MONOSPACE CAPITAL N
+ # <font> 004E latin capital letter n
+1D67E MATHEMATICAL MONOSPACE CAPITAL O
+ # <font> 004F latin capital letter o
+1D67F MATHEMATICAL MONOSPACE CAPITAL P
+ # <font> 0050 latin capital letter p
+1D680 MATHEMATICAL MONOSPACE CAPITAL Q
+ # <font> 0051 latin capital letter q
+1D681 MATHEMATICAL MONOSPACE CAPITAL R
+ # <font> 0052 latin capital letter r
+1D682 MATHEMATICAL MONOSPACE CAPITAL S
+ # <font> 0053 latin capital letter s
+1D683 MATHEMATICAL MONOSPACE CAPITAL T
+ # <font> 0054 latin capital letter t
+1D684 MATHEMATICAL MONOSPACE CAPITAL U
+ # <font> 0055 latin capital letter u
+1D685 MATHEMATICAL MONOSPACE CAPITAL V
+ # <font> 0056 latin capital letter v
+1D686 MATHEMATICAL MONOSPACE CAPITAL W
+ # <font> 0057 latin capital letter w
+1D687 MATHEMATICAL MONOSPACE CAPITAL X
+ # <font> 0058 latin capital letter x
+1D688 MATHEMATICAL MONOSPACE CAPITAL Y
+ # <font> 0059 latin capital letter y
+1D689 MATHEMATICAL MONOSPACE CAPITAL Z
+ # <font> 005A latin capital letter z
+1D68A MATHEMATICAL MONOSPACE SMALL A
+ # <font> 0061 latin small letter a
+1D68B MATHEMATICAL MONOSPACE SMALL B
+ # <font> 0062 latin small letter b
+1D68C MATHEMATICAL MONOSPACE SMALL C
+ # <font> 0063 latin small letter c
+1D68D MATHEMATICAL MONOSPACE SMALL D
+ # <font> 0064 latin small letter d
+1D68E MATHEMATICAL MONOSPACE SMALL E
+ # <font> 0065 latin small letter e
+1D68F MATHEMATICAL MONOSPACE SMALL F
+ # <font> 0066 latin small letter f
+1D690 MATHEMATICAL MONOSPACE SMALL G
+ # <font> 0067 latin small letter g
+1D691 MATHEMATICAL MONOSPACE SMALL H
+ # <font> 0068 latin small letter h
+1D692 MATHEMATICAL MONOSPACE SMALL I
+ # <font> 0069 latin small letter i
+1D693 MATHEMATICAL MONOSPACE SMALL J
+ # <font> 006A latin small letter j
+1D694 MATHEMATICAL MONOSPACE SMALL K
+ # <font> 006B latin small letter k
+1D695 MATHEMATICAL MONOSPACE SMALL L
+ # <font> 006C latin small letter l
+1D696 MATHEMATICAL MONOSPACE SMALL M
+ # <font> 006D latin small letter m
+1D697 MATHEMATICAL MONOSPACE SMALL N
+ # <font> 006E latin small letter n
+1D698 MATHEMATICAL MONOSPACE SMALL O
+ # <font> 006F latin small letter o
+1D699 MATHEMATICAL MONOSPACE SMALL P
+ # <font> 0070 latin small letter p
+1D69A MATHEMATICAL MONOSPACE SMALL Q
+ # <font> 0071 latin small letter q
+1D69B MATHEMATICAL MONOSPACE SMALL R
+ # <font> 0072 latin small letter r
+1D69C MATHEMATICAL MONOSPACE SMALL S
+ # <font> 0073 latin small letter s
+1D69D MATHEMATICAL MONOSPACE SMALL T
+ # <font> 0074 latin small letter t
+1D69E MATHEMATICAL MONOSPACE SMALL U
+ # <font> 0075 latin small letter u
+1D69F MATHEMATICAL MONOSPACE SMALL V
+ # <font> 0076 latin small letter v
+1D6A0 MATHEMATICAL MONOSPACE SMALL W
+ # <font> 0077 latin small letter w
+1D6A1 MATHEMATICAL MONOSPACE SMALL X
+ # <font> 0078 latin small letter x
+1D6A2 MATHEMATICAL MONOSPACE SMALL Y
+ # <font> 0079 latin small letter y
+1D6A3 MATHEMATICAL MONOSPACE SMALL Z
+ # <font> 007A latin small letter z
+@ Dotless symbols
+@+ For use as independent symbols. These are not required as base characters for accents since regular i and j are soft-dotted in Unicode.
+1D6A4 MATHEMATICAL ITALIC SMALL DOTLESS I
+ = \imath
+ x (latin small letter dotless i - 0131)
+ x (mathematical italic small i - 1D456)
+ # <font> 0131 latin small letter dotless i
+1D6A5 MATHEMATICAL ITALIC SMALL DOTLESS J
+ = \jmath
+ x (latin small letter dotless j - 0237)
+ x (mathematical italic small j - 1D457)
+ # <font> 0237 latin small letter dotless j
+@ Bold Greek symbols
+1D6A8 MATHEMATICAL BOLD CAPITAL ALPHA
+ # <font> 0391 greek capital letter alpha
+1D6A9 MATHEMATICAL BOLD CAPITAL BETA
+ # <font> 0392 greek capital letter beta
+1D6AA MATHEMATICAL BOLD CAPITAL GAMMA
+ # <font> 0393 greek capital letter gamma
+1D6AB MATHEMATICAL BOLD CAPITAL DELTA
+ # <font> 0394 greek capital letter delta
+1D6AC MATHEMATICAL BOLD CAPITAL EPSILON
+ # <font> 0395 greek capital letter epsilon
+1D6AD MATHEMATICAL BOLD CAPITAL ZETA
+ # <font> 0396 greek capital letter zeta
+1D6AE MATHEMATICAL BOLD CAPITAL ETA
+ # <font> 0397 greek capital letter eta
+1D6AF MATHEMATICAL BOLD CAPITAL THETA
+ # <font> 0398 greek capital letter theta
+1D6B0 MATHEMATICAL BOLD CAPITAL IOTA
+ # <font> 0399 greek capital letter iota
+1D6B1 MATHEMATICAL BOLD CAPITAL KAPPA
+ # <font> 039A greek capital letter kappa
+1D6B2 MATHEMATICAL BOLD CAPITAL LAMDA
+ # <font> 039B greek capital letter lamda
+1D6B3 MATHEMATICAL BOLD CAPITAL MU
+ # <font> 039C greek capital letter mu
+1D6B4 MATHEMATICAL BOLD CAPITAL NU
+ # <font> 039D greek capital letter nu
+1D6B5 MATHEMATICAL BOLD CAPITAL XI
+ # <font> 039E greek capital letter xi
+1D6B6 MATHEMATICAL BOLD CAPITAL OMICRON
+ # <font> 039F greek capital letter omicron
+1D6B7 MATHEMATICAL BOLD CAPITAL PI
+ # <font> 03A0 greek capital letter pi
+1D6B8 MATHEMATICAL BOLD CAPITAL RHO
+ # <font> 03A1 greek capital letter rho
+1D6B9 MATHEMATICAL BOLD CAPITAL THETA SYMBOL
+ # <font> 03F4 greek capital theta symbol
+1D6BA MATHEMATICAL BOLD CAPITAL SIGMA
+ # <font> 03A3 greek capital letter sigma
+1D6BB MATHEMATICAL BOLD CAPITAL TAU
+ # <font> 03A4 greek capital letter tau
+1D6BC MATHEMATICAL BOLD CAPITAL UPSILON
+ # <font> 03A5 greek capital letter upsilon
+1D6BD MATHEMATICAL BOLD CAPITAL PHI
+ # <font> 03A6 greek capital letter phi
+1D6BE MATHEMATICAL BOLD CAPITAL CHI
+ # <font> 03A7 greek capital letter chi
+1D6BF MATHEMATICAL BOLD CAPITAL PSI
+ # <font> 03A8 greek capital letter psi
+1D6C0 MATHEMATICAL BOLD CAPITAL OMEGA
+ # <font> 03A9 greek capital letter omega
+1D6C1 MATHEMATICAL BOLD NABLA
+ # <font> 2207 nabla
+1D6C2 MATHEMATICAL BOLD SMALL ALPHA
+ # <font> 03B1 greek small letter alpha
+1D6C3 MATHEMATICAL BOLD SMALL BETA
+ # <font> 03B2 greek small letter beta
+1D6C4 MATHEMATICAL BOLD SMALL GAMMA
+ # <font> 03B3 greek small letter gamma
+1D6C5 MATHEMATICAL BOLD SMALL DELTA
+ # <font> 03B4 greek small letter delta
+1D6C6 MATHEMATICAL BOLD SMALL EPSILON
+ # <font> 03B5 greek small letter epsilon
+1D6C7 MATHEMATICAL BOLD SMALL ZETA
+ # <font> 03B6 greek small letter zeta
+1D6C8 MATHEMATICAL BOLD SMALL ETA
+ # <font> 03B7 greek small letter eta
+1D6C9 MATHEMATICAL BOLD SMALL THETA
+ # <font> 03B8 greek small letter theta
+1D6CA MATHEMATICAL BOLD SMALL IOTA
+ # <font> 03B9 greek small letter iota
+1D6CB MATHEMATICAL BOLD SMALL KAPPA
+ # <font> 03BA greek small letter kappa
+1D6CC MATHEMATICAL BOLD SMALL LAMDA
+ # <font> 03BB greek small letter lamda
+1D6CD MATHEMATICAL BOLD SMALL MU
+ # <font> 03BC greek small letter mu
+1D6CE MATHEMATICAL BOLD SMALL NU
+ # <font> 03BD greek small letter nu
+1D6CF MATHEMATICAL BOLD SMALL XI
+ # <font> 03BE greek small letter xi
+1D6D0 MATHEMATICAL BOLD SMALL OMICRON
+ # <font> 03BF greek small letter omicron
+1D6D1 MATHEMATICAL BOLD SMALL PI
+ # <font> 03C0 greek small letter pi
+1D6D2 MATHEMATICAL BOLD SMALL RHO
+ # <font> 03C1 greek small letter rho
+1D6D3 MATHEMATICAL BOLD SMALL FINAL SIGMA
+ # <font> 03C2 greek small letter final sigma
+1D6D4 MATHEMATICAL BOLD SMALL SIGMA
+ # <font> 03C3 greek small letter sigma
+1D6D5 MATHEMATICAL BOLD SMALL TAU
+ # <font> 03C4 greek small letter tau
+1D6D6 MATHEMATICAL BOLD SMALL UPSILON
+ # <font> 03C5 greek small letter upsilon
+1D6D7 MATHEMATICAL BOLD SMALL PHI
+ # <font> 03C6 greek small letter phi
+1D6D8 MATHEMATICAL BOLD SMALL CHI
+ # <font> 03C7 greek small letter chi
+1D6D9 MATHEMATICAL BOLD SMALL PSI
+ # <font> 03C8 greek small letter psi
+1D6DA MATHEMATICAL BOLD SMALL OMEGA
+ # <font> 03C9 greek small letter omega
+@ Additional bold Greek symbols
+1D6DB MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+ # <font> 2202 partial differential
+1D6DC MATHEMATICAL BOLD EPSILON SYMBOL
+ # <font> 03F5 greek lunate epsilon symbol
+1D6DD MATHEMATICAL BOLD THETA SYMBOL
+ # <font> 03D1 greek theta symbol
+1D6DE MATHEMATICAL BOLD KAPPA SYMBOL
+ # <font> 03F0 greek kappa symbol
+1D6DF MATHEMATICAL BOLD PHI SYMBOL
+ # <font> 03D5 greek phi symbol
+1D6E0 MATHEMATICAL BOLD RHO SYMBOL
+ # <font> 03F1 greek rho symbol
+1D6E1 MATHEMATICAL BOLD PI SYMBOL
+ # <font> 03D6 greek pi symbol
+@ Italic Greek symbols
+1D6E2 MATHEMATICAL ITALIC CAPITAL ALPHA
+ # <font> 0391 greek capital letter alpha
+1D6E3 MATHEMATICAL ITALIC CAPITAL BETA
+ # <font> 0392 greek capital letter beta
+1D6E4 MATHEMATICAL ITALIC CAPITAL GAMMA
+ # <font> 0393 greek capital letter gamma
+1D6E5 MATHEMATICAL ITALIC CAPITAL DELTA
+ # <font> 0394 greek capital letter delta
+1D6E6 MATHEMATICAL ITALIC CAPITAL EPSILON
+ # <font> 0395 greek capital letter epsilon
+1D6E7 MATHEMATICAL ITALIC CAPITAL ZETA
+ # <font> 0396 greek capital letter zeta
+1D6E8 MATHEMATICAL ITALIC CAPITAL ETA
+ # <font> 0397 greek capital letter eta
+1D6E9 MATHEMATICAL ITALIC CAPITAL THETA
+ # <font> 0398 greek capital letter theta
+1D6EA MATHEMATICAL ITALIC CAPITAL IOTA
+ # <font> 0399 greek capital letter iota
+1D6EB MATHEMATICAL ITALIC CAPITAL KAPPA
+ # <font> 039A greek capital letter kappa
+1D6EC MATHEMATICAL ITALIC CAPITAL LAMDA
+ # <font> 039B greek capital letter lamda
+1D6ED MATHEMATICAL ITALIC CAPITAL MU
+ # <font> 039C greek capital letter mu
+1D6EE MATHEMATICAL ITALIC CAPITAL NU
+ # <font> 039D greek capital letter nu
+1D6EF MATHEMATICAL ITALIC CAPITAL XI
+ # <font> 039E greek capital letter xi
+1D6F0 MATHEMATICAL ITALIC CAPITAL OMICRON
+ # <font> 039F greek capital letter omicron
+1D6F1 MATHEMATICAL ITALIC CAPITAL PI
+ # <font> 03A0 greek capital letter pi
+1D6F2 MATHEMATICAL ITALIC CAPITAL RHO
+ # <font> 03A1 greek capital letter rho
+1D6F3 MATHEMATICAL ITALIC CAPITAL THETA SYMBOL
+ # <font> 03F4 greek capital theta symbol
+1D6F4 MATHEMATICAL ITALIC CAPITAL SIGMA
+ # <font> 03A3 greek capital letter sigma
+1D6F5 MATHEMATICAL ITALIC CAPITAL TAU
+ # <font> 03A4 greek capital letter tau
+1D6F6 MATHEMATICAL ITALIC CAPITAL UPSILON
+ # <font> 03A5 greek capital letter upsilon
+1D6F7 MATHEMATICAL ITALIC CAPITAL PHI
+ # <font> 03A6 greek capital letter phi
+1D6F8 MATHEMATICAL ITALIC CAPITAL CHI
+ # <font> 03A7 greek capital letter chi
+1D6F9 MATHEMATICAL ITALIC CAPITAL PSI
+ # <font> 03A8 greek capital letter psi
+1D6FA MATHEMATICAL ITALIC CAPITAL OMEGA
+ # <font> 03A9 greek capital letter omega
+1D6FB MATHEMATICAL ITALIC NABLA
+ # <font> 2207 nabla
+1D6FC MATHEMATICAL ITALIC SMALL ALPHA
+ # <font> 03B1 greek small letter alpha
+1D6FD MATHEMATICAL ITALIC SMALL BETA
+ # <font> 03B2 greek small letter beta
+1D6FE MATHEMATICAL ITALIC SMALL GAMMA
+ # <font> 03B3 greek small letter gamma
+1D6FF MATHEMATICAL ITALIC SMALL DELTA
+ # <font> 03B4 greek small letter delta
+1D700 MATHEMATICAL ITALIC SMALL EPSILON
+ # <font> 03B5 greek small letter epsilon
+1D701 MATHEMATICAL ITALIC SMALL ZETA
+ # <font> 03B6 greek small letter zeta
+1D702 MATHEMATICAL ITALIC SMALL ETA
+ # <font> 03B7 greek small letter eta
+1D703 MATHEMATICAL ITALIC SMALL THETA
+ # <font> 03B8 greek small letter theta
+1D704 MATHEMATICAL ITALIC SMALL IOTA
+ # <font> 03B9 greek small letter iota
+1D705 MATHEMATICAL ITALIC SMALL KAPPA
+ # <font> 03BA greek small letter kappa
+1D706 MATHEMATICAL ITALIC SMALL LAMDA
+ # <font> 03BB greek small letter lamda
+1D707 MATHEMATICAL ITALIC SMALL MU
+ # <font> 03BC greek small letter mu
+1D708 MATHEMATICAL ITALIC SMALL NU
+ # <font> 03BD greek small letter nu
+1D709 MATHEMATICAL ITALIC SMALL XI
+ # <font> 03BE greek small letter xi
+1D70A MATHEMATICAL ITALIC SMALL OMICRON
+ # <font> 03BF greek small letter omicron
+1D70B MATHEMATICAL ITALIC SMALL PI
+ # <font> 03C0 greek small letter pi
+1D70C MATHEMATICAL ITALIC SMALL RHO
+ # <font> 03C1 greek small letter rho
+1D70D MATHEMATICAL ITALIC SMALL FINAL SIGMA
+ # <font> 03C2 greek small letter final sigma
+1D70E MATHEMATICAL ITALIC SMALL SIGMA
+ # <font> 03C3 greek small letter sigma
+1D70F MATHEMATICAL ITALIC SMALL TAU
+ # <font> 03C4 greek small letter tau
+1D710 MATHEMATICAL ITALIC SMALL UPSILON
+ # <font> 03C5 greek small letter upsilon
+1D711 MATHEMATICAL ITALIC SMALL PHI
+ # <font> 03C6 greek small letter phi
+1D712 MATHEMATICAL ITALIC SMALL CHI
+ # <font> 03C7 greek small letter chi
+1D713 MATHEMATICAL ITALIC SMALL PSI
+ # <font> 03C8 greek small letter psi
+1D714 MATHEMATICAL ITALIC SMALL OMEGA
+ # <font> 03C9 greek small letter omega
+@ Additional italic Greek symbols
+1D715 MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+ # <font> 2202 partial differential
+1D716 MATHEMATICAL ITALIC EPSILON SYMBOL
+ # <font> 03F5 greek lunate epsilon symbol
+1D717 MATHEMATICAL ITALIC THETA SYMBOL
+ # <font> 03D1 greek theta symbol
+1D718 MATHEMATICAL ITALIC KAPPA SYMBOL
+ # <font> 03F0 greek kappa symbol
+1D719 MATHEMATICAL ITALIC PHI SYMBOL
+ # <font> 03D5 greek phi symbol
+1D71A MATHEMATICAL ITALIC RHO SYMBOL
+ # <font> 03F1 greek rho symbol
+1D71B MATHEMATICAL ITALIC PI SYMBOL
+ # <font> 03D6 greek pi symbol
+@ Bold italic Greek symbols
+1D71C MATHEMATICAL BOLD ITALIC CAPITAL ALPHA
+ # <font> 0391 greek capital letter alpha
+1D71D MATHEMATICAL BOLD ITALIC CAPITAL BETA
+ # <font> 0392 greek capital letter beta
+1D71E MATHEMATICAL BOLD ITALIC CAPITAL GAMMA
+ # <font> 0393 greek capital letter gamma
+1D71F MATHEMATICAL BOLD ITALIC CAPITAL DELTA
+ # <font> 0394 greek capital letter delta
+1D720 MATHEMATICAL BOLD ITALIC CAPITAL EPSILON
+ # <font> 0395 greek capital letter epsilon
+1D721 MATHEMATICAL BOLD ITALIC CAPITAL ZETA
+ # <font> 0396 greek capital letter zeta
+1D722 MATHEMATICAL BOLD ITALIC CAPITAL ETA
+ # <font> 0397 greek capital letter eta
+1D723 MATHEMATICAL BOLD ITALIC CAPITAL THETA
+ # <font> 0398 greek capital letter theta
+1D724 MATHEMATICAL BOLD ITALIC CAPITAL IOTA
+ # <font> 0399 greek capital letter iota
+1D725 MATHEMATICAL BOLD ITALIC CAPITAL KAPPA
+ # <font> 039A greek capital letter kappa
+1D726 MATHEMATICAL BOLD ITALIC CAPITAL LAMDA
+ # <font> 039B greek capital letter lamda
+1D727 MATHEMATICAL BOLD ITALIC CAPITAL MU
+ # <font> 039C greek capital letter mu
+1D728 MATHEMATICAL BOLD ITALIC CAPITAL NU
+ # <font> 039D greek capital letter nu
+1D729 MATHEMATICAL BOLD ITALIC CAPITAL XI
+ # <font> 039E greek capital letter xi
+1D72A MATHEMATICAL BOLD ITALIC CAPITAL OMICRON
+ # <font> 039F greek capital letter omicron
+1D72B MATHEMATICAL BOLD ITALIC CAPITAL PI
+ # <font> 03A0 greek capital letter pi
+1D72C MATHEMATICAL BOLD ITALIC CAPITAL RHO
+ # <font> 03A1 greek capital letter rho
+1D72D MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL
+ # <font> 03F4 greek capital theta symbol
+1D72E MATHEMATICAL BOLD ITALIC CAPITAL SIGMA
+ # <font> 03A3 greek capital letter sigma
+1D72F MATHEMATICAL BOLD ITALIC CAPITAL TAU
+ # <font> 03A4 greek capital letter tau
+1D730 MATHEMATICAL BOLD ITALIC CAPITAL UPSILON
+ # <font> 03A5 greek capital letter upsilon
+1D731 MATHEMATICAL BOLD ITALIC CAPITAL PHI
+ # <font> 03A6 greek capital letter phi
+1D732 MATHEMATICAL BOLD ITALIC CAPITAL CHI
+ # <font> 03A7 greek capital letter chi
+1D733 MATHEMATICAL BOLD ITALIC CAPITAL PSI
+ # <font> 03A8 greek capital letter psi
+1D734 MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+ # <font> 03A9 greek capital letter omega
+1D735 MATHEMATICAL BOLD ITALIC NABLA
+ # <font> 2207 nabla
+1D736 MATHEMATICAL BOLD ITALIC SMALL ALPHA
+ # <font> 03B1 greek small letter alpha
+1D737 MATHEMATICAL BOLD ITALIC SMALL BETA
+ # <font> 03B2 greek small letter beta
+1D738 MATHEMATICAL BOLD ITALIC SMALL GAMMA
+ # <font> 03B3 greek small letter gamma
+1D739 MATHEMATICAL BOLD ITALIC SMALL DELTA
+ # <font> 03B4 greek small letter delta
+1D73A MATHEMATICAL BOLD ITALIC SMALL EPSILON
+ # <font> 03B5 greek small letter epsilon
+1D73B MATHEMATICAL BOLD ITALIC SMALL ZETA
+ # <font> 03B6 greek small letter zeta
+1D73C MATHEMATICAL BOLD ITALIC SMALL ETA
+ # <font> 03B7 greek small letter eta
+1D73D MATHEMATICAL BOLD ITALIC SMALL THETA
+ # <font> 03B8 greek small letter theta
+1D73E MATHEMATICAL BOLD ITALIC SMALL IOTA
+ # <font> 03B9 greek small letter iota
+1D73F MATHEMATICAL BOLD ITALIC SMALL KAPPA
+ # <font> 03BA greek small letter kappa
+1D740 MATHEMATICAL BOLD ITALIC SMALL LAMDA
+ # <font> 03BB greek small letter lamda
+1D741 MATHEMATICAL BOLD ITALIC SMALL MU
+ # <font> 03BC greek small letter mu
+1D742 MATHEMATICAL BOLD ITALIC SMALL NU
+ # <font> 03BD greek small letter nu
+1D743 MATHEMATICAL BOLD ITALIC SMALL XI
+ # <font> 03BE greek small letter xi
+1D744 MATHEMATICAL BOLD ITALIC SMALL OMICRON
+ # <font> 03BF greek small letter omicron
+1D745 MATHEMATICAL BOLD ITALIC SMALL PI
+ # <font> 03C0 greek small letter pi
+1D746 MATHEMATICAL BOLD ITALIC SMALL RHO
+ # <font> 03C1 greek small letter rho
+1D747 MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA
+ # <font> 03C2 greek small letter final sigma
+1D748 MATHEMATICAL BOLD ITALIC SMALL SIGMA
+ # <font> 03C3 greek small letter sigma
+1D749 MATHEMATICAL BOLD ITALIC SMALL TAU
+ # <font> 03C4 greek small letter tau
+1D74A MATHEMATICAL BOLD ITALIC SMALL UPSILON
+ # <font> 03C5 greek small letter upsilon
+1D74B MATHEMATICAL BOLD ITALIC SMALL PHI
+ # <font> 03C6 greek small letter phi
+1D74C MATHEMATICAL BOLD ITALIC SMALL CHI
+ # <font> 03C7 greek small letter chi
+1D74D MATHEMATICAL BOLD ITALIC SMALL PSI
+ # <font> 03C8 greek small letter psi
+1D74E MATHEMATICAL BOLD ITALIC SMALL OMEGA
+ # <font> 03C9 greek small letter omega
+@ Additional bold italic Greek symbols
+1D74F MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+ # <font> 2202 partial differential
+1D750 MATHEMATICAL BOLD ITALIC EPSILON SYMBOL
+ # <font> 03F5 greek lunate epsilon symbol
+1D751 MATHEMATICAL BOLD ITALIC THETA SYMBOL
+ # <font> 03D1 greek theta symbol
+1D752 MATHEMATICAL BOLD ITALIC KAPPA SYMBOL
+ # <font> 03F0 greek kappa symbol
+1D753 MATHEMATICAL BOLD ITALIC PHI SYMBOL
+ # <font> 03D5 greek phi symbol
+1D754 MATHEMATICAL BOLD ITALIC RHO SYMBOL
+ # <font> 03F1 greek rho symbol
+1D755 MATHEMATICAL BOLD ITALIC PI SYMBOL
+ # <font> 03D6 greek pi symbol
+@ Sans-serif bold Greek symbols
+1D756 MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA
+ # <font> 0391 greek capital letter alpha
+1D757 MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA
+ # <font> 0392 greek capital letter beta
+1D758 MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA
+ # <font> 0393 greek capital letter gamma
+1D759 MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA
+ # <font> 0394 greek capital letter delta
+1D75A MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON
+ # <font> 0395 greek capital letter epsilon
+1D75B MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA
+ # <font> 0396 greek capital letter zeta
+1D75C MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA
+ # <font> 0397 greek capital letter eta
+1D75D MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA
+ # <font> 0398 greek capital letter theta
+1D75E MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA
+ # <font> 0399 greek capital letter iota
+1D75F MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA
+ # <font> 039A greek capital letter kappa
+1D760 MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA
+ # <font> 039B greek capital letter lamda
+1D761 MATHEMATICAL SANS-SERIF BOLD CAPITAL MU
+ # <font> 039C greek capital letter mu
+1D762 MATHEMATICAL SANS-SERIF BOLD CAPITAL NU
+ # <font> 039D greek capital letter nu
+1D763 MATHEMATICAL SANS-SERIF BOLD CAPITAL XI
+ # <font> 039E greek capital letter xi
+1D764 MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON
+ # <font> 039F greek capital letter omicron
+1D765 MATHEMATICAL SANS-SERIF BOLD CAPITAL PI
+ # <font> 03A0 greek capital letter pi
+1D766 MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO
+ # <font> 03A1 greek capital letter rho
+1D767 MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL
+ # <font> 03F4 greek capital theta symbol
+1D768 MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA
+ # <font> 03A3 greek capital letter sigma
+1D769 MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU
+ # <font> 03A4 greek capital letter tau
+1D76A MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON
+ # <font> 03A5 greek capital letter upsilon
+1D76B MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI
+ # <font> 03A6 greek capital letter phi
+1D76C MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI
+ # <font> 03A7 greek capital letter chi
+1D76D MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI
+ # <font> 03A8 greek capital letter psi
+1D76E MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+ # <font> 03A9 greek capital letter omega
+1D76F MATHEMATICAL SANS-SERIF BOLD NABLA
+ # <font> 2207 nabla
+1D770 MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA
+ # <font> 03B1 greek small letter alpha
+1D771 MATHEMATICAL SANS-SERIF BOLD SMALL BETA
+ # <font> 03B2 greek small letter beta
+1D772 MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA
+ # <font> 03B3 greek small letter gamma
+1D773 MATHEMATICAL SANS-SERIF BOLD SMALL DELTA
+ # <font> 03B4 greek small letter delta
+1D774 MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON
+ # <font> 03B5 greek small letter epsilon
+1D775 MATHEMATICAL SANS-SERIF BOLD SMALL ZETA
+ # <font> 03B6 greek small letter zeta
+1D776 MATHEMATICAL SANS-SERIF BOLD SMALL ETA
+ # <font> 03B7 greek small letter eta
+1D777 MATHEMATICAL SANS-SERIF BOLD SMALL THETA
+ # <font> 03B8 greek small letter theta
+1D778 MATHEMATICAL SANS-SERIF BOLD SMALL IOTA
+ # <font> 03B9 greek small letter iota
+1D779 MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA
+ # <font> 03BA greek small letter kappa
+1D77A MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA
+ # <font> 03BB greek small letter lamda
+1D77B MATHEMATICAL SANS-SERIF BOLD SMALL MU
+ # <font> 03BC greek small letter mu
+1D77C MATHEMATICAL SANS-SERIF BOLD SMALL NU
+ # <font> 03BD greek small letter nu
+1D77D MATHEMATICAL SANS-SERIF BOLD SMALL XI
+ # <font> 03BE greek small letter xi
+1D77E MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON
+ # <font> 03BF greek small letter omicron
+1D77F MATHEMATICAL SANS-SERIF BOLD SMALL PI
+ # <font> 03C0 greek small letter pi
+1D780 MATHEMATICAL SANS-SERIF BOLD SMALL RHO
+ # <font> 03C1 greek small letter rho
+1D781 MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA
+ # <font> 03C2 greek small letter final sigma
+1D782 MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA
+ # <font> 03C3 greek small letter sigma
+1D783 MATHEMATICAL SANS-SERIF BOLD SMALL TAU
+ # <font> 03C4 greek small letter tau
+1D784 MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON
+ # <font> 03C5 greek small letter upsilon
+1D785 MATHEMATICAL SANS-SERIF BOLD SMALL PHI
+ # <font> 03C6 greek small letter phi
+1D786 MATHEMATICAL SANS-SERIF BOLD SMALL CHI
+ # <font> 03C7 greek small letter chi
+1D787 MATHEMATICAL SANS-SERIF BOLD SMALL PSI
+ # <font> 03C8 greek small letter psi
+1D788 MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+ # <font> 03C9 greek small letter omega
+@ Additional sans-serif bold Greek symbols
+1D789 MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+ # <font> 2202 partial differential
+1D78A MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL
+ # <font> 03F5 greek lunate epsilon symbol
+1D78B MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL
+ # <font> 03D1 greek theta symbol
+1D78C MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL
+ # <font> 03F0 greek kappa symbol
+1D78D MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL
+ # <font> 03D5 greek phi symbol
+1D78E MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL
+ # <font> 03F1 greek rho symbol
+1D78F MATHEMATICAL SANS-SERIF BOLD PI SYMBOL
+ # <font> 03D6 greek pi symbol
+@ Sans-serif bold italic Greek symbols
+1D790 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA
+ # <font> 0391 greek capital letter alpha
+1D791 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA
+ # <font> 0392 greek capital letter beta
+1D792 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA
+ # <font> 0393 greek capital letter gamma
+1D793 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA
+ # <font> 0394 greek capital letter delta
+1D794 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON
+ # <font> 0395 greek capital letter epsilon
+1D795 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA
+ # <font> 0396 greek capital letter zeta
+1D796 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA
+ # <font> 0397 greek capital letter eta
+1D797 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA
+ # <font> 0398 greek capital letter theta
+1D798 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA
+ # <font> 0399 greek capital letter iota
+1D799 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA
+ # <font> 039A greek capital letter kappa
+1D79A MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA
+ # <font> 039B greek capital letter lamda
+1D79B MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU
+ # <font> 039C greek capital letter mu
+1D79C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU
+ # <font> 039D greek capital letter nu
+1D79D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI
+ # <font> 039E greek capital letter xi
+1D79E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON
+ # <font> 039F greek capital letter omicron
+1D79F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI
+ # <font> 03A0 greek capital letter pi
+1D7A0 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO
+ # <font> 03A1 greek capital letter rho
+1D7A1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL
+ # <font> 03F4 greek capital theta symbol
+1D7A2 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA
+ # <font> 03A3 greek capital letter sigma
+1D7A3 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU
+ # <font> 03A4 greek capital letter tau
+1D7A4 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON
+ # <font> 03A5 greek capital letter upsilon
+1D7A5 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI
+ # <font> 03A6 greek capital letter phi
+1D7A6 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI
+ # <font> 03A7 greek capital letter chi
+1D7A7 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI
+ # <font> 03A8 greek capital letter psi
+1D7A8 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+ # <font> 03A9 greek capital letter omega
+1D7A9 MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+ # <font> 2207 nabla
+1D7AA MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA
+ # <font> 03B1 greek small letter alpha
+1D7AB MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA
+ # <font> 03B2 greek small letter beta
+1D7AC MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA
+ # <font> 03B3 greek small letter gamma
+1D7AD MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA
+ # <font> 03B4 greek small letter delta
+1D7AE MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON
+ # <font> 03B5 greek small letter epsilon
+1D7AF MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA
+ # <font> 03B6 greek small letter zeta
+1D7B0 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA
+ # <font> 03B7 greek small letter eta
+1D7B1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA
+ # <font> 03B8 greek small letter theta
+1D7B2 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA
+ # <font> 03B9 greek small letter iota
+1D7B3 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA
+ # <font> 03BA greek small letter kappa
+1D7B4 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA
+ # <font> 03BB greek small letter lamda
+1D7B5 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU
+ # <font> 03BC greek small letter mu
+1D7B6 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU
+ # <font> 03BD greek small letter nu
+1D7B7 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI
+ # <font> 03BE greek small letter xi
+1D7B8 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON
+ # <font> 03BF greek small letter omicron
+1D7B9 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI
+ # <font> 03C0 greek small letter pi
+1D7BA MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO
+ # <font> 03C1 greek small letter rho
+1D7BB MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA
+ # <font> 03C2 greek small letter final sigma
+1D7BC MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA
+ # <font> 03C3 greek small letter sigma
+1D7BD MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU
+ # <font> 03C4 greek small letter tau
+1D7BE MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON
+ # <font> 03C5 greek small letter upsilon
+1D7BF MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI
+ # <font> 03C6 greek small letter phi
+1D7C0 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI
+ # <font> 03C7 greek small letter chi
+1D7C1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI
+ # <font> 03C8 greek small letter psi
+1D7C2 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+ # <font> 03C9 greek small letter omega
+@ Additional sans-serif bold italic Greek symbols
+1D7C3 MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+ # <font> 2202 partial differential
+1D7C4 MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL
+ # <font> 03F5 greek lunate epsilon symbol
+1D7C5 MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL
+ # <font> 03D1 greek theta symbol
+1D7C6 MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL
+ # <font> 03F0 greek kappa symbol
+1D7C7 MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL
+ # <font> 03D5 greek phi symbol
+1D7C8 MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL
+ # <font> 03F1 greek rho symbol
+1D7C9 MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+ # <font> 03D6 greek pi symbol
+@ Additional bold Greek symbols
+1D7CA MATHEMATICAL BOLD CAPITAL DIGAMMA
+ # <font> 03DC greek letter digamma
+1D7CB MATHEMATICAL BOLD SMALL DIGAMMA
+ # <font> 03DD greek small letter digamma
+@ Bold digits
+1D7CE MATHEMATICAL BOLD DIGIT ZERO
+ # <font> 0030 digit zero
+1D7CF MATHEMATICAL BOLD DIGIT ONE
+ # <font> 0031 digit one
+1D7D0 MATHEMATICAL BOLD DIGIT TWO
+ # <font> 0032 digit two
+1D7D1 MATHEMATICAL BOLD DIGIT THREE
+ # <font> 0033 digit three
+1D7D2 MATHEMATICAL BOLD DIGIT FOUR
+ # <font> 0034 digit four
+1D7D3 MATHEMATICAL BOLD DIGIT FIVE
+ # <font> 0035 digit five
+1D7D4 MATHEMATICAL BOLD DIGIT SIX
+ # <font> 0036 digit six
+1D7D5 MATHEMATICAL BOLD DIGIT SEVEN
+ # <font> 0037 digit seven
+1D7D6 MATHEMATICAL BOLD DIGIT EIGHT
+ # <font> 0038 digit eight
+1D7D7 MATHEMATICAL BOLD DIGIT NINE
+ # <font> 0039 digit nine
+@ Double-struck digits
+1D7D8 MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO
+ # <font> 0030 digit zero
+1D7D9 MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
+ # <font> 0031 digit one
+1D7DA MATHEMATICAL DOUBLE-STRUCK DIGIT TWO
+ # <font> 0032 digit two
+1D7DB MATHEMATICAL DOUBLE-STRUCK DIGIT THREE
+ # <font> 0033 digit three
+1D7DC MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR
+ # <font> 0034 digit four
+1D7DD MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE
+ # <font> 0035 digit five
+1D7DE MATHEMATICAL DOUBLE-STRUCK DIGIT SIX
+ # <font> 0036 digit six
+1D7DF MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN
+ # <font> 0037 digit seven
+1D7E0 MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT
+ # <font> 0038 digit eight
+1D7E1 MATHEMATICAL DOUBLE-STRUCK DIGIT NINE
+ # <font> 0039 digit nine
+@ Sans-serif digits
+1D7E2 MATHEMATICAL SANS-SERIF DIGIT ZERO
+ # <font> 0030 digit zero
+1D7E3 MATHEMATICAL SANS-SERIF DIGIT ONE
+ # <font> 0031 digit one
+1D7E4 MATHEMATICAL SANS-SERIF DIGIT TWO
+ # <font> 0032 digit two
+1D7E5 MATHEMATICAL SANS-SERIF DIGIT THREE
+ # <font> 0033 digit three
+1D7E6 MATHEMATICAL SANS-SERIF DIGIT FOUR
+ # <font> 0034 digit four
+1D7E7 MATHEMATICAL SANS-SERIF DIGIT FIVE
+ # <font> 0035 digit five
+1D7E8 MATHEMATICAL SANS-SERIF DIGIT SIX
+ # <font> 0036 digit six
+1D7E9 MATHEMATICAL SANS-SERIF DIGIT SEVEN
+ # <font> 0037 digit seven
+1D7EA MATHEMATICAL SANS-SERIF DIGIT EIGHT
+ # <font> 0038 digit eight
+1D7EB MATHEMATICAL SANS-SERIF DIGIT NINE
+ # <font> 0039 digit nine
+@ Sans-serif bold digits
+1D7EC MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO
+ # <font> 0030 digit zero
+1D7ED MATHEMATICAL SANS-SERIF BOLD DIGIT ONE
+ # <font> 0031 digit one
+1D7EE MATHEMATICAL SANS-SERIF BOLD DIGIT TWO
+ # <font> 0032 digit two
+1D7EF MATHEMATICAL SANS-SERIF BOLD DIGIT THREE
+ # <font> 0033 digit three
+1D7F0 MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR
+ # <font> 0034 digit four
+1D7F1 MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE
+ # <font> 0035 digit five
+1D7F2 MATHEMATICAL SANS-SERIF BOLD DIGIT SIX
+ # <font> 0036 digit six
+1D7F3 MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN
+ # <font> 0037 digit seven
+1D7F4 MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT
+ # <font> 0038 digit eight
+1D7F5 MATHEMATICAL SANS-SERIF BOLD DIGIT NINE
+ # <font> 0039 digit nine
+@ Monospace digits
+1D7F6 MATHEMATICAL MONOSPACE DIGIT ZERO
+ # <font> 0030 digit zero
+1D7F7 MATHEMATICAL MONOSPACE DIGIT ONE
+ # <font> 0031 digit one
+1D7F8 MATHEMATICAL MONOSPACE DIGIT TWO
+ # <font> 0032 digit two
+1D7F9 MATHEMATICAL MONOSPACE DIGIT THREE
+ # <font> 0033 digit three
+1D7FA MATHEMATICAL MONOSPACE DIGIT FOUR
+ # <font> 0034 digit four
+1D7FB MATHEMATICAL MONOSPACE DIGIT FIVE
+ # <font> 0035 digit five
+1D7FC MATHEMATICAL MONOSPACE DIGIT SIX
+ # <font> 0036 digit six
+1D7FD MATHEMATICAL MONOSPACE DIGIT SEVEN
+ # <font> 0037 digit seven
+1D7FE MATHEMATICAL MONOSPACE DIGIT EIGHT
+ # <font> 0038 digit eight
+1D7FF MATHEMATICAL MONOSPACE DIGIT NINE
+ # <font> 0039 digit nine
+@@ 1F000 Mahjong Tiles 1F02F
+@ Prevailing wind tiles
+1F000 MAHJONG TILE EAST WIND
+1F001 MAHJONG TILE SOUTH WIND
+1F002 MAHJONG TILE WEST WIND
+1F003 MAHJONG TILE NORTH WIND
+@ Dragon tiles
+1F004 MAHJONG TILE RED DRAGON
+ = hongzhong
+1F005 MAHJONG TILE GREEN DRAGON
+ = qingfa
+1F006 MAHJONG TILE WHITE DRAGON
+ = baiban
+@ Character suit tiles
+1F007 MAHJONG TILE ONE OF CHARACTERS
+ = wan
+1F008 MAHJONG TILE TWO OF CHARACTERS
+1F009 MAHJONG TILE THREE OF CHARACTERS
+1F00A MAHJONG TILE FOUR OF CHARACTERS
+1F00B MAHJONG TILE FIVE OF CHARACTERS
+1F00C MAHJONG TILE SIX OF CHARACTERS
+1F00D MAHJONG TILE SEVEN OF CHARACTERS
+1F00E MAHJONG TILE EIGHT OF CHARACTERS
+1F00F MAHJONG TILE NINE OF CHARACTERS
+@ Bamboo suit tiles
+1F010 MAHJONG TILE ONE OF BAMBOOS
+ = tiao
+1F011 MAHJONG TILE TWO OF BAMBOOS
+1F012 MAHJONG TILE THREE OF BAMBOOS
+1F013 MAHJONG TILE FOUR OF BAMBOOS
+1F014 MAHJONG TILE FIVE OF BAMBOOS
+1F015 MAHJONG TILE SIX OF BAMBOOS
+1F016 MAHJONG TILE SEVEN OF BAMBOOS
+1F017 MAHJONG TILE EIGHT OF BAMBOOS
+1F018 MAHJONG TILE NINE OF BAMBOOS
+@ Circle suit tiles
+1F019 MAHJONG TILE ONE OF CIRCLES
+ = bing
+1F01A MAHJONG TILE TWO OF CIRCLES
+1F01B MAHJONG TILE THREE OF CIRCLES
+1F01C MAHJONG TILE FOUR OF CIRCLES
+1F01D MAHJONG TILE FIVE OF CIRCLES
+1F01E MAHJONG TILE SIX OF CIRCLES
+1F01F MAHJONG TILE SEVEN OF CIRCLES
+1F020 MAHJONG TILE EIGHT OF CIRCLES
+1F021 MAHJONG TILE NINE OF CIRCLES
+@ Flower tiles
+1F022 MAHJONG TILE PLUM
+ = mei
+1F023 MAHJONG TILE ORCHID
+ = lan
+1F024 MAHJONG TILE BAMBOO
+ = zhu
+1F025 MAHJONG TILE CHRYSANTHEMUM
+ = ju
+@ Season tiles
+1F026 MAHJONG TILE SPRING
+1F027 MAHJONG TILE SUMMER
+1F028 MAHJONG TILE AUTUMN
+1F029 MAHJONG TILE WINTER
+@ Miscellaneous tiles
+1F02A MAHJONG TILE JOKER
+ = baida
+1F02B MAHJONG TILE BACK
+@@ 1F030 Domino Tiles 1F09F
+@ Horizontal tiles
+1F030 DOMINO TILE HORIZONTAL BACK
+@ Zeroes
+1F031 DOMINO TILE HORIZONTAL-00-00
+1F032 DOMINO TILE HORIZONTAL-00-01
+1F033 DOMINO TILE HORIZONTAL-00-02
+1F034 DOMINO TILE HORIZONTAL-00-03
+1F035 DOMINO TILE HORIZONTAL-00-04
+1F036 DOMINO TILE HORIZONTAL-00-05
+1F037 DOMINO TILE HORIZONTAL-00-06
+@ Ones
+1F038 DOMINO TILE HORIZONTAL-01-00
+1F039 DOMINO TILE HORIZONTAL-01-01
+1F03A DOMINO TILE HORIZONTAL-01-02
+1F03B DOMINO TILE HORIZONTAL-01-03
+1F03C DOMINO TILE HORIZONTAL-01-04
+1F03D DOMINO TILE HORIZONTAL-01-05
+1F03E DOMINO TILE HORIZONTAL-01-06
+@ Twos
+1F03F DOMINO TILE HORIZONTAL-02-00
+1F040 DOMINO TILE HORIZONTAL-02-01
+1F041 DOMINO TILE HORIZONTAL-02-02
+1F042 DOMINO TILE HORIZONTAL-02-03
+1F043 DOMINO TILE HORIZONTAL-02-04
+1F044 DOMINO TILE HORIZONTAL-02-05
+1F045 DOMINO TILE HORIZONTAL-02-06
+@ Threes
+1F046 DOMINO TILE HORIZONTAL-03-00
+1F047 DOMINO TILE HORIZONTAL-03-01
+1F048 DOMINO TILE HORIZONTAL-03-02
+1F049 DOMINO TILE HORIZONTAL-03-03
+1F04A DOMINO TILE HORIZONTAL-03-04
+1F04B DOMINO TILE HORIZONTAL-03-05
+1F04C DOMINO TILE HORIZONTAL-03-06
+@ Fours
+1F04D DOMINO TILE HORIZONTAL-04-00
+1F04E DOMINO TILE HORIZONTAL-04-01
+1F04F DOMINO TILE HORIZONTAL-04-02
+1F050 DOMINO TILE HORIZONTAL-04-03
+1F051 DOMINO TILE HORIZONTAL-04-04
+1F052 DOMINO TILE HORIZONTAL-04-05
+1F053 DOMINO TILE HORIZONTAL-04-06
+@ Fives
+1F054 DOMINO TILE HORIZONTAL-05-00
+1F055 DOMINO TILE HORIZONTAL-05-01
+1F056 DOMINO TILE HORIZONTAL-05-02
+1F057 DOMINO TILE HORIZONTAL-05-03
+1F058 DOMINO TILE HORIZONTAL-05-04
+1F059 DOMINO TILE HORIZONTAL-05-05
+1F05A DOMINO TILE HORIZONTAL-05-06
+@ Sixes
+1F05B DOMINO TILE HORIZONTAL-06-00
+1F05C DOMINO TILE HORIZONTAL-06-01
+1F05D DOMINO TILE HORIZONTAL-06-02
+1F05E DOMINO TILE HORIZONTAL-06-03
+1F05F DOMINO TILE HORIZONTAL-06-04
+1F060 DOMINO TILE HORIZONTAL-06-05
+1F061 DOMINO TILE HORIZONTAL-06-06
+@ Vertical tiles
+1F062 DOMINO TILE VERTICAL BACK
+@ Zeroes
+1F063 DOMINO TILE VERTICAL-00-00
+1F064 DOMINO TILE VERTICAL-00-01
+1F065 DOMINO TILE VERTICAL-00-02
+1F066 DOMINO TILE VERTICAL-00-03
+1F067 DOMINO TILE VERTICAL-00-04
+1F068 DOMINO TILE VERTICAL-00-05
+1F069 DOMINO TILE VERTICAL-00-06
+@ Ones
+1F06A DOMINO TILE VERTICAL-01-00
+1F06B DOMINO TILE VERTICAL-01-01
+1F06C DOMINO TILE VERTICAL-01-02
+1F06D DOMINO TILE VERTICAL-01-03
+1F06E DOMINO TILE VERTICAL-01-04
+1F06F DOMINO TILE VERTICAL-01-05
+1F070 DOMINO TILE VERTICAL-01-06
+@ Twos
+1F071 DOMINO TILE VERTICAL-02-00
+1F072 DOMINO TILE VERTICAL-02-01
+1F073 DOMINO TILE VERTICAL-02-02
+1F074 DOMINO TILE VERTICAL-02-03
+1F075 DOMINO TILE VERTICAL-02-04
+1F076 DOMINO TILE VERTICAL-02-05
+1F077 DOMINO TILE VERTICAL-02-06
+@ Threes
+1F078 DOMINO TILE VERTICAL-03-00
+1F079 DOMINO TILE VERTICAL-03-01
+1F07A DOMINO TILE VERTICAL-03-02
+1F07B DOMINO TILE VERTICAL-03-03
+1F07C DOMINO TILE VERTICAL-03-04
+1F07D DOMINO TILE VERTICAL-03-05
+1F07E DOMINO TILE VERTICAL-03-06
+@ Fours
+1F07F DOMINO TILE VERTICAL-04-00
+1F080 DOMINO TILE VERTICAL-04-01
+1F081 DOMINO TILE VERTICAL-04-02
+1F082 DOMINO TILE VERTICAL-04-03
+1F083 DOMINO TILE VERTICAL-04-04
+1F084 DOMINO TILE VERTICAL-04-05
+1F085 DOMINO TILE VERTICAL-04-06
+@ Fives
+1F086 DOMINO TILE VERTICAL-05-00
+1F087 DOMINO TILE VERTICAL-05-01
+1F088 DOMINO TILE VERTICAL-05-02
+1F089 DOMINO TILE VERTICAL-05-03
+1F08A DOMINO TILE VERTICAL-05-04
+1F08B DOMINO TILE VERTICAL-05-05
+1F08C DOMINO TILE VERTICAL-05-06
+@ Sixes
+1F08D DOMINO TILE VERTICAL-06-00
+1F08E DOMINO TILE VERTICAL-06-01
+1F08F DOMINO TILE VERTICAL-06-02
+1F090 DOMINO TILE VERTICAL-06-03
+1F091 DOMINO TILE VERTICAL-06-04
+1F092 DOMINO TILE VERTICAL-06-05
+1F093 DOMINO TILE VERTICAL-06-06
+@@ 1FF80 Unassigned 1FFFF
+@ Not character codes
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+1FFFE <not a character>
+ * the value 1FFFE is guaranteed not to be a Unicode character at all
+1FFFF <not a character>
+ * the value 1FFFF is guaranteed not to be a Unicode character at all
+@@ 20000 CJK Unified Ideographs Extension B 2A6D6
+@@ 2F800 CJK Compatibility Ideographs Supplement 2FA1F
+@ Duplicate characters from CNS 11643-1992
+2F800 CJK COMPATIBILITY IDEOGRAPH-2F800
+ : 4E3D
+2F801 CJK COMPATIBILITY IDEOGRAPH-2F801
+ : 4E38
+2F802 CJK COMPATIBILITY IDEOGRAPH-2F802
+ : 4E41
+2F803 CJK COMPATIBILITY IDEOGRAPH-2F803
+ : 20122
+2F804 CJK COMPATIBILITY IDEOGRAPH-2F804
+ : 4F60
+2F805 CJK COMPATIBILITY IDEOGRAPH-2F805
+ : 4FAE
+2F806 CJK COMPATIBILITY IDEOGRAPH-2F806
+ : 4FBB
+2F807 CJK COMPATIBILITY IDEOGRAPH-2F807
+ : 5002
+2F808 CJK COMPATIBILITY IDEOGRAPH-2F808
+ : 507A
+2F809 CJK COMPATIBILITY IDEOGRAPH-2F809
+ : 5099
+2F80A CJK COMPATIBILITY IDEOGRAPH-2F80A
+ : 50E7
+2F80B CJK COMPATIBILITY IDEOGRAPH-2F80B
+ : 50CF
+2F80C CJK COMPATIBILITY IDEOGRAPH-2F80C
+ : 349E
+2F80D CJK COMPATIBILITY IDEOGRAPH-2F80D
+ x 5145
+ : 2063A
+2F80E CJK COMPATIBILITY IDEOGRAPH-2F80E
+ : 514D
+2F80F CJK COMPATIBILITY IDEOGRAPH-2F80F
+ : 5154
+2F810 CJK COMPATIBILITY IDEOGRAPH-2F810
+ : 5164
+2F811 CJK COMPATIBILITY IDEOGRAPH-2F811
+ : 5177
+2F812 CJK COMPATIBILITY IDEOGRAPH-2F812
+ : 2051C
+2F813 CJK COMPATIBILITY IDEOGRAPH-2F813
+ : 34B9
+2F814 CJK COMPATIBILITY IDEOGRAPH-2F814
+ x 5185
+ : 5167
+2F815 CJK COMPATIBILITY IDEOGRAPH-2F815
+ : 518D
+2F816 CJK COMPATIBILITY IDEOGRAPH-2F816
+ : 2054B
+2F817 CJK COMPATIBILITY IDEOGRAPH-2F817
+ : 5197
+2F818 CJK COMPATIBILITY IDEOGRAPH-2F818
+ : 51A4
+2F819 CJK COMPATIBILITY IDEOGRAPH-2F819
+ : 4ECC
+2F81A CJK COMPATIBILITY IDEOGRAPH-2F81A
+ : 51AC
+2F81B CJK COMPATIBILITY IDEOGRAPH-2F81B
+ : 51B5
+2F81C CJK COMPATIBILITY IDEOGRAPH-2F81C
+ : 291DF
+2F81D CJK COMPATIBILITY IDEOGRAPH-2F81D
+ : 51F5
+2F81E CJK COMPATIBILITY IDEOGRAPH-2F81E
+ : 5203
+2F81F CJK COMPATIBILITY IDEOGRAPH-2F81F
+ : 34DF
+2F820 CJK COMPATIBILITY IDEOGRAPH-2F820
+ : 523B
+2F821 CJK COMPATIBILITY IDEOGRAPH-2F821
+ : 5246
+2F822 CJK COMPATIBILITY IDEOGRAPH-2F822
+ : 5272
+2F823 CJK COMPATIBILITY IDEOGRAPH-2F823
+ : 5277
+2F824 CJK COMPATIBILITY IDEOGRAPH-2F824
+ : 3515
+2F825 CJK COMPATIBILITY IDEOGRAPH-2F825
+ : 52C7
+2F826 CJK COMPATIBILITY IDEOGRAPH-2F826
+ : 52C9
+2F827 CJK COMPATIBILITY IDEOGRAPH-2F827
+ : 52E4
+2F828 CJK COMPATIBILITY IDEOGRAPH-2F828
+ : 52FA
+2F829 CJK COMPATIBILITY IDEOGRAPH-2F829
+ : 5305
+2F82A CJK COMPATIBILITY IDEOGRAPH-2F82A
+ : 5306
+2F82B CJK COMPATIBILITY IDEOGRAPH-2F82B
+ : 5317
+2F82C CJK COMPATIBILITY IDEOGRAPH-2F82C
+ : 5349
+2F82D CJK COMPATIBILITY IDEOGRAPH-2F82D
+ : 5351
+2F82E CJK COMPATIBILITY IDEOGRAPH-2F82E
+ : 535A
+2F82F CJK COMPATIBILITY IDEOGRAPH-2F82F
+ : 5373
+2F830 CJK COMPATIBILITY IDEOGRAPH-2F830
+ : 537D
+2F831 CJK COMPATIBILITY IDEOGRAPH-2F831
+ : 537F
+2F832 CJK COMPATIBILITY IDEOGRAPH-2F832
+ : 537F
+2F833 CJK COMPATIBILITY IDEOGRAPH-2F833
+ : 537F
+2F834 CJK COMPATIBILITY IDEOGRAPH-2F834
+ : 20A2C
+2F835 CJK COMPATIBILITY IDEOGRAPH-2F835
+ : 7070
+2F836 CJK COMPATIBILITY IDEOGRAPH-2F836
+ : 53CA
+2F837 CJK COMPATIBILITY IDEOGRAPH-2F837
+ : 53DF
+2F838 CJK COMPATIBILITY IDEOGRAPH-2F838
+ : 20B63
+2F839 CJK COMPATIBILITY IDEOGRAPH-2F839
+ : 53EB
+2F83A CJK COMPATIBILITY IDEOGRAPH-2F83A
+ : 53F1
+2F83B CJK COMPATIBILITY IDEOGRAPH-2F83B
+ : 5406
+2F83C CJK COMPATIBILITY IDEOGRAPH-2F83C
+ : 549E
+2F83D CJK COMPATIBILITY IDEOGRAPH-2F83D
+ : 5438
+2F83E CJK COMPATIBILITY IDEOGRAPH-2F83E
+ : 5448
+2F83F CJK COMPATIBILITY IDEOGRAPH-2F83F
+ : 5468
+2F840 CJK COMPATIBILITY IDEOGRAPH-2F840
+ : 54A2
+2F841 CJK COMPATIBILITY IDEOGRAPH-2F841
+ : 54F6
+2F842 CJK COMPATIBILITY IDEOGRAPH-2F842
+ : 5510
+2F843 CJK COMPATIBILITY IDEOGRAPH-2F843
+ : 5553
+2F844 CJK COMPATIBILITY IDEOGRAPH-2F844
+ : 5563
+2F845 CJK COMPATIBILITY IDEOGRAPH-2F845
+ : 5584
+2F846 CJK COMPATIBILITY IDEOGRAPH-2F846
+ : 5584
+2F847 CJK COMPATIBILITY IDEOGRAPH-2F847
+ : 5599
+2F848 CJK COMPATIBILITY IDEOGRAPH-2F848
+ : 55AB
+2F849 CJK COMPATIBILITY IDEOGRAPH-2F849
+ : 55B3
+2F84A CJK COMPATIBILITY IDEOGRAPH-2F84A
+ : 55C2
+2F84B CJK COMPATIBILITY IDEOGRAPH-2F84B
+ : 5716
+2F84C CJK COMPATIBILITY IDEOGRAPH-2F84C
+ : 5606
+2F84D CJK COMPATIBILITY IDEOGRAPH-2F84D
+ : 5717
+2F84E CJK COMPATIBILITY IDEOGRAPH-2F84E
+ : 5651
+2F84F CJK COMPATIBILITY IDEOGRAPH-2F84F
+ : 5674
+2F850 CJK COMPATIBILITY IDEOGRAPH-2F850
+ : 5207
+2F851 CJK COMPATIBILITY IDEOGRAPH-2F851
+ : 58EE
+2F852 CJK COMPATIBILITY IDEOGRAPH-2F852
+ : 57CE
+2F853 CJK COMPATIBILITY IDEOGRAPH-2F853
+ : 57F4
+2F854 CJK COMPATIBILITY IDEOGRAPH-2F854
+ : 580D
+2F855 CJK COMPATIBILITY IDEOGRAPH-2F855
+ : 578B
+2F856 CJK COMPATIBILITY IDEOGRAPH-2F856
+ : 5832
+2F857 CJK COMPATIBILITY IDEOGRAPH-2F857
+ : 5831
+2F858 CJK COMPATIBILITY IDEOGRAPH-2F858
+ : 58AC
+2F859 CJK COMPATIBILITY IDEOGRAPH-2F859
+ : 214E4
+2F85A CJK COMPATIBILITY IDEOGRAPH-2F85A
+ x 58F3
+ : 58F2
+2F85B CJK COMPATIBILITY IDEOGRAPH-2F85B
+ x 21533
+ : 58F7
+2F85C CJK COMPATIBILITY IDEOGRAPH-2F85C
+ : 5906
+2F85D CJK COMPATIBILITY IDEOGRAPH-2F85D
+ : 591A
+2F85E CJK COMPATIBILITY IDEOGRAPH-2F85E
+ : 5922
+2F85F CJK COMPATIBILITY IDEOGRAPH-2F85F
+ : 5962
+2F860 CJK COMPATIBILITY IDEOGRAPH-2F860
+ : 216A8
+2F861 CJK COMPATIBILITY IDEOGRAPH-2F861
+ : 216EA
+2F862 CJK COMPATIBILITY IDEOGRAPH-2F862
+ : 59EC
+2F863 CJK COMPATIBILITY IDEOGRAPH-2F863
+ : 5A1B
+2F864 CJK COMPATIBILITY IDEOGRAPH-2F864
+ : 5A27
+2F865 CJK COMPATIBILITY IDEOGRAPH-2F865
+ : 59D8
+2F866 CJK COMPATIBILITY IDEOGRAPH-2F866
+ : 5A66
+2F867 CJK COMPATIBILITY IDEOGRAPH-2F867
+ : 36EE
+2F868 CJK COMPATIBILITY IDEOGRAPH-2F868
+ : 36FC
+2F869 CJK COMPATIBILITY IDEOGRAPH-2F869
+ : 5B08
+2F86A CJK COMPATIBILITY IDEOGRAPH-2F86A
+ : 5B3E
+2F86B CJK COMPATIBILITY IDEOGRAPH-2F86B
+ : 5B3E
+2F86C CJK COMPATIBILITY IDEOGRAPH-2F86C
+ : 219C8
+2F86D CJK COMPATIBILITY IDEOGRAPH-2F86D
+ : 5BC3
+2F86E CJK COMPATIBILITY IDEOGRAPH-2F86E
+ : 5BD8
+2F86F CJK COMPATIBILITY IDEOGRAPH-2F86F
+ : 5BE7
+2F870 CJK COMPATIBILITY IDEOGRAPH-2F870
+ : 5BF3
+2F871 CJK COMPATIBILITY IDEOGRAPH-2F871
+ : 21B18
+2F872 CJK COMPATIBILITY IDEOGRAPH-2F872
+ : 5BFF
+2F873 CJK COMPATIBILITY IDEOGRAPH-2F873
+ : 5C06
+2F874 CJK COMPATIBILITY IDEOGRAPH-2F874
+ : 5F53
+2F875 CJK COMPATIBILITY IDEOGRAPH-2F875
+ : 5C22
+2F876 CJK COMPATIBILITY IDEOGRAPH-2F876
+ : 3781
+2F877 CJK COMPATIBILITY IDEOGRAPH-2F877
+ : 5C60
+2F878 CJK COMPATIBILITY IDEOGRAPH-2F878
+ : 5C6E
+2F879 CJK COMPATIBILITY IDEOGRAPH-2F879
+ : 5CC0
+2F87A CJK COMPATIBILITY IDEOGRAPH-2F87A
+ : 5C8D
+2F87B CJK COMPATIBILITY IDEOGRAPH-2F87B
+ : 21DE4
+2F87C CJK COMPATIBILITY IDEOGRAPH-2F87C
+ : 5D43
+2F87D CJK COMPATIBILITY IDEOGRAPH-2F87D
+ : 21DE6
+2F87E CJK COMPATIBILITY IDEOGRAPH-2F87E
+ : 5D6E
+2F87F CJK COMPATIBILITY IDEOGRAPH-2F87F
+ : 5D6B
+2F880 CJK COMPATIBILITY IDEOGRAPH-2F880
+ : 5D7C
+2F881 CJK COMPATIBILITY IDEOGRAPH-2F881
+ : 5DE1
+2F882 CJK COMPATIBILITY IDEOGRAPH-2F882
+ : 5DE2
+2F883 CJK COMPATIBILITY IDEOGRAPH-2F883
+ : 382F
+2F884 CJK COMPATIBILITY IDEOGRAPH-2F884
+ : 5DFD
+2F885 CJK COMPATIBILITY IDEOGRAPH-2F885
+ : 5E28
+2F886 CJK COMPATIBILITY IDEOGRAPH-2F886
+ : 5E3D
+2F887 CJK COMPATIBILITY IDEOGRAPH-2F887
+ : 5E69
+2F888 CJK COMPATIBILITY IDEOGRAPH-2F888
+ : 3862
+2F889 CJK COMPATIBILITY IDEOGRAPH-2F889
+ : 22183
+2F88A CJK COMPATIBILITY IDEOGRAPH-2F88A
+ : 387C
+2F88B CJK COMPATIBILITY IDEOGRAPH-2F88B
+ : 5EB0
+2F88C CJK COMPATIBILITY IDEOGRAPH-2F88C
+ : 5EB3
+2F88D CJK COMPATIBILITY IDEOGRAPH-2F88D
+ : 5EB6
+2F88E CJK COMPATIBILITY IDEOGRAPH-2F88E
+ : 5ECA
+2F88F CJK COMPATIBILITY IDEOGRAPH-2F88F
+ : 2A392
+2F890 CJK COMPATIBILITY IDEOGRAPH-2F890
+ : 5EFE
+2F891 CJK COMPATIBILITY IDEOGRAPH-2F891
+ : 22331
+2F892 CJK COMPATIBILITY IDEOGRAPH-2F892
+ : 22331
+2F893 CJK COMPATIBILITY IDEOGRAPH-2F893
+ : 8201
+2F894 CJK COMPATIBILITY IDEOGRAPH-2F894
+ : 5F22
+2F895 CJK COMPATIBILITY IDEOGRAPH-2F895
+ : 5F22
+2F896 CJK COMPATIBILITY IDEOGRAPH-2F896
+ : 38C7
+2F897 CJK COMPATIBILITY IDEOGRAPH-2F897
+ : 232B8
+2F898 CJK COMPATIBILITY IDEOGRAPH-2F898
+ : 261DA
+2F899 CJK COMPATIBILITY IDEOGRAPH-2F899
+ : 5F62
+2F89A CJK COMPATIBILITY IDEOGRAPH-2F89A
+ : 5F6B
+2F89B CJK COMPATIBILITY IDEOGRAPH-2F89B
+ : 38E3
+2F89C CJK COMPATIBILITY IDEOGRAPH-2F89C
+ x 22505
+ : 5F9A
+2F89D CJK COMPATIBILITY IDEOGRAPH-2F89D
+ : 5FCD
+2F89E CJK COMPATIBILITY IDEOGRAPH-2F89E
+ : 5FD7
+2F89F CJK COMPATIBILITY IDEOGRAPH-2F89F
+ : 5FF9
+2F8A0 CJK COMPATIBILITY IDEOGRAPH-2F8A0
+ : 6081
+2F8A1 CJK COMPATIBILITY IDEOGRAPH-2F8A1
+ : 393A
+2F8A2 CJK COMPATIBILITY IDEOGRAPH-2F8A2
+ : 391C
+2F8A3 CJK COMPATIBILITY IDEOGRAPH-2F8A3
+ : 6094
+2F8A4 CJK COMPATIBILITY IDEOGRAPH-2F8A4
+ : 226D4
+2F8A5 CJK COMPATIBILITY IDEOGRAPH-2F8A5
+ : 60C7
+2F8A6 CJK COMPATIBILITY IDEOGRAPH-2F8A6
+ : 6148
+2F8A7 CJK COMPATIBILITY IDEOGRAPH-2F8A7
+ : 614C
+2F8A8 CJK COMPATIBILITY IDEOGRAPH-2F8A8
+ : 614E
+2F8A9 CJK COMPATIBILITY IDEOGRAPH-2F8A9
+ : 614C
+2F8AA CJK COMPATIBILITY IDEOGRAPH-2F8AA
+ : 617A
+2F8AB CJK COMPATIBILITY IDEOGRAPH-2F8AB
+ : 618E
+2F8AC CJK COMPATIBILITY IDEOGRAPH-2F8AC
+ : 61B2
+2F8AD CJK COMPATIBILITY IDEOGRAPH-2F8AD
+ : 61A4
+2F8AE CJK COMPATIBILITY IDEOGRAPH-2F8AE
+ : 61AF
+2F8AF CJK COMPATIBILITY IDEOGRAPH-2F8AF
+ : 61DE
+2F8B0 CJK COMPATIBILITY IDEOGRAPH-2F8B0
+ : 61F2
+2F8B1 CJK COMPATIBILITY IDEOGRAPH-2F8B1
+ : 61F6
+2F8B2 CJK COMPATIBILITY IDEOGRAPH-2F8B2
+ : 6210
+2F8B3 CJK COMPATIBILITY IDEOGRAPH-2F8B3
+ : 621B
+2F8B4 CJK COMPATIBILITY IDEOGRAPH-2F8B4
+ : 625D
+2F8B5 CJK COMPATIBILITY IDEOGRAPH-2F8B5
+ : 62B1
+2F8B6 CJK COMPATIBILITY IDEOGRAPH-2F8B6
+ : 62D4
+2F8B7 CJK COMPATIBILITY IDEOGRAPH-2F8B7
+ : 6350
+2F8B8 CJK COMPATIBILITY IDEOGRAPH-2F8B8
+ : 22B0C
+2F8B9 CJK COMPATIBILITY IDEOGRAPH-2F8B9
+ : 633D
+2F8BA CJK COMPATIBILITY IDEOGRAPH-2F8BA
+ : 62FC
+2F8BB CJK COMPATIBILITY IDEOGRAPH-2F8BB
+ : 6368
+2F8BC CJK COMPATIBILITY IDEOGRAPH-2F8BC
+ : 6383
+2F8BD CJK COMPATIBILITY IDEOGRAPH-2F8BD
+ : 63E4
+2F8BE CJK COMPATIBILITY IDEOGRAPH-2F8BE
+ : 22BF1
+2F8BF CJK COMPATIBILITY IDEOGRAPH-2F8BF
+ : 6422
+2F8C0 CJK COMPATIBILITY IDEOGRAPH-2F8C0
+ : 63C5
+2F8C1 CJK COMPATIBILITY IDEOGRAPH-2F8C1
+ : 63A9
+2F8C2 CJK COMPATIBILITY IDEOGRAPH-2F8C2
+ : 3A2E
+2F8C3 CJK COMPATIBILITY IDEOGRAPH-2F8C3
+ : 6469
+2F8C4 CJK COMPATIBILITY IDEOGRAPH-2F8C4
+ : 647E
+2F8C5 CJK COMPATIBILITY IDEOGRAPH-2F8C5
+ : 649D
+2F8C6 CJK COMPATIBILITY IDEOGRAPH-2F8C6
+ : 6477
+2F8C7 CJK COMPATIBILITY IDEOGRAPH-2F8C7
+ : 3A6C
+2F8C8 CJK COMPATIBILITY IDEOGRAPH-2F8C8
+ : 654F
+2F8C9 CJK COMPATIBILITY IDEOGRAPH-2F8C9
+ : 656C
+2F8CA CJK COMPATIBILITY IDEOGRAPH-2F8CA
+ : 2300A
+2F8CB CJK COMPATIBILITY IDEOGRAPH-2F8CB
+ : 65E3
+2F8CC CJK COMPATIBILITY IDEOGRAPH-2F8CC
+ : 66F8
+2F8CD CJK COMPATIBILITY IDEOGRAPH-2F8CD
+ : 6649
+2F8CE CJK COMPATIBILITY IDEOGRAPH-2F8CE
+ : 3B19
+2F8CF CJK COMPATIBILITY IDEOGRAPH-2F8CF
+ : 6691
+2F8D0 CJK COMPATIBILITY IDEOGRAPH-2F8D0
+ : 3B08
+2F8D1 CJK COMPATIBILITY IDEOGRAPH-2F8D1
+ : 3AE4
+2F8D2 CJK COMPATIBILITY IDEOGRAPH-2F8D2
+ : 5192
+2F8D3 CJK COMPATIBILITY IDEOGRAPH-2F8D3
+ : 5195
+2F8D4 CJK COMPATIBILITY IDEOGRAPH-2F8D4
+ : 6700
+2F8D5 CJK COMPATIBILITY IDEOGRAPH-2F8D5
+ : 669C
+2F8D6 CJK COMPATIBILITY IDEOGRAPH-2F8D6
+ : 80AD
+2F8D7 CJK COMPATIBILITY IDEOGRAPH-2F8D7
+ : 43D9
+2F8D8 CJK COMPATIBILITY IDEOGRAPH-2F8D8
+ : 6717
+2F8D9 CJK COMPATIBILITY IDEOGRAPH-2F8D9
+ : 671B
+2F8DA CJK COMPATIBILITY IDEOGRAPH-2F8DA
+ : 6721
+2F8DB CJK COMPATIBILITY IDEOGRAPH-2F8DB
+ : 675E
+2F8DC CJK COMPATIBILITY IDEOGRAPH-2F8DC
+ : 6753
+2F8DD CJK COMPATIBILITY IDEOGRAPH-2F8DD
+ : 233C3
+2F8DE CJK COMPATIBILITY IDEOGRAPH-2F8DE
+ : 3B49
+2F8DF CJK COMPATIBILITY IDEOGRAPH-2F8DF
+ : 67FA
+2F8E0 CJK COMPATIBILITY IDEOGRAPH-2F8E0
+ : 6785
+2F8E1 CJK COMPATIBILITY IDEOGRAPH-2F8E1
+ : 6852
+2F8E2 CJK COMPATIBILITY IDEOGRAPH-2F8E2
+ : 6885
+2F8E3 CJK COMPATIBILITY IDEOGRAPH-2F8E3
+ : 2346D
+2F8E4 CJK COMPATIBILITY IDEOGRAPH-2F8E4
+ : 688E
+2F8E5 CJK COMPATIBILITY IDEOGRAPH-2F8E5
+ : 681F
+2F8E6 CJK COMPATIBILITY IDEOGRAPH-2F8E6
+ : 6914
+2F8E7 CJK COMPATIBILITY IDEOGRAPH-2F8E7
+ : 3B9D
+2F8E8 CJK COMPATIBILITY IDEOGRAPH-2F8E8
+ : 6942
+2F8E9 CJK COMPATIBILITY IDEOGRAPH-2F8E9
+ : 69A3
+2F8EA CJK COMPATIBILITY IDEOGRAPH-2F8EA
+ : 69EA
+2F8EB CJK COMPATIBILITY IDEOGRAPH-2F8EB
+ : 6AA8
+2F8EC CJK COMPATIBILITY IDEOGRAPH-2F8EC
+ : 236A3
+2F8ED CJK COMPATIBILITY IDEOGRAPH-2F8ED
+ : 6ADB
+2F8EE CJK COMPATIBILITY IDEOGRAPH-2F8EE
+ : 3C18
+2F8EF CJK COMPATIBILITY IDEOGRAPH-2F8EF
+ : 6B21
+2F8F0 CJK COMPATIBILITY IDEOGRAPH-2F8F0
+ : 238A7
+2F8F1 CJK COMPATIBILITY IDEOGRAPH-2F8F1
+ : 6B54
+2F8F2 CJK COMPATIBILITY IDEOGRAPH-2F8F2
+ : 3C4E
+2F8F3 CJK COMPATIBILITY IDEOGRAPH-2F8F3
+ : 6B72
+2F8F4 CJK COMPATIBILITY IDEOGRAPH-2F8F4
+ : 6B9F
+2F8F5 CJK COMPATIBILITY IDEOGRAPH-2F8F5
+ : 6BBA
+2F8F6 CJK COMPATIBILITY IDEOGRAPH-2F8F6
+ : 6BBB
+2F8F7 CJK COMPATIBILITY IDEOGRAPH-2F8F7
+ : 23A8D
+2F8F8 CJK COMPATIBILITY IDEOGRAPH-2F8F8
+ : 21D0B
+2F8F9 CJK COMPATIBILITY IDEOGRAPH-2F8F9
+ : 23AFA
+2F8FA CJK COMPATIBILITY IDEOGRAPH-2F8FA
+ : 6C4E
+2F8FB CJK COMPATIBILITY IDEOGRAPH-2F8FB
+ : 23CBC
+2F8FC CJK COMPATIBILITY IDEOGRAPH-2F8FC
+ : 6CBF
+2F8FD CJK COMPATIBILITY IDEOGRAPH-2F8FD
+ : 6CCD
+2F8FE CJK COMPATIBILITY IDEOGRAPH-2F8FE
+ : 6C67
+2F8FF CJK COMPATIBILITY IDEOGRAPH-2F8FF
+ : 6D16
+2F900 CJK COMPATIBILITY IDEOGRAPH-2F900
+ : 6D3E
+2F901 CJK COMPATIBILITY IDEOGRAPH-2F901
+ : 6D77
+2F902 CJK COMPATIBILITY IDEOGRAPH-2F902
+ : 6D41
+2F903 CJK COMPATIBILITY IDEOGRAPH-2F903
+ : 6D69
+2F904 CJK COMPATIBILITY IDEOGRAPH-2F904
+ : 6D78
+2F905 CJK COMPATIBILITY IDEOGRAPH-2F905
+ : 6D85
+2F906 CJK COMPATIBILITY IDEOGRAPH-2F906
+ : 23D1E
+2F907 CJK COMPATIBILITY IDEOGRAPH-2F907
+ : 6D34
+2F908 CJK COMPATIBILITY IDEOGRAPH-2F908
+ : 6E2F
+2F909 CJK COMPATIBILITY IDEOGRAPH-2F909
+ : 6E6E
+2F90A CJK COMPATIBILITY IDEOGRAPH-2F90A
+ : 3D33
+2F90B CJK COMPATIBILITY IDEOGRAPH-2F90B
+ : 6ECB
+2F90C CJK COMPATIBILITY IDEOGRAPH-2F90C
+ : 6EC7
+2F90D CJK COMPATIBILITY IDEOGRAPH-2F90D
+ : 23ED1
+2F90E CJK COMPATIBILITY IDEOGRAPH-2F90E
+ : 6DF9
+2F90F CJK COMPATIBILITY IDEOGRAPH-2F90F
+ : 6F6E
+2F910 CJK COMPATIBILITY IDEOGRAPH-2F910
+ : 23F5E
+2F911 CJK COMPATIBILITY IDEOGRAPH-2F911
+ : 23F8E
+2F912 CJK COMPATIBILITY IDEOGRAPH-2F912
+ : 6FC6
+2F913 CJK COMPATIBILITY IDEOGRAPH-2F913
+ : 7039
+2F914 CJK COMPATIBILITY IDEOGRAPH-2F914
+ : 701E
+2F915 CJK COMPATIBILITY IDEOGRAPH-2F915
+ : 701B
+2F916 CJK COMPATIBILITY IDEOGRAPH-2F916
+ : 3D96
+2F917 CJK COMPATIBILITY IDEOGRAPH-2F917
+ : 704A
+2F918 CJK COMPATIBILITY IDEOGRAPH-2F918
+ : 707D
+2F919 CJK COMPATIBILITY IDEOGRAPH-2F919
+ : 7077
+2F91A CJK COMPATIBILITY IDEOGRAPH-2F91A
+ : 70AD
+2F91B CJK COMPATIBILITY IDEOGRAPH-2F91B
+ : 20525
+2F91C CJK COMPATIBILITY IDEOGRAPH-2F91C
+ : 7145
+2F91D CJK COMPATIBILITY IDEOGRAPH-2F91D
+ : 24263
+2F91E CJK COMPATIBILITY IDEOGRAPH-2F91E
+ : 719C
+2F91F CJK COMPATIBILITY IDEOGRAPH-2F91F
+ : 243AB
+2F920 CJK COMPATIBILITY IDEOGRAPH-2F920
+ : 7228
+2F921 CJK COMPATIBILITY IDEOGRAPH-2F921
+ : 7235
+2F922 CJK COMPATIBILITY IDEOGRAPH-2F922
+ : 7250
+2F923 CJK COMPATIBILITY IDEOGRAPH-2F923
+ : 24608
+2F924 CJK COMPATIBILITY IDEOGRAPH-2F924
+ : 7280
+2F925 CJK COMPATIBILITY IDEOGRAPH-2F925
+ : 7295
+2F926 CJK COMPATIBILITY IDEOGRAPH-2F926
+ : 24735
+2F927 CJK COMPATIBILITY IDEOGRAPH-2F927
+ : 24814
+2F928 CJK COMPATIBILITY IDEOGRAPH-2F928
+ : 737A
+2F929 CJK COMPATIBILITY IDEOGRAPH-2F929
+ : 738B
+2F92A CJK COMPATIBILITY IDEOGRAPH-2F92A
+ : 3EAC
+2F92B CJK COMPATIBILITY IDEOGRAPH-2F92B
+ : 73A5
+2F92C CJK COMPATIBILITY IDEOGRAPH-2F92C
+ : 3EB8
+2F92D CJK COMPATIBILITY IDEOGRAPH-2F92D
+ : 3EB8
+2F92E CJK COMPATIBILITY IDEOGRAPH-2F92E
+ : 7447
+2F92F CJK COMPATIBILITY IDEOGRAPH-2F92F
+ : 745C
+2F930 CJK COMPATIBILITY IDEOGRAPH-2F930
+ : 7471
+2F931 CJK COMPATIBILITY IDEOGRAPH-2F931
+ : 7485
+2F932 CJK COMPATIBILITY IDEOGRAPH-2F932
+ : 74CA
+2F933 CJK COMPATIBILITY IDEOGRAPH-2F933
+ : 3F1B
+2F934 CJK COMPATIBILITY IDEOGRAPH-2F934
+ : 7524
+2F935 CJK COMPATIBILITY IDEOGRAPH-2F935
+ : 24C36
+2F936 CJK COMPATIBILITY IDEOGRAPH-2F936
+ : 753E
+2F937 CJK COMPATIBILITY IDEOGRAPH-2F937
+ : 24C92
+2F938 CJK COMPATIBILITY IDEOGRAPH-2F938
+ : 7570
+2F939 CJK COMPATIBILITY IDEOGRAPH-2F939
+ : 2219F
+2F93A CJK COMPATIBILITY IDEOGRAPH-2F93A
+ : 7610
+2F93B CJK COMPATIBILITY IDEOGRAPH-2F93B
+ : 24FA1
+2F93C CJK COMPATIBILITY IDEOGRAPH-2F93C
+ : 24FB8
+2F93D CJK COMPATIBILITY IDEOGRAPH-2F93D
+ : 25044
+2F93E CJK COMPATIBILITY IDEOGRAPH-2F93E
+ : 3FFC
+2F93F CJK COMPATIBILITY IDEOGRAPH-2F93F
+ : 4008
+2F940 CJK COMPATIBILITY IDEOGRAPH-2F940
+ : 76F4
+2F941 CJK COMPATIBILITY IDEOGRAPH-2F941
+ : 250F3
+2F942 CJK COMPATIBILITY IDEOGRAPH-2F942
+ : 250F2
+2F943 CJK COMPATIBILITY IDEOGRAPH-2F943
+ : 25119
+2F944 CJK COMPATIBILITY IDEOGRAPH-2F944
+ : 25133
+2F945 CJK COMPATIBILITY IDEOGRAPH-2F945
+ : 771E
+2F946 CJK COMPATIBILITY IDEOGRAPH-2F946
+ : 771F
+2F947 CJK COMPATIBILITY IDEOGRAPH-2F947
+ : 771F
+2F948 CJK COMPATIBILITY IDEOGRAPH-2F948
+ : 774A
+2F949 CJK COMPATIBILITY IDEOGRAPH-2F949
+ : 4039
+2F94A CJK COMPATIBILITY IDEOGRAPH-2F94A
+ : 778B
+2F94B CJK COMPATIBILITY IDEOGRAPH-2F94B
+ : 4046
+2F94C CJK COMPATIBILITY IDEOGRAPH-2F94C
+ : 4096
+2F94D CJK COMPATIBILITY IDEOGRAPH-2F94D
+ : 2541D
+2F94E CJK COMPATIBILITY IDEOGRAPH-2F94E
+ : 784E
+2F94F CJK COMPATIBILITY IDEOGRAPH-2F94F
+ : 788C
+2F950 CJK COMPATIBILITY IDEOGRAPH-2F950
+ : 78CC
+2F951 CJK COMPATIBILITY IDEOGRAPH-2F951
+ : 40E3
+2F952 CJK COMPATIBILITY IDEOGRAPH-2F952
+ : 25626
+2F953 CJK COMPATIBILITY IDEOGRAPH-2F953
+ : 7956
+2F954 CJK COMPATIBILITY IDEOGRAPH-2F954
+ : 2569A
+2F955 CJK COMPATIBILITY IDEOGRAPH-2F955
+ : 256C5
+2F956 CJK COMPATIBILITY IDEOGRAPH-2F956
+ : 798F
+2F957 CJK COMPATIBILITY IDEOGRAPH-2F957
+ : 79EB
+2F958 CJK COMPATIBILITY IDEOGRAPH-2F958
+ : 412F
+2F959 CJK COMPATIBILITY IDEOGRAPH-2F959
+ : 7A40
+2F95A CJK COMPATIBILITY IDEOGRAPH-2F95A
+ : 7A4A
+2F95B CJK COMPATIBILITY IDEOGRAPH-2F95B
+ : 7A4F
+2F95C CJK COMPATIBILITY IDEOGRAPH-2F95C
+ : 2597C
+2F95D CJK COMPATIBILITY IDEOGRAPH-2F95D
+ : 25AA7
+2F95E CJK COMPATIBILITY IDEOGRAPH-2F95E
+ : 25AA7
+2F95F CJK COMPATIBILITY IDEOGRAPH-2F95F
+ : 7AEE
+2F960 CJK COMPATIBILITY IDEOGRAPH-2F960
+ : 4202
+2F961 CJK COMPATIBILITY IDEOGRAPH-2F961
+ : 25BAB
+2F962 CJK COMPATIBILITY IDEOGRAPH-2F962
+ : 7BC6
+2F963 CJK COMPATIBILITY IDEOGRAPH-2F963
+ : 7BC9
+2F964 CJK COMPATIBILITY IDEOGRAPH-2F964
+ : 4227
+2F965 CJK COMPATIBILITY IDEOGRAPH-2F965
+ : 25C80
+2F966 CJK COMPATIBILITY IDEOGRAPH-2F966
+ : 7CD2
+2F967 CJK COMPATIBILITY IDEOGRAPH-2F967
+ : 42A0
+2F968 CJK COMPATIBILITY IDEOGRAPH-2F968
+ : 7CE8
+2F969 CJK COMPATIBILITY IDEOGRAPH-2F969
+ : 7CE3
+2F96A CJK COMPATIBILITY IDEOGRAPH-2F96A
+ : 7D00
+2F96B CJK COMPATIBILITY IDEOGRAPH-2F96B
+ : 25F86
+2F96C CJK COMPATIBILITY IDEOGRAPH-2F96C
+ : 7D63
+2F96D CJK COMPATIBILITY IDEOGRAPH-2F96D
+ : 4301
+2F96E CJK COMPATIBILITY IDEOGRAPH-2F96E
+ : 7DC7
+2F96F CJK COMPATIBILITY IDEOGRAPH-2F96F
+ : 7E02
+2F970 CJK COMPATIBILITY IDEOGRAPH-2F970
+ : 7E45
+2F971 CJK COMPATIBILITY IDEOGRAPH-2F971
+ : 4334
+2F972 CJK COMPATIBILITY IDEOGRAPH-2F972
+ : 26228
+2F973 CJK COMPATIBILITY IDEOGRAPH-2F973
+ : 26247
+2F974 CJK COMPATIBILITY IDEOGRAPH-2F974
+ : 4359
+2F975 CJK COMPATIBILITY IDEOGRAPH-2F975
+ : 262D9
+2F976 CJK COMPATIBILITY IDEOGRAPH-2F976
+ : 7F7A
+2F977 CJK COMPATIBILITY IDEOGRAPH-2F977
+ : 2633E
+2F978 CJK COMPATIBILITY IDEOGRAPH-2F978
+ : 7F95
+2F979 CJK COMPATIBILITY IDEOGRAPH-2F979
+ : 7FFA
+2F97A CJK COMPATIBILITY IDEOGRAPH-2F97A
+ : 8005
+2F97B CJK COMPATIBILITY IDEOGRAPH-2F97B
+ : 264DA
+2F97C CJK COMPATIBILITY IDEOGRAPH-2F97C
+ : 26523
+2F97D CJK COMPATIBILITY IDEOGRAPH-2F97D
+ : 8060
+2F97E CJK COMPATIBILITY IDEOGRAPH-2F97E
+ : 265A8
+2F97F CJK COMPATIBILITY IDEOGRAPH-2F97F
+ : 8070
+2F980 CJK COMPATIBILITY IDEOGRAPH-2F980
+ : 2335F
+2F981 CJK COMPATIBILITY IDEOGRAPH-2F981
+ : 43D5
+2F982 CJK COMPATIBILITY IDEOGRAPH-2F982
+ : 80B2
+2F983 CJK COMPATIBILITY IDEOGRAPH-2F983
+ : 8103
+2F984 CJK COMPATIBILITY IDEOGRAPH-2F984
+ : 440B
+2F985 CJK COMPATIBILITY IDEOGRAPH-2F985
+ : 813E
+2F986 CJK COMPATIBILITY IDEOGRAPH-2F986
+ : 5AB5
+2F987 CJK COMPATIBILITY IDEOGRAPH-2F987
+ : 267A7
+2F988 CJK COMPATIBILITY IDEOGRAPH-2F988
+ : 267B5
+2F989 CJK COMPATIBILITY IDEOGRAPH-2F989
+ : 23393
+2F98A CJK COMPATIBILITY IDEOGRAPH-2F98A
+ : 2339C
+2F98B CJK COMPATIBILITY IDEOGRAPH-2F98B
+ : 8201
+2F98C CJK COMPATIBILITY IDEOGRAPH-2F98C
+ : 8204
+2F98D CJK COMPATIBILITY IDEOGRAPH-2F98D
+ : 8F9E
+2F98E CJK COMPATIBILITY IDEOGRAPH-2F98E
+ : 446B
+2F98F CJK COMPATIBILITY IDEOGRAPH-2F98F
+ : 8291
+2F990 CJK COMPATIBILITY IDEOGRAPH-2F990
+ : 828B
+2F991 CJK COMPATIBILITY IDEOGRAPH-2F991
+ : 829D
+2F992 CJK COMPATIBILITY IDEOGRAPH-2F992
+ : 52B3
+2F993 CJK COMPATIBILITY IDEOGRAPH-2F993
+ : 82B1
+2F994 CJK COMPATIBILITY IDEOGRAPH-2F994
+ : 82B3
+2F995 CJK COMPATIBILITY IDEOGRAPH-2F995
+ : 82BD
+2F996 CJK COMPATIBILITY IDEOGRAPH-2F996
+ : 82E6
+2F997 CJK COMPATIBILITY IDEOGRAPH-2F997
+ : 26B3C
+2F998 CJK COMPATIBILITY IDEOGRAPH-2F998
+ : 82E5
+2F999 CJK COMPATIBILITY IDEOGRAPH-2F999
+ : 831D
+2F99A CJK COMPATIBILITY IDEOGRAPH-2F99A
+ : 8363
+2F99B CJK COMPATIBILITY IDEOGRAPH-2F99B
+ : 83AD
+2F99C CJK COMPATIBILITY IDEOGRAPH-2F99C
+ : 8323
+2F99D CJK COMPATIBILITY IDEOGRAPH-2F99D
+ : 83BD
+2F99E CJK COMPATIBILITY IDEOGRAPH-2F99E
+ : 83E7
+2F99F CJK COMPATIBILITY IDEOGRAPH-2F99F
+ : 8457
+2F9A0 CJK COMPATIBILITY IDEOGRAPH-2F9A0
+ : 8353
+2F9A1 CJK COMPATIBILITY IDEOGRAPH-2F9A1
+ : 83CA
+2F9A2 CJK COMPATIBILITY IDEOGRAPH-2F9A2
+ : 83CC
+2F9A3 CJK COMPATIBILITY IDEOGRAPH-2F9A3
+ : 83DC
+2F9A4 CJK COMPATIBILITY IDEOGRAPH-2F9A4
+ : 26C36
+2F9A5 CJK COMPATIBILITY IDEOGRAPH-2F9A5
+ : 26D6B
+2F9A6 CJK COMPATIBILITY IDEOGRAPH-2F9A6
+ : 26CD5
+2F9A7 CJK COMPATIBILITY IDEOGRAPH-2F9A7
+ : 452B
+2F9A8 CJK COMPATIBILITY IDEOGRAPH-2F9A8
+ : 84F1
+2F9A9 CJK COMPATIBILITY IDEOGRAPH-2F9A9
+ : 84F3
+2F9AA CJK COMPATIBILITY IDEOGRAPH-2F9AA
+ : 8516
+2F9AB CJK COMPATIBILITY IDEOGRAPH-2F9AB
+ : 273CA
+2F9AC CJK COMPATIBILITY IDEOGRAPH-2F9AC
+ : 8564
+2F9AD CJK COMPATIBILITY IDEOGRAPH-2F9AD
+ : 26F2C
+2F9AE CJK COMPATIBILITY IDEOGRAPH-2F9AE
+ : 455D
+2F9AF CJK COMPATIBILITY IDEOGRAPH-2F9AF
+ : 4561
+2F9B0 CJK COMPATIBILITY IDEOGRAPH-2F9B0
+ : 26FB1
+2F9B1 CJK COMPATIBILITY IDEOGRAPH-2F9B1
+ : 270D2
+2F9B2 CJK COMPATIBILITY IDEOGRAPH-2F9B2
+ x 5914
+ x 270CD
+ x 270F0
+ : 456B
+2F9B3 CJK COMPATIBILITY IDEOGRAPH-2F9B3
+ : 8650
+2F9B4 CJK COMPATIBILITY IDEOGRAPH-2F9B4
+ : 865C
+2F9B5 CJK COMPATIBILITY IDEOGRAPH-2F9B5
+ : 8667
+2F9B6 CJK COMPATIBILITY IDEOGRAPH-2F9B6
+ x 27205
+ : 8669
+2F9B7 CJK COMPATIBILITY IDEOGRAPH-2F9B7
+ : 86A9
+2F9B8 CJK COMPATIBILITY IDEOGRAPH-2F9B8
+ : 8688
+2F9B9 CJK COMPATIBILITY IDEOGRAPH-2F9B9
+ : 870E
+2F9BA CJK COMPATIBILITY IDEOGRAPH-2F9BA
+ : 86E2
+2F9BB CJK COMPATIBILITY IDEOGRAPH-2F9BB
+ : 8779
+2F9BC CJK COMPATIBILITY IDEOGRAPH-2F9BC
+ : 8728
+2F9BD CJK COMPATIBILITY IDEOGRAPH-2F9BD
+ : 876B
+2F9BE CJK COMPATIBILITY IDEOGRAPH-2F9BE
+ : 8786
+2F9BF CJK COMPATIBILITY IDEOGRAPH-2F9BF
+ : 45D7
+2F9C0 CJK COMPATIBILITY IDEOGRAPH-2F9C0
+ : 87E1
+2F9C1 CJK COMPATIBILITY IDEOGRAPH-2F9C1
+ : 8801
+2F9C2 CJK COMPATIBILITY IDEOGRAPH-2F9C2
+ : 45F9
+2F9C3 CJK COMPATIBILITY IDEOGRAPH-2F9C3
+ : 8860
+2F9C4 CJK COMPATIBILITY IDEOGRAPH-2F9C4
+ : 8863
+2F9C5 CJK COMPATIBILITY IDEOGRAPH-2F9C5
+ : 27667
+2F9C6 CJK COMPATIBILITY IDEOGRAPH-2F9C6
+ : 88D7
+2F9C7 CJK COMPATIBILITY IDEOGRAPH-2F9C7
+ : 88DE
+2F9C8 CJK COMPATIBILITY IDEOGRAPH-2F9C8
+ : 4635
+2F9C9 CJK COMPATIBILITY IDEOGRAPH-2F9C9
+ : 88FA
+2F9CA CJK COMPATIBILITY IDEOGRAPH-2F9CA
+ : 34BB
+2F9CB CJK COMPATIBILITY IDEOGRAPH-2F9CB
+ x 4695
+ : 278AE
+2F9CC CJK COMPATIBILITY IDEOGRAPH-2F9CC
+ : 27966
+2F9CD CJK COMPATIBILITY IDEOGRAPH-2F9CD
+ : 46BE
+2F9CE CJK COMPATIBILITY IDEOGRAPH-2F9CE
+ : 46C7
+2F9CF CJK COMPATIBILITY IDEOGRAPH-2F9CF
+ : 8AA0
+2F9D0 CJK COMPATIBILITY IDEOGRAPH-2F9D0
+ : 8AED
+2F9D1 CJK COMPATIBILITY IDEOGRAPH-2F9D1
+ : 8B8A
+2F9D2 CJK COMPATIBILITY IDEOGRAPH-2F9D2
+ : 8C55
+2F9D3 CJK COMPATIBILITY IDEOGRAPH-2F9D3
+ : 27CA8
+2F9D4 CJK COMPATIBILITY IDEOGRAPH-2F9D4
+ : 8CAB
+2F9D5 CJK COMPATIBILITY IDEOGRAPH-2F9D5
+ : 8CC1
+2F9D6 CJK COMPATIBILITY IDEOGRAPH-2F9D6
+ x 25AD4
+ : 8D1B
+2F9D7 CJK COMPATIBILITY IDEOGRAPH-2F9D7
+ : 8D77
+2F9D8 CJK COMPATIBILITY IDEOGRAPH-2F9D8
+ : 27F2F
+2F9D9 CJK COMPATIBILITY IDEOGRAPH-2F9D9
+ : 20804
+2F9DA CJK COMPATIBILITY IDEOGRAPH-2F9DA
+ : 8DCB
+2F9DB CJK COMPATIBILITY IDEOGRAPH-2F9DB
+ : 8DBC
+2F9DC CJK COMPATIBILITY IDEOGRAPH-2F9DC
+ : 8DF0
+2F9DD CJK COMPATIBILITY IDEOGRAPH-2F9DD
+ : 208DE
+2F9DE CJK COMPATIBILITY IDEOGRAPH-2F9DE
+ : 8ED4
+2F9DF CJK COMPATIBILITY IDEOGRAPH-2F9DF
+ : 8F38
+2F9E0 CJK COMPATIBILITY IDEOGRAPH-2F9E0
+ : 285D2
+2F9E1 CJK COMPATIBILITY IDEOGRAPH-2F9E1
+ : 285ED
+2F9E2 CJK COMPATIBILITY IDEOGRAPH-2F9E2
+ : 9094
+2F9E3 CJK COMPATIBILITY IDEOGRAPH-2F9E3
+ : 90F1
+2F9E4 CJK COMPATIBILITY IDEOGRAPH-2F9E4
+ : 9111
+2F9E5 CJK COMPATIBILITY IDEOGRAPH-2F9E5
+ : 2872E
+2F9E6 CJK COMPATIBILITY IDEOGRAPH-2F9E6
+ : 911B
+2F9E7 CJK COMPATIBILITY IDEOGRAPH-2F9E7
+ : 9238
+2F9E8 CJK COMPATIBILITY IDEOGRAPH-2F9E8
+ : 92D7
+2F9E9 CJK COMPATIBILITY IDEOGRAPH-2F9E9
+ : 92D8
+2F9EA CJK COMPATIBILITY IDEOGRAPH-2F9EA
+ : 927C
+2F9EB CJK COMPATIBILITY IDEOGRAPH-2F9EB
+ : 93F9
+2F9EC CJK COMPATIBILITY IDEOGRAPH-2F9EC
+ : 9415
+2F9ED CJK COMPATIBILITY IDEOGRAPH-2F9ED
+ : 28BFA
+2F9EE CJK COMPATIBILITY IDEOGRAPH-2F9EE
+ : 958B
+2F9EF CJK COMPATIBILITY IDEOGRAPH-2F9EF
+ : 4995
+2F9F0 CJK COMPATIBILITY IDEOGRAPH-2F9F0
+ : 95B7
+2F9F1 CJK COMPATIBILITY IDEOGRAPH-2F9F1
+ : 28D77
+2F9F2 CJK COMPATIBILITY IDEOGRAPH-2F9F2
+ : 49E6
+2F9F3 CJK COMPATIBILITY IDEOGRAPH-2F9F3
+ : 96C3
+2F9F4 CJK COMPATIBILITY IDEOGRAPH-2F9F4
+ : 5DB2
+2F9F5 CJK COMPATIBILITY IDEOGRAPH-2F9F5
+ : 9723
+2F9F6 CJK COMPATIBILITY IDEOGRAPH-2F9F6
+ : 29145
+2F9F7 CJK COMPATIBILITY IDEOGRAPH-2F9F7
+ : 2921A
+2F9F8 CJK COMPATIBILITY IDEOGRAPH-2F9F8
+ : 4A6E
+2F9F9 CJK COMPATIBILITY IDEOGRAPH-2F9F9
+ : 4A76
+2F9FA CJK COMPATIBILITY IDEOGRAPH-2F9FA
+ : 97E0
+2F9FB CJK COMPATIBILITY IDEOGRAPH-2F9FB
+ : 2940A
+2F9FC CJK COMPATIBILITY IDEOGRAPH-2F9FC
+ : 4AB2
+2F9FD CJK COMPATIBILITY IDEOGRAPH-2F9FD
+ : 29496
+2F9FE CJK COMPATIBILITY IDEOGRAPH-2F9FE
+ : 980B
+2F9FF CJK COMPATIBILITY IDEOGRAPH-2F9FF
+ : 980B
+2FA00 CJK COMPATIBILITY IDEOGRAPH-2FA00
+ : 9829
+2FA01 CJK COMPATIBILITY IDEOGRAPH-2FA01
+ : 295B6
+2FA02 CJK COMPATIBILITY IDEOGRAPH-2FA02
+ : 98E2
+2FA03 CJK COMPATIBILITY IDEOGRAPH-2FA03
+ : 4B33
+2FA04 CJK COMPATIBILITY IDEOGRAPH-2FA04
+ : 9929
+2FA05 CJK COMPATIBILITY IDEOGRAPH-2FA05
+ : 99A7
+2FA06 CJK COMPATIBILITY IDEOGRAPH-2FA06
+ : 99C2
+2FA07 CJK COMPATIBILITY IDEOGRAPH-2FA07
+ : 99FE
+2FA08 CJK COMPATIBILITY IDEOGRAPH-2FA08
+ : 4BCE
+2FA09 CJK COMPATIBILITY IDEOGRAPH-2FA09
+ : 29B30
+2FA0A CJK COMPATIBILITY IDEOGRAPH-2FA0A
+ : 9B12
+2FA0B CJK COMPATIBILITY IDEOGRAPH-2FA0B
+ : 9C40
+2FA0C CJK COMPATIBILITY IDEOGRAPH-2FA0C
+ : 9CFD
+2FA0D CJK COMPATIBILITY IDEOGRAPH-2FA0D
+ : 4CCE
+2FA0E CJK COMPATIBILITY IDEOGRAPH-2FA0E
+ : 4CED
+2FA0F CJK COMPATIBILITY IDEOGRAPH-2FA0F
+ : 9D67
+2FA10 CJK COMPATIBILITY IDEOGRAPH-2FA10
+ : 2A0CE
+2FA11 CJK COMPATIBILITY IDEOGRAPH-2FA11
+ : 4CF8
+2FA12 CJK COMPATIBILITY IDEOGRAPH-2FA12
+ : 2A105
+2FA13 CJK COMPATIBILITY IDEOGRAPH-2FA13
+ : 2A20E
+2FA14 CJK COMPATIBILITY IDEOGRAPH-2FA14
+ : 2A291
+2FA15 CJK COMPATIBILITY IDEOGRAPH-2FA15
+ : 9EBB
+2FA16 CJK COMPATIBILITY IDEOGRAPH-2FA16
+ : 4D56
+2FA17 CJK COMPATIBILITY IDEOGRAPH-2FA17
+ : 9EF9
+2FA18 CJK COMPATIBILITY IDEOGRAPH-2FA18
+ : 9EFE
+2FA19 CJK COMPATIBILITY IDEOGRAPH-2FA19
+ : 9F05
+2FA1A CJK COMPATIBILITY IDEOGRAPH-2FA1A
+ : 9F0F
+2FA1B CJK COMPATIBILITY IDEOGRAPH-2FA1B
+ : 9F16
+2FA1C CJK COMPATIBILITY IDEOGRAPH-2FA1C
+ : 9F3B
+2FA1D CJK COMPATIBILITY IDEOGRAPH-2FA1D
+ : 2A600
+@@ 2FF80 Unassigned 2FFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+2FFFE <not a character>
+ * the value 2FFFE is guaranteed not to be a Unicode character at all
+2FFFF <not a character>
+ * the value 2FFFF is guaranteed not to be a Unicode character at all
+@@ 3FF80 Unassigned 3FFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+3FFFE <not a character>
+ * the value 3FFFE is guaranteed not to be a Unicode character at all
+3FFFF <not a character>
+ * the value 3FFFF is guaranteed not to be a Unicode character at all
+@@ 4FF80 Unassigned 4FFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+4FFFE <not a character>
+ * the value 4FFFE is guaranteed not to be a Unicode character at all
+4FFFF <not a character>
+ * the value 4FFFF is guaranteed not to be a Unicode character at all
+@@ 5FF80 Unassigned 5FFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+5FFFE <not a character>
+ * the value 5FFFE is guaranteed not to be a Unicode character at all
+5FFFF <not a character>
+ * the value 5FFFF is guaranteed not to be a Unicode character at all
+@@ 6FF80 Unassigned 6FFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+6FFFE <not a character>
+ * the value 6FFFE is guaranteed not to be a Unicode character at all
+6FFFF <not a character>
+ * the value 6FFFF is guaranteed not to be a Unicode character at all
+@@ 7FF80 Unassigned 7FFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+7FFFE <not a character>
+ * the value 7FFFE is guaranteed not to be a Unicode character at all
+7FFFF <not a character>
+ * the value 7FFFF is guaranteed not to be a Unicode character at all
+@@ 8FF80 Unassigned 8FFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+8FFFE <not a character>
+ * the value 8FFFE is guaranteed not to be a Unicode character at all
+8FFFF <not a character>
+ * the value 8FFFF is guaranteed not to be a Unicode character at all
+@@ 9FF80 Unassigned 9FFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+9FFFE <not a character>
+ * the value 9FFFE is guaranteed not to be a Unicode character at all
+9FFFF <not a character>
+ * the value 9FFFF is guaranteed not to be a Unicode character at all
+@@ AFF80 Unassigned AFFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+AFFFE <not a character>
+ * the value AFFFE is guaranteed not to be a Unicode character at all
+AFFFF <not a character>
+ * the value AFFFF is guaranteed not to be a Unicode character at all
+@@ BFF80 Unassigned BFFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+BFFFE <not a character>
+ * the value BFFFE is guaranteed not to be a Unicode character at all
+BFFFF <not a character>
+ * the value BFFFF is guaranteed not to be a Unicode character at all
+@@ CFF80 Unassigned CFFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+CFFFE <not a character>
+ * the value CFFFE is guaranteed not to be a Unicode character at all
+CFFFF <not a character>
+ * the value CFFFF is guaranteed not to be a Unicode character at all
+@@ DFF80 Unassigned DFFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+DFFFE <not a character>
+ * the value DFFFE is guaranteed not to be a Unicode character at all
+DFFFF <not a character>
+ * the value DFFFF is guaranteed not to be a Unicode character at all
+@@ E0000 Tags E007F
+@+ Tag characters are deprecated.
+@ Tag identifiers
+E0001 LANGUAGE TAG
+@ Tag components
+E0020 TAG SPACE
+E0021 TAG EXCLAMATION MARK
+E0022 TAG QUOTATION MARK
+E0023 TAG NUMBER SIGN
+E0024 TAG DOLLAR SIGN
+E0025 TAG PERCENT SIGN
+E0026 TAG AMPERSAND
+E0027 TAG APOSTROPHE
+E0028 TAG LEFT PARENTHESIS
+E0029 TAG RIGHT PARENTHESIS
+E002A TAG ASTERISK
+E002B TAG PLUS SIGN
+E002C TAG COMMA
+E002D TAG HYPHEN-MINUS
+E002E TAG FULL STOP
+E002F TAG SOLIDUS
+E0030 TAG DIGIT ZERO
+E0031 TAG DIGIT ONE
+E0032 TAG DIGIT TWO
+E0033 TAG DIGIT THREE
+E0034 TAG DIGIT FOUR
+E0035 TAG DIGIT FIVE
+E0036 TAG DIGIT SIX
+E0037 TAG DIGIT SEVEN
+E0038 TAG DIGIT EIGHT
+E0039 TAG DIGIT NINE
+E003A TAG COLON
+E003B TAG SEMICOLON
+E003C TAG LESS-THAN SIGN
+E003D TAG EQUALS SIGN
+E003E TAG GREATER-THAN SIGN
+E003F TAG QUESTION MARK
+E0040 TAG COMMERCIAL AT
+E0041 TAG LATIN CAPITAL LETTER A
+E0042 TAG LATIN CAPITAL LETTER B
+E0043 TAG LATIN CAPITAL LETTER C
+E0044 TAG LATIN CAPITAL LETTER D
+E0045 TAG LATIN CAPITAL LETTER E
+E0046 TAG LATIN CAPITAL LETTER F
+E0047 TAG LATIN CAPITAL LETTER G
+E0048 TAG LATIN CAPITAL LETTER H
+E0049 TAG LATIN CAPITAL LETTER I
+E004A TAG LATIN CAPITAL LETTER J
+E004B TAG LATIN CAPITAL LETTER K
+E004C TAG LATIN CAPITAL LETTER L
+E004D TAG LATIN CAPITAL LETTER M
+E004E TAG LATIN CAPITAL LETTER N
+E004F TAG LATIN CAPITAL LETTER O
+E0050 TAG LATIN CAPITAL LETTER P
+E0051 TAG LATIN CAPITAL LETTER Q
+E0052 TAG LATIN CAPITAL LETTER R
+E0053 TAG LATIN CAPITAL LETTER S
+E0054 TAG LATIN CAPITAL LETTER T
+E0055 TAG LATIN CAPITAL LETTER U
+E0056 TAG LATIN CAPITAL LETTER V
+E0057 TAG LATIN CAPITAL LETTER W
+E0058 TAG LATIN CAPITAL LETTER X
+E0059 TAG LATIN CAPITAL LETTER Y
+E005A TAG LATIN CAPITAL LETTER Z
+E005B TAG LEFT SQUARE BRACKET
+E005C TAG REVERSE SOLIDUS
+E005D TAG RIGHT SQUARE BRACKET
+E005E TAG CIRCUMFLEX ACCENT
+E005F TAG LOW LINE
+E0060 TAG GRAVE ACCENT
+E0061 TAG LATIN SMALL LETTER A
+E0062 TAG LATIN SMALL LETTER B
+E0063 TAG LATIN SMALL LETTER C
+E0064 TAG LATIN SMALL LETTER D
+E0065 TAG LATIN SMALL LETTER E
+E0066 TAG LATIN SMALL LETTER F
+E0067 TAG LATIN SMALL LETTER G
+E0068 TAG LATIN SMALL LETTER H
+E0069 TAG LATIN SMALL LETTER I
+E006A TAG LATIN SMALL LETTER J
+E006B TAG LATIN SMALL LETTER K
+E006C TAG LATIN SMALL LETTER L
+E006D TAG LATIN SMALL LETTER M
+E006E TAG LATIN SMALL LETTER N
+E006F TAG LATIN SMALL LETTER O
+E0070 TAG LATIN SMALL LETTER P
+E0071 TAG LATIN SMALL LETTER Q
+E0072 TAG LATIN SMALL LETTER R
+E0073 TAG LATIN SMALL LETTER S
+E0074 TAG LATIN SMALL LETTER T
+E0075 TAG LATIN SMALL LETTER U
+E0076 TAG LATIN SMALL LETTER V
+E0077 TAG LATIN SMALL LETTER W
+E0078 TAG LATIN SMALL LETTER X
+E0079 TAG LATIN SMALL LETTER Y
+E007A TAG LATIN SMALL LETTER Z
+E007B TAG LEFT CURLY BRACKET
+E007C TAG VERTICAL LINE
+E007D TAG RIGHT CURLY BRACKET
+E007E TAG TILDE
+E007F CANCEL TAG
+@@ E0100 Variation Selectors Supplement E01EF
+@+ These complete the set started at FE00 to FE0F
+@ Variation selectors
+E0100 VARIATION SELECTOR-17
+ * these are abbreviated VS17, and so on
+E0101 VARIATION SELECTOR-18
+E0102 VARIATION SELECTOR-19
+E0103 VARIATION SELECTOR-20
+E0104 VARIATION SELECTOR-21
+E0105 VARIATION SELECTOR-22
+E0106 VARIATION SELECTOR-23
+E0107 VARIATION SELECTOR-24
+E0108 VARIATION SELECTOR-25
+E0109 VARIATION SELECTOR-26
+E010A VARIATION SELECTOR-27
+E010B VARIATION SELECTOR-28
+E010C VARIATION SELECTOR-29
+E010D VARIATION SELECTOR-30
+E010E VARIATION SELECTOR-31
+E010F VARIATION SELECTOR-32
+E0110 VARIATION SELECTOR-33
+E0111 VARIATION SELECTOR-34
+E0112 VARIATION SELECTOR-35
+E0113 VARIATION SELECTOR-36
+E0114 VARIATION SELECTOR-37
+E0115 VARIATION SELECTOR-38
+E0116 VARIATION SELECTOR-39
+E0117 VARIATION SELECTOR-40
+E0118 VARIATION SELECTOR-41
+E0119 VARIATION SELECTOR-42
+E011A VARIATION SELECTOR-43
+E011B VARIATION SELECTOR-44
+E011C VARIATION SELECTOR-45
+E011D VARIATION SELECTOR-46
+E011E VARIATION SELECTOR-47
+E011F VARIATION SELECTOR-48
+E0120 VARIATION SELECTOR-49
+E0121 VARIATION SELECTOR-50
+E0122 VARIATION SELECTOR-51
+E0123 VARIATION SELECTOR-52
+E0124 VARIATION SELECTOR-53
+E0125 VARIATION SELECTOR-54
+E0126 VARIATION SELECTOR-55
+E0127 VARIATION SELECTOR-56
+E0128 VARIATION SELECTOR-57
+E0129 VARIATION SELECTOR-58
+E012A VARIATION SELECTOR-59
+E012B VARIATION SELECTOR-60
+E012C VARIATION SELECTOR-61
+E012D VARIATION SELECTOR-62
+E012E VARIATION SELECTOR-63
+E012F VARIATION SELECTOR-64
+E0130 VARIATION SELECTOR-65
+E0131 VARIATION SELECTOR-66
+E0132 VARIATION SELECTOR-67
+E0133 VARIATION SELECTOR-68
+E0134 VARIATION SELECTOR-69
+E0135 VARIATION SELECTOR-70
+E0136 VARIATION SELECTOR-71
+E0137 VARIATION SELECTOR-72
+E0138 VARIATION SELECTOR-73
+E0139 VARIATION SELECTOR-74
+E013A VARIATION SELECTOR-75
+E013B VARIATION SELECTOR-76
+E013C VARIATION SELECTOR-77
+E013D VARIATION SELECTOR-78
+E013E VARIATION SELECTOR-79
+E013F VARIATION SELECTOR-80
+E0140 VARIATION SELECTOR-81
+E0141 VARIATION SELECTOR-82
+E0142 VARIATION SELECTOR-83
+E0143 VARIATION SELECTOR-84
+E0144 VARIATION SELECTOR-85
+E0145 VARIATION SELECTOR-86
+E0146 VARIATION SELECTOR-87
+E0147 VARIATION SELECTOR-88
+E0148 VARIATION SELECTOR-89
+E0149 VARIATION SELECTOR-90
+E014A VARIATION SELECTOR-91
+E014B VARIATION SELECTOR-92
+E014C VARIATION SELECTOR-93
+E014D VARIATION SELECTOR-94
+E014E VARIATION SELECTOR-95
+E014F VARIATION SELECTOR-96
+E0150 VARIATION SELECTOR-97
+E0151 VARIATION SELECTOR-98
+E0152 VARIATION SELECTOR-99
+E0153 VARIATION SELECTOR-100
+E0154 VARIATION SELECTOR-101
+E0155 VARIATION SELECTOR-102
+E0156 VARIATION SELECTOR-103
+E0157 VARIATION SELECTOR-104
+E0158 VARIATION SELECTOR-105
+E0159 VARIATION SELECTOR-106
+E015A VARIATION SELECTOR-107
+E015B VARIATION SELECTOR-108
+E015C VARIATION SELECTOR-109
+E015D VARIATION SELECTOR-110
+E015E VARIATION SELECTOR-111
+E015F VARIATION SELECTOR-112
+E0160 VARIATION SELECTOR-113
+E0161 VARIATION SELECTOR-114
+E0162 VARIATION SELECTOR-115
+E0163 VARIATION SELECTOR-116
+E0164 VARIATION SELECTOR-117
+E0165 VARIATION SELECTOR-118
+E0166 VARIATION SELECTOR-119
+E0167 VARIATION SELECTOR-120
+E0168 VARIATION SELECTOR-121
+E0169 VARIATION SELECTOR-122
+E016A VARIATION SELECTOR-123
+E016B VARIATION SELECTOR-124
+E016C VARIATION SELECTOR-125
+E016D VARIATION SELECTOR-126
+E016E VARIATION SELECTOR-127
+E016F VARIATION SELECTOR-128
+E0170 VARIATION SELECTOR-129
+E0171 VARIATION SELECTOR-130
+E0172 VARIATION SELECTOR-131
+E0173 VARIATION SELECTOR-132
+E0174 VARIATION SELECTOR-133
+E0175 VARIATION SELECTOR-134
+E0176 VARIATION SELECTOR-135
+E0177 VARIATION SELECTOR-136
+E0178 VARIATION SELECTOR-137
+E0179 VARIATION SELECTOR-138
+E017A VARIATION SELECTOR-139
+E017B VARIATION SELECTOR-140
+E017C VARIATION SELECTOR-141
+E017D VARIATION SELECTOR-142
+E017E VARIATION SELECTOR-143
+E017F VARIATION SELECTOR-144
+E0180 VARIATION SELECTOR-145
+E0181 VARIATION SELECTOR-146
+E0182 VARIATION SELECTOR-147
+E0183 VARIATION SELECTOR-148
+E0184 VARIATION SELECTOR-149
+E0185 VARIATION SELECTOR-150
+E0186 VARIATION SELECTOR-151
+E0187 VARIATION SELECTOR-152
+E0188 VARIATION SELECTOR-153
+E0189 VARIATION SELECTOR-154
+E018A VARIATION SELECTOR-155
+E018B VARIATION SELECTOR-156
+E018C VARIATION SELECTOR-157
+E018D VARIATION SELECTOR-158
+E018E VARIATION SELECTOR-159
+E018F VARIATION SELECTOR-160
+E0190 VARIATION SELECTOR-161
+E0191 VARIATION SELECTOR-162
+E0192 VARIATION SELECTOR-163
+E0193 VARIATION SELECTOR-164
+E0194 VARIATION SELECTOR-165
+E0195 VARIATION SELECTOR-166
+E0196 VARIATION SELECTOR-167
+E0197 VARIATION SELECTOR-168
+E0198 VARIATION SELECTOR-169
+E0199 VARIATION SELECTOR-170
+E019A VARIATION SELECTOR-171
+E019B VARIATION SELECTOR-172
+E019C VARIATION SELECTOR-173
+E019D VARIATION SELECTOR-174
+E019E VARIATION SELECTOR-175
+E019F VARIATION SELECTOR-176
+E01A0 VARIATION SELECTOR-177
+E01A1 VARIATION SELECTOR-178
+E01A2 VARIATION SELECTOR-179
+E01A3 VARIATION SELECTOR-180
+E01A4 VARIATION SELECTOR-181
+E01A5 VARIATION SELECTOR-182
+E01A6 VARIATION SELECTOR-183
+E01A7 VARIATION SELECTOR-184
+E01A8 VARIATION SELECTOR-185
+E01A9 VARIATION SELECTOR-186
+E01AA VARIATION SELECTOR-187
+E01AB VARIATION SELECTOR-188
+E01AC VARIATION SELECTOR-189
+E01AD VARIATION SELECTOR-190
+E01AE VARIATION SELECTOR-191
+E01AF VARIATION SELECTOR-192
+E01B0 VARIATION SELECTOR-193
+E01B1 VARIATION SELECTOR-194
+E01B2 VARIATION SELECTOR-195
+E01B3 VARIATION SELECTOR-196
+E01B4 VARIATION SELECTOR-197
+E01B5 VARIATION SELECTOR-198
+E01B6 VARIATION SELECTOR-199
+E01B7 VARIATION SELECTOR-200
+E01B8 VARIATION SELECTOR-201
+E01B9 VARIATION SELECTOR-202
+E01BA VARIATION SELECTOR-203
+E01BB VARIATION SELECTOR-204
+E01BC VARIATION SELECTOR-205
+E01BD VARIATION SELECTOR-206
+E01BE VARIATION SELECTOR-207
+E01BF VARIATION SELECTOR-208
+E01C0 VARIATION SELECTOR-209
+E01C1 VARIATION SELECTOR-210
+E01C2 VARIATION SELECTOR-211
+E01C3 VARIATION SELECTOR-212
+E01C4 VARIATION SELECTOR-213
+E01C5 VARIATION SELECTOR-214
+E01C6 VARIATION SELECTOR-215
+E01C7 VARIATION SELECTOR-216
+E01C8 VARIATION SELECTOR-217
+E01C9 VARIATION SELECTOR-218
+E01CA VARIATION SELECTOR-219
+E01CB VARIATION SELECTOR-220
+E01CC VARIATION SELECTOR-221
+E01CD VARIATION SELECTOR-222
+E01CE VARIATION SELECTOR-223
+E01CF VARIATION SELECTOR-224
+E01D0 VARIATION SELECTOR-225
+E01D1 VARIATION SELECTOR-226
+E01D2 VARIATION SELECTOR-227
+E01D3 VARIATION SELECTOR-228
+E01D4 VARIATION SELECTOR-229
+E01D5 VARIATION SELECTOR-230
+E01D6 VARIATION SELECTOR-231
+E01D7 VARIATION SELECTOR-232
+E01D8 VARIATION SELECTOR-233
+E01D9 VARIATION SELECTOR-234
+E01DA VARIATION SELECTOR-235
+E01DB VARIATION SELECTOR-236
+E01DC VARIATION SELECTOR-237
+E01DD VARIATION SELECTOR-238
+E01DE VARIATION SELECTOR-239
+E01DF VARIATION SELECTOR-240
+E01E0 VARIATION SELECTOR-241
+E01E1 VARIATION SELECTOR-242
+E01E2 VARIATION SELECTOR-243
+E01E3 VARIATION SELECTOR-244
+E01E4 VARIATION SELECTOR-245
+E01E5 VARIATION SELECTOR-246
+E01E6 VARIATION SELECTOR-247
+E01E7 VARIATION SELECTOR-248
+E01E8 VARIATION SELECTOR-249
+E01E9 VARIATION SELECTOR-250
+E01EA VARIATION SELECTOR-251
+E01EB VARIATION SELECTOR-252
+E01EC VARIATION SELECTOR-253
+E01ED VARIATION SELECTOR-254
+E01EE VARIATION SELECTOR-255
+E01EF VARIATION SELECTOR-256
+@@ EFF80 Unassigned EFFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+EFFFE <not a character>
+ * the value EFFFE is guaranteed not to be a Unicode character at all
+EFFFF <not a character>
+ * the value EFFFF is guaranteed not to be a Unicode character at all
+@@ FFF80 Supplementary Private Use Area-A FFFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+FFFFE <not a character>
+ * the value FFFFE is guaranteed not to be a Unicode character at all
+FFFFF <not a character>
+ * the value FFFFF is guaranteed not to be a Unicode character at all
+@@ 10FF80 Supplementary Private Use Area-B 10FFFF
+@ Noncharacters
+@+ These codes are intended for process-internal uses, but are not permitted for interchange.
+10FFFE <not a character>
+ * the value 10FFFE is guaranteed not to be a Unicode character at all
+10FFFF <not a character>
+ * the value 10FFFF is guaranteed not to be a Unicode character at all
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/NormalizationCorrections.txt b/Master/tlpkg/tlperl.straw/lib/unicore/NormalizationCorrections.txt
new file mode 100755
index 00000000000..8b449af4874
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/NormalizationCorrections.txt
@@ -0,0 +1,48 @@
+# NormalizationCorrections-5.1.0.txt
+# Date: 2008-03-20, 17:44:00 PDT [KW]
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# The normalization stabilization policy of the Unicode
+# Consortium ordinarily precludes any change to the decomposition
+# for any character, once established in a relevant version
+# of the UnicodeData.txt data file. However, under certain
+# exceptional (and rare) conditions, an error in a decomposition
+# mapping may be discovered that is truly just an unintended
+# typo in the data, and not a matter of dubious interpretation.
+#
+# Whenever such an error may be found, and if it meets the
+# requirements for possible exceptions to normalization
+# stability, the correction is entered in this data file,
+# so that any implementation depending on absolute stability
+# of normalization, *including* any errors in the data, can
+# safely reconstruct the exact state of the data tables at
+# any given version of Unicode.
+#
+# Currently this list has exactly six entries in it, one for the
+# typo found and corrected in Corrigendum #3, and five for
+# the typos and misidentifications found and corrected in
+# Corrigendum #4. All efforts
+# will be made to keep the entries limited to just those fixes.
+#
+# Interpretation of the fields:
+# Field 0: Unicode code point
+# Field 1: Original (erroneous) decomposition
+# Field 2: Corrected decomposition
+# Field 3: Version of Unicode for which the correction was
+# entered into UnicodeData.txt, in n.n.n format.
+# Comment: Indicates the Unicode Corrigendum which documents
+# the correction
+#
+# For more information, see UAX #15, Unicode Normalization Forms.
+#
+F951;96FB;964B;3.2.0 # Corrigendum 3
+2F868;2136A;36FC;4.0.0 # Corrigendum 4
+2F874;5F33;5F53;4.0.0 # Corrigendum 4
+2F91F;43AB;243AB;4.0.0 # Corrigendum 4
+2F95F;7AAE;7AEE;4.0.0 # Corrigendum 4
+2F9BF;4D57;45D7;4.0.0 # Corrigendum 4
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/PVA.pl b/Master/tlpkg/tlperl.straw/lib/unicore/PVA.pl
new file mode 100755
index 00000000000..952fe90618a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/PVA.pl
@@ -0,0 +1,3604 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+
+%utf8::PropertyAlias = (
+'sc',
+'Script',
+'xonfkd',
+'ExpandsOnNFKD',
+'patsyn',
+'PatternSyntax',
+'nfkcqc',
+'NFKCQuickCheck',
+'oalpha',
+'OtherAlphabetic',
+'gcb',
+'GraphemeClusterBreak',
+'nfcqc',
+'NFCQuickCheck',
+'ids',
+'IDStart',
+'lb',
+'LineBreak',
+'stc',
+'SimpleTitlecaseMapping',
+'xonfkc',
+'ExpandsOnNFKC',
+'patws',
+'PatternWhiteSpace',
+'tc',
+'TitlecaseMapping',
+'lower',
+'Lowercase',
+'idst',
+'IDSTrinaryOperator',
+'radical',
+'Radical',
+'fcnfkc',
+'FCNFKCClosure',
+'dm',
+'DecompositionMapping',
+'slc',
+'SimpleLowercaseMapping',
+'wspace',
+'WhiteSpace',
+'di',
+'DefaultIgnorableCodePoint',
+'jsn',
+'JamoShortName',
+'nt',
+'NumericType',
+'ea',
+'EastAsianWidth',
+'ahex',
+'ASCIIHexDigit',
+'alpha',
+'Alphabetic',
+'uc',
+'UppercaseMapping',
+'dia',
+'Diacritic',
+'gc',
+'GeneralCategory',
+'xids',
+'XIDStart',
+'oupper',
+'OtherUppercase',
+'wb',
+'WordBreak',
+'math',
+'Math',
+'sb',
+'SentenceBreak',
+'qmark',
+'QuotationMark',
+'nfdqc',
+'NFDQuickCheck',
+'ideo',
+'Ideographic',
+'blk',
+'Block',
+'odi',
+'OtherDefaultIgnorableCodePoint',
+'hst',
+'HangulSyllableType',
+'bidim',
+'BidiMirrored',
+'olower',
+'OtherLowercase',
+'na',
+'Name',
+'hyphen',
+'Hyphen',
+'xidc',
+'XIDContinue',
+'oidc',
+'OtherIDContinue',
+'bidic',
+'BidiControl',
+'scf',
+'SimpleCaseFolding',
+'na1',
+'Unicode1Name',
+'compex',
+'FullCompositionExclusion',
+'ext',
+'Extender',
+'cf',
+'CaseFolding',
+'grlink',
+'GraphemeLink',
+'xonfc',
+'ExpandsOnNFC',
+'sd',
+'SoftDotted',
+'ccc',
+'CanonicalCombiningClass',
+'dash',
+'Dash',
+'hex',
+'HexDigit',
+'grbase',
+'GraphemeBase',
+'dt',
+'DecompositionType',
+'xonfd',
+'ExpandsOnNFD',
+'idsb',
+'IDSBinaryOperator',
+'age',
+'Age',
+'loe',
+'LogicalOrderException',
+'term',
+'TerminalPunctuation',
+'ce',
+'CompositionExclusion',
+'isc',
+'ISOComment',
+'dep',
+'Deprecated',
+'bc',
+'BidiClass',
+'nchar',
+'NoncharacterCodePoint',
+'jt',
+'JoiningType',
+'upper',
+'Uppercase',
+'uideo',
+'UnifiedIdeograph',
+'sterm',
+'STerm',
+'nfkdqc',
+'NFKDQuickCheck',
+'oids',
+'OtherIDStart',
+'joinc',
+'JoinControl',
+'urs',
+'UnicodeRadicalStroke',
+'nv',
+'NumericValue',
+'suc',
+'SimpleUppercaseMapping',
+'bmg',
+'BidiMirroringGlyph',
+'grext',
+'GraphemeExtend',
+'idc',
+'IDContinue',
+'vs',
+'VariationSelector',
+'omath',
+'OtherMath',
+'lc',
+'LowercaseMapping',
+'ogrext',
+'OtherGraphemeExtend',
+'jg',
+'JoiningGroup',
+);
+
+%utf8::PA_reverse = (
+'linebreak',
+'lb',
+'bidiclass',
+'bc',
+'terminalpunctuation',
+'Term',
+'expandsonnfkc',
+'XONFKC',
+'extender',
+'Ext',
+'simplecasefolding',
+'scf',
+'patternsyntax',
+'PatSyn',
+'sentencebreak',
+'SB',
+'numericvalue',
+'nv',
+'patternwhitespace',
+'PatWS',
+'softdotted',
+'SD',
+'logicalorderexception',
+'LOE',
+'idstart',
+'IDS',
+'generalcategory',
+'gc',
+'decompositiontype',
+'dt',
+'name',
+'na',
+'numerictype',
+'nt',
+'otherlowercase',
+'OLower',
+'joininggroup',
+'jg',
+'expandsonnfkd',
+'XONFKD',
+'deprecated',
+'Dep',
+'radical',
+'Radical',
+'idstrinaryoperator',
+'IDST',
+'xidstart',
+'XIDS',
+'lowercase',
+'Lower',
+'unifiedideograph',
+'UIdeo',
+'othergraphemeextend',
+'OGrExt',
+'jamoshortname',
+'JSN',
+'eastasianwidth',
+'ea',
+'math',
+'Math',
+'graphemelink',
+'GrLink',
+'noncharactercodepoint',
+'NChar',
+'graphemebase',
+'GrBase',
+'bidimirrored',
+'BidiM',
+'casefolding',
+'cf',
+'simpleuppercasemapping',
+'suc',
+'fullcompositionexclusion',
+'CompEx',
+'compositionexclusion',
+'CE',
+'uppercasemapping',
+'uc',
+'decompositionmapping',
+'dm',
+'whitespace',
+'WSpace',
+'hyphen',
+'Hyphen',
+'ideographic',
+'Ideo',
+'idcontinue',
+'IDC',
+'idsbinaryoperator',
+'IDSB',
+'hangulsyllabletype',
+'hst',
+'asciihexdigit',
+'AHex',
+'otheruppercase',
+'OUpper',
+'nfkdquickcheck',
+'NFKDQC',
+'simpletitlecasemapping',
+'stc',
+'nfcquickcheck',
+'NFCQC',
+'bidicontrol',
+'BidiC',
+'diacritic',
+'Dia',
+'joiningtype',
+'jt',
+'otheralphabetic',
+'OAlpha',
+'canonicalcombiningclass',
+'ccc',
+'alphabetic',
+'Alpha',
+'titlecasemapping',
+'tc',
+'unicoderadicalstroke',
+'URS',
+'hexdigit',
+'Hex',
+'unicode1name',
+'na1',
+'dash',
+'Dash',
+'fcnfkcclosure',
+'FCNFKC',
+'graphemeextend',
+'GrExt',
+'joincontrol',
+'JoinC',
+'xidcontinue',
+'XIDC',
+'quotationmark',
+'QMark',
+'expandsonnfd',
+'XONFD',
+'age',
+'age',
+'otheridcontinue',
+'OIDC',
+'uppercase',
+'Upper',
+'expandsonnfc',
+'XONFC',
+'defaultignorablecodepoint',
+'DI',
+'nfdquickcheck',
+'NFDQC',
+'isocomment',
+'isc',
+'otherdefaultignorablecodepoint',
+'ODI',
+'variationselector',
+'VS',
+'script',
+'sc',
+'otheridstart',
+'OIDS',
+'sterm',
+'STerm',
+'graphemeclusterbreak',
+'GCB',
+'nfkcquickcheck',
+'NFKCQC',
+'bidimirroringglyph',
+'bmg',
+'othermath',
+'OMath',
+'block',
+'blk',
+'wordbreak',
+'WB',
+'lowercasemapping',
+'lc',
+'simplelowercasemapping',
+'slc',
+);
+
+%utf8::PropValueAlias = (
+'sc',
+{
+'runr',
+'Runic',
+'osma',
+'Osmanya',
+'hano',
+'Hanunoo',
+'cans',
+'CanadianAboriginal',
+'knda',
+'Kannada',
+'vaii',
+'Vai',
+'phnx',
+'Phoenician',
+'orya',
+'Oriya',
+'cher',
+'Cherokee',
+'khmr',
+'Khmer',
+'ogam',
+'Ogham',
+'saur',
+'Saurashtra',
+'cham',
+'Cham',
+'ital',
+'OldItalic',
+'tibt',
+'Tibetan',
+'lydi',
+'Lydian',
+'kana',
+'Katakana',
+'lepc',
+'Lepcha',
+'gujr',
+'Gujarati',
+'thaa',
+'Thaana',
+'copt',
+'Coptic',
+'sylo',
+'SylotiNagri',
+'talu',
+'NewTaiLue',
+'laoo',
+'Lao',
+'sinh',
+'Sinhala',
+'hira',
+'Hiragana',
+'cari',
+'Carian',
+'limb',
+'Limbu',
+'mymr',
+'Myanmar',
+'yiii',
+'Yi',
+'arab',
+'Arabic',
+'deva',
+'Devanagari',
+'xpeo',
+'OldPersian',
+'cprt',
+'Cypriot',
+'bugi',
+'Buginese',
+'hebr',
+'Hebrew',
+'tglg',
+'Tagalog',
+'sund',
+'Sundanese',
+'mlym',
+'Malayalam',
+'tagb',
+'Tagbanwa',
+'grek',
+'Greek',
+'ethi',
+'Ethiopic',
+'phag',
+'PhagsPa',
+'mong',
+'Mongolian',
+'hrkt',
+'KatakanaOrHiragana',
+'armn',
+'Armenian',
+'hani',
+'Han',
+'shaw',
+'Shavian',
+'taml',
+'Tamil',
+'guru',
+'Gurmukhi',
+'xsux',
+'Cuneiform',
+'ugar',
+'Ugaritic',
+'qaai',
+'Inherited',
+'cyrl',
+'Cyrillic',
+'thai',
+'Thai',
+'zzzz',
+'Unknown',
+'olck',
+'OlChiki',
+'beng',
+'Bengali',
+'bali',
+'Balinese',
+'kali',
+'KayahLi',
+'brai',
+'Braille',
+'telu',
+'Telugu',
+'geor',
+'Georgian',
+'hang',
+'Hangul',
+'glag',
+'Glagolitic',
+'syrc',
+'Syriac',
+'tfng',
+'Tifinagh',
+'dsrt',
+'Deseret',
+'buhd',
+'Buhid',
+'bopo',
+'Bopomofo',
+'khar',
+'Kharoshthi',
+'linb',
+'LinearB',
+'goth',
+'Gothic',
+'lyci',
+'Lycian',
+'rjng',
+'Rejang',
+'tale',
+'TaiLe',
+'zyyy',
+'Common',
+'latn',
+'Latin',
+'nkoo',
+'Nko',
+},
+'JSN',
+{
+'gg',
+'GG',
+'lm',
+'LM',
+'a',
+'A',
+'ya',
+'YA',
+'d',
+'D',
+'yae',
+'YAE',
+'nh',
+'NH',
+'lp',
+'LP',
+'j',
+'J',
+'u',
+'U',
+'jj',
+'JJ',
+'ss',
+'SS',
+'k',
+'K',
+'g',
+'G',
+'bb',
+'BB',
+'lb',
+'LB',
+'t',
+'T',
+'e',
+'E',
+'dd',
+'DD',
+'s',
+'S',
+'lt',
+'LT',
+'c',
+'C',
+'gs',
+'GS',
+'b',
+'B',
+'nj',
+'NJ',
+'lh',
+'LH',
+'yi',
+'YI',
+'weo',
+'WEO',
+'r',
+'R',
+'ls',
+'LS',
+'we',
+'WE',
+'bs',
+'BS',
+'lg',
+'LG',
+'yo',
+'YO',
+'oe',
+'OE',
+'h',
+'H',
+'yu',
+'YU',
+'wi',
+'WI',
+'eu',
+'EU',
+'wa',
+'WA',
+'i',
+'I',
+'n',
+'N',
+'ye',
+'YE',
+'eo',
+'EO',
+'m',
+'M',
+'yeo',
+'YEO',
+'l',
+'L',
+'p',
+'P',
+'ng',
+'NG',
+'wae',
+'WAE',
+'ae',
+'AE',
+'o',
+'O',
+},
+'Pat_Syn',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'IDS',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Dep',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'OUpper',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'OAlpha',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Lower',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'GCB',
+{
+'cn',
+'Control',
+'ex',
+'Extend',
+'v',
+'V',
+'pp',
+'Prepend',
+'lv',
+'LV',
+'xx',
+'Other',
+'sm',
+'SpacingMark',
+'l',
+'L',
+'lvt',
+'LVT',
+'cr',
+'CR',
+'lf',
+'LF',
+'t',
+'T',
+},
+'lb',
+{
+'sp',
+'Space',
+'ba',
+'BreakAfter',
+'gl',
+'Glue',
+'xx',
+'Unknown',
+'nu',
+'Numeric',
+'cb',
+'ContingentBreak',
+'sy',
+'BreakSymbols',
+'cr',
+'CarriageReturn',
+'in',
+'Inseparable',
+'bb',
+'BreakBefore',
+'sg',
+'Surrogate',
+'sa',
+'ComplexContext',
+'po',
+'PostfixNumeric',
+'jl',
+'JL',
+'id',
+'Ideographic',
+'al',
+'Alphabetic',
+'bk',
+'MandatoryBreak',
+'pr',
+'PrefixNumeric',
+'b2',
+'BreakBoth',
+'op',
+'OpenPunctuation',
+'cl',
+'ClosePunctuation',
+'is',
+'InfixNumeric',
+'qu',
+'Quotation',
+'hy',
+'Hyphen',
+'wj',
+'WordJoiner',
+'zw',
+'ZWSpace',
+'jt',
+'JT',
+'ex',
+'Exclamation',
+'cm',
+'CombiningMark',
+'h2',
+'H2',
+'nl',
+'NextLine',
+'ns',
+'Nonstarter',
+'h3',
+'H3',
+'ai',
+'Ambiguous',
+'lf',
+'LineFeed',
+'jv',
+'JV',
+},
+'AHex',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'DI',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'OLower',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'CE',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'XO_NFKC',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'LOE',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'WSpace',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'XO_NFC',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Bidi_M',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'XIDC',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Radical',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Alpha',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'STerm',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'nt',
+{
+'none',
+'None',
+'di',
+'Digit',
+'de',
+'Decimal',
+'nu',
+'Numeric',
+},
+'ea',
+{
+'w',
+'Wide',
+'n',
+'Neutral',
+'h',
+'Halfwidth',
+'a',
+'Ambiguous',
+'f',
+'Fullwidth',
+'na',
+'Narrow',
+},
+'Ext',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'XO_NFD',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'OMath',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'ODI',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'gc',
+{
+'sc',
+'CurrencySymbol',
+'mc',
+'SpacingMark',
+'lm',
+'ModifierLetter',
+'cn',
+'Unassigned',
+'pf',
+'FinalPunctuation',
+'no',
+'OtherNumber',
+'cc',
+'Control',
+'lo',
+'OtherLetter',
+'po',
+'OtherPunctuation',
+'zs',
+'SpaceSeparator',
+'co',
+'PrivateUse',
+'so',
+'OtherSymbol',
+'ll',
+'LowercaseLetter',
+'nd',
+'DecimalNumber',
+'cf',
+'Format',
+'me',
+'EnclosingMark',
+'s',
+'Symbol',
+'zp',
+'ParagraphSeparator',
+'pd',
+'DashPunctuation',
+'c',
+'Other',
+'lt',
+'TitlecaseLetter',
+'cs',
+'Surrogate',
+'l&',
+'CasedLetter',
+'z',
+'Separator',
+'ps',
+'OpenPunctuation',
+'zl',
+'LineSeparator',
+'pc',
+'ConnectorPunctuation',
+'pi',
+'InitialPunctuation',
+'n',
+'Number',
+'m',
+'Mark',
+'nl',
+'LetterNumber',
+'sm',
+'MathSymbol',
+'l',
+'Letter',
+'mn',
+'NonspacingMark',
+'p',
+'Punctuation',
+'lc',
+'CasedLetter',
+'sk',
+'ModifierSymbol',
+'lu',
+'UppercaseLetter',
+'pe',
+'ClosePunctuation',
+},
+'IDSB',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'NChar',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'UIdeo',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Term',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'QMark',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Hyphen',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'XIDS',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'NFC_QC',
+{
+'y',
+'Yes',
+'n',
+'No',
+'m',
+'Maybe',
+},
+'Dia',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Bidi_C',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'hst',
+{
+'l',
+'LeadingJamo',
+'lvt',
+'LVTSyllable',
+'v',
+'VowelJamo',
+'lv',
+'LVSyllable',
+'t',
+'TrailingJamo',
+'na',
+'NotApplicable',
+},
+'WB',
+{
+'extend',
+'Extend',
+'ml',
+'MidLetter',
+'mb',
+'MidNumLet',
+'le',
+'ALetter',
+'ex',
+'ExtendNumLet',
+'xx',
+'Other',
+'nu',
+'Numeric',
+'nl',
+'Newline',
+'mn',
+'MidNum',
+'fo',
+'Format',
+'cr',
+'CR',
+'ka',
+'Katakana',
+'lf',
+'LF',
+},
+'Math',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Pat_WS',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'SD',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Upper',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'OIDC',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'IDST',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Gr_Ext',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Comp_Ex',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'NFD_QC',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'VS',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Join_C',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'ccc',
+{
+'atb',
+'AttachedBelow',
+'db',
+'DoubleBelow',
+'a',
+'Above',
+'r',
+'Right',
+'da',
+'DoubleAbove',
+'is',
+'IotaSubscript',
+'nr',
+'NotReordered',
+'ov',
+'Overlay',
+'br',
+'BelowRight',
+'nk',
+'Nukta',
+'atbl',
+'AttachedBelowLeft',
+'al',
+'AboveLeft',
+'ar',
+'AboveRight',
+'atar',
+'AttachedAboveRight',
+'l',
+'Left',
+'b',
+'Below',
+'vr',
+'Virama',
+'kv',
+'KanaVoicing',
+'bl',
+'BelowLeft',
+},
+'dt',
+{
+'fra',
+'Fraction',
+'none',
+'none',
+'sml',
+'Small',
+'enc',
+'Circle',
+'font',
+'font',
+'init',
+'Initial',
+'nb',
+'Nobreak',
+'iso',
+'Isolated',
+'sup',
+'Super',
+'fin',
+'Final',
+'wide',
+'wide',
+'nar',
+'Narrow',
+'can',
+'Canonical',
+'med',
+'Medial',
+'sub',
+'sub',
+'vert',
+'Vertical',
+'sqr',
+'Square',
+'com',
+'Compat',
+},
+'Ideo',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Gr_Link',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'OGr_Ext',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'XO_NFKD',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'NFKC_QC',
+{
+'y',
+'Yes',
+'n',
+'No',
+'m',
+'Maybe',
+},
+'bc',
+{
+'r',
+'RightToLeft',
+'rlo',
+'RightToLeftOverride',
+'es',
+'EuropeanSeparator',
+'ws',
+'WhiteSpace',
+'rle',
+'RightToLeftEmbedding',
+'on',
+'OtherNeutral',
+'bn',
+'BoundaryNeutral',
+'et',
+'EuropeanTerminator',
+'pdf',
+'PopDirectionalFormat',
+'lro',
+'LeftToRightOverride',
+'s',
+'SegmentSeparator',
+'al',
+'ArabicLetter',
+'en',
+'EuropeanNumber',
+'l',
+'LeftToRight',
+'b',
+'ParagraphSeparator',
+'lre',
+'LeftToRightEmbedding',
+'cs',
+'CommonSeparator',
+'nsm',
+'NonspacingMark',
+'an',
+'ArabicNumber',
+},
+'Dash',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'jt',
+{
+'l',
+'LeftJoining',
+'u',
+'NonJoining',
+'c',
+'JoinCausing',
+'r',
+'RightJoining',
+'d',
+'DualJoining',
+'t',
+'Transparent',
+},
+'NFKD_QC',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'IDC',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'OIDS',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Gr_Base',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'Hex',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'SB',
+{
+'sp',
+'Sp',
+'sc',
+'SContinue',
+'cl',
+'Close',
+'le',
+'OLetter',
+'ex',
+'Extend',
+'up',
+'Upper',
+'st',
+'STerm',
+'xx',
+'Other',
+'nu',
+'Numeric',
+'fo',
+'Format',
+'cr',
+'CR',
+'se',
+'Sep',
+'lo',
+'Lower',
+'at',
+'ATerm',
+'lf',
+'LF',
+},
+);
+
+%utf8::PVA_reverse = (
+'sc',
+{
+'newtailue',
+'Talu',
+'kayahli',
+'Kali',
+'hebrew',
+'Hebr',
+'phoenician',
+'Phnx',
+'linearb',
+'Linb',
+'cham',
+'Cham',
+'ugaritic',
+'Ugar',
+'sundanese',
+'Sund',
+'armenian',
+'Armn',
+'myanmar',
+'Mymr',
+'gurmukhi',
+'Guru',
+'greek',
+'Grek',
+'coptic',
+'Copt',
+'thaana',
+'Thaa',
+'katakana',
+'Kana',
+'tibetan',
+'Tibt',
+'mongolian',
+'Mong',
+'malayalam',
+'Mlym',
+'oriya',
+'Orya',
+'carian',
+'Cari',
+'buhid',
+'Buhd',
+'cypriot',
+'Cprt',
+'bengali',
+'Beng',
+'katakanaorhiragana',
+'Hrkt',
+'oldpersian',
+'Xpeo',
+'tagalog',
+'Tglg',
+'cherokee',
+'Cher',
+'ogham',
+'Ogam',
+'common',
+'Zyyy',
+'saurashtra',
+'Saur',
+'vai',
+'Vaii',
+'ethiopic',
+'Ethi',
+'han',
+'Hani',
+'lydian',
+'Lydi',
+'gothic',
+'Goth',
+'osmanya',
+'Osma',
+'devanagari',
+'Deva',
+'buginese',
+'Bugi',
+'canadianaboriginal',
+'Cans',
+'gujarati',
+'Gujr',
+'latin',
+'Latn',
+'rejang',
+'Rjng',
+'hangul',
+'Hang',
+'deseret',
+'Dsrt',
+'olchiki',
+'Olck',
+'inherited',
+'Qaai',
+'taile',
+'Tale',
+'tifinagh',
+'Tfng',
+'cyrillic',
+'Cyrl',
+'lao',
+'Laoo',
+'khmer',
+'Khmr',
+'balinese',
+'Bali',
+'hiragana',
+'Hira',
+'lepcha',
+'Lepc',
+'thai',
+'Thai',
+'yi',
+'Yiii',
+'sylotinagri',
+'Sylo',
+'bopomofo',
+'Bopo',
+'telugu',
+'Telu',
+'limbu',
+'Limb',
+'cuneiform',
+'Xsux',
+'unknown',
+'Zzzz',
+'syriac',
+'Syrc',
+'hanunoo',
+'Hano',
+'braille',
+'Brai',
+'tamil',
+'Taml',
+'lycian',
+'Lyci',
+'nko',
+'Nkoo',
+'runic',
+'Runr',
+'glagolitic',
+'Glag',
+'georgian',
+'Geor',
+'kharoshthi',
+'Khar',
+'kannada',
+'Knda',
+'arabic',
+'Arab',
+'tagbanwa',
+'Tagb',
+'sinhala',
+'Sinh',
+'olditalic',
+'Ital',
+'phagspa',
+'Phag',
+'shavian',
+'Shaw',
+},
+'JSN',
+{
+'gg',
+'GG',
+'lm',
+'LM',
+'a',
+'A',
+'ya',
+'YA',
+'d',
+'D',
+'yae',
+'YAE',
+'nh',
+'NH',
+'lp',
+'LP',
+'j',
+'J',
+'u',
+'U',
+'jj',
+'JJ',
+'ss',
+'SS',
+'k',
+'K',
+'g',
+'G',
+'bb',
+'BB',
+'lb',
+'LB',
+'t',
+'T',
+'e',
+'E',
+'dd',
+'DD',
+'s',
+'S',
+'lt',
+'LT',
+'c',
+'C',
+'gs',
+'GS',
+'b',
+'B',
+'nj',
+'NJ',
+'lh',
+'LH',
+'yi',
+'YI',
+'weo',
+'WEO',
+'r',
+'R',
+'ls',
+'LS',
+'we',
+'WE',
+'bs',
+'BS',
+'lg',
+'LG',
+'yo',
+'YO',
+'oe',
+'OE',
+'h',
+'H',
+'yu',
+'YU',
+'wi',
+'WI',
+'eu',
+'EU',
+'wa',
+'WA',
+'i',
+'I',
+'n',
+'N',
+'ye',
+'YE',
+'eo',
+'EO',
+'m',
+'M',
+'yeo',
+'YEO',
+'l',
+'L',
+'p',
+'P',
+'ng',
+'NG',
+'wae',
+'WAE',
+'ae',
+'AE',
+'o',
+'O',
+},
+'Pat_Syn',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'IDS',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Dep',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'OUpper',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'OAlpha',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Lower',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'GCB',
+{
+'extend',
+'EX',
+'spacingmark',
+'SM',
+'v',
+'V',
+'prepend',
+'PP',
+'lv',
+'LV',
+'l',
+'L',
+'lvt',
+'LVT',
+'cr',
+'CR',
+'other',
+'XX',
+'lf',
+'LF',
+'t',
+'T',
+'control',
+'CN',
+},
+'lb',
+{
+'carriagereturn',
+'CR',
+'ideographic',
+'ID',
+'hyphen',
+'HY',
+'ambiguous',
+'AI',
+'contingentbreak',
+'CB',
+'complexcontext',
+'SA',
+'prefixnumeric',
+'PR',
+'jl',
+'JL',
+'inseparable',
+'IN',
+'breaksymbols',
+'SY',
+'breakafter',
+'BA',
+'breakbefore',
+'BB',
+'postfixnumeric',
+'PO',
+'glue',
+'GL',
+'wordjoiner',
+'WJ',
+'breakboth',
+'B2',
+'quotation',
+'QU',
+'combiningmark',
+'CM',
+'nonstarter',
+'NS',
+'linefeed',
+'LF',
+'alphabetic',
+'AL',
+'surrogate',
+'SG',
+'mandatorybreak',
+'BK',
+'unknown',
+'XX',
+'exclamation',
+'EX',
+'openpunctuation',
+'OP',
+'jt',
+'JT',
+'closepunctuation',
+'CL',
+'space',
+'SP',
+'zwspace',
+'ZW',
+'h2',
+'H2',
+'infixnumeric',
+'IS',
+'nextline',
+'NL',
+'numeric',
+'NU',
+'h3',
+'H3',
+'jv',
+'JV',
+},
+'AHex',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'DI',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'OLower',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'CE',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'XO_NFKC',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'LOE',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'WSpace',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'XO_NFC',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Bidi_M',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'XIDC',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Radical',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Alpha',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'STerm',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'nt',
+{
+'none',
+'None',
+'digit',
+'Di',
+'numeric',
+'Nu',
+'decimal',
+'De',
+},
+'ea',
+{
+'halfwidth',
+'H',
+'fullwidth',
+'F',
+'ambiguous',
+'A',
+'narrow',
+'Na',
+'wide',
+'W',
+'neutral',
+'N',
+},
+'Ext',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'XO_NFD',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'OMath',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'ODI',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'gc',
+{
+'modifiersymbol',
+'Sk',
+'letternumber',
+'Nl',
+'connectorpunctuation',
+'Pc',
+'spacingmark',
+'Mc',
+'mark',
+'M',
+'unassigned',
+'Cn',
+'enclosingmark',
+'Me',
+'lineseparator',
+'Zl',
+'lowercaseletter',
+'Ll',
+'symbol',
+'S',
+'letter',
+'L',
+'othernumber',
+'No',
+'paragraphseparator',
+'Zp',
+'modifierletter',
+'Lm',
+'titlecaseletter',
+'Lt',
+'decimalnumber',
+'Nd',
+'other',
+'C',
+'mathsymbol',
+'Sm',
+'surrogate',
+'Cs',
+'otherletter',
+'Lo',
+'nonspacingmark',
+'Mn',
+'number',
+'N',
+'uppercaseletter',
+'Lu',
+'spaceseparator',
+'Zs',
+'privateuse',
+'Co',
+'openpunctuation',
+'Ps',
+'punctuation',
+'P',
+'control',
+'Cc',
+'casedletter',
+'LC',
+'closepunctuation',
+'Pe',
+'otherpunctuation',
+'Po',
+'finalpunctuation',
+'Pf',
+'format',
+'Cf',
+'initialpunctuation',
+'Pi',
+'separator',
+'Z',
+'othersymbol',
+'So',
+'dashpunctuation',
+'Pd',
+'currencysymbol',
+'Sc',
+},
+'IDSB',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'NChar',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'UIdeo',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Term',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'QMark',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Hyphen',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'XIDS',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'NFC_QC',
+{
+'yes',
+'Y',
+'maybe',
+'M',
+'no',
+'N',
+},
+'Dia',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Bidi_C',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'hst',
+{
+'lvtsyllable',
+'LVT',
+'lvsyllable',
+'LV',
+'leadingjamo',
+'L',
+'notapplicable',
+'NA',
+'voweljamo',
+'V',
+'trailingjamo',
+'T',
+},
+'WB',
+{
+'extend',
+'Extend',
+'midletter',
+'ML',
+'midnumlet',
+'MB',
+'cr',
+'CR',
+'format',
+'FO',
+'katakana',
+'KA',
+'other',
+'XX',
+'numeric',
+'NU',
+'midnum',
+'MN',
+'extendnumlet',
+'EX',
+'lf',
+'LF',
+'newline',
+'NL',
+'aletter',
+'LE',
+},
+'Math',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Pat_WS',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'SD',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Upper',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'OIDC',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'IDST',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Gr_Ext',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Comp_Ex',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'NFD_QC',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'VS',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Join_C',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'ccc',
+{
+'left',
+'L',
+'attachedbelowleft',
+'ATBL',
+'belowleft',
+'BL',
+'aboveright',
+'AR',
+'kanavoicing',
+'KV',
+'above',
+'A',
+'aboveleft',
+'AL',
+'nukta',
+'NK',
+'below',
+'B',
+'doublebelow',
+'DB',
+'virama',
+'VR',
+'belowright',
+'BR',
+'notreordered',
+'NR',
+'attachedbelow',
+'ATB',
+'right',
+'R',
+'iotasubscript',
+'IS',
+'doubleabove',
+'DA',
+'attachedaboveright',
+'ATAR',
+'overlay',
+'OV',
+},
+'dt',
+{
+'small',
+'Sml',
+'none',
+'None',
+'isolated',
+'Iso',
+'narrow',
+'Nar',
+'square',
+'Sqr',
+'nobreak',
+'Nb',
+'fraction',
+'Fra',
+'font',
+'Font',
+'medial',
+'Med',
+'wide',
+'Wide',
+'canonical',
+'Can',
+'circle',
+'Enc',
+'super',
+'Sup',
+'vertical',
+'Vert',
+'final',
+'Fin',
+'compat',
+'Com',
+'sub',
+'Sub',
+'initial',
+'Init',
+},
+'Ideo',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Gr_Link',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'OGr_Ext',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'XO_NFKD',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'NFKC_QC',
+{
+'yes',
+'Y',
+'maybe',
+'M',
+'no',
+'N',
+},
+'bc',
+{
+'nonspacingmark',
+'NSM',
+'whitespace',
+'WS',
+'righttoleft',
+'R',
+'lefttoright',
+'L',
+'boundaryneutral',
+'BN',
+'segmentseparator',
+'S',
+'lefttorightembedding',
+'LRE',
+'europeanterminator',
+'ET',
+'righttoleftembedding',
+'RLE',
+'righttoleftoverride',
+'RLO',
+'lefttorightoverride',
+'LRO',
+'europeanseparator',
+'ES',
+'europeannumber',
+'EN',
+'commonseparator',
+'CS',
+'arabicletter',
+'AL',
+'paragraphseparator',
+'B',
+'otherneutral',
+'ON',
+'popdirectionalformat',
+'PDF',
+'arabicnumber',
+'AN',
+},
+'Dash',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'jt',
+{
+'leftjoining',
+'L',
+'transparent',
+'T',
+'nonjoining',
+'U',
+'rightjoining',
+'R',
+'dualjoining',
+'D',
+'joincausing',
+'C',
+},
+'NFKD_QC',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'IDC',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'OIDS',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Gr_Base',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'Hex',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'SB',
+{
+'sp',
+'SP',
+'extend',
+'EX',
+'upper',
+'UP',
+'sterm',
+'ST',
+'scontinue',
+'SC',
+'aterm',
+'AT',
+'close',
+'CL',
+'oletter',
+'LE',
+'sep',
+'SE',
+'cr',
+'CR',
+'format',
+'FO',
+'other',
+'XX',
+'lower',
+'LO',
+'numeric',
+'NU',
+'lf',
+'LF',
+},
+);
+
+%utf8::PVA_abbr_map = (
+'JSN',
+{
+'gg',
+'GG',
+'lm',
+'LM',
+'a',
+'A',
+'ya',
+'YA',
+'d',
+'D',
+'yae',
+'YAE',
+'nh',
+'NH',
+'lp',
+'LP',
+'j',
+'J',
+'u',
+'U',
+'jj',
+'JJ',
+'ss',
+'SS',
+'k',
+'K',
+'g',
+'G',
+'bb',
+'BB',
+'lb',
+'LB',
+'t',
+'T',
+'e',
+'E',
+'dd',
+'DD',
+'s',
+'S',
+'lt',
+'LT',
+'c',
+'C',
+'gs',
+'GS',
+'b',
+'B',
+'nj',
+'NJ',
+'lh',
+'LH',
+'yi',
+'YI',
+'weo',
+'WEO',
+'r',
+'R',
+'ls',
+'LS',
+'we',
+'WE',
+'bs',
+'BS',
+'lg',
+'LG',
+'yo',
+'YO',
+'oe',
+'OE',
+'h',
+'H',
+'yu',
+'YU',
+'wi',
+'WI',
+'eu',
+'EU',
+'wa',
+'WA',
+'i',
+'I',
+'n',
+'N',
+'ye',
+'YE',
+'eo',
+'EO',
+'m',
+'M',
+'yeo',
+'YEO',
+'l',
+'L',
+'p',
+'P',
+'ng',
+'NG',
+'wae',
+'WAE',
+'ae',
+'AE',
+'o',
+'O',
+},
+'Pat_Syn',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'IDS',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'gc_sc',
+{
+'runr',
+'Runr',
+'osma',
+'Osma',
+'sc',
+'Sc',
+'mc',
+'Mc',
+'hano',
+'Hano',
+'cans',
+'Cans',
+'lm',
+'Lm',
+'cn',
+'Cn',
+'knda',
+'Knda',
+'vaii',
+'Vaii',
+'phnx',
+'Phnx',
+'orya',
+'Orya',
+'cher',
+'Cher',
+'khmr',
+'Khmr',
+'ogam',
+'Ogam',
+'lo',
+'Lo',
+'saur',
+'Saur',
+'po',
+'Po',
+'cham',
+'Cham',
+'co',
+'Co',
+'ital',
+'Ital',
+'ll',
+'Ll',
+'tibt',
+'Tibt',
+'lydi',
+'Lydi',
+'kana',
+'Kana',
+'zp',
+'Zp',
+'lepc',
+'Lepc',
+'gujr',
+'Gujr',
+'thaa',
+'Thaa',
+'cs',
+'Cs',
+'copt',
+'Copt',
+'z',
+'Z',
+'ps',
+'Ps',
+'sylo',
+'Sylo',
+'talu',
+'Talu',
+'laoo',
+'Laoo',
+'sinh',
+'Sinh',
+'zl',
+'Zl',
+'pc',
+'Pc',
+'hira',
+'Hira',
+'cari',
+'Cari',
+'limb',
+'Limb',
+'mymr',
+'Mymr',
+'yiii',
+'Yiii',
+'arab',
+'Arab',
+'deva',
+'Deva',
+'xpeo',
+'Xpeo',
+'cprt',
+'Cprt',
+'bugi',
+'Bugi',
+'sk',
+'Sk',
+'hebr',
+'Hebr',
+'lu',
+'Lu',
+'pe',
+'Pe',
+'tglg',
+'Tglg',
+'sund',
+'Sund',
+'tagb',
+'Tagb',
+'mlym',
+'Mlym',
+'pf',
+'Pf',
+'no',
+'No',
+'grek',
+'Grek',
+'ethi',
+'Ethi',
+'phag',
+'Phag',
+'mong',
+'Mong',
+'cc',
+'Cc',
+'hrkt',
+'Hrkt',
+'armn',
+'Armn',
+'zs',
+'Zs',
+'so',
+'So',
+'hani',
+'Hani',
+'shaw',
+'Shaw',
+'taml',
+'Taml',
+'me',
+'Me',
+'cf',
+'Cf',
+'nd',
+'Nd',
+'s',
+'S',
+'guru',
+'Guru',
+'xsux',
+'Xsux',
+'ugar',
+'Ugar',
+'qaai',
+'Qaai',
+'lt',
+'Lt',
+'c',
+'C',
+'pd',
+'Pd',
+'cyrl',
+'Cyrl',
+'l&',
+'LC',
+'thai',
+'Thai',
+'zzzz',
+'Zzzz',
+'olck',
+'Olck',
+'beng',
+'Beng',
+'bali',
+'Bali',
+'kali',
+'Kali',
+'brai',
+'Brai',
+'telu',
+'Telu',
+'pi',
+'Pi',
+'geor',
+'Geor',
+'glag',
+'Glag',
+'hang',
+'Hang',
+'syrc',
+'Syrc',
+'tfng',
+'Tfng',
+'n',
+'N',
+'dsrt',
+'Dsrt',
+'buhd',
+'Buhd',
+'m',
+'M',
+'khar',
+'Khar',
+'sm',
+'Sm',
+'nl',
+'Nl',
+'bopo',
+'Bopo',
+'linb',
+'Linb',
+'mn',
+'Mn',
+'l',
+'L',
+'lyci',
+'Lyci',
+'p',
+'P',
+'goth',
+'Goth',
+'rjng',
+'Rjng',
+'tale',
+'Tale',
+'lc',
+'LC',
+'zyyy',
+'Zyyy',
+'latn',
+'Latn',
+'nkoo',
+'Nkoo',
+},
+'Dep',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'OUpper',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'OAlpha',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Lower',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'GCB',
+{
+'cn',
+'CN',
+'ex',
+'EX',
+'v',
+'V',
+'pp',
+'PP',
+'lv',
+'LV',
+'xx',
+'XX',
+'sm',
+'SM',
+'l',
+'L',
+'lvt',
+'LVT',
+'cr',
+'CR',
+'lf',
+'LF',
+'t',
+'T',
+},
+'lb',
+{
+'sp',
+'SP',
+'ba',
+'BA',
+'gl',
+'GL',
+'xx',
+'XX',
+'nu',
+'NU',
+'cb',
+'CB',
+'sy',
+'SY',
+'cr',
+'CR',
+'in',
+'IN',
+'bb',
+'BB',
+'sg',
+'SG',
+'sa',
+'SA',
+'po',
+'PO',
+'jl',
+'JL',
+'id',
+'ID',
+'al',
+'AL',
+'bk',
+'BK',
+'pr',
+'PR',
+'b2',
+'B2',
+'op',
+'OP',
+'cl',
+'CL',
+'is',
+'IS',
+'qu',
+'QU',
+'hy',
+'HY',
+'wj',
+'WJ',
+'zw',
+'ZW',
+'jt',
+'JT',
+'ex',
+'EX',
+'cm',
+'CM',
+'h2',
+'H2',
+'nl',
+'NL',
+'ns',
+'NS',
+'h3',
+'H3',
+'ai',
+'AI',
+'lf',
+'LF',
+'jv',
+'JV',
+},
+'AHex',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'DI',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'OLower',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'CE',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'XO_NFKC',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'LOE',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'WSpace',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'XO_NFC',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Bidi_M',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'XIDC',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Radical',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Alpha',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'STerm',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'nt',
+{
+'none',
+'None',
+'di',
+'Di',
+'de',
+'De',
+'nu',
+'Nu',
+},
+'ea',
+{
+'w',
+'W',
+'n',
+'N',
+'h',
+'H',
+'a',
+'A',
+'f',
+'F',
+'na',
+'Na',
+},
+'Ext',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'XO_NFD',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'OMath',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'ODI',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'IDSB',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'NChar',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'UIdeo',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Term',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'QMark',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Hyphen',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'XIDS',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'NFC_QC',
+{
+'y',
+'Y',
+'n',
+'N',
+'m',
+'M',
+},
+'Dia',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Bidi_C',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'hst',
+{
+'l',
+'L',
+'lvt',
+'LVT',
+'v',
+'V',
+'lv',
+'LV',
+'t',
+'T',
+'na',
+'NA',
+},
+'WB',
+{
+'extend',
+'Extend',
+'ml',
+'ML',
+'mb',
+'MB',
+'le',
+'LE',
+'ex',
+'EX',
+'xx',
+'XX',
+'nu',
+'NU',
+'nl',
+'NL',
+'mn',
+'MN',
+'fo',
+'FO',
+'cr',
+'CR',
+'ka',
+'KA',
+'lf',
+'LF',
+},
+'Math',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Pat_WS',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'SD',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Upper',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'OIDC',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'IDST',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Gr_Ext',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Comp_Ex',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'NFD_QC',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'VS',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Join_C',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'ccc',
+{
+'atb',
+'ATB',
+'db',
+'DB',
+'a',
+'A',
+'r',
+'R',
+'da',
+'DA',
+'is',
+'IS',
+'nr',
+'NR',
+'ov',
+'OV',
+'br',
+'BR',
+'nk',
+'NK',
+'atbl',
+'ATBL',
+'al',
+'AL',
+'ar',
+'AR',
+'atar',
+'ATAR',
+'l',
+'L',
+'b',
+'B',
+'vr',
+'VR',
+'kv',
+'KV',
+'bl',
+'BL',
+},
+'dt',
+{
+'fra',
+'Fra',
+'none',
+'None',
+'sml',
+'Sml',
+'enc',
+'Enc',
+'font',
+'Font',
+'init',
+'Init',
+'nb',
+'Nb',
+'iso',
+'Iso',
+'sup',
+'Sup',
+'fin',
+'Fin',
+'wide',
+'Wide',
+'nar',
+'Nar',
+'can',
+'Can',
+'med',
+'Med',
+'sub',
+'Sub',
+'vert',
+'Vert',
+'sqr',
+'Sqr',
+'com',
+'Com',
+},
+'Ideo',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Gr_Link',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'OGr_Ext',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'XO_NFKD',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'NFKC_QC',
+{
+'y',
+'Y',
+'n',
+'N',
+'m',
+'M',
+},
+'bc',
+{
+'r',
+'R',
+'rlo',
+'RLO',
+'es',
+'ES',
+'ws',
+'WS',
+'rle',
+'RLE',
+'on',
+'ON',
+'bn',
+'BN',
+'et',
+'ET',
+'pdf',
+'PDF',
+'lro',
+'LRO',
+'s',
+'S',
+'al',
+'AL',
+'en',
+'EN',
+'l',
+'L',
+'b',
+'B',
+'lre',
+'LRE',
+'cs',
+'CS',
+'nsm',
+'NSM',
+'an',
+'AN',
+},
+'Dash',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'jt',
+{
+'l',
+'L',
+'u',
+'U',
+'c',
+'C',
+'r',
+'R',
+'d',
+'D',
+'t',
+'T',
+},
+'NFKD_QC',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'IDC',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'OIDS',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Gr_Base',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'Hex',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'SB',
+{
+'sp',
+'SP',
+'sc',
+'SC',
+'cl',
+'CL',
+'le',
+'LE',
+'ex',
+'EX',
+'up',
+'UP',
+'st',
+'ST',
+'xx',
+'XX',
+'nu',
+'NU',
+'fo',
+'FO',
+'cr',
+'CR',
+'se',
+'SE',
+'lo',
+'LO',
+'at',
+'AT',
+'lf',
+'LF',
+},
+);
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/PropList.txt b/Master/tlpkg/tlperl.straw/lib/unicore/PropList.txt
new file mode 100755
index 00000000000..3bbbd76929b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/PropList.txt
@@ -0,0 +1,1207 @@
+# PropList-5.1.0.txt
+# Date: 2008-03-20, 17:55:27 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+
+# ================================================
+
+0009..000D ; White_Space # Cc [5] <control-0009>..<control-000D>
+0020 ; White_Space # Zs SPACE
+0085 ; White_Space # Cc <control-0085>
+00A0 ; White_Space # Zs NO-BREAK SPACE
+1680 ; White_Space # Zs OGHAM SPACE MARK
+180E ; White_Space # Zs MONGOLIAN VOWEL SEPARATOR
+2000..200A ; White_Space # Zs [11] EN QUAD..HAIR SPACE
+2028 ; White_Space # Zl LINE SEPARATOR
+2029 ; White_Space # Zp PARAGRAPH SEPARATOR
+202F ; White_Space # Zs NARROW NO-BREAK SPACE
+205F ; White_Space # Zs MEDIUM MATHEMATICAL SPACE
+3000 ; White_Space # Zs IDEOGRAPHIC SPACE
+
+# Total code points: 26
+
+# ================================================
+
+200E..200F ; Bidi_Control # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+202A..202E ; Bidi_Control # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+
+# Total code points: 7
+
+# ================================================
+
+200C..200D ; Join_Control # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+
+# Total code points: 2
+
+# ================================================
+
+002D ; Dash # Pd HYPHEN-MINUS
+058A ; Dash # Pd ARMENIAN HYPHEN
+05BE ; Dash # Pd HEBREW PUNCTUATION MAQAF
+1806 ; Dash # Pd MONGOLIAN TODO SOFT HYPHEN
+2010..2015 ; Dash # Pd [6] HYPHEN..HORIZONTAL BAR
+2053 ; Dash # Po SWUNG DASH
+207B ; Dash # Sm SUPERSCRIPT MINUS
+208B ; Dash # Sm SUBSCRIPT MINUS
+2212 ; Dash # Sm MINUS SIGN
+2E17 ; Dash # Pd DOUBLE OBLIQUE HYPHEN
+2E1A ; Dash # Pd HYPHEN WITH DIAERESIS
+301C ; Dash # Pd WAVE DASH
+3030 ; Dash # Pd WAVY DASH
+30A0 ; Dash # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN
+FE31..FE32 ; Dash # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
+FE58 ; Dash # Pd SMALL EM DASH
+FE63 ; Dash # Pd SMALL HYPHEN-MINUS
+FF0D ; Dash # Pd FULLWIDTH HYPHEN-MINUS
+
+# Total code points: 24
+
+# ================================================
+
+002D ; Hyphen # Pd HYPHEN-MINUS
+00AD ; Hyphen # Cf SOFT HYPHEN
+058A ; Hyphen # Pd ARMENIAN HYPHEN
+1806 ; Hyphen # Pd MONGOLIAN TODO SOFT HYPHEN
+2010..2011 ; Hyphen # Pd [2] HYPHEN..NON-BREAKING HYPHEN
+2E17 ; Hyphen # Pd DOUBLE OBLIQUE HYPHEN
+30FB ; Hyphen # Po KATAKANA MIDDLE DOT
+FE63 ; Hyphen # Pd SMALL HYPHEN-MINUS
+FF0D ; Hyphen # Pd FULLWIDTH HYPHEN-MINUS
+FF65 ; Hyphen # Po HALFWIDTH KATAKANA MIDDLE DOT
+
+# Total code points: 11
+
+# ================================================
+
+0022 ; Quotation_Mark # Po QUOTATION MARK
+0027 ; Quotation_Mark # Po APOSTROPHE
+00AB ; Quotation_Mark # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BB ; Quotation_Mark # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+2018 ; Quotation_Mark # Pi LEFT SINGLE QUOTATION MARK
+2019 ; Quotation_Mark # Pf RIGHT SINGLE QUOTATION MARK
+201A ; Quotation_Mark # Ps SINGLE LOW-9 QUOTATION MARK
+201B..201C ; Quotation_Mark # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D ; Quotation_Mark # Pf RIGHT DOUBLE QUOTATION MARK
+201E ; Quotation_Mark # Ps DOUBLE LOW-9 QUOTATION MARK
+201F ; Quotation_Mark # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2039 ; Quotation_Mark # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; Quotation_Mark # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+300C ; Quotation_Mark # Ps LEFT CORNER BRACKET
+300D ; Quotation_Mark # Pe RIGHT CORNER BRACKET
+300E ; Quotation_Mark # Ps LEFT WHITE CORNER BRACKET
+300F ; Quotation_Mark # Pe RIGHT WHITE CORNER BRACKET
+301D ; Quotation_Mark # Ps REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F ; Quotation_Mark # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+FE41 ; Quotation_Mark # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42 ; Quotation_Mark # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43 ; Quotation_Mark # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44 ; Quotation_Mark # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FF02 ; Quotation_Mark # Po FULLWIDTH QUOTATION MARK
+FF07 ; Quotation_Mark # Po FULLWIDTH APOSTROPHE
+FF62 ; Quotation_Mark # Ps HALFWIDTH LEFT CORNER BRACKET
+FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET
+
+# Total code points: 29
+
+# ================================================
+
+0021 ; Terminal_Punctuation # Po EXCLAMATION MARK
+002C ; Terminal_Punctuation # Po COMMA
+002E ; Terminal_Punctuation # Po FULL STOP
+003A..003B ; Terminal_Punctuation # Po [2] COLON..SEMICOLON
+003F ; Terminal_Punctuation # Po QUESTION MARK
+037E ; Terminal_Punctuation # Po GREEK QUESTION MARK
+0387 ; Terminal_Punctuation # Po GREEK ANO TELEIA
+0589 ; Terminal_Punctuation # Po ARMENIAN FULL STOP
+05C3 ; Terminal_Punctuation # Po HEBREW PUNCTUATION SOF PASUQ
+060C ; Terminal_Punctuation # Po ARABIC COMMA
+061B ; Terminal_Punctuation # Po ARABIC SEMICOLON
+061F ; Terminal_Punctuation # Po ARABIC QUESTION MARK
+06D4 ; Terminal_Punctuation # Po ARABIC FULL STOP
+0700..070A ; Terminal_Punctuation # Po [11] SYRIAC END OF PARAGRAPH..SYRIAC CONTRACTION
+070C ; Terminal_Punctuation # Po SYRIAC HARKLEAN METOBELUS
+07F8..07F9 ; Terminal_Punctuation # Po [2] NKO COMMA..NKO EXCLAMATION MARK
+0964..0965 ; Terminal_Punctuation # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+0E5A..0E5B ; Terminal_Punctuation # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
+0F08 ; Terminal_Punctuation # Po TIBETAN MARK SBRUL SHAD
+0F0D..0F12 ; Terminal_Punctuation # Po [6] TIBETAN MARK SHAD..TIBETAN MARK RGYA GRAM SHAD
+104A..104B ; Terminal_Punctuation # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION
+1361..1368 ; Terminal_Punctuation # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR
+166D..166E ; Terminal_Punctuation # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
+16EB..16ED ; Terminal_Punctuation # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION
+17D4..17D6 ; Terminal_Punctuation # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
+17DA ; Terminal_Punctuation # Po KHMER SIGN KOOMUUT
+1802..1805 ; Terminal_Punctuation # Po [4] MONGOLIAN COMMA..MONGOLIAN FOUR DOTS
+1808..1809 ; Terminal_Punctuation # Po [2] MONGOLIAN MANCHU COMMA..MONGOLIAN MANCHU FULL STOP
+1944..1945 ; Terminal_Punctuation # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+1B5A..1B5B ; Terminal_Punctuation # Po [2] BALINESE PANTI..BALINESE PAMADA
+1B5D..1B5F ; Terminal_Punctuation # Po [3] BALINESE CARIK PAMUNGKAH..BALINESE CARIK PAREREN
+1C3B..1C3F ; Terminal_Punctuation # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK
+1C7E..1C7F ; Terminal_Punctuation # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
+203C..203D ; Terminal_Punctuation # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG
+2047..2049 ; Terminal_Punctuation # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK
+2E2E ; Terminal_Punctuation # Po REVERSED QUESTION MARK
+3001..3002 ; Terminal_Punctuation # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP
+A60D..A60F ; Terminal_Punctuation # Po [3] VAI COMMA..VAI QUESTION MARK
+A876..A877 ; Terminal_Punctuation # Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD
+A8CE..A8CF ; Terminal_Punctuation # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA
+A92F ; Terminal_Punctuation # Po KAYAH LI SIGN SHYA
+AA5D..AA5F ; Terminal_Punctuation # Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA
+FE50..FE52 ; Terminal_Punctuation # Po [3] SMALL COMMA..SMALL FULL STOP
+FE54..FE57 ; Terminal_Punctuation # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK
+FF01 ; Terminal_Punctuation # Po FULLWIDTH EXCLAMATION MARK
+FF0C ; Terminal_Punctuation # Po FULLWIDTH COMMA
+FF0E ; Terminal_Punctuation # Po FULLWIDTH FULL STOP
+FF1A..FF1B ; Terminal_Punctuation # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON
+FF1F ; Terminal_Punctuation # Po FULLWIDTH QUESTION MARK
+FF61 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC FULL STOP
+FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA
+1039F ; Terminal_Punctuation # Po UGARITIC WORD DIVIDER
+103D0 ; Terminal_Punctuation # Po OLD PERSIAN WORD DIVIDER
+1091F ; Terminal_Punctuation # Po PHOENICIAN WORD SEPARATOR
+12470..12473 ; Terminal_Punctuation # Po [4] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+
+# Total code points: 119
+
+# ================================================
+
+005E ; Other_Math # Sk CIRCUMFLEX ACCENT
+03D0..03D2 ; Other_Math # L& [3] GREEK BETA SYMBOL..GREEK UPSILON WITH HOOK SYMBOL
+03D5 ; Other_Math # L& GREEK PHI SYMBOL
+03F0..03F1 ; Other_Math # L& [2] GREEK KAPPA SYMBOL..GREEK RHO SYMBOL
+03F4..03F5 ; Other_Math # L& [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+2016 ; Other_Math # Po DOUBLE VERTICAL LINE
+2032..2034 ; Other_Math # Po [3] PRIME..TRIPLE PRIME
+2040 ; Other_Math # Pc CHARACTER TIE
+2061..2064 ; Other_Math # Cf [4] FUNCTION APPLICATION..INVISIBLE PLUS
+207D ; Other_Math # Ps SUPERSCRIPT LEFT PARENTHESIS
+207E ; Other_Math # Pe SUPERSCRIPT RIGHT PARENTHESIS
+208D ; Other_Math # Ps SUBSCRIPT LEFT PARENTHESIS
+208E ; Other_Math # Pe SUBSCRIPT RIGHT PARENTHESIS
+20D0..20DC ; Other_Math # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20E1 ; Other_Math # Mn COMBINING LEFT RIGHT ARROW ABOVE
+20E5..20E6 ; Other_Math # Mn [2] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20EB..20EF ; Other_Math # Mn [5] COMBINING LONG DOUBLE SOLIDUS OVERLAY..COMBINING RIGHT ARROW BELOW
+2102 ; Other_Math # L& DOUBLE-STRUCK CAPITAL C
+210A..2113 ; Other_Math # L& [10] SCRIPT SMALL G..SCRIPT SMALL L
+2115 ; Other_Math # L& DOUBLE-STRUCK CAPITAL N
+2119..211D ; Other_Math # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124 ; Other_Math # L& DOUBLE-STRUCK CAPITAL Z
+2128 ; Other_Math # L& BLACK-LETTER CAPITAL Z
+2129 ; Other_Math # So TURNED GREEK SMALL LETTER IOTA
+212C..212D ; Other_Math # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C
+212F..2131 ; Other_Math # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F
+2133..2134 ; Other_Math # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O
+2135..2138 ; Other_Math # Lo [4] ALEF SYMBOL..DALET SYMBOL
+213C..213F ; Other_Math # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2145..2149 ; Other_Math # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+2195..2199 ; Other_Math # So [5] UP DOWN ARROW..SOUTH WEST ARROW
+219C..219F ; Other_Math # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A1..21A2 ; Other_Math # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A4..21A5 ; Other_Math # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A7 ; Other_Math # So DOWNWARDS ARROW FROM BAR
+21A9..21AD ; Other_Math # So [5] LEFTWARDS ARROW WITH HOOK..LEFT RIGHT WAVE ARROW
+21B0..21B1 ; Other_Math # So [2] UPWARDS ARROW WITH TIP LEFTWARDS..UPWARDS ARROW WITH TIP RIGHTWARDS
+21B6..21B7 ; Other_Math # So [2] ANTICLOCKWISE TOP SEMICIRCLE ARROW..CLOCKWISE TOP SEMICIRCLE ARROW
+21BC..21CD ; Other_Math # So [18] LEFTWARDS HARPOON WITH BARB UPWARDS..LEFTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1 ; Other_Math # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D3 ; Other_Math # So DOWNWARDS DOUBLE ARROW
+21D5..21DB ; Other_Math # So [7] UP DOWN DOUBLE ARROW..RIGHTWARDS TRIPLE ARROW
+21DD ; Other_Math # So RIGHTWARDS SQUIGGLE ARROW
+21E4..21E5 ; Other_Math # So [2] LEFTWARDS ARROW TO BAR..RIGHTWARDS ARROW TO BAR
+23B4..23B5 ; Other_Math # So [2] TOP SQUARE BRACKET..BOTTOM SQUARE BRACKET
+23B7 ; Other_Math # So RADICAL SYMBOL BOTTOM
+23D0 ; Other_Math # So VERTICAL LINE EXTENSION
+23E2 ; Other_Math # So WHITE TRAPEZIUM
+25A0..25A1 ; Other_Math # So [2] BLACK SQUARE..WHITE SQUARE
+25AE..25B6 ; Other_Math # So [9] BLACK VERTICAL RECTANGLE..BLACK RIGHT-POINTING TRIANGLE
+25BC..25C0 ; Other_Math # So [5] BLACK DOWN-POINTING TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C6..25C7 ; Other_Math # So [2] BLACK DIAMOND..WHITE DIAMOND
+25CA..25CB ; Other_Math # So [2] LOZENGE..WHITE CIRCLE
+25CF..25D3 ; Other_Math # So [5] BLACK CIRCLE..CIRCLE WITH UPPER HALF BLACK
+25E2 ; Other_Math # So BLACK LOWER RIGHT TRIANGLE
+25E4 ; Other_Math # So BLACK UPPER LEFT TRIANGLE
+25E7..25EC ; Other_Math # So [6] SQUARE WITH LEFT HALF BLACK..WHITE UP-POINTING TRIANGLE WITH DOT
+2605..2606 ; Other_Math # So [2] BLACK STAR..WHITE STAR
+2640 ; Other_Math # So FEMALE SIGN
+2642 ; Other_Math # So MALE SIGN
+2660..2663 ; Other_Math # So [4] BLACK SPADE SUIT..BLACK CLUB SUIT
+266D..266E ; Other_Math # So [2] MUSIC FLAT SIGN..MUSIC NATURAL SIGN
+27C5 ; Other_Math # Ps LEFT S-SHAPED BAG DELIMITER
+27C6 ; Other_Math # Pe RIGHT S-SHAPED BAG DELIMITER
+27E6 ; Other_Math # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 ; Other_Math # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 ; Other_Math # Ps MATHEMATICAL LEFT ANGLE BRACKET
+27E9 ; Other_Math # Pe MATHEMATICAL RIGHT ANGLE BRACKET
+27EA ; Other_Math # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB ; Other_Math # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC ; Other_Math # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED ; Other_Math # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE ; Other_Math # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF ; Other_Math # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+2983 ; Other_Math # Ps LEFT WHITE CURLY BRACKET
+2984 ; Other_Math # Pe RIGHT WHITE CURLY BRACKET
+2985 ; Other_Math # Ps LEFT WHITE PARENTHESIS
+2986 ; Other_Math # Pe RIGHT WHITE PARENTHESIS
+2987 ; Other_Math # Ps Z NOTATION LEFT IMAGE BRACKET
+2988 ; Other_Math # Pe Z NOTATION RIGHT IMAGE BRACKET
+2989 ; Other_Math # Ps Z NOTATION LEFT BINDING BRACKET
+298A ; Other_Math # Pe Z NOTATION RIGHT BINDING BRACKET
+298B ; Other_Math # Ps LEFT SQUARE BRACKET WITH UNDERBAR
+298C ; Other_Math # Pe RIGHT SQUARE BRACKET WITH UNDERBAR
+298D ; Other_Math # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E ; Other_Math # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F ; Other_Math # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 ; Other_Math # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 ; Other_Math # Ps LEFT ANGLE BRACKET WITH DOT
+2992 ; Other_Math # Pe RIGHT ANGLE BRACKET WITH DOT
+2993 ; Other_Math # Ps LEFT ARC LESS-THAN BRACKET
+2994 ; Other_Math # Pe RIGHT ARC GREATER-THAN BRACKET
+2995 ; Other_Math # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 ; Other_Math # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 ; Other_Math # Ps LEFT BLACK TORTOISE SHELL BRACKET
+2998 ; Other_Math # Pe RIGHT BLACK TORTOISE SHELL BRACKET
+29D8 ; Other_Math # Ps LEFT WIGGLY FENCE
+29D9 ; Other_Math # Pe RIGHT WIGGLY FENCE
+29DA ; Other_Math # Ps LEFT DOUBLE WIGGLY FENCE
+29DB ; Other_Math # Pe RIGHT DOUBLE WIGGLY FENCE
+29FC ; Other_Math # Ps LEFT-POINTING CURVED ANGLE BRACKET
+29FD ; Other_Math # Pe RIGHT-POINTING CURVED ANGLE BRACKET
+FE61 ; Other_Math # Po SMALL ASTERISK
+FE63 ; Other_Math # Pd SMALL HYPHEN-MINUS
+FE68 ; Other_Math # Po SMALL REVERSE SOLIDUS
+FF3C ; Other_Math # Po FULLWIDTH REVERSE SOLIDUS
+FF3E ; Other_Math # Sk FULLWIDTH CIRCUMFLEX ACCENT
+1D400..1D454 ; Other_Math # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; Other_Math # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; Other_Math # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; Other_Math # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; Other_Math # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; Other_Math # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; Other_Math # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; Other_Math # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; Other_Math # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; Other_Math # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; Other_Math # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; Other_Math # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; Other_Math # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; Other_Math # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; Other_Math # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; Other_Math # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; Other_Math # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; Other_Math # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; Other_Math # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; Other_Math # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C2..1D6DA ; Other_Math # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DC..1D6FA ; Other_Math # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FC..1D714 ; Other_Math # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D716..1D734 ; Other_Math # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D736..1D74E ; Other_Math # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D750..1D76E ; Other_Math # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D770..1D788 ; Other_Math # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D78A..1D7A8 ; Other_Math # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7AA..1D7C2 ; Other_Math # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C4..1D7CB ; Other_Math # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE..1D7FF ; Other_Math # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+
+# Total code points: 1216
+
+# ================================================
+
+0030..0039 ; Hex_Digit # Nd [10] DIGIT ZERO..DIGIT NINE
+0041..0046 ; Hex_Digit # L& [6] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER F
+0061..0066 ; Hex_Digit # L& [6] LATIN SMALL LETTER A..LATIN SMALL LETTER F
+FF10..FF19 ; Hex_Digit # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+FF21..FF26 ; Hex_Digit # L& [6] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER F
+FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER F
+
+# Total code points: 44
+
+# ================================================
+
+0030..0039 ; ASCII_Hex_Digit # Nd [10] DIGIT ZERO..DIGIT NINE
+0041..0046 ; ASCII_Hex_Digit # L& [6] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER F
+0061..0066 ; ASCII_Hex_Digit # L& [6] LATIN SMALL LETTER A..LATIN SMALL LETTER F
+
+# Total code points: 22
+
+# ================================================
+
+0345 ; Other_Alphabetic # Mn COMBINING GREEK YPOGEGRAMMENI
+05B0..05BD ; Other_Alphabetic # Mn [14] HEBREW POINT SHEVA..HEBREW POINT METEG
+05BF ; Other_Alphabetic # Mn HEBREW POINT RAFE
+05C1..05C2 ; Other_Alphabetic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4..05C5 ; Other_Alphabetic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C7 ; Other_Alphabetic # Mn HEBREW POINT QAMATS QATAN
+0610..061A ; Other_Alphabetic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+064B..0657 ; Other_Alphabetic # Mn [13] ARABIC FATHATAN..ARABIC INVERTED DAMMA
+0659..065E ; Other_Alphabetic # Mn [6] ARABIC ZWARAKAY..ARABIC FATHA WITH TWO DOTS
+0670 ; Other_Alphabetic # Mn ARABIC LETTER SUPERSCRIPT ALEF
+06D6..06DC ; Other_Alphabetic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06E1..06E4 ; Other_Alphabetic # Mn [4] ARABIC SMALL HIGH DOTLESS HEAD OF KHAH..ARABIC SMALL HIGH MADDA
+06E7..06E8 ; Other_Alphabetic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06ED ; Other_Alphabetic # Mn ARABIC SMALL LOW MEEM
+0711 ; Other_Alphabetic # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
+0730..073F ; Other_Alphabetic # Mn [16] SYRIAC PTHAHA ABOVE..SYRIAC RWAHA
+07A6..07B0 ; Other_Alphabetic # Mn [11] THAANA ABAFILI..THAANA SUKUN
+0901..0902 ; Other_Alphabetic # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+0903 ; Other_Alphabetic # Mc DEVANAGARI SIGN VISARGA
+093E..0940 ; Other_Alphabetic # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0941..0948 ; Other_Alphabetic # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+0949..094C ; Other_Alphabetic # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+0962..0963 ; Other_Alphabetic # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0981 ; Other_Alphabetic # Mn BENGALI SIGN CANDRABINDU
+0982..0983 ; Other_Alphabetic # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+09BE..09C0 ; Other_Alphabetic # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
+09C1..09C4 ; Other_Alphabetic # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09C7..09C8 ; Other_Alphabetic # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC ; Other_Alphabetic # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09D7 ; Other_Alphabetic # Mc BENGALI AU LENGTH MARK
+09E2..09E3 ; Other_Alphabetic # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+0A01..0A02 ; Other_Alphabetic # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A03 ; Other_Alphabetic # Mc GURMUKHI SIGN VISARGA
+0A3E..0A40 ; Other_Alphabetic # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A41..0A42 ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48 ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4C ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN OO..GURMUKHI VOWEL SIGN AU
+0A51 ; Other_Alphabetic # Mn GURMUKHI SIGN UDAAT
+0A70..0A71 ; Other_Alphabetic # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A75 ; Other_Alphabetic # Mn GURMUKHI SIGN YAKASH
+0A81..0A82 ; Other_Alphabetic # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0A83 ; Other_Alphabetic # Mc GUJARATI SIGN VISARGA
+0ABE..0AC0 ; Other_Alphabetic # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC1..0AC5 ; Other_Alphabetic # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0AC9 ; Other_Alphabetic # Mc GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC ; Other_Alphabetic # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0AE2..0AE3 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0B01 ; Other_Alphabetic # Mn ORIYA SIGN CANDRABINDU
+0B02..0B03 ; Other_Alphabetic # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B3E ; Other_Alphabetic # Mc ORIYA VOWEL SIGN AA
+0B3F ; Other_Alphabetic # Mn ORIYA VOWEL SIGN I
+0B40 ; Other_Alphabetic # Mc ORIYA VOWEL SIGN II
+0B41..0B44 ; Other_Alphabetic # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B47..0B48 ; Other_Alphabetic # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C ; Other_Alphabetic # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B56 ; Other_Alphabetic # Mn ORIYA AI LENGTH MARK
+0B57 ; Other_Alphabetic # Mc ORIYA AU LENGTH MARK
+0B62..0B63 ; Other_Alphabetic # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B82 ; Other_Alphabetic # Mn TAMIL SIGN ANUSVARA
+0BBE..0BBF ; Other_Alphabetic # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
+0BC0 ; Other_Alphabetic # Mn TAMIL VOWEL SIGN II
+0BC1..0BC2 ; Other_Alphabetic # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8 ; Other_Alphabetic # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC ; Other_Alphabetic # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BD7 ; Other_Alphabetic # Mc TAMIL AU LENGTH MARK
+0C01..0C03 ; Other_Alphabetic # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C3E..0C40 ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C41..0C44 ; Other_Alphabetic # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C46..0C48 ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4C ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU
+0C55..0C56 ; Other_Alphabetic # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C62..0C63 ; Other_Alphabetic # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0C82..0C83 ; Other_Alphabetic # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0CBE ; Other_Alphabetic # Mc KANNADA VOWEL SIGN AA
+0CBF ; Other_Alphabetic # Mn KANNADA VOWEL SIGN I
+0CC0..0CC4 ; Other_Alphabetic # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
+0CC6 ; Other_Alphabetic # Mn KANNADA VOWEL SIGN E
+0CC7..0CC8 ; Other_Alphabetic # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB ; Other_Alphabetic # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CCC ; Other_Alphabetic # Mn KANNADA VOWEL SIGN AU
+0CD5..0CD6 ; Other_Alphabetic # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CE2..0CE3 ; Other_Alphabetic # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0D02..0D03 ; Other_Alphabetic # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D3E..0D40 ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
+0D41..0D44 ; Other_Alphabetic # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D46..0D48 ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D57 ; Other_Alphabetic # Mc MALAYALAM AU LENGTH MARK
+0D62..0D63 ; Other_Alphabetic # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0D82..0D83 ; Other_Alphabetic # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0DCF..0DD1 ; Other_Alphabetic # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2..0DD4 ; Other_Alphabetic # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; Other_Alphabetic # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8..0DDF ; Other_Alphabetic # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DF2..0DF3 ; Other_Alphabetic # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0E31 ; Other_Alphabetic # Mn THAI CHARACTER MAI HAN-AKAT
+0E34..0E3A ; Other_Alphabetic # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E4D ; Other_Alphabetic # Mn THAI CHARACTER NIKHAHIT
+0EB1 ; Other_Alphabetic # Mn LAO VOWEL SIGN MAI KAN
+0EB4..0EB9 ; Other_Alphabetic # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC ; Other_Alphabetic # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0ECD ; Other_Alphabetic # Mn LAO NIGGAHITA
+0F71..0F7E ; Other_Alphabetic # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F7F ; Other_Alphabetic # Mc TIBETAN SIGN RNAM BCAD
+0F80..0F81 ; Other_Alphabetic # Mn [2] TIBETAN VOWEL SIGN REVERSED I..TIBETAN VOWEL SIGN REVERSED II
+0F90..0F97 ; Other_Alphabetic # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC ; Other_Alphabetic # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+102B..102C ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA
+102D..1030 ; Other_Alphabetic # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1031 ; Other_Alphabetic # Mc MYANMAR VOWEL SIGN E
+1032..1036 ; Other_Alphabetic # Mn [5] MYANMAR VOWEL SIGN AI..MYANMAR SIGN ANUSVARA
+1038 ; Other_Alphabetic # Mc MYANMAR SIGN VISARGA
+103B..103C ; Other_Alphabetic # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
+103D..103E ; Other_Alphabetic # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+1056..1057 ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1058..1059 ; Other_Alphabetic # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105E..1060 ; Other_Alphabetic # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1062 ; Other_Alphabetic # Mc MYANMAR VOWEL SIGN SGAW KAREN EU
+1067..1068 ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR VOWEL SIGN WESTERN PWO KAREN UE
+1071..1074 ; Other_Alphabetic # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1082 ; Other_Alphabetic # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083..1084 ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E
+1085..1086 ; Other_Alphabetic # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+135F ; Other_Alphabetic # Mn ETHIOPIC COMBINING GEMINATION MARK
+1712..1713 ; Other_Alphabetic # Mn [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U
+1732..1733 ; Other_Alphabetic # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U
+1752..1753 ; Other_Alphabetic # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1772..1773 ; Other_Alphabetic # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+17B6 ; Other_Alphabetic # Mc KHMER VOWEL SIGN AA
+17B7..17BD ; Other_Alphabetic # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17BE..17C5 ; Other_Alphabetic # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C6 ; Other_Alphabetic # Mn KHMER SIGN NIKAHIT
+17C7..17C8 ; Other_Alphabetic # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+18A9 ; Other_Alphabetic # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+1920..1922 ; Other_Alphabetic # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926 ; Other_Alphabetic # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928 ; Other_Alphabetic # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B ; Other_Alphabetic # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931 ; Other_Alphabetic # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932 ; Other_Alphabetic # Mn LIMBU SMALL LETTER ANUSVARA
+1933..1938 ; Other_Alphabetic # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+19B0..19C0 ; Other_Alphabetic # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
+19C8..19C9 ; Other_Alphabetic # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
+1A17..1A18 ; Other_Alphabetic # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A19..1A1B ; Other_Alphabetic # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
+1B00..1B03 ; Other_Alphabetic # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B04 ; Other_Alphabetic # Mc BALINESE SIGN BISAH
+1B35 ; Other_Alphabetic # Mc BALINESE VOWEL SIGN TEDUNG
+1B36..1B3A ; Other_Alphabetic # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3B ; Other_Alphabetic # Mc BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C ; Other_Alphabetic # Mn BALINESE VOWEL SIGN LA LENGA
+1B3D..1B41 ; Other_Alphabetic # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42 ; Other_Alphabetic # Mn BALINESE VOWEL SIGN PEPET
+1B43 ; Other_Alphabetic # Mc BALINESE VOWEL SIGN PEPET TEDUNG
+1B80..1B81 ; Other_Alphabetic # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1B82 ; Other_Alphabetic # Mc SUNDANESE SIGN PANGWISAD
+1BA1 ; Other_Alphabetic # Mc SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA2..1BA5 ; Other_Alphabetic # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA6..1BA7 ; Other_Alphabetic # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
+1BA8..1BA9 ; Other_Alphabetic # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1C24..1C2B ; Other_Alphabetic # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
+1C2C..1C33 ; Other_Alphabetic # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C34..1C35 ; Other_Alphabetic # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
+24B6..24E9 ; Other_Alphabetic # So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z
+2DE0..2DFF ; Other_Alphabetic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+A823..A824 ; Other_Alphabetic # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A825..A826 ; Other_Alphabetic # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A827 ; Other_Alphabetic # Mc SYLOTI NAGRI VOWEL SIGN OO
+A880..A881 ; Other_Alphabetic # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
+A8B4..A8C3 ; Other_Alphabetic # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
+A926..A92A ; Other_Alphabetic # Mn [5] KAYAH LI VOWEL UE..KAYAH LI VOWEL O
+A947..A951 ; Other_Alphabetic # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A952 ; Other_Alphabetic # Mc REJANG CONSONANT SIGN H
+AA29..AA2E ; Other_Alphabetic # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA2F..AA30 ; Other_Alphabetic # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
+AA31..AA32 ; Other_Alphabetic # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA33..AA34 ; Other_Alphabetic # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
+AA35..AA36 ; Other_Alphabetic # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA43 ; Other_Alphabetic # Mn CHAM CONSONANT SIGN FINAL NG
+AA4C ; Other_Alphabetic # Mn CHAM CONSONANT SIGN FINAL M
+AA4D ; Other_Alphabetic # Mc CHAM CONSONANT SIGN FINAL H
+FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+10A01..10A03 ; Other_Alphabetic # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06 ; Other_Alphabetic # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F ; Other_Alphabetic # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+
+# Total code points: 663
+
+# ================================================
+
+3006 ; Ideographic # Lo IDEOGRAPHIC CLOSING MARK
+3007 ; Ideographic # Nl IDEOGRAPHIC NUMBER ZERO
+3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+3400..4DB5 ; Ideographic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FC3 ; Ideographic # Lo [20932] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FC3
+F900..FA2D ; Ideographic # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6A ; Ideographic # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A
+FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+20000..2A6D6 ; Ideographic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 71248
+
+# ================================================
+
+005E ; Diacritic # Sk CIRCUMFLEX ACCENT
+0060 ; Diacritic # Sk GRAVE ACCENT
+00A8 ; Diacritic # Sk DIAERESIS
+00AF ; Diacritic # Sk MACRON
+00B4 ; Diacritic # Sk ACUTE ACCENT
+00B7 ; Diacritic # Po MIDDLE DOT
+00B8 ; Diacritic # Sk CEDILLA
+02B0..02C1 ; Diacritic # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2..02C5 ; Diacritic # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6..02D1 ; Diacritic # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02D2..02DF ; Diacritic # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
+02E0..02E4 ; Diacritic # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5..02EB ; Diacritic # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC ; Diacritic # Lm MODIFIER LETTER VOICING
+02ED ; Diacritic # Sk MODIFIER LETTER UNASPIRATED
+02EE ; Diacritic # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+02EF..02FF ; Diacritic # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+0300..034E ; Diacritic # Mn [79] COMBINING GRAVE ACCENT..COMBINING UPWARDS ARROW BELOW
+0350..0357 ; Diacritic # Mn [8] COMBINING RIGHT ARROWHEAD ABOVE..COMBINING RIGHT HALF RING ABOVE
+035D..0362 ; Diacritic # Mn [6] COMBINING DOUBLE BREVE..COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0374 ; Diacritic # Lm GREEK NUMERAL SIGN
+0375 ; Diacritic # Sk GREEK LOWER NUMERAL SIGN
+037A ; Diacritic # Lm GREEK YPOGEGRAMMENI
+0384..0385 ; Diacritic # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS
+0483..0487 ; Diacritic # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+0559 ; Diacritic # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
+0591..05A1 ; Diacritic # Mn [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER
+05A3..05BD ; Diacritic # Mn [27] HEBREW ACCENT MUNAH..HEBREW POINT METEG
+05BF ; Diacritic # Mn HEBREW POINT RAFE
+05C1..05C2 ; Diacritic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4 ; Diacritic # Mn HEBREW MARK UPPER DOT
+064B..0652 ; Diacritic # Mn [8] ARABIC FATHATAN..ARABIC SUKUN
+0657..0658 ; Diacritic # Mn [2] ARABIC INVERTED DAMMA..ARABIC MARK NOON GHUNNA
+06DF..06E0 ; Diacritic # Mn [2] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E5..06E6 ; Diacritic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06EA..06EC ; Diacritic # Mn [3] ARABIC EMPTY CENTRE LOW STOP..ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+0730..074A ; Diacritic # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+07A6..07B0 ; Diacritic # Mn [11] THAANA ABAFILI..THAANA SUKUN
+07EB..07F3 ; Diacritic # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+07F4..07F5 ; Diacritic # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+093C ; Diacritic # Mn DEVANAGARI SIGN NUKTA
+094D ; Diacritic # Mn DEVANAGARI SIGN VIRAMA
+0951..0954 ; Diacritic # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT
+0971 ; Diacritic # Lm DEVANAGARI SIGN HIGH SPACING DOT
+09BC ; Diacritic # Mn BENGALI SIGN NUKTA
+09CD ; Diacritic # Mn BENGALI SIGN VIRAMA
+0A3C ; Diacritic # Mn GURMUKHI SIGN NUKTA
+0A4D ; Diacritic # Mn GURMUKHI SIGN VIRAMA
+0ABC ; Diacritic # Mn GUJARATI SIGN NUKTA
+0ACD ; Diacritic # Mn GUJARATI SIGN VIRAMA
+0B3C ; Diacritic # Mn ORIYA SIGN NUKTA
+0B4D ; Diacritic # Mn ORIYA SIGN VIRAMA
+0BCD ; Diacritic # Mn TAMIL SIGN VIRAMA
+0C4D ; Diacritic # Mn TELUGU SIGN VIRAMA
+0CBC ; Diacritic # Mn KANNADA SIGN NUKTA
+0CCD ; Diacritic # Mn KANNADA SIGN VIRAMA
+0D4D ; Diacritic # Mn MALAYALAM SIGN VIRAMA
+0DCA ; Diacritic # Mn SINHALA SIGN AL-LAKUNA
+0E47..0E4C ; Diacritic # Mn [6] THAI CHARACTER MAITAIKHU..THAI CHARACTER THANTHAKHAT
+0E4E ; Diacritic # Mn THAI CHARACTER YAMAKKAN
+0EC8..0ECC ; Diacritic # Mn [5] LAO TONE MAI EK..LAO CANCELLATION MARK
+0F18..0F19 ; Diacritic # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F35 ; Diacritic # Mn TIBETAN MARK NGAS BZUNG NYI ZLA
+0F37 ; Diacritic # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F39 ; Diacritic # Mn TIBETAN MARK TSA -PHRU
+0F3E..0F3F ; Diacritic # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F82..0F84 ; Diacritic # Mn [3] TIBETAN SIGN NYI ZLA NAA DA..TIBETAN MARK HALANTA
+0F86..0F87 ; Diacritic # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0FC6 ; Diacritic # Mn TIBETAN SYMBOL PADMA GDAN
+1037 ; Diacritic # Mn MYANMAR SIGN DOT BELOW
+1039..103A ; Diacritic # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+1087..108C ; Diacritic # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3
+108D ; Diacritic # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+108F ; Diacritic # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5
+17C9..17D3 ; Diacritic # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17DD ; Diacritic # Mn KHMER SIGN ATTHACAN
+1939..193B ; Diacritic # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1B34 ; Diacritic # Mn BALINESE SIGN REREKAN
+1B44 ; Diacritic # Mc BALINESE ADEG ADEG
+1B6B..1B73 ; Diacritic # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1BAA ; Diacritic # Mc SUNDANESE SIGN PAMAAEH
+1C36..1C37 ; Diacritic # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1C78..1C7D ; Diacritic # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1D2C..1D61 ; Diacritic # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D6A ; Diacritic # L& [9] LATIN SUBSCRIPT SMALL LETTER I..GREEK SUBSCRIPT SMALL LETTER CHI
+1DC4..1DCF ; Diacritic # Mn [12] COMBINING MACRON-ACUTE..COMBINING ZIGZAG BELOW
+1DFE..1DFF ; Diacritic # Mn [2] COMBINING LEFT ARROWHEAD ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1FBD ; Diacritic # Sk GREEK KORONIS
+1FBF..1FC1 ; Diacritic # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
+1FCD..1FCF ; Diacritic # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
+1FDD..1FDF ; Diacritic # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FED..1FEF ; Diacritic # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
+1FFD..1FFE ; Diacritic # Sk [2] GREEK OXIA..GREEK DASIA
+2E2F ; Diacritic # Lm VERTICAL TILDE
+302A..302F ; Diacritic # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A ; Diacritic # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B..309C ; Diacritic # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30FC ; Diacritic # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK
+A66F ; Diacritic # Mn COMBINING CYRILLIC VZMET
+A67C..A67D ; Diacritic # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK
+A67F ; Diacritic # Lm CYRILLIC PAYEROK
+A717..A71F ; Diacritic # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720..A721 ; Diacritic # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE
+A788 ; Diacritic # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A8C4 ; Diacritic # Mn SAURASHTRA SIGN VIRAMA
+A92B..A92D ; Diacritic # Mn [3] KAYAH LI TONE PLOPHU..KAYAH LI TONE CALYA PLOPHU
+A92E ; Diacritic # Po KAYAH LI SIGN CWI
+A953 ; Diacritic # Mc REJANG VIRAMA
+FB1E ; Diacritic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+FE20..FE26 ; Diacritic # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON
+FF3E ; Diacritic # Sk FULLWIDTH CIRCUMFLEX ACCENT
+FF40 ; Diacritic # Sk FULLWIDTH GRAVE ACCENT
+FF70 ; Diacritic # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF9E..FF9F ; Diacritic # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFE3 ; Diacritic # Sk FULLWIDTH MACRON
+1D167..1D169 ; Diacritic # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16D..1D172 ; Diacritic # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
+1D17B..1D182 ; Diacritic # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B ; Diacritic # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD ; Diacritic # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+
+# Total code points: 565
+
+# ================================================
+
+00B7 ; Extender # Po MIDDLE DOT
+02D0..02D1 ; Extender # Lm [2] MODIFIER LETTER TRIANGULAR COLON..MODIFIER LETTER HALF TRIANGULAR COLON
+0640 ; Extender # Lm ARABIC TATWEEL
+07FA ; Extender # Lm NKO LAJANYALAN
+0E46 ; Extender # Lm THAI CHARACTER MAIYAMOK
+0EC6 ; Extender # Lm LAO KO LA
+1843 ; Extender # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1C36 ; Extender # Mn LEPCHA SIGN RAN
+1C7B ; Extender # Lm OL CHIKI RELAA
+3005 ; Extender # Lm IDEOGRAPHIC ITERATION MARK
+3031..3035 ; Extender # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+309D..309E ; Extender # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+30FC..30FE ; Extender # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
+A015 ; Extender # Lm YI SYLLABLE WU
+A60C ; Extender # Lm VAI SYLLABLE LENGTHENER
+FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+
+# Total code points: 24
+
+# ================================================
+
+02B0..02B8 ; Other_Lowercase # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
+02C0..02C1 ; Other_Lowercase # Lm [2] MODIFIER LETTER GLOTTAL STOP..MODIFIER LETTER REVERSED GLOTTAL STOP
+02E0..02E4 ; Other_Lowercase # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+0345 ; Other_Lowercase # Mn COMBINING GREEK YPOGEGRAMMENI
+037A ; Other_Lowercase # Lm GREEK YPOGEGRAMMENI
+1D2C..1D61 ; Other_Lowercase # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D78 ; Other_Lowercase # Lm MODIFIER LETTER CYRILLIC EN
+1D9B..1DBF ; Other_Lowercase # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+2090..2094 ; Other_Lowercase # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+2170..217F ; Other_Lowercase # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND
+24D0..24E9 ; Other_Lowercase # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+2C7D ; Other_Lowercase # Lm MODIFIER LETTER CAPITAL V
+A770 ; Other_Lowercase # Lm MODIFIER LETTER US
+
+# Total code points: 159
+
+# ================================================
+
+2160..216F ; Other_Uppercase # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND
+24B6..24CF ; Other_Uppercase # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z
+
+# Total code points: 42
+
+# ================================================
+
+FDD0..FDEF ; Noncharacter_Code_Point # Cn [32] <noncharacter-FDD0>..<noncharacter-FDEF>
+FFFE..FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-FFFE>..<noncharacter-FFFF>
+1FFFE..1FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-1FFFE>..<noncharacter-1FFFF>
+2FFFE..2FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-2FFFE>..<noncharacter-2FFFF>
+3FFFE..3FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-3FFFE>..<noncharacter-3FFFF>
+4FFFE..4FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-4FFFE>..<noncharacter-4FFFF>
+5FFFE..5FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-5FFFE>..<noncharacter-5FFFF>
+6FFFE..6FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-6FFFE>..<noncharacter-6FFFF>
+7FFFE..7FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-7FFFE>..<noncharacter-7FFFF>
+8FFFE..8FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-8FFFE>..<noncharacter-8FFFF>
+9FFFE..9FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-9FFFE>..<noncharacter-9FFFF>
+AFFFE..AFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-AFFFE>..<noncharacter-AFFFF>
+BFFFE..BFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-BFFFE>..<noncharacter-BFFFF>
+CFFFE..CFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-CFFFE>..<noncharacter-CFFFF>
+DFFFE..DFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-DFFFE>..<noncharacter-DFFFF>
+EFFFE..EFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-EFFFE>..<noncharacter-EFFFF>
+FFFFE..FFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-FFFFE>..<noncharacter-FFFFF>
+10FFFE..10FFFF; Noncharacter_Code_Point # Cn [2] <noncharacter-10FFFE>..<noncharacter-10FFFF>
+
+# Total code points: 66
+
+# ================================================
+
+09BE ; Other_Grapheme_Extend # Mc BENGALI VOWEL SIGN AA
+09D7 ; Other_Grapheme_Extend # Mc BENGALI AU LENGTH MARK
+0B3E ; Other_Grapheme_Extend # Mc ORIYA VOWEL SIGN AA
+0B57 ; Other_Grapheme_Extend # Mc ORIYA AU LENGTH MARK
+0BBE ; Other_Grapheme_Extend # Mc TAMIL VOWEL SIGN AA
+0BD7 ; Other_Grapheme_Extend # Mc TAMIL AU LENGTH MARK
+0CC2 ; Other_Grapheme_Extend # Mc KANNADA VOWEL SIGN UU
+0CD5..0CD6 ; Other_Grapheme_Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0D3E ; Other_Grapheme_Extend # Mc MALAYALAM VOWEL SIGN AA
+0D57 ; Other_Grapheme_Extend # Mc MALAYALAM AU LENGTH MARK
+0DCF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN AELA-PILLA
+0DDF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA
+200C..200D ; Other_Grapheme_Extend # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+FF9E..FF9F ; Other_Grapheme_Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+1D165 ; Other_Grapheme_Extend # Mc MUSICAL SYMBOL COMBINING STEM
+1D16E..1D172 ; Other_Grapheme_Extend # Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5
+
+# Total code points: 23
+
+# ================================================
+
+2FF0..2FF1 ; IDS_Binary_Operator # So [2] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF4..2FFB ; IDS_Binary_Operator # So [8] IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+
+# Total code points: 10
+
+# ================================================
+
+2FF2..2FF3 ; IDS_Trinary_Operator # So [2] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+
+# Total code points: 2
+
+# ================================================
+
+2E80..2E99 ; Radical # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP
+2E9B..2EF3 ; Radical # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
+2F00..2FD5 ; Radical # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
+
+# Total code points: 329
+
+# ================================================
+
+3400..4DB5 ; Unified_Ideograph # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FC3 ; Unified_Ideograph # Lo [20932] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FC3
+FA0E..FA0F ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA11 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11
+FA13..FA14 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14
+FA1F ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA21 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA21
+FA23..FA24 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24
+FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29
+20000..2A6D6 ; Unified_Ideograph # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+
+# Total code points: 70237
+
+# ================================================
+
+034F ; Other_Default_Ignorable_Code_Point # Mn COMBINING GRAPHEME JOINER
+115F..1160 ; Other_Default_Ignorable_Code_Point # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER
+2065..2069 ; Other_Default_Ignorable_Code_Point # Cn [5] <reserved-2065>..<reserved-2069>
+3164 ; Other_Default_Ignorable_Code_Point # Lo HANGUL FILLER
+FFA0 ; Other_Default_Ignorable_Code_Point # Lo HALFWIDTH HANGUL FILLER
+FFF0..FFF8 ; Other_Default_Ignorable_Code_Point # Cn [9] <reserved-FFF0>..<reserved-FFF8>
+E0000 ; Other_Default_Ignorable_Code_Point # Cn <reserved-E0000>
+E0002..E001F ; Other_Default_Ignorable_Code_Point # Cn [30] <reserved-E0002>..<reserved-E001F>
+E0080..E00FF ; Other_Default_Ignorable_Code_Point # Cn [128] <reserved-E0080>..<reserved-E00FF>
+E01F0..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
+
+# Total code points: 3778
+
+# ================================================
+
+0340..0341 ; Deprecated # Mn [2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK
+17A3 ; Deprecated # Lo KHMER INDEPENDENT VOWEL QAQ
+17D3 ; Deprecated # Mn KHMER SIGN BATHAMASAT
+206A..206F ; Deprecated # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+E0001 ; Deprecated # Cf LANGUAGE TAG
+E0020..E007F ; Deprecated # Cf [96] TAG SPACE..CANCEL TAG
+
+# Total code points: 107
+
+# ================================================
+
+0069..006A ; Soft_Dotted # L& [2] LATIN SMALL LETTER I..LATIN SMALL LETTER J
+012F ; Soft_Dotted # L& LATIN SMALL LETTER I WITH OGONEK
+0249 ; Soft_Dotted # L& LATIN SMALL LETTER J WITH STROKE
+0268 ; Soft_Dotted # L& LATIN SMALL LETTER I WITH STROKE
+029D ; Soft_Dotted # L& LATIN SMALL LETTER J WITH CROSSED-TAIL
+02B2 ; Soft_Dotted # Lm MODIFIER LETTER SMALL J
+03F3 ; Soft_Dotted # L& GREEK LETTER YOT
+0456 ; Soft_Dotted # L& CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0458 ; Soft_Dotted # L& CYRILLIC SMALL LETTER JE
+1D62 ; Soft_Dotted # L& LATIN SUBSCRIPT SMALL LETTER I
+1D96 ; Soft_Dotted # L& LATIN SMALL LETTER I WITH RETROFLEX HOOK
+1DA4 ; Soft_Dotted # Lm MODIFIER LETTER SMALL I WITH STROKE
+1DA8 ; Soft_Dotted # Lm MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+1E2D ; Soft_Dotted # L& LATIN SMALL LETTER I WITH TILDE BELOW
+1ECB ; Soft_Dotted # L& LATIN SMALL LETTER I WITH DOT BELOW
+2071 ; Soft_Dotted # L& SUPERSCRIPT LATIN SMALL LETTER I
+2148..2149 ; Soft_Dotted # L& [2] DOUBLE-STRUCK ITALIC SMALL I..DOUBLE-STRUCK ITALIC SMALL J
+2C7C ; Soft_Dotted # L& LATIN SUBSCRIPT SMALL LETTER J
+1D422..1D423 ; Soft_Dotted # L& [2] MATHEMATICAL BOLD SMALL I..MATHEMATICAL BOLD SMALL J
+1D456..1D457 ; Soft_Dotted # L& [2] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL J
+1D48A..1D48B ; Soft_Dotted # L& [2] MATHEMATICAL BOLD ITALIC SMALL I..MATHEMATICAL BOLD ITALIC SMALL J
+1D4BE..1D4BF ; Soft_Dotted # L& [2] MATHEMATICAL SCRIPT SMALL I..MATHEMATICAL SCRIPT SMALL J
+1D4F2..1D4F3 ; Soft_Dotted # L& [2] MATHEMATICAL BOLD SCRIPT SMALL I..MATHEMATICAL BOLD SCRIPT SMALL J
+1D526..1D527 ; Soft_Dotted # L& [2] MATHEMATICAL FRAKTUR SMALL I..MATHEMATICAL FRAKTUR SMALL J
+1D55A..1D55B ; Soft_Dotted # L& [2] MATHEMATICAL DOUBLE-STRUCK SMALL I..MATHEMATICAL DOUBLE-STRUCK SMALL J
+1D58E..1D58F ; Soft_Dotted # L& [2] MATHEMATICAL BOLD FRAKTUR SMALL I..MATHEMATICAL BOLD FRAKTUR SMALL J
+1D5C2..1D5C3 ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF SMALL I..MATHEMATICAL SANS-SERIF SMALL J
+1D5F6..1D5F7 ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD SMALL I..MATHEMATICAL SANS-SERIF BOLD SMALL J
+1D62A..1D62B ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF ITALIC SMALL I..MATHEMATICAL SANS-SERIF ITALIC SMALL J
+1D65E..1D65F ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+1D692..1D693 ; Soft_Dotted # L& [2] MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J
+
+# Total code points: 46
+
+# ================================================
+
+0E40..0E44 ; Logical_Order_Exception # Lo [5] THAI CHARACTER SARA E..THAI CHARACTER SARA AI MAIMALAI
+0EC0..0EC4 ; Logical_Order_Exception # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+
+# Total code points: 10
+
+# ================================================
+
+2118 ; Other_ID_Start # So SCRIPT CAPITAL P
+212E ; Other_ID_Start # So ESTIMATED SYMBOL
+309B..309C ; Other_ID_Start # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+
+# Total code points: 4
+
+# ================================================
+
+00B7 ; Other_ID_Continue # Po MIDDLE DOT
+0387 ; Other_ID_Continue # Po GREEK ANO TELEIA
+1369..1371 ; Other_ID_Continue # No [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE
+
+# Total code points: 11
+
+# ================================================
+
+0021 ; STerm # Po EXCLAMATION MARK
+002E ; STerm # Po FULL STOP
+003F ; STerm # Po QUESTION MARK
+055C ; STerm # Po ARMENIAN EXCLAMATION MARK
+055E ; STerm # Po ARMENIAN QUESTION MARK
+0589 ; STerm # Po ARMENIAN FULL STOP
+061F ; STerm # Po ARABIC QUESTION MARK
+06D4 ; STerm # Po ARABIC FULL STOP
+0700..0702 ; STerm # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP
+07F9 ; STerm # Po NKO EXCLAMATION MARK
+0964..0965 ; STerm # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+104A..104B ; STerm # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION
+1362 ; STerm # Po ETHIOPIC FULL STOP
+1367..1368 ; STerm # Po [2] ETHIOPIC QUESTION MARK..ETHIOPIC PARAGRAPH SEPARATOR
+166E ; STerm # Po CANADIAN SYLLABICS FULL STOP
+1803 ; STerm # Po MONGOLIAN FULL STOP
+1809 ; STerm # Po MONGOLIAN MANCHU FULL STOP
+1944..1945 ; STerm # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+1B5A..1B5B ; STerm # Po [2] BALINESE PANTI..BALINESE PAMADA
+1B5E..1B5F ; STerm # Po [2] BALINESE CARIK SIKI..BALINESE CARIK PAREREN
+1C3B..1C3C ; STerm # Po [2] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION NYET THYOOM TA-ROL
+1C7E..1C7F ; STerm # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
+203C..203D ; STerm # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG
+2047..2049 ; STerm # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK
+2E2E ; STerm # Po REVERSED QUESTION MARK
+3002 ; STerm # Po IDEOGRAPHIC FULL STOP
+A60E..A60F ; STerm # Po [2] VAI FULL STOP..VAI QUESTION MARK
+A876..A877 ; STerm # Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD
+A8CE..A8CF ; STerm # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA
+A92F ; STerm # Po KAYAH LI SIGN SHYA
+AA5D..AA5F ; STerm # Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA
+FE52 ; STerm # Po SMALL FULL STOP
+FE56..FE57 ; STerm # Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK
+FF01 ; STerm # Po FULLWIDTH EXCLAMATION MARK
+FF0E ; STerm # Po FULLWIDTH FULL STOP
+FF1F ; STerm # Po FULLWIDTH QUESTION MARK
+FF61 ; STerm # Po HALFWIDTH IDEOGRAPHIC FULL STOP
+
+# Total code points: 56
+
+# ================================================
+
+180B..180D ; Variation_Selector # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+FE00..FE0F ; Variation_Selector # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 259
+
+# ================================================
+
+0009..000D ; Pattern_White_Space # Cc [5] <control-0009>..<control-000D>
+0020 ; Pattern_White_Space # Zs SPACE
+0085 ; Pattern_White_Space # Cc <control-0085>
+200E..200F ; Pattern_White_Space # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+2028 ; Pattern_White_Space # Zl LINE SEPARATOR
+2029 ; Pattern_White_Space # Zp PARAGRAPH SEPARATOR
+
+# Total code points: 11
+
+# ================================================
+
+0021..0023 ; Pattern_Syntax # Po [3] EXCLAMATION MARK..NUMBER SIGN
+0024 ; Pattern_Syntax # Sc DOLLAR SIGN
+0025..0027 ; Pattern_Syntax # Po [3] PERCENT SIGN..APOSTROPHE
+0028 ; Pattern_Syntax # Ps LEFT PARENTHESIS
+0029 ; Pattern_Syntax # Pe RIGHT PARENTHESIS
+002A ; Pattern_Syntax # Po ASTERISK
+002B ; Pattern_Syntax # Sm PLUS SIGN
+002C ; Pattern_Syntax # Po COMMA
+002D ; Pattern_Syntax # Pd HYPHEN-MINUS
+002E..002F ; Pattern_Syntax # Po [2] FULL STOP..SOLIDUS
+003A..003B ; Pattern_Syntax # Po [2] COLON..SEMICOLON
+003C..003E ; Pattern_Syntax # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN
+003F..0040 ; Pattern_Syntax # Po [2] QUESTION MARK..COMMERCIAL AT
+005B ; Pattern_Syntax # Ps LEFT SQUARE BRACKET
+005C ; Pattern_Syntax # Po REVERSE SOLIDUS
+005D ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET
+005E ; Pattern_Syntax # Sk CIRCUMFLEX ACCENT
+0060 ; Pattern_Syntax # Sk GRAVE ACCENT
+007B ; Pattern_Syntax # Ps LEFT CURLY BRACKET
+007C ; Pattern_Syntax # Sm VERTICAL LINE
+007D ; Pattern_Syntax # Pe RIGHT CURLY BRACKET
+007E ; Pattern_Syntax # Sm TILDE
+00A1 ; Pattern_Syntax # Po INVERTED EXCLAMATION MARK
+00A2..00A5 ; Pattern_Syntax # Sc [4] CENT SIGN..YEN SIGN
+00A6..00A7 ; Pattern_Syntax # So [2] BROKEN BAR..SECTION SIGN
+00A9 ; Pattern_Syntax # So COPYRIGHT SIGN
+00AB ; Pattern_Syntax # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC ; Pattern_Syntax # Sm NOT SIGN
+00AE ; Pattern_Syntax # So REGISTERED SIGN
+00B0 ; Pattern_Syntax # So DEGREE SIGN
+00B1 ; Pattern_Syntax # Sm PLUS-MINUS SIGN
+00B6 ; Pattern_Syntax # So PILCROW SIGN
+00BB ; Pattern_Syntax # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BF ; Pattern_Syntax # Po INVERTED QUESTION MARK
+00D7 ; Pattern_Syntax # Sm MULTIPLICATION SIGN
+00F7 ; Pattern_Syntax # Sm DIVISION SIGN
+2010..2015 ; Pattern_Syntax # Pd [6] HYPHEN..HORIZONTAL BAR
+2016..2017 ; Pattern_Syntax # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE
+2018 ; Pattern_Syntax # Pi LEFT SINGLE QUOTATION MARK
+2019 ; Pattern_Syntax # Pf RIGHT SINGLE QUOTATION MARK
+201A ; Pattern_Syntax # Ps SINGLE LOW-9 QUOTATION MARK
+201B..201C ; Pattern_Syntax # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D ; Pattern_Syntax # Pf RIGHT DOUBLE QUOTATION MARK
+201E ; Pattern_Syntax # Ps DOUBLE LOW-9 QUOTATION MARK
+201F ; Pattern_Syntax # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020..2027 ; Pattern_Syntax # Po [8] DAGGER..HYPHENATION POINT
+2030..2038 ; Pattern_Syntax # Po [9] PER MILLE SIGN..CARET
+2039 ; Pattern_Syntax # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; Pattern_Syntax # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B..203E ; Pattern_Syntax # Po [4] REFERENCE MARK..OVERLINE
+2041..2043 ; Pattern_Syntax # Po [3] CARET INSERTION POINT..HYPHEN BULLET
+2044 ; Pattern_Syntax # Sm FRACTION SLASH
+2045 ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH QUILL
+2046 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH QUILL
+2047..2051 ; Pattern_Syntax # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY
+2052 ; Pattern_Syntax # Sm COMMERCIAL MINUS SIGN
+2053 ; Pattern_Syntax # Po SWUNG DASH
+2055..205E ; Pattern_Syntax # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS
+2190..2194 ; Pattern_Syntax # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW
+2195..2199 ; Pattern_Syntax # So [5] UP DOWN ARROW..SOUTH WEST ARROW
+219A..219B ; Pattern_Syntax # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
+219C..219F ; Pattern_Syntax # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A0 ; Pattern_Syntax # Sm RIGHTWARDS TWO HEADED ARROW
+21A1..21A2 ; Pattern_Syntax # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A3 ; Pattern_Syntax # Sm RIGHTWARDS ARROW WITH TAIL
+21A4..21A5 ; Pattern_Syntax # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A6 ; Pattern_Syntax # Sm RIGHTWARDS ARROW FROM BAR
+21A7..21AD ; Pattern_Syntax # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW
+21AE ; Pattern_Syntax # Sm LEFT RIGHT ARROW WITH STROKE
+21AF..21CD ; Pattern_Syntax # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE..21CF ; Pattern_Syntax # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1 ; Pattern_Syntax # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D2 ; Pattern_Syntax # Sm RIGHTWARDS DOUBLE ARROW
+21D3 ; Pattern_Syntax # So DOWNWARDS DOUBLE ARROW
+21D4 ; Pattern_Syntax # Sm LEFT RIGHT DOUBLE ARROW
+21D5..21F3 ; Pattern_Syntax # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW
+21F4..22FF ; Pattern_Syntax # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP
+2300..2307 ; Pattern_Syntax # So [8] DIAMETER SIGN..WAVY LINE
+2308..230B ; Pattern_Syntax # Sm [4] LEFT CEILING..RIGHT FLOOR
+230C..231F ; Pattern_Syntax # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER
+2320..2321 ; Pattern_Syntax # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
+2322..2328 ; Pattern_Syntax # So [7] FROWN..KEYBOARD
+2329 ; Pattern_Syntax # Ps LEFT-POINTING ANGLE BRACKET
+232A ; Pattern_Syntax # Pe RIGHT-POINTING ANGLE BRACKET
+232B..237B ; Pattern_Syntax # So [81] ERASE TO THE LEFT..NOT CHECK MARK
+237C ; Pattern_Syntax # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D..239A ; Pattern_Syntax # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL
+239B..23B3 ; Pattern_Syntax # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
+23B4..23DB ; Pattern_Syntax # So [40] TOP SQUARE BRACKET..FUSE
+23DC..23E1 ; Pattern_Syntax # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET
+23E2..23E7 ; Pattern_Syntax # So [6] WHITE TRAPEZIUM..ELECTRICAL INTERSECTION
+23E8..23FF ; Pattern_Syntax # Cn [24] <reserved-23E8>..<reserved-23FF>
+2400..2426 ; Pattern_Syntax # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO
+2427..243F ; Pattern_Syntax # Cn [25] <reserved-2427>..<reserved-243F>
+2440..244A ; Pattern_Syntax # So [11] OCR HOOK..OCR DOUBLE BACKSLASH
+244B..245F ; Pattern_Syntax # Cn [21] <reserved-244B>..<reserved-245F>
+2500..25B6 ; Pattern_Syntax # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE
+25B7 ; Pattern_Syntax # Sm WHITE RIGHT-POINTING TRIANGLE
+25B8..25C0 ; Pattern_Syntax # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C1 ; Pattern_Syntax # Sm WHITE LEFT-POINTING TRIANGLE
+25C2..25F7 ; Pattern_Syntax # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8..25FF ; Pattern_Syntax # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
+2600..266E ; Pattern_Syntax # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN
+266F ; Pattern_Syntax # Sm MUSIC SHARP SIGN
+2670..269D ; Pattern_Syntax # So [46] WEST SYRIAC CROSS..OUTLINED WHITE STAR
+269E..269F ; Pattern_Syntax # Cn [2] <reserved-269E>..<reserved-269F>
+26A0..26BC ; Pattern_Syntax # So [29] WARNING SIGN..SESQUIQUADRATE
+26BD..26BF ; Pattern_Syntax # Cn [3] <reserved-26BD>..<reserved-26BF>
+26C0..26C3 ; Pattern_Syntax # So [4] WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING
+26C4..2700 ; Pattern_Syntax # Cn [61] <reserved-26C4>..<reserved-2700>
+2701..2704 ; Pattern_Syntax # So [4] UPPER BLADE SCISSORS..WHITE SCISSORS
+2705 ; Pattern_Syntax # Cn <reserved-2705>
+2706..2709 ; Pattern_Syntax # So [4] TELEPHONE LOCATION SIGN..ENVELOPE
+270A..270B ; Pattern_Syntax # Cn [2] <reserved-270A>..<reserved-270B>
+270C..2727 ; Pattern_Syntax # So [28] VICTORY HAND..WHITE FOUR POINTED STAR
+2728 ; Pattern_Syntax # Cn <reserved-2728>
+2729..274B ; Pattern_Syntax # So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274C ; Pattern_Syntax # Cn <reserved-274C>
+274D ; Pattern_Syntax # So SHADOWED WHITE CIRCLE
+274E ; Pattern_Syntax # Cn <reserved-274E>
+274F..2752 ; Pattern_Syntax # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE
+2753..2755 ; Pattern_Syntax # Cn [3] <reserved-2753>..<reserved-2755>
+2756 ; Pattern_Syntax # So BLACK DIAMOND MINUS WHITE X
+2757 ; Pattern_Syntax # Cn <reserved-2757>
+2758..275E ; Pattern_Syntax # So [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+275F..2760 ; Pattern_Syntax # Cn [2] <reserved-275F>..<reserved-2760>
+2761..2767 ; Pattern_Syntax # So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET
+2768 ; Pattern_Syntax # Ps MEDIUM LEFT PARENTHESIS ORNAMENT
+2769 ; Pattern_Syntax # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A ; Pattern_Syntax # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B ; Pattern_Syntax # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C ; Pattern_Syntax # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D ; Pattern_Syntax # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E ; Pattern_Syntax # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F ; Pattern_Syntax # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770 ; Pattern_Syntax # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771 ; Pattern_Syntax # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772 ; Pattern_Syntax # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773 ; Pattern_Syntax # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774 ; Pattern_Syntax # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775 ; Pattern_Syntax # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2794 ; Pattern_Syntax # So HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2795..2797 ; Pattern_Syntax # Cn [3] <reserved-2795>..<reserved-2797>
+2798..27AF ; Pattern_Syntax # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B0 ; Pattern_Syntax # Cn <reserved-27B0>
+27B1..27BE ; Pattern_Syntax # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW
+27BF ; Pattern_Syntax # Cn <reserved-27BF>
+27C0..27C4 ; Pattern_Syntax # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET
+27C5 ; Pattern_Syntax # Ps LEFT S-SHAPED BAG DELIMITER
+27C6 ; Pattern_Syntax # Pe RIGHT S-SHAPED BAG DELIMITER
+27C7..27CA ; Pattern_Syntax # Sm [4] OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE
+27CB ; Pattern_Syntax # Cn <reserved-27CB>
+27CC ; Pattern_Syntax # Sm LONG DIVISION
+27CD..27CF ; Pattern_Syntax # Cn [3] <reserved-27CD>..<reserved-27CF>
+27D0..27E5 ; Pattern_Syntax # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK
+27E6 ; Pattern_Syntax # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 ; Pattern_Syntax # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 ; Pattern_Syntax # Ps MATHEMATICAL LEFT ANGLE BRACKET
+27E9 ; Pattern_Syntax # Pe MATHEMATICAL RIGHT ANGLE BRACKET
+27EA ; Pattern_Syntax # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB ; Pattern_Syntax # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC ; Pattern_Syntax # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED ; Pattern_Syntax # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE ; Pattern_Syntax # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF ; Pattern_Syntax # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0..27FF ; Pattern_Syntax # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
+2800..28FF ; Pattern_Syntax # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
+2900..2982 ; Pattern_Syntax # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON
+2983 ; Pattern_Syntax # Ps LEFT WHITE CURLY BRACKET
+2984 ; Pattern_Syntax # Pe RIGHT WHITE CURLY BRACKET
+2985 ; Pattern_Syntax # Ps LEFT WHITE PARENTHESIS
+2986 ; Pattern_Syntax # Pe RIGHT WHITE PARENTHESIS
+2987 ; Pattern_Syntax # Ps Z NOTATION LEFT IMAGE BRACKET
+2988 ; Pattern_Syntax # Pe Z NOTATION RIGHT IMAGE BRACKET
+2989 ; Pattern_Syntax # Ps Z NOTATION LEFT BINDING BRACKET
+298A ; Pattern_Syntax # Pe Z NOTATION RIGHT BINDING BRACKET
+298B ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH UNDERBAR
+298C ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH UNDERBAR
+298D ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET WITH DOT
+2992 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET WITH DOT
+2993 ; Pattern_Syntax # Ps LEFT ARC LESS-THAN BRACKET
+2994 ; Pattern_Syntax # Pe RIGHT ARC GREATER-THAN BRACKET
+2995 ; Pattern_Syntax # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 ; Pattern_Syntax # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 ; Pattern_Syntax # Ps LEFT BLACK TORTOISE SHELL BRACKET
+2998 ; Pattern_Syntax # Pe RIGHT BLACK TORTOISE SHELL BRACKET
+2999..29D7 ; Pattern_Syntax # Sm [63] DOTTED FENCE..BLACK HOURGLASS
+29D8 ; Pattern_Syntax # Ps LEFT WIGGLY FENCE
+29D9 ; Pattern_Syntax # Pe RIGHT WIGGLY FENCE
+29DA ; Pattern_Syntax # Ps LEFT DOUBLE WIGGLY FENCE
+29DB ; Pattern_Syntax # Pe RIGHT DOUBLE WIGGLY FENCE
+29DC..29FB ; Pattern_Syntax # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS
+29FC ; Pattern_Syntax # Ps LEFT-POINTING CURVED ANGLE BRACKET
+29FD ; Pattern_Syntax # Pe RIGHT-POINTING CURVED ANGLE BRACKET
+29FE..2AFF ; Pattern_Syntax # Sm [258] TINY..N-ARY WHITE VERTICAL BAR
+2B00..2B2F ; Pattern_Syntax # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE
+2B30..2B44 ; Pattern_Syntax # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET
+2B45..2B46 ; Pattern_Syntax # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW
+2B47..2B4C ; Pattern_Syntax # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B4D..2B4F ; Pattern_Syntax # Cn [3] <reserved-2B4D>..<reserved-2B4F>
+2B50..2B54 ; Pattern_Syntax # So [5] WHITE MEDIUM STAR..WHITE RIGHT-POINTING PENTAGON
+2B55..2BFF ; Pattern_Syntax # Cn [171] <reserved-2B55>..<reserved-2BFF>
+2E00..2E01 ; Pattern_Syntax # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02 ; Pattern_Syntax # Pi LEFT SUBSTITUTION BRACKET
+2E03 ; Pattern_Syntax # Pf RIGHT SUBSTITUTION BRACKET
+2E04 ; Pattern_Syntax # Pi LEFT DOTTED SUBSTITUTION BRACKET
+2E05 ; Pattern_Syntax # Pf RIGHT DOTTED SUBSTITUTION BRACKET
+2E06..2E08 ; Pattern_Syntax # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER
+2E09 ; Pattern_Syntax # Pi LEFT TRANSPOSITION BRACKET
+2E0A ; Pattern_Syntax # Pf RIGHT TRANSPOSITION BRACKET
+2E0B ; Pattern_Syntax # Po RAISED SQUARE
+2E0C ; Pattern_Syntax # Pi LEFT RAISED OMISSION BRACKET
+2E0D ; Pattern_Syntax # Pf RIGHT RAISED OMISSION BRACKET
+2E0E..2E16 ; Pattern_Syntax # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE
+2E17 ; Pattern_Syntax # Pd DOUBLE OBLIQUE HYPHEN
+2E18..2E19 ; Pattern_Syntax # Po [2] INVERTED INTERROBANG..PALM BRANCH
+2E1A ; Pattern_Syntax # Pd HYPHEN WITH DIAERESIS
+2E1B ; Pattern_Syntax # Po TILDE WITH RING ABOVE
+2E1C ; Pattern_Syntax # Pi LEFT LOW PARAPHRASE BRACKET
+2E1D ; Pattern_Syntax # Pf RIGHT LOW PARAPHRASE BRACKET
+2E1E..2E1F ; Pattern_Syntax # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW
+2E20 ; Pattern_Syntax # Pi LEFT VERTICAL BAR WITH QUILL
+2E21 ; Pattern_Syntax # Pf RIGHT VERTICAL BAR WITH QUILL
+2E22 ; Pattern_Syntax # Ps TOP LEFT HALF BRACKET
+2E23 ; Pattern_Syntax # Pe TOP RIGHT HALF BRACKET
+2E24 ; Pattern_Syntax # Ps BOTTOM LEFT HALF BRACKET
+2E25 ; Pattern_Syntax # Pe BOTTOM RIGHT HALF BRACKET
+2E26 ; Pattern_Syntax # Ps LEFT SIDEWAYS U BRACKET
+2E27 ; Pattern_Syntax # Pe RIGHT SIDEWAYS U BRACKET
+2E28 ; Pattern_Syntax # Ps LEFT DOUBLE PARENTHESIS
+2E29 ; Pattern_Syntax # Pe RIGHT DOUBLE PARENTHESIS
+2E2A..2E2E ; Pattern_Syntax # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK
+2E2F ; Pattern_Syntax # Lm VERTICAL TILDE
+2E30 ; Pattern_Syntax # Po RING POINT
+2E31..2E7F ; Pattern_Syntax # Cn [79] <reserved-2E31>..<reserved-2E7F>
+3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
+3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET
+3009 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET
+300A ; Pattern_Syntax # Ps LEFT DOUBLE ANGLE BRACKET
+300B ; Pattern_Syntax # Pe RIGHT DOUBLE ANGLE BRACKET
+300C ; Pattern_Syntax # Ps LEFT CORNER BRACKET
+300D ; Pattern_Syntax # Pe RIGHT CORNER BRACKET
+300E ; Pattern_Syntax # Ps LEFT WHITE CORNER BRACKET
+300F ; Pattern_Syntax # Pe RIGHT WHITE CORNER BRACKET
+3010 ; Pattern_Syntax # Ps LEFT BLACK LENTICULAR BRACKET
+3011 ; Pattern_Syntax # Pe RIGHT BLACK LENTICULAR BRACKET
+3012..3013 ; Pattern_Syntax # So [2] POSTAL MARK..GETA MARK
+3014 ; Pattern_Syntax # Ps LEFT TORTOISE SHELL BRACKET
+3015 ; Pattern_Syntax # Pe RIGHT TORTOISE SHELL BRACKET
+3016 ; Pattern_Syntax # Ps LEFT WHITE LENTICULAR BRACKET
+3017 ; Pattern_Syntax # Pe RIGHT WHITE LENTICULAR BRACKET
+3018 ; Pattern_Syntax # Ps LEFT WHITE TORTOISE SHELL BRACKET
+3019 ; Pattern_Syntax # Pe RIGHT WHITE TORTOISE SHELL BRACKET
+301A ; Pattern_Syntax # Ps LEFT WHITE SQUARE BRACKET
+301B ; Pattern_Syntax # Pe RIGHT WHITE SQUARE BRACKET
+301C ; Pattern_Syntax # Pd WAVE DASH
+301D ; Pattern_Syntax # Ps REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F ; Pattern_Syntax # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+3020 ; Pattern_Syntax # So POSTAL MARK FACE
+3030 ; Pattern_Syntax # Pd WAVY DASH
+FD3E ; Pattern_Syntax # Ps ORNATE LEFT PARENTHESIS
+FD3F ; Pattern_Syntax # Pe ORNATE RIGHT PARENTHESIS
+FE45..FE46 ; Pattern_Syntax # Po [2] SESAME DOT..WHITE SESAME DOT
+
+# Total code points: 2760
+
+# EOF
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/PropValueAliases.txt b/Master/tlpkg/tlperl.straw/lib/unicore/PropValueAliases.txt
new file mode 100755
index 00000000000..61f22389164
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/PropValueAliases.txt
@@ -0,0 +1,1012 @@
+# PropertyValueAliases-5.1.0.txt
+# Date: 2008-03-03, 21:58:08 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# This file contains aliases for property values used in the UCD.
+# These names can be used for XML formats of UCD data, for regular-expression
+# property tests, and other programmatic textual descriptions of Unicode data.
+# For information on which properties are normative, see UCD.html.
+#
+# The names may be translated in appropriate environments, and additional
+# aliases may be useful.
+#
+# FORMAT
+#
+# Each line describes a property value name.
+# This consists of three or more fields, separated by semicolons.
+#
+# First Field: The first field describes the property for which that
+# property value name is used.
+#
+# Second Field: The second field is an abbreviated name.
+# If there is no abbreviated name available, the field is marked with "n/a".
+#
+# Third Field: The third field is a long name.
+#
+# In the case of ccc, there are 4 fields. The second field is numeric, third
+# is abbreviated, and fourth is long.
+#
+# The above are the preferred aliases. Other aliases may be listed in additional fields.
+#
+# Loose matching should be applied to all property names and property values, with
+# the exception of String Property values. With loose matching of property names and
+# values, the case distinctions, whitespace, and '_' are ignored. For Numeric Property
+# values, numeric equivalencies are applied: thus "01.00" is equivalent to "1".
+#
+# NOTE: Property value names are NOT unique across properties. For example:
+#
+# AL means Arabic Letter for the Bidi_Class property, and
+# AL means Alpha_Left for the Combining_Class property, and
+# AL means Alphabetic for the Line_Break property.
+#
+# In addition, some property names may be the same as some property value names.
+# For example:
+#
+# sc means the Script property, and
+# Sc means the General_Category property value Currency_Symbol (Sc)
+#
+# The combination of property value and property name is, however, unique.
+#
+# For more information, see UTS #18: Regular Expression Guidelines
+# ================================================
+
+
+# ASCII_Hex_Digit (AHex)
+
+AHex; N ; No ; F ; False
+AHex; Y ; Yes ; T ; True
+
+# Age (age)
+
+age; n/a ; 1.1
+age; n/a ; 2.0
+age; n/a ; 2.1
+age; n/a ; 3.0
+age; n/a ; 3.1
+age; n/a ; 3.2
+age; n/a ; 4.0
+age; n/a ; 4.1
+age; n/a ; 5.0
+age; n/a ; 5.1
+age; n/a ; unassigned
+
+# Alphabetic (Alpha)
+
+Alpha; N ; No ; F ; False
+Alpha; Y ; Yes ; T ; True
+
+# Bidi_Class (bc)
+
+bc ; AL ; Arabic_Letter
+bc ; AN ; Arabic_Number
+bc ; B ; Paragraph_Separator
+bc ; BN ; Boundary_Neutral
+bc ; CS ; Common_Separator
+bc ; EN ; European_Number
+bc ; ES ; European_Separator
+bc ; ET ; European_Terminator
+bc ; L ; Left_To_Right
+bc ; LRE ; Left_To_Right_Embedding
+bc ; LRO ; Left_To_Right_Override
+bc ; NSM ; Nonspacing_Mark
+bc ; ON ; Other_Neutral
+bc ; PDF ; Pop_Directional_Format
+bc ; R ; Right_To_Left
+bc ; RLE ; Right_To_Left_Embedding
+bc ; RLO ; Right_To_Left_Override
+bc ; S ; Segment_Separator
+bc ; WS ; White_Space
+
+# Bidi_Control (Bidi_C)
+
+Bidi_C; N ; No ; F ; False
+Bidi_C; Y ; Yes ; T ; True
+
+# Bidi_Mirrored (Bidi_M)
+
+Bidi_M; N ; No ; F ; False
+Bidi_M; Y ; Yes ; T ; True
+
+# Bidi_Mirroring_Glyph (bmg)
+
+# @missing: 0000..10FFFF; Bidi_Mirroring_Glyph; <none>
+
+# Block (blk)
+
+blk; n/a ; Aegean_Numbers
+blk; n/a ; Alphabetic_Presentation_Forms
+blk; n/a ; Ancient_Greek_Musical_Notation
+blk; n/a ; Ancient_Greek_Numbers
+blk; n/a ; Ancient_Symbols
+blk; n/a ; Arabic
+blk; n/a ; Arabic_Presentation_Forms_A ; Arabic_Presentation_Forms-A
+blk; n/a ; Arabic_Presentation_Forms_B
+blk; n/a ; Arabic_Supplement
+blk; n/a ; Armenian
+blk; n/a ; Arrows
+blk; n/a ; Balinese
+blk; n/a ; Basic_Latin ; ASCII
+blk; n/a ; Bengali
+blk; n/a ; Block_Elements
+blk; n/a ; Bopomofo
+blk; n/a ; Bopomofo_Extended
+blk; n/a ; Box_Drawing
+blk; n/a ; Braille_Patterns
+blk; n/a ; Buginese
+blk; n/a ; Buhid
+blk; n/a ; Byzantine_Musical_Symbols
+blk; n/a ; Carian
+blk; n/a ; Cham
+blk; n/a ; Cherokee
+blk; n/a ; CJK_Compatibility
+blk; n/a ; CJK_Compatibility_Forms
+blk; n/a ; CJK_Compatibility_Ideographs
+blk; n/a ; CJK_Compatibility_Ideographs_Supplement
+blk; n/a ; CJK_Radicals_Supplement
+blk; n/a ; CJK_Strokes
+blk; n/a ; CJK_Symbols_And_Punctuation
+blk; n/a ; CJK_Unified_Ideographs
+blk; n/a ; CJK_Unified_Ideographs_Extension_A
+blk; n/a ; CJK_Unified_Ideographs_Extension_B
+blk; n/a ; Combining_Diacritical_Marks
+blk; n/a ; Combining_Diacritical_Marks_For_Symbols; Combining_Marks_For_Symbols
+blk; n/a ; Combining_Diacritical_Marks_Supplement
+blk; n/a ; Combining_Half_Marks
+blk; n/a ; Control_Pictures
+blk; n/a ; Coptic
+blk; n/a ; Counting_Rod_Numerals
+blk; n/a ; Cuneiform
+blk; n/a ; Cuneiform_Numbers_And_Punctuation
+blk; n/a ; Currency_Symbols
+blk; n/a ; Cypriot_Syllabary
+blk; n/a ; Cyrillic
+blk; n/a ; Cyrillic_Extended_A
+blk; n/a ; Cyrillic_Extended_B
+blk; n/a ; Cyrillic_Supplement ; Cyrillic_Supplementary
+blk; n/a ; Deseret
+blk; n/a ; Devanagari
+blk; n/a ; Dingbats
+blk; n/a ; Domino_Tiles
+blk; n/a ; Enclosed_Alphanumerics
+blk; n/a ; Enclosed_CJK_Letters_And_Months
+blk; n/a ; Ethiopic
+blk; n/a ; Ethiopic_Extended
+blk; n/a ; Ethiopic_Supplement
+blk; n/a ; General_Punctuation
+blk; n/a ; Geometric_Shapes
+blk; n/a ; Georgian
+blk; n/a ; Georgian_Supplement
+blk; n/a ; Glagolitic
+blk; n/a ; Gothic
+blk; n/a ; Greek_And_Coptic ; Greek
+blk; n/a ; Greek_Extended
+blk; n/a ; Gujarati
+blk; n/a ; Gurmukhi
+blk; n/a ; Halfwidth_And_Fullwidth_Forms
+blk; n/a ; Hangul_Compatibility_Jamo
+blk; n/a ; Hangul_Jamo
+blk; n/a ; Hangul_Syllables
+blk; n/a ; Hanunoo
+blk; n/a ; Hebrew
+blk; n/a ; High_Private_Use_Surrogates
+blk; n/a ; High_Surrogates
+blk; n/a ; Hiragana
+blk; n/a ; Ideographic_Description_Characters
+blk; n/a ; IPA_Extensions
+blk; n/a ; Kanbun
+blk; n/a ; Kangxi_Radicals
+blk; n/a ; Kannada
+blk; n/a ; Katakana
+blk; n/a ; Katakana_Phonetic_Extensions
+blk; n/a ; Kayah_Li
+blk; n/a ; Kharoshthi
+blk; n/a ; Khmer
+blk; n/a ; Khmer_Symbols
+blk; n/a ; Lao
+blk; n/a ; Latin_1_Supplement ; Latin_1
+blk; n/a ; Latin_Extended_A
+blk; n/a ; Latin_Extended_Additional
+blk; n/a ; Latin_Extended_B
+blk; n/a ; Latin_Extended_C
+blk; n/a ; Latin_Extended_D
+blk; n/a ; Lepcha
+blk; n/a ; Letterlike_Symbols
+blk; n/a ; Limbu
+blk; n/a ; Linear_B_Ideograms
+blk; n/a ; Linear_B_Syllabary
+blk; n/a ; Low_Surrogates
+blk; n/a ; Lycian
+blk; n/a ; Lydian
+blk; n/a ; Mahjong_Tiles
+blk; n/a ; Malayalam
+blk; n/a ; Mathematical_Alphanumeric_Symbols
+blk; n/a ; Mathematical_Operators
+blk; n/a ; Miscellaneous_Mathematical_Symbols_A
+blk; n/a ; Miscellaneous_Mathematical_Symbols_B
+blk; n/a ; Miscellaneous_Symbols
+blk; n/a ; Miscellaneous_Symbols_And_Arrows
+blk; n/a ; Miscellaneous_Technical
+blk; n/a ; Modifier_Tone_Letters
+blk; n/a ; Mongolian
+blk; n/a ; Musical_Symbols
+blk; n/a ; Myanmar
+blk; n/a ; New_Tai_Lue
+blk; n/a ; NKo
+blk; n/a ; No_Block
+blk; n/a ; Number_Forms
+blk; n/a ; Ogham
+blk; n/a ; Ol_Chiki
+blk; n/a ; Old_Italic
+blk; n/a ; Old_Persian
+blk; n/a ; Optical_Character_Recognition
+blk; n/a ; Oriya
+blk; n/a ; Osmanya
+blk; n/a ; Phags_Pa
+blk; n/a ; Phaistos_Disc
+blk; n/a ; Phoenician
+blk; n/a ; Phonetic_Extensions
+blk; n/a ; Phonetic_Extensions_Supplement
+blk; n/a ; Private_Use_Area ; Private_Use
+blk; n/a ; Rejang
+blk; n/a ; Runic
+blk; n/a ; Saurashtra
+blk; n/a ; Shavian
+blk; n/a ; Sinhala
+blk; n/a ; Small_Form_Variants
+blk; n/a ; Spacing_Modifier_Letters
+blk; n/a ; Specials
+blk; n/a ; Sundanese
+blk; n/a ; Superscripts_And_Subscripts
+blk; n/a ; Supplemental_Arrows_A
+blk; n/a ; Supplemental_Arrows_B
+blk; n/a ; Supplemental_Mathematical_Operators
+blk; n/a ; Supplemental_Punctuation
+blk; n/a ; Supplementary_Private_Use_Area_A
+blk; n/a ; Supplementary_Private_Use_Area_B
+blk; n/a ; Syloti_Nagri
+blk; n/a ; Syriac
+blk; n/a ; Tagalog
+blk; n/a ; Tagbanwa
+blk; n/a ; Tags
+blk; n/a ; Tai_Le
+blk; n/a ; Tai_Xuan_Jing_Symbols
+blk; n/a ; Tamil
+blk; n/a ; Telugu
+blk; n/a ; Thaana
+blk; n/a ; Thai
+blk; n/a ; Tibetan
+blk; n/a ; Tifinagh
+blk; n/a ; Ugaritic
+blk; n/a ; Unified_Canadian_Aboriginal_Syllabics; Canadian_Syllabics
+blk; n/a ; Vai
+blk; n/a ; Variation_Selectors
+blk; n/a ; Variation_Selectors_Supplement
+blk; n/a ; Vertical_Forms
+blk; n/a ; Yi_Radicals
+blk; n/a ; Yi_Syllables
+blk; n/a ; Yijing_Hexagram_Symbols
+
+# Canonical_Combining_Class (ccc)
+
+ccc; 0; NR ; Not_Reordered
+ccc; 1; OV ; Overlay
+ccc; 7; NK ; Nukta
+ccc; 8; KV ; Kana_Voicing
+ccc; 9; VR ; Virama
+ccc; 200; ATBL ; Attached_Below_Left
+ccc; 202; ATB ; Attached_Below
+ccc; 216; ATAR ; Attached_Above_Right
+ccc; 218; BL ; Below_Left
+ccc; 220; B ; Below
+ccc; 222; BR ; Below_Right
+ccc; 224; L ; Left
+ccc; 226; R ; Right
+ccc; 228; AL ; Above_Left
+ccc; 230; A ; Above
+ccc; 232; AR ; Above_Right
+ccc; 233; DB ; Double_Below
+ccc; 234; DA ; Double_Above
+ccc; 240; IS ; Iota_Subscript
+
+# Case_Folding (cf)
+
+# @missing: 0000..10FFFF; Case_Folding; <code point>
+
+# Composition_Exclusion (CE)
+
+CE ; N ; No ; F ; False
+CE ; Y ; Yes ; T ; True
+
+# Dash (Dash)
+
+Dash; N ; No ; F ; False
+Dash; Y ; Yes ; T ; True
+
+# Decomposition_Mapping (dm)
+
+# @missing: 0000..10FFFF; Decomposition_Mapping; <code point>
+
+# Decomposition_Type (dt)
+
+dt ; Can ; Canonical ; can
+dt ; Com ; Compat ; com
+dt ; Enc ; Circle ; enc
+dt ; Fin ; Final ; fin
+dt ; Font ; font
+dt ; Fra ; Fraction ; fra
+dt ; Init ; Initial ; init
+dt ; Iso ; Isolated ; iso
+dt ; Med ; Medial ; med
+dt ; Nar ; Narrow ; nar
+dt ; Nb ; Nobreak ; nb
+dt ; None ; none
+dt ; Sml ; Small ; sml
+dt ; Sqr ; Square ; sqr
+dt ; Sub ; sub
+dt ; Sup ; Super ; sup
+dt ; Vert ; Vertical ; vert
+dt ; Wide ; wide
+
+# Default_Ignorable_Code_Point (DI)
+
+DI ; N ; No ; F ; False
+DI ; Y ; Yes ; T ; True
+
+# Deprecated (Dep)
+
+Dep; N ; No ; F ; False
+Dep; Y ; Yes ; T ; True
+
+# Diacritic (Dia)
+
+Dia; N ; No ; F ; False
+Dia; Y ; Yes ; T ; True
+
+# East_Asian_Width (ea)
+
+ea ; A ; Ambiguous
+ea ; F ; Fullwidth
+ea ; H ; Halfwidth
+ea ; N ; Neutral
+ea ; Na ; Narrow
+ea ; W ; Wide
+
+# Expands_On_NFC (XO_NFC)
+
+XO_NFC; N ; No ; F ; False
+XO_NFC; Y ; Yes ; T ; True
+
+# Expands_On_NFD (XO_NFD)
+
+XO_NFD; N ; No ; F ; False
+XO_NFD; Y ; Yes ; T ; True
+
+# Expands_On_NFKC (XO_NFKC)
+
+XO_NFKC; N ; No ; F ; False
+XO_NFKC; Y ; Yes ; T ; True
+
+# Expands_On_NFKD (XO_NFKD)
+
+XO_NFKD; N ; No ; F ; False
+XO_NFKD; Y ; Yes ; T ; True
+
+# Extender (Ext)
+
+Ext; N ; No ; F ; False
+Ext; Y ; Yes ; T ; True
+
+# FC_NFKC_Closure (FC_NFKC)
+
+# @missing: 0000..10FFFF; FC_NFKC_Closure; <code point>
+
+# Full_Composition_Exclusion (Comp_Ex)
+
+Comp_Ex; N ; No ; F ; False
+Comp_Ex; Y ; Yes ; T ; True
+
+# General_Category (gc)
+
+gc ; C ; Other # Cc | Cf | Cn | Co | Cs
+gc ; Cc ; Control ; cntrl
+gc ; Cf ; Format
+gc ; Cn ; Unassigned
+gc ; Co ; Private_Use
+gc ; Cs ; Surrogate
+gc ; L ; Letter # Ll | Lm | Lo | Lt | Lu
+gc ; LC ; Cased_Letter # Ll | Lt | Lu
+gc ; Ll ; Lowercase_Letter
+gc ; Lm ; Modifier_Letter
+gc ; Lo ; Other_Letter
+gc ; Lt ; Titlecase_Letter
+gc ; Lu ; Uppercase_Letter
+gc ; M ; Mark # Mc | Me | Mn
+gc ; Mc ; Spacing_Mark
+gc ; Me ; Enclosing_Mark
+gc ; Mn ; Nonspacing_Mark
+gc ; N ; Number # Nd | Nl | No
+gc ; Nd ; Decimal_Number ; digit
+gc ; Nl ; Letter_Number
+gc ; No ; Other_Number
+gc ; P ; Punctuation ; punct # Pc | Pd | Pe | Pf | Pi | Po | Ps
+gc ; Pc ; Connector_Punctuation
+gc ; Pd ; Dash_Punctuation
+gc ; Pe ; Close_Punctuation
+gc ; Pf ; Final_Punctuation
+gc ; Pi ; Initial_Punctuation
+gc ; Po ; Other_Punctuation
+gc ; Ps ; Open_Punctuation
+gc ; S ; Symbol # Sc | Sk | Sm | So
+gc ; Sc ; Currency_Symbol
+gc ; Sk ; Modifier_Symbol
+gc ; Sm ; Math_Symbol
+gc ; So ; Other_Symbol
+gc ; Z ; Separator # Zl | Zp | Zs
+gc ; Zl ; Line_Separator
+gc ; Zp ; Paragraph_Separator
+gc ; Zs ; Space_Separator
+
+# Grapheme_Base (Gr_Base)
+
+Gr_Base; N ; No ; F ; False
+Gr_Base; Y ; Yes ; T ; True
+
+# Grapheme_Cluster_Break (GCB)
+
+GCB; CN ; Control
+GCB; CR ; CR
+GCB; EX ; Extend
+GCB; L ; L
+GCB; LF ; LF
+GCB; LV ; LV
+GCB; LVT ; LVT
+GCB; PP ; Prepend
+GCB; SM ; SpacingMark
+GCB; T ; T
+GCB; V ; V
+GCB; XX ; Other
+
+# Grapheme_Extend (Gr_Ext)
+
+Gr_Ext; N ; No ; F ; False
+Gr_Ext; Y ; Yes ; T ; True
+
+# Grapheme_Link (Gr_Link)
+
+Gr_Link; N ; No ; F ; False
+Gr_Link; Y ; Yes ; T ; True
+
+# Hangul_Syllable_Type (hst)
+
+hst; L ; Leading_Jamo
+hst; LV ; LV_Syllable
+hst; LVT ; LVT_Syllable
+hst; NA ; Not_Applicable
+hst; T ; Trailing_Jamo
+hst; V ; Vowel_Jamo
+
+# Hex_Digit (Hex)
+
+Hex; N ; No ; F ; False
+Hex; Y ; Yes ; T ; True
+
+# Hyphen (Hyphen)
+
+Hyphen; N ; No ; F ; False
+Hyphen; Y ; Yes ; T ; True
+
+# IDS_Binary_Operator (IDSB)
+
+IDSB; N ; No ; F ; False
+IDSB; Y ; Yes ; T ; True
+
+# IDS_Trinary_Operator (IDST)
+
+IDST; N ; No ; F ; False
+IDST; Y ; Yes ; T ; True
+
+# ID_Continue (IDC)
+
+IDC; N ; No ; F ; False
+IDC; Y ; Yes ; T ; True
+
+# ID_Start (IDS)
+
+IDS; N ; No ; F ; False
+IDS; Y ; Yes ; T ; True
+
+# ISO_Comment (isc)
+
+# @missing: 0000..10FFFF; ISO_Comment; <none>
+
+# Ideographic (Ideo)
+
+Ideo; N ; No ; F ; False
+Ideo; Y ; Yes ; T ; True
+
+# Jamo_Short_Name (JSN)
+
+# @missing: 0000..10FFFF; Jamo_Short_Name; <none>
+JSN; A ; A
+JSN; AE ; AE
+JSN; B ; B
+JSN; BB ; BB
+JSN; BS ; BS
+JSN; C ; C
+JSN; D ; D
+JSN; DD ; DD
+JSN; E ; E
+JSN; EO ; EO
+JSN; EU ; EU
+JSN; G ; G
+JSN; GG ; GG
+JSN; GS ; GS
+JSN; H ; H
+JSN; I ; I
+JSN; J ; J
+JSN; JJ ; JJ
+JSN; K ; K
+JSN; L ; L
+JSN; LB ; LB
+JSN; LG ; LG
+JSN; LH ; LH
+JSN; LM ; LM
+JSN; LP ; LP
+JSN; LS ; LS
+JSN; LT ; LT
+JSN; M ; M
+JSN; N ; N
+JSN; NG ; NG
+JSN; NH ; NH
+JSN; NJ ; NJ
+JSN; O ; O
+JSN; OE ; OE
+JSN; P ; P
+JSN; R ; R
+JSN; S ; S
+JSN; SS ; SS
+JSN; T ; T
+JSN; U ; U
+JSN; WA ; WA
+JSN; WAE ; WAE
+JSN; WE ; WE
+JSN; WEO ; WEO
+JSN; WI ; WI
+JSN; YA ; YA
+JSN; YAE ; YAE
+JSN; YE ; YE
+JSN; YEO ; YEO
+JSN; YI ; YI
+JSN; YO ; YO
+JSN; YU ; YU
+
+# Join_Control (Join_C)
+
+Join_C; N ; No ; F ; False
+Join_C; Y ; Yes ; T ; True
+
+# Joining_Group (jg)
+
+jg ; n/a ; Ain
+jg ; n/a ; Alaph
+jg ; n/a ; Alef
+jg ; n/a ; Beh
+jg ; n/a ; Beth
+jg ; n/a ; Burushaski_Yeh_Barree
+jg ; n/a ; Dal
+jg ; n/a ; Dalath_Rish
+jg ; n/a ; E
+jg ; n/a ; Fe
+jg ; n/a ; Feh
+jg ; n/a ; Final_Semkath
+jg ; n/a ; Gaf
+jg ; n/a ; Gamal
+jg ; n/a ; Hah
+jg ; n/a ; Hamza_On_Heh_Goal
+jg ; n/a ; He
+jg ; n/a ; Heh
+jg ; n/a ; Heh_Goal
+jg ; n/a ; Heth
+jg ; n/a ; Kaf
+jg ; n/a ; Kaph
+jg ; n/a ; Khaph
+jg ; n/a ; Knotted_Heh
+jg ; n/a ; Lam
+jg ; n/a ; Lamadh
+jg ; n/a ; Meem
+jg ; n/a ; Mim
+jg ; n/a ; No_Joining_Group
+jg ; n/a ; Noon
+jg ; n/a ; Nun
+jg ; n/a ; Pe
+jg ; n/a ; Qaf
+jg ; n/a ; Qaph
+jg ; n/a ; Reh
+jg ; n/a ; Reversed_Pe
+jg ; n/a ; Sad
+jg ; n/a ; Sadhe
+jg ; n/a ; Seen
+jg ; n/a ; Semkath
+jg ; n/a ; Shin
+jg ; n/a ; Swash_Kaf
+jg ; n/a ; Syriac_Waw
+jg ; n/a ; Tah
+jg ; n/a ; Taw
+jg ; n/a ; Teh_Marbuta
+jg ; n/a ; Teth
+jg ; n/a ; Waw
+jg ; n/a ; Yeh
+jg ; n/a ; Yeh_Barree
+jg ; n/a ; Yeh_With_Tail
+jg ; n/a ; Yudh
+jg ; n/a ; Yudh_He
+jg ; n/a ; Zain
+jg ; n/a ; Zhain
+
+# Joining_Type (jt)
+
+jt ; C ; Join_Causing
+jt ; D ; Dual_Joining
+jt ; L ; Left_Joining
+jt ; R ; Right_Joining
+jt ; T ; Transparent
+jt ; U ; Non_Joining
+
+# Line_Break (lb)
+
+lb ; AI ; Ambiguous
+lb ; AL ; Alphabetic
+lb ; B2 ; Break_Both
+lb ; BA ; Break_After
+lb ; BB ; Break_Before
+lb ; BK ; Mandatory_Break
+lb ; CB ; Contingent_Break
+lb ; CL ; Close_Punctuation
+lb ; CM ; Combining_Mark
+lb ; CR ; Carriage_Return
+lb ; EX ; Exclamation
+lb ; GL ; Glue
+lb ; H2 ; H2
+lb ; H3 ; H3
+lb ; HY ; Hyphen
+lb ; ID ; Ideographic
+lb ; IN ; Inseparable ; Inseperable
+lb ; IS ; Infix_Numeric
+lb ; JL ; JL
+lb ; JT ; JT
+lb ; JV ; JV
+lb ; LF ; Line_Feed
+lb ; NL ; Next_Line
+lb ; NS ; Nonstarter
+lb ; NU ; Numeric
+lb ; OP ; Open_Punctuation
+lb ; PO ; Postfix_Numeric
+lb ; PR ; Prefix_Numeric
+lb ; QU ; Quotation
+lb ; SA ; Complex_Context
+lb ; SG ; Surrogate
+lb ; SP ; Space
+lb ; SY ; Break_Symbols
+lb ; WJ ; Word_Joiner
+lb ; XX ; Unknown
+lb ; ZW ; ZWSpace
+
+# Logical_Order_Exception (LOE)
+
+LOE; N ; No ; F ; False
+LOE; Y ; Yes ; T ; True
+
+# Lowercase (Lower)
+
+Lower; N ; No ; F ; False
+Lower; Y ; Yes ; T ; True
+
+# Lowercase_Mapping (lc)
+
+# @missing: 0000..10FFFF; Lowercase_Mapping; <code point>
+
+# Math (Math)
+
+Math; N ; No ; F ; False
+Math; Y ; Yes ; T ; True
+
+# NFC_Quick_Check (NFC_QC)
+
+NFC_QC; M ; Maybe
+NFC_QC; N ; No
+NFC_QC; Y ; Yes
+
+# NFD_Quick_Check (NFD_QC)
+
+NFD_QC; N ; No
+NFD_QC; Y ; Yes
+
+# NFKC_Quick_Check (NFKC_QC)
+
+NFKC_QC; M ; Maybe
+NFKC_QC; N ; No
+NFKC_QC; Y ; Yes
+
+# NFKD_Quick_Check (NFKD_QC)
+
+NFKD_QC; N ; No
+NFKD_QC; Y ; Yes
+
+# Name (na)
+
+# @missing: 0000..10FFFF; Name; <none>
+
+# Noncharacter_Code_Point (NChar)
+
+NChar; N ; No ; F ; False
+NChar; Y ; Yes ; T ; True
+
+# Numeric_Type (nt)
+
+nt ; De ; Decimal
+nt ; Di ; Digit
+nt ; None ; None
+nt ; Nu ; Numeric
+
+# Numeric_Value (nv)
+
+# @missing: 0000..10FFFF; Numeric_Value; NaN
+
+# Other_Alphabetic (OAlpha)
+
+OAlpha; N ; No ; F ; False
+OAlpha; Y ; Yes ; T ; True
+
+# Other_Default_Ignorable_Code_Point (ODI)
+
+ODI; N ; No ; F ; False
+ODI; Y ; Yes ; T ; True
+
+# Other_Grapheme_Extend (OGr_Ext)
+
+OGr_Ext; N ; No ; F ; False
+OGr_Ext; Y ; Yes ; T ; True
+
+# Other_ID_Continue (OIDC)
+
+OIDC; N ; No ; F ; False
+OIDC; Y ; Yes ; T ; True
+
+# Other_ID_Start (OIDS)
+
+OIDS; N ; No ; F ; False
+OIDS; Y ; Yes ; T ; True
+
+# Other_Lowercase (OLower)
+
+OLower; N ; No ; F ; False
+OLower; Y ; Yes ; T ; True
+
+# Other_Math (OMath)
+
+OMath; N ; No ; F ; False
+OMath; Y ; Yes ; T ; True
+
+# Other_Uppercase (OUpper)
+
+OUpper; N ; No ; F ; False
+OUpper; Y ; Yes ; T ; True
+
+# Pattern_Syntax (Pat_Syn)
+
+Pat_Syn; N ; No ; F ; False
+Pat_Syn; Y ; Yes ; T ; True
+
+# Pattern_White_Space (Pat_WS)
+
+Pat_WS; N ; No ; F ; False
+Pat_WS; Y ; Yes ; T ; True
+
+# Quotation_Mark (QMark)
+
+QMark; N ; No ; F ; False
+QMark; Y ; Yes ; T ; True
+
+# Radical (Radical)
+
+Radical; N ; No ; F ; False
+Radical; Y ; Yes ; T ; True
+
+# STerm (STerm)
+
+STerm; N ; No ; F ; False
+STerm; Y ; Yes ; T ; True
+
+# Script (sc)
+
+sc ; Arab ; Arabic
+sc ; Armn ; Armenian
+sc ; Bali ; Balinese
+sc ; Beng ; Bengali
+sc ; Bopo ; Bopomofo
+sc ; Brai ; Braille
+sc ; Bugi ; Buginese
+sc ; Buhd ; Buhid
+sc ; Cans ; Canadian_Aboriginal
+sc ; Cari ; Carian
+sc ; Cham ; Cham
+sc ; Cher ; Cherokee
+sc ; Copt ; Coptic ; Qaac
+sc ; Cprt ; Cypriot
+sc ; Cyrl ; Cyrillic
+sc ; Deva ; Devanagari
+sc ; Dsrt ; Deseret
+sc ; Ethi ; Ethiopic
+sc ; Geor ; Georgian
+sc ; Glag ; Glagolitic
+sc ; Goth ; Gothic
+sc ; Grek ; Greek
+sc ; Gujr ; Gujarati
+sc ; Guru ; Gurmukhi
+sc ; Hang ; Hangul
+sc ; Hani ; Han
+sc ; Hano ; Hanunoo
+sc ; Hebr ; Hebrew
+sc ; Hira ; Hiragana
+sc ; Hrkt ; Katakana_Or_Hiragana
+sc ; Ital ; Old_Italic
+sc ; Kali ; Kayah_Li
+sc ; Kana ; Katakana
+sc ; Khar ; Kharoshthi
+sc ; Khmr ; Khmer
+sc ; Knda ; Kannada
+sc ; Laoo ; Lao
+sc ; Latn ; Latin
+sc ; Lepc ; Lepcha
+sc ; Limb ; Limbu
+sc ; Linb ; Linear_B
+sc ; Lyci ; Lycian
+sc ; Lydi ; Lydian
+sc ; Mlym ; Malayalam
+sc ; Mong ; Mongolian
+sc ; Mymr ; Myanmar
+sc ; Nkoo ; Nko
+sc ; Ogam ; Ogham
+sc ; Olck ; Ol_Chiki
+sc ; Orya ; Oriya
+sc ; Osma ; Osmanya
+sc ; Phag ; Phags_Pa
+sc ; Phnx ; Phoenician
+sc ; Qaai ; Inherited
+sc ; Rjng ; Rejang
+sc ; Runr ; Runic
+sc ; Saur ; Saurashtra
+sc ; Shaw ; Shavian
+sc ; Sinh ; Sinhala
+sc ; Sund ; Sundanese
+sc ; Sylo ; Syloti_Nagri
+sc ; Syrc ; Syriac
+sc ; Tagb ; Tagbanwa
+sc ; Tale ; Tai_Le
+sc ; Talu ; New_Tai_Lue
+sc ; Taml ; Tamil
+sc ; Telu ; Telugu
+sc ; Tfng ; Tifinagh
+sc ; Tglg ; Tagalog
+sc ; Thaa ; Thaana
+sc ; Thai ; Thai
+sc ; Tibt ; Tibetan
+sc ; Ugar ; Ugaritic
+sc ; Vaii ; Vai
+sc ; Xpeo ; Old_Persian
+sc ; Xsux ; Cuneiform
+sc ; Yiii ; Yi
+sc ; Zyyy ; Common
+sc ; Zzzz ; Unknown
+
+# Sentence_Break (SB)
+
+SB ; AT ; ATerm
+SB ; CL ; Close
+SB ; CR ; CR
+SB ; EX ; Extend
+SB ; FO ; Format
+SB ; LE ; OLetter
+SB ; LF ; LF
+SB ; LO ; Lower
+SB ; NU ; Numeric
+SB ; SC ; SContinue
+SB ; SE ; Sep
+SB ; SP ; Sp
+SB ; ST ; STerm
+SB ; UP ; Upper
+SB ; XX ; Other
+
+# Simple_Case_Folding (scf)
+
+# @missing: 0000..10FFFF; Simple_Case_Folding; <code point>
+
+# Simple_Lowercase_Mapping (slc)
+
+# @missing: 0000..10FFFF; Simple_Lowercase_Mapping; <code point>
+
+# Simple_Titlecase_Mapping (stc)
+
+# @missing: 0000..10FFFF; Simple_Titlecase_Mapping; <code point>
+
+# Simple_Uppercase_Mapping (suc)
+
+# @missing: 0000..10FFFF; Simple_Uppercase_Mapping; <code point>
+
+# Soft_Dotted (SD)
+
+SD ; N ; No ; F ; False
+SD ; Y ; Yes ; T ; True
+
+# Terminal_Punctuation (Term)
+
+Term; N ; No ; F ; False
+Term; Y ; Yes ; T ; True
+
+# Titlecase_Mapping (tc)
+
+# @missing: 0000..10FFFF; Titlecase_Mapping; <code point>
+
+# Unicode_1_Name (na1)
+
+# @missing: 0000..10FFFF; Unicode_1_Name; <none>
+
+# Unicode_Radical_Stroke (URS)
+
+# @missing: 0000..10FFFF; Unicode_Radical_Stroke; <none>
+
+# Unified_Ideograph (UIdeo)
+
+UIdeo; N ; No ; F ; False
+UIdeo; Y ; Yes ; T ; True
+
+# Uppercase (Upper)
+
+Upper; N ; No ; F ; False
+Upper; Y ; Yes ; T ; True
+
+# Uppercase_Mapping (uc)
+
+# @missing: 0000..10FFFF; Uppercase_Mapping; <code point>
+
+# Variation_Selector (VS)
+
+VS ; N ; No ; F ; False
+VS ; Y ; Yes ; T ; True
+
+# White_Space (WSpace)
+
+WSpace; N ; No ; F ; False
+WSpace; Y ; Yes ; T ; True
+
+# Word_Break (WB)
+
+WB ; CR ; CR
+WB ; EX ; ExtendNumLet
+WB ; Extend ; Extend
+WB ; FO ; Format
+WB ; KA ; Katakana
+WB ; LE ; ALetter
+WB ; LF ; LF
+WB ; MB ; MidNumLet
+WB ; ML ; MidLetter
+WB ; MN ; MidNum
+WB ; NL ; Newline
+WB ; NU ; Numeric
+WB ; XX ; Other
+
+# XID_Continue (XIDC)
+
+XIDC; N ; No ; F ; False
+XIDC; Y ; Yes ; T ; True
+
+# XID_Start (XIDS)
+
+XIDS; N ; No ; F ; False
+XIDS; Y ; Yes ; T ; True
+
+# EOF
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/Properties b/Master/tlpkg/tlperl.straw/lib/unicore/Properties
new file mode 100755
index 00000000000..32df706f793
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/Properties
@@ -0,0 +1,407 @@
+##
+## This file created by mktables
+## List of built-in \p{...}/\P{...} properties.
+##
+## '*' means name may be 'fuzzy'
+##
+
+ \p{ASCII} [[:ASCII:]]
+ \p{Alnum} [[:Alnum:]]
+* \p{Alphabetic} [\p{L}\p{Nl}\p{OtherAlphabetic}]
+ \p{Alpha} [[:Alpha:]]
+ \p{Any} Alias for \p{Any} ([\x{0000}-\x{10FFFF}])
+ \p{Any} [\x{0000}-\x{10FFFF}]
+* \p{Arabic} Script 'Arabic'
+* \p{Armenian} Script 'Armenian'
+* \p{AsciiHexDigit} Extended property 'ASCII_Hex_Digit'
+ \p{Assigned} All assigned code points
+* \p{Balinese} Script 'Balinese'
+* \p{Bengali} Script 'Bengali'
+* \p{BidiControl} Extended property 'Bidi_Control'
+ \p{Blank} [[:Blank:]]
+* \p{Bopomofo} Script 'Bopomofo'
+* \p{Braille} Script 'Braille'
+* \p{Buginese} Script 'Buginese'
+* \p{Buhid} Script 'Buhid'
+* \p{CanadianAboriginal} Script 'Canadian_Aboriginal'
+* \p{Carian} Script 'Carian'
+* \p{Cc} Alias for \p{Cc} (General Category 'Cc')
+ \p{Cc} General Category 'Cc'
+* \p{Cf} Alias for \p{Cf} (General Category 'Cf')
+ \p{Cf} General Category 'Cf'
+* \p{Cham} Script 'Cham'
+* \p{Cherokee} Script 'Cherokee'
+ \p{Cntrl} [[:Cntrl:]]
+* \p{Cn} Alias for \p{Cn} (General Category 'Cn' [not functional in Perl])
+ \p{Cn} General Category 'Cn' [not functional in Perl]
+* \p{Common} Script 'Common'
+* \p{Coptic} Script 'Coptic'
+* \p{Co} Alias for \p{Co} (General Category 'Co')
+ \p{Co} General Category 'Co'
+* \p{Cs} Alias for \p{Cs} (General Category 'Cs')
+ \p{Cs} General Category 'Cs'
+* \p{Cuneiform} Script 'Cuneiform'
+* \p{Cypriot} Script 'Cypriot'
+* \p{Cyrillic} Script 'Cyrillic'
+* \p{C} Alias for \p{C} (Major Category 'C')
+ \p{C} Major Category 'C'
+* \p{Dash} Extended property 'Dash'
+* \p{DefaultIgnorableCodePoint} (?![\p{WhiteSpace}\x{FFF9}-\x{FFFB}])[\p{Cf}\p{Cc}\p{Cs}\p{NoncharacterCodePoint}\p{VariationSelector}\p{OtherDefaultIgnorableCodePoint}]
+* \p{Deprecated} Extended property 'Deprecated'
+* \p{Deseret} Script 'Deseret'
+* \p{Devanagari} Script 'Devanagari'
+* \p{Diacritic} Extended property 'Diacritic'
+ \p{Digit} [[:Digit:]]
+* \p{Ethiopic} Script 'Ethiopic'
+* \p{Extender} Extended property 'Extender'
+* \p{Georgian} Script 'Georgian'
+* \p{Glagolitic} Script 'Glagolitic'
+* \p{Gothic} Script 'Gothic'
+ \p{Graph} [[:Graph:]]
+* \p{Greek} Script 'Greek'
+* \p{Gujarati} Script 'Gujarati'
+* \p{Gurmukhi} Script 'Gurmukhi'
+* \p{Hangul} Script 'Hangul'
+* \p{Hanunoo} Script 'Hanunoo'
+* \p{Han} Script 'Han'
+* \p{Hebrew} Script 'Hebrew'
+* \p{HexDigit} Extended property 'Hex_Digit'
+* \p{Hiragana} Script 'Hiragana'
+ \p{HorizSpace} \h
+* \p{Hyphen} Extended property 'Hyphen'
+* \p{IdContinue} [\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\p{OtherIDContinue}]
+* \p{IdStart} [\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{Nl}\p{OtherIDStart}]
+* \p{Ideographic} Extended property 'Ideographic'
+* \p{IdsBinaryOperator} Extended property 'IDS_Binary_Operator'
+* \p{IdsTrinaryOperator} Extended property 'IDS_Trinary_Operator'
+* \p{InAegeanNumbers} Block 'Aegean Numbers'
+* \p{InAlphabeticPresentationForms} Block 'Alphabetic Presentation Forms'
+* \p{InAncientGreekMusicalNotation} Block 'Ancient Greek Musical Notation'
+* \p{InAncientGreekNumbers} Block 'Ancient Greek Numbers'
+* \p{InAncientSymbols} Block 'Ancient Symbols'
+* \p{InArabicPresentationFormsA} Block 'Arabic Presentation Forms-A'
+* \p{InArabicPresentationFormsB} Block 'Arabic Presentation Forms-B'
+* \p{InArabicSupplement} Block 'Arabic Supplement'
+* \p{InArabic} Block 'Arabic'
+* \p{InArmenian} Block 'Armenian'
+* \p{InArrows} Block 'Arrows'
+* \p{InBalinese} Block 'Balinese'
+* \p{InBasicLatin} Block 'Basic Latin'
+* \p{InBengali} Block 'Bengali'
+* \p{InBlockElements} Block 'Block Elements'
+* \p{InBopomofoExtended} Block 'Bopomofo Extended'
+* \p{InBopomofo} Block 'Bopomofo'
+* \p{InBoxDrawing} Block 'Box Drawing'
+* \p{InBraillePatterns} Block 'Braille Patterns'
+* \p{InBuginese} Block 'Buginese'
+* \p{InBuhid} Block 'Buhid'
+* \p{InByzantineMusicalSymbols} Block 'Byzantine Musical Symbols'
+* \p{InCarian} Block 'Carian'
+* \p{InCham} Block 'Cham'
+* \p{InCherokee} Block 'Cherokee'
+* \p{InCjkCompatibilityForms} Block 'CJK Compatibility Forms'
+* \p{InCjkCompatibilityIdeographsSupplement} Block 'CJK Compatibility Ideographs Supplement'
+* \p{InCjkCompatibilityIdeographs} Block 'CJK Compatibility Ideographs'
+* \p{InCjkCompatibility} Block 'CJK Compatibility'
+* \p{InCjkRadicalsSupplement} Block 'CJK Radicals Supplement'
+* \p{InCjkStrokes} Block 'CJK Strokes'
+* \p{InCjkSymbolsAndPunctuation} Block 'CJK Symbols and Punctuation'
+* \p{InCjkUnifiedIdeographsExtensionA} Block 'CJK Unified Ideographs Extension A'
+* \p{InCjkUnifiedIdeographsExtensionB} Block 'CJK Unified Ideographs Extension B'
+* \p{InCjkUnifiedIdeographs} Block 'CJK Unified Ideographs'
+* \p{InCombiningDiacriticalMarksForSymbols} Block 'Combining Diacritical Marks for Symbols'
+* \p{InCombiningDiacriticalMarksSupplement} Block 'Combining Diacritical Marks Supplement'
+* \p{InCombiningDiacriticalMarks} Block 'Combining Diacritical Marks'
+* \p{InCombiningHalfMarks} Block 'Combining Half Marks'
+* \p{InControlPictures} Block 'Control Pictures'
+* \p{InCoptic} Block 'Coptic'
+* \p{InCountingRodNumerals} Block 'Counting Rod Numerals'
+* \p{InCuneiformNumbersAndPunctuation} Block 'Cuneiform Numbers and Punctuation'
+* \p{InCuneiform} Block 'Cuneiform'
+* \p{InCurrencySymbols} Block 'Currency Symbols'
+* \p{InCypriotSyllabary} Block 'Cypriot Syllabary'
+* \p{InCyrillicExtendedA} Block 'Cyrillic Extended-A'
+* \p{InCyrillicExtendedB} Block 'Cyrillic Extended-B'
+* \p{InCyrillicSupplement} Block 'Cyrillic Supplement'
+* \p{InCyrillic} Block 'Cyrillic'
+* \p{InDeseret} Block 'Deseret'
+* \p{InDevanagari} Block 'Devanagari'
+* \p{InDingbats} Block 'Dingbats'
+* \p{InDominoTiles} Block 'Domino Tiles'
+* \p{InEnclosedAlphanumerics} Block 'Enclosed Alphanumerics'
+* \p{InEnclosedCjkLettersAndMonths} Block 'Enclosed CJK Letters and Months'
+* \p{InEthiopicExtended} Block 'Ethiopic Extended'
+* \p{InEthiopicSupplement} Block 'Ethiopic Supplement'
+* \p{InEthiopic} Block 'Ethiopic'
+* \p{InGeneralPunctuation} Block 'General Punctuation'
+* \p{InGeometricShapes} Block 'Geometric Shapes'
+* \p{InGeorgianSupplement} Block 'Georgian Supplement'
+* \p{InGeorgian} Block 'Georgian'
+* \p{InGlagolitic} Block 'Glagolitic'
+* \p{InGothic} Block 'Gothic'
+* \p{InGreekAndCoptic} Block 'Greek and Coptic'
+* \p{InGreekExtended} Block 'Greek Extended'
+* \p{InGujarati} Block 'Gujarati'
+* \p{InGurmukhi} Block 'Gurmukhi'
+* \p{InHalfwidthAndFullwidthForms} Block 'Halfwidth and Fullwidth Forms'
+* \p{InHangulCompatibilityJamo} Block 'Hangul Compatibility Jamo'
+* \p{InHangulJamo} Block 'Hangul Jamo'
+* \p{InHangulSyllables} Block 'Hangul Syllables'
+* \p{InHanunoo} Block 'Hanunoo'
+* \p{InHebrew} Block 'Hebrew'
+* \p{InHighPrivateUseSurrogates} Block 'High Private Use Surrogates'
+* \p{InHighSurrogates} Block 'High Surrogates'
+* \p{InHiragana} Block 'Hiragana'
+* \p{InIdeographicDescriptionCharacters} Block 'Ideographic Description Characters'
+* \p{InIpaExtensions} Block 'IPA Extensions'
+* \p{InKanbun} Block 'Kanbun'
+* \p{InKangxiRadicals} Block 'Kangxi Radicals'
+* \p{InKannada} Block 'Kannada'
+* \p{InKatakanaPhoneticExtensions} Block 'Katakana Phonetic Extensions'
+* \p{InKatakana} Block 'Katakana'
+* \p{InKayahLi} Block 'Kayah Li'
+* \p{InKharoshthi} Block 'Kharoshthi'
+* \p{InKhmerSymbols} Block 'Khmer Symbols'
+* \p{InKhmer} Block 'Khmer'
+* \p{InLao} Block 'Lao'
+* \p{InLatin1Supplement} Block 'Latin-1 Supplement'
+* \p{InLatinExtendedAdditional} Block 'Latin Extended Additional'
+* \p{InLatinExtendedA} Block 'Latin Extended-A'
+* \p{InLatinExtendedB} Block 'Latin Extended-B'
+* \p{InLatinExtendedC} Block 'Latin Extended-C'
+* \p{InLatinExtendedD} Block 'Latin Extended-D'
+* \p{InLepcha} Block 'Lepcha'
+* \p{InLetterlikeSymbols} Block 'Letterlike Symbols'
+* \p{InLimbu} Block 'Limbu'
+* \p{InLinearBIdeograms} Block 'Linear B Ideograms'
+* \p{InLinearBSyllabary} Block 'Linear B Syllabary'
+* \p{InLowSurrogates} Block 'Low Surrogates'
+* \p{InLycian} Block 'Lycian'
+* \p{InLydian} Block 'Lydian'
+* \p{InMahjongTiles} Block 'Mahjong Tiles'
+* \p{InMalayalam} Block 'Malayalam'
+* \p{InMathematicalAlphanumericSymbols} Block 'Mathematical Alphanumeric Symbols'
+* \p{InMathematicalOperators} Block 'Mathematical Operators'
+* \p{InMiscellaneousMathematicalSymbolsA} Block 'Miscellaneous Mathematical Symbols-A'
+* \p{InMiscellaneousMathematicalSymbolsB} Block 'Miscellaneous Mathematical Symbols-B'
+* \p{InMiscellaneousSymbolsAndArrows} Block 'Miscellaneous Symbols and Arrows'
+* \p{InMiscellaneousSymbols} Block 'Miscellaneous Symbols'
+* \p{InMiscellaneousTechnical} Block 'Miscellaneous Technical'
+* \p{InModifierToneLetters} Block 'Modifier Tone Letters'
+* \p{InMongolian} Block 'Mongolian'
+* \p{InMusicalSymbols} Block 'Musical Symbols'
+* \p{InMyanmar} Block 'Myanmar'
+* \p{InNewTaiLue} Block 'New Tai Lue'
+* \p{InNko} Block 'NKo'
+* \p{InNumberForms} Block 'Number Forms'
+* \p{InOgham} Block 'Ogham'
+* \p{InOlChiki} Block 'Ol Chiki'
+* \p{InOldItalic} Block 'Old Italic'
+* \p{InOldPersian} Block 'Old Persian'
+* \p{InOpticalCharacterRecognition} Block 'Optical Character Recognition'
+* \p{InOriya} Block 'Oriya'
+* \p{InOsmanya} Block 'Osmanya'
+* \p{InPhagsPa} Block 'Phags-pa'
+* \p{InPhaistosDisc} Block 'Phaistos Disc'
+* \p{InPhoenician} Block 'Phoenician'
+* \p{InPhoneticExtensionsSupplement} Block 'Phonetic Extensions Supplement'
+* \p{InPhoneticExtensions} Block 'Phonetic Extensions'
+* \p{InPrivateUseArea} Block 'Private Use Area'
+* \p{InRejang} Block 'Rejang'
+* \p{InRunic} Block 'Runic'
+* \p{InSaurashtra} Block 'Saurashtra'
+* \p{InShavian} Block 'Shavian'
+* \p{InSinhala} Block 'Sinhala'
+* \p{InSmallFormVariants} Block 'Small Form Variants'
+* \p{InSpacingModifierLetters} Block 'Spacing Modifier Letters'
+* \p{InSpecials} Block 'Specials'
+* \p{InSundanese} Block 'Sundanese'
+* \p{InSuperscriptsAndSubscripts} Block 'Superscripts and Subscripts'
+* \p{InSupplementalArrowsA} Block 'Supplemental Arrows-A'
+* \p{InSupplementalArrowsB} Block 'Supplemental Arrows-B'
+* \p{InSupplementalMathematicalOperators} Block 'Supplemental Mathematical Operators'
+* \p{InSupplementalPunctuation} Block 'Supplemental Punctuation'
+* \p{InSupplementaryPrivateUseAreaA} Block 'Supplementary Private Use Area-A'
+* \p{InSupplementaryPrivateUseAreaB} Block 'Supplementary Private Use Area-B'
+* \p{InSylotiNagri} Block 'Syloti Nagri'
+* \p{InSyriac} Block 'Syriac'
+* \p{InTagalog} Block 'Tagalog'
+* \p{InTagbanwa} Block 'Tagbanwa'
+* \p{InTags} Block 'Tags'
+* \p{InTaiLe} Block 'Tai Le'
+* \p{InTaiXuanJingSymbols} Block 'Tai Xuan Jing Symbols'
+* \p{InTamil} Block 'Tamil'
+* \p{InTelugu} Block 'Telugu'
+* \p{InThaana} Block 'Thaana'
+* \p{InThai} Block 'Thai'
+* \p{InTibetan} Block 'Tibetan'
+* \p{InTifinagh} Block 'Tifinagh'
+* \p{InUgaritic} Block 'Ugaritic'
+* \p{InUnifiedCanadianAboriginalSyllabics} Block 'Unified Canadian Aboriginal Syllabics'
+* \p{InVai} Block 'Vai'
+* \p{InVariationSelectorsSupplement} Block 'Variation Selectors Supplement'
+* \p{InVariationSelectors} Block 'Variation Selectors'
+* \p{InVerticalForms} Block 'Vertical Forms'
+* \p{InYiRadicals} Block 'Yi Radicals'
+* \p{InYiSyllables} Block 'Yi Syllables'
+* \p{InYijingHexagramSymbols} Block 'Yijing Hexagram Symbols'
+* \p{Inherited} Script 'Inherited'
+* \p{JoinControl} Extended property 'Join_Control'
+* \p{Kannada} Script 'Kannada'
+* \p{Katakana} Script 'Katakana'
+* \p{KayahLi} Script 'Kayah_Li'
+* \p{Kharoshthi} Script 'Kharoshthi'
+* \p{Khmer} Script 'Khmer'
+* \p{LC} Alias for \p{LC} ([\p{Ll}\p{Lu}\p{Lt}])
+ \p{LC} [\p{Ll}\p{Lu}\p{Lt}]
+* \p{Lao} Script 'Lao'
+* \p{Latin} Script 'Latin'
+* \p{Lepcha} Script 'Lepcha'
+* \p{Limbu} Script 'Limbu'
+* \p{LinearB} Script 'Linear_B'
+* \p{Ll} Alias for \p{Ll} (General Category 'Ll')
+ \p{Ll} General Category 'Ll'
+* \p{Lm} Alias for \p{Lm} (General Category 'Lm')
+ \p{Lm} General Category 'Lm'
+* \p{LogicalOrderException} Extended property 'Logical_Order_Exception'
+* \p{Lowercase} [\p{Ll}\p{OtherLowercase}]
+ \p{Lower} [[:Lower:]]
+* \p{Lo} Alias for \p{Lo} (General Category 'Lo')
+ \p{Lo} General Category 'Lo'
+* \p{Lt} Alias for \p{Lt} (General Category 'Lt')
+ \p{Lt} General Category 'Lt'
+* \p{Lu} Alias for \p{Lu} (General Category 'Lu')
+ \p{Lu} General Category 'Lu'
+* \p{Lycian} Script 'Lycian'
+* \p{Lydian} Script 'Lydian'
+* \p{L} Alias for \p{L} (Major Category 'L')
+ \p{L} Major Category 'L'
+* \p{Malayalam} Script 'Malayalam'
+* \p{Math} [\p{Sm}\p{OtherMath}]
+* \p{Mc} Alias for \p{Mc} (General Category 'Mc')
+ \p{Mc} General Category 'Mc'
+* \p{Me} Alias for \p{Me} (General Category 'Me')
+ \p{Me} General Category 'Me'
+* \p{Mn} Alias for \p{Mn} (General Category 'Mn')
+ \p{Mn} General Category 'Mn'
+* \p{Mongolian} Script 'Mongolian'
+* \p{Myanmar} Script 'Myanmar'
+* \p{M} Alias for \p{M} (Major Category 'M')
+ \p{M} Major Category 'M'
+* \p{Nd} Alias for \p{Nd} (General Category 'Nd')
+ \p{Nd} General Category 'Nd'
+* \p{NewTaiLue} Script 'New_Tai_Lue'
+* \p{Nko} Script 'Nko'
+* \p{Nl} Alias for \p{Nl} (General Category 'Nl')
+ \p{Nl} General Category 'Nl'
+* \p{NoncharacterCodePoint} Extended property 'Noncharacter_Code_Point'
+* \p{No} Alias for \p{No} (General Category 'No')
+ \p{No} General Category 'No'
+* \p{N} Alias for \p{N} (Major Category 'N')
+ \p{N} Major Category 'N'
+* \p{Ogham} Script 'Ogham'
+* \p{OlChiki} Script 'Ol_Chiki'
+* \p{OldItalic} Script 'Old_Italic'
+* \p{OldPersian} Script 'Old_Persian'
+* \p{Oriya} Script 'Oriya'
+* \p{Osmanya} Script 'Osmanya'
+* \p{OtherAlphabetic} Extended property 'Other_Alphabetic'
+* \p{OtherDefaultIgnorableCodePoint} Extended property 'Other_Default_Ignorable_Code_Point'
+* \p{OtherGraphemeExtend} Extended property 'Other_Grapheme_Extend'
+* \p{OtherIdContinue} Extended property 'Other_ID_Continue'
+* \p{OtherIdStart} Extended property 'Other_ID_Start'
+* \p{OtherLowercase} Extended property 'Other_Lowercase'
+* \p{OtherMath} Extended property 'Other_Math'
+* \p{OtherUppercase} Extended property 'Other_Uppercase'
+* \p{PatternSyntax} Extended property 'Pattern_Syntax'
+* \p{PatternWhiteSpace} Extended property 'Pattern_White_Space'
+* \p{Pc} Alias for \p{Pc} (General Category 'Pc')
+ \p{Pc} General Category 'Pc'
+* \p{Pd} Alias for \p{Pd} (General Category 'Pd')
+ \p{Pd} General Category 'Pd'
+ \p{PerlSpace}
+ \p{PerlWord}
+* \p{Pe} Alias for \p{Pe} (General Category 'Pe')
+ \p{Pe} General Category 'Pe'
+* \p{Pf} Alias for \p{Pf} (General Category 'Pf')
+ \p{Pf} General Category 'Pf'
+* \p{PhagsPa} Script 'Phags_Pa'
+* \p{Phoenician} Script 'Phoenician'
+* \p{Pi} Alias for \p{Pi} (General Category 'Pi')
+ \p{Pi} General Category 'Pi'
+ \p{PosixAlnum}
+ \p{PosixAlpha}
+ \p{PosixBlank}
+ \p{PosixCntrl}
+ \p{PosixDigit}
+ \p{PosixGraph}
+ \p{PosixLower}
+ \p{PosixPrint}
+ \p{PosixPunct}
+ \p{PosixSpace}
+ \p{PosixUpper}
+* \p{Po} Alias for \p{Po} (General Category 'Po')
+ \p{Po} General Category 'Po'
+ \p{Print} [[:Print:]]
+* \p{Ps} Alias for \p{Ps} (General Category 'Ps')
+ \p{Ps} General Category 'Ps'
+ \p{Punct} [[:Punct:]]
+* \p{P} Alias for \p{P} (Major Category 'P')
+ \p{P} Major Category 'P'
+* \p{QuotationMark} Extended property 'Quotation_Mark'
+* \p{Radical} Extended property 'Radical'
+* \p{Rejang} Script 'Rejang'
+* \p{Runic} Script 'Runic'
+* \p{Saurashtra} Script 'Saurashtra'
+* \p{Sc} Alias for \p{Sc} (General Category 'Sc')
+ \p{Sc} General Category 'Sc'
+* \p{Shavian} Script 'Shavian'
+* \p{Sinhala} Script 'Sinhala'
+* \p{Sk} Alias for \p{Sk} (General Category 'Sk')
+ \p{Sk} General Category 'Sk'
+* \p{Sm} Alias for \p{Sm} (General Category 'Sm')
+ \p{Sm} General Category 'Sm'
+* \p{SoftDotted} Extended property 'Soft_Dotted'
+* \p{So} Alias for \p{So} (General Category 'So')
+ \p{So} General Category 'So'
+ \p{SpacePerl} \s
+ \p{Space} [[:Space:]]
+* \p{Sterm} Extended property 'STerm'
+* \p{Sundanese} Script 'Sundanese'
+* \p{SylotiNagri} Script 'Syloti_Nagri'
+* \p{Syriac} Script 'Syriac'
+* \p{S} Alias for \p{S} (Major Category 'S')
+ \p{S} Major Category 'S'
+* \p{Tagalog} Script 'Tagalog'
+* \p{Tagbanwa} Script 'Tagbanwa'
+* \p{TaiLe} Script 'Tai_Le'
+* \p{Tamil} Script 'Tamil'
+* \p{Telugu} Script 'Telugu'
+* \p{TerminalPunctuation} Extended property 'Terminal_Punctuation'
+* \p{Thaana} Script 'Thaana'
+* \p{Thai} Script 'Thai'
+* \p{Tibetan} Script 'Tibetan'
+* \p{Tifinagh} Script 'Tifinagh'
+ \p{Title} [[:Title:]]
+* \p{Ugaritic} Script 'Ugaritic'
+* \p{UnifiedIdeograph} Extended property 'Unified_Ideograph'
+* \p{Uppercase} [\p{Lu}\p{OtherUppercase}]
+ \p{Upper} [[:Upper:]]
+* \p{Vai} Script 'Vai'
+* \p{VariationSelector} Extended property 'Variation_Selector'
+ \p{VertSpace} \v
+* \p{WhiteSpace} Extended property 'White_Space'
+ \p{Word} [[:Word:]]
+ \p{XDigit} [[:XDigit:]]
+* \p{Yi} Script 'Yi'
+* \p{Zl} Alias for \p{Zl} (General Category 'Zl')
+ \p{Zl} General Category 'Zl'
+* \p{Zp} Alias for \p{Zp} (General Category 'Zp')
+ \p{Zp} General Category 'Zp'
+* \p{Zs} Alias for \p{Zs} (General Category 'Zs')
+ \p{Zs} General Category 'Zs'
+* \p{Z} Alias for \p{Z} (Major Category 'Z')
+ \p{Z} Major Category 'Z'
+ \p{_CanonDCIJ} (for internal casefolding use)
+ \p{_CaseIgnorable} (for internal casefolding use)
+ \p{_CombAbove} (for internal casefolding use)
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/PropertyAliases.txt b/Master/tlpkg/tlperl.straw/lib/unicore/PropertyAliases.txt
new file mode 100755
index 00000000000..7fcb13f915e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/PropertyAliases.txt
@@ -0,0 +1,165 @@
+# PropertyAliases-5.1.0.txt
+# Date: 2008-02-28, 12:28:00 PST [KW]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# This file contains aliases for properties used in the UCD.
+# These names can be used for XML formats of UCD data, for regular-expression
+# property tests, and other programmatic textual descriptions of Unicode data.
+# For information on which properties are normative, see UCD.html.
+#
+# The names may be translated in appropriate environments, and additional
+# aliases may be useful.
+#
+# FORMAT
+#
+# Each line has two or more fields, separated by semicolons.
+#
+# First Field: The first field is an abbreviated name for the property.
+#
+# Second Field: The second field is a long name
+#
+# The above are the preferred aliases. Other aliases may be listed in additional fields.
+#
+# Loose matching should be applied to all property names and property values, with
+# the exception of String Property values. With loose matching of property names and
+# values, the case distinctions, whitespace, and '_' are ignored. For Numeric Property
+# values, numeric equivalencies are applied: thus "01.00" is equivalent to "1".
+#
+# NOTE: Property value names are NOT unique across properties. For example:
+#
+# AL means Arabic Letter for the Bidi_Class property, and
+# AL means Alpha_Left for the Combining_Class property, and
+# AL means Alphabetic for the Line_Break property.
+#
+# In addition, some property names may be the same as some property value names.
+# For example:
+#
+# sc means the Script property, and
+# Sc means the General_Category property value Currency_Symbol (Sc)
+#
+# The combination of property value and property name is, however, unique.
+#
+# For more information, see UTS #18: Regular Expression Guidelines
+# ================================================
+
+
+# ================================================
+# Numeric Properties
+# ================================================
+ccc ; Canonical_Combining_Class
+nv ; Numeric_Value
+
+# ================================================
+# String Properties
+# ================================================
+bmg ; Bidi_Mirroring_Glyph
+cf ; Case_Folding
+dm ; Decomposition_Mapping
+FC_NFKC ; FC_NFKC_Closure
+lc ; Lowercase_Mapping
+scf ; Simple_Case_Folding ; sfc
+slc ; Simple_Lowercase_Mapping
+stc ; Simple_Titlecase_Mapping
+suc ; Simple_Uppercase_Mapping
+tc ; Titlecase_Mapping
+uc ; Uppercase_Mapping
+
+# ================================================
+# Miscellaneous Properties
+# ================================================
+isc ; ISO_Comment
+JSN ; Jamo_Short_Name
+na ; Name
+na1 ; Unicode_1_Name
+URS ; Unicode_Radical_Stroke
+
+# ================================================
+# Catalog Properties
+# ================================================
+age ; Age
+blk ; Block
+sc ; Script
+
+# ================================================
+# Enumerated Properties
+# ================================================
+bc ; Bidi_Class
+dt ; Decomposition_Type
+ea ; East_Asian_Width
+gc ; General_Category
+GCB ; Grapheme_Cluster_Break
+hst ; Hangul_Syllable_Type
+jg ; Joining_Group
+jt ; Joining_Type
+lb ; Line_Break
+NFC_QC ; NFC_Quick_Check
+NFD_QC ; NFD_Quick_Check
+NFKC_QC ; NFKC_Quick_Check
+NFKD_QC ; NFKD_Quick_Check
+nt ; Numeric_Type
+SB ; Sentence_Break
+WB ; Word_Break
+
+# ================================================
+# Binary Properties
+# ================================================
+AHex ; ASCII_Hex_Digit
+Alpha ; Alphabetic
+Bidi_C ; Bidi_Control
+Bidi_M ; Bidi_Mirrored
+CE ; Composition_Exclusion
+Comp_Ex ; Full_Composition_Exclusion
+Dash ; Dash
+Dep ; Deprecated
+DI ; Default_Ignorable_Code_Point
+Dia ; Diacritic
+Ext ; Extender
+Gr_Base ; Grapheme_Base
+Gr_Ext ; Grapheme_Extend
+Gr_Link ; Grapheme_Link
+Hex ; Hex_Digit
+Hyphen ; Hyphen
+IDC ; ID_Continue
+Ideo ; Ideographic
+IDS ; ID_Start
+IDSB ; IDS_Binary_Operator
+IDST ; IDS_Trinary_Operator
+Join_C ; Join_Control
+LOE ; Logical_Order_Exception
+Lower ; Lowercase
+Math ; Math
+NChar ; Noncharacter_Code_Point
+OAlpha ; Other_Alphabetic
+ODI ; Other_Default_Ignorable_Code_Point
+OGr_Ext ; Other_Grapheme_Extend
+OIDC ; Other_ID_Continue
+OIDS ; Other_ID_Start
+OLower ; Other_Lowercase
+OMath ; Other_Math
+OUpper ; Other_Uppercase
+Pat_Syn ; Pattern_Syntax
+Pat_WS ; Pattern_White_Space
+QMark ; Quotation_Mark
+Radical ; Radical
+SD ; Soft_Dotted
+STerm ; STerm
+Term ; Terminal_Punctuation
+UIdeo ; Unified_Ideograph
+Upper ; Uppercase
+VS ; Variation_Selector
+WSpace ; White_Space ; space
+XIDC ; XID_Continue
+XIDS ; XID_Start
+XO_NFC ; Expands_On_NFC
+XO_NFD ; Expands_On_NFD
+XO_NFKC ; Expands_On_NFKC
+XO_NFKD ; Expands_On_NFKD
+
+# ================================================
+# Total: 88
+
+# EOF
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/ReadMe.txt b/Master/tlpkg/tlperl.straw/lib/unicore/ReadMe.txt
new file mode 100755
index 00000000000..c02d2177f14
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/ReadMe.txt
@@ -0,0 +1,15 @@
+# Date: 2008-03-31, 13:48:00 PDT [KW]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# For documentation, see UCD.html, NamesList.html,
+# UAX #38, "Unicode Han Database (Unihan)," and
+# UAX #44, "Unicode Character Database."
+#
+
+This directory contains final contributory data files
+for the Unicode Character Database (UCD) for Unicode 5.1.0.
+
+
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/Scripts.txt b/Master/tlpkg/tlperl.straw/lib/unicore/Scripts.txt
new file mode 100755
index 00000000000..7065486d3a5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/Scripts.txt
@@ -0,0 +1,1747 @@
+# Scripts-5.1.0.txt
+# Date: 2008-03-20, 17:55:33 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+
+# ================================================
+
+# Property: Script
+
+# All code points not explicitly listed for Script
+# have the value Unknown (Zzzz).
+
+# @missing: 0000..10FFFF; Unknown
+
+# ================================================
+
+0000..001F ; Common # Cc [32] <control-0000>..<control-001F>
+0020 ; Common # Zs SPACE
+0021..0023 ; Common # Po [3] EXCLAMATION MARK..NUMBER SIGN
+0024 ; Common # Sc DOLLAR SIGN
+0025..0027 ; Common # Po [3] PERCENT SIGN..APOSTROPHE
+0028 ; Common # Ps LEFT PARENTHESIS
+0029 ; Common # Pe RIGHT PARENTHESIS
+002A ; Common # Po ASTERISK
+002B ; Common # Sm PLUS SIGN
+002C ; Common # Po COMMA
+002D ; Common # Pd HYPHEN-MINUS
+002E..002F ; Common # Po [2] FULL STOP..SOLIDUS
+0030..0039 ; Common # Nd [10] DIGIT ZERO..DIGIT NINE
+003A..003B ; Common # Po [2] COLON..SEMICOLON
+003C..003E ; Common # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN
+003F..0040 ; Common # Po [2] QUESTION MARK..COMMERCIAL AT
+005B ; Common # Ps LEFT SQUARE BRACKET
+005C ; Common # Po REVERSE SOLIDUS
+005D ; Common # Pe RIGHT SQUARE BRACKET
+005E ; Common # Sk CIRCUMFLEX ACCENT
+005F ; Common # Pc LOW LINE
+0060 ; Common # Sk GRAVE ACCENT
+007B ; Common # Ps LEFT CURLY BRACKET
+007C ; Common # Sm VERTICAL LINE
+007D ; Common # Pe RIGHT CURLY BRACKET
+007E ; Common # Sm TILDE
+007F..009F ; Common # Cc [33] <control-007F>..<control-009F>
+00A0 ; Common # Zs NO-BREAK SPACE
+00A1 ; Common # Po INVERTED EXCLAMATION MARK
+00A2..00A5 ; Common # Sc [4] CENT SIGN..YEN SIGN
+00A6..00A7 ; Common # So [2] BROKEN BAR..SECTION SIGN
+00A8 ; Common # Sk DIAERESIS
+00A9 ; Common # So COPYRIGHT SIGN
+00AB ; Common # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC ; Common # Sm NOT SIGN
+00AD ; Common # Cf SOFT HYPHEN
+00AE ; Common # So REGISTERED SIGN
+00AF ; Common # Sk MACRON
+00B0 ; Common # So DEGREE SIGN
+00B1 ; Common # Sm PLUS-MINUS SIGN
+00B2..00B3 ; Common # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE
+00B4 ; Common # Sk ACUTE ACCENT
+00B5 ; Common # L& MICRO SIGN
+00B6 ; Common # So PILCROW SIGN
+00B7 ; Common # Po MIDDLE DOT
+00B8 ; Common # Sk CEDILLA
+00B9 ; Common # No SUPERSCRIPT ONE
+00BB ; Common # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC..00BE ; Common # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS
+00BF ; Common # Po INVERTED QUESTION MARK
+00D7 ; Common # Sm MULTIPLICATION SIGN
+00F7 ; Common # Sm DIVISION SIGN
+02B9..02C1 ; Common # Lm [9] MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2..02C5 ; Common # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6..02D1 ; Common # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02D2..02DF ; Common # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
+02E5..02EB ; Common # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC ; Common # Lm MODIFIER LETTER VOICING
+02ED ; Common # Sk MODIFIER LETTER UNASPIRATED
+02EE ; Common # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+02EF..02FF ; Common # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+0374 ; Common # Lm GREEK NUMERAL SIGN
+037E ; Common # Po GREEK QUESTION MARK
+0385 ; Common # Sk GREEK DIALYTIKA TONOS
+0387 ; Common # Po GREEK ANO TELEIA
+0589 ; Common # Po ARMENIAN FULL STOP
+0600..0603 ; Common # Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA
+060C ; Common # Po ARABIC COMMA
+061B ; Common # Po ARABIC SEMICOLON
+061F ; Common # Po ARABIC QUESTION MARK
+0640 ; Common # Lm ARABIC TATWEEL
+0660..0669 ; Common # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE
+06DD ; Common # Cf ARABIC END OF AYAH
+0964..0965 ; Common # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+0970 ; Common # Po DEVANAGARI ABBREVIATION SIGN
+0CF1..0CF2 ; Common # So [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0E3F ; Common # Sc THAI CURRENCY SYMBOL BAHT
+10FB ; Common # Po GEORGIAN PARAGRAPH SEPARATOR
+16EB..16ED ; Common # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION
+1735..1736 ; Common # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION
+1802..1803 ; Common # Po [2] MONGOLIAN COMMA..MONGOLIAN FULL STOP
+1805 ; Common # Po MONGOLIAN FOUR DOTS
+2000..200A ; Common # Zs [11] EN QUAD..HAIR SPACE
+200B ; Common # Cf ZERO WIDTH SPACE
+200E..200F ; Common # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+2010..2015 ; Common # Pd [6] HYPHEN..HORIZONTAL BAR
+2016..2017 ; Common # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE
+2018 ; Common # Pi LEFT SINGLE QUOTATION MARK
+2019 ; Common # Pf RIGHT SINGLE QUOTATION MARK
+201A ; Common # Ps SINGLE LOW-9 QUOTATION MARK
+201B..201C ; Common # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D ; Common # Pf RIGHT DOUBLE QUOTATION MARK
+201E ; Common # Ps DOUBLE LOW-9 QUOTATION MARK
+201F ; Common # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020..2027 ; Common # Po [8] DAGGER..HYPHENATION POINT
+2028 ; Common # Zl LINE SEPARATOR
+2029 ; Common # Zp PARAGRAPH SEPARATOR
+202A..202E ; Common # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+202F ; Common # Zs NARROW NO-BREAK SPACE
+2030..2038 ; Common # Po [9] PER MILLE SIGN..CARET
+2039 ; Common # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; Common # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B..203E ; Common # Po [4] REFERENCE MARK..OVERLINE
+203F..2040 ; Common # Pc [2] UNDERTIE..CHARACTER TIE
+2041..2043 ; Common # Po [3] CARET INSERTION POINT..HYPHEN BULLET
+2044 ; Common # Sm FRACTION SLASH
+2045 ; Common # Ps LEFT SQUARE BRACKET WITH QUILL
+2046 ; Common # Pe RIGHT SQUARE BRACKET WITH QUILL
+2047..2051 ; Common # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY
+2052 ; Common # Sm COMMERCIAL MINUS SIGN
+2053 ; Common # Po SWUNG DASH
+2054 ; Common # Pc INVERTED UNDERTIE
+2055..205E ; Common # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS
+205F ; Common # Zs MEDIUM MATHEMATICAL SPACE
+2060..2064 ; Common # Cf [5] WORD JOINER..INVISIBLE PLUS
+206A..206F ; Common # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+2070 ; Common # No SUPERSCRIPT ZERO
+2074..2079 ; Common # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE
+207A..207C ; Common # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN
+207D ; Common # Ps SUPERSCRIPT LEFT PARENTHESIS
+207E ; Common # Pe SUPERSCRIPT RIGHT PARENTHESIS
+2080..2089 ; Common # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE
+208A..208C ; Common # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN
+208D ; Common # Ps SUBSCRIPT LEFT PARENTHESIS
+208E ; Common # Pe SUBSCRIPT RIGHT PARENTHESIS
+20A0..20B5 ; Common # Sc [22] EURO-CURRENCY SIGN..CEDI SIGN
+2100..2101 ; Common # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT
+2102 ; Common # L& DOUBLE-STRUCK CAPITAL C
+2103..2106 ; Common # So [4] DEGREE CELSIUS..CADA UNA
+2107 ; Common # L& EULER CONSTANT
+2108..2109 ; Common # So [2] SCRUPLE..DEGREE FAHRENHEIT
+210A..2113 ; Common # L& [10] SCRIPT SMALL G..SCRIPT SMALL L
+2114 ; Common # So L B BAR SYMBOL
+2115 ; Common # L& DOUBLE-STRUCK CAPITAL N
+2116..2118 ; Common # So [3] NUMERO SIGN..SCRIPT CAPITAL P
+2119..211D ; Common # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+211E..2123 ; Common # So [6] PRESCRIPTION TAKE..VERSICLE
+2124 ; Common # L& DOUBLE-STRUCK CAPITAL Z
+2125 ; Common # So OUNCE SIGN
+2127 ; Common # So INVERTED OHM SIGN
+2128 ; Common # L& BLACK-LETTER CAPITAL Z
+2129 ; Common # So TURNED GREEK SMALL LETTER IOTA
+212C..212D ; Common # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C
+212E ; Common # So ESTIMATED SYMBOL
+212F..2131 ; Common # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F
+2133..2134 ; Common # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O
+2135..2138 ; Common # Lo [4] ALEF SYMBOL..DALET SYMBOL
+2139 ; Common # L& INFORMATION SOURCE
+213A..213B ; Common # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN
+213C..213F ; Common # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2140..2144 ; Common # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y
+2145..2149 ; Common # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214A ; Common # So PROPERTY LINE
+214B ; Common # Sm TURNED AMPERSAND
+214C..214D ; Common # So [2] PER SIGN..AKTIESELSKAB
+214F ; Common # So SYMBOL FOR SAMARITAN SOURCE
+2153..215F ; Common # No [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE
+2190..2194 ; Common # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW
+2195..2199 ; Common # So [5] UP DOWN ARROW..SOUTH WEST ARROW
+219A..219B ; Common # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
+219C..219F ; Common # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A0 ; Common # Sm RIGHTWARDS TWO HEADED ARROW
+21A1..21A2 ; Common # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A3 ; Common # Sm RIGHTWARDS ARROW WITH TAIL
+21A4..21A5 ; Common # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A6 ; Common # Sm RIGHTWARDS ARROW FROM BAR
+21A7..21AD ; Common # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW
+21AE ; Common # Sm LEFT RIGHT ARROW WITH STROKE
+21AF..21CD ; Common # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE..21CF ; Common # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1 ; Common # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D2 ; Common # Sm RIGHTWARDS DOUBLE ARROW
+21D3 ; Common # So DOWNWARDS DOUBLE ARROW
+21D4 ; Common # Sm LEFT RIGHT DOUBLE ARROW
+21D5..21F3 ; Common # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW
+21F4..22FF ; Common # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP
+2300..2307 ; Common # So [8] DIAMETER SIGN..WAVY LINE
+2308..230B ; Common # Sm [4] LEFT CEILING..RIGHT FLOOR
+230C..231F ; Common # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER
+2320..2321 ; Common # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
+2322..2328 ; Common # So [7] FROWN..KEYBOARD
+2329 ; Common # Ps LEFT-POINTING ANGLE BRACKET
+232A ; Common # Pe RIGHT-POINTING ANGLE BRACKET
+232B..237B ; Common # So [81] ERASE TO THE LEFT..NOT CHECK MARK
+237C ; Common # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D..239A ; Common # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL
+239B..23B3 ; Common # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
+23B4..23DB ; Common # So [40] TOP SQUARE BRACKET..FUSE
+23DC..23E1 ; Common # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET
+23E2..23E7 ; Common # So [6] WHITE TRAPEZIUM..ELECTRICAL INTERSECTION
+2400..2426 ; Common # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO
+2440..244A ; Common # So [11] OCR HOOK..OCR DOUBLE BACKSLASH
+2460..249B ; Common # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP
+249C..24E9 ; Common # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+24EA..24FF ; Common # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO
+2500..25B6 ; Common # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE
+25B7 ; Common # Sm WHITE RIGHT-POINTING TRIANGLE
+25B8..25C0 ; Common # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C1 ; Common # Sm WHITE LEFT-POINTING TRIANGLE
+25C2..25F7 ; Common # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8..25FF ; Common # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
+2600..266E ; Common # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN
+266F ; Common # Sm MUSIC SHARP SIGN
+2670..269D ; Common # So [46] WEST SYRIAC CROSS..OUTLINED WHITE STAR
+26A0..26BC ; Common # So [29] WARNING SIGN..SESQUIQUADRATE
+26C0..26C3 ; Common # So [4] WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING
+2701..2704 ; Common # So [4] UPPER BLADE SCISSORS..WHITE SCISSORS
+2706..2709 ; Common # So [4] TELEPHONE LOCATION SIGN..ENVELOPE
+270C..2727 ; Common # So [28] VICTORY HAND..WHITE FOUR POINTED STAR
+2729..274B ; Common # So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D ; Common # So SHADOWED WHITE CIRCLE
+274F..2752 ; Common # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE
+2756 ; Common # So BLACK DIAMOND MINUS WHITE X
+2758..275E ; Common # So [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761..2767 ; Common # So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET
+2768 ; Common # Ps MEDIUM LEFT PARENTHESIS ORNAMENT
+2769 ; Common # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A ; Common # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B ; Common # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C ; Common # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D ; Common # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E ; Common # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F ; Common # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770 ; Common # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771 ; Common # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772 ; Common # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773 ; Common # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774 ; Common # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775 ; Common # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776..2793 ; Common # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794 ; Common # So HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798..27AF ; Common # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1..27BE ; Common # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW
+27C0..27C4 ; Common # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET
+27C5 ; Common # Ps LEFT S-SHAPED BAG DELIMITER
+27C6 ; Common # Pe RIGHT S-SHAPED BAG DELIMITER
+27C7..27CA ; Common # Sm [4] OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE
+27CC ; Common # Sm LONG DIVISION
+27D0..27E5 ; Common # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK
+27E6 ; Common # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 ; Common # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 ; Common # Ps MATHEMATICAL LEFT ANGLE BRACKET
+27E9 ; Common # Pe MATHEMATICAL RIGHT ANGLE BRACKET
+27EA ; Common # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB ; Common # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC ; Common # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED ; Common # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE ; Common # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF ; Common # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0..27FF ; Common # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
+2900..2982 ; Common # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON
+2983 ; Common # Ps LEFT WHITE CURLY BRACKET
+2984 ; Common # Pe RIGHT WHITE CURLY BRACKET
+2985 ; Common # Ps LEFT WHITE PARENTHESIS
+2986 ; Common # Pe RIGHT WHITE PARENTHESIS
+2987 ; Common # Ps Z NOTATION LEFT IMAGE BRACKET
+2988 ; Common # Pe Z NOTATION RIGHT IMAGE BRACKET
+2989 ; Common # Ps Z NOTATION LEFT BINDING BRACKET
+298A ; Common # Pe Z NOTATION RIGHT BINDING BRACKET
+298B ; Common # Ps LEFT SQUARE BRACKET WITH UNDERBAR
+298C ; Common # Pe RIGHT SQUARE BRACKET WITH UNDERBAR
+298D ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 ; Common # Ps LEFT ANGLE BRACKET WITH DOT
+2992 ; Common # Pe RIGHT ANGLE BRACKET WITH DOT
+2993 ; Common # Ps LEFT ARC LESS-THAN BRACKET
+2994 ; Common # Pe RIGHT ARC GREATER-THAN BRACKET
+2995 ; Common # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 ; Common # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 ; Common # Ps LEFT BLACK TORTOISE SHELL BRACKET
+2998 ; Common # Pe RIGHT BLACK TORTOISE SHELL BRACKET
+2999..29D7 ; Common # Sm [63] DOTTED FENCE..BLACK HOURGLASS
+29D8 ; Common # Ps LEFT WIGGLY FENCE
+29D9 ; Common # Pe RIGHT WIGGLY FENCE
+29DA ; Common # Ps LEFT DOUBLE WIGGLY FENCE
+29DB ; Common # Pe RIGHT DOUBLE WIGGLY FENCE
+29DC..29FB ; Common # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS
+29FC ; Common # Ps LEFT-POINTING CURVED ANGLE BRACKET
+29FD ; Common # Pe RIGHT-POINTING CURVED ANGLE BRACKET
+29FE..2AFF ; Common # Sm [258] TINY..N-ARY WHITE VERTICAL BAR
+2B00..2B2F ; Common # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE
+2B30..2B44 ; Common # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET
+2B45..2B46 ; Common # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW
+2B47..2B4C ; Common # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B50..2B54 ; Common # So [5] WHITE MEDIUM STAR..WHITE RIGHT-POINTING PENTAGON
+2E00..2E01 ; Common # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02 ; Common # Pi LEFT SUBSTITUTION BRACKET
+2E03 ; Common # Pf RIGHT SUBSTITUTION BRACKET
+2E04 ; Common # Pi LEFT DOTTED SUBSTITUTION BRACKET
+2E05 ; Common # Pf RIGHT DOTTED SUBSTITUTION BRACKET
+2E06..2E08 ; Common # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER
+2E09 ; Common # Pi LEFT TRANSPOSITION BRACKET
+2E0A ; Common # Pf RIGHT TRANSPOSITION BRACKET
+2E0B ; Common # Po RAISED SQUARE
+2E0C ; Common # Pi LEFT RAISED OMISSION BRACKET
+2E0D ; Common # Pf RIGHT RAISED OMISSION BRACKET
+2E0E..2E16 ; Common # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE
+2E17 ; Common # Pd DOUBLE OBLIQUE HYPHEN
+2E18..2E19 ; Common # Po [2] INVERTED INTERROBANG..PALM BRANCH
+2E1A ; Common # Pd HYPHEN WITH DIAERESIS
+2E1B ; Common # Po TILDE WITH RING ABOVE
+2E1C ; Common # Pi LEFT LOW PARAPHRASE BRACKET
+2E1D ; Common # Pf RIGHT LOW PARAPHRASE BRACKET
+2E1E..2E1F ; Common # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW
+2E20 ; Common # Pi LEFT VERTICAL BAR WITH QUILL
+2E21 ; Common # Pf RIGHT VERTICAL BAR WITH QUILL
+2E22 ; Common # Ps TOP LEFT HALF BRACKET
+2E23 ; Common # Pe TOP RIGHT HALF BRACKET
+2E24 ; Common # Ps BOTTOM LEFT HALF BRACKET
+2E25 ; Common # Pe BOTTOM RIGHT HALF BRACKET
+2E26 ; Common # Ps LEFT SIDEWAYS U BRACKET
+2E27 ; Common # Pe RIGHT SIDEWAYS U BRACKET
+2E28 ; Common # Ps LEFT DOUBLE PARENTHESIS
+2E29 ; Common # Pe RIGHT DOUBLE PARENTHESIS
+2E2A..2E2E ; Common # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK
+2E2F ; Common # Lm VERTICAL TILDE
+2E30 ; Common # Po RING POINT
+2FF0..2FFB ; Common # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000 ; Common # Zs IDEOGRAPHIC SPACE
+3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
+3004 ; Common # So JAPANESE INDUSTRIAL STANDARD SYMBOL
+3006 ; Common # Lo IDEOGRAPHIC CLOSING MARK
+3008 ; Common # Ps LEFT ANGLE BRACKET
+3009 ; Common # Pe RIGHT ANGLE BRACKET
+300A ; Common # Ps LEFT DOUBLE ANGLE BRACKET
+300B ; Common # Pe RIGHT DOUBLE ANGLE BRACKET
+300C ; Common # Ps LEFT CORNER BRACKET
+300D ; Common # Pe RIGHT CORNER BRACKET
+300E ; Common # Ps LEFT WHITE CORNER BRACKET
+300F ; Common # Pe RIGHT WHITE CORNER BRACKET
+3010 ; Common # Ps LEFT BLACK LENTICULAR BRACKET
+3011 ; Common # Pe RIGHT BLACK LENTICULAR BRACKET
+3012..3013 ; Common # So [2] POSTAL MARK..GETA MARK
+3014 ; Common # Ps LEFT TORTOISE SHELL BRACKET
+3015 ; Common # Pe RIGHT TORTOISE SHELL BRACKET
+3016 ; Common # Ps LEFT WHITE LENTICULAR BRACKET
+3017 ; Common # Pe RIGHT WHITE LENTICULAR BRACKET
+3018 ; Common # Ps LEFT WHITE TORTOISE SHELL BRACKET
+3019 ; Common # Pe RIGHT WHITE TORTOISE SHELL BRACKET
+301A ; Common # Ps LEFT WHITE SQUARE BRACKET
+301B ; Common # Pe RIGHT WHITE SQUARE BRACKET
+301C ; Common # Pd WAVE DASH
+301D ; Common # Ps REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F ; Common # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+3020 ; Common # So POSTAL MARK FACE
+3030 ; Common # Pd WAVY DASH
+3031..3035 ; Common # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+3036..3037 ; Common # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+303C ; Common # Lo MASU MARK
+303D ; Common # Po PART ALTERNATION MARK
+303E..303F ; Common # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE
+309B..309C ; Common # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30A0 ; Common # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN
+30FB ; Common # Po KATAKANA MIDDLE DOT
+30FC ; Common # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK
+3190..3191 ; Common # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192..3195 ; Common # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK
+3196..319F ; Common # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK
+31C0..31E3 ; Common # So [36] CJK STROKE T..CJK STROKE Q
+3220..3229 ; Common # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN
+322A..3243 ; Common # So [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH
+3250 ; Common # So PARTNERSHIP SIGN
+3251..325F ; Common # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE
+327F ; Common # So KOREAN STANDARD SYMBOL
+3280..3289 ; Common # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN
+328A..32B0 ; Common # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT
+32B1..32BF ; Common # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY
+32C0..32CF ; Common # So [16] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..LIMITED LIABILITY SIGN
+3358..33FF ; Common # So [168] IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO..SQUARE GAL
+4DC0..4DFF ; Common # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION
+A700..A716 ; Common # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717..A71F ; Common # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720..A721 ; Common # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE
+A788 ; Common # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A789..A78A ; Common # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN
+FD3E ; Common # Ps ORNATE LEFT PARENTHESIS
+FD3F ; Common # Pe ORNATE RIGHT PARENTHESIS
+FDFD ; Common # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE10..FE16 ; Common # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK
+FE17 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+FE18 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+FE19 ; Common # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE30 ; Common # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31..FE32 ; Common # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
+FE33..FE34 ; Common # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45..FE46 ; Common # Po [2] SESAME DOT..WHITE SESAME DOT
+FE47 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49..FE4C ; Common # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE
+FE4D..FE4F ; Common # Pc [3] DASHED LOW LINE..WAVY LOW LINE
+FE50..FE52 ; Common # Po [3] SMALL COMMA..SMALL FULL STOP
+FE54..FE57 ; Common # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK
+FE58 ; Common # Pd SMALL EM DASH
+FE59 ; Common # Ps SMALL LEFT PARENTHESIS
+FE5A ; Common # Pe SMALL RIGHT PARENTHESIS
+FE5B ; Common # Ps SMALL LEFT CURLY BRACKET
+FE5C ; Common # Pe SMALL RIGHT CURLY BRACKET
+FE5D ; Common # Ps SMALL LEFT TORTOISE SHELL BRACKET
+FE5E ; Common # Pe SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F..FE61 ; Common # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK
+FE62 ; Common # Sm SMALL PLUS SIGN
+FE63 ; Common # Pd SMALL HYPHEN-MINUS
+FE64..FE66 ; Common # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN
+FE68 ; Common # Po SMALL REVERSE SOLIDUS
+FE69 ; Common # Sc SMALL DOLLAR SIGN
+FE6A..FE6B ; Common # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT
+FEFF ; Common # Cf ZERO WIDTH NO-BREAK SPACE
+FF01..FF03 ; Common # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN
+FF04 ; Common # Sc FULLWIDTH DOLLAR SIGN
+FF05..FF07 ; Common # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE
+FF08 ; Common # Ps FULLWIDTH LEFT PARENTHESIS
+FF09 ; Common # Pe FULLWIDTH RIGHT PARENTHESIS
+FF0A ; Common # Po FULLWIDTH ASTERISK
+FF0B ; Common # Sm FULLWIDTH PLUS SIGN
+FF0C ; Common # Po FULLWIDTH COMMA
+FF0D ; Common # Pd FULLWIDTH HYPHEN-MINUS
+FF0E..FF0F ; Common # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS
+FF10..FF19 ; Common # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+FF1A..FF1B ; Common # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON
+FF1C..FF1E ; Common # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN
+FF1F..FF20 ; Common # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT
+FF3B ; Common # Ps FULLWIDTH LEFT SQUARE BRACKET
+FF3C ; Common # Po FULLWIDTH REVERSE SOLIDUS
+FF3D ; Common # Pe FULLWIDTH RIGHT SQUARE BRACKET
+FF3E ; Common # Sk FULLWIDTH CIRCUMFLEX ACCENT
+FF3F ; Common # Pc FULLWIDTH LOW LINE
+FF40 ; Common # Sk FULLWIDTH GRAVE ACCENT
+FF5B ; Common # Ps FULLWIDTH LEFT CURLY BRACKET
+FF5C ; Common # Sm FULLWIDTH VERTICAL LINE
+FF5D ; Common # Pe FULLWIDTH RIGHT CURLY BRACKET
+FF5E ; Common # Sm FULLWIDTH TILDE
+FF5F ; Common # Ps FULLWIDTH LEFT WHITE PARENTHESIS
+FF60 ; Common # Pe FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61 ; Common # Po HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62 ; Common # Ps HALFWIDTH LEFT CORNER BRACKET
+FF63 ; Common # Pe HALFWIDTH RIGHT CORNER BRACKET
+FF64..FF65 ; Common # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT
+FF70 ; Common # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF9E..FF9F ; Common # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFE0..FFE1 ; Common # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN
+FFE2 ; Common # Sm FULLWIDTH NOT SIGN
+FFE3 ; Common # Sk FULLWIDTH MACRON
+FFE4 ; Common # So FULLWIDTH BROKEN BAR
+FFE5..FFE6 ; Common # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN
+FFE8 ; Common # So HALFWIDTH FORMS LIGHT VERTICAL
+FFE9..FFEC ; Common # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW
+FFED..FFEE ; Common # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
+FFF9..FFFB ; Common # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
+FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
+10100..10101 ; Common # Po [2] AEGEAN WORD SEPARATOR LINE..AEGEAN WORD SEPARATOR DOT
+10102 ; Common # So AEGEAN CHECK MARK
+10107..10133 ; Common # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND
+10137..1013F ; Common # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT
+10190..1019B ; Common # So [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN
+101D0..101FC ; Common # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND
+1D000..1D0F5 ; Common # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100..1D126 ; Common # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2
+1D129..1D164 ; Common # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D165..1D166 ; Common # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D16A..1D16C ; Common # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D..1D172 ; Common # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
+1D173..1D17A ; Common # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+1D183..1D184 ; Common # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN
+1D18C..1D1A9 ; Common # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH
+1D1AE..1D1DD ; Common # So [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS
+1D300..1D356 ; Common # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
+1D360..1D371 ; Common # No [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE
+1D400..1D454 ; Common # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; Common # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; Common # L& MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; Common # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; Common # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; Common # L& MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; Common # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; Common # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; Common # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; Common # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; Common # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; Common # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; Common # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; Common # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; Common # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; Common # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; Common # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; Common # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1 ; Common # Sm MATHEMATICAL BOLD NABLA
+1D6C2..1D6DA ; Common # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DB ; Common # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC..1D6FA ; Common # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB ; Common # Sm MATHEMATICAL ITALIC NABLA
+1D6FC..1D714 ; Common # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D715 ; Common # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716..1D734 ; Common # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735 ; Common # Sm MATHEMATICAL BOLD ITALIC NABLA
+1D736..1D74E ; Common # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F ; Common # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750..1D76E ; Common # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F ; Common # Sm MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770..1D788 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A..1D7A8 ; Common # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA..1D7C2 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4..1D7CB ; Common # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE..1D7FF ; Common # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+1F000..1F02B ; Common # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK
+1F030..1F093 ; Common # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
+E0001 ; Common # Cf LANGUAGE TAG
+E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG
+
+# Total code points: 5178
+
+# ================================================
+
+0041..005A ; Latin # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+0061..007A ; Latin # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00AA ; Latin # L& FEMININE ORDINAL INDICATOR
+00BA ; Latin # L& MASCULINE ORDINAL INDICATOR
+00C0..00D6 ; Latin # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00F6 ; Latin # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..01BA ; Latin # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BB ; Latin # Lo LATIN LETTER TWO WITH STROKE
+01BC..01BF ; Latin # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C0..01C3 ; Latin # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
+01C4..0293 ; Latin # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL
+0294 ; Latin # Lo LATIN LETTER GLOTTAL STOP
+0295..02AF ; Latin # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02B8 ; Latin # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
+02E0..02E4 ; Latin # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+1D00..1D25 ; Latin # L& [38] LATIN LETTER SMALL CAPITAL A..LATIN LETTER AIN
+1D2C..1D5C ; Latin # Lm [49] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL AIN
+1D62..1D65 ; Latin # L& [4] LATIN SUBSCRIPT SMALL LETTER I..LATIN SUBSCRIPT SMALL LETTER V
+1D6B..1D77 ; Latin # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G
+1D79..1D9A ; Latin # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBE ; Latin # Lm [36] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL EZH
+1E00..1EFF ; Latin # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP
+2071 ; Latin # L& SUPERSCRIPT LATIN SMALL LETTER I
+207F ; Latin # L& SUPERSCRIPT LATIN SMALL LETTER N
+2090..2094 ; Latin # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+212A..212B ; Latin # L& [2] KELVIN SIGN..ANGSTROM SIGN
+2132 ; Latin # L& TURNED CAPITAL F
+214E ; Latin # L& TURNED SMALL F
+2160..2182 ; Latin # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND
+2183..2184 ; Latin # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
+2185..2188 ; Latin # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND
+2C60..2C6F ; Latin # L& [16] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN CAPITAL LETTER TURNED A
+2C71..2C7C ; Latin # L& [12] LATIN SMALL LETTER V WITH RIGHT HOOK..LATIN SUBSCRIPT SMALL LETTER J
+2C7D ; Latin # Lm MODIFIER LETTER CAPITAL V
+A722..A76F ; Latin # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON
+A770 ; Latin # Lm MODIFIER LETTER US
+A771..A787 ; Latin # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
+A78B..A78C ; Latin # L& [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO
+A7FB..A7FF ; Latin # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M
+FB00..FB06 ; Latin # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FF21..FF3A ; Latin # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF41..FF5A ; Latin # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+
+# Total code points: 1241
+
+# ================================================
+
+0370..0373 ; Greek # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
+0375 ; Greek # Sk GREEK LOWER NUMERAL SIGN
+0376..0377 ; Greek # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A ; Greek # Lm GREEK YPOGEGRAMMENI
+037B..037D ; Greek # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0384 ; Greek # Sk GREEK TONOS
+0386 ; Greek # L& GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A ; Greek # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; Greek # L& GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1 ; Greek # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03E1 ; Greek # L& [63] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER SAMPI
+03F0..03F5 ; Greek # L& [6] GREEK KAPPA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+03F6 ; Greek # Sm GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7..03FF ; Greek # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+1D26..1D2A ; Greek # L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI
+1D5D..1D61 ; Greek # Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI
+1D66..1D6A ; Greek # L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI
+1DBF ; Greek # Lm MODIFIER LETTER SMALL THETA
+1F00..1F15 ; Greek # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D ; Greek # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45 ; Greek # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D ; Greek # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; Greek # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59 ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D ; Greek # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4 ; Greek # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC ; Greek # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD ; Greek # Sk GREEK KORONIS
+1FBE ; Greek # L& GREEK PROSGEGRAMMENI
+1FBF..1FC1 ; Greek # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
+1FC2..1FC4 ; Greek # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC ; Greek # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD..1FCF ; Greek # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
+1FD0..1FD3 ; Greek # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB ; Greek # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD..1FDF ; Greek # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FE0..1FEC ; Greek # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FED..1FEF ; Greek # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
+1FF2..1FF4 ; Greek # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC ; Greek # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD..1FFE ; Greek # Sk [2] GREEK OXIA..GREEK DASIA
+2126 ; Greek # L& OHM SIGN
+10140..10174 ; Greek # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175..10178 ; Greek # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN
+10179..10189 ; Greek # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN
+1018A ; Greek # No GREEK ZERO SIGN
+1D200..1D241 ; Greek # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242..1D244 ; Greek # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
+1D245 ; Greek # So GREEK MUSICAL LEIMMA
+
+# Total code points: 511
+
+# ================================================
+
+0400..0481 ; Cyrillic # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA
+0482 ; Cyrillic # So CYRILLIC THOUSANDS SIGN
+0483..0487 ; Cyrillic # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+0488..0489 ; Cyrillic # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
+048A..0523 ; Cyrillic # L& [154] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+1D2B ; Cyrillic # L& CYRILLIC LETTER SMALL CAPITAL EL
+1D78 ; Cyrillic # Lm MODIFIER LETTER CYRILLIC EN
+2DE0..2DFF ; Cyrillic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+A640..A65F ; Cyrillic # L& [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN
+A662..A66D ; Cyrillic # L& [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E ; Cyrillic # Lo CYRILLIC LETTER MULTIOCULAR O
+A66F ; Cyrillic # Mn COMBINING CYRILLIC VZMET
+A670..A672 ; Cyrillic # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A673 ; Cyrillic # Po SLAVONIC ASTERISK
+A67C..A67D ; Cyrillic # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK
+A67E ; Cyrillic # Po CYRILLIC KAVYKA
+A67F ; Cyrillic # Lm CYRILLIC PAYEROK
+A680..A697 ; Cyrillic # L& [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE
+
+# Total code points: 404
+
+# ================================================
+
+0531..0556 ; Armenian # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0559 ; Armenian # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A..055F ; Armenian # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
+0561..0587 ; Armenian # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+058A ; Armenian # Pd ARMENIAN HYPHEN
+FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+
+# Total code points: 90
+
+# ================================================
+
+0591..05BD ; Hebrew # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
+05BE ; Hebrew # Pd HEBREW PUNCTUATION MAQAF
+05BF ; Hebrew # Mn HEBREW POINT RAFE
+05C0 ; Hebrew # Po HEBREW PUNCTUATION PASEQ
+05C1..05C2 ; Hebrew # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C3 ; Hebrew # Po HEBREW PUNCTUATION SOF PASUQ
+05C4..05C5 ; Hebrew # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C6 ; Hebrew # Po HEBREW PUNCTUATION NUN HAFUKHA
+05C7 ; Hebrew # Mn HEBREW POINT QAMATS QATAN
+05D0..05EA ; Hebrew # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
+05F0..05F2 ; Hebrew # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3..05F4 ; Hebrew # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
+FB1D ; Hebrew # Lo HEBREW LETTER YOD WITH HIRIQ
+FB1E ; Hebrew # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F..FB28 ; Hebrew # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
+FB29 ; Hebrew # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A..FB36 ; Hebrew # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB38..FB3C ; Hebrew # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3E ; Hebrew # Lo HEBREW LETTER MEM WITH DAGESH
+FB40..FB41 ; Hebrew # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB43..FB44 ; Hebrew # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED
+
+# Total code points: 133
+
+# ================================================
+
+0606..0608 ; Arabic # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY
+0609..060A ; Arabic # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN
+060B ; Arabic # Sc AFGHANI SIGN
+060D ; Arabic # Po ARABIC DATE SEPARATOR
+060E..060F ; Arabic # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA
+0610..061A ; Arabic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+061E ; Arabic # Po ARABIC TRIPLE DOT PUNCTUATION MARK
+0621..063F ; Arabic # Lo [31] ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0641..064A ; Arabic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH
+0656..065E ; Arabic # Mn [9] ARABIC SUBSCRIPT ALEF..ARABIC FATHA WITH TWO DOTS
+066A..066D ; Arabic # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR
+066E..066F ; Arabic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0671..06D3 ; Arabic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4 ; Arabic # Po ARABIC FULL STOP
+06D5 ; Arabic # Lo ARABIC LETTER AE
+06D6..06DC ; Arabic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DE ; Arabic # Me ARABIC START OF RUB EL HIZB
+06DF..06E4 ; Arabic # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E5..06E6 ; Arabic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06E7..06E8 ; Arabic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06E9 ; Arabic # So ARABIC PLACE OF SAJDAH
+06EA..06ED ; Arabic # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+06EE..06EF ; Arabic # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+06F0..06F9 ; Arabic # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE
+06FA..06FC ; Arabic # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FD..06FE ; Arabic # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF ; Arabic # Lo ARABIC LETTER HEH WITH INVERTED V
+0750..077F ; Arabic # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE
+FB50..FBB1 ; Arabic # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3..FD3D ; Arabic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD50..FD8F ; Arabic # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92..FDC7 ; Arabic # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0..FDFB ; Arabic # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
+FDFC ; Arabic # Sc RIAL SIGN
+FE70..FE74 ; Arabic # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
+FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+
+# Total code points: 999
+
+# ================================================
+
+0700..070D ; Syriac # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS
+070F ; Syriac # Cf SYRIAC ABBREVIATION MARK
+0710 ; Syriac # Lo SYRIAC LETTER ALAPH
+0711 ; Syriac # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
+0712..072F ; Syriac # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
+0730..074A ; Syriac # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+074D..074F ; Syriac # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE
+
+# Total code points: 77
+
+# ================================================
+
+0780..07A5 ; Thaana # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU
+07A6..07B0 ; Thaana # Mn [11] THAANA ABAFILI..THAANA SUKUN
+07B1 ; Thaana # Lo THAANA LETTER NAA
+
+# Total code points: 50
+
+# ================================================
+
+0901..0902 ; Devanagari # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+0903 ; Devanagari # Mc DEVANAGARI SIGN VISARGA
+0904..0939 ; Devanagari # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
+093C ; Devanagari # Mn DEVANAGARI SIGN NUKTA
+093D ; Devanagari # Lo DEVANAGARI SIGN AVAGRAHA
+093E..0940 ; Devanagari # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0941..0948 ; Devanagari # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+0949..094C ; Devanagari # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+094D ; Devanagari # Mn DEVANAGARI SIGN VIRAMA
+0950 ; Devanagari # Lo DEVANAGARI OM
+0953..0954 ; Devanagari # Mn [2] DEVANAGARI GRAVE ACCENT..DEVANAGARI ACUTE ACCENT
+0958..0961 ; Devanagari # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
+0962..0963 ; Devanagari # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0966..096F ; Devanagari # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
+0971 ; Devanagari # Lm DEVANAGARI SIGN HIGH SPACING DOT
+0972 ; Devanagari # Lo DEVANAGARI LETTER CANDRA A
+097B..097F ; Devanagari # Lo [5] DEVANAGARI LETTER GGA..DEVANAGARI LETTER BBA
+
+# Total code points: 107
+
+# ================================================
+
+0981 ; Bengali # Mn BENGALI SIGN CANDRABINDU
+0982..0983 ; Bengali # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+0985..098C ; Bengali # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098F..0990 ; Bengali # Lo [2] BENGALI LETTER E..BENGALI LETTER AI
+0993..09A8 ; Bengali # Lo [22] BENGALI LETTER O..BENGALI LETTER NA
+09AA..09B0 ; Bengali # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA
+09B2 ; Bengali # Lo BENGALI LETTER LA
+09B6..09B9 ; Bengali # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA
+09BC ; Bengali # Mn BENGALI SIGN NUKTA
+09BD ; Bengali # Lo BENGALI SIGN AVAGRAHA
+09BE..09C0 ; Bengali # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
+09C1..09C4 ; Bengali # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09C7..09C8 ; Bengali # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC ; Bengali # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09CD ; Bengali # Mn BENGALI SIGN VIRAMA
+09CE ; Bengali # Lo BENGALI LETTER KHANDA TA
+09D7 ; Bengali # Mc BENGALI AU LENGTH MARK
+09DC..09DD ; Bengali # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF..09E1 ; Bengali # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
+09E2..09E3 ; Bengali # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+09E6..09EF ; Bengali # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE
+09F0..09F1 ; Bengali # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2..09F3 ; Bengali # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN
+09F4..09F9 ; Bengali # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA ; Bengali # So BENGALI ISSHAR
+
+# Total code points: 91
+
+# ================================================
+
+0A01..0A02 ; Gurmukhi # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A03 ; Gurmukhi # Mc GURMUKHI SIGN VISARGA
+0A05..0A0A ; Gurmukhi # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0F..0A10 ; Gurmukhi # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A13..0A28 ; Gurmukhi # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A2A..0A30 ; Gurmukhi # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A32..0A33 ; Gurmukhi # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
+0A35..0A36 ; Gurmukhi # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
+0A38..0A39 ; Gurmukhi # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A3C ; Gurmukhi # Mn GURMUKHI SIGN NUKTA
+0A3E..0A40 ; Gurmukhi # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A41..0A42 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D ; Gurmukhi # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A51 ; Gurmukhi # Mn GURMUKHI SIGN UDAAT
+0A59..0A5C ; Gurmukhi # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
+0A5E ; Gurmukhi # Lo GURMUKHI LETTER FA
+0A66..0A6F ; Gurmukhi # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE
+0A70..0A71 ; Gurmukhi # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A72..0A74 ; Gurmukhi # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
+0A75 ; Gurmukhi # Mn GURMUKHI SIGN YAKASH
+
+# Total code points: 79
+
+# ================================================
+
+0A81..0A82 ; Gujarati # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0A83 ; Gujarati # Mc GUJARATI SIGN VISARGA
+0A85..0A8D ; Gujarati # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8F..0A91 ; Gujarati # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A93..0AA8 ; Gujarati # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA
+0AAA..0AB0 ; Gujarati # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB2..0AB3 ; Gujarati # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB5..0AB9 ; Gujarati # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABC ; Gujarati # Mn GUJARATI SIGN NUKTA
+0ABD ; Gujarati # Lo GUJARATI SIGN AVAGRAHA
+0ABE..0AC0 ; Gujarati # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC1..0AC5 ; Gujarati # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0AC9 ; Gujarati # Mc GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC ; Gujarati # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0ACD ; Gujarati # Mn GUJARATI SIGN VIRAMA
+0AD0 ; Gujarati # Lo GUJARATI OM
+0AE0..0AE1 ; Gujarati # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0AE2..0AE3 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0AE6..0AEF ; Gujarati # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
+0AF1 ; Gujarati # Sc GUJARATI RUPEE SIGN
+
+# Total code points: 83
+
+# ================================================
+
+0B01 ; Oriya # Mn ORIYA SIGN CANDRABINDU
+0B02..0B03 ; Oriya # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B05..0B0C ; Oriya # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0F..0B10 ; Oriya # Lo [2] ORIYA LETTER E..ORIYA LETTER AI
+0B13..0B28 ; Oriya # Lo [22] ORIYA LETTER O..ORIYA LETTER NA
+0B2A..0B30 ; Oriya # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA
+0B32..0B33 ; Oriya # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA
+0B35..0B39 ; Oriya # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA
+0B3C ; Oriya # Mn ORIYA SIGN NUKTA
+0B3D ; Oriya # Lo ORIYA SIGN AVAGRAHA
+0B3E ; Oriya # Mc ORIYA VOWEL SIGN AA
+0B3F ; Oriya # Mn ORIYA VOWEL SIGN I
+0B40 ; Oriya # Mc ORIYA VOWEL SIGN II
+0B41..0B44 ; Oriya # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B47..0B48 ; Oriya # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C ; Oriya # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B4D ; Oriya # Mn ORIYA SIGN VIRAMA
+0B56 ; Oriya # Mn ORIYA AI LENGTH MARK
+0B57 ; Oriya # Mc ORIYA AU LENGTH MARK
+0B5C..0B5D ; Oriya # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5F..0B61 ; Oriya # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+0B62..0B63 ; Oriya # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B66..0B6F ; Oriya # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE
+0B70 ; Oriya # So ORIYA ISSHAR
+0B71 ; Oriya # Lo ORIYA LETTER WA
+
+# Total code points: 84
+
+# ================================================
+
+0B82 ; Tamil # Mn TAMIL SIGN ANUSVARA
+0B83 ; Tamil # Lo TAMIL SIGN VISARGA
+0B85..0B8A ; Tamil # Lo [6] TAMIL LETTER A..TAMIL LETTER UU
+0B8E..0B90 ; Tamil # Lo [3] TAMIL LETTER E..TAMIL LETTER AI
+0B92..0B95 ; Tamil # Lo [4] TAMIL LETTER O..TAMIL LETTER KA
+0B99..0B9A ; Tamil # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA
+0B9C ; Tamil # Lo TAMIL LETTER JA
+0B9E..0B9F ; Tamil # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA3..0BA4 ; Tamil # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA
+0BA8..0BAA ; Tamil # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA
+0BAE..0BB9 ; Tamil # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA
+0BBE..0BBF ; Tamil # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
+0BC0 ; Tamil # Mn TAMIL VOWEL SIGN II
+0BC1..0BC2 ; Tamil # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8 ; Tamil # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC ; Tamil # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BCD ; Tamil # Mn TAMIL SIGN VIRAMA
+0BD0 ; Tamil # Lo TAMIL OM
+0BD7 ; Tamil # Mc TAMIL AU LENGTH MARK
+0BE6..0BEF ; Tamil # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE
+0BF0..0BF2 ; Tamil # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND
+0BF3..0BF8 ; Tamil # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN
+0BF9 ; Tamil # Sc TAMIL RUPEE SIGN
+0BFA ; Tamil # So TAMIL NUMBER SIGN
+
+# Total code points: 72
+
+# ================================================
+
+0C01..0C03 ; Telugu # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C05..0C0C ; Telugu # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0E..0C10 ; Telugu # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
+0C12..0C28 ; Telugu # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
+0C2A..0C33 ; Telugu # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA
+0C35..0C39 ; Telugu # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA
+0C3D ; Telugu # Lo TELUGU SIGN AVAGRAHA
+0C3E..0C40 ; Telugu # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C41..0C44 ; Telugu # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C46..0C48 ; Telugu # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D ; Telugu # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56 ; Telugu # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C58..0C59 ; Telugu # Lo [2] TELUGU LETTER TSA..TELUGU LETTER DZA
+0C60..0C61 ; Telugu # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+0C62..0C63 ; Telugu # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0C66..0C6F ; Telugu # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE
+0C78..0C7E ; Telugu # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
+0C7F ; Telugu # So TELUGU SIGN TUUMU
+
+# Total code points: 93
+
+# ================================================
+
+0C82..0C83 ; Kannada # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0C85..0C8C ; Kannada # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8E..0C90 ; Kannada # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
+0C92..0CA8 ; Kannada # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
+0CAA..0CB3 ; Kannada # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA
+0CB5..0CB9 ; Kannada # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBC ; Kannada # Mn KANNADA SIGN NUKTA
+0CBD ; Kannada # Lo KANNADA SIGN AVAGRAHA
+0CBE ; Kannada # Mc KANNADA VOWEL SIGN AA
+0CBF ; Kannada # Mn KANNADA VOWEL SIGN I
+0CC0..0CC4 ; Kannada # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
+0CC6 ; Kannada # Mn KANNADA VOWEL SIGN E
+0CC7..0CC8 ; Kannada # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB ; Kannada # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CCC..0CCD ; Kannada # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0CD5..0CD6 ; Kannada # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CDE ; Kannada # Lo KANNADA LETTER FA
+0CE0..0CE1 ; Kannada # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+0CE2..0CE3 ; Kannada # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0CE6..0CEF ; Kannada # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
+
+# Total code points: 84
+
+# ================================================
+
+0D02..0D03 ; Malayalam # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D05..0D0C ; Malayalam # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0E..0D10 ; Malayalam # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D12..0D28 ; Malayalam # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
+0D2A..0D39 ; Malayalam # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
+0D3D ; Malayalam # Lo MALAYALAM SIGN AVAGRAHA
+0D3E..0D40 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
+0D41..0D44 ; Malayalam # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D46..0D48 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D4D ; Malayalam # Mn MALAYALAM SIGN VIRAMA
+0D57 ; Malayalam # Mc MALAYALAM AU LENGTH MARK
+0D60..0D61 ; Malayalam # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+0D62..0D63 ; Malayalam # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0D66..0D6F ; Malayalam # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE
+0D70..0D75 ; Malayalam # No [6] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS
+0D79 ; Malayalam # So MALAYALAM DATE MARK
+0D7A..0D7F ; Malayalam # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+
+# Total code points: 95
+
+# ================================================
+
+0D82..0D83 ; Sinhala # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0D85..0D96 ; Sinhala # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D9A..0DB1 ; Sinhala # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB3..0DBB ; Sinhala # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBD ; Sinhala # Lo SINHALA LETTER DANTAJA LAYANNA
+0DC0..0DC6 ; Sinhala # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0DCA ; Sinhala # Mn SINHALA SIGN AL-LAKUNA
+0DCF..0DD1 ; Sinhala # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2..0DD4 ; Sinhala # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; Sinhala # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8..0DDF ; Sinhala # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DF2..0DF3 ; Sinhala # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4 ; Sinhala # Po SINHALA PUNCTUATION KUNDDALIYA
+
+# Total code points: 80
+
+# ================================================
+
+0E01..0E30 ; Thai # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
+0E31 ; Thai # Mn THAI CHARACTER MAI HAN-AKAT
+0E32..0E33 ; Thai # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
+0E34..0E3A ; Thai # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E40..0E45 ; Thai # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
+0E46 ; Thai # Lm THAI CHARACTER MAIYAMOK
+0E47..0E4E ; Thai # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0E4F ; Thai # Po THAI CHARACTER FONGMAN
+0E50..0E59 ; Thai # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE
+0E5A..0E5B ; Thai # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
+
+# Total code points: 86
+
+# ================================================
+
+0E81..0E82 ; Lao # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG
+0E84 ; Lao # Lo LAO LETTER KHO TAM
+0E87..0E88 ; Lao # Lo [2] LAO LETTER NGO..LAO LETTER CO
+0E8A ; Lao # Lo LAO LETTER SO TAM
+0E8D ; Lao # Lo LAO LETTER NYO
+0E94..0E97 ; Lao # Lo [4] LAO LETTER DO..LAO LETTER THO TAM
+0E99..0E9F ; Lao # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG
+0EA1..0EA3 ; Lao # Lo [3] LAO LETTER MO..LAO LETTER LO LING
+0EA5 ; Lao # Lo LAO LETTER LO LOOT
+0EA7 ; Lao # Lo LAO LETTER WO
+0EAA..0EAB ; Lao # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAD..0EB0 ; Lao # Lo [4] LAO LETTER O..LAO VOWEL SIGN A
+0EB1 ; Lao # Mn LAO VOWEL SIGN MAI KAN
+0EB2..0EB3 ; Lao # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
+0EB4..0EB9 ; Lao # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC ; Lao # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EBD ; Lao # Lo LAO SEMIVOWEL SIGN NYO
+0EC0..0EC4 ; Lao # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC6 ; Lao # Lm LAO KO LA
+0EC8..0ECD ; Lao # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA
+0ED0..0ED9 ; Lao # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE
+0EDC..0EDD ; Lao # Lo [2] LAO HO NO..LAO HO MO
+
+# Total code points: 65
+
+# ================================================
+
+0F00 ; Tibetan # Lo TIBETAN SYLLABLE OM
+0F01..0F03 ; Tibetan # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04..0F12 ; Tibetan # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD
+0F13..0F17 ; Tibetan # So [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18..0F19 ; Tibetan # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A..0F1F ; Tibetan # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20..0F29 ; Tibetan # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE
+0F2A..0F33 ; Tibetan # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO
+0F34 ; Tibetan # So TIBETAN MARK BSDUS RTAGS
+0F35 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36 ; Tibetan # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38 ; Tibetan # So TIBETAN MARK CHE MGO
+0F39 ; Tibetan # Mn TIBETAN MARK TSA -PHRU
+0F3A ; Tibetan # Ps TIBETAN MARK GUG RTAGS GYON
+0F3B ; Tibetan # Pe TIBETAN MARK GUG RTAGS GYAS
+0F3C ; Tibetan # Ps TIBETAN MARK ANG KHANG GYON
+0F3D ; Tibetan # Pe TIBETAN MARK ANG KHANG GYAS
+0F3E..0F3F ; Tibetan # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F40..0F47 ; Tibetan # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA
+0F49..0F6C ; Tibetan # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA
+0F71..0F7E ; Tibetan # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F7F ; Tibetan # Mc TIBETAN SIGN RNAM BCAD
+0F80..0F84 ; Tibetan # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F85 ; Tibetan # Po TIBETAN MARK PALUTA
+0F86..0F87 ; Tibetan # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F88..0F8B ; Tibetan # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
+0F90..0F97 ; Tibetan # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC ; Tibetan # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE..0FC5 ; Tibetan # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE
+0FC6 ; Tibetan # Mn TIBETAN SYMBOL PADMA GDAN
+0FC7..0FCC ; Tibetan # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCE..0FCF ; Tibetan # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM
+0FD0..0FD4 ; Tibetan # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA
+
+# Total code points: 201
+
+# ================================================
+
+1000..102A ; Myanmar # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU
+102B..102C ; Myanmar # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA
+102D..1030 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1031 ; Myanmar # Mc MYANMAR VOWEL SIGN E
+1032..1037 ; Myanmar # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW
+1038 ; Myanmar # Mc MYANMAR SIGN VISARGA
+1039..103A ; Myanmar # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+103B..103C ; Myanmar # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
+103D..103E ; Myanmar # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+103F ; Myanmar # Lo MYANMAR LETTER GREAT SA
+1040..1049 ; Myanmar # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE
+104A..104F ; Myanmar # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE
+1050..1055 ; Myanmar # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
+1056..1057 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1058..1059 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105A..105D ; Myanmar # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE
+105E..1060 ; Myanmar # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1061 ; Myanmar # Lo MYANMAR LETTER SGAW KAREN SHA
+1062..1064 ; Myanmar # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO
+1065..1066 ; Myanmar # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA
+1067..106D ; Myanmar # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5
+106E..1070 ; Myanmar # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA
+1071..1074 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1075..1081 ; Myanmar # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA
+1082 ; Myanmar # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083..1084 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E
+1085..1086 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+1087..108C ; Myanmar # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3
+108D ; Myanmar # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+108E ; Myanmar # Lo MYANMAR LETTER RUMAI PALAUNG FA
+108F ; Myanmar # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5
+1090..1099 ; Myanmar # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE
+109E..109F ; Myanmar # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION
+
+# Total code points: 156
+
+# ================================================
+
+10A0..10C5 ; Georgian # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+10D0..10FA ; Georgian # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FC ; Georgian # Lm MODIFIER LETTER GEORGIAN NAR
+2D00..2D25 ; Georgian # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+
+# Total code points: 120
+
+# ================================================
+
+1100..1159 ; Hangul # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH
+115F..11A2 ; Hangul # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA
+11A8..11F9 ; Hangul # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH
+3131..318E ; Hangul # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+3200..321E ; Hangul # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU
+3260..327E ; Hangul # So [31] CIRCLED HANGUL KIYEOK..CIRCLED HANGUL IEUNG U
+AC00..D7A3 ; Hangul # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+FFA0..FFBE ; Hangul # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC ; Hangul # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+
+# Total code points: 11620
+
+# ================================================
+
+1200..1248 ; Ethiopic # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA
+124A..124D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+1250..1256 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1258 ; Ethiopic # Lo ETHIOPIC SYLLABLE QHWA
+125A..125D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+1260..1288 ; Ethiopic # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
+128A..128D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+1290..12B0 ; Ethiopic # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
+12B2..12B5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B8..12BE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12C0 ; Ethiopic # Lo ETHIOPIC SYLLABLE KXWA
+12C2..12C5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C8..12D6 ; Ethiopic # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8..1310 ; Ethiopic # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
+1312..1315 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1318..135A ; Ethiopic # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
+135F ; Ethiopic # Mn ETHIOPIC COMBINING GEMINATION MARK
+1360 ; Ethiopic # So ETHIOPIC SECTION MARK
+1361..1368 ; Ethiopic # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR
+1369..137C ; Ethiopic # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND
+1380..138F ; Ethiopic # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+1390..1399 ; Ethiopic # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT
+2D80..2D96 ; Ethiopic # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+2DA0..2DA6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+2DA8..2DAE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+2DB0..2DB6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+2DB8..2DBE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+2DC0..2DC6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+2DC8..2DCE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+2DD0..2DD6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+2DD8..2DDE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+
+# Total code points: 461
+
+# ================================================
+
+13A0..13F4 ; Cherokee # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
+
+# Total code points: 85
+
+# ================================================
+
+1401..166C ; Canadian_Aboriginal # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166D..166E ; Canadian_Aboriginal # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
+166F..1676 ; Canadian_Aboriginal # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA
+
+# Total code points: 630
+
+# ================================================
+
+1680 ; Ogham # Zs OGHAM SPACE MARK
+1681..169A ; Ogham # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
+169B ; Ogham # Ps OGHAM FEATHER MARK
+169C ; Ogham # Pe OGHAM REVERSED FEATHER MARK
+
+# Total code points: 29
+
+# ================================================
+
+16A0..16EA ; Runic # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EE..16F0 ; Runic # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+
+# Total code points: 78
+
+# ================================================
+
+1780..17B3 ; Khmer # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17B4..17B5 ; Khmer # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B6 ; Khmer # Mc KHMER VOWEL SIGN AA
+17B7..17BD ; Khmer # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17BE..17C5 ; Khmer # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C6 ; Khmer # Mn KHMER SIGN NIKAHIT
+17C7..17C8 ; Khmer # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+17C9..17D3 ; Khmer # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17D4..17D6 ; Khmer # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
+17D7 ; Khmer # Lm KHMER SIGN LEK TOO
+17D8..17DA ; Khmer # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT
+17DB ; Khmer # Sc KHMER CURRENCY SYMBOL RIEL
+17DC ; Khmer # Lo KHMER SIGN AVAKRAHASANYA
+17DD ; Khmer # Mn KHMER SIGN ATTHACAN
+17E0..17E9 ; Khmer # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE
+17F0..17F9 ; Khmer # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON
+19E0..19FF ; Khmer # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC
+
+# Total code points: 146
+
+# ================================================
+
+1800..1801 ; Mongolian # Po [2] MONGOLIAN BIRGA..MONGOLIAN ELLIPSIS
+1804 ; Mongolian # Po MONGOLIAN COLON
+1806 ; Mongolian # Pd MONGOLIAN TODO SOFT HYPHEN
+1807..180A ; Mongolian # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU
+180B..180D ; Mongolian # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+180E ; Mongolian # Zs MONGOLIAN VOWEL SEPARATOR
+1810..1819 ; Mongolian # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
+1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
+1843 ; Mongolian # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844..1877 ; Mongolian # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1880..18A8 ; Mongolian # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9 ; Mongolian # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+18AA ; Mongolian # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA
+
+# Total code points: 153
+
+# ================================================
+
+3041..3096 ; Hiragana # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
+309D..309E ; Hiragana # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F ; Hiragana # Lo HIRAGANA DIGRAPH YORI
+
+# Total code points: 89
+
+# ================================================
+
+30A1..30FA ; Katakana # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
+30FD..30FE ; Katakana # Lm [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK
+30FF ; Katakana # Lo KATAKANA DIGRAPH KOTO
+31F0..31FF ; Katakana # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+32D0..32FE ; Katakana # So [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO
+3300..3357 ; Katakana # So [88] SQUARE APAATO..SQUARE WATTO
+FF66..FF6F ; Katakana # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+
+# Total code points: 299
+
+# ================================================
+
+3105..312D ; Bopomofo # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH
+31A0..31B7 ; Bopomofo # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+
+# Total code points: 65
+
+# ================================================
+
+2E80..2E99 ; Han # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP
+2E9B..2EF3 ; Han # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
+2F00..2FD5 ; Han # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
+3005 ; Han # Lm IDEOGRAPHIC ITERATION MARK
+3007 ; Han # Nl IDEOGRAPHIC NUMBER ZERO
+3021..3029 ; Han # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+3038..303A ; Han # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
+3400..4DB5 ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FC3 ; Han # Lo [20932] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FC3
+F900..FA2D ; Han # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6A ; Han # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A
+FA70..FAD9 ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+20000..2A6D6 ; Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2F800..2FA1D ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 71578
+
+# ================================================
+
+A000..A014 ; Yi # Lo [21] YI SYLLABLE IT..YI SYLLABLE E
+A015 ; Yi # Lm YI SYLLABLE WU
+A016..A48C ; Yi # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
+A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE
+
+# Total code points: 1220
+
+# ================================================
+
+10300..1031E ; Old_Italic # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+10320..10323 ; Old_Italic # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY
+
+# Total code points: 35
+
+# ================================================
+
+10330..10340 ; Gothic # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
+10341 ; Gothic # Nl GOTHIC LETTER NINETY
+10342..10349 ; Gothic # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
+1034A ; Gothic # Nl GOTHIC LETTER NINE HUNDRED
+
+# Total code points: 27
+
+# ================================================
+
+10400..1044F ; Deseret # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+
+# Total code points: 80
+
+# ================================================
+
+0300..036F ; Inherited # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
+064B..0655 ; Inherited # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW
+0670 ; Inherited # Mn ARABIC LETTER SUPERSCRIPT ALEF
+0951..0952 ; Inherited # Mn [2] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI STRESS SIGN ANUDATTA
+1DC0..1DE6 ; Inherited # Mn [39] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER Z
+1DFE..1DFF ; Inherited # Mn [2] COMBINING LEFT ARROWHEAD ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+200C..200D ; Inherited # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+20D0..20DC ; Inherited # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20DD..20E0 ; Inherited # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1 ; Inherited # Mn COMBINING LEFT RIGHT ARROW ABOVE
+20E2..20E4 ; Inherited # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5..20F0 ; Inherited # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE
+302A..302F ; Inherited # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A ; Inherited # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+FE00..FE0F ; Inherited # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE20..FE26 ; Inherited # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON
+101FD ; Inherited # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+1D167..1D169 ; Inherited # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D17B..1D182 ; Inherited # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B ; Inherited # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 496
+
+# ================================================
+
+1700..170C ; Tagalog # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA
+170E..1711 ; Tagalog # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA
+1712..1714 ; Tagalog # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+
+# Total code points: 20
+
+# ================================================
+
+1720..1731 ; Hanunoo # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA
+1732..1734 ; Hanunoo # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+
+# Total code points: 21
+
+# ================================================
+
+1740..1751 ; Buhid # Lo [18] BUHID LETTER A..BUHID LETTER HA
+1752..1753 ; Buhid # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+
+# Total code points: 20
+
+# ================================================
+
+1760..176C ; Tagbanwa # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
+176E..1770 ; Tagbanwa # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1772..1773 ; Tagbanwa # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+
+# Total code points: 18
+
+# ================================================
+
+1900..191C ; Limbu # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1920..1922 ; Limbu # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926 ; Limbu # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928 ; Limbu # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B ; Limbu # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931 ; Limbu # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932 ; Limbu # Mn LIMBU SMALL LETTER ANUSVARA
+1933..1938 ; Limbu # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1939..193B ; Limbu # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1940 ; Limbu # So LIMBU SIGN LOO
+1944..1945 ; Limbu # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+1946..194F ; Limbu # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE
+
+# Total code points: 66
+
+# ================================================
+
+1950..196D ; Tai_Le # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974 ; Tai_Le # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+
+# Total code points: 35
+
+# ================================================
+
+10000..1000B ; Linear_B # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026 ; Linear_B # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A ; Linear_B # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D ; Linear_B # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D ; Linear_B # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D ; Linear_B # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA ; Linear_B # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+
+# Total code points: 211
+
+# ================================================
+
+10380..1039D ; Ugaritic # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+1039F ; Ugaritic # Po UGARITIC WORD DIVIDER
+
+# Total code points: 31
+
+# ================================================
+
+10450..1047F ; Shavian # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW
+
+# Total code points: 48
+
+# ================================================
+
+10480..1049D ; Osmanya # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO
+104A0..104A9 ; Osmanya # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
+
+# Total code points: 40
+
+# ================================================
+
+10800..10805 ; Cypriot # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10808 ; Cypriot # Lo CYPRIOT SYLLABLE JO
+1080A..10835 ; Cypriot # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10837..10838 ; Cypriot # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+1083C ; Cypriot # Lo CYPRIOT SYLLABLE ZA
+1083F ; Cypriot # Lo CYPRIOT SYLLABLE ZO
+
+# Total code points: 55
+
+# ================================================
+
+2800..28FF ; Braille # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
+
+# Total code points: 256
+
+# ================================================
+
+1A00..1A16 ; Buginese # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA
+1A17..1A18 ; Buginese # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A19..1A1B ; Buginese # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
+1A1E..1A1F ; Buginese # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION
+
+# Total code points: 30
+
+# ================================================
+
+03E2..03EF ; Coptic # L& [14] COPTIC CAPITAL LETTER SHEI..COPTIC SMALL LETTER DEI
+2C80..2CE4 ; Coptic # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI
+2CE5..2CEA ; Coptic # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA
+2CF9..2CFC ; Coptic # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD ; Coptic # No COPTIC FRACTION ONE HALF
+2CFE..2CFF ; Coptic # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER
+
+# Total code points: 128
+
+# ================================================
+
+1980..19A9 ; New_Tai_Lue # Lo [42] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW XVA
+19B0..19C0 ; New_Tai_Lue # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
+19C1..19C7 ; New_Tai_Lue # Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B
+19C8..19C9 ; New_Tai_Lue # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
+19D0..19D9 ; New_Tai_Lue # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE
+19DE..19DF ; New_Tai_Lue # Po [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV
+
+# Total code points: 80
+
+# ================================================
+
+2C00..2C2E ; Glagolitic # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E ; Glagolitic # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+
+# Total code points: 94
+
+# ================================================
+
+2D30..2D65 ; Tifinagh # Lo [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
+2D6F ; Tifinagh # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+
+# Total code points: 55
+
+# ================================================
+
+A800..A801 ; Syloti_Nagri # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I
+A802 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN DVISVARA
+A803..A805 ; Syloti_Nagri # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
+A806 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN HASANTA
+A807..A80A ; Syloti_Nagri # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO
+A80B ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN ANUSVARA
+A80C..A822 ; Syloti_Nagri # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO
+A823..A824 ; Syloti_Nagri # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A825..A826 ; Syloti_Nagri # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A827 ; Syloti_Nagri # Mc SYLOTI NAGRI VOWEL SIGN OO
+A828..A82B ; Syloti_Nagri # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4
+
+# Total code points: 44
+
+# ================================================
+
+103A0..103C3 ; Old_Persian # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+103C8..103CF ; Old_Persian # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+103D0 ; Old_Persian # Po OLD PERSIAN WORD DIVIDER
+103D1..103D5 ; Old_Persian # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED
+
+# Total code points: 50
+
+# ================================================
+
+10A00 ; Kharoshthi # Lo KHAROSHTHI LETTER A
+10A01..10A03 ; Kharoshthi # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06 ; Kharoshthi # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F ; Kharoshthi # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A10..10A13 ; Kharoshthi # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
+10A15..10A17 ; Kharoshthi # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+10A19..10A33 ; Kharoshthi # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A38..10A3A ; Kharoshthi # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3F ; Kharoshthi # Mn KHAROSHTHI VIRAMA
+10A40..10A47 ; Kharoshthi # No [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND
+10A50..10A58 ; Kharoshthi # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
+
+# Total code points: 65
+
+# ================================================
+
+1B00..1B03 ; Balinese # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B04 ; Balinese # Mc BALINESE SIGN BISAH
+1B05..1B33 ; Balinese # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA
+1B34 ; Balinese # Mn BALINESE SIGN REREKAN
+1B35 ; Balinese # Mc BALINESE VOWEL SIGN TEDUNG
+1B36..1B3A ; Balinese # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3B ; Balinese # Mc BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C ; Balinese # Mn BALINESE VOWEL SIGN LA LENGA
+1B3D..1B41 ; Balinese # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42 ; Balinese # Mn BALINESE VOWEL SIGN PEPET
+1B43..1B44 ; Balinese # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG
+1B45..1B4B ; Balinese # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK
+1B50..1B59 ; Balinese # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE
+1B5A..1B60 ; Balinese # Po [7] BALINESE PANTI..BALINESE PAMENENG
+1B61..1B6A ; Balinese # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE
+1B6B..1B73 ; Balinese # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1B74..1B7C ; Balinese # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+
+# Total code points: 121
+
+# ================================================
+
+12000..1236E ; Cuneiform # Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
+12400..12462 ; Cuneiform # Nl [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+12470..12473 ; Cuneiform # Po [4] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+
+# Total code points: 982
+
+# ================================================
+
+10900..10915 ; Phoenician # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
+10916..10919 ; Phoenician # No [4] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER ONE HUNDRED
+1091F ; Phoenician # Po PHOENICIAN WORD SEPARATOR
+
+# Total code points: 27
+
+# ================================================
+
+A840..A873 ; Phags_Pa # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
+A874..A877 ; Phags_Pa # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD
+
+# Total code points: 56
+
+# ================================================
+
+07C0..07C9 ; Nko # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE
+07CA..07EA ; Nko # Lo [33] NKO LETTER A..NKO LETTER JONA RA
+07EB..07F3 ; Nko # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+07F4..07F5 ; Nko # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+07F6 ; Nko # So NKO SYMBOL OO DENNEN
+07F7..07F9 ; Nko # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK
+07FA ; Nko # Lm NKO LAJANYALAN
+
+# Total code points: 59
+
+# ================================================
+
+1B80..1B81 ; Sundanese # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1B82 ; Sundanese # Mc SUNDANESE SIGN PANGWISAD
+1B83..1BA0 ; Sundanese # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA
+1BA1 ; Sundanese # Mc SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA2..1BA5 ; Sundanese # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA6..1BA7 ; Sundanese # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
+1BA8..1BA9 ; Sundanese # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1BAA ; Sundanese # Mc SUNDANESE SIGN PAMAAEH
+1BAE..1BAF ; Sundanese # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA
+1BB0..1BB9 ; Sundanese # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE
+
+# Total code points: 55
+
+# ================================================
+
+1C00..1C23 ; Lepcha # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A
+1C24..1C2B ; Lepcha # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
+1C2C..1C33 ; Lepcha # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C34..1C35 ; Lepcha # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
+1C36..1C37 ; Lepcha # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1C3B..1C3F ; Lepcha # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK
+1C40..1C49 ; Lepcha # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE
+1C4D..1C4F ; Lepcha # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA
+
+# Total code points: 74
+
+# ================================================
+
+1C50..1C59 ; Ol_Chiki # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE
+1C5A..1C77 ; Ol_Chiki # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH
+1C78..1C7D ; Ol_Chiki # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1C7E..1C7F ; Ol_Chiki # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
+
+# Total code points: 48
+
+# ================================================
+
+A500..A60B ; Vai # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG
+A60C ; Vai # Lm VAI SYLLABLE LENGTHENER
+A60D..A60F ; Vai # Po [3] VAI COMMA..VAI QUESTION MARK
+A610..A61F ; Vai # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG
+A620..A629 ; Vai # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE
+A62A..A62B ; Vai # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO
+
+# Total code points: 300
+
+# ================================================
+
+A880..A881 ; Saurashtra # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
+A882..A8B3 ; Saurashtra # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA
+A8B4..A8C3 ; Saurashtra # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
+A8C4 ; Saurashtra # Mn SAURASHTRA SIGN VIRAMA
+A8CE..A8CF ; Saurashtra # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA
+A8D0..A8D9 ; Saurashtra # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE
+
+# Total code points: 81
+
+# ================================================
+
+A900..A909 ; Kayah_Li # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE
+A90A..A925 ; Kayah_Li # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO
+A926..A92D ; Kayah_Li # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
+A92E..A92F ; Kayah_Li # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA
+
+# Total code points: 48
+
+# ================================================
+
+A930..A946 ; Rejang # Lo [23] REJANG LETTER KA..REJANG LETTER A
+A947..A951 ; Rejang # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A952..A953 ; Rejang # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA
+A95F ; Rejang # Po REJANG SECTION MARK
+
+# Total code points: 37
+
+# ================================================
+
+10280..1029C ; Lycian # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X
+
+# Total code points: 29
+
+# ================================================
+
+102A0..102D0 ; Carian # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3
+
+# Total code points: 49
+
+# ================================================
+
+10920..10939 ; Lydian # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C
+1093F ; Lydian # Po LYDIAN TRIANGULAR MARK
+
+# Total code points: 27
+
+# ================================================
+
+AA00..AA28 ; Cham # Lo [41] CHAM LETTER A..CHAM LETTER HA
+AA29..AA2E ; Cham # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA2F..AA30 ; Cham # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
+AA31..AA32 ; Cham # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA33..AA34 ; Cham # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
+AA35..AA36 ; Cham # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA40..AA42 ; Cham # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG
+AA43 ; Cham # Mn CHAM CONSONANT SIGN FINAL NG
+AA44..AA4B ; Cham # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS
+AA4C ; Cham # Mn CHAM CONSONANT SIGN FINAL M
+AA4D ; Cham # Mc CHAM CONSONANT SIGN FINAL H
+AA50..AA59 ; Cham # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE
+AA5C..AA5F ; Cham # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA
+
+# Total code points: 83
+
+# EOF
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/SpecialCasing.txt b/Master/tlpkg/tlperl.straw/lib/unicore/SpecialCasing.txt
new file mode 100755
index 00000000000..92e70a4a3d2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/SpecialCasing.txt
@@ -0,0 +1,274 @@
+# SpecialCasing-5.1.0.txt
+# Date: 2008-03-03, 21:58:10 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# Special Casing Properties
+#
+# This file is a supplement to the UnicodeData file.
+# It contains additional information about the casing of Unicode characters.
+# (For compatibility, the UnicodeData.txt file only contains case mappings for
+# characters where they are 1-1, and independent of context and language.
+# For more information, see the discussion of Case Mappings in the Unicode Standard.
+#
+# All code points not listed in this file that do not have a simple case mappings
+# in UnicodeData.txt map to themselves.
+# ================================================================================
+# Format
+# ================================================================================
+# The entries in this file are in the following machine-readable format:
+#
+# <code>; <lower> ; <title> ; <upper> ; (<condition_list> ;)? # <comment>
+#
+# <code>, <lower>, <title>, and <upper> provide character values in hex. If there is more
+# than one character, they are separated by spaces. Other than as used to separate
+# elements, spaces are to be ignored.
+#
+# The <condition_list> is optional. Where present, it consists of one or more language IDs
+# or contexts, separated by spaces. In these conditions:
+# - A condition list overrides the normal behavior if all of the listed conditions are true.
+# - The context is always the context of the characters in the original string,
+# NOT in the resulting string.
+# - Case distinctions in the condition list are not significant.
+# - Conditions preceded by "Not_" represent the negation of the condition.
+# The condition list is not represented in the UCD as a formal property.
+#
+# A language ID is defined by BCP 47, with '-' and '_' treated equivalently.
+#
+# A context for a character C is defined by Section 3.13 Default Case
+# Operations, of The Unicode Standard, Version 5.0.
+# (This is identical to the context defined by Unicode 4.1.0,
+# as specified in http://www.unicode.org/versions/Unicode4.1.0/)
+#
+# Parsers of this file must be prepared to deal with future additions to this format:
+# * Additional contexts
+# * Additional fields
+# ================================================================================
+# @missing 0000..10FFFF; <slc>; <stc>; <suc>
+# ================================================================================
+# Unconditional mappings
+# ================================================================================
+
+# The German es-zed is special--the normal mapping is to SS.
+# Note: the titlecase should never occur in practice. It is equal to titlecase(uppercase(<es-zed>))
+
+00DF; 00DF; 0053 0073; 0053 0053; # LATIN SMALL LETTER SHARP S
+
+# Preserve canonical equivalence for I with dot. Turkic is handled below.
+
+0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+
+# Ligatures
+
+FB00; FB00; 0046 0066; 0046 0046; # LATIN SMALL LIGATURE FF
+FB01; FB01; 0046 0069; 0046 0049; # LATIN SMALL LIGATURE FI
+FB02; FB02; 0046 006C; 0046 004C; # LATIN SMALL LIGATURE FL
+FB03; FB03; 0046 0066 0069; 0046 0046 0049; # LATIN SMALL LIGATURE FFI
+FB04; FB04; 0046 0066 006C; 0046 0046 004C; # LATIN SMALL LIGATURE FFL
+FB05; FB05; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE LONG S T
+FB06; FB06; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE ST
+
+0587; 0587; 0535 0582; 0535 0552; # ARMENIAN SMALL LIGATURE ECH YIWN
+FB13; FB13; 0544 0576; 0544 0546; # ARMENIAN SMALL LIGATURE MEN NOW
+FB14; FB14; 0544 0565; 0544 0535; # ARMENIAN SMALL LIGATURE MEN ECH
+FB15; FB15; 0544 056B; 0544 053B; # ARMENIAN SMALL LIGATURE MEN INI
+FB16; FB16; 054E 0576; 054E 0546; # ARMENIAN SMALL LIGATURE VEW NOW
+FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
+
+# No corresponding uppercase precomposed character
+
+0149; 0149; 02BC 004E; 02BC 004E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+0390; 0390; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+03B0; 03B0; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+01F0; 01F0; 004A 030C; 004A 030C; # LATIN SMALL LETTER J WITH CARON
+1E96; 1E96; 0048 0331; 0048 0331; # LATIN SMALL LETTER H WITH LINE BELOW
+1E97; 1E97; 0054 0308; 0054 0308; # LATIN SMALL LETTER T WITH DIAERESIS
+1E98; 1E98; 0057 030A; 0057 030A; # LATIN SMALL LETTER W WITH RING ABOVE
+1E99; 1E99; 0059 030A; 0059 030A; # LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A; 1E9A; 0041 02BE; 0041 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING
+1F50; 1F50; 03A5 0313; 03A5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI
+1F52; 1F52; 03A5 0313 0300; 03A5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F54; 1F54; 03A5 0313 0301; 03A5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F56; 1F56; 03A5 0313 0342; 03A5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1FB6; 1FB6; 0391 0342; 0391 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FC6; 1FC6; 0397 0342; 0397 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FD2; 1FD2; 0399 0308 0300; 0399 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3; 1FD3; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6; 1FD6; 0399 0342; 0399 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7; 1FD7; 0399 0308 0342; 0399 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FE2; 1FE2; 03A5 0308 0300; 03A5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3; 1FE3; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4; 1FE4; 03A1 0313; 03A1 0313; # GREEK SMALL LETTER RHO WITH PSILI
+1FE6; 1FE6; 03A5 0342; 03A5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7; 1FE7; 03A5 0308 0342; 03A5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FF6; 1FF6; 03A9 0342; 03A9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+
+# IMPORTANT-when capitalizing iota-subscript (0345)
+# It MUST be in normalized form--moved to the end of any sequence of combining marks.
+# This is because logically it represents a following base character!
+# E.g. <iota_subscript> (<Mn> | <Mc> | <Me>)+ => (<Mn> | <Mc> | <Me>)+ <iota_subscript>
+# It should never be the first character in a word, so in titlecasing it can be left as is.
+
+# The following cases are already in the UnicodeData file, so are only commented here.
+
+# 0345; 0345; 0345; 0399; # COMBINING GREEK YPOGEGRAMMENI
+
+# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript)
+# have special uppercases.
+# Note: characters with PROSGEGRAMMENI are actually titlecase, not uppercase!
+
+1F80; 1F80; 1F88; 1F08 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81; 1F81; 1F89; 1F09 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82; 1F82; 1F8A; 1F0A 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83; 1F83; 1F8B; 1F0B 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84; 1F84; 1F8C; 1F0C 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85; 1F85; 1F8D; 1F0D 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86; 1F86; 1F8E; 1F0E 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87; 1F87; 1F8F; 1F0F 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88; 1F80; 1F88; 1F08 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89; 1F81; 1F89; 1F09 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A; 1F82; 1F8A; 1F0A 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B; 1F83; 1F8B; 1F0B 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C; 1F84; 1F8C; 1F0C 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D; 1F85; 1F8D; 1F0D 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E; 1F86; 1F8E; 1F0E 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F; 1F87; 1F8F; 1F0F 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90; 1F90; 1F98; 1F28 0399; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91; 1F91; 1F99; 1F29 0399; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92; 1F92; 1F9A; 1F2A 0399; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93; 1F93; 1F9B; 1F2B 0399; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94; 1F94; 1F9C; 1F2C 0399; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95; 1F95; 1F9D; 1F2D 0399; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96; 1F96; 1F9E; 1F2E 0399; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97; 1F97; 1F9F; 1F2F 0399; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98; 1F90; 1F98; 1F28 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99; 1F91; 1F99; 1F29 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A; 1F92; 1F9A; 1F2A 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B; 1F93; 1F9B; 1F2B 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C; 1F94; 1F9C; 1F2C 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D; 1F95; 1F9D; 1F2D 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E; 1F96; 1F9E; 1F2E 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F; 1F97; 1F9F; 1F2F 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0; 1FA0; 1FA8; 1F68 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1; 1FA1; 1FA9; 1F69 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2; 1FA2; 1FAA; 1F6A 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3; 1FA3; 1FAB; 1F6B 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4; 1FA4; 1FAC; 1F6C 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5; 1FA5; 1FAD; 1F6D 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6; 1FA6; 1FAE; 1F6E 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7; 1FA7; 1FAF; 1F6F 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8; 1FA0; 1FA8; 1F68 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9; 1FA1; 1FA9; 1F69 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA; 1FA2; 1FAA; 1F6A 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB; 1FA3; 1FAB; 1F6B 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC; 1FA4; 1FAC; 1F6C 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD; 1FA5; 1FAD; 1F6D 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE; 1FA6; 1FAE; 1F6E 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF; 1FA7; 1FAF; 1F6F 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB3; 1FB3; 1FBC; 0391 0399; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FBC; 1FB3; 1FBC; 0391 0399; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FC3; 1FC3; 1FCC; 0397 0399; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FCC; 1FC3; 1FCC; 0397 0399; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+
+# Some characters with YPOGEGRAMMENI also have no corresponding titlecases
+
+1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FC2; 1FC2; 1FCA 0345; 1FCA 0399; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC4; 1FC4; 0389 0345; 0389 0399; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FF2; 1FF2; 1FFA 0345; 1FFA 0399; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF4; 1FF4; 038F 0345; 038F 0399; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+
+1FB7; 1FB7; 0391 0342 0345; 0391 0342 0399; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC7; 1FC7; 0397 0342 0345; 0397 0342 0399; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+
+# ================================================================================
+# Conditional Mappings
+# The remainder of this file provides conditional casing data used to produce
+# full case mappings.
+# ================================================================================
+# Language-Insensitive Mappings
+# These are characters whose full case mappings do not depend on language, but do
+# depend on context (which characters come before or after). For more information
+# see the header of this file and the Unicode Standard.
+# ================================================================================
+
+# Special case for final form of sigma
+
+03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA
+
+# Note: the following cases for non-final are already in the UnicodeData file.
+
+# 03A3; 03C3; 03A3; 03A3; # GREEK CAPITAL LETTER SIGMA
+# 03C3; 03C3; 03A3; 03A3; # GREEK SMALL LETTER SIGMA
+# 03C2; 03C2; 03A3; 03A3; # GREEK SMALL LETTER FINAL SIGMA
+
+# Note: the following cases are not included, since they would case-fold in lowercasing
+
+# 03C3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK SMALL LETTER SIGMA
+# 03C2; 03C3; 03A3; 03A3; Not_Final_Sigma; # GREEK SMALL LETTER FINAL SIGMA
+
+# ================================================================================
+# Language-Sensitive Mappings
+# These are characters whose full case mappings depend on language and perhaps also
+# context (which characters come before or after). For more information
+# see the header of this file and the Unicode Standard.
+# ================================================================================
+
+# Lithuanian
+
+# Lithuanian retains the dot in a lowercase i when followed by accents.
+
+# Remove DOT ABOVE after "i" with upper or titlecase
+
+0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE
+
+# Introduce an explicit dot above when lowercasing capital I's and J's
+# whenever there are more accents above.
+# (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek)
+
+0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I
+004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J
+012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK
+00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE
+00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE
+0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE
+
+# ================================================================================
+
+# Turkish and Azeri
+
+# I and i-dotless; I-dot and i are case pairs in Turkish and Azeri
+# The following rules handle those cases.
+
+0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0130; 0069; 0130; 0130; az; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+
+# When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i.
+# This matches the behavior of the canonically equivalent I-dot_above
+
+0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE
+0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE
+
+# When lowercasing, unless an I is before a dot_above, it turns into a dotless i.
+
+0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I
+0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I
+
+# When uppercasing, i turns into a dotted capital I
+
+0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I
+0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I
+
+# Note: the following case is already in the UnicodeData file.
+
+# 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I
+
+# EOF
+
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/StandardizedVariants.txt b/Master/tlpkg/tlperl.straw/lib/unicore/StandardizedVariants.txt
new file mode 100755
index 00000000000..686643adfaf
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/StandardizedVariants.txt
@@ -0,0 +1,139 @@
+# StandardizedVariants-5.1.0.txt
+# Date: 2008-03-24, 13:39:00 PDT [KW]
+#
+# Specification of the variant sequences that are defined in the
+# Unicode Standard.
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Standardized variation sequences are defined in this file.
+# Ideographic variation sequences are defined acording to the registration
+# process specified in UTS #37, and are listed in the Ideographic
+# Variation Database. Only those two types of variation sequences
+# are sanctioned for use by conformant implementations.
+# In all other cases, use of a variation selector character does
+# not change the visual appearance of the preceding base character
+# from what it would have had in the absence of the variation selector.
+#
+# For more information on standardized variation sequences,
+# see Section 16.4, Variation Selectors,
+# in The Unicode Standard, Version 5.0.
+#
+# For more information on the Ideographic Variation Database
+# see http://www.unicode.org/ivd/
+#
+# Format:
+# Field 0: the variation sequence
+# Field 1: the description of the desired appearance
+# Field 2: where the appearance is only different in in particular shaping environments
+# this field lists them. The possible values are: isolate, initial, medial, final.
+# If more than one is present, there are spaces between them.
+# =============================
+
+# Mathematical
+
+2229 FE00; with serifs; # INTERSECTION
+222A FE00; with serifs; # UNION
+2268 FE00; with vertical stroke; # LESS-THAN BUT NOT EQUAL TO
+2269 FE00; with vertical stroke; # GREATER-THAN BUT NOT EQUAL TO
+2272 FE00; following the slant of the lower leg; # LESS-THAN OR EQUIVALENT TO
+2273 FE00; following the slant of the lower leg; # GREATER-THAN OR EQUIVALENT TO
+#2278 FE00; with vertical stroke; # NEITHER LESS-THAN NOR GREATER-THAN
+#2279 FE00; with vertical stroke; # NEITHER GREATER-THAN NOR LESS-THAN
+228A FE00; with stroke through bottom members; # SUBSET OF WITH NOT EQUAL TO
+228B FE00; with stroke through bottom members; # SUPERSET OF WITH NOT EQUAL TO
+2293 FE00; with serifs; # SQUARE CAP
+2294 FE00; with serifs; # SQUARE CUP
+2295 FE00; with white rim; # CIRCLED PLUS
+2297 FE00; with white rim; # CIRCLED TIMES
+229C FE00; with equal sign touching the circle; # CIRCLED EQUALS
+22DA FE00; with slanted equal; # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB FE00; with slanted equal; # GREATER-THAN EQUAL TO OR LESS-THAN
+2A3C FE00; tall variant with narrow foot; # INTERIOR PRODUCT
+2A3D FE00; tall variant with narrow foot; # RIGHTHAND INTERIOR PRODUCT
+2A9D FE00; with similar following the slant of the upper leg; # SIMILAR OR LESS-THAN
+2A9E FE00; with similar following the slant of the upper leg; # SIMILAR OR GREATER-THAN
+2AAC FE00; with slanted equal; # SMALLER THAN OR EQUAL TO
+2AAD FE00; with slanted equal; # LARGER THAN OR EQUAL TO
+2ACB FE00; with stroke through bottom members; # SUBSET OF ABOVE NOT EQUAL TO
+2ACC FE00; with stroke through bottom members; # SUPERSET OF ABOVE NOT EQUAL TO
+
+# Phags-pa
+
+A856 FE00; phags-pa letter reversed shaping small a; # PHAGS-PA LETTER SMALL A
+A85C FE00; phags-pa letter reversed shaping ha; # PHAGS-PA LETTER HA
+A85E FE00; phags-pa letter reversed shaping i; # PHAGS-PA LETTER I
+A85F FE00; phags-pa letter reversed shaping u; # PHAGS-PA LETTER U
+A860 FE00; phags-pa letter reversed shaping e; # PHAGS-PA LETTER E
+A868 FE00; phags-pa letter reversed shaping subjoined ya; # PHAGS-PA SUBJOINED LETTER YA
+
+# Mongolian
+
+1820 180B; second form; isolate medial final # MONGOLIAN LETTER A
+1820 180C; third form; medial # MONGOLIAN LETTER A
+1821 180B; second form; initial final # MONGOLIAN LETTER E
+1822 180B; second form; medial # MONGOLIAN LETTER I
+1823 180B; second form; medial final # MONGOLIAN LETTER O
+1824 180B; second form; medial # MONGOLIAN LETTER U
+1825 180B; second form; medial final # MONGOLIAN LETTER OE
+1825 180C; third form; medial # MONGOLIAN LETTER OE
+1826 180B; second form; isolate medial final # MONGOLIAN LETTER UE
+1826 180C; third form; medial # MONGOLIAN LETTER UE
+1828 180B; second form; initial medial # MONGOLIAN LETTER NA
+1828 180C; third form; medial # MONGOLIAN LETTER NA
+1828 180D; separate form; medial # MONGOLIAN LETTER NA
+182A 180B; alternative form; final # MONGOLIAN LETTER BA
+182C 180B; second form; initial medial # MONGOLIAN LETTER QA
+182C 180B; feminine second form; isolate # MONGOLIAN LETTER QA
+182C 180C; third form; medial # MONGOLIAN LETTER QA
+182C 180D; fourth form; medial # MONGOLIAN LETTER QA
+182D 180B; second form; initial medial # MONGOLIAN LETTER GA
+182D 180B; feminine form; final # MONGOLIAN LETTER GA
+182D 180C; third form; medial # MONGOLIAN LETTER GA
+182D 180D; feminine form; medial # MONGOLIAN LETTER GA
+1830 180B; second form; final # MONGOLIAN LETTER SA
+1830 180C; third form; final # MONGOLIAN LETTER SA
+1832 180B; second form; medial # MONGOLIAN LETTER TA
+1833 180B; second form; initial medial final # MONGOLIAN LETTER DA
+1835 180B; second form; medial # MONGOLIAN LETTER JA
+1836 180B; second form; initial medial # # MONGOLIAN LETTER YA
+1836 180C; third form; medial # MONGOLIAN LETTER YA
+1838 180B; second form; final # MONGOLIAN LETTER WA
+1844 180B; second form; medial # MONGOLIAN LETTER TODO E
+1845 180B; second form; medial # MONGOLIAN LETTER TODO I
+1846 180B; second form; medial # MONGOLIAN LETTER TODO O
+1847 180B; second form; isolate medial final # MONGOLIAN LETTER TODO U
+1847 180C; third form; medial # MONGOLIAN LETTER TODO U
+1848 180B; second form; medial # MONGOLIAN LETTER TODO OE
+1849 180B; second form; isolate medial # MONGOLIAN LETTER TODO UE
+184D 180B; feminine form; initial medial # MONGOLIAN LETTER TODO QA
+184E 180B; second form; medial # MONGOLIAN LETTER TODO GA
+185D 180B; second form; medial final # MONGOLIAN LETTER SIBE E
+185E 180B; second form; medial final # MONGOLIAN LETTER SIBE I
+185E 180C; third form; medial final # MONGOLIAN LETTER SIBE I
+1860 180B; second form; medial final # MONGOLIAN LETTER SIBE UE
+1863 180B; second form; medial # MONGOLIAN LETTER SIBE KA
+1868 180B; second form; initial medial # MONGOLIAN LETTER SIBE TA
+1868 180C; third form; medial # MONGOLIAN LETTER SIBE TA
+1869 180B; second form; initial medial # MONGOLIAN LETTER SIBE DA
+186F 180B; second form; initial medial # MONGOLIAN LETTER SIBE ZA
+1873 180B; second form; medial final # MONGOLIAN LETTER MANCHU I
+1873 180C; third form; medial final # MONGOLIAN LETTER MANCHU I
+1873 180D; fourth form; medial # MONGOLIAN LETTER MANCHU I
+1874 180B; second form; medial # MONGOLIAN LETTER MANCHU KA
+1874 180B; feminine first final form; final # MONGOLIAN LETTER MANCHU KA
+1874 180C; feminine first medial form; medial # MONGOLIAN LETTER MANCHU KA
+1874 180C; feminine second final form; final # MONGOLIAN LETTER MANCHU KA
+1874 180D; feminine second medial form; medial # MONGOLIAN LETTER MANCHU KA
+1876 180B; second form; initial medial # MONGOLIAN LETTER MANCHU FA
+1880 180B; second form; # MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881 180B; second form; # MONGOLIAN LETTER ALI GALI VISARGA ONE
+1887 180B; second form; isolate final # MONGOLIAN LETTER ALI GALI A
+1887 180C; third form; final # MONGOLIAN LETTER ALI GALI A
+1887 180D; fourth form; final # MONGOLIAN LETTER ALI GALI A
+1888 180B; second form; final # MONGOLIAN LETTER ALI GALI I
+188A 180B; second form; initial medial # MONGOLIAN LETTER ALI GALI NGA
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/To/Digit.pl b/Master/tlpkg/tlperl.straw/lib/unicore/To/Digit.pl
new file mode 100755
index 00000000000..470916ab24e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/To/Digit.pl
@@ -0,0 +1,380 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+return <<'END';
+0030 0
+0031 1
+0032 2
+0033 3
+0034 4
+0035 5
+0036 6
+0037 7
+0038 8
+0039 9
+0660 0
+0661 1
+0662 2
+0663 3
+0664 4
+0665 5
+0666 6
+0667 7
+0668 8
+0669 9
+06F0 0
+06F1 1
+06F2 2
+06F3 3
+06F4 4
+06F5 5
+06F6 6
+06F7 7
+06F8 8
+06F9 9
+07C0 0
+07C1 1
+07C2 2
+07C3 3
+07C4 4
+07C5 5
+07C6 6
+07C7 7
+07C8 8
+07C9 9
+0966 0
+0967 1
+0968 2
+0969 3
+096A 4
+096B 5
+096C 6
+096D 7
+096E 8
+096F 9
+09E6 0
+09E7 1
+09E8 2
+09E9 3
+09EA 4
+09EB 5
+09EC 6
+09ED 7
+09EE 8
+09EF 9
+0A66 0
+0A67 1
+0A68 2
+0A69 3
+0A6A 4
+0A6B 5
+0A6C 6
+0A6D 7
+0A6E 8
+0A6F 9
+0AE6 0
+0AE7 1
+0AE8 2
+0AE9 3
+0AEA 4
+0AEB 5
+0AEC 6
+0AED 7
+0AEE 8
+0AEF 9
+0B66 0
+0B67 1
+0B68 2
+0B69 3
+0B6A 4
+0B6B 5
+0B6C 6
+0B6D 7
+0B6E 8
+0B6F 9
+0BE6 0
+0BE7 1
+0BE8 2
+0BE9 3
+0BEA 4
+0BEB 5
+0BEC 6
+0BED 7
+0BEE 8
+0BEF 9
+0C66 0
+0C67 1
+0C68 2
+0C69 3
+0C6A 4
+0C6B 5
+0C6C 6
+0C6D 7
+0C6E 8
+0C6F 9
+0CE6 0
+0CE7 1
+0CE8 2
+0CE9 3
+0CEA 4
+0CEB 5
+0CEC 6
+0CED 7
+0CEE 8
+0CEF 9
+0D66 0
+0D67 1
+0D68 2
+0D69 3
+0D6A 4
+0D6B 5
+0D6C 6
+0D6D 7
+0D6E 8
+0D6F 9
+0E50 0
+0E51 1
+0E52 2
+0E53 3
+0E54 4
+0E55 5
+0E56 6
+0E57 7
+0E58 8
+0E59 9
+0ED0 0
+0ED1 1
+0ED2 2
+0ED3 3
+0ED4 4
+0ED5 5
+0ED6 6
+0ED7 7
+0ED8 8
+0ED9 9
+0F20 0
+0F21 1
+0F22 2
+0F23 3
+0F24 4
+0F25 5
+0F26 6
+0F27 7
+0F28 8
+0F29 9
+1040 0
+1041 1
+1042 2
+1043 3
+1044 4
+1045 5
+1046 6
+1047 7
+1048 8
+1049 9
+1090 0
+1091 1
+1092 2
+1093 3
+1094 4
+1095 5
+1096 6
+1097 7
+1098 8
+1099 9
+17E0 0
+17E1 1
+17E2 2
+17E3 3
+17E4 4
+17E5 5
+17E6 6
+17E7 7
+17E8 8
+17E9 9
+1810 0
+1811 1
+1812 2
+1813 3
+1814 4
+1815 5
+1816 6
+1817 7
+1818 8
+1819 9
+1946 0
+1947 1
+1948 2
+1949 3
+194A 4
+194B 5
+194C 6
+194D 7
+194E 8
+194F 9
+19D0 0
+19D1 1
+19D2 2
+19D3 3
+19D4 4
+19D5 5
+19D6 6
+19D7 7
+19D8 8
+19D9 9
+1B50 0
+1B51 1
+1B52 2
+1B53 3
+1B54 4
+1B55 5
+1B56 6
+1B57 7
+1B58 8
+1B59 9
+1BB0 0
+1BB1 1
+1BB2 2
+1BB3 3
+1BB4 4
+1BB5 5
+1BB6 6
+1BB7 7
+1BB8 8
+1BB9 9
+1C40 0
+1C41 1
+1C42 2
+1C43 3
+1C44 4
+1C45 5
+1C46 6
+1C47 7
+1C48 8
+1C49 9
+1C50 0
+1C51 1
+1C52 2
+1C53 3
+1C54 4
+1C55 5
+1C56 6
+1C57 7
+1C58 8
+1C59 9
+A620 0
+A621 1
+A622 2
+A623 3
+A624 4
+A625 5
+A626 6
+A627 7
+A628 8
+A629 9
+A8D0 0
+A8D1 1
+A8D2 2
+A8D3 3
+A8D4 4
+A8D5 5
+A8D6 6
+A8D7 7
+A8D8 8
+A8D9 9
+A900 0
+A901 1
+A902 2
+A903 3
+A904 4
+A905 5
+A906 6
+A907 7
+A908 8
+A909 9
+AA50 0
+AA51 1
+AA52 2
+AA53 3
+AA54 4
+AA55 5
+AA56 6
+AA57 7
+AA58 8
+AA59 9
+FF10 0
+FF11 1
+FF12 2
+FF13 3
+FF14 4
+FF15 5
+FF16 6
+FF17 7
+FF18 8
+FF19 9
+104A0 0
+104A1 1
+104A2 2
+104A3 3
+104A4 4
+104A5 5
+104A6 6
+104A7 7
+104A8 8
+104A9 9
+1D7CE 0
+1D7CF 1
+1D7D0 2
+1D7D1 3
+1D7D2 4
+1D7D3 5
+1D7D4 6
+1D7D5 7
+1D7D6 8
+1D7D7 9
+1D7D8 0
+1D7D9 1
+1D7DA 2
+1D7DB 3
+1D7DC 4
+1D7DD 5
+1D7DE 6
+1D7DF 7
+1D7E0 8
+1D7E1 9
+1D7E2 0
+1D7E3 1
+1D7E4 2
+1D7E5 3
+1D7E6 4
+1D7E7 5
+1D7E8 6
+1D7E9 7
+1D7EA 8
+1D7EB 9
+1D7EC 0
+1D7ED 1
+1D7EE 2
+1D7EF 3
+1D7F0 4
+1D7F1 5
+1D7F2 6
+1D7F3 7
+1D7F4 8
+1D7F5 9
+1D7F6 0
+1D7F7 1
+1D7F8 2
+1D7F9 3
+1D7FA 4
+1D7FB 5
+1D7FC 6
+1D7FD 7
+1D7FE 8
+1D7FF 9
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/To/Fold.pl b/Master/tlpkg/tlperl.straw/lib/unicore/To/Fold.pl
new file mode 100755
index 00000000000..26563bcb955
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/To/Fold.pl
@@ -0,0 +1,1127 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+
+# The key: UTF-8 _bytes_, the value: UTF-8 (speed hack)
+%utf8::ToSpecFold =
+(
+"\xC3\x9F" => "\x{0073}\x{0073}",
+"\xC4\xB0" => "\x{0069}\x{0307}",
+"\xC5\x89" => "\x{02BC}\x{006E}",
+"\xC7\xB0" => "\x{006A}\x{030C}",
+"\xCE\x90" => "\x{03B9}\x{0308}\x{0301}",
+"\xCE\xB0" => "\x{03C5}\x{0308}\x{0301}",
+"\xD6\x87" => "\x{0565}\x{0582}",
+"\xE1\xBA\x96" => "\x{0068}\x{0331}",
+"\xE1\xBA\x97" => "\x{0074}\x{0308}",
+"\xE1\xBA\x98" => "\x{0077}\x{030A}",
+"\xE1\xBA\x99" => "\x{0079}\x{030A}",
+"\xE1\xBA\x9A" => "\x{0061}\x{02BE}",
+"\xE1\xBA\x9E" => "\x{0073}\x{0073}",
+"\xE1\xBD\x90" => "\x{03C5}\x{0313}",
+"\xE1\xBD\x92" => "\x{03C5}\x{0313}\x{0300}",
+"\xE1\xBD\x94" => "\x{03C5}\x{0313}\x{0301}",
+"\xE1\xBD\x96" => "\x{03C5}\x{0313}\x{0342}",
+"\xE1\xBE\x80" => "\x{1F00}\x{03B9}",
+"\xE1\xBE\x81" => "\x{1F01}\x{03B9}",
+"\xE1\xBE\x82" => "\x{1F02}\x{03B9}",
+"\xE1\xBE\x83" => "\x{1F03}\x{03B9}",
+"\xE1\xBE\x84" => "\x{1F04}\x{03B9}",
+"\xE1\xBE\x85" => "\x{1F05}\x{03B9}",
+"\xE1\xBE\x86" => "\x{1F06}\x{03B9}",
+"\xE1\xBE\x87" => "\x{1F07}\x{03B9}",
+"\xE1\xBE\x88" => "\x{1F00}\x{03B9}",
+"\xE1\xBE\x89" => "\x{1F01}\x{03B9}",
+"\xE1\xBE\x8A" => "\x{1F02}\x{03B9}",
+"\xE1\xBE\x8B" => "\x{1F03}\x{03B9}",
+"\xE1\xBE\x8C" => "\x{1F04}\x{03B9}",
+"\xE1\xBE\x8D" => "\x{1F05}\x{03B9}",
+"\xE1\xBE\x8E" => "\x{1F06}\x{03B9}",
+"\xE1\xBE\x8F" => "\x{1F07}\x{03B9}",
+"\xE1\xBE\x90" => "\x{1F20}\x{03B9}",
+"\xE1\xBE\x91" => "\x{1F21}\x{03B9}",
+"\xE1\xBE\x92" => "\x{1F22}\x{03B9}",
+"\xE1\xBE\x93" => "\x{1F23}\x{03B9}",
+"\xE1\xBE\x94" => "\x{1F24}\x{03B9}",
+"\xE1\xBE\x95" => "\x{1F25}\x{03B9}",
+"\xE1\xBE\x96" => "\x{1F26}\x{03B9}",
+"\xE1\xBE\x97" => "\x{1F27}\x{03B9}",
+"\xE1\xBE\x98" => "\x{1F20}\x{03B9}",
+"\xE1\xBE\x99" => "\x{1F21}\x{03B9}",
+"\xE1\xBE\x9A" => "\x{1F22}\x{03B9}",
+"\xE1\xBE\x9B" => "\x{1F23}\x{03B9}",
+"\xE1\xBE\x9C" => "\x{1F24}\x{03B9}",
+"\xE1\xBE\x9D" => "\x{1F25}\x{03B9}",
+"\xE1\xBE\x9E" => "\x{1F26}\x{03B9}",
+"\xE1\xBE\x9F" => "\x{1F27}\x{03B9}",
+"\xE1\xBE\xA0" => "\x{1F60}\x{03B9}",
+"\xE1\xBE\xA1" => "\x{1F61}\x{03B9}",
+"\xE1\xBE\xA2" => "\x{1F62}\x{03B9}",
+"\xE1\xBE\xA3" => "\x{1F63}\x{03B9}",
+"\xE1\xBE\xA4" => "\x{1F64}\x{03B9}",
+"\xE1\xBE\xA5" => "\x{1F65}\x{03B9}",
+"\xE1\xBE\xA6" => "\x{1F66}\x{03B9}",
+"\xE1\xBE\xA7" => "\x{1F67}\x{03B9}",
+"\xE1\xBE\xA8" => "\x{1F60}\x{03B9}",
+"\xE1\xBE\xA9" => "\x{1F61}\x{03B9}",
+"\xE1\xBE\xAA" => "\x{1F62}\x{03B9}",
+"\xE1\xBE\xAB" => "\x{1F63}\x{03B9}",
+"\xE1\xBE\xAC" => "\x{1F64}\x{03B9}",
+"\xE1\xBE\xAD" => "\x{1F65}\x{03B9}",
+"\xE1\xBE\xAE" => "\x{1F66}\x{03B9}",
+"\xE1\xBE\xAF" => "\x{1F67}\x{03B9}",
+"\xE1\xBE\xB2" => "\x{1F70}\x{03B9}",
+"\xE1\xBE\xB3" => "\x{03B1}\x{03B9}",
+"\xE1\xBE\xB4" => "\x{03AC}\x{03B9}",
+"\xE1\xBE\xB6" => "\x{03B1}\x{0342}",
+"\xE1\xBE\xB7" => "\x{03B1}\x{0342}\x{03B9}",
+"\xE1\xBE\xBC" => "\x{03B1}\x{03B9}",
+"\xE1\xBF\x82" => "\x{1F74}\x{03B9}",
+"\xE1\xBF\x83" => "\x{03B7}\x{03B9}",
+"\xE1\xBF\x84" => "\x{03AE}\x{03B9}",
+"\xE1\xBF\x86" => "\x{03B7}\x{0342}",
+"\xE1\xBF\x87" => "\x{03B7}\x{0342}\x{03B9}",
+"\xE1\xBF\x8C" => "\x{03B7}\x{03B9}",
+"\xE1\xBF\x92" => "\x{03B9}\x{0308}\x{0300}",
+"\xE1\xBF\x93" => "\x{03B9}\x{0308}\x{0301}",
+"\xE1\xBF\x96" => "\x{03B9}\x{0342}",
+"\xE1\xBF\x97" => "\x{03B9}\x{0308}\x{0342}",
+"\xE1\xBF\xA2" => "\x{03C5}\x{0308}\x{0300}",
+"\xE1\xBF\xA3" => "\x{03C5}\x{0308}\x{0301}",
+"\xE1\xBF\xA4" => "\x{03C1}\x{0313}",
+"\xE1\xBF\xA6" => "\x{03C5}\x{0342}",
+"\xE1\xBF\xA7" => "\x{03C5}\x{0308}\x{0342}",
+"\xE1\xBF\xB2" => "\x{1F7C}\x{03B9}",
+"\xE1\xBF\xB3" => "\x{03C9}\x{03B9}",
+"\xE1\xBF\xB4" => "\x{03CE}\x{03B9}",
+"\xE1\xBF\xB6" => "\x{03C9}\x{0342}",
+"\xE1\xBF\xB7" => "\x{03C9}\x{0342}\x{03B9}",
+"\xE1\xBF\xBC" => "\x{03C9}\x{03B9}",
+"\xEF\xAC\x80" => "\x{0066}\x{0066}",
+"\xEF\xAC\x81" => "\x{0066}\x{0069}",
+"\xEF\xAC\x82" => "\x{0066}\x{006C}",
+"\xEF\xAC\x83" => "\x{0066}\x{0066}\x{0069}",
+"\xEF\xAC\x84" => "\x{0066}\x{0066}\x{006C}",
+"\xEF\xAC\x85" => "\x{0073}\x{0074}",
+"\xEF\xAC\x86" => "\x{0073}\x{0074}",
+"\xEF\xAC\x93" => "\x{0574}\x{0576}",
+"\xEF\xAC\x94" => "\x{0574}\x{0565}",
+"\xEF\xAC\x95" => "\x{0574}\x{056B}",
+"\xEF\xAC\x96" => "\x{057E}\x{0576}",
+"\xEF\xAC\x97" => "\x{0574}\x{056D}",
+);
+
+return <<'END';
+0041 0061
+0042 0062
+0043 0063
+0044 0064
+0045 0065
+0046 0066
+0047 0067
+0048 0068
+0049 0069
+004A 006A
+004B 006B
+004C 006C
+004D 006D
+004E 006E
+004F 006F
+0050 0070
+0051 0071
+0052 0072
+0053 0073
+0054 0074
+0055 0075
+0056 0076
+0057 0077
+0058 0078
+0059 0079
+005A 007A
+00B5 03BC
+00C0 00E0
+00C1 00E1
+00C2 00E2
+00C3 00E3
+00C4 00E4
+00C5 00E5
+00C6 00E6
+00C7 00E7
+00C8 00E8
+00C9 00E9
+00CA 00EA
+00CB 00EB
+00CC 00EC
+00CD 00ED
+00CE 00EE
+00CF 00EF
+00D0 00F0
+00D1 00F1
+00D2 00F2
+00D3 00F3
+00D4 00F4
+00D5 00F5
+00D6 00F6
+00D8 00F8
+00D9 00F9
+00DA 00FA
+00DB 00FB
+00DC 00FC
+00DD 00FD
+00DE 00FE
+0100 0101
+0102 0103
+0104 0105
+0106 0107
+0108 0109
+010A 010B
+010C 010D
+010E 010F
+0110 0111
+0112 0113
+0114 0115
+0116 0117
+0118 0119
+011A 011B
+011C 011D
+011E 011F
+0120 0121
+0122 0123
+0124 0125
+0126 0127
+0128 0129
+012A 012B
+012C 012D
+012E 012F
+0132 0133
+0134 0135
+0136 0137
+0139 013A
+013B 013C
+013D 013E
+013F 0140
+0141 0142
+0143 0144
+0145 0146
+0147 0148
+014A 014B
+014C 014D
+014E 014F
+0150 0151
+0152 0153
+0154 0155
+0156 0157
+0158 0159
+015A 015B
+015C 015D
+015E 015F
+0160 0161
+0162 0163
+0164 0165
+0166 0167
+0168 0169
+016A 016B
+016C 016D
+016E 016F
+0170 0171
+0172 0173
+0174 0175
+0176 0177
+0178 00FF
+0179 017A
+017B 017C
+017D 017E
+017F 0073
+0181 0253
+0182 0183
+0184 0185
+0186 0254
+0187 0188
+0189 0256
+018A 0257
+018B 018C
+018E 01DD
+018F 0259
+0190 025B
+0191 0192
+0193 0260
+0194 0263
+0196 0269
+0197 0268
+0198 0199
+019C 026F
+019D 0272
+019F 0275
+01A0 01A1
+01A2 01A3
+01A4 01A5
+01A6 0280
+01A7 01A8
+01A9 0283
+01AC 01AD
+01AE 0288
+01AF 01B0
+01B1 028A
+01B2 028B
+01B3 01B4
+01B5 01B6
+01B7 0292
+01B8 01B9
+01BC 01BD
+01C4 01C6
+01C5 01C6
+01C7 01C9
+01C8 01C9
+01CA 01CC
+01CB 01CC
+01CD 01CE
+01CF 01D0
+01D1 01D2
+01D3 01D4
+01D5 01D6
+01D7 01D8
+01D9 01DA
+01DB 01DC
+01DE 01DF
+01E0 01E1
+01E2 01E3
+01E4 01E5
+01E6 01E7
+01E8 01E9
+01EA 01EB
+01EC 01ED
+01EE 01EF
+01F1 01F3
+01F2 01F3
+01F4 01F5
+01F6 0195
+01F7 01BF
+01F8 01F9
+01FA 01FB
+01FC 01FD
+01FE 01FF
+0200 0201
+0202 0203
+0204 0205
+0206 0207
+0208 0209
+020A 020B
+020C 020D
+020E 020F
+0210 0211
+0212 0213
+0214 0215
+0216 0217
+0218 0219
+021A 021B
+021C 021D
+021E 021F
+0220 019E
+0222 0223
+0224 0225
+0226 0227
+0228 0229
+022A 022B
+022C 022D
+022E 022F
+0230 0231
+0232 0233
+023A 2C65
+023B 023C
+023D 019A
+023E 2C66
+0241 0242
+0243 0180
+0244 0289
+0245 028C
+0246 0247
+0248 0249
+024A 024B
+024C 024D
+024E 024F
+0345 03B9
+0370 0371
+0372 0373
+0376 0377
+0386 03AC
+0388 03AD
+0389 03AE
+038A 03AF
+038C 03CC
+038E 03CD
+038F 03CE
+0391 03B1
+0392 03B2
+0393 03B3
+0394 03B4
+0395 03B5
+0396 03B6
+0397 03B7
+0398 03B8
+0399 03B9
+039A 03BA
+039B 03BB
+039C 03BC
+039D 03BD
+039E 03BE
+039F 03BF
+03A0 03C0
+03A1 03C1
+03A3 03C3
+03A4 03C4
+03A5 03C5
+03A6 03C6
+03A7 03C7
+03A8 03C8
+03A9 03C9
+03AA 03CA
+03AB 03CB
+03C2 03C3
+03CF 03D7
+03D0 03B2
+03D1 03B8
+03D5 03C6
+03D6 03C0
+03D8 03D9
+03DA 03DB
+03DC 03DD
+03DE 03DF
+03E0 03E1
+03E2 03E3
+03E4 03E5
+03E6 03E7
+03E8 03E9
+03EA 03EB
+03EC 03ED
+03EE 03EF
+03F0 03BA
+03F1 03C1
+03F4 03B8
+03F5 03B5
+03F7 03F8
+03F9 03F2
+03FA 03FB
+03FD 037B
+03FE 037C
+03FF 037D
+0400 0450
+0401 0451
+0402 0452
+0403 0453
+0404 0454
+0405 0455
+0406 0456
+0407 0457
+0408 0458
+0409 0459
+040A 045A
+040B 045B
+040C 045C
+040D 045D
+040E 045E
+040F 045F
+0410 0430
+0411 0431
+0412 0432
+0413 0433
+0414 0434
+0415 0435
+0416 0436
+0417 0437
+0418 0438
+0419 0439
+041A 043A
+041B 043B
+041C 043C
+041D 043D
+041E 043E
+041F 043F
+0420 0440
+0421 0441
+0422 0442
+0423 0443
+0424 0444
+0425 0445
+0426 0446
+0427 0447
+0428 0448
+0429 0449
+042A 044A
+042B 044B
+042C 044C
+042D 044D
+042E 044E
+042F 044F
+0460 0461
+0462 0463
+0464 0465
+0466 0467
+0468 0469
+046A 046B
+046C 046D
+046E 046F
+0470 0471
+0472 0473
+0474 0475
+0476 0477
+0478 0479
+047A 047B
+047C 047D
+047E 047F
+0480 0481
+048A 048B
+048C 048D
+048E 048F
+0490 0491
+0492 0493
+0494 0495
+0496 0497
+0498 0499
+049A 049B
+049C 049D
+049E 049F
+04A0 04A1
+04A2 04A3
+04A4 04A5
+04A6 04A7
+04A8 04A9
+04AA 04AB
+04AC 04AD
+04AE 04AF
+04B0 04B1
+04B2 04B3
+04B4 04B5
+04B6 04B7
+04B8 04B9
+04BA 04BB
+04BC 04BD
+04BE 04BF
+04C0 04CF
+04C1 04C2
+04C3 04C4
+04C5 04C6
+04C7 04C8
+04C9 04CA
+04CB 04CC
+04CD 04CE
+04D0 04D1
+04D2 04D3
+04D4 04D5
+04D6 04D7
+04D8 04D9
+04DA 04DB
+04DC 04DD
+04DE 04DF
+04E0 04E1
+04E2 04E3
+04E4 04E5
+04E6 04E7
+04E8 04E9
+04EA 04EB
+04EC 04ED
+04EE 04EF
+04F0 04F1
+04F2 04F3
+04F4 04F5
+04F6 04F7
+04F8 04F9
+04FA 04FB
+04FC 04FD
+04FE 04FF
+0500 0501
+0502 0503
+0504 0505
+0506 0507
+0508 0509
+050A 050B
+050C 050D
+050E 050F
+0510 0511
+0512 0513
+0514 0515
+0516 0517
+0518 0519
+051A 051B
+051C 051D
+051E 051F
+0520 0521
+0522 0523
+0531 0561
+0532 0562
+0533 0563
+0534 0564
+0535 0565
+0536 0566
+0537 0567
+0538 0568
+0539 0569
+053A 056A
+053B 056B
+053C 056C
+053D 056D
+053E 056E
+053F 056F
+0540 0570
+0541 0571
+0542 0572
+0543 0573
+0544 0574
+0545 0575
+0546 0576
+0547 0577
+0548 0578
+0549 0579
+054A 057A
+054B 057B
+054C 057C
+054D 057D
+054E 057E
+054F 057F
+0550 0580
+0551 0581
+0552 0582
+0553 0583
+0554 0584
+0555 0585
+0556 0586
+10A0 2D00
+10A1 2D01
+10A2 2D02
+10A3 2D03
+10A4 2D04
+10A5 2D05
+10A6 2D06
+10A7 2D07
+10A8 2D08
+10A9 2D09
+10AA 2D0A
+10AB 2D0B
+10AC 2D0C
+10AD 2D0D
+10AE 2D0E
+10AF 2D0F
+10B0 2D10
+10B1 2D11
+10B2 2D12
+10B3 2D13
+10B4 2D14
+10B5 2D15
+10B6 2D16
+10B7 2D17
+10B8 2D18
+10B9 2D19
+10BA 2D1A
+10BB 2D1B
+10BC 2D1C
+10BD 2D1D
+10BE 2D1E
+10BF 2D1F
+10C0 2D20
+10C1 2D21
+10C2 2D22
+10C3 2D23
+10C4 2D24
+10C5 2D25
+1E00 1E01
+1E02 1E03
+1E04 1E05
+1E06 1E07
+1E08 1E09
+1E0A 1E0B
+1E0C 1E0D
+1E0E 1E0F
+1E10 1E11
+1E12 1E13
+1E14 1E15
+1E16 1E17
+1E18 1E19
+1E1A 1E1B
+1E1C 1E1D
+1E1E 1E1F
+1E20 1E21
+1E22 1E23
+1E24 1E25
+1E26 1E27
+1E28 1E29
+1E2A 1E2B
+1E2C 1E2D
+1E2E 1E2F
+1E30 1E31
+1E32 1E33
+1E34 1E35
+1E36 1E37
+1E38 1E39
+1E3A 1E3B
+1E3C 1E3D
+1E3E 1E3F
+1E40 1E41
+1E42 1E43
+1E44 1E45
+1E46 1E47
+1E48 1E49
+1E4A 1E4B
+1E4C 1E4D
+1E4E 1E4F
+1E50 1E51
+1E52 1E53
+1E54 1E55
+1E56 1E57
+1E58 1E59
+1E5A 1E5B
+1E5C 1E5D
+1E5E 1E5F
+1E60 1E61
+1E62 1E63
+1E64 1E65
+1E66 1E67
+1E68 1E69
+1E6A 1E6B
+1E6C 1E6D
+1E6E 1E6F
+1E70 1E71
+1E72 1E73
+1E74 1E75
+1E76 1E77
+1E78 1E79
+1E7A 1E7B
+1E7C 1E7D
+1E7E 1E7F
+1E80 1E81
+1E82 1E83
+1E84 1E85
+1E86 1E87
+1E88 1E89
+1E8A 1E8B
+1E8C 1E8D
+1E8E 1E8F
+1E90 1E91
+1E92 1E93
+1E94 1E95
+1E9B 1E61
+1EA0 1EA1
+1EA2 1EA3
+1EA4 1EA5
+1EA6 1EA7
+1EA8 1EA9
+1EAA 1EAB
+1EAC 1EAD
+1EAE 1EAF
+1EB0 1EB1
+1EB2 1EB3
+1EB4 1EB5
+1EB6 1EB7
+1EB8 1EB9
+1EBA 1EBB
+1EBC 1EBD
+1EBE 1EBF
+1EC0 1EC1
+1EC2 1EC3
+1EC4 1EC5
+1EC6 1EC7
+1EC8 1EC9
+1ECA 1ECB
+1ECC 1ECD
+1ECE 1ECF
+1ED0 1ED1
+1ED2 1ED3
+1ED4 1ED5
+1ED6 1ED7
+1ED8 1ED9
+1EDA 1EDB
+1EDC 1EDD
+1EDE 1EDF
+1EE0 1EE1
+1EE2 1EE3
+1EE4 1EE5
+1EE6 1EE7
+1EE8 1EE9
+1EEA 1EEB
+1EEC 1EED
+1EEE 1EEF
+1EF0 1EF1
+1EF2 1EF3
+1EF4 1EF5
+1EF6 1EF7
+1EF8 1EF9
+1EFA 1EFB
+1EFC 1EFD
+1EFE 1EFF
+1F08 1F00
+1F09 1F01
+1F0A 1F02
+1F0B 1F03
+1F0C 1F04
+1F0D 1F05
+1F0E 1F06
+1F0F 1F07
+1F18 1F10
+1F19 1F11
+1F1A 1F12
+1F1B 1F13
+1F1C 1F14
+1F1D 1F15
+1F28 1F20
+1F29 1F21
+1F2A 1F22
+1F2B 1F23
+1F2C 1F24
+1F2D 1F25
+1F2E 1F26
+1F2F 1F27
+1F38 1F30
+1F39 1F31
+1F3A 1F32
+1F3B 1F33
+1F3C 1F34
+1F3D 1F35
+1F3E 1F36
+1F3F 1F37
+1F48 1F40
+1F49 1F41
+1F4A 1F42
+1F4B 1F43
+1F4C 1F44
+1F4D 1F45
+1F59 1F51
+1F5B 1F53
+1F5D 1F55
+1F5F 1F57
+1F68 1F60
+1F69 1F61
+1F6A 1F62
+1F6B 1F63
+1F6C 1F64
+1F6D 1F65
+1F6E 1F66
+1F6F 1F67
+1FB8 1FB0
+1FB9 1FB1
+1FBA 1F70
+1FBB 1F71
+1FBE 03B9
+1FC8 1F72
+1FC9 1F73
+1FCA 1F74
+1FCB 1F75
+1FD8 1FD0
+1FD9 1FD1
+1FDA 1F76
+1FDB 1F77
+1FE8 1FE0
+1FE9 1FE1
+1FEA 1F7A
+1FEB 1F7B
+1FEC 1FE5
+1FF8 1F78
+1FF9 1F79
+1FFA 1F7C
+1FFB 1F7D
+2126 03C9
+212A 006B
+212B 00E5
+2132 214E
+2160 2170
+2161 2171
+2162 2172
+2163 2173
+2164 2174
+2165 2175
+2166 2176
+2167 2177
+2168 2178
+2169 2179
+216A 217A
+216B 217B
+216C 217C
+216D 217D
+216E 217E
+216F 217F
+2183 2184
+24B6 24D0
+24B7 24D1
+24B8 24D2
+24B9 24D3
+24BA 24D4
+24BB 24D5
+24BC 24D6
+24BD 24D7
+24BE 24D8
+24BF 24D9
+24C0 24DA
+24C1 24DB
+24C2 24DC
+24C3 24DD
+24C4 24DE
+24C5 24DF
+24C6 24E0
+24C7 24E1
+24C8 24E2
+24C9 24E3
+24CA 24E4
+24CB 24E5
+24CC 24E6
+24CD 24E7
+24CE 24E8
+24CF 24E9
+2C00 2C30
+2C01 2C31
+2C02 2C32
+2C03 2C33
+2C04 2C34
+2C05 2C35
+2C06 2C36
+2C07 2C37
+2C08 2C38
+2C09 2C39
+2C0A 2C3A
+2C0B 2C3B
+2C0C 2C3C
+2C0D 2C3D
+2C0E 2C3E
+2C0F 2C3F
+2C10 2C40
+2C11 2C41
+2C12 2C42
+2C13 2C43
+2C14 2C44
+2C15 2C45
+2C16 2C46
+2C17 2C47
+2C18 2C48
+2C19 2C49
+2C1A 2C4A
+2C1B 2C4B
+2C1C 2C4C
+2C1D 2C4D
+2C1E 2C4E
+2C1F 2C4F
+2C20 2C50
+2C21 2C51
+2C22 2C52
+2C23 2C53
+2C24 2C54
+2C25 2C55
+2C26 2C56
+2C27 2C57
+2C28 2C58
+2C29 2C59
+2C2A 2C5A
+2C2B 2C5B
+2C2C 2C5C
+2C2D 2C5D
+2C2E 2C5E
+2C60 2C61
+2C62 026B
+2C63 1D7D
+2C64 027D
+2C67 2C68
+2C69 2C6A
+2C6B 2C6C
+2C6D 0251
+2C6E 0271
+2C6F 0250
+2C72 2C73
+2C75 2C76
+2C80 2C81
+2C82 2C83
+2C84 2C85
+2C86 2C87
+2C88 2C89
+2C8A 2C8B
+2C8C 2C8D
+2C8E 2C8F
+2C90 2C91
+2C92 2C93
+2C94 2C95
+2C96 2C97
+2C98 2C99
+2C9A 2C9B
+2C9C 2C9D
+2C9E 2C9F
+2CA0 2CA1
+2CA2 2CA3
+2CA4 2CA5
+2CA6 2CA7
+2CA8 2CA9
+2CAA 2CAB
+2CAC 2CAD
+2CAE 2CAF
+2CB0 2CB1
+2CB2 2CB3
+2CB4 2CB5
+2CB6 2CB7
+2CB8 2CB9
+2CBA 2CBB
+2CBC 2CBD
+2CBE 2CBF
+2CC0 2CC1
+2CC2 2CC3
+2CC4 2CC5
+2CC6 2CC7
+2CC8 2CC9
+2CCA 2CCB
+2CCC 2CCD
+2CCE 2CCF
+2CD0 2CD1
+2CD2 2CD3
+2CD4 2CD5
+2CD6 2CD7
+2CD8 2CD9
+2CDA 2CDB
+2CDC 2CDD
+2CDE 2CDF
+2CE0 2CE1
+2CE2 2CE3
+A640 A641
+A642 A643
+A644 A645
+A646 A647
+A648 A649
+A64A A64B
+A64C A64D
+A64E A64F
+A650 A651
+A652 A653
+A654 A655
+A656 A657
+A658 A659
+A65A A65B
+A65C A65D
+A65E A65F
+A662 A663
+A664 A665
+A666 A667
+A668 A669
+A66A A66B
+A66C A66D
+A680 A681
+A682 A683
+A684 A685
+A686 A687
+A688 A689
+A68A A68B
+A68C A68D
+A68E A68F
+A690 A691
+A692 A693
+A694 A695
+A696 A697
+A722 A723
+A724 A725
+A726 A727
+A728 A729
+A72A A72B
+A72C A72D
+A72E A72F
+A732 A733
+A734 A735
+A736 A737
+A738 A739
+A73A A73B
+A73C A73D
+A73E A73F
+A740 A741
+A742 A743
+A744 A745
+A746 A747
+A748 A749
+A74A A74B
+A74C A74D
+A74E A74F
+A750 A751
+A752 A753
+A754 A755
+A756 A757
+A758 A759
+A75A A75B
+A75C A75D
+A75E A75F
+A760 A761
+A762 A763
+A764 A765
+A766 A767
+A768 A769
+A76A A76B
+A76C A76D
+A76E A76F
+A779 A77A
+A77B A77C
+A77D 1D79
+A77E A77F
+A780 A781
+A782 A783
+A784 A785
+A786 A787
+A78B A78C
+FF21 FF41
+FF22 FF42
+FF23 FF43
+FF24 FF44
+FF25 FF45
+FF26 FF46
+FF27 FF47
+FF28 FF48
+FF29 FF49
+FF2A FF4A
+FF2B FF4B
+FF2C FF4C
+FF2D FF4D
+FF2E FF4E
+FF2F FF4F
+FF30 FF50
+FF31 FF51
+FF32 FF52
+FF33 FF53
+FF34 FF54
+FF35 FF55
+FF36 FF56
+FF37 FF57
+FF38 FF58
+FF39 FF59
+FF3A FF5A
+10400 10428
+10401 10429
+10402 1042A
+10403 1042B
+10404 1042C
+10405 1042D
+10406 1042E
+10407 1042F
+10408 10430
+10409 10431
+1040A 10432
+1040B 10433
+1040C 10434
+1040D 10435
+1040E 10436
+1040F 10437
+10410 10438
+10411 10439
+10412 1043A
+10413 1043B
+10414 1043C
+10415 1043D
+10416 1043E
+10417 1043F
+10418 10440
+10419 10441
+1041A 10442
+1041B 10443
+1041C 10444
+1041D 10445
+1041E 10446
+1041F 10447
+10420 10448
+10421 10449
+10422 1044A
+10423 1044B
+10424 1044C
+10425 1044D
+10426 1044E
+10427 1044F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/To/Lower.pl b/Master/tlpkg/tlperl.straw/lib/unicore/To/Lower.pl
new file mode 100755
index 00000000000..d7b793f01ee
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/To/Lower.pl
@@ -0,0 +1,1039 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+
+# The key: UTF-8 _bytes_, the value: UTF-8 (speed hack)
+%utf8::ToSpecLower =
+(
+"\xC4\xB0" => "\x{0069}\x{0307}",
+"\xE1\xBE\x88" => "\x{1F80}",
+"\xE1\xBE\x89" => "\x{1F81}",
+"\xE1\xBE\x8A" => "\x{1F82}",
+"\xE1\xBE\x8B" => "\x{1F83}",
+"\xE1\xBE\x8C" => "\x{1F84}",
+"\xE1\xBE\x8D" => "\x{1F85}",
+"\xE1\xBE\x8E" => "\x{1F86}",
+"\xE1\xBE\x8F" => "\x{1F87}",
+"\xE1\xBE\x98" => "\x{1F90}",
+"\xE1\xBE\x99" => "\x{1F91}",
+"\xE1\xBE\x9A" => "\x{1F92}",
+"\xE1\xBE\x9B" => "\x{1F93}",
+"\xE1\xBE\x9C" => "\x{1F94}",
+"\xE1\xBE\x9D" => "\x{1F95}",
+"\xE1\xBE\x9E" => "\x{1F96}",
+"\xE1\xBE\x9F" => "\x{1F97}",
+"\xE1\xBE\xA8" => "\x{1FA0}",
+"\xE1\xBE\xA9" => "\x{1FA1}",
+"\xE1\xBE\xAA" => "\x{1FA2}",
+"\xE1\xBE\xAB" => "\x{1FA3}",
+"\xE1\xBE\xAC" => "\x{1FA4}",
+"\xE1\xBE\xAD" => "\x{1FA5}",
+"\xE1\xBE\xAE" => "\x{1FA6}",
+"\xE1\xBE\xAF" => "\x{1FA7}",
+"\xE1\xBE\xBC" => "\x{1FB3}",
+"\xE1\xBF\x8C" => "\x{1FC3}",
+"\xE1\xBF\xBC" => "\x{1FF3}",
+);
+
+return <<'END';
+0041 0061
+0042 0062
+0043 0063
+0044 0064
+0045 0065
+0046 0066
+0047 0067
+0048 0068
+0049 0069
+004A 006A
+004B 006B
+004C 006C
+004D 006D
+004E 006E
+004F 006F
+0050 0070
+0051 0071
+0052 0072
+0053 0073
+0054 0074
+0055 0075
+0056 0076
+0057 0077
+0058 0078
+0059 0079
+005A 007A
+00C0 00E0
+00C1 00E1
+00C2 00E2
+00C3 00E3
+00C4 00E4
+00C5 00E5
+00C6 00E6
+00C7 00E7
+00C8 00E8
+00C9 00E9
+00CA 00EA
+00CB 00EB
+00CC 00EC
+00CD 00ED
+00CE 00EE
+00CF 00EF
+00D0 00F0
+00D1 00F1
+00D2 00F2
+00D3 00F3
+00D4 00F4
+00D5 00F5
+00D6 00F6
+00D8 00F8
+00D9 00F9
+00DA 00FA
+00DB 00FB
+00DC 00FC
+00DD 00FD
+00DE 00FE
+0100 0101
+0102 0103
+0104 0105
+0106 0107
+0108 0109
+010A 010B
+010C 010D
+010E 010F
+0110 0111
+0112 0113
+0114 0115
+0116 0117
+0118 0119
+011A 011B
+011C 011D
+011E 011F
+0120 0121
+0122 0123
+0124 0125
+0126 0127
+0128 0129
+012A 012B
+012C 012D
+012E 012F
+0132 0133
+0134 0135
+0136 0137
+0139 013A
+013B 013C
+013D 013E
+013F 0140
+0141 0142
+0143 0144
+0145 0146
+0147 0148
+014A 014B
+014C 014D
+014E 014F
+0150 0151
+0152 0153
+0154 0155
+0156 0157
+0158 0159
+015A 015B
+015C 015D
+015E 015F
+0160 0161
+0162 0163
+0164 0165
+0166 0167
+0168 0169
+016A 016B
+016C 016D
+016E 016F
+0170 0171
+0172 0173
+0174 0175
+0176 0177
+0178 00FF
+0179 017A
+017B 017C
+017D 017E
+0181 0253
+0182 0183
+0184 0185
+0186 0254
+0187 0188
+0189 0256
+018A 0257
+018B 018C
+018E 01DD
+018F 0259
+0190 025B
+0191 0192
+0193 0260
+0194 0263
+0196 0269
+0197 0268
+0198 0199
+019C 026F
+019D 0272
+019F 0275
+01A0 01A1
+01A2 01A3
+01A4 01A5
+01A6 0280
+01A7 01A8
+01A9 0283
+01AC 01AD
+01AE 0288
+01AF 01B0
+01B1 028A
+01B2 028B
+01B3 01B4
+01B5 01B6
+01B7 0292
+01B8 01B9
+01BC 01BD
+01C4 01C6
+01C5 01C6
+01C7 01C9
+01C8 01C9
+01CA 01CC
+01CB 01CC
+01CD 01CE
+01CF 01D0
+01D1 01D2
+01D3 01D4
+01D5 01D6
+01D7 01D8
+01D9 01DA
+01DB 01DC
+01DE 01DF
+01E0 01E1
+01E2 01E3
+01E4 01E5
+01E6 01E7
+01E8 01E9
+01EA 01EB
+01EC 01ED
+01EE 01EF
+01F1 01F3
+01F2 01F3
+01F4 01F5
+01F6 0195
+01F7 01BF
+01F8 01F9
+01FA 01FB
+01FC 01FD
+01FE 01FF
+0200 0201
+0202 0203
+0204 0205
+0206 0207
+0208 0209
+020A 020B
+020C 020D
+020E 020F
+0210 0211
+0212 0213
+0214 0215
+0216 0217
+0218 0219
+021A 021B
+021C 021D
+021E 021F
+0220 019E
+0222 0223
+0224 0225
+0226 0227
+0228 0229
+022A 022B
+022C 022D
+022E 022F
+0230 0231
+0232 0233
+023A 2C65
+023B 023C
+023D 019A
+023E 2C66
+0241 0242
+0243 0180
+0244 0289
+0245 028C
+0246 0247
+0248 0249
+024A 024B
+024C 024D
+024E 024F
+0370 0371
+0372 0373
+0376 0377
+0386 03AC
+0388 03AD
+0389 03AE
+038A 03AF
+038C 03CC
+038E 03CD
+038F 03CE
+0391 03B1
+0392 03B2
+0393 03B3
+0394 03B4
+0395 03B5
+0396 03B6
+0397 03B7
+0398 03B8
+0399 03B9
+039A 03BA
+039B 03BB
+039C 03BC
+039D 03BD
+039E 03BE
+039F 03BF
+03A0 03C0
+03A1 03C1
+03A3 03C3
+03A4 03C4
+03A5 03C5
+03A6 03C6
+03A7 03C7
+03A8 03C8
+03A9 03C9
+03AA 03CA
+03AB 03CB
+03CF 03D7
+03D8 03D9
+03DA 03DB
+03DC 03DD
+03DE 03DF
+03E0 03E1
+03E2 03E3
+03E4 03E5
+03E6 03E7
+03E8 03E9
+03EA 03EB
+03EC 03ED
+03EE 03EF
+03F4 03B8
+03F7 03F8
+03F9 03F2
+03FA 03FB
+03FD 037B
+03FE 037C
+03FF 037D
+0400 0450
+0401 0451
+0402 0452
+0403 0453
+0404 0454
+0405 0455
+0406 0456
+0407 0457
+0408 0458
+0409 0459
+040A 045A
+040B 045B
+040C 045C
+040D 045D
+040E 045E
+040F 045F
+0410 0430
+0411 0431
+0412 0432
+0413 0433
+0414 0434
+0415 0435
+0416 0436
+0417 0437
+0418 0438
+0419 0439
+041A 043A
+041B 043B
+041C 043C
+041D 043D
+041E 043E
+041F 043F
+0420 0440
+0421 0441
+0422 0442
+0423 0443
+0424 0444
+0425 0445
+0426 0446
+0427 0447
+0428 0448
+0429 0449
+042A 044A
+042B 044B
+042C 044C
+042D 044D
+042E 044E
+042F 044F
+0460 0461
+0462 0463
+0464 0465
+0466 0467
+0468 0469
+046A 046B
+046C 046D
+046E 046F
+0470 0471
+0472 0473
+0474 0475
+0476 0477
+0478 0479
+047A 047B
+047C 047D
+047E 047F
+0480 0481
+048A 048B
+048C 048D
+048E 048F
+0490 0491
+0492 0493
+0494 0495
+0496 0497
+0498 0499
+049A 049B
+049C 049D
+049E 049F
+04A0 04A1
+04A2 04A3
+04A4 04A5
+04A6 04A7
+04A8 04A9
+04AA 04AB
+04AC 04AD
+04AE 04AF
+04B0 04B1
+04B2 04B3
+04B4 04B5
+04B6 04B7
+04B8 04B9
+04BA 04BB
+04BC 04BD
+04BE 04BF
+04C0 04CF
+04C1 04C2
+04C3 04C4
+04C5 04C6
+04C7 04C8
+04C9 04CA
+04CB 04CC
+04CD 04CE
+04D0 04D1
+04D2 04D3
+04D4 04D5
+04D6 04D7
+04D8 04D9
+04DA 04DB
+04DC 04DD
+04DE 04DF
+04E0 04E1
+04E2 04E3
+04E4 04E5
+04E6 04E7
+04E8 04E9
+04EA 04EB
+04EC 04ED
+04EE 04EF
+04F0 04F1
+04F2 04F3
+04F4 04F5
+04F6 04F7
+04F8 04F9
+04FA 04FB
+04FC 04FD
+04FE 04FF
+0500 0501
+0502 0503
+0504 0505
+0506 0507
+0508 0509
+050A 050B
+050C 050D
+050E 050F
+0510 0511
+0512 0513
+0514 0515
+0516 0517
+0518 0519
+051A 051B
+051C 051D
+051E 051F
+0520 0521
+0522 0523
+0531 0561
+0532 0562
+0533 0563
+0534 0564
+0535 0565
+0536 0566
+0537 0567
+0538 0568
+0539 0569
+053A 056A
+053B 056B
+053C 056C
+053D 056D
+053E 056E
+053F 056F
+0540 0570
+0541 0571
+0542 0572
+0543 0573
+0544 0574
+0545 0575
+0546 0576
+0547 0577
+0548 0578
+0549 0579
+054A 057A
+054B 057B
+054C 057C
+054D 057D
+054E 057E
+054F 057F
+0550 0580
+0551 0581
+0552 0582
+0553 0583
+0554 0584
+0555 0585
+0556 0586
+10A0 2D00
+10A1 2D01
+10A2 2D02
+10A3 2D03
+10A4 2D04
+10A5 2D05
+10A6 2D06
+10A7 2D07
+10A8 2D08
+10A9 2D09
+10AA 2D0A
+10AB 2D0B
+10AC 2D0C
+10AD 2D0D
+10AE 2D0E
+10AF 2D0F
+10B0 2D10
+10B1 2D11
+10B2 2D12
+10B3 2D13
+10B4 2D14
+10B5 2D15
+10B6 2D16
+10B7 2D17
+10B8 2D18
+10B9 2D19
+10BA 2D1A
+10BB 2D1B
+10BC 2D1C
+10BD 2D1D
+10BE 2D1E
+10BF 2D1F
+10C0 2D20
+10C1 2D21
+10C2 2D22
+10C3 2D23
+10C4 2D24
+10C5 2D25
+1E00 1E01
+1E02 1E03
+1E04 1E05
+1E06 1E07
+1E08 1E09
+1E0A 1E0B
+1E0C 1E0D
+1E0E 1E0F
+1E10 1E11
+1E12 1E13
+1E14 1E15
+1E16 1E17
+1E18 1E19
+1E1A 1E1B
+1E1C 1E1D
+1E1E 1E1F
+1E20 1E21
+1E22 1E23
+1E24 1E25
+1E26 1E27
+1E28 1E29
+1E2A 1E2B
+1E2C 1E2D
+1E2E 1E2F
+1E30 1E31
+1E32 1E33
+1E34 1E35
+1E36 1E37
+1E38 1E39
+1E3A 1E3B
+1E3C 1E3D
+1E3E 1E3F
+1E40 1E41
+1E42 1E43
+1E44 1E45
+1E46 1E47
+1E48 1E49
+1E4A 1E4B
+1E4C 1E4D
+1E4E 1E4F
+1E50 1E51
+1E52 1E53
+1E54 1E55
+1E56 1E57
+1E58 1E59
+1E5A 1E5B
+1E5C 1E5D
+1E5E 1E5F
+1E60 1E61
+1E62 1E63
+1E64 1E65
+1E66 1E67
+1E68 1E69
+1E6A 1E6B
+1E6C 1E6D
+1E6E 1E6F
+1E70 1E71
+1E72 1E73
+1E74 1E75
+1E76 1E77
+1E78 1E79
+1E7A 1E7B
+1E7C 1E7D
+1E7E 1E7F
+1E80 1E81
+1E82 1E83
+1E84 1E85
+1E86 1E87
+1E88 1E89
+1E8A 1E8B
+1E8C 1E8D
+1E8E 1E8F
+1E90 1E91
+1E92 1E93
+1E94 1E95
+1E9E 00DF
+1EA0 1EA1
+1EA2 1EA3
+1EA4 1EA5
+1EA6 1EA7
+1EA8 1EA9
+1EAA 1EAB
+1EAC 1EAD
+1EAE 1EAF
+1EB0 1EB1
+1EB2 1EB3
+1EB4 1EB5
+1EB6 1EB7
+1EB8 1EB9
+1EBA 1EBB
+1EBC 1EBD
+1EBE 1EBF
+1EC0 1EC1
+1EC2 1EC3
+1EC4 1EC5
+1EC6 1EC7
+1EC8 1EC9
+1ECA 1ECB
+1ECC 1ECD
+1ECE 1ECF
+1ED0 1ED1
+1ED2 1ED3
+1ED4 1ED5
+1ED6 1ED7
+1ED8 1ED9
+1EDA 1EDB
+1EDC 1EDD
+1EDE 1EDF
+1EE0 1EE1
+1EE2 1EE3
+1EE4 1EE5
+1EE6 1EE7
+1EE8 1EE9
+1EEA 1EEB
+1EEC 1EED
+1EEE 1EEF
+1EF0 1EF1
+1EF2 1EF3
+1EF4 1EF5
+1EF6 1EF7
+1EF8 1EF9
+1EFA 1EFB
+1EFC 1EFD
+1EFE 1EFF
+1F08 1F00
+1F09 1F01
+1F0A 1F02
+1F0B 1F03
+1F0C 1F04
+1F0D 1F05
+1F0E 1F06
+1F0F 1F07
+1F18 1F10
+1F19 1F11
+1F1A 1F12
+1F1B 1F13
+1F1C 1F14
+1F1D 1F15
+1F28 1F20
+1F29 1F21
+1F2A 1F22
+1F2B 1F23
+1F2C 1F24
+1F2D 1F25
+1F2E 1F26
+1F2F 1F27
+1F38 1F30
+1F39 1F31
+1F3A 1F32
+1F3B 1F33
+1F3C 1F34
+1F3D 1F35
+1F3E 1F36
+1F3F 1F37
+1F48 1F40
+1F49 1F41
+1F4A 1F42
+1F4B 1F43
+1F4C 1F44
+1F4D 1F45
+1F59 1F51
+1F5B 1F53
+1F5D 1F55
+1F5F 1F57
+1F68 1F60
+1F69 1F61
+1F6A 1F62
+1F6B 1F63
+1F6C 1F64
+1F6D 1F65
+1F6E 1F66
+1F6F 1F67
+1FB8 1FB0
+1FB9 1FB1
+1FBA 1F70
+1FBB 1F71
+1FC8 1F72
+1FC9 1F73
+1FCA 1F74
+1FCB 1F75
+1FD8 1FD0
+1FD9 1FD1
+1FDA 1F76
+1FDB 1F77
+1FE8 1FE0
+1FE9 1FE1
+1FEA 1F7A
+1FEB 1F7B
+1FEC 1FE5
+1FF8 1F78
+1FF9 1F79
+1FFA 1F7C
+1FFB 1F7D
+2126 03C9
+212A 006B
+212B 00E5
+2132 214E
+2160 2170
+2161 2171
+2162 2172
+2163 2173
+2164 2174
+2165 2175
+2166 2176
+2167 2177
+2168 2178
+2169 2179
+216A 217A
+216B 217B
+216C 217C
+216D 217D
+216E 217E
+216F 217F
+2183 2184
+24B6 24D0
+24B7 24D1
+24B8 24D2
+24B9 24D3
+24BA 24D4
+24BB 24D5
+24BC 24D6
+24BD 24D7
+24BE 24D8
+24BF 24D9
+24C0 24DA
+24C1 24DB
+24C2 24DC
+24C3 24DD
+24C4 24DE
+24C5 24DF
+24C6 24E0
+24C7 24E1
+24C8 24E2
+24C9 24E3
+24CA 24E4
+24CB 24E5
+24CC 24E6
+24CD 24E7
+24CE 24E8
+24CF 24E9
+2C00 2C30
+2C01 2C31
+2C02 2C32
+2C03 2C33
+2C04 2C34
+2C05 2C35
+2C06 2C36
+2C07 2C37
+2C08 2C38
+2C09 2C39
+2C0A 2C3A
+2C0B 2C3B
+2C0C 2C3C
+2C0D 2C3D
+2C0E 2C3E
+2C0F 2C3F
+2C10 2C40
+2C11 2C41
+2C12 2C42
+2C13 2C43
+2C14 2C44
+2C15 2C45
+2C16 2C46
+2C17 2C47
+2C18 2C48
+2C19 2C49
+2C1A 2C4A
+2C1B 2C4B
+2C1C 2C4C
+2C1D 2C4D
+2C1E 2C4E
+2C1F 2C4F
+2C20 2C50
+2C21 2C51
+2C22 2C52
+2C23 2C53
+2C24 2C54
+2C25 2C55
+2C26 2C56
+2C27 2C57
+2C28 2C58
+2C29 2C59
+2C2A 2C5A
+2C2B 2C5B
+2C2C 2C5C
+2C2D 2C5D
+2C2E 2C5E
+2C60 2C61
+2C62 026B
+2C63 1D7D
+2C64 027D
+2C67 2C68
+2C69 2C6A
+2C6B 2C6C
+2C6D 0251
+2C6E 0271
+2C6F 0250
+2C72 2C73
+2C75 2C76
+2C80 2C81
+2C82 2C83
+2C84 2C85
+2C86 2C87
+2C88 2C89
+2C8A 2C8B
+2C8C 2C8D
+2C8E 2C8F
+2C90 2C91
+2C92 2C93
+2C94 2C95
+2C96 2C97
+2C98 2C99
+2C9A 2C9B
+2C9C 2C9D
+2C9E 2C9F
+2CA0 2CA1
+2CA2 2CA3
+2CA4 2CA5
+2CA6 2CA7
+2CA8 2CA9
+2CAA 2CAB
+2CAC 2CAD
+2CAE 2CAF
+2CB0 2CB1
+2CB2 2CB3
+2CB4 2CB5
+2CB6 2CB7
+2CB8 2CB9
+2CBA 2CBB
+2CBC 2CBD
+2CBE 2CBF
+2CC0 2CC1
+2CC2 2CC3
+2CC4 2CC5
+2CC6 2CC7
+2CC8 2CC9
+2CCA 2CCB
+2CCC 2CCD
+2CCE 2CCF
+2CD0 2CD1
+2CD2 2CD3
+2CD4 2CD5
+2CD6 2CD7
+2CD8 2CD9
+2CDA 2CDB
+2CDC 2CDD
+2CDE 2CDF
+2CE0 2CE1
+2CE2 2CE3
+A640 A641
+A642 A643
+A644 A645
+A646 A647
+A648 A649
+A64A A64B
+A64C A64D
+A64E A64F
+A650 A651
+A652 A653
+A654 A655
+A656 A657
+A658 A659
+A65A A65B
+A65C A65D
+A65E A65F
+A662 A663
+A664 A665
+A666 A667
+A668 A669
+A66A A66B
+A66C A66D
+A680 A681
+A682 A683
+A684 A685
+A686 A687
+A688 A689
+A68A A68B
+A68C A68D
+A68E A68F
+A690 A691
+A692 A693
+A694 A695
+A696 A697
+A722 A723
+A724 A725
+A726 A727
+A728 A729
+A72A A72B
+A72C A72D
+A72E A72F
+A732 A733
+A734 A735
+A736 A737
+A738 A739
+A73A A73B
+A73C A73D
+A73E A73F
+A740 A741
+A742 A743
+A744 A745
+A746 A747
+A748 A749
+A74A A74B
+A74C A74D
+A74E A74F
+A750 A751
+A752 A753
+A754 A755
+A756 A757
+A758 A759
+A75A A75B
+A75C A75D
+A75E A75F
+A760 A761
+A762 A763
+A764 A765
+A766 A767
+A768 A769
+A76A A76B
+A76C A76D
+A76E A76F
+A779 A77A
+A77B A77C
+A77D 1D79
+A77E A77F
+A780 A781
+A782 A783
+A784 A785
+A786 A787
+A78B A78C
+FF21 FF41
+FF22 FF42
+FF23 FF43
+FF24 FF44
+FF25 FF45
+FF26 FF46
+FF27 FF47
+FF28 FF48
+FF29 FF49
+FF2A FF4A
+FF2B FF4B
+FF2C FF4C
+FF2D FF4D
+FF2E FF4E
+FF2F FF4F
+FF30 FF50
+FF31 FF51
+FF32 FF52
+FF33 FF53
+FF34 FF54
+FF35 FF55
+FF36 FF56
+FF37 FF57
+FF38 FF58
+FF39 FF59
+FF3A FF5A
+10400 10428
+10401 10429
+10402 1042A
+10403 1042B
+10404 1042C
+10405 1042D
+10406 1042E
+10407 1042F
+10408 10430
+10409 10431
+1040A 10432
+1040B 10433
+1040C 10434
+1040D 10435
+1040E 10436
+1040F 10437
+10410 10438
+10411 10439
+10412 1043A
+10413 1043B
+10414 1043C
+10415 1043D
+10416 1043E
+10417 1043F
+10418 10440
+10419 10441
+1041A 10442
+1041B 10443
+1041C 10444
+1041D 10445
+1041E 10446
+1041F 10447
+10420 10448
+10421 10449
+10422 1044A
+10423 1044B
+10424 1044C
+10425 1044D
+10426 1044E
+10427 1044F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/To/Title.pl b/Master/tlpkg/tlperl.straw/lib/unicore/To/Title.pl
new file mode 100755
index 00000000000..3e6fad5616f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/To/Title.pl
@@ -0,0 +1,1099 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+
+# The key: UTF-8 _bytes_, the value: UTF-8 (speed hack)
+%utf8::ToSpecTitle =
+(
+"\xC3\x9F" => "\x{0053}\x{0073}",
+"\xC5\x89" => "\x{02BC}\x{004E}",
+"\xC7\xB0" => "\x{004A}\x{030C}",
+"\xCE\x90" => "\x{0399}\x{0308}\x{0301}",
+"\xCE\xB0" => "\x{03A5}\x{0308}\x{0301}",
+"\xD6\x87" => "\x{0535}\x{0582}",
+"\xE1\xBA\x96" => "\x{0048}\x{0331}",
+"\xE1\xBA\x97" => "\x{0054}\x{0308}",
+"\xE1\xBA\x98" => "\x{0057}\x{030A}",
+"\xE1\xBA\x99" => "\x{0059}\x{030A}",
+"\xE1\xBA\x9A" => "\x{0041}\x{02BE}",
+"\xE1\xBD\x90" => "\x{03A5}\x{0313}",
+"\xE1\xBD\x92" => "\x{03A5}\x{0313}\x{0300}",
+"\xE1\xBD\x94" => "\x{03A5}\x{0313}\x{0301}",
+"\xE1\xBD\x96" => "\x{03A5}\x{0313}\x{0342}",
+"\xE1\xBE\x80" => "\x{1F88}",
+"\xE1\xBE\x81" => "\x{1F89}",
+"\xE1\xBE\x82" => "\x{1F8A}",
+"\xE1\xBE\x83" => "\x{1F8B}",
+"\xE1\xBE\x84" => "\x{1F8C}",
+"\xE1\xBE\x85" => "\x{1F8D}",
+"\xE1\xBE\x86" => "\x{1F8E}",
+"\xE1\xBE\x87" => "\x{1F8F}",
+"\xE1\xBE\x90" => "\x{1F98}",
+"\xE1\xBE\x91" => "\x{1F99}",
+"\xE1\xBE\x92" => "\x{1F9A}",
+"\xE1\xBE\x93" => "\x{1F9B}",
+"\xE1\xBE\x94" => "\x{1F9C}",
+"\xE1\xBE\x95" => "\x{1F9D}",
+"\xE1\xBE\x96" => "\x{1F9E}",
+"\xE1\xBE\x97" => "\x{1F9F}",
+"\xE1\xBE\xA0" => "\x{1FA8}",
+"\xE1\xBE\xA1" => "\x{1FA9}",
+"\xE1\xBE\xA2" => "\x{1FAA}",
+"\xE1\xBE\xA3" => "\x{1FAB}",
+"\xE1\xBE\xA4" => "\x{1FAC}",
+"\xE1\xBE\xA5" => "\x{1FAD}",
+"\xE1\xBE\xA6" => "\x{1FAE}",
+"\xE1\xBE\xA7" => "\x{1FAF}",
+"\xE1\xBE\xB2" => "\x{1FBA}\x{0345}",
+"\xE1\xBE\xB3" => "\x{1FBC}",
+"\xE1\xBE\xB4" => "\x{0386}\x{0345}",
+"\xE1\xBE\xB6" => "\x{0391}\x{0342}",
+"\xE1\xBE\xB7" => "\x{0391}\x{0342}\x{0345}",
+"\xE1\xBF\x82" => "\x{1FCA}\x{0345}",
+"\xE1\xBF\x83" => "\x{1FCC}",
+"\xE1\xBF\x84" => "\x{0389}\x{0345}",
+"\xE1\xBF\x86" => "\x{0397}\x{0342}",
+"\xE1\xBF\x87" => "\x{0397}\x{0342}\x{0345}",
+"\xE1\xBF\x92" => "\x{0399}\x{0308}\x{0300}",
+"\xE1\xBF\x93" => "\x{0399}\x{0308}\x{0301}",
+"\xE1\xBF\x96" => "\x{0399}\x{0342}",
+"\xE1\xBF\x97" => "\x{0399}\x{0308}\x{0342}",
+"\xE1\xBF\xA2" => "\x{03A5}\x{0308}\x{0300}",
+"\xE1\xBF\xA3" => "\x{03A5}\x{0308}\x{0301}",
+"\xE1\xBF\xA4" => "\x{03A1}\x{0313}",
+"\xE1\xBF\xA6" => "\x{03A5}\x{0342}",
+"\xE1\xBF\xA7" => "\x{03A5}\x{0308}\x{0342}",
+"\xE1\xBF\xB2" => "\x{1FFA}\x{0345}",
+"\xE1\xBF\xB3" => "\x{1FFC}",
+"\xE1\xBF\xB4" => "\x{038F}\x{0345}",
+"\xE1\xBF\xB6" => "\x{03A9}\x{0342}",
+"\xE1\xBF\xB7" => "\x{03A9}\x{0342}\x{0345}",
+"\xEF\xAC\x80" => "\x{0046}\x{0066}",
+"\xEF\xAC\x81" => "\x{0046}\x{0069}",
+"\xEF\xAC\x82" => "\x{0046}\x{006C}",
+"\xEF\xAC\x83" => "\x{0046}\x{0066}\x{0069}",
+"\xEF\xAC\x84" => "\x{0046}\x{0066}\x{006C}",
+"\xEF\xAC\x85" => "\x{0053}\x{0074}",
+"\xEF\xAC\x86" => "\x{0053}\x{0074}",
+"\xEF\xAC\x93" => "\x{0544}\x{0576}",
+"\xEF\xAC\x94" => "\x{0544}\x{0565}",
+"\xEF\xAC\x95" => "\x{0544}\x{056B}",
+"\xEF\xAC\x96" => "\x{054E}\x{0576}",
+"\xEF\xAC\x97" => "\x{0544}\x{056D}",
+);
+
+return <<'END';
+0061 0041
+0062 0042
+0063 0043
+0064 0044
+0065 0045
+0066 0046
+0067 0047
+0068 0048
+0069 0049
+006A 004A
+006B 004B
+006C 004C
+006D 004D
+006E 004E
+006F 004F
+0070 0050
+0071 0051
+0072 0052
+0073 0053
+0074 0054
+0075 0055
+0076 0056
+0077 0057
+0078 0058
+0079 0059
+007A 005A
+00B5 039C
+00E0 00C0
+00E1 00C1
+00E2 00C2
+00E3 00C3
+00E4 00C4
+00E5 00C5
+00E6 00C6
+00E7 00C7
+00E8 00C8
+00E9 00C9
+00EA 00CA
+00EB 00CB
+00EC 00CC
+00ED 00CD
+00EE 00CE
+00EF 00CF
+00F0 00D0
+00F1 00D1
+00F2 00D2
+00F3 00D3
+00F4 00D4
+00F5 00D5
+00F6 00D6
+00F8 00D8
+00F9 00D9
+00FA 00DA
+00FB 00DB
+00FC 00DC
+00FD 00DD
+00FE 00DE
+00FF 0178
+0101 0100
+0103 0102
+0105 0104
+0107 0106
+0109 0108
+010B 010A
+010D 010C
+010F 010E
+0111 0110
+0113 0112
+0115 0114
+0117 0116
+0119 0118
+011B 011A
+011D 011C
+011F 011E
+0121 0120
+0123 0122
+0125 0124
+0127 0126
+0129 0128
+012B 012A
+012D 012C
+012F 012E
+0131 0049
+0133 0132
+0135 0134
+0137 0136
+013A 0139
+013C 013B
+013E 013D
+0140 013F
+0142 0141
+0144 0143
+0146 0145
+0148 0147
+014B 014A
+014D 014C
+014F 014E
+0151 0150
+0153 0152
+0155 0154
+0157 0156
+0159 0158
+015B 015A
+015D 015C
+015F 015E
+0161 0160
+0163 0162
+0165 0164
+0167 0166
+0169 0168
+016B 016A
+016D 016C
+016F 016E
+0171 0170
+0173 0172
+0175 0174
+0177 0176
+017A 0179
+017C 017B
+017E 017D
+017F 0053
+0180 0243
+0183 0182
+0185 0184
+0188 0187
+018C 018B
+0192 0191
+0195 01F6
+0199 0198
+019A 023D
+019E 0220
+01A1 01A0
+01A3 01A2
+01A5 01A4
+01A8 01A7
+01AD 01AC
+01B0 01AF
+01B4 01B3
+01B6 01B5
+01B9 01B8
+01BD 01BC
+01BF 01F7
+01C4 01C5
+01C5 01C5
+01C6 01C5
+01C7 01C8
+01C8 01C8
+01C9 01C8
+01CA 01CB
+01CB 01CB
+01CC 01CB
+01CE 01CD
+01D0 01CF
+01D2 01D1
+01D4 01D3
+01D6 01D5
+01D8 01D7
+01DA 01D9
+01DC 01DB
+01DD 018E
+01DF 01DE
+01E1 01E0
+01E3 01E2
+01E5 01E4
+01E7 01E6
+01E9 01E8
+01EB 01EA
+01ED 01EC
+01EF 01EE
+01F1 01F2
+01F2 01F2
+01F3 01F2
+01F5 01F4
+01F9 01F8
+01FB 01FA
+01FD 01FC
+01FF 01FE
+0201 0200
+0203 0202
+0205 0204
+0207 0206
+0209 0208
+020B 020A
+020D 020C
+020F 020E
+0211 0210
+0213 0212
+0215 0214
+0217 0216
+0219 0218
+021B 021A
+021D 021C
+021F 021E
+0223 0222
+0225 0224
+0227 0226
+0229 0228
+022B 022A
+022D 022C
+022F 022E
+0231 0230
+0233 0232
+023C 023B
+0242 0241
+0247 0246
+0249 0248
+024B 024A
+024D 024C
+024F 024E
+0250 2C6F
+0251 2C6D
+0253 0181
+0254 0186
+0256 0189
+0257 018A
+0259 018F
+025B 0190
+0260 0193
+0263 0194
+0268 0197
+0269 0196
+026B 2C62
+026F 019C
+0271 2C6E
+0272 019D
+0275 019F
+027D 2C64
+0280 01A6
+0283 01A9
+0288 01AE
+0289 0244
+028A 01B1
+028B 01B2
+028C 0245
+0292 01B7
+0345 0399
+0371 0370
+0373 0372
+0377 0376
+037B 03FD
+037C 03FE
+037D 03FF
+03AC 0386
+03AD 0388
+03AE 0389
+03AF 038A
+03B1 0391
+03B2 0392
+03B3 0393
+03B4 0394
+03B5 0395
+03B6 0396
+03B7 0397
+03B8 0398
+03B9 0399
+03BA 039A
+03BB 039B
+03BC 039C
+03BD 039D
+03BE 039E
+03BF 039F
+03C0 03A0
+03C1 03A1
+03C2 03A3
+03C3 03A3
+03C4 03A4
+03C5 03A5
+03C6 03A6
+03C7 03A7
+03C8 03A8
+03C9 03A9
+03CA 03AA
+03CB 03AB
+03CC 038C
+03CD 038E
+03CE 038F
+03D0 0392
+03D1 0398
+03D5 03A6
+03D6 03A0
+03D7 03CF
+03D9 03D8
+03DB 03DA
+03DD 03DC
+03DF 03DE
+03E1 03E0
+03E3 03E2
+03E5 03E4
+03E7 03E6
+03E9 03E8
+03EB 03EA
+03ED 03EC
+03EF 03EE
+03F0 039A
+03F1 03A1
+03F2 03F9
+03F5 0395
+03F8 03F7
+03FB 03FA
+0430 0410
+0431 0411
+0432 0412
+0433 0413
+0434 0414
+0435 0415
+0436 0416
+0437 0417
+0438 0418
+0439 0419
+043A 041A
+043B 041B
+043C 041C
+043D 041D
+043E 041E
+043F 041F
+0440 0420
+0441 0421
+0442 0422
+0443 0423
+0444 0424
+0445 0425
+0446 0426
+0447 0427
+0448 0428
+0449 0429
+044A 042A
+044B 042B
+044C 042C
+044D 042D
+044E 042E
+044F 042F
+0450 0400
+0451 0401
+0452 0402
+0453 0403
+0454 0404
+0455 0405
+0456 0406
+0457 0407
+0458 0408
+0459 0409
+045A 040A
+045B 040B
+045C 040C
+045D 040D
+045E 040E
+045F 040F
+0461 0460
+0463 0462
+0465 0464
+0467 0466
+0469 0468
+046B 046A
+046D 046C
+046F 046E
+0471 0470
+0473 0472
+0475 0474
+0477 0476
+0479 0478
+047B 047A
+047D 047C
+047F 047E
+0481 0480
+048B 048A
+048D 048C
+048F 048E
+0491 0490
+0493 0492
+0495 0494
+0497 0496
+0499 0498
+049B 049A
+049D 049C
+049F 049E
+04A1 04A0
+04A3 04A2
+04A5 04A4
+04A7 04A6
+04A9 04A8
+04AB 04AA
+04AD 04AC
+04AF 04AE
+04B1 04B0
+04B3 04B2
+04B5 04B4
+04B7 04B6
+04B9 04B8
+04BB 04BA
+04BD 04BC
+04BF 04BE
+04C2 04C1
+04C4 04C3
+04C6 04C5
+04C8 04C7
+04CA 04C9
+04CC 04CB
+04CE 04CD
+04CF 04C0
+04D1 04D0
+04D3 04D2
+04D5 04D4
+04D7 04D6
+04D9 04D8
+04DB 04DA
+04DD 04DC
+04DF 04DE
+04E1 04E0
+04E3 04E2
+04E5 04E4
+04E7 04E6
+04E9 04E8
+04EB 04EA
+04ED 04EC
+04EF 04EE
+04F1 04F0
+04F3 04F2
+04F5 04F4
+04F7 04F6
+04F9 04F8
+04FB 04FA
+04FD 04FC
+04FF 04FE
+0501 0500
+0503 0502
+0505 0504
+0507 0506
+0509 0508
+050B 050A
+050D 050C
+050F 050E
+0511 0510
+0513 0512
+0515 0514
+0517 0516
+0519 0518
+051B 051A
+051D 051C
+051F 051E
+0521 0520
+0523 0522
+0561 0531
+0562 0532
+0563 0533
+0564 0534
+0565 0535
+0566 0536
+0567 0537
+0568 0538
+0569 0539
+056A 053A
+056B 053B
+056C 053C
+056D 053D
+056E 053E
+056F 053F
+0570 0540
+0571 0541
+0572 0542
+0573 0543
+0574 0544
+0575 0545
+0576 0546
+0577 0547
+0578 0548
+0579 0549
+057A 054A
+057B 054B
+057C 054C
+057D 054D
+057E 054E
+057F 054F
+0580 0550
+0581 0551
+0582 0552
+0583 0553
+0584 0554
+0585 0555
+0586 0556
+1D79 A77D
+1D7D 2C63
+1E01 1E00
+1E03 1E02
+1E05 1E04
+1E07 1E06
+1E09 1E08
+1E0B 1E0A
+1E0D 1E0C
+1E0F 1E0E
+1E11 1E10
+1E13 1E12
+1E15 1E14
+1E17 1E16
+1E19 1E18
+1E1B 1E1A
+1E1D 1E1C
+1E1F 1E1E
+1E21 1E20
+1E23 1E22
+1E25 1E24
+1E27 1E26
+1E29 1E28
+1E2B 1E2A
+1E2D 1E2C
+1E2F 1E2E
+1E31 1E30
+1E33 1E32
+1E35 1E34
+1E37 1E36
+1E39 1E38
+1E3B 1E3A
+1E3D 1E3C
+1E3F 1E3E
+1E41 1E40
+1E43 1E42
+1E45 1E44
+1E47 1E46
+1E49 1E48
+1E4B 1E4A
+1E4D 1E4C
+1E4F 1E4E
+1E51 1E50
+1E53 1E52
+1E55 1E54
+1E57 1E56
+1E59 1E58
+1E5B 1E5A
+1E5D 1E5C
+1E5F 1E5E
+1E61 1E60
+1E63 1E62
+1E65 1E64
+1E67 1E66
+1E69 1E68
+1E6B 1E6A
+1E6D 1E6C
+1E6F 1E6E
+1E71 1E70
+1E73 1E72
+1E75 1E74
+1E77 1E76
+1E79 1E78
+1E7B 1E7A
+1E7D 1E7C
+1E7F 1E7E
+1E81 1E80
+1E83 1E82
+1E85 1E84
+1E87 1E86
+1E89 1E88
+1E8B 1E8A
+1E8D 1E8C
+1E8F 1E8E
+1E91 1E90
+1E93 1E92
+1E95 1E94
+1E9B 1E60
+1EA1 1EA0
+1EA3 1EA2
+1EA5 1EA4
+1EA7 1EA6
+1EA9 1EA8
+1EAB 1EAA
+1EAD 1EAC
+1EAF 1EAE
+1EB1 1EB0
+1EB3 1EB2
+1EB5 1EB4
+1EB7 1EB6
+1EB9 1EB8
+1EBB 1EBA
+1EBD 1EBC
+1EBF 1EBE
+1EC1 1EC0
+1EC3 1EC2
+1EC5 1EC4
+1EC7 1EC6
+1EC9 1EC8
+1ECB 1ECA
+1ECD 1ECC
+1ECF 1ECE
+1ED1 1ED0
+1ED3 1ED2
+1ED5 1ED4
+1ED7 1ED6
+1ED9 1ED8
+1EDB 1EDA
+1EDD 1EDC
+1EDF 1EDE
+1EE1 1EE0
+1EE3 1EE2
+1EE5 1EE4
+1EE7 1EE6
+1EE9 1EE8
+1EEB 1EEA
+1EED 1EEC
+1EEF 1EEE
+1EF1 1EF0
+1EF3 1EF2
+1EF5 1EF4
+1EF7 1EF6
+1EF9 1EF8
+1EFB 1EFA
+1EFD 1EFC
+1EFF 1EFE
+1F00 1F08
+1F01 1F09
+1F02 1F0A
+1F03 1F0B
+1F04 1F0C
+1F05 1F0D
+1F06 1F0E
+1F07 1F0F
+1F10 1F18
+1F11 1F19
+1F12 1F1A
+1F13 1F1B
+1F14 1F1C
+1F15 1F1D
+1F20 1F28
+1F21 1F29
+1F22 1F2A
+1F23 1F2B
+1F24 1F2C
+1F25 1F2D
+1F26 1F2E
+1F27 1F2F
+1F30 1F38
+1F31 1F39
+1F32 1F3A
+1F33 1F3B
+1F34 1F3C
+1F35 1F3D
+1F36 1F3E
+1F37 1F3F
+1F40 1F48
+1F41 1F49
+1F42 1F4A
+1F43 1F4B
+1F44 1F4C
+1F45 1F4D
+1F51 1F59
+1F53 1F5B
+1F55 1F5D
+1F57 1F5F
+1F60 1F68
+1F61 1F69
+1F62 1F6A
+1F63 1F6B
+1F64 1F6C
+1F65 1F6D
+1F66 1F6E
+1F67 1F6F
+1F70 1FBA
+1F71 1FBB
+1F72 1FC8
+1F73 1FC9
+1F74 1FCA
+1F75 1FCB
+1F76 1FDA
+1F77 1FDB
+1F78 1FF8
+1F79 1FF9
+1F7A 1FEA
+1F7B 1FEB
+1F7C 1FFA
+1F7D 1FFB
+1FB0 1FB8
+1FB1 1FB9
+1FBE 0399
+1FD0 1FD8
+1FD1 1FD9
+1FE0 1FE8
+1FE1 1FE9
+1FE5 1FEC
+214E 2132
+2170 2160
+2171 2161
+2172 2162
+2173 2163
+2174 2164
+2175 2165
+2176 2166
+2177 2167
+2178 2168
+2179 2169
+217A 216A
+217B 216B
+217C 216C
+217D 216D
+217E 216E
+217F 216F
+2184 2183
+24D0 24B6
+24D1 24B7
+24D2 24B8
+24D3 24B9
+24D4 24BA
+24D5 24BB
+24D6 24BC
+24D7 24BD
+24D8 24BE
+24D9 24BF
+24DA 24C0
+24DB 24C1
+24DC 24C2
+24DD 24C3
+24DE 24C4
+24DF 24C5
+24E0 24C6
+24E1 24C7
+24E2 24C8
+24E3 24C9
+24E4 24CA
+24E5 24CB
+24E6 24CC
+24E7 24CD
+24E8 24CE
+24E9 24CF
+2C30 2C00
+2C31 2C01
+2C32 2C02
+2C33 2C03
+2C34 2C04
+2C35 2C05
+2C36 2C06
+2C37 2C07
+2C38 2C08
+2C39 2C09
+2C3A 2C0A
+2C3B 2C0B
+2C3C 2C0C
+2C3D 2C0D
+2C3E 2C0E
+2C3F 2C0F
+2C40 2C10
+2C41 2C11
+2C42 2C12
+2C43 2C13
+2C44 2C14
+2C45 2C15
+2C46 2C16
+2C47 2C17
+2C48 2C18
+2C49 2C19
+2C4A 2C1A
+2C4B 2C1B
+2C4C 2C1C
+2C4D 2C1D
+2C4E 2C1E
+2C4F 2C1F
+2C50 2C20
+2C51 2C21
+2C52 2C22
+2C53 2C23
+2C54 2C24
+2C55 2C25
+2C56 2C26
+2C57 2C27
+2C58 2C28
+2C59 2C29
+2C5A 2C2A
+2C5B 2C2B
+2C5C 2C2C
+2C5D 2C2D
+2C5E 2C2E
+2C61 2C60
+2C65 023A
+2C66 023E
+2C68 2C67
+2C6A 2C69
+2C6C 2C6B
+2C73 2C72
+2C76 2C75
+2C81 2C80
+2C83 2C82
+2C85 2C84
+2C87 2C86
+2C89 2C88
+2C8B 2C8A
+2C8D 2C8C
+2C8F 2C8E
+2C91 2C90
+2C93 2C92
+2C95 2C94
+2C97 2C96
+2C99 2C98
+2C9B 2C9A
+2C9D 2C9C
+2C9F 2C9E
+2CA1 2CA0
+2CA3 2CA2
+2CA5 2CA4
+2CA7 2CA6
+2CA9 2CA8
+2CAB 2CAA
+2CAD 2CAC
+2CAF 2CAE
+2CB1 2CB0
+2CB3 2CB2
+2CB5 2CB4
+2CB7 2CB6
+2CB9 2CB8
+2CBB 2CBA
+2CBD 2CBC
+2CBF 2CBE
+2CC1 2CC0
+2CC3 2CC2
+2CC5 2CC4
+2CC7 2CC6
+2CC9 2CC8
+2CCB 2CCA
+2CCD 2CCC
+2CCF 2CCE
+2CD1 2CD0
+2CD3 2CD2
+2CD5 2CD4
+2CD7 2CD6
+2CD9 2CD8
+2CDB 2CDA
+2CDD 2CDC
+2CDF 2CDE
+2CE1 2CE0
+2CE3 2CE2
+2D00 10A0
+2D01 10A1
+2D02 10A2
+2D03 10A3
+2D04 10A4
+2D05 10A5
+2D06 10A6
+2D07 10A7
+2D08 10A8
+2D09 10A9
+2D0A 10AA
+2D0B 10AB
+2D0C 10AC
+2D0D 10AD
+2D0E 10AE
+2D0F 10AF
+2D10 10B0
+2D11 10B1
+2D12 10B2
+2D13 10B3
+2D14 10B4
+2D15 10B5
+2D16 10B6
+2D17 10B7
+2D18 10B8
+2D19 10B9
+2D1A 10BA
+2D1B 10BB
+2D1C 10BC
+2D1D 10BD
+2D1E 10BE
+2D1F 10BF
+2D20 10C0
+2D21 10C1
+2D22 10C2
+2D23 10C3
+2D24 10C4
+2D25 10C5
+A641 A640
+A643 A642
+A645 A644
+A647 A646
+A649 A648
+A64B A64A
+A64D A64C
+A64F A64E
+A651 A650
+A653 A652
+A655 A654
+A657 A656
+A659 A658
+A65B A65A
+A65D A65C
+A65F A65E
+A663 A662
+A665 A664
+A667 A666
+A669 A668
+A66B A66A
+A66D A66C
+A681 A680
+A683 A682
+A685 A684
+A687 A686
+A689 A688
+A68B A68A
+A68D A68C
+A68F A68E
+A691 A690
+A693 A692
+A695 A694
+A697 A696
+A723 A722
+A725 A724
+A727 A726
+A729 A728
+A72B A72A
+A72D A72C
+A72F A72E
+A733 A732
+A735 A734
+A737 A736
+A739 A738
+A73B A73A
+A73D A73C
+A73F A73E
+A741 A740
+A743 A742
+A745 A744
+A747 A746
+A749 A748
+A74B A74A
+A74D A74C
+A74F A74E
+A751 A750
+A753 A752
+A755 A754
+A757 A756
+A759 A758
+A75B A75A
+A75D A75C
+A75F A75E
+A761 A760
+A763 A762
+A765 A764
+A767 A766
+A769 A768
+A76B A76A
+A76D A76C
+A76F A76E
+A77A A779
+A77C A77B
+A77F A77E
+A781 A780
+A783 A782
+A785 A784
+A787 A786
+A78C A78B
+FF41 FF21
+FF42 FF22
+FF43 FF23
+FF44 FF24
+FF45 FF25
+FF46 FF26
+FF47 FF27
+FF48 FF28
+FF49 FF29
+FF4A FF2A
+FF4B FF2B
+FF4C FF2C
+FF4D FF2D
+FF4E FF2E
+FF4F FF2F
+FF50 FF30
+FF51 FF31
+FF52 FF32
+FF53 FF33
+FF54 FF34
+FF55 FF35
+FF56 FF36
+FF57 FF37
+FF58 FF38
+FF59 FF39
+FF5A FF3A
+10428 10400
+10429 10401
+1042A 10402
+1042B 10403
+1042C 10404
+1042D 10405
+1042E 10406
+1042F 10407
+10430 10408
+10431 10409
+10432 1040A
+10433 1040B
+10434 1040C
+10435 1040D
+10436 1040E
+10437 1040F
+10438 10410
+10439 10411
+1043A 10412
+1043B 10413
+1043C 10414
+1043D 10415
+1043E 10416
+1043F 10417
+10440 10418
+10441 10419
+10442 1041A
+10443 1041B
+10444 1041C
+10445 1041D
+10446 1041E
+10447 1041F
+10448 10420
+10449 10421
+1044A 10422
+1044B 10423
+1044C 10424
+1044D 10425
+1044E 10426
+1044F 10427
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/To/Upper.pl b/Master/tlpkg/tlperl.straw/lib/unicore/To/Upper.pl
new file mode 100755
index 00000000000..e2393ee498b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/To/Upper.pl
@@ -0,0 +1,1122 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+
+# The key: UTF-8 _bytes_, the value: UTF-8 (speed hack)
+%utf8::ToSpecUpper =
+(
+"\xC3\x9F" => "\x{0053}\x{0053}",
+"\xC5\x89" => "\x{02BC}\x{004E}",
+"\xC7\xB0" => "\x{004A}\x{030C}",
+"\xCE\x90" => "\x{0399}\x{0308}\x{0301}",
+"\xCE\xB0" => "\x{03A5}\x{0308}\x{0301}",
+"\xD6\x87" => "\x{0535}\x{0552}",
+"\xE1\xBA\x96" => "\x{0048}\x{0331}",
+"\xE1\xBA\x97" => "\x{0054}\x{0308}",
+"\xE1\xBA\x98" => "\x{0057}\x{030A}",
+"\xE1\xBA\x99" => "\x{0059}\x{030A}",
+"\xE1\xBA\x9A" => "\x{0041}\x{02BE}",
+"\xE1\xBD\x90" => "\x{03A5}\x{0313}",
+"\xE1\xBD\x92" => "\x{03A5}\x{0313}\x{0300}",
+"\xE1\xBD\x94" => "\x{03A5}\x{0313}\x{0301}",
+"\xE1\xBD\x96" => "\x{03A5}\x{0313}\x{0342}",
+"\xE1\xBE\x80" => "\x{1F08}\x{0399}",
+"\xE1\xBE\x81" => "\x{1F09}\x{0399}",
+"\xE1\xBE\x82" => "\x{1F0A}\x{0399}",
+"\xE1\xBE\x83" => "\x{1F0B}\x{0399}",
+"\xE1\xBE\x84" => "\x{1F0C}\x{0399}",
+"\xE1\xBE\x85" => "\x{1F0D}\x{0399}",
+"\xE1\xBE\x86" => "\x{1F0E}\x{0399}",
+"\xE1\xBE\x87" => "\x{1F0F}\x{0399}",
+"\xE1\xBE\x88" => "\x{1F08}\x{0399}",
+"\xE1\xBE\x89" => "\x{1F09}\x{0399}",
+"\xE1\xBE\x8A" => "\x{1F0A}\x{0399}",
+"\xE1\xBE\x8B" => "\x{1F0B}\x{0399}",
+"\xE1\xBE\x8C" => "\x{1F0C}\x{0399}",
+"\xE1\xBE\x8D" => "\x{1F0D}\x{0399}",
+"\xE1\xBE\x8E" => "\x{1F0E}\x{0399}",
+"\xE1\xBE\x8F" => "\x{1F0F}\x{0399}",
+"\xE1\xBE\x90" => "\x{1F28}\x{0399}",
+"\xE1\xBE\x91" => "\x{1F29}\x{0399}",
+"\xE1\xBE\x92" => "\x{1F2A}\x{0399}",
+"\xE1\xBE\x93" => "\x{1F2B}\x{0399}",
+"\xE1\xBE\x94" => "\x{1F2C}\x{0399}",
+"\xE1\xBE\x95" => "\x{1F2D}\x{0399}",
+"\xE1\xBE\x96" => "\x{1F2E}\x{0399}",
+"\xE1\xBE\x97" => "\x{1F2F}\x{0399}",
+"\xE1\xBE\x98" => "\x{1F28}\x{0399}",
+"\xE1\xBE\x99" => "\x{1F29}\x{0399}",
+"\xE1\xBE\x9A" => "\x{1F2A}\x{0399}",
+"\xE1\xBE\x9B" => "\x{1F2B}\x{0399}",
+"\xE1\xBE\x9C" => "\x{1F2C}\x{0399}",
+"\xE1\xBE\x9D" => "\x{1F2D}\x{0399}",
+"\xE1\xBE\x9E" => "\x{1F2E}\x{0399}",
+"\xE1\xBE\x9F" => "\x{1F2F}\x{0399}",
+"\xE1\xBE\xA0" => "\x{1F68}\x{0399}",
+"\xE1\xBE\xA1" => "\x{1F69}\x{0399}",
+"\xE1\xBE\xA2" => "\x{1F6A}\x{0399}",
+"\xE1\xBE\xA3" => "\x{1F6B}\x{0399}",
+"\xE1\xBE\xA4" => "\x{1F6C}\x{0399}",
+"\xE1\xBE\xA5" => "\x{1F6D}\x{0399}",
+"\xE1\xBE\xA6" => "\x{1F6E}\x{0399}",
+"\xE1\xBE\xA7" => "\x{1F6F}\x{0399}",
+"\xE1\xBE\xA8" => "\x{1F68}\x{0399}",
+"\xE1\xBE\xA9" => "\x{1F69}\x{0399}",
+"\xE1\xBE\xAA" => "\x{1F6A}\x{0399}",
+"\xE1\xBE\xAB" => "\x{1F6B}\x{0399}",
+"\xE1\xBE\xAC" => "\x{1F6C}\x{0399}",
+"\xE1\xBE\xAD" => "\x{1F6D}\x{0399}",
+"\xE1\xBE\xAE" => "\x{1F6E}\x{0399}",
+"\xE1\xBE\xAF" => "\x{1F6F}\x{0399}",
+"\xE1\xBE\xB2" => "\x{1FBA}\x{0399}",
+"\xE1\xBE\xB3" => "\x{0391}\x{0399}",
+"\xE1\xBE\xB4" => "\x{0386}\x{0399}",
+"\xE1\xBE\xB6" => "\x{0391}\x{0342}",
+"\xE1\xBE\xB7" => "\x{0391}\x{0342}\x{0399}",
+"\xE1\xBE\xBC" => "\x{0391}\x{0399}",
+"\xE1\xBF\x82" => "\x{1FCA}\x{0399}",
+"\xE1\xBF\x83" => "\x{0397}\x{0399}",
+"\xE1\xBF\x84" => "\x{0389}\x{0399}",
+"\xE1\xBF\x86" => "\x{0397}\x{0342}",
+"\xE1\xBF\x87" => "\x{0397}\x{0342}\x{0399}",
+"\xE1\xBF\x8C" => "\x{0397}\x{0399}",
+"\xE1\xBF\x92" => "\x{0399}\x{0308}\x{0300}",
+"\xE1\xBF\x93" => "\x{0399}\x{0308}\x{0301}",
+"\xE1\xBF\x96" => "\x{0399}\x{0342}",
+"\xE1\xBF\x97" => "\x{0399}\x{0308}\x{0342}",
+"\xE1\xBF\xA2" => "\x{03A5}\x{0308}\x{0300}",
+"\xE1\xBF\xA3" => "\x{03A5}\x{0308}\x{0301}",
+"\xE1\xBF\xA4" => "\x{03A1}\x{0313}",
+"\xE1\xBF\xA6" => "\x{03A5}\x{0342}",
+"\xE1\xBF\xA7" => "\x{03A5}\x{0308}\x{0342}",
+"\xE1\xBF\xB2" => "\x{1FFA}\x{0399}",
+"\xE1\xBF\xB3" => "\x{03A9}\x{0399}",
+"\xE1\xBF\xB4" => "\x{038F}\x{0399}",
+"\xE1\xBF\xB6" => "\x{03A9}\x{0342}",
+"\xE1\xBF\xB7" => "\x{03A9}\x{0342}\x{0399}",
+"\xE1\xBF\xBC" => "\x{03A9}\x{0399}",
+"\xEF\xAC\x80" => "\x{0046}\x{0046}",
+"\xEF\xAC\x81" => "\x{0046}\x{0049}",
+"\xEF\xAC\x82" => "\x{0046}\x{004C}",
+"\xEF\xAC\x83" => "\x{0046}\x{0046}\x{0049}",
+"\xEF\xAC\x84" => "\x{0046}\x{0046}\x{004C}",
+"\xEF\xAC\x85" => "\x{0053}\x{0054}",
+"\xEF\xAC\x86" => "\x{0053}\x{0054}",
+"\xEF\xAC\x93" => "\x{0544}\x{0546}",
+"\xEF\xAC\x94" => "\x{0544}\x{0535}",
+"\xEF\xAC\x95" => "\x{0544}\x{053B}",
+"\xEF\xAC\x96" => "\x{054E}\x{0546}",
+"\xEF\xAC\x97" => "\x{0544}\x{053D}",
+);
+
+return <<'END';
+0061 0041
+0062 0042
+0063 0043
+0064 0044
+0065 0045
+0066 0046
+0067 0047
+0068 0048
+0069 0049
+006A 004A
+006B 004B
+006C 004C
+006D 004D
+006E 004E
+006F 004F
+0070 0050
+0071 0051
+0072 0052
+0073 0053
+0074 0054
+0075 0055
+0076 0056
+0077 0057
+0078 0058
+0079 0059
+007A 005A
+00B5 039C
+00E0 00C0
+00E1 00C1
+00E2 00C2
+00E3 00C3
+00E4 00C4
+00E5 00C5
+00E6 00C6
+00E7 00C7
+00E8 00C8
+00E9 00C9
+00EA 00CA
+00EB 00CB
+00EC 00CC
+00ED 00CD
+00EE 00CE
+00EF 00CF
+00F0 00D0
+00F1 00D1
+00F2 00D2
+00F3 00D3
+00F4 00D4
+00F5 00D5
+00F6 00D6
+00F8 00D8
+00F9 00D9
+00FA 00DA
+00FB 00DB
+00FC 00DC
+00FD 00DD
+00FE 00DE
+00FF 0178
+0101 0100
+0103 0102
+0105 0104
+0107 0106
+0109 0108
+010B 010A
+010D 010C
+010F 010E
+0111 0110
+0113 0112
+0115 0114
+0117 0116
+0119 0118
+011B 011A
+011D 011C
+011F 011E
+0121 0120
+0123 0122
+0125 0124
+0127 0126
+0129 0128
+012B 012A
+012D 012C
+012F 012E
+0131 0049
+0133 0132
+0135 0134
+0137 0136
+013A 0139
+013C 013B
+013E 013D
+0140 013F
+0142 0141
+0144 0143
+0146 0145
+0148 0147
+014B 014A
+014D 014C
+014F 014E
+0151 0150
+0153 0152
+0155 0154
+0157 0156
+0159 0158
+015B 015A
+015D 015C
+015F 015E
+0161 0160
+0163 0162
+0165 0164
+0167 0166
+0169 0168
+016B 016A
+016D 016C
+016F 016E
+0171 0170
+0173 0172
+0175 0174
+0177 0176
+017A 0179
+017C 017B
+017E 017D
+017F 0053
+0180 0243
+0183 0182
+0185 0184
+0188 0187
+018C 018B
+0192 0191
+0195 01F6
+0199 0198
+019A 023D
+019E 0220
+01A1 01A0
+01A3 01A2
+01A5 01A4
+01A8 01A7
+01AD 01AC
+01B0 01AF
+01B4 01B3
+01B6 01B5
+01B9 01B8
+01BD 01BC
+01BF 01F7
+01C5 01C4
+01C6 01C4
+01C8 01C7
+01C9 01C7
+01CB 01CA
+01CC 01CA
+01CE 01CD
+01D0 01CF
+01D2 01D1
+01D4 01D3
+01D6 01D5
+01D8 01D7
+01DA 01D9
+01DC 01DB
+01DD 018E
+01DF 01DE
+01E1 01E0
+01E3 01E2
+01E5 01E4
+01E7 01E6
+01E9 01E8
+01EB 01EA
+01ED 01EC
+01EF 01EE
+01F2 01F1
+01F3 01F1
+01F5 01F4
+01F9 01F8
+01FB 01FA
+01FD 01FC
+01FF 01FE
+0201 0200
+0203 0202
+0205 0204
+0207 0206
+0209 0208
+020B 020A
+020D 020C
+020F 020E
+0211 0210
+0213 0212
+0215 0214
+0217 0216
+0219 0218
+021B 021A
+021D 021C
+021F 021E
+0223 0222
+0225 0224
+0227 0226
+0229 0228
+022B 022A
+022D 022C
+022F 022E
+0231 0230
+0233 0232
+023C 023B
+0242 0241
+0247 0246
+0249 0248
+024B 024A
+024D 024C
+024F 024E
+0250 2C6F
+0251 2C6D
+0253 0181
+0254 0186
+0256 0189
+0257 018A
+0259 018F
+025B 0190
+0260 0193
+0263 0194
+0268 0197
+0269 0196
+026B 2C62
+026F 019C
+0271 2C6E
+0272 019D
+0275 019F
+027D 2C64
+0280 01A6
+0283 01A9
+0288 01AE
+0289 0244
+028A 01B1
+028B 01B2
+028C 0245
+0292 01B7
+0345 0399
+0371 0370
+0373 0372
+0377 0376
+037B 03FD
+037C 03FE
+037D 03FF
+03AC 0386
+03AD 0388
+03AE 0389
+03AF 038A
+03B1 0391
+03B2 0392
+03B3 0393
+03B4 0394
+03B5 0395
+03B6 0396
+03B7 0397
+03B8 0398
+03B9 0399
+03BA 039A
+03BB 039B
+03BC 039C
+03BD 039D
+03BE 039E
+03BF 039F
+03C0 03A0
+03C1 03A1
+03C2 03A3
+03C3 03A3
+03C4 03A4
+03C5 03A5
+03C6 03A6
+03C7 03A7
+03C8 03A8
+03C9 03A9
+03CA 03AA
+03CB 03AB
+03CC 038C
+03CD 038E
+03CE 038F
+03D0 0392
+03D1 0398
+03D5 03A6
+03D6 03A0
+03D7 03CF
+03D9 03D8
+03DB 03DA
+03DD 03DC
+03DF 03DE
+03E1 03E0
+03E3 03E2
+03E5 03E4
+03E7 03E6
+03E9 03E8
+03EB 03EA
+03ED 03EC
+03EF 03EE
+03F0 039A
+03F1 03A1
+03F2 03F9
+03F5 0395
+03F8 03F7
+03FB 03FA
+0430 0410
+0431 0411
+0432 0412
+0433 0413
+0434 0414
+0435 0415
+0436 0416
+0437 0417
+0438 0418
+0439 0419
+043A 041A
+043B 041B
+043C 041C
+043D 041D
+043E 041E
+043F 041F
+0440 0420
+0441 0421
+0442 0422
+0443 0423
+0444 0424
+0445 0425
+0446 0426
+0447 0427
+0448 0428
+0449 0429
+044A 042A
+044B 042B
+044C 042C
+044D 042D
+044E 042E
+044F 042F
+0450 0400
+0451 0401
+0452 0402
+0453 0403
+0454 0404
+0455 0405
+0456 0406
+0457 0407
+0458 0408
+0459 0409
+045A 040A
+045B 040B
+045C 040C
+045D 040D
+045E 040E
+045F 040F
+0461 0460
+0463 0462
+0465 0464
+0467 0466
+0469 0468
+046B 046A
+046D 046C
+046F 046E
+0471 0470
+0473 0472
+0475 0474
+0477 0476
+0479 0478
+047B 047A
+047D 047C
+047F 047E
+0481 0480
+048B 048A
+048D 048C
+048F 048E
+0491 0490
+0493 0492
+0495 0494
+0497 0496
+0499 0498
+049B 049A
+049D 049C
+049F 049E
+04A1 04A0
+04A3 04A2
+04A5 04A4
+04A7 04A6
+04A9 04A8
+04AB 04AA
+04AD 04AC
+04AF 04AE
+04B1 04B0
+04B3 04B2
+04B5 04B4
+04B7 04B6
+04B9 04B8
+04BB 04BA
+04BD 04BC
+04BF 04BE
+04C2 04C1
+04C4 04C3
+04C6 04C5
+04C8 04C7
+04CA 04C9
+04CC 04CB
+04CE 04CD
+04CF 04C0
+04D1 04D0
+04D3 04D2
+04D5 04D4
+04D7 04D6
+04D9 04D8
+04DB 04DA
+04DD 04DC
+04DF 04DE
+04E1 04E0
+04E3 04E2
+04E5 04E4
+04E7 04E6
+04E9 04E8
+04EB 04EA
+04ED 04EC
+04EF 04EE
+04F1 04F0
+04F3 04F2
+04F5 04F4
+04F7 04F6
+04F9 04F8
+04FB 04FA
+04FD 04FC
+04FF 04FE
+0501 0500
+0503 0502
+0505 0504
+0507 0506
+0509 0508
+050B 050A
+050D 050C
+050F 050E
+0511 0510
+0513 0512
+0515 0514
+0517 0516
+0519 0518
+051B 051A
+051D 051C
+051F 051E
+0521 0520
+0523 0522
+0561 0531
+0562 0532
+0563 0533
+0564 0534
+0565 0535
+0566 0536
+0567 0537
+0568 0538
+0569 0539
+056A 053A
+056B 053B
+056C 053C
+056D 053D
+056E 053E
+056F 053F
+0570 0540
+0571 0541
+0572 0542
+0573 0543
+0574 0544
+0575 0545
+0576 0546
+0577 0547
+0578 0548
+0579 0549
+057A 054A
+057B 054B
+057C 054C
+057D 054D
+057E 054E
+057F 054F
+0580 0550
+0581 0551
+0582 0552
+0583 0553
+0584 0554
+0585 0555
+0586 0556
+1D79 A77D
+1D7D 2C63
+1E01 1E00
+1E03 1E02
+1E05 1E04
+1E07 1E06
+1E09 1E08
+1E0B 1E0A
+1E0D 1E0C
+1E0F 1E0E
+1E11 1E10
+1E13 1E12
+1E15 1E14
+1E17 1E16
+1E19 1E18
+1E1B 1E1A
+1E1D 1E1C
+1E1F 1E1E
+1E21 1E20
+1E23 1E22
+1E25 1E24
+1E27 1E26
+1E29 1E28
+1E2B 1E2A
+1E2D 1E2C
+1E2F 1E2E
+1E31 1E30
+1E33 1E32
+1E35 1E34
+1E37 1E36
+1E39 1E38
+1E3B 1E3A
+1E3D 1E3C
+1E3F 1E3E
+1E41 1E40
+1E43 1E42
+1E45 1E44
+1E47 1E46
+1E49 1E48
+1E4B 1E4A
+1E4D 1E4C
+1E4F 1E4E
+1E51 1E50
+1E53 1E52
+1E55 1E54
+1E57 1E56
+1E59 1E58
+1E5B 1E5A
+1E5D 1E5C
+1E5F 1E5E
+1E61 1E60
+1E63 1E62
+1E65 1E64
+1E67 1E66
+1E69 1E68
+1E6B 1E6A
+1E6D 1E6C
+1E6F 1E6E
+1E71 1E70
+1E73 1E72
+1E75 1E74
+1E77 1E76
+1E79 1E78
+1E7B 1E7A
+1E7D 1E7C
+1E7F 1E7E
+1E81 1E80
+1E83 1E82
+1E85 1E84
+1E87 1E86
+1E89 1E88
+1E8B 1E8A
+1E8D 1E8C
+1E8F 1E8E
+1E91 1E90
+1E93 1E92
+1E95 1E94
+1E9B 1E60
+1EA1 1EA0
+1EA3 1EA2
+1EA5 1EA4
+1EA7 1EA6
+1EA9 1EA8
+1EAB 1EAA
+1EAD 1EAC
+1EAF 1EAE
+1EB1 1EB0
+1EB3 1EB2
+1EB5 1EB4
+1EB7 1EB6
+1EB9 1EB8
+1EBB 1EBA
+1EBD 1EBC
+1EBF 1EBE
+1EC1 1EC0
+1EC3 1EC2
+1EC5 1EC4
+1EC7 1EC6
+1EC9 1EC8
+1ECB 1ECA
+1ECD 1ECC
+1ECF 1ECE
+1ED1 1ED0
+1ED3 1ED2
+1ED5 1ED4
+1ED7 1ED6
+1ED9 1ED8
+1EDB 1EDA
+1EDD 1EDC
+1EDF 1EDE
+1EE1 1EE0
+1EE3 1EE2
+1EE5 1EE4
+1EE7 1EE6
+1EE9 1EE8
+1EEB 1EEA
+1EED 1EEC
+1EEF 1EEE
+1EF1 1EF0
+1EF3 1EF2
+1EF5 1EF4
+1EF7 1EF6
+1EF9 1EF8
+1EFB 1EFA
+1EFD 1EFC
+1EFF 1EFE
+1F00 1F08
+1F01 1F09
+1F02 1F0A
+1F03 1F0B
+1F04 1F0C
+1F05 1F0D
+1F06 1F0E
+1F07 1F0F
+1F10 1F18
+1F11 1F19
+1F12 1F1A
+1F13 1F1B
+1F14 1F1C
+1F15 1F1D
+1F20 1F28
+1F21 1F29
+1F22 1F2A
+1F23 1F2B
+1F24 1F2C
+1F25 1F2D
+1F26 1F2E
+1F27 1F2F
+1F30 1F38
+1F31 1F39
+1F32 1F3A
+1F33 1F3B
+1F34 1F3C
+1F35 1F3D
+1F36 1F3E
+1F37 1F3F
+1F40 1F48
+1F41 1F49
+1F42 1F4A
+1F43 1F4B
+1F44 1F4C
+1F45 1F4D
+1F51 1F59
+1F53 1F5B
+1F55 1F5D
+1F57 1F5F
+1F60 1F68
+1F61 1F69
+1F62 1F6A
+1F63 1F6B
+1F64 1F6C
+1F65 1F6D
+1F66 1F6E
+1F67 1F6F
+1F70 1FBA
+1F71 1FBB
+1F72 1FC8
+1F73 1FC9
+1F74 1FCA
+1F75 1FCB
+1F76 1FDA
+1F77 1FDB
+1F78 1FF8
+1F79 1FF9
+1F7A 1FEA
+1F7B 1FEB
+1F7C 1FFA
+1F7D 1FFB
+1FB0 1FB8
+1FB1 1FB9
+1FBE 0399
+1FD0 1FD8
+1FD1 1FD9
+1FE0 1FE8
+1FE1 1FE9
+1FE5 1FEC
+214E 2132
+2170 2160
+2171 2161
+2172 2162
+2173 2163
+2174 2164
+2175 2165
+2176 2166
+2177 2167
+2178 2168
+2179 2169
+217A 216A
+217B 216B
+217C 216C
+217D 216D
+217E 216E
+217F 216F
+2184 2183
+24D0 24B6
+24D1 24B7
+24D2 24B8
+24D3 24B9
+24D4 24BA
+24D5 24BB
+24D6 24BC
+24D7 24BD
+24D8 24BE
+24D9 24BF
+24DA 24C0
+24DB 24C1
+24DC 24C2
+24DD 24C3
+24DE 24C4
+24DF 24C5
+24E0 24C6
+24E1 24C7
+24E2 24C8
+24E3 24C9
+24E4 24CA
+24E5 24CB
+24E6 24CC
+24E7 24CD
+24E8 24CE
+24E9 24CF
+2C30 2C00
+2C31 2C01
+2C32 2C02
+2C33 2C03
+2C34 2C04
+2C35 2C05
+2C36 2C06
+2C37 2C07
+2C38 2C08
+2C39 2C09
+2C3A 2C0A
+2C3B 2C0B
+2C3C 2C0C
+2C3D 2C0D
+2C3E 2C0E
+2C3F 2C0F
+2C40 2C10
+2C41 2C11
+2C42 2C12
+2C43 2C13
+2C44 2C14
+2C45 2C15
+2C46 2C16
+2C47 2C17
+2C48 2C18
+2C49 2C19
+2C4A 2C1A
+2C4B 2C1B
+2C4C 2C1C
+2C4D 2C1D
+2C4E 2C1E
+2C4F 2C1F
+2C50 2C20
+2C51 2C21
+2C52 2C22
+2C53 2C23
+2C54 2C24
+2C55 2C25
+2C56 2C26
+2C57 2C27
+2C58 2C28
+2C59 2C29
+2C5A 2C2A
+2C5B 2C2B
+2C5C 2C2C
+2C5D 2C2D
+2C5E 2C2E
+2C61 2C60
+2C65 023A
+2C66 023E
+2C68 2C67
+2C6A 2C69
+2C6C 2C6B
+2C73 2C72
+2C76 2C75
+2C81 2C80
+2C83 2C82
+2C85 2C84
+2C87 2C86
+2C89 2C88
+2C8B 2C8A
+2C8D 2C8C
+2C8F 2C8E
+2C91 2C90
+2C93 2C92
+2C95 2C94
+2C97 2C96
+2C99 2C98
+2C9B 2C9A
+2C9D 2C9C
+2C9F 2C9E
+2CA1 2CA0
+2CA3 2CA2
+2CA5 2CA4
+2CA7 2CA6
+2CA9 2CA8
+2CAB 2CAA
+2CAD 2CAC
+2CAF 2CAE
+2CB1 2CB0
+2CB3 2CB2
+2CB5 2CB4
+2CB7 2CB6
+2CB9 2CB8
+2CBB 2CBA
+2CBD 2CBC
+2CBF 2CBE
+2CC1 2CC0
+2CC3 2CC2
+2CC5 2CC4
+2CC7 2CC6
+2CC9 2CC8
+2CCB 2CCA
+2CCD 2CCC
+2CCF 2CCE
+2CD1 2CD0
+2CD3 2CD2
+2CD5 2CD4
+2CD7 2CD6
+2CD9 2CD8
+2CDB 2CDA
+2CDD 2CDC
+2CDF 2CDE
+2CE1 2CE0
+2CE3 2CE2
+2D00 10A0
+2D01 10A1
+2D02 10A2
+2D03 10A3
+2D04 10A4
+2D05 10A5
+2D06 10A6
+2D07 10A7
+2D08 10A8
+2D09 10A9
+2D0A 10AA
+2D0B 10AB
+2D0C 10AC
+2D0D 10AD
+2D0E 10AE
+2D0F 10AF
+2D10 10B0
+2D11 10B1
+2D12 10B2
+2D13 10B3
+2D14 10B4
+2D15 10B5
+2D16 10B6
+2D17 10B7
+2D18 10B8
+2D19 10B9
+2D1A 10BA
+2D1B 10BB
+2D1C 10BC
+2D1D 10BD
+2D1E 10BE
+2D1F 10BF
+2D20 10C0
+2D21 10C1
+2D22 10C2
+2D23 10C3
+2D24 10C4
+2D25 10C5
+A641 A640
+A643 A642
+A645 A644
+A647 A646
+A649 A648
+A64B A64A
+A64D A64C
+A64F A64E
+A651 A650
+A653 A652
+A655 A654
+A657 A656
+A659 A658
+A65B A65A
+A65D A65C
+A65F A65E
+A663 A662
+A665 A664
+A667 A666
+A669 A668
+A66B A66A
+A66D A66C
+A681 A680
+A683 A682
+A685 A684
+A687 A686
+A689 A688
+A68B A68A
+A68D A68C
+A68F A68E
+A691 A690
+A693 A692
+A695 A694
+A697 A696
+A723 A722
+A725 A724
+A727 A726
+A729 A728
+A72B A72A
+A72D A72C
+A72F A72E
+A733 A732
+A735 A734
+A737 A736
+A739 A738
+A73B A73A
+A73D A73C
+A73F A73E
+A741 A740
+A743 A742
+A745 A744
+A747 A746
+A749 A748
+A74B A74A
+A74D A74C
+A74F A74E
+A751 A750
+A753 A752
+A755 A754
+A757 A756
+A759 A758
+A75B A75A
+A75D A75C
+A75F A75E
+A761 A760
+A763 A762
+A765 A764
+A767 A766
+A769 A768
+A76B A76A
+A76D A76C
+A76F A76E
+A77A A779
+A77C A77B
+A77F A77E
+A781 A780
+A783 A782
+A785 A784
+A787 A786
+A78C A78B
+FF41 FF21
+FF42 FF22
+FF43 FF23
+FF44 FF24
+FF45 FF25
+FF46 FF26
+FF47 FF27
+FF48 FF28
+FF49 FF29
+FF4A FF2A
+FF4B FF2B
+FF4C FF2C
+FF4D FF2D
+FF4E FF2E
+FF4F FF2F
+FF50 FF30
+FF51 FF31
+FF52 FF32
+FF53 FF33
+FF54 FF34
+FF55 FF35
+FF56 FF36
+FF57 FF37
+FF58 FF38
+FF59 FF39
+FF5A FF3A
+10428 10400
+10429 10401
+1042A 10402
+1042B 10403
+1042C 10404
+1042D 10405
+1042E 10406
+1042F 10407
+10430 10408
+10431 10409
+10432 1040A
+10433 1040B
+10434 1040C
+10435 1040D
+10436 1040E
+10437 1040F
+10438 10410
+10439 10411
+1043A 10412
+1043B 10413
+1043C 10414
+1043D 10415
+1043E 10416
+1043F 10417
+10440 10418
+10441 10419
+10442 1041A
+10443 1041B
+10444 1041C
+10445 1041D
+10446 1041E
+10447 1041F
+10448 10420
+10449 10421
+1044A 10422
+1044B 10423
+1044C 10424
+1044D 10425
+1044E 10426
+1044F 10427
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/UnicodeData.txt b/Master/tlpkg/tlperl.straw/lib/unicore/UnicodeData.txt
new file mode 100755
index 00000000000..77db788cf29
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/UnicodeData.txt
@@ -0,0 +1,19336 @@
+0000;<control>;Cc;0;BN;;;;;N;NULL;;;;
+0001;<control>;Cc;0;BN;;;;;N;START OF HEADING;;;;
+0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;;
+0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;;
+0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;;
+0005;<control>;Cc;0;BN;;;;;N;ENQUIRY;;;;
+0006;<control>;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;;
+0007;<control>;Cc;0;BN;;;;;N;BELL;;;;
+0008;<control>;Cc;0;BN;;;;;N;BACKSPACE;;;;
+0009;<control>;Cc;0;S;;;;;N;CHARACTER TABULATION;;;;
+000A;<control>;Cc;0;B;;;;;N;LINE FEED (LF);;;;
+000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;;
+000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;;
+000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;;
+000E;<control>;Cc;0;BN;;;;;N;SHIFT OUT;;;;
+000F;<control>;Cc;0;BN;;;;;N;SHIFT IN;;;;
+0010;<control>;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;;
+0011;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;;
+0012;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;;
+0013;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;;
+0014;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;;
+0015;<control>;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;;
+0016;<control>;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;;
+0017;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;;
+0018;<control>;Cc;0;BN;;;;;N;CANCEL;;;;
+0019;<control>;Cc;0;BN;;;;;N;END OF MEDIUM;;;;
+001A;<control>;Cc;0;BN;;;;;N;SUBSTITUTE;;;;
+001B;<control>;Cc;0;BN;;;;;N;ESCAPE;;;;
+001C;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;;
+001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;;
+001E;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;;
+001F;<control>;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;;
+0020;SPACE;Zs;0;WS;;;;;N;;;;;
+0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;;
+0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;;
+0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;;
+0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+0026;AMPERSAND;Po;0;ON;;;;;N;;;;;
+0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;;
+0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;;
+0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;;
+002A;ASTERISK;Po;0;ON;;;;;N;;;;;
+002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;;
+002C;COMMA;Po;0;CS;;;;;N;;;;;
+002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;;
+002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;;
+002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;;
+0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;;
+0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;;
+0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;;
+0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;;
+0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;;
+0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;;
+0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;;
+0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;;
+0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;;
+0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;;
+003A;COLON;Po;0;CS;;;;;N;;;;;
+003B;SEMICOLON;Po;0;ON;;;;;N;;;;;
+003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003F;QUESTION MARK;Po;0;ON;;;;;N;;;;;
+0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;;
+0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
+0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062;
+0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063;
+0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064;
+0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065;
+0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066;
+0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067;
+0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068;
+0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069;
+004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A;
+004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B;
+004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C;
+004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D;
+004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E;
+004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F;
+0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070;
+0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071;
+0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072;
+0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073;
+0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074;
+0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075;
+0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076;
+0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077;
+0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078;
+0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079;
+005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A;
+005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;;
+005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;;
+005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;;
+005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;;
+005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;;
+0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;;
+0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041
+0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042
+0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043
+0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044
+0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045
+0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046
+0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047
+0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048
+0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049
+006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A
+006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B
+006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C
+006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D
+006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E
+006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F
+0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050
+0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051
+0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052
+0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053
+0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054
+0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055
+0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056
+0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057
+0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058
+0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059
+007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A
+007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;;
+007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;;
+007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;;
+007E;TILDE;Sm;0;ON;;;;;N;;;;;
+007F;<control>;Cc;0;BN;;;;;N;DELETE;;;;
+0080;<control>;Cc;0;BN;;;;;N;;;;;
+0081;<control>;Cc;0;BN;;;;;N;;;;;
+0082;<control>;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;;
+0083;<control>;Cc;0;BN;;;;;N;NO BREAK HERE;;;;
+0084;<control>;Cc;0;BN;;;;;N;;;;;
+0085;<control>;Cc;0;B;;;;;N;NEXT LINE (NEL);;;;
+0086;<control>;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;;
+0087;<control>;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;;
+0088;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;;
+0089;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;;
+008A;<control>;Cc;0;BN;;;;;N;LINE TABULATION SET;;;;
+008B;<control>;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;;
+008C;<control>;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;;
+008D;<control>;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;;
+008E;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;;
+008F;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;;
+0090;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;;
+0091;<control>;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;;
+0092;<control>;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;;
+0093;<control>;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;;
+0094;<control>;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;;
+0095;<control>;Cc;0;BN;;;;;N;MESSAGE WAITING;;;;
+0096;<control>;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;;
+0097;<control>;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;;
+0098;<control>;Cc;0;BN;;;;;N;START OF STRING;;;;
+0099;<control>;Cc;0;BN;;;;;N;;;;;
+009A;<control>;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;;
+009B;<control>;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;;
+009C;<control>;Cc;0;BN;;;;;N;STRING TERMINATOR;;;;
+009D;<control>;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;;
+009E;<control>;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;;
+009F;<control>;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;;
+00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;;
+00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;;
+00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;;
+00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;;
+00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;;
+00A7;SECTION SIGN;So;0;ON;;;;;N;;;;;
+00A8;DIAERESIS;Sk;0;ON;<compat> 0020 0308;;;;N;SPACING DIAERESIS;;;;
+00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;;
+00AA;FEMININE ORDINAL INDICATOR;Ll;0;L;<super> 0061;;;;N;;;;;
+00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;;
+00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;;
+00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;;
+00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;;
+00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;;
+00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;;
+00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;;
+00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;;
+00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;;
+00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;;
+00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C
+00B6;PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;;
+00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;;
+00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;;
+00BA;MASCULINE ORDINAL INDICATOR;Ll;0;L;<super> 006F;;;;N;;;;;
+00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;*;;;
+00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;;
+00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;;
+00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;;
+00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0;
+00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1;
+00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2;
+00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3;
+00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4;
+00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5;
+00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;ash *;;00E6;
+00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7;
+00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8;
+00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9;
+00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA;
+00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB;
+00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC;
+00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED;
+00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE;
+00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF;
+00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;Icelandic;;00F0;
+00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1;
+00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2;
+00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3;
+00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4;
+00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5;
+00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6;
+00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;;
+00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8;
+00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9;
+00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA;
+00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB;
+00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC;
+00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD;
+00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;Icelandic;;00FE;
+00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;German;;;
+00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0
+00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1
+00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2
+00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3
+00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4
+00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5
+00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;ash *;00C6;;00C6
+00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7
+00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8
+00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9
+00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA
+00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB
+00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC
+00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD
+00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE
+00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF
+00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;Icelandic;00D0;;00D0
+00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1
+00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2
+00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3
+00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4
+00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5
+00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6
+00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8
+00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9
+00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA
+00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB
+00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC
+00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD
+00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;Icelandic;00DE;;00DE
+00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178
+0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101;
+0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100
+0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103;
+0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102
+0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105;
+0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104
+0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107;
+0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106
+0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109;
+0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108
+010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B;
+010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A
+010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D;
+010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C
+010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F;
+010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E
+0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111;
+0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110
+0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113;
+0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112
+0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115;
+0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114
+0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117;
+0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116
+0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119;
+0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118
+011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B;
+011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A
+011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D;
+011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C
+011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F;
+011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E
+0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121;
+0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120
+0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123;
+0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122
+0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125;
+0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124
+0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127;
+0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126
+0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129;
+0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128
+012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B;
+012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A
+012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D;
+012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C
+012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F;
+012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E
+0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069;
+0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049
+0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L;<compat> 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133;
+0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132
+0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135;
+0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134
+0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137;
+0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136
+0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;Greenlandic;;;
+0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A;
+013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139
+013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C;
+013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B
+013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E;
+013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D
+013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140;
+0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L;<compat> 006C 00B7;;;;N;;;013F;;013F
+0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142;
+0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141
+0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144;
+0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143
+0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146;
+0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145
+0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148;
+0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147
+0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L;<compat> 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;;
+014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;Sami;;014B;
+014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;Sami;014A;;014A
+014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D;
+014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C
+014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F;
+014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E
+0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151;
+0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150
+0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153;
+0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152
+0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155;
+0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154
+0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157;
+0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156
+0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159;
+0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158
+015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B;
+015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A
+015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D;
+015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C
+015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;*;;015F;
+015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;*;015E;;015E
+0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161;
+0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160
+0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;*;;0163;
+0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;*;0162;;0162
+0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165;
+0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164
+0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167;
+0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166
+0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169;
+0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168
+016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B;
+016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A
+016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D;
+016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C
+016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F;
+016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E
+0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171;
+0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170
+0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173;
+0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172
+0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175;
+0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174
+0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177;
+0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176
+0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF;
+0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A;
+017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179
+017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C;
+017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B
+017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E;
+017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D
+017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053
+0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243
+0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253;
+0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183;
+0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182
+0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185;
+0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184
+0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254;
+0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188;
+0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187
+0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;*;;0256;
+018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257;
+018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C;
+018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B
+018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;;
+018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD;
+018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259;
+0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B;
+0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192;
+0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191
+0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260;
+0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263;
+0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;hwair;01F6;;01F6
+0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269;
+0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268;
+0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199;
+0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198
+019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D
+019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;;
+019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F;
+019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272;
+019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220
+019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;*;;0275;
+01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1;
+01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0
+01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;gha;;01A3;
+01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;gha;01A2;;01A2
+01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5;
+01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4
+01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;*;;0280;
+01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8;
+01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7
+01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283;
+01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;;
+01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;;
+01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD;
+01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC
+01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288;
+01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0;
+01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF
+01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A;
+01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B;
+01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4;
+01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3
+01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6;
+01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5
+01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292;
+01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9;
+01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8
+01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;;
+01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;;
+01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD;
+01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC
+01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;;
+01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7
+01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;;
+01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;;
+01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;;
+01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;;
+01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5
+01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5
+01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5
+01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8
+01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8
+01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8
+01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB
+01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB
+01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB
+01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE;
+01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD
+01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0;
+01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF
+01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2;
+01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1
+01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4;
+01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3
+01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6;
+01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5
+01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8;
+01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7
+01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA;
+01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9
+01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC;
+01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB
+01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E
+01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF;
+01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE
+01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1;
+01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0
+01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;ash *;;01E3;
+01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;ash *;01E2;;01E2
+01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5;
+01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4
+01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7;
+01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6
+01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9;
+01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8
+01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB;
+01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA
+01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED;
+01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC
+01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF;
+01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE
+01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;;
+01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2
+01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;01F2
+01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2
+01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5;
+01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4
+01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195;
+01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF;
+01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9;
+01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8
+01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB;
+01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA
+01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;ash *;;01FD;
+01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;ash *;01FC;;01FC
+01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF;
+01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE
+0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201;
+0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200
+0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203;
+0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202
+0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205;
+0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204
+0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207;
+0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206
+0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209;
+0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208
+020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B;
+020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A
+020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D;
+020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C
+020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F;
+020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E
+0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211;
+0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210
+0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213;
+0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212
+0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215;
+0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214
+0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217;
+0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216
+0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;*;;0219;
+0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;*;0218;;0218
+021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;*;;021B;
+021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;*;021A;;021A
+021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D;
+021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C
+021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F;
+021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E
+0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E;
+0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;;
+0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223;
+0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222
+0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225;
+0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224
+0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227;
+0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226
+0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229;
+0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228
+022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B;
+022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A
+022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D;
+022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C
+022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F;
+022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E
+0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231;
+0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230
+0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233;
+0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232
+0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;;
+0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;;
+0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;;
+0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;;
+0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;;
+0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;;
+023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65;
+023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C;
+023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B
+023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A;
+023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66;
+023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;;;
+0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;;;
+0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242;
+0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241
+0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180;
+0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289;
+0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C;
+0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247;
+0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246
+0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249;
+0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248
+024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B;
+024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A
+024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D;
+024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C
+024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F;
+024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E
+0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F
+0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D
+0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;;
+0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181
+0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186
+0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;;
+0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189
+0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A
+0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;;
+0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F
+025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;;
+025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190
+025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;;;
+025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;;
+025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;;
+025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;;
+0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193
+0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;;;
+0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;;
+0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194
+0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;;
+0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;;;
+0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;;;
+0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;;
+0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197
+0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196
+026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;;
+026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62
+026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;;
+026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;;
+026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;;
+026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C
+0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E
+0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D
+0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;;
+0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;;
+0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F
+0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;;
+0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;;
+0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;;
+0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;;
+027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;;
+027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64
+027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;;
+027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;;
+0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;*;01A6;;01A6
+0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;;
+0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;;
+0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9
+0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;;
+0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;;
+0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;;
+0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;;
+0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE
+0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244
+028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1
+028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2
+028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245
+028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;;
+028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;;
+028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;;
+0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;;
+0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;;
+0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7
+0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;;
+0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;;
+0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;;
+0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;;
+0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;;
+0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;;
+029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;;
+029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;;
+029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;;
+029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;;
+029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;;;
+029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;;
+02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;;
+02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;;
+02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;;
+02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;;
+02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;;
+02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;;
+02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;;
+02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;;
+02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;;
+02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;;
+02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;;
+02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;;
+02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;;
+02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;;
+02B3;MODIFIER LETTER SMALL R;Lm;0;L;<super> 0072;;;;N;;;;;
+02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L;<super> 0279;;;;N;;;;;
+02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L;<super> 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;;
+02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;;
+02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;;
+02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;;
+02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;;
+02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;;
+02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;;
+02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;;
+02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;;
+02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;;
+02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;;
+02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;Mandarin Chinese first tone;;;
+02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;;
+02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;;
+02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;;
+02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;;
+02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;;
+02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;;
+02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;;
+02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;;
+02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;;
+02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D8;BREVE;Sk;0;ON;<compat> 0020 0306;;;;N;SPACING BREVE;;;;
+02D9;DOT ABOVE;Sk;0;ON;<compat> 0020 0307;;;;N;SPACING DOT ABOVE;Mandarin Chinese light tone;;;
+02DA;RING ABOVE;Sk;0;ON;<compat> 0020 030A;;;;N;SPACING RING ABOVE;;;;
+02DB;OGONEK;Sk;0;ON;<compat> 0020 0328;;;;N;SPACING OGONEK;;;;
+02DC;SMALL TILDE;Sk;0;ON;<compat> 0020 0303;;;;N;SPACING TILDE;;;;
+02DD;DOUBLE ACUTE ACCENT;Sk;0;ON;<compat> 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;;
+02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;;
+02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;;
+02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L;<super> 0263;;;;N;;;;;
+02E1;MODIFIER LETTER SMALL L;Lm;0;L;<super> 006C;;;;N;;;;;
+02E2;MODIFIER LETTER SMALL S;Lm;0;L;<super> 0073;;;;N;;;;;
+02E3;MODIFIER LETTER SMALL X;Lm;0;L;<super> 0078;;;;N;;;;;
+02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L;<super> 0295;;;;N;;;;;
+02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;;
+02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;;
+02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;;
+02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;;
+02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;;
+02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;;
+02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;;
+02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;;
+0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;Varia;;;
+0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;Oxia, Tonos;;;
+0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;;
+0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;;
+0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;;
+0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;;
+0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;Vrachy;;;
+0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;;
+0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;Dialytika;;;
+0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;;
+030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;;
+030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;;
+030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;;
+030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;;
+030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;;
+030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;;
+0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;;
+0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;;
+0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;;
+0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;Psili;;;
+0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;Dasia;;;
+0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;;
+0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;;
+0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;;
+0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;;
+0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;;
+031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;;
+031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;;
+031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;;
+031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;;
+031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;;
+031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;;
+0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;;
+0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;;
+0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;;
+0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;;
+0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;;
+0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;;
+0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;;
+0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;;
+0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;;
+0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;;
+032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;;
+032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;;
+032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;;
+032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;;
+032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;;
+032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;;
+0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;;
+0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;;
+0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;;
+0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;;
+0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;;
+0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;;
+0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;;
+0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;;
+0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;;
+0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;;
+033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;;
+033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;;
+033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;;
+033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;;
+033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;;
+033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;;
+0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;Vietnamese;;;
+0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;Vietnamese;;;
+0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;;
+0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;;
+0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;;
+0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399
+0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;;
+0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;;
+034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;;
+034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;;
+034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;;
+034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;;
+0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;;
+0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;;
+0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;;
+0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;;
+035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;;
+035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;;
+035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;;
+035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;;
+035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;;
+0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;;
+0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;;
+0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;;
+0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;;
+0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;;
+0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;;
+0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;;
+0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;;
+0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;;
+0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;;
+036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;;
+036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;;
+036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;;
+036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;;
+036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;;
+036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;;
+0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371;
+0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370
+0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373;
+0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372
+0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;;
+0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;;
+0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377;
+0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376
+037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;;
+037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD
+037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE
+037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF
+037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;;
+0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;;
+0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;;
+0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC;
+0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;;
+0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD;
+0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE;
+038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF;
+038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC;
+038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD;
+038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE;
+0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;;
+0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1;
+0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2;
+0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3;
+0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4;
+0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5;
+0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6;
+0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7;
+0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;
+0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9;
+039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA;
+039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB;
+039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC;
+039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD;
+039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE;
+039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF;
+03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0;
+03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1;
+03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3;
+03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4;
+03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5;
+03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6;
+03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7;
+03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8;
+03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9;
+03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA;
+03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB;
+03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386
+03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388
+03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389
+03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A
+03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;;
+03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391
+03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392
+03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393
+03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394
+03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395
+03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396
+03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397
+03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398
+03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399
+03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A
+03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B
+03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C
+03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D
+03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E
+03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F
+03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0
+03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1
+03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4
+03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5
+03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6
+03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7
+03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8
+03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9
+03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA
+03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB
+03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C
+03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E
+03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F
+03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7;
+03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392
+03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398
+03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;;
+03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;;
+03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;;
+03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6
+03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0
+03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF
+03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;*;;03D9;
+03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;*;03D8;;03D8
+03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB;
+03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA
+03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD;
+03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC
+03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF;
+03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE
+03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1;
+03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0
+03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3;
+03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2
+03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5;
+03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4
+03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7;
+03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6
+03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9;
+03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8
+03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB;
+03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA
+03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED;
+03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC
+03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF;
+03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE
+03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A
+03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1
+03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9
+03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;;
+03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;
+03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L;<compat> 03B5;;;;N;;;0395;;0395
+03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;;
+03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8;
+03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7
+03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2;
+03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB;
+03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA
+03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;;
+03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B;
+03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C;
+03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D;
+0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450;
+0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451;
+0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452;
+0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453;
+0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454;
+0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455;
+0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456;
+0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;Ukrainian;;0457;
+0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458;
+0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459;
+040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A;
+040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;Serbocroatian;;045B;
+040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C;
+040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D;
+040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;Byelorussian;;045E;
+040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F;
+0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430;
+0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431;
+0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432;
+0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433;
+0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434;
+0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435;
+0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436;
+0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437;
+0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438;
+0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439;
+041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A;
+041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B;
+041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C;
+041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D;
+041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E;
+041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F;
+0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440;
+0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441;
+0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442;
+0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443;
+0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444;
+0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445;
+0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446;
+0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447;
+0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448;
+0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449;
+042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A;
+042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B;
+042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C;
+042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D;
+042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E;
+042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F;
+0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410
+0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411
+0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412
+0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413
+0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414
+0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415
+0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416
+0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417
+0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418
+0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419
+043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A
+043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B
+043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C
+043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D
+043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E
+043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F
+0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420
+0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421
+0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422
+0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423
+0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424
+0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425
+0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426
+0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427
+0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428
+0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429
+044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A
+044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B
+044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C
+044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D
+044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E
+044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F
+0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400
+0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401
+0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;Serbocroatian;0402;;0402
+0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403
+0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404
+0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405
+0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406
+0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;Ukrainian;0407;;0407
+0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408
+0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409
+045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A
+045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;Serbocroatian;040B;;040B
+045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C
+045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D
+045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;Byelorussian;040E;;040E
+045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F
+0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461;
+0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460
+0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463;
+0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462
+0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465;
+0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464
+0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467;
+0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466
+0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469;
+0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468
+046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B;
+046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A
+046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D;
+046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C
+046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F;
+046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E
+0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471;
+0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470
+0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473;
+0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472
+0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475;
+0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474
+0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477;
+0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476
+0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479;
+0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478
+047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B;
+047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A
+047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D;
+047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C
+047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F;
+047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E
+0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481;
+0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480
+0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;;
+0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;;
+0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;;
+0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;;
+0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;;
+0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;;
+0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;;
+0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B;
+048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A
+048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D;
+048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C
+048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F;
+048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E
+0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491;
+0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490
+0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493;
+0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492
+0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495;
+0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494
+0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497;
+0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496
+0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499;
+0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498
+049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B;
+049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A
+049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D;
+049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C
+049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F;
+049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E
+04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1;
+04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0
+04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3;
+04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2
+04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5;
+04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4
+04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;Abkhasian;;04A7;
+04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;Abkhasian;04A6;;04A6
+04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9;
+04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8
+04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB;
+04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA
+04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD;
+04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC
+04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF;
+04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE
+04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1;
+04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0
+04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3;
+04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2
+04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;Abkhasian;;04B5;
+04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;Abkhasian;04B4;;04B4
+04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7;
+04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6
+04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9;
+04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8
+04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB;
+04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA
+04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD;
+04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC
+04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF;
+04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE
+04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF;
+04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2;
+04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1
+04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4;
+04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3
+04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6;
+04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5
+04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8;
+04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7
+04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA;
+04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9
+04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC;
+04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB
+04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE;
+04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD
+04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0
+04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1;
+04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0
+04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3;
+04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2
+04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5;
+04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4
+04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7;
+04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6
+04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9;
+04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8
+04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB;
+04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA
+04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD;
+04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC
+04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF;
+04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE
+04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1;
+04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0
+04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3;
+04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2
+04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5;
+04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4
+04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7;
+04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6
+04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9;
+04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8
+04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB;
+04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA
+04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED;
+04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC
+04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF;
+04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE
+04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1;
+04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0
+04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3;
+04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2
+04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5;
+04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4
+04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7;
+04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6
+04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9;
+04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8
+04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB;
+04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA
+04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD;
+04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC
+04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF;
+04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE
+0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501;
+0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500
+0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503;
+0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502
+0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505;
+0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504
+0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507;
+0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506
+0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509;
+0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508
+050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B;
+050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A
+050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D;
+050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C
+050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F;
+050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E
+0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511;
+0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510
+0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513;
+0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512
+0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515;
+0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514
+0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517;
+0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516
+0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519;
+0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518
+051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B;
+051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A
+051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D;
+051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C
+051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F;
+051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E
+0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521;
+0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520
+0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523;
+0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522
+0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561;
+0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562;
+0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563;
+0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564;
+0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565;
+0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566;
+0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567;
+0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568;
+0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569;
+053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A;
+053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B;
+053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C;
+053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D;
+053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E;
+053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F;
+0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570;
+0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571;
+0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572;
+0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573;
+0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574;
+0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575;
+0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576;
+0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577;
+0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578;
+0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579;
+054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A;
+054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B;
+054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C;
+054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D;
+054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E;
+054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F;
+0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580;
+0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581;
+0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582;
+0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583;
+0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584;
+0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585;
+0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586;
+0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;;
+055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;;
+055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;;
+055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;;
+055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;;
+055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;;
+0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531
+0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532
+0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533
+0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534
+0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535
+0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536
+0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537
+0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538
+0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539
+056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A
+056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B
+056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C
+056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D
+056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E
+056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F
+0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540
+0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541
+0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542
+0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543
+0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544
+0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545
+0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546
+0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547
+0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548
+0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549
+057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A
+057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B
+057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C
+057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D
+057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E
+057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F
+0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550
+0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551
+0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552
+0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553
+0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554
+0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555
+0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556
+0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;;
+0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;;
+058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;;
+0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;;
+0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;;
+0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;;
+0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;;
+0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;;
+0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;*;;;
+0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;;
+0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;*;;;
+0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;;
+059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;;
+059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;;
+059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;;
+059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;;
+059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;;
+059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;;
+05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;;
+05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;;
+05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;;
+05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;;
+05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;;
+05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;;
+05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;;
+05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;;
+05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;*;;;
+05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;;
+05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;*;;;
+05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;;
+05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;;
+05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;;
+05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;;
+05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;;
+05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;;
+05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;;
+05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;;
+05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;;
+05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;;
+05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;;
+05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;;
+05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;;
+05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;;
+05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;;
+05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;;
+05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;;
+05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;;
+05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;;
+05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;;
+05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;;
+05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;;
+05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;;
+05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;;
+05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;;
+05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;;
+05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;;
+05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;;
+05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;;
+05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;;
+05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;;
+05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;;
+05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;;
+05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;;
+05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;;
+05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;;
+05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;;
+05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;;
+05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;;
+05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;;
+05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;;
+05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;;
+05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;;
+05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;;
+05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;;
+05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;;
+05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;;
+05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;;
+05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;;
+05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;;
+05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;;
+05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;;
+05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;;
+05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;;
+05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;;
+05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;;
+05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;;
+05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;;
+0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;;
+0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;;
+0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;;
+0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;;
+0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;;
+0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;;
+0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;;
+0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;;
+060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;;
+060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;;
+060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;;
+060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;;
+0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;;
+0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;;
+0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;;
+0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;;
+0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;;
+0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;;
+0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;;
+0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;;
+061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;;
+061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;;
+061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;;
+061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;;
+0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;;
+0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;;
+0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;;
+0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;;
+0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;;
+0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;;
+0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;;
+0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;;
+0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;;
+062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;;
+062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;;
+062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;;
+062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;;
+062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;;
+062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;;
+0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;;
+0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;;
+0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;;
+0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;;
+0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;;
+0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;;
+0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;;
+0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;;
+0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;;
+063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;;
+063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;;
+0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;;
+0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;;
+0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;;
+0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;;
+0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;;
+0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;;
+0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;;
+0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;;
+064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;;
+064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;;
+064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;;
+064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;;
+064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;;
+064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;;
+0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;;
+0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;;
+0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;;
+0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;;
+0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;;
+0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;;
+0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;;
+0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;;
+0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;;
+065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;;
+065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;;
+0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;;
+0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;;
+0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;;
+0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;;
+0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;;
+0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;;
+0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;;
+0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;;
+0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;;
+0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;;
+066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;;
+066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;;
+066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;;
+066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;;
+066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;;
+0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;;
+0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;;
+0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;;
+0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;;
+0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;;
+0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;<compat> 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;;
+0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL;<compat> 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;;
+0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL;<compat> 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;;
+0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL;<compat> 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;;
+0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;;
+067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;;
+067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;;
+067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;;
+067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;;
+067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;;
+067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;;
+0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;;
+0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;;
+0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;;
+0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;;
+0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;;
+0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;;
+0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;;
+0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;;
+0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;;
+0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;;
+068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;;
+068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;;
+068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;;
+068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;;
+0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;;
+0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;;
+0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;;
+0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;;
+0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;;
+0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;;
+0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;;
+0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;;
+0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;;
+069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;;
+06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;;
+06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;;
+06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;;
+06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;;
+06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;;
+06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;;
+06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;;
+06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;;
+06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;;
+06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;;
+06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;;
+06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;*;;;
+06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;;
+06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;;
+06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;;
+06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;;
+06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;;
+06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;;
+06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;;
+06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;;
+06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;;
+06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;;
+06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;;
+06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;;
+06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;;
+06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;;
+06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;;
+06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;;
+06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;;
+06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;;
+06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;;
+06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;;
+06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;;
+06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;*;;;
+06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;;
+06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;;
+06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;;
+06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;;
+06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;;
+06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;;
+06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;;
+06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;;
+06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;;
+06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;;
+06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;;
+06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;;
+06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;;
+06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;;
+06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;;
+06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;;
+06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;;
+06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;;
+06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;;
+06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;;
+06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;;
+06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;;
+06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;;
+06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;;
+06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;;
+06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;;
+06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;;
+06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;;
+06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;;
+06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;;
+06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;;
+06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;;
+06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;;
+06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;;
+06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;;
+06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;;
+06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;;
+06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;;
+06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;;
+06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;;
+0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;;
+0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;;
+0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;;
+0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;;
+070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;;
+070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;;
+070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;;
+070F;SYRIAC ABBREVIATION MARK;Cf;0;BN;;;;;N;;;;;
+0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;;
+0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;;
+0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;;
+0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;;
+0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;;
+0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;;
+0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;;
+0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;;
+0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;;
+071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;;
+071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;;
+071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;;
+071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;;
+071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;;
+0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;;
+0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;;
+0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;;
+0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;;
+0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;;
+0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;;
+0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;;
+0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;;
+0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;;
+0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;;
+072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;;
+072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;;
+072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;;
+072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;;
+072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;;
+072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;;
+0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;;
+0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;;
+073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;;
+073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;;
+0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;;
+0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;;
+0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;;
+0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;;
+074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;;
+074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;;
+074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;;
+074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;;
+0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;;
+0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;;
+075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;;
+075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;;
+0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;;
+076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;;
+076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;;
+076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;;
+0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;;
+0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;;
+077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;;
+077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;;
+0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;;
+0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;;
+0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;;
+0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;;
+0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;;
+0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;;
+0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;;
+078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;;
+078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;;
+078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;;
+078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;;
+078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;;
+078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;;
+0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;;
+0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;;
+0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;;
+0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;;
+0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;;
+0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;;
+0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;;
+0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;;
+0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;;
+079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;;
+079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;;
+079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;;
+079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;;
+079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;;
+079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;;
+07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;;
+07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;;
+07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;;
+07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;;
+07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;;
+07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;;
+07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;;
+07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;;
+07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;;
+07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;;
+07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;;
+07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;;
+07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;;
+07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;;
+07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;;
+07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;;
+07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;;
+07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;;
+07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;;
+07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;;
+07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;;
+07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;;
+07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;;
+07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;;
+07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;;
+07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;;
+07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;;
+07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;;
+07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;;
+07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;;
+07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;;
+07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;;
+07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;;
+07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;;
+07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;;
+07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;;
+07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;;
+07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;;
+07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;;
+07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;;
+07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;;
+07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;;
+07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;;
+07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;;
+07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;;
+07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;;
+07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;;
+07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;;
+07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;;
+07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;;
+07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;;
+07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;;
+07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;;
+07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;;
+07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;;
+07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;;
+07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;;
+07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;;
+07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;;
+07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;;
+07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;;
+07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;;
+07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;;
+07F8;NKO COMMA;Po;0;ON;;;;;N;;;;;
+07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;;
+0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;;
+0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;;
+0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;;
+0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;;
+0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;;
+0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;;
+090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;;
+090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;;
+090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;;
+090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;;
+0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;;
+0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;;
+0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;;
+0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;;
+0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;;
+0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;;
+0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;;
+0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;;
+091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;;
+091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;;
+091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;;
+091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;;
+091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;;
+091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;;
+0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;;
+0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;;
+0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;;
+0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;;
+092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;;
+092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;;
+092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;;
+092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;;
+092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;;
+092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;;
+0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;;
+0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;;
+0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;;
+0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;;
+0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;;
+0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;;
+0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;;
+093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;;
+0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;;
+094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;;
+0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;;
+0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;;
+0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;;
+0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;;
+095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;;
+095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;;
+095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;;
+095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;;
+095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;;
+095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;;
+0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;;
+0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;;
+0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;;
+097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;;
+097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;;
+097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;;
+097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;;
+0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;;
+0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;;
+0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;;
+0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;;
+0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;;
+098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;;
+098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;;
+0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;;
+0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;;
+0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;;
+0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;;
+0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;;
+0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;;
+099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;;
+099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;;
+099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;;
+099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;;
+099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;;
+099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;;
+09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;;
+09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;;
+09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;;
+09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;;
+09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;;
+09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;;
+09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;;
+09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;;
+09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;;
+09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;;
+09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;;
+09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;;
+09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;;
+09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;;
+09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;;
+09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;;
+09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;;
+09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;;
+09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;;
+09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;;
+09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;;
+09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;;
+09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;;
+09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;;
+09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;;
+09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;Assamese;;;
+09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;Assamese;;;
+09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;;
+09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1;N;;;;;
+09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;2;N;;;;;
+09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3;N;;;;;
+09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;4;N;;;;;
+09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;;N;;;;;
+09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;;
+09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;;
+0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;;
+0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;;
+0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;;
+0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;;
+0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;;
+0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;;
+0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;;
+0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;;
+0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;;
+0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;;
+0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;;
+0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;;
+0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;;
+0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;;
+0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;;
+0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;;
+0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;;
+0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;;
+0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;;
+0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;;
+0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;;
+0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;;
+0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;;
+0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;;
+0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;;
+0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;;
+0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;;
+0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;;
+0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;;
+0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;;
+0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;;
+0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;;
+0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;;
+0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;;
+0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;;
+0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;;
+0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;;
+0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;;
+0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;;
+0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;;
+0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;;
+0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;;
+0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;;
+0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;;
+0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;;
+0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;;
+0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;;
+0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;;
+0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;;
+0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;;
+0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;;
+0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;;
+0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;;
+0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;;
+0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;;
+0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;;
+0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;;
+0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;;
+0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;;
+0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;;
+0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;;
+0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;;
+0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;;
+0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;;
+0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;;
+0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;;
+0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;;
+0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;;
+0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;;
+0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;;
+0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;;
+0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;;
+0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;;
+0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;;
+0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;;
+0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;;
+0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;;
+0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;;
+0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;;
+0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;;
+0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;;
+0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;;
+0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;;
+0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;;
+0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;;
+0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;;
+0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;;
+0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;;
+0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;;
+0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;;
+0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;;
+0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;;
+0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;;
+0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;;
+0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;;
+0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;;
+0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;;
+0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;;
+0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;;
+0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;;
+0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;;
+0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;;
+0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;;
+0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;;
+0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;;
+0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;;
+0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;;
+0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;;
+0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;;
+0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;;
+0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;;
+0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;;
+0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;;
+0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;;
+0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;;
+0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;;
+0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;;
+0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;;
+0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;;
+0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;;
+0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;;
+0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;;
+0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;;
+0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;;
+0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;;
+0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;;
+0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;;
+0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;;
+0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;;
+0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;;
+0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;Naal;;;
+0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;Maatham;;;
+0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;Varudam;;;
+0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;Patru;;;
+0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;Varavu;;;
+0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;Merpadi;;;
+0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;Rupai;;;
+0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;Enn;;;
+0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
+0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;;
+0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;;
+0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;;
+0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;;
+0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;;
+0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;;
+0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;;
+0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;;
+0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;;
+0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;;
+0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;;
+0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;;
+0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;;
+0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;;
+0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;;
+0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;;
+0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;;
+0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;;
+0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;;
+0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;;
+0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;;
+0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;;
+0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;;
+0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;;
+0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;;
+0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;;
+0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;;
+0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;;
+0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;;
+0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;;
+0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;;
+0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;;
+0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;;
+0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;;
+0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;;
+0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;;
+0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;;
+0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;;
+0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;;
+0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;;
+0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;;
+0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;;
+0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;;
+0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;;
+0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;;
+0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
+0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
+0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;;
+0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
+0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
+0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;;
+0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;;
+0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;;
+0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;;
+0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;;
+0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;;
+0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;;
+0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;;
+0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;;
+0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;;
+0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;;
+0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;;
+0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;;
+0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;;
+0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;;
+0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;;
+0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;;
+0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;;
+0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;;
+0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;;
+0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;;
+0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;;
+0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;;
+0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;;
+0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;;
+0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;;
+0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;;
+0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;;
+0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;;
+0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;;
+0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;;
+0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;;
+0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;;
+0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;;
+0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;;
+0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;;
+0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;;
+0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;;
+0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;;
+0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;;
+0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0CF1;KANNADA SIGN JIHVAMULIYA;So;0;ON;;;;;N;;;;;
+0CF2;KANNADA SIGN UPADHMANIYA;So;0;ON;;;;;N;;;;;
+0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;;
+0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;;
+0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;;
+0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;;
+0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;;
+0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;;
+0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;;
+0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;;
+0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;;
+0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;;
+0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;;
+0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;;
+0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;;
+0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;;
+0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;;
+0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;;
+0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;;
+0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;;
+0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;;
+0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;;
+0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;;
+0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;;
+0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;;
+0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;;
+0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;;
+0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;;
+0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;;
+0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;;
+0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;;
+0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;;
+0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;;
+0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;;
+0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;;
+0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;;
+0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;;
+0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;;
+0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;;
+0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;;
+0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;;
+0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;;
+0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;;
+0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;;
+0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;;
+0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;;
+0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;;
+0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;;
+0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;;
+0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;;
+0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;;
+0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;;
+0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;;
+0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;;
+0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;;
+0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;;
+0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;;
+0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;;
+0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;;
+0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;;
+0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;;
+0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;;
+0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;;
+0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;;
+0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;;
+0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;;
+0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;;
+0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;;
+0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;;
+0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;;
+0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;;
+0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;;
+0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;;
+0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;;
+0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;;
+0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;;
+0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;;
+0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;;
+0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;;
+0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;;
+0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;;
+0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;;
+0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;;
+0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;;
+0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;;
+0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;;
+0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;;
+0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;;
+0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;;
+0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;;
+0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;;
+0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;;
+0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;;
+0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;;
+0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;;
+0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;;
+0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;;
+0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;;
+0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;;
+0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;;
+0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;;
+0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;;
+0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;;
+0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;;
+0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;;
+0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;;
+0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;;
+0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;;
+0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;;
+0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;;
+0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;;
+0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;;
+0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;;
+0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;;
+0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;;
+0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;;
+0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;;
+0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;;
+0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;;
+0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;;
+0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;;
+0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;;
+0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;;
+0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;;
+0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;;
+0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;;
+0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;;
+0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;;
+0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;;
+0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;;
+0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;;
+0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;;
+0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;paiyan noi;;;
+0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;;
+0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;;
+0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;;
+0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;;
+0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;;
+0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;;
+0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;;
+0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;sara uue;;;
+0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;;
+0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;;
+0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;;
+0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;;
+0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;;
+0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;;
+0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;;
+0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;sara ai mai muan;;;
+0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;sara ai mai malai;;;
+0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;lakkhang yao;;;
+0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;mai yamok;;;
+0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;mai taikhu;;;
+0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;;
+0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;;
+0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;;
+0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;;
+0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;;
+0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;nikkhahit;;;
+0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;;
+0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;;
+0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;;
+0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;;
+0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;;
+0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;;
+0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;;
+0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;;
+0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;;
+0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;;
+0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;;
+0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;;
+0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;;
+0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;;
+0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;;
+0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;;
+0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;;
+0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;;
+0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;;
+0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;;
+0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;;
+0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;;
+0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;;
+0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;;
+0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;;
+0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;;
+0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;;
+0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;;
+0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;;
+0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;;
+0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;;
+0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;;
+0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;;
+0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;;
+0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;;
+0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;;
+0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;;
+0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;;
+0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;;
+0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;;
+0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;;
+0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;;
+0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;;
+0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;;
+0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;;
+0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;;
+0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;;
+0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;;
+0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;;
+0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;;
+0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;;
+0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;;
+0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;;
+0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;;
+0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;;
+0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;;
+0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;ter yik go a thung;;;
+0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;ter yik go wum nam chey ma;;;
+0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;ter yik go wum ter tsek ma;;;
+0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;yik go dun ma;;;
+0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;yik go kab ma;;;
+0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;yik go pur shey ma;;;
+0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;yik go tsek shey ma;;;
+0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;drul shey;;;
+0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;kur yik go;;;
+0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;ka sho yik go;;;
+0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;tsek;;;
+0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;tsek tar;;;
+0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;shey;;;
+0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;nyi shey;;;
+0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;tsek shey;;;
+0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;nyi tsek shey;;;
+0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;rinchen pung shey;;;
+0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;gya tram shey;;;
+0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;dzu ta me long chen;;;
+0F14;TIBETAN MARK GTER TSHEG;So;0;L;;;;;N;TIBETAN COMMA;ter tsek;;;
+0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;che ta;;;
+0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;hlak ta;;;
+0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;trachen char ta;;;
+0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;kyu pa;;;
+0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;dong tsu;;;
+0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;deka chig;;;
+0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;deka nyi;;;
+0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;deka sum;;;
+0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;dena chig;;;
+0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;dena nyi;;;
+0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;deka dena;;;
+0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;;
+0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;;
+0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;;
+0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;;
+0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;;
+0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;;
+0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;;
+0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;;
+0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;;
+0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;;
+0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;du ta;;;
+0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;nge zung nyi da;;;
+0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;dzu ta shi mig chen;;;
+0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;;
+0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;;
+0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;;
+0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;gug ta yun;;;
+0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;gug ta ye;;;
+0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;ang kang yun;;;
+0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;ang kang ye;;;
+0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;;
+0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;;
+0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;;
+0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;;
+0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;;
+0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;;
+0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;;
+0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;;
+0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;;
+0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;;
+0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;;
+0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;;
+0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;;
+0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;;
+0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;;
+0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;;
+0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;;
+0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;;
+0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;;
+0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;;
+0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;;
+0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;;
+0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;;
+0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;;
+0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;;
+0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;;
+0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;;
+0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;;
+0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;;
+0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;;
+0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;;
+0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;*;;;
+0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;;
+0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;;
+0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;;
+0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;;
+0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;;
+0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;;
+0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;;
+0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;;
+0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;;
+0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;;
+0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;;
+0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;;
+0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;;
+0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;;
+0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;;
+0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;;
+0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;;
+0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;;
+0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;;
+0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;;
+0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;;
+0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;;
+0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;je su nga ro;;;
+0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;nam chey;;;
+0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;;
+0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;;
+0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;nyi da na da;;;
+0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;nan de;;;
+0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;;
+0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;;
+0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;ji ta;;;
+0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;yang ta;;;
+0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;che tsa chen;;;
+0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;chu chen;;;
+0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;tru chen ging;;;
+0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;tru me ging;;;
+0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;;
+0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;;
+0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;;
+0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;;
+0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;;
+0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;;
+0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;;
+0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;;
+0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;;
+0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;;
+0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;;
+0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;;
+0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;;
+0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;;
+0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;;
+0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;;
+0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;;
+0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;;
+0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;;
+0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;;
+0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;;
+0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;;
+0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;;
+0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;;
+0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;;
+0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;;
+0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;;
+0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;;
+0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;*;;;
+0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;;
+0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;;
+0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;;
+0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;*;;;
+0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;*;;;
+0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;;
+0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;;
+0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;;
+0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;;
+0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;;
+0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;;
+0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;;
+0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;*;;;
+0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;*;;;
+0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;*;;;
+0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;kuruka;;;
+0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;kuruka shi mik chen;;;
+0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;;
+0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;;
+0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;chang tyu;;;
+0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;bub chey;;;
+0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;drilbu;;;
+0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;dorje;;;
+0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;pema den;;;
+0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;dorje gya dram;;;
+0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;phurba;;;
+0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;norbu;;;
+0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;;
+0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;;
+0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;;
+0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;dena deka;;;
+0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;;
+0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;ka shog gi go gyen;;;
+0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;nyam yig gi go gyen;;;
+0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;nyi tsek;;;
+0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;da nying yik go dun ma;;;
+0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;da nying yik go kab ma;;;
+1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;;
+1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;;
+1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;;
+1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;;
+1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;;
+1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;;
+1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;;
+1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;;
+1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;;
+1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;;
+100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;;
+100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;;
+100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;;
+100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;;
+100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;;
+100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;;
+1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;;
+1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;;
+1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;;
+1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;;
+1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;;
+1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;;
+1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;;
+1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;;
+1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;;
+1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;;
+101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;;
+101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;;
+101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;;
+101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;;
+101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;;
+101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;;
+1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;;
+1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;;
+1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;;
+1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;;
+1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;;
+1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;;
+1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;;
+1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;;
+1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;;
+1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;;
+102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;;
+102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;;
+102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;;
+1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;;
+1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;;
+1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;;
+1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;;
+103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;;
+103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;;
+103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;;
+103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;;
+103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;;
+1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;;
+104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;;
+104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;;
+104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;;
+104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;;
+104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;;
+1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;;
+1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;;
+1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;;
+105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;;
+105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;;
+105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;;
+105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;;
+105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;;
+1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;;
+1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;;
+1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;;
+1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;;
+1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;;
+1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;;
+1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;;
+1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;;
+1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;;
+1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;;
+106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;;
+106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;;
+106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;;
+106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;;
+106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;;
+106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;;
+1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;;
+1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;;
+1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;;
+1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;;
+1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;;
+1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;;
+1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;;
+1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;;
+1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;;
+1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;;
+107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;;
+107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;;
+107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;;
+107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;;
+107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;;
+107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;;
+1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;;
+1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;;
+1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;;
+1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;;
+1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;;
+1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;;
+1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;;
+1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;;
+1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;;
+1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;;
+108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;;
+108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;;
+108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;;
+108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;;
+108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;;
+108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;;
+1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;;
+109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;;
+10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;2D00;
+10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;2D01;
+10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;2D02;
+10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;2D03;
+10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;2D04;
+10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;2D05;
+10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;2D06;
+10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;2D07;
+10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;2D08;
+10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;2D09;
+10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;2D0A;
+10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;2D0B;
+10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;2D0C;
+10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;2D0D;
+10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;2D0E;
+10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;2D0F;
+10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;2D10;
+10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;2D11;
+10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;2D12;
+10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;2D13;
+10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;2D14;
+10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;2D15;
+10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;2D16;
+10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;2D17;
+10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;2D18;
+10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;2D19;
+10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;2D1A;
+10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;2D1B;
+10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;2D1C;
+10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;2D1D;
+10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;2D1E;
+10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;2D1F;
+10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;2D20;
+10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;2D21;
+10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;2D22;
+10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;2D23;
+10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;2D24;
+10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;2D25;
+10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;;
+10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;;
+10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;;
+10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;;
+10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;;
+10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;;
+10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;;
+10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;;
+10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;;
+10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;;
+10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;;
+10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;;
+10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;;
+10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;;
+10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;;
+10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;;
+10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;;
+10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;;
+10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;;
+10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;;
+10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;;
+10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;;
+10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;;
+10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;;
+10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;;
+10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;;
+10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;;
+10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;;
+10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;;
+10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;;
+10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;;
+10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;;
+10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;;
+10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;;
+10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;;
+10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;;
+10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;;
+10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;;
+10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;;
+10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;;
+10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;;
+10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;;
+10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;;
+10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;;
+1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
+1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
+1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
+1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;;
+1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;dd *;;;
+1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;r *;;;
+1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;m *;;;
+1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;b *;;;
+1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;bb *;;;
+1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;s *;;;
+110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;;
+110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;;
+110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;j *;;;
+110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;jj *;;;
+110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;;
+110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;;
+1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;;
+1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;;
+1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;h *;;;
+1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;;
+1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;;
+1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;;
+111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;;
+111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;;
+1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;;
+1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;;
+1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;;
+112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;;
+112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;;
+112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;;
+1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;;
+1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;;
+113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;;
+113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;;
+113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;;
+113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;;
+113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;;
+1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;;
+1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;;
+1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;;
+1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;;
+114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;;
+114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;;
+114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;;
+114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;;
+114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;;
+1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;;
+1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;;
+1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;;
+1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;;
+1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;;
+1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;;
+1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;;
+1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;;
+1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;;
+1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;;
+1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;;
+116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;;
+116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;;
+116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;;
+116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;;
+116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;;
+116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;;
+1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;;
+1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;;
+1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;;
+1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;;
+1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;;
+1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;;
+1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;;
+1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;;
+1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;;
+1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;;
+117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;;
+117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;;
+117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;;
+117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;;
+117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;;
+117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;;
+1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;;
+1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;;
+1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;;
+1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;;
+1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;;
+1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;;
+1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;;
+1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;;
+1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;;
+1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;;
+118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;;
+118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;;
+118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;;
+118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;;
+118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;;
+118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;;
+1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;;
+1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;;
+1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;;
+1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;;
+1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;;
+1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;;
+1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;;
+1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;;
+1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;;
+1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;;
+119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;;
+119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;;
+119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;;
+119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;;
+119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;;
+119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;;
+11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;;
+11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;;
+11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;;
+11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
+11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
+11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;gs *;;;
+11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
+11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;nj *;;;
+11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;nh *;;;
+11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;;
+11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;l *;;;
+11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;lg *;;;
+11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;lm *;;;
+11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;lb *;;;
+11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;ls *;;;
+11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;lt *;;;
+11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;lp *;;;
+11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;lh *;;;
+11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;m *;;;
+11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;b *;;;
+11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;bs *;;;
+11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;s *;;;
+11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;;
+11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;ng *;;;
+11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;j *;;;
+11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;;
+11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;;
+11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;;
+11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;;
+11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;h *;;;
+11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;;
+11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;;
+11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;;
+11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;;
+11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;;
+11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;;
+11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;;
+11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;;
+11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;;
+11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;;
+11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;;
+11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;;
+11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;;
+11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;;
+11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
+11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;;
+11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;;
+11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;;
+11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;;
+1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;;
+1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;;
+120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;;
+1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;;
+1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;;
+1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;;
+1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;;
+1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;;
+1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;;
+1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;;
+1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;;
+1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;;
+121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;;
+1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;;
+1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;;
+1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;;
+1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;;
+1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;;
+1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;;
+1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;;
+1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;;
+1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;;
+122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;;
+1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;;
+1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;;
+1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;;
+123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;;
+1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;;
+1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;;
+1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;;
+1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;;
+1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;;
+1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;;
+124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;;
+124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;;
+124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;;
+124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;;
+1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;;
+1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;;
+1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;;
+1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;;
+1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;;
+1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;;
+1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;;
+1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;;
+125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;;
+125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;;
+125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;;
+125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;;
+1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;;
+1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;;
+1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;;
+126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;;
+1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;;
+1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;;
+1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;;
+127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;;
+1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;;
+1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;;
+1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;;
+1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;;
+1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;;
+1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;;
+1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;;
+128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;;
+128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;;
+128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;;
+128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;;
+1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;;
+1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;;
+1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;;
+129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;;
+12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;;
+12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;;
+12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;;
+12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;;
+12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;;
+12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;;
+12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;;
+12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;;
+12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;;
+12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;;
+12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;;
+12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;;
+12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;;
+12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;;
+12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;;
+12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;;
+12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;;
+12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;;
+12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;;
+12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;;
+12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;;
+12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;;
+12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;;
+12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;;
+12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;;
+12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;;
+12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;;
+12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;;
+12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;;
+12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;;
+12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;;
+12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;;
+12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;;
+12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;;
+12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;;
+12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;;
+12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;;
+12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;;
+12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;;
+12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;;
+12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;;
+12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;;
+12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;;
+12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;;
+12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;;
+12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;;
+12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;;
+1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;;
+1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;;
+1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;;
+130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;;
+1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;;
+1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;;
+1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;;
+1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;;
+1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;;
+1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;;
+131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;;
+131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;;
+1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;;
+1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;;
+1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;;
+132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;;
+132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;;
+132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;;
+1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;;
+1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;;
+1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;;
+1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;;
+1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;;
+1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;;
+1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;;
+1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;;
+1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;;
+1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;;
+133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;;
+133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;;
+133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;;
+133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;;
+133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;;
+133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;;
+1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;;
+1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;;
+1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;;
+1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;;
+1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;;
+1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;;
+1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;;
+1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;;
+1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;;
+134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;;
+1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;;
+1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;;
+1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;;
+1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;;
+135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;;
+135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;;
+1360;ETHIOPIC SECTION MARK;So;0;L;;;;;N;;;;;
+1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;;
+1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;;
+1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;;
+1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;;
+1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;;
+1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;;
+1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;;
+1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;;
+136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;;
+136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;;
+136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;;
+136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;;
+136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;;
+136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;;
+1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;;
+1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;;
+1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;;
+1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;;
+1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;;
+137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;;
+137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;;
+1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;;
+1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;;
+1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;;
+1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;;
+1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;;
+1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;;
+1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;;
+1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;;
+1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;;
+138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;;
+138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;;
+138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;;
+138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;;
+138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;;
+138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;;
+1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;;
+1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;;
+1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;;
+1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;;
+1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;;
+1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;;
+1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;;
+1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;;
+1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;;
+1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;;
+13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;;
+13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;;
+13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;;
+13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;;
+13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;;
+13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;;
+13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;;
+13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;;
+13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;;
+13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;;
+13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;;
+13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;;
+13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;;
+13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;;
+13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;;
+13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;;
+13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;;
+13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;;
+13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;;
+13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;;
+13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;;
+13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;;
+13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;;
+13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;;
+13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;;
+13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;;
+13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;;
+13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;;
+13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;;
+13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;;
+13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;;
+13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;;
+13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;;
+13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;;
+13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;;
+13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;;
+13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;;
+13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;;
+13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;;
+13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;;
+13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;;
+13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;;
+13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;;
+13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;;
+13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;;
+13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;;
+13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;;
+13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;;
+13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;;
+13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;;
+13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;;
+13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;;
+13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;;
+13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;;
+13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;;
+13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;;
+13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;;
+13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;;
+13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;;
+13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;;
+13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;;
+13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;;
+13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;;
+13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;;
+13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;;
+13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;;
+13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;;
+13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;;
+13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;;
+13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;;
+13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;;
+13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;;
+13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;;
+13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;;
+13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;;
+13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;;
+13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;;
+13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;;
+13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;;
+13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;;
+13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;;
+13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;;
+13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;;
+13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;;
+13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;;
+1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;;
+1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;;
+1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;;
+1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;;
+1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;;
+1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;;
+1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;;
+1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;;
+1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;;
+140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;;
+140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;;
+140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;;
+140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;;
+140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;;
+140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;;
+1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;;
+1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;;
+1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;;
+1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;;
+1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;;
+1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;;
+1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;;
+1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;;
+1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;;
+1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;;
+141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;;
+141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;;
+141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;;
+141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;;
+141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;;
+1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;;
+1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;;
+1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;;
+1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;;
+1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;;
+1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;;
+1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;;
+1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;;
+1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;;
+1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;;
+142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;;
+142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;;
+142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;;
+142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;;
+142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;;
+142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;;
+1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;;
+1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;;
+1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;;
+1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;;
+1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;;
+1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;;
+1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;;
+1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;;
+1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;;
+1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;;
+143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;;
+143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;;
+143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;;
+143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;;
+143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;;
+143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;;
+1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;;
+1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;;
+1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;;
+1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;;
+1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;;
+1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;;
+1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;;
+1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;;
+144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;;
+144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;;
+144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;;
+144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;;
+144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;;
+144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;;
+1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;;
+1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;;
+1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;;
+1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;;
+1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;;
+1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;;
+1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;;
+1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;;
+1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;;
+1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;;
+145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;;
+145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;;
+145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;;
+145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;;
+145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;;
+145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;;
+1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;;
+1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;;
+1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;;
+1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;;
+1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;;
+1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;;
+1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;;
+1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;;
+1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;;
+1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;;
+146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;;
+146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;;
+146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;;
+146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;;
+146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;;
+146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;;
+1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;;
+1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;;
+1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;;
+1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;;
+1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;;
+1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;;
+1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;;
+1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;;
+1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;;
+1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;;
+147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;;
+147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;;
+147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;;
+147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;;
+147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;;
+147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;;
+1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;;
+1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;;
+1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;;
+1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;;
+1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;;
+1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;;
+1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;;
+1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;;
+1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;;
+1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;;
+148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;;
+148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;;
+148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;;
+148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;;
+148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;;
+148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;;
+1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;;
+1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;;
+1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;;
+1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;;
+1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;;
+1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;;
+1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;;
+1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;;
+1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;;
+1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;;
+149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;;
+149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;;
+149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;;
+149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;;
+149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;;
+149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;;
+14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;;
+14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;;
+14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;;
+14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;;
+14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;;
+14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;;
+14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;;
+14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;;
+14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;;
+14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;;
+14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;;
+14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;;
+14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;;
+14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;;
+14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;;
+14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;;
+14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;;
+14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;;
+14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;;
+14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;;
+14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;;
+14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;;
+14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;;
+14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;;
+14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;;
+14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;;
+14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;;
+14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;;
+14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;;
+14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;;
+14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;;
+14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;;
+14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;;
+14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;;
+14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;;
+14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;;
+14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;;
+14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;;
+14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;;
+14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;;
+14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;;
+14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;;
+14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;;
+14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;;
+14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;;
+14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;;
+14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;;
+14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;;
+14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;;
+14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;;
+14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;;
+14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;;
+14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;;
+14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;;
+14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;;
+14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;;
+14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;;
+14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;;
+14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;;
+14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;;
+14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;;
+14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;;
+14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;;
+14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;;
+14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;;
+14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;;
+14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;;
+14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;;
+14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;;
+14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;;
+14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;;
+14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;;
+14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;;
+14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;;
+14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;;
+14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;;
+14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;;
+14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;;
+14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;;
+14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;;
+14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;;
+14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;;
+14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;;
+14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;;
+14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;;
+14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;;
+14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;;
+14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;;
+14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;;
+14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;;
+14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;;
+14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;;
+14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;;
+14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;;
+14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;;
+14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;;
+1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;;
+1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;;
+1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;;
+1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;;
+1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;;
+1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;;
+1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;;
+1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;;
+1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;;
+1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;;
+150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;;
+150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;;
+150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;;
+150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;;
+150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;;
+150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;;
+1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;;
+1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;;
+1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;;
+1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;;
+1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;;
+1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;;
+1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;;
+1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;;
+1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;;
+1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;;
+151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;;
+151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;;
+151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;;
+151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;;
+151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;;
+151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;;
+1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;;
+1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;;
+1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;;
+1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;;
+1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;;
+1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;;
+1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;;
+1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;;
+1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;;
+1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;;
+152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;;
+152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;;
+152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;;
+152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;;
+152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;;
+152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;;
+1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;;
+1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;;
+1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;;
+1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;;
+1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;;
+1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;;
+1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;;
+1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;;
+1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;;
+1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;;
+153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;;
+153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;;
+153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;;
+153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;;
+153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;;
+153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;;
+1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;;
+1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;;
+1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;;
+1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;;
+1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;;
+1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;;
+1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;;
+1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;;
+1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;;
+1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;;
+154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;;
+154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;;
+154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;;
+154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;;
+154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;;
+154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;;
+1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;;
+1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;;
+1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;;
+1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;;
+1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;;
+1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;;
+1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;;
+1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;;
+1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;;
+1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;;
+155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;;
+155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;;
+155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;;
+155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;;
+155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;;
+155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;;
+1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;;
+1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;;
+1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;;
+1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;;
+1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;;
+1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;;
+1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;;
+1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;;
+1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;;
+1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;;
+156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;;
+156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;;
+156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;;
+156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;;
+156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;;
+156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;;
+1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;;
+1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;;
+1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;;
+1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;;
+1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;;
+1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;;
+1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;;
+1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;;
+1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;;
+1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;;
+157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;;
+157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;;
+157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;;
+157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;;
+157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;;
+157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;;
+1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;;
+1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;;
+1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;;
+1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;;
+1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;;
+1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;;
+1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;;
+1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;;
+1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;;
+1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;;
+158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;;
+158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;;
+158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;;
+158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;;
+158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;;
+158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;;
+1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;;
+1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;;
+1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;;
+1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;;
+1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;;
+1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;;
+1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;;
+1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;;
+1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;;
+1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;;
+159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;;
+159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;;
+159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;;
+159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;;
+159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;;
+159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;;
+15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;;
+15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;;
+15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;;
+15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;;
+15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;;
+15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;;
+15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;;
+15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;;
+15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;;
+15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;;
+15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;;
+15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;;
+15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;;
+15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;;
+15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;;
+15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;;
+15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;;
+15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;;
+15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;;
+15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;;
+15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;;
+15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;;
+15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;;
+15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;;
+15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;;
+15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;;
+15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;;
+15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;;
+15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;;
+15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;;
+15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;;
+15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;;
+15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;;
+15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;;
+15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;;
+15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;;
+15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;;
+15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;;
+15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;;
+15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;;
+15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;;
+15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;;
+15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;;
+15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;;
+15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;;
+15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;;
+15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;;
+15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;;
+15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;;
+15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;;
+15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;;
+15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;;
+15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;;
+15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;;
+15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;;
+15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;;
+15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;;
+15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;;
+15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;;
+15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;;
+15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;;
+15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;;
+15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;;
+15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;;
+15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;;
+15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;;
+15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;;
+15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;;
+15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;;
+15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;;
+15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;;
+15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;;
+15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;;
+15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;;
+15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;;
+15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;;
+15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;;
+15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;;
+15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;;
+15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;;
+15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;;
+15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;;
+15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;;
+15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;;
+15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;;
+15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;;
+15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;;
+15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;;
+15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;;
+15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;;
+15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;;
+15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;;
+15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;;
+15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;;
+15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;;
+15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;;
+1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;;
+1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;;
+1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;;
+1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;;
+1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;;
+1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;;
+1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;;
+1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;;
+1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;;
+1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;;
+160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;;
+160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;;
+160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;;
+160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;;
+160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;;
+160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;;
+1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;;
+1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;;
+1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;;
+1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;;
+1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;;
+1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;;
+1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;;
+1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;;
+1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;;
+1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;;
+161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;;
+161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;;
+161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;;
+161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;;
+161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;;
+161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;;
+1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;;
+1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;;
+1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;;
+1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;;
+1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;;
+1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;;
+1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;;
+1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;;
+1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;;
+1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;;
+162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;;
+162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;;
+162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;;
+162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;;
+162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;;
+162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;;
+1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;;
+1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;;
+1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;;
+1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;;
+1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;;
+1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;;
+1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;;
+1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;;
+1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;;
+1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;;
+163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;;
+163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;;
+163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;;
+163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;;
+163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;;
+163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;;
+1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;;
+1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;;
+1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;;
+1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;;
+1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;;
+1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;;
+1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;;
+1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;;
+1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;;
+1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;;
+164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;;
+164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;;
+164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;;
+164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;;
+164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;;
+164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;;
+1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;;
+1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;;
+1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;;
+1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;;
+1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;;
+1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;;
+1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;;
+1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;;
+1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;;
+1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;;
+165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;;
+165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;;
+165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;;
+165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;;
+165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;;
+165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;;
+1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;;
+1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;;
+1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;;
+1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;;
+1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;;
+1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;;
+1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;;
+1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;;
+1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;;
+1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;;
+166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;;
+166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;;
+166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;;
+166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;;
+166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;;
+166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;;
+1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;;
+1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;;
+1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;;
+1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;;
+1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;;
+1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;;
+1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;;
+1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;;
+1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;;
+1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;;
+1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;;
+1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;;
+1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;;
+1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;;
+1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;;
+1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;;
+1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;;
+168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;;
+168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;;
+168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;;
+168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;;
+168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;;
+168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;;
+1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;;
+1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;;
+1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;;
+1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;;
+1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;;
+1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;;
+1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;;
+1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;;
+1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;;
+1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;;
+169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;;
+169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;;
+169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;;
+16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;;
+16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;;
+16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;;
+16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;;
+16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;;
+16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;;
+16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;;
+16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;;
+16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;;
+16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;;
+16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;;
+16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;;
+16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;;
+16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;;
+16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;;
+16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;;
+16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;;
+16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;;
+16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;;
+16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;;
+16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;;
+16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;;
+16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;;
+16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;;
+16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;;
+16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;;
+16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;;
+16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;;
+16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;;
+16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;;
+16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;;
+16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;;
+16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;;
+16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;;
+16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;;
+16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;;
+16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;;
+16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;;
+16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;;
+16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;;
+16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;;
+16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;;
+16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;;
+16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;;
+16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;;
+16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;;
+16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;;
+16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;;
+16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;;
+16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;;
+16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;;
+16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;;
+16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;;
+16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;;
+16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;;
+16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;;
+16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;;
+16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;;
+16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;;
+16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;;
+16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;;
+16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;;
+16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;;
+16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;;
+16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;;
+16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;;
+16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;;
+16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;;
+16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;;
+16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;;
+16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;;
+16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;golden number 17;;;
+16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;golden number 18;;;
+16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;golden number 19;;;
+1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;;
+1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;;
+1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;;
+1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;;
+1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;;
+1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;;
+1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;;
+1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;;
+1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;;
+1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;;
+170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;;
+170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;;
+170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;;
+170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;;
+170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;;
+1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;;
+1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;;
+1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;;
+1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;;
+1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;;
+1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;;
+1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;;
+1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;;
+1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;;
+1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;;
+1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;;
+1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;;
+172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;;
+172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;;
+172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;;
+172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;;
+172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;;
+172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;;
+1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;;
+1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;;
+1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;;
+1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;;
+1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;;
+1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;;
+1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;;
+1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;;
+1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;;
+1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;;
+1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;;
+1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;;
+1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;;
+174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;;
+174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;;
+174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;;
+174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;;
+174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;;
+174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;;
+1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;;
+1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;;
+1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;;
+1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;;
+1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;;
+1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;;
+1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;;
+1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;;
+1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;;
+1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;;
+1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;;
+176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;;
+176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;;
+176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;;
+176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;;
+176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;;
+1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;;
+1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;;
+1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;;
+1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;;
+1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;;
+1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;;
+1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;;
+1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;;
+1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;;
+1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;;
+1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;;
+178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;;
+178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;;
+178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;;
+178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;;
+178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;;
+178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;;
+1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;;
+1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;;
+1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;;
+1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;;
+1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;;
+1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;;
+1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;;
+1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;;
+1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;;
+1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;;
+179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;;
+179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;;
+179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;;
+179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;;
+179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;;
+179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;;
+17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;;
+17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;;
+17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;;
+17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;*;;;
+17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;*;;;
+17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;;
+17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;;
+17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;;
+17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;;
+17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;;
+17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;;
+17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;;
+17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;;
+17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;;
+17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;;
+17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;;
+17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;;
+17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;;
+17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;;
+17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;;
+17B4;KHMER VOWEL INHERENT AQ;Cf;0;L;;;;;N;;*;;;
+17B5;KHMER VOWEL INHERENT AA;Cf;0;L;;;;;N;;*;;;
+17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;;
+17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;;
+17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;;
+17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;;
+17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;;
+17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;;
+17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;;
+17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;;
+17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;;
+17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;;
+17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;;
+17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;;
+17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;;
+17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;;
+17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;;
+17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;;
+17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;;
+17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;*;;;
+17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;;
+17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;;
+17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;;
+17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;;
+17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;*;;;
+17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;;
+17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;;
+17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;;
+17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;;
+17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;;
+17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;;
+17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;;
+17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;;
+17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;;
+17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;;
+17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;;
+17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;;
+17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;;
+17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;;
+17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;;
+1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;;
+1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;;
+1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;;
+1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;;
+1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;;
+1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;;
+1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;;
+1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;;
+1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;;
+180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;;
+180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;;
+180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;;
+180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;;
+180E;MONGOLIAN VOWEL SEPARATOR;Zs;0;WS;;;;;N;;;;;
+1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;;
+1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;;
+1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;;
+1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;;
+1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;;
+1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;;
+1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;;
+1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;;
+1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;;
+1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;;
+182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;;
+182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;;
+182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;;
+182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;;
+182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;;
+182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;;
+1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;;
+1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;;
+1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;;
+1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;;
+1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;;
+1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;;
+1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;;
+1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;;
+183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;;
+183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;;
+183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;;
+1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;;
+1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;;
+1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;;
+1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;;
+1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;;
+1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;;
+1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;;
+1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;;
+1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;;
+1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;;
+184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;;
+184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;;
+184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;;
+184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;;
+184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;;
+184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;;
+1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;;
+1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;;
+1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;;
+1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;;
+1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;;
+1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;;
+1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;;
+1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;;
+1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;;
+1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;;
+185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;;
+185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;;
+185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;;
+185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;;
+185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;;
+185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;;
+1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;;
+1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;;
+1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;;
+1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;;
+1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;;
+1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;;
+1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;;
+1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;;
+1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;;
+1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;;
+186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;;
+186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;;
+186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;;
+186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;;
+186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;;
+186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;;
+1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;;
+1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;;
+1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;;
+1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;;
+1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;;
+1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;;
+1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;;
+1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;;
+1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;;
+1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;;
+1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;;
+1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;;
+1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;;
+1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;;
+1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;;
+1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;;
+1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;;
+1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;;
+188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;;
+188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;;
+188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;;
+188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;;
+1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;;
+1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;;
+1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;;
+1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;;
+1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;;
+189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;;
+189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;;
+189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;;
+18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;;
+18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;;
+18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;;
+18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;;
+18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;;
+18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;;
+18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;;
+18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;;
+1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;;
+1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;;
+1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;;
+1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;;
+1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;;
+1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;;
+1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;;
+1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;;
+1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;;
+1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;;
+190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;;
+190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;;
+190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;;
+190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;;
+190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;;
+190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;;
+1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;;
+1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;;
+1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;;
+1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;;
+1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;;
+1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;;
+1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;;
+1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;;
+1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;;
+1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;;
+191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;;
+191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;;
+191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;;
+1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;;
+1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;;
+192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;;
+1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;;
+1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;;
+1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;;
+1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;;
+1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;;
+1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;;
+1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;;
+1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;;
+1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;;
+193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;;
+193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;;
+1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;;
+1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;;
+1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;;
+1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;;
+1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;;
+1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;;
+1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;;
+1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;;
+1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;;
+1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;;
+1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;;
+195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;;
+195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;;
+195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;;
+195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;;
+195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;;
+195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;;
+1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;;
+1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;;
+1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;;
+1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;;
+1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;;
+1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;;
+1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;;
+1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;;
+196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;;
+196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;;
+196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;;
+196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;;
+1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;;
+1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;;
+1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;;
+1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;;
+1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;;
+1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;;
+1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;;
+1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;;
+1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;;
+1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;;
+1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;;
+1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;;
+1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;;
+1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;;
+1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;;
+198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;;
+198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;;
+198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;;
+198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;;
+198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;;
+198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;;
+1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;;
+1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;;
+1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;;
+1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;;
+1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;;
+1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;;
+1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;;
+1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;;
+1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;;
+1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;;
+199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;;
+199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;;
+199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;;
+199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;;
+199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;;
+199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;;
+19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;;
+19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;;
+19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;;
+19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;;
+19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;;
+19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;;
+19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;;
+19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;;
+19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;;
+19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;;
+19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;;
+19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;;
+19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;;
+19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;;
+19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;;
+19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;;
+19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;;
+19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;;
+19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;;
+19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;;
+19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;;
+19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;;
+19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;;
+19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;;
+19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;;
+19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;;
+19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+19DE;NEW TAI LUE SIGN LAE;Po;0;ON;;;;;N;;;;;
+19DF;NEW TAI LUE SIGN LAEV;Po;0;ON;;;;;N;;;;;
+19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;;
+19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;;
+19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;;
+19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;;
+19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;;
+19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;;
+19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;;
+19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;;
+19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;;
+19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;;
+19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;;
+19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;;
+19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;;
+19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;;
+19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;;
+19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;;
+19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;;
+19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;;
+19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;;
+19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;;
+19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;;
+19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;;
+19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;;
+19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;;
+19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;;
+19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;;
+19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;;
+19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;;
+19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;;
+19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;;
+19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;;
+19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;;
+1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;;
+1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;;
+1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;;
+1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;;
+1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;;
+1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;;
+1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;;
+1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1A1B;BUGINESE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;;
+1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;;
+1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;ardhacandra;;;
+1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;candrabindu;;;
+1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;anusvara;;;
+1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;repha;;;
+1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;visarga;;;
+1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;a;;;
+1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;aa;;;
+1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;i;;;
+1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;ii;;;
+1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;u;;;
+1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;uu;;;
+1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;vocalic r;;;
+1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;vocalic rr;;;
+1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;vocalic l;;;
+1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;vocalic ll;;;
+1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;e;;;
+1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;ai;;;
+1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;o;;;
+1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;au;;;
+1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;kha;;;
+1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;gha;;;
+1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;cha;;;
+1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;jha;;;
+1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;tta;;;
+1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ttha;;;
+1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;dda;;;
+1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ddha;;;
+1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;nna;;;
+1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;tha;;;
+1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;dha;;;
+1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;pha;;;
+1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;bha;;;
+1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;sha;;;
+1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;ssa;;;
+1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;nukta;;;
+1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;aa;;;
+1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;i;;;
+1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;ii;;;
+1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;u;;;
+1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;uu;;;
+1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;vocalic r;;;
+1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;vocalic rr;;;
+1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;vocalic l;;;
+1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;vocalic ll;;;
+1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;e;;;
+1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;ai;;;
+1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;o;;;
+1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;au;;;
+1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;ae;;;
+1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;oe;;;
+1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;virama;;;
+1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;;
+1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;;
+1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;;
+1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;;
+1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;;
+1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;;
+1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;;
+1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1B5A;BALINESE PANTI;Po;0;L;;;;;N;;section;;;
+1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;honorific section;;;
+1B5C;BALINESE WINDU;Po;0;L;;;;;N;;punctuation ring;;;
+1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;colon;;;
+1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;danda;;;
+1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;double danda;;;
+1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;line-breaking hyphen;;;
+1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;;
+1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;;
+1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;;
+1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;;
+1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;;
+1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;;
+1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;;
+1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;;
+1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;;
+1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;;
+1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;;
+1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;;
+1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;;
+1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;;
+1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;;
+1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;;
+1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;;
+1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;;
+1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;;
+1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;;
+1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;;
+1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;;
+1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;;
+1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;;
+1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;;
+1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;;
+1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;;
+1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;;
+1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;;
+1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;;
+1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;;
+1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;;
+1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;;
+1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;;
+1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;;
+1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;;
+1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;;
+1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;;
+1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;;
+1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;;
+1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;;
+1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;;
+1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;;
+1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;;
+1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;;
+1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;;
+1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;;
+1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;;
+1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;;
+1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;;
+1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;;
+1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;;
+1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;;
+1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;;
+1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;;
+1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;;
+1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;;
+1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;;
+1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;;
+1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;;
+1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;;
+1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;;
+1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;;
+1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;;
+1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;;
+1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;;
+1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;;
+1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;;
+1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;;
+1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;;
+1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;;
+1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;;
+1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;;
+1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;;
+1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;;
+1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;;
+1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;;
+1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;;
+1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;;
+1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;;
+1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;;
+1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;;
+1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;;
+1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;;
+1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;;
+1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;;
+1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;;
+1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;;
+1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;;
+1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;;
+1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;;
+1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;;
+1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;;
+1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;;
+1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;;
+1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;;
+1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;;
+1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;;
+1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;;
+1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;;
+1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;;
+1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;;
+1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;;
+1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;;
+1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;;
+1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;;
+1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;;
+1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;;
+1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;;
+1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;;
+1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;;
+1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;;
+1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;;
+1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;;
+1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;;
+1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;;
+1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;;
+1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;;
+1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;;
+1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;;
+1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;;
+1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;;
+1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;;
+1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;;
+1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;;
+1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;;
+1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;;
+1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;;
+1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;;
+1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;;
+1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;;
+1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;;
+1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;;
+1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;;
+1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;;
+1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;;
+1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;;
+1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;;
+1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;;
+1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;;
+1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;;
+1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;;
+1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;;
+1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;;
+1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;;
+1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;;
+1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;;
+1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;;
+1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;;
+1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;;
+1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;;
+1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;;
+1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;;
+1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;;
+1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;;
+1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;;
+1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;;
+1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;;
+1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;;
+1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;;
+1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;;
+1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;;
+1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;;
+1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;;
+1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;;
+1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;;
+1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;;
+1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;;
+1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;;
+1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;;
+1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;;
+1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;;
+1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;;
+1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;;
+1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;;
+1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;;
+1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;;
+1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;;
+1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;;
+1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;;
+1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L;<super> 0041;;;;N;;;;;
+1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L;<super> 00C6;;;;N;;;;;
+1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L;<super> 0042;;;;N;;;;;
+1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;;
+1D30;MODIFIER LETTER CAPITAL D;Lm;0;L;<super> 0044;;;;N;;;;;
+1D31;MODIFIER LETTER CAPITAL E;Lm;0;L;<super> 0045;;;;N;;;;;
+1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L;<super> 018E;;;;N;;;;;
+1D33;MODIFIER LETTER CAPITAL G;Lm;0;L;<super> 0047;;;;N;;;;;
+1D34;MODIFIER LETTER CAPITAL H;Lm;0;L;<super> 0048;;;;N;;;;;
+1D35;MODIFIER LETTER CAPITAL I;Lm;0;L;<super> 0049;;;;N;;;;;
+1D36;MODIFIER LETTER CAPITAL J;Lm;0;L;<super> 004A;;;;N;;;;;
+1D37;MODIFIER LETTER CAPITAL K;Lm;0;L;<super> 004B;;;;N;;;;;
+1D38;MODIFIER LETTER CAPITAL L;Lm;0;L;<super> 004C;;;;N;;;;;
+1D39;MODIFIER LETTER CAPITAL M;Lm;0;L;<super> 004D;;;;N;;;;;
+1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L;<super> 004E;;;;N;;;;;
+1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;;
+1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L;<super> 004F;;;;N;;;;;
+1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L;<super> 0222;;;;N;;;;;
+1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L;<super> 0050;;;;N;;;;;
+1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L;<super> 0052;;;;N;;;;;
+1D40;MODIFIER LETTER CAPITAL T;Lm;0;L;<super> 0054;;;;N;;;;;
+1D41;MODIFIER LETTER CAPITAL U;Lm;0;L;<super> 0055;;;;N;;;;;
+1D42;MODIFIER LETTER CAPITAL W;Lm;0;L;<super> 0057;;;;N;;;;;
+1D43;MODIFIER LETTER SMALL A;Lm;0;L;<super> 0061;;;;N;;;;;
+1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L;<super> 0250;;;;N;;;;;
+1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L;<super> 0251;;;;N;;;;;
+1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L;<super> 1D02;;;;N;;;;;
+1D47;MODIFIER LETTER SMALL B;Lm;0;L;<super> 0062;;;;N;;;;;
+1D48;MODIFIER LETTER SMALL D;Lm;0;L;<super> 0064;;;;N;;;;;
+1D49;MODIFIER LETTER SMALL E;Lm;0;L;<super> 0065;;;;N;;;;;
+1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L;<super> 0259;;;;N;;;;;
+1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L;<super> 025B;;;;N;;;;;
+1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1D4D;MODIFIER LETTER SMALL G;Lm;0;L;<super> 0067;;;;N;;;;;
+1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;;
+1D4F;MODIFIER LETTER SMALL K;Lm;0;L;<super> 006B;;;;N;;;;;
+1D50;MODIFIER LETTER SMALL M;Lm;0;L;<super> 006D;;;;N;;;;;
+1D51;MODIFIER LETTER SMALL ENG;Lm;0;L;<super> 014B;;;;N;;;;;
+1D52;MODIFIER LETTER SMALL O;Lm;0;L;<super> 006F;;;;N;;;;;
+1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L;<super> 0254;;;;N;;;;;
+1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L;<super> 1D16;;;;N;;;;;
+1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L;<super> 1D17;;;;N;;;;;
+1D56;MODIFIER LETTER SMALL P;Lm;0;L;<super> 0070;;;;N;;;;;
+1D57;MODIFIER LETTER SMALL T;Lm;0;L;<super> 0074;;;;N;;;;;
+1D58;MODIFIER LETTER SMALL U;Lm;0;L;<super> 0075;;;;N;;;;;
+1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L;<super> 1D1D;;;;N;;;;;
+1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L;<super> 026F;;;;N;;;;;
+1D5B;MODIFIER LETTER SMALL V;Lm;0;L;<super> 0076;;;;N;;;;;
+1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L;<super> 1D25;;;;N;;;;;
+1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L;<super> 03B2;;;;N;;;;;
+1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L;<super> 03B3;;;;N;;;;;
+1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L;<super> 03B4;;;;N;;;;;
+1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L;<super> 03C6;;;;N;;;;;
+1D61;MODIFIER LETTER SMALL CHI;Lm;0;L;<super> 03C7;;;;N;;;;;
+1D62;LATIN SUBSCRIPT SMALL LETTER I;Ll;0;L;<sub> 0069;;;;N;;;;;
+1D63;LATIN SUBSCRIPT SMALL LETTER R;Ll;0;L;<sub> 0072;;;;N;;;;;
+1D64;LATIN SUBSCRIPT SMALL LETTER U;Ll;0;L;<sub> 0075;;;;N;;;;;
+1D65;LATIN SUBSCRIPT SMALL LETTER V;Ll;0;L;<sub> 0076;;;;N;;;;;
+1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Ll;0;L;<sub> 03B2;;;;N;;;;;
+1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Ll;0;L;<sub> 03B3;;;;N;;;;;
+1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Ll;0;L;<sub> 03C1;;;;N;;;;;
+1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Ll;0;L;<sub> 03C6;;;;N;;;;;
+1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Ll;0;L;<sub> 03C7;;;;N;;;;;
+1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;;
+1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;;
+1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;;
+1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D
+1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;;
+1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63
+1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;;
+1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;;
+1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;;
+1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;;
+1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;;
+1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;;
+1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;;
+1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;;
+1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;;
+1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;;
+1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;;
+1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;;
+1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;;
+1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;;
+1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;;
+1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;;
+1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;;
+1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;;
+1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;;
+1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;;
+1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;;
+1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;;
+1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;;
+1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;;
+1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;;
+1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;;
+1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;;
+1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;;
+1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;;
+1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;;
+1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;;
+1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;;
+1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;;
+1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;;
+1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;;
+1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;;
+1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;;
+1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;;
+1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;;
+1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;;
+1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;;
+1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;;
+1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;;
+1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;;
+1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;;
+1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;;
+1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;;
+1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;;
+1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;;
+1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;;
+1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;;
+1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;;
+1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;;
+1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;;
+1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;;
+1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;;
+1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;;
+1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;;
+1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;;
+1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;;
+1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;;
+1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;;
+1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;;
+1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;;
+1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01;
+1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00
+1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03;
+1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02
+1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05;
+1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04
+1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07;
+1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06
+1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09;
+1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08
+1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B;
+1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A
+1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D;
+1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C
+1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F;
+1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E
+1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11;
+1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10
+1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13;
+1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12
+1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15;
+1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14
+1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17;
+1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16
+1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19;
+1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18
+1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B;
+1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A
+1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D;
+1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C
+1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F;
+1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E
+1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21;
+1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20
+1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23;
+1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22
+1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25;
+1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24
+1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27;
+1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26
+1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29;
+1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28
+1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B;
+1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A
+1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D;
+1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C
+1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F;
+1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E
+1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31;
+1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30
+1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33;
+1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32
+1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35;
+1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34
+1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37;
+1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36
+1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39;
+1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38
+1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B;
+1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A
+1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D;
+1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C
+1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F;
+1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E
+1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41;
+1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40
+1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43;
+1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42
+1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45;
+1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44
+1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47;
+1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46
+1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49;
+1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48
+1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B;
+1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A
+1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D;
+1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C
+1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F;
+1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E
+1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51;
+1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50
+1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53;
+1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52
+1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55;
+1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54
+1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57;
+1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56
+1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59;
+1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58
+1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B;
+1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A
+1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D;
+1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C
+1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F;
+1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E
+1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61;
+1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60
+1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63;
+1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62
+1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65;
+1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64
+1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67;
+1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66
+1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69;
+1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68
+1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B;
+1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A
+1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D;
+1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C
+1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F;
+1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E
+1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71;
+1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70
+1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73;
+1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72
+1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75;
+1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74
+1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77;
+1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76
+1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79;
+1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78
+1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B;
+1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A
+1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D;
+1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C
+1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F;
+1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E
+1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81;
+1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80
+1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83;
+1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82
+1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85;
+1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84
+1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87;
+1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86
+1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89;
+1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88
+1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B;
+1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A
+1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D;
+1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C
+1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F;
+1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E
+1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91;
+1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90
+1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93;
+1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92
+1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95;
+1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94
+1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;;
+1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;;
+1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;;
+1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;;
+1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;;
+1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60
+1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;;
+1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;;
+1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF;
+1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;;
+1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1;
+1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0
+1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3;
+1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2
+1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5;
+1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4
+1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7;
+1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6
+1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9;
+1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8
+1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB;
+1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA
+1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD;
+1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC
+1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF;
+1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE
+1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1;
+1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0
+1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3;
+1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2
+1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5;
+1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4
+1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7;
+1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6
+1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9;
+1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8
+1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB;
+1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA
+1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD;
+1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC
+1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF;
+1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE
+1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1;
+1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0
+1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3;
+1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2
+1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5;
+1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4
+1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7;
+1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6
+1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9;
+1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8
+1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB;
+1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA
+1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD;
+1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC
+1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF;
+1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE
+1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1;
+1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0
+1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3;
+1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2
+1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5;
+1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4
+1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7;
+1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6
+1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9;
+1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8
+1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB;
+1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA
+1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD;
+1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC
+1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF;
+1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE
+1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1;
+1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0
+1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3;
+1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2
+1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5;
+1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4
+1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7;
+1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6
+1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9;
+1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8
+1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB;
+1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA
+1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED;
+1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC
+1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF;
+1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE
+1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1;
+1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0
+1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3;
+1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2
+1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5;
+1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4
+1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7;
+1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6
+1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9;
+1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8
+1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB;
+1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA
+1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD;
+1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC
+1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF;
+1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE
+1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08
+1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09
+1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A
+1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B
+1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C
+1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D
+1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E
+1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F
+1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00;
+1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01;
+1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02;
+1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03;
+1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04;
+1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05;
+1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06;
+1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07;
+1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18
+1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19
+1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A
+1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B
+1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C
+1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D
+1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10;
+1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11;
+1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12;
+1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13;
+1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14;
+1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15;
+1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28
+1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29
+1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A
+1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B
+1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C
+1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D
+1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E
+1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F
+1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20;
+1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21;
+1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22;
+1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23;
+1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24;
+1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25;
+1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26;
+1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27;
+1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38
+1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39
+1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A
+1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B
+1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C
+1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D
+1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E
+1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F
+1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30;
+1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31;
+1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32;
+1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33;
+1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34;
+1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35;
+1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36;
+1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37;
+1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48
+1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49
+1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A
+1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B
+1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C
+1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D
+1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40;
+1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41;
+1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42;
+1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43;
+1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44;
+1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45;
+1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;;
+1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59
+1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;;
+1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B
+1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;;
+1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D
+1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;;
+1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F
+1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51;
+1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53;
+1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55;
+1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57;
+1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68
+1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69
+1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A
+1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B
+1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C
+1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D
+1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E
+1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F
+1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60;
+1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61;
+1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62;
+1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63;
+1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64;
+1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65;
+1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66;
+1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67;
+1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA
+1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB
+1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8
+1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9
+1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA
+1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB
+1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA
+1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB
+1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8
+1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9
+1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA
+1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB
+1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA
+1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB
+1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88
+1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89
+1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A
+1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B
+1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C
+1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D
+1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E
+1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F
+1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80;
+1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81;
+1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82;
+1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83;
+1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84;
+1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85;
+1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86;
+1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87;
+1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98
+1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99
+1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A
+1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B
+1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C
+1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D
+1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E
+1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F
+1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90;
+1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91;
+1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92;
+1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93;
+1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94;
+1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95;
+1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96;
+1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97;
+1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8
+1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9
+1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA
+1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB
+1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC
+1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD
+1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE
+1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF
+1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0;
+1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1;
+1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2;
+1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3;
+1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4;
+1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5;
+1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6;
+1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7;
+1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8
+1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9
+1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;;
+1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC
+1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;;
+1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;;
+1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;;
+1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0;
+1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1;
+1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70;
+1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71;
+1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3;
+1FBD;GREEK KORONIS;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399
+1FBF;GREEK PSILI;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FC0;GREEK PERISPOMENI;Sk;0;ON;<compat> 0020 0342;;;;N;;;;;
+1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;;
+1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;;
+1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC
+1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;;
+1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;;
+1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;;
+1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72;
+1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73;
+1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74;
+1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75;
+1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3;
+1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;;
+1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;;
+1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;;
+1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8
+1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9
+1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;;
+1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;;
+1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;;
+1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;;
+1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0;
+1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1;
+1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76;
+1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77;
+1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;;
+1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;;
+1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;;
+1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8
+1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9
+1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;;
+1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;;
+1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;;
+1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC
+1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;;
+1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;;
+1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0;
+1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1;
+1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A;
+1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B;
+1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5;
+1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;;
+1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;;
+1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;;
+1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;;
+1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC
+1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;;
+1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;;
+1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;;
+1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78;
+1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79;
+1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C;
+1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D;
+1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3;
+1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;;
+1FFE;GREEK DASIA;Sk;0;ON;<compat> 0020 0314;;;;N;;;;;
+2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;;
+2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;;
+2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;;
+2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;;
+200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;;
+200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;;
+200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;;
+200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;;
+2010;HYPHEN;Pd;0;ON;;;;;N;;;;;
+2011;NON-BREAKING HYPHEN;Pd;0;ON;<noBreak> 2010;;;;N;;;;;
+2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;;
+2013;EN DASH;Pd;0;ON;;;;;N;;;;;
+2014;EM DASH;Pd;0;ON;;;;;N;;;;;
+2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;;
+2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;;
+2017;DOUBLE LOW LINE;Po;0;ON;<compat> 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;;
+2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;;
+2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;;
+201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;;
+201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;;
+201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;;
+201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;;
+201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;;
+201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;;
+2020;DAGGER;Po;0;ON;;;;;N;;;;;
+2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;;
+2022;BULLET;Po;0;ON;;;;;N;;;;;
+2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;;
+2024;ONE DOT LEADER;Po;0;ON;<compat> 002E;;;;N;;;;;
+2025;TWO DOT LEADER;Po;0;ON;<compat> 002E 002E;;;;N;;;;;
+2026;HORIZONTAL ELLIPSIS;Po;0;ON;<compat> 002E 002E 002E;;;;N;;;;;
+2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;;
+2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;;
+2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;;
+202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;;
+202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;;
+202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;;
+202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;;
+202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;;
+202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;;
+2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+2032;PRIME;Po;0;ET;;;;;N;;;;;
+2033;DOUBLE PRIME;Po;0;ET;<compat> 2032 2032;;;;N;;;;;
+2034;TRIPLE PRIME;Po;0;ET;<compat> 2032 2032 2032;;;;N;;;;;
+2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;;
+2036;REVERSED DOUBLE PRIME;Po;0;ON;<compat> 2035 2035;;;;N;;;;;
+2037;REVERSED TRIPLE PRIME;Po;0;ON;<compat> 2035 2035 2035;;;;N;;;;;
+2038;CARET;Po;0;ON;;;;;N;;;;;
+2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;;
+203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;;
+203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;;
+203C;DOUBLE EXCLAMATION MARK;Po;0;ON;<compat> 0021 0021;;;;N;;;;;
+203D;INTERROBANG;Po;0;ON;;;;;N;;;;;
+203E;OVERLINE;Po;0;ON;<compat> 0020 0305;;;;N;SPACING OVERSCORE;;;;
+203F;UNDERTIE;Pc;0;ON;;;;;N;;Enotikon;;;
+2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;;
+2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;;
+2042;ASTERISM;Po;0;ON;;;;;N;;;;;
+2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;;
+2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;;
+2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;;
+2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;;
+2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;;
+2048;QUESTION EXCLAMATION MARK;Po;0;ON;<compat> 003F 0021;;;;N;;;;;
+2049;EXCLAMATION QUESTION MARK;Po;0;ON;<compat> 0021 003F;;;;N;;;;;
+204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;;
+204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;;
+204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;;
+204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;;
+2050;CLOSE UP;Po;0;ON;;;;;N;;;;;
+2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;;
+2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2053;SWUNG DASH;Po;0;ON;;;;;N;;;;;
+2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;;
+2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;;
+2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;;
+2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;;
+205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;;
+205D;TRICOLON;Po;0;ON;;;;;N;;;;;
+205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;;
+205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2060;WORD JOINER;Cf;0;BN;;;;;N;;;;;
+2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;;
+2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;;
+2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;;
+2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;;
+206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;;
+2071;SUPERSCRIPT LATIN SMALL LETTER I;Ll;0;L;<super> 0069;;;;N;;;;;
+2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;;
+2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;;
+2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;;
+2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;;
+2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;;
+2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;;
+207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;;
+207B;SUPERSCRIPT MINUS;Sm;0;ES;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;;
+207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;;
+207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;;
+207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;;
+207F;SUPERSCRIPT LATIN SMALL LETTER N;Ll;0;L;<super> 006E;;;;N;;;;;
+2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;;
+2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;;
+2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;;
+2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;;
+2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;;
+2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;;
+2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;;
+2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;;
+2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;;
+2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;;
+208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;;
+208B;SUBSCRIPT MINUS;Sm;0;ES;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;;
+208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;;
+208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;;
+208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;;
+2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;;
+2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;;
+2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;;
+2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;;
+2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;;
+20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;;
+20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;;
+20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;;
+20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;;
+20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;;
+20A8;RUPEE SIGN;Sc;0;ET;<compat> 0052 0073;;;;N;;;;;
+20A9;WON SIGN;Sc;0;ET;;;;;N;;;;;
+20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;;
+20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;;
+20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;;
+20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;;
+20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;;
+20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;;
+20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;;
+20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;;
+20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;;
+20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;;
+20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;;
+20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;;
+20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;;
+20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;;
+20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;;
+20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;;
+20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;;
+20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;;
+20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;;
+20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;;
+20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;;
+20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;;
+20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;;
+20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;;
+20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;;
+20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;;
+20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;;
+20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;;
+20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;;
+20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;;
+20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;;
+20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;;
+20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;;
+20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;;
+20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;;
+20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;;
+2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;;
+2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;;
+2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;;
+2103;DEGREE CELSIUS;So;0;ON;<compat> 00B0 0043;;;;N;DEGREES CENTIGRADE;;;;
+2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;;
+2105;CARE OF;So;0;ON;<compat> 0063 002F 006F;;;;N;;;;;
+2106;CADA UNA;So;0;ON;<compat> 0063 002F 0075;;;;N;;;;;
+2107;EULER CONSTANT;Lu;0;L;<compat> 0190;;;;N;EULERS;;;;
+2108;SCRUPLE;So;0;ON;;;;;N;;;;;
+2109;DEGREE FAHRENHEIT;So;0;ON;<compat> 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;;
+210A;SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+210B;SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;SCRIPT H;;;;
+210C;BLACK-LETTER CAPITAL H;Lu;0;L;<font> 0048;;;;N;BLACK-LETTER H;;;;
+210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L;<font> 0048;;;;N;DOUBLE-STRUCK H;;;;
+210E;PLANCK CONSTANT;Ll;0;L;<font> 0068;;;;N;;;;;
+210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L;<font> 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;;
+2110;SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;SCRIPT I;;;;
+2111;BLACK-LETTER CAPITAL I;Lu;0;L;<font> 0049;;;;N;BLACK-LETTER I;;;;
+2112;SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;SCRIPT L;;;;
+2113;SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;;
+2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L;<font> 004E;;;;N;DOUBLE-STRUCK N;;;;
+2116;NUMERO SIGN;So;0;ON;<compat> 004E 006F;;;;N;NUMERO;;;;
+2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;;
+2118;SCRIPT CAPITAL P;So;0;ON;;;;;N;SCRIPT P;;;;
+2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L;<font> 0050;;;;N;DOUBLE-STRUCK P;;;;
+211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L;<font> 0051;;;;N;DOUBLE-STRUCK Q;;;;
+211B;SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;SCRIPT R;;;;
+211C;BLACK-LETTER CAPITAL R;Lu;0;L;<font> 0052;;;;N;BLACK-LETTER R;;;;
+211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L;<font> 0052;;;;N;DOUBLE-STRUCK R;;;;
+211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;;
+211F;RESPONSE;So;0;ON;;;;;N;;;;;
+2120;SERVICE MARK;So;0;ON;<super> 0053 004D;;;;N;;;;;
+2121;TELEPHONE SIGN;So;0;ON;<compat> 0054 0045 004C;;;;N;T E L SYMBOL;;;;
+2122;TRADE MARK SIGN;So;0;ON;<super> 0054 004D;;;;N;TRADEMARK;;;;
+2123;VERSICLE;So;0;ON;;;;;N;;;;;
+2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L;<font> 005A;;;;N;DOUBLE-STRUCK Z;;;;
+2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;;
+2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9;
+2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;;
+2128;BLACK-LETTER CAPITAL Z;Lu;0;L;<font> 005A;;;;N;BLACK-LETTER Z;;;;
+2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;;
+212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B;
+212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5;
+212C;SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;SCRIPT B;;;;
+212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043;;;;N;BLACK-LETTER C;;;;
+212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;;
+212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;;
+2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;;
+2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E;
+2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;;
+2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;;
+2136;BET SYMBOL;Lo;0;L;<compat> 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;;
+2137;GIMEL SYMBOL;Lo;0;L;<compat> 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;;
+2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;;
+2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;;
+213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;;
+213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;;
+213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON;<font> 2211;;;;Y;;;;;
+2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;;
+2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;;
+2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;;
+2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;;
+2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+214A;PROPERTY LINE;So;0;ON;;;;;N;;;;;
+214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;;
+214C;PER SIGN;So;0;ON;;;;;N;;;;;
+214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;;
+214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132
+214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;;
+2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;;
+2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;;
+2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;;
+2156;VULGAR FRACTION TWO FIFTHS;No;0;ON;<fraction> 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;;
+2157;VULGAR FRACTION THREE FIFTHS;No;0;ON;<fraction> 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;;
+2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON;<fraction> 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;;
+2159;VULGAR FRACTION ONE SIXTH;No;0;ON;<fraction> 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;;
+215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON;<fraction> 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;;
+215B;VULGAR FRACTION ONE EIGHTH;No;0;ON;<fraction> 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;;
+215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON;<fraction> 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;;
+215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON;<fraction> 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;;
+215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON;<fraction> 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;;
+215F;FRACTION NUMERATOR ONE;No;0;ON;<fraction> 0031 2044;;;1;N;;;;;
+2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170;
+2161;ROMAN NUMERAL TWO;Nl;0;L;<compat> 0049 0049;;;2;N;;;;2171;
+2162;ROMAN NUMERAL THREE;Nl;0;L;<compat> 0049 0049 0049;;;3;N;;;;2172;
+2163;ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0049 0056;;;4;N;;;;2173;
+2164;ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0056;;;5;N;;;;2174;
+2165;ROMAN NUMERAL SIX;Nl;0;L;<compat> 0056 0049;;;6;N;;;;2175;
+2166;ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0056 0049 0049;;;7;N;;;;2176;
+2167;ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0056 0049 0049 0049;;;8;N;;;;2177;
+2168;ROMAN NUMERAL NINE;Nl;0;L;<compat> 0049 0058;;;9;N;;;;2178;
+2169;ROMAN NUMERAL TEN;Nl;0;L;<compat> 0058;;;10;N;;;;2179;
+216A;ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0058 0049;;;11;N;;;;217A;
+216B;ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0058 0049 0049;;;12;N;;;;217B;
+216C;ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 004C;;;50;N;;;;217C;
+216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0043;;;100;N;;;;217D;
+216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0044;;;500;N;;;;217E;
+216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 004D;;;1000;N;;;;217F;
+2170;SMALL ROMAN NUMERAL ONE;Nl;0;L;<compat> 0069;;;1;N;;;2160;;2160
+2171;SMALL ROMAN NUMERAL TWO;Nl;0;L;<compat> 0069 0069;;;2;N;;;2161;;2161
+2172;SMALL ROMAN NUMERAL THREE;Nl;0;L;<compat> 0069 0069 0069;;;3;N;;;2162;;2162
+2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0069 0076;;;4;N;;;2163;;2163
+2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0076;;;5;N;;;2164;;2164
+2175;SMALL ROMAN NUMERAL SIX;Nl;0;L;<compat> 0076 0069;;;6;N;;;2165;;2165
+2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0076 0069 0069;;;7;N;;;2166;;2166
+2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0076 0069 0069 0069;;;8;N;;;2167;;2167
+2178;SMALL ROMAN NUMERAL NINE;Nl;0;L;<compat> 0069 0078;;;9;N;;;2168;;2168
+2179;SMALL ROMAN NUMERAL TEN;Nl;0;L;<compat> 0078;;;10;N;;;2169;;2169
+217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0078 0069;;;11;N;;;216A;;216A
+217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0078 0069 0069;;;12;N;;;216B;;216B
+217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 006C;;;50;N;;;216C;;216C
+217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0063;;;100;N;;;216D;;216D
+217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0064;;;500;N;;;216E;;216E
+217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 006D;;;1000;N;;;216F;;216F
+2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;;
+2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;;
+2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;;
+2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184;
+2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183
+2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;;
+2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;;
+2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;;
+2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;;
+2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;;
+2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;;
+2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;;
+2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;;
+2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;;
+2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;;
+2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;;
+2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;;
+2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;;
+219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;;
+219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;;
+219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;;
+219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;;
+219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;;
+219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;;
+21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;;
+21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;;
+21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;;
+21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;;
+21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;;
+21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;;
+21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;;
+21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;;
+21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;;
+21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;;
+21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;;
+21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;;
+21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;;
+21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;;
+21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;;
+21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;;
+21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;;
+21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;;
+21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;;
+21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;;
+21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;;
+21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;;
+21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;;
+21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;;
+21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;;
+21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;;
+21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;;
+21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;;
+21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;;
+21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;;
+21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;;
+21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;;
+21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;;
+21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;;
+21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;;
+21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;;
+21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;;
+21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;;
+21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;;
+21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;;
+21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;;
+21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;;
+21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;;
+21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;;
+21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;;
+21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;;
+21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;;
+21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;;
+21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;;
+21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;;
+21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;;
+21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;;
+21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;;
+21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;;
+21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;;
+21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;;
+21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;;
+21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;;
+21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;;
+21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;;
+21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;;
+21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;;
+21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;;
+21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;;
+21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;;
+21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;;
+21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;;
+21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;;
+21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;;
+21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;;
+21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;;
+21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;;
+21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;;
+21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;;
+21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+2200;FOR ALL;Sm;0;ON;;;;;N;;;;;
+2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;;
+2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;;
+2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;;
+2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;;
+2205;EMPTY SET;Sm;0;ON;;;;;N;;;;;
+2206;INCREMENT;Sm;0;ON;;;;;N;;;;;
+2207;NABLA;Sm;0;ON;;;;;N;;;;;
+2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;;
+220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;;
+220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220E;END OF PROOF;Sm;0;ON;;;;;N;;;;;
+220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;;
+2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;;
+2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;;
+2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;;
+2214;DOT PLUS;Sm;0;ON;;;;;N;;;;;
+2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2216;SET MINUS;Sm;0;ON;;;;;Y;;;;;
+2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;;
+221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;;
+221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;;
+221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;;
+221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;;
+221E;INFINITY;Sm;0;ON;;;;;N;;;;;
+221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;;
+2220;ANGLE;Sm;0;ON;;;;;Y;;;;;
+2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;;
+2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+2223;DIVIDES;Sm;0;ON;;;;;N;;;;;
+2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;;
+2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;;
+2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2229;INTERSECTION;Sm;0;ON;;;;;N;;;;;
+222A;UNION;Sm;0;ON;;;;;N;;;;;
+222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222C;DOUBLE INTEGRAL;Sm;0;ON;<compat> 222B 222B;;;;Y;;;;;
+222D;TRIPLE INTEGRAL;Sm;0;ON;<compat> 222B 222B 222B;;;;Y;;;;;
+222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222F;SURFACE INTEGRAL;Sm;0;ON;<compat> 222E 222E;;;;Y;;;;;
+2230;VOLUME INTEGRAL;Sm;0;ON;<compat> 222E 222E 222E;;;;Y;;;;;
+2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2234;THEREFORE;Sm;0;ON;;;;;N;;;;;
+2235;BECAUSE;Sm;0;ON;;;;;N;;;;;
+2236;RATIO;Sm;0;ON;;;;;N;;;;;
+2237;PROPORTION;Sm;0;ON;;;;;N;;;;;
+2238;DOT MINUS;Sm;0;ON;;;;;N;;;;;
+2239;EXCESS;Sm;0;ON;;;;;Y;;;;;
+223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;;
+223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;;
+223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;lazy S;;;
+223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;;
+223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;;
+2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;;
+2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;;
+2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;;
+2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;;
+2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;;
+224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;;
+224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;;
+2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;;
+2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;;
+2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;;
+2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;;
+2259;ESTIMATES;Sm;0;ON;;;;;N;;;;;
+225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;;
+225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;;
+225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;;
+225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;;
+225E;MEASURED BY;Sm;0;ON;;;;;N;;;;;
+225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;;
+2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;;
+2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;;
+2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;;
+2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;;
+2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;;
+2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;;
+2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;;
+2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;;
+226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;;
+226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;;
+226C;BETWEEN;Sm;0;ON;;;;;N;;;;;
+226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;;
+226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;;
+226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;;
+2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;;
+2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;;
+2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;;
+2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;;
+2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;;
+2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;;
+2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;;
+2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;;
+2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;;
+2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;;
+227A;PRECEDES;Sm;0;ON;;;;;Y;;;;;
+227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;;
+2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;;
+2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;;
+2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;;
+2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;;
+2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;;
+2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;;
+2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;;
+228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;;
+228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;;
+228C;MULTISET;Sm;0;ON;;;;;Y;;;;;
+228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;;
+228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;;
+228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;;
+2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;;
+2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;;
+2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;;
+2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;;
+229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;;
+229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;;
+229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;;
+22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;;
+22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;;
+22A5;UP TACK;Sm;0;ON;;;;;N;;;;;
+22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;;
+22A7;MODELS;Sm;0;ON;;;;;Y;;;;;
+22A8;TRUE;Sm;0;ON;;;;;Y;;;;;
+22A9;FORCES;Sm;0;ON;;;;;Y;;;;;
+22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;;
+22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;;
+22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;;
+22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;;
+22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;;
+22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;;
+22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;;
+22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;;
+22BB;XOR;Sm;0;ON;;;;;N;;;;;
+22BC;NAND;Sm;0;ON;;;;;N;;;;;
+22BD;NOR;Sm;0;ON;;;;;N;;;;;
+22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;;
+22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;;
+22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;;
+22C8;BOWTIE;Sm;0;ON;;;;;N;;;;;
+22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;;
+22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;;
+22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;;
+22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;;
+22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;;
+22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;;
+22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;;
+22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;;
+22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;;
+22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;;
+22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;;
+22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;;
+22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;;
+22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;;
+22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;;
+22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;;
+22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;;
+22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;;
+22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;;
+22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;;
+22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;;
+22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;;
+22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;;
+22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;;
+22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;;
+2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;;
+2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;;
+2302;HOUSE;So;0;ON;;;;;N;;;;;
+2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;;
+2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;;
+2305;PROJECTIVE;So;0;ON;;;;;N;;;;;
+2306;PERSPECTIVE;So;0;ON;;;;;N;;;;;
+2307;WAVY LINE;So;0;ON;;;;;N;;;;;
+2308;LEFT CEILING;Sm;0;ON;;;;;Y;;;;;
+2309;RIGHT CEILING;Sm;0;ON;;;;;Y;;;;;
+230A;LEFT FLOOR;Sm;0;ON;;;;;Y;;;;;
+230B;RIGHT FLOOR;Sm;0;ON;;;;;Y;;;;;
+230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;;
+230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;;
+230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;;
+230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;;
+2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;;
+2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;;
+2312;ARC;So;0;ON;;;;;N;;;;;
+2313;SEGMENT;So;0;ON;;;;;N;;;;;
+2314;SECTOR;So;0;ON;;;;;N;;;;;
+2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;;
+2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;;
+2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;;
+2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;;
+2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;;
+231A;WATCH;So;0;ON;;;;;N;;;;;
+231B;HOURGLASS;So;0;ON;;;;;N;;;;;
+231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;;
+231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;;
+231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;;
+231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;;
+2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2322;FROWN;So;0;ON;;;;;N;;;;;
+2323;SMILE;So;0;ON;;;;;N;;;;;
+2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;;
+2325;OPTION KEY;So;0;ON;;;;;N;;;;;
+2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;;
+2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;;
+2328;KEYBOARD;So;0;ON;;;;;N;;;;;
+2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;;
+232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;;
+232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;;
+232C;BENZENE RING;So;0;ON;;;;;N;;;;;
+232D;CYLINDRICITY;So;0;ON;;;;;N;;;;;
+232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;;
+232F;SYMMETRY;So;0;ON;;;;;N;;;;;
+2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;;
+2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;;
+2332;CONICAL TAPER;So;0;ON;;;;;N;;;;;
+2333;SLOPE;So;0;ON;;;;;N;;;;;
+2334;COUNTERBORE;So;0;ON;;;;;N;;;;;
+2335;COUNTERSINK;So;0;ON;;;;;N;;;;;
+2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;;
+2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;;
+2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;;
+2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;;
+233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;;
+233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;;
+233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;;
+233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;;
+233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;;
+233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;;
+2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;;
+2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;;
+2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;;
+2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;;
+2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;;
+2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;;
+2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;;
+2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;;
+2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;;
+2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;;
+234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;*;;;
+234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;;
+234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;;
+234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;;
+234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;*;;;
+234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;;
+2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;;
+2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;*;;;
+2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;;
+2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;;
+2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;;
+2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;*;;;
+2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;;
+2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;;
+2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;;
+2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;;
+235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;;
+235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;;
+235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;;
+235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;;
+235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;;
+235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;;
+2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;;
+2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;*;;;
+2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;;
+2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;;
+2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;;
+2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;;
+2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;;
+2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;;
+2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;;
+2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;;
+236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;;
+236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;;
+236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;;
+236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;;
+236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;;
+236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;;
+2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;;
+2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;;
+2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;;
+2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;;
+2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;;
+2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;;
+2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;;
+2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;;
+2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;;
+2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;;
+237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;;
+237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;;
+237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;;
+237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;;
+237E;BELL SYMBOL;So;0;ON;;;;;N;;;;;
+237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;;
+2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;;
+2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;;
+2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;;
+2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;;
+2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;;
+2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2388;HELM SYMBOL;So;0;ON;;;;;N;;;;;
+2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;pause;;;
+238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;break;;;
+238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;escape;;;
+238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;;
+238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;;
+238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;;
+238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;;
+2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;;
+2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;;
+2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;;
+2398;NEXT PAGE;So;0;ON;;;;;N;;;;;
+2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;;
+239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;;
+23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;;
+23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;;
+23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;;
+23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;;
+23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;;
+23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;;
+23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;;
+23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
+23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
+23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;;
+23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;;
+23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;;
+23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
+23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
+23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;;
+23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;;
+23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;;
+23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;;
+23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;;
+23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;;
+23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;;
+23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;;
+23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;;
+23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;;
+23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;;
+23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;;
+23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;;
+23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;;
+23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;;
+23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;;
+23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;;
+23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;;
+23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;;
+23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;;
+23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;;
+23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;;
+23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;;
+23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;;
+23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;;
+23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;;
+23DA;EARTH GROUND;So;0;ON;;;;;N;;;;;
+23DB;FUSE;So;0;ON;;;;;N;;;;;
+23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;;
+23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;;
+23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;;
+23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;;
+23E5;FLATNESS;So;0;ON;;;;;N;;;;;
+23E6;AC CURRENT;So;0;ON;;;;;N;;;;;
+23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;;
+2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;;
+2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;;
+2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;;
+2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;;
+2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;;
+2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;;
+2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;;
+2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;;
+2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;;
+2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;;
+240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;;
+240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;;
+240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;;
+240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;;
+240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;;
+240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;;
+2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;;
+2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;;
+2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;;
+2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;;
+2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;;
+2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;;
+2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;;
+2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;;
+2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;;
+2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;;
+241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;;
+241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;;
+241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;;
+241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;;
+241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;;
+241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;;
+2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;;
+2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;;
+2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;;
+2423;OPEN BOX;So;0;ON;;;;;N;;;;;
+2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;;
+2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;;
+2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;;
+2440;OCR HOOK;So;0;ON;;;;;N;;;;;
+2441;OCR CHAIR;So;0;ON;;;;;N;;;;;
+2442;OCR FORK;So;0;ON;;;;;N;;;;;
+2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;;
+2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;;
+2445;OCR BOW TIE;So;0;ON;;;;;N;;;;;
+2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;;
+2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;;
+2448;OCR DASH;So;0;ON;;;;;N;;;;;
+2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;;
+244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;;
+2460;CIRCLED DIGIT ONE;No;0;ON;<circle> 0031;;1;1;N;;;;;
+2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;;
+2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;;
+2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;;
+2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;;
+2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;;
+2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;;
+2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;;
+2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;;
+2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;;
+246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;;
+246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;;
+246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;;
+246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;;
+246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;;
+246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;;
+2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;;
+2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;;
+2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;;
+2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;;
+2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;;
+2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;;
+2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;;
+2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;;
+2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;;
+2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;;
+247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;;
+247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;;
+247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;;
+247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;;
+247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;;
+247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;;
+2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;;
+2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;;
+2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;;
+2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;;
+2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;;
+2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;;
+2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;;
+2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<compat> 0028 0032 0030 0029;;;20;N;;;;;
+2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;;
+2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;;
+248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;;
+248B;DIGIT FOUR FULL STOP;No;0;EN;<compat> 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;;
+248C;DIGIT FIVE FULL STOP;No;0;EN;<compat> 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;;
+248D;DIGIT SIX FULL STOP;No;0;EN;<compat> 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;;
+248E;DIGIT SEVEN FULL STOP;No;0;EN;<compat> 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;;
+248F;DIGIT EIGHT FULL STOP;No;0;EN;<compat> 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;;
+2490;DIGIT NINE FULL STOP;No;0;EN;<compat> 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;;
+2491;NUMBER TEN FULL STOP;No;0;EN;<compat> 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;;
+2492;NUMBER ELEVEN FULL STOP;No;0;EN;<compat> 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;;
+2493;NUMBER TWELVE FULL STOP;No;0;EN;<compat> 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;;
+2494;NUMBER THIRTEEN FULL STOP;No;0;EN;<compat> 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;;
+2495;NUMBER FOURTEEN FULL STOP;No;0;EN;<compat> 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;;
+2496;NUMBER FIFTEEN FULL STOP;No;0;EN;<compat> 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;;
+2497;NUMBER SIXTEEN FULL STOP;No;0;EN;<compat> 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;;
+2498;NUMBER SEVENTEEN FULL STOP;No;0;EN;<compat> 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;;
+2499;NUMBER EIGHTEEN FULL STOP;No;0;EN;<compat> 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;;
+249A;NUMBER NINETEEN FULL STOP;No;0;EN;<compat> 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;;
+249B;NUMBER TWENTY FULL STOP;No;0;EN;<compat> 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;;
+249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L;<compat> 0028 0061 0029;;;;N;;;;;
+249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;;
+249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L;<compat> 0028 0063 0029;;;;N;;;;;
+249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L;<compat> 0028 0064 0029;;;;N;;;;;
+24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L;<compat> 0028 0065 0029;;;;N;;;;;
+24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L;<compat> 0028 0066 0029;;;;N;;;;;
+24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L;<compat> 0028 0067 0029;;;;N;;;;;
+24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L;<compat> 0028 0068 0029;;;;N;;;;;
+24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L;<compat> 0028 0069 0029;;;;N;;;;;
+24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L;<compat> 0028 006A 0029;;;;N;;;;;
+24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L;<compat> 0028 006B 0029;;;;N;;;;;
+24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L;<compat> 0028 006C 0029;;;;N;;;;;
+24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L;<compat> 0028 006D 0029;;;;N;;;;;
+24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L;<compat> 0028 006E 0029;;;;N;;;;;
+24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L;<compat> 0028 006F 0029;;;;N;;;;;
+24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L;<compat> 0028 0070 0029;;;;N;;;;;
+24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L;<compat> 0028 0071 0029;;;;N;;;;;
+24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L;<compat> 0028 0072 0029;;;;N;;;;;
+24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L;<compat> 0028 0073 0029;;;;N;;;;;
+24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L;<compat> 0028 0074 0029;;;;N;;;;;
+24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L;<compat> 0028 0075 0029;;;;N;;;;;
+24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L;<compat> 0028 0076 0029;;;;N;;;;;
+24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L;<compat> 0028 0077 0029;;;;N;;;;;
+24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L;<compat> 0028 0078 0029;;;;N;;;;;
+24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L;<compat> 0028 0079 0029;;;;N;;;;;
+24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L;<compat> 0028 007A 0029;;;;N;;;;;
+24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L;<circle> 0041;;;;N;;;;24D0;
+24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L;<circle> 0042;;;;N;;;;24D1;
+24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;24D2;
+24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L;<circle> 0044;;;;N;;;;24D3;
+24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L;<circle> 0045;;;;N;;;;24D4;
+24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L;<circle> 0046;;;;N;;;;24D5;
+24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L;<circle> 0047;;;;N;;;;24D6;
+24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L;<circle> 0048;;;;N;;;;24D7;
+24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L;<circle> 0049;;;;N;;;;24D8;
+24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L;<circle> 004A;;;;N;;;;24D9;
+24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L;<circle> 004B;;;;N;;;;24DA;
+24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L;<circle> 004C;;;;N;;;;24DB;
+24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L;<circle> 004D;;;;N;;;;24DC;
+24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L;<circle> 004E;;;;N;;;;24DD;
+24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L;<circle> 004F;;;;N;;;;24DE;
+24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L;<circle> 0050;;;;N;;;;24DF;
+24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L;<circle> 0051;;;;N;;;;24E0;
+24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;24E1;
+24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L;<circle> 0053;;;;N;;;;24E2;
+24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L;<circle> 0054;;;;N;;;;24E3;
+24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L;<circle> 0055;;;;N;;;;24E4;
+24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L;<circle> 0056;;;;N;;;;24E5;
+24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L;<circle> 0057;;;;N;;;;24E6;
+24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L;<circle> 0058;;;;N;;;;24E7;
+24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L;<circle> 0059;;;;N;;;;24E8;
+24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L;<circle> 005A;;;;N;;;;24E9;
+24D0;CIRCLED LATIN SMALL LETTER A;So;0;L;<circle> 0061;;;;N;;;24B6;;24B6
+24D1;CIRCLED LATIN SMALL LETTER B;So;0;L;<circle> 0062;;;;N;;;24B7;;24B7
+24D2;CIRCLED LATIN SMALL LETTER C;So;0;L;<circle> 0063;;;;N;;;24B8;;24B8
+24D3;CIRCLED LATIN SMALL LETTER D;So;0;L;<circle> 0064;;;;N;;;24B9;;24B9
+24D4;CIRCLED LATIN SMALL LETTER E;So;0;L;<circle> 0065;;;;N;;;24BA;;24BA
+24D5;CIRCLED LATIN SMALL LETTER F;So;0;L;<circle> 0066;;;;N;;;24BB;;24BB
+24D6;CIRCLED LATIN SMALL LETTER G;So;0;L;<circle> 0067;;;;N;;;24BC;;24BC
+24D7;CIRCLED LATIN SMALL LETTER H;So;0;L;<circle> 0068;;;;N;;;24BD;;24BD
+24D8;CIRCLED LATIN SMALL LETTER I;So;0;L;<circle> 0069;;;;N;;;24BE;;24BE
+24D9;CIRCLED LATIN SMALL LETTER J;So;0;L;<circle> 006A;;;;N;;;24BF;;24BF
+24DA;CIRCLED LATIN SMALL LETTER K;So;0;L;<circle> 006B;;;;N;;;24C0;;24C0
+24DB;CIRCLED LATIN SMALL LETTER L;So;0;L;<circle> 006C;;;;N;;;24C1;;24C1
+24DC;CIRCLED LATIN SMALL LETTER M;So;0;L;<circle> 006D;;;;N;;;24C2;;24C2
+24DD;CIRCLED LATIN SMALL LETTER N;So;0;L;<circle> 006E;;;;N;;;24C3;;24C3
+24DE;CIRCLED LATIN SMALL LETTER O;So;0;L;<circle> 006F;;;;N;;;24C4;;24C4
+24DF;CIRCLED LATIN SMALL LETTER P;So;0;L;<circle> 0070;;;;N;;;24C5;;24C5
+24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L;<circle> 0071;;;;N;;;24C6;;24C6
+24E1;CIRCLED LATIN SMALL LETTER R;So;0;L;<circle> 0072;;;;N;;;24C7;;24C7
+24E2;CIRCLED LATIN SMALL LETTER S;So;0;L;<circle> 0073;;;;N;;;24C8;;24C8
+24E3;CIRCLED LATIN SMALL LETTER T;So;0;L;<circle> 0074;;;;N;;;24C9;;24C9
+24E4;CIRCLED LATIN SMALL LETTER U;So;0;L;<circle> 0075;;;;N;;;24CA;;24CA
+24E5;CIRCLED LATIN SMALL LETTER V;So;0;L;<circle> 0076;;;;N;;;24CB;;24CB
+24E6;CIRCLED LATIN SMALL LETTER W;So;0;L;<circle> 0077;;;;N;;;24CC;;24CC
+24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD
+24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE
+24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF
+24EA;CIRCLED DIGIT ZERO;No;0;ON;<circle> 0030;;0;0;N;;;;;
+24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;;
+24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;;
+24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;;
+24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;;
+24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;;
+24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;;
+24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;;
+24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;;
+24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;;
+24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;;
+24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;;
+24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;;
+24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;;
+24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;;
+24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;;
+24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;;
+24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;;
+24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;;
+24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;;
+24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;;
+24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;;
+2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;;
+2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;;
+2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;;
+2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;;
+2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;;
+2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;;
+2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;;
+2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;;
+2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;;
+2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;;
+250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;;
+250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;;
+250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;;
+250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;;
+250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;;
+250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;;
+2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;;
+2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;;
+2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;;
+2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;;
+2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;;
+2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;;
+2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;;
+2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;;
+2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;;
+2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;;
+251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;;
+251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;;
+251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;;
+251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;;
+251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;;
+251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;;
+2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;;
+2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;;
+2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;;
+2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;;
+2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;;
+2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;;
+2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;;
+2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;;
+2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;;
+252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;;
+252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;;
+252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;;
+252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;;
+252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;;
+252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;;
+2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;;
+2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;;
+2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;;
+2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;;
+2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;;
+2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;;
+2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;;
+2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;;
+2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;;
+2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;;
+253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;;
+253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;;
+253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;;
+253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;;
+253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;;
+253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;;
+2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;;
+2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;;
+2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;;
+2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;;
+2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;;
+2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;;
+2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;;
+2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;;
+2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;;
+254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;;
+254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;;
+254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;;
+254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;;
+254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;;
+254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;;
+2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;;
+2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;;
+2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;;
+2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;;
+2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;;
+2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;;
+2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;;
+2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;;
+2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;;
+2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;;
+255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;;
+255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;;
+255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;;
+255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;;
+255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;;
+255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;;
+2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;;
+2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;;
+2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;;
+2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;;
+2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;;
+2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;;
+2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;;
+2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;;
+2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;;
+2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;;
+256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;;
+256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;;
+256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;;
+256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;;
+256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;;
+256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;;
+2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;;
+2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;;
+2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;;
+2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;;
+2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;;
+2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;;
+2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;;
+2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;;
+2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;;
+2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;;
+257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;;
+257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;;
+257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;;
+257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;;
+257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;;
+257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;;
+2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;;
+2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2588;FULL BLOCK;So;0;ON;;;;;N;;;;;
+2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;;
+258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;;
+258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;;
+2591;LIGHT SHADE;So;0;ON;;;;;N;;;;;
+2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+2593;DARK SHADE;So;0;ON;;;;;N;;;;;
+2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;;
+2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;;
+2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;;
+2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;;
+259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;;
+259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;;
+259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;;
+25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;;
+25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;;
+25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;;
+25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;;
+25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;;
+25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;;
+25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;;
+25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;;
+25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;;
+25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;;
+25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;;
+25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;;
+25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;;
+25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;;
+25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;;
+25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;;
+25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;;
+25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;;
+25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;;
+25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;;
+25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;;
+25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;;
+25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;;
+25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;;
+25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;;
+25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;;
+25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;;
+25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;;
+25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;;
+25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+25C9;FISHEYE;So;0;ON;;;;;N;;;;;
+25CA;LOZENGE;So;0;ON;;;;;N;;;;;
+25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;;
+25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25CE;BULLSEYE;So;0;ON;;;;;N;;;;;
+25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;;
+25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E6;WHITE BULLET;So;0;ON;;;;;N;;;;;
+25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;;
+25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;;
+25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;;
+25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;;
+25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;;
+25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;;
+25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;;
+25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;;
+25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+2601;CLOUD;So;0;ON;;;;;N;;;;;
+2602;UMBRELLA;So;0;ON;;;;;N;;;;;
+2603;SNOWMAN;So;0;ON;;;;;N;;;;;
+2604;COMET;So;0;ON;;;;;N;;;;;
+2605;BLACK STAR;So;0;ON;;;;;N;;;;;
+2606;WHITE STAR;So;0;ON;;;;;N;;;;;
+2607;LIGHTNING;So;0;ON;;;;;N;;;;;
+2608;THUNDERSTORM;So;0;ON;;;;;N;;;;;
+2609;SUN;So;0;ON;;;;;N;;;;;
+260A;ASCENDING NODE;So;0;ON;;;;;N;;;;;
+260B;DESCENDING NODE;So;0;ON;;;;;N;;;;;
+260C;CONJUNCTION;So;0;ON;;;;;N;;;;;
+260D;OPPOSITION;So;0;ON;;;;;N;;;;;
+260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;;
+260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;;
+2610;BALLOT BOX;So;0;ON;;;;;N;;;;;
+2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;;
+2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;;
+2613;SALTIRE;So;0;ON;;;;;N;;;;;
+2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;;
+2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;;
+2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2618;SHAMROCK;So;0;ON;;;;;N;;;;;
+2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;;
+261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;;
+2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;;
+2621;CAUTION SIGN;So;0;ON;;;;;N;;;;;
+2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;;
+2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;;
+2624;CADUCEUS;So;0;ON;;;;;N;;;;;
+2625;ANKH;So;0;ON;;;;;N;;;;;
+2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;;
+2627;CHI RHO;So;0;ON;;;;;N;;;;;
+2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;;
+2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;;
+262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;;
+262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;;
+262C;ADI SHAKTI;So;0;ON;;;;;N;;;;;
+262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;;
+262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;;
+262F;YIN YANG;So;0;ON;;;;;N;;;;;
+2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;;
+2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;;
+2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;;
+2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;;
+2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;;
+2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;;
+2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;;
+2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;;
+2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;;
+263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;;
+263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;;
+263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263F;MERCURY;So;0;ON;;;;;N;;;;;
+2640;FEMALE SIGN;So;0;ON;;;;;N;;;;;
+2641;EARTH;So;0;ON;;;;;N;;;;;
+2642;MALE SIGN;So;0;ON;;;;;N;;;;;
+2643;JUPITER;So;0;ON;;;;;N;;;;;
+2644;SATURN;So;0;ON;;;;;N;;;;;
+2645;URANUS;So;0;ON;;;;;N;;;;;
+2646;NEPTUNE;So;0;ON;;;;;N;;;;;
+2647;PLUTO;So;0;ON;;;;;N;;;;;
+2648;ARIES;So;0;ON;;;;;N;;;;;
+2649;TAURUS;So;0;ON;;;;;N;;;;;
+264A;GEMINI;So;0;ON;;;;;N;;;;;
+264B;CANCER;So;0;ON;;;;;N;;;;;
+264C;LEO;So;0;ON;;;;;N;;;;;
+264D;VIRGO;So;0;ON;;;;;N;;;;;
+264E;LIBRA;So;0;ON;;;;;N;;;;;
+264F;SCORPIUS;So;0;ON;;;;;N;;;;;
+2650;SAGITTARIUS;So;0;ON;;;;;N;;;;;
+2651;CAPRICORN;So;0;ON;;;;;N;;;;;
+2652;AQUARIUS;So;0;ON;;;;;N;;;;;
+2653;PISCES;So;0;ON;;;;;N;;;;;
+2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;;
+2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;;
+2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;;
+2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;;
+2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;;
+265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;;
+265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;;
+265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;;
+265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;;
+265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;;
+2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;;
+2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;;
+2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;;
+2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;;
+2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;;
+2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;;
+2668;HOT SPRINGS;So;0;ON;;;;;N;;;;;
+2669;QUARTER NOTE;So;0;ON;;;;;N;;;;;
+266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;;
+266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;;
+266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;;
+266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;;
+266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;;
+266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;;
+2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
+2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;pete;;;
+2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;hdpe;;;
+2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;pvc;;;
+2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;ldpe;;;
+2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;pp;;;
+2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;ps;;;
+2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;other;;;
+267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;;
+267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
+267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;;
+267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;;
+2680;DIE FACE-1;So;0;ON;;;;;N;;;;;
+2681;DIE FACE-2;So;0;ON;;;;;N;;;;;
+2682;DIE FACE-3;So;0;ON;;;;;N;;;;;
+2683;DIE FACE-4;So;0;ON;;;;;N;;;;;
+2684;DIE FACE-5;So;0;ON;;;;;N;;;;;
+2685;DIE FACE-6;So;0;ON;;;;;N;;;;;
+2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;;
+2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;;
+2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;;
+2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;;
+268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;;
+268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;;
+268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;;
+268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;;
+268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;;
+268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;;
+2690;WHITE FLAG;So;0;ON;;;;;N;;;;;
+2691;BLACK FLAG;So;0;ON;;;;;N;;;;;
+2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;;
+2693;ANCHOR;So;0;ON;;;;;N;;;;;
+2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;;
+2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;;
+2696;SCALES;So;0;ON;;;;;N;;;;;
+2697;ALEMBIC;So;0;ON;;;;;N;;;;;
+2698;FLOWER;So;0;ON;;;;;N;;;;;
+2699;GEAR;So;0;ON;;;;;N;;;;;
+269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;;
+269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;;
+269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;;
+269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
+26A0;WARNING SIGN;So;0;ON;;;;;N;;;;;
+26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;;
+26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;;
+26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;;
+26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;;
+26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;;
+26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;;
+26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;;
+26B0;COFFIN;So;0;ON;;;;;N;;;;;
+26B1;FUNERAL URN;So;0;ON;;;;;N;;;;;
+26B2;NEUTER;So;0;ON;;;;;N;;;;;
+26B3;CERES;So;0;ON;;;;;N;;;;;
+26B4;PALLAS;So;0;ON;;;;;N;;;;;
+26B5;JUNO;So;0;ON;;;;;N;;;;;
+26B6;VESTA;So;0;ON;;;;;N;;;;;
+26B7;CHIRON;So;0;ON;;;;;N;;;;;
+26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;;
+26B9;SEXTILE;So;0;ON;;;;;N;;;;;
+26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;;
+26BB;QUINCUNX;So;0;ON;;;;;N;;;;;
+26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;;
+26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;;
+26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;;
+26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;;
+26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;;
+2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;;
+2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;;
+2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;;
+2707;TAPE DRIVE;So;0;ON;;;;;N;;;;;
+2708;AIRPLANE;So;0;ON;;;;;N;;;;;
+2709;ENVELOPE;So;0;ON;;;;;N;;;;;
+270C;VICTORY HAND;So;0;ON;;;;;N;;;;;
+270D;WRITING HAND;So;0;ON;;;;;N;;;;;
+270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+270F;PENCIL;So;0;ON;;;;;N;;;;;
+2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+2711;WHITE NIB;So;0;ON;;;;;N;;;;;
+2712;BLACK NIB;So;0;ON;;;;;N;;;;;
+2713;CHECK MARK;So;0;ON;;;;;N;;;;;
+2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;;
+2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2717;BALLOT X;So;0;ON;;;;;N;;;;;
+2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;;
+2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;;
+271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;;
+271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;;
+271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;;
+271D;LATIN CROSS;So;0;ON;;;;;N;;;;;
+271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;;
+271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;;
+2720;MALTESE CROSS;So;0;ON;;;;;N;;;;;
+2721;STAR OF DAVID;So;0;ON;;;;;N;;;;;
+2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
+272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;;
+272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;;
+272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;;
+272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;;
+2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;;
+2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;;
+2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;;
+273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;;
+273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;;
+2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;;
+2744;SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2747;SPARKLE;So;0;ON;;;;;N;;;;;
+2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;;
+2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;;
+2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;;
+2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;;
+2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;;
+2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;;
+2766;FLORAL HEART;So;0;ON;;;;;N;;;;;
+2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;;
+2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;;
+2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;;
+2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;;
+277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;;
+277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;;
+277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;;
+277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;;
+277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;;
+277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;;
+2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;;
+2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;;
+2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;;
+2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;;
+2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;;
+2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;;
+2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;;
+2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;;
+278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;;
+278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;;
+278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;;
+278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;;
+278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;;
+278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;;
+2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;;
+2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;;
+2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;;
+2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;;
+2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;;
+279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;;
+279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;;
+279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;;
+279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;;
+279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;;
+279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;;
+27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;;
+27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;;
+27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;;
+27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;;
+27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;;
+27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;;
+27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;;
+27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;;
+27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;;
+27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;;
+27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;;
+27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;;
+27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;;
+27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;;
+27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;;
+27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;;
+27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;;
+27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;;
+27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;;
+27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;;
+27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;;
+27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;;
+27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;;
+27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;;
+27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;;
+27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;;
+27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;;
+27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;;
+27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;;
+27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;;
+27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;;
+27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;;
+27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;;
+27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;;
+27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;;
+27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;;
+27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;;
+27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;;
+27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;;
+27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
+2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;;
+2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;;
+2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;;
+2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;;
+2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;;
+2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;;
+2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;;
+2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;;
+2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;;
+2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;;
+280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;;
+280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;;
+280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;;
+280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;;
+280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;;
+280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;;
+2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;;
+2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;;
+2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;;
+2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;;
+2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;;
+2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;;
+2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;;
+2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;;
+2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;;
+2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;;
+281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;;
+281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;;
+281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;;
+281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;;
+281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;;
+281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;;
+2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;;
+2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;;
+2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;;
+2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;;
+2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;;
+2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;;
+2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;;
+2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;;
+2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;;
+2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;;
+282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;;
+282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;;
+282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;;
+282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;;
+282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;;
+282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;;
+2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;;
+2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;;
+2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;;
+2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;;
+2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;;
+2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;;
+2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;;
+2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;;
+2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;;
+2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;;
+283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;;
+283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;;
+283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;;
+283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;;
+283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;;
+283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;;
+2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;;
+2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;;
+2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;;
+2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;;
+2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;;
+2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;;
+2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;;
+2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;;
+2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;;
+2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;;
+284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;;
+284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;;
+284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;;
+284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;;
+284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;;
+284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;;
+2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;;
+2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;;
+2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;;
+2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;;
+2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;;
+2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;;
+2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;;
+2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;;
+2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;;
+2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;;
+285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;;
+285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;;
+285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;;
+285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;;
+285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;;
+285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;;
+2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;;
+2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;;
+2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;;
+2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;;
+2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;;
+2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;;
+2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;;
+2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;;
+2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;;
+2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;;
+286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;;
+286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;;
+286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;;
+286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;;
+286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;;
+286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;;
+2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;;
+2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;;
+2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;;
+2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;;
+2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;;
+2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;;
+2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;;
+2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;;
+2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;;
+2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;;
+287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;;
+287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;;
+287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;;
+287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;;
+287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;;
+287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;;
+2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;;
+2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;;
+2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;;
+2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;;
+2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;;
+2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;;
+2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;;
+2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;;
+2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;;
+2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;;
+288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;;
+288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;;
+288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;;
+288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;;
+288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;;
+288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;;
+2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;;
+2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;;
+2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;;
+2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;;
+2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;;
+2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;;
+2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;;
+2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;;
+2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;;
+2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;;
+289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;;
+289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;;
+289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;;
+289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;;
+289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;;
+289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;;
+28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;;
+28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;;
+28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;;
+28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;;
+28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;;
+28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;;
+28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;;
+28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;;
+28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;;
+28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;;
+28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;;
+28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;;
+28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;;
+28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;;
+28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;;
+28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;;
+28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;;
+28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;;
+28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;;
+28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;;
+28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;;
+28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;;
+28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;;
+28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;;
+28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;;
+28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;;
+28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;;
+28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;;
+28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;;
+28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;;
+28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;;
+28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;;
+28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;;
+28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;;
+28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;;
+28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;;
+28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;;
+28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;;
+28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;;
+28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;;
+28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;;
+28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;;
+28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;;
+28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;;
+28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;;
+28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;;
+28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;;
+28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;;
+28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;;
+28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;;
+28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;;
+28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;;
+28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;;
+28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;;
+28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;;
+28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;;
+28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;;
+28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;;
+28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;;
+28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;;
+28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;;
+28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;;
+28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;;
+28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;;
+28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;;
+28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;;
+28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;;
+28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;;
+28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;;
+28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;;
+28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;;
+28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;;
+28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;;
+28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;;
+28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;;
+28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;;
+28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;;
+28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;;
+28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;;
+28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;;
+28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;;
+28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;;
+28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;;
+28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;;
+28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;;
+28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;;
+28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;;
+28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;;
+28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;;
+28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;;
+28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;;
+28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;;
+28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;;
+28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;;
+28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;;
+28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;;
+2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;;
+290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;;
+290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;;
+2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;;
+2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;;
+2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;;
+2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;;
+292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;;
+292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;;
+2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;;
+2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;;
+2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;;
+2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;;
+2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;;
+293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;;
+293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;;
+2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;;
+2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;;
+2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;;
+294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;;
+294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;;
+294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;;
+294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;;
+294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;;
+2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;;
+2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;;
+2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;;
+2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;;
+2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;;
+2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;;
+2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;;
+2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;;
+2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;;
+2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;;
+295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;;
+295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;;
+295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;;
+295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;;
+295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;;
+295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;;
+2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;;
+2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;;
+2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;;
+2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;;
+2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;;
+296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;;
+296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;;
+296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;;
+296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;;
+2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;;
+297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;;
+2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;;
+2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;;
+2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;;
+2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;;
+2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;;
+2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;;
+2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;;
+2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;;
+298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;;
+298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;;
+298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;;
+298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;;
+298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;;
+298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;;
+2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;;
+2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;;
+2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;;
+2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;;
+2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;;
+2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;;
+2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;;
+2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;;
+2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;;
+2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;;
+299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;;
+299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
+299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;;
+299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;;
+299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;;
+299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
+29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;;
+29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;;
+29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;;
+29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;;
+29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;;
+29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;;
+29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;;
+29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;;
+29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;;
+29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;;
+29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;;
+29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;;
+29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;;
+29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;;
+29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;;
+29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;;
+29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;;
+29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;;
+29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;;
+29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;;
+29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;;
+29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;;
+29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;;
+29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;;
+29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;;
+29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;;
+29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;;
+29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;;
+29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;;
+29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;;
+29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;;
+29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;;
+29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;;
+29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;;
+29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;;
+29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;;
+29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;;
+29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;;
+29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;;
+29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;;
+29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;;
+29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;;
+29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;;
+29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;;
+29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;;
+29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;;
+29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;;
+29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;;
+29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;;
+29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;;
+29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;;
+29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;;
+29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
+29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;;
+29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;;
+29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+29FE;TINY;Sm;0;ON;;;;;N;;;;;
+29FF;MINY;Sm;0;ON;;;;;N;;;;;
+2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;;
+2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;;
+2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;;
+2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON;<compat> 222B 222B 222B 222B;;;;Y;;;;;
+2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;;
+2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;;
+2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;;
+2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;;
+2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;;
+2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;;
+2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;;
+2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;;
+2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;;
+2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;;
+2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;;
+2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+2A1D;JOIN;Sm;0;ON;;;;;N;;;;;
+2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;;
+2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;;
+2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;;
+2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;;
+2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;;
+2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;;
+2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;;
+2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;;
+2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;;
+2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;;
+2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;;
+2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;;
+2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;;
+2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;;
+2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;;
+2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;;
+2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;;
+2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;;
+2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;;
+2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;;
+2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;;
+2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;;
+2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;;
+2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;;
+2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;;
+2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;;
+2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;;
+2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;;
+2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A74;DOUBLE COLON EQUAL;Sm;0;ON;<compat> 003A 003A 003D;;;;Y;;;;;
+2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D;;;;N;;;;;
+2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D 003D;;;;N;;;;;
+2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;;
+2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;;
+2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;;
+2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;;
+2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;;
+2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;;
+2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;;
+2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;;
+2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;;
+2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;;
+2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;;
+2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;;
+2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;;
+2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;;
+2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;;
+2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;;
+2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;not independent;;;
+2ADD;NONFORKING;Sm;0;ON;;;;;N;;independent;;;
+2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;;
+2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;;
+2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;;
+2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;;
+2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;;
+2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;;
+2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;;
+2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;;
+2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;;
+2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;;
+2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;;
+2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;;
+2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;;
+2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;;
+2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;;
+2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;;
+2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;;
+2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;;
+2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;;
+2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;;
+2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;;
+2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
+2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;;
+2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;;
+2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;;
+2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;;
+2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;;
+2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;;
+2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;;
+2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;;
+2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;;
+2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;;
+2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;;
+2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;;
+2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;;
+2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30;
+2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31;
+2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32;
+2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33;
+2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34;
+2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35;
+2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36;
+2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37;
+2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38;
+2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39;
+2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A;
+2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B;
+2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C;
+2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D;
+2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E;
+2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F;
+2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40;
+2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41;
+2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42;
+2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43;
+2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44;
+2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45;
+2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46;
+2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47;
+2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48;
+2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49;
+2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A;
+2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B;
+2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C;
+2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D;
+2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E;
+2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F;
+2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50;
+2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51;
+2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52;
+2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53;
+2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54;
+2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55;
+2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56;
+2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57;
+2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58;
+2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59;
+2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A;
+2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B;
+2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C;
+2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D;
+2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E;
+2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00
+2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01
+2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02
+2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03
+2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04
+2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05
+2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06
+2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07
+2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08
+2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09
+2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A
+2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B
+2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C
+2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D
+2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E
+2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F
+2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10
+2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11
+2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12
+2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13
+2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14
+2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15
+2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16
+2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17
+2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18
+2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19
+2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A
+2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B
+2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C
+2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D
+2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E
+2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F
+2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20
+2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21
+2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22
+2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23
+2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24
+2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25
+2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26
+2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27
+2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28
+2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29
+2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A
+2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B
+2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C
+2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D
+2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E
+2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61;
+2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60
+2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B;
+2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D;
+2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D;
+2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A
+2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E
+2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68;
+2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67
+2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A;
+2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69
+2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C;
+2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B
+2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251;
+2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271;
+2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250;
+2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;;
+2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73;
+2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72
+2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;;
+2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76;
+2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75
+2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;;
+2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;;
+2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;;
+2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;;
+2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;;
+2C7C;LATIN SUBSCRIPT SMALL LETTER J;Ll;0;L;<sub> 006A;;;;N;;;;;
+2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L;<super> 0056;;;;N;;;;;
+2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81;
+2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80
+2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83;
+2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82
+2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85;
+2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84
+2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87;
+2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86
+2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89;
+2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88
+2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B;
+2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A
+2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D;
+2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C
+2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F;
+2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E
+2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91;
+2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90
+2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93;
+2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92
+2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95;
+2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94
+2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97;
+2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96
+2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99;
+2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98
+2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B;
+2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A
+2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D;
+2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C
+2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F;
+2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E
+2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1;
+2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0
+2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3;
+2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2
+2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5;
+2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4
+2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7;
+2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6
+2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9;
+2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8
+2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB;
+2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA
+2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD;
+2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC
+2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF;
+2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE
+2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1;
+2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0
+2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3;
+2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2
+2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5;
+2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4
+2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7;
+2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6
+2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9;
+2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8
+2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB;
+2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA
+2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD;
+2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC
+2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF;
+2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE
+2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1;
+2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0
+2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3;
+2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2
+2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5;
+2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4
+2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7;
+2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6
+2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9;
+2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8
+2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB;
+2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA
+2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD;
+2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC
+2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF;
+2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE
+2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1;
+2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0
+2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3;
+2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2
+2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5;
+2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4
+2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7;
+2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6
+2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9;
+2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8
+2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB;
+2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA
+2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD;
+2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC
+2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF;
+2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE
+2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1;
+2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0
+2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3;
+2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2
+2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;;
+2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;;
+2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;;
+2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;;
+2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;;
+2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;;
+2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;;
+2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;;
+2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;;
+2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;;
+2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;Khutsuri;10A0;;10A0
+2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;Khutsuri;10A1;;10A1
+2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;Khutsuri;10A2;;10A2
+2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;Khutsuri;10A3;;10A3
+2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;Khutsuri;10A4;;10A4
+2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;Khutsuri;10A5;;10A5
+2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;Khutsuri;10A6;;10A6
+2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;Khutsuri;10A7;;10A7
+2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;Khutsuri;10A8;;10A8
+2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;Khutsuri;10A9;;10A9
+2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;Khutsuri;10AA;;10AA
+2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;Khutsuri;10AB;;10AB
+2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;Khutsuri;10AC;;10AC
+2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;Khutsuri;10AD;;10AD
+2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;Khutsuri;10AE;;10AE
+2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;Khutsuri;10AF;;10AF
+2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;Khutsuri;10B0;;10B0
+2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;Khutsuri;10B1;;10B1
+2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;Khutsuri;10B2;;10B2
+2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;Khutsuri;10B3;;10B3
+2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;Khutsuri;10B4;;10B4
+2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;Khutsuri;10B5;;10B5
+2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;Khutsuri;10B6;;10B6
+2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;Khutsuri;10B7;;10B7
+2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;Khutsuri;10B8;;10B8
+2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;Khutsuri;10B9;;10B9
+2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;Khutsuri;10BA;;10BA
+2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;Khutsuri;10BB;;10BB
+2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;Khutsuri;10BC;;10BC
+2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;Khutsuri;10BD;;10BD
+2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;Khutsuri;10BE;;10BE
+2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;Khutsuri;10BF;;10BF
+2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;Khutsuri;10C0;;10C0
+2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;Khutsuri;10C1;;10C1
+2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;Khutsuri;10C2;;10C2
+2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;Khutsuri;10C3;;10C3
+2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;Khutsuri;10C4;;10C4
+2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;Khutsuri;10C5;;10C5
+2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;;
+2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;;
+2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;;
+2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;;
+2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;;
+2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;;
+2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;;
+2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;;
+2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;;
+2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;;
+2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;;
+2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;;
+2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;;
+2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;;
+2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;;
+2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;;
+2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;Tuareg yab;;;
+2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;;
+2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;;
+2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;;
+2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;;
+2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;;
+2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;;
+2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;;
+2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;;
+2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;;
+2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;;
+2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;;
+2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;;
+2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;;
+2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;;
+2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;;
+2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;;
+2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;;
+2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;;
+2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;Tuareg yaw;;;
+2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;;
+2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;;
+2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;;
+2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;;
+2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;Adrar yaj;;;
+2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;;
+2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;;
+2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;;
+2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;;
+2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;;
+2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;;
+2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;;
+2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;;
+2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;;
+2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;;
+2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;;
+2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;harpoon yaz;;;
+2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;;
+2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;tamatart;;;
+2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;;
+2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;;
+2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;;
+2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;;
+2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;;
+2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;;
+2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;;
+2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;;
+2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;;
+2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;;
+2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;;
+2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;;
+2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;;
+2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;;
+2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;;
+2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;;
+2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;;
+2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;;
+2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;;
+2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;;
+2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;;
+2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;;
+2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;;
+2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;;
+2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;;
+2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;;
+2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;;
+2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;;
+2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;;
+2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;;
+2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;;
+2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;;
+2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;;
+2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;;
+2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;;
+2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;;
+2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;;
+2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;;
+2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;;
+2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;;
+2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;;
+2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;;
+2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;;
+2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;;
+2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;;
+2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;;
+2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;;
+2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;;
+2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;;
+2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;;
+2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;;
+2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;;
+2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;;
+2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;;
+2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;;
+2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;;
+2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;;
+2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;;
+2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;;
+2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;;
+2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;;
+2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;;
+2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;;
+2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;;
+2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;;
+2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;;
+2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;;
+2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;;
+2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;;
+2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;;
+2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;;
+2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;;
+2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;;
+2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;;
+2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;;
+2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;;
+2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;;
+2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;;
+2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;;
+2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;;
+2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;;
+2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;;
+2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;;
+2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;;
+2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;;
+2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;;
+2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;;
+2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;;
+2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;;
+2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;;
+2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;;
+2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;;
+2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;;
+2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;;
+2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;;
+2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;;
+2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;;
+2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;;
+2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;;
+2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;;
+2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;;
+2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;;
+2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;;
+2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;;
+2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;;
+2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;;
+2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;;
+2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;;
+2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;;
+2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;;
+2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;;
+2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;;
+2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;;
+2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;;
+2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;;
+2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;;
+2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;;
+2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;;
+2E30;RING POINT;Po;0;ON;;;;;N;;;;;
+2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;;
+2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;;
+2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;;
+2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;;
+2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;;
+2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;;
+2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;;
+2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;;
+2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;;
+2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;;
+2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;;
+2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;;
+2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;;
+2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;;
+2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;;
+2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;;
+2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;;
+2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;;
+2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;;
+2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;;
+2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;;
+2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;;
+2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;;
+2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;;
+2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;;
+2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;;
+2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;;
+2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;;
+2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;;
+2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;;
+2E9F;CJK RADICAL MOTHER;So;0;ON;<compat> 6BCD;;;;N;;;;;
+2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;;
+2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;;
+2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;;
+2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;;
+2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;;
+2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;;
+2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;;
+2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;;
+2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;;
+2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;;
+2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;;
+2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;;
+2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;;
+2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;;
+2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;;
+2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;;
+2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;;
+2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;;
+2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;;
+2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;;
+2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;;
+2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;;
+2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;;
+2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;;
+2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;;
+2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;;
+2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;;
+2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;;
+2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;;
+2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;;
+2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;;
+2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;;
+2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;;
+2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;;
+2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;;
+2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;;
+2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;;
+2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;;
+2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;;
+2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;;
+2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;;
+2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;;
+2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;;
+2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;;
+2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;;
+2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;;
+2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;;
+2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;;
+2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;;
+2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;;
+2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;;
+2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;;
+2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;;
+2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;;
+2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;;
+2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;;
+2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;;
+2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;;
+2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;;
+2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;;
+2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;;
+2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;;
+2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;;
+2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;;
+2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;;
+2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;;
+2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;;
+2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;;
+2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;;
+2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;;
+2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;;
+2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;;
+2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;;
+2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;;
+2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;;
+2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;;
+2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;;
+2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON;<compat> 9F9F;;;;N;;;;;
+2F00;KANGXI RADICAL ONE;So;0;ON;<compat> 4E00;;;;N;;;;;
+2F01;KANGXI RADICAL LINE;So;0;ON;<compat> 4E28;;;;N;;;;;
+2F02;KANGXI RADICAL DOT;So;0;ON;<compat> 4E36;;;;N;;;;;
+2F03;KANGXI RADICAL SLASH;So;0;ON;<compat> 4E3F;;;;N;;;;;
+2F04;KANGXI RADICAL SECOND;So;0;ON;<compat> 4E59;;;;N;;;;;
+2F05;KANGXI RADICAL HOOK;So;0;ON;<compat> 4E85;;;;N;;;;;
+2F06;KANGXI RADICAL TWO;So;0;ON;<compat> 4E8C;;;;N;;;;;
+2F07;KANGXI RADICAL LID;So;0;ON;<compat> 4EA0;;;;N;;;;;
+2F08;KANGXI RADICAL MAN;So;0;ON;<compat> 4EBA;;;;N;;;;;
+2F09;KANGXI RADICAL LEGS;So;0;ON;<compat> 513F;;;;N;;;;;
+2F0A;KANGXI RADICAL ENTER;So;0;ON;<compat> 5165;;;;N;;;;;
+2F0B;KANGXI RADICAL EIGHT;So;0;ON;<compat> 516B;;;;N;;;;;
+2F0C;KANGXI RADICAL DOWN BOX;So;0;ON;<compat> 5182;;;;N;;;;;
+2F0D;KANGXI RADICAL COVER;So;0;ON;<compat> 5196;;;;N;;;;;
+2F0E;KANGXI RADICAL ICE;So;0;ON;<compat> 51AB;;;;N;;;;;
+2F0F;KANGXI RADICAL TABLE;So;0;ON;<compat> 51E0;;;;N;;;;;
+2F10;KANGXI RADICAL OPEN BOX;So;0;ON;<compat> 51F5;;;;N;;;;;
+2F11;KANGXI RADICAL KNIFE;So;0;ON;<compat> 5200;;;;N;;;;;
+2F12;KANGXI RADICAL POWER;So;0;ON;<compat> 529B;;;;N;;;;;
+2F13;KANGXI RADICAL WRAP;So;0;ON;<compat> 52F9;;;;N;;;;;
+2F14;KANGXI RADICAL SPOON;So;0;ON;<compat> 5315;;;;N;;;;;
+2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON;<compat> 531A;;;;N;;;;;
+2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON;<compat> 5338;;;;N;;;;;
+2F17;KANGXI RADICAL TEN;So;0;ON;<compat> 5341;;;;N;;;;;
+2F18;KANGXI RADICAL DIVINATION;So;0;ON;<compat> 535C;;;;N;;;;;
+2F19;KANGXI RADICAL SEAL;So;0;ON;<compat> 5369;;;;N;;;;;
+2F1A;KANGXI RADICAL CLIFF;So;0;ON;<compat> 5382;;;;N;;;;;
+2F1B;KANGXI RADICAL PRIVATE;So;0;ON;<compat> 53B6;;;;N;;;;;
+2F1C;KANGXI RADICAL AGAIN;So;0;ON;<compat> 53C8;;;;N;;;;;
+2F1D;KANGXI RADICAL MOUTH;So;0;ON;<compat> 53E3;;;;N;;;;;
+2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON;<compat> 56D7;;;;N;;;;;
+2F1F;KANGXI RADICAL EARTH;So;0;ON;<compat> 571F;;;;N;;;;;
+2F20;KANGXI RADICAL SCHOLAR;So;0;ON;<compat> 58EB;;;;N;;;;;
+2F21;KANGXI RADICAL GO;So;0;ON;<compat> 5902;;;;N;;;;;
+2F22;KANGXI RADICAL GO SLOWLY;So;0;ON;<compat> 590A;;;;N;;;;;
+2F23;KANGXI RADICAL EVENING;So;0;ON;<compat> 5915;;;;N;;;;;
+2F24;KANGXI RADICAL BIG;So;0;ON;<compat> 5927;;;;N;;;;;
+2F25;KANGXI RADICAL WOMAN;So;0;ON;<compat> 5973;;;;N;;;;;
+2F26;KANGXI RADICAL CHILD;So;0;ON;<compat> 5B50;;;;N;;;;;
+2F27;KANGXI RADICAL ROOF;So;0;ON;<compat> 5B80;;;;N;;;;;
+2F28;KANGXI RADICAL INCH;So;0;ON;<compat> 5BF8;;;;N;;;;;
+2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;;
+2F2A;KANGXI RADICAL LAME;So;0;ON;<compat> 5C22;;;;N;;;;;
+2F2B;KANGXI RADICAL CORPSE;So;0;ON;<compat> 5C38;;;;N;;;;;
+2F2C;KANGXI RADICAL SPROUT;So;0;ON;<compat> 5C6E;;;;N;;;;;
+2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON;<compat> 5C71;;;;N;;;;;
+2F2E;KANGXI RADICAL RIVER;So;0;ON;<compat> 5DDB;;;;N;;;;;
+2F2F;KANGXI RADICAL WORK;So;0;ON;<compat> 5DE5;;;;N;;;;;
+2F30;KANGXI RADICAL ONESELF;So;0;ON;<compat> 5DF1;;;;N;;;;;
+2F31;KANGXI RADICAL TURBAN;So;0;ON;<compat> 5DFE;;;;N;;;;;
+2F32;KANGXI RADICAL DRY;So;0;ON;<compat> 5E72;;;;N;;;;;
+2F33;KANGXI RADICAL SHORT THREAD;So;0;ON;<compat> 5E7A;;;;N;;;;;
+2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON;<compat> 5E7F;;;;N;;;;;
+2F35;KANGXI RADICAL LONG STRIDE;So;0;ON;<compat> 5EF4;;;;N;;;;;
+2F36;KANGXI RADICAL TWO HANDS;So;0;ON;<compat> 5EFE;;;;N;;;;;
+2F37;KANGXI RADICAL SHOOT;So;0;ON;<compat> 5F0B;;;;N;;;;;
+2F38;KANGXI RADICAL BOW;So;0;ON;<compat> 5F13;;;;N;;;;;
+2F39;KANGXI RADICAL SNOUT;So;0;ON;<compat> 5F50;;;;N;;;;;
+2F3A;KANGXI RADICAL BRISTLE;So;0;ON;<compat> 5F61;;;;N;;;;;
+2F3B;KANGXI RADICAL STEP;So;0;ON;<compat> 5F73;;;;N;;;;;
+2F3C;KANGXI RADICAL HEART;So;0;ON;<compat> 5FC3;;;;N;;;;;
+2F3D;KANGXI RADICAL HALBERD;So;0;ON;<compat> 6208;;;;N;;;;;
+2F3E;KANGXI RADICAL DOOR;So;0;ON;<compat> 6236;;;;N;;;;;
+2F3F;KANGXI RADICAL HAND;So;0;ON;<compat> 624B;;;;N;;;;;
+2F40;KANGXI RADICAL BRANCH;So;0;ON;<compat> 652F;;;;N;;;;;
+2F41;KANGXI RADICAL RAP;So;0;ON;<compat> 6534;;;;N;;;;;
+2F42;KANGXI RADICAL SCRIPT;So;0;ON;<compat> 6587;;;;N;;;;;
+2F43;KANGXI RADICAL DIPPER;So;0;ON;<compat> 6597;;;;N;;;;;
+2F44;KANGXI RADICAL AXE;So;0;ON;<compat> 65A4;;;;N;;;;;
+2F45;KANGXI RADICAL SQUARE;So;0;ON;<compat> 65B9;;;;N;;;;;
+2F46;KANGXI RADICAL NOT;So;0;ON;<compat> 65E0;;;;N;;;;;
+2F47;KANGXI RADICAL SUN;So;0;ON;<compat> 65E5;;;;N;;;;;
+2F48;KANGXI RADICAL SAY;So;0;ON;<compat> 66F0;;;;N;;;;;
+2F49;KANGXI RADICAL MOON;So;0;ON;<compat> 6708;;;;N;;;;;
+2F4A;KANGXI RADICAL TREE;So;0;ON;<compat> 6728;;;;N;;;;;
+2F4B;KANGXI RADICAL LACK;So;0;ON;<compat> 6B20;;;;N;;;;;
+2F4C;KANGXI RADICAL STOP;So;0;ON;<compat> 6B62;;;;N;;;;;
+2F4D;KANGXI RADICAL DEATH;So;0;ON;<compat> 6B79;;;;N;;;;;
+2F4E;KANGXI RADICAL WEAPON;So;0;ON;<compat> 6BB3;;;;N;;;;;
+2F4F;KANGXI RADICAL DO NOT;So;0;ON;<compat> 6BCB;;;;N;;;;;
+2F50;KANGXI RADICAL COMPARE;So;0;ON;<compat> 6BD4;;;;N;;;;;
+2F51;KANGXI RADICAL FUR;So;0;ON;<compat> 6BDB;;;;N;;;;;
+2F52;KANGXI RADICAL CLAN;So;0;ON;<compat> 6C0F;;;;N;;;;;
+2F53;KANGXI RADICAL STEAM;So;0;ON;<compat> 6C14;;;;N;;;;;
+2F54;KANGXI RADICAL WATER;So;0;ON;<compat> 6C34;;;;N;;;;;
+2F55;KANGXI RADICAL FIRE;So;0;ON;<compat> 706B;;;;N;;;;;
+2F56;KANGXI RADICAL CLAW;So;0;ON;<compat> 722A;;;;N;;;;;
+2F57;KANGXI RADICAL FATHER;So;0;ON;<compat> 7236;;;;N;;;;;
+2F58;KANGXI RADICAL DOUBLE X;So;0;ON;<compat> 723B;;;;N;;;;;
+2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON;<compat> 723F;;;;N;;;;;
+2F5A;KANGXI RADICAL SLICE;So;0;ON;<compat> 7247;;;;N;;;;;
+2F5B;KANGXI RADICAL FANG;So;0;ON;<compat> 7259;;;;N;;;;;
+2F5C;KANGXI RADICAL COW;So;0;ON;<compat> 725B;;;;N;;;;;
+2F5D;KANGXI RADICAL DOG;So;0;ON;<compat> 72AC;;;;N;;;;;
+2F5E;KANGXI RADICAL PROFOUND;So;0;ON;<compat> 7384;;;;N;;;;;
+2F5F;KANGXI RADICAL JADE;So;0;ON;<compat> 7389;;;;N;;;;;
+2F60;KANGXI RADICAL MELON;So;0;ON;<compat> 74DC;;;;N;;;;;
+2F61;KANGXI RADICAL TILE;So;0;ON;<compat> 74E6;;;;N;;;;;
+2F62;KANGXI RADICAL SWEET;So;0;ON;<compat> 7518;;;;N;;;;;
+2F63;KANGXI RADICAL LIFE;So;0;ON;<compat> 751F;;;;N;;;;;
+2F64;KANGXI RADICAL USE;So;0;ON;<compat> 7528;;;;N;;;;;
+2F65;KANGXI RADICAL FIELD;So;0;ON;<compat> 7530;;;;N;;;;;
+2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON;<compat> 758B;;;;N;;;;;
+2F67;KANGXI RADICAL SICKNESS;So;0;ON;<compat> 7592;;;;N;;;;;
+2F68;KANGXI RADICAL DOTTED TENT;So;0;ON;<compat> 7676;;;;N;;;;;
+2F69;KANGXI RADICAL WHITE;So;0;ON;<compat> 767D;;;;N;;;;;
+2F6A;KANGXI RADICAL SKIN;So;0;ON;<compat> 76AE;;;;N;;;;;
+2F6B;KANGXI RADICAL DISH;So;0;ON;<compat> 76BF;;;;N;;;;;
+2F6C;KANGXI RADICAL EYE;So;0;ON;<compat> 76EE;;;;N;;;;;
+2F6D;KANGXI RADICAL SPEAR;So;0;ON;<compat> 77DB;;;;N;;;;;
+2F6E;KANGXI RADICAL ARROW;So;0;ON;<compat> 77E2;;;;N;;;;;
+2F6F;KANGXI RADICAL STONE;So;0;ON;<compat> 77F3;;;;N;;;;;
+2F70;KANGXI RADICAL SPIRIT;So;0;ON;<compat> 793A;;;;N;;;;;
+2F71;KANGXI RADICAL TRACK;So;0;ON;<compat> 79B8;;;;N;;;;;
+2F72;KANGXI RADICAL GRAIN;So;0;ON;<compat> 79BE;;;;N;;;;;
+2F73;KANGXI RADICAL CAVE;So;0;ON;<compat> 7A74;;;;N;;;;;
+2F74;KANGXI RADICAL STAND;So;0;ON;<compat> 7ACB;;;;N;;;;;
+2F75;KANGXI RADICAL BAMBOO;So;0;ON;<compat> 7AF9;;;;N;;;;;
+2F76;KANGXI RADICAL RICE;So;0;ON;<compat> 7C73;;;;N;;;;;
+2F77;KANGXI RADICAL SILK;So;0;ON;<compat> 7CF8;;;;N;;;;;
+2F78;KANGXI RADICAL JAR;So;0;ON;<compat> 7F36;;;;N;;;;;
+2F79;KANGXI RADICAL NET;So;0;ON;<compat> 7F51;;;;N;;;;;
+2F7A;KANGXI RADICAL SHEEP;So;0;ON;<compat> 7F8A;;;;N;;;;;
+2F7B;KANGXI RADICAL FEATHER;So;0;ON;<compat> 7FBD;;;;N;;;;;
+2F7C;KANGXI RADICAL OLD;So;0;ON;<compat> 8001;;;;N;;;;;
+2F7D;KANGXI RADICAL AND;So;0;ON;<compat> 800C;;;;N;;;;;
+2F7E;KANGXI RADICAL PLOW;So;0;ON;<compat> 8012;;;;N;;;;;
+2F7F;KANGXI RADICAL EAR;So;0;ON;<compat> 8033;;;;N;;;;;
+2F80;KANGXI RADICAL BRUSH;So;0;ON;<compat> 807F;;;;N;;;;;
+2F81;KANGXI RADICAL MEAT;So;0;ON;<compat> 8089;;;;N;;;;;
+2F82;KANGXI RADICAL MINISTER;So;0;ON;<compat> 81E3;;;;N;;;;;
+2F83;KANGXI RADICAL SELF;So;0;ON;<compat> 81EA;;;;N;;;;;
+2F84;KANGXI RADICAL ARRIVE;So;0;ON;<compat> 81F3;;;;N;;;;;
+2F85;KANGXI RADICAL MORTAR;So;0;ON;<compat> 81FC;;;;N;;;;;
+2F86;KANGXI RADICAL TONGUE;So;0;ON;<compat> 820C;;;;N;;;;;
+2F87;KANGXI RADICAL OPPOSE;So;0;ON;<compat> 821B;;;;N;;;;;
+2F88;KANGXI RADICAL BOAT;So;0;ON;<compat> 821F;;;;N;;;;;
+2F89;KANGXI RADICAL STOPPING;So;0;ON;<compat> 826E;;;;N;;;;;
+2F8A;KANGXI RADICAL COLOR;So;0;ON;<compat> 8272;;;;N;;;;;
+2F8B;KANGXI RADICAL GRASS;So;0;ON;<compat> 8278;;;;N;;;;;
+2F8C;KANGXI RADICAL TIGER;So;0;ON;<compat> 864D;;;;N;;;;;
+2F8D;KANGXI RADICAL INSECT;So;0;ON;<compat> 866B;;;;N;;;;;
+2F8E;KANGXI RADICAL BLOOD;So;0;ON;<compat> 8840;;;;N;;;;;
+2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON;<compat> 884C;;;;N;;;;;
+2F90;KANGXI RADICAL CLOTHES;So;0;ON;<compat> 8863;;;;N;;;;;
+2F91;KANGXI RADICAL WEST;So;0;ON;<compat> 897E;;;;N;;;;;
+2F92;KANGXI RADICAL SEE;So;0;ON;<compat> 898B;;;;N;;;;;
+2F93;KANGXI RADICAL HORN;So;0;ON;<compat> 89D2;;;;N;;;;;
+2F94;KANGXI RADICAL SPEECH;So;0;ON;<compat> 8A00;;;;N;;;;;
+2F95;KANGXI RADICAL VALLEY;So;0;ON;<compat> 8C37;;;;N;;;;;
+2F96;KANGXI RADICAL BEAN;So;0;ON;<compat> 8C46;;;;N;;;;;
+2F97;KANGXI RADICAL PIG;So;0;ON;<compat> 8C55;;;;N;;;;;
+2F98;KANGXI RADICAL BADGER;So;0;ON;<compat> 8C78;;;;N;;;;;
+2F99;KANGXI RADICAL SHELL;So;0;ON;<compat> 8C9D;;;;N;;;;;
+2F9A;KANGXI RADICAL RED;So;0;ON;<compat> 8D64;;;;N;;;;;
+2F9B;KANGXI RADICAL RUN;So;0;ON;<compat> 8D70;;;;N;;;;;
+2F9C;KANGXI RADICAL FOOT;So;0;ON;<compat> 8DB3;;;;N;;;;;
+2F9D;KANGXI RADICAL BODY;So;0;ON;<compat> 8EAB;;;;N;;;;;
+2F9E;KANGXI RADICAL CART;So;0;ON;<compat> 8ECA;;;;N;;;;;
+2F9F;KANGXI RADICAL BITTER;So;0;ON;<compat> 8F9B;;;;N;;;;;
+2FA0;KANGXI RADICAL MORNING;So;0;ON;<compat> 8FB0;;;;N;;;;;
+2FA1;KANGXI RADICAL WALK;So;0;ON;<compat> 8FB5;;;;N;;;;;
+2FA2;KANGXI RADICAL CITY;So;0;ON;<compat> 9091;;;;N;;;;;
+2FA3;KANGXI RADICAL WINE;So;0;ON;<compat> 9149;;;;N;;;;;
+2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON;<compat> 91C6;;;;N;;;;;
+2FA5;KANGXI RADICAL VILLAGE;So;0;ON;<compat> 91CC;;;;N;;;;;
+2FA6;KANGXI RADICAL GOLD;So;0;ON;<compat> 91D1;;;;N;;;;;
+2FA7;KANGXI RADICAL LONG;So;0;ON;<compat> 9577;;;;N;;;;;
+2FA8;KANGXI RADICAL GATE;So;0;ON;<compat> 9580;;;;N;;;;;
+2FA9;KANGXI RADICAL MOUND;So;0;ON;<compat> 961C;;;;N;;;;;
+2FAA;KANGXI RADICAL SLAVE;So;0;ON;<compat> 96B6;;;;N;;;;;
+2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON;<compat> 96B9;;;;N;;;;;
+2FAC;KANGXI RADICAL RAIN;So;0;ON;<compat> 96E8;;;;N;;;;;
+2FAD;KANGXI RADICAL BLUE;So;0;ON;<compat> 9751;;;;N;;;;;
+2FAE;KANGXI RADICAL WRONG;So;0;ON;<compat> 975E;;;;N;;;;;
+2FAF;KANGXI RADICAL FACE;So;0;ON;<compat> 9762;;;;N;;;;;
+2FB0;KANGXI RADICAL LEATHER;So;0;ON;<compat> 9769;;;;N;;;;;
+2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON;<compat> 97CB;;;;N;;;;;
+2FB2;KANGXI RADICAL LEEK;So;0;ON;<compat> 97ED;;;;N;;;;;
+2FB3;KANGXI RADICAL SOUND;So;0;ON;<compat> 97F3;;;;N;;;;;
+2FB4;KANGXI RADICAL LEAF;So;0;ON;<compat> 9801;;;;N;;;;;
+2FB5;KANGXI RADICAL WIND;So;0;ON;<compat> 98A8;;;;N;;;;;
+2FB6;KANGXI RADICAL FLY;So;0;ON;<compat> 98DB;;;;N;;;;;
+2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;;
+2FB8;KANGXI RADICAL HEAD;So;0;ON;<compat> 9996;;;;N;;;;;
+2FB9;KANGXI RADICAL FRAGRANT;So;0;ON;<compat> 9999;;;;N;;;;;
+2FBA;KANGXI RADICAL HORSE;So;0;ON;<compat> 99AC;;;;N;;;;;
+2FBB;KANGXI RADICAL BONE;So;0;ON;<compat> 9AA8;;;;N;;;;;
+2FBC;KANGXI RADICAL TALL;So;0;ON;<compat> 9AD8;;;;N;;;;;
+2FBD;KANGXI RADICAL HAIR;So;0;ON;<compat> 9ADF;;;;N;;;;;
+2FBE;KANGXI RADICAL FIGHT;So;0;ON;<compat> 9B25;;;;N;;;;;
+2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON;<compat> 9B2F;;;;N;;;;;
+2FC0;KANGXI RADICAL CAULDRON;So;0;ON;<compat> 9B32;;;;N;;;;;
+2FC1;KANGXI RADICAL GHOST;So;0;ON;<compat> 9B3C;;;;N;;;;;
+2FC2;KANGXI RADICAL FISH;So;0;ON;<compat> 9B5A;;;;N;;;;;
+2FC3;KANGXI RADICAL BIRD;So;0;ON;<compat> 9CE5;;;;N;;;;;
+2FC4;KANGXI RADICAL SALT;So;0;ON;<compat> 9E75;;;;N;;;;;
+2FC5;KANGXI RADICAL DEER;So;0;ON;<compat> 9E7F;;;;N;;;;;
+2FC6;KANGXI RADICAL WHEAT;So;0;ON;<compat> 9EA5;;;;N;;;;;
+2FC7;KANGXI RADICAL HEMP;So;0;ON;<compat> 9EBB;;;;N;;;;;
+2FC8;KANGXI RADICAL YELLOW;So;0;ON;<compat> 9EC3;;;;N;;;;;
+2FC9;KANGXI RADICAL MILLET;So;0;ON;<compat> 9ECD;;;;N;;;;;
+2FCA;KANGXI RADICAL BLACK;So;0;ON;<compat> 9ED1;;;;N;;;;;
+2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON;<compat> 9EF9;;;;N;;;;;
+2FCC;KANGXI RADICAL FROG;So;0;ON;<compat> 9EFD;;;;N;;;;;
+2FCD;KANGXI RADICAL TRIPOD;So;0;ON;<compat> 9F0E;;;;N;;;;;
+2FCE;KANGXI RADICAL DRUM;So;0;ON;<compat> 9F13;;;;N;;;;;
+2FCF;KANGXI RADICAL RAT;So;0;ON;<compat> 9F20;;;;N;;;;;
+2FD0;KANGXI RADICAL NOSE;So;0;ON;<compat> 9F3B;;;;N;;;;;
+2FD1;KANGXI RADICAL EVEN;So;0;ON;<compat> 9F4A;;;;N;;;;;
+2FD2;KANGXI RADICAL TOOTH;So;0;ON;<compat> 9F52;;;;N;;;;;
+2FD3;KANGXI RADICAL DRAGON;So;0;ON;<compat> 9F8D;;;;N;;;;;
+2FD4;KANGXI RADICAL TURTLE;So;0;ON;<compat> 9F9C;;;;N;;;;;
+2FD5;KANGXI RADICAL FLUTE;So;0;ON;<compat> 9FA0;;;;N;;;;;
+2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;;
+2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;;
+2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;;
+2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;;
+2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;;
+2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;;
+2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;;
+2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;;
+2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;;
+2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;;
+2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;;
+2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;;
+3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;;
+3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;;
+3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;;
+3003;DITTO MARK;Po;0;ON;;;;;N;;;;;
+3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;;
+3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;;
+3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;;
+3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;;
+3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;;
+300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;;
+300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;;
+300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;;
+300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;;
+300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;;
+300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;;
+3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;;
+3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;;
+3012;POSTAL MARK;So;0;ON;;;;;N;;;;;
+3013;GETA MARK;So;0;ON;;;;;N;;;;;
+3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;;
+3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;;
+3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;;
+3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;;
+3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;;
+3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;;
+301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;;
+301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;;
+301C;WAVE DASH;Pd;0;ON;;;;;N;;;;;
+301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;;
+301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;;
+3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;;
+3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;;
+3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;;
+3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;;
+3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;;
+3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;;
+3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;;
+3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;;
+3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;;
+302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;;
+302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;;
+302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;;
+302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;;
+302E;HANGUL SINGLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;;
+302F;HANGUL DOUBLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;;
+3030;WAVY DASH;Pd;0;ON;;;;;N;;;;;
+3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;;
+3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;;
+3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;;
+3036;CIRCLED POSTAL MARK;So;0;ON;<compat> 3012;;;;N;;;;;
+3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;;
+3038;HANGZHOU NUMERAL TEN;Nl;0;L;<compat> 5341;;;10;N;;;;;
+3039;HANGZHOU NUMERAL TWENTY;Nl;0;L;<compat> 5344;;;20;N;;;;;
+303A;HANGZHOU NUMERAL THIRTY;Nl;0;L;<compat> 5345;;;30;N;;;;;
+303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+303C;MASU MARK;Lo;0;L;;;;;N;;;;;
+303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;;
+303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;;
+303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;;
+3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;;
+3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;;
+3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;;
+3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;;
+3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;;
+304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;;
+304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;;
+304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;;
+304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;;
+304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;;
+3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;;
+3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;;
+3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;;
+3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;;
+3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;;
+3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;;
+3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;;
+3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;;
+3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;;
+3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;;
+305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;;
+305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;;
+305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;;
+305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;;
+305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;;
+305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;;
+3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;;
+3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;;
+3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;;
+3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;;
+3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;;
+3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;;
+3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;;
+3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;;
+3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;;
+306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;;
+306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;;
+306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;;
+306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;;
+306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;;
+306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;;
+3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;;
+3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;;
+3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;;
+3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;;
+3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;;
+3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;;
+3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;;
+3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;;
+3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;;
+3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;;
+307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;;
+307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;;
+307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;;
+307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;;
+307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;;
+307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;;
+3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;;
+3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;;
+3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;;
+3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;;
+3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;;
+3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;;
+3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;;
+308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;;
+308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;;
+308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;;
+308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;;
+308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;;
+3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;;
+3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;;
+3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;;
+3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;;
+3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;;
+3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;;
+3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;;
+309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;;
+309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON;<compat> 0020 3099;;;;N;;;;;
+309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON;<compat> 0020 309A;;;;N;;;;;
+309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;;
+309F;HIRAGANA DIGRAPH YORI;Lo;0;L;<vertical> 3088 308A;;;;N;;;;;
+30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;;
+30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;;
+30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;;
+30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;;
+30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;;
+30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;;
+30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;;
+30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;;
+30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;;
+30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;;
+30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;;
+30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;;
+30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;;
+30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;;
+30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;;
+30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;;
+30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;;
+30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;;
+30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;;
+30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;;
+30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;;
+30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;;
+30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;;
+30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;;
+30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;;
+30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;;
+30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;;
+30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;;
+30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;;
+30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;;
+30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;;
+30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;;
+30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;;
+30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;;
+30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;;
+30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;;
+30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;;
+30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;;
+30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;;
+30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;;
+30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;;
+30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;;
+30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;;
+30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;;
+30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;;
+30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;;
+30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;;
+30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;;
+30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;;
+30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;;
+30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;;
+30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;;
+30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;;
+30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;;
+30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;;
+30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;;
+30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;;
+30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;;
+30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;;
+30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;;
+30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;;
+30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;;
+30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;;
+30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;;
+30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;;
+30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;;
+30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;;
+30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;;
+30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;;
+30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;;
+30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;;
+30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;;
+30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;;
+30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;;
+30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;;
+30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;;
+30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;;
+30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;;
+30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;;
+30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;;
+30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;;
+30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;;
+30FF;KATAKANA DIGRAPH KOTO;Lo;0;L;<vertical> 30B3 30C8;;;;N;;;;;
+3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;;
+3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;;
+3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;;
+3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;;
+3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;;
+310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;;
+310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;;
+310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;;
+310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;;
+310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;;
+310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;;
+3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;;
+3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;;
+3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;;
+3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;;
+3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;;
+3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;;
+3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;;
+3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;;
+3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;;
+3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;;
+311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;;
+311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;;
+311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;;
+311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;;
+311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;;
+311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;;
+3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;;
+3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;;
+3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;;
+3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;;
+3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;;
+3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;;
+3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;;
+3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;;
+3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;;
+3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;;
+312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;;
+312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;;
+312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;;
+312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;;
+3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;;
+3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;;
+3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;;
+3134;HANGUL LETTER NIEUN;Lo;0;L;<compat> 1102;;;;N;;;;;
+3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<compat> 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;;
+3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<compat> 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;;
+3137;HANGUL LETTER TIKEUT;Lo;0;L;<compat> 1103;;;;N;HANGUL LETTER DIGEUD;;;;
+3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L;<compat> 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;;
+3139;HANGUL LETTER RIEUL;Lo;0;L;<compat> 1105;;;;N;HANGUL LETTER LIEUL;;;;
+313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<compat> 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;;
+313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<compat> 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;;
+313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<compat> 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;;
+313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L;<compat> 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;;
+313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<compat> 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;;
+313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<compat> 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;;
+3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<compat> 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;;
+3141;HANGUL LETTER MIEUM;Lo;0;L;<compat> 1106;;;;N;;;;;
+3142;HANGUL LETTER PIEUP;Lo;0;L;<compat> 1107;;;;N;HANGUL LETTER BIEUB;;;;
+3143;HANGUL LETTER SSANGPIEUP;Lo;0;L;<compat> 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;;
+3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L;<compat> 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;;
+3145;HANGUL LETTER SIOS;Lo;0;L;<compat> 1109;;;;N;;;;;
+3146;HANGUL LETTER SSANGSIOS;Lo;0;L;<compat> 110A;;;;N;HANGUL LETTER SSANG SIOS;;;;
+3147;HANGUL LETTER IEUNG;Lo;0;L;<compat> 110B;;;;N;;;;;
+3148;HANGUL LETTER CIEUC;Lo;0;L;<compat> 110C;;;;N;HANGUL LETTER JIEUJ;;;;
+3149;HANGUL LETTER SSANGCIEUC;Lo;0;L;<compat> 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;;
+314A;HANGUL LETTER CHIEUCH;Lo;0;L;<compat> 110E;;;;N;HANGUL LETTER CIEUC;;;;
+314B;HANGUL LETTER KHIEUKH;Lo;0;L;<compat> 110F;;;;N;HANGUL LETTER KIYEOK;;;;
+314C;HANGUL LETTER THIEUTH;Lo;0;L;<compat> 1110;;;;N;HANGUL LETTER TIEUT;;;;
+314D;HANGUL LETTER PHIEUPH;Lo;0;L;<compat> 1111;;;;N;HANGUL LETTER PIEUP;;;;
+314E;HANGUL LETTER HIEUH;Lo;0;L;<compat> 1112;;;;N;;;;;
+314F;HANGUL LETTER A;Lo;0;L;<compat> 1161;;;;N;;;;;
+3150;HANGUL LETTER AE;Lo;0;L;<compat> 1162;;;;N;;;;;
+3151;HANGUL LETTER YA;Lo;0;L;<compat> 1163;;;;N;;;;;
+3152;HANGUL LETTER YAE;Lo;0;L;<compat> 1164;;;;N;;;;;
+3153;HANGUL LETTER EO;Lo;0;L;<compat> 1165;;;;N;;;;;
+3154;HANGUL LETTER E;Lo;0;L;<compat> 1166;;;;N;;;;;
+3155;HANGUL LETTER YEO;Lo;0;L;<compat> 1167;;;;N;;;;;
+3156;HANGUL LETTER YE;Lo;0;L;<compat> 1168;;;;N;;;;;
+3157;HANGUL LETTER O;Lo;0;L;<compat> 1169;;;;N;;;;;
+3158;HANGUL LETTER WA;Lo;0;L;<compat> 116A;;;;N;;;;;
+3159;HANGUL LETTER WAE;Lo;0;L;<compat> 116B;;;;N;;;;;
+315A;HANGUL LETTER OE;Lo;0;L;<compat> 116C;;;;N;;;;;
+315B;HANGUL LETTER YO;Lo;0;L;<compat> 116D;;;;N;;;;;
+315C;HANGUL LETTER U;Lo;0;L;<compat> 116E;;;;N;;;;;
+315D;HANGUL LETTER WEO;Lo;0;L;<compat> 116F;;;;N;;;;;
+315E;HANGUL LETTER WE;Lo;0;L;<compat> 1170;;;;N;;;;;
+315F;HANGUL LETTER WI;Lo;0;L;<compat> 1171;;;;N;;;;;
+3160;HANGUL LETTER YU;Lo;0;L;<compat> 1172;;;;N;;;;;
+3161;HANGUL LETTER EU;Lo;0;L;<compat> 1173;;;;N;;;;;
+3162;HANGUL LETTER YI;Lo;0;L;<compat> 1174;;;;N;;;;;
+3163;HANGUL LETTER I;Lo;0;L;<compat> 1175;;;;N;;;;;
+3164;HANGUL FILLER;Lo;0;L;<compat> 1160;;;;N;HANGUL CAE OM;;;;
+3165;HANGUL LETTER SSANGNIEUN;Lo;0;L;<compat> 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;;
+3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L;<compat> 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;;
+3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L;<compat> 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;;
+3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L;<compat> 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;;
+3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L;<compat> 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;;
+316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L;<compat> 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;;
+316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L;<compat> 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;;
+316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L;<compat> 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;;
+316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L;<compat> 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;;
+316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L;<compat> 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;;
+316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L;<compat> 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;;
+3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L;<compat> 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;;
+3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L;<compat> 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;;
+3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L;<compat> 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;;
+3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L;<compat> 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;;
+3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L;<compat> 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;;
+3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L;<compat> 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;;
+3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L;<compat> 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;;
+3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L;<compat> 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;;
+3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L;<compat> 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;;
+3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L;<compat> 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;;
+317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L;<compat> 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;;
+317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L;<compat> 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;;
+317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L;<compat> 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;;
+317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L;<compat> 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;;
+317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L;<compat> 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;;
+317F;HANGUL LETTER PANSIOS;Lo;0;L;<compat> 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;;
+3180;HANGUL LETTER SSANGIEUNG;Lo;0;L;<compat> 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;;
+3181;HANGUL LETTER YESIEUNG;Lo;0;L;<compat> 114C;;;;N;HANGUL LETTER NGIEUNG;;;;
+3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L;<compat> 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;;
+3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L;<compat> 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;;
+3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L;<compat> 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;;
+3185;HANGUL LETTER SSANGHIEUH;Lo;0;L;<compat> 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;;
+3186;HANGUL LETTER YEORINHIEUH;Lo;0;L;<compat> 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;;
+3187;HANGUL LETTER YO-YA;Lo;0;L;<compat> 1184;;;;N;HANGUL LETTER YOYA;;;;
+3188;HANGUL LETTER YO-YAE;Lo;0;L;<compat> 1185;;;;N;HANGUL LETTER YOYAE;;;;
+3189;HANGUL LETTER YO-I;Lo;0;L;<compat> 1188;;;;N;HANGUL LETTER YOI;;;;
+318A;HANGUL LETTER YU-YEO;Lo;0;L;<compat> 1191;;;;N;HANGUL LETTER YUYEO;;;;
+318B;HANGUL LETTER YU-YE;Lo;0;L;<compat> 1192;;;;N;HANGUL LETTER YUYE;;;;
+318C;HANGUL LETTER YU-I;Lo;0;L;<compat> 1194;;;;N;HANGUL LETTER YUI;;;;
+318D;HANGUL LETTER ARAEA;Lo;0;L;<compat> 119E;;;;N;HANGUL LETTER ALAE A;;;;
+318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;;
+3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;Kanbun Tateten;;;
+3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;Kaeriten;;;
+3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;1;N;KAERITEN ITI;Kaeriten;;;
+3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;Kaeriten;;;
+3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;Kaeriten;;;
+3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;N;KAERITEN SI;Kaeriten;;;
+3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;Kaeriten;;;
+3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;Kaeriten;;;
+3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;Kaeriten;;;
+3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L;<super> 7532;;;;N;KAERITEN KOU;Kaeriten;;;
+319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L;<super> 4E59;;;;N;KAERITEN OTU;Kaeriten;;;
+319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L;<super> 4E19;;;;N;KAERITEN HEI;Kaeriten;;;
+319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L;<super> 4E01;;;;N;KAERITEN TEI;Kaeriten;;;
+319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L;<super> 5929;;;;N;KAERITEN TEN;Kaeriten;;;
+319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L;<super> 5730;;;;N;KAERITEN TI;Kaeriten;;;
+319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L;<super> 4EBA;;;;N;KAERITEN ZIN;Kaeriten;;;
+31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;;
+31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;;
+31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;;
+31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;;
+31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;;
+31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;;
+31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;;
+31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;;
+31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;;
+31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;;
+31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;;
+31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;;
+31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;;
+31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;;
+31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;;
+31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;;
+31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;;
+31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;;
+31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;;
+31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;;
+31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;;
+31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;;
+31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;;
+31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;;
+31C0;CJK STROKE T;So;0;ON;;;;;N;;;;;
+31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;;
+31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;;
+31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;;
+31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;;
+31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;;
+31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;;
+31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;;
+31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;;
+31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;;
+31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;;
+31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;;
+31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;;
+31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;;
+31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;;
+31CF;CJK STROKE N;So;0;ON;;;;;N;;;;;
+31D0;CJK STROKE H;So;0;ON;;;;;N;;;;;
+31D1;CJK STROKE S;So;0;ON;;;;;N;;;;;
+31D2;CJK STROKE P;So;0;ON;;;;;N;;;;;
+31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;;
+31D4;CJK STROKE D;So;0;ON;;;;;N;;;;;
+31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;;
+31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;;
+31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;;
+31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;;
+31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;;
+31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;;
+31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;;
+31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;;
+31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;;
+31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;;
+31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;;
+31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;;
+31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;;
+31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;;
+31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;;
+31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;;
+31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;;
+31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;;
+31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;;
+31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;;
+31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;;
+31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;;
+31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;;
+31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;;
+31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;;
+31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;;
+31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;;
+31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;;
+31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;;
+31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;;
+31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;;
+3200;PARENTHESIZED HANGUL KIYEOK;So;0;L;<compat> 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;;
+3201;PARENTHESIZED HANGUL NIEUN;So;0;L;<compat> 0028 1102 0029;;;;N;;;;;
+3202;PARENTHESIZED HANGUL TIKEUT;So;0;L;<compat> 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;;
+3203;PARENTHESIZED HANGUL RIEUL;So;0;L;<compat> 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;;
+3204;PARENTHESIZED HANGUL MIEUM;So;0;L;<compat> 0028 1106 0029;;;;N;;;;;
+3205;PARENTHESIZED HANGUL PIEUP;So;0;L;<compat> 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;;
+3206;PARENTHESIZED HANGUL SIOS;So;0;L;<compat> 0028 1109 0029;;;;N;;;;;
+3207;PARENTHESIZED HANGUL IEUNG;So;0;L;<compat> 0028 110B 0029;;;;N;;;;;
+3208;PARENTHESIZED HANGUL CIEUC;So;0;L;<compat> 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;;
+3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L;<compat> 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;;
+320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L;<compat> 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;;
+320B;PARENTHESIZED HANGUL THIEUTH;So;0;L;<compat> 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;;
+320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L;<compat> 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;;
+320D;PARENTHESIZED HANGUL HIEUH;So;0;L;<compat> 0028 1112 0029;;;;N;;;;;
+320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L;<compat> 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;;
+320F;PARENTHESIZED HANGUL NIEUN A;So;0;L;<compat> 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;;
+3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L;<compat> 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;;
+3211;PARENTHESIZED HANGUL RIEUL A;So;0;L;<compat> 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;;
+3212;PARENTHESIZED HANGUL MIEUM A;So;0;L;<compat> 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;;
+3213;PARENTHESIZED HANGUL PIEUP A;So;0;L;<compat> 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;;
+3214;PARENTHESIZED HANGUL SIOS A;So;0;L;<compat> 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;;
+3215;PARENTHESIZED HANGUL IEUNG A;So;0;L;<compat> 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;;
+3216;PARENTHESIZED HANGUL CIEUC A;So;0;L;<compat> 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;;
+3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L;<compat> 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;;
+3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L;<compat> 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;;
+3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L;<compat> 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;;
+321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;;
+321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;;
+321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;;
+321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON;<compat> 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;;
+321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON;<compat> 0028 110B 1169 1112 116E 0029;;;;N;;;;;
+3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;;
+3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;;
+3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;;
+3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;;
+3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;;
+3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;;
+3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;;
+3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;;
+3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;;
+3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;N;;;;;
+322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;;
+322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;;
+322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;;
+322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L;<compat> 0028 6728 0029;;;;N;;;;;
+322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L;<compat> 0028 91D1 0029;;;;N;;;;;
+322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L;<compat> 0028 571F 0029;;;;N;;;;;
+3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L;<compat> 0028 65E5 0029;;;;N;;;;;
+3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L;<compat> 0028 682A 0029;;;;N;;;;;
+3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L;<compat> 0028 6709 0029;;;;N;;;;;
+3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L;<compat> 0028 793E 0029;;;;N;;;;;
+3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L;<compat> 0028 540D 0029;;;;N;;;;;
+3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L;<compat> 0028 7279 0029;;;;N;;;;;
+3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L;<compat> 0028 8CA1 0029;;;;N;;;;;
+3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L;<compat> 0028 795D 0029;;;;N;;;;;
+3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L;<compat> 0028 52B4 0029;;;;N;;;;;
+3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L;<compat> 0028 4EE3 0029;;;;N;;;;;
+323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L;<compat> 0028 547C 0029;;;;N;;;;;
+323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L;<compat> 0028 5B66 0029;;;;N;;;;;
+323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L;<compat> 0028 76E3 0029;;;;N;;;;;
+323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L;<compat> 0028 4F01 0029;;;;N;;;;;
+323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L;<compat> 0028 8CC7 0029;;;;N;;;;;
+323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L;<compat> 0028 5354 0029;;;;N;;;;;
+3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L;<compat> 0028 796D 0029;;;;N;;;;;
+3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;;
+3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;;
+3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;;
+3250;PARTNERSHIP SIGN;So;0;ON;<square> 0050 0054 0045;;;;N;;;;;
+3251;CIRCLED NUMBER TWENTY ONE;No;0;ON;<circle> 0032 0031;;;21;N;;;;;
+3252;CIRCLED NUMBER TWENTY TWO;No;0;ON;<circle> 0032 0032;;;22;N;;;;;
+3253;CIRCLED NUMBER TWENTY THREE;No;0;ON;<circle> 0032 0033;;;23;N;;;;;
+3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON;<circle> 0032 0034;;;24;N;;;;;
+3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON;<circle> 0032 0035;;;25;N;;;;;
+3256;CIRCLED NUMBER TWENTY SIX;No;0;ON;<circle> 0032 0036;;;26;N;;;;;
+3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON;<circle> 0032 0037;;;27;N;;;;;
+3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON;<circle> 0032 0038;;;28;N;;;;;
+3259;CIRCLED NUMBER TWENTY NINE;No;0;ON;<circle> 0032 0039;;;29;N;;;;;
+325A;CIRCLED NUMBER THIRTY;No;0;ON;<circle> 0033 0030;;;30;N;;;;;
+325B;CIRCLED NUMBER THIRTY ONE;No;0;ON;<circle> 0033 0031;;;31;N;;;;;
+325C;CIRCLED NUMBER THIRTY TWO;No;0;ON;<circle> 0033 0032;;;32;N;;;;;
+325D;CIRCLED NUMBER THIRTY THREE;No;0;ON;<circle> 0033 0033;;;33;N;;;;;
+325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON;<circle> 0033 0034;;;34;N;;;;;
+325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON;<circle> 0033 0035;;;35;N;;;;;
+3260;CIRCLED HANGUL KIYEOK;So;0;L;<circle> 1100;;;;N;CIRCLED HANGUL GIYEOG;;;;
+3261;CIRCLED HANGUL NIEUN;So;0;L;<circle> 1102;;;;N;;;;;
+3262;CIRCLED HANGUL TIKEUT;So;0;L;<circle> 1103;;;;N;CIRCLED HANGUL DIGEUD;;;;
+3263;CIRCLED HANGUL RIEUL;So;0;L;<circle> 1105;;;;N;CIRCLED HANGUL LIEUL;;;;
+3264;CIRCLED HANGUL MIEUM;So;0;L;<circle> 1106;;;;N;;;;;
+3265;CIRCLED HANGUL PIEUP;So;0;L;<circle> 1107;;;;N;CIRCLED HANGUL BIEUB;;;;
+3266;CIRCLED HANGUL SIOS;So;0;L;<circle> 1109;;;;N;;;;;
+3267;CIRCLED HANGUL IEUNG;So;0;L;<circle> 110B;;;;N;;;;;
+3268;CIRCLED HANGUL CIEUC;So;0;L;<circle> 110C;;;;N;CIRCLED HANGUL JIEUJ;;;;
+3269;CIRCLED HANGUL CHIEUCH;So;0;L;<circle> 110E;;;;N;CIRCLED HANGUL CIEUC;;;;
+326A;CIRCLED HANGUL KHIEUKH;So;0;L;<circle> 110F;;;;N;CIRCLED HANGUL KIYEOK;;;;
+326B;CIRCLED HANGUL THIEUTH;So;0;L;<circle> 1110;;;;N;CIRCLED HANGUL TIEUT;;;;
+326C;CIRCLED HANGUL PHIEUPH;So;0;L;<circle> 1111;;;;N;CIRCLED HANGUL PIEUP;;;;
+326D;CIRCLED HANGUL HIEUH;So;0;L;<circle> 1112;;;;N;;;;;
+326E;CIRCLED HANGUL KIYEOK A;So;0;L;<circle> 1100 1161;;;;N;CIRCLED HANGUL GA;;;;
+326F;CIRCLED HANGUL NIEUN A;So;0;L;<circle> 1102 1161;;;;N;CIRCLED HANGUL NA;;;;
+3270;CIRCLED HANGUL TIKEUT A;So;0;L;<circle> 1103 1161;;;;N;CIRCLED HANGUL DA;;;;
+3271;CIRCLED HANGUL RIEUL A;So;0;L;<circle> 1105 1161;;;;N;CIRCLED HANGUL LA;;;;
+3272;CIRCLED HANGUL MIEUM A;So;0;L;<circle> 1106 1161;;;;N;CIRCLED HANGUL MA;;;;
+3273;CIRCLED HANGUL PIEUP A;So;0;L;<circle> 1107 1161;;;;N;CIRCLED HANGUL BA;;;;
+3274;CIRCLED HANGUL SIOS A;So;0;L;<circle> 1109 1161;;;;N;CIRCLED HANGUL SA;;;;
+3275;CIRCLED HANGUL IEUNG A;So;0;L;<circle> 110B 1161;;;;N;CIRCLED HANGUL A;;;;
+3276;CIRCLED HANGUL CIEUC A;So;0;L;<circle> 110C 1161;;;;N;CIRCLED HANGUL JA;;;;
+3277;CIRCLED HANGUL CHIEUCH A;So;0;L;<circle> 110E 1161;;;;N;CIRCLED HANGUL CA;;;;
+3278;CIRCLED HANGUL KHIEUKH A;So;0;L;<circle> 110F 1161;;;;N;CIRCLED HANGUL KA;;;;
+3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;;
+327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;;
+327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;;
+327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;;
+327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;;
+327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;;
+327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;;
+3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;;
+3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;;
+3282;CIRCLED IDEOGRAPH THREE;No;0;L;<circle> 4E09;;;3;N;;;;;
+3283;CIRCLED IDEOGRAPH FOUR;No;0;L;<circle> 56DB;;;4;N;;;;;
+3284;CIRCLED IDEOGRAPH FIVE;No;0;L;<circle> 4E94;;;5;N;;;;;
+3285;CIRCLED IDEOGRAPH SIX;No;0;L;<circle> 516D;;;6;N;;;;;
+3286;CIRCLED IDEOGRAPH SEVEN;No;0;L;<circle> 4E03;;;7;N;;;;;
+3287;CIRCLED IDEOGRAPH EIGHT;No;0;L;<circle> 516B;;;8;N;;;;;
+3288;CIRCLED IDEOGRAPH NINE;No;0;L;<circle> 4E5D;;;9;N;;;;;
+3289;CIRCLED IDEOGRAPH TEN;No;0;L;<circle> 5341;;;10;N;;;;;
+328A;CIRCLED IDEOGRAPH MOON;So;0;L;<circle> 6708;;;;N;;;;;
+328B;CIRCLED IDEOGRAPH FIRE;So;0;L;<circle> 706B;;;;N;;;;;
+328C;CIRCLED IDEOGRAPH WATER;So;0;L;<circle> 6C34;;;;N;;;;;
+328D;CIRCLED IDEOGRAPH WOOD;So;0;L;<circle> 6728;;;;N;;;;;
+328E;CIRCLED IDEOGRAPH METAL;So;0;L;<circle> 91D1;;;;N;;;;;
+328F;CIRCLED IDEOGRAPH EARTH;So;0;L;<circle> 571F;;;;N;;;;;
+3290;CIRCLED IDEOGRAPH SUN;So;0;L;<circle> 65E5;;;;N;;;;;
+3291;CIRCLED IDEOGRAPH STOCK;So;0;L;<circle> 682A;;;;N;;;;;
+3292;CIRCLED IDEOGRAPH HAVE;So;0;L;<circle> 6709;;;;N;;;;;
+3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L;<circle> 793E;;;;N;;;;;
+3294;CIRCLED IDEOGRAPH NAME;So;0;L;<circle> 540D;;;;N;;;;;
+3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L;<circle> 7279;;;;N;;;;;
+3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L;<circle> 8CA1;;;;N;;;;;
+3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L;<circle> 795D;;;;N;;;;;
+3298;CIRCLED IDEOGRAPH LABOR;So;0;L;<circle> 52B4;;;;N;;;;;
+3299;CIRCLED IDEOGRAPH SECRET;So;0;L;<circle> 79D8;;;;N;;;;;
+329A;CIRCLED IDEOGRAPH MALE;So;0;L;<circle> 7537;;;;N;;;;;
+329B;CIRCLED IDEOGRAPH FEMALE;So;0;L;<circle> 5973;;;;N;;;;;
+329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L;<circle> 9069;;;;N;;;;;
+329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L;<circle> 512A;;;;N;;;;;
+329E;CIRCLED IDEOGRAPH PRINT;So;0;L;<circle> 5370;;;;N;;;;;
+329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L;<circle> 6CE8;;;;N;;;;;
+32A0;CIRCLED IDEOGRAPH ITEM;So;0;L;<circle> 9805;;;;N;;;;;
+32A1;CIRCLED IDEOGRAPH REST;So;0;L;<circle> 4F11;;;;N;;;;;
+32A2;CIRCLED IDEOGRAPH COPY;So;0;L;<circle> 5199;;;;N;;;;;
+32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L;<circle> 6B63;;;;N;;;;;
+32A4;CIRCLED IDEOGRAPH HIGH;So;0;L;<circle> 4E0A;;;;N;;;;;
+32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L;<circle> 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;;
+32A6;CIRCLED IDEOGRAPH LOW;So;0;L;<circle> 4E0B;;;;N;;;;;
+32A7;CIRCLED IDEOGRAPH LEFT;So;0;L;<circle> 5DE6;;;;N;;;;;
+32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L;<circle> 53F3;;;;N;;;;;
+32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L;<circle> 533B;;;;N;;;;;
+32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L;<circle> 5B97;;;;N;;;;;
+32AB;CIRCLED IDEOGRAPH STUDY;So;0;L;<circle> 5B66;;;;N;;;;;
+32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L;<circle> 76E3;;;;N;;;;;
+32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L;<circle> 4F01;;;;N;;;;;
+32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L;<circle> 8CC7;;;;N;;;;;
+32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L;<circle> 5354;;;;N;;;;;
+32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L;<circle> 591C;;;;N;;;;;
+32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON;<circle> 0033 0036;;;36;N;;;;;
+32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON;<circle> 0033 0037;;;37;N;;;;;
+32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON;<circle> 0033 0038;;;38;N;;;;;
+32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON;<circle> 0033 0039;;;39;N;;;;;
+32B5;CIRCLED NUMBER FORTY;No;0;ON;<circle> 0034 0030;;;40;N;;;;;
+32B6;CIRCLED NUMBER FORTY ONE;No;0;ON;<circle> 0034 0031;;;41;N;;;;;
+32B7;CIRCLED NUMBER FORTY TWO;No;0;ON;<circle> 0034 0032;;;42;N;;;;;
+32B8;CIRCLED NUMBER FORTY THREE;No;0;ON;<circle> 0034 0033;;;43;N;;;;;
+32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON;<circle> 0034 0034;;;44;N;;;;;
+32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON;<circle> 0034 0035;;;45;N;;;;;
+32BB;CIRCLED NUMBER FORTY SIX;No;0;ON;<circle> 0034 0036;;;46;N;;;;;
+32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON;<circle> 0034 0037;;;47;N;;;;;
+32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON;<circle> 0034 0038;;;48;N;;;;;
+32BE;CIRCLED NUMBER FORTY NINE;No;0;ON;<circle> 0034 0039;;;49;N;;;;;
+32BF;CIRCLED NUMBER FIFTY;No;0;ON;<circle> 0035 0030;;;50;N;;;;;
+32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L;<compat> 0031 6708;;;;N;;;;;
+32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L;<compat> 0032 6708;;;;N;;;;;
+32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L;<compat> 0033 6708;;;;N;;;;;
+32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L;<compat> 0034 6708;;;;N;;;;;
+32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L;<compat> 0035 6708;;;;N;;;;;
+32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L;<compat> 0036 6708;;;;N;;;;;
+32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L;<compat> 0037 6708;;;;N;;;;;
+32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L;<compat> 0038 6708;;;;N;;;;;
+32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L;<compat> 0039 6708;;;;N;;;;;
+32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;;
+32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;;
+32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;;
+32CC;SQUARE HG;So;0;ON;<square> 0048 0067;;;;N;;;;;
+32CD;SQUARE ERG;So;0;ON;<square> 0065 0072 0067;;;;N;;;;;
+32CE;SQUARE EV;So;0;ON;<square> 0065 0056;;;;N;;;;;
+32CF;LIMITED LIABILITY SIGN;So;0;ON;<square> 004C 0054 0044;;;;N;;;;;
+32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;;
+32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;;
+32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;;
+32D3;CIRCLED KATAKANA E;So;0;L;<circle> 30A8;;;;N;;;;;
+32D4;CIRCLED KATAKANA O;So;0;L;<circle> 30AA;;;;N;;;;;
+32D5;CIRCLED KATAKANA KA;So;0;L;<circle> 30AB;;;;N;;;;;
+32D6;CIRCLED KATAKANA KI;So;0;L;<circle> 30AD;;;;N;;;;;
+32D7;CIRCLED KATAKANA KU;So;0;L;<circle> 30AF;;;;N;;;;;
+32D8;CIRCLED KATAKANA KE;So;0;L;<circle> 30B1;;;;N;;;;;
+32D9;CIRCLED KATAKANA KO;So;0;L;<circle> 30B3;;;;N;;;;;
+32DA;CIRCLED KATAKANA SA;So;0;L;<circle> 30B5;;;;N;;;;;
+32DB;CIRCLED KATAKANA SI;So;0;L;<circle> 30B7;;;;N;;;;;
+32DC;CIRCLED KATAKANA SU;So;0;L;<circle> 30B9;;;;N;;;;;
+32DD;CIRCLED KATAKANA SE;So;0;L;<circle> 30BB;;;;N;;;;;
+32DE;CIRCLED KATAKANA SO;So;0;L;<circle> 30BD;;;;N;;;;;
+32DF;CIRCLED KATAKANA TA;So;0;L;<circle> 30BF;;;;N;;;;;
+32E0;CIRCLED KATAKANA TI;So;0;L;<circle> 30C1;;;;N;;;;;
+32E1;CIRCLED KATAKANA TU;So;0;L;<circle> 30C4;;;;N;;;;;
+32E2;CIRCLED KATAKANA TE;So;0;L;<circle> 30C6;;;;N;;;;;
+32E3;CIRCLED KATAKANA TO;So;0;L;<circle> 30C8;;;;N;;;;;
+32E4;CIRCLED KATAKANA NA;So;0;L;<circle> 30CA;;;;N;;;;;
+32E5;CIRCLED KATAKANA NI;So;0;L;<circle> 30CB;;;;N;;;;;
+32E6;CIRCLED KATAKANA NU;So;0;L;<circle> 30CC;;;;N;;;;;
+32E7;CIRCLED KATAKANA NE;So;0;L;<circle> 30CD;;;;N;;;;;
+32E8;CIRCLED KATAKANA NO;So;0;L;<circle> 30CE;;;;N;;;;;
+32E9;CIRCLED KATAKANA HA;So;0;L;<circle> 30CF;;;;N;;;;;
+32EA;CIRCLED KATAKANA HI;So;0;L;<circle> 30D2;;;;N;;;;;
+32EB;CIRCLED KATAKANA HU;So;0;L;<circle> 30D5;;;;N;;;;;
+32EC;CIRCLED KATAKANA HE;So;0;L;<circle> 30D8;;;;N;;;;;
+32ED;CIRCLED KATAKANA HO;So;0;L;<circle> 30DB;;;;N;;;;;
+32EE;CIRCLED KATAKANA MA;So;0;L;<circle> 30DE;;;;N;;;;;
+32EF;CIRCLED KATAKANA MI;So;0;L;<circle> 30DF;;;;N;;;;;
+32F0;CIRCLED KATAKANA MU;So;0;L;<circle> 30E0;;;;N;;;;;
+32F1;CIRCLED KATAKANA ME;So;0;L;<circle> 30E1;;;;N;;;;;
+32F2;CIRCLED KATAKANA MO;So;0;L;<circle> 30E2;;;;N;;;;;
+32F3;CIRCLED KATAKANA YA;So;0;L;<circle> 30E4;;;;N;;;;;
+32F4;CIRCLED KATAKANA YU;So;0;L;<circle> 30E6;;;;N;;;;;
+32F5;CIRCLED KATAKANA YO;So;0;L;<circle> 30E8;;;;N;;;;;
+32F6;CIRCLED KATAKANA RA;So;0;L;<circle> 30E9;;;;N;;;;;
+32F7;CIRCLED KATAKANA RI;So;0;L;<circle> 30EA;;;;N;;;;;
+32F8;CIRCLED KATAKANA RU;So;0;L;<circle> 30EB;;;;N;;;;;
+32F9;CIRCLED KATAKANA RE;So;0;L;<circle> 30EC;;;;N;;;;;
+32FA;CIRCLED KATAKANA RO;So;0;L;<circle> 30ED;;;;N;;;;;
+32FB;CIRCLED KATAKANA WA;So;0;L;<circle> 30EF;;;;N;;;;;
+32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;;
+32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;;
+32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;;
+3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;;
+3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;;
+3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;;
+3303;SQUARE AARU;So;0;L;<square> 30A2 30FC 30EB;;;;N;SQUARED AARU;;;;
+3304;SQUARE ININGU;So;0;L;<square> 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;;
+3305;SQUARE INTI;So;0;L;<square> 30A4 30F3 30C1;;;;N;SQUARED INTI;;;;
+3306;SQUARE UON;So;0;L;<square> 30A6 30A9 30F3;;;;N;SQUARED UON;;;;
+3307;SQUARE ESUKUUDO;So;0;L;<square> 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;;
+3308;SQUARE EEKAA;So;0;L;<square> 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;;
+3309;SQUARE ONSU;So;0;L;<square> 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;;
+330A;SQUARE OOMU;So;0;L;<square> 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;;
+330B;SQUARE KAIRI;So;0;L;<square> 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;;
+330C;SQUARE KARATTO;So;0;L;<square> 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;;
+330D;SQUARE KARORII;So;0;L;<square> 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;;
+330E;SQUARE GARON;So;0;L;<square> 30AC 30ED 30F3;;;;N;SQUARED GARON;;;;
+330F;SQUARE GANMA;So;0;L;<square> 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;;
+3310;SQUARE GIGA;So;0;L;<square> 30AE 30AC;;;;N;SQUARED GIGA;;;;
+3311;SQUARE GINII;So;0;L;<square> 30AE 30CB 30FC;;;;N;SQUARED GINII;;;;
+3312;SQUARE KYURII;So;0;L;<square> 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;;
+3313;SQUARE GIRUDAA;So;0;L;<square> 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;;
+3314;SQUARE KIRO;So;0;L;<square> 30AD 30ED;;;;N;SQUARED KIRO;;;;
+3315;SQUARE KIROGURAMU;So;0;L;<square> 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;;
+3316;SQUARE KIROMEETORU;So;0;L;<square> 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;;
+3317;SQUARE KIROWATTO;So;0;L;<square> 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;;
+3318;SQUARE GURAMU;So;0;L;<square> 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;;
+3319;SQUARE GURAMUTON;So;0;L;<square> 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;;
+331A;SQUARE KURUZEIRO;So;0;L;<square> 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;;
+331B;SQUARE KUROONE;So;0;L;<square> 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;;
+331C;SQUARE KEESU;So;0;L;<square> 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;;
+331D;SQUARE KORUNA;So;0;L;<square> 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;;
+331E;SQUARE KOOPO;So;0;L;<square> 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;;
+331F;SQUARE SAIKURU;So;0;L;<square> 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;;
+3320;SQUARE SANTIIMU;So;0;L;<square> 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;;
+3321;SQUARE SIRINGU;So;0;L;<square> 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;;
+3322;SQUARE SENTI;So;0;L;<square> 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;;
+3323;SQUARE SENTO;So;0;L;<square> 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;;
+3324;SQUARE DAASU;So;0;L;<square> 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;;
+3325;SQUARE DESI;So;0;L;<square> 30C7 30B7;;;;N;SQUARED DESI;;;;
+3326;SQUARE DORU;So;0;L;<square> 30C9 30EB;;;;N;SQUARED DORU;;;;
+3327;SQUARE TON;So;0;L;<square> 30C8 30F3;;;;N;SQUARED TON;;;;
+3328;SQUARE NANO;So;0;L;<square> 30CA 30CE;;;;N;SQUARED NANO;;;;
+3329;SQUARE NOTTO;So;0;L;<square> 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;;
+332A;SQUARE HAITU;So;0;L;<square> 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;;
+332B;SQUARE PAASENTO;So;0;L;<square> 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;;
+332C;SQUARE PAATU;So;0;L;<square> 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;;
+332D;SQUARE BAARERU;So;0;L;<square> 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;;
+332E;SQUARE PIASUTORU;So;0;L;<square> 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;;
+332F;SQUARE PIKURU;So;0;L;<square> 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;;
+3330;SQUARE PIKO;So;0;L;<square> 30D4 30B3;;;;N;SQUARED PIKO;;;;
+3331;SQUARE BIRU;So;0;L;<square> 30D3 30EB;;;;N;SQUARED BIRU;;;;
+3332;SQUARE HUARADDO;So;0;L;<square> 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;;
+3333;SQUARE HUIITO;So;0;L;<square> 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;;
+3334;SQUARE BUSSYERU;So;0;L;<square> 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;;
+3335;SQUARE HURAN;So;0;L;<square> 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;;
+3336;SQUARE HEKUTAARU;So;0;L;<square> 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;;
+3337;SQUARE PESO;So;0;L;<square> 30DA 30BD;;;;N;SQUARED PESO;;;;
+3338;SQUARE PENIHI;So;0;L;<square> 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;;
+3339;SQUARE HERUTU;So;0;L;<square> 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;;
+333A;SQUARE PENSU;So;0;L;<square> 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;;
+333B;SQUARE PEEZI;So;0;L;<square> 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;;
+333C;SQUARE BEETA;So;0;L;<square> 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;;
+333D;SQUARE POINTO;So;0;L;<square> 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;;
+333E;SQUARE BORUTO;So;0;L;<square> 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;;
+333F;SQUARE HON;So;0;L;<square> 30DB 30F3;;;;N;SQUARED HON;;;;
+3340;SQUARE PONDO;So;0;L;<square> 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;;
+3341;SQUARE HOORU;So;0;L;<square> 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;;
+3342;SQUARE HOON;So;0;L;<square> 30DB 30FC 30F3;;;;N;SQUARED HOON;;;;
+3343;SQUARE MAIKURO;So;0;L;<square> 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;;
+3344;SQUARE MAIRU;So;0;L;<square> 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;;
+3345;SQUARE MAHHA;So;0;L;<square> 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;;
+3346;SQUARE MARUKU;So;0;L;<square> 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;;
+3347;SQUARE MANSYON;So;0;L;<square> 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;;
+3348;SQUARE MIKURON;So;0;L;<square> 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;;
+3349;SQUARE MIRI;So;0;L;<square> 30DF 30EA;;;;N;SQUARED MIRI;;;;
+334A;SQUARE MIRIBAARU;So;0;L;<square> 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;;
+334B;SQUARE MEGA;So;0;L;<square> 30E1 30AC;;;;N;SQUARED MEGA;;;;
+334C;SQUARE MEGATON;So;0;L;<square> 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;;
+334D;SQUARE MEETORU;So;0;L;<square> 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;;
+334E;SQUARE YAADO;So;0;L;<square> 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;;
+334F;SQUARE YAARU;So;0;L;<square> 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;;
+3350;SQUARE YUAN;So;0;L;<square> 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;;
+3351;SQUARE RITTORU;So;0;L;<square> 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;;
+3352;SQUARE RIRA;So;0;L;<square> 30EA 30E9;;;;N;SQUARED RIRA;;;;
+3353;SQUARE RUPII;So;0;L;<square> 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;;
+3354;SQUARE RUUBURU;So;0;L;<square> 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;;
+3355;SQUARE REMU;So;0;L;<square> 30EC 30E0;;;;N;SQUARED REMU;;;;
+3356;SQUARE RENTOGEN;So;0;L;<square> 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;;
+3357;SQUARE WATTO;So;0;L;<square> 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;;
+3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L;<compat> 0030 70B9;;;;N;;;;;
+3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L;<compat> 0031 70B9;;;;N;;;;;
+335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L;<compat> 0032 70B9;;;;N;;;;;
+335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L;<compat> 0033 70B9;;;;N;;;;;
+335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L;<compat> 0034 70B9;;;;N;;;;;
+335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L;<compat> 0035 70B9;;;;N;;;;;
+335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L;<compat> 0036 70B9;;;;N;;;;;
+335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L;<compat> 0037 70B9;;;;N;;;;;
+3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L;<compat> 0038 70B9;;;;N;;;;;
+3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L;<compat> 0039 70B9;;;;N;;;;;
+3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L;<compat> 0031 0030 70B9;;;;N;;;;;
+3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L;<compat> 0031 0031 70B9;;;;N;;;;;
+3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L;<compat> 0031 0032 70B9;;;;N;;;;;
+3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L;<compat> 0031 0033 70B9;;;;N;;;;;
+3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L;<compat> 0031 0034 70B9;;;;N;;;;;
+3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L;<compat> 0031 0035 70B9;;;;N;;;;;
+3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L;<compat> 0031 0036 70B9;;;;N;;;;;
+3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L;<compat> 0031 0037 70B9;;;;N;;;;;
+336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L;<compat> 0031 0038 70B9;;;;N;;;;;
+336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L;<compat> 0031 0039 70B9;;;;N;;;;;
+336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L;<compat> 0032 0030 70B9;;;;N;;;;;
+336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L;<compat> 0032 0031 70B9;;;;N;;;;;
+336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L;<compat> 0032 0032 70B9;;;;N;;;;;
+336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L;<compat> 0032 0033 70B9;;;;N;;;;;
+3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L;<compat> 0032 0034 70B9;;;;N;;;;;
+3371;SQUARE HPA;So;0;L;<square> 0068 0050 0061;;;;N;;;;;
+3372;SQUARE DA;So;0;L;<square> 0064 0061;;;;N;;;;;
+3373;SQUARE AU;So;0;L;<square> 0041 0055;;;;N;;;;;
+3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;;
+3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;;
+3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;;
+3377;SQUARE DM;So;0;ON;<square> 0064 006D;;;;N;;;;;
+3378;SQUARE DM SQUARED;So;0;ON;<square> 0064 006D 00B2;;;;N;;;;;
+3379;SQUARE DM CUBED;So;0;ON;<square> 0064 006D 00B3;;;;N;;;;;
+337A;SQUARE IU;So;0;ON;<square> 0049 0055;;;;N;;;;;
+337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;;
+337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;;
+337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;;
+337E;SQUARE ERA NAME MEIZI;So;0;L;<square> 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;;
+337F;SQUARE CORPORATION;So;0;L;<square> 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;;
+3380;SQUARE PA AMPS;So;0;L;<square> 0070 0041;;;;N;SQUARED PA AMPS;;;;
+3381;SQUARE NA;So;0;L;<square> 006E 0041;;;;N;SQUARED NA;;;;
+3382;SQUARE MU A;So;0;L;<square> 03BC 0041;;;;N;SQUARED MU A;;;;
+3383;SQUARE MA;So;0;L;<square> 006D 0041;;;;N;SQUARED MA;;;;
+3384;SQUARE KA;So;0;L;<square> 006B 0041;;;;N;SQUARED KA;;;;
+3385;SQUARE KB;So;0;L;<square> 004B 0042;;;;N;SQUARED KB;;;;
+3386;SQUARE MB;So;0;L;<square> 004D 0042;;;;N;SQUARED MB;;;;
+3387;SQUARE GB;So;0;L;<square> 0047 0042;;;;N;SQUARED GB;;;;
+3388;SQUARE CAL;So;0;L;<square> 0063 0061 006C;;;;N;SQUARED CAL;;;;
+3389;SQUARE KCAL;So;0;L;<square> 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;;
+338A;SQUARE PF;So;0;L;<square> 0070 0046;;;;N;SQUARED PF;;;;
+338B;SQUARE NF;So;0;L;<square> 006E 0046;;;;N;SQUARED NF;;;;
+338C;SQUARE MU F;So;0;L;<square> 03BC 0046;;;;N;SQUARED MU F;;;;
+338D;SQUARE MU G;So;0;L;<square> 03BC 0067;;;;N;SQUARED MU G;;;;
+338E;SQUARE MG;So;0;L;<square> 006D 0067;;;;N;SQUARED MG;;;;
+338F;SQUARE KG;So;0;L;<square> 006B 0067;;;;N;SQUARED KG;;;;
+3390;SQUARE HZ;So;0;L;<square> 0048 007A;;;;N;SQUARED HZ;;;;
+3391;SQUARE KHZ;So;0;L;<square> 006B 0048 007A;;;;N;SQUARED KHZ;;;;
+3392;SQUARE MHZ;So;0;L;<square> 004D 0048 007A;;;;N;SQUARED MHZ;;;;
+3393;SQUARE GHZ;So;0;L;<square> 0047 0048 007A;;;;N;SQUARED GHZ;;;;
+3394;SQUARE THZ;So;0;L;<square> 0054 0048 007A;;;;N;SQUARED THZ;;;;
+3395;SQUARE MU L;So;0;L;<square> 03BC 2113;;;;N;SQUARED MU L;;;;
+3396;SQUARE ML;So;0;L;<square> 006D 2113;;;;N;SQUARED ML;;;;
+3397;SQUARE DL;So;0;L;<square> 0064 2113;;;;N;SQUARED DL;;;;
+3398;SQUARE KL;So;0;L;<square> 006B 2113;;;;N;SQUARED KL;;;;
+3399;SQUARE FM;So;0;L;<square> 0066 006D;;;;N;SQUARED FM;;;;
+339A;SQUARE NM;So;0;L;<square> 006E 006D;;;;N;SQUARED NM;;;;
+339B;SQUARE MU M;So;0;L;<square> 03BC 006D;;;;N;SQUARED MU M;;;;
+339C;SQUARE MM;So;0;L;<square> 006D 006D;;;;N;SQUARED MM;;;;
+339D;SQUARE CM;So;0;L;<square> 0063 006D;;;;N;SQUARED CM;;;;
+339E;SQUARE KM;So;0;L;<square> 006B 006D;;;;N;SQUARED KM;;;;
+339F;SQUARE MM SQUARED;So;0;L;<square> 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;;
+33A0;SQUARE CM SQUARED;So;0;L;<square> 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;;
+33A1;SQUARE M SQUARED;So;0;L;<square> 006D 00B2;;;;N;SQUARED M SQUARED;;;;
+33A2;SQUARE KM SQUARED;So;0;L;<square> 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;;
+33A3;SQUARE MM CUBED;So;0;L;<square> 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;;
+33A4;SQUARE CM CUBED;So;0;L;<square> 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;;
+33A5;SQUARE M CUBED;So;0;L;<square> 006D 00B3;;;;N;SQUARED M CUBED;;;;
+33A6;SQUARE KM CUBED;So;0;L;<square> 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;;
+33A7;SQUARE M OVER S;So;0;L;<square> 006D 2215 0073;;;;N;SQUARED M OVER S;;;;
+33A8;SQUARE M OVER S SQUARED;So;0;L;<square> 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;;
+33A9;SQUARE PA;So;0;L;<square> 0050 0061;;;;N;SQUARED PA;;;;
+33AA;SQUARE KPA;So;0;L;<square> 006B 0050 0061;;;;N;SQUARED KPA;;;;
+33AB;SQUARE MPA;So;0;L;<square> 004D 0050 0061;;;;N;SQUARED MPA;;;;
+33AC;SQUARE GPA;So;0;L;<square> 0047 0050 0061;;;;N;SQUARED GPA;;;;
+33AD;SQUARE RAD;So;0;L;<square> 0072 0061 0064;;;;N;SQUARED RAD;;;;
+33AE;SQUARE RAD OVER S;So;0;L;<square> 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;;
+33AF;SQUARE RAD OVER S SQUARED;So;0;L;<square> 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;;
+33B0;SQUARE PS;So;0;L;<square> 0070 0073;;;;N;SQUARED PS;;;;
+33B1;SQUARE NS;So;0;L;<square> 006E 0073;;;;N;SQUARED NS;;;;
+33B2;SQUARE MU S;So;0;L;<square> 03BC 0073;;;;N;SQUARED MU S;;;;
+33B3;SQUARE MS;So;0;L;<square> 006D 0073;;;;N;SQUARED MS;;;;
+33B4;SQUARE PV;So;0;L;<square> 0070 0056;;;;N;SQUARED PV;;;;
+33B5;SQUARE NV;So;0;L;<square> 006E 0056;;;;N;SQUARED NV;;;;
+33B6;SQUARE MU V;So;0;L;<square> 03BC 0056;;;;N;SQUARED MU V;;;;
+33B7;SQUARE MV;So;0;L;<square> 006D 0056;;;;N;SQUARED MV;;;;
+33B8;SQUARE KV;So;0;L;<square> 006B 0056;;;;N;SQUARED KV;;;;
+33B9;SQUARE MV MEGA;So;0;L;<square> 004D 0056;;;;N;SQUARED MV MEGA;;;;
+33BA;SQUARE PW;So;0;L;<square> 0070 0057;;;;N;SQUARED PW;;;;
+33BB;SQUARE NW;So;0;L;<square> 006E 0057;;;;N;SQUARED NW;;;;
+33BC;SQUARE MU W;So;0;L;<square> 03BC 0057;;;;N;SQUARED MU W;;;;
+33BD;SQUARE MW;So;0;L;<square> 006D 0057;;;;N;SQUARED MW;;;;
+33BE;SQUARE KW;So;0;L;<square> 006B 0057;;;;N;SQUARED KW;;;;
+33BF;SQUARE MW MEGA;So;0;L;<square> 004D 0057;;;;N;SQUARED MW MEGA;;;;
+33C0;SQUARE K OHM;So;0;L;<square> 006B 03A9;;;;N;SQUARED K OHM;;;;
+33C1;SQUARE M OHM;So;0;L;<square> 004D 03A9;;;;N;SQUARED M OHM;;;;
+33C2;SQUARE AM;So;0;L;<square> 0061 002E 006D 002E;;;;N;SQUARED AM;;;;
+33C3;SQUARE BQ;So;0;L;<square> 0042 0071;;;;N;SQUARED BQ;;;;
+33C4;SQUARE CC;So;0;L;<square> 0063 0063;;;;N;SQUARED CC;;;;
+33C5;SQUARE CD;So;0;L;<square> 0063 0064;;;;N;SQUARED CD;;;;
+33C6;SQUARE C OVER KG;So;0;L;<square> 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;;
+33C7;SQUARE CO;So;0;L;<square> 0043 006F 002E;;;;N;SQUARED CO;;;;
+33C8;SQUARE DB;So;0;L;<square> 0064 0042;;;;N;SQUARED DB;;;;
+33C9;SQUARE GY;So;0;L;<square> 0047 0079;;;;N;SQUARED GY;;;;
+33CA;SQUARE HA;So;0;L;<square> 0068 0061;;;;N;SQUARED HA;;;;
+33CB;SQUARE HP;So;0;L;<square> 0048 0050;;;;N;SQUARED HP;;;;
+33CC;SQUARE IN;So;0;L;<square> 0069 006E;;;;N;SQUARED IN;;;;
+33CD;SQUARE KK;So;0;L;<square> 004B 004B;;;;N;SQUARED KK;;;;
+33CE;SQUARE KM CAPITAL;So;0;L;<square> 004B 004D;;;;N;SQUARED KM CAPITAL;;;;
+33CF;SQUARE KT;So;0;L;<square> 006B 0074;;;;N;SQUARED KT;;;;
+33D0;SQUARE LM;So;0;L;<square> 006C 006D;;;;N;SQUARED LM;;;;
+33D1;SQUARE LN;So;0;L;<square> 006C 006E;;;;N;SQUARED LN;;;;
+33D2;SQUARE LOG;So;0;L;<square> 006C 006F 0067;;;;N;SQUARED LOG;;;;
+33D3;SQUARE LX;So;0;L;<square> 006C 0078;;;;N;SQUARED LX;;;;
+33D4;SQUARE MB SMALL;So;0;L;<square> 006D 0062;;;;N;SQUARED MB SMALL;;;;
+33D5;SQUARE MIL;So;0;L;<square> 006D 0069 006C;;;;N;SQUARED MIL;;;;
+33D6;SQUARE MOL;So;0;L;<square> 006D 006F 006C;;;;N;SQUARED MOL;;;;
+33D7;SQUARE PH;So;0;L;<square> 0050 0048;;;;N;SQUARED PH;;;;
+33D8;SQUARE PM;So;0;L;<square> 0070 002E 006D 002E;;;;N;SQUARED PM;;;;
+33D9;SQUARE PPM;So;0;L;<square> 0050 0050 004D;;;;N;SQUARED PPM;;;;
+33DA;SQUARE PR;So;0;L;<square> 0050 0052;;;;N;SQUARED PR;;;;
+33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;;
+33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;;
+33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;;
+33DE;SQUARE V OVER M;So;0;ON;<square> 0056 2215 006D;;;;N;;;;;
+33DF;SQUARE A OVER M;So;0;ON;<square> 0041 2215 006D;;;;N;;;;;
+33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;;
+33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;;
+33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;;
+33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L;<compat> 0034 65E5;;;;N;;;;;
+33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L;<compat> 0035 65E5;;;;N;;;;;
+33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L;<compat> 0036 65E5;;;;N;;;;;
+33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L;<compat> 0037 65E5;;;;N;;;;;
+33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L;<compat> 0038 65E5;;;;N;;;;;
+33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L;<compat> 0039 65E5;;;;N;;;;;
+33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L;<compat> 0031 0030 65E5;;;;N;;;;;
+33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L;<compat> 0031 0031 65E5;;;;N;;;;;
+33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L;<compat> 0031 0032 65E5;;;;N;;;;;
+33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L;<compat> 0031 0033 65E5;;;;N;;;;;
+33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L;<compat> 0031 0034 65E5;;;;N;;;;;
+33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L;<compat> 0031 0035 65E5;;;;N;;;;;
+33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L;<compat> 0031 0036 65E5;;;;N;;;;;
+33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L;<compat> 0031 0037 65E5;;;;N;;;;;
+33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L;<compat> 0031 0038 65E5;;;;N;;;;;
+33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L;<compat> 0031 0039 65E5;;;;N;;;;;
+33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L;<compat> 0032 0030 65E5;;;;N;;;;;
+33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L;<compat> 0032 0031 65E5;;;;N;;;;;
+33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L;<compat> 0032 0032 65E5;;;;N;;;;;
+33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L;<compat> 0032 0033 65E5;;;;N;;;;;
+33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L;<compat> 0032 0034 65E5;;;;N;;;;;
+33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L;<compat> 0032 0035 65E5;;;;N;;;;;
+33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L;<compat> 0032 0036 65E5;;;;N;;;;;
+33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L;<compat> 0032 0037 65E5;;;;N;;;;;
+33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L;<compat> 0032 0038 65E5;;;;N;;;;;
+33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;;
+33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;;
+33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L;<compat> 0033 0031 65E5;;;;N;;;;;
+33FF;SQUARE GAL;So;0;ON;<square> 0067 0061 006C;;;;N;;;;;
+3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;;
+4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
+4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;;
+4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;;
+4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;;
+4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;;
+4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;;
+4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;;
+4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;;
+4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;;
+4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;;
+4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;;
+4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;;
+4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;;
+4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;;
+4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;;
+4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;;
+4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;;
+4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;;
+4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;;
+4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;;
+4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;;
+4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;;
+4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;;
+4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;;
+4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;;
+4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;;
+4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;;
+4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;;
+4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;;
+4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;;
+4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;;
+4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;;
+4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;;
+4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;;
+4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;;
+4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;;
+4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;;
+4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;;
+4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;;
+4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;;
+4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;;
+4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;;
+4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;;
+4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;;
+4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;;
+4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;;
+4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;;
+4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;;
+4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;;
+4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;;
+4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;;
+4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;;
+4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;;
+4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;;
+4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;;
+4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;;
+4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;;
+4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;;
+4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;;
+4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
+9FC3;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;;
+A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;;
+A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;;
+A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;;
+A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;;
+A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;;
+A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;;
+A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;;
+A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;;
+A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;;
+A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;;
+A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;;
+A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;;
+A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;;
+A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;;
+A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;;
+A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;;
+A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;;
+A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;;
+A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;;
+A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;;
+A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;;
+A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;;
+A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;;
+A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;;
+A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;;
+A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;;
+A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;;
+A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;;
+A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;;
+A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;;
+A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;;
+A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;;
+A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;;
+A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;;
+A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;;
+A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;;
+A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;;
+A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;;
+A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;;
+A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;;
+A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;;
+A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;;
+A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;;
+A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;;
+A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;;
+A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;;
+A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;;
+A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;;
+A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;;
+A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;;
+A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;;
+A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;;
+A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;;
+A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;;
+A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;;
+A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;;
+A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;;
+A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;;
+A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;;
+A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;;
+A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;;
+A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;;
+A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;;
+A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;;
+A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;;
+A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;;
+A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;;
+A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;;
+A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;;
+A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;;
+A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;;
+A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;;
+A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;;
+A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;;
+A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;;
+A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;;
+A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;;
+A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;;
+A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;;
+A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;;
+A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;;
+A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;;
+A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;;
+A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;;
+A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;;
+A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;;
+A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;;
+A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;;
+A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;;
+A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;;
+A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;;
+A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;;
+A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;;
+A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;;
+A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;;
+A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;;
+A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;;
+A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;;
+A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;;
+A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;;
+A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;;
+A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;;
+A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;;
+A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;;
+A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;;
+A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;;
+A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;;
+A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;;
+A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;;
+A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;;
+A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;;
+A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;;
+A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;;
+A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;;
+A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;;
+A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;;
+A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;;
+A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;;
+A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;;
+A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;;
+A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;;
+A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;;
+A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;;
+A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;;
+A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;;
+A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;;
+A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;;
+A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;;
+A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;;
+A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;;
+A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;;
+A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;;
+A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;;
+A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;;
+A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;;
+A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;;
+A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;;
+A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;;
+A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;;
+A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;;
+A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;;
+A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;;
+A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;;
+A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;;
+A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;;
+A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;;
+A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;;
+A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;;
+A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;;
+A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;;
+A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;;
+A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;;
+A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;;
+A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;;
+A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;;
+A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;;
+A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;;
+A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;;
+A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;;
+A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;;
+A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;;
+A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;;
+A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;;
+A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;;
+A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;;
+A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;;
+A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;;
+A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;;
+A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;;
+A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;;
+A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;;
+A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;;
+A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;;
+A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;;
+A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;;
+A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;;
+A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;;
+A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;;
+A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;;
+A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;;
+A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;;
+A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;;
+A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;;
+A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;;
+A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;;
+A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;;
+A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;;
+A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;;
+A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;;
+A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;;
+A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;;
+A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;;
+A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;;
+A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;;
+A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;;
+A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;;
+A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;;
+A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;;
+A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;;
+A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;;
+A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;;
+A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;;
+A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;;
+A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;;
+A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;;
+A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;;
+A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;;
+A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;;
+A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;;
+A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;;
+A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;;
+A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;;
+A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;;
+A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;;
+A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;;
+A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;;
+A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;;
+A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;;
+A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;;
+A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;;
+A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;;
+A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;;
+A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;;
+A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;;
+A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;;
+A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;;
+A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;;
+A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;;
+A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;;
+A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;;
+A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;;
+A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;;
+A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;;
+A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;;
+A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;;
+A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;;
+A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;;
+A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;;
+A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;;
+A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;;
+A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;;
+A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;;
+A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;;
+A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;;
+A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;;
+A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;;
+A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;;
+A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;;
+A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;;
+A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;;
+A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;;
+A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;;
+A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;;
+A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;;
+A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;;
+A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;;
+A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;;
+A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;;
+A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;;
+A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;;
+A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;;
+A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;;
+A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;;
+A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;;
+A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;;
+A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;;
+A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;;
+A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;;
+A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;;
+A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;;
+A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;;
+A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;;
+A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;;
+A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;;
+A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;;
+A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;;
+A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;;
+A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;;
+A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;;
+A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;;
+A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;;
+A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;;
+A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;;
+A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;;
+A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;;
+A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;;
+A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;;
+A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;;
+A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;;
+A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;;
+A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;;
+A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;;
+A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;;
+A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;;
+A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;;
+A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;;
+A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;;
+A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;;
+A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;;
+A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;;
+A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;;
+A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;;
+A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;;
+A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;;
+A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;;
+A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;;
+A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;;
+A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;;
+A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;;
+A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;;
+A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;;
+A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;;
+A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;;
+A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;;
+A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;;
+A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;;
+A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;;
+A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;;
+A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;;
+A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;;
+A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;;
+A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;;
+A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;;
+A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;;
+A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;;
+A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;;
+A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;;
+A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;;
+A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;;
+A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;;
+A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;;
+A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;;
+A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;;
+A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;;
+A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;;
+A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;;
+A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;;
+A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;;
+A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;;
+A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;;
+A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;;
+A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;;
+A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;;
+A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;;
+A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;;
+A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;;
+A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;;
+A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;;
+A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;;
+A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;;
+A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;;
+A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;;
+A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;;
+A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;;
+A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;;
+A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;;
+A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;;
+A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;;
+A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;;
+A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;;
+A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;;
+A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;;
+A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;;
+A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;;
+A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;;
+A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;;
+A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;;
+A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;;
+A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;;
+A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;;
+A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;;
+A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;;
+A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;;
+A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;;
+A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;;
+A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;;
+A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;;
+A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;;
+A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;;
+A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;;
+A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;;
+A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;;
+A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;;
+A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;;
+A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;;
+A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;;
+A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;;
+A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;;
+A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;;
+A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;;
+A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;;
+A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;;
+A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;;
+A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;;
+A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;;
+A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;;
+A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;;
+A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;;
+A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;;
+A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;;
+A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;;
+A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;;
+A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;;
+A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;;
+A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;;
+A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;;
+A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;;
+A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;;
+A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;;
+A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;;
+A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;;
+A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;;
+A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;;
+A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;;
+A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;;
+A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;;
+A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;;
+A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;;
+A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;;
+A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;;
+A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;;
+A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;;
+A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;;
+A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;;
+A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;;
+A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;;
+A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;;
+A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;;
+A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;;
+A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;;
+A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;;
+A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;;
+A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;;
+A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;;
+A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;;
+A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;;
+A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;;
+A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;;
+A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;;
+A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;;
+A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;;
+A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;;
+A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;;
+A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;;
+A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;;
+A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;;
+A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;;
+A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;;
+A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;;
+A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;;
+A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;;
+A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;;
+A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;;
+A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;;
+A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;;
+A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;;
+A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;;
+A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;;
+A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;;
+A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;;
+A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;;
+A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;;
+A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;;
+A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;;
+A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;;
+A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;;
+A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;;
+A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;;
+A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;;
+A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;;
+A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;;
+A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;;
+A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;;
+A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;;
+A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;;
+A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;;
+A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;;
+A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;;
+A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;;
+A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;;
+A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;;
+A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;;
+A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;;
+A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;;
+A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;;
+A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;;
+A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;;
+A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;;
+A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;;
+A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;;
+A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;;
+A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;;
+A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;;
+A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;;
+A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;;
+A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;;
+A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;;
+A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;;
+A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;;
+A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;;
+A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;;
+A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;;
+A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;;
+A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;;
+A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;;
+A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;;
+A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;;
+A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;;
+A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;;
+A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;;
+A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;;
+A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;;
+A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;;
+A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;;
+A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;;
+A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;;
+A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;;
+A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;;
+A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;;
+A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;;
+A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;;
+A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;;
+A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;;
+A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;;
+A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;;
+A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;;
+A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;;
+A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;;
+A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;;
+A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;;
+A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;;
+A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;;
+A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;;
+A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;;
+A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;;
+A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;;
+A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;;
+A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;;
+A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;;
+A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;;
+A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;;
+A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;;
+A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;;
+A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;;
+A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;;
+A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;;
+A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;;
+A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;;
+A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;;
+A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;;
+A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;;
+A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;;
+A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;;
+A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;;
+A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;;
+A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;;
+A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;;
+A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;;
+A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;;
+A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;;
+A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;;
+A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;;
+A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;;
+A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;;
+A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;;
+A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;;
+A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;;
+A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;;
+A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;;
+A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;;
+A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;;
+A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;;
+A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;;
+A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;;
+A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;;
+A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;;
+A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;;
+A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;;
+A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;;
+A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;;
+A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;;
+A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;;
+A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;;
+A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;;
+A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;;
+A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;;
+A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;;
+A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;;
+A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;;
+A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;;
+A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;;
+A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;;
+A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;;
+A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;;
+A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;;
+A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;;
+A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;;
+A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;;
+A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;;
+A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;;
+A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;;
+A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;;
+A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;;
+A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;;
+A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;;
+A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;;
+A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;;
+A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;;
+A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;;
+A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;;
+A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;;
+A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;;
+A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;;
+A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;;
+A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;;
+A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;;
+A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;;
+A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;;
+A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;;
+A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;;
+A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;;
+A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;;
+A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;;
+A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;;
+A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;;
+A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;;
+A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;;
+A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;;
+A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;;
+A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;;
+A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;;
+A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;;
+A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;;
+A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;;
+A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;;
+A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;;
+A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;;
+A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;;
+A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;;
+A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;;
+A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;;
+A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;;
+A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;;
+A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;;
+A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;;
+A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;;
+A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;;
+A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;;
+A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;;
+A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;;
+A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;;
+A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;;
+A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;;
+A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;;
+A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;;
+A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;;
+A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;;
+A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;;
+A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;;
+A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;;
+A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;;
+A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;;
+A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;;
+A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;;
+A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;;
+A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;;
+A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;;
+A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;;
+A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;;
+A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;;
+A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;;
+A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;;
+A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;;
+A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;;
+A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;;
+A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;;
+A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;;
+A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;;
+A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;;
+A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;;
+A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;;
+A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;;
+A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;;
+A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;;
+A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;;
+A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;;
+A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;;
+A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;;
+A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;;
+A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;;
+A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;;
+A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;;
+A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;;
+A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;;
+A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;;
+A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;;
+A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;;
+A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;;
+A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;;
+A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;;
+A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;;
+A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;;
+A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;;
+A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;;
+A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;;
+A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;;
+A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;;
+A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;;
+A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;;
+A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;;
+A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;;
+A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;;
+A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;;
+A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;;
+A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;;
+A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;;
+A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;;
+A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;;
+A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;;
+A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;;
+A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;;
+A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;;
+A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;;
+A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;;
+A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;;
+A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;;
+A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;;
+A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;;
+A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;;
+A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;;
+A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;;
+A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;;
+A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;;
+A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;;
+A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;;
+A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;;
+A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;;
+A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;;
+A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;;
+A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;;
+A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;;
+A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;;
+A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;;
+A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;;
+A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;;
+A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;;
+A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;;
+A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;;
+A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;;
+A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;;
+A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;;
+A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;;
+A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;;
+A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;;
+A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;;
+A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;;
+A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;;
+A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;;
+A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;;
+A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;;
+A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;;
+A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;;
+A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;;
+A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;;
+A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;;
+A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;;
+A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;;
+A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;;
+A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;;
+A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;;
+A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;;
+A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;;
+A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;;
+A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;;
+A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;;
+A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;;
+A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;;
+A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;;
+A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;;
+A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;;
+A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;;
+A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;;
+A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;;
+A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;;
+A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;;
+A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;;
+A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;;
+A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;;
+A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;;
+A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;;
+A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;;
+A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;;
+A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;;
+A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;;
+A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;;
+A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;;
+A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;;
+A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;;
+A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;;
+A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;;
+A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;;
+A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;;
+A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;;
+A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;;
+A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;;
+A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;;
+A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;;
+A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;;
+A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;;
+A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;;
+A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;;
+A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;;
+A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;;
+A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;;
+A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;;
+A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;;
+A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;;
+A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;;
+A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;;
+A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;;
+A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;;
+A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;;
+A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;;
+A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;;
+A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;;
+A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;;
+A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;;
+A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;;
+A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;;
+A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;;
+A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;;
+A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;;
+A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;;
+A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;;
+A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;;
+A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;;
+A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;;
+A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;;
+A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;;
+A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;;
+A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;;
+A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;;
+A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;;
+A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;;
+A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;;
+A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;;
+A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;;
+A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;;
+A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;;
+A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;;
+A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;;
+A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;;
+A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;;
+A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;;
+A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;;
+A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;;
+A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;;
+A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;;
+A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;;
+A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;;
+A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;;
+A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;;
+A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;;
+A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;;
+A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;;
+A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;;
+A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;;
+A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;;
+A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;;
+A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;;
+A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;;
+A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;;
+A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;;
+A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;;
+A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;;
+A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;;
+A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;;
+A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;;
+A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;;
+A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;;
+A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;;
+A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;;
+A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;;
+A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;;
+A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;;
+A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;;
+A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;;
+A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;;
+A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;;
+A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;;
+A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;;
+A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;;
+A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;;
+A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;;
+A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;;
+A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;;
+A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;;
+A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;;
+A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;;
+A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;;
+A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;;
+A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;;
+A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;;
+A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;;
+A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;;
+A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;;
+A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;;
+A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;;
+A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;;
+A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;;
+A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;;
+A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;;
+A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;;
+A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;;
+A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;;
+A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;;
+A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;;
+A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;;
+A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;;
+A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;;
+A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;;
+A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;;
+A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;;
+A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;;
+A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;;
+A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;;
+A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;;
+A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;;
+A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;;
+A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;;
+A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;;
+A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;;
+A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;;
+A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;;
+A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;;
+A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;;
+A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;;
+A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;;
+A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;;
+A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;;
+A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;;
+A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;;
+A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;;
+A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;;
+A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;;
+A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;;
+A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;;
+A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;;
+A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;;
+A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;;
+A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;;
+A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;;
+A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;;
+A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;;
+A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;;
+A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;;
+A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;;
+A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;;
+A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;;
+A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;;
+A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;;
+A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;;
+A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;;
+A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;;
+A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;;
+A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;;
+A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;;
+A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;;
+A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;;
+A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;;
+A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;;
+A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;;
+A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;;
+A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;;
+A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;;
+A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;;
+A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;;
+A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;;
+A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;;
+A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;;
+A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;;
+A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;;
+A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;;
+A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;;
+A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;;
+A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;;
+A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;;
+A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;;
+A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;;
+A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;;
+A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;;
+A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;;
+A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;;
+A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;;
+A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;;
+A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;;
+A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;;
+A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;;
+A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;;
+A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;;
+A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;;
+A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;;
+A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;;
+A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;;
+A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;;
+A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;;
+A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;;
+A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;;
+A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;;
+A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;;
+A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;;
+A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;;
+A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;;
+A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;;
+A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;;
+A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;;
+A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;;
+A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;;
+A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;;
+A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;;
+A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;;
+A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;;
+A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;;
+A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;;
+A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;;
+A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;;
+A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;;
+A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;;
+A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;;
+A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;;
+A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;;
+A491;YI RADICAL LI;So;0;ON;;;;;N;;;;;
+A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;;
+A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;;
+A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;;
+A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;;
+A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;;
+A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;;
+A498;YI RADICAL MI;So;0;ON;;;;;N;;;;;
+A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;;
+A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;;
+A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;;
+A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;;
+A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;;
+A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;;
+A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;;
+A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;;
+A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;;
+A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;;
+A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;;
+A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;;
+A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;;
+A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;;
+A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;;
+A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;;
+A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;;
+A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;;
+A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;;
+A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;;
+A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;;
+A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;;
+A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;;
+A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;;
+A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;;
+A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;;
+A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;;
+A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;;
+A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;;
+A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;;
+A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;;
+A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;;
+A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;;
+A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;;
+A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;;
+A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;;
+A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;;
+A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;;
+A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;;
+A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;;
+A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;;
+A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;;
+A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;;
+A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;;
+A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;;
+A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;;
+A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;;
+A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;;
+A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;;
+A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;;
+A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;;
+A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;;
+A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;;
+A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;;
+A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;;
+A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;;
+A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;;
+A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;;
+A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;;
+A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;;
+A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;;
+A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;;
+A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;;
+A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;;
+A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;;
+A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;;
+A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;;
+A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;;
+A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;;
+A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;;
+A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;;
+A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;;
+A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;;
+A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;;
+A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;;
+A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;;
+A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;;
+A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;;
+A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;;
+A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;;
+A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;;
+A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;;
+A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;;
+A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;;
+A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;;
+A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;;
+A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;;
+A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;;
+A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;;
+A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;;
+A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;;
+A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;;
+A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;;
+A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;;
+A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;;
+A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;;
+A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;;
+A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;;
+A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;;
+A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;;
+A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;;
+A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;;
+A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;;
+A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;;
+A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;;
+A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;;
+A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;;
+A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;;
+A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;;
+A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;;
+A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;;
+A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;;
+A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;;
+A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;;
+A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;;
+A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;;
+A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;;
+A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;;
+A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;;
+A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;;
+A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;;
+A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;;
+A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;;
+A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;;
+A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;;
+A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;;
+A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;;
+A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;;
+A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;;
+A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;;
+A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;;
+A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;;
+A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;;
+A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;;
+A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;;
+A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;;
+A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;;
+A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;;
+A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;;
+A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;;
+A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;;
+A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;;
+A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;;
+A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;;
+A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;;
+A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;;
+A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;;
+A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;;
+A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;;
+A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;;
+A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;;
+A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;;
+A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;;
+A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;;
+A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;;
+A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;;
+A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;;
+A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;;
+A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;;
+A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;;
+A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;;
+A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;;
+A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;;
+A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;;
+A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;;
+A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;;
+A60D;VAI COMMA;Po;0;ON;;;;;N;;;;;
+A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;;
+A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;;
+A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;;
+A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;;
+A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;;
+A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;;
+A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;;
+A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;;
+A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;;
+A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;;
+A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;;
+A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;;
+A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;;
+A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;;
+A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;;
+A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;;
+A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;;
+A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;;
+A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;;
+A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;;
+A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641;
+A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640
+A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643;
+A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642
+A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645;
+A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644
+A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647;
+A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646
+A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649;
+A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648
+A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B;
+A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A
+A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D;
+A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C
+A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F;
+A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E
+A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651;
+A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650
+A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653;
+A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652
+A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655;
+A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654
+A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657;
+A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656
+A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659;
+A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658
+A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B;
+A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A
+A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D;
+A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C
+A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F;
+A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E
+A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663;
+A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662
+A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665;
+A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664
+A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667;
+A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666
+A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669;
+A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668
+A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B;
+A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A
+A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D;
+A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C
+A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;;
+A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;;
+A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;;
+A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;;
+A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;;
+A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;;
+A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;;
+A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681;
+A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680
+A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683;
+A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682
+A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685;
+A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684
+A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687;
+A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686
+A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689;
+A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688
+A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B;
+A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A
+A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D;
+A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C
+A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F;
+A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E
+A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691;
+A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690
+A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693;
+A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692
+A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695;
+A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694
+A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697;
+A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696
+A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;;
+A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;;
+A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;;
+A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;;
+A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;;
+A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;;
+A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;;
+A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;;
+A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;;
+A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;;
+A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;;
+A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;;
+A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;;
+A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;;
+A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;;
+A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;;
+A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723;
+A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722
+A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725;
+A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724
+A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727;
+A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726
+A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729;
+A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728
+A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B;
+A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A
+A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D;
+A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C
+A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F;
+A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E
+A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;;
+A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;;
+A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733;
+A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732
+A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735;
+A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734
+A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737;
+A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736
+A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739;
+A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738
+A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B;
+A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A
+A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D;
+A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C
+A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F;
+A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E
+A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741;
+A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740
+A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743;
+A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742
+A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745;
+A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744
+A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747;
+A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746
+A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749;
+A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748
+A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B;
+A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A
+A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D;
+A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C
+A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F;
+A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E
+A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751;
+A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750
+A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753;
+A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752
+A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755;
+A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754
+A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757;
+A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756
+A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759;
+A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758
+A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B;
+A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A
+A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D;
+A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C
+A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F;
+A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E
+A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761;
+A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760
+A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763;
+A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762
+A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765;
+A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764
+A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767;
+A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766
+A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769;
+A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768
+A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B;
+A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A
+A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D;
+A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C
+A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F;
+A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E
+A770;MODIFIER LETTER US;Lm;0;L;<super> A76F;;;;N;;;;;
+A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;;
+A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;;
+A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;;
+A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;;
+A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;;
+A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;;
+A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;;
+A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;;
+A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A;
+A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779
+A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C;
+A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B
+A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79;
+A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F;
+A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E
+A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781;
+A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780
+A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783;
+A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782
+A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785;
+A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784
+A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787;
+A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786
+A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;;
+A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;;
+A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;;
+A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C;
+A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B
+A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;;
+A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;;
+A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;;
+A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;;
+A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;;
+A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;;
+A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;;
+A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;;
+A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;;
+A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;;
+A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;;
+A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;;
+A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;;
+A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;;
+A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;;
+A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;;
+A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;;
+A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;;
+A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;;
+A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;;
+A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;;
+A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;;
+A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;;
+A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;;
+A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;;
+A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;;
+A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;;
+A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;;
+A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;;
+A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;;
+A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;;
+A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;;
+A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;;
+A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;;
+A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;;
+A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;;
+A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;;
+A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;;
+A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;;
+A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;;
+A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;;
+A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;;
+A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;;
+A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;;
+A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;;
+A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;;
+A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;;
+A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;;
+A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;;
+A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;;
+A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;;
+A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;;
+A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;;
+A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;;
+A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;;
+A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;;
+A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;;
+A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;;
+A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;;
+A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;;
+A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;;
+A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;;
+A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;;
+A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;;
+A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;;
+A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;;
+A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;;
+A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;;
+A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;;
+A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;;
+A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;;
+A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;;
+A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;;
+A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;;
+A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;;
+A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;;
+A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;;
+A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;;
+A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;;
+A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;;
+A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;;
+A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;;
+A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;;
+A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;;
+A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;;
+A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;;
+A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;;
+A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;;
+A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;;
+A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;;
+A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;;
+A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;;
+A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;;
+A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;;
+A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;;
+A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;;
+A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;;
+A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;;
+A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;;
+A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;;
+A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;;
+A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;;
+A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;;
+A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;;
+A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;;
+A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;;
+A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;;
+A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;;
+A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;;
+A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;;
+A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;;
+A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;;
+A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;;
+A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;;
+A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;;
+A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;;
+A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;;
+A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;;
+A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;;
+A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;;
+A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;;
+A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;;
+A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;;
+A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;;
+A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;;
+A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;;
+A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;;
+A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;;
+A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;;
+A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;;
+A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;;
+A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;;
+A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;;
+A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;;
+A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;;
+A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;;
+A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;;
+A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;;
+A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;;
+A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;;
+A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;;
+A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;;
+A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;;
+A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;;
+A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;;
+A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;;
+A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;;
+A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;;
+A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;;
+A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;;
+A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;;
+A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;;
+A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;;
+A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;;
+A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;;
+A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;;
+A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;;
+A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;;
+A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;;
+A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;;
+A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;;
+A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;;
+A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;;
+A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;;
+A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;;
+A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;;
+A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;;
+A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;;
+A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;;
+A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;;
+A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;;
+A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;;
+A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;;
+A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;;
+A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;;
+A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;;
+A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;;
+A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;;
+A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;;
+A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;;
+A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;;
+A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;;
+A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;;
+A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;;
+A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;;
+A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;;
+A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;;
+A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;;
+A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;;
+A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;;
+A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;;
+A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;;
+AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;;
+AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;;
+AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;;
+AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;;
+AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;;
+AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;;
+AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;;
+AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;;
+AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;;
+AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;;
+AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;;
+AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;;
+AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;;
+AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;;
+AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;;
+AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;;
+AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;;
+AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;;
+AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;;
+AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;;
+AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;;
+AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;;
+AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;;
+AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;;
+AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;;
+AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;;
+AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;;
+AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;;
+AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;;
+AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;;
+AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;;
+AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;;
+AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;;
+AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;;
+AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;;
+AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;;
+AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;;
+AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;;
+AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;;
+AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;;
+AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;;
+AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;;
+AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;;
+AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;;
+AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;;
+AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;;
+AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;;
+AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;;
+AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;;
+AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;;
+AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;;
+AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;;
+AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;;
+D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;;
+D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+DC00;<Low Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DFFF;<Low Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+E000;<Private Use, First>;Co;0;L;;;;;N;;;;;
+F8FF;<Private Use, Last>;Co;0;L;;;;;N;;;;;
+F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;;
+F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;;
+F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;;
+F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;;
+F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;;
+F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;;
+F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;;
+F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;;
+F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;;
+F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;;
+F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;;
+F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;;
+F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;;
+F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;;
+F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;;
+F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;;
+F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;;
+F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;;
+F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;;
+F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;;
+F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;;
+F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;;
+F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;;
+F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;;
+F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;;
+F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;;
+F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;;
+F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;;
+F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;;
+F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;;
+F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;;
+F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;;
+F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;;
+F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;;
+F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;;
+F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;;
+F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;;
+F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;;
+F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;;
+F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;;
+F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;;
+F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;;
+F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;;
+F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;;
+F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;;
+F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;;
+F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;;
+F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;;
+F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;;
+F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;;
+F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;;
+F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;;
+F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;;
+F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;;
+F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;;
+F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;;
+F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;;
+F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;;
+F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;;
+F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;;
+F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;;
+F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;;
+F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;;
+F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;;
+F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;;
+F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;;
+F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;;
+F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;;
+F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;;
+F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;;
+F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;;
+F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;;
+F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;;
+F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;;
+F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;;
+F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;;
+F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;;
+F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;;
+F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;;
+F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;;
+F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;;
+F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;;
+F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;;
+F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;;
+F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;;
+F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;;
+F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;;
+F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;;
+F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;;
+F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;;
+F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;;
+F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;;
+F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;;
+F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;;
+F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;;
+F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;;
+F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;;
+F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;;
+F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;;
+F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;;
+F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;;
+F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;;
+F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;;
+F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;;
+F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;;
+F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;;
+F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;;
+F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;;
+F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;;
+F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;;
+F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;;
+F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;;
+F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;;
+F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;;
+F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;;
+F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;;
+F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;;
+F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;;
+F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;;
+F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;;
+F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;;
+F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;;
+F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;;
+F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;;
+F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;;
+F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;;
+F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;;
+F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;;
+F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;;
+F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;;
+F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;;
+F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;;
+F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;;
+F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;;
+F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;;
+F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;;
+F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;;
+F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;;
+F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;;
+F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;;
+F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;;
+F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;;
+F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;;
+F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;;
+F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;;
+F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;;
+F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;;
+F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;;
+F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;;
+F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;;
+F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;;
+F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;;
+F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;;
+F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;;
+F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;;
+F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;;
+F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;;
+F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;;
+F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;;
+F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;;
+F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;;
+F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;;
+F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;;
+F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;;
+F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;;
+F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;;
+F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;;
+F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;;
+F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;;
+F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;;
+F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;;
+F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;;
+F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;;
+F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;;
+F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;;
+F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;;
+F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;;
+F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;;
+F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;;
+F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;;
+F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;;
+F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;;
+F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;;
+F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;;
+F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;;
+F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;;
+F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;;
+F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;;
+F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;;
+F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;;
+F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;;
+F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;;
+F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;;
+F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;;
+F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;;
+F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;;
+F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;;
+F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;;
+F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;;
+F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;;
+F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;;
+F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;;
+F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;;
+F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;;
+F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;;
+F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;;
+F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;;
+F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;;
+F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;;
+F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;;
+F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;;
+F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;;
+F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;;
+F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;;
+F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;;
+F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;;
+F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;;
+F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;;
+F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;;
+F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;;
+F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;;
+F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;;
+F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;;
+F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;;
+F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;;
+F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;;
+F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;;
+F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;;
+F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;;
+F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;;
+F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;;
+F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;;
+F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;;
+F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;;
+F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;;
+F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;;
+F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;;
+F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;;
+F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;;
+F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;;
+F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;;
+F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;;
+F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;;
+F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;;
+F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;;
+F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;;
+F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;;
+F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;;
+F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;;
+F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;;
+F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;;
+F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;;
+F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;;
+F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;;
+F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;;
+F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;;
+FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;;
+FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;;
+FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;;
+FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;;
+FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;;
+FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;;
+FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;;
+FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;;
+FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;;
+FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;;
+FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;;
+FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;;
+FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;;
+FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;;
+FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;;
+FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;;
+FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;;
+FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;;
+FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;;
+FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;;
+FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;;
+FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;;
+FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;;
+FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;;
+FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;;
+FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;;
+FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;;
+FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;;
+FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;;
+FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;;
+FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;;
+FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;*;;;
+FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;;
+FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;;
+FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;;
+FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;*;;;
+FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;;
+FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;;
+FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;;
+FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;;
+FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;;
+FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;;
+FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;;
+FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;;
+FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;;
+FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;;
+FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;;
+FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;;
+FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;;
+FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;;
+FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;;
+FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;;
+FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;;
+FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;;
+FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;;
+FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;;
+FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;;
+FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;;
+FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;;
+FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;;
+FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;;
+FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;;
+FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;;
+FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;;
+FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;;
+FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;;
+FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;;
+FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;;
+FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;;
+FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;;
+FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;;
+FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;;
+FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;;
+FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;;
+FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;;
+FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;;
+FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;;
+FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;;
+FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;;
+FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;;
+FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;;
+FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;;
+FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;;
+FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;;
+FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;;
+FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;;
+FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;;
+FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;;
+FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;;
+FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;;
+FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;;
+FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;;
+FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;;
+FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;;
+FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;;
+FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;;
+FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;;
+FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;;
+FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;;
+FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;;
+FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;;
+FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;;
+FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;;
+FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;;
+FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;;
+FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;;
+FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;;
+FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;;
+FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;;
+FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;;
+FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;;
+FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;;
+FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;;
+FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;;
+FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;;
+FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;;
+FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;;
+FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;;
+FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;;
+FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;;
+FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;;
+FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;;
+FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;;
+FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;;
+FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;;
+FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;;
+FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;;
+FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;;
+FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;;
+FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;;
+FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;;
+FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;;
+FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;;
+FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;;
+FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;;
+FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;;
+FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;;
+FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;;
+FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;;
+FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;;
+FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;;
+FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;;
+FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;;
+FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;;
+FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;;
+FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;;
+FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;;
+FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;;
+FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;;
+FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;;
+FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;;
+FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;;
+FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;;
+FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;;
+FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;;
+FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;;
+FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;;
+FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;;
+FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;;
+FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;;
+FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;;
+FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;;
+FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;;
+FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;;
+FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;;
+FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;;
+FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;;
+FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;;
+FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;;
+FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;;
+FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;;
+FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;;
+FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;;
+FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;;
+FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;;
+FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;;
+FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;;
+FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;;
+FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;;
+FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;;
+FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;;
+FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;;
+FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;;
+FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;;
+FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;;
+FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;;
+FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;;
+FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;;
+FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;;
+FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;;
+FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;;
+FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;;
+FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;;
+FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;;
+FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;;
+FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;;
+FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;;
+FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;;
+FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;;
+FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;;
+FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;;
+FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;;
+FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;;
+FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;;
+FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;;
+FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;;
+FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;;
+FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;;
+FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;;
+FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;;
+FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;;
+FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;;
+FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;;
+FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;;
+FB03;LATIN SMALL LIGATURE FFI;Ll;0;L;<compat> 0066 0066 0069;;;;N;;;;;
+FB04;LATIN SMALL LIGATURE FFL;Ll;0;L;<compat> 0066 0066 006C;;;;N;;;;;
+FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L;<compat> 017F 0074;;;;N;;;;;
+FB06;LATIN SMALL LIGATURE ST;Ll;0;L;<compat> 0073 0074;;;;N;;;;;
+FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L;<compat> 0574 0576;;;;N;;;;;
+FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L;<compat> 0574 0565;;;;N;;;;;
+FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L;<compat> 0574 056B;;;;N;;;;;
+FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L;<compat> 057E 0576;;;;N;;;;;
+FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L;<compat> 0574 056D;;;;N;;;;;
+FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;;
+FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;;
+FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;;
+FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R;<font> 05E2;;;;N;;;;;
+FB21;HEBREW LETTER WIDE ALEF;Lo;0;R;<font> 05D0;;;;N;;;;;
+FB22;HEBREW LETTER WIDE DALET;Lo;0;R;<font> 05D3;;;;N;;;;;
+FB23;HEBREW LETTER WIDE HE;Lo;0;R;<font> 05D4;;;;N;;;;;
+FB24;HEBREW LETTER WIDE KAF;Lo;0;R;<font> 05DB;;;;N;;;;;
+FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;;
+FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;;
+FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;;
+FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;;
+FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES;<font> 002B;;;;N;;;;;
+FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;;
+FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;;
+FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;;
+FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;;
+FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;;
+FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;;
+FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;;
+FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;;
+FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;;
+FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;;
+FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;;
+FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;;
+FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;;
+FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;;
+FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;;
+FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;;
+FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;;
+FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;;
+FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;;
+FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;;
+FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;;
+FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;;
+FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;;
+FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;;
+FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;;
+FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;;
+FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;;
+FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;;
+FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;;
+FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;;
+FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;;
+FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;;
+FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R;<compat> 05D0 05DC;;;;N;;;;;
+FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL;<isolated> 0671;;;;N;;;;;
+FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL;<final> 0671;;;;N;;;;;
+FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL;<isolated> 067B;;;;N;;;;;
+FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL;<final> 067B;;;;N;;;;;
+FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL;<initial> 067B;;;;N;;;;;
+FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL;<medial> 067B;;;;N;;;;;
+FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL;<isolated> 067E;;;;N;;;;;
+FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL;<final> 067E;;;;N;;;;;
+FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL;<initial> 067E;;;;N;;;;;
+FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL;<medial> 067E;;;;N;;;;;
+FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0680;;;;N;;;;;
+FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL;<final> 0680;;;;N;;;;;
+FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL;<initial> 0680;;;;N;;;;;
+FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL;<medial> 0680;;;;N;;;;;
+FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067A;;;;N;;;;;
+FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL;<final> 067A;;;;N;;;;;
+FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL;<initial> 067A;;;;N;;;;;
+FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL;<medial> 067A;;;;N;;;;;
+FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067F;;;;N;;;;;
+FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL;<final> 067F;;;;N;;;;;
+FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL;<initial> 067F;;;;N;;;;;
+FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL;<medial> 067F;;;;N;;;;;
+FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL;<isolated> 0679;;;;N;;;;;
+FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL;<final> 0679;;;;N;;;;;
+FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL;<initial> 0679;;;;N;;;;;
+FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL;<medial> 0679;;;;N;;;;;
+FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL;<isolated> 06A4;;;;N;;;;;
+FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL;<final> 06A4;;;;N;;;;;
+FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL;<initial> 06A4;;;;N;;;;;
+FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL;<medial> 06A4;;;;N;;;;;
+FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A6;;;;N;;;;;
+FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL;<final> 06A6;;;;N;;;;;
+FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL;<initial> 06A6;;;;N;;;;;
+FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A6;;;;N;;;;;
+FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL;<isolated> 0684;;;;N;;;;;
+FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL;<final> 0684;;;;N;;;;;
+FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL;<initial> 0684;;;;N;;;;;
+FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL;<medial> 0684;;;;N;;;;;
+FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL;<isolated> 0683;;;;N;;;;;
+FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL;<final> 0683;;;;N;;;;;
+FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL;<initial> 0683;;;;N;;;;;
+FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL;<medial> 0683;;;;N;;;;;
+FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL;<isolated> 0686;;;;N;;;;;
+FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL;<final> 0686;;;;N;;;;;
+FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL;<initial> 0686;;;;N;;;;;
+FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL;<medial> 0686;;;;N;;;;;
+FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0687;;;;N;;;;;
+FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL;<final> 0687;;;;N;;;;;
+FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL;<initial> 0687;;;;N;;;;;
+FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL;<medial> 0687;;;;N;;;;;
+FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068D;;;;N;;;;;
+FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL;<final> 068D;;;;N;;;;;
+FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068C;;;;N;;;;;
+FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL;<final> 068C;;;;N;;;;;
+FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL;<isolated> 068E;;;;N;;;;;
+FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL;<final> 068E;;;;N;;;;;
+FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL;<isolated> 0688;;;;N;;;;;
+FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL;<final> 0688;;;;N;;;;;
+FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL;<isolated> 0698;;;;N;;;;;
+FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL;<final> 0698;;;;N;;;;;
+FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL;<isolated> 0691;;;;N;;;;;
+FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL;<final> 0691;;;;N;;;;;
+FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A9;;;;N;;;;;
+FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL;<final> 06A9;;;;N;;;;;
+FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL;<initial> 06A9;;;;N;;;;;
+FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A9;;;;N;;;;;
+FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL;<isolated> 06AF;;;;N;;;;;
+FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL;<final> 06AF;;;;N;;;;;
+FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL;<initial> 06AF;;;;N;;;;;
+FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL;<medial> 06AF;;;;N;;;;;
+FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL;<isolated> 06B3;;;;N;;;;;
+FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL;<final> 06B3;;;;N;;;;;
+FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL;<initial> 06B3;;;;N;;;;;
+FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL;<medial> 06B3;;;;N;;;;;
+FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL;<isolated> 06B1;;;;N;;;;;
+FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL;<final> 06B1;;;;N;;;;;
+FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL;<initial> 06B1;;;;N;;;;;
+FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL;<medial> 06B1;;;;N;;;;;
+FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL;<isolated> 06BA;;;;N;;;;;
+FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL;<final> 06BA;;;;N;;;;;
+FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL;<isolated> 06BB;;;;N;;;;;
+FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL;<final> 06BB;;;;N;;;;;
+FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL;<initial> 06BB;;;;N;;;;;
+FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL;<medial> 06BB;;;;N;;;;;
+FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06C0;;;;N;;;;;
+FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL;<final> 06C0;;;;N;;;;;
+FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL;<isolated> 06C1;;;;N;;;;;
+FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL;<final> 06C1;;;;N;;;;;
+FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL;<initial> 06C1;;;;N;;;;;
+FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL;<medial> 06C1;;;;N;;;;;
+FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL;<isolated> 06BE;;;;N;;;;;
+FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL;<final> 06BE;;;;N;;;;;
+FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL;<initial> 06BE;;;;N;;;;;
+FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL;<medial> 06BE;;;;N;;;;;
+FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL;<isolated> 06D2;;;;N;;;;;
+FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL;<final> 06D2;;;;N;;;;;
+FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06D3;;;;N;;;;;
+FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 06D3;;;;N;;;;;
+FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;;
+FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;;
+FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;;
+FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL;<medial> 06AD;;;;N;;;;;
+FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL;<isolated> 06C7;;;;N;;;;;
+FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL;<final> 06C7;;;;N;;;;;
+FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL;<isolated> 06C6;;;;N;;;;;
+FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL;<final> 06C6;;;;N;;;;;
+FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL;<isolated> 06C8;;;;N;;;;;
+FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL;<final> 06C8;;;;N;;;;;
+FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0677;;;;N;;;;;
+FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL;<isolated> 06CB;;;;N;;;;;
+FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL;<final> 06CB;;;;N;;;;;
+FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL;<isolated> 06C5;;;;N;;;;;
+FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL;<final> 06C5;;;;N;;;;;
+FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL;<isolated> 06C9;;;;N;;;;;
+FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL;<final> 06C9;;;;N;;;;;
+FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL;<isolated> 06D0;;;;N;;;;;
+FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL;<final> 06D0;;;;N;;;;;
+FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL;<initial> 06D0;;;;N;;;;;
+FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL;<medial> 06D0;;;;N;;;;;
+FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0649;;;;N;;;;;
+FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL;<medial> 0649;;;;N;;;;;
+FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0626 0627;;;;N;;;;;
+FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL;<final> 0626 0627;;;;N;;;;;
+FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D5;;;;N;;;;;
+FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL;<final> 0626 06D5;;;;N;;;;;
+FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL;<isolated> 0626 0648;;;;N;;;;;
+FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL;<final> 0626 0648;;;;N;;;;;
+FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C7;;;;N;;;;;
+FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL;<final> 0626 06C7;;;;N;;;;;
+FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C6;;;;N;;;;;
+FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL;<final> 0626 06C6;;;;N;;;;;
+FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C8;;;;N;;;;;
+FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL;<final> 0626 06C8;;;;N;;;;;
+FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D0;;;;N;;;;;
+FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL;<final> 0626 06D0;;;;N;;;;;
+FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL;<initial> 0626 06D0;;;;N;;;;;
+FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0626 0649;;;;N;;;;;
+FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL;<isolated> 06CC;;;;N;;;;;
+FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL;<final> 06CC;;;;N;;;;;
+FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL;<initial> 06CC;;;;N;;;;;
+FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL;<medial> 06CC;;;;N;;;;;
+FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 062C;;;;N;;;;;
+FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0626 062D;;;;N;;;;;
+FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 0645;;;;N;;;;;
+FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0626 064A;;;;N;;;;;
+FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 062C;;;;N;;;;;
+FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062D;;;;N;;;;;
+FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062E;;;;N;;;;;
+FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 0645;;;;N;;;;;
+FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0628 0649;;;;N;;;;;
+FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0628 064A;;;;N;;;;;
+FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 062C;;;;N;;;;;
+FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062D;;;;N;;;;;
+FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062E;;;;N;;;;;
+FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 0645;;;;N;;;;;
+FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062A 0649;;;;N;;;;;
+FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062A 064A;;;;N;;;;;
+FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 062C;;;;N;;;;;
+FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 0645;;;;N;;;;;
+FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062B 0649;;;;N;;;;;
+FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062B 064A;;;;N;;;;;
+FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062C 062D;;;;N;;;;;
+FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C 0645;;;;N;;;;;
+FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 062C;;;;N;;;;;
+FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 0645;;;;N;;;;;
+FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 062C;;;;N;;;;;
+FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062E 062D;;;;N;;;;;
+FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 0645;;;;N;;;;;
+FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 062C;;;;N;;;;;
+FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062D;;;;N;;;;;
+FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062E;;;;N;;;;;
+FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 0645;;;;N;;;;;
+FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0635 062D;;;;N;;;;;
+FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0645;;;;N;;;;;
+FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 062C;;;;N;;;;;
+FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062D;;;;N;;;;;
+FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062E;;;;N;;;;;
+FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 0645;;;;N;;;;;
+FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0637 062D;;;;N;;;;;
+FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0637 0645;;;;N;;;;;
+FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0638 0645;;;;N;;;;;
+FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 062C;;;;N;;;;;
+FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 0645;;;;N;;;;;
+FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 062C;;;;N;;;;;
+FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 0645;;;;N;;;;;
+FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 062C;;;;N;;;;;
+FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062D;;;;N;;;;;
+FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062E;;;;N;;;;;
+FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 0645;;;;N;;;;;
+FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0641 0649;;;;N;;;;;
+FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0641 064A;;;;N;;;;;
+FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0642 062D;;;;N;;;;;
+FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0642 0645;;;;N;;;;;
+FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0642 0649;;;;N;;;;;
+FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0642 064A;;;;N;;;;;
+FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0643 0627;;;;N;;;;;
+FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 062C;;;;N;;;;;
+FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062D;;;;N;;;;;
+FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062E;;;;N;;;;;
+FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0644;;;;N;;;;;
+FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0645;;;;N;;;;;
+FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0643 0649;;;;N;;;;;
+FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0643 064A;;;;N;;;;;
+FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 062C;;;;N;;;;;
+FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062D;;;;N;;;;;
+FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062E;;;;N;;;;;
+FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 0645;;;;N;;;;;
+FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0644 0649;;;;N;;;;;
+FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0644 064A;;;;N;;;;;
+FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 062C;;;;N;;;;;
+FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D;;;;N;;;;;
+FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062E;;;;N;;;;;
+FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 0645;;;;N;;;;;
+FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0645 0649;;;;N;;;;;
+FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0645 064A;;;;N;;;;;
+FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 062C;;;;N;;;;;
+FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062D;;;;N;;;;;
+FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062E;;;;N;;;;;
+FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 0645;;;;N;;;;;
+FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0646 0649;;;;N;;;;;
+FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0646 064A;;;;N;;;;;
+FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 062C;;;;N;;;;;
+FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 0645;;;;N;;;;;
+FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0647 0649;;;;N;;;;;
+FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0647 064A;;;;N;;;;;
+FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 062C;;;;N;;;;;
+FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062D;;;;N;;;;;
+FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062E;;;;N;;;;;
+FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 0645;;;;N;;;;;
+FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 064A 0649;;;;N;;;;;
+FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A 064A;;;;N;;;;;
+FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0630 0670;;;;N;;;;;
+FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0631 0670;;;;N;;;;;
+FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0649 0670;;;;N;;;;;
+FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C 0651;;;;N;;;;;
+FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D 0651;;;;N;;;;;
+FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E 0651;;;;N;;;;;
+FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F 0651;;;;N;;;;;
+FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650 0651;;;;N;;;;;
+FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651 0670;;;;N;;;;;
+FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL;<final> 0626 0631;;;;N;;;;;
+FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0626 0632;;;;N;;;;;
+FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL;<final> 0626 0645;;;;N;;;;;
+FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL;<final> 0626 0646;;;;N;;;;;
+FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL;<final> 0626 064A;;;;N;;;;;
+FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL;<final> 0628 0631;;;;N;;;;;
+FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0628 0632;;;;N;;;;;
+FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0628 0645;;;;N;;;;;
+FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL;<final> 0628 0646;;;;N;;;;;
+FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0628 0649;;;;N;;;;;
+FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 064A;;;;N;;;;;
+FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL;<final> 062A 0631;;;;N;;;;;
+FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062A 0632;;;;N;;;;;
+FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062A 0645;;;;N;;;;;
+FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062A 0646;;;;N;;;;;
+FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0649;;;;N;;;;;
+FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 064A;;;;N;;;;;
+FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL;<final> 062B 0631;;;;N;;;;;
+FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062B 0632;;;;N;;;;;
+FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062B 0645;;;;N;;;;;
+FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062B 0646;;;;N;;;;;
+FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062B 0649;;;;N;;;;;
+FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062B 064A;;;;N;;;;;
+FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0641 0649;;;;N;;;;;
+FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 064A;;;;N;;;;;
+FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0642 0649;;;;N;;;;;
+FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 064A;;;;N;;;;;
+FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL;<final> 0643 0627;;;;N;;;;;
+FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL;<final> 0643 0644;;;;N;;;;;
+FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645;;;;N;;;;;
+FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0643 0649;;;;N;;;;;
+FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 064A;;;;N;;;;;
+FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 0645;;;;N;;;;;
+FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 0649;;;;N;;;;;
+FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 064A;;;;N;;;;;
+FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0645 0627;;;;N;;;;;
+FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0645 0645;;;;N;;;;;
+FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL;<final> 0646 0631;;;;N;;;;;
+FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0646 0632;;;;N;;;;;
+FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 0645;;;;N;;;;;
+FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL;<final> 0646 0646;;;;N;;;;;
+FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0649;;;;N;;;;;
+FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 064A;;;;N;;;;;
+FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL;<final> 0649 0670;;;;N;;;;;
+FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL;<final> 064A 0631;;;;N;;;;;
+FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 064A 0632;;;;N;;;;;
+FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645;;;;N;;;;;
+FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL;<final> 064A 0646;;;;N;;;;;
+FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 064A 0649;;;;N;;;;;
+FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 064A;;;;N;;;;;
+FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0626 062C;;;;N;;;;;
+FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0626 062D;;;;N;;;;;
+FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0626 062E;;;;N;;;;;
+FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0626 0645;;;;N;;;;;
+FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0626 0647;;;;N;;;;;
+FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0628 062C;;;;N;;;;;
+FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0628 062D;;;;N;;;;;
+FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0628 062E;;;;N;;;;;
+FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0628 0645;;;;N;;;;;
+FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0628 0647;;;;N;;;;;
+FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C;;;;N;;;;;
+FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 062D;;;;N;;;;;
+FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 062E;;;;N;;;;;
+FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645;;;;N;;;;;
+FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 062A 0647;;;;N;;;;;
+FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062B 0645;;;;N;;;;;
+FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 062D;;;;N;;;;;
+FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062C 0645;;;;N;;;;;
+FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062D 062C;;;;N;;;;;
+FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062D 0645;;;;N;;;;;
+FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062E 062C;;;;N;;;;;
+FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062E 0645;;;;N;;;;;
+FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062C;;;;N;;;;;
+FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062D;;;;N;;;;;
+FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0633 062E;;;;N;;;;;
+FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645;;;;N;;;;;
+FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D;;;;N;;;;;
+FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0635 062E;;;;N;;;;;
+FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645;;;;N;;;;;
+FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062C;;;;N;;;;;
+FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0636 062D;;;;N;;;;;
+FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0636 062E;;;;N;;;;;
+FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 0645;;;;N;;;;;
+FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 062D;;;;N;;;;;
+FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0638 0645;;;;N;;;;;
+FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C;;;;N;;;;;
+FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645;;;;N;;;;;
+FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 063A 062C;;;;N;;;;;
+FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 063A 0645;;;;N;;;;;
+FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062C;;;;N;;;;;
+FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0641 062D;;;;N;;;;;
+FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0641 062E;;;;N;;;;;
+FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 0645;;;;N;;;;;
+FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 062D;;;;N;;;;;
+FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0642 0645;;;;N;;;;;
+FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0643 062C;;;;N;;;;;
+FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0643 062D;;;;N;;;;;
+FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0643 062E;;;;N;;;;;
+FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL;<initial> 0643 0644;;;;N;;;;;
+FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645;;;;N;;;;;
+FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C;;;;N;;;;;
+FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 062D;;;;N;;;;;
+FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0644 062E;;;;N;;;;;
+FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645;;;;N;;;;;
+FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0644 0647;;;;N;;;;;
+FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C;;;;N;;;;;
+FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062D;;;;N;;;;;
+FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062E;;;;N;;;;;
+FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 0645;;;;N;;;;;
+FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C;;;;N;;;;;
+FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062D;;;;N;;;;;
+FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0646 062E;;;;N;;;;;
+FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 0645;;;;N;;;;;
+FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0646 0647;;;;N;;;;;
+FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 062C;;;;N;;;;;
+FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645;;;;N;;;;;
+FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL;<initial> 0647 0670;;;;N;;;;;
+FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 064A 062C;;;;N;;;;;
+FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 064A 062D;;;;N;;;;;
+FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 064A 062E;;;;N;;;;;
+FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645;;;;N;;;;;
+FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 064A 0647;;;;N;;;;;
+FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0626 0645;;;;N;;;;;
+FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0626 0647;;;;N;;;;;
+FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0628 0645;;;;N;;;;;
+FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0628 0647;;;;N;;;;;
+FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062A 0645;;;;N;;;;;
+FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062A 0647;;;;N;;;;;
+FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062B 0645;;;;N;;;;;
+FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062B 0647;;;;N;;;;;
+FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 0645;;;;N;;;;;
+FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0633 0647;;;;N;;;;;
+FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 0645;;;;N;;;;;
+FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0634 0647;;;;N;;;;;
+FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL;<medial> 0643 0644;;;;N;;;;;
+FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0643 0645;;;;N;;;;;
+FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0644 0645;;;;N;;;;;
+FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0646 0645;;;;N;;;;;
+FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0646 0647;;;;N;;;;;
+FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 064A 0645;;;;N;;;;;
+FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 064A 0647;;;;N;;;;;
+FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E 0651;;;;N;;;;;
+FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F 0651;;;;N;;;;;
+FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650 0651;;;;N;;;;;
+FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0637 0649;;;;N;;;;;
+FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0637 064A;;;;N;;;;;
+FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0639 0649;;;;N;;;;;
+FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0639 064A;;;;N;;;;;
+FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 063A 0649;;;;N;;;;;
+FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 063A 064A;;;;N;;;;;
+FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0633 0649;;;;N;;;;;
+FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0633 064A;;;;N;;;;;
+FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0634 0649;;;;N;;;;;
+FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0634 064A;;;;N;;;;;
+FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062D 0649;;;;N;;;;;
+FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062D 064A;;;;N;;;;;
+FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062C 0649;;;;N;;;;;
+FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062C 064A;;;;N;;;;;
+FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062E 0649;;;;N;;;;;
+FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062E 064A;;;;N;;;;;
+FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0649;;;;N;;;;;
+FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0635 064A;;;;N;;;;;
+FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0636 0649;;;;N;;;;;
+FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0636 064A;;;;N;;;;;
+FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 062C;;;;N;;;;;
+FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062D;;;;N;;;;;
+FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062E;;;;N;;;;;
+FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 0645;;;;N;;;;;
+FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0634 0631;;;;N;;;;;
+FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0633 0631;;;;N;;;;;
+FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0635 0631;;;;N;;;;;
+FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0636 0631;;;;N;;;;;
+FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0637 0649;;;;N;;;;;
+FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 064A;;;;N;;;;;
+FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0649;;;;N;;;;;
+FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 064A;;;;N;;;;;
+FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0649;;;;N;;;;;
+FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 064A;;;;N;;;;;
+FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 0649;;;;N;;;;;
+FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 064A;;;;N;;;;;
+FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0634 0649;;;;N;;;;;
+FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 064A;;;;N;;;;;
+FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0649;;;;N;;;;;
+FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 064A;;;;N;;;;;
+FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0649;;;;N;;;;;
+FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 064A;;;;N;;;;;
+FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062E 0649;;;;N;;;;;
+FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062E 064A;;;;N;;;;;
+FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0635 0649;;;;N;;;;;
+FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 064A;;;;N;;;;;
+FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 0649;;;;N;;;;;
+FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 064A;;;;N;;;;;
+FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL;<final> 0634 062C;;;;N;;;;;
+FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL;<final> 0634 062D;;;;N;;;;;
+FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 062E;;;;N;;;;;
+FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645;;;;N;;;;;
+FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0634 0631;;;;N;;;;;
+FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0633 0631;;;;N;;;;;
+FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL;<final> 0635 0631;;;;N;;;;;
+FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL;<final> 0636 0631;;;;N;;;;;
+FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062C;;;;N;;;;;
+FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0634 062D;;;;N;;;;;
+FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 062E;;;;N;;;;;
+FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645;;;;N;;;;;
+FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0633 0647;;;;N;;;;;
+FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0634 0647;;;;N;;;;;
+FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645;;;;N;;;;;
+FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 062C;;;;N;;;;;
+FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062D;;;;N;;;;;
+FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062E;;;;N;;;;;
+FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 062C;;;;N;;;;;
+FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062D;;;;N;;;;;
+FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062E;;;;N;;;;;
+FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0637 0645;;;;N;;;;;
+FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0638 0645;;;;N;;;;;
+FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;N;;;;;
+FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;;
+FD3E;ORNATE LEFT PARENTHESIS;Ps;0;ON;;;;;N;;;;;
+FD3F;ORNATE RIGHT PARENTHESIS;Pe;0;ON;;;;;N;;;;;
+FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;;
+FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;;
+FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;;
+FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 0645;;;;N;;;;;
+FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062E 0645;;;;N;;;;;
+FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062C;;;;N;;;;;
+FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062D;;;;N;;;;;
+FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062E;;;;N;;;;;
+FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 062C 0645 062D;;;;N;;;;;
+FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 0645 062D;;;;N;;;;;
+FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 0645 064A;;;;N;;;;;
+FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0645 0649;;;;N;;;;;
+FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062D 062C;;;;N;;;;;
+FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062C 062D;;;;N;;;;;
+FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062C 0649;;;;N;;;;;
+FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0633 0645 062D;;;;N;;;;;
+FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062D;;;;N;;;;;
+FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062C;;;;N;;;;;
+FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0633 0645 0645;;;;N;;;;;
+FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 0645;;;;N;;;;;
+FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL;<final> 0635 062D 062D;;;;N;;;;;
+FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D 062D;;;;N;;;;;
+FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0635 0645 0645;;;;N;;;;;
+FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 062D 0645;;;;N;;;;;
+FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062D 0645;;;;N;;;;;
+FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062C 064A;;;;N;;;;;
+FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 0645 062E;;;;N;;;;;
+FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 0645 062E;;;;N;;;;;
+FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645 0645;;;;N;;;;;
+FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645 0645;;;;N;;;;;
+FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 062D 0649;;;;N;;;;;
+FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0636 062E 0645;;;;N;;;;;
+FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062E 0645;;;;N;;;;;
+FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0637 0645 062D;;;;N;;;;;
+FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 0645 062D;;;;N;;;;;
+FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645 0645;;;;N;;;;;
+FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 0645 064A;;;;N;;;;;
+FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 062C 0645;;;;N;;;;;
+FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 0645 0645;;;;N;;;;;
+FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645 0645;;;;N;;;;;
+FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0645 0649;;;;N;;;;;
+FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 063A 0645 0645;;;;N;;;;;
+FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 0645 064A;;;;N;;;;;
+FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0645 0649;;;;N;;;;;
+FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0641 062E 0645;;;;N;;;;;
+FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062E 0645;;;;N;;;;;
+FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0642 0645 062D;;;;N;;;;;
+FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0642 0645 0645;;;;N;;;;;
+FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062D 0645;;;;N;;;;;
+FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062D 064A;;;;N;;;;;
+FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 062D 0649;;;;N;;;;;
+FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 062C;;;;N;;;;;
+FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 062C;;;;N;;;;;
+FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062E 0645;;;;N;;;;;
+FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062E 0645;;;;N;;;;;
+FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0644 0645 062D;;;;N;;;;;
+FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062D;;;;N;;;;;
+FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 062C;;;;N;;;;;
+FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 0645;;;;N;;;;;
+FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062D 064A;;;;N;;;;;
+FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062D;;;;N;;;;;
+FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C 0645;;;;N;;;;;
+FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 062C;;;;N;;;;;
+FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 0645;;;;N;;;;;
+FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062E;;;;N;;;;;
+FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 062C;;;;N;;;;;
+FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 0645;;;;N;;;;;
+FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062D 0645;;;;N;;;;;
+FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062D 0649;;;;N;;;;;
+FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 062C 0645;;;;N;;;;;
+FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C 0645;;;;N;;;;;
+FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062C 0649;;;;N;;;;;
+FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 0645 064A;;;;N;;;;;
+FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0645 0649;;;;N;;;;;
+FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645 0645;;;;N;;;;;
+FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645 0645;;;;N;;;;;
+FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062E 064A;;;;N;;;;;
+FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062C 064A;;;;N;;;;;
+FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062C 0649;;;;N;;;;;
+FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062E 064A;;;;N;;;;;
+FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062E 0649;;;;N;;;;;
+FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 0645 064A;;;;N;;;;;
+FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0645 0649;;;;N;;;;;
+FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 0645 064A;;;;N;;;;;
+FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 062D 0649;;;;N;;;;;
+FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0645 0649;;;;N;;;;;
+FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062E 0649;;;;N;;;;;
+FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 062D 064A;;;;N;;;;;
+FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062D 064A;;;;N;;;;;
+FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 062D 064A;;;;N;;;;;
+FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062C 064A;;;;N;;;;;
+FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 0645 064A;;;;N;;;;;
+FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062D 064A;;;;N;;;;;
+FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062C 064A;;;;N;;;;;
+FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 0645 064A;;;;N;;;;;
+FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 0645 064A;;;;N;;;;;
+FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 0645 064A;;;;N;;;;;
+FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062D 064A;;;;N;;;;;
+FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 0645 062D;;;;N;;;;;
+FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062D 0645;;;;N;;;;;
+FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 0645 064A;;;;N;;;;;
+FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 0645 064A;;;;N;;;;;
+FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062C 062D;;;;N;;;;;
+FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062E 064A;;;;N;;;;;
+FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 0645;;;;N;;;;;
+FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645 0645;;;;N;;;;;
+FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 0645;;;;N;;;;;
+FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0646 062C 062D;;;;N;;;;;
+FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 062D 064A;;;;N;;;;;
+FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 062C 064A;;;;N;;;;;
+FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062C 064A;;;;N;;;;;
+FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 0645 064A;;;;N;;;;;
+FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062D 064A;;;;N;;;;;
+FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645 0645;;;;N;;;;;
+FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C 0645;;;;N;;;;;
+FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;;
+FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;;
+FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;;
+FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;;
+FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;;
+FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;;
+FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL;<isolated> 0627 0643 0628 0631;;;;N;;;;;
+FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D 0645 062F;;;;N;;;;;
+FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0639 0645;;;;N;;;;;
+FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL;<isolated> 0631 0633 0648 0644;;;;N;;;;;
+FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL;<isolated> 0639 0644 064A 0647;;;;N;;;;;
+FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL;<isolated> 0648 0633 0644 0645;;;;N;;;;;
+FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;;;;;
+FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;;
+FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;;
+FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;;
+FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;;
+FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;;
+FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;;
+FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;;
+FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;;
+FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;;
+FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;;
+FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;;
+FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;;
+FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;;
+FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;;
+FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;;
+FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;;
+FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;;
+FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;;
+FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;;
+FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;;
+FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;;
+FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;;
+FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;;
+FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;;
+FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;;
+FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;;
+FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;;
+FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;;
+FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;;
+FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;;
+FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;;
+FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;;
+FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;;
+FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;;
+FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;;
+FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;;
+FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON;<vertical> 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;;
+FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON;<vertical> 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;;
+FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON;<vertical> 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;;
+FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON;<vertical> 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;;
+FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<vertical> 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;;
+FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<vertical> 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;;
+FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;<vertical> 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;;
+FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;<vertical> 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;;
+FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;<vertical> 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;;
+FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;<vertical> 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;;
+FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON;<vertical> 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;;
+FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON;<vertical> 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;;
+FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON;<vertical> 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;;
+FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON;<vertical> 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;;
+FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical> 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;;
+FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;;
+FE45;SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON;<vertical> 005B;;;;N;;;;;
+FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON;<vertical> 005D;;;;N;;;;;
+FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;;
+FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;;
+FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;;
+FE4C;DOUBLE WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;;
+FE4D;DASHED LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING DASHED UNDERSCORE;;;;
+FE4E;CENTRELINE LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;;
+FE4F;WAVY LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING WAVY UNDERSCORE;;;;
+FE50;SMALL COMMA;Po;0;CS;<small> 002C;;;;N;;;;;
+FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON;<small> 3001;;;;N;;;;;
+FE52;SMALL FULL STOP;Po;0;CS;<small> 002E;;;;N;SMALL PERIOD;;;;
+FE54;SMALL SEMICOLON;Po;0;ON;<small> 003B;;;;N;;;;;
+FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;;
+FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;;
+FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;;
+FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;;
+FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;Y;SMALL OPENING PARENTHESIS;;;;
+FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;;
+FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;;
+FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;;
+FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;;
+FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;;
+FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;;
+FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;;
+FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;;
+FE62;SMALL PLUS SIGN;Sm;0;ES;<small> 002B;;;;N;;;;;
+FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;;
+FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;;
+FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;;
+FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;;
+FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;;
+FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;;
+FE6A;SMALL PERCENT SIGN;Po;0;ET;<small> 0025;;;;N;;;;;
+FE6B;SMALL COMMERCIAL AT;Po;0;ON;<small> 0040;;;;N;;;;;
+FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;;
+FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL;<medial> 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;;
+FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;;
+FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;;
+FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;;
+FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E;;;;N;ARABIC SPACING FATHAH;;;;
+FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;;
+FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;;
+FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;;
+FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650;;;;N;ARABIC SPACING KASRAH;;;;
+FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;;
+FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;;
+FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL;<medial> 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;;
+FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL;<isolated> 0020 0652;;;;N;ARABIC SPACING SUKUN;;;;
+FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL;<medial> 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;;
+FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL;<isolated> 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;;
+FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;;
+FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;;
+FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;;
+FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;;
+FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;;
+FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;;
+FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;;
+FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;;
+FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;;
+FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;;
+FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL;<initial> 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;;
+FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL;<medial> 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;;
+FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;;
+FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL;<final> 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;;
+FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL;<isolated> 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;;
+FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL;<final> 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;;
+FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL;<initial> 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;;
+FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL;<medial> 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;;
+FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL;<isolated> 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;;
+FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL;<final> 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;;
+FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL;<isolated> 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;;
+FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL;<final> 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;;
+FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL;<initial> 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;;
+FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL;<medial> 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;;
+FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL;<isolated> 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;;
+FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL;<final> 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;;
+FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL;<initial> 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;;
+FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL;<medial> 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;;
+FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;;
+FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;;
+FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;;
+FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;;
+FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL;<isolated> 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;;
+FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL;<final> 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;;
+FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL;<initial> 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;;
+FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL;<medial> 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;;
+FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;;
+FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL;<final> 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;;
+FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL;<initial> 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;;
+FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL;<medial> 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;;
+FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL;<isolated> 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;;
+FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL;<final> 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;;
+FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL;<isolated> 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;;
+FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL;<final> 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;;
+FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL;<isolated> 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;;
+FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL;<final> 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;;
+FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL;<isolated> 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;;
+FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL;<final> 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;;
+FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL;<isolated> 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;;
+FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL;<final> 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;;
+FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL;<initial> 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;;
+FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL;<medial> 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;;
+FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL;<isolated> 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;;
+FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL;<final> 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;;
+FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL;<initial> 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;;
+FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL;<medial> 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;;
+FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL;<isolated> 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;;
+FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL;<final> 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;;
+FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL;<initial> 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;;
+FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL;<medial> 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;;
+FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL;<isolated> 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;;
+FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL;<final> 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;;
+FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL;<initial> 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;;
+FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL;<medial> 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;;
+FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL;<isolated> 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;;
+FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL;<final> 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;;
+FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL;<initial> 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;;
+FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL;<medial> 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;;
+FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL;<isolated> 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;;
+FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL;<final> 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;;
+FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL;<initial> 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;;
+FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL;<medial> 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;;
+FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL;<isolated> 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;;
+FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL;<final> 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;;
+FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL;<initial> 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;;
+FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL;<medial> 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;;
+FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL;<isolated> 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;;
+FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL;<final> 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;;
+FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL;<initial> 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;;
+FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL;<medial> 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;;
+FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL;<isolated> 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;;
+FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL;<final> 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;;
+FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL;<initial> 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;;
+FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL;<medial> 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;;
+FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL;<isolated> 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;;
+FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL;<final> 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;;
+FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL;<initial> 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;;
+FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL;<medial> 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;;
+FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL;<isolated> 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;;
+FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL;<final> 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;;
+FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL;<initial> 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;;
+FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL;<medial> 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;;
+FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL;<isolated> 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;;
+FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL;<final> 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;;
+FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL;<initial> 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;;
+FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL;<medial> 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;;
+FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;;
+FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL;<final> 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;;
+FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL;<initial> 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;;
+FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL;<medial> 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;;
+FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL;<isolated> 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;;
+FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL;<final> 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;;
+FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL;<initial> 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;;
+FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL;<medial> 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;;
+FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL;<isolated> 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;;
+FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL;<final> 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;;
+FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL;<initial> 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;;
+FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL;<medial> 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;;
+FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL;<isolated> 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;;
+FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL;<final> 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;;
+FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;;
+FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;;
+FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;;
+FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL;<final> 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;;
+FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL;<initial> 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;;
+FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL;<medial> 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;;
+FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;;
+FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;;
+FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;;
+FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON;<wide> 0021;;;;N;;;;;
+FF02;FULLWIDTH QUOTATION MARK;Po;0;ON;<wide> 0022;;;;N;;;;;
+FF03;FULLWIDTH NUMBER SIGN;Po;0;ET;<wide> 0023;;;;N;;;;;
+FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET;<wide> 0024;;;;N;;;;;
+FF05;FULLWIDTH PERCENT SIGN;Po;0;ET;<wide> 0025;;;;N;;;;;
+FF06;FULLWIDTH AMPERSAND;Po;0;ON;<wide> 0026;;;;N;;;;;
+FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;;
+FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;;
+FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;;
+FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;;
+FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;;
+FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;;
+FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;;
+FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;;
+FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<wide> 002F;;;;N;FULLWIDTH SLASH;;;;
+FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;;
+FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;;
+FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;;
+FF13;FULLWIDTH DIGIT THREE;Nd;0;EN;<wide> 0033;3;3;3;N;;;;;
+FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN;<wide> 0034;4;4;4;N;;;;;
+FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN;<wide> 0035;5;5;5;N;;;;;
+FF16;FULLWIDTH DIGIT SIX;Nd;0;EN;<wide> 0036;6;6;6;N;;;;;
+FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN;<wide> 0037;7;7;7;N;;;;;
+FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN;<wide> 0038;8;8;8;N;;;;;
+FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;;
+FF1A;FULLWIDTH COLON;Po;0;CS;<wide> 003A;;;;N;;;;;
+FF1B;FULLWIDTH SEMICOLON;Po;0;ON;<wide> 003B;;;;N;;;;;
+FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON;<wide> 003C;;;;Y;;;;;
+FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;;
+FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;Y;;;;;
+FF1F;FULLWIDTH QUESTION MARK;Po;0;ON;<wide> 003F;;;;N;;;;;
+FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON;<wide> 0040;;;;N;;;;;
+FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L;<wide> 0041;;;;N;;;;FF41;
+FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L;<wide> 0042;;;;N;;;;FF42;
+FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L;<wide> 0043;;;;N;;;;FF43;
+FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L;<wide> 0044;;;;N;;;;FF44;
+FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L;<wide> 0045;;;;N;;;;FF45;
+FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L;<wide> 0046;;;;N;;;;FF46;
+FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L;<wide> 0047;;;;N;;;;FF47;
+FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L;<wide> 0048;;;;N;;;;FF48;
+FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L;<wide> 0049;;;;N;;;;FF49;
+FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L;<wide> 004A;;;;N;;;;FF4A;
+FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L;<wide> 004B;;;;N;;;;FF4B;
+FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L;<wide> 004C;;;;N;;;;FF4C;
+FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L;<wide> 004D;;;;N;;;;FF4D;
+FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L;<wide> 004E;;;;N;;;;FF4E;
+FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L;<wide> 004F;;;;N;;;;FF4F;
+FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L;<wide> 0050;;;;N;;;;FF50;
+FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L;<wide> 0051;;;;N;;;;FF51;
+FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L;<wide> 0052;;;;N;;;;FF52;
+FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L;<wide> 0053;;;;N;;;;FF53;
+FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L;<wide> 0054;;;;N;;;;FF54;
+FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L;<wide> 0055;;;;N;;;;FF55;
+FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L;<wide> 0056;;;;N;;;;FF56;
+FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L;<wide> 0057;;;;N;;;;FF57;
+FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L;<wide> 0058;;;;N;;;;FF58;
+FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L;<wide> 0059;;;;N;;;;FF59;
+FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L;<wide> 005A;;;;N;;;;FF5A;
+FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON;<wide> 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;;
+FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON;<wide> 005C;;;;N;FULLWIDTH BACKSLASH;;;;
+FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON;<wide> 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;;
+FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON;<wide> 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;;
+FF3F;FULLWIDTH LOW LINE;Pc;0;ON;<wide> 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;;
+FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON;<wide> 0060;;;;N;FULLWIDTH SPACING GRAVE;;;;
+FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L;<wide> 0061;;;;N;;;FF21;;FF21
+FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L;<wide> 0062;;;;N;;;FF22;;FF22
+FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L;<wide> 0063;;;;N;;;FF23;;FF23
+FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L;<wide> 0064;;;;N;;;FF24;;FF24
+FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L;<wide> 0065;;;;N;;;FF25;;FF25
+FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L;<wide> 0066;;;;N;;;FF26;;FF26
+FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L;<wide> 0067;;;;N;;;FF27;;FF27
+FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L;<wide> 0068;;;;N;;;FF28;;FF28
+FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L;<wide> 0069;;;;N;;;FF29;;FF29
+FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L;<wide> 006A;;;;N;;;FF2A;;FF2A
+FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L;<wide> 006B;;;;N;;;FF2B;;FF2B
+FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L;<wide> 006C;;;;N;;;FF2C;;FF2C
+FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L;<wide> 006D;;;;N;;;FF2D;;FF2D
+FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L;<wide> 006E;;;;N;;;FF2E;;FF2E
+FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L;<wide> 006F;;;;N;;;FF2F;;FF2F
+FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L;<wide> 0070;;;;N;;;FF30;;FF30
+FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L;<wide> 0071;;;;N;;;FF31;;FF31
+FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L;<wide> 0072;;;;N;;;FF32;;FF32
+FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L;<wide> 0073;;;;N;;;FF33;;FF33
+FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L;<wide> 0074;;;;N;;;FF34;;FF34
+FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L;<wide> 0075;;;;N;;;FF35;;FF35
+FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L;<wide> 0076;;;;N;;;FF36;;FF36
+FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L;<wide> 0077;;;;N;;;FF37;;FF37
+FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L;<wide> 0078;;;;N;;;FF38;;FF38
+FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L;<wide> 0079;;;;N;;;FF39;;FF39
+FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L;<wide> 007A;;;;N;;;FF3A;;FF3A
+FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON;<wide> 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;;
+FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON;<wide> 007C;;;;N;FULLWIDTH VERTICAL BAR;;;;
+FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON;<wide> 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;;
+FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;;
+FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON;<wide> 2985;;;;Y;;*;;;
+FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON;<wide> 2986;;;;Y;;*;;;
+FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;;
+FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;;
+FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;;
+FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;;
+FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON;<narrow> 30FB;;;;N;;;;;
+FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;;
+FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;;
+FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;;
+FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L;<narrow> 30A5;;;;N;;;;;
+FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L;<narrow> 30A7;;;;N;;;;;
+FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L;<narrow> 30A9;;;;N;;;;;
+FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L;<narrow> 30E3;;;;N;;;;;
+FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L;<narrow> 30E5;;;;N;;;;;
+FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L;<narrow> 30E7;;;;N;;;;;
+FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L;<narrow> 30C3;;;;N;;;;;
+FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;<narrow> 30FC;;;;N;;;;;
+FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;;
+FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L;<narrow> 30A4;;;;N;;;;;
+FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L;<narrow> 30A6;;;;N;;;;;
+FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L;<narrow> 30A8;;;;N;;;;;
+FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L;<narrow> 30AA;;;;N;;;;;
+FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L;<narrow> 30AB;;;;N;;;;;
+FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L;<narrow> 30AD;;;;N;;;;;
+FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L;<narrow> 30AF;;;;N;;;;;
+FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L;<narrow> 30B1;;;;N;;;;;
+FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L;<narrow> 30B3;;;;N;;;;;
+FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L;<narrow> 30B5;;;;N;;;;;
+FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L;<narrow> 30B7;;;;N;;;;;
+FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L;<narrow> 30B9;;;;N;;;;;
+FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L;<narrow> 30BB;;;;N;;;;;
+FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L;<narrow> 30BD;;;;N;;;;;
+FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L;<narrow> 30BF;;;;N;;;;;
+FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L;<narrow> 30C1;;;;N;;;;;
+FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L;<narrow> 30C4;;;;N;;;;;
+FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L;<narrow> 30C6;;;;N;;;;;
+FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L;<narrow> 30C8;;;;N;;;;;
+FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L;<narrow> 30CA;;;;N;;;;;
+FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L;<narrow> 30CB;;;;N;;;;;
+FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L;<narrow> 30CC;;;;N;;;;;
+FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L;<narrow> 30CD;;;;N;;;;;
+FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L;<narrow> 30CE;;;;N;;;;;
+FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L;<narrow> 30CF;;;;N;;;;;
+FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L;<narrow> 30D2;;;;N;;;;;
+FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L;<narrow> 30D5;;;;N;;;;;
+FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L;<narrow> 30D8;;;;N;;;;;
+FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L;<narrow> 30DB;;;;N;;;;;
+FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L;<narrow> 30DE;;;;N;;;;;
+FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L;<narrow> 30DF;;;;N;;;;;
+FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L;<narrow> 30E0;;;;N;;;;;
+FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L;<narrow> 30E1;;;;N;;;;;
+FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L;<narrow> 30E2;;;;N;;;;;
+FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L;<narrow> 30E4;;;;N;;;;;
+FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L;<narrow> 30E6;;;;N;;;;;
+FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L;<narrow> 30E8;;;;N;;;;;
+FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L;<narrow> 30E9;;;;N;;;;;
+FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L;<narrow> 30EA;;;;N;;;;;
+FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L;<narrow> 30EB;;;;N;;;;;
+FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L;<narrow> 30EC;;;;N;;;;;
+FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L;<narrow> 30ED;;;;N;;;;;
+FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L;<narrow> 30EF;;;;N;;;;;
+FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L;<narrow> 30F3;;;;N;;;;;
+FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;halfwidth katakana-hiragana voiced sound mark;;;
+FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;halfwidth katakana-hiragana semi-voiced sound mark;;;
+FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L;<narrow> 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;;
+FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L;<narrow> 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;;
+FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L;<narrow> 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;;
+FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;;
+FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L;<narrow> 3134;;;;N;;;;;
+FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<narrow> 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;;
+FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<narrow> 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;;
+FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L;<narrow> 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;;
+FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L;<narrow> 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;;
+FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L;<narrow> 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;;
+FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<narrow> 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;;
+FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<narrow> 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;;
+FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<narrow> 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;;
+FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L;<narrow> 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;;
+FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<narrow> 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;;
+FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<narrow> 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;;
+FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<narrow> 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;;
+FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L;<narrow> 3141;;;;N;;;;;
+FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L;<narrow> 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;;
+FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L;<narrow> 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;;
+FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L;<narrow> 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;;
+FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L;<narrow> 3145;;;;N;;;;;
+FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L;<narrow> 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;;
+FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L;<narrow> 3147;;;;N;;;;;
+FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L;<narrow> 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;;
+FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L;<narrow> 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;;
+FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L;<narrow> 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;;
+FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L;<narrow> 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;;
+FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L;<narrow> 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;;
+FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L;<narrow> 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;;
+FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L;<narrow> 314E;;;;N;;;;;
+FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L;<narrow> 314F;;;;N;;;;;
+FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L;<narrow> 3150;;;;N;;;;;
+FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L;<narrow> 3151;;;;N;;;;;
+FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L;<narrow> 3152;;;;N;;;;;
+FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L;<narrow> 3153;;;;N;;;;;
+FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L;<narrow> 3154;;;;N;;;;;
+FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L;<narrow> 3155;;;;N;;;;;
+FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L;<narrow> 3156;;;;N;;;;;
+FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L;<narrow> 3157;;;;N;;;;;
+FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L;<narrow> 3158;;;;N;;;;;
+FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L;<narrow> 3159;;;;N;;;;;
+FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L;<narrow> 315A;;;;N;;;;;
+FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L;<narrow> 315B;;;;N;;;;;
+FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L;<narrow> 315C;;;;N;;;;;
+FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L;<narrow> 315D;;;;N;;;;;
+FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L;<narrow> 315E;;;;N;;;;;
+FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L;<narrow> 315F;;;;N;;;;;
+FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L;<narrow> 3160;;;;N;;;;;
+FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L;<narrow> 3161;;;;N;;;;;
+FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L;<narrow> 3162;;;;N;;;;;
+FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;;
+FFE0;FULLWIDTH CENT SIGN;Sc;0;ET;<wide> 00A2;;;;N;;;;;
+FFE1;FULLWIDTH POUND SIGN;Sc;0;ET;<wide> 00A3;;;;N;;;;;
+FFE2;FULLWIDTH NOT SIGN;Sm;0;ON;<wide> 00AC;;;;N;;;;;
+FFE3;FULLWIDTH MACRON;Sk;0;ON;<wide> 00AF;;;;N;FULLWIDTH SPACING MACRON;*;;;
+FFE4;FULLWIDTH BROKEN BAR;So;0;ON;<wide> 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;;
+FFE5;FULLWIDTH YEN SIGN;Sc;0;ET;<wide> 00A5;;;;N;;;;;
+FFE6;FULLWIDTH WON SIGN;Sc;0;ET;<wide> 20A9;;;;N;;;;;
+FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON;<narrow> 2502;;;;N;;;;;
+FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON;<narrow> 2190;;;;N;;;;;
+FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON;<narrow> 2191;;;;N;;;;;
+FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;;
+FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;;
+FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;;
+FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;;
+FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;;
+FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;;
+FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;;
+FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;;
+10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;;
+10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;;
+10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;;
+10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;;
+10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;;
+10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;;
+10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;;
+10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;;
+10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;;
+1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;;
+1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;;
+1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;;
+1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;;
+1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;;
+10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;;
+10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;;
+10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;;
+10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;;
+10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;;
+10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;;
+10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;;
+10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;;
+10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;;
+10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;;
+1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;;
+1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;;
+1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;;
+1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;;
+1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;;
+1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;;
+10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;;
+10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;;
+10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;;
+10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;;
+10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;;
+10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;;
+10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;;
+10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;;
+10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;;
+1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;;
+1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;;
+1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;;
+1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;;
+1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;;
+1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;;
+10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;;
+10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;;
+10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;;
+10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;;
+10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;;
+10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;;
+10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;;
+10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;;
+10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;;
+10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;;
+1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;;
+1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;;
+1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;;
+1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;;
+10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;;
+10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;;
+10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;;
+10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;;
+10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;;
+10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;;
+10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;;
+10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;;
+10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;;
+10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;;
+1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;;
+1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;;
+1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;;
+1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;;
+10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;;
+10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;;
+10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;;
+10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;;
+10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;;
+10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;;
+10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;;
+10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;;
+10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;;
+10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;;
+1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;;
+1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;;
+1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;;
+1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;;
+10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;;
+10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;;
+10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;;
+10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;;
+10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;;
+10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;;
+10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;;
+10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;;
+10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;;
+10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;;
+1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;;
+1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;;
+1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;;
+1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;;
+1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;;
+1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;;
+10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;;
+10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;;
+10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;;
+10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;;
+10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;;
+10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;;
+10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;;
+10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;;
+10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;;
+10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;;
+1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;;
+1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;;
+1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;;
+1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;;
+1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;;
+1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;;
+100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;;
+100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;;
+100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;;
+100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;;
+100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;;
+100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;;
+100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;;
+100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;;
+100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;;
+100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;;
+100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;;
+100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;;
+100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;;
+100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;;
+100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;;
+100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;;
+100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;;
+100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;;
+100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;;
+100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;;
+100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;;
+100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;;
+100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;;
+100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;;
+100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;;
+100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;;
+100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;;
+100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;;
+100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;;
+100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;;
+100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;;
+100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;;
+100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;;
+100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;;
+100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;;
+100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;;
+100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;;
+100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;;
+100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;;
+100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;;
+100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;;
+100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;pug;;;
+100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;;
+100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;gup;;;
+100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;;
+100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;;
+100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;;
+100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;;
+100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;;
+100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;;
+100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;;
+100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;;
+100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;;
+100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;;
+100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;;
+100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;;
+100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;;
+100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;;
+100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;;
+100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;;
+100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;;
+100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;;
+100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;;
+100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;;
+100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;;
+100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;;
+100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;;
+100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;;
+100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;;
+100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;;
+100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;;
+100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;;
+100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;;
+100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;;
+100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;;
+100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;;
+100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;;
+100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;;
+100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;;
+100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;;
+100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;;
+100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;;
+100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;;
+100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;;
+100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;;
+100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;;
+100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;;
+100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;;
+100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;;
+100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;;
+100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;;
+10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;;
+10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;;
+10102;AEGEAN CHECK MARK;So;0;L;;;;;N;;;;;
+10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;;
+10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;;
+10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;;
+1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;;
+1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;;
+1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;;
+1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;;
+1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;;
+1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;;
+10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;;
+10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;;
+10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;;
+10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;;
+1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;;
+1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;;
+1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;;
+1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;;
+1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;;
+10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;;
+10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;;
+10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;;
+10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;;
+10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;;
+10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;;
+10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;;
+10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;;
+10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;;
+1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;;
+1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;;
+1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;;
+1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;;
+1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;;
+10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;;
+10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;;
+10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;;
+10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;;
+10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;;
+10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;;
+1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;;
+10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;;
+10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;;
+10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;;
+10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;;
+10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;;
+10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;;
+10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;;
+1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;;
+1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;;
+1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;;
+1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;;
+1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;;
+1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;;
+10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;;
+10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;;
+10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;;
+10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;;
+10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;;
+10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;;
+10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;;
+10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;;
+10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;;
+10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;;
+10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;;
+10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;;
+10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;;
+10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;;
+1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;;
+1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;;
+10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;;
+10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;;
+10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;;
+10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;;
+10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;;
+10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;;
+10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;;
+1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;;
+1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;;
+1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;;
+1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;;
+10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;;
+10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;;
+10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;;
+10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;;
+10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;;
+10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;;
+10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;;
+10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;;
+1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;;
+10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;;
+10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;;
+10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;;
+10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;;
+10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;;
+10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;;
+10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;;
+10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;;
+10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;;
+10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;;
+1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;;
+1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;;
+101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;;
+101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;;
+101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;;
+101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;;
+101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;;
+101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;;
+101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;;
+101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;;
+101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;;
+101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;;
+101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;;
+101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;;
+101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;;
+101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;;
+101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;;
+101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;;
+101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;;
+101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;;
+101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;;
+101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;;
+101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;;
+101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;;
+101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;;
+101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;;
+101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;;
+101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;;
+101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;;
+101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;;
+101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;;
+101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;;
+101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;;
+101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;;
+101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;;
+101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;;
+101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;;
+101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;;
+101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;;
+101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;;
+101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;;
+101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;;
+101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;;
+101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;;
+101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;;
+101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;;
+101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;;
+101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;;
+10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;;
+10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;;
+10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;;
+10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;;
+10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;;
+10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;;
+10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;;
+10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;;
+10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;;
+10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;;
+1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;;
+1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;;
+1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;;
+1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;;
+1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;;
+1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;;
+10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;;
+10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;;
+10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;;
+10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;;
+10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;;
+10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;;
+10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;;
+10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;;
+10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;;
+10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;;
+1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;;
+1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;;
+1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;;
+102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;;
+102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;;
+102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;;
+102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;;
+102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;;
+102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;;
+102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;;
+102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;;
+102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;;
+102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;;
+102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;;
+102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;;
+102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;;
+102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;;
+102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;;
+102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;;
+102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;;
+102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;;
+102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;;
+102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;;
+102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;;
+102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;;
+102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;;
+102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;;
+102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;;
+102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;;
+102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;;
+102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;;
+102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;;
+102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;;
+102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;;
+102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;;
+102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;;
+102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;;
+102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;;
+102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;;
+102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;;
+102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;;
+102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;;
+102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;;
+102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;;
+102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;;
+102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;;
+102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;;
+102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;;
+102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;;
+102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;;
+102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;;
+102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;;
+10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;;
+10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;;
+10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;;
+10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;;
+10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;;
+10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;;
+10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;;
+10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;;
+10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;;
+10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;;
+1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;;
+1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;;
+1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;;
+1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;;
+1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;;
+1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;Faliscan;;;
+10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;;
+10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;;
+10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;;
+10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;;
+10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;;
+10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;;
+10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;;
+10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;Faliscan;;;
+10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;;
+10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;;
+1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;;
+1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;Umbrian;;;
+1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;Umbrian;;;
+1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;Oscan;;;
+1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;Oscan;;;
+10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;;
+10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;;
+10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;;
+10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;;
+10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;;
+10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;;
+10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;;
+10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;;
+10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;;
+10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;;
+10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;;
+10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;;
+10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;;
+10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;;
+1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;;
+1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;;
+1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;;
+1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;;
+1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;;
+1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;;
+10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;;
+10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;;
+10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;;
+10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;;
+10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;;
+10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;;
+10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;;
+10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;;
+10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;;
+10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;;
+1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;;
+10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;;
+10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;;
+10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;;
+10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;;
+10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;;
+10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;;
+10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;;
+10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;;
+10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;;
+10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;;
+1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;;
+1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;;
+1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;;
+1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;;
+1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;;
+1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;;
+10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;;
+10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;;
+10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;;
+10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;;
+10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;;
+10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;;
+10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;;
+10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;;
+10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;;
+10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;;
+1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;;
+1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;;
+1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;;
+1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;;
+1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;;
+103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;;
+103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;;
+103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;;
+103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;;
+103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;;
+103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;;
+103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;;
+103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;;
+103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;;
+103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;;
+103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;;
+103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;;
+103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;;
+103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;;
+103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;;
+103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;;
+103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;;
+103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;;
+103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;;
+103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;;
+103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;;
+103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;;
+103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;;
+103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;;
+103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;;
+103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;;
+103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;;
+103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;;
+103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;;
+103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;;
+103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;;
+103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;;
+103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;;
+103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;;
+103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;;
+103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;;
+103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;;
+103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;;
+103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;;
+103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;;
+103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;;
+103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;;
+103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;;
+103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;;
+103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;;
+103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;;
+103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;;
+103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;;
+10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428;
+10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429;
+10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A;
+10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B;
+10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C;
+10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D;
+10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E;
+10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F;
+10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430;
+10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431;
+1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432;
+1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433;
+1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434;
+1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435;
+1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436;
+1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437;
+10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438;
+10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439;
+10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A;
+10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B;
+10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C;
+10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D;
+10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E;
+10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F;
+10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440;
+10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441;
+1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442;
+1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443;
+1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444;
+1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445;
+1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446;
+1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447;
+10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448;
+10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449;
+10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A;
+10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B;
+10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C;
+10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D;
+10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E;
+10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F;
+10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400
+10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401
+1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402
+1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403
+1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404
+1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405
+1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406
+1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407
+10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408
+10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409
+10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A
+10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B
+10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C
+10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D
+10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E
+10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F
+10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410
+10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411
+1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412
+1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413
+1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414
+1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415
+1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416
+1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417
+10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418
+10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419
+10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A
+10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B
+10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C
+10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D
+10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E
+10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F
+10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420
+10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421
+1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422
+1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423
+1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424
+1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425
+1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426
+1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427
+10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;;
+10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;;
+10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;;
+10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;;
+10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;;
+10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;;
+10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;;
+10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;;
+10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;;
+10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;;
+1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;;
+1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;;
+1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;;
+1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;;
+1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;;
+1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;;
+10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;;
+10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;;
+10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;;
+10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;;
+10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;;
+10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;;
+10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;;
+10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;;
+10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;;
+10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;;
+1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;;
+1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;;
+1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;;
+1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;;
+1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;;
+1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;;
+10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;;
+10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;;
+10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;;
+10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;;
+10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;;
+10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;;
+10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;;
+10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;;
+10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;;
+10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;;
+1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;;
+1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;;
+1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;;
+1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;;
+1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;;
+1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;;
+10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;;
+10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;;
+10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;;
+10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;;
+10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;;
+10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;;
+10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;;
+10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;;
+10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;;
+1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;;
+1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;;
+1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;;
+1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;;
+1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;;
+10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;;
+10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;;
+10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;;
+10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;;
+10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;;
+10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;;
+10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;;
+10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;;
+10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;;
+10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;;
+1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;;
+1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;;
+1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;;
+1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;;
+104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;;
+10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;;
+10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;;
+10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;;
+10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;;
+10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;;
+10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;;
+1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;;
+1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;;
+1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;;
+1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;;
+1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;;
+1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;;
+10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;;
+10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;;
+10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;;
+10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;;
+10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;;
+10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;;
+10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;;
+10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;;
+10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;;
+10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;;
+1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;;
+1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;;
+1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;;
+1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;;
+1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;;
+1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;;
+10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;;
+10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;;
+10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;;
+10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;;
+10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;;
+10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;;
+10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;;
+10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;;
+10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;;
+10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;;
+1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;;
+1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;;
+1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;;
+1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;;
+1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;;
+1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;;
+10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;;
+10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;;
+10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;;
+10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;;
+10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;;
+10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;;
+10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;;
+10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;;
+1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;;
+1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;;
+10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;;
+10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;;
+10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;;
+10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;;
+10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;;
+10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;;
+10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;;
+10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;;
+10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;;
+1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;;
+1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;;
+1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;;
+1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;;
+10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;;
+10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;;
+10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;;
+10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;;
+10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;;
+10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;;
+10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;;
+10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;;
+10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;;
+10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;;
+10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;;
+10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;;
+10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;;
+10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;;
+10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;;
+1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;;
+1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;;
+1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;;
+1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;;
+1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;;
+1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;;
+10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;;
+10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;;
+10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;;
+10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;;
+10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;;
+10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;;
+10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;;
+10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;;
+10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;;
+10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;;
+1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;;
+10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;;
+10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;;
+10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;;
+10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;;
+10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;;
+10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;;
+10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;;
+10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;;
+10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;;
+10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;;
+10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;;
+10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;;
+10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;;
+10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;;
+10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;;
+10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;;
+10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;;
+10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;;
+10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;;
+10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;;
+10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;;
+10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;;
+10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;;
+10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;;
+10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;;
+10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;;
+10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;;
+10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;;
+10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;;
+10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;;
+10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;;
+10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;;
+10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;;
+10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;;
+10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;;
+10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;;
+10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;;
+10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;;
+10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;;
+10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;;
+10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;;
+10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;;
+10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;;
+10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;;
+10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;;
+10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;;
+10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;;
+10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;;
+10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;;
+10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;;
+10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;;
+10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;;
+10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;;
+12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;;
+12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;;
+12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;;
+12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;;
+12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;;
+12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;;
+12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;;
+12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;;
+1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;;
+1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;;
+1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;;
+12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;;
+12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;;
+12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;;
+12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;;
+12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;;
+1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;;
+1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;;
+1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;;
+12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;;
+12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;;
+12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;;
+12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;;
+12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;;
+12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;;
+12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;;
+12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;;
+12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;;
+1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;;
+1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;;
+1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;;
+1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;;
+1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;;
+12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;;
+12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;;
+12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;;
+12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;;
+12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;;
+12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;;
+12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;;
+12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;;
+12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;;
+1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;;
+1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;;
+1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;;
+12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;;
+12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;;
+12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;;
+12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;;
+12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;;
+12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;;
+12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;;
+12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;;
+12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;;
+12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;;
+1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;;
+1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;;
+1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;;
+1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;;
+1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;;
+12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;;
+12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;;
+12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;;
+12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;;
+12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;;
+12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;;
+12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;;
+12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;;
+12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;;
+12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;;
+1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;;
+1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;;
+1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;;
+1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;;
+12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;;
+12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;;
+12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;;
+12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;;
+12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;;
+12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;;
+12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;;
+12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;;
+12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;;
+1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;;
+1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;;
+1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;;
+1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;;
+1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;;
+12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;;
+12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;;
+12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;;
+12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;;
+12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;;
+12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;;
+12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;;
+12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;;
+12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;;
+1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;;
+1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;;
+1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;;
+1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;;
+1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;;
+1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;;
+12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;;
+12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;;
+12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;;
+12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;;
+12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;;
+12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;;
+12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;;
+1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;;
+1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;;
+1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;;
+1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;;
+1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;;
+12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;;
+12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;;
+12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;;
+12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;;
+12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;;
+12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;;
+12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;;
+1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;;
+1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;;
+1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;;
+1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;;
+1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;;
+120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;;
+120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;;
+120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;;
+120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;;
+120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;;
+120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;;
+120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;;
+120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;;
+120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;;
+120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;;
+120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;;
+120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;;
+120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;;
+120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;;
+120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;;
+120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;;
+120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;;
+120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;;
+120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;;
+120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;;
+120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;;
+120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;;
+120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;;
+120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;;
+120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;;
+120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;;
+120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;;
+120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;;
+120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;;
+120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;;
+120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;;
+120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;;
+120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;;
+120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;;
+120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;;
+120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;;
+120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;;
+120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;;
+120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;;
+120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;;
+120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;;
+120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;;
+120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;;
+120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;;
+120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;;
+120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;;
+120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;;
+120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;;
+120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;;
+120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;;
+120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;;
+120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;;
+120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;;
+120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;;
+120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;;
+120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;;
+120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;;
+120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;;
+120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;;
+120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;;
+120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;;
+120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;;
+120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;;
+120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;;
+12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;;
+12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;;
+12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;;
+12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;;
+12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;;
+12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;;
+12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;;
+12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;;
+12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;;
+12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;;
+1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;;
+1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;;
+1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;;
+12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;;
+12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;;
+12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;;
+12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;;
+12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;;
+12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;;
+12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;;
+12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;;
+1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;;
+1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;;
+1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;;
+12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;;
+12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;;
+12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;;
+12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;;
+12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;;
+12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;;
+12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;;
+12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;;
+1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;;
+1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;;
+1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;;
+1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;;
+1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;;
+1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;;
+12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;;
+12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;;
+12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;;
+12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;;
+12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;;
+12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;;
+12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;;
+1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;;
+1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;;
+1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;;
+1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;;
+12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;;
+12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;;
+12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;;
+12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;;
+12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;;
+12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;;
+12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;;
+12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;;
+12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;;
+12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;;
+1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;;
+1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;;
+1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;;
+1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;;
+1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;;
+12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;;
+12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;;
+12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;;
+12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;;
+12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;;
+12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;;
+12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;;
+12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;;
+12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;;
+1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;;
+1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;;
+1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;;
+1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;;
+12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;;
+12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;;
+12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;;
+12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;;
+12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;;
+12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;;
+12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;;
+1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;;
+1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;;
+1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;;
+1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;;
+1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;;
+12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;;
+12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;;
+12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;;
+12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;;
+12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;;
+12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;;
+12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;;
+12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;;
+12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;;
+12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;;
+1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;;
+1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;;
+1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;;
+1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;;
+1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;;
+1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;;
+12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;;
+12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;;
+12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;;
+12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;;
+12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;;
+12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;;
+12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;;
+12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;;
+12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;;
+12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;;
+1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;;
+1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;;
+1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;;
+1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;;
+1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;;
+12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;;
+12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;;
+12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;;
+12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;;
+12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;;
+12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;;
+12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;;
+12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;;
+12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;;
+1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;;
+1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;;
+1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;;
+1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;;
+121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;;
+121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;;
+121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;;
+121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;;
+121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;;
+121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;;
+121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;;
+121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;;
+121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;;
+121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;;
+121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;;
+121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;;
+121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;;
+121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;;
+121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;;
+121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;;
+121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;;
+121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;;
+121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;;
+121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;;
+121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;;
+121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;;
+121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;;
+121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;;
+121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;;
+121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;;
+121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;;
+121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;;
+121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;;
+121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;;
+121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;;
+121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;;
+121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;;
+121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;;
+121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;;
+121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;;
+121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;;
+121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;;
+121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;;
+121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;;
+121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;;
+121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;;
+121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;;
+121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;;
+121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;;
+121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;;
+121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;;
+121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;;
+121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;;
+121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;;
+121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;;
+121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;;
+121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;;
+121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;;
+121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;;
+121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;;
+121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;;
+121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;;
+121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;;
+121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;;
+121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;;
+121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;;
+121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;;
+121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;;
+121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;;
+121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;;
+121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;;
+121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;;
+121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;;
+121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;;
+121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;;
+121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;;
+121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;;
+121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;;
+121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;;
+121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;;
+121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;;
+121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;;
+121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;;
+12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;;
+12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;;
+12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;;
+12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;;
+1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;;
+1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;;
+12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;;
+12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;;
+12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;;
+12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;;
+12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;;
+12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;;
+12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;;
+12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;;
+12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;;
+12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;;
+1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;;
+1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;;
+1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;;
+1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;;
+1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;;
+1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;;
+12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;;
+12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;;
+12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;;
+12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;;
+12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;;
+12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;;
+12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;;
+12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;;
+1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;;
+1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;;
+1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;;
+1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;;
+1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;;
+1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;;
+12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;;
+12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;;
+12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;;
+12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;;
+12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;;
+12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;;
+12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;;
+12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;;
+1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;;
+1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;;
+1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;;
+1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;;
+1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;;
+1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;;
+12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;;
+12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;;
+12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;;
+12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;;
+12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;;
+12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;;
+12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;;
+12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;;
+12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;;
+12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;;
+1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;;
+1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;;
+1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;;
+1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;;
+1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;;
+1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;;
+12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;;
+12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;;
+1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;;
+12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;;
+12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;;
+12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;;
+12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;;
+12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;;
+12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;;
+12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;;
+12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;;
+1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;;
+1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;;
+1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;;
+1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;;
+12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;;
+12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;;
+12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;;
+12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;;
+1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;;
+1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;;
+1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;;
+1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;;
+1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;;
+1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;;
+12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;;
+12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;;
+12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;;
+12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;;
+12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;;
+12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;;
+12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;;
+12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;;
+12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;;
+12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;;
+1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;;
+1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;;
+1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;;
+1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;;
+1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;;
+1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;;
+12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;;
+12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;;
+12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;;
+12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;;
+12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;;
+12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;;
+12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;;
+12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;;
+12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;;
+12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;;
+1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;;
+1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;;
+1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;;
+1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;;
+1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;;
+1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;;
+122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;;
+122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;;
+122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;;
+122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;;
+122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;;
+122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;;
+122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;;
+122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;;
+122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;;
+122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;;
+122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;;
+122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;;
+122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;;
+122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;;
+122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;;
+122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;;
+122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;;
+122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;;
+122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;;
+122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;;
+122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;;
+122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;;
+122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;;
+122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;;
+122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;;
+122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;;
+122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;;
+122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;;
+122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;;
+122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;;
+122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;;
+122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;;
+122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;;
+122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;;
+122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;;
+122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;;
+122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;;
+122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;;
+122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;;
+122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;;
+122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;;
+122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;;
+122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;;
+122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;;
+122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;;
+122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;;
+122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;;
+122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;;
+122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;;
+122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;;
+122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;;
+122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;;
+122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;;
+122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;;
+122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;;
+122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;;
+122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;;
+122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;;
+122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;;
+122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;;
+122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;;
+122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;;
+122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;;
+122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;;
+122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;;
+122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;;
+122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;;
+122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;;
+122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;;
+122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;;
+122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;;
+122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;;
+122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;;
+122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;;
+122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;;
+122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;;
+122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;;
+122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;;
+122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;;
+122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;;
+122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;;
+122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;;
+122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;;
+122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;;
+122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;;
+122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;;
+122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;;
+122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;;
+122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;;
+122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;;
+122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;;
+12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;;
+12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;;
+12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;;
+12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;;
+12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;;
+12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;;
+12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;;
+12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;;
+1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;;
+1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;;
+1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;;
+1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;;
+1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;;
+12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;;
+12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;;
+12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;;
+12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;;
+12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;;
+12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;;
+12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;;
+12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;;
+12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;;
+1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;;
+1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;;
+1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;;
+1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;;
+1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;;
+12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;;
+12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;;
+12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;;
+12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;;
+12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;;
+12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;;
+12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;;
+12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;;
+1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;;
+1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;;
+1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;;
+1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;;
+12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;;
+12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;;
+12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;;
+12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;;
+12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;;
+12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;;
+12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;;
+1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;;
+1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;;
+1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;;
+1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;;
+12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;;
+12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;;
+12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;;
+12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;;
+12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;;
+12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;;
+12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;;
+12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;;
+12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;;
+12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;;
+1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;;
+1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;;
+1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;;
+1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;;
+1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;;
+1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;;
+12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;;
+12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;;
+12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;;
+12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;;
+12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;;
+12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;;
+12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;;
+12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;;
+1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;;
+1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;;
+1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;;
+1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;;
+1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;;
+12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;;
+12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;;
+12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;;
+12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;;
+12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;;
+12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;;
+12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;;
+12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;;
+12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;;
+12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;;
+1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;;
+1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;;
+1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;;
+1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;;
+1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;;
+12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;;
+12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;;
+12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;;
+12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;;
+12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;;
+12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;;
+12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;;
+12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;;
+12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;;
+12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;;
+1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;;
+1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;;
+1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;;
+1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;;
+1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;;
+1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;;
+12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;;
+12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;;
+12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;;
+12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;;
+12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;;
+12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;;
+12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;;
+12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;;
+12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;;
+12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;;
+1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;;
+1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;;
+1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;;
+1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;;
+1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;;
+1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;;
+12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;;
+12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;;
+12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;;
+12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;;
+12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;;
+12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;;
+12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;;
+12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;;
+12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;;
+1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;;
+1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;;
+1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;;
+1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;;
+1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;;
+1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;;
+12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;;
+12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;;N;;;;;
+12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;;N;;;;;
+12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;;
+12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;;
+12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;;
+12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;;
+12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;;
+1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;;
+1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;;
+1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;;
+1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;;
+1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;;
+1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;;
+12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;;
+12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;;
+12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;;
+12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;;
+12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;;
+12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;;
+12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;;
+12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;;
+12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;;
+12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;;
+1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;;
+1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;;
+1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;;
+1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;;
+1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;;
+1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;;
+12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;;
+12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;;
+12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;;
+12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;;
+12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;;
+12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;;
+12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;;N;;;;;
+12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;;N;;;;;
+12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;;
+12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;;
+1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;;
+1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;;
+1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;;
+1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;;
+1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;;
+1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;;
+12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;;
+12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;;
+12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;;
+12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;;
+12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;;
+12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;;
+1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;;
+1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;;
+1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;;
+1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;;
+1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;;
+1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;;
+1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;;
+1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;;
+1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;;
+1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;;
+1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;;
+1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;;
+1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;;
+1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;;
+1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;;
+1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;;
+1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;;
+1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;;
+1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;;
+1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;;
+1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;;
+1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;;
+1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;;
+1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;;
+1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;;
+1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;;
+1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;;
+1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;;
+1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;;
+1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;;
+1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;;
+1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;;
+1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;;
+1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;;
+1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;;
+1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;;
+1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;;
+1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;;
+1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;;
+1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;;
+1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;;
+1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;;
+1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;;
+1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;;
+1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;;
+1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;;
+1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;;
+1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;;
+1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;;
+1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;;
+1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;;
+1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;;
+1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;;
+1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;;
+1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;;
+1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;;
+1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;;
+1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;;
+1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;;
+1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;;
+1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;;
+1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;;
+1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;;
+1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;;
+1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;;
+1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;;
+1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;;
+1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;;
+1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;;
+1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;;
+1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;;
+1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;;
+1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;;
+1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;;
+1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;;
+1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;;
+1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;;
+1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;;
+1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;;
+1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;;
+1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;;
+1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;;
+1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;;
+1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;;
+1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;;
+1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;;
+1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;;
+1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;;
+1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;;
+1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;;
+1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;;
+1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;;
+1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;;
+1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;;
+1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;;
+1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;;
+1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;;
+1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;;
+1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;;
+1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;;
+1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;;
+1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;;
+1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;;
+1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;;
+1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;;
+1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;;
+1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;;
+1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;;
+1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;;
+1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;;
+1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;;
+1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;;
+1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;;
+1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;;
+1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;;
+1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;;
+1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;;
+1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;;
+1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;;
+1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;;
+1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;;
+1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;;
+1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;;
+1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;;
+1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;;
+1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;;
+1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;;
+1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;;
+1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;;
+1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;;
+1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;;
+1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;;
+1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;;
+1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;;
+1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;;
+1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;;
+1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;;
+1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;;
+1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;;
+1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;;
+1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;;
+1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;;
+1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;;
+1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;;
+1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;;
+1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;;
+1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;;
+1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;;
+1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;;
+1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;;
+1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;;
+1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;;
+1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;;
+1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;;
+1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;;
+1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;;
+1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;;
+1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;;
+1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;;
+1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;;
+1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;;
+1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;;
+1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;;
+1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;;
+1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;;
+1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;;
+1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;;
+1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;;
+1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;;
+1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;;
+1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;;
+1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;;
+1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;;
+1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;;
+1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;;
+1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;;
+1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;;
+1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;;
+1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;;
+1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;;
+1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;;
+1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;;
+1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;;
+1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;;
+1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;;
+1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;;
+1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;;
+1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;;
+1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;;
+1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;;
+1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;;
+1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;;
+1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;;
+1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;;
+1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;;
+1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;;
+1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;;
+1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;;
+1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;;
+1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;;
+1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;;
+1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;;
+1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;;
+1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;;
+1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;;
+1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;;
+1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;;
+1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;;
+1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;;
+1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;;
+1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;;
+1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;;
+1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;;
+1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;;
+1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;;
+1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;;
+1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;;
+1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;;
+1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;;
+1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;;
+1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;;
+1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;;
+1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;;
+1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;;
+1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;;
+1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;;
+1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;;
+1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;;
+1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;;
+1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;;
+1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;;
+1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;;
+1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;;
+1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;;
+1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;;
+1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;;
+1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;;
+1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;;
+1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;;
+1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;;
+1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;;
+1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;;
+1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;;
+1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;;
+1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;;
+1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;;
+1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;;
+1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;;
+1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;;
+1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;;
+1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;;
+1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;;
+1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;;
+1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;;
+1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;;
+1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;;
+1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;;
+1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;;
+1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;;
+1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;;
+1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;;
+1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;;
+1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;;
+1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;;
+1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;;
+1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;;
+1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;;
+1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;;
+1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;;
+1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;;
+1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;;
+1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;;
+1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;;
+1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;;
+1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;;
+1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;;
+1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;;
+1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;;
+1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;;
+1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;;
+1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;;
+1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;;
+1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;;
+1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;;
+1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;;
+1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;;
+1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;;
+1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;;
+1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;;
+1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;;
+1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;;
+1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;;
+1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;;
+1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;;
+1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;;
+1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;;
+1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;;
+1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;;
+1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;;
+1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;;
+1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;;
+1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;;
+1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;;
+1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;;
+1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;;
+1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;;
+1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;;
+1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;;
+1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;;
+1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;;
+1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;;
+1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;;
+1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;;
+1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;;
+1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;;
+1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;;
+1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;;
+1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;;
+1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;;
+1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;;
+1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;;
+1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;;
+1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;;
+1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;;
+1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;;
+1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;;
+1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;;
+1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;;
+1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;;
+1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;;
+1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;;
+1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;;
+1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;;
+1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;;
+1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;;
+1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;;
+1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;;
+1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;;
+1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;;
+1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;;
+1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;;
+1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;;
+1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;;
+1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;;
+1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;;
+1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;;
+1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;;
+1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;;
+1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;;
+1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;;
+1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;;
+1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;;
+1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;;
+1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;;
+1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;;
+1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;;
+1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;;
+1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;;
+1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;;
+1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;;
+1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;;
+1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;;
+1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;;
+1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;;
+1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;;
+1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;;
+1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;;
+1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;;
+1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;;
+1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;;
+1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;;
+1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;;
+1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;;
+1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;;
+1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;;
+1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;;
+1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;;
+1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;;
+1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;;
+1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;;
+1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;;
+1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;;
+1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;;
+1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;;
+1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;;
+1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;;
+1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;;
+1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;;
+1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;;
+1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;;
+1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;;
+1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;;
+1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;;
+1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;;
+1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;;
+1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;;
+1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;;
+1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;;
+1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;;
+1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;;
+1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;;
+1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;;
+1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;;
+1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;;
+1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;;
+1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;;
+1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;;
+1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;;
+1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;;
+1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;;
+1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;;
+1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;;
+1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;;
+1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;;
+1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;;
+1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;;
+1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;;
+1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;;
+1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;;
+1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;;
+1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;;
+1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;;
+1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;;
+1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;;
+1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;;
+1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;;
+1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;;
+1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;;
+1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;;
+1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;;
+1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;;
+1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;;
+1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;;
+1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;;
+1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;;
+1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;;
+1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;;
+1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;;
+1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;;
+1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;;
+1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;;
+1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;;
+1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;;
+1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;;
+1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;;
+1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;;
+1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;;
+1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;;
+1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;;
+1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;;
+1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;;
+1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;;
+1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;;
+1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;;
+1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;;
+1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;;
+1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;;
+1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;;
+1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;;
+1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;;
+1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;ren *;;;
+1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;tian ren *;;;
+1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;di ren *;;;
+1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;ren tian *;;;
+1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;ren di *;;;
+1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;ren ren *;;;
+1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;;
+1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;;
+1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;;
+1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;;
+1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;;
+1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;;
+1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;;
+1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;;
+1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;;
+1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;;
+1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;;
+1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;;
+1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;;
+1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;;
+1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;;
+1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;;
+1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;;
+1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;;
+1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;;
+1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;;
+1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;;
+1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;;
+1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;;
+1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;;
+1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;;
+1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;;
+1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;;
+1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;;
+1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;;
+1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;;
+1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;;
+1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;;
+1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;;
+1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;;
+1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;;
+1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;;
+1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;;
+1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;;
+1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;;
+1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;;
+1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;;
+1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;;
+1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;;
+1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;;
+1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;;
+1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;;
+1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;;
+1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;;
+1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;;
+1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;;
+1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;;
+1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;;
+1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;;
+1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;;
+1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;;
+1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;;
+1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;;
+1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;;
+1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;;
+1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;;
+1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;;
+1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;;
+1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;;
+1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;;
+1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;;
+1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;;
+1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;;
+1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;;
+1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;;
+1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;;
+1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;;
+1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;;
+1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;;
+1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;;
+1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;;
+1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;;
+1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;;
+1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;;
+1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;;
+1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;;
+1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;;
+1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;;
+1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;;
+1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;;
+1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;;
+1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;;
+1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;;
+1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;;
+1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;;
+1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;;
+1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;;
+1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;;
+1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;;
+1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;;
+1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;;
+1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;;
+1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;;
+1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;;
+1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;;
+1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;;
+1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;;
+1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;;
+1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;;
+1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;;
+1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;;
+1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;;
+1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;;
+1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;;
+1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;;
+1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;;
+1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;;
+1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;;
+1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;;
+1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;;
+1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;;
+1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;;
+1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;;
+1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;;
+1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;;
+1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;;
+1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;;
+1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;;
+1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;;
+1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;;
+1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;;
+1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;;
+1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;;
+1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;;
+1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;;
+1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;;
+1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;;
+1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;;
+1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;;
+1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;;
+1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;;
+1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;;
+1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;;
+1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;;
+1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;;
+1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;;
+1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;;
+1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;;
+1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;;
+1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;;
+1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;;
+1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;;
+1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;;
+1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;;
+1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;;
+1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;;
+1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;;
+1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;;
+1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;;
+1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;;
+1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;;
+1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;;
+1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;;
+1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;;
+1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;;
+1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;;
+1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;;
+1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;;
+1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;;
+1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;;
+1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;;
+1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;;
+1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;;
+1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;;
+1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;;
+1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;;
+1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;;
+1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;;
+1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;;
+1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;;
+1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;;
+1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;;
+1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;;
+1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;;
+1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;;
+1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;;
+1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;;
+1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;;
+1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;;
+1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;;
+1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;;
+1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;;
+1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;;
+1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;;
+1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;;
+1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;;
+1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;;
+1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;;
+1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;;
+1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;;
+1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;;
+1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;;
+1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;;
+1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;;
+1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;;
+1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;;
+1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;;
+1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;;
+1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;;
+1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;;
+1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;;
+1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;;
+1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;;
+1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;;
+1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;;
+1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;;
+1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;;
+1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;;
+1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;;
+1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;;
+1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;;
+1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;;
+20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
+2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
+2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;;
+2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;;
+2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;;
+2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;;
+2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;;
+2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;;
+2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;;
+2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;;
+2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;;
+2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;;
+2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;;
+2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;;
+2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;;
+2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;;
+2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;;
+2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;;
+2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;;
+2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;;
+2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;;
+2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;;
+2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;;
+2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;;
+2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;;
+2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;;
+2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;;
+2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;;
+2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;;
+2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;;
+2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;;
+2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;;
+2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;;
+2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;;
+2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;;
+2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;;
+2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;;
+2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;;
+2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;;
+2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;;
+2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;;
+2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;;
+2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;;
+2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;;
+2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;;
+2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;;
+2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;;
+2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;;
+2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;;
+2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;;
+2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;;
+2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;;
+2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;;
+2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;;
+2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;;
+2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;;
+2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;;
+2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;;
+2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;;
+2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;;
+2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;;
+2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;;
+2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;;
+2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;;
+2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;;
+2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;;
+2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;;
+2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;;
+2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;;
+2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;;
+2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;;
+2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;;
+2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;;
+2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;;
+2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;;
+2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;;
+2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;;
+2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;;
+2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;;
+2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;;
+2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;;
+2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;;
+2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;;
+2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;;
+2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;;
+2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;;
+2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;;
+2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;;
+2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;;
+2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;;
+2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;;
+2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;;
+2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;;
+2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;;
+2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;;
+2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;;
+2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;;
+2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;;
+2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;;
+2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;;
+2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;;
+2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;;
+2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;;
+2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;;
+2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;;
+2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;;
+2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;;
+2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;;
+2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;;
+2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;;
+2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;;
+2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;;
+2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;;
+2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;;
+2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;;
+2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;;
+2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;;
+2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;;
+2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;;
+2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;;
+2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;;
+2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;;
+2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;;
+2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;;
+2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;;
+2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;;
+2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;;
+2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;;
+2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;;
+2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;;
+2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;;
+2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;;
+2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;;
+2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;;
+2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;;
+2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;;
+2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;;
+2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;;
+2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;;
+2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;;
+2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;;
+2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;;
+2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;;
+2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;;
+2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;;
+2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;;
+2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;;
+2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;;
+2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;;
+2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;;
+2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;;
+2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;;
+2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;;
+2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;;
+2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;;
+2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;;
+2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;;
+2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;;
+2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;;
+2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;;
+2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;;
+2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;;
+2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;;
+2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;;
+2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;;
+2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;;
+2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;;
+2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;;
+2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;;
+2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;;
+2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;;
+2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;;
+2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;;
+2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;;
+2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;;
+2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;;
+2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;;
+2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;;
+2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;;
+2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;;
+2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;;
+2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;;
+2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;;
+2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;;
+2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;;
+2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;;
+2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;;
+2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;;
+2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;;
+2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;;
+2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;;
+2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;;
+2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;;
+2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;;
+2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;;
+2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;;
+2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;;
+2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;;
+2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;;
+2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;;
+2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;;
+2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;;
+2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;;
+2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;;
+2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;;
+2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;;
+2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;;
+2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;;
+2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;;
+2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;;
+2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;;
+2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;;
+2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;;
+2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;;
+2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;;
+2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;;
+2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;;
+2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;;
+2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;;
+2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;;
+2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;;
+2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;;
+2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;;
+2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;;
+2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;;
+2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;;
+2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;;
+2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;;
+2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;;
+2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;;
+2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;;
+2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;;
+2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;;
+2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;;
+2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;;
+2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;;
+2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;;
+2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;;
+2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;;
+2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;;
+2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;;
+2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;;
+2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;;
+2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;;
+2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;;
+2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;;
+2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;;
+2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;;
+2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;;
+2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;;
+2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;;
+2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;;
+2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;;
+2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;;
+2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;;
+2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;;
+2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;;
+2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;;
+2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;;
+2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;;
+2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;;
+2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;;
+2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;;
+2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;;
+2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;;
+2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;;
+2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;;
+2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;;
+2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;;
+2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;;
+2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;;
+2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;;
+2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;;
+2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;;
+2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;;
+2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;;
+2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;;
+2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;;
+2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;;
+2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;;
+2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;;
+2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;;
+2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;;
+2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;;
+2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;;
+2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;;
+2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;;
+2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;;
+2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;;
+2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;;
+2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;;
+2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;;
+2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;;
+2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;;
+2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;;
+2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;;
+2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;;
+2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;;
+2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;;
+2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;;
+2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;;
+2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;;
+2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;;
+2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;;
+2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;;
+2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;;
+2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;;
+2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;;
+2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;;
+2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;;
+2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;;
+2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;;
+2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;;
+2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;;
+2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;;
+2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;;
+2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;;
+2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;;
+2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;;
+2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;;
+2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;;
+2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;;
+2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;;
+2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;;
+2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;;
+2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;;
+2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;;
+2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;;
+2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;;
+2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;;
+2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;;
+2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;;
+2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;;
+2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;;
+2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;;
+2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;;
+2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;;
+2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;;
+2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;;
+2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;;
+2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;;
+2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;;
+2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;;
+2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;;
+2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;;
+2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;;
+2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;;
+2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;;
+2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;;
+2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;;
+2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;;
+2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;;
+2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;;
+2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;;
+2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;;
+2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;;
+2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;;
+2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;;
+2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;;
+2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;;
+2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;;
+2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;;
+2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;;
+2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;;
+2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;;
+2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;;
+2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;;
+2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;;
+2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;;
+2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;;
+2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;;
+2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;;
+2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;;
+2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;;
+2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;;
+2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;;
+2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;;
+2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;;
+2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;;
+2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;;
+2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;;
+2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;;
+2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;;
+2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;;
+2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;;
+2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;;
+2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;;
+2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;;
+2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;;
+2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;;
+2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;;
+2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;;
+2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;;
+2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;;
+2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;;
+2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;;
+2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;;
+2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;;
+2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;;
+2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;;
+2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;;
+2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;;
+2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;;
+2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;;
+2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;;
+2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;;
+2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;;
+2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;;
+2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;;
+2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;;
+2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;;
+2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;;
+2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;;
+2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;;
+2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;;
+2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;;
+2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;;
+2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;;
+2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;;
+2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;;
+2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;;
+2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;;
+2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;;
+2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;;
+2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;;
+2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;;
+2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;;
+2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;;
+2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;;
+2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;;
+2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;;
+2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;;
+2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;;
+2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;;
+2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;;
+2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;;
+2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;;
+2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;;
+2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;;
+2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;;
+2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;;
+2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;;
+2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;;
+2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;;
+2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;;
+2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;;
+2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;;
+2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;;
+2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;;
+2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;;
+2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;;
+2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;;
+2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;;
+2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;;
+2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;;
+2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;;
+2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;;
+2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;;
+2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;;
+2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;;
+2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;;
+2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;;
+2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;;
+2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;;
+2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;;
+2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;;
+2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;;
+2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;;
+2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;;
+2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;;
+2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;;
+2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;;
+2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;;
+2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;;
+2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;;
+2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;;
+2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;;
+2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;;
+2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;;
+2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;;
+2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;;
+2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;;
+2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;;
+2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;;
+2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;;
+2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;;
+2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;;
+2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;;
+2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;;
+2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;;
+2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;;
+2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;;
+2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;;
+2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;;
+2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;;
+2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;;
+2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;;
+2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;;
+2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;;
+2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;;
+2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;;
+2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;;
+2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;;
+2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;;
+2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;;
+2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;;
+2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;;
+2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;;
+2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;;
+2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;;
+2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;;
+2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;;
+2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;;
+2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;;
+2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;;
+2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;;
+2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;;
+2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;;
+2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;;
+2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;;
+2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;;
+2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;;
+2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;;
+2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;;
+2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;;
+2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;;
+2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;;
+2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;;
+2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;;
+2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;;
+2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;;
+2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;;
+2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;;
+2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;;
+2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;;
+2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;;
+2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;;
+2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;;
+2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;;
+2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;;
+2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;;
+2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;;
+2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;;
+2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;;
+E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;;
+E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;;
+E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;;
+E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;;
+E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;;
+E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;;
+E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;;
+E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;;
+E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;
+E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;;
+E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;;
+E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;;
+E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;;
+E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;;
+E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;;
+E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;;
+E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;;
+E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;;
+E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;;
+E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;;
+E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;;
+E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;;
+E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;;
+E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;;
+E003A;TAG COLON;Cf;0;BN;;;;;N;;;;;
+E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;;
+E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;;
+E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;;
+E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;;
+E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;;
+E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;;
+E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;;
+E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;;
+E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;;
+E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;;
+E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;;
+E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;;
+E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;;
+E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;;
+E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;;
+E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;;
+E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;;
+E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;;
+E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;;
+E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;;
+E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;;
+E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;;
+E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;;
+E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;;
+E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;;
+E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;;
+E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;;
+E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;;
+E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;;
+E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;;
+E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;;
+E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;;
+E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;;
+E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;;
+E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;;
+E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;;
+E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;;
+E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;;
+E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;;
+E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;;
+E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;;
+E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;;
+E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;;
+E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;;
+E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;;
+E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;;
+E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;;
+E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;;
+E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;;
+E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;;
+E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;;
+E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;;
+E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;;
+E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;;
+E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;;
+E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;;
+E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;;
+E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;;
+E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;;
+E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;;
+E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;;
+E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;;
+E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;;
+E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;;
+E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;;
+E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;;
+E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;;
+E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;;
+E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;;
+E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;;
+E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;;
+E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;;
+E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;;
+E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;;
+E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;;
+E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;;
+E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;;
+E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;;
+E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;;
+E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;;
+E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;;
+E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;;
+E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;;
+E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;;
+E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;;
+E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;;
+E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;;
+E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;;
+E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;;
+E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;;
+E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;;
+E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;;
+E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;;
+E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;;
+E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;;
+E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;;
+E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;;
+E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;;
+E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;;
+E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;;
+E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;;
+E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;;
+E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;;
+E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;;
+E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;;
+E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;;
+E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;;
+E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;;
+E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;;
+E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;;
+E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;;
+E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;;
+E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;;
+E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;;
+E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;;
+E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;;
+E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;;
+E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;;
+E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;;
+E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;;
+E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;;
+E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;;
+E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;;
+E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;;
+E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;;
+E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;;
+E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;;
+E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;;
+E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;;
+E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;;
+E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;;
+E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;;
+E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;;
+E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;;
+E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;;
+E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;;
+E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;;
+E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;;
+E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;;
+E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;;
+E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;;
+E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;;
+E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;;
+E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;;
+E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;;
+E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;;
+E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;;
+E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;;
+E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;;
+E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;;
+E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;;
+E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;;
+E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;;
+E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;;
+E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;;
+E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;;
+E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;;
+E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;;
+E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;;
+E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;;
+E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;;
+E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;;
+E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;;
+E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;;
+E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;;
+E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;;
+E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;;
+E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;;
+E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;;
+E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;;
+E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;;
+E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;;
+E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;;
+E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;;
+E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;;
+E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;;
+E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;;
+E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;;
+E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;;
+E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;;
+E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;;
+E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;;
+E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;;
+E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;;
+E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;;
+E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;;
+E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;;
+E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;;
+E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;;
+E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;;
+E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;;
+E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;;
+E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;;
+E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;;
+E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;;
+E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;;
+E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;;
+E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;;
+E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;;
+E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;;
+E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;;
+E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;;
+E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;;
+E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;;
+E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;;
+E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;;
+E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;;
+E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;;
+E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;;
+E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;;
+E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;;
+E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;;
+E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;;
+E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;;
+E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;;
+E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;;
+E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;;
+E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;;
+E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;;
+E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;;
+E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;;
+E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;;
+E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;;
+E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;;
+E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;;
+E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;;
+E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;;
+E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;;
+E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;;
+E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;;
+E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;;
+E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;;
+E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;;
+E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;;
+E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;;
+E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;;
+E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;;
+E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;;
+E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;;
+E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;;
+E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;;
+E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;;
+E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;;
+E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;;
+E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;;
+E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;;
+E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;;
+E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;;
+E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;;
+E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;;
+E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;;
+E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;;
+E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;;
+E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;;
+E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;;
+E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;;
+E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;;
+E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;;
+E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;;
+E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;;
+E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;;
+E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;;
+F0000;<Plane 15 Private Use, First>;Co;0;L;;;;;N;;;;;
+FFFFD;<Plane 15 Private Use, Last>;Co;0;L;;;;;N;;;;;
+100000;<Plane 16 Private Use, First>;Co;0;L;;;;;N;;;;;
+10FFFD;<Plane 16 Private Use, Last>;Co;0;L;;;;;N;;;;;
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/AL.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/AL.pl
new file mode 100755
index 00000000000..e7ec056e199
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/AL.pl
@@ -0,0 +1,35 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Arabic_Letter'
+#
+return <<'END';
+0608
+060B
+060D
+061B
+061E 061F
+0621 064A
+066D 066F
+0671 06D5
+06E5 06E6
+06EE 06EF
+06FA 070D
+0710
+0712 072F
+074D 07A5
+07B1
+FB50 FBB1
+FBD3 FD3D
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFC
+FE70 FE74
+FE76 FEFC
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/AN.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/AN.pl
new file mode 100755
index 00000000000..a74fcecd269
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/AN.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Arabic_Number'
+#
+return <<'END';
+0600 0603
+0660 0669
+066B 066C
+06DD
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/B.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/B.pl
new file mode 100755
index 00000000000..6b669ef2e82
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/B.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Paragraph_Separator'
+#
+return <<'END';
+000A
+000D
+001C 001E
+0085
+2029
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/BN.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/BN.pl
new file mode 100755
index 00000000000..9cde85ba04f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/BN.pl
@@ -0,0 +1,26 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Boundary_Neutral'
+#
+return <<'END';
+0000 0008
+000E 001B
+007F 0084
+0086 009F
+00AD
+070F
+200B 200D
+2060 2064
+206A 206F
+FEFF
+1D173 1D17A
+E0001
+E0020 E007F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/CS.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/CS.pl
new file mode 100755
index 00000000000..8cc1b46f7a1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/CS.pl
@@ -0,0 +1,26 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Common_Separator'
+#
+return <<'END';
+002C
+002E 002F
+003A
+00A0
+060C
+202F
+2044
+FE50
+FE52
+FE55
+FF0C
+FF0E FF0F
+FF1A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/EN.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/EN.pl
new file mode 100755
index 00000000000..17388a926d4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/EN.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'European_Number'
+#
+return <<'END';
+0030 0039
+00B2 00B3
+00B9
+06F0 06F9
+2070
+2074 2079
+2080 2089
+2488 249B
+FF10 FF19
+1D7CE 1D7FF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/ES.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/ES.pl
new file mode 100755
index 00000000000..a6b05df41a4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/ES.pl
@@ -0,0 +1,22 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'European_Separator'
+#
+return <<'END';
+002B
+002D
+207A 207B
+208A 208B
+2212
+FB29
+FE62 FE63
+FF0B
+FF0D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/ET.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/ET.pl
new file mode 100755
index 00000000000..6f3672815fc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/ET.pl
@@ -0,0 +1,32 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'European_Terminator'
+#
+return <<'END';
+0023 0025
+00A2 00A5
+00B0 00B1
+0609 060A
+066A
+09F2 09F3
+0AF1
+0BF9
+0E3F
+17DB
+2030 2034
+20A0 20B5
+212E
+2213
+FE5F
+FE69 FE6A
+FF03 FF05
+FFE0 FFE1
+FFE5 FFE6
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/L.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/L.pl
new file mode 100755
index 00000000000..3061c7b733f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/L.pl
@@ -0,0 +1,457 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Left_To_Right'
+#
+return <<'END';
+0041 005A
+0061 007A
+00AA
+00B5
+00BA
+00C0 00D6
+00D8 00F6
+00F8 02B8
+02BB 02C1
+02D0 02D1
+02E0 02E4
+02EE
+0370 0373
+0376 0377
+037A 037D
+0386
+0388 038A
+038C
+038E 03A1
+03A3 03F5
+03F7 0482
+048A 0523
+0531 0556
+0559 055F
+0561 0587
+0589
+0903 0939
+093D 0940
+0949 094C
+0950
+0958 0961
+0964 0972
+097B 097F
+0982 0983
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BD 09C0
+09C7 09C8
+09CB 09CC
+09CE
+09D7
+09DC 09DD
+09DF 09E1
+09E6 09F1
+09F4 09FA
+0A03
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A3E 0A40
+0A59 0A5C
+0A5E
+0A66 0A6F
+0A72 0A74
+0A83
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABD 0AC0
+0AC9
+0ACB 0ACC
+0AD0
+0AE0 0AE1
+0AE6 0AEF
+0B02 0B03
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3D 0B3E
+0B40
+0B47 0B48
+0B4B 0B4C
+0B57
+0B5C 0B5D
+0B5F 0B61
+0B66 0B71
+0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BBE 0BBF
+0BC1 0BC2
+0BC6 0BC8
+0BCA 0BCC
+0BD0
+0BD7
+0BE6 0BF2
+0C01 0C03
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D
+0C41 0C44
+0C58 0C59
+0C60 0C61
+0C66 0C6F
+0C7F
+0C82 0C83
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBD 0CC4
+0CC6 0CC8
+0CCA 0CCB
+0CD5 0CD6
+0CDE
+0CE0 0CE1
+0CE6 0CEF
+0D02 0D03
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D 0D40
+0D46 0D48
+0D4A 0D4C
+0D57
+0D60 0D61
+0D66 0D75
+0D79 0D7F
+0D82 0D83
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0DCF 0DD1
+0DD8 0DDF
+0DF2 0DF4
+0E01 0E30
+0E32 0E33
+0E40 0E46
+0E4F 0E5B
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB0
+0EB2 0EB3
+0EBD
+0EC0 0EC4
+0EC6
+0ED0 0ED9
+0EDC 0EDD
+0F00 0F17
+0F1A 0F34
+0F36
+0F38
+0F3E 0F47
+0F49 0F6C
+0F7F
+0F85
+0F88 0F8B
+0FBE 0FC5
+0FC7 0FCC
+0FCE 0FD4
+1000 102C
+1031
+1038
+103B 103C
+103F 1057
+105A 105D
+1061 1070
+1075 1081
+1083 1084
+1087 108C
+108E 1099
+109E 10C5
+10D0 10FC
+1100 1159
+115F 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+1360 137C
+1380 138F
+13A0 13F4
+1401 1676
+1681 169A
+16A0 16F0
+1700 170C
+170E 1711
+1720 1731
+1735 1736
+1740 1751
+1760 176C
+176E 1770
+1780 17B6
+17BE 17C5
+17C7 17C8
+17D4 17DA
+17DC
+17E0 17E9
+1810 1819
+1820 1877
+1880 18A8
+18AA
+1900 191C
+1923 1926
+1929 192B
+1930 1931
+1933 1938
+1946 196D
+1970 1974
+1980 19A9
+19B0 19C9
+19D0 19D9
+1A00 1A16
+1A19 1A1B
+1A1E 1A1F
+1B04 1B33
+1B35
+1B3B
+1B3D 1B41
+1B43 1B4B
+1B50 1B6A
+1B74 1B7C
+1B82 1BA1
+1BA6 1BA7
+1BAA
+1BAE 1BB9
+1C00 1C2B
+1C34 1C35
+1C3B 1C49
+1C4D 1C7F
+1D00 1DBF
+1E00 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FBC
+1FBE
+1FC2 1FC4
+1FC6 1FCC
+1FD0 1FD3
+1FD6 1FDB
+1FE0 1FEC
+1FF2 1FF4
+1FF6 1FFC
+200E
+2071
+207F
+2090 2094
+2102
+2107
+210A 2113
+2115
+2119 211D
+2124
+2126
+2128
+212A 212D
+212F 2139
+213C 213F
+2145 2149
+214E 214F
+2160 2188
+2336 237A
+2395
+249C 24E9
+26AC
+2800 28FF
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CE4
+2D00 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+3005 3007
+3021 3029
+3031 3035
+3038 303C
+3041 3096
+309D 309F
+30A1 30FA
+30FC 30FF
+3105 312D
+3131 318E
+3190 31B7
+31F0 321C
+3220 3243
+3260 327B
+327F 32B0
+32C0 32CB
+32D0 32FE
+3300 3376
+337B 33DD
+33E0 33FE
+A000 A48C
+A500 A60C
+A610 A62B
+A640 A65F
+A662 A66E
+A680 A697
+A722 A787
+A789 A78C
+A7FB A801
+A803 A805
+A807 A80A
+A80C A824
+A827
+A840 A873
+A880 A8C3
+A8CE A8D9
+A900 A925
+A92E A946
+A952 A953
+A95F
+AA00 AA28
+AA2F AA30
+AA33 AA34
+AA40 AA42
+AA44 AA4B
+AA4D
+AA50 AA59
+AA5C AA5F
+F900 FA2D
+FA30 FA6A
+FA70 FAD9
+FB00 FB06
+FB13 FB17
+FF21 FF3A
+FF41 FF5A
+FF66 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10100
+10102
+10107 10133
+10137 1013F
+101D0 101FC
+10280 1029C
+102A0 102D0
+10300 1031E
+10320 10323
+10330 1034A
+10380 1039D
+1039F 103C3
+103C8 103D5
+10400 1049D
+104A0 104A9
+12000 1236E
+12400 12462
+12470 12473
+1D000 1D0F5
+1D100 1D126
+1D129 1D166
+1D16A 1D172
+1D183 1D184
+1D18C 1D1A9
+1D1AE 1D1DD
+1D360 1D371
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D7CB
+2F800 2FA1D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/LRE.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/LRE.pl
new file mode 100755
index 00000000000..5dac85719b2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/LRE.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Left_To_Right_Embedding'
+#
+return <<'END';
+202A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/LRO.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/LRO.pl
new file mode 100755
index 00000000000..6e83c237ef1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/LRO.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Left_To_Right_Override'
+#
+return <<'END';
+202D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/NSM.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/NSM.pl
new file mode 100755
index 00000000000..b6706691b8d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/NSM.pl
@@ -0,0 +1,169 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Nonspacing_Mark'
+#
+return <<'END';
+0300 036F
+0483 0489
+0591 05BD
+05BF
+05C1 05C2
+05C4 05C5
+05C7
+0610 061A
+064B 065E
+0670
+06D6 06DC
+06DE 06E4
+06E7 06E8
+06EA 06ED
+0711
+0730 074A
+07A6 07B0
+07EB 07F3
+0901 0902
+093C
+0941 0948
+094D
+0951 0954
+0962 0963
+0981
+09BC
+09C1 09C4
+09CD
+09E2 09E3
+0A01 0A02
+0A3C
+0A41 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A70 0A71
+0A75
+0A81 0A82
+0ABC
+0AC1 0AC5
+0AC7 0AC8
+0ACD
+0AE2 0AE3
+0B01
+0B3C
+0B3F
+0B41 0B44
+0B4D
+0B56
+0B62 0B63
+0B82
+0BC0
+0BCD
+0C3E 0C40
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C62 0C63
+0CBC
+0CCC 0CCD
+0CE2 0CE3
+0D41 0D44
+0D4D
+0D62 0D63
+0DCA
+0DD2 0DD4
+0DD6
+0E31
+0E34 0E3A
+0E47 0E4E
+0EB1
+0EB4 0EB9
+0EBB 0EBC
+0EC8 0ECD
+0F18 0F19
+0F35
+0F37
+0F39
+0F71 0F7E
+0F80 0F84
+0F86 0F87
+0F90 0F97
+0F99 0FBC
+0FC6
+102D 1030
+1032 1037
+1039 103A
+103D 103E
+1058 1059
+105E 1060
+1071 1074
+1082
+1085 1086
+108D
+135F
+1712 1714
+1732 1734
+1752 1753
+1772 1773
+17B7 17BD
+17C6
+17C9 17D3
+17DD
+180B 180D
+18A9
+1920 1922
+1927 1928
+1932
+1939 193B
+1A17 1A18
+1B00 1B03
+1B34
+1B36 1B3A
+1B3C
+1B42
+1B6B 1B73
+1B80 1B81
+1BA2 1BA5
+1BA8 1BA9
+1C2C 1C33
+1C36 1C37
+1DC0 1DE6
+1DFE 1DFF
+20D0 20F0
+2DE0 2DFF
+302A 302F
+3099 309A
+A66F A672
+A67C A67D
+A802
+A806
+A80B
+A825 A826
+A8C4
+A926 A92D
+A947 A951
+AA29 AA2E
+AA31 AA32
+AA35 AA36
+AA43
+AA4C
+FB1E
+FE00 FE0F
+FE20 FE26
+101FD
+10A01 10A03
+10A05 10A06
+10A0C 10A0F
+10A38 10A3A
+10A3F
+1D167 1D169
+1D17B 1D182
+1D185 1D18B
+1D1AA 1D1AD
+1D242 1D244
+E0100 E01EF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/ON.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/ON.pl
new file mode 100755
index 00000000000..2d7bfc2f173
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/ON.pl
@@ -0,0 +1,166 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Other_Neutral'
+#
+return <<'END';
+0021 0022
+0026 002A
+003B 0040
+005B 0060
+007B 007E
+00A1
+00A6 00A9
+00AB 00AC
+00AE 00AF
+00B4
+00B6 00B8
+00BB 00BF
+00D7
+00F7
+02B9 02BA
+02C2 02CF
+02D2 02DF
+02E5 02ED
+02EF 02FF
+0374 0375
+037E
+0384 0385
+0387
+03F6
+058A
+0606 0607
+060E 060F
+06E9
+07F6 07F9
+0BF3 0BF8
+0BFA
+0C78 0C7E
+0CF1 0CF2
+0F3A 0F3D
+1390 1399
+169B 169C
+17F0 17F9
+1800 180A
+1940
+1944 1945
+19DE 19FF
+1FBD
+1FBF 1FC1
+1FCD 1FCF
+1FDD 1FDF
+1FED 1FEF
+1FFD 1FFE
+2010 2027
+2035 2043
+2045 205E
+207C 207E
+208C 208E
+2100 2101
+2103 2106
+2108 2109
+2114
+2116 2118
+211E 2123
+2125
+2127
+2129
+213A 213B
+2140 2144
+214A 214D
+2153 215F
+2190 2211
+2214 2335
+237B 2394
+2396 23E7
+2400 2426
+2440 244A
+2460 2487
+24EA 269D
+26A0 26AB
+26AD 26BC
+26C0 26C3
+2701 2704
+2706 2709
+270C 2727
+2729 274B
+274D
+274F 2752
+2756
+2758 275E
+2761 2794
+2798 27AF
+27B1 27BE
+27C0 27CA
+27CC
+27D0 27FF
+2900 2B4C
+2B50 2B54
+2CE5 2CEA
+2CF9 2CFF
+2E00 2E30
+2E80 2E99
+2E9B 2EF3
+2F00 2FD5
+2FF0 2FFB
+3001 3004
+3008 3020
+3030
+3036 3037
+303D 303F
+309B 309C
+30A0
+30FB
+31C0 31E3
+321D 321E
+3250 325F
+327C 327E
+32B1 32BF
+32CC 32CF
+3377 337A
+33DE 33DF
+33FF
+4DC0 4DFF
+A490 A4C6
+A60D A60F
+A673
+A67E A67F
+A700 A721
+A788
+A828 A82B
+A874 A877
+FD3E FD3F
+FDFD
+FE10 FE19
+FE30 FE4F
+FE51
+FE54
+FE56 FE5E
+FE60 FE61
+FE64 FE66
+FE68
+FE6B
+FF01 FF02
+FF06 FF0A
+FF1B FF20
+FF3B FF40
+FF5B FF65
+FFE2 FFE4
+FFE8 FFEE
+FFF9 FFFD
+10101
+10140 1018A
+10190 1019B
+1091F
+1D200 1D241
+1D245
+1D300 1D356
+1F000 1F02B
+1F030 1F093
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/PDF.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/PDF.pl
new file mode 100755
index 00000000000..765eeb1a5b5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/PDF.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Pop_Directional_Format'
+#
+return <<'END';
+202C
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/R.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/R.pl
new file mode 100755
index 00000000000..5ef4fb2bbc5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/R.pl
@@ -0,0 +1,46 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Right_To_Left'
+#
+return <<'END';
+05BE
+05C0
+05C3
+05C6
+05D0 05EA
+05F0 05F4
+07C0 07EA
+07F4 07F5
+07FA
+200F
+FB1D
+FB1F FB28
+FB2A FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FB4F
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10919
+10920 10939
+1093F
+10A00
+10A10 10A13
+10A15 10A17
+10A19 10A33
+10A40 10A47
+10A50 10A58
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/RLE.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/RLE.pl
new file mode 100755
index 00000000000..29a9b105818
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/RLE.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Right_To_Left_Embedding'
+#
+return <<'END';
+202B
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/RLO.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/RLO.pl
new file mode 100755
index 00000000000..7736447ecd9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/RLO.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Right_To_Left_Override'
+#
+return <<'END';
+202E
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/S.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/S.pl
new file mode 100755
index 00000000000..b498265bf4d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/S.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'Segment_Separator'
+#
+return <<'END';
+0009
+000B
+001F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/WS.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/WS.pl
new file mode 100755
index 00000000000..d71429d8f88
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/bc/WS.pl
@@ -0,0 +1,21 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# BidiClass category 'White_Space'
+#
+return <<'END';
+000C
+0020
+1680
+180E
+2000 200A
+2028
+205F
+3000
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/A.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/A.pl
new file mode 100755
index 00000000000..46cb8892c3c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/A.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Above'
+#
+return <<'END';
+00E6
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/AL.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/AL.pl
new file mode 100755
index 00000000000..5384fcdeff1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/AL.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Above_Left'
+#
+return <<'END';
+00E4
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/AR.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/AR.pl
new file mode 100755
index 00000000000..947f5320369
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/AR.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Above_Right'
+#
+return <<'END';
+00E8
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/ATAR.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/ATAR.pl
new file mode 100755
index 00000000000..6b377c92999
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/ATAR.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Attached_Above_Right'
+#
+return <<'END';
+00D8
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/ATB.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/ATB.pl
new file mode 100755
index 00000000000..205b549790d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/ATB.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Attached_Below'
+#
+return <<'END';
+00CA
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/ATBL.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/ATBL.pl
new file mode 100755
index 00000000000..70447c52629
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/ATBL.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Attached_Below_Left'
+#
+return <<'END';
+00C8
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/B.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/B.pl
new file mode 100755
index 00000000000..85689e30401
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/B.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Below'
+#
+return <<'END';
+00DC
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/BL.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/BL.pl
new file mode 100755
index 00000000000..3d1e5dd5a27
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/BL.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Below_Left'
+#
+return <<'END';
+00DA
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/BR.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/BR.pl
new file mode 100755
index 00000000000..43ecb6afb6f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/BR.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Below_Right'
+#
+return <<'END';
+00DE
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/DA.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/DA.pl
new file mode 100755
index 00000000000..c251e3fbf78
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/DA.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Double_Above'
+#
+return <<'END';
+00EA
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/DB.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/DB.pl
new file mode 100755
index 00000000000..ff65ab1d85a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/DB.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Double_Below'
+#
+return <<'END';
+00E9
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/IS.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/IS.pl
new file mode 100755
index 00000000000..2ef59a153f2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/IS.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Iota_Subscript'
+#
+return <<'END';
+00F0
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/KV.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/KV.pl
new file mode 100755
index 00000000000..fc45fb8c028
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/KV.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Kana_Voicing'
+#
+return <<'END';
+0008
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/L.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/L.pl
new file mode 100755
index 00000000000..23eee945f16
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/L.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Left'
+#
+return <<'END';
+00E0
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/NK.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/NK.pl
new file mode 100755
index 00000000000..685a06272ac
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/NK.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Nukta'
+#
+return <<'END';
+0007
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/NR.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/NR.pl
new file mode 100755
index 00000000000..67e132c46bb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/NR.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Not_Reordered'
+#
+return <<'END';
+0000
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/OV.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/OV.pl
new file mode 100755
index 00000000000..a540c4070be
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/OV.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Overlay'
+#
+return <<'END';
+0001
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/R.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/R.pl
new file mode 100755
index 00000000000..84e3d954db0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/R.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Right'
+#
+return <<'END';
+00E2
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/VR.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/VR.pl
new file mode 100755
index 00000000000..8e57eb207a3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ccc/VR.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# CombiningClass category 'Virama'
+#
+return <<'END';
+0009
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Can.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Can.pl
new file mode 100755
index 00000000000..8a6aad1dedd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Can.pl
@@ -0,0 +1,236 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Canonical'
+#
+return <<'END';
+00C0 00C5
+00C7 00CF
+00D1 00D6
+00D9 00DD
+00E0 00E5
+00E7 00EF
+00F1 00F6
+00F9 00FD
+00FF 010F
+0112 0125
+0128 0130
+0134 0137
+0139 013E
+0143 0148
+014C 0151
+0154 0165
+0168 017E
+01A0 01A1
+01AF 01B0
+01CD 01DC
+01DE 01E3
+01E6 01F0
+01F4 01F5
+01F8 021B
+021E 021F
+0226 0233
+0340 0341
+0343 0344
+0374
+037E
+0385 038A
+038C
+038E 0390
+03AA 03B0
+03CA 03CE
+03D3 03D4
+0400 0401
+0403
+0407
+040C 040E
+0419
+0439
+0450 0451
+0453
+0457
+045C 045E
+0476 0477
+04C1 04C2
+04D0 04D3
+04D6 04D7
+04DA 04DF
+04E2 04E7
+04EA 04F5
+04F8 04F9
+0622 0626
+06C0
+06C2
+06D3
+0929
+0931
+0934
+0958 095F
+09CB 09CC
+09DC 09DD
+09DF
+0A33
+0A36
+0A59 0A5B
+0A5E
+0B48
+0B4B 0B4C
+0B5C 0B5D
+0B94
+0BCA 0BCC
+0C48
+0CC0
+0CC7 0CC8
+0CCA 0CCB
+0D4A 0D4C
+0DDA
+0DDC 0DDE
+0F43
+0F4D
+0F52
+0F57
+0F5C
+0F69
+0F73
+0F75 0F76
+0F78
+0F81
+0F93
+0F9D
+0FA2
+0FA7
+0FAC
+0FB9
+1026
+1B06
+1B08
+1B0A
+1B0C
+1B0E
+1B12
+1B3B
+1B3D
+1B40 1B41
+1B43
+1E00 1E99
+1E9B
+1EA0 1EF9
+1F00 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FBC
+1FBE
+1FC1 1FC4
+1FC6 1FD3
+1FD6 1FDB
+1FDD 1FEF
+1FF2 1FF4
+1FF6 1FFD
+2000 2001
+2126
+212A 212B
+219A 219B
+21AE
+21CD 21CF
+2204
+2209
+220C
+2224
+2226
+2241
+2244
+2247
+2249
+2260
+2262
+226D 2271
+2274 2275
+2278 2279
+2280 2281
+2284 2285
+2288 2289
+22AC 22AF
+22E0 22E3
+22EA 22ED
+2329 232A
+2ADC
+304C
+304E
+3050
+3052
+3054
+3056
+3058
+305A
+305C
+305E
+3060
+3062
+3065
+3067
+3069
+3070 3071
+3073 3074
+3076 3077
+3079 307A
+307C 307D
+3094
+309E
+30AC
+30AE
+30B0
+30B2
+30B4
+30B6
+30B8
+30BA
+30BC
+30BE
+30C0
+30C2
+30C5
+30C7
+30C9
+30D0 30D1
+30D3 30D4
+30D6 30D7
+30D9 30DA
+30DC 30DD
+30F4
+30F7 30FA
+30FE
+F900 FA0D
+FA10
+FA12
+FA15 FA1E
+FA20
+FA22
+FA25 FA26
+FA2A FA2D
+FA30 FA6A
+FA70 FAD9
+FB1D
+FB1F
+FB2A FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FB4E
+1D15E 1D164
+1D1BB 1D1C0
+2F800 2FA1D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Com.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Com.pl
new file mode 100755
index 00000000000..13eb6dd8513
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Com.pl
@@ -0,0 +1,826 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Compat'
+#
+return <<'END';
+00A0
+00A8
+00A8
+00AA
+00AF
+00AF
+00B2 00B4
+00B4 00B5
+00B5
+00B8
+00B8 00BA
+00BC 00BE
+0132
+0132 0133
+0133
+013F
+013F 0140
+0140
+0149
+0149
+017F
+017F
+01C4
+01C4 01C5
+01C5 01C6
+01C6 01C7
+01C7 01C8
+01C8 01C9
+01C9 01CA
+01CA 01CB
+01CB 01CC
+01CC
+01F1
+01F1 01F2
+01F2 01F3
+01F3
+02B0 02B8
+02D8
+02D8 02D9
+02D9 02DA
+02DA 02DB
+02DB 02DC
+02DC 02DD
+02DD
+02E0 02E4
+037A
+037A
+0384
+0384
+03D0
+03D0 03D1
+03D1 03D2
+03D2
+03D5
+03D5 03D6
+03D6
+03F0
+03F0 03F1
+03F1 03F2
+03F2
+03F4
+03F4 03F5
+03F5
+03F9
+03F9
+0587
+0587
+0675
+0675 0676
+0676 0677
+0677 0678
+0678
+0E33
+0E33
+0EB3
+0EB3
+0EDC
+0EDC 0EDD
+0EDD
+0F0C
+0F77
+0F77
+0F79
+0F79
+10FC
+1D2C 1D2E
+1D30 1D3A
+1D3C 1D4D
+1D4F 1D6A
+1D78
+1D9B 1DBF
+1E9A
+1E9A
+1FBD
+1FBD
+1FBF
+1FBF 1FC0
+1FC0
+1FFE
+1FFE
+2002
+2002 2003
+2003 2004
+2004 2005
+2005 2006
+2006 2008
+2008 2009
+2009 200A
+200A
+2011
+2017
+2017
+2024
+2024 2025
+2025 2026
+2026
+202F
+2033
+2033 2034
+2034
+2036
+2036 2037
+2037
+203C
+203C
+203E
+203E
+2047
+2047 2048
+2048 2049
+2049
+2057
+2057
+205F
+205F
+2070 2071
+2074 208E
+2090 2094
+20A8
+20A8
+2100
+2100 2101
+2101 2103
+2103
+2105
+2105 2106
+2106 2107
+2107
+2109
+2109 2113
+2115 2116
+2116
+2119 211D
+2120 2121
+2121 2122
+2124
+2128
+212C 212D
+212F 2131
+2133 2135
+2135 2136
+2136 2137
+2137 2138
+2138 2139
+213B
+213B 2140
+2145 2149
+2153 2160
+2160 2161
+2161 2162
+2162 2163
+2163 2164
+2164 2165
+2165 2166
+2166 2167
+2167 2168
+2168 2169
+2169 216A
+216A 216B
+216B 216C
+216C 216D
+216D 216E
+216E 216F
+216F 2170
+2170 2171
+2171 2172
+2172 2173
+2173 2174
+2174 2175
+2175 2176
+2176 2177
+2177 2178
+2178 2179
+2179 217A
+217A 217B
+217B 217C
+217C 217D
+217D 217E
+217E 217F
+217F
+222C
+222C 222D
+222D
+222F
+222F 2230
+2230
+2460 2474
+2474 2475
+2475 2476
+2476 2477
+2477 2478
+2478 2479
+2479 247A
+247A 247B
+247B 247C
+247C 247D
+247D 247E
+247E 247F
+247F 2480
+2480 2481
+2481 2482
+2482 2483
+2483 2484
+2484 2485
+2485 2486
+2486 2487
+2487 2488
+2488 2489
+2489 248A
+248A 248B
+248B 248C
+248C 248D
+248D 248E
+248E 248F
+248F 2490
+2490 2491
+2491 2492
+2492 2493
+2493 2494
+2494 2495
+2495 2496
+2496 2497
+2497 2498
+2498 2499
+2499 249A
+249A 249B
+249B 249C
+249C 249D
+249D 249E
+249E 249F
+249F 24A0
+24A0 24A1
+24A1 24A2
+24A2 24A3
+24A3 24A4
+24A4 24A5
+24A5 24A6
+24A6 24A7
+24A7 24A8
+24A8 24A9
+24A9 24AA
+24AA 24AB
+24AB 24AC
+24AC 24AD
+24AD 24AE
+24AE 24AF
+24AF 24B0
+24B0 24B1
+24B1 24B2
+24B2 24B3
+24B3 24B4
+24B4 24B5
+24B5 24EA
+2A0C
+2A0C
+2A74
+2A74 2A75
+2A75 2A76
+2A76
+2C7C 2C7D
+2D6F
+2E9F
+2E9F
+2EF3
+2EF3
+2F00
+2F00 2F01
+2F01 2F02
+2F02 2F03
+2F03 2F04
+2F04 2F05
+2F05 2F06
+2F06 2F07
+2F07 2F08
+2F08 2F09
+2F09 2F0A
+2F0A 2F0B
+2F0B 2F0C
+2F0C 2F0D
+2F0D 2F0E
+2F0E 2F0F
+2F0F 2F10
+2F10 2F11
+2F11 2F12
+2F12 2F13
+2F13 2F14
+2F14 2F15
+2F15 2F16
+2F16 2F17
+2F17 2F18
+2F18 2F19
+2F19 2F1A
+2F1A 2F1B
+2F1B 2F1C
+2F1C 2F1D
+2F1D 2F1E
+2F1E 2F1F
+2F1F 2F20
+2F20 2F21
+2F21 2F22
+2F22 2F23
+2F23 2F24
+2F24 2F25
+2F25 2F26
+2F26 2F27
+2F27 2F28
+2F28 2F29
+2F29 2F2A
+2F2A 2F2B
+2F2B 2F2C
+2F2C 2F2D
+2F2D 2F2E
+2F2E 2F2F
+2F2F 2F30
+2F30 2F31
+2F31 2F32
+2F32 2F33
+2F33 2F34
+2F34 2F35
+2F35 2F36
+2F36 2F37
+2F37 2F38
+2F38 2F39
+2F39 2F3A
+2F3A 2F3B
+2F3B 2F3C
+2F3C 2F3D
+2F3D 2F3E
+2F3E 2F3F
+2F3F 2F40
+2F40 2F41
+2F41 2F42
+2F42 2F43
+2F43 2F44
+2F44 2F45
+2F45 2F46
+2F46 2F47
+2F47 2F48
+2F48 2F49
+2F49 2F4A
+2F4A 2F4B
+2F4B 2F4C
+2F4C 2F4D
+2F4D 2F4E
+2F4E 2F4F
+2F4F 2F50
+2F50 2F51
+2F51 2F52
+2F52 2F53
+2F53 2F54
+2F54 2F55
+2F55 2F56
+2F56 2F57
+2F57 2F58
+2F58 2F59
+2F59 2F5A
+2F5A 2F5B
+2F5B 2F5C
+2F5C 2F5D
+2F5D 2F5E
+2F5E 2F5F
+2F5F 2F60
+2F60 2F61
+2F61 2F62
+2F62 2F63
+2F63 2F64
+2F64 2F65
+2F65 2F66
+2F66 2F67
+2F67 2F68
+2F68 2F69
+2F69 2F6A
+2F6A 2F6B
+2F6B 2F6C
+2F6C 2F6D
+2F6D 2F6E
+2F6E 2F6F
+2F6F 2F70
+2F70 2F71
+2F71 2F72
+2F72 2F73
+2F73 2F74
+2F74 2F75
+2F75 2F76
+2F76 2F77
+2F77 2F78
+2F78 2F79
+2F79 2F7A
+2F7A 2F7B
+2F7B 2F7C
+2F7C 2F7D
+2F7D 2F7E
+2F7E 2F7F
+2F7F 2F80
+2F80 2F81
+2F81 2F82
+2F82 2F83
+2F83 2F84
+2F84 2F85
+2F85 2F86
+2F86 2F87
+2F87 2F88
+2F88 2F89
+2F89 2F8A
+2F8A 2F8B
+2F8B 2F8C
+2F8C 2F8D
+2F8D 2F8E
+2F8E 2F8F
+2F8F 2F90
+2F90 2F91
+2F91 2F92
+2F92 2F93
+2F93 2F94
+2F94 2F95
+2F95 2F96
+2F96 2F97
+2F97 2F98
+2F98 2F99
+2F99 2F9A
+2F9A 2F9B
+2F9B 2F9C
+2F9C 2F9D
+2F9D 2F9E
+2F9E 2F9F
+2F9F 2FA0
+2FA0 2FA1
+2FA1 2FA2
+2FA2 2FA3
+2FA3 2FA4
+2FA4 2FA5
+2FA5 2FA6
+2FA6 2FA7
+2FA7 2FA8
+2FA8 2FA9
+2FA9 2FAA
+2FAA 2FAB
+2FAB 2FAC
+2FAC 2FAD
+2FAD 2FAE
+2FAE 2FAF
+2FAF 2FB0
+2FB0 2FB1
+2FB1 2FB2
+2FB2 2FB3
+2FB3 2FB4
+2FB4 2FB5
+2FB5 2FB6
+2FB6 2FB7
+2FB7 2FB8
+2FB8 2FB9
+2FB9 2FBA
+2FBA 2FBB
+2FBB 2FBC
+2FBC 2FBD
+2FBD 2FBE
+2FBE 2FBF
+2FBF 2FC0
+2FC0 2FC1
+2FC1 2FC2
+2FC2 2FC3
+2FC3 2FC4
+2FC4 2FC5
+2FC5 2FC6
+2FC6 2FC7
+2FC7 2FC8
+2FC8 2FC9
+2FC9 2FCA
+2FCA 2FCB
+2FCB 2FCC
+2FCC 2FCD
+2FCD 2FCE
+2FCE 2FCF
+2FCF 2FD0
+2FD0 2FD1
+2FD1 2FD2
+2FD2 2FD3
+2FD3 2FD4
+2FD4 2FD5
+2FD5
+3000
+3036
+3036
+3038
+3038 3039
+3039 303A
+303A
+309B
+309B 309C
+309C
+309F
+30FF
+3131
+3131 3132
+3132 3133
+3133 3134
+3134 3135
+3135 3136
+3136 3137
+3137 3138
+3138 3139
+3139 313A
+313A 313B
+313B 313C
+313C 313D
+313D 313E
+313E 313F
+313F 3140
+3140 3141
+3141 3142
+3142 3143
+3143 3144
+3144 3145
+3145 3146
+3146 3147
+3147 3148
+3148 3149
+3149 314A
+314A 314B
+314B 314C
+314C 314D
+314D 314E
+314E 314F
+314F 3150
+3150 3151
+3151 3152
+3152 3153
+3153 3154
+3154 3155
+3155 3156
+3156 3157
+3157 3158
+3158 3159
+3159 315A
+315A 315B
+315B 315C
+315C 315D
+315D 315E
+315E 315F
+315F 3160
+3160 3161
+3161 3162
+3162 3163
+3163 3164
+3164 3165
+3165 3166
+3166 3167
+3167 3168
+3168 3169
+3169 316A
+316A 316B
+316B 316C
+316C 316D
+316D 316E
+316E 316F
+316F 3170
+3170 3171
+3171 3172
+3172 3173
+3173 3174
+3174 3175
+3175 3176
+3176 3177
+3177 3178
+3178 3179
+3179 317A
+317A 317B
+317B 317C
+317C 317D
+317D 317E
+317E 317F
+317F 3180
+3180 3181
+3181 3182
+3182 3183
+3183 3184
+3184 3185
+3185 3186
+3186 3187
+3187 3188
+3188 3189
+3189 318A
+318A 318B
+318B 318C
+318C 318D
+318D 318E
+318E
+3192 319F
+3200
+3200 3201
+3201 3202
+3202 3203
+3203 3204
+3204 3205
+3205 3206
+3206 3207
+3207 3208
+3208 3209
+3209 320A
+320A 320B
+320B 320C
+320C 320D
+320D 320E
+320E 320F
+320F 3210
+3210 3211
+3211 3212
+3212 3213
+3213 3214
+3214 3215
+3215 3216
+3216 3217
+3217 3218
+3218 3219
+3219 321A
+321A 321B
+321B 321C
+321C 321D
+321D 321E
+321E
+3220
+3220 3221
+3221 3222
+3222 3223
+3223 3224
+3224 3225
+3225 3226
+3226 3227
+3227 3228
+3228 3229
+3229 322A
+322A 322B
+322B 322C
+322C 322D
+322D 322E
+322E 322F
+322F 3230
+3230 3231
+3231 3232
+3232 3233
+3233 3234
+3234 3235
+3235 3236
+3236 3237
+3237 3238
+3238 3239
+3239 323A
+323A 323B
+323B 323C
+323C 323D
+323D 323E
+323E 323F
+323F 3240
+3240 3241
+3241 3242
+3242 3243
+3243
+3250 327E
+3280 32C0
+32C0 32C1
+32C1 32C2
+32C2 32C3
+32C3 32C4
+32C4 32C5
+32C5 32C6
+32C6 32C7
+32C7 32C8
+32C8 32C9
+32C9 32CA
+32CA 32CB
+32CB 32FE
+3300 3358
+3358 3359
+3359 335A
+335A 335B
+335B 335C
+335C 335D
+335D 335E
+335E 335F
+335F 3360
+3360 3361
+3361 3362
+3362 3363
+3363 3364
+3364 3365
+3365 3366
+3366 3367
+3367 3368
+3368 3369
+3369 336A
+336A 336B
+336B 336C
+336C 336D
+336D 336E
+336E 336F
+336F 3370
+3370 33E0
+33E0 33E1
+33E1 33E2
+33E2 33E3
+33E3 33E4
+33E4 33E5
+33E5 33E6
+33E6 33E7
+33E7 33E8
+33E8 33E9
+33E9 33EA
+33EA 33EB
+33EB 33EC
+33EC 33ED
+33ED 33EE
+33EE 33EF
+33EF 33F0
+33F0 33F1
+33F1 33F2
+33F2 33F3
+33F3 33F4
+33F4 33F5
+33F5 33F6
+33F6 33F7
+33F7 33F8
+33F8 33F9
+33F9 33FA
+33FA 33FB
+33FB 33FC
+33FC 33FD
+33FD 33FE
+33FE 33FF
+A770
+FB00
+FB00 FB01
+FB01 FB02
+FB02 FB03
+FB03 FB04
+FB04 FB05
+FB05 FB06
+FB06
+FB13
+FB13 FB14
+FB14 FB15
+FB15 FB16
+FB16 FB17
+FB17
+FB20 FB29
+FB4F
+FB4F FBB1
+FBD3 FD3D
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFC
+FE10 FE19
+FE30 FE44
+FE47 FE49
+FE49 FE4A
+FE4A FE4B
+FE4B FE4C
+FE4C FE4D
+FE4D FE4E
+FE4E FE4F
+FE4F FE52
+FE54 FE66
+FE68 FE6B
+FE70 FE72
+FE74
+FE76 FEFC
+FF01 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+FFE0 FFE6
+FFE8 FFEE
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D7CB
+1D7CE 1D7FF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Enc.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Enc.pl
new file mode 100755
index 00000000000..0fdeb70f7ff
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Enc.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Circle'
+#
+return <<'END';
+2460 2473
+24B6 24EA
+3251 327E
+3280 32BF
+32D0 32FE
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Fin.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Fin.pl
new file mode 100755
index 00000000000..0605fe264fc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Fin.pl
@@ -0,0 +1,126 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Final'
+#
+return <<'END';
+FB51
+FB53
+FB57
+FB5B
+FB5F
+FB63
+FB67
+FB6B
+FB6F
+FB73
+FB77
+FB7B
+FB7F
+FB83
+FB85
+FB87
+FB89
+FB8B
+FB8D
+FB8F
+FB93
+FB97
+FB9B
+FB9F
+FBA1
+FBA5
+FBA7
+FBAB
+FBAF
+FBB1
+FBD4
+FBD8
+FBDA
+FBDC
+FBDF
+FBE1
+FBE3
+FBE5
+FBEB
+FBED
+FBEF
+FBF1
+FBF3
+FBF5
+FBF7
+FBFA
+FBFD
+FC64 FC96
+FD11 FD2C
+FD3C
+FD51
+FD58
+FD5A FD5B
+FD5E FD5F
+FD62
+FD64
+FD66 FD67
+FD69 FD6A
+FD6C
+FD6E FD6F
+FD71
+FD74 FD76
+FD78 FD7C
+FD7E FD82
+FD84 FD85
+FD87
+FD8B
+FD96 FD97
+FD99 FD9C
+FD9E FDB3
+FDB6 FDB7
+FDB9
+FDBB FDC2
+FDC6 FDC7
+FE82
+FE84
+FE86
+FE88
+FE8A
+FE8E
+FE90
+FE94
+FE96
+FE9A
+FE9E
+FEA2
+FEA6
+FEAA
+FEAC
+FEAE
+FEB0
+FEB2
+FEB6
+FEBA
+FEBE
+FEC2
+FEC6
+FECA
+FECE
+FED2
+FED6
+FEDA
+FEDE
+FEE2
+FEE6
+FEEA
+FEEE
+FEF0
+FEF2
+FEF6
+FEF8
+FEFA
+FEFC
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Font.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Font.pl
new file mode 100755
index 00000000000..e9de630e3cf
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Font.pl
@@ -0,0 +1,47 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'font'
+#
+return <<'END';
+2102
+210A 2113
+2115
+2119 211D
+2124
+2128
+212C 212D
+212F 2131
+2133 2134
+2139
+213C 2140
+2145 2149
+FB20 FB29
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D7CB
+1D7CE 1D7FF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Fra.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Fra.pl
new file mode 100755
index 00000000000..2ed91521fcd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Fra.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Fraction'
+#
+return <<'END';
+00BC 00BE
+2153 215F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Init.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Init.pl
new file mode 100755
index 00000000000..25cc48f7eaf
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Init.pl
@@ -0,0 +1,88 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Initial'
+#
+return <<'END';
+FB54
+FB58
+FB5C
+FB60
+FB64
+FB68
+FB6C
+FB70
+FB74
+FB78
+FB7C
+FB80
+FB90
+FB94
+FB98
+FB9C
+FBA2
+FBA8
+FBAC
+FBD5
+FBE6
+FBE8
+FBF8
+FBFB
+FBFE
+FC97 FCDE
+FD2D FD33
+FD50
+FD52 FD57
+FD59
+FD5C FD5D
+FD60 FD61
+FD63
+FD65
+FD68
+FD6B
+FD6D
+FD70
+FD72 FD73
+FD77
+FD7D
+FD83
+FD86
+FD88 FD8A
+FD8C FD8F
+FD92 FD95
+FD98
+FD9D
+FDB4 FDB5
+FDB8
+FDBA
+FDC3 FDC5
+FE8B
+FE91
+FE97
+FE9B
+FE9F
+FEA3
+FEA7
+FEB3
+FEB7
+FEBB
+FEBF
+FEC3
+FEC7
+FECB
+FECF
+FED3
+FED7
+FEDB
+FEDF
+FEE3
+FEE7
+FEEB
+FEF3
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Iso.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Iso.pl
new file mode 100755
index 00000000000..eb6c662f445
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Iso.pl
@@ -0,0 +1,111 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Isolated'
+#
+return <<'END';
+FB50
+FB52
+FB56
+FB5A
+FB5E
+FB62
+FB66
+FB6A
+FB6E
+FB72
+FB76
+FB7A
+FB7E
+FB82
+FB84
+FB86
+FB88
+FB8A
+FB8C
+FB8E
+FB92
+FB96
+FB9A
+FB9E
+FBA0
+FBA4
+FBA6
+FBAA
+FBAE
+FBB0
+FBD3
+FBD7
+FBD9
+FBDB
+FBDD FBDE
+FBE0
+FBE2
+FBE4
+FBEA
+FBEC
+FBEE
+FBF0
+FBF2
+FBF4
+FBF6
+FBF9
+FBFC
+FC00 FC63
+FCF5 FD10
+FD3D
+FDF0 FDFC
+FE70
+FE72
+FE74
+FE76
+FE78
+FE7A
+FE7C
+FE7E
+FE80 FE81
+FE83
+FE85
+FE87
+FE89
+FE8D
+FE8F
+FE93
+FE95
+FE99
+FE9D
+FEA1
+FEA5
+FEA9
+FEAB
+FEAD
+FEAF
+FEB1
+FEB5
+FEB9
+FEBD
+FEC1
+FEC5
+FEC9
+FECD
+FED1
+FED5
+FED9
+FEDD
+FEE1
+FEE5
+FEE9
+FEED
+FEEF
+FEF1
+FEF5
+FEF7
+FEF9
+FEFB
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Med.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Med.pl
new file mode 100755
index 00000000000..d79d5b4b170
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Med.pl
@@ -0,0 +1,67 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Medial'
+#
+return <<'END';
+FB55
+FB59
+FB5D
+FB61
+FB65
+FB69
+FB6D
+FB71
+FB75
+FB79
+FB7D
+FB81
+FB91
+FB95
+FB99
+FB9D
+FBA3
+FBA9
+FBAD
+FBD6
+FBE7
+FBE9
+FBFF
+FCDF FCF4
+FD34 FD3B
+FE71
+FE77
+FE79
+FE7B
+FE7D
+FE7F
+FE8C
+FE92
+FE98
+FE9C
+FEA0
+FEA4
+FEA8
+FEB4
+FEB8
+FEBC
+FEC0
+FEC4
+FEC8
+FECC
+FED0
+FED4
+FED8
+FEDC
+FEE0
+FEE4
+FEE8
+FEEC
+FEF4
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Nar.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Nar.pl
new file mode 100755
index 00000000000..7b4b5d362a7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Nar.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Narrow'
+#
+return <<'END';
+FF61 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+FFE8 FFEE
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Nb.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Nb.pl
new file mode 100755
index 00000000000..34b8761f135
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Nb.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Nobreak'
+#
+return <<'END';
+00A0
+0F0C
+2007
+2011
+202F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sml.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sml.pl
new file mode 100755
index 00000000000..760703442d1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sml.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Small'
+#
+return <<'END';
+FE50 FE52
+FE54 FE66
+FE68 FE6B
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sqr.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sqr.pl
new file mode 100755
index 00000000000..61fea9b5576
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sqr.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Square'
+#
+return <<'END';
+3250
+32CC 32CF
+3300 3357
+3371 33DF
+33FF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sub.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sub.pl
new file mode 100755
index 00000000000..7957500ae9b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sub.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'sub'
+#
+return <<'END';
+1D62 1D6A
+2080 208E
+2090 2094
+2C7C
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sup.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sup.pl
new file mode 100755
index 00000000000..5739ab12ead
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Sup.pl
@@ -0,0 +1,33 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Super'
+#
+return <<'END';
+00AA
+00B2 00B3
+00B9 00BA
+02B0 02B8
+02E0 02E4
+10FC
+1D2C 1D2E
+1D30 1D3A
+1D3C 1D4D
+1D4F 1D61
+1D78
+1D9B 1DBF
+2070 2071
+2074 207F
+2120
+2122
+2C7D
+2D6F
+3192 319F
+A770
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Vert.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Vert.pl
new file mode 100755
index 00000000000..13cb53b63b9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Vert.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'Vertical'
+#
+return <<'END';
+309F
+30FF
+FE10 FE19
+FE30 FE44
+FE47 FE48
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Wide.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Wide.pl
new file mode 100755
index 00000000000..7a1312d50c3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/dt/Wide.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# DecompositionType category 'wide'
+#
+return <<'END';
+3000
+FF01 FF60
+FFE0 FFE6
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/A.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/A.pl
new file mode 100755
index 00000000000..0f676eeca7a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/A.pl
@@ -0,0 +1,172 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# EastAsianWidth category 'Ambiguous'
+#
+return <<'END';
+00A1
+00A4
+00A7 00A8
+00AA
+00AD 00AE
+00B0 00B4
+00B6 00BA
+00BC 00BF
+00C6
+00D0
+00D7 00D8
+00DE 00E1
+00E6
+00E8 00EA
+00EC 00ED
+00F0
+00F2 00F3
+00F7 00FA
+00FC
+00FE
+0101
+0111
+0113
+011B
+0126 0127
+012B
+0131 0133
+0138
+013F 0142
+0144
+0148 014B
+014D
+0152 0153
+0166 0167
+016B
+01CE
+01D0
+01D2
+01D4
+01D6
+01D8
+01DA
+01DC
+0251
+0261
+02C4
+02C7
+02C9 02CB
+02CD
+02D0
+02D8 02DB
+02DD
+02DF
+0300 036F
+0391 03A1
+03A3 03A9
+03B1 03C1
+03C3 03C9
+0401
+0410 044F
+0451
+2010
+2013 2016
+2018 2019
+201C 201D
+2020 2022
+2024 2027
+2030
+2032 2033
+2035
+203B
+203E
+2074
+207F
+2081 2084
+20AC
+2103
+2105
+2109
+2113
+2116
+2121 2122
+2126
+212B
+2153 2154
+215B 215E
+2160 216B
+2170 2179
+2190 2199
+21B8 21B9
+21D2
+21D4
+21E7
+2200
+2202 2203
+2207 2208
+220B
+220F
+2211
+2215
+221A
+221D 2220
+2223
+2225
+2227 222C
+222E
+2234 2237
+223C 223D
+2248
+224C
+2252
+2260 2261
+2264 2267
+226A 226B
+226E 226F
+2282 2283
+2286 2287
+2295
+2299
+22A5
+22BF
+2312
+2460 24E9
+24EB 254B
+2550 2573
+2580 258F
+2592 2595
+25A0 25A1
+25A3 25A9
+25B2 25B3
+25B6 25B7
+25BC 25BD
+25C0 25C1
+25C6 25C8
+25CB
+25CE 25D1
+25E2 25E5
+25EF
+2605 2606
+2609
+260E 260F
+2614 2615
+261C
+261E
+2640
+2642
+2660 2661
+2663 2665
+2667 266A
+266C 266D
+266F
+273D
+2776 277F
+E000 F8FF
+FE00 FE0F
+FFFD
+E0100 E01EF
+F0000 FFFFD
+100000 10FFFD
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/F.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/F.pl
new file mode 100755
index 00000000000..aa6891401d1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/F.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# EastAsianWidth category 'Fullwidth'
+#
+return <<'END';
+3000
+FF01 FF60
+FFE0 FFE6
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/H.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/H.pl
new file mode 100755
index 00000000000..c27600a476d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/H.pl
@@ -0,0 +1,20 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# EastAsianWidth category 'Halfwidth'
+#
+return <<'END';
+20A9
+FF61 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+FFE8 FFEE
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/N.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/N.pl
new file mode 100755
index 00000000000..f0b2d81cc42
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/N.pl
@@ -0,0 +1,571 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# EastAsianWidth category 'Neutral'
+#
+return <<'END';
+0000 001F
+007F 00A0
+00A9
+00AB
+00B5
+00BB
+00C0 00C5
+00C7 00CF
+00D1 00D6
+00D9 00DD
+00E2 00E5
+00E7
+00EB
+00EE 00EF
+00F1
+00F4 00F6
+00FB
+00FD
+00FF 0100
+0102 0110
+0112
+0114 011A
+011C 0125
+0128 012A
+012C 0130
+0134 0137
+0139 013E
+0143
+0145 0147
+014C
+014E 0151
+0154 0165
+0168 016A
+016C 01CD
+01CF
+01D1
+01D3
+01D5
+01D7
+01D9
+01DB
+01DD 0250
+0252 0260
+0262 02C3
+02C5 02C6
+02C8
+02CC
+02CE 02CF
+02D1 02D7
+02DC
+02DE
+02E0 02FF
+0370 0377
+037A 037E
+0384 038A
+038C
+038E 0390
+03AA 03B0
+03C2
+03CA 0400
+0402 040F
+0450
+0452 0523
+0531 0556
+0559 055F
+0561 0587
+0589 058A
+0591 05C7
+05D0 05EA
+05F0 05F4
+0600 0603
+0606 061B
+061E 061F
+0621 065E
+0660 070D
+070F 074A
+074D 07B1
+07C0 07FA
+0901 0939
+093C 094D
+0950 0954
+0958 0972
+097B 097F
+0981 0983
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BC 09C4
+09C7 09C8
+09CB 09CE
+09D7
+09DC 09DD
+09DF 09E3
+09E6 09FA
+0A01 0A03
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A3C
+0A3E 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A59 0A5C
+0A5E
+0A66 0A75
+0A81 0A83
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABC 0AC5
+0AC7 0AC9
+0ACB 0ACD
+0AD0
+0AE0 0AE3
+0AE6 0AEF
+0AF1
+0B01 0B03
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3C 0B44
+0B47 0B48
+0B4B 0B4D
+0B56 0B57
+0B5C 0B5D
+0B5F 0B63
+0B66 0B71
+0B82 0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BBE 0BC2
+0BC6 0BC8
+0BCA 0BCD
+0BD0
+0BD7
+0BE6 0BFA
+0C01 0C03
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D 0C44
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C58 0C59
+0C60 0C63
+0C66 0C6F
+0C78 0C7F
+0C82 0C83
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBC 0CC4
+0CC6 0CC8
+0CCA 0CCD
+0CD5 0CD6
+0CDE
+0CE0 0CE3
+0CE6 0CEF
+0CF1 0CF2
+0D02 0D03
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D 0D44
+0D46 0D48
+0D4A 0D4D
+0D57
+0D60 0D63
+0D66 0D75
+0D79 0D7F
+0D82 0D83
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0DCA
+0DCF 0DD4
+0DD6
+0DD8 0DDF
+0DF2 0DF4
+0E01 0E3A
+0E3F 0E5B
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB9
+0EBB 0EBD
+0EC0 0EC4
+0EC6
+0EC8 0ECD
+0ED0 0ED9
+0EDC 0EDD
+0F00 0F47
+0F49 0F6C
+0F71 0F8B
+0F90 0F97
+0F99 0FBC
+0FBE 0FCC
+0FCE 0FD4
+1000 1099
+109E 10C5
+10D0 10FC
+1160 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+135F 137C
+1380 1399
+13A0 13F4
+1401 1676
+1680 169C
+16A0 16F0
+1700 170C
+170E 1714
+1720 1736
+1740 1753
+1760 176C
+176E 1770
+1772 1773
+1780 17DD
+17E0 17E9
+17F0 17F9
+1800 180E
+1810 1819
+1820 1877
+1880 18AA
+1900 191C
+1920 192B
+1930 193B
+1940
+1944 196D
+1970 1974
+1980 19A9
+19B0 19C9
+19D0 19D9
+19DE 1A1B
+1A1E 1A1F
+1B00 1B4B
+1B50 1B7C
+1B80 1BAA
+1BAE 1BB9
+1C00 1C37
+1C3B 1C49
+1C4D 1C7F
+1D00 1DE6
+1DFE 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FC4
+1FC6 1FD3
+1FD6 1FDB
+1FDD 1FEF
+1FF2 1FF4
+1FF6 1FFE
+2000 200F
+2011 2012
+2017
+201A 201B
+201E 201F
+2023
+2028 202F
+2031
+2034
+2036 203A
+203C 203D
+203F 2064
+206A 2071
+2075 207E
+2080
+2085 208E
+2090 2094
+20A0 20A8
+20AA 20AB
+20AD 20B5
+20D0 20F0
+2100 2102
+2104
+2106 2108
+210A 2112
+2114 2115
+2117 2120
+2123 2125
+2127 212A
+212C 214F
+2155 215A
+215F
+216C 216F
+217A 2188
+219A 21B7
+21BA 21D1
+21D3
+21D5 21E6
+21E8 21FF
+2201
+2204 2206
+2209 220A
+220C 220E
+2210
+2212 2214
+2216 2219
+221B 221C
+2221 2222
+2224
+2226
+222D
+222F 2233
+2238 223B
+223E 2247
+2249 224B
+224D 2251
+2253 225F
+2262 2263
+2268 2269
+226C 226D
+2270 2281
+2284 2285
+2288 2294
+2296 2298
+229A 22A4
+22A6 22BE
+22C0 2311
+2313 2328
+232B 23E7
+2400 2426
+2440 244A
+24EA
+254C 254F
+2574 257F
+2590 2591
+2596 259F
+25A2
+25AA 25B1
+25B4 25B5
+25B8 25BB
+25BE 25BF
+25C2 25C5
+25C9 25CA
+25CC 25CD
+25D2 25E1
+25E6 25EE
+25F0 2604
+2607 2608
+260A 260D
+2610 2613
+2616 261B
+261D
+261F 263F
+2641
+2643 265F
+2662
+2666
+266B
+266E
+2670 269D
+26A0 26BC
+26C0 26C3
+2701 2704
+2706 2709
+270C 2727
+2729 273C
+273E 274B
+274D
+274F 2752
+2756
+2758 275E
+2761 2775
+2780 2794
+2798 27AF
+27B1 27BE
+27C0 27CA
+27CC
+27D0 27E5
+27EE 2984
+2987 2B4C
+2B50 2B54
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CEA
+2CF9 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+2DE0 2E30
+303F
+4DC0 4DFF
+A500 A62B
+A640 A65F
+A662 A673
+A67C A697
+A700 A78C
+A7FB A82B
+A840 A877
+A880 A8C4
+A8CE A8D9
+A900 A953
+A95F
+AA00 AA36
+AA40 AA4D
+AA50 AA59
+AA5C AA5F
+D800 DFFF
+FB00 FB06
+FB13 FB17
+FB1D FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3F
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFD
+FE20 FE26
+FE70 FE74
+FE76 FEFC
+FEFF
+FFF9 FFFC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10100 10102
+10107 10133
+10137 1018A
+10190 1019B
+101D0 101FD
+10280 1029C
+102A0 102D0
+10300 1031E
+10320 10323
+10330 1034A
+10380 1039D
+1039F 103C3
+103C8 103D5
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10919
+1091F 10939
+1093F
+10A00 10A03
+10A05 10A06
+10A0C 10A13
+10A15 10A17
+10A19 10A33
+10A38 10A3A
+10A3F 10A47
+10A50 10A58
+12000 1236E
+12400 12462
+12470 12473
+1D000 1D0F5
+1D100 1D126
+1D129 1D1DD
+1D200 1D245
+1D300 1D356
+1D360 1D371
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D7CB
+1D7CE 1D7FF
+1F000 1F02B
+1F030 1F093
+E0001
+E0020 E007F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/Na.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/Na.pl
new file mode 100755
index 00000000000..4f728293d88
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/Na.pl
@@ -0,0 +1,20 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# EastAsianWidth category 'Narrow'
+#
+return <<'END';
+0020 007E
+00A2 00A3
+00A5 00A6
+00AC
+00AF
+27E6 27ED
+2985 2986
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/W.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/W.pl
new file mode 100755
index 00000000000..cd8e1072396
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/ea/W.pl
@@ -0,0 +1,44 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# EastAsianWidth category 'Wide'
+#
+return <<'END';
+1100 1159
+115F
+2329 232A
+2E80 2E99
+2E9B 2EF3
+2F00 2FD5
+2FF0 2FFB
+3001 303E
+3041 3096
+3099 30FF
+3105 312D
+3131 318E
+3190 31B7
+31C0 31E3
+31F0 321E
+3220 3243
+3250 32FE
+3300 4DB5
+4E00 9FC3
+A000 A48C
+A490 A4C6
+AC00 D7A3
+F900 FA2D
+FA30 FA6A
+FA70 FAD9
+FE10 FE19
+FE30 FE52
+FE54 FE66
+FE68 FE6B
+20000 2FFFD
+30000 3FFFD
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/AHex.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/AHex.pl
new file mode 100755
index 00000000000..c72ea54908c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/AHex.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'ASCII_Hex_Digit'
+#
+return <<'END';
+0030 0039 ASCII_Hex_Digit
+0041 0046 ASCII_Hex_Digit
+0061 0066 ASCII_Hex_Digit
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/ASCII.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/ASCII.pl
new file mode 100755
index 00000000000..a65f22a6bfb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/ASCII.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{ASCII}
+#
+# Meaning: [[:ASCII:]]
+#
+return <<'END';
+0000 007F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Alnum.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Alnum.pl
new file mode 100755
index 00000000000..9facb73dc67
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Alnum.pl
@@ -0,0 +1,483 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Alnum}
+#
+# Meaning: [[:Alnum:]]
+#
+return <<'END';
+0030 0039
+0041 005A
+0061 007A
+00AA
+00B5
+00BA
+00C0 00D6
+00D8 00F6
+00F8 02C1
+02C6 02D1
+02E0 02E4
+02EC
+02EE
+0300 0374
+0376 0377
+037A 037D
+0386
+0388 038A
+038C
+038E 03A1
+03A3 03F5
+03F7 0481
+0483 0523
+0531 0556
+0559
+0561 0587
+0591 05BD
+05BF
+05C1 05C2
+05C4 05C5
+05C7
+05D0 05EA
+05F0 05F2
+0610 061A
+0621 065E
+0660 0669
+066E 06D3
+06D5 06DC
+06DE 06E8
+06EA 06FC
+06FF
+0710 074A
+074D 07B1
+07C0 07F5
+07FA
+0901 0939
+093C 094D
+0950 0954
+0958 0963
+0966 096F
+0971 0972
+097B 097F
+0981 0983
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BC 09C4
+09C7 09C8
+09CB 09CE
+09D7
+09DC 09DD
+09DF 09E3
+09E6 09F1
+0A01 0A03
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A3C
+0A3E 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A59 0A5C
+0A5E
+0A66 0A75
+0A81 0A83
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABC 0AC5
+0AC7 0AC9
+0ACB 0ACD
+0AD0
+0AE0 0AE3
+0AE6 0AEF
+0B01 0B03
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3C 0B44
+0B47 0B48
+0B4B 0B4D
+0B56 0B57
+0B5C 0B5D
+0B5F 0B63
+0B66 0B6F
+0B71
+0B82 0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BBE 0BC2
+0BC6 0BC8
+0BCA 0BCD
+0BD0
+0BD7
+0BE6 0BEF
+0C01 0C03
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D 0C44
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C58 0C59
+0C60 0C63
+0C66 0C6F
+0C82 0C83
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBC 0CC4
+0CC6 0CC8
+0CCA 0CCD
+0CD5 0CD6
+0CDE
+0CE0 0CE3
+0CE6 0CEF
+0D02 0D03
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D 0D44
+0D46 0D48
+0D4A 0D4D
+0D57
+0D60 0D63
+0D66 0D6F
+0D7A 0D7F
+0D82 0D83
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0DCA
+0DCF 0DD4
+0DD6
+0DD8 0DDF
+0DF2 0DF3
+0E01 0E3A
+0E40 0E4E
+0E50 0E59
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB9
+0EBB 0EBD
+0EC0 0EC4
+0EC6
+0EC8 0ECD
+0ED0 0ED9
+0EDC 0EDD
+0F00
+0F18 0F19
+0F20 0F29
+0F35
+0F37
+0F39
+0F3E 0F47
+0F49 0F6C
+0F71 0F84
+0F86 0F8B
+0F90 0F97
+0F99 0FBC
+0FC6
+1000 1049
+1050 1099
+10A0 10C5
+10D0 10FA
+10FC
+1100 1159
+115F 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+135F
+1380 138F
+13A0 13F4
+1401 166C
+166F 1676
+1681 169A
+16A0 16EA
+1700 170C
+170E 1714
+1720 1734
+1740 1753
+1760 176C
+176E 1770
+1772 1773
+1780 17B3
+17B6 17D3
+17D7
+17DC 17DD
+17E0 17E9
+180B 180D
+1810 1819
+1820 1877
+1880 18AA
+1900 191C
+1920 192B
+1930 193B
+1946 196D
+1970 1974
+1980 19A9
+19B0 19C9
+19D0 19D9
+1A00 1A1B
+1B00 1B4B
+1B50 1B59
+1B6B 1B73
+1B80 1BAA
+1BAE 1BB9
+1C00 1C37
+1C40 1C49
+1C4D 1C7D
+1D00 1DE6
+1DFE 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FBC
+1FBE
+1FC2 1FC4
+1FC6 1FCC
+1FD0 1FD3
+1FD6 1FDB
+1FE0 1FEC
+1FF2 1FF4
+1FF6 1FFC
+2071
+207F
+2090 2094
+20D0 20F0
+2102
+2107
+210A 2113
+2115
+2119 211D
+2124
+2126
+2128
+212A 212D
+212F 2139
+213C 213F
+2145 2149
+214E
+2183 2184
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CE4
+2D00 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+2DE0 2DFF
+2E2F
+3005 3006
+302A 302F
+3031 3035
+303B 303C
+3041 3096
+3099 309A
+309D 309F
+30A1 30FA
+30FC 30FF
+3105 312D
+3131 318E
+31A0 31B7
+31F0 31FF
+3400 4DB5
+4E00 9FC3
+A000 A48C
+A500 A60C
+A610 A62B
+A640 A65F
+A662 A672
+A67C A67D
+A67F A697
+A717 A71F
+A722 A788
+A78B A78C
+A7FB A827
+A840 A873
+A880 A8C4
+A8D0 A8D9
+A900 A92D
+A930 A953
+AA00 AA36
+AA40 AA4D
+AA50 AA59
+AC00 D7A3
+F900 FA2D
+FA30 FA6A
+FA70 FAD9
+FB00 FB06
+FB13 FB17
+FB1D FB28
+FB2A FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3D
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFB
+FE00 FE0F
+FE20 FE26
+FE70 FE74
+FE76 FEFC
+FF10 FF19
+FF21 FF3A
+FF41 FF5A
+FF66 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+101FD
+10280 1029C
+102A0 102D0
+10300 1031E
+10330 10340
+10342 10349
+10380 1039D
+103A0 103C3
+103C8 103CF
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10915
+10920 10939
+10A00 10A03
+10A05 10A06
+10A0C 10A13
+10A15 10A17
+10A19 10A33
+10A38 10A3A
+10A3F
+12000 1236E
+1D165 1D169
+1D16D 1D172
+1D17B 1D182
+1D185 1D18B
+1D1AA 1D1AD
+1D242 1D244
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D6C0
+1D6C2 1D6DA
+1D6DC 1D6FA
+1D6FC 1D714
+1D716 1D734
+1D736 1D74E
+1D750 1D76E
+1D770 1D788
+1D78A 1D7A8
+1D7AA 1D7C2
+1D7C4 1D7CB
+1D7CE 1D7FF
+20000 2A6D6
+2F800 2FA1D
+E0100 E01EF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Alpha.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Alpha.pl
new file mode 100755
index 00000000000..197c8aed749
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Alpha.pl
@@ -0,0 +1,464 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Alpha}
+#
+# Meaning: [[:Alpha:]]
+#
+return <<'END';
+0041 005A
+0061 007A
+00AA
+00B5
+00BA
+00C0 00D6
+00D8 00F6
+00F8 02C1
+02C6 02D1
+02E0 02E4
+02EC
+02EE
+0300 0374
+0376 0377
+037A 037D
+0386
+0388 038A
+038C
+038E 03A1
+03A3 03F5
+03F7 0481
+0483 0523
+0531 0556
+0559
+0561 0587
+0591 05BD
+05BF
+05C1 05C2
+05C4 05C5
+05C7
+05D0 05EA
+05F0 05F2
+0610 061A
+0621 065E
+066E 06D3
+06D5 06DC
+06DE 06E8
+06EA 06EF
+06FA 06FC
+06FF
+0710 074A
+074D 07B1
+07CA 07F5
+07FA
+0901 0939
+093C 094D
+0950 0954
+0958 0963
+0971 0972
+097B 097F
+0981 0983
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BC 09C4
+09C7 09C8
+09CB 09CE
+09D7
+09DC 09DD
+09DF 09E3
+09F0 09F1
+0A01 0A03
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A3C
+0A3E 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A59 0A5C
+0A5E
+0A70 0A75
+0A81 0A83
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABC 0AC5
+0AC7 0AC9
+0ACB 0ACD
+0AD0
+0AE0 0AE3
+0B01 0B03
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3C 0B44
+0B47 0B48
+0B4B 0B4D
+0B56 0B57
+0B5C 0B5D
+0B5F 0B63
+0B71
+0B82 0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BBE 0BC2
+0BC6 0BC8
+0BCA 0BCD
+0BD0
+0BD7
+0C01 0C03
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D 0C44
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C58 0C59
+0C60 0C63
+0C82 0C83
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBC 0CC4
+0CC6 0CC8
+0CCA 0CCD
+0CD5 0CD6
+0CDE
+0CE0 0CE3
+0D02 0D03
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D 0D44
+0D46 0D48
+0D4A 0D4D
+0D57
+0D60 0D63
+0D7A 0D7F
+0D82 0D83
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0DCA
+0DCF 0DD4
+0DD6
+0DD8 0DDF
+0DF2 0DF3
+0E01 0E3A
+0E40 0E4E
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB9
+0EBB 0EBD
+0EC0 0EC4
+0EC6
+0EC8 0ECD
+0EDC 0EDD
+0F00
+0F18 0F19
+0F35
+0F37
+0F39
+0F3E 0F47
+0F49 0F6C
+0F71 0F84
+0F86 0F8B
+0F90 0F97
+0F99 0FBC
+0FC6
+1000 103F
+1050 108F
+10A0 10C5
+10D0 10FA
+10FC
+1100 1159
+115F 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+135F
+1380 138F
+13A0 13F4
+1401 166C
+166F 1676
+1681 169A
+16A0 16EA
+1700 170C
+170E 1714
+1720 1734
+1740 1753
+1760 176C
+176E 1770
+1772 1773
+1780 17B3
+17B6 17D3
+17D7
+17DC 17DD
+180B 180D
+1820 1877
+1880 18AA
+1900 191C
+1920 192B
+1930 193B
+1950 196D
+1970 1974
+1980 19A9
+19B0 19C9
+1A00 1A1B
+1B00 1B4B
+1B6B 1B73
+1B80 1BAA
+1BAE 1BAF
+1C00 1C37
+1C4D 1C4F
+1C5A 1C7D
+1D00 1DE6
+1DFE 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FBC
+1FBE
+1FC2 1FC4
+1FC6 1FCC
+1FD0 1FD3
+1FD6 1FDB
+1FE0 1FEC
+1FF2 1FF4
+1FF6 1FFC
+2071
+207F
+2090 2094
+20D0 20F0
+2102
+2107
+210A 2113
+2115
+2119 211D
+2124
+2126
+2128
+212A 212D
+212F 2139
+213C 213F
+2145 2149
+214E
+2183 2184
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CE4
+2D00 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+2DE0 2DFF
+2E2F
+3005 3006
+302A 302F
+3031 3035
+303B 303C
+3041 3096
+3099 309A
+309D 309F
+30A1 30FA
+30FC 30FF
+3105 312D
+3131 318E
+31A0 31B7
+31F0 31FF
+3400 4DB5
+4E00 9FC3
+A000 A48C
+A500 A60C
+A610 A61F
+A62A A62B
+A640 A65F
+A662 A672
+A67C A67D
+A67F A697
+A717 A71F
+A722 A788
+A78B A78C
+A7FB A827
+A840 A873
+A880 A8C4
+A90A A92D
+A930 A953
+AA00 AA36
+AA40 AA4D
+AC00 D7A3
+F900 FA2D
+FA30 FA6A
+FA70 FAD9
+FB00 FB06
+FB13 FB17
+FB1D FB28
+FB2A FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3D
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFB
+FE00 FE0F
+FE20 FE26
+FE70 FE74
+FE76 FEFC
+FF21 FF3A
+FF41 FF5A
+FF66 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+101FD
+10280 1029C
+102A0 102D0
+10300 1031E
+10330 10340
+10342 10349
+10380 1039D
+103A0 103C3
+103C8 103CF
+10400 1049D
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10915
+10920 10939
+10A00 10A03
+10A05 10A06
+10A0C 10A13
+10A15 10A17
+10A19 10A33
+10A38 10A3A
+10A3F
+12000 1236E
+1D165 1D169
+1D16D 1D172
+1D17B 1D182
+1D185 1D18B
+1D1AA 1D1AD
+1D242 1D244
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D6C0
+1D6C2 1D6DA
+1D6DC 1D6FA
+1D6FC 1D714
+1D716 1D734
+1D736 1D74E
+1D750 1D76E
+1D770 1D788
+1D78A 1D7A8
+1D7AA 1D7C2
+1D7C4 1D7CB
+20000 2A6D6
+2F800 2FA1D
+E0100 E01EF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Alphabet.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Alphabet.pl
new file mode 100755
index 00000000000..fca4d3f10c2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Alphabet.pl
@@ -0,0 +1,459 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Alphabetic} (and fuzzy permutations)
+#
+# Meaning: [\p{L}\p{Nl}\p{OtherAlphabetic}]
+#
+return <<'END';
+0041 005A
+0061 007A
+00AA
+00B5
+00BA
+00C0 00D6
+00D8 00F6
+00F8 02C1
+02C6 02D1
+02E0 02E4
+02EC
+02EE
+0345
+0370 0374
+0376 0377
+037A 037D
+0386
+0388 038A
+038C
+038E 03A1
+03A3 03F5
+03F7 0481
+048A 0523
+0531 0556
+0559
+0561 0587
+05B0 05BD
+05BF
+05C1 05C2
+05C4 05C5
+05C7
+05D0 05EA
+05F0 05F2
+0610 061A
+0621 0657
+0659 065E
+066E 06D3
+06D5 06DC
+06E1 06E8
+06ED 06EF
+06FA 06FC
+06FF
+0710 073F
+074D 07B1
+07CA 07EA
+07F4 07F5
+07FA
+0901 0939
+093D 094C
+0950
+0958 0963
+0971 0972
+097B 097F
+0981 0983
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BD 09C4
+09C7 09C8
+09CB 09CC
+09CE
+09D7
+09DC 09DD
+09DF 09E3
+09F0 09F1
+0A01 0A03
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A3E 0A42
+0A47 0A48
+0A4B 0A4C
+0A51
+0A59 0A5C
+0A5E
+0A70 0A75
+0A81 0A83
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABD 0AC5
+0AC7 0AC9
+0ACB 0ACC
+0AD0
+0AE0 0AE3
+0B01 0B03
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3D 0B44
+0B47 0B48
+0B4B 0B4C
+0B56 0B57
+0B5C 0B5D
+0B5F 0B63
+0B71
+0B82 0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BBE 0BC2
+0BC6 0BC8
+0BCA 0BCC
+0BD0
+0BD7
+0C01 0C03
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D 0C44
+0C46 0C48
+0C4A 0C4C
+0C55 0C56
+0C58 0C59
+0C60 0C63
+0C82 0C83
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBD 0CC4
+0CC6 0CC8
+0CCA 0CCC
+0CD5 0CD6
+0CDE
+0CE0 0CE3
+0D02 0D03
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D 0D44
+0D46 0D48
+0D4A 0D4C
+0D57
+0D60 0D63
+0D7A 0D7F
+0D82 0D83
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0DCF 0DD4
+0DD6
+0DD8 0DDF
+0DF2 0DF3
+0E01 0E3A
+0E40 0E46
+0E4D
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB9
+0EBB 0EBD
+0EC0 0EC4
+0EC6
+0ECD
+0EDC 0EDD
+0F00
+0F40 0F47
+0F49 0F6C
+0F71 0F81
+0F88 0F8B
+0F90 0F97
+0F99 0FBC
+1000 1036
+1038
+103B 103F
+1050 1062
+1065 1068
+106E 1086
+108E
+10A0 10C5
+10D0 10FA
+10FC
+1100 1159
+115F 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+135F
+1380 138F
+13A0 13F4
+1401 166C
+166F 1676
+1681 169A
+16A0 16EA
+16EE 16F0
+1700 170C
+170E 1713
+1720 1733
+1740 1753
+1760 176C
+176E 1770
+1772 1773
+1780 17B3
+17B6 17C8
+17D7
+17DC
+1820 1877
+1880 18AA
+1900 191C
+1920 192B
+1930 1938
+1950 196D
+1970 1974
+1980 19A9
+19B0 19C9
+1A00 1A1B
+1B00 1B33
+1B35 1B43
+1B45 1B4B
+1B80 1BA9
+1BAE 1BAF
+1C00 1C35
+1C4D 1C4F
+1C5A 1C7D
+1D00 1DBF
+1E00 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FBC
+1FBE
+1FC2 1FC4
+1FC6 1FCC
+1FD0 1FD3
+1FD6 1FDB
+1FE0 1FEC
+1FF2 1FF4
+1FF6 1FFC
+2071
+207F
+2090 2094
+2102
+2107
+210A 2113
+2115
+2119 211D
+2124
+2126
+2128
+212A 212D
+212F 2139
+213C 213F
+2145 2149
+214E
+2160 2188
+24B6 24E9
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CE4
+2D00 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+2DE0 2DFF
+2E2F
+3005 3007
+3021 3029
+3031 3035
+3038 303C
+3041 3096
+309D 309F
+30A1 30FA
+30FC 30FF
+3105 312D
+3131 318E
+31A0 31B7
+31F0 31FF
+3400 4DB5
+4E00 9FC3
+A000 A48C
+A500 A60C
+A610 A61F
+A62A A62B
+A640 A65F
+A662 A66E
+A67F A697
+A717 A71F
+A722 A788
+A78B A78C
+A7FB A801
+A803 A805
+A807 A80A
+A80C A827
+A840 A873
+A880 A8C3
+A90A A92A
+A930 A952
+AA00 AA36
+AA40 AA4D
+AC00 D7A3
+F900 FA2D
+FA30 FA6A
+FA70 FAD9
+FB00 FB06
+FB13 FB17
+FB1D FB28
+FB2A FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3D
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFB
+FE70 FE74
+FE76 FEFC
+FF21 FF3A
+FF41 FF5A
+FF66 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10140 10174
+10280 1029C
+102A0 102D0
+10300 1031E
+10330 1034A
+10380 1039D
+103A0 103C3
+103C8 103CF
+103D1 103D5
+10400 1049D
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10915
+10920 10939
+10A00 10A03
+10A05 10A06
+10A0C 10A13
+10A15 10A17
+10A19 10A33
+12000 1236E
+12400 12462
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D6C0
+1D6C2 1D6DA
+1D6DC 1D6FA
+1D6FC 1D714
+1D716 1D734
+1D736 1D74E
+1D750 1D76E
+1D770 1D788
+1D78A 1D7A8
+1D7AA 1D7C2
+1D7C4 1D7CB
+20000 2A6D6
+2F800 2FA1D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Any.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Any.pl
new file mode 100755
index 00000000000..21a4800054f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Any.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Any}
+# \p{Any}
+#
+# Meaning: [\x{0000}-\x{10FFFF}]
+#
+return <<'END';
+0000 10FFFF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Arab.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Arab.pl
new file mode 100755
index 00000000000..24c7d7594af
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Arab.pl
@@ -0,0 +1,33 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Arabic} (and fuzzy permutations)
+#
+# Meaning: Script 'Arabic'
+#
+return <<'END';
+0606 060B Arabic
+060D 061A Arabic
+061E Arabic
+0621 063F Arabic
+0641 064A Arabic
+0656 065E Arabic
+066A 066F Arabic
+0671 06DC Arabic
+06DE 06FF Arabic
+0750 077F Arabic
+FB50 FBB1 Arabic
+FBD3 FD3D Arabic
+FD50 FD8F Arabic
+FD92 FDC7 Arabic
+FDF0 FDFC Arabic
+FE70 FE74 Arabic
+FE76 FEFC Arabic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Armn.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Armn.pl
new file mode 100755
index 00000000000..c83f7a12cbb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Armn.pl
@@ -0,0 +1,21 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Armenian} (and fuzzy permutations)
+#
+# Meaning: Script 'Armenian'
+#
+return <<'END';
+0531 0556 Armenian
+0559 055F Armenian
+0561 0587 Armenian
+058A Armenian
+FB13 FB17 Armenian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/AsciiHex.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/AsciiHex.pl
new file mode 100755
index 00000000000..ab523ca52ab
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/AsciiHex.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{AsciiHexDigit} (and fuzzy permutations)
+#
+# Meaning: Extended property 'ASCII_Hex_Digit'
+#
+return <<'END';
+0030 0039 ASCII_Hex_Digit
+0041 0046 ASCII_Hex_Digit
+0061 0066 ASCII_Hex_Digit
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Assigned.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Assigned.pl
new file mode 100755
index 00000000000..bdc1d424fb2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Assigned.pl
@@ -0,0 +1,461 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Assigned}
+#
+# Meaning: All assigned code points
+#
+return <<'END';
+0000 0377
+037A 037E
+0384 038A
+038C
+038E 03A1
+03A3 0523
+0531 0556
+0559 055F
+0561 0587
+0589 058A
+0591 05C7
+05D0 05EA
+05F0 05F4
+0600 0603
+0606 061B
+061E 061F
+0621 065E
+0660 070D
+070F 074A
+074D 07B1
+07C0 07FA
+0901 0939
+093C 094D
+0950 0954
+0958 0972
+097B 097F
+0981 0983
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BC 09C4
+09C7 09C8
+09CB 09CE
+09D7
+09DC 09DD
+09DF 09E3
+09E6 09FA
+0A01 0A03
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A3C
+0A3E 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A59 0A5C
+0A5E
+0A66 0A75
+0A81 0A83
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABC 0AC5
+0AC7 0AC9
+0ACB 0ACD
+0AD0
+0AE0 0AE3
+0AE6 0AEF
+0AF1
+0B01 0B03
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3C 0B44
+0B47 0B48
+0B4B 0B4D
+0B56 0B57
+0B5C 0B5D
+0B5F 0B63
+0B66 0B71
+0B82 0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BBE 0BC2
+0BC6 0BC8
+0BCA 0BCD
+0BD0
+0BD7
+0BE6 0BFA
+0C01 0C03
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D 0C44
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C58 0C59
+0C60 0C63
+0C66 0C6F
+0C78 0C7F
+0C82 0C83
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBC 0CC4
+0CC6 0CC8
+0CCA 0CCD
+0CD5 0CD6
+0CDE
+0CE0 0CE3
+0CE6 0CEF
+0CF1 0CF2
+0D02 0D03
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D 0D44
+0D46 0D48
+0D4A 0D4D
+0D57
+0D60 0D63
+0D66 0D75
+0D79 0D7F
+0D82 0D83
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0DCA
+0DCF 0DD4
+0DD6
+0DD8 0DDF
+0DF2 0DF4
+0E01 0E3A
+0E3F 0E5B
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB9
+0EBB 0EBD
+0EC0 0EC4
+0EC6
+0EC8 0ECD
+0ED0 0ED9
+0EDC 0EDD
+0F00 0F47
+0F49 0F6C
+0F71 0F8B
+0F90 0F97
+0F99 0FBC
+0FBE 0FCC
+0FCE 0FD4
+1000 1099
+109E 10C5
+10D0 10FC
+1100 1159
+115F 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+135F 137C
+1380 1399
+13A0 13F4
+1401 1676
+1680 169C
+16A0 16F0
+1700 170C
+170E 1714
+1720 1736
+1740 1753
+1760 176C
+176E 1770
+1772 1773
+1780 17DD
+17E0 17E9
+17F0 17F9
+1800 180E
+1810 1819
+1820 1877
+1880 18AA
+1900 191C
+1920 192B
+1930 193B
+1940
+1944 196D
+1970 1974
+1980 19A9
+19B0 19C9
+19D0 19D9
+19DE 1A1B
+1A1E 1A1F
+1B00 1B4B
+1B50 1B7C
+1B80 1BAA
+1BAE 1BB9
+1C00 1C37
+1C3B 1C49
+1C4D 1C7F
+1D00 1DE6
+1DFE 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FC4
+1FC6 1FD3
+1FD6 1FDB
+1FDD 1FEF
+1FF2 1FF4
+1FF6 1FFE
+2000 2064
+206A 2071
+2074 208E
+2090 2094
+20A0 20B5
+20D0 20F0
+2100 214F
+2153 2188
+2190 23E7
+2400 2426
+2440 244A
+2460 269D
+26A0 26BC
+26C0 26C3
+2701 2704
+2706 2709
+270C 2727
+2729 274B
+274D
+274F 2752
+2756
+2758 275E
+2761 2794
+2798 27AF
+27B1 27BE
+27C0 27CA
+27CC
+27D0 2B4C
+2B50 2B54
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CEA
+2CF9 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+2DE0 2E30
+2E80 2E99
+2E9B 2EF3
+2F00 2FD5
+2FF0 2FFB
+3000 303F
+3041 3096
+3099 30FF
+3105 312D
+3131 318E
+3190 31B7
+31C0 31E3
+31F0 321E
+3220 3243
+3250 32FE
+3300 4DB5
+4DC0 9FC3
+A000 A48C
+A490 A4C6
+A500 A62B
+A640 A65F
+A662 A673
+A67C A697
+A700 A78C
+A7FB A82B
+A840 A877
+A880 A8C4
+A8CE A8D9
+A900 A953
+A95F
+AA00 AA36
+AA40 AA4D
+AA50 AA59
+AA5C AA5F
+AC00 D7A3
+D800 FA2D
+FA30 FA6A
+FA70 FAD9
+FB00 FB06
+FB13 FB17
+FB1D FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3F
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFD
+FE00 FE19
+FE20 FE26
+FE30 FE52
+FE54 FE66
+FE68 FE6B
+FE70 FE74
+FE76 FEFC
+FEFF
+FF01 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+FFE0 FFE6
+FFE8 FFEE
+FFF9 FFFD
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10100 10102
+10107 10133
+10137 1018A
+10190 1019B
+101D0 101FD
+10280 1029C
+102A0 102D0
+10300 1031E
+10320 10323
+10330 1034A
+10380 1039D
+1039F 103C3
+103C8 103D5
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10919
+1091F 10939
+1093F
+10A00 10A03
+10A05 10A06
+10A0C 10A13
+10A15 10A17
+10A19 10A33
+10A38 10A3A
+10A3F 10A47
+10A50 10A58
+12000 1236E
+12400 12462
+12470 12473
+1D000 1D0F5
+1D100 1D126
+1D129 1D1DD
+1D200 1D245
+1D300 1D356
+1D360 1D371
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D7CB
+1D7CE 1D7FF
+1F000 1F02B
+1F030 1F093
+20000 2A6D6
+2F800 2FA1D
+E0001
+E0020 E007F
+E0100 E01EF
+F0000 FFFFD
+100000 10FFFD
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Bali.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Bali.pl
new file mode 100755
index 00000000000..4d0d7070910
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Bali.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Balinese} (and fuzzy permutations)
+#
+# Meaning: Script 'Balinese'
+#
+return <<'END';
+1B00 1B4B Balinese
+1B50 1B7C Balinese
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Beng.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Beng.pl
new file mode 100755
index 00000000000..2fafb67aaad
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Beng.pl
@@ -0,0 +1,30 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Bengali} (and fuzzy permutations)
+#
+# Meaning: Script 'Bengali'
+#
+return <<'END';
+0981 0983 Bengali
+0985 098C Bengali
+098F 0990 Bengali
+0993 09A8 Bengali
+09AA 09B0 Bengali
+09B2 Bengali
+09B6 09B9 Bengali
+09BC 09C4 Bengali
+09C7 09C8 Bengali
+09CB 09CE Bengali
+09D7 Bengali
+09DC 09DD Bengali
+09DF 09E3 Bengali
+09E6 09FA Bengali
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/BidiC.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/BidiC.pl
new file mode 100755
index 00000000000..e2af330d078
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/BidiC.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Bidi_Control'
+#
+return <<'END';
+200E 200F Bidi_Control
+202A 202E Bidi_Control
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/BidiCont.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/BidiCont.pl
new file mode 100755
index 00000000000..ededb279b02
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/BidiCont.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{BidiControl} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Bidi_Control'
+#
+return <<'END';
+200E 200F Bidi_Control
+202A 202E Bidi_Control
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Blank.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Blank.pl
new file mode 100755
index 00000000000..5fb2fc91f41
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Blank.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Blank}
+#
+# Meaning: [[:Blank:]]
+#
+return <<'END';
+0009
+0020
+00A0
+1680
+180E
+2000 200A
+202F
+205F
+3000
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Bopo.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Bopo.pl
new file mode 100755
index 00000000000..77b357459e0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Bopo.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Bopomofo} (and fuzzy permutations)
+#
+# Meaning: Script 'Bopomofo'
+#
+return <<'END';
+3105 312D Bopomofo
+31A0 31B7 Bopomofo
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Brai.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Brai.pl
new file mode 100755
index 00000000000..f0d17fea48b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Brai.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Braille} (and fuzzy permutations)
+#
+# Meaning: Script 'Braille'
+#
+return <<'END';
+2800 28FF Braille
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Bugi.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Bugi.pl
new file mode 100755
index 00000000000..dcaef3512b8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Bugi.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Buginese} (and fuzzy permutations)
+#
+# Meaning: Script 'Buginese'
+#
+return <<'END';
+1A00 1A1B Buginese
+1A1E 1A1F Buginese
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Buhd.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Buhd.pl
new file mode 100755
index 00000000000..b318c0362ba
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Buhd.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Buhid} (and fuzzy permutations)
+#
+# Meaning: Script 'Buhid'
+#
+return <<'END';
+1740 1753 Buhid
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/C.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/C.pl
new file mode 100755
index 00000000000..6ef19ce6323
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/C.pl
@@ -0,0 +1,464 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{C}
+# \p{C} (and fuzzy permutations)
+#
+# Meaning: Major Category 'C'
+#
+return <<'END';
+0000 001F
+007F 009F
+00AD
+0378 0379
+037F 0383
+038B
+038D
+03A2
+0524 0530
+0557 0558
+0560
+0588
+058B 0590
+05C8 05CF
+05EB 05EF
+05F5 0605
+061C 061D
+0620
+065F
+06DD
+070E 070F
+074B 074C
+07B2 07BF
+07FB 0900
+093A 093B
+094E 094F
+0955 0957
+0973 097A
+0980
+0984
+098D 098E
+0991 0992
+09A9
+09B1
+09B3 09B5
+09BA 09BB
+09C5 09C6
+09C9 09CA
+09CF 09D6
+09D8 09DB
+09DE
+09E4 09E5
+09FB 0A00
+0A04
+0A0B 0A0E
+0A11 0A12
+0A29
+0A31
+0A34
+0A37
+0A3A 0A3B
+0A3D
+0A43 0A46
+0A49 0A4A
+0A4E 0A50
+0A52 0A58
+0A5D
+0A5F 0A65
+0A76 0A80
+0A84
+0A8E
+0A92
+0AA9
+0AB1
+0AB4
+0ABA 0ABB
+0AC6
+0ACA
+0ACE 0ACF
+0AD1 0ADF
+0AE4 0AE5
+0AF0
+0AF2 0B00
+0B04
+0B0D 0B0E
+0B11 0B12
+0B29
+0B31
+0B34
+0B3A 0B3B
+0B45 0B46
+0B49 0B4A
+0B4E 0B55
+0B58 0B5B
+0B5E
+0B64 0B65
+0B72 0B81
+0B84
+0B8B 0B8D
+0B91
+0B96 0B98
+0B9B
+0B9D
+0BA0 0BA2
+0BA5 0BA7
+0BAB 0BAD
+0BBA 0BBD
+0BC3 0BC5
+0BC9
+0BCE 0BCF
+0BD1 0BD6
+0BD8 0BE5
+0BFB 0C00
+0C04
+0C0D
+0C11
+0C29
+0C34
+0C3A 0C3C
+0C45
+0C49
+0C4E 0C54
+0C57
+0C5A 0C5F
+0C64 0C65
+0C70 0C77
+0C80 0C81
+0C84
+0C8D
+0C91
+0CA9
+0CB4
+0CBA 0CBB
+0CC5
+0CC9
+0CCE 0CD4
+0CD7 0CDD
+0CDF
+0CE4 0CE5
+0CF0
+0CF3 0D01
+0D04
+0D0D
+0D11
+0D29
+0D3A 0D3C
+0D45
+0D49
+0D4E 0D56
+0D58 0D5F
+0D64 0D65
+0D76 0D78
+0D80 0D81
+0D84
+0D97 0D99
+0DB2
+0DBC
+0DBE 0DBF
+0DC7 0DC9
+0DCB 0DCE
+0DD5
+0DD7
+0DE0 0DF1
+0DF5 0E00
+0E3B 0E3E
+0E5C 0E80
+0E83
+0E85 0E86
+0E89
+0E8B 0E8C
+0E8E 0E93
+0E98
+0EA0
+0EA4
+0EA6
+0EA8 0EA9
+0EAC
+0EBA
+0EBE 0EBF
+0EC5
+0EC7
+0ECE 0ECF
+0EDA 0EDB
+0EDE 0EFF
+0F48
+0F6D 0F70
+0F8C 0F8F
+0F98
+0FBD
+0FCD
+0FD5 0FFF
+109A 109D
+10C6 10CF
+10FD 10FF
+115A 115E
+11A3 11A7
+11FA 11FF
+1249
+124E 124F
+1257
+1259
+125E 125F
+1289
+128E 128F
+12B1
+12B6 12B7
+12BF
+12C1
+12C6 12C7
+12D7
+1311
+1316 1317
+135B 135E
+137D 137F
+139A 139F
+13F5 1400
+1677 167F
+169D 169F
+16F1 16FF
+170D
+1715 171F
+1737 173F
+1754 175F
+176D
+1771
+1774 177F
+17B4 17B5
+17DE 17DF
+17EA 17EF
+17FA 17FF
+180F
+181A 181F
+1878 187F
+18AB 18FF
+191D 191F
+192C 192F
+193C 193F
+1941 1943
+196E 196F
+1975 197F
+19AA 19AF
+19CA 19CF
+19DA 19DD
+1A1C 1A1D
+1A20 1AFF
+1B4C 1B4F
+1B7D 1B7F
+1BAB 1BAD
+1BBA 1BFF
+1C38 1C3A
+1C4A 1C4C
+1C80 1CFF
+1DE7 1DFD
+1F16 1F17
+1F1E 1F1F
+1F46 1F47
+1F4E 1F4F
+1F58
+1F5A
+1F5C
+1F5E
+1F7E 1F7F
+1FB5
+1FC5
+1FD4 1FD5
+1FDC
+1FF0 1FF1
+1FF5
+1FFF
+200B 200F
+202A 202E
+2060 206F
+2072 2073
+208F
+2095 209F
+20B6 20CF
+20F1 20FF
+2150 2152
+2189 218F
+23E8 23FF
+2427 243F
+244B 245F
+269E 269F
+26BD 26BF
+26C4 2700
+2705
+270A 270B
+2728
+274C
+274E
+2753 2755
+2757
+275F 2760
+2795 2797
+27B0
+27BF
+27CB
+27CD 27CF
+2B4D 2B4F
+2B55 2BFF
+2C2F
+2C5F
+2C70
+2C7E 2C7F
+2CEB 2CF8
+2D26 2D2F
+2D66 2D6E
+2D70 2D7F
+2D97 2D9F
+2DA7
+2DAF
+2DB7
+2DBF
+2DC7
+2DCF
+2DD7
+2DDF
+2E31 2E7F
+2E9A
+2EF4 2EFF
+2FD6 2FEF
+2FFC 2FFF
+3040
+3097 3098
+3100 3104
+312E 3130
+318F
+31B8 31BF
+31E4 31EF
+321F
+3244 324F
+32FF
+4DB6 4DBF
+9FC4 9FFF
+A48D A48F
+A4C7 A4FF
+A62C A63F
+A660 A661
+A674 A67B
+A698 A6FF
+A78D A7FA
+A82C A83F
+A878 A87F
+A8C5 A8CD
+A8DA A8FF
+A954 A95E
+A960 A9FF
+AA37 AA3F
+AA4E AA4F
+AA5A AA5B
+AA60 ABFF
+D7A4 F8FF
+FA2E FA2F
+FA6B FA6F
+FADA FAFF
+FB07 FB12
+FB18 FB1C
+FB37
+FB3D
+FB3F
+FB42
+FB45
+FBB2 FBD2
+FD40 FD4F
+FD90 FD91
+FDC8 FDEF
+FDFE FDFF
+FE1A FE1F
+FE27 FE2F
+FE53
+FE67
+FE6C FE6F
+FE75
+FEFD FF00
+FFBF FFC1
+FFC8 FFC9
+FFD0 FFD1
+FFD8 FFD9
+FFDD FFDF
+FFE7
+FFEF FFFB
+FFFE FFFF
+1000C
+10027
+1003B
+1003E
+1004E 1004F
+1005E 1007F
+100FB 100FF
+10103 10106
+10134 10136
+1018B 1018F
+1019C 101CF
+101FE 1027F
+1029D 1029F
+102D1 102FF
+1031F
+10324 1032F
+1034B 1037F
+1039E
+103C4 103C7
+103D6 103FF
+1049E 1049F
+104AA 107FF
+10806 10807
+10809
+10836
+10839 1083B
+1083D 1083E
+10840 108FF
+1091A 1091E
+1093A 1093E
+10940 109FF
+10A04
+10A07 10A0B
+10A14
+10A18
+10A34 10A37
+10A3B 10A3E
+10A48 10A4F
+10A59 11FFF
+1236F 123FF
+12463 1246F
+12474 1CFFF
+1D0F6 1D0FF
+1D127 1D128
+1D173 1D17A
+1D1DE 1D1FF
+1D246 1D2FF
+1D357 1D35F
+1D372 1D3FF
+1D455
+1D49D
+1D4A0 1D4A1
+1D4A3 1D4A4
+1D4A7 1D4A8
+1D4AD
+1D4BA
+1D4BC
+1D4C4
+1D506
+1D50B 1D50C
+1D515
+1D51D
+1D53A
+1D53F
+1D545
+1D547 1D549
+1D551
+1D6A6 1D6A7
+1D7CC 1D7CD
+1D800 1EFFF
+1F02C 1F02F
+1F094 1FFFF
+2A6D7 2F7FF
+2FA1E E00FF
+E01F0 10FFFF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Canadian.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Canadian.pl
new file mode 100755
index 00000000000..33179a93312
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Canadian.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{CanadianAboriginal} (and fuzzy permutations)
+#
+# Meaning: Script 'Canadian_Aboriginal'
+#
+return <<'END';
+1401 1676 Canadian_Aboriginal
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cari.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cari.pl
new file mode 100755
index 00000000000..e37740d1e1d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cari.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Carian} (and fuzzy permutations)
+#
+# Meaning: Script 'Carian'
+#
+return <<'END';
+102A0 102D0 Carian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cc.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cc.pl
new file mode 100755
index 00000000000..f71278311e3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cc.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Cc}
+# \p{Cc} (and fuzzy permutations)
+#
+# Meaning: General Category 'Cc'
+#
+return <<'END';
+0000 001F
+007F 009F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cf.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cf.pl
new file mode 100755
index 00000000000..320ddcc5229
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cf.pl
@@ -0,0 +1,31 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Cf}
+# \p{Cf} (and fuzzy permutations)
+#
+# Meaning: General Category 'Cf'
+#
+return <<'END';
+00AD
+0600 0603
+06DD
+070F
+17B4 17B5
+200B 200F
+202A 202E
+2060 2064
+206A 206F
+FEFF
+FFF9 FFFB
+1D173 1D17A
+E0001
+E0020 E007F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cham.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cham.pl
new file mode 100755
index 00000000000..53397fb1e3d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cham.pl
@@ -0,0 +1,20 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Cham} (and fuzzy permutations)
+#
+# Meaning: Script 'Cham'
+#
+return <<'END';
+AA00 AA36 Cham
+AA40 AA4D Cham
+AA50 AA59 Cham
+AA5C AA5F Cham
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cher.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cher.pl
new file mode 100755
index 00000000000..f79f5a2b931
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cher.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Cherokee} (and fuzzy permutations)
+#
+# Meaning: Script 'Cherokee'
+#
+return <<'END';
+13A0 13F4 Cherokee
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cn.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cn.pl
new file mode 100755
index 00000000000..5fa537e54a1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cn.pl
@@ -0,0 +1,462 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Cn}
+# \p{Cn} (and fuzzy permutations)
+#
+# Meaning: General Category 'Cn' [not functional in Perl]
+#
+return <<'END';
+0378 0379
+037F 0383
+038B
+038D
+03A2
+0524 0530
+0557 0558
+0560
+0588
+058B 0590
+05C8 05CF
+05EB 05EF
+05F5 05FF
+0604 0605
+061C 061D
+0620
+065F
+070E
+074B 074C
+07B2 07BF
+07FB 0900
+093A 093B
+094E 094F
+0955 0957
+0973 097A
+0980
+0984
+098D 098E
+0991 0992
+09A9
+09B1
+09B3 09B5
+09BA 09BB
+09C5 09C6
+09C9 09CA
+09CF 09D6
+09D8 09DB
+09DE
+09E4 09E5
+09FB 0A00
+0A04
+0A0B 0A0E
+0A11 0A12
+0A29
+0A31
+0A34
+0A37
+0A3A 0A3B
+0A3D
+0A43 0A46
+0A49 0A4A
+0A4E 0A50
+0A52 0A58
+0A5D
+0A5F 0A65
+0A76 0A80
+0A84
+0A8E
+0A92
+0AA9
+0AB1
+0AB4
+0ABA 0ABB
+0AC6
+0ACA
+0ACE 0ACF
+0AD1 0ADF
+0AE4 0AE5
+0AF0
+0AF2 0B00
+0B04
+0B0D 0B0E
+0B11 0B12
+0B29
+0B31
+0B34
+0B3A 0B3B
+0B45 0B46
+0B49 0B4A
+0B4E 0B55
+0B58 0B5B
+0B5E
+0B64 0B65
+0B72 0B81
+0B84
+0B8B 0B8D
+0B91
+0B96 0B98
+0B9B
+0B9D
+0BA0 0BA2
+0BA5 0BA7
+0BAB 0BAD
+0BBA 0BBD
+0BC3 0BC5
+0BC9
+0BCE 0BCF
+0BD1 0BD6
+0BD8 0BE5
+0BFB 0C00
+0C04
+0C0D
+0C11
+0C29
+0C34
+0C3A 0C3C
+0C45
+0C49
+0C4E 0C54
+0C57
+0C5A 0C5F
+0C64 0C65
+0C70 0C77
+0C80 0C81
+0C84
+0C8D
+0C91
+0CA9
+0CB4
+0CBA 0CBB
+0CC5
+0CC9
+0CCE 0CD4
+0CD7 0CDD
+0CDF
+0CE4 0CE5
+0CF0
+0CF3 0D01
+0D04
+0D0D
+0D11
+0D29
+0D3A 0D3C
+0D45
+0D49
+0D4E 0D56
+0D58 0D5F
+0D64 0D65
+0D76 0D78
+0D80 0D81
+0D84
+0D97 0D99
+0DB2
+0DBC
+0DBE 0DBF
+0DC7 0DC9
+0DCB 0DCE
+0DD5
+0DD7
+0DE0 0DF1
+0DF5 0E00
+0E3B 0E3E
+0E5C 0E80
+0E83
+0E85 0E86
+0E89
+0E8B 0E8C
+0E8E 0E93
+0E98
+0EA0
+0EA4
+0EA6
+0EA8 0EA9
+0EAC
+0EBA
+0EBE 0EBF
+0EC5
+0EC7
+0ECE 0ECF
+0EDA 0EDB
+0EDE 0EFF
+0F48
+0F6D 0F70
+0F8C 0F8F
+0F98
+0FBD
+0FCD
+0FD5 0FFF
+109A 109D
+10C6 10CF
+10FD 10FF
+115A 115E
+11A3 11A7
+11FA 11FF
+1249
+124E 124F
+1257
+1259
+125E 125F
+1289
+128E 128F
+12B1
+12B6 12B7
+12BF
+12C1
+12C6 12C7
+12D7
+1311
+1316 1317
+135B 135E
+137D 137F
+139A 139F
+13F5 1400
+1677 167F
+169D 169F
+16F1 16FF
+170D
+1715 171F
+1737 173F
+1754 175F
+176D
+1771
+1774 177F
+17DE 17DF
+17EA 17EF
+17FA 17FF
+180F
+181A 181F
+1878 187F
+18AB 18FF
+191D 191F
+192C 192F
+193C 193F
+1941 1943
+196E 196F
+1975 197F
+19AA 19AF
+19CA 19CF
+19DA 19DD
+1A1C 1A1D
+1A20 1AFF
+1B4C 1B4F
+1B7D 1B7F
+1BAB 1BAD
+1BBA 1BFF
+1C38 1C3A
+1C4A 1C4C
+1C80 1CFF
+1DE7 1DFD
+1F16 1F17
+1F1E 1F1F
+1F46 1F47
+1F4E 1F4F
+1F58
+1F5A
+1F5C
+1F5E
+1F7E 1F7F
+1FB5
+1FC5
+1FD4 1FD5
+1FDC
+1FF0 1FF1
+1FF5
+1FFF
+2065 2069
+2072 2073
+208F
+2095 209F
+20B6 20CF
+20F1 20FF
+2150 2152
+2189 218F
+23E8 23FF
+2427 243F
+244B 245F
+269E 269F
+26BD 26BF
+26C4 2700
+2705
+270A 270B
+2728
+274C
+274E
+2753 2755
+2757
+275F 2760
+2795 2797
+27B0
+27BF
+27CB
+27CD 27CF
+2B4D 2B4F
+2B55 2BFF
+2C2F
+2C5F
+2C70
+2C7E 2C7F
+2CEB 2CF8
+2D26 2D2F
+2D66 2D6E
+2D70 2D7F
+2D97 2D9F
+2DA7
+2DAF
+2DB7
+2DBF
+2DC7
+2DCF
+2DD7
+2DDF
+2E31 2E7F
+2E9A
+2EF4 2EFF
+2FD6 2FEF
+2FFC 2FFF
+3040
+3097 3098
+3100 3104
+312E 3130
+318F
+31B8 31BF
+31E4 31EF
+321F
+3244 324F
+32FF
+4DB6 4DBF
+9FC4 9FFF
+A48D A48F
+A4C7 A4FF
+A62C A63F
+A660 A661
+A674 A67B
+A698 A6FF
+A78D A7FA
+A82C A83F
+A878 A87F
+A8C5 A8CD
+A8DA A8FF
+A954 A95E
+A960 A9FF
+AA37 AA3F
+AA4E AA4F
+AA5A AA5B
+AA60 ABFF
+D7A4 D7FF
+FA2E FA2F
+FA6B FA6F
+FADA FAFF
+FB07 FB12
+FB18 FB1C
+FB37
+FB3D
+FB3F
+FB42
+FB45
+FBB2 FBD2
+FD40 FD4F
+FD90 FD91
+FDC8 FDEF
+FDFE FDFF
+FE1A FE1F
+FE27 FE2F
+FE53
+FE67
+FE6C FE6F
+FE75
+FEFD FEFE
+FF00
+FFBF FFC1
+FFC8 FFC9
+FFD0 FFD1
+FFD8 FFD9
+FFDD FFDF
+FFE7
+FFEF FFF8
+FFFE FFFF
+1000C
+10027
+1003B
+1003E
+1004E 1004F
+1005E 1007F
+100FB 100FF
+10103 10106
+10134 10136
+1018B 1018F
+1019C 101CF
+101FE 1027F
+1029D 1029F
+102D1 102FF
+1031F
+10324 1032F
+1034B 1037F
+1039E
+103C4 103C7
+103D6 103FF
+1049E 1049F
+104AA 107FF
+10806 10807
+10809
+10836
+10839 1083B
+1083D 1083E
+10840 108FF
+1091A 1091E
+1093A 1093E
+10940 109FF
+10A04
+10A07 10A0B
+10A14
+10A18
+10A34 10A37
+10A3B 10A3E
+10A48 10A4F
+10A59 11FFF
+1236F 123FF
+12463 1246F
+12474 1CFFF
+1D0F6 1D0FF
+1D127 1D128
+1D1DE 1D1FF
+1D246 1D2FF
+1D357 1D35F
+1D372 1D3FF
+1D455
+1D49D
+1D4A0 1D4A1
+1D4A3 1D4A4
+1D4A7 1D4A8
+1D4AD
+1D4BA
+1D4BC
+1D4C4
+1D506
+1D50B 1D50C
+1D515
+1D51D
+1D53A
+1D53F
+1D545
+1D547 1D549
+1D551
+1D6A6 1D6A7
+1D7CC 1D7CD
+1D800 1EFFF
+1F02C 1F02F
+1F094 1FFFF
+2A6D7 2F7FF
+2FA1E E0000
+E0002 E001F
+E0080 E00FF
+E01F0 EFFFF
+FFFFE FFFFF
+10FFFE 10FFFF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cntrl.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cntrl.pl
new file mode 100755
index 00000000000..76cd53e5525
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cntrl.pl
@@ -0,0 +1,35 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Cntrl}
+#
+# Meaning: [[:Cntrl:]]
+#
+return <<'END';
+0000 001F
+007F 009F
+00AD
+0600 0603
+06DD
+070F
+17B4 17B5
+200B 200F
+202A 202E
+2060 2064
+206A 206F
+D800 F8FF
+FEFF
+FFF9 FFFB
+1D173 1D17A
+E0001
+E0020 E007F
+F0000 FFFFD
+100000 10FFFD
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Co.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Co.pl
new file mode 100755
index 00000000000..4c034150b43
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Co.pl
@@ -0,0 +1,20 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Co}
+# \p{Co} (and fuzzy permutations)
+#
+# Meaning: General Category 'Co'
+#
+return <<'END';
+E000 F8FF
+F0000 FFFFD
+100000 10FFFD
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Copt.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Copt.pl
new file mode 100755
index 00000000000..ab81b596992
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Copt.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Coptic} (and fuzzy permutations)
+#
+# Meaning: Script 'Coptic'
+#
+return <<'END';
+03E2 03EF Coptic
+2C80 2CEA Coptic
+2CF9 2CFF Coptic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cprt.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cprt.pl
new file mode 100755
index 00000000000..ce0b061dba2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cprt.pl
@@ -0,0 +1,22 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Cypriot} (and fuzzy permutations)
+#
+# Meaning: Script 'Cypriot'
+#
+return <<'END';
+10800 10805 Cypriot
+10808 Cypriot
+1080A 10835 Cypriot
+10837 10838 Cypriot
+1083C Cypriot
+1083F Cypriot
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cs.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cs.pl
new file mode 100755
index 00000000000..81e87c9b51f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cs.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Cs}
+# \p{Cs} (and fuzzy permutations)
+#
+# Meaning: General Category 'Cs'
+#
+return <<'END';
+D800 DFFF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cyrl.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cyrl.pl
new file mode 100755
index 00000000000..572213e7a7d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Cyrl.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Cyrillic} (and fuzzy permutations)
+#
+# Meaning: Script 'Cyrillic'
+#
+return <<'END';
+0400 0523 Cyrillic
+1D2B Cyrillic
+1D78 Cyrillic
+2DE0 2DFF Cyrillic
+A640 A65F Cyrillic
+A662 A673 Cyrillic
+A67C A697 Cyrillic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dash.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dash.pl
new file mode 100755
index 00000000000..df151fd0298
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dash.pl
@@ -0,0 +1,31 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Dash'
+#
+return <<'END';
+002D Dash
+058A Dash
+05BE Dash
+1806 Dash
+2010 2015 Dash
+2053 Dash
+207B Dash
+208B Dash
+2212 Dash
+2E17 Dash
+2E1A Dash
+301C Dash
+3030 Dash
+30A0 Dash
+FE31 FE32 Dash
+FE58 Dash
+FE63 Dash
+FF0D Dash
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dash2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dash2.pl
new file mode 100755
index 00000000000..9a24886bc28
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dash2.pl
@@ -0,0 +1,34 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Dash} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Dash'
+#
+return <<'END';
+002D Dash
+058A Dash
+05BE Dash
+1806 Dash
+2010 2015 Dash
+2053 Dash
+207B Dash
+208B Dash
+2212 Dash
+2E17 Dash
+2E1A Dash
+301C Dash
+3030 Dash
+30A0 Dash
+FE31 FE32 Dash
+FE58 Dash
+FE63 Dash
+FF0D Dash
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/DefaultI.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/DefaultI.pl
new file mode 100755
index 00000000000..ab816c4cfda
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/DefaultI.pl
@@ -0,0 +1,56 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{DefaultIgnorableCodePoint} (and fuzzy permutations)
+#
+# Meaning: (?![\p{WhiteSpace}\x{FFF9}-\x{FFFB}])[\p{Cf}\p{Cc}\p{Cs}\p{NoncharacterCodePoint}\p{VariationSelector}\p{OtherDefaultIgnorableCodePoint}]
+#
+return <<'END';
+0000 0008
+000E 001F
+007F 0084
+0086 009F
+00AD
+034F
+0600 0603
+06DD
+070F
+115F 1160
+17B4 17B5
+180B 180D
+200B 200F
+202A 202E
+2060 206F
+3164
+D800 DFFF
+FDD0 FDEF
+FE00 FE0F
+FEFF
+FFA0
+FFF0 FFF8
+FFFE FFFF
+1D173 1D17A
+1FFFE 1FFFF
+2FFFE 2FFFF
+3FFFE 3FFFF
+4FFFE 4FFFF
+5FFFE 5FFFF
+6FFFE 6FFFF
+7FFFE 7FFFF
+8FFFE 8FFFF
+9FFFE 9FFFF
+AFFFE AFFFF
+BFFFE BFFFF
+CFFFE CFFFF
+DFFFE E0FFF
+EFFFE EFFFF
+FFFFE FFFFF
+10FFFE 10FFFF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dep.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dep.pl
new file mode 100755
index 00000000000..788517fa0b5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dep.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Deprecated'
+#
+return <<'END';
+0340 0341 Deprecated
+17A3 Deprecated
+17D3 Deprecated
+206A 206F Deprecated
+E0001 Deprecated
+E0020 E007F Deprecated
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Deprecat.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Deprecat.pl
new file mode 100755
index 00000000000..0b3c5bd1b60
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Deprecat.pl
@@ -0,0 +1,22 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Deprecated} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Deprecated'
+#
+return <<'END';
+0340 0341 Deprecated
+17A3 Deprecated
+17D3 Deprecated
+206A 206F Deprecated
+E0001 Deprecated
+E0020 E007F Deprecated
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Deva.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Deva.pl
new file mode 100755
index 00000000000..656f94dcb62
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Deva.pl
@@ -0,0 +1,24 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Devanagari} (and fuzzy permutations)
+#
+# Meaning: Script 'Devanagari'
+#
+return <<'END';
+0901 0939 Devanagari
+093C 094D Devanagari
+0950 Devanagari
+0953 0954 Devanagari
+0958 0963 Devanagari
+0966 096F Devanagari
+0971 0972 Devanagari
+097B 097F Devanagari
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dia.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dia.pl
new file mode 100755
index 00000000000..0b7efca4495
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dia.pl
@@ -0,0 +1,115 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Diacritic'
+#
+return <<'END';
+005E Diacritic
+0060 Diacritic
+00A8 Diacritic
+00AF Diacritic
+00B4 Diacritic
+00B7 00B8 Diacritic
+02B0 034E Diacritic
+0350 0357 Diacritic
+035D 0362 Diacritic
+0374 0375 Diacritic
+037A Diacritic
+0384 0385 Diacritic
+0483 0487 Diacritic
+0559 Diacritic
+0591 05A1 Diacritic
+05A3 05BD Diacritic
+05BF Diacritic
+05C1 05C2 Diacritic
+05C4 Diacritic
+064B 0652 Diacritic
+0657 0658 Diacritic
+06DF 06E0 Diacritic
+06E5 06E6 Diacritic
+06EA 06EC Diacritic
+0730 074A Diacritic
+07A6 07B0 Diacritic
+07EB 07F5 Diacritic
+093C Diacritic
+094D Diacritic
+0951 0954 Diacritic
+0971 Diacritic
+09BC Diacritic
+09CD Diacritic
+0A3C Diacritic
+0A4D Diacritic
+0ABC Diacritic
+0ACD Diacritic
+0B3C Diacritic
+0B4D Diacritic
+0BCD Diacritic
+0C4D Diacritic
+0CBC Diacritic
+0CCD Diacritic
+0D4D Diacritic
+0DCA Diacritic
+0E47 0E4C Diacritic
+0E4E Diacritic
+0EC8 0ECC Diacritic
+0F18 0F19 Diacritic
+0F35 Diacritic
+0F37 Diacritic
+0F39 Diacritic
+0F3E 0F3F Diacritic
+0F82 0F84 Diacritic
+0F86 0F87 Diacritic
+0FC6 Diacritic
+1037 Diacritic
+1039 103A Diacritic
+1087 108D Diacritic
+108F Diacritic
+17C9 17D3 Diacritic
+17DD Diacritic
+1939 193B Diacritic
+1B34 Diacritic
+1B44 Diacritic
+1B6B 1B73 Diacritic
+1BAA Diacritic
+1C36 1C37 Diacritic
+1C78 1C7D Diacritic
+1D2C 1D6A Diacritic
+1DC4 1DCF Diacritic
+1DFE 1DFF Diacritic
+1FBD Diacritic
+1FBF 1FC1 Diacritic
+1FCD 1FCF Diacritic
+1FDD 1FDF Diacritic
+1FED 1FEF Diacritic
+1FFD 1FFE Diacritic
+2E2F Diacritic
+302A 302F Diacritic
+3099 309C Diacritic
+30FC Diacritic
+A66F Diacritic
+A67C A67D Diacritic
+A67F Diacritic
+A717 A721 Diacritic
+A788 Diacritic
+A8C4 Diacritic
+A92B A92E Diacritic
+A953 Diacritic
+FB1E Diacritic
+FE20 FE26 Diacritic
+FF3E Diacritic
+FF40 Diacritic
+FF70 Diacritic
+FF9E FF9F Diacritic
+FFE3 Diacritic
+1D167 1D169 Diacritic
+1D16D 1D172 Diacritic
+1D17B 1D182 Diacritic
+1D185 1D18B Diacritic
+1D1AA 1D1AD Diacritic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Diacriti.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Diacriti.pl
new file mode 100755
index 00000000000..7afea683dbd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Diacriti.pl
@@ -0,0 +1,118 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Diacritic} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Diacritic'
+#
+return <<'END';
+005E Diacritic
+0060 Diacritic
+00A8 Diacritic
+00AF Diacritic
+00B4 Diacritic
+00B7 00B8 Diacritic
+02B0 034E Diacritic
+0350 0357 Diacritic
+035D 0362 Diacritic
+0374 0375 Diacritic
+037A Diacritic
+0384 0385 Diacritic
+0483 0487 Diacritic
+0559 Diacritic
+0591 05A1 Diacritic
+05A3 05BD Diacritic
+05BF Diacritic
+05C1 05C2 Diacritic
+05C4 Diacritic
+064B 0652 Diacritic
+0657 0658 Diacritic
+06DF 06E0 Diacritic
+06E5 06E6 Diacritic
+06EA 06EC Diacritic
+0730 074A Diacritic
+07A6 07B0 Diacritic
+07EB 07F5 Diacritic
+093C Diacritic
+094D Diacritic
+0951 0954 Diacritic
+0971 Diacritic
+09BC Diacritic
+09CD Diacritic
+0A3C Diacritic
+0A4D Diacritic
+0ABC Diacritic
+0ACD Diacritic
+0B3C Diacritic
+0B4D Diacritic
+0BCD Diacritic
+0C4D Diacritic
+0CBC Diacritic
+0CCD Diacritic
+0D4D Diacritic
+0DCA Diacritic
+0E47 0E4C Diacritic
+0E4E Diacritic
+0EC8 0ECC Diacritic
+0F18 0F19 Diacritic
+0F35 Diacritic
+0F37 Diacritic
+0F39 Diacritic
+0F3E 0F3F Diacritic
+0F82 0F84 Diacritic
+0F86 0F87 Diacritic
+0FC6 Diacritic
+1037 Diacritic
+1039 103A Diacritic
+1087 108D Diacritic
+108F Diacritic
+17C9 17D3 Diacritic
+17DD Diacritic
+1939 193B Diacritic
+1B34 Diacritic
+1B44 Diacritic
+1B6B 1B73 Diacritic
+1BAA Diacritic
+1C36 1C37 Diacritic
+1C78 1C7D Diacritic
+1D2C 1D6A Diacritic
+1DC4 1DCF Diacritic
+1DFE 1DFF Diacritic
+1FBD Diacritic
+1FBF 1FC1 Diacritic
+1FCD 1FCF Diacritic
+1FDD 1FDF Diacritic
+1FED 1FEF Diacritic
+1FFD 1FFE Diacritic
+2E2F Diacritic
+302A 302F Diacritic
+3099 309C Diacritic
+30FC Diacritic
+A66F Diacritic
+A67C A67D Diacritic
+A67F Diacritic
+A717 A721 Diacritic
+A788 Diacritic
+A8C4 Diacritic
+A92B A92E Diacritic
+A953 Diacritic
+FB1E Diacritic
+FE20 FE26 Diacritic
+FF3E Diacritic
+FF40 Diacritic
+FF70 Diacritic
+FF9E FF9F Diacritic
+FFE3 Diacritic
+1D167 1D169 Diacritic
+1D16D 1D172 Diacritic
+1D17B 1D182 Diacritic
+1D185 1D18B Diacritic
+1D1AA 1D1AD Diacritic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Digit.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Digit.pl
new file mode 100755
index 00000000000..d1e86f1f23f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Digit.pl
@@ -0,0 +1,49 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Digit}
+#
+# Meaning: [[:Digit:]]
+#
+return <<'END';
+0030 0039
+0660 0669
+06F0 06F9
+07C0 07C9
+0966 096F
+09E6 09EF
+0A66 0A6F
+0AE6 0AEF
+0B66 0B6F
+0BE6 0BEF
+0C66 0C6F
+0CE6 0CEF
+0D66 0D6F
+0E50 0E59
+0ED0 0ED9
+0F20 0F29
+1040 1049
+1090 1099
+17E0 17E9
+1810 1819
+1946 194F
+19D0 19D9
+1B50 1B59
+1BB0 1BB9
+1C40 1C49
+1C50 1C59
+A620 A629
+A8D0 A8D9
+A900 A909
+AA50 AA59
+FF10 FF19
+104A0 104A9
+1D7CE 1D7FF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dsrt.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dsrt.pl
new file mode 100755
index 00000000000..a8d8ee1d9fb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Dsrt.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Deseret} (and fuzzy permutations)
+#
+# Meaning: Script 'Deseret'
+#
+return <<'END';
+10400 1044F Deseret
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ethi.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ethi.pl
new file mode 100755
index 00000000000..8a170be4a01
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ethi.pl
@@ -0,0 +1,43 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Ethiopic} (and fuzzy permutations)
+#
+# Meaning: Script 'Ethiopic'
+#
+return <<'END';
+1200 1248 Ethiopic
+124A 124D Ethiopic
+1250 1256 Ethiopic
+1258 Ethiopic
+125A 125D Ethiopic
+1260 1288 Ethiopic
+128A 128D Ethiopic
+1290 12B0 Ethiopic
+12B2 12B5 Ethiopic
+12B8 12BE Ethiopic
+12C0 Ethiopic
+12C2 12C5 Ethiopic
+12C8 12D6 Ethiopic
+12D8 1310 Ethiopic
+1312 1315 Ethiopic
+1318 135A Ethiopic
+135F 137C Ethiopic
+1380 1399 Ethiopic
+2D80 2D96 Ethiopic
+2DA0 2DA6 Ethiopic
+2DA8 2DAE Ethiopic
+2DB0 2DB6 Ethiopic
+2DB8 2DBE Ethiopic
+2DC0 2DC6 Ethiopic
+2DC8 2DCE Ethiopic
+2DD0 2DD6 Ethiopic
+2DD8 2DDE Ethiopic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ext.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ext.pl
new file mode 100755
index 00000000000..2838942c8c4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ext.pl
@@ -0,0 +1,29 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Extender'
+#
+return <<'END';
+00B7 Extender
+02D0 02D1 Extender
+0640 Extender
+07FA Extender
+0E46 Extender
+0EC6 Extender
+1843 Extender
+1C36 Extender
+1C7B Extender
+3005 Extender
+3031 3035 Extender
+309D 309E Extender
+30FC 30FE Extender
+A015 Extender
+A60C Extender
+FF70 Extender
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Extender.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Extender.pl
new file mode 100755
index 00000000000..aa4cccdff18
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Extender.pl
@@ -0,0 +1,32 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Extender} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Extender'
+#
+return <<'END';
+00B7 Extender
+02D0 02D1 Extender
+0640 Extender
+07FA Extender
+0E46 Extender
+0EC6 Extender
+1843 Extender
+1C36 Extender
+1C7B Extender
+3005 Extender
+3031 3035 Extender
+309D 309E Extender
+30FC 30FE Extender
+A015 Extender
+A60C Extender
+FF70 Extender
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Geor.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Geor.pl
new file mode 100755
index 00000000000..e0486ad576a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Geor.pl
@@ -0,0 +1,20 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Georgian} (and fuzzy permutations)
+#
+# Meaning: Script 'Georgian'
+#
+return <<'END';
+10A0 10C5 Georgian
+10D0 10FA Georgian
+10FC Georgian
+2D00 2D25 Georgian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Glag.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Glag.pl
new file mode 100755
index 00000000000..67270d2a263
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Glag.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Glagolitic} (and fuzzy permutations)
+#
+# Meaning: Script 'Glagolitic'
+#
+return <<'END';
+2C00 2C2E Glagolitic
+2C30 2C5E Glagolitic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Goth.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Goth.pl
new file mode 100755
index 00000000000..e832fad5447
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Goth.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Gothic} (and fuzzy permutations)
+#
+# Meaning: Script 'Gothic'
+#
+return <<'END';
+10330 1034A Gothic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Graph.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Graph.pl
new file mode 100755
index 00000000000..cd17411de74
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Graph.pl
@@ -0,0 +1,465 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Graph}
+#
+# Meaning: [[:Graph:]]
+#
+return <<'END';
+0021 007E
+00A1 0377
+037A 037E
+0384 038A
+038C
+038E 03A1
+03A3 0523
+0531 0556
+0559 055F
+0561 0587
+0589 058A
+0591 05C7
+05D0 05EA
+05F0 05F4
+0600 0603
+0606 061B
+061E 061F
+0621 065E
+0660 070D
+070F 074A
+074D 07B1
+07C0 07FA
+0901 0939
+093C 094D
+0950 0954
+0958 0972
+097B 097F
+0981 0983
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BC 09C4
+09C7 09C8
+09CB 09CE
+09D7
+09DC 09DD
+09DF 09E3
+09E6 09FA
+0A01 0A03
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A3C
+0A3E 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A59 0A5C
+0A5E
+0A66 0A75
+0A81 0A83
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABC 0AC5
+0AC7 0AC9
+0ACB 0ACD
+0AD0
+0AE0 0AE3
+0AE6 0AEF
+0AF1
+0B01 0B03
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3C 0B44
+0B47 0B48
+0B4B 0B4D
+0B56 0B57
+0B5C 0B5D
+0B5F 0B63
+0B66 0B71
+0B82 0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BBE 0BC2
+0BC6 0BC8
+0BCA 0BCD
+0BD0
+0BD7
+0BE6 0BFA
+0C01 0C03
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D 0C44
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C58 0C59
+0C60 0C63
+0C66 0C6F
+0C78 0C7F
+0C82 0C83
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBC 0CC4
+0CC6 0CC8
+0CCA 0CCD
+0CD5 0CD6
+0CDE
+0CE0 0CE3
+0CE6 0CEF
+0CF1 0CF2
+0D02 0D03
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D 0D44
+0D46 0D48
+0D4A 0D4D
+0D57
+0D60 0D63
+0D66 0D75
+0D79 0D7F
+0D82 0D83
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0DCA
+0DCF 0DD4
+0DD6
+0DD8 0DDF
+0DF2 0DF4
+0E01 0E3A
+0E3F 0E5B
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB9
+0EBB 0EBD
+0EC0 0EC4
+0EC6
+0EC8 0ECD
+0ED0 0ED9
+0EDC 0EDD
+0F00 0F47
+0F49 0F6C
+0F71 0F8B
+0F90 0F97
+0F99 0FBC
+0FBE 0FCC
+0FCE 0FD4
+1000 1099
+109E 10C5
+10D0 10FC
+1100 1159
+115F 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+135F 137C
+1380 1399
+13A0 13F4
+1401 1676
+1681 169C
+16A0 16F0
+1700 170C
+170E 1714
+1720 1736
+1740 1753
+1760 176C
+176E 1770
+1772 1773
+1780 17DD
+17E0 17E9
+17F0 17F9
+1800 180D
+1810 1819
+1820 1877
+1880 18AA
+1900 191C
+1920 192B
+1930 193B
+1940
+1944 196D
+1970 1974
+1980 19A9
+19B0 19C9
+19D0 19D9
+19DE 1A1B
+1A1E 1A1F
+1B00 1B4B
+1B50 1B7C
+1B80 1BAA
+1BAE 1BB9
+1C00 1C37
+1C3B 1C49
+1C4D 1C7F
+1D00 1DE6
+1DFE 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FC4
+1FC6 1FD3
+1FD6 1FDB
+1FDD 1FEF
+1FF2 1FF4
+1FF6 1FFE
+200B 2027
+202A 202E
+2030 205E
+2060 2064
+206A 2071
+2074 208E
+2090 2094
+20A0 20B5
+20D0 20F0
+2100 214F
+2153 2188
+2190 23E7
+2400 2426
+2440 244A
+2460 269D
+26A0 26BC
+26C0 26C3
+2701 2704
+2706 2709
+270C 2727
+2729 274B
+274D
+274F 2752
+2756
+2758 275E
+2761 2794
+2798 27AF
+27B1 27BE
+27C0 27CA
+27CC
+27D0 2B4C
+2B50 2B54
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CEA
+2CF9 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+2DE0 2E30
+2E80 2E99
+2E9B 2EF3
+2F00 2FD5
+2FF0 2FFB
+3001 303F
+3041 3096
+3099 30FF
+3105 312D
+3131 318E
+3190 31B7
+31C0 31E3
+31F0 321E
+3220 3243
+3250 32FE
+3300 4DB5
+4DC0 9FC3
+A000 A48C
+A490 A4C6
+A500 A62B
+A640 A65F
+A662 A673
+A67C A697
+A700 A78C
+A7FB A82B
+A840 A877
+A880 A8C4
+A8CE A8D9
+A900 A953
+A95F
+AA00 AA36
+AA40 AA4D
+AA50 AA59
+AA5C AA5F
+AC00 D7A3
+E000 FA2D
+FA30 FA6A
+FA70 FAD9
+FB00 FB06
+FB13 FB17
+FB1D FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3F
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFD
+FE00 FE19
+FE20 FE26
+FE30 FE52
+FE54 FE66
+FE68 FE6B
+FE70 FE74
+FE76 FEFC
+FEFF
+FF01 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+FFE0 FFE6
+FFE8 FFEE
+FFF9 FFFD
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10100 10102
+10107 10133
+10137 1018A
+10190 1019B
+101D0 101FD
+10280 1029C
+102A0 102D0
+10300 1031E
+10320 10323
+10330 1034A
+10380 1039D
+1039F 103C3
+103C8 103D5
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10919
+1091F 10939
+1093F
+10A00 10A03
+10A05 10A06
+10A0C 10A13
+10A15 10A17
+10A19 10A33
+10A38 10A3A
+10A3F 10A47
+10A50 10A58
+12000 1236E
+12400 12462
+12470 12473
+1D000 1D0F5
+1D100 1D126
+1D129 1D1DD
+1D200 1D245
+1D300 1D356
+1D360 1D371
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D7CB
+1D7CE 1D7FF
+1F000 1F02B
+1F030 1F093
+20000 2A6D6
+2F800 2FA1D
+E0001
+E0020 E007F
+E0100 E01EF
+F0000 FFFFD
+100000 10FFFD
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Grek.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Grek.pl
new file mode 100755
index 00000000000..65d1d4c963b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Grek.pl
@@ -0,0 +1,49 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Greek} (and fuzzy permutations)
+#
+# Meaning: Script 'Greek'
+#
+return <<'END';
+0370 0373 Greek
+0375 0377 Greek
+037A 037D Greek
+0384 Greek
+0386 Greek
+0388 038A Greek
+038C Greek
+038E 03A1 Greek
+03A3 03E1 Greek
+03F0 03FF Greek
+1D26 1D2A Greek
+1D5D 1D61 Greek
+1D66 1D6A Greek
+1DBF Greek
+1F00 1F15 Greek
+1F18 1F1D Greek
+1F20 1F45 Greek
+1F48 1F4D Greek
+1F50 1F57 Greek
+1F59 Greek
+1F5B Greek
+1F5D Greek
+1F5F 1F7D Greek
+1F80 1FB4 Greek
+1FB6 1FC4 Greek
+1FC6 1FD3 Greek
+1FD6 1FDB Greek
+1FDD 1FEF Greek
+1FF2 1FF4 Greek
+1FF6 1FFE Greek
+2126 Greek
+10140 1018A Greek
+1D200 1D245 Greek
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Gujr.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Gujr.pl
new file mode 100755
index 00000000000..2750dea453d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Gujr.pl
@@ -0,0 +1,30 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Gujarati} (and fuzzy permutations)
+#
+# Meaning: Script 'Gujarati'
+#
+return <<'END';
+0A81 0A83 Gujarati
+0A85 0A8D Gujarati
+0A8F 0A91 Gujarati
+0A93 0AA8 Gujarati
+0AAA 0AB0 Gujarati
+0AB2 0AB3 Gujarati
+0AB5 0AB9 Gujarati
+0ABC 0AC5 Gujarati
+0AC7 0AC9 Gujarati
+0ACB 0ACD Gujarati
+0AD0 Gujarati
+0AE0 0AE3 Gujarati
+0AE6 0AEF Gujarati
+0AF1 Gujarati
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Guru.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Guru.pl
new file mode 100755
index 00000000000..2785675d460
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Guru.pl
@@ -0,0 +1,32 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Gurmukhi} (and fuzzy permutations)
+#
+# Meaning: Script 'Gurmukhi'
+#
+return <<'END';
+0A01 0A03 Gurmukhi
+0A05 0A0A Gurmukhi
+0A0F 0A10 Gurmukhi
+0A13 0A28 Gurmukhi
+0A2A 0A30 Gurmukhi
+0A32 0A33 Gurmukhi
+0A35 0A36 Gurmukhi
+0A38 0A39 Gurmukhi
+0A3C Gurmukhi
+0A3E 0A42 Gurmukhi
+0A47 0A48 Gurmukhi
+0A4B 0A4D Gurmukhi
+0A51 Gurmukhi
+0A59 0A5C Gurmukhi
+0A5E Gurmukhi
+0A66 0A75 Gurmukhi
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hang.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hang.pl
new file mode 100755
index 00000000000..a99e6d6af06
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hang.pl
@@ -0,0 +1,28 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Hangul} (and fuzzy permutations)
+#
+# Meaning: Script 'Hangul'
+#
+return <<'END';
+1100 1159 Hangul
+115F 11A2 Hangul
+11A8 11F9 Hangul
+3131 318E Hangul
+3200 321E Hangul
+3260 327E Hangul
+AC00 D7A3 Hangul
+FFA0 FFBE Hangul
+FFC2 FFC7 Hangul
+FFCA FFCF Hangul
+FFD2 FFD7 Hangul
+FFDA FFDC Hangul
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hani.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hani.pl
new file mode 100755
index 00000000000..f80ff27f138
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hani.pl
@@ -0,0 +1,30 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Han} (and fuzzy permutations)
+#
+# Meaning: Script 'Han'
+#
+return <<'END';
+2E80 2E99 Han
+2E9B 2EF3 Han
+2F00 2FD5 Han
+3005 Han
+3007 Han
+3021 3029 Han
+3038 303B Han
+3400 4DB5 Han
+4E00 9FC3 Han
+F900 FA2D Han
+FA30 FA6A Han
+FA70 FAD9 Han
+20000 2A6D6 Han
+2F800 2FA1D Han
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hano.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hano.pl
new file mode 100755
index 00000000000..d93f8c9e912
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hano.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Hanunoo} (and fuzzy permutations)
+#
+# Meaning: Script 'Hanunoo'
+#
+return <<'END';
+1720 1734 Hanunoo
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hebr.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hebr.pl
new file mode 100755
index 00000000000..b8e2bdcf965
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hebr.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Hebrew} (and fuzzy permutations)
+#
+# Meaning: Script 'Hebrew'
+#
+return <<'END';
+0591 05C7 Hebrew
+05D0 05EA Hebrew
+05F0 05F4 Hebrew
+FB1D FB36 Hebrew
+FB38 FB3C Hebrew
+FB3E Hebrew
+FB40 FB41 Hebrew
+FB43 FB44 Hebrew
+FB46 FB4F Hebrew
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hex.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hex.pl
new file mode 100755
index 00000000000..119926b1d5f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hex.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Hex_Digit'
+#
+return <<'END';
+0030 0039 Hex_Digit
+0041 0046 Hex_Digit
+0061 0066 Hex_Digit
+FF10 FF19 Hex_Digit
+FF21 FF26 Hex_Digit
+FF41 FF46 Hex_Digit
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/HexDigit.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/HexDigit.pl
new file mode 100755
index 00000000000..341b9e49927
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/HexDigit.pl
@@ -0,0 +1,22 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{HexDigit} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Hex_Digit'
+#
+return <<'END';
+0030 0039 Hex_Digit
+0041 0046 Hex_Digit
+0061 0066 Hex_Digit
+FF10 FF19 Hex_Digit
+FF21 FF26 Hex_Digit
+FF41 FF46 Hex_Digit
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hira.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hira.pl
new file mode 100755
index 00000000000..f8dca978385
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hira.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Hiragana} (and fuzzy permutations)
+#
+# Meaning: Script 'Hiragana'
+#
+return <<'END';
+3041 3096 Hiragana
+309D 309F Hiragana
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/HorizSpa.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/HorizSpa.pl
new file mode 100755
index 00000000000..2904e0d4038
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/HorizSpa.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{HorizSpace}
+#
+# Meaning: \h
+#
+return <<'END';
+0009
+0020
+00A0
+1680
+180E
+2000 200A
+202F
+205F
+3000
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hyphen.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hyphen.pl
new file mode 100755
index 00000000000..87a1bff3479
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hyphen.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Hyphen'
+#
+return <<'END';
+002D Hyphen
+00AD Hyphen
+058A Hyphen
+1806 Hyphen
+2010 2011 Hyphen
+2E17 Hyphen
+30FB Hyphen
+FE63 Hyphen
+FF0D Hyphen
+FF65 Hyphen
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hyphen2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hyphen2.pl
new file mode 100755
index 00000000000..f483bb20aa1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Hyphen2.pl
@@ -0,0 +1,26 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Hyphen} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Hyphen'
+#
+return <<'END';
+002D Hyphen
+00AD Hyphen
+058A Hyphen
+1806 Hyphen
+2010 2011 Hyphen
+2E17 Hyphen
+30FB Hyphen
+FE63 Hyphen
+FF0D Hyphen
+FF65 Hyphen
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IDSB.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IDSB.pl
new file mode 100755
index 00000000000..04560049fdd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IDSB.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'IDS_Binary_Operator'
+#
+return <<'END';
+2FF0 2FF1 IDS_Binary_Operator
+2FF4 2FFB IDS_Binary_Operator
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IDST.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IDST.pl
new file mode 100755
index 00000000000..fb1aeb81ad1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IDST.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'IDS_Trinary_Operator'
+#
+return <<'END';
+2FF2 2FF3 IDS_Trinary_Operator
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdContin.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdContin.pl
new file mode 100755
index 00000000000..08d06afca37
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdContin.pl
@@ -0,0 +1,494 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{IdContinue} (and fuzzy permutations)
+#
+# Meaning: [\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\p{OtherIDContinue}]
+#
+return <<'END';
+0030 0039
+0041 005A
+005F
+0061 007A
+00AA
+00B5
+00B7
+00BA
+00C0 00D6
+00D8 00F6
+00F8 02C1
+02C6 02D1
+02E0 02E4
+02EC
+02EE
+0300 0374
+0376 0377
+037A 037D
+0386 038A
+038C
+038E 03A1
+03A3 03F5
+03F7 0481
+0483 0487
+048A 0523
+0531 0556
+0559
+0561 0587
+0591 05BD
+05BF
+05C1 05C2
+05C4 05C5
+05C7
+05D0 05EA
+05F0 05F2
+0610 061A
+0621 065E
+0660 0669
+066E 06D3
+06D5 06DC
+06DF 06E8
+06EA 06FC
+06FF
+0710 074A
+074D 07B1
+07C0 07F5
+07FA
+0901 0939
+093C 094D
+0950 0954
+0958 0963
+0966 096F
+0971 0972
+097B 097F
+0981 0983
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BC 09C4
+09C7 09C8
+09CB 09CE
+09D7
+09DC 09DD
+09DF 09E3
+09E6 09F1
+0A01 0A03
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A3C
+0A3E 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A59 0A5C
+0A5E
+0A66 0A75
+0A81 0A83
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABC 0AC5
+0AC7 0AC9
+0ACB 0ACD
+0AD0
+0AE0 0AE3
+0AE6 0AEF
+0B01 0B03
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3C 0B44
+0B47 0B48
+0B4B 0B4D
+0B56 0B57
+0B5C 0B5D
+0B5F 0B63
+0B66 0B6F
+0B71
+0B82 0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BBE 0BC2
+0BC6 0BC8
+0BCA 0BCD
+0BD0
+0BD7
+0BE6 0BEF
+0C01 0C03
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D 0C44
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C58 0C59
+0C60 0C63
+0C66 0C6F
+0C82 0C83
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBC 0CC4
+0CC6 0CC8
+0CCA 0CCD
+0CD5 0CD6
+0CDE
+0CE0 0CE3
+0CE6 0CEF
+0D02 0D03
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D 0D44
+0D46 0D48
+0D4A 0D4D
+0D57
+0D60 0D63
+0D66 0D6F
+0D7A 0D7F
+0D82 0D83
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0DCA
+0DCF 0DD4
+0DD6
+0DD8 0DDF
+0DF2 0DF3
+0E01 0E3A
+0E40 0E4E
+0E50 0E59
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB9
+0EBB 0EBD
+0EC0 0EC4
+0EC6
+0EC8 0ECD
+0ED0 0ED9
+0EDC 0EDD
+0F00
+0F18 0F19
+0F20 0F29
+0F35
+0F37
+0F39
+0F3E 0F47
+0F49 0F6C
+0F71 0F84
+0F86 0F8B
+0F90 0F97
+0F99 0FBC
+0FC6
+1000 1049
+1050 1099
+10A0 10C5
+10D0 10FA
+10FC
+1100 1159
+115F 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+135F
+1369 1371
+1380 138F
+13A0 13F4
+1401 166C
+166F 1676
+1681 169A
+16A0 16EA
+16EE 16F0
+1700 170C
+170E 1714
+1720 1734
+1740 1753
+1760 176C
+176E 1770
+1772 1773
+1780 17B3
+17B6 17D3
+17D7
+17DC 17DD
+17E0 17E9
+180B 180D
+1810 1819
+1820 1877
+1880 18AA
+1900 191C
+1920 192B
+1930 193B
+1946 196D
+1970 1974
+1980 19A9
+19B0 19C9
+19D0 19D9
+1A00 1A1B
+1B00 1B4B
+1B50 1B59
+1B6B 1B73
+1B80 1BAA
+1BAE 1BB9
+1C00 1C37
+1C40 1C49
+1C4D 1C7D
+1D00 1DE6
+1DFE 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FBC
+1FBE
+1FC2 1FC4
+1FC6 1FCC
+1FD0 1FD3
+1FD6 1FDB
+1FE0 1FEC
+1FF2 1FF4
+1FF6 1FFC
+203F 2040
+2054
+2071
+207F
+2090 2094
+20D0 20DC
+20E1
+20E5 20F0
+2102
+2107
+210A 2113
+2115
+2118 211D
+2124
+2126
+2128
+212A 2139
+213C 213F
+2145 2149
+214E
+2160 2188
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CE4
+2D00 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+2DE0 2DFF
+2E2F
+3005 3007
+3021 302F
+3031 3035
+3038 303C
+3041 3096
+3099 309F
+30A1 30FA
+30FC 30FF
+3105 312D
+3131 318E
+31A0 31B7
+31F0 31FF
+3400 4DB5
+4E00 9FC3
+A000 A48C
+A500 A60C
+A610 A62B
+A640 A65F
+A662 A66F
+A67C A67D
+A67F A697
+A717 A71F
+A722 A788
+A78B A78C
+A7FB A827
+A840 A873
+A880 A8C4
+A8D0 A8D9
+A900 A92D
+A930 A953
+AA00 AA36
+AA40 AA4D
+AA50 AA59
+AC00 D7A3
+F900 FA2D
+FA30 FA6A
+FA70 FAD9
+FB00 FB06
+FB13 FB17
+FB1D FB28
+FB2A FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3D
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFB
+FE00 FE0F
+FE20 FE26
+FE33 FE34
+FE4D FE4F
+FE70 FE74
+FE76 FEFC
+FF10 FF19
+FF21 FF3A
+FF3F
+FF41 FF5A
+FF66 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10140 10174
+101FD
+10280 1029C
+102A0 102D0
+10300 1031E
+10330 1034A
+10380 1039D
+103A0 103C3
+103C8 103CF
+103D1 103D5
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10915
+10920 10939
+10A00 10A03
+10A05 10A06
+10A0C 10A13
+10A15 10A17
+10A19 10A33
+10A38 10A3A
+10A3F
+12000 1236E
+12400 12462
+1D165 1D169
+1D16D 1D172
+1D17B 1D182
+1D185 1D18B
+1D1AA 1D1AD
+1D242 1D244
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D6C0
+1D6C2 1D6DA
+1D6DC 1D6FA
+1D6FC 1D714
+1D716 1D734
+1D736 1D74E
+1D750 1D76E
+1D770 1D788
+1D78A 1D7A8
+1D7AA 1D7C2
+1D7C4 1D7CB
+1D7CE 1D7FF
+20000 2A6D6
+2F800 2FA1D
+E0100 E01EF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdStart.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdStart.pl
new file mode 100755
index 00000000000..422bdf56da0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdStart.pl
@@ -0,0 +1,409 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{IdStart} (and fuzzy permutations)
+#
+# Meaning: [\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{Nl}\p{OtherIDStart}]
+#
+return <<'END';
+0041 005A
+0061 007A
+00AA
+00B5
+00BA
+00C0 00D6
+00D8 00F6
+00F8 02C1
+02C6 02D1
+02E0 02E4
+02EC
+02EE
+0370 0374
+0376 0377
+037A 037D
+0386
+0388 038A
+038C
+038E 03A1
+03A3 03F5
+03F7 0481
+048A 0523
+0531 0556
+0559
+0561 0587
+05D0 05EA
+05F0 05F2
+0621 064A
+066E 066F
+0671 06D3
+06D5
+06E5 06E6
+06EE 06EF
+06FA 06FC
+06FF
+0710
+0712 072F
+074D 07A5
+07B1
+07CA 07EA
+07F4 07F5
+07FA
+0904 0939
+093D
+0950
+0958 0961
+0971 0972
+097B 097F
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BD
+09CE
+09DC 09DD
+09DF 09E1
+09F0 09F1
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A59 0A5C
+0A5E
+0A72 0A74
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABD
+0AD0
+0AE0 0AE1
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3D
+0B5C 0B5D
+0B5F 0B61
+0B71
+0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BD0
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D
+0C58 0C59
+0C60 0C61
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBD
+0CDE
+0CE0 0CE1
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D
+0D60 0D61
+0D7A 0D7F
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0E01 0E30
+0E32 0E33
+0E40 0E46
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB0
+0EB2 0EB3
+0EBD
+0EC0 0EC4
+0EC6
+0EDC 0EDD
+0F00
+0F40 0F47
+0F49 0F6C
+0F88 0F8B
+1000 102A
+103F
+1050 1055
+105A 105D
+1061
+1065 1066
+106E 1070
+1075 1081
+108E
+10A0 10C5
+10D0 10FA
+10FC
+1100 1159
+115F 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+1380 138F
+13A0 13F4
+1401 166C
+166F 1676
+1681 169A
+16A0 16EA
+16EE 16F0
+1700 170C
+170E 1711
+1720 1731
+1740 1751
+1760 176C
+176E 1770
+1780 17B3
+17D7
+17DC
+1820 1877
+1880 18A8
+18AA
+1900 191C
+1950 196D
+1970 1974
+1980 19A9
+19C1 19C7
+1A00 1A16
+1B05 1B33
+1B45 1B4B
+1B83 1BA0
+1BAE 1BAF
+1C00 1C23
+1C4D 1C4F
+1C5A 1C7D
+1D00 1DBF
+1E00 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FBC
+1FBE
+1FC2 1FC4
+1FC6 1FCC
+1FD0 1FD3
+1FD6 1FDB
+1FE0 1FEC
+1FF2 1FF4
+1FF6 1FFC
+2071
+207F
+2090 2094
+2102
+2107
+210A 2113
+2115
+2118 211D
+2124
+2126
+2128
+212A 2139
+213C 213F
+2145 2149
+214E
+2160 2188
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CE4
+2D00 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+2E2F
+3005 3007
+3021 3029
+3031 3035
+3038 303C
+3041 3096
+309B 309F
+30A1 30FA
+30FC 30FF
+3105 312D
+3131 318E
+31A0 31B7
+31F0 31FF
+3400 4DB5
+4E00 9FC3
+A000 A48C
+A500 A60C
+A610 A61F
+A62A A62B
+A640 A65F
+A662 A66E
+A67F A697
+A717 A71F
+A722 A788
+A78B A78C
+A7FB A801
+A803 A805
+A807 A80A
+A80C A822
+A840 A873
+A882 A8B3
+A90A A925
+A930 A946
+AA00 AA28
+AA40 AA42
+AA44 AA4B
+AC00 D7A3
+F900 FA2D
+FA30 FA6A
+FA70 FAD9
+FB00 FB06
+FB13 FB17
+FB1D
+FB1F FB28
+FB2A FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3D
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFB
+FE70 FE74
+FE76 FEFC
+FF21 FF3A
+FF41 FF5A
+FF66 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10140 10174
+10280 1029C
+102A0 102D0
+10300 1031E
+10330 1034A
+10380 1039D
+103A0 103C3
+103C8 103CF
+103D1 103D5
+10400 1049D
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10915
+10920 10939
+10A00
+10A10 10A13
+10A15 10A17
+10A19 10A33
+12000 1236E
+12400 12462
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D6C0
+1D6C2 1D6DA
+1D6DC 1D6FA
+1D6FC 1D714
+1D716 1D734
+1D736 1D74E
+1D750 1D76E
+1D770 1D788
+1D78A 1D7A8
+1D7AA 1D7C2
+1D7C4 1D7CB
+20000 2A6D6
+2F800 2FA1D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ideo.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ideo.pl
new file mode 100755
index 00000000000..a856b64a72c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ideo.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Ideographic'
+#
+return <<'END';
+3006 3007 Ideographic
+3021 3029 Ideographic
+3038 303A Ideographic
+3400 4DB5 Ideographic
+4E00 9FC3 Ideographic
+F900 FA2D Ideographic
+FA30 FA6A Ideographic
+FA70 FAD9 Ideographic
+20000 2A6D6 Ideographic
+2F800 2FA1D Ideographic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ideograp.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ideograp.pl
new file mode 100755
index 00000000000..9931b629566
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ideograp.pl
@@ -0,0 +1,26 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Ideographic} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Ideographic'
+#
+return <<'END';
+3006 3007 Ideographic
+3021 3029 Ideographic
+3038 303A Ideographic
+3400 4DB5 Ideographic
+4E00 9FC3 Ideographic
+F900 FA2D Ideographic
+FA30 FA6A Ideographic
+FA70 FAD9 Ideographic
+20000 2A6D6 Ideographic
+2F800 2FA1D Ideographic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdsBinar.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdsBinar.pl
new file mode 100755
index 00000000000..f8b75a69cb6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdsBinar.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{IdsBinaryOperator} (and fuzzy permutations)
+#
+# Meaning: Extended property 'IDS_Binary_Operator'
+#
+return <<'END';
+2FF0 2FF1 IDS_Binary_Operator
+2FF4 2FFB IDS_Binary_Operator
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdsTrina.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdsTrina.pl
new file mode 100755
index 00000000000..5e470ab42e2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/IdsTrina.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{IdsTrinaryOperator} (and fuzzy permutations)
+#
+# Meaning: Extended property 'IDS_Trinary_Operator'
+#
+return <<'END';
+2FF2 2FF3 IDS_Trinary_Operator
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAegean.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAegean.pl
new file mode 100755
index 00000000000..cc73f377708
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAegean.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InAegeanNumbers} (and fuzzy permutations)
+#
+# Meaning: Block 'Aegean Numbers'
+#
+return <<'END';
+10100 1013F Aegean Numbers
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAlphab.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAlphab.pl
new file mode 100755
index 00000000000..8d4704ce322
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAlphab.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InAlphabeticPresentationForms} (and fuzzy permutations)
+#
+# Meaning: Block 'Alphabetic Presentation Forms'
+#
+return <<'END';
+FB00 FB4F Alphabetic Presentation Forms
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAncie2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAncie2.pl
new file mode 100755
index 00000000000..b4898d13604
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAncie2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InAncientGreekNumbers} (and fuzzy permutations)
+#
+# Meaning: Block 'Ancient Greek Numbers'
+#
+return <<'END';
+10140 1018F Ancient Greek Numbers
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAncie3.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAncie3.pl
new file mode 100755
index 00000000000..8c8d56ceea4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAncie3.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InAncientGreekMusicalNotation} (and fuzzy permutations)
+#
+# Meaning: Block 'Ancient Greek Musical Notation'
+#
+return <<'END';
+1D200 1D24F Ancient Greek Musical Notation
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAncien.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAncien.pl
new file mode 100755
index 00000000000..8b12627b44d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InAncien.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InAncientSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Ancient Symbols'
+#
+return <<'END';
+10190 101CF Ancient Symbols
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabi2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabi2.pl
new file mode 100755
index 00000000000..62efeb9df48
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabi2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InArabicSupplement} (and fuzzy permutations)
+#
+# Meaning: Block 'Arabic Supplement'
+#
+return <<'END';
+0750 077F Arabic Supplement
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabi3.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabi3.pl
new file mode 100755
index 00000000000..1b4b40df7cf
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabi3.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InArabicPresentationFormsB} (and fuzzy permutations)
+#
+# Meaning: Block 'Arabic Presentation Forms-B'
+#
+return <<'END';
+FE70 FEFF Arabic Presentation Forms-B
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabi4.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabi4.pl
new file mode 100755
index 00000000000..8b59e12bcec
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabi4.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InArabicPresentationFormsA} (and fuzzy permutations)
+#
+# Meaning: Block 'Arabic Presentation Forms-A'
+#
+return <<'END';
+FB50 FDFF Arabic Presentation Forms-A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabic.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabic.pl
new file mode 100755
index 00000000000..18c532b8fe9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArabic.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InArabic} (and fuzzy permutations)
+#
+# Meaning: Block 'Arabic'
+#
+return <<'END';
+0600 06FF Arabic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArmeni.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArmeni.pl
new file mode 100755
index 00000000000..b65920032b3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArmeni.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InArmenian} (and fuzzy permutations)
+#
+# Meaning: Block 'Armenian'
+#
+return <<'END';
+0530 058F Armenian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArrows.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArrows.pl
new file mode 100755
index 00000000000..c48c86f6943
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InArrows.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InArrows} (and fuzzy permutations)
+#
+# Meaning: Block 'Arrows'
+#
+return <<'END';
+2190 21FF Arrows
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBaline.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBaline.pl
new file mode 100755
index 00000000000..cbc3bb2ed1a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBaline.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InBalinese} (and fuzzy permutations)
+#
+# Meaning: Block 'Balinese'
+#
+return <<'END';
+1B00 1B7F Balinese
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBasicL.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBasicL.pl
new file mode 100755
index 00000000000..e97092f6516
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBasicL.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InBasicLatin} (and fuzzy permutations)
+#
+# Meaning: Block 'Basic Latin'
+#
+return <<'END';
+0000 007F Basic Latin
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBengal.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBengal.pl
new file mode 100755
index 00000000000..9bb2d0818db
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBengal.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InBengali} (and fuzzy permutations)
+#
+# Meaning: Block 'Bengali'
+#
+return <<'END';
+0980 09FF Bengali
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBlockE.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBlockE.pl
new file mode 100755
index 00000000000..fc7f79093ac
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBlockE.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InBlockElements} (and fuzzy permutations)
+#
+# Meaning: Block 'Block Elements'
+#
+return <<'END';
+2580 259F Block Elements
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBopom2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBopom2.pl
new file mode 100755
index 00000000000..d7e80992723
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBopom2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InBopomofoExtended} (and fuzzy permutations)
+#
+# Meaning: Block 'Bopomofo Extended'
+#
+return <<'END';
+31A0 31BF Bopomofo Extended
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBopomo.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBopomo.pl
new file mode 100755
index 00000000000..420657fc3a3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBopomo.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InBopomofo} (and fuzzy permutations)
+#
+# Meaning: Block 'Bopomofo'
+#
+return <<'END';
+3100 312F Bopomofo
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBoxDra.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBoxDra.pl
new file mode 100755
index 00000000000..fdfbfce52c6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBoxDra.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InBoxDrawing} (and fuzzy permutations)
+#
+# Meaning: Block 'Box Drawing'
+#
+return <<'END';
+2500 257F Box Drawing
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBraill.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBraill.pl
new file mode 100755
index 00000000000..f0af0cfe423
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBraill.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InBraillePatterns} (and fuzzy permutations)
+#
+# Meaning: Block 'Braille Patterns'
+#
+return <<'END';
+2800 28FF Braille Patterns
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBugine.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBugine.pl
new file mode 100755
index 00000000000..ce857b5b457
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBugine.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InBuginese} (and fuzzy permutations)
+#
+# Meaning: Block 'Buginese'
+#
+return <<'END';
+1A00 1A1F Buginese
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBuhid.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBuhid.pl
new file mode 100755
index 00000000000..2d47bb0e3e4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InBuhid.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InBuhid} (and fuzzy permutations)
+#
+# Meaning: Block 'Buhid'
+#
+return <<'END';
+1740 175F Buhid
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InByzant.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InByzant.pl
new file mode 100755
index 00000000000..bed40a95f76
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InByzant.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InByzantineMusicalSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Byzantine Musical Symbols'
+#
+return <<'END';
+1D000 1D0FF Byzantine Musical Symbols
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCarian.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCarian.pl
new file mode 100755
index 00000000000..071052517e7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCarian.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCarian} (and fuzzy permutations)
+#
+# Meaning: Block 'Carian'
+#
+return <<'END';
+102A0 102DF Carian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCham.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCham.pl
new file mode 100755
index 00000000000..72367b756f6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCham.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCham} (and fuzzy permutations)
+#
+# Meaning: Block 'Cham'
+#
+return <<'END';
+AA00 AA5F Cham
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCherok.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCherok.pl
new file mode 100755
index 00000000000..e210c636162
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCherok.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCherokee} (and fuzzy permutations)
+#
+# Meaning: Block 'Cherokee'
+#
+return <<'END';
+13A0 13FF Cherokee
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCo2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCo2.pl
new file mode 100755
index 00000000000..3c850892b58
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCo2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCjkCompatibilityForms} (and fuzzy permutations)
+#
+# Meaning: Block 'CJK Compatibility Forms'
+#
+return <<'END';
+FE30 FE4F CJK Compatibility Forms
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCo3.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCo3.pl
new file mode 100755
index 00000000000..0a01091d532
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCo3.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCjkCompatibilityIdeographs} (and fuzzy permutations)
+#
+# Meaning: Block 'CJK Compatibility Ideographs'
+#
+return <<'END';
+F900 FAFF CJK Compatibility Ideographs
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCo4.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCo4.pl
new file mode 100755
index 00000000000..ab46837ebb8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCo4.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCjkCompatibilityIdeographsSupplement} (and fuzzy permutations)
+#
+# Meaning: Block 'CJK Compatibility Ideographs Supplement'
+#
+return <<'END';
+2F800 2FA1F CJK Compatibility Ideographs Supplement
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCom.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCom.pl
new file mode 100755
index 00000000000..a252060d9b0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkCom.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCjkCompatibility} (and fuzzy permutations)
+#
+# Meaning: Block 'CJK Compatibility'
+#
+return <<'END';
+3300 33FF CJK Compatibility
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkRad.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkRad.pl
new file mode 100755
index 00000000000..c4f22fc136a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkRad.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCjkRadicalsSupplement} (and fuzzy permutations)
+#
+# Meaning: Block 'CJK Radicals Supplement'
+#
+return <<'END';
+2E80 2EFF CJK Radicals Supplement
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkStr.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkStr.pl
new file mode 100755
index 00000000000..5d87c2f0251
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkStr.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCjkStrokes} (and fuzzy permutations)
+#
+# Meaning: Block 'CJK Strokes'
+#
+return <<'END';
+31C0 31EF CJK Strokes
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkSym.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkSym.pl
new file mode 100755
index 00000000000..f9f93e8e1e5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkSym.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCjkSymbolsAndPunctuation} (and fuzzy permutations)
+#
+# Meaning: Block 'CJK Symbols and Punctuation'
+#
+return <<'END';
+3000 303F CJK Symbols and Punctuation
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkUn2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkUn2.pl
new file mode 100755
index 00000000000..00352877e97
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkUn2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCjkUnifiedIdeographsExtensionB} (and fuzzy permutations)
+#
+# Meaning: Block 'CJK Unified Ideographs Extension B'
+#
+return <<'END';
+20000 2A6DF CJK Unified Ideographs Extension B
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkUn3.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkUn3.pl
new file mode 100755
index 00000000000..78e1d12826f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkUn3.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCjkUnifiedIdeographsExtensionA} (and fuzzy permutations)
+#
+# Meaning: Block 'CJK Unified Ideographs Extension A'
+#
+return <<'END';
+3400 4DBF CJK Unified Ideographs Extension A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkUni.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkUni.pl
new file mode 100755
index 00000000000..b4735a04207
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCjkUni.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCjkUnifiedIdeographs} (and fuzzy permutations)
+#
+# Meaning: Block 'CJK Unified Ideographs'
+#
+return <<'END';
+4E00 9FFF CJK Unified Ideographs
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombi2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombi2.pl
new file mode 100755
index 00000000000..50a2949d212
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombi2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCombiningDiacriticalMarks} (and fuzzy permutations)
+#
+# Meaning: Block 'Combining Diacritical Marks'
+#
+return <<'END';
+0300 036F Combining Diacritical Marks
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombi3.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombi3.pl
new file mode 100755
index 00000000000..280200d0442
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombi3.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCombiningDiacriticalMarksSupplement} (and fuzzy permutations)
+#
+# Meaning: Block 'Combining Diacritical Marks Supplement'
+#
+return <<'END';
+1DC0 1DFF Combining Diacritical Marks Supplement
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombi4.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombi4.pl
new file mode 100755
index 00000000000..2de43b2d919
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombi4.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCombiningDiacriticalMarksForSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Combining Diacritical Marks for Symbols'
+#
+return <<'END';
+20D0 20FF Combining Diacritical Marks for Symbols
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombin.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombin.pl
new file mode 100755
index 00000000000..e335925205e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCombin.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCombiningHalfMarks} (and fuzzy permutations)
+#
+# Meaning: Block 'Combining Half Marks'
+#
+return <<'END';
+FE20 FE2F Combining Half Marks
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InContro.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InContro.pl
new file mode 100755
index 00000000000..d1aca669252
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InContro.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InControlPictures} (and fuzzy permutations)
+#
+# Meaning: Block 'Control Pictures'
+#
+return <<'END';
+2400 243F Control Pictures
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCoptic.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCoptic.pl
new file mode 100755
index 00000000000..45f963c2808
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCoptic.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCoptic} (and fuzzy permutations)
+#
+# Meaning: Block 'Coptic'
+#
+return <<'END';
+2C80 2CFF Coptic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCounti.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCounti.pl
new file mode 100755
index 00000000000..e5ad9e2b546
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCounti.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCountingRodNumerals} (and fuzzy permutations)
+#
+# Meaning: Block 'Counting Rod Numerals'
+#
+return <<'END';
+1D360 1D37F Counting Rod Numerals
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCunei2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCunei2.pl
new file mode 100755
index 00000000000..478c07c519b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCunei2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCuneiformNumbersAndPunctuation} (and fuzzy permutations)
+#
+# Meaning: Block 'Cuneiform Numbers and Punctuation'
+#
+return <<'END';
+12400 1247F Cuneiform Numbers and Punctuation
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCuneif.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCuneif.pl
new file mode 100755
index 00000000000..b29a8cec6c2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCuneif.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCuneiform} (and fuzzy permutations)
+#
+# Meaning: Block 'Cuneiform'
+#
+return <<'END';
+12000 123FF Cuneiform
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCurren.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCurren.pl
new file mode 100755
index 00000000000..581568a4984
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCurren.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCurrencySymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Currency Symbols'
+#
+return <<'END';
+20A0 20CF Currency Symbols
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyprio.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyprio.pl
new file mode 100755
index 00000000000..1462c528319
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyprio.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCypriotSyllabary} (and fuzzy permutations)
+#
+# Meaning: Block 'Cypriot Syllabary'
+#
+return <<'END';
+10800 1083F Cypriot Syllabary
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyril2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyril2.pl
new file mode 100755
index 00000000000..61d19b7408b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyril2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCyrillicExtendedB} (and fuzzy permutations)
+#
+# Meaning: Block 'Cyrillic Extended-B'
+#
+return <<'END';
+A640 A69F Cyrillic Extended-B
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyril3.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyril3.pl
new file mode 100755
index 00000000000..87232da26b9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyril3.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCyrillicExtendedA} (and fuzzy permutations)
+#
+# Meaning: Block 'Cyrillic Extended-A'
+#
+return <<'END';
+2DE0 2DFF Cyrillic Extended-A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyril4.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyril4.pl
new file mode 100755
index 00000000000..760d69c8b80
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyril4.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCyrillicSupplement} (and fuzzy permutations)
+#
+# Meaning: Block 'Cyrillic Supplement'
+#
+return <<'END';
+0500 052F Cyrillic Supplement
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyrill.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyrill.pl
new file mode 100755
index 00000000000..0b5d6cb0efe
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InCyrill.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InCyrillic} (and fuzzy permutations)
+#
+# Meaning: Block 'Cyrillic'
+#
+return <<'END';
+0400 04FF Cyrillic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDesere.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDesere.pl
new file mode 100755
index 00000000000..aeb76f650ec
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDesere.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InDeseret} (and fuzzy permutations)
+#
+# Meaning: Block 'Deseret'
+#
+return <<'END';
+10400 1044F Deseret
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDevana.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDevana.pl
new file mode 100755
index 00000000000..e94b158df96
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDevana.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InDevanagari} (and fuzzy permutations)
+#
+# Meaning: Block 'Devanagari'
+#
+return <<'END';
+0900 097F Devanagari
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDingba.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDingba.pl
new file mode 100755
index 00000000000..7d064cbff00
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDingba.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InDingbats} (and fuzzy permutations)
+#
+# Meaning: Block 'Dingbats'
+#
+return <<'END';
+2700 27BF Dingbats
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDomino.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDomino.pl
new file mode 100755
index 00000000000..b58cf90237a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InDomino.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InDominoTiles} (and fuzzy permutations)
+#
+# Meaning: Block 'Domino Tiles'
+#
+return <<'END';
+1F030 1F09F Domino Tiles
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEnclo2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEnclo2.pl
new file mode 100755
index 00000000000..5342dce5a15
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEnclo2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InEnclosedCjkLettersAndMonths} (and fuzzy permutations)
+#
+# Meaning: Block 'Enclosed CJK Letters and Months'
+#
+return <<'END';
+3200 32FF Enclosed CJK Letters and Months
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEnclos.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEnclos.pl
new file mode 100755
index 00000000000..5118f3e0626
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEnclos.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InEnclosedAlphanumerics} (and fuzzy permutations)
+#
+# Meaning: Block 'Enclosed Alphanumerics'
+#
+return <<'END';
+2460 24FF Enclosed Alphanumerics
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEthio2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEthio2.pl
new file mode 100755
index 00000000000..e3186783b6c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEthio2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InEthiopicExtended} (and fuzzy permutations)
+#
+# Meaning: Block 'Ethiopic Extended'
+#
+return <<'END';
+2D80 2DDF Ethiopic Extended
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEthio3.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEthio3.pl
new file mode 100755
index 00000000000..b93d5fbc1d1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEthio3.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InEthiopicSupplement} (and fuzzy permutations)
+#
+# Meaning: Block 'Ethiopic Supplement'
+#
+return <<'END';
+1380 139F Ethiopic Supplement
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEthiop.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEthiop.pl
new file mode 100755
index 00000000000..298a03154fa
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InEthiop.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InEthiopic} (and fuzzy permutations)
+#
+# Meaning: Block 'Ethiopic'
+#
+return <<'END';
+1200 137F Ethiopic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGenera.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGenera.pl
new file mode 100755
index 00000000000..d460179a011
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGenera.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InGeneralPunctuation} (and fuzzy permutations)
+#
+# Meaning: Block 'General Punctuation'
+#
+return <<'END';
+2000 206F General Punctuation
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGeomet.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGeomet.pl
new file mode 100755
index 00000000000..cc1225d5278
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGeomet.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InGeometricShapes} (and fuzzy permutations)
+#
+# Meaning: Block 'Geometric Shapes'
+#
+return <<'END';
+25A0 25FF Geometric Shapes
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGeorg2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGeorg2.pl
new file mode 100755
index 00000000000..7ac4ecb59e7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGeorg2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InGeorgianSupplement} (and fuzzy permutations)
+#
+# Meaning: Block 'Georgian Supplement'
+#
+return <<'END';
+2D00 2D2F Georgian Supplement
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGeorgi.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGeorgi.pl
new file mode 100755
index 00000000000..1ea6e430381
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGeorgi.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InGeorgian} (and fuzzy permutations)
+#
+# Meaning: Block 'Georgian'
+#
+return <<'END';
+10A0 10FF Georgian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGlagol.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGlagol.pl
new file mode 100755
index 00000000000..37ffa7679f4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGlagol.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InGlagolitic} (and fuzzy permutations)
+#
+# Meaning: Block 'Glagolitic'
+#
+return <<'END';
+2C00 2C5F Glagolitic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGothic.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGothic.pl
new file mode 100755
index 00000000000..39e3d9e34d7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGothic.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InGothic} (and fuzzy permutations)
+#
+# Meaning: Block 'Gothic'
+#
+return <<'END';
+10330 1034F Gothic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGreekA.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGreekA.pl
new file mode 100755
index 00000000000..465162ce09b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGreekA.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InGreekAndCoptic} (and fuzzy permutations)
+#
+# Meaning: Block 'Greek and Coptic'
+#
+return <<'END';
+0370 03FF Greek and Coptic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGreekE.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGreekE.pl
new file mode 100755
index 00000000000..ce9d961d542
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGreekE.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InGreekExtended} (and fuzzy permutations)
+#
+# Meaning: Block 'Greek Extended'
+#
+return <<'END';
+1F00 1FFF Greek Extended
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGujara.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGujara.pl
new file mode 100755
index 00000000000..cbfa9f2047b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGujara.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InGujarati} (and fuzzy permutations)
+#
+# Meaning: Block 'Gujarati'
+#
+return <<'END';
+0A80 0AFF Gujarati
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGurmuk.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGurmuk.pl
new file mode 100755
index 00000000000..f2e8ace9094
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InGurmuk.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InGurmukhi} (and fuzzy permutations)
+#
+# Meaning: Block 'Gurmukhi'
+#
+return <<'END';
+0A00 0A7F Gurmukhi
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHalfwi.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHalfwi.pl
new file mode 100755
index 00000000000..f474f2ab202
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHalfwi.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InHalfwidthAndFullwidthForms} (and fuzzy permutations)
+#
+# Meaning: Block 'Halfwidth and Fullwidth Forms'
+#
+return <<'END';
+FF00 FFEF Halfwidth and Fullwidth Forms
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHangu2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHangu2.pl
new file mode 100755
index 00000000000..dda7657ac40
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHangu2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InHangulSyllables} (and fuzzy permutations)
+#
+# Meaning: Block 'Hangul Syllables'
+#
+return <<'END';
+AC00 D7AF Hangul Syllables
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHangu3.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHangu3.pl
new file mode 100755
index 00000000000..f5498c0ce8a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHangu3.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InHangulCompatibilityJamo} (and fuzzy permutations)
+#
+# Meaning: Block 'Hangul Compatibility Jamo'
+#
+return <<'END';
+3130 318F Hangul Compatibility Jamo
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHangul.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHangul.pl
new file mode 100755
index 00000000000..7ffa0b2116e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHangul.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InHangulJamo} (and fuzzy permutations)
+#
+# Meaning: Block 'Hangul Jamo'
+#
+return <<'END';
+1100 11FF Hangul Jamo
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHanuno.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHanuno.pl
new file mode 100755
index 00000000000..7c4a4cedbfd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHanuno.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InHanunoo} (and fuzzy permutations)
+#
+# Meaning: Block 'Hanunoo'
+#
+return <<'END';
+1720 173F Hanunoo
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHebrew.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHebrew.pl
new file mode 100755
index 00000000000..49acd29d006
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHebrew.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InHebrew} (and fuzzy permutations)
+#
+# Meaning: Block 'Hebrew'
+#
+return <<'END';
+0590 05FF Hebrew
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHighPr.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHighPr.pl
new file mode 100755
index 00000000000..06ffb3d1921
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHighPr.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InHighPrivateUseSurrogates} (and fuzzy permutations)
+#
+# Meaning: Block 'High Private Use Surrogates'
+#
+return <<'END';
+DB80 DBFF High Private Use Surrogates
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHighSu.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHighSu.pl
new file mode 100755
index 00000000000..e23cdc6627e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHighSu.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InHighSurrogates} (and fuzzy permutations)
+#
+# Meaning: Block 'High Surrogates'
+#
+return <<'END';
+D800 DB7F High Surrogates
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHiraga.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHiraga.pl
new file mode 100755
index 00000000000..37f61fd6930
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InHiraga.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InHiragana} (and fuzzy permutations)
+#
+# Meaning: Block 'Hiragana'
+#
+return <<'END';
+3040 309F Hiragana
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InIdeogr.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InIdeogr.pl
new file mode 100755
index 00000000000..59f490bf186
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InIdeogr.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InIdeographicDescriptionCharacters} (and fuzzy permutations)
+#
+# Meaning: Block 'Ideographic Description Characters'
+#
+return <<'END';
+2FF0 2FFF Ideographic Description Characters
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InIpaExt.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InIpaExt.pl
new file mode 100755
index 00000000000..0a74354d543
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InIpaExt.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InIpaExtensions} (and fuzzy permutations)
+#
+# Meaning: Block 'IPA Extensions'
+#
+return <<'END';
+0250 02AF IPA Extensions
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKanbun.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKanbun.pl
new file mode 100755
index 00000000000..c286b592ab3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKanbun.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InKanbun} (and fuzzy permutations)
+#
+# Meaning: Block 'Kanbun'
+#
+return <<'END';
+3190 319F Kanbun
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKangxi.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKangxi.pl
new file mode 100755
index 00000000000..c3716b3e884
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKangxi.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InKangxiRadicals} (and fuzzy permutations)
+#
+# Meaning: Block 'Kangxi Radicals'
+#
+return <<'END';
+2F00 2FDF Kangxi Radicals
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKannad.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKannad.pl
new file mode 100755
index 00000000000..b2874ae66f6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKannad.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InKannada} (and fuzzy permutations)
+#
+# Meaning: Block 'Kannada'
+#
+return <<'END';
+0C80 0CFF Kannada
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKatak2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKatak2.pl
new file mode 100755
index 00000000000..badb508ce42
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKatak2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InKatakanaPhoneticExtensions} (and fuzzy permutations)
+#
+# Meaning: Block 'Katakana Phonetic Extensions'
+#
+return <<'END';
+31F0 31FF Katakana Phonetic Extensions
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKataka.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKataka.pl
new file mode 100755
index 00000000000..59229b27441
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKataka.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InKatakana} (and fuzzy permutations)
+#
+# Meaning: Block 'Katakana'
+#
+return <<'END';
+30A0 30FF Katakana
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKayahL.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKayahL.pl
new file mode 100755
index 00000000000..19321381c8c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKayahL.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InKayahLi} (and fuzzy permutations)
+#
+# Meaning: Block 'Kayah Li'
+#
+return <<'END';
+A900 A92F Kayah Li
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKharos.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKharos.pl
new file mode 100755
index 00000000000..6d1da4868ce
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKharos.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InKharoshthi} (and fuzzy permutations)
+#
+# Meaning: Block 'Kharoshthi'
+#
+return <<'END';
+10A00 10A5F Kharoshthi
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKhmer.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKhmer.pl
new file mode 100755
index 00000000000..966c88bf9b1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKhmer.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InKhmer} (and fuzzy permutations)
+#
+# Meaning: Block 'Khmer'
+#
+return <<'END';
+1780 17FF Khmer
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKhmerS.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKhmerS.pl
new file mode 100755
index 00000000000..31ec4097af4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InKhmerS.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InKhmerSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Khmer Symbols'
+#
+return <<'END';
+19E0 19FF Khmer Symbols
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLao.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLao.pl
new file mode 100755
index 00000000000..f55ac6e627e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLao.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLao} (and fuzzy permutations)
+#
+# Meaning: Block 'Lao'
+#
+return <<'END';
+0E80 0EFF Lao
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin1.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin1.pl
new file mode 100755
index 00000000000..afe988f8c83
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin1.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLatin1Supplement} (and fuzzy permutations)
+#
+# Meaning: Block 'Latin-1 Supplement'
+#
+return <<'END';
+0080 00FF Latin-1 Supplement
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin2.pl
new file mode 100755
index 00000000000..06fbce65b58
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLatinExtendedA} (and fuzzy permutations)
+#
+# Meaning: Block 'Latin Extended-A'
+#
+return <<'END';
+0100 017F Latin Extended-A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin3.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin3.pl
new file mode 100755
index 00000000000..1a0b7b37d49
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin3.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLatinExtendedD} (and fuzzy permutations)
+#
+# Meaning: Block 'Latin Extended-D'
+#
+return <<'END';
+A720 A7FF Latin Extended-D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin4.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin4.pl
new file mode 100755
index 00000000000..0c6e40e3cfd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin4.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLatinExtendedC} (and fuzzy permutations)
+#
+# Meaning: Block 'Latin Extended-C'
+#
+return <<'END';
+2C60 2C7F Latin Extended-C
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin5.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin5.pl
new file mode 100755
index 00000000000..11d10a0e9bf
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatin5.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLatinExtendedAdditional} (and fuzzy permutations)
+#
+# Meaning: Block 'Latin Extended Additional'
+#
+return <<'END';
+1E00 1EFF Latin Extended Additional
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatinE.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatinE.pl
new file mode 100755
index 00000000000..9490c6a7c64
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLatinE.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLatinExtendedB} (and fuzzy permutations)
+#
+# Meaning: Block 'Latin Extended-B'
+#
+return <<'END';
+0180 024F Latin Extended-B
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLepcha.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLepcha.pl
new file mode 100755
index 00000000000..faeff44e758
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLepcha.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLepcha} (and fuzzy permutations)
+#
+# Meaning: Block 'Lepcha'
+#
+return <<'END';
+1C00 1C4F Lepcha
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLetter.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLetter.pl
new file mode 100755
index 00000000000..3e3bce2ce34
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLetter.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLetterlikeSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Letterlike Symbols'
+#
+return <<'END';
+2100 214F Letterlike Symbols
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLimbu.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLimbu.pl
new file mode 100755
index 00000000000..87f11d2bcae
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLimbu.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLimbu} (and fuzzy permutations)
+#
+# Meaning: Block 'Limbu'
+#
+return <<'END';
+1900 194F Limbu
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLinea2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLinea2.pl
new file mode 100755
index 00000000000..922774024f9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLinea2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLinearBSyllabary} (and fuzzy permutations)
+#
+# Meaning: Block 'Linear B Syllabary'
+#
+return <<'END';
+10000 1007F Linear B Syllabary
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLinear.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLinear.pl
new file mode 100755
index 00000000000..62fce44e997
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLinear.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLinearBIdeograms} (and fuzzy permutations)
+#
+# Meaning: Block 'Linear B Ideograms'
+#
+return <<'END';
+10080 100FF Linear B Ideograms
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLowSur.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLowSur.pl
new file mode 100755
index 00000000000..0037fd6ce81
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLowSur.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLowSurrogates} (and fuzzy permutations)
+#
+# Meaning: Block 'Low Surrogates'
+#
+return <<'END';
+DC00 DFFF Low Surrogates
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLycian.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLycian.pl
new file mode 100755
index 00000000000..2a96ca9a195
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLycian.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLycian} (and fuzzy permutations)
+#
+# Meaning: Block 'Lycian'
+#
+return <<'END';
+10280 1029F Lycian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLydian.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLydian.pl
new file mode 100755
index 00000000000..98a965b47c6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InLydian.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InLydian} (and fuzzy permutations)
+#
+# Meaning: Block 'Lydian'
+#
+return <<'END';
+10920 1093F Lydian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMahjon.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMahjon.pl
new file mode 100755
index 00000000000..19dfec965db
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMahjon.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InMahjongTiles} (and fuzzy permutations)
+#
+# Meaning: Block 'Mahjong Tiles'
+#
+return <<'END';
+1F000 1F02F Mahjong Tiles
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMalaya.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMalaya.pl
new file mode 100755
index 00000000000..eb2361f7810
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMalaya.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InMalayalam} (and fuzzy permutations)
+#
+# Meaning: Block 'Malayalam'
+#
+return <<'END';
+0D00 0D7F Malayalam
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMathe2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMathe2.pl
new file mode 100755
index 00000000000..09c52b39de4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMathe2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InMathematicalAlphanumericSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Mathematical Alphanumeric Symbols'
+#
+return <<'END';
+1D400 1D7FF Mathematical Alphanumeric Symbols
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMathem.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMathem.pl
new file mode 100755
index 00000000000..5214abdb076
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMathem.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InMathematicalOperators} (and fuzzy permutations)
+#
+# Meaning: Block 'Mathematical Operators'
+#
+return <<'END';
+2200 22FF Mathematical Operators
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce2.pl
new file mode 100755
index 00000000000..e56237ea742
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InMiscellaneousTechnical} (and fuzzy permutations)
+#
+# Meaning: Block 'Miscellaneous Technical'
+#
+return <<'END';
+2300 23FF Miscellaneous Technical
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce3.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce3.pl
new file mode 100755
index 00000000000..e9b1dcf4b1d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce3.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InMiscellaneousSymbolsAndArrows} (and fuzzy permutations)
+#
+# Meaning: Block 'Miscellaneous Symbols and Arrows'
+#
+return <<'END';
+2B00 2BFF Miscellaneous Symbols and Arrows
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce4.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce4.pl
new file mode 100755
index 00000000000..c887dc25b50
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce4.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InMiscellaneousMathematicalSymbolsA} (and fuzzy permutations)
+#
+# Meaning: Block 'Miscellaneous Mathematical Symbols-A'
+#
+return <<'END';
+27C0 27EF Miscellaneous Mathematical Symbols-A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce5.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce5.pl
new file mode 100755
index 00000000000..3f467b0a764
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMisce5.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InMiscellaneousMathematicalSymbolsB} (and fuzzy permutations)
+#
+# Meaning: Block 'Miscellaneous Mathematical Symbols-B'
+#
+return <<'END';
+2980 29FF Miscellaneous Mathematical Symbols-B
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMiscel.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMiscel.pl
new file mode 100755
index 00000000000..80637868c6b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMiscel.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InMiscellaneousSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Miscellaneous Symbols'
+#
+return <<'END';
+2600 26FF Miscellaneous Symbols
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InModifi.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InModifi.pl
new file mode 100755
index 00000000000..8dbbbe7f71a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InModifi.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InModifierToneLetters} (and fuzzy permutations)
+#
+# Meaning: Block 'Modifier Tone Letters'
+#
+return <<'END';
+A700 A71F Modifier Tone Letters
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMongol.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMongol.pl
new file mode 100755
index 00000000000..7aa99e220f0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMongol.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InMongolian} (and fuzzy permutations)
+#
+# Meaning: Block 'Mongolian'
+#
+return <<'END';
+1800 18AF Mongolian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMusica.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMusica.pl
new file mode 100755
index 00000000000..f21aae180ca
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMusica.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InMusicalSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Musical Symbols'
+#
+return <<'END';
+1D100 1D1FF Musical Symbols
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMyanma.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMyanma.pl
new file mode 100755
index 00000000000..3b05fa12c9d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InMyanma.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InMyanmar} (and fuzzy permutations)
+#
+# Meaning: Block 'Myanmar'
+#
+return <<'END';
+1000 109F Myanmar
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InNewTai.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InNewTai.pl
new file mode 100755
index 00000000000..48daa0cc6e6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InNewTai.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InNewTaiLue} (and fuzzy permutations)
+#
+# Meaning: Block 'New Tai Lue'
+#
+return <<'END';
+1980 19DF New Tai Lue
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InNko.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InNko.pl
new file mode 100755
index 00000000000..9ff919d1b05
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InNko.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InNko} (and fuzzy permutations)
+#
+# Meaning: Block 'NKo'
+#
+return <<'END';
+07C0 07FF NKo
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InNumber.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InNumber.pl
new file mode 100755
index 00000000000..cbfd07dd290
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InNumber.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InNumberForms} (and fuzzy permutations)
+#
+# Meaning: Block 'Number Forms'
+#
+return <<'END';
+2150 218F Number Forms
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOgham.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOgham.pl
new file mode 100755
index 00000000000..d57c6bff947
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOgham.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InOgham} (and fuzzy permutations)
+#
+# Meaning: Block 'Ogham'
+#
+return <<'END';
+1680 169F Ogham
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOlChik.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOlChik.pl
new file mode 100755
index 00000000000..c3dbc151edf
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOlChik.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InOlChiki} (and fuzzy permutations)
+#
+# Meaning: Block 'Ol Chiki'
+#
+return <<'END';
+1C50 1C7F Ol Chiki
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOldIta.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOldIta.pl
new file mode 100755
index 00000000000..f653cbd20e0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOldIta.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InOldItalic} (and fuzzy permutations)
+#
+# Meaning: Block 'Old Italic'
+#
+return <<'END';
+10300 1032F Old Italic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOldPer.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOldPer.pl
new file mode 100755
index 00000000000..e3eb06b286e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOldPer.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InOldPersian} (and fuzzy permutations)
+#
+# Meaning: Block 'Old Persian'
+#
+return <<'END';
+103A0 103DF Old Persian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOptica.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOptica.pl
new file mode 100755
index 00000000000..b0079973245
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOptica.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InOpticalCharacterRecognition} (and fuzzy permutations)
+#
+# Meaning: Block 'Optical Character Recognition'
+#
+return <<'END';
+2440 245F Optical Character Recognition
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOriya.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOriya.pl
new file mode 100755
index 00000000000..9ee835c3247
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOriya.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InOriya} (and fuzzy permutations)
+#
+# Meaning: Block 'Oriya'
+#
+return <<'END';
+0B00 0B7F Oriya
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOsmany.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOsmany.pl
new file mode 100755
index 00000000000..5205e3cd50c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InOsmany.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InOsmanya} (and fuzzy permutations)
+#
+# Meaning: Block 'Osmanya'
+#
+return <<'END';
+10480 104AF Osmanya
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhagsP.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhagsP.pl
new file mode 100755
index 00000000000..9aac8fcb520
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhagsP.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InPhagsPa} (and fuzzy permutations)
+#
+# Meaning: Block 'Phags-pa'
+#
+return <<'END';
+A840 A87F Phags-pa
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhaist.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhaist.pl
new file mode 100755
index 00000000000..e452907bbbc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhaist.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InPhaistosDisc} (and fuzzy permutations)
+#
+# Meaning: Block 'Phaistos Disc'
+#
+return <<'END';
+101D0 101FF Phaistos Disc
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhoeni.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhoeni.pl
new file mode 100755
index 00000000000..e33c7d1046d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhoeni.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InPhoenician} (and fuzzy permutations)
+#
+# Meaning: Block 'Phoenician'
+#
+return <<'END';
+10900 1091F Phoenician
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhone2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhone2.pl
new file mode 100755
index 00000000000..9dc984df1a6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhone2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InPhoneticExtensionsSupplement} (and fuzzy permutations)
+#
+# Meaning: Block 'Phonetic Extensions Supplement'
+#
+return <<'END';
+1D80 1DBF Phonetic Extensions Supplement
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhonet.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhonet.pl
new file mode 100755
index 00000000000..969b918b9bd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPhonet.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InPhoneticExtensions} (and fuzzy permutations)
+#
+# Meaning: Block 'Phonetic Extensions'
+#
+return <<'END';
+1D00 1D7F Phonetic Extensions
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPrivat.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPrivat.pl
new file mode 100755
index 00000000000..519cd7e6147
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InPrivat.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InPrivateUseArea} (and fuzzy permutations)
+#
+# Meaning: Block 'Private Use Area'
+#
+return <<'END';
+E000 F8FF Private Use Area
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InRejang.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InRejang.pl
new file mode 100755
index 00000000000..d54202ae836
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InRejang.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InRejang} (and fuzzy permutations)
+#
+# Meaning: Block 'Rejang'
+#
+return <<'END';
+A930 A95F Rejang
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InRunic.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InRunic.pl
new file mode 100755
index 00000000000..59803e6f997
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InRunic.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InRunic} (and fuzzy permutations)
+#
+# Meaning: Block 'Runic'
+#
+return <<'END';
+16A0 16FF Runic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSauras.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSauras.pl
new file mode 100755
index 00000000000..3ad87441bd5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSauras.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSaurashtra} (and fuzzy permutations)
+#
+# Meaning: Block 'Saurashtra'
+#
+return <<'END';
+A880 A8DF Saurashtra
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InShavia.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InShavia.pl
new file mode 100755
index 00000000000..308d5a66b22
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InShavia.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InShavian} (and fuzzy permutations)
+#
+# Meaning: Block 'Shavian'
+#
+return <<'END';
+10450 1047F Shavian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSinhal.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSinhal.pl
new file mode 100755
index 00000000000..b6087483fca
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSinhal.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSinhala} (and fuzzy permutations)
+#
+# Meaning: Block 'Sinhala'
+#
+return <<'END';
+0D80 0DFF Sinhala
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSmallF.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSmallF.pl
new file mode 100755
index 00000000000..0da273b0972
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSmallF.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSmallFormVariants} (and fuzzy permutations)
+#
+# Meaning: Block 'Small Form Variants'
+#
+return <<'END';
+FE50 FE6F Small Form Variants
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSpacin.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSpacin.pl
new file mode 100755
index 00000000000..583584150a8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSpacin.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSpacingModifierLetters} (and fuzzy permutations)
+#
+# Meaning: Block 'Spacing Modifier Letters'
+#
+return <<'END';
+02B0 02FF Spacing Modifier Letters
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSpecia.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSpecia.pl
new file mode 100755
index 00000000000..47a55954340
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSpecia.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSpecials} (and fuzzy permutations)
+#
+# Meaning: Block 'Specials'
+#
+return <<'END';
+FFF0 FFFF Specials
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSundan.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSundan.pl
new file mode 100755
index 00000000000..a417a0aeaa0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSundan.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSundanese} (and fuzzy permutations)
+#
+# Meaning: Block 'Sundanese'
+#
+return <<'END';
+1B80 1BBF Sundanese
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSupers.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSupers.pl
new file mode 100755
index 00000000000..08932777ca5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSupers.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSuperscriptsAndSubscripts} (and fuzzy permutations)
+#
+# Meaning: Block 'Superscripts and Subscripts'
+#
+return <<'END';
+2070 209F Superscripts and Subscripts
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl2.pl
new file mode 100755
index 00000000000..4e13507d48f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSupplementalArrowsA} (and fuzzy permutations)
+#
+# Meaning: Block 'Supplemental Arrows-A'
+#
+return <<'END';
+27F0 27FF Supplemental Arrows-A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl3.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl3.pl
new file mode 100755
index 00000000000..9d3393a9066
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl3.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSupplementalPunctuation} (and fuzzy permutations)
+#
+# Meaning: Block 'Supplemental Punctuation'
+#
+return <<'END';
+2E00 2E7F Supplemental Punctuation
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl4.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl4.pl
new file mode 100755
index 00000000000..78c2abfa6fd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl4.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSupplementaryPrivateUseAreaA} (and fuzzy permutations)
+#
+# Meaning: Block 'Supplementary Private Use Area-A'
+#
+return <<'END';
+F0000 FFFFF Supplementary Private Use Area-A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl5.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl5.pl
new file mode 100755
index 00000000000..1f4b9be53a5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl5.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSupplementaryPrivateUseAreaB} (and fuzzy permutations)
+#
+# Meaning: Block 'Supplementary Private Use Area-B'
+#
+return <<'END';
+100000 10FFFF Supplementary Private Use Area-B
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl6.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl6.pl
new file mode 100755
index 00000000000..6447836e34a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSuppl6.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSupplementalMathematicalOperators} (and fuzzy permutations)
+#
+# Meaning: Block 'Supplemental Mathematical Operators'
+#
+return <<'END';
+2A00 2AFF Supplemental Mathematical Operators
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSupple.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSupple.pl
new file mode 100755
index 00000000000..02cdc350aee
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSupple.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSupplementalArrowsB} (and fuzzy permutations)
+#
+# Meaning: Block 'Supplemental Arrows-B'
+#
+return <<'END';
+2900 297F Supplemental Arrows-B
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSyloti.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSyloti.pl
new file mode 100755
index 00000000000..67786afe0fd
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSyloti.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSylotiNagri} (and fuzzy permutations)
+#
+# Meaning: Block 'Syloti Nagri'
+#
+return <<'END';
+A800 A82F Syloti Nagri
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSyriac.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSyriac.pl
new file mode 100755
index 00000000000..9449c481b69
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InSyriac.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InSyriac} (and fuzzy permutations)
+#
+# Meaning: Block 'Syriac'
+#
+return <<'END';
+0700 074F Syriac
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTagalo.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTagalo.pl
new file mode 100755
index 00000000000..6eaa14e7dd8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTagalo.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InTagalog} (and fuzzy permutations)
+#
+# Meaning: Block 'Tagalog'
+#
+return <<'END';
+1700 171F Tagalog
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTagban.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTagban.pl
new file mode 100755
index 00000000000..003506cbc17
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTagban.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InTagbanwa} (and fuzzy permutations)
+#
+# Meaning: Block 'Tagbanwa'
+#
+return <<'END';
+1760 177F Tagbanwa
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTags.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTags.pl
new file mode 100755
index 00000000000..8cbced6c1f9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTags.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InTags} (and fuzzy permutations)
+#
+# Meaning: Block 'Tags'
+#
+return <<'END';
+E0000 E007F Tags
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTaiLe.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTaiLe.pl
new file mode 100755
index 00000000000..a46193f5d70
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTaiLe.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InTaiLe} (and fuzzy permutations)
+#
+# Meaning: Block 'Tai Le'
+#
+return <<'END';
+1950 197F Tai Le
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTaiXua.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTaiXua.pl
new file mode 100755
index 00000000000..14d07e39e92
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTaiXua.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InTaiXuanJingSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Tai Xuan Jing Symbols'
+#
+return <<'END';
+1D300 1D35F Tai Xuan Jing Symbols
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTamil.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTamil.pl
new file mode 100755
index 00000000000..cc5b18aee1e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTamil.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InTamil} (and fuzzy permutations)
+#
+# Meaning: Block 'Tamil'
+#
+return <<'END';
+0B80 0BFF Tamil
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTelugu.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTelugu.pl
new file mode 100755
index 00000000000..e0fd3e598a9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTelugu.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InTelugu} (and fuzzy permutations)
+#
+# Meaning: Block 'Telugu'
+#
+return <<'END';
+0C00 0C7F Telugu
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InThaana.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InThaana.pl
new file mode 100755
index 00000000000..ead00f96ed3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InThaana.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InThaana} (and fuzzy permutations)
+#
+# Meaning: Block 'Thaana'
+#
+return <<'END';
+0780 07BF Thaana
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InThai.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InThai.pl
new file mode 100755
index 00000000000..0fe69d46bf8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InThai.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InThai} (and fuzzy permutations)
+#
+# Meaning: Block 'Thai'
+#
+return <<'END';
+0E00 0E7F Thai
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTibeta.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTibeta.pl
new file mode 100755
index 00000000000..e24ec8035b1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTibeta.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InTibetan} (and fuzzy permutations)
+#
+# Meaning: Block 'Tibetan'
+#
+return <<'END';
+0F00 0FFF Tibetan
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTifina.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTifina.pl
new file mode 100755
index 00000000000..5257a16065a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InTifina.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InTifinagh} (and fuzzy permutations)
+#
+# Meaning: Block 'Tifinagh'
+#
+return <<'END';
+2D30 2D7F Tifinagh
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InUgarit.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InUgarit.pl
new file mode 100755
index 00000000000..81195ee0a43
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InUgarit.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InUgaritic} (and fuzzy permutations)
+#
+# Meaning: Block 'Ugaritic'
+#
+return <<'END';
+10380 1039F Ugaritic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InUnifie.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InUnifie.pl
new file mode 100755
index 00000000000..df3b93da3e5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InUnifie.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InUnifiedCanadianAboriginalSyllabics} (and fuzzy permutations)
+#
+# Meaning: Block 'Unified Canadian Aboriginal Syllabics'
+#
+return <<'END';
+1400 167F Unified Canadian Aboriginal Syllabics
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVai.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVai.pl
new file mode 100755
index 00000000000..8f6296b91b1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVai.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InVai} (and fuzzy permutations)
+#
+# Meaning: Block 'Vai'
+#
+return <<'END';
+A500 A63F Vai
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVaria2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVaria2.pl
new file mode 100755
index 00000000000..42e6c136e6b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVaria2.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InVariationSelectorsSupplement} (and fuzzy permutations)
+#
+# Meaning: Block 'Variation Selectors Supplement'
+#
+return <<'END';
+E0100 E01EF Variation Selectors Supplement
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVariat.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVariat.pl
new file mode 100755
index 00000000000..9d00f9a323d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVariat.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InVariationSelectors} (and fuzzy permutations)
+#
+# Meaning: Block 'Variation Selectors'
+#
+return <<'END';
+FE00 FE0F Variation Selectors
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVertic.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVertic.pl
new file mode 100755
index 00000000000..a3c9edab0fa
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InVertic.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InVerticalForms} (and fuzzy permutations)
+#
+# Meaning: Block 'Vertical Forms'
+#
+return <<'END';
+FE10 FE1F Vertical Forms
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InYiRadi.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InYiRadi.pl
new file mode 100755
index 00000000000..4cfcc81f30c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InYiRadi.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InYiRadicals} (and fuzzy permutations)
+#
+# Meaning: Block 'Yi Radicals'
+#
+return <<'END';
+A490 A4CF Yi Radicals
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InYiSyll.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InYiSyll.pl
new file mode 100755
index 00000000000..9e7193a7309
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InYiSyll.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InYiSyllables} (and fuzzy permutations)
+#
+# Meaning: Block 'Yi Syllables'
+#
+return <<'END';
+A000 A48F Yi Syllables
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InYijing.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InYijing.pl
new file mode 100755
index 00000000000..c634ce3f640
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/InYijing.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{InYijingHexagramSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Yijing Hexagram Symbols'
+#
+return <<'END';
+4DC0 4DFF Yijing Hexagram Symbols
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/JoinC.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/JoinC.pl
new file mode 100755
index 00000000000..58bba7ff98f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/JoinC.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Join_Control'
+#
+return <<'END';
+200C 200D Join_Control
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/JoinCont.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/JoinCont.pl
new file mode 100755
index 00000000000..dfd5f5a0baf
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/JoinCont.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{JoinControl} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Join_Control'
+#
+return <<'END';
+200C 200D Join_Control
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Kana.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Kana.pl
new file mode 100755
index 00000000000..954c56b0f61
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Kana.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Katakana} (and fuzzy permutations)
+#
+# Meaning: Script 'Katakana'
+#
+return <<'END';
+30A1 30FA Katakana
+30FD 30FF Katakana
+31F0 31FF Katakana
+32D0 32FE Katakana
+3300 3357 Katakana
+FF66 FF6F Katakana
+FF71 FF9D Katakana
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/KayahLi.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/KayahLi.pl
new file mode 100755
index 00000000000..071faddb950
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/KayahLi.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{KayahLi} (and fuzzy permutations)
+#
+# Meaning: Script 'Kayah_Li'
+#
+return <<'END';
+A900 A92F Kayah_Li
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Khar.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Khar.pl
new file mode 100755
index 00000000000..66a97661e26
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Khar.pl
@@ -0,0 +1,24 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Kharoshthi} (and fuzzy permutations)
+#
+# Meaning: Script 'Kharoshthi'
+#
+return <<'END';
+10A00 10A03 Kharoshthi
+10A05 10A06 Kharoshthi
+10A0C 10A13 Kharoshthi
+10A15 10A17 Kharoshthi
+10A19 10A33 Kharoshthi
+10A38 10A3A Kharoshthi
+10A3F 10A47 Kharoshthi
+10A50 10A58 Kharoshthi
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Khmr.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Khmr.pl
new file mode 100755
index 00000000000..d46406084a9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Khmr.pl
@@ -0,0 +1,20 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Khmer} (and fuzzy permutations)
+#
+# Meaning: Script 'Khmer'
+#
+return <<'END';
+1780 17DD Khmer
+17E0 17E9 Khmer
+17F0 17F9 Khmer
+19E0 19FF Khmer
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Knda.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Knda.pl
new file mode 100755
index 00000000000..cf0884011bb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Knda.pl
@@ -0,0 +1,29 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Kannada} (and fuzzy permutations)
+#
+# Meaning: Script 'Kannada'
+#
+return <<'END';
+0C82 0C83 Kannada
+0C85 0C8C Kannada
+0C8E 0C90 Kannada
+0C92 0CA8 Kannada
+0CAA 0CB3 Kannada
+0CB5 0CB9 Kannada
+0CBC 0CC4 Kannada
+0CC6 0CC8 Kannada
+0CCA 0CCD Kannada
+0CD5 0CD6 Kannada
+0CDE Kannada
+0CE0 0CE3 Kannada
+0CE6 0CEF Kannada
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/L.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/L.pl
new file mode 100755
index 00000000000..073355847f8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/L.pl
@@ -0,0 +1,407 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{L}
+# \p{L} (and fuzzy permutations)
+#
+# Meaning: Major Category 'L'
+#
+return <<'END';
+0041 005A
+0061 007A
+00AA
+00B5
+00BA
+00C0 00D6
+00D8 00F6
+00F8 02C1
+02C6 02D1
+02E0 02E4
+02EC
+02EE
+0370 0374
+0376 0377
+037A 037D
+0386
+0388 038A
+038C
+038E 03A1
+03A3 03F5
+03F7 0481
+048A 0523
+0531 0556
+0559
+0561 0587
+05D0 05EA
+05F0 05F2
+0621 064A
+066E 066F
+0671 06D3
+06D5
+06E5 06E6
+06EE 06EF
+06FA 06FC
+06FF
+0710
+0712 072F
+074D 07A5
+07B1
+07CA 07EA
+07F4 07F5
+07FA
+0904 0939
+093D
+0950
+0958 0961
+0971 0972
+097B 097F
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BD
+09CE
+09DC 09DD
+09DF 09E1
+09F0 09F1
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A59 0A5C
+0A5E
+0A72 0A74
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABD
+0AD0
+0AE0 0AE1
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3D
+0B5C 0B5D
+0B5F 0B61
+0B71
+0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BD0
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D
+0C58 0C59
+0C60 0C61
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBD
+0CDE
+0CE0 0CE1
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D
+0D60 0D61
+0D7A 0D7F
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0E01 0E30
+0E32 0E33
+0E40 0E46
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB0
+0EB2 0EB3
+0EBD
+0EC0 0EC4
+0EC6
+0EDC 0EDD
+0F00
+0F40 0F47
+0F49 0F6C
+0F88 0F8B
+1000 102A
+103F
+1050 1055
+105A 105D
+1061
+1065 1066
+106E 1070
+1075 1081
+108E
+10A0 10C5
+10D0 10FA
+10FC
+1100 1159
+115F 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+1380 138F
+13A0 13F4
+1401 166C
+166F 1676
+1681 169A
+16A0 16EA
+1700 170C
+170E 1711
+1720 1731
+1740 1751
+1760 176C
+176E 1770
+1780 17B3
+17D7
+17DC
+1820 1877
+1880 18A8
+18AA
+1900 191C
+1950 196D
+1970 1974
+1980 19A9
+19C1 19C7
+1A00 1A16
+1B05 1B33
+1B45 1B4B
+1B83 1BA0
+1BAE 1BAF
+1C00 1C23
+1C4D 1C4F
+1C5A 1C7D
+1D00 1DBF
+1E00 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FBC
+1FBE
+1FC2 1FC4
+1FC6 1FCC
+1FD0 1FD3
+1FD6 1FDB
+1FE0 1FEC
+1FF2 1FF4
+1FF6 1FFC
+2071
+207F
+2090 2094
+2102
+2107
+210A 2113
+2115
+2119 211D
+2124
+2126
+2128
+212A 212D
+212F 2139
+213C 213F
+2145 2149
+214E
+2183 2184
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CE4
+2D00 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+2E2F
+3005 3006
+3031 3035
+303B 303C
+3041 3096
+309D 309F
+30A1 30FA
+30FC 30FF
+3105 312D
+3131 318E
+31A0 31B7
+31F0 31FF
+3400 4DB5
+4E00 9FC3
+A000 A48C
+A500 A60C
+A610 A61F
+A62A A62B
+A640 A65F
+A662 A66E
+A67F A697
+A717 A71F
+A722 A788
+A78B A78C
+A7FB A801
+A803 A805
+A807 A80A
+A80C A822
+A840 A873
+A882 A8B3
+A90A A925
+A930 A946
+AA00 AA28
+AA40 AA42
+AA44 AA4B
+AC00 D7A3
+F900 FA2D
+FA30 FA6A
+FA70 FAD9
+FB00 FB06
+FB13 FB17
+FB1D
+FB1F FB28
+FB2A FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3D
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFB
+FE70 FE74
+FE76 FEFC
+FF21 FF3A
+FF41 FF5A
+FF66 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10280 1029C
+102A0 102D0
+10300 1031E
+10330 10340
+10342 10349
+10380 1039D
+103A0 103C3
+103C8 103CF
+10400 1049D
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10915
+10920 10939
+10A00
+10A10 10A13
+10A15 10A17
+10A19 10A33
+12000 1236E
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D6C0
+1D6C2 1D6DA
+1D6DC 1D6FA
+1D6FC 1D714
+1D716 1D734
+1D736 1D74E
+1D750 1D76E
+1D770 1D788
+1D78A 1D7A8
+1D7AA 1D7C2
+1D7C4 1D7CB
+20000 2A6D6
+2F800 2FA1D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LC.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LC.pl
new file mode 100755
index 00000000000..3a094439fb2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LC.pl
@@ -0,0 +1,127 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{LC}
+# \p{LC} (and fuzzy permutations)
+#
+# Meaning: [\p{Ll}\p{Lu}\p{Lt}]
+#
+return <<'END';
+0041 005A
+0061 007A
+00AA
+00B5
+00BA
+00C0 00D6
+00D8 00F6
+00F8 01BA
+01BC 01BF
+01C4 0293
+0295 02AF
+0370 0373
+0376 0377
+037B 037D
+0386
+0388 038A
+038C
+038E 03A1
+03A3 03F5
+03F7 0481
+048A 0523
+0531 0556
+0561 0587
+10A0 10C5
+1D00 1D2B
+1D62 1D77
+1D79 1D9A
+1E00 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FBC
+1FBE
+1FC2 1FC4
+1FC6 1FCC
+1FD0 1FD3
+1FD6 1FDB
+1FE0 1FEC
+1FF2 1FF4
+1FF6 1FFC
+2071
+207F
+2102
+2107
+210A 2113
+2115
+2119 211D
+2124
+2126
+2128
+212A 212D
+212F 2134
+2139
+213C 213F
+2145 2149
+214E
+2183 2184
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7C
+2C80 2CE4
+2D00 2D25
+A640 A65F
+A662 A66D
+A680 A697
+A722 A76F
+A771 A787
+A78B A78C
+FB00 FB06
+FB13 FB17
+FF21 FF3A
+FF41 FF5A
+10400 1044F
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D6C0
+1D6C2 1D6DA
+1D6DC 1D6FA
+1D6FC 1D714
+1D716 1D734
+1D736 1D74E
+1D750 1D76E
+1D770 1D788
+1D78A 1D7A8
+1D7AA 1D7C2
+1D7C4 1D7CB
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LOE.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LOE.pl
new file mode 100755
index 00000000000..7afc74e8f54
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LOE.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Logical_Order_Exception'
+#
+return <<'END';
+0E40 0E44 Logical_Order_Exception
+0EC0 0EC4 Logical_Order_Exception
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Laoo.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Laoo.pl
new file mode 100755
index 00000000000..d06b59bc70f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Laoo.pl
@@ -0,0 +1,34 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Lao} (and fuzzy permutations)
+#
+# Meaning: Script 'Lao'
+#
+return <<'END';
+0E81 0E82 Lao
+0E84 Lao
+0E87 0E88 Lao
+0E8A Lao
+0E8D Lao
+0E94 0E97 Lao
+0E99 0E9F Lao
+0EA1 0EA3 Lao
+0EA5 Lao
+0EA7 Lao
+0EAA 0EAB Lao
+0EAD 0EB9 Lao
+0EBB 0EBD Lao
+0EC0 0EC4 Lao
+0EC6 Lao
+0EC8 0ECD Lao
+0ED0 0ED9 Lao
+0EDC 0EDD Lao
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Latn.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Latn.pl
new file mode 100755
index 00000000000..f1ac1e3e91c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Latn.pl
@@ -0,0 +1,45 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Latin} (and fuzzy permutations)
+#
+# Meaning: Script 'Latin'
+#
+return <<'END';
+0041 005A Latin
+0061 007A Latin
+00AA Latin
+00BA Latin
+00C0 00D6 Latin
+00D8 00F6 Latin
+00F8 02B8 Latin
+02E0 02E4 Latin
+1D00 1D25 Latin
+1D2C 1D5C Latin
+1D62 1D65 Latin
+1D6B 1D77 Latin
+1D79 1DBE Latin
+1E00 1EFF Latin
+2071 Latin
+207F Latin
+2090 2094 Latin
+212A 212B Latin
+2132 Latin
+214E Latin
+2160 2188 Latin
+2C60 2C6F Latin
+2C71 2C7D Latin
+A722 A787 Latin
+A78B A78C Latin
+A7FB A7FF Latin
+FB00 FB06 Latin
+FF21 FF3A Latin
+FF41 FF5A Latin
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lepc.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lepc.pl
new file mode 100755
index 00000000000..a4057f3ea68
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lepc.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Lepcha} (and fuzzy permutations)
+#
+# Meaning: Script 'Lepcha'
+#
+return <<'END';
+1C00 1C37 Lepcha
+1C3B 1C49 Lepcha
+1C4D 1C4F Lepcha
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Limb.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Limb.pl
new file mode 100755
index 00000000000..f82a4fa63ce
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Limb.pl
@@ -0,0 +1,21 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Limbu} (and fuzzy permutations)
+#
+# Meaning: Script 'Limbu'
+#
+return <<'END';
+1900 191C Limbu
+1920 192B Limbu
+1930 193B Limbu
+1940 Limbu
+1944 194F Limbu
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LinearB.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LinearB.pl
new file mode 100755
index 00000000000..91fd0978c65
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LinearB.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{LinearB} (and fuzzy permutations)
+#
+# Meaning: Script 'Linear_B'
+#
+return <<'END';
+10000 1000B Linear_B
+1000D 10026 Linear_B
+10028 1003A Linear_B
+1003C 1003D Linear_B
+1003F 1004D Linear_B
+10050 1005D Linear_B
+10080 100FA Linear_B
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ll.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ll.pl
new file mode 100755
index 00000000000..ba8270a547a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ll.pl
@@ -0,0 +1,615 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Ll}
+# \p{Ll} (and fuzzy permutations)
+#
+# Meaning: General Category 'Ll'
+#
+return <<'END';
+0061 007A
+00AA
+00B5
+00BA
+00DF 00F6
+00F8 00FF
+0101
+0103
+0105
+0107
+0109
+010B
+010D
+010F
+0111
+0113
+0115
+0117
+0119
+011B
+011D
+011F
+0121
+0123
+0125
+0127
+0129
+012B
+012D
+012F
+0131
+0133
+0135
+0137 0138
+013A
+013C
+013E
+0140
+0142
+0144
+0146
+0148 0149
+014B
+014D
+014F
+0151
+0153
+0155
+0157
+0159
+015B
+015D
+015F
+0161
+0163
+0165
+0167
+0169
+016B
+016D
+016F
+0171
+0173
+0175
+0177
+017A
+017C
+017E 0180
+0183
+0185
+0188
+018C 018D
+0192
+0195
+0199 019B
+019E
+01A1
+01A3
+01A5
+01A8
+01AA 01AB
+01AD
+01B0
+01B4
+01B6
+01B9 01BA
+01BD 01BF
+01C6
+01C9
+01CC
+01CE
+01D0
+01D2
+01D4
+01D6
+01D8
+01DA
+01DC 01DD
+01DF
+01E1
+01E3
+01E5
+01E7
+01E9
+01EB
+01ED
+01EF 01F0
+01F3
+01F5
+01F9
+01FB
+01FD
+01FF
+0201
+0203
+0205
+0207
+0209
+020B
+020D
+020F
+0211
+0213
+0215
+0217
+0219
+021B
+021D
+021F
+0221
+0223
+0225
+0227
+0229
+022B
+022D
+022F
+0231
+0233 0239
+023C
+023F 0240
+0242
+0247
+0249
+024B
+024D
+024F 0293
+0295 02AF
+0371
+0373
+0377
+037B 037D
+0390
+03AC 03CE
+03D0 03D1
+03D5 03D7
+03D9
+03DB
+03DD
+03DF
+03E1
+03E3
+03E5
+03E7
+03E9
+03EB
+03ED
+03EF 03F3
+03F5
+03F8
+03FB 03FC
+0430 045F
+0461
+0463
+0465
+0467
+0469
+046B
+046D
+046F
+0471
+0473
+0475
+0477
+0479
+047B
+047D
+047F
+0481
+048B
+048D
+048F
+0491
+0493
+0495
+0497
+0499
+049B
+049D
+049F
+04A1
+04A3
+04A5
+04A7
+04A9
+04AB
+04AD
+04AF
+04B1
+04B3
+04B5
+04B7
+04B9
+04BB
+04BD
+04BF
+04C2
+04C4
+04C6
+04C8
+04CA
+04CC
+04CE 04CF
+04D1
+04D3
+04D5
+04D7
+04D9
+04DB
+04DD
+04DF
+04E1
+04E3
+04E5
+04E7
+04E9
+04EB
+04ED
+04EF
+04F1
+04F3
+04F5
+04F7
+04F9
+04FB
+04FD
+04FF
+0501
+0503
+0505
+0507
+0509
+050B
+050D
+050F
+0511
+0513
+0515
+0517
+0519
+051B
+051D
+051F
+0521
+0523
+0561 0587
+1D00 1D2B
+1D62 1D77
+1D79 1D9A
+1E01
+1E03
+1E05
+1E07
+1E09
+1E0B
+1E0D
+1E0F
+1E11
+1E13
+1E15
+1E17
+1E19
+1E1B
+1E1D
+1E1F
+1E21
+1E23
+1E25
+1E27
+1E29
+1E2B
+1E2D
+1E2F
+1E31
+1E33
+1E35
+1E37
+1E39
+1E3B
+1E3D
+1E3F
+1E41
+1E43
+1E45
+1E47
+1E49
+1E4B
+1E4D
+1E4F
+1E51
+1E53
+1E55
+1E57
+1E59
+1E5B
+1E5D
+1E5F
+1E61
+1E63
+1E65
+1E67
+1E69
+1E6B
+1E6D
+1E6F
+1E71
+1E73
+1E75
+1E77
+1E79
+1E7B
+1E7D
+1E7F
+1E81
+1E83
+1E85
+1E87
+1E89
+1E8B
+1E8D
+1E8F
+1E91
+1E93
+1E95 1E9D
+1E9F
+1EA1
+1EA3
+1EA5
+1EA7
+1EA9
+1EAB
+1EAD
+1EAF
+1EB1
+1EB3
+1EB5
+1EB7
+1EB9
+1EBB
+1EBD
+1EBF
+1EC1
+1EC3
+1EC5
+1EC7
+1EC9
+1ECB
+1ECD
+1ECF
+1ED1
+1ED3
+1ED5
+1ED7
+1ED9
+1EDB
+1EDD
+1EDF
+1EE1
+1EE3
+1EE5
+1EE7
+1EE9
+1EEB
+1EED
+1EEF
+1EF1
+1EF3
+1EF5
+1EF7
+1EF9
+1EFB
+1EFD
+1EFF 1F07
+1F10 1F15
+1F20 1F27
+1F30 1F37
+1F40 1F45
+1F50 1F57
+1F60 1F67
+1F70 1F7D
+1F80 1F87
+1F90 1F97
+1FA0 1FA7
+1FB0 1FB4
+1FB6 1FB7
+1FBE
+1FC2 1FC4
+1FC6 1FC7
+1FD0 1FD3
+1FD6 1FD7
+1FE0 1FE7
+1FF2 1FF4
+1FF6 1FF7
+2071
+207F
+210A
+210E 210F
+2113
+212F
+2134
+2139
+213C 213D
+2146 2149
+214E
+2184
+2C30 2C5E
+2C61
+2C65 2C66
+2C68
+2C6A
+2C6C
+2C71
+2C73 2C74
+2C76 2C7C
+2C81
+2C83
+2C85
+2C87
+2C89
+2C8B
+2C8D
+2C8F
+2C91
+2C93
+2C95
+2C97
+2C99
+2C9B
+2C9D
+2C9F
+2CA1
+2CA3
+2CA5
+2CA7
+2CA9
+2CAB
+2CAD
+2CAF
+2CB1
+2CB3
+2CB5
+2CB7
+2CB9
+2CBB
+2CBD
+2CBF
+2CC1
+2CC3
+2CC5
+2CC7
+2CC9
+2CCB
+2CCD
+2CCF
+2CD1
+2CD3
+2CD5
+2CD7
+2CD9
+2CDB
+2CDD
+2CDF
+2CE1
+2CE3 2CE4
+2D00 2D25
+A641
+A643
+A645
+A647
+A649
+A64B
+A64D
+A64F
+A651
+A653
+A655
+A657
+A659
+A65B
+A65D
+A65F
+A663
+A665
+A667
+A669
+A66B
+A66D
+A681
+A683
+A685
+A687
+A689
+A68B
+A68D
+A68F
+A691
+A693
+A695
+A697
+A723
+A725
+A727
+A729
+A72B
+A72D
+A72F A731
+A733
+A735
+A737
+A739
+A73B
+A73D
+A73F
+A741
+A743
+A745
+A747
+A749
+A74B
+A74D
+A74F
+A751
+A753
+A755
+A757
+A759
+A75B
+A75D
+A75F
+A761
+A763
+A765
+A767
+A769
+A76B
+A76D
+A76F
+A771 A778
+A77A
+A77C
+A77F
+A781
+A783
+A785
+A787
+A78C
+FB00 FB06
+FB13 FB17
+FF41 FF5A
+10428 1044F
+1D41A 1D433
+1D44E 1D454
+1D456 1D467
+1D482 1D49B
+1D4B6 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D4CF
+1D4EA 1D503
+1D51E 1D537
+1D552 1D56B
+1D586 1D59F
+1D5BA 1D5D3
+1D5EE 1D607
+1D622 1D63B
+1D656 1D66F
+1D68A 1D6A5
+1D6C2 1D6DA
+1D6DC 1D6E1
+1D6FC 1D714
+1D716 1D71B
+1D736 1D74E
+1D750 1D755
+1D770 1D788
+1D78A 1D78F
+1D7AA 1D7C2
+1D7C4 1D7C9
+1D7CB
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lm.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lm.pl
new file mode 100755
index 00000000000..caad8ea283d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lm.pl
@@ -0,0 +1,56 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Lm}
+# \p{Lm} (and fuzzy permutations)
+#
+# Meaning: General Category 'Lm'
+#
+return <<'END';
+02B0 02C1
+02C6 02D1
+02E0 02E4
+02EC
+02EE
+0374
+037A
+0559
+0640
+06E5 06E6
+07F4 07F5
+07FA
+0971
+0E46
+0EC6
+10FC
+17D7
+1843
+1C78 1C7D
+1D2C 1D61
+1D78
+1D9B 1DBF
+2090 2094
+2C7D
+2D6F
+2E2F
+3005
+3031 3035
+303B
+309D 309E
+30FC 30FE
+A015
+A60C
+A67F
+A717 A71F
+A770
+A788
+FF70
+FF9E FF9F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lo.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lo.pl
new file mode 100755
index 00000000000..ae5c41fc0a4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lo.pl
@@ -0,0 +1,299 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Lo}
+# \p{Lo} (and fuzzy permutations)
+#
+# Meaning: General Category 'Lo'
+#
+return <<'END';
+01BB
+01C0 01C3
+0294
+05D0 05EA
+05F0 05F2
+0621 063F
+0641 064A
+066E 066F
+0671 06D3
+06D5
+06EE 06EF
+06FA 06FC
+06FF
+0710
+0712 072F
+074D 07A5
+07B1
+07CA 07EA
+0904 0939
+093D
+0950
+0958 0961
+0972
+097B 097F
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BD
+09CE
+09DC 09DD
+09DF 09E1
+09F0 09F1
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A59 0A5C
+0A5E
+0A72 0A74
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABD
+0AD0
+0AE0 0AE1
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3D
+0B5C 0B5D
+0B5F 0B61
+0B71
+0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BD0
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D
+0C58 0C59
+0C60 0C61
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBD
+0CDE
+0CE0 0CE1
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D
+0D60 0D61
+0D7A 0D7F
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0E01 0E30
+0E32 0E33
+0E40 0E45
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB0
+0EB2 0EB3
+0EBD
+0EC0 0EC4
+0EDC 0EDD
+0F00
+0F40 0F47
+0F49 0F6C
+0F88 0F8B
+1000 102A
+103F
+1050 1055
+105A 105D
+1061
+1065 1066
+106E 1070
+1075 1081
+108E
+10D0 10FA
+1100 1159
+115F 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+1380 138F
+13A0 13F4
+1401 166C
+166F 1676
+1681 169A
+16A0 16EA
+1700 170C
+170E 1711
+1720 1731
+1740 1751
+1760 176C
+176E 1770
+1780 17B3
+17DC
+1820 1842
+1844 1877
+1880 18A8
+18AA
+1900 191C
+1950 196D
+1970 1974
+1980 19A9
+19C1 19C7
+1A00 1A16
+1B05 1B33
+1B45 1B4B
+1B83 1BA0
+1BAE 1BAF
+1C00 1C23
+1C4D 1C4F
+1C5A 1C77
+2135 2138
+2D30 2D65
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+3006
+303C
+3041 3096
+309F
+30A1 30FA
+30FF
+3105 312D
+3131 318E
+31A0 31B7
+31F0 31FF
+3400 4DB5
+4E00 9FC3
+A000 A014
+A016 A48C
+A500 A60B
+A610 A61F
+A62A A62B
+A66E
+A7FB A801
+A803 A805
+A807 A80A
+A80C A822
+A840 A873
+A882 A8B3
+A90A A925
+A930 A946
+AA00 AA28
+AA40 AA42
+AA44 AA4B
+AC00 D7A3
+F900 FA2D
+FA30 FA6A
+FA70 FAD9
+FB1D
+FB1F FB28
+FB2A FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3D
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFB
+FE70 FE74
+FE76 FEFC
+FF66 FF6F
+FF71 FF9D
+FFA0 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10280 1029C
+102A0 102D0
+10300 1031E
+10330 10340
+10342 10349
+10380 1039D
+103A0 103C3
+103C8 103CF
+10450 1049D
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10915
+10920 10939
+10A00
+10A10 10A13
+10A15 10A17
+10A19 10A33
+12000 1236E
+20000 2A6D6
+2F800 2FA1D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LogicalO.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LogicalO.pl
new file mode 100755
index 00000000000..972052a450e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/LogicalO.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{LogicalOrderException} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Logical_Order_Exception'
+#
+return <<'END';
+0E40 0E44 Logical_Order_Exception
+0EC0 0EC4 Logical_Order_Exception
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lower.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lower.pl
new file mode 100755
index 00000000000..4cd354d6b1f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lower.pl
@@ -0,0 +1,614 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Lower}
+#
+# Meaning: [[:Lower:]]
+#
+return <<'END';
+0061 007A
+00AA
+00B5
+00BA
+00DF 00F6
+00F8 00FF
+0101
+0103
+0105
+0107
+0109
+010B
+010D
+010F
+0111
+0113
+0115
+0117
+0119
+011B
+011D
+011F
+0121
+0123
+0125
+0127
+0129
+012B
+012D
+012F
+0131
+0133
+0135
+0137 0138
+013A
+013C
+013E
+0140
+0142
+0144
+0146
+0148 0149
+014B
+014D
+014F
+0151
+0153
+0155
+0157
+0159
+015B
+015D
+015F
+0161
+0163
+0165
+0167
+0169
+016B
+016D
+016F
+0171
+0173
+0175
+0177
+017A
+017C
+017E 0180
+0183
+0185
+0188
+018C 018D
+0192
+0195
+0199 019B
+019E
+01A1
+01A3
+01A5
+01A8
+01AA 01AB
+01AD
+01B0
+01B4
+01B6
+01B9 01BA
+01BD 01BF
+01C6
+01C9
+01CC
+01CE
+01D0
+01D2
+01D4
+01D6
+01D8
+01DA
+01DC 01DD
+01DF
+01E1
+01E3
+01E5
+01E7
+01E9
+01EB
+01ED
+01EF 01F0
+01F3
+01F5
+01F9
+01FB
+01FD
+01FF
+0201
+0203
+0205
+0207
+0209
+020B
+020D
+020F
+0211
+0213
+0215
+0217
+0219
+021B
+021D
+021F
+0221
+0223
+0225
+0227
+0229
+022B
+022D
+022F
+0231
+0233 0239
+023C
+023F 0240
+0242
+0247
+0249
+024B
+024D
+024F 0293
+0295 02AF
+0371
+0373
+0377
+037B 037D
+0390
+03AC 03CE
+03D0 03D1
+03D5 03D7
+03D9
+03DB
+03DD
+03DF
+03E1
+03E3
+03E5
+03E7
+03E9
+03EB
+03ED
+03EF 03F3
+03F5
+03F8
+03FB 03FC
+0430 045F
+0461
+0463
+0465
+0467
+0469
+046B
+046D
+046F
+0471
+0473
+0475
+0477
+0479
+047B
+047D
+047F
+0481
+048B
+048D
+048F
+0491
+0493
+0495
+0497
+0499
+049B
+049D
+049F
+04A1
+04A3
+04A5
+04A7
+04A9
+04AB
+04AD
+04AF
+04B1
+04B3
+04B5
+04B7
+04B9
+04BB
+04BD
+04BF
+04C2
+04C4
+04C6
+04C8
+04CA
+04CC
+04CE 04CF
+04D1
+04D3
+04D5
+04D7
+04D9
+04DB
+04DD
+04DF
+04E1
+04E3
+04E5
+04E7
+04E9
+04EB
+04ED
+04EF
+04F1
+04F3
+04F5
+04F7
+04F9
+04FB
+04FD
+04FF
+0501
+0503
+0505
+0507
+0509
+050B
+050D
+050F
+0511
+0513
+0515
+0517
+0519
+051B
+051D
+051F
+0521
+0523
+0561 0587
+1D00 1D2B
+1D62 1D77
+1D79 1D9A
+1E01
+1E03
+1E05
+1E07
+1E09
+1E0B
+1E0D
+1E0F
+1E11
+1E13
+1E15
+1E17
+1E19
+1E1B
+1E1D
+1E1F
+1E21
+1E23
+1E25
+1E27
+1E29
+1E2B
+1E2D
+1E2F
+1E31
+1E33
+1E35
+1E37
+1E39
+1E3B
+1E3D
+1E3F
+1E41
+1E43
+1E45
+1E47
+1E49
+1E4B
+1E4D
+1E4F
+1E51
+1E53
+1E55
+1E57
+1E59
+1E5B
+1E5D
+1E5F
+1E61
+1E63
+1E65
+1E67
+1E69
+1E6B
+1E6D
+1E6F
+1E71
+1E73
+1E75
+1E77
+1E79
+1E7B
+1E7D
+1E7F
+1E81
+1E83
+1E85
+1E87
+1E89
+1E8B
+1E8D
+1E8F
+1E91
+1E93
+1E95 1E9D
+1E9F
+1EA1
+1EA3
+1EA5
+1EA7
+1EA9
+1EAB
+1EAD
+1EAF
+1EB1
+1EB3
+1EB5
+1EB7
+1EB9
+1EBB
+1EBD
+1EBF
+1EC1
+1EC3
+1EC5
+1EC7
+1EC9
+1ECB
+1ECD
+1ECF
+1ED1
+1ED3
+1ED5
+1ED7
+1ED9
+1EDB
+1EDD
+1EDF
+1EE1
+1EE3
+1EE5
+1EE7
+1EE9
+1EEB
+1EED
+1EEF
+1EF1
+1EF3
+1EF5
+1EF7
+1EF9
+1EFB
+1EFD
+1EFF 1F07
+1F10 1F15
+1F20 1F27
+1F30 1F37
+1F40 1F45
+1F50 1F57
+1F60 1F67
+1F70 1F7D
+1F80 1F87
+1F90 1F97
+1FA0 1FA7
+1FB0 1FB4
+1FB6 1FB7
+1FBE
+1FC2 1FC4
+1FC6 1FC7
+1FD0 1FD3
+1FD6 1FD7
+1FE0 1FE7
+1FF2 1FF4
+1FF6 1FF7
+2071
+207F
+210A
+210E 210F
+2113
+212F
+2134
+2139
+213C 213D
+2146 2149
+214E
+2184
+2C30 2C5E
+2C61
+2C65 2C66
+2C68
+2C6A
+2C6C
+2C71
+2C73 2C74
+2C76 2C7C
+2C81
+2C83
+2C85
+2C87
+2C89
+2C8B
+2C8D
+2C8F
+2C91
+2C93
+2C95
+2C97
+2C99
+2C9B
+2C9D
+2C9F
+2CA1
+2CA3
+2CA5
+2CA7
+2CA9
+2CAB
+2CAD
+2CAF
+2CB1
+2CB3
+2CB5
+2CB7
+2CB9
+2CBB
+2CBD
+2CBF
+2CC1
+2CC3
+2CC5
+2CC7
+2CC9
+2CCB
+2CCD
+2CCF
+2CD1
+2CD3
+2CD5
+2CD7
+2CD9
+2CDB
+2CDD
+2CDF
+2CE1
+2CE3 2CE4
+2D00 2D25
+A641
+A643
+A645
+A647
+A649
+A64B
+A64D
+A64F
+A651
+A653
+A655
+A657
+A659
+A65B
+A65D
+A65F
+A663
+A665
+A667
+A669
+A66B
+A66D
+A681
+A683
+A685
+A687
+A689
+A68B
+A68D
+A68F
+A691
+A693
+A695
+A697
+A723
+A725
+A727
+A729
+A72B
+A72D
+A72F A731
+A733
+A735
+A737
+A739
+A73B
+A73D
+A73F
+A741
+A743
+A745
+A747
+A749
+A74B
+A74D
+A74F
+A751
+A753
+A755
+A757
+A759
+A75B
+A75D
+A75F
+A761
+A763
+A765
+A767
+A769
+A76B
+A76D
+A76F
+A771 A778
+A77A
+A77C
+A77F
+A781
+A783
+A785
+A787
+A78C
+FB00 FB06
+FB13 FB17
+FF41 FF5A
+10428 1044F
+1D41A 1D433
+1D44E 1D454
+1D456 1D467
+1D482 1D49B
+1D4B6 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D4CF
+1D4EA 1D503
+1D51E 1D537
+1D552 1D56B
+1D586 1D59F
+1D5BA 1D5D3
+1D5EE 1D607
+1D622 1D63B
+1D656 1D66F
+1D68A 1D6A5
+1D6C2 1D6DA
+1D6DC 1D6E1
+1D6FC 1D714
+1D716 1D71B
+1D736 1D74E
+1D750 1D755
+1D770 1D788
+1D78A 1D78F
+1D7AA 1D7C2
+1D7C4 1D7C9
+1D7CB
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lowercas.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lowercas.pl
new file mode 100755
index 00000000000..a088f536c13
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lowercas.pl
@@ -0,0 +1,617 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Lowercase} (and fuzzy permutations)
+#
+# Meaning: [\p{Ll}\p{OtherLowercase}]
+#
+return <<'END';
+0061 007A
+00AA
+00B5
+00BA
+00DF 00F6
+00F8 00FF
+0101
+0103
+0105
+0107
+0109
+010B
+010D
+010F
+0111
+0113
+0115
+0117
+0119
+011B
+011D
+011F
+0121
+0123
+0125
+0127
+0129
+012B
+012D
+012F
+0131
+0133
+0135
+0137 0138
+013A
+013C
+013E
+0140
+0142
+0144
+0146
+0148 0149
+014B
+014D
+014F
+0151
+0153
+0155
+0157
+0159
+015B
+015D
+015F
+0161
+0163
+0165
+0167
+0169
+016B
+016D
+016F
+0171
+0173
+0175
+0177
+017A
+017C
+017E 0180
+0183
+0185
+0188
+018C 018D
+0192
+0195
+0199 019B
+019E
+01A1
+01A3
+01A5
+01A8
+01AA 01AB
+01AD
+01B0
+01B4
+01B6
+01B9 01BA
+01BD 01BF
+01C6
+01C9
+01CC
+01CE
+01D0
+01D2
+01D4
+01D6
+01D8
+01DA
+01DC 01DD
+01DF
+01E1
+01E3
+01E5
+01E7
+01E9
+01EB
+01ED
+01EF 01F0
+01F3
+01F5
+01F9
+01FB
+01FD
+01FF
+0201
+0203
+0205
+0207
+0209
+020B
+020D
+020F
+0211
+0213
+0215
+0217
+0219
+021B
+021D
+021F
+0221
+0223
+0225
+0227
+0229
+022B
+022D
+022F
+0231
+0233 0239
+023C
+023F 0240
+0242
+0247
+0249
+024B
+024D
+024F 0293
+0295 02B8
+02C0 02C1
+02E0 02E4
+0345
+0371
+0373
+0377
+037A 037D
+0390
+03AC 03CE
+03D0 03D1
+03D5 03D7
+03D9
+03DB
+03DD
+03DF
+03E1
+03E3
+03E5
+03E7
+03E9
+03EB
+03ED
+03EF 03F3
+03F5
+03F8
+03FB 03FC
+0430 045F
+0461
+0463
+0465
+0467
+0469
+046B
+046D
+046F
+0471
+0473
+0475
+0477
+0479
+047B
+047D
+047F
+0481
+048B
+048D
+048F
+0491
+0493
+0495
+0497
+0499
+049B
+049D
+049F
+04A1
+04A3
+04A5
+04A7
+04A9
+04AB
+04AD
+04AF
+04B1
+04B3
+04B5
+04B7
+04B9
+04BB
+04BD
+04BF
+04C2
+04C4
+04C6
+04C8
+04CA
+04CC
+04CE 04CF
+04D1
+04D3
+04D5
+04D7
+04D9
+04DB
+04DD
+04DF
+04E1
+04E3
+04E5
+04E7
+04E9
+04EB
+04ED
+04EF
+04F1
+04F3
+04F5
+04F7
+04F9
+04FB
+04FD
+04FF
+0501
+0503
+0505
+0507
+0509
+050B
+050D
+050F
+0511
+0513
+0515
+0517
+0519
+051B
+051D
+051F
+0521
+0523
+0561 0587
+1D00 1DBF
+1E01
+1E03
+1E05
+1E07
+1E09
+1E0B
+1E0D
+1E0F
+1E11
+1E13
+1E15
+1E17
+1E19
+1E1B
+1E1D
+1E1F
+1E21
+1E23
+1E25
+1E27
+1E29
+1E2B
+1E2D
+1E2F
+1E31
+1E33
+1E35
+1E37
+1E39
+1E3B
+1E3D
+1E3F
+1E41
+1E43
+1E45
+1E47
+1E49
+1E4B
+1E4D
+1E4F
+1E51
+1E53
+1E55
+1E57
+1E59
+1E5B
+1E5D
+1E5F
+1E61
+1E63
+1E65
+1E67
+1E69
+1E6B
+1E6D
+1E6F
+1E71
+1E73
+1E75
+1E77
+1E79
+1E7B
+1E7D
+1E7F
+1E81
+1E83
+1E85
+1E87
+1E89
+1E8B
+1E8D
+1E8F
+1E91
+1E93
+1E95 1E9D
+1E9F
+1EA1
+1EA3
+1EA5
+1EA7
+1EA9
+1EAB
+1EAD
+1EAF
+1EB1
+1EB3
+1EB5
+1EB7
+1EB9
+1EBB
+1EBD
+1EBF
+1EC1
+1EC3
+1EC5
+1EC7
+1EC9
+1ECB
+1ECD
+1ECF
+1ED1
+1ED3
+1ED5
+1ED7
+1ED9
+1EDB
+1EDD
+1EDF
+1EE1
+1EE3
+1EE5
+1EE7
+1EE9
+1EEB
+1EED
+1EEF
+1EF1
+1EF3
+1EF5
+1EF7
+1EF9
+1EFB
+1EFD
+1EFF 1F07
+1F10 1F15
+1F20 1F27
+1F30 1F37
+1F40 1F45
+1F50 1F57
+1F60 1F67
+1F70 1F7D
+1F80 1F87
+1F90 1F97
+1FA0 1FA7
+1FB0 1FB4
+1FB6 1FB7
+1FBE
+1FC2 1FC4
+1FC6 1FC7
+1FD0 1FD3
+1FD6 1FD7
+1FE0 1FE7
+1FF2 1FF4
+1FF6 1FF7
+2071
+207F
+2090 2094
+210A
+210E 210F
+2113
+212F
+2134
+2139
+213C 213D
+2146 2149
+214E
+2170 217F
+2184
+24D0 24E9
+2C30 2C5E
+2C61
+2C65 2C66
+2C68
+2C6A
+2C6C
+2C71
+2C73 2C74
+2C76 2C7D
+2C81
+2C83
+2C85
+2C87
+2C89
+2C8B
+2C8D
+2C8F
+2C91
+2C93
+2C95
+2C97
+2C99
+2C9B
+2C9D
+2C9F
+2CA1
+2CA3
+2CA5
+2CA7
+2CA9
+2CAB
+2CAD
+2CAF
+2CB1
+2CB3
+2CB5
+2CB7
+2CB9
+2CBB
+2CBD
+2CBF
+2CC1
+2CC3
+2CC5
+2CC7
+2CC9
+2CCB
+2CCD
+2CCF
+2CD1
+2CD3
+2CD5
+2CD7
+2CD9
+2CDB
+2CDD
+2CDF
+2CE1
+2CE3 2CE4
+2D00 2D25
+A641
+A643
+A645
+A647
+A649
+A64B
+A64D
+A64F
+A651
+A653
+A655
+A657
+A659
+A65B
+A65D
+A65F
+A663
+A665
+A667
+A669
+A66B
+A66D
+A681
+A683
+A685
+A687
+A689
+A68B
+A68D
+A68F
+A691
+A693
+A695
+A697
+A723
+A725
+A727
+A729
+A72B
+A72D
+A72F A731
+A733
+A735
+A737
+A739
+A73B
+A73D
+A73F
+A741
+A743
+A745
+A747
+A749
+A74B
+A74D
+A74F
+A751
+A753
+A755
+A757
+A759
+A75B
+A75D
+A75F
+A761
+A763
+A765
+A767
+A769
+A76B
+A76D
+A76F A778
+A77A
+A77C
+A77F
+A781
+A783
+A785
+A787
+A78C
+FB00 FB06
+FB13 FB17
+FF41 FF5A
+10428 1044F
+1D41A 1D433
+1D44E 1D454
+1D456 1D467
+1D482 1D49B
+1D4B6 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D4CF
+1D4EA 1D503
+1D51E 1D537
+1D552 1D56B
+1D586 1D59F
+1D5BA 1D5D3
+1D5EE 1D607
+1D622 1D63B
+1D656 1D66F
+1D68A 1D6A5
+1D6C2 1D6DA
+1D6DC 1D6E1
+1D6FC 1D714
+1D716 1D71B
+1D736 1D74E
+1D750 1D755
+1D770 1D788
+1D78A 1D78F
+1D7AA 1D7C2
+1D7C4 1D7C9
+1D7CB
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lt.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lt.pl
new file mode 100755
index 00000000000..9c4be07f76e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lt.pl
@@ -0,0 +1,27 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Lt}
+# \p{Lt} (and fuzzy permutations)
+#
+# Meaning: General Category 'Lt'
+#
+return <<'END';
+01C5
+01C8
+01CB
+01F2
+1F88 1F8F
+1F98 1F9F
+1FA8 1FAF
+1FBC
+1FCC
+1FFC
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lu.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lu.pl
new file mode 100755
index 00000000000..de67701809a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lu.pl
@@ -0,0 +1,608 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Lu}
+# \p{Lu} (and fuzzy permutations)
+#
+# Meaning: General Category 'Lu'
+#
+return <<'END';
+0041 005A
+00C0 00D6
+00D8 00DE
+0100
+0102
+0104
+0106
+0108
+010A
+010C
+010E
+0110
+0112
+0114
+0116
+0118
+011A
+011C
+011E
+0120
+0122
+0124
+0126
+0128
+012A
+012C
+012E
+0130
+0132
+0134
+0136
+0139
+013B
+013D
+013F
+0141
+0143
+0145
+0147
+014A
+014C
+014E
+0150
+0152
+0154
+0156
+0158
+015A
+015C
+015E
+0160
+0162
+0164
+0166
+0168
+016A
+016C
+016E
+0170
+0172
+0174
+0176
+0178 0179
+017B
+017D
+0181 0182
+0184
+0186 0187
+0189 018B
+018E 0191
+0193 0194
+0196 0198
+019C 019D
+019F 01A0
+01A2
+01A4
+01A6 01A7
+01A9
+01AC
+01AE 01AF
+01B1 01B3
+01B5
+01B7 01B8
+01BC
+01C4
+01C7
+01CA
+01CD
+01CF
+01D1
+01D3
+01D5
+01D7
+01D9
+01DB
+01DE
+01E0
+01E2
+01E4
+01E6
+01E8
+01EA
+01EC
+01EE
+01F1
+01F4
+01F6 01F8
+01FA
+01FC
+01FE
+0200
+0202
+0204
+0206
+0208
+020A
+020C
+020E
+0210
+0212
+0214
+0216
+0218
+021A
+021C
+021E
+0220
+0222
+0224
+0226
+0228
+022A
+022C
+022E
+0230
+0232
+023A 023B
+023D 023E
+0241
+0243 0246
+0248
+024A
+024C
+024E
+0370
+0372
+0376
+0386
+0388 038A
+038C
+038E 038F
+0391 03A1
+03A3 03AB
+03CF
+03D2 03D4
+03D8
+03DA
+03DC
+03DE
+03E0
+03E2
+03E4
+03E6
+03E8
+03EA
+03EC
+03EE
+03F4
+03F7
+03F9 03FA
+03FD 042F
+0460
+0462
+0464
+0466
+0468
+046A
+046C
+046E
+0470
+0472
+0474
+0476
+0478
+047A
+047C
+047E
+0480
+048A
+048C
+048E
+0490
+0492
+0494
+0496
+0498
+049A
+049C
+049E
+04A0
+04A2
+04A4
+04A6
+04A8
+04AA
+04AC
+04AE
+04B0
+04B2
+04B4
+04B6
+04B8
+04BA
+04BC
+04BE
+04C0 04C1
+04C3
+04C5
+04C7
+04C9
+04CB
+04CD
+04D0
+04D2
+04D4
+04D6
+04D8
+04DA
+04DC
+04DE
+04E0
+04E2
+04E4
+04E6
+04E8
+04EA
+04EC
+04EE
+04F0
+04F2
+04F4
+04F6
+04F8
+04FA
+04FC
+04FE
+0500
+0502
+0504
+0506
+0508
+050A
+050C
+050E
+0510
+0512
+0514
+0516
+0518
+051A
+051C
+051E
+0520
+0522
+0531 0556
+10A0 10C5
+1E00
+1E02
+1E04
+1E06
+1E08
+1E0A
+1E0C
+1E0E
+1E10
+1E12
+1E14
+1E16
+1E18
+1E1A
+1E1C
+1E1E
+1E20
+1E22
+1E24
+1E26
+1E28
+1E2A
+1E2C
+1E2E
+1E30
+1E32
+1E34
+1E36
+1E38
+1E3A
+1E3C
+1E3E
+1E40
+1E42
+1E44
+1E46
+1E48
+1E4A
+1E4C
+1E4E
+1E50
+1E52
+1E54
+1E56
+1E58
+1E5A
+1E5C
+1E5E
+1E60
+1E62
+1E64
+1E66
+1E68
+1E6A
+1E6C
+1E6E
+1E70
+1E72
+1E74
+1E76
+1E78
+1E7A
+1E7C
+1E7E
+1E80
+1E82
+1E84
+1E86
+1E88
+1E8A
+1E8C
+1E8E
+1E90
+1E92
+1E94
+1E9E
+1EA0
+1EA2
+1EA4
+1EA6
+1EA8
+1EAA
+1EAC
+1EAE
+1EB0
+1EB2
+1EB4
+1EB6
+1EB8
+1EBA
+1EBC
+1EBE
+1EC0
+1EC2
+1EC4
+1EC6
+1EC8
+1ECA
+1ECC
+1ECE
+1ED0
+1ED2
+1ED4
+1ED6
+1ED8
+1EDA
+1EDC
+1EDE
+1EE0
+1EE2
+1EE4
+1EE6
+1EE8
+1EEA
+1EEC
+1EEE
+1EF0
+1EF2
+1EF4
+1EF6
+1EF8
+1EFA
+1EFC
+1EFE
+1F08 1F0F
+1F18 1F1D
+1F28 1F2F
+1F38 1F3F
+1F48 1F4D
+1F59
+1F5B
+1F5D
+1F5F
+1F68 1F6F
+1FB8 1FBB
+1FC8 1FCB
+1FD8 1FDB
+1FE8 1FEC
+1FF8 1FFB
+2102
+2107
+210B 210D
+2110 2112
+2115
+2119 211D
+2124
+2126
+2128
+212A 212D
+2130 2133
+213E 213F
+2145
+2183
+2C00 2C2E
+2C60
+2C62 2C64
+2C67
+2C69
+2C6B
+2C6D 2C6F
+2C72
+2C75
+2C80
+2C82
+2C84
+2C86
+2C88
+2C8A
+2C8C
+2C8E
+2C90
+2C92
+2C94
+2C96
+2C98
+2C9A
+2C9C
+2C9E
+2CA0
+2CA2
+2CA4
+2CA6
+2CA8
+2CAA
+2CAC
+2CAE
+2CB0
+2CB2
+2CB4
+2CB6
+2CB8
+2CBA
+2CBC
+2CBE
+2CC0
+2CC2
+2CC4
+2CC6
+2CC8
+2CCA
+2CCC
+2CCE
+2CD0
+2CD2
+2CD4
+2CD6
+2CD8
+2CDA
+2CDC
+2CDE
+2CE0
+2CE2
+A640
+A642
+A644
+A646
+A648
+A64A
+A64C
+A64E
+A650
+A652
+A654
+A656
+A658
+A65A
+A65C
+A65E
+A662
+A664
+A666
+A668
+A66A
+A66C
+A680
+A682
+A684
+A686
+A688
+A68A
+A68C
+A68E
+A690
+A692
+A694
+A696
+A722
+A724
+A726
+A728
+A72A
+A72C
+A72E
+A732
+A734
+A736
+A738
+A73A
+A73C
+A73E
+A740
+A742
+A744
+A746
+A748
+A74A
+A74C
+A74E
+A750
+A752
+A754
+A756
+A758
+A75A
+A75C
+A75E
+A760
+A762
+A764
+A766
+A768
+A76A
+A76C
+A76E
+A779
+A77B
+A77D A77E
+A780
+A782
+A784
+A786
+A78B
+FF21 FF3A
+10400 10427
+1D400 1D419
+1D434 1D44D
+1D468 1D481
+1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B5
+1D4D0 1D4E9
+1D504 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D538 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D56C 1D585
+1D5A0 1D5B9
+1D5D4 1D5ED
+1D608 1D621
+1D63C 1D655
+1D670 1D689
+1D6A8 1D6C0
+1D6E2 1D6FA
+1D71C 1D734
+1D756 1D76E
+1D790 1D7A8
+1D7CA
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lyci.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lyci.pl
new file mode 100755
index 00000000000..598d22296df
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lyci.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Lycian} (and fuzzy permutations)
+#
+# Meaning: Script 'Lycian'
+#
+return <<'END';
+10280 1029C Lycian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lydi.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lydi.pl
new file mode 100755
index 00000000000..d83ea2874e1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Lydi.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Lydian} (and fuzzy permutations)
+#
+# Meaning: Script 'Lydian'
+#
+return <<'END';
+10920 10939 Lydian
+1093F Lydian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/M.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/M.pl
new file mode 100755
index 00000000000..3937d9064fe
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/M.pl
@@ -0,0 +1,178 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{M}
+# \p{M} (and fuzzy permutations)
+#
+# Meaning: Major Category 'M'
+#
+return <<'END';
+0300 036F
+0483 0489
+0591 05BD
+05BF
+05C1 05C2
+05C4 05C5
+05C7
+0610 061A
+064B 065E
+0670
+06D6 06DC
+06DE 06E4
+06E7 06E8
+06EA 06ED
+0711
+0730 074A
+07A6 07B0
+07EB 07F3
+0901 0903
+093C
+093E 094D
+0951 0954
+0962 0963
+0981 0983
+09BC
+09BE 09C4
+09C7 09C8
+09CB 09CD
+09D7
+09E2 09E3
+0A01 0A03
+0A3C
+0A3E 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A70 0A71
+0A75
+0A81 0A83
+0ABC
+0ABE 0AC5
+0AC7 0AC9
+0ACB 0ACD
+0AE2 0AE3
+0B01 0B03
+0B3C
+0B3E 0B44
+0B47 0B48
+0B4B 0B4D
+0B56 0B57
+0B62 0B63
+0B82
+0BBE 0BC2
+0BC6 0BC8
+0BCA 0BCD
+0BD7
+0C01 0C03
+0C3E 0C44
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C62 0C63
+0C82 0C83
+0CBC
+0CBE 0CC4
+0CC6 0CC8
+0CCA 0CCD
+0CD5 0CD6
+0CE2 0CE3
+0D02 0D03
+0D3E 0D44
+0D46 0D48
+0D4A 0D4D
+0D57
+0D62 0D63
+0D82 0D83
+0DCA
+0DCF 0DD4
+0DD6
+0DD8 0DDF
+0DF2 0DF3
+0E31
+0E34 0E3A
+0E47 0E4E
+0EB1
+0EB4 0EB9
+0EBB 0EBC
+0EC8 0ECD
+0F18 0F19
+0F35
+0F37
+0F39
+0F3E 0F3F
+0F71 0F84
+0F86 0F87
+0F90 0F97
+0F99 0FBC
+0FC6
+102B 103E
+1056 1059
+105E 1060
+1062 1064
+1067 106D
+1071 1074
+1082 108D
+108F
+135F
+1712 1714
+1732 1734
+1752 1753
+1772 1773
+17B6 17D3
+17DD
+180B 180D
+18A9
+1920 192B
+1930 193B
+19B0 19C0
+19C8 19C9
+1A17 1A1B
+1B00 1B04
+1B34 1B44
+1B6B 1B73
+1B80 1B82
+1BA1 1BAA
+1C24 1C37
+1DC0 1DE6
+1DFE 1DFF
+20D0 20F0
+2DE0 2DFF
+302A 302F
+3099 309A
+A66F A672
+A67C A67D
+A802
+A806
+A80B
+A823 A827
+A880 A881
+A8B4 A8C4
+A926 A92D
+A947 A953
+AA29 AA36
+AA43
+AA4C AA4D
+FB1E
+FE00 FE0F
+FE20 FE26
+101FD
+10A01 10A03
+10A05 10A06
+10A0C 10A0F
+10A38 10A3A
+10A3F
+1D165 1D169
+1D16D 1D172
+1D17B 1D182
+1D185 1D18B
+1D1AA 1D1AD
+1D242 1D244
+E0100 E01EF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Math.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Math.pl
new file mode 100755
index 00000000000..aab21572947
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Math.pl
@@ -0,0 +1,121 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Math} (and fuzzy permutations)
+#
+# Meaning: [\p{Sm}\p{OtherMath}]
+#
+return <<'END';
+002B
+003C 003E
+005E
+007C
+007E
+00AC
+00B1
+00D7
+00F7
+03D0 03D2
+03D5
+03F0 03F1
+03F4 03F6
+0606 0608
+2016
+2032 2034
+2040
+2044
+2052
+2061 2064
+207A 207E
+208A 208E
+20D0 20DC
+20E1
+20E5 20E6
+20EB 20EF
+2102
+210A 2113
+2115
+2119 211D
+2124
+2128 2129
+212C 212D
+212F 2131
+2133 2138
+213C 2149
+214B
+2190 21A7
+21A9 21AE
+21B0 21B1
+21B6 21B7
+21BC 21DB
+21DD
+21E4 21E5
+21F4 22FF
+2308 230B
+2320 2321
+237C
+239B 23B5
+23B7
+23D0
+23DC 23E2
+25A0 25A1
+25AE 25B7
+25BC 25C1
+25C6 25C7
+25CA 25CB
+25CF 25D3
+25E2
+25E4
+25E7 25EC
+25F8 25FF
+2605 2606
+2640
+2642
+2660 2663
+266D 266F
+27C0 27CA
+27CC
+27D0 27FF
+2900 2AFF
+2B30 2B44
+2B47 2B4C
+FB29
+FE61 FE66
+FE68
+FF0B
+FF1C FF1E
+FF3C
+FF3E
+FF5C
+FF5E
+FFE2
+FFE9 FFEC
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D7CB
+1D7CE 1D7FF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mc.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mc.pl
new file mode 100755
index 00000000000..46e7e2e61af
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mc.pl
@@ -0,0 +1,102 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Mc}
+# \p{Mc} (and fuzzy permutations)
+#
+# Meaning: General Category 'Mc'
+#
+return <<'END';
+0903
+093E 0940
+0949 094C
+0982 0983
+09BE 09C0
+09C7 09C8
+09CB 09CC
+09D7
+0A03
+0A3E 0A40
+0A83
+0ABE 0AC0
+0AC9
+0ACB 0ACC
+0B02 0B03
+0B3E
+0B40
+0B47 0B48
+0B4B 0B4C
+0B57
+0BBE 0BBF
+0BC1 0BC2
+0BC6 0BC8
+0BCA 0BCC
+0BD7
+0C01 0C03
+0C41 0C44
+0C82 0C83
+0CBE
+0CC0 0CC4
+0CC7 0CC8
+0CCA 0CCB
+0CD5 0CD6
+0D02 0D03
+0D3E 0D40
+0D46 0D48
+0D4A 0D4C
+0D57
+0D82 0D83
+0DCF 0DD1
+0DD8 0DDF
+0DF2 0DF3
+0F3E 0F3F
+0F7F
+102B 102C
+1031
+1038
+103B 103C
+1056 1057
+1062 1064
+1067 106D
+1083 1084
+1087 108C
+108F
+17B6
+17BE 17C5
+17C7 17C8
+1923 1926
+1929 192B
+1930 1931
+1933 1938
+19B0 19C0
+19C8 19C9
+1A19 1A1B
+1B04
+1B35
+1B3B
+1B3D 1B41
+1B43 1B44
+1B82
+1BA1
+1BA6 1BA7
+1BAA
+1C24 1C2B
+1C34 1C35
+A823 A824
+A827
+A880 A881
+A8B4 A8C3
+A952 A953
+AA2F AA30
+AA33 AA34
+AA4D
+1D165 1D166
+1D16D 1D172
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Me.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Me.pl
new file mode 100755
index 00000000000..94326e2fb3d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Me.pl
@@ -0,0 +1,22 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Me}
+# \p{Me} (and fuzzy permutations)
+#
+# Meaning: General Category 'Me'
+#
+return <<'END';
+0488 0489
+06DE
+20DD 20E0
+20E2 20E4
+A670 A672
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mlym.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mlym.pl
new file mode 100755
index 00000000000..9a017327e80
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mlym.pl
@@ -0,0 +1,28 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Malayalam} (and fuzzy permutations)
+#
+# Meaning: Script 'Malayalam'
+#
+return <<'END';
+0D02 0D03 Malayalam
+0D05 0D0C Malayalam
+0D0E 0D10 Malayalam
+0D12 0D28 Malayalam
+0D2A 0D39 Malayalam
+0D3D 0D44 Malayalam
+0D46 0D48 Malayalam
+0D4A 0D4D Malayalam
+0D57 Malayalam
+0D60 0D63 Malayalam
+0D66 0D75 Malayalam
+0D79 0D7F Malayalam
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mn.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mn.pl
new file mode 100755
index 00000000000..1e7f6523c27
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mn.pl
@@ -0,0 +1,177 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Mn}
+# \p{Mn} (and fuzzy permutations)
+#
+# Meaning: General Category 'Mn'
+#
+return <<'END';
+0300 036F
+0483 0487
+0591 05BD
+05BF
+05C1 05C2
+05C4 05C5
+05C7
+0610 061A
+064B 065E
+0670
+06D6 06DC
+06DF 06E4
+06E7 06E8
+06EA 06ED
+0711
+0730 074A
+07A6 07B0
+07EB 07F3
+0901 0902
+093C
+0941 0948
+094D
+0951 0954
+0962 0963
+0981
+09BC
+09C1 09C4
+09CD
+09E2 09E3
+0A01 0A02
+0A3C
+0A41 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A70 0A71
+0A75
+0A81 0A82
+0ABC
+0AC1 0AC5
+0AC7 0AC8
+0ACD
+0AE2 0AE3
+0B01
+0B3C
+0B3F
+0B41 0B44
+0B4D
+0B56
+0B62 0B63
+0B82
+0BC0
+0BCD
+0C3E 0C40
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C62 0C63
+0CBC
+0CBF
+0CC6
+0CCC 0CCD
+0CE2 0CE3
+0D41 0D44
+0D4D
+0D62 0D63
+0DCA
+0DD2 0DD4
+0DD6
+0E31
+0E34 0E3A
+0E47 0E4E
+0EB1
+0EB4 0EB9
+0EBB 0EBC
+0EC8 0ECD
+0F18 0F19
+0F35
+0F37
+0F39
+0F71 0F7E
+0F80 0F84
+0F86 0F87
+0F90 0F97
+0F99 0FBC
+0FC6
+102D 1030
+1032 1037
+1039 103A
+103D 103E
+1058 1059
+105E 1060
+1071 1074
+1082
+1085 1086
+108D
+135F
+1712 1714
+1732 1734
+1752 1753
+1772 1773
+17B7 17BD
+17C6
+17C9 17D3
+17DD
+180B 180D
+18A9
+1920 1922
+1927 1928
+1932
+1939 193B
+1A17 1A18
+1B00 1B03
+1B34
+1B36 1B3A
+1B3C
+1B42
+1B6B 1B73
+1B80 1B81
+1BA2 1BA5
+1BA8 1BA9
+1C2C 1C33
+1C36 1C37
+1DC0 1DE6
+1DFE 1DFF
+20D0 20DC
+20E1
+20E5 20F0
+2DE0 2DFF
+302A 302F
+3099 309A
+A66F
+A67C A67D
+A802
+A806
+A80B
+A825 A826
+A8C4
+A926 A92D
+A947 A951
+AA29 AA2E
+AA31 AA32
+AA35 AA36
+AA43
+AA4C
+FB1E
+FE00 FE0F
+FE20 FE26
+101FD
+10A01 10A03
+10A05 10A06
+10A0C 10A0F
+10A38 10A3A
+10A3F
+1D167 1D169
+1D17B 1D182
+1D185 1D18B
+1D1AA 1D1AD
+1D242 1D244
+E0100 E01EF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mong.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mong.pl
new file mode 100755
index 00000000000..b1bfc9adcd0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mong.pl
@@ -0,0 +1,22 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Mongolian} (and fuzzy permutations)
+#
+# Meaning: Script 'Mongolian'
+#
+return <<'END';
+1800 1801 Mongolian
+1804 Mongolian
+1806 180E Mongolian
+1810 1819 Mongolian
+1820 1877 Mongolian
+1880 18AA Mongolian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mymr.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mymr.pl
new file mode 100755
index 00000000000..55eb02eb25e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Mymr.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Myanmar} (and fuzzy permutations)
+#
+# Meaning: Script 'Myanmar'
+#
+return <<'END';
+1000 1099 Myanmar
+109E 109F Myanmar
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/N.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/N.pl
new file mode 100755
index 00000000000..18e3f10962b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/N.pl
@@ -0,0 +1,86 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{N}
+# \p{N} (and fuzzy permutations)
+#
+# Meaning: Major Category 'N'
+#
+return <<'END';
+0030 0039
+00B2 00B3
+00B9
+00BC 00BE
+0660 0669
+06F0 06F9
+07C0 07C9
+0966 096F
+09E6 09EF
+09F4 09F9
+0A66 0A6F
+0AE6 0AEF
+0B66 0B6F
+0BE6 0BF2
+0C66 0C6F
+0C78 0C7E
+0CE6 0CEF
+0D66 0D75
+0E50 0E59
+0ED0 0ED9
+0F20 0F33
+1040 1049
+1090 1099
+1369 137C
+16EE 16F0
+17E0 17E9
+17F0 17F9
+1810 1819
+1946 194F
+19D0 19D9
+1B50 1B59
+1BB0 1BB9
+1C40 1C49
+1C50 1C59
+2070
+2074 2079
+2080 2089
+2153 2182
+2185 2188
+2460 249B
+24EA 24FF
+2776 2793
+2CFD
+3007
+3021 3029
+3038 303A
+3192 3195
+3220 3229
+3251 325F
+3280 3289
+32B1 32BF
+A620 A629
+A8D0 A8D9
+A900 A909
+AA50 AA59
+FF10 FF19
+10107 10133
+10140 10178
+1018A
+10320 10323
+10341
+1034A
+103D1 103D5
+104A0 104A9
+10916 10919
+10A40 10A47
+12400 12462
+1D360 1D371
+1D7CE 1D7FF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/NChar.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/NChar.pl
new file mode 100755
index 00000000000..5bcb62da403
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/NChar.pl
@@ -0,0 +1,31 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Noncharacter_Code_Point'
+#
+return <<'END';
+FDD0 FDEF Noncharacter_Code_Point
+FFFE FFFF Noncharacter_Code_Point
+1FFFE 1FFFF Noncharacter_Code_Point
+2FFFE 2FFFF Noncharacter_Code_Point
+3FFFE 3FFFF Noncharacter_Code_Point
+4FFFE 4FFFF Noncharacter_Code_Point
+5FFFE 5FFFF Noncharacter_Code_Point
+6FFFE 6FFFF Noncharacter_Code_Point
+7FFFE 7FFFF Noncharacter_Code_Point
+8FFFE 8FFFF Noncharacter_Code_Point
+9FFFE 9FFFF Noncharacter_Code_Point
+AFFFE AFFFF Noncharacter_Code_Point
+BFFFE BFFFF Noncharacter_Code_Point
+CFFFE CFFFF Noncharacter_Code_Point
+DFFFE DFFFF Noncharacter_Code_Point
+EFFFE EFFFF Noncharacter_Code_Point
+FFFFE FFFFF Noncharacter_Code_Point
+10FFFE 10FFFF Noncharacter_Code_Point
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nd.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nd.pl
new file mode 100755
index 00000000000..cba14f20a29
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nd.pl
@@ -0,0 +1,50 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Nd}
+# \p{Nd} (and fuzzy permutations)
+#
+# Meaning: General Category 'Nd'
+#
+return <<'END';
+0030 0039
+0660 0669
+06F0 06F9
+07C0 07C9
+0966 096F
+09E6 09EF
+0A66 0A6F
+0AE6 0AEF
+0B66 0B6F
+0BE6 0BEF
+0C66 0C6F
+0CE6 0CEF
+0D66 0D6F
+0E50 0E59
+0ED0 0ED9
+0F20 0F29
+1040 1049
+1090 1099
+17E0 17E9
+1810 1819
+1946 194F
+19D0 19D9
+1B50 1B59
+1BB0 1BB9
+1C40 1C49
+1C50 1C59
+A620 A629
+A8D0 A8D9
+A900 A909
+AA50 AA59
+FF10 FF19
+104A0 104A9
+1D7CE 1D7FF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/NewTaiLu.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/NewTaiLu.pl
new file mode 100755
index 00000000000..537f6d67b71
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/NewTaiLu.pl
@@ -0,0 +1,20 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{NewTaiLue} (and fuzzy permutations)
+#
+# Meaning: Script 'New_Tai_Lue'
+#
+return <<'END';
+1980 19A9 New_Tai_Lue
+19B0 19C9 New_Tai_Lue
+19D0 19D9 New_Tai_Lue
+19DE 19DF New_Tai_Lue
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nkoo.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nkoo.pl
new file mode 100755
index 00000000000..b42f593df50
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nkoo.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Nko} (and fuzzy permutations)
+#
+# Meaning: Script 'Nko'
+#
+return <<'END';
+07C0 07FA Nko
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nl.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nl.pl
new file mode 100755
index 00000000000..405df212cd8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nl.pl
@@ -0,0 +1,28 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Nl}
+# \p{Nl} (and fuzzy permutations)
+#
+# Meaning: General Category 'Nl'
+#
+return <<'END';
+16EE 16F0
+2160 2182
+2185 2188
+3007
+3021 3029
+3038 303A
+10140 10174
+10341
+1034A
+103D1 103D5
+12400 12462
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/No.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/No.pl
new file mode 100755
index 00000000000..622f36b9180
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/No.pl
@@ -0,0 +1,47 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{No}
+# \p{No} (and fuzzy permutations)
+#
+# Meaning: General Category 'No'
+#
+return <<'END';
+00B2 00B3
+00B9
+00BC 00BE
+09F4 09F9
+0BF0 0BF2
+0C78 0C7E
+0D70 0D75
+0F2A 0F33
+1369 137C
+17F0 17F9
+2070
+2074 2079
+2080 2089
+2153 215F
+2460 249B
+24EA 24FF
+2776 2793
+2CFD
+3192 3195
+3220 3229
+3251 325F
+3280 3289
+32B1 32BF
+10107 10133
+10175 10178
+1018A
+10320 10323
+10916 10919
+10A40 10A47
+1D360 1D371
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nonchara.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nonchara.pl
new file mode 100755
index 00000000000..f4eb7534fe6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Nonchara.pl
@@ -0,0 +1,34 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{NoncharacterCodePoint} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Noncharacter_Code_Point'
+#
+return <<'END';
+FDD0 FDEF Noncharacter_Code_Point
+FFFE FFFF Noncharacter_Code_Point
+1FFFE 1FFFF Noncharacter_Code_Point
+2FFFE 2FFFF Noncharacter_Code_Point
+3FFFE 3FFFF Noncharacter_Code_Point
+4FFFE 4FFFF Noncharacter_Code_Point
+5FFFE 5FFFF Noncharacter_Code_Point
+6FFFE 6FFFF Noncharacter_Code_Point
+7FFFE 7FFFF Noncharacter_Code_Point
+8FFFE 8FFFF Noncharacter_Code_Point
+9FFFE 9FFFF Noncharacter_Code_Point
+AFFFE AFFFF Noncharacter_Code_Point
+BFFFE BFFFF Noncharacter_Code_Point
+CFFFE CFFFF Noncharacter_Code_Point
+DFFFE DFFFF Noncharacter_Code_Point
+EFFFE EFFFF Noncharacter_Code_Point
+FFFFE FFFFF Noncharacter_Code_Point
+10FFFE 10FFFF Noncharacter_Code_Point
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OAlpha.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OAlpha.pl
new file mode 100755
index 00000000000..b4edb96d879
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OAlpha.pl
@@ -0,0 +1,135 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Other_Alphabetic'
+#
+return <<'END';
+0345 Other_Alphabetic
+05B0 05BD Other_Alphabetic
+05BF Other_Alphabetic
+05C1 05C2 Other_Alphabetic
+05C4 05C5 Other_Alphabetic
+05C7 Other_Alphabetic
+0610 061A Other_Alphabetic
+064B 0657 Other_Alphabetic
+0659 065E Other_Alphabetic
+0670 Other_Alphabetic
+06D6 06DC Other_Alphabetic
+06E1 06E4 Other_Alphabetic
+06E7 06E8 Other_Alphabetic
+06ED Other_Alphabetic
+0711 Other_Alphabetic
+0730 073F Other_Alphabetic
+07A6 07B0 Other_Alphabetic
+0901 0903 Other_Alphabetic
+093E 094C Other_Alphabetic
+0962 0963 Other_Alphabetic
+0981 0983 Other_Alphabetic
+09BE 09C4 Other_Alphabetic
+09C7 09C8 Other_Alphabetic
+09CB 09CC Other_Alphabetic
+09D7 Other_Alphabetic
+09E2 09E3 Other_Alphabetic
+0A01 0A03 Other_Alphabetic
+0A3E 0A42 Other_Alphabetic
+0A47 0A48 Other_Alphabetic
+0A4B 0A4C Other_Alphabetic
+0A51 Other_Alphabetic
+0A70 0A71 Other_Alphabetic
+0A75 Other_Alphabetic
+0A81 0A83 Other_Alphabetic
+0ABE 0AC5 Other_Alphabetic
+0AC7 0AC9 Other_Alphabetic
+0ACB 0ACC Other_Alphabetic
+0AE2 0AE3 Other_Alphabetic
+0B01 0B03 Other_Alphabetic
+0B3E 0B44 Other_Alphabetic
+0B47 0B48 Other_Alphabetic
+0B4B 0B4C Other_Alphabetic
+0B56 0B57 Other_Alphabetic
+0B62 0B63 Other_Alphabetic
+0B82 Other_Alphabetic
+0BBE 0BC2 Other_Alphabetic
+0BC6 0BC8 Other_Alphabetic
+0BCA 0BCC Other_Alphabetic
+0BD7 Other_Alphabetic
+0C01 0C03 Other_Alphabetic
+0C3E 0C44 Other_Alphabetic
+0C46 0C48 Other_Alphabetic
+0C4A 0C4C Other_Alphabetic
+0C55 0C56 Other_Alphabetic
+0C62 0C63 Other_Alphabetic
+0C82 0C83 Other_Alphabetic
+0CBE 0CC4 Other_Alphabetic
+0CC6 0CC8 Other_Alphabetic
+0CCA 0CCC Other_Alphabetic
+0CD5 0CD6 Other_Alphabetic
+0CE2 0CE3 Other_Alphabetic
+0D02 0D03 Other_Alphabetic
+0D3E 0D44 Other_Alphabetic
+0D46 0D48 Other_Alphabetic
+0D4A 0D4C Other_Alphabetic
+0D57 Other_Alphabetic
+0D62 0D63 Other_Alphabetic
+0D82 0D83 Other_Alphabetic
+0DCF 0DD4 Other_Alphabetic
+0DD6 Other_Alphabetic
+0DD8 0DDF Other_Alphabetic
+0DF2 0DF3 Other_Alphabetic
+0E31 Other_Alphabetic
+0E34 0E3A Other_Alphabetic
+0E4D Other_Alphabetic
+0EB1 Other_Alphabetic
+0EB4 0EB9 Other_Alphabetic
+0EBB 0EBC Other_Alphabetic
+0ECD Other_Alphabetic
+0F71 0F81 Other_Alphabetic
+0F90 0F97 Other_Alphabetic
+0F99 0FBC Other_Alphabetic
+102B 1036 Other_Alphabetic
+1038 Other_Alphabetic
+103B 103E Other_Alphabetic
+1056 1059 Other_Alphabetic
+105E 1060 Other_Alphabetic
+1062 Other_Alphabetic
+1067 1068 Other_Alphabetic
+1071 1074 Other_Alphabetic
+1082 1086 Other_Alphabetic
+135F Other_Alphabetic
+1712 1713 Other_Alphabetic
+1732 1733 Other_Alphabetic
+1752 1753 Other_Alphabetic
+1772 1773 Other_Alphabetic
+17B6 17C8 Other_Alphabetic
+18A9 Other_Alphabetic
+1920 192B Other_Alphabetic
+1930 1938 Other_Alphabetic
+19B0 19C0 Other_Alphabetic
+19C8 19C9 Other_Alphabetic
+1A17 1A1B Other_Alphabetic
+1B00 1B04 Other_Alphabetic
+1B35 1B43 Other_Alphabetic
+1B80 1B82 Other_Alphabetic
+1BA1 1BA9 Other_Alphabetic
+1C24 1C35 Other_Alphabetic
+24B6 24E9 Other_Alphabetic
+2DE0 2DFF Other_Alphabetic
+A823 A827 Other_Alphabetic
+A880 A881 Other_Alphabetic
+A8B4 A8C3 Other_Alphabetic
+A926 A92A Other_Alphabetic
+A947 A952 Other_Alphabetic
+AA29 AA36 Other_Alphabetic
+AA43 Other_Alphabetic
+AA4C AA4D Other_Alphabetic
+FB1E Other_Alphabetic
+10A01 10A03 Other_Alphabetic
+10A05 10A06 Other_Alphabetic
+10A0C 10A0F Other_Alphabetic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/ODI.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/ODI.pl
new file mode 100755
index 00000000000..a97955a6465
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/ODI.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Other_Default_Ignorable_Code_Point'
+#
+return <<'END';
+034F Other_Default_Ignorable_Code_Point
+115F 1160 Other_Default_Ignorable_Code_Point
+2065 2069 Other_Default_Ignorable_Code_Point
+3164 Other_Default_Ignorable_Code_Point
+FFA0 Other_Default_Ignorable_Code_Point
+FFF0 FFF8 Other_Default_Ignorable_Code_Point
+E0000 Other_Default_Ignorable_Code_Point
+E0002 E001F Other_Default_Ignorable_Code_Point
+E0080 E00FF Other_Default_Ignorable_Code_Point
+E01F0 E0FFF Other_Default_Ignorable_Code_Point
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OGrExt.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OGrExt.pl
new file mode 100755
index 00000000000..f9f5e7fe725
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OGrExt.pl
@@ -0,0 +1,29 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Other_Grapheme_Extend'
+#
+return <<'END';
+09BE Other_Grapheme_Extend
+09D7 Other_Grapheme_Extend
+0B3E Other_Grapheme_Extend
+0B57 Other_Grapheme_Extend
+0BBE Other_Grapheme_Extend
+0BD7 Other_Grapheme_Extend
+0CC2 Other_Grapheme_Extend
+0CD5 0CD6 Other_Grapheme_Extend
+0D3E Other_Grapheme_Extend
+0D57 Other_Grapheme_Extend
+0DCF Other_Grapheme_Extend
+0DDF Other_Grapheme_Extend
+200C 200D Other_Grapheme_Extend
+FF9E FF9F Other_Grapheme_Extend
+1D165 Other_Grapheme_Extend
+1D16E 1D172 Other_Grapheme_Extend
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OIDC.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OIDC.pl
new file mode 100755
index 00000000000..8ac1b0e069e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OIDC.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Other_ID_Continue'
+#
+return <<'END';
+00B7 Other_ID_Continue
+0387 Other_ID_Continue
+1369 1371 Other_ID_Continue
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OIDS.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OIDS.pl
new file mode 100755
index 00000000000..ba93bb9fc2e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OIDS.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Other_ID_Start'
+#
+return <<'END';
+2118 Other_ID_Start
+212E Other_ID_Start
+309B 309C Other_ID_Start
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OLower.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OLower.pl
new file mode 100755
index 00000000000..85e6e5574a1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OLower.pl
@@ -0,0 +1,26 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Other_Lowercase'
+#
+return <<'END';
+02B0 02B8 Other_Lowercase
+02C0 02C1 Other_Lowercase
+02E0 02E4 Other_Lowercase
+0345 Other_Lowercase
+037A Other_Lowercase
+1D2C 1D61 Other_Lowercase
+1D78 Other_Lowercase
+1D9B 1DBF Other_Lowercase
+2090 2094 Other_Lowercase
+2170 217F Other_Lowercase
+24D0 24E9 Other_Lowercase
+2C7D Other_Lowercase
+A770 Other_Lowercase
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OMath.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OMath.pl
new file mode 100755
index 00000000000..b8a47d5178e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OMath.pl
@@ -0,0 +1,112 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Other_Math'
+#
+return <<'END';
+005E Other_Math
+03D0 03D2 Other_Math
+03D5 Other_Math
+03F0 03F1 Other_Math
+03F4 03F5 Other_Math
+2016 Other_Math
+2032 2034 Other_Math
+2040 Other_Math
+2061 2064 Other_Math
+207D 207E Other_Math
+208D 208E Other_Math
+20D0 20DC Other_Math
+20E1 Other_Math
+20E5 20E6 Other_Math
+20EB 20EF Other_Math
+2102 Other_Math
+210A 2113 Other_Math
+2115 Other_Math
+2119 211D Other_Math
+2124 Other_Math
+2128 2129 Other_Math
+212C 212D Other_Math
+212F 2131 Other_Math
+2133 2138 Other_Math
+213C 213F Other_Math
+2145 2149 Other_Math
+2195 2199 Other_Math
+219C 219F Other_Math
+21A1 21A2 Other_Math
+21A4 21A5 Other_Math
+21A7 Other_Math
+21A9 21AD Other_Math
+21B0 21B1 Other_Math
+21B6 21B7 Other_Math
+21BC 21CD Other_Math
+21D0 21D1 Other_Math
+21D3 Other_Math
+21D5 21DB Other_Math
+21DD Other_Math
+21E4 21E5 Other_Math
+23B4 23B5 Other_Math
+23B7 Other_Math
+23D0 Other_Math
+23E2 Other_Math
+25A0 25A1 Other_Math
+25AE 25B6 Other_Math
+25BC 25C0 Other_Math
+25C6 25C7 Other_Math
+25CA 25CB Other_Math
+25CF 25D3 Other_Math
+25E2 Other_Math
+25E4 Other_Math
+25E7 25EC Other_Math
+2605 2606 Other_Math
+2640 Other_Math
+2642 Other_Math
+2660 2663 Other_Math
+266D 266E Other_Math
+27C5 27C6 Other_Math
+27E6 27EF Other_Math
+2983 2998 Other_Math
+29D8 29DB Other_Math
+29FC 29FD Other_Math
+FE61 Other_Math
+FE63 Other_Math
+FE68 Other_Math
+FF3C Other_Math
+FF3E Other_Math
+1D400 1D454 Other_Math
+1D456 1D49C Other_Math
+1D49E 1D49F Other_Math
+1D4A2 Other_Math
+1D4A5 1D4A6 Other_Math
+1D4A9 1D4AC Other_Math
+1D4AE 1D4B9 Other_Math
+1D4BB Other_Math
+1D4BD 1D4C3 Other_Math
+1D4C5 1D505 Other_Math
+1D507 1D50A Other_Math
+1D50D 1D514 Other_Math
+1D516 1D51C Other_Math
+1D51E 1D539 Other_Math
+1D53B 1D53E Other_Math
+1D540 1D544 Other_Math
+1D546 Other_Math
+1D54A 1D550 Other_Math
+1D552 1D6A5 Other_Math
+1D6A8 1D6C0 Other_Math
+1D6C2 1D6DA Other_Math
+1D6DC 1D6FA Other_Math
+1D6FC 1D714 Other_Math
+1D716 1D734 Other_Math
+1D736 1D74E Other_Math
+1D750 1D76E Other_Math
+1D770 1D788 Other_Math
+1D78A 1D7A8 Other_Math
+1D7AA 1D7C2 Other_Math
+1D7C4 1D7CB Other_Math
+1D7CE 1D7FF Other_Math
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OUpper.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OUpper.pl
new file mode 100755
index 00000000000..a05b26601d4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OUpper.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Other_Uppercase'
+#
+return <<'END';
+2160 216F Other_Uppercase
+24B6 24CF Other_Uppercase
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ogam.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ogam.pl
new file mode 100755
index 00000000000..f42872ffda5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ogam.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Ogham} (and fuzzy permutations)
+#
+# Meaning: Script 'Ogham'
+#
+return <<'END';
+1680 169C Ogham
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OlChiki.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OlChiki.pl
new file mode 100755
index 00000000000..dd2aadd8892
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OlChiki.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{OlChiki} (and fuzzy permutations)
+#
+# Meaning: Script 'Ol_Chiki'
+#
+return <<'END';
+1C50 1C7F Ol_Chiki
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OldItali.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OldItali.pl
new file mode 100755
index 00000000000..06e9c4e548d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OldItali.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{OldItalic} (and fuzzy permutations)
+#
+# Meaning: Script 'Old_Italic'
+#
+return <<'END';
+10300 1031E Old_Italic
+10320 10323 Old_Italic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OldPersi.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OldPersi.pl
new file mode 100755
index 00000000000..1b7cf22626f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OldPersi.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{OldPersian} (and fuzzy permutations)
+#
+# Meaning: Script 'Old_Persian'
+#
+return <<'END';
+103A0 103C3 Old_Persian
+103C8 103D5 Old_Persian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Orya.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Orya.pl
new file mode 100755
index 00000000000..c72c66a6038
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Orya.pl
@@ -0,0 +1,30 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Oriya} (and fuzzy permutations)
+#
+# Meaning: Script 'Oriya'
+#
+return <<'END';
+0B01 0B03 Oriya
+0B05 0B0C Oriya
+0B0F 0B10 Oriya
+0B13 0B28 Oriya
+0B2A 0B30 Oriya
+0B32 0B33 Oriya
+0B35 0B39 Oriya
+0B3C 0B44 Oriya
+0B47 0B48 Oriya
+0B4B 0B4D Oriya
+0B56 0B57 Oriya
+0B5C 0B5D Oriya
+0B5F 0B63 Oriya
+0B66 0B71 Oriya
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Osma.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Osma.pl
new file mode 100755
index 00000000000..d0e3e0cb1bc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Osma.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Osmanya} (and fuzzy permutations)
+#
+# Meaning: Script 'Osmanya'
+#
+return <<'END';
+10480 1049D Osmanya
+104A0 104A9 Osmanya
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherAlp.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherAlp.pl
new file mode 100755
index 00000000000..5b353b3a981
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherAlp.pl
@@ -0,0 +1,138 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{OtherAlphabetic} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Other_Alphabetic'
+#
+return <<'END';
+0345 Other_Alphabetic
+05B0 05BD Other_Alphabetic
+05BF Other_Alphabetic
+05C1 05C2 Other_Alphabetic
+05C4 05C5 Other_Alphabetic
+05C7 Other_Alphabetic
+0610 061A Other_Alphabetic
+064B 0657 Other_Alphabetic
+0659 065E Other_Alphabetic
+0670 Other_Alphabetic
+06D6 06DC Other_Alphabetic
+06E1 06E4 Other_Alphabetic
+06E7 06E8 Other_Alphabetic
+06ED Other_Alphabetic
+0711 Other_Alphabetic
+0730 073F Other_Alphabetic
+07A6 07B0 Other_Alphabetic
+0901 0903 Other_Alphabetic
+093E 094C Other_Alphabetic
+0962 0963 Other_Alphabetic
+0981 0983 Other_Alphabetic
+09BE 09C4 Other_Alphabetic
+09C7 09C8 Other_Alphabetic
+09CB 09CC Other_Alphabetic
+09D7 Other_Alphabetic
+09E2 09E3 Other_Alphabetic
+0A01 0A03 Other_Alphabetic
+0A3E 0A42 Other_Alphabetic
+0A47 0A48 Other_Alphabetic
+0A4B 0A4C Other_Alphabetic
+0A51 Other_Alphabetic
+0A70 0A71 Other_Alphabetic
+0A75 Other_Alphabetic
+0A81 0A83 Other_Alphabetic
+0ABE 0AC5 Other_Alphabetic
+0AC7 0AC9 Other_Alphabetic
+0ACB 0ACC Other_Alphabetic
+0AE2 0AE3 Other_Alphabetic
+0B01 0B03 Other_Alphabetic
+0B3E 0B44 Other_Alphabetic
+0B47 0B48 Other_Alphabetic
+0B4B 0B4C Other_Alphabetic
+0B56 0B57 Other_Alphabetic
+0B62 0B63 Other_Alphabetic
+0B82 Other_Alphabetic
+0BBE 0BC2 Other_Alphabetic
+0BC6 0BC8 Other_Alphabetic
+0BCA 0BCC Other_Alphabetic
+0BD7 Other_Alphabetic
+0C01 0C03 Other_Alphabetic
+0C3E 0C44 Other_Alphabetic
+0C46 0C48 Other_Alphabetic
+0C4A 0C4C Other_Alphabetic
+0C55 0C56 Other_Alphabetic
+0C62 0C63 Other_Alphabetic
+0C82 0C83 Other_Alphabetic
+0CBE 0CC4 Other_Alphabetic
+0CC6 0CC8 Other_Alphabetic
+0CCA 0CCC Other_Alphabetic
+0CD5 0CD6 Other_Alphabetic
+0CE2 0CE3 Other_Alphabetic
+0D02 0D03 Other_Alphabetic
+0D3E 0D44 Other_Alphabetic
+0D46 0D48 Other_Alphabetic
+0D4A 0D4C Other_Alphabetic
+0D57 Other_Alphabetic
+0D62 0D63 Other_Alphabetic
+0D82 0D83 Other_Alphabetic
+0DCF 0DD4 Other_Alphabetic
+0DD6 Other_Alphabetic
+0DD8 0DDF Other_Alphabetic
+0DF2 0DF3 Other_Alphabetic
+0E31 Other_Alphabetic
+0E34 0E3A Other_Alphabetic
+0E4D Other_Alphabetic
+0EB1 Other_Alphabetic
+0EB4 0EB9 Other_Alphabetic
+0EBB 0EBC Other_Alphabetic
+0ECD Other_Alphabetic
+0F71 0F81 Other_Alphabetic
+0F90 0F97 Other_Alphabetic
+0F99 0FBC Other_Alphabetic
+102B 1036 Other_Alphabetic
+1038 Other_Alphabetic
+103B 103E Other_Alphabetic
+1056 1059 Other_Alphabetic
+105E 1060 Other_Alphabetic
+1062 Other_Alphabetic
+1067 1068 Other_Alphabetic
+1071 1074 Other_Alphabetic
+1082 1086 Other_Alphabetic
+135F Other_Alphabetic
+1712 1713 Other_Alphabetic
+1732 1733 Other_Alphabetic
+1752 1753 Other_Alphabetic
+1772 1773 Other_Alphabetic
+17B6 17C8 Other_Alphabetic
+18A9 Other_Alphabetic
+1920 192B Other_Alphabetic
+1930 1938 Other_Alphabetic
+19B0 19C0 Other_Alphabetic
+19C8 19C9 Other_Alphabetic
+1A17 1A1B Other_Alphabetic
+1B00 1B04 Other_Alphabetic
+1B35 1B43 Other_Alphabetic
+1B80 1B82 Other_Alphabetic
+1BA1 1BA9 Other_Alphabetic
+1C24 1C35 Other_Alphabetic
+24B6 24E9 Other_Alphabetic
+2DE0 2DFF Other_Alphabetic
+A823 A827 Other_Alphabetic
+A880 A881 Other_Alphabetic
+A8B4 A8C3 Other_Alphabetic
+A926 A92A Other_Alphabetic
+A947 A952 Other_Alphabetic
+AA29 AA36 Other_Alphabetic
+AA43 Other_Alphabetic
+AA4C AA4D Other_Alphabetic
+FB1E Other_Alphabetic
+10A01 10A03 Other_Alphabetic
+10A05 10A06 Other_Alphabetic
+10A0C 10A0F Other_Alphabetic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherDef.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherDef.pl
new file mode 100755
index 00000000000..e1dac029a6c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherDef.pl
@@ -0,0 +1,26 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{OtherDefaultIgnorableCodePoint} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Other_Default_Ignorable_Code_Point'
+#
+return <<'END';
+034F Other_Default_Ignorable_Code_Point
+115F 1160 Other_Default_Ignorable_Code_Point
+2065 2069 Other_Default_Ignorable_Code_Point
+3164 Other_Default_Ignorable_Code_Point
+FFA0 Other_Default_Ignorable_Code_Point
+FFF0 FFF8 Other_Default_Ignorable_Code_Point
+E0000 Other_Default_Ignorable_Code_Point
+E0002 E001F Other_Default_Ignorable_Code_Point
+E0080 E00FF Other_Default_Ignorable_Code_Point
+E01F0 E0FFF Other_Default_Ignorable_Code_Point
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherGra.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherGra.pl
new file mode 100755
index 00000000000..cc1048839ca
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherGra.pl
@@ -0,0 +1,32 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{OtherGraphemeExtend} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Other_Grapheme_Extend'
+#
+return <<'END';
+09BE Other_Grapheme_Extend
+09D7 Other_Grapheme_Extend
+0B3E Other_Grapheme_Extend
+0B57 Other_Grapheme_Extend
+0BBE Other_Grapheme_Extend
+0BD7 Other_Grapheme_Extend
+0CC2 Other_Grapheme_Extend
+0CD5 0CD6 Other_Grapheme_Extend
+0D3E Other_Grapheme_Extend
+0D57 Other_Grapheme_Extend
+0DCF Other_Grapheme_Extend
+0DDF Other_Grapheme_Extend
+200C 200D Other_Grapheme_Extend
+FF9E FF9F Other_Grapheme_Extend
+1D165 Other_Grapheme_Extend
+1D16E 1D172 Other_Grapheme_Extend
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherIdC.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherIdC.pl
new file mode 100755
index 00000000000..39fa50aa0ad
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherIdC.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{OtherIdContinue} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Other_ID_Continue'
+#
+return <<'END';
+00B7 Other_ID_Continue
+0387 Other_ID_Continue
+1369 1371 Other_ID_Continue
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherIdS.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherIdS.pl
new file mode 100755
index 00000000000..1cd40ab8406
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherIdS.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{OtherIdStart} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Other_ID_Start'
+#
+return <<'END';
+2118 Other_ID_Start
+212E Other_ID_Start
+309B 309C Other_ID_Start
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherLow.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherLow.pl
new file mode 100755
index 00000000000..6a8d95591e7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherLow.pl
@@ -0,0 +1,29 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{OtherLowercase} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Other_Lowercase'
+#
+return <<'END';
+02B0 02B8 Other_Lowercase
+02C0 02C1 Other_Lowercase
+02E0 02E4 Other_Lowercase
+0345 Other_Lowercase
+037A Other_Lowercase
+1D2C 1D61 Other_Lowercase
+1D78 Other_Lowercase
+1D9B 1DBF Other_Lowercase
+2090 2094 Other_Lowercase
+2170 217F Other_Lowercase
+24D0 24E9 Other_Lowercase
+2C7D Other_Lowercase
+A770 Other_Lowercase
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherMat.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherMat.pl
new file mode 100755
index 00000000000..d3936cfc012
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherMat.pl
@@ -0,0 +1,115 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{OtherMath} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Other_Math'
+#
+return <<'END';
+005E Other_Math
+03D0 03D2 Other_Math
+03D5 Other_Math
+03F0 03F1 Other_Math
+03F4 03F5 Other_Math
+2016 Other_Math
+2032 2034 Other_Math
+2040 Other_Math
+2061 2064 Other_Math
+207D 207E Other_Math
+208D 208E Other_Math
+20D0 20DC Other_Math
+20E1 Other_Math
+20E5 20E6 Other_Math
+20EB 20EF Other_Math
+2102 Other_Math
+210A 2113 Other_Math
+2115 Other_Math
+2119 211D Other_Math
+2124 Other_Math
+2128 2129 Other_Math
+212C 212D Other_Math
+212F 2131 Other_Math
+2133 2138 Other_Math
+213C 213F Other_Math
+2145 2149 Other_Math
+2195 2199 Other_Math
+219C 219F Other_Math
+21A1 21A2 Other_Math
+21A4 21A5 Other_Math
+21A7 Other_Math
+21A9 21AD Other_Math
+21B0 21B1 Other_Math
+21B6 21B7 Other_Math
+21BC 21CD Other_Math
+21D0 21D1 Other_Math
+21D3 Other_Math
+21D5 21DB Other_Math
+21DD Other_Math
+21E4 21E5 Other_Math
+23B4 23B5 Other_Math
+23B7 Other_Math
+23D0 Other_Math
+23E2 Other_Math
+25A0 25A1 Other_Math
+25AE 25B6 Other_Math
+25BC 25C0 Other_Math
+25C6 25C7 Other_Math
+25CA 25CB Other_Math
+25CF 25D3 Other_Math
+25E2 Other_Math
+25E4 Other_Math
+25E7 25EC Other_Math
+2605 2606 Other_Math
+2640 Other_Math
+2642 Other_Math
+2660 2663 Other_Math
+266D 266E Other_Math
+27C5 27C6 Other_Math
+27E6 27EF Other_Math
+2983 2998 Other_Math
+29D8 29DB Other_Math
+29FC 29FD Other_Math
+FE61 Other_Math
+FE63 Other_Math
+FE68 Other_Math
+FF3C Other_Math
+FF3E Other_Math
+1D400 1D454 Other_Math
+1D456 1D49C Other_Math
+1D49E 1D49F Other_Math
+1D4A2 Other_Math
+1D4A5 1D4A6 Other_Math
+1D4A9 1D4AC Other_Math
+1D4AE 1D4B9 Other_Math
+1D4BB Other_Math
+1D4BD 1D4C3 Other_Math
+1D4C5 1D505 Other_Math
+1D507 1D50A Other_Math
+1D50D 1D514 Other_Math
+1D516 1D51C Other_Math
+1D51E 1D539 Other_Math
+1D53B 1D53E Other_Math
+1D540 1D544 Other_Math
+1D546 Other_Math
+1D54A 1D550 Other_Math
+1D552 1D6A5 Other_Math
+1D6A8 1D6C0 Other_Math
+1D6C2 1D6DA Other_Math
+1D6DC 1D6FA Other_Math
+1D6FC 1D714 Other_Math
+1D716 1D734 Other_Math
+1D736 1D74E Other_Math
+1D750 1D76E Other_Math
+1D770 1D788 Other_Math
+1D78A 1D7A8 Other_Math
+1D7AA 1D7C2 Other_Math
+1D7C4 1D7CB Other_Math
+1D7CE 1D7FF Other_Math
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherUpp.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherUpp.pl
new file mode 100755
index 00000000000..fac06b24527
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/OtherUpp.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{OtherUppercase} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Other_Uppercase'
+#
+return <<'END';
+2160 216F Other_Uppercase
+24B6 24CF Other_Uppercase
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/P.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/P.pl
new file mode 100755
index 00000000000..0f35b51c94e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/P.pl
@@ -0,0 +1,129 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{P}
+# \p{P} (and fuzzy permutations)
+#
+# Meaning: Major Category 'P'
+#
+return <<'END';
+0021 0023
+0025 002A
+002C 002F
+003A 003B
+003F 0040
+005B 005D
+005F
+007B
+007D
+00A1
+00AB
+00B7
+00BB
+00BF
+037E
+0387
+055A 055F
+0589 058A
+05BE
+05C0
+05C3
+05C6
+05F3 05F4
+0609 060A
+060C 060D
+061B
+061E 061F
+066A 066D
+06D4
+0700 070D
+07F7 07F9
+0964 0965
+0970
+0DF4
+0E4F
+0E5A 0E5B
+0F04 0F12
+0F3A 0F3D
+0F85
+0FD0 0FD4
+104A 104F
+10FB
+1361 1368
+166D 166E
+169B 169C
+16EB 16ED
+1735 1736
+17D4 17D6
+17D8 17DA
+1800 180A
+1944 1945
+19DE 19DF
+1A1E 1A1F
+1B5A 1B60
+1C3B 1C3F
+1C7E 1C7F
+2010 2027
+2030 2043
+2045 2051
+2053 205E
+207D 207E
+208D 208E
+2329 232A
+2768 2775
+27C5 27C6
+27E6 27EF
+2983 2998
+29D8 29DB
+29FC 29FD
+2CF9 2CFC
+2CFE 2CFF
+2E00 2E2E
+2E30
+3001 3003
+3008 3011
+3014 301F
+3030
+303D
+30A0
+30FB
+A60D A60F
+A673
+A67E
+A874 A877
+A8CE A8CF
+A92E A92F
+A95F
+AA5C AA5F
+FD3E FD3F
+FE10 FE19
+FE30 FE52
+FE54 FE61
+FE63
+FE68
+FE6A FE6B
+FF01 FF03
+FF05 FF0A
+FF0C FF0F
+FF1A FF1B
+FF1F FF20
+FF3B FF3D
+FF3F
+FF5B
+FF5D
+FF5F FF65
+10100 10101
+1039F
+103D0
+1091F
+1093F
+10A50 10A58
+12470 12473
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatSyn.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatSyn.pl
new file mode 100755
index 00000000000..23cd998d8b7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatSyn.pl
@@ -0,0 +1,41 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Pattern_Syntax'
+#
+return <<'END';
+0021 002F Pattern_Syntax
+003A 0040 Pattern_Syntax
+005B 005E Pattern_Syntax
+0060 Pattern_Syntax
+007B 007E Pattern_Syntax
+00A1 00A7 Pattern_Syntax
+00A9 Pattern_Syntax
+00AB 00AC Pattern_Syntax
+00AE Pattern_Syntax
+00B0 00B1 Pattern_Syntax
+00B6 Pattern_Syntax
+00BB Pattern_Syntax
+00BF Pattern_Syntax
+00D7 Pattern_Syntax
+00F7 Pattern_Syntax
+2010 2027 Pattern_Syntax
+2030 203E Pattern_Syntax
+2041 2053 Pattern_Syntax
+2055 205E Pattern_Syntax
+2190 245F Pattern_Syntax
+2500 2775 Pattern_Syntax
+2794 2BFF Pattern_Syntax
+2E00 2E7F Pattern_Syntax
+3001 3003 Pattern_Syntax
+3008 3020 Pattern_Syntax
+3030 Pattern_Syntax
+FD3E FD3F Pattern_Syntax
+FE45 FE46 Pattern_Syntax
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatWS.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatWS.pl
new file mode 100755
index 00000000000..aef8c27cf91
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatWS.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Pattern_White_Space'
+#
+return <<'END';
+0009 000D Pattern_White_Space
+0020 Pattern_White_Space
+0085 Pattern_White_Space
+200E 200F Pattern_White_Space
+2028 2029 Pattern_White_Space
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatternS.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatternS.pl
new file mode 100755
index 00000000000..3c20f86f8b0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatternS.pl
@@ -0,0 +1,44 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PatternSyntax} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Pattern_Syntax'
+#
+return <<'END';
+0021 002F Pattern_Syntax
+003A 0040 Pattern_Syntax
+005B 005E Pattern_Syntax
+0060 Pattern_Syntax
+007B 007E Pattern_Syntax
+00A1 00A7 Pattern_Syntax
+00A9 Pattern_Syntax
+00AB 00AC Pattern_Syntax
+00AE Pattern_Syntax
+00B0 00B1 Pattern_Syntax
+00B6 Pattern_Syntax
+00BB Pattern_Syntax
+00BF Pattern_Syntax
+00D7 Pattern_Syntax
+00F7 Pattern_Syntax
+2010 2027 Pattern_Syntax
+2030 203E Pattern_Syntax
+2041 2053 Pattern_Syntax
+2055 205E Pattern_Syntax
+2190 245F Pattern_Syntax
+2500 2775 Pattern_Syntax
+2794 2BFF Pattern_Syntax
+2E00 2E7F Pattern_Syntax
+3001 3003 Pattern_Syntax
+3008 3020 Pattern_Syntax
+3030 Pattern_Syntax
+FD3E FD3F Pattern_Syntax
+FE45 FE46 Pattern_Syntax
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatternW.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatternW.pl
new file mode 100755
index 00000000000..ff038d6ae74
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PatternW.pl
@@ -0,0 +1,21 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PatternWhiteSpace} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Pattern_White_Space'
+#
+return <<'END';
+0009 000D Pattern_White_Space
+0020 Pattern_White_Space
+0085 Pattern_White_Space
+200E 200F Pattern_White_Space
+2028 2029 Pattern_White_Space
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pc.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pc.pl
new file mode 100755
index 00000000000..efd94abe880
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pc.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Pc}
+# \p{Pc} (and fuzzy permutations)
+#
+# Meaning: General Category 'Pc'
+#
+return <<'END';
+005F
+203F 2040
+2054
+FE33 FE34
+FE4D FE4F
+FF3F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pd.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pd.pl
new file mode 100755
index 00000000000..6526cb11a1f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pd.pl
@@ -0,0 +1,31 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Pd}
+# \p{Pd} (and fuzzy permutations)
+#
+# Meaning: General Category 'Pd'
+#
+return <<'END';
+002D
+058A
+05BE
+1806
+2010 2015
+2E17
+2E1A
+301C
+3030
+30A0
+FE31 FE32
+FE58
+FE63
+FF0D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pe.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pe.pl
new file mode 100755
index 00000000000..39e95836685
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pe.pl
@@ -0,0 +1,87 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Pe}
+# \p{Pe} (and fuzzy permutations)
+#
+# Meaning: General Category 'Pe'
+#
+return <<'END';
+0029
+005D
+007D
+0F3B
+0F3D
+169C
+2046
+207E
+208E
+232A
+2769
+276B
+276D
+276F
+2771
+2773
+2775
+27C6
+27E7
+27E9
+27EB
+27ED
+27EF
+2984
+2986
+2988
+298A
+298C
+298E
+2990
+2992
+2994
+2996
+2998
+29D9
+29DB
+29FD
+2E23
+2E25
+2E27
+2E29
+3009
+300B
+300D
+300F
+3011
+3015
+3017
+3019
+301B
+301E 301F
+FD3F
+FE18
+FE36
+FE38
+FE3A
+FE3C
+FE3E
+FE40
+FE42
+FE44
+FE48
+FE5A
+FE5C
+FE5E
+FF09
+FF3D
+FF5D
+FF60
+FF63
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PerlSpac.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PerlSpac.pl
new file mode 100755
index 00000000000..d4b72d27dec
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PerlSpac.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PerlSpace}
+#
+return <<'END';
+0009 000A
+000C 000D
+0020
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PerlWord.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PerlWord.pl
new file mode 100755
index 00000000000..9de127f0298
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PerlWord.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PerlWord}
+#
+return <<'END';
+0030 0039
+0041 005A
+005F
+0061 007A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pf.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pf.pl
new file mode 100755
index 00000000000..05892c209f2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pf.pl
@@ -0,0 +1,27 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Pf}
+# \p{Pf} (and fuzzy permutations)
+#
+# Meaning: General Category 'Pf'
+#
+return <<'END';
+00BB
+2019
+201D
+203A
+2E03
+2E05
+2E0A
+2E0D
+2E1D
+2E21
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PhagsPa.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PhagsPa.pl
new file mode 100755
index 00000000000..ec1d84d8345
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PhagsPa.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PhagsPa} (and fuzzy permutations)
+#
+# Meaning: Script 'Phags_Pa'
+#
+return <<'END';
+A840 A877 Phags_Pa
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Phnx.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Phnx.pl
new file mode 100755
index 00000000000..40667bd46c2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Phnx.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Phoenician} (and fuzzy permutations)
+#
+# Meaning: Script 'Phoenician'
+#
+return <<'END';
+10900 10919 Phoenician
+1091F Phoenician
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pi.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pi.pl
new file mode 100755
index 00000000000..009b0ba2c70
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Pi.pl
@@ -0,0 +1,28 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Pi}
+# \p{Pi} (and fuzzy permutations)
+#
+# Meaning: General Category 'Pi'
+#
+return <<'END';
+00AB
+2018
+201B 201C
+201F
+2039
+2E02
+2E04
+2E09
+2E0C
+2E1C
+2E20
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Po.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Po.pl
new file mode 100755
index 00000000000..d97d5acdb80
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Po.pl
@@ -0,0 +1,125 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Po}
+# \p{Po} (and fuzzy permutations)
+#
+# Meaning: General Category 'Po'
+#
+return <<'END';
+0021 0023
+0025 0027
+002A
+002C
+002E 002F
+003A 003B
+003F 0040
+005C
+00A1
+00B7
+00BF
+037E
+0387
+055A 055F
+0589
+05C0
+05C3
+05C6
+05F3 05F4
+0609 060A
+060C 060D
+061B
+061E 061F
+066A 066D
+06D4
+0700 070D
+07F7 07F9
+0964 0965
+0970
+0DF4
+0E4F
+0E5A 0E5B
+0F04 0F12
+0F85
+0FD0 0FD4
+104A 104F
+10FB
+1361 1368
+166D 166E
+16EB 16ED
+1735 1736
+17D4 17D6
+17D8 17DA
+1800 1805
+1807 180A
+1944 1945
+19DE 19DF
+1A1E 1A1F
+1B5A 1B60
+1C3B 1C3F
+1C7E 1C7F
+2016 2017
+2020 2027
+2030 2038
+203B 203E
+2041 2043
+2047 2051
+2053
+2055 205E
+2CF9 2CFC
+2CFE 2CFF
+2E00 2E01
+2E06 2E08
+2E0B
+2E0E 2E16
+2E18 2E19
+2E1B
+2E1E 2E1F
+2E2A 2E2E
+2E30
+3001 3003
+303D
+30FB
+A60D A60F
+A673
+A67E
+A874 A877
+A8CE A8CF
+A92E A92F
+A95F
+AA5C AA5F
+FE10 FE16
+FE19
+FE30
+FE45 FE46
+FE49 FE4C
+FE50 FE52
+FE54 FE57
+FE5F FE61
+FE68
+FE6A FE6B
+FF01 FF03
+FF05 FF07
+FF0A
+FF0C
+FF0E FF0F
+FF1A FF1B
+FF1F FF20
+FF3C
+FF61
+FF64 FF65
+10100 10101
+1039F
+103D0
+1091F
+1093F
+10A50 10A58
+12470 12473
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixAln.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixAln.pl
new file mode 100755
index 00000000000..919de4c8558
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixAln.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PosixAlnum}
+#
+return <<'END';
+0030 0039
+0041 005A
+0061 007A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixAlp.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixAlp.pl
new file mode 100755
index 00000000000..529ec7cff59
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixAlp.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PosixAlpha}
+#
+return <<'END';
+0041 005A
+0061 007A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixBla.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixBla.pl
new file mode 100755
index 00000000000..6d506a2ec93
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixBla.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PosixBlank}
+#
+return <<'END';
+0009
+0020
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixCnt.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixCnt.pl
new file mode 100755
index 00000000000..a1061d971d2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixCnt.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PosixCntrl}
+#
+return <<'END';
+0000 001F
+007F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixDig.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixDig.pl
new file mode 100755
index 00000000000..64bbd9aea52
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixDig.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PosixDigit}
+#
+return <<'END';
+0030 0039
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixGra.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixGra.pl
new file mode 100755
index 00000000000..2505c79349f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixGra.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PosixGraph}
+#
+return <<'END';
+0021 007E
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixLow.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixLow.pl
new file mode 100755
index 00000000000..7e5104b6883
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixLow.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PosixLower}
+#
+return <<'END';
+0061 007A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixPri.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixPri.pl
new file mode 100755
index 00000000000..69c43bbaae3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixPri.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PosixPrint}
+#
+return <<'END';
+0020 007E
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixPun.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixPun.pl
new file mode 100755
index 00000000000..cf7fc9c686a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixPun.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PosixPunct}
+#
+return <<'END';
+0021 002F
+003A 0040
+005B 0060
+007B 007E
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixSpa.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixSpa.pl
new file mode 100755
index 00000000000..b4323543350
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixSpa.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PosixSpace}
+#
+return <<'END';
+0009 000D
+0020
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixUpp.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixUpp.pl
new file mode 100755
index 00000000000..703e1e0bec0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/PosixUpp.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{PosixUpper}
+#
+return <<'END';
+0041 005A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Print.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Print.pl
new file mode 100755
index 00000000000..86eaa6283bc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Print.pl
@@ -0,0 +1,464 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Print}
+#
+# Meaning: [[:Print:]]
+#
+return <<'END';
+0009 000D
+0020 007E
+0085
+00A0 0377
+037A 037E
+0384 038A
+038C
+038E 03A1
+03A3 0523
+0531 0556
+0559 055F
+0561 0587
+0589 058A
+0591 05C7
+05D0 05EA
+05F0 05F4
+0600 0603
+0606 061B
+061E 061F
+0621 065E
+0660 070D
+070F 074A
+074D 07B1
+07C0 07FA
+0901 0939
+093C 094D
+0950 0954
+0958 0972
+097B 097F
+0981 0983
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BC 09C4
+09C7 09C8
+09CB 09CE
+09D7
+09DC 09DD
+09DF 09E3
+09E6 09FA
+0A01 0A03
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A3C
+0A3E 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A59 0A5C
+0A5E
+0A66 0A75
+0A81 0A83
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABC 0AC5
+0AC7 0AC9
+0ACB 0ACD
+0AD0
+0AE0 0AE3
+0AE6 0AEF
+0AF1
+0B01 0B03
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3C 0B44
+0B47 0B48
+0B4B 0B4D
+0B56 0B57
+0B5C 0B5D
+0B5F 0B63
+0B66 0B71
+0B82 0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BBE 0BC2
+0BC6 0BC8
+0BCA 0BCD
+0BD0
+0BD7
+0BE6 0BFA
+0C01 0C03
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D 0C44
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C58 0C59
+0C60 0C63
+0C66 0C6F
+0C78 0C7F
+0C82 0C83
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBC 0CC4
+0CC6 0CC8
+0CCA 0CCD
+0CD5 0CD6
+0CDE
+0CE0 0CE3
+0CE6 0CEF
+0CF1 0CF2
+0D02 0D03
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D 0D44
+0D46 0D48
+0D4A 0D4D
+0D57
+0D60 0D63
+0D66 0D75
+0D79 0D7F
+0D82 0D83
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0DCA
+0DCF 0DD4
+0DD6
+0DD8 0DDF
+0DF2 0DF4
+0E01 0E3A
+0E3F 0E5B
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB9
+0EBB 0EBD
+0EC0 0EC4
+0EC6
+0EC8 0ECD
+0ED0 0ED9
+0EDC 0EDD
+0F00 0F47
+0F49 0F6C
+0F71 0F8B
+0F90 0F97
+0F99 0FBC
+0FBE 0FCC
+0FCE 0FD4
+1000 1099
+109E 10C5
+10D0 10FC
+1100 1159
+115F 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+135F 137C
+1380 1399
+13A0 13F4
+1401 1676
+1680 169C
+16A0 16F0
+1700 170C
+170E 1714
+1720 1736
+1740 1753
+1760 176C
+176E 1770
+1772 1773
+1780 17DD
+17E0 17E9
+17F0 17F9
+1800 180E
+1810 1819
+1820 1877
+1880 18AA
+1900 191C
+1920 192B
+1930 193B
+1940
+1944 196D
+1970 1974
+1980 19A9
+19B0 19C9
+19D0 19D9
+19DE 1A1B
+1A1E 1A1F
+1B00 1B4B
+1B50 1B7C
+1B80 1BAA
+1BAE 1BB9
+1C00 1C37
+1C3B 1C49
+1C4D 1C7F
+1D00 1DE6
+1DFE 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FC4
+1FC6 1FD3
+1FD6 1FDB
+1FDD 1FEF
+1FF2 1FF4
+1FF6 1FFE
+2000 2064
+206A 2071
+2074 208E
+2090 2094
+20A0 20B5
+20D0 20F0
+2100 214F
+2153 2188
+2190 23E7
+2400 2426
+2440 244A
+2460 269D
+26A0 26BC
+26C0 26C3
+2701 2704
+2706 2709
+270C 2727
+2729 274B
+274D
+274F 2752
+2756
+2758 275E
+2761 2794
+2798 27AF
+27B1 27BE
+27C0 27CA
+27CC
+27D0 2B4C
+2B50 2B54
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CEA
+2CF9 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+2DE0 2E30
+2E80 2E99
+2E9B 2EF3
+2F00 2FD5
+2FF0 2FFB
+3000 303F
+3041 3096
+3099 30FF
+3105 312D
+3131 318E
+3190 31B7
+31C0 31E3
+31F0 321E
+3220 3243
+3250 32FE
+3300 4DB5
+4DC0 9FC3
+A000 A48C
+A490 A4C6
+A500 A62B
+A640 A65F
+A662 A673
+A67C A697
+A700 A78C
+A7FB A82B
+A840 A877
+A880 A8C4
+A8CE A8D9
+A900 A953
+A95F
+AA00 AA36
+AA40 AA4D
+AA50 AA59
+AA5C AA5F
+AC00 D7A3
+E000 FA2D
+FA30 FA6A
+FA70 FAD9
+FB00 FB06
+FB13 FB17
+FB1D FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3F
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFD
+FE00 FE19
+FE20 FE26
+FE30 FE52
+FE54 FE66
+FE68 FE6B
+FE70 FE74
+FE76 FEFC
+FEFF
+FF01 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+FFE0 FFE6
+FFE8 FFEE
+FFF9 FFFD
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10100 10102
+10107 10133
+10137 1018A
+10190 1019B
+101D0 101FD
+10280 1029C
+102A0 102D0
+10300 1031E
+10320 10323
+10330 1034A
+10380 1039D
+1039F 103C3
+103C8 103D5
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10919
+1091F 10939
+1093F
+10A00 10A03
+10A05 10A06
+10A0C 10A13
+10A15 10A17
+10A19 10A33
+10A38 10A3A
+10A3F 10A47
+10A50 10A58
+12000 1236E
+12400 12462
+12470 12473
+1D000 1D0F5
+1D100 1D126
+1D129 1D1DD
+1D200 1D245
+1D300 1D356
+1D360 1D371
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D7CB
+1D7CE 1D7FF
+1F000 1F02B
+1F030 1F093
+20000 2A6D6
+2F800 2FA1D
+E0001
+E0020 E007F
+E0100 E01EF
+F0000 FFFFD
+100000 10FFFD
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ps.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ps.pl
new file mode 100755
index 00000000000..1c5f9299838
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ps.pl
@@ -0,0 +1,89 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Ps}
+# \p{Ps} (and fuzzy permutations)
+#
+# Meaning: General Category 'Ps'
+#
+return <<'END';
+0028
+005B
+007B
+0F3A
+0F3C
+169B
+201A
+201E
+2045
+207D
+208D
+2329
+2768
+276A
+276C
+276E
+2770
+2772
+2774
+27C5
+27E6
+27E8
+27EA
+27EC
+27EE
+2983
+2985
+2987
+2989
+298B
+298D
+298F
+2991
+2993
+2995
+2997
+29D8
+29DA
+29FC
+2E22
+2E24
+2E26
+2E28
+3008
+300A
+300C
+300E
+3010
+3014
+3016
+3018
+301A
+301D
+FD3E
+FE17
+FE35
+FE37
+FE39
+FE3B
+FE3D
+FE3F
+FE41
+FE43
+FE47
+FE59
+FE5B
+FE5D
+FF08
+FF3B
+FF5B
+FF5F
+FF62
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Punct.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Punct.pl
new file mode 100755
index 00000000000..525108a56ed
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Punct.pl
@@ -0,0 +1,128 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Punct}
+#
+# Meaning: [[:Punct:]]
+#
+return <<'END';
+0021 0023
+0025 002A
+002C 002F
+003A 003B
+003F 0040
+005B 005D
+005F
+007B
+007D
+00A1
+00AB
+00B7
+00BB
+00BF
+037E
+0387
+055A 055F
+0589 058A
+05BE
+05C0
+05C3
+05C6
+05F3 05F4
+0609 060A
+060C 060D
+061B
+061E 061F
+066A 066D
+06D4
+0700 070D
+07F7 07F9
+0964 0965
+0970
+0DF4
+0E4F
+0E5A 0E5B
+0F04 0F12
+0F3A 0F3D
+0F85
+0FD0 0FD4
+104A 104F
+10FB
+1361 1368
+166D 166E
+169B 169C
+16EB 16ED
+1735 1736
+17D4 17D6
+17D8 17DA
+1800 180A
+1944 1945
+19DE 19DF
+1A1E 1A1F
+1B5A 1B60
+1C3B 1C3F
+1C7E 1C7F
+2010 2027
+2030 2043
+2045 2051
+2053 205E
+207D 207E
+208D 208E
+2329 232A
+2768 2775
+27C5 27C6
+27E6 27EF
+2983 2998
+29D8 29DB
+29FC 29FD
+2CF9 2CFC
+2CFE 2CFF
+2E00 2E2E
+2E30
+3001 3003
+3008 3011
+3014 301F
+3030
+303D
+30A0
+30FB
+A60D A60F
+A673
+A67E
+A874 A877
+A8CE A8CF
+A92E A92F
+A95F
+AA5C AA5F
+FD3E FD3F
+FE10 FE19
+FE30 FE52
+FE54 FE61
+FE63
+FE68
+FE6A FE6B
+FF01 FF03
+FF05 FF0A
+FF0C FF0F
+FF1A FF1B
+FF1F FF20
+FF3B FF3D
+FF3F
+FF5B
+FF5D
+FF5F FF65
+10100 10101
+1039F
+103D0
+1091F
+1093F
+10A50 10A58
+12470 12473
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/QMark.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/QMark.pl
new file mode 100755
index 00000000000..fa5c8ea19f2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/QMark.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Quotation_Mark'
+#
+return <<'END';
+0022 Quotation_Mark
+0027 Quotation_Mark
+00AB Quotation_Mark
+00BB Quotation_Mark
+2018 201F Quotation_Mark
+2039 203A Quotation_Mark
+300C 300F Quotation_Mark
+301D 301F Quotation_Mark
+FE41 FE44 Quotation_Mark
+FF02 Quotation_Mark
+FF07 Quotation_Mark
+FF62 FF63 Quotation_Mark
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Qaai.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Qaai.pl
new file mode 100755
index 00000000000..10700dcc7e2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Qaai.pl
@@ -0,0 +1,34 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Inherited} (and fuzzy permutations)
+#
+# Meaning: Script 'Inherited'
+#
+return <<'END';
+0300 036F Inherited
+064B 0655 Inherited
+0670 Inherited
+0951 0952 Inherited
+1DC0 1DE6 Inherited
+1DFE 1DFF Inherited
+200C 200D Inherited
+20D0 20F0 Inherited
+302A 302F Inherited
+3099 309A Inherited
+FE00 FE0F Inherited
+FE20 FE26 Inherited
+101FD Inherited
+1D167 1D169 Inherited
+1D17B 1D182 Inherited
+1D185 1D18B Inherited
+1D1AA 1D1AD Inherited
+E0100 E01EF Inherited
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Quotatio.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Quotatio.pl
new file mode 100755
index 00000000000..710601a7af9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Quotatio.pl
@@ -0,0 +1,28 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{QuotationMark} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Quotation_Mark'
+#
+return <<'END';
+0022 Quotation_Mark
+0027 Quotation_Mark
+00AB Quotation_Mark
+00BB Quotation_Mark
+2018 201F Quotation_Mark
+2039 203A Quotation_Mark
+300C 300F Quotation_Mark
+301D 301F Quotation_Mark
+FE41 FE44 Quotation_Mark
+FF02 Quotation_Mark
+FF07 Quotation_Mark
+FF62 FF63 Quotation_Mark
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Radical.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Radical.pl
new file mode 100755
index 00000000000..af30a8a4af4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Radical.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Radical'
+#
+return <<'END';
+2E80 2E99 Radical
+2E9B 2EF3 Radical
+2F00 2FD5 Radical
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Radical2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Radical2.pl
new file mode 100755
index 00000000000..64ebf0f2d8a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Radical2.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Radical} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Radical'
+#
+return <<'END';
+2E80 2E99 Radical
+2E9B 2EF3 Radical
+2F00 2FD5 Radical
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Rjng.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Rjng.pl
new file mode 100755
index 00000000000..0e787dddfb5
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Rjng.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Rejang} (and fuzzy permutations)
+#
+# Meaning: Script 'Rejang'
+#
+return <<'END';
+A930 A953 Rejang
+A95F Rejang
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Runr.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Runr.pl
new file mode 100755
index 00000000000..b9c54d3c7ab
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Runr.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Runic} (and fuzzy permutations)
+#
+# Meaning: Script 'Runic'
+#
+return <<'END';
+16A0 16EA Runic
+16EE 16F0 Runic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/S.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/S.pl
new file mode 100755
index 00000000000..181435b8d8e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/S.pl
@@ -0,0 +1,196 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{S}
+# \p{S} (and fuzzy permutations)
+#
+# Meaning: Major Category 'S'
+#
+return <<'END';
+0024
+002B
+003C 003E
+005E
+0060
+007C
+007E
+00A2 00A9
+00AC
+00AE 00B1
+00B4
+00B6
+00B8
+00D7
+00F7
+02C2 02C5
+02D2 02DF
+02E5 02EB
+02ED
+02EF 02FF
+0375
+0384 0385
+03F6
+0482
+0606 0608
+060B
+060E 060F
+06E9
+06FD 06FE
+07F6
+09F2 09F3
+09FA
+0AF1
+0B70
+0BF3 0BFA
+0C7F
+0CF1 0CF2
+0D79
+0E3F
+0F01 0F03
+0F13 0F17
+0F1A 0F1F
+0F34
+0F36
+0F38
+0FBE 0FC5
+0FC7 0FCC
+0FCE 0FCF
+109E 109F
+1360
+1390 1399
+17DB
+1940
+19E0 19FF
+1B61 1B6A
+1B74 1B7C
+1FBD
+1FBF 1FC1
+1FCD 1FCF
+1FDD 1FDF
+1FED 1FEF
+1FFD 1FFE
+2044
+2052
+207A 207C
+208A 208C
+20A0 20B5
+2100 2101
+2103 2106
+2108 2109
+2114
+2116 2118
+211E 2123
+2125
+2127
+2129
+212E
+213A 213B
+2140 2144
+214A 214D
+214F
+2190 2328
+232B 23E7
+2400 2426
+2440 244A
+249C 24E9
+2500 269D
+26A0 26BC
+26C0 26C3
+2701 2704
+2706 2709
+270C 2727
+2729 274B
+274D
+274F 2752
+2756
+2758 275E
+2761 2767
+2794
+2798 27AF
+27B1 27BE
+27C0 27C4
+27C7 27CA
+27CC
+27D0 27E5
+27F0 2982
+2999 29D7
+29DC 29FB
+29FE 2B4C
+2B50 2B54
+2CE5 2CEA
+2E80 2E99
+2E9B 2EF3
+2F00 2FD5
+2FF0 2FFB
+3004
+3012 3013
+3020
+3036 3037
+303E 303F
+309B 309C
+3190 3191
+3196 319F
+31C0 31E3
+3200 321E
+322A 3243
+3250
+3260 327F
+328A 32B0
+32C0 32FE
+3300 33FF
+4DC0 4DFF
+A490 A4C6
+A700 A716
+A720 A721
+A789 A78A
+A828 A82B
+FB29
+FDFC FDFD
+FE62
+FE64 FE66
+FE69
+FF04
+FF0B
+FF1C FF1E
+FF3E
+FF40
+FF5C
+FF5E
+FFE0 FFE6
+FFE8 FFEE
+FFFC FFFD
+10102
+10137 1013F
+10179 10189
+10190 1019B
+101D0 101FC
+1D000 1D0F5
+1D100 1D126
+1D129 1D164
+1D16A 1D16C
+1D183 1D184
+1D18C 1D1A9
+1D1AE 1D1DD
+1D200 1D241
+1D245
+1D300 1D356
+1D6C1
+1D6DB
+1D6FB
+1D715
+1D735
+1D74F
+1D76F
+1D789
+1D7A9
+1D7C3
+1F000 1F02B
+1F030 1F093
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SD.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SD.pl
new file mode 100755
index 00000000000..609278f5e0b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SD.pl
@@ -0,0 +1,44 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Soft_Dotted'
+#
+return <<'END';
+0069 006A Soft_Dotted
+012F Soft_Dotted
+0249 Soft_Dotted
+0268 Soft_Dotted
+029D Soft_Dotted
+02B2 Soft_Dotted
+03F3 Soft_Dotted
+0456 Soft_Dotted
+0458 Soft_Dotted
+1D62 Soft_Dotted
+1D96 Soft_Dotted
+1DA4 Soft_Dotted
+1DA8 Soft_Dotted
+1E2D Soft_Dotted
+1ECB Soft_Dotted
+2071 Soft_Dotted
+2148 2149 Soft_Dotted
+2C7C Soft_Dotted
+1D422 1D423 Soft_Dotted
+1D456 1D457 Soft_Dotted
+1D48A 1D48B Soft_Dotted
+1D4BE 1D4BF Soft_Dotted
+1D4F2 1D4F3 Soft_Dotted
+1D526 1D527 Soft_Dotted
+1D55A 1D55B Soft_Dotted
+1D58E 1D58F Soft_Dotted
+1D5C2 1D5C3 Soft_Dotted
+1D5F6 1D5F7 Soft_Dotted
+1D62A 1D62B Soft_Dotted
+1D65E 1D65F Soft_Dotted
+1D692 1D693 Soft_Dotted
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/STerm.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/STerm.pl
new file mode 100755
index 00000000000..57df6a21096
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/STerm.pl
@@ -0,0 +1,50 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'STerm'
+#
+return <<'END';
+0021 STerm
+002E STerm
+003F STerm
+055C STerm
+055E STerm
+0589 STerm
+061F STerm
+06D4 STerm
+0700 0702 STerm
+07F9 STerm
+0964 0965 STerm
+104A 104B STerm
+1362 STerm
+1367 1368 STerm
+166E STerm
+1803 STerm
+1809 STerm
+1944 1945 STerm
+1B5A 1B5B STerm
+1B5E 1B5F STerm
+1C3B 1C3C STerm
+1C7E 1C7F STerm
+203C 203D STerm
+2047 2049 STerm
+2E2E STerm
+3002 STerm
+A60E A60F STerm
+A876 A877 STerm
+A8CE A8CF STerm
+A92F STerm
+AA5D AA5F STerm
+FE52 STerm
+FE56 FE57 STerm
+FF01 STerm
+FF0E STerm
+FF1F STerm
+FF61 STerm
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Saur.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Saur.pl
new file mode 100755
index 00000000000..fc1a283b359
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Saur.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Saurashtra} (and fuzzy permutations)
+#
+# Meaning: Script 'Saurashtra'
+#
+return <<'END';
+A880 A8C4 Saurashtra
+A8CE A8D9 Saurashtra
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sc.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sc.pl
new file mode 100755
index 00000000000..f3a15489fa9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sc.pl
@@ -0,0 +1,31 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Sc}
+# \p{Sc} (and fuzzy permutations)
+#
+# Meaning: General Category 'Sc'
+#
+return <<'END';
+0024
+00A2 00A5
+060B
+09F2 09F3
+0AF1
+0BF9
+0E3F
+17DB
+20A0 20B5
+FDFC
+FE69
+FF04
+FFE0 FFE1
+FFE5 FFE6
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Shaw.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Shaw.pl
new file mode 100755
index 00000000000..60b02c171e8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Shaw.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Shavian} (and fuzzy permutations)
+#
+# Meaning: Script 'Shavian'
+#
+return <<'END';
+10450 1047F Shavian
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sinh.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sinh.pl
new file mode 100755
index 00000000000..8691cd18a5c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sinh.pl
@@ -0,0 +1,27 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Sinhala} (and fuzzy permutations)
+#
+# Meaning: Script 'Sinhala'
+#
+return <<'END';
+0D82 0D83 Sinhala
+0D85 0D96 Sinhala
+0D9A 0DB1 Sinhala
+0DB3 0DBB Sinhala
+0DBD Sinhala
+0DC0 0DC6 Sinhala
+0DCA Sinhala
+0DCF 0DD4 Sinhala
+0DD6 Sinhala
+0DD8 0DDF Sinhala
+0DF2 0DF4 Sinhala
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sk.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sk.pl
new file mode 100755
index 00000000000..5abc4ce2430
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sk.pl
@@ -0,0 +1,43 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Sk}
+# \p{Sk} (and fuzzy permutations)
+#
+# Meaning: General Category 'Sk'
+#
+return <<'END';
+005E
+0060
+00A8
+00AF
+00B4
+00B8
+02C2 02C5
+02D2 02DF
+02E5 02EB
+02ED
+02EF 02FF
+0375
+0384 0385
+1FBD
+1FBF 1FC1
+1FCD 1FCF
+1FDD 1FDF
+1FED 1FEF
+1FFD 1FFE
+309B 309C
+A700 A716
+A720 A721
+A789 A78A
+FF3E
+FF40
+FFE3
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sm.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sm.pl
new file mode 100755
index 00000000000..e63a41ba331
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sm.pl
@@ -0,0 +1,82 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Sm}
+# \p{Sm} (and fuzzy permutations)
+#
+# Meaning: General Category 'Sm'
+#
+return <<'END';
+002B
+003C 003E
+007C
+007E
+00AC
+00B1
+00D7
+00F7
+03F6
+0606 0608
+2044
+2052
+207A 207C
+208A 208C
+2140 2144
+214B
+2190 2194
+219A 219B
+21A0
+21A3
+21A6
+21AE
+21CE 21CF
+21D2
+21D4
+21F4 22FF
+2308 230B
+2320 2321
+237C
+239B 23B3
+23DC 23E1
+25B7
+25C1
+25F8 25FF
+266F
+27C0 27C4
+27C7 27CA
+27CC
+27D0 27E5
+27F0 27FF
+2900 2982
+2999 29D7
+29DC 29FB
+29FE 2AFF
+2B30 2B44
+2B47 2B4C
+FB29
+FE62
+FE64 FE66
+FF0B
+FF1C FF1E
+FF5C
+FF5E
+FFE2
+FFE9 FFEC
+1D6C1
+1D6DB
+1D6FB
+1D715
+1D735
+1D74F
+1D76F
+1D789
+1D7A9
+1D7C3
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/So.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/So.pl
new file mode 100755
index 00000000000..08391d6f571
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/So.pl
@@ -0,0 +1,151 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{So}
+# \p{So} (and fuzzy permutations)
+#
+# Meaning: General Category 'So'
+#
+return <<'END';
+00A6 00A7
+00A9
+00AE
+00B0
+00B6
+0482
+060E 060F
+06E9
+06FD 06FE
+07F6
+09FA
+0B70
+0BF3 0BF8
+0BFA
+0C7F
+0CF1 0CF2
+0D79
+0F01 0F03
+0F13 0F17
+0F1A 0F1F
+0F34
+0F36
+0F38
+0FBE 0FC5
+0FC7 0FCC
+0FCE 0FCF
+109E 109F
+1360
+1390 1399
+1940
+19E0 19FF
+1B61 1B6A
+1B74 1B7C
+2100 2101
+2103 2106
+2108 2109
+2114
+2116 2118
+211E 2123
+2125
+2127
+2129
+212E
+213A 213B
+214A
+214C 214D
+214F
+2195 2199
+219C 219F
+21A1 21A2
+21A4 21A5
+21A7 21AD
+21AF 21CD
+21D0 21D1
+21D3
+21D5 21F3
+2300 2307
+230C 231F
+2322 2328
+232B 237B
+237D 239A
+23B4 23DB
+23E2 23E7
+2400 2426
+2440 244A
+249C 24E9
+2500 25B6
+25B8 25C0
+25C2 25F7
+2600 266E
+2670 269D
+26A0 26BC
+26C0 26C3
+2701 2704
+2706 2709
+270C 2727
+2729 274B
+274D
+274F 2752
+2756
+2758 275E
+2761 2767
+2794
+2798 27AF
+27B1 27BE
+2800 28FF
+2B00 2B2F
+2B45 2B46
+2B50 2B54
+2CE5 2CEA
+2E80 2E99
+2E9B 2EF3
+2F00 2FD5
+2FF0 2FFB
+3004
+3012 3013
+3020
+3036 3037
+303E 303F
+3190 3191
+3196 319F
+31C0 31E3
+3200 321E
+322A 3243
+3250
+3260 327F
+328A 32B0
+32C0 32FE
+3300 33FF
+4DC0 4DFF
+A490 A4C6
+A828 A82B
+FDFD
+FFE4
+FFE8
+FFED FFEE
+FFFC FFFD
+10102
+10137 1013F
+10179 10189
+10190 1019B
+101D0 101FC
+1D000 1D0F5
+1D100 1D126
+1D129 1D164
+1D16A 1D16C
+1D183 1D184
+1D18C 1D1A9
+1D1AE 1D1DD
+1D200 1D241
+1D245
+1D300 1D356
+1F000 1F02B
+1F030 1F093
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SoftDott.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SoftDott.pl
new file mode 100755
index 00000000000..48d09fe1ac0
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SoftDott.pl
@@ -0,0 +1,47 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{SoftDotted} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Soft_Dotted'
+#
+return <<'END';
+0069 006A Soft_Dotted
+012F Soft_Dotted
+0249 Soft_Dotted
+0268 Soft_Dotted
+029D Soft_Dotted
+02B2 Soft_Dotted
+03F3 Soft_Dotted
+0456 Soft_Dotted
+0458 Soft_Dotted
+1D62 Soft_Dotted
+1D96 Soft_Dotted
+1DA4 Soft_Dotted
+1DA8 Soft_Dotted
+1E2D Soft_Dotted
+1ECB Soft_Dotted
+2071 Soft_Dotted
+2148 2149 Soft_Dotted
+2C7C Soft_Dotted
+1D422 1D423 Soft_Dotted
+1D456 1D457 Soft_Dotted
+1D48A 1D48B Soft_Dotted
+1D4BE 1D4BF Soft_Dotted
+1D4F2 1D4F3 Soft_Dotted
+1D526 1D527 Soft_Dotted
+1D55A 1D55B Soft_Dotted
+1D58E 1D58F Soft_Dotted
+1D5C2 1D5C3 Soft_Dotted
+1D5F6 1D5F7 Soft_Dotted
+1D62A 1D62B Soft_Dotted
+1D65E 1D65F Soft_Dotted
+1D692 1D693 Soft_Dotted
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Space.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Space.pl
new file mode 100755
index 00000000000..a60b9640208
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Space.pl
@@ -0,0 +1,27 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Space}
+#
+# Meaning: [[:Space:]]
+#
+return <<'END';
+0009 000D
+0020
+0085
+00A0
+1680
+180E
+2000 200A
+2028 2029
+202F
+205F
+3000
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SpacePer.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SpacePer.pl
new file mode 100755
index 00000000000..c0dab29464b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SpacePer.pl
@@ -0,0 +1,28 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{SpacePerl}
+#
+# Meaning: \s
+#
+return <<'END';
+0009 000A
+000C 000D
+0020
+0085
+00A0
+1680
+180E
+2000 200A
+2028 2029
+202F
+205F
+3000
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sterm2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sterm2.pl
new file mode 100755
index 00000000000..4952042ab58
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sterm2.pl
@@ -0,0 +1,53 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Sterm} (and fuzzy permutations)
+#
+# Meaning: Extended property 'STerm'
+#
+return <<'END';
+0021 STerm
+002E STerm
+003F STerm
+055C STerm
+055E STerm
+0589 STerm
+061F STerm
+06D4 STerm
+0700 0702 STerm
+07F9 STerm
+0964 0965 STerm
+104A 104B STerm
+1362 STerm
+1367 1368 STerm
+166E STerm
+1803 STerm
+1809 STerm
+1944 1945 STerm
+1B5A 1B5B STerm
+1B5E 1B5F STerm
+1C3B 1C3C STerm
+1C7E 1C7F STerm
+203C 203D STerm
+2047 2049 STerm
+2E2E STerm
+3002 STerm
+A60E A60F STerm
+A876 A877 STerm
+A8CE A8CF STerm
+A92F STerm
+AA5D AA5F STerm
+FE52 STerm
+FE56 FE57 STerm
+FF01 STerm
+FF0E STerm
+FF1F STerm
+FF61 STerm
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sund.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sund.pl
new file mode 100755
index 00000000000..b903ced8b05
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Sund.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Sundanese} (and fuzzy permutations)
+#
+# Meaning: Script 'Sundanese'
+#
+return <<'END';
+1B80 1BAA Sundanese
+1BAE 1BB9 Sundanese
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SylotiNa.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SylotiNa.pl
new file mode 100755
index 00000000000..3e0573d8328
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/SylotiNa.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{SylotiNagri} (and fuzzy permutations)
+#
+# Meaning: Script 'Syloti_Nagri'
+#
+return <<'END';
+A800 A82B Syloti_Nagri
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Syrc.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Syrc.pl
new file mode 100755
index 00000000000..00e5924a773
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Syrc.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Syriac} (and fuzzy permutations)
+#
+# Meaning: Script 'Syriac'
+#
+return <<'END';
+0700 070D Syriac
+070F 074A Syriac
+074D 074F Syriac
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tagb.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tagb.pl
new file mode 100755
index 00000000000..071fbdec9d2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tagb.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Tagbanwa} (and fuzzy permutations)
+#
+# Meaning: Script 'Tagbanwa'
+#
+return <<'END';
+1760 176C Tagbanwa
+176E 1770 Tagbanwa
+1772 1773 Tagbanwa
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/TaiLe.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/TaiLe.pl
new file mode 100755
index 00000000000..1876660fcea
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/TaiLe.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{TaiLe} (and fuzzy permutations)
+#
+# Meaning: Script 'Tai_Le'
+#
+return <<'END';
+1950 196D Tai_Le
+1970 1974 Tai_Le
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Taml.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Taml.pl
new file mode 100755
index 00000000000..8d86e575a7e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Taml.pl
@@ -0,0 +1,32 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Tamil} (and fuzzy permutations)
+#
+# Meaning: Script 'Tamil'
+#
+return <<'END';
+0B82 0B83 Tamil
+0B85 0B8A Tamil
+0B8E 0B90 Tamil
+0B92 0B95 Tamil
+0B99 0B9A Tamil
+0B9C Tamil
+0B9E 0B9F Tamil
+0BA3 0BA4 Tamil
+0BA8 0BAA Tamil
+0BAE 0BB9 Tamil
+0BBE 0BC2 Tamil
+0BC6 0BC8 Tamil
+0BCA 0BCD Tamil
+0BD0 Tamil
+0BD7 Tamil
+0BE6 0BFA Tamil
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Telu.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Telu.pl
new file mode 100755
index 00000000000..d91946100e8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Telu.pl
@@ -0,0 +1,30 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Telugu} (and fuzzy permutations)
+#
+# Meaning: Script 'Telugu'
+#
+return <<'END';
+0C01 0C03 Telugu
+0C05 0C0C Telugu
+0C0E 0C10 Telugu
+0C12 0C28 Telugu
+0C2A 0C33 Telugu
+0C35 0C39 Telugu
+0C3D 0C44 Telugu
+0C46 0C48 Telugu
+0C4A 0C4D Telugu
+0C55 0C56 Telugu
+0C58 0C59 Telugu
+0C60 0C63 Telugu
+0C66 0C6F Telugu
+0C78 0C7F Telugu
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Term.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Term.pl
new file mode 100755
index 00000000000..a6d21735c3b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Term.pl
@@ -0,0 +1,68 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Terminal_Punctuation'
+#
+return <<'END';
+0021 Terminal_Punctuation
+002C Terminal_Punctuation
+002E Terminal_Punctuation
+003A 003B Terminal_Punctuation
+003F Terminal_Punctuation
+037E Terminal_Punctuation
+0387 Terminal_Punctuation
+0589 Terminal_Punctuation
+05C3 Terminal_Punctuation
+060C Terminal_Punctuation
+061B Terminal_Punctuation
+061F Terminal_Punctuation
+06D4 Terminal_Punctuation
+0700 070A Terminal_Punctuation
+070C Terminal_Punctuation
+07F8 07F9 Terminal_Punctuation
+0964 0965 Terminal_Punctuation
+0E5A 0E5B Terminal_Punctuation
+0F08 Terminal_Punctuation
+0F0D 0F12 Terminal_Punctuation
+104A 104B Terminal_Punctuation
+1361 1368 Terminal_Punctuation
+166D 166E Terminal_Punctuation
+16EB 16ED Terminal_Punctuation
+17D4 17D6 Terminal_Punctuation
+17DA Terminal_Punctuation
+1802 1805 Terminal_Punctuation
+1808 1809 Terminal_Punctuation
+1944 1945 Terminal_Punctuation
+1B5A 1B5B Terminal_Punctuation
+1B5D 1B5F Terminal_Punctuation
+1C3B 1C3F Terminal_Punctuation
+1C7E 1C7F Terminal_Punctuation
+203C 203D Terminal_Punctuation
+2047 2049 Terminal_Punctuation
+2E2E Terminal_Punctuation
+3001 3002 Terminal_Punctuation
+A60D A60F Terminal_Punctuation
+A876 A877 Terminal_Punctuation
+A8CE A8CF Terminal_Punctuation
+A92F Terminal_Punctuation
+AA5D AA5F Terminal_Punctuation
+FE50 FE52 Terminal_Punctuation
+FE54 FE57 Terminal_Punctuation
+FF01 Terminal_Punctuation
+FF0C Terminal_Punctuation
+FF0E Terminal_Punctuation
+FF1A FF1B Terminal_Punctuation
+FF1F Terminal_Punctuation
+FF61 Terminal_Punctuation
+FF64 Terminal_Punctuation
+1039F Terminal_Punctuation
+103D0 Terminal_Punctuation
+1091F Terminal_Punctuation
+12470 12473 Terminal_Punctuation
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Terminal.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Terminal.pl
new file mode 100755
index 00000000000..e58bc744d16
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Terminal.pl
@@ -0,0 +1,71 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{TerminalPunctuation} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Terminal_Punctuation'
+#
+return <<'END';
+0021 Terminal_Punctuation
+002C Terminal_Punctuation
+002E Terminal_Punctuation
+003A 003B Terminal_Punctuation
+003F Terminal_Punctuation
+037E Terminal_Punctuation
+0387 Terminal_Punctuation
+0589 Terminal_Punctuation
+05C3 Terminal_Punctuation
+060C Terminal_Punctuation
+061B Terminal_Punctuation
+061F Terminal_Punctuation
+06D4 Terminal_Punctuation
+0700 070A Terminal_Punctuation
+070C Terminal_Punctuation
+07F8 07F9 Terminal_Punctuation
+0964 0965 Terminal_Punctuation
+0E5A 0E5B Terminal_Punctuation
+0F08 Terminal_Punctuation
+0F0D 0F12 Terminal_Punctuation
+104A 104B Terminal_Punctuation
+1361 1368 Terminal_Punctuation
+166D 166E Terminal_Punctuation
+16EB 16ED Terminal_Punctuation
+17D4 17D6 Terminal_Punctuation
+17DA Terminal_Punctuation
+1802 1805 Terminal_Punctuation
+1808 1809 Terminal_Punctuation
+1944 1945 Terminal_Punctuation
+1B5A 1B5B Terminal_Punctuation
+1B5D 1B5F Terminal_Punctuation
+1C3B 1C3F Terminal_Punctuation
+1C7E 1C7F Terminal_Punctuation
+203C 203D Terminal_Punctuation
+2047 2049 Terminal_Punctuation
+2E2E Terminal_Punctuation
+3001 3002 Terminal_Punctuation
+A60D A60F Terminal_Punctuation
+A876 A877 Terminal_Punctuation
+A8CE A8CF Terminal_Punctuation
+A92F Terminal_Punctuation
+AA5D AA5F Terminal_Punctuation
+FE50 FE52 Terminal_Punctuation
+FE54 FE57 Terminal_Punctuation
+FF01 Terminal_Punctuation
+FF0C Terminal_Punctuation
+FF0E Terminal_Punctuation
+FF1A FF1B Terminal_Punctuation
+FF1F Terminal_Punctuation
+FF61 Terminal_Punctuation
+FF64 Terminal_Punctuation
+1039F Terminal_Punctuation
+103D0 Terminal_Punctuation
+1091F Terminal_Punctuation
+12470 12473 Terminal_Punctuation
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tfng.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tfng.pl
new file mode 100755
index 00000000000..e6079734281
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tfng.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Tifinagh} (and fuzzy permutations)
+#
+# Meaning: Script 'Tifinagh'
+#
+return <<'END';
+2D30 2D65 Tifinagh
+2D6F Tifinagh
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tglg.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tglg.pl
new file mode 100755
index 00000000000..bad457fb8c9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tglg.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Tagalog} (and fuzzy permutations)
+#
+# Meaning: Script 'Tagalog'
+#
+return <<'END';
+1700 170C Tagalog
+170E 1714 Tagalog
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Thaa.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Thaa.pl
new file mode 100755
index 00000000000..d9386afa405
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Thaa.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Thaana} (and fuzzy permutations)
+#
+# Meaning: Script 'Thaana'
+#
+return <<'END';
+0780 07B1 Thaana
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Thai.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Thai.pl
new file mode 100755
index 00000000000..27cb3eb3396
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Thai.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Thai} (and fuzzy permutations)
+#
+# Meaning: Script 'Thai'
+#
+return <<'END';
+0E01 0E3A Thai
+0E40 0E5B Thai
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tibt.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tibt.pl
new file mode 100755
index 00000000000..7f59e9e38d8
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Tibt.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Tibetan} (and fuzzy permutations)
+#
+# Meaning: Script 'Tibetan'
+#
+return <<'END';
+0F00 0F47 Tibetan
+0F49 0F6C Tibetan
+0F71 0F8B Tibetan
+0F90 0F97 Tibetan
+0F99 0FBC Tibetan
+0FBE 0FCC Tibetan
+0FCE 0FD4 Tibetan
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Title.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Title.pl
new file mode 100755
index 00000000000..0091f2d64be
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Title.pl
@@ -0,0 +1,26 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Title}
+#
+# Meaning: [[:Title:]]
+#
+return <<'END';
+01C5
+01C8
+01CB
+01F2
+1F88 1F8F
+1F98 1F9F
+1FA8 1FAF
+1FBC
+1FCC
+1FFC
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/UIdeo.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/UIdeo.pl
new file mode 100755
index 00000000000..dc3484aa8c2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/UIdeo.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Unified_Ideograph'
+#
+return <<'END';
+3400 4DB5 Unified_Ideograph
+4E00 9FC3 Unified_Ideograph
+FA0E FA0F Unified_Ideograph
+FA11 Unified_Ideograph
+FA13 FA14 Unified_Ideograph
+FA1F Unified_Ideograph
+FA21 Unified_Ideograph
+FA23 FA24 Unified_Ideograph
+FA27 FA29 Unified_Ideograph
+20000 2A6D6 Unified_Ideograph
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ugar.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ugar.pl
new file mode 100755
index 00000000000..d8eeb0edd24
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Ugar.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Ugaritic} (and fuzzy permutations)
+#
+# Meaning: Script 'Ugaritic'
+#
+return <<'END';
+10380 1039D Ugaritic
+1039F Ugaritic
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/UnifiedI.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/UnifiedI.pl
new file mode 100755
index 00000000000..372f5ea308e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/UnifiedI.pl
@@ -0,0 +1,26 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{UnifiedIdeograph} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Unified_Ideograph'
+#
+return <<'END';
+3400 4DB5 Unified_Ideograph
+4E00 9FC3 Unified_Ideograph
+FA0E FA0F Unified_Ideograph
+FA11 Unified_Ideograph
+FA13 FA14 Unified_Ideograph
+FA1F Unified_Ideograph
+FA21 Unified_Ideograph
+FA23 FA24 Unified_Ideograph
+FA27 FA29 Unified_Ideograph
+20000 2A6D6 Unified_Ideograph
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Upper.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Upper.pl
new file mode 100755
index 00000000000..3834a29a8de
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Upper.pl
@@ -0,0 +1,607 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Upper}
+#
+# Meaning: [[:Upper:]]
+#
+return <<'END';
+0041 005A
+00C0 00D6
+00D8 00DE
+0100
+0102
+0104
+0106
+0108
+010A
+010C
+010E
+0110
+0112
+0114
+0116
+0118
+011A
+011C
+011E
+0120
+0122
+0124
+0126
+0128
+012A
+012C
+012E
+0130
+0132
+0134
+0136
+0139
+013B
+013D
+013F
+0141
+0143
+0145
+0147
+014A
+014C
+014E
+0150
+0152
+0154
+0156
+0158
+015A
+015C
+015E
+0160
+0162
+0164
+0166
+0168
+016A
+016C
+016E
+0170
+0172
+0174
+0176
+0178 0179
+017B
+017D
+0181 0182
+0184
+0186 0187
+0189 018B
+018E 0191
+0193 0194
+0196 0198
+019C 019D
+019F 01A0
+01A2
+01A4
+01A6 01A7
+01A9
+01AC
+01AE 01AF
+01B1 01B3
+01B5
+01B7 01B8
+01BC
+01C4
+01C7
+01CA
+01CD
+01CF
+01D1
+01D3
+01D5
+01D7
+01D9
+01DB
+01DE
+01E0
+01E2
+01E4
+01E6
+01E8
+01EA
+01EC
+01EE
+01F1
+01F4
+01F6 01F8
+01FA
+01FC
+01FE
+0200
+0202
+0204
+0206
+0208
+020A
+020C
+020E
+0210
+0212
+0214
+0216
+0218
+021A
+021C
+021E
+0220
+0222
+0224
+0226
+0228
+022A
+022C
+022E
+0230
+0232
+023A 023B
+023D 023E
+0241
+0243 0246
+0248
+024A
+024C
+024E
+0370
+0372
+0376
+0386
+0388 038A
+038C
+038E 038F
+0391 03A1
+03A3 03AB
+03CF
+03D2 03D4
+03D8
+03DA
+03DC
+03DE
+03E0
+03E2
+03E4
+03E6
+03E8
+03EA
+03EC
+03EE
+03F4
+03F7
+03F9 03FA
+03FD 042F
+0460
+0462
+0464
+0466
+0468
+046A
+046C
+046E
+0470
+0472
+0474
+0476
+0478
+047A
+047C
+047E
+0480
+048A
+048C
+048E
+0490
+0492
+0494
+0496
+0498
+049A
+049C
+049E
+04A0
+04A2
+04A4
+04A6
+04A8
+04AA
+04AC
+04AE
+04B0
+04B2
+04B4
+04B6
+04B8
+04BA
+04BC
+04BE
+04C0 04C1
+04C3
+04C5
+04C7
+04C9
+04CB
+04CD
+04D0
+04D2
+04D4
+04D6
+04D8
+04DA
+04DC
+04DE
+04E0
+04E2
+04E4
+04E6
+04E8
+04EA
+04EC
+04EE
+04F0
+04F2
+04F4
+04F6
+04F8
+04FA
+04FC
+04FE
+0500
+0502
+0504
+0506
+0508
+050A
+050C
+050E
+0510
+0512
+0514
+0516
+0518
+051A
+051C
+051E
+0520
+0522
+0531 0556
+10A0 10C5
+1E00
+1E02
+1E04
+1E06
+1E08
+1E0A
+1E0C
+1E0E
+1E10
+1E12
+1E14
+1E16
+1E18
+1E1A
+1E1C
+1E1E
+1E20
+1E22
+1E24
+1E26
+1E28
+1E2A
+1E2C
+1E2E
+1E30
+1E32
+1E34
+1E36
+1E38
+1E3A
+1E3C
+1E3E
+1E40
+1E42
+1E44
+1E46
+1E48
+1E4A
+1E4C
+1E4E
+1E50
+1E52
+1E54
+1E56
+1E58
+1E5A
+1E5C
+1E5E
+1E60
+1E62
+1E64
+1E66
+1E68
+1E6A
+1E6C
+1E6E
+1E70
+1E72
+1E74
+1E76
+1E78
+1E7A
+1E7C
+1E7E
+1E80
+1E82
+1E84
+1E86
+1E88
+1E8A
+1E8C
+1E8E
+1E90
+1E92
+1E94
+1E9E
+1EA0
+1EA2
+1EA4
+1EA6
+1EA8
+1EAA
+1EAC
+1EAE
+1EB0
+1EB2
+1EB4
+1EB6
+1EB8
+1EBA
+1EBC
+1EBE
+1EC0
+1EC2
+1EC4
+1EC6
+1EC8
+1ECA
+1ECC
+1ECE
+1ED0
+1ED2
+1ED4
+1ED6
+1ED8
+1EDA
+1EDC
+1EDE
+1EE0
+1EE2
+1EE4
+1EE6
+1EE8
+1EEA
+1EEC
+1EEE
+1EF0
+1EF2
+1EF4
+1EF6
+1EF8
+1EFA
+1EFC
+1EFE
+1F08 1F0F
+1F18 1F1D
+1F28 1F2F
+1F38 1F3F
+1F48 1F4D
+1F59
+1F5B
+1F5D
+1F5F
+1F68 1F6F
+1FB8 1FBB
+1FC8 1FCB
+1FD8 1FDB
+1FE8 1FEC
+1FF8 1FFB
+2102
+2107
+210B 210D
+2110 2112
+2115
+2119 211D
+2124
+2126
+2128
+212A 212D
+2130 2133
+213E 213F
+2145
+2183
+2C00 2C2E
+2C60
+2C62 2C64
+2C67
+2C69
+2C6B
+2C6D 2C6F
+2C72
+2C75
+2C80
+2C82
+2C84
+2C86
+2C88
+2C8A
+2C8C
+2C8E
+2C90
+2C92
+2C94
+2C96
+2C98
+2C9A
+2C9C
+2C9E
+2CA0
+2CA2
+2CA4
+2CA6
+2CA8
+2CAA
+2CAC
+2CAE
+2CB0
+2CB2
+2CB4
+2CB6
+2CB8
+2CBA
+2CBC
+2CBE
+2CC0
+2CC2
+2CC4
+2CC6
+2CC8
+2CCA
+2CCC
+2CCE
+2CD0
+2CD2
+2CD4
+2CD6
+2CD8
+2CDA
+2CDC
+2CDE
+2CE0
+2CE2
+A640
+A642
+A644
+A646
+A648
+A64A
+A64C
+A64E
+A650
+A652
+A654
+A656
+A658
+A65A
+A65C
+A65E
+A662
+A664
+A666
+A668
+A66A
+A66C
+A680
+A682
+A684
+A686
+A688
+A68A
+A68C
+A68E
+A690
+A692
+A694
+A696
+A722
+A724
+A726
+A728
+A72A
+A72C
+A72E
+A732
+A734
+A736
+A738
+A73A
+A73C
+A73E
+A740
+A742
+A744
+A746
+A748
+A74A
+A74C
+A74E
+A750
+A752
+A754
+A756
+A758
+A75A
+A75C
+A75E
+A760
+A762
+A764
+A766
+A768
+A76A
+A76C
+A76E
+A779
+A77B
+A77D A77E
+A780
+A782
+A784
+A786
+A78B
+FF21 FF3A
+10400 10427
+1D400 1D419
+1D434 1D44D
+1D468 1D481
+1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B5
+1D4D0 1D4E9
+1D504 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D538 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D56C 1D585
+1D5A0 1D5B9
+1D5D4 1D5ED
+1D608 1D621
+1D63C 1D655
+1D670 1D689
+1D6A8 1D6C0
+1D6E2 1D6FA
+1D71C 1D734
+1D756 1D76E
+1D790 1D7A8
+1D7CA
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Uppercas.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Uppercas.pl
new file mode 100755
index 00000000000..d72907cc3e1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Uppercas.pl
@@ -0,0 +1,609 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Uppercase} (and fuzzy permutations)
+#
+# Meaning: [\p{Lu}\p{OtherUppercase}]
+#
+return <<'END';
+0041 005A
+00C0 00D6
+00D8 00DE
+0100
+0102
+0104
+0106
+0108
+010A
+010C
+010E
+0110
+0112
+0114
+0116
+0118
+011A
+011C
+011E
+0120
+0122
+0124
+0126
+0128
+012A
+012C
+012E
+0130
+0132
+0134
+0136
+0139
+013B
+013D
+013F
+0141
+0143
+0145
+0147
+014A
+014C
+014E
+0150
+0152
+0154
+0156
+0158
+015A
+015C
+015E
+0160
+0162
+0164
+0166
+0168
+016A
+016C
+016E
+0170
+0172
+0174
+0176
+0178 0179
+017B
+017D
+0181 0182
+0184
+0186 0187
+0189 018B
+018E 0191
+0193 0194
+0196 0198
+019C 019D
+019F 01A0
+01A2
+01A4
+01A6 01A7
+01A9
+01AC
+01AE 01AF
+01B1 01B3
+01B5
+01B7 01B8
+01BC
+01C4
+01C7
+01CA
+01CD
+01CF
+01D1
+01D3
+01D5
+01D7
+01D9
+01DB
+01DE
+01E0
+01E2
+01E4
+01E6
+01E8
+01EA
+01EC
+01EE
+01F1
+01F4
+01F6 01F8
+01FA
+01FC
+01FE
+0200
+0202
+0204
+0206
+0208
+020A
+020C
+020E
+0210
+0212
+0214
+0216
+0218
+021A
+021C
+021E
+0220
+0222
+0224
+0226
+0228
+022A
+022C
+022E
+0230
+0232
+023A 023B
+023D 023E
+0241
+0243 0246
+0248
+024A
+024C
+024E
+0370
+0372
+0376
+0386
+0388 038A
+038C
+038E 038F
+0391 03A1
+03A3 03AB
+03CF
+03D2 03D4
+03D8
+03DA
+03DC
+03DE
+03E0
+03E2
+03E4
+03E6
+03E8
+03EA
+03EC
+03EE
+03F4
+03F7
+03F9 03FA
+03FD 042F
+0460
+0462
+0464
+0466
+0468
+046A
+046C
+046E
+0470
+0472
+0474
+0476
+0478
+047A
+047C
+047E
+0480
+048A
+048C
+048E
+0490
+0492
+0494
+0496
+0498
+049A
+049C
+049E
+04A0
+04A2
+04A4
+04A6
+04A8
+04AA
+04AC
+04AE
+04B0
+04B2
+04B4
+04B6
+04B8
+04BA
+04BC
+04BE
+04C0 04C1
+04C3
+04C5
+04C7
+04C9
+04CB
+04CD
+04D0
+04D2
+04D4
+04D6
+04D8
+04DA
+04DC
+04DE
+04E0
+04E2
+04E4
+04E6
+04E8
+04EA
+04EC
+04EE
+04F0
+04F2
+04F4
+04F6
+04F8
+04FA
+04FC
+04FE
+0500
+0502
+0504
+0506
+0508
+050A
+050C
+050E
+0510
+0512
+0514
+0516
+0518
+051A
+051C
+051E
+0520
+0522
+0531 0556
+10A0 10C5
+1E00
+1E02
+1E04
+1E06
+1E08
+1E0A
+1E0C
+1E0E
+1E10
+1E12
+1E14
+1E16
+1E18
+1E1A
+1E1C
+1E1E
+1E20
+1E22
+1E24
+1E26
+1E28
+1E2A
+1E2C
+1E2E
+1E30
+1E32
+1E34
+1E36
+1E38
+1E3A
+1E3C
+1E3E
+1E40
+1E42
+1E44
+1E46
+1E48
+1E4A
+1E4C
+1E4E
+1E50
+1E52
+1E54
+1E56
+1E58
+1E5A
+1E5C
+1E5E
+1E60
+1E62
+1E64
+1E66
+1E68
+1E6A
+1E6C
+1E6E
+1E70
+1E72
+1E74
+1E76
+1E78
+1E7A
+1E7C
+1E7E
+1E80
+1E82
+1E84
+1E86
+1E88
+1E8A
+1E8C
+1E8E
+1E90
+1E92
+1E94
+1E9E
+1EA0
+1EA2
+1EA4
+1EA6
+1EA8
+1EAA
+1EAC
+1EAE
+1EB0
+1EB2
+1EB4
+1EB6
+1EB8
+1EBA
+1EBC
+1EBE
+1EC0
+1EC2
+1EC4
+1EC6
+1EC8
+1ECA
+1ECC
+1ECE
+1ED0
+1ED2
+1ED4
+1ED6
+1ED8
+1EDA
+1EDC
+1EDE
+1EE0
+1EE2
+1EE4
+1EE6
+1EE8
+1EEA
+1EEC
+1EEE
+1EF0
+1EF2
+1EF4
+1EF6
+1EF8
+1EFA
+1EFC
+1EFE
+1F08 1F0F
+1F18 1F1D
+1F28 1F2F
+1F38 1F3F
+1F48 1F4D
+1F59
+1F5B
+1F5D
+1F5F
+1F68 1F6F
+1FB8 1FBB
+1FC8 1FCB
+1FD8 1FDB
+1FE8 1FEC
+1FF8 1FFB
+2102
+2107
+210B 210D
+2110 2112
+2115
+2119 211D
+2124
+2126
+2128
+212A 212D
+2130 2133
+213E 213F
+2145
+2160 216F
+2183
+24B6 24CF
+2C00 2C2E
+2C60
+2C62 2C64
+2C67
+2C69
+2C6B
+2C6D 2C6F
+2C72
+2C75
+2C80
+2C82
+2C84
+2C86
+2C88
+2C8A
+2C8C
+2C8E
+2C90
+2C92
+2C94
+2C96
+2C98
+2C9A
+2C9C
+2C9E
+2CA0
+2CA2
+2CA4
+2CA6
+2CA8
+2CAA
+2CAC
+2CAE
+2CB0
+2CB2
+2CB4
+2CB6
+2CB8
+2CBA
+2CBC
+2CBE
+2CC0
+2CC2
+2CC4
+2CC6
+2CC8
+2CCA
+2CCC
+2CCE
+2CD0
+2CD2
+2CD4
+2CD6
+2CD8
+2CDA
+2CDC
+2CDE
+2CE0
+2CE2
+A640
+A642
+A644
+A646
+A648
+A64A
+A64C
+A64E
+A650
+A652
+A654
+A656
+A658
+A65A
+A65C
+A65E
+A662
+A664
+A666
+A668
+A66A
+A66C
+A680
+A682
+A684
+A686
+A688
+A68A
+A68C
+A68E
+A690
+A692
+A694
+A696
+A722
+A724
+A726
+A728
+A72A
+A72C
+A72E
+A732
+A734
+A736
+A738
+A73A
+A73C
+A73E
+A740
+A742
+A744
+A746
+A748
+A74A
+A74C
+A74E
+A750
+A752
+A754
+A756
+A758
+A75A
+A75C
+A75E
+A760
+A762
+A764
+A766
+A768
+A76A
+A76C
+A76E
+A779
+A77B
+A77D A77E
+A780
+A782
+A784
+A786
+A78B
+FF21 FF3A
+10400 10427
+1D400 1D419
+1D434 1D44D
+1D468 1D481
+1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B5
+1D4D0 1D4E9
+1D504 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D538 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D56C 1D585
+1D5A0 1D5B9
+1D5D4 1D5ED
+1D608 1D621
+1D63C 1D655
+1D670 1D689
+1D6A8 1D6C0
+1D6E2 1D6FA
+1D71C 1D734
+1D756 1D76E
+1D790 1D7A8
+1D7CA
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/VS.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/VS.pl
new file mode 100755
index 00000000000..4c593d4237b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/VS.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'Variation_Selector'
+#
+return <<'END';
+180B 180D Variation_Selector
+FE00 FE0F Variation_Selector
+E0100 E01EF Variation_Selector
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Vaii.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Vaii.pl
new file mode 100755
index 00000000000..e6d7167c281
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Vaii.pl
@@ -0,0 +1,17 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Vai} (and fuzzy permutations)
+#
+# Meaning: Script 'Vai'
+#
+return <<'END';
+A500 A62B Vai
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Variatio.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Variatio.pl
new file mode 100755
index 00000000000..55fee5b1f16
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Variatio.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{VariationSelector} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Variation_Selector'
+#
+return <<'END';
+180B 180D Variation_Selector
+FE00 FE0F Variation_Selector
+E0100 E01EF Variation_Selector
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/VertSpac.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/VertSpac.pl
new file mode 100755
index 00000000000..8086c1d200a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/VertSpac.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{VertSpace}
+#
+# Meaning: \v
+#
+return <<'END';
+000A 000D
+0085
+2028 2029
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/WSpace.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/WSpace.pl
new file mode 100755
index 00000000000..76176dd05f2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/WSpace.pl
@@ -0,0 +1,24 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Binary property 'White_Space'
+#
+return <<'END';
+0009 000D White_Space
+0020 White_Space
+0085 White_Space
+00A0 White_Space
+1680 White_Space
+180E White_Space
+2000 200A White_Space
+2028 2029 White_Space
+202F White_Space
+205F White_Space
+3000 White_Space
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/WhiteSpa.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/WhiteSpa.pl
new file mode 100755
index 00000000000..ed9b1cd8b44
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/WhiteSpa.pl
@@ -0,0 +1,27 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{WhiteSpace} (and fuzzy permutations)
+#
+# Meaning: Extended property 'White_Space'
+#
+return <<'END';
+0009 000D White_Space
+0020 White_Space
+0085 White_Space
+00A0 White_Space
+1680 White_Space
+180E White_Space
+2000 200A White_Space
+2028 2029 White_Space
+202F White_Space
+205F White_Space
+3000 White_Space
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Word.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Word.pl
new file mode 100755
index 00000000000..b4dcadeb5cc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Word.pl
@@ -0,0 +1,512 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Word}
+#
+# Meaning: [[:Word:]]
+#
+return <<'END';
+0030 0039
+0041 005A
+005F
+0061 007A
+00AA
+00B2 00B3
+00B5
+00B9 00BA
+00BC 00BE
+00C0 00D6
+00D8 00F6
+00F8 02C1
+02C6 02D1
+02E0 02E4
+02EC
+02EE
+0300 0374
+0376 0377
+037A 037D
+0386
+0388 038A
+038C
+038E 03A1
+03A3 03F5
+03F7 0481
+0483 0523
+0531 0556
+0559
+0561 0587
+0591 05BD
+05BF
+05C1 05C2
+05C4 05C5
+05C7
+05D0 05EA
+05F0 05F2
+0610 061A
+0621 065E
+0660 0669
+066E 06D3
+06D5 06DC
+06DE 06E8
+06EA 06FC
+06FF
+0710 074A
+074D 07B1
+07C0 07F5
+07FA
+0901 0939
+093C 094D
+0950 0954
+0958 0963
+0966 096F
+0971 0972
+097B 097F
+0981 0983
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BC 09C4
+09C7 09C8
+09CB 09CE
+09D7
+09DC 09DD
+09DF 09E3
+09E6 09F1
+09F4 09F9
+0A01 0A03
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A3C
+0A3E 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A59 0A5C
+0A5E
+0A66 0A75
+0A81 0A83
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABC 0AC5
+0AC7 0AC9
+0ACB 0ACD
+0AD0
+0AE0 0AE3
+0AE6 0AEF
+0B01 0B03
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3C 0B44
+0B47 0B48
+0B4B 0B4D
+0B56 0B57
+0B5C 0B5D
+0B5F 0B63
+0B66 0B6F
+0B71
+0B82 0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BBE 0BC2
+0BC6 0BC8
+0BCA 0BCD
+0BD0
+0BD7
+0BE6 0BF2
+0C01 0C03
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D 0C44
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C58 0C59
+0C60 0C63
+0C66 0C6F
+0C78 0C7E
+0C82 0C83
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBC 0CC4
+0CC6 0CC8
+0CCA 0CCD
+0CD5 0CD6
+0CDE
+0CE0 0CE3
+0CE6 0CEF
+0D02 0D03
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D 0D44
+0D46 0D48
+0D4A 0D4D
+0D57
+0D60 0D63
+0D66 0D75
+0D7A 0D7F
+0D82 0D83
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0DCA
+0DCF 0DD4
+0DD6
+0DD8 0DDF
+0DF2 0DF3
+0E01 0E3A
+0E40 0E4E
+0E50 0E59
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB9
+0EBB 0EBD
+0EC0 0EC4
+0EC6
+0EC8 0ECD
+0ED0 0ED9
+0EDC 0EDD
+0F00
+0F18 0F19
+0F20 0F33
+0F35
+0F37
+0F39
+0F3E 0F47
+0F49 0F6C
+0F71 0F84
+0F86 0F8B
+0F90 0F97
+0F99 0FBC
+0FC6
+1000 1049
+1050 1099
+10A0 10C5
+10D0 10FA
+10FC
+1100 1159
+115F 11A2
+11A8 11F9
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+135F
+1369 137C
+1380 138F
+13A0 13F4
+1401 166C
+166F 1676
+1681 169A
+16A0 16EA
+16EE 16F0
+1700 170C
+170E 1714
+1720 1734
+1740 1753
+1760 176C
+176E 1770
+1772 1773
+1780 17B3
+17B6 17D3
+17D7
+17DC 17DD
+17E0 17E9
+17F0 17F9
+180B 180D
+1810 1819
+1820 1877
+1880 18AA
+1900 191C
+1920 192B
+1930 193B
+1946 196D
+1970 1974
+1980 19A9
+19B0 19C9
+19D0 19D9
+1A00 1A1B
+1B00 1B4B
+1B50 1B59
+1B6B 1B73
+1B80 1BAA
+1BAE 1BB9
+1C00 1C37
+1C40 1C49
+1C4D 1C7D
+1D00 1DE6
+1DFE 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FBC
+1FBE
+1FC2 1FC4
+1FC6 1FCC
+1FD0 1FD3
+1FD6 1FDB
+1FE0 1FEC
+1FF2 1FF4
+1FF6 1FFC
+203F 2040
+2054
+2070 2071
+2074 2079
+207F 2089
+2090 2094
+20D0 20F0
+2102
+2107
+210A 2113
+2115
+2119 211D
+2124
+2126
+2128
+212A 212D
+212F 2139
+213C 213F
+2145 2149
+214E
+2153 2188
+2460 249B
+24EA 24FF
+2776 2793
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CE4
+2CFD
+2D00 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+2DE0 2DFF
+2E2F
+3005 3007
+3021 302F
+3031 3035
+3038 303C
+3041 3096
+3099 309A
+309D 309F
+30A1 30FA
+30FC 30FF
+3105 312D
+3131 318E
+3192 3195
+31A0 31B7
+31F0 31FF
+3220 3229
+3251 325F
+3280 3289
+32B1 32BF
+3400 4DB5
+4E00 9FC3
+A000 A48C
+A500 A60C
+A610 A62B
+A640 A65F
+A662 A672
+A67C A67D
+A67F A697
+A717 A71F
+A722 A788
+A78B A78C
+A7FB A827
+A840 A873
+A880 A8C4
+A8D0 A8D9
+A900 A92D
+A930 A953
+AA00 AA36
+AA40 AA4D
+AA50 AA59
+AC00 D7A3
+F900 FA2D
+FA30 FA6A
+FA70 FAD9
+FB00 FB06
+FB13 FB17
+FB1D FB28
+FB2A FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3D
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFB
+FE00 FE0F
+FE20 FE26
+FE33 FE34
+FE4D FE4F
+FE70 FE74
+FE76 FEFC
+FF10 FF19
+FF21 FF3A
+FF3F
+FF41 FF5A
+FF66 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10107 10133
+10140 10178
+1018A
+101FD
+10280 1029C
+102A0 102D0
+10300 1031E
+10320 10323
+10330 1034A
+10380 1039D
+103A0 103C3
+103C8 103CF
+103D1 103D5
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10919
+10920 10939
+10A00 10A03
+10A05 10A06
+10A0C 10A13
+10A15 10A17
+10A19 10A33
+10A38 10A3A
+10A3F 10A47
+12000 1236E
+12400 12462
+1D165 1D169
+1D16D 1D172
+1D17B 1D182
+1D185 1D18B
+1D1AA 1D1AD
+1D242 1D244
+1D360 1D371
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D6C0
+1D6C2 1D6DA
+1D6DC 1D6FA
+1D6FC 1D714
+1D716 1D734
+1D736 1D74E
+1D750 1D76E
+1D770 1D788
+1D78A 1D7A8
+1D7AA 1D7C2
+1D7C4 1D7CB
+1D7CE 1D7FF
+20000 2A6D6
+2F800 2FA1D
+E0100 E01EF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/XDigit.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/XDigit.pl
new file mode 100755
index 00000000000..c0632ff4576
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/XDigit.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{XDigit}
+#
+# Meaning: [[:XDigit:]]
+#
+return <<'END';
+0030 0039
+0041 0046
+0061 0066
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Xsux.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Xsux.pl
new file mode 100755
index 00000000000..116bb8d9efc
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Xsux.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Cuneiform} (and fuzzy permutations)
+#
+# Meaning: Script 'Cuneiform'
+#
+return <<'END';
+12000 1236E Cuneiform
+12400 12462 Cuneiform
+12470 12473 Cuneiform
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Yiii.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Yiii.pl
new file mode 100755
index 00000000000..857ab65f6c7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Yiii.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Yi} (and fuzzy permutations)
+#
+# Meaning: Script 'Yi'
+#
+return <<'END';
+A000 A48C Yi
+A490 A4C6 Yi
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Z.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Z.pl
new file mode 100755
index 00000000000..c3404d6a45c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Z.pl
@@ -0,0 +1,26 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Z}
+# \p{Z} (and fuzzy permutations)
+#
+# Meaning: Major Category 'Z'
+#
+return <<'END';
+0020
+00A0
+1680
+180E
+2000 200A
+2028 2029
+202F
+205F
+3000
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zl.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zl.pl
new file mode 100755
index 00000000000..33b6dc2be15
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zl.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Zl}
+# \p{Zl} (and fuzzy permutations)
+#
+# Meaning: General Category 'Zl'
+#
+return <<'END';
+2028
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zp.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zp.pl
new file mode 100755
index 00000000000..22c136f85fa
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zp.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Zp}
+# \p{Zp} (and fuzzy permutations)
+#
+# Meaning: General Category 'Zp'
+#
+return <<'END';
+2029
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zs.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zs.pl
new file mode 100755
index 00000000000..14f18f034a1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zs.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Zs}
+# \p{Zs} (and fuzzy permutations)
+#
+# Meaning: General Category 'Zs'
+#
+return <<'END';
+0020
+00A0
+1680
+180E
+2000 200A
+202F
+205F
+3000
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zyyy.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zyyy.pl
new file mode 100755
index 00000000000..931ba9a8021
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/Zyyy.pl
@@ -0,0 +1,153 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{Common} (and fuzzy permutations)
+#
+# Meaning: Script 'Common'
+#
+return <<'END';
+0000 0040 Common
+005B 0060 Common
+007B 00A9 Common
+00AB 00B9 Common
+00BB 00BF Common
+00D7 Common
+00F7 Common
+02B9 02DF Common
+02E5 02FF Common
+0374 Common
+037E Common
+0385 Common
+0387 Common
+0589 Common
+0600 0603 Common
+060C Common
+061B Common
+061F Common
+0640 Common
+0660 0669 Common
+06DD Common
+0964 0965 Common
+0970 Common
+0CF1 0CF2 Common
+0E3F Common
+10FB Common
+16EB 16ED Common
+1735 1736 Common
+1802 1803 Common
+1805 Common
+2000 200B Common
+200E 2064 Common
+206A 2070 Common
+2074 207E Common
+2080 208E Common
+20A0 20B5 Common
+2100 2125 Common
+2127 2129 Common
+212C 2131 Common
+2133 214D Common
+214F Common
+2153 215F Common
+2190 23E7 Common
+2400 2426 Common
+2440 244A Common
+2460 269D Common
+26A0 26BC Common
+26C0 26C3 Common
+2701 2704 Common
+2706 2709 Common
+270C 2727 Common
+2729 274B Common
+274D Common
+274F 2752 Common
+2756 Common
+2758 275E Common
+2761 2794 Common
+2798 27AF Common
+27B1 27BE Common
+27C0 27CA Common
+27CC Common
+27D0 27FF Common
+2900 2B4C Common
+2B50 2B54 Common
+2E00 2E30 Common
+2FF0 2FFB Common
+3000 3004 Common
+3006 Common
+3008 3020 Common
+3030 3037 Common
+303C 303F Common
+309B 309C Common
+30A0 Common
+30FB 30FC Common
+3190 319F Common
+31C0 31E3 Common
+3220 3243 Common
+3250 325F Common
+327F 32CF Common
+3358 33FF Common
+4DC0 4DFF Common
+A700 A721 Common
+A788 A78A Common
+FD3E FD3F Common
+FDFD Common
+FE10 FE19 Common
+FE30 FE52 Common
+FE54 FE66 Common
+FE68 FE6B Common
+FEFF Common
+FF01 FF20 Common
+FF3B FF40 Common
+FF5B FF65 Common
+FF70 Common
+FF9E FF9F Common
+FFE0 FFE6 Common
+FFE8 FFEE Common
+FFF9 FFFD Common
+10100 10102 Common
+10107 10133 Common
+10137 1013F Common
+10190 1019B Common
+101D0 101FC Common
+1D000 1D0F5 Common
+1D100 1D126 Common
+1D129 1D166 Common
+1D16A 1D17A Common
+1D183 1D184 Common
+1D18C 1D1A9 Common
+1D1AE 1D1DD Common
+1D300 1D356 Common
+1D360 1D371 Common
+1D400 1D454 Common
+1D456 1D49C Common
+1D49E 1D49F Common
+1D4A2 Common
+1D4A5 1D4A6 Common
+1D4A9 1D4AC Common
+1D4AE 1D4B9 Common
+1D4BB Common
+1D4BD 1D4C3 Common
+1D4C5 1D505 Common
+1D507 1D50A Common
+1D50D 1D514 Common
+1D516 1D51C Common
+1D51E 1D539 Common
+1D53B 1D53E Common
+1D540 1D544 Common
+1D546 Common
+1D54A 1D550 Common
+1D552 1D6A5 Common
+1D6A8 1D7CB Common
+1D7CE 1D7FF Common
+1F000 1F02B Common
+1F030 1F093 Common
+E0001 Common
+E0020 E007F Common
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/_CanonDC.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/_CanonDC.pl
new file mode 100755
index 00000000000..ef514563342
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/_CanonDC.pl
@@ -0,0 +1,20 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{_CanonDCIJ}
+#
+# Meaning: (for internal casefolding use)
+#
+return <<'END';
+0069 006A
+012F
+1E2D
+1ECB
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/_CaseIgn.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/_CaseIgn.pl
new file mode 100755
index 00000000000..e98e95d5cf2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/_CaseIgn.pl
@@ -0,0 +1,178 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{_CaseIgnorable}
+#
+# Meaning: (for internal casefolding use)
+#
+return <<'END';
+00AD
+0300 036F
+0483 0487
+0591 05BD
+05BF
+05C1 05C2
+05C4 05C5
+05C7
+0610 061A
+064B 065E
+0670
+06D6 06DC
+06DF 06E4
+06E7 06E8
+06EA 06ED
+0711
+0730 074A
+07A6 07B0
+07EB 07F3
+0901 0902
+093C
+0941 0948
+094D
+0951 0954
+0962 0963
+0981
+09BC
+09C1 09C4
+09CD
+09E2 09E3
+0A01 0A02
+0A3C
+0A41 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A70 0A71
+0A75
+0A81 0A82
+0ABC
+0AC1 0AC5
+0AC7 0AC8
+0ACD
+0AE2 0AE3
+0B01
+0B3C
+0B3F
+0B41 0B44
+0B4D
+0B56
+0B62 0B63
+0B82
+0BC0
+0BCD
+0C3E 0C40
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C62 0C63
+0CBC
+0CBF
+0CC6
+0CCC 0CCD
+0CE2 0CE3
+0D41 0D44
+0D4D
+0D62 0D63
+0DCA
+0DD2 0DD4
+0DD6
+0E31
+0E34 0E3A
+0E47 0E4E
+0EB1
+0EB4 0EB9
+0EBB 0EBC
+0EC8 0ECD
+0F18 0F19
+0F35
+0F37
+0F39
+0F71 0F7E
+0F80 0F84
+0F86 0F87
+0F90 0F97
+0F99 0FBC
+0FC6
+102D 1030
+1032 1037
+1039 103A
+103D 103E
+1058 1059
+105E 1060
+1071 1074
+1082
+1085 1086
+108D
+135F
+1712 1714
+1732 1734
+1752 1753
+1772 1773
+17B7 17BD
+17C6
+17C9 17D3
+17DD
+180B 180D
+18A9
+1920 1922
+1927 1928
+1932
+1939 193B
+1A17 1A18
+1B00 1B03
+1B34
+1B36 1B3A
+1B3C
+1B42
+1B6B 1B73
+1B80 1B81
+1BA2 1BA5
+1BA8 1BA9
+1C2C 1C33
+1C36 1C37
+1DC0 1DE6
+1DFE 1DFF
+2010
+20D0 20DC
+20E1
+20E5 20F0
+2DE0 2DFF
+302A 302F
+3099 309A
+A66F
+A67C A67D
+A802
+A806
+A80B
+A825 A826
+A8C4
+A926 A92D
+A947 A951
+AA29 AA2E
+AA31 AA32
+AA35 AA36
+AA43
+AA4C
+FB1E
+FE00 FE0F
+FE20 FE26
+101FD
+10A01 10A03
+10A05 10A06
+10A0C 10A0F
+10A38 10A3A
+10A3F
+1D167 1D169
+1D17B 1D182
+1D185 1D18B
+1D1AA 1D1AD
+1D242 1D244
+E0100 E01EF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/_CombAbo.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/_CombAbo.pl
new file mode 100755
index 00000000000..05558f8cce6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/gc_sc/_CombAbo.pl
@@ -0,0 +1,84 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# This file supports:
+# \p{_CombAbove}
+#
+# Meaning: (for internal casefolding use)
+#
+return <<'END';
+0300 0314
+033D 0344
+0346
+034A 034C
+0350 0352
+0357
+035B
+0363 036F
+0483 0487
+0592 0595
+0597 0599
+059C 05A1
+05A8 05A9
+05AB 05AC
+05AF
+05C4
+0610 0617
+0653 0654
+0657 065B
+065D 065E
+06D6 06DC
+06DF 06E2
+06E4
+06E7 06E8
+06EB 06EC
+0730
+0732 0733
+0735 0736
+073A
+073D
+073F 0741
+0743
+0745
+0747
+0749 074A
+07EB 07F1
+07F3
+0951
+0953 0954
+0F82 0F83
+0F86 0F87
+135F
+17DD
+193A
+1A17
+1B6B
+1B6D 1B73
+1DC0 1DC1
+1DC3 1DC9
+1DCB 1DCC
+1DD1 1DE6
+1DFE
+20D0 20D1
+20D4 20D7
+20DB 20DC
+20E1
+20E7
+20E9
+20F0
+2DE0 2DFF
+A66F
+A67C A67D
+FE20 FE26
+10A0F
+10A38
+1D185 1D189
+1D1AA 1D1AD
+1D242 1D244
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/L.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/L.pl
new file mode 100755
index 00000000000..9bd9e6a0df6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/L.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# HangulSyllableType category 'Leading_Jamo'
+#
+return <<'END';
+1100 1159
+115F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/LV.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/LV.pl
new file mode 100755
index 00000000000..2994bbc7ce3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/LV.pl
@@ -0,0 +1,412 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# HangulSyllableType category 'LV_Syllable'
+#
+return <<'END';
+AC00
+AC1C
+AC38
+AC54
+AC70
+AC8C
+ACA8
+ACC4
+ACE0
+ACFC
+AD18
+AD34
+AD50
+AD6C
+AD88
+ADA4
+ADC0
+ADDC
+ADF8
+AE14
+AE30
+AE4C
+AE68
+AE84
+AEA0
+AEBC
+AED8
+AEF4
+AF10
+AF2C
+AF48
+AF64
+AF80
+AF9C
+AFB8
+AFD4
+AFF0
+B00C
+B028
+B044
+B060
+B07C
+B098
+B0B4
+B0D0
+B0EC
+B108
+B124
+B140
+B15C
+B178
+B194
+B1B0
+B1CC
+B1E8
+B204
+B220
+B23C
+B258
+B274
+B290
+B2AC
+B2C8
+B2E4
+B300
+B31C
+B338
+B354
+B370
+B38C
+B3A8
+B3C4
+B3E0
+B3FC
+B418
+B434
+B450
+B46C
+B488
+B4A4
+B4C0
+B4DC
+B4F8
+B514
+B530
+B54C
+B568
+B584
+B5A0
+B5BC
+B5D8
+B5F4
+B610
+B62C
+B648
+B664
+B680
+B69C
+B6B8
+B6D4
+B6F0
+B70C
+B728
+B744
+B760
+B77C
+B798
+B7B4
+B7D0
+B7EC
+B808
+B824
+B840
+B85C
+B878
+B894
+B8B0
+B8CC
+B8E8
+B904
+B920
+B93C
+B958
+B974
+B990
+B9AC
+B9C8
+B9E4
+BA00
+BA1C
+BA38
+BA54
+BA70
+BA8C
+BAA8
+BAC4
+BAE0
+BAFC
+BB18
+BB34
+BB50
+BB6C
+BB88
+BBA4
+BBC0
+BBDC
+BBF8
+BC14
+BC30
+BC4C
+BC68
+BC84
+BCA0
+BCBC
+BCD8
+BCF4
+BD10
+BD2C
+BD48
+BD64
+BD80
+BD9C
+BDB8
+BDD4
+BDF0
+BE0C
+BE28
+BE44
+BE60
+BE7C
+BE98
+BEB4
+BED0
+BEEC
+BF08
+BF24
+BF40
+BF5C
+BF78
+BF94
+BFB0
+BFCC
+BFE8
+C004
+C020
+C03C
+C058
+C074
+C090
+C0AC
+C0C8
+C0E4
+C100
+C11C
+C138
+C154
+C170
+C18C
+C1A8
+C1C4
+C1E0
+C1FC
+C218
+C234
+C250
+C26C
+C288
+C2A4
+C2C0
+C2DC
+C2F8
+C314
+C330
+C34C
+C368
+C384
+C3A0
+C3BC
+C3D8
+C3F4
+C410
+C42C
+C448
+C464
+C480
+C49C
+C4B8
+C4D4
+C4F0
+C50C
+C528
+C544
+C560
+C57C
+C598
+C5B4
+C5D0
+C5EC
+C608
+C624
+C640
+C65C
+C678
+C694
+C6B0
+C6CC
+C6E8
+C704
+C720
+C73C
+C758
+C774
+C790
+C7AC
+C7C8
+C7E4
+C800
+C81C
+C838
+C854
+C870
+C88C
+C8A8
+C8C4
+C8E0
+C8FC
+C918
+C934
+C950
+C96C
+C988
+C9A4
+C9C0
+C9DC
+C9F8
+CA14
+CA30
+CA4C
+CA68
+CA84
+CAA0
+CABC
+CAD8
+CAF4
+CB10
+CB2C
+CB48
+CB64
+CB80
+CB9C
+CBB8
+CBD4
+CBF0
+CC0C
+CC28
+CC44
+CC60
+CC7C
+CC98
+CCB4
+CCD0
+CCEC
+CD08
+CD24
+CD40
+CD5C
+CD78
+CD94
+CDB0
+CDCC
+CDE8
+CE04
+CE20
+CE3C
+CE58
+CE74
+CE90
+CEAC
+CEC8
+CEE4
+CF00
+CF1C
+CF38
+CF54
+CF70
+CF8C
+CFA8
+CFC4
+CFE0
+CFFC
+D018
+D034
+D050
+D06C
+D088
+D0A4
+D0C0
+D0DC
+D0F8
+D114
+D130
+D14C
+D168
+D184
+D1A0
+D1BC
+D1D8
+D1F4
+D210
+D22C
+D248
+D264
+D280
+D29C
+D2B8
+D2D4
+D2F0
+D30C
+D328
+D344
+D360
+D37C
+D398
+D3B4
+D3D0
+D3EC
+D408
+D424
+D440
+D45C
+D478
+D494
+D4B0
+D4CC
+D4E8
+D504
+D520
+D53C
+D558
+D574
+D590
+D5AC
+D5C8
+D5E4
+D600
+D61C
+D638
+D654
+D670
+D68C
+D6A8
+D6C4
+D6E0
+D6FC
+D718
+D734
+D750
+D76C
+D788
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/LVT.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/LVT.pl
new file mode 100755
index 00000000000..bbb29aa59e4
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/LVT.pl
@@ -0,0 +1,412 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# HangulSyllableType category 'LVT_Syllable'
+#
+return <<'END';
+AC01 AC1B
+AC1D AC37
+AC39 AC53
+AC55 AC6F
+AC71 AC8B
+AC8D ACA7
+ACA9 ACC3
+ACC5 ACDF
+ACE1 ACFB
+ACFD AD17
+AD19 AD33
+AD35 AD4F
+AD51 AD6B
+AD6D AD87
+AD89 ADA3
+ADA5 ADBF
+ADC1 ADDB
+ADDD ADF7
+ADF9 AE13
+AE15 AE2F
+AE31 AE4B
+AE4D AE67
+AE69 AE83
+AE85 AE9F
+AEA1 AEBB
+AEBD AED7
+AED9 AEF3
+AEF5 AF0F
+AF11 AF2B
+AF2D AF47
+AF49 AF63
+AF65 AF7F
+AF81 AF9B
+AF9D AFB7
+AFB9 AFD3
+AFD5 AFEF
+AFF1 B00B
+B00D B027
+B029 B043
+B045 B05F
+B061 B07B
+B07D B097
+B099 B0B3
+B0B5 B0CF
+B0D1 B0EB
+B0ED B107
+B109 B123
+B125 B13F
+B141 B15B
+B15D B177
+B179 B193
+B195 B1AF
+B1B1 B1CB
+B1CD B1E7
+B1E9 B203
+B205 B21F
+B221 B23B
+B23D B257
+B259 B273
+B275 B28F
+B291 B2AB
+B2AD B2C7
+B2C9 B2E3
+B2E5 B2FF
+B301 B31B
+B31D B337
+B339 B353
+B355 B36F
+B371 B38B
+B38D B3A7
+B3A9 B3C3
+B3C5 B3DF
+B3E1 B3FB
+B3FD B417
+B419 B433
+B435 B44F
+B451 B46B
+B46D B487
+B489 B4A3
+B4A5 B4BF
+B4C1 B4DB
+B4DD B4F7
+B4F9 B513
+B515 B52F
+B531 B54B
+B54D B567
+B569 B583
+B585 B59F
+B5A1 B5BB
+B5BD B5D7
+B5D9 B5F3
+B5F5 B60F
+B611 B62B
+B62D B647
+B649 B663
+B665 B67F
+B681 B69B
+B69D B6B7
+B6B9 B6D3
+B6D5 B6EF
+B6F1 B70B
+B70D B727
+B729 B743
+B745 B75F
+B761 B77B
+B77D B797
+B799 B7B3
+B7B5 B7CF
+B7D1 B7EB
+B7ED B807
+B809 B823
+B825 B83F
+B841 B85B
+B85D B877
+B879 B893
+B895 B8AF
+B8B1 B8CB
+B8CD B8E7
+B8E9 B903
+B905 B91F
+B921 B93B
+B93D B957
+B959 B973
+B975 B98F
+B991 B9AB
+B9AD B9C7
+B9C9 B9E3
+B9E5 B9FF
+BA01 BA1B
+BA1D BA37
+BA39 BA53
+BA55 BA6F
+BA71 BA8B
+BA8D BAA7
+BAA9 BAC3
+BAC5 BADF
+BAE1 BAFB
+BAFD BB17
+BB19 BB33
+BB35 BB4F
+BB51 BB6B
+BB6D BB87
+BB89 BBA3
+BBA5 BBBF
+BBC1 BBDB
+BBDD BBF7
+BBF9 BC13
+BC15 BC2F
+BC31 BC4B
+BC4D BC67
+BC69 BC83
+BC85 BC9F
+BCA1 BCBB
+BCBD BCD7
+BCD9 BCF3
+BCF5 BD0F
+BD11 BD2B
+BD2D BD47
+BD49 BD63
+BD65 BD7F
+BD81 BD9B
+BD9D BDB7
+BDB9 BDD3
+BDD5 BDEF
+BDF1 BE0B
+BE0D BE27
+BE29 BE43
+BE45 BE5F
+BE61 BE7B
+BE7D BE97
+BE99 BEB3
+BEB5 BECF
+BED1 BEEB
+BEED BF07
+BF09 BF23
+BF25 BF3F
+BF41 BF5B
+BF5D BF77
+BF79 BF93
+BF95 BFAF
+BFB1 BFCB
+BFCD BFE7
+BFE9 C003
+C005 C01F
+C021 C03B
+C03D C057
+C059 C073
+C075 C08F
+C091 C0AB
+C0AD C0C7
+C0C9 C0E3
+C0E5 C0FF
+C101 C11B
+C11D C137
+C139 C153
+C155 C16F
+C171 C18B
+C18D C1A7
+C1A9 C1C3
+C1C5 C1DF
+C1E1 C1FB
+C1FD C217
+C219 C233
+C235 C24F
+C251 C26B
+C26D C287
+C289 C2A3
+C2A5 C2BF
+C2C1 C2DB
+C2DD C2F7
+C2F9 C313
+C315 C32F
+C331 C34B
+C34D C367
+C369 C383
+C385 C39F
+C3A1 C3BB
+C3BD C3D7
+C3D9 C3F3
+C3F5 C40F
+C411 C42B
+C42D C447
+C449 C463
+C465 C47F
+C481 C49B
+C49D C4B7
+C4B9 C4D3
+C4D5 C4EF
+C4F1 C50B
+C50D C527
+C529 C543
+C545 C55F
+C561 C57B
+C57D C597
+C599 C5B3
+C5B5 C5CF
+C5D1 C5EB
+C5ED C607
+C609 C623
+C625 C63F
+C641 C65B
+C65D C677
+C679 C693
+C695 C6AF
+C6B1 C6CB
+C6CD C6E7
+C6E9 C703
+C705 C71F
+C721 C73B
+C73D C757
+C759 C773
+C775 C78F
+C791 C7AB
+C7AD C7C7
+C7C9 C7E3
+C7E5 C7FF
+C801 C81B
+C81D C837
+C839 C853
+C855 C86F
+C871 C88B
+C88D C8A7
+C8A9 C8C3
+C8C5 C8DF
+C8E1 C8FB
+C8FD C917
+C919 C933
+C935 C94F
+C951 C96B
+C96D C987
+C989 C9A3
+C9A5 C9BF
+C9C1 C9DB
+C9DD C9F7
+C9F9 CA13
+CA15 CA2F
+CA31 CA4B
+CA4D CA67
+CA69 CA83
+CA85 CA9F
+CAA1 CABB
+CABD CAD7
+CAD9 CAF3
+CAF5 CB0F
+CB11 CB2B
+CB2D CB47
+CB49 CB63
+CB65 CB7F
+CB81 CB9B
+CB9D CBB7
+CBB9 CBD3
+CBD5 CBEF
+CBF1 CC0B
+CC0D CC27
+CC29 CC43
+CC45 CC5F
+CC61 CC7B
+CC7D CC97
+CC99 CCB3
+CCB5 CCCF
+CCD1 CCEB
+CCED CD07
+CD09 CD23
+CD25 CD3F
+CD41 CD5B
+CD5D CD77
+CD79 CD93
+CD95 CDAF
+CDB1 CDCB
+CDCD CDE7
+CDE9 CE03
+CE05 CE1F
+CE21 CE3B
+CE3D CE57
+CE59 CE73
+CE75 CE8F
+CE91 CEAB
+CEAD CEC7
+CEC9 CEE3
+CEE5 CEFF
+CF01 CF1B
+CF1D CF37
+CF39 CF53
+CF55 CF6F
+CF71 CF8B
+CF8D CFA7
+CFA9 CFC3
+CFC5 CFDF
+CFE1 CFFB
+CFFD D017
+D019 D033
+D035 D04F
+D051 D06B
+D06D D087
+D089 D0A3
+D0A5 D0BF
+D0C1 D0DB
+D0DD D0F7
+D0F9 D113
+D115 D12F
+D131 D14B
+D14D D167
+D169 D183
+D185 D19F
+D1A1 D1BB
+D1BD D1D7
+D1D9 D1F3
+D1F5 D20F
+D211 D22B
+D22D D247
+D249 D263
+D265 D27F
+D281 D29B
+D29D D2B7
+D2B9 D2D3
+D2D5 D2EF
+D2F1 D30B
+D30D D327
+D329 D343
+D345 D35F
+D361 D37B
+D37D D397
+D399 D3B3
+D3B5 D3CF
+D3D1 D3EB
+D3ED D407
+D409 D423
+D425 D43F
+D441 D45B
+D45D D477
+D479 D493
+D495 D4AF
+D4B1 D4CB
+D4CD D4E7
+D4E9 D503
+D505 D51F
+D521 D53B
+D53D D557
+D559 D573
+D575 D58F
+D591 D5AB
+D5AD D5C7
+D5C9 D5E3
+D5E5 D5FF
+D601 D61B
+D61D D637
+D639 D653
+D655 D66F
+D671 D68B
+D68D D6A7
+D6A9 D6C3
+D6C5 D6DF
+D6E1 D6FB
+D6FD D717
+D719 D733
+D735 D74F
+D751 D76B
+D76D D787
+D789 D7A3
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/T.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/T.pl
new file mode 100755
index 00000000000..a047c0cd05c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/T.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# HangulSyllableType category 'Trailing_Jamo'
+#
+return <<'END';
+11A8 11F9
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/V.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/V.pl
new file mode 100755
index 00000000000..1b6f81a0e3c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/hst/V.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# HangulSyllableType category 'Vowel_Jamo'
+#
+return <<'END';
+1160 11A2
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/jt/C.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/jt/C.pl
new file mode 100755
index 00000000000..5315be1b11e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/jt/C.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# JoiningType category 'Join_Causing'
+#
+return <<'END';
+0640
+07FA
+200D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/jt/D.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/jt/D.pl
new file mode 100755
index 00000000000..633ff249b94
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/jt/D.pl
@@ -0,0 +1,41 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# JoiningType category 'Dual_Joining'
+#
+return <<'END';
+0626
+0628
+062A 062E
+0633 063F
+0641 0647
+0649 064A
+066E 066F
+0678 0687
+069A 06BF
+06C1 06C2
+06CC
+06CE
+06D0 06D1
+06FA 06FC
+06FF
+0712 0714
+071A 071D
+071F 0727
+0729
+072B
+072D 072E
+074E 0758
+075C 076A
+076D 0770
+0772
+0775 0777
+077A 077F
+07CA 07EA
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/jt/R.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/jt/R.pl
new file mode 100755
index 00000000000..71df3139d90
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/jt/R.pl
@@ -0,0 +1,41 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# JoiningType category 'Right_Joining'
+#
+return <<'END';
+0622 0625
+0627
+0629
+062F 0632
+0648
+0671 0673
+0675 0677
+0688 0699
+06C0
+06C3 06CB
+06CD
+06CF
+06D2 06D3
+06D5
+06EE 06EF
+0710
+0715 0719
+071E
+0728
+072A
+072C
+072F
+074D
+0759 075B
+076B 076C
+0771
+0773 0774
+0778 0779
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/jt/U.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/jt/U.pl
new file mode 100755
index 00000000000..b482d59743b
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/jt/U.pl
@@ -0,0 +1,20 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# JoiningType category 'Non_Joining'
+#
+return <<'END';
+0600 0603
+0608
+060B
+0621
+0674
+06DD
+200C
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/AI.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/AI.pl
new file mode 100755
index 00000000000..60acb3ae4a6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/AI.pl
@@ -0,0 +1,104 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Ambiguous'
+#
+return <<'END';
+00A7 00A8
+00AA
+00B2 00B3
+00B6 00BA
+00BC 00BE
+00D7
+00F7
+02C7
+02C9 02CB
+02CD
+02D0
+02D8 02DB
+02DD
+2015 2016
+2020 2021
+203B
+2074
+207F
+2081 2084
+2105
+2113
+2121 2122
+212B
+2154 2155
+215B
+215E
+2160 216B
+2170 2179
+2190 2199
+21D2
+21D4
+2200
+2202 2203
+2207 2208
+220B
+220F
+2211
+2215
+221A
+221D 2220
+2223
+2225
+2227 222C
+222E
+2234 2237
+223C 223D
+2248
+224C
+2252
+2260 2261
+2264 2267
+226A 226B
+226E 226F
+2282 2283
+2286 2287
+2295
+2299
+22A5
+22BF
+2312
+2460 24FE
+2500 254B
+2550 2574
+2580 258F
+2592 2595
+25A0 25A1
+25A3 25A9
+25B2 25B3
+25B6 25B7
+25BC 25BD
+25C0 25C1
+25C6 25C8
+25CB
+25CE 25D1
+25E2 25E5
+25EF
+2605 2606
+2609
+260E 260F
+2614 2617
+261C
+261E
+2640
+2642
+2660 2661
+2663 2665
+2667 266A
+266C 266D
+266F
+2776 2793
+FFFD
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/AL.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/AL.pl
new file mode 100755
index 00000000000..345e48fb432
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/AL.pl
@@ -0,0 +1,501 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Alphabetic'
+#
+return <<'END';
+0023
+0026
+002A
+003C 003E
+0040 005A
+005E 007A
+007E
+00A6
+00A9
+00AC
+00AE 00AF
+00B5
+00C0 00D6
+00D8 00F6
+00F8 02C6
+02CE 02CF
+02D1 02D7
+02DC
+02DE
+02E0 02FF
+0370 0377
+037A 037D
+0384 038A
+038C
+038E 03A1
+03A3 0482
+048A 0523
+0531 0556
+0559 055F
+0561 0587
+05C0
+05C3
+05D0 05EA
+05F0 05F4
+0600 0603
+0606 0608
+060E 060F
+0621 064A
+066D 066F
+0671 06D3
+06D5
+06DD
+06E5 06E6
+06E9
+06EE 06EF
+06FA 070D
+070F 0710
+0712 072F
+074D 07A5
+07B1
+07CA 07EA
+07F4 07F7
+07FA
+0904 0939
+093D
+0950
+0958 0961
+0970 0972
+097B 097F
+0985 098C
+098F 0990
+0993 09A8
+09AA 09B0
+09B2
+09B6 09B9
+09BD
+09CE
+09DC 09DD
+09DF 09E1
+09F0 09F1
+09F4 09FA
+0A05 0A0A
+0A0F 0A10
+0A13 0A28
+0A2A 0A30
+0A32 0A33
+0A35 0A36
+0A38 0A39
+0A59 0A5C
+0A5E
+0A72 0A74
+0A85 0A8D
+0A8F 0A91
+0A93 0AA8
+0AAA 0AB0
+0AB2 0AB3
+0AB5 0AB9
+0ABD
+0AD0
+0AE0 0AE1
+0B05 0B0C
+0B0F 0B10
+0B13 0B28
+0B2A 0B30
+0B32 0B33
+0B35 0B39
+0B3D
+0B5C 0B5D
+0B5F 0B61
+0B70 0B71
+0B83
+0B85 0B8A
+0B8E 0B90
+0B92 0B95
+0B99 0B9A
+0B9C
+0B9E 0B9F
+0BA3 0BA4
+0BA8 0BAA
+0BAE 0BB9
+0BD0
+0BF0 0BF8
+0BFA
+0C05 0C0C
+0C0E 0C10
+0C12 0C28
+0C2A 0C33
+0C35 0C39
+0C3D
+0C58 0C59
+0C60 0C61
+0C78 0C7F
+0C85 0C8C
+0C8E 0C90
+0C92 0CA8
+0CAA 0CB3
+0CB5 0CB9
+0CBD
+0CDE
+0CE0 0CE1
+0CF1 0CF2
+0D05 0D0C
+0D0E 0D10
+0D12 0D28
+0D2A 0D39
+0D3D
+0D60 0D61
+0D70 0D75
+0D7A 0D7F
+0D85 0D96
+0D9A 0DB1
+0DB3 0DBB
+0DBD
+0DC0 0DC6
+0DF4
+0E4F
+0F00
+0F05
+0F13
+0F15 0F17
+0F1A 0F1F
+0F2A 0F33
+0F36
+0F38
+0F40 0F47
+0F49 0F6C
+0F88 0F8B
+0FC0 0FC5
+0FC7 0FCC
+0FCE 0FCF
+0FD4
+104C 104F
+10A0 10C5
+10D0 10FC
+1200 1248
+124A 124D
+1250 1256
+1258
+125A 125D
+1260 1288
+128A 128D
+1290 12B0
+12B2 12B5
+12B8 12BE
+12C0
+12C2 12C5
+12C8 12D6
+12D8 1310
+1312 1315
+1318 135A
+1360
+1362 137C
+1380 1399
+13A0 13F4
+1401 1676
+1681 169A
+16A0 16EA
+16EE 16F0
+1700 170C
+170E 1711
+1720 1731
+1740 1751
+1760 176C
+176E 1770
+17D9
+17F0 17F9
+1800 1801
+1807
+180A
+1820 1877
+1880 18A8
+18AA
+1900 191C
+1940
+19E0 1A16
+1A1E 1A1F
+1B05 1B33
+1B45 1B4B
+1B61 1B6A
+1B74 1B7C
+1B83 1BA0
+1BAE 1BAF
+1C00 1C23
+1C4D 1C4F
+1C5A 1C7D
+1D00 1DBF
+1E00 1F15
+1F18 1F1D
+1F20 1F45
+1F48 1F4D
+1F50 1F57
+1F59
+1F5B
+1F5D
+1F5F 1F7D
+1F80 1FB4
+1FB6 1FC4
+1FC6 1FD3
+1FD6 1FDB
+1FDD 1FEF
+1FF2 1FF4
+1FF6 1FFC
+1FFE
+2017
+2022 2023
+2038
+203E 2043
+204A 2055
+2057
+205C
+2061 2064
+2070 2071
+2075 207C
+2080
+2085 208C
+2090 2094
+2100 2102
+2104
+2106 2108
+210A 2112
+2114 2115
+2117 2120
+2123 212A
+212C 214F
+2153
+2156 215A
+215C 215D
+215F
+216C 216F
+217A 2188
+219A 21D1
+21D3
+21D5 21FF
+2201
+2204 2206
+2209 220A
+220C 220E
+2210
+2214
+2216 2219
+221B 221C
+2221 2222
+2224
+2226
+222D
+222F 2233
+2238 223B
+223E 2247
+2249 224B
+224D 2251
+2253 225F
+2262 2263
+2268 2269
+226C 226D
+2270 2281
+2284 2285
+2288 2294
+2296 2298
+229A 22A4
+22A6 22BE
+22C0 2311
+2313 2328
+232B 23E7
+2400 2426
+2440 244A
+24FF
+254C 254F
+2575 257F
+2590 2591
+2596 259F
+25A2
+25AA 25B1
+25B4 25B5
+25B8 25BB
+25BE 25BF
+25C2 25C5
+25C9 25CA
+25CC 25CD
+25D2 25E1
+25E6 25EE
+25F0 2604
+2607 2608
+260A 260D
+2610 2613
+2618 261B
+261D
+261F 263F
+2641
+2643 265F
+2662
+2666
+266B
+266E
+2670 269D
+26A0 26BC
+26C0 26C3
+2701 2704
+2706 2709
+270C 2727
+2729 274B
+274D
+274F 2752
+2756
+2758 275A
+2761
+2764 2767
+2794
+2798 27AF
+27B1 27BE
+27C0 27C4
+27C7 27CA
+27CC
+27D0 27E5
+27F0 2982
+2999 29D7
+29DC 29FB
+29FE 2B4C
+2B50 2B54
+2C00 2C2E
+2C30 2C5E
+2C60 2C6F
+2C71 2C7D
+2C80 2CEA
+2CFD
+2D00 2D25
+2D30 2D65
+2D6F
+2D80 2D96
+2DA0 2DA6
+2DA8 2DAE
+2DB0 2DB6
+2DB8 2DBE
+2DC0 2DC6
+2DC8 2DCE
+2DD0 2DD6
+2DD8 2DDE
+2E16
+2E1A 2E1B
+2E1E 2E1F
+2E2F
+4DC0 4DFF
+A500 A60C
+A610 A61F
+A62A A62B
+A640 A65F
+A662 A66E
+A673
+A67E A697
+A700 A78C
+A7FB A801
+A803 A805
+A807 A80A
+A80C A822
+A828 A82B
+A840 A873
+A882 A8B3
+A90A A925
+A930 A946
+A95F
+AA00 AA28
+AA40 AA42
+AA44 AA4B
+AA5C
+FB00 FB06
+FB13 FB17
+FB1D
+FB1F FB36
+FB38 FB3C
+FB3E
+FB40 FB41
+FB43 FB44
+FB46 FBB1
+FBD3 FD3D
+FD50 FD8F
+FD92 FDC7
+FDF0 FDFB
+FDFD
+FE70 FE74
+FE76 FEFC
+FF66
+FF71 FF9D
+FFA0 FFBE
+FFC2 FFC7
+FFCA FFCF
+FFD2 FFD7
+FFDA FFDC
+FFE8 FFEE
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10107 10133
+10137 1018A
+10190 1019B
+101D0 101FC
+10280 1029C
+102A0 102D0
+10300 1031E
+10320 10323
+10330 1034A
+10380 1039D
+103A0 103C3
+103C8 103CF
+103D1 103D5
+10400 1049D
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
+10900 10919
+10920 10939
+1093F
+10A00
+10A10 10A13
+10A15 10A17
+10A19 10A33
+10A40 10A47
+10A58
+12000 1236E
+12400 12462
+1D000 1D0F5
+1D100 1D126
+1D129 1D164
+1D16A 1D16C
+1D183 1D184
+1D18C 1D1A9
+1D1AE 1D1DD
+1D200 1D241
+1D245
+1D300 1D356
+1D360 1D371
+1D400 1D454
+1D456 1D49C
+1D49E 1D49F
+1D4A2
+1D4A5 1D4A6
+1D4A9 1D4AC
+1D4AE 1D4B9
+1D4BB
+1D4BD 1D4C3
+1D4C5 1D505
+1D507 1D50A
+1D50D 1D514
+1D516 1D51C
+1D51E 1D539
+1D53B 1D53E
+1D540 1D544
+1D546
+1D54A 1D550
+1D552 1D6A5
+1D6A8 1D7CB
+1F000 1F02B
+1F030 1F093
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/B2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/B2.pl
new file mode 100755
index 00000000000..3b7c11eeb41
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/B2.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Break_Both'
+#
+return <<'END';
+2014
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/BA.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/BA.pl
new file mode 100755
index 00000000000..496b6172a69
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/BA.pl
@@ -0,0 +1,64 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Break_After'
+#
+return <<'END';
+0009
+007C
+00AD
+058A
+05BE
+0964 0965
+0E5A 0E5B
+0F0B
+0F34
+0F7F
+0F85
+0FBE 0FBF
+0FD2
+104A 104B
+1361
+1680
+16EB 16ED
+1735 1736
+17D4 17D5
+17D8
+17DA
+1804 1805
+1B5A 1B60
+1C3B 1C3F
+1C7E 1C7F
+2000 2006
+2008 200A
+2010
+2012 2013
+2027
+2056
+2058 205B
+205D 205F
+2CFA 2CFC
+2CFF
+2E0E 2E15
+2E17
+2E19
+2E2A 2E2D
+2E30
+A60D
+A60F
+A8CE A8CF
+A92E A92F
+AA5D AA5F
+10100 10102
+1039F
+103D0
+1091F
+10A50 10A57
+12470 12473
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/BB.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/BB.pl
new file mode 100755
index 00000000000..b658d32b0ad
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/BB.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Break_Before'
+#
+return <<'END';
+00B4
+02C8
+02CC
+02DF
+0F01 0F04
+0F06 0F07
+0F09 0F0A
+0FD0 0FD1
+0FD3
+1806
+1FFD
+A874 A875
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/BK.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/BK.pl
new file mode 100755
index 00000000000..fdc6302824c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/BK.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Mandatory_Break'
+#
+return <<'END';
+000B 000C
+2028 2029
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/CB.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/CB.pl
new file mode 100755
index 00000000000..d23064b771a
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/CB.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Contingent_Break'
+#
+return <<'END';
+FFFC
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/CL.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/CL.pl
new file mode 100755
index 00000000000..fb9aa0bdda7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/CL.pl
@@ -0,0 +1,89 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Close_Punctuation'
+#
+return <<'END';
+0029
+005D
+007D
+0F3B
+0F3D
+169C
+2046
+207E
+208E
+232A
+2769
+276B
+276D
+276F
+2771
+2773
+2775
+27C6
+27E7
+27E9
+27EB
+27ED
+27EF
+2984
+2986
+2988
+298A
+298C
+298E
+2990
+2992
+2994
+2996
+2998
+29D9
+29DB
+29FD
+2E23
+2E25
+2E27
+2E29
+3001 3002
+3009
+300B
+300D
+300F
+3011
+3015
+3017
+3019
+301B
+301E 301F
+FD3F
+FE11 FE12
+FE18
+FE36
+FE38
+FE3A
+FE3C
+FE3E
+FE40
+FE42
+FE44
+FE48
+FE50
+FE52
+FE5A
+FE5C
+FE5E
+FF09
+FF0C
+FF0E
+FF3D
+FF5D
+FF60 FF61
+FF63 FF64
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/CM.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/CM.pl
new file mode 100755
index 00000000000..f8bed223fb3
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/CM.pl
@@ -0,0 +1,167 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Combining_Mark'
+#
+return <<'END';
+0000 0008
+000E 001F
+007F 0084
+0086 009F
+0300 034E
+0350 035B
+0363 036F
+0483 0489
+0591 05BD
+05BF
+05C1 05C2
+05C4 05C5
+05C7
+0610 061A
+064B 065E
+0670
+06D6 06DC
+06DE 06E4
+06E7 06E8
+06EA 06ED
+0711
+0730 074A
+07A6 07B0
+07EB 07F3
+0901 0903
+093C
+093E 094D
+0951 0954
+0962 0963
+0981 0983
+09BC
+09BE 09C4
+09C7 09C8
+09CB 09CD
+09D7
+09E2 09E3
+0A01 0A03
+0A3C
+0A3E 0A42
+0A47 0A48
+0A4B 0A4D
+0A51
+0A70 0A71
+0A75
+0A81 0A83
+0ABC
+0ABE 0AC5
+0AC7 0AC9
+0ACB 0ACD
+0AE2 0AE3
+0B01 0B03
+0B3C
+0B3E 0B44
+0B47 0B48
+0B4B 0B4D
+0B56 0B57
+0B62 0B63
+0B82
+0BBE 0BC2
+0BC6 0BC8
+0BCA 0BCD
+0BD7
+0C01 0C03
+0C3E 0C44
+0C46 0C48
+0C4A 0C4D
+0C55 0C56
+0C62 0C63
+0C82 0C83
+0CBC
+0CBE 0CC4
+0CC6 0CC8
+0CCA 0CCD
+0CD5 0CD6
+0CE2 0CE3
+0D02 0D03
+0D3E 0D44
+0D46 0D48
+0D4A 0D4D
+0D57
+0D62 0D63
+0D82 0D83
+0DCA
+0DCF 0DD4
+0DD6
+0DD8 0DDF
+0DF2 0DF3
+0F18 0F19
+0F35
+0F37
+0F39
+0F3E 0F3F
+0F71 0F7E
+0F80 0F84
+0F86 0F87
+0F90 0F97
+0F99 0FBC
+0FC6
+135F
+1712 1714
+1732 1734
+1752 1753
+1772 1773
+180B 180D
+18A9
+1920 192B
+1930 193B
+1A17 1A1B
+1B00 1B04
+1B34 1B44
+1B6B 1B73
+1B80 1B82
+1BA1 1BAA
+1C24 1C37
+1DC0 1DE6
+1DFE 1DFF
+200C 200F
+202A 202E
+206A 206F
+20D0 20F0
+2DE0 2DFF
+302A 302F
+3099 309A
+A66F A672
+A67C A67D
+A802
+A806
+A80B
+A823 A827
+A880 A881
+A8B4 A8C4
+A926 A92D
+A947 A953
+AA29 AA36
+AA43
+AA4C AA4D
+FB1E
+FE00 FE0F
+FE20 FE26
+FFF9 FFFB
+101FD
+10A01 10A03
+10A05 10A06
+10A0C 10A0F
+10A38 10A3A
+10A3F
+1D165 1D169
+1D16D 1D182
+1D185 1D18B
+1D1AA 1D1AD
+1D242 1D244
+E0001
+E0020 E007F
+E0100 E01EF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/CR.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/CR.pl
new file mode 100755
index 00000000000..2c87105fbef
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/CR.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Carriage_Return'
+#
+return <<'END';
+000D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/EX.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/EX.pl
new file mode 100755
index 00000000000..657b5c4c1eb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/EX.pl
@@ -0,0 +1,35 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Exclamation'
+#
+return <<'END';
+0021
+003F
+05C6
+061B
+061E 061F
+06D4
+07F9
+0F0D 0F11
+0F14
+1802 1803
+1808 1809
+1944 1945
+2762 2763
+2CF9
+2CFE
+2E2E
+A60E
+A876 A877
+FE15 FE16
+FE56 FE57
+FF01
+FF1F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/GL.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/GL.pl
new file mode 100755
index 00000000000..bafa66a5864
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/GL.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Glue'
+#
+return <<'END';
+00A0
+034F
+035C 0362
+0F08
+0F0C
+0F12
+180E
+2007
+2011
+202F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/H2.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/H2.pl
new file mode 100755
index 00000000000..248266468b7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/H2.pl
@@ -0,0 +1,412 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'H2'
+#
+return <<'END';
+AC00
+AC1C
+AC38
+AC54
+AC70
+AC8C
+ACA8
+ACC4
+ACE0
+ACFC
+AD18
+AD34
+AD50
+AD6C
+AD88
+ADA4
+ADC0
+ADDC
+ADF8
+AE14
+AE30
+AE4C
+AE68
+AE84
+AEA0
+AEBC
+AED8
+AEF4
+AF10
+AF2C
+AF48
+AF64
+AF80
+AF9C
+AFB8
+AFD4
+AFF0
+B00C
+B028
+B044
+B060
+B07C
+B098
+B0B4
+B0D0
+B0EC
+B108
+B124
+B140
+B15C
+B178
+B194
+B1B0
+B1CC
+B1E8
+B204
+B220
+B23C
+B258
+B274
+B290
+B2AC
+B2C8
+B2E4
+B300
+B31C
+B338
+B354
+B370
+B38C
+B3A8
+B3C4
+B3E0
+B3FC
+B418
+B434
+B450
+B46C
+B488
+B4A4
+B4C0
+B4DC
+B4F8
+B514
+B530
+B54C
+B568
+B584
+B5A0
+B5BC
+B5D8
+B5F4
+B610
+B62C
+B648
+B664
+B680
+B69C
+B6B8
+B6D4
+B6F0
+B70C
+B728
+B744
+B760
+B77C
+B798
+B7B4
+B7D0
+B7EC
+B808
+B824
+B840
+B85C
+B878
+B894
+B8B0
+B8CC
+B8E8
+B904
+B920
+B93C
+B958
+B974
+B990
+B9AC
+B9C8
+B9E4
+BA00
+BA1C
+BA38
+BA54
+BA70
+BA8C
+BAA8
+BAC4
+BAE0
+BAFC
+BB18
+BB34
+BB50
+BB6C
+BB88
+BBA4
+BBC0
+BBDC
+BBF8
+BC14
+BC30
+BC4C
+BC68
+BC84
+BCA0
+BCBC
+BCD8
+BCF4
+BD10
+BD2C
+BD48
+BD64
+BD80
+BD9C
+BDB8
+BDD4
+BDF0
+BE0C
+BE28
+BE44
+BE60
+BE7C
+BE98
+BEB4
+BED0
+BEEC
+BF08
+BF24
+BF40
+BF5C
+BF78
+BF94
+BFB0
+BFCC
+BFE8
+C004
+C020
+C03C
+C058
+C074
+C090
+C0AC
+C0C8
+C0E4
+C100
+C11C
+C138
+C154
+C170
+C18C
+C1A8
+C1C4
+C1E0
+C1FC
+C218
+C234
+C250
+C26C
+C288
+C2A4
+C2C0
+C2DC
+C2F8
+C314
+C330
+C34C
+C368
+C384
+C3A0
+C3BC
+C3D8
+C3F4
+C410
+C42C
+C448
+C464
+C480
+C49C
+C4B8
+C4D4
+C4F0
+C50C
+C528
+C544
+C560
+C57C
+C598
+C5B4
+C5D0
+C5EC
+C608
+C624
+C640
+C65C
+C678
+C694
+C6B0
+C6CC
+C6E8
+C704
+C720
+C73C
+C758
+C774
+C790
+C7AC
+C7C8
+C7E4
+C800
+C81C
+C838
+C854
+C870
+C88C
+C8A8
+C8C4
+C8E0
+C8FC
+C918
+C934
+C950
+C96C
+C988
+C9A4
+C9C0
+C9DC
+C9F8
+CA14
+CA30
+CA4C
+CA68
+CA84
+CAA0
+CABC
+CAD8
+CAF4
+CB10
+CB2C
+CB48
+CB64
+CB80
+CB9C
+CBB8
+CBD4
+CBF0
+CC0C
+CC28
+CC44
+CC60
+CC7C
+CC98
+CCB4
+CCD0
+CCEC
+CD08
+CD24
+CD40
+CD5C
+CD78
+CD94
+CDB0
+CDCC
+CDE8
+CE04
+CE20
+CE3C
+CE58
+CE74
+CE90
+CEAC
+CEC8
+CEE4
+CF00
+CF1C
+CF38
+CF54
+CF70
+CF8C
+CFA8
+CFC4
+CFE0
+CFFC
+D018
+D034
+D050
+D06C
+D088
+D0A4
+D0C0
+D0DC
+D0F8
+D114
+D130
+D14C
+D168
+D184
+D1A0
+D1BC
+D1D8
+D1F4
+D210
+D22C
+D248
+D264
+D280
+D29C
+D2B8
+D2D4
+D2F0
+D30C
+D328
+D344
+D360
+D37C
+D398
+D3B4
+D3D0
+D3EC
+D408
+D424
+D440
+D45C
+D478
+D494
+D4B0
+D4CC
+D4E8
+D504
+D520
+D53C
+D558
+D574
+D590
+D5AC
+D5C8
+D5E4
+D600
+D61C
+D638
+D654
+D670
+D68C
+D6A8
+D6C4
+D6E0
+D6FC
+D718
+D734
+D750
+D76C
+D788
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/H3.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/H3.pl
new file mode 100755
index 00000000000..ae4653030bb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/H3.pl
@@ -0,0 +1,412 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'H3'
+#
+return <<'END';
+AC01 AC1B
+AC1D AC37
+AC39 AC53
+AC55 AC6F
+AC71 AC8B
+AC8D ACA7
+ACA9 ACC3
+ACC5 ACDF
+ACE1 ACFB
+ACFD AD17
+AD19 AD33
+AD35 AD4F
+AD51 AD6B
+AD6D AD87
+AD89 ADA3
+ADA5 ADBF
+ADC1 ADDB
+ADDD ADF7
+ADF9 AE13
+AE15 AE2F
+AE31 AE4B
+AE4D AE67
+AE69 AE83
+AE85 AE9F
+AEA1 AEBB
+AEBD AED7
+AED9 AEF3
+AEF5 AF0F
+AF11 AF2B
+AF2D AF47
+AF49 AF63
+AF65 AF7F
+AF81 AF9B
+AF9D AFB7
+AFB9 AFD3
+AFD5 AFEF
+AFF1 B00B
+B00D B027
+B029 B043
+B045 B05F
+B061 B07B
+B07D B097
+B099 B0B3
+B0B5 B0CF
+B0D1 B0EB
+B0ED B107
+B109 B123
+B125 B13F
+B141 B15B
+B15D B177
+B179 B193
+B195 B1AF
+B1B1 B1CB
+B1CD B1E7
+B1E9 B203
+B205 B21F
+B221 B23B
+B23D B257
+B259 B273
+B275 B28F
+B291 B2AB
+B2AD B2C7
+B2C9 B2E3
+B2E5 B2FF
+B301 B31B
+B31D B337
+B339 B353
+B355 B36F
+B371 B38B
+B38D B3A7
+B3A9 B3C3
+B3C5 B3DF
+B3E1 B3FB
+B3FD B417
+B419 B433
+B435 B44F
+B451 B46B
+B46D B487
+B489 B4A3
+B4A5 B4BF
+B4C1 B4DB
+B4DD B4F7
+B4F9 B513
+B515 B52F
+B531 B54B
+B54D B567
+B569 B583
+B585 B59F
+B5A1 B5BB
+B5BD B5D7
+B5D9 B5F3
+B5F5 B60F
+B611 B62B
+B62D B647
+B649 B663
+B665 B67F
+B681 B69B
+B69D B6B7
+B6B9 B6D3
+B6D5 B6EF
+B6F1 B70B
+B70D B727
+B729 B743
+B745 B75F
+B761 B77B
+B77D B797
+B799 B7B3
+B7B5 B7CF
+B7D1 B7EB
+B7ED B807
+B809 B823
+B825 B83F
+B841 B85B
+B85D B877
+B879 B893
+B895 B8AF
+B8B1 B8CB
+B8CD B8E7
+B8E9 B903
+B905 B91F
+B921 B93B
+B93D B957
+B959 B973
+B975 B98F
+B991 B9AB
+B9AD B9C7
+B9C9 B9E3
+B9E5 B9FF
+BA01 BA1B
+BA1D BA37
+BA39 BA53
+BA55 BA6F
+BA71 BA8B
+BA8D BAA7
+BAA9 BAC3
+BAC5 BADF
+BAE1 BAFB
+BAFD BB17
+BB19 BB33
+BB35 BB4F
+BB51 BB6B
+BB6D BB87
+BB89 BBA3
+BBA5 BBBF
+BBC1 BBDB
+BBDD BBF7
+BBF9 BC13
+BC15 BC2F
+BC31 BC4B
+BC4D BC67
+BC69 BC83
+BC85 BC9F
+BCA1 BCBB
+BCBD BCD7
+BCD9 BCF3
+BCF5 BD0F
+BD11 BD2B
+BD2D BD47
+BD49 BD63
+BD65 BD7F
+BD81 BD9B
+BD9D BDB7
+BDB9 BDD3
+BDD5 BDEF
+BDF1 BE0B
+BE0D BE27
+BE29 BE43
+BE45 BE5F
+BE61 BE7B
+BE7D BE97
+BE99 BEB3
+BEB5 BECF
+BED1 BEEB
+BEED BF07
+BF09 BF23
+BF25 BF3F
+BF41 BF5B
+BF5D BF77
+BF79 BF93
+BF95 BFAF
+BFB1 BFCB
+BFCD BFE7
+BFE9 C003
+C005 C01F
+C021 C03B
+C03D C057
+C059 C073
+C075 C08F
+C091 C0AB
+C0AD C0C7
+C0C9 C0E3
+C0E5 C0FF
+C101 C11B
+C11D C137
+C139 C153
+C155 C16F
+C171 C18B
+C18D C1A7
+C1A9 C1C3
+C1C5 C1DF
+C1E1 C1FB
+C1FD C217
+C219 C233
+C235 C24F
+C251 C26B
+C26D C287
+C289 C2A3
+C2A5 C2BF
+C2C1 C2DB
+C2DD C2F7
+C2F9 C313
+C315 C32F
+C331 C34B
+C34D C367
+C369 C383
+C385 C39F
+C3A1 C3BB
+C3BD C3D7
+C3D9 C3F3
+C3F5 C40F
+C411 C42B
+C42D C447
+C449 C463
+C465 C47F
+C481 C49B
+C49D C4B7
+C4B9 C4D3
+C4D5 C4EF
+C4F1 C50B
+C50D C527
+C529 C543
+C545 C55F
+C561 C57B
+C57D C597
+C599 C5B3
+C5B5 C5CF
+C5D1 C5EB
+C5ED C607
+C609 C623
+C625 C63F
+C641 C65B
+C65D C677
+C679 C693
+C695 C6AF
+C6B1 C6CB
+C6CD C6E7
+C6E9 C703
+C705 C71F
+C721 C73B
+C73D C757
+C759 C773
+C775 C78F
+C791 C7AB
+C7AD C7C7
+C7C9 C7E3
+C7E5 C7FF
+C801 C81B
+C81D C837
+C839 C853
+C855 C86F
+C871 C88B
+C88D C8A7
+C8A9 C8C3
+C8C5 C8DF
+C8E1 C8FB
+C8FD C917
+C919 C933
+C935 C94F
+C951 C96B
+C96D C987
+C989 C9A3
+C9A5 C9BF
+C9C1 C9DB
+C9DD C9F7
+C9F9 CA13
+CA15 CA2F
+CA31 CA4B
+CA4D CA67
+CA69 CA83
+CA85 CA9F
+CAA1 CABB
+CABD CAD7
+CAD9 CAF3
+CAF5 CB0F
+CB11 CB2B
+CB2D CB47
+CB49 CB63
+CB65 CB7F
+CB81 CB9B
+CB9D CBB7
+CBB9 CBD3
+CBD5 CBEF
+CBF1 CC0B
+CC0D CC27
+CC29 CC43
+CC45 CC5F
+CC61 CC7B
+CC7D CC97
+CC99 CCB3
+CCB5 CCCF
+CCD1 CCEB
+CCED CD07
+CD09 CD23
+CD25 CD3F
+CD41 CD5B
+CD5D CD77
+CD79 CD93
+CD95 CDAF
+CDB1 CDCB
+CDCD CDE7
+CDE9 CE03
+CE05 CE1F
+CE21 CE3B
+CE3D CE57
+CE59 CE73
+CE75 CE8F
+CE91 CEAB
+CEAD CEC7
+CEC9 CEE3
+CEE5 CEFF
+CF01 CF1B
+CF1D CF37
+CF39 CF53
+CF55 CF6F
+CF71 CF8B
+CF8D CFA7
+CFA9 CFC3
+CFC5 CFDF
+CFE1 CFFB
+CFFD D017
+D019 D033
+D035 D04F
+D051 D06B
+D06D D087
+D089 D0A3
+D0A5 D0BF
+D0C1 D0DB
+D0DD D0F7
+D0F9 D113
+D115 D12F
+D131 D14B
+D14D D167
+D169 D183
+D185 D19F
+D1A1 D1BB
+D1BD D1D7
+D1D9 D1F3
+D1F5 D20F
+D211 D22B
+D22D D247
+D249 D263
+D265 D27F
+D281 D29B
+D29D D2B7
+D2B9 D2D3
+D2D5 D2EF
+D2F1 D30B
+D30D D327
+D329 D343
+D345 D35F
+D361 D37B
+D37D D397
+D399 D3B3
+D3B5 D3CF
+D3D1 D3EB
+D3ED D407
+D409 D423
+D425 D43F
+D441 D45B
+D45D D477
+D479 D493
+D495 D4AF
+D4B1 D4CB
+D4CD D4E7
+D4E9 D503
+D505 D51F
+D521 D53B
+D53D D557
+D559 D573
+D575 D58F
+D591 D5AB
+D5AD D5C7
+D5C9 D5E3
+D5E5 D5FF
+D601 D61B
+D61D D637
+D639 D653
+D655 D66F
+D671 D68B
+D68D D6A7
+D6A9 D6C3
+D6C5 D6DF
+D6E1 D6FB
+D6FD D717
+D719 D733
+D735 D74F
+D751 D76B
+D76D D787
+D789 D7A3
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/HY.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/HY.pl
new file mode 100755
index 00000000000..8ec58d61f4e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/HY.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Hyphen'
+#
+return <<'END';
+002D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/ID.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/ID.pl
new file mode 100755
index 00000000000..e16466fb57c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/ID.pl
@@ -0,0 +1,84 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Ideographic'
+#
+return <<'END';
+2E80 2E99
+2E9B 2EF3
+2F00 2FD5
+2FF0 2FFB
+3000
+3003 3004
+3006 3007
+3012 3013
+3020 3029
+3030 303A
+303D 303F
+3042
+3044
+3046
+3048
+304A 3062
+3064 3082
+3084
+3086
+3088 308D
+308F 3094
+309F
+30A2
+30A4
+30A6
+30A8
+30AA 30C2
+30C4 30E2
+30E4
+30E6
+30E8 30ED
+30EF 30F4
+30F7 30FA
+30FF
+3105 312D
+3131 318E
+3190 31B7
+31C0 31E3
+3200 321E
+3220 3243
+3250 32FE
+3300 4DB5
+4E00 9FC3
+A000 A014
+A016 A48C
+A490 A4C6
+F900 FA2D
+FA30 FA6A
+FA70 FAD9
+FE30 FE34
+FE45 FE46
+FE49 FE4F
+FE51
+FE58
+FE5F FE66
+FE68
+FE6B
+FF02 FF03
+FF06 FF07
+FF0A FF0B
+FF0D
+FF0F FF19
+FF1C FF1E
+FF20 FF3A
+FF3C
+FF3E FF5A
+FF5C
+FF5E
+FFE2 FFE4
+20000 2A6D6
+2F800 2FA1D
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/IN.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/IN.pl
new file mode 100755
index 00000000000..f69ce5b8de2
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/IN.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Inseparable'
+#
+return <<'END';
+2024 2026
+FE19
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/IS.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/IS.pl
new file mode 100755
index 00000000000..807399fdf11
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/IS.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Infix_Numeric'
+#
+return <<'END';
+002C
+002E
+003A 003B
+037E
+0589
+060C 060D
+07F8
+2044
+FE10
+FE13 FE14
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/JL.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/JL.pl
new file mode 100755
index 00000000000..f8967a87b48
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/JL.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'JL'
+#
+return <<'END';
+1100 1159
+115F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/JT.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/JT.pl
new file mode 100755
index 00000000000..20c13247c75
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/JT.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'JT'
+#
+return <<'END';
+11A8 11F9
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/JV.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/JV.pl
new file mode 100755
index 00000000000..73f6a92ae08
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/JV.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'JV'
+#
+return <<'END';
+1160 11A2
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/LF.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/LF.pl
new file mode 100755
index 00000000000..6b06381de46
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/LF.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Line_Feed'
+#
+return <<'END';
+000A
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/NL.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/NL.pl
new file mode 100755
index 00000000000..58c709af02e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/NL.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Next_Line'
+#
+return <<'END';
+0085
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/NS.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/NS.pl
new file mode 100755
index 00000000000..ec9c6b66138
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/NS.pl
@@ -0,0 +1,50 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Nonstarter'
+#
+return <<'END';
+17D6
+203C 203D
+2047 2049
+3005
+301C
+303B 303C
+3041
+3043
+3045
+3047
+3049
+3063
+3083
+3085
+3087
+308E
+3095 3096
+309B 309E
+30A0 30A1
+30A3
+30A5
+30A7
+30A9
+30C3
+30E3
+30E5
+30E7
+30EE
+30F5 30F6
+30FB 30FE
+31F0 31FF
+A015
+FE54 FE55
+FF1A FF1B
+FF65
+FF67 FF70
+FF9E FF9F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/NU.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/NU.pl
new file mode 100755
index 00000000000..518b167726d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/NU.pl
@@ -0,0 +1,46 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Numeric'
+#
+return <<'END';
+0030 0039
+0660 0669
+066B 066C
+06F0 06F9
+07C0 07C9
+0966 096F
+09E6 09EF
+0A66 0A6F
+0AE6 0AEF
+0B66 0B6F
+0BE6 0BEF
+0C66 0C6F
+0CE6 0CEF
+0D66 0D6F
+0E50 0E59
+0ED0 0ED9
+0F20 0F29
+1040 1049
+1090 1099
+17E0 17E9
+1810 1819
+1946 194F
+19D0 19D9
+1B50 1B59
+1BB0 1BB9
+1C40 1C49
+1C50 1C59
+A620 A629
+A8D0 A8D9
+A900 A909
+AA50 AA59
+104A0 104A9
+1D7CE 1D7FF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/OP.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/OP.pl
new file mode 100755
index 00000000000..0fc6701551f
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/OP.pl
@@ -0,0 +1,88 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Open_Punctuation'
+#
+return <<'END';
+0028
+005B
+007B
+00A1
+00BF
+0F3A
+0F3C
+169B
+201A
+201E
+2045
+207D
+208D
+2329
+2768
+276A
+276C
+276E
+2770
+2772
+2774
+27C5
+27E6
+27E8
+27EA
+27EC
+27EE
+2983
+2985
+2987
+2989
+298B
+298D
+298F
+2991
+2993
+2995
+2997
+29D8
+29DA
+29FC
+2E18
+2E22
+2E24
+2E26
+2E28
+3008
+300A
+300C
+300E
+3010
+3014
+3016
+3018
+301A
+301D
+FD3E
+FE17
+FE35
+FE37
+FE39
+FE3B
+FE3D
+FE3F
+FE41
+FE43
+FE47
+FE59
+FE5B
+FE5D
+FF08
+FF3B
+FF5B
+FF5F
+FF62
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/PO.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/PO.pl
new file mode 100755
index 00000000000..514d935d7d7
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/PO.pl
@@ -0,0 +1,27 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Postfix_Numeric'
+#
+return <<'END';
+0025
+00A2
+00B0
+0609 060B
+066A
+0D79
+2030 2037
+20A7
+2103
+2109
+FDFC
+FE6A
+FF05
+FFE0
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/PR.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/PR.pl
new file mode 100755
index 00000000000..4b9a086a904
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/PR.pl
@@ -0,0 +1,31 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Prefix_Numeric'
+#
+return <<'END';
+0024
+002B
+005C
+00A3 00A5
+00B1
+09F2 09F3
+0AF1
+0BF9
+0E3F
+17DB
+20A0 20A6
+20A8 20B5
+2116
+2212 2213
+FE69
+FF04
+FFE1
+FFE5 FFE6
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/QU.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/QU.pl
new file mode 100755
index 00000000000..c04eb3365e9
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/QU.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Quotation'
+#
+return <<'END';
+0022
+0027
+00AB
+00BB
+2018 2019
+201B 201D
+201F
+2039 203A
+275B 275E
+2E00 2E0D
+2E1C 2E1D
+2E20 2E21
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/SA.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/SA.pl
new file mode 100755
index 00000000000..8f111036358
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/SA.pl
@@ -0,0 +1,43 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Complex_Context'
+#
+return <<'END';
+0E01 0E3A
+0E40 0E4E
+0E81 0E82
+0E84
+0E87 0E88
+0E8A
+0E8D
+0E94 0E97
+0E99 0E9F
+0EA1 0EA3
+0EA5
+0EA7
+0EAA 0EAB
+0EAD 0EB9
+0EBB 0EBD
+0EC0 0EC4
+0EC6
+0EC8 0ECD
+0EDC 0EDD
+1000 103F
+1050 108F
+109E 109F
+1780 17D3
+17D7
+17DC 17DD
+1950 196D
+1970 1974
+1980 19A9
+19B0 19C9
+19DE 19DF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/SG.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/SG.pl
new file mode 100755
index 00000000000..92754a3d549
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/SG.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Surrogate'
+#
+return <<'END';
+D800 DFFF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/SP.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/SP.pl
new file mode 100755
index 00000000000..8f22f008c0d
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/SP.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Space'
+#
+return <<'END';
+0020
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/SY.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/SY.pl
new file mode 100755
index 00000000000..70659c70b5e
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/SY.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Break_Symbols'
+#
+return <<'END';
+002F
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/WJ.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/WJ.pl
new file mode 100755
index 00000000000..289789a70af
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/WJ.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Word_Joiner'
+#
+return <<'END';
+2060
+FEFF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/XX.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/XX.pl
new file mode 100755
index 00000000000..a71f74a0294
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/XX.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'Unknown'
+#
+return <<'END';
+E000 F8FF
+F0000 FFFFD
+100000 10FFFD
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/ZW.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/ZW.pl
new file mode 100755
index 00000000000..579795508fe
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/lb/ZW.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# Linebreak category 'ZWSpace'
+#
+return <<'END';
+200B
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/nt/De.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/nt/De.pl
new file mode 100755
index 00000000000..ed39f2ef1fb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/nt/De.pl
@@ -0,0 +1,46 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# NumericType category 'Decimal'
+#
+return <<'END';
+0030 0039
+0660 0669
+06F0 06F9
+07C0 07C9
+0966 096F
+09E6 09EF
+0A66 0A6F
+0AE6 0AEF
+0B66 0B6F
+0BE6 0BEF
+0C66 0C6F
+0CE6 0CEF
+0D66 0D6F
+0E50 0E59
+0ED0 0ED9
+0F20 0F29
+1040 1049
+1090 1099
+17E0 17E9
+1810 1819
+1946 194F
+19D0 19D9
+1B50 1B59
+1BB0 1BB9
+1C40 1C49
+1C50 1C59
+A620 A629
+A8D0 A8D9
+A900 A909
+AA50 AA59
+FF10 FF19
+104A0 104A9
+1D7CE 1D7FF
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/nt/Di.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/nt/Di.pl
new file mode 100755
index 00000000000..a8c471da63c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/nt/Di.pl
@@ -0,0 +1,29 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# NumericType category 'Digit'
+#
+return <<'END';
+00B2 00B3
+00B9
+1369 1371
+2070
+2074 2079
+2080 2089
+2460 2468
+2474 247C
+2488 2490
+24EA
+24F5 24FD
+24FF
+2776 277E
+2780 2788
+278A 2792
+10A40 10A43
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/lib/nt/Nu.pl b/Master/tlpkg/tlperl.straw/lib/unicore/lib/nt/Nu.pl
new file mode 100755
index 00000000000..a5666541b41
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/lib/nt/Nu.pl
@@ -0,0 +1,63 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+#
+# NumericType category 'Numeric'
+#
+return <<'END';
+00BC 00BE
+09F4 09F7
+09F9
+0BF0 0BF2
+0C78 0C7E
+0D70 0D75
+0F2A 0F33
+1372 137C
+16EE 16F0
+17F0 17F9
+2153 2182
+2185 2188
+2469 2473
+247D 2487
+2491 249B
+24EB 24F4
+24FE
+277F
+2789
+2793
+2CFD
+3007
+3021 3029
+3038 303A
+3192 3195
+3220 3229
+3251 325F
+3280 3289
+32B1 32BF
+F96B
+F973
+F978
+F9B2
+F9D1
+F9D3
+F9FD
+10107 10133
+10140 10178
+1018A
+10320 10323
+10341
+1034A
+103D1 103D5
+10916 10919
+10A44 10A47
+12400 12431
+12434 12455
+12458 12462
+1D360 1D371
+2F890
+END
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/mktables b/Master/tlpkg/tlperl.straw/lib/unicore/mktables
new file mode 100755
index 00000000000..d15ed913104
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/mktables
@@ -0,0 +1,2326 @@
+## !!!!!!!!!!!!!! IF YOU MODIFY THIS FILE !!!!!!!!!!!!!!!!!!!!!!!!!
+## Any files created or read by this program should be listed in 'mktables.lst'
+
+#!/usr/bin/perl -w
+require 5.008; # Needs pack "U". Probably safest to run on 5.8.x
+use strict;
+use Carp;
+use File::Spec;
+
+##
+## mktables -- create the runtime Perl Unicode files (lib/unicore/**/*.pl)
+## from the Unicode database files (lib/unicore/*.txt).
+##
+
+## "Fuzzy" means this section in Unicode TR18:
+##
+## The recommended names for UCD properties and property values are in
+## PropertyAliases.txt [Prop] and PropertyValueAliases.txt
+## [PropValue]. There are both abbreviated names and longer, more
+## descriptive names. It is strongly recommended that both names be
+## recognized, and that loose matching of property names be used,
+## whereby the case distinctions, whitespace, hyphens, and underbar
+## are ignored.
+
+## Base names already used in lib/gc_sc (for avoiding 8.3 conflicts)
+my %BaseNames;
+
+##
+## Process any args.
+##
+my $Verbose = 0;
+my $MakeTestScript = 0;
+my $AlwaysWrite = 0;
+my $UseDir = "";
+my $FileList = "$0.lst";
+my $MakeList = 0;
+
+while (@ARGV)
+{
+ my $arg = shift @ARGV;
+ if ($arg eq '-v') {
+ $Verbose = 1;
+ } elsif ($arg eq '-q') {
+ $Verbose = 0;
+ } elsif ($arg eq '-w') {
+ $AlwaysWrite = 1; # update the files even if they havent changed
+ $FileList = "";
+ } elsif ($arg eq '-check') {
+ my $this = shift @ARGV;
+ my $ok = shift @ARGV;
+ if ($this ne $ok) {
+ print "Skipping as check params are not the same.\n";
+ exit(0);
+ }
+ } elsif ($arg eq '-maketest') {
+ $MakeTestScript = 1;
+ } elsif ($arg eq '-makelist') {
+ $MakeList = 1;
+ } elsif ($arg eq '-C' && defined ($UseDir = shift)) {
+ -d $UseDir or die "Unknown directory '$UseDir'";
+ } elsif ($arg eq '-L' && defined ($FileList = shift)) {
+ -e $FileList or die "Filelist '$FileList' doesn't appear to exist!";
+ } else {
+ die "usage: $0 [-v|-q|-w|-C dir|-L filelist] [-maketest] [-makelist]\n",
+ " -v : Verbose Mode\n",
+ " -q : Quiet Mode\n",
+ " -w : Write files regardless\n",
+ " -maketest : Make test script\n",
+ " -makelist : Rewrite the file list based on current setup\n",
+ " -L filelist : Use this file list, (defaults to $0.lst)\n",
+ " -C dir : Change to this directory before proceeding\n",
+ " -check A B : Executes only if A and B are the same\n";
+ }
+}
+
+if ($FileList) {
+ print "Reading file list '$FileList'\n"
+ if $Verbose;
+ open my $fh,"<",$FileList or die "Failed to read '$FileList':$!";
+ my @input;
+ my @output;
+ for my $list ( \@input, \@output ) {
+ while (<$fh>) {
+ s/^ \s+ | \s+ $//xg;
+ next if /^ \s* (?: \# .* )? $/x;
+ last if /^ =+ $/x;
+ my ( $file ) = split /\t/, $_;
+ push @$list, $file;
+ }
+ my %dupe;
+ @$list = grep !$dupe{ $_ }++, @$list;
+ }
+ close $fh;
+ die "No input or output files in '$FileList'!"
+ if !@input or !@output;
+ if ( $MakeList ) {
+ foreach my $file (@output) {
+ unlink $file;
+ }
+ }
+ if ( $Verbose ) {
+ print "Expecting ".scalar( @input )." input files. ",
+ "Checking ".scalar( @output )." output files.\n";
+ }
+ # we set maxtime to be the youngest input file, including $0 itself.
+ my $maxtime = -M $0; # do this before the chdir!
+ if ($UseDir) {
+ chdir $UseDir or die "Failed to chdir to '$UseDir':$!";
+ }
+ foreach my $in (@input) {
+ my $time = -M $in;
+ die "Missing input file '$in'" unless defined $time;
+ $maxtime = $time if $maxtime < $time;
+ }
+
+ # now we check to see if any output files are older than maxtime, if
+ # they are we need to continue on, otherwise we can presumably bail.
+ my $ok = 1;
+ foreach my $out (@output) {
+ if ( ! -e $out ) {
+ print "'$out' is missing.\n"
+ if $Verbose;
+ $ok = 0;
+ last;
+ }
+ if ( -M $out > $maxtime ) {
+ print "'$out' is too old.\n"
+ if $Verbose;
+ $ok = 0;
+ last;
+ }
+ }
+ if ($ok) {
+ print "Files seem to be ok, not bothering to rebuild.\n";
+ exit(0);
+ }
+ print "Must rebuild tables.\n"
+ if $Verbose;
+} else {
+ if ($Verbose) {
+ print "Not checking filelist.\n";
+ }
+ if ($UseDir) {
+ chdir $UseDir or die "Failed to chdir to '$UseDir':$!";
+ }
+}
+
+foreach my $lib ('To', 'lib',
+ map {File::Spec->catdir("lib",$_)}
+ qw(gc_sc dt bc hst ea jt lb nt ccc)) {
+ next if -d $lib;
+ mkdir $lib, 0755 or die "mkdir '$lib': $!";
+}
+
+my $LastUnicodeCodepoint = 0x10FFFF; # As of Unicode 5.1.
+
+my $HEADER=<<"EOF";
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by $0 from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+EOF
+
+my $INTERNAL_ONLY=<<"EOF";
+# This file is for internal use by the Perl program only. The format and even
+# name or existence of this file are subject to change without notice. Don't
+# use it directly.
+
+EOF
+
+sub force_unlink {
+ my $filename = shift;
+ return unless -e $filename;
+ return if CORE::unlink($filename);
+ # We might need write permission
+ chmod 0777, $filename;
+ CORE::unlink($filename) or die "Couldn't unlink $filename: $!\n";
+}
+
+##
+## Given a filename and a reference to an array of lines,
+## write the lines to the file only if the contents have not changed.
+## Filename can be given as an arrayref of directory names
+##
+sub WriteIfChanged($\@)
+{
+ my $file = shift;
+ my $lines = shift;
+
+ $file = File::Spec->catfile(@$file) if ref $file;
+
+ my $TextToWrite = join '', @$lines;
+ if (open IN, $file) {
+ local($/) = undef;
+ my $PreviousText = <IN>;
+ close IN;
+ if ($PreviousText eq $TextToWrite) {
+ print "$file unchanged.\n" if $Verbose;
+ return unless $AlwaysWrite;
+ }
+ }
+ force_unlink ($file);
+ if (not open OUT, ">$file") {
+ die "$0: can't open $file for output: $!\n";
+ }
+ print "$file written.\n" if $Verbose;
+
+ print OUT $TextToWrite;
+ close OUT;
+}
+
+##
+## The main datastructure (a "Table") represents a set of code points that
+## are part of a particular quality (that are part of \pL, \p{InGreek},
+## etc.). They are kept as ranges of code points (starting and ending of
+## each range).
+##
+## For example, a range ASCII LETTERS would be represented as:
+## [ [ 0x41 => 0x5A, 'UPPER' ],
+## [ 0x61 => 0x7A, 'LOWER, ] ]
+##
+sub RANGE_START() { 0 } ## index into range element
+sub RANGE_END() { 1 } ## index into range element
+sub RANGE_NAME() { 2 } ## index into range element
+
+## Conceptually, these should really be folded into the 'Table' objects
+my %TableInfo;
+my %TableDesc;
+my %FuzzyNames;
+my %AliasInfo;
+my %CanonicalToOrig;
+
+##
+## Turn something like
+## OLD-ITALIC
+## into
+## OldItalic
+##
+sub CanonicalName($)
+{
+ my $orig = shift;
+ my $name = lc $orig;
+ $name =~ s/(?<![a-z])(\w)/\u$1/g;
+ $name =~ s/[-_\s]+//g;
+
+ $CanonicalToOrig{$name} = $orig if not $CanonicalToOrig{$name};
+ return $name;
+}
+
+
+##
+## Store the alias definitions for later use.
+##
+my %PropertyAlias;
+my %PropValueAlias;
+
+my %PA_reverse;
+my %PVA_reverse;
+
+sub Build_Aliases()
+{
+ ##
+ ## Most of the work with aliases doesn't occur here,
+ ## but rather in utf8_heavy.pl, which uses PVA.pl,
+
+ # Placate the warnings about used only once. (They are used again, but
+ # via a typeglob lookup)
+ %utf8::PropertyAlias = ();
+ %utf8::PA_reverse = ();
+ %utf8::PropValueAlias = ();
+ %utf8::PVA_reverse = ();
+ %utf8::PVA_abbr_map = ();
+
+ open PA, "< PropertyAliases.txt"
+ or confess "Can't open PropertyAliases.txt: $!";
+ while (<PA>) {
+ s/#.*//;
+ s/\s+$//;
+ next if /^$/;
+
+ my ($abbrev, $name) = split /\s*;\s*/;
+ next if $abbrev eq "n/a";
+ $PropertyAlias{$abbrev} = $name;
+ $PA_reverse{$name} = $abbrev;
+
+ # The %utf8::... versions use japhy's code originally from utf8_pva.pl
+ # However, it's moved here so that we build the tables at runtime.
+ tr/ _-//d for $abbrev, $name;
+ $utf8::PropertyAlias{lc $abbrev} = $name;
+ $utf8::PA_reverse{lc $name} = $abbrev;
+ }
+ close PA;
+
+ open PVA, "< PropValueAliases.txt"
+ or confess "Can't open PropValueAliases.txt: $!";
+ while (<PVA>) {
+ s/#.*//;
+ s/\s+$//;
+ next if /^$/;
+
+ my ($prop, @data) = split /\s*;\s*/;
+
+ if ($prop eq 'ccc') {
+ $PropValueAlias{$prop}{$data[1]} = [ @data[0,2] ];
+ $PVA_reverse{$prop}{$data[2]} = [ @data[0,1] ];
+ }
+ else {
+ next if $data[0] eq "n/a";
+ $PropValueAlias{$prop}{$data[0]} = $data[1];
+ $PVA_reverse{$prop}{$data[1]} = $data[0];
+ }
+
+ shift @data if $prop eq 'ccc';
+ next if $data[0] eq "n/a";
+
+ $data[1] =~ tr/ _-//d;
+ $utf8::PropValueAlias{$prop}{lc $data[0]} = $data[1];
+ $utf8::PVA_reverse{$prop}{lc $data[1]} = $data[0];
+
+ my $abbr_class = ($prop eq 'gc' or $prop eq 'sc') ? 'gc_sc' : $prop;
+ $utf8::PVA_abbr_map{$abbr_class}{lc $data[0]} = $data[0];
+ }
+ close PVA;
+
+ # backwards compatibility for L& -> LC
+ $utf8::PropValueAlias{gc}{'l&'} = $utf8::PropValueAlias{gc}{lc};
+ $utf8::PVA_abbr_map{gc_sc}{'l&'} = $utf8::PVA_abbr_map{gc_sc}{lc};
+
+}
+
+
+##
+## Associates a property ("Greek", "Lu", "Assigned",...) with a Table.
+##
+## Called like:
+## New_Prop(In => 'Greek', $Table, Desc => 'Greek Block', Fuzzy => 1);
+##
+## Normally, these parameters are set when the Table is created (when the
+## Table->New constructor is called), but there are times when it needs to
+## be done after-the-fact...)
+##
+sub New_Prop($$$@)
+{
+ my $Type = shift; ## "Is" or "In";
+ my $Name = shift;
+ my $Table = shift;
+
+ ## remaining args are optional key/val
+ my %Args = @_;
+
+ my $Fuzzy = delete $Args{Fuzzy};
+ my $Desc = delete $Args{Desc}; # description
+
+ $Name = CanonicalName($Name) if $Fuzzy;
+
+ ## sanity check a few args
+ if (%Args or ($Type ne 'Is' and $Type ne 'In') or not ref $Table) {
+ confess "$0: bad args to New_Prop"
+ }
+
+ if (not $TableInfo{$Type}->{$Name})
+ {
+ $TableInfo{$Type}->{$Name} = $Table;
+ $TableDesc{$Type}->{$Name} = $Desc;
+ if ($Fuzzy) {
+ $FuzzyNames{$Type}->{$Name} = $Name;
+ }
+ }
+}
+
+
+##
+## Creates a new Table object.
+##
+## Args are key/value pairs:
+## In => Name -- Name of "In" property to be associated with
+## Is => Name -- Name of "Is" property to be associated with
+## Fuzzy => Boolean -- True if name can be accessed "fuzzily"
+## Desc => String -- Description of the property
+##
+## No args are required.
+##
+sub Table::New
+{
+ my $class = shift;
+ my %Args = @_;
+
+ my $Table = bless [], $class;
+
+ my $Fuzzy = delete $Args{Fuzzy};
+ my $Desc = delete $Args{Desc};
+
+ for my $Type ('Is', 'In')
+ {
+ if (my $Name = delete $Args{$Type}) {
+ New_Prop($Type => $Name, $Table, Desc => $Desc, Fuzzy => $Fuzzy);
+ }
+ }
+
+ ## shouldn't have any left over
+ if (%Args) {
+ confess "$0: bad args to Table->New"
+ }
+
+ return $Table;
+}
+
+
+##
+## Returns the maximum code point currently in the table.
+##
+sub Table::Max
+{
+ my $last = $_[0]->[-1]; ## last code point
+ confess "oops" unless $last; ## must have code points to have a max
+ return $last->[RANGE_END];
+}
+
+##
+## Replaces the codepoints in the Table with those in the Table given
+## as an arg. (NOTE: this is not a "deep copy").
+##
+sub Table::Replace($$)
+{
+ my $Table = shift; #self
+ my $New = shift;
+
+ @$Table = @$New;
+}
+
+##
+## Given a new code point, make the last range of the Table extend to
+## include the new (and all intervening) code points.
+##
+## Takes the time to make sure that the extension is valid.
+##
+sub Table::Extend
+{
+ my $Table = shift; #self
+ my $codepoint = shift;
+
+ my $PrevMax = $Table->Max;
+
+ confess "oops ($codepoint <= $PrevMax)" if $codepoint <= $PrevMax;
+
+ $Table->ExtendNoCheck($codepoint);
+}
+
+
+##
+## Given a new code point, make the last range of the Table extend to
+## include the new (and all intervening) code points.
+##
+## Does NOT check that the extension is valid. Assumes that the caller
+## has already made this check.
+##
+sub Table::ExtendNoCheck
+{
+ ## Optmized adding: Assumes $Table and $codepoint as parms
+ $_[0]->[-1]->[RANGE_END] = $_[1];
+}
+
+##
+## Given a code point range start and end (and optional name), blindly
+## append them to the list of ranges for the Table.
+##
+## NOTE: Code points must be added in strictly ascending numeric order.
+##
+sub Table::RawAppendRange
+{
+ my $Table = shift; #self
+ my $start = shift;
+ my $end = shift;
+ my $name = shift;
+ $name = "" if not defined $name; ## warning: $name can be "0"
+
+ push @$Table, [ $start, # RANGE_START
+ $end, # RANGE_END
+ $name ]; # RANGE_NAME
+}
+
+##
+## Given a code point (and optional name), add it to the Table.
+##
+## NOTE: Code points must be added in strictly ascending numeric order.
+##
+sub Table::Append
+{
+ my $Table = shift; #self
+ my $codepoint = shift;
+ my $name = shift;
+ $name = "" if not defined $name; ## warning: $name can be "0"
+
+ ##
+ ## If we've already got a range working, and this code point is the next
+ ## one in line, and if the name is the same, just extend the current range.
+ ##
+ my $last = $Table->[-1];
+ if ($last
+ and
+ $last->[RANGE_END] == $codepoint - 1
+ and
+ $last->[RANGE_NAME] eq $name)
+ {
+ $Table->ExtendNoCheck($codepoint);
+ }
+ else
+ {
+ $Table->RawAppendRange($codepoint, $codepoint, $name);
+ }
+}
+
+##
+## Given a code point range starting value and ending value (and name),
+## Add the range to the Table.
+##
+## NOTE: Code points must be added in strictly ascending numeric order.
+##
+sub Table::AppendRange
+{
+ my $Table = shift; #self
+ my $start = shift;
+ my $end = shift;
+ my $name = shift;
+ $name = "" if not defined $name; ## warning: $name can be "0"
+
+ $Table->Append($start, $name);
+ $Table->Extend($end) if $end > $start;
+}
+
+##
+## Return a new Table that represents all code points not in the Table.
+##
+sub Table::Invert
+{
+ my $Table = shift; #self
+
+ my $New = Table->New();
+ my $max = -1;
+ for my $range (@$Table)
+ {
+ my $start = $range->[RANGE_START];
+ my $end = $range->[RANGE_END];
+ if ($start-1 >= $max+1) {
+ $New->AppendRange($max+1, $start-1, "");
+ }
+ $max = $end;
+ }
+ if ($max+1 < $LastUnicodeCodepoint) {
+ $New->AppendRange($max+1, $LastUnicodeCodepoint);
+ }
+ return $New;
+}
+
+##
+## Merges any number of other tables with $self, returning the new table.
+## (existing tables are not modified)
+##
+##
+## Args may be Tables, or individual code points (as integers).
+##
+## Can be called as either a constructor or a method.
+##
+sub Table::Merge
+{
+ shift(@_) if not ref $_[0]; ## if called as a constructor, lose the class
+ my @Tables = @_;
+
+ ## Accumulate all records from all tables
+ my @Records;
+ for my $Arg (@Tables)
+ {
+ if (ref $Arg) {
+ ## arg is a table -- get its ranges
+ push @Records, @$Arg;
+ } else {
+ ## arg is a codepoint, make a range
+ push @Records, [ $Arg, $Arg ]
+ }
+ }
+
+ ## sort by range start, with longer ranges coming first.
+ my ($first, @Rest) = sort {
+ ($a->[RANGE_START] <=> $b->[RANGE_START])
+ or
+ ($b->[RANGE_END] <=> $b->[RANGE_END])
+ } @Records;
+
+ my $New = Table->New();
+
+ ## Ensuring the first range is there makes the subsequent loop easier
+ $New->AppendRange($first->[RANGE_START],
+ $first->[RANGE_END]);
+
+ ## Fold in records so long as they add new information.
+ for my $set (@Rest)
+ {
+ my $start = $set->[RANGE_START];
+ my $end = $set->[RANGE_END];
+ if ($start > $New->Max) {
+ $New->AppendRange($start, $end);
+ } elsif ($end > $New->Max) {
+ $New->ExtendNoCheck($end);
+ }
+ }
+
+ return $New;
+}
+
+##
+## Given a filename, write a representation of the Table to a file.
+## May have an optional comment as a 2nd arg.
+## Filename may actually be an arrayref of directories
+##
+sub Table::Write
+{
+ my $Table = shift; #self
+ my $filename = shift;
+ my $comment = shift;
+
+ my @OUT = $HEADER;
+
+ # files in subdirectories are internal-use-only
+ push @OUT, $INTERNAL_ONLY if ref $filename;
+
+ if (defined $comment) {
+ $comment =~ s/\s+\Z//;
+ $comment =~ s/^/# /gm;
+ push @OUT, "#\n$comment\n#\n";
+ }
+ push @OUT, "return <<'END';\n";
+
+ for my $set (@$Table)
+ {
+ my $start = $set->[RANGE_START];
+ my $end = $set->[RANGE_END];
+ my $name = $set->[RANGE_NAME];
+
+ if ($start == $end) {
+ push @OUT, sprintf "%04X\t\t%s\n", $start, $name;
+ } else {
+ push @OUT, sprintf "%04X\t%04X\t%s\n", $start, $end, $name;
+ }
+ }
+
+ push @OUT, "END\n";
+
+ WriteIfChanged($filename, @OUT);
+}
+
+## This used only for making the test script.
+## helper function
+sub IsUsable($)
+{
+ my $code = shift;
+ return 0 if $code <= 0x0000; ## don't use null
+ return 0 if $code >= $LastUnicodeCodepoint; ## keep in range
+ return 0 if ($code >= 0xD800 and $code <= 0xDFFF); ## no surrogates
+ return 0 if ($code >= 0xFDD0 and $code <= 0xFDEF); ## utf8.c says no good
+ return 0 if (($code & 0xFFFF) == 0xFFFE); ## utf8.c says no good
+ return 0 if (($code & 0xFFFF) == 0xFFFF); ## utf8.c says no good
+ return 1;
+}
+
+## Return a code point that's part of the table.
+## Returns nothing if the table is empty (or covers only surrogates).
+## This used only for making the test script.
+sub Table::ValidCode
+{
+ my $Table = shift; #self
+ for my $set (@$Table) {
+ return $set->[RANGE_END] if IsUsable($set->[RANGE_END]);
+ }
+ return ();
+}
+
+## Return a code point that's not part of the table
+## Returns nothing if the table covers all code points.
+## This used only for making the test script.
+sub Table::InvalidCode
+{
+ my $Table = shift; #self
+
+ return 0x1234 if not @$Table;
+
+ for my $set (@$Table)
+ {
+ if (IsUsable($set->[RANGE_END] + 1))
+ {
+ return $set->[RANGE_END] + 1;
+ }
+
+ if (IsUsable($set->[RANGE_START] - 1))
+ {
+ return $set->[RANGE_START] - 1;
+ }
+ }
+ return ();
+}
+
+###########################################################################
+###########################################################################
+###########################################################################
+
+
+##
+## Called like:
+## New_Alias(Is => 'All', SameAs => 'Any', Fuzzy => 1);
+##
+## The args must be in that order, although the Fuzzy pair may be omitted.
+##
+## This creates 'IsAll' as an alias for 'IsAny'
+##
+sub New_Alias($$$@)
+{
+ my $Type = shift; ## "Is" or "In"
+ my $Alias = shift;
+ my $SameAs = shift; # expecting "SameAs" -- just ignored
+ my $Name = shift;
+
+ ## remaining args are optional key/val
+ my %Args = @_;
+
+ my $Fuzzy = delete $Args{Fuzzy};
+
+ ## sanity check a few args
+ if (%Args or ($Type ne 'Is' and $Type ne 'In') or $SameAs ne 'SameAs') {
+ confess "$0: bad args to New_Alias"
+ }
+
+ $Alias = CanonicalName($Alias) if $Fuzzy;
+
+ if (not $TableInfo{$Type}->{$Name})
+ {
+ my $CName = CanonicalName($Name);
+ if ($TableInfo{$Type}->{$CName}) {
+ confess "$0: Use canonical form '$CName' instead of '$Name' for alias.";
+ } else {
+ confess "$0: don't have original $Type => $Name to make alias\n";
+ }
+ }
+ if ($TableInfo{$Alias}) {
+ confess "$0: already have original $Type => $Alias; can't make alias";
+ }
+ $AliasInfo{$Type}->{$Name} = $Alias;
+ if ($Fuzzy) {
+ $FuzzyNames{$Type}->{$Alias} = $Name;
+ }
+
+}
+
+
+## All assigned code points
+my $Assigned = Table->New(Is => 'Assigned',
+ Desc => "All assigned code points",
+ Fuzzy => 0);
+
+my $Name = Table->New(); ## all characters, individually by name
+my $General = Table->New(); ## all characters, grouped by category
+my %General;
+my %Cat;
+
+## Simple Data::Dumper like. Good enough for our needs. We can't use the real
+## thing as we have to run under miniperl
+sub simple_dumper {
+ my @lines;
+ my $item;
+ foreach $item (@_) {
+ if (ref $item) {
+ if (ref $item eq 'ARRAY') {
+ push @lines, "[\n", simple_dumper (@$item), "],\n";
+ } elsif (ref $item eq 'HASH') {
+ push @lines, "{\n", simple_dumper (%$item), "},\n";
+ } else {
+ die "Can't cope with $item";
+ }
+ } else {
+ if (defined $item) {
+ my $copy = $item;
+ $copy =~ s/([\'\\])/\\$1/gs;
+ push @lines, "'$copy',\n";
+ } else {
+ push @lines, "undef,\n";
+ }
+ }
+ }
+ @lines;
+}
+
+##
+## Process UnicodeData.txt (Categories, etc.)
+##
+# These are the character mappings as defined in the POSIX standard
+# and in the case of PerlSpace and PerlWord as is defined in the test macros
+# for binary strings. IOW, PerlWord is [A-Za-z_] and PerlSpace is [\f\r\n\t ]
+# This differs from Word and the existing SpacePerl (note the prefix/suffix difference)
+# which is basically the Unicode WhiteSpace without the vertical tab included
+#
+my %TRUE_POSIX_PERL_CC= (
+ PosixAlnum => { map { $_ => 1 } ( 0x0030..0x0039, 0x0041..0x005a, 0x0061..0x007a )},
+ PosixAlpha => { map { $_ => 1 } ( 0x0041..0x005a, 0x0061..0x007a )},
+ # Not Needed: Ascii => { map { $_ => 1 } ( 0x0000..0x007f )},
+ PosixBlank => { map { $_ => 1 } ( 0x0009, 0x0020 )},
+ PosixCntrl => { map { $_ => 1 } ( 0x0000..0x001f, 0x007f )},
+ PosixGraph => { map { $_ => 1 } ( 0x0021..0x007e )},
+ PosixLower => { map { $_ => 1 } ( 0x0061..0x007a )},
+ PosixPrint => { map { $_ => 1 } ( 0x0020..0x007e )},
+ PosixPunct => { map { $_ => 1 } ( 0x0021..0x002f, 0x003a..0x0040, 0x005b..0x0060, 0x007b..0x007e )},
+ PosixSpace => { map { $_ => 1 } ( 0x0009..0x000d, 0x0020 )},
+ PosixUpper => { map { $_ => 1 } ( 0x0041..0x005a )},
+ # Not needed: PosixXdigit => { map { $_ => 1 } ( 0x0030..0x0039, 0x0041..0x0046, 0x0061..0x0066 )},
+ PosixDigit => { map { $_ => 1 } ( 0x0030..0x0039 )},
+
+ PerlSpace => { map { $_ => 1 } ( 0x0009..0x000a, 0x000c..0x000d, 0x0020 )},
+ PerlWord => { map { $_ => 1 } ( 0x0030..0x0039, 0x0041..0x005a, 0x005f, 0x0061..0x007a )},
+);
+
+sub UnicodeData_Txt()
+{
+ my $Bidi = Table->New();
+ my $Deco = Table->New();
+ my $Comb = Table->New();
+ my $Number = Table->New();
+ my $Mirrored = Table->New();#Is => 'Mirrored',
+ #Desc => "Mirrored in bidirectional text",
+ #Fuzzy => 0);
+
+ my %DC;
+ my %Bidi;
+ my %Number;
+ $DC{Can} = Table->New();
+ $DC{Com} = Table->New();
+
+ ## Initialize Broken Perl-generated categories
+ ## (Categories from UnicodeData.txt are auto-initialized in gencat)
+ $Cat{Alnum} =
+ Table->New(Is => 'Alnum', Desc => "[[:Alnum:]]", Fuzzy => 0);
+ $Cat{Alpha} =
+ Table->New(Is => 'Alpha', Desc => "[[:Alpha:]]", Fuzzy => 0);
+ $Cat{ASCII} =
+ Table->New(Is => 'ASCII', Desc => "[[:ASCII:]]", Fuzzy => 0);
+ $Cat{Blank} =
+ Table->New(Is => 'Blank', Desc => "[[:Blank:]]", Fuzzy => 0);
+ $Cat{Cntrl} =
+ Table->New(Is => 'Cntrl', Desc => "[[:Cntrl:]]", Fuzzy => 0);
+ $Cat{Digit} =
+ Table->New(Is => 'Digit', Desc => "[[:Digit:]]", Fuzzy => 0);
+ $Cat{Graph} =
+ Table->New(Is => 'Graph', Desc => "[[:Graph:]]", Fuzzy => 0);
+ $Cat{Lower} =
+ Table->New(Is => 'Lower', Desc => "[[:Lower:]]", Fuzzy => 0);
+ $Cat{Print} =
+ Table->New(Is => 'Print', Desc => "[[:Print:]]", Fuzzy => 0);
+ $Cat{Punct} =
+ Table->New(Is => 'Punct', Desc => "[[:Punct:]]", Fuzzy => 0);
+ $Cat{Space} =
+ Table->New(Is => 'Space', Desc => "[[:Space:]]", Fuzzy => 0);
+ $Cat{Title} =
+ Table->New(Is => 'Title', Desc => "[[:Title:]]", Fuzzy => 0);
+ $Cat{Upper} =
+ Table->New(Is => 'Upper', Desc => "[[:Upper:]]", Fuzzy => 0);
+ $Cat{XDigit} =
+ Table->New(Is => 'XDigit', Desc => "[[:XDigit:]]", Fuzzy => 0);
+ $Cat{Word} =
+ Table->New(Is => 'Word', Desc => "[[:Word:]]", Fuzzy => 0);
+ $Cat{SpacePerl} =
+ Table->New(Is => 'SpacePerl', Desc => '\s', Fuzzy => 0);
+ $Cat{VertSpace} =
+ Table->New(Is => 'VertSpace', Desc => '\v', Fuzzy => 0);
+ $Cat{HorizSpace} =
+ Table->New(Is => 'HorizSpace', Desc => '\h', Fuzzy => 0);
+ my %To;
+ $To{Upper} = Table->New();
+ $To{Lower} = Table->New();
+ $To{Title} = Table->New();
+ $To{Digit} = Table->New();
+
+ foreach my $cat (keys %TRUE_POSIX_PERL_CC) {
+ $Cat{$cat} = Table->New(Is=>$cat, Fuzzy => 0);
+ }
+
+ sub gencat($$$$)
+ {
+ my ($name, ## Name ("LATIN CAPITAL LETTER A")
+ $cat, ## Category ("Lu", "Zp", "Nd", etc.)
+ $code, ## Code point (as an integer)
+ $op) = @_;
+
+ my $MajorCat = substr($cat, 0, 1); ## L, M, Z, S, etc
+
+ $Assigned->$op($code);
+ $Name->$op($code, $name);
+ $General->$op($code, $cat);
+
+ ## add to the sub category (e.g. "Lu", "Nd", "Cf", ..)
+ $Cat{$cat} ||= Table->New(Is => $cat,
+ Desc => "General Category '$cat'",
+ Fuzzy => 0);
+ $Cat{$cat}->$op($code);
+
+ ## add to the major category (e.g. "L", "N", "C", ...)
+ $Cat{$MajorCat} ||= Table->New(Is => $MajorCat,
+ Desc => "Major Category '$MajorCat'",
+ Fuzzy => 0);
+ $Cat{$MajorCat}->$op($code);
+
+ ($General{$name} ||= Table->New)->$op($code, $name);
+
+ # 005F: SPACING UNDERSCORE
+ $Cat{Word}->$op($code) if $cat =~ /^[LMN]|Pc/;
+ $Cat{Alnum}->$op($code) if $cat =~ /^[LM]|Nd/;
+ $Cat{Alpha}->$op($code) if $cat =~ /^[LM]/;
+
+ my $isspace =
+ ($cat =~ /Zs|Zl|Zp/ &&
+ $code != 0x200B) # 200B is ZWSP which is for line break control
+ # and therefore it is not part of "space" even
+ # while it is "Zs" in some versions of Unicode.
+ # In 5.1 it is Cf, so this line is no longer
+ # necessary.
+ || $code == 0x0009 # 0009: HORIZONTAL TAB
+ || $code == 0x000A # 000A: LINE FEED
+ || $code == 0x000B # 000B: VERTICAL TAB
+ || $code == 0x000C # 000C: FORM FEED
+ || $code == 0x000D # 000D: CARRIAGE RETURN
+ || $code == 0x0085 # 0085: NEL
+
+ ;
+
+ $Cat{Space}->$op($code) if $isspace;
+
+ $Cat{SpacePerl}->$op($code) if $isspace
+ && $code != 0x000B; # Backward compat.
+
+ $Cat{VertSpace}->$op($code) if grep {$code == $_}
+ ( 0x0A..0x0D,0x85,0x2028,0x2029 );
+
+ $Cat{HorizSpace}->$op($code) if grep {$code == $_} (
+ 0x09, 0x20, 0xa0, 0x1680, 0x180e, 0x2000, 0x2001, 0x2002,
+ 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a,
+ 0x202f, 0x205f, 0x3000
+ );
+
+ $Cat{Blank}->$op($code) if $isspace
+ && !($code == 0x000A ||
+ $code == 0x000B ||
+ $code == 0x000C ||
+ $code == 0x000D ||
+ $code == 0x0085 ||
+ $cat =~ /^Z[lp]/);
+
+ $Cat{Digit}->$op($code) if $cat eq "Nd";
+ $Cat{Upper}->$op($code) if $cat eq "Lu";
+ $Cat{Lower}->$op($code) if $cat eq "Ll";
+ $Cat{Title}->$op($code) if $cat eq "Lt";
+ $Cat{ASCII}->$op($code) if $code <= 0x007F;
+ $Cat{Cntrl}->$op($code) if $cat =~ /^C/;
+ my $isgraph = !$isspace && $cat !~ /Cc|Cs|Cn/;
+ $Cat{Graph}->$op($code) if $isgraph;
+ $Cat{Print}->$op($code) if $isgraph || $isspace;
+ $Cat{Punct}->$op($code) if $cat =~ /^P/;
+
+ $Cat{XDigit}->$op($code) if ($code >= 0x30 && $code <= 0x39) ## 0..9
+ || ($code >= 0x41 && $code <= 0x46) ## A..F
+ || ($code >= 0x61 && $code <= 0x66); ## a..f
+ if ($code<=0x7F) {
+ foreach my $cat (keys %TRUE_POSIX_PERL_CC) {
+ if ($TRUE_POSIX_PERL_CC{$cat}{$code}) {
+ $Cat{$cat}->$op($code);
+ }
+ }
+ }
+ }
+
+ ## open and read file.....
+ if (not open IN, "UnicodeData.txt") {
+ die "$0: UnicodeData.txt: $!\n";
+ }
+
+ ##
+ ## For building \p{_CombAbove} and \p{_CanonDCIJ}
+ ##
+ my %_Above_HexCodes; ## Hexcodes for chars with $comb == 230 ("ABOVE")
+
+ my %CodeToDeco; ## Maps code to decomp. list for chars with first
+ ## decomp. char an "i" or "j" (for \p{_CanonDCIJ})
+
+ ## This is filled in as we go....
+ my $CombAbove = Table->New(Is => '_CombAbove',
+ Desc => '(for internal casefolding use)',
+ Fuzzy => 0);
+
+ while (<IN>)
+ {
+ next unless /^[0-9A-Fa-f]+;/;
+ s/\s+$//;
+
+ my ($hexcode, ## code point in hex (e.g. "0041")
+ $name, ## character name (e.g. "LATIN CAPITAL LETTER A")
+ $cat, ## category (e.g. "Lu")
+ $comb, ## Canonical combining class (e.g. "230")
+ $bidi, ## directional category (e.g. "L")
+ $deco, ## decomposition mapping
+ $decimal, ## decimal digit value
+ $digit, ## digit value
+ $number, ## numeric value
+ $mirrored, ## mirrored
+ $unicode10, ## name in Unicode 1.0
+ $comment, ## comment field
+ $upper, ## uppercase mapping
+ $lower, ## lowercase mapping
+ $title, ## titlecase mapping
+ ) = split(/\s*;\s*/);
+
+ # Note that in Unicode 3.2 there will be names like
+ # LINE FEED (LF), which probably means that \N{} needs
+ # to cope also with LINE FEED and LF.
+ $name = $unicode10 if $name eq '<control>' && $unicode10 ne '';
+
+ my $code = hex($hexcode);
+
+ if ($comb and $comb == 230) {
+ $CombAbove->Append($code);
+ $_Above_HexCodes{$hexcode} = 1;
+ }
+
+ ## Used in building \p{_CanonDCIJ}
+ if ($deco and $deco =~ m/^006[9A]\b/) {
+ $CodeToDeco{$code} = $deco;
+ }
+
+ ##
+ ## There are a few pairs of lines like:
+ ## AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;;
+ ## D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;;
+ ## that define ranges.
+ ##
+ if ($name =~ /^<(.+), (First|Last)>$/)
+ {
+ $name = $1;
+ gencat($name, $cat, $code, $2 eq 'First' ? 'Append' : 'Extend');
+ #New_Prop(In => $name, $General{$name}, Fuzzy => 1);
+ }
+ else
+ {
+ ## normal (single-character) lines
+ gencat($name, $cat, $code, 'Append');
+
+ # No Append() here since since several codes may map into one.
+ $To{Upper}->RawAppendRange($code, $code, $upper) if $upper;
+ $To{Lower}->RawAppendRange($code, $code, $lower) if $lower;
+ $To{Title}->RawAppendRange($code, $code, $title) if $title;
+ $To{Digit}->Append($code, $decimal) if length $decimal;
+
+ $Bidi->Append($code, $bidi);
+ $Comb->Append($code, $comb) if $comb;
+ $Number->Append($code, $number) if length $number;
+
+ length($decimal) and ($Number{De} ||= Table->New())->Append($code)
+ or
+ length($digit) and ($Number{Di} ||= Table->New())->Append($code)
+ or
+ length($number) and ($Number{Nu} ||= Table->New())->Append($code);
+
+ $Mirrored->Append($code) if $mirrored eq "Y";
+
+ $Bidi{$bidi} ||= Table->New();#Is => "bt/$bidi",
+ #Desc => "Bi-directional category '$bidi'",
+ #Fuzzy => 0);
+ $Bidi{$bidi}->Append($code);
+
+ if ($deco)
+ {
+ $Deco->Append($code, $deco);
+ if ($deco =~/^<(\w+)>/)
+ {
+ my $dshort = $PVA_reverse{dt}{ucfirst lc $1};
+ $DC{Com}->Append($code);
+ $dshort = $PVA_reverse{dt}{lc $1} unless $dshort ne "";
+ die "No reverse for $1'" unless $dshort ne "";
+ #$dshort = lc $dshort; # use lower case only
+ $DC{$dshort} ||= Table->New();
+ $DC{$dshort}->Append($code);
+ }
+ else
+ {
+ $DC{Can}->Append($code);
+ }
+ }
+ }
+ }
+ close IN;
+
+ ## Read in the NameAliases.txt. It contains other normative names of code
+ ## points not listed in UnicodeData.txt. This happens when there is an
+ ## error in the name found after the data base was published, but instead of
+ ## changing it, to avoid breaking any code that came to rely on the
+ ## erroneous version, the correct name is added as an alias.
+
+ my $NameAliases = Table->New();
+
+ if (not open IN, "NameAliases.txt") {
+ die "$0: NameAliases.txt: $!\n";
+ }
+
+ while (<IN>)
+ {
+ next unless /^[0-9A-Fa-f]+;/;
+ s/\s+$//;
+
+ my ($hexcode, ## code point in hex (e.g. "0041")
+ $name, ## character name (e.g. "LATIN CAPITAL LETTER A")
+ ) = split(/\s*;\s*/);
+
+ my $code = hex($hexcode);
+
+ ## One is supposed to enter elements into tables in strictly increasing
+ ## order, but this in fact works to append duplicate code points at
+ ## the end of the table. The table is intended to be indexed by name
+ ## anyway.
+
+ $Name->RawAppendRange($code, $code, $name);
+ }
+ close IN;
+
+
+ ##
+ ## Tidy up a few special cases....
+ ##
+
+ $Cat{Cn} = $Assigned->Invert; ## Cn is everything that doesn't exist
+ New_Prop(Is => 'Cn',
+ $Cat{Cn},
+ Desc => "General Category 'Cn' [not functional in Perl]",
+ Fuzzy => 0);
+
+ ## Unassigned is the same as 'Cn'
+ New_Alias(Is => 'Unassigned', SameAs => 'Cn', Fuzzy => 0);
+
+ $Cat{C}->Replace($Cat{C}->Merge($Cat{Cn})); ## Now merge in Cn into C
+
+
+ # LC is Ll, Lu, and Lt.
+ # (used to be L& or L_, but PropValueAliases.txt defines it as LC)
+ New_Prop(Is => 'LC',
+ Table->Merge(@Cat{qw[Ll Lu Lt]}),
+ Desc => '[\p{Ll}\p{Lu}\p{Lt}]',
+ Fuzzy => 0);
+
+ ## Any and All are all code points.
+ my $Any = Table->New(Is => 'Any',
+ Desc => sprintf("[\\x{0000}-\\x{%X}]",
+ $LastUnicodeCodepoint),
+ Fuzzy => 0);
+ $Any->RawAppendRange(0, $LastUnicodeCodepoint);
+
+ New_Alias(Is => 'All', SameAs => 'Any', Fuzzy => 0);
+
+ ##
+ ## Build special properties for Perl's internal case-folding needs:
+ ## \p{_CaseIgnorable}
+ ## \p{_CanonDCIJ}
+ ## \p{_CombAbove}
+ ## _CombAbove was built above. Others are built here....
+ ##
+
+ ## \p{_CaseIgnorable} is [\p{Mn}\0x00AD\x2010]
+ New_Prop(Is => '_CaseIgnorable',
+ Table->Merge($Cat{Mn},
+ 0x00AD, #SOFT HYPHEN
+ 0x2010), #HYPHEN
+ Desc => '(for internal casefolding use)',
+ Fuzzy => 0);
+
+
+ ## \p{_CanonDCIJ} is fairly complex...
+ my $CanonCDIJ = Table->New(Is => '_CanonDCIJ',
+ Desc => '(for internal casefolding use)',
+ Fuzzy => 0);
+ ## It contains the ASCII 'i' and 'j'....
+ $CanonCDIJ->Append(0x0069); # ASCII ord("i")
+ $CanonCDIJ->Append(0x006A); # ASCII ord("j")
+ ## ...and any character with a decomposition that starts with either of
+ ## those code points, but only if the decomposition does not have any
+ ## combining character with the "ABOVE" canonical combining class.
+ for my $code (sort { $a <=> $b} keys %CodeToDeco)
+ {
+ ## Need to ensure that all decomposition characters do not have
+ ## a %HexCodeToComb in %AboveCombClasses.
+ my $want = 1;
+ for my $deco_hexcode (split / /, $CodeToDeco{$code})
+ {
+ if (exists $_Above_HexCodes{$deco_hexcode}) {
+ ## one of the decmposition chars has an ABOVE combination
+ ## class, so we're not interested in this one
+ $want = 0;
+ last;
+ }
+ }
+ if ($want) {
+ $CanonCDIJ->Append($code);
+ }
+ }
+
+
+
+ ##
+ ## Now dump the files.
+ ##
+ $Name->Write("Name.pl");
+
+ {
+ my @PVA = $HEADER;
+ foreach my $name (qw (PropertyAlias PA_reverse PropValueAlias
+ PVA_reverse PVA_abbr_map)) {
+ # Should I really jump through typeglob hoops just to avoid a
+ # symbolic reference? (%{"utf8::$name})
+ push @PVA, "\n", "\%utf8::$name = (\n",
+ simple_dumper (%{$utf8::{$name}}), ");\n";
+ }
+ push @PVA, "1;\n";
+ WriteIfChanged("PVA.pl", @PVA);
+ }
+
+ # $Bidi->Write("Bidirectional.pl");
+ for (keys %Bidi) {
+ $Bidi{$_}->Write(
+ ["lib","bc","$_.pl"],
+ "BidiClass category '$PropValueAlias{bc}{$_}'"
+ );
+ }
+
+ $Comb->Write("CombiningClass.pl");
+ for (keys %{ $PropValueAlias{ccc} }) {
+ my ($code, $name) = @{ $PropValueAlias{ccc}{$_} };
+ (my $c = Table->New())->Append($code);
+ $c->Write(
+ ["lib","ccc","$_.pl"],
+ "CombiningClass category '$name'"
+ );
+ }
+
+ $Deco->Write("Decomposition.pl");
+ for (keys %DC) {
+ $DC{$_}->Write(
+ ["lib","dt","$_.pl"],
+ "DecompositionType category '$PropValueAlias{dt}{$_}'"
+ );
+ }
+
+ # $Number->Write("Number.pl");
+ for (keys %Number) {
+ $Number{$_}->Write(
+ ["lib","nt","$_.pl"],
+ "NumericType category '$PropValueAlias{nt}{$_}'"
+ );
+ }
+
+ # $General->Write("Category.pl");
+
+ for my $to (sort keys %To) {
+ $To{$to}->Write(["To","$to.pl"]);
+ }
+
+ for (keys %{ $PropValueAlias{gc} }) {
+ New_Alias(Is => $PropValueAlias{gc}{$_}, SameAs => $_, Fuzzy => 1);
+ }
+}
+
+##
+## Process LineBreak.txt
+##
+sub LineBreak_Txt()
+{
+ if (not open IN, "LineBreak.txt") {
+ die "$0: LineBreak.txt: $!\n";
+ }
+
+ my $Lbrk = Table->New();
+ my %Lbrk;
+
+ while (<IN>)
+ {
+ next unless /^([0-9A-Fa-f]+)(?:\.\.([0-9A-Fa-f]+))?\s*;\s*(\w+)/;
+
+ my ($first, $last, $lbrk) = (hex($1), hex($2||""), $3);
+
+ $Lbrk->Append($first, $lbrk);
+
+ $Lbrk{$lbrk} ||= Table->New();
+ $Lbrk{$lbrk}->Append($first);
+
+ if ($last) {
+ $Lbrk->Extend($last);
+ $Lbrk{$lbrk}->Extend($last);
+ }
+ }
+ close IN;
+
+ # $Lbrk->Write("Lbrk.pl");
+
+
+ for (keys %Lbrk) {
+ $Lbrk{$_}->Write(
+ ["lib","lb","$_.pl"],
+ "Linebreak category '$PropValueAlias{lb}{$_}'"
+ );
+ }
+}
+
+##
+## Process ArabicShaping.txt.
+##
+sub ArabicShaping_txt()
+{
+ if (not open IN, "ArabicShaping.txt") {
+ die "$0: ArabicShaping.txt: $!\n";
+ }
+
+ my $ArabLink = Table->New();
+ my $ArabLinkGroup = Table->New();
+
+ my %JoinType;
+
+ while (<IN>)
+ {
+ next unless /^[0-9A-Fa-f]+;/;
+ s/\s+$//;
+
+ my ($hexcode, $name, $link, $linkgroup) = split(/\s*;\s*/);
+ my $code = hex($hexcode);
+ $ArabLink->Append($code, $link);
+ $ArabLinkGroup->Append($code, $linkgroup);
+
+ $JoinType{$link} ||= Table->New(Is => "JoinType$link");
+ $JoinType{$link}->Append($code);
+ }
+ close IN;
+
+ # $ArabLink->Write("ArabLink.pl");
+ # $ArabLinkGroup->Write("ArabLnkGrp.pl");
+
+
+ for (keys %JoinType) {
+ $JoinType{$_}->Write(
+ ["lib","jt","$_.pl"],
+ "JoiningType category '$PropValueAlias{jt}{$_}'"
+ );
+ }
+}
+
+##
+## Process EastAsianWidth.txt.
+##
+sub EastAsianWidth_txt()
+{
+ if (not open IN, "EastAsianWidth.txt") {
+ die "$0: EastAsianWidth.txt: $!\n";
+ }
+
+ my %EAW;
+
+ while (<IN>)
+ {
+ next unless /^[0-9A-Fa-f]+(\.\.[0-9A-Fa-f]+)?;/;
+ s/#.*//;
+ s/\s+$//;
+
+ my ($hexcodes, $pv) = split(/\s*;\s*/);
+ $EAW{$pv} ||= Table->New(Is => "EastAsianWidth$pv");
+ my ($start, $end) = split(/\.\./, $hexcodes);
+ if (defined $end) {
+ $EAW{$pv}->AppendRange(hex($start), hex($end));
+ } else {
+ $EAW{$pv}->Append(hex($start));
+ }
+ }
+ close IN;
+
+
+ for (keys %EAW) {
+ $EAW{$_}->Write(
+ ["lib","ea","$_.pl"],
+ "EastAsianWidth category '$PropValueAlias{ea}{$_}'"
+ );
+ }
+}
+
+##
+## Process HangulSyllableType.txt.
+##
+sub HangulSyllableType_txt()
+{
+ if (not open IN, "HangulSyllableType.txt") {
+ die "$0: HangulSyllableType.txt: $!\n";
+ }
+
+ my %HST;
+
+ while (<IN>)
+ {
+ next unless /^([0-9A-Fa-f]+)(?:\.\.([0-9A-Fa-f]+))?\s*;\s*(\w+)/;
+ my ($first, $last, $pv) = (hex($1), hex($2||""), $3);
+
+ $HST{$pv} ||= Table->New(Is => "HangulSyllableType$pv");
+ $HST{$pv}->Append($first);
+
+ if ($last) { $HST{$pv}->Extend($last) }
+ }
+ close IN;
+
+ for (keys %HST) {
+ $HST{$_}->Write(
+ ["lib","hst","$_.pl"],
+ "HangulSyllableType category '$PropValueAlias{hst}{$_}'"
+ );
+ }
+}
+
+##
+## Process Jamo.txt.
+##
+sub Jamo_txt()
+{
+ if (not open IN, "Jamo.txt") {
+ die "$0: Jamo.txt: $!\n";
+ }
+ my $Short = Table->New();
+
+ while (<IN>)
+ {
+ next unless /^([0-9A-Fa-f]+)\s*;\s*(\w*)/;
+ my ($code, $short) = (hex($1), $2);
+
+ $Short->Append($code, $short);
+ }
+ close IN;
+ # $Short->Write("JamoShort.pl");
+}
+
+##
+## Process Scripts.txt.
+##
+sub Scripts_txt()
+{
+ my @ScriptInfo;
+
+ if (not open(IN, "Scripts.txt")) {
+ die "$0: Scripts.txt: $!\n";
+ }
+ while (<IN>) {
+ next unless /^([0-9A-Fa-f]+)(?:\.\.([0-9A-Fa-f]+))?\s*;\s*(.+?)\s*\#/;
+
+ # Wait until all the scripts have been read since
+ # they are not listed in numeric order.
+ push @ScriptInfo, [ hex($1), hex($2||""), $3 ];
+ }
+ close IN;
+
+ # Now append the scripts properties in their code point order.
+
+ my %Script;
+ my $Scripts = Table->New();
+
+ for my $script (sort { $a->[0] <=> $b->[0] } @ScriptInfo)
+ {
+ my ($first, $last, $name) = @$script;
+ $Scripts->Append($first, $name);
+
+ $Script{$name} ||= Table->New(Is => $name,
+ Desc => "Script '$name'",
+ Fuzzy => 1);
+ $Script{$name}->Append($first, $name);
+
+ if ($last) {
+ $Scripts->Extend($last);
+ $Script{$name}->Extend($last);
+ }
+ }
+
+ # $Scripts->Write("Scripts.pl");
+
+ ## Common is everything not explicitly assigned to a Script
+ ##
+ ## ***shouldn't this be intersected with \p{Assigned}? ******
+ ##
+ New_Prop(Is => 'Common',
+ $Scripts->Invert,
+ Desc => 'Pseudo-Script of codepoints not in other Unicode scripts',
+ Fuzzy => 1);
+}
+
+##
+## Given a name like "Close Punctuation", return a regex (that when applied
+## with /i) matches any valid form of that name (e.g. "ClosePunctuation",
+## "Close-Punctuation", etc.)
+##
+## Accept any space, dash, or underbar where in the official name there is
+## space or a dash (or underbar, but there never is).
+##
+##
+sub NameToRegex($)
+{
+ my $Name = shift;
+ $Name =~ s/[- _]/(?:[-_]|\\s+)?/g;
+ return $Name;
+}
+
+##
+## Process Blocks.txt.
+##
+sub Blocks_txt()
+{
+ my $Blocks = Table->New();
+ my %Blocks;
+
+ if (not open IN, "Blocks.txt") {
+ die "$0: Blocks.txt: $!\n";
+ }
+
+ while (<IN>)
+ {
+ #next if not /Private Use$/;
+ next if not /^([0-9A-Fa-f]+)\.\.([0-9A-Fa-f]+)\s*;\s*(.+?)\s*$/;
+
+ my ($first, $last, $name) = (hex($1), hex($2), $3);
+
+ $Blocks->Append($first, $name);
+
+ $Blocks{$name} ||= Table->New(In => $name,
+ Desc => "Block '$name'",
+ Fuzzy => 1);
+ $Blocks{$name}->Append($first, $name);
+
+ if ($last and $last != $first) {
+ $Blocks->Extend($last);
+ $Blocks{$name}->Extend($last);
+ }
+ }
+ close IN;
+
+ # $Blocks->Write("Blocks.pl");
+}
+
+##
+## Read in the PropList.txt. It contains extended properties not
+## listed in the UnicodeData.txt, such as 'Other_Alphabetic':
+## alphabetic but not of the general category L; many modifiers
+## belong to this extended property category: while they are not
+## alphabets, they are alphabetic in nature.
+##
+sub PropList_txt()
+{
+ my @PropInfo;
+
+ if (not open IN, "PropList.txt") {
+ die "$0: PropList.txt: $!\n";
+ }
+
+ while (<IN>)
+ {
+ next unless /^([0-9A-Fa-f]+)(?:\.\.([0-9A-Fa-f]+))?\s*;\s*(.+?)\s*\#/;
+
+ # Wait until all the extended properties have been read since
+ # they are not listed in numeric order.
+ push @PropInfo, [ hex($1), hex($2||""), $3 ];
+ }
+ close IN;
+
+ # Now append the extended properties in their code point order.
+ my $Props = Table->New();
+ my %Prop;
+
+ for my $prop (sort { $a->[0] <=> $b->[0] } @PropInfo)
+ {
+ my ($first, $last, $name) = @$prop;
+ $Props->Append($first, $name);
+
+ $Prop{$name} ||= Table->New(Is => $name,
+ Desc => "Extended property '$name'",
+ Fuzzy => 1);
+ $Prop{$name}->Append($first, $name);
+
+ if ($last) {
+ $Props->Extend($last);
+ $Prop{$name}->Extend($last);
+ }
+ }
+
+ for (keys %Prop) {
+ (my $file = $PA_reverse{$_}) =~ tr/_//d;
+ # XXX I'm assuming that the names from %Prop don't suffer 8.3 clashes.
+ $BaseNames{lc $file}++;
+ $Prop{$_}->Write(
+ ["lib","gc_sc","$file.pl"],
+ "Binary property '$_'"
+ );
+ }
+
+ # Alphabetic is L, Nl, and Other_Alphabetic.
+ New_Prop(Is => 'Alphabetic',
+ Table->Merge($Cat{L}, $Cat{Nl}, $Prop{Other_Alphabetic}),
+ Desc => '[\p{L}\p{Nl}\p{OtherAlphabetic}]', # canonical names
+ Fuzzy => 1);
+
+ # Lowercase is Ll and Other_Lowercase.
+ New_Prop(Is => 'Lowercase',
+ Table->Merge($Cat{Ll}, $Prop{Other_Lowercase}),
+ Desc => '[\p{Ll}\p{OtherLowercase}]', # canonical names
+ Fuzzy => 1);
+
+ # Uppercase is Lu and Other_Uppercase.
+ New_Prop(Is => 'Uppercase',
+ Table->Merge($Cat{Lu}, $Prop{Other_Uppercase}),
+ Desc => '[\p{Lu}\p{OtherUppercase}]', # canonical names
+ Fuzzy => 1);
+
+ # Math is Sm and Other_Math.
+ New_Prop(Is => 'Math',
+ Table->Merge($Cat{Sm}, $Prop{Other_Math}),
+ Desc => '[\p{Sm}\p{OtherMath}]', # canonical names
+ Fuzzy => 1);
+
+ # ID_Start is Ll, Lu, Lt, Lm, Lo, Nl, and Other_ID_Start.
+ New_Prop(Is => 'ID_Start',
+ Table->Merge(@Cat{qw[Ll Lu Lt Lm Lo Nl]}, $Prop{Other_ID_Start}),
+ Desc => '[\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{Nl}\p{OtherIDStart}]',
+ Fuzzy => 1);
+
+ # ID_Continue is ID_Start, Mn, Mc, Nd, Pc, and Other_ID_Continue.
+ New_Prop(Is => 'ID_Continue',
+ Table->Merge(@Cat{qw[Ll Lu Lt Lm Lo Nl Mn Mc Nd Pc ]},
+ @Prop{qw[Other_ID_Start Other_ID_Continue]}),
+ Desc => '[\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\p{OtherIDContinue}]',
+ Fuzzy => 1);
+
+ # Default_Ignorable_Code_Point = Other_Default_Ignorable_Code_Point
+ # + Cf + Cc + Cs + Noncharacter + Variation_Selector
+ # - WhiteSpace - FFF9..FFFB (Annotation Characters)
+
+ my $Annotation = Table->New();
+ $Annotation->RawAppendRange(0xFFF9, 0xFFFB);
+
+ New_Prop(Is => 'Default_Ignorable_Code_Point',
+ Table->Merge(@Cat{qw[Cf Cc Cs]},
+ $Prop{Noncharacter_Code_Point},
+ $Prop{Variation_Selector},
+ $Prop{Other_Default_Ignorable_Code_Point})
+ ->Invert
+ ->Merge($Prop{White_Space}, $Annotation)
+ ->Invert,
+ Desc => '(?![\p{WhiteSpace}\x{FFF9}-\x{FFFB}])[\p{Cf}\p{Cc}'.
+ '\p{Cs}\p{NoncharacterCodePoint}\p{VariationSelector}'.
+ '\p{OtherDefaultIgnorableCodePoint}]',
+ Fuzzy => 1);
+
+}
+
+
+##
+## These are used in:
+## MakePropTestScript()
+## WriteAllMappings()
+## for making the test script.
+##
+my %FuzzyNameToTest;
+my %ExactNameToTest;
+
+
+## This used only for making the test script
+sub GenTests($$$$)
+{
+ my $FH = shift;
+ my $Prop = shift;
+ my $MatchCode = shift;
+ my $FailCode = shift;
+
+ if (defined $MatchCode) {
+ printf $FH qq/Expect(1, "\\x{%04X}", '\\p{$Prop}' );\n/, $MatchCode;
+ printf $FH qq/Expect(0, "\\x{%04X}", '\\p{^$Prop}');\n/, $MatchCode;
+ printf $FH qq/Expect(0, "\\x{%04X}", '\\P{$Prop}' );\n/, $MatchCode;
+ printf $FH qq/Expect(1, "\\x{%04X}", '\\P{^$Prop}');\n/, $MatchCode;
+ }
+ if (defined $FailCode) {
+ printf $FH qq/Expect(0, "\\x{%04X}", '\\p{$Prop}' );\n/, $FailCode;
+ printf $FH qq/Expect(1, "\\x{%04X}", '\\p{^$Prop}');\n/, $FailCode;
+ printf $FH qq/Expect(1, "\\x{%04X}", '\\P{$Prop}' );\n/, $FailCode;
+ printf $FH qq/Expect(0, "\\x{%04X}", '\\P{^$Prop}');\n/, $FailCode;
+ }
+}
+
+## This used only for making the test script
+sub ExpectError($$)
+{
+ my $FH = shift;
+ my $prop = shift;
+
+ print $FH qq/Error('\\p{$prop}');\n/;
+ print $FH qq/Error('\\P{$prop}');\n/;
+}
+
+## This used only for making the test script
+my @GoodSeps = (
+ " ",
+ "-",
+ " \t ",
+ "",
+ "",
+ "_",
+ );
+my @BadSeps = (
+ "--",
+ "__",
+ " _",
+ "/"
+ );
+
+## This used only for making the test script
+sub RandomlyFuzzifyName($;$)
+{
+ my $Name = shift;
+ my $WantError = shift; ## if true, make an error
+
+ my @parts;
+ for my $part (split /[-\s_]+/, $Name)
+ {
+ if (@parts) {
+ if ($WantError and rand() < 0.3) {
+ push @parts, $BadSeps[rand(@BadSeps)];
+ $WantError = 0;
+ } else {
+ push @parts, $GoodSeps[rand(@GoodSeps)];
+ }
+ }
+ my $switch = int rand(4);
+ if ($switch == 0) {
+ push @parts, uc $part;
+ } elsif ($switch == 1) {
+ push @parts, lc $part;
+ } elsif ($switch == 2) {
+ push @parts, ucfirst $part;
+ } else {
+ push @parts, $part;
+ }
+ }
+ my $new = join('', @parts);
+
+ if ($WantError) {
+ if (rand() >= 0.5) {
+ $new .= $BadSeps[rand(@BadSeps)];
+ } else {
+ $new = $BadSeps[rand(@BadSeps)] . $new;
+ }
+ }
+ return $new;
+}
+
+## This used only for making the test script
+sub MakePropTestScript()
+{
+ ## this written directly -- it's huge.
+ force_unlink ("TestProp.pl");
+ if (not open OUT, ">TestProp.pl") {
+ die "$0: TestProp.pl: $!\n";
+ }
+ print OUT <DATA>;
+
+ while (my ($Name, $Table) = each %ExactNameToTest)
+ {
+ GenTests(*OUT, $Name, $Table->ValidCode, $Table->InvalidCode);
+ ExpectError(*OUT, uc $Name) if uc $Name ne $Name;
+ ExpectError(*OUT, lc $Name) if lc $Name ne $Name;
+ }
+
+
+ while (my ($Name, $Table) = each %FuzzyNameToTest)
+ {
+ my $Orig = $CanonicalToOrig{$Name};
+ my %Names = (
+ $Name => 1,
+ $Orig => 1,
+ RandomlyFuzzifyName($Orig) => 1
+ );
+
+ for my $N (keys %Names) {
+ GenTests(*OUT, $N, $Table->ValidCode, $Table->InvalidCode);
+ }
+
+ ExpectError(*OUT, RandomlyFuzzifyName($Orig, 'ERROR'));
+ }
+
+ print OUT "Finished();\n";
+ close OUT;
+}
+
+
+##
+## These are used only in:
+## RegisterFileForName()
+## WriteAllMappings()
+##
+my %Exact; ## will become %utf8::Exact;
+my %Canonical; ## will become %utf8::Canonical;
+my %CaComment; ## Comment for %Canonical entry of same key
+
+##
+## Given info about a name and a datafile that it should be associated with,
+## register that assocation in %Exact and %Canonical.
+sub RegisterFileForName($$$$)
+{
+ my $Type = shift;
+ my $Name = shift;
+ my $IsFuzzy = shift;
+ my $filename = shift;
+
+ ##
+ ## Now in details for the mapping. $Type eq 'Is' has the
+ ## Is removed, as it will be removed in utf8_heavy when this
+ ## data is being checked. In keeps its "In", but a second
+ ## sans-In record is written if it doesn't conflict with
+ ## anything already there.
+ ##
+ if (not $IsFuzzy)
+ {
+ if ($Type eq 'Is') {
+ die "oops[$Name]" if $Exact{$Name};
+ $Exact{$Name} = $filename;
+ } else {
+ die "oops[$Type$Name]" if $Exact{"$Type$Name"};
+ $Exact{"$Type$Name"} = $filename;
+ $Exact{$Name} = $filename if not $Exact{$Name};
+ }
+ }
+ else
+ {
+ my $CName = lc $Name;
+ if ($Type eq 'Is') {
+ die "oops[$CName]" if $Canonical{$CName};
+ $Canonical{$CName} = $filename;
+ $CaComment{$CName} = $Name if $Name =~ tr/A-Z// >= 2;
+ } else {
+ die "oops[$Type$CName]" if $Canonical{lc "$Type$CName"};
+ $Canonical{lc "$Type$CName"} = $filename;
+ $CaComment{lc "$Type$CName"} = "$Type$Name";
+ if (not $Canonical{$CName}) {
+ $Canonical{$CName} = $filename;
+ $CaComment{$CName} = "$Type$Name";
+ }
+ }
+ }
+}
+
+##
+## Writes the info accumulated in
+##
+## %TableInfo;
+## %FuzzyNames;
+## %AliasInfo;
+##
+##
+sub WriteAllMappings()
+{
+ my @MAP;
+
+ ## 'Is' *MUST* come first, so its names have precidence over 'In's
+ for my $Type ('Is', 'In')
+ {
+ my %RawNameToFile; ## a per-$Type cache
+
+ for my $Name (sort {length $a <=> length $b} keys %{$TableInfo{$Type}})
+ {
+ ## Note: $Name is already canonical
+ my $Table = $TableInfo{$Type}->{$Name};
+ my $IsFuzzy = $FuzzyNames{$Type}->{$Name};
+
+ ## Need an 8.3 safe filename (which means "an 8 safe" $filename)
+ my $filename;
+ {
+ ## 'Is' items lose 'Is' from the basename.
+ $filename = $Type eq 'Is' ?
+ ($PVA_reverse{sc}{$Name} || $Name) :
+ "$Type$Name";
+
+ $filename =~ s/[^\w_]+/_/g; # "L&" -> "L_"
+ substr($filename, 8) = '' if length($filename) > 8;
+
+ ##
+ ## Make sure the basename doesn't conflict with something we
+ ## might have already written. If we have, say,
+ ## InGreekExtended1
+ ## InGreekExtended2
+ ## they become
+ ## InGreekE
+ ## InGreek2
+ ##
+ while (my $num = $BaseNames{lc $filename}++)
+ {
+ $num++; ## so basenames with numbers start with '2', which
+ ## just looks more natural.
+ ## Want to append $num, but if it'll make the basename longer
+ ## than 8 characters, pre-truncate $filename so that the result
+ ## is acceptable.
+ my $delta = length($filename) + length($num) - 8;
+ if ($delta > 0) {
+ substr($filename, -$delta) = $num;
+ } else {
+ $filename .= $num;
+ }
+ }
+ };
+
+ ##
+ ## Construct a nice comment to add to the file, and build data
+ ## for the "./Properties" file along the way.
+ ##
+ my $Comment;
+ {
+ my $Desc = $TableDesc{$Type}->{$Name} || "";
+ ## get list of names this table is reference by
+ my @Supported = $Name;
+ while (my ($Orig, $Alias) = each %{ $AliasInfo{$Type} })
+ {
+ if ($Orig eq $Name) {
+ push @Supported, $Alias;
+ }
+ }
+
+ my $TypeToShow = $Type eq 'Is' ? "" : $Type;
+ my $OrigProp;
+
+ $Comment = "This file supports:\n";
+ for my $N (@Supported)
+ {
+ my $IsFuzzy = $FuzzyNames{$Type}->{$N};
+ my $Prop = "\\p{$TypeToShow$Name}";
+ $OrigProp = $Prop if not $OrigProp; #cache for aliases
+ if ($IsFuzzy) {
+ $Comment .= "\t$Prop (and fuzzy permutations)\n";
+ } else {
+ $Comment .= "\t$Prop\n";
+ }
+ my $MyDesc = ($N eq $Name) ? $Desc : "Alias for $OrigProp ($Desc)";
+
+ push @MAP, sprintf("%s %-42s %s\n",
+ $IsFuzzy ? '*' : ' ', $Prop, $MyDesc);
+ }
+ if ($Desc) {
+ $Comment .= "\nMeaning: $Desc\n";
+ }
+
+ }
+ ##
+ ## Okay, write the file...
+ ##
+ $Table->Write(["lib","gc_sc","$filename.pl"], $Comment);
+
+ ## and register it
+ $RawNameToFile{$Name} = $filename;
+ RegisterFileForName($Type => $Name, $IsFuzzy, $filename);
+
+ if ($IsFuzzy)
+ {
+ my $CName = CanonicalName($Type . '_'. $Name);
+ $FuzzyNameToTest{$Name} = $Table if !$FuzzyNameToTest{$Name};
+ $FuzzyNameToTest{$CName} = $Table if !$FuzzyNameToTest{$CName};
+ } else {
+ $ExactNameToTest{$Name} = $Table;
+ }
+
+ }
+
+ ## Register aliase info
+ for my $Name (sort {length $a <=> length $b} keys %{$AliasInfo{$Type}})
+ {
+ my $Alias = $AliasInfo{$Type}->{$Name};
+ my $IsFuzzy = $FuzzyNames{$Type}->{$Alias};
+ my $filename = $RawNameToFile{$Name};
+ die "oops [$Alias]->[$Name]" if not $filename;
+ RegisterFileForName($Type => $Alias, $IsFuzzy, $filename);
+
+ my $Table = $TableInfo{$Type}->{$Name};
+ die "oops" if not $Table;
+ if ($IsFuzzy)
+ {
+ my $CName = CanonicalName($Type .'_'. $Alias);
+ $FuzzyNameToTest{$Alias} = $Table if !$FuzzyNameToTest{$Alias};
+ $FuzzyNameToTest{$CName} = $Table if !$FuzzyNameToTest{$CName};
+ } else {
+ $ExactNameToTest{$Alias} = $Table;
+ }
+ }
+ }
+
+ ##
+ ## Write out the property list
+ ##
+ {
+ my @OUT = (
+ "##\n",
+ "## This file created by $0\n",
+ "## List of built-in \\p{...}/\\P{...} properties.\n",
+ "##\n",
+ "## '*' means name may be 'fuzzy'\n",
+ "##\n\n",
+ sort { substr($a,2) cmp substr($b, 2) } @MAP,
+ );
+ WriteIfChanged('Properties', @OUT);
+ }
+
+ use Text::Tabs (); ## using this makes the files about half the size
+
+ ## Write Exact.pl
+ {
+ my @OUT = (
+ $HEADER,
+ "##\n",
+ "## Data in this file used by ../utf8_heavy.pl\n",
+ "##\n\n",
+ "## Mapping from name to filename in ./lib/gc_sc\n",
+ "%utf8::Exact = (\n",
+ );
+
+ $Exact{InGreek} = 'InGreekA'; # this is evil kludge
+ for my $Name (sort keys %Exact)
+ {
+ my $File = $Exact{$Name};
+ $Name = $Name =~ m/\W/ ? qq/'$Name'/ : " $Name ";
+ my $Text = sprintf("%-15s => %s,\n", $Name, qq/'$File'/);
+ push @OUT, Text::Tabs::unexpand($Text);
+ }
+ push @OUT, ");\n1;\n";
+
+ WriteIfChanged('Exact.pl', @OUT);
+ }
+
+ ## Write Canonical.pl
+ {
+ my @OUT = (
+ $HEADER,
+ "##\n",
+ "## Data in this file used by ../utf8_heavy.pl\n",
+ "##\n\n",
+ "## Mapping from lc(canonical name) to filename in ./lib\n",
+ "%utf8::Canonical = (\n",
+ );
+ my $Trail = ""; ## used just to keep the spacing pretty
+ for my $Name (sort keys %Canonical)
+ {
+ my $File = $Canonical{$Name};
+ if ($CaComment{$Name}) {
+ push @OUT, "\n" if not $Trail;
+ push @OUT, " # $CaComment{$Name}\n";
+ $Trail = "\n";
+ } else {
+ $Trail = "";
+ }
+ $Name = $Name =~ m/\W/ ? qq/'$Name'/ : " $Name ";
+ my $Text = sprintf(" %-41s => %s,\n$Trail", $Name, qq/'$File'/);
+ push @OUT, Text::Tabs::unexpand($Text);
+ }
+ push @OUT, ");\n1\n";
+ WriteIfChanged('Canonical.pl', @OUT);
+ }
+
+ MakePropTestScript() if $MakeTestScript;
+}
+
+
+sub SpecialCasing_txt()
+{
+ #
+ # Read in the special cases.
+ #
+
+ my %CaseInfo;
+
+ if (not open IN, "SpecialCasing.txt") {
+ die "$0: SpecialCasing.txt: $!\n";
+ }
+ while (<IN>) {
+ next unless /^[0-9A-Fa-f]+;/;
+ s/\#.*//;
+ s/\s+$//;
+
+ my ($code, $lower, $title, $upper, $condition) = split(/\s*;\s*/);
+
+ if ($condition) { # not implemented yet
+ print "# SKIPPING $_\n" if $Verbose;
+ next;
+ }
+
+ # Wait until all the special cases have been read since
+ # they are not listed in numeric order.
+ my $ix = hex($code);
+ push @{$CaseInfo{Lower}}, [ $ix, $code, $lower ]
+ unless $code eq $lower;
+ push @{$CaseInfo{Title}}, [ $ix, $code, $title ]
+ unless $code eq $title;
+ push @{$CaseInfo{Upper}}, [ $ix, $code, $upper ]
+ unless $code eq $upper;
+ }
+ close IN;
+
+ # Now write out the special cases properties in their code point order.
+ # Prepend them to the To/{Upper,Lower,Title}.pl.
+
+ for my $case (qw(Lower Title Upper))
+ {
+ my $NormalCase = do "To/$case.pl" || die "$0: $@\n";
+
+ my @OUT =
+ (
+ $HEADER, $INTERNAL_ONLY, "\n",
+ "# The key: UTF-8 _bytes_, the value: UTF-8 (speed hack)\n",
+ "%utf8::ToSpec$case =\n(\n",
+ );
+
+ for my $prop (sort { $a->[0] <=> $b->[0] } @{$CaseInfo{$case}}) {
+ my ($ix, $code, $to) = @$prop;
+ my $tostr =
+ join "", map { sprintf "\\x{%s}", $_ } split ' ', $to;
+ push @OUT, sprintf qq["%s" => "$tostr",\n], join("", map { sprintf "\\x%02X", $_ } unpack("U0C*", pack("U", $ix)));
+ # Remove any single-character mappings for
+ # the same character since we are going for
+ # the special casing rules.
+ $NormalCase =~ s/^$code\t\t\w+\n//m;
+ }
+ push @OUT, (
+ ");\n\n",
+ "return <<'END';\n",
+ $NormalCase,
+ "END\n"
+ );
+ WriteIfChanged(["To","$case.pl"], @OUT);
+ }
+}
+
+#
+# Read in the case foldings.
+#
+# We will do full case folding, C + F + I (see CaseFolding.txt). Note that
+# there are no I entries starting with Unicode 3.2, but leaving it in allows
+# for backward compatibility.
+#
+sub CaseFolding_txt()
+{
+ if (not open IN, "CaseFolding.txt") {
+ die "$0: CaseFolding.txt: $!\n";
+ }
+
+ my $Fold = Table->New();
+ my %Fold;
+
+ while (<IN>) {
+ # Skip status 'S', simple case folding
+ next unless /^([0-9A-Fa-f]+)\s*;\s*([CFI])\s*;\s*([0-9A-Fa-f]+(?: [0-9A-Fa-f]+)*)\s*;/;
+
+ my ($code, $status, $fold) = (hex($1), $2, $3);
+
+ if ($status eq 'C') { # Common: one-to-one folding
+ # No append() since several codes may fold into one.
+ $Fold->RawAppendRange($code, $code, $fold);
+ } else { # F: full, or I: dotted uppercase I -> dotless lowercase I
+ $Fold{$code} = $fold;
+ }
+ }
+ close IN;
+
+ $Fold->Write("To/Fold.pl");
+
+ #
+ # Prepend the special foldings to the common foldings.
+ #
+ my $CommonFold = do "To/Fold.pl" || die "$0: To/Fold.pl: $!\n";
+
+ my @OUT =
+ (
+ $HEADER, $INTERNAL_ONLY, "\n",
+ "# The key: UTF-8 _bytes_, the value: UTF-8 (speed hack)\n",
+ "%utf8::ToSpecFold =\n(\n",
+ );
+ for my $code (sort { $a <=> $b } keys %Fold) {
+ my $foldstr =
+ join "", map { sprintf "\\x{%s}", $_ } split ' ', $Fold{$code};
+ push @OUT, sprintf qq["%s" => "$foldstr",\n], join("", map { sprintf "\\x%02X", $_ } unpack("U0C*", pack("U", $code)));
+ }
+ push @OUT, (
+ ");\n\n",
+ "return <<'END';\n",
+ $CommonFold,
+ "END\n",
+ );
+
+ WriteIfChanged(["To","Fold.pl"], @OUT);
+}
+
+## Do it....
+
+Build_Aliases();
+UnicodeData_Txt();
+PropList_txt();
+
+Scripts_txt();
+Blocks_txt();
+
+WriteAllMappings();
+
+LineBreak_Txt();
+ArabicShaping_txt();
+EastAsianWidth_txt();
+HangulSyllableType_txt();
+Jamo_txt();
+SpecialCasing_txt();
+CaseFolding_txt();
+
+if ( $FileList and $MakeList ) {
+
+ print "Updating '$FileList'\n"
+ if ($Verbose);
+
+ open my $ofh,">",$FileList
+ or die "Can't write to '$FileList':$!";
+ print $ofh <<"EOFHEADER";
+#
+# mktables.lst -- File list for mktables.
+#
+# Autogenerated on @{[scalar localtime]}
+#
+# - First section is input files
+# (mktables itself is automatically included)
+# - Section seperator is /^=+\$/
+# - Second section is a list of output files.
+# - Lines matching /^\\s*#/ are treated as comments
+# which along with blank lines are ignored.
+#
+
+# Input files:
+
+EOFHEADER
+ my @input=("version",glob('*.txt'));
+ print $ofh "$_\n" for
+ sort(@input),
+ "\n=================================\n",
+ "# Output files:\n",
+ # special files
+ "Properties";
+
+
+ require File::Find;
+ my @output_files;
+ File::Find::find({
+ no_chdir=>1,
+ wanted=>sub {
+ if (/\.pl$/) {
+ s!^\./!!;
+ push @output_files, "$_\n";
+ }
+ },
+ },".");
+
+ print $ofh sort @output_files;
+ print $ofh "\n# ",scalar(@input)," input files\n",
+ "# ",scalar(@output_files)+1," output files\n\n",
+ "# End list\n";
+ close $ofh
+ or warn "Failed to close $ofh: $!";
+
+ print "Filelist has ",scalar(@input)," input files and ",
+ scalar(@output_files)+1," output files\n"
+ if $Verbose;
+}
+print "All done\n" if $Verbose;
+exit(0);
+
+## TRAILING CODE IS USED BY MakePropTestScript()
+__DATA__
+use strict;
+use warnings;
+
+my $Tests = 0;
+my $Fails = 0;
+
+sub Expect($$$)
+{
+ my $Expect = shift;
+ my $String = shift;
+ my $Regex = shift;
+ my $Line = (caller)[2];
+
+ $Tests++;
+ my $RegObj;
+ my $result = eval {
+ $RegObj = qr/$Regex/;
+ $String =~ $RegObj ? 1 : 0
+ };
+
+ if (not defined $result) {
+ print "couldn't compile /$Regex/ on $0 line $Line: $@\n";
+ $Fails++;
+ } elsif ($result ^ $Expect) {
+ print "bad result (expected $Expect) on $0 line $Line: $@\n";
+ $Fails++;
+ }
+}
+
+sub Error($)
+{
+ my $Regex = shift;
+ $Tests++;
+ if (eval { 'x' =~ qr/$Regex/; 1 }) {
+ $Fails++;
+ my $Line = (caller)[2];
+ print "expected error for /$Regex/ on $0 line $Line: $@\n";
+ }
+}
+
+sub Finished()
+{
+ if ($Fails == 0) {
+ print "All $Tests tests passed.\n";
+ exit(0);
+ } else {
+ print "$Tests tests, $Fails failed!\n";
+ exit(-1);
+ }
+}
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/mktables.lst b/Master/tlpkg/tlperl.straw/lib/unicore/mktables.lst
new file mode 100755
index 00000000000..f4c55bb64ec
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/mktables.lst
@@ -0,0 +1,563 @@
+#
+# mktables.lst -- File list for mktables.
+#
+# Autogenerated on Mon Jan 26 17:57:26 2009
+#
+# - First section is input files
+# (mktables itself is automatically included)
+# - Section seperator is /^=+$/
+# - Second section is a list of output files.
+# - Lines matching /^\s*#/ are treated as comments
+# which along with blank lines are ignored.
+#
+
+# Input files:
+
+ArabicShaping.txt
+BidiMirroring.txt
+Blocks.txt
+CaseFolding.txt
+CompositionExclusions.txt
+EastAsianWidth.txt
+HangulSyllableType.txt
+Index.txt
+Jamo.txt
+LineBreak.txt
+NameAliases.txt
+NamedSequences.txt
+NamedSqProv.txt
+NamesList.txt
+NormalizationCorrections.txt
+PropList.txt
+PropValueAliases.txt
+PropertyAliases.txt
+ReadMe.txt
+Scripts.txt
+SpecialCasing.txt
+StandardizedVariants.txt
+UnicodeData.txt
+version
+
+=================================
+
+# Output files:
+
+Properties
+Canonical.pl
+CombiningClass.pl
+Decomposition.pl
+Exact.pl
+Name.pl
+PVA.pl
+To/Digit.pl
+To/Fold.pl
+To/Lower.pl
+To/Title.pl
+To/Upper.pl
+lib/bc/AL.pl
+lib/bc/AN.pl
+lib/bc/B.pl
+lib/bc/BN.pl
+lib/bc/CS.pl
+lib/bc/EN.pl
+lib/bc/ES.pl
+lib/bc/ET.pl
+lib/bc/L.pl
+lib/bc/LRE.pl
+lib/bc/LRO.pl
+lib/bc/NSM.pl
+lib/bc/ON.pl
+lib/bc/PDF.pl
+lib/bc/R.pl
+lib/bc/RLE.pl
+lib/bc/RLO.pl
+lib/bc/S.pl
+lib/bc/WS.pl
+lib/ccc/A.pl
+lib/ccc/AL.pl
+lib/ccc/AR.pl
+lib/ccc/ATAR.pl
+lib/ccc/ATB.pl
+lib/ccc/ATBL.pl
+lib/ccc/B.pl
+lib/ccc/BL.pl
+lib/ccc/BR.pl
+lib/ccc/DA.pl
+lib/ccc/DB.pl
+lib/ccc/IS.pl
+lib/ccc/KV.pl
+lib/ccc/L.pl
+lib/ccc/NK.pl
+lib/ccc/NR.pl
+lib/ccc/OV.pl
+lib/ccc/R.pl
+lib/ccc/VR.pl
+lib/dt/Can.pl
+lib/dt/Com.pl
+lib/dt/Enc.pl
+lib/dt/Fin.pl
+lib/dt/Font.pl
+lib/dt/Fra.pl
+lib/dt/Init.pl
+lib/dt/Iso.pl
+lib/dt/Med.pl
+lib/dt/Nar.pl
+lib/dt/Nb.pl
+lib/dt/Sml.pl
+lib/dt/Sqr.pl
+lib/dt/Sub.pl
+lib/dt/Sup.pl
+lib/dt/Vert.pl
+lib/dt/Wide.pl
+lib/ea/A.pl
+lib/ea/F.pl
+lib/ea/H.pl
+lib/ea/N.pl
+lib/ea/Na.pl
+lib/ea/W.pl
+lib/gc_sc/AHex.pl
+lib/gc_sc/ASCII.pl
+lib/gc_sc/Alnum.pl
+lib/gc_sc/Alpha.pl
+lib/gc_sc/Alphabet.pl
+lib/gc_sc/Any.pl
+lib/gc_sc/Arab.pl
+lib/gc_sc/Armn.pl
+lib/gc_sc/AsciiHex.pl
+lib/gc_sc/Assigned.pl
+lib/gc_sc/Bali.pl
+lib/gc_sc/Beng.pl
+lib/gc_sc/BidiC.pl
+lib/gc_sc/BidiCont.pl
+lib/gc_sc/Blank.pl
+lib/gc_sc/Bopo.pl
+lib/gc_sc/Brai.pl
+lib/gc_sc/Bugi.pl
+lib/gc_sc/Buhd.pl
+lib/gc_sc/C.pl
+lib/gc_sc/Canadian.pl
+lib/gc_sc/Cari.pl
+lib/gc_sc/Cc.pl
+lib/gc_sc/Cf.pl
+lib/gc_sc/Cham.pl
+lib/gc_sc/Cher.pl
+lib/gc_sc/Cn.pl
+lib/gc_sc/Cntrl.pl
+lib/gc_sc/Co.pl
+lib/gc_sc/Copt.pl
+lib/gc_sc/Cprt.pl
+lib/gc_sc/Cs.pl
+lib/gc_sc/Cyrl.pl
+lib/gc_sc/Dash.pl
+lib/gc_sc/Dash2.pl
+lib/gc_sc/DefaultI.pl
+lib/gc_sc/Dep.pl
+lib/gc_sc/Deprecat.pl
+lib/gc_sc/Deva.pl
+lib/gc_sc/Dia.pl
+lib/gc_sc/Diacriti.pl
+lib/gc_sc/Digit.pl
+lib/gc_sc/Dsrt.pl
+lib/gc_sc/Ethi.pl
+lib/gc_sc/Ext.pl
+lib/gc_sc/Extender.pl
+lib/gc_sc/Geor.pl
+lib/gc_sc/Glag.pl
+lib/gc_sc/Goth.pl
+lib/gc_sc/Graph.pl
+lib/gc_sc/Grek.pl
+lib/gc_sc/Gujr.pl
+lib/gc_sc/Guru.pl
+lib/gc_sc/Hang.pl
+lib/gc_sc/Hani.pl
+lib/gc_sc/Hano.pl
+lib/gc_sc/Hebr.pl
+lib/gc_sc/Hex.pl
+lib/gc_sc/HexDigit.pl
+lib/gc_sc/Hira.pl
+lib/gc_sc/HorizSpa.pl
+lib/gc_sc/Hyphen.pl
+lib/gc_sc/Hyphen2.pl
+lib/gc_sc/IDSB.pl
+lib/gc_sc/IDST.pl
+lib/gc_sc/IdContin.pl
+lib/gc_sc/IdStart.pl
+lib/gc_sc/Ideo.pl
+lib/gc_sc/Ideograp.pl
+lib/gc_sc/IdsBinar.pl
+lib/gc_sc/IdsTrina.pl
+lib/gc_sc/InAegean.pl
+lib/gc_sc/InAlphab.pl
+lib/gc_sc/InAncie2.pl
+lib/gc_sc/InAncie3.pl
+lib/gc_sc/InAncien.pl
+lib/gc_sc/InArabi2.pl
+lib/gc_sc/InArabi3.pl
+lib/gc_sc/InArabi4.pl
+lib/gc_sc/InArabic.pl
+lib/gc_sc/InArmeni.pl
+lib/gc_sc/InArrows.pl
+lib/gc_sc/InBaline.pl
+lib/gc_sc/InBasicL.pl
+lib/gc_sc/InBengal.pl
+lib/gc_sc/InBlockE.pl
+lib/gc_sc/InBopom2.pl
+lib/gc_sc/InBopomo.pl
+lib/gc_sc/InBoxDra.pl
+lib/gc_sc/InBraill.pl
+lib/gc_sc/InBugine.pl
+lib/gc_sc/InBuhid.pl
+lib/gc_sc/InByzant.pl
+lib/gc_sc/InCarian.pl
+lib/gc_sc/InCham.pl
+lib/gc_sc/InCherok.pl
+lib/gc_sc/InCjkCo2.pl
+lib/gc_sc/InCjkCo3.pl
+lib/gc_sc/InCjkCo4.pl
+lib/gc_sc/InCjkCom.pl
+lib/gc_sc/InCjkRad.pl
+lib/gc_sc/InCjkStr.pl
+lib/gc_sc/InCjkSym.pl
+lib/gc_sc/InCjkUn2.pl
+lib/gc_sc/InCjkUn3.pl
+lib/gc_sc/InCjkUni.pl
+lib/gc_sc/InCombi2.pl
+lib/gc_sc/InCombi3.pl
+lib/gc_sc/InCombi4.pl
+lib/gc_sc/InCombin.pl
+lib/gc_sc/InContro.pl
+lib/gc_sc/InCoptic.pl
+lib/gc_sc/InCounti.pl
+lib/gc_sc/InCunei2.pl
+lib/gc_sc/InCuneif.pl
+lib/gc_sc/InCurren.pl
+lib/gc_sc/InCyprio.pl
+lib/gc_sc/InCyril2.pl
+lib/gc_sc/InCyril3.pl
+lib/gc_sc/InCyril4.pl
+lib/gc_sc/InCyrill.pl
+lib/gc_sc/InDesere.pl
+lib/gc_sc/InDevana.pl
+lib/gc_sc/InDingba.pl
+lib/gc_sc/InDomino.pl
+lib/gc_sc/InEnclo2.pl
+lib/gc_sc/InEnclos.pl
+lib/gc_sc/InEthio2.pl
+lib/gc_sc/InEthio3.pl
+lib/gc_sc/InEthiop.pl
+lib/gc_sc/InGenera.pl
+lib/gc_sc/InGeomet.pl
+lib/gc_sc/InGeorg2.pl
+lib/gc_sc/InGeorgi.pl
+lib/gc_sc/InGlagol.pl
+lib/gc_sc/InGothic.pl
+lib/gc_sc/InGreekA.pl
+lib/gc_sc/InGreekE.pl
+lib/gc_sc/InGujara.pl
+lib/gc_sc/InGurmuk.pl
+lib/gc_sc/InHalfwi.pl
+lib/gc_sc/InHangu2.pl
+lib/gc_sc/InHangu3.pl
+lib/gc_sc/InHangul.pl
+lib/gc_sc/InHanuno.pl
+lib/gc_sc/InHebrew.pl
+lib/gc_sc/InHighPr.pl
+lib/gc_sc/InHighSu.pl
+lib/gc_sc/InHiraga.pl
+lib/gc_sc/InIdeogr.pl
+lib/gc_sc/InIpaExt.pl
+lib/gc_sc/InKanbun.pl
+lib/gc_sc/InKangxi.pl
+lib/gc_sc/InKannad.pl
+lib/gc_sc/InKatak2.pl
+lib/gc_sc/InKataka.pl
+lib/gc_sc/InKayahL.pl
+lib/gc_sc/InKharos.pl
+lib/gc_sc/InKhmer.pl
+lib/gc_sc/InKhmerS.pl
+lib/gc_sc/InLao.pl
+lib/gc_sc/InLatin1.pl
+lib/gc_sc/InLatin2.pl
+lib/gc_sc/InLatin3.pl
+lib/gc_sc/InLatin4.pl
+lib/gc_sc/InLatin5.pl
+lib/gc_sc/InLatinE.pl
+lib/gc_sc/InLepcha.pl
+lib/gc_sc/InLetter.pl
+lib/gc_sc/InLimbu.pl
+lib/gc_sc/InLinea2.pl
+lib/gc_sc/InLinear.pl
+lib/gc_sc/InLowSur.pl
+lib/gc_sc/InLycian.pl
+lib/gc_sc/InLydian.pl
+lib/gc_sc/InMahjon.pl
+lib/gc_sc/InMalaya.pl
+lib/gc_sc/InMathe2.pl
+lib/gc_sc/InMathem.pl
+lib/gc_sc/InMisce2.pl
+lib/gc_sc/InMisce3.pl
+lib/gc_sc/InMisce4.pl
+lib/gc_sc/InMisce5.pl
+lib/gc_sc/InMiscel.pl
+lib/gc_sc/InModifi.pl
+lib/gc_sc/InMongol.pl
+lib/gc_sc/InMusica.pl
+lib/gc_sc/InMyanma.pl
+lib/gc_sc/InNewTai.pl
+lib/gc_sc/InNko.pl
+lib/gc_sc/InNumber.pl
+lib/gc_sc/InOgham.pl
+lib/gc_sc/InOlChik.pl
+lib/gc_sc/InOldIta.pl
+lib/gc_sc/InOldPer.pl
+lib/gc_sc/InOptica.pl
+lib/gc_sc/InOriya.pl
+lib/gc_sc/InOsmany.pl
+lib/gc_sc/InPhagsP.pl
+lib/gc_sc/InPhaist.pl
+lib/gc_sc/InPhoeni.pl
+lib/gc_sc/InPhone2.pl
+lib/gc_sc/InPhonet.pl
+lib/gc_sc/InPrivat.pl
+lib/gc_sc/InRejang.pl
+lib/gc_sc/InRunic.pl
+lib/gc_sc/InSauras.pl
+lib/gc_sc/InShavia.pl
+lib/gc_sc/InSinhal.pl
+lib/gc_sc/InSmallF.pl
+lib/gc_sc/InSpacin.pl
+lib/gc_sc/InSpecia.pl
+lib/gc_sc/InSundan.pl
+lib/gc_sc/InSupers.pl
+lib/gc_sc/InSuppl2.pl
+lib/gc_sc/InSuppl3.pl
+lib/gc_sc/InSuppl4.pl
+lib/gc_sc/InSuppl5.pl
+lib/gc_sc/InSuppl6.pl
+lib/gc_sc/InSupple.pl
+lib/gc_sc/InSyloti.pl
+lib/gc_sc/InSyriac.pl
+lib/gc_sc/InTagalo.pl
+lib/gc_sc/InTagban.pl
+lib/gc_sc/InTags.pl
+lib/gc_sc/InTaiLe.pl
+lib/gc_sc/InTaiXua.pl
+lib/gc_sc/InTamil.pl
+lib/gc_sc/InTelugu.pl
+lib/gc_sc/InThaana.pl
+lib/gc_sc/InThai.pl
+lib/gc_sc/InTibeta.pl
+lib/gc_sc/InTifina.pl
+lib/gc_sc/InUgarit.pl
+lib/gc_sc/InUnifie.pl
+lib/gc_sc/InVai.pl
+lib/gc_sc/InVaria2.pl
+lib/gc_sc/InVariat.pl
+lib/gc_sc/InVertic.pl
+lib/gc_sc/InYiRadi.pl
+lib/gc_sc/InYiSyll.pl
+lib/gc_sc/InYijing.pl
+lib/gc_sc/JoinC.pl
+lib/gc_sc/JoinCont.pl
+lib/gc_sc/Kana.pl
+lib/gc_sc/KayahLi.pl
+lib/gc_sc/Khar.pl
+lib/gc_sc/Khmr.pl
+lib/gc_sc/Knda.pl
+lib/gc_sc/L.pl
+lib/gc_sc/LC.pl
+lib/gc_sc/LOE.pl
+lib/gc_sc/Laoo.pl
+lib/gc_sc/Latn.pl
+lib/gc_sc/Lepc.pl
+lib/gc_sc/Limb.pl
+lib/gc_sc/LinearB.pl
+lib/gc_sc/Ll.pl
+lib/gc_sc/Lm.pl
+lib/gc_sc/Lo.pl
+lib/gc_sc/LogicalO.pl
+lib/gc_sc/Lower.pl
+lib/gc_sc/Lowercas.pl
+lib/gc_sc/Lt.pl
+lib/gc_sc/Lu.pl
+lib/gc_sc/Lyci.pl
+lib/gc_sc/Lydi.pl
+lib/gc_sc/M.pl
+lib/gc_sc/Math.pl
+lib/gc_sc/Mc.pl
+lib/gc_sc/Me.pl
+lib/gc_sc/Mlym.pl
+lib/gc_sc/Mn.pl
+lib/gc_sc/Mong.pl
+lib/gc_sc/Mymr.pl
+lib/gc_sc/N.pl
+lib/gc_sc/NChar.pl
+lib/gc_sc/Nd.pl
+lib/gc_sc/NewTaiLu.pl
+lib/gc_sc/Nkoo.pl
+lib/gc_sc/Nl.pl
+lib/gc_sc/No.pl
+lib/gc_sc/Nonchara.pl
+lib/gc_sc/OAlpha.pl
+lib/gc_sc/ODI.pl
+lib/gc_sc/OGrExt.pl
+lib/gc_sc/OIDC.pl
+lib/gc_sc/OIDS.pl
+lib/gc_sc/OLower.pl
+lib/gc_sc/OMath.pl
+lib/gc_sc/OUpper.pl
+lib/gc_sc/Ogam.pl
+lib/gc_sc/OlChiki.pl
+lib/gc_sc/OldItali.pl
+lib/gc_sc/OldPersi.pl
+lib/gc_sc/Orya.pl
+lib/gc_sc/Osma.pl
+lib/gc_sc/OtherAlp.pl
+lib/gc_sc/OtherDef.pl
+lib/gc_sc/OtherGra.pl
+lib/gc_sc/OtherIdC.pl
+lib/gc_sc/OtherIdS.pl
+lib/gc_sc/OtherLow.pl
+lib/gc_sc/OtherMat.pl
+lib/gc_sc/OtherUpp.pl
+lib/gc_sc/P.pl
+lib/gc_sc/PatSyn.pl
+lib/gc_sc/PatWS.pl
+lib/gc_sc/PatternS.pl
+lib/gc_sc/PatternW.pl
+lib/gc_sc/Pc.pl
+lib/gc_sc/Pd.pl
+lib/gc_sc/Pe.pl
+lib/gc_sc/PerlSpac.pl
+lib/gc_sc/PerlWord.pl
+lib/gc_sc/Pf.pl
+lib/gc_sc/PhagsPa.pl
+lib/gc_sc/Phnx.pl
+lib/gc_sc/Pi.pl
+lib/gc_sc/Po.pl
+lib/gc_sc/PosixAln.pl
+lib/gc_sc/PosixAlp.pl
+lib/gc_sc/PosixBla.pl
+lib/gc_sc/PosixCnt.pl
+lib/gc_sc/PosixDig.pl
+lib/gc_sc/PosixGra.pl
+lib/gc_sc/PosixLow.pl
+lib/gc_sc/PosixPri.pl
+lib/gc_sc/PosixPun.pl
+lib/gc_sc/PosixSpa.pl
+lib/gc_sc/PosixUpp.pl
+lib/gc_sc/Print.pl
+lib/gc_sc/Ps.pl
+lib/gc_sc/Punct.pl
+lib/gc_sc/QMark.pl
+lib/gc_sc/Qaai.pl
+lib/gc_sc/Quotatio.pl
+lib/gc_sc/Radical.pl
+lib/gc_sc/Radical2.pl
+lib/gc_sc/Rjng.pl
+lib/gc_sc/Runr.pl
+lib/gc_sc/S.pl
+lib/gc_sc/SD.pl
+lib/gc_sc/STerm.pl
+lib/gc_sc/Saur.pl
+lib/gc_sc/Sc.pl
+lib/gc_sc/Shaw.pl
+lib/gc_sc/Sinh.pl
+lib/gc_sc/Sk.pl
+lib/gc_sc/Sm.pl
+lib/gc_sc/So.pl
+lib/gc_sc/SoftDott.pl
+lib/gc_sc/Space.pl
+lib/gc_sc/SpacePer.pl
+lib/gc_sc/Sterm2.pl
+lib/gc_sc/Sund.pl
+lib/gc_sc/SylotiNa.pl
+lib/gc_sc/Syrc.pl
+lib/gc_sc/Tagb.pl
+lib/gc_sc/TaiLe.pl
+lib/gc_sc/Taml.pl
+lib/gc_sc/Telu.pl
+lib/gc_sc/Term.pl
+lib/gc_sc/Terminal.pl
+lib/gc_sc/Tfng.pl
+lib/gc_sc/Tglg.pl
+lib/gc_sc/Thaa.pl
+lib/gc_sc/Thai.pl
+lib/gc_sc/Tibt.pl
+lib/gc_sc/Title.pl
+lib/gc_sc/UIdeo.pl
+lib/gc_sc/Ugar.pl
+lib/gc_sc/UnifiedI.pl
+lib/gc_sc/Upper.pl
+lib/gc_sc/Uppercas.pl
+lib/gc_sc/VS.pl
+lib/gc_sc/Vaii.pl
+lib/gc_sc/Variatio.pl
+lib/gc_sc/VertSpac.pl
+lib/gc_sc/WSpace.pl
+lib/gc_sc/WhiteSpa.pl
+lib/gc_sc/Word.pl
+lib/gc_sc/XDigit.pl
+lib/gc_sc/Xsux.pl
+lib/gc_sc/Yiii.pl
+lib/gc_sc/Z.pl
+lib/gc_sc/Zl.pl
+lib/gc_sc/Zp.pl
+lib/gc_sc/Zs.pl
+lib/gc_sc/Zyyy.pl
+lib/gc_sc/_CanonDC.pl
+lib/gc_sc/_CaseIgn.pl
+lib/gc_sc/_CombAbo.pl
+lib/hst/L.pl
+lib/hst/LV.pl
+lib/hst/LVT.pl
+lib/hst/T.pl
+lib/hst/V.pl
+lib/jt/C.pl
+lib/jt/D.pl
+lib/jt/R.pl
+lib/jt/U.pl
+lib/lb/AI.pl
+lib/lb/AL.pl
+lib/lb/B2.pl
+lib/lb/BA.pl
+lib/lb/BB.pl
+lib/lb/BK.pl
+lib/lb/CB.pl
+lib/lb/CL.pl
+lib/lb/CM.pl
+lib/lb/CR.pl
+lib/lb/EX.pl
+lib/lb/GL.pl
+lib/lb/H2.pl
+lib/lb/H3.pl
+lib/lb/HY.pl
+lib/lb/ID.pl
+lib/lb/IN.pl
+lib/lb/IS.pl
+lib/lb/JL.pl
+lib/lb/JT.pl
+lib/lb/JV.pl
+lib/lb/LF.pl
+lib/lb/NL.pl
+lib/lb/NS.pl
+lib/lb/NU.pl
+lib/lb/OP.pl
+lib/lb/PO.pl
+lib/lb/PR.pl
+lib/lb/QU.pl
+lib/lb/SA.pl
+lib/lb/SG.pl
+lib/lb/SP.pl
+lib/lb/SY.pl
+lib/lb/WJ.pl
+lib/lb/XX.pl
+lib/lb/ZW.pl
+lib/nt/De.pl
+lib/nt/Di.pl
+lib/nt/Nu.pl
+
+# 24 input files
+# 514 output files
+
+# End list
diff --git a/Master/tlpkg/tlperl.straw/lib/unicore/version b/Master/tlpkg/tlperl.straw/lib/unicore/version
new file mode 100755
index 00000000000..831446cbd27
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/unicore/version
@@ -0,0 +1 @@
+5.1.0
diff --git a/Master/tlpkg/tlperl.straw/lib/validate.pl b/Master/tlpkg/tlperl.straw/lib/validate.pl
new file mode 100755
index 00000000000..c6558723330
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/validate.pl
@@ -0,0 +1,102 @@
+;# The validate routine takes a single multiline string consisting of
+;# lines containing a filename plus a file test to try on it. (The
+;# file test may also be a 'cd', causing subsequent relative filenames
+;# to be interpreted relative to that directory.) After the file test
+;# you may put '|| die' to make it a fatal error if the file test fails.
+;# The default is '|| warn'. The file test may optionally have a ! prepended
+;# to test for the opposite condition. If you do a cd and then list some
+;# relative filenames, you may want to indent them slightly for readability.
+;# If you supply your own "die" or "warn" message, you can use $file to
+;# interpolate the filename.
+
+;# Filetests may be bunched: -rwx tests for all of -r, -w and -x.
+;# Only the first failed test of the bunch will produce a warning.
+
+;# The routine returns the number of warnings issued.
+
+;# Usage:
+;# require "validate.pl";
+;# $warnings += do validate('
+;# /vmunix -e || die
+;# /boot -e || die
+;# /bin cd
+;# csh -ex
+;# csh !-ug
+;# sh -ex
+;# sh !-ug
+;# /usr -d || warn "What happened to $file?\n"
+;# ');
+
+sub validate {
+ local($file,$test,$warnings,$oldwarnings);
+ foreach $check (split(/\n/,$_[0])) {
+ next if $check =~ /^#/;
+ next if $check =~ /^$/;
+ ($file,$test) = split(' ',$check,2);
+ if ($test =~ s/^(!?-)(\w{2,}\b)/$1Z/) {
+ $testlist = $2;
+ @testlist = split(//,$testlist);
+ }
+ else {
+ @testlist = ('Z');
+ }
+ $oldwarnings = $warnings;
+ foreach $one (@testlist) {
+ $this = $test;
+ $this =~ s/(-\w\b)/$1 \$file/g;
+ $this =~ s/-Z/-$one/;
+ $this .= ' || warn' unless $this =~ /\|\|/;
+ $this =~ s/^(.*\S)\s*\|\|\s*(die|warn)$/$1 || do valmess('$2','$1')/;
+ $this =~ s/\bcd\b/chdir (\$cwd = \$file)/g;
+ eval $this;
+ last if $warnings > $oldwarnings;
+ }
+ }
+ $warnings;
+}
+
+sub valmess {
+ local($disposition,$this) = @_;
+ $file = $cwd . '/' . $file unless $file =~ m|^/|;
+ if ($this =~ /^(!?)-(\w)\s+\$file\s*$/) {
+ $neg = $1;
+ $tmp = $2;
+ $tmp eq 'r' && ($mess = "$file is not readable by uid $>.");
+ $tmp eq 'w' && ($mess = "$file is not writable by uid $>.");
+ $tmp eq 'x' && ($mess = "$file is not executable by uid $>.");
+ $tmp eq 'o' && ($mess = "$file is not owned by uid $>.");
+ $tmp eq 'R' && ($mess = "$file is not readable by you.");
+ $tmp eq 'W' && ($mess = "$file is not writable by you.");
+ $tmp eq 'X' && ($mess = "$file is not executable by you.");
+ $tmp eq 'O' && ($mess = "$file is not owned by you.");
+ $tmp eq 'e' && ($mess = "$file does not exist.");
+ $tmp eq 'z' && ($mess = "$file does not have zero size.");
+ $tmp eq 's' && ($mess = "$file does not have non-zero size.");
+ $tmp eq 'f' && ($mess = "$file is not a plain file.");
+ $tmp eq 'd' && ($mess = "$file is not a directory.");
+ $tmp eq 'l' && ($mess = "$file is not a symbolic link.");
+ $tmp eq 'p' && ($mess = "$file is not a named pipe (FIFO).");
+ $tmp eq 'S' && ($mess = "$file is not a socket.");
+ $tmp eq 'b' && ($mess = "$file is not a block special file.");
+ $tmp eq 'c' && ($mess = "$file is not a character special file.");
+ $tmp eq 'u' && ($mess = "$file does not have the setuid bit set.");
+ $tmp eq 'g' && ($mess = "$file does not have the setgid bit set.");
+ $tmp eq 'k' && ($mess = "$file does not have the sticky bit set.");
+ $tmp eq 'T' && ($mess = "$file is not a text file.");
+ $tmp eq 'B' && ($mess = "$file is not a binary file.");
+ if ($neg eq '!') {
+ $mess =~ s/ is not / should not be / ||
+ $mess =~ s/ does not / should not / ||
+ $mess =~ s/ not / /;
+ }
+ print STDERR $mess,"\n";
+ }
+ else {
+ $this =~ s/\$file/'$file'/g;
+ print STDERR "Can't do $this.\n";
+ }
+ if ($disposition eq 'die') { exit 1; }
+ ++$warnings;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/vars.pm b/Master/tlpkg/tlperl.straw/lib/vars.pm
new file mode 100755
index 00000000000..a0151b84030
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/vars.pm
@@ -0,0 +1,82 @@
+package vars;
+
+use 5.006;
+
+our $VERSION = '1.01';
+
+use warnings::register;
+use strict qw(vars subs);
+
+sub import {
+ my $callpack = caller;
+ my ($pack, @imports) = @_;
+ my ($sym, $ch);
+ foreach (@imports) {
+ if (($ch, $sym) = /^([\$\@\%\*\&])(.+)/) {
+ if ($sym =~ /\W/) {
+ # time for a more-detailed check-up
+ if ($sym =~ /^\w+[[{].*[]}]$/) {
+ require Carp;
+ Carp::croak("Can't declare individual elements of hash or array");
+ } elsif (warnings::enabled() and length($sym) == 1 and $sym !~ tr/a-zA-Z//) {
+ warnings::warn("No need to declare built-in vars");
+ } elsif (($^H &= strict::bits('vars'))) {
+ require Carp;
+ Carp::croak("'$_' is not a valid variable name under strict vars");
+ }
+ }
+ $sym = "${callpack}::$sym" unless $sym =~ /::/;
+ *$sym =
+ ( $ch eq "\$" ? \$$sym
+ : $ch eq "\@" ? \@$sym
+ : $ch eq "\%" ? \%$sym
+ : $ch eq "\*" ? \*$sym
+ : $ch eq "\&" ? \&$sym
+ : do {
+ require Carp;
+ Carp::croak("'$_' is not a valid variable name");
+ });
+ } else {
+ require Carp;
+ Carp::croak("'$_' is not a valid variable name");
+ }
+ }
+};
+
+1;
+__END__
+
+=head1 NAME
+
+vars - Perl pragma to predeclare global variable names (obsolete)
+
+=head1 SYNOPSIS
+
+ use vars qw($frob @mung %seen);
+
+=head1 DESCRIPTION
+
+NOTE: For variables in the current package, the functionality provided
+by this pragma has been superseded by C<our> declarations, available
+in Perl v5.6.0 or later. See L<perlfunc/our>.
+
+This will predeclare all the variables whose names are
+in the list, allowing you to use them under "use strict", and
+disabling any typo warnings.
+
+Unlike pragmas that affect the C<$^H> hints variable, the C<use vars> and
+C<use subs> declarations are not BLOCK-scoped. They are thus effective
+for the entire file in which they appear. You may not rescind such
+declarations with C<no vars> or C<no subs>.
+
+Packages such as the B<AutoLoader> and B<SelfLoader> that delay
+loading of subroutines within packages can create problems with
+package lexicals defined using C<my()>. While the B<vars> pragma
+cannot duplicate the effect of package lexicals (total transparency
+outside of the package), it can act as an acceptable substitute by
+pre-declaring global symbols, ensuring their availability to the
+later-loaded routines.
+
+See L<perlmodlib/Pragmatic Modules>.
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/warnings.pm b/Master/tlpkg/tlperl.straw/lib/warnings.pm
new file mode 100755
index 00000000000..79a5aa8bb55
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/warnings.pm
@@ -0,0 +1,503 @@
+# -*- buffer-read-only: t -*-
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file was created by warnings.pl
+# Any changes made here will be lost.
+#
+
+package warnings;
+
+our $VERSION = '1.06';
+
+# Verify that we're called correctly so that warnings will work.
+# see also strict.pm.
+unless ( __FILE__ =~ /(^|[\/\\])\Q${\__PACKAGE__}\E\.pmc?$/ ) {
+ my (undef, $f, $l) = caller;
+ die("Incorrect use of pragma '${\__PACKAGE__}' at $f line $l.\n");
+}
+
+=head1 NAME
+
+warnings - Perl pragma to control optional warnings
+
+=head1 SYNOPSIS
+
+ use warnings;
+ no warnings;
+
+ use warnings "all";
+ no warnings "all";
+
+ use warnings::register;
+ if (warnings::enabled()) {
+ warnings::warn("some warning");
+ }
+
+ if (warnings::enabled("void")) {
+ warnings::warn("void", "some warning");
+ }
+
+ if (warnings::enabled($object)) {
+ warnings::warn($object, "some warning");
+ }
+
+ warnings::warnif("some warning");
+ warnings::warnif("void", "some warning");
+ warnings::warnif($object, "some warning");
+
+=head1 DESCRIPTION
+
+The C<warnings> pragma is a replacement for the command line flag C<-w>,
+but the pragma is limited to the enclosing block, while the flag is global.
+See L<perllexwarn> for more information.
+
+If no import list is supplied, all possible warnings are either enabled
+or disabled.
+
+A number of functions are provided to assist module authors.
+
+=over 4
+
+=item use warnings::register
+
+Creates a new warnings category with the same name as the package where
+the call to the pragma is used.
+
+=item warnings::enabled()
+
+Use the warnings category with the same name as the current package.
+
+Return TRUE if that warnings category is enabled in the calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($category)
+
+Return TRUE if the warnings category, C<$category>, is enabled in the
+calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($object)
+
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
+
+Return TRUE if that warnings category is enabled in the first scope
+where the object is used.
+Otherwise returns FALSE.
+
+=item warnings::warn($message)
+
+Print C<$message> to STDERR.
+
+Use the warnings category with the same name as the current package.
+
+If that warnings category has been set to "FATAL" in the calling module
+then die. Otherwise return.
+
+=item warnings::warn($category, $message)
+
+Print C<$message> to STDERR.
+
+If the warnings category, C<$category>, has been set to "FATAL" in the
+calling module then die. Otherwise return.
+
+=item warnings::warn($object, $message)
+
+Print C<$message> to STDERR.
+
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
+
+If that warnings category has been set to "FATAL" in the scope where C<$object>
+is first used then die. Otherwise return.
+
+
+=item warnings::warnif($message)
+
+Equivalent to:
+
+ if (warnings::enabled())
+ { warnings::warn($message) }
+
+=item warnings::warnif($category, $message)
+
+Equivalent to:
+
+ if (warnings::enabled($category))
+ { warnings::warn($category, $message) }
+
+=item warnings::warnif($object, $message)
+
+Equivalent to:
+
+ if (warnings::enabled($object))
+ { warnings::warn($object, $message) }
+
+=back
+
+See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
+
+=cut
+
+our %Offsets = (
+
+ # Warnings Categories added in Perl 5.008
+
+ 'all' => 0,
+ 'closure' => 2,
+ 'deprecated' => 4,
+ 'exiting' => 6,
+ 'glob' => 8,
+ 'io' => 10,
+ 'closed' => 12,
+ 'exec' => 14,
+ 'layer' => 16,
+ 'newline' => 18,
+ 'pipe' => 20,
+ 'unopened' => 22,
+ 'misc' => 24,
+ 'numeric' => 26,
+ 'once' => 28,
+ 'overflow' => 30,
+ 'pack' => 32,
+ 'portable' => 34,
+ 'recursion' => 36,
+ 'redefine' => 38,
+ 'regexp' => 40,
+ 'severe' => 42,
+ 'debugging' => 44,
+ 'inplace' => 46,
+ 'internal' => 48,
+ 'malloc' => 50,
+ 'signal' => 52,
+ 'substr' => 54,
+ 'syntax' => 56,
+ 'ambiguous' => 58,
+ 'bareword' => 60,
+ 'digit' => 62,
+ 'parenthesis' => 64,
+ 'precedence' => 66,
+ 'printf' => 68,
+ 'prototype' => 70,
+ 'qw' => 72,
+ 'reserved' => 74,
+ 'semicolon' => 76,
+ 'taint' => 78,
+ 'threads' => 80,
+ 'uninitialized' => 82,
+ 'unpack' => 84,
+ 'untie' => 86,
+ 'utf8' => 88,
+ 'void' => 90,
+ );
+
+our %Bits = (
+ 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x05", # [0..45]
+ 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [29]
+ 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [30]
+ 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6]
+ 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
+ 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [22]
+ 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
+ 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [31]
+ 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7]
+ 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
+ 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4]
+ 'inplace' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [23]
+ 'internal' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [24]
+ 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [5..11]
+ 'layer' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8]
+ 'malloc' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [25]
+ 'misc' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00", # [12]
+ 'newline' => "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9]
+ 'numeric' => "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [13]
+ 'once' => "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [14]
+ 'overflow' => "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [15]
+ 'pack' => "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [16]
+ 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [32]
+ 'pipe' => "\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10]
+ 'portable' => "\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [17]
+ 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [33]
+ 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [34]
+ 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [35]
+ 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [36]
+ 'recursion' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [18]
+ 'redefine' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [19]
+ 'regexp' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [20]
+ 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [37]
+ 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [38]
+ 'severe' => "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00", # [21..25]
+ 'signal' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [26]
+ 'substr' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [27]
+ 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x00", # [28..38]
+ 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [39]
+ 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [40]
+ 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [41]
+ 'unopened' => "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11]
+ 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [42]
+ 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [43]
+ 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [44]
+ 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [45]
+ );
+
+our %DeadBits = (
+ 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x0a", # [0..45]
+ 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [29]
+ 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [30]
+ 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6]
+ 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
+ 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [22]
+ 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
+ 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [31]
+ 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7]
+ 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
+ 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4]
+ 'inplace' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [23]
+ 'internal' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [24]
+ 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [5..11]
+ 'layer' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8]
+ 'malloc' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [25]
+ 'misc' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00", # [12]
+ 'newline' => "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9]
+ 'numeric' => "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [13]
+ 'once' => "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [14]
+ 'overflow' => "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [15]
+ 'pack' => "\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [16]
+ 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [32]
+ 'pipe' => "\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10]
+ 'portable' => "\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [17]
+ 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [33]
+ 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [34]
+ 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [35]
+ 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [36]
+ 'recursion' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [18]
+ 'redefine' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [19]
+ 'regexp' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [20]
+ 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [37]
+ 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [38]
+ 'severe' => "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00", # [21..25]
+ 'signal' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [26]
+ 'substr' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [27]
+ 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x00", # [28..38]
+ 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [39]
+ 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [40]
+ 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [41]
+ 'unopened' => "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11]
+ 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [42]
+ 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [43]
+ 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [44]
+ 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [45]
+ );
+
+$NONE = "\0\0\0\0\0\0\0\0\0\0\0\0";
+$LAST_BIT = 92 ;
+$BYTES = 12 ;
+
+$All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
+
+sub Croaker
+{
+ require Carp::Heavy; # this initializes %CarpInternal
+ local $Carp::CarpInternal{'warnings'};
+ delete $Carp::CarpInternal{'warnings'};
+ Carp::croak(@_);
+}
+
+sub bits
+{
+ # called from B::Deparse.pm
+
+ push @_, 'all' unless @_;
+
+ my $mask;
+ my $catmask ;
+ my $fatal = 0 ;
+ my $no_fatal = 0 ;
+
+ foreach my $word ( @_ ) {
+ if ($word eq 'FATAL') {
+ $fatal = 1;
+ $no_fatal = 0;
+ }
+ elsif ($word eq 'NONFATAL') {
+ $fatal = 0;
+ $no_fatal = 1;
+ }
+ elsif ($catmask = $Bits{$word}) {
+ $mask |= $catmask ;
+ $mask |= $DeadBits{$word} if $fatal ;
+ $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
+ }
+ else
+ { Croaker("Unknown warnings category '$word'")}
+ }
+
+ return $mask ;
+}
+
+sub import
+{
+ shift;
+
+ my $catmask ;
+ my $fatal = 0 ;
+ my $no_fatal = 0 ;
+
+ my $mask = ${^WARNING_BITS} ;
+
+ if (vec($mask, $Offsets{'all'}, 1)) {
+ $mask |= $Bits{'all'} ;
+ $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
+ }
+
+ push @_, 'all' unless @_;
+
+ foreach my $word ( @_ ) {
+ if ($word eq 'FATAL') {
+ $fatal = 1;
+ $no_fatal = 0;
+ }
+ elsif ($word eq 'NONFATAL') {
+ $fatal = 0;
+ $no_fatal = 1;
+ }
+ elsif ($catmask = $Bits{$word}) {
+ $mask |= $catmask ;
+ $mask |= $DeadBits{$word} if $fatal ;
+ $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
+ }
+ else
+ { Croaker("Unknown warnings category '$word'")}
+ }
+
+ ${^WARNING_BITS} = $mask ;
+}
+
+sub unimport
+{
+ shift;
+
+ my $catmask ;
+ my $mask = ${^WARNING_BITS} ;
+
+ if (vec($mask, $Offsets{'all'}, 1)) {
+ $mask |= $Bits{'all'} ;
+ $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
+ }
+
+ push @_, 'all' unless @_;
+
+ foreach my $word ( @_ ) {
+ if ($word eq 'FATAL') {
+ next;
+ }
+ elsif ($catmask = $Bits{$word}) {
+ $mask &= ~($catmask | $DeadBits{$word} | $All);
+ }
+ else
+ { Croaker("Unknown warnings category '$word'")}
+ }
+
+ ${^WARNING_BITS} = $mask ;
+}
+
+my %builtin_type; @builtin_type{qw(SCALAR ARRAY HASH CODE REF GLOB LVALUE Regexp)} = ();
+
+sub __chk
+{
+ my $category ;
+ my $offset ;
+ my $isobj = 0 ;
+
+ if (@_) {
+ # check the category supplied.
+ $category = shift ;
+ if (my $type = ref $category) {
+ Croaker("not an object")
+ if exists $builtin_type{$type};
+ $category = $type;
+ $isobj = 1 ;
+ }
+ $offset = $Offsets{$category};
+ Croaker("Unknown warnings category '$category'")
+ unless defined $offset;
+ }
+ else {
+ $category = (caller(1))[0] ;
+ $offset = $Offsets{$category};
+ Croaker("package '$category' not registered for warnings")
+ unless defined $offset ;
+ }
+
+ my $this_pkg = (caller(1))[0] ;
+ my $i = 2 ;
+ my $pkg ;
+
+ if ($isobj) {
+ while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
+ last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
+ }
+ $i -= 2 ;
+ }
+ else {
+ $i = _error_loc(); # see where Carp will allocate the error
+ }
+
+ my $callers_bitmask = (caller($i))[9] ;
+ return ($callers_bitmask, $offset, $i) ;
+}
+
+sub _error_loc {
+ require Carp::Heavy;
+ goto &Carp::short_error_loc; # don't introduce another stack frame
+}
+
+sub enabled
+{
+ Croaker("Usage: warnings::enabled([category])")
+ unless @_ == 1 || @_ == 0 ;
+
+ my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+
+ return 0 unless defined $callers_bitmask ;
+ return vec($callers_bitmask, $offset, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}, 1) ;
+}
+
+
+sub warn
+{
+ Croaker("Usage: warnings::warn([category,] 'message')")
+ unless @_ == 2 || @_ == 1 ;
+
+ my $message = pop ;
+ my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+ require Carp;
+ Carp::croak($message)
+ if vec($callers_bitmask, $offset+1, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
+ Carp::carp($message) ;
+}
+
+sub warnif
+{
+ Croaker("Usage: warnings::warnif([category,] 'message')")
+ unless @_ == 2 || @_ == 1 ;
+
+ my $message = pop ;
+ my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+
+ return
+ unless defined $callers_bitmask &&
+ (vec($callers_bitmask, $offset, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}, 1)) ;
+
+ require Carp;
+ Carp::croak($message)
+ if vec($callers_bitmask, $offset+1, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
+
+ Carp::carp($message) ;
+}
+
+1;
+# ex: set ro:
diff --git a/Master/tlpkg/tlperl.straw/lib/warnings/register.pm b/Master/tlpkg/tlperl.straw/lib/warnings/register.pm
new file mode 100755
index 00000000000..57c865df522
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/warnings/register.pm
@@ -0,0 +1,51 @@
+package warnings::register;
+
+our $VERSION = '1.01';
+
+=pod
+
+=head1 NAME
+
+warnings::register - warnings import function
+
+=head1 SYNOPSIS
+
+ use warnings::register;
+
+=head1 DESCRIPTION
+
+Creates a warnings category with the same name as the current package.
+
+See L<warnings> and L<perllexwarn> for more information on this module's
+usage.
+
+=cut
+
+require warnings;
+
+sub mkMask
+{
+ my ($bit) = @_;
+ my $mask = "";
+
+ vec($mask, $bit, 1) = 1;
+ return $mask;
+}
+
+sub import
+{
+ shift;
+ my $package = (caller(0))[0];
+ if (! defined $warnings::Bits{$package}) {
+ $warnings::Bits{$package} = mkMask($warnings::LAST_BIT);
+ vec($warnings::Bits{'all'}, $warnings::LAST_BIT, 1) = 1;
+ $warnings::Offsets{$package} = $warnings::LAST_BIT ++;
+ foreach my $k (keys %warnings::Bits) {
+ vec($warnings::Bits{$k}, $warnings::LAST_BIT, 1) = 0;
+ }
+ $warnings::DeadBits{$package} = mkMask($warnings::LAST_BIT);
+ vec($warnings::DeadBits{'all'}, $warnings::LAST_BIT++, 1) = 1;
+ }
+}
+
+1;